ring-0.16.9/Cargo.toml.orig000064400000000000000000000313601353224243600136320ustar0000000000000000[package] authors = ["Brian Smith "] build = "build.rs" categories = ["cryptography", "no-std"] description = "Safe, fast, small crypto using Rust." documentation = "https://briansmith.org/rustdoc/ring/" edition = "2018" keywords = ["crypto", "cryptography", "rand", "ECC", "RSA"] license-file = "LICENSE" name = "ring" readme = "doc/link-to-readme.md" repository = "https://github.com/briansmith/ring" version = "0.16.9" # Prevent multiple versions of *ring* from being linked into the same program. links = "ring-asm" exclude = [ # The presence of .gitignore is used to differentiate non-packaged builds # from packaged builds in build.rs. ".gitignore", "pregenerated/tmp", ] include = [ "LICENSE", "Cargo.toml", "pregenerated/*", "build.rs", "crypto/chacha/asm/chacha-armv4.pl", "crypto/chacha/asm/chacha-armv8.pl", "crypto/chacha/asm/chacha-x86.pl", "crypto/chacha/asm/chacha-x86_64.pl", "crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt", "crypto/constant_time_test.c", "crypto/cpu-intel.c", "crypto/crypto.c", "crypto/curve25519/asm/x25519-asm-arm.S", "crypto/fipsmodule/aes/aes.c", "crypto/fipsmodule/aes/asm/aes-586.pl", "crypto/fipsmodule/aes/asm/aes-armv4.pl", "crypto/fipsmodule/aes/asm/aes-x86_64.pl", "crypto/fipsmodule/aes/asm/aesni-x86.pl", "crypto/fipsmodule/aes/asm/aesni-x86_64.pl", "crypto/fipsmodule/aes/asm/aesv8-armx.pl", "crypto/fipsmodule/aes/asm/bsaes-armv7.pl", "crypto/fipsmodule/aes/asm/bsaes-x86_64.pl", "crypto/fipsmodule/aes/asm/vpaes-x86.pl", "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl", "crypto/fipsmodule/bn/asm/armv4-mont.pl", "crypto/fipsmodule/bn/asm/armv8-mont.pl", "crypto/fipsmodule/bn/asm/x86-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont5.pl", "crypto/fipsmodule/bn/generic.c", "crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/bn/montgomery.c", "crypto/fipsmodule/bn/montgomery_inv.c", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl", "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl", "crypto/fipsmodule/ec/ecp_nistz.c", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz256.c", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl", "crypto/fipsmodule/modes/asm/ghash-armv4.pl", "crypto/fipsmodule/modes/asm/ghash-x86.pl", "crypto/fipsmodule/modes/asm/ghash-x86_64.pl", "crypto/fipsmodule/modes/asm/ghashv8-armx.pl", "crypto/fipsmodule/modes/gcm.c", "crypto/fipsmodule/modes/internal.h", "crypto/fipsmodule/sha/asm/sha256-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv8.pl", "crypto/fipsmodule/sha/asm/sha512-x86_64.pl", "crypto/internal.h", "crypto/limbs/limbs.c", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/mem.c", "crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86_64-xlate.pl", "crypto/poly1305/asm/poly1305-armv4.pl", "crypto/poly1305/asm/poly1305-armv8.pl", "crypto/poly1305/asm/poly1305-x86.pl", "crypto/poly1305/asm/poly1305-x86_64.pl", "examples/checkdigest.rs", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/type_check.h", "src/aead.rs", "src/aead/aes.rs", "src/aead/aes_gcm.rs", "src/aead/aes_tests.txt", "src/aead/block.rs", "src/aead/chacha.rs", "src/aead/chacha_tests.txt", "src/aead/chacha20_poly1305.rs", "src/aead/chacha20_poly1305_openssh.rs", "src/aead/gcm.rs", "src/aead/nonce.rs", "src/aead/poly1305.rs", "src/aead/poly1305_test.txt", "src/aead/quic.rs", "src/aead/shift.rs", "src/agreement.rs", "src/arithmetic.rs", "src/arithmetic/bigint.rs", "src/arithmetic/bigint_elem_exp_consttime_tests.txt", "src/arithmetic/bigint_elem_exp_vartime_tests.txt", "src/arithmetic/bigint_elem_mul_tests.txt", "src/arithmetic/bigint_elem_reduced_once_tests.txt", "src/arithmetic/bigint_elem_reduced_tests.txt", "src/arithmetic/bigint_elem_squared_tests.txt", "src/arithmetic/constant.rs", "src/arithmetic/montgomery.rs", "src/array.rs", "src/bits.rs", "src/bssl.rs", "src/c.rs", "src/constant_time.rs", "src/cpu.rs", "src/data/alg-rsa-encryption.der", "src/debug.rs", "src/digest.rs", "src/digest/sha1.rs", "src/digest/sha2.rs", "src/ec/curve25519/ed25519/digest.rs", "src/ec/curve25519/ed25519.rs", "src/ec/curve25519/ed25519/signing.rs", "src/ec/curve25519/ed25519/verification.rs", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der", "src/ec/curve25519.rs", "src/ec/curve25519/ops.rs", "src/ec/curve25519/scalar.rs", "src/ec/curve25519/x25519.rs", "src/ec.rs", "src/ec/keys.rs", "src/ec/suite_b/curve.rs", "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa/digest_scalar.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa/signing.rs", "src/ec/suite_b/ecdsa/verification.rs", "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt", "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt", "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt", "src/ec/suite_b.rs", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops.rs", "src/ec/suite_b/ops/p256.rs", "src/ec/suite_b/ops/p256_elem_mul_tests.txt", "src/ec/suite_b/ops/p256_elem_neg_tests.txt", "src/ec/suite_b/ops/p256_elem_sum_tests.txt", "src/ec/suite_b/ops/p256_point_double_tests.txt", "src/ec/suite_b/ops/p256_point_mul_base_tests.txt", "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt", "src/ec/suite_b/ops/p256_point_mul_tests.txt", "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt", "src/ec/suite_b/ops/p256_point_sum_tests.txt", "src/ec/suite_b/ops/p256_scalar_mul_tests.txt", "src/ec/suite_b/ops/p256_scalar_square_tests.txt", "src/ec/suite_b/ops/p384.rs", "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt", "src/ec/suite_b/ops/p384_elem_mul_tests.txt", "src/ec/suite_b/ops/p384_elem_neg_tests.txt", "src/ec/suite_b/ops/p384_elem_sum_tests.txt", "src/ec/suite_b/ops/p384_point_double_tests.txt", "src/ec/suite_b/ops/p384_point_mul_base_tests.txt", "src/ec/suite_b/ops/p384_point_mul_tests.txt", "src/ec/suite_b/ops/p384_point_sum_tests.txt", "src/ec/suite_b/ops/p384_scalar_mul_tests.txt", "src/ec/suite_b/private_key.rs", "src/ec/suite_b/public_key.rs", "src/ec/suite_b/suite_b_public_key_tests.txt", "src/endian.rs", "src/error.rs", "src/hkdf.rs", "src/hmac.rs", "src/hmac_generate_serializable_tests.txt", "src/io.rs", "src/io/der.rs", "src/io/der_writer.rs", "src/io/positive.rs", "src/io/writer.rs", "src/lib.rs", "src/limb.rs", "src/endian.rs", "src/pbkdf2.rs", "src/pkcs8.rs", "src/polyfill.rs", "src/polyfill/convert.rs", "src/rand.rs", "src/rsa/convert_nist_rsa_test_vectors.py", "src/rsa.rs", "src/rsa/padding.rs", "src/rsa/random.rs", "src/rsa/rsa_pss_padding_tests.txt", "src/rsa/signature_rsa_example_private_key.der", "src/rsa/signature_rsa_example_public_key.der", "src/rsa/signing.rs", "src/rsa/verification.rs", "src/signature.rs", "src/test.rs", "src/test_1_syntax_error_tests.txt", "src/test_1_tests.txt", "src/test_3_tests.txt", "tests/aead_aes_128_gcm_tests.txt", "tests/aead_aes_256_gcm_tests.txt", "tests/aead_chacha20_poly1305_tests.txt", "tests/aead_chacha20_poly1305_openssh_tests.txt", "tests/aead_tests.rs", "tests/agreement_tests.rs", "tests/agreement_tests.txt", "tests/digest_tests.rs", "tests/digest_tests.txt", "tests/ecdsa_from_pkcs8_tests.txt", "tests/ecdsa_tests.rs", "tests/ecdsa_test_private_key_p256.p8", "tests/ecdsa_test_public_key_p256.der", "tests/ecdsa_test_public_key_p256_debug.txt", "tests/ecdsa_sign_asn1_tests.txt", "tests/ecdsa_sign_fixed_tests.txt", "tests/ecdsa_verify_asn1_tests.txt", "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", "tests/ed25519_from_pkcs8_unchecked_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_test_private_key.bin", "tests/ed25519_test_private_key.p8", "tests/ed25519_test_public_key.bin", "tests/ed25519_test_public_key.der", "tests/hkdf_tests.rs", "tests/hkdf_tests.txt", "tests/hmac_tests.rs", "tests/hmac_tests.txt", "tests/pbkdf2_tests.rs", "tests/pbkdf2_tests.txt", "tests/quic_aes_128_tests.txt", "tests/quic_aes_256_tests.txt", "tests/quic_chacha20_tests.txt", "tests/quic_tests.rs", "tests/rand_tests.rs", "tests/rsa_from_pkcs8_tests.txt", "tests/rsa_pkcs1_sign_tests.txt", "tests/rsa_pkcs1_verify_tests.txt", "tests/rsa_primitive_verify_tests.txt", "tests/rsa_pss_sign_tests.txt", "tests/rsa_pss_verify_tests.txt", "tests/rsa_tests.rs", "tests/rsa_test_private_key_2048.p8", "tests/rsa_test_public_key_2048.der", "tests/rsa_test_public_key_2048_debug.txt", "tests/signature_tests.rs", "third_party/fiat/curve25519.c", "third_party/fiat/curve25519_32.h", "third_party/fiat/curve25519_64.h", "third_party/fiat/curve25519_tables.h", "third_party/fiat/internal.h", "third_party/fiat/LICENSE", "third_party/fiat/make_curve25519_tables.py", "third_party/NIST/SHAVS/SHA1LongMsg.rsp", "third_party/NIST/SHAVS/SHA1Monte.rsp", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp", "third_party/NIST/SHAVS/SHA224LongMsg.rsp", "third_party/NIST/SHAVS/SHA224Monte.rsp", "third_party/NIST/SHAVS/SHA224ShortMsg.rsp", "third_party/NIST/SHAVS/SHA256LongMsg.rsp", "third_party/NIST/SHAVS/SHA256Monte.rsp", "third_party/NIST/SHAVS/SHA256ShortMsg.rsp", "third_party/NIST/SHAVS/SHA384LongMsg.rsp", "third_party/NIST/SHAVS/SHA384Monte.rsp", "third_party/NIST/SHAVS/SHA384ShortMsg.rsp", "third_party/NIST/SHAVS/SHA512LongMsg.rsp", "third_party/NIST/SHAVS/SHA512Monte.rsp", "third_party/NIST/SHAVS/SHA512ShortMsg.rsp", ] [lib] name = "ring" [dependencies] untrusted = { version = "0.7.0" } [target.'cfg(all(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86", target_arch = "x86_64"), not(target_os = "ios")))'.dependencies] spin = { version = "0.5.2", default-features = false } [target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies] libc = { version = "0.2.48", default-features = false } [target.'cfg(any(target_os = "android", target_os = "freebsd", target_os = "linux", target_os = "netbsd", target_os = "openbsd", target_os = "solaris"))'.dependencies] lazy_static = { version = "1.3", default-features = false, optional = true } [target.'cfg(all(target_arch = "wasm32", target_vendor = "unknown", target_os = "unknown", target_env = ""))'.dependencies] web-sys = { version = "0.3.25", default-features = false, features = ["Crypto", "Window"] } [target.'cfg(target_os = "windows")'.dependencies] winapi = { version = "0.3.7", default-features = false, features = ["ntsecapi", "wtypesbase"] } [target.'cfg(target_arch = "wasm32")'.dev-dependencies] wasm-bindgen-test = { version = "0.2.48", default-features = false } [target.'cfg(any(unix, windows))'.dev-dependencies] libc = { version = "0.2.48", default-features = false } # Keep this in sync with `[dependencies]` in pregenerate_asm/Cargo.toml. [build-dependencies] cc = { version = "1.0.37", default-features = false } [features] # These features are documented in the top-level module's documentation. default = ["alloc", "dev_urandom_fallback"] alloc = [] dev_urandom_fallback = ["lazy_static"] internal_benches = [] slow_tests = [] std = ["alloc"] test_logging = [] # XXX: debug = false because of https://github.com/rust-lang/rust/issues/34122 [profile.bench] opt-level = 3 debug = false rpath = false lto = true debug-assertions = false codegen-units = 1 [profile.release] opt-level = 3 debug = false rpath = false lto = true debug-assertions = false codegen-units = 1 ring-0.16.9/Cargo.toml0000644000000273450000000000000101400ustar00# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're # editing this file be aware that the upstream Cargo.toml # will likely look very different (and much more reasonable) [package] edition = "2018" name = "ring" version = "0.16.9" authors = ["Brian Smith "] build = "build.rs" links = "ring-asm" exclude = [".gitignore", "pregenerated/tmp"] include = ["LICENSE", "Cargo.toml", "pregenerated/*", "build.rs", "crypto/chacha/asm/chacha-armv4.pl", "crypto/chacha/asm/chacha-armv8.pl", "crypto/chacha/asm/chacha-x86.pl", "crypto/chacha/asm/chacha-x86_64.pl", "crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt", "crypto/constant_time_test.c", "crypto/cpu-intel.c", "crypto/crypto.c", "crypto/curve25519/asm/x25519-asm-arm.S", "crypto/fipsmodule/aes/aes.c", "crypto/fipsmodule/aes/asm/aes-586.pl", "crypto/fipsmodule/aes/asm/aes-armv4.pl", "crypto/fipsmodule/aes/asm/aes-x86_64.pl", "crypto/fipsmodule/aes/asm/aesni-x86.pl", "crypto/fipsmodule/aes/asm/aesni-x86_64.pl", "crypto/fipsmodule/aes/asm/aesv8-armx.pl", "crypto/fipsmodule/aes/asm/bsaes-armv7.pl", "crypto/fipsmodule/aes/asm/bsaes-x86_64.pl", "crypto/fipsmodule/aes/asm/vpaes-x86.pl", "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl", "crypto/fipsmodule/bn/asm/armv4-mont.pl", "crypto/fipsmodule/bn/asm/armv8-mont.pl", "crypto/fipsmodule/bn/asm/x86-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont5.pl", "crypto/fipsmodule/bn/generic.c", "crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/bn/montgomery.c", "crypto/fipsmodule/bn/montgomery_inv.c", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl", "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl", "crypto/fipsmodule/ec/ecp_nistz.c", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz256.c", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl", "crypto/fipsmodule/modes/asm/ghash-armv4.pl", "crypto/fipsmodule/modes/asm/ghash-x86.pl", "crypto/fipsmodule/modes/asm/ghash-x86_64.pl", "crypto/fipsmodule/modes/asm/ghashv8-armx.pl", "crypto/fipsmodule/modes/gcm.c", "crypto/fipsmodule/modes/internal.h", "crypto/fipsmodule/sha/asm/sha256-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv8.pl", "crypto/fipsmodule/sha/asm/sha512-x86_64.pl", "crypto/internal.h", "crypto/limbs/limbs.c", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/mem.c", "crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86_64-xlate.pl", "crypto/poly1305/asm/poly1305-armv4.pl", "crypto/poly1305/asm/poly1305-armv8.pl", "crypto/poly1305/asm/poly1305-x86.pl", "crypto/poly1305/asm/poly1305-x86_64.pl", "examples/checkdigest.rs", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/type_check.h", "src/aead.rs", "src/aead/aes.rs", "src/aead/aes_gcm.rs", "src/aead/aes_tests.txt", "src/aead/block.rs", "src/aead/chacha.rs", "src/aead/chacha_tests.txt", "src/aead/chacha20_poly1305.rs", "src/aead/chacha20_poly1305_openssh.rs", "src/aead/gcm.rs", "src/aead/nonce.rs", "src/aead/poly1305.rs", "src/aead/poly1305_test.txt", "src/aead/quic.rs", "src/aead/shift.rs", "src/agreement.rs", "src/arithmetic.rs", "src/arithmetic/bigint.rs", "src/arithmetic/bigint_elem_exp_consttime_tests.txt", "src/arithmetic/bigint_elem_exp_vartime_tests.txt", "src/arithmetic/bigint_elem_mul_tests.txt", "src/arithmetic/bigint_elem_reduced_once_tests.txt", "src/arithmetic/bigint_elem_reduced_tests.txt", "src/arithmetic/bigint_elem_squared_tests.txt", "src/arithmetic/constant.rs", "src/arithmetic/montgomery.rs", "src/array.rs", "src/bits.rs", "src/bssl.rs", "src/c.rs", "src/constant_time.rs", "src/cpu.rs", "src/data/alg-rsa-encryption.der", "src/debug.rs", "src/digest.rs", "src/digest/sha1.rs", "src/digest/sha2.rs", "src/ec/curve25519/ed25519/digest.rs", "src/ec/curve25519/ed25519.rs", "src/ec/curve25519/ed25519/signing.rs", "src/ec/curve25519/ed25519/verification.rs", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der", "src/ec/curve25519.rs", "src/ec/curve25519/ops.rs", "src/ec/curve25519/scalar.rs", "src/ec/curve25519/x25519.rs", "src/ec.rs", "src/ec/keys.rs", "src/ec/suite_b/curve.rs", "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa/digest_scalar.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa/signing.rs", "src/ec/suite_b/ecdsa/verification.rs", "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt", "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt", "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt", "src/ec/suite_b.rs", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops.rs", "src/ec/suite_b/ops/p256.rs", "src/ec/suite_b/ops/p256_elem_mul_tests.txt", "src/ec/suite_b/ops/p256_elem_neg_tests.txt", "src/ec/suite_b/ops/p256_elem_sum_tests.txt", "src/ec/suite_b/ops/p256_point_double_tests.txt", "src/ec/suite_b/ops/p256_point_mul_base_tests.txt", "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt", "src/ec/suite_b/ops/p256_point_mul_tests.txt", "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt", "src/ec/suite_b/ops/p256_point_sum_tests.txt", "src/ec/suite_b/ops/p256_scalar_mul_tests.txt", "src/ec/suite_b/ops/p256_scalar_square_tests.txt", "src/ec/suite_b/ops/p384.rs", "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt", "src/ec/suite_b/ops/p384_elem_mul_tests.txt", "src/ec/suite_b/ops/p384_elem_neg_tests.txt", "src/ec/suite_b/ops/p384_elem_sum_tests.txt", "src/ec/suite_b/ops/p384_point_double_tests.txt", "src/ec/suite_b/ops/p384_point_mul_base_tests.txt", "src/ec/suite_b/ops/p384_point_mul_tests.txt", "src/ec/suite_b/ops/p384_point_sum_tests.txt", "src/ec/suite_b/ops/p384_scalar_mul_tests.txt", "src/ec/suite_b/private_key.rs", "src/ec/suite_b/public_key.rs", "src/ec/suite_b/suite_b_public_key_tests.txt", "src/endian.rs", "src/error.rs", "src/hkdf.rs", "src/hmac.rs", "src/hmac_generate_serializable_tests.txt", "src/io.rs", "src/io/der.rs", "src/io/der_writer.rs", "src/io/positive.rs", "src/io/writer.rs", "src/lib.rs", "src/limb.rs", "src/endian.rs", "src/pbkdf2.rs", "src/pkcs8.rs", "src/polyfill.rs", "src/polyfill/convert.rs", "src/rand.rs", "src/rsa/convert_nist_rsa_test_vectors.py", "src/rsa.rs", "src/rsa/padding.rs", "src/rsa/random.rs", "src/rsa/rsa_pss_padding_tests.txt", "src/rsa/signature_rsa_example_private_key.der", "src/rsa/signature_rsa_example_public_key.der", "src/rsa/signing.rs", "src/rsa/verification.rs", "src/signature.rs", "src/test.rs", "src/test_1_syntax_error_tests.txt", "src/test_1_tests.txt", "src/test_3_tests.txt", "tests/aead_aes_128_gcm_tests.txt", "tests/aead_aes_256_gcm_tests.txt", "tests/aead_chacha20_poly1305_tests.txt", "tests/aead_chacha20_poly1305_openssh_tests.txt", "tests/aead_tests.rs", "tests/agreement_tests.rs", "tests/agreement_tests.txt", "tests/digest_tests.rs", "tests/digest_tests.txt", "tests/ecdsa_from_pkcs8_tests.txt", "tests/ecdsa_tests.rs", "tests/ecdsa_test_private_key_p256.p8", "tests/ecdsa_test_public_key_p256.der", "tests/ecdsa_test_public_key_p256_debug.txt", "tests/ecdsa_sign_asn1_tests.txt", "tests/ecdsa_sign_fixed_tests.txt", "tests/ecdsa_verify_asn1_tests.txt", "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", "tests/ed25519_from_pkcs8_unchecked_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_test_private_key.bin", "tests/ed25519_test_private_key.p8", "tests/ed25519_test_public_key.bin", "tests/ed25519_test_public_key.der", "tests/hkdf_tests.rs", "tests/hkdf_tests.txt", "tests/hmac_tests.rs", "tests/hmac_tests.txt", "tests/pbkdf2_tests.rs", "tests/pbkdf2_tests.txt", "tests/quic_aes_128_tests.txt", "tests/quic_aes_256_tests.txt", "tests/quic_chacha20_tests.txt", "tests/quic_tests.rs", "tests/rand_tests.rs", "tests/rsa_from_pkcs8_tests.txt", "tests/rsa_pkcs1_sign_tests.txt", "tests/rsa_pkcs1_verify_tests.txt", "tests/rsa_primitive_verify_tests.txt", "tests/rsa_pss_sign_tests.txt", "tests/rsa_pss_verify_tests.txt", "tests/rsa_tests.rs", "tests/rsa_test_private_key_2048.p8", "tests/rsa_test_public_key_2048.der", "tests/rsa_test_public_key_2048_debug.txt", "tests/signature_tests.rs", "third_party/fiat/curve25519.c", "third_party/fiat/curve25519_32.h", "third_party/fiat/curve25519_64.h", "third_party/fiat/curve25519_tables.h", "third_party/fiat/internal.h", "third_party/fiat/LICENSE", "third_party/fiat/make_curve25519_tables.py", "third_party/NIST/SHAVS/SHA1LongMsg.rsp", "third_party/NIST/SHAVS/SHA1Monte.rsp", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp", "third_party/NIST/SHAVS/SHA224LongMsg.rsp", "third_party/NIST/SHAVS/SHA224Monte.rsp", "third_party/NIST/SHAVS/SHA224ShortMsg.rsp", "third_party/NIST/SHAVS/SHA256LongMsg.rsp", "third_party/NIST/SHAVS/SHA256Monte.rsp", "third_party/NIST/SHAVS/SHA256ShortMsg.rsp", "third_party/NIST/SHAVS/SHA384LongMsg.rsp", "third_party/NIST/SHAVS/SHA384Monte.rsp", "third_party/NIST/SHAVS/SHA384ShortMsg.rsp", "third_party/NIST/SHAVS/SHA512LongMsg.rsp", "third_party/NIST/SHAVS/SHA512Monte.rsp", "third_party/NIST/SHAVS/SHA512ShortMsg.rsp"] description = "Safe, fast, small crypto using Rust." documentation = "https://briansmith.org/rustdoc/ring/" readme = "doc/link-to-readme.md" keywords = ["crypto", "cryptography", "rand", "ECC", "RSA"] categories = ["cryptography", "no-std"] license-file = "LICENSE" repository = "https://github.com/briansmith/ring" [profile.bench] opt-level = 3 lto = true codegen-units = 1 debug = false debug-assertions = false rpath = false [profile.release] opt-level = 3 lto = true codegen-units = 1 debug = false debug-assertions = false rpath = false [lib] name = "ring" [dependencies.untrusted] version = "0.7.0" [build-dependencies.cc] version = "1.0.37" default-features = false [features] alloc = [] default = ["alloc", "dev_urandom_fallback"] dev_urandom_fallback = ["lazy_static"] internal_benches = [] slow_tests = [] std = ["alloc"] test_logging = [] [target."cfg(all(any(target_arch = \"aarch64\", target_arch = \"arm\", target_arch = \"x86\", target_arch = \"x86_64\"), not(target_os = \"ios\")))".dependencies.spin] version = "0.5.2" default-features = false [target."cfg(all(target_arch = \"wasm32\", target_vendor = \"unknown\", target_os = \"unknown\", target_env = \"\"))".dependencies.web-sys] version = "0.3.25" features = ["Crypto", "Window"] default-features = false [target."cfg(any(target_os = \"android\", target_os = \"freebsd\", target_os = \"linux\", target_os = \"netbsd\", target_os = \"openbsd\", target_os = \"solaris\"))".dependencies.lazy_static] version = "1.3" optional = true default-features = false [target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.libc] version = "0.2.48" default-features = false [target."cfg(any(unix, windows))".dev-dependencies.libc] version = "0.2.48" default-features = false [target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test] version = "0.2.48" default-features = false [target."cfg(target_os = \"windows\")".dependencies.winapi] version = "0.3.7" features = ["ntsecapi", "wtypesbase"] default-features = false ring-0.16.9/LICENSE000064400000000000000000000236151352416253600117570ustar0000000000000000Note that it is easy for this file to get out of sync with the licenses in the source code files. It's recommended to compare the licenses in the source code with what's mentioned here. *ring* is derived from BoringSSL, so the licensing situation in *ring* is similar to BoringSSL. *ring* uses an ISC-style license like BoringSSL for code in new files, including in particular all the Rust code: Copyright 2015-2016 Brian Smith. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL licensing. Files that are completely new have a Google copyright and an ISC license. This license is reproduced at the bottom of this file. Contributors to BoringSSL are required to follow the CLA rules for Chromium: https://cla.developers.google.com/clas Files in third_party/ have their own licenses, as described therein. The MIT license, for third_party/fiat, which, unlike other third_party directories, is compiled into non-test libraries, is included below. The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. The following are Google-internal bug numbers where explicit permission from some authors is recorded for use of their work: 27287199 27287880 27287883 OpenSSL License --------------- /* ==================================================================== * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ ISC license used for completely new code in BoringSSL: /* Copyright (c) 2015, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ The code in third_party/fiat carries the MIT license: Copyright (c) 2015-2016 the fiat-crypto authors (see https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ring-0.16.9/build.rs000064400000000000000000000610441353036607100124120ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Build the non-Rust components. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] // In the `pregenerate_asm_main()` case we don't want to access (Cargo) // environment variables at all, so avoid `use std::env` here. use std::{ fs::{self, DirEntry}, path::{Path, PathBuf}, process::Command, time::SystemTime, }; const X86: &str = "x86"; const X86_64: &str = "x86_64"; const AARCH64: &str = "aarch64"; const ARM: &str = "arm"; const NEVER: &str = "Don't ever build this file."; #[cfg_attr(rustfmt, rustfmt_skip)] const RING_SRCS: &[(&[&str], &str)] = &[ (&[], "crypto/fipsmodule/bn/generic.c"), (&[], "crypto/fipsmodule/bn/montgomery.c"), (&[], "crypto/fipsmodule/bn/montgomery_inv.c"), (&[], "crypto/crypto.c"), (&[], "crypto/fipsmodule/ec/ecp_nistz.c"), (&[], "crypto/fipsmodule/ec/ecp_nistz256.c"), (&[], "crypto/fipsmodule/ec/gfp_p256.c"), (&[], "crypto/fipsmodule/ec/gfp_p384.c"), (&[], "crypto/limbs/limbs.c"), (&[], "crypto/mem.c"), (&[], "crypto/fipsmodule/modes/gcm.c"), (&[], "third_party/fiat/curve25519.c"), (&[X86_64, X86], "crypto/cpu-intel.c"), (&[X86], "crypto/fipsmodule/aes/asm/aes-586.pl"), (&[X86], "crypto/fipsmodule/aes/asm/aesni-x86.pl"), (&[X86], "crypto/fipsmodule/aes/asm/vpaes-x86.pl"), (&[X86], "crypto/fipsmodule/bn/asm/x86-mont.pl"), (&[X86], "crypto/chacha/asm/chacha-x86.pl"), (&[X86], "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl"), (&[X86], "crypto/fipsmodule/modes/asm/ghash-x86.pl"), (&[X86], "crypto/poly1305/asm/poly1305-x86.pl"), (&[X86_64], "crypto/fipsmodule/aes/asm/aes-x86_64.pl"), (&[X86_64], "crypto/fipsmodule/aes/asm/aesni-x86_64.pl"), (&[X86_64], "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl"), (&[X86_64], "crypto/fipsmodule/bn/asm/x86_64-mont.pl"), (&[X86_64], "crypto/fipsmodule/bn/asm/x86_64-mont5.pl"), (&[X86_64], "crypto/chacha/asm/chacha-x86_64.pl"), (&[NEVER], "crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl"), (&[X86_64], "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl"), (&[NEVER], "crypto/fipsmodule/ec/asm/p256_beeu-x86_64-asm.pl"), (&[X86_64], "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl"), (&[X86_64], "crypto/fipsmodule/modes/asm/ghash-x86_64.pl"), (&[X86_64], "crypto/poly1305/asm/poly1305-x86_64.pl"), (&[X86_64], SHA512_X86_64), (&[AARCH64, ARM], "crypto/fipsmodule/aes/asm/aesv8-armx.pl"), (&[AARCH64, ARM], "crypto/fipsmodule/modes/asm/ghashv8-armx.pl"), (&[ARM], "crypto/fipsmodule/aes/asm/aes-armv4.pl"), (&[ARM], "crypto/fipsmodule/aes/asm/bsaes-armv7.pl"), (&[ARM], "crypto/fipsmodule/bn/asm/armv4-mont.pl"), (&[ARM], "crypto/chacha/asm/chacha-armv4.pl"), (&[ARM], "crypto/curve25519/asm/x25519-asm-arm.S"), (&[ARM], "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl"), (&[ARM], "crypto/fipsmodule/modes/asm/ghash-armv4.pl"), (&[ARM], "crypto/poly1305/asm/poly1305-armv4.pl"), (&[ARM], "crypto/fipsmodule/sha/asm/sha256-armv4.pl"), (&[ARM], "crypto/fipsmodule/sha/asm/sha512-armv4.pl"), (&[AARCH64], "crypto/fipsmodule/aes/asm/vpaes-armv8.pl"), (&[AARCH64], "crypto/fipsmodule/bn/asm/armv8-mont.pl"), (&[AARCH64], "crypto/chacha/asm/chacha-armv8.pl"), (&[AARCH64], "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl"), (&[AARCH64], "crypto/fipsmodule/modes/asm/ghash-neon-armv8.pl"), (&[AARCH64], "crypto/poly1305/asm/poly1305-armv8.pl"), (&[AARCH64], SHA512_ARMV8), ]; const SHA256_X86_64: &str = "crypto/fipsmodule/sha/asm/sha256-x86_64.pl"; const SHA512_X86_64: &str = "crypto/fipsmodule/sha/asm/sha512-x86_64.pl"; const SHA256_ARMV8: &str = "crypto/fipsmodule/sha/asm/sha256-armv8.pl"; const SHA512_ARMV8: &str = "crypto/fipsmodule/sha/asm/sha512-armv8.pl"; const RING_TEST_SRCS: &[&str] = &[("crypto/constant_time_test.c")]; #[cfg_attr(rustfmt, rustfmt_skip)] const RING_INCLUDES: &[&str] = &["crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/internal.h", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/fipsmodule/modes/internal.h", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/type_check.h", "third_party/fiat/curve25519_32.h", "third_party/fiat/curve25519_64.h", "third_party/fiat/curve25519_tables.h", "third_party/fiat/internal.h", ]; #[cfg_attr(rustfmt, rustfmt_skip)] const RING_PERL_INCLUDES: &[&str] = &["crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86_64-xlate.pl"]; const RING_BUILD_FILE: &[&str] = &["build.rs"]; const PREGENERATED: &str = "pregenerated"; fn c_flags(target: &Target) -> &'static [&'static str] { if target.env != MSVC { static NON_MSVC_FLAGS: &[&str] = &[ "-std=c1x", // GCC 4.6 requires "c1x" instead of "c11" "-Wbad-function-cast", "-Wnested-externs", "-Wstrict-prototypes", ]; NON_MSVC_FLAGS } else { &[] } } fn cpp_flags(target: &Target) -> &'static [&'static str] { if target.env != MSVC { static NON_MSVC_FLAGS: &[&str] = &[ "-pedantic", "-pedantic-errors", "-Wall", "-Wextra", "-Wcast-align", "-Wcast-qual", "-Wconversion", "-Wenum-compare", "-Wfloat-equal", "-Wformat=2", "-Winline", "-Winvalid-pch", "-Wmissing-field-initializers", "-Wmissing-include-dirs", "-Wredundant-decls", "-Wshadow", "-Wsign-compare", "-Wsign-conversion", "-Wundef", "-Wuninitialized", "-Wwrite-strings", "-fno-strict-aliasing", "-fvisibility=hidden", ]; NON_MSVC_FLAGS } else { static MSVC_FLAGS: &[&str] = &[ "/GS", // Buffer security checks. "/Gy", // Enable function-level linking. "/EHsc", // C++ exceptions only, only in C++. "/GR-", // Disable RTTI. "/Zc:wchar_t", "/Zc:forScope", "/Zc:inline", "/Zc:rvalueCast", // Warnings. "/sdl", "/Wall", "/wd4127", // C4127: conditional expression is constant "/wd4464", // C4464: relative include path contains '..' "/wd4514", // C4514: : unreferenced inline function has be "/wd4710", // C4710: function not inlined "/wd4711", // C4711: function 'function' selected for inline expansion "/wd4820", // C4820: : bytes padding added after "/wd5045", /* C5045: Compiler will insert Spectre mitigation for memory load if * /Qspectre switch specified */ ]; MSVC_FLAGS } } const LD_FLAGS: &[&str] = &[]; // None means "any OS" or "any target". The first match in sequence order is // taken. const ASM_TARGETS: &[(&str, Option<&str>, &str)] = &[ ("x86_64", Some("ios"), "macosx"), ("x86_64", Some("macos"), "macosx"), ("x86_64", Some(WINDOWS), "nasm"), ("x86_64", None, "elf"), ("aarch64", Some("ios"), "ios64"), ("aarch64", None, "linux64"), ("x86", Some(WINDOWS), "win32n"), ("x86", Some("ios"), "macosx"), ("x86", None, "elf"), ("arm", Some("ios"), "ios32"), ("arm", None, "linux32"), ]; const WINDOWS: &str = "windows"; const MSVC: &str = "msvc"; const MSVC_OBJ_OPT: &str = "/Fo"; const MSVC_OBJ_EXT: &str = "obj"; fn main() { if let Ok(package_name) = std::env::var("CARGO_PKG_NAME") { if package_name == "ring" { ring_build_rs_main(); return; } } pregenerate_asm_main(); } fn ring_build_rs_main() { use std::env; for (key, value) in env::vars() { println!("{}: {}", key, value); } let out_dir = env::var("OUT_DIR").unwrap(); let out_dir = PathBuf::from(out_dir); let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); let os = env::var("CARGO_CFG_TARGET_OS").unwrap(); let env = env::var("CARGO_CFG_TARGET_ENV").unwrap(); let (obj_ext, obj_opt) = if env == MSVC { (MSVC_OBJ_EXT, MSVC_OBJ_OPT) } else { ("o", "-o") }; let is_git = std::fs::metadata(".git").is_ok(); // Published builds are always release builds. let is_debug = is_git && env::var("DEBUG").unwrap() != "false"; let target = Target { arch, os, env, obj_ext, obj_opt, is_git, is_debug, }; let pregenerated = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join(PREGENERATED); build_c_code(&target, pregenerated, &out_dir); check_all_files_tracked() } fn pregenerate_asm_main() { let pregenerated = PathBuf::from(PREGENERATED); std::fs::create_dir(&pregenerated).unwrap(); let pregenerated_tmp = pregenerated.join("tmp"); std::fs::create_dir(&pregenerated_tmp).unwrap(); for &(target_arch, target_os, perlasm_format) in ASM_TARGETS { // For Windows, package pregenerated object files instead of // pregenerated assembly language source files, so that the user // doesn't need to install the assembler. let asm_dir = if target_os == Some(WINDOWS) { &pregenerated_tmp } else { &pregenerated }; let perlasm_src_dsts = perlasm_src_dsts(&asm_dir, target_arch, target_os, perlasm_format); perlasm(&perlasm_src_dsts, target_arch, perlasm_format, None); if target_os == Some(WINDOWS) { let srcs = asm_srcs(perlasm_src_dsts); for src in srcs { let src_path = PathBuf::from(src); let obj_path = obj_path(&pregenerated, &src_path, MSVC_OBJ_EXT); run_command(yasm(&src_path, target_arch, &obj_path)); } } } } struct Target { arch: String, os: String, env: String, obj_ext: &'static str, obj_opt: &'static str, is_git: bool, is_debug: bool, } fn build_c_code(target: &Target, pregenerated: PathBuf, out_dir: &Path) { if &target.arch == "wasm32" { return; } let includes_modified = RING_INCLUDES .iter() .chain(RING_BUILD_FILE.iter()) .chain(RING_PERL_INCLUDES.iter()) .map(|f| file_modified(Path::new(*f))) .max() .unwrap(); fn is_none_or_equals(opt: Option, other: T) -> bool where T: PartialEq, { if let Some(value) = opt { value == other } else { true } } let (_, _, perlasm_format) = ASM_TARGETS .iter() .find(|entry| { let &(entry_arch, entry_os, _) = *entry; entry_arch == &target.arch && is_none_or_equals(entry_os, &target.os) }) .unwrap(); let use_pregenerated = !target.is_git; let warnings_are_errors = target.is_git; let asm_dir = if use_pregenerated { &pregenerated } else { out_dir }; let perlasm_src_dsts = perlasm_src_dsts(asm_dir, &target.arch, Some(&target.os), perlasm_format); if !use_pregenerated { perlasm( &perlasm_src_dsts[..], &target.arch, perlasm_format, Some(includes_modified), ); } let mut asm_srcs = asm_srcs(perlasm_src_dsts); // For Windows we also pregenerate the object files for non-Git builds so // the user doesn't need to install the assembler. On other platforms we // assume the C compiler also assembles. if use_pregenerated && &target.os == WINDOWS { // The pregenerated object files always use ".obj" as the extension, // even when the C/C++ compiler outputs files with the ".o" extension. asm_srcs = asm_srcs .iter() .map(|src| obj_path(&pregenerated, src.as_path(), "obj")) .collect::>(); } let core_srcs = sources_for_arch(&target.arch) .into_iter() .filter(|p| !is_perlasm(&p)) .collect::>(); let test_srcs = RING_TEST_SRCS.iter().map(PathBuf::from).collect::>(); let libs = [ ("ring-core", &core_srcs[..], &asm_srcs[..]), ("ring-test", &test_srcs[..], &[]), ]; // XXX: Ideally, ring-test would only be built for `cargo test`, but Cargo // can't do that yet. libs.into_iter() .for_each(|&(lib_name, srcs, additional_srcs)| { build_library( &target, &out_dir, lib_name, srcs, additional_srcs, warnings_are_errors, includes_modified, ) }); println!( "cargo:rustc-link-search=native={}", out_dir.to_str().expect("Invalid path") ); } fn build_library( target: &Target, out_dir: &Path, lib_name: &str, srcs: &[PathBuf], additional_srcs: &[PathBuf], warnings_are_errors: bool, includes_modified: SystemTime, ) { // Compile all the (dirty) source files into object files. let objs = additional_srcs .into_iter() .chain(srcs.into_iter()) .filter(|f| &target.env != "msvc" || f.extension().unwrap().to_str().unwrap() != "S") .map(|f| compile(f, target, warnings_are_errors, out_dir, includes_modified)) .collect::>(); // Rebuild the library if necessary. let lib_path = PathBuf::from(out_dir).join(format!("lib{}.a", lib_name)); if objs .iter() .map(Path::new) .any(|p| need_run(&p, &lib_path, includes_modified)) { let mut c = cc::Build::new(); for f in LD_FLAGS { let _ = c.flag(&f); } match target.os.as_str() { "macos" => { let _ = c.flag("-fPIC"); let _ = c.flag("-Wl,-dead_strip"); } _ => { let _ = c.flag("-Wl,--gc-sections".into()); } } for o in objs { let _ = c.object(o); } // Handled below. let _ = c.cargo_metadata(false); c.compile( lib_path .file_name() .and_then(|f| f.to_str()) .expect("No filename"), ); } // Link the library. This works even when the library doesn't need to be // rebuilt. println!("cargo:rustc-link-lib=static={}", lib_name); } fn compile( p: &Path, target: &Target, warnings_are_errors: bool, out_dir: &Path, includes_modified: SystemTime, ) -> String { let ext = p.extension().unwrap().to_str().unwrap(); if ext == "obj" { p.to_str().expect("Invalid path").into() } else { let mut out_path = out_dir.clone().join(p.file_name().unwrap()); assert!(out_path.set_extension(target.obj_ext)); if need_run(&p, &out_path, includes_modified) { let cmd = if &target.os != WINDOWS || ext != "asm" { cc(p, ext, target, warnings_are_errors, &out_path) } else { yasm(p, &target.arch, &out_path) }; run_command(cmd); } out_path.to_str().expect("Invalid path").into() } } fn obj_path(out_dir: &Path, src: &Path, obj_ext: &str) -> PathBuf { let mut out_path = out_dir.clone().join(src.file_name().unwrap()); assert!(out_path.set_extension(obj_ext)); out_path } fn cc( file: &Path, ext: &str, target: &Target, warnings_are_errors: bool, out_dir: &Path, ) -> Command { let mut c = cc::Build::new(); let _ = c.include("include"); match ext { "c" => { for f in c_flags(target) { let _ = c.flag(f); } } "S" => (), e => panic!("Unsupported file extension: {:?}", e), }; for f in cpp_flags(target) { let _ = c.flag(&f); } if &target.os != "none" && &target.os != "redox" && &target.os != "windows" { let _ = c.flag("-fstack-protector"); } match (target.os.as_str(), target.env.as_str()) { // ``-gfull`` is required for Darwin's |-dead_strip|. ("macos", _) => { let _ = c.flag("-gfull"); } (_, "msvc") => (), _ => { let _ = c.flag("-g3"); } }; if !target.is_debug { let _ = c.define("NDEBUG", None); } if &target.env == "msvc" { if std::env::var("OPT_LEVEL").unwrap() == "0" { let _ = c.flag("/Od"); // Disable optimization for debug builds. // run-time checking: (s)tack frame, (u)ninitialized variables let _ = c.flag("/RTCsu"); } else { let _ = c.flag("/Ox"); // Enable full optimization. } } if warnings_are_errors { let flag = if &target.env != "msvc" { "-Werror" } else { "/WX" }; let _ = c.flag(flag); } if &target.env == "musl" { // Some platforms enable _FORTIFY_SOURCE by default, but musl // libc doesn't support it yet. See // http://wiki.musl-libc.org/wiki/Future_Ideas#Fortify // http://www.openwall.com/lists/musl/2015/02/04/3 // http://www.openwall.com/lists/musl/2015/06/17/1 let _ = c.flag("-U_FORTIFY_SOURCE"); } let mut c = c.get_compiler().to_command(); let _ = c .arg("-c") .arg(format!( "{}{}", target.obj_opt, out_dir.to_str().expect("Invalid path") )) .arg(file); c } fn yasm(file: &Path, arch: &str, out_file: &Path) -> Command { let (oformat, machine) = match arch { "x86_64" => ("--oformat=win64", "--machine=amd64"), "x86" => ("--oformat=win32", "--machine=x86"), _ => panic!("unsupported arch: {}", arch), }; let mut c = Command::new("yasm.exe"); let _ = c .arg("-X") .arg("vc") .arg("--dformat=cv8") .arg(oformat) .arg(machine) .arg("-o") .arg(out_file.to_str().expect("Invalid path")) .arg(file); c } fn run_command_with_args(command_name: S, args: &[String]) where S: AsRef + Copy, { let mut cmd = Command::new(command_name); let _ = cmd.args(args); run_command(cmd) } fn run_command(mut cmd: Command) { println!("running {:?}", cmd); let status = cmd.status().unwrap_or_else(|e| { panic!("failed to execute [{:?}]: {}", cmd, e); }); if !status.success() { panic!("execution failed"); } } fn sources_for_arch(arch: &str) -> Vec { RING_SRCS .iter() .filter(|&&(archs, _)| archs.is_empty() || archs.contains(&arch)) .map(|&(_, p)| PathBuf::from(p)) .collect::>() } fn perlasm_src_dsts( out_dir: &Path, arch: &str, os: Option<&str>, perlasm_format: &str, ) -> Vec<(PathBuf, PathBuf)> { let srcs = sources_for_arch(arch); let mut src_dsts = srcs .iter() .filter(|p| is_perlasm(p)) .map(|src| (src.clone(), asm_path(out_dir, src, os, perlasm_format))) .collect::>(); // Some PerlAsm source files need to be run multiple times with different // output paths. { // Appease the borrow checker. let mut maybe_synthesize = |concrete, synthesized| { let concrete_path = PathBuf::from(concrete); if srcs.contains(&concrete_path) { let synthesized_path = PathBuf::from(synthesized); src_dsts.push(( concrete_path, asm_path(out_dir, &synthesized_path, os, perlasm_format), )) } }; maybe_synthesize(SHA512_X86_64, SHA256_X86_64); maybe_synthesize(SHA512_ARMV8, SHA256_ARMV8); } src_dsts } fn asm_srcs(perlasm_src_dsts: Vec<(PathBuf, PathBuf)>) -> Vec { perlasm_src_dsts .into_iter() .map(|(_src, dst)| dst) .collect::>() } fn is_perlasm(path: &PathBuf) -> bool { path.extension().unwrap().to_str().unwrap() == "pl" } fn asm_path(out_dir: &Path, src: &Path, os: Option<&str>, perlasm_format: &str) -> PathBuf { let src_stem = src.file_stem().expect("source file without basename"); let dst_stem = src_stem.to_str().unwrap(); let dst_extension = if os == Some("windows") { "asm" } else { "S" }; let dst_filename = format!("{}-{}.{}", dst_stem, perlasm_format, dst_extension); out_dir.join(dst_filename) } fn perlasm( src_dst: &[(PathBuf, PathBuf)], arch: &str, perlasm_format: &str, includes_modified: Option, ) { for (src, dst) in src_dst { if let Some(includes_modified) = includes_modified { if !need_run(src, dst, includes_modified) { continue; } } let mut args = Vec::::new(); args.push(src.to_string_lossy().into_owned()); args.push(perlasm_format.to_owned()); if arch == "x86" { args.push("-fPIC".into()); args.push("-DOPENSSL_IA32_SSE2".into()); } // Work around PerlAsm issue for ARM and AAarch64 targets by replacing // back slashes with forward slashes. let dst = dst .to_str() .expect("Could not convert path") .replace("\\", "/"); args.push(dst); run_command_with_args(&get_command("PERL_EXECUTABLE", "perl"), &args); } } fn need_run(source: &Path, target: &Path, includes_modified: SystemTime) -> bool { let s_modified = file_modified(source); if let Ok(target_metadata) = std::fs::metadata(target) { let target_modified = target_metadata.modified().unwrap(); s_modified >= target_modified || includes_modified >= target_modified } else { // On error fetching metadata for the target file, assume the target // doesn't exist. true } } fn file_modified(path: &Path) -> SystemTime { let path = Path::new(path); let path_as_str = format!("{:?}", path); std::fs::metadata(path) .expect(&path_as_str) .modified() .expect("nah") } fn get_command(var: &str, default: &str) -> String { std::env::var(var).unwrap_or(default.into()) } fn check_all_files_tracked() { for path in &["crypto", "include", "third_party/fiat"] { walk_dir(&PathBuf::from(path), &is_tracked); } } fn is_tracked(file: &DirEntry) { let p = file.path(); let cmp = |f| p == PathBuf::from(f); let tracked = match p.extension().and_then(|p| p.to_str()) { Some("h") | Some("inl") => RING_INCLUDES.iter().any(cmp), Some("c") | Some("S") | Some("asm") => { RING_SRCS.iter().any(|(_, f)| cmp(f)) || RING_TEST_SRCS.iter().any(cmp) } Some("pl") => RING_SRCS.iter().any(|(_, f)| cmp(f)) || RING_PERL_INCLUDES.iter().any(cmp), _ => true, }; if !tracked { panic!("{:?} is not tracked in build.rs", p); } } fn walk_dir(dir: &Path, cb: &F) where F: Fn(&DirEntry), { if dir.is_dir() { for entry in fs::read_dir(dir).unwrap() { let entry = entry.unwrap(); let path = entry.path(); if path.is_dir() { walk_dir(&path, cb); } else { cb(&entry); } } } } ring-0.16.9/crypto/chacha/asm/chacha-armv4.pl000064400000000000000000000662501352416253600170560ustar0000000000000000#! /usr/bin/env perl # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # December 2014 # # ChaCha20 for ARMv4. # # Performance in cycles per byte out of large buffer. # # IALU/gcc-4.4 1xNEON 3xNEON+1xIALU # # Cortex-A5 19.3(*)/+95% 21.8 14.1 # Cortex-A8 10.5(*)/+160% 13.9 6.35 # Cortex-A9 12.9(**)/+110% 14.3 6.50 # Cortex-A15 11.0/+40% 16.0 5.00 # Snapdragon S4 11.5/+125% 13.6 4.90 # # (*) most "favourable" result for aligned data on little-endian # processor, result for misaligned data is 10-15% lower; # (**) this result is a trade-off: it can be improved by 20%, # but then Snapdragon S4 and Cortex-A8 results get # 20-25% worse; $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } sub AUTOLOAD() # thunk [simplified] x86-style perlasm { my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; my $arg = pop; $arg = "#$arg" if ($arg*1 eq $arg); $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; } my @x=map("r$_",(0..7,"x","x","x","x",12,"x",14,"x")); my @t=map("r$_",(8..11)); sub ROUND { my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); my $odd = $d0&1; my ($xc,$xc_) = (@t[0..1]); my ($xd,$xd_) = $odd ? (@t[2],@x[$d1]) : (@x[$d0],@t[2]); my @ret; # Consider order in which variables are addressed by their # index: # # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 # # 'a', 'b' are permanently allocated in registers, @x[0..7], # while 'c's and pair of 'd's are maintained in memory. If # you observe 'c' column, you'll notice that pair of 'c's is # invariant between rounds. This means that we have to reload # them once per round, in the middle. This is why you'll see # bunch of 'c' stores and loads in the middle, but none in # the beginning or end. If you observe 'd' column, you'll # notice that 15 and 13 are reused in next pair of rounds. # This is why these two are chosen for offloading to memory, # to make loads count more. push @ret,( "&add (@x[$a0],@x[$a0],@x[$b0])", "&mov ($xd,$xd,'ror#16')", "&add (@x[$a1],@x[$a1],@x[$b1])", "&mov ($xd_,$xd_,'ror#16')", "&eor ($xd,$xd,@x[$a0],'ror#16')", "&eor ($xd_,$xd_,@x[$a1],'ror#16')", "&add ($xc,$xc,$xd)", "&mov (@x[$b0],@x[$b0],'ror#20')", "&add ($xc_,$xc_,$xd_)", "&mov (@x[$b1],@x[$b1],'ror#20')", "&eor (@x[$b0],@x[$b0],$xc,'ror#20')", "&eor (@x[$b1],@x[$b1],$xc_,'ror#20')", "&add (@x[$a0],@x[$a0],@x[$b0])", "&mov ($xd,$xd,'ror#24')", "&add (@x[$a1],@x[$a1],@x[$b1])", "&mov ($xd_,$xd_,'ror#24')", "&eor ($xd,$xd,@x[$a0],'ror#24')", "&eor ($xd_,$xd_,@x[$a1],'ror#24')", "&add ($xc,$xc,$xd)", "&mov (@x[$b0],@x[$b0],'ror#25')" ); push @ret,( "&str ($xd,'[sp,#4*(16+$d0)]')", "&ldr ($xd,'[sp,#4*(16+$d2)]')" ) if ($odd); push @ret,( "&add ($xc_,$xc_,$xd_)", "&mov (@x[$b1],@x[$b1],'ror#25')" ); push @ret,( "&str ($xd_,'[sp,#4*(16+$d1)]')", "&ldr ($xd_,'[sp,#4*(16+$d3)]')" ) if (!$odd); push @ret,( "&eor (@x[$b0],@x[$b0],$xc,'ror#25')", "&eor (@x[$b1],@x[$b1],$xc_,'ror#25')" ); $xd=@x[$d2] if (!$odd); $xd_=@x[$d3] if ($odd); push @ret,( "&str ($xc,'[sp,#4*(16+$c0)]')", "&ldr ($xc,'[sp,#4*(16+$c2)]')", "&add (@x[$a2],@x[$a2],@x[$b2])", "&mov ($xd,$xd,'ror#16')", "&str ($xc_,'[sp,#4*(16+$c1)]')", "&ldr ($xc_,'[sp,#4*(16+$c3)]')", "&add (@x[$a3],@x[$a3],@x[$b3])", "&mov ($xd_,$xd_,'ror#16')", "&eor ($xd,$xd,@x[$a2],'ror#16')", "&eor ($xd_,$xd_,@x[$a3],'ror#16')", "&add ($xc,$xc,$xd)", "&mov (@x[$b2],@x[$b2],'ror#20')", "&add ($xc_,$xc_,$xd_)", "&mov (@x[$b3],@x[$b3],'ror#20')", "&eor (@x[$b2],@x[$b2],$xc,'ror#20')", "&eor (@x[$b3],@x[$b3],$xc_,'ror#20')", "&add (@x[$a2],@x[$a2],@x[$b2])", "&mov ($xd,$xd,'ror#24')", "&add (@x[$a3],@x[$a3],@x[$b3])", "&mov ($xd_,$xd_,'ror#24')", "&eor ($xd,$xd,@x[$a2],'ror#24')", "&eor ($xd_,$xd_,@x[$a3],'ror#24')", "&add ($xc,$xc,$xd)", "&mov (@x[$b2],@x[$b2],'ror#25')", "&add ($xc_,$xc_,$xd_)", "&mov (@x[$b3],@x[$b3],'ror#25')", "&eor (@x[$b2],@x[$b2],$xc,'ror#25')", "&eor (@x[$b3],@x[$b3],$xc_,'ror#25')" ); @ret; } $code.=<<___; #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #endif #if defined(__thumb2__) .thumb #else .code 32 #endif #if defined(__thumb2__) || defined(__clang__) #define ldrhsb ldrbhs #endif .align 5 .Lsigma: .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral .Lone: .long 1,0,0,0 #if __ARM_MAX_ARCH__>=7 .LOPENSSL_armcap: .word GFp_armcap_P-.LChaCha20_ctr32 #else .word -1 #endif .globl GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,%function .align 5 GFp_ChaCha20_ctr32: .LChaCha20_ctr32: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0-r2,r4-r11,lr} #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r14,pc,#16 @ ChaCha20_ctr32 #else adr r14,.LChaCha20_ctr32 #endif cmp r2,#0 @ len==0? #ifdef __thumb2__ itt eq #endif addeq sp,sp,#4*3 beq .Lno_data #if __ARM_MAX_ARCH__>=7 cmp r2,#192 @ test len bls .Lshort ldr r4,[r14,#-32] ldr r4,[r14,r4] # ifdef __APPLE__ ldr r4,[r4] # endif tst r4,#ARMV7_NEON bne .LChaCha20_neon .Lshort: #endif ldmia r12,{r4-r7} @ load counter and nonce sub sp,sp,#4*(16) @ off-load area sub r14,r14,#64 @ .Lsigma stmdb sp!,{r4-r7} @ copy counter and nonce ldmia r3,{r4-r11} @ load key ldmia r14,{r0-r3} @ load sigma stmdb sp!,{r4-r11} @ copy key stmdb sp!,{r0-r3} @ copy sigma str r10,[sp,#4*(16+10)] @ off-load "@x[10]" str r11,[sp,#4*(16+11)] @ off-load "@x[11]" b .Loop_outer_enter .align 4 .Loop_outer: ldmia sp,{r0-r9} @ load key material str @t[3],[sp,#4*(32+2)] @ save len str r12, [sp,#4*(32+1)] @ save inp str r14, [sp,#4*(32+0)] @ save out .Loop_outer_enter: ldr @t[3], [sp,#4*(15)] ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load ldr @t[2], [sp,#4*(13)] ldr @x[14],[sp,#4*(14)] str @t[3], [sp,#4*(16+15)] mov @t[3],#10 b .Loop .align 4 .Loop: subs @t[3],@t[3],#1 ___ foreach (&ROUND(0, 4, 8,12)) { eval; } foreach (&ROUND(0, 5,10,15)) { eval; } $code.=<<___; bne .Loop ldr @t[3],[sp,#4*(32+2)] @ load len str @t[0], [sp,#4*(16+8)] @ modulo-scheduled store str @t[1], [sp,#4*(16+9)] str @x[12],[sp,#4*(16+12)] str @t[2], [sp,#4*(16+13)] str @x[14],[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ @x[0-7] and second half at sp+4*(16+8) cmp @t[3],#64 @ done yet? #ifdef __thumb2__ itete lo #endif addlo r12,sp,#4*(0) @ shortcut or ... ldrhs r12,[sp,#4*(32+1)] @ ... load inp addlo r14,sp,#4*(0) @ shortcut or ... ldrhs r14,[sp,#4*(32+0)] @ ... load out ldr @t[0],[sp,#4*(0)] @ load key material ldr @t[1],[sp,#4*(1)] #if __ARM_ARCH__>=6 || !defined(__ARMEB__) # if __ARM_ARCH__<7 orr @t[2],r12,r14 tst @t[2],#3 @ are input and output aligned? ldr @t[2],[sp,#4*(2)] bne .Lunaligned cmp @t[3],#64 @ restore flags # else ldr @t[2],[sp,#4*(2)] # endif ldr @t[3],[sp,#4*(3)] add @x[0],@x[0],@t[0] @ accumulate key material add @x[1],@x[1],@t[1] # ifdef __thumb2__ itt hs # endif ldrhs @t[0],[r12],#16 @ load input ldrhs @t[1],[r12,#-12] add @x[2],@x[2],@t[2] add @x[3],@x[3],@t[3] # ifdef __thumb2__ itt hs # endif ldrhs @t[2],[r12,#-8] ldrhs @t[3],[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] # endif # ifdef __thumb2__ itt hs # endif eorhs @x[0],@x[0],@t[0] @ xor with input eorhs @x[1],@x[1],@t[1] add @t[0],sp,#4*(4) str @x[0],[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs @x[2],@x[2],@t[2] eorhs @x[3],@x[3],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[1],[r14,#-12] str @x[2],[r14,#-8] str @x[3],[r14,#-4] add @x[4],@x[4],@t[0] @ accumulate key material add @x[5],@x[5],@t[1] # ifdef __thumb2__ itt hs # endif ldrhs @t[0],[r12],#16 @ load input ldrhs @t[1],[r12,#-12] add @x[6],@x[6],@t[2] add @x[7],@x[7],@t[3] # ifdef __thumb2__ itt hs # endif ldrhs @t[2],[r12,#-8] ldrhs @t[3],[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif # ifdef __thumb2__ itt hs # endif eorhs @x[4],@x[4],@t[0] eorhs @x[5],@x[5],@t[1] add @t[0],sp,#4*(8) str @x[4],[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs @x[6],@x[6],@t[2] eorhs @x[7],@x[7],@t[3] str @x[5],[r14,#-12] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[6],[r14,#-8] add @x[0],sp,#4*(16+8) str @x[7],[r14,#-4] ldmia @x[0],{@x[0]-@x[7]} @ load second half add @x[0],@x[0],@t[0] @ accumulate key material add @x[1],@x[1],@t[1] # ifdef __thumb2__ itt hs # endif ldrhs @t[0],[r12],#16 @ load input ldrhs @t[1],[r12,#-12] # ifdef __thumb2__ itt hi # endif strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" while at it strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" while at it add @x[2],@x[2],@t[2] add @x[3],@x[3],@t[3] # ifdef __thumb2__ itt hs # endif ldrhs @t[2],[r12,#-8] ldrhs @t[3],[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] # endif # ifdef __thumb2__ itt hs # endif eorhs @x[0],@x[0],@t[0] eorhs @x[1],@x[1],@t[1] add @t[0],sp,#4*(12) str @x[0],[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs @x[2],@x[2],@t[2] eorhs @x[3],@x[3],@t[3] str @x[1],[r14,#-12] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[2],[r14,#-8] str @x[3],[r14,#-4] add @x[4],@x[4],@t[0] @ accumulate key material add @x[5],@x[5],@t[1] # ifdef __thumb2__ itt hi # endif addhi @t[0],@t[0],#1 @ next counter value strhi @t[0],[sp,#4*(12)] @ save next counter value # ifdef __thumb2__ itt hs # endif ldrhs @t[0],[r12],#16 @ load input ldrhs @t[1],[r12,#-12] add @x[6],@x[6],@t[2] add @x[7],@x[7],@t[3] # ifdef __thumb2__ itt hs # endif ldrhs @t[2],[r12,#-8] ldrhs @t[3],[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif # ifdef __thumb2__ itt hs # endif eorhs @x[4],@x[4],@t[0] eorhs @x[5],@x[5],@t[1] # ifdef __thumb2__ it ne # endif ldrne @t[0],[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ itt hs # endif eorhs @x[6],@x[6],@t[2] eorhs @x[7],@x[7],@t[3] str @x[4],[r14],#16 @ store output str @x[5],[r14,#-12] # ifdef __thumb2__ it hs # endif subhs @t[3],@t[0],#64 @ len-=64 str @x[6],[r14,#-8] str @x[7],[r14,#-4] bhi .Loop_outer beq .Ldone # if __ARM_ARCH__<7 b .Ltail .align 4 .Lunaligned: @ unaligned endian-neutral path cmp @t[3],#64 @ restore flags # endif #endif #if __ARM_ARCH__<7 ldr @t[3],[sp,#4*(3)] ___ for ($i=0;$i<16;$i+=4) { my $j=$i&0x7; $code.=<<___ if ($i==4); add @x[0],sp,#4*(16+8) ___ $code.=<<___ if ($i==8); ldmia @x[0],{@x[0]-@x[7]} @ load second half # ifdef __thumb2__ itt hi # endif strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" ___ $code.=<<___; add @x[$j+0],@x[$j+0],@t[0] @ accumulate key material ___ $code.=<<___ if ($i==12); # ifdef __thumb2__ itt hi # endif addhi @t[0],@t[0],#1 @ next counter value strhi @t[0],[sp,#4*(12)] @ save next counter value ___ $code.=<<___; add @x[$j+1],@x[$j+1],@t[1] add @x[$j+2],@x[$j+2],@t[2] # ifdef __thumb2__ itete lo # endif eorlo @t[0],@t[0],@t[0] @ zero or ... ldrhsb @t[0],[r12],#16 @ ... load input eorlo @t[1],@t[1],@t[1] ldrhsb @t[1],[r12,#-12] add @x[$j+3],@x[$j+3],@t[3] # ifdef __thumb2__ itete lo # endif eorlo @t[2],@t[2],@t[2] ldrhsb @t[2],[r12,#-8] eorlo @t[3],@t[3],@t[3] ldrhsb @t[3],[r12,#-4] eor @x[$j+0],@t[0],@x[$j+0] @ xor with input (or zero) eor @x[$j+1],@t[1],@x[$j+1] # ifdef __thumb2__ itt hs # endif ldrhsb @t[0],[r12,#-15] @ load more input ldrhsb @t[1],[r12,#-11] eor @x[$j+2],@t[2],@x[$j+2] strb @x[$j+0],[r14],#16 @ store output eor @x[$j+3],@t[3],@x[$j+3] # ifdef __thumb2__ itt hs # endif ldrhsb @t[2],[r12,#-7] ldrhsb @t[3],[r12,#-3] strb @x[$j+1],[r14,#-12] eor @x[$j+0],@t[0],@x[$j+0],lsr#8 strb @x[$j+2],[r14,#-8] eor @x[$j+1],@t[1],@x[$j+1],lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb @t[0],[r12,#-14] @ load more input ldrhsb @t[1],[r12,#-10] strb @x[$j+3],[r14,#-4] eor @x[$j+2],@t[2],@x[$j+2],lsr#8 strb @x[$j+0],[r14,#-15] eor @x[$j+3],@t[3],@x[$j+3],lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb @t[2],[r12,#-6] ldrhsb @t[3],[r12,#-2] strb @x[$j+1],[r14,#-11] eor @x[$j+0],@t[0],@x[$j+0],lsr#8 strb @x[$j+2],[r14,#-7] eor @x[$j+1],@t[1],@x[$j+1],lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb @t[0],[r12,#-13] @ load more input ldrhsb @t[1],[r12,#-9] strb @x[$j+3],[r14,#-3] eor @x[$j+2],@t[2],@x[$j+2],lsr#8 strb @x[$j+0],[r14,#-14] eor @x[$j+3],@t[3],@x[$j+3],lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb @t[2],[r12,#-5] ldrhsb @t[3],[r12,#-1] strb @x[$j+1],[r14,#-10] strb @x[$j+2],[r14,#-6] eor @x[$j+0],@t[0],@x[$j+0],lsr#8 strb @x[$j+3],[r14,#-2] eor @x[$j+1],@t[1],@x[$j+1],lsr#8 strb @x[$j+0],[r14,#-13] eor @x[$j+2],@t[2],@x[$j+2],lsr#8 strb @x[$j+1],[r14,#-9] eor @x[$j+3],@t[3],@x[$j+3],lsr#8 strb @x[$j+2],[r14,#-5] strb @x[$j+3],[r14,#-1] ___ $code.=<<___ if ($i<12); add @t[0],sp,#4*(4+$i) ldmia @t[0],{@t[0]-@t[3]} @ load key material ___ } $code.=<<___; # ifdef __thumb2__ it ne # endif ldrne @t[0],[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ it hs # endif subhs @t[3],@t[0],#64 @ len-=64 bhi .Loop_outer beq .Ldone #endif .Ltail: ldr r12,[sp,#4*(32+1)] @ load inp add @t[1],sp,#4*(0) ldr r14,[sp,#4*(32+0)] @ load out .Loop_tail: ldrb @t[2],[@t[1]],#1 @ read buffer on stack ldrb @t[3],[r12],#1 @ read input subs @t[0],@t[0],#1 eor @t[3],@t[3],@t[2] strb @t[3],[r14],#1 @ store output bne .Loop_tail .Ldone: add sp,sp,#4*(32+3) .Lno_data: ldmia sp!,{r4-r11,pc} .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 ___ {{{ my ($a0,$b0,$c0,$d0,$a1,$b1,$c1,$d1,$a2,$b2,$c2,$d2,$t0,$t1,$t2,$t3) = map("q$_",(0..15)); sub NEONROUND { my $odd = pop; my ($a,$b,$c,$d,$t)=@_; ( "&vadd_i32 ($a,$a,$b)", "&veor ($d,$d,$a)", "&vrev32_16 ($d,$d)", # vrot ($d,16) "&vadd_i32 ($c,$c,$d)", "&veor ($t,$b,$c)", "&vshr_u32 ($b,$t,20)", "&vsli_32 ($b,$t,12)", "&vadd_i32 ($a,$a,$b)", "&veor ($t,$d,$a)", "&vshr_u32 ($d,$t,24)", "&vsli_32 ($d,$t,8)", "&vadd_i32 ($c,$c,$d)", "&veor ($t,$b,$c)", "&vshr_u32 ($b,$t,25)", "&vsli_32 ($b,$t,7)", "&vext_8 ($c,$c,$c,8)", "&vext_8 ($b,$b,$b,$odd?12:4)", "&vext_8 ($d,$d,$d,$odd?4:12)" ); } $code.=<<___; #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type ChaCha20_neon,%function .align 5 ChaCha20_neon: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0-r2,r4-r11,lr} .LChaCha20_neon: adr r14,.Lsigma vstmdb sp!,{d8-d15} @ ABI spec says so stmdb sp!,{r0-r3} vld1.32 {$b0-$c0},[r3] @ load key ldmia r3,{r4-r11} @ load key sub sp,sp,#4*(16+16) vld1.32 {$d0},[r12] @ load counter and nonce add r12,sp,#4*8 ldmia r14,{r0-r3} @ load sigma vld1.32 {$a0},[r14]! @ load sigma vld1.32 {$t0},[r14] @ one vst1.32 {$c0-$d0},[r12] @ copy 1/2key|counter|nonce vst1.32 {$a0-$b0},[sp] @ copy sigma|1/2key str r10,[sp,#4*(16+10)] @ off-load "@x[10]" str r11,[sp,#4*(16+11)] @ off-load "@x[11]" vshl.i32 $t1#lo,$t0#lo,#1 @ two vstr $t0#lo,[sp,#4*(16+0)] vshl.i32 $t2#lo,$t0#lo,#2 @ four vstr $t1#lo,[sp,#4*(16+2)] vmov $a1,$a0 vstr $t2#lo,[sp,#4*(16+4)] vmov $a2,$a0 vmov $b1,$b0 vmov $b2,$b0 b .Loop_neon_enter .align 4 .Loop_neon_outer: ldmia sp,{r0-r9} @ load key material cmp @t[3],#64*2 @ if len<=64*2 bls .Lbreak_neon @ switch to integer-only vmov $a1,$a0 str @t[3],[sp,#4*(32+2)] @ save len vmov $a2,$a0 str r12, [sp,#4*(32+1)] @ save inp vmov $b1,$b0 str r14, [sp,#4*(32+0)] @ save out vmov $b2,$b0 .Loop_neon_enter: ldr @t[3], [sp,#4*(15)] vadd.i32 $d1,$d0,$t0 @ counter+1 ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load vmov $c1,$c0 ldr @t[2], [sp,#4*(13)] vmov $c2,$c0 ldr @x[14],[sp,#4*(14)] vadd.i32 $d2,$d1,$t0 @ counter+2 str @t[3], [sp,#4*(16+15)] mov @t[3],#10 add @x[12],@x[12],#3 @ counter+3 b .Loop_neon .align 4 .Loop_neon: subs @t[3],@t[3],#1 ___ my @thread0=&NEONROUND($a0,$b0,$c0,$d0,$t0,0); my @thread1=&NEONROUND($a1,$b1,$c1,$d1,$t1,0); my @thread2=&NEONROUND($a2,$b2,$c2,$d2,$t2,0); my @thread3=&ROUND(0,4,8,12); foreach (@thread0) { eval; eval(shift(@thread3)); eval(shift(@thread1)); eval(shift(@thread3)); eval(shift(@thread2)); eval(shift(@thread3)); } @thread0=&NEONROUND($a0,$b0,$c0,$d0,$t0,1); @thread1=&NEONROUND($a1,$b1,$c1,$d1,$t1,1); @thread2=&NEONROUND($a2,$b2,$c2,$d2,$t2,1); @thread3=&ROUND(0,5,10,15); foreach (@thread0) { eval; eval(shift(@thread3)); eval(shift(@thread1)); eval(shift(@thread3)); eval(shift(@thread2)); eval(shift(@thread3)); } $code.=<<___; bne .Loop_neon add @t[3],sp,#32 vld1.32 {$t0-$t1},[sp] @ load key material vld1.32 {$t2-$t3},[@t[3]] ldr @t[3],[sp,#4*(32+2)] @ load len str @t[0], [sp,#4*(16+8)] @ modulo-scheduled store str @t[1], [sp,#4*(16+9)] str @x[12],[sp,#4*(16+12)] str @t[2], [sp,#4*(16+13)] str @x[14],[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ @x[0-7] and second half at sp+4*(16+8) ldr r12,[sp,#4*(32+1)] @ load inp ldr r14,[sp,#4*(32+0)] @ load out vadd.i32 $a0,$a0,$t0 @ accumulate key material vadd.i32 $a1,$a1,$t0 vadd.i32 $a2,$a2,$t0 vldr $t0#lo,[sp,#4*(16+0)] @ one vadd.i32 $b0,$b0,$t1 vadd.i32 $b1,$b1,$t1 vadd.i32 $b2,$b2,$t1 vldr $t1#lo,[sp,#4*(16+2)] @ two vadd.i32 $c0,$c0,$t2 vadd.i32 $c1,$c1,$t2 vadd.i32 $c2,$c2,$t2 vadd.i32 $d1#lo,$d1#lo,$t0#lo @ counter+1 vadd.i32 $d2#lo,$d2#lo,$t1#lo @ counter+2 vadd.i32 $d0,$d0,$t3 vadd.i32 $d1,$d1,$t3 vadd.i32 $d2,$d2,$t3 cmp @t[3],#64*4 blo .Ltail_neon vld1.8 {$t0-$t1},[r12]! @ load input mov @t[3],sp vld1.8 {$t2-$t3},[r12]! veor $a0,$a0,$t0 @ xor with input veor $b0,$b0,$t1 vld1.8 {$t0-$t1},[r12]! veor $c0,$c0,$t2 veor $d0,$d0,$t3 vld1.8 {$t2-$t3},[r12]! veor $a1,$a1,$t0 vst1.8 {$a0-$b0},[r14]! @ store output veor $b1,$b1,$t1 vld1.8 {$t0-$t1},[r12]! veor $c1,$c1,$t2 vst1.8 {$c0-$d0},[r14]! veor $d1,$d1,$t3 vld1.8 {$t2-$t3},[r12]! veor $a2,$a2,$t0 vld1.32 {$a0-$b0},[@t[3]]! @ load for next iteration veor $t0#hi,$t0#hi,$t0#hi vldr $t0#lo,[sp,#4*(16+4)] @ four veor $b2,$b2,$t1 vld1.32 {$c0-$d0},[@t[3]] veor $c2,$c2,$t2 vst1.8 {$a1-$b1},[r14]! veor $d2,$d2,$t3 vst1.8 {$c1-$d1},[r14]! vadd.i32 $d0#lo,$d0#lo,$t0#lo @ next counter value vldr $t0#lo,[sp,#4*(16+0)] @ one ldmia sp,{@t[0]-@t[3]} @ load key material add @x[0],@x[0],@t[0] @ accumulate key material ldr @t[0],[r12],#16 @ load input vst1.8 {$a2-$b2},[r14]! add @x[1],@x[1],@t[1] ldr @t[1],[r12,#-12] vst1.8 {$c2-$d2},[r14]! add @x[2],@x[2],@t[2] ldr @t[2],[r12,#-8] add @x[3],@x[3],@t[3] ldr @t[3],[r12,#-4] # ifdef __ARMEB__ rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] # endif eor @x[0],@x[0],@t[0] @ xor with input add @t[0],sp,#4*(4) eor @x[1],@x[1],@t[1] str @x[0],[r14],#16 @ store output eor @x[2],@x[2],@t[2] str @x[1],[r14,#-12] eor @x[3],@x[3],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[2],[r14,#-8] str @x[3],[r14,#-4] add @x[4],@x[4],@t[0] @ accumulate key material ldr @t[0],[r12],#16 @ load input add @x[5],@x[5],@t[1] ldr @t[1],[r12,#-12] add @x[6],@x[6],@t[2] ldr @t[2],[r12,#-8] add @x[7],@x[7],@t[3] ldr @t[3],[r12,#-4] # ifdef __ARMEB__ rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif eor @x[4],@x[4],@t[0] add @t[0],sp,#4*(8) eor @x[5],@x[5],@t[1] str @x[4],[r14],#16 @ store output eor @x[6],@x[6],@t[2] str @x[5],[r14,#-12] eor @x[7],@x[7],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[6],[r14,#-8] add @x[0],sp,#4*(16+8) str @x[7],[r14,#-4] ldmia @x[0],{@x[0]-@x[7]} @ load second half add @x[0],@x[0],@t[0] @ accumulate key material ldr @t[0],[r12],#16 @ load input add @x[1],@x[1],@t[1] ldr @t[1],[r12,#-12] # ifdef __thumb2__ it hi # endif strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" while at it add @x[2],@x[2],@t[2] ldr @t[2],[r12,#-8] # ifdef __thumb2__ it hi # endif strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" while at it add @x[3],@x[3],@t[3] ldr @t[3],[r12,#-4] # ifdef __ARMEB__ rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] # endif eor @x[0],@x[0],@t[0] add @t[0],sp,#4*(12) eor @x[1],@x[1],@t[1] str @x[0],[r14],#16 @ store output eor @x[2],@x[2],@t[2] str @x[1],[r14,#-12] eor @x[3],@x[3],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material str @x[2],[r14,#-8] str @x[3],[r14,#-4] add @x[4],@x[4],@t[0] @ accumulate key material add @t[0],@t[0],#4 @ next counter value add @x[5],@x[5],@t[1] str @t[0],[sp,#4*(12)] @ save next counter value ldr @t[0],[r12],#16 @ load input add @x[6],@x[6],@t[2] add @x[4],@x[4],#3 @ counter+3 ldr @t[1],[r12,#-12] add @x[7],@x[7],@t[3] ldr @t[2],[r12,#-8] ldr @t[3],[r12,#-4] # ifdef __ARMEB__ rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif eor @x[4],@x[4],@t[0] # ifdef __thumb2__ it hi # endif ldrhi @t[0],[sp,#4*(32+2)] @ re-load len eor @x[5],@x[5],@t[1] eor @x[6],@x[6],@t[2] str @x[4],[r14],#16 @ store output eor @x[7],@x[7],@t[3] str @x[5],[r14,#-12] sub @t[3],@t[0],#64*4 @ len-=64*4 str @x[6],[r14,#-8] str @x[7],[r14,#-4] bhi .Loop_neon_outer b .Ldone_neon .align 4 .Lbreak_neon: @ harmonize NEON and integer-only stack frames: load data @ from NEON frame, but save to integer-only one; distance @ between the two is 4*(32+4+16-32)=4*(20). str @t[3], [sp,#4*(20+32+2)] @ save len add @t[3],sp,#4*(32+4) str r12, [sp,#4*(20+32+1)] @ save inp str r14, [sp,#4*(20+32+0)] @ save out ldr @x[12],[sp,#4*(16+10)] ldr @x[14],[sp,#4*(16+11)] vldmia @t[3],{d8-d15} @ fulfill ABI requirement str @x[12],[sp,#4*(20+16+10)] @ copy "@x[10]" str @x[14],[sp,#4*(20+16+11)] @ copy "@x[11]" ldr @t[3], [sp,#4*(15)] ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load ldr @t[2], [sp,#4*(13)] ldr @x[14],[sp,#4*(14)] str @t[3], [sp,#4*(20+16+15)] add @t[3],sp,#4*(20) vst1.32 {$a0-$b0},[@t[3]]! @ copy key add sp,sp,#4*(20) @ switch frame vst1.32 {$c0-$d0},[@t[3]] mov @t[3],#10 b .Loop @ go integer-only .align 4 .Ltail_neon: cmp @t[3],#64*3 bhs .L192_or_more_neon cmp @t[3],#64*2 bhs .L128_or_more_neon cmp @t[3],#64*1 bhs .L64_or_more_neon add @t[0],sp,#4*(8) vst1.8 {$a0-$b0},[sp] add @t[2],sp,#4*(0) vst1.8 {$c0-$d0},[@t[0]] b .Loop_tail_neon .align 4 .L64_or_more_neon: vld1.8 {$t0-$t1},[r12]! vld1.8 {$t2-$t3},[r12]! veor $a0,$a0,$t0 veor $b0,$b0,$t1 veor $c0,$c0,$t2 veor $d0,$d0,$t3 vst1.8 {$a0-$b0},[r14]! vst1.8 {$c0-$d0},[r14]! beq .Ldone_neon add @t[0],sp,#4*(8) vst1.8 {$a1-$b1},[sp] add @t[2],sp,#4*(0) vst1.8 {$c1-$d1},[@t[0]] sub @t[3],@t[3],#64*1 @ len-=64*1 b .Loop_tail_neon .align 4 .L128_or_more_neon: vld1.8 {$t0-$t1},[r12]! vld1.8 {$t2-$t3},[r12]! veor $a0,$a0,$t0 veor $b0,$b0,$t1 vld1.8 {$t0-$t1},[r12]! veor $c0,$c0,$t2 veor $d0,$d0,$t3 vld1.8 {$t2-$t3},[r12]! veor $a1,$a1,$t0 veor $b1,$b1,$t1 vst1.8 {$a0-$b0},[r14]! veor $c1,$c1,$t2 vst1.8 {$c0-$d0},[r14]! veor $d1,$d1,$t3 vst1.8 {$a1-$b1},[r14]! vst1.8 {$c1-$d1},[r14]! beq .Ldone_neon add @t[0],sp,#4*(8) vst1.8 {$a2-$b2},[sp] add @t[2],sp,#4*(0) vst1.8 {$c2-$d2},[@t[0]] sub @t[3],@t[3],#64*2 @ len-=64*2 b .Loop_tail_neon .align 4 .L192_or_more_neon: vld1.8 {$t0-$t1},[r12]! vld1.8 {$t2-$t3},[r12]! veor $a0,$a0,$t0 veor $b0,$b0,$t1 vld1.8 {$t0-$t1},[r12]! veor $c0,$c0,$t2 veor $d0,$d0,$t3 vld1.8 {$t2-$t3},[r12]! veor $a1,$a1,$t0 veor $b1,$b1,$t1 vld1.8 {$t0-$t1},[r12]! veor $c1,$c1,$t2 vst1.8 {$a0-$b0},[r14]! veor $d1,$d1,$t3 vld1.8 {$t2-$t3},[r12]! veor $a2,$a2,$t0 vst1.8 {$c0-$d0},[r14]! veor $b2,$b2,$t1 vst1.8 {$a1-$b1},[r14]! veor $c2,$c2,$t2 vst1.8 {$c1-$d1},[r14]! veor $d2,$d2,$t3 vst1.8 {$a2-$b2},[r14]! vst1.8 {$c2-$d2},[r14]! beq .Ldone_neon ldmia sp,{@t[0]-@t[3]} @ load key material add @x[0],@x[0],@t[0] @ accumulate key material add @t[0],sp,#4*(4) add @x[1],@x[1],@t[1] add @x[2],@x[2],@t[2] add @x[3],@x[3],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material add @x[4],@x[4],@t[0] @ accumulate key material add @t[0],sp,#4*(8) add @x[5],@x[5],@t[1] add @x[6],@x[6],@t[2] add @x[7],@x[7],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material # ifdef __ARMEB__ rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif stmia sp,{@x[0]-@x[7]} add @x[0],sp,#4*(16+8) ldmia @x[0],{@x[0]-@x[7]} @ load second half add @x[0],@x[0],@t[0] @ accumulate key material add @t[0],sp,#4*(12) add @x[1],@x[1],@t[1] add @x[2],@x[2],@t[2] add @x[3],@x[3],@t[3] ldmia @t[0],{@t[0]-@t[3]} @ load key material add @x[4],@x[4],@t[0] @ accumulate key material add @t[0],sp,#4*(8) add @x[5],@x[5],@t[1] add @x[4],@x[4],#3 @ counter+3 add @x[6],@x[6],@t[2] add @x[7],@x[7],@t[3] ldr @t[3],[sp,#4*(32+2)] @ re-load len # ifdef __ARMEB__ rev @x[0],@x[0] rev @x[1],@x[1] rev @x[2],@x[2] rev @x[3],@x[3] rev @x[4],@x[4] rev @x[5],@x[5] rev @x[6],@x[6] rev @x[7],@x[7] # endif stmia @t[0],{@x[0]-@x[7]} add @t[2],sp,#4*(0) sub @t[3],@t[3],#64*3 @ len-=64*3 .Loop_tail_neon: ldrb @t[0],[@t[2]],#1 @ read buffer on stack ldrb @t[1],[r12],#1 @ read input subs @t[3],@t[3],#1 eor @t[0],@t[0],@t[1] strb @t[0],[r14],#1 @ store output bne .Loop_tail_neon .Ldone_neon: add sp,sp,#4*(32+4) vldmia sp,{d8-d15} add sp,sp,#4*(16+3) ldmia sp!,{r4-r11,pc} .size ChaCha20_neon,.-ChaCha20_neon .comm GFp_armcap_P,4,4 #endif ___ }}} foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/chacha/asm/chacha-armv8.pl000064400000000000000000000645771352416253600170740ustar0000000000000000#! /usr/bin/env perl # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # June 2015 # # ChaCha20 for ARMv8. # # Performance in cycles per byte out of large buffer. # # IALU/gcc-4.9 3xNEON+1xIALU 6xNEON+2xIALU # # Apple A7 5.50/+49% 3.33 1.70 # Cortex-A53 8.40/+80% 4.72 4.72(*) # Cortex-A57 8.06/+43% 4.90 4.43(**) # Denver 4.50/+82% 2.63 2.67(*) # X-Gene 9.50/+46% 8.82 8.89(*) # Mongoose 8.00/+44% 3.64 3.25 # Kryo 8.17/+50% 4.83 4.65 # # (*) it's expected that doubling interleave factor doesn't help # all processors, only those with higher NEON latency and # higher instruction issue rate; # (**) expected improvement was actually higher; $flavour=shift; $output=shift; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; sub AUTOLOAD() # thunk [simplified] x86-style perlasm { my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; my $arg = pop; $arg = "#$arg" if ($arg*1 eq $arg); $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; } my ($out,$inp,$len,$key,$ctr) = map("x$_",(0..4)); my @x=map("x$_",(5..17,19..21)); my @d=map("x$_",(22..28,30)); sub ROUND { my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); ( "&add_32 (@x[$a0],@x[$a0],@x[$b0])", "&add_32 (@x[$a1],@x[$a1],@x[$b1])", "&add_32 (@x[$a2],@x[$a2],@x[$b2])", "&add_32 (@x[$a3],@x[$a3],@x[$b3])", "&eor_32 (@x[$d0],@x[$d0],@x[$a0])", "&eor_32 (@x[$d1],@x[$d1],@x[$a1])", "&eor_32 (@x[$d2],@x[$d2],@x[$a2])", "&eor_32 (@x[$d3],@x[$d3],@x[$a3])", "&ror_32 (@x[$d0],@x[$d0],16)", "&ror_32 (@x[$d1],@x[$d1],16)", "&ror_32 (@x[$d2],@x[$d2],16)", "&ror_32 (@x[$d3],@x[$d3],16)", "&add_32 (@x[$c0],@x[$c0],@x[$d0])", "&add_32 (@x[$c1],@x[$c1],@x[$d1])", "&add_32 (@x[$c2],@x[$c2],@x[$d2])", "&add_32 (@x[$c3],@x[$c3],@x[$d3])", "&eor_32 (@x[$b0],@x[$b0],@x[$c0])", "&eor_32 (@x[$b1],@x[$b1],@x[$c1])", "&eor_32 (@x[$b2],@x[$b2],@x[$c2])", "&eor_32 (@x[$b3],@x[$b3],@x[$c3])", "&ror_32 (@x[$b0],@x[$b0],20)", "&ror_32 (@x[$b1],@x[$b1],20)", "&ror_32 (@x[$b2],@x[$b2],20)", "&ror_32 (@x[$b3],@x[$b3],20)", "&add_32 (@x[$a0],@x[$a0],@x[$b0])", "&add_32 (@x[$a1],@x[$a1],@x[$b1])", "&add_32 (@x[$a2],@x[$a2],@x[$b2])", "&add_32 (@x[$a3],@x[$a3],@x[$b3])", "&eor_32 (@x[$d0],@x[$d0],@x[$a0])", "&eor_32 (@x[$d1],@x[$d1],@x[$a1])", "&eor_32 (@x[$d2],@x[$d2],@x[$a2])", "&eor_32 (@x[$d3],@x[$d3],@x[$a3])", "&ror_32 (@x[$d0],@x[$d0],24)", "&ror_32 (@x[$d1],@x[$d1],24)", "&ror_32 (@x[$d2],@x[$d2],24)", "&ror_32 (@x[$d3],@x[$d3],24)", "&add_32 (@x[$c0],@x[$c0],@x[$d0])", "&add_32 (@x[$c1],@x[$c1],@x[$d1])", "&add_32 (@x[$c2],@x[$c2],@x[$d2])", "&add_32 (@x[$c3],@x[$c3],@x[$d3])", "&eor_32 (@x[$b0],@x[$b0],@x[$c0])", "&eor_32 (@x[$b1],@x[$b1],@x[$c1])", "&eor_32 (@x[$b2],@x[$b2],@x[$c2])", "&eor_32 (@x[$b3],@x[$b3],@x[$c3])", "&ror_32 (@x[$b0],@x[$b0],25)", "&ror_32 (@x[$b1],@x[$b1],25)", "&ror_32 (@x[$b2],@x[$b2],25)", "&ror_32 (@x[$b3],@x[$b3],25)" ); } $code.=<<___; #include .extern GFp_armcap_P .section .rodata .align 5 .Lsigma: .quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral .Lone: .long 1,0,0,0 .LGFp_armcap_P: #ifdef __ILP32__ .long GFp_armcap_P-. #else .quad GFp_armcap_P-. #endif .asciz "ChaCha20 for ARMv8, CRYPTOGAMS by " .text .globl GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,%function .align 5 GFp_ChaCha20_ctr32: cbz $len,.Labort adrp @x[0],:pg_hi21:GFp_armcap_P cmp $len,#192 b.lo .Lshort add @x[0],@x[0],:lo12:GFp_armcap_P ldr w17,[@x[0]] tst w17,#ARMV7_NEON b.ne ChaCha20_neon .Lshort: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp @x[0],:pg_hi21:.Lsigma add @x[0],@x[0],:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#64 ldp @d[0],@d[1],[@x[0]] // load sigma ldp @d[2],@d[3],[$key] // load key ldp @d[4],@d[5],[$key,#16] ldp @d[6],@d[7],[$ctr] // load counter #ifdef __ARMEB__ ror @d[2],@d[2],#32 ror @d[3],@d[3],#32 ror @d[4],@d[4],#32 ror @d[5],@d[5],#32 ror @d[6],@d[6],#32 ror @d[7],@d[7],#32 #endif .Loop_outer: mov.32 @x[0],@d[0] // unpack key block lsr @x[1],@d[0],#32 mov.32 @x[2],@d[1] lsr @x[3],@d[1],#32 mov.32 @x[4],@d[2] lsr @x[5],@d[2],#32 mov.32 @x[6],@d[3] lsr @x[7],@d[3],#32 mov.32 @x[8],@d[4] lsr @x[9],@d[4],#32 mov.32 @x[10],@d[5] lsr @x[11],@d[5],#32 mov.32 @x[12],@d[6] lsr @x[13],@d[6],#32 mov.32 @x[14],@d[7] lsr @x[15],@d[7],#32 mov $ctr,#10 subs $len,$len,#64 .Loop: sub $ctr,$ctr,#1 ___ foreach (&ROUND(0, 4, 8,12)) { eval; } foreach (&ROUND(0, 5,10,15)) { eval; } $code.=<<___; cbnz $ctr,.Loop add.32 @x[0],@x[0],@d[0] // accumulate key block add @x[1],@x[1],@d[0],lsr#32 add.32 @x[2],@x[2],@d[1] add @x[3],@x[3],@d[1],lsr#32 add.32 @x[4],@x[4],@d[2] add @x[5],@x[5],@d[2],lsr#32 add.32 @x[6],@x[6],@d[3] add @x[7],@x[7],@d[3],lsr#32 add.32 @x[8],@x[8],@d[4] add @x[9],@x[9],@d[4],lsr#32 add.32 @x[10],@x[10],@d[5] add @x[11],@x[11],@d[5],lsr#32 add.32 @x[12],@x[12],@d[6] add @x[13],@x[13],@d[6],lsr#32 add.32 @x[14],@x[14],@d[7] add @x[15],@x[15],@d[7],lsr#32 b.lo .Ltail add @x[0],@x[0],@x[1],lsl#32 // pack add @x[2],@x[2],@x[3],lsl#32 ldp @x[1],@x[3],[$inp,#0] // load input add @x[4],@x[4],@x[5],lsl#32 add @x[6],@x[6],@x[7],lsl#32 ldp @x[5],@x[7],[$inp,#16] add @x[8],@x[8],@x[9],lsl#32 add @x[10],@x[10],@x[11],lsl#32 ldp @x[9],@x[11],[$inp,#32] add @x[12],@x[12],@x[13],lsl#32 add @x[14],@x[14],@x[15],lsl#32 ldp @x[13],@x[15],[$inp,#48] add $inp,$inp,#64 #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif eor @x[0],@x[0],@x[1] eor @x[2],@x[2],@x[3] eor @x[4],@x[4],@x[5] eor @x[6],@x[6],@x[7] eor @x[8],@x[8],@x[9] eor @x[10],@x[10],@x[11] eor @x[12],@x[12],@x[13] eor @x[14],@x[14],@x[15] stp @x[0],@x[2],[$out,#0] // store output add @d[6],@d[6],#1 // increment counter stp @x[4],@x[6],[$out,#16] stp @x[8],@x[10],[$out,#32] stp @x[12],@x[14],[$out,#48] add $out,$out,#64 b.hi .Loop_outer ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 .Labort: ret .align 4 .Ltail: add $len,$len,#64 .Less_than_64: sub $out,$out,#1 add $inp,$inp,$len add $out,$out,$len add $ctr,sp,$len neg $len,$len add @x[0],@x[0],@x[1],lsl#32 // pack add @x[2],@x[2],@x[3],lsl#32 add @x[4],@x[4],@x[5],lsl#32 add @x[6],@x[6],@x[7],lsl#32 add @x[8],@x[8],@x[9],lsl#32 add @x[10],@x[10],@x[11],lsl#32 add @x[12],@x[12],@x[13],lsl#32 add @x[14],@x[14],@x[15],lsl#32 #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif stp @x[0],@x[2],[sp,#0] stp @x[4],@x[6],[sp,#16] stp @x[8],@x[10],[sp,#32] stp @x[12],@x[14],[sp,#48] .Loop_tail: ldrb w10,[$inp,$len] ldrb w11,[$ctr,$len] add $len,$len,#1 eor w10,w10,w11 strb w10,[$out,$len] cbnz $len,.Loop_tail stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 ___ {{{ my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2,$T0,$T1,$T2,$T3) = map("v$_.4s",(0..7,16..23)); my (@K)=map("v$_.4s",(24..30)); my $ONE="v31.4s"; sub NEONROUND { my $odd = pop; my ($a,$b,$c,$d,$t)=@_; ( "&add ('$a','$a','$b')", "&eor ('$d','$d','$a')", "&rev32_16 ('$d','$d')", # vrot ($d,16) "&add ('$c','$c','$d')", "&eor ('$t','$b','$c')", "&ushr ('$b','$t',20)", "&sli ('$b','$t',12)", "&add ('$a','$a','$b')", "&eor ('$t','$d','$a')", "&ushr ('$d','$t',24)", "&sli ('$d','$t',8)", "&add ('$c','$c','$d')", "&eor ('$t','$b','$c')", "&ushr ('$b','$t',25)", "&sli ('$b','$t',7)", "&ext ('$c','$c','$c',8)", "&ext ('$d','$d','$d',$odd?4:12)", "&ext ('$b','$b','$b',$odd?12:4)" ); } $code.=<<___; .type ChaCha20_neon,%function .align 5 ChaCha20_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp @x[0],:pg_hi21:.Lsigma add @x[0],@x[0],:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] cmp $len,#512 b.hs .L512_or_more_neon sub sp,sp,#64 ldp @d[0],@d[1],[@x[0]] // load sigma ld1 {@K[0]},[@x[0]],#16 ldp @d[2],@d[3],[$key] // load key ldp @d[4],@d[5],[$key,#16] ld1 {@K[1],@K[2]},[$key] ldp @d[6],@d[7],[$ctr] // load counter ld1 {@K[3]},[$ctr] ld1 {$ONE},[@x[0]] #ifdef __ARMEB__ rev64 @K[0],@K[0] ror @d[2],@d[2],#32 ror @d[3],@d[3],#32 ror @d[4],@d[4],#32 ror @d[5],@d[5],#32 ror @d[6],@d[6],#32 ror @d[7],@d[7],#32 #endif add @K[3],@K[3],$ONE // += 1 add @K[4],@K[3],$ONE add @K[5],@K[4],$ONE shl $ONE,$ONE,#2 // 1 -> 4 .Loop_outer_neon: mov.32 @x[0],@d[0] // unpack key block lsr @x[1],@d[0],#32 mov $A0,@K[0] mov.32 @x[2],@d[1] lsr @x[3],@d[1],#32 mov $A1,@K[0] mov.32 @x[4],@d[2] lsr @x[5],@d[2],#32 mov $A2,@K[0] mov.32 @x[6],@d[3] mov $B0,@K[1] lsr @x[7],@d[3],#32 mov $B1,@K[1] mov.32 @x[8],@d[4] mov $B2,@K[1] lsr @x[9],@d[4],#32 mov $D0,@K[3] mov.32 @x[10],@d[5] mov $D1,@K[4] lsr @x[11],@d[5],#32 mov $D2,@K[5] mov.32 @x[12],@d[6] mov $C0,@K[2] lsr @x[13],@d[6],#32 mov $C1,@K[2] mov.32 @x[14],@d[7] mov $C2,@K[2] lsr @x[15],@d[7],#32 mov $ctr,#10 subs $len,$len,#256 .Loop_neon: sub $ctr,$ctr,#1 ___ my @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); my @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); my @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); my @thread3=&ROUND(0,4,8,12); foreach (@thread0) { eval; eval(shift(@thread3)); eval(shift(@thread1)); eval(shift(@thread3)); eval(shift(@thread2)); eval(shift(@thread3)); } @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); @thread3=&ROUND(0,5,10,15); foreach (@thread0) { eval; eval(shift(@thread3)); eval(shift(@thread1)); eval(shift(@thread3)); eval(shift(@thread2)); eval(shift(@thread3)); } $code.=<<___; cbnz $ctr,.Loop_neon add.32 @x[0],@x[0],@d[0] // accumulate key block add $A0,$A0,@K[0] add @x[1],@x[1],@d[0],lsr#32 add $A1,$A1,@K[0] add.32 @x[2],@x[2],@d[1] add $A2,$A2,@K[0] add @x[3],@x[3],@d[1],lsr#32 add $C0,$C0,@K[2] add.32 @x[4],@x[4],@d[2] add $C1,$C1,@K[2] add @x[5],@x[5],@d[2],lsr#32 add $C2,$C2,@K[2] add.32 @x[6],@x[6],@d[3] add $D0,$D0,@K[3] add @x[7],@x[7],@d[3],lsr#32 add.32 @x[8],@x[8],@d[4] add $D1,$D1,@K[4] add @x[9],@x[9],@d[4],lsr#32 add.32 @x[10],@x[10],@d[5] add $D2,$D2,@K[5] add @x[11],@x[11],@d[5],lsr#32 add.32 @x[12],@x[12],@d[6] add $B0,$B0,@K[1] add @x[13],@x[13],@d[6],lsr#32 add.32 @x[14],@x[14],@d[7] add $B1,$B1,@K[1] add @x[15],@x[15],@d[7],lsr#32 add $B2,$B2,@K[1] b.lo .Ltail_neon add @x[0],@x[0],@x[1],lsl#32 // pack add @x[2],@x[2],@x[3],lsl#32 ldp @x[1],@x[3],[$inp,#0] // load input add @x[4],@x[4],@x[5],lsl#32 add @x[6],@x[6],@x[7],lsl#32 ldp @x[5],@x[7],[$inp,#16] add @x[8],@x[8],@x[9],lsl#32 add @x[10],@x[10],@x[11],lsl#32 ldp @x[9],@x[11],[$inp,#32] add @x[12],@x[12],@x[13],lsl#32 add @x[14],@x[14],@x[15],lsl#32 ldp @x[13],@x[15],[$inp,#48] add $inp,$inp,#64 #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif ld1.8 {$T0-$T3},[$inp],#64 eor @x[0],@x[0],@x[1] eor @x[2],@x[2],@x[3] eor @x[4],@x[4],@x[5] eor @x[6],@x[6],@x[7] eor @x[8],@x[8],@x[9] eor $A0,$A0,$T0 eor @x[10],@x[10],@x[11] eor $B0,$B0,$T1 eor @x[12],@x[12],@x[13] eor $C0,$C0,$T2 eor @x[14],@x[14],@x[15] eor $D0,$D0,$T3 ld1.8 {$T0-$T3},[$inp],#64 stp @x[0],@x[2],[$out,#0] // store output add @d[6],@d[6],#4 // increment counter stp @x[4],@x[6],[$out,#16] add @K[3],@K[3],$ONE // += 4 stp @x[8],@x[10],[$out,#32] add @K[4],@K[4],$ONE stp @x[12],@x[14],[$out,#48] add @K[5],@K[5],$ONE add $out,$out,#64 st1.8 {$A0-$D0},[$out],#64 ld1.8 {$A0-$D0},[$inp],#64 eor $A1,$A1,$T0 eor $B1,$B1,$T1 eor $C1,$C1,$T2 eor $D1,$D1,$T3 st1.8 {$A1-$D1},[$out],#64 eor $A2,$A2,$A0 eor $B2,$B2,$B0 eor $C2,$C2,$C0 eor $D2,$D2,$D0 st1.8 {$A2-$D2},[$out],#64 b.hi .Loop_outer_neon ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .Ltail_neon: add $len,$len,#256 cmp $len,#64 b.lo .Less_than_64 add @x[0],@x[0],@x[1],lsl#32 // pack add @x[2],@x[2],@x[3],lsl#32 ldp @x[1],@x[3],[$inp,#0] // load input add @x[4],@x[4],@x[5],lsl#32 add @x[6],@x[6],@x[7],lsl#32 ldp @x[5],@x[7],[$inp,#16] add @x[8],@x[8],@x[9],lsl#32 add @x[10],@x[10],@x[11],lsl#32 ldp @x[9],@x[11],[$inp,#32] add @x[12],@x[12],@x[13],lsl#32 add @x[14],@x[14],@x[15],lsl#32 ldp @x[13],@x[15],[$inp,#48] add $inp,$inp,#64 #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif eor @x[0],@x[0],@x[1] eor @x[2],@x[2],@x[3] eor @x[4],@x[4],@x[5] eor @x[6],@x[6],@x[7] eor @x[8],@x[8],@x[9] eor @x[10],@x[10],@x[11] eor @x[12],@x[12],@x[13] eor @x[14],@x[14],@x[15] stp @x[0],@x[2],[$out,#0] // store output add @d[6],@d[6],#4 // increment counter stp @x[4],@x[6],[$out,#16] stp @x[8],@x[10],[$out,#32] stp @x[12],@x[14],[$out,#48] add $out,$out,#64 b.eq .Ldone_neon sub $len,$len,#64 cmp $len,#64 b.lo .Less_than_128 ld1.8 {$T0-$T3},[$inp],#64 eor $A0,$A0,$T0 eor $B0,$B0,$T1 eor $C0,$C0,$T2 eor $D0,$D0,$T3 st1.8 {$A0-$D0},[$out],#64 b.eq .Ldone_neon sub $len,$len,#64 cmp $len,#64 b.lo .Less_than_192 ld1.8 {$T0-$T3},[$inp],#64 eor $A1,$A1,$T0 eor $B1,$B1,$T1 eor $C1,$C1,$T2 eor $D1,$D1,$T3 st1.8 {$A1-$D1},[$out],#64 b.eq .Ldone_neon sub $len,$len,#64 st1.8 {$A2-$D2},[sp] b .Last_neon .Less_than_128: st1.8 {$A0-$D0},[sp] b .Last_neon .Less_than_192: st1.8 {$A1-$D1},[sp] b .Last_neon .align 4 .Last_neon: sub $out,$out,#1 add $inp,$inp,$len add $out,$out,$len add $ctr,sp,$len neg $len,$len .Loop_tail_neon: ldrb w10,[$inp,$len] ldrb w11,[$ctr,$len] add $len,$len,#1 eor w10,w10,w11 strb w10,[$out,$len] cbnz $len,.Loop_tail_neon stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] .Ldone_neon: ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size ChaCha20_neon,.-ChaCha20_neon ___ { my ($T0,$T1,$T2,$T3,$T4,$T5)=@K; my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2, $A3,$B3,$C3,$D3,$A4,$B4,$C4,$D4,$A5,$B5,$C5,$D5) = map("v$_.4s",(0..23)); $code.=<<___; .type ChaCha20_512_neon,%function .align 5 ChaCha20_512_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp @x[0],:pg_hi21:.Lsigma add @x[0],@x[0],:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] .L512_or_more_neon: sub sp,sp,#128+64 ldp @d[0],@d[1],[@x[0]] // load sigma ld1 {@K[0]},[@x[0]],#16 ldp @d[2],@d[3],[$key] // load key ldp @d[4],@d[5],[$key,#16] ld1 {@K[1],@K[2]},[$key] ldp @d[6],@d[7],[$ctr] // load counter ld1 {@K[3]},[$ctr] ld1 {$ONE},[@x[0]] #ifdef __ARMEB__ rev64 @K[0],@K[0] ror @d[2],@d[2],#32 ror @d[3],@d[3],#32 ror @d[4],@d[4],#32 ror @d[5],@d[5],#32 ror @d[6],@d[6],#32 ror @d[7],@d[7],#32 #endif add @K[3],@K[3],$ONE // += 1 stp @K[0],@K[1],[sp,#0] // off-load key block, invariant part add @K[3],@K[3],$ONE // not typo str @K[2],[sp,#32] add @K[4],@K[3],$ONE add @K[5],@K[4],$ONE add @K[6],@K[5],$ONE shl $ONE,$ONE,#2 // 1 -> 4 stp d8,d9,[sp,#128+0] // meet ABI requirements stp d10,d11,[sp,#128+16] stp d12,d13,[sp,#128+32] stp d14,d15,[sp,#128+48] sub $len,$len,#512 // not typo .Loop_outer_512_neon: mov $A0,@K[0] mov $A1,@K[0] mov $A2,@K[0] mov $A3,@K[0] mov $A4,@K[0] mov $A5,@K[0] mov $B0,@K[1] mov.32 @x[0],@d[0] // unpack key block mov $B1,@K[1] lsr @x[1],@d[0],#32 mov $B2,@K[1] mov.32 @x[2],@d[1] mov $B3,@K[1] lsr @x[3],@d[1],#32 mov $B4,@K[1] mov.32 @x[4],@d[2] mov $B5,@K[1] lsr @x[5],@d[2],#32 mov $D0,@K[3] mov.32 @x[6],@d[3] mov $D1,@K[4] lsr @x[7],@d[3],#32 mov $D2,@K[5] mov.32 @x[8],@d[4] mov $D3,@K[6] lsr @x[9],@d[4],#32 mov $C0,@K[2] mov.32 @x[10],@d[5] mov $C1,@K[2] lsr @x[11],@d[5],#32 add $D4,$D0,$ONE // +4 mov.32 @x[12],@d[6] add $D5,$D1,$ONE // +4 lsr @x[13],@d[6],#32 mov $C2,@K[2] mov.32 @x[14],@d[7] mov $C3,@K[2] lsr @x[15],@d[7],#32 mov $C4,@K[2] stp @K[3],@K[4],[sp,#48] // off-load key block, variable part mov $C5,@K[2] str @K[5],[sp,#80] mov $ctr,#5 subs $len,$len,#512 .Loop_upper_neon: sub $ctr,$ctr,#1 ___ my @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); my @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); my @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); my @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,0); my @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,0); my @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,0); my @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); my $diff = ($#thread0+1)*6 - $#thread67 - 1; my $i = 0; foreach (@thread0) { eval; eval(shift(@thread67)); eval(shift(@thread1)); eval(shift(@thread67)); eval(shift(@thread2)); eval(shift(@thread67)); eval(shift(@thread3)); eval(shift(@thread67)); eval(shift(@thread4)); eval(shift(@thread67)); eval(shift(@thread5)); eval(shift(@thread67)); } @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,1); @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,1); @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,1); @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); foreach (@thread0) { eval; eval(shift(@thread67)); eval(shift(@thread1)); eval(shift(@thread67)); eval(shift(@thread2)); eval(shift(@thread67)); eval(shift(@thread3)); eval(shift(@thread67)); eval(shift(@thread4)); eval(shift(@thread67)); eval(shift(@thread5)); eval(shift(@thread67)); } $code.=<<___; cbnz $ctr,.Loop_upper_neon add.32 @x[0],@x[0],@d[0] // accumulate key block add @x[1],@x[1],@d[0],lsr#32 add.32 @x[2],@x[2],@d[1] add @x[3],@x[3],@d[1],lsr#32 add.32 @x[4],@x[4],@d[2] add @x[5],@x[5],@d[2],lsr#32 add.32 @x[6],@x[6],@d[3] add @x[7],@x[7],@d[3],lsr#32 add.32 @x[8],@x[8],@d[4] add @x[9],@x[9],@d[4],lsr#32 add.32 @x[10],@x[10],@d[5] add @x[11],@x[11],@d[5],lsr#32 add.32 @x[12],@x[12],@d[6] add @x[13],@x[13],@d[6],lsr#32 add.32 @x[14],@x[14],@d[7] add @x[15],@x[15],@d[7],lsr#32 add @x[0],@x[0],@x[1],lsl#32 // pack add @x[2],@x[2],@x[3],lsl#32 ldp @x[1],@x[3],[$inp,#0] // load input add @x[4],@x[4],@x[5],lsl#32 add @x[6],@x[6],@x[7],lsl#32 ldp @x[5],@x[7],[$inp,#16] add @x[8],@x[8],@x[9],lsl#32 add @x[10],@x[10],@x[11],lsl#32 ldp @x[9],@x[11],[$inp,#32] add @x[12],@x[12],@x[13],lsl#32 add @x[14],@x[14],@x[15],lsl#32 ldp @x[13],@x[15],[$inp,#48] add $inp,$inp,#64 #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif eor @x[0],@x[0],@x[1] eor @x[2],@x[2],@x[3] eor @x[4],@x[4],@x[5] eor @x[6],@x[6],@x[7] eor @x[8],@x[8],@x[9] eor @x[10],@x[10],@x[11] eor @x[12],@x[12],@x[13] eor @x[14],@x[14],@x[15] stp @x[0],@x[2],[$out,#0] // store output add @d[6],@d[6],#1 // increment counter mov.32 @x[0],@d[0] // unpack key block lsr @x[1],@d[0],#32 stp @x[4],@x[6],[$out,#16] mov.32 @x[2],@d[1] lsr @x[3],@d[1],#32 stp @x[8],@x[10],[$out,#32] mov.32 @x[4],@d[2] lsr @x[5],@d[2],#32 stp @x[12],@x[14],[$out,#48] add $out,$out,#64 mov.32 @x[6],@d[3] lsr @x[7],@d[3],#32 mov.32 @x[8],@d[4] lsr @x[9],@d[4],#32 mov.32 @x[10],@d[5] lsr @x[11],@d[5],#32 mov.32 @x[12],@d[6] lsr @x[13],@d[6],#32 mov.32 @x[14],@d[7] lsr @x[15],@d[7],#32 mov $ctr,#5 .Loop_lower_neon: sub $ctr,$ctr,#1 ___ @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,0); @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,0); @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,0); @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); foreach (@thread0) { eval; eval(shift(@thread67)); eval(shift(@thread1)); eval(shift(@thread67)); eval(shift(@thread2)); eval(shift(@thread67)); eval(shift(@thread3)); eval(shift(@thread67)); eval(shift(@thread4)); eval(shift(@thread67)); eval(shift(@thread5)); eval(shift(@thread67)); } @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,1); @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,1); @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,1); @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); foreach (@thread0) { eval; eval(shift(@thread67)); eval(shift(@thread1)); eval(shift(@thread67)); eval(shift(@thread2)); eval(shift(@thread67)); eval(shift(@thread3)); eval(shift(@thread67)); eval(shift(@thread4)); eval(shift(@thread67)); eval(shift(@thread5)); eval(shift(@thread67)); } $code.=<<___; cbnz $ctr,.Loop_lower_neon add.32 @x[0],@x[0],@d[0] // accumulate key block ldp @K[0],@K[1],[sp,#0] add @x[1],@x[1],@d[0],lsr#32 ldp @K[2],@K[3],[sp,#32] add.32 @x[2],@x[2],@d[1] ldp @K[4],@K[5],[sp,#64] add @x[3],@x[3],@d[1],lsr#32 add $A0,$A0,@K[0] add.32 @x[4],@x[4],@d[2] add $A1,$A1,@K[0] add @x[5],@x[5],@d[2],lsr#32 add $A2,$A2,@K[0] add.32 @x[6],@x[6],@d[3] add $A3,$A3,@K[0] add @x[7],@x[7],@d[3],lsr#32 add $A4,$A4,@K[0] add.32 @x[8],@x[8],@d[4] add $A5,$A5,@K[0] add @x[9],@x[9],@d[4],lsr#32 add $C0,$C0,@K[2] add.32 @x[10],@x[10],@d[5] add $C1,$C1,@K[2] add @x[11],@x[11],@d[5],lsr#32 add $C2,$C2,@K[2] add.32 @x[12],@x[12],@d[6] add $C3,$C3,@K[2] add @x[13],@x[13],@d[6],lsr#32 add $C4,$C4,@K[2] add.32 @x[14],@x[14],@d[7] add $C5,$C5,@K[2] add @x[15],@x[15],@d[7],lsr#32 add $D4,$D4,$ONE // +4 add @x[0],@x[0],@x[1],lsl#32 // pack add $D5,$D5,$ONE // +4 add @x[2],@x[2],@x[3],lsl#32 add $D0,$D0,@K[3] ldp @x[1],@x[3],[$inp,#0] // load input add $D1,$D1,@K[4] add @x[4],@x[4],@x[5],lsl#32 add $D2,$D2,@K[5] add @x[6],@x[6],@x[7],lsl#32 add $D3,$D3,@K[6] ldp @x[5],@x[7],[$inp,#16] add $D4,$D4,@K[3] add @x[8],@x[8],@x[9],lsl#32 add $D5,$D5,@K[4] add @x[10],@x[10],@x[11],lsl#32 add $B0,$B0,@K[1] ldp @x[9],@x[11],[$inp,#32] add $B1,$B1,@K[1] add @x[12],@x[12],@x[13],lsl#32 add $B2,$B2,@K[1] add @x[14],@x[14],@x[15],lsl#32 add $B3,$B3,@K[1] ldp @x[13],@x[15],[$inp,#48] add $B4,$B4,@K[1] add $inp,$inp,#64 add $B5,$B5,@K[1] #ifdef __ARMEB__ rev @x[0],@x[0] rev @x[2],@x[2] rev @x[4],@x[4] rev @x[6],@x[6] rev @x[8],@x[8] rev @x[10],@x[10] rev @x[12],@x[12] rev @x[14],@x[14] #endif ld1.8 {$T0-$T3},[$inp],#64 eor @x[0],@x[0],@x[1] eor @x[2],@x[2],@x[3] eor @x[4],@x[4],@x[5] eor @x[6],@x[6],@x[7] eor @x[8],@x[8],@x[9] eor $A0,$A0,$T0 eor @x[10],@x[10],@x[11] eor $B0,$B0,$T1 eor @x[12],@x[12],@x[13] eor $C0,$C0,$T2 eor @x[14],@x[14],@x[15] eor $D0,$D0,$T3 ld1.8 {$T0-$T3},[$inp],#64 stp @x[0],@x[2],[$out,#0] // store output add @d[6],@d[6],#7 // increment counter stp @x[4],@x[6],[$out,#16] stp @x[8],@x[10],[$out,#32] stp @x[12],@x[14],[$out,#48] add $out,$out,#64 st1.8 {$A0-$D0},[$out],#64 ld1.8 {$A0-$D0},[$inp],#64 eor $A1,$A1,$T0 eor $B1,$B1,$T1 eor $C1,$C1,$T2 eor $D1,$D1,$T3 st1.8 {$A1-$D1},[$out],#64 ld1.8 {$A1-$D1},[$inp],#64 eor $A2,$A2,$A0 ldp @K[0],@K[1],[sp,#0] eor $B2,$B2,$B0 ldp @K[2],@K[3],[sp,#32] eor $C2,$C2,$C0 eor $D2,$D2,$D0 st1.8 {$A2-$D2},[$out],#64 ld1.8 {$A2-$D2},[$inp],#64 eor $A3,$A3,$A1 eor $B3,$B3,$B1 eor $C3,$C3,$C1 eor $D3,$D3,$D1 st1.8 {$A3-$D3},[$out],#64 ld1.8 {$A3-$D3},[$inp],#64 eor $A4,$A4,$A2 eor $B4,$B4,$B2 eor $C4,$C4,$C2 eor $D4,$D4,$D2 st1.8 {$A4-$D4},[$out],#64 shl $A0,$ONE,#1 // 4 -> 8 eor $A5,$A5,$A3 eor $B5,$B5,$B3 eor $C5,$C5,$C3 eor $D5,$D5,$D3 st1.8 {$A5-$D5},[$out],#64 add @K[3],@K[3],$A0 // += 8 add @K[4],@K[4],$A0 add @K[5],@K[5],$A0 add @K[6],@K[6],$A0 b.hs .Loop_outer_512_neon adds $len,$len,#512 ushr $A0,$ONE,#2 // 4 -> 1 ldp d8,d9,[sp,#128+0] // meet ABI requirements ldp d10,d11,[sp,#128+16] ldp d12,d13,[sp,#128+32] ldp d14,d15,[sp,#128+48] stp @K[0],$ONE,[sp,#0] // wipe off-load area stp @K[0],$ONE,[sp,#32] stp @K[0],$ONE,[sp,#64] b.eq .Ldone_512_neon cmp $len,#192 sub @K[3],@K[3],$A0 // -= 1 sub @K[4],@K[4],$A0 sub @K[5],@K[5],$A0 add sp,sp,#128 b.hs .Loop_outer_neon eor @K[1],@K[1],@K[1] eor @K[2],@K[2],@K[2] eor @K[3],@K[3],@K[3] eor @K[4],@K[4],@K[4] eor @K[5],@K[5],@K[5] eor @K[6],@K[6],@K[6] b .Loop_outer .Ldone_512_neon: ldp x19,x20,[x29,#16] add sp,sp,#128+64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size ChaCha20_512_neon,.-ChaCha20_512_neon ___ } }}} foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; (s/\b([a-z]+)\.32\b/$1/ and (s/x([0-9]+)/w$1/g or 1)) or (m/\b(eor|ext|mov)\b/ and (s/\.4s/\.16b/g or 1)) or (s/\b((?:ld|st)1)\.8\b/$1/ and (s/\.4s/\.16b/g or 1)) or (m/\b(ld|st)[rp]\b/ and (s/v([0-9]+)\.4s/q$1/g or 1)) or (s/\brev32\.16\b/rev32/ and (s/\.4s/\.8h/g or 1)); #s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; # flush ring-0.16.9/crypto/chacha/asm/chacha-x86.pl000064400000000000000000000530471352416253600164520ustar0000000000000000#! /usr/bin/env perl # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # January 2015 # # ChaCha20 for x86. # # Performance in cycles per byte out of large buffer. # # 1xIALU/gcc 4xSSSE3 # Pentium 17.5/+80% # PIII 14.2/+60% # P4 18.6/+84% # Core2 9.56/+89% 4.83 # Westmere 9.50/+45% 3.35 # Sandy Bridge 10.5/+47% 3.20 # Haswell 8.15/+50% 2.83 # Skylake 7.53/+22% 2.75 # Silvermont 17.4/+36% 8.35 # Goldmont 13.4/+40% 4.36 # Sledgehammer 10.2/+54% # Bulldozer 13.4/+50% 4.38(*) # # (*) Bulldozer actually executes 4xXOP code path that delivers 3.55; # # Modified from upstream OpenSSL to remove the XOP code. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../perlasm"); require "x86asm.pl"; $output=pop; open STDOUT,">$output"; &asm_init($ARGV[0],$ARGV[$#ARGV] eq "386"); $xmm=$ymm=1; $gasver=999; # enable everything $a="eax"; ($b,$b_)=("ebx","ebp"); ($c,$c_)=("ecx","esi"); ($d,$d_)=("edx","edi"); sub QUARTERROUND { my ($ai,$bi,$ci,$di,$i)=@_; my ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+1)&3),($ai,$bi,$ci,$di)); # next my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 if ($i==0) { my $j=4; ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-$j--)&3),($ap,$bp,$cp,$dp)); } elsif ($i==3) { my $j=0; ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+$j++)&3),($an,$bn,$cn,$dn)); } elsif ($i==4) { my $j=4; ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_+$j--)&3),($ap,$bp,$cp,$dp)); } elsif ($i==7) { my $j=0; ($an,$bn,$cn,$dn)=map(($_&~3)+(($_-$j++)&3),($an,$bn,$cn,$dn)); } #&add ($a,$b); # see elsewhere &xor ($d,$a); &mov (&DWP(4*$cp,"esp"),$c_) if ($ai>0 && $ai<3); &rol ($d,16); &mov (&DWP(4*$bp,"esp"),$b_) if ($i!=0); &add ($c,$d); &mov ($c_,&DWP(4*$cn,"esp")) if ($ai>0 && $ai<3); &xor ($b,$c); &mov ($d_,&DWP(4*$dn,"esp")) if ($di!=$dn); &rol ($b,12); &mov ($b_,&DWP(4*$bn,"esp")) if ($i<7); &mov ($b_,&DWP(128,"esp")) if ($i==7); # loop counter &add ($a,$b); &xor ($d,$a); &mov (&DWP(4*$ai,"esp"),$a); &rol ($d,8); &mov ($a,&DWP(4*$an,"esp")); &add ($c,$d); &mov (&DWP(4*$di,"esp"),$d) if ($di!=$dn); &mov ($d_,$d) if ($di==$dn); &xor ($b,$c); &add ($a,$b_) if ($i<7); # elsewhere &rol ($b,7); ($b,$b_)=($b_,$b); ($c,$c_)=($c_,$c); ($d,$d_)=($d_,$d); } &static_label("ssse3_shortcut"); &static_label("ssse3_data"); &static_label("pic_point"); &function_begin("GFp_ChaCha20_ctr32"); &xor ("eax","eax"); &cmp ("eax",&wparam(2)); # len==0? &je (&label("no_data")); if ($xmm) { &call (&label("pic_point")); &set_label("pic_point"); &blindpop("eax"); &picmeup("ebp","GFp_ia32cap_P","eax",&label("pic_point")); &test (&DWP(0,"ebp"),1<<24); # test FXSR bit &jz (&label("x86")); &test (&DWP(4,"ebp"),1<<9); # test SSSE3 bit &jz (&label("x86")); &jmp (&label("ssse3_shortcut")); &set_label("x86"); } &mov ("esi",&wparam(3)); # key &mov ("edi",&wparam(4)); # counter and nonce &stack_push(33); &mov ("eax",&DWP(4*0,"esi")); # copy key &mov ("ebx",&DWP(4*1,"esi")); &mov ("ecx",&DWP(4*2,"esi")); &mov ("edx",&DWP(4*3,"esi")); &mov (&DWP(64+4*4,"esp"),"eax"); &mov (&DWP(64+4*5,"esp"),"ebx"); &mov (&DWP(64+4*6,"esp"),"ecx"); &mov (&DWP(64+4*7,"esp"),"edx"); &mov ("eax",&DWP(4*4,"esi")); &mov ("ebx",&DWP(4*5,"esi")); &mov ("ecx",&DWP(4*6,"esi")); &mov ("edx",&DWP(4*7,"esi")); &mov (&DWP(64+4*8,"esp"),"eax"); &mov (&DWP(64+4*9,"esp"),"ebx"); &mov (&DWP(64+4*10,"esp"),"ecx"); &mov (&DWP(64+4*11,"esp"),"edx"); &mov ("eax",&DWP(4*0,"edi")); # copy counter and nonce &mov ("ebx",&DWP(4*1,"edi")); &mov ("ecx",&DWP(4*2,"edi")); &mov ("edx",&DWP(4*3,"edi")); &sub ("eax",1); &mov (&DWP(64+4*12,"esp"),"eax"); &mov (&DWP(64+4*13,"esp"),"ebx"); &mov (&DWP(64+4*14,"esp"),"ecx"); &mov (&DWP(64+4*15,"esp"),"edx"); &jmp (&label("entry")); &set_label("outer_loop",16); &mov (&wparam(1),$b); # save input &mov (&wparam(0),$a); # save output &mov (&wparam(2),$c); # save len &set_label("entry"); &mov ($a,0x61707865); &mov (&DWP(4*1,"esp"),0x3320646e); &mov (&DWP(4*2,"esp"),0x79622d32); &mov (&DWP(4*3,"esp"),0x6b206574); &mov ($b, &DWP(64+4*5,"esp")); # copy key material &mov ($b_,&DWP(64+4*6,"esp")); &mov ($c, &DWP(64+4*10,"esp")); &mov ($c_,&DWP(64+4*11,"esp")); &mov ($d, &DWP(64+4*13,"esp")); &mov ($d_,&DWP(64+4*14,"esp")); &mov (&DWP(4*5,"esp"),$b); &mov (&DWP(4*6,"esp"),$b_); &mov (&DWP(4*10,"esp"),$c); &mov (&DWP(4*11,"esp"),$c_); &mov (&DWP(4*13,"esp"),$d); &mov (&DWP(4*14,"esp"),$d_); &mov ($b, &DWP(64+4*7,"esp")); &mov ($d_,&DWP(64+4*15,"esp")); &mov ($d, &DWP(64+4*12,"esp")); &mov ($b_,&DWP(64+4*4,"esp")); &mov ($c, &DWP(64+4*8,"esp")); &mov ($c_,&DWP(64+4*9,"esp")); &add ($d,1); # counter value &mov (&DWP(4*7,"esp"),$b); &mov (&DWP(4*15,"esp"),$d_); &mov (&DWP(64+4*12,"esp"),$d); # save counter value &mov ($b,10); # loop counter &jmp (&label("loop")); &set_label("loop",16); &add ($a,$b_); # elsewhere &mov (&DWP(128,"esp"),$b); # save loop counter &mov ($b,$b_); &QUARTERROUND(0, 4, 8, 12, 0); &QUARTERROUND(1, 5, 9, 13, 1); &QUARTERROUND(2, 6,10, 14, 2); &QUARTERROUND(3, 7,11, 15, 3); &QUARTERROUND(0, 5,10, 15, 4); &QUARTERROUND(1, 6,11, 12, 5); &QUARTERROUND(2, 7, 8, 13, 6); &QUARTERROUND(3, 4, 9, 14, 7); &dec ($b); &jnz (&label("loop")); &mov ($b,&wparam(2)); # load len &add ($a,0x61707865); # accumulate key material &add ($b_,&DWP(64+4*4,"esp")); &add ($c, &DWP(64+4*8,"esp")); &add ($c_,&DWP(64+4*9,"esp")); &cmp ($b,64); &jb (&label("tail")); &mov ($b,&wparam(1)); # load input pointer &add ($d, &DWP(64+4*12,"esp")); &add ($d_,&DWP(64+4*14,"esp")); &xor ($a, &DWP(4*0,$b)); # xor with input &xor ($b_,&DWP(4*4,$b)); &mov (&DWP(4*0,"esp"),$a); &mov ($a,&wparam(0)); # load output pointer &xor ($c, &DWP(4*8,$b)); &xor ($c_,&DWP(4*9,$b)); &xor ($d, &DWP(4*12,$b)); &xor ($d_,&DWP(4*14,$b)); &mov (&DWP(4*4,$a),$b_); # write output &mov (&DWP(4*8,$a),$c); &mov (&DWP(4*9,$a),$c_); &mov (&DWP(4*12,$a),$d); &mov (&DWP(4*14,$a),$d_); &mov ($b_,&DWP(4*1,"esp")); &mov ($c, &DWP(4*2,"esp")); &mov ($c_,&DWP(4*3,"esp")); &mov ($d, &DWP(4*5,"esp")); &mov ($d_,&DWP(4*6,"esp")); &add ($b_,0x3320646e); # accumulate key material &add ($c, 0x79622d32); &add ($c_,0x6b206574); &add ($d, &DWP(64+4*5,"esp")); &add ($d_,&DWP(64+4*6,"esp")); &xor ($b_,&DWP(4*1,$b)); &xor ($c, &DWP(4*2,$b)); &xor ($c_,&DWP(4*3,$b)); &xor ($d, &DWP(4*5,$b)); &xor ($d_,&DWP(4*6,$b)); &mov (&DWP(4*1,$a),$b_); &mov (&DWP(4*2,$a),$c); &mov (&DWP(4*3,$a),$c_); &mov (&DWP(4*5,$a),$d); &mov (&DWP(4*6,$a),$d_); &mov ($b_,&DWP(4*7,"esp")); &mov ($c, &DWP(4*10,"esp")); &mov ($c_,&DWP(4*11,"esp")); &mov ($d, &DWP(4*13,"esp")); &mov ($d_,&DWP(4*15,"esp")); &add ($b_,&DWP(64+4*7,"esp")); &add ($c, &DWP(64+4*10,"esp")); &add ($c_,&DWP(64+4*11,"esp")); &add ($d, &DWP(64+4*13,"esp")); &add ($d_,&DWP(64+4*15,"esp")); &xor ($b_,&DWP(4*7,$b)); &xor ($c, &DWP(4*10,$b)); &xor ($c_,&DWP(4*11,$b)); &xor ($d, &DWP(4*13,$b)); &xor ($d_,&DWP(4*15,$b)); &lea ($b,&DWP(4*16,$b)); &mov (&DWP(4*7,$a),$b_); &mov ($b_,&DWP(4*0,"esp")); &mov (&DWP(4*10,$a),$c); &mov ($c,&wparam(2)); # len &mov (&DWP(4*11,$a),$c_); &mov (&DWP(4*13,$a),$d); &mov (&DWP(4*15,$a),$d_); &mov (&DWP(4*0,$a),$b_); &lea ($a,&DWP(4*16,$a)); &sub ($c,64); &jnz (&label("outer_loop")); &jmp (&label("done")); &set_label("tail"); &add ($d, &DWP(64+4*12,"esp")); &add ($d_,&DWP(64+4*14,"esp")); &mov (&DWP(4*0,"esp"),$a); &mov (&DWP(4*4,"esp"),$b_); &mov (&DWP(4*8,"esp"),$c); &mov (&DWP(4*9,"esp"),$c_); &mov (&DWP(4*12,"esp"),$d); &mov (&DWP(4*14,"esp"),$d_); &mov ($b_,&DWP(4*1,"esp")); &mov ($c, &DWP(4*2,"esp")); &mov ($c_,&DWP(4*3,"esp")); &mov ($d, &DWP(4*5,"esp")); &mov ($d_,&DWP(4*6,"esp")); &add ($b_,0x3320646e); # accumulate key material &add ($c, 0x79622d32); &add ($c_,0x6b206574); &add ($d, &DWP(64+4*5,"esp")); &add ($d_,&DWP(64+4*6,"esp")); &mov (&DWP(4*1,"esp"),$b_); &mov (&DWP(4*2,"esp"),$c); &mov (&DWP(4*3,"esp"),$c_); &mov (&DWP(4*5,"esp"),$d); &mov (&DWP(4*6,"esp"),$d_); &mov ($b_,&DWP(4*7,"esp")); &mov ($c, &DWP(4*10,"esp")); &mov ($c_,&DWP(4*11,"esp")); &mov ($d, &DWP(4*13,"esp")); &mov ($d_,&DWP(4*15,"esp")); &add ($b_,&DWP(64+4*7,"esp")); &add ($c, &DWP(64+4*10,"esp")); &add ($c_,&DWP(64+4*11,"esp")); &add ($d, &DWP(64+4*13,"esp")); &add ($d_,&DWP(64+4*15,"esp")); &mov (&DWP(4*7,"esp"),$b_); &mov ($b_,&wparam(1)); # load input &mov (&DWP(4*10,"esp"),$c); &mov ($c,&wparam(0)); # load output &mov (&DWP(4*11,"esp"),$c_); &xor ($c_,$c_); &mov (&DWP(4*13,"esp"),$d); &mov (&DWP(4*15,"esp"),$d_); &xor ("eax","eax"); &xor ("edx","edx"); &set_label("tail_loop"); &movb ("al",&BP(0,$c_,$b_)); &movb ("dl",&BP(0,"esp",$c_)); &lea ($c_,&DWP(1,$c_)); &xor ("al","dl"); &mov (&BP(-1,$c,$c_),"al"); &dec ($b); &jnz (&label("tail_loop")); &set_label("done"); &stack_pop(33); &set_label("no_data"); &function_end("GFp_ChaCha20_ctr32"); if ($xmm) { my ($xa,$xa_,$xb,$xb_,$xc,$xc_,$xd,$xd_)=map("xmm$_",(0..7)); my ($out,$inp,$len)=("edi","esi","ecx"); sub QUARTERROUND_SSSE3 { my ($ai,$bi,$ci,$di,$i)=@_; my ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+1)&3),($ai,$bi,$ci,$di)); # next my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 if ($i==0) { my $j=4; ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-$j--)&3),($ap,$bp,$cp,$dp)); } elsif ($i==3) { my $j=0; ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+$j++)&3),($an,$bn,$cn,$dn)); } elsif ($i==4) { my $j=4; ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_+$j--)&3),($ap,$bp,$cp,$dp)); } elsif ($i==7) { my $j=0; ($an,$bn,$cn,$dn)=map(($_&~3)+(($_-$j++)&3),($an,$bn,$cn,$dn)); } #&paddd ($xa,$xb); # see elsewhere #&pxor ($xd,$xa); # see elsewhere &movdqa(&QWP(16*$cp-128,"ebx"),$xc_) if ($ai>0 && $ai<3); &pshufb ($xd,&QWP(0,"eax")); # rot16 &movdqa(&QWP(16*$bp-128,"ebx"),$xb_) if ($i!=0); &paddd ($xc,$xd); &movdqa($xc_,&QWP(16*$cn-128,"ebx")) if ($ai>0 && $ai<3); &pxor ($xb,$xc); &movdqa($xb_,&QWP(16*$bn-128,"ebx")) if ($i<7); &movdqa ($xa_,$xb); # borrow as temporary &pslld ($xb,12); &psrld ($xa_,20); &por ($xb,$xa_); &movdqa($xa_,&QWP(16*$an-128,"ebx")); &paddd ($xa,$xb); &movdqa($xd_,&QWP(16*$dn-128,"ebx")) if ($di!=$dn); &pxor ($xd,$xa); &movdqa (&QWP(16*$ai-128,"ebx"),$xa); &pshufb ($xd,&QWP(16,"eax")); # rot8 &paddd ($xc,$xd); &movdqa (&QWP(16*$di-128,"ebx"),$xd) if ($di!=$dn); &movdqa ($xd_,$xd) if ($di==$dn); &pxor ($xb,$xc); &paddd ($xa_,$xb_) if ($i<7); # elsewhere &movdqa ($xa,$xb); # borrow as temporary &pslld ($xb,7); &psrld ($xa,25); &pxor ($xd_,$xa_) if ($i<7); # elsewhere &por ($xb,$xa); ($xa,$xa_)=($xa_,$xa); ($xb,$xb_)=($xb_,$xb); ($xc,$xc_)=($xc_,$xc); ($xd,$xd_)=($xd_,$xd); } &function_begin("_ChaCha20_ssse3"); &set_label("ssse3_shortcut"); &mov ($out,&wparam(0)); &mov ($inp,&wparam(1)); &mov ($len,&wparam(2)); &mov ("edx",&wparam(3)); # key &mov ("ebx",&wparam(4)); # counter and nonce &mov ("ebp","esp"); &stack_push (131); &and ("esp",-64); &mov (&DWP(512,"esp"),"ebp"); &lea ("eax",&DWP(&label("ssse3_data")."-". &label("pic_point"),"eax")); &movdqu ("xmm3",&QWP(0,"ebx")); # counter and nonce if (defined($gasver) && $gasver>=2.17) { # even though we encode # pshufb manually, we # handle only register # operands, while this # segment uses memory # operand... &cmp ($len,64*4); &jb (&label("1x")); &mov (&DWP(512+4,"esp"),"edx"); # offload pointers &mov (&DWP(512+8,"esp"),"ebx"); &sub ($len,64*4); # bias len &lea ("ebp",&DWP(256+128,"esp")); # size optimization &movdqu ("xmm7",&QWP(0,"edx")); # key &pshufd ("xmm0","xmm3",0x00); &pshufd ("xmm1","xmm3",0x55); &pshufd ("xmm2","xmm3",0xaa); &pshufd ("xmm3","xmm3",0xff); &paddd ("xmm0",&QWP(16*3,"eax")); # fix counters &pshufd ("xmm4","xmm7",0x00); &pshufd ("xmm5","xmm7",0x55); &psubd ("xmm0",&QWP(16*4,"eax")); &pshufd ("xmm6","xmm7",0xaa); &pshufd ("xmm7","xmm7",0xff); &movdqa (&QWP(16*12-128,"ebp"),"xmm0"); &movdqa (&QWP(16*13-128,"ebp"),"xmm1"); &movdqa (&QWP(16*14-128,"ebp"),"xmm2"); &movdqa (&QWP(16*15-128,"ebp"),"xmm3"); &movdqu ("xmm3",&QWP(16,"edx")); # key &movdqa (&QWP(16*4-128,"ebp"),"xmm4"); &movdqa (&QWP(16*5-128,"ebp"),"xmm5"); &movdqa (&QWP(16*6-128,"ebp"),"xmm6"); &movdqa (&QWP(16*7-128,"ebp"),"xmm7"); &movdqa ("xmm7",&QWP(16*2,"eax")); # sigma &lea ("ebx",&DWP(128,"esp")); # size optimization &pshufd ("xmm0","xmm3",0x00); &pshufd ("xmm1","xmm3",0x55); &pshufd ("xmm2","xmm3",0xaa); &pshufd ("xmm3","xmm3",0xff); &pshufd ("xmm4","xmm7",0x00); &pshufd ("xmm5","xmm7",0x55); &pshufd ("xmm6","xmm7",0xaa); &pshufd ("xmm7","xmm7",0xff); &movdqa (&QWP(16*8-128,"ebp"),"xmm0"); &movdqa (&QWP(16*9-128,"ebp"),"xmm1"); &movdqa (&QWP(16*10-128,"ebp"),"xmm2"); &movdqa (&QWP(16*11-128,"ebp"),"xmm3"); &movdqa (&QWP(16*0-128,"ebp"),"xmm4"); &movdqa (&QWP(16*1-128,"ebp"),"xmm5"); &movdqa (&QWP(16*2-128,"ebp"),"xmm6"); &movdqa (&QWP(16*3-128,"ebp"),"xmm7"); &lea ($inp,&DWP(128,$inp)); # size optimization &lea ($out,&DWP(128,$out)); # size optimization &jmp (&label("outer_loop")); &set_label("outer_loop",16); #&movdqa ("xmm0",&QWP(16*0-128,"ebp")); # copy key material &movdqa ("xmm1",&QWP(16*1-128,"ebp")); &movdqa ("xmm2",&QWP(16*2-128,"ebp")); &movdqa ("xmm3",&QWP(16*3-128,"ebp")); #&movdqa ("xmm4",&QWP(16*4-128,"ebp")); &movdqa ("xmm5",&QWP(16*5-128,"ebp")); &movdqa ("xmm6",&QWP(16*6-128,"ebp")); &movdqa ("xmm7",&QWP(16*7-128,"ebp")); #&movdqa (&QWP(16*0-128,"ebx"),"xmm0"); &movdqa (&QWP(16*1-128,"ebx"),"xmm1"); &movdqa (&QWP(16*2-128,"ebx"),"xmm2"); &movdqa (&QWP(16*3-128,"ebx"),"xmm3"); #&movdqa (&QWP(16*4-128,"ebx"),"xmm4"); &movdqa (&QWP(16*5-128,"ebx"),"xmm5"); &movdqa (&QWP(16*6-128,"ebx"),"xmm6"); &movdqa (&QWP(16*7-128,"ebx"),"xmm7"); #&movdqa ("xmm0",&QWP(16*8-128,"ebp")); #&movdqa ("xmm1",&QWP(16*9-128,"ebp")); &movdqa ("xmm2",&QWP(16*10-128,"ebp")); &movdqa ("xmm3",&QWP(16*11-128,"ebp")); &movdqa ("xmm4",&QWP(16*12-128,"ebp")); &movdqa ("xmm5",&QWP(16*13-128,"ebp")); &movdqa ("xmm6",&QWP(16*14-128,"ebp")); &movdqa ("xmm7",&QWP(16*15-128,"ebp")); &paddd ("xmm4",&QWP(16*4,"eax")); # counter value #&movdqa (&QWP(16*8-128,"ebx"),"xmm0"); #&movdqa (&QWP(16*9-128,"ebx"),"xmm1"); &movdqa (&QWP(16*10-128,"ebx"),"xmm2"); &movdqa (&QWP(16*11-128,"ebx"),"xmm3"); &movdqa (&QWP(16*12-128,"ebx"),"xmm4"); &movdqa (&QWP(16*13-128,"ebx"),"xmm5"); &movdqa (&QWP(16*14-128,"ebx"),"xmm6"); &movdqa (&QWP(16*15-128,"ebx"),"xmm7"); &movdqa (&QWP(16*12-128,"ebp"),"xmm4"); # save counter value &movdqa ($xa, &QWP(16*0-128,"ebp")); &movdqa ($xd, "xmm4"); &movdqa ($xb_,&QWP(16*4-128,"ebp")); &movdqa ($xc, &QWP(16*8-128,"ebp")); &movdqa ($xc_,&QWP(16*9-128,"ebp")); &mov ("edx",10); # loop counter &nop (); &set_label("loop",16); &paddd ($xa,$xb_); # elsewhere &movdqa ($xb,$xb_); &pxor ($xd,$xa); # elsewhere &QUARTERROUND_SSSE3(0, 4, 8, 12, 0); &QUARTERROUND_SSSE3(1, 5, 9, 13, 1); &QUARTERROUND_SSSE3(2, 6,10, 14, 2); &QUARTERROUND_SSSE3(3, 7,11, 15, 3); &QUARTERROUND_SSSE3(0, 5,10, 15, 4); &QUARTERROUND_SSSE3(1, 6,11, 12, 5); &QUARTERROUND_SSSE3(2, 7, 8, 13, 6); &QUARTERROUND_SSSE3(3, 4, 9, 14, 7); &dec ("edx"); &jnz (&label("loop")); &movdqa (&QWP(16*4-128,"ebx"),$xb_); &movdqa (&QWP(16*8-128,"ebx"),$xc); &movdqa (&QWP(16*9-128,"ebx"),$xc_); &movdqa (&QWP(16*12-128,"ebx"),$xd); &movdqa (&QWP(16*14-128,"ebx"),$xd_); my ($xa0,$xa1,$xa2,$xa3,$xt0,$xt1,$xt2,$xt3)=map("xmm$_",(0..7)); #&movdqa ($xa0,&QWP(16*0-128,"ebx")); # it's there &movdqa ($xa1,&QWP(16*1-128,"ebx")); &movdqa ($xa2,&QWP(16*2-128,"ebx")); &movdqa ($xa3,&QWP(16*3-128,"ebx")); for($i=0;$i<256;$i+=64) { &paddd ($xa0,&QWP($i+16*0-128,"ebp")); # accumulate key material &paddd ($xa1,&QWP($i+16*1-128,"ebp")); &paddd ($xa2,&QWP($i+16*2-128,"ebp")); &paddd ($xa3,&QWP($i+16*3-128,"ebp")); &movdqa ($xt2,$xa0); # "de-interlace" data &punpckldq ($xa0,$xa1); &movdqa ($xt3,$xa2); &punpckldq ($xa2,$xa3); &punpckhdq ($xt2,$xa1); &punpckhdq ($xt3,$xa3); &movdqa ($xa1,$xa0); &punpcklqdq ($xa0,$xa2); # "a0" &movdqa ($xa3,$xt2); &punpcklqdq ($xt2,$xt3); # "a2" &punpckhqdq ($xa1,$xa2); # "a1" &punpckhqdq ($xa3,$xt3); # "a3" #($xa2,$xt2)=($xt2,$xa2); &movdqu ($xt0,&QWP(64*0-128,$inp)); # load input &movdqu ($xt1,&QWP(64*1-128,$inp)); &movdqu ($xa2,&QWP(64*2-128,$inp)); &movdqu ($xt3,&QWP(64*3-128,$inp)); &lea ($inp,&QWP($i<192?16:(64*4-16*3),$inp)); &pxor ($xt0,$xa0); &movdqa ($xa0,&QWP($i+16*4-128,"ebx")) if ($i<192); &pxor ($xt1,$xa1); &movdqa ($xa1,&QWP($i+16*5-128,"ebx")) if ($i<192); &pxor ($xt2,$xa2); &movdqa ($xa2,&QWP($i+16*6-128,"ebx")) if ($i<192); &pxor ($xt3,$xa3); &movdqa ($xa3,&QWP($i+16*7-128,"ebx")) if ($i<192); &movdqu (&QWP(64*0-128,$out),$xt0); # store output &movdqu (&QWP(64*1-128,$out),$xt1); &movdqu (&QWP(64*2-128,$out),$xt2); &movdqu (&QWP(64*3-128,$out),$xt3); &lea ($out,&QWP($i<192?16:(64*4-16*3),$out)); } &sub ($len,64*4); &jnc (&label("outer_loop")); &add ($len,64*4); &jz (&label("done")); &mov ("ebx",&DWP(512+8,"esp")); # restore pointers &lea ($inp,&DWP(-128,$inp)); &mov ("edx",&DWP(512+4,"esp")); &lea ($out,&DWP(-128,$out)); &movd ("xmm2",&DWP(16*12-128,"ebp")); # counter value &movdqu ("xmm3",&QWP(0,"ebx")); &paddd ("xmm2",&QWP(16*6,"eax")); # +four &pand ("xmm3",&QWP(16*7,"eax")); &por ("xmm3","xmm2"); # counter value } { my ($a,$b,$c,$d,$t,$t1,$rot16,$rot24)=map("xmm$_",(0..7)); sub SSSE3ROUND { # critical path is 20 "SIMD ticks" per round &paddd ($a,$b); &pxor ($d,$a); &pshufb ($d,$rot16); &paddd ($c,$d); &pxor ($b,$c); &movdqa ($t,$b); &psrld ($b,20); &pslld ($t,12); &por ($b,$t); &paddd ($a,$b); &pxor ($d,$a); &pshufb ($d,$rot24); &paddd ($c,$d); &pxor ($b,$c); &movdqa ($t,$b); &psrld ($b,25); &pslld ($t,7); &por ($b,$t); } &set_label("1x"); &movdqa ($a,&QWP(16*2,"eax")); # sigma &movdqu ($b,&QWP(0,"edx")); &movdqu ($c,&QWP(16,"edx")); #&movdqu ($d,&QWP(0,"ebx")); # already loaded &movdqa ($rot16,&QWP(0,"eax")); &movdqa ($rot24,&QWP(16,"eax")); &mov (&DWP(16*3,"esp"),"ebp"); &movdqa (&QWP(16*0,"esp"),$a); &movdqa (&QWP(16*1,"esp"),$b); &movdqa (&QWP(16*2,"esp"),$c); &movdqa (&QWP(16*3,"esp"),$d); &mov ("edx",10); &jmp (&label("loop1x")); &set_label("outer1x",16); &movdqa ($d,&QWP(16*5,"eax")); # one &movdqa ($a,&QWP(16*0,"esp")); &movdqa ($b,&QWP(16*1,"esp")); &movdqa ($c,&QWP(16*2,"esp")); &paddd ($d,&QWP(16*3,"esp")); &mov ("edx",10); &movdqa (&QWP(16*3,"esp"),$d); &jmp (&label("loop1x")); &set_label("loop1x",16); &SSSE3ROUND(); &pshufd ($c,$c,0b01001110); &pshufd ($b,$b,0b00111001); &pshufd ($d,$d,0b10010011); &nop (); &SSSE3ROUND(); &pshufd ($c,$c,0b01001110); &pshufd ($b,$b,0b10010011); &pshufd ($d,$d,0b00111001); &dec ("edx"); &jnz (&label("loop1x")); &paddd ($a,&QWP(16*0,"esp")); &paddd ($b,&QWP(16*1,"esp")); &paddd ($c,&QWP(16*2,"esp")); &paddd ($d,&QWP(16*3,"esp")); &cmp ($len,64); &jb (&label("tail")); &movdqu ($t,&QWP(16*0,$inp)); &movdqu ($t1,&QWP(16*1,$inp)); &pxor ($a,$t); # xor with input &movdqu ($t,&QWP(16*2,$inp)); &pxor ($b,$t1); &movdqu ($t1,&QWP(16*3,$inp)); &pxor ($c,$t); &pxor ($d,$t1); &lea ($inp,&DWP(16*4,$inp)); # inp+=64 &movdqu (&QWP(16*0,$out),$a); # write output &movdqu (&QWP(16*1,$out),$b); &movdqu (&QWP(16*2,$out),$c); &movdqu (&QWP(16*3,$out),$d); &lea ($out,&DWP(16*4,$out)); # inp+=64 &sub ($len,64); &jnz (&label("outer1x")); &jmp (&label("done")); &set_label("tail"); &movdqa (&QWP(16*0,"esp"),$a); &movdqa (&QWP(16*1,"esp"),$b); &movdqa (&QWP(16*2,"esp"),$c); &movdqa (&QWP(16*3,"esp"),$d); &xor ("eax","eax"); &xor ("edx","edx"); &xor ("ebp","ebp"); &set_label("tail_loop"); &movb ("al",&BP(0,"esp","ebp")); &movb ("dl",&BP(0,$inp,"ebp")); &lea ("ebp",&DWP(1,"ebp")); &xor ("al","dl"); &movb (&BP(-1,$out,"ebp"),"al"); &dec ($len); &jnz (&label("tail_loop")); } &set_label("done"); &mov ("esp",&DWP(512,"esp")); &function_end("_ChaCha20_ssse3"); &align (64); &set_label("ssse3_data"); &data_byte(0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd); &data_byte(0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe); &data_word(0x61707865,0x3320646e,0x79622d32,0x6b206574); &data_word(0,1,2,3); &data_word(4,4,4,4); &data_word(1,0,0,0); &data_word(4,0,0,0); &data_word(0,-1,-1,-1); &align (64); } &asciz ("ChaCha20 for x86, CRYPTOGAMS by "); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/chacha/asm/chacha-x86_64.pl000064400000000000000000002032501352416253600167540ustar0000000000000000#! /usr/bin/env perl # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # November 2014 # # ChaCha20 for x86_64. # # December 2016 # # Add AVX512F code path. # # Performance in cycles per byte out of large buffer. # # IALU/gcc 4.8(i) 1xSSSE3/SSE2 4xSSSE3 NxAVX(v) # # P4 9.48/+99% -/22.7(ii) - # Core2 7.83/+55% 7.90/8.08 4.35 # Westmere 7.19/+50% 5.60/6.70 3.00 # Sandy Bridge 8.31/+42% 5.45/6.76 2.72 # Ivy Bridge 6.71/+46% 5.40/6.49 2.41 # Haswell 5.92/+43% 5.20/6.45 2.42 1.23 # Skylake[-X] 5.87/+39% 4.70/- 2.31 1.19[0.57] # Silvermont 12.0/+33% 7.75/7.40 7.03(iii) # Knights L 11.7/- - 9.60(iii) 0.80 # Goldmont 10.6/+17% 5.10/- 3.28 # Sledgehammer 7.28/+52% -/14.2(ii) - # Bulldozer 9.66/+28% 9.85/11.1 3.06(iv) # Ryzen 5.96/+50% 5.19/- 2.40 2.09 # VIA Nano 10.5/+46% 6.72/8.60 6.05 # # (i) compared to older gcc 3.x one can observe >2x improvement on # most platforms; # (ii) as it can be seen, SSE2 performance is too low on legacy # processors; NxSSE2 results are naturally better, but not # impressively better than IALU ones, which is why you won't # find SSE2 code below; # (iii) this is not optimal result for Atom because of MSROM # limitations, SSE2 can do better, but gain is considered too # low to justify the [maintenance] effort; # (iv) Bulldozer actually executes 4xXOP code path that delivers 2.20; # # Modified from upstream OpenSSL to remove the XOP code. $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; $avx = 2; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; # input parameter block ($out,$inp,$len,$key,$counter)=("%rdi","%rsi","%rdx","%rcx","%r8"); $code.=<<___; .text .extern GFp_ia32cap_P .align 64 .Lzero: .long 0,0,0,0 .Lone: .long 1,0,0,0 .Linc: .long 0,1,2,3 .Lfour: .long 4,4,4,4 .Lincy: .long 0,2,4,6,1,3,5,7 .Leight: .long 8,8,8,8,8,8,8,8 .Lrot16: .byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd .Lrot24: .byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe .Lsigma: .asciz "expand 32-byte k" .align 64 .Lzeroz: .long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 .Lfourz: .long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 .Lincz: .long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .Lsixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .asciz "ChaCha20 for x86_64, CRYPTOGAMS by " ___ sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm { my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; my $arg = pop; $arg = "\$$arg" if ($arg*1 eq $arg); $code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n"; } @x=("%eax","%ebx","%ecx","%edx",map("%r${_}d",(8..11)), "%nox","%nox","%nox","%nox",map("%r${_}d",(12..15))); @t=("%esi","%edi"); sub ROUND { # critical path is 24 cycles per round my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); my ($xc,$xc_)=map("\"$_\"",@t); my @x=map("\"$_\"",@x); # Consider order in which variables are addressed by their # index: # # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 # # 'a', 'b' and 'd's are permanently allocated in registers, # @x[0..7,12..15], while 'c's are maintained in memory. If # you observe 'c' column, you'll notice that pair of 'c's is # invariant between rounds. This means that we have to reload # them once per round, in the middle. This is why you'll see # bunch of 'c' stores and loads in the middle, but none in # the beginning or end. # Normally instructions would be interleaved to favour in-order # execution. Generally out-of-order cores manage it gracefully, # but not this time for some reason. As in-order execution # cores are dying breed, old Atom is the only one around, # instructions are left uninterleaved. Besides, Atom is better # off executing 1xSSSE3 code anyway... ( "&add (@x[$a0],@x[$b0])", # Q1 "&xor (@x[$d0],@x[$a0])", "&rol (@x[$d0],16)", "&add (@x[$a1],@x[$b1])", # Q2 "&xor (@x[$d1],@x[$a1])", "&rol (@x[$d1],16)", "&add ($xc,@x[$d0])", "&xor (@x[$b0],$xc)", "&rol (@x[$b0],12)", "&add ($xc_,@x[$d1])", "&xor (@x[$b1],$xc_)", "&rol (@x[$b1],12)", "&add (@x[$a0],@x[$b0])", "&xor (@x[$d0],@x[$a0])", "&rol (@x[$d0],8)", "&add (@x[$a1],@x[$b1])", "&xor (@x[$d1],@x[$a1])", "&rol (@x[$d1],8)", "&add ($xc,@x[$d0])", "&xor (@x[$b0],$xc)", "&rol (@x[$b0],7)", "&add ($xc_,@x[$d1])", "&xor (@x[$b1],$xc_)", "&rol (@x[$b1],7)", "&mov (\"4*$c0(%rsp)\",$xc)", # reload pair of 'c's "&mov (\"4*$c1(%rsp)\",$xc_)", "&mov ($xc,\"4*$c2(%rsp)\")", "&mov ($xc_,\"4*$c3(%rsp)\")", "&add (@x[$a2],@x[$b2])", # Q3 "&xor (@x[$d2],@x[$a2])", "&rol (@x[$d2],16)", "&add (@x[$a3],@x[$b3])", # Q4 "&xor (@x[$d3],@x[$a3])", "&rol (@x[$d3],16)", "&add ($xc,@x[$d2])", "&xor (@x[$b2],$xc)", "&rol (@x[$b2],12)", "&add ($xc_,@x[$d3])", "&xor (@x[$b3],$xc_)", "&rol (@x[$b3],12)", "&add (@x[$a2],@x[$b2])", "&xor (@x[$d2],@x[$a2])", "&rol (@x[$d2],8)", "&add (@x[$a3],@x[$b3])", "&xor (@x[$d3],@x[$a3])", "&rol (@x[$d3],8)", "&add ($xc,@x[$d2])", "&xor (@x[$b2],$xc)", "&rol (@x[$b2],7)", "&add ($xc_,@x[$d3])", "&xor (@x[$b3],$xc_)", "&rol (@x[$b3],7)" ); } ######################################################################## # Generic code path that handles all lengths on pre-SSSE3 processors. $code.=<<___; .globl GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,\@function,5 .align 64 GFp_ChaCha20_ctr32: .cfi_startproc cmp \$0,$len je .Lno_data mov GFp_ia32cap_P+4(%rip),%r10 ___ $code.=<<___ if ($avx>2); bt \$48,%r10 # check for AVX512F jc .LChaCha20_avx512 ___ $code.=<<___; test \$`1<<(41-32)`,%r10d jnz .LChaCha20_ssse3 push %rbx .cfi_push rbx push %rbp .cfi_push rbp push %r12 .cfi_push r12 push %r13 .cfi_push r13 push %r14 .cfi_push r14 push %r15 .cfi_push r15 sub \$64+24,%rsp .cfi_adjust_cfa_offset `64+24` .Lctr32_body: #movdqa .Lsigma(%rip),%xmm0 movdqu ($key),%xmm1 movdqu 16($key),%xmm2 movdqu ($counter),%xmm3 movdqa .Lone(%rip),%xmm4 #movdqa %xmm0,4*0(%rsp) # key[0] movdqa %xmm1,4*4(%rsp) # key[1] movdqa %xmm2,4*8(%rsp) # key[2] movdqa %xmm3,4*12(%rsp) # key[3] mov $len,%rbp # reassign $len jmp .Loop_outer .align 32 .Loop_outer: mov \$0x61707865,@x[0] # 'expa' mov \$0x3320646e,@x[1] # 'nd 3' mov \$0x79622d32,@x[2] # '2-by' mov \$0x6b206574,@x[3] # 'te k' mov 4*4(%rsp),@x[4] mov 4*5(%rsp),@x[5] mov 4*6(%rsp),@x[6] mov 4*7(%rsp),@x[7] movd %xmm3,@x[12] mov 4*13(%rsp),@x[13] mov 4*14(%rsp),@x[14] mov 4*15(%rsp),@x[15] mov %rbp,64+0(%rsp) # save len mov \$10,%ebp mov $inp,64+8(%rsp) # save inp movq %xmm2,%rsi # "@x[8]" mov $out,64+16(%rsp) # save out mov %rsi,%rdi shr \$32,%rdi # "@x[9]" jmp .Loop .align 32 .Loop: ___ foreach (&ROUND (0, 4, 8,12)) { eval; } foreach (&ROUND (0, 5,10,15)) { eval; } &dec ("%ebp"); &jnz (".Loop"); $code.=<<___; mov @t[1],4*9(%rsp) # modulo-scheduled mov @t[0],4*8(%rsp) mov 64(%rsp),%rbp # load len movdqa %xmm2,%xmm1 mov 64+8(%rsp),$inp # load inp paddd %xmm4,%xmm3 # increment counter mov 64+16(%rsp),$out # load out add \$0x61707865,@x[0] # 'expa' add \$0x3320646e,@x[1] # 'nd 3' add \$0x79622d32,@x[2] # '2-by' add \$0x6b206574,@x[3] # 'te k' add 4*4(%rsp),@x[4] add 4*5(%rsp),@x[5] add 4*6(%rsp),@x[6] add 4*7(%rsp),@x[7] add 4*12(%rsp),@x[12] add 4*13(%rsp),@x[13] add 4*14(%rsp),@x[14] add 4*15(%rsp),@x[15] paddd 4*8(%rsp),%xmm1 cmp \$64,%rbp jb .Ltail xor 4*0($inp),@x[0] # xor with input xor 4*1($inp),@x[1] xor 4*2($inp),@x[2] xor 4*3($inp),@x[3] xor 4*4($inp),@x[4] xor 4*5($inp),@x[5] xor 4*6($inp),@x[6] xor 4*7($inp),@x[7] movdqu 4*8($inp),%xmm0 xor 4*12($inp),@x[12] xor 4*13($inp),@x[13] xor 4*14($inp),@x[14] xor 4*15($inp),@x[15] lea 4*16($inp),$inp # inp+=64 pxor %xmm1,%xmm0 movdqa %xmm2,4*8(%rsp) movd %xmm3,4*12(%rsp) mov @x[0],4*0($out) # write output mov @x[1],4*1($out) mov @x[2],4*2($out) mov @x[3],4*3($out) mov @x[4],4*4($out) mov @x[5],4*5($out) mov @x[6],4*6($out) mov @x[7],4*7($out) movdqu %xmm0,4*8($out) mov @x[12],4*12($out) mov @x[13],4*13($out) mov @x[14],4*14($out) mov @x[15],4*15($out) lea 4*16($out),$out # out+=64 sub \$64,%rbp jnz .Loop_outer jmp .Ldone .align 16 .Ltail: mov @x[0],4*0(%rsp) mov @x[1],4*1(%rsp) xor %rbx,%rbx mov @x[2],4*2(%rsp) mov @x[3],4*3(%rsp) mov @x[4],4*4(%rsp) mov @x[5],4*5(%rsp) mov @x[6],4*6(%rsp) mov @x[7],4*7(%rsp) movdqa %xmm1,4*8(%rsp) mov @x[12],4*12(%rsp) mov @x[13],4*13(%rsp) mov @x[14],4*14(%rsp) mov @x[15],4*15(%rsp) .Loop_tail: movzb ($inp,%rbx),%eax movzb (%rsp,%rbx),%edx lea 1(%rbx),%rbx xor %edx,%eax mov %al,-1($out,%rbx) dec %rbp jnz .Loop_tail .Ldone: lea 64+24+48(%rsp),%rsi mov -48(%rsi),%r15 .cfi_restore r15 mov -40(%rsi),%r14 .cfi_restore r14 mov -32(%rsi),%r13 .cfi_restore r13 mov -24(%rsi),%r12 .cfi_restore r12 mov -16(%rsi),%rbp .cfi_restore rbp mov -8(%rsi),%rbx .cfi_restore rbx lea (%rsi),%rsp .cfi_adjust_cfa_offset `-64-24-48` .Lno_data: ret .cfi_endproc .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 ___ ######################################################################## # SSSE3 code path that handles shorter lengths { my ($a,$b,$c,$d,$t,$t1,$rot16,$rot24)=map("%xmm$_",(0..7)); sub SSSE3ROUND { # critical path is 20 "SIMD ticks" per round &paddd ($a,$b); &pxor ($d,$a); &pshufb ($d,$rot16); &paddd ($c,$d); &pxor ($b,$c); &movdqa ($t,$b); &psrld ($b,20); &pslld ($t,12); &por ($b,$t); &paddd ($a,$b); &pxor ($d,$a); &pshufb ($d,$rot24); &paddd ($c,$d); &pxor ($b,$c); &movdqa ($t,$b); &psrld ($b,25); &pslld ($t,7); &por ($b,$t); } my $xframe = $win64 ? 32+8 : 8; $code.=<<___; .type ChaCha20_ssse3,\@function,5 .align 32 ChaCha20_ssse3: .LChaCha20_ssse3: .cfi_startproc mov %rsp,%r9 # frame pointer .cfi_def_cfa_register r9 ___ $code.=<<___; cmp \$128,$len # we might throw away some data, ja .LChaCha20_4x # but overall it won't be slower .Ldo_sse3_after_all: sub \$64+$xframe,%rsp ___ $code.=<<___ if ($win64); movaps %xmm6,-0x28(%r9) movaps %xmm7,-0x18(%r9) .Lssse3_body: ___ $code.=<<___; movdqa .Lsigma(%rip),$a movdqu ($key),$b movdqu 16($key),$c movdqu ($counter),$d movdqa .Lrot16(%rip),$rot16 movdqa .Lrot24(%rip),$rot24 movdqa $a,0x00(%rsp) movdqa $b,0x10(%rsp) movdqa $c,0x20(%rsp) movdqa $d,0x30(%rsp) mov \$10,$counter # reuse $counter jmp .Loop_ssse3 .align 32 .Loop_outer_ssse3: movdqa .Lone(%rip),$d movdqa 0x00(%rsp),$a movdqa 0x10(%rsp),$b movdqa 0x20(%rsp),$c paddd 0x30(%rsp),$d mov \$10,$counter movdqa $d,0x30(%rsp) jmp .Loop_ssse3 .align 32 .Loop_ssse3: ___ &SSSE3ROUND(); &pshufd ($c,$c,0b01001110); &pshufd ($b,$b,0b00111001); &pshufd ($d,$d,0b10010011); &nop (); &SSSE3ROUND(); &pshufd ($c,$c,0b01001110); &pshufd ($b,$b,0b10010011); &pshufd ($d,$d,0b00111001); &dec ($counter); &jnz (".Loop_ssse3"); $code.=<<___; paddd 0x00(%rsp),$a paddd 0x10(%rsp),$b paddd 0x20(%rsp),$c paddd 0x30(%rsp),$d cmp \$64,$len jb .Ltail_ssse3 movdqu 0x00($inp),$t movdqu 0x10($inp),$t1 pxor $t,$a # xor with input movdqu 0x20($inp),$t pxor $t1,$b movdqu 0x30($inp),$t1 lea 0x40($inp),$inp # inp+=64 pxor $t,$c pxor $t1,$d movdqu $a,0x00($out) # write output movdqu $b,0x10($out) movdqu $c,0x20($out) movdqu $d,0x30($out) lea 0x40($out),$out # out+=64 sub \$64,$len jnz .Loop_outer_ssse3 jmp .Ldone_ssse3 .align 16 .Ltail_ssse3: movdqa $a,0x00(%rsp) movdqa $b,0x10(%rsp) movdqa $c,0x20(%rsp) movdqa $d,0x30(%rsp) xor $counter,$counter .Loop_tail_ssse3: movzb ($inp,$counter),%eax movzb (%rsp,$counter),%ecx lea 1($counter),$counter xor %ecx,%eax mov %al,-1($out,$counter) dec $len jnz .Loop_tail_ssse3 .Ldone_ssse3: ___ $code.=<<___ if ($win64); movaps -0x28(%r9),%xmm6 movaps -0x18(%r9),%xmm7 ___ $code.=<<___; lea (%r9),%rsp .cfi_def_cfa_register rsp .Lssse3_epilogue: ret .cfi_endproc .size ChaCha20_ssse3,.-ChaCha20_ssse3 ___ } ######################################################################## # SSSE3 code path that handles longer messages. { # assign variables to favor Atom front-end my ($xd0,$xd1,$xd2,$xd3, $xt0,$xt1,$xt2,$xt3, $xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3)=map("%xmm$_",(0..15)); my @xx=($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, "%nox","%nox","%nox","%nox", $xd0,$xd1,$xd2,$xd3); sub SSSE3_lane_ROUND { my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); my ($xc,$xc_,$t0,$t1)=map("\"$_\"",$xt0,$xt1,$xt2,$xt3); my @x=map("\"$_\"",@xx); # Consider order in which variables are addressed by their # index: # # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 # # 'a', 'b' and 'd's are permanently allocated in registers, # @x[0..7,12..15], while 'c's are maintained in memory. If # you observe 'c' column, you'll notice that pair of 'c's is # invariant between rounds. This means that we have to reload # them once per round, in the middle. This is why you'll see # bunch of 'c' stores and loads in the middle, but none in # the beginning or end. ( "&paddd (@x[$a0],@x[$b0])", # Q1 "&paddd (@x[$a1],@x[$b1])", # Q2 "&pxor (@x[$d0],@x[$a0])", "&pxor (@x[$d1],@x[$a1])", "&pshufb (@x[$d0],$t1)", "&pshufb (@x[$d1],$t1)", "&paddd ($xc,@x[$d0])", "&paddd ($xc_,@x[$d1])", "&pxor (@x[$b0],$xc)", "&pxor (@x[$b1],$xc_)", "&movdqa ($t0,@x[$b0])", "&pslld (@x[$b0],12)", "&psrld ($t0,20)", "&movdqa ($t1,@x[$b1])", "&pslld (@x[$b1],12)", "&por (@x[$b0],$t0)", "&psrld ($t1,20)", "&movdqa ($t0,'(%r11)')", # .Lrot24(%rip) "&por (@x[$b1],$t1)", "&paddd (@x[$a0],@x[$b0])", "&paddd (@x[$a1],@x[$b1])", "&pxor (@x[$d0],@x[$a0])", "&pxor (@x[$d1],@x[$a1])", "&pshufb (@x[$d0],$t0)", "&pshufb (@x[$d1],$t0)", "&paddd ($xc,@x[$d0])", "&paddd ($xc_,@x[$d1])", "&pxor (@x[$b0],$xc)", "&pxor (@x[$b1],$xc_)", "&movdqa ($t1,@x[$b0])", "&pslld (@x[$b0],7)", "&psrld ($t1,25)", "&movdqa ($t0,@x[$b1])", "&pslld (@x[$b1],7)", "&por (@x[$b0],$t1)", "&psrld ($t0,25)", "&movdqa ($t1,'(%r10)')", # .Lrot16(%rip) "&por (@x[$b1],$t0)", "&movdqa (\"`16*($c0-8)`(%rsp)\",$xc)", # reload pair of 'c's "&movdqa (\"`16*($c1-8)`(%rsp)\",$xc_)", "&movdqa ($xc,\"`16*($c2-8)`(%rsp)\")", "&movdqa ($xc_,\"`16*($c3-8)`(%rsp)\")", "&paddd (@x[$a2],@x[$b2])", # Q3 "&paddd (@x[$a3],@x[$b3])", # Q4 "&pxor (@x[$d2],@x[$a2])", "&pxor (@x[$d3],@x[$a3])", "&pshufb (@x[$d2],$t1)", "&pshufb (@x[$d3],$t1)", "&paddd ($xc,@x[$d2])", "&paddd ($xc_,@x[$d3])", "&pxor (@x[$b2],$xc)", "&pxor (@x[$b3],$xc_)", "&movdqa ($t0,@x[$b2])", "&pslld (@x[$b2],12)", "&psrld ($t0,20)", "&movdqa ($t1,@x[$b3])", "&pslld (@x[$b3],12)", "&por (@x[$b2],$t0)", "&psrld ($t1,20)", "&movdqa ($t0,'(%r11)')", # .Lrot24(%rip) "&por (@x[$b3],$t1)", "&paddd (@x[$a2],@x[$b2])", "&paddd (@x[$a3],@x[$b3])", "&pxor (@x[$d2],@x[$a2])", "&pxor (@x[$d3],@x[$a3])", "&pshufb (@x[$d2],$t0)", "&pshufb (@x[$d3],$t0)", "&paddd ($xc,@x[$d2])", "&paddd ($xc_,@x[$d3])", "&pxor (@x[$b2],$xc)", "&pxor (@x[$b3],$xc_)", "&movdqa ($t1,@x[$b2])", "&pslld (@x[$b2],7)", "&psrld ($t1,25)", "&movdqa ($t0,@x[$b3])", "&pslld (@x[$b3],7)", "&por (@x[$b2],$t1)", "&psrld ($t0,25)", "&movdqa ($t1,'(%r10)')", # .Lrot16(%rip) "&por (@x[$b3],$t0)" ); } my $xframe = $win64 ? 0xa8 : 8; $code.=<<___; .type ChaCha20_4x,\@function,5 .align 32 ChaCha20_4x: .LChaCha20_4x: .cfi_startproc mov %rsp,%r9 # frame pointer .cfi_def_cfa_register r9 mov %r10,%r11 ___ $code.=<<___ if ($avx>1); shr \$32,%r10 # GFp_ia32cap_P+8 test \$`1<<5`,%r10 # test AVX2 jnz .LChaCha20_8x ___ $code.=<<___; cmp \$192,$len ja .Lproceed4x and \$`1<<26|1<<22`,%r11 # isolate XSAVE+MOVBE cmp \$`1<<22`,%r11 # check for MOVBE without XSAVE je .Ldo_sse3_after_all # to detect Atom .Lproceed4x: sub \$0x140+$xframe,%rsp ___ ################ stack layout # +0x00 SIMD equivalent of @x[8-12] # ... # +0x40 constant copy of key[0-2] smashed by lanes # ... # +0x100 SIMD counters (with nonce smashed by lanes) # ... # +0x140 $code.=<<___ if ($win64); movaps %xmm6,-0xa8(%r9) movaps %xmm7,-0x98(%r9) movaps %xmm8,-0x88(%r9) movaps %xmm9,-0x78(%r9) movaps %xmm10,-0x68(%r9) movaps %xmm11,-0x58(%r9) movaps %xmm12,-0x48(%r9) movaps %xmm13,-0x38(%r9) movaps %xmm14,-0x28(%r9) movaps %xmm15,-0x18(%r9) .L4x_body: ___ $code.=<<___; movdqa .Lsigma(%rip),$xa3 # key[0] movdqu ($key),$xb3 # key[1] movdqu 16($key),$xt3 # key[2] movdqu ($counter),$xd3 # key[3] lea 0x100(%rsp),%rcx # size optimization lea .Lrot16(%rip),%r10 lea .Lrot24(%rip),%r11 pshufd \$0x00,$xa3,$xa0 # smash key by lanes... pshufd \$0x55,$xa3,$xa1 movdqa $xa0,0x40(%rsp) # ... and offload pshufd \$0xaa,$xa3,$xa2 movdqa $xa1,0x50(%rsp) pshufd \$0xff,$xa3,$xa3 movdqa $xa2,0x60(%rsp) movdqa $xa3,0x70(%rsp) pshufd \$0x00,$xb3,$xb0 pshufd \$0x55,$xb3,$xb1 movdqa $xb0,0x80-0x100(%rcx) pshufd \$0xaa,$xb3,$xb2 movdqa $xb1,0x90-0x100(%rcx) pshufd \$0xff,$xb3,$xb3 movdqa $xb2,0xa0-0x100(%rcx) movdqa $xb3,0xb0-0x100(%rcx) pshufd \$0x00,$xt3,$xt0 # "$xc0" pshufd \$0x55,$xt3,$xt1 # "$xc1" movdqa $xt0,0xc0-0x100(%rcx) pshufd \$0xaa,$xt3,$xt2 # "$xc2" movdqa $xt1,0xd0-0x100(%rcx) pshufd \$0xff,$xt3,$xt3 # "$xc3" movdqa $xt2,0xe0-0x100(%rcx) movdqa $xt3,0xf0-0x100(%rcx) pshufd \$0x00,$xd3,$xd0 pshufd \$0x55,$xd3,$xd1 paddd .Linc(%rip),$xd0 # don't save counters yet pshufd \$0xaa,$xd3,$xd2 movdqa $xd1,0x110-0x100(%rcx) pshufd \$0xff,$xd3,$xd3 movdqa $xd2,0x120-0x100(%rcx) movdqa $xd3,0x130-0x100(%rcx) jmp .Loop_enter4x .align 32 .Loop_outer4x: movdqa 0x40(%rsp),$xa0 # re-load smashed key movdqa 0x50(%rsp),$xa1 movdqa 0x60(%rsp),$xa2 movdqa 0x70(%rsp),$xa3 movdqa 0x80-0x100(%rcx),$xb0 movdqa 0x90-0x100(%rcx),$xb1 movdqa 0xa0-0x100(%rcx),$xb2 movdqa 0xb0-0x100(%rcx),$xb3 movdqa 0xc0-0x100(%rcx),$xt0 # "$xc0" movdqa 0xd0-0x100(%rcx),$xt1 # "$xc1" movdqa 0xe0-0x100(%rcx),$xt2 # "$xc2" movdqa 0xf0-0x100(%rcx),$xt3 # "$xc3" movdqa 0x100-0x100(%rcx),$xd0 movdqa 0x110-0x100(%rcx),$xd1 movdqa 0x120-0x100(%rcx),$xd2 movdqa 0x130-0x100(%rcx),$xd3 paddd .Lfour(%rip),$xd0 # next SIMD counters .Loop_enter4x: movdqa $xt2,0x20(%rsp) # SIMD equivalent of "@x[10]" movdqa $xt3,0x30(%rsp) # SIMD equivalent of "@x[11]" movdqa (%r10),$xt3 # .Lrot16(%rip) mov \$10,%eax movdqa $xd0,0x100-0x100(%rcx) # save SIMD counters jmp .Loop4x .align 32 .Loop4x: ___ foreach (&SSSE3_lane_ROUND(0, 4, 8,12)) { eval; } foreach (&SSSE3_lane_ROUND(0, 5,10,15)) { eval; } $code.=<<___; dec %eax jnz .Loop4x paddd 0x40(%rsp),$xa0 # accumulate key material paddd 0x50(%rsp),$xa1 paddd 0x60(%rsp),$xa2 paddd 0x70(%rsp),$xa3 movdqa $xa0,$xt2 # "de-interlace" data punpckldq $xa1,$xa0 movdqa $xa2,$xt3 punpckldq $xa3,$xa2 punpckhdq $xa1,$xt2 punpckhdq $xa3,$xt3 movdqa $xa0,$xa1 punpcklqdq $xa2,$xa0 # "a0" movdqa $xt2,$xa3 punpcklqdq $xt3,$xt2 # "a2" punpckhqdq $xa2,$xa1 # "a1" punpckhqdq $xt3,$xa3 # "a3" ___ ($xa2,$xt2)=($xt2,$xa2); $code.=<<___; paddd 0x80-0x100(%rcx),$xb0 paddd 0x90-0x100(%rcx),$xb1 paddd 0xa0-0x100(%rcx),$xb2 paddd 0xb0-0x100(%rcx),$xb3 movdqa $xa0,0x00(%rsp) # offload $xaN movdqa $xa1,0x10(%rsp) movdqa 0x20(%rsp),$xa0 # "xc2" movdqa 0x30(%rsp),$xa1 # "xc3" movdqa $xb0,$xt2 punpckldq $xb1,$xb0 movdqa $xb2,$xt3 punpckldq $xb3,$xb2 punpckhdq $xb1,$xt2 punpckhdq $xb3,$xt3 movdqa $xb0,$xb1 punpcklqdq $xb2,$xb0 # "b0" movdqa $xt2,$xb3 punpcklqdq $xt3,$xt2 # "b2" punpckhqdq $xb2,$xb1 # "b1" punpckhqdq $xt3,$xb3 # "b3" ___ ($xb2,$xt2)=($xt2,$xb2); my ($xc0,$xc1,$xc2,$xc3)=($xt0,$xt1,$xa0,$xa1); $code.=<<___; paddd 0xc0-0x100(%rcx),$xc0 paddd 0xd0-0x100(%rcx),$xc1 paddd 0xe0-0x100(%rcx),$xc2 paddd 0xf0-0x100(%rcx),$xc3 movdqa $xa2,0x20(%rsp) # keep offloading $xaN movdqa $xa3,0x30(%rsp) movdqa $xc0,$xt2 punpckldq $xc1,$xc0 movdqa $xc2,$xt3 punpckldq $xc3,$xc2 punpckhdq $xc1,$xt2 punpckhdq $xc3,$xt3 movdqa $xc0,$xc1 punpcklqdq $xc2,$xc0 # "c0" movdqa $xt2,$xc3 punpcklqdq $xt3,$xt2 # "c2" punpckhqdq $xc2,$xc1 # "c1" punpckhqdq $xt3,$xc3 # "c3" ___ ($xc2,$xt2)=($xt2,$xc2); ($xt0,$xt1)=($xa2,$xa3); # use $xaN as temporary $code.=<<___; paddd 0x100-0x100(%rcx),$xd0 paddd 0x110-0x100(%rcx),$xd1 paddd 0x120-0x100(%rcx),$xd2 paddd 0x130-0x100(%rcx),$xd3 movdqa $xd0,$xt2 punpckldq $xd1,$xd0 movdqa $xd2,$xt3 punpckldq $xd3,$xd2 punpckhdq $xd1,$xt2 punpckhdq $xd3,$xt3 movdqa $xd0,$xd1 punpcklqdq $xd2,$xd0 # "d0" movdqa $xt2,$xd3 punpcklqdq $xt3,$xt2 # "d2" punpckhqdq $xd2,$xd1 # "d1" punpckhqdq $xt3,$xd3 # "d3" ___ ($xd2,$xt2)=($xt2,$xd2); $code.=<<___; cmp \$64*4,$len jb .Ltail4x movdqu 0x00($inp),$xt0 # xor with input movdqu 0x10($inp),$xt1 movdqu 0x20($inp),$xt2 movdqu 0x30($inp),$xt3 pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? pxor $xb0,$xt1 pxor $xc0,$xt2 pxor $xd0,$xt3 movdqu $xt0,0x00($out) movdqu 0x40($inp),$xt0 movdqu $xt1,0x10($out) movdqu 0x50($inp),$xt1 movdqu $xt2,0x20($out) movdqu 0x60($inp),$xt2 movdqu $xt3,0x30($out) movdqu 0x70($inp),$xt3 lea 0x80($inp),$inp # size optimization pxor 0x10(%rsp),$xt0 pxor $xb1,$xt1 pxor $xc1,$xt2 pxor $xd1,$xt3 movdqu $xt0,0x40($out) movdqu 0x00($inp),$xt0 movdqu $xt1,0x50($out) movdqu 0x10($inp),$xt1 movdqu $xt2,0x60($out) movdqu 0x20($inp),$xt2 movdqu $xt3,0x70($out) lea 0x80($out),$out # size optimization movdqu 0x30($inp),$xt3 pxor 0x20(%rsp),$xt0 pxor $xb2,$xt1 pxor $xc2,$xt2 pxor $xd2,$xt3 movdqu $xt0,0x00($out) movdqu 0x40($inp),$xt0 movdqu $xt1,0x10($out) movdqu 0x50($inp),$xt1 movdqu $xt2,0x20($out) movdqu 0x60($inp),$xt2 movdqu $xt3,0x30($out) movdqu 0x70($inp),$xt3 lea 0x80($inp),$inp # inp+=64*4 pxor 0x30(%rsp),$xt0 pxor $xb3,$xt1 pxor $xc3,$xt2 pxor $xd3,$xt3 movdqu $xt0,0x40($out) movdqu $xt1,0x50($out) movdqu $xt2,0x60($out) movdqu $xt3,0x70($out) lea 0x80($out),$out # out+=64*4 sub \$64*4,$len jnz .Loop_outer4x jmp .Ldone4x .Ltail4x: cmp \$192,$len jae .L192_or_more4x cmp \$128,$len jae .L128_or_more4x cmp \$64,$len jae .L64_or_more4x #movdqa 0x00(%rsp),$xt0 # $xaN is offloaded, remember? xor %r10,%r10 #movdqa $xt0,0x00(%rsp) movdqa $xb0,0x10(%rsp) movdqa $xc0,0x20(%rsp) movdqa $xd0,0x30(%rsp) jmp .Loop_tail4x .align 32 .L64_or_more4x: movdqu 0x00($inp),$xt0 # xor with input movdqu 0x10($inp),$xt1 movdqu 0x20($inp),$xt2 movdqu 0x30($inp),$xt3 pxor 0x00(%rsp),$xt0 # $xaxN is offloaded, remember? pxor $xb0,$xt1 pxor $xc0,$xt2 pxor $xd0,$xt3 movdqu $xt0,0x00($out) movdqu $xt1,0x10($out) movdqu $xt2,0x20($out) movdqu $xt3,0x30($out) je .Ldone4x movdqa 0x10(%rsp),$xt0 # $xaN is offloaded, remember? lea 0x40($inp),$inp # inp+=64*1 xor %r10,%r10 movdqa $xt0,0x00(%rsp) movdqa $xb1,0x10(%rsp) lea 0x40($out),$out # out+=64*1 movdqa $xc1,0x20(%rsp) sub \$64,$len # len-=64*1 movdqa $xd1,0x30(%rsp) jmp .Loop_tail4x .align 32 .L128_or_more4x: movdqu 0x00($inp),$xt0 # xor with input movdqu 0x10($inp),$xt1 movdqu 0x20($inp),$xt2 movdqu 0x30($inp),$xt3 pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? pxor $xb0,$xt1 pxor $xc0,$xt2 pxor $xd0,$xt3 movdqu $xt0,0x00($out) movdqu 0x40($inp),$xt0 movdqu $xt1,0x10($out) movdqu 0x50($inp),$xt1 movdqu $xt2,0x20($out) movdqu 0x60($inp),$xt2 movdqu $xt3,0x30($out) movdqu 0x70($inp),$xt3 pxor 0x10(%rsp),$xt0 pxor $xb1,$xt1 pxor $xc1,$xt2 pxor $xd1,$xt3 movdqu $xt0,0x40($out) movdqu $xt1,0x50($out) movdqu $xt2,0x60($out) movdqu $xt3,0x70($out) je .Ldone4x movdqa 0x20(%rsp),$xt0 # $xaN is offloaded, remember? lea 0x80($inp),$inp # inp+=64*2 xor %r10,%r10 movdqa $xt0,0x00(%rsp) movdqa $xb2,0x10(%rsp) lea 0x80($out),$out # out+=64*2 movdqa $xc2,0x20(%rsp) sub \$128,$len # len-=64*2 movdqa $xd2,0x30(%rsp) jmp .Loop_tail4x .align 32 .L192_or_more4x: movdqu 0x00($inp),$xt0 # xor with input movdqu 0x10($inp),$xt1 movdqu 0x20($inp),$xt2 movdqu 0x30($inp),$xt3 pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? pxor $xb0,$xt1 pxor $xc0,$xt2 pxor $xd0,$xt3 movdqu $xt0,0x00($out) movdqu 0x40($inp),$xt0 movdqu $xt1,0x10($out) movdqu 0x50($inp),$xt1 movdqu $xt2,0x20($out) movdqu 0x60($inp),$xt2 movdqu $xt3,0x30($out) movdqu 0x70($inp),$xt3 lea 0x80($inp),$inp # size optimization pxor 0x10(%rsp),$xt0 pxor $xb1,$xt1 pxor $xc1,$xt2 pxor $xd1,$xt3 movdqu $xt0,0x40($out) movdqu 0x00($inp),$xt0 movdqu $xt1,0x50($out) movdqu 0x10($inp),$xt1 movdqu $xt2,0x60($out) movdqu 0x20($inp),$xt2 movdqu $xt3,0x70($out) lea 0x80($out),$out # size optimization movdqu 0x30($inp),$xt3 pxor 0x20(%rsp),$xt0 pxor $xb2,$xt1 pxor $xc2,$xt2 pxor $xd2,$xt3 movdqu $xt0,0x00($out) movdqu $xt1,0x10($out) movdqu $xt2,0x20($out) movdqu $xt3,0x30($out) je .Ldone4x movdqa 0x30(%rsp),$xt0 # $xaN is offloaded, remember? lea 0x40($inp),$inp # inp+=64*3 xor %r10,%r10 movdqa $xt0,0x00(%rsp) movdqa $xb3,0x10(%rsp) lea 0x40($out),$out # out+=64*3 movdqa $xc3,0x20(%rsp) sub \$192,$len # len-=64*3 movdqa $xd3,0x30(%rsp) .Loop_tail4x: movzb ($inp,%r10),%eax movzb (%rsp,%r10),%ecx lea 1(%r10),%r10 xor %ecx,%eax mov %al,-1($out,%r10) dec $len jnz .Loop_tail4x .Ldone4x: ___ $code.=<<___ if ($win64); movaps -0xa8(%r9),%xmm6 movaps -0x98(%r9),%xmm7 movaps -0x88(%r9),%xmm8 movaps -0x78(%r9),%xmm9 movaps -0x68(%r9),%xmm10 movaps -0x58(%r9),%xmm11 movaps -0x48(%r9),%xmm12 movaps -0x38(%r9),%xmm13 movaps -0x28(%r9),%xmm14 movaps -0x18(%r9),%xmm15 ___ $code.=<<___; lea (%r9),%rsp .cfi_def_cfa_register rsp .L4x_epilogue: ret .cfi_endproc .size ChaCha20_4x,.-ChaCha20_4x ___ } ######################################################################## # AVX2 code path if ($avx>1) { my ($xb0,$xb1,$xb2,$xb3, $xd0,$xd1,$xd2,$xd3, $xa0,$xa1,$xa2,$xa3, $xt0,$xt1,$xt2,$xt3)=map("%ymm$_",(0..15)); my @xx=($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, "%nox","%nox","%nox","%nox", $xd0,$xd1,$xd2,$xd3); sub AVX2_lane_ROUND { my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); my ($xc,$xc_,$t0,$t1)=map("\"$_\"",$xt0,$xt1,$xt2,$xt3); my @x=map("\"$_\"",@xx); # Consider order in which variables are addressed by their # index: # # a b c d # # 0 4 8 12 < even round # 1 5 9 13 # 2 6 10 14 # 3 7 11 15 # 0 5 10 15 < odd round # 1 6 11 12 # 2 7 8 13 # 3 4 9 14 # # 'a', 'b' and 'd's are permanently allocated in registers, # @x[0..7,12..15], while 'c's are maintained in memory. If # you observe 'c' column, you'll notice that pair of 'c's is # invariant between rounds. This means that we have to reload # them once per round, in the middle. This is why you'll see # bunch of 'c' stores and loads in the middle, but none in # the beginning or end. ( "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", # Q1 "&vpxor (@x[$d0],@x[$a0],@x[$d0])", "&vpshufb (@x[$d0],@x[$d0],$t1)", "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", # Q2 "&vpxor (@x[$d1],@x[$a1],@x[$d1])", "&vpshufb (@x[$d1],@x[$d1],$t1)", "&vpaddd ($xc,$xc,@x[$d0])", "&vpxor (@x[$b0],$xc,@x[$b0])", "&vpslld ($t0,@x[$b0],12)", "&vpsrld (@x[$b0],@x[$b0],20)", "&vpor (@x[$b0],$t0,@x[$b0])", "&vbroadcasti128($t0,'(%r11)')", # .Lrot24(%rip) "&vpaddd ($xc_,$xc_,@x[$d1])", "&vpxor (@x[$b1],$xc_,@x[$b1])", "&vpslld ($t1,@x[$b1],12)", "&vpsrld (@x[$b1],@x[$b1],20)", "&vpor (@x[$b1],$t1,@x[$b1])", "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", "&vpxor (@x[$d0],@x[$a0],@x[$d0])", "&vpshufb (@x[$d0],@x[$d0],$t0)", "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", "&vpxor (@x[$d1],@x[$a1],@x[$d1])", "&vpshufb (@x[$d1],@x[$d1],$t0)", "&vpaddd ($xc,$xc,@x[$d0])", "&vpxor (@x[$b0],$xc,@x[$b0])", "&vpslld ($t1,@x[$b0],7)", "&vpsrld (@x[$b0],@x[$b0],25)", "&vpor (@x[$b0],$t1,@x[$b0])", "&vbroadcasti128($t1,'(%r10)')", # .Lrot16(%rip) "&vpaddd ($xc_,$xc_,@x[$d1])", "&vpxor (@x[$b1],$xc_,@x[$b1])", "&vpslld ($t0,@x[$b1],7)", "&vpsrld (@x[$b1],@x[$b1],25)", "&vpor (@x[$b1],$t0,@x[$b1])", "&vmovdqa (\"`32*($c0-8)`(%rsp)\",$xc)", # reload pair of 'c's "&vmovdqa (\"`32*($c1-8)`(%rsp)\",$xc_)", "&vmovdqa ($xc,\"`32*($c2-8)`(%rsp)\")", "&vmovdqa ($xc_,\"`32*($c3-8)`(%rsp)\")", "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", # Q3 "&vpxor (@x[$d2],@x[$a2],@x[$d2])", "&vpshufb (@x[$d2],@x[$d2],$t1)", "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", # Q4 "&vpxor (@x[$d3],@x[$a3],@x[$d3])", "&vpshufb (@x[$d3],@x[$d3],$t1)", "&vpaddd ($xc,$xc,@x[$d2])", "&vpxor (@x[$b2],$xc,@x[$b2])", "&vpslld ($t0,@x[$b2],12)", "&vpsrld (@x[$b2],@x[$b2],20)", "&vpor (@x[$b2],$t0,@x[$b2])", "&vbroadcasti128($t0,'(%r11)')", # .Lrot24(%rip) "&vpaddd ($xc_,$xc_,@x[$d3])", "&vpxor (@x[$b3],$xc_,@x[$b3])", "&vpslld ($t1,@x[$b3],12)", "&vpsrld (@x[$b3],@x[$b3],20)", "&vpor (@x[$b3],$t1,@x[$b3])", "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", "&vpxor (@x[$d2],@x[$a2],@x[$d2])", "&vpshufb (@x[$d2],@x[$d2],$t0)", "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", "&vpxor (@x[$d3],@x[$a3],@x[$d3])", "&vpshufb (@x[$d3],@x[$d3],$t0)", "&vpaddd ($xc,$xc,@x[$d2])", "&vpxor (@x[$b2],$xc,@x[$b2])", "&vpslld ($t1,@x[$b2],7)", "&vpsrld (@x[$b2],@x[$b2],25)", "&vpor (@x[$b2],$t1,@x[$b2])", "&vbroadcasti128($t1,'(%r10)')", # .Lrot16(%rip) "&vpaddd ($xc_,$xc_,@x[$d3])", "&vpxor (@x[$b3],$xc_,@x[$b3])", "&vpslld ($t0,@x[$b3],7)", "&vpsrld (@x[$b3],@x[$b3],25)", "&vpor (@x[$b3],$t0,@x[$b3])" ); } my $xframe = $win64 ? 0xa8 : 8; $code.=<<___; .type ChaCha20_8x,\@function,5 .align 32 ChaCha20_8x: .LChaCha20_8x: .cfi_startproc mov %rsp,%r9 # frame register .cfi_def_cfa_register r9 sub \$0x280+$xframe,%rsp and \$-32,%rsp ___ $code.=<<___ if ($win64); movaps %xmm6,-0xa8(%r9) movaps %xmm7,-0x98(%r9) movaps %xmm8,-0x88(%r9) movaps %xmm9,-0x78(%r9) movaps %xmm10,-0x68(%r9) movaps %xmm11,-0x58(%r9) movaps %xmm12,-0x48(%r9) movaps %xmm13,-0x38(%r9) movaps %xmm14,-0x28(%r9) movaps %xmm15,-0x18(%r9) .L8x_body: ___ $code.=<<___; vzeroupper ################ stack layout # +0x00 SIMD equivalent of @x[8-12] # ... # +0x80 constant copy of key[0-2] smashed by lanes # ... # +0x200 SIMD counters (with nonce smashed by lanes) # ... # +0x280 vbroadcasti128 .Lsigma(%rip),$xa3 # key[0] vbroadcasti128 ($key),$xb3 # key[1] vbroadcasti128 16($key),$xt3 # key[2] vbroadcasti128 ($counter),$xd3 # key[3] lea 0x100(%rsp),%rcx # size optimization lea 0x200(%rsp),%rax # size optimization lea .Lrot16(%rip),%r10 lea .Lrot24(%rip),%r11 vpshufd \$0x00,$xa3,$xa0 # smash key by lanes... vpshufd \$0x55,$xa3,$xa1 vmovdqa $xa0,0x80-0x100(%rcx) # ... and offload vpshufd \$0xaa,$xa3,$xa2 vmovdqa $xa1,0xa0-0x100(%rcx) vpshufd \$0xff,$xa3,$xa3 vmovdqa $xa2,0xc0-0x100(%rcx) vmovdqa $xa3,0xe0-0x100(%rcx) vpshufd \$0x00,$xb3,$xb0 vpshufd \$0x55,$xb3,$xb1 vmovdqa $xb0,0x100-0x100(%rcx) vpshufd \$0xaa,$xb3,$xb2 vmovdqa $xb1,0x120-0x100(%rcx) vpshufd \$0xff,$xb3,$xb3 vmovdqa $xb2,0x140-0x100(%rcx) vmovdqa $xb3,0x160-0x100(%rcx) vpshufd \$0x00,$xt3,$xt0 # "xc0" vpshufd \$0x55,$xt3,$xt1 # "xc1" vmovdqa $xt0,0x180-0x200(%rax) vpshufd \$0xaa,$xt3,$xt2 # "xc2" vmovdqa $xt1,0x1a0-0x200(%rax) vpshufd \$0xff,$xt3,$xt3 # "xc3" vmovdqa $xt2,0x1c0-0x200(%rax) vmovdqa $xt3,0x1e0-0x200(%rax) vpshufd \$0x00,$xd3,$xd0 vpshufd \$0x55,$xd3,$xd1 vpaddd .Lincy(%rip),$xd0,$xd0 # don't save counters yet vpshufd \$0xaa,$xd3,$xd2 vmovdqa $xd1,0x220-0x200(%rax) vpshufd \$0xff,$xd3,$xd3 vmovdqa $xd2,0x240-0x200(%rax) vmovdqa $xd3,0x260-0x200(%rax) jmp .Loop_enter8x .align 32 .Loop_outer8x: vmovdqa 0x80-0x100(%rcx),$xa0 # re-load smashed key vmovdqa 0xa0-0x100(%rcx),$xa1 vmovdqa 0xc0-0x100(%rcx),$xa2 vmovdqa 0xe0-0x100(%rcx),$xa3 vmovdqa 0x100-0x100(%rcx),$xb0 vmovdqa 0x120-0x100(%rcx),$xb1 vmovdqa 0x140-0x100(%rcx),$xb2 vmovdqa 0x160-0x100(%rcx),$xb3 vmovdqa 0x180-0x200(%rax),$xt0 # "xc0" vmovdqa 0x1a0-0x200(%rax),$xt1 # "xc1" vmovdqa 0x1c0-0x200(%rax),$xt2 # "xc2" vmovdqa 0x1e0-0x200(%rax),$xt3 # "xc3" vmovdqa 0x200-0x200(%rax),$xd0 vmovdqa 0x220-0x200(%rax),$xd1 vmovdqa 0x240-0x200(%rax),$xd2 vmovdqa 0x260-0x200(%rax),$xd3 vpaddd .Leight(%rip),$xd0,$xd0 # next SIMD counters .Loop_enter8x: vmovdqa $xt2,0x40(%rsp) # SIMD equivalent of "@x[10]" vmovdqa $xt3,0x60(%rsp) # SIMD equivalent of "@x[11]" vbroadcasti128 (%r10),$xt3 vmovdqa $xd0,0x200-0x200(%rax) # save SIMD counters mov \$10,%eax jmp .Loop8x .align 32 .Loop8x: ___ foreach (&AVX2_lane_ROUND(0, 4, 8,12)) { eval; } foreach (&AVX2_lane_ROUND(0, 5,10,15)) { eval; } $code.=<<___; dec %eax jnz .Loop8x lea 0x200(%rsp),%rax # size optimization vpaddd 0x80-0x100(%rcx),$xa0,$xa0 # accumulate key vpaddd 0xa0-0x100(%rcx),$xa1,$xa1 vpaddd 0xc0-0x100(%rcx),$xa2,$xa2 vpaddd 0xe0-0x100(%rcx),$xa3,$xa3 vpunpckldq $xa1,$xa0,$xt2 # "de-interlace" data vpunpckldq $xa3,$xa2,$xt3 vpunpckhdq $xa1,$xa0,$xa0 vpunpckhdq $xa3,$xa2,$xa2 vpunpcklqdq $xt3,$xt2,$xa1 # "a0" vpunpckhqdq $xt3,$xt2,$xt2 # "a1" vpunpcklqdq $xa2,$xa0,$xa3 # "a2" vpunpckhqdq $xa2,$xa0,$xa0 # "a3" ___ ($xa0,$xa1,$xa2,$xa3,$xt2)=($xa1,$xt2,$xa3,$xa0,$xa2); $code.=<<___; vpaddd 0x100-0x100(%rcx),$xb0,$xb0 vpaddd 0x120-0x100(%rcx),$xb1,$xb1 vpaddd 0x140-0x100(%rcx),$xb2,$xb2 vpaddd 0x160-0x100(%rcx),$xb3,$xb3 vpunpckldq $xb1,$xb0,$xt2 vpunpckldq $xb3,$xb2,$xt3 vpunpckhdq $xb1,$xb0,$xb0 vpunpckhdq $xb3,$xb2,$xb2 vpunpcklqdq $xt3,$xt2,$xb1 # "b0" vpunpckhqdq $xt3,$xt2,$xt2 # "b1" vpunpcklqdq $xb2,$xb0,$xb3 # "b2" vpunpckhqdq $xb2,$xb0,$xb0 # "b3" ___ ($xb0,$xb1,$xb2,$xb3,$xt2)=($xb1,$xt2,$xb3,$xb0,$xb2); $code.=<<___; vperm2i128 \$0x20,$xb0,$xa0,$xt3 # "de-interlace" further vperm2i128 \$0x31,$xb0,$xa0,$xb0 vperm2i128 \$0x20,$xb1,$xa1,$xa0 vperm2i128 \$0x31,$xb1,$xa1,$xb1 vperm2i128 \$0x20,$xb2,$xa2,$xa1 vperm2i128 \$0x31,$xb2,$xa2,$xb2 vperm2i128 \$0x20,$xb3,$xa3,$xa2 vperm2i128 \$0x31,$xb3,$xa3,$xb3 ___ ($xa0,$xa1,$xa2,$xa3,$xt3)=($xt3,$xa0,$xa1,$xa2,$xa3); my ($xc0,$xc1,$xc2,$xc3)=($xt0,$xt1,$xa0,$xa1); $code.=<<___; vmovdqa $xa0,0x00(%rsp) # offload $xaN vmovdqa $xa1,0x20(%rsp) vmovdqa 0x40(%rsp),$xc2 # $xa0 vmovdqa 0x60(%rsp),$xc3 # $xa1 vpaddd 0x180-0x200(%rax),$xc0,$xc0 vpaddd 0x1a0-0x200(%rax),$xc1,$xc1 vpaddd 0x1c0-0x200(%rax),$xc2,$xc2 vpaddd 0x1e0-0x200(%rax),$xc3,$xc3 vpunpckldq $xc1,$xc0,$xt2 vpunpckldq $xc3,$xc2,$xt3 vpunpckhdq $xc1,$xc0,$xc0 vpunpckhdq $xc3,$xc2,$xc2 vpunpcklqdq $xt3,$xt2,$xc1 # "c0" vpunpckhqdq $xt3,$xt2,$xt2 # "c1" vpunpcklqdq $xc2,$xc0,$xc3 # "c2" vpunpckhqdq $xc2,$xc0,$xc0 # "c3" ___ ($xc0,$xc1,$xc2,$xc3,$xt2)=($xc1,$xt2,$xc3,$xc0,$xc2); $code.=<<___; vpaddd 0x200-0x200(%rax),$xd0,$xd0 vpaddd 0x220-0x200(%rax),$xd1,$xd1 vpaddd 0x240-0x200(%rax),$xd2,$xd2 vpaddd 0x260-0x200(%rax),$xd3,$xd3 vpunpckldq $xd1,$xd0,$xt2 vpunpckldq $xd3,$xd2,$xt3 vpunpckhdq $xd1,$xd0,$xd0 vpunpckhdq $xd3,$xd2,$xd2 vpunpcklqdq $xt3,$xt2,$xd1 # "d0" vpunpckhqdq $xt3,$xt2,$xt2 # "d1" vpunpcklqdq $xd2,$xd0,$xd3 # "d2" vpunpckhqdq $xd2,$xd0,$xd0 # "d3" ___ ($xd0,$xd1,$xd2,$xd3,$xt2)=($xd1,$xt2,$xd3,$xd0,$xd2); $code.=<<___; vperm2i128 \$0x20,$xd0,$xc0,$xt3 # "de-interlace" further vperm2i128 \$0x31,$xd0,$xc0,$xd0 vperm2i128 \$0x20,$xd1,$xc1,$xc0 vperm2i128 \$0x31,$xd1,$xc1,$xd1 vperm2i128 \$0x20,$xd2,$xc2,$xc1 vperm2i128 \$0x31,$xd2,$xc2,$xd2 vperm2i128 \$0x20,$xd3,$xc3,$xc2 vperm2i128 \$0x31,$xd3,$xc3,$xd3 ___ ($xc0,$xc1,$xc2,$xc3,$xt3)=($xt3,$xc0,$xc1,$xc2,$xc3); ($xb0,$xb1,$xb2,$xb3,$xc0,$xc1,$xc2,$xc3)= ($xc0,$xc1,$xc2,$xc3,$xb0,$xb1,$xb2,$xb3); ($xa0,$xa1)=($xt2,$xt3); $code.=<<___; vmovdqa 0x00(%rsp),$xa0 # $xaN was offloaded, remember? vmovdqa 0x20(%rsp),$xa1 cmp \$64*8,$len jb .Ltail8x vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 lea 0x80($inp),$inp # size optimization vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) lea 0x80($out),$out # size optimization vpxor 0x00($inp),$xa1,$xa1 vpxor 0x20($inp),$xb1,$xb1 vpxor 0x40($inp),$xc1,$xc1 vpxor 0x60($inp),$xd1,$xd1 lea 0x80($inp),$inp # size optimization vmovdqu $xa1,0x00($out) vmovdqu $xb1,0x20($out) vmovdqu $xc1,0x40($out) vmovdqu $xd1,0x60($out) lea 0x80($out),$out # size optimization vpxor 0x00($inp),$xa2,$xa2 vpxor 0x20($inp),$xb2,$xb2 vpxor 0x40($inp),$xc2,$xc2 vpxor 0x60($inp),$xd2,$xd2 lea 0x80($inp),$inp # size optimization vmovdqu $xa2,0x00($out) vmovdqu $xb2,0x20($out) vmovdqu $xc2,0x40($out) vmovdqu $xd2,0x60($out) lea 0x80($out),$out # size optimization vpxor 0x00($inp),$xa3,$xa3 vpxor 0x20($inp),$xb3,$xb3 vpxor 0x40($inp),$xc3,$xc3 vpxor 0x60($inp),$xd3,$xd3 lea 0x80($inp),$inp # size optimization vmovdqu $xa3,0x00($out) vmovdqu $xb3,0x20($out) vmovdqu $xc3,0x40($out) vmovdqu $xd3,0x60($out) lea 0x80($out),$out # size optimization sub \$64*8,$len jnz .Loop_outer8x jmp .Ldone8x .Ltail8x: cmp \$448,$len jae .L448_or_more8x cmp \$384,$len jae .L384_or_more8x cmp \$320,$len jae .L320_or_more8x cmp \$256,$len jae .L256_or_more8x cmp \$192,$len jae .L192_or_more8x cmp \$128,$len jae .L128_or_more8x cmp \$64,$len jae .L64_or_more8x xor %r10,%r10 vmovdqa $xa0,0x00(%rsp) vmovdqa $xb0,0x20(%rsp) jmp .Loop_tail8x .align 32 .L64_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) je .Ldone8x lea 0x40($inp),$inp # inp+=64*1 xor %r10,%r10 vmovdqa $xc0,0x00(%rsp) lea 0x40($out),$out # out+=64*1 sub \$64,$len # len-=64*1 vmovdqa $xd0,0x20(%rsp) jmp .Loop_tail8x .align 32 .L128_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) je .Ldone8x lea 0x80($inp),$inp # inp+=64*2 xor %r10,%r10 vmovdqa $xa1,0x00(%rsp) lea 0x80($out),$out # out+=64*2 sub \$128,$len # len-=64*2 vmovdqa $xb1,0x20(%rsp) jmp .Loop_tail8x .align 32 .L192_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vpxor 0x80($inp),$xa1,$xa1 vpxor 0xa0($inp),$xb1,$xb1 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) vmovdqu $xa1,0x80($out) vmovdqu $xb1,0xa0($out) je .Ldone8x lea 0xc0($inp),$inp # inp+=64*3 xor %r10,%r10 vmovdqa $xc1,0x00(%rsp) lea 0xc0($out),$out # out+=64*3 sub \$192,$len # len-=64*3 vmovdqa $xd1,0x20(%rsp) jmp .Loop_tail8x .align 32 .L256_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vpxor 0x80($inp),$xa1,$xa1 vpxor 0xa0($inp),$xb1,$xb1 vpxor 0xc0($inp),$xc1,$xc1 vpxor 0xe0($inp),$xd1,$xd1 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) vmovdqu $xa1,0x80($out) vmovdqu $xb1,0xa0($out) vmovdqu $xc1,0xc0($out) vmovdqu $xd1,0xe0($out) je .Ldone8x lea 0x100($inp),$inp # inp+=64*4 xor %r10,%r10 vmovdqa $xa2,0x00(%rsp) lea 0x100($out),$out # out+=64*4 sub \$256,$len # len-=64*4 vmovdqa $xb2,0x20(%rsp) jmp .Loop_tail8x .align 32 .L320_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vpxor 0x80($inp),$xa1,$xa1 vpxor 0xa0($inp),$xb1,$xb1 vpxor 0xc0($inp),$xc1,$xc1 vpxor 0xe0($inp),$xd1,$xd1 vpxor 0x100($inp),$xa2,$xa2 vpxor 0x120($inp),$xb2,$xb2 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) vmovdqu $xa1,0x80($out) vmovdqu $xb1,0xa0($out) vmovdqu $xc1,0xc0($out) vmovdqu $xd1,0xe0($out) vmovdqu $xa2,0x100($out) vmovdqu $xb2,0x120($out) je .Ldone8x lea 0x140($inp),$inp # inp+=64*5 xor %r10,%r10 vmovdqa $xc2,0x00(%rsp) lea 0x140($out),$out # out+=64*5 sub \$320,$len # len-=64*5 vmovdqa $xd2,0x20(%rsp) jmp .Loop_tail8x .align 32 .L384_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vpxor 0x80($inp),$xa1,$xa1 vpxor 0xa0($inp),$xb1,$xb1 vpxor 0xc0($inp),$xc1,$xc1 vpxor 0xe0($inp),$xd1,$xd1 vpxor 0x100($inp),$xa2,$xa2 vpxor 0x120($inp),$xb2,$xb2 vpxor 0x140($inp),$xc2,$xc2 vpxor 0x160($inp),$xd2,$xd2 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) vmovdqu $xa1,0x80($out) vmovdqu $xb1,0xa0($out) vmovdqu $xc1,0xc0($out) vmovdqu $xd1,0xe0($out) vmovdqu $xa2,0x100($out) vmovdqu $xb2,0x120($out) vmovdqu $xc2,0x140($out) vmovdqu $xd2,0x160($out) je .Ldone8x lea 0x180($inp),$inp # inp+=64*6 xor %r10,%r10 vmovdqa $xa3,0x00(%rsp) lea 0x180($out),$out # out+=64*6 sub \$384,$len # len-=64*6 vmovdqa $xb3,0x20(%rsp) jmp .Loop_tail8x .align 32 .L448_or_more8x: vpxor 0x00($inp),$xa0,$xa0 # xor with input vpxor 0x20($inp),$xb0,$xb0 vpxor 0x40($inp),$xc0,$xc0 vpxor 0x60($inp),$xd0,$xd0 vpxor 0x80($inp),$xa1,$xa1 vpxor 0xa0($inp),$xb1,$xb1 vpxor 0xc0($inp),$xc1,$xc1 vpxor 0xe0($inp),$xd1,$xd1 vpxor 0x100($inp),$xa2,$xa2 vpxor 0x120($inp),$xb2,$xb2 vpxor 0x140($inp),$xc2,$xc2 vpxor 0x160($inp),$xd2,$xd2 vpxor 0x180($inp),$xa3,$xa3 vpxor 0x1a0($inp),$xb3,$xb3 vmovdqu $xa0,0x00($out) vmovdqu $xb0,0x20($out) vmovdqu $xc0,0x40($out) vmovdqu $xd0,0x60($out) vmovdqu $xa1,0x80($out) vmovdqu $xb1,0xa0($out) vmovdqu $xc1,0xc0($out) vmovdqu $xd1,0xe0($out) vmovdqu $xa2,0x100($out) vmovdqu $xb2,0x120($out) vmovdqu $xc2,0x140($out) vmovdqu $xd2,0x160($out) vmovdqu $xa3,0x180($out) vmovdqu $xb3,0x1a0($out) je .Ldone8x lea 0x1c0($inp),$inp # inp+=64*7 xor %r10,%r10 vmovdqa $xc3,0x00(%rsp) lea 0x1c0($out),$out # out+=64*7 sub \$448,$len # len-=64*7 vmovdqa $xd3,0x20(%rsp) .Loop_tail8x: movzb ($inp,%r10),%eax movzb (%rsp,%r10),%ecx lea 1(%r10),%r10 xor %ecx,%eax mov %al,-1($out,%r10) dec $len jnz .Loop_tail8x .Ldone8x: vzeroall ___ $code.=<<___ if ($win64); movaps -0xa8(%r9),%xmm6 movaps -0x98(%r9),%xmm7 movaps -0x88(%r9),%xmm8 movaps -0x78(%r9),%xmm9 movaps -0x68(%r9),%xmm10 movaps -0x58(%r9),%xmm11 movaps -0x48(%r9),%xmm12 movaps -0x38(%r9),%xmm13 movaps -0x28(%r9),%xmm14 movaps -0x18(%r9),%xmm15 ___ $code.=<<___; lea (%r9),%rsp .cfi_def_cfa_register rsp .L8x_epilogue: ret .cfi_endproc .size ChaCha20_8x,.-ChaCha20_8x ___ } ######################################################################## # AVX512 code paths if ($avx>2) { # This one handles shorter inputs... my ($a,$b,$c,$d, $a_,$b_,$c_,$d_,$fourz) = map("%zmm$_",(0..3,16..20)); my ($t0,$t1,$t2,$t3) = map("%xmm$_",(4..7)); sub AVX512ROUND { # critical path is 14 "SIMD ticks" per round &vpaddd ($a,$a,$b); &vpxord ($d,$d,$a); &vprold ($d,$d,16); &vpaddd ($c,$c,$d); &vpxord ($b,$b,$c); &vprold ($b,$b,12); &vpaddd ($a,$a,$b); &vpxord ($d,$d,$a); &vprold ($d,$d,8); &vpaddd ($c,$c,$d); &vpxord ($b,$b,$c); &vprold ($b,$b,7); } my $xframe = $win64 ? 32+8 : 8; $code.=<<___; .type ChaCha20_avx512,\@function,5 .align 32 ChaCha20_avx512: .LChaCha20_avx512: .cfi_startproc mov %rsp,%r9 # frame pointer .cfi_def_cfa_register r9 cmp \$512,$len ja .LChaCha20_16x sub \$64+$xframe,%rsp ___ $code.=<<___ if ($win64); movaps %xmm6,-0x28(%r9) movaps %xmm7,-0x18(%r9) .Lavx512_body: ___ $code.=<<___; vbroadcasti32x4 .Lsigma(%rip),$a vbroadcasti32x4 ($key),$b vbroadcasti32x4 16($key),$c vbroadcasti32x4 ($counter),$d vmovdqa32 $a,$a_ vmovdqa32 $b,$b_ vmovdqa32 $c,$c_ vpaddd .Lzeroz(%rip),$d,$d vmovdqa32 .Lfourz(%rip),$fourz mov \$10,$counter # reuse $counter vmovdqa32 $d,$d_ jmp .Loop_avx512 .align 16 .Loop_outer_avx512: vmovdqa32 $a_,$a vmovdqa32 $b_,$b vmovdqa32 $c_,$c vpaddd $fourz,$d_,$d mov \$10,$counter vmovdqa32 $d,$d_ jmp .Loop_avx512 .align 32 .Loop_avx512: ___ &AVX512ROUND(); &vpshufd ($c,$c,0b01001110); &vpshufd ($b,$b,0b00111001); &vpshufd ($d,$d,0b10010011); &AVX512ROUND(); &vpshufd ($c,$c,0b01001110); &vpshufd ($b,$b,0b10010011); &vpshufd ($d,$d,0b00111001); &dec ($counter); &jnz (".Loop_avx512"); $code.=<<___; vpaddd $a_,$a,$a vpaddd $b_,$b,$b vpaddd $c_,$c,$c vpaddd $d_,$d,$d sub \$64,$len jb .Ltail64_avx512 vpxor 0x00($inp),%x#$a,$t0 # xor with input vpxor 0x10($inp),%x#$b,$t1 vpxor 0x20($inp),%x#$c,$t2 vpxor 0x30($inp),%x#$d,$t3 lea 0x40($inp),$inp # inp+=64 vmovdqu $t0,0x00($out) # write output vmovdqu $t1,0x10($out) vmovdqu $t2,0x20($out) vmovdqu $t3,0x30($out) lea 0x40($out),$out # out+=64 jz .Ldone_avx512 vextracti32x4 \$1,$a,$t0 vextracti32x4 \$1,$b,$t1 vextracti32x4 \$1,$c,$t2 vextracti32x4 \$1,$d,$t3 sub \$64,$len jb .Ltail_avx512 vpxor 0x00($inp),$t0,$t0 # xor with input vpxor 0x10($inp),$t1,$t1 vpxor 0x20($inp),$t2,$t2 vpxor 0x30($inp),$t3,$t3 lea 0x40($inp),$inp # inp+=64 vmovdqu $t0,0x00($out) # write output vmovdqu $t1,0x10($out) vmovdqu $t2,0x20($out) vmovdqu $t3,0x30($out) lea 0x40($out),$out # out+=64 jz .Ldone_avx512 vextracti32x4 \$2,$a,$t0 vextracti32x4 \$2,$b,$t1 vextracti32x4 \$2,$c,$t2 vextracti32x4 \$2,$d,$t3 sub \$64,$len jb .Ltail_avx512 vpxor 0x00($inp),$t0,$t0 # xor with input vpxor 0x10($inp),$t1,$t1 vpxor 0x20($inp),$t2,$t2 vpxor 0x30($inp),$t3,$t3 lea 0x40($inp),$inp # inp+=64 vmovdqu $t0,0x00($out) # write output vmovdqu $t1,0x10($out) vmovdqu $t2,0x20($out) vmovdqu $t3,0x30($out) lea 0x40($out),$out # out+=64 jz .Ldone_avx512 vextracti32x4 \$3,$a,$t0 vextracti32x4 \$3,$b,$t1 vextracti32x4 \$3,$c,$t2 vextracti32x4 \$3,$d,$t3 sub \$64,$len jb .Ltail_avx512 vpxor 0x00($inp),$t0,$t0 # xor with input vpxor 0x10($inp),$t1,$t1 vpxor 0x20($inp),$t2,$t2 vpxor 0x30($inp),$t3,$t3 lea 0x40($inp),$inp # inp+=64 vmovdqu $t0,0x00($out) # write output vmovdqu $t1,0x10($out) vmovdqu $t2,0x20($out) vmovdqu $t3,0x30($out) lea 0x40($out),$out # out+=64 jnz .Loop_outer_avx512 jmp .Ldone_avx512 .align 16 .Ltail64_avx512: vmovdqa %x#$a,0x00(%rsp) vmovdqa %x#$b,0x10(%rsp) vmovdqa %x#$c,0x20(%rsp) vmovdqa %x#$d,0x30(%rsp) add \$64,$len jmp .Loop_tail_avx512 .align 16 .Ltail_avx512: vmovdqa $t0,0x00(%rsp) vmovdqa $t1,0x10(%rsp) vmovdqa $t2,0x20(%rsp) vmovdqa $t3,0x30(%rsp) add \$64,$len .Loop_tail_avx512: movzb ($inp,$counter),%eax movzb (%rsp,$counter),%ecx lea 1($counter),$counter xor %ecx,%eax mov %al,-1($out,$counter) dec $len jnz .Loop_tail_avx512 vmovdqa32 $a_,0x00(%rsp) .Ldone_avx512: vzeroall ___ $code.=<<___ if ($win64); movaps -0x28(%r9),%xmm6 movaps -0x18(%r9),%xmm7 ___ $code.=<<___; lea (%r9),%rsp .cfi_def_cfa_register rsp .Lavx512_epilogue: ret .cfi_endproc .size ChaCha20_avx512,.-ChaCha20_avx512 ___ } if ($avx>2) { # This one handles longer inputs... my ($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, $xc0,$xc1,$xc2,$xc3, $xd0,$xd1,$xd2,$xd3)=map("%zmm$_",(0..15)); my @xx=($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, $xc0,$xc1,$xc2,$xc3, $xd0,$xd1,$xd2,$xd3); my @key=map("%zmm$_",(16..31)); my ($xt0,$xt1,$xt2,$xt3)=@key[0..3]; sub AVX512_lane_ROUND { my ($a0,$b0,$c0,$d0)=@_; my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); my @x=map("\"$_\"",@xx); ( "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", # Q1 "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", # Q2 "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", # Q3 "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", # Q4 "&vpxord (@x[$d0],@x[$d0],@x[$a0])", "&vpxord (@x[$d1],@x[$d1],@x[$a1])", "&vpxord (@x[$d2],@x[$d2],@x[$a2])", "&vpxord (@x[$d3],@x[$d3],@x[$a3])", "&vprold (@x[$d0],@x[$d0],16)", "&vprold (@x[$d1],@x[$d1],16)", "&vprold (@x[$d2],@x[$d2],16)", "&vprold (@x[$d3],@x[$d3],16)", "&vpaddd (@x[$c0],@x[$c0],@x[$d0])", "&vpaddd (@x[$c1],@x[$c1],@x[$d1])", "&vpaddd (@x[$c2],@x[$c2],@x[$d2])", "&vpaddd (@x[$c3],@x[$c3],@x[$d3])", "&vpxord (@x[$b0],@x[$b0],@x[$c0])", "&vpxord (@x[$b1],@x[$b1],@x[$c1])", "&vpxord (@x[$b2],@x[$b2],@x[$c2])", "&vpxord (@x[$b3],@x[$b3],@x[$c3])", "&vprold (@x[$b0],@x[$b0],12)", "&vprold (@x[$b1],@x[$b1],12)", "&vprold (@x[$b2],@x[$b2],12)", "&vprold (@x[$b3],@x[$b3],12)", "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", "&vpxord (@x[$d0],@x[$d0],@x[$a0])", "&vpxord (@x[$d1],@x[$d1],@x[$a1])", "&vpxord (@x[$d2],@x[$d2],@x[$a2])", "&vpxord (@x[$d3],@x[$d3],@x[$a3])", "&vprold (@x[$d0],@x[$d0],8)", "&vprold (@x[$d1],@x[$d1],8)", "&vprold (@x[$d2],@x[$d2],8)", "&vprold (@x[$d3],@x[$d3],8)", "&vpaddd (@x[$c0],@x[$c0],@x[$d0])", "&vpaddd (@x[$c1],@x[$c1],@x[$d1])", "&vpaddd (@x[$c2],@x[$c2],@x[$d2])", "&vpaddd (@x[$c3],@x[$c3],@x[$d3])", "&vpxord (@x[$b0],@x[$b0],@x[$c0])", "&vpxord (@x[$b1],@x[$b1],@x[$c1])", "&vpxord (@x[$b2],@x[$b2],@x[$c2])", "&vpxord (@x[$b3],@x[$b3],@x[$c3])", "&vprold (@x[$b0],@x[$b0],7)", "&vprold (@x[$b1],@x[$b1],7)", "&vprold (@x[$b2],@x[$b2],7)", "&vprold (@x[$b3],@x[$b3],7)" ); } my $xframe = $win64 ? 0xa8 : 8; $code.=<<___; .type ChaCha20_16x,\@function,5 .align 32 ChaCha20_16x: .LChaCha20_16x: .cfi_startproc mov %rsp,%r9 # frame register .cfi_def_cfa_register r9 sub \$64+$xframe,%rsp and \$-64,%rsp ___ $code.=<<___ if ($win64); movaps %xmm6,-0xa8(%r9) movaps %xmm7,-0x98(%r9) movaps %xmm8,-0x88(%r9) movaps %xmm9,-0x78(%r9) movaps %xmm10,-0x68(%r9) movaps %xmm11,-0x58(%r9) movaps %xmm12,-0x48(%r9) movaps %xmm13,-0x38(%r9) movaps %xmm14,-0x28(%r9) movaps %xmm15,-0x18(%r9) .L16x_body: ___ $code.=<<___; vzeroupper lea .Lsigma(%rip),%r10 vbroadcasti32x4 (%r10),$xa3 # key[0] vbroadcasti32x4 ($key),$xb3 # key[1] vbroadcasti32x4 16($key),$xc3 # key[2] vbroadcasti32x4 ($counter),$xd3 # key[3] vpshufd \$0x00,$xa3,$xa0 # smash key by lanes... vpshufd \$0x55,$xa3,$xa1 vpshufd \$0xaa,$xa3,$xa2 vpshufd \$0xff,$xa3,$xa3 vmovdqa64 $xa0,@key[0] vmovdqa64 $xa1,@key[1] vmovdqa64 $xa2,@key[2] vmovdqa64 $xa3,@key[3] vpshufd \$0x00,$xb3,$xb0 vpshufd \$0x55,$xb3,$xb1 vpshufd \$0xaa,$xb3,$xb2 vpshufd \$0xff,$xb3,$xb3 vmovdqa64 $xb0,@key[4] vmovdqa64 $xb1,@key[5] vmovdqa64 $xb2,@key[6] vmovdqa64 $xb3,@key[7] vpshufd \$0x00,$xc3,$xc0 vpshufd \$0x55,$xc3,$xc1 vpshufd \$0xaa,$xc3,$xc2 vpshufd \$0xff,$xc3,$xc3 vmovdqa64 $xc0,@key[8] vmovdqa64 $xc1,@key[9] vmovdqa64 $xc2,@key[10] vmovdqa64 $xc3,@key[11] vpshufd \$0x00,$xd3,$xd0 vpshufd \$0x55,$xd3,$xd1 vpshufd \$0xaa,$xd3,$xd2 vpshufd \$0xff,$xd3,$xd3 vpaddd .Lincz(%rip),$xd0,$xd0 # don't save counters yet vmovdqa64 $xd0,@key[12] vmovdqa64 $xd1,@key[13] vmovdqa64 $xd2,@key[14] vmovdqa64 $xd3,@key[15] mov \$10,%eax jmp .Loop16x .align 32 .Loop_outer16x: vpbroadcastd 0(%r10),$xa0 # reload key vpbroadcastd 4(%r10),$xa1 vpbroadcastd 8(%r10),$xa2 vpbroadcastd 12(%r10),$xa3 vpaddd .Lsixteen(%rip),@key[12],@key[12] # next SIMD counters vmovdqa64 @key[4],$xb0 vmovdqa64 @key[5],$xb1 vmovdqa64 @key[6],$xb2 vmovdqa64 @key[7],$xb3 vmovdqa64 @key[8],$xc0 vmovdqa64 @key[9],$xc1 vmovdqa64 @key[10],$xc2 vmovdqa64 @key[11],$xc3 vmovdqa64 @key[12],$xd0 vmovdqa64 @key[13],$xd1 vmovdqa64 @key[14],$xd2 vmovdqa64 @key[15],$xd3 vmovdqa64 $xa0,@key[0] vmovdqa64 $xa1,@key[1] vmovdqa64 $xa2,@key[2] vmovdqa64 $xa3,@key[3] mov \$10,%eax jmp .Loop16x .align 32 .Loop16x: ___ foreach (&AVX512_lane_ROUND(0, 4, 8,12)) { eval; } foreach (&AVX512_lane_ROUND(0, 5,10,15)) { eval; } $code.=<<___; dec %eax jnz .Loop16x vpaddd @key[0],$xa0,$xa0 # accumulate key vpaddd @key[1],$xa1,$xa1 vpaddd @key[2],$xa2,$xa2 vpaddd @key[3],$xa3,$xa3 vpunpckldq $xa1,$xa0,$xt2 # "de-interlace" data vpunpckldq $xa3,$xa2,$xt3 vpunpckhdq $xa1,$xa0,$xa0 vpunpckhdq $xa3,$xa2,$xa2 vpunpcklqdq $xt3,$xt2,$xa1 # "a0" vpunpckhqdq $xt3,$xt2,$xt2 # "a1" vpunpcklqdq $xa2,$xa0,$xa3 # "a2" vpunpckhqdq $xa2,$xa0,$xa0 # "a3" ___ ($xa0,$xa1,$xa2,$xa3,$xt2)=($xa1,$xt2,$xa3,$xa0,$xa2); $code.=<<___; vpaddd @key[4],$xb0,$xb0 vpaddd @key[5],$xb1,$xb1 vpaddd @key[6],$xb2,$xb2 vpaddd @key[7],$xb3,$xb3 vpunpckldq $xb1,$xb0,$xt2 vpunpckldq $xb3,$xb2,$xt3 vpunpckhdq $xb1,$xb0,$xb0 vpunpckhdq $xb3,$xb2,$xb2 vpunpcklqdq $xt3,$xt2,$xb1 # "b0" vpunpckhqdq $xt3,$xt2,$xt2 # "b1" vpunpcklqdq $xb2,$xb0,$xb3 # "b2" vpunpckhqdq $xb2,$xb0,$xb0 # "b3" ___ ($xb0,$xb1,$xb2,$xb3,$xt2)=($xb1,$xt2,$xb3,$xb0,$xb2); $code.=<<___; vshufi32x4 \$0x44,$xb0,$xa0,$xt3 # "de-interlace" further vshufi32x4 \$0xee,$xb0,$xa0,$xb0 vshufi32x4 \$0x44,$xb1,$xa1,$xa0 vshufi32x4 \$0xee,$xb1,$xa1,$xb1 vshufi32x4 \$0x44,$xb2,$xa2,$xa1 vshufi32x4 \$0xee,$xb2,$xa2,$xb2 vshufi32x4 \$0x44,$xb3,$xa3,$xa2 vshufi32x4 \$0xee,$xb3,$xa3,$xb3 ___ ($xa0,$xa1,$xa2,$xa3,$xt3)=($xt3,$xa0,$xa1,$xa2,$xa3); $code.=<<___; vpaddd @key[8],$xc0,$xc0 vpaddd @key[9],$xc1,$xc1 vpaddd @key[10],$xc2,$xc2 vpaddd @key[11],$xc3,$xc3 vpunpckldq $xc1,$xc0,$xt2 vpunpckldq $xc3,$xc2,$xt3 vpunpckhdq $xc1,$xc0,$xc0 vpunpckhdq $xc3,$xc2,$xc2 vpunpcklqdq $xt3,$xt2,$xc1 # "c0" vpunpckhqdq $xt3,$xt2,$xt2 # "c1" vpunpcklqdq $xc2,$xc0,$xc3 # "c2" vpunpckhqdq $xc2,$xc0,$xc0 # "c3" ___ ($xc0,$xc1,$xc2,$xc3,$xt2)=($xc1,$xt2,$xc3,$xc0,$xc2); $code.=<<___; vpaddd @key[12],$xd0,$xd0 vpaddd @key[13],$xd1,$xd1 vpaddd @key[14],$xd2,$xd2 vpaddd @key[15],$xd3,$xd3 vpunpckldq $xd1,$xd0,$xt2 vpunpckldq $xd3,$xd2,$xt3 vpunpckhdq $xd1,$xd0,$xd0 vpunpckhdq $xd3,$xd2,$xd2 vpunpcklqdq $xt3,$xt2,$xd1 # "d0" vpunpckhqdq $xt3,$xt2,$xt2 # "d1" vpunpcklqdq $xd2,$xd0,$xd3 # "d2" vpunpckhqdq $xd2,$xd0,$xd0 # "d3" ___ ($xd0,$xd1,$xd2,$xd3,$xt2)=($xd1,$xt2,$xd3,$xd0,$xd2); $code.=<<___; vshufi32x4 \$0x44,$xd0,$xc0,$xt3 # "de-interlace" further vshufi32x4 \$0xee,$xd0,$xc0,$xd0 vshufi32x4 \$0x44,$xd1,$xc1,$xc0 vshufi32x4 \$0xee,$xd1,$xc1,$xd1 vshufi32x4 \$0x44,$xd2,$xc2,$xc1 vshufi32x4 \$0xee,$xd2,$xc2,$xd2 vshufi32x4 \$0x44,$xd3,$xc3,$xc2 vshufi32x4 \$0xee,$xd3,$xc3,$xd3 ___ ($xc0,$xc1,$xc2,$xc3,$xt3)=($xt3,$xc0,$xc1,$xc2,$xc3); $code.=<<___; vshufi32x4 \$0x88,$xc0,$xa0,$xt0 # "de-interlace" further vshufi32x4 \$0xdd,$xc0,$xa0,$xa0 vshufi32x4 \$0x88,$xd0,$xb0,$xc0 vshufi32x4 \$0xdd,$xd0,$xb0,$xd0 vshufi32x4 \$0x88,$xc1,$xa1,$xt1 vshufi32x4 \$0xdd,$xc1,$xa1,$xa1 vshufi32x4 \$0x88,$xd1,$xb1,$xc1 vshufi32x4 \$0xdd,$xd1,$xb1,$xd1 vshufi32x4 \$0x88,$xc2,$xa2,$xt2 vshufi32x4 \$0xdd,$xc2,$xa2,$xa2 vshufi32x4 \$0x88,$xd2,$xb2,$xc2 vshufi32x4 \$0xdd,$xd2,$xb2,$xd2 vshufi32x4 \$0x88,$xc3,$xa3,$xt3 vshufi32x4 \$0xdd,$xc3,$xa3,$xa3 vshufi32x4 \$0x88,$xd3,$xb3,$xc3 vshufi32x4 \$0xdd,$xd3,$xb3,$xd3 ___ ($xa0,$xa1,$xa2,$xa3,$xb0,$xb1,$xb2,$xb3)= ($xt0,$xt1,$xt2,$xt3,$xa0,$xa1,$xa2,$xa3); ($xa0,$xb0,$xc0,$xd0, $xa1,$xb1,$xc1,$xd1, $xa2,$xb2,$xc2,$xd2, $xa3,$xb3,$xc3,$xd3) = ($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, $xc0,$xc1,$xc2,$xc3, $xd0,$xd1,$xd2,$xd3); $code.=<<___; cmp \$64*16,$len jb .Ltail16x vpxord 0x00($inp),$xa0,$xa0 # xor with input vpxord 0x40($inp),$xb0,$xb0 vpxord 0x80($inp),$xc0,$xc0 vpxord 0xc0($inp),$xd0,$xd0 vmovdqu32 $xa0,0x00($out) vmovdqu32 $xb0,0x40($out) vmovdqu32 $xc0,0x80($out) vmovdqu32 $xd0,0xc0($out) vpxord 0x100($inp),$xa1,$xa1 vpxord 0x140($inp),$xb1,$xb1 vpxord 0x180($inp),$xc1,$xc1 vpxord 0x1c0($inp),$xd1,$xd1 vmovdqu32 $xa1,0x100($out) vmovdqu32 $xb1,0x140($out) vmovdqu32 $xc1,0x180($out) vmovdqu32 $xd1,0x1c0($out) vpxord 0x200($inp),$xa2,$xa2 vpxord 0x240($inp),$xb2,$xb2 vpxord 0x280($inp),$xc2,$xc2 vpxord 0x2c0($inp),$xd2,$xd2 vmovdqu32 $xa2,0x200($out) vmovdqu32 $xb2,0x240($out) vmovdqu32 $xc2,0x280($out) vmovdqu32 $xd2,0x2c0($out) vpxord 0x300($inp),$xa3,$xa3 vpxord 0x340($inp),$xb3,$xb3 vpxord 0x380($inp),$xc3,$xc3 vpxord 0x3c0($inp),$xd3,$xd3 lea 0x400($inp),$inp vmovdqu32 $xa3,0x300($out) vmovdqu32 $xb3,0x340($out) vmovdqu32 $xc3,0x380($out) vmovdqu32 $xd3,0x3c0($out) lea 0x400($out),$out sub \$64*16,$len jnz .Loop_outer16x jmp .Ldone16x .align 32 .Ltail16x: xor %r10,%r10 sub $inp,$out cmp \$64*1,$len jb .Less_than_64_16x vpxord ($inp),$xa0,$xa0 # xor with input vmovdqu32 $xa0,($out,$inp) je .Ldone16x vmovdqa32 $xb0,$xa0 lea 64($inp),$inp cmp \$64*2,$len jb .Less_than_64_16x vpxord ($inp),$xb0,$xb0 vmovdqu32 $xb0,($out,$inp) je .Ldone16x vmovdqa32 $xc0,$xa0 lea 64($inp),$inp cmp \$64*3,$len jb .Less_than_64_16x vpxord ($inp),$xc0,$xc0 vmovdqu32 $xc0,($out,$inp) je .Ldone16x vmovdqa32 $xd0,$xa0 lea 64($inp),$inp cmp \$64*4,$len jb .Less_than_64_16x vpxord ($inp),$xd0,$xd0 vmovdqu32 $xd0,($out,$inp) je .Ldone16x vmovdqa32 $xa1,$xa0 lea 64($inp),$inp cmp \$64*5,$len jb .Less_than_64_16x vpxord ($inp),$xa1,$xa1 vmovdqu32 $xa1,($out,$inp) je .Ldone16x vmovdqa32 $xb1,$xa0 lea 64($inp),$inp cmp \$64*6,$len jb .Less_than_64_16x vpxord ($inp),$xb1,$xb1 vmovdqu32 $xb1,($out,$inp) je .Ldone16x vmovdqa32 $xc1,$xa0 lea 64($inp),$inp cmp \$64*7,$len jb .Less_than_64_16x vpxord ($inp),$xc1,$xc1 vmovdqu32 $xc1,($out,$inp) je .Ldone16x vmovdqa32 $xd1,$xa0 lea 64($inp),$inp cmp \$64*8,$len jb .Less_than_64_16x vpxord ($inp),$xd1,$xd1 vmovdqu32 $xd1,($out,$inp) je .Ldone16x vmovdqa32 $xa2,$xa0 lea 64($inp),$inp cmp \$64*9,$len jb .Less_than_64_16x vpxord ($inp),$xa2,$xa2 vmovdqu32 $xa2,($out,$inp) je .Ldone16x vmovdqa32 $xb2,$xa0 lea 64($inp),$inp cmp \$64*10,$len jb .Less_than_64_16x vpxord ($inp),$xb2,$xb2 vmovdqu32 $xb2,($out,$inp) je .Ldone16x vmovdqa32 $xc2,$xa0 lea 64($inp),$inp cmp \$64*11,$len jb .Less_than_64_16x vpxord ($inp),$xc2,$xc2 vmovdqu32 $xc2,($out,$inp) je .Ldone16x vmovdqa32 $xd2,$xa0 lea 64($inp),$inp cmp \$64*12,$len jb .Less_than_64_16x vpxord ($inp),$xd2,$xd2 vmovdqu32 $xd2,($out,$inp) je .Ldone16x vmovdqa32 $xa3,$xa0 lea 64($inp),$inp cmp \$64*13,$len jb .Less_than_64_16x vpxord ($inp),$xa3,$xa3 vmovdqu32 $xa3,($out,$inp) je .Ldone16x vmovdqa32 $xb3,$xa0 lea 64($inp),$inp cmp \$64*14,$len jb .Less_than_64_16x vpxord ($inp),$xb3,$xb3 vmovdqu32 $xb3,($out,$inp) je .Ldone16x vmovdqa32 $xc3,$xa0 lea 64($inp),$inp cmp \$64*15,$len jb .Less_than_64_16x vpxord ($inp),$xc3,$xc3 vmovdqu32 $xc3,($out,$inp) je .Ldone16x vmovdqa32 $xd3,$xa0 lea 64($inp),$inp .Less_than_64_16x: vmovdqa32 $xa0,0x00(%rsp) lea ($out,$inp),$out and \$63,$len .Loop_tail16x: movzb ($inp,%r10),%eax movzb (%rsp,%r10),%ecx lea 1(%r10),%r10 xor %ecx,%eax mov %al,-1($out,%r10) dec $len jnz .Loop_tail16x vpxord $xa0,$xa0,$xa0 vmovdqa32 $xa0,0(%rsp) .Ldone16x: vzeroall ___ $code.=<<___ if ($win64); movaps -0xa8(%r9),%xmm6 movaps -0x98(%r9),%xmm7 movaps -0x88(%r9),%xmm8 movaps -0x78(%r9),%xmm9 movaps -0x68(%r9),%xmm10 movaps -0x58(%r9),%xmm11 movaps -0x48(%r9),%xmm12 movaps -0x38(%r9),%xmm13 movaps -0x28(%r9),%xmm14 movaps -0x18(%r9),%xmm15 ___ $code.=<<___; lea (%r9),%rsp .cfi_def_cfa_register rsp .L16x_epilogue: ret .cfi_endproc .size ChaCha20_16x,.-ChaCha20_16x ___ } # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type se_handler,\@abi-omnipotent .align 16 se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData lea .Lctr32_body(%rip),%r10 cmp %r10,%rbx # context->Rip<.Lprologue jb .Lcommon_seh_tail mov 152($context),%rax # pull context->Rsp lea .Lno_data(%rip),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=.Lepilogue jae .Lcommon_seh_tail lea 64+24+48(%rax),%rax mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R14 .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size se_handler,.-se_handler .type ssse3_handler,\@abi-omnipotent .align 16 ssse3_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipR9 mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail lea -0x28(%rax),%rsi lea 512($context),%rdi # &context.Xmm6 mov \$4,%ecx .long 0xa548f3fc # cld; rep movsq jmp .Lcommon_seh_tail .size ssse3_handler,.-ssse3_handler .type full_handler,\@abi-omnipotent .align 16 full_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipR9 mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail lea -0xa8(%rax),%rsi lea 512($context),%rdi # &context.Xmm6 mov \$20,%ecx .long 0xa548f3fc # cld; rep movsq jmp .Lcommon_seh_tail .size full_handler,.-full_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_ChaCha20_ctr32 .rva .LSEH_end_GFp_ChaCha20_ctr32 .rva .LSEH_info_GFp_ChaCha20_ctr32 .rva .LSEH_begin_ChaCha20_ssse3 .rva .LSEH_end_ChaCha20_ssse3 .rva .LSEH_info_ChaCha20_ssse3 .rva .LSEH_begin_ChaCha20_4x .rva .LSEH_end_ChaCha20_4x .rva .LSEH_info_ChaCha20_4x ___ $code.=<<___ if ($avx>1); .rva .LSEH_begin_ChaCha20_8x .rva .LSEH_end_ChaCha20_8x .rva .LSEH_info_ChaCha20_8x ___ $code.=<<___ if ($avx>2); .rva .LSEH_begin_ChaCha20_avx512 .rva .LSEH_end_ChaCha20_avx512 .rva .LSEH_info_ChaCha20_avx512 .rva .LSEH_begin_ChaCha20_16x .rva .LSEH_end_ChaCha20_16x .rva .LSEH_info_ChaCha20_16x ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_GFp_ChaCha20_ctr32: .byte 9,0,0,0 .rva se_handler .LSEH_info_ChaCha20_ssse3: .byte 9,0,0,0 .rva ssse3_handler .rva .Lssse3_body,.Lssse3_epilogue .LSEH_info_ChaCha20_4x: .byte 9,0,0,0 .rva full_handler .rva .L4x_body,.L4x_epilogue ___ $code.=<<___ if ($avx>1); .LSEH_info_ChaCha20_8x: .byte 9,0,0,0 .rva full_handler .rva .L8x_body,.L8x_epilogue # HandlerData[] ___ $code.=<<___ if ($avx>2); .LSEH_info_ChaCha20_avx512: .byte 9,0,0,0 .rva ssse3_handler .rva .Lavx512_body,.Lavx512_epilogue # HandlerData[] .LSEH_info_ChaCha20_16x: .byte 9,0,0,0 .rva full_handler .rva .L16x_body,.L16x_epilogue # HandlerData[] ___ } foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/ge; s/%x#%[yz]/%x/g; # "down-shift" print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl000064400000000000000000001622531352416253600212360ustar0000000000000000#!/usr/bin/env perl # Copyright (c) 2017, Shay Gueron. # Copyright (c) 2017, Google Inc. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use warnings FATAL => 'all'; $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $code.=<<___; .data .align 16 one: .quad 1,0 two: .quad 2,0 three: .quad 3,0 four: .quad 4,0 five: .quad 5,0 six: .quad 6,0 seven: .quad 7,0 eight: .quad 8,0 OR_MASK: .long 0x00000000,0x00000000,0x00000000,0x80000000 poly: .quad 0x1, 0xc200000000000000 mask: .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d con1: .long 1,1,1,1 con2: .long 0x1b,0x1b,0x1b,0x1b con3: .byte -1,-1,-1,-1,-1,-1,-1,-1,4,5,6,7,4,5,6,7 and_mask: .long 0,0xffffffff, 0xffffffff, 0xffffffff ___ $code.=<<___; .text ___ sub gfmul { ######################### # a = T # b = TMP0 - remains unchanged # res = T # uses also TMP1,TMP2,TMP3,TMP4 # __m128i GFMUL(__m128i A, __m128i B); my $T = "%xmm0"; my $TMP0 = "%xmm1"; my $TMP1 = "%xmm2"; my $TMP2 = "%xmm3"; my $TMP3 = "%xmm4"; my $TMP4 = "%xmm5"; $code.=<<___; .type GFMUL,\@abi-omnipotent .align 16 GFMUL: .cfi_startproc vpclmulqdq \$0x00, $TMP0, $T, $TMP1 vpclmulqdq \$0x11, $TMP0, $T, $TMP4 vpclmulqdq \$0x10, $TMP0, $T, $TMP2 vpclmulqdq \$0x01, $TMP0, $T, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpslldq \$8, $TMP2, $TMP3 vpsrldq \$8, $TMP2, $TMP2 vpxor $TMP3, $TMP1, $TMP1 vpxor $TMP2, $TMP4, $TMP4 vpclmulqdq \$0x10, poly(%rip), $TMP1, $TMP2 vpshufd \$78, $TMP1, $TMP3 vpxor $TMP3, $TMP2, $TMP1 vpclmulqdq \$0x10, poly(%rip), $TMP1, $TMP2 vpshufd \$78, $TMP1, $TMP3 vpxor $TMP3, $TMP2, $TMP1 vpxor $TMP4, $TMP1, $T ret .cfi_endproc .size GFMUL, .-GFMUL ___ } gfmul(); sub aesgcmsiv_htable_init { # aesgcmsiv_htable_init writes an eight-entry table of powers of |H| to # |out_htable|. # void aesgcmsiv_htable_init(uint8_t out_htable[16*8], uint8_t *H); my $Htbl = "%rdi"; my $H = "%rsi"; my $T = "%xmm0"; my $TMP0 = "%xmm1"; $code.=<<___; .globl aesgcmsiv_htable_init .type aesgcmsiv_htable_init,\@function,2 .align 16 aesgcmsiv_htable_init: .cfi_startproc vmovdqa ($H), $T vmovdqa $T, $TMP0 vmovdqa $T, ($Htbl) # H call GFMUL vmovdqa $T, 16($Htbl) # H^2 call GFMUL vmovdqa $T, 32($Htbl) # H^3 call GFMUL vmovdqa $T, 48($Htbl) # H^4 call GFMUL vmovdqa $T, 64($Htbl) # H^5 call GFMUL vmovdqa $T, 80($Htbl) # H^6 call GFMUL vmovdqa $T, 96($Htbl) # H^7 call GFMUL vmovdqa $T, 112($Htbl) # H^8 ret .cfi_endproc .size aesgcmsiv_htable_init, .-aesgcmsiv_htable_init ___ } aesgcmsiv_htable_init(); sub aesgcmsiv_htable6_init { # aesgcmsiv_htable6_init writes a six-entry table of powers of |H| to # |out_htable|. # void aesgcmsiv_htable6_init(uint8_t out_htable[16*6], uint8_t *H); # my $Htbl = "%rdi"; my $H = "%rsi"; my $T = "%xmm0"; my $TMP0 = "%xmm1"; $code.=<<___; .globl aesgcmsiv_htable6_init .type aesgcmsiv_htable6_init,\@function,2 .align 16 aesgcmsiv_htable6_init: .cfi_startproc vmovdqa ($H), $T vmovdqa $T, $TMP0 vmovdqa $T, ($Htbl) # H call GFMUL vmovdqa $T, 16($Htbl) # H^2 call GFMUL vmovdqa $T, 32($Htbl) # H^3 call GFMUL vmovdqa $T, 48($Htbl) # H^4 call GFMUL vmovdqa $T, 64($Htbl) # H^5 call GFMUL vmovdqa $T, 80($Htbl) # H^6 ret .cfi_endproc .size aesgcmsiv_htable6_init, .-aesgcmsiv_htable6_init ___ } aesgcmsiv_htable6_init(); sub aesgcmsiv_htable_polyval { # void aesgcmsiv_htable_polyval(uint8_t Htbl[16*8], uint8_t *MSG, uint64_t LEN, uint8_t *T); # parameter 1: %rdi Htable - pointer to Htable # parameter 2: %rsi INp - pointer to input # parameter 3: %rdx LEN - length of BUFFER in bytes # parameter 4: %rcx T - pointer to POLYVAL output my $DATA = "%xmm0"; my $hlp0 = "%r11"; my $Htbl = "%rdi"; my $inp = "%rsi"; my $len = "%rdx"; my $TMP0 = "%xmm3"; my $TMP1 = "%xmm4"; my $TMP2 = "%xmm5"; my $TMP3 = "%xmm6"; my $TMP4 = "%xmm7"; my $Tp = "%rcx"; my $T = "%xmm1"; my $Xhi = "%xmm9"; my $SCHOOLBOOK_AAD = sub { my ($i)=@_; return <<___; vpclmulqdq \$0x01, ${\eval(16*$i)}($Htbl), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpclmulqdq \$0x00, ${\eval(16*$i)}($Htbl), $DATA, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpclmulqdq \$0x11, ${\eval(16*$i)}($Htbl), $DATA, $TMP3 vpxor $TMP3, $TMP1, $TMP1 vpclmulqdq \$0x10, ${\eval(16*$i)}($Htbl), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 ___ }; $code.=<<___; .globl aesgcmsiv_htable_polyval .type aesgcmsiv_htable_polyval,\@function,4 .align 16 aesgcmsiv_htable_polyval: .cfi_startproc test $len, $len jnz .Lhtable_polyval_start ret .Lhtable_polyval_start: vzeroall # We hash 8 blocks each iteration. If the total number of blocks is not a # multiple of 8, we first hash the leading n%8 blocks. movq $len, $hlp0 andq \$127, $hlp0 jz .Lhtable_polyval_no_prefix vpxor $Xhi, $Xhi, $Xhi vmovdqa ($Tp), $T sub $hlp0, $len sub \$16, $hlp0 # hash first prefix block vmovdqu ($inp), $DATA vpxor $T, $DATA, $DATA vpclmulqdq \$0x01, ($Htbl,$hlp0), $DATA, $TMP2 vpclmulqdq \$0x00, ($Htbl,$hlp0), $DATA, $TMP0 vpclmulqdq \$0x11, ($Htbl,$hlp0), $DATA, $TMP1 vpclmulqdq \$0x10, ($Htbl,$hlp0), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 lea 16($inp), $inp test $hlp0, $hlp0 jnz .Lhtable_polyval_prefix_loop jmp .Lhtable_polyval_prefix_complete # hash remaining prefix bocks (up to 7 total prefix blocks) .align 64 .Lhtable_polyval_prefix_loop: sub \$16, $hlp0 vmovdqu ($inp), $DATA # next data block vpclmulqdq \$0x00, ($Htbl,$hlp0), $DATA, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpclmulqdq \$0x11, ($Htbl,$hlp0), $DATA, $TMP3 vpxor $TMP3, $TMP1, $TMP1 vpclmulqdq \$0x01, ($Htbl,$hlp0), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpclmulqdq \$0x10, ($Htbl,$hlp0), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 test $hlp0, $hlp0 lea 16($inp), $inp jnz .Lhtable_polyval_prefix_loop .Lhtable_polyval_prefix_complete: vpsrldq \$8, $TMP2, $TMP3 vpslldq \$8, $TMP2, $TMP2 vpxor $TMP3, $TMP1, $Xhi vpxor $TMP2, $TMP0, $T jmp .Lhtable_polyval_main_loop .Lhtable_polyval_no_prefix: # At this point we know the number of blocks is a multiple of 8. However, # the reduction in the main loop includes a multiplication by x^(-128). In # order to counter this, the existing tag needs to be multipled by x^128. # In practice, this just means that it is loaded into $Xhi, not $T. vpxor $T, $T, $T vmovdqa ($Tp), $Xhi .align 64 .Lhtable_polyval_main_loop: sub \$0x80, $len jb .Lhtable_polyval_out vmovdqu 16*7($inp), $DATA # Ii vpclmulqdq \$0x01, ($Htbl), $DATA, $TMP2 vpclmulqdq \$0x00, ($Htbl), $DATA, $TMP0 vpclmulqdq \$0x11, ($Htbl), $DATA, $TMP1 vpclmulqdq \$0x10, ($Htbl), $DATA, $TMP3 vpxor $TMP3, $TMP2, $TMP2 ######################################################### vmovdqu 16*6($inp), $DATA ${\$SCHOOLBOOK_AAD->(1)} ######################################################### vmovdqu 16*5($inp), $DATA vpclmulqdq \$0x10, poly(%rip), $T, $TMP4 # reduction stage 1a vpalignr \$8, $T, $T, $T ${\$SCHOOLBOOK_AAD->(2)} vpxor $TMP4, $T, $T # reduction stage 1b ######################################################### vmovdqu 16*4($inp), $DATA ${\$SCHOOLBOOK_AAD->(3)} ######################################################### vmovdqu 16*3($inp), $DATA vpclmulqdq \$0x10, poly(%rip), $T, $TMP4 # reduction stage 2a vpalignr \$8, $T, $T, $T ${\$SCHOOLBOOK_AAD->(4)} vpxor $TMP4, $T, $T # reduction stage 2b ######################################################### vmovdqu 16*2($inp), $DATA ${\$SCHOOLBOOK_AAD->(5)} vpxor $Xhi, $T, $T # reduction finalize ######################################################### vmovdqu 16*1($inp), $DATA ${\$SCHOOLBOOK_AAD->(6)} ######################################################### vmovdqu 16*0($inp), $DATA vpxor $T, $DATA, $DATA ${\$SCHOOLBOOK_AAD->(7)} ######################################################### vpsrldq \$8, $TMP2, $TMP3 vpslldq \$8, $TMP2, $TMP2 vpxor $TMP3, $TMP1, $Xhi vpxor $TMP2, $TMP0, $T lea 16*8($inp), $inp jmp .Lhtable_polyval_main_loop ######################################################### .Lhtable_polyval_out: vpclmulqdq \$0x10, poly(%rip), $T, $TMP3 vpalignr \$8, $T, $T, $T vpxor $TMP3, $T, $T vpclmulqdq \$0x10, poly(%rip), $T, $TMP3 vpalignr \$8, $T, $T, $T vpxor $TMP3, $T, $T vpxor $Xhi, $T, $T vmovdqu $T, ($Tp) vzeroupper ret .cfi_endproc .size aesgcmsiv_htable_polyval,.-aesgcmsiv_htable_polyval ___ } aesgcmsiv_htable_polyval(); sub aesgcmsiv_polyval_horner { #void aesgcmsiv_polyval_horner(unsigned char T[16], // output # const unsigned char* H, // H # unsigned char* BUF, // Buffer # unsigned int blocks); // Len2 # # parameter 1: %rdi T - pointers to POLYVAL output # parameter 2: %rsi Hp - pointer to H (user key) # parameter 3: %rdx INp - pointer to input # parameter 4: %rcx L - total number of blocks in input BUFFER # my $T = "%rdi"; my $Hp = "%rsi"; my $INp = "%rdx"; my $L = "%rcx"; my $LOC = "%r10"; my $LEN = "%eax"; my $H = "%xmm1"; my $RES = "%xmm0"; $code.=<<___; .globl aesgcmsiv_polyval_horner .type aesgcmsiv_polyval_horner,\@function,4 .align 16 aesgcmsiv_polyval_horner: .cfi_startproc test $L, $L jnz .Lpolyval_horner_start ret .Lpolyval_horner_start: # We will start with L GFMULS for POLYVAL(BIG_BUFFER) # RES = GFMUL(RES, H) xorq $LOC, $LOC shlq \$4, $L # L contains number of bytes to process vmovdqa ($Hp), $H vmovdqa ($T), $RES .Lpolyval_horner_loop: vpxor ($INp,$LOC), $RES, $RES # RES = RES + Xi call GFMUL # RES = RES * H add \$16, $LOC cmp $LOC, $L jne .Lpolyval_horner_loop # calculation of T is complete. RES=T vmovdqa $RES, ($T) ret .cfi_endproc .size aesgcmsiv_polyval_horner,.-aesgcmsiv_polyval_horner ___ } aesgcmsiv_polyval_horner(); # void aes128gcmsiv_aes_ks(const uint8_t *key, uint8_t *out_expanded_key); # parameter 1: %rdi # parameter 2: %rsi $code.=<<___; .globl aes128gcmsiv_aes_ks .type aes128gcmsiv_aes_ks,\@function,2 .align 16 aes128gcmsiv_aes_ks: .cfi_startproc vmovdqu (%rdi), %xmm1 # xmm1 = user key vmovdqa %xmm1, (%rsi) # rsi points to output vmovdqa con1(%rip), %xmm0 vmovdqa mask(%rip), %xmm15 movq \$8, %rax .Lks128_loop: addq \$16, %rsi # rsi points for next key subq \$1, %rax vpshufb %xmm15, %xmm1, %xmm2 # xmm2 = shuffled user key vaesenclast %xmm0, %xmm2, %xmm2 vpslld \$1, %xmm0, %xmm0 vpslldq \$4, %xmm1, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vmovdqa %xmm1, (%rsi) jne .Lks128_loop vmovdqa con2(%rip), %xmm0 vpshufb %xmm15, %xmm1, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslld \$1, %xmm0, %xmm0 vpslldq \$4, %xmm1, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vmovdqa %xmm1, 16(%rsi) vpshufb %xmm15, %xmm1, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslldq \$4, %xmm1, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpslldq \$4, %xmm3, %xmm3 vpxor %xmm3, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vmovdqa %xmm1, 32(%rsi) ret .cfi_endproc .size aes128gcmsiv_aes_ks,.-aes128gcmsiv_aes_ks ___ # void aes256gcmsiv_aes_ks(const uint8_t *key, uint8_t *out_expanded_key); # parameter 1: %rdi # parameter 2: %rsi $code.=<<___; .globl aes256gcmsiv_aes_ks .type aes256gcmsiv_aes_ks,\@function,2 .align 16 aes256gcmsiv_aes_ks: .cfi_startproc vmovdqu (%rdi), %xmm1 vmovdqu 16(%rdi), %xmm3 vmovdqa %xmm1, (%rsi) vmovdqa %xmm3, 16(%rsi) vmovdqa con1(%rip), %xmm0 vmovdqa mask(%rip), %xmm15 vpxor %xmm14, %xmm14, %xmm14 mov \$6, %rax .Lks256_loop: add \$32, %rsi subq \$1, %rax vpshufb %xmm15, %xmm3, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslld \$1, %xmm0, %xmm0 vpsllq \$32, %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpshufb con3(%rip), %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vmovdqa %xmm1, (%rsi) vpshufd \$0xff, %xmm1, %xmm2 vaesenclast %xmm14, %xmm2, %xmm2 vpsllq \$32, %xmm3, %xmm4 vpxor %xmm4, %xmm3, %xmm3 vpshufb con3(%rip), %xmm3, %xmm4 vpxor %xmm4, %xmm3, %xmm3 vpxor %xmm2, %xmm3, %xmm3 vmovdqa %xmm3, 16(%rsi) jne .Lks256_loop vpshufb %xmm15, %xmm3, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpsllq \$32, %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpshufb con3(%rip), %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vmovdqa %xmm1, 32(%rsi) ret .cfi_endproc ___ sub aes128gcmsiv_aes_ks_enc_x1 { my $KS1_REGA = "%xmm1"; my $KS1_REGB = "%xmm2"; my $BLOCK1 = "%xmm4"; my $AUXREG = "%xmm3"; my $KS_BLOCK = sub { my ($reg, $reg2, $auxReg) = @_; return <<___; vpsllq \$32, $reg, $auxReg #!!saving mov instruction to xmm3 vpxor $auxReg, $reg, $reg vpshufb con3(%rip), $reg, $auxReg vpxor $auxReg, $reg, $reg vpxor $reg2, $reg, $reg ___ }; my $round = sub { my ($i, $j) = @_; return <<___; vpshufb %xmm15, %xmm1, %xmm2 #!!saving mov instruction to xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslld \$1, %xmm0, %xmm0 ${\$KS_BLOCK->($KS1_REGA, $KS1_REGB, $AUXREG)} vaesenc %xmm1, $BLOCK1, $BLOCK1 vmovdqa %xmm1, ${\eval(16*$i)}($j) ___ }; my $roundlast = sub { my ($i, $j) = @_; return <<___; vpshufb %xmm15, %xmm1, %xmm2 #!!saving mov instruction to xmm2 vaesenclast %xmm0, %xmm2, %xmm2 ${\$KS_BLOCK->($KS1_REGA, $KS1_REGB, $AUXREG)} vaesenclast %xmm1, $BLOCK1, $BLOCK1 vmovdqa %xmm1, ${\eval(16*$i)}($j) ___ }; # parameter 1: %rdi Pointer to PT # parameter 2: %rsi Pointer to CT # parameter 4: %rdx Pointer to keys # parameter 5: %rcx Pointer to initial key $code.=<<___; .globl aes128gcmsiv_aes_ks_enc_x1 .type aes128gcmsiv_aes_ks_enc_x1,\@function,4 .align 16 aes128gcmsiv_aes_ks_enc_x1: .cfi_startproc vmovdqa (%rcx), %xmm1 # xmm1 = first 16 bytes of random key vmovdqa 0*16(%rdi), $BLOCK1 vmovdqa %xmm1, (%rdx) # KEY[0] = first 16 bytes of random key vpxor %xmm1, $BLOCK1, $BLOCK1 vmovdqa con1(%rip), %xmm0 # xmm0 = 1,1,1,1 vmovdqa mask(%rip), %xmm15 # xmm15 = mask ${\$round->(1, "%rdx")} ${\$round->(2, "%rdx")} ${\$round->(3, "%rdx")} ${\$round->(4, "%rdx")} ${\$round->(5, "%rdx")} ${\$round->(6, "%rdx")} ${\$round->(7, "%rdx")} ${\$round->(8, "%rdx")} vmovdqa con2(%rip), %xmm0 ${\$round->(9, "%rdx")} ${\$roundlast->(10, "%rdx")} vmovdqa $BLOCK1, 0*16(%rsi) ret .cfi_endproc .size aes128gcmsiv_aes_ks_enc_x1,.-aes128gcmsiv_aes_ks_enc_x1 ___ } aes128gcmsiv_aes_ks_enc_x1(); sub aes128gcmsiv_kdf { my $BLOCK1 = "%xmm9"; my $BLOCK2 = "%xmm10"; my $BLOCK3 = "%xmm11"; my $BLOCK4 = "%xmm12"; my $BLOCK5 = "%xmm13"; my $BLOCK6 = "%xmm14"; my $ONE = "%xmm13"; my $KSp = "%rdx"; my $STATE_1 = "%xmm1"; my $enc_roundx4 = sub { my ($i, $j) = @_; return <<___; vmovdqa ${\eval($i*16)}(%rdx), $j vaesenc $j, $BLOCK1, $BLOCK1 vaesenc $j, $BLOCK2, $BLOCK2 vaesenc $j, $BLOCK3, $BLOCK3 vaesenc $j, $BLOCK4, $BLOCK4 ___ }; my $enc_roundlastx4 = sub { my ($i, $j) = @_; return <<___; vmovdqa ${\eval($i*16)}(%rdx), $j vaesenclast $j, $BLOCK1, $BLOCK1 vaesenclast $j, $BLOCK2, $BLOCK2 vaesenclast $j, $BLOCK3, $BLOCK3 vaesenclast $j, $BLOCK4, $BLOCK4 ___ }; # void aes128gcmsiv_kdf(const uint8_t nonce[16], # uint8_t *out_key_material, # const uint8_t *key_schedule); $code.=<<___; .globl aes128gcmsiv_kdf .type aes128gcmsiv_kdf,\@function,3 .align 16 aes128gcmsiv_kdf: .cfi_startproc # parameter 1: %rdi Pointer to NONCE # parameter 2: %rsi Pointer to CT # parameter 4: %rdx Pointer to keys vmovdqa (%rdx), %xmm1 # xmm1 = first 16 bytes of random key vmovdqa 0*16(%rdi), $BLOCK1 vmovdqa and_mask(%rip), $BLOCK4 vmovdqa one(%rip), $ONE vpshufd \$0x90, $BLOCK1, $BLOCK1 vpand $BLOCK4, $BLOCK1, $BLOCK1 vpaddd $ONE, $BLOCK1, $BLOCK2 vpaddd $ONE, $BLOCK2, $BLOCK3 vpaddd $ONE, $BLOCK3, $BLOCK4 vpxor %xmm1, $BLOCK1, $BLOCK1 vpxor %xmm1, $BLOCK2, $BLOCK2 vpxor %xmm1, $BLOCK3, $BLOCK3 vpxor %xmm1, $BLOCK4, $BLOCK4 ${\$enc_roundx4->(1, "%xmm1")} ${\$enc_roundx4->(2, "%xmm2")} ${\$enc_roundx4->(3, "%xmm1")} ${\$enc_roundx4->(4, "%xmm2")} ${\$enc_roundx4->(5, "%xmm1")} ${\$enc_roundx4->(6, "%xmm2")} ${\$enc_roundx4->(7, "%xmm1")} ${\$enc_roundx4->(8, "%xmm2")} ${\$enc_roundx4->(9, "%xmm1")} ${\$enc_roundlastx4->(10, "%xmm2")} vmovdqa $BLOCK1, 0*16(%rsi) vmovdqa $BLOCK2, 1*16(%rsi) vmovdqa $BLOCK3, 2*16(%rsi) vmovdqa $BLOCK4, 3*16(%rsi) ret .cfi_endproc .size aes128gcmsiv_kdf,.-aes128gcmsiv_kdf ___ } aes128gcmsiv_kdf(); sub aes128gcmsiv_enc_msg_x4 { my $CTR1 = "%xmm0"; my $CTR2 = "%xmm1"; my $CTR3 = "%xmm2"; my $CTR4 = "%xmm3"; my $ADDER = "%xmm4"; my $STATE1 = "%xmm5"; my $STATE2 = "%xmm6"; my $STATE3 = "%xmm7"; my $STATE4 = "%xmm8"; my $TMP = "%xmm12"; my $TMP2 = "%xmm13"; my $TMP3 = "%xmm14"; my $IV = "%xmm15"; my $PT = "%rdi"; my $CT = "%rsi"; my $TAG = "%rdx"; my $KS = "%rcx"; my $LEN = "%r8"; my $aes_round = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP vaesenc $TMP, $STATE1, $STATE1 vaesenc $TMP, $STATE2, $STATE2 vaesenc $TMP, $STATE3, $STATE3 vaesenc $TMP, $STATE4, $STATE4 ___ }; my $aes_lastround = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP vaesenclast $TMP, $STATE1, $STATE1 vaesenclast $TMP, $STATE2, $STATE2 vaesenclast $TMP, $STATE3, $STATE3 vaesenclast $TMP, $STATE4, $STATE4 ___ }; # void aes128gcmsiv_enc_msg_x4(unsigned char* PT, unsigned char* CT, # unsigned char* TAG, unsigned char* KS, # size_t byte_len); # parameter 1: %rdi #PT # parameter 2: %rsi #CT # parameter 3: %rdx #TAG [127 126 ... 0] IV=[127...32] # parameter 4: %rcx #KS # parameter 5: %r8 #LEN MSG_length in bytes $code.=<<___; .globl aes128gcmsiv_enc_msg_x4 .type aes128gcmsiv_enc_msg_x4,\@function,5 .align 16 aes128gcmsiv_enc_msg_x4: .cfi_startproc test $LEN, $LEN jnz .L128_enc_msg_x4_start ret .L128_enc_msg_x4_start: pushq %r12 .cfi_push %r12 pushq %r13 .cfi_push %r13 shrq \$4, $LEN # LEN = num of blocks movq $LEN, %r10 shlq \$62, %r10 shrq \$62, %r10 # make IV from TAG vmovdqa ($TAG), $IV vpor OR_MASK(%rip), $IV, $IV #IV = [1]TAG[126...32][00..00] vmovdqu four(%rip), $ADDER # Register to increment counters vmovdqa $IV, $CTR1 # CTR1 = TAG[1][127...32][00..00] vpaddd one(%rip), $IV, $CTR2 # CTR2 = TAG[1][127...32][00..01] vpaddd two(%rip), $IV, $CTR3 # CTR3 = TAG[1][127...32][00..02] vpaddd three(%rip), $IV, $CTR4 # CTR4 = TAG[1][127...32][00..03] shrq \$2, $LEN je .L128_enc_msg_x4_check_remainder subq \$64, $CT subq \$64, $PT .L128_enc_msg_x4_loop1: addq \$64, $CT addq \$64, $PT vmovdqa $CTR1, $STATE1 vmovdqa $CTR2, $STATE2 vmovdqa $CTR3, $STATE3 vmovdqa $CTR4, $STATE4 vpxor ($KS), $STATE1, $STATE1 vpxor ($KS), $STATE2, $STATE2 vpxor ($KS), $STATE3, $STATE3 vpxor ($KS), $STATE4, $STATE4 ${\$aes_round->(1)} vpaddd $ADDER, $CTR1, $CTR1 ${\$aes_round->(2)} vpaddd $ADDER, $CTR2, $CTR2 ${\$aes_round->(3)} vpaddd $ADDER, $CTR3, $CTR3 ${\$aes_round->(4)} vpaddd $ADDER, $CTR4, $CTR4 ${\$aes_round->(5)} ${\$aes_round->(6)} ${\$aes_round->(7)} ${\$aes_round->(8)} ${\$aes_round->(9)} ${\$aes_lastround->(10)} # XOR with Plaintext vpxor 0*16($PT), $STATE1, $STATE1 vpxor 1*16($PT), $STATE2, $STATE2 vpxor 2*16($PT), $STATE3, $STATE3 vpxor 3*16($PT), $STATE4, $STATE4 subq \$1, $LEN vmovdqu $STATE1, 0*16($CT) vmovdqu $STATE2, 1*16($CT) vmovdqu $STATE3, 2*16($CT) vmovdqu $STATE4, 3*16($CT) jne .L128_enc_msg_x4_loop1 addq \$64,$CT addq \$64,$PT .L128_enc_msg_x4_check_remainder: cmpq \$0, %r10 je .L128_enc_msg_x4_out .L128_enc_msg_x4_loop2: # enc each block separately # CTR1 is the highest counter (even if no LOOP done) vmovdqa $CTR1, $STATE1 vpaddd one(%rip), $CTR1, $CTR1 # inc counter vpxor ($KS), $STATE1, $STATE1 vaesenc 16($KS), $STATE1, $STATE1 vaesenc 32($KS), $STATE1, $STATE1 vaesenc 48($KS), $STATE1, $STATE1 vaesenc 64($KS), $STATE1, $STATE1 vaesenc 80($KS), $STATE1, $STATE1 vaesenc 96($KS), $STATE1, $STATE1 vaesenc 112($KS), $STATE1, $STATE1 vaesenc 128($KS), $STATE1, $STATE1 vaesenc 144($KS), $STATE1, $STATE1 vaesenclast 160($KS), $STATE1, $STATE1 # XOR with plaintext vpxor ($PT), $STATE1, $STATE1 vmovdqu $STATE1, ($CT) addq \$16, $PT addq \$16, $CT subq \$1, %r10 jne .L128_enc_msg_x4_loop2 .L128_enc_msg_x4_out: popq %r13 .cfi_pop %r13 popq %r12 .cfi_pop %r12 ret .cfi_endproc .size aes128gcmsiv_enc_msg_x4,.-aes128gcmsiv_enc_msg_x4 ___ } aes128gcmsiv_enc_msg_x4(); sub aes128gcmsiv_enc_msg_x8 { my $STATE1 = "%xmm1"; my $STATE2 = "%xmm2"; my $STATE3 = "%xmm3"; my $STATE4 = "%xmm4"; my $STATE5 = "%xmm5"; my $STATE6 = "%xmm6"; my $STATE7 = "%xmm7"; my $STATE8 = "%xmm8"; my $CTR1 = "%xmm0"; my $CTR2 = "%xmm9"; my $CTR3 = "%xmm10"; my $CTR4 = "%xmm11"; my $CTR5 = "%xmm12"; my $CTR6 = "%xmm13"; my $CTR7 = "%xmm14"; my $SCHED = "%xmm15"; my $TMP1 = "%xmm1"; my $TMP2 = "%xmm2"; my $PT = "%rdi"; my $CT = "%rsi"; my $TAG = "%rdx"; my $KS = "%rcx"; my $LEN = "%r8"; my $aes_round8 = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $SCHED vaesenc $SCHED, $STATE1, $STATE1 vaesenc $SCHED, $STATE2, $STATE2 vaesenc $SCHED, $STATE3, $STATE3 vaesenc $SCHED, $STATE4, $STATE4 vaesenc $SCHED, $STATE5, $STATE5 vaesenc $SCHED, $STATE6, $STATE6 vaesenc $SCHED, $STATE7, $STATE7 vaesenc $SCHED, $STATE8, $STATE8 ___ }; my $aes_lastround8 = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $SCHED vaesenclast $SCHED, $STATE1, $STATE1 vaesenclast $SCHED, $STATE2, $STATE2 vaesenclast $SCHED, $STATE3, $STATE3 vaesenclast $SCHED, $STATE4, $STATE4 vaesenclast $SCHED, $STATE5, $STATE5 vaesenclast $SCHED, $STATE6, $STATE6 vaesenclast $SCHED, $STATE7, $STATE7 vaesenclast $SCHED, $STATE8, $STATE8 ___ }; # void ENC_MSG_x8(unsigned char* PT, # unsigned char* CT, # unsigned char* TAG, # unsigned char* KS, # size_t byte_len); # parameter 1: %rdi #PT # parameter 2: %rsi #CT # parameter 3: %rdx #TAG [127 126 ... 0] IV=[127...32] # parameter 4: %rcx #KS # parameter 5: %r8 #LEN MSG_length in bytes $code.=<<___; .globl aes128gcmsiv_enc_msg_x8 .type aes128gcmsiv_enc_msg_x8,\@function,5 .align 16 aes128gcmsiv_enc_msg_x8: .cfi_startproc test $LEN, $LEN jnz .L128_enc_msg_x8_start ret .L128_enc_msg_x8_start: pushq %r12 .cfi_push %r12 pushq %r13 .cfi_push %r13 pushq %rbp .cfi_push %rbp movq %rsp, %rbp .cfi_def_cfa_register rbp # Place in stack subq \$128, %rsp andq \$-64, %rsp shrq \$4, $LEN # LEN = num of blocks movq $LEN, %r10 shlq \$61, %r10 shrq \$61, %r10 # make IV from TAG vmovdqu ($TAG), $TMP1 vpor OR_MASK(%rip), $TMP1, $TMP1 # TMP1= IV = [1]TAG[126...32][00..00] # store counter8 in the stack vpaddd seven(%rip), $TMP1, $CTR1 vmovdqu $CTR1, (%rsp) # CTR8 = TAG[127...32][00..07] vpaddd one(%rip), $TMP1, $CTR2 # CTR2 = TAG[127...32][00..01] vpaddd two(%rip), $TMP1, $CTR3 # CTR3 = TAG[127...32][00..02] vpaddd three(%rip), $TMP1, $CTR4 # CTR4 = TAG[127...32][00..03] vpaddd four(%rip), $TMP1, $CTR5 # CTR5 = TAG[127...32][00..04] vpaddd five(%rip), $TMP1, $CTR6 # CTR6 = TAG[127...32][00..05] vpaddd six(%rip), $TMP1, $CTR7 # CTR7 = TAG[127...32][00..06] vmovdqa $TMP1, $CTR1 # CTR1 = TAG[127...32][00..00] shrq \$3, $LEN je .L128_enc_msg_x8_check_remainder subq \$128, $CT subq \$128, $PT .L128_enc_msg_x8_loop1: addq \$128, $CT addq \$128, $PT vmovdqa $CTR1, $STATE1 vmovdqa $CTR2, $STATE2 vmovdqa $CTR3, $STATE3 vmovdqa $CTR4, $STATE4 vmovdqa $CTR5, $STATE5 vmovdqa $CTR6, $STATE6 vmovdqa $CTR7, $STATE7 # move from stack vmovdqu (%rsp), $STATE8 vpxor ($KS), $STATE1, $STATE1 vpxor ($KS), $STATE2, $STATE2 vpxor ($KS), $STATE3, $STATE3 vpxor ($KS), $STATE4, $STATE4 vpxor ($KS), $STATE5, $STATE5 vpxor ($KS), $STATE6, $STATE6 vpxor ($KS), $STATE7, $STATE7 vpxor ($KS), $STATE8, $STATE8 ${\$aes_round8->(1)} vmovdqu (%rsp), $CTR7 # deal with CTR8 vpaddd eight(%rip), $CTR7, $CTR7 vmovdqu $CTR7, (%rsp) ${\$aes_round8->(2)} vpsubd one(%rip), $CTR7, $CTR7 ${\$aes_round8->(3)} vpaddd eight(%rip), $CTR1, $CTR1 ${\$aes_round8->(4)} vpaddd eight(%rip), $CTR2, $CTR2 ${\$aes_round8->(5)} vpaddd eight(%rip), $CTR3, $CTR3 ${\$aes_round8->(6)} vpaddd eight(%rip), $CTR4, $CTR4 ${\$aes_round8->(7)} vpaddd eight(%rip), $CTR5, $CTR5 ${\$aes_round8->(8)} vpaddd eight(%rip), $CTR6, $CTR6 ${\$aes_round8->(9)} ${\$aes_lastround8->(10)} # XOR with Plaintext vpxor 0*16($PT), $STATE1, $STATE1 vpxor 1*16($PT), $STATE2, $STATE2 vpxor 2*16($PT), $STATE3, $STATE3 vpxor 3*16($PT), $STATE4, $STATE4 vpxor 4*16($PT), $STATE5, $STATE5 vpxor 5*16($PT), $STATE6, $STATE6 vpxor 6*16($PT), $STATE7, $STATE7 vpxor 7*16($PT), $STATE8, $STATE8 dec $LEN vmovdqu $STATE1, 0*16($CT) vmovdqu $STATE2, 1*16($CT) vmovdqu $STATE3, 2*16($CT) vmovdqu $STATE4, 3*16($CT) vmovdqu $STATE5, 4*16($CT) vmovdqu $STATE6, 5*16($CT) vmovdqu $STATE7, 6*16($CT) vmovdqu $STATE8, 7*16($CT) jne .L128_enc_msg_x8_loop1 addq \$128, $CT addq \$128, $PT .L128_enc_msg_x8_check_remainder: cmpq \$0, %r10 je .L128_enc_msg_x8_out .L128_enc_msg_x8_loop2: # enc each block separately # CTR1 is the highest counter (even if no LOOP done) vmovdqa $CTR1, $STATE1 vpaddd one(%rip), $CTR1, $CTR1 # inc counter vpxor ($KS), $STATE1, $STATE1 vaesenc 16($KS), $STATE1, $STATE1 vaesenc 32($KS), $STATE1, $STATE1 vaesenc 48($KS), $STATE1, $STATE1 vaesenc 64($KS), $STATE1, $STATE1 vaesenc 80($KS), $STATE1, $STATE1 vaesenc 96($KS), $STATE1, $STATE1 vaesenc 112($KS), $STATE1, $STATE1 vaesenc 128($KS), $STATE1, $STATE1 vaesenc 144($KS), $STATE1, $STATE1 vaesenclast 160($KS), $STATE1, $STATE1 # XOR with Plaintext vpxor ($PT), $STATE1, $STATE1 vmovdqu $STATE1, ($CT) addq \$16, $PT addq \$16, $CT decq %r10 jne .L128_enc_msg_x8_loop2 .L128_enc_msg_x8_out: movq %rbp, %rsp .cfi_def_cfa_register %rsp popq %rbp .cfi_pop %rbp popq %r13 .cfi_pop %r13 popq %r12 .cfi_pop %r12 ret .cfi_endproc .size aes128gcmsiv_enc_msg_x8,.-aes128gcmsiv_enc_msg_x8 ___ } aes128gcmsiv_enc_msg_x8(); sub aesgcmsiv_dec { my ($aes256) = @_; my $T = "%xmm0"; my $TMP0 = "%xmm1"; my $TMP1 = "%xmm2"; my $TMP2 = "%xmm3"; my $TMP3 = "%xmm4"; my $TMP4 = "%xmm5"; my $TMP5 = "%xmm6"; my $CTR1 = "%xmm7"; my $CTR2 = "%xmm8"; my $CTR3 = "%xmm9"; my $CTR4 = "%xmm10"; my $CTR5 = "%xmm11"; my $CTR6 = "%xmm12"; my $CTR = "%xmm15"; my $CT = "%rdi"; my $PT = "%rsi"; my $POL = "%rdx"; my $Htbl = "%rcx"; my $KS = "%r8"; my $LEN = "%r9"; my $secureBuffer = "%rax"; my $HTABLE_ROUNDS = "%xmm13"; my $labelPrefix = "128"; if ($aes256) { $labelPrefix = "256"; } my $aes_round_dec = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP3 vaesenc $TMP3, $CTR1, $CTR1 vaesenc $TMP3, $CTR2, $CTR2 vaesenc $TMP3, $CTR3, $CTR3 vaesenc $TMP3, $CTR4, $CTR4 vaesenc $TMP3, $CTR5, $CTR5 vaesenc $TMP3, $CTR6, $CTR6 ___ }; my $aes_lastround_dec = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP3 vaesenclast $TMP3, $CTR1, $CTR1 vaesenclast $TMP3, $CTR2, $CTR2 vaesenclast $TMP3, $CTR3, $CTR3 vaesenclast $TMP3, $CTR4, $CTR4 vaesenclast $TMP3, $CTR5, $CTR5 vaesenclast $TMP3, $CTR6, $CTR6 ___ }; my $schoolbook = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16-32)}($secureBuffer), $TMP5 vmovdqu ${\eval($i*16-32)}($Htbl), $HTABLE_ROUNDS vpclmulqdq \$0x10, $HTABLE_ROUNDS, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpclmulqdq \$0x11, $HTABLE_ROUNDS, $TMP5, $TMP3 vpxor $TMP3, $TMP1, $TMP1 vpclmulqdq \$0x00, $HTABLE_ROUNDS, $TMP5, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpclmulqdq \$0x01, $HTABLE_ROUNDS, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 ___ }; if ($aes256) { $code.=<<___; .globl aes256gcmsiv_dec .type aes256gcmsiv_dec,\@function,6 .align 16 aes256gcmsiv_dec: ___ } else { $code.=<<___; .globl aes128gcmsiv_dec .type aes128gcmsiv_dec,\@function,6 .align 16 aes128gcmsiv_dec: ___ } $code.=<<___; .cfi_startproc test \$~15, $LEN jnz .L${labelPrefix}_dec_start ret .L${labelPrefix}_dec_start: vzeroupper vmovdqa ($POL), $T movq $POL, $secureBuffer leaq 32($secureBuffer), $secureBuffer leaq 32($Htbl), $Htbl # make CTRBLKs from given tag. vmovdqu ($CT,$LEN), $CTR vpor OR_MASK(%rip), $CTR, $CTR # CTR = [1]TAG[126...32][00..00] andq \$~15, $LEN # If less then 6 blocks, make singles cmp \$96, $LEN jb .L${labelPrefix}_dec_loop2 # Decrypt the first six blocks sub \$96, $LEN vmovdqa $CTR, $CTR1 vpaddd one(%rip), $CTR1, $CTR2 vpaddd two(%rip), $CTR1, $CTR3 vpaddd one(%rip), $CTR3, $CTR4 vpaddd two(%rip), $CTR3, $CTR5 vpaddd one(%rip), $CTR5, $CTR6 vpaddd two(%rip), $CTR5, $CTR vpxor ($KS), $CTR1, $CTR1 vpxor ($KS), $CTR2, $CTR2 vpxor ($KS), $CTR3, $CTR3 vpxor ($KS), $CTR4, $CTR4 vpxor ($KS), $CTR5, $CTR5 vpxor ($KS), $CTR6, $CTR6 ${\$aes_round_dec->(1)} ${\$aes_round_dec->(2)} ${\$aes_round_dec->(3)} ${\$aes_round_dec->(4)} ${\$aes_round_dec->(5)} ${\$aes_round_dec->(6)} ${\$aes_round_dec->(7)} ${\$aes_round_dec->(8)} ${\$aes_round_dec->(9)} ___ if ($aes256) { $code.=<<___; ${\$aes_round_dec->(10)} ${\$aes_round_dec->(11)} ${\$aes_round_dec->(12)} ${\$aes_round_dec->(13)} ${\$aes_lastround_dec->(14)} ___ } else { $code.=<<___; ${\$aes_lastround_dec->(10)} ___ } $code.=<<___; # XOR with CT vpxor 0*16($CT), $CTR1, $CTR1 vpxor 1*16($CT), $CTR2, $CTR2 vpxor 2*16($CT), $CTR3, $CTR3 vpxor 3*16($CT), $CTR4, $CTR4 vpxor 4*16($CT), $CTR5, $CTR5 vpxor 5*16($CT), $CTR6, $CTR6 vmovdqu $CTR1, 0*16($PT) vmovdqu $CTR2, 1*16($PT) vmovdqu $CTR3, 2*16($PT) vmovdqu $CTR4, 3*16($PT) vmovdqu $CTR5, 4*16($PT) vmovdqu $CTR6, 5*16($PT) addq \$96, $CT addq \$96, $PT jmp .L${labelPrefix}_dec_loop1 # Decrypt 6 blocks each time while hashing previous 6 blocks .align 64 .L${labelPrefix}_dec_loop1: cmp \$96, $LEN jb .L${labelPrefix}_dec_finish_96 sub \$96, $LEN vmovdqa $CTR6, $TMP5 vmovdqa $CTR5, 1*16-32($secureBuffer) vmovdqa $CTR4, 2*16-32($secureBuffer) vmovdqa $CTR3, 3*16-32($secureBuffer) vmovdqa $CTR2, 4*16-32($secureBuffer) vmovdqa $CTR1, 5*16-32($secureBuffer) vmovdqa $CTR, $CTR1 vpaddd one(%rip), $CTR1, $CTR2 vpaddd two(%rip), $CTR1, $CTR3 vpaddd one(%rip), $CTR3, $CTR4 vpaddd two(%rip), $CTR3, $CTR5 vpaddd one(%rip), $CTR5, $CTR6 vpaddd two(%rip), $CTR5, $CTR vmovdqa ($KS), $TMP3 vpxor $TMP3, $CTR1, $CTR1 vpxor $TMP3, $CTR2, $CTR2 vpxor $TMP3, $CTR3, $CTR3 vpxor $TMP3, $CTR4, $CTR4 vpxor $TMP3, $CTR5, $CTR5 vpxor $TMP3, $CTR6, $CTR6 vmovdqu 0*16-32($Htbl), $TMP3 vpclmulqdq \$0x11, $TMP3, $TMP5, $TMP1 vpclmulqdq \$0x00, $TMP3, $TMP5, $TMP2 vpclmulqdq \$0x01, $TMP3, $TMP5, $TMP0 vpclmulqdq \$0x10, $TMP3, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 ${\$aes_round_dec->(1)} ${\$schoolbook->(1)} ${\$aes_round_dec->(2)} ${\$schoolbook->(2)} ${\$aes_round_dec->(3)} ${\$schoolbook->(3)} ${\$aes_round_dec->(4)} ${\$schoolbook->(4)} ${\$aes_round_dec->(5)} ${\$aes_round_dec->(6)} ${\$aes_round_dec->(7)} vmovdqa 5*16-32($secureBuffer), $TMP5 vpxor $T, $TMP5, $TMP5 vmovdqu 5*16-32($Htbl), $TMP4 vpclmulqdq \$0x01, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpclmulqdq \$0x11, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP1, $TMP1 vpclmulqdq \$0x00, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpclmulqdq \$0x10, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 ${\$aes_round_dec->(8)} vpsrldq \$8, $TMP0, $TMP3 vpxor $TMP3, $TMP1, $TMP4 vpslldq \$8, $TMP0, $TMP3 vpxor $TMP3, $TMP2, $T vmovdqa poly(%rip), $TMP2 ${\$aes_round_dec->(9)} ___ if ($aes256) { $code.=<<___; ${\$aes_round_dec->(10)} ${\$aes_round_dec->(11)} ${\$aes_round_dec->(12)} ${\$aes_round_dec->(13)} vmovdqu 14*16($KS), $TMP5 ___ } else { $code.=<<___; vmovdqu 10*16($KS), $TMP5 ___ } $code.=<<___; vpalignr \$8, $T, $T, $TMP1 vpclmulqdq \$0x10, $TMP2, $T, $T vpxor $T, $TMP1, $T vpxor 0*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR1, $CTR1 vpxor 1*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR2, $CTR2 vpxor 2*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR3, $CTR3 vpxor 3*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR4, $CTR4 vpxor 4*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR5, $CTR5 vpxor 5*16($CT), $TMP5, $TMP3 vaesenclast $TMP3, $CTR6, $CTR6 vpalignr \$8, $T, $T, $TMP1 vpclmulqdq \$0x10, $TMP2, $T, $T vpxor $T, $TMP1, $T vmovdqu $CTR1, 0*16($PT) vmovdqu $CTR2, 1*16($PT) vmovdqu $CTR3, 2*16($PT) vmovdqu $CTR4, 3*16($PT) vmovdqu $CTR5, 4*16($PT) vmovdqu $CTR6, 5*16($PT) vpxor $TMP4, $T, $T lea 96($CT), $CT lea 96($PT), $PT jmp .L${labelPrefix}_dec_loop1 .L${labelPrefix}_dec_finish_96: vmovdqa $CTR6, $TMP5 vmovdqa $CTR5, 1*16-32($secureBuffer) vmovdqa $CTR4, 2*16-32($secureBuffer) vmovdqa $CTR3, 3*16-32($secureBuffer) vmovdqa $CTR2, 4*16-32($secureBuffer) vmovdqa $CTR1, 5*16-32($secureBuffer) vmovdqu 0*16-32($Htbl), $TMP3 vpclmulqdq \$0x10, $TMP3, $TMP5, $TMP0 vpclmulqdq \$0x11, $TMP3, $TMP5, $TMP1 vpclmulqdq \$0x00, $TMP3, $TMP5, $TMP2 vpclmulqdq \$0x01, $TMP3, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 ${\$schoolbook->(1)} ${\$schoolbook->(2)} ${\$schoolbook->(3)} ${\$schoolbook->(4)} vmovdqu 5*16-32($secureBuffer), $TMP5 vpxor $T, $TMP5, $TMP5 vmovdqu 5*16-32($Htbl), $TMP4 vpclmulqdq \$0x11, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP1, $TMP1 vpclmulqdq \$0x00, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP2, $TMP2 vpclmulqdq \$0x10, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpclmulqdq \$0x01, $TMP4, $TMP5, $TMP3 vpxor $TMP3, $TMP0, $TMP0 vpsrldq \$8, $TMP0, $TMP3 vpxor $TMP3, $TMP1, $TMP4 vpslldq \$8, $TMP0, $TMP3 vpxor $TMP3, $TMP2, $T vmovdqa poly(%rip), $TMP2 vpalignr \$8, $T, $T, $TMP1 vpclmulqdq \$0x10, $TMP2, $T, $T vpxor $T, $TMP1, $T vpalignr \$8, $T, $T, $TMP1 vpclmulqdq \$0x10, $TMP2, $T, $T vpxor $T, $TMP1, $T vpxor $TMP4, $T, $T .L${labelPrefix}_dec_loop2: # Here we encrypt any remaining whole block # if there are no whole blocks cmp \$16, $LEN jb .L${labelPrefix}_dec_out sub \$16, $LEN vmovdqa $CTR, $TMP1 vpaddd one(%rip), $CTR, $CTR vpxor 0*16($KS), $TMP1, $TMP1 vaesenc 1*16($KS), $TMP1, $TMP1 vaesenc 2*16($KS), $TMP1, $TMP1 vaesenc 3*16($KS), $TMP1, $TMP1 vaesenc 4*16($KS), $TMP1, $TMP1 vaesenc 5*16($KS), $TMP1, $TMP1 vaesenc 6*16($KS), $TMP1, $TMP1 vaesenc 7*16($KS), $TMP1, $TMP1 vaesenc 8*16($KS), $TMP1, $TMP1 vaesenc 9*16($KS), $TMP1, $TMP1 ___ if ($aes256) { $code.=<<___; vaesenc 10*16($KS), $TMP1, $TMP1 vaesenc 11*16($KS), $TMP1, $TMP1 vaesenc 12*16($KS), $TMP1, $TMP1 vaesenc 13*16($KS), $TMP1, $TMP1 vaesenclast 14*16($KS), $TMP1, $TMP1 ___ } else { $code.=<<___; vaesenclast 10*16($KS), $TMP1, $TMP1 ___ } $code.=<<___; vpxor ($CT), $TMP1, $TMP1 vmovdqu $TMP1, ($PT) addq \$16, $CT addq \$16, $PT vpxor $TMP1, $T, $T vmovdqa -32($Htbl), $TMP0 call GFMUL jmp .L${labelPrefix}_dec_loop2 .L${labelPrefix}_dec_out: vmovdqu $T, ($POL) ret .cfi_endproc ___ if ($aes256) { $code.=<<___; .size aes256gcmsiv_dec, .-aes256gcmsiv_dec ___ } else { $code.=<<___; .size aes128gcmsiv_dec, .-aes128gcmsiv_dec ___ } } aesgcmsiv_dec(0); # emit 128-bit version sub aes128gcmsiv_ecb_enc_block { my $STATE_1 = "%xmm1"; my $KSp = "%rdx"; # parameter 1: PT %rdi (pointer to 128 bit) # parameter 2: CT %rsi (pointer to 128 bit) # parameter 3: ks %rdx (pointer to ks) $code.=<<___; .globl aes128gcmsiv_ecb_enc_block .type aes128gcmsiv_ecb_enc_block,\@function,3 .align 16 aes128gcmsiv_ecb_enc_block: .cfi_startproc vmovdqa (%rdi), $STATE_1 vpxor ($KSp), $STATE_1, $STATE_1 vaesenc 1*16($KSp), $STATE_1, $STATE_1 vaesenc 2*16($KSp), $STATE_1, $STATE_1 vaesenc 3*16($KSp), $STATE_1, $STATE_1 vaesenc 4*16($KSp), $STATE_1, $STATE_1 vaesenc 5*16($KSp), $STATE_1, $STATE_1 vaesenc 6*16($KSp), $STATE_1, $STATE_1 vaesenc 7*16($KSp), $STATE_1, $STATE_1 vaesenc 8*16($KSp), $STATE_1, $STATE_1 vaesenc 9*16($KSp), $STATE_1, $STATE_1 vaesenclast 10*16($KSp), $STATE_1, $STATE_1 # STATE_1 == IV vmovdqa $STATE_1, (%rsi) ret .cfi_endproc .size aes128gcmsiv_ecb_enc_block,.-aes128gcmsiv_ecb_enc_block ___ } aes128gcmsiv_ecb_enc_block(); sub aes256gcmsiv_aes_ks_enc_x1 { my $KS = "%rdx"; my $KEYp = "%rcx"; my $CON_MASK = "%xmm0"; my $MASK_256 = "%xmm15"; my $KEY_1 = "%xmm1"; my $KEY_2 = "%xmm3"; my $BLOCK1 = "%xmm8"; my $AUX_REG = "%xmm14"; my $PT = "%rdi"; my $CT = "%rsi"; my $round_double = sub { my ($i, $j) = @_; return <<___; vpshufb %xmm15, %xmm3, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslld \$1, %xmm0, %xmm0 vpslldq \$4, %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vaesenc %xmm1, $BLOCK1, $BLOCK1 vmovdqu %xmm1, ${\eval(16*$i)}($KS) vpshufd \$0xff, %xmm1, %xmm2 vaesenclast %xmm14, %xmm2, %xmm2 vpslldq \$4, %xmm3, %xmm4 vpxor %xmm4, %xmm3, %xmm3 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm3, %xmm3 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm3, %xmm3 vpxor %xmm2, %xmm3, %xmm3 vaesenc %xmm3, $BLOCK1, $BLOCK1 vmovdqu %xmm3, ${\eval(16*$j)}($KS) ___ }; my $round_last = sub { my ($i) = @_; return <<___; vpshufb %xmm15, %xmm3, %xmm2 vaesenclast %xmm0, %xmm2, %xmm2 vpslldq \$4, %xmm1, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpslldq \$4, %xmm4, %xmm4 vpxor %xmm4, %xmm1, %xmm1 vpxor %xmm2, %xmm1, %xmm1 vaesenclast %xmm1, $BLOCK1, $BLOCK1 vmovdqu %xmm1, ${\eval(16*$i)}($KS) ___ }; # parameter 1: %rdi Pointer to PT1 # parameter 2: %rsi Pointer to CT1 # parameter 3: %rdx Pointer to KS # parameter 4: %rcx Pointer to initial key $code.=<<___; .globl aes256gcmsiv_aes_ks_enc_x1 .type aes256gcmsiv_aes_ks_enc_x1,\@function,4 .align 16 aes256gcmsiv_aes_ks_enc_x1: .cfi_startproc vmovdqa con1(%rip), $CON_MASK # CON_MASK = 1,1,1,1 vmovdqa mask(%rip), $MASK_256 # MASK_256 vmovdqa ($PT), $BLOCK1 vmovdqa ($KEYp), $KEY_1 # KEY_1 || KEY_2 [0..7] = user key vmovdqa 16($KEYp), $KEY_2 vpxor $KEY_1, $BLOCK1, $BLOCK1 vaesenc $KEY_2, $BLOCK1, $BLOCK1 vmovdqu $KEY_1, ($KS) # First round key vmovdqu $KEY_2, 16($KS) vpxor $AUX_REG, $AUX_REG, $AUX_REG ${\$round_double->(2, 3)} ${\$round_double->(4, 5)} ${\$round_double->(6, 7)} ${\$round_double->(8, 9)} ${\$round_double->(10, 11)} ${\$round_double->(12, 13)} ${\$round_last->(14)} vmovdqa $BLOCK1, ($CT) ret .cfi_endproc .size aes256gcmsiv_aes_ks_enc_x1,.-aes256gcmsiv_aes_ks_enc_x1 ___ } aes256gcmsiv_aes_ks_enc_x1(); sub aes256gcmsiv_ecb_enc_block { my $STATE_1 = "%xmm1"; my $PT = "%rdi"; my $CT = "%rsi"; my $KSp = "%rdx"; # parameter 1: PT %rdi (pointer to 128 bit) # parameter 2: CT %rsi (pointer to 128 bit) # parameter 3: ks %rdx (pointer to ks) $code.=<<___; .globl aes256gcmsiv_ecb_enc_block .type aes256gcmsiv_ecb_enc_block,\@function,3 .align 16 aes256gcmsiv_ecb_enc_block: .cfi_startproc vmovdqa (%rdi), $STATE_1 vpxor ($KSp), $STATE_1, $STATE_1 vaesenc 1*16($KSp), $STATE_1, $STATE_1 vaesenc 2*16($KSp), $STATE_1, $STATE_1 vaesenc 3*16($KSp), $STATE_1, $STATE_1 vaesenc 4*16($KSp), $STATE_1, $STATE_1 vaesenc 5*16($KSp), $STATE_1, $STATE_1 vaesenc 6*16($KSp), $STATE_1, $STATE_1 vaesenc 7*16($KSp), $STATE_1, $STATE_1 vaesenc 8*16($KSp), $STATE_1, $STATE_1 vaesenc 9*16($KSp), $STATE_1, $STATE_1 vaesenc 10*16($KSp), $STATE_1, $STATE_1 vaesenc 11*16($KSp), $STATE_1, $STATE_1 vaesenc 12*16($KSp), $STATE_1, $STATE_1 vaesenc 13*16($KSp), $STATE_1, $STATE_1 vaesenclast 14*16($KSp), $STATE_1, $STATE_1 # $STATE_1 == IV vmovdqa $STATE_1, (%rsi) ret .cfi_endproc .size aes256gcmsiv_ecb_enc_block,.-aes256gcmsiv_ecb_enc_block ___ } aes256gcmsiv_ecb_enc_block(); sub aes256gcmsiv_enc_msg_x4 { my $CTR1 = "%xmm0"; my $CTR2 = "%xmm1"; my $CTR3 = "%xmm2"; my $CTR4 = "%xmm3"; my $ADDER = "%xmm4"; my $STATE1 = "%xmm5"; my $STATE2 = "%xmm6"; my $STATE3 = "%xmm7"; my $STATE4 = "%xmm8"; my $TMP = "%xmm12"; my $TMP2 = "%xmm13"; my $TMP3 = "%xmm14"; my $IV = "%xmm15"; my $PT = "%rdi"; my $CT = "%rsi"; my $TAG = "%rdx"; my $KS = "%rcx"; my $LEN = "%r8"; my $aes_round = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP vaesenc $TMP, $STATE1, $STATE1 vaesenc $TMP, $STATE2, $STATE2 vaesenc $TMP, $STATE3, $STATE3 vaesenc $TMP, $STATE4, $STATE4 ___ }; my $aes_lastround = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $TMP vaesenclast $TMP, $STATE1, $STATE1 vaesenclast $TMP, $STATE2, $STATE2 vaesenclast $TMP, $STATE3, $STATE3 vaesenclast $TMP, $STATE4, $STATE4 ___ }; # void aes256gcmsiv_enc_msg_x4(unsigned char* PT, unsigned char* CT, # unsigned char* TAG, unsigned char* KS, # size_t byte_len); # parameter 1: %rdi #PT # parameter 2: %rsi #CT # parameter 3: %rdx #TAG [127 126 ... 0] IV=[127...32] # parameter 4: %rcx #KS # parameter 5: %r8 #LEN MSG_length in bytes $code.=<<___; .globl aes256gcmsiv_enc_msg_x4 .type aes256gcmsiv_enc_msg_x4,\@function,5 .align 16 aes256gcmsiv_enc_msg_x4: .cfi_startproc test $LEN, $LEN jnz .L256_enc_msg_x4_start ret .L256_enc_msg_x4_start: movq $LEN, %r10 shrq \$4, $LEN # LEN = num of blocks shlq \$60, %r10 jz .L256_enc_msg_x4_start2 addq \$1, $LEN .L256_enc_msg_x4_start2: movq $LEN, %r10 shlq \$62, %r10 shrq \$62, %r10 # make IV from TAG vmovdqa ($TAG), $IV vpor OR_MASK(%rip), $IV, $IV # IV = [1]TAG[126...32][00..00] vmovdqa four(%rip), $ADDER # Register to increment counters vmovdqa $IV, $CTR1 # CTR1 = TAG[1][127...32][00..00] vpaddd one(%rip), $IV, $CTR2 # CTR2 = TAG[1][127...32][00..01] vpaddd two(%rip), $IV, $CTR3 # CTR3 = TAG[1][127...32][00..02] vpaddd three(%rip), $IV, $CTR4 # CTR4 = TAG[1][127...32][00..03] shrq \$2, $LEN je .L256_enc_msg_x4_check_remainder subq \$64, $CT subq \$64, $PT .L256_enc_msg_x4_loop1: addq \$64, $CT addq \$64, $PT vmovdqa $CTR1, $STATE1 vmovdqa $CTR2, $STATE2 vmovdqa $CTR3, $STATE3 vmovdqa $CTR4, $STATE4 vpxor ($KS), $STATE1, $STATE1 vpxor ($KS), $STATE2, $STATE2 vpxor ($KS), $STATE3, $STATE3 vpxor ($KS), $STATE4, $STATE4 ${\$aes_round->(1)} vpaddd $ADDER, $CTR1, $CTR1 ${\$aes_round->(2)} vpaddd $ADDER, $CTR2, $CTR2 ${\$aes_round->(3)} vpaddd $ADDER, $CTR3, $CTR3 ${\$aes_round->(4)} vpaddd $ADDER, $CTR4, $CTR4 ${\$aes_round->(5)} ${\$aes_round->(6)} ${\$aes_round->(7)} ${\$aes_round->(8)} ${\$aes_round->(9)} ${\$aes_round->(10)} ${\$aes_round->(11)} ${\$aes_round->(12)} ${\$aes_round->(13)} ${\$aes_lastround->(14)} # XOR with Plaintext vpxor 0*16($PT), $STATE1, $STATE1 vpxor 1*16($PT), $STATE2, $STATE2 vpxor 2*16($PT), $STATE3, $STATE3 vpxor 3*16($PT), $STATE4, $STATE4 subq \$1, $LEN vmovdqu $STATE1, 0*16($CT) vmovdqu $STATE2, 1*16($CT) vmovdqu $STATE3, 2*16($CT) vmovdqu $STATE4, 3*16($CT) jne .L256_enc_msg_x4_loop1 addq \$64, $CT addq \$64, $PT .L256_enc_msg_x4_check_remainder: cmpq \$0, %r10 je .L256_enc_msg_x4_out .L256_enc_msg_x4_loop2: # encrypt each block separately # CTR1 is the highest counter (even if no LOOP done) vmovdqa $CTR1, $STATE1 vpaddd one(%rip), $CTR1, $CTR1 # inc counter vpxor ($KS), $STATE1, $STATE1 vaesenc 16($KS), $STATE1, $STATE1 vaesenc 32($KS), $STATE1, $STATE1 vaesenc 48($KS), $STATE1, $STATE1 vaesenc 64($KS), $STATE1, $STATE1 vaesenc 80($KS), $STATE1, $STATE1 vaesenc 96($KS), $STATE1, $STATE1 vaesenc 112($KS), $STATE1, $STATE1 vaesenc 128($KS), $STATE1, $STATE1 vaesenc 144($KS), $STATE1, $STATE1 vaesenc 160($KS), $STATE1, $STATE1 vaesenc 176($KS), $STATE1, $STATE1 vaesenc 192($KS), $STATE1, $STATE1 vaesenc 208($KS), $STATE1, $STATE1 vaesenclast 224($KS), $STATE1, $STATE1 # XOR with Plaintext vpxor ($PT), $STATE1, $STATE1 vmovdqu $STATE1, ($CT) addq \$16, $PT addq \$16, $CT subq \$1, %r10 jne .L256_enc_msg_x4_loop2 .L256_enc_msg_x4_out: ret .cfi_endproc .size aes256gcmsiv_enc_msg_x4,.-aes256gcmsiv_enc_msg_x4 ___ } aes256gcmsiv_enc_msg_x4(); sub aes256gcmsiv_enc_msg_x8() { my $STATE1 = "%xmm1"; my $STATE2 = "%xmm2"; my $STATE3 = "%xmm3"; my $STATE4 = "%xmm4"; my $STATE5 = "%xmm5"; my $STATE6 = "%xmm6"; my $STATE7 = "%xmm7"; my $STATE8 = "%xmm8"; my $CTR1 = "%xmm0"; my $CTR2 = "%xmm9"; my $CTR3 = "%xmm10"; my $CTR4 = "%xmm11"; my $CTR5 = "%xmm12"; my $CTR6 = "%xmm13"; my $CTR7 = "%xmm14"; my $TMP1 = "%xmm1"; my $TMP2 = "%xmm2"; my $KS = "%rcx"; my $LEN = "%r8"; my $PT = "%rdi"; my $CT = "%rsi"; my $TAG = "%rdx"; my $SCHED = "%xmm15"; my $aes_round8 = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $SCHED vaesenc $SCHED, $STATE1, $STATE1 vaesenc $SCHED, $STATE2, $STATE2 vaesenc $SCHED, $STATE3, $STATE3 vaesenc $SCHED, $STATE4, $STATE4 vaesenc $SCHED, $STATE5, $STATE5 vaesenc $SCHED, $STATE6, $STATE6 vaesenc $SCHED, $STATE7, $STATE7 vaesenc $SCHED, $STATE8, $STATE8 ___ }; my $aes_lastround8 = sub { my ($i) = @_; return <<___; vmovdqu ${\eval($i*16)}($KS), $SCHED vaesenclast $SCHED, $STATE1, $STATE1 vaesenclast $SCHED, $STATE2, $STATE2 vaesenclast $SCHED, $STATE3, $STATE3 vaesenclast $SCHED, $STATE4, $STATE4 vaesenclast $SCHED, $STATE5, $STATE5 vaesenclast $SCHED, $STATE6, $STATE6 vaesenclast $SCHED, $STATE7, $STATE7 vaesenclast $SCHED, $STATE8, $STATE8 ___ }; # void ENC_MSG_x8(unsigned char* PT, # unsigned char* CT, # unsigned char* TAG, # unsigned char* KS, # size_t byte_len); # parameter 1: %rdi #PT # parameter 2: %rsi #CT # parameter 3: %rdx #TAG [127 126 ... 0] IV=[127...32] # parameter 4: %rcx #KS # parameter 5: %r8 #LEN MSG_length in bytes $code.=<<___; .globl aes256gcmsiv_enc_msg_x8 .type aes256gcmsiv_enc_msg_x8,\@function,5 .align 16 aes256gcmsiv_enc_msg_x8: .cfi_startproc test $LEN, $LEN jnz .L256_enc_msg_x8_start ret .L256_enc_msg_x8_start: # Place in stack movq %rsp, %r11 subq \$16, %r11 andq \$-64, %r11 movq $LEN, %r10 shrq \$4, $LEN # LEN = num of blocks shlq \$60, %r10 jz .L256_enc_msg_x8_start2 addq \$1, $LEN .L256_enc_msg_x8_start2: movq $LEN, %r10 shlq \$61, %r10 shrq \$61, %r10 # Make IV from TAG vmovdqa ($TAG), $TMP1 vpor OR_MASK(%rip), $TMP1, $TMP1 # TMP1= IV = [1]TAG[126...32][00..00] # store counter8 on the stack vpaddd seven(%rip), $TMP1, $CTR1 vmovdqa $CTR1, (%r11) # CTR8 = TAG[127...32][00..07] vpaddd one(%rip), $TMP1, $CTR2 # CTR2 = TAG[127...32][00..01] vpaddd two(%rip), $TMP1, $CTR3 # CTR3 = TAG[127...32][00..02] vpaddd three(%rip), $TMP1, $CTR4 # CTR4 = TAG[127...32][00..03] vpaddd four(%rip), $TMP1, $CTR5 # CTR5 = TAG[127...32][00..04] vpaddd five(%rip), $TMP1, $CTR6 # CTR6 = TAG[127...32][00..05] vpaddd six(%rip), $TMP1, $CTR7 # CTR7 = TAG[127...32][00..06] vmovdqa $TMP1, $CTR1 # CTR1 = TAG[127...32][00..00] shrq \$3, $LEN jz .L256_enc_msg_x8_check_remainder subq \$128, $CT subq \$128, $PT .L256_enc_msg_x8_loop1: addq \$128, $CT addq \$128, $PT vmovdqa $CTR1, $STATE1 vmovdqa $CTR2, $STATE2 vmovdqa $CTR3, $STATE3 vmovdqa $CTR4, $STATE4 vmovdqa $CTR5, $STATE5 vmovdqa $CTR6, $STATE6 vmovdqa $CTR7, $STATE7 # move from stack vmovdqa (%r11), $STATE8 vpxor ($KS), $STATE1, $STATE1 vpxor ($KS), $STATE2, $STATE2 vpxor ($KS), $STATE3, $STATE3 vpxor ($KS), $STATE4, $STATE4 vpxor ($KS), $STATE5, $STATE5 vpxor ($KS), $STATE6, $STATE6 vpxor ($KS), $STATE7, $STATE7 vpxor ($KS), $STATE8, $STATE8 ${\$aes_round8->(1)} vmovdqa (%r11), $CTR7 # deal with CTR8 vpaddd eight(%rip), $CTR7, $CTR7 vmovdqa $CTR7, (%r11) ${\$aes_round8->(2)} vpsubd one(%rip), $CTR7, $CTR7 ${\$aes_round8->(3)} vpaddd eight(%rip), $CTR1, $CTR1 ${\$aes_round8->(4)} vpaddd eight(%rip), $CTR2, $CTR2 ${\$aes_round8->(5)} vpaddd eight(%rip), $CTR3, $CTR3 ${\$aes_round8->(6)} vpaddd eight(%rip), $CTR4, $CTR4 ${\$aes_round8->(7)} vpaddd eight(%rip), $CTR5, $CTR5 ${\$aes_round8->(8)} vpaddd eight(%rip), $CTR6, $CTR6 ${\$aes_round8->(9)} ${\$aes_round8->(10)} ${\$aes_round8->(11)} ${\$aes_round8->(12)} ${\$aes_round8->(13)} ${\$aes_lastround8->(14)} # XOR with Plaintext vpxor 0*16($PT), $STATE1, $STATE1 vpxor 1*16($PT), $STATE2, $STATE2 vpxor 2*16($PT), $STATE3, $STATE3 vpxor 3*16($PT), $STATE4, $STATE4 vpxor 4*16($PT), $STATE5, $STATE5 vpxor 5*16($PT), $STATE6, $STATE6 vpxor 6*16($PT), $STATE7, $STATE7 vpxor 7*16($PT), $STATE8, $STATE8 subq \$1, $LEN vmovdqu $STATE1, 0*16($CT) vmovdqu $STATE2, 1*16($CT) vmovdqu $STATE3, 2*16($CT) vmovdqu $STATE4, 3*16($CT) vmovdqu $STATE5, 4*16($CT) vmovdqu $STATE6, 5*16($CT) vmovdqu $STATE7, 6*16($CT) vmovdqu $STATE8, 7*16($CT) jne .L256_enc_msg_x8_loop1 addq \$128, $CT addq \$128, $PT .L256_enc_msg_x8_check_remainder: cmpq \$0, %r10 je .L256_enc_msg_x8_out .L256_enc_msg_x8_loop2: # encrypt each block separately # CTR1 is the highest counter (even if no LOOP done) vmovdqa $CTR1, $STATE1 vpaddd one(%rip), $CTR1, $CTR1 vpxor ($KS), $STATE1, $STATE1 vaesenc 16($KS), $STATE1, $STATE1 vaesenc 32($KS), $STATE1, $STATE1 vaesenc 48($KS), $STATE1, $STATE1 vaesenc 64($KS), $STATE1, $STATE1 vaesenc 80($KS), $STATE1, $STATE1 vaesenc 96($KS), $STATE1, $STATE1 vaesenc 112($KS), $STATE1, $STATE1 vaesenc 128($KS), $STATE1, $STATE1 vaesenc 144($KS), $STATE1, $STATE1 vaesenc 160($KS), $STATE1, $STATE1 vaesenc 176($KS), $STATE1, $STATE1 vaesenc 192($KS), $STATE1, $STATE1 vaesenc 208($KS), $STATE1, $STATE1 vaesenclast 224($KS), $STATE1, $STATE1 # XOR with Plaintext vpxor ($PT), $STATE1, $STATE1 vmovdqu $STATE1, ($CT) addq \$16, $PT addq \$16, $CT subq \$1, %r10 jnz .L256_enc_msg_x8_loop2 .L256_enc_msg_x8_out: ret .cfi_endproc .size aes256gcmsiv_enc_msg_x8,.-aes256gcmsiv_enc_msg_x8 ___ } aes256gcmsiv_enc_msg_x8(); aesgcmsiv_dec(1); sub aes256gcmsiv_kdf { my $ONE = "%xmm8"; my $BLOCK1 = "%xmm4"; my $BLOCK2 = "%xmm6"; my $BLOCK3 = "%xmm7"; my $BLOCK4 = "%xmm11"; my $BLOCK5 = "%xmm12"; my $BLOCK6 = "%xmm13"; my $enc_roundx6 = sub { my ($i, $j) = @_; return <<___; vmovdqa ${\eval($i*16)}(%rdx), $j vaesenc $j, $BLOCK1, $BLOCK1 vaesenc $j, $BLOCK2, $BLOCK2 vaesenc $j, $BLOCK3, $BLOCK3 vaesenc $j, $BLOCK4, $BLOCK4 vaesenc $j, $BLOCK5, $BLOCK5 vaesenc $j, $BLOCK6, $BLOCK6 ___ }; my $enc_roundlastx6 = sub { my ($i, $j) = @_; return <<___; vmovdqa ${\eval($i*16)}(%rdx), $j vaesenclast $j, $BLOCK1, $BLOCK1 vaesenclast $j, $BLOCK2, $BLOCK2 vaesenclast $j, $BLOCK3, $BLOCK3 vaesenclast $j, $BLOCK4, $BLOCK4 vaesenclast $j, $BLOCK5, $BLOCK5 vaesenclast $j, $BLOCK6, $BLOCK6 ___ }; # void aes256gcmsiv_kdf(const uint8_t nonce[16], # uint8_t *out_key_material, # const uint8_t *key_schedule); $code.=<<___; .globl aes256gcmsiv_kdf .type aes256gcmsiv_kdf,\@function,3 .align 16 aes256gcmsiv_kdf: .cfi_startproc # parameter 1: %rdi Pointer to NONCE # parameter 2: %rsi Pointer to CT # parameter 4: %rdx Pointer to keys vmovdqa (%rdx), %xmm1 # xmm1 = first 16 bytes of random key vmovdqa 0*16(%rdi), $BLOCK1 vmovdqa and_mask(%rip), $BLOCK4 vmovdqa one(%rip), $ONE vpshufd \$0x90, $BLOCK1, $BLOCK1 vpand $BLOCK4, $BLOCK1, $BLOCK1 vpaddd $ONE, $BLOCK1, $BLOCK2 vpaddd $ONE, $BLOCK2, $BLOCK3 vpaddd $ONE, $BLOCK3, $BLOCK4 vpaddd $ONE, $BLOCK4, $BLOCK5 vpaddd $ONE, $BLOCK5, $BLOCK6 vpxor %xmm1, $BLOCK1, $BLOCK1 vpxor %xmm1, $BLOCK2, $BLOCK2 vpxor %xmm1, $BLOCK3, $BLOCK3 vpxor %xmm1, $BLOCK4, $BLOCK4 vpxor %xmm1, $BLOCK5, $BLOCK5 vpxor %xmm1, $BLOCK6, $BLOCK6 ${\$enc_roundx6->(1, "%xmm1")} ${\$enc_roundx6->(2, "%xmm2")} ${\$enc_roundx6->(3, "%xmm1")} ${\$enc_roundx6->(4, "%xmm2")} ${\$enc_roundx6->(5, "%xmm1")} ${\$enc_roundx6->(6, "%xmm2")} ${\$enc_roundx6->(7, "%xmm1")} ${\$enc_roundx6->(8, "%xmm2")} ${\$enc_roundx6->(9, "%xmm1")} ${\$enc_roundx6->(10, "%xmm2")} ${\$enc_roundx6->(11, "%xmm1")} ${\$enc_roundx6->(12, "%xmm2")} ${\$enc_roundx6->(13, "%xmm1")} ${\$enc_roundlastx6->(14, "%xmm2")} vmovdqa $BLOCK1, 0*16(%rsi) vmovdqa $BLOCK2, 1*16(%rsi) vmovdqa $BLOCK3, 2*16(%rsi) vmovdqa $BLOCK4, 3*16(%rsi) vmovdqa $BLOCK5, 4*16(%rsi) vmovdqa $BLOCK6, 5*16(%rsi) ret .cfi_endproc .size aes256gcmsiv_kdf, .-aes256gcmsiv_kdf ___ } aes256gcmsiv_kdf(); print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt000064400000000000000000005271101352416253600225610ustar0000000000000000# This is the example from # https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#section-8 KEY: ee8e1ed9ff2540ae8f2ba9f50bc2f27c NONCE: 752abad3e0afb5f434dc4310 IN: "Hello world" AD: "example" CT: 5d349ead175ef6b1def6fd TAG: 4fbcdeb7e4793f4a1d7e4faa70100af1 # Test vectors from # https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#appendix-C KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: AD: CT: TAG: dc20e2d83f25705bb49e439eca56de25 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0100000000000000 AD: CT: b5d839330ac7b786 TAG: 578782fff6013b815b287c22493a364c KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 010000000000000000000000 AD: CT: 7323ea61d05932260047d942 TAG: a4978db357391a0bc4fdec8b0d106639 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 01000000000000000000000000000000 AD: CT: 743f7c8077ab25f8624e2e948579cf77 TAG: 303aaf90f6fe21199c6068577437a0c4 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0100000000000000000000000000000002000000000000000000000000000000 AD: CT: 84e07e62ba83a6585417245d7ec413a9fe427d6315c09b57ce45f2e3936a9445 TAG: 1a8e45dcd4578c667cd86847bf6155ff KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000 AD: CT: 3fd24ce1f5a67b75bf2351f181a475c7b800a5b4d3dcf70106b1eea82fa1d64df42bf7226122fa92e17a40eeaac1201b TAG: 5e6e311dbf395d35b0fe39c2714388f8 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000 AD: CT: 2433668f1058190f6d43e360f4f35cd8e475127cfca7028ea8ab5c20f7ab2af02516a2bdcbc08d521be37ff28c152bba36697f25b4cd169c6590d1dd39566d3f TAG: 8a263dd317aa88d56bdf3936dba75bb8 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0200000000000000 AD: 01 CT: 1e6daba35669f427 TAG: 3b0a1a2560969cdf790d99759abd1508 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 020000000000000000000000 AD: 01 CT: 296c7889fd99f41917f44620 TAG: 08299c5102745aaa3a0c469fad9e075a KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000000000000000000000000000 AD: 01 CT: e2b0c5da79a901c1745f700525cb335b TAG: 8f8936ec039e4e4bb97ebd8c4457441f KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0200000000000000000000000000000003000000000000000000000000000000 AD: 01 CT: 620048ef3c1e73e57e02bb8562c416a319e73e4caac8e96a1ecb2933145a1d71 TAG: e6af6a7f87287da059a71684ed3498e1 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000 AD: 01 CT: 50c8303ea93925d64090d07bd109dfd9515a5a33431019c17d93465999a8b0053201d723120a8562b838cdff25bf9d1e TAG: 6a8cc3865f76897c2e4b245cf31c51f2 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000 AD: 01 CT: 2f5c64059db55ee0fb847ed513003746aca4e61c711b5de2e7a77ffd02da42feec601910d3467bb8b36ebbaebce5fba30d36c95f48a3e7980f0e7ac299332a80 TAG: cdc46ae475563de037001ef84ae21744 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000 AD: 010000000000000000000000 CT: a8fe3e87 TAG: 07eb1f84fb28f8cb73de8e99e2f48a14 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0300000000000000000000000000000004000000 AD: 010000000000000000000000000000000200 CT: 6bb0fecf5ded9b77f902c7d5da236a4391dd0297 TAG: 24afc9805e976f451e6d87f6fe106514 KEY: 01000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 030000000000000000000000000000000400 AD: 0100000000000000000000000000000002000000 CT: 44d0aaf6fb2f1f34add5e8064e83e12a2ada TAG: bff9b2ef00fb47920cc72a0c0f13b9fd # Random vectors generated by the reference code. KEY: e66021d5eb8e4f4066d4adb9c33560e4 NONCE: f46e44bb3da0015c94f70887 IN: AD: CT: TAG: a4194b79071b01a87d65f706e3949578 KEY: 36864200e0eaf5284d884a0e77d31646 NONCE: bae8e37fc83441b16034566b IN: 7a806c46bb91c3c5aedb64a6c590bc84d1 AD: a5e269e4b47801afc0 CT: 8092e6d6d729f5ee7e808d77f3b7a89647 TAG: dec23ae31e3e97bb364fa18ad85cae0b KEY: 577e34699b9e671fdd4fbdc66f146545 NONCE: fc880c94a95198874296d5cc IN: 1fd161320b6920ce07787f86743b275d1ab32f6d1f0434d8848c1177441f19549586 AD: 0f046787f3ea22c127aaf195d1894728b3fe CT: 7520668ef1b845aabf245e66ca687ca7c5b4f00de71afea392cda124893746ddd4e6 TAG: db5ad3b398513fe5c8d868e68becd5a8 KEY: d1473c528b8426a582995929a1499e9a NONCE: d8780c8d63d0ab4149c09f57 IN: 2c614b4745914474e7c7c9882e5386fd9f92ec489c8fde2be2cf97e74e932d4ed87da44102952ef94b02b805249bac80e6f614 AD: 55bfac8308a2d40d8c8451178082355c9e940fea2f582950a70d5a CT: bdbec524ca37355074899f01b7247b1abc24565b997e000f231f0664be655d8cb75f18112cfaa722e1b2e261710036ff919014 TAG: 45b9ece29df0dd93941f9454404c8d87 KEY: 1db2316fd568378da107b52b0da55210 NONCE: cc1c1b0abde3b2f204d1e9f8 IN: b06bc47f9745b3d1ae06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb6de71860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f AD: f901cfe8a69615a93fdf7a98cad481796245709fb18853f68d833640e42a3c02c25b6486 CT: d75a5a40ae0ac4343f1a52ee16108332b3563616c207c2b22be277a219e497b7e5bbd5bdecaed87a5216e3e49149ac50a7959957264c222577a07c73fc81f0e579a0fa93 TAG: b70c26c56e34c7740824f9dfcb8ae6e4 KEY: 9e146d7b233987bddfc240871d7576f7 NONCE: 028ec6eb5ea7e298342a94d4 IN: b202b370ef9768ec6561c4fe6b7e7296fa859c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac73c535de192eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23688089e555 AD: 40db1872504e1cced532ce4159b035277d4dfbb7db62968b13cd4eec734320ccc9d9bbbb19cb81b2af4ecbc3e7 CT: 23dea4fb871ab1df6cfb674d2e7efbc969033a11d694c6580aa3e780e4d1db5f1145924b974ce98ea041ecca53c36207fa644b0ae789965084d1ef845cae33aff734113b3eb4d9f1863b780b0f97fb5e3c5ea991cf TAG: 81da1dfc98517d4cee3ee885a266e814 KEY: 2834321f7aa0f70b7282b4f33df23f16 NONCE: 7541ac15c8417abaf17a282a IN: c7a57252ff224ae7911a905b8c699b20e40c1e9569a6b2aa0232d4b10bb6f20406135861c19795b95f9597f9b72c20931c41164f1b469b0901f2b5da3a956a6e278c940e82593eb58f56f6d3681fb00dedf7f612c4cb3193b73ab35f9a5a9cc8d13aa27ff1de AD: a3b2a7d832ed8ab959d82ee795df8e1ef530cc6fd9a1f10543b44c49383921d74fe0c71d50da4adb9e9c7e5491a488ceb5c384ebafad CT: 06d3e558b2f7f8e225d76a41a11122aa29eef02c226616f5264c9c1b821748a8115dd4868dfeacc5d167ceedc824f1f7136e7d7fae783bad83dec468c98747524fc2fcd7b86cbfd1c07078fd1b4b9caaae970c729ee3f2ecfebf048c5aba174fc4eab117bacf TAG: 5ece142ce1074a09ab8ce810222a471d KEY: f0f484fae982019a8ea22efd1358adf7 NONCE: ad4f5fa0d2acd2f1ee095cdf IN: c13310241243fa53b8c2610d1924b1d55cb6d9cb6a5b98a72127255967b8ff23623c5453e61cecf9e624e5c803250c382481d3c10febfa54d03894ba8f9ed72637fcf5631f7b7312cc74e6ff63ecb240349a575f2cd817f2afbaaf21815bf08ac1e8f87520244b4a3fc492c7120296607ef64d0adb4c74 AD: b73839e13455fd91ddf7f81d460034b9c41eaf0cc6040a84e17e6108372f1ca50656793554ea1d05181310711d0e60d4d556b2bedb24d7b622c01fe8025119 CT: 90046c5ca4a6db850c5cddb14227b5902257e7ed8bc55f85ca24f51558f95037a0567d485b7606d2ec1802de069926e4f69e5ade9453080f84c045438d890290ed69b5e140788d07ed3d38b067900c222ad55b298e240590cb816d90a43ec52203f11ff9496b3dc32d7ac316ac8465496e41b4be5200dd TAG: 76ae0503f7b43b1d2db24817f2b61ee7 KEY: ae0c8a20b679dc40c9908f88fecfafd6 NONCE: 88b0ebec6a2ac13421012874 IN: c80685c481b41323a1724ea96c1df644a595e8cc73955e6f661e0fa30737d78e7cec11629b8f1fa4bbd8e8e655f50019859514dbc4cbcf944f95084e45337d9d9d8972bd8da92b4eb5a75c0b284305601de859f8d1fac6d6b3fdd42210fdcf696119e436006a5a863859d5b70806197fdb9f0da3e4c31b0c7545809808bf7683757cd11b9d0f8621 AD: 664df31eb95b5e17567d680b1a26980772e8ad3e9b2e2de537414368c4f97adff1408d36c1dfee65b78375c7361c91452e7d463338474a400ef9efcaa648e93f CT: f729ca77733cca181ba8801e001924e20a1d164cc4440a6217a1178dd6b1210837367cf84aa41f92f4123d6740910586f819389d5c750ab15768aed1b163bde5b1fe8862d1621b11485b47182d32bd304ddbf275524c4ece4cfb1361db53dd63e21ac62bb54a77bb5063c869b5f5de1f1b4356845aac79ee6f66d21ff271e02e8bbbae1372b4b8ff TAG: 52856b3369ecbb7201b1b0f75872e5e2 KEY: 38f8784a1598bca461211195d7844de5 NONCE: 6b91cccc96d89e6471bca6b7 IN: 374aa5ec4b2f5fba66c17a435970411f2af3d6e33c0d094f74fcb77beb6cbbac1f3a8a19f69ca087f94a5b80d5e3692e0d10ec34aa67269c824b382d6238bcfaaed586177b852f816c31e9966744188f02647d881990d98c3eabd477557a739262bb3f682f64d2208faf98097586053a32cbf37e78413a2d89613a81966e8d654cac0aa34107947a036f403bda53e74bc524e7bc2d2c51dc42 AD: 6b38c308cc574839129e5e6251f41dec9cff7ccf256c38e4994e15ca976d3185ae17030ad3751e56367f86886acc32e27fe04d0b89cc89b0206f281aa2d80f9be19928dabf07417e76 CT: 350bc8baf35cad823df06eadbb0e30e1e4b5bb8171d14c330e8c488f1076d94b8cb7baa3268a5bf164e23563180b9793ed06bb80079288cd348eeaa8eb33cf31ccf89dec998408baae4c3a7b3d3bd14aa76e99d645da0fba0c29a7ea4baeed741de3a5df5ff4044d9b057c4f3ef1825dd0a47aa0b5e92cfe0321c07333479dc86bed7b7b91e6ef368401392d973404e2914b7d2cb49448c55e TAG: c974e989ae2b86e92c5da9b0c9b068e0 KEY: 59b17f09c56d170ed1ef10d2fadf01e0 NONCE: c78473d06a1685ef0bb112e4 IN: ec7e6ce0cbc601fc8a2dd64045c8fada4a28c0c6f0ec98542e365279d00ffdf5e2eae3b663c4b79342f2f265db30a86d6e1b325318d7f7a622b36e746875b71165defd5ca1afc0a92db6ef4fb9e20b81018a5293899f1e0d06b18a2e65f7616638f79a0db3f2cfdcc0eac2ee1e2e454958e2e6d214a20ad13156f97d0f2cf4276b09f5945c11f6b20b7bede26d6c2f0e5cf2786eea66e18d6ece02156f9233bdfc57c75b1a8a8b1f4ab8 AD: 5be5a4a089f0ac762060a336aa502f5a1df1e0a647fb9d5d932dc0654e0725122f6a567681a7d1cb7625ed0404d540d8b3145c911280d2a0ff9d1c53e27677be0436faeb39009fe5751c0b37c7a5f1137a26 CT: 6b07754b096556462756de94e5941610f1bfd93e6222899516e00eb1830f557d6f629bc61abe0c247ab6aa0f4f816f79544ceb034b5d9e86ab8679ad67f6dbef521f6180a07b0bbbcf174cd9234848f18b8ebba7d6ae3d607e027cb220c7582eb6d496a980ae3883fab88a1dd9e5312842450fcf68640546b49c24a3ffc0c8c4f539e8f9a34a3bbff44b1bb4cdb339d8879fa4e0c2145954e34fbede7483d25a0494c1b9e5b1f70aee7e TAG: 064c9d25f8795d8151b33f9d32d3ac6d KEY: 995577faa109071bee1c87d5e6772ca5 NONCE: 5fdec02348a625b49c3c881a IN: ab162f20ba0b834e8159d9bf20ee0c5d14da0221961c4fc7d9b44c7822f32298d30775cf974172ebfdb36cfb2881ccb15e5f69ed27880b920f4a092815357e03d982f75590af08b447f0f8466b031ed2409e9f5eb479affd9e18017a369486914c63a7494168d91df157f5e56fbc4ab6ee5a8f3af1fbe1bf9324338a1f4acad45fc7137676797c89620b15feb8512544771f280f322cbaac9c4d7cfb4c326824825ba5b5f5190fcde0d399ef1f52b82abb5a8b1e5f2eea2c79702d AD: ec4cfbee3d1f5cc11e085d2254f8b37f8030bd285d6aa1cc53868d18ecfdd963153485dce5a3e3e8cb0a3cf8074571f7a2e9e841229466463f506a2bc90f2d6413128efee043e01eccb930fbc002563510e499457161083ed7997e CT: 0610980d938c2f2619bb8b4408156fb53f595d857feae649a6700af296d0411cbb80a6c0b7e2447cc54c3bd3bcfae38b7bb10fa5b91e25686d4482b14a2b62d386175f9f247e48fc3b2215b2da1c065bb00f9f59e8afafc9ef205f5245d27085021f41b9e40c00abaea48286fd914e558f822659207e965855eabf52723148d84b0a2692c48d76f30f3cb530b1beb58ffc4824517cb6772e957bd56394c1d8b70c9fa2b70a670f3fe36d8802b2043905e469b558575c75012901dc TAG: cb51baaa4672b8ae9745ecee08784d3b KEY: 58ebf03ce7ed2f8d5487936311922884 NONCE: bfd31cf828f3d0ce78f3c698 IN: 1932268108a369048cdc0a75c062c0ed02e27bbd11754e621ff67c511ed98c6fadc3e95e7100644ebe1aa147a7e99f25ce5c2edb8ab6446749441027a211b8d04a6247299dfea9d75eab257a625aeb51f74e0b47b302fb5c0475ab23e99f4d93ecf07694497ff6b27c9848805af93a5615bc71486b26fc9da67cf60c8d3a396bc0164985fab2c64bbaa4dd0fdc22c9d9e433e8c70dcdeeebf230c7a3cb3e5d0d48573a64b068daf90f56b15579767ecdd420c0858fabe23abc0b313b97a9c1ceddcb59d5322e47a85cc58e75 AD: 3f00d6f0d032d4c5110c8f22e98895279a30a86da0ef71cea6ef2738fe3e747ee54d2e96e3afb8916281f6369ab1a397ca0a18c6c0e9a0c4edeaa4190ce6422bd116ac254a12235eb66fb5cc7ef55b721d3d2db4c67c38bbbb0bcac9234ea7d733f200e6 CT: b741fd48fa7634435db2cb05392004d0b588bc7e9ddf79526706e575415c8b3d48a606c5f155130deb77ec7aff93719396797bf6628531d9d061727bcea2b348060b64122cd1a94f999ad1f681847e57c05da0deabd2fe010212dc60ec980ed0ba78ee9160b3776ae9174c6f8b7231d6754a4143c8af129411063315c6517134ca26d5a94a2e8c6e8b7ad9b8e78b694d5251deb34dabc455dd9f2a2b3fb6f67222de61e917a645d366462d6d94cd265f919f237f06f1986fac17bfaf3a97c24b99af884d0fca5d3307caf9bd TAG: 35777ae50d32c572cb0cd778cbaf55e1 KEY: b86fc55f4abb9b65ee1897c262533ccc NONCE: d118b0f493c849a7aa7f35d2 IN: 43f9438f1858da62bdd03fd5a8c7b01d8097d7ce319a41f80104968a46599e9a3289a29a16b245877898f345f92fa70d3e613c38e6e4ebbf0bcb64c1c41f8b83ec8e9f159d4b830d9a1b79f2ad90db067856eb8621e52ab3060e8d72dfe782b62364c163fa00b49aa6fbe4210fb7208c642b7a6735b1a8b2f1dbc4b3d4952985ef207a3eb0a07b1341700762e9f9d1c3438fc6633da2fbade15844cb1813d258aa5bfa4ac129d693792a89622a0c686f05d87019a266f91387d96bf2baae0262782b9c23162f5271cfa3144265deefe2c569e82911e842e5c9ae8fb79b AD: ecf42c3afe389acfdc9a34bec7b45705ba68e205b83b33f50b7852fbb7f4ae5dfdfdfb3cfee8a03c96a036388aa8f7809bd47eaa073f92905d0d5f199d466cc0ebd9bceb207f4209bf9925c6109973194742dc8d813f3cb212bbd8d92d7eef645fb0f8245811876dee5f241763 CT: 87454e6cefc24ba38f01bb791333dd0006cfce165a4247833b182efcdb484b0818aa80f70f29d0ec093455344b8f169262f17be2d1635293bdcca90e21f2c210146f90398f44b35e3f2203c7b5bfecdbd973b568d8ed8444d43cba08d44984a295f62c174ca9ca69c173bb7c43f103ff53a886284af46fde5cbe07b391f9c0b82eec218faecb43dc75372478f2ee1bb267602672a4ff5989ec7251034dd2cfb49677fc82c8b209820be1ed2c429a0491beedbe8c1fc78bd62590ba71fd5da363d6da000e8b7e5bae223c0cf8397d3b5ce7141e8b301ea5a737ae480dc9 TAG: ad696ab700dd5b71d79f4f6f69034185 KEY: edaf7d79c1b83d973f9ba3b29a9b9408 NONCE: 418f73743ff0546f0d929001 IN: 0cf3a665c443b85255759ec6248021e4b6eb825c398b5af7b5257efb7afc481abc20d90249bed5b30d44f725c78ad0ce2821f86838874dceb6b6207ad6fa34579126de720ce34bdfd2058d92b8bbbb3f1bec607de3f0a028d8f6e13d0d4d2d3861e1a26d79cb68d3fef68127e8458eb599915022da751e271cd047cc712fae5b0459ae7815a24f4edf806889fc462c83181111f4de5bbb7e66a701460f508eaf73798c3ca9c08cc1a046472f4b18c69b7ed249a96f9bfa05a276499a5f499c586027c64ad6a68dcb52a50aa6d1b1d4d202e6f184f01daa08fbd643523f4f73ae6b8d764a7f567087a5fec5ad1ee3 AD: e4be5b677b87109e69eae9a635ac2ea185ba08ebce3ba4be06d53b2da081c5030f5a746fea7bbdda340e10eccd47238340b9244b9442c0efae7644cff53c7abd8445163e891cf30bc8e26eea01f0c461b4796c2106e1ffdfdd1bac29f7d3c72c8ca7f625008d8d333d2a2092c08ef83c8002ed90e2ad CT: 9372586624f9a52a91e7ce12f380ca13840f11fad8d9edf10c869042c29514515673b3dfcfe956e8d3550baae1815bb4cd41ed27c7485c723354e557d18119b27431d7527f0d84c6e76baf9afa35a215624c339ad888f27c338240e603b232cd247e77eb1475adcb87d0443265ac0de45b16c67fdab07a0c0dd203d97ac2e19248492c561912e9087cd5fb73445695b43b8dd8c7515f9c958dc64068e31d3cb615038f5eea84a74b5d0c3415b6b1309ea8092614f2bd944a6c3a9e002a95e524efa497c9d3cbdaa764f8cf8aa9fcc7f7d68a623930bebb74e5c234322651edda21e20eb12c16a76839f31f3b30d6 TAG: 33a31cae0292d0185aa10ba1c2288cda KEY: 01dadfe4cc0681384b489f38d25e83c2 NONCE: c563485fb361f81d44aea205 IN: e5bb4c1912d00d8f99f8d7a931e55ae72f749147fbd97699ec730bfb01b8261f1f94696278fc703263cc789b283460af9d74647a8c039ad2184674e78f6a355a26eefc6fcd4cd32d96d245d583836312652fd9e6694ac5644eeb4c2bd667b52e5af14bcb108c8e277728d6d6116e8ed1981993771b8bb783bb351982f9f8c2a0e7c20a5a863c6d71b7145b73d7e6d84d47780d66847244d0b8ef559f2297f39e26501d8a2aae8c36189580292da842c4d0d06a21d21ab175e34589e3b814d8a00ac1d8a3b2eca2a91b21e36c55fc6dad8c0a1b2cc7bcb2108b2e21fafeaa26a2d4881b183b899210b474bdc43a8f0b8464075d86a2ba1e9cd195a8ecadd315 AD: 870d5740c4e22eab0783de87d541fa834647c3fc6543c60d5df31c19c6ca38707649fa8dcfc3c0ccc16b1bb60283d7ae2778a8f83ba07b905e23cb06d5656f614f1efcb346f34e190bcc636cdca229b64af9ae4b1f05b58f1ffd1a077a51bbf9ede69ac3954de7daf569cc8de12282cac09b9a49dfb92dcc409b8c63f2ae4a CT: 119f74936eaffdc3e5e7e072ce81e0e1ca91054cbfca127b8c4a94ada042a2452b39cdd02ab897da765cc0f8d84089a8cc5af662c1c96aefafeead785ad042b506fc72556182566263e90009a86503595dca0924d87ea6ac61d4e931025420436a8716d0ce379c5e3437b26a12531c0a1abb3a693f3202f5770f1dd7ec1eada8c2d6c747a7161d19ffbb897710a17e7740fc232fcc244f456e962ebe71f7ded8ca73e07dd44f00fbd023b8a72f9005f9bd4d0d44135294258ec14665309e9edcc82d98227474a9202552d31f1d2e7374d49929c2885696e5e3edc1983432f1dbad351f9cae3cd56855878d9a076c6d3a27f2718e32658f2392215915c020db TAG: 5689d9a73d52266977bfe5c1bb1bca09 KEY: 34091633f4aaf225aa02ba9c57b910a7 NONCE: 6535f0cba67fbab0e6fa0bc8 IN: 76217fc9a546a97dabc9be41209bdb582d8d8a62865df7398d4f7e9ac681bcd102e31bfd40cfb8e9352b1e8ff7a7b81cfe2a62849e8b77dcfb645d2046404a83442133e245bd1df35d69dba9ee097dbc867cde7b431565c72fec31719318dd27c3e47dc5f8729ea794668d8724a1d4115adcee0725e4c1e3ce16ed9e31bd5a409cd074c0277e21a0b431d3b30ddd361ecd176a8d86927c2f6693105d7d3c47d9be8bd90d0b2fb20587623b2e838624b590a5c9f0e6d519b35eb5332b16bd2c2f9534e376ba68316efdb963d63e2c87cb0716973297d986bbd885a7306e2bdca0855447b57817285801341c10baf67bb5f71b75a11856d2551eb47e60025a0021 AD: b9948afd8818888585a6957eb59680a55a5c42458f2d0e0f39bcbada0ba0b6e72340193500e22d243e32be0e7d7bc5c632ef3dc7e79ad5acc895cbba3111d8d1faa69bfe2ce634fc0d7b12242dd8bb105c6ce54cc9718921378c906ff5e61f48fa259b25bd10fee96856a206a928b450a0098089d5cb7378c2935c4537172076 CT: 3260de6acddb17f93ff06dc7a8955f5d363bcee255bfd40fe5e92e13c7a1c682c6385736284c5cd858ce6ed251b92f5eb10f83970525f56a1ba0b8edba790ddb015307cce877c53a831aaf56f375fb20e58199f6ddb91efdf9983f263c9a746fa2d66bd4790531f85e7ad9a07cbcc00e9c122ddba77b1cc2b37b734a0ffbc29188685227ff42bf33c2e912eb592de1a45381cf6c5c9a36af93af26168c376e8902299e810e07a8ba2e23670c5221110ad4296a581151185553fe366bb4057e61b7a788f12cdfa635d9d6b8ca47a5596a765d58bb7f877242c2e0145d47c300175d7af62a29846830922308b6b69cce8413810184b27a8184bca2d8ef16316f13 TAG: 7dc47ef9283971e1745fa3ff698c6a04 KEY: d829975798d4f24ad243e4aad474fd5e NONCE: 59e25a6dd133944918709e33 IN: f84b4daf4bc6d3ba1e0b9e364dcad5834024066ab5c8e672a999bbf23a83956623943e0011e3a2883d23a767b280ad84e2d7fe5811099395edd269077162310481ff304128271d4ce5c84ea738fde318cb2528bc5cd448c67837cb7dedb632d47e8f90e351b0a8942da2f78e2065cdf827a85f510e22156bfd971ab3f123e9774bf3ff7c224af19bc79e812839eeb3f1c14f89e5666c16c44a5483efbe449237508ab2436939098640931fe3b928cb3a9378b6b9fc2a54c6bf59f34b16f06d5ef132ae2a7161034f26a6e07badc61ea51a94a20e4692a0a0525726f3de9bd1d6151fa6a0ea3acef3634847cfbc98d2e0bb9ae89e4f91a78c56558ac92b4f33fb1d96b1ade26cf4b2fec779bfbf6709e531 AD: ce0e6219f75c4c31873d4915b1af3a51c2ef5e89218ac4060dd12be216654eff2991e8d7bce6f6a437966f80c59c527679b8983e75c617c917fa9b63bc60748f5ca179645afdfe6a126a73d3fbcd41a9df6d734e8783aff3a5134ecacbb289f93febbd8eb493693264026f8678e9fdb779038ac13199459caf9c4e86f4cf8306af6dc04d9dbb678d3c CT: 98bfa05d1dc27d721378bcc25af4899c9c88fcd54d56662282f9b820e540444dbdc57bdc63b60680262aaeb8387e149fc2a759c0246f771dd9a13209c4eaae9f8c7e43439535afd85c9b12fbfc10f8f9f417079857b9e061cd24b7099726528f4ef529d14097239bafdce4d9b51860ad091c8a7d1faf39d44523973cd1df0377339485a89036d62cad090ffb9d05c7c7d79b01a22b7ee5e485e76ca9be9f037a94366968003b73915b027b161ab90fbc6ab78f6ef261ec5789d668fa2b28b1b1937da1d2337507997fd0d80387495d6953b08ac0a3fcd24f1fbea3df9218a9f0f1112d7bd4bb03ffb9dc790306db5e03d67201ab904df0e4ae283ab3d62bf48a6d79a5faac2ab33aa0599c0a6de5677ca0 TAG: 767e68b063ed300e63df9933d6e10f2e KEY: e9e41d154c4c1bca018bbc4d744655af NONCE: 04ee2cd524db41170f0946df IN: 225d156dcdca3e52139561b61c26bfc56bc90c21cffa69468863afb66c3e1524303f8f42103e435fa2fe2c2956feffe5b06ed20bdba730d675166f13118a193b06d7985d54d46e4150468df1252d7cd144afc99ce99b93ce9526ea4dec2cde1d0d72fb82f55db65ec2035e387e7923d98490cacc793046afaa2e49bed34cd7e4eaa52e75bac5e86f9e9eb81028cbe8a515870edb9a151334e1f961949855565abc51af9a1bbac0222e9bd217d3e3a642b0f3df8e7c47c2c9d5a801cc8028c425b3becbe31df39d30637c38f981d268017da818010189c93d2d135024f239407623496c5435f04f9cae86e63ef46fcf9787c946b400249d8476f82dee274cc0cd3714973f1b6e0ebc443d681af25ee26a8ed475136ed8bfaeaa8315a4cd198961518c AD: 7bc7b15c68437005a4973a06818738adcaa250949af910aeb807096595b3af54bacbedd966f83f784f651f7a2044461a94f1a6925e6d2064e72319dae75d3883a50afb6be1395d429f24029dc9b8cc021f15e305e5418d844aa4a89ddd299bf2e8c698a8f6a6cf0165c37bcf2e5885d73bb81ca15a33ea75da5946678dfcd546d475149dd1a2dab0e11cc8b07c0b06105a49 CT: e3a3521e3e99ec595a3d9d0839d8d0cb4c0929e44f693df016da34e0d8a1f3f6aae28fa0ac0f38d46ef06a683adb04df301ebcd6ef0abf9ae3cc220cfdbf36ce8c023714d203ba785e9abb05095c4bf7f07a13f9409a5759428e6c97cd4a8b2e1a471676807cf76131ae471fa4e8d15225e9996ce4c7630c4b0a5ebd85db4bcbd79bdcb641a626773560b591adae5bf582f3e92299a60d081aacac117235d6d8094e97b034d120c6759394ede2a8b67e47864e1f50669e8e926ab6fc5cc696e70bb016de92707d4800b25ad14f9c457baa1e21b4bfef0dfa6d849e0951c81583a711242ba2383efc85381ec7228b8e7950a375df405f820ab5dec8b37572897c6af443667e09d48a18c9bca0322efa409e04f57741305ea7d51ed9018cb5d0f00b5d TAG: 8aa9505e89a01281f033e9658ddb35c1 KEY: 7b1fdb1a720b9510d7d8819b6d946dd8 NONCE: 5c73be515c6ec00a10a69661 IN: c59fcd7a005dd08f3cad722bf3560f356c624404f3be55a02b3301ed756f557a51593ba90d18a1c13e227c8d5180fefdde4957484dcb81d08ee3331a6fa74c9c549ae13b2dc2a80ca0435710eb9f0dc2c908d896957b87325180d397c37ea7cf65db45960c4d791bf8cf798bd7626b13bc5e6b45b45be1a8ff687572ece86d1f5361abaedc1a7f9d9ff8003bca97af7dcc42b4399f9da4a0e7e829c0e12f4d41607303f60d1df5949fca0dd9ef171678e013b88789ac1f51a8160687d842c273a2dda93c5fba1eb5bed7476ba96a12e70cabba43d509b311e9d000212c81c483b7e9e7bae1d9869a125558b2c7ef8f838bdfe97af413b460bd9dc5e372afcb105832ee4c406d74781d3e9f2aa581ba4fe458989a03679744edb73ba31c7d9d37920d4d57a766104afc9c96650e5a602ba885d2 AD: 078f1c67d44d6e86eff0c96a146bad3420c7dd0c64d800ea5ab7ff472d0f61bdf2e5634e06cb4f3c022dff8c4b46f2a47fdca2d04572b67f24125c66a551a1f150a02f635e1e99895807efa8001f46388365c48e4afe49c04f6681510f7e4cdfa02deb3e60eed745cf6d7ca6b773e1537d057a043cf517e5388dbbc44ff4bd68d2a7243587f8929ef07df5d001a6099bebedf8f26f49323209496d CT: db79e91f4458befa47953312aeaf6aad01c3fb6e2cfa19b0ba21ce6698896e62e7ad2cef344cd324b3f0d317d9fe7ce713d4cf1743adcbfefb65e61ab6b323c5f16762ac527882f214539e034719047f9d3c0bc80480b7f76481e2fa26262b0bf426f1599d3d0947492769ccd65433fe70340d8f74fe31540b48c053eab97984f5f670651746b68617f603ef23117e9a8df0266851ef895b58b847e911508dcdc590f6188aabf37be430bbc72746ed7f5f47f45c90e2400d5be0e323824c5b86a2a0ea7c2156f482f7e0ff42923d6f7efc7f4f2cc77915bf85091216bb0f8c35f5274c0c8469ef03ee78b82cb6a5b510e16793f38fa2582ce249370ddf480e212f1cbcd77f89810b41effc9c87b0a80e5a22059b36e1dad294cd158f03d80ef3ed31b5f3b095cacbe5782986a69d5ff7621609 TAG: 221274b4be8a4fcc765c2ac319b5186e KEY: 50109c383071e4a61ce18f495d98b6c4 NONCE: bcffd0fc2496b7eb0ba612e2 IN: a4cca8eee2a3daa0c21d854d49ca73cf5b24b38940dc2b44a2a6623e8404fc30c4e3aaf759425ebff85cb1c661744adf34c6c5d538f3210dcd0270a3d12784effc48734b53c1a228db291e2e5573b6ba2aed0a7296c1bbfdd1f4a86d6057d5534675a3f4897fe3a1200c54af7e09b97b0a2ab9f25d5ed375e7bac921f28f7b6983a41580362dcf0820a2dfe82989ccf0a998286623617453722bea0b6e8fba504b93cd043c7e6c7cccfbccea43f7e87502026f94cc7035c5e84cc14a5fef9bf2be53dc379053725a9a29c4e86252369bf6dfd3cf2801af7447fd0529e94beba961ed65dcfd492398123faa55346edfc3ecff720966b74fd0ff28f443ca67f88b8f5a4a73007f79ef782bef601a0827888c4c74f7777279c625de8a4b51db94f94f846474f8563001339afb3db339ab997cd1eb1eb7b03b228162a480e129c66ad47dbd18 AD: b4c98f6d51fee205805a50c163beb176b754366e13c57c18433228a81089be18b534ee5f9567d529c802d34bbca36807bf845a9d14dd141c5de85607a4b4c5521e5aa717f78fe78612b770a4677cacd77a425e2496ae50ab2e559526c37ea723f2b8d14bd8314e4cc3727bfb835ea4062e87870b13d94d52c25f0c631668292f184fc048dfeed7a9d1a88cc5c4662030700cd8c257784009b4da9039909f73840b600eaf CT: e7a4a201f58f66ddc0b8dfdf95c859879144dfa896406f43cbdc6adc148e0ea8f9a82170c5ab54c77dd0fa6dc209b623f0f5cd4ae358af96ec27c78e7245855e94ed1a1182f9d26d45e0872da3fab9fa9ee3e58aa168925d7f779feb77608067ff45b7ec7f2ef7a48a06ee22747ab96e1b485ce144bb3cf97d1e3cd28823628a2f8e3785d9af28b76c53c3d4c741d1ec56f2bd10939f6c79578c308c5e509ba8b13c820f5912d4ae169da4e04f86ff9b1cb9faa432545f7999ca1014f77c08ae9033712dbbc0e99db6eb604e774d5df8f6b928a0bb59e4c662d778d195aa95194a0cdf7688b309abe223048937691440e5a78cfe0cb75d229634aa49ee54a81fc9a6478c8fa310d524bb15ee8f54f572dee30e44eeb9603c8593f8a7007a1b0dcf2e301becf300f20d2e868b104154651446316414b5b5e9432134c0eba97b4cefb90c32 TAG: f304266924eef673246b3c14389a82a9 KEY: 670cd4d988845b1d41cfeeb1ea740db1 NONCE: 29c12f66a74e6234ebccf4df IN: 706ed30fc736cb5cc0db17ed108229e87d6b039da5c4f0568a4cbef9d513dfbc0af9313f02d5129cf616487934f741a0a60bf11fdc8d29ec81eb37577726f54f3e35bb10ef98b1d15bd5726fe501a9249e409eccae128df61762447962ba2a63f30b59ea25e18895d2fd11431606caf6b45b908b08cf2e150c031e20e6cc649699fed5785cfc6a0e22bd8bd8c6d25221e9c9a8d2869d236388fdcdcff990cc940ddefd06da0524a351ae6113b29db9822adf9cb548d92f23e3951ae8522ab113579232e58578e80bd2fe3e1d06414a27ce0ae2e40d87745a8991dd5bd2e8ecbcad8b903195c15ac2eaf9bfe0104bae32f772a7d7416c5671350524419a6df6ed5e1df32b961ea39b164eb7e1353b046100998ba6853674ebd5ba011691a270c046096143daa84752f872e1ae32ac07c4f0d2a048362d12b108943a7007bb6cc117135b165cbf42b92df2f191f06085518ebd1a9a2e AD: fffbc936ddfedc527b2c9cb69345e0c497cc4951aae5be2748209607a51a1380fd389a14ede9cd4cbacbf822597b1c500cb0549f08a35bb0b1a00c5e25c175318dc771b03501bbe45fc52b2ceb4c04b8213fdce3882e0967ba268cf786ea0acdfca0a7f3f2f4f9ed5f499ff70230158adeb5a741da266573742c527bcc8de42747df891f58632f92a110a981a29052bd17979be21e53067de3baf4c34bfbaf56ef5b3171efa1ae60a1a51f51e0 CT: cc573518606d6416256cb233c66352086706f7f321fb5d69dc75dc6e11b9f7d053bd722b8d74f6edb023e283ac048570dc23dc34e1d344619dc648199b6bd3627590c7acfc738f10d896c0e3fbc3d3b9ef75c20c616d1dc96a6c3661b4f245ace3083590b1d97b936ede9994b08bf19189f573919eceeff80c25ba1584a1a8744efc1b2efcc264afa045dad460d4a97553d33aadbf6dde24790853a342349446741d65d3551ed343e9dce6b6cf6131c9bb3524597d0ce95e6971c01581fa140caf86ee4b53d17befeeeda4f5ce5b255a429c27a169aa075153bd4f1924df1750332aecbd365d8f65a2fd17f6abe9a054b3a2abf02a5b2031282715386c166dcce653bf3f3fb67aa119459bd5ef3bad4ea97aef40335884175d7fb9bbb3bb7f3114cd68c8136e8d02aa204d282403a34a89305725e2e022a9db9857112350e965d51b7b3de7339cfd3f202d18a07155b5bbd11fd64b TAG: e3c4a624a012f660f21be3776f20b440 KEY: fc5b726bbc23a67015c35a1be5dd125a NONCE: f812b7661106827f31a1e4c7 IN: e0bc265efe59c9d6620387755a0bc17a11527fe136b765895e6386b9939c548bbe6d3b35eb92a90c05d0931e5dabad4d42ebee5af45be0106aa68888375a2619f7418a14570d1dedb76e8ab52a0a87eda2570d2c1d903ed9ecfdc62c23c47cb7e234dc617af0843a9f375a58f930337a88379b2b0553c4db974ad74eb46d637ea4e7c7aaafce16971682b772e1d85bb4a7272bc56be9bbb55625a5085e601a5dd60701bb07f69c755a57808d022ca0a407bc3d35c848d6fbfa6bf816d470d9a82d43511c13fd0f496e59646e65c84d7652589c542ae2e73c5b7aee83b9ee8381af1ea1f930444676d8e3335b271cb354e9cd3b17e7f1511787fb618aae930c14cd302bdf3a55b2bb12a61e7b930dc39aeef36447bbb2f4d9f5fb55797627fe1d0b94c04c6817de6cf1e7d6e2660c6f49c0ab4b31cd5b367b912933d3d1f0a6b8b9556fc6f8e9ab310482ee241fc221634b5094481ea232931d696c889d3d37e1c53cf74a3d5b AD: dc41779816b352803f282410580b0c03e861f4f7fc98f8a4cd9a4fec0c0b27d92023c081c7927e7599cdf59031444e74fc15dfc12d3c144762b8e448b7ef6772612a2e7bc34a048bc33dc56e99949d569df7e296b66cbb37c66dfd2ad8e7aadc350f8350cd68e8c4e2461290e30f9449dbaf4fdc89221cd75493d33f903d365ec418b327e3dd6fc381a8e06c48868823a42bcd082ab16b2c666b71038273427ba1ceaa57905c655f0ec4d25401c07c679ff5367a9755 CT: d64bf4eddf29f08aff3db1225ccc9df5fa92315d70bec762a001a21f564483c43d9fc25e26ef1cd8426f215f4fba46a4fdf5ea96e6ebafddfbbe15ec5a7f8aa6058f8f3b5c48339fae17738b374bda2ae9f0b95d721342d968ccaf1ded6cc9e0d25e4074b722c876565c73a80f9ac25c8ab7c9967b79e5f924697b65ac4f6cd8f1dd6adb5a3c943c5b43d0563ce8656dbe39dacf220e600b82af2b5ef9de009b51fe6ac5707d3b0a15e87ac4c27501e88e9fa4fb84d10cc489b2738fcc751ee5aef230d4b9e4529cd3c580e2c248ce92184fdcccf8d94a5da4ac34acb13156dbc3e676bd26c68e1065990a73adefaa4a58db57dfab709af8539f449d3c49e7172c6ae686e494a92386ab28caf37ebd026d0e670ea85a010a6fe8312fe5a71fe6f0c7c52dc80b2dc39489ccc39c10a7d3d64ad66ccd44638c8c9d83e1b88930d8da56e978090dffb1e04a08303fccf1dbdb1bb160e0f80d4493eccebd984f898ce877454f84b0 TAG: d69dab4de29ca8e91f2e74888f80b841 KEY: e63611c19ca5deb1db80f97a3f5149a8 NONCE: ad2cd6491caceee3e19782e6 IN: 6354b76422dd47ba1e715dbd271a07fcdf69b5240e58186b82b1ac443000cca1b0c79dede1cf998643565650e998bf4760dafa08afde120368ff9fdcc2311f78d803c8324e385ade4ccd2eb2ef51aa1884a496ec024221566c8c882992fbb830d4923a5c5d7b99c7e6e7a8aae5926d143e19bed7faeaf7c77bfe7c9f05fdddf75df3df2425bb94a63f54bfb1320bd32e7fc2774be67a22f2410ff3c295cbc3fe566b8c9710807722198f03f56f0abb02ca55de5174d7f9ffa61c0bffb88730886c028451062d6220586bdbf5ff91ad6b1033f2c9d6cf3c3c7bb58a070e8bb1c3a39e3d04952961849cf55e64033ec929f30b9ead497d14b6c89ff6a4c008dab0104e7e20df6d6f11474ab680e5bec789623b2b693950a5d17dbc5b49cf80ab033b1910a9afc4231254f88ca13f37f1214753f32547ee0decad4bb93fe229b6c8a14564081d8ce5d47cd45022bb74475a709d84dc5fb0fd2e46ebc9940ccebcce3b674a6934d4dd57ce0fba9a1407beb06af6d1f6d70275 AD: fa9f177cd36c990d4b22ff63aca475feb17de03d3a52b4119f9b277649f6f53f223e29e03493c938688be81151e268928380b407039fb38494cf235ddc823e8cb12f42b50b2feb52be05a38893d154b37cd1cf2f635413d7819354e29e195bd01517992b51efcc91e10932dd6f8a859c5bfd77f2e3efda25caf034a91053da8936e1975fcbecf2ee9784bfae7f903df4ad32e088a869aade322c7d14fc4143c50c59112c8178d00a0424f4003748d28956c9d3a6c57a8e0405d6509147b50e CT: c22ffa587dd3b6425b81890f8eff36af3c64549c5a5f3e1deb44a7f14c6a179b1f76dd01d546a4273fd6d47b6f9e3ac5e9b641982d1002fda49af071d1dcd88ae5d0ad778d846d3db243ee067f17a91bfd808ddca26bfb67ad28303be8f582de507fb89bfc79c10513327c883bb4c6b97729c1d4aa32ce50703636b2fda0f592174f2ea36b26691e6355ad20bd116619dc728895bbc0cd281f58aff68d39e16087d3cc02ef04dcc93e9bf7695cb15a8f2db51df2e22a2f04be96021b4008f50c94cef256995207ef1dd9c0137d4cf63aba4a0d28aa5ff7240bf20895f8e9585c8c16437edb41e51f6ce5a4f965f0abae8bdb7c7abba2ba82eb5ba1dffe56411e51aa87617c62f7f6af3189647340865f92a16987ab784b1d6549099b1a02b369198ae9f8339e9e197f41e2798076b5b5fa61aa7fd7620bbcb8828b2332829d554f21b83d018b59f785e3a2db359b36fea9a8f085cfb668b3a7d80ad38b85e24472e72916bfa2887036d480f6ca48acfcc7c0f471a9501e TAG: bd674531985fa355e1ef3b3dbf8f70b3 KEY: bd7d9a251a127a4dd736d0f74e68755c NONCE: 4226110c276cb7870cf1c7b8 IN: 6617944662737762aa77bb255d24ef951b69adc74314c72f37f32dc091ccfff067a89b834b1cf0b58cc22f7dd6970104dffa1f60b2ba837ca6ff834d07c71ac4eb40416f0f50303dbf6d0b4b0b9d9afa8da46c6753008f093a188cefe67f051c8bb3b6121841e2ba25b8b801db329b8da7d0bfffc29a3810d2d165e854a9eb34b6fcfc7c05bcdecf8f20b12c69f5641441156dd85b910557d1355e9d07030278b494691433bd5de2858d8bbe2e3071ff450f113ca78f385cf77e6dc0a6c3888e3144be91404deed2afe438240270e9493811343c62c2ef0e785921f1ccb2d2d029c5f0365f46bd55bfa8f89d1d4c30c5f6598fe3f9111df847b27a06f7641494e4eb7dba8a5296f90bcee8cf11c1f1fc16c52868e8f2db2dea75b91dbfa023d5555371e1461283e3f1695e028ea00bb35b6e81bff8f128af2d81df6fd2c7f6f42bbe9dab30a59ea4788a53cf9d6a2b1e9cdcc9f1883b37c91eb8bea7659fab41d47f6fb5e453777b589188805e883e9e15ae1de4e80860bffaef45a1e0a01f88b5d7d948e63eabbd AD: d2f357cff8c172e6652cd3b420533b8527a6ef26c8ed75d349dca2106050d80cb22835c15861a22d8c7cf8c2c2df9407eccb0c21dc7078de4b8b91e82d94a9916c9a284c7e49c8c7d001721a9031530474452588e09411c66023c9c81b7891ed271d371d60dc70f0c04ac93bc694e5b638f7ce901011e1a17059892a98d596666d102d9f7e0de426449906081651f88157063729176f4608f2d506c9637086f8a56821538a6241d8ba5e0f37ad3ebfd0b9f3b3bf0ce18c095c4533cfe33f6a98 CT: 7db6315e1ce8ae23774c2e8826811bc31b2d17c869691248a5b49398465319576c56c2a64e22ab0108c92b52d9a6096f33841643099cf47aa1defed63b7855f3a4586dfb8691c982eaf102aa87888d09b6dade960bf166e48d58999dd08a0802e109186495833a8d8bc5d6d3159824d1b89d4084cb831b8526dfd1c620b4fb6000e45bfc1a101984f3cc51d54c793ab8f034066922905c532dd60c7d96f06989d10c82844f4b20e872538f27333e6d8656b46fd819936124617cddddac8a64d2a81a0cbf21fe91293c8ad6af63536d10c11a63297b620350a6f76e76afbbf2d8c63428d46c9ca123b5022e6d67fccba1011b57aceb10da0878bd873422438cd949df47533eebacee697f9856222344bc9c4876f8435e0b999676d141135a6f42ace8f99b16d86e427f1ea4d4ef524835385ee1cda9f4049c3f6f9226a69b08528bc3970166f6f9067ac30f9d24b7da6bbec4e58286b3b1c5a7711ea7965ecabd02375b38a603d49c12131019a9b2affb801c91d54896c8c29e09f62a5fc0b100b80ed54b70f568d7 TAG: 9fb615a8c354e10560c3cd37ceb3c3d7 KEY: 71bd6158a17dbba101f840c6638ca058 NONCE: 9434c5b842d5dc501c774114 IN: 2982cde70d98014e925eb46493b0bf91a569139be22c42cd33ba1f8c2bc884b2501a0f49d6309344874325345a98481287ccc6d29978d1e5be73740fdf2f3a3fdd0d7c0642be7a22e0c98f0886ed51bac87ceb0f2caa79cf702ffe880daea115b8af6546a7bc18469e07a3f8d8b8a825648684e2b4e9412cfa0f895cfa162ae0fbc11f8cc4a3252b2acf89e8ac67de0adb91e36dd510f9d8ed4eef92047d015b2ebaed1f3f0412d81fb5bc82f548dca18d5205995c22beae86894c88aa7b50cc82029abff7c8a56d0a6a594fb502ac9f11cf10f8ba9967497e0b70551a6440e15285d53befaaeea2dd2e743cc056bbee79e47350bfb49178454aee0c78372db372d99ddb910dfa8db6556b61d64e8ec833fe4737b13269583459a39bba6a1202fc709595fc0161f537bd825b3245bfc238a6c7d3b2295d1857129df86db0891e022199c793b319ae965cff94b078e467343796992992d388aa210d50599a3b2bbea36250ace162989e3c21249115a402c544aa82c0bf7b2cdf2d0ee20653b1e07cb42f9d1d0575ea7220ec01bb31deed93fafd126cc8d0d268 AD: 16561102778d04ba7d68de3d942d313a63f1ee6c3a37397348f01bc83fb878bb1035748038047cca0c07710b9d76e129f9b881037786907560e4ae9592c02967df22af893b3ad409a3b9587454afe0375846cc8ad94963c7dc61849ee4ec1406dc7915ee5477bb73a43035d67e822e45d3169db88b269824228149abd333af8e41d2be455bfa449bc2ef48f0fbcaeade0f6b62d99e318a2ca44506670fb1397c47d1931136cffc72ea33a0e1e97745e938ce654b9b961fd4680117388dabdbfa134c9dec8206797e72 CT: 6da55c8a9c5a29eaf8dd627d7048f0e6cf1d52063bd0a7f8d073e66fc406f37fb397f789e4bea1da21a94ef944a2a0fb9a35a7acee3d3687d8d713090a1f2dc3d118ca10c85f5542f9f6f40a4a79bd8816efc75cddd4a7adc9ba91483ca70daea0c65e975be46f690a2182602b29d7c04991d2fb61f154f8bedc194ffec5983b12c4f4d9abc0a415a517f4b8923a2ccf1d5213952133b82621dfd4a8379cca916f6ed9e58dc94baaa1c1c7d8491c3341e0751d90d131f20722bf2c44d097dfcb6eb49385dfb8c86dc47a7dce3ffc3eb89f32b4f106bf48c0d69aab448ba315145dd7ebadeff3798bfd004369595f48c9e7be596fc181bac4573d994f6d7a778f353e3aff64c3bd5169e8525edb96f1e97a5617345fbac9f58c0885d52ba25a019a4e01deb3ac14c4739c0bc73f28d4a05bc5b0be11477395f706d45ca0f7fd92697e6a8c5eae587dc9cadf62c4e8c283041211c3e51a23b84bf00d3bd4be490cbe9277268fff3f652ac9eea2734fcb016639f3b673b0eddb2691b10713fd5bd606deda19d9429ab17539dfac05b5ef87c018564cea21fcce7a TAG: 9f64a1a1ec8b09b1e64b258744ac5f7e KEY: bb5e6c7b672e7c5d720c2035dfe8d42e NONCE: daa56f54bd2dab11ce5ebc2f IN: 95ef01bf080ee82e8ebda43598dca58db3acabd7b3cfbf5183d07bbdae49004f5154d6bafbe1114baaf4c624688178234a6176756718e79bde83422752e7a9ee87648b182f8ebdd96213b640b76118b577064f871d627d2a7218ad19d45499ed3d4d9bddefdc282e66d1d708daaa558ced4edf38ee6f3a9add0f2126e94a707261234932d0e3674fa085a7e2688b854bbb9bedb328940b5d35fd0eb85f5a56f1406d7a8eb7316a17eafdd7b87ee85d812a740041c8ff6057a462ea51bd07df0a0b0374f5b4ff65ba48587cb83d20010e67f36106e99a5b733b8627d541ddc084ad0374432ac165b4e81c8601e7c180850e54d8db89c092d356dd617439f36d65422a45d116914390320eb1ed0736e47afd5131b7422234a36c5efc5fd578fd6674176a7ac0f73b63a3f5188aa9a7773a27f50e103c2faf3e0488acd1265055999bab1150ebf49bf03728bce3ceb49307e2af7bd5f9ac307a8d249f55514325a6ab58fd2daa5194b07fab933db72806ff4159075e140d89fc3e5d6b684be014b5f0ea1c857a97196f184755c637c4f3b8bdeac41fe1bb892b86047e88facc04e2d88532b6f584f4ab378a AD: 3dc7d6102a17877db95465015e3122681258437f11d14b83f1159a52486b4c3bc6037ed33de9e856d3c89fc5838aee587c606cc0dbed9a58faad042d51042e086545fd9639b18650bd531065684076cd188f11508d48e2a7ee585e8c8e9061970a2d381374e0bb5ccfc8972a01d9587872ff0c925315d10ccd8b9cc6b1450c5400cee4e2edf25ad952f31da22c7f241f97d966bf491ff2b8f889dc798a24e184c64290656711a826290917db99e2c2bc679c92d309a1856867d9428ca2fe5ed2a3d0476810cca53b18526de0e88508a67c67 CT: d5c7b4282f37776c03c6efe2af410b10caef49943001460800fdb6408f3c7a9f7f32d8db36dcdd0694170975536447d84c56f84c966c28decdd607237bc7ddb15176ca20be0993f309d2749db68666b2efbeb4c68cb3982a68f67114c0dab61eb9d4cf4c23f1847fc36bd561b0469ace73c80b0347af5e88f051ec6cb19ff8335dc56cd3bc6cc81893c9234457c0d8189cf1234a6c8a262926402eef262c4c5149fb68053480ab2b1512a91d50c48dabe637aa410d6a164dbe4f8c1e1c0efce8687dc858386c92ed7fd8b8692d67ddf453558d28998ca1b57a6c178f12f4b64479b3367e8dfe53f809fa7baaf8d1efbe3c9e2d83b0377cffd8d8dc172a1eb260762c873af724248011d9e0cef6971ec12e81d70aec923664ff7f7cda9d60b3464ab14488b243930845e38e93a8683787641b85476816dc73d17a593b68935e4cf71d81ed7dcc9202db65e235dd69c1f2ad4fde4d566970923a24bdee799258a3198ff2e126870252584a1949439b7e32318af204ba164f9f3488a669800703f988fe56ea6b0b2cf662c43e103e2e63b377a85fd8024d3b40ff47f30fd3dd6a0e07e751d07d5b0e4afea2 TAG: ab140e2a4dfe81a064944610e0cda2cb KEY: 97b507a2e09cbf5c31f7be6dffc78d88 NONCE: 3f607f0ec3ddbaaae6b087e8 IN: 731cebc792dc840ba136374a9b654b5d61735d2d85a70646be9c470918201b9c8f756e971cfc12e0a93acf386809f769ed64a19f47f266f3504d47725672b2aafa611456987fd1db71d16a4d1289ad442f0877da4f192d814f9302a1207a8e8e48ed90f6b5434b35d47dac6a0446156781ca1fa41f7bb772d1eee48919b4e8371cf49fbf452187245a16b51daf82e35b77e80869eb84ee9ecd90312dd3e6e6023ebec1a21b4279bdf21402969101cd1dfefd0a730d3341571bdcfd36abc675744f96bc7445f77f90f261b1ae207f93d17828d39eafae394ecc2e65bca79562a706c279bcc6d038edb9d7a344ab1a5021f9a597b223d7a1a99e1268dceab20c23e0208b9a898e99d83b2e788c1b7faaff2aa6145f8918f53cba3168db274d65f2e419fc233927599f7ad96890bc1cd4f983276b126f7d10b894a67237c7b67e8d633d62b39d788cc43b2f8a05d87e656ba86feaa3a729b0be2abec99bb40d177900f20b559c4e0ae2034409bc9b86c54644cab932e997fe0554e7eaef7b247aa00f9e1ec07aa9af3a86470075324d02c32425309bbcf5462aa20caa950ec9653939b043c2e94f0ede1b91df0068fdc903431008fe16670d77b08988 AD: 0c962e558fa573b2052d3106dafe00e3acca3df673fa559f950bdf9972e20b9612b5c4c96d50997261be7f2fa978b793d5b61e74b82541c8c02305431a6b7495f948622075b5d18992d976737e1f6f38aadf90bfb46f7bb9a7871620218564360729844329f4cd2f0c77bbbf17661529f88c80d1e000eafdbb937411cbd4295ae697baaa6c9a31206c5711bcf31f2dcb50cddb4619d48388a57475df684f4a00d432560540ea4d4d337ce0284467851e86447b1f04246fb2167625a0b3cc16873841d23551653aa1678ba76689664e16c7354c87d5fb7d40287894 CT: ff28b33337262980b3adc761b8713f01770dabbc1f458516c721c6a19317ed1f1d6520fa7b2859cc577fd92fa3525273f4a87c99575940e941914ed586e7aa5637c4fd2d98e7d198b52924619dd68a214389cd486fbf006ed9c72e6066d92d2278abf1fbf4b4ea1f3d945bb1653eb3c217d7201d5aa40d34c8488532d9818b06e4c0e97c4cca7c9e2ef19ab5a397db27d4465f41585ab60342a3102837cf43c95db008f0689ae7a7970c2ce9fd685e2811393931a4d169701068b6575b47e88bbfba48281ad4b297fc3b265c0590be6b0208f6a27594b0454e55893c68203233b60d08e25fa66d63e76a869a4b84d153c81f1faf46f9a3130f7ba4718a75366af23e4377d60901b960a4926b850f4d4052d6ef1a5c54ffb388acbabecf069a5841a76cf15ced838239a8392149ab2d904b482bc661b3cbf4c74b711778cd61bc38499120b87f0f45f8a5aad51c84595b991d7fe37582b1ff963063770cd0ec9d98d78ef323c8bc939cf3b6035a5e1f5d54cf9af44d49f9cb01b7d1e91c2e0da110a33e372b07402605ae81bb4ef5505ef51b3dc23ef5e48f3f16711d2d72bea5ac90e85a37c97ba2d1a4f5117a616b3865d97a65a08265ea0c8fbf TAG: fd76a9ef5ce12640f3e782a40c6d0fa4 KEY: f46e56f5394bacb222b30fcb3f5d5547 NONCE: 6fc37c122d6865751212d4f5 IN: 7651092066aa20eb70114f269b08e4ece1b804fa3f2c5e4b94981d41b3503fd127fb21c1ba24cb871dc6f19c2a674561900f73e292f618e1b3a285ec79bc7784e3481cfe36e1117fc620aabeb088585aef6632a7228a5f901c62f248b9ae12c7a6e7e5052d9739bfe303758989af254b78d5a42c74b13def0516611a1c0323e18070147f67cf0613cb22d83dc29c176b6823166c35202c46e85484640221fea9441b1e9f4ddfa4c0a2f4b2599c6fc73856e3c18a5905f85dc919883f3fe9dbbffc50e89e8b71b9a36c74290718e0b89aef1ec21fae49d280d3776d3ef79368634716cafc8f2eefb3f449c438c14deebb705a42e85274cecd11932c9a84f0dee48e8a2175b57820c1042adcfc42ac9a39341af5ff6edab2d25eba8f0219d3737bd4e7ebcfb3883877130c85e5be6a7b87cdaf4d37075eb2f0bd0d1a61567a362e8f66302e56668590b49b5c76eef962d1c310f8bbfdf8f57f3f82b9b2f72ef49cf487a4e8618476db71c6e0813e908126f9958ed5453067c6797eadb432d07de49dc2e50a266eaf6174cd1b18ab707a53dd47b564518b7bda452bc451a25ad2aaed6f2e7a3509f704954bff2b50f5cabd420148967ff830b0c4804ad5081b42f842276c6addae1c3199da8877 AD: 8d920a6c79114e667faf28fce2f7924c4288399e5b4968c711f03d721e885fea0668574ae965e9996aab6b30b6eac785cdebc45a305b806ea90663927b8dbe8116292ddcc56938c0b1b1639e8068db1e4cfd101af5478dd63fe0209125ce92e3f7f7fa43dffecc07ae1621f32af975dcbe3f34f1dc75c75fcbc4c23ee8b8900c2719f4a9f50e57b1f9a9d9172fc746112f12b17b85b0371d0472d3c193c37e837d8201fe7d3ce588ab7e27e8457c34d399edfe3af2142a2baae6c6ec74863f6415ce30b17c17599860bf9a59be41a6011104b9cd0b8241ca52d1f7910cd3a3ae8693e47f CT: 4877203ae9162588de263a70fd978343e6e2c7efc107064c1a314e210e01633eab9cc234a86f0815e515eb2148fe67023dc7c67616a575c0c1adff2ca1bd7867ca351963728cbcb6a41b5928e83b6ad97e458773e543138f87698c86e6a84725cc6330e3550d40dd3103d0aca5139b2e7f7f7060e34c383280a9276aa44d915460cb664d132056955b2df063a03fe4f844122bc02455ff1558377d8c15419e34417e3c0d5d69b69943027fe32384cd53e121f885293f17cb3f2637261f3c9bf6321406f3f4e59dcd37972e3073573aa5d9f78e021d07b7036405f193c65a2f8d47f9a2193623d403706364f514b1beda6930925c1afa9f294ae625673e41647a94830dbfc45a4d9029d5e028e8997d9f251aa7da65b48e1abe8bca5453482aa6d1dc1168bf4a6ab5644d623ba15dbf10b0f46536b35e30fcc5086184d0eda2af5016f370c9931f1634331458c51b575553686b511f073a2650a1ae9cd2a64d8ccb14194a659bd533e91cac42690d661c5038d0182cd8e52bc751662508d2253460fcfcc4428ba7a55f1db80bc11af7576e6b9ac2a35929bed35ca82fe497a65c24d04c96e6d9fb3bd66fb54f01483b766b614a97e370ff406713d4b811e1327fa52692355e1d307fd2ac67a4 TAG: e7208823f0abf2571f81c015eac317d9 KEY: 4675ade296a8c507fba35f62c82d9230 NONCE: 51fa718d52a0279ba9971490 IN: 32b3a91b1dae9cddd5a89400de90ffad1e1a126c41459c512c261f089787fcc18c4583abd4c9e8b7844389db3d13e8bd5fdb68bd76c3878344241eca6916049795716b257636f1d25230db71bb10725fe4b9217d5643ea14754a69739cb62c7e99c5157bfb8c153cd754a2ed10bbd574c718b8dad2a556793e00d8d5a59bdd486e768f2e61ea822822532f8b4d77b3446eff2cdfb7d88d37b3e7ab0686679e02497abc04ef7a240d456bf999cff4268bfa6e366831559de7775ed6a6d4f02d489d4c305f25cd96f2239f2725961d5cd823d72dea41a1c1f1611fbab63d339a8dd47a3a31b7790a605d3bbddfdfb66ca6277a9a3e4036e8662d6560d05a7ee8a674e33d6433aed82fa26e5a1f5a2f47c28092ced2d182eabb9962aa8b10a567ec3705be6889e1415713b9ef08731393cee91370cb1d3bcbadf5710eb841d37992a7aa3573facad94e806d0019194b2cf9c41db281f6ea462e2ab7364b8660b956e145a13b77962c3191b2e46ab764392910cb7410d740aec3ff2ab8b643ae7e65d34f895189bb41902fbf2c5476301600932728008ce33380845f22b7db3a7b9accc8cf0793bf6ba37d405a6bcc8cc622f1cb205cd0b6e7fcbf3a6eb1d3bf2fb91e98593959077e8bb76adecdee2fcb008cfc335d5465e4e10e9cedaa39 AD: db35fdd7b9533c5b8f2e5bdb427d8bf42c5b83cc11d2ac5ac96f6cf95090c5f439bc5d4828238a86c5d444ba0aad7b6c5917f673010f0717007a77064bc4d29dca0ae96b381cc89d04d5731a0f985a1e8071a0fff733889d0f2475ae9277b0ac5f7b68a0533f16f904ca15969cb24c24faf7a155ad51917187c5ec8cfc95352481f0e9002eee9467035b3d618b7f6cf9faae1de33af239e6ed4038706b735431195f355a27d1e7098ddd1f34fbb0bd3449b8c7a069b486984d09d50a90a099934eecec7372fc137b5274afe57bc0cd6f49b1e17638fdc8602d31fa975c4f0223349d40a86c36fcbf43124a4726 CT: e1e44ceef4e08b85ca5fddf58c4d6eeb9785e0ed50be7856e74dc1cfcfcfe92f0e59a4fa62db0ca641b0be4da12a70fb443ffc46c8f5f28ce467cb484a7a302dde2d459da83d8ca6707fb0c6eda6312e37c095276f9e65b44fc9a0ed7546e0224d639a7ae396403b0db8be55276fbc380181cfb32c357e99a4ce0c33e464d1feab4a409651752a05f2dacaf85125005b92a195628bd314205b8d2aa1aba19d32c789d91e565944478e90cd1d4e10c475b79ee5e7f7aa22456773febc5d0684ee0a26ab27cd391fbfa1168ad28f46b114d31c7a3794cc216626eb41655990ecdd93f97a7594330a78426da7f2e8aa21871a1207f769dad7db7dd794382a0f50dd8dc76ec3245576b99a32314d3b6a4046a56fbe178fc4cdf8bf39c86a6ef320f4cc63e5abb6ac53f6b336fff96a22dbe2e836c3ea9f4b39ed58d01d45937c8b5af0df6a44bb78bdd59c1f1ac6643fc710e27a4fcfca031b6435ec2850289605e29db5911cd2b930a4fc28bce98b30cb2b6b9504ebd561e65efa52759e64b435b99ad26b7653c6bdd21c964d20c5761bc3eac9e2986cee13068c627721a90862fe387382af2895efde343e3c9f13a3ed019a144533af765424c7c80795cb30ec132e7aeb9a0c0c75f2b885a4024325a491eabbd30f81592377e040cb9034 TAG: 5100a3a60ed7d5837ed8adaf78c625b3 KEY: e198729362ba96f79d5e0d89fc404b38 NONCE: 36737445756c6060d9e95d16 IN: 38a030ee5fd954f5a9cc662014ce7420fcddd9f2ab800823246ad30ff0d0f7789fe11807703a731675ceaa31b5835ae039fc0d111f5725ce4df0b9a075a8bd1c1112f90bd64c668d1d9e794228aaec7c17dc664ac88668cd06ef9c425f2815891ee4b737b18b138001eb6c353bd5fb7ec26b2d26a12ad2fa707adafd884be4251bfcf5e5e8f3979e46d90a57107e7e4d04c658f6224d1a288bdafe8e34df1541c702f29a1db2af2279380d49109f17abc4161a6052f4ef0f6657c7322eee44f4cae949dbca447cbbceb9f10c5be6de1d8886766794a3eddd736ac7acd3bb87cf11e88f246fcec505f595902d1121f68557657f81340261684fde901c079dd73f7c9e1d4bdf90613e7790f334884b668ee04c29750d2baa21ba94f2407a512dbd8450ad4dfc0de22dcbb291045e0fe43fde0cf1396cd3bb959f2dcc1f7ea681d0e7cbcc73e7fffdea35f6dbde8ba0079ad97c8767bf76aa008864375aa0b02b89d8bf2ce7aecb2403648e6069e209f7283f1cc180c166786d02d984afdc4f8eb9479522362fce0633996c758d99049b25c89a79f7257627e2a9557363a290a0a3673407a298ac1cc034793cb7ff44833c569780bb8be9e937a3a758f1c570ec1c4865efe85940c08a09430a9fd36376e28e127f81789e8a605405de9c452cf8c7131cbe37597c9a73eb47abcd2aec AD: 1b2a8522f154e672ae25f8494ff35d2573b343213a2fbb07a417d8a60510e7eb1ac5ecf229429f330809c84b0c1ac8f7e28c7f7414db905be8f5fdb5a2f818ba8440b8c9c20f8951b8e9b75eccee79b096ab09f4ec99ec394c7295b30d29060790d3dfc17d1321b8288f3be38b17901a48470784d00c5b53f895fecd4053de78d074fffc16c302a4f2718327bd96445318ad247c99c0ad4d06405b6509ba8f6bf47755f0b297c4616790b25edbac2fddc89b8d509d6955cdf66d30f2bdccac6f856a3206c53c550a9970ec450097ae4cb6f5606e64c750042060c477203479aa4da10edd4d28ad3df96d613194646abde78eee871638 CT: 500fd0ba2adea1fc2ced2dce635c5296edc590f961c26c6fe285f4ad84f6e85719ea6bbefff398991c03a423931ff493ea47f97a8aafcb1ec7a34101ee8a378dac29f027c312306f74b6f92a6eabc829c3117ff77b6859e67b37d05d48b2c12bd30251d32ef30ddaa17894373063e2a593ad5139fba87d38a045e2e4e0470dd4c5555ffe6fc70e564502be523737bcd392d0c41e70a594b29f949838f9bfdb6e87fba327c430b75164555d7a01d7bccc33f2736864a2200e4b2c4d7b7192cd22f7549a9dc3ddda269d78a4d98a344cec44508bd930a14edffafbd1f25cfab8a29b75d07d705c3291de774af867e2e595ca8fa2bfb9fb3cf2511552f1c872fcc8b0878c4eec0fd079c7b17bcac2931181897ad50c03880102109a42c34c70d64ae942c73693f85a6d1230a734fb35f70c02c93813700e21b2abc304631ea9d5392c67864eeb47948b7e377bb51e3a5070524aa0abcbe0a624038f6e1b3c062b7661e1471d6cc3dd18143d6237c0e32e80791d39becf94974bd765bcf6bc5a3d764584b025317f64a67d13234399e8e9d10dfee9a77ba887cce119e09c812661b487561acbc718bd200ef97f76a4664fffe64b367bc36f7d03930f020e0b1db0d8d36103da1dc8dc6e0df00b2276d25c8312222c13d8a070b108a1b3a83247d41940681c59e08243a12c623c2f2d2a TAG: 7c3eba9d36b26d27a7a0325d8c23923b KEY: 2167ee6f77730766fe8b4ca6c8f02708 NONCE: 96bcf14cca5d7c2184dc6eef IN: 47bf9fffa3f4815f8fd7838c0fec7e9c08bca51970460bc013145f2d651bac1cbceda192014a5f27c991ed3e7127903fd49a5b3a4dea1194ccc10eb62f911586314ada3aab0f8a5d53c90560da3681bd9157892ffb1a381ed33afe203e3c09748487a0b71b8703f6e5f84d9195db08e4c4338343fb8e968d9f5a5b1606b6b20fe60cec3b54b49ef7bfc81bdbb2926ccc79697d916c3b622871dfe9344699c509f9b2775abc12c486e71a008cd525d8610f51948f75bf96bb94c59c98f2e9f35e8513e43898754f7338d7fffb87e538fe6512832e5c2b08cfe952985fac27b0e81a4edf9fe8b9f2eb79758a99fed7907343e6be072bc93fbfb5a539142a18af4e4710283deeeba4e0c1c1cdde7e886e7d04f817a5efbe89d12cabb34153856af1cc98c4df21cbc1da3e34f0ab74842a8757a189336487d3ec77f842b10e2efe3e1e232fc1dc89d16dec865cf6e9f422e7b9d7a4e421d79657eafec5451e04174b3372340d6fa8cbd23fc0215e9b6d70a9781ff3b8ae049bd31a363d3fd465f235ce463f720e4bca114d21d3dc407a66f28df01549d168544478404256715161cacaf06d955f525546d384a44ee0570d8c70319bd33aa07b5ce0a891c467957d5ca4d2523d9958a8b4b3e5d3b0dbd1f6a1df3acd38888d8383ca76d177685ea6d2d65bd717203ccf794d613b2f4d50894cb12754bc95fc19c449bfc10443c5c1 AD: 6388d98f7a8343cc89faa48882e8a60f83e817f17f68eb338289e2deeacc6bb5ab6d25635b9e0d29fa87ab97e5f29ecc47641e5a4e0d5f11d04bb25c7dcf21e7a93de1880ad022c838b5c957616764bcd2a66f1098ae4926a93e1726384171cbd9503e03b72c77a2721003d3b391f2aadcb32bd62e492528ea3ef5e85761cec47b846d32988468391db2f23fbfeee39cd89a45e71e4d4b29c6fdd8abd1399faef491211e902b0a99b451c58211c56b1a63dc2e8a57e6efab94ca95818a78fdbdb533f286b83725980b9bbac766d3b3ebfde01532e7ab1414eb6d52ad3b1908cf58ba67449cff1d605708d5fe6b21c769f99874249d98ecbb3c62956ebf6f47 CT: 73c6a7d5e4fe14e991680acff32d660639e46cd0ec231ad155750e53d6597bec3070f5e828e420cc2044d5bdaea5acfb48cba1e9dc52258fcc5e937861e9a970cbd04f10fec4bebd6d8cf81a8925e5ae48d8024f7c62e35aa370994760c827a534e0a309655b3085a2ed8619dd0dfe0560c7dd5e175fc5a5971cdd50aeffa073e206d81d1932f350d9b3f40d4eb6929bf7957d25b1b12d6eeade7aae4b7277b6a1896aa0983ad5a5e5cb5e8e86b1eff15ed0b48149872ee4439acfc6fd6381f3d9527f1d1a1452927beaa3e3ff188681408041aea39f28bea779ac28b83a4eaff7406b08df2e60d66121c853800e56b3659329503bc122e6c47c1e1dab53986b2058685409c4a81b057fb6655de0f84ca770ed5600db097efbadc14f07d80cb892ef3ab12ff72e9d60718dfab82625a79168ac262b4069c0ff14bc5ea3baaa4c0559ef23f2535ab273e3bee0b2d1b4049f20e708fac2430af82a1a5d148164c19a956a3db8e44c8fc7c51af9458c066719884f0a192464c668d37372d5ffa4e2a4eff429cd57eff1b374d501e06b9d3cbf8480642bbd141b208ead6fe46d436507099ce460000aa033528a8d813f3cda11c8c03b427228c5b24b1f0fd15f704d7958aebc580bd5d3034667853a67fa51eef18d102d65507047b12a939f8a2cac8bedc027db855f89ffdad34bc726f6c6641e3c8ac8041003f65cce96cac54d TAG: d93bb140c5ad0362ef819fe04daf051f KEY: 1b63e84a8114f73f918aba186239947b NONCE: bbe2973181d9b48e801e3a55 IN: 97b01d166bd2ec933b48bb7376ef131fb792f2a26edd267a713570c1dcac5a223646f6b52b0774ce323efe526b12f1ae59ec70bf6ff62f857374299cf4ae182015cc0cc2545b68d483689c82f4356dd8a06cae383848cbe75f08c5deb198c7effb10973b21fcb72cd53f6baeea5e23b7bf4508825111ab94535ed5ab9b51266d6eee98faf47b6a3acfee64c4a6598baacf1831a0549105d47b72434f498d54ca59041f07d22f3d6b177fe53b5bd874548daff7acab799c3253435551d963110d49fe1d2212b7e17df5b98a0884d9b7153253ebb73c0fe44485d78821a07b5e69bd446eae170e8aa718709f258a2a2476886757fc36fda2cd5230288b9a47d4a94b96c8cce880d1d06466aa1b331c0b893504fb8d6047b82549bfe807401d795d784584d608e419a7be990bf099694c788f11c29cb9655057ff12b4ee4b579bf7a52a36e9be42f06fd3ea2a8774cf70c946407db105cc88bd95f5b1f347bb8b4467e08058153edc70fe78bc8fc06f462ba5b16c5a56ce8a357700b43ce1fc8210c17af00f0ac8a19f8a73fb47815113c960138b2238031a74b610a1c45e3769155f6cdb7749d801b8f90ab5cd658f8f28443de9bd2e92098ad7915a6c68342255cc5f1abd5bba34316a297246dd2bc0f3975bf0037c3d17ceb9d9c9262b0797a6b5a90c72d4af4e662935bc7de08739ed8340397b78f0f7dd4f96a2fe50579a1e AD: 7754de0ce06145d6b247742ab582584c3b9c868cb0311b02273fe15f7a87403140b7b3bb49342cf26a5e68226a2927457c0f6b06f429c6cf5746b91ce5220e3b20cfca713664f5ec98b972fc3bb098f52c973a917f3b68dffe955a4fc670fa9c2ce686ceda47e060b291fc5a39fafc9489d18c3c3c08e580e492e35f058682e75e06c4141c38fd94b23eaf1048557c668f26da84f08718d850d65f8ab7a4e94c66fca8bf5ca345e8a966dff970fefbbcb88f3cc6b791ac03cad7708492675a2b4c54198b3f5f8906f3bcf2a56ba04666698c820309745aac83b45fa89e794d56a16fb3d00c923632c1d68fce42296729aba6ca2fdb2155a8000baf146e461c9c CT: c1e60f8dbda68c60024730deae746fe9fdcbfb9a3c1f26301a87a3c6bea9f8807ae294b62cb48ebacb01943818bbec06f1c842a3d42aed5a75c8103e07180d76f7e17377afdc4ed56905522be60c9dc5eabd5bd8b9a720b661f631dc214ec1a387016f57085ee3472df5a0d0366210aabfdb1ce23ed9480f8f1eead8780e33af36f9a49b8050749507a8b34b0695606b2cb78788c3da4ef316ecbf9500c257e8acfd36bf600a7ec4f8d2c690db5af0809c5799dc7b7788199601573d8d1a91a7c08cd4bee88885d73998c554ce520fdfe4153af13bcaa485477bcb5f55fffa54a4c71c5e61e1c3551ff7fa39cacafffc5cb00608be2b2d803bdfe43bfc256a7c04f536f4a9c383e6b4a3a0695d7e386f6ca8c8a35a77fc9b1d14e202bab53bfe6bd1d1efe3a4715bd150369403b6696374b4498186fed144f5a6edb9e3a863cdb4de5a6a404a0fc3702192cacfb36538e832b4aebba8c3726224f781c51c1529722d905286a1e01a9bebc54001980acfb9922d91122c9b125d4f6376599f0280651fe9efefad310e97fb06670f4b42df4b3ab1a078df2bf9b880fb91b292984416b70809c09e001e30d285a027f9b370e0764715187b797cb4965e7639a9bbaf915456cc4cc45505853ddfc54a38dc46743adf92afe7f37b174f0108468d772fb2b7ea00e8276663f6c29d3d83f3bf47ed8b1cc86bbe8639a564d936a3b065c4 TAG: 0a6307fd5192f65b8786f7bef96c17b4 KEY: c1ead957027a7303f01622d129eeb876 NONCE: 04daa5b792d6d2cc4ba08cab IN: 47c3a0209195dc19edd01f1a4b54fbeec73c422b1c06558f3d70a2f96651db1e0364b7aab14d496a81b169e244f0f0657254faea172e9409bee2934fc622a7b2079f8368f53313790e1c06144f7f140468266fd6269b4f442a06606bdc9097d4547665f7fa192f67f0a14ff3a9f04092386d705a0a7d3a566b7c2e2b6ec9b6e6caa258ed2bef1ea747c6c80c0b494a5fc66906f5bec5da4aa884d38a6dc74af82aa94083106f6b8e182b529f94f4c389d6730b313ee8e656637ac064fed06561ea32b4dd3a3a128f3458c6e9b500cf3e578011e6b1ece6ed3fbd896119511f89db1e1719ca22a30b779c26803b278dadb4446fe28b5f96d3c91d0280dfb3976508eda8e803de1205ef65b3f7e4a41005165c5f3267b60a679095c25deb7c229ae7631c9df61ed198a9e7d9f6267bf288ecb88ab82dc3f210867490cf9c248828c73db475a757979894c16382fa1a9e5a06c081fec99aba123f6ebda65e07378026986b97a75e0f3bb74cc26f4b813d73c4c7fbdbfd5fdc4903a51d3064783309e497d14db09564a75551adc83197a30e3584a258722dc95fc187964f3207579f5d0caaa98d9dbd547cf2b854c4e820ee2fb4c4a1c83ef814e6bc48ad7cef6efb11b7dfdd41de49f1ba2317849f153115457b6dd839b6b5c84e8bd11419c553d51cb00bfc28e7c82718db654b4f8cc7f37b4ba96d09513c60bebaa087fefe7934112ead9e90d8599e184692ce235fbf5327 AD: dacc20b8d41590570fd882012b1207ef4f33e3526fa3c64c4cb725091dd621bd6f2ce69c29ca39aaf172f05400ddc7af2af0fdab161af935409e3d5b9a8fb915a4ff8b7c0d4baf8f0a103be99ee7d21eed37e258bf79e18a81cd42fef0dfa465e04cb70fd8165f16203e8ed49bc2c3e88476aec77b466debaa6d888cf8cf013e8672d781fc5a8bbcddadf023d7208ed5f6f0ee2e3418158b653431fef54f821f38a69202897126f9a24a5793cb38fe5e8b3f77034e080dd8e4acc7fd22a12ab64a47f98f588e756fe691ab4c7f4557dd9b77e28f997d687a068925d18fab49f3acc072b33fb4d8c7a60f9a639b4b1d785c062e5d386261ff9e7066ed81cebf6f483466c0747dc22126 CT: 1f2614433c137c7579ff19ed5be8e7897eca62f05797266174d4edb5fa4a22c11466b17d97d961564dbf9d1c45d9b6568d330761b9bc04dfdd31da08d3ddd4e5efd3924f53128ed541a6aab87912af60615da6dfc925b67b1aa3f1d285e25514f502eb5e92c7521da3492043fb06172ca74796b811ca42b349e337615f898233944644d229d05f133e35f879471a04efc3321094716c10b6f81ac7d0604096f287655362439e47641307ef49338a70bc87402b1c5ebd931300be51980ae8dec0345beefc59bd250bc53d39b7eed62f93087f3ba83b29ab094ab8d3143b63e905d209150c544e433d5ce41f00b65e0a976f5138db6ba5193245056734c7209ffb256a2f1ac9840f1bbe2e82c04120f591da86e253acf25b3876ab9e6f434489c43f606f264d1672cfd8a43282b41c34357497aa4f3a8c318f93694b4a04f1a0773ed064d4f426350dc7bdf4a59be0fd4154097c09841ec0df9c0e8f2dd31abd8513925d5d3da72624567a609975a815e9ba51df408bee244b4619f8ce981a6be726da484513cac67c2a4f597f6ac8ab0e96d86394cfcb5b6ccf2440a53a7181788a3de730c2e84e64a4131d0e02b8db2ec11f2af61218ce1255310756d98a0d594f09bd1440adea74720ff2745db30741e8f4f7bae0701443f55a078ee3c3bb63411fac0d7c7c0d0cb05ea56f40cf4137de20d9c5224fd4e6c4c6e8a5868116dc850ab713b001713d13e6ae5098c379b72e TAG: f1271cba346522f88ce93726cfde016f KEY: 2a7e7959ff156f3e69dcf4c3db8ccc25 NONCE: 6d666d3700475874d600d6e7 IN: f69a2d094c9c55669bb4b1f72583d23aeea9b858372c61516fb3f096736cccc3ecd74b98606a404a5a6195fe0899916c463092a749274e91831ef63b254a4c70b737bd8bc070b805ee42e5714b07dd4fa39da758de787340c0109e55ff4aaa19b05eb8e2b2ce171e4f9854d6aa56536b35359a7163557056ccca870012954737810bcc6ba226f6f38b774da0edd4c3e2d64ba4d6415d6528d7227a5a0ab222092c7035a8fabd3897bf9f59eca8692373b676b817d57f83aeb4f866c553b2ae1def7d7760cd152d18d43178b351ab4e23272bf157ec2832fd92b4d4e9085cf51da487779d82011745d0982ddc348613d55143bfecafa431a4b7cca9db82856c297682e62ecd1794a6ffe02a9e9b69814a6cebe50418e9bfc9e494b04afb9c0d6db479a8bf1c5d88be4c6b81246d8f4ecde7e3d4c6aa777277f705ef81962ff56d8174255519c00ccca0098e9370b675f736c86816dab838d7887b1d9bd638613a07b7122a9d55b4a7cedddda3b2337d3ec7bd20e499daa467c04a9d52ca1a02d119a62c6dade203a0bba45d3f9366e3f59a4abcaa62b6c08255d60798b9b0bd6205f2e24253dc75e8aedcc1bb3a525548479fa5363bc8176075ab004e7e73d0ac5f5e8717d3389f3287eea904f91fe63b5cd860091a42a101c1a1e6b13b31e2a7382f718dde735feba88ecb1ab41d042c4ce0106fc78b2397eeab842a8e0e5eb83b31d212501f265508ce73dddb94729433f2388d1925992f4cc6ce78d9be734466b6 AD: 6d3a702bcf31e90cd2ff6a350a94689aad4381aa79708817b7e8110cb9a8fc8cfb42a277210526da057e93d32c609be4efb1fa4254c1cba3cb3c2bcb5dcd23d1acfe671c4fbc2b632dcb8ebaa952d7f6ee68e52a59d4933e27a54363c24f4cdb4c4f7ad2cb7c666f9afb811c06df7bfdc93f25edabc314a9a1118c2e0a7cfd219c10a28b5de83dfc3114dda3fd31a3256fc3c915714f1b7e83c6e66273b28944f7e9668de94b8e2536701ead59f9f7f7043070ffad0ff6fddea1d9f92a7af2ce3fb8d130203d0e9550d29785063562c59fe2a699172f32126f6176e9313376203cc1ed15812dce9e304582533a212b3eaf209ea16c8f83db448686c0fcdf5dcfd957fface636fc31ecf5be0072e19e93250e CT: bce5fbc1719b18299c54d224c2a0212cc904f9f58e7c0d8bbf1b09df0c2c08347cb36f2c8d145b5ebc4896a398b6aeeb2db0ba5aa3df6624a64bce91db2ce843a7549714a20404e869497e593990a1a6e62edaa9827288464bd7b37d2d2f8ecb6d67137f2113982d4ea3c23cb0f4609f04bfd73efddd2e4f05c4561fdd3615d82ccef83c940d39f4f7d548cac2ed181e4a60d1f280e25ef8b617796580069ab2fe8caa3ae4e3722eae649e390d9375b6f1b153e6c542a84eb70241e2272f2530940fa3e0df70528ba07747866fe51c3f844c050cc110cbba10d1f8d3321958e1e833c3f4543d4f8b3d20c8fbb7eb1fec4de7e99464c52d97e7bae8608419f1920c27ea0f479bcbbc61cd5cea10971ae2aac0a73daf4e90c47a023d620c2cb246d5e35908535bb5a0fcad54250a29fe53c1a0090794091fb5b3704c6ed52c8fef11271836250f39d8fd9ac5977cc91175e285192f07fd163d62216fd5530da9a048ea458c47efce109723029992b155809eb73a34b8bd24fa647b006a17e1e315b8a6fcb0e5af6871b4bc6f5d690b3edd10fdcc5391648a64d05f3355bc2a13cbb74d1892eafaad1611c23ff96e7e80f0df0819999977f9a2097617cfd13e8fbef089bedb532b331146d793d224d8f12bf8fa63b3b3d9fa8414d63a7618ce7a4f9c52d8c1b2ccd019e4510dbb3bf71f14c2e13452dc7cf859d18f54d6edad075c37a6ed2f05ce6dfa48421670b757d6a138813503a6ea964707560658861a5b95330e TAG: 85713c984bb8b5acea392525719dc9c1 KEY: 5de639113d920e239a0d1581e179f9e9 NONCE: 0b5bc077c27b08427f0ec327 IN: 545c1a235b88be7e8451a5bf405d0dd66664a3bd284f74e4393f969380bb63010081457effe00a972bc6e4895ff82dd4a50e302261734da0efd66b0db1dee74601aa414cd9e2a4c149956bfd63fe0fd1f63f3dabbb6aaa2c651405e36286d00bd0a3c9bcdb8932c6e01300f453ec1ec28724b8934d26c1405f311b67fb8e97ee14624e2d6837bdd38a491a019592526095ca9169b4657d65486470ec12dbc793a42df7d7d9cae29135bbc499425775996633ea60ca5c6711e3aafdbef89ff1bc41d20550c219c82a8841ebbb8e152fdcc55dd689c7768a97720e23a7f9a80b173e679c0e2986e4dc00970fad5f8706a674bfc71901952b7b02189e95dc7207902abc673d09046fe2326168dd702a76328ca26fc1abffef071f58f968c165700845a997a2013b71c5d83cf6b6ed8d76a1b6d1417d22fe63691e88d3774ddf4ee205f352b765dce99ca0a996d33f95f853ba54f2f9ac3e6d1c068567695d06ee8f3c9865f034dc4b397a15cda23a872a075257c10ad8e2c6d3017ca9183ac2d8b80068a88ffa995045b96df11faeaceb7b41ad716122f08cdf72f9d4970e5315a8bdbe6e93316fb0dd8d1b805ea4861e99cf67a5c8cd3d24eeff142cae3c53eae387b4f51a45bbd808b7ca1c3b69042c33c8a4dfc93246e07dd93bd12c40dc532f3738084e47d38983f6b529e3f61ab8b17e0b588da524d0ca67092112be6868d5ae35102478ebd35213e7b545c859effd6a8240e0428bd480abeda17764af5b6ed4902977f21fd06e53061ed8b5bf49ea381cc5 AD: 846f6eb4aa086447f4a7e5e8eef4997366a2f8f827238ed0cb5b691154f345b4586e1911469c0c81df93859ff0a39ffaf4930bd39aad2bdeed92d4580523e5244640b9e6d3609b022e4b4d0c631669e00571f8d602938eca0b3bf874c0706966e3d07902e392a6721b7dc57028b0bae7d93c40c803a03968b2142965ff03f92d6e729a0e079a9dde3bb30c9c10ce6a5627bb476cf1f879a51104f3ea6d0599bb288d2ba5e0103352372db8ad379cb629c82d212c1d1c6543a8070fb01f61f509c597e92a05f83ed49f2a1c1b3ecc64ad0a7d5884320f481dee5211716fc1c6ef96f34926cb5ea86eae04e934c6c0214eca8369928f2b0bc93c0865cc4e165f2eb1c381642560ade7956e5d69381537b796a11786e8f20d264f0dab CT: 04c79662edd08ad017cd48a6dc415f564a67d3d9eb48f1c7910074e6c3ae2d253a5acfa661377ec6ca3ba6693e77f2c97a9484bfbbc3bd261fdd25512a9c1e0d2058b0cd365fdab9c14f602945e142025009f87c13dd1dda03b0c49f76cbc3a93d928eee67627efcd146ab2fbc19d26955a646201800366fb17efa420b7c148399b262164c598cf1b011308989b7dcb699110338649603b58af4cdb5e7c2a306164d7e588fe115b4751ba0a83cf849c869b0155b3f934ebe5382e46db1d2d977769caa63dcbbee9f33568261c6c89856f75d597973d3b2a48508f2773d19252e04350b3c88a6696c3af860f9dc7cfc35e6e96279c92591c09dee7c23c02078e3a51af668ece6c870b7f0f65f6b0f38018be91876011b616fc5630d12ce936b6ab725b808108a472ffe55a5ddce340e5de8a279974c39c64a7f5986ec1e48116bec1b6d040e4e291f429c522ff61dfe74f2f4a075e0a6912bb6a6aa945db933eaa90d9165dfacf087a58245b54c2814086ad5f54795f1c9125988dcf15f906671bdf25da87d145dfb22c0683636c61c44ea9b3120d894e02b0d6f8d021ed8423b0c533a043f263ea3b1b06b5d5d7dba17bcccb1485cc5830e7e5b8520f9a1943a3560083e65806f9a633baa6aa7d5b99e5c5d69db446cb39716c415dde4ba0be14108ce32fbe50ec0605b0845e9469aca76dff75ae1f847dc5e14ce8b5455af8c2f6bbabf889efe1dd6ab408d983f51b143558c73fafd09132e22113b36426535b53ff2294acefa9258a58893d7b3a252f5a7d4 TAG: 07153351dc975adbfb8b30d77c1be155 KEY: f0f31be89acf8d7fcdb2a063de5a9812 NONCE: a3d6aca502708d448a869bcb IN: bd3449eb7e893e3c96cd76039ca41036c8fa9e365709afa301c30b5430e004dd08900d75815936deaf9e7753d8efdbebe09c27426b55161bc0ab3fb00973d093ff6088ab6f309cdb1e40cd40d3f933e0023f0c210cc7ddeef2d29d82e0955019e482782462542e186467bdf9b866998a731583b0906ffb0174cb44499d2d5e3d1fa3577f7344c21362f77e94cfa981913d6592ad1f537c13067f8e7af921db28e93673ee38de0dfcd497d77162fcefc7868ee3f27c07b0d818eb553fdf7acae2db4eaf657853a26b0a760954331b8c91e763f568d65e658c6eb53a69ac6bc582c33f8146f6c8ad66d8a454be952425f3c0130e658bc1934db754d70774d73b40512e7a9782c4478e1f9bece80281dd6d8eed2cbca8d4bb08df65feaf79e9a35d075b18e69dd39ba1f47cbb694173432f5f0ef125a9b1902ca97820b6024ae5b49a880ee9e12ecf561ab5abdef81366019a8be495af1d664970178df68f38cd83b416d0076a522a9f3f795e2d2c19c75ada025cb1ef41513cf2c29df9a01e16379c101197da782066f9318d4fa0325bd584b04b1f9597070cc551693c964b2100191e1ed949c426fd2befebe5914cb567adf7518aa4574921516576bc33673e6ffe422c831e616bf6d03476af169d9c4208d7975460873e2792c209c089af7014768c0ae9fa8011c533fc890e366b04d1b79ee7d7aeec0fe89ddc7400d6fb8878ada40a76f65df17bf34919fb5ff7711ed698bbcd3ee4aa8dce8f879959011612a3661c5bee1a9d7db69fa33107543f111a1c416c92bb873bee9f01564b44922beb1c8158 AD: 2c9c6974f2442b87c02cb723f5f3c05c78a22b7ba6c3387fea2d07ff58ad55c67aa9ada12563fb296812d087ef3b2d47ea1adb6a7dab646bfd1aa9288c85685c7b41c14eed3c5a34e0642b20888c8d51a65a1c332f1cb5779296051065211e5ec624930f1a2bfb6c10d479059063a2a4614999b0327d00f875162440c29627f817057f5151ba9c9364f0a6a9be85fe7fb911efdfd5cbfd741bfc63564f0d73eaa7bbf4fa16de77fd807bb27a9afd9e62c86e7033b8a969cb0ba9a2240de1a8e8a3463c2fae49c89b3cbc97e59eb30c2ae35834c36c22bc056a34cbd339ea469f3d8f032b5ae10eb00003025e55d42c12d9738ea74703308633f2772e8cd3421d8fc9d334c2845870a2c68c553f4dacdbada3af4ea8f20df3891aab8db9510c299db2bfcc CT: 57e32933293f67159efa04c375a4d7b8c8a050b0cc39031a3df3bd4bc82839ae1210da5f10b0723e111ce7d1699c78143671d7986f83fff90992ccfe9fa4367ef9c944cd571a3057a65cc1ae7fd7ccf2c722f11a9ae6756ef0a422ba7cb15a02e27aac6faf78fa2c2b08b228b1be5d3e62a5e995f9d3c5f1cbda1a6ed3f551581cf6693d678f2323e2ca7437715dad965024c8d5eabf68e7ee3ec090f56deadb47dff68e93fd8a38ec2b34d0e774f07793cb03d38921632e42b4a092175f6d602ec637aeb1f134067fb54594f33be2d9dbbae16ec25ea7b86a1a88346e0335d7bd2822a3d209a6561ea396c6128a86307da1c14d25b45e593504fbe38bae1a42689b2b53cf17bca92b4896c2fbdb4625d960bc03da9072910eae59aa17070a368a30e69d072cccc53fca2824fcd83ebf6d65e78c44dcf3333a00cf7eea5b3d311a674be8f46b696376f1fc5d70b727773582bd4a59111cdc41d69d58c52505e51e08e46d75372999f27628631c5d7497607adf4a1c27caf618a6dde1039dd33aa7834eb5164e67a208d473f558b97c3442ab23d22081ce024fe616e00e09a7d14386ec3e0089a0feedac7e6c841da57a13358712b75280f72afd0a28a3f5555e024b59d14ed108ea4fb77510c031fb438e6cdc7b4b6125a387e76081ab8568216a6776b7b52d311f48e882d62abc81453d65c0f5effc4abacec68dda303ecd225ed8afcd5638a9c4f5488d9f8963624934c1abb56ba0071bf11d64a52443aa0f3b607557ff340937a53fa50031775550925b2e8f40c744c36317797a952d70207cff0646 TAG: 429a50441cf373d8d1cc4b37e15266df KEY: e4ffeb5ff128eb3c798dcdec4c665a4e NONCE: 7b30ac120aace497d03de3d7 IN: 26638db82034a19df83e60cedacfdd511a937ed73adeb1565661a201197eaa7fe817bcd9b83a19052461f56c3480c0e0d3314c57aad4f02a9e10afb967f752fb144bb1ecce66ea05608ddc7c876ba95698b04e79a429d36739d31b52e47fb032b18e7686923700e735750628ac0effa74298bdf7b75c115c6ea30634a9636c7ec5a02aa467fd53292d8991fd2cd45078471ac3bd8dbe47ad901047522e82cadde3b4f9d0a1e2b8c6faec2da532a09c58acaf7207fa49c1de10f377bcadc903a3df381a10ebf7556465096a0506e7ea0e7f11e00411f226bf2897f85791d6e34641d8cd049d95d996bae9dee6b2417f558f102a04d758897c484e930cc97d13f540c00f950a1b384ae5139dfaad258e1315fe76b22a601f7a11d852a080c228065f423c380393ae13ba817f18afaf48f7df08ae376d62e770b0c98e49298bc1f6f1cd07b586128c42d2196d26bc6752fdb375a0edef255d139b35841f426f090f270d5153efe6dcbcc2f4d4fe19258284b98cf70483996003889958a7c993fce98ada15a8bf16137624a2e078fe16060b640155615ed55df21d9bd736df51970f11b06775760116ed1a624588052787f6e95c93cde1c4661c9efafa2d2f217e86dc941263c176bc9e15af02b922e23a1839cb4148f82e8d8888de16e17db10f659112ae0f28cee8c062f34f44304e32fd3713cfbc830699e6aab24aa1c829bd582d39c4262c625c45bcc81b5e07289eec77fdd1613a7e4955aa96ba05c45676e973b609aa6136f5e516e338d183db9523c3e2fa6d7f603bab7b77e7acaf5f144e9a301a221111ae8a3130b0a77f638dee2e05d4ebf3 AD: 14fd627004e9a78d1334822040ceb4863196a75e5c5ee70861381d6cdf1363a893db2bdb201357c908284b91d690770205be495f788afec67f205edbcf47b78fdfb6e1ca53dfea501ef7fd48008ab05a58b65ef8e3b25cd3617dbe7482d0e846d04d00508192373abad114b6e5713f84de6928339d5c57e4abe88f0c0f0913324bdcc661fc85f391aaec28772df8faed4069573ab9ce2868039b7971b510e8b9239eeb066ddce13e2fc2579b159b08ca564de01fcc32abf19f388f0a8e810fb4de96e19d02010b75ca55d4d6db6c1a0d83d36a9d30a980f51e8263bbdf18cb768c5d912cb1ee8394763dbc7e9276830eecd1c92541ec53e9fcb5be036e8fc2da7c51e9b7978a7fb8e24182825d8a219167bb925dbf639edf4a25c42ab08a7ac8013696f7e10cf0efb57ce49107 CT: 7ef2888ba3ecb4c9e0b96414504cd46365885b6fca375534e3dc43d4fe31b61acff2cf2d0b698061ecc1addc1519e00b1f3e59756cf70380e9d83352ebde4fd680fd995157fc12054376c690ee01a11875b3e833de136a8e16ae08e80101caac4e7a43042abd81cae91d2d0f98ec0b6fd7e6232fe351df92aa847cc11044a3e07f3f4d8b8b64f039fac77c95f9057cfefa11cc795fec334051a81dfb7e08cc09496934508423cb75f8b051b811179e37ee63346ff3ce1f1012117b0ad3c03fd113f7f932da558244d5809e6af429084e70b206f4dcddcdfd549246a548d51df1fa68274416b27cc2c12b3a6a86d9bb80184d41a3971c9dc0ed906aec4ec85e9eaf4e8dab1704f6ac3f7602b0aadd1ae4ad91755ef9a08e231535eeab932524b2c228d10b9cca1f88215ab56bf776183b9c14b2888dc7dca590f48ba6fc7e974352da98077d0d3f5de4159025270eae300fba5457611cfc4b52846ea1fdfb29ebe4c260ef2d0d61de644cf8c7390a66d15f806299ecfdac0d6ca83def3873f960bd5b41d05e9a718fa0329e2304dd210f20228d7da87f08bf477deabeb93304133eb38439f49e821ca66474ba065c8c6ceff51717b36297eb17bc739feb166455b79d83ef6b12506c5a877f9e7237ace4e451a17969de2ccefb65af407a1df71ac99856d485aebc6492441366fbabdd11c9ca559bade381672c8497cdc86175d2f186272c9b675cecb365f97dd547d14ebb2bd306d80d83b40e3d4a5ec37812b787b31b2464917aca278bc5c3ac7e78ba6ea0bf3744b70012ba4cb5f1b91703504ab5b0134d5c8071ce1f16218c51207448c894cc1b TAG: d338cecd6bdd210923d8ed507612ff85 KEY: 58ac0726e0bca5d30bf4d0a231fd1242 NONCE: 0b9b60c3a690e0ce0106c1bc IN: fc47121253347bde0b02845afe64a46c74a401fea9f81cfa02d47f3c6008be65031e26b07d05253d0fbabed865397284b44ce2c38b2117f90f7d3bc60a0d9b04c6ec4b5108da61ff7f6d30083a33528281bf2b543bbb2eec909bc8706c892844e0702f224cafa9f2070adba7e3942023645427abbef47ffdb9ebf43b24aa7367deb7d05241cc5ffc0d1e07554545ddf0f6bdfad4657222fa561f3f92c83fbdcd5b0b93921842d2545b386eaced2fe37d0e5601bdb969125b006b21a8283d8cb5264ca2d8765d2bfe24fc04f8feac32293d88bf6a3bd7764847c72b07a9c3caadb47b96eea17199713eb48d03a8b37897defce70b258328f0547392e7e82e2a1be53c8e40d58235f610ced56019a0696b77b16ed8bcacde1c142bc3afee168755db6b8d81754dea34e20f6a0e35ed9da60bca3957a054916e0072e3c5329ebbe2bf8f224efe6d501e0105614f72c8e37f2cb7cef644baaf7bf32975cba8e519034427b49bd589d076e3a79b2a9c90170d1e503256389ea444036523d36486bc2d3a94c73afff7bb2b48d0d74b7607c3db43186b9f85102a49d4c0e3cfff1dcf8b5c0cba5ab2f28e1dcbfc858f57f585d5e7d4ee92eec6ebe152e4b160db923cb8d9c154b631e3340b61272e0726cbd88298a4a6dd1d01fabf67d9c66c4681019e13a0e0280e91dbc3cf20e583b4a401dfc57cd3bed42d7e889182a0b75072fb08f1be187b3c7990f9f17bd29d61b8d2bc93f1a78e84fc8c38c4184afac57f3c6915dfefb3e194afa3919fddb1efc685931e49129e3afa230681fa6e7c1d6a69be66d0317d0497a937c827b1591931dd17e83207cdbd56f1ec1270b14d9a7b1e2bed3e10628630 AD: 0bfdb282f9e2db0a43c18132b08093892211a8f7b210bcf36120851314cbd8a56f80f26dbfdcdf944fca9148c1d013844e897b034843fc0c8701120062102ae6a00aab0063a1651e0aa36aaf8acbc221ee7575748562288c08050a9a562ec43be7fb3e54dae418ae89476a1d5f81debb13eb6c5e0b4796abc8310e70a5e4a6619923dd6230a7b2a8dd36fbe3a29aff8a2ef35820ca68b07e00f63623db10a648014028d314e01cb537973d03420938dac988e7af001d571fdd7b1606a06430b5fa1770b2f30f53cb439a02771140e44356c3bdb7ebd5e7af10c344396bb3bacd58d32f07a26768afa741a2dae4e91cd8dec01505edf362f38b0fb06c40b8441746a8ec31d9aca6437d1b75b5afa120856e3d87d79ea5b71352edfb56a873d206e8fdc5d5f0bcf91c0ef1beb06718006bceb35f71dc0b CT: b03db471a65de5cf871ac198ddfedd14e66b6fcb6c42c782a4d3c156beb2024a1dd2cf5efbd87884b029f42c94067a42a165c1e00018f11cbd79f65da02c62fb443ea8a345c34b6411112844eff3572427e45e061913bd578624100e33908ab9737140ae0fea83069fd008af952c776459c6cbd4ab9b02156b3992c0691614567056865b9f39b526f28d11b7707f35ad09d1eb0d2f6adc7c66f8832d8783478166036d082af1a44025a733781cb389612e3c124c31c35ea2a7833bddd053625d96d2ac3fdc69dbb64b9b7fcbcff6c6fb891d974184734d3bb4081d7609d7206067157954b4c6ab68e4a450f01f5941e1702830a58667b947352f1931ef721739be452aa083ea17344cc0a3b5820a90b35bf45ea00fc06df7229080b82b79c3930067f6045c619624958f77096f304d9f31effe42ef405ee4745f1b6c101225062a5bb38665efc428313038a3db8863dcc72de12c8ae41eb1a7b8eb02bd5bfb1f1ccdb1db877ecff08606963d97958ee7cb85b99c5f2ac4f91a922e180d7f3a3b265168d02829b98b7a72c2a2910c0c8c654e354f2e19a53618e4e46501ba8c13e8ee0081901108a75d6b7f601385cf6dbe3f74b3634331aed8eb903119ee96877f90d491dd5d38abd5f002c3cdbd57b04a7ed13fa09c9e2058744e1fa24d3fd87a863a7dd73cca389e40b7aad29a95d6f7eb705827f7308aa4ec9b07b1c98c225f366cc33586bd08e20773bbe0878711b6210392900b8fc933a6a661b8d6fd1a8338d06ec364f9025f1a79ff94bf448b998908c22be5cd6c1aff929037af9b642ff228865137dbe2f3f3813923245c3edc8edd76eefa02d40e7850e502e92e9511571f85fb17 TAG: 34213558263a230e66e80c4095fbab97 KEY: 7b9f65509a00841930c4087093c0e049 NONCE: 45003751c40e59eeb10f62ec IN: 33f7a6d16717804519e930bccfce78c316cb720e109a75b30e11415fc5b398b76cebcdd758535798465a8662486745b6ee098f9008d0cccbf8ce2066b12ceed80cfac806178068d2ccdc00ab32d73faac0cba72b5ae75150c13dd0c16d85332d934e56c8f96bfa942fec689e9847283a307ab775ae09cdcdf1c0635f749186868537dcf0123baa295e29601052297aa4b3fbf16b31620aeacc12d08345df8d879343c098372a04d32fcd2470f4bdb3aeeac7afcdd8f95695796c64cd41bb0052905c8b95edbd0bca3e9115f119d29e109198e91b9a024c8a4d67ee864b71eab16d4545862403bdd0720346c43e94793b1ad3f02946989c6e30c978e4c62660c4b1120bd49017203c86f5b9f02bea17a249d6396e390df1abcb508388c735565ae471a3d24293cc33aeb1cfb05025fd4f17b9382a391d73a2611784358a9a003c1ba16f493f020b1f1545555ca165c00e3bb4a2b855d99a91d4f95534424d3b8b32ba66fbf3de63694b18efb4e0aa62e438eb3a7f50b0551ccb19eba8b63e19bef0e6468ea84b2fa62d0deb181e8c3b00a55198eb69ab7eee2352989013fbadbb26d1c1f5033b26f1ea886a0d1af6c76a78cd09a8b1f247d6f81d7d4e521f6649de7fa5b32b45be2cd803a1adc6fa89eea3a9d876ed1df0534890c9b41627556103964aba36e277d1cbe56bc14458e75c365a58646b7e498325bbe815e645a19bb33d2765a36a61e74eefc32ee9fef4162eb77574638dea2cbb9753e50b85eef07284ff84996a5969af62090ea20c6af307c1b2e56486f50c13d5c4087ed471dc737c4e40b7bdbe9d74ecbd6c8dd0892449496d0cba16e97c864307a55f341121b5e35c47530a9c3059db7000688bb568f4a87be8eb8ff9 AD: 7b4f599c829e412edfae60ec1dc53e15d608021b6afa827f48869b9c9ca017a394d10f814c3172b38ff27ffce750085c288e257b6a2d7ffbbcce9e7acfb12cfcb630c84448329483739be37ecc1ad122603a4f286a48474134550b12ed8dfff73419494a8d251a98fdcf7c329b0e31b0f9379faa6bba2e4adbd429b199b7cc31d2805250082a88f94d3a120a3b07d0229d4a49e45f2729885e55cbb9ae08c88b65576fcb8a96ef23b629422ddbe7497fc2d4baf812bd03a7d5c03e79cf522938337ebd1c9cf3a61d331aba6b436c21ef47b030447e839b94b23e6ab10ac09a1243081544081a09cf35f6c7da3149fe3c8e41f90da05d88e31b32744214ac3a8a0a9098b11a38abbf01da170d3115fd4243f2be6eb8295b921e687755d0baa3fdddc1fd9e8d78992f08c50ea9caef49989872bf00b7f86c78293896dbe25eff CT: 5ba4306c0fc5cbc0028d54a82d2ec3039f78ecefbf3ed98f5b4f83d1b562be3c5ae66756dcd2027a515360274837682ed07c5f1a0dedcfe3d1e63457f9d4020d2b3d57d63401284eac89ef0cd16bef79aa949a5b3c76dab5342e8042e2e0d411816d311aaabd8aa10bd6c18f72620f824156bc71add704e0ac4bc1d4761f9bd1e31f800d0487f3bec7a788b0cea75cc0bb4ebb927e824bbc718236b089c752de68b4fb5b4bc1ca67e166c23274de9992fd30e0752ca561a4c5f469dd123ad45870dc013a47247396afa45ca5b02fbda0fa1c2a89180214814c5bce704ac4dda5be49af225f3a745391d669d7877d1ce173058433b02b714b7f9b43095820b73069e8c3fe621c45e00e41152a413e15bc750fdc517568f021645b6ccc541a9d61237090cfa6e374942adaa1f18d073e627195164fe981853e324d2e97c35819a00cc4d668ab1b8dc86188ba2f5fa76b3ba2303bcad2ce06195d6e853f7e0d257e386764067f244020d9660ce04bea8d61c5a940f502bb68ab6a62fe2e7492c3aaf355d313f4e2e2ca148fa46673848e59d744567bbbf38ab0ec0c799712053d0bc25532ff00f02a3149e6bd9df268ef8e1fa31762efab8102f6fed5768b9abd9bbbac89b40000394158c4c5d2bfe5f3dcbcb5126afb0f753e2a60c8aecc67782fe64f2f35fcc45e6ca4b6751c40adea4998140048456944bb8e2345daa95e989ce48378f8c607182d76b25d12f731b5029c245e804ae19d170a27f35634c64a1bcdd48a6b573959521d388e023650f427cd1839c77e0d56b4511d1986dbafda63cf43b6fe929129602a5314d6216e662cd1659d8d7bc6c271589aa4e01ce45970efd85297f00eb2470567e69a67bdd20fa4ed8b497879fb TAG: 15966db2d710d52510c55082f0c3cdb9 KEY: b4cba7822382ec3aa42a95221eda5980 NONCE: c488bf7ad0031e1ed9870968 IN: 19cd01ddbd03500b348a15fda2f9cb9a870df388e2e7f84386fa33fffd5287f1cb795fcce3a24fe371ce42f2f34dd8db9d1826b6a454082ecd0dc684bdf35d3d7e7a9606cb5336c67238509f0386275d58cc3ce7fc98fd20c77ecd1bdd463ee40e612cc5b9082f3c12b83f16c32072834a64552549289ca767acb23c61b4030227277e0df6ee9acebddb0c3bd538040398ae57767c850066b40ac0c1d7f5de22747051d237f898306beee05273a99b20165c2d7267f65b5451605ad4301a82bc80268b49e3084957d8ea8fab59a6b31f47f76405f5575df8a16a5811a976a84ec23479daf4d1d2c1ef428a9ed39faeb5a625ecd25e04d37736230cf144eeab686180cc71aa713d522c9f2007aae4eab486171ab3a9c338265193d093fecd6feb1cc1d91d10a5f2dca9243d12747b5fd3ed809c06f52872136814aed50d61ac932fdfcac2e9ceef817034647b2f4d61f5a0bde8ef9bef2789a49da799ad1b9bba440a29e3e15e4d97b99c0fa2abcf5cf0e05acc89da732eb79585cf1d6c11a6c65c2087f902ce230208b5f1ce6cde34711646b9db725858cecd3716906853acb06c30c7dcc3901eb407efe6c3a8e1e9f9aebfb1d7217cfc6571fdc4b86d17d66d6e392ebf03be924c0076b8d1f8bff15e192cc5e351351fdb6b26364d883581c3f8e769e9a5689d0ab2f308a1dc47d7032de91124b1ca3d42aa3a8d57ed92a97a2aedba2409b38023c55954d4d5d2630c4dcd5ac7277fabc3408f0265560d3de4114eeb0b10db4d5270725f4454dcb1c7fcc1e36013a155b03181e1a315aaa251e9ab00dfca8e9ef787799a23529fbe8f0f993dbc2338b9f300ed18a67bf92c600f22d8039a5b03db114ff04aef285642be0d552cca24b615bc1467ccf9818929c06e96599fe335e0 AD: 6fff534915999ba3c3e7ee9f964ff4c3774c1c63ceddf8674c9c43cd4874f34e22c5912e6f8eac3e889779e7b4ecb2af711665489274c3201a68d8bfe7c61e6e8134aa08d71ac2a23289eea43d1dee5b4fc4caa3cfb666d59b09c554bd924b6522cfaed157519de12d9bfa37b55fe8158d763e3c79b7b10db45bdae4ba18af925bc8528fc19e9af54ac81588682299cf0997eb9710fcc3597564d8f0b71e3249089673b3771ca110a28c1aad49f32301e0921286fe0cfdaed8f64956a4e2c0b22011bbeef46ecc6bfc29ce023b361b2db0488a2cdab32bb94024e757abccebcfa0a672acd77f9ba622a665314c4b520746ba4fa07488e9dc662f755311535f1f98558dfb2be88a86119850c49d4a0bc92e70994ab5d7f410ad20d61fdc93a08e460ff9628a5b242038a1d2905137d4729fa77ac0f74bf1d32fa7b025cc16f800 CT: 0fd6ce7a1a51060fd105fc1e5d7c8fcaf4550de865dc0f990217c9e32d354a951bee16f53be1f9768f48d7f76c9f2ece7fc56b9e8c27ede94b5a3250ef27874eeb2dd09d2e50810afb7b9a50985fe28b7aee74303b178a0b74c5422d4f46a59e55bf55d7eb0d16314668b13952998205eb422daedb9f99dc7e04e11e8e077289d1402a1d12608e096afc6283643ca77813730bcee2321cf769c5cdbe5c80836db9814843a0ec72d49ea89ddf5e48e27f1e172423412b78fd91da54b776a132df29fffc5c8b41615fc491c43ffa4596430e55806bacb7e88abde1e20ae43260a1258e7d89ba46fecd08b7330409a08449ade364fb84ad1dff4e71434a3369a1d20158d02949edb9716b021271f73517bd985949d2dd62474a36e57b2682218ffa2d5a982c668a52776343d06ec4bd122d5a1bd5ab5b691e4462d8c52226f834290258a83ecf0847246c92d4339ada867f107589bd8af55cb96461aae47a879f5d81c3931fd653d68cd5139be7ea9b98ad8feb9b453f617cf7b8a4c9def78335d009d4139e66e10f642030b5a66fb44d2c07c8c689383136d580b399f685137b3054e40fd7c90f37ea30d52e09832b66251cc9c31156729e9cc5fa37463d89bf3b61a8f8657f6501ddc3cf1505fad36d4d9075f7a366050de98eeeae0c407b31a5ade0b29b1a7a3cc251ec8a918cc8239c3208b377f2e9a7df8aba3e086c33390bbdb4498ee5d194e43a67206e797d22a7c64849d1eb3921a8323d8a0c7d242f3ad65e52b992007c996dc642b858fb7ea7b1d8d6cb10ed3e9af7595367c26d4b01d6c178a15179ed45d44d83d7709503c85985bc1e2cf6200f4d0ff02e57ae4c53c012633935871028e3c7bf0f5035140290f4cc02afce10718198dac233a6dd7ab4065f07242e173b TAG: 8ba94213b2a8696d7e203e6bfefc1c99 KEY: 4233eba54fe7537d0127b1a062526d33 NONCE: fed44fbd3475daf5c046123b IN: efcb6ee574ffb9620fec7644a10643908a2d3e283864e3011704c4b16dab7c5333545c60ec83b0f7c3e2dc8022ee5d1b8124f766bbd8fc95ae1a5bbbd2ba7eb5c41780627553b8ad99643d8abd43c56a32bc159ab97f1fa4622cba34b283317cabf0bc98931980f207efcfe6d4c4312cd9daff8d46b1f9eca45e0af42bb8b8ab25a9fe0caf1c61b40b1a8a3b35680abf456de109f42d87ef277ca178b4471936748f3232f9075b58c64c89614dde8a75dea86d3b9c2a6c4a71ccebf388becb7a2cbedd92b4ef95d2b72357b4d2ec099a3ff9fa9ebdfd1d9adff3329b0a4ab854f84e8c729538b0e65773a116a3e50685c96e52162e1b98367114d84e5476291fea3173ac3a846529d5af6ddd0d2272b54f534d4430179ce5bee98c3a9d3f6e9cd4d7cef5c79560674ed0b5418e21e9cf7ced787a9db3427d6153ed69d84ee4ca06c515d3822c6338868dbd97d0a21406275c003f493475d4350660a4f3afe49deacd9f299fc05aeab4029f57d05e21cff132cabf6de6ccb3082e0d8811dbe5188749a2ec8ad6b1c1efffc4031605c407e0c2ce57478b37a4834bff670b4dcfe8a32e6d09a0c80c7c99f7cc41378efdc0231901c7643bc8e0575040d1ac1bf4a79ba4c10bae1c0135ec4469bc8b6413a068ff97e88c4be959f8e426abf3cafa2bef9925aec0c1ee69eb60c7427dbf79656fb3846ae4ff059852e7686311b2778d06b5a7eab71ef92bd086ab0de7dc2a3d4c6070436991a68d81ef5b1c6eb024ccc6b2668c98e9b2ce452ab4751dbd57c2794798f5d9262e2df48788d92045b23a455a135c112e3baf06f2938a485f874a7d5a251770160dd9bf9c93c4e2a789edd07b8a7a4262adb303ff6ce9c551be29dc69f99dc75a4cdd53afbef565031529cbce2ebbc5f98b71315ea7dcdea17c88e7c8b3c20da68ee6ee AD: 4e0126b67d2a31e1755e532178b048b572f806ab4bfb398247b393dff9c653a452a5ff88cec05ba1ee8ebf23e91b61b1f9adaaf771f448a57f4572d460b8304f8a2d6ba8a8b89e55d13e474233cc8da704c244c6862adba31219d994f302ac7161604d324100241fe6762ac262a5f7b5a07c67cf3f647d2d60846ade2dd33f886ebb59c50d95a4a0ae103438a65bc192d03f351e3e56b6da169480def2db510c83b6ca91534683cf334134afb2491026f7aa45978aa38b38d6a8d193e9609d3d0b3526a14f7b131f9371f56818247ce4fc6e1b17ec6e99b67123e7e34faaa8a8c63c1fb9004604e5ddb32702f9be2246ed7496dd27fa90ba90d90575c0cc45c0b9fcc945f21bfefbfbc82c53dba1feac88db291f74b6512d45cd7a4c5c886a458947f0a30ee04a6866ff5472f6c921d1949b8ddfd623f744bbe5f47950dc0c7c213545f7ab63e88124 CT: 4b9b468ed1b1b3ff8242f0d2f204e94b0312443ffce789fa9be7c56054c2392868d8826129462bba1b715d87d58eb5521a258af3e9e06d90e26702106242ad01ac6b64908f747306dc4ca142597d3021df591b60cfc2d260d9883f01078ce4db4b11eca4b7b4329962a6e5445857423776b22b802bd0eea8d7ce7d1d47d49a805d9f557b8d67926848668d8bd04cd2a9eaa0b118b9e680e23266785f3641630d2649d952501972d92f2c6e5e7ff9e8805ab3fea94e4d069487ab6767da42a6312c74a7191310cbf58995a94158987a0d3e6778f3f44f21c9e6c1b08029d368daaada4fbefbccca7f49e2f8c6d754286287ea93f69c72f3234acb2e4059aee4ff341730c9deccdda06fb67ab67b81cf5e5213b7c86b03c00ad8e447915284d5fe4e30ee2fe0fb2ac2e5a58c0623c80b40e6ebc2b96a2d5e045419fad0dbd611fc136ca032e71ba2523b5cc45f115389a9c9ef0a28d9b949b84ba637a32fcd3a8687c70c7d0bc4f27949b37d20ed349ad0bf1985e33f74b6974dff70ff72205085c766469b4c32bbd93365e207110b55d477347db18fd003c925b64aa4366212585e882fb5a5643d79cb6a9057e977b554948bf8129ae67ab02ca57d5052cfec2949e86f3c6fbf7fe0e1aeee3ccba5752bac7abce9a396fb6e5ea3af059ecb15937f34aba7fc8edb267ad1ee18c49e5e6f057ea5b0156093c6b042d2e7b2b29bfc9548f91515a6272aa8b2bebc5a0b0d9d610b6c911a69c38d15c2ab3b1d774d68c6d5515012a083dd0cc2fbb420456b8aa174be28502c2bf22c7af3a89686e2997f2015eeb7c33ba40b676b61c84702a3c5c51120dc290e58724d082281b496881a54839e6f0d622dfafec125b381da4823240cd960d63a6890c11fdb9f56a9fc8dc172c98a3764eedf804d1f5f56d4d9fad2d414bc4c58466f TAG: cd1e49972dc4c4e0ad3bcdcf16e692e8 KEY: f79000afa6ad2a10b0dbfa4f34e47542 NONCE: 0437dd10d487f42d2cc40041 IN: af9ef3a4f52f80c9cb25970a4a4af8bc7dbd8fa566fa588d57bcb446b399336fe43ebac2a913d74d0a9f7d97044213390372d4272317fa41a62c50bc2b4d736a759c85124562323d86f1de14fbc3899472a0686a5dae4a3e429efb05681a1d7a36d397741270b2d97aefcc3d90309365a64a0e244d62a4fd3f288f706fb60557d9ba2bc8e29b4d68a299f13ee93d3c4ce0efb7fb26a3d2f828c1268a04d48e5ed520c5334ccad9df4799cb58ebe15284a41aec4c2b9157bd2851f968a279653b3c9a522df5e2752f75a3819d4610ceb4da666d19b347f09dde571ccf14b435569b9624d3f3207ba49b05f40bd818c7ffa733103f9210cb821ae8ce1fd5bb80a6d3d8dba865015b52ad9af765a8190713d13890440ef64474b61a840618759160c4c692b5bfae7cab08f941d633a22b92d8be39a614903ce0f96d05e83596b9ab4cbfae18e4e8bf4ed0cc481ac402f27fc81a0b62b7843ed4387f2e994799e0c9532a1187fa6706d3179cd8e3bbde209f85836a176e43caa2dae384f0331092292872474d24fcdbe72be3067f542e7b099d31a0b09e0f2c31bd16caad1fe1af0f25845084268431b930685f6a16fab6a401a80590895a3422b94d056038935b1182ca3e6f4ededc86813d651efb0fa80e40700a0ceb602f3a67784b60b8d5c8522e42519c83e6f788d8133044061095806506cbd0bf3a7fb94e1d59435d3a5cd9a5a24db98f20035f0feed9b12b6cb4cc3e18c97aa890d61acfa167338b1cf79868f2a14711fcc241290709e800babf3ba7a868a528d44be867cca23f4f80b1f914ebc6abd630b4254c1b8e01241fcd817171e2d9969d2ba7c3f410a9d5b157ae0069b97ba1c973d944f11208777cdab373131ab5ebaa1304e394770c1d277913c54e7cf00c13e877fa5e8e0572f237b646f783db2f30274ba46c51d72d751c3bd4ef9ea32b0a22b260ad AD: 3ffa73ff1c5c481d15ea2246b6da59e6271801edcbe277591b188386946abead76ac40d6f2f08a26129895e97ef25b59ac345f8d060d4d21819d78402279238541534d8734ca66427ecc2baa6741fd093a5895446979e30ca15eda06addb67bec10cf809081ce8a70af92b03f72536a8a11a1e9e3d257352cc284f41e2fc4a91d1bd1774512e09bdd150d1830be260ea418fd384be30f9da23fafdc2c0b5c632ea7fc7a6ea87d69139e9d104d634530a02c4ddae3a2e6854118369e5304202206c4d8fc963a61bb4f42ba6f937ce8281429db4103ef222c3a015f08fef15eb5b407b56165260dcdad08f1196e3d698ac5b7ddd403c28593329db77fad8ab7aacc450636a4f7f6714bbc6dbe10c421d151a7c135926c5388a56d2b66ffeae0508706ee55899aeceb3525367234e29c25dd5bb8b187ca4dd14f68ad317ee5ab3027b68b5b405880528bd35eda7f9c65eef9b37 CT: 47d6bd87f0ed8dd258b32f01e5c72457dd1d17982f1671310cb329e18fef89f25826f7a6a9abb54d4d216ba214503aed4d7fe36daba69482e4ace4b7c7a91de5a93774732e0bfa001947d8c403165473d77b6b0d53bece68a76cf544583980084ea5ad532b599206b2d618be4e56cc22be645a727a93fd73c434239bc9c0b2d1621e3ba63e625327cdbfb8f7b13997c3d981c340182aa59a4e8cd204c5c86e8c531019f4900410c6870a1bce9c5e4f81bd8134c983f203f7644577da19117a7432c9a7713cf1bfd3bcb055b8601f4f44d33b1191ae1e32ae868bb37ff5efb1a7f67d94d993c0c50074346a6b41da521633be46e299916425fd46bbf4593b1c02df98f68debfcb43fff6a1d7ad6c4b48296207d74a9504670b50368f2f6a2d89f6fa98b39e13cd46fcfa746dc533c8327a0b07cc89b654ff8ceee471eb42f1f07b0abde3ab49478563501e076622c0248bf8e82576e968657fb0efa23a03c3e3013098e86e44a40d21fe0e640cae3da3a461038907f9610d6dce7a1242417bd43d26ba6aeb1e6e3d0e54c1b9839d019ed409eaf801ebb6fb25949a4961b35fbdcac81c9f87ba8e4f7103984ca6d8fbd3d3aa7b13a9ef1bcdfbe4f6d4e6cc48e5cddcb057027f98ffad2a90a7d4fae9427be8e77fb6c30ac38cae71a36b28fb47045fda28a027b1301fa5071a262c5d1e0a695d3244218a88c7182590698b690c42a3cae97ece7b7266aca88dd8fa8f56ef08c28d806e7398691c31f292caf1443508c494007f5de45a95643534f3f0fdd20790f0aff8d9bb432cce36bc857884a28d2dfca0667a2d7a0b0255fe68a2f9cbc28cacfa489fad9d3101a5a6bac3c39fab9a8223bf5de787fc3d9849626cc50466355df2da389c5ed8301e24d2fb6ce3e8081d32340739326b706466897cd40265cbc347121b6e12e04c218420ab7ee760e9eb6b43fb4e4c530 TAG: a2d58dfc6f1a7aabcc28cdcda713735a KEY: 5dacb5173b30a28c99e00eb11181879c NONCE: bf1fb59bee4e3964b300ce57 IN: b597b958c63a056758714d69c241da18b480acab2bddaf692f4a57abf2265a0fb09b3352eceb6b26a667668363a615b5d078a4962c48658e3c92e43ca83dd0f71ada43a48d52b793a48e17b66097d06f9e3804202e3a8e832409d45f8b33762edb9982e79948fcbf7213118121cdfe834931feb8d6d5e3a677e3c35d6bdd1a0a51c9c0141dab8dc0ca83c7606f7a31084b9a9a985da6b93e23b215fe4373e597574357435cf7aae309c11ddef6b0f24437df2149ec8e8861e3546f2a950f900d74a8d736a96ca82b35bdf9548d6eb6c6235ec2d98ff0f196fd389234bb44de0a2718302a3c7110ffbad0451f4dce3eb2a189f63d52683509003cd6e0574b94c3db904f9b3113eb44725a5aae93aaf299d05b8aa942bb635cf5e68107a3277b8a70534e90976275809428e77e5163c18edb02334d739095da33d32502fc5b12c6b14acd316404d7c70f81cd5a035472154e92e8a8831a22c5b34ff4b40e2648df0e6b411ec8bbdd985da9992e3df5d1ebf2b912a1b250fd08553322b7f894cfde69cc37bc794b7de6b5136afb01f8377e0b293b57a50eca913320a0eb324a6009d41dfee2a416e6b9be33b55a2e85d59a88dac4d587e95e7352f004637bb3a798dda6d3a7164597a73e13819dd2be988c698bc7eafe6d7d32dd416e2cb252e21a7eb26ac4baea46a5ceb7b19db842b20d5998c5bc4b78836d0c6dcbf3ac8e2399b82d097232c553b837774960fade6bec8d0f452ba20bf72916117045596f4b83422b026c6b187c16e560ecb2d5dba5b6b0d7709c7b8e8b4d199d19fa0bbff8319dca9b308a836d0c1eb0c6f2a14c13c820d3b7213104491e6df75a1e61621a5c7be94f388afb47d7c5c211621fbabedda16ea22c837903b1088e6cc8751dece86bd749ea66126c1139d98d489dbdb93e6d8ae9061ab6dffc716e27c3dec83e2bc2dce5192f3fcd3fc5f3b394885164f501afe5fd42bdf685c73f9c AD: 31abdf1d28419a911203ca879905ce7d0edf1c29f3874d02cf2b799163c9204149b96a19f7c0eecd64b6ba2bb686eb1d6f79e420d130fce85edc6bd6b07257427a9107bda792de711025d05962dca533c52a2a379ab8516010107bc7879bdb2447973f6d356cd3905e253023a863a3175f65e1988b3f8b92af2ee9b5717d87705649127dfc9c7388c9ddfff5e0dd7564fa76f9b3272000ab7722becf46c1c2d99a51db96dd32fc5fcadd683fb4f7d57eceaf332910e8d275c5f955f27e899eba77b87784968e889dfffd77367c3a4c2711a87e1aa5dce4025ec7aa3908b96cc5fe05de319ba6de6d57b170561b32d0fe4217b0739393fe730f4f62058fd3f950bc5ef151732e06fb92987302c684557befbfca5d15b72a22dc0a3a16bc128698a6fef64511d7945cb1ec973d66e81e2f6481316640afb0344d605cde7280e9e6107131d1b2fdcdb93c29673d0822b8fd1ae0f22fdd17b6f654a651 CT: 173cedc6203b5de9f4950c055399328756c886ba5f8eb4d3dc4cfb5e7681aec1c9ae238d0dbff2af21fdcfc244d20fc310ab0f53894d0f9d7204de4c3fe8d366b3fe075d7c7bddc79a256d54125d493426f56c0f56b0688921a0f9c6128ea6ccb405e7551750780d03f1e4c5d9ed1daa253a35178e85f5214684ed17614dfa8cbbc17c3620b080531dcf8434b7b38d1d45b45759f2f0e1c694d39e9387479aed05dfdada1672b8fb01935ea13a057884341ea164f1e59f8069aa5578845ce60775e4a6166b99eae120212cfaa30de04ed140759dd071c15a3536421b0e0dde31e6cb7d8e7e71aef462db4564803d1f8301f0cd5befffc1c0afd74ee5957d76c0a6bf85e2e57711c0ecde9427cbae0c214a09b69fe55ec49857df822ceee98d3d2cc2194b48fff88d5c4209b8a5aaedaf5c289884f442db3e5a8e441a4da134c3453665e8309b61dfb007cd48fe7f2c1bc612853917a06370cfbf3cff5c6c4d745f134cd5952986ab100dc17436cef8daf917096adb9a0d49889b75cf0306d31b6d6902817e747918ff92f479bee78bf2070a0011aab7c0e734395430604e6c8c2a73c17c4bf10a1146ebde04b04bb12fc6a189faf983e6cab5553ffb92f34a89e8166ecd024d89115e6b77395eec93d62aa3daa2f5b6db3723d25ac747f0833ba89350b23c2f874181a6e64fd3ecf4c07396c8d90be0cc78139d20891eb729e5f22f99d07758fdc00e76e9b082cb456c1e5a7b7704153e16b564f0bddd142d47b51e63a3c540dff5f32eeb786c48b3256b9d655f3098e649af178dcca88413ba50f0f332001d4d686f566250fcec1eaa4b3615604c9f3e8fb1704018d609904af5d2558117f43ffa74171722974053fd468e02f047703224cad8f7eeca77f8aabf9adcdb2e3e6df4f805b2a900591977b7180a029c8b359fe41b31cdce8a748f6967872355688e932bc64a43a12222001bbb4d83fab619db8f933e TAG: 5609b0874958433df52176247da18dac KEY: 87b8cd45737c8446b21301be1d5d02ca NONCE: 6af5432cffee125756ae7bbe IN: 2993033150f6ef19022bc5bd11c9ff9ac8ca8b17c594151ecb5ddadf8465c73969c432f4c273596d9cf7c53187932d3be41a145fbd6485ceb80b196079d89e3b5528c61946ba503844ce538a1892e62457abf4b6f90efde91d1747fb5bca839149814f757d418b9787822c76ad2ec6e5c84a07b0d7eab9f918b71e075cceab5d6ae5dccf54d4a15db9e415e44963c8ba68101df5894fc1664844c7ec11c300ae11cccb4ecee60431e36a2c4516db234378579638b758f10d80ed372da218123449a66aeafbb41bb8ff6564cbbc9c9f734daa1a9e409fa89decdd619ec8d1fa5918d3ffa0c780c0521eb514b2f23a4e95704f6a22657e7203bd1cc15332340414d02f7265023e0c9906147240d0495739bd33f7dee280e2cf905a706dcc838bc2fcea7e4afd823ae2dd3e2a98ff55f3ccc2b0f789e4d5019b93f213722ffe27aa583f6b9f77cabc4ee5358324f765547daecb7e2d4b371e1f77debc01b18be41313387181537b360f1090bcd9647ac7694907ca521f84f7865c3c82388c6aa80627ca9e4de08a163391b228be2a642df333374ec7182604bb80770f4a839aad778dceda56764f5888a95e88afbea46cd9eb4f506882cda4407461b1ea2f31a88bc7529fa923ed9387ff03dfaec545dd796243b7578640e0b8025aea75ce1b9ba918ab04572ef65463699d32125f71966242fbab007730e7f490338c60ed9ddefa539cc88d39b254e300b56da3c832065a35d961f74982fc895021fbee01e03e9534e54686376d8f9061cd4d033491b081f15639cb2056047d79f0dd7447c899b2aefc7d6bd03e57a1d7cd996fa282ad7493201920130df3007d13782f197b26ae0cf7d62cbc642d10b4202e1887b43faa4b71694b05d19daab60cf37b6a9b50c7d32b04138efc84414e87f6caca8626c2f764a945a26fca57907486c0db54ba1d898e2bea16e6d8c1f25bae57962529532ce48be6c1cdf0451deb047a1d27faa680f972148e9a0bc6c897d4fd AD: c82bf439bae425cbebcf21c29c3cdfccd82245ccfae0524e2dc0b7164682891c85c9d6814c80fce1a63d588928b38dcc987d9df32f2a42ae4a1f9e8ac6bcf285bb08d164afef3ebfe6b299332f207409d271460847e9279d2f0b5c4638cdd989f868b4f0dab1f324e9b18c35e3bc5f798962b7d4f3b6bed6fc1c57055c489032a600951f8d06c14f5ce852d29be001592ff5c3678c0bd8251c883b333d5c670e52072fd68fd8d53e1a2f48dfd2880394541f4df82a9b6adf525c527550161e0d7dcd5d0bafaa4abdf1cc7ae189ada0a61890831eca952cd6e505d4df44650ed533591fc72a9cda1fdb1c4be99a31ac10d8f011ebbcbd8d83caf5d8c33a659d032d4e454ef069b2dd414fe19706681f83a479078f01d6330e2f57c2a3720e5caf67e44ffdbe461d967060e29f11d4661f23b27e90d521c1a9f4f03413ffe794cd9e39dc4c81f43d38778fac476585975b72e26dec8658f9cf6e4e028bc87c8d5d1fe47bd3 CT: cfc53c8980c557908f7d3a2c15e7f65da940cd319594b7d8baed9ad7edba0a46987775b004b5fd0c10306677eefeb8105cf124d0c64a2dac05364138fa2c4e49dfccb963a89956f97bb0340a14573e559d9f937b51fda46206f7ec3361ce566ac2ccb418290e070ff2655cbe89e762466c1559fba756c62de1c963afa1ad18ea47a1cf3d021f46bae6c060b19aaebabc900229086dc26fae9fc9da70af5af3acb02b6d5a570e95ba0d2f789fa077fe06553670ddd0c4e8965a3f5532e93e7fb0ab7e0b9f90cc9b483f1fb79ffa67d0cf53596eac25679ab4f8ea75b93f3bd84d8b8270d6d5ae62a5fe8995e9b0384365ad813edbe7fd9743665338cde61f8d0bf82481b9da29f6682795e7178fc79e676c8e3ff641ae25c667f92c849a642abe974d97718f0aca305b57ce7974172477e90e16d804c450b332339c61c327d78abccdba272b85f4da54154f59ce8dd5bd89e38a515bbca07d1526eac34437c66496f05e8582ce654ced3ee07d4e770da1799aa9b6fd42402a47c6d5e0c61592f11e798cfa3bfc20dd601e86e05fe6ed45a475a1b54261f368877e1207029f50b6d54e19c132c5732ec34552c2c559c135ebbebc7be00233126d5e0dc5e20b7bb37f6b25df2ae5ff44ab390ddfa91435c6d8ec09c4916ce8dd3e10509094cb4fab2ee9f67c3eb351ef221f3e67b7ff3dd7292ce01eab7e298343de449a2d4a0a168860bedfa0754717bf6fa0f5e37930db0e70c66976d34c0afd3ed623df2a10b9c02b2e9220534688e640de5d53f3707c2c9ea3de7d339e5530504b3a821cd3097784f325ababae463e9e1b34ab0830d5411c9e04bd48a321be1f8b973fbbc6dc03dc7ca2c31b3d9a800ec9d425881468dd9d8ca7f67ba2ed500d1674118d42ccaa6bb18f0a2c4e5ead86234255d850f58f9ee7ef7f70e2eacba6a053ec2e78c27a45faeb4c90e28687ce0d7cd7f8146a6ce8ab3887408e85563889373b606cd5c968437bddb632d69e8e8fdb TAG: dce7df76d7d0c0be7f560dcb5a4a00cb KEY: ad3ff84d1442224006550f6006be543f NONCE: 7712c5edceaaeb3360ac7ae2 IN: e3618e093a797223283e0b9c36a841308146c122e3df15a43417bec5dc4224a10ab962fb11c53e3331f0a9967c008541bfd7d1beeed4b80c2371d5ab62cd098fcbed6f96f01fe9cb9f9f7b039bb010551e504252d0752afacdec2f2984d4ceaff99dfef99d57b4d4b1fa969a4e70aa0d868993474f7d4bdea01b9178feea95ce30c0f6b78f22c70da57d26677549e9284bb4a6717596c2c3b1a513ee888915b910c93cf1d94aa4013e891e1da11c41254af3c76a1f63d67f74a07f3176744f7e558f03a3525b4a385fc64e6ae48e5d96779d64b5f557ff453fd44cbe46a2ad96fb2f79ee6720e08bc8e463abe2a9f662540b5105e1252917d7ff63011106cb7a47829c86d374aba8536d1bdac2250045e098987f185ac00faa0b81630d94a41ac935088bd5829e46ea17bd0e19001fbd25208fb312b86349a9c60540dc2b5091c3b0902eda0254b9e8a447d4983ce8e1f58832d2e9591c5b15a96f1fdbe23b608ca5ef909a656877d36f16ce276e38744ef11768030b479a4b2bec453dcdce933c78e3d4e7bd7e7a906eb74bf321fa75f307861ddc1be310289dedc87a8e325a3e4c6dceb1bdc6a02d1df4598f343ae8a06729502f5abe458be2325ff985b3cea0a166ab7530a560d1971c57c566197b5e004d9d38d831abec067235c0d2ead91b9319d6ed20e6bced57d71dd2dea6a2ec22efd29b146bd31617c9c08cbd26e9dd53e045d6f29a7dce57c61b3a5f6410dfea52c30baedd587cc15993be3ca8e125f61272150a02138c8c3b46922be9ae2d31ab7f25526b86cc0c73cdc400b5506dcd94bb783a97f39d37db162519549e642f9f087c3f41c8234fe01dc1cc8fb0ab3099fe2b8efc1017049d79b5b6ab9f57ba86d2ef73e2c694c180d2860766a4010d76407b15afe28a3866e48b6b688228d2f1fdbbfdfac9de426186e9f7121d1a98b11caa6193f9445939403cc960f2df0ce5d7d4a30afa6fe8b9ed0add15bc78ca371cf34d6feaf94bb7f6520b4379e7bfbf836acfa3e2adfcb7f880 AD: c53c1a8b8fdfbf5272fc29b2be7d69ff0741df1ebba02e0525e29cf45063e5da740f6c33b1deffea0eb2323035a21b18fa010c6c3ca7cc0c8194627d828fd5a9898e2b55266d4377233badeaffa7c703fd710441e250d9a5d94d954911d66caa836e2413b190917c1802c3e587d514184498ff2e6e3df5405829262b36fa8971cf8595bd1cd87801ac4c99357da70e2e55ffc012a30cca44e4f5538ba92f17aed8c8a48f85c501df2f0639ac88a39cc024fdb6d29aac368728865db1a30ddb36d366927f04f00f8dd2229e1fe76db8e7ded1fd886a9342308ba99d80f86704c974da156d96c272b806aec6c0268378652c26bad18ab249e117f8643d234b965d45067f42b857f0888ec68aab64b3ebde8a55ee38464e5f35f8653c7f0ba7598ad26f9772b574d7e060377a4174922b1f8ce6b72a83f3a20d20625132ad7cb1429e26865ecce2a47e29740cef1a3d85bdb3e800d46692d6ef926395aefba588294ff410dd523db596a7c17bf7d4 CT: f59b5a5d01cf45a8d91c8c53b3d8feb5440b6cb9537d9feb0da69c33827d1a5542e1d2db34f25c399714324b7d31476022778a82a10668a281bcf6e5ef368a2c525a7bc59f46fb9e747424741e8894f86fc157dd748370212f848d23b13dd658c1e2ac1bf99abdf93b53a35b5bcd89cc4406953376187af45ab811e99db9ac2a367f8a55b0fb4acac9a9bcbc1858061860230508de9a777bbfb0f74b2c69a79dc332a4f03d156596576792f43dac2099b1d4af11fa6088a086a25364f62c24969a515e74f29661cc4764842a47cbeda7ff9ef515c7510c16566536273d62109397626a3c2b601bf272e31462ada51a01a69e6fe174082966fc25b6b8b034add7d394717f08df992771696bd51c25c8feb47ce637e23e89feac9679dc753eae62c0ffe7b62d9855ec470904df6bf7b6fb246cd6ca77bf2848f1074f146652461307c5d51b46977ac39c42ac5857b64f9b347a45062500de41a19f2bb03fdb241b309a5b685f408aa4e38e60c667fd4bad4fc3ab9d8b4f2a8735b50d2fb7d7177d2ef9e5c783ccdbbc8e923832117d3ea8cabf40891e8c912d703f37649096ed0e41e0e53cdb19da6467bb1ace8064c7862b6c4829959f7a0780860a598f3c725f3f956259ffd20e9088dcc639a0c947d85a51f6c77e911355ba77fe43e49a1137fccf2d951d4083c7232d095f2e2d003bce91ef9cc9aaeeb046a35bf1b548c78719c553e6ebac55a77509a3f02d71a9fb84ee16a8fdc6b8b1c917f800e053e655860ab17c0254327cfc3dcc9267e2b78dc2082e54895faea0349d9df3eab4b0bd62f5d6114903d8851aa3cc9068f6b03d7924dd6c4fcc08237f05551d528c01f33720c53867cdd375fec867f71fb3b4688eb18ac3647baaa94d2a72391f47e819b4f41e98904322d1b57d4a485fe9c966d4e0967eb415feff49d1baa38ed2505dee1b76bf1fad013918bc282761f9431b1ea4b3ae826470ef72399c86643a308043a2206df7eb354671846962693183df96ba170898fbf304b0ed34b1fd TAG: 90f99dbe53f5a8531b2a0e8dca2b7492 KEY: 39ef8200a13e35000b40e9b0b392c982 NONCE: a4377557abca18c1f3bf774f IN: 4bf8ab0b9080dceb2323953aa0e621954d87737bba6f562dbb0de271d6f1b88d7c1a712f613b099d2bbe0784a8304467cb168ffde2625edd9f38be5660020ed3e95b49e0a0ca9dc2bd0de2e40fb275b4813289327de0926df3c73865e7689fbad0a6c79ea615fc84345529cf2ef68b37b7e9fa5d538f4dd848ba66adb4745079acabac63de8d2ce9a2b19cc718162e9fdce49de7fa4b820043ae234d8afd23a45ee3a5db124e0f9252111c367beebfab55b2c784581b63a1caf4ab24bf5af45b986f457ddafbe87791788e7c7536595d965d5fcf21e3b13873b00357dfd7851f9e0f198ff950d69979157089be26b22800c3dfc713a5147b0ca4905793a2817281fb112deac286c41ffeb2bfb3fe1ddc9aaf4fb41fd5faf1df2e6e809f54b09f99bb8b61b555efdf4d8cb559fbe57a905d30184c2de6e154d501bc91f6033eb97295d96c1085b510cd57631e40e9ea3225e175162629b4c44ede0ab5643af425a8f8614e621a581b559f0e7fb63f0c8ca09cc58c244ab2e0f750c6135fc26e433710351802c329edbe97877f912bdad914a051d859c588af925674f1f455a322671793887420bc79a11541589082ef12c975dfd0528294ccb086ecca86ca940ba05f937fb2eb91b4b925713e8ef7d10305bc937aa976c5eefb4142b0c18c1ecc6be979621c437c64e1bcfe6ae86d28a29fc894120da6ddba1e56181b6f54a9e9810a83c3b44b6fba10959139787a491f367658ede40e1289148f66d4677d0281ea3615ab399c7dd9e6e05b8a68fc8724089825fd5f6a38406b3eaf01b8dcb62afe181ed963a0d940f1521f4f501d3349e6aec453edee70f1cc640ba3bedf78ec91acabe75f7de38ab98253dcd18c6a866f4c2b8a94072b1f141c9ee3c43beed8a08d09c2f35f142b8352cf776c57d6684898fdf6653997dbcb2cfcdcc43d63b1d287beb8a17ebc74eb3c3875af2ee0446b2d75052ef95d37315fd55e346c3e8dff45f17cb28f523592ba049b5de3963baaf0eac3cd75f0f0543e0dab651061bac4e3ea3679bb9a78d035bd8ea9e8 AD: ad709f6c13ae2d4638dbebe6b4cc0ff606af9720c708c20dc2d6f0e4ba002a0b41e136d2b10dd6a2f8d9fe8cbe91943339fad0c52a2881b188611955771d3f9a621af08b95dbb77879bf508963fe294c8b8807fb9d8458a56d7fa2a4c5d995113ea8a86da07c28dab43c997e9277f98009d67fcf2ba171016cdb7e6c449f6996d21563b4ab22e933ddfad5c50e9036db19adf88761150b2226e73043a49a8e9934094eb4363d61bfddb791f4c5bca194d451023aeb879092eb2d8c8c3a2a5b8a832db6d73804c0c078c50a1414b684184780278cc90ac42618bb4144d5a415f582a77b247e4e8236bcb0692620757960f5103887683fd54f78095e8b098506c81008a7b443a533a0a71fae3f08bb4c28c7142576f459b1a2ccb5f65425515e691852e0da343291ca414c28c90426f7d5f9d7c78f84ad6eedc600137c4d86fa7db53b1d3fe9b16874b31275a740b5f640fffcb4351e4e32cd6bb7b6fc11f104b2513c0814c370b6a7558d7fc07c355da505a1777a2176 CT: c1545634e7b0db1afb8a166c9f0d81a561841a583d04fec4f1994c7764582f7b11f832ec2de523e4f6ea3a7c1608e1d1a037b7975bea51524bc8f001ea34a2387f7510967cd57be0436529c08144c232ba1f532863255a55b2ea6f860b7db366ec8ea366e62187837ee8aa47cd9a8d687fafc31680c4af60493da7adb7ccb8f751ce6a6e30ec1f78bd169571fcc0f208d3966cd90660b8f7c2969bcaa8368172cff0d0fd27d732d9f7869d764efb36e55ffb96a1f3d8f1e6e5916e3e97e1f5a12f8dd965466a26274804f19dcbc7ec872cf662854501f37ef5fe348c543511feb61dfd96c5d429c83c7ed70a1d5beafc241c697a564897c9fa9819fe91dce3234d7632ffe73dd1f7c3cf0bf6d170334d2c4104a6ff5dd92038ad91e69f2685ccc380a9fdbdfe7f9f47c3a05ed97be25e299b8e71905f71c68b492be8545433c99b64f2d53a9239dde92359cfadb7fed301b8d8162baea533be9c9ea11964ca6f34e4d81b968546988afba059fa4b4e6d9e436137a9d991cfb867949c1bf87b1d61a5429d4bf549e66ca88b309cc65963baccc5449361dcab294d8c817717f848b942dd11fb1a8015a89e9bed4cdf51b4ff3ace0ab474fcfe16ba2da81b59a5dd7958913c92b4f6f067d2d350111c23c477138ebb40a99e0e55e6f609d74565c77bf8460e6360f4bb54220176baffdc96e4c37529ca3a38b3ef959d3ddb3b2759141032e54aaa8e6b2bdc928f01974f1311fdb15ace49d7d5a026e77fcdb5e9d7442f7bfd04584078804fb3aff740af89401771047af2483153b4c79923980cbc5695ebcfebc32ddc522f9da5b1220961555aeeaa2d578538691ef8b9f12b5833cc4f3b18d7c0d8b068e294c82efb95badbf590a3b4094c38f334d7ed32934f7012b87ec4a49bc0c2b7fb98365f22962d1e45d99e190655ce4213275b1e422976bbe36104027b96ce3e52ff931548e10e006c75747c59e3f7136db301eada16585ef15f4589180b368babe64b114e36686282d195d622e89f04d56f17c718d72bc6c577796a639e634a97e7877258 TAG: 9563db087214b10c64e7cbbb9dd21a83 KEY: abbe5e520c0ee79153c976d71e5c6dd5 NONCE: 76f4857ba2d63e04d6b69a2d IN: 5a3ad1a3cb88733fdbca5b027ae04137f917a650b4a556b5fff90f17bc12a890aaa8d61029f0c6663eba8326c1bfba5d9221876ce3365bfddb714e884bced0f1675b6ffee2b1e22929f23893f3dadf967b006e9cb7a9a0972422c74a0393a29f9c4e06c2586f393786ba078cc52499ca6e911e323915ebca1d1dd203189cda3af76f785538d9f1cf5e5dc5758a490cea8710a9610790f426a0c76e262eeb9facfcd7730b72802084152f71adcc2cd6a2bcdd0fec76ee3228947d2f9b1b6f614a7e609c8f250fd02e19a487365b0db8f2d53cc6843d0d2a2abf3cd2ce33125558046fe9ea2eadca7dcb9d0a20fb3ee274fd92360f8772a53937625b5aaf9f10e9c9452426cb42dce78cdfa2628aeb58c295b01e12b12ece1fc5f66e33cec966b52d6593e1d1e93ba3abbe0c917dda7c2b6b5d45fb4cf6588908208e9b264f7e8ff87cc5090f4ea9b1a5205c852c308783a6c5ba0629cacfdd38b50706097f3496b4171a3199a485cfb32fae763dd77234dd9e2c6544f057c9885e914325efa4ccc25099f81c95a4e968e5e031747422cbd48ebfed3236f878a2832b7fc6aad4db734868ba2623899e9e0689e618bac700ce17e6d0114a0f5b94d6a0c3373f803ba2337d530fb706b8afbe482eeb9e0f5582b2f502d3c774b2ba98ce5400a20cb7d9a32a351401bffc2214392166208de9fc8a6d329b7dccf10734b5b74ce122f2454fa551b586dea96fcad2c45b1bf562bd5751b757da829d57cfdfd8ecbcc410c00aff69764a4e532545838b38011f92e464d192ba315ef239dcd5041448f165a14d503a865a85dfe81c5d4dfd37fa6c316c09eb403bfdc2a8c1a0618477a5fede92cbb2abb71b425e201c6361b5509288675a4541f44b7fe052acb25d1d87660eecef0beed7851a2966947dbfb8714038621b6f34ca2874751aebe9e8084f6ed854ed5f151f81533614cb1fdc08d2f51e47537f6229e0b64d10b498f773fb67bde258cb74a78843256913cad2727f9dbc3a8bd51daac9ed308ed0d77d86aa657a6ea7f9c35e120553d26b2d3fad1bc256f1f71c7550220b0b5f3c6fa8db73 AD: 16337934937b996d7a501a3d1fa7f6321369747329fa6bce98f68c769dfb3df84b2b1e14f1a58c3f6b65e03377b7058fda3c26adbc370ec72e58ccc953ff157d4863057e0df89328efb5023c1b79f0e29be2d7cac9f903bb782c4c8720e2ccffe83710871642e2acae2071ba2a0af880f14f41ebdf61a3e5449dec6e61e103385971b8300a31b652053496e9b3a2db7a7bfb03a054fcd912e3e1791f84cf484370e553d67cf99c6b1c9b93bbe6ad4a93c47ba9ef73d9f8506400a49a5609e7eae5e3ee9efc657729d1e615a592a8c9f14ba37f5d91649a8c59ade56769c3bcef0c004c7444c3dd24223ef7bc6a2ba2e5927608692d1fbbd3868d7fee0fd11ee40312ae06d20704e29a97ecd4265556432173d6248e9f273363211b5d505de9861eaf402a001ac18b485c7ad0e442bb5e648e20e0884ffcbbd2dda9b3aece535d964d2cfcd6f99a31a4f24d878575fc3ad7a7c19e76771929c45d0965702625cbdd2e99371147e41e950ef70a7393084682a2ee6ca9b611f3c7b38ca4f5fdf2 CT: 76e3480cee9d48b31d5b1e9a01e79e713cfeb73d742f1fc1e8f99c8e0cd82e267c45f4270077e86996a7e5440a781861dbfdb9759a6ce3991fbe6006d0de04658423f54154c8e5945dad96addb8bee044308cdf062ef21fcab25eb9a91f100945f347c865211a1087c01f245448322e77b826a22287df3434af7bee91d7a278fa59689656f7d93270898fc68594a4bea223d365aae03f0dd18a2e525f0c142b28776bd9f66fa2c046e57394488d5526fda62704e90f50e9752bf9d7652b010f8407de91eeb3068b830d0cc9294bee9629161df4cc7a1a216e55dae077864999ae72020346e813ca8fcdf99e417f26b82653908d0d6eb50ec65814f61b1825cc29c4679a9097e9afe294775e498489ca6839096f7bf0b60d3ebd016d83076184b272db1775f5eb3205015fd45fabf0bba9a990518c8d6d0c478221768fd83776253dc843eea8bfb66fbd2b9977632ca0aac7efc9528115fe4394f460d91c1b74fceed2952c6abc46b61fed85eb7414410731106e1a7be792eeac86fd4bf2b1ff2e496417fd8c0c2865e80837b2b73a690a6d9b7fea83687adb3a004a0d9fc9791c572d916a1b72f3ff5485f7d24e08c65a86079dc2bea698c43a3b2f2e5a8f335da4376aeae4d7fcb509bedbfa0e8fd25a711af45225d764534edcee4bca8e1470cc7d187b0bd9c26866baf8169289653aeae9b36277ca22c2a0ce3f69b3a40dd55e745b0b7467c2ef6a8a10151297eac1365ee475239d8f254806c8d92354757df8cb12d3dcfba83e05c303bc157c7be49da40ee072774ea7e4ac7044768418e64d965eb76d14bbd73be18d14701cdb6f8ee32cc1fef468047ef0ac649fb77843f0bb751f543339922bf34eeddb8140220e6b45ef1cd180697c651a352d05c77b705436f61ec9d35f185c5ce83b210c4a4336483f49ecd538dcc42a22b4f77ecdbb8cc36b8a499ed5c39de1fb6e03b0769639670fb2517c57f183eaf56148e1625adea1efb9b888e8fc3d83ba05c35f8509bd4e16285911462d77d9b270ae278cb902f6ff7970211cd53f1c310cd14a1787009cfd041c29933edb6e672d1d5 TAG: 8954449b3f6a09e92ef2e33cb57c695d KEY: 100c6c8d1e88b842aed09cd16a5d78d4 NONCE: e2d7712e40234292dd1aa27e IN: cbe63c433804b0111a2cc469e4f012d55e95e251139f5d6dbfc6dc8e8fb6bf5ecdd8dc89fcb6b2964755d1de9d8a0dc9d648619e185169ae5ccd61a6c2266c5177d8569ba4a09d4c231d48b8f8017365a411714be669fd31f5d17738739c75ba5abfc19d1eca16558cd69bf33f63f50417c92c29dd44ced6e9d9509057ce53a37cfd956bc33c6128fcaaa441fe3016389cf69bb589d323f18fce0a6cc7e77d9e33868ae21ecf8e491019f175f10013392c8fce3e6de3dbe9bb20ab69c2996967d171ea48b46abd36b9f4015723ec99ab940156e6b13ac06ec0f4a8ef74ee304e3072d9e14e844d2fef1e6fff116fbe9a74a7d90e79958a2f14c364418b7cc0d135e0fb8e68600f2e7aa26f9e15431ac9e5cf380b5fae8d715d1dbce4c0225e5c61e747029f62f4ea5de277bccb75580d6f5e5eff710ac8bed37e98b15677462946b2fb3fc0ffe720ea7c6bb70baa0e998fad6b747d5493506ffe69133608f2819d3fd9c8ef903de215b72677076dabb98cb1059d7d1b352f95a2d2c2903dff63743ec314e0313e46095197f6aeb2967c5a60f7f043b5167de03ffd320b64291bb7162b495f8379c883f17d642bd8bcad4caec8ac05150a5d449a22185058fd5c3a87a9f39b8a76afa529bb9e22641c8811c78fe3d3aaf2acbb88c47a1ac40dd686b80828fcbef0937e57a6272dc2e3ee18fb99410ac33a96d0800bf07dfea59e707cdc633c938feaa179a8d46940d1182fede7e1b9a3687548a0ca19bf53a641082da37082f257fe2fc83188c46cc58ff44a111ad32b6745dcacc4720dd960d2325443cb70615a4437eea2a409ee70c7fa3967a2fe97915ae852cbecd21d44b8db03d3d631c90e834a83428568e8250f5b8e2422007e8cefc12cfc28fc7f9a73f93afc1c3d2083e4c5cf6204753ef7fc4199c0d877859a90a1d3b16ddec6de134689accdca001fb1dbaca4fd492854446c4897afeeb68181890914744a387c198674d37ad98c4ff3fbb34ed656add39879af2e336e529c362d15399e40d2eedd9fca1f07c117304024e03ccb6e4e35d4c2508014742ed3639e8d0d0a73b4e99c AD: 0e2825fa3a69b798030cadfb168a1f88dbe56896bfb9a41e901a1bb61b8a95cfbb343266e894f101767efe874d9d45b4540d2d77e701e1d42fb03c32ca4b965d836b3fd34ea3ca2e958aa54f1b71e8c442783924c023c1b9fe0a45c88f4b66453fd335db8102e1de765ccfd7fd415ab7a08fe4e0b3d2a14f1564ffa3157a7da7cc9981029a45edf19bac8dc0f97286038b38fca85f280ff9a98eba85e328be65a657291692413319e0f045c07c657c903e51c0bf72093c615cdfa18368992cbfd4e11bd64054d34405d00bbfbdce63e315e3e99fccde073823c17d9790cced43408ba71e48b06f9bed959818d939f7c84b2d6c3861dd17e424dee0cd7942320c50ce637dd1349173b13b972d0808d24d5ebee528343bb0f0415aa123ba63206de27257b11ab15aa1a3d23d97bcde30cfc2c8f9bf0fc3cfa4a6fd61871744823d7a1f8fa7dfdabbe82e73e491045c9df0f23d9cb83ac7d1118b4653cf4961cdb7256b073571962b1956338d684bcbe4aa05aec761e0a14cdbae6d42897dbbb1c0 CT: 4b7337e4cacd72909775b7b8b77e3a73dca810b4642310f33a58f5548f4876d20b828a303cd85241581372f94d2582f79030e13ce68835836fe194bf8e68c22a39feb10825b80b4e2c69ce430b9b56536334616ea3f4610ed7a8136102fc22e634d5fae28cf518630c5f159ec3bda66fab0896f789c7431c9f6033c52e7082b4b65caf82df07266b39a4f0b93867f0e94e3f5065fa626b4ae90dc70cb3cb5d9225bebdf7de553d364efec3eed41c15481d2ab7f8453af13ee769c6a0af2c0a04b61f74302211e1d201ba91eb73ab2a199c4929b903e91172e4c7256d6b138903a4707f2840952c07f9ed10597d023efabc587d2753b28cb809d678b8306ab50bce2f80b9c5758e8d3bb3be07e7645ee858288eac7072272390dbd2915742ebe44de3e56caa0a9c7ef8d42df94173657a4bcbd183fc3a8ad1764606a8bc98793e240fc5e18f3f86cd082dc4eb11576fd29097ee7109d444aac300dbc930bd1d6d2b7f3c69cc02ccc54a86a627603f3e1f11859efef34bf5d11b16d11f9e5b6e985bbfd3e4e3bdb94a48cc0af7eb6c212c3fd621ea6203a5c2192fe1c25ddafa33ea774da1445191f5bb266683cd150cecbe6e820ce3c8a210bdfe407d203a8d9445c216adf892a0999a026bd8d958589f3a6aefcb5ddacca2285f2dc20ea31f43d6759ed5f46c988587f93d6b90d335bb51c76a3fea6f7513385cb3c1b8087e88dde0cc6ce55e7464e6b0b32e777a4e34416c4ecbe1610658ec0a05550d1dd5cb51b15fc3365f32b948dc28342b2b7ffefe63f4842399d6df28b966510e4aaaf5b5f7e4c470ff065fd30d56d085429f89093a291fd7e516b8e962b0fd2faccb0be3e4c62dcb7e75fa5514f79a07a8f4044cb253074b8085bb925dc8302ad9f7fd0d41e960a55f25f31f4bebe6a04775906b59f124a64f5d55caa55e1b858d1383ac7e4b39fb959cfd61acbf0d64ec6733d15e96137821417829c999ad93fa735f543fc73a94d942384aae4e330cca4a7d694627684267d3a6d74d6c140f84a3e10cf58158ccb3ee9c7ad700b08bdc46698707957e523a81f9e683527bd16ebea1 TAG: 9ee21a6ce2424d9ab143ceb318e16819 KEY: a646ee4b0e0dd43479849864311c3f74 NONCE: 3f2a6cf9d0dad34111493f0e IN: 55461aa1daba988af83842804de0707b69bb27ad64f66247eca2701b9e697bd6d3ba32fd30c7948a1782f3d308387b3d66a8da9c412d4e17d8d7c8b3344f33a79e0aa40ac27ac3659eba14e951947fc2f2302953bc766ebbfdc41d1f4c26afe5fb41412aa776608d37d8addd0d7f0c82c61961024579d828aad7fc89493de8002620fc3d638cef981d8a843b658ec3ee27b01da0df91c0874edc83587a70f3dd5d6f7028cff83c107a72c4505ec4623b35ddc5fe3f758434a14685e74976693d8c67ec2f6dbb62f199c7eb3ae344c05b43985f6e5639f6f9bc321bcc436044b8f5b89dce923e85384e16e6eed7ea5f3e49abcc010655a3a29cf9fa60791cf7262671ce0fb2044383944d415a8acee77e88697a96d4af5f7794e1cc8960ec31a8727276ebaaa5fc44b1a240be8679d2d0c8d3ed8d950f8bea0daa64693d4e8e5e5be0567c0d878e4f9a830ab4c6153ebfd5b1019c659c8f456a636dfebd24dfcb7b3d50be807a14440f7aeb52c280b3dedfd7ced9a6ecab35e7b603dd8253a5046e139e2cb9cb5d70ec87f9468915e24847576c1b4a529fbc4f2d84706c1be86b81436ecc4bbe4ec15ced347ccc68744a9275ecc9cc71a62b0f77391e2d37c7f36683d902a0f9ee37df8306427de4ddb01618f62629ad8deab26ede6af11b2409810b4963a1b752c7f6c71acb3c6c2f5f5fda91dd54410ac1637e55e547b25cdf5730ed4aeac8c0fc59a365376d84a35440aa2830cf614bb1012bdb644841e22329bb5798bf971b370dede894cc4f9395a54fe7936381b7281e60767bb2f8a17492ea63063882d29ead140e197d2647656ab981caf919583e869b844e61fe19e94518ce7ee5aec100b9acc2cb8de3dfd5cd3a776ff2f23319721b05e194b6acc9db40b280592e50b8b5d7d43a7065898f5af4ad8afa6d8b6559c81a9e8e923f6548b3f59c8ba30620d22865117e8a9856f66df128d82c7e15dd9f3ab3ccae9d2e30061224c7a606f87f9dc5d40c689cda06e5ae21e47563378b50c1ee7c664bd814c329036858bf9d3abfae22deef8b74d2fe6a566e2aedf8329f42697cd7ae88fbdac408b1b8a6efe377670b244110cce9 AD: 7d000237e72e6de6176fec75f5baa6d75d0652ef7d1eb495797993afbb364cd663dba38c266d3721f0c522238bab60a95261445092ea645ebc25b6f2fe177297a0aecfc9fdc621fec0290b266c8ceeb3945376c4f9ad961b97b32b176bc1e806eb2d2e410e8ff7af12ef545493b1a61ab84e634ad86ca15fb9773765ec0271c204fd951621fb8ad69601c06c6ff6d151a156295371f7b207ce6d09ef47d106a9466fda667b7e0e2b9b2ef6caabd297dc82ebf2b03146c988790311ad7f4b8e41c1e04c1b9f40d4e3d8eb611f3ab06d12b97b75d3b490a4fe30b1c565243eb77d24c06b539e3d335b651e95ad957450c027698dcaa3ee3ff43de18fa735ecf7f404352c9406bb8358b9d3e47b7dc4f6a813d4f4f37225baee2c3c028b3974f4c0e8b1f0beff79fb0b04ccc5824b6ef8108bd9ead21729a9a9cb3ba8705bf77ec3c974a34b2d838784b243176b2c6e7a2010a785a96ca2ecec4fe57bf7f6dec0c9b72c52b8c53157d4f9fd259344cd556c637f921170135fbbc86d68af452dc575eebffee445f8f755c1 CT: 796320131f438a93c019b4caa40e9f183ab467d30ac181aa5f2a0e07295f1d07946c4f2994a3ed2ad8522d5ef3fcdaf6d58e1eb03f479859b262ca1cb6e950c24b70a5da75b13055022602f39370a48337464ee1100fa9f6a45bbf793226c358fd91ae1b71eefbece73420bfc804a8d6499f044cf250a9c680445aa54639308c10631644ec3367cef458ab24d0dbcea8168563c062af8f282eed1ac778670400c03d30dc4e1a8f3172555ef633adc99b197f16bcdea6c24b2634fc189b8dcd3a52b56b2aa5099c10a830aff238d1bffba89603352946048fb8e9ee72ce2c13e4fb717d83a31ebb67d99049ed49e58d36513fc399f0e05e3693857e00df98707c66c67b87a2a6aa63fa68fc829cc3813f831f06933ed182e103bff8fdb16a6ab5b9ea8f390a2248c9923756f3536f0e699e3af05e7a3483169cb19fbed3f86335a2fc071af6ddcda9c702a584493294d37bfbf1c2d35a3db8b4b905a3f08dc0e691e6d5264446978fa6d85d37bfa0f7c57630afb61e9c67bc130fbadff95cf8d25fdb00e10f4ac451f6780fb763eb5fe9c34abbdfa44e72346a4ba258180c134e9fc5e336e0aed9a0bc7ec3dc22fd0a38b245a512ab7cf0aa888e2b36f02ce8952a0eb69dc28afd70fe9f1bd20b12586d839cd86ea95cb03c8cebb0af0a6d8ca82d6fe853e5664d30db557e28faa695a903e12efb6b6bcaa9c30584121a662ff4a1a6850e9b005dcd194bfc418df2a8919749d8a82fc33ee741ba855caa9f60402bcb9896549ae11131730d7a7bd1011633f759b302cfd8a51afcb29ddd9600927867776e961d8c2a7ce403e1723d11fa92d587c9ceff9f4920bb4ec52ada70ff98d7c1d4b7f84cefba39031f757a86d78c04433b7085a9cbd44ee1cc8c4dc2dec2a938871bf40b2ed113e4234dc5331d536331c5f8552ee39f288028d8d7036d9acf9ff96e385a099a44f51e46cb73a4e9aad3e5b40573018a2023d683f4ee886236d9b3a50edeb69549462a4a496845d08f01e1de332bb2e3d5ab3e9a2adad675fab9eab0205462a097f4ca75bf59363ffa1e2f9dbd2831fa3ccf8b540de72eb613a549129e8d40b8f672b200420afdfb TAG: 7d11d1e35aa29774756505f036a0c857 KEY: 9c73a26fa433bd4437c1018263e7db4b NONCE: 580a120d1d29775d9d5ced67 IN: 10ae2abed148d4008bade4539728768b1ed315de117a81fa0978c1ed9079188454c852652e8ccc4904ccf233458b19d0f17ba6525f3096d369fda3dcc84e092ea1236bb57a8bfbfa9ebde780843bcd967708ea20c61b60a11ac24b808029676a30dda9f5f6cd69aa6d7aa3b08cee0e89456bc4561dfbd751f9abd3ecbc161256a26084e5ae1d94dcd3f74ca30b4ff1857ab9e68cecf2f384da7d271c1d8b167250d901a2272551020c30bb9e9f9a8f9adb299956fb060a17522efb26363393885b4aec2c02b0a8c40835fa058166c7c3013908c1513e4bf9c71671798537cf05c994d2090fc768a12dce93a80d0a4cf1614d0101851ea6f87b528047f07d07ed78cd4e54fdcdd26bb4f83d297c402ab5e328c404118f52bcd5b6f36a18bd3186a19fdc522ec9838eb363818a48ff88651a2359447876d139c6b0b7d35e30dc0a3ebd3132e5e2a0c3916ea7e3667fa266a91d5906d1bfc005f166bd14f298856e85022c8274ef5160f87d989271d2eeff544501635f4f071089e0746027a29d52264520a6ff2f2ede11e8d196c706c8a06d87c5e3679be87b0c36026e38fd53da6bad38f9abefe48b56db84a445f223ee0ceb1fb1b797d2b589dff9b26bbfeaa1b21d662edc6f4e48c8d91025220a9f3e7f1965e0e6f7232e84348190e1b66f918b896e778d58a40c47439b2007b8574cb56a18f72677227f1aa09e36ee41aed2692b28b3244e9f54a7d317b1e5b1e7b7fc59506744a25e5087d273203aaa1dd0b9d627b240e518a866d531a90d4b3c44cc1ed9d9d1350f57e03c3f841017b46a68d6f1f8a6125f4b622a0132e64a85fb47883389dbbe1e3d26eca7ac8676a22b4bc79ad30eacc91b6d06603e916ed87bef76ae3627416af104d2794a7b86b561ef91deb0e3f97e07a37a3ae11073945f75933a5dd66b14aa98e826aa4180bf222a201f5ffd860be8a4b73d3b7353fee03be602e52440c7077fe0afb1dd5f3e823c170a4927c241a09b83e5da81c1fb748452701250896547e34e647470f5af70a23af895d71ba21904e1c6fab41f5af486d448b57eb5a3656089d39ea31ea9fe6c88bc40fba584198cf82944ca5c806d3856240c4336fc1b451f44f31a97a978b3de AD: 874a859c5637b754a4e7c1ddc3f34dd6231ff71f13e6a5b4e182e62331f3ed1d4692e35f6959b17ef4cc7f29859a67b60527aef9d08a333bb51c6e163e016858a4da2103df237e16acb93421859c83ba348faafa3eb31d0addec9c90f61a4382be25a85daf829e5b2751c9b7378cb9e840c92e174b1e9a32f3a5b48bf70b6de1637158a09714b473e1b3e339f9f915d27b310af2fa13c05edf4eb9b114c80ec2677fbde6b5c351b61fc0527c9206357bc1d1de800d8e6dbbd3f97d5b1220006280a42f51b7b4b4c67c56aac1483a5357a7a26528a1ad1ec39e0828117be1c6da36a60a7052f0dbc26846e4bee96a7cb6dd5a3dceb6a11d356e0177be9fca68d0f4b00a8db8afe8441abfd80be2d7d25ac10620dafbd92c0956c2b3ee4da7f3db8d028cd60036f78badd42e0e9767a6c8bf8bc3ed869a9954fb4db389e2f6e44667ec26fec930e6a687e3fbf10686c00539628bf50390fc167b1c31c1bd061e975a60affd238a229a0551214f20bb9e17f097462629d04a9ca6ba98cf3020f1fce170b9ce20440fd25c2cc143018aefa1748f CT: 26e09e3c1c694166c798b8eb3f290e8709de7cacafadef90be45e751ec6f0477f6f72e19bc0343258babd08efb5ff4f82a3aa8e8b50f93c4bed2d1c0bbc07443606487a54f4eae3dd09b3b02232276c8de51b05ac31c64bc960c8d14b953db9e84c05fa9d2c3a286413fadb00f1812ff0a9f49b91de3660fa87e8aa73f11e0bbbecb8ca9be494919631431e29bcadf6883af673149c038a820549883e5d63ec5ddbb5d49817643f29c9665a3b416f67d28c4dbfcfce80132b3e120816c156947a003e36dddf1ac9652f196944c176d6369c25dd136c7880b20e13611dfe52971eafa0055f25cb8969ec688078cc8e7c2395ec27d7d38f0db653b6ab4c987dc9ba33d5cf5d1c05f7fbe19e639ae6baf87792bbd0adb236e4dbf302e93f26ccb2d7a47c8bcacb8f6ca4ed5302a2f461cbb0312d3bff43149a70b8271572797b52bf30cf5ae808b225829e4638fd9f2368021c6205b505406145632a9842ee338a796c435608ad5a92361a19d52b7f8b348d7fa16b3d7775c58e94069aa01bf470338dc28411563e610563ee8a8fc01fff824f63500599a7490f74a59e3ee4612b76871830066c4e3eafcd448822b4c08acf4935f59942bc3cc83e497ee8ad641bf329f6f0d9cf18d40794fe7146987dd6e29c3c862f5252a8767d966e0141b6cf0d166f18b658d8343b698d0a91f5fdba3ac2c32ac24935968959b67f06b985605bff2fc4afc2fb86d6b4e70bb606bc8009f9ab59fe6f6720fdef5f530eede5ee0cc48071fb9d5eb0ac468c820d161a6d09f7d319e3c0da450a9bc6a6bcd37c1f59b3817fc85dbe85ce050d72758f3e01b3e0fe62dd55447b479fb7a09b29122bdeb315589b568ff9a20850b0bfd20f220c05222d784dab107691974e426c83aa12dfdb5693f6c05c423a7c88b72104c0aba00939f9b7d0f92920f8b166512f7ca4d437082011b38fcc3596a125363eb5872722eca03132c8a141227fdf679b8f323ebfe227dded8a2871c1945e0bcfdd8b6c631e293858fa44ea16499144e72797cf82ec32c966c60de4aa921f3b754075a4956c00540cb5800dc97fd0de66936458022ba2498dbee43a99cd8e7c6ca2aadd1f63209d2a24c84a27c13b9d5dff7cd27 TAG: 68ef1df2583bc3743bd612442589dc24 KEY: 6269b478e1d79f3727831086620e79dd NONCE: 357fea1c84ec4de0bf7d6afa IN: 2f702a466807c0d2b8e4c81c402d566a0af16c065941b5f9b689a085ef4980131bb979a0b4300ca32f92d902516c3c9d799220e786d281d64f3a7b5cdc4721b5245444fa9291d4c58f9024387c4c4e4dac5ec5d7542986a2b97619a7db38720f392dc7539fdcc5bde53d2a4809b9223663d8876543a02431eaead9588ef68cc50e707e925f09eb53c7117fb2c8bfd07b578191b3af028d480a6f90fd891e03290d0d180bfa44953ac9388d08dbcdb238790bbe07df067a26acf6621b809a154242496baf4f7a07044c04dc02b5042c5365a71cc5ab9ee82630d97d1ed9b55be1711ac6b1b2a497eb1645c69ad15617a45751807a0e4cad1d0d965988752c65847bff53527bbd087f7d0f1b756563f38bf5905391836ddd47f57d84742c07a8000d4ad3fed2dc91f19e6226e7c3fc260e0ed4b23715cd01bf2c2fa59445d8a695bc759d5328c85db7cc6e2566ed0c5758ba2d12c1d285311208e1d4f66caf32afd1619a46e5296f435ff5bb24dd30d060aa462185b4e05afecb2ad221ce615b6867f5fa46599e0a9f3c03555569f4ed86b73a35db18c622b4089ebf31da474873637e4b97aa71ba883368691ed48f8600098b05cbd218c1d4aee55a0e6ac862518a6602328e5dc9f193b0941797e863d6534de6013555f35ad8c32e9264fdee17e927db412e76f06922b36b4c1f5f0d4b998d9c10dc88f3ac0b8ee01b1a88e0b031562510395b9b5a063ae968fe3f87a3bffa2e55a7aab152c50ea8bd0c61682c0f9c0c186c3dd0287c7c5a8f50c2f0c796ad7afe3fb9b45d90e8d2443291947067f982f070643289a117c404124245273fe17aef4c48c1b9377f54e6ecfb43aafae2fe52eea2f2b8aa4fa5a7412c3380723dc99e63c0455736ceb0fdcf1caf6714937c75de252723a7a1b5c7bc5ab1430a8fc44d78467526be8b722e0a49c54e85b6da58e44ab4db4b7d1bd33e28c1aefa462f17caee6b45a6d5df43478f36ee54b1158399a861124a95cc759fbb5bd4572adcabd5073758e0f40d6e733a87cc9a3653dce1b59936d57beddf6b980bb7cdeabaf58d50eea9ad55dcc7af8369bb9ee8af923d4dba981d25efafc2d2352315e367a98e21c6a4065bd95d14ac24cdaca55fa220b37dbf7d201b289178db041df9c3 AD: 0377ed6ab683ea82545de480b5f15d0f948b50dac3b7233676de10bc93f529d5955ac70db7ce9b3f684283275898e74dc028b10623bd0cdaa6ebacc2b0bbb8aaf2e32b4d7d84ced724383443f493ec24948ef43a40bf94c1b97e0036e547eee4c59cc336d4205419d66374ac29cee8b274e1453299611c491f8303d00e0e445337a176f263462d0ea16c297effbc98a0790ace75c3c4965d09a32e38d0ee62c6277131f55abbf9d5c733910eccb8703634720f11429302c772c54ae4e0e2bebde2c251786f67fba677a6d9beba08d3d9436e28ec7d5cf016ba69cf20247ba4443c12ca056d3a11d1065b18a037add77642cb8aedab88117a1bf686b17efb241092ab2a17bc9562247c501479d77d0bb752dc5fbe2a4694d0309e68b885a434bbf2aa87ee6e97aa8fc715d9667977a75b37a42a1f4f27096887498ce460301d9ed2a32146a2000b1878654c85b5ebf2828161e3828e87319b838647f9973b860c6ce9f43cca21933ed4526fbcbe38d0169f60a85f9d84ad662b62bcb1088ffe9350382ba8c2748c79fd76bbf863f9a60b971fb6fa9446a3d0340473 CT: 096e0130b0e57de1c25d51c748ac53ab8eb5f834ca5efcbfb9f9f950393a6bdc9475bc98a224ea22fefa19fb1d9dd5cb06f0bbcc266c78f169dcde51a7864c5a5c5996175b511dd11c6faee4f7afce3c499bea2188dd443c654486ac5a1b4d113e38cc5c2bd730c3ed87696caa6feef8f466a3323679fde56da63048433d78321388125a9a59d8728c40485299fb0a8012dccecfeabbb7a0343d03fcd770c1b5ff13116ba845b90c715403b5b7588094dd554cdcc1a166ed872c75a7719c83e71b9703ee90e4909e18822d5d2e64a851bdc30b2915371903d6748b89af3da42d041d4752fa1b1947ee12c5106404bb6a7a3d47629841da3ca1652666fe15b9ac2ebeba651baed43e6991139f90cd7ad9abbdc89222086da0b9ca7f4e7838fdea61fb815c534a878d7cccae9fc07aba48ba6fa7bd3a3b448e99267eaff2834a2db3084f28685052d2973eb7c74bb319a232eb0e1bef7d2827081310aaf1368656f7c64b1ab1ef3d4197b350154e18595aba352dfcbb7c0187d8ce67a78cdef6af01b3cc7f0f76d8a9de741c87823f1e6e734dc60cae88078e233e4e8a525148a56572d67ddfbbeb9409ac01076b84d9998e2d10ed62e2288f440f5b54fd7a5a1812bca2ffb9319e56b674ea4804ba0f6d92d7aa7a5e1a9f403c3c6fa8dca86ca4149f2d0348150395ffdd382698d0efb7421fe0ef930b5522ffbf122149a5ccb8bb6c3bcaaf935d839b9b820e0f199043105cebb966a6a4e588a99d20d89c61166c257cd6bfa545f0af914416f8fdd53cffc1d99b27b6c3160205c8b71af69cb398b5cf8f72154f612ee0778fca187a574babfcb6a9dd61624f8d6ae247b7c15be83d6cedad267f847a63f58e4ed7136de31126ba114e5bb94e932e3a10be4da821f091ac27b0c3c73d7fa6215bc5b85bf8227f10dc99706644f11c3a0d5ae282477513304c2cbdc1b5dfc6d6314da4b20eaa43a784fb8435c0be578c409291866073c31bb6a210b587ac009ccfc9fcd342e07854fb664b6cab7506d5248f8377314e5fd6dd17ed871ceb5336a5ff7137aa45d211b06a4cb0170ed25838ba8fc1041f516a127c245ccfbed4ccbbff11c0bd557551f86dea82db1f01ab97b9b19a6cf94e405834161421ef056d96f3482b2bda2e TAG: 143dbbcbbcb66c7ef3ac9e730360669d KEY: 58cdc99ac30e78d6238b5478982a2b4c NONCE: e58537a34e5ebc37ea72f321 IN: f9e466031515c45461e66cc0550ac1b38ebd92d448d0745fb0be37eabb926f61facdc5bf3ae52caa0f923bd73c43a22b89902c0a4c43e12364d0286f328e125b8f5c9229fd955b5ccfbbc672275051df701e981e3208cdf832af70fb02325844120b5fc82f4f8981ed70989d78c69ab0ff75ab96c1ed69919859822ff20ab698e25f855cab4f01174c4feacd3b94003fdb1479150f0a9ed35de9dabe3b7c24a56685aafc396fddc9e6f1b35955b485c61f2659039b7254173364a57bc80418e2f6b7ae28dc8cc5402098b79c28806d135ad3d5a5d0503f32338334c9f6e63f29c61000ffa87668239ee2e1b0cd654c78d610509c5b83610b1fa85cec31a533fb329cbf0c543bed9ca26b97df5bb12ef4e6d252dbd955a2693d4903878b569bac70c4562712ee16a7da269d6bba8dd57b54246598e50453f47788a2038e206b4e34ccfd275c6f5f1de5687fce97d5707d8b697278a3e7c1f07ccfb11f23b343c5d8c7c08b1122b36f3286decc760474b6a27646f432e740420981b480ecc2e50bcec71691da9ff95d4351c1637f5348c5fabce63137ba3c82b93e7a187619ce9c2aef21b0e696becb4539fd581481c35255090bcd08de83c0c4d35065208f2d4c0efb7903757d5408d49703dc5e8c94cdb9623741468ec982231849c1423bfa1dfcaf6633afb5997b3353cb42c7e8f99906331322da4c579a43d663ad4f7bf9d9d7bd7c54b65273f08a76181fec9b20fa5b4dab9ef00e0f6660446140d3b07226976843998e94a69e1cfdeec41d7fbf1c1fb576ab99ccedc4f2fbd6d6bcf6227f8a93916c859b37ded15cb9bdd13d399a51784da099dab63a4c0ba22d27aae6177372c05c1e5a833f459caeceb28743db88fd2807f605f7448d9220b79e56a312f06994a0132e43bd47b82e0e858e8d2773a7a518746b094df8a6cc851e6ed7b98ea657188c6936fb4bf0911ccd09a67ae539626b4573e0da5a64a75b0cbc995aa664f4cef75baf574e03cb7b1cd4efb301974fa1270be36a64f55f19890bd21824fd44099c384b45903d5a85fbc785c2bf10542eeccd3ff9004a157396a126516049e26f579e32e51c1e9d8ce32dfefa3e2558f6706d31757161b9c17c8f8365b9ac257071132f8c05cf95b6b8d9b650328b561a08728a8903631efb21a94e7bee60d132 AD: 7840ceed28a572c5186f25462a64b5a93aa35c427594bb5a77d6fd2d8c40d614f5e0bb495a909f3fa2323c248c94715fa52017a2d51c866e81aacf2efd74f40b7457fdf93af32c1211e675a08eb4330f6e24c35f626da6692bd9a13bb18c42e6b2f5c978c431d25be0f38352cdfb5933e9581834c33b70b590fbbe3122a9076e619142e8c698c78f532ad369447843c58df0cb105f8f35d4ed7909ff94a3a2b0ec99be03c29c33372a1b9d8a6ec7c38ddcf4dde9bdcf8f0d63064a5072195002b953b16d2228e71af3938f5402c24e4f34e344c26624519898e0ed1f20980e36bf568b33e332887610d8da5a941a7a1bd8b8fa8795014ffc9688a53b4b9a60f527ce4a737e99624e600de8cefacc246473c9641a1166d6894d71b9552ef3342cd0a7e3b0b65df836c6d8786f34c851ac4c72dadca8e9753a4e6a14deba129f4e442a13e3c82d405f84e281b95afe2cb066a2f49c126ecf9fa440d6f9860fd450f7cdbf5c2fbcb5aa2023755bba1705de94305e5b304af4ae8bbc937c6f477d421f5d72784f9b3c331a1f850c4201c6459270c6271b8bdf00f23389acc7bf4082e7453c9c CT: 9662e1becc3ba86c8edcfb3ee94d3ccf2cd37f7aa1988bd4cb374cb5f3cf4373cbda8c71832fcced0531c35d035fe6de0f0086740a62b07e81b3a0f98fd89f22243a4e2e81263c3d4846a3e54977ce7617702e43adf44783e279b174591fd1fb231f2d5e460a866568c867c8e762716959fdada879c77b7aa613ff15ddae4727cb3a2abf192fb74cd6b1eb5b632953422cae683ec87d6eb69a57c2021232181e8f74883355447643d9fdbf23b00f7ce602bcb1ac3144387610e045049c7cb1bf1babfc18b21ee05da3173bf2a0d8833698e7b3ba5e72996f6dc43db0228c81ce3f1c644090b922bfd72dfc81b60a8378cecd2ce14b9a53a16867476e08bb99f0708477e1c6af6d262f543ba4b3cd5f3309940fb31691b9e50ed2f3159afbe8f3c95a8447af98a76ddf5a531939232273c669231091f15e8f819183d8d13624bbfd6cfb9bf781bc74a9b4ad631de4694e8db879e38508a3b3e26158ae3a897ef6c9ecdc5f64d870964f1d0bd924f2e919e4a3c7ff5beabf589ca4be4093b2a95eddca2f7e09a02d639ba872060d7db147476cc83153f7a5227a1ef58f08dcdf9f821110512424c7e84d62931a73010576f898974cf24f9361d1abb0ea3e84c79925c87544cb11140481fad00dd75581526c0b9d49d74a05398e58d8e94c6c86976dfba9d00440c2bc61aa2de1cb9569bb9c4226c05cf31ecbd4854c2ccc99c1ed9f31a270c0ac57bd43e6c5194f8b2efe49d34095baab0bfe8c3c372b9bb77b974deafa462b08f9e05e027c3ad53a24206eeb5bd4973cad46c0a8157c47ed9ab9d6b0abc571223d4e3c34675f89dc0374da151e2dd6e4dda27479499910a7836a4b638dd32ef7ab1c5712db101aea462c6ea2447f39d38efbf64794c466165723063eec9566f874cff9d6d2e96e51f5c6e0f7349bf4e667e4b3bde503a412a165c8d1381d7024772a273911ddc4186a7c1e9818519d9935cb22452468938fa0321c1bdad488dfa0601680e06404b0533ef7a8bdd0c00fea49fda059f2deb7504fcbf980e13d6c67b0bc3960ede0fde107fc571304a87fb19ceab00ec6cf4e0087b5365e8d43cb08c256de2300b565474076826f381182e6d2e0e9d77be0bcf58ca80f4faa685435604637cd6fc65366dc46d92ca0fb569a5a9b6440e089cd1d8522b20a42 TAG: 6def2aab9f94f8ceed77295e25f81309 KEY: 283d86e8371cf7b34cc9988005575c8e NONCE: 98ad34184dac039f04f84e5e IN: 8ffea351a3e1a51221abcabf06f7aeb97525b07dd8cdc21b71c97132f3f6f41e5e01c97955f4d67793e8f1cc5910a264efa8384696969680de914bd1acc9c7e9a278ccadcf8c6a49877acf2ea3f7e5066285672bca4dca1583e0a60b82b18fa564c5a7b08a2a0dccb9170602c9f7cfef98024267553955cfea077cb646f2b564caf529a5b34b83d8a16f30e2ff3905106e224444287f3ef98a9e12cf2e3e04a7a42ca30e6116834c169f0778cfad274d43d969dc100b9e1a810346d8ab715670fac2e647829bf3b56f2b7e26bbf025e74a3e9af4930e182205fc09e9fdf1a2ea0da9aa5cdc21a41d191b8fc189ee5ba00a744acb351cd869cebac760b315e60756112bd20239203ace94bc29b232ac9cb361e5b7aea891b5827869112cde2b0e2493fc0c88fa72e92532ff7ba77d5ffa865e47893a7452f0a4b44092caf70e02d344447b7dfede0aeffda018f898a8872c6ce3102ebca9e933fcaf22b5c855f620b240c31acdabfb7fbf109d2e9604b465abf43d64b6a010ab928722119625bc046c4489a95628612995957c75510d896ad2365603e6682558c185eec6749c983be4ae29a8a66728cb39eb5e95e7f7a459bae5cab7e75c587689a223f2533c28d44134b87f22e964e73c030782c8ac4ecb2a62e3890d0d96116a4a3d3aa340783e10a46d099d601a8ece1938a640c1d12b88ca4ff89f1ecc75f46a736b7a4143b671f3fc531b5cb08c3ee7c02e606097b0191605d9ca3099c6707c590c678c8ed7a3471aea52fefc7f56a736cb6675e004298903b43a357c28ea4f59ae0894a8ee0876f347682403eb4d45881e04258eefa1cae28f5a646e3f91cc08a935cd464f7edc1721f5b4e389f94d141ca4231573886c40b7df4e5779fc52daff710ce9cd40fb4dd32e92250592199696a13e742ce90aa6280275ee8c0eaf40c884bd846697c43fcd7221cba4f98b03a6584f4792e8bc16c2029cee9b4e80c5f1c91eb798345b10def038cef2f1246fd148cfd2e39042228726cb18029b2e38e570611aa75c72e6cdd5110a7ed6f5e5bcf1d1ca5e1b67462b36cebebcf6e21df8168177afcd1a31a9e498bf7da8586717ca491292b0df81bdeea3a1789bfe70b489b1d4e1ce52dff5cb7e71c009d6888b152c644b959036b0667e8a6471d9f4eb559d0fa3854fa6f80288a03ac298a31f69168eceb6fa8434 AD: 73cea023d2c6afdb625b6411ff8fdd9cf47bae5c529c6022638e9bf385cac0b72a046efe306c3463df27276fd63c88b771f84cc9a8bd3be7ea05df941502d7a437ef4a3ea22b2e4ab8509904f352b83cc3865c489bddc6340bba4f2b4c382744467a3ce3896bfa9a0a6a4f8d6beba39613df508c29b074f9f68e8723f2c2fe02a5dcf68965227059e2b1dd75bbe2b80f963cf501d5c73663204490fb843a3793c585769ee10b764077b70654dcc7b9b3fbe7f4b146ca8c6b8e164774ac3421fc2969445f77b77cf63ff50f04e2439895121f1b9c4941b7cadf3a92101cd9d4ec6a07d70d2742e6b3b87981e992c549691a82e250c0fab11bdc287ec357f182a6c2244db8b39a0cae9cccfd1fb32de73901ba3e695574477c37b66d170ecf64130df3cd94049bf9b3cb388907f3dd9389c71c344058b30091eee2fe06f6be3eb7ab6b7e269d2f33431a51d30a39ea8b280571565701dc1c048f07f4b5f9e04a8dc4555e28919acfca9caf597a394120794b6a09aedf866271998401397a4e8e11a25a061878f624f78c321bbe8149bb60887735fb3c0d96dd7f022cef066afda0ec9cf4e41a82c4beb6cb29715e CT: e8df4f21bb8d95211c75b194c30b1f3816715a063b202f8db645da8b826fb45e9af541ca9cbdc7c383d4b5179707f6665f8b2a74c5026243c3c5d9c32e6d309892323440ac0d945875c2665a60be211981d5dcf46a211a4e7b58e0062dc43b87ad3a9c52751f649c2fec404b9f858f4cb3ac9b534c850a8994f26136eb70e90ac44f623aa3bd362069d32a85c65292455946df893376868cfe3b06ef638e56c7defb9b4f0a162bdc8aed6a023836ecc08ed826ae9b818f3db6501ebbf3035159b6341ae703512a8fb8fc3ac0140c3ccfb1ced1ea4b7ff545ef63f76010acd708778d0424b770ffd36f2ddb6009ce5dcc498a9bb8eaec3fbbefc39da3da2f7f07470d051837398160c1c85ac695a519358feb3af9274fd3f6b1d936eb400e0bc5ffcf44ee9c78c730e4f449a008dcc912b6f9fd5d17f5d6dac025be318d5aae77b8858c1effcade42dd360e13b13f35baa64d37535a0ec8cd3a73d0c175be0246da3722db1b64f750c51d6e8da7db1ba8891fb688294124c989cf7d14108ab90a968f0729b6d7c6cc777e470e946b0fdc7b6dabfc6dd7be52b51ba1849cfce2ef2ca70c4a51523a1b0410e8a1a8e1cbfe7f1eb3fe456da81b4de6fb15ae13a39fb5b1c2b4aa9857543c3fb240965578f6b27ab7c69f74af7ec068e8c9238dd4848bf2345ab153730dfa9d1f57060e3e5f88a351f83cc78bab6149bc093ce2b29c706cbf85d35ad1c036d2103c89f1401f4f383d9345759a7be3f72da2eeab56564d98e2514d99192d82ba37ff5ef49a8770712c41e74c08227e3a2f9b516904ecc23c8368e3b46133094121209d57be76dbfee3ea7dc3240bbf1bace4369b09ed97a9080a3dfd93887152d1c03aa267ddbd97568b0538879c8970a62a4cb016e7e80b47bb21645d6a57f9ddb080551a9ca9cdd4fd0cc575bdeaa013150a8a04d05f3ccd19ab0979c9fda569e362f6bdd4b67268a88d88d0fcb9d68c47a0df0bb64048baa0554cf2b0cb4c27bfc0ce8d4a35113aa30ba03f88c73695a5d6c3495b5a15ba407ad75bab597a46170594beb34b7966d6bc7dc4ec2611cc15dd60c475c7d7b1f0922931d00dc93bce697dd4a4f72066d64b1aba029129d3a26c5ed44d19df383802733ca71de86e0a2f8d0ab04307d1a8da7c6f3dbe509fe29935bfc2c09712cd35c229e495ab3b80a447a168d044d163ae TAG: 05b8694f3ab53f8a0763d0c0a1c5a64a KEY: 6611562d15bc2b910f4edcc981c457c0 NONCE: c20bd2710668b59242f7547d IN: 2202864ae65d2cafe5775f3025eda387030e910075e3664006c28969808975b9a72c905c86415833a1d1d86b8297aab682420a036208839f9e811a6a68b5bfcd01c7310e4b05f5f77ba1dc08f18e57a2044b20ce84acba0450b9b8ddb378d0135f779b1286948985ddf57a7954cc1f21252a06270ae34adb052c124787ed72511f4dde5ab0a708df4b307a9cd392160ce24119be4eef4af0025ca4047b07593293fc17889932588fbb67e72382f8ae826eb9f0e4b866f683814adb2407353c851f64475da9f740f71ccd7176d3d970d8618febf5ade20dcf51918e8a08e57cc4c4278565f6c2780c68e43970968ad018f3d04fa375aaaa5cf10f1cf11cf203ab299fc270ac41a19929f831beb3a3221a429059dbd4a00bcf55768a9f89fb35c8c911698edcf59ba3c2398801401e0e0949dbf587509d9bbfcce3a8bf5023bd751811d25de25693a43f14b01011d6030fc0d3017bdf8be8c84a7c088e0c09048b88cf0ec74181eb904b91919947c57933e5e5ed9b46550c951113e8e2a0e06efe5fd5b4d182e33738ffd16f571cb126cadf79dbab4f307e86eed9d3e2f3edda6b76234b7b80f7dd2815963274fb85d776bce13fbc60f1db9199c3e1158815c15b4d1858dc66053fdd4c128397972cb9ec05c87d16f53ce5bddede8ee959b5af5f8955b9cc11a26e53b9b42855cd11b570ae35d85e1877264c949e27c6ca797f77c0e5afa40d0f2a08881820b88f85bcc59edd24963771e9357f66f874c11a684f7987d876412f3cdbd7b9b3a26008d551732d9964deaef66cf4692507fde97239f15e2caf990f59a62693d0e723a50286e20cd347e6b98774805615100f599f6f85a5370af468b41633b85cdd8bcc7236296c50a530bd238ca0ce520e8a29f8ebbe27760eefa1ec14f91d6b751b30bf67cdc762486550793b4663dc38f378bc36eaaf157ed6846641a7fdd07ea45fb1342fe04d700ccb0bc9acda5eb00fbfb4aa3540fd675364c0f8f119df2de15ec2a816e76248c11b9c3e7769f98ee8d4cba3a525168e187df2f548a940e097805d735109d8ccb6119fc366caa17cb46be148d406a770a24067cc9c8c40bca0b544458b47d0ce451e4a4eb9c23716666a965ff26287823a699739e5a6ea844cbb5dbc111473d88d611b906fdbf51e86c5a90a68f97e334b7b8c13178f9678888cf894bbae601f4d3869d6fe444db9b35aed803549b72fa399 AD: 26a47e0b75a771783631e6ba553a0aaeedb236216bff95050ad4b259ed60c071e1db318c1df201f2eefd8e73d66aae5835fe869503783504d803ad07f2989abec14a443e3e935684336a437c83d0c95ce9759d995e2cc454706d24b810fee5e32f4120aab927911f7bf11a7d0f2150b1ca4ce7f216403f3a7d622887675278a748d2523af6305c9979deac0da24f4397f57f38c8a860413d6ab4581d48e70b4113aa1a963b3a97b4c4a599be2afebab197e5e41d148b65ad2488af0fb9cdc59222a52ebe6a0ada339bd8b8c0195fba21d46c12d57eb7b98ba85fc494863645b0b32d9b8b4391436e887f6b481d849c2c5f6afe5496626c267a3982daba9af1a16400cf81bad5c1398d605308427340118734e476d808338de39e08549482a24729190041a303f61c4928ffd7a3bb2b46c92aab059c8ac1dc4affe52c6e2d3d55ce623716855934e80d3d401bf4532505c21ac85b738797d08d69e424e521b479f407c7822e5e408247251538a6c31bcc7fa0484dd8a40ad34f0fb66666e143193c9cad455012c3345953ef63b13b3b2469322b7094e8140487c76761733025bac8d71c3f406b0cebc28c499bddaa34ee6c03a82a52e4 CT: 57d4e97b3ec3681ea9dd4fc9ad0aac302b477f081ea56e613c53b9cb9cc467a2042657905b7a5b308bbff6803d33c1e4671d126ecbbcf6739842ec4d552d377dcd25b9089d96d284118ebafd0cf8fc097c35124d900cd69a2fc1f97fe3cb69c6648aa069eec68893ef2d4d8820ffae86677fcaefc50b64c4b53c9f591a0f6a3320afc569b6eb7637e5ca07c2aabc26f85521837f0e3a6435ef5cf9d2ccf4edecc5e0984601f88023f6199456e965457e638c1d6ea87f5041d10c187eaf4dbcd0cbd6e6ecd6043629819af18635caaefe6b0535d8fbacb59a00f4c0bfa8711d32131003a051eabc95c0e7119e0ba819022cd01590edcfaa7543dfd2809768b1e03ba070db5f1cf726d425a6f623d83c454c78118a6dc32ee47528979f6d478a58ee75bedc95e9e74fcbb96fae77353e6f9c8be5727250748627d3187f9408eb131efd62a90a19bb2b19b3b3a478518e49d98609116bdb9b7de7777c8f0bbfdb2d1a9c4788d81fcb548ed51d1be85a603c1744792163bd18aac3d7f20e97e32f806e7a049d3f51384e324055bfd57c5116e48007077e295e0f3d3edbc6f4be1b08d42533327ae6c7464cc45ed184912c1624caec44a0958fbdab3a2a9eb13a6e6e4ac98e40979f4ae4fd7a8560b623bfcc326435df878d643f394d177013f737fbd4971f734876d515a4f2c71fee5a36a632c93095674310a60809240fe03d7c1584a446d536fb6316c9354bd007a4de1b12e155ea6216790ab5694268081f0df280f6402373a50e2d2da82d7399ab88fc9020109e93716fd3b7d83b14bac73e37a60ea805aabc557774c26c3ff906d5946514e222747fe6962500f90765702fa16d7490d9255d74dcc2c097dfac75e9f7f8c090f4d8e8cdcf4449bf5f7d45988f363e4751ffc24cca95d120714c2db59277837ea38e3b385d7d3811bc4fb755e6cd29919654bf3dea7bbe3375bef1a20cc55170ff514522886fa4716d6f99bfbe5801d1f93ce5bf82fee322e54ae1a2342659dbbdea49ff1b20274ce3dd2220945e5142f3152b4c9fc88dec89762b773ea1c87643ebf52b6f6f5f26bc1b8fbd459ef011033f3611646b50ed0b43bcfe2716dc780b8b5757d199e26657aa870fb149bd3f44db61f07a2692ab06ad8e30d40e8f6eaf4daf6a637c38a9e415b73b0bec06eba1a7e5b34d141244eaac717339b6ab052286bfc083ddbfd4ed0a70942bdf73f81b08ac TAG: a7bf4e198482bf1ddb65779e97c2fd2e KEY: 8a7302e5e5e5a3f660bd83aedbf1e2a8 NONCE: 8ca05db202082d8a59d11b14 IN: f6accb8d8d24709709210cea12a34265c3ce7efd84dc8ca309f44016d13ff653f253d33d180cdeeaab7370808e1b8b9138172fd96dac39588ceda91c4208a3707f90f2f336a2cdc1ff3fa7aabf010776833fcfe43c3bf19e9a480495064ad435d3072ce131283d38937301b29d0a063c3bf04ad6664f063462aaa39f1123a010d6f20487a6b12ea1500abfb655a21a4b3eccea51368722f105f94f642765e7765e71199ec5b59c2db6eca6ba9d6150c2e7efb8635493d19953f9485c7e49f24efd2c68d18b1302da88d8bdd26fc7eb6a1abdea09907c02bcd80fd1da76800f18673f88922ddc6eb0740bca0b70f7d1e6ffcaf017421322c2945b155f582cac5d6ae6d4e5411ab895b953a2eadc3224c4dfa1d8f9fa592c123c2d5e1d449c92276dc21711b101bd40865822bb622dd90d6c66becaea70fe9f914032ffa17dbbe16c0681c9359a9b156314618f887486974951cedc90dfe9c04aa845d3f4b4dbb60b2e3271c456487045133c240b9c415124dcbb57671374eb27625e2697021c71f5f51237def9d88fc2181b6bac76eeeaec365ce443fcee15650150e57f92116bf9c3b52f03b09fe4827b876bfa3c3d7b84afd90972dcabaa971b625fe750cc04188436bc374689249454a4e54a70f2f8adc56af2be48217575460fad76faa4ed3b74f1cb6d3fdf8ca28723057c75ff1e8a74f9da266e9c594fb6c921b9995c926bca308124494c868fa6739f4a6ac663db6312ae34ef43ba21a122deef296cd77452843649ed67a99103e1aa77aa23a3e41ddce3b9fc80e13b1875f31eab3f75f89ded007be22d438d4564fdbced99cd49b372b81b49914595d1ac5d531b0dfc38c6ee18206e44d1c1e25fbc1c027a152ebcd22a6f909178fead243083b4f885ac2af83863c0ad73921098519b56c81e29dbabb7647818aad5a8bd0e09793d6aee040bc9cecccb7e69712e5317ab75a68085ffa0411f82e385377bf1486d5d61dd543ffb20758d3f9bf04a5f97131079ee01a13878ef0c7f466e8f91e9bdea970eccd28d552f8a5f110fec1ff3749e282cd45c1caa6d06e8c426bc28b2a5797407f885b176534ada9720f0d8ff65d40b4f4589bbec0a1620172941e5f0f42d44283358f2cbd0a4abebeb346d01178f46be79a1551e0dfe1dfcaa0c305cf5daef3090c2321dafb6de0481c00df6937590165bb817fa26696ef7a8128ca03a7eb4a199edccfd4bc1d653ea8501d1f9f9dd6c92252e2eebc2 AD: 343a402e3efdf91f7d63416068044d204c941276faa61238721f7049662f3721f8d04c908cbb612fbfed2b050efdd69e018be0f463c3e089a063d7b5d9a2ac4eb3bf63599597e714c917c004804a689b2c2ec187b73a38d60d9edb3be9f99d3b452813a3fcad782ccad3bb63c89d4abd18450f61bc94314d9395415503724791a22d1af865d3d5f5296411b6d54bdc0e7ae878447228b2f21cc7ad624a69d56a3694e1a383e7049ab75bdd479ab122d2a50e595fe370041e8a5d9e28dc3b266bcc40b9d54cda53d4049b62feced54620ae0d6cc3c74de3a5bad614f1d8d0c6a74674c9071b8c0b96352c774c034ed7fdc3b8790c43e6b7be8c227fc2b78a381215d97bfa3274e3b52187fbbdf68efee0aa66d2f2da263a0dde580ff19cdeb2c29a6392502f589ca7739e8f8f585791a3f77c1968bed4a713fc5b94e8d3c6830c19291f9cd846ecca2bc05bf262aac54bc45409c2a064c3de28e79831c32f5ec4bcce979b885c9facb99d0c54484154d545ae67d4afaeb545b5aa5541dd0af3416381cbe075cceb49820ad0d52f68c31875169c126b6b1047d63fea674a0420ac808e2ac64adbb8412f8d03a6a5cea014c835b57267cc4ceeb10191df466423 CT: 18e79588195948d25b9beea1b2d1f990e7b87368d4af8c88e6f928f375d98bff2ce973c1e5ac525e1f08fe6e7c29a976181cb5a2a0cf40e3bb24881bcc5391f9c129daeb6c85c5cd8bc1f47f9f92bd25f4b5fb474f7c0b49828dbace32f5f9bfd968cf3871cc4072252f5b600d88a857b4c86c85ace62e56aade90109a118e9813e984dd3027fa4ff6162421e3abd22eb6246c1f9328d85ea7004ea3259fa355031c660c0880893705aa7d672996107fd46c7e6f7ea2d455fd8183a40d41ccb0d50ba627b483f8ec6fc3713010a73dd52053e033a26e5a0daf7bfe3fce8858e63e18ef1201644dc0cea8e723a24e7558ee33e904a0489c3daceac911d2aa83a63f893aa6516f343aec8a9e46c869b38f10d4ba7c4875ad3b092be565669ccdf8370ffaf7c1efddc33f67e5751668f3d75b619369c863c7d3f24b052a46af2fe66a9dea52e2c36dcdc7ed8093d0244179ab7af3c73942e63827e4b301cbc0bc2c1bec14d690e8af1f5c72270f71693d0fd9c065d9267be22d647728d39737761fc46b0a01f98b5a304325ea8967f6983dcfdf9ae87c224fc71bd9a1aec353b28208786124269dd56519e4b0cb058975ebc9803e35cf6d38824b93c78db05f2fd2797af1acbef3c2a74737e15f9d2c8f3b8e6e964043ef53f4ae5a58825fcfb1b525e38ba542836090c5a663a370e9762c89893028572b08fb0005529d44936763486307267e4095a05ea8895de7c20965974b20784c57a175dc71ea738121b24e96e3ff1e7d583894324e17207bd0a72b0baa89987b6884c6133bb3320c35ea3033dbb7051f89000977f055f3a7f1c38ddd0808ce5eccf615532f1fa4fcedf772bc7423209b3eb98de47371b382c72fd8aae5005f42a31126e14317703083b5f83dbe9d61778e221da54899e81f936a9973f0f5cc6aad85aa831071959b307278d085fc830cc6085f5701879aef6736df39a6555fe3546779284f618860924fb02567bda44dc97a4f1277e40171218fd1569ddaf68c4f58697232abcdfa6cde9bf44dc39b0a3e000dc89c7cf8298a5576a57c7047f2103a1dc31ce8267d879d15c41f23addf662f8fa49661669edc1ec06ab426591b406def208ca2854210e9647d9ea5d4bca84c5a687e9f3238fbd7288774f72d947e85ee26094ddbeaca7e135379f678a13aa866a14fd4e9d63de6d33f01e9a668bc3e4a238b9920df22db04ebd5447857422dbc16200144fd306062f605bf9138f817 TAG: 0b8c9441aae6ac2cea3cbb71a0ac7683 KEY: 44f4f7c9ef9a5fae05c10b2e7ac41afd NONCE: 55e84c213e1d5f58f4c7aae4 IN: f0b16170b11b798e138354821fae367a2c17638f1c7d96e343014410c4b4c47a620f79624dd7f3a8de28fccfa365ea904e2aa625a7f3453bdcc990c5bb2d6b0b972bf3349e15497d71349e495c1116f2dfd9adcba45b1a4473566d8eefb1b68054aa7274d4e0ee81f8e61be7adf3c0409176f0b566d8631425835d1f4dba59e7c0d14bbec2ba93c6413fcbc3649b8886cfa6efdd27b8187f1912d17776c7508a54999718de52351352194a81b2b0cd83a5d16348f2e39f22d833985882cd9fd27c1ace4f75a28bc48ac2da52dddfcc4fe428e3f46908d68accd60a17f65e678fa55537afd06fbabddd56ea1574b50d93dc76d56b04e05629e2bc98021ef9107ed8770ae00f1ff294f57edb583b4b361bcc6afe3c545c14adf343f2d019a283e9ecee5505ce2c70206924d63c8b574c798ae0970547c1114f2f82af5a6bd4c1a33c9cb49fb126117d06a63375ff67f7091e6128eebb98cd43a698e3f441e80203262b47c82a65d9d35826794b6f647badcbfff169c53fb70c151dd0c57234dc522d47b4b8470652a86ac09b7dbc44ce8a90a0a2a9fce1b70c1a54cdf59015b89de2331253f682257a0db5c6ed9e12ed5a54101524647847ad87fa961ca6276eb05a355fb14a77735c930fa47cc66887bb687b20c7518dbd9af90e13cfe622e9b0036979b9cd9336da11e88a189ac81581e7d85c2fb1fe3aeb32629e23deb168db993fadaa37b1fec1224188d4f50ee3b8f9ab567b8baf1e3a3d8bf807edba9045338ca14d26fcbabbe7d8a5a1ac02d7c407c17a541fb41004f199262ffd72c3d0deea8296a08af1fd7506e7b72f18a7d322e4116021bfd44dfdd4f6dff5b772ee32f49e098445e68b3a2cb58832d20486d5aeee424752b237d46f1cf8194f7a46459767d1a104f6d35a9616eb47208b8894d998a51519d514b689ac3ca19fdb1efabd1dd33cd4298ae4d0ff819e78480ab7867b2f4868db26c9604323edd258c4f6c977fc4d1398e3ba6300c37a9a13838ea9c5eb18ee193c3566ddf3853fffc0ac665cb952bf76cd2d35106b934f5f8da9aa6672e8f9559777ca7a56592fa536e8cb7be5821961e740483563e6ae2de1b98749752314cebc390beebd4d269f0deb0ca3156bfbf6973da50b8e4dc4eb2a03ee0bfe73f21b3b0f2716a4662a71e8cb04ab44f52ac930eef1895b57151175727f81fa074a8e5366d5b7449185e4829f32487920261a84a5458cde6565e41daec0b05d1e46a6a34858d546eea8258a399ed89a5168b8e6 AD: c75f25ac1087b315ab57ea5e8e39f743a826b70e584c4bfb2bec961b6769e2b92151cc1a0d8bfc27a9d5d9c7b43c51019418bb19fa882e53fa0f59d6761ff7ca75cf098f613086f9403a8a66b07bd1fde46c5316403de21d4f839a2e67bfecc2f3bc9c8f28b455f0fdb75f28a18852e6e44184e5c104a2dd2e21f429b46004a595ee8e2b008c2e0c31c12a05bb9de15011003d43c342330f5852bd3ebfb7bc4adec6fd7e3d77c1534e0eec7e2fade24d89fe42dd9d8b5bff5ad4f5f8f010ec0903b42048e8ba6f4b9274c6364d0119c718e6d038ed716b21b7f2297317e3869767a2b841505ae4aea6dca5e2b2813868faabd7a299061148f69b0ccaf4a555cb728b562bed9f66fc8d60be4c48c60504afadb1593078c36d54bc878a6a981ef283bab6f4ef6128f78a594b3caa6774a8e6246ca32e84a95ea5774b7c76599e1cf25b68210c2c52f465e3ecbcb91d609f211c12a737936d84551ceb0eaf37f92152f6e93918f4a19bfd09f16518004897d9f0728e9c1bc901fa85f8fcf77bc59c2f96ada344fb9a20890b74520a99e9241d9091742def14a46c524e2c494aa57c1dbafb8feec5d71247a6ac10db9ee768bd2f7cfe1f6da9fca9aab42da2b8e0db CT: 4e009626a3c4e6ee3a4b55ba06416193a63584551b8d4ed1e88f2b83f549129f329780515703fd0ef24a1039ade05d2dc4a25eb47a3e134579bfd6087b5c0feb9aa9d82e89706658eb54170c992411875bbe176dd0d25c06c2e58cee97e5444a1328b927a3616c32bae60cd8a28a58c35f7aeafc891ae5285759b24fa4b2cb59aa4263a864b89f14316181a5b8e654408eaf85f87b71ac0d14fa023a12cf4c18bbbbed4c0dcd5a93669183a56e3947b9cb72019cdc810af9df3ea68ce836f8a2a80074de9e8e444ac0e7982e0c029926c3ae96fa84711ee5c42ac6528648664deed439d7d7de9c6b207d9ad0f434c59f69690ee14b21c9e1827fd873d51cd2e377fac049d8d59219945de18e262f389709a291fcbcc491b2146ee372882efc0b48fb47c767bf0709cd5450c79948c2f35d1ac0c92ecdf9c338c1d80e5a7e7c9a2cabc78edc331fab75feaeb2e91be109bad562f2d7262be42fcb5bdad42736b9c94a1d5bb2f2d0a3e347b565ff59325a67bf074874639270ee8ea7260bbb7ffb018b88cb61c0f4b476111a6f317dfd7d0f8b9347227b9a260474a448abe10ca0a9615b2eb1708d07b3157f0cb641768ef759512b9d52c86b49925720335ab843db61b9a020cf95afadfd48bc739966d7b13148cd1bd426914700486568dfc1942c6bfcaec6eb4a47ff1531f4a3efdc57ef5c6945f009851925acc31551afad8dbde7d349e43101043af62aafaeb5cf67b6642c9c928a6feb55390a49e019af97b137375245794d794d72a2657f0400954676212428a10c8b75d9d0d64b0d23dec4c7efe5ba1e599f4ef051a050943ba517cf6b6ec438aea973509d1919b903cbcf551f4f2e328cba5b55dd9a5d03eb9e471d63e5ac422c47941d9fd7a27d00c6779ca609ba3dd58c0412e7e4b0740ac9064a6ed4d024918debd342acd03c7be1a6e7c49fea94f0069b19c363095b9ec9b7fbafeae5ff1fa68ae47db3641dd98b7a6d921843707f1795e610198df9b86ea45efdb5ba3fcd37737a06881300733a0a4f1558d562577dcefa0a9e76d17fb3d80385b442f1c07a381bbda05b5854c9c76c10d2c4ffe6e8c808309474ec30d88632a794be4e7002ab9d16eac7e5155b3944089bd482009722150e0e06ed0ec3df814b5fa516bfa019f3064b78ee714a03608167374ab4a290bccc10c76b247086c31f9b4de06d001fcc7158fba4569b71b6774a46a3c1f7f80d00ea315433156fa587ae49204be74d06a949e60867b3d5d38c93eabc1fbf TAG: a6f01e3b9b29802f017892ef0080642e KEY: c3e4bd36e2de49d855196d82175ac395 NONCE: 16571d209cd5a8579b05fbb0 IN: bee133dc3379bf7894511cf88ca955f3ba1f794ed7abb0771d9d319b4f4db940963fdab1e831ae6d5c6daa96c44f3c2ce6fe2772d665a212d3203a593f412a557613d4e465b5eef977a2b62490e28aafdb716e7be6d040f731409c54e4bb38989349d842984116baf0502d21c910ac86e3046e6753b9f8771fec297eba18ed382b17fb1ef0eb20052d36080ae162e9b8dcf67e7e3d2add03d752f612b94ebf4c5b0f242a39acb092e32fd044b8e9ddc6abd0d10985c3b25ca4c9ba476d4fa55766f416d5d1cca614bd1d153432ce59e82a3a86b6fe830e1c0f9e64dbdcbe0457ce90464dbe56d2cf66a7eb6f43760e04a784466dbf7b153b2b96439db92180103df8f4fabb5734bfd661bf8faef2b400102229a9895fbeb1f89e6da6c82b5201055264fed0089eec72892c10fb2ffb4928cfa8df0d2c6680a5299899d521d43972ab8ddd613e074d60fd27a061ff821e8c410cc6a019cc0279f602582b752df3877915fbf14de225bdc2ab1fb177fa1724883b523faabe7e7da1d697f081447c406ee8a2c1a9f23cfcdba8fc0be440f2aae9f6fa5c35c54e7003254734947fb7e1abe7f8040289307d31bd6fe8e862a2d9dd3febe9073e1a183a740755059b92b0e8d8a66f5904f1470d3b04d98ed4a62b90245767507e54ca11afcd113960568c916381caf4c963c1d8e9aa4c7ea0ea5aff12af63caa8a5e1f128e70f3c1387b50757e43ebd3e7ef2de43809f781cd733193daa2eaa5dfa0c8b161e9e4480d92df163c2619b571f42ebd706d48a6693d4a5071733544d2d4fc771d7fd97941f83c920673f0b8d82dff24402a14ae971000c5c8747b9a10d32d622b2b1c3aac7cf9804be165d3d8c46d2b69bbd059bfcbc1f23dcac4bf5eb5fa92dc93a7f3b2199cee31bf2c0414fa2ffef1ea34ef109cf4e171460aec158118e3bb3a0a8a18ba60e48f890add45f3fd3193a47611baa3abd36f1069ad52ea464c10f5cb49ba753e43f9a0d1d9bb038e8d450c41491cb350be288aa2f95a479ea3868a4ce1f3265e186fb6c4f54e57f285576c6f700d9cf035d296d4519c6e31693f5e0b6437383c77bb2d235c0d5404a82515115cd260cabef6f2f020bfd20d2ee21566def190d0a6a76bfa14874565f99738fb0863054b4f0c3624b68447358da5bc47f195bb468703da3ead51cf02ea001c57608ca98328068212406b9f3821e98b7481860dc5d9533f2afb7f74b9144363e6f54032c98345399a0547e21cf8509a0214ff0e5cb956130d03617e50f59e300a0ef211b4150e3e040d46d24 AD: 29ff2b38d4e35a3c0035f9d3eb509dcce14170381d68de8fb8f0d6463a2cd293ce08c958e186031a942315977a1ec5ff66e47bec07bfdaacf844fd2c4fa939c5a8b1f3fb489f25ca7b10d87a7cb6d5ff299a57a1b8c6c78b429dae9e9b1c1cec8e14cc3bc2119df31d75e9e5e3df7b368cf4a6ec4b324500d428ddfda32e2f330fe089494502251392e554599451e4ffca96fcfa6ccbcb50828840c98266a10de53f0f8bbdbe21dee0861224aac7713d8a93979043d1550895e06e1848565f5f6bcfac2faa3eb21b423215cb39564b8138b00a15be5392ef1ff451da000186d9807c48a98e2ec6b7e045a139902b920c5ce782b111b8bd44596a7ac8f468a6b718cb7679d5d420f28510505a52004c412e6489f586d302939f3e007e320a0de6cf9d4ad38cdc3c852907cf7a1a083117bdf3e1bc4300befa1180f4c019faa73bf31c43bea814990cdd01b17b167f21b5de9541aecf6bead4bdcaca96fa390aaf6850a54a4293ac4460de361b3d58d5eadeecc6b5dfb57a36215d03c85a4805ee8af03df7627d42479357724349343862c960061c33abf5a9a8dbc2d562f3738f2ce34d68340707da09f78ba191e230521c0ff28c3c285075832c00e326c842296e6a4ac56946f42483 CT: 9debc22195c3c01c571b369ac186ea10068cf99ae63fcc98c40ec69b3a04503c783cde85be74648786d5a7fe51c74f821992c0a0cdae23f4ed7318a42a6230f7c31045faeb40e880046d6e6bec6857a1e618fb360363872047781c05c38ddd8363c923762e4591f6a906d47e6d74ce365d36e41a3a6efe6e9dcba165a0c081fda577c01eafb1f83d116270c5e467dc7346647b9c0bb1e3b1da43b9cfd5a0f4cb0d3deaab5f3fe8401665fcfe742e686de8c050e8fdf7f594ee4b6c74ed0b210d92ef26e45da5a390f9290643a77b57af4800b25eb4f3ecd45e5eae5aa0dd37097bf24dfc0d1b7315d1787356e84e819de3e099f6bcdd3a269b2001d1da51681f14069ce8375d2f6b543e6fe0e9ceef03119ad96683ac884ca852fb0f88d41102f275d5040bd7f237a123d7a7b7d186d77b2a64b54568b11e70be4cd22324fcb072bd6f59d2a1da48a720feca38f8c164b9f6fc187c0a7bef39e4243aeb8c5d87d460dd9288e3de113250738faa5e82b2b4e672fce93f5294f81716aa8a5fcd43565db4b580ed18e41577fe2bf2c62518c1d4d4c324ae26a65a4bab6e5edfbb98a8eca18b34206705bfb7377c06dce7fed8e76b17c0cd2f061a77900d970594d36bcb15a92d2a09d54806d031c98942cecc0ed7f72c92df73b14740e661de31fdcfbc36f8fc89164b7614c505ce3b909376e827c857cf2b0ef3df86683aadad3112ba20126b36c5bc2c121737fbbbaa14165d511d50612c8d3946c5fd8e1a257a5c7f684dbd3b160d849b7172f4648c935c08d38733792a171cf20ed4b2bcaf98e39d09675b5918e5fe12b4e2be36e4b8463bfe708669c1d01a625d4f572e9f30a5c88d05494711e673c3d23b1003e94d4a75b9477395e8a16944ef0a1726d0388fdbbbed94faa5e78deb16ec471ed75d92772a4e437fa49af393ceaff5606aca86769c860864f62eb9c5801eae1d1fdc79654ed09f2b858718c48f05968a7a09b834c1ab0f31231795d0efe8394b3302fc0f75ac9e7c18e21abbaf6054f7442dd235451d3b884cfa25f6b7018fb18c2bfd5bb0e6d0075c2eb4f9002e30fc7d420268bad52dd916be28663a8ea3b2a0bbe653256314acebec85c7e5d2c1c163b0a15aba1cb8da585c83016d4c3f1c0aed13c20a9539438eef3a426565cd8040b2918d154e689d871a55f19b505ff94f3042b3e7466e21585800952004906abb3d13414134008c7ce1def619eea9cb22f3a44ba7070035d4cfc1d5bffa9e31b6390b4d1da2c76bf687b9bdf899fd23ce6921fa93a47e4156a514 TAG: 232db78e53f788a11aac05af1041dfc0 KEY: 64f49aea2a19ccab66841c438df5ff78 NONCE: 34ccad859bfdd89fa9af0b99 IN: 214eddb37dbfdefd2a3127354843f6b545f729391e0d19089255c9e0aa9bc0da87d001445c7d80393d1885f759fa8211231a50d1840e7d145899937ea7af1a3b963493fecd40448383706a33337ded7c51b4fc118a1ac975a4071f26a9a30a0976f369ae3a9724b05cbe75fedf84fd1bb6e77e07a76ceca71d5c035e61181c50e2dc976fbc64e1f4f9e6e12856bd3597b475f0b6a94e559477599a51bef1fb3a45106fcf0ca0468117274ee4e3f3f489e3a4ff9f6279e18c38928a00976464431227ade20b45c509675619ccedb4f0b24c2ffefd72b3fdbb3ccfffc26da5945a3906c8824d17a930633f8208d6d1564d5a69c4887812d91ebfd18d482470220a338de30b9cd7945a93460ffaaf686a31621c86b4620bd24776a54db32bed6809270ee19460c34bfe99c7fd18c5d7e9616efb6a156d4b28a0823df5a858a096ec388e2fde49a2c8c071fea73a23dc4dfddf751d100fdc57e346c9e690d2ab620a0dab87e3c1fc02f5f727eec6a1853067e7bec923dfb3c988c3e8f108adf1ddcb9b8804e7f3e9fc8191d059af53c95836314f0c933676044b85dbb950c953603589762c10fd76dfe2b301986468b3f65415badfa5d1f0c0816c6376b96c76c847741396adfed41fc14ff53c3d1745b70ce64f18fc2fe2ca445a7fba83780e265b390c4058856bf8befb36437abcdc25a758e77e0fc90971fab13c77d76751e19280e43851e7d39aaa0aed21bc32f7aaf25756111cd6ddc6b6f9b8d15acb4a25493f247b5bf134b2bcc2e5c2f91c78bad248357f18fb3278811e045a59170c9f0ed7f58707ea78c42e69a912a8321238ee63eb079aadf9030c4f718decddee4077183a2e5bf59a2a1eba07b8c4ec35cf9fa3a37a5c332a14c3711198f2bc9bc686b5dc6d3d7b6de1a8ab00b1fefeb107157f85aa8974c04edf757974a757090f4cadabe2283a29b317a831d8ae999173f07be4b4f665eaaa26093fcdda81fee6e170ed09f2944fd40f9f3ef47b406db52a55cc9350e78364e64220c9741f8e41745bfc1be8c6244c57f15b1912e55c6711ebaecbdae4c08c70768bda7750f142cdda19b298607e75688eaa8fa8f47f7746ab67442da283b1b9b9d12ddff796306cd690c0c32615007ee840844c7da285fdf56f004de5b7965450d48fc97a2cd2b774993a2bb28868fb241b051341a727fc12778baf3869fabd208aa3c55f81c247554d11eb5d847123a6ad3b177dd6ef950ef4371a6c0c294ecaab63beff193aa751ab480ec6e78bc1358c72bbae8fd8dc84038806efbfbca520a9bf9ea1df8ac365a0a95a9865ab3b3556 AD: ad8da691b07926db63a9d188d3f237aec1f8558702b0942b209f7e6096b79154d2eb844b05dea8c81bd041962e0c9e8d1c64cadc5a46c2d8768f57ffc27a1d5003776acfb5f51d372510d26eca840dddc3fe79e9414bb76aabe249c7f89a43050b85dc6b5b9e13aebaa98aed4cd0816685b20619fd22c860317b1ffec8f7e78c36224bb3922208dc25d23f023139fafb2264f9546bf57767d3117b483807cc5a1e0fc2c691f3891f54897b46c01b6f55f4bcb86af20764bdb9c7631faa5aaccd555e68a86a9491fa87718d5a9112e4ee3c2364b5f339efbae59db73eace1dffe4439a64d1baee99e6aa0fe380cf686aef739a456ad66dcd149ba8ff6767e54b1a3cc645b245c2b2ab3607334af0cbd8847c3931b02acf12209ea79af189fd9c6c01871650a009274762d07a4ca60fb9a31adf4c877c73d0819f4a97c0cad91ea5bd7d5c8ef59b35f2b24060fd8c6b4afee8c4758034aac99519757ffeb6fcbe40b2783f4aedffc9d0da49f3f98dc25a66f2c6695b864bc40c2fd5511c7fe681d98304be4c3e9bd7289c9caaf6282f7c5c7ee4efab267d7d746673049ff79ccd7bd019ba994417e22a67f856310d8abad147ce68fea094e52969f9738ed6cf9cc9eaad35612400b622da255c9758d42f52dfc CT: 2873303a8c1b9d3230e38c46f680a7ba273e654fee766beb451f311b3192f16a385ff3c70f124e20f6ebba3bcc288ecaddb2243d3c707b0cf50d09d3c89e67d2a2beebd0ca0be6efebf9dfc519f5149e7c4f0c5fa8ef05cac1d2246f2616c179b4cdb02bfe3d7f394d885dd30f429da8041cbe79fc35dea5d90b903ec27cd09861422d3f185b887ce5e1b1d42d77c254fa003f90d62d980ddb63593e8700a20eb0b7bd930d38ae937ec326116f0b9983c69c322589e79778707856eac07ec42f3497767860d4e072ed28a79e263297896797ace5d32595c8b039ea3684b763a297b30eda2a63e178a713a03ebed0e0bb54c3eeaf41d8940edd2e448533a0258036e41211c835ebde50e9b7fef5c189834dc89cb7aa566c40ec7265c068aa50939e9976d1dfc4cddeb630a4a1f78a9134e10be1868ecd92628d3f8d827f432123dabeb9f45ba4576ae932ed42c6447a7b9f3c9b252719735898c76db75ee8f0fa655fa023cc33fb1ac8974774ce6f23409cfa7a4e936b57b0beffbc6895731a450eed1b4cc795813bb5517997037169af20da701d42d0c9b169e4155a92b4ecee3df6ca6c4a22474c01fc0aad8866e5fc33a8b3ec5a002ada29dd4d284ccd8141e4180df300eed91ab9063bf331cb476d6bbad14fd7b6ec10a3e72833595579d134a642cc556b4e9613499627f0af51f6b22c0f963e4063838809510bcfb801880e455d7b4df9db1841cc2168d659d1997a251368f1c15673ce127033602bd0fd9988eb1bd63e47e8ea863bfce945cd077e486dafa43c7f5e35232c0ee1d00d040dcda1ded51a06ecea68ac635a8faa35361f32d19586450e7a7b7ab1a8861d9f0f4d9508cd2df522dcf04a00ef2dab9ad5ce9dfcd6b018d0f072e9a17cdfbf3772d38da7b799feef2b6bf7cb4f8cfa53a49cbbda15128a17e77f8f7b4d14e64e358a11cd01d5d2137d8719f8b9f66ecb62d97faa3d2f56ba50bf4b9a28bc896c36260748d803fef6e5a6d6f24a00550ed66a2ce672b8d1daa10097c88f81669d09da72a5e62b29494681b7d2389063605e1de349a83ef50b8d57c024b2d558d206a73e49ca7fccf2b1ca685156e63bb591125910e9f72ab2e8d3ed50883ef0bf6d6571cea0f5acaa11e393d15607373f25fc340b9ed6b58322187d6c8fe4ec47666e1ca34526992e7056cc7567397e7ba0c26e1a049eecc356158827f3867171b4c77d408aa24c51513b0dcade9fe2bdf6ec856d4a44112fce5b4c55300c24aa2e9cb7d289744562dd44afa68dc2f14dd25c65d3af78d4bbb781aad5f9fa05367e02327b644563dbd992 TAG: cebb4182450367713b8f5b047314d8c6 KEY: d12cbb53bab8c9884eb83f1d2dec7fae NONCE: cbb6af3402bf462f965e2c22 IN: 81c74421411edd762ea8b7b6bc4a44132c51c2db09f47a03ad2a1a17d73ad2a395e6762cb077a8be977f3925ec333dd56ecda27d4d228b1832196da7755e48517fa0582abad802b62cf231e0a2748b61855970912e1fe92435efcbaf5fe34ff2c0f90113966704701337ec6c0434fe2c36e3300a4387cd0514ee01e31628b9879fc666284150489282c1083079f8abde0a2e500737dad91b3a7c4ec1f4eac35dcacf971283825a37b65464e7a8fd66e2ee6721d4a118854f674edf89d376c0006fea01d278b7985237e78965f0987404efcc6576d1fb28db9f7fc1eeaa6b42949e11dbb0c137d501ff08b34f0dabb7edb6900c48e647ea0cdfb4c4ef3178548a592ae28eb119f1dc7b2f6dbabfa2ee4cd7b7b117f1f90af318e121084cd6b93ace98ee7750dabda5ce2b883f582e7c5d91ad42e7ea1fe8454a5da83a169c32d73a4c1c185a02275b4ba921b071ace5fd34a2076b226d71c229d8be6c58270a3ddb04a554e4d395df00604dba7882d89d9048b3e16c692e636c724580da376f8212a6b9c443ec303fa70cbb1994d12a1574bd93b946c1a005df40a3722fe2c2e7fdf51ce2b895c6cf07d893a41a33a6906af87af0abf948bae5ad258e80a0fc0afbcd770a8a32c90e0949a1151e20e81cbd163b7d1ed843008c813ec3bf44d363e37ec41c094458ab8f7457339a51810fad8d63611ec1a93282c301eadcb4bcfe4d0b370d6f8670516cbeaf9b361c92252d14e062bfe2e63b439c7d4b1d65dc8a62263374d718831fcb4bdcc0bc59a18530f7dffbecc96bffae9e0214ea7f2a319e5c07dc0c8232e7863df7d081a3486a1378240a9966a632c5e73fe4800481c4f430126c4b5ec71963c08d471e01b6296b64a593cf78f108d2ee866af38028e3a4571f5582207706932019646a1476115cad80d0b20695c84131e11cb9689a6bfc40f820e96bdb151adacfe447f06516dabb2f766b8ff5619a15efed41650211e4f4e114ba0b071ae0a6b635bf0e1cdaff2a2a1517e7427f8f1c25ad5d7cbdcb433987a25a2962130299f1de3b68503fed81c3c98dd774402bd83809367ceff45958e7627ee8dabf50f6ff6aae34a8c7ce471c705255099f602c2792468b5e8527b74948f4871ad5296c5c50b8d4ccb6ff8c2f44917baa7b70aed81302624fc405d3c550791ceadd2aef796a0db59c01a5496ad0b72f7a90ebb1eb2fbb2cd8d8f09a2fae46937f27a7a9c3cca3360b08143043d378c450de9676a94ea5b9371cff1fa3b067069393331324c7d283bdd750ca521cade6526c970a82fffd925ff945be16639864e4189c3269838d3268264b1aa58697121394f11a1b AD: 1d9caf4e3eb2d855d51392454b7f4f2b6f29f422d111cc378262c986e3117e81f6eb6340323427389ba2d174f4edcf5de47be0b3fa820783b8dcd35f18451f8256d6f703bc16e666367c93f8db0be18c98d4e93dd6db2f4eef2447cbde251fa226ef4b6c4183d06cd1090e46cee182743c1573b3fc885e9da0262d715dec1d66954ef49c3a7d54f935156a51cbb1b837229eb5619658db860835fa5c926e0b87c9ac50ac76fa6696e149127aed1b91bb623d232da5df30b9ef43b4ed018f59a803b995748e941adb785535d69b8eb9e4ebad17c4e2bfbe6d2706eaf90e29867133b4a58c3e42cb51b494dcb197dd55862ca0f274883686b1e492b35cc20e2cc6e531c15bea94af9040702513d7d929195ca34266c38ca79f3f5b0c06a1002bf40770fc223be269945e56f11a608276bc4b82cc228248ab46acafe801d330c28039f7614e59cae505931ae9fa387768c2fd9ffd537a0704fb30aef78b1be4aaaa6f7574da1274d3e84dab83297acd00885acfd32300a36d0e8e5ad2777e4c0f718f91564c60ff117e17a8c57d2a8310fb1fc62729720728f2991b4d05317537883f016711e07ae1b3e6d876d52a44bd246c427587fb91d1456711ef0c7970eaa33db3347397cb76b95713919c73188ce13a6a292d798844067c0302 CT: 7f22ef21a372702a9fead4339e38ecfa2abe757d8ff986e7287a479a864bc1012d4621203289c8731b189937d50fd6ee79db7ee84a157acbe801bb56e1225dabf13a25b26703ec364f98fac1243ab4a4cada7080a4acb8509969ed8a2e9f309e7e465c43f55d2dc829e2ecd63b8eeb6bb01a621f86b4cd32c9c243c200670e0d9bf71b221de296e3364ca2ed5c73751b74db151176626a69010f136a32a14d47612488f90750316ea7088578bcb84805d331c77d3041af756f2ebfcc4c95c328ab03cd3424f689e410706df8b2e87ffbe24f8025c1ce48e2ff6a0a240f23b09a0378155c2fab57db5d8c0daa296b813ad148e94c8d627715cd2fe8f861e414b3c7f482eaa5ae1eefc6ff86ee30109e27bd75557d70598d7c65bf9bffbecf44a44339b09ffb88a722fd8c19f196b9822ae79cb66fa1c712cbef821d996fec59f5a95c197f70fd34db9e2349a372f43bec0dea764fcd71ff931d34fcdc8d9c9321e6d8984211db1c1987032ad85e1b03519f433ef9db8811fcb24940a320697c739136a77f66e97332b75b33b9097cfa9e224b262c19053ca32afa76a96524861a8aceaa98771efab10c0665533619befac9bca499ad88c9d0f089a7026583e132ccf3a542adffd56996331ded9917d363659562a6b7e45231667b8b3069f327d829489279058b9b89bb7902c1127d7e8d150634b580274b47354edcde999922654def16ed4378f313115f4013d8ffadbde1c8f8c918ff7257175f14ead903c03d5190aeedb2dc9e762e34b3f80d7ee460bbd14ae9c3182660608f033ea073548956b72275f74f704a349a87edb015e6154fba7c0ef4a32a4dc206dc42d5d261ecae22a9f455c409304131859477435b30ba3fad46bd5f69971ba74f1fe82a6d5604e5d7eeae0dc8ff5a170865134c5fbac13bf6cd007a16af86c42dcc887b90664ee5e48edffea8ba46fd84c844cbade00906c36d84373178369fcfb9226654233d2c5339099ae4e723a0c0516742e42e3c40994bd06086e6f030acef01727e7f600f7109000bddbdbba16b9543174c98810d5ef0c95598ededb7ab628323faef1ea4028c0ca414a7cc33239c84de86d53a242b4e8c3f9a20e3a826f0ade00c440b2f792b946a97758a073fbc811f3e22de8acfc9ef1b1a946f6c3cf9eaf4add2ba403941b446686d9bc0524590e2bef8f552dd54d9f69053f647ff0e2371b244d15cf1a5302680ece820df552b374bcd23f784a9c4bd486a71fcdaaf3812efa5a39366542b163294da6a2887796b6d863529dfe76ad88e2b47931de5194a63b9f07f6ec63081c3f97e9c0379c5f44e7496dd23b4c186e3613fdf0d TAG: dcb7fd2d779be6e82ba1ad90bc79ca3f KEY: b243593177cd099dbacd5f8efb412a95 NONCE: 132b8ab31815dfb463451fbf IN: f63388d8dc46c29d2c1fd937c668025c833d7d96b021035d530fc404e1c6a3677b8a318c9a81e295c12c88fba75f1e17973732275846ed9103287714236edd60bd9cda0d4cd2695234bc69cd09e1b4db3cc73461e524e0934ab0cbd730a46a67b3614ff4973bb8643ac7d555a8b764bcf87f0bcc8d19cc9ddd3fe27a376b5a6affbc95cc6ba966f8ca697c5727dd3f942c4a3b6215c00bf37c50bc95b1e35dc762d8db2f0f5d30d9b35ddf005d8a89d2b106fa4e921ead057158c3fce0bf1e6e10085619777bbcb643b5fd86b9b39c1f11a68cce6115d2db8c01e6746c81da9dbea30559b1bbc2457c258955f2d37862fc492b4f590fdb8cf648707b17a2b613c5f08dc457a1443bd56399e34254c92b91093ea0208a98189429147771d1bc49296a070e052af3fa195f612fd2487eb49ded95f2c670b3ef23464684f12ae66f02d886ba14a360a852b9b84f9b5590a514701fbe42299b54b9e8c1e7b83c7ace9badd9beeb0f88707b79da375aa7c2eb9623c7a1c553c521a9c7a6a3e73f0d7cae3f95362d25f6ba2313a505a90442012f58f6d9cc55563a1e1026cc1ef0e69c119dcc4577eb775f5d1dd60cd60ff5b35dce6eedee48f80d33227f6354a128f9cff56fe1340067c9eb20e24e143b9881f8d646947b121df798b4917bc19a76e96babe9554d9617b4f092471baab93ea7ebcd8a05cb2d267be93b4dadb29d4ca937238910180ae497ab4c7c4b234661293c8cf7f2b6ed3e0a738ca8ba0b558fb24ccebdf3b3e9714e6d7b50c847b72ed81e3893bdca85bf46767335b41d68b62961f3304003247ed25b15e3e54d6942d35fa24b7320355d4e8e038ddcc295bbd6ef3b24e9332a710dd7ef673d3cddce10f683d0ba14dea984f61ecd580a684f3bc97cd50e14b86fcb2024367ea4e21a8d01f1aa6993a458bcbf1279fb45ec4510a9295b20e82cad0c79a5f61356509be41525bc938fbfa09306a94610fb9b9c8bae1e051bd6fc6533b8b47bcee4a9b81b492e1295c25ca91b9b5898487e468d64d275f52a6700fed0d7b593234b3e0010480e12fd8f5d7999c1b8b05c7b9dde7bada3cc6926095a8fa8747da64db55ebb3efa167b7663f1cb5883593955a2252586f942c8aa3a1e12ecbcc73e1aa5831c00e5e211c7461120f84d4482033a238b80016d71e51dc297043f67877102f69d7bbdacd03c1896bc24cffb24d4529aa7d8d4d5e5ad3a990a36e1fc84c7f8e91fdf2119a36f5b521125976ac9ede1d1b74e3a31a9428cc36c94e6b3a34ca1ddafda11ab46cb4501dfe4b58cdf384576d651b9aac532fdb97a8841d0bf58207131e0c55361d7f87aa4c8eca24c999b7a74ec23f9fdcacdf99a3852e9ca AD: 9516be08987911d111d30398b1d730d6c7d0bbfcac487e9a810a9a17ebf0bde09b3dd7a9a430a3bbfe41b3b3a146fd7960870b1b28db45111c71c6c9ba731de849382d679ac46be434e2e95fef2b04ccaf21afa763bbc15e23ff44aaff7ee793941a8954e42917f759ffb0745c34e9cd324e9c527b6560e52007e46ce0d46aa8165a0e6885e96ff7d6d84d186b313cf7b726213bf9c3fcc3535be589d336f84925fabe762d14ad033dff5b7f39f5948f5f939bc345c4db77d9cea9cce1220ccfac396d1e4201780f8d37c6167600a17c18cccbec04f605d86dcbc3125dc3cf5b40039c3dec4355beeffd72ff221a4de57f0aef322369c1755468b5748541049f3f1d790adbb460d78cbf5e3d2787d5921f598f3d9a92ac289b58c46edbe1c64a6cb2a796aeb17259a2569af4c19bd69da1018352b63b2b3a901bbf0c754ed3b0609227644fffa7a997762aae36ffcd700089d74cf3b9ec2f5c9a3908ace5a7048c90ed8d775a88693742f5738cf2a791e67ec747e31a1387f0c0da3a77b28b720bebeb7a9f6e76d0454f79225514a9d0d8e488a7cced170b4b89b1b39091bb470832e3d3fcd144fe86c661ed6d290c4e73fda61c708004561dc71493c9dd4a66134308577fb7cce84891458e2dc4581603898bcf74cf5da7cb1f3590ff570ec6e559d6f0 CT: 3497d7dab267c401f6754a95b885561c8dbce6c1bdeb8c6877810d6e77afe8e2071ee088890dfa18d8b4de635ebd88188bd1ff3539c7da99905bc955e64fbac216a0776d6ee45169e9959f4aebc6ef987f7d5fefe73aadfc2c6da56155d53b795df61504680886b9ea8bc59558160d9d63e2dec0c5d7795073c04b6191c725d5a881f71cd049b9ba42333f1082ab9733fef2230cfed44c7d827a7e6a8cb07ea58cd8ce96baf00df43ac95e35eb585ba99165b9cc6649b306c3399da8a03134dd45a1b9f1e4ab3aa0399c577104316af55587d5eeb0348271d2467b920a083b4bef6a21033f8428ea816718880da3c29f4332b19030d4270d20a4271169f179df4dcb07e15db1b3d4acb2d9cc9ac90e9877ddc09ee0bdc202e9fe23a844be123fc5b08068c9a6428988de1f2f26f06beaa020f725c072c842c97fa8069d944f80518ad2276cb4aabfea20db3256d35f9533d70c6723e5696cc159127ca671db02bcda89aa17dbf47c33eb863923c0a88f3bba8f79bdfb6eb2d15fcfa9acb68018d4d33417585299e92fe3e4a131dfd123a4edb72c988796c6dec3169cba26ac712cbcd92abc4e1f327f05838abf03bcfdb218d56e2d795eab3d08d5beba1b3492e72626d86b9990e777ffd91ccb30f99713d89d0532a032bf12192a1ac2368dda2c131febae2c11bffd83311fce6d20521e92d458a285fb548ef27158e593f306d99f2e5e521522192037e94aaab02713e3242bb412b362508ff0d4823ca0ff6190c71e31f4ff06f40f8d467182ad43848ee8b8c39280d535c7cde50571f40c366d97f5de703b808aacb5a7369df763518424137d42c59d91fdd365d025f1a747b95eba9f0ff580926891e39ffa2943e28e4cb3981d2cc62e9b975048df0d0708bb7067a67bf1ef6d03692fc5501bb09d562ea9ff3078e454227ae4d6084d21e08cf6c147b205d74fa81b72c1684f60923bc024c072608ea21ce48fa46c41495761d68744953c87c6e064b33d8d43135e43fd5f67322a1d2d9ab0e07e9f8862d6d252197a4fba914aaf4092a4d499a5996d40f143b8f3eae95a5a64b23a17495834e3246f3d0a06756d80bdfee94f2c03c8e5ce0043e9094465f6a3307f8b6f098edd85f863d2de3867b644fb0ff335b83d26958c88960f9913ca3159b61391fb67dd6770321a6971e1fff607c9ab6a2765f4795f53fb8aeb26944f728dc6f66de97136b50d722affbe78e59f00cdeda54e23f46647d024f384ca01f46a39e660df4cf9a2576fa353c7b243c401b429262b14112866fad6e802ad42fa2e509ddeb1ddc70d24e4eff5f7e94b4e9772cfb52b88d81272462087a446b770db1aeeddcf81cf9075b419acf4a3c3cc TAG: a4b1933381318aee1af76925720ffbdb KEY: 5d44b6e557031ed28b60f3a9e73293d0 NONCE: 3f57c9c636ff9336cee08635 IN: 8c15ae3d5af075f8d9ecb494b00aff1dbe9703c80bb669b522a00cfb1c400598c6b494b40c87041a99d461017ef4381d3db7df5a017564ca988018c4f36282213de60c841944b6d213d8fe2015cd535184b1619866106c39a09f71a70f78f2cb8fff2f377d87390eb31b73db093000006239a8a3494a563618af189ab3af3556050b68c4abf48cf4d02013f9ed69b52d8c6bfd5188a56f4699b03f60f218539a1638c9890c7a77f5bb18d7c4ffe27314461a29c91526cff0f713a9be95b608a2ff36783474cc9db1454df62fc7efe08ca97418d982d74555c0c15fa671f99fa73559ff54ebd092756e7d9477ffdf2de14e1c9d4900fe401d1fead7fde27cd37d016cdc56464f76193af1c252d4efd60f6f3c0644ccd1ac67d968140ae08db759aa7af205563d4402927cb791f8cd845777043b975ddb1ebc66be4333b7b60293952368767aab30e1a52e1691a35f684c8587bdacc8b374963c1864619ff4a204753b44860f595ecfb275dd0b94153a065f3cc3235a7525921d16684524794cf45a9902364c80ba5649b90c1b42ecf2f17c4e3b7a888c6a2cb30240c6baec3170b309714aae3005846a19c6292e5b7d2772af24f14bd7f6cc7eb89e0489400b4c18b9372aeacd92918e4b2d11165f2de062de882f42ee7c4b5ed2fa54f66d0b4dae63db4d9a777b404b1befa704a48a3be7b8511fe716f77c890fea23fdd05a9d4a57eb0f130d7383a023ec6668e6714f84337dce5f8a9f46b9ba17480288fe89752961c6e7cd6d32d435c5930d5228be9aa002f01f0ddc79bde0abd76e4294563d5410c81c56644620a002a7facc871ee7b5fc73ed03ae0cd253439688cac4e6147fff75fad37ddd52971895702dc280273b8e7e99f8d1e93a2712bd9a6515c9b1dffcf7800ec13e08cc732a15ed3c51ab8177b3b1b1dc25e387ee2d0a69d7e2f7f77555bdd75a75400bee511dc5c30aa7eca46b05c9af4e94adee1c0bd84085af86a85a15e81d607ffcd6f7670bc11705b46e43b6beea7e1eba5804e24229185b15fc1fcafaa7de15ab336fa2ba7d94852f20de7543b4acb4e75f523863649578527752050bebaba444fe6b57c0304cc4820f0034f66b778d907264e5b8c8c0357648875dea1506c00413109ff2f25d9f1c3aea724a5b7f39ea1b08b9329c07dd8b0efa2e0e6fbf3f04708b833c2e14b6f5400b4b3d6463bc256e42c8a427f7a0d8b71aee9825169b9613dcbcf7cc364a87ba64e60501bb01d8f55eb5141ed945666f69b536662705d12f3839c45917ab7c932b8609a97ebbdf042fafda951753abc765002ae60eb1c9dcb2f95175ddae0d5b344a78b60c327676e4ca2ac1ab5333899dedfc91f66f4f8ed83130f197a6f35def3e8e2c6598e6c0a8ee AD: 6b0da01dcf6d8aa5fab8310cae71d02d2ebbbff4fbbada8a7db0725cb2e20723d2a3e5471d05b2319f571ae68ec953f26ddc167b8fe8bd801d6c58730f4dddc6c94bdb1e6d1e0f11b6d59e28f145e75a3b4d7aea2f78eec4677c8be45307910c67ecc10fed65ce585c6addf789ce485033d82e745f91472b7103370b162bc60504dab311ddc428b141c105e9343c2cd7527e43baf01b9bfb4e1b85918bd596696b2353425d03941d9a5aa6d72c57f1c42175b4120269551db41dec9b893d24d76a503f13ac1095ff824b0c3f7836e8b934b112440fb8157d35cf92c196de10fed9046722f83ad58546c9b27b9cb6e853dfffd89ab7724e140c0f1326302cb2224f587e6c7f27111e97ecc0dcc7d89a88e133970a22e4aacb12ce388393bed30d263ed1c080c1d56b0777e7ce2ce19a6b8db174aced748f71fbd52dfd415ef6fecba1e4ca7f207757967b3a6ad1c2e9f7c6a58ddae8555205e5c6bf64b209bee6372f196682db52dfbb37440be658d1398659a3b779843c381c5673c4eb97ce0133597c5667fd183a78e5daf15c56ad726f6d368dcf37ea737af668ca7131d4027b6260c748822e7a387b611ccb6edc4860fc4302493e66651772a39f5c98f46da64a9b1219babdc1cf6ef4c6557ced9b85ff3b918053dac001fbdcceef7485953527e1181670e62886f46371d2 CT: 68b1872409e4d6bcc2d218c7a844ec2a78969d25b766a5272ee09a3f0dfe20abba0ea4cf75437e4b759e8586be4defc5146b303b162c4209406c93884c06a163a5743fa6ebb8f649ad8de37194633d18fc4d0bbbb1c74e8297f48e1f532e5ef9ee7c15f07b2e96cfdbce6f583e267658a795ec9c4dcd9916d5dcc08fb5c28277e56dd366a26f92f9680930d63493e2995ce350e6286c2d597273b7ecdd27d2c05b725e32d6c48f7f577ed4098d318fb822cd6413437c44a9ec8feb54959a2e6403484a8aed34e0527cee6838844dc987d933af12b370cc888b6f6ff2a25754caefc1c665751321ab9b9f19bfc17e6903c99dd87fd502065a8ecfc1c29950dd0007ee2f9c3fc752cbe7e661f06ff22a266f564e351a7137a1b96616e31be24c7a13e62b04646ce0a68791e0e1a099b862435065cf7d3203fb32d7d7d8ac4a77642d69f7c27a46973b6bedd5e840f887209d19cbe50504c0a251056c8a83100092a627f73edb421a3f1aa12edfc78d3fc474cd2583808e38d63baf1c5b4b5cb34665e10d4af806bf3abbcf4432df6c9caa76cf0e17a5e0e9af7c8868daff22d84b7b6eb4f299b750ff18b9b17d7412ccafe3e55e5b02af9ad87c03799c2282a9c6377ba42e840440d8c1b19bcd1c8fc35f02fc505a3ce97562b9e660fd488b53c30edb98b91949188903ba2078193c2de05e61c9da7bc056624104471a8231b7fcfdfda4d804b8819888a2c9bde680bae59e438d89778c5a04dff214e9b14ac5b031c378c8beee5ba9b1f91dba760d7621c24c30aee28c4b49e183632d8b450ee6895a47b96cc3c1917af685905691d1ca588db5a21674391238d76ae101c3e83d94dfee4a0656baf4d6cf277e0c7b0512e4ec13d12a5af44c7d19820fe7a74f5d5875321d528976f35a5634e15dcb35a54836370569d5609de0360ea4d2f1937dcb2d68b20cc5a04c13c04d5379a7dcbcb6b711712d7b3b20d255156b7e61e99803a4d767f0438c4fcb166920744c20a08e48dcf5de4ec325439485b51e4c0f08cd22ecf60ace34b93844c2c12bc7b46a8f6b8dbf4de311f1039504a46d9616b41fd58388f458bdb8bb9821a33379cba4f36b416c2eae02f42b736c1cb6e673b9b9dbd230b6a23d944124469bbd2c545f5ab72fa4b3a47b4d0bb0271d615de6c7f182cc92165a84032f59c14f181c093b017a1c7e5887db249b5ea2db39faf7a3cfba08538b91520fc1f3af697c5f4dea7274cd86dc073920280b488a3f66969cfea020a312be1fd111c7847296ec5f5cc91f00188c07c05e4e49cd0667ee16345f794219ed3a80602cc11940aaf9a927805a040419abd20ad8ba0a05c7ca9936997549ed5a3c7e7d9f582c735a424895c5f1aed9a3a2ad3cf7d9f32d3e TAG: aa69fb97b939fb73703ad4cec6c24fd6 KEY: 714f39851c1fe09297c8c69dff0e62be NONCE: 3383bb6aceea0cbc71cc7783 IN: cd1fac364236fecd9fd8aaf59de7680afcf90de01e9adeae58c034c25c8ed25b58e82e4fdcdcc2e69d1054dc753425e98cd50644eb74b1b6d62c769b61bf74d41a319eb35878bc837bac60af425c0a36b150655ac82f8e8fd61121790a3bb9389e121ed0fbb061cd593603a763e0b8ecb357b5c453b20239ad2e44ee0ef0e4cb717db95613c3be18aab77c708f5e91af8006e11b6ddebb8b0ef98c06dc3c97d008e058bf3e534582c24a1485f68214cdd88167814802c89d5c07a7453aff1010d6db0b778d9d8fc64b5bf3bb84cb97cef38a4b30a7deee12f0af806833c8c6d35a7f995b414eb0d9a900e3e56afaf2dd0d162063c4dd52bc6ffa56cfece2ed90bc7c9f4276459c9bd128ee40a5aa514de786ec15d04a16adddd64c7613ec9eed738fd36e24fbcbdcd0d3318fab948f47314a5400d71c5ee07a8c1fa17e4a4c08f4a467291cec1e8266342a42646d138331b08498f2dc3fda0374ef736d05c2a363fe08dc71ec799f0256ac9114743f40641ed8d9a039c57cd409bff29bde518657cb305a875cc6c0a58fe9ea3452df3e3802cf316a0c1f477179f6cdcb39c7c9424c07997500989a600887dd9f04c92226df10e9a8301818a5ec2f0b7b06b6d1443dec46f478a9271498b956b72060dd2b3021b004358b7eb6a083ff2facc3e9500278352790ccb6f9df67dccf7a03c33a34c6f33c1b4dc4ced2d5f69e5f68e79c582bf0db7751b774019d9399329f1a6692c5c527a646c9bb866e69d4f1ba4e6065cf0c5b09e941c5bb6e96d7edcb19a5cc02411507701b65987dc206ffbfaba4f06cf394976bdde1ac343e368ec1083813417cd0a325aa0e88913958974fcc911478a460b79b9978e33b21064ffdc1fc4df1e314948df71af9a6e0a40907e6b35ec6304bcaada85b456298637b6fa582ef331e2815fef135dcb66870107b2149c5aaa790f7127c0f0819b83bec46c0f6d30edb61b6fdf4f35f4b5345f1c684f41eed8088aa2f1d42c920a06092058e7c225d10fe1e5befb4dc593badee754fa12b843a6e9f67ea0e0616eaca697b22f526fb79a2ec259076971185678aaebc6449ba3bd284230ee621bc02ef1f5ff23651a6116cbb7770ec7385a44f4d54e7cb04aecd59a99660a1021eb6abb5d2cffd76e6e7380c22d0224e499e0c7b69aa0e7dd6deb47b22b1f1fb882dc35eb944a495fc3f6345b08da8f7185c3be95952bd7c982d9c8b2410a1cf1f5164961f6d1db6160d252e631f77b02d4e23dcd655e7e875b9b703fd27c57008184772c73fb5dc626ba43f54cbdc2937de7b4c470235098cb0a3e699baaa8e2adc09f8182ae1f168aa86a790688795003c3598293ca269a94494f159c5d19a22469924c5fbfd198b8add28b37cf7bc3258fb4b906f2ecd672f4fe1fd1359a433240225 AD: 1d90b2e081fc4457b3387c1033affd15747b79dad1d6d3b69c076d4dc5c209ba1cdd383a5196fc21fbc49fc65c69b85ec299b1daa26a4bd2e5ec2559cb230b21c3bb62e2831830a2b86da2abaa289d98eb04eaf3cf8d583ffc7291c3201df2c09b7d900a4bce0972e390fc980eb67cfe654ba3b9c579f997e319496b57819b36dd2b4484b88ea3cc1ba777b10ecaf526a08afd9e2b3b32b2bc02932af5d09c2ee3fdcfa18d6261808e418c4bb80be4315a5581d405841341bf2775d8d0adc21c10b9ffdc0ea4b22e22f61b46f844d8caeda0aeb7e1c3f84d337898af24fa68d60e2f19ff815713e1587e0d6e68d64cd088ed432c45637e1767913343d899b2f8c01bdb83253219878a5b3a4e6166e02387124e711a56e49da1893b4f72198c6339943262cdfccba33428009dff70a0c8c79af248d081ca04edb2ad4f35ed1819f0846dfade107c7e9f4094c014087c719517d943e524b86047d24aef8b901a7b1ec4e839400b717e758520cfc7a2dbced0ef491eef6aa2695b2ab9a92296b6e75251f124168c36a6555c4a465cf84a7b36f3277859dd5bb0f10f84cbc944b87e37b6b8ff6958bf1f0546839effd30995853c734a11c062414fe841113d0ae62597cd12ef80dbd4dc4f72e065171c8394e45dc6f87c86154e9846c1eb58f560b8c503848eacf05107c445a6a06420e67e2297a9975d23 CT: cc11a071e11cf36750fad572fdfefa377b8f0ed6cc47bb8015cb51f0eeb531e5779d233ed224022c5f7ff3181ad1d6a9f7564f41ee919f0435fe49b4266157a68061a1c5d06d8a8075b55efab8c9530266955c179f0a57684459835931cfb2eb1244a730797dcfcd31e7a414ed42990e9a55d439fbb803f2828f92cffb247f8d96896f9b37ce2d029aa15873bf13144cf35eb70d8e27a013513774ede1d37e4aa007a48a12f37385842cb716f60401f638efd2841db6165819eb3c2c58708d92a454344fa64c2d740cb34d4b7dbbc1d86d9e0083432e0e90c074b617402b68e3199d6fc43c454a842da725b49eabf8459b4db90e6553e17f979fc8d6bd03ac382f3a85eb40b64e21787e8e8170372eb0202fd4d78b39fb940829e11270bf6ccce0fb28adcfa8b60659e54a03c7b22491c62982e5673d66791bf6db75edf3836449e918b0c9059de644039063d78b66769d8358349acbaa7f1bef02fbfe49be375f652952f66665df26964b8b8b327683731cf825ad45118fb98f119db977828d96618a4a2fe82105eba7d1c3bca35775dc57a207b5b07c24305829d911bd7d30e3c19b030f6d34f6858593f3a0dbd928fca4b1ca21ce9ea8b63b149aa444bc696864fe2bdcbfdfca33a656db422cd007649d3a3e895b909fac7f9f0d9b15920b1d9dbcb343a2a0fd9382154430f818a9b347dda83e1c1038eb5259ca8714e2f8d3ec13c8c7a96c537fe599b30fe8780c82242f674817e815d56c92e765f3c67bb9591e27640d4880e04fc6afe5f1482422b0de4282df77df798ab7d32372f22dd3dfb0035182fdfd524dc315b0c7607639fcee3b1e12421025964a27bb5926f28c97cd7d74cdb26a779b656491f057eeb3be3eea0097b787ca5d1b1d5abf42fe76b16e565b2c1d15579e761efdcaf04fb18e7a97215e4dd53a164b336921390fed9c4fc1cd0cb0825d4b5c7061db0f4f1cdd950f13646c662bc6837ce2e455bee1758a59fec54d758eb49f040384f27ab6abfbeb7ec52a1a1b3ce63f6b4ded32a41a64b8cade579db95b7d90dcb875e83424d03e9f3bcc2dc45952860f1845632c7550802c957657c9342dc32c64c558944fbaf5f2b6a04b5d48794d140bf4f9de2fcdb1b77a0602f1c97fabb0f2b92b05b6894e665a8fad01dfb2764f673f61b9c6cae68272a5b12a9a8347782c69f5f9c3d4ff932cd713a1e2a49759114563d94261ebd7c0a723a5837a1912cbcc98b6481f6d7bebaf29276bbbd6d0a83bdefe2a0f3d4d60d88d4575e3cff73eba09aa290c2060434f85955597a3431c376f64489f50dd9d1be65b72158b1d6875649da95579b5c88e3d445c7bb95a4ed9452e18ef33bd7dbcd25c5ad6c769a651204e082026742b15b49554133e1539fc516089ce27940c89eb1a68846f13f3 TAG: 26c14eb5587ec540185a067635e64c29 KEY: a406f8b8ee46d958d10d8724d90bb26e NONCE: 2b38be1c0e8258de3a095418 IN: 26486ad28af8f2fa8c7befc95510589baf81a88f3823e87eaa8e40759cf0853547301de1e87b2eeccd76967bb364278174823c1cb1963f34fab537915031cead844dbb1c614eda56e9952b1eb4cb153d06c59c8da3b10af499b1c15ab0f03559fea13b81bd35fa5eb9a5431e12ab87c3c094861154d3d8eda448af7e15017103ad3dc7e9991b10cbe61cb33d2ff90121f4e40bd5d9e9c34b89679b6e1b54e38f00b128093af3e4ca9830a1a4d7a5e9db067c9c51fa26232945fa3e1e31e28c5000e1965cc7aa11a051305e68be9d60fb92f46eb2b701b3f959819f525ebefd5339bebfb64636d680a2a4f32afce85e287f8936bf62676c37ba810754186e30b812b1196e8661e345fb5b09b8dbe5f96e0010c5e3dd0a4e983149f4a058437cd46e3b32ca04c51ae3a4a39a7e15768a8fc379563450c616a5c7d7d98c46c0b934c894727532a9e713d330d294a2753f0f46049c88eed68711e9c49632144d5cb14d76848a6f7741d36c969edecdde52cbfb57a628678d31befa7ae3198343deae760d5c92c31f3c045b3e932e9051cd201d2dae66ca0368b94445d662acd6442c39eb945c8a4b46129a8cf5bbb2b27927729406f9b081695ce148a10226bc345c648fe557b7f8db4604fd0704831e5bdef6694afe716ddc3a8d69ccad4113ebe1684346b493db264417cde9c0e48db46aed1984f72903e94b72cc2b2f151fec80b32523f96f61485f026d63734ff80015a1cad4b21ed1ba057627b387eaecdfc6d7a195b7d46e485bc137726d96c4ba51e1656c3f234174759ad922f3493077d65c149d1e871855490b6fa5924f6270cf15920838b66e3250a99ff7a55ecc9944cf3fd204081a61ce05bb989e5abeae4b2f24801e7f2223d5ce05c2b61f32344a0370c22751293bb898061ff50d6364ea0275bece795be21c9dc0b2749ff68a6d15896d4692474bd46fb256d1d012e45e7a58d880fba240ac6b89d2087da1ff7d41df44c768fee5bdf51f36b090bbf85e7ecb69f61312463eb0b4b1a04a153f593f8d43f62ac96f76e13ab5928147c5e63788bba4f076d12eb6dd15842e2c40fc9f1ad5dcb80bd95d9d41222953776b3304badd650afc783b7342196ab551a474579d95f826f53d15b96ac98a10c2c6d50a7b9b947cda9fb8d8d7dc7def72c5283a93112d2b58487a25debc9ca06946bb0a52a1e4ed3bcf0fb8decae49fa6607c55501f01b7441671f08c814023f7d46f4bc596d709d305ce320b1b0160bf35c8f17622c65b8e5c97b3fe7327e8e22384f6c400e551dd438d6d3d0f9ba6101abd1bc2486ba249b4cc83c47982c1210328968f2b28e4a7c4880d598d5b47aca2093965622ba7b4e4062c86d81070ecaad93d5e47ece22480e24a29b2910b227930344f6a00916bb215e57e1f3155fa9437603fabc6a4c6732e0887f40b5017de AD: 54e46035c45b6ebf14c5088c5f15f552a4d233de7d3750d7736838a5cd4a7b41df1b71e6c5e6a7dc63519ec43bcb4fc603168352b8b8e261c15e76e73556aaffa32193c1f5641b2eab29497c80eb06543c1b0f1787bc616a4e6618f751dd0a2b28a87fcabf405e97efa91becc8ac1b036a2ca244e13dcbae589f0d6bf8e19bf91caff673f2a80de93a6fd5da1e63516e2760ca12a64c8175071de22b26ce72ff9e15e5c55fb253cae55a3f48c0b507bfd423f66ebdecd0b6227d0e67c4347f2a4819a6825dfc2651e97c1da629e92bed3827a15dec0f0c8743731baef8035fb0a790f49e5b2a7339485df313a9633496fd9e7a9904ec566bf20b8dbc0e3c1e4572411da7835b5eb5cd51313b78a1d6ed96bd9aff2fba37e86d475d95fd7e14c6fe8ab23645b15e7823b7bc9d0a02fbd9a43c05a6c660b6690891c4d055af21b50a5500d72c91695536eb1a3852caceae05803486c64535747df691ebc62e888bce8a5c820569b3d80edb4e29027e737fcdc4f49f6eae43b4bf68a5731fbd09778d6b205bd8b3ab4cf251ff31dd94f2033118ff0c4154c78af27570d12def873fcf4de7ccb6b6cc8924dc63f8104e9a3323ddd32006d8ec3aa530818e299490dfa0a9d811fb3bbb5f624f26dd7d0d7a87a7e7748af5ee4f4bbeb150ea4078b504aadaf92b8f9edfb701c6df7ca615416f61bd770d5fc6675db01394a26f585f CT: 4f90cb1e30d5c2c97f46ec00cd8203ca8dc808dc0e862cfdb35b1e92a24f0093fb6b68eea43f04ff1332f942b03aa2dcbe03aafd18b292cbec3cd66d7ab26af3f274a97e599f520a6bb59f5c56fbe858821eaecc297e0cca632addaa5aee071a6cf84910006f158cd1e8a38f185e95dd7f6ad09303636bb6356e400ae70338a8eeae7c22440babe6d9595b2ca008c2e7a471e70e66c49548bab632e87ed36894c6eb97c7de858382cb060277edc91e19b288870b2a472df769393accb07f34a8cd94922582ce351da199a8c5c426b2884bba07fe38da6289ee55537952d53ffced29cf053a9e1b9b37d2e0e3c219f48fe885410e6bf78fea15719f20091e654d44c786f9494e4a71b20f968bbab6f5305af7b8668867cae10eb93904a0e3ec3478fca8d6a231c9b4b84cfc3394716b366c0b1a1bbb8012a298e3a00831791e489b7a2dac6c26ca9e5ad4ab58c4cd71215cdfa2422f49a7b30698ece44972a6dc7dcf9ac40f241085599e71957bc719dc51555312fff4e963832017371980b5087d0f6373e5b52d66d7003525cabcd56bfcc00041bb9f0522a4dc86ecb444497b97d882d122dd8ca1806f1e0c8ed3b1b4810dcfee9b2803d08f43151f5a968c18266d0b956ce26005628780a1c4fe0e25b7dd55e6d4cb6b1427fc56afb278a8cf91d83b952908c295947a5cbfa183816a9fc4400db94a5990e53d99da1694de5941364e7828515544b1074de41c253a3b7bc4b72a3a0173138a025fe758f8d834c7c814f1440407cd1a98aaf15f7f8d5055aa8237c6d93beb53dc84cd4712d0535fd90c180a40ba6cf9880d5104480c18cd9734354c9321eb3ad583caa5eb05edcf288ca5793e288436c175e56c001b473c1486bf36f9d75d71461339f1e063035ded3246166644761816559ba9cc9c26f61f6d02adaa3b4b398fb80906ddbfca2fdfbe57df724adf1f76f995ef7d52468ee2f89785d59c0c8557ab45f07e0da644c0fa9b5a9e1a2280d34a0f65b463e53d09146bd629134b12262f18471eda27ebb5ace095864abe17b95f238c0823dbd11245d89c195eb9ee65f6f97819def971189e43354d4fd811fce3c430cbd4686e50e562ab1e8de214832db1a09a64f9339b8f6dcfd53280a33071e89616148914de8b456408fc18a9f46f61a782857b1e11dfb5f956a5889d60c53dc826ab92153cdad4d935ccd978516c383371352f63edb7211c3da54cf2eafb7ee65f6aa98aa7813de42ec43a4e3c91bc2eac8cbd27fd0a39f109dcc94365bb223f9be11120a9767cfc73e2c315846b675f5e1eabad4e7a970aada798993fb2b11248be37b451a6f8be3ab93dbb0b3a181c49f0b43b402f05221bc97a6c2b5ba9d1e5860a234cbd2c7dcac97ff395ea8ad34229c3b0624eef42f611f90449476d76e816fe391edb539f9adbccd9628dac1e8925 TAG: d4c3aab4d275dca02cd7912eb71daca0 ring-0.16.9/crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt000064400000000000000000005345611352416253600225730ustar0000000000000000# Test vectors from # https://tools.ietf.org/html/draft-irtf-cfrg-gcmsiv-04#appendix-C KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: AD: CT: TAG: 07f5f4169bbf55a8400cd47ea6fd400f KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0100000000000000 AD: CT: c2ef328e5c71c83b TAG: 843122130f7364b761e0b97427e3df28 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 010000000000000000000000 AD: CT: 9aab2aeb3faa0a34aea8e2b1 TAG: 8ca50da9ae6559e48fd10f6e5c9ca17e KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 01000000000000000000000000000000 AD: CT: 85a01b63025ba19b7fd3ddfc033b3e76 TAG: c9eac6fa700942702e90862383c6c366 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0100000000000000000000000000000002000000000000000000000000000000 AD: CT: 4a6a9db4c8c6549201b9edb53006cba821ec9cf850948a7c86c68ac7539d027f TAG: e819e63abcd020b006a976397632eb5d KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000 AD: CT: c00d121893a9fa603f48ccc1ca3c57ce7499245ea0046db16c53c7c66fe717e39cf6c748837b61f6ee3adcee17534ed5 TAG: 790bc96880a99ba804bd12c0e6a22cc4 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000 AD: CT: c2d5160a1f8683834910acdafc41fbb1632d4a353e8b905ec9a5499ac34f96c7e1049eb080883891a4db8caaa1f99dd004d80487540735234e3744512c6f90ce TAG: 112864c269fc0d9d88c61fa47e39aa08 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0200000000000000 AD: 01 CT: 1de22967237a8132 TAG: 91213f267e3b452f02d01ae33e4ec854 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 020000000000000000000000 AD: 01 CT: 163d6f9cc1b346cd453a2e4c TAG: c1a4a19ae800941ccdc57cc8413c277f KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000000000000000000000000000 AD: 01 CT: c91545823cc24f17dbb0e9e807d5ec17 TAG: b292d28ff61189e8e49f3875ef91aff7 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0200000000000000000000000000000003000000000000000000000000000000 AD: 01 CT: 07dad364bfc2b9da89116d7bef6daaaf6f255510aa654f920ac81b94e8bad365 TAG: aea1bad12702e1965604374aab96dbbc KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000 AD: 01 CT: c67a1f0f567a5198aa1fcc8e3f21314336f7f51ca8b1af61feac35a86416fa47fbca3b5f749cdf564527f2314f42fe25 TAG: 03332742b228c647173616cfd44c54eb KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000 AD: 01 CT: 67fd45e126bfb9a79930c43aad2d36967d3f0e4d217c1e551f59727870beefc98cb933a8fce9de887b1e40799988db1fc3f91880ed405b2dd298318858467c89 TAG: 5bde0285037c5de81e5b570a049b62a0 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 02000000 AD: 010000000000000000000000 CT: 22b3f4cd TAG: 1835e517741dfddccfa07fa4661b74cf KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 0300000000000000000000000000000004000000 AD: 010000000000000000000000000000000200 CT: 43dd0163cdb48f9fe3212bf61b201976067f342b TAG: b879ad976d8242acc188ab59cabfe307 KEY: 0100000000000000000000000000000000000000000000000000000000000000 NONCE: 030000000000000000000000 IN: 030000000000000000000000000000000400 AD: 0100000000000000000000000000000002000000 CT: 462401724b5ce6588d5a54aae5375513a075 TAG: cfcdf5042112aa29685c912fc2056543 # Random vectors generated by the reference code. KEY: e66021d5eb8e4f4066d4adb9c33560e4f46e44bb3da0015c94f7088736864200 NONCE: e0eaf5284d884a0e77d31646 IN: AD: CT: TAG: 169fbb2fbf389a995f6390af22228a62 KEY: bae8e37fc83441b16034566b7a806c46bb91c3c5aedb64a6c590bc84d1a5e269 NONCE: e4b47801afc0577e34699b9e IN: 671fdd4fbdc66f146545fc880c94a95198 AD: 874296d5cc1fd16132 CT: 9209cfae7372e0a3ec2e5d072d5e26b7b9 TAG: f3acb73908e54cddf7be1864914e13cf KEY: 0b6920ce07787f86743b275d1ab32f6d1f0434d8848c1177441f195495860f04 NONCE: 6787f3ea22c127aaf195d189 IN: 4728b3fed1473c528b8426a582995929a1499e9ad8780c8d63d0ab4149c09f572c61 AD: 4b4745914474e7c7c9882e5386fd9f92ec48 CT: 8ad7deb4be91cdc4e75c77de1c746d816212b109c5a485c6cb79e3005d2e94355104 TAG: d71002b6a9de0addb173f49e34edab61 KEY: 9c8fde2be2cf97e74e932d4ed87da44102952ef94b02b805249bac80e6f61455 NONCE: bfac8308a2d40d8c84511780 IN: 82355c9e940fea2f582950a70d5a1db2316fd568378da107b52b0da55210cc1c1b0abde3b2f204d1e9f8b06bc47f9745b3d1ae AD: 06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb CT: ced477a00135f16006e100b9d7521f9e1bddbc7d339cc41333abe3cc79dd8e3a18e310dd1dd53ac664673ab9090d5dc07b4859 TAG: fdfb01ef873060efc7c3c32adf3b46cc KEY: 6de71860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f NONCE: f901cfe8a69615a93fdf7a98 IN: cad481796245709fb18853f68d833640e42a3c02c25b64869e146d7b233987bddfc240871d7576f7028ec6eb5ea7e298342a94d4b202b370ef9768ec6561c4fe6b7e7296 AD: fa859c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac73c535de1 CT: 01fcded8e89997d446236c8e3a77ba755b85b9b5ab8fa8f355be587a3954c4a4231a7c8c198b72525ce4304125a4dabd1574453437f6584790d8cd90d5957b0d5c804a6e TAG: ecb5e6b6e75d241c221a2f4dbd7d0448 KEY: 92eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23688089e5 NONCE: 5540db1872504e1cced532ce IN: 4159b035277d4dfbb7db62968b13cd4eec734320ccc9d9bbbb19cb81b2af4ecbc3e72834321f7aa0f70b7282b4f33df23f167541ac15c8417abaf17a282ac7a57252ff224ae7911a905b8c699b20e40c1e9569a6b2 AD: aa0232d4b10bb6f20406135861c19795b95f9597f9b72c20931c41164f1b469b0901f2b5da3a956a6e278c940e CT: c49082d9a1bb49356f1a9b75b443832a56387066b617b939b60381db47711bfd174324e8d20c9713d562fb8f5c698dab02b5c00ecb652c182ac5544648599fd7fdd042009ed44961efd975972ae3c9aed8a4f58ddb TAG: 75639e5472bec58e96b358cbe429c4ac KEY: 82593eb58f56f6d3681fb00dedf7f612c4cb3193b73ab35f9a5a9cc8d13aa27f NONCE: f1dea3b2a7d832ed8ab959d8 IN: 2ee795df8e1ef530cc6fd9a1f10543b44c49383921d74fe0c71d50da4adb9e9c7e5491a488ceb5c384ebafadf0f484fae982019a8ea22efd1358adf7ad4f5fa0d2acd2f1ee095cdfc13310241243fa53b8c2610d1924b1d55cb6d9cb6a5b98a72127255967b8 AD: ff23623c5453e61cecf9e624e5c803250c382481d3c10febfa54d03894ba8f9ed72637fcf5631f7b7312cc74e6ff63ecb240349a575f CT: 6841f9ffed11d165b18917ed0aeed507bfdbea3a57beac2f2e08625e9929d3f2d84373ac3b21813f7dde1b25c93129b541fc640e09f5233cd9f0587edad70b73c423011cccae55a9deff9f29308fbdfc9a73f5fff4a7b0ad308ca9b545223adcf724d3d8b127 TAG: 479bf5015121d25bf2346429a5c569b4 KEY: 2cd817f2afbaaf21815bf08ac1e8f87520244b4a3fc492c7120296607ef64d0a NONCE: db4c74b73839e13455fd91dd IN: f7f81d460034b9c41eaf0cc6040a84e17e6108372f1ca50656793554ea1d05181310711d0e60d4d556b2bedb24d7b622c01fe8025119ae0c8a20b679dc40c9908f88fecfafd688b0ebec6a2ac13421012874c80685c481b41323a1724ea96c1df644a595e8cc73955e6f661e0fa30737d78e7cec11629b AD: 8f1fa4bbd8e8e655f50019859514dbc4cbcf944f95084e45337d9d9d8972bd8da92b4eb5a75c0b284305601de859f8d1fac6d6b3fdd42210fdcf696119e436 CT: 97d729cde56ec1f95bfbc16ca5dec6a208543c3255f7a2b97fbf5fcbbb34908ace9ce13bd9e90474ed620715a5e9e43c34802b85feebc4d4a23d1bc8b4b5a6c11da7158765c40d2c863185c5551cb2b10eb0b45c61b939f8274ad84fe0a74e163bfd6afc5759946362adc74b4a7f705827323f8291ec38 TAG: ea1c9094241c5b75ea880723ccb17ca7 KEY: 006a5a863859d5b70806197fdb9f0da3e4c31b0c7545809808bf7683757cd11b NONCE: 9d0f8621664df31eb95b5e17 IN: 567d680b1a26980772e8ad3e9b2e2de537414368c4f97adff1408d36c1dfee65b78375c7361c91452e7d463338474a400ef9efcaa648e93f38f8784a1598bca461211195d7844de56b91cccc96d89e6471bca6b7374aa5ec4b2f5fba66c17a435970411f2af3d6e33c0d094f74fcb77beb6cbbac1f3a8a19f69ca087f94a5b80d5e3692e0d10ec34 AD: aa67269c824b382d6238bcfaaed586177b852f816c31e9966744188f02647d881990d98c3eabd477557a739262bb3f682f64d2208faf98097586053a32cbf37e CT: 85f7411a7f8ab505a7c10c5c1fb9bdabcd9a7826465de96e3b7c762830ce133b33d8956756ec29c00b429d30047040043cd5b3bd87dff60e09e4d7c3a95bcbfa2603ac964be32a82250741e19b6786638be28709ddeae496cba7558b7acbc5545b259e6a1b2ac1f5135f5719987dc547f97f68ffb7b9eac892527a4bf0ffbf59f77327ee763c54d6 TAG: 3a8cb8fdab2c79aceaef6680daaf3ecc KEY: 78413a2d89613a81966e8d654cac0aa34107947a036f403bda53e74bc524e7bc NONCE: 2d2c51dc426b38c308cc5748 IN: 39129e5e6251f41dec9cff7ccf256c38e4994e15ca976d3185ae17030ad3751e56367f86886acc32e27fe04d0b89cc89b0206f281aa2d80f9be19928dabf07417e7659b17f09c56d170ed1ef10d2fadf01e0c78473d06a1685ef0bb112e4ec7e6ce0cbc601fc8a2dd64045c8fada4a28c0c6f0ec98542e365279d00ffdf5e2eae3b663c4b79342f2f265db30a86d6e1b325318d7f7a622b36e AD: 746875b71165defd5ca1afc0a92db6ef4fb9e20b81018a5293899f1e0d06b18a2e65f7616638f79a0db3f2cfdcc0eac2ee1e2e454958e2e6d214a20ad13156f97d0f2cf4276b09f594 CT: 142722bf554b8c70e8e76e52b9c0e0bb19b618f7bbc7ffbc91a66031f418d031d3c111eddb9f1ff7c2e64191be8dad4f8cd175079d2ada20c8880d0565c56afe5c9742753cbd50b93620b081f0877f045d0be91ff05a603fdc87e1940ac1e1f0c9aa96d5aaf4a58e0393ced4fad8e83171fa71c397817cd48ce6991e3b73d3356ef0448be1bd8114feff5f23db3b9cacdcfb4d25fd4dbfcae7 TAG: e489f6c52120c8cfdc0f164b3440de99 KEY: 5c11f6b20b7bede26d6c2f0e5cf2786eea66e18d6ece02156f9233bdfc57c75b NONCE: 1a8a8b1f4ab85be5a4a089f0 IN: ac762060a336aa502f5a1df1e0a647fb9d5d932dc0654e0725122f6a567681a7d1cb7625ed0404d540d8b3145c911280d2a0ff9d1c53e27677be0436faeb39009fe5751c0b37c7a5f1137a26995577faa109071bee1c87d5e6772ca55fdec02348a625b49c3c881aab162f20ba0b834e8159d9bf20ee0c5d14da0221961c4fc7d9b44c7822f32298d30775cf974172ebfdb36cfb2881ccb15e5f69ed27880b920f4a092815357e03d982 AD: f75590af08b447f0f8466b031ed2409e9f5eb479affd9e18017a369486914c63a7494168d91df157f5e56fbc4ab6ee5a8f3af1fbe1bf9324338a1f4acad45fc7137676797c89620b15feb8512544771f280f CT: d8355d51bcd69356ec74b9b8657cec57335731cebfe83202c1557fd208480a2c25747625bcc70533d1ef75d2bfbeb9354066a8650f59a575e836339dd45d0d8a5cac221954b77cabba5e95da7437665fe9b48257148b7e8a88cb2cc4e0912f511aba0a013aaaf09255ec13b27cd9cd05ea11fe2ff21c9ab8a3fe86090dfe13166b172ba08e76d30ad48bef0e2325da08835ecc468cc40222db0552834ae94458366f28f6ba63b3e656bf TAG: 0c7f16d3294d5ef185c2d06ed719ed8d KEY: 322cbaac9c4d7cfb4c326824825ba5b5f5190fcde0d399ef1f52b82abb5a8b1e NONCE: 5f2eea2c79702dec4cfbee3d IN: 1f5cc11e085d2254f8b37f8030bd285d6aa1cc53868d18ecfdd963153485dce5a3e3e8cb0a3cf8074571f7a2e9e841229466463f506a2bc90f2d6413128efee043e01eccb930fbc002563510e499457161083ed7997e58ebf03ce7ed2f8d5487936311922884bfd31cf828f3d0ce78f3c6981932268108a369048cdc0a75c062c0ed02e27bbd11754e621ff67c511ed98c6fadc3e95e7100644ebe1aa147a7e99f25ce5c2edb8ab6446749441027a211b8d04a6247299dfea9d75e AD: ab257a625aeb51f74e0b47b302fb5c0475ab23e99f4d93ecf07694497ff6b27c9848805af93a5615bc71486b26fc9da67cf60c8d3a396bc0164985fab2c64bbaa4dd0fdc22c9d9e433e8c70dcdeeebf230c7a3cb3e5d0d48573a64 CT: e8d083e25f9332d30bfe60ac071f502909b26393440a848d1f81c3f5fd521de98cd9ad1fc3e806724f5b3732582853cf280f1b99cffdc6b46874d42adb8784cf9ab8e158531b4dbbd76391d48727b585fca0610777fa8ec6a2a7f070627f1ed254e430e55472622289f44089ff22f02b7f3c5e45e228b7b03a5d1e1abdc18b154124f8cdd3b2229e4720cbc1bd3cc3f86f3a6a745de0bffa2536027ee03d447b306ae69b1232e964ca27a6d252c1582422c99373ca2b9541a27081 TAG: f6b8a72d4235589f7811ee1c6f8d2167 KEY: b068daf90f56b15579767ecdd420c0858fabe23abc0b313b97a9c1ceddcb59d5 NONCE: 322e47a85cc58e753f00d6f0 IN: d032d4c5110c8f22e98895279a30a86da0ef71cea6ef2738fe3e747ee54d2e96e3afb8916281f6369ab1a397ca0a18c6c0e9a0c4edeaa4190ce6422bd116ac254a12235eb66fb5cc7ef55b721d3d2db4c67c38bbbb0bcac9234ea7d733f200e6b86fc55f4abb9b65ee1897c262533cccd118b0f493c849a7aa7f35d243f9438f1858da62bdd03fd5a8c7b01d8097d7ce319a41f80104968a46599e9a3289a29a16b245877898f345f92fa70d3e613c38e6e4ebbf0bcb64c1c41f8b83ec8e9f159d4b830d9a1b79f2ad90db06 AD: 7856eb8621e52ab3060e8d72dfe782b62364c163fa00b49aa6fbe4210fb7208c642b7a6735b1a8b2f1dbc4b3d4952985ef207a3eb0a07b1341700762e9f9d1c3438fc6633da2fbade15844cb1813d258aa5bfa4ac129d693792a89622a0c686f05d87019 CT: 00d34f899f0a8b40fdfe9fcec98a96c5995b4524b144545026aaa55f629c3befbb8ff794b726e759e18b7198bb2fd2a866379418e6dc4f9fa9e4edc84d21454a5cd212f68a7df321b18e9eb2c537e0cf2e0bf65e80218b841ae8a994ea3f6832d667430dc314567267d7f31519fd856d73eaa1d3bfca419abc5001b25cc1fdf860812b077fda4b01abbe8f8a81a16ad2ab5d9299ea9a0d81aa26e1a573504d5fbdf29e6b2098ce975f2f3c8c212939569c8ea8ed63c4847f2d0fd16f47bcb30bd7e00956ab8a9deddc54e009 TAG: 6152a0401a33257c8148e65440601d5c KEY: a266f91387d96bf2baae0262782b9c23162f5271cfa3144265deefe2c569e829 NONCE: 11e842e5c9ae8fb79becf42c IN: 3afe389acfdc9a34bec7b45705ba68e205b83b33f50b7852fbb7f4ae5dfdfdfb3cfee8a03c96a036388aa8f7809bd47eaa073f92905d0d5f199d466cc0ebd9bceb207f4209bf9925c6109973194742dc8d813f3cb212bbd8d92d7eef645fb0f8245811876dee5f241763edaf7d79c1b83d973f9ba3b29a9b9408418f73743ff0546f0d9290010cf3a665c443b85255759ec6248021e4b6eb825c398b5af7b5257efb7afc481abc20d90249bed5b30d44f725c78ad0ce2821f86838874dceb6b6207ad6fa34579126de720ce34bdfd2058d92b8bbbb3f1bec607de3f0a0 AD: 28d8f6e13d0d4d2d3861e1a26d79cb68d3fef68127e8458eb599915022da751e271cd047cc712fae5b0459ae7815a24f4edf806889fc462c83181111f4de5bbb7e66a701460f508eaf73798c3ca9c08cc1a046472f4b18c69b7ed249a96f9bfa05a276499a5f499c586027c64a CT: 11bd92445b4e43dca339491c8100cf933795ef7cf4c3c4d6c42ae5b729ca22869d443505fbb49ccd29b44046569da104f7ddaf325e71e7f30487e83acd012bd492cb4e98342ac7d64843eb499744b3d17db402d51b5bf8cbcb8995fad4a81dad4221ca30ceb3590df41e124c327fd31aa53c86514a12e22c477489871bfeb38cf71cb3a959f4167402576f142bd88b1221281a94661c8d643f89fc92dffef322ce97f8c19b133e55f8020232dbdf42e4527d9f133b8a5934bf0a2df3754d6455a9d765182691ab94ec7a2e68f3ff59805c7457428ee4af8388f91e88b3 TAG: 8f1bd0ef9d08299f494054ab9409f663 KEY: d6a68dcb52a50aa6d1b1d4d202e6f184f01daa08fbd643523f4f73ae6b8d764a NONCE: 7f567087a5fec5ad1ee3e4be IN: 5b677b87109e69eae9a635ac2ea185ba08ebce3ba4be06d53b2da081c5030f5a746fea7bbdda340e10eccd47238340b9244b9442c0efae7644cff53c7abd8445163e891cf30bc8e26eea01f0c461b4796c2106e1ffdfdd1bac29f7d3c72c8ca7f625008d8d333d2a2092c08ef83c8002ed90e2ad01dadfe4cc0681384b489f38d25e83c2c563485fb361f81d44aea205e5bb4c1912d00d8f99f8d7a931e55ae72f749147fbd97699ec730bfb01b8261f1f94696278fc703263cc789b283460af9d74647a8c039ad2184674e78f6a355a26eefc6fcd4cd32d96d245d583836312652fd9e6694ac5644eeb4c2bd667 AD: b52e5af14bcb108c8e277728d6d6116e8ed1981993771b8bb783bb351982f9f8c2a0e7c20a5a863c6d71b7145b73d7e6d84d47780d66847244d0b8ef559f2297f39e26501d8a2aae8c36189580292da842c4d0d06a21d21ab175e34589e3b814d8a00ac1d8a3b2eca2a91b21e36c55fc6dad8c0a1b2c CT: ddc900dd582d322c567e3fd7eb23069b9e559bb16639cc79ffc6f3deb6e92cbf71ee66c839b4115e883390646245a42480ae6c638fe7fa04b575b4a8341050e2f3de075f2f19ad9b24d9cc1c39a659b0ffc362d46354da6bee0e41319221cf7cb160017d589413e5c1f07e5f626c2a1f8ae9e8b9ba0320a2de9e1b5f7baa4d551c090521d8ee0b30c8c709fbc00f1fdce999f1f96883e3b83b363cc47665e5a21fcf25afb6aa2bbcd0a374618c3dd8b8f97f21037946dde9bfdc7e907ac39e64f1a5ec8dda60a47148bd066f907a25b9caeb3804c0423836a8d9c35bc58c57882c5b23e00c7f4e3b1743cb14f102 TAG: 8ac7e104a0165df543c7454223a01f90 KEY: c7bcb2108b2e21fafeaa26a2d4881b183b899210b474bdc43a8f0b8464075d86 NONCE: a2ba1e9cd195a8ecadd31587 IN: 0d5740c4e22eab0783de87d541fa834647c3fc6543c60d5df31c19c6ca38707649fa8dcfc3c0ccc16b1bb60283d7ae2778a8f83ba07b905e23cb06d5656f614f1efcb346f34e190bcc636cdca229b64af9ae4b1f05b58f1ffd1a077a51bbf9ede69ac3954de7daf569cc8de12282cac09b9a49dfb92dcc409b8c63f2ae4a34091633f4aaf225aa02ba9c57b910a76535f0cba67fbab0e6fa0bc876217fc9a546a97dabc9be41209bdb582d8d8a62865df7398d4f7e9ac681bcd102e31bfd40cfb8e9352b1e8ff7a7b81cfe2a62849e8b77dcfb645d2046404a83442133e245bd1df35d69dba9ee097dbc867cde7b431565c72fec31719318dd27c3e47dc5f8 AD: 729ea794668d8724a1d4115adcee0725e4c1e3ce16ed9e31bd5a409cd074c0277e21a0b431d3b30ddd361ecd176a8d86927c2f6693105d7d3c47d9be8bd90d0b2fb20587623b2e838624b590a5c9f0e6d519b35eb5332b16bd2c2f9534e376ba68316efdb963d63e2c87cb0716973297d986bbd885a7306e2bdca0855447b5 CT: d0e58d936c8b83c253ae9bd29f45afaaba9712647b3da6c6ffd40a9390a4476a0e74a2f2d458c88056bcc0a57fb64597a7c8a5e2be39669dec53c6bf0f7b4a2bacaff9aef36b43fe37b80cccc7d42cc283ba1c1eca739167c07754edec14375d86e88668b156d04c989bcf3fdc70e8a25aa3e6052d6befe3072ec0993d6b520c722dda62b6879324eb4ae016e54d139d816be7fb1bf9c0168d8f7225bc8ed9b7509b45cdb2c8a1db4b3619120c824d0bad7deb7fd0dfdb3674ab15a712f6196a5a840ee8895670cf3b20b8a5e43caa41c5524bf47c2ed4ae7027c2b566dc3e2548244057b880da2a3f1abe5e4eff090f9358970da6568bdb5f8288f9d25829 TAG: 057ab8d811b5c3819781752230badd5c KEY: 7817285801341c10baf67bb5f71b75a11856d2551eb47e60025a0021b9948afd NONCE: 8818888585a6957eb59680a5 IN: 5a5c42458f2d0e0f39bcbada0ba0b6e72340193500e22d243e32be0e7d7bc5c632ef3dc7e79ad5acc895cbba3111d8d1faa69bfe2ce634fc0d7b12242dd8bb105c6ce54cc9718921378c906ff5e61f48fa259b25bd10fee96856a206a928b450a0098089d5cb7378c2935c4537172076d829975798d4f24ad243e4aad474fd5e59e25a6dd133944918709e33f84b4daf4bc6d3ba1e0b9e364dcad5834024066ab5c8e672a999bbf23a83956623943e0011e3a2883d23a767b280ad84e2d7fe5811099395edd269077162310481ff304128271d4ce5c84ea738fde318cb2528bc5cd448c67837cb7dedb632d47e8f90e351b0a8942da2f78e2065cdf827a85f51 AD: 0e22156bfd971ab3f123e9774bf3ff7c224af19bc79e812839eeb3f1c14f89e5666c16c44a5483efbe449237508ab2436939098640931fe3b928cb3a9378b6b9fc2a54c6bf59f34b16f06d5ef132ae2a7161034f26a6e07badc61ea51a94a20e4692a0a0525726f3de9bd1d6151fa6a0ea3acef3634847cfbc98d2e0bb9ae89e CT: 5eb6120cae6df4766b40ffb4d204ade5ae08aa2cda263b39ec7b47756ed7e6b7837fdcde8d01a2bf01367e9398e25991f9da11bc9f8de8e6c1b4e922af05d20d683edb4a245e22eb6cc4fec2375e8d81f9f27af5f118a16fde654b4ceabe770fb3a00bc7a88763b670b5e3a6ca06aea1824e20b9c1a304c4bdb62643fea73030ef6d18ee2e22095b4c73abc51abc4883f2bcce14033608ff7e1ce72ab3382c29069eb75426d283a4a71348123be19f480dba1d1677055de9e82d683c2d6413a6a4e0c6d58f7f2188ca5c8b916aa49975b80630d27a89ac284b971478376ad6e55dc64098951bec2ca7d77ebe790b1ed7fe7f33fe571d8613f143e3d3ab6bc613 TAG: 6f3f79c6231d7e45ebc1ccbe5d110a0b KEY: 4f91a78c56558ac92b4f33fb1d96b1ade26cf4b2fec779bfbf6709e531ce0e62 NONCE: 19f75c4c31873d4915b1af3a IN: 51c2ef5e89218ac4060dd12be216654eff2991e8d7bce6f6a437966f80c59c527679b8983e75c617c917fa9b63bc60748f5ca179645afdfe6a126a73d3fbcd41a9df6d734e8783aff3a5134ecacbb289f93febbd8eb493693264026f8678e9fdb779038ac13199459caf9c4e86f4cf8306af6dc04d9dbb678d3ce9e41d154c4c1bca018bbc4d744655af04ee2cd524db41170f0946df225d156dcdca3e52139561b61c26bfc56bc90c21cffa69468863afb66c3e1524303f8f42103e435fa2fe2c2956feffe5b06ed20bdba730d675166f13118a193b06d7985d54d46e4150468df1252d7cd144afc99ce99b93ce9526ea4dec2cde1d0d72fb82f55db65ec2035e387e7923d98490cacc793046afaa2e49 AD: bed34cd7e4eaa52e75bac5e86f9e9eb81028cbe8a515870edb9a151334e1f961949855565abc51af9a1bbac0222e9bd217d3e3a642b0f3df8e7c47c2c9d5a801cc8028c425b3becbe31df39d30637c38f981d268017da818010189c93d2d135024f239407623496c5435f04f9cae86e63ef46fcf9787c946b400249d8476f82dee274cc0cd3714973f CT: 27bf7ffbf2c9733c3da8947db11ac8801475451b0a65c96a2a3934bf45ff54fd5fb21ff0d51c83ddf0f49b005d424620b04d0c731cb214f4beb6d353a6d6b7bf1a706b070faf5146b562c9f4e6c0ba5dc9ef9ccde79cd162bcdd887dc02bc95e29dd606d22845f35d0cd6d5eb1f1b154607c0c5c2e8c7dac005eeb17c238e3d4d1e1caab72b20a9d7b2676e6491eb84e9cab903bb0c05751a33642e145de8391ca9e598ffe2e579486ce32d5d76a35d440836ede088267e8cecf4b660fc5eaf05f68872b6cd9427607b146e15fae406ae7089ae446cc2172b8ac9e42cbc27d4e5ee38c21d3fd6d4d52b2d43462756d93995b9333a079dc1f2bea9ac4248c448d932c5c0f6b76da4698d15a64f761a7380b TAG: 7efb02056e18e98960cc5718edd07cb2 KEY: 1b6e0ebc443d681af25ee26a8ed475136ed8bfaeaa8315a4cd198961518c7bc7 NONCE: b15c68437005a4973a068187 IN: 38adcaa250949af910aeb807096595b3af54bacbedd966f83f784f651f7a2044461a94f1a6925e6d2064e72319dae75d3883a50afb6be1395d429f24029dc9b8cc021f15e305e5418d844aa4a89ddd299bf2e8c698a8f6a6cf0165c37bcf2e5885d73bb81ca15a33ea75da5946678dfcd546d475149dd1a2dab0e11cc8b07c0b06105a497b1fdb1a720b9510d7d8819b6d946dd85c73be515c6ec00a10a69661c59fcd7a005dd08f3cad722bf3560f356c624404f3be55a02b3301ed756f557a51593ba90d18a1c13e227c8d5180fefdde4957484dcb81d08ee3331a6fa74c9c549ae13b2dc2a80ca0435710eb9f0dc2c908d896957b87325180d397c37ea7cf65db45960c4d791bf8cf798bd7626b13bc5e6b45b45be1a8ff687572ece86d1f5361 AD: abaedc1a7f9d9ff8003bca97af7dcc42b4399f9da4a0e7e829c0e12f4d41607303f60d1df5949fca0dd9ef171678e013b88789ac1f51a8160687d842c273a2dda93c5fba1eb5bed7476ba96a12e70cabba43d509b311e9d000212c81c483b7e9e7bae1d9869a125558b2c7ef8f838bdfe97af413b460bd9dc5e372afcb105832ee4c406d74781d3e9f2aa581ba4fe458989a CT: 92aa5661d04af60245f6f56153cd86c6a61d5584473979eef596d6d0c205db9e4d928ba4827dbb08d5b34946b8f3e58ff62a976461ea5639fe2ee79839f99f83cde00e3fa3258e21754fa91a17e0d1fa22cc76fbce0bebb7adad09f99bd12e70e519048d96c1f97a183d8ae66445e63a4a1f936821fa7b58f569a16e25a0d0b202231a79eca0e8a2ed21755f496d8b7a9f59f6bfcf47ee4bf35788935cfb1b5ec2af2ce11c002b2843090e2267d5fc5e26f927e8836d6a97dea2a7e508f82a4cb7df375110217f88f4376782626039af166b080e181d8a310ea7fbb4fb11d5b24367f63ae83475269281aa09b7bd259a348fca28f2e1d7938127c888c68bad2608f89a2440add0c644de2b5f08d3477641675cdb428393758317c273536942caad42 TAG: 4a43c15d469378383e9a9a26dca7083a KEY: 03679744edb73ba31c7d9d37920d4d57a766104afc9c96650e5a602ba885d207 NONCE: 8f1c67d44d6e86eff0c96a14 IN: 6bad3420c7dd0c64d800ea5ab7ff472d0f61bdf2e5634e06cb4f3c022dff8c4b46f2a47fdca2d04572b67f24125c66a551a1f150a02f635e1e99895807efa8001f46388365c48e4afe49c04f6681510f7e4cdfa02deb3e60eed745cf6d7ca6b773e1537d057a043cf517e5388dbbc44ff4bd68d2a7243587f8929ef07df5d001a6099bebedf8f26f49323209496d50109c383071e4a61ce18f495d98b6c4bcffd0fc2496b7eb0ba612e2a4cca8eee2a3daa0c21d854d49ca73cf5b24b38940dc2b44a2a6623e8404fc30c4e3aaf759425ebff85cb1c661744adf34c6c5d538f3210dcd0270a3d12784effc48734b53c1a228db291e2e5573b6ba2aed0a7296c1bbfdd1f4a86d6057d5534675a3f4897fe3a1200c54af7e09b97b0a2ab9f25d5ed375e7bac921f28f7b6983a41580362dcf0820 AD: a2dfe82989ccf0a998286623617453722bea0b6e8fba504b93cd043c7e6c7cccfbccea43f7e87502026f94cc7035c5e84cc14a5fef9bf2be53dc379053725a9a29c4e86252369bf6dfd3cf2801af7447fd0529e94beba961ed65dcfd492398123faa55346edfc3ecff720966b74fd0ff28f443ca67f88b8f5a4a73007f79ef782bef601a0827888c4c74f7777279c625de8a4b51db94f94f846474 CT: d64a6980718a5fe833da2e6c1a119f2f16a5bf3cc5089168520603d37998d5fab07a9e18ebdc0b8417cb6a4d34357f8d598753affd51e93b451269dc24354d197885ce9a3b2f575fdc9c572b05bd7bc8df091a6675185ac15bd1c4f2cc0a8a412ff72baa6fbe95065bf2111910f4f004f6c39cd8e7ff5bab5f86abdb231406763233354734807fe0346ff6ad23a1c9c81b9942b370e02bd79eacf703ebcd53a54a5782f13ad3591801d1ece15c6deb56bb5e32d959ed1363875c57cd9d42881dc1799e652bd554059ce059a9d00a126de35f0285d5d82bfdc383b1b37d77cc1180184b2180aa35d46f816fcf125c9e8e3bbdd67c8770da26b89c7e406f02ec515edca3910de72fc76ddad8344ae36fec1d72315e1a568ee69a08154696e4545ec5ca53b3c0f5ec9cfe82792380c1b9a151a8d6 TAG: a258557d32e1924b3eafceb7b73e43d2 KEY: f8563001339afb3db339ab997cd1eb1eb7b03b228162a480e129c66ad47dbd18 NONCE: b4c98f6d51fee205805a50c1 IN: 63beb176b754366e13c57c18433228a81089be18b534ee5f9567d529c802d34bbca36807bf845a9d14dd141c5de85607a4b4c5521e5aa717f78fe78612b770a4677cacd77a425e2496ae50ab2e559526c37ea723f2b8d14bd8314e4cc3727bfb835ea4062e87870b13d94d52c25f0c631668292f184fc048dfeed7a9d1a88cc5c4662030700cd8c257784009b4da9039909f73840b600eaf670cd4d988845b1d41cfeeb1ea740db129c12f66a74e6234ebccf4df706ed30fc736cb5cc0db17ed108229e87d6b039da5c4f0568a4cbef9d513dfbc0af9313f02d5129cf616487934f741a0a60bf11fdc8d29ec81eb37577726f54f3e35bb10ef98b1d15bd5726fe501a9249e409eccae128df61762447962ba2a63f30b59ea25e18895d2fd11431606caf6b45b908b08cf2e150c031e20e6cc649699fed5785cfc6a0e22bd8bd8c6d25221 AD: e9c9a8d2869d236388fdcdcff990cc940ddefd06da0524a351ae6113b29db9822adf9cb548d92f23e3951ae8522ab113579232e58578e80bd2fe3e1d06414a27ce0ae2e40d87745a8991dd5bd2e8ecbcad8b903195c15ac2eaf9bfe0104bae32f772a7d7416c5671350524419a6df6ed5e1df32b961ea39b164eb7e1353b046100998ba6853674ebd5ba011691a270c046096143daa84752f872e1ae32ac07c4f0d2a048 CT: 2ac34bf9d0d909a32322cbfb765875297c50110ad859857c641ffba8efd60ca003b8f32d157b6fd8fcfb1c6037b13285be884ae2dbcbc9194e8757560807a14b2219b9f2dac11af7dbbb2f504e3d8ad47ff73657a4d1283c78bcd410acc1399a529f239440db4b72a48bb3ed984565d180015fa7ca9c0ff0281a2e14807cb90631c75506585c18cefa5cba7e0c943e44e85f60d47927339e3685c1fbf1bf497684a6075e0984ddce22e9c130d3cae99ab35394c315bf8e1040a830344c63d3719cd250ce04d818df0e20650f66613439c0c5153b2fad41e10b296e6fb0feb8977532079ceba9361227f69005c9e696f9b04d724074f4aae59dca55c74e87049c8f6bf1b8642e7c4dc73688260c540be50e8d4997d4b68346a0ea7749747dc72e26ac3bff58802cd60e63b3d8c509d0ce0d9886c50ae7f3a1621a077db155ceceba926919 TAG: 67a891187fe42bd1bc7a6037513760a2 KEY: 362d12b108943a7007bb6cc117135b165cbf42b92df2f191f06085518ebd1a9a NONCE: 2efffbc936ddfedc527b2c9c IN: b69345e0c497cc4951aae5be2748209607a51a1380fd389a14ede9cd4cbacbf822597b1c500cb0549f08a35bb0b1a00c5e25c175318dc771b03501bbe45fc52b2ceb4c04b8213fdce3882e0967ba268cf786ea0acdfca0a7f3f2f4f9ed5f499ff70230158adeb5a741da266573742c527bcc8de42747df891f58632f92a110a981a29052bd17979be21e53067de3baf4c34bfbaf56ef5b3171efa1ae60a1a51f51e0fc5b726bbc23a67015c35a1be5dd125af812b7661106827f31a1e4c7e0bc265efe59c9d6620387755a0bc17a11527fe136b765895e6386b9939c548bbe6d3b35eb92a90c05d0931e5dabad4d42ebee5af45be0106aa68888375a2619f7418a14570d1dedb76e8ab52a0a87eda2570d2c1d903ed9ecfdc62c23c47cb7e234dc617af0843a9f375a58f930337a88379b2b0553c4db974ad74eb46d637ea4e7c7aaafce16971682b772e1d85bb4a7272bc56be9bb AD: b55625a5085e601a5dd60701bb07f69c755a57808d022ca0a407bc3d35c848d6fbfa6bf816d470d9a82d43511c13fd0f496e59646e65c84d7652589c542ae2e73c5b7aee83b9ee8381af1ea1f930444676d8e3335b271cb354e9cd3b17e7f1511787fb618aae930c14cd302bdf3a55b2bb12a61e7b930dc39aeef36447bbb2f4d9f5fb55797627fe1d0b94c04c6817de6cf1e7d6e2660c6f49c0ab4b31cd5b367b912933d3d1f0a6b8b9556fc6 CT: ae05b44cd3cd86c828e53930c4a80e01c59a8c1c9ff4b327122cfd325cc4ea0ef4f70e3ac48ede66f4ba7fae9024dd5d78dba260d06f8888aa236e7de50f57ef48ee4b553d42b41ccb8716c59f69f30afad97778f3e48df1d5a57aab3d471fd5079633b3972e2703a86c4e24d0a035b3625a5c7380b963496f9439542b15f4013002445fba9a9f4e9f1a15c5a6bd2894c0f540d264481bd3fb6b8b63d503866edf178d8d6cf007f9c6337bfd900f5c4712d82049a2f82e43fba589a372d44f57c3d260df6f5393d3b182eecdb503e4e35018667e91c4d4362122de3d88971691e7ed05ba7341cb9cd39cc12e12ea114abb6f7cf1bdb9906d3086147a1c22c67a74fb712ba6aba1ae12167a9d77a4e5fc0c19312d20080cb2d39a3a9a8cef7cd286739d5387e1728a2c8450ccca03d0c89332120555f97652d122192374bb4e05bc5839c4c2761de9e2f732a803171a97445f3d70fd TAG: 7e339b51b4e6395ea01ddd2272e5b185 KEY: f8e9ab310482ee241fc221634b5094481ea232931d696c889d3d37e1c53cf74a NONCE: 3d5bdc41779816b352803f28 IN: 2410580b0c03e861f4f7fc98f8a4cd9a4fec0c0b27d92023c081c7927e7599cdf59031444e74fc15dfc12d3c144762b8e448b7ef6772612a2e7bc34a048bc33dc56e99949d569df7e296b66cbb37c66dfd2ad8e7aadc350f8350cd68e8c4e2461290e30f9449dbaf4fdc89221cd75493d33f903d365ec418b327e3dd6fc381a8e06c48868823a42bcd082ab16b2c666b71038273427ba1ceaa57905c655f0ec4d25401c07c679ff5367a9755e63611c19ca5deb1db80f97a3f5149a8ad2cd6491caceee3e19782e66354b76422dd47ba1e715dbd271a07fcdf69b5240e58186b82b1ac443000cca1b0c79dede1cf998643565650e998bf4760dafa08afde120368ff9fdcc2311f78d803c8324e385ade4ccd2eb2ef51aa1884a496ec024221566c8c882992fbb830d4923a5c5d7b99c7e6e7a8aae5926d143e19bed7faeaf7c77bfe7c9f05fdddf75df3df2425bb94a63f54bfb1320bd32e7fc2774be67a22f2410ff3c295cb AD: c3fe566b8c9710807722198f03f56f0abb02ca55de5174d7f9ffa61c0bffb88730886c028451062d6220586bdbf5ff91ad6b1033f2c9d6cf3c3c7bb58a070e8bb1c3a39e3d04952961849cf55e64033ec929f30b9ead497d14b6c89ff6a4c008dab0104e7e20df6d6f11474ab680e5bec789623b2b693950a5d17dbc5b49cf80ab033b1910a9afc4231254f88ca13f37f1214753f32547ee0decad4bb93fe229b6c8a14564081d8ce5d47cd45022bb74475a709d84dc CT: 98ce773c72c6d7d40fb8aaafcda02ed688644ac8e9ac868315cfd9db521870b40ef9decb01673aaae0c8f6403f61389c9454784f007bde6a50c3c69cce30efa5d851cde2f019bc9a9bebb79c19b29304ed908db6e45445ca7f785433abfdca7c553e8f6aa4e6670e839b5a9204648fdad4a35c0a6e44151afeff135e7e080626854e68c0afb5bc6be9aeff91d71b33d294ff1c04fda6291ef535972f3020ec70cd31b156a1468c105655561d8755a4a88c380f6c56ec1e1f49c2670454f1493262a753da4d40343b04f91aaa3e69fa4abdc625869f72839623ed8764692c23e1131f6567a1936cb43c238e0dcc2aa093a728fadd5b0e7d04505b9fedb9212218f1b5452183e8cfb366e7583dedc590f16d713948a85bc4462134eff25eb9703b34b5bdbdc63299575cb0e076f3cc7afe35ff3021658d83b526f7b8018cec38d3da93a0ed388ade0941c740da975dc433b74b1b528ff92bf5484149166f97b44e81d083bc40e5 TAG: fb61d2ad676a0e8961aa9f00a164f294 KEY: 5fb0fd2e46ebc9940ccebcce3b674a6934d4dd57ce0fba9a1407beb06af6d1f6 NONCE: d70275fa9f177cd36c990d4b IN: 22ff63aca475feb17de03d3a52b4119f9b277649f6f53f223e29e03493c938688be81151e268928380b407039fb38494cf235ddc823e8cb12f42b50b2feb52be05a38893d154b37cd1cf2f635413d7819354e29e195bd01517992b51efcc91e10932dd6f8a859c5bfd77f2e3efda25caf034a91053da8936e1975fcbecf2ee9784bfae7f903df4ad32e088a869aade322c7d14fc4143c50c59112c8178d00a0424f4003748d28956c9d3a6c57a8e0405d6509147b50ebd7d9a251a127a4dd736d0f74e68755c4226110c276cb7870cf1c7b86617944662737762aa77bb255d24ef951b69adc74314c72f37f32dc091ccfff067a89b834b1cf0b58cc22f7dd6970104dffa1f60b2ba837ca6ff834d07c71ac4eb40416f0f50303dbf6d0b4b0b9d9afa8da46c6753008f093a188cefe67f051c8bb3b6121841e2ba25b8b801db329b8da7d0bfffc29a3810d2d165e854a9eb34b6fcfc7c05bcdecf8f20b12c69f5641441156dd85b910557d1355e9d07030278b494691433 AD: bd5de2858d8bbe2e3071ff450f113ca78f385cf77e6dc0a6c3888e3144be91404deed2afe438240270e9493811343c62c2ef0e785921f1ccb2d2d029c5f0365f46bd55bfa8f89d1d4c30c5f6598fe3f9111df847b27a06f7641494e4eb7dba8a5296f90bcee8cf11c1f1fc16c52868e8f2db2dea75b91dbfa023d5555371e1461283e3f1695e028ea00bb35b6e81bff8f128af2d81df6fd2c7f6f42bbe9dab30a59ea4788a53cf9d6a2b1e9cdcc9f1883b37c91eb8bea7659fab41d47f6fb5 CT: e919008704bfbe7657974c9e499a3cbcedaee7b813752ddf49a69cfe3ef39a8d6e1ffb1f3bee7065e8b74b28b25b5054d9a0e86ba50d9e6aa4babd075dac7b7a8a0141f0adf9c274eebbd381a3a5f89c287019db217f5b644862319f799ec3f1ffe71e26c1b501eaa56c97a0d679f2c85158531ea41080b4c690ebf7a02ec2016ba260dd6c5fe1cc5084c94ddfb2b897cf597ff36adc11957ee4e4e3f7f7fee3b15df6930ee9bd7a1c1d6a74316194cc4b9e2483acb675def10dbdafc7093c18f46ee3ae155a385a2bf4dfd33db9eb33202d82070cbbf9df7bd6e679f2ef866eb37654c82669434b25764ab8ecf1cbab63ba7b1fdbd5e53bf24f679e321708cae599664a4e5585723df96638bbccc0db568ca8aac82c072e6548cfca1fd978ee1d732f46c6723340625d3a5ae89cb098a35a5ddfea382f1efc3c4b0528af42007c47c76e9baba69833e0219baaf4448308e9bb1eef5512ea41b8c774cbd044b2cd69c6f1c13fa6ae950e48d14cd05d8c5a97cfe4334f7f TAG: ed970cb4c8e9493e2b5b16c99aa6932f KEY: e453777b589188805e883e9e15ae1de4e80860bffaef45a1e0a01f88b5d7d948 NONCE: e63eabbdd2f357cff8c172e6 IN: 652cd3b420533b8527a6ef26c8ed75d349dca2106050d80cb22835c15861a22d8c7cf8c2c2df9407eccb0c21dc7078de4b8b91e82d94a9916c9a284c7e49c8c7d001721a9031530474452588e09411c66023c9c81b7891ed271d371d60dc70f0c04ac93bc694e5b638f7ce901011e1a17059892a98d596666d102d9f7e0de426449906081651f88157063729176f4608f2d506c9637086f8a56821538a6241d8ba5e0f37ad3ebfd0b9f3b3bf0ce18c095c4533cfe33f6a9871bd6158a17dbba101f840c6638ca0589434c5b842d5dc501c7741142982cde70d98014e925eb46493b0bf91a569139be22c42cd33ba1f8c2bc884b2501a0f49d6309344874325345a98481287ccc6d29978d1e5be73740fdf2f3a3fdd0d7c0642be7a22e0c98f0886ed51bac87ceb0f2caa79cf702ffe880daea115b8af6546a7bc18469e07a3f8d8b8a825648684e2b4e9412cfa0f895cfa162ae0fbc11f8cc4a3252b2acf89e8ac67de0adb91e36dd510f9d8ed4eef92047d015b2ebaed1f3f0412d81fb5bc82f548dca18d520599 AD: 5c22beae86894c88aa7b50cc82029abff7c8a56d0a6a594fb502ac9f11cf10f8ba9967497e0b70551a6440e15285d53befaaeea2dd2e743cc056bbee79e47350bfb49178454aee0c78372db372d99ddb910dfa8db6556b61d64e8ec833fe4737b13269583459a39bba6a1202fc709595fc0161f537bd825b3245bfc238a6c7d3b2295d1857129df86db0891e022199c793b319ae965cff94b078e467343796992992d388aa210d50599a3b2bbea36250ace162989e3c21249115a402c544aa82 CT: 5fb2516faf226ba7767500f7bb3fbb0750b535b2e4e61f4b1a8f8ac58fd0bfc20d6c83b6d646de135d151ca50d10b7816bc0086e0e45021b3e5ef2560be8a8dd5efad693a7a15192614e2c977d9c7c21792c8226d89171b3020dec505a38162ecd1fb3dbffede31ec80875b5a5c84038fa33895e9f10242885a6a59fe07be083c7d7f904ca636f1d8d812e33d3776fc705d5a658984544a6554176b2cacb0aeca55d3c53cb065769e8bd13096aa7bc86ff923a856d9b6dca7146efc39ab1eb41a3f84bc3240ca7b4882ff937bbb21f3242e98bbc6858a1aaa21f5a603dffaf680d21c9c32e383d4a56c6cbda51dda0db76498c2d3e8dd746662c804f968476f5600c4dc32a2bbd966659b097679a9d604e93b0a0de11935a9945b92821f985a25d065242fa120048d4760d58acf930ad57091bcbca236fcfa1bc6cd5f84dc7d19197a2c349138679a6bb13727a207c46bf733a3a86e52907886cbf6bfccf82fda3dad1b94ae819bdd847f5860b9e9711fb7de0d50868ddf792b3383efb1a2002ac57648af7bcd48b TAG: 2205942e6c43fcc24e7a8e0e80c3d494 KEY: c0bf7b2cdf2d0ee20653b1e07cb42f9d1d0575ea7220ec01bb31deed93fafd12 NONCE: 6cc8d0d26816561102778d04 IN: ba7d68de3d942d313a63f1ee6c3a37397348f01bc83fb878bb1035748038047cca0c07710b9d76e129f9b881037786907560e4ae9592c02967df22af893b3ad409a3b9587454afe0375846cc8ad94963c7dc61849ee4ec1406dc7915ee5477bb73a43035d67e822e45d3169db88b269824228149abd333af8e41d2be455bfa449bc2ef48f0fbcaeade0f6b62d99e318a2ca44506670fb1397c47d1931136cffc72ea33a0e1e97745e938ce654b9b961fd4680117388dabdbfa134c9dec8206797e72bb5e6c7b672e7c5d720c2035dfe8d42edaa56f54bd2dab11ce5ebc2f95ef01bf080ee82e8ebda43598dca58db3acabd7b3cfbf5183d07bbdae49004f5154d6bafbe1114baaf4c624688178234a6176756718e79bde83422752e7a9ee87648b182f8ebdd96213b640b76118b577064f871d627d2a7218ad19d45499ed3d4d9bddefdc282e66d1d708daaa558ced4edf38ee6f3a9add0f2126e94a707261234932d0e3674fa085a7e2688b854bbb9bedb328940b5d35fd0eb85f5a56f1406d7a8eb7316a17eafdd7b87ee85d812a740041c8ff6057a462ea AD: 51bd07df0a0b0374f5b4ff65ba48587cb83d20010e67f36106e99a5b733b8627d541ddc084ad0374432ac165b4e81c8601e7c180850e54d8db89c092d356dd617439f36d65422a45d116914390320eb1ed0736e47afd5131b7422234a36c5efc5fd578fd6674176a7ac0f73b63a3f5188aa9a7773a27f50e103c2faf3e0488acd1265055999bab1150ebf49bf03728bce3ceb49307e2af7bd5f9ac307a8d249f55514325a6ab58fd2daa5194b07fab933db72806ff4159075e140d89fc3e5d6b684be014b5f0ea1c85 CT: d02e8bb096fe307bfb5d5f359e8895f775c126e43289fd30f631559a2edf6d5000974faac0b24b7aec5e6633f862009c0f3e17aeed6fc86154a365a99200d5855a39743f219cccfeaa317b7c9866831e2f61ac7a9553e6b6ab5e5c16ef2711cb0ea9a46a483c057316e4c82b62a895e6d4ed5dd9d3d43576443ffc769630f93b37cef9fe9a79dea94b84ffd991e4429ae6de76fa6d6a9f65479842070271cde06c6e49d21acf98f4ea3e2c28eb67275446e3bcd797bd610cb9aa302430993ef3453c4ae6133f66f766cefbfa5c566bcd43a357fbc502819224352ec68c6da3d596935dfd0dc79655373a588ba08beb1ae21cf222a00e53495946f9ffa7a3edc6dc20559b401c2c5a35ff461bc12bf656b7ab86bb63fd72e7828f3915156a93c4718eb5164e359ae22086f43bb1ac868ab6a3d0631baf4ecb8688a48fa802571606ddc8215af784b04f6823439f0d5cc409c1622ae2a586fe413e4492eae627eee9578e5ef9c891a23341561a9c0f342d824a0347eaae52da91827f55269ffda3ec959613cfe9fbe022f7a8f8f8ba2dd39833ffba261746cca9 TAG: 7380475e9d2ff3d9df01b6c895d00dbd KEY: 7a97196f184755c637c4f3b8bdeac41fe1bb892b86047e88facc04e2d88532b6 NONCE: f584f4ab378a3dc7d6102a17 IN: 877db95465015e3122681258437f11d14b83f1159a52486b4c3bc6037ed33de9e856d3c89fc5838aee587c606cc0dbed9a58faad042d51042e086545fd9639b18650bd531065684076cd188f11508d48e2a7ee585e8c8e9061970a2d381374e0bb5ccfc8972a01d9587872ff0c925315d10ccd8b9cc6b1450c5400cee4e2edf25ad952f31da22c7f241f97d966bf491ff2b8f889dc798a24e184c64290656711a826290917db99e2c2bc679c92d309a1856867d9428ca2fe5ed2a3d0476810cca53b18526de0e88508a67c6797b507a2e09cbf5c31f7be6dffc78d883f607f0ec3ddbaaae6b087e8731cebc792dc840ba136374a9b654b5d61735d2d85a70646be9c470918201b9c8f756e971cfc12e0a93acf386809f769ed64a19f47f266f3504d47725672b2aafa611456987fd1db71d16a4d1289ad442f0877da4f192d814f9302a1207a8e8e48ed90f6b5434b35d47dac6a0446156781ca1fa41f7bb772d1eee48919b4e8371cf49fbf452187245a16b51daf82e35b77e80869eb84ee9ecd90312dd3e6e6023ebec1a21b4279bdf21402969101cd1dfefd0a730d3341571bdcfd36abc675744f96 AD: bc7445f77f90f261b1ae207f93d17828d39eafae394ecc2e65bca79562a706c279bcc6d038edb9d7a344ab1a5021f9a597b223d7a1a99e1268dceab20c23e0208b9a898e99d83b2e788c1b7faaff2aa6145f8918f53cba3168db274d65f2e419fc233927599f7ad96890bc1cd4f983276b126f7d10b894a67237c7b67e8d633d62b39d788cc43b2f8a05d87e656ba86feaa3a729b0be2abec99bb40d177900f20b559c4e0ae2034409bc9b86c54644cab932e997fe0554e7eaef7b247aa00f9e1ec07aa9af3a86470075324d02c32425309b CT: 7a0f153b5f7976c608206d8791dce0f90cebdc0250b484d7e4669334e8f034165bf4a794dfb989206217c13d4de15e75e7e01a24d2c988212adca2056fa7bdf33a1ff69f6ffff29b78d1560ec21cb4cc96deb9b41437dfe044600724d8ea124f741a5605233143e54d8a58f68d5a7900ed57b734c61d264e71eee4477ffe4d833756c3f65c64ae8fd832296f61a2a7dae5a8cc2c7b3f0cb87900c8c1d885d42420e2a65c414bff138594d00250e8dc451ea319893fdd63f55cad85f9f76ab9806e687fa5e2c1096f13a09ca7febd28cdafc7d0a0592865e568a58b3622876aabdc9a0c0f7924c3173aa0b218e28ad98384ebf5baf7448f316ffd82c5d7b7a51125e65aa78291a342dd30d767e19fb996e961c78d171263e0bc8529c2e3ec6d9430454705a05bd841237a68dc4b7b3039bb3a0a1c22213c9fe6c11d41d39d3cfece07527e0ebacb593add061207c5b1fd221bce69cb5121050f805e2c759423c97a5952962f625c528ff8c11f6550d435d7fbaeffe4155d266f9d0e138ae25cae2030e31fceef9e39666da4fb7e196ab3859532bdcfc10f7ecbcbb8863e7a0c005e9bd7fd9f52dfe03c94 TAG: d6de820a9b85168257da829272d6271b KEY: bcf5462aa20caa950ec9653939b043c2e94f0ede1b91df0068fdc903431008fe NONCE: 16670d77b089880c962e558f IN: a573b2052d3106dafe00e3acca3df673fa559f950bdf9972e20b9612b5c4c96d50997261be7f2fa978b793d5b61e74b82541c8c02305431a6b7495f948622075b5d18992d976737e1f6f38aadf90bfb46f7bb9a7871620218564360729844329f4cd2f0c77bbbf17661529f88c80d1e000eafdbb937411cbd4295ae697baaa6c9a31206c5711bcf31f2dcb50cddb4619d48388a57475df684f4a00d432560540ea4d4d337ce0284467851e86447b1f04246fb2167625a0b3cc16873841d23551653aa1678ba76689664e16c7354c87d5fb7d40287894f46e56f5394bacb222b30fcb3f5d55476fc37c122d6865751212d4f57651092066aa20eb70114f269b08e4ece1b804fa3f2c5e4b94981d41b3503fd127fb21c1ba24cb871dc6f19c2a674561900f73e292f618e1b3a285ec79bc7784e3481cfe36e1117fc620aabeb088585aef6632a7228a5f901c62f248b9ae12c7a6e7e5052d9739bfe303758989af254b78d5a42c74b13def0516611a1c0323e18070147f67cf0613cb22d83dc29c176b6823166c35202c46e85484640221fea9441b1e9f4ddfa4c0a2f4b2599c6fc73856e3c18a5905f85dc919883f3fe9dbbffc50e89e8b71b9a36c AD: 74290718e0b89aef1ec21fae49d280d3776d3ef79368634716cafc8f2eefb3f449c438c14deebb705a42e85274cecd11932c9a84f0dee48e8a2175b57820c1042adcfc42ac9a39341af5ff6edab2d25eba8f0219d3737bd4e7ebcfb3883877130c85e5be6a7b87cdaf4d37075eb2f0bd0d1a61567a362e8f66302e56668590b49b5c76eef962d1c310f8bbfdf8f57f3f82b9b2f72ef49cf487a4e8618476db71c6e0813e908126f9958ed5453067c6797eadb432d07de49dc2e50a266eaf6174cd1b18ab707a53dd47b564518b7bda452bc451a25ad2aaed6f2e7a CT: e62cb3363816bdbd4153221411b5599b453820d675b5824ea1ef57c2a1bee7563a092976ce33c918a33c67e4628d5661acf2ea7e353bd4cce6a87557593e0ebcece6510b63b9a4a2d2c055e28b464a752b919c593623ee4c2a6bbc2b2a95f884513e446b10e2f0ea6ec98c10d893088084f7519f912afa35a693bd312335cbe2a95e4bb4cff6dfb6c2b632ef01b48d102f244bd0df83d54cda5060a01f3c3c3c8b4dd7077d0f3eeb89cddcddd23ed391697996bfa741dda4462efd006be7bf15c3b2d63aadc3cdcd862e3d09d0ca675e397055307fca30641f62fdba74ccef65682701b9551814139f4ee4eaba2f1739966925b56cbd6c3b16e94980484d32f51a216e17f07deaf70694745829564e486f53bf5cdd38ee660be09a8860be35873f14ce269adc17ce7c2ceb7941810b978a0db7e7d472f23e8ee80c9faef243cafd019d689aafaf0dab91e4b7afd5808f30753b46061057f302b8ca383c6dd7fb35b3282ffcc98487c9616a451386c1204d75337b28390e9968b24800c5a66449831da8ea3bf3aeacf2e6608b96c3291752cd049b168b1ed1f812a6f4901f30363a09b90b4b7f8af22468708c550cf77c30ca4385441d3c74e5f78c TAG: dfa7cc77acedf8de5a7a0375472f3c07 KEY: 3509f704954bff2b50f5cabd420148967ff830b0c4804ad5081b42f842276c6a NONCE: ddae1c3199da88778d920a6c IN: 79114e667faf28fce2f7924c4288399e5b4968c711f03d721e885fea0668574ae965e9996aab6b30b6eac785cdebc45a305b806ea90663927b8dbe8116292ddcc56938c0b1b1639e8068db1e4cfd101af5478dd63fe0209125ce92e3f7f7fa43dffecc07ae1621f32af975dcbe3f34f1dc75c75fcbc4c23ee8b8900c2719f4a9f50e57b1f9a9d9172fc746112f12b17b85b0371d0472d3c193c37e837d8201fe7d3ce588ab7e27e8457c34d399edfe3af2142a2baae6c6ec74863f6415ce30b17c17599860bf9a59be41a6011104b9cd0b8241ca52d1f7910cd3a3ae8693e47f4675ade296a8c507fba35f62c82d923051fa718d52a0279ba997149032b3a91b1dae9cddd5a89400de90ffad1e1a126c41459c512c261f089787fcc18c4583abd4c9e8b7844389db3d13e8bd5fdb68bd76c3878344241eca6916049795716b257636f1d25230db71bb10725fe4b9217d5643ea14754a69739cb62c7e99c5157bfb8c153cd754a2ed10bbd574c718b8dad2a556793e00d8d5a59bdd486e768f2e61ea822822532f8b4d77b3446eff2cdfb7d88d37b3e7ab0686679e02497abc04ef7a240d456bf999cff4268bfa6e366831559de7775ed6a6d4f02d489d4c305f25cd96f2239f2725961d5cd8 AD: 23d72dea41a1c1f1611fbab63d339a8dd47a3a31b7790a605d3bbddfdfb66ca6277a9a3e4036e8662d6560d05a7ee8a674e33d6433aed82fa26e5a1f5a2f47c28092ced2d182eabb9962aa8b10a567ec3705be6889e1415713b9ef08731393cee91370cb1d3bcbadf5710eb841d37992a7aa3573facad94e806d0019194b2cf9c41db281f6ea462e2ab7364b8660b956e145a13b77962c3191b2e46ab764392910cb7410d740aec3ff2ab8b643ae7e65d34f895189bb41902fbf2c5476301600932728008ce33380845f22b7db3a7b9accc8cf0793bf6ba37d405a6bcc8cc622f1cb205c CT: 44234f12f5df525e7f45d785a5503ef1a78398d9e756eec0b97c426af4661471c57baba5b76a19da18984c8824b0e6573ed324758918543618ece2163e969b07fdb6c1a65164e09f1382653b5cc4823deba6ba403046860421529013e79c703e2b467fc15e4a39b5e9caf9f521a0428b1e68fa51b60492cb6c021bab35107c452c94747b59034da681b1f253d594494983df44e7b394e3c9fa190802fef8fb178a2828ea7ef2aa41cd56779036565da68642da9456079fd3bc8718b218725f657db994a19a0a01ebc51f7bb1dea2c7d476417876a7ccf8b517b968b2243e327eb6288f02858c3d679e599c2d603c80b33fc3603f689b91ce117a8481074f11540f6d75c2bbb5d3c8a3a9d7b5699acef00ce981d6c5fda7a8fcf5ea77a365873d185de9f302be3ccc4567b98b74cb695a323cc6ac162a06556f8c0a9b218407a909d7b173b2f1ad4a497fec9f8ffbb2436a4101f57746cdc24ceeb234fd8dc6f04e488227d4a2a42142bb6122b1b59087dc902e8d11e81852aae897227dbcfe872b537e57849d51968d1aa2dcaa63d6de8faeeb5753cfd8af808c69a2a7e831b34ad8e78c97b6a162401cb85247e9d89bcd593242e8c93f9378c1880a4b3c45aa434a5f6d16182035dea99a4c TAG: f53384a5ef6edc2cbcfda00cb7456d78 KEY: d0b6e7fcbf3a6eb1d3bf2fb91e98593959077e8bb76adecdee2fcb008cfc335d NONCE: 5465e4e10e9cedaa39db35fd IN: d7b9533c5b8f2e5bdb427d8bf42c5b83cc11d2ac5ac96f6cf95090c5f439bc5d4828238a86c5d444ba0aad7b6c5917f673010f0717007a77064bc4d29dca0ae96b381cc89d04d5731a0f985a1e8071a0fff733889d0f2475ae9277b0ac5f7b68a0533f16f904ca15969cb24c24faf7a155ad51917187c5ec8cfc95352481f0e9002eee9467035b3d618b7f6cf9faae1de33af239e6ed4038706b735431195f355a27d1e7098ddd1f34fbb0bd3449b8c7a069b486984d09d50a90a099934eecec7372fc137b5274afe57bc0cd6f49b1e17638fdc8602d31fa975c4f0223349d40a86c36fcbf43124a4726e198729362ba96f79d5e0d89fc404b3836737445756c6060d9e95d1638a030ee5fd954f5a9cc662014ce7420fcddd9f2ab800823246ad30ff0d0f7789fe11807703a731675ceaa31b5835ae039fc0d111f5725ce4df0b9a075a8bd1c1112f90bd64c668d1d9e794228aaec7c17dc664ac88668cd06ef9c425f2815891ee4b737b18b138001eb6c353bd5fb7ec26b2d26a12ad2fa707adafd884be4251bfcf5e5e8f3979e46d90a57107e7e4d04c658f6224d1a288bdafe8e34df1541c702f29a1db2af2279380d49109f17abc4161a6052f4ef0f6657c7322eee44f4cae949dbca447cbbceb9f10c5be6de1d8886766794a3ed AD: dd736ac7acd3bb87cf11e88f246fcec505f595902d1121f68557657f81340261684fde901c079dd73f7c9e1d4bdf90613e7790f334884b668ee04c29750d2baa21ba94f2407a512dbd8450ad4dfc0de22dcbb291045e0fe43fde0cf1396cd3bb959f2dcc1f7ea681d0e7cbcc73e7fffdea35f6dbde8ba0079ad97c8767bf76aa008864375aa0b02b89d8bf2ce7aecb2403648e6069e209f7283f1cc180c166786d02d984afdc4f8eb9479522362fce0633996c758d99049b25c89a79f7257627e2a9557363a290a0a3673407a298ac1cc034793cb7ff44833c569780bb8be9e937a3a758f1c570ec1c4865efe8 CT: 90ccaad48bdd13c3df79d9679465dd0d794b0a0ce4ded4add7f3e2952bf8593c295d17fc43b4c44e56971e0fdb116bae0e7e3203bd02647e8feddbee667ca469ba3b0351a968d746ffe033a60a26b12b525d280353605b71f46cfe3758d9efee4fbb8333945dd794eedca6279fcf5a31003cbce29d748e39ff654bbdf1bed5e7516212dd1ac27e0ac5a121bb5f95c124dc92520b25b8de80874d5d230214c30a8a17196fd23fd91b00e64bb0fb78ea22f15363bc532549252e0f2fc90944ceef75f7c320e3ec75fd148cd130cdf48f88f85cfacde2b6b80ec0f45d0defa941fa89350429da61aea18d25a2d9dd156197dedbc7f736208390274143f63a4f8d2f1dc557c544e364dd3923e54eb79cada64c69c7deffd3ad75f8660b90ea15a2a818d6c5f0d6bd43519eec6cd43618c35b468e10d17b79865e591a0bf1324941a5066c7d1c12dadb77d4993685ac8dcbd2c284f62273888c453808ef40c5d09b054f8459a43c0fbf5c714e8c7b8985ea932ace7a79987b0a9be926335b87d37bc182400a38a847362b3e74b08a952c8c64ca72f1b79d6e0b52cfbe28012c1aa424da95c5a2e8b8c49dc2f305cef00e50b92d320cbec992ca1656848860e0bd790bac5298b7a09b7586c866fed3dcb53afd2f7b313272f1c4b458e1b1bee6 TAG: 1139d5d9f7e52a51d258d95a9a51b5a3 KEY: 5940c08a09430a9fd36376e28e127f81789e8a605405de9c452cf8c7131cbe37 NONCE: 597c9a73eb47abcd2aec1b2a IN: 8522f154e672ae25f8494ff35d2573b343213a2fbb07a417d8a60510e7eb1ac5ecf229429f330809c84b0c1ac8f7e28c7f7414db905be8f5fdb5a2f818ba8440b8c9c20f8951b8e9b75eccee79b096ab09f4ec99ec394c7295b30d29060790d3dfc17d1321b8288f3be38b17901a48470784d00c5b53f895fecd4053de78d074fffc16c302a4f2718327bd96445318ad247c99c0ad4d06405b6509ba8f6bf47755f0b297c4616790b25edbac2fddc89b8d509d6955cdf66d30f2bdccac6f856a3206c53c550a9970ec450097ae4cb6f5606e64c750042060c477203479aa4da10edd4d28ad3df96d613194646abde78eee8716382167ee6f77730766fe8b4ca6c8f0270896bcf14cca5d7c2184dc6eef47bf9fffa3f4815f8fd7838c0fec7e9c08bca51970460bc013145f2d651bac1cbceda192014a5f27c991ed3e7127903fd49a5b3a4dea1194ccc10eb62f911586314ada3aab0f8a5d53c90560da3681bd9157892ffb1a381ed33afe203e3c09748487a0b71b8703f6e5f84d9195db08e4c4338343fb8e968d9f5a5b1606b6b20fe60cec3b54b49ef7bfc81bdbb2926ccc79697d916c3b622871dfe9344699c509f9b2775abc12c486e71a008cd525d8610f51948f75bf96bb94c59c98f2e9f35e8513e43898754f7338d7fffb87e538fe6512832e5c2b08cfe952985fac27 AD: b0e81a4edf9fe8b9f2eb79758a99fed7907343e6be072bc93fbfb5a539142a18af4e4710283deeeba4e0c1c1cdde7e886e7d04f817a5efbe89d12cabb34153856af1cc98c4df21cbc1da3e34f0ab74842a8757a189336487d3ec77f842b10e2efe3e1e232fc1dc89d16dec865cf6e9f422e7b9d7a4e421d79657eafec5451e04174b3372340d6fa8cbd23fc0215e9b6d70a9781ff3b8ae049bd31a363d3fd465f235ce463f720e4bca114d21d3dc407a66f28df01549d168544478404256715161cacaf06d955f525546d384a44ee0570d8c70319bd33aa07b5ce0a891c467957d5ca4d2523d9958a8b4b3e5d3b0dbd1f6a1df3acd38 CT: af56537eae418deb9f7da2500111c077ca99da5e835705385924845547a592cd3910dd419e6fa4b9b2d7c21d42ce2797873a494a735cfbb4277143dd25592a1f70ad8d29a42b55f697807994a1c0338543bb56543609e052e52e1b7ac473ce717711fd7ce4c269291764c11615637b29bee0a8001ce82003ac91f410153fed863f7aa1071a76b5583852f6e8bb7b565eac8042e0ed76704ddcb2c03504b9c79b1e66c179a9e91d2cd890380421d84e05a70e05c4aae13fa600e57a78d7668e94f87d7bef00b055118480e4944131a39c7b6066161a3815137a3b0e89cc0db03775507b4d3325ee4449946b33892e064954294c6ce83c97fbd7f11f203fd1af49a478cd3eed3cca766ca3b9d3402dcaa4ab9729f209ad46daf17a584d6187659b039176deb9e08a0cc78db16e4122dc5f81ae4f5ee23a7140d2041cc81c8c43568fdd45c9ce4aaefdf7bf2f650f478f7581202b548164c4c160d3e2d5762569341170304e965e09474130e397bda5326b2aa07067a4fc8275a1cbcc43777414185b243ff67f8947b16db687a5b15bd5f685ce250be6ff21355ada2e125b64b57d57b94d6461ed19e77bba9234ba891d8da2008493a07d4f8c76e71973bb9ef87eb048c453cf66bce0e820966d9f62d39deb43c7a2c25335184e0e5ddc1b191138e71b155d39271becbdf097bdfaf1 TAG: febaae3a1e94e47bf92a1171c91aff8e KEY: 888d8383ca76d177685ea6d2d65bd717203ccf794d613b2f4d50894cb12754bc NONCE: 95fc19c449bfc10443c5c163 IN: 88d98f7a8343cc89faa48882e8a60f83e817f17f68eb338289e2deeacc6bb5ab6d25635b9e0d29fa87ab97e5f29ecc47641e5a4e0d5f11d04bb25c7dcf21e7a93de1880ad022c838b5c957616764bcd2a66f1098ae4926a93e1726384171cbd9503e03b72c77a2721003d3b391f2aadcb32bd62e492528ea3ef5e85761cec47b846d32988468391db2f23fbfeee39cd89a45e71e4d4b29c6fdd8abd1399faef491211e902b0a99b451c58211c56b1a63dc2e8a57e6efab94ca95818a78fdbdb533f286b83725980b9bbac766d3b3ebfde01532e7ab1414eb6d52ad3b1908cf58ba67449cff1d605708d5fe6b21c769f99874249d98ecbb3c62956ebf6f471b63e84a8114f73f918aba186239947bbbe2973181d9b48e801e3a5597b01d166bd2ec933b48bb7376ef131fb792f2a26edd267a713570c1dcac5a223646f6b52b0774ce323efe526b12f1ae59ec70bf6ff62f857374299cf4ae182015cc0cc2545b68d483689c82f4356dd8a06cae383848cbe75f08c5deb198c7effb10973b21fcb72cd53f6baeea5e23b7bf4508825111ab94535ed5ab9b51266d6eee98faf47b6a3acfee64c4a6598baacf1831a0549105d47b72434f498d54ca59041f07d22f3d6b177fe53b5bd874548daff7acab799c3253435551d963110d49fe1d2212b7e17df5b98a0884d9b7153253ebb73c0fe44485d78821a07b5e69bd446eae17 AD: 0e8aa718709f258a2a2476886757fc36fda2cd5230288b9a47d4a94b96c8cce880d1d06466aa1b331c0b893504fb8d6047b82549bfe807401d795d784584d608e419a7be990bf099694c788f11c29cb9655057ff12b4ee4b579bf7a52a36e9be42f06fd3ea2a8774cf70c946407db105cc88bd95f5b1f347bb8b4467e08058153edc70fe78bc8fc06f462ba5b16c5a56ce8a357700b43ce1fc8210c17af00f0ac8a19f8a73fb47815113c960138b2238031a74b610a1c45e3769155f6cdb7749d801b8f90ab5cd658f8f28443de9bd2e92098ad7915a6c68342255cc5f1abd5bba34316a297246dd2bc0f3975bf0037c3d17ceb9d9c9262b0797a6b5a90c72 CT: fcc54b58b1330cc5e87305ad574eb3ddc760f12a0dbc5075d8b7e825cb52237f48845a1099527fcd5e483f2d99a06a413eaaab04e641bf7ee3e6f08575658da3e48af76b849ca68443b61f260118bf7730d9a4b965c4d55d391c66c87ac9a065f32e784758be031f9f24901737da41fb0b800e61c5d3e75024ce3cbc03c9b0a318b90821623cb50e487fc15ffe6e3b1ba69b98ab10564bb72f868faa2e4f446e5331065f36d30942022038d11dd040d872aecd22163affa37003302cee8da8b02fc1ece3c3b6a29bc515609faaa460032a09adc496bbcc70ae7d35b78c8f97f4b5a55b9fc03a00561bdbdf883edac8761a8c31275c4833ca06a212dcc4fdabaa022c7e7daaaa7435b5c7014fa3866bb77890ef0955afb267417706ccaf3ccd9e633ed9892fb5049600597e9b85f73f7fb065bcc748237f33a0c300298dc4cf37781fe632adac9fdc0f3388d315a1816f315c96b8d75c7143795f56e0e51f09443396dd7e291828cdb0bb70125e90211c68530f33e0b2ef8bceb42905b908fb3f64dcf48ba8ec4abbcfc3da2bc6f04dc8bd993a438cf3e64efafbdad932e01ab3000b6bc819e1c205242220ea72ecd4cb38e54ab7c483a58956f992304512bbeaf7fc0f987098c25797d734cdf74a3bf06a5ec90cbe1e12e59fc47e8ddc4ec0ffcd90e0db824e44bebe661a88a94b335bfd2d957186723d9e0d50544e68547c TAG: 9c7a7696965ac3b4d1b175a1136fff97 KEY: d4af4e662935bc7de08739ed8340397b78f0f7dd4f96a2fe50579a1e7754de0c NONCE: e06145d6b247742ab582584c IN: 3b9c868cb0311b02273fe15f7a87403140b7b3bb49342cf26a5e68226a2927457c0f6b06f429c6cf5746b91ce5220e3b20cfca713664f5ec98b972fc3bb098f52c973a917f3b68dffe955a4fc670fa9c2ce686ceda47e060b291fc5a39fafc9489d18c3c3c08e580e492e35f058682e75e06c4141c38fd94b23eaf1048557c668f26da84f08718d850d65f8ab7a4e94c66fca8bf5ca345e8a966dff970fefbbcb88f3cc6b791ac03cad7708492675a2b4c54198b3f5f8906f3bcf2a56ba04666698c820309745aac83b45fa89e794d56a16fb3d00c923632c1d68fce42296729aba6ca2fdb2155a8000baf146e461c9cc1ead957027a7303f01622d129eeb87604daa5b792d6d2cc4ba08cab47c3a0209195dc19edd01f1a4b54fbeec73c422b1c06558f3d70a2f96651db1e0364b7aab14d496a81b169e244f0f0657254faea172e9409bee2934fc622a7b2079f8368f53313790e1c06144f7f140468266fd6269b4f442a06606bdc9097d4547665f7fa192f67f0a14ff3a9f04092386d705a0a7d3a566b7c2e2b6ec9b6e6caa258ed2bef1ea747c6c80c0b494a5fc66906f5bec5da4aa884d38a6dc74af82aa94083106f6b8e182b529f94f4c389d6730b313ee8e656637ac064fed06561ea32b4dd3a3a128f3458c6e9b500cf3e578011e6b1ece6ed3fbd896119511f89db1e1719ca22a30b779c26803b278dadb4446fe2 AD: 8b5f96d3c91d0280dfb3976508eda8e803de1205ef65b3f7e4a41005165c5f3267b60a679095c25deb7c229ae7631c9df61ed198a9e7d9f6267bf288ecb88ab82dc3f210867490cf9c248828c73db475a757979894c16382fa1a9e5a06c081fec99aba123f6ebda65e07378026986b97a75e0f3bb74cc26f4b813d73c4c7fbdbfd5fdc4903a51d3064783309e497d14db09564a75551adc83197a30e3584a258722dc95fc187964f3207579f5d0caaa98d9dbd547cf2b854c4e820ee2fb4c4a1c83ef814e6bc48ad7cef6efb11b7dfdd41de49f1ba2317849f153115457b6dd839b6b5c84e8bd11419c553d51cb00bfc28e7c82718db654b4f8cc7f37b4ba96d CT: 3fe29eb90fe4d85b070d118e2ee7b5820ba5aa019b5aa64c04485305771ab03b7dbfbf9cefc1f1d4ac7b91e82e460e1e4bff9d6ec7cb61138fd3521a9a13aebaf082907b6bd82fb0cddd4c6d2af72b054c2742ded0241e2db9573ea7cb76b56b14c7bbb2a983b9032bb701a83f7328da550e6fe2c07026a81989d030610afa859b1622c8743e957d3441f044339d5936921104f0d98c427fee9430dc1689261c63f0a02beb9095623480ba798fd13ec536d678550f10f71f2dced90edef6e3db5699a27f20d2382b06adf5df7108d44b5610bd49a7270d1021b93cb167b15cfbafc875c9188211fa31aac4dd9f4abff49cf18c466731d3d343aa04851abf731137c83e8815a04cb48957b7514f5b8d27d1bcfb3f8bb805603062fa4f2a1e50734b2e52ca9e99bf834001dc6f57fca600bc49d0e95c2ca80581a66176f182cbf9602e683b2480492d1e6b0f6119930a85e09f4e56b861c8c287da0b4028c055e3f325802260b7666b38da47960acbf10f9206e68ef247a78b0f9b7b5bc50aa6f5a47684d1e64c79ff28f1bb21bf3e67f7d6ea5c2074b45bfa7d905b989fd262afb2253b172415c16706b9c88a322787a3001460848391863b71aba1d23dda76adb560e7a03c81271330bbf36b6b21d1c8965f8973afa9772b7590b9de18a9c961bac11590825abb5a7fbe78f4d120e6eff290b8b3e4b36222a0fa1de8a5ba2501 TAG: 0948cf55a922d9ca8061356f5a829236 KEY: 09513c60bebaa087fefe7934112ead9e90d8599e184692ce235fbf5327dacc20 NONCE: b8d41590570fd882012b1207 IN: ef4f33e3526fa3c64c4cb725091dd621bd6f2ce69c29ca39aaf172f05400ddc7af2af0fdab161af935409e3d5b9a8fb915a4ff8b7c0d4baf8f0a103be99ee7d21eed37e258bf79e18a81cd42fef0dfa465e04cb70fd8165f16203e8ed49bc2c3e88476aec77b466debaa6d888cf8cf013e8672d781fc5a8bbcddadf023d7208ed5f6f0ee2e3418158b653431fef54f821f38a69202897126f9a24a5793cb38fe5e8b3f77034e080dd8e4acc7fd22a12ab64a47f98f588e756fe691ab4c7f4557dd9b77e28f997d687a068925d18fab49f3acc072b33fb4d8c7a60f9a639b4b1d785c062e5d386261ff9e7066ed81cebf6f483466c0747dc221262a7e7959ff156f3e69dcf4c3db8ccc256d666d3700475874d600d6e7f69a2d094c9c55669bb4b1f72583d23aeea9b858372c61516fb3f096736cccc3ecd74b98606a404a5a6195fe0899916c463092a749274e91831ef63b254a4c70b737bd8bc070b805ee42e5714b07dd4fa39da758de787340c0109e55ff4aaa19b05eb8e2b2ce171e4f9854d6aa56536b35359a7163557056ccca870012954737810bcc6ba226f6f38b774da0edd4c3e2d64ba4d6415d6528d7227a5a0ab222092c7035a8fabd3897bf9f59eca8692373b676b817d57f83aeb4f866c553b2ae1def7d7760cd152d18d43178b351ab4e23272bf157ec2832fd92b4d4e9085cf51da487779d82011745d0982ddc348613d55143bfecafa431a4b7cca9 AD: db82856c297682e62ecd1794a6ffe02a9e9b69814a6cebe50418e9bfc9e494b04afb9c0d6db479a8bf1c5d88be4c6b81246d8f4ecde7e3d4c6aa777277f705ef81962ff56d8174255519c00ccca0098e9370b675f736c86816dab838d7887b1d9bd638613a07b7122a9d55b4a7cedddda3b2337d3ec7bd20e499daa467c04a9d52ca1a02d119a62c6dade203a0bba45d3f9366e3f59a4abcaa62b6c08255d60798b9b0bd6205f2e24253dc75e8aedcc1bb3a525548479fa5363bc8176075ab004e7e73d0ac5f5e8717d3389f3287eea904f91fe63b5cd860091a42a101c1a1e6b13b31e2a7382f718dde735feba88ecb1ab41d042c4ce0106fc78b2397eeab842a8e0e5eb83b31d212 CT: d412afdcb77bfba94aa9a2a3a3a016369706fa4ab1efb2bdbf4c657fee4ca85b1c497a4a85e1330854fbff098c2f8450b7a95c4642b970518293a8d6e3f66ea0467cb05b7f2eb5b406e3ba36e153d97c9bf9bf45780e6576840888355f6084adc7ef517ec42e11271d2b72f2675553e21521e4a6b8f92f15fdaee335a4b8141e42a7204e35a96a3bbad2b955e1d9fbf02f735cd1c31f1fbc069b89361a9e0e18c75a587f7f5279a9005f8338412e71eb6e7e644586b9e6aeb6397744cbac0f60b086f7e36b7147c27c077d7038797c6da35bd3812b68dde48917b6695537490992c847a544092c9e16f3715abb930080c10dd8bfc26d51e7fa4b8cbb785d3ca64a2a5e21a10312dc4b55710d7b2dbb727b285b087c542c0e4d9055e16cdbc90954a91dc417ab19eddf8084c765ad1a2636b542411c15f36953f9e6a177089fcb9bc45f0f2256f7b461ff5551a5518c5c33f8fffb282d4698d1ad630cef7bd6c0577624a642eabe3ac0f78386d8dd1429f02a9c206037bdd6ef066ec15fdcf52aaedc1771f3f424e417751b3ee9f8a71ca47a45bb1b8608f68aa1cb29afac84fedb11f579b848e76a5664a8978d5ef26bd087bc28822216454a193a9c4f19126a108cc00b25f9cbe0bfbe704834153bc6dca55f32c4ea87ea6774768c5a36e5e39be927c2e1d4055fd279d99d1b3a8741a4320436791de823c96cba601c0ba9f36f65eec9d3117c6d73bdfecd4a3556f84c TAG: 8ab0f495275a56e3a0d77f255a615fbf KEY: 501f265508ce73dddb94729433f2388d1925992f4cc6ce78d9be734466b66d3a NONCE: 702bcf31e90cd2ff6a350a94 IN: 689aad4381aa79708817b7e8110cb9a8fc8cfb42a277210526da057e93d32c609be4efb1fa4254c1cba3cb3c2bcb5dcd23d1acfe671c4fbc2b632dcb8ebaa952d7f6ee68e52a59d4933e27a54363c24f4cdb4c4f7ad2cb7c666f9afb811c06df7bfdc93f25edabc314a9a1118c2e0a7cfd219c10a28b5de83dfc3114dda3fd31a3256fc3c915714f1b7e83c6e66273b28944f7e9668de94b8e2536701ead59f9f7f7043070ffad0ff6fddea1d9f92a7af2ce3fb8d130203d0e9550d29785063562c59fe2a699172f32126f6176e9313376203cc1ed15812dce9e304582533a212b3eaf209ea16c8f83db448686c0fcdf5dcfd957fface636fc31ecf5be0072e19e93250e5de639113d920e239a0d1581e179f9e90b5bc077c27b08427f0ec327545c1a235b88be7e8451a5bf405d0dd66664a3bd284f74e4393f969380bb63010081457effe00a972bc6e4895ff82dd4a50e302261734da0efd66b0db1dee74601aa414cd9e2a4c149956bfd63fe0fd1f63f3dabbb6aaa2c651405e36286d00bd0a3c9bcdb8932c6e01300f453ec1ec28724b8934d26c1405f311b67fb8e97ee14624e2d6837bdd38a491a019592526095ca9169b4657d65486470ec12dbc793a42df7d7d9cae29135bbc499425775996633ea60ca5c6711e3aafdbef89ff1bc41d20550c219c82a8841ebbb8e152fdcc55dd689c7768a97720e23a7f9a80b173e679c0e2986e4dc00970fad5f8706a674bfc71901952b7b02189e95dc7207902abc AD: 673d09046fe2326168dd702a76328ca26fc1abffef071f58f968c165700845a997a2013b71c5d83cf6b6ed8d76a1b6d1417d22fe63691e88d3774ddf4ee205f352b765dce99ca0a996d33f95f853ba54f2f9ac3e6d1c068567695d06ee8f3c9865f034dc4b397a15cda23a872a075257c10ad8e2c6d3017ca9183ac2d8b80068a88ffa995045b96df11faeaceb7b41ad716122f08cdf72f9d4970e5315a8bdbe6e93316fb0dd8d1b805ea4861e99cf67a5c8cd3d24eeff142cae3c53eae387b4f51a45bbd808b7ca1c3b69042c33c8a4dfc93246e07dd93bd12c40dc532f3738084e47d38983f6b529e3f61ab8b17e0b588da524d0ca67092112be6868d5ae35102478ebd35213e7b545c859effd6a8240e0 CT: d0bace68d76a5be6b31bd038b921b6377f8022e09bfd90a8a94d55c9147b07e9857891b8f4f43ef410378fc0a54966918bae5fde49658e1f6d307908b5346b9d776c1a6dffe52213286fcb298c741d04e9280a4b108419fe9dc938fc5b3810183bb7004a3eb05cd1fa81646e7e64e76e69ddba6d086a020f7c89ceaa7ad53b13b01c5c1addb818eca6d4e060b60e31320267e199af494739f67544542baafb577d2bfc36d7f92b8236dfc6dd5613c9b81681f10ebdc97e49432309d8d46ee1770bfa256b871f9bf76afd426fda88b91fa9a407d6364c181a1f04f17083751944a6925292fb42defb24c215b0128c6f500a642cfd230c89ae2ce117a29adc5c09f7dd4d97a34b9fb4e55802d325a1a13d0f6e664fd5f5a35f22c96c5b567d2297c5832f928ea7041b11f7ee546dfa03bc03385b231c0503657f0119b545faec4010fb67469f2b9bf69f4ab89abd70c339893fd145758b3ae47b44fcd36c20d361e597ca573317b04a5d00997755c97ab20f9b0592aaa8d10a940be50f33c9fab16bb0fbec7d92d21c378a3badc8c2137fb989c9b6111ab8228c427338e0685ccf979afa9e887f06cd840c2795a9e08ed641990f0c29d061c4f93ce6a15836b34dd428d5906714315cd9bd2f636bf9deb8a6371ead07502a46500f987f2ac124428256044948fc4a2cf778012d349ff5f9e3847c8b71793e8acdb96b68eb034d08f6b06db00c72e10bb6574fdccdf39a775628bc387b9ee026866854f52d91cc62659c TAG: 54c66aab6e2939029293205527852b9f KEY: 428bd480abeda17764af5b6ed4902977f21fd06e53061ed8b5bf49ea381cc584 NONCE: 6f6eb4aa086447f4a7e5e8ee IN: f4997366a2f8f827238ed0cb5b691154f345b4586e1911469c0c81df93859ff0a39ffaf4930bd39aad2bdeed92d4580523e5244640b9e6d3609b022e4b4d0c631669e00571f8d602938eca0b3bf874c0706966e3d07902e392a6721b7dc57028b0bae7d93c40c803a03968b2142965ff03f92d6e729a0e079a9dde3bb30c9c10ce6a5627bb476cf1f879a51104f3ea6d0599bb288d2ba5e0103352372db8ad379cb629c82d212c1d1c6543a8070fb01f61f509c597e92a05f83ed49f2a1c1b3ecc64ad0a7d5884320f481dee5211716fc1c6ef96f34926cb5ea86eae04e934c6c0214eca8369928f2b0bc93c0865cc4e165f2eb1c381642560ade7956e5d69381537b796a11786e8f20d264f0dabf0f31be89acf8d7fcdb2a063de5a9812a3d6aca502708d448a869bcbbd3449eb7e893e3c96cd76039ca41036c8fa9e365709afa301c30b5430e004dd08900d75815936deaf9e7753d8efdbebe09c27426b55161bc0ab3fb00973d093ff6088ab6f309cdb1e40cd40d3f933e0023f0c210cc7ddeef2d29d82e0955019e482782462542e186467bdf9b866998a731583b0906ffb0174cb44499d2d5e3d1fa3577f7344c21362f77e94cfa981913d6592ad1f537c13067f8e7af921db28e93673ee38de0dfcd497d77162fcefc7868ee3f27c07b0d818eb553fdf7acae2db4eaf657853a26b0a760954331b8c91e763f568d65e658c6eb53a69ac6bc582c33f8146f6c8ad66d8a454be952425f3c0130e658bc1934db754d70774d73b40512e7a9782c4478e1f AD: 9bece80281dd6d8eed2cbca8d4bb08df65feaf79e9a35d075b18e69dd39ba1f47cbb694173432f5f0ef125a9b1902ca97820b6024ae5b49a880ee9e12ecf561ab5abdef81366019a8be495af1d664970178df68f38cd83b416d0076a522a9f3f795e2d2c19c75ada025cb1ef41513cf2c29df9a01e16379c101197da782066f9318d4fa0325bd584b04b1f9597070cc551693c964b2100191e1ed949c426fd2befebe5914cb567adf7518aa4574921516576bc33673e6ffe422c831e616bf6d03476af169d9c4208d7975460873e2792c209c089af7014768c0ae9fa8011c533fc890e366b04d1b79ee7d7aeec0fe89ddc7400d6fb8878ada40a76f65df17bf34919fb5ff7711ed698bbcd3ee4aa8dce8f879959011612a3661c5b CT: abc04db39ba31976883d21f55078e5e4f5ead60c56b232124dd035215a124a489249ba560da193cc3152352f241070313d8e8b693bdc7f72e91c34a5713688a6a8ed1d3a3fdd0c5f118fc83df42b8ae307e39b35021b4479fe240be8e161407bd82950dee7d9a13d397cfc10d38ff3736f47a4da0ddf2cba1501c18674a71d1a1c948e038632d65ab51fa41347c583bcf2d13b2d22201957f607e57dab80e8a1bdd2b9cfe95b204976c1fd5f5e9fa304d3f9761b63d0f5dbc7a129bbcfd97c437b7d3bfbaca571a50192cf309a209dc29d51a18cee2ea9790309795ace41ce20c12eebfc6db620c398d3229e773f44048d596bdfacad90e277518ad0b2f8841eba71551f79fd891cd1aa84c6c87224bccac2c95d9ec27d3d0278b274dfa30a3fa8684f7cf50bbb80c49ab4b4ead2943e87a31dcf29df040f1dde7e2bdb097d230bdefa5d541572b9e759edcf498d0db993f5904e838d53230e231cfb57266fe0128c2d8ed81d6be4b0a14c286e9ed109fffd1cd4d5d5b8b280c238e7e276095659da7db5bb400c157901b111036ca13af2c7763fc33fb45f857d4250ac1145678dfa99960c03327cd39f521d71b582a85da13fbf2905faadd0c4b7bdc818761947a5fc42215657959c335d0dd01c8562bcc6338dd183d51e8b3261b90e0642853912da5a19e3c74a6c109e845fb700ca20c5c9c4a185b1060a830c7ddda040de695df1ac085d7a0b0d433a5530e5a5fce1bced424383520ad85c40d709389a4b3e151e4e8b3c68bc5f62bc9acd0885fedf11fe TAG: d340ff2101c55bc874a152a64dbfbe91 KEY: ee1a9d7db69fa33107543f111a1c416c92bb873bee9f01564b44922beb1c8158 NONCE: 2c9c6974f2442b87c02cb723 IN: f5f3c05c78a22b7ba6c3387fea2d07ff58ad55c67aa9ada12563fb296812d087ef3b2d47ea1adb6a7dab646bfd1aa9288c85685c7b41c14eed3c5a34e0642b20888c8d51a65a1c332f1cb5779296051065211e5ec624930f1a2bfb6c10d479059063a2a4614999b0327d00f875162440c29627f817057f5151ba9c9364f0a6a9be85fe7fb911efdfd5cbfd741bfc63564f0d73eaa7bbf4fa16de77fd807bb27a9afd9e62c86e7033b8a969cb0ba9a2240de1a8e8a3463c2fae49c89b3cbc97e59eb30c2ae35834c36c22bc056a34cbd339ea469f3d8f032b5ae10eb00003025e55d42c12d9738ea74703308633f2772e8cd3421d8fc9d334c2845870a2c68c553f4dacdbada3af4ea8f20df3891aab8db9510c299db2bfcce4ffeb5ff128eb3c798dcdec4c665a4e7b30ac120aace497d03de3d726638db82034a19df83e60cedacfdd511a937ed73adeb1565661a201197eaa7fe817bcd9b83a19052461f56c3480c0e0d3314c57aad4f02a9e10afb967f752fb144bb1ecce66ea05608ddc7c876ba95698b04e79a429d36739d31b52e47fb032b18e7686923700e735750628ac0effa74298bdf7b75c115c6ea30634a9636c7ec5a02aa467fd53292d8991fd2cd45078471ac3bd8dbe47ad901047522e82cadde3b4f9d0a1e2b8c6faec2da532a09c58acaf7207fa49c1de10f377bcadc903a3df381a10ebf7556465096a0506e7ea0e7f11e00411f226bf2897f85791d6e34641d8cd049d95d996bae9dee6b2417f558f102a04d758897c484e930cc97d13f540c00f950a1b384ae5139dfaad258e13 AD: 15fe76b22a601f7a11d852a080c228065f423c380393ae13ba817f18afaf48f7df08ae376d62e770b0c98e49298bc1f6f1cd07b586128c42d2196d26bc6752fdb375a0edef255d139b35841f426f090f270d5153efe6dcbcc2f4d4fe19258284b98cf70483996003889958a7c993fce98ada15a8bf16137624a2e078fe16060b640155615ed55df21d9bd736df51970f11b06775760116ed1a624588052787f6e95c93cde1c4661c9efafa2d2f217e86dc941263c176bc9e15af02b922e23a1839cb4148f82e8d8888de16e17db10f659112ae0f28cee8c062f34f44304e32fd3713cfbc830699e6aab24aa1c829bd582d39c4262c625c45bcc81b5e07289eec77fdd1613a7e4955aa96ba05c45676e973b609aa6136f5e516e338d183db9523c3e2fa6d CT: 829f34b0c9a9dd142c05e45001836bd524075423cd40507819ffc9db5f5149cfd97cb6584c280f936c8fa3c0237673ff858aeab5f678be466c8b0f9356cd48d0a4bf55f5826115100316d5b11dac5cbe21b817f8e5b2587971d4a1f47695f1f917a87fd64356336481b92922244639cb2455c3bd0b338b24727f14c3b68a92ced6a6a58fd2c07aae4b5206f5fe355de532b996e6348d357906ed4736734b62bd27f8e832690b2e63a2fac998b7af27cc98aa64386594eabf12d5989716e8c36169ac8f548433c6cecc114279cef1a62906bb69233a3d74462f4a35528a98651a0325c06c3667ec31f7b66bb9941b843c6faf6ee56a813b03f3bc8775bcaf1efa10cb4ce784c99ea79d49ae57e4a77d7b069f8456b66ddd04a8addfcc441fc3577b5ce2e38eecebe4963e78dd5728e347654403ea249f70817e545528780668c69bd5186cbfa73e9e7cf3813952377f748c6736988a0faf9f06112dad90733847dae8ea272ac49f1290a417f4eb09f6960e0bbd90c098b3d6bd1f49802325e255ad104cd18a90189aa486eedfad8ca999f533ccfc30e63b31809a2f0dd6bacf29e7a4de79813dac86e3b324e7cc89abfe98e91e02a37e3a5d224207958fe4627aa5861cc1d58515e2da73eaa171e29bd436786a8c54c449bf620b0d91a0c001272b5d047a93289e2d6a31ccb14347b019473214c9dc066d867fd3cc9fbec4c1ea887c6e009bbda41f5e888bbb14587c04c406566abe1a7f473f052a17c3604e837d1358255c70098a4993fb0cc25cf89326044f11a7f4e6e320afc5c8ae457425427d5a08 TAG: ef86f2b8d839c403d817a7a4b73b727e KEY: 7f603bab7b77e7acaf5f144e9a301a221111ae8a3130b0a77f638dee2e05d4eb NONCE: f314fd627004e9a78d133482 IN: 2040ceb4863196a75e5c5ee70861381d6cdf1363a893db2bdb201357c908284b91d690770205be495f788afec67f205edbcf47b78fdfb6e1ca53dfea501ef7fd48008ab05a58b65ef8e3b25cd3617dbe7482d0e846d04d00508192373abad114b6e5713f84de6928339d5c57e4abe88f0c0f0913324bdcc661fc85f391aaec28772df8faed4069573ab9ce2868039b7971b510e8b9239eeb066ddce13e2fc2579b159b08ca564de01fcc32abf19f388f0a8e810fb4de96e19d02010b75ca55d4d6db6c1a0d83d36a9d30a980f51e8263bbdf18cb768c5d912cb1ee8394763dbc7e9276830eecd1c92541ec53e9fcb5be036e8fc2da7c51e9b7978a7fb8e24182825d8a219167bb925dbf639edf4a25c42ab08a7ac8013696f7e10cf0efb57ce4910758ac0726e0bca5d30bf4d0a231fd12420b9b60c3a690e0ce0106c1bcfc47121253347bde0b02845afe64a46c74a401fea9f81cfa02d47f3c6008be65031e26b07d05253d0fbabed865397284b44ce2c38b2117f90f7d3bc60a0d9b04c6ec4b5108da61ff7f6d30083a33528281bf2b543bbb2eec909bc8706c892844e0702f224cafa9f2070adba7e3942023645427abbef47ffdb9ebf43b24aa7367deb7d05241cc5ffc0d1e07554545ddf0f6bdfad4657222fa561f3f92c83fbdcd5b0b93921842d2545b386eaced2fe37d0e5601bdb969125b006b21a8283d8cb5264ca2d8765d2bfe24fc04f8feac32293d88bf6a3bd7764847c72b07a9c3caadb47b96eea17199713eb48d03a8b37897defce70b258328f0547392e7e82e2a1be53c8e40d58235f610ced56019a0696b77b16ed8bcacde AD: 1c142bc3afee168755db6b8d81754dea34e20f6a0e35ed9da60bca3957a054916e0072e3c5329ebbe2bf8f224efe6d501e0105614f72c8e37f2cb7cef644baaf7bf32975cba8e519034427b49bd589d076e3a79b2a9c90170d1e503256389ea444036523d36486bc2d3a94c73afff7bb2b48d0d74b7607c3db43186b9f85102a49d4c0e3cfff1dcf8b5c0cba5ab2f28e1dcbfc858f57f585d5e7d4ee92eec6ebe152e4b160db923cb8d9c154b631e3340b61272e0726cbd88298a4a6dd1d01fabf67d9c66c4681019e13a0e0280e91dbc3cf20e583b4a401dfc57cd3bed42d7e889182a0b75072fb08f1be187b3c7990f9f17bd29d61b8d2bc93f1a78e84fc8c38c4184afac57f3c6915dfefb3e194afa3919fddb1efc685931e49129e3afa230681fa6e7c1d6a69be66d0317d CT: 93ebed6f7254c65c204278a9acae0b123dc19d8e226e41511f349961b1939ca83970b9696f31a7fcac5f5e3d4931b0a592ac27fec71b4e5679a56ad1bc3be37d4bdaa50bfdd0d00545d4b77e757ce7a0c8abfedc9585199ecab1226763a81f9a8c6853462c483f29798a9b28073a57689c5514e356f9fdc3f7bf8ee0688e8cb781af3a365ba940f7ed36ca68f6622fc6b6310a4dd7f8587853f58ef485c82359840e2784460109b4921e4b7ab014b28571938e18b4525bb4d5de35e77cf44573b167883feb3c730945e9ab71a2b755cc315ba99ab96f8d4a8f46589f2e8906b269519da3a2dad2a7075629c82096f028ba47c33e264f55b8898ac5681d396b8e6d23616c1f8db24ece718c2938f88c82da1fa940ecfb402fb300041f9d30e5d47e2d74a4d9822d35aeb6223a4457d621286444f732bed704d529df95627e153246e0688fa97399d96033a06091e77db420c8007ccc33386c28fb76a697dd99ffab76705a7f55797357e563cb607e531938380dfa64800391f06e5cfdd3dad5f91eb7f2138d54cefe9edc0dd3f4d674f5f5aa315f0e1b7922a37821c6cabcc9d81fd002d159d73b0598ddd21b66d3db416b789a40fe886027f1a13d802e54a6bcf691ab029560b67307ecd373f2f9ef2ea2c334fef7d25799088106bbee9fe2b88d06bb23ed0510284c5e1289c1b65a27e4f0fe33f18a0065411ea9e09e65b589a2372f37d0f8f4e07d95f6e8f30fa882726d29f41782b3d5abbd4a9f2dc62419c684a4c8aa92c4adc71c4db805c29b0e561760ea3deadb7d41e7a07a67fed68b8a0f4460e5535e9e0b9f7a754d6f2398fcf399a277 TAG: 7ec06820957f6a0e0f4a8f7ae0be696b KEY: 0497a937c827b1591931dd17e83207cdbd56f1ec1270b14d9a7b1e2bed3e1062 NONCE: 86300bfdb282f9e2db0a43c1 IN: 8132b08093892211a8f7b210bcf36120851314cbd8a56f80f26dbfdcdf944fca9148c1d013844e897b034843fc0c8701120062102ae6a00aab0063a1651e0aa36aaf8acbc221ee7575748562288c08050a9a562ec43be7fb3e54dae418ae89476a1d5f81debb13eb6c5e0b4796abc8310e70a5e4a6619923dd6230a7b2a8dd36fbe3a29aff8a2ef35820ca68b07e00f63623db10a648014028d314e01cb537973d03420938dac988e7af001d571fdd7b1606a06430b5fa1770b2f30f53cb439a02771140e44356c3bdb7ebd5e7af10c344396bb3bacd58d32f07a26768afa741a2dae4e91cd8dec01505edf362f38b0fb06c40b8441746a8ec31d9aca6437d1b75b5afa120856e3d87d79ea5b71352edfb56a873d206e8fdc5d5f0bcf91c0ef1beb06718006bceb35f71dc0b7b9f65509a00841930c4087093c0e04945003751c40e59eeb10f62ec33f7a6d16717804519e930bccfce78c316cb720e109a75b30e11415fc5b398b76cebcdd758535798465a8662486745b6ee098f9008d0cccbf8ce2066b12ceed80cfac806178068d2ccdc00ab32d73faac0cba72b5ae75150c13dd0c16d85332d934e56c8f96bfa942fec689e9847283a307ab775ae09cdcdf1c0635f749186868537dcf0123baa295e29601052297aa4b3fbf16b31620aeacc12d08345df8d879343c098372a04d32fcd2470f4bdb3aeeac7afcdd8f95695796c64cd41bb0052905c8b95edbd0bca3e9115f119d29e109198e91b9a024c8a4d67ee864b71eab16d4545862403bdd0720346c43e94793b1ad3f02946989c6e30c978e4c62660c4b1120bd49017203c86f5b9f02bea17a249d6396e390df1abcb508388c735 AD: 565ae471a3d24293cc33aeb1cfb05025fd4f17b9382a391d73a2611784358a9a003c1ba16f493f020b1f1545555ca165c00e3bb4a2b855d99a91d4f95534424d3b8b32ba66fbf3de63694b18efb4e0aa62e438eb3a7f50b0551ccb19eba8b63e19bef0e6468ea84b2fa62d0deb181e8c3b00a55198eb69ab7eee2352989013fbadbb26d1c1f5033b26f1ea886a0d1af6c76a78cd09a8b1f247d6f81d7d4e521f6649de7fa5b32b45be2cd803a1adc6fa89eea3a9d876ed1df0534890c9b41627556103964aba36e277d1cbe56bc14458e75c365a58646b7e498325bbe815e645a19bb33d2765a36a61e74eefc32ee9fef4162eb77574638dea2cbb9753e50b85eef07284ff84996a5969af62090ea20c6af307c1b2e56486f50c13d5c4087ed471dc737c4e40b7bdbe9d74ecbd6c8dd0892449496d0c CT: 84cdf98efa641c2c008e2b2f6a8b59e20e95aab15c276a21569a1ccf8b7494b6c9585220620944517f167e38db24bce3c81fba1743bc6a51abe0ba858d763420ddb06a9a36eb417fdbce903c9528f1db76a70f73e50e22154e8807aff8e05fe6d3d28e3f09135486b33e59ef353e30a294be4870a79664d86ea84dc581ae58ba8aa6355ac8289855e7aca0940669cf5e7b00eeb5a5e9c7ca1dd483c6664def93e76244636eec70296965eca0f6c34f1d9923295e343ff9affdfd51492066cc4d5d762db2864db889441dfaf9c2354acd97c823071098b8b9da9b2a91ea98d6391e40ee4e13b7c5773ad7124c1dc22d4e2dd6142eb665be2e936a20edcba8badec6081a07e54649ed2c371a7f22d4898fcf8cd9916c7033925908c2a03c02000a456ce2beec2b2f94c0f92b9a7885c9231886993600e734948b34fa025b733ccef10a8b66d52dc53b850d2632e1d1573256430661d1aa716fb32dc525e80c96afc19808449391dad1165de6668f9743ae1da522c9a953374fdfe214329c00cf359b40bf9f3edc4144da66e3eb9ded0885a1d3b441cdea692ce0e324686e7b2128bb28f6e4256b4ca1463f93f67743a53509deee18be4f9f0604c3491559612b4052370e4fca33482aa0d2370baad1b7e64a1e6088ba87fda91c83f274ef9501385a96b4df53d0ade464abbc8022498f9df1b2608e42b1905d1dc08c3e4bbc7e3b830145a8ea9d7bbf64cec752ea11195947b587cb5abc811307a66b24df8c95756ca4ec7e7bdce47679a2327f08b94849a7760c702ce07072ad7621e0bbb0fb78e3f6a7739de57c29d49057a7ffece9c013384df796ac954f61590c472eebc27a7adfcebe3ffe TAG: 18d8a0469f1ba110dbf77ecae36e63c0 KEY: ba16e97c864307a55f341121b5e35c47530a9c3059db7000688bb568f4a87be8 NONCE: eb8ff97b4f599c829e412edf IN: ae60ec1dc53e15d608021b6afa827f48869b9c9ca017a394d10f814c3172b38ff27ffce750085c288e257b6a2d7ffbbcce9e7acfb12cfcb630c84448329483739be37ecc1ad122603a4f286a48474134550b12ed8dfff73419494a8d251a98fdcf7c329b0e31b0f9379faa6bba2e4adbd429b199b7cc31d2805250082a88f94d3a120a3b07d0229d4a49e45f2729885e55cbb9ae08c88b65576fcb8a96ef23b629422ddbe7497fc2d4baf812bd03a7d5c03e79cf522938337ebd1c9cf3a61d331aba6b436c21ef47b030447e839b94b23e6ab10ac09a1243081544081a09cf35f6c7da3149fe3c8e41f90da05d88e31b32744214ac3a8a0a9098b11a38abbf01da170d3115fd4243f2be6eb8295b921e687755d0baa3fdddc1fd9e8d78992f08c50ea9caef49989872bf00b7f86c78293896dbe25effb4cba7822382ec3aa42a95221eda5980c488bf7ad0031e1ed987096819cd01ddbd03500b348a15fda2f9cb9a870df388e2e7f84386fa33fffd5287f1cb795fcce3a24fe371ce42f2f34dd8db9d1826b6a454082ecd0dc684bdf35d3d7e7a9606cb5336c67238509f0386275d58cc3ce7fc98fd20c77ecd1bdd463ee40e612cc5b9082f3c12b83f16c32072834a64552549289ca767acb23c61b4030227277e0df6ee9acebddb0c3bd538040398ae57767c850066b40ac0c1d7f5de22747051d237f898306beee05273a99b20165c2d7267f65b5451605ad4301a82bc80268b49e3084957d8ea8fab59a6b31f47f76405f5575df8a16a5811a976a84ec23479daf4d1d2c1ef428a9ed39faeb5a625ecd25e04d37736230cf144eeab686180cc71aa713d522c9f2007aae4eab486171ab3a9c338265193d093fecd6feb1cc1d91d10 AD: a5f2dca9243d12747b5fd3ed809c06f52872136814aed50d61ac932fdfcac2e9ceef817034647b2f4d61f5a0bde8ef9bef2789a49da799ad1b9bba440a29e3e15e4d97b99c0fa2abcf5cf0e05acc89da732eb79585cf1d6c11a6c65c2087f902ce230208b5f1ce6cde34711646b9db725858cecd3716906853acb06c30c7dcc3901eb407efe6c3a8e1e9f9aebfb1d7217cfc6571fdc4b86d17d66d6e392ebf03be924c0076b8d1f8bff15e192cc5e351351fdb6b26364d883581c3f8e769e9a5689d0ab2f308a1dc47d7032de91124b1ca3d42aa3a8d57ed92a97a2aedba2409b38023c55954d4d5d2630c4dcd5ac7277fabc3408f0265560d3de4114eeb0b10db4d5270725f4454dcb1c7fcc1e36013a155b03181e1a315aaa251e9ab00dfca8e9ef787799a23529fbe8f0f993dbc2338b9f300ed18a67bf92c600f22d803 CT: 5d0cafef15ec06bb165c248fe447bfbdb89207ec1331c65a5d88d419576ad9d423d20d660c95b48bc437fe243a6f860f260894e0230b702af0aaa4260746008ad679676a92003a10ccc12654251de9d2cb09f7294c2fe8c2f4764efbe3984e7265abcffc2cb3e30c5611c3f9eaba13e847fd73fb3aef12c8512b44283935c51d48032865bd6efba3ee4e1f07dea2e26022958f6a966fc4059c81fbec916bf4486429f55732fe3e927bd4109a8bc9ecb820d2c137790b0e296df28f2701ef5cba2c5ef0c7732849c75f59f81460333255f139fcbb30376c21ca317db1f849f79b1826c8f3cc0852e00b0dfb94bf3601afa09c27c130b5088c05619dacf00f36e7c01a9f4a2f24d8be1ae778fef1d367b04313f8cec89c708a57bb332b63e60d15d5b4abb2d5b0bd0dca886e0014051053a5e946750be4a9553549d9102b0d8c08bf9f850a6e06aee7030536ecfba48aa577c7d3614056d790c9130544c172bb4cb386fd3988f149cd77ee8275b0fe434e589b64c13885e9ef4047627dc192a6ad646ac6d62f482eca0183d23f65a29937e9e53a1235f66436897da1213607cd850c32cda9828010e6fc3a93f5f9c709ff259921ce890435b6454c046fb01c76513cc99f66a5c2da8f16525b68e3cc66cd6a7674e674bb0cd8487953ea9048a170ac8e81b616e78d0b8460b729d885f4716b741c04e6236d2171017a5d433754aedba3aa7a39675402337db7081f45ea37374a8f86ce8898ea837583a300c0f74c6292d37e7c6d19c190394dbe777e454c344d7e16bc51c0d93465f05327ff29303d80177b9098b4a4d809fcb103a8c199e3e8f827b237408a242a80ab388d29ea12ee8a0fc313367ad213f7e696f90331c7ab9a5730cfa1 TAG: 359febfe67037a485d7ccaa4f1b6286e KEY: 9a5b03db114ff04aef285642be0d552cca24b615bc1467ccf9818929c06e9659 NONCE: 9fe335e06fff534915999ba3 IN: c3e7ee9f964ff4c3774c1c63ceddf8674c9c43cd4874f34e22c5912e6f8eac3e889779e7b4ecb2af711665489274c3201a68d8bfe7c61e6e8134aa08d71ac2a23289eea43d1dee5b4fc4caa3cfb666d59b09c554bd924b6522cfaed157519de12d9bfa37b55fe8158d763e3c79b7b10db45bdae4ba18af925bc8528fc19e9af54ac81588682299cf0997eb9710fcc3597564d8f0b71e3249089673b3771ca110a28c1aad49f32301e0921286fe0cfdaed8f64956a4e2c0b22011bbeef46ecc6bfc29ce023b361b2db0488a2cdab32bb94024e757abccebcfa0a672acd77f9ba622a665314c4b520746ba4fa07488e9dc662f755311535f1f98558dfb2be88a86119850c49d4a0bc92e70994ab5d7f410ad20d61fdc93a08e460ff9628a5b242038a1d2905137d4729fa77ac0f74bf1d32fa7b025cc16f8004233eba54fe7537d0127b1a062526d33fed44fbd3475daf5c046123befcb6ee574ffb9620fec7644a10643908a2d3e283864e3011704c4b16dab7c5333545c60ec83b0f7c3e2dc8022ee5d1b8124f766bbd8fc95ae1a5bbbd2ba7eb5c41780627553b8ad99643d8abd43c56a32bc159ab97f1fa4622cba34b283317cabf0bc98931980f207efcfe6d4c4312cd9daff8d46b1f9eca45e0af42bb8b8ab25a9fe0caf1c61b40b1a8a3b35680abf456de109f42d87ef277ca178b4471936748f3232f9075b58c64c89614dde8a75dea86d3b9c2a6c4a71ccebf388becb7a2cbedd92b4ef95d2b72357b4d2ec099a3ff9fa9ebdfd1d9adff3329b0a4ab854f84e8c729538b0e65773a116a3e50685c96e52162e1b98367114d84e5476291fea3173ac3a846529d5af6ddd0d2272b54f534d4430179ce5bee98c3a9d3f6e9cd4d7cef5c79560674ed0b5418e21e9cf7ced787a AD: 9db3427d6153ed69d84ee4ca06c515d3822c6338868dbd97d0a21406275c003f493475d4350660a4f3afe49deacd9f299fc05aeab4029f57d05e21cff132cabf6de6ccb3082e0d8811dbe5188749a2ec8ad6b1c1efffc4031605c407e0c2ce57478b37a4834bff670b4dcfe8a32e6d09a0c80c7c99f7cc41378efdc0231901c7643bc8e0575040d1ac1bf4a79ba4c10bae1c0135ec4469bc8b6413a068ff97e88c4be959f8e426abf3cafa2bef9925aec0c1ee69eb60c7427dbf79656fb3846ae4ff059852e7686311b2778d06b5a7eab71ef92bd086ab0de7dc2a3d4c6070436991a68d81ef5b1c6eb024ccc6b2668c98e9b2ce452ab4751dbd57c2794798f5d9262e2df48788d92045b23a455a135c112e3baf06f2938a485f874a7d5a251770160dd9bf9c93c4e2a789edd07b8a7a4262adb303ff6ce9c551be29dc69f99d CT: 28c9024090abbe09b35c4e289dc1b9574ff5172edb28f34e9133539dc98b4557168bcedb11a94c1ea84eb4b803661e405eb007c17cec80afb3121f27f185a197b4ea3f0ba231e538ae3c312e2522218ca2a73402ea7cffd3c1413c0ca2206caa91722cb048e1ec15e63f6c55e563dfcb4c3404a9c380608da0e903bf8037ee1d740275d568a2a3f9ee232d88950b233287b2bdcbace62efd1425c43efbaa8d12f66852cb5f1b665e7f4cb6fb5e3746cd5e8d612bbda8c031fe5ed7f4f3b5741b2aff9bdb150f637fece13ea1f2f5d32718560a49c841f3923d993b1f5f65715aae6b651e7d8f75ff34a9d1737b9e3f9a0375861458faba779ef9f4b72ebf42097e1e0fab5b925fe85f54d40f940f7ace96125273da94c9e394fa9a80680f6567207ee40ffabc8c152bc6956dadba45eff644213178a7a24882ab59ccfec9fc525ea9e37064ff5566e9ef2c56a9d634f59cfbb0b593d3fb19262436b68f57029d83205ed6c466885d7ce9a33046bda7dad9e2ca92691b3d5f1e48348b17aecc311479c4b147f4d61ac14640006a7c0d83b45372073752f9abdb5d1908dc3ec05f85e70324088e360003dc774bb68347c2acd4322fc1733d36e68cadfa95030dfcb9f73165786a30a7e841717ed8b20bcce47ac9b4900fb6d35c917b291a9b5dfc4ec2679846447a1dd140f48699b792a2969384c7e8914522286765a3013e229d3f3e30b130efd498a1cb56cdd493a5fc8bd9726a8784956ee379f907cf2280745379784bf1f177318cac159ce656c4321eac7ae00adea35e209b38c0ce622a1d4451a2dc6e0c3d2679543cdbed19310976d0748db13e341c396089d977546e956c96199828a8cb72ace556a2ece3edd3efec2493a13d61701a1bd525841933e8398ddbe16cd96a2c TAG: a1cefe9bdf19616e49e6dae07c8a73fa KEY: c75a4cdd53afbef565031529cbce2ebbc5f98b71315ea7dcdea17c88e7c8b3c2 NONCE: 0da68ee6ee4e0126b67d2a31 IN: e1755e532178b048b572f806ab4bfb398247b393dff9c653a452a5ff88cec05ba1ee8ebf23e91b61b1f9adaaf771f448a57f4572d460b8304f8a2d6ba8a8b89e55d13e474233cc8da704c244c6862adba31219d994f302ac7161604d324100241fe6762ac262a5f7b5a07c67cf3f647d2d60846ade2dd33f886ebb59c50d95a4a0ae103438a65bc192d03f351e3e56b6da169480def2db510c83b6ca91534683cf334134afb2491026f7aa45978aa38b38d6a8d193e9609d3d0b3526a14f7b131f9371f56818247ce4fc6e1b17ec6e99b67123e7e34faaa8a8c63c1fb9004604e5ddb32702f9be2246ed7496dd27fa90ba90d90575c0cc45c0b9fcc945f21bfefbfbc82c53dba1feac88db291f74b6512d45cd7a4c5c886a458947f0a30ee04a6866ff5472f6c921d1949b8ddfd623f744bbe5f47950dc0c7c213545f7ab63e88124f79000afa6ad2a10b0dbfa4f34e475420437dd10d487f42d2cc40041af9ef3a4f52f80c9cb25970a4a4af8bc7dbd8fa566fa588d57bcb446b399336fe43ebac2a913d74d0a9f7d97044213390372d4272317fa41a62c50bc2b4d736a759c85124562323d86f1de14fbc3899472a0686a5dae4a3e429efb05681a1d7a36d397741270b2d97aefcc3d90309365a64a0e244d62a4fd3f288f706fb60557d9ba2bc8e29b4d68a299f13ee93d3c4ce0efb7fb26a3d2f828c1268a04d48e5ed520c5334ccad9df4799cb58ebe15284a41aec4c2b9157bd2851f968a279653b3c9a522df5e2752f75a3819d4610ceb4da666d19b347f09dde571ccf14b435569b9624d3f3207ba49b05f40bd818c7ffa733103f9210cb821ae8ce1fd5bb80a6d3d8dba865015b52ad9af765a8190713d13890440ef64474b61a840618759160c4c692b5bfae7cab08f941d633a22b92d8be39a614903ce0f96d05 AD: e83596b9ab4cbfae18e4e8bf4ed0cc481ac402f27fc81a0b62b7843ed4387f2e994799e0c9532a1187fa6706d3179cd8e3bbde209f85836a176e43caa2dae384f0331092292872474d24fcdbe72be3067f542e7b099d31a0b09e0f2c31bd16caad1fe1af0f25845084268431b930685f6a16fab6a401a80590895a3422b94d056038935b1182ca3e6f4ededc86813d651efb0fa80e40700a0ceb602f3a67784b60b8d5c8522e42519c83e6f788d8133044061095806506cbd0bf3a7fb94e1d59435d3a5cd9a5a24db98f20035f0feed9b12b6cb4cc3e18c97aa890d61acfa167338b1cf79868f2a14711fcc241290709e800babf3ba7a868a528d44be867cca23f4f80b1f914ebc6abd630b4254c1b8e01241fcd817171e2d9969d2ba7c3f410a9d5b157ae0069b97ba1c973d944f11208777cdab373131ab5ebaa1304e394770c1d277913c54e7cf0 CT: 2a59d868291bda6113708e551c89d1d4fd3fbc81017975fc0b99d8dcffd757f19fa4acd4acd47c90100e27eb228ee59ff1910911f8129b8a2cdc59ec38b73cd096271e55fd097329768d102f4398c4f70c52d7b15fcd66a94d0e910a5b6b8bdbb857592ee42871055be1b957013695288e52ad934c6f802677aa89c08654fd932039417bdbe062a5242d5d38b79ac834c7e7fc920bc3981dfb780c9f10f5f761a49a3b95693ee764a97d4de73077838b5ee04ac09e10c72669f7c151446497c9e2c3153938efcc62feeb9b82e605b4bd76ad97b7401ada9bad71718539d47e6edd058c23b5c4f3bdf69d74ee58b7d1c94ef660e4e6b1d43b97cf9e8d191178160bdf0e4fb6db2e9aaa2563322e4413f3b5d57d0f1082d160ae2bb2d3cf6ac17d75f73ca1c80365648a394edcf62f520d2bb648d7c963b1d7deb6eece9583ebd2b2bc2cccc5415c774d9f25c00d221e1f0c2829e288721a9e416df098392f67643d52a9fb0f2f47ca97664aacfa837105e5da4b86774223bbd238a060648f689c59aea623cc688c1aecdffb13d9471fa07352ec02ffaddf080733f07d10ba61eaaa9f8e0d89b6144af9d4a0094bf9fbdfa6b35e9f342a7140ee4c931ffc0126eb8b4cf6e227fc6bfe386e81a32593acafc6d44925f1cf21924720972729e2e9daae0e74f55045d17c25c4c3b8454f912a0f6f6ffd43119ec4f3046d921d20f24662d25d0aa34d95c3a5aeff05ef1a8905ffcdb1b9e55ea22e59a3f5d60106db64b998f0e9683a16c5d82c53b424220690794bdedef384d91bc9a58563fadac76b50e80b64dbf695a38540a9167cf025ee64d28e26fb3dc7e9f33979b33eb887e55d996741d9569642769ddf6332e369674296d510181023a1a3e4ea7327af5838048458ac90a71732fe29e2edc9c477fb6d8827ab4f83ef8626 TAG: ddeec4a2536869f8f89ac38951bba13d KEY: 0c13e877fa5e8e0572f237b646f783db2f30274ba46c51d72d751c3bd4ef9ea3 NONCE: 2b0a22b260ad3ffa73ff1c5c IN: 481d15ea2246b6da59e6271801edcbe277591b188386946abead76ac40d6f2f08a26129895e97ef25b59ac345f8d060d4d21819d78402279238541534d8734ca66427ecc2baa6741fd093a5895446979e30ca15eda06addb67bec10cf809081ce8a70af92b03f72536a8a11a1e9e3d257352cc284f41e2fc4a91d1bd1774512e09bdd150d1830be260ea418fd384be30f9da23fafdc2c0b5c632ea7fc7a6ea87d69139e9d104d634530a02c4ddae3a2e6854118369e5304202206c4d8fc963a61bb4f42ba6f937ce8281429db4103ef222c3a015f08fef15eb5b407b56165260dcdad08f1196e3d698ac5b7ddd403c28593329db77fad8ab7aacc450636a4f7f6714bbc6dbe10c421d151a7c135926c5388a56d2b66ffeae0508706ee55899aeceb3525367234e29c25dd5bb8b187ca4dd14f68ad317ee5ab3027b68b5b405880528bd35eda7f9c65eef9b375dacb5173b30a28c99e00eb11181879cbf1fb59bee4e3964b300ce57b597b958c63a056758714d69c241da18b480acab2bddaf692f4a57abf2265a0fb09b3352eceb6b26a667668363a615b5d078a4962c48658e3c92e43ca83dd0f71ada43a48d52b793a48e17b66097d06f9e3804202e3a8e832409d45f8b33762edb9982e79948fcbf7213118121cdfe834931feb8d6d5e3a677e3c35d6bdd1a0a51c9c0141dab8dc0ca83c7606f7a31084b9a9a985da6b93e23b215fe4373e597574357435cf7aae309c11ddef6b0f24437df2149ec8e8861e3546f2a950f900d74a8d736a96ca82b35bdf9548d6eb6c6235ec2d98ff0f196fd389234bb44de0a2718302a3c7110ffbad0451f4dce3eb2a189f63d52683509003cd6e0574b94c3db904f9b3113eb44725a5aae93aaf299d05b8aa942bb635cf5e68107a3277b8a70534e90976275809428e77e5163c18edb02334d739095da33d32502fc5b12c6b14a AD: cd316404d7c70f81cd5a035472154e92e8a8831a22c5b34ff4b40e2648df0e6b411ec8bbdd985da9992e3df5d1ebf2b912a1b250fd08553322b7f894cfde69cc37bc794b7de6b5136afb01f8377e0b293b57a50eca913320a0eb324a6009d41dfee2a416e6b9be33b55a2e85d59a88dac4d587e95e7352f004637bb3a798dda6d3a7164597a73e13819dd2be988c698bc7eafe6d7d32dd416e2cb252e21a7eb26ac4baea46a5ceb7b19db842b20d5998c5bc4b78836d0c6dcbf3ac8e2399b82d097232c553b837774960fade6bec8d0f452ba20bf72916117045596f4b83422b026c6b187c16e560ecb2d5dba5b6b0d7709c7b8e8b4d199d19fa0bbff8319dca9b308a836d0c1eb0c6f2a14c13c820d3b7213104491e6df75a1e61621a5c7be94f388afb47d7c5c211621fbabedda16ea22c837903b1088e6cc8751dece86bd749ea66126c1139d98d489dbdb93e6d8ae906 CT: a56a09a3c7cac593f40fd3af345c1c84d29a7905a05087553640f0727283d1fd270773b6af7537bea2eae40f603567132c199e7f74b7eb98f1d7e73a7b6474d1b0b0eec43dbc33ef6e17e07afbb94848fb78d53729f358c2eefaeae4b92724fe0d6fe97075644ad5b12d1ed93f8c07aeabe373b5bca66b52117018955edf01c238a937c4d5e7993fda05799533a5a15889637628e158604a99b2a21b24dfc2af7ec0013390e6e7259b7ac92f232bdd375fa99a4f6c45f54ab231f6d60fc36809efd3d213813be1f3e1b91ff3091469590f6cc439ff359b0706ec0d0667f58c34ba549e9727d9045adffd0481fdd13c4069160eb871afb2d408e4dfcf6b70a7c2e21e4e54f44b2daa3676ee998515dfc4c8518288b46d92ea835d5e9a0c8c391020aa6efb8b30a580601178e486957918ed9f11fbd2021ed7830c3019c935ce19dfbe95c525c8498803eed097d565b94d047112d494518f7af094705f3fb83b22d9064450701ddbd8cfb209a4c68fbc1667099e605b7cf853d5a78b92df4f6194a7644017434f2658a7529941d3cf71865f8e29238709b373e68fe1e800ee858d8286d80acf4f1d8cdc2668f40338f48dcf5774e5da72644bd9513018688509c444f821c0c648802cefc572c6821005db0fdba6f4eed0f122ac57a213750632ad2eee0018f9f240f2bcd1cdc03d4c8a6585d955dcee93cab5d7041148385a77533a41eb9eb55d7be87432e5508e798aa4e4fd4a06e83bfe355cc698bd16f9b5ebfd17145edb7bfb3c57a0faff18df6075d98ce7a53eb4de7563768e3257ac225de47b8a52ad65699f8c7efa64676a268f9dc97c46bb23dbb335e79be532e0419583e0f8753a38d2de790a3160d0fd63ad5840601a78057708655cde8dfb08060cc0f233688227eeb4a0f20d5e9d58bd858ca3e338ab402011ad975503cd5c86ba3f12a05a26f0b0f79c9a TAG: ca40f0179157bae889d49b5697a0e26e KEY: 1ab6dffc716e27c3dec83e2bc2dce5192f3fcd3fc5f3b394885164f501afe5fd NONCE: 42bdf685c73f9c31abdf1d28 IN: 419a911203ca879905ce7d0edf1c29f3874d02cf2b799163c9204149b96a19f7c0eecd64b6ba2bb686eb1d6f79e420d130fce85edc6bd6b07257427a9107bda792de711025d05962dca533c52a2a379ab8516010107bc7879bdb2447973f6d356cd3905e253023a863a3175f65e1988b3f8b92af2ee9b5717d87705649127dfc9c7388c9ddfff5e0dd7564fa76f9b3272000ab7722becf46c1c2d99a51db96dd32fc5fcadd683fb4f7d57eceaf332910e8d275c5f955f27e899eba77b87784968e889dfffd77367c3a4c2711a87e1aa5dce4025ec7aa3908b96cc5fe05de319ba6de6d57b170561b32d0fe4217b0739393fe730f4f62058fd3f950bc5ef151732e06fb92987302c684557befbfca5d15b72a22dc0a3a16bc128698a6fef64511d7945cb1ec973d66e81e2f6481316640afb0344d605cde7280e9e6107131d1b2fdcdb93c29673d0822b8fd1ae0f22fdd17b6f654a65187b8cd45737c8446b21301be1d5d02ca6af5432cffee125756ae7bbe2993033150f6ef19022bc5bd11c9ff9ac8ca8b17c594151ecb5ddadf8465c73969c432f4c273596d9cf7c53187932d3be41a145fbd6485ceb80b196079d89e3b5528c61946ba503844ce538a1892e62457abf4b6f90efde91d1747fb5bca839149814f757d418b9787822c76ad2ec6e5c84a07b0d7eab9f918b71e075cceab5d6ae5dccf54d4a15db9e415e44963c8ba68101df5894fc1664844c7ec11c300ae11cccb4ecee60431e36a2c4516db234378579638b758f10d80ed372da218123449a66aeafbb41bb8ff6564cbbc9c9f734daa1a9e409fa89decdd619ec8d1fa5918d3ffa0c780c0521eb514b2f23a4e95704f6a22657e7203bd1cc15332340414d02f7265023e0c9906147240d0495739bd33f7dee280e2cf905a706dcc838bc2fcea7e4afd823ae2dd3e2a98ff55f3ccc2b0f789e4d5019b93f213722ffe27aa583f6b9f77cabc4ee5 AD: 358324f765547daecb7e2d4b371e1f77debc01b18be41313387181537b360f1090bcd9647ac7694907ca521f84f7865c3c82388c6aa80627ca9e4de08a163391b228be2a642df333374ec7182604bb80770f4a839aad778dceda56764f5888a95e88afbea46cd9eb4f506882cda4407461b1ea2f31a88bc7529fa923ed9387ff03dfaec545dd796243b7578640e0b8025aea75ce1b9ba918ab04572ef65463699d32125f71966242fbab007730e7f490338c60ed9ddefa539cc88d39b254e300b56da3c832065a35d961f74982fc895021fbee01e03e9534e54686376d8f9061cd4d033491b081f15639cb2056047d79f0dd7447c899b2aefc7d6bd03e57a1d7cd996fa282ad7493201920130df3007d13782f197b26ae0cf7d62cbc642d10b4202e1887b43faa4b71694b05d19daab60cf37b6a9b50c7d32b04138efc84414e87f6caca8626c2f764a945a26fca57907486c0db54ba1d898e2bea CT: 2422ea9d13895921401f84f25a5b011eccf2670b1f12985d4e2c4106829a7ec3c7c75f11e348829a8285b34c745d8892bd1efd02c27a6764311962302524f787866520a562ffc9f0a644c242107a7ff868e20ee2f2da9d41e2e85ef00815e6dc2f242a2fe8986d40e37a59f53c88a168d230745a57714c3e313f8be3f4b780c61c0638c3637add213b1cfd5d07255116d9fe58dad2941f8bd7aa7c37ff7a041419e02b8575b46be6dcb23bd5594c713c93f8415e5da427dccb6f3b6d649ebde09f4f627beff5647bcceb10413f0a58f04d3a03d3a59b4d9f578508a21bdb609a7291bd8863e091907f83eba365e5df61991836fbc8df69fb7d6ecc15c85c8dcf99f771b19c995ea85578ff39ad5e1eeca002dcf843f471198d1d4359845944fdcbeedefd158ba9dfc2045910a911905579a35a4d7749361b8197fd69ee1c988cb7c1a6f5a5db2e926b4b2a0cc8c5a6c01fe1d04ece3bd7d2707c00e001aa097e6fea51bf87654f389fa4caebebd513527c186125fdebb3672316b57d12be3619e125d642719ac96ca97dfb7d2380800e48d8fc29b4e50c81e6238ffed2a3e788182cb6ac51023c587a66b3617734d18f6c2e4c959b84f04609eb81eec83ce7f8589683682c683762355f9a8c72d1423d67da7b654c00fadac8fd2dc4ba22017228acb6b287101719726d0b1d97e9ca2fa67235e768732756cf2662a078c5ca753275d1261011127ba47265e7565422a9da627085f40fe22b680286408004ee5db318b0869f8f8ead0e3d1b4a564e250b6ce61304bdaddd2686041c505b91a8e3dfe411e932549ee9956adabba04add4808a2ebbf0ed92394fbb00c1466ab06f964a325a877bccbc47e0d2ab4e24243164ab4166aee41b9222b8b42ce81668ae8d1ee8ca5a0c2698616183cd4c025b6210a33aa7b72dff37ec40f749fdc0e879a5135967f47ac95bb65c411f0306335afe6d7a2247823decb050578 TAG: c867f21b1b4c62500ab27499d11eff4a KEY: 16e6d8c1f25bae57962529532ce48be6c1cdf0451deb047a1d27faa680f97214 NONCE: 8e9a0bc6c897d4fdc82bf439 IN: bae425cbebcf21c29c3cdfccd82245ccfae0524e2dc0b7164682891c85c9d6814c80fce1a63d588928b38dcc987d9df32f2a42ae4a1f9e8ac6bcf285bb08d164afef3ebfe6b299332f207409d271460847e9279d2f0b5c4638cdd989f868b4f0dab1f324e9b18c35e3bc5f798962b7d4f3b6bed6fc1c57055c489032a600951f8d06c14f5ce852d29be001592ff5c3678c0bd8251c883b333d5c670e52072fd68fd8d53e1a2f48dfd2880394541f4df82a9b6adf525c527550161e0d7dcd5d0bafaa4abdf1cc7ae189ada0a61890831eca952cd6e505d4df44650ed533591fc72a9cda1fdb1c4be99a31ac10d8f011ebbcbd8d83caf5d8c33a659d032d4e454ef069b2dd414fe19706681f83a479078f01d6330e2f57c2a3720e5caf67e44ffdbe461d967060e29f11d4661f23b27e90d521c1a9f4f03413ffe794cd9e39dc4c81f43d38778fac476585975b72e26dec8658f9cf6e4e028bc87c8d5d1fe47bd3ad3ff84d1442224006550f6006be543f7712c5edceaaeb3360ac7ae2e3618e093a797223283e0b9c36a841308146c122e3df15a43417bec5dc4224a10ab962fb11c53e3331f0a9967c008541bfd7d1beeed4b80c2371d5ab62cd098fcbed6f96f01fe9cb9f9f7b039bb010551e504252d0752afacdec2f2984d4ceaff99dfef99d57b4d4b1fa969a4e70aa0d868993474f7d4bdea01b9178feea95ce30c0f6b78f22c70da57d26677549e9284bb4a6717596c2c3b1a513ee888915b910c93cf1d94aa4013e891e1da11c41254af3c76a1f63d67f74a07f3176744f7e558f03a3525b4a385fc64e6ae48e5d96779d64b5f557ff453fd44cbe46a2ad96fb2f79ee6720e08bc8e463abe2a9f662540b5105e1252917d7ff63011106cb7a47829c86d374aba8536d1bdac2250045e098987f185ac00faa0b81630d94a41ac935088bd5829e46ea17bd0e19001fbd25208fb312b86349a9c60540dc2b5091c3b0902eda0254b9e8a447d4983ce8e1 AD: f58832d2e9591c5b15a96f1fdbe23b608ca5ef909a656877d36f16ce276e38744ef11768030b479a4b2bec453dcdce933c78e3d4e7bd7e7a906eb74bf321fa75f307861ddc1be310289dedc87a8e325a3e4c6dceb1bdc6a02d1df4598f343ae8a06729502f5abe458be2325ff985b3cea0a166ab7530a560d1971c57c566197b5e004d9d38d831abec067235c0d2ead91b9319d6ed20e6bced57d71dd2dea6a2ec22efd29b146bd31617c9c08cbd26e9dd53e045d6f29a7dce57c61b3a5f6410dfea52c30baedd587cc15993be3ca8e125f61272150a02138c8c3b46922be9ae2d31ab7f25526b86cc0c73cdc400b5506dcd94bb783a97f39d37db162519549e642f9f087c3f41c8234fe01dc1cc8fb0ab3099fe2b8efc1017049d79b5b6ab9f57ba86d2ef73e2c694c180d2860766a4010d76407b15afe28a3866e48b6b688228d2f1fdbbfdfac9de426186e9f7121d1a98b11caa6193f9445939403cc960f2df0ce5d7 CT: c43a2c260b2421b4f4d0016112a6a90d09f5505f982a66355ba55284f15e24734afdf58bffda6878ed052c5c97c01ef9214e19057b87db04ecb9e8a72dcdd04e6c8194283edbdec0b3182f73a009b5b7ee42edaf82d827bbd49b21f9b33b013fa934d710d38d156f35491004a9f29b7fb11fa60be85179d970a95f6a4321c2250d3300186c186adbc9151f94a916531107237c9f51f1ca4a16067111b3357d26c9caee90656bfd4317c2d52e97b87f7adccd296a295b45a173780db1011d3dc010b8b951a14e0057451cde7984a62b3e29dada4cba1cd5bbdb32acdfdd6160fd41ae42c40a3f294057ba27737f815592ee1ca89a57db35ada5077be4ce805555bfe57293552296a15a9be89473af043f193217ca228afc044e6e9a8ad57fbab59ec12c8358361f38eb9c00b33aa97c90f51a5014fa497c102b7f6dc0e0678e99e7ab7b98cd2521ea98ba31ede92cf621e36addf622adc7b0f77d8df828dd511b9e74f0925c8c7df1ce56cc2e5ad79feb27de705d780c2b77c931aba6a032d99f658f73fd9b9872959cac0137e9af2a565ceb6f73b011ab3aa14132422c14692f7bb3255cc96a3d63dd167028d4221fe4a66f0a010f35ee42d97326f3638fd15cad7d9afa2208efc4e2f0203d1254d93bf532961ab24df78a6a33eedb0d250869244c17074a283ea083c211528e91a13e0c585a85cf5887b09734a5aee9a01a0de3ffaefbf3791d1b1e478ac1c369e9e0e4ba825ac6590aa011cfa0ed15f9fdcb0f386fe1a796dc243862a292844b90d32db05ad0eb8f2839fb386085b7aebe12e7477d5eb5ef9b6603004b3c2ecc6e961059b11495d07ab2a164c64cb0d6f3c94555a5c3fe5cc687601c03861eec326b63b614cfef131a89058d0b320f1076023884882aeda8f28daa0a3dc96ff9ee982925db55fef48586f407f576c5e5b9a723f1f10427304c19aa1d39b70a12a9c9f07ae6b76faeb66f4b26cc00febae63ecfc629968268acceb5aadaca TAG: 59e3b0e92ae4aa57a2fc4a19b74e06ce KEY: d4a30afa6fe8b9ed0add15bc78ca371cf34d6feaf94bb7f6520b4379e7bfbf83 NONCE: 6acfa3e2adfcb7f880c53c1a IN: 8b8fdfbf5272fc29b2be7d69ff0741df1ebba02e0525e29cf45063e5da740f6c33b1deffea0eb2323035a21b18fa010c6c3ca7cc0c8194627d828fd5a9898e2b55266d4377233badeaffa7c703fd710441e250d9a5d94d954911d66caa836e2413b190917c1802c3e587d514184498ff2e6e3df5405829262b36fa8971cf8595bd1cd87801ac4c99357da70e2e55ffc012a30cca44e4f5538ba92f17aed8c8a48f85c501df2f0639ac88a39cc024fdb6d29aac368728865db1a30ddb36d366927f04f00f8dd2229e1fe76db8e7ded1fd886a9342308ba99d80f86704c974da156d96c272b806aec6c0268378652c26bad18ab249e117f8643d234b965d45067f42b857f0888ec68aab64b3ebde8a55ee38464e5f35f8653c7f0ba7598ad26f9772b574d7e060377a4174922b1f8ce6b72a83f3a20d20625132ad7cb1429e26865ecce2a47e29740cef1a3d85bdb3e800d46692d6ef926395aefba588294ff410dd523db596a7c17bf7d439ef8200a13e35000b40e9b0b392c982a4377557abca18c1f3bf774f4bf8ab0b9080dceb2323953aa0e621954d87737bba6f562dbb0de271d6f1b88d7c1a712f613b099d2bbe0784a8304467cb168ffde2625edd9f38be5660020ed3e95b49e0a0ca9dc2bd0de2e40fb275b4813289327de0926df3c73865e7689fbad0a6c79ea615fc84345529cf2ef68b37b7e9fa5d538f4dd848ba66adb4745079acabac63de8d2ce9a2b19cc718162e9fdce49de7fa4b820043ae234d8afd23a45ee3a5db124e0f9252111c367beebfab55b2c784581b63a1caf4ab24bf5af45b986f457ddafbe87791788e7c7536595d965d5fcf21e3b13873b00357dfd7851f9e0f198ff950d69979157089be26b22800c3dfc713a5147b0ca4905793a2817281fb112deac286c41ffeb2bfb3fe1ddc9aaf4fb41fd5faf1df2e6e809f54b09f99bb8b61b555efdf4d8cb559fbe57a905d30184c2de6e154d501bc91f6033eb97295d96c1085b510cd57631e40e9ea3225e175162629b4 AD: c44ede0ab5643af425a8f8614e621a581b559f0e7fb63f0c8ca09cc58c244ab2e0f750c6135fc26e433710351802c329edbe97877f912bdad914a051d859c588af925674f1f455a322671793887420bc79a11541589082ef12c975dfd0528294ccb086ecca86ca940ba05f937fb2eb91b4b925713e8ef7d10305bc937aa976c5eefb4142b0c18c1ecc6be979621c437c64e1bcfe6ae86d28a29fc894120da6ddba1e56181b6f54a9e9810a83c3b44b6fba10959139787a491f367658ede40e1289148f66d4677d0281ea3615ab399c7dd9e6e05b8a68fc8724089825fd5f6a38406b3eaf01b8dcb62afe181ed963a0d940f1521f4f501d3349e6aec453edee70f1cc640ba3bedf78ec91acabe75f7de38ab98253dcd18c6a866f4c2b8a94072b1f141c9ee3c43beed8a08d09c2f35f142b8352cf776c57d6684898fdf6653997dbcb2cfcdcc43d63b1d287beb8a17ebc74eb3c3875af2ee0446b2d75052ef95d37315fd55e346c3e8dff45f17c CT: 9d4764aa97244b3506582c24cf82947430e6749bbf3a907a941d398b39950dea9c21aa637a6d5030d9b070ff6c810a0f63cbeb107bfe1d91a2b3a71c2683c2d2716759a74f9c022b88afe5f36182153e5378c12f94174e5014743da44601908df428d105362d6299f2989ffbb67d45b65cb2a35e888d823605d2215f325ee59332a066b8139e01ac2ad5165d858fa809343fedaad3ceff19c50b218da9c1ececd713bdd657b02955afa4a90dc2f426cfee4de4b1e097fad3c5183fdc84725db9263bbc207579175ca3171e7cde14b652fa50c2032d59f2832196750731c2268c6f807625e8bce39faed8f85dfe5fe1cfd5d60434a753159b7196cc69c2eed5f50907299a53092d3f3d41bf7c8e4213d9d543bc235e50ec2f569840abb26490f1b0167ac423ee0a680a70797821fbfe7dee33d9ed120a95c6a75596e04eff2263c1c635da44322d18cf720bc90a113790b9e9d5141dfda46fa2c9eeec5afdd43ca5c0ded8a5abae0d3243ab2f81f3ace681a07a59afe8949061e21f8ad0a9d50e3c8d36a6270dfe9eb08451323f71793a5942ee7484cb1eb033037b209bc8c61b38ea28e9f9c2a4cdb629331a1517606feeaa0eb45c69958df6a5e48204489730fa83aeed0b2fa3e555437fe460980e8813e0521d88100088bdf6192257be14eb151d6f4b5c6b0bc9ca6a0ca2e2944d6d51e3bf4fed6cb7722971768da931c1f1e50872f25ca12e72bc984f48010481924fdaf3c744bd098d2153487617e321e665ec9a1346209695ef6b1e0e79f0c4fce7d33f57087512559a8290d8679555ea7f1554ac6374468f3865a2bfec31f27cbbc6adac1d484ca6da48119d88295cacf38b427f792f25f7d3c341a904dd9d3774e355edc0db3748d65506f2a0bef5d8abd37c31daba869dedbf19e3aff557b0466352db1f5820f3b494304604fb6fe42df9dae1c21429ea37258cc087cf72675a15a8159e33855dce7a09a77ba8ff296ccdfbcfacc7adb6b7b020de0bc302a7fbd1e3b8d51c5b1f520d384aba TAG: c22896658ca6cede859de01b80632d9e KEY: b28f523592ba049b5de3963baaf0eac3cd75f0f0543e0dab651061bac4e3ea36 NONCE: 79bb9a78d035bd8ea9e8ad70 IN: 9f6c13ae2d4638dbebe6b4cc0ff606af9720c708c20dc2d6f0e4ba002a0b41e136d2b10dd6a2f8d9fe8cbe91943339fad0c52a2881b188611955771d3f9a621af08b95dbb77879bf508963fe294c8b8807fb9d8458a56d7fa2a4c5d995113ea8a86da07c28dab43c997e9277f98009d67fcf2ba171016cdb7e6c449f6996d21563b4ab22e933ddfad5c50e9036db19adf88761150b2226e73043a49a8e9934094eb4363d61bfddb791f4c5bca194d451023aeb879092eb2d8c8c3a2a5b8a832db6d73804c0c078c50a1414b684184780278cc90ac42618bb4144d5a415f582a77b247e4e8236bcb0692620757960f5103887683fd54f78095e8b098506c81008a7b443a533a0a71fae3f08bb4c28c7142576f459b1a2ccb5f65425515e691852e0da343291ca414c28c90426f7d5f9d7c78f84ad6eedc600137c4d86fa7db53b1d3fe9b16874b31275a740b5f640fffcb4351e4e32cd6bb7b6fc11f104b2513c0814c370b6a7558d7fc07c355da505a1777a2176abbe5e520c0ee79153c976d71e5c6dd576f4857ba2d63e04d6b69a2d5a3ad1a3cb88733fdbca5b027ae04137f917a650b4a556b5fff90f17bc12a890aaa8d61029f0c6663eba8326c1bfba5d9221876ce3365bfddb714e884bced0f1675b6ffee2b1e22929f23893f3dadf967b006e9cb7a9a0972422c74a0393a29f9c4e06c2586f393786ba078cc52499ca6e911e323915ebca1d1dd203189cda3af76f785538d9f1cf5e5dc5758a490cea8710a9610790f426a0c76e262eeb9facfcd7730b72802084152f71adcc2cd6a2bcdd0fec76ee3228947d2f9b1b6f614a7e609c8f250fd02e19a487365b0db8f2d53cc6843d0d2a2abf3cd2ce33125558046fe9ea2eadca7dcb9d0a20fb3ee274fd92360f8772a53937625b5aaf9f10e9c9452426cb42dce78cdfa2628aeb58c295b01e12b12ece1fc5f66e33cec966b52d6593e1d1e93ba3abbe0c917dda7c2b6b5d45fb4cf6588908208e9b264f7e8ff87cc5090f4ea9b1a5205c852c308783a6c5ba0629cacfdd38b50706097f AD: 3496b4171a3199a485cfb32fae763dd77234dd9e2c6544f057c9885e914325efa4ccc25099f81c95a4e968e5e031747422cbd48ebfed3236f878a2832b7fc6aad4db734868ba2623899e9e0689e618bac700ce17e6d0114a0f5b94d6a0c3373f803ba2337d530fb706b8afbe482eeb9e0f5582b2f502d3c774b2ba98ce5400a20cb7d9a32a351401bffc2214392166208de9fc8a6d329b7dccf10734b5b74ce122f2454fa551b586dea96fcad2c45b1bf562bd5751b757da829d57cfdfd8ecbcc410c00aff69764a4e532545838b38011f92e464d192ba315ef239dcd5041448f165a14d503a865a85dfe81c5d4dfd37fa6c316c09eb403bfdc2a8c1a0618477a5fede92cbb2abb71b425e201c6361b5509288675a4541f44b7fe052acb25d1d87660eecef0beed7851a2966947dbfb8714038621b6f34ca2874751aebe9e8084f6ed854ed5f151f81533614cb1fdc08d2f51e47537f6229e0b64d10b498f773fb67bde258cb74a78843256913cad2727f9dbc3a8bd5 CT: 8cf78ff0f64a19abecbf693d8575602631303858623968c8c4522c5351ac552dd3694b0a04fa270eb9652dbe58c07cacc2bfbc927f22bf561bd4cd2d639a00b240f41d6af836ec3f93dc0610f08d59514c49351e25cfbbe1ad05e8cb21e25f144d926b5752f96ed7dd05c816cc95f5c3a008716c8a18ada661ecc497c6e34540b8924ab0560c57e7190ab567762bc5ece63883ab5522c8e84efa3dbbf71179d6f286127f01e8b909b61a16fb2433798613fae1ba08524d734662bca15dc70a550740d1b741c0cb46528d061c786f129cd49a7f5b9c1f742c906fe7592e70a5185b6b1ab669498bac981f846dfd2401be46c0972f8945adaedbc7c54cd40c8dfa781c0faeb6b2c0150bfef21ecab2995da3426be508f21278a668e81b25938dfe2f8e1f85c8e69468e38ba924ffae71c1e1c990656d42c8069d120c75e840a2df0ddcc88a77fac1a4ee56d3bb00cd53daebc0c981571d0e3f467d2940b4b92c359afdfcecaaa4331ac45f0afd902e8c5815266d195e303eb16960fcc21162f025d5258786963250aad37610c6b191e479bd5ed29b8cfba9df43131feff2571fc87209b69d15b6c380a8623428f01944d6d5e56422fbec4f7720b607901f06f4433fb252ecc251660e6f9160fefff8af8b866c2edb11f6419a6bf91c5fd557851d469c256f511b9acc8e71750587e4ec0482bf4ddb0b73ed82cce239a4d9c6b330527cd8d529675c2c556456b10ebceec05e7971580b553b8a5f720f8ed38123f56869753624f4a6cf9036c3566cb4f6ca8e0f36d914758f07e7f447c67c8b40d703270d035d1cd39b22c291333ac1f628d2ce4697f82ff6c043ede6dba39c03e250efbdab3ed5e73c28e194269d8657862829f7b43192f95766f77a7b9b4c154a787d0050cf11099d372c3f97add6c9cf4a467df0922f7d9e1b17e552b453e80aa050d8a3e4fbf9aaa4c01a463b796cadf65b492f301ef03476bcffdf96a4f5bc933d0d4286bd9e2ac9822957ac9a69fe34b3701d913cabe970dbfa5830e083add43682f261c3aa80fa2beff7942c TAG: dc5369a6b0814d58060d033aba87a030 KEY: 1daac9ed308ed0d77d86aa657a6ea7f9c35e120553d26b2d3fad1bc256f1f71c NONCE: 7550220b0b5f3c6fa8db7316 IN: 337934937b996d7a501a3d1fa7f6321369747329fa6bce98f68c769dfb3df84b2b1e14f1a58c3f6b65e03377b7058fda3c26adbc370ec72e58ccc953ff157d4863057e0df89328efb5023c1b79f0e29be2d7cac9f903bb782c4c8720e2ccffe83710871642e2acae2071ba2a0af880f14f41ebdf61a3e5449dec6e61e103385971b8300a31b652053496e9b3a2db7a7bfb03a054fcd912e3e1791f84cf484370e553d67cf99c6b1c9b93bbe6ad4a93c47ba9ef73d9f8506400a49a5609e7eae5e3ee9efc657729d1e615a592a8c9f14ba37f5d91649a8c59ade56769c3bcef0c004c7444c3dd24223ef7bc6a2ba2e5927608692d1fbbd3868d7fee0fd11ee40312ae06d20704e29a97ecd4265556432173d6248e9f273363211b5d505de9861eaf402a001ac18b485c7ad0e442bb5e648e20e0884ffcbbd2dda9b3aece535d964d2cfcd6f99a31a4f24d878575fc3ad7a7c19e76771929c45d0965702625cbdd2e99371147e41e950ef70a7393084682a2ee6ca9b611f3c7b38ca4f5fdf2100c6c8d1e88b842aed09cd16a5d78d4e2d7712e40234292dd1aa27ecbe63c433804b0111a2cc469e4f012d55e95e251139f5d6dbfc6dc8e8fb6bf5ecdd8dc89fcb6b2964755d1de9d8a0dc9d648619e185169ae5ccd61a6c2266c5177d8569ba4a09d4c231d48b8f8017365a411714be669fd31f5d17738739c75ba5abfc19d1eca16558cd69bf33f63f50417c92c29dd44ced6e9d9509057ce53a37cfd956bc33c6128fcaaa441fe3016389cf69bb589d323f18fce0a6cc7e77d9e33868ae21ecf8e491019f175f10013392c8fce3e6de3dbe9bb20ab69c2996967d171ea48b46abd36b9f4015723ec99ab940156e6b13ac06ec0f4a8ef74ee304e3072d9e14e844d2fef1e6fff116fbe9a74a7d90e79958a2f14c364418b7cc0d135e0fb8e68600f2e7aa26f9e15431ac9e5cf380b5fae8d715d1dbce4c0225e5c61e747029f62f4ea5de277bccb75580d6f5e5eff710ac8bed37e98b15677462946b2fb3fc0ffe720ea7c6bb70baa0e998fad6b747d5493506ffe69133608f2819d3fd9c8ef AD: 903de215b72677076dabb98cb1059d7d1b352f95a2d2c2903dff63743ec314e0313e46095197f6aeb2967c5a60f7f043b5167de03ffd320b64291bb7162b495f8379c883f17d642bd8bcad4caec8ac05150a5d449a22185058fd5c3a87a9f39b8a76afa529bb9e22641c8811c78fe3d3aaf2acbb88c47a1ac40dd686b80828fcbef0937e57a6272dc2e3ee18fb99410ac33a96d0800bf07dfea59e707cdc633c938feaa179a8d46940d1182fede7e1b9a3687548a0ca19bf53a641082da37082f257fe2fc83188c46cc58ff44a111ad32b6745dcacc4720dd960d2325443cb70615a4437eea2a409ee70c7fa3967a2fe97915ae852cbecd21d44b8db03d3d631c90e834a83428568e8250f5b8e2422007e8cefc12cfc28fc7f9a73f93afc1c3d2083e4c5cf6204753ef7fc4199c0d877859a90a1d3b16ddec6de134689accdca001fb1dbaca4fd492854446c4897afeeb68181890914744a387c198674d37ad98c4ff3fbb34ed656add39879af2e336e529c362d15399e40d2eedd9fca1f07 CT: c6610234579809d78c1caa28765c5b05f33a0c5d99660ef94296ba00937522ff4efd86f760d3398a9029877192dee574ee7b882c5ba28d1c388444137c2ac96c6eb4cace7ffe3916bf196afc67b68e4daf0e191450b04284f930f6ebe924cec498e0cf2925bce9d25bb08e872352bbb9aee31a9ca45e41dedd3e931e3ca1ec79aad5390c7f81e8b9473aeb2fc6553bd0ef87a42dd15ae2edeacc148aad6615f3bda730e50f5ae8e44f3639c94242252c2b4b44441f6974652cf783cebfaa2f69e795609a94db16948bb30ab58377c9509ea682a21c408e3b057becf82dc73f1addbdc9b98d659e26092d4f5bc1ef819f9079e0c66bfb684839c0cf1c2e9503afd1ca7de025d4a3a86ac9578bae2d2f6452c2952b57452157d88794a4a872786794a29acb6e4cb511f8cca95cfbd33aebfdd224ba7ace8c12fee32eae1ce60ae0ab6e39766fed2c385ab3888780601cc18a3361468e057d19f97e94ca3bf814bad74f93b8c18364774435a83de1fa867b684a1f2ba8baba24583f8e3808ea7bf238409110959a90c93ae68d8e3fddd8951019e9d6699e868e8f1d156e57eb1d4e8688ef064f18bb8bda91f961d1dca461220f88646bafb0c0bb3e65be33c445f265c0c4e843eb155b5040ddda3a5d104a6d89dd0523e89bf3cc7125774562b5d7a9a386f8e227e6ad71ea9c0361a4e83d9509478a14e9ed8614ce0c39bc9d1ea361cff583ce5bea53cd84083b45ee18e6d4bf3ffec402657c01d54c6db3533ae6ce428317cc3c0a2b2621ca7f82d83cbbbe6571ea87686e20b0d24eaf8489c573353ea3b879b4e7a1f6d87370ff8437c9767d4f99f244d15ee3eab3a1ded233a26c1abf8f010a89d7da628f350cc93529b130ec1085abb62a857bcd8859f738b511f5dde072e723d8fa88fc21dd6d464358df9f972e55a659c5794e7eceda8b780af6ab65ce18814d5c3b38085be841df3b52b8cda8efb8a33fc52d6952fc3c70c42da59aa4eeb61e11ad4b1ba20568da6ddb31a8f1bde37e8c63c440ee90688186b9f222bd4cb369d9e077d0071dd9d6557f5b901829af6a3cb4825c76f05c TAG: 78ea2271c0bccf96f0d64594820543cc KEY: c117304024e03ccb6e4e35d4c2508014742ed3639e8d0d0a73b4e99c0e2825fa NONCE: 3a69b798030cadfb168a1f88 IN: dbe56896bfb9a41e901a1bb61b8a95cfbb343266e894f101767efe874d9d45b4540d2d77e701e1d42fb03c32ca4b965d836b3fd34ea3ca2e958aa54f1b71e8c442783924c023c1b9fe0a45c88f4b66453fd335db8102e1de765ccfd7fd415ab7a08fe4e0b3d2a14f1564ffa3157a7da7cc9981029a45edf19bac8dc0f97286038b38fca85f280ff9a98eba85e328be65a657291692413319e0f045c07c657c903e51c0bf72093c615cdfa18368992cbfd4e11bd64054d34405d00bbfbdce63e315e3e99fccde073823c17d9790cced43408ba71e48b06f9bed959818d939f7c84b2d6c3861dd17e424dee0cd7942320c50ce637dd1349173b13b972d0808d24d5ebee528343bb0f0415aa123ba63206de27257b11ab15aa1a3d23d97bcde30cfc2c8f9bf0fc3cfa4a6fd61871744823d7a1f8fa7dfdabbe82e73e491045c9df0f23d9cb83ac7d1118b4653cf4961cdb7256b073571962b1956338d684bcbe4aa05aec761e0a14cdbae6d42897dbbb1c0a646ee4b0e0dd43479849864311c3f743f2a6cf9d0dad34111493f0e55461aa1daba988af83842804de0707b69bb27ad64f66247eca2701b9e697bd6d3ba32fd30c7948a1782f3d308387b3d66a8da9c412d4e17d8d7c8b3344f33a79e0aa40ac27ac3659eba14e951947fc2f2302953bc766ebbfdc41d1f4c26afe5fb41412aa776608d37d8addd0d7f0c82c61961024579d828aad7fc89493de8002620fc3d638cef981d8a843b658ec3ee27b01da0df91c0874edc83587a70f3dd5d6f7028cff83c107a72c4505ec4623b35ddc5fe3f758434a14685e74976693d8c67ec2f6dbb62f199c7eb3ae344c05b43985f6e5639f6f9bc321bcc436044b8f5b89dce923e85384e16e6eed7ea5f3e49abcc010655a3a29cf9fa60791cf7262671ce0fb2044383944d415a8acee77e88697a96d4af5f7794e1cc8960ec31a8727276ebaaa5fc44b1a240be8679d2d0c8d3ed8d950f8bea0daa64693d4e8e5e5be0567c0d878e4f9a830ab4c6153ebfd5b1019c659c8f456a636dfebd24dfcb7b3d50be807a14440f7aeb52c280b3dedfd7ced9 AD: a6ecab35e7b603dd8253a5046e139e2cb9cb5d70ec87f9468915e24847576c1b4a529fbc4f2d84706c1be86b81436ecc4bbe4ec15ced347ccc68744a9275ecc9cc71a62b0f77391e2d37c7f36683d902a0f9ee37df8306427de4ddb01618f62629ad8deab26ede6af11b2409810b4963a1b752c7f6c71acb3c6c2f5f5fda91dd54410ac1637e55e547b25cdf5730ed4aeac8c0fc59a365376d84a35440aa2830cf614bb1012bdb644841e22329bb5798bf971b370dede894cc4f9395a54fe7936381b7281e60767bb2f8a17492ea63063882d29ead140e197d2647656ab981caf919583e869b844e61fe19e94518ce7ee5aec100b9acc2cb8de3dfd5cd3a776ff2f23319721b05e194b6acc9db40b280592e50b8b5d7d43a7065898f5af4ad8afa6d8b6559c81a9e8e923f6548b3f59c8ba30620d22865117e8a9856f66df128d82c7e15dd9f3ab3ccae9d2e30061224c7a606f87f9dc5d40c689cda06e5ae21e47563378b50c1ee7c664bd814c329036858bf9d3abfae22deef8b74d2fe6a56 CT: a6c4079486af388ff129e360fef12e039e54e4900d091be16df1d3712dea1578f11cb12716431f5c6d26a0719012bb89d1a3515e0821258b65157b8e5a8ab7354ad6efe2530337c8974f3f89f674f5dbfd3e8b34d6d425031e4591b37991b5e76acf5c5c13bd47c28c6a55a81bc2f2297fe42e1500f03ac1d97a348cb9c39da8a95b1a5c4b3bd47c56988c19c1d8c6a10a35322acb4338027d2a32cb32f5ce70d4d967fb30052b86f538f1e756bc10492931b40bdb6a579885b94de17cbe917b454db89536a021c4fb230037a4d808ef71159630f48855b47fa90ead1c54903dd925e88516f0cc0968827acd6e57df044c485ed9872e57308e8c5a8992d5d7bba05f7ce949f83dffde903ad093f8fed3ee11a1c6ab031089d77a965e5a89f877b7c4b23c3118ae50e7e21d75e133ac98fba316019b4c2866257d02e6dc8ae5b476517daf7df313093c176a2ca6bd8312bcc96e4fd78fa94313a6ac1b053e72bb622dabc5fa216ebb3a99c4e760737a29d5f452176efd9720197432cf17e8182bf1af60608359195341fb0246baa0087a7af0a5155f32895a06adf69fd01e6f86fb46377e50dc67d5115dda5b0322eeadc8d7b3bc5d0658eaac577725b2656d4cb7803f28df819df0eabfb4d8a7de150887d168f1ab7e5fe0ecd71cb98e35918c8b739059eafdd254f9bc03064d3e27c4b41ae04c2ccb13042a839f82fe9335df59c6991b7e8f6c821026a0d39accd5ca8007aac60ea324eaba577eceea25b4f31504cd64929576513da857f6c9551347457530fca38b173a6e7fbb7219fe861397e0bb50cacf6368929a5a429f1bcc47f6db2517ec62a40bb8310486612d6362870c3980ebf3223216d9df538649b25a704bbf12374442cb489af02020e6886092b0410f922c7680d5fa89effa7780e31f9222348467acdf049ff39ce3df27006406642c01669b819ab61ad05b096270fa75bbad04e8b09b1c4f75b12761b2e2129559625f46bd1005ce39a4b543f34960f0e7c67cae9074b29ba86867a9b35f0a94d716fc7103266b7d14164473b1d4e19a7cb157fe5e04e83dea1bc886947c TAG: c3bb19a713afccf40080a1923350cf11 KEY: 6e2aedf8329f42697cd7ae88fbdac408b1b8a6efe377670b244110cce97d0002 NONCE: 37e72e6de6176fec75f5baa6 IN: d75d0652ef7d1eb495797993afbb364cd663dba38c266d3721f0c522238bab60a95261445092ea645ebc25b6f2fe177297a0aecfc9fdc621fec0290b266c8ceeb3945376c4f9ad961b97b32b176bc1e806eb2d2e410e8ff7af12ef545493b1a61ab84e634ad86ca15fb9773765ec0271c204fd951621fb8ad69601c06c6ff6d151a156295371f7b207ce6d09ef47d106a9466fda667b7e0e2b9b2ef6caabd297dc82ebf2b03146c988790311ad7f4b8e41c1e04c1b9f40d4e3d8eb611f3ab06d12b97b75d3b490a4fe30b1c565243eb77d24c06b539e3d335b651e95ad957450c027698dcaa3ee3ff43de18fa735ecf7f404352c9406bb8358b9d3e47b7dc4f6a813d4f4f37225baee2c3c028b3974f4c0e8b1f0beff79fb0b04ccc5824b6ef8108bd9ead21729a9a9cb3ba8705bf77ec3c974a34b2d838784b243176b2c6e7a2010a785a96ca2ecec4fe57bf7f6dec0c9b72c52b8c53157d4f9fd259344cd556c637f921170135fbbc86d68af452dc575eebffee445f8f755c19c73a26fa433bd4437c1018263e7db4b580a120d1d29775d9d5ced6710ae2abed148d4008bade4539728768b1ed315de117a81fa0978c1ed9079188454c852652e8ccc4904ccf233458b19d0f17ba6525f3096d369fda3dcc84e092ea1236bb57a8bfbfa9ebde780843bcd967708ea20c61b60a11ac24b808029676a30dda9f5f6cd69aa6d7aa3b08cee0e89456bc4561dfbd751f9abd3ecbc161256a26084e5ae1d94dcd3f74ca30b4ff1857ab9e68cecf2f384da7d271c1d8b167250d901a2272551020c30bb9e9f9a8f9adb299956fb060a17522efb26363393885b4aec2c02b0a8c40835fa058166c7c3013908c1513e4bf9c71671798537cf05c994d2090fc768a12dce93a80d0a4cf1614d0101851ea6f87b528047f07d07ed78cd4e54fdcdd26bb4f83d297c402ab5e328c404118f52bcd5b6f36a18bd3186a19fdc522ec9838eb363818a48ff88651a2359447876d139c6b0b7d35e30dc0a3ebd3132e5e2a0c3916ea7e3667fa266a91d5906d1bfc005f166bd14f298856e85022c8274ef5160f87d989271d2eeff544501635f4f071089e074 AD: 6027a29d52264520a6ff2f2ede11e8d196c706c8a06d87c5e3679be87b0c36026e38fd53da6bad38f9abefe48b56db84a445f223ee0ceb1fb1b797d2b589dff9b26bbfeaa1b21d662edc6f4e48c8d91025220a9f3e7f1965e0e6f7232e84348190e1b66f918b896e778d58a40c47439b2007b8574cb56a18f72677227f1aa09e36ee41aed2692b28b3244e9f54a7d317b1e5b1e7b7fc59506744a25e5087d273203aaa1dd0b9d627b240e518a866d531a90d4b3c44cc1ed9d9d1350f57e03c3f841017b46a68d6f1f8a6125f4b622a0132e64a85fb47883389dbbe1e3d26eca7ac8676a22b4bc79ad30eacc91b6d06603e916ed87bef76ae3627416af104d2794a7b86b561ef91deb0e3f97e07a37a3ae11073945f75933a5dd66b14aa98e826aa4180bf222a201f5ffd860be8a4b73d3b7353fee03be602e52440c7077fe0afb1dd5f3e823c170a4927c241a09b83e5da81c1fb748452701250896547e34e647470f5af70a23af895d71ba21904e1c6fab41f5af486d448b57eb5a3656089d39ea31ea9fe6c88bc40 CT: 10327cff240fa05d2aa15a7b299b925a0ad1740957c4fd23ebe24e8a1f36cff5c19007d4fda60dd9d3231258021cf2d11d9ffd32bb221a620d68f2b0077a64a6d575c3802844500b2e6d08ee659006018b6512651a5b903b6d438eaabbd41d0366529788a33dd43a0144637b4a66371a7e58898c4b6d1205a239928c3c3e00907f50a79e2a99f2f675cfffe191f0c584b0e93d72f2a2aa8a400226852fb97ff0cb6d361342185500e3a0db1c9836bb8981d7b4152a399f84a047e5dcbe7c0dde2a85496d4fafd8990f70f28025519dc56ab2fdc150c215bac333af39a981ce5ec484d3cfb06ceeb68471d730e9a6a82d03a4b29dc8ba5ade90c55f6431109bd8c8be337033ca49c4f75fcc2b93a3103638d8516622625749dc4ab0dca45e02abbb2931895f3720bf0d915a6f2802b9a402a5a9c1f47419df6ac9fbe2356cc6c51924bc7c6d9399a92688fc6d75a41f69e4f91fd375df325a75dfdbea2084ee9dbead62754b4b97cd7fa075f6c016678053a8d6cc4de4dddc2c2689efcab3281f1b7f353b3e8710fe396e874784fa54c034aedf078524ecbb18f5bed06a88887797afb0442670224c3bc3e0b347480b7d84268ecd792641b697cc7ed431ff0db957252ee3ce4ab0dbbd47638c15fd0ea8a25d3f3ea75a81dc9986b240ef3189f323a342857ac59900bb8e3bc429435b4c00cce3aa6c516d0c68456a12929359b0bb9b02b349e63c4dc8bf2ed107d94af97af04c14ed454f3920e1f354378c20b3be5c12adaac6d96eed1df0496172a71b585e3f5e39484578475e6c257868b3d0bb45cf229c0752697ab66106a675311318733b02335ce46b1e035a92557d2ddc9536634cbc516800fddfe358d8848198045d746a5b6e00db3d2d0b22f7e4c4d5cde136f62db48968eb360a6d8b645022066ec54f2f2f05b3b8c9af2097986464ab60ad9f05cb63cd194e501507babb6103b96daee90c70efa78c609f95a20e85b26f2d9bb503274dc40aa0aeadc485a2859b3497f4688df1b2eeae81787375dbe3f9fc6ac8b4bfa339b92495d175ad6bc67856b58c1233ee1b0c2b524668750a48c0704e56da23fcb015be58239cdbe228 TAG: d5bc1db867fb362965c9ec4e686d95e4 KEY: fba584198cf82944ca5c806d3856240c4336fc1b451f44f31a97a978b3de874a NONCE: 859c5637b754a4e7c1ddc3f3 IN: 4dd6231ff71f13e6a5b4e182e62331f3ed1d4692e35f6959b17ef4cc7f29859a67b60527aef9d08a333bb51c6e163e016858a4da2103df237e16acb93421859c83ba348faafa3eb31d0addec9c90f61a4382be25a85daf829e5b2751c9b7378cb9e840c92e174b1e9a32f3a5b48bf70b6de1637158a09714b473e1b3e339f9f915d27b310af2fa13c05edf4eb9b114c80ec2677fbde6b5c351b61fc0527c9206357bc1d1de800d8e6dbbd3f97d5b1220006280a42f51b7b4b4c67c56aac1483a5357a7a26528a1ad1ec39e0828117be1c6da36a60a7052f0dbc26846e4bee96a7cb6dd5a3dceb6a11d356e0177be9fca68d0f4b00a8db8afe8441abfd80be2d7d25ac10620dafbd92c0956c2b3ee4da7f3db8d028cd60036f78badd42e0e9767a6c8bf8bc3ed869a9954fb4db389e2f6e44667ec26fec930e6a687e3fbf10686c00539628bf50390fc167b1c31c1bd061e975a60affd238a229a0551214f20bb9e17f097462629d04a9ca6ba98cf3020f1fce170b9ce20440fd25c2cc143018aefa1748f6269b478e1d79f3727831086620e79dd357fea1c84ec4de0bf7d6afa2f702a466807c0d2b8e4c81c402d566a0af16c065941b5f9b689a085ef4980131bb979a0b4300ca32f92d902516c3c9d799220e786d281d64f3a7b5cdc4721b5245444fa9291d4c58f9024387c4c4e4dac5ec5d7542986a2b97619a7db38720f392dc7539fdcc5bde53d2a4809b9223663d8876543a02431eaead9588ef68cc50e707e925f09eb53c7117fb2c8bfd07b578191b3af028d480a6f90fd891e03290d0d180bfa44953ac9388d08dbcdb238790bbe07df067a26acf6621b809a154242496baf4f7a07044c04dc02b5042c5365a71cc5ab9ee82630d97d1ed9b55be1711ac6b1b2a497eb1645c69ad15617a45751807a0e4cad1d0d965988752c65847bff53527bbd087f7d0f1b756563f38bf5905391836ddd47f57d84742c07a8000d4ad3fed2dc91f19e6226e7c3fc260e0ed4b23715cd01bf2c2fa59445d8a695bc759d5328c85db7cc6e2566ed0c5758ba2d12c1d285311208e1d4f66caf32afd1619a46e5296f435ff5bb24dd30d060aa462185b4e05afecb2ad221ce615b6867f5 AD: fa46599e0a9f3c03555569f4ed86b73a35db18c622b4089ebf31da474873637e4b97aa71ba883368691ed48f8600098b05cbd218c1d4aee55a0e6ac862518a6602328e5dc9f193b0941797e863d6534de6013555f35ad8c32e9264fdee17e927db412e76f06922b36b4c1f5f0d4b998d9c10dc88f3ac0b8ee01b1a88e0b031562510395b9b5a063ae968fe3f87a3bffa2e55a7aab152c50ea8bd0c61682c0f9c0c186c3dd0287c7c5a8f50c2f0c796ad7afe3fb9b45d90e8d2443291947067f982f070643289a117c404124245273fe17aef4c48c1b9377f54e6ecfb43aafae2fe52eea2f2b8aa4fa5a7412c3380723dc99e63c0455736ceb0fdcf1caf6714937c75de252723a7a1b5c7bc5ab1430a8fc44d78467526be8b722e0a49c54e85b6da58e44ab4db4b7d1bd33e28c1aefa462f17caee6b45a6d5df43478f36ee54b1158399a861124a95cc759fbb5bd4572adcabd5073758e0f40d6e733a87cc9a3653dce1b59936d57beddf6b980bb7cdeabaf58d50eea9ad55dcc7af8369bb9ee8af923d4dba981d25efafc2d2352315e367a9 CT: 29e739b7162cd3504c7a70f3efea5d6c2282bbf1fdd75224729aab622d59b2f680c92de483a46d2e8c45460c8f3efca1fb374ae8a04ab84aeee0c083a09ddae6cbdd1803e19b27fc1bbc4ea58ded24f9f630c16c04b605d107a5fbf640ff1225c919dce7b6f73b1a18aaa37e3d0c757e0062c0de6c516302f246f246051e1a0462db91e5ed5e1d178c3b384ff9d1ab3244b861b4c34e21a7ab194cc3d48d11588f53604609af8029a6ffd166c08a8f669da73f465efa2f0f54dc0e09916fe8903d0ceaab4e55494a043160e6962ca21ec86e1c159532691b34d507024a345aff411b46a1a32f7844ae3e1e250bc17c0c3edf4516231bc574d742b0b2411ceaa3c4cba1d910843534e34e3d405be0f51a304c80a858664142d285e84b8e008fa7247fc0583dc7b8de3dc9015f4d8e24505d1eadf4e7c598e628ca6b5c70dc6fa5c1734cefb418d62cb08b7d5fe81543d3d1b438ecac5359a0f1052e2efea3107b2da554ff669360db0062052917abc854ccae73623175f7e5ad37484609bda0b6ee3cc87667fac9d1d3de9fcd104b190c62e544be71e9badc2440e8b451532781dff81b5a7ec4f80d3686bed8f7747714e994adbb4612406499a6bc3925ab62d566660265ccf2d635c875ac6fec640b515b86ec5a7eeecd34b86d1f2eb6ecc5858cdaedc552175c707d12b677cad0a4b12bb4e717163002607eefddf63ba2581a2b1afca4865b97816e61813bc7ea99f8f69fa5bb8e306d5e6db15293ec2f7a9c4d8ba2d4ff6e258270c9ac7bf4887171434d034875b590fe20b959e0955034687679ddf98a5c777dfc06f11137b52121249ceac90f5eeeb6f1ac59ccc26198388eb8b5deb918cacaccf1e48145486c37bb2a11d371e095a250c86efacb85921129c2e19c9dc09c66173f394f568c47fe4ef0cd3a98a138b1750f3aca91f7677604613b6b0ccc92d6ba8a0c3cae6b7b22be761ce2922ab273debcbe3f68b662038e232430b3e7d3e4142617fea44c0683f0b7eb03950060ced6325409293422d058d88f0b81118183a05a13db7af89429731c8a37aa83328019626a6f2d87ee49f9b4cb39021093e4886d373a292fcf711945f9d572d734f422c92d8fa6e01c4dd778 TAG: 73f6e44d8a2f3cc357707de856d2ce9f KEY: 8e21c6a4065bd95d14ac24cdaca55fa220b37dbf7d201b289178db041df9c303 NONCE: 77ed6ab683ea82545de480b5 IN: f15d0f948b50dac3b7233676de10bc93f529d5955ac70db7ce9b3f684283275898e74dc028b10623bd0cdaa6ebacc2b0bbb8aaf2e32b4d7d84ced724383443f493ec24948ef43a40bf94c1b97e0036e547eee4c59cc336d4205419d66374ac29cee8b274e1453299611c491f8303d00e0e445337a176f263462d0ea16c297effbc98a0790ace75c3c4965d09a32e38d0ee62c6277131f55abbf9d5c733910eccb8703634720f11429302c772c54ae4e0e2bebde2c251786f67fba677a6d9beba08d3d9436e28ec7d5cf016ba69cf20247ba4443c12ca056d3a11d1065b18a037add77642cb8aedab88117a1bf686b17efb241092ab2a17bc9562247c501479d77d0bb752dc5fbe2a4694d0309e68b885a434bbf2aa87ee6e97aa8fc715d9667977a75b37a42a1f4f27096887498ce460301d9ed2a32146a2000b1878654c85b5ebf2828161e3828e87319b838647f9973b860c6ce9f43cca21933ed4526fbcbe38d0169f60a85f9d84ad662b62bcb1088ffe9350382ba8c2748c79fd76bbf863f9a60b971fb6fa9446a3d034047358cdc99ac30e78d6238b5478982a2b4ce58537a34e5ebc37ea72f321f9e466031515c45461e66cc0550ac1b38ebd92d448d0745fb0be37eabb926f61facdc5bf3ae52caa0f923bd73c43a22b89902c0a4c43e12364d0286f328e125b8f5c9229fd955b5ccfbbc672275051df701e981e3208cdf832af70fb02325844120b5fc82f4f8981ed70989d78c69ab0ff75ab96c1ed69919859822ff20ab698e25f855cab4f01174c4feacd3b94003fdb1479150f0a9ed35de9dabe3b7c24a56685aafc396fddc9e6f1b35955b485c61f2659039b7254173364a57bc80418e2f6b7ae28dc8cc5402098b79c28806d135ad3d5a5d0503f32338334c9f6e63f29c61000ffa87668239ee2e1b0cd654c78d610509c5b83610b1fa85cec31a533fb329cbf0c543bed9ca26b97df5bb12ef4e6d252dbd955a2693d4903878b569bac70c4562712ee16a7da269d6bba8dd57b54246598e50453f47788a2038e206b4e34ccfd275c6f5f1de5687fce97d5707d8b697278a3e7c1f07ccfb11f23b343c5d8c7c08b1122b36f3286decc760474b6a27646f432e740420981b480ecc2e50bcec71691da9ff95d43 AD: 51c1637f5348c5fabce63137ba3c82b93e7a187619ce9c2aef21b0e696becb4539fd581481c35255090bcd08de83c0c4d35065208f2d4c0efb7903757d5408d49703dc5e8c94cdb9623741468ec982231849c1423bfa1dfcaf6633afb5997b3353cb42c7e8f99906331322da4c579a43d663ad4f7bf9d9d7bd7c54b65273f08a76181fec9b20fa5b4dab9ef00e0f6660446140d3b07226976843998e94a69e1cfdeec41d7fbf1c1fb576ab99ccedc4f2fbd6d6bcf6227f8a93916c859b37ded15cb9bdd13d399a51784da099dab63a4c0ba22d27aae6177372c05c1e5a833f459caeceb28743db88fd2807f605f7448d9220b79e56a312f06994a0132e43bd47b82e0e858e8d2773a7a518746b094df8a6cc851e6ed7b98ea657188c6936fb4bf0911ccd09a67ae539626b4573e0da5a64a75b0cbc995aa664f4cef75baf574e03cb7b1cd4efb301974fa1270be36a64f55f19890bd21824fd44099c384b45903d5a85fbc785c2bf10542eeccd3ff9004a157396a126516049e26f579e32e51c1e9d8ce32dfefa3e2558f6706d31757161b9c17c8f8365b9ac2570 CT: 441def04eda7baf0e6edf24863166860ed05c9c3cd0d0c71a383b4dffdd6b5a59a18936779e63c8ce5a3ebcadef82c75d3f241f62d66125b4b4be0b8ae58e42d45421cc68b42ee062d1f6c12a75a80e854a1e44af9813e9be4ee85ea3a9f34534930cb4c51108160e4df6874b900cd293815a1d5bf2b064fef51d0fdce0e077cc26c4d405231b50a1c26ec03a8e956c9605cbb9b4ae68143342f6fa46a651cb39aa783abd0f6359365815aa8084102d856d860f7f6d9344f3d1e65b0af8c7d50f83afd151139808f651e23897331b58dbef7d301dad4ced88feb5db48b6b2e05e1c8cfb58610ac3c58cffcb411dce628c1975d5718631c1c1230ebdd40e6fbb6c2442937f95bd3d6578189fa72cbc963b922d17399439bad035a64f39e78c4aa7f0c4793173131d11c7693aca45c04e0f255daf0b1ab45c3e0d90dbe38ac08782f19325039127454e589953859ef87cb2e4edf1522f946b59b8251a1c154acfb50f0a7b0a349537e17e5de09037e385f51ec4f388517bb1ed1cdf891cf4fb39ecfef69eb553929c82941e078e0f4527614a002a8b8093e1c1ffc8882ece4e7f23951df6347d13b0e4ebdfa76b4fbc6baeda7411883fa74c8e0f567065e4bca86570fe31fc3738fce1469c9539a398a182756d26829b42e7d2f4b48fd35aa2738144a8df7e08678768cfa2e6ddf887558215bb44437939dc911af50cfddd936346155a3e543fbbabdf571cfbf34fe781e5db5b85791ddc465966c001b06efa95e5050f0a422d3026d48604f074f900ec66ae3b8f7b9faa7f438d28e6233428d74dcccebea033f2b57e8a9e77abd8f4fc7f35680062027a20a88c3fe2de501dac972f0296222e6f4ba0943a9d562771d757a8fd002fb032a8bd30f05b6aa0926e4a86c6f7555d3f1816c68db915d71ab2ef9492b97f0741be24e07108fa3e02167b72b5976c83faa4450b52de247f7c54ba7d0e65e44575a5a53bfc37e807983fad7ca5bba4331abb1aa30c1444e131b83af8d72e51dd248feca5e025f6ff0852f929c672c18b47d9e057def886f852ae26d137492d24f8a2c903b84d88b92a3f6679d4039aa4e4292374b66edef378a7410ac091ec61561cbabd788f090d418333794dca3f9744b25b9b8c2b065ec71e9297c0b TAG: 4a780eb826dde2371feaef229222cd73 KEY: 71132f8c05cf95b6b8d9b650328b561a08728a8903631efb21a94e7bee60d132 NONCE: 7840ceed28a572c5186f2546 IN: 2a64b5a93aa35c427594bb5a77d6fd2d8c40d614f5e0bb495a909f3fa2323c248c94715fa52017a2d51c866e81aacf2efd74f40b7457fdf93af32c1211e675a08eb4330f6e24c35f626da6692bd9a13bb18c42e6b2f5c978c431d25be0f38352cdfb5933e9581834c33b70b590fbbe3122a9076e619142e8c698c78f532ad369447843c58df0cb105f8f35d4ed7909ff94a3a2b0ec99be03c29c33372a1b9d8a6ec7c38ddcf4dde9bdcf8f0d63064a5072195002b953b16d2228e71af3938f5402c24e4f34e344c26624519898e0ed1f20980e36bf568b33e332887610d8da5a941a7a1bd8b8fa8795014ffc9688a53b4b9a60f527ce4a737e99624e600de8cefacc246473c9641a1166d6894d71b9552ef3342cd0a7e3b0b65df836c6d8786f34c851ac4c72dadca8e9753a4e6a14deba129f4e442a13e3c82d405f84e281b95afe2cb066a2f49c126ecf9fa440d6f9860fd450f7cdbf5c2fbcb5aa2023755bba1705de94305e5b304af4ae8bbc937c6f477d421f5d72784f9b3c331a1f850c4201c6459270c6271b8bdf00f23389acc7bf4082e7453c9c283d86e8371cf7b34cc9988005575c8e98ad34184dac039f04f84e5e8ffea351a3e1a51221abcabf06f7aeb97525b07dd8cdc21b71c97132f3f6f41e5e01c97955f4d67793e8f1cc5910a264efa8384696969680de914bd1acc9c7e9a278ccadcf8c6a49877acf2ea3f7e5066285672bca4dca1583e0a60b82b18fa564c5a7b08a2a0dccb9170602c9f7cfef98024267553955cfea077cb646f2b564caf529a5b34b83d8a16f30e2ff3905106e224444287f3ef98a9e12cf2e3e04a7a42ca30e6116834c169f0778cfad274d43d969dc100b9e1a810346d8ab715670fac2e647829bf3b56f2b7e26bbf025e74a3e9af4930e182205fc09e9fdf1a2ea0da9aa5cdc21a41d191b8fc189ee5ba00a744acb351cd869cebac760b315e60756112bd20239203ace94bc29b232ac9cb361e5b7aea891b5827869112cde2b0e2493fc0c88fa72e92532ff7ba77d5ffa865e47893a7452f0a4b44092caf70e02d344447b7dfede0aeffda018f898a8872c6ce3102ebca9e933fcaf22b5c855f620b240c31acdabfb7fbf109d2e9604b465abf43d64b6a010ab928722119625bc046c4489a95628612995957c75510d89 AD: 6ad2365603e6682558c185eec6749c983be4ae29a8a66728cb39eb5e95e7f7a459bae5cab7e75c587689a223f2533c28d44134b87f22e964e73c030782c8ac4ecb2a62e3890d0d96116a4a3d3aa340783e10a46d099d601a8ece1938a640c1d12b88ca4ff89f1ecc75f46a736b7a4143b671f3fc531b5cb08c3ee7c02e606097b0191605d9ca3099c6707c590c678c8ed7a3471aea52fefc7f56a736cb6675e004298903b43a357c28ea4f59ae0894a8ee0876f347682403eb4d45881e04258eefa1cae28f5a646e3f91cc08a935cd464f7edc1721f5b4e389f94d141ca4231573886c40b7df4e5779fc52daff710ce9cd40fb4dd32e92250592199696a13e742ce90aa6280275ee8c0eaf40c884bd846697c43fcd7221cba4f98b03a6584f4792e8bc16c2029cee9b4e80c5f1c91eb798345b10def038cef2f1246fd148cfd2e39042228726cb18029b2e38e570611aa75c72e6cdd5110a7ed6f5e5bcf1d1ca5e1b67462b36cebebcf6e21df8168177afcd1a31a9e498bf7da8586717ca491292b0df81bdeea3a1789bfe70b489b1d4e1ce52dff5cb7e71c009d6888b152c644b959036 CT: 5493a45a3f9edc2fd6c8bf53d3f11be1262ce77f5845c1d47b306e486e6316abbc78fabfdc7ee8da152ded9f36b7ef3ca0ba8e55fcfd865d449fd6d44c99f16ff0280cc8e596889d737d0fcd4211e1e5ea7974698985ead5b8def15a8779674a6cea0715525269d2cae64ecdd8870b9f1ec78d6377edb9c975565eeda60448eb1c871bef0d951514640cbcac4e663942594f0bcf4da56fc56b961464d1777a177b3355ef3b5618f247035761f2cb7dec1fe2bc2ba3f825ce545e51b610613bea6c125a347aea55f8f4f5cd5400e689cba199105170bfecc8f0edce6a9d521cd1707cfb5d12f8f5a9dd2debc5907d05513a949e102e7f29d5ff7ad22eb57d429eaeddcaa2915333f88193f668067a695085853f7be8c0af38d774b3d6cb4ab415d70df8aa02e7461803f597108b27d4838d58b1476c10b570c4f8fd71ed9baef88c140163d5ba69a3c10df451c12a5c5cf66c2ee546c6da004dd5d671946df34987a19650ed8ce9e7ada14f3213d642a9b28d0e376e5e37907b7cceb86d0403b19fdb48b3b732633d498d847c2fd24e0260ab74dce88818941c6f8d9e73daeb7652c55c729c3eee7137a5b80899b036eef89aa02bb730ec277d26bd6498e7d4a2b8208d035498b8e0ff403b2ccd0ce6e9899e984a062b5bed1508f23d485642843ce34b5a8322efb9af3e5c0797c2f519d7ac054304b59461866413b0db05791fa9f16661fcd3d9d86291a48cd61d4696ee685a9aca33b93eef112e2dc772d6e304f150042fb49fa95edee661617d7ffc5624b346a82847249c06ca6174d8a408ad46d3c3073e7815c5e86ce31a82587695b2b6c89ef52c20a0ee8adb24263df1a52b4b3bb68b6bf775ba0029b36edf2406c2509ff633fb4e7b28e0a4d5260d48c364cf99ba662b65e3ac150fb3039f1d267e152f569d708c100121565d72e0f728823abad3a1969a4ca856e9f0f4cb0315f973471a4464ecb348950f95f8efc5700d5f2f0bfa9e4c951a9f37b576695d93a8ae5f2d59f0842f3ea895fb38f0f34f56dc498fc0a5d8816e8346f90215d68e86e69d656b1283d349200ee4935ce5acab7eb08b2e1af57a603a42ba3ce811d8b8c6d6af9796dccf549276ad7183f16a99c61e0208cccc2c80507ece9c3c44419e01a2e23abe2513ec13187d54fd422efbfe17 TAG: 975dfc03c9b1ef9a854d62ed2a0b628a KEY: b0667e8a6471d9f4eb559d0fa3854fa6f80288a03ac298a31f69168eceb6fa84 NONCE: 3473cea023d2c6afdb625b64 IN: 11ff8fdd9cf47bae5c529c6022638e9bf385cac0b72a046efe306c3463df27276fd63c88b771f84cc9a8bd3be7ea05df941502d7a437ef4a3ea22b2e4ab8509904f352b83cc3865c489bddc6340bba4f2b4c382744467a3ce3896bfa9a0a6a4f8d6beba39613df508c29b074f9f68e8723f2c2fe02a5dcf68965227059e2b1dd75bbe2b80f963cf501d5c73663204490fb843a3793c585769ee10b764077b70654dcc7b9b3fbe7f4b146ca8c6b8e164774ac3421fc2969445f77b77cf63ff50f04e2439895121f1b9c4941b7cadf3a92101cd9d4ec6a07d70d2742e6b3b87981e992c549691a82e250c0fab11bdc287ec357f182a6c2244db8b39a0cae9cccfd1fb32de73901ba3e695574477c37b66d170ecf64130df3cd94049bf9b3cb388907f3dd9389c71c344058b30091eee2fe06f6be3eb7ab6b7e269d2f33431a51d30a39ea8b280571565701dc1c048f07f4b5f9e04a8dc4555e28919acfca9caf597a394120794b6a09aedf866271998401397a4e8e11a25a061878f624f78c321bbe8149bb60887735fb3c0d96dd7f022cef066afda0ec9cf4e41a82c4beb6cb29715e6611562d15bc2b910f4edcc981c457c0c20bd2710668b59242f7547d2202864ae65d2cafe5775f3025eda387030e910075e3664006c28969808975b9a72c905c86415833a1d1d86b8297aab682420a036208839f9e811a6a68b5bfcd01c7310e4b05f5f77ba1dc08f18e57a2044b20ce84acba0450b9b8ddb378d0135f779b1286948985ddf57a7954cc1f21252a06270ae34adb052c124787ed72511f4dde5ab0a708df4b307a9cd392160ce24119be4eef4af0025ca4047b07593293fc17889932588fbb67e72382f8ae826eb9f0e4b866f683814adb2407353c851f64475da9f740f71ccd7176d3d970d8618febf5ade20dcf51918e8a08e57cc4c4278565f6c2780c68e43970968ad018f3d04fa375aaaa5cf10f1cf11cf203ab299fc270ac41a19929f831beb3a3221a429059dbd4a00bcf55768a9f89fb35c8c911698edcf59ba3c2398801401e0e0949dbf587509d9bbfcce3a8bf5023bd751811d25de25693a43f14b01011d6030fc0d3017bdf8be8c84a7c088e0c09048b88cf0ec74181eb904b91919947c57933e5e5ed9b46550c951113e8e2a0e06efe5fd5b4d182e33738ffd16f571cb126cadf79dbab4f307e AD: 86eed9d3e2f3edda6b76234b7b80f7dd2815963274fb85d776bce13fbc60f1db9199c3e1158815c15b4d1858dc66053fdd4c128397972cb9ec05c87d16f53ce5bddede8ee959b5af5f8955b9cc11a26e53b9b42855cd11b570ae35d85e1877264c949e27c6ca797f77c0e5afa40d0f2a08881820b88f85bcc59edd24963771e9357f66f874c11a684f7987d876412f3cdbd7b9b3a26008d551732d9964deaef66cf4692507fde97239f15e2caf990f59a62693d0e723a50286e20cd347e6b98774805615100f599f6f85a5370af468b41633b85cdd8bcc7236296c50a530bd238ca0ce520e8a29f8ebbe27760eefa1ec14f91d6b751b30bf67cdc762486550793b4663dc38f378bc36eaaf157ed6846641a7fdd07ea45fb1342fe04d700ccb0bc9acda5eb00fbfb4aa3540fd675364c0f8f119df2de15ec2a816e76248c11b9c3e7769f98ee8d4cba3a525168e187df2f548a940e097805d735109d8ccb6119fc366caa17cb46be148d406a770a24067cc9c8c40bca0b544458b47d0ce451e4a4eb9c23716666a965ff26287823a699739e5a6ea844cbb5dbc111473d88d611b906fdbf51e86c5a90a68f97e33 CT: 0353acae65a2b86f88795b91e2feb614ab78a508c57854ce78e70667db42d0e8d1288b7e5b55ae50e95a1e3362b0ac3e592ac497791cabcc70f68bde6cb9830323bdb3d7c47d35684ae9a81dcf551698258d0d132eab80cd8926b71dd784f7d87f18158eee49bbc220e57f77c65258a5191ed15d10cf306c4fd22ca91d92f28bb0c602baee0bfe31de77350ad2637d3ea7f7ec04f4708a64c55bf0674dbbb4e9ec7e5ea2db16e3aae57cb3611d46ecc06d4796a109a14a0f714753e979a4b0090c99622c28b62680d437a9f4133dd20ffbbeff73e3a9b47b7c788abf42eaadd7b7284bce8b6ea4cd3bfdb2320f7f3016ebf3f06fe255555c44f95693db7de6470e27165e5ab0640e674c321591d4fbc941b2560a62a42535274d3a7f635c922416f7d9a5b9d22843fe601b296aba676802eb55ece3dc9315d27f56433821c18e760ed64d47b1ad6590abc0d75e7d078aba97d697358112347e39b15c3d21248cb839b23b6fe4957dec22b1e25efb4d537bb0cc8b23894436990583627acf4def3a293a4b9f03a3e8beae184f9d11b79d632797b45e972cb9812b91beb1d861c27728b5cfdf9e370f363a6d85120aa1c21f39e5d52f24430bcb019d328855d7d77082a9a331b788a3bf9dabb65f70c20b64aa3ad3625dcf5cc3153380ac7e61cba17698c387650c8c73db3e9988c10d093bbf5e0695a75772805fd5b2fb8eb7b0aa91b453ca2413e36b285800873339311b63a67bb541d7002d5db39b016c03522023ee6551195aed5154ffbcf126a3618c0431d707104438f2b8964a3e0602a8e22f509e390ecba15c999b14a677e49ca95251d0b5980bdcc7e95714fe28a99023af2c564defd802e1f24e544a040ea295af20e9bbe89df72169265cf183961e78b21020b863f3012c6e4087634bf720884e001ec183711ee6ce14f653fd483c0c1a2719b9dc9b5c64955ba8ff8d5755b0f1dad0d949800b1cca343276efcf6e7633dee3675c8812790fdacecb8ad1e458002ce0396a9d7a4fe030da5582b8ebfe390498407abfa4d1d6fd109ef6811d00f7cf422580f63b8de9dcf66d760bd2c925c82e521c9edfaaa6539e78be6acfcbc6a3183dd29009ea6b51f84528056061b010dc59789cfeff60c15bef4de847e6c3c4cc1e127d6d1176aff9f7e208a1bb70d85ae3a1a581ef08dd6197149abe068fcc5482 TAG: dc652a0e99481d728e090f5b4c9a70b7 KEY: 4b7b8c13178f9678888cf894bbae601f4d3869d6fe444db9b35aed803549b72f NONCE: a39926a47e0b75a771783631 IN: e6ba553a0aaeedb236216bff95050ad4b259ed60c071e1db318c1df201f2eefd8e73d66aae5835fe869503783504d803ad07f2989abec14a443e3e935684336a437c83d0c95ce9759d995e2cc454706d24b810fee5e32f4120aab927911f7bf11a7d0f2150b1ca4ce7f216403f3a7d622887675278a748d2523af6305c9979deac0da24f4397f57f38c8a860413d6ab4581d48e70b4113aa1a963b3a97b4c4a599be2afebab197e5e41d148b65ad2488af0fb9cdc59222a52ebe6a0ada339bd8b8c0195fba21d46c12d57eb7b98ba85fc494863645b0b32d9b8b4391436e887f6b481d849c2c5f6afe5496626c267a3982daba9af1a16400cf81bad5c1398d605308427340118734e476d808338de39e08549482a24729190041a303f61c4928ffd7a3bb2b46c92aab059c8ac1dc4affe52c6e2d3d55ce623716855934e80d3d401bf4532505c21ac85b738797d08d69e424e521b479f407c7822e5e408247251538a6c31bcc7fa0484dd8a40ad34f0fb66666e143193c9cad455012c3345953ef63b13b3b2469322b7094e8140487c76761733025bac8d71c3f406b0cebc28c499bddaa34ee6c03a82a52e48a7302e5e5e5a3f660bd83aedbf1e2a88ca05db202082d8a59d11b14f6accb8d8d24709709210cea12a34265c3ce7efd84dc8ca309f44016d13ff653f253d33d180cdeeaab7370808e1b8b9138172fd96dac39588ceda91c4208a3707f90f2f336a2cdc1ff3fa7aabf010776833fcfe43c3bf19e9a480495064ad435d3072ce131283d38937301b29d0a063c3bf04ad6664f063462aaa39f1123a010d6f20487a6b12ea1500abfb655a21a4b3eccea51368722f105f94f642765e7765e71199ec5b59c2db6eca6ba9d6150c2e7efb8635493d19953f9485c7e49f24efd2c68d18b1302da88d8bdd26fc7eb6a1abdea09907c02bcd80fd1da76800f18673f88922ddc6eb0740bca0b70f7d1e6ffcaf017421322c2945b155f582cac5d6ae6d4e5411ab895b953a2eadc3224c4dfa1d8f9fa592c123c2d5e1d449c92276dc21711b101bd40865822bb622dd90d6c66becaea70fe9f914032ffa17dbbe16c0681c9359a9b156314618f887486974951cedc90dfe9c04aa845d3f4b4dbb60b2e3271c456487045133c240b9c415124dcbb57671374eb27625e2697021c71f5f51237def9d88fc2181b6bac76eeeaec365ce443fcee15650150e57f92 AD: 116bf9c3b52f03b09fe4827b876bfa3c3d7b84afd90972dcabaa971b625fe750cc04188436bc374689249454a4e54a70f2f8adc56af2be48217575460fad76faa4ed3b74f1cb6d3fdf8ca28723057c75ff1e8a74f9da266e9c594fb6c921b9995c926bca308124494c868fa6739f4a6ac663db6312ae34ef43ba21a122deef296cd77452843649ed67a99103e1aa77aa23a3e41ddce3b9fc80e13b1875f31eab3f75f89ded007be22d438d4564fdbced99cd49b372b81b49914595d1ac5d531b0dfc38c6ee18206e44d1c1e25fbc1c027a152ebcd22a6f909178fead243083b4f885ac2af83863c0ad73921098519b56c81e29dbabb7647818aad5a8bd0e09793d6aee040bc9cecccb7e69712e5317ab75a68085ffa0411f82e385377bf1486d5d61dd543ffb20758d3f9bf04a5f97131079ee01a13878ef0c7f466e8f91e9bdea970eccd28d552f8a5f110fec1ff3749e282cd45c1caa6d06e8c426bc28b2a5797407f885b176534ada9720f0d8ff65d40b4f4589bbec0a1620172941e5f0f42d44283358f2cbd0a4abebeb346d01178f46be79a1551e0dfe1dfcaa0c305cf5daef3090c2321dafb6de0481c00df6937590165bb817 CT: a8afc66ca05ccec231d39098ce3f8982dd55b80226a821f1a97919ff7389b464d8cfff1c65f784eda92bf2cb963e41ff5997ed60d23a80401a2a73a54ce880fd8c56284eacdafbad1ae72c4be9ccb761dba1a0dfb0983656b9749e05dad17c99fe2786fc21d3159f378db39dc227d2379f3851e94183df5c4cb858223a7cb43b68651cb3689b886a4ef24fe879205d0ccfd81872b6dbb0e7c9c5fdc0313130254f86e80d7cb044649051fe74425fe55e7472d396d8e15380386de6f8ccd303a9899fcaa63641f0e6bdba3ca3361566a2f89dac8ac9410032eadcc2d82123eecc677c7b16c100d54d8a297dbf30c6e9479278e513b500e74beba4b4a04038fdd68c96d5939a4041def41a6fb35510b86328cb2b8f6e80d9acfb555631acf856975464b770ded81661558b150b0896ac28f2946c63c9823c4efdf9595e867490e638ef495ffdd3045e0ffabfa669732f6fb3a4869b290006259bb4e19d49c5e88b02440dcac361b7bf6c60b09b5b597e9abde536b4ed29b1b01f386a5e18260d707d6ed9b67be012d0485fc6830c24bf4b384d2eff6de8b38b88603aaff7cb61b0812b4472a63758883bf5efd35680c85e4443b56e6f3097037ac92857ed2ce434cf5f28213539be251b28d3c8c5ee7c04dc6f4a3bf12ca24ce79a022bef0f4de9789c8dfbd8df1c7faf10f8379113bba9a3cc4f48e7d984f37c5626705c5f04c72e85902db3ee40dcdeed4156f68149b8b54722b93a926dd2bd546d1dbfedd4ea34847166fa4b6b325534d88e66e48aad81758dc45e461fe001a6e400b68d2974852950a0fe218933fb601c95ef818a85130c434e559997d5d534105441d0eaa142dad3e4ee686554c83128a1266c68c6186ae2a7935eb5a7dee455fc41025741a539fd84d5acaa60c9151987031f61cb3951c96b646ad3f9027f63768053e7a7fde524dc7bafbcca2819ecfb802cfa9367cfe54a1f0be9f949a471801b81d7b5d72be9d377c97cf452eaeeb243006f9dd1381c0e77f4215a8f4d62f959b83fa9e8012c121906f0bd2b688444da3e2377855976b5c68c888e0a244ccebc9f22f4051d030bc95e256fa95cf1e7a958a88d6fe5ce111b287c24e0e71e4928f7572b34d2f6bfce3a2c6fc89be7d54a1a7c222d5cb8fc3a108c20a1e1e55e6a2f3018c6bb2baae63c3cfbece1fe0959456c1506987fdb5b83acb5e4cd2112a0b18c8d0c0afe438917 TAG: 21d5eb52605d2ac429b971fe32cc050c KEY: fa26696ef7a8128ca03a7eb4a199edccfd4bc1d653ea8501d1f9f9dd6c92252e NONCE: 2eebc2343a402e3efdf91f7d IN: 63416068044d204c941276faa61238721f7049662f3721f8d04c908cbb612fbfed2b050efdd69e018be0f463c3e089a063d7b5d9a2ac4eb3bf63599597e714c917c004804a689b2c2ec187b73a38d60d9edb3be9f99d3b452813a3fcad782ccad3bb63c89d4abd18450f61bc94314d9395415503724791a22d1af865d3d5f5296411b6d54bdc0e7ae878447228b2f21cc7ad624a69d56a3694e1a383e7049ab75bdd479ab122d2a50e595fe370041e8a5d9e28dc3b266bcc40b9d54cda53d4049b62feced54620ae0d6cc3c74de3a5bad614f1d8d0c6a74674c9071b8c0b96352c774c034ed7fdc3b8790c43e6b7be8c227fc2b78a381215d97bfa3274e3b52187fbbdf68efee0aa66d2f2da263a0dde580ff19cdeb2c29a6392502f589ca7739e8f8f585791a3f77c1968bed4a713fc5b94e8d3c6830c19291f9cd846ecca2bc05bf262aac54bc45409c2a064c3de28e79831c32f5ec4bcce979b885c9facb99d0c54484154d545ae67d4afaeb545b5aa5541dd0af3416381cbe075cceb49820ad0d52f68c31875169c126b6b1047d63fea674a0420ac808e2ac64adbb8412f8d03a6a5cea014c835b57267cc4ceeb10191df46642344f4f7c9ef9a5fae05c10b2e7ac41afd55e84c213e1d5f58f4c7aae4f0b16170b11b798e138354821fae367a2c17638f1c7d96e343014410c4b4c47a620f79624dd7f3a8de28fccfa365ea904e2aa625a7f3453bdcc990c5bb2d6b0b972bf3349e15497d71349e495c1116f2dfd9adcba45b1a4473566d8eefb1b68054aa7274d4e0ee81f8e61be7adf3c0409176f0b566d8631425835d1f4dba59e7c0d14bbec2ba93c6413fcbc3649b8886cfa6efdd27b8187f1912d17776c7508a54999718de52351352194a81b2b0cd83a5d16348f2e39f22d833985882cd9fd27c1ace4f75a28bc48ac2da52dddfcc4fe428e3f46908d68accd60a17f65e678fa55537afd06fbabddd56ea1574b50d93dc76d56b04e05629e2bc98021ef9107ed8770ae00f1ff294f57edb583b4b361bcc6afe3c545c14adf343f2d019a283e9ecee5505ce2c70206924d63c8b574c798ae0970547c1114f2f82af5a6bd4c1a33c9cb49fb126117d06a63375ff67f7091e6128eebb98cd43a698e3f441e80203262b47c82a65d9d35826794b6f647badcbfff169c53fb70c151dd0c57234dc522d47b4b8470652a86ac09b7dbc44ce8a90a0a2a9fce1b70c1a54cdf59015b89de2331253f6 AD: 82257a0db5c6ed9e12ed5a54101524647847ad87fa961ca6276eb05a355fb14a77735c930fa47cc66887bb687b20c7518dbd9af90e13cfe622e9b0036979b9cd9336da11e88a189ac81581e7d85c2fb1fe3aeb32629e23deb168db993fadaa37b1fec1224188d4f50ee3b8f9ab567b8baf1e3a3d8bf807edba9045338ca14d26fcbabbe7d8a5a1ac02d7c407c17a541fb41004f199262ffd72c3d0deea8296a08af1fd7506e7b72f18a7d322e4116021bfd44dfdd4f6dff5b772ee32f49e098445e68b3a2cb58832d20486d5aeee424752b237d46f1cf8194f7a46459767d1a104f6d35a9616eb47208b8894d998a51519d514b689ac3ca19fdb1efabd1dd33cd4298ae4d0ff819e78480ab7867b2f4868db26c9604323edd258c4f6c977fc4d1398e3ba6300c37a9a13838ea9c5eb18ee193c3566ddf3853fffc0ac665cb952bf76cd2d35106b934f5f8da9aa6672e8f9559777ca7a56592fa536e8cb7be5821961e740483563e6ae2de1b98749752314cebc390beebd4d269f0deb0ca3156bfbf6973da50b8e4dc4eb2a03ee0bfe73f21b3b0f2716a4662a71e8cb04ab44f52ac930eef1895b57151175727f81fa074a8e5366d5b7449185e4829f324879 CT: 90cc04db6cb6754eb81e088d126829648e5b3ac91b89162b3046635f95d19586eb89646d9412ff3c28321504696d8d8bd7567214345c1e694eeed1ab5e3648300eef27739ba0c286e5f6fe389ac4b05f13e92dcf747aff418c97726e7f0820ea4e93121cc2152d92f2711f64e7a4c66e74c21ad58f80218c292e6d152fe5364fd2b186ddc811f8418d5ee5f7a03ecf98e69dbef146af1fc4d7eda7c261bc1d4d3781ef2ad9a9b316eac55758f97a73c67031886e867d98e1f7c126f19e0aae251d92781ba3ad6c949e677f6f71a0d26e45a8bfbd9c7a8b8fe4d63e687a2a476683f72203f24827a0ebd3162305f4c6e180eb3a7bf5ece592af7831b52479021ab76223e7d0714e0a08d5a621756b84d977ac5a13124e9206caae9c6a2cba1257a81903045414fd6e2403b2d68f07becc2e7a130366c0397a406ba261dd800c647fd087f50702d25177d1cf0097552365cb9a729e27ad9c1e4a61031374d362e309c29f649c7774756c46befc17a7c403a821ed254fe7f16542af8060c5743ce91f6cce0ebc68072c305a1f6d0d97db2541aeb87759804e15308e2955a0e6110c3613495115d1066e3701102531e04c1128ef2dd4434850a6c808cc827c27caf9d2d33ce1646228c26f6d9e7a0d05363694198bddf4f1603dab87e5b01363b3cb4daeb0eecedefe2614bf6d09b01813bb0995615d06efa5172b11d08a46a577fa99aecb30e310e84bc3049205534e836a44fa2de79134e6e7d7fc6e19f841e3f31fd5a8c91c7251b7c14960e2efecb2945dd64926a3d7052574a9f8ffc0f9a6c62025f58275a4ce3a084e73c1094834c65f59e09d4dd16bc75e26810506f0df6e59ac486439ebae613356bc5d8245e15a2c0d8997d80235e7475f6841b6e28cff61d9f5ab11a718b7b60c125118d3f77559aa539c1f15abfb32126ef7a9104c6902b5f872663539f78b002aa11f2224f2b724e346e9fef6b84deec427a05576a51aad885e0fa15e083ff25a1f97b7968dcbbced7b5f3da137e0b48c5bbf783c7125f6a1c7f2e707212bd608bd09d12104ee593838842b127a5b8050a0d411417a5b88ffcbaccd32d1642ff00ba22e42e8827b5be97318bd0a69b06839dce80ef50ca43778a60dcd7193af7ba5da86149f7fc716c22fbcb0b1671b968da755f527dd2ae05ef2b6b8809ce38c9cb8b7095d7b3a9afd16284334da5f0d85b70068646f4ca3c6c39a2ea1d146b84662219827f756b2d1ec641f TAG: 8c7269eae0df5ed6c8f452fd89c09707 KEY: 20261a84a5458cde6565e41daec0b05d1e46a6a34858d546eea8258a399ed89a NONCE: 5168b8e6c75f25ac1087b315 IN: ab57ea5e8e39f743a826b70e584c4bfb2bec961b6769e2b92151cc1a0d8bfc27a9d5d9c7b43c51019418bb19fa882e53fa0f59d6761ff7ca75cf098f613086f9403a8a66b07bd1fde46c5316403de21d4f839a2e67bfecc2f3bc9c8f28b455f0fdb75f28a18852e6e44184e5c104a2dd2e21f429b46004a595ee8e2b008c2e0c31c12a05bb9de15011003d43c342330f5852bd3ebfb7bc4adec6fd7e3d77c1534e0eec7e2fade24d89fe42dd9d8b5bff5ad4f5f8f010ec0903b42048e8ba6f4b9274c6364d0119c718e6d038ed716b21b7f2297317e3869767a2b841505ae4aea6dca5e2b2813868faabd7a299061148f69b0ccaf4a555cb728b562bed9f66fc8d60be4c48c60504afadb1593078c36d54bc878a6a981ef283bab6f4ef6128f78a594b3caa6774a8e6246ca32e84a95ea5774b7c76599e1cf25b68210c2c52f465e3ecbcb91d609f211c12a737936d84551ceb0eaf37f92152f6e93918f4a19bfd09f16518004897d9f0728e9c1bc901fa85f8fcf77bc59c2f96ada344fb9a20890b74520a99e9241d9091742def14a46c524e2c494aa57c1dbafb8feec5d71247a6ac10db9ee768bd2f7cfe1f6da9fca9aab42da2b8e0dbc3e4bd36e2de49d855196d82175ac39516571d209cd5a8579b05fbb0bee133dc3379bf7894511cf88ca955f3ba1f794ed7abb0771d9d319b4f4db940963fdab1e831ae6d5c6daa96c44f3c2ce6fe2772d665a212d3203a593f412a557613d4e465b5eef977a2b62490e28aafdb716e7be6d040f731409c54e4bb38989349d842984116baf0502d21c910ac86e3046e6753b9f8771fec297eba18ed382b17fb1ef0eb20052d36080ae162e9b8dcf67e7e3d2add03d752f612b94ebf4c5b0f242a39acb092e32fd044b8e9ddc6abd0d10985c3b25ca4c9ba476d4fa55766f416d5d1cca614bd1d153432ce59e82a3a86b6fe830e1c0f9e64dbdcbe0457ce90464dbe56d2cf66a7eb6f43760e04a784466dbf7b153b2b96439db92180103df8f4fabb5734bfd661bf8faef2b400102229a9895fbeb1f89e6da6c82b5201055264fed0089eec72892c10fb2ffb4928cfa8df0d2c6680a5299899d521d43972ab8ddd613e074d60fd27a061ff821e8c410cc6a019cc0279f602582b752df3877915fbf14de225bdc2ab1fb177fa1724883b523faabe7e7da1d697f081447c406ee8a2c1a9f23cfcdba8fc0be440f2aae9f6fa5c35c54e7003254734947fb7e1abe7f8040289307d31bd6fe8e862a2d9dd3feb AD: e9073e1a183a740755059b92b0e8d8a66f5904f1470d3b04d98ed4a62b90245767507e54ca11afcd113960568c916381caf4c963c1d8e9aa4c7ea0ea5aff12af63caa8a5e1f128e70f3c1387b50757e43ebd3e7ef2de43809f781cd733193daa2eaa5dfa0c8b161e9e4480d92df163c2619b571f42ebd706d48a6693d4a5071733544d2d4fc771d7fd97941f83c920673f0b8d82dff24402a14ae971000c5c8747b9a10d32d622b2b1c3aac7cf9804be165d3d8c46d2b69bbd059bfcbc1f23dcac4bf5eb5fa92dc93a7f3b2199cee31bf2c0414fa2ffef1ea34ef109cf4e171460aec158118e3bb3a0a8a18ba60e48f890add45f3fd3193a47611baa3abd36f1069ad52ea464c10f5cb49ba753e43f9a0d1d9bb038e8d450c41491cb350be288aa2f95a479ea3868a4ce1f3265e186fb6c4f54e57f285576c6f700d9cf035d296d4519c6e31693f5e0b6437383c77bb2d235c0d5404a82515115cd260cabef6f2f020bfd20d2ee21566def190d0a6a76bfa14874565f99738fb0863054b4f0c3624b68447358da5bc47f195bb468703da3ead51cf02ea001c57608ca98328068212406b9f3821e98b7481860dc5d9533f2afb7f74b9144363e6f54032c983453 CT: ac56114a0ed27060f87c7698d659d16b05219d9e013ff22dc90ad469646177feeda9b41531c83ba781c641c740c273a43cac138450eca6c9ff42a2d715de22e0c0e1954842230a0dcc887a42acf1fe75d204ef881af3de7733ebd84a3bed530b34b737a35394097db372f19953b5f9ce288ff8785da5926be93ab67de884d8ace761393c2d3c4d308964a90cc49d9a5a31e55fd20230dd71498d1875476ce257f175135a22e1df34cfec1f31dc788e7c00a483692f1fab826f92ff497253f9e56efc70244346e7fb32180cdb689c6a404c64e391419ccebd9034cab1431be1bb2bd4defe4770d1d9b0cae785592a28ecd3e9dc8993512088186cbea448c8b26ca1c64d623c2535cca60d92a3840a01a9b2b0a7f359d1c597a550b62eb6ffd3d454df319c6c5846c26ccb5ed59e0d3e58aa63615bbcdf4861d85c1635fac7756818a3bd47f5e2bf2b3d14e13ba409379cb62a1b2bb420870879fa522f573eb9b1624d5efbf67f92e50892de2ae454950f97e2b181bae56498585f3b19cd9ea603b6131dfd3995ea29d0bb99f5e6eb6bbb35571d6ac9e52fe02750b97f024b9328ec1dec6aa3a21e391804bf7aba5d3b7bff48760f4fed880259c43ad007208a04a20ca0864c47f9e56b0c969b8a84fb7eabbd58e0d91c44bf8a6ff12225d2c0768c078cb0bf6f0dd67977d801634dd8162500d6440ceee0bfa8750e9411d5a579efb30c34842438105ae2eae6430ae6a98cfba882c974f0f6c870718e4700dd9fe27b98599918896a600b3ee48ec41da20079efff705861c245d31a5d827ad148d0a75cd02b5b7df3484317ff0c2a0a600b22b13bb3b96f2d1c95a5884210e486763cf8d96af48c5bcda8c3ce650d2968981fb003ed3afbd43fbb06502b547f3961e6ec636a12a551a9863b9b89f21dc9485e62a43fc1059d65e1ccab12620ec3a98f2237294567239882c5183c596050b88c38f8be62b364e937ac92ce5f7f8e540af6507f04452ffffb67b51d0e336f57ba71c771c35febbece8e7b0d4eebf2dc0c43df1f42433a3c83a38941d6bbe12e7110f7f266cacbb6fb07d52618e4992a5930e1d416d6e4d1b41a0ddc4ab4a592096bba9437050e2064e0c17d1572c44ea52bd071a8dea305a9d633b0ee963245474fdbb3f274e119e59eb50b63b58fb05ba74242d3ef63cb3e3c98576d2986bcee85d094bd5528d8f43415f627365b08316c11abc433661b83a36129da0550507dd62051a8f5e01c043a04f849899668b3ebd468404811 TAG: 1dc7ba2dcd3727f14ebee62ecdf66429 KEY: 99a0547e21cf8509a0214ff0e5cb956130d03617e50f59e300a0ef211b4150e3 NONCE: e040d46d2429ff2b38d4e35a IN: 3c0035f9d3eb509dcce14170381d68de8fb8f0d6463a2cd293ce08c958e186031a942315977a1ec5ff66e47bec07bfdaacf844fd2c4fa939c5a8b1f3fb489f25ca7b10d87a7cb6d5ff299a57a1b8c6c78b429dae9e9b1c1cec8e14cc3bc2119df31d75e9e5e3df7b368cf4a6ec4b324500d428ddfda32e2f330fe089494502251392e554599451e4ffca96fcfa6ccbcb50828840c98266a10de53f0f8bbdbe21dee0861224aac7713d8a93979043d1550895e06e1848565f5f6bcfac2faa3eb21b423215cb39564b8138b00a15be5392ef1ff451da000186d9807c48a98e2ec6b7e045a139902b920c5ce782b111b8bd44596a7ac8f468a6b718cb7679d5d420f28510505a52004c412e6489f586d302939f3e007e320a0de6cf9d4ad38cdc3c852907cf7a1a083117bdf3e1bc4300befa1180f4c019faa73bf31c43bea814990cdd01b17b167f21b5de9541aecf6bead4bdcaca96fa390aaf6850a54a4293ac4460de361b3d58d5eadeecc6b5dfb57a36215d03c85a4805ee8af03df7627d42479357724349343862c960061c33abf5a9a8dbc2d562f3738f2ce34d68340707da09f78ba191e230521c0ff28c3c285075832c00e326c842296e6a4ac56946f4248364f49aea2a19ccab66841c438df5ff7834ccad859bfdd89fa9af0b99214eddb37dbfdefd2a3127354843f6b545f729391e0d19089255c9e0aa9bc0da87d001445c7d80393d1885f759fa8211231a50d1840e7d145899937ea7af1a3b963493fecd40448383706a33337ded7c51b4fc118a1ac975a4071f26a9a30a0976f369ae3a9724b05cbe75fedf84fd1bb6e77e07a76ceca71d5c035e61181c50e2dc976fbc64e1f4f9e6e12856bd3597b475f0b6a94e559477599a51bef1fb3a45106fcf0ca0468117274ee4e3f3f489e3a4ff9f6279e18c38928a00976464431227ade20b45c509675619ccedb4f0b24c2ffefd72b3fdbb3ccfffc26da5945a3906c8824d17a930633f8208d6d1564d5a69c4887812d91ebfd18d482470220a338de30b9cd7945a93460ffaaf686a31621c86b4620bd24776a54db32bed6809270ee19460c34bfe99c7fd18c5d7e9616efb6a156d4b28a0823df5a858a096ec388e2fde49a2c8c071fea73a23dc4dfddf751d100fdc57e346c9e690d2ab620a0dab87e3c1fc02f5f727eec6a1853067e7bec923dfb3c988c3e8f108adf1ddcb9b8804e7f3e9fc8191d059af53c95836314f0c933676044b85dbb950c953603589762c10fd76dfe2b301986468b3f65415badfa5d1f0c0816c6376 AD: b96c76c847741396adfed41fc14ff53c3d1745b70ce64f18fc2fe2ca445a7fba83780e265b390c4058856bf8befb36437abcdc25a758e77e0fc90971fab13c77d76751e19280e43851e7d39aaa0aed21bc32f7aaf25756111cd6ddc6b6f9b8d15acb4a25493f247b5bf134b2bcc2e5c2f91c78bad248357f18fb3278811e045a59170c9f0ed7f58707ea78c42e69a912a8321238ee63eb079aadf9030c4f718decddee4077183a2e5bf59a2a1eba07b8c4ec35cf9fa3a37a5c332a14c3711198f2bc9bc686b5dc6d3d7b6de1a8ab00b1fefeb107157f85aa8974c04edf757974a757090f4cadabe2283a29b317a831d8ae999173f07be4b4f665eaaa26093fcdda81fee6e170ed09f2944fd40f9f3ef47b406db52a55cc9350e78364e64220c9741f8e41745bfc1be8c6244c57f15b1912e55c6711ebaecbdae4c08c70768bda7750f142cdda19b298607e75688eaa8fa8f47f7746ab67442da283b1b9b9d12ddff796306cd690c0c32615007ee840844c7da285fdf56f004de5b7965450d48fc97a2cd2b774993a2bb28868fb241b051341a727fc12778baf3869fabd208aa3c55f81c247554d11eb5d847123a6ad3b177dd6ef950ef4371a6c0c294ecaab63beff193aa751ab480e CT: d560de73e9674b561fbb54c6e4267d3101479c2fc269745be89c470109068cb01c6e3a4a7a9ec284606db6e735df2269ea16863673fc35c911fdd6201a1baf9e0b562a847274c2defcc0fb5c165662d0bcbe6b01fe595217d482ddb616ee87138424f5438069abda9dcedd48b29125937e3266cc9d468ca38fec9920ecc81952101c8aff3d3ad2ba4953bdcf26642311ec8c4a880870bc81ac647351a49183e182acd38585cafad3a37a0171c0a0545bb3ee6a67a2da41cdf2397c529064b09dfe0105917e1da7c3df24d2dac6bf06f58efcb38752ffb79e93031cbef73e6c0ad68fb7a192900aa8a23bbb7c6bc15fba8d80058bcf9656323da4c10f19198d9db3b42499621e1d60de8a16046853fa03b783dbd076d0f51fe40e9ce60f4e22aee657246d3ac80913bd495cbcbbaeb778a485bcc6c596af305429afa5f09736e7a78b335f484bbd70a3359a7aa2f4c336f5780f3186fd1753e4673e5234e3f8b803f4199bd859d65267857f8e0391b4e8253fa644a10bf9f68a664bf7573628490b1baa17c23aef5f0414067d2186c08e27eb9d1034aae6361054f2f9bdcb877e72837c70816fabf38e6976c8a5b20ef3a150a5d1ffc997a248ae199d598a01b5bf7da1d6f7a57f982026527e950f33ae33cea9d64e56a3a2d26ed2f2cf0a5d08e6a03db5c483aaa0049514e013b915056c4570c4606e6baefe7c6a74ae301d7b9b6b980d85bb500c8a61c05b38e79db47d2d3b88db098737def0d995267c931a2ef21bfc0d970652a3be8de5f42c20fa43e1f7bbdc34b3b5d2fbe3c396037fa885ec6213748de5a6b64634757aa519573aff1cb78a3191dda039a3c64940b816fd010a584a463cc17789c732d7a099fb423dcc9c20fa1c0f10436bf67f9796c1bab8c85ed76c2cae84ae599f7519991367d69948b757a312cdef01c535f1172ccee7be47fbab14362dc0f3fc89c7a71ec9138b40eec235f585e39b008d1f29a1be9332b2882f6d053acec077ebcb6393ed1dc46d069134d2c37c7f14c0fc9f9e280a6e2598ed8a070edcf9b79a042561dbf3666bc49863c29712d45c41d434172649baca0c2b43e3364cdee11f9da14eaccf8a853998a2a9637b268b6dbbb342575481c37014631180737f970fcb8b8fd5050ebbff873b5bf124b315799c94da41b8b5a4d57210c4edc26ce74738b2fda9c02b3fdac251b2b317d8edd345ce4a3e074255e8c49d8bd02376ee2aa194513963a220529e6c14611288b788b68e74f6dc206ad094e322fa3002d62101dc4d572ef00c1567f0e7a4 TAG: 799c10bc86be84658d0b03751a29c71b KEY: c6e78bc1358c72bbae8fd8dc84038806efbfbca520a9bf9ea1df8ac365a0a95a NONCE: 9865ab3b3556ad8da691b079 IN: 26db63a9d188d3f237aec1f8558702b0942b209f7e6096b79154d2eb844b05dea8c81bd041962e0c9e8d1c64cadc5a46c2d8768f57ffc27a1d5003776acfb5f51d372510d26eca840dddc3fe79e9414bb76aabe249c7f89a43050b85dc6b5b9e13aebaa98aed4cd0816685b20619fd22c860317b1ffec8f7e78c36224bb3922208dc25d23f023139fafb2264f9546bf57767d3117b483807cc5a1e0fc2c691f3891f54897b46c01b6f55f4bcb86af20764bdb9c7631faa5aaccd555e68a86a9491fa87718d5a9112e4ee3c2364b5f339efbae59db73eace1dffe4439a64d1baee99e6aa0fe380cf686aef739a456ad66dcd149ba8ff6767e54b1a3cc645b245c2b2ab3607334af0cbd8847c3931b02acf12209ea79af189fd9c6c01871650a009274762d07a4ca60fb9a31adf4c877c73d0819f4a97c0cad91ea5bd7d5c8ef59b35f2b24060fd8c6b4afee8c4758034aac99519757ffeb6fcbe40b2783f4aedffc9d0da49f3f98dc25a66f2c6695b864bc40c2fd5511c7fe681d98304be4c3e9bd7289c9caaf6282f7c5c7ee4efab267d7d746673049ff79ccd7bd019ba994417e22a67f856310d8abad147ce68fea094e52969f9738ed6cf9cc9eaad35612400b622da255c9758d42f52dfcd12cbb53bab8c9884eb83f1d2dec7faecbb6af3402bf462f965e2c2281c74421411edd762ea8b7b6bc4a44132c51c2db09f47a03ad2a1a17d73ad2a395e6762cb077a8be977f3925ec333dd56ecda27d4d228b1832196da7755e48517fa0582abad802b62cf231e0a2748b61855970912e1fe92435efcbaf5fe34ff2c0f90113966704701337ec6c0434fe2c36e3300a4387cd0514ee01e31628b9879fc666284150489282c1083079f8abde0a2e500737dad91b3a7c4ec1f4eac35dcacf971283825a37b65464e7a8fd66e2ee6721d4a118854f674edf89d376c0006fea01d278b7985237e78965f0987404efcc6576d1fb28db9f7fc1eeaa6b42949e11dbb0c137d501ff08b34f0dabb7edb6900c48e647ea0cdfb4c4ef3178548a592ae28eb119f1dc7b2f6dbabfa2ee4cd7b7b117f1f90af318e121084cd6b93ace98ee7750dabda5ce2b883f582e7c5d91ad42e7ea1fe8454a5da83a169c32d73a4c1c185a02275b4ba921b071ace5fd34a2076b226d71c229d8be6c58270a3ddb04a554e4d395df00604dba7882d89d9048b3e16c692e636c724580da376f8212a6b9c443ec303fa70cbb1994d12a1574bd93b946c1a005df40a3722fe2c2e7fdf51ce2b895c6cf07d893a41a33a6906af87af0abf948bae5ad258e80a0fc0afbcd AD: 770a8a32c90e0949a1151e20e81cbd163b7d1ed843008c813ec3bf44d363e37ec41c094458ab8f7457339a51810fad8d63611ec1a93282c301eadcb4bcfe4d0b370d6f8670516cbeaf9b361c92252d14e062bfe2e63b439c7d4b1d65dc8a62263374d718831fcb4bdcc0bc59a18530f7dffbecc96bffae9e0214ea7f2a319e5c07dc0c8232e7863df7d081a3486a1378240a9966a632c5e73fe4800481c4f430126c4b5ec71963c08d471e01b6296b64a593cf78f108d2ee866af38028e3a4571f5582207706932019646a1476115cad80d0b20695c84131e11cb9689a6bfc40f820e96bdb151adacfe447f06516dabb2f766b8ff5619a15efed41650211e4f4e114ba0b071ae0a6b635bf0e1cdaff2a2a1517e7427f8f1c25ad5d7cbdcb433987a25a2962130299f1de3b68503fed81c3c98dd774402bd83809367ceff45958e7627ee8dabf50f6ff6aae34a8c7ce471c705255099f602c2792468b5e8527b74948f4871ad5296c5c50b8d4ccb6ff8c2f44917baa7b70aed81302624fc405d3c550791ceadd2aef796a0db59c01a5496ad0b72f7a90ebb1eb2fbb2cd8d8f09a2fae46937f27a7a9c3cca3360b08143043d378c450de9676a94ea5b9371cff1fa3b067069393331324c7d283bdd750ca521c CT: e6ae771db203f1e58b0336c9c655013940053c2a40cc7a6a27e707860b179d7895a16f7a754c2cbf2e0fcf610a3ce97be5e7459cff4684b6b2848f2a39e6c4572c1d7a41f23646eed5909228adf1052adb34b9c44e5ca8b2bfc18a80675e29749e72410851eecaf261868b6b69e7d9dacd5f019de1580549fda721e383b86eb0c51c2eac4600a4a27b5f663a7c89c81401fd452027819b93281b559153c74e5354c320cbad932cab5d261308e241e85c0967a189de09eeced69c834b4c64dadb9447a824bb38d8b8a3fa4128bd8392cd34b0999b4ff0511bfb9fd434a1a0bb3c507c2828d98ecaa9f2dd5a020320f6f31324fd8ba8c175db5284628d1cfc4816054587a6cdd5f9e6d6de2cbce9396e874df36bcc347ef48ee9e6ef7e6cbe976e4361651cf8f92866cc3a54701af59ba03fb8d23024d6be73e1938836c31b303c687c28b1785c5f9b97f3b09b7ec3d83d8e38dcd18c3409db665bf74b85abc540f678bae40157eabb69332abb9c47995f4c412a04f9b99214581f1d18e0662e77a2ef6520a23b5a031153d5586f169923dbcf08d403e37184c5f7977320cb33b8a0d5d7bbb25d7a8477054874a14e3d34b92f7877aed42f595dba8830757f8e92f21d5feab414ecc9e3933f082bf46fcebee2ce5246c2fe839fabd94d4f6bdf875cfa67867f9376281b1e5385d1677a595b018617f44c6113f6178e5446cd28facc9a53bad29cb5b3a3b0cd29186c24339ea008ead440041c6bd0e93b92ab37e3692ed13769d147a1be8335feca11a533156a3e416908d044a5a74454f10d3e59e5f9868c56c517ba1d9642c41c6a764e74540611545ca90219ef4a0db0d25e92196d700f4e57a6778d20b6acf7d1db8060ab534ef409fe35c30c300418641368f0a3ed2407027c126e967406809524860cd88906f046a069a22245d9b2065cc5fc313a7ad79bc7035cb681a39387493b6be51c813748c008269f0681e88616ecec8a01416e4ee8b7a6e4fae2af9648ebb89523434eeae6e5713eb8037bf173e467a6da7d6cd3d357e3962aaca14c03b04046a4f893106e199062360217afe40f40214d28e87eaadc175ccc11d172f6cd42e97c1f331e246f7660fe22717d7f1e24752b1b01398e4c8bead71d8f6aa2d230c6392ae21d43bd88258c1219d491b8de12d53bb9fb917eecb0c254a4e9007f789699de1dc90d35250c6ec4631ced06cef9dc0b0416148835be0be3dc4749d4c2edaff37d7607c9a3e872f723583a1566ee1fa7be77b848fbc4d741ccef311fa5ccb7c18f19295e53cd1da935d663f0b26f776db6d479b4cf3d TAG: 4fb43763c09a6af54ef7103ea40de1ba KEY: ade6526c970a82fffd925ff945be16639864e4189c3269838d3268264b1aa586 NONCE: 97121394f11a1b1d9caf4e3e IN: b2d855d51392454b7f4f2b6f29f422d111cc378262c986e3117e81f6eb6340323427389ba2d174f4edcf5de47be0b3fa820783b8dcd35f18451f8256d6f703bc16e666367c93f8db0be18c98d4e93dd6db2f4eef2447cbde251fa226ef4b6c4183d06cd1090e46cee182743c1573b3fc885e9da0262d715dec1d66954ef49c3a7d54f935156a51cbb1b837229eb5619658db860835fa5c926e0b87c9ac50ac76fa6696e149127aed1b91bb623d232da5df30b9ef43b4ed018f59a803b995748e941adb785535d69b8eb9e4ebad17c4e2bfbe6d2706eaf90e29867133b4a58c3e42cb51b494dcb197dd55862ca0f274883686b1e492b35cc20e2cc6e531c15bea94af9040702513d7d929195ca34266c38ca79f3f5b0c06a1002bf40770fc223be269945e56f11a608276bc4b82cc228248ab46acafe801d330c28039f7614e59cae505931ae9fa387768c2fd9ffd537a0704fb30aef78b1be4aaaa6f7574da1274d3e84dab83297acd00885acfd32300a36d0e8e5ad2777e4c0f718f91564c60ff117e17a8c57d2a8310fb1fc62729720728f2991b4d05317537883f016711e07ae1b3e6d876d52a44bd246c427587fb91d1456711ef0c7970eaa33db3347397cb76b95713919c73188ce13a6a292d798844067c0302b243593177cd099dbacd5f8efb412a95132b8ab31815dfb463451fbff63388d8dc46c29d2c1fd937c668025c833d7d96b021035d530fc404e1c6a3677b8a318c9a81e295c12c88fba75f1e17973732275846ed9103287714236edd60bd9cda0d4cd2695234bc69cd09e1b4db3cc73461e524e0934ab0cbd730a46a67b3614ff4973bb8643ac7d555a8b764bcf87f0bcc8d19cc9ddd3fe27a376b5a6affbc95cc6ba966f8ca697c5727dd3f942c4a3b6215c00bf37c50bc95b1e35dc762d8db2f0f5d30d9b35ddf005d8a89d2b106fa4e921ead057158c3fce0bf1e6e10085619777bbcb643b5fd86b9b39c1f11a68cce6115d2db8c01e6746c81da9dbea30559b1bbc2457c258955f2d37862fc492b4f590fdb8cf648707b17a2b613c5f08dc457a1443bd56399e34254c92b91093ea0208a98189429147771d1bc49296a070e052af3fa195f612fd2487eb49ded95f2c670b3ef23464684f12ae66f02d886ba14a360a852b9b84f9b5590a514701fbe42299b54b9e8c1e7b83c7ace9badd9beeb0f88707b79da375aa7c2eb9623c7a1c553c521a9c7a6a3e73f0d7cae3f95362d25f6ba2313a505a90442012f58f6d9cc55563a1e1026cc1ef0e69c119dcc4577eb775f5d1dd60cd60ff5b35dce6eedee48f80d33227f6354a128f9cff56fe1340067c9eb AD: 20e24e143b9881f8d646947b121df798b4917bc19a76e96babe9554d9617b4f092471baab93ea7ebcd8a05cb2d267be93b4dadb29d4ca937238910180ae497ab4c7c4b234661293c8cf7f2b6ed3e0a738ca8ba0b558fb24ccebdf3b3e9714e6d7b50c847b72ed81e3893bdca85bf46767335b41d68b62961f3304003247ed25b15e3e54d6942d35fa24b7320355d4e8e038ddcc295bbd6ef3b24e9332a710dd7ef673d3cddce10f683d0ba14dea984f61ecd580a684f3bc97cd50e14b86fcb2024367ea4e21a8d01f1aa6993a458bcbf1279fb45ec4510a9295b20e82cad0c79a5f61356509be41525bc938fbfa09306a94610fb9b9c8bae1e051bd6fc6533b8b47bcee4a9b81b492e1295c25ca91b9b5898487e468d64d275f52a6700fed0d7b593234b3e0010480e12fd8f5d7999c1b8b05c7b9dde7bada3cc6926095a8fa8747da64db55ebb3efa167b7663f1cb5883593955a2252586f942c8aa3a1e12ecbcc73e1aa5831c00e5e211c7461120f84d4482033a238b80016d71e51dc297043f67877102f69d7bbdacd03c1896bc24cffb24d4529aa7d8d4d5e5ad3a990a36e1fc84c7f8e91fdf2119a36f5b521125976ac9ede1d1b74e3a31a9428cc36c94e6b3a34ca1ddafda11ab46cb4501dfe4b58cdf384576d651b9aac5 CT: 0d8f126c444afe37e40d85b6f0c9f02b2232faf975d238cdb227a17ef28e18afa6d88d7d23b99826de9f6e7390f67c2ab722e1be3e5d9f3a2abe41e508abbd22897ec36a70d02fa54db8004fa3dcdfc729d58ee12ec5b1c85346289f2112c059ecfcfeb6e4723904ef1c5e3bd123d302f6e4cc393cf62513cb3e2df3ea822692edd0d8533d6103f22940cc82116c4ff1e5121f0ceb08ee581f40ac68e23c7e9a168661e6d93259e614a3f962fa2ebcfa3a4736f3490d401afc9e6aaa8a8d00ad6926b3a99c6cd2b3b05767cc5b45901d0c4301a68c0783bf1611e2cb95d6859293b615975be7e1d829f13eb4fe601b4d66af3f28171b02d09f820dc77ffdd22537ee2ef0cc291f785c466ea45a0dab45e782e7ec3d4bf0622680791883f89f9926009f6b6bc3fda4276b79d5d9070914e75488c033d47c58defe6b538c58b106fdcc8957619e008f6b508a87d85d4a46364535e76a890716a215fe5f2ecf50d8fc0d8f68d2ee0345497f94525c588eb3d21d66caf1cebec2685020523998cf6e24b5fbc384c32cad31a2345fd88c8b820276d5917d71e69d54b44ff96c8411f1a7b6267e20d67e35cf274cd9031dc157d5638f5fb8faebab2f5fc976fc928bffd8b60ac8d8932b8ac076a000675cc05aeb4d8306d65c6060a46bc200193d56249e605a7b10fa28f7a04a72055cdfc6ced9a220ac50d3c36ceb4ba5405945307f2d332a9a14487d7a74ed0c379623e2fdb04324e515e1d5ede3af27fc5f06baf8d354f6b68621e372347817cd3acb05df1817511c978537722f9a4967db31d24336704d8d7f974afedb487ffc6e877bb948f0c30fd64be7608723eb732a6be38394891e8cb789cc9ec2e09b8cc2ca76b56ee7e1d5e4c0bf76f28d705c61104b508b1c4c7c1a1cfec10f25676ea55f73c95af3fd34bcde939652fa91f5fb9d8b783dcacca1332230e2104cdbb905511e8479da129ad64acbb569809ae2a19e71bf7fd6acc18e7087bd49997e3d57eb19f30afd1a76c42ebadcc7f8d231c0c28c7a0850ae5463d1730def54c24a803bc1e889c0719e364492cb737378f7390e5ae506d36a7f42bd86a6184cd6cf0300331d0f54cd6f5b53200d59eeb8cbec25830eb74b0e1d931073dbd991c8a818d9d7f2b8691fa2b523bf73d9c7f101cb1d83699b9f5e1b3545f8efbb8eea286728045202ec8f81c71bbbb6e888698c69b92563615ee7d07f66c2495cbeeaf15825fdb3a3dbaff7347f5b52f6f886d80464aeca6e35cef31b6909bac29079ee1403f53a6ec45204694e967bcb318f91f4af5e868be46df4082f4e77c627bb34b017c0f9d9889184f8e88d62613335 TAG: 3350bc1b6fa4c20bc1c0a28bc766778f KEY: 32fdb97a8841d0bf58207131e0c55361d7f87aa4c8eca24c999b7a74ec23f9fd NONCE: cacdf99a3852e9ca9516be08 IN: 987911d111d30398b1d730d6c7d0bbfcac487e9a810a9a17ebf0bde09b3dd7a9a430a3bbfe41b3b3a146fd7960870b1b28db45111c71c6c9ba731de849382d679ac46be434e2e95fef2b04ccaf21afa763bbc15e23ff44aaff7ee793941a8954e42917f759ffb0745c34e9cd324e9c527b6560e52007e46ce0d46aa8165a0e6885e96ff7d6d84d186b313cf7b726213bf9c3fcc3535be589d336f84925fabe762d14ad033dff5b7f39f5948f5f939bc345c4db77d9cea9cce1220ccfac396d1e4201780f8d37c6167600a17c18cccbec04f605d86dcbc3125dc3cf5b40039c3dec4355beeffd72ff221a4de57f0aef322369c1755468b5748541049f3f1d790adbb460d78cbf5e3d2787d5921f598f3d9a92ac289b58c46edbe1c64a6cb2a796aeb17259a2569af4c19bd69da1018352b63b2b3a901bbf0c754ed3b0609227644fffa7a997762aae36ffcd700089d74cf3b9ec2f5c9a3908ace5a7048c90ed8d775a88693742f5738cf2a791e67ec747e31a1387f0c0da3a77b28b720bebeb7a9f6e76d0454f79225514a9d0d8e488a7cced170b4b89b1b39091bb470832e3d3fcd144fe86c661ed6d290c4e73fda61c708004561dc71493c9dd4a66134308577fb7cce84891458e2dc4581603898bcf74cf5da7cb1f3590ff570ec6e559d6f05d44b6e557031ed28b60f3a9e73293d03f57c9c636ff9336cee086358c15ae3d5af075f8d9ecb494b00aff1dbe9703c80bb669b522a00cfb1c400598c6b494b40c87041a99d461017ef4381d3db7df5a017564ca988018c4f36282213de60c841944b6d213d8fe2015cd535184b1619866106c39a09f71a70f78f2cb8fff2f377d87390eb31b73db093000006239a8a3494a563618af189ab3af3556050b68c4abf48cf4d02013f9ed69b52d8c6bfd5188a56f4699b03f60f218539a1638c9890c7a77f5bb18d7c4ffe27314461a29c91526cff0f713a9be95b608a2ff36783474cc9db1454df62fc7efe08ca97418d982d74555c0c15fa671f99fa73559ff54ebd092756e7d9477ffdf2de14e1c9d4900fe401d1fead7fde27cd37d016cdc56464f76193af1c252d4efd60f6f3c0644ccd1ac67d968140ae08db759aa7af205563d4402927cb791f8cd845777043b975ddb1ebc66be4333b7b60293952368767aab30e1a52e1691a35f684c8587bdacc8b374963c1864619ff4a204753b44860f595ecfb275dd0b94153a065f3cc3235a7525921d16684524794cf45a9902364c80ba5649b90c1b42ecf2f17c4e3b7a888c6a2cb30240c6baec3170b309714aae3005846a19c6292e5b7d2772af24f14bd7f6cc7eb89e0489400b4c18b9372aeacd92918e4b2d11165f2de0 AD: 62de882f42ee7c4b5ed2fa54f66d0b4dae63db4d9a777b404b1befa704a48a3be7b8511fe716f77c890fea23fdd05a9d4a57eb0f130d7383a023ec6668e6714f84337dce5f8a9f46b9ba17480288fe89752961c6e7cd6d32d435c5930d5228be9aa002f01f0ddc79bde0abd76e4294563d5410c81c56644620a002a7facc871ee7b5fc73ed03ae0cd253439688cac4e6147fff75fad37ddd52971895702dc280273b8e7e99f8d1e93a2712bd9a6515c9b1dffcf7800ec13e08cc732a15ed3c51ab8177b3b1b1dc25e387ee2d0a69d7e2f7f77555bdd75a75400bee511dc5c30aa7eca46b05c9af4e94adee1c0bd84085af86a85a15e81d607ffcd6f7670bc11705b46e43b6beea7e1eba5804e24229185b15fc1fcafaa7de15ab336fa2ba7d94852f20de7543b4acb4e75f523863649578527752050bebaba444fe6b57c0304cc4820f0034f66b778d907264e5b8c8c0357648875dea1506c00413109ff2f25d9f1c3aea724a5b7f39ea1b08b9329c07dd8b0efa2e0e6fbf3f04708b833c2e14b6f5400b4b3d6463bc256e42c8a427f7a0d8b71aee9825169b9613dcbcf7cc364a87ba64e60501bb01d8f55eb5141ed945666f69b536662705d12f3839c45917ab7c932b8609a97ebbdf042fafda951753abc765002ae60eb1c9dcb2f95175ddae0d5b34 CT: df417e819076b3a8ae2fa8f0ca968d5be1f31c4c44d02f29f9f1f69c8d2c269835426ea9735aaf95da0cf92b45d512ee8e4b073b40504cfbe9efc62770a0000706f16f7cc350080e52da3501675907b2f657091c1b5980d22bd7dc519203a80c674418500224900d74a11ef87d9f60296ff5074674552263b7b6b249c8adde311b98b4181a3730c101c4ab9bd29c044272751197498e8baff4a8f2558de20d4920ce21f4dbecb64e258d078974dc6c2d574ebc8c8ff32505db2ccd349e82808c44eca7f4ade2ffe9ab1ff2815fd282985a8de28147e547023f0254105d2d35aedc5e2083bad31e05ba905c1b3c53f354aec095add4c5cb40c51adb6a2c290a867ed58b05b14170f8cbaea863ec74a3abb66baf60608721b96c63da4b4d966d1291a3293539ead11167ce4e45f0f62cfef30962d2c979073cd7d0e89899397cc0ecbd858da7de3975fce6ca3bd6759581787c5559bd41dcdc177f6ff4a5cfe5b82236d467f93abf5b2abbd30a90cb25b4ae6723c92621820704542f9d5215258962c67ce9e9e2427c58b5819a709488236f12c1f2a7f5c915a4cf2f8eb3c103a4ab9769f76102a8f8fd73aad7c7b6146768f3a3f53b8e276a8634fc50446d5e0cfaa589a4a7fba9a8095f9567506dd6d2fed0c1e3146dbdb74cd116c13bc5a7ace595a2b42e0e3d46c5232cd92799d6ebfbc06c9d0536db35295cc4f7a7a28bf8ef3c649833d5f330196de4826462dd418f95450cd431454cef7afa6f2f4294ab69bb3e588d3b9300a593ea80890e9d678869e963e75bbf281b61f9f7cb9a3f9a773f2343ea306bea4609b03df78e57d5b9f682e0c0b10b57f360e1b0b9058c12f653b3e1fce60579b7c2ebdbedf0090fac36e72099ccf58d1bd5d7c26701f29f656261e8c2e7d5ae97b224293ac133b2cbee65401f8d256d5106c14da8c837ff48f2479432d5addda274e72ef5810fc3a42ef9b27e75c89bc4d72d6670f855f228609eadf8dda76ade9804c642b140117fce06bc441cf92429d2d3b03bee775c1a52dc409fa4e7a5d3e39f9d9a250a288a29c9de6abfd0303f676a98025a7954fcaf6406d765a260e08ae5948326173f44f2d7cfb5ca9777221f0c984699a9cd1d20c9dedda95b8f066736b372d23116fffd55f7b03d4c7f63a8be3e7806718fa6a961a68db681edbdeb4281c0901c2ecc895f9da0cb04cbb03b5f1323e00c827dafd4d42ff767ffb7531e412d5ce11e0dc469f7bd87549ecab2ed21ee8deb164f67e64bfcd85d858f79c20c8bd4c37d7be76ad6d3c040a3a27c13f70f14b895178ccb02858764e315158ef6cdb827b69dcb24a3f54c2816a75be64496c139d541302b0b71849fdd92e0b83d TAG: d8f838951f98deb27747a870cf55713f KEY: 4a78b60c327676e4ca2ac1ab5333899dedfc91f66f4f8ed83130f197a6f35def NONCE: 3e8e2c6598e6c0a8ee6b0da0 IN: 1dcf6d8aa5fab8310cae71d02d2ebbbff4fbbada8a7db0725cb2e20723d2a3e5471d05b2319f571ae68ec953f26ddc167b8fe8bd801d6c58730f4dddc6c94bdb1e6d1e0f11b6d59e28f145e75a3b4d7aea2f78eec4677c8be45307910c67ecc10fed65ce585c6addf789ce485033d82e745f91472b7103370b162bc60504dab311ddc428b141c105e9343c2cd7527e43baf01b9bfb4e1b85918bd596696b2353425d03941d9a5aa6d72c57f1c42175b4120269551db41dec9b893d24d76a503f13ac1095ff824b0c3f7836e8b934b112440fb8157d35cf92c196de10fed9046722f83ad58546c9b27b9cb6e853dfffd89ab7724e140c0f1326302cb2224f587e6c7f27111e97ecc0dcc7d89a88e133970a22e4aacb12ce388393bed30d263ed1c080c1d56b0777e7ce2ce19a6b8db174aced748f71fbd52dfd415ef6fecba1e4ca7f207757967b3a6ad1c2e9f7c6a58ddae8555205e5c6bf64b209bee6372f196682db52dfbb37440be658d1398659a3b779843c381c5673c4eb97ce0133597c5667fd183a78e5daf15c56ad726f6d368dcf37ea737af668ca7131d4027b6260c748822e7a387b611ccb6edc4860fc4302493e66651772a39f5c98f46da64a9b1219babdc1cf6ef4c6557ced9b85ff3b918053dac001fbdcceef7485953527e1181670e62886f46371d2714f39851c1fe09297c8c69dff0e62be3383bb6aceea0cbc71cc7783cd1fac364236fecd9fd8aaf59de7680afcf90de01e9adeae58c034c25c8ed25b58e82e4fdcdcc2e69d1054dc753425e98cd50644eb74b1b6d62c769b61bf74d41a319eb35878bc837bac60af425c0a36b150655ac82f8e8fd61121790a3bb9389e121ed0fbb061cd593603a763e0b8ecb357b5c453b20239ad2e44ee0ef0e4cb717db95613c3be18aab77c708f5e91af8006e11b6ddebb8b0ef98c06dc3c97d008e058bf3e534582c24a1485f68214cdd88167814802c89d5c07a7453aff1010d6db0b778d9d8fc64b5bf3bb84cb97cef38a4b30a7deee12f0af806833c8c6d35a7f995b414eb0d9a900e3e56afaf2dd0d162063c4dd52bc6ffa56cfece2ed90bc7c9f4276459c9bd128ee40a5aa514de786ec15d04a16adddd64c7613ec9eed738fd36e24fbcbdcd0d3318fab948f47314a5400d71c5ee07a8c1fa17e4a4c08f4a467291cec1e8266342a42646d138331b08498f2dc3fda0374ef736d05c2a363fe08dc71ec799f0256ac9114743f40641ed8d9a039c57cd409bff29bde518657cb305a875cc6c0a58fe9ea3452df3e3802cf316a0c1f477179f6cdcb39c7c9424c07997500989a600887dd9f04c92226df10e9a8301818a5ec2f0b7b06b6d1443dec46f478a9271498b956b72060dd2b3021b004358b AD: 7eb6a083ff2facc3e9500278352790ccb6f9df67dccf7a03c33a34c6f33c1b4dc4ced2d5f69e5f68e79c582bf0db7751b774019d9399329f1a6692c5c527a646c9bb866e69d4f1ba4e6065cf0c5b09e941c5bb6e96d7edcb19a5cc02411507701b65987dc206ffbfaba4f06cf394976bdde1ac343e368ec1083813417cd0a325aa0e88913958974fcc911478a460b79b9978e33b21064ffdc1fc4df1e314948df71af9a6e0a40907e6b35ec6304bcaada85b456298637b6fa582ef331e2815fef135dcb66870107b2149c5aaa790f7127c0f0819b83bec46c0f6d30edb61b6fdf4f35f4b5345f1c684f41eed8088aa2f1d42c920a06092058e7c225d10fe1e5befb4dc593badee754fa12b843a6e9f67ea0e0616eaca697b22f526fb79a2ec259076971185678aaebc6449ba3bd284230ee621bc02ef1f5ff23651a6116cbb7770ec7385a44f4d54e7cb04aecd59a99660a1021eb6abb5d2cffd76e6e7380c22d0224e499e0c7b69aa0e7dd6deb47b22b1f1fb882dc35eb944a495fc3f6345b08da8f7185c3be95952bd7c982d9c8b2410a1cf1f5164961f6d1db6160d252e631f77b02d4e23dcd655e7e875b9b703fd27c57008184772c73fb5dc626ba43f54cbdc2937de7b4c470235098cb0a3e699baaa8e2adc09f8182ae1f168aa86a790688795003c3598293ca269a944 CT: ac837bdf77bb97a1bac4cdde49ef8d6c7024f5f25a7bdcf924fa87b0c77ddd66bdb67c9b8798922f5378c0405be67d5da47f7c245c5f7330accaf74d5bec6a8667c911384d9c77e9d3ca38d88bf87deaca62b58d092bbabe64895b944fa9f6bca0aa17a55031fa19ab0c324948816c57f67adf84077b277e71a7db9a6ac537a95e54d3cd4c9517bcdb7e9e1ccc8e7dc252c27c89b9c20c9876ce7c01b17b80a05c6f75006cdd1e081ade6f9353c66f7113613a5f72d82dd28a65efb74d0d1c92793d652edf23bf7c70f6dcfd5d40b2799b60c2a6fb53beb02571c78001381fc97d4a9292a0eb7a4a0a67cdf20b4810aebe5aa4a6d20fc30e2971924a09f106d0b5b7fcf181321b6f8442f91fb7ff3b5610353500b9d6f8a36301e7cb12d94d1aab6ec0f797fdb57232c02d5fb4b2ffc7d0cd2336ff96a4a811cd1aa02248f4a48c7646591507f9e02f8f441cacee92b5bb3cfcb7a5dbb02993d0fb1818e0ec4cb719a6b43d82e15ce576f95912ebeac7a7aa377a50d1190799b00a6da2fe7cd7231c3fecfd4e6913df0b46887ae8412cd2c9de49ad7a4e8f55e7f53239649b566c4940db50e0ba9a915acbdf0ed97905b0c70930d49c5c31cb398fa4f52222d3cdbd9374ae9d7d979991fa50a2cefeee88b3943578f99b9a46e58900378ef22880c862103ab7e0c2066685571b28c3407cfef5bc0c9b176be8dacf6130bbc44389aac32cd0011aaedcb752e16a1f99838030f7364c17441de87d5ec670a25a2b55a77a57f2304233b3d9d1f4c7b145e7e145eb8607f2d9b6159e954f14b02609830fe54ce1a7dab775b49d77a0ed503773c81e3c53f50e0cb676387dec6e506494ea7843fe533aa7f09dd1d4c960dca585a1590035a9c36cc9f821b4a8aaff6548fddce5250efc4211b0ad0ad4dbc3dc5038218e58851da4848f399f8d7938da211484139000dbf8b6c6314312586311ca1d8639fcdbb20b6a6a608c23027eb46938cd6bb869ea2d3b327728f31012de124a9b57dc96d5d98154b98045943a24e4f788e48bbcf0dc20598fb91627f09495c8fd5bce762b1193fdcf9c45174005d589ba6ad971b5d7ee13e1aab89447a14f9d750621184cdf55ef4ac2f7fedd7b8fe89e0fefb4382ea18cc4feb62e9650e9ba5a12f9366584ec774f5aa09793293b558293991de7fd1793bc44341a5b59cdb45095d5b53a4b847512dd2ea621f9778b4c0f33cb7bdbee1061505f08f1f2919cafc5d6e45206cc35e89e1d366b7abfff3da64f6cfc0d0b855bf5d425a85d93ecb01186697f60a7a47870ee2a6a50cdf134a67a51565d28974dbaa9c62ffc960b70fcdadf79dc489741095ef3052df69c55b99c95a44728d30e267a02922c7a6ef2523ec379239a5148eef6 TAG: 09a43ea9d67cec2b3f35d401141af9a8 KEY: 94f159c5d19a22469924c5fbfd198b8add28b37cf7bc3258fb4b906f2ecd672f NONCE: 4fe1fd1359a4332402251d90 IN: b2e081fc4457b3387c1033affd15747b79dad1d6d3b69c076d4dc5c209ba1cdd383a5196fc21fbc49fc65c69b85ec299b1daa26a4bd2e5ec2559cb230b21c3bb62e2831830a2b86da2abaa289d98eb04eaf3cf8d583ffc7291c3201df2c09b7d900a4bce0972e390fc980eb67cfe654ba3b9c579f997e319496b57819b36dd2b4484b88ea3cc1ba777b10ecaf526a08afd9e2b3b32b2bc02932af5d09c2ee3fdcfa18d6261808e418c4bb80be4315a5581d405841341bf2775d8d0adc21c10b9ffdc0ea4b22e22f61b46f844d8caeda0aeb7e1c3f84d337898af24fa68d60e2f19ff815713e1587e0d6e68d64cd088ed432c45637e1767913343d899b2f8c01bdb83253219878a5b3a4e6166e02387124e711a56e49da1893b4f72198c6339943262cdfccba33428009dff70a0c8c79af248d081ca04edb2ad4f35ed1819f0846dfade107c7e9f4094c014087c719517d943e524b86047d24aef8b901a7b1ec4e839400b717e758520cfc7a2dbced0ef491eef6aa2695b2ab9a92296b6e75251f124168c36a6555c4a465cf84a7b36f3277859dd5bb0f10f84cbc944b87e37b6b8ff6958bf1f0546839effd30995853c734a11c062414fe841113d0ae62597cd12ef80dbd4dc4f72e065171c8394e45dc6f87c86154e9846c1eb58f560b8c503848eacf05107c445a6a06420e67e2297a9975d23a406f8b8ee46d958d10d8724d90bb26e2b38be1c0e8258de3a09541826486ad28af8f2fa8c7befc95510589baf81a88f3823e87eaa8e40759cf0853547301de1e87b2eeccd76967bb364278174823c1cb1963f34fab537915031cead844dbb1c614eda56e9952b1eb4cb153d06c59c8da3b10af499b1c15ab0f03559fea13b81bd35fa5eb9a5431e12ab87c3c094861154d3d8eda448af7e15017103ad3dc7e9991b10cbe61cb33d2ff90121f4e40bd5d9e9c34b89679b6e1b54e38f00b128093af3e4ca9830a1a4d7a5e9db067c9c51fa26232945fa3e1e31e28c5000e1965cc7aa11a051305e68be9d60fb92f46eb2b701b3f959819f525ebefd5339bebfb64636d680a2a4f32afce85e287f8936bf62676c37ba810754186e30b812b1196e8661e345fb5b09b8dbe5f96e0010c5e3dd0a4e983149f4a058437cd46e3b32ca04c51ae3a4a39a7e15768a8fc379563450c616a5c7d7d98c46c0b934c894727532a9e713d330d294a2753f0f46049c88eed68711e9c49632144d5cb14d76848a6f7741d36c969edecdde52cbfb57a628678d31befa7ae3198343deae760d5c92c31f3c045b3e932e9051cd201d2dae66ca0368b94445d662acd6442c39eb945c8a4b46129a8cf5bbb2b27927729406f9b081695ce148a10226bc345c648fe557b7f8db4604fd0704831e5bdef6694afe716ddc3a8d69ccad4113 AD: ebe1684346b493db264417cde9c0e48db46aed1984f72903e94b72cc2b2f151fec80b32523f96f61485f026d63734ff80015a1cad4b21ed1ba057627b387eaecdfc6d7a195b7d46e485bc137726d96c4ba51e1656c3f234174759ad922f3493077d65c149d1e871855490b6fa5924f6270cf15920838b66e3250a99ff7a55ecc9944cf3fd204081a61ce05bb989e5abeae4b2f24801e7f2223d5ce05c2b61f32344a0370c22751293bb898061ff50d6364ea0275bece795be21c9dc0b2749ff68a6d15896d4692474bd46fb256d1d012e45e7a58d880fba240ac6b89d2087da1ff7d41df44c768fee5bdf51f36b090bbf85e7ecb69f61312463eb0b4b1a04a153f593f8d43f62ac96f76e13ab5928147c5e63788bba4f076d12eb6dd15842e2c40fc9f1ad5dcb80bd95d9d41222953776b3304badd650afc783b7342196ab551a474579d95f826f53d15b96ac98a10c2c6d50a7b9b947cda9fb8d8d7dc7def72c5283a93112d2b58487a25debc9ca06946bb0a52a1e4ed3bcf0fb8decae49fa6607c55501f01b7441671f08c814023f7d46f4bc596d709d305ce320b1b0160bf35c8f17622c65b8e5c97b3fe7327e8e22384f6c400e551dd438d6d3d0f9ba6101abd1bc2486ba249b4cc83c47982c1210328968f2b28e4a7c4880d598d5b47aca2093965622ba7b4e4062c86d81070ecaad93d5e47ec CT: c5311b1a6e3d93da070ee0fc2c1007558db64bfdabdc23c832d151472513482314e7d9385918abe772970c7d8b3ae4eb0d12965e6d7f6d01f6c97d06b51d3be812dfb290592578713ed6342a690ac115c29d471826f37f7f7b46936ab9f431cc0e4029579036bc6311574205810fecd3a17ebccd0f15752152276d5169b48b0a4fa93613fde13997517956f84500edd7eac1082ab6b69bf43f56fb9046cefe8425140db5f6bd3bb201b3345b2138c7f42120a3009ccc19e2d95ddb2b4384205d2aecb47c89cb43fab6c353f781caafae280e93dff5bd213640c41cfcd81b9dfd1be05ce21758c5474c38bd24819e5d085241dd54c8d2cbb5b21a616e47c05d4c64c0f397fc16d52d008fe4e83c040a6304c41a448784fb0c54f8a66fb00b240b9d66e8db234d14534dcdd6b3ba78db0403cf0219406ca858fef6bcb259fb69c53c6f964f450bcd12997955d0190ccbb2d9ae6b3562d85dc7de2bf1bd5a8d49651fe5de73243d7f89ac8796387e0a04c74d5834e47afb6b7444df7d27592fbfdeca72428582703ae52aab48c1b587b12fad6c887e451a54ef81481e3d8b4da1e3fc09404a7c209db8c880c40b3fedc579fdf19f956bfb36d5b2d1affa0a3631681084ae4e41e3a0fed84e056bc72b6c0eb1f5449935f7c2d3de07a2a5fb65af65f91d2c1d730edb80b437cba66fea779449b68c557c5f8bc6a2581b6808a98a1acb9e6de414377f5b08fd5cfeb4806e8699e50236dc8100a88f4f55d887caaa6ae8ca09c23019126b62b5c3186b459c39ee397076c825b6e28ab62d8286743f9d07182cfc634eb4512ec3beb04ba81bc20294b16fb6d42301a74fa95f95510155a15eb953eaa51d82fc363c0c63d1cf401a3ccc0c577474f99f7c4f187316fb85e1db38dac1df4b5e7c710be5b5949dbb1925723d042944eac09dbfd74d7e876f5931f619bfba1ea9580bf4e6c2540fd68d5aa9cd21203ba207f0f62e325c1e054271933563063acb4d932eef201bf3312763dddf6992fbd128cb8fc8b7936acbe8712ad398c5a8719b9efbe0927b9f637f323c4bea80901091608ab76e483b5ef666560937705bff96d430e6e17b0b24c755de19bb88aa81077852c92a96e902d538b4e11b78a4b5d1f5669aacdfe5125d806a21c06ccf4980edee24e41b7e17672fed0ace9b19e4d55415d097f0b5874d60dbe311871abaf47220893c398d5595ee16275eecc6d15f39aa5e2181ad1448345406a4c77a34c3fac77b4c506cf393791d69e113270adf0393cad689a07056e388ea3bbd00ee5878e1120c869531a8b4745ca2debc1e008493d17bb3777992cfcaa165188b4801122af5422acfa0a1807a2a35e793ebdd95aa9e025edc065cf9ae85972a5f42da193cd9b653373a6e15d647b8d26207f3230e50bb49 TAG: e2df8917d70683fb6e6ea67db55367b0 KEY: e22480e24a29b2910b227930344f6a00916bb215e57e1f3155fa9437603fabc6 NONCE: a4c6732e0887f40b5017de54 IN: e46035c45b6ebf14c5088c5f15f552a4d233de7d3750d7736838a5cd4a7b41df1b71e6c5e6a7dc63519ec43bcb4fc603168352b8b8e261c15e76e73556aaffa32193c1f5641b2eab29497c80eb06543c1b0f1787bc616a4e6618f751dd0a2b28a87fcabf405e97efa91becc8ac1b036a2ca244e13dcbae589f0d6bf8e19bf91caff673f2a80de93a6fd5da1e63516e2760ca12a64c8175071de22b26ce72ff9e15e5c55fb253cae55a3f48c0b507bfd423f66ebdecd0b6227d0e67c4347f2a4819a6825dfc2651e97c1da629e92bed3827a15dec0f0c8743731baef8035fb0a790f49e5b2a7339485df313a9633496fd9e7a9904ec566bf20b8dbc0e3c1e4572411da7835b5eb5cd51313b78a1d6ed96bd9aff2fba37e86d475d95fd7e14c6fe8ab23645b15e7823b7bc9d0a02fbd9a43c05a6c660b6690891c4d055af21b50a5500d72c91695536eb1a3852caceae05803486c64535747df691ebc62e888bce8a5c820569b3d80edb4e29027e737fcdc4f49f6eae43b4bf68a5731fbd09778d6b205bd8b3ab4cf251ff31dd94f2033118ff0c4154c78af27570d12def873fcf4de7ccb6b6cc8924dc63f8104e9a3323ddd32006d8ec3aa530818e299490dfa0a9d811fb3bbb5f624f26dd7d0d7a87a7e7748af5ee4f4bbeb150ea4078b504aadaf92b8f9edfb701c6df7ca615416f61bd770d5fc6675db01394a26f585ffb8f86b254d0e08d0a0f5a499ef1b2bb0216e486229f5deb16d1e95332b8673652a86a6e3fa0e479987b2bdb1909fb772c6836d15cc57d97f29acf335ec1873c1bc6e714b689db855c8ba59289fe792d93774dd83313e3fdf11bfd6a40d6c8b57a5989e844cdf2fb38c239f6116c1c3aafb9356ad4b07ab37f7fb089cd424a8c1f19e5a13f085ec8cd74c3c9f0aefccd6fe5340eb1e419d15285b6b0d3b57a5545f6e28b75bf4795d995a20dc7a618f0f77a174e3eaafe221f8da0cb071473c507054243a7f9eee7d5c77b071602936fd5bc411e9923fc82016cf5345454285e9c1396696e05d984649a2955d7446a1d3966adda11bddbf3dbc11e093c15b7d4fa2a7a0c33fa28dd3242738d7a77775cbeb8176a6e9a4e4e58e03f631a67c3229d57302fe5967c7e3362ff926fd584edc32905a350b390391f7fc3343f22498bd198ad56cc2827926b0c4700cc352bb990876db7c17e2d32b5b0af617554a1f76c32b94cf7728e89bc208f22e986e7d2faef190f820918afa4e08cc46adf0704aab761cbb9791aa12eb31a7785d7716c3f0a46afbe2a44a52e5d0944fbe207ac78d54c407679814cc03d9c9ea28f1e518a10e0cf034d1ffa27b67c9f027d738e0a96a381571bb52afe2e983b34f9159f05d4ac9973d996c4612b7c60407a66925068fd98ba6b7742a219d8bed4ceb720a8541f4cd9eb990384f8f8698515ed3692 AD: 8eb26d00d61388ca0f06d45cd697e36f11e25f618eaee0562dbba21d10abfd0bbfe232e6efca4947adfa7fc59de529652d11847d3cca84ad147f8905bfd0743be43cd21a9ece92d2d7397f74b1632ec2b1e398565e3f37039f1e147c061b51d59eb31bd16bf830b7824d1ec5e79441e5c5e5131062171467a037c350fd16f58854e3dfd9c1224d26fd600b006d4bcae123a7a9d4e98c47b9e9e3fdbc22abce09b3c24a5a060e371ee70110227c9a8b6049f194dc4f74cc97d01247d76b460774acf7c5d4a8fb4f01888e29ffc517839c234836cf513951435f226e635ff8b02b18225402b026566e951449023fcf7f6bc2285dac1b7dd83028697dac70927db01c22921f6a7a6304052e58c8e87819bbb75de9cbe6239cb1ae8fd4849eb4f48759aed59d5a0ec3108b3131b0b74a4f860e37d02e04b9501e5e3c306cb25820abc50cdfbb05f8e5e2d2b94c58190c5d950f804786fb2ef97eb013f6f049b38fc57561b9cdfce5ae30516050d13d0ad8c1d750b51a552520785a9dd03c68203d91e72e3bab17cd67989bd103532071676718e889b94ee12856547a6d0a6c88c236d7fc7b0d8f222592d00aad4e813f8c738bc10c0b1fbf23bdb2baa56b1047348ed172a15dffd0bab088e2b406f040ef81d3362d0f86d129fde70ffaf87ef3c4554fa43850d1816407b4d5b0459bc622414a2d9cf2809e60e467fde6ecb7f4d9 CT: 98763c2423882eb5a1e9075920b2245f2243341f6dd2dceae7780aa738fab65c7d86f41dd4a64283752db5e86cecaed0ac1afe966171e94f2c30d63a93ff11343ce15ff3bf464d88a6912fbba42c08e6225cfaa63c6da17a6354a34362fda3d993920050dfb99c84a235726aa4cbd66260b0e5675bfe89078e33e76ef537d2071d5801758c6cf07557c0e8bfe0a49aa6e212d69617d1a22ff15a26ae28f4d724d6b537ed34af62672cc9d48836f284cbc7eaae8cd15b46b8e233c94bf3036713f2679e23e0bd829dde5b3a5d7a2d65193f55a45def3d52830cfb1ce3f8208c1425d8171a053ab076c2377f7c26b37970bc3c937db75181a47467b9735be331a0f30a7f3ae135a533153ecd0a5e0cc1568e303a6ba6065c0dca8162a33df7c5b69542938c88e2141e2aa697c48e72ec0573065e9d9a9945cfd070d45218f646e5cf0c0ba145ed1fc7b7cf96c64e3a4671eb6b51ac8eb79bf0b4abd56fffa2ad8a93c001e2baf0b65e257782d7b7e3a837cbae16d40183a8b629467f77f2c7f8640da57904ab75a642e99fe4b45ba7ee488f889b07ce7a4e74540c3e0e0e67f88d473509295a66e27d4ebda1d4d3313add2555477aebf7fb84edbfdba18afc6f04c4af6a90730518a8ce28c12ab90921c413bb822e63cae113e5254039cdcad2dbfecfd97c183679c6c4691c99ba771b1389384259b966f358f871343b4bc5f9a92d8f27588202ae1269658ed91bae33deec6a6a35b9fbc523cc11cbc15024f4dd386b8f41c3fc7097d717099e722e6243a13bc475d5f2b1b2569f14cae6710c8650bfd78520caeceb035f58adae811c0fe9857c8cec59a01123e5eb2774190943c2cc7d535af77ea1f79cdce94e23de21004c73fb8469c230e25fe245c8a5a6314736166a7fe4e1bb0f91ee8d60daa0e576b9b7c6b5957d4bd8d8b928d36aa46fbdf742dd602f9cda2ed1608255d6dc962cc6d3f270d6a42f5185b38e6f0085f39dd17260f0580b62d49cdb668e3e5f76d47dd1deaba0db5b315ed6deb62e6e4388a74ff21903d7bed3c3e87585675a608668bc031aa83e7546cee77bacf9d3f5cbcf00ca71d6f6c86751a5db0d7f7065324d33458b7fe66e2b63bf9d8b514006d14da70f0d64f171a7bc11b2fa5955b85090701260a13cb52b930681e10e9daf89bdffacb9c13b9b60319e3be0ed29f7b7d4723ac5af888375c9e23bc97d3b189ec778eaefb3e4649d1b1ea96979c8f004064abefdfb3479e924dd974ff6478beb1034124b1cf27fc739872bd24bf257df2068475f0b144e61411481a48739e2691e535b64066acce2e0fee9c239c4015014dd38570b01646bbe97a389a3604312f06bcf7ae288790b73434288ba0c90d7015bc1bbcd5a0fe84564cd6a692df04d53716bb96d769074d758bf1199f716cfe5c4c542f9852435fc9675a80b4d TAG: 9f62d794a54433e79c71a5a5cc8d282e # Counter wrapping tests KEY: 0000000000000000000000000000000000000000000000000000000000000000 NONCE: 000000000000000000000000 IN: 000000000000000000000000000000004db923dc793ee6497c76dcc03a98e108 AD: CT: f3f80f2cf0cb2dd9c5984fcda908456cc537703b5ba70324a6793a7bf218d3ea TAG: ffffffff000000000000000000000000 KEY: 0000000000000000000000000000000000000000000000000000000000000000 NONCE: 000000000000000000000000 IN: eb3640277c7ffd1303c7a542d02d3e4c0000000000000000 AD: CT: 18ce4f0b8cb4d0cac65fea8f79257b20888e53e72299e56d TAG: ffffffff000000000000000000000000 ring-0.16.9/crypto/constant_time_test.c000064400000000000000000000104261352416253600163400ustar0000000000000000/* * Utilities for constant-time cryptography. * * Author: Emilia Kasper (emilia@openssl.org) * Based on previous work by Bodo Moeller, Emilia Kasper, Adam Langley * (Google). * ==================================================================== * Copyright (c) 2014 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "internal.h" int bssl_constant_time_test_main(void); static int test_binary_op_w(crypto_word (*op)(crypto_word a, crypto_word b), crypto_word a, crypto_word b, int is_true) { crypto_word c = op(a, b); if (is_true && c != CONSTTIME_TRUE_W) { return 1; } else if (!is_true && c != CONSTTIME_FALSE_W) { return 1; } return 0; } static int test_is_zero_w(crypto_word a) { crypto_word c = constant_time_is_zero_w(a); if (a == 0 && c != CONSTTIME_TRUE_W) { return 1; } else if (a != 0 && c != CONSTTIME_FALSE_W) { return 1; } c = constant_time_is_nonzero_w(a); if (a == 0 && c != CONSTTIME_FALSE_W) { return 1; } else if (a != 0 && c != CONSTTIME_TRUE_W) { return 1; } return 0; } static int test_select_w(crypto_word a, crypto_word b) { crypto_word selected = constant_time_select_w(CONSTTIME_TRUE_W, a, b); if (selected != a) { return 1; } selected = constant_time_select_w(CONSTTIME_FALSE_W, a, b); if (selected != b) { return 1; } return 0; } static crypto_word test_values_s[] = { 0, 1, 1024, 12345, 32000, #if defined(OPENSSL_64_BIT) 0xffffffff / 2 - 1, 0xffffffff / 2, 0xffffffff / 2 + 1, 0xffffffff - 1, 0xffffffff, #endif SIZE_MAX / 2 - 1, SIZE_MAX / 2, SIZE_MAX / 2 + 1, SIZE_MAX - 1, SIZE_MAX }; int bssl_constant_time_test_main(void) { int num_failed = 0; for (size_t i = 0; i < sizeof(test_values_s) / sizeof(test_values_s[0]); ++i) { crypto_word a = test_values_s[i]; num_failed += test_is_zero_w(a); for (size_t j = 0; j < sizeof(test_values_s) / sizeof(test_values_s[0]); ++j) { crypto_word b = test_values_s[j]; num_failed += test_binary_op_w(&constant_time_eq_w, a, b, a == b); num_failed += test_binary_op_w(&constant_time_eq_w, b, a, b == a); num_failed += test_select_w(a, b); } } return num_failed == 0; } ring-0.16.9/crypto/cpu-intel.c000064400000000000000000000171371353036607100143350ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include #if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_X86) || defined(OPENSSL_X86_64)) #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(push, 3) #include #include #pragma warning(pop) #endif #include "internal.h" // OPENSSL_cpuid runs the cpuid instruction. |leaf| is passed in as EAX and ECX // is set to zero. It writes EAX, EBX, ECX, and EDX to |*out_eax| through // |*out_edx|. static void OPENSSL_cpuid(uint32_t *out_eax, uint32_t *out_ebx, uint32_t *out_ecx, uint32_t *out_edx, uint32_t leaf) { #if defined(_MSC_VER) && !defined(__clang__) int tmp[4]; __cpuid(tmp, (int)leaf); *out_eax = (uint32_t)tmp[0]; *out_ebx = (uint32_t)tmp[1]; *out_ecx = (uint32_t)tmp[2]; *out_edx = (uint32_t)tmp[3]; #elif defined(__pic__) && defined(OPENSSL_32_BIT) // Inline assembly may not clobber the PIC register. For 32-bit, this is EBX. // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47602. __asm__ volatile ( "xor %%ecx, %%ecx\n" "mov %%ebx, %%edi\n" "cpuid\n" "xchg %%edi, %%ebx\n" : "=a"(*out_eax), "=D"(*out_ebx), "=c"(*out_ecx), "=d"(*out_edx) : "a"(leaf) ); #else __asm__ volatile ( "xor %%ecx, %%ecx\n" "cpuid\n" : "=a"(*out_eax), "=b"(*out_ebx), "=c"(*out_ecx), "=d"(*out_edx) : "a"(leaf) ); #endif } // OPENSSL_xgetbv returns the value of an Intel Extended Control Register (XCR). // Currently only XCR0 is defined by Intel so |xcr| should always be zero. // // See https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family static uint64_t OPENSSL_xgetbv(uint32_t xcr) { #if defined(_MSC_VER) && !defined(__clang__) return (uint64_t)_xgetbv(xcr); #else uint32_t eax, edx; __asm__ volatile ("xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr)); return (((uint64_t)edx) << 32) | eax; #endif } void GFp_cpuid_setup(void) { // Determine the vendor and maximum input value. uint32_t eax, ebx, ecx, edx; OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 0); uint32_t num_ids = eax; int is_intel = ebx == 0x756e6547 /* Genu */ && edx == 0x49656e69 /* ineI */ && ecx == 0x6c65746e /* ntel */; uint32_t extended_features[2] = {0}; if (num_ids >= 7) { OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 7); extended_features[0] = ebx; extended_features[1] = ecx; } OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 1); // Force the hyper-threading bit so that the more conservative path is always // chosen. edx |= 1u << 28; // Reserved bit #20 was historically repurposed to control the in-memory // representation of RC4 state. Always set it to zero. edx &= ~(1u << 20); // Reserved bit #30 is repurposed to signal an Intel CPU. if (is_intel) { edx |= (1u << 30); // Clear the XSAVE bit on Knights Landing to mimic Silvermont. This enables // some Silvermont-specific codepaths which perform better. See OpenSSL // commit 64d92d74985ebb3d0be58a9718f9e080a14a8e7f. if ((eax & 0x0fff0ff0) == 0x00050670 /* Knights Landing */ || (eax & 0x0fff0ff0) == 0x00080650 /* Knights Mill (per SDE) */) { ecx &= ~(1u << 26); } } else { edx &= ~(1u << 30); } // The SDBG bit is repurposed to denote AMD XOP support. Don't ever use AMD // XOP code paths. ecx &= ~(1u << 11); uint64_t xcr0 = 0; if (ecx & (1u << 27)) { // XCR0 may only be queried if the OSXSAVE bit is set. xcr0 = OPENSSL_xgetbv(0); } // See Intel manual, volume 1, section 14.3. if ((xcr0 & 6) != 6) { // YMM registers cannot be used. ecx &= ~(1u << 28); // AVX ecx &= ~(1u << 12); // FMA ecx &= ~(1u << 11); // AMD XOP // Clear AVX2 and AVX512* bits. // // TODO(davidben): Should bits 17 and 26-28 also be cleared? Upstream // doesn't clear those. extended_features[0] &= ~((1u << 5) | (1u << 16) | (1u << 21) | (1u << 30) | (1u << 31)); } // See Intel manual, volume 1, section 15.2. if ((xcr0 & 0xe6) != 0xe6) { // Clear AVX512F. Note we don't touch other AVX512 extensions because they // can be used with YMM. extended_features[0] &= ~(1u << 16); } // Disable ADX instructions on Knights Landing. See OpenSSL commit // 64d92d74985ebb3d0be58a9718f9e080a14a8e7f. if ((ecx & (1u << 26)) == 0) { extended_features[0] &= ~(1u << 19); } GFp_ia32cap_P[0] = edx; GFp_ia32cap_P[1] = ecx; GFp_ia32cap_P[2] = extended_features[0]; GFp_ia32cap_P[3] = extended_features[1]; } #endif // !OPENSSL_NO_ASM && (OPENSSL_X86 || OPENSSL_X86_64) ring-0.16.9/crypto/crypto.c000064400000000000000000000034661352416253600137600ustar0000000000000000/* Copyright (c) 2014, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include "internal.h" // Our assembly does not use the GOT to reference symbols, which means // references to visible symbols will often require a TEXTREL. This is // undesirable, so all assembly-referenced symbols should be hidden. CPU // capabilities are the only such symbols defined in C. Explicitly hide them, // rather than rely on being built with -fvisibility=hidden. #if defined(OPENSSL_WINDOWS) #define HIDDEN #else #define HIDDEN __attribute__((visibility("hidden"))) #endif #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) // This value must be explicitly initialised to zero in order to work around a // bug in libtool or the linker on OS X. // // If not initialised then it becomes a "common symbol". When put into an // archive, linking on OS X will fail to resolve common symbols. By // initialising it to zero, it becomes a "data symbol", which isn't so // affected. HIDDEN uint32_t GFp_ia32cap_P[4] = {0}; #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) #include HIDDEN uint32_t GFp_armcap_P = 0; #endif ring-0.16.9/crypto/curve25519/asm/x25519-asm-arm.S000064400000000000000000001215141353036607100171320ustar0000000000000000/* Copyright (c) 2015, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* This file is taken from crypto_scalarmult/curve25519/neon2/scalarmult.s in * SUPERCOP 20141124 (http://bench.cr.yp.to/supercop.html). That code is public * domain licensed but the standard ISC license is included above to keep * licensing simple. */ #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) && defined(__arm__) && !defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif .fpu neon .text .align 4 .global GFp_x25519_NEON .hidden GFp_x25519_NEON .type GFp_x25519_NEON, %function GFp_x25519_NEON: vpush {q4,q5,q6,q7} mov r12,sp sub sp,sp,#736 and sp,sp,#0xffffffe0 strd r4,[sp,#0] strd r6,[sp,#8] strd r8,[sp,#16] strd r10,[sp,#24] str r12,[sp,#480] str r14,[sp,#484] mov r0,r0 mov r1,r1 mov r2,r2 add r3,sp,#32 ldr r4,=0 ldr r5,=254 vmov.i32 q0,#1 vshr.u64 q1,q0,#7 vshr.u64 q0,q0,#8 vmov.i32 d4,#19 vmov.i32 d5,#38 add r6,sp,#512 vst1.8 {d2-d3},[r6,: 128] add r6,sp,#528 vst1.8 {d0-d1},[r6,: 128] add r6,sp,#544 vst1.8 {d4-d5},[r6,: 128] add r6,r3,#0 vmov.i32 q2,#0 vst1.8 {d4-d5},[r6,: 128]! vst1.8 {d4-d5},[r6,: 128]! vst1.8 d4,[r6,: 64] add r6,r3,#0 ldr r7,=960 sub r7,r7,#2 neg r7,r7 sub r7,r7,r7,LSL #7 str r7,[r6] add r6,sp,#704 vld1.8 {d4-d5},[r1]! vld1.8 {d6-d7},[r1] vst1.8 {d4-d5},[r6,: 128]! vst1.8 {d6-d7},[r6,: 128] sub r1,r6,#16 ldrb r6,[r1] and r6,r6,#248 strb r6,[r1] ldrb r6,[r1,#31] and r6,r6,#127 orr r6,r6,#64 strb r6,[r1,#31] vmov.i64 q2,#0xffffffff vshr.u64 q3,q2,#7 vshr.u64 q2,q2,#6 vld1.8 {d8},[r2] vld1.8 {d10},[r2] add r2,r2,#6 vld1.8 {d12},[r2] vld1.8 {d14},[r2] add r2,r2,#6 vld1.8 {d16},[r2] add r2,r2,#4 vld1.8 {d18},[r2] vld1.8 {d20},[r2] add r2,r2,#6 vld1.8 {d22},[r2] add r2,r2,#2 vld1.8 {d24},[r2] vld1.8 {d26},[r2] vshr.u64 q5,q5,#26 vshr.u64 q6,q6,#3 vshr.u64 q7,q7,#29 vshr.u64 q8,q8,#6 vshr.u64 q10,q10,#25 vshr.u64 q11,q11,#3 vshr.u64 q12,q12,#12 vshr.u64 q13,q13,#38 vand q4,q4,q2 vand q6,q6,q2 vand q8,q8,q2 vand q10,q10,q2 vand q2,q12,q2 vand q5,q5,q3 vand q7,q7,q3 vand q9,q9,q3 vand q11,q11,q3 vand q3,q13,q3 add r2,r3,#48 vadd.i64 q12,q4,q1 vadd.i64 q13,q10,q1 vshr.s64 q12,q12,#26 vshr.s64 q13,q13,#26 vadd.i64 q5,q5,q12 vshl.i64 q12,q12,#26 vadd.i64 q14,q5,q0 vadd.i64 q11,q11,q13 vshl.i64 q13,q13,#26 vadd.i64 q15,q11,q0 vsub.i64 q4,q4,q12 vshr.s64 q12,q14,#25 vsub.i64 q10,q10,q13 vshr.s64 q13,q15,#25 vadd.i64 q6,q6,q12 vshl.i64 q12,q12,#25 vadd.i64 q14,q6,q1 vadd.i64 q2,q2,q13 vsub.i64 q5,q5,q12 vshr.s64 q12,q14,#26 vshl.i64 q13,q13,#25 vadd.i64 q14,q2,q1 vadd.i64 q7,q7,q12 vshl.i64 q12,q12,#26 vadd.i64 q15,q7,q0 vsub.i64 q11,q11,q13 vshr.s64 q13,q14,#26 vsub.i64 q6,q6,q12 vshr.s64 q12,q15,#25 vadd.i64 q3,q3,q13 vshl.i64 q13,q13,#26 vadd.i64 q14,q3,q0 vadd.i64 q8,q8,q12 vshl.i64 q12,q12,#25 vadd.i64 q15,q8,q1 add r2,r2,#8 vsub.i64 q2,q2,q13 vshr.s64 q13,q14,#25 vsub.i64 q7,q7,q12 vshr.s64 q12,q15,#26 vadd.i64 q14,q13,q13 vadd.i64 q9,q9,q12 vtrn.32 d12,d14 vshl.i64 q12,q12,#26 vtrn.32 d13,d15 vadd.i64 q0,q9,q0 vadd.i64 q4,q4,q14 vst1.8 d12,[r2,: 64]! vshl.i64 q6,q13,#4 vsub.i64 q7,q8,q12 vshr.s64 q0,q0,#25 vadd.i64 q4,q4,q6 vadd.i64 q6,q10,q0 vshl.i64 q0,q0,#25 vadd.i64 q8,q6,q1 vadd.i64 q4,q4,q13 vshl.i64 q10,q13,#25 vadd.i64 q1,q4,q1 vsub.i64 q0,q9,q0 vshr.s64 q8,q8,#26 vsub.i64 q3,q3,q10 vtrn.32 d14,d0 vshr.s64 q1,q1,#26 vtrn.32 d15,d1 vadd.i64 q0,q11,q8 vst1.8 d14,[r2,: 64] vshl.i64 q7,q8,#26 vadd.i64 q5,q5,q1 vtrn.32 d4,d6 vshl.i64 q1,q1,#26 vtrn.32 d5,d7 vsub.i64 q3,q6,q7 add r2,r2,#16 vsub.i64 q1,q4,q1 vst1.8 d4,[r2,: 64] vtrn.32 d6,d0 vtrn.32 d7,d1 sub r2,r2,#8 vtrn.32 d2,d10 vtrn.32 d3,d11 vst1.8 d6,[r2,: 64] sub r2,r2,#24 vst1.8 d2,[r2,: 64] add r2,r3,#96 vmov.i32 q0,#0 vmov.i64 d2,#0xff vmov.i64 d3,#0 vshr.u32 q1,q1,#7 vst1.8 {d2-d3},[r2,: 128]! vst1.8 {d0-d1},[r2,: 128]! vst1.8 d0,[r2,: 64] add r2,r3,#144 vmov.i32 q0,#0 vst1.8 {d0-d1},[r2,: 128]! vst1.8 {d0-d1},[r2,: 128]! vst1.8 d0,[r2,: 64] add r2,r3,#240 vmov.i32 q0,#0 vmov.i64 d2,#0xff vmov.i64 d3,#0 vshr.u32 q1,q1,#7 vst1.8 {d2-d3},[r2,: 128]! vst1.8 {d0-d1},[r2,: 128]! vst1.8 d0,[r2,: 64] add r2,r3,#48 add r6,r3,#192 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d4},[r2,: 64] vst1.8 {d0-d1},[r6,: 128]! vst1.8 {d2-d3},[r6,: 128]! vst1.8 d4,[r6,: 64] ._mainloop: mov r2,r5,LSR #3 and r6,r5,#7 ldrb r2,[r1,r2] mov r2,r2,LSR r6 and r2,r2,#1 str r5,[sp,#488] eor r4,r4,r2 str r2,[sp,#492] neg r2,r4 add r4,r3,#96 add r5,r3,#192 add r6,r3,#144 vld1.8 {d8-d9},[r4,: 128]! add r7,r3,#240 vld1.8 {d10-d11},[r5,: 128]! veor q6,q4,q5 vld1.8 {d14-d15},[r6,: 128]! vdup.i32 q8,r2 vld1.8 {d18-d19},[r7,: 128]! veor q10,q7,q9 vld1.8 {d22-d23},[r4,: 128]! vand q6,q6,q8 vld1.8 {d24-d25},[r5,: 128]! vand q10,q10,q8 vld1.8 {d26-d27},[r6,: 128]! veor q4,q4,q6 vld1.8 {d28-d29},[r7,: 128]! veor q5,q5,q6 vld1.8 {d0},[r4,: 64] veor q6,q7,q10 vld1.8 {d2},[r5,: 64] veor q7,q9,q10 vld1.8 {d4},[r6,: 64] veor q9,q11,q12 vld1.8 {d6},[r7,: 64] veor q10,q0,q1 sub r2,r4,#32 vand q9,q9,q8 sub r4,r5,#32 vand q10,q10,q8 sub r5,r6,#32 veor q11,q11,q9 sub r6,r7,#32 veor q0,q0,q10 veor q9,q12,q9 veor q1,q1,q10 veor q10,q13,q14 veor q12,q2,q3 vand q10,q10,q8 vand q8,q12,q8 veor q12,q13,q10 veor q2,q2,q8 veor q10,q14,q10 veor q3,q3,q8 vadd.i32 q8,q4,q6 vsub.i32 q4,q4,q6 vst1.8 {d16-d17},[r2,: 128]! vadd.i32 q6,q11,q12 vst1.8 {d8-d9},[r5,: 128]! vsub.i32 q4,q11,q12 vst1.8 {d12-d13},[r2,: 128]! vadd.i32 q6,q0,q2 vst1.8 {d8-d9},[r5,: 128]! vsub.i32 q0,q0,q2 vst1.8 d12,[r2,: 64] vadd.i32 q2,q5,q7 vst1.8 d0,[r5,: 64] vsub.i32 q0,q5,q7 vst1.8 {d4-d5},[r4,: 128]! vadd.i32 q2,q9,q10 vst1.8 {d0-d1},[r6,: 128]! vsub.i32 q0,q9,q10 vst1.8 {d4-d5},[r4,: 128]! vadd.i32 q2,q1,q3 vst1.8 {d0-d1},[r6,: 128]! vsub.i32 q0,q1,q3 vst1.8 d4,[r4,: 64] vst1.8 d0,[r6,: 64] add r2,sp,#544 add r4,r3,#96 add r5,r3,#144 vld1.8 {d0-d1},[r2,: 128] vld1.8 {d2-d3},[r4,: 128]! vld1.8 {d4-d5},[r5,: 128]! vzip.i32 q1,q2 vld1.8 {d6-d7},[r4,: 128]! vld1.8 {d8-d9},[r5,: 128]! vshl.i32 q5,q1,#1 vzip.i32 q3,q4 vshl.i32 q6,q2,#1 vld1.8 {d14},[r4,: 64] vshl.i32 q8,q3,#1 vld1.8 {d15},[r5,: 64] vshl.i32 q9,q4,#1 vmul.i32 d21,d7,d1 vtrn.32 d14,d15 vmul.i32 q11,q4,q0 vmul.i32 q0,q7,q0 vmull.s32 q12,d2,d2 vmlal.s32 q12,d11,d1 vmlal.s32 q12,d12,d0 vmlal.s32 q12,d13,d23 vmlal.s32 q12,d16,d22 vmlal.s32 q12,d7,d21 vmull.s32 q10,d2,d11 vmlal.s32 q10,d4,d1 vmlal.s32 q10,d13,d0 vmlal.s32 q10,d6,d23 vmlal.s32 q10,d17,d22 vmull.s32 q13,d10,d4 vmlal.s32 q13,d11,d3 vmlal.s32 q13,d13,d1 vmlal.s32 q13,d16,d0 vmlal.s32 q13,d17,d23 vmlal.s32 q13,d8,d22 vmull.s32 q1,d10,d5 vmlal.s32 q1,d11,d4 vmlal.s32 q1,d6,d1 vmlal.s32 q1,d17,d0 vmlal.s32 q1,d8,d23 vmull.s32 q14,d10,d6 vmlal.s32 q14,d11,d13 vmlal.s32 q14,d4,d4 vmlal.s32 q14,d17,d1 vmlal.s32 q14,d18,d0 vmlal.s32 q14,d9,d23 vmull.s32 q11,d10,d7 vmlal.s32 q11,d11,d6 vmlal.s32 q11,d12,d5 vmlal.s32 q11,d8,d1 vmlal.s32 q11,d19,d0 vmull.s32 q15,d10,d8 vmlal.s32 q15,d11,d17 vmlal.s32 q15,d12,d6 vmlal.s32 q15,d13,d5 vmlal.s32 q15,d19,d1 vmlal.s32 q15,d14,d0 vmull.s32 q2,d10,d9 vmlal.s32 q2,d11,d8 vmlal.s32 q2,d12,d7 vmlal.s32 q2,d13,d6 vmlal.s32 q2,d14,d1 vmull.s32 q0,d15,d1 vmlal.s32 q0,d10,d14 vmlal.s32 q0,d11,d19 vmlal.s32 q0,d12,d8 vmlal.s32 q0,d13,d17 vmlal.s32 q0,d6,d6 add r2,sp,#512 vld1.8 {d18-d19},[r2,: 128] vmull.s32 q3,d16,d7 vmlal.s32 q3,d10,d15 vmlal.s32 q3,d11,d14 vmlal.s32 q3,d12,d9 vmlal.s32 q3,d13,d8 add r2,sp,#528 vld1.8 {d8-d9},[r2,: 128] vadd.i64 q5,q12,q9 vadd.i64 q6,q15,q9 vshr.s64 q5,q5,#26 vshr.s64 q6,q6,#26 vadd.i64 q7,q10,q5 vshl.i64 q5,q5,#26 vadd.i64 q8,q7,q4 vadd.i64 q2,q2,q6 vshl.i64 q6,q6,#26 vadd.i64 q10,q2,q4 vsub.i64 q5,q12,q5 vshr.s64 q8,q8,#25 vsub.i64 q6,q15,q6 vshr.s64 q10,q10,#25 vadd.i64 q12,q13,q8 vshl.i64 q8,q8,#25 vadd.i64 q13,q12,q9 vadd.i64 q0,q0,q10 vsub.i64 q7,q7,q8 vshr.s64 q8,q13,#26 vshl.i64 q10,q10,#25 vadd.i64 q13,q0,q9 vadd.i64 q1,q1,q8 vshl.i64 q8,q8,#26 vadd.i64 q15,q1,q4 vsub.i64 q2,q2,q10 vshr.s64 q10,q13,#26 vsub.i64 q8,q12,q8 vshr.s64 q12,q15,#25 vadd.i64 q3,q3,q10 vshl.i64 q10,q10,#26 vadd.i64 q13,q3,q4 vadd.i64 q14,q14,q12 add r2,r3,#288 vshl.i64 q12,q12,#25 add r4,r3,#336 vadd.i64 q15,q14,q9 add r2,r2,#8 vsub.i64 q0,q0,q10 add r4,r4,#8 vshr.s64 q10,q13,#25 vsub.i64 q1,q1,q12 vshr.s64 q12,q15,#26 vadd.i64 q13,q10,q10 vadd.i64 q11,q11,q12 vtrn.32 d16,d2 vshl.i64 q12,q12,#26 vtrn.32 d17,d3 vadd.i64 q1,q11,q4 vadd.i64 q4,q5,q13 vst1.8 d16,[r2,: 64]! vshl.i64 q5,q10,#4 vst1.8 d17,[r4,: 64]! vsub.i64 q8,q14,q12 vshr.s64 q1,q1,#25 vadd.i64 q4,q4,q5 vadd.i64 q5,q6,q1 vshl.i64 q1,q1,#25 vadd.i64 q6,q5,q9 vadd.i64 q4,q4,q10 vshl.i64 q10,q10,#25 vadd.i64 q9,q4,q9 vsub.i64 q1,q11,q1 vshr.s64 q6,q6,#26 vsub.i64 q3,q3,q10 vtrn.32 d16,d2 vshr.s64 q9,q9,#26 vtrn.32 d17,d3 vadd.i64 q1,q2,q6 vst1.8 d16,[r2,: 64] vshl.i64 q2,q6,#26 vst1.8 d17,[r4,: 64] vadd.i64 q6,q7,q9 vtrn.32 d0,d6 vshl.i64 q7,q9,#26 vtrn.32 d1,d7 vsub.i64 q2,q5,q2 add r2,r2,#16 vsub.i64 q3,q4,q7 vst1.8 d0,[r2,: 64] add r4,r4,#16 vst1.8 d1,[r4,: 64] vtrn.32 d4,d2 vtrn.32 d5,d3 sub r2,r2,#8 sub r4,r4,#8 vtrn.32 d6,d12 vtrn.32 d7,d13 vst1.8 d4,[r2,: 64] vst1.8 d5,[r4,: 64] sub r2,r2,#24 sub r4,r4,#24 vst1.8 d6,[r2,: 64] vst1.8 d7,[r4,: 64] add r2,r3,#240 add r4,r3,#96 vld1.8 {d0-d1},[r4,: 128]! vld1.8 {d2-d3},[r4,: 128]! vld1.8 {d4},[r4,: 64] add r4,r3,#144 vld1.8 {d6-d7},[r4,: 128]! vtrn.32 q0,q3 vld1.8 {d8-d9},[r4,: 128]! vshl.i32 q5,q0,#4 vtrn.32 q1,q4 vshl.i32 q6,q3,#4 vadd.i32 q5,q5,q0 vadd.i32 q6,q6,q3 vshl.i32 q7,q1,#4 vld1.8 {d5},[r4,: 64] vshl.i32 q8,q4,#4 vtrn.32 d4,d5 vadd.i32 q7,q7,q1 vadd.i32 q8,q8,q4 vld1.8 {d18-d19},[r2,: 128]! vshl.i32 q10,q2,#4 vld1.8 {d22-d23},[r2,: 128]! vadd.i32 q10,q10,q2 vld1.8 {d24},[r2,: 64] vadd.i32 q5,q5,q0 add r2,r3,#192 vld1.8 {d26-d27},[r2,: 128]! vadd.i32 q6,q6,q3 vld1.8 {d28-d29},[r2,: 128]! vadd.i32 q8,q8,q4 vld1.8 {d25},[r2,: 64] vadd.i32 q10,q10,q2 vtrn.32 q9,q13 vadd.i32 q7,q7,q1 vadd.i32 q5,q5,q0 vtrn.32 q11,q14 vadd.i32 q6,q6,q3 add r2,sp,#560 vadd.i32 q10,q10,q2 vtrn.32 d24,d25 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q6,q13,#1 add r2,sp,#576 vst1.8 {d20-d21},[r2,: 128] vshl.i32 q10,q14,#1 add r2,sp,#592 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q15,q12,#1 vadd.i32 q8,q8,q4 vext.32 d10,d31,d30,#0 vadd.i32 q7,q7,q1 add r2,sp,#608 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q8,d18,d5 vmlal.s32 q8,d26,d4 vmlal.s32 q8,d19,d9 vmlal.s32 q8,d27,d3 vmlal.s32 q8,d22,d8 vmlal.s32 q8,d28,d2 vmlal.s32 q8,d23,d7 vmlal.s32 q8,d29,d1 vmlal.s32 q8,d24,d6 vmlal.s32 q8,d25,d0 add r2,sp,#624 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q2,d18,d4 vmlal.s32 q2,d12,d9 vmlal.s32 q2,d13,d8 vmlal.s32 q2,d19,d3 vmlal.s32 q2,d22,d2 vmlal.s32 q2,d23,d1 vmlal.s32 q2,d24,d0 add r2,sp,#640 vst1.8 {d20-d21},[r2,: 128] vmull.s32 q7,d18,d9 vmlal.s32 q7,d26,d3 vmlal.s32 q7,d19,d8 vmlal.s32 q7,d27,d2 vmlal.s32 q7,d22,d7 vmlal.s32 q7,d28,d1 vmlal.s32 q7,d23,d6 vmlal.s32 q7,d29,d0 add r2,sp,#656 vst1.8 {d10-d11},[r2,: 128] vmull.s32 q5,d18,d3 vmlal.s32 q5,d19,d2 vmlal.s32 q5,d22,d1 vmlal.s32 q5,d23,d0 vmlal.s32 q5,d12,d8 add r2,sp,#672 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q4,d18,d8 vmlal.s32 q4,d26,d2 vmlal.s32 q4,d19,d7 vmlal.s32 q4,d27,d1 vmlal.s32 q4,d22,d6 vmlal.s32 q4,d28,d0 vmull.s32 q8,d18,d7 vmlal.s32 q8,d26,d1 vmlal.s32 q8,d19,d6 vmlal.s32 q8,d27,d0 add r2,sp,#576 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q7,d24,d21 vmlal.s32 q7,d25,d20 vmlal.s32 q4,d23,d21 vmlal.s32 q4,d29,d20 vmlal.s32 q8,d22,d21 vmlal.s32 q8,d28,d20 vmlal.s32 q5,d24,d20 add r2,sp,#576 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q7,d18,d6 vmlal.s32 q7,d26,d0 add r2,sp,#656 vld1.8 {d30-d31},[r2,: 128] vmlal.s32 q2,d30,d21 vmlal.s32 q7,d19,d21 vmlal.s32 q7,d27,d20 add r2,sp,#624 vld1.8 {d26-d27},[r2,: 128] vmlal.s32 q4,d25,d27 vmlal.s32 q8,d29,d27 vmlal.s32 q8,d25,d26 vmlal.s32 q7,d28,d27 vmlal.s32 q7,d29,d26 add r2,sp,#608 vld1.8 {d28-d29},[r2,: 128] vmlal.s32 q4,d24,d29 vmlal.s32 q8,d23,d29 vmlal.s32 q8,d24,d28 vmlal.s32 q7,d22,d29 vmlal.s32 q7,d23,d28 add r2,sp,#608 vst1.8 {d8-d9},[r2,: 128] add r2,sp,#560 vld1.8 {d8-d9},[r2,: 128] vmlal.s32 q7,d24,d9 vmlal.s32 q7,d25,d31 vmull.s32 q1,d18,d2 vmlal.s32 q1,d19,d1 vmlal.s32 q1,d22,d0 vmlal.s32 q1,d24,d27 vmlal.s32 q1,d23,d20 vmlal.s32 q1,d12,d7 vmlal.s32 q1,d13,d6 vmull.s32 q6,d18,d1 vmlal.s32 q6,d19,d0 vmlal.s32 q6,d23,d27 vmlal.s32 q6,d22,d20 vmlal.s32 q6,d24,d26 vmull.s32 q0,d18,d0 vmlal.s32 q0,d22,d27 vmlal.s32 q0,d23,d26 vmlal.s32 q0,d24,d31 vmlal.s32 q0,d19,d20 add r2,sp,#640 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q2,d18,d7 vmlal.s32 q2,d19,d6 vmlal.s32 q5,d18,d6 vmlal.s32 q5,d19,d21 vmlal.s32 q1,d18,d21 vmlal.s32 q1,d19,d29 vmlal.s32 q0,d18,d28 vmlal.s32 q0,d19,d9 vmlal.s32 q6,d18,d29 vmlal.s32 q6,d19,d28 add r2,sp,#592 vld1.8 {d18-d19},[r2,: 128] add r2,sp,#512 vld1.8 {d22-d23},[r2,: 128] vmlal.s32 q5,d19,d7 vmlal.s32 q0,d18,d21 vmlal.s32 q0,d19,d29 vmlal.s32 q6,d18,d6 add r2,sp,#528 vld1.8 {d6-d7},[r2,: 128] vmlal.s32 q6,d19,d21 add r2,sp,#576 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q0,d30,d8 add r2,sp,#672 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q5,d30,d29 add r2,sp,#608 vld1.8 {d24-d25},[r2,: 128] vmlal.s32 q1,d30,d28 vadd.i64 q13,q0,q11 vadd.i64 q14,q5,q11 vmlal.s32 q6,d30,d9 vshr.s64 q4,q13,#26 vshr.s64 q13,q14,#26 vadd.i64 q7,q7,q4 vshl.i64 q4,q4,#26 vadd.i64 q14,q7,q3 vadd.i64 q9,q9,q13 vshl.i64 q13,q13,#26 vadd.i64 q15,q9,q3 vsub.i64 q0,q0,q4 vshr.s64 q4,q14,#25 vsub.i64 q5,q5,q13 vshr.s64 q13,q15,#25 vadd.i64 q6,q6,q4 vshl.i64 q4,q4,#25 vadd.i64 q14,q6,q11 vadd.i64 q2,q2,q13 vsub.i64 q4,q7,q4 vshr.s64 q7,q14,#26 vshl.i64 q13,q13,#25 vadd.i64 q14,q2,q11 vadd.i64 q8,q8,q7 vshl.i64 q7,q7,#26 vadd.i64 q15,q8,q3 vsub.i64 q9,q9,q13 vshr.s64 q13,q14,#26 vsub.i64 q6,q6,q7 vshr.s64 q7,q15,#25 vadd.i64 q10,q10,q13 vshl.i64 q13,q13,#26 vadd.i64 q14,q10,q3 vadd.i64 q1,q1,q7 add r2,r3,#144 vshl.i64 q7,q7,#25 add r4,r3,#96 vadd.i64 q15,q1,q11 add r2,r2,#8 vsub.i64 q2,q2,q13 add r4,r4,#8 vshr.s64 q13,q14,#25 vsub.i64 q7,q8,q7 vshr.s64 q8,q15,#26 vadd.i64 q14,q13,q13 vadd.i64 q12,q12,q8 vtrn.32 d12,d14 vshl.i64 q8,q8,#26 vtrn.32 d13,d15 vadd.i64 q3,q12,q3 vadd.i64 q0,q0,q14 vst1.8 d12,[r2,: 64]! vshl.i64 q7,q13,#4 vst1.8 d13,[r4,: 64]! vsub.i64 q1,q1,q8 vshr.s64 q3,q3,#25 vadd.i64 q0,q0,q7 vadd.i64 q5,q5,q3 vshl.i64 q3,q3,#25 vadd.i64 q6,q5,q11 vadd.i64 q0,q0,q13 vshl.i64 q7,q13,#25 vadd.i64 q8,q0,q11 vsub.i64 q3,q12,q3 vshr.s64 q6,q6,#26 vsub.i64 q7,q10,q7 vtrn.32 d2,d6 vshr.s64 q8,q8,#26 vtrn.32 d3,d7 vadd.i64 q3,q9,q6 vst1.8 d2,[r2,: 64] vshl.i64 q6,q6,#26 vst1.8 d3,[r4,: 64] vadd.i64 q1,q4,q8 vtrn.32 d4,d14 vshl.i64 q4,q8,#26 vtrn.32 d5,d15 vsub.i64 q5,q5,q6 add r2,r2,#16 vsub.i64 q0,q0,q4 vst1.8 d4,[r2,: 64] add r4,r4,#16 vst1.8 d5,[r4,: 64] vtrn.32 d10,d6 vtrn.32 d11,d7 sub r2,r2,#8 sub r4,r4,#8 vtrn.32 d0,d2 vtrn.32 d1,d3 vst1.8 d10,[r2,: 64] vst1.8 d11,[r4,: 64] sub r2,r2,#24 sub r4,r4,#24 vst1.8 d0,[r2,: 64] vst1.8 d1,[r4,: 64] add r2,r3,#288 add r4,r3,#336 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r4,: 128]! vsub.i32 q0,q0,q1 vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d4-d5},[r4,: 128]! vsub.i32 q1,q1,q2 add r5,r3,#240 vld1.8 {d4},[r2,: 64] vld1.8 {d6},[r4,: 64] vsub.i32 q2,q2,q3 vst1.8 {d0-d1},[r5,: 128]! vst1.8 {d2-d3},[r5,: 128]! vst1.8 d4,[r5,: 64] add r2,r3,#144 add r4,r3,#96 add r5,r3,#144 add r6,r3,#192 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r4,: 128]! vsub.i32 q2,q0,q1 vadd.i32 q0,q0,q1 vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d6-d7},[r4,: 128]! vsub.i32 q4,q1,q3 vadd.i32 q1,q1,q3 vld1.8 {d6},[r2,: 64] vld1.8 {d10},[r4,: 64] vsub.i32 q6,q3,q5 vadd.i32 q3,q3,q5 vst1.8 {d4-d5},[r5,: 128]! vst1.8 {d0-d1},[r6,: 128]! vst1.8 {d8-d9},[r5,: 128]! vst1.8 {d2-d3},[r6,: 128]! vst1.8 d12,[r5,: 64] vst1.8 d6,[r6,: 64] add r2,r3,#0 add r4,r3,#240 vld1.8 {d0-d1},[r4,: 128]! vld1.8 {d2-d3},[r4,: 128]! vld1.8 {d4},[r4,: 64] add r4,r3,#336 vld1.8 {d6-d7},[r4,: 128]! vtrn.32 q0,q3 vld1.8 {d8-d9},[r4,: 128]! vshl.i32 q5,q0,#4 vtrn.32 q1,q4 vshl.i32 q6,q3,#4 vadd.i32 q5,q5,q0 vadd.i32 q6,q6,q3 vshl.i32 q7,q1,#4 vld1.8 {d5},[r4,: 64] vshl.i32 q8,q4,#4 vtrn.32 d4,d5 vadd.i32 q7,q7,q1 vadd.i32 q8,q8,q4 vld1.8 {d18-d19},[r2,: 128]! vshl.i32 q10,q2,#4 vld1.8 {d22-d23},[r2,: 128]! vadd.i32 q10,q10,q2 vld1.8 {d24},[r2,: 64] vadd.i32 q5,q5,q0 add r2,r3,#288 vld1.8 {d26-d27},[r2,: 128]! vadd.i32 q6,q6,q3 vld1.8 {d28-d29},[r2,: 128]! vadd.i32 q8,q8,q4 vld1.8 {d25},[r2,: 64] vadd.i32 q10,q10,q2 vtrn.32 q9,q13 vadd.i32 q7,q7,q1 vadd.i32 q5,q5,q0 vtrn.32 q11,q14 vadd.i32 q6,q6,q3 add r2,sp,#560 vadd.i32 q10,q10,q2 vtrn.32 d24,d25 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q6,q13,#1 add r2,sp,#576 vst1.8 {d20-d21},[r2,: 128] vshl.i32 q10,q14,#1 add r2,sp,#592 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q15,q12,#1 vadd.i32 q8,q8,q4 vext.32 d10,d31,d30,#0 vadd.i32 q7,q7,q1 add r2,sp,#608 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q8,d18,d5 vmlal.s32 q8,d26,d4 vmlal.s32 q8,d19,d9 vmlal.s32 q8,d27,d3 vmlal.s32 q8,d22,d8 vmlal.s32 q8,d28,d2 vmlal.s32 q8,d23,d7 vmlal.s32 q8,d29,d1 vmlal.s32 q8,d24,d6 vmlal.s32 q8,d25,d0 add r2,sp,#624 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q2,d18,d4 vmlal.s32 q2,d12,d9 vmlal.s32 q2,d13,d8 vmlal.s32 q2,d19,d3 vmlal.s32 q2,d22,d2 vmlal.s32 q2,d23,d1 vmlal.s32 q2,d24,d0 add r2,sp,#640 vst1.8 {d20-d21},[r2,: 128] vmull.s32 q7,d18,d9 vmlal.s32 q7,d26,d3 vmlal.s32 q7,d19,d8 vmlal.s32 q7,d27,d2 vmlal.s32 q7,d22,d7 vmlal.s32 q7,d28,d1 vmlal.s32 q7,d23,d6 vmlal.s32 q7,d29,d0 add r2,sp,#656 vst1.8 {d10-d11},[r2,: 128] vmull.s32 q5,d18,d3 vmlal.s32 q5,d19,d2 vmlal.s32 q5,d22,d1 vmlal.s32 q5,d23,d0 vmlal.s32 q5,d12,d8 add r2,sp,#672 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q4,d18,d8 vmlal.s32 q4,d26,d2 vmlal.s32 q4,d19,d7 vmlal.s32 q4,d27,d1 vmlal.s32 q4,d22,d6 vmlal.s32 q4,d28,d0 vmull.s32 q8,d18,d7 vmlal.s32 q8,d26,d1 vmlal.s32 q8,d19,d6 vmlal.s32 q8,d27,d0 add r2,sp,#576 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q7,d24,d21 vmlal.s32 q7,d25,d20 vmlal.s32 q4,d23,d21 vmlal.s32 q4,d29,d20 vmlal.s32 q8,d22,d21 vmlal.s32 q8,d28,d20 vmlal.s32 q5,d24,d20 add r2,sp,#576 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q7,d18,d6 vmlal.s32 q7,d26,d0 add r2,sp,#656 vld1.8 {d30-d31},[r2,: 128] vmlal.s32 q2,d30,d21 vmlal.s32 q7,d19,d21 vmlal.s32 q7,d27,d20 add r2,sp,#624 vld1.8 {d26-d27},[r2,: 128] vmlal.s32 q4,d25,d27 vmlal.s32 q8,d29,d27 vmlal.s32 q8,d25,d26 vmlal.s32 q7,d28,d27 vmlal.s32 q7,d29,d26 add r2,sp,#608 vld1.8 {d28-d29},[r2,: 128] vmlal.s32 q4,d24,d29 vmlal.s32 q8,d23,d29 vmlal.s32 q8,d24,d28 vmlal.s32 q7,d22,d29 vmlal.s32 q7,d23,d28 add r2,sp,#608 vst1.8 {d8-d9},[r2,: 128] add r2,sp,#560 vld1.8 {d8-d9},[r2,: 128] vmlal.s32 q7,d24,d9 vmlal.s32 q7,d25,d31 vmull.s32 q1,d18,d2 vmlal.s32 q1,d19,d1 vmlal.s32 q1,d22,d0 vmlal.s32 q1,d24,d27 vmlal.s32 q1,d23,d20 vmlal.s32 q1,d12,d7 vmlal.s32 q1,d13,d6 vmull.s32 q6,d18,d1 vmlal.s32 q6,d19,d0 vmlal.s32 q6,d23,d27 vmlal.s32 q6,d22,d20 vmlal.s32 q6,d24,d26 vmull.s32 q0,d18,d0 vmlal.s32 q0,d22,d27 vmlal.s32 q0,d23,d26 vmlal.s32 q0,d24,d31 vmlal.s32 q0,d19,d20 add r2,sp,#640 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q2,d18,d7 vmlal.s32 q2,d19,d6 vmlal.s32 q5,d18,d6 vmlal.s32 q5,d19,d21 vmlal.s32 q1,d18,d21 vmlal.s32 q1,d19,d29 vmlal.s32 q0,d18,d28 vmlal.s32 q0,d19,d9 vmlal.s32 q6,d18,d29 vmlal.s32 q6,d19,d28 add r2,sp,#592 vld1.8 {d18-d19},[r2,: 128] add r2,sp,#512 vld1.8 {d22-d23},[r2,: 128] vmlal.s32 q5,d19,d7 vmlal.s32 q0,d18,d21 vmlal.s32 q0,d19,d29 vmlal.s32 q6,d18,d6 add r2,sp,#528 vld1.8 {d6-d7},[r2,: 128] vmlal.s32 q6,d19,d21 add r2,sp,#576 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q0,d30,d8 add r2,sp,#672 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q5,d30,d29 add r2,sp,#608 vld1.8 {d24-d25},[r2,: 128] vmlal.s32 q1,d30,d28 vadd.i64 q13,q0,q11 vadd.i64 q14,q5,q11 vmlal.s32 q6,d30,d9 vshr.s64 q4,q13,#26 vshr.s64 q13,q14,#26 vadd.i64 q7,q7,q4 vshl.i64 q4,q4,#26 vadd.i64 q14,q7,q3 vadd.i64 q9,q9,q13 vshl.i64 q13,q13,#26 vadd.i64 q15,q9,q3 vsub.i64 q0,q0,q4 vshr.s64 q4,q14,#25 vsub.i64 q5,q5,q13 vshr.s64 q13,q15,#25 vadd.i64 q6,q6,q4 vshl.i64 q4,q4,#25 vadd.i64 q14,q6,q11 vadd.i64 q2,q2,q13 vsub.i64 q4,q7,q4 vshr.s64 q7,q14,#26 vshl.i64 q13,q13,#25 vadd.i64 q14,q2,q11 vadd.i64 q8,q8,q7 vshl.i64 q7,q7,#26 vadd.i64 q15,q8,q3 vsub.i64 q9,q9,q13 vshr.s64 q13,q14,#26 vsub.i64 q6,q6,q7 vshr.s64 q7,q15,#25 vadd.i64 q10,q10,q13 vshl.i64 q13,q13,#26 vadd.i64 q14,q10,q3 vadd.i64 q1,q1,q7 add r2,r3,#288 vshl.i64 q7,q7,#25 add r4,r3,#96 vadd.i64 q15,q1,q11 add r2,r2,#8 vsub.i64 q2,q2,q13 add r4,r4,#8 vshr.s64 q13,q14,#25 vsub.i64 q7,q8,q7 vshr.s64 q8,q15,#26 vadd.i64 q14,q13,q13 vadd.i64 q12,q12,q8 vtrn.32 d12,d14 vshl.i64 q8,q8,#26 vtrn.32 d13,d15 vadd.i64 q3,q12,q3 vadd.i64 q0,q0,q14 vst1.8 d12,[r2,: 64]! vshl.i64 q7,q13,#4 vst1.8 d13,[r4,: 64]! vsub.i64 q1,q1,q8 vshr.s64 q3,q3,#25 vadd.i64 q0,q0,q7 vadd.i64 q5,q5,q3 vshl.i64 q3,q3,#25 vadd.i64 q6,q5,q11 vadd.i64 q0,q0,q13 vshl.i64 q7,q13,#25 vadd.i64 q8,q0,q11 vsub.i64 q3,q12,q3 vshr.s64 q6,q6,#26 vsub.i64 q7,q10,q7 vtrn.32 d2,d6 vshr.s64 q8,q8,#26 vtrn.32 d3,d7 vadd.i64 q3,q9,q6 vst1.8 d2,[r2,: 64] vshl.i64 q6,q6,#26 vst1.8 d3,[r4,: 64] vadd.i64 q1,q4,q8 vtrn.32 d4,d14 vshl.i64 q4,q8,#26 vtrn.32 d5,d15 vsub.i64 q5,q5,q6 add r2,r2,#16 vsub.i64 q0,q0,q4 vst1.8 d4,[r2,: 64] add r4,r4,#16 vst1.8 d5,[r4,: 64] vtrn.32 d10,d6 vtrn.32 d11,d7 sub r2,r2,#8 sub r4,r4,#8 vtrn.32 d0,d2 vtrn.32 d1,d3 vst1.8 d10,[r2,: 64] vst1.8 d11,[r4,: 64] sub r2,r2,#24 sub r4,r4,#24 vst1.8 d0,[r2,: 64] vst1.8 d1,[r4,: 64] add r2,sp,#544 add r4,r3,#144 add r5,r3,#192 vld1.8 {d0-d1},[r2,: 128] vld1.8 {d2-d3},[r4,: 128]! vld1.8 {d4-d5},[r5,: 128]! vzip.i32 q1,q2 vld1.8 {d6-d7},[r4,: 128]! vld1.8 {d8-d9},[r5,: 128]! vshl.i32 q5,q1,#1 vzip.i32 q3,q4 vshl.i32 q6,q2,#1 vld1.8 {d14},[r4,: 64] vshl.i32 q8,q3,#1 vld1.8 {d15},[r5,: 64] vshl.i32 q9,q4,#1 vmul.i32 d21,d7,d1 vtrn.32 d14,d15 vmul.i32 q11,q4,q0 vmul.i32 q0,q7,q0 vmull.s32 q12,d2,d2 vmlal.s32 q12,d11,d1 vmlal.s32 q12,d12,d0 vmlal.s32 q12,d13,d23 vmlal.s32 q12,d16,d22 vmlal.s32 q12,d7,d21 vmull.s32 q10,d2,d11 vmlal.s32 q10,d4,d1 vmlal.s32 q10,d13,d0 vmlal.s32 q10,d6,d23 vmlal.s32 q10,d17,d22 vmull.s32 q13,d10,d4 vmlal.s32 q13,d11,d3 vmlal.s32 q13,d13,d1 vmlal.s32 q13,d16,d0 vmlal.s32 q13,d17,d23 vmlal.s32 q13,d8,d22 vmull.s32 q1,d10,d5 vmlal.s32 q1,d11,d4 vmlal.s32 q1,d6,d1 vmlal.s32 q1,d17,d0 vmlal.s32 q1,d8,d23 vmull.s32 q14,d10,d6 vmlal.s32 q14,d11,d13 vmlal.s32 q14,d4,d4 vmlal.s32 q14,d17,d1 vmlal.s32 q14,d18,d0 vmlal.s32 q14,d9,d23 vmull.s32 q11,d10,d7 vmlal.s32 q11,d11,d6 vmlal.s32 q11,d12,d5 vmlal.s32 q11,d8,d1 vmlal.s32 q11,d19,d0 vmull.s32 q15,d10,d8 vmlal.s32 q15,d11,d17 vmlal.s32 q15,d12,d6 vmlal.s32 q15,d13,d5 vmlal.s32 q15,d19,d1 vmlal.s32 q15,d14,d0 vmull.s32 q2,d10,d9 vmlal.s32 q2,d11,d8 vmlal.s32 q2,d12,d7 vmlal.s32 q2,d13,d6 vmlal.s32 q2,d14,d1 vmull.s32 q0,d15,d1 vmlal.s32 q0,d10,d14 vmlal.s32 q0,d11,d19 vmlal.s32 q0,d12,d8 vmlal.s32 q0,d13,d17 vmlal.s32 q0,d6,d6 add r2,sp,#512 vld1.8 {d18-d19},[r2,: 128] vmull.s32 q3,d16,d7 vmlal.s32 q3,d10,d15 vmlal.s32 q3,d11,d14 vmlal.s32 q3,d12,d9 vmlal.s32 q3,d13,d8 add r2,sp,#528 vld1.8 {d8-d9},[r2,: 128] vadd.i64 q5,q12,q9 vadd.i64 q6,q15,q9 vshr.s64 q5,q5,#26 vshr.s64 q6,q6,#26 vadd.i64 q7,q10,q5 vshl.i64 q5,q5,#26 vadd.i64 q8,q7,q4 vadd.i64 q2,q2,q6 vshl.i64 q6,q6,#26 vadd.i64 q10,q2,q4 vsub.i64 q5,q12,q5 vshr.s64 q8,q8,#25 vsub.i64 q6,q15,q6 vshr.s64 q10,q10,#25 vadd.i64 q12,q13,q8 vshl.i64 q8,q8,#25 vadd.i64 q13,q12,q9 vadd.i64 q0,q0,q10 vsub.i64 q7,q7,q8 vshr.s64 q8,q13,#26 vshl.i64 q10,q10,#25 vadd.i64 q13,q0,q9 vadd.i64 q1,q1,q8 vshl.i64 q8,q8,#26 vadd.i64 q15,q1,q4 vsub.i64 q2,q2,q10 vshr.s64 q10,q13,#26 vsub.i64 q8,q12,q8 vshr.s64 q12,q15,#25 vadd.i64 q3,q3,q10 vshl.i64 q10,q10,#26 vadd.i64 q13,q3,q4 vadd.i64 q14,q14,q12 add r2,r3,#144 vshl.i64 q12,q12,#25 add r4,r3,#192 vadd.i64 q15,q14,q9 add r2,r2,#8 vsub.i64 q0,q0,q10 add r4,r4,#8 vshr.s64 q10,q13,#25 vsub.i64 q1,q1,q12 vshr.s64 q12,q15,#26 vadd.i64 q13,q10,q10 vadd.i64 q11,q11,q12 vtrn.32 d16,d2 vshl.i64 q12,q12,#26 vtrn.32 d17,d3 vadd.i64 q1,q11,q4 vadd.i64 q4,q5,q13 vst1.8 d16,[r2,: 64]! vshl.i64 q5,q10,#4 vst1.8 d17,[r4,: 64]! vsub.i64 q8,q14,q12 vshr.s64 q1,q1,#25 vadd.i64 q4,q4,q5 vadd.i64 q5,q6,q1 vshl.i64 q1,q1,#25 vadd.i64 q6,q5,q9 vadd.i64 q4,q4,q10 vshl.i64 q10,q10,#25 vadd.i64 q9,q4,q9 vsub.i64 q1,q11,q1 vshr.s64 q6,q6,#26 vsub.i64 q3,q3,q10 vtrn.32 d16,d2 vshr.s64 q9,q9,#26 vtrn.32 d17,d3 vadd.i64 q1,q2,q6 vst1.8 d16,[r2,: 64] vshl.i64 q2,q6,#26 vst1.8 d17,[r4,: 64] vadd.i64 q6,q7,q9 vtrn.32 d0,d6 vshl.i64 q7,q9,#26 vtrn.32 d1,d7 vsub.i64 q2,q5,q2 add r2,r2,#16 vsub.i64 q3,q4,q7 vst1.8 d0,[r2,: 64] add r4,r4,#16 vst1.8 d1,[r4,: 64] vtrn.32 d4,d2 vtrn.32 d5,d3 sub r2,r2,#8 sub r4,r4,#8 vtrn.32 d6,d12 vtrn.32 d7,d13 vst1.8 d4,[r2,: 64] vst1.8 d5,[r4,: 64] sub r2,r2,#24 sub r4,r4,#24 vst1.8 d6,[r2,: 64] vst1.8 d7,[r4,: 64] add r2,r3,#336 add r4,r3,#288 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r4,: 128]! vadd.i32 q0,q0,q1 vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d4-d5},[r4,: 128]! vadd.i32 q1,q1,q2 add r5,r3,#288 vld1.8 {d4},[r2,: 64] vld1.8 {d6},[r4,: 64] vadd.i32 q2,q2,q3 vst1.8 {d0-d1},[r5,: 128]! vst1.8 {d2-d3},[r5,: 128]! vst1.8 d4,[r5,: 64] add r2,r3,#48 add r4,r3,#144 vld1.8 {d0-d1},[r4,: 128]! vld1.8 {d2-d3},[r4,: 128]! vld1.8 {d4},[r4,: 64] add r4,r3,#288 vld1.8 {d6-d7},[r4,: 128]! vtrn.32 q0,q3 vld1.8 {d8-d9},[r4,: 128]! vshl.i32 q5,q0,#4 vtrn.32 q1,q4 vshl.i32 q6,q3,#4 vadd.i32 q5,q5,q0 vadd.i32 q6,q6,q3 vshl.i32 q7,q1,#4 vld1.8 {d5},[r4,: 64] vshl.i32 q8,q4,#4 vtrn.32 d4,d5 vadd.i32 q7,q7,q1 vadd.i32 q8,q8,q4 vld1.8 {d18-d19},[r2,: 128]! vshl.i32 q10,q2,#4 vld1.8 {d22-d23},[r2,: 128]! vadd.i32 q10,q10,q2 vld1.8 {d24},[r2,: 64] vadd.i32 q5,q5,q0 add r2,r3,#240 vld1.8 {d26-d27},[r2,: 128]! vadd.i32 q6,q6,q3 vld1.8 {d28-d29},[r2,: 128]! vadd.i32 q8,q8,q4 vld1.8 {d25},[r2,: 64] vadd.i32 q10,q10,q2 vtrn.32 q9,q13 vadd.i32 q7,q7,q1 vadd.i32 q5,q5,q0 vtrn.32 q11,q14 vadd.i32 q6,q6,q3 add r2,sp,#560 vadd.i32 q10,q10,q2 vtrn.32 d24,d25 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q6,q13,#1 add r2,sp,#576 vst1.8 {d20-d21},[r2,: 128] vshl.i32 q10,q14,#1 add r2,sp,#592 vst1.8 {d12-d13},[r2,: 128] vshl.i32 q15,q12,#1 vadd.i32 q8,q8,q4 vext.32 d10,d31,d30,#0 vadd.i32 q7,q7,q1 add r2,sp,#608 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q8,d18,d5 vmlal.s32 q8,d26,d4 vmlal.s32 q8,d19,d9 vmlal.s32 q8,d27,d3 vmlal.s32 q8,d22,d8 vmlal.s32 q8,d28,d2 vmlal.s32 q8,d23,d7 vmlal.s32 q8,d29,d1 vmlal.s32 q8,d24,d6 vmlal.s32 q8,d25,d0 add r2,sp,#624 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q2,d18,d4 vmlal.s32 q2,d12,d9 vmlal.s32 q2,d13,d8 vmlal.s32 q2,d19,d3 vmlal.s32 q2,d22,d2 vmlal.s32 q2,d23,d1 vmlal.s32 q2,d24,d0 add r2,sp,#640 vst1.8 {d20-d21},[r2,: 128] vmull.s32 q7,d18,d9 vmlal.s32 q7,d26,d3 vmlal.s32 q7,d19,d8 vmlal.s32 q7,d27,d2 vmlal.s32 q7,d22,d7 vmlal.s32 q7,d28,d1 vmlal.s32 q7,d23,d6 vmlal.s32 q7,d29,d0 add r2,sp,#656 vst1.8 {d10-d11},[r2,: 128] vmull.s32 q5,d18,d3 vmlal.s32 q5,d19,d2 vmlal.s32 q5,d22,d1 vmlal.s32 q5,d23,d0 vmlal.s32 q5,d12,d8 add r2,sp,#672 vst1.8 {d16-d17},[r2,: 128] vmull.s32 q4,d18,d8 vmlal.s32 q4,d26,d2 vmlal.s32 q4,d19,d7 vmlal.s32 q4,d27,d1 vmlal.s32 q4,d22,d6 vmlal.s32 q4,d28,d0 vmull.s32 q8,d18,d7 vmlal.s32 q8,d26,d1 vmlal.s32 q8,d19,d6 vmlal.s32 q8,d27,d0 add r2,sp,#576 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q7,d24,d21 vmlal.s32 q7,d25,d20 vmlal.s32 q4,d23,d21 vmlal.s32 q4,d29,d20 vmlal.s32 q8,d22,d21 vmlal.s32 q8,d28,d20 vmlal.s32 q5,d24,d20 add r2,sp,#576 vst1.8 {d14-d15},[r2,: 128] vmull.s32 q7,d18,d6 vmlal.s32 q7,d26,d0 add r2,sp,#656 vld1.8 {d30-d31},[r2,: 128] vmlal.s32 q2,d30,d21 vmlal.s32 q7,d19,d21 vmlal.s32 q7,d27,d20 add r2,sp,#624 vld1.8 {d26-d27},[r2,: 128] vmlal.s32 q4,d25,d27 vmlal.s32 q8,d29,d27 vmlal.s32 q8,d25,d26 vmlal.s32 q7,d28,d27 vmlal.s32 q7,d29,d26 add r2,sp,#608 vld1.8 {d28-d29},[r2,: 128] vmlal.s32 q4,d24,d29 vmlal.s32 q8,d23,d29 vmlal.s32 q8,d24,d28 vmlal.s32 q7,d22,d29 vmlal.s32 q7,d23,d28 add r2,sp,#608 vst1.8 {d8-d9},[r2,: 128] add r2,sp,#560 vld1.8 {d8-d9},[r2,: 128] vmlal.s32 q7,d24,d9 vmlal.s32 q7,d25,d31 vmull.s32 q1,d18,d2 vmlal.s32 q1,d19,d1 vmlal.s32 q1,d22,d0 vmlal.s32 q1,d24,d27 vmlal.s32 q1,d23,d20 vmlal.s32 q1,d12,d7 vmlal.s32 q1,d13,d6 vmull.s32 q6,d18,d1 vmlal.s32 q6,d19,d0 vmlal.s32 q6,d23,d27 vmlal.s32 q6,d22,d20 vmlal.s32 q6,d24,d26 vmull.s32 q0,d18,d0 vmlal.s32 q0,d22,d27 vmlal.s32 q0,d23,d26 vmlal.s32 q0,d24,d31 vmlal.s32 q0,d19,d20 add r2,sp,#640 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q2,d18,d7 vmlal.s32 q2,d19,d6 vmlal.s32 q5,d18,d6 vmlal.s32 q5,d19,d21 vmlal.s32 q1,d18,d21 vmlal.s32 q1,d19,d29 vmlal.s32 q0,d18,d28 vmlal.s32 q0,d19,d9 vmlal.s32 q6,d18,d29 vmlal.s32 q6,d19,d28 add r2,sp,#592 vld1.8 {d18-d19},[r2,: 128] add r2,sp,#512 vld1.8 {d22-d23},[r2,: 128] vmlal.s32 q5,d19,d7 vmlal.s32 q0,d18,d21 vmlal.s32 q0,d19,d29 vmlal.s32 q6,d18,d6 add r2,sp,#528 vld1.8 {d6-d7},[r2,: 128] vmlal.s32 q6,d19,d21 add r2,sp,#576 vld1.8 {d18-d19},[r2,: 128] vmlal.s32 q0,d30,d8 add r2,sp,#672 vld1.8 {d20-d21},[r2,: 128] vmlal.s32 q5,d30,d29 add r2,sp,#608 vld1.8 {d24-d25},[r2,: 128] vmlal.s32 q1,d30,d28 vadd.i64 q13,q0,q11 vadd.i64 q14,q5,q11 vmlal.s32 q6,d30,d9 vshr.s64 q4,q13,#26 vshr.s64 q13,q14,#26 vadd.i64 q7,q7,q4 vshl.i64 q4,q4,#26 vadd.i64 q14,q7,q3 vadd.i64 q9,q9,q13 vshl.i64 q13,q13,#26 vadd.i64 q15,q9,q3 vsub.i64 q0,q0,q4 vshr.s64 q4,q14,#25 vsub.i64 q5,q5,q13 vshr.s64 q13,q15,#25 vadd.i64 q6,q6,q4 vshl.i64 q4,q4,#25 vadd.i64 q14,q6,q11 vadd.i64 q2,q2,q13 vsub.i64 q4,q7,q4 vshr.s64 q7,q14,#26 vshl.i64 q13,q13,#25 vadd.i64 q14,q2,q11 vadd.i64 q8,q8,q7 vshl.i64 q7,q7,#26 vadd.i64 q15,q8,q3 vsub.i64 q9,q9,q13 vshr.s64 q13,q14,#26 vsub.i64 q6,q6,q7 vshr.s64 q7,q15,#25 vadd.i64 q10,q10,q13 vshl.i64 q13,q13,#26 vadd.i64 q14,q10,q3 vadd.i64 q1,q1,q7 add r2,r3,#240 vshl.i64 q7,q7,#25 add r4,r3,#144 vadd.i64 q15,q1,q11 add r2,r2,#8 vsub.i64 q2,q2,q13 add r4,r4,#8 vshr.s64 q13,q14,#25 vsub.i64 q7,q8,q7 vshr.s64 q8,q15,#26 vadd.i64 q14,q13,q13 vadd.i64 q12,q12,q8 vtrn.32 d12,d14 vshl.i64 q8,q8,#26 vtrn.32 d13,d15 vadd.i64 q3,q12,q3 vadd.i64 q0,q0,q14 vst1.8 d12,[r2,: 64]! vshl.i64 q7,q13,#4 vst1.8 d13,[r4,: 64]! vsub.i64 q1,q1,q8 vshr.s64 q3,q3,#25 vadd.i64 q0,q0,q7 vadd.i64 q5,q5,q3 vshl.i64 q3,q3,#25 vadd.i64 q6,q5,q11 vadd.i64 q0,q0,q13 vshl.i64 q7,q13,#25 vadd.i64 q8,q0,q11 vsub.i64 q3,q12,q3 vshr.s64 q6,q6,#26 vsub.i64 q7,q10,q7 vtrn.32 d2,d6 vshr.s64 q8,q8,#26 vtrn.32 d3,d7 vadd.i64 q3,q9,q6 vst1.8 d2,[r2,: 64] vshl.i64 q6,q6,#26 vst1.8 d3,[r4,: 64] vadd.i64 q1,q4,q8 vtrn.32 d4,d14 vshl.i64 q4,q8,#26 vtrn.32 d5,d15 vsub.i64 q5,q5,q6 add r2,r2,#16 vsub.i64 q0,q0,q4 vst1.8 d4,[r2,: 64] add r4,r4,#16 vst1.8 d5,[r4,: 64] vtrn.32 d10,d6 vtrn.32 d11,d7 sub r2,r2,#8 sub r4,r4,#8 vtrn.32 d0,d2 vtrn.32 d1,d3 vst1.8 d10,[r2,: 64] vst1.8 d11,[r4,: 64] sub r2,r2,#24 sub r4,r4,#24 vst1.8 d0,[r2,: 64] vst1.8 d1,[r4,: 64] ldr r2,[sp,#488] ldr r4,[sp,#492] subs r5,r2,#1 bge ._mainloop add r1,r3,#144 add r2,r3,#336 vld1.8 {d0-d1},[r1,: 128]! vld1.8 {d2-d3},[r1,: 128]! vld1.8 {d4},[r1,: 64] vst1.8 {d0-d1},[r2,: 128]! vst1.8 {d2-d3},[r2,: 128]! vst1.8 d4,[r2,: 64] ldr r1,=0 ._invertloop: add r2,r3,#144 ldr r4,=0 ldr r5,=2 cmp r1,#1 ldreq r5,=1 addeq r2,r3,#336 addeq r4,r3,#48 cmp r1,#2 ldreq r5,=1 addeq r2,r3,#48 cmp r1,#3 ldreq r5,=5 addeq r4,r3,#336 cmp r1,#4 ldreq r5,=10 cmp r1,#5 ldreq r5,=20 cmp r1,#6 ldreq r5,=10 addeq r2,r3,#336 addeq r4,r3,#336 cmp r1,#7 ldreq r5,=50 cmp r1,#8 ldreq r5,=100 cmp r1,#9 ldreq r5,=50 addeq r2,r3,#336 cmp r1,#10 ldreq r5,=5 addeq r2,r3,#48 cmp r1,#11 ldreq r5,=0 addeq r2,r3,#96 add r6,r3,#144 add r7,r3,#288 vld1.8 {d0-d1},[r6,: 128]! vld1.8 {d2-d3},[r6,: 128]! vld1.8 {d4},[r6,: 64] vst1.8 {d0-d1},[r7,: 128]! vst1.8 {d2-d3},[r7,: 128]! vst1.8 d4,[r7,: 64] cmp r5,#0 beq ._skipsquaringloop ._squaringloop: add r6,r3,#288 add r7,r3,#288 add r8,r3,#288 vmov.i32 q0,#19 vmov.i32 q1,#0 vmov.i32 q2,#1 vzip.i32 q1,q2 vld1.8 {d4-d5},[r7,: 128]! vld1.8 {d6-d7},[r7,: 128]! vld1.8 {d9},[r7,: 64] vld1.8 {d10-d11},[r6,: 128]! add r7,sp,#416 vld1.8 {d12-d13},[r6,: 128]! vmul.i32 q7,q2,q0 vld1.8 {d8},[r6,: 64] vext.32 d17,d11,d10,#1 vmul.i32 q9,q3,q0 vext.32 d16,d10,d8,#1 vshl.u32 q10,q5,q1 vext.32 d22,d14,d4,#1 vext.32 d24,d18,d6,#1 vshl.u32 q13,q6,q1 vshl.u32 d28,d8,d2 vrev64.i32 d22,d22 vmul.i32 d1,d9,d1 vrev64.i32 d24,d24 vext.32 d29,d8,d13,#1 vext.32 d0,d1,d9,#1 vrev64.i32 d0,d0 vext.32 d2,d9,d1,#1 vext.32 d23,d15,d5,#1 vmull.s32 q4,d20,d4 vrev64.i32 d23,d23 vmlal.s32 q4,d21,d1 vrev64.i32 d2,d2 vmlal.s32 q4,d26,d19 vext.32 d3,d5,d15,#1 vmlal.s32 q4,d27,d18 vrev64.i32 d3,d3 vmlal.s32 q4,d28,d15 vext.32 d14,d12,d11,#1 vmull.s32 q5,d16,d23 vext.32 d15,d13,d12,#1 vmlal.s32 q5,d17,d4 vst1.8 d8,[r7,: 64]! vmlal.s32 q5,d14,d1 vext.32 d12,d9,d8,#0 vmlal.s32 q5,d15,d19 vmov.i64 d13,#0 vmlal.s32 q5,d29,d18 vext.32 d25,d19,d7,#1 vmlal.s32 q6,d20,d5 vrev64.i32 d25,d25 vmlal.s32 q6,d21,d4 vst1.8 d11,[r7,: 64]! vmlal.s32 q6,d26,d1 vext.32 d9,d10,d10,#0 vmlal.s32 q6,d27,d19 vmov.i64 d8,#0 vmlal.s32 q6,d28,d18 vmlal.s32 q4,d16,d24 vmlal.s32 q4,d17,d5 vmlal.s32 q4,d14,d4 vst1.8 d12,[r7,: 64]! vmlal.s32 q4,d15,d1 vext.32 d10,d13,d12,#0 vmlal.s32 q4,d29,d19 vmov.i64 d11,#0 vmlal.s32 q5,d20,d6 vmlal.s32 q5,d21,d5 vmlal.s32 q5,d26,d4 vext.32 d13,d8,d8,#0 vmlal.s32 q5,d27,d1 vmov.i64 d12,#0 vmlal.s32 q5,d28,d19 vst1.8 d9,[r7,: 64]! vmlal.s32 q6,d16,d25 vmlal.s32 q6,d17,d6 vst1.8 d10,[r7,: 64] vmlal.s32 q6,d14,d5 vext.32 d8,d11,d10,#0 vmlal.s32 q6,d15,d4 vmov.i64 d9,#0 vmlal.s32 q6,d29,d1 vmlal.s32 q4,d20,d7 vmlal.s32 q4,d21,d6 vmlal.s32 q4,d26,d5 vext.32 d11,d12,d12,#0 vmlal.s32 q4,d27,d4 vmov.i64 d10,#0 vmlal.s32 q4,d28,d1 vmlal.s32 q5,d16,d0 sub r6,r7,#32 vmlal.s32 q5,d17,d7 vmlal.s32 q5,d14,d6 vext.32 d30,d9,d8,#0 vmlal.s32 q5,d15,d5 vld1.8 {d31},[r6,: 64]! vmlal.s32 q5,d29,d4 vmlal.s32 q15,d20,d0 vext.32 d0,d6,d18,#1 vmlal.s32 q15,d21,d25 vrev64.i32 d0,d0 vmlal.s32 q15,d26,d24 vext.32 d1,d7,d19,#1 vext.32 d7,d10,d10,#0 vmlal.s32 q15,d27,d23 vrev64.i32 d1,d1 vld1.8 {d6},[r6,: 64] vmlal.s32 q15,d28,d22 vmlal.s32 q3,d16,d4 add r6,r6,#24 vmlal.s32 q3,d17,d2 vext.32 d4,d31,d30,#0 vmov d17,d11 vmlal.s32 q3,d14,d1 vext.32 d11,d13,d13,#0 vext.32 d13,d30,d30,#0 vmlal.s32 q3,d15,d0 vext.32 d1,d8,d8,#0 vmlal.s32 q3,d29,d3 vld1.8 {d5},[r6,: 64] sub r6,r6,#16 vext.32 d10,d6,d6,#0 vmov.i32 q1,#0xffffffff vshl.i64 q4,q1,#25 add r7,sp,#512 vld1.8 {d14-d15},[r7,: 128] vadd.i64 q9,q2,q7 vshl.i64 q1,q1,#26 vshr.s64 q10,q9,#26 vld1.8 {d0},[r6,: 64]! vadd.i64 q5,q5,q10 vand q9,q9,q1 vld1.8 {d16},[r6,: 64]! add r6,sp,#528 vld1.8 {d20-d21},[r6,: 128] vadd.i64 q11,q5,q10 vsub.i64 q2,q2,q9 vshr.s64 q9,q11,#25 vext.32 d12,d5,d4,#0 vand q11,q11,q4 vadd.i64 q0,q0,q9 vmov d19,d7 vadd.i64 q3,q0,q7 vsub.i64 q5,q5,q11 vshr.s64 q11,q3,#26 vext.32 d18,d11,d10,#0 vand q3,q3,q1 vadd.i64 q8,q8,q11 vadd.i64 q11,q8,q10 vsub.i64 q0,q0,q3 vshr.s64 q3,q11,#25 vand q11,q11,q4 vadd.i64 q3,q6,q3 vadd.i64 q6,q3,q7 vsub.i64 q8,q8,q11 vshr.s64 q11,q6,#26 vand q6,q6,q1 vadd.i64 q9,q9,q11 vadd.i64 d25,d19,d21 vsub.i64 q3,q3,q6 vshr.s64 d23,d25,#25 vand q4,q12,q4 vadd.i64 d21,d23,d23 vshl.i64 d25,d23,#4 vadd.i64 d21,d21,d23 vadd.i64 d25,d25,d21 vadd.i64 d4,d4,d25 vzip.i32 q0,q8 vadd.i64 d12,d4,d14 add r6,r8,#8 vst1.8 d0,[r6,: 64] vsub.i64 d19,d19,d9 add r6,r6,#16 vst1.8 d16,[r6,: 64] vshr.s64 d22,d12,#26 vand q0,q6,q1 vadd.i64 d10,d10,d22 vzip.i32 q3,q9 vsub.i64 d4,d4,d0 sub r6,r6,#8 vst1.8 d6,[r6,: 64] add r6,r6,#16 vst1.8 d18,[r6,: 64] vzip.i32 q2,q5 sub r6,r6,#32 vst1.8 d4,[r6,: 64] subs r5,r5,#1 bhi ._squaringloop ._skipsquaringloop: mov r2,r2 add r5,r3,#288 add r6,r3,#144 vmov.i32 q0,#19 vmov.i32 q1,#0 vmov.i32 q2,#1 vzip.i32 q1,q2 vld1.8 {d4-d5},[r5,: 128]! vld1.8 {d6-d7},[r5,: 128]! vld1.8 {d9},[r5,: 64] vld1.8 {d10-d11},[r2,: 128]! add r5,sp,#416 vld1.8 {d12-d13},[r2,: 128]! vmul.i32 q7,q2,q0 vld1.8 {d8},[r2,: 64] vext.32 d17,d11,d10,#1 vmul.i32 q9,q3,q0 vext.32 d16,d10,d8,#1 vshl.u32 q10,q5,q1 vext.32 d22,d14,d4,#1 vext.32 d24,d18,d6,#1 vshl.u32 q13,q6,q1 vshl.u32 d28,d8,d2 vrev64.i32 d22,d22 vmul.i32 d1,d9,d1 vrev64.i32 d24,d24 vext.32 d29,d8,d13,#1 vext.32 d0,d1,d9,#1 vrev64.i32 d0,d0 vext.32 d2,d9,d1,#1 vext.32 d23,d15,d5,#1 vmull.s32 q4,d20,d4 vrev64.i32 d23,d23 vmlal.s32 q4,d21,d1 vrev64.i32 d2,d2 vmlal.s32 q4,d26,d19 vext.32 d3,d5,d15,#1 vmlal.s32 q4,d27,d18 vrev64.i32 d3,d3 vmlal.s32 q4,d28,d15 vext.32 d14,d12,d11,#1 vmull.s32 q5,d16,d23 vext.32 d15,d13,d12,#1 vmlal.s32 q5,d17,d4 vst1.8 d8,[r5,: 64]! vmlal.s32 q5,d14,d1 vext.32 d12,d9,d8,#0 vmlal.s32 q5,d15,d19 vmov.i64 d13,#0 vmlal.s32 q5,d29,d18 vext.32 d25,d19,d7,#1 vmlal.s32 q6,d20,d5 vrev64.i32 d25,d25 vmlal.s32 q6,d21,d4 vst1.8 d11,[r5,: 64]! vmlal.s32 q6,d26,d1 vext.32 d9,d10,d10,#0 vmlal.s32 q6,d27,d19 vmov.i64 d8,#0 vmlal.s32 q6,d28,d18 vmlal.s32 q4,d16,d24 vmlal.s32 q4,d17,d5 vmlal.s32 q4,d14,d4 vst1.8 d12,[r5,: 64]! vmlal.s32 q4,d15,d1 vext.32 d10,d13,d12,#0 vmlal.s32 q4,d29,d19 vmov.i64 d11,#0 vmlal.s32 q5,d20,d6 vmlal.s32 q5,d21,d5 vmlal.s32 q5,d26,d4 vext.32 d13,d8,d8,#0 vmlal.s32 q5,d27,d1 vmov.i64 d12,#0 vmlal.s32 q5,d28,d19 vst1.8 d9,[r5,: 64]! vmlal.s32 q6,d16,d25 vmlal.s32 q6,d17,d6 vst1.8 d10,[r5,: 64] vmlal.s32 q6,d14,d5 vext.32 d8,d11,d10,#0 vmlal.s32 q6,d15,d4 vmov.i64 d9,#0 vmlal.s32 q6,d29,d1 vmlal.s32 q4,d20,d7 vmlal.s32 q4,d21,d6 vmlal.s32 q4,d26,d5 vext.32 d11,d12,d12,#0 vmlal.s32 q4,d27,d4 vmov.i64 d10,#0 vmlal.s32 q4,d28,d1 vmlal.s32 q5,d16,d0 sub r2,r5,#32 vmlal.s32 q5,d17,d7 vmlal.s32 q5,d14,d6 vext.32 d30,d9,d8,#0 vmlal.s32 q5,d15,d5 vld1.8 {d31},[r2,: 64]! vmlal.s32 q5,d29,d4 vmlal.s32 q15,d20,d0 vext.32 d0,d6,d18,#1 vmlal.s32 q15,d21,d25 vrev64.i32 d0,d0 vmlal.s32 q15,d26,d24 vext.32 d1,d7,d19,#1 vext.32 d7,d10,d10,#0 vmlal.s32 q15,d27,d23 vrev64.i32 d1,d1 vld1.8 {d6},[r2,: 64] vmlal.s32 q15,d28,d22 vmlal.s32 q3,d16,d4 add r2,r2,#24 vmlal.s32 q3,d17,d2 vext.32 d4,d31,d30,#0 vmov d17,d11 vmlal.s32 q3,d14,d1 vext.32 d11,d13,d13,#0 vext.32 d13,d30,d30,#0 vmlal.s32 q3,d15,d0 vext.32 d1,d8,d8,#0 vmlal.s32 q3,d29,d3 vld1.8 {d5},[r2,: 64] sub r2,r2,#16 vext.32 d10,d6,d6,#0 vmov.i32 q1,#0xffffffff vshl.i64 q4,q1,#25 add r5,sp,#512 vld1.8 {d14-d15},[r5,: 128] vadd.i64 q9,q2,q7 vshl.i64 q1,q1,#26 vshr.s64 q10,q9,#26 vld1.8 {d0},[r2,: 64]! vadd.i64 q5,q5,q10 vand q9,q9,q1 vld1.8 {d16},[r2,: 64]! add r2,sp,#528 vld1.8 {d20-d21},[r2,: 128] vadd.i64 q11,q5,q10 vsub.i64 q2,q2,q9 vshr.s64 q9,q11,#25 vext.32 d12,d5,d4,#0 vand q11,q11,q4 vadd.i64 q0,q0,q9 vmov d19,d7 vadd.i64 q3,q0,q7 vsub.i64 q5,q5,q11 vshr.s64 q11,q3,#26 vext.32 d18,d11,d10,#0 vand q3,q3,q1 vadd.i64 q8,q8,q11 vadd.i64 q11,q8,q10 vsub.i64 q0,q0,q3 vshr.s64 q3,q11,#25 vand q11,q11,q4 vadd.i64 q3,q6,q3 vadd.i64 q6,q3,q7 vsub.i64 q8,q8,q11 vshr.s64 q11,q6,#26 vand q6,q6,q1 vadd.i64 q9,q9,q11 vadd.i64 d25,d19,d21 vsub.i64 q3,q3,q6 vshr.s64 d23,d25,#25 vand q4,q12,q4 vadd.i64 d21,d23,d23 vshl.i64 d25,d23,#4 vadd.i64 d21,d21,d23 vadd.i64 d25,d25,d21 vadd.i64 d4,d4,d25 vzip.i32 q0,q8 vadd.i64 d12,d4,d14 add r2,r6,#8 vst1.8 d0,[r2,: 64] vsub.i64 d19,d19,d9 add r2,r2,#16 vst1.8 d16,[r2,: 64] vshr.s64 d22,d12,#26 vand q0,q6,q1 vadd.i64 d10,d10,d22 vzip.i32 q3,q9 vsub.i64 d4,d4,d0 sub r2,r2,#8 vst1.8 d6,[r2,: 64] add r2,r2,#16 vst1.8 d18,[r2,: 64] vzip.i32 q2,q5 sub r2,r2,#32 vst1.8 d4,[r2,: 64] cmp r4,#0 beq ._skippostcopy add r2,r3,#144 mov r4,r4 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d4},[r2,: 64] vst1.8 {d0-d1},[r4,: 128]! vst1.8 {d2-d3},[r4,: 128]! vst1.8 d4,[r4,: 64] ._skippostcopy: cmp r1,#1 bne ._skipfinalcopy add r2,r3,#288 add r4,r3,#144 vld1.8 {d0-d1},[r2,: 128]! vld1.8 {d2-d3},[r2,: 128]! vld1.8 {d4},[r2,: 64] vst1.8 {d0-d1},[r4,: 128]! vst1.8 {d2-d3},[r4,: 128]! vst1.8 d4,[r4,: 64] ._skipfinalcopy: add r1,r1,#1 cmp r1,#12 blo ._invertloop add r1,r3,#144 ldr r2,[r1],#4 ldr r3,[r1],#4 ldr r4,[r1],#4 ldr r5,[r1],#4 ldr r6,[r1],#4 ldr r7,[r1],#4 ldr r8,[r1],#4 ldr r9,[r1],#4 ldr r10,[r1],#4 ldr r1,[r1] add r11,r1,r1,LSL #4 add r11,r11,r1,LSL #1 add r11,r11,#16777216 mov r11,r11,ASR #25 add r11,r11,r2 mov r11,r11,ASR #26 add r11,r11,r3 mov r11,r11,ASR #25 add r11,r11,r4 mov r11,r11,ASR #26 add r11,r11,r5 mov r11,r11,ASR #25 add r11,r11,r6 mov r11,r11,ASR #26 add r11,r11,r7 mov r11,r11,ASR #25 add r11,r11,r8 mov r11,r11,ASR #26 add r11,r11,r9 mov r11,r11,ASR #25 add r11,r11,r10 mov r11,r11,ASR #26 add r11,r11,r1 mov r11,r11,ASR #25 add r2,r2,r11 add r2,r2,r11,LSL #1 add r2,r2,r11,LSL #4 mov r11,r2,ASR #26 add r3,r3,r11 sub r2,r2,r11,LSL #26 mov r11,r3,ASR #25 add r4,r4,r11 sub r3,r3,r11,LSL #25 mov r11,r4,ASR #26 add r5,r5,r11 sub r4,r4,r11,LSL #26 mov r11,r5,ASR #25 add r6,r6,r11 sub r5,r5,r11,LSL #25 mov r11,r6,ASR #26 add r7,r7,r11 sub r6,r6,r11,LSL #26 mov r11,r7,ASR #25 add r8,r8,r11 sub r7,r7,r11,LSL #25 mov r11,r8,ASR #26 add r9,r9,r11 sub r8,r8,r11,LSL #26 mov r11,r9,ASR #25 add r10,r10,r11 sub r9,r9,r11,LSL #25 mov r11,r10,ASR #26 add r1,r1,r11 sub r10,r10,r11,LSL #26 mov r11,r1,ASR #25 sub r1,r1,r11,LSL #25 add r2,r2,r3,LSL #26 mov r3,r3,LSR #6 add r3,r3,r4,LSL #19 mov r4,r4,LSR #13 add r4,r4,r5,LSL #13 mov r5,r5,LSR #19 add r5,r5,r6,LSL #6 add r6,r7,r8,LSL #25 mov r7,r8,LSR #7 add r7,r7,r9,LSL #19 mov r8,r9,LSR #13 add r8,r8,r10,LSL #12 mov r9,r10,LSR #20 add r1,r9,r1,LSL #6 str r2,[r0],#4 str r3,[r0],#4 str r4,[r0],#4 str r5,[r0],#4 str r6,[r0],#4 str r7,[r0],#4 str r8,[r0],#4 str r1,[r0] ldrd r4,[sp,#0] ldrd r6,[sp,#8] ldrd r8,[sp,#16] ldrd r10,[sp,#24] ldr r12,[sp,#480] ldr r14,[sp,#484] ldr r0,=0 mov sp,r12 vpop {q4,q5,q6,q7} bx lr #endif /* !OPENSSL_NO_ASM && __arm__ && !__APPLE__ */ ring-0.16.9/crypto/fipsmodule/aes/asm/aes-586.pl000064400000000000000000001360701353036607100174130ustar0000000000000000#! /usr/bin/env perl # Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # Version 4.3. # # You might fail to appreciate this module performance from the first # try. If compared to "vanilla" linux-ia32-icc target, i.e. considered # to be *the* best Intel C compiler without -KPIC, performance appears # to be virtually identical... But try to re-configure with shared # library support... Aha! Intel compiler "suddenly" lags behind by 30% # [on P4, more on others]:-) And if compared to position-independent # code generated by GNU C, this code performs *more* than *twice* as # fast! Yes, all this buzz about PIC means that unlike other hand- # coded implementations, this one was explicitly designed to be safe # to use even in shared library context... This also means that this # code isn't necessarily absolutely fastest "ever," because in order # to achieve position independence an extra register has to be # off-loaded to stack, which affects the benchmark result. # # Special note about instruction choice. Do you recall RC4_INT code # performing poorly on P4? It might be the time to figure out why. # RC4_INT code implies effective address calculations in base+offset*4 # form. Trouble is that it seems that offset scaling turned to be # critical path... At least eliminating scaling resulted in 2.8x RC4 # performance improvement [as you might recall]. As AES code is hungry # for scaling too, I [try to] avoid the latter by favoring off-by-2 # shifts and masking the result with 0xFF<<2 instead of "boring" 0xFF. # # As was shown by Dean Gaudet, the above note turned out to be # void. Performance improvement with off-by-2 shifts was observed on # intermediate implementation, which was spilling yet another register # to stack... Final offset*4 code below runs just a tad faster on P4, # but exhibits up to 10% improvement on other cores. # # Second version is "monolithic" replacement for aes_core.c, which in # addition to AES_[de|en]crypt implements AES_set_[de|en]cryption_key. # This made it possible to implement little-endian variant of the # algorithm without modifying the base C code. Motivating factor for # the undertaken effort was that it appeared that in tight IA-32 # register window little-endian flavor could achieve slightly higher # Instruction Level Parallelism, and it indeed resulted in up to 15% # better performance on most recent µ-archs... # # Third version adds AES_cbc_encrypt implementation, which resulted in # up to 40% performance improvement of CBC benchmark results. 40% was # observed on P4 core, where "overall" improvement coefficient, i.e. if # compared to PIC generated by GCC and in CBC mode, was observed to be # as large as 4x:-) CBC performance is virtually identical to ECB now # and on some platforms even better, e.g. 17.6 "small" cycles/byte on # Opteron, because certain function prologues and epilogues are # effectively taken out of the loop... # # Version 3.2 implements compressed tables and prefetch of these tables # in CBC[!] mode. Former means that 3/4 of table references are now # misaligned, which unfortunately has negative impact on elder IA-32 # implementations, Pentium suffered 30% penalty, PIII - 10%. # # Version 3.3 avoids L1 cache aliasing between stack frame and # S-boxes, and 3.4 - L1 cache aliasing even between key schedule. The # latter is achieved by copying the key schedule to controlled place in # stack. This unfortunately has rather strong impact on small block CBC # performance, ~2x deterioration on 16-byte block if compared to 3.3. # # Version 3.5 checks if there is L1 cache aliasing between user-supplied # key schedule and S-boxes and abstains from copying the former if # there is no. This allows end-user to consciously retain small block # performance by aligning key schedule in specific manner. # # Version 3.6 compresses Td4 to 256 bytes and prefetches it in ECB. # # Current ECB performance numbers for 128-bit key in CPU cycles per # processed byte [measure commonly used by AES benchmarkers] are: # # small footprint fully unrolled # P4 24 22 # AMD K8 20 19 # PIII 25 23 # Pentium 81 78 # # Version 3.7 reimplements outer rounds as "compact." Meaning that # first and last rounds reference compact 256 bytes S-box. This means # that first round consumes a lot more CPU cycles and that encrypt # and decrypt performance becomes asymmetric. Encrypt performance # drops by 10-12%, while decrypt - by 20-25%:-( 256 bytes S-box is # aggressively pre-fetched. # # Version 4.0 effectively rolls back to 3.6 and instead implements # additional set of functions, _[x86|sse]_AES_[en|de]crypt_compact, # which use exclusively 256 byte S-box. These functions are to be # called in modes not concealing plain text, such as ECB, or when # we're asked to process smaller amount of data [or unconditionally # on hyper-threading CPU]. Currently it's called unconditionally from # AES_[en|de]crypt, which affects all modes, but CBC. CBC routine # still needs to be modified to switch between slower and faster # mode when appropriate... But in either case benchmark landscape # changes dramatically and below numbers are CPU cycles per processed # byte for 128-bit key. # # ECB encrypt ECB decrypt CBC large chunk # P4 52[54] 83[95] 23 # AMD K8 46[41] 66[70] 18 # PIII 41[50] 60[77] 24 # Core 2 31[36] 45[64] 18.5 # Atom 76[100] 96[138] 60 # Pentium 115 150 77 # # Version 4.1 switches to compact S-box even in key schedule setup. # # Version 4.2 prefetches compact S-box in every SSE round or in other # words every cache-line is *guaranteed* to be accessed within ~50 # cycles window. Why just SSE? Because it's needed on hyper-threading # CPU! Which is also why it's prefetched with 64 byte stride. Best # part is that it has no negative effect on performance:-) # # Version 4.3 implements switch between compact and non-compact block # functions in AES_cbc_encrypt depending on how much data was asked # to be processed in one stroke. # ###################################################################### # Timing attacks are classified in two classes: synchronous when # attacker consciously initiates cryptographic operation and collects # timing data of various character afterwards, and asynchronous when # malicious code is executed on same CPU simultaneously with AES, # instruments itself and performs statistical analysis of this data. # # As far as synchronous attacks go the root to the AES timing # vulnerability is twofold. Firstly, of 256 S-box elements at most 160 # are referred to in single 128-bit block operation. Well, in C # implementation with 4 distinct tables it's actually as little as 40 # references per 256 elements table, but anyway... Secondly, even # though S-box elements are clustered into smaller amount of cache- # lines, smaller than 160 and even 40, it turned out that for certain # plain-text pattern[s] or simply put chosen plain-text and given key # few cache-lines remain unaccessed during block operation. Now, if # attacker can figure out this access pattern, he can deduct the key # [or at least part of it]. The natural way to mitigate this kind of # attacks is to minimize the amount of cache-lines in S-box and/or # prefetch them to ensure that every one is accessed for more uniform # timing. But note that *if* plain-text was concealed in such way that # input to block function is distributed *uniformly*, then attack # wouldn't apply. Now note that some encryption modes, most notably # CBC, do mask the plain-text in this exact way [secure cipher output # is distributed uniformly]. Yes, one still might find input that # would reveal the information about given key, but if amount of # candidate inputs to be tried is larger than amount of possible key # combinations then attack becomes infeasible. This is why revised # AES_cbc_encrypt "dares" to switch to larger S-box when larger chunk # of data is to be processed in one stroke. The current size limit of # 512 bytes is chosen to provide same [diminishingly low] probability # for cache-line to remain untouched in large chunk operation with # large S-box as for single block operation with compact S-box and # surely needs more careful consideration... # # As for asynchronous attacks. There are two flavours: attacker code # being interleaved with AES on hyper-threading CPU at *instruction* # level, and two processes time sharing single core. As for latter. # Two vectors. 1. Given that attacker process has higher priority, # yield execution to process performing AES just before timer fires # off the scheduler, immediately regain control of CPU and analyze the # cache state. For this attack to be efficient attacker would have to # effectively slow down the operation by several *orders* of magnitude, # by ratio of time slice to duration of handful of AES rounds, which # unlikely to remain unnoticed. Not to mention that this also means # that he would spend correspondingly more time to collect enough # statistical data to mount the attack. It's probably appropriate to # say that if adversary reckons that this attack is beneficial and # risks to be noticed, you probably have larger problems having him # mere opportunity. In other words suggested code design expects you # to preclude/mitigate this attack by overall system security design. # 2. Attacker manages to make his code interrupt driven. In order for # this kind of attack to be feasible, interrupt rate has to be high # enough, again comparable to duration of handful of AES rounds. But # is there interrupt source of such rate? Hardly, not even 1Gbps NIC # generates interrupts at such raging rate... # # And now back to the former, hyper-threading CPU or more specifically # Intel P4. Recall that asynchronous attack implies that malicious # code instruments itself. And naturally instrumentation granularity # has be noticeably lower than duration of codepath accessing S-box. # Given that all cache-lines are accessed during that time that is. # Current implementation accesses *all* cache-lines within ~50 cycles # window, which is actually *less* than RDTSC latency on Intel P4! $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output = pop; open OUT,">$output"; *STDOUT=*OUT; &asm_init($ARGV[0],$x86only = $ARGV[$#ARGV] eq "386"); &static_label("AES_Te"); $s0="eax"; $s1="ebx"; $s2="ecx"; $s3="edx"; $key="edi"; $acc="esi"; $tbl="ebp"; # stack frame layout in _[x86|sse]_AES_* routines, frame is allocated # by caller $__ra=&DWP(0,"esp"); # return address $__s0=&DWP(4,"esp"); # s0 backing store $__s1=&DWP(8,"esp"); # s1 backing store $__s2=&DWP(12,"esp"); # s2 backing store $__s3=&DWP(16,"esp"); # s3 backing store $__key=&DWP(20,"esp"); # pointer to key schedule $__end=&DWP(24,"esp"); # pointer to end of key schedule $__tbl=&DWP(28,"esp"); # %ebp backing store # stack frame layout in AES_[en|crypt] routines, which differs from # above by 4 and overlaps by %ebp backing store $_tbl=&DWP(24,"esp"); $_esp=&DWP(28,"esp"); sub _data_word() { my $i; while(defined($i=shift)) { &data_word($i,$i); } } $speed_limit=512; # chunks smaller than $speed_limit are # processed with compact routine in CBC mode $small_footprint=1; # $small_footprint=1 code is ~5% slower [on # recent µ-archs], but ~5 times smaller! # I favor compact code to minimize cache # contention and in hope to "collect" 5% back # in real-life applications... $vertical_spin=0; # shift "vertically" defaults to 0, because of # its proof-of-concept status... # Note that there is no decvert(), as well as last encryption round is # performed with "horizontal" shifts. This is because this "vertical" # implementation [one which groups shifts on a given $s[i] to form a # "column," unlike "horizontal" one, which groups shifts on different # $s[i] to form a "row"] is work in progress. It was observed to run # few percents faster on Intel cores, but not AMD. On AMD K8 core it's # whole 12% slower:-( So we face a trade-off... Shall it be resolved # some day? Till then the code is considered experimental and by # default remains dormant... sub encvert() { my ($te,@s) = @_; my ($v0,$v1) = ($acc,$key); &mov ($v0,$s[3]); # copy s3 &mov (&DWP(4,"esp"),$s[2]); # save s2 &mov ($v1,$s[0]); # copy s0 &mov (&DWP(8,"esp"),$s[1]); # save s1 &movz ($s[2],&HB($s[0])); &and ($s[0],0xFF); &mov ($s[0],&DWP(0,$te,$s[0],8)); # s0>>0 &shr ($v1,16); &mov ($s[3],&DWP(3,$te,$s[2],8)); # s0>>8 &movz ($s[1],&HB($v1)); &and ($v1,0xFF); &mov ($s[2],&DWP(2,$te,$v1,8)); # s0>>16 &mov ($v1,$v0); &mov ($s[1],&DWP(1,$te,$s[1],8)); # s0>>24 &and ($v0,0xFF); &xor ($s[3],&DWP(0,$te,$v0,8)); # s3>>0 &movz ($v0,&HB($v1)); &shr ($v1,16); &xor ($s[2],&DWP(3,$te,$v0,8)); # s3>>8 &movz ($v0,&HB($v1)); &and ($v1,0xFF); &xor ($s[1],&DWP(2,$te,$v1,8)); # s3>>16 &mov ($v1,&DWP(4,"esp")); # restore s2 &xor ($s[0],&DWP(1,$te,$v0,8)); # s3>>24 &mov ($v0,$v1); &and ($v1,0xFF); &xor ($s[2],&DWP(0,$te,$v1,8)); # s2>>0 &movz ($v1,&HB($v0)); &shr ($v0,16); &xor ($s[1],&DWP(3,$te,$v1,8)); # s2>>8 &movz ($v1,&HB($v0)); &and ($v0,0xFF); &xor ($s[0],&DWP(2,$te,$v0,8)); # s2>>16 &mov ($v0,&DWP(8,"esp")); # restore s1 &xor ($s[3],&DWP(1,$te,$v1,8)); # s2>>24 &mov ($v1,$v0); &and ($v0,0xFF); &xor ($s[1],&DWP(0,$te,$v0,8)); # s1>>0 &movz ($v0,&HB($v1)); &shr ($v1,16); &xor ($s[0],&DWP(3,$te,$v0,8)); # s1>>8 &movz ($v0,&HB($v1)); &and ($v1,0xFF); &xor ($s[3],&DWP(2,$te,$v1,8)); # s1>>16 &mov ($key,$__key); # reincarnate v1 as key &xor ($s[2],&DWP(1,$te,$v0,8)); # s1>>24 } # Another experimental routine, which features "horizontal spin," but # eliminates one reference to stack. Strangely enough runs slower... sub enchoriz() { my ($v0,$v1) = ($key,$acc); &movz ($v0,&LB($s0)); # 3, 2, 1, 0* &rotr ($s2,8); # 8,11,10, 9 &mov ($v1,&DWP(0,$te,$v0,8)); # 0 &movz ($v0,&HB($s1)); # 7, 6, 5*, 4 &rotr ($s3,16); # 13,12,15,14 &xor ($v1,&DWP(3,$te,$v0,8)); # 5 &movz ($v0,&HB($s2)); # 8,11,10*, 9 &rotr ($s0,16); # 1, 0, 3, 2 &xor ($v1,&DWP(2,$te,$v0,8)); # 10 &movz ($v0,&HB($s3)); # 13,12,15*,14 &xor ($v1,&DWP(1,$te,$v0,8)); # 15, t[0] collected &mov ($__s0,$v1); # t[0] saved &movz ($v0,&LB($s1)); # 7, 6, 5, 4* &shr ($s1,16); # -, -, 7, 6 &mov ($v1,&DWP(0,$te,$v0,8)); # 4 &movz ($v0,&LB($s3)); # 13,12,15,14* &xor ($v1,&DWP(2,$te,$v0,8)); # 14 &movz ($v0,&HB($s0)); # 1, 0, 3*, 2 &and ($s3,0xffff0000); # 13,12, -, - &xor ($v1,&DWP(1,$te,$v0,8)); # 3 &movz ($v0,&LB($s2)); # 8,11,10, 9* &or ($s3,$s1); # 13,12, 7, 6 &xor ($v1,&DWP(3,$te,$v0,8)); # 9, t[1] collected &mov ($s1,$v1); # s[1]=t[1] &movz ($v0,&LB($s0)); # 1, 0, 3, 2* &shr ($s2,16); # -, -, 8,11 &mov ($v1,&DWP(2,$te,$v0,8)); # 2 &movz ($v0,&HB($s3)); # 13,12, 7*, 6 &xor ($v1,&DWP(1,$te,$v0,8)); # 7 &movz ($v0,&HB($s2)); # -, -, 8*,11 &xor ($v1,&DWP(0,$te,$v0,8)); # 8 &mov ($v0,$s3); &shr ($v0,24); # 13 &xor ($v1,&DWP(3,$te,$v0,8)); # 13, t[2] collected &movz ($v0,&LB($s2)); # -, -, 8,11* &shr ($s0,24); # 1* &mov ($s2,&DWP(1,$te,$v0,8)); # 11 &xor ($s2,&DWP(3,$te,$s0,8)); # 1 &mov ($s0,$__s0); # s[0]=t[0] &movz ($v0,&LB($s3)); # 13,12, 7, 6* &shr ($s3,16); # , ,13,12 &xor ($s2,&DWP(2,$te,$v0,8)); # 6 &mov ($key,$__key); # reincarnate v0 as key &and ($s3,0xff); # , ,13,12* &mov ($s3,&DWP(0,$te,$s3,8)); # 12 &xor ($s3,$s2); # s[2]=t[3] collected &mov ($s2,$v1); # s[2]=t[2] } # More experimental code... SSE one... Even though this one eliminates # *all* references to stack, it's not faster... sub sse_encbody() { &movz ($acc,&LB("eax")); # 0 &mov ("ecx",&DWP(0,$tbl,$acc,8)); # 0 &pshufw ("mm2","mm0",0x0d); # 7, 6, 3, 2 &movz ("edx",&HB("eax")); # 1 &mov ("edx",&DWP(3,$tbl,"edx",8)); # 1 &shr ("eax",16); # 5, 4 &movz ($acc,&LB("ebx")); # 10 &xor ("ecx",&DWP(2,$tbl,$acc,8)); # 10 &pshufw ("mm6","mm4",0x08); # 13,12, 9, 8 &movz ($acc,&HB("ebx")); # 11 &xor ("edx",&DWP(1,$tbl,$acc,8)); # 11 &shr ("ebx",16); # 15,14 &movz ($acc,&HB("eax")); # 5 &xor ("ecx",&DWP(3,$tbl,$acc,8)); # 5 &movq ("mm3",QWP(16,$key)); &movz ($acc,&HB("ebx")); # 15 &xor ("ecx",&DWP(1,$tbl,$acc,8)); # 15 &movd ("mm0","ecx"); # t[0] collected &movz ($acc,&LB("eax")); # 4 &mov ("ecx",&DWP(0,$tbl,$acc,8)); # 4 &movd ("eax","mm2"); # 7, 6, 3, 2 &movz ($acc,&LB("ebx")); # 14 &xor ("ecx",&DWP(2,$tbl,$acc,8)); # 14 &movd ("ebx","mm6"); # 13,12, 9, 8 &movz ($acc,&HB("eax")); # 3 &xor ("ecx",&DWP(1,$tbl,$acc,8)); # 3 &movz ($acc,&HB("ebx")); # 9 &xor ("ecx",&DWP(3,$tbl,$acc,8)); # 9 &movd ("mm1","ecx"); # t[1] collected &movz ($acc,&LB("eax")); # 2 &mov ("ecx",&DWP(2,$tbl,$acc,8)); # 2 &shr ("eax",16); # 7, 6 &punpckldq ("mm0","mm1"); # t[0,1] collected &movz ($acc,&LB("ebx")); # 8 &xor ("ecx",&DWP(0,$tbl,$acc,8)); # 8 &shr ("ebx",16); # 13,12 &movz ($acc,&HB("eax")); # 7 &xor ("ecx",&DWP(1,$tbl,$acc,8)); # 7 &pxor ("mm0","mm3"); &movz ("eax",&LB("eax")); # 6 &xor ("edx",&DWP(2,$tbl,"eax",8)); # 6 &pshufw ("mm1","mm0",0x08); # 5, 4, 1, 0 &movz ($acc,&HB("ebx")); # 13 &xor ("ecx",&DWP(3,$tbl,$acc,8)); # 13 &xor ("ecx",&DWP(24,$key)); # t[2] &movd ("mm4","ecx"); # t[2] collected &movz ("ebx",&LB("ebx")); # 12 &xor ("edx",&DWP(0,$tbl,"ebx",8)); # 12 &shr ("ecx",16); &movd ("eax","mm1"); # 5, 4, 1, 0 &mov ("ebx",&DWP(28,$key)); # t[3] &xor ("ebx","edx"); &movd ("mm5","ebx"); # t[3] collected &and ("ebx",0xffff0000); &or ("ebx","ecx"); &punpckldq ("mm4","mm5"); # t[2,3] collected } ###################################################################### # "Compact" block function ###################################################################### sub enccompact() { my $Fn = \&mov; while ($#_>5) { pop(@_); $Fn=sub{}; } my ($i,$te,@s)=@_; my $tmp = $key; my $out = $i==3?$s[0]:$acc; # $Fn is used in first compact round and its purpose is to # void restoration of some values from stack, so that after # 4xenccompact with extra argument $key value is left there... if ($i==3) { &$Fn ($key,$__key); }##%edx else { &mov ($out,$s[0]); } &and ($out,0xFF); if ($i==1) { &shr ($s[0],16); }#%ebx[1] if ($i==2) { &shr ($s[0],24); }#%ecx[2] &movz ($out,&BP(-128,$te,$out,1)); if ($i==3) { $tmp=$s[1]; }##%eax &movz ($tmp,&HB($s[1])); &movz ($tmp,&BP(-128,$te,$tmp,1)); &shl ($tmp,8); &xor ($out,$tmp); if ($i==3) { $tmp=$s[2]; &mov ($s[1],$__s0); }##%ebx else { &mov ($tmp,$s[2]); &shr ($tmp,16); } if ($i==2) { &and ($s[1],0xFF); }#%edx[2] &and ($tmp,0xFF); &movz ($tmp,&BP(-128,$te,$tmp,1)); &shl ($tmp,16); &xor ($out,$tmp); if ($i==3) { $tmp=$s[3]; &mov ($s[2],$__s1); }##%ecx elsif($i==2){ &movz ($tmp,&HB($s[3])); }#%ebx[2] else { &mov ($tmp,$s[3]); &shr ($tmp,24); } &movz ($tmp,&BP(-128,$te,$tmp,1)); &shl ($tmp,24); &xor ($out,$tmp); if ($i<2) { &mov (&DWP(4+4*$i,"esp"),$out); } if ($i==3) { &mov ($s[3],$acc); } &comment(); } sub enctransform() { my @s = ($s0,$s1,$s2,$s3); my $i = shift; my $tmp = $tbl; my $r2 = $key ; &and ($tmp,$s[$i]); &lea ($r2,&DWP(0,$s[$i],$s[$i])); &mov ($acc,$tmp); &shr ($tmp,7); &and ($r2,0xfefefefe); &sub ($acc,$tmp); &mov ($tmp,$s[$i]); &and ($acc,0x1b1b1b1b); &rotr ($tmp,16); &xor ($acc,$r2); # r2 &mov ($r2,$s[$i]); &xor ($s[$i],$acc); # r0 ^ r2 &rotr ($r2,16+8); &xor ($acc,$tmp); &rotl ($s[$i],24); &xor ($acc,$r2); &mov ($tmp,0x80808080) if ($i!=1); &xor ($s[$i],$acc); # ROTATE(r2^r0,24) ^ r2 } &function_begin_B("_x86_AES_encrypt_compact"); # note that caller is expected to allocate stack frame for me! &mov ($__key,$key); # save key &xor ($s0,&DWP(0,$key)); # xor with key &xor ($s1,&DWP(4,$key)); &xor ($s2,&DWP(8,$key)); &xor ($s3,&DWP(12,$key)); &mov ($acc,&DWP(240,$key)); # load key->rounds &lea ($acc,&DWP(-2,$acc,$acc)); &lea ($acc,&DWP(0,$key,$acc,8)); &mov ($__end,$acc); # end of key schedule # prefetch Te4 &mov ($key,&DWP(0-128,$tbl)); &mov ($acc,&DWP(32-128,$tbl)); &mov ($key,&DWP(64-128,$tbl)); &mov ($acc,&DWP(96-128,$tbl)); &mov ($key,&DWP(128-128,$tbl)); &mov ($acc,&DWP(160-128,$tbl)); &mov ($key,&DWP(192-128,$tbl)); &mov ($acc,&DWP(224-128,$tbl)); &set_label("loop",16); &enccompact(0,$tbl,$s0,$s1,$s2,$s3,1); &enccompact(1,$tbl,$s1,$s2,$s3,$s0,1); &enccompact(2,$tbl,$s2,$s3,$s0,$s1,1); &enccompact(3,$tbl,$s3,$s0,$s1,$s2,1); &mov ($tbl,0x80808080); &enctransform(2); &enctransform(3); &enctransform(0); &enctransform(1); &mov ($key,$__key); &mov ($tbl,$__tbl); &add ($key,16); # advance rd_key &xor ($s0,&DWP(0,$key)); &xor ($s1,&DWP(4,$key)); &xor ($s2,&DWP(8,$key)); &xor ($s3,&DWP(12,$key)); &cmp ($key,$__end); &mov ($__key,$key); &jb (&label("loop")); &enccompact(0,$tbl,$s0,$s1,$s2,$s3); &enccompact(1,$tbl,$s1,$s2,$s3,$s0); &enccompact(2,$tbl,$s2,$s3,$s0,$s1); &enccompact(3,$tbl,$s3,$s0,$s1,$s2); &xor ($s0,&DWP(16,$key)); &xor ($s1,&DWP(20,$key)); &xor ($s2,&DWP(24,$key)); &xor ($s3,&DWP(28,$key)); &ret (); &function_end_B("_x86_AES_encrypt_compact"); ###################################################################### # "Compact" SSE block function. ###################################################################### # # Performance is not actually extraordinary in comparison to pure # x86 code. In particular encrypt performance is virtually the same. # Decrypt performance on the other hand is 15-20% better on newer # µ-archs [but we're thankful for *any* improvement here], and ~50% # better on PIII:-) And additionally on the pros side this code # eliminates redundant references to stack and thus relieves/ # minimizes the pressure on the memory bus. # # MMX register layout lsb # +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ # | mm4 | mm0 | # +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ # | s3 | s2 | s1 | s0 | # +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ # |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| # +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ # # Indexes translate as s[N/4]>>(8*(N%4)), e.g. 5 means s1>>8. # In this terms encryption and decryption "compact" permutation # matrices can be depicted as following: # # encryption lsb # decryption lsb # +----++----+----+----+----+ # +----++----+----+----+----+ # | t0 || 15 | 10 | 5 | 0 | # | t0 || 7 | 10 | 13 | 0 | # +----++----+----+----+----+ # +----++----+----+----+----+ # | t1 || 3 | 14 | 9 | 4 | # | t1 || 11 | 14 | 1 | 4 | # +----++----+----+----+----+ # +----++----+----+----+----+ # | t2 || 7 | 2 | 13 | 8 | # | t2 || 15 | 2 | 5 | 8 | # +----++----+----+----+----+ # +----++----+----+----+----+ # | t3 || 11 | 6 | 1 | 12 | # | t3 || 3 | 6 | 9 | 12 | # +----++----+----+----+----+ # +----++----+----+----+----+ # ###################################################################### # Why not xmm registers? Short answer. It was actually tested and # was not any faster, but *contrary*, most notably on Intel CPUs. # Longer answer. Main advantage of using mm registers is that movd # latency is lower, especially on Intel P4. While arithmetic # instructions are twice as many, they can be scheduled every cycle # and not every second one when they are operating on xmm register, # so that "arithmetic throughput" remains virtually the same. And # finally the code can be executed even on elder SSE-only CPUs:-) sub sse_enccompact() { &pshufw ("mm1","mm0",0x08); # 5, 4, 1, 0 &pshufw ("mm5","mm4",0x0d); # 15,14,11,10 &movd ("eax","mm1"); # 5, 4, 1, 0 &movd ("ebx","mm5"); # 15,14,11,10 &mov ($__key,$key); &movz ($acc,&LB("eax")); # 0 &movz ("edx",&HB("eax")); # 1 &pshufw ("mm2","mm0",0x0d); # 7, 6, 3, 2 &movz ("ecx",&BP(-128,$tbl,$acc,1)); # 0 &movz ($key,&LB("ebx")); # 10 &movz ("edx",&BP(-128,$tbl,"edx",1)); # 1 &shr ("eax",16); # 5, 4 &shl ("edx",8); # 1 &movz ($acc,&BP(-128,$tbl,$key,1)); # 10 &movz ($key,&HB("ebx")); # 11 &shl ($acc,16); # 10 &pshufw ("mm6","mm4",0x08); # 13,12, 9, 8 &or ("ecx",$acc); # 10 &movz ($acc,&BP(-128,$tbl,$key,1)); # 11 &movz ($key,&HB("eax")); # 5 &shl ($acc,24); # 11 &shr ("ebx",16); # 15,14 &or ("edx",$acc); # 11 &movz ($acc,&BP(-128,$tbl,$key,1)); # 5 &movz ($key,&HB("ebx")); # 15 &shl ($acc,8); # 5 &or ("ecx",$acc); # 5 &movz ($acc,&BP(-128,$tbl,$key,1)); # 15 &movz ($key,&LB("eax")); # 4 &shl ($acc,24); # 15 &or ("ecx",$acc); # 15 &movz ($acc,&BP(-128,$tbl,$key,1)); # 4 &movz ($key,&LB("ebx")); # 14 &movd ("eax","mm2"); # 7, 6, 3, 2 &movd ("mm0","ecx"); # t[0] collected &movz ("ecx",&BP(-128,$tbl,$key,1)); # 14 &movz ($key,&HB("eax")); # 3 &shl ("ecx",16); # 14 &movd ("ebx","mm6"); # 13,12, 9, 8 &or ("ecx",$acc); # 14 &movz ($acc,&BP(-128,$tbl,$key,1)); # 3 &movz ($key,&HB("ebx")); # 9 &shl ($acc,24); # 3 &or ("ecx",$acc); # 3 &movz ($acc,&BP(-128,$tbl,$key,1)); # 9 &movz ($key,&LB("ebx")); # 8 &shl ($acc,8); # 9 &shr ("ebx",16); # 13,12 &or ("ecx",$acc); # 9 &movz ($acc,&BP(-128,$tbl,$key,1)); # 8 &movz ($key,&LB("eax")); # 2 &shr ("eax",16); # 7, 6 &movd ("mm1","ecx"); # t[1] collected &movz ("ecx",&BP(-128,$tbl,$key,1)); # 2 &movz ($key,&HB("eax")); # 7 &shl ("ecx",16); # 2 &and ("eax",0xff); # 6 &or ("ecx",$acc); # 2 &punpckldq ("mm0","mm1"); # t[0,1] collected &movz ($acc,&BP(-128,$tbl,$key,1)); # 7 &movz ($key,&HB("ebx")); # 13 &shl ($acc,24); # 7 &and ("ebx",0xff); # 12 &movz ("eax",&BP(-128,$tbl,"eax",1)); # 6 &or ("ecx",$acc); # 7 &shl ("eax",16); # 6 &movz ($acc,&BP(-128,$tbl,$key,1)); # 13 &or ("edx","eax"); # 6 &shl ($acc,8); # 13 &movz ("ebx",&BP(-128,$tbl,"ebx",1)); # 12 &or ("ecx",$acc); # 13 &or ("edx","ebx"); # 12 &mov ($key,$__key); &movd ("mm4","ecx"); # t[2] collected &movd ("mm5","edx"); # t[3] collected &punpckldq ("mm4","mm5"); # t[2,3] collected } &function_begin_B("_sse_AES_encrypt_compact"); &pxor ("mm0",&QWP(0,$key)); # 7, 6, 5, 4, 3, 2, 1, 0 &pxor ("mm4",&QWP(8,$key)); # 15,14,13,12,11,10, 9, 8 # note that caller is expected to allocate stack frame for me! &mov ($acc,&DWP(240,$key)); # load key->rounds &lea ($acc,&DWP(-2,$acc,$acc)); &lea ($acc,&DWP(0,$key,$acc,8)); &mov ($__end,$acc); # end of key schedule &mov ($s0,0x1b1b1b1b); # magic constant &mov (&DWP(8,"esp"),$s0); &mov (&DWP(12,"esp"),$s0); # prefetch Te4 &mov ($s0,&DWP(0-128,$tbl)); &mov ($s1,&DWP(32-128,$tbl)); &mov ($s2,&DWP(64-128,$tbl)); &mov ($s3,&DWP(96-128,$tbl)); &mov ($s0,&DWP(128-128,$tbl)); &mov ($s1,&DWP(160-128,$tbl)); &mov ($s2,&DWP(192-128,$tbl)); &mov ($s3,&DWP(224-128,$tbl)); &set_label("loop",16); &sse_enccompact(); &add ($key,16); &cmp ($key,$__end); &ja (&label("out")); &movq ("mm2",&QWP(8,"esp")); &pxor ("mm3","mm3"); &pxor ("mm7","mm7"); &movq ("mm1","mm0"); &movq ("mm5","mm4"); # r0 &pcmpgtb("mm3","mm0"); &pcmpgtb("mm7","mm4"); &pand ("mm3","mm2"); &pand ("mm7","mm2"); &pshufw ("mm2","mm0",0xb1); &pshufw ("mm6","mm4",0xb1);# ROTATE(r0,16) &paddb ("mm0","mm0"); &paddb ("mm4","mm4"); &pxor ("mm0","mm3"); &pxor ("mm4","mm7"); # = r2 &pshufw ("mm3","mm2",0xb1); &pshufw ("mm7","mm6",0xb1);# r0 &pxor ("mm1","mm0"); &pxor ("mm5","mm4"); # r0^r2 &pxor ("mm0","mm2"); &pxor ("mm4","mm6"); # ^= ROTATE(r0,16) &movq ("mm2","mm3"); &movq ("mm6","mm7"); &pslld ("mm3",8); &pslld ("mm7",8); &psrld ("mm2",24); &psrld ("mm6",24); &pxor ("mm0","mm3"); &pxor ("mm4","mm7"); # ^= r0<<8 &pxor ("mm0","mm2"); &pxor ("mm4","mm6"); # ^= r0>>24 &movq ("mm3","mm1"); &movq ("mm7","mm5"); &movq ("mm2",&QWP(0,$key)); &movq ("mm6",&QWP(8,$key)); &psrld ("mm1",8); &psrld ("mm5",8); &mov ($s0,&DWP(0-128,$tbl)); &pslld ("mm3",24); &pslld ("mm7",24); &mov ($s1,&DWP(64-128,$tbl)); &pxor ("mm0","mm1"); &pxor ("mm4","mm5"); # ^= (r2^r0)<<8 &mov ($s2,&DWP(128-128,$tbl)); &pxor ("mm0","mm3"); &pxor ("mm4","mm7"); # ^= (r2^r0)>>24 &mov ($s3,&DWP(192-128,$tbl)); &pxor ("mm0","mm2"); &pxor ("mm4","mm6"); &jmp (&label("loop")); &set_label("out",16); &pxor ("mm0",&QWP(0,$key)); &pxor ("mm4",&QWP(8,$key)); &ret (); &function_end_B("_sse_AES_encrypt_compact"); &set_label("AES_Te",64); # Yes! I keep it in the code segment! &_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6); &_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591); &_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56); &_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec); &_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa); &_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb); &_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45); &_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b); &_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c); &_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83); &_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9); &_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a); &_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d); &_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f); &_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df); &_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea); &_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34); &_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b); &_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d); &_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413); &_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1); &_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6); &_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972); &_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85); &_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed); &_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511); &_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe); &_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b); &_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05); &_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1); &_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142); &_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf); &_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3); &_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e); &_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a); &_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6); &_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3); &_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b); &_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428); &_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad); &_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14); &_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8); &_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4); &_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2); &_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda); &_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949); &_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf); &_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810); &_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c); &_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697); &_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e); &_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f); &_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc); &_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c); &_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969); &_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27); &_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122); &_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433); &_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9); &_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5); &_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a); &_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0); &_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e); &_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c); #Te4 # four copies of Te4 to choose from to avoid L1 aliasing &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); #rcon: &data_word(0x00000001, 0x00000002, 0x00000004, 0x00000008); &data_word(0x00000010, 0x00000020, 0x00000040, 0x00000080); &data_word(0x0000001b, 0x00000036, 0x00000000, 0x00000000); &data_word(0x00000000, 0x00000000, 0x00000000, 0x00000000); # void GFp_aes_nohw_encrypt (const void *inp,void *out,const AES_KEY *key); &function_begin("GFp_aes_nohw_encrypt"); &mov ($acc,&wparam(0)); # load inp &mov ($key,&wparam(2)); # load key &mov ($s0,"esp"); &sub ("esp",36); &and ("esp",-64); # align to cache-line # place stack frame just "above" the key schedule &lea ($s1,&DWP(-64-63,$key)); &sub ($s1,"esp"); &neg ($s1); &and ($s1,0x3C0); # modulo 1024, but aligned to cache-line &sub ("esp",$s1); &add ("esp",4); # 4 is reserved for caller's return address &mov ($_esp,$s0); # save stack pointer &call (&label("pic_point")); # make it PIC! &set_label("pic_point"); &blindpop($tbl); &picmeup($s0,"GFp_ia32cap_P",$tbl,&label("pic_point")) if (!$x86only); &lea ($tbl,&DWP(&label("AES_Te")."-".&label("pic_point"),$tbl)); # pick Te4 copy which can't "overlap" with stack frame or key schedule &lea ($s1,&DWP(768-4,"esp")); &sub ($s1,$tbl); &and ($s1,0x300); &lea ($tbl,&DWP(2048+128,$tbl,$s1)); if (!$x86only) { &bt (&DWP(0,$s0),25); # check for SSE bit &jnc (&label("x86")); &movq ("mm0",&QWP(0,$acc)); &movq ("mm4",&QWP(8,$acc)); &call ("_sse_AES_encrypt_compact"); &mov ("esp",$_esp); # restore stack pointer &mov ($acc,&wparam(1)); # load out &movq (&QWP(0,$acc),"mm0"); # write output data &movq (&QWP(8,$acc),"mm4"); &emms (); &function_end_A(); } &set_label("x86",16); &mov ($_tbl,$tbl); &mov ($s0,&DWP(0,$acc)); # load input data &mov ($s1,&DWP(4,$acc)); &mov ($s2,&DWP(8,$acc)); &mov ($s3,&DWP(12,$acc)); &call ("_x86_AES_encrypt_compact"); &mov ("esp",$_esp); # restore stack pointer &mov ($acc,&wparam(1)); # load out &mov (&DWP(0,$acc),$s0); # write output data &mov (&DWP(4,$acc),$s1); &mov (&DWP(8,$acc),$s2); &mov (&DWP(12,$acc),$s3); &function_end("GFp_aes_nohw_encrypt"); #------------------------------------------------------------------# sub enckey() { &movz ("esi",&LB("edx")); # rk[i]>>0 &movz ("ebx",&BP(-128,$tbl,"esi",1)); &movz ("esi",&HB("edx")); # rk[i]>>8 &shl ("ebx",24); &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &shr ("edx",16); &movz ("esi",&LB("edx")); # rk[i]>>16 &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &movz ("esi",&HB("edx")); # rk[i]>>24 &shl ("ebx",8); &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &shl ("ebx",16); &xor ("eax","ebx"); &xor ("eax",&DWP(1024-128,$tbl,"ecx",4)); # rcon } &function_begin("_x86_AES_set_encrypt_key"); &mov ("esi",&wparam(1)); # user supplied key &mov ("edi",&wparam(3)); # private key schedule &test ("esi",-1); &jz (&label("badpointer")); &test ("edi",-1); &jz (&label("badpointer")); &call (&label("pic_point")); &set_label("pic_point"); &blindpop($tbl); &lea ($tbl,&DWP(&label("AES_Te")."-".&label("pic_point"),$tbl)); &lea ($tbl,&DWP(2048+128,$tbl)); # prefetch Te4 &mov ("eax",&DWP(0-128,$tbl)); &mov ("ebx",&DWP(32-128,$tbl)); &mov ("ecx",&DWP(64-128,$tbl)); &mov ("edx",&DWP(96-128,$tbl)); &mov ("eax",&DWP(128-128,$tbl)); &mov ("ebx",&DWP(160-128,$tbl)); &mov ("ecx",&DWP(192-128,$tbl)); &mov ("edx",&DWP(224-128,$tbl)); &mov ("ecx",&wparam(2)); # number of bits in key &cmp ("ecx",128); &je (&label("10rounds")); &cmp ("ecx",256); &je (&label("14rounds")); &mov ("eax",-2); # invalid number of bits &jmp (&label("exit")); &set_label("10rounds"); &mov ("eax",&DWP(0,"esi")); # copy first 4 dwords &mov ("ebx",&DWP(4,"esi")); &mov ("ecx",&DWP(8,"esi")); &mov ("edx",&DWP(12,"esi")); &mov (&DWP(0,"edi"),"eax"); &mov (&DWP(4,"edi"),"ebx"); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &xor ("ecx","ecx"); &jmp (&label("10shortcut")); &align (4); &set_label("10loop"); &mov ("eax",&DWP(0,"edi")); # rk[0] &mov ("edx",&DWP(12,"edi")); # rk[3] &set_label("10shortcut"); &enckey (); &mov (&DWP(16,"edi"),"eax"); # rk[4] &xor ("eax",&DWP(4,"edi")); &mov (&DWP(20,"edi"),"eax"); # rk[5] &xor ("eax",&DWP(8,"edi")); &mov (&DWP(24,"edi"),"eax"); # rk[6] &xor ("eax",&DWP(12,"edi")); &mov (&DWP(28,"edi"),"eax"); # rk[7] &inc ("ecx"); &add ("edi",16); &cmp ("ecx",10); &jl (&label("10loop")); &mov (&DWP(80,"edi"),10); # setup number of rounds &xor ("eax","eax"); &jmp (&label("exit")); &set_label("14rounds"); &mov ("eax",&DWP(0,"esi")); # copy first 8 dwords &mov ("ebx",&DWP(4,"esi")); &mov ("ecx",&DWP(8,"esi")); &mov ("edx",&DWP(12,"esi")); &mov (&DWP(0,"edi"),"eax"); &mov (&DWP(4,"edi"),"ebx"); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &mov ("eax",&DWP(16,"esi")); &mov ("ebx",&DWP(20,"esi")); &mov ("ecx",&DWP(24,"esi")); &mov ("edx",&DWP(28,"esi")); &mov (&DWP(16,"edi"),"eax"); &mov (&DWP(20,"edi"),"ebx"); &mov (&DWP(24,"edi"),"ecx"); &mov (&DWP(28,"edi"),"edx"); &xor ("ecx","ecx"); &jmp (&label("14shortcut")); &align (4); &set_label("14loop"); &mov ("edx",&DWP(28,"edi")); # rk[7] &set_label("14shortcut"); &mov ("eax",&DWP(0,"edi")); # rk[0] &enckey (); &mov (&DWP(32,"edi"),"eax"); # rk[8] &xor ("eax",&DWP(4,"edi")); &mov (&DWP(36,"edi"),"eax"); # rk[9] &xor ("eax",&DWP(8,"edi")); &mov (&DWP(40,"edi"),"eax"); # rk[10] &xor ("eax",&DWP(12,"edi")); &mov (&DWP(44,"edi"),"eax"); # rk[11] &cmp ("ecx",6); &je (&label("14break")); &inc ("ecx"); &mov ("edx","eax"); &mov ("eax",&DWP(16,"edi")); # rk[4] &movz ("esi",&LB("edx")); # rk[11]>>0 &movz ("ebx",&BP(-128,$tbl,"esi",1)); &movz ("esi",&HB("edx")); # rk[11]>>8 &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &shr ("edx",16); &shl ("ebx",8); &movz ("esi",&LB("edx")); # rk[11]>>16 &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &movz ("esi",&HB("edx")); # rk[11]>>24 &shl ("ebx",16); &xor ("eax","ebx"); &movz ("ebx",&BP(-128,$tbl,"esi",1)); &shl ("ebx",24); &xor ("eax","ebx"); &mov (&DWP(48,"edi"),"eax"); # rk[12] &xor ("eax",&DWP(20,"edi")); &mov (&DWP(52,"edi"),"eax"); # rk[13] &xor ("eax",&DWP(24,"edi")); &mov (&DWP(56,"edi"),"eax"); # rk[14] &xor ("eax",&DWP(28,"edi")); &mov (&DWP(60,"edi"),"eax"); # rk[15] &add ("edi",32); &jmp (&label("14loop")); &set_label("14break"); &mov (&DWP(48,"edi"),14); # setup number of rounds &xor ("eax","eax"); &jmp (&label("exit")); &set_label("badpointer"); &mov ("eax",-1); &set_label("exit"); &function_end("_x86_AES_set_encrypt_key"); # int GFp_aes_nohw_set_encrypt_key(const unsigned char *userKey, const int bits, # AES_KEY *key) &function_begin_B("GFp_aes_nohw_set_encrypt_key"); &call ("_x86_AES_set_encrypt_key"); &ret (); &function_end_B("GFp_aes_nohw_set_encrypt_key"); &asciz("AES for x86, CRYPTOGAMS by "); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/aes-armv4.pl000064400000000000000000000460021352416253600201200ustar0000000000000000#! /usr/bin/env perl # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # AES for ARMv4 # January 2007. # # Code uses single 1K S-box and is >2 times faster than code generated # by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which # allows to merge logical or arithmetic operation with shift or rotate # in one instruction and emit combined result every cycle. The module # is endian-neutral. The performance is ~42 cycles/byte for 128-bit # key [on single-issue Xscale PXA250 core]. # May 2007. # # AES_set_[en|de]crypt_key is added. # July 2010. # # Rescheduling for dual-issue pipeline resulted in 12% improvement on # Cortex A8 core and ~25 cycles per byte processed with 128-bit key. # February 2011. # # Profiler-assisted and platform-specific optimization resulted in 16% # improvement on Cortex A8 core and ~21.5 cycles per byte. $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $s0="r0"; $s1="r1"; $s2="r2"; $s3="r3"; $t1="r4"; $t2="r5"; $t3="r6"; $i1="r7"; $i2="r8"; $i3="r9"; $tbl="r10"; $key="r11"; $rounds="r12"; $code=<<___; #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 AES @ instructions are in aesv8-armx.pl.) .arch armv7-a .text #if defined(__thumb2__) && !defined(__APPLE__) .syntax unified .thumb #else .code 32 #undef __thumb2__ #endif .type AES_Te,%object .align 5 AES_Te: .word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d .word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554 .word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d .word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a .word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87 .word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b .word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea .word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b .word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a .word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f .word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108 .word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f .word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e .word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5 .word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d .word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f .word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e .word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb .word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce .word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497 .word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c .word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed .word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b .word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a .word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16 .word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594 .word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81 .word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3 .word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a .word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504 .word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163 .word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d .word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f .word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739 .word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47 .word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395 .word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f .word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883 .word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c .word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76 .word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e .word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4 .word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6 .word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b .word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7 .word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0 .word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25 .word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818 .word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72 .word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651 .word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21 .word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85 .word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa .word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12 .word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0 .word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9 .word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133 .word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7 .word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920 .word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a .word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17 .word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8 .word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11 .word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a @ Te4[256] .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 @ rcon[] .word 0x01000000, 0x02000000, 0x04000000, 0x08000000 .word 0x10000000, 0x20000000, 0x40000000, 0x80000000 .word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0 .size AES_Te,.-AES_Te @ void GFp_aes_nohw_encrypt(const unsigned char *in, unsigned char *out, @ const AES_KEY *key) { .global GFp_aes_nohw_encrypt .type GFp_aes_nohw_encrypt,%function .align 5 GFp_aes_nohw_encrypt: #ifndef __thumb2__ sub r3,pc,#8 @ GFp_aes_nohw_encrypt #else adr r3,. #endif stmdb sp!,{r1,r4-r12,lr} #if defined(__thumb2__) || defined(__APPLE__) adr $tbl,AES_Te #else sub $tbl,r3,#GFp_aes_nohw_encrypt-AES_Te @ Te #endif mov $rounds,r0 @ inp mov $key,r2 #if __ARM_ARCH__<7 ldrb $s0,[$rounds,#3] @ load input data in endian-neutral ldrb $t1,[$rounds,#2] @ manner... ldrb $t2,[$rounds,#1] ldrb $t3,[$rounds,#0] orr $s0,$s0,$t1,lsl#8 ldrb $s1,[$rounds,#7] orr $s0,$s0,$t2,lsl#16 ldrb $t1,[$rounds,#6] orr $s0,$s0,$t3,lsl#24 ldrb $t2,[$rounds,#5] ldrb $t3,[$rounds,#4] orr $s1,$s1,$t1,lsl#8 ldrb $s2,[$rounds,#11] orr $s1,$s1,$t2,lsl#16 ldrb $t1,[$rounds,#10] orr $s1,$s1,$t3,lsl#24 ldrb $t2,[$rounds,#9] ldrb $t3,[$rounds,#8] orr $s2,$s2,$t1,lsl#8 ldrb $s3,[$rounds,#15] orr $s2,$s2,$t2,lsl#16 ldrb $t1,[$rounds,#14] orr $s2,$s2,$t3,lsl#24 ldrb $t2,[$rounds,#13] ldrb $t3,[$rounds,#12] orr $s3,$s3,$t1,lsl#8 orr $s3,$s3,$t2,lsl#16 orr $s3,$s3,$t3,lsl#24 #else ldr $s0,[$rounds,#0] ldr $s1,[$rounds,#4] ldr $s2,[$rounds,#8] ldr $s3,[$rounds,#12] #ifdef __ARMEL__ rev $s0,$s0 rev $s1,$s1 rev $s2,$s2 rev $s3,$s3 #endif #endif bl _armv4_AES_encrypt ldr $rounds,[sp],#4 @ pop out #if __ARM_ARCH__>=7 #ifdef __ARMEL__ rev $s0,$s0 rev $s1,$s1 rev $s2,$s2 rev $s3,$s3 #endif str $s0,[$rounds,#0] str $s1,[$rounds,#4] str $s2,[$rounds,#8] str $s3,[$rounds,#12] #else mov $t1,$s0,lsr#24 @ write output in endian-neutral mov $t2,$s0,lsr#16 @ manner... mov $t3,$s0,lsr#8 strb $t1,[$rounds,#0] strb $t2,[$rounds,#1] mov $t1,$s1,lsr#24 strb $t3,[$rounds,#2] mov $t2,$s1,lsr#16 strb $s0,[$rounds,#3] mov $t3,$s1,lsr#8 strb $t1,[$rounds,#4] strb $t2,[$rounds,#5] mov $t1,$s2,lsr#24 strb $t3,[$rounds,#6] mov $t2,$s2,lsr#16 strb $s1,[$rounds,#7] mov $t3,$s2,lsr#8 strb $t1,[$rounds,#8] strb $t2,[$rounds,#9] mov $t1,$s3,lsr#24 strb $t3,[$rounds,#10] mov $t2,$s3,lsr#16 strb $s2,[$rounds,#11] mov $t3,$s3,lsr#8 strb $t1,[$rounds,#12] strb $t2,[$rounds,#13] strb $t3,[$rounds,#14] strb $s3,[$rounds,#15] #endif #if __ARM_ARCH__>=5 ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_aes_nohw_encrypt,.-GFp_aes_nohw_encrypt .type _armv4_AES_encrypt,%function .align 2 _armv4_AES_encrypt: str lr,[sp,#-4]! @ push lr ldmia $key!,{$t1-$i1} eor $s0,$s0,$t1 ldr $rounds,[$key,#240-16] eor $s1,$s1,$t2 eor $s2,$s2,$t3 eor $s3,$s3,$i1 sub $rounds,$rounds,#1 mov lr,#255 and $i1,lr,$s0 and $i2,lr,$s0,lsr#8 and $i3,lr,$s0,lsr#16 mov $s0,$s0,lsr#24 .Lenc_loop: ldr $t1,[$tbl,$i1,lsl#2] @ Te3[s0>>0] and $i1,lr,$s1,lsr#16 @ i0 ldr $t2,[$tbl,$i2,lsl#2] @ Te2[s0>>8] and $i2,lr,$s1 ldr $t3,[$tbl,$i3,lsl#2] @ Te1[s0>>16] and $i3,lr,$s1,lsr#8 ldr $s0,[$tbl,$s0,lsl#2] @ Te0[s0>>24] mov $s1,$s1,lsr#24 ldr $i1,[$tbl,$i1,lsl#2] @ Te1[s1>>16] ldr $i2,[$tbl,$i2,lsl#2] @ Te3[s1>>0] ldr $i3,[$tbl,$i3,lsl#2] @ Te2[s1>>8] eor $s0,$s0,$i1,ror#8 ldr $s1,[$tbl,$s1,lsl#2] @ Te0[s1>>24] and $i1,lr,$s2,lsr#8 @ i0 eor $t2,$t2,$i2,ror#8 and $i2,lr,$s2,lsr#16 @ i1 eor $t3,$t3,$i3,ror#8 and $i3,lr,$s2 ldr $i1,[$tbl,$i1,lsl#2] @ Te2[s2>>8] eor $s1,$s1,$t1,ror#24 ldr $i2,[$tbl,$i2,lsl#2] @ Te1[s2>>16] mov $s2,$s2,lsr#24 ldr $i3,[$tbl,$i3,lsl#2] @ Te3[s2>>0] eor $s0,$s0,$i1,ror#16 ldr $s2,[$tbl,$s2,lsl#2] @ Te0[s2>>24] and $i1,lr,$s3 @ i0 eor $s1,$s1,$i2,ror#8 and $i2,lr,$s3,lsr#8 @ i1 eor $t3,$t3,$i3,ror#16 and $i3,lr,$s3,lsr#16 @ i2 ldr $i1,[$tbl,$i1,lsl#2] @ Te3[s3>>0] eor $s2,$s2,$t2,ror#16 ldr $i2,[$tbl,$i2,lsl#2] @ Te2[s3>>8] mov $s3,$s3,lsr#24 ldr $i3,[$tbl,$i3,lsl#2] @ Te1[s3>>16] eor $s0,$s0,$i1,ror#24 ldr $i1,[$key],#16 eor $s1,$s1,$i2,ror#16 ldr $s3,[$tbl,$s3,lsl#2] @ Te0[s3>>24] eor $s2,$s2,$i3,ror#8 ldr $t1,[$key,#-12] eor $s3,$s3,$t3,ror#8 ldr $t2,[$key,#-8] eor $s0,$s0,$i1 ldr $t3,[$key,#-4] and $i1,lr,$s0 eor $s1,$s1,$t1 and $i2,lr,$s0,lsr#8 eor $s2,$s2,$t2 and $i3,lr,$s0,lsr#16 eor $s3,$s3,$t3 mov $s0,$s0,lsr#24 subs $rounds,$rounds,#1 bne .Lenc_loop add $tbl,$tbl,#2 ldrb $t1,[$tbl,$i1,lsl#2] @ Te4[s0>>0] and $i1,lr,$s1,lsr#16 @ i0 ldrb $t2,[$tbl,$i2,lsl#2] @ Te4[s0>>8] and $i2,lr,$s1 ldrb $t3,[$tbl,$i3,lsl#2] @ Te4[s0>>16] and $i3,lr,$s1,lsr#8 ldrb $s0,[$tbl,$s0,lsl#2] @ Te4[s0>>24] mov $s1,$s1,lsr#24 ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s1>>16] ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s1>>0] ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s1>>8] eor $s0,$i1,$s0,lsl#8 ldrb $s1,[$tbl,$s1,lsl#2] @ Te4[s1>>24] and $i1,lr,$s2,lsr#8 @ i0 eor $t2,$i2,$t2,lsl#8 and $i2,lr,$s2,lsr#16 @ i1 eor $t3,$i3,$t3,lsl#8 and $i3,lr,$s2 ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s2>>8] eor $s1,$t1,$s1,lsl#24 ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s2>>16] mov $s2,$s2,lsr#24 ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s2>>0] eor $s0,$i1,$s0,lsl#8 ldrb $s2,[$tbl,$s2,lsl#2] @ Te4[s2>>24] and $i1,lr,$s3 @ i0 eor $s1,$s1,$i2,lsl#16 and $i2,lr,$s3,lsr#8 @ i1 eor $t3,$i3,$t3,lsl#8 and $i3,lr,$s3,lsr#16 @ i2 ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s3>>0] eor $s2,$t2,$s2,lsl#24 ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s3>>8] mov $s3,$s3,lsr#24 ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s3>>16] eor $s0,$i1,$s0,lsl#8 ldr $i1,[$key,#0] ldrb $s3,[$tbl,$s3,lsl#2] @ Te4[s3>>24] eor $s1,$s1,$i2,lsl#8 ldr $t1,[$key,#4] eor $s2,$s2,$i3,lsl#16 ldr $t2,[$key,#8] eor $s3,$t3,$s3,lsl#24 ldr $t3,[$key,#12] eor $s0,$s0,$i1 eor $s1,$s1,$t1 eor $s2,$s2,$t2 eor $s3,$s3,$t3 sub $tbl,$tbl,#2 ldr pc,[sp],#4 @ pop and return .size _armv4_AES_encrypt,.-_armv4_AES_encrypt .global GFp_aes_nohw_set_encrypt_key .type GFp_aes_nohw_set_encrypt_key,%function .align 5 GFp_aes_nohw_set_encrypt_key: _armv4_AES_set_encrypt_key: #ifndef __thumb2__ sub r3,pc,#8 @ GFp_aes_nohw_set_encrypt_key #else adr r3,. #endif teq r0,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq .Labrt teq r2,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq .Labrt teq r1,#128 beq .Lok teq r1,#256 #ifdef __thumb2__ itt ne @ Thumb2 thing, sanity check in ARM #endif movne r0,#-1 bne .Labrt .Lok: stmdb sp!,{r4-r12,lr} mov $rounds,r0 @ inp mov lr,r1 @ bits mov $key,r2 @ key #if defined(__thumb2__) || defined(__APPLE__) adr $tbl,AES_Te+1024 @ Te4 #else sub $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4 #endif #if __ARM_ARCH__<7 ldrb $s0,[$rounds,#3] @ load input data in endian-neutral ldrb $t1,[$rounds,#2] @ manner... ldrb $t2,[$rounds,#1] ldrb $t3,[$rounds,#0] orr $s0,$s0,$t1,lsl#8 ldrb $s1,[$rounds,#7] orr $s0,$s0,$t2,lsl#16 ldrb $t1,[$rounds,#6] orr $s0,$s0,$t3,lsl#24 ldrb $t2,[$rounds,#5] ldrb $t3,[$rounds,#4] orr $s1,$s1,$t1,lsl#8 ldrb $s2,[$rounds,#11] orr $s1,$s1,$t2,lsl#16 ldrb $t1,[$rounds,#10] orr $s1,$s1,$t3,lsl#24 ldrb $t2,[$rounds,#9] ldrb $t3,[$rounds,#8] orr $s2,$s2,$t1,lsl#8 ldrb $s3,[$rounds,#15] orr $s2,$s2,$t2,lsl#16 ldrb $t1,[$rounds,#14] orr $s2,$s2,$t3,lsl#24 ldrb $t2,[$rounds,#13] ldrb $t3,[$rounds,#12] orr $s3,$s3,$t1,lsl#8 str $s0,[$key],#16 orr $s3,$s3,$t2,lsl#16 str $s1,[$key,#-12] orr $s3,$s3,$t3,lsl#24 str $s2,[$key,#-8] str $s3,[$key,#-4] #else ldr $s0,[$rounds,#0] ldr $s1,[$rounds,#4] ldr $s2,[$rounds,#8] ldr $s3,[$rounds,#12] #ifdef __ARMEL__ rev $s0,$s0 rev $s1,$s1 rev $s2,$s2 rev $s3,$s3 #endif str $s0,[$key],#16 str $s1,[$key,#-12] str $s2,[$key,#-8] str $s3,[$key,#-4] #endif teq lr,#128 bne .Lnot128 mov $rounds,#10 str $rounds,[$key,#240-16] add $t3,$tbl,#256 @ rcon mov lr,#255 .L128_loop: and $t2,lr,$s3,lsr#24 and $i1,lr,$s3,lsr#16 ldrb $t2,[$tbl,$t2] and $i2,lr,$s3,lsr#8 ldrb $i1,[$tbl,$i1] and $i3,lr,$s3 ldrb $i2,[$tbl,$i2] orr $t2,$t2,$i1,lsl#24 ldrb $i3,[$tbl,$i3] orr $t2,$t2,$i2,lsl#16 ldr $t1,[$t3],#4 @ rcon[i++] orr $t2,$t2,$i3,lsl#8 eor $t2,$t2,$t1 eor $s0,$s0,$t2 @ rk[4]=rk[0]^... eor $s1,$s1,$s0 @ rk[5]=rk[1]^rk[4] str $s0,[$key],#16 eor $s2,$s2,$s1 @ rk[6]=rk[2]^rk[5] str $s1,[$key,#-12] eor $s3,$s3,$s2 @ rk[7]=rk[3]^rk[6] str $s2,[$key,#-8] subs $rounds,$rounds,#1 str $s3,[$key,#-4] bne .L128_loop sub r2,$key,#176 b .Ldone .Lnot128: #if __ARM_ARCH__<7 ldrb $i2,[$rounds,#19] ldrb $t1,[$rounds,#18] ldrb $t2,[$rounds,#17] ldrb $t3,[$rounds,#16] orr $i2,$i2,$t1,lsl#8 ldrb $i3,[$rounds,#23] orr $i2,$i2,$t2,lsl#16 ldrb $t1,[$rounds,#22] orr $i2,$i2,$t3,lsl#24 ldrb $t2,[$rounds,#21] ldrb $t3,[$rounds,#20] orr $i3,$i3,$t1,lsl#8 orr $i3,$i3,$t2,lsl#16 str $i2,[$key],#8 orr $i3,$i3,$t3,lsl#24 str $i3,[$key,#-4] #else ldr $i2,[$rounds,#16] ldr $i3,[$rounds,#20] #ifdef __ARMEL__ rev $i2,$i2 rev $i3,$i3 #endif str $i2,[$key],#8 str $i3,[$key,#-4] #endif #if __ARM_ARCH__<7 ldrb $i2,[$rounds,#27] ldrb $t1,[$rounds,#26] ldrb $t2,[$rounds,#25] ldrb $t3,[$rounds,#24] orr $i2,$i2,$t1,lsl#8 ldrb $i3,[$rounds,#31] orr $i2,$i2,$t2,lsl#16 ldrb $t1,[$rounds,#30] orr $i2,$i2,$t3,lsl#24 ldrb $t2,[$rounds,#29] ldrb $t3,[$rounds,#28] orr $i3,$i3,$t1,lsl#8 orr $i3,$i3,$t2,lsl#16 str $i2,[$key],#8 orr $i3,$i3,$t3,lsl#24 str $i3,[$key,#-4] #else ldr $i2,[$rounds,#24] ldr $i3,[$rounds,#28] #ifdef __ARMEL__ rev $i2,$i2 rev $i3,$i3 #endif str $i2,[$key],#8 str $i3,[$key,#-4] #endif mov $rounds,#14 str $rounds,[$key,#240-32] add $t3,$tbl,#256 @ rcon mov lr,#255 mov $rounds,#7 .L256_loop: and $t2,lr,$i3,lsr#24 and $i1,lr,$i3,lsr#16 ldrb $t2,[$tbl,$t2] and $i2,lr,$i3,lsr#8 ldrb $i1,[$tbl,$i1] and $i3,lr,$i3 ldrb $i2,[$tbl,$i2] orr $t2,$t2,$i1,lsl#24 ldrb $i3,[$tbl,$i3] orr $t2,$t2,$i2,lsl#16 ldr $t1,[$t3],#4 @ rcon[i++] orr $t2,$t2,$i3,lsl#8 eor $i3,$t2,$t1 eor $s0,$s0,$i3 @ rk[8]=rk[0]^... eor $s1,$s1,$s0 @ rk[9]=rk[1]^rk[8] str $s0,[$key],#32 eor $s2,$s2,$s1 @ rk[10]=rk[2]^rk[9] str $s1,[$key,#-28] eor $s3,$s3,$s2 @ rk[11]=rk[3]^rk[10] str $s2,[$key,#-24] subs $rounds,$rounds,#1 str $s3,[$key,#-20] #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif subeq r2,$key,#256 beq .Ldone and $t2,lr,$s3 and $i1,lr,$s3,lsr#8 ldrb $t2,[$tbl,$t2] and $i2,lr,$s3,lsr#16 ldrb $i1,[$tbl,$i1] and $i3,lr,$s3,lsr#24 ldrb $i2,[$tbl,$i2] orr $t2,$t2,$i1,lsl#8 ldrb $i3,[$tbl,$i3] orr $t2,$t2,$i2,lsl#16 ldr $t1,[$key,#-48] orr $t2,$t2,$i3,lsl#24 ldr $i1,[$key,#-44] ldr $i2,[$key,#-40] eor $t1,$t1,$t2 @ rk[12]=rk[4]^... ldr $i3,[$key,#-36] eor $i1,$i1,$t1 @ rk[13]=rk[5]^rk[12] str $t1,[$key,#-16] eor $i2,$i2,$i1 @ rk[14]=rk[6]^rk[13] str $i1,[$key,#-12] eor $i3,$i3,$i2 @ rk[15]=rk[7]^rk[14] str $i2,[$key,#-8] str $i3,[$key,#-4] b .L256_loop .align 2 .Ldone: mov r0,#0 ldmia sp!,{r4-r12,lr} .Labrt: #if __ARM_ARCH__>=5 ret @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_aes_nohw_set_encrypt_key,.-GFp_aes_nohw_set_encrypt_key .asciz "AES for ARMv4, CRYPTOGAMS by " .align 2 ___ $code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm; # make it possible to compile with -march=armv4 $code =~ s/\bret\b/bx\tlr/gm; open SELF,$0; while() { next if (/^#!/); last if (!s/^#/@/ and !/^$/); print; } close SELF; print $code; close STDOUT or die "error closing STDOUT"; # enforce flush ring-0.16.9/crypto/fipsmodule/aes/asm/aes-x86_64.pl000064400000000000000000000716051353036607100200310ustar0000000000000000#! /usr/bin/env perl # Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # Version 2.1. # # aes-*-cbc benchmarks are improved by >70% [compared to gcc 3.3.2 on # Opteron 240 CPU] plus all the bells-n-whistles from 32-bit version # [you'll notice a lot of resemblance], such as compressed S-boxes # in little-endian byte order, prefetch of these tables in CBC mode, # as well as avoiding L1 cache aliasing between stack frame and key # schedule and already mentioned tables, compressed Td4... # # Performance in number of cycles per processed byte for 128-bit key: # # ECB encrypt ECB decrypt CBC large chunk # AMD64 33 43 13.0 # EM64T 38 56 18.6(*) # Core 2 30 42 14.5(*) # Atom 65 86 32.1(*) # # (*) with hyper-threading off $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $verticalspin=1; # unlike 32-bit version $verticalspin performs # ~15% better on both AMD and Intel cores $speed_limit=512; # see aes-586.pl for details $code=".text\n"; $s0="%eax"; $s1="%ebx"; $s2="%ecx"; $s3="%edx"; $acc0="%esi"; $mask80="%rsi"; $acc1="%edi"; $maskfe="%rdi"; $acc2="%ebp"; $mask1b="%rbp"; $inp="%r8"; $out="%r9"; $t0="%r10d"; $t1="%r11d"; $t2="%r12d"; $rnds="%r13d"; $sbox="%r14"; $key="%r15"; sub hi() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1h/; $r; } sub lo() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1l/; $r =~ s/%[er]([sd]i)/%\1l/; $r =~ s/%(r[0-9]+)[d]?/%\1b/; $r; } sub LO() { my $r=shift; $r =~ s/%r([a-z]+)/%e\1/; $r =~ s/%r([0-9]+)/%r\1d/; $r; } sub _data_word() { my $i; while(defined($i=shift)) { $code.=sprintf".long\t0x%08x,0x%08x\n",$i,$i; } } sub data_word() { my $i; my $last=pop(@_); $code.=".long\t"; while(defined($i=shift)) { $code.=sprintf"0x%08x,",$i; } $code.=sprintf"0x%08x\n",$last; } sub data_byte() { my $i; my $last=pop(@_); $code.=".byte\t"; while(defined($i=shift)) { $code.=sprintf"0x%02x,",$i&0xff; } $code.=sprintf"0x%02x\n",$last&0xff; } # it's possible to implement this by shifting tN by 8, filling least # significant byte with byte load and finally bswap-ing at the end, # but such partial register load kills Core 2... sub enccompactvert() { my ($t3,$t4,$t5)=("%r8d","%r9d","%r13d"); $code.=<<___; movzb `&lo("$s0")`,$t0 movzb `&lo("$s1")`,$t1 movzb `&lo("$s2")`,$t2 movzb `&lo("$s3")`,$t3 movzb `&hi("$s1")`,$acc0 movzb `&hi("$s2")`,$acc1 shr \$16,$s2 movzb `&hi("$s3")`,$acc2 movzb ($sbox,$t0,1),$t0 movzb ($sbox,$t1,1),$t1 movzb ($sbox,$t2,1),$t2 movzb ($sbox,$t3,1),$t3 movzb ($sbox,$acc0,1),$t4 #$t0 movzb `&hi("$s0")`,$acc0 movzb ($sbox,$acc1,1),$t5 #$t1 movzb `&lo("$s2")`,$acc1 movzb ($sbox,$acc2,1),$acc2 #$t2 movzb ($sbox,$acc0,1),$acc0 #$t3 shl \$8,$t4 shr \$16,$s3 shl \$8,$t5 xor $t4,$t0 shr \$16,$s0 movzb `&lo("$s3")`,$t4 shr \$16,$s1 xor $t5,$t1 shl \$8,$acc2 movzb `&lo("$s0")`,$t5 movzb ($sbox,$acc1,1),$acc1 #$t0 xor $acc2,$t2 shl \$8,$acc0 movzb `&lo("$s1")`,$acc2 shl \$16,$acc1 xor $acc0,$t3 movzb ($sbox,$t4,1),$t4 #$t1 movzb `&hi("$s3")`,$acc0 movzb ($sbox,$t5,1),$t5 #$t2 xor $acc1,$t0 shr \$8,$s2 movzb `&hi("$s0")`,$acc1 shl \$16,$t4 shr \$8,$s1 shl \$16,$t5 xor $t4,$t1 movzb ($sbox,$acc2,1),$acc2 #$t3 movzb ($sbox,$acc0,1),$acc0 #$t0 movzb ($sbox,$acc1,1),$acc1 #$t1 movzb ($sbox,$s2,1),$s3 #$t3 movzb ($sbox,$s1,1),$s2 #$t2 shl \$16,$acc2 xor $t5,$t2 shl \$24,$acc0 xor $acc2,$t3 shl \$24,$acc1 xor $acc0,$t0 shl \$24,$s3 xor $acc1,$t1 shl \$24,$s2 mov $t0,$s0 mov $t1,$s1 xor $t2,$s2 xor $t3,$s3 ___ } sub enctransform_ref() { my $sn = shift; my ($acc,$r2,$tmp)=("%r8d","%r9d","%r13d"); $code.=<<___; mov $sn,$acc and \$0x80808080,$acc mov $acc,$tmp shr \$7,$tmp lea ($sn,$sn),$r2 sub $tmp,$acc and \$0xfefefefe,$r2 and \$0x1b1b1b1b,$acc mov $sn,$tmp xor $acc,$r2 xor $r2,$sn rol \$24,$sn xor $r2,$sn ror \$16,$tmp xor $tmp,$sn ror \$8,$tmp xor $tmp,$sn ___ } # unlike decrypt case it does not pay off to parallelize enctransform sub enctransform() { my ($t3,$r20,$r21)=($acc2,"%r8d","%r9d"); $code.=<<___; mov \$0x80808080,$t0 mov \$0x80808080,$t1 and $s0,$t0 and $s1,$t1 mov $t0,$acc0 mov $t1,$acc1 shr \$7,$t0 lea ($s0,$s0),$r20 shr \$7,$t1 lea ($s1,$s1),$r21 sub $t0,$acc0 sub $t1,$acc1 and \$0xfefefefe,$r20 and \$0xfefefefe,$r21 and \$0x1b1b1b1b,$acc0 and \$0x1b1b1b1b,$acc1 mov $s0,$t0 mov $s1,$t1 xor $acc0,$r20 xor $acc1,$r21 xor $r20,$s0 xor $r21,$s1 mov \$0x80808080,$t2 rol \$24,$s0 mov \$0x80808080,$t3 rol \$24,$s1 and $s2,$t2 and $s3,$t3 xor $r20,$s0 xor $r21,$s1 mov $t2,$acc0 ror \$16,$t0 mov $t3,$acc1 ror \$16,$t1 lea ($s2,$s2),$r20 shr \$7,$t2 xor $t0,$s0 shr \$7,$t3 xor $t1,$s1 ror \$8,$t0 lea ($s3,$s3),$r21 ror \$8,$t1 sub $t2,$acc0 sub $t3,$acc1 xor $t0,$s0 xor $t1,$s1 and \$0xfefefefe,$r20 and \$0xfefefefe,$r21 and \$0x1b1b1b1b,$acc0 and \$0x1b1b1b1b,$acc1 mov $s2,$t2 mov $s3,$t3 xor $acc0,$r20 xor $acc1,$r21 ror \$16,$t2 xor $r20,$s2 ror \$16,$t3 xor $r21,$s3 rol \$24,$s2 mov 0($sbox),$acc0 # prefetch Te4 rol \$24,$s3 xor $r20,$s2 mov 64($sbox),$acc1 xor $r21,$s3 mov 128($sbox),$r20 xor $t2,$s2 ror \$8,$t2 xor $t3,$s3 ror \$8,$t3 xor $t2,$s2 mov 192($sbox),$r21 xor $t3,$s3 ___ } $code.=<<___; .type _x86_64_AES_encrypt_compact,\@abi-omnipotent .align 16 _x86_64_AES_encrypt_compact: .cfi_startproc lea 128($sbox),$inp # size optimization mov 0-128($inp),$acc1 # prefetch Te4 mov 32-128($inp),$acc2 mov 64-128($inp),$t0 mov 96-128($inp),$t1 mov 128-128($inp),$acc1 mov 160-128($inp),$acc2 mov 192-128($inp),$t0 mov 224-128($inp),$t1 jmp .Lenc_loop_compact .align 16 .Lenc_loop_compact: xor 0($key),$s0 # xor with key xor 4($key),$s1 xor 8($key),$s2 xor 12($key),$s3 lea 16($key),$key ___ &enccompactvert(); $code.=<<___; cmp 16(%rsp),$key je .Lenc_compact_done ___ &enctransform(); $code.=<<___; jmp .Lenc_loop_compact .align 16 .Lenc_compact_done: xor 0($key),$s0 xor 4($key),$s1 xor 8($key),$s2 xor 12($key),$s3 .byte 0xf3,0xc3 # rep ret .cfi_endproc .size _x86_64_AES_encrypt_compact,.-_x86_64_AES_encrypt_compact ___ # void GFp_aes_nohw_encrypt (const void *inp,void *out,const AES_KEY *key); $code.=<<___; .align 16 .globl GFp_aes_nohw_encrypt .type GFp_aes_nohw_encrypt,\@function,3 .hidden GFp_aes_nohw_encrypt GFp_aes_nohw_encrypt: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 # allocate frame "above" key schedule lea -63(%rdx),%rcx # %rdx is key argument and \$-64,%rsp sub %rsp,%rcx neg %rcx and \$0x3c0,%rcx sub %rcx,%rsp sub \$32,%rsp mov %rsi,16(%rsp) # save out mov %rax,24(%rsp) # save original stack pointer .cfi_cfa_expression %rsp+24,deref,+8 .Lenc_prologue: mov %rdx,$key mov 240($key),$rnds # load rounds mov 0(%rdi),$s0 # load input vector mov 4(%rdi),$s1 mov 8(%rdi),$s2 mov 12(%rdi),$s3 shl \$4,$rnds lea ($key,$rnds),%rbp mov $key,(%rsp) # key schedule mov %rbp,8(%rsp) # end of key schedule # pick Te4 copy which can't "overlap" with stack frame or key schedule lea .LAES_Te+2048(%rip),$sbox lea 768(%rsp),%rbp sub $sbox,%rbp and \$0x300,%rbp lea ($sbox,%rbp),$sbox call _x86_64_AES_encrypt_compact mov 16(%rsp),$out # restore out mov 24(%rsp),%rsi # restore saved stack pointer .cfi_def_cfa %rsi,8 mov $s0,0($out) # write output vector mov $s1,4($out) mov $s2,8($out) mov $s3,12($out) mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lenc_epilogue: ret .cfi_endproc .size GFp_aes_nohw_encrypt,.-GFp_aes_nohw_encrypt ___ #------------------------------------------------------------------# sub enckey() { $code.=<<___; movz %dl,%esi # rk[i]>>0 movzb -128(%rbp,%rsi),%ebx movz %dh,%esi # rk[i]>>8 shl \$24,%ebx xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx shr \$16,%edx movz %dl,%esi # rk[i]>>16 xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx movz %dh,%esi # rk[i]>>24 shl \$8,%ebx xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx shl \$16,%ebx xor %ebx,%eax xor 1024-128(%rbp,%rcx,4),%eax # rcon ___ } # int GFp_aes_nohw_set_encrypt_key(const unsigned char *userKey, const int bits, # AES_KEY *key) $code.=<<___; .align 16 .globl GFp_aes_nohw_set_encrypt_key .type GFp_aes_nohw_set_encrypt_key,\@function,3 GFp_aes_nohw_set_encrypt_key: .cfi_startproc push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 # redundant, but allows to share .cfi_push %r12 push %r13 # exception handler... .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 sub \$8,%rsp .cfi_adjust_cfa_offset 8 .Lenc_key_prologue: call _x86_64_AES_set_encrypt_key mov 40(%rsp),%rbp .cfi_restore %rbp mov 48(%rsp),%rbx .cfi_restore %rbx add \$56,%rsp .cfi_adjust_cfa_offset -56 .Lenc_key_epilogue: ret .cfi_endproc .size GFp_aes_nohw_set_encrypt_key,.-GFp_aes_nohw_set_encrypt_key .type _x86_64_AES_set_encrypt_key,\@abi-omnipotent .align 16 _x86_64_AES_set_encrypt_key: .cfi_startproc mov %esi,%ecx # %ecx=bits mov %rdi,%rsi # %rsi=userKey mov %rdx,%rdi # %rdi=key test \$-1,%rsi jz .Lbadpointer test \$-1,%rdi jz .Lbadpointer lea .LAES_Te(%rip),%rbp lea 2048+128(%rbp),%rbp # prefetch Te4 mov 0-128(%rbp),%eax mov 32-128(%rbp),%ebx mov 64-128(%rbp),%r8d mov 96-128(%rbp),%edx mov 128-128(%rbp),%eax mov 160-128(%rbp),%ebx mov 192-128(%rbp),%r8d mov 224-128(%rbp),%edx cmp \$128,%ecx je .L10rounds cmp \$256,%ecx je .L14rounds mov \$-2,%rax # invalid number of bits jmp .Lexit .L10rounds: mov 0(%rsi),%rax # copy first 4 dwords mov 8(%rsi),%rdx mov %rax,0(%rdi) mov %rdx,8(%rdi) shr \$32,%rdx xor %ecx,%ecx jmp .L10shortcut .align 4 .L10loop: mov 0(%rdi),%eax # rk[0] mov 12(%rdi),%edx # rk[3] .L10shortcut: ___ &enckey (); $code.=<<___; mov %eax,16(%rdi) # rk[4] xor 4(%rdi),%eax mov %eax,20(%rdi) # rk[5] xor 8(%rdi),%eax mov %eax,24(%rdi) # rk[6] xor 12(%rdi),%eax mov %eax,28(%rdi) # rk[7] add \$1,%ecx lea 16(%rdi),%rdi cmp \$10,%ecx jl .L10loop movl \$10,80(%rdi) # setup number of rounds xor %rax,%rax jmp .Lexit .L14rounds: mov 0(%rsi),%rax # copy first 8 dwords mov 8(%rsi),%rbx mov 16(%rsi),%rcx mov 24(%rsi),%rdx mov %rax,0(%rdi) mov %rbx,8(%rdi) mov %rcx,16(%rdi) mov %rdx,24(%rdi) shr \$32,%rdx xor %ecx,%ecx jmp .L14shortcut .align 4 .L14loop: mov 0(%rdi),%eax # rk[0] mov 28(%rdi),%edx # rk[4] .L14shortcut: ___ &enckey (); $code.=<<___; mov %eax,32(%rdi) # rk[8] xor 4(%rdi),%eax mov %eax,36(%rdi) # rk[9] xor 8(%rdi),%eax mov %eax,40(%rdi) # rk[10] xor 12(%rdi),%eax mov %eax,44(%rdi) # rk[11] cmp \$6,%ecx je .L14break add \$1,%ecx mov %eax,%edx mov 16(%rdi),%eax # rk[4] movz %dl,%esi # rk[11]>>0 movzb -128(%rbp,%rsi),%ebx movz %dh,%esi # rk[11]>>8 xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx shr \$16,%edx shl \$8,%ebx movz %dl,%esi # rk[11]>>16 xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx movz %dh,%esi # rk[11]>>24 shl \$16,%ebx xor %ebx,%eax movzb -128(%rbp,%rsi),%ebx shl \$24,%ebx xor %ebx,%eax mov %eax,48(%rdi) # rk[12] xor 20(%rdi),%eax mov %eax,52(%rdi) # rk[13] xor 24(%rdi),%eax mov %eax,56(%rdi) # rk[14] xor 28(%rdi),%eax mov %eax,60(%rdi) # rk[15] lea 32(%rdi),%rdi jmp .L14loop .L14break: movl \$14,48(%rdi) # setup number of rounds xor %rax,%rax jmp .Lexit .Lbadpointer: mov \$-1,%rax .Lexit: .byte 0xf3,0xc3 # rep ret .cfi_endproc .size _x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key ___ $code.=<<___; .align 64 .LAES_Te: ___ &_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6); &_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591); &_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56); &_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec); &_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa); &_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb); &_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45); &_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b); &_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c); &_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83); &_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9); &_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a); &_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d); &_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f); &_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df); &_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea); &_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34); &_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b); &_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d); &_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413); &_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1); &_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6); &_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972); &_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85); &_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed); &_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511); &_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe); &_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b); &_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05); &_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1); &_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142); &_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf); &_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3); &_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e); &_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a); &_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6); &_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3); &_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b); &_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428); &_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad); &_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14); &_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8); &_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4); &_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2); &_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda); &_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949); &_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf); &_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810); &_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c); &_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697); &_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e); &_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f); &_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc); &_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c); &_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969); &_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27); &_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122); &_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433); &_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9); &_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5); &_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a); &_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0); &_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e); &_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c); #Te4 # four copies of Te4 to choose from to avoid L1 aliasing &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); #rcon: $code.=<<___; .long 0x00000001, 0x00000002, 0x00000004, 0x00000008 .long 0x00000010, 0x00000020, 0x00000040, 0x00000080 .long 0x0000001b, 0x00000036, 0x80808080, 0x80808080 .long 0xfefefefe, 0xfefefefe, 0x1b1b1b1b, 0x1b1b1b1b ___ $code.=<<___; .asciz "AES for x86_64, CRYPTOGAMS by " .align 64 ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type block_se_handler,\@abi-omnipotent .align 16 block_se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lin_block_prologue mov 24(%rax),%rax # pull saved real stack pointer mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lin_block_prologue: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi jmp .Lcommon_seh_exit .size block_se_handler,.-block_se_handler .type key_se_handler,\@abi-omnipotent .align 16 key_se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lin_key_prologue lea 56(%rax),%rax mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lin_key_prologue: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi .Lcommon_seh_exit: mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$`1232/8`,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size key_se_handler,.-key_se_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_aes_nohw_encrypt .rva .LSEH_end_GFp_aes_nohw_encrypt .rva .LSEH_info_GFp_aes_nohw_encrypt .rva .LSEH_begin_GFp_aes_nohw_set_encrypt_key .rva .LSEH_end_GFp_aes_nohw_set_encrypt_key .rva .LSEH_info_GFp_aes_nohw_set_encrypt_key .section .xdata .align 8 .LSEH_info_GFp_aes_nohw_encrypt: .byte 9,0,0,0 .rva block_se_handler .rva .Lenc_prologue,.Lenc_epilogue # HandlerData[] .LSEH_info_GFp_aes_nohw_set_encrypt_key: .byte 9,0,0,0 .rva key_se_handler .rva .Lenc_key_prologue,.Lenc_key_epilogue # HandlerData[] ___ } $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/aesni-x86.pl000064400000000000000000000712341352416253600200500ustar0000000000000000#! /usr/bin/env perl # Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements support for Intel AES-NI extension. In # OpenSSL context it's used with Intel engine, but can also be used as # drop-in replacement for crypto/aes/asm/aes-586.pl [see below for # details]. # # Performance. # # To start with see corresponding paragraph in aesni-x86_64.pl... # Instead of filling table similar to one found there I've chosen to # summarize *comparison* results for raw ECB, CTR and CBC benchmarks. # The simplified table below represents 32-bit performance relative # to 64-bit one in every given point. Ratios vary for different # encryption modes, therefore interval values. # # 16-byte 64-byte 256-byte 1-KB 8-KB # 53-67% 67-84% 91-94% 95-98% 97-99.5% # # Lower ratios for smaller block sizes are perfectly understandable, # because function call overhead is higher in 32-bit mode. Largest # 8-KB block performance is virtually same: 32-bit code is less than # 1% slower for ECB, CBC and CCM, and ~3% slower otherwise. # January 2011 # # See aesni-x86_64.pl for details. Unlike x86_64 version this module # interleaves at most 6 aes[enc|dec] instructions, because there are # not enough registers for 8x interleave [which should be optimal for # Sandy Bridge]. Actually, performance results for 6x interleave # factor presented in aesni-x86_64.pl (except for CTR) are for this # module. # April 2011 # # Add aesni_xts_[en|de]crypt. Westmere spends 1.50 cycles processing # one byte out of 8KB with 128-bit key, Sandy Bridge - 1.09. # November 2015 # # Add aesni_ocb_[en|de]crypt. [Removed in BoringSSL] ###################################################################### # Current large-block performance in cycles per byte processed with # 128-bit key (less is better). # # CBC en-/decrypt CTR XTS ECB OCB # Westmere 3.77/1.37 1.37 1.52 1.27 # * Bridge 5.07/0.98 0.99 1.09 0.91 1.10 # Haswell 4.44/0.80 0.97 1.03 0.72 0.76 # Skylake 2.68/0.65 0.65 0.66 0.64 0.66 # Silvermont 5.77/3.56 3.67 4.03 3.46 4.03 # Goldmont 3.84/1.39 1.39 1.63 1.31 1.70 # Bulldozer 5.80/0.98 1.05 1.24 0.93 1.23 $PREFIX="GFp_aes_hw"; # if $PREFIX is set to "AES", the script # generates drop-in replacement for # crypto/aes/asm/aes-586.pl:-) $AESNI_PREFIX="GFp_aes_hw"; $inline=1; # inline _aesni_[en|de]crypt $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output = pop; open OUT,">$output"; *STDOUT=*OUT; &asm_init($ARGV[0]); &external_label("GFp_ia32cap_P"); &static_label("key_const"); if ($PREFIX eq $AESNI_PREFIX) { $movekey=\&movups; } else { $movekey=\&movups; } $len="eax"; $rounds="ecx"; $key="edx"; $inp="esi"; $out="edi"; $rounds_="ebx"; # backup copy for $rounds $key_="ebp"; # backup copy for $key $rndkey0="xmm0"; $rndkey1="xmm1"; $inout0="xmm2"; $inout1="xmm3"; $inout2="xmm4"; $inout3="xmm5"; $in1="xmm5"; $inout4="xmm6"; $in0="xmm6"; $inout5="xmm7"; $ivec="xmm7"; # AESNI extension sub aeskeygenassist { my($dst,$src,$imm)=@_; if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) { &data_byte(0x66,0x0f,0x3a,0xdf,0xc0|($1<<3)|$2,$imm); } } sub aescommon { my($opcodelet,$dst,$src)=@_; if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) { &data_byte(0x66,0x0f,0x38,$opcodelet,0xc0|($1<<3)|$2);} } sub aesimc { aescommon(0xdb,@_); } sub aesenc { aescommon(0xdc,@_); } sub aesenclast { aescommon(0xdd,@_); } # Inline version of internal aesni_[en|de]crypt1 { my $sn; sub aesni_inline_generate1 { my ($p,$inout,$ivec)=@_; $inout=$inout0 if (!defined($inout)); $sn++; &$movekey ($rndkey0,&QWP(0,$key)); &$movekey ($rndkey1,&QWP(16,$key)); &xorps ($ivec,$rndkey0) if (defined($ivec)); &lea ($key,&DWP(32,$key)); &xorps ($inout,$ivec) if (defined($ivec)); &xorps ($inout,$rndkey0) if (!defined($ivec)); &set_label("${p}1_loop_$sn"); eval"&aes${p} ($inout,$rndkey1)"; &dec ($rounds); &$movekey ($rndkey1,&QWP(0,$key)); &lea ($key,&DWP(16,$key)); &jnz (&label("${p}1_loop_$sn")); eval"&aes${p}last ($inout,$rndkey1)"; }} sub aesni_generate1 # fully unrolled loop { my ($p,$inout)=@_; $inout=$inout0 if (!defined($inout)); &function_begin_B("_aesni_${p}rypt1"); &movups ($rndkey0,&QWP(0,$key)); &$movekey ($rndkey1,&QWP(0x10,$key)); &xorps ($inout,$rndkey0); &$movekey ($rndkey0,&QWP(0x20,$key)); &lea ($key,&DWP(0x30,$key)); &cmp ($rounds,11); &jb (&label("${p}128")); &lea ($key,&DWP(0x40,$key)); # 192-bit key support was removed. eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(-0x40,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(-0x30,$key)); # 192-bit key support was removed. eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(-0x20,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(-0x10,$key)); &set_label("${p}128"); eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(0,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(0x10,$key)); eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(0x20,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(0x30,$key)); eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(0x40,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(0x50,$key)); eval"&aes${p} ($inout,$rndkey1)"; &$movekey ($rndkey1,&QWP(0x60,$key)); eval"&aes${p} ($inout,$rndkey0)"; &$movekey ($rndkey0,&QWP(0x70,$key)); eval"&aes${p} ($inout,$rndkey1)"; eval"&aes${p}last ($inout,$rndkey0)"; &ret(); &function_end_B("_aesni_${p}rypt1"); } # void $PREFIX_encrypt (const void *inp,void *out,const AES_KEY *key); &aesni_generate1("enc") if (!$inline); &function_begin_B("${PREFIX}_encrypt"); &mov ("eax",&wparam(0)); &mov ($key,&wparam(2)); &movups ($inout0,&QWP(0,"eax")); &mov ($rounds,&DWP(240,$key)); &mov ("eax",&wparam(1)); if ($inline) { &aesni_inline_generate1("enc"); } else { &call ("_aesni_encrypt1"); } &pxor ($rndkey0,$rndkey0); # clear register bank &pxor ($rndkey1,$rndkey1); &movups (&QWP(0,"eax"),$inout0); &pxor ($inout0,$inout0); &ret (); &function_end_B("${PREFIX}_encrypt"); # _aesni_[en|de]cryptN are private interfaces, N denotes interleave # factor. Why 3x subroutine were originally used in loops? Even though # aes[enc|dec] latency was originally 6, it could be scheduled only # every *2nd* cycle. Thus 3x interleave was the one providing optimal # utilization, i.e. when subroutine's throughput is virtually same as # of non-interleaved subroutine [for number of input blocks up to 3]. # This is why it originally made no sense to implement 2x subroutine. # But times change and it became appropriate to spend extra 192 bytes # on 2x subroutine on Atom Silvermont account. For processors that # can schedule aes[enc|dec] every cycle optimal interleave factor # equals to corresponding instructions latency. 8x is optimal for # * Bridge, but it's unfeasible to accommodate such implementation # in XMM registers addressable in 32-bit mode and therefore maximum # of 6x is used instead... sub aesni_generate2 { my $p=shift; &function_begin_B("_aesni_${p}rypt2"); &$movekey ($rndkey0,&QWP(0,$key)); &shl ($rounds,4); &$movekey ($rndkey1,&QWP(16,$key)); &xorps ($inout0,$rndkey0); &pxor ($inout1,$rndkey0); &$movekey ($rndkey0,&QWP(32,$key)); &lea ($key,&DWP(32,$key,$rounds)); &neg ($rounds); &add ($rounds,16); &set_label("${p}2_loop"); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; &$movekey ($rndkey1,&QWP(0,$key,$rounds)); &add ($rounds,32); eval"&aes${p} ($inout0,$rndkey0)"; eval"&aes${p} ($inout1,$rndkey0)"; &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); &jnz (&label("${p}2_loop")); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p}last ($inout0,$rndkey0)"; eval"&aes${p}last ($inout1,$rndkey0)"; &ret(); &function_end_B("_aesni_${p}rypt2"); } sub aesni_generate3 { my $p=shift; &function_begin_B("_aesni_${p}rypt3"); &$movekey ($rndkey0,&QWP(0,$key)); &shl ($rounds,4); &$movekey ($rndkey1,&QWP(16,$key)); &xorps ($inout0,$rndkey0); &pxor ($inout1,$rndkey0); &pxor ($inout2,$rndkey0); &$movekey ($rndkey0,&QWP(32,$key)); &lea ($key,&DWP(32,$key,$rounds)); &neg ($rounds); &add ($rounds,16); &set_label("${p}3_loop"); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; &$movekey ($rndkey1,&QWP(0,$key,$rounds)); &add ($rounds,32); eval"&aes${p} ($inout0,$rndkey0)"; eval"&aes${p} ($inout1,$rndkey0)"; eval"&aes${p} ($inout2,$rndkey0)"; &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); &jnz (&label("${p}3_loop")); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; eval"&aes${p}last ($inout0,$rndkey0)"; eval"&aes${p}last ($inout1,$rndkey0)"; eval"&aes${p}last ($inout2,$rndkey0)"; &ret(); &function_end_B("_aesni_${p}rypt3"); } # 4x interleave is implemented to improve small block performance, # most notably [and naturally] 4 block by ~30%. One can argue that one # should have implemented 5x as well, but improvement would be <20%, # so it's not worth it... sub aesni_generate4 { my $p=shift; &function_begin_B("_aesni_${p}rypt4"); &$movekey ($rndkey0,&QWP(0,$key)); &$movekey ($rndkey1,&QWP(16,$key)); &shl ($rounds,4); &xorps ($inout0,$rndkey0); &pxor ($inout1,$rndkey0); &pxor ($inout2,$rndkey0); &pxor ($inout3,$rndkey0); &$movekey ($rndkey0,&QWP(32,$key)); &lea ($key,&DWP(32,$key,$rounds)); &neg ($rounds); &data_byte (0x0f,0x1f,0x40,0x00); &add ($rounds,16); &set_label("${p}4_loop"); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; eval"&aes${p} ($inout3,$rndkey1)"; &$movekey ($rndkey1,&QWP(0,$key,$rounds)); &add ($rounds,32); eval"&aes${p} ($inout0,$rndkey0)"; eval"&aes${p} ($inout1,$rndkey0)"; eval"&aes${p} ($inout2,$rndkey0)"; eval"&aes${p} ($inout3,$rndkey0)"; &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); &jnz (&label("${p}4_loop")); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; eval"&aes${p} ($inout3,$rndkey1)"; eval"&aes${p}last ($inout0,$rndkey0)"; eval"&aes${p}last ($inout1,$rndkey0)"; eval"&aes${p}last ($inout2,$rndkey0)"; eval"&aes${p}last ($inout3,$rndkey0)"; &ret(); &function_end_B("_aesni_${p}rypt4"); } sub aesni_generate6 { my $p=shift; &function_begin_B("_aesni_${p}rypt6"); &static_label("_aesni_${p}rypt6_enter"); &$movekey ($rndkey0,&QWP(0,$key)); &shl ($rounds,4); &$movekey ($rndkey1,&QWP(16,$key)); &xorps ($inout0,$rndkey0); &pxor ($inout1,$rndkey0); # pxor does better here &pxor ($inout2,$rndkey0); eval"&aes${p} ($inout0,$rndkey1)"; &pxor ($inout3,$rndkey0); &pxor ($inout4,$rndkey0); eval"&aes${p} ($inout1,$rndkey1)"; &lea ($key,&DWP(32,$key,$rounds)); &neg ($rounds); eval"&aes${p} ($inout2,$rndkey1)"; &pxor ($inout5,$rndkey0); &$movekey ($rndkey0,&QWP(0,$key,$rounds)); &add ($rounds,16); &jmp (&label("_aesni_${p}rypt6_inner")); &set_label("${p}6_loop",16); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; &set_label("_aesni_${p}rypt6_inner"); eval"&aes${p} ($inout3,$rndkey1)"; eval"&aes${p} ($inout4,$rndkey1)"; eval"&aes${p} ($inout5,$rndkey1)"; &set_label("_aesni_${p}rypt6_enter"); &$movekey ($rndkey1,&QWP(0,$key,$rounds)); &add ($rounds,32); eval"&aes${p} ($inout0,$rndkey0)"; eval"&aes${p} ($inout1,$rndkey0)"; eval"&aes${p} ($inout2,$rndkey0)"; eval"&aes${p} ($inout3,$rndkey0)"; eval"&aes${p} ($inout4,$rndkey0)"; eval"&aes${p} ($inout5,$rndkey0)"; &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); &jnz (&label("${p}6_loop")); eval"&aes${p} ($inout0,$rndkey1)"; eval"&aes${p} ($inout1,$rndkey1)"; eval"&aes${p} ($inout2,$rndkey1)"; eval"&aes${p} ($inout3,$rndkey1)"; eval"&aes${p} ($inout4,$rndkey1)"; eval"&aes${p} ($inout5,$rndkey1)"; eval"&aes${p}last ($inout0,$rndkey0)"; eval"&aes${p}last ($inout1,$rndkey0)"; eval"&aes${p}last ($inout2,$rndkey0)"; eval"&aes${p}last ($inout3,$rndkey0)"; eval"&aes${p}last ($inout4,$rndkey0)"; eval"&aes${p}last ($inout5,$rndkey0)"; &ret(); &function_end_B("_aesni_${p}rypt6"); } &aesni_generate2("enc") if ($PREFIX eq $AESNI_PREFIX); &aesni_generate3("enc") if ($PREFIX eq $AESNI_PREFIX); &aesni_generate4("enc") if ($PREFIX eq $AESNI_PREFIX); &aesni_generate6("enc") if ($PREFIX eq $AESNI_PREFIX); if ($PREFIX eq $AESNI_PREFIX) { ###################################################################### # void aes_hw_ctr32_encrypt_blocks (const void *in, void *out, # size_t blocks, const AES_KEY *key, # const char *ivec); # # Handles only complete blocks, operates on 32-bit counter and # does not update *ivec! (see crypto/modes/ctr128.c for details) # # stack layout: # 0 pshufb mask # 16 vector addend: 0,6,6,6 # 32 counter-less ivec # 48 1st triplet of counter vector # 64 2nd triplet of counter vector # 80 saved %esp &function_begin("${PREFIX}_ctr32_encrypt_blocks"); &mov ($inp,&wparam(0)); &mov ($out,&wparam(1)); &mov ($len,&wparam(2)); &mov ($key,&wparam(3)); &mov ($rounds_,&wparam(4)); &mov ($key_,"esp"); &sub ("esp",88); &and ("esp",-16); # align stack &mov (&DWP(80,"esp"),$key_); &cmp ($len,1); &je (&label("ctr32_one_shortcut")); &movdqu ($inout5,&QWP(0,$rounds_)); # load ivec # compose byte-swap control mask for pshufb on stack &mov (&DWP(0,"esp"),0x0c0d0e0f); &mov (&DWP(4,"esp"),0x08090a0b); &mov (&DWP(8,"esp"),0x04050607); &mov (&DWP(12,"esp"),0x00010203); # compose counter increment vector on stack &mov ($rounds,6); &xor ($key_,$key_); &mov (&DWP(16,"esp"),$rounds); &mov (&DWP(20,"esp"),$rounds); &mov (&DWP(24,"esp"),$rounds); &mov (&DWP(28,"esp"),$key_); &pextrd ($rounds_,$inout5,3); # pull 32-bit counter &pinsrd ($inout5,$key_,3); # wipe 32-bit counter &mov ($rounds,&DWP(240,$key)); # key->rounds # compose 2 vectors of 3x32-bit counters &bswap ($rounds_); &pxor ($rndkey0,$rndkey0); &pxor ($rndkey1,$rndkey1); &movdqa ($inout0,&QWP(0,"esp")); # load byte-swap mask &pinsrd ($rndkey0,$rounds_,0); &lea ($key_,&DWP(3,$rounds_)); &pinsrd ($rndkey1,$key_,0); &inc ($rounds_); &pinsrd ($rndkey0,$rounds_,1); &inc ($key_); &pinsrd ($rndkey1,$key_,1); &inc ($rounds_); &pinsrd ($rndkey0,$rounds_,2); &inc ($key_); &pinsrd ($rndkey1,$key_,2); &movdqa (&QWP(48,"esp"),$rndkey0); # save 1st triplet &pshufb ($rndkey0,$inout0); # byte swap &movdqu ($inout4,&QWP(0,$key)); # key[0] &movdqa (&QWP(64,"esp"),$rndkey1); # save 2nd triplet &pshufb ($rndkey1,$inout0); # byte swap &pshufd ($inout0,$rndkey0,3<<6); # place counter to upper dword &pshufd ($inout1,$rndkey0,2<<6); &cmp ($len,6); &jb (&label("ctr32_tail")); &pxor ($inout5,$inout4); # counter-less ivec^key[0] &shl ($rounds,4); &mov ($rounds_,16); &movdqa (&QWP(32,"esp"),$inout5); # save counter-less ivec^key[0] &mov ($key_,$key); # backup $key &sub ($rounds_,$rounds); # backup twisted $rounds &lea ($key,&DWP(32,$key,$rounds)); &sub ($len,6); &jmp (&label("ctr32_loop6")); &set_label("ctr32_loop6",16); # inlining _aesni_encrypt6's prologue gives ~6% improvement... &pshufd ($inout2,$rndkey0,1<<6); &movdqa ($rndkey0,&QWP(32,"esp")); # pull counter-less ivec &pshufd ($inout3,$rndkey1,3<<6); &pxor ($inout0,$rndkey0); # merge counter-less ivec &pshufd ($inout4,$rndkey1,2<<6); &pxor ($inout1,$rndkey0); &pshufd ($inout5,$rndkey1,1<<6); &$movekey ($rndkey1,&QWP(16,$key_)); &pxor ($inout2,$rndkey0); &pxor ($inout3,$rndkey0); &aesenc ($inout0,$rndkey1); &pxor ($inout4,$rndkey0); &pxor ($inout5,$rndkey0); &aesenc ($inout1,$rndkey1); &$movekey ($rndkey0,&QWP(32,$key_)); &mov ($rounds,$rounds_); &aesenc ($inout2,$rndkey1); &aesenc ($inout3,$rndkey1); &aesenc ($inout4,$rndkey1); &aesenc ($inout5,$rndkey1); &call (&label("_aesni_encrypt6_enter")); &movups ($rndkey1,&QWP(0,$inp)); &movups ($rndkey0,&QWP(0x10,$inp)); &xorps ($inout0,$rndkey1); &movups ($rndkey1,&QWP(0x20,$inp)); &xorps ($inout1,$rndkey0); &movups (&QWP(0,$out),$inout0); &movdqa ($rndkey0,&QWP(16,"esp")); # load increment &xorps ($inout2,$rndkey1); &movdqa ($rndkey1,&QWP(64,"esp")); # load 2nd triplet &movups (&QWP(0x10,$out),$inout1); &movups (&QWP(0x20,$out),$inout2); &paddd ($rndkey1,$rndkey0); # 2nd triplet increment &paddd ($rndkey0,&QWP(48,"esp")); # 1st triplet increment &movdqa ($inout0,&QWP(0,"esp")); # load byte swap mask &movups ($inout1,&QWP(0x30,$inp)); &movups ($inout2,&QWP(0x40,$inp)); &xorps ($inout3,$inout1); &movups ($inout1,&QWP(0x50,$inp)); &lea ($inp,&DWP(0x60,$inp)); &movdqa (&QWP(48,"esp"),$rndkey0); # save 1st triplet &pshufb ($rndkey0,$inout0); # byte swap &xorps ($inout4,$inout2); &movups (&QWP(0x30,$out),$inout3); &xorps ($inout5,$inout1); &movdqa (&QWP(64,"esp"),$rndkey1); # save 2nd triplet &pshufb ($rndkey1,$inout0); # byte swap &movups (&QWP(0x40,$out),$inout4); &pshufd ($inout0,$rndkey0,3<<6); &movups (&QWP(0x50,$out),$inout5); &lea ($out,&DWP(0x60,$out)); &pshufd ($inout1,$rndkey0,2<<6); &sub ($len,6); &jnc (&label("ctr32_loop6")); &add ($len,6); &jz (&label("ctr32_ret")); &movdqu ($inout5,&QWP(0,$key_)); &mov ($key,$key_); &pxor ($inout5,&QWP(32,"esp")); # restore count-less ivec &mov ($rounds,&DWP(240,$key_)); # restore $rounds &set_label("ctr32_tail"); &por ($inout0,$inout5); &cmp ($len,2); &jb (&label("ctr32_one")); &pshufd ($inout2,$rndkey0,1<<6); &por ($inout1,$inout5); &je (&label("ctr32_two")); &pshufd ($inout3,$rndkey1,3<<6); &por ($inout2,$inout5); &cmp ($len,4); &jb (&label("ctr32_three")); &pshufd ($inout4,$rndkey1,2<<6); &por ($inout3,$inout5); &je (&label("ctr32_four")); &por ($inout4,$inout5); &call ("_aesni_encrypt6"); &movups ($rndkey1,&QWP(0,$inp)); &movups ($rndkey0,&QWP(0x10,$inp)); &xorps ($inout0,$rndkey1); &movups ($rndkey1,&QWP(0x20,$inp)); &xorps ($inout1,$rndkey0); &movups ($rndkey0,&QWP(0x30,$inp)); &xorps ($inout2,$rndkey1); &movups ($rndkey1,&QWP(0x40,$inp)); &xorps ($inout3,$rndkey0); &movups (&QWP(0,$out),$inout0); &xorps ($inout4,$rndkey1); &movups (&QWP(0x10,$out),$inout1); &movups (&QWP(0x20,$out),$inout2); &movups (&QWP(0x30,$out),$inout3); &movups (&QWP(0x40,$out),$inout4); &jmp (&label("ctr32_ret")); &set_label("ctr32_one_shortcut",16); &movups ($inout0,&QWP(0,$rounds_)); # load ivec &mov ($rounds,&DWP(240,$key)); &set_label("ctr32_one"); if ($inline) { &aesni_inline_generate1("enc"); } else { &call ("_aesni_encrypt1"); } &movups ($in0,&QWP(0,$inp)); &xorps ($in0,$inout0); &movups (&QWP(0,$out),$in0); &jmp (&label("ctr32_ret")); &set_label("ctr32_two",16); &call ("_aesni_encrypt2"); &movups ($inout3,&QWP(0,$inp)); &movups ($inout4,&QWP(0x10,$inp)); &xorps ($inout0,$inout3); &xorps ($inout1,$inout4); &movups (&QWP(0,$out),$inout0); &movups (&QWP(0x10,$out),$inout1); &jmp (&label("ctr32_ret")); &set_label("ctr32_three",16); &call ("_aesni_encrypt3"); &movups ($inout3,&QWP(0,$inp)); &movups ($inout4,&QWP(0x10,$inp)); &xorps ($inout0,$inout3); &movups ($inout5,&QWP(0x20,$inp)); &xorps ($inout1,$inout4); &movups (&QWP(0,$out),$inout0); &xorps ($inout2,$inout5); &movups (&QWP(0x10,$out),$inout1); &movups (&QWP(0x20,$out),$inout2); &jmp (&label("ctr32_ret")); &set_label("ctr32_four",16); &call ("_aesni_encrypt4"); &movups ($inout4,&QWP(0,$inp)); &movups ($inout5,&QWP(0x10,$inp)); &movups ($rndkey1,&QWP(0x20,$inp)); &xorps ($inout0,$inout4); &movups ($rndkey0,&QWP(0x30,$inp)); &xorps ($inout1,$inout5); &movups (&QWP(0,$out),$inout0); &xorps ($inout2,$rndkey1); &movups (&QWP(0x10,$out),$inout1); &xorps ($inout3,$rndkey0); &movups (&QWP(0x20,$out),$inout2); &movups (&QWP(0x30,$out),$inout3); &set_label("ctr32_ret"); &pxor ("xmm0","xmm0"); # clear register bank &pxor ("xmm1","xmm1"); &pxor ("xmm2","xmm2"); &pxor ("xmm3","xmm3"); &pxor ("xmm4","xmm4"); &movdqa (&QWP(32,"esp"),"xmm0"); # clear stack &pxor ("xmm5","xmm5"); &movdqa (&QWP(48,"esp"),"xmm0"); &pxor ("xmm6","xmm6"); &movdqa (&QWP(64,"esp"),"xmm0"); &pxor ("xmm7","xmm7"); &mov ("esp",&DWP(80,"esp")); &function_end("${PREFIX}_ctr32_encrypt_blocks"); } ###################################################################### # Mechanical port from aesni-x86_64.pl. # # _aesni_set_encrypt_key is private interface, # input: # "eax" const unsigned char *userKey # $rounds int bits # $key AES_KEY *key # output: # "eax" return code # $round rounds &function_begin_B("_aesni_set_encrypt_key"); &push ("ebp"); &push ("ebx"); &test ("eax","eax"); &jz (&label("bad_pointer")); &test ($key,$key); &jz (&label("bad_pointer")); &call (&label("pic")); &set_label("pic"); &blindpop("ebx"); &lea ("ebx",&DWP(&label("key_const")."-".&label("pic"),"ebx")); &picmeup("ebp","GFp_ia32cap_P","ebx",&label("key_const")); &movups ("xmm0",&QWP(0,"eax")); # pull first 128 bits of *userKey &xorps ("xmm4","xmm4"); # low dword of xmm4 is assumed 0 &mov ("ebp",&DWP(4,"ebp")); &lea ($key,&DWP(16,$key)); &and ("ebp",1<<28|1<<11); # AVX and XOP bits &cmp ($rounds,256); &je (&label("14rounds")); # 192-bit key support was removed. &cmp ($rounds,128); &jne (&label("bad_keybits")); &set_label("10rounds",16); &cmp ("ebp",1<<28); &je (&label("10rounds_alt")); &mov ($rounds,9); &$movekey (&QWP(-16,$key),"xmm0"); # round 0 &aeskeygenassist("xmm1","xmm0",0x01); # round 1 &call (&label("key_128_cold")); &aeskeygenassist("xmm1","xmm0",0x2); # round 2 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x04); # round 3 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x08); # round 4 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x10); # round 5 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x20); # round 6 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x40); # round 7 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x80); # round 8 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x1b); # round 9 &call (&label("key_128")); &aeskeygenassist("xmm1","xmm0",0x36); # round 10 &call (&label("key_128")); &$movekey (&QWP(0,$key),"xmm0"); &mov (&DWP(80,$key),$rounds); &jmp (&label("good_key")); &set_label("key_128",16); &$movekey (&QWP(0,$key),"xmm0"); &lea ($key,&DWP(16,$key)); &set_label("key_128_cold"); &shufps ("xmm4","xmm0",0b00010000); &xorps ("xmm0","xmm4"); &shufps ("xmm4","xmm0",0b10001100); &xorps ("xmm0","xmm4"); &shufps ("xmm1","xmm1",0b11111111); # critical path &xorps ("xmm0","xmm1"); &ret(); &set_label("10rounds_alt",16); &movdqa ("xmm5",&QWP(0x00,"ebx")); &mov ($rounds,8); &movdqa ("xmm4",&QWP(0x20,"ebx")); &movdqa ("xmm2","xmm0"); &movdqu (&QWP(-16,$key),"xmm0"); &set_label("loop_key128"); &pshufb ("xmm0","xmm5"); &aesenclast ("xmm0","xmm4"); &pslld ("xmm4",1); &lea ($key,&DWP(16,$key)); &movdqa ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm2","xmm3"); &pxor ("xmm0","xmm2"); &movdqu (&QWP(-16,$key),"xmm0"); &movdqa ("xmm2","xmm0"); &dec ($rounds); &jnz (&label("loop_key128")); &movdqa ("xmm4",&QWP(0x30,"ebx")); &pshufb ("xmm0","xmm5"); &aesenclast ("xmm0","xmm4"); &pslld ("xmm4",1); &movdqa ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm2","xmm3"); &pxor ("xmm0","xmm2"); &movdqu (&QWP(0,$key),"xmm0"); &movdqa ("xmm2","xmm0"); &pshufb ("xmm0","xmm5"); &aesenclast ("xmm0","xmm4"); &movdqa ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm3","xmm2"); &pslldq ("xmm2",4); &pxor ("xmm2","xmm3"); &pxor ("xmm0","xmm2"); &movdqu (&QWP(16,$key),"xmm0"); &mov ($rounds,9); &mov (&DWP(96,$key),$rounds); &jmp (&label("good_key")); # 192-bit key support was removed. &set_label("14rounds",16); &movups ("xmm2",&QWP(16,"eax")); # remaining half of *userKey &lea ($key,&DWP(16,$key)); &cmp ("ebp",1<<28); &je (&label("14rounds_alt")); &mov ($rounds,13); &$movekey (&QWP(-32,$key),"xmm0"); # round 0 &$movekey (&QWP(-16,$key),"xmm2"); # round 1 &aeskeygenassist("xmm1","xmm2",0x01); # round 2 &call (&label("key_256a_cold")); &aeskeygenassist("xmm1","xmm0",0x01); # round 3 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x02); # round 4 &call (&label("key_256a")); &aeskeygenassist("xmm1","xmm0",0x02); # round 5 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x04); # round 6 &call (&label("key_256a")); &aeskeygenassist("xmm1","xmm0",0x04); # round 7 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x08); # round 8 &call (&label("key_256a")); &aeskeygenassist("xmm1","xmm0",0x08); # round 9 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x10); # round 10 &call (&label("key_256a")); &aeskeygenassist("xmm1","xmm0",0x10); # round 11 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x20); # round 12 &call (&label("key_256a")); &aeskeygenassist("xmm1","xmm0",0x20); # round 13 &call (&label("key_256b")); &aeskeygenassist("xmm1","xmm2",0x40); # round 14 &call (&label("key_256a")); &$movekey (&QWP(0,$key),"xmm0"); &mov (&DWP(16,$key),$rounds); &xor ("eax","eax"); &jmp (&label("good_key")); &set_label("key_256a",16); &$movekey (&QWP(0,$key),"xmm2"); &lea ($key,&DWP(16,$key)); &set_label("key_256a_cold"); &shufps ("xmm4","xmm0",0b00010000); &xorps ("xmm0","xmm4"); &shufps ("xmm4","xmm0",0b10001100); &xorps ("xmm0","xmm4"); &shufps ("xmm1","xmm1",0b11111111); # critical path &xorps ("xmm0","xmm1"); &ret(); &set_label("key_256b",16); &$movekey (&QWP(0,$key),"xmm0"); &lea ($key,&DWP(16,$key)); &shufps ("xmm4","xmm2",0b00010000); &xorps ("xmm2","xmm4"); &shufps ("xmm4","xmm2",0b10001100); &xorps ("xmm2","xmm4"); &shufps ("xmm1","xmm1",0b10101010); # critical path &xorps ("xmm2","xmm1"); &ret(); &set_label("14rounds_alt",16); &movdqa ("xmm5",&QWP(0x00,"ebx")); &movdqa ("xmm4",&QWP(0x20,"ebx")); &mov ($rounds,7); &movdqu (&QWP(-32,$key),"xmm0"); &movdqa ("xmm1","xmm2"); &movdqu (&QWP(-16,$key),"xmm2"); &set_label("loop_key256"); &pshufb ("xmm2","xmm5"); &aesenclast ("xmm2","xmm4"); &movdqa ("xmm3","xmm0"); &pslldq ("xmm0",4); &pxor ("xmm3","xmm0"); &pslldq ("xmm0",4); &pxor ("xmm3","xmm0"); &pslldq ("xmm0",4); &pxor ("xmm0","xmm3"); &pslld ("xmm4",1); &pxor ("xmm0","xmm2"); &movdqu (&QWP(0,$key),"xmm0"); &dec ($rounds); &jz (&label("done_key256")); &pshufd ("xmm2","xmm0",0xff); &pxor ("xmm3","xmm3"); &aesenclast ("xmm2","xmm3"); &movdqa ("xmm3","xmm1"); &pslldq ("xmm1",4); &pxor ("xmm3","xmm1"); &pslldq ("xmm1",4); &pxor ("xmm3","xmm1"); &pslldq ("xmm1",4); &pxor ("xmm1","xmm3"); &pxor ("xmm2","xmm1"); &movdqu (&QWP(16,$key),"xmm2"); &lea ($key,&DWP(32,$key)); &movdqa ("xmm1","xmm2"); &jmp (&label("loop_key256")); &set_label("done_key256"); &mov ($rounds,13); &mov (&DWP(16,$key),$rounds); &set_label("good_key"); &pxor ("xmm0","xmm0"); &pxor ("xmm1","xmm1"); &pxor ("xmm2","xmm2"); &pxor ("xmm3","xmm3"); &pxor ("xmm4","xmm4"); &pxor ("xmm5","xmm5"); &xor ("eax","eax"); &pop ("ebx"); &pop ("ebp"); &ret (); &set_label("bad_pointer",4); &mov ("eax",-1); &pop ("ebx"); &pop ("ebp"); &ret (); &set_label("bad_keybits",4); &pxor ("xmm0","xmm0"); &mov ("eax",-2); &pop ("ebx"); &pop ("ebp"); &ret (); &function_end_B("_aesni_set_encrypt_key"); # int $PREFIX_set_encrypt_key (const unsigned char *userKey, int bits, # AES_KEY *key) &function_begin_B("${PREFIX}_set_encrypt_key"); &mov ("eax",&wparam(0)); &mov ($rounds,&wparam(1)); &mov ($key,&wparam(2)); &call ("_aesni_set_encrypt_key"); &ret (); &function_end_B("${PREFIX}_set_encrypt_key"); &set_label("key_const",64); &data_word(0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d); &data_word(0x04070605,0x04070605,0x04070605,0x04070605); &data_word(1,1,1,1); &data_word(0x1b,0x1b,0x1b,0x1b); &asciz("AES for Intel AES-NI, CRYPTOGAMS by "); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/aesni-x86_64.pl000064400000000000000000001341331352416253600203570ustar0000000000000000#! /usr/bin/env perl # Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements support for Intel AES-NI extension. In # OpenSSL context it's used with Intel engine, but can also be used as # drop-in replacement for crypto/aes/asm/aes-x86_64.pl [see below for # details]. # # Performance. # # Given aes(enc|dec) instructions' latency asymptotic performance for # non-parallelizable modes such as CBC encrypt is 3.75 cycles per byte # processed with 128-bit key. And given their throughput asymptotic # performance for parallelizable modes is 1.25 cycles per byte. Being # asymptotic limit it's not something you commonly achieve in reality, # but how close does one get? Below are results collected for # different modes and block sized. Pairs of numbers are for en-/ # decryption. # # 16-byte 64-byte 256-byte 1-KB 8-KB # ECB 4.25/4.25 1.38/1.38 1.28/1.28 1.26/1.26 1.26/1.26 # CTR 5.42/5.42 1.92/1.92 1.44/1.44 1.28/1.28 1.26/1.26 # CBC 4.38/4.43 4.15/1.43 4.07/1.32 4.07/1.29 4.06/1.28 # CCM 5.66/9.42 4.42/5.41 4.16/4.40 4.09/4.15 4.06/4.07 # OFB 5.42/5.42 4.64/4.64 4.44/4.44 4.39/4.39 4.38/4.38 # CFB 5.73/5.85 5.56/5.62 5.48/5.56 5.47/5.55 5.47/5.55 # # ECB, CTR, CBC and CCM results are free from EVP overhead. This means # that otherwise used 'openssl speed -evp aes-128-??? -engine aesni # [-decrypt]' will exhibit 10-15% worse results for smaller blocks. # The results were collected with specially crafted speed.c benchmark # in order to compare them with results reported in "Intel Advanced # Encryption Standard (AES) New Instruction Set" White Paper Revision # 3.0 dated May 2010. All above results are consistently better. This # module also provides better performance for block sizes smaller than # 128 bytes in points *not* represented in the above table. # # Looking at the results for 8-KB buffer. # # CFB and OFB results are far from the limit, because implementation # uses "generic" CRYPTO_[c|o]fb128_encrypt interfaces relying on # single-block aesni_encrypt, which is not the most optimal way to go. # CBC encrypt result is unexpectedly high and there is no documented # explanation for it. Seemingly there is a small penalty for feeding # the result back to AES unit the way it's done in CBC mode. There is # nothing one can do and the result appears optimal. CCM result is # identical to CBC, because CBC-MAC is essentially CBC encrypt without # saving output. CCM CTR "stays invisible," because it's neatly # interleaved wih CBC-MAC. This provides ~30% improvement over # "straightforward" CCM implementation with CTR and CBC-MAC performed # disjointly. Parallelizable modes practically achieve the theoretical # limit. # # Looking at how results vary with buffer size. # # Curves are practically saturated at 1-KB buffer size. In most cases # "256-byte" performance is >95%, and "64-byte" is ~90% of "8-KB" one. # CTR curve doesn't follow this pattern and is "slowest" changing one # with "256-byte" result being 87% of "8-KB." This is because overhead # in CTR mode is most computationally intensive. Small-block CCM # decrypt is slower than encrypt, because first CTR and last CBC-MAC # iterations can't be interleaved. # # Results for 192- and 256-bit keys. # # EVP-free results were observed to scale perfectly with number of # rounds for larger block sizes, i.e. 192-bit result being 10/12 times # lower and 256-bit one - 10/14. Well, in CBC encrypt case differences # are a tad smaller, because the above mentioned penalty biases all # results by same constant value. In similar way function call # overhead affects small-block performance, as well as OFB and CFB # results. Differences are not large, most common coefficients are # 10/11.7 and 10/13.4 (as opposite to 10/12.0 and 10/14.0), but one # observe even 10/11.2 and 10/12.4 (CTR, OFB, CFB)... # January 2011 # # While Westmere processor features 6 cycles latency for aes[enc|dec] # instructions, which can be scheduled every second cycle, Sandy # Bridge spends 8 cycles per instruction, but it can schedule them # every cycle. This means that code targeting Westmere would perform # suboptimally on Sandy Bridge. Therefore this update. # # In addition, non-parallelizable CBC encrypt (as well as CCM) is # optimized. Relative improvement might appear modest, 8% on Westmere, # but in absolute terms it's 3.77 cycles per byte encrypted with # 128-bit key on Westmere, and 5.07 - on Sandy Bridge. These numbers # should be compared to asymptotic limits of 3.75 for Westmere and # 5.00 for Sandy Bridge. Actually, the fact that they get this close # to asymptotic limits is quite amazing. Indeed, the limit is # calculated as latency times number of rounds, 10 for 128-bit key, # and divided by 16, the number of bytes in block, or in other words # it accounts *solely* for aesenc instructions. But there are extra # instructions, and numbers so close to the asymptotic limits mean # that it's as if it takes as little as *one* additional cycle to # execute all of them. How is it possible? It is possible thanks to # out-of-order execution logic, which manages to overlap post- # processing of previous block, things like saving the output, with # actual encryption of current block, as well as pre-processing of # current block, things like fetching input and xor-ing it with # 0-round element of the key schedule, with actual encryption of # previous block. Keep this in mind... # # For parallelizable modes, such as ECB, CBC decrypt, CTR, higher # performance is achieved by interleaving instructions working on # independent blocks. In which case asymptotic limit for such modes # can be obtained by dividing above mentioned numbers by AES # instructions' interleave factor. Westmere can execute at most 3 # instructions at a time, meaning that optimal interleave factor is 3, # and that's where the "magic" number of 1.25 come from. "Optimal # interleave factor" means that increase of interleave factor does # not improve performance. The formula has proven to reflect reality # pretty well on Westmere... Sandy Bridge on the other hand can # execute up to 8 AES instructions at a time, so how does varying # interleave factor affect the performance? Here is table for ECB # (numbers are cycles per byte processed with 128-bit key): # # instruction interleave factor 3x 6x 8x # theoretical asymptotic limit 1.67 0.83 0.625 # measured performance for 8KB block 1.05 0.86 0.84 # # "as if" interleave factor 4.7x 5.8x 6.0x # # Further data for other parallelizable modes: # # CBC decrypt 1.16 0.93 0.74 # CTR 1.14 0.91 0.74 # # Well, given 3x column it's probably inappropriate to call the limit # asymptotic, if it can be surpassed, isn't it? What happens there? # Rewind to CBC paragraph for the answer. Yes, out-of-order execution # magic is responsible for this. Processor overlaps not only the # additional instructions with AES ones, but even AES instructions # processing adjacent triplets of independent blocks. In the 6x case # additional instructions still claim disproportionally small amount # of additional cycles, but in 8x case number of instructions must be # a tad too high for out-of-order logic to cope with, and AES unit # remains underutilized... As you can see 8x interleave is hardly # justifiable, so there no need to feel bad that 32-bit aesni-x86.pl # utilizes 6x interleave because of limited register bank capacity. # # Higher interleave factors do have negative impact on Westmere # performance. While for ECB mode it's negligible ~1.5%, other # parallelizables perform ~5% worse, which is outweighed by ~25% # improvement on Sandy Bridge. To balance regression on Westmere # CTR mode was implemented with 6x aesenc interleave factor. # April 2011 # # Add aesni_xts_[en|de]crypt. Westmere spends 1.25 cycles processing # one byte out of 8KB with 128-bit key, Sandy Bridge - 0.90. Just like # in CTR mode AES instruction interleave factor was chosen to be 6x. ###################################################################### # Current large-block performance in cycles per byte processed with # 128-bit key (less is better). # # CBC en-/decrypt CTR XTS ECB OCB # Westmere 3.77/1.25 1.25 1.25 1.26 # * Bridge 5.07/0.74 0.75 0.90 0.85 0.98 # Haswell 4.44/0.63 0.63 0.73 0.63 0.70 # Skylake 2.62/0.63 0.63 0.63 0.63 # Silvermont 5.75/3.54 3.56 4.12 3.87(*) 4.11 # Knights L 2.54/0.77 0.78 0.85 - 1.50 # Goldmont 3.82/1.26 1.26 1.29 1.29 1.50 # Bulldozer 5.77/0.70 0.72 0.90 0.70 0.95 # Ryzen 2.71/0.35 0.35 0.44 0.38 0.49 # # (*) Atom Silvermont ECB result is suboptimal because of penalties # incurred by operations on %xmm8-15. As ECB is not considered # critical, nothing was done to mitigate the problem. $PREFIX="aes_hw"; # if $PREFIX is set to "AES", the script # generates drop-in replacement for # crypto/aes/asm/aes-x86_64.pl:-) $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $movkey = $PREFIX eq "aes_hw" ? "movups" : "movups"; @_4args=$win64? ("%rcx","%rdx","%r8", "%r9") : # Win64 order ("%rdi","%rsi","%rdx","%rcx"); # Unix order $code=".text\n"; $code.=".extern GFp_ia32cap_P\n"; $rounds="%eax"; # input to and changed by aesni_[en|de]cryptN !!! # this is natural Unix argument order for public $PREFIX_[ecb|cbc]_encrypt ... $inp="%rdi"; $out="%rsi"; $len="%rdx"; $key="%rcx"; # input to and changed by aesni_[en|de]cryptN !!! $ivp="%r8"; # cbc, ctr, ... $rnds_="%r10d"; # backup copy for $rounds $key_="%r11"; # backup copy for $key # %xmm register layout $rndkey0="%xmm0"; $rndkey1="%xmm1"; $inout0="%xmm2"; $inout1="%xmm3"; $inout2="%xmm4"; $inout3="%xmm5"; $inout4="%xmm6"; $inout5="%xmm7"; $inout6="%xmm8"; $inout7="%xmm9"; $in2="%xmm6"; $in1="%xmm7"; # used in CBC decrypt, CTR, ... $in0="%xmm8"; $iv="%xmm9"; # Inline version of internal aesni_[en|de]crypt1. # # Why folded loop? Because aes[enc|dec] is slow enough to accommodate # cycles which take care of loop variables... { my $sn; sub aesni_generate1 { my ($p,$key,$rounds,$inout,$ivec)=@_; $inout=$inout0 if (!defined($inout)); ++$sn; $code.=<<___; $movkey ($key),$rndkey0 $movkey 16($key),$rndkey1 ___ $code.=<<___ if (defined($ivec)); xorps $rndkey0,$ivec lea 32($key),$key xorps $ivec,$inout ___ $code.=<<___ if (!defined($ivec)); lea 32($key),$key xorps $rndkey0,$inout ___ $code.=<<___; .Loop_${p}1_$sn: aes${p} $rndkey1,$inout dec $rounds $movkey ($key),$rndkey1 lea 16($key),$key jnz .Loop_${p}1_$sn # loop body is 16 bytes aes${p}last $rndkey1,$inout ___ }} # void $PREFIX_[en|de]crypt (const void *inp,void *out,const AES_KEY *key); # { my ($inp,$out,$key) = @_4args; $code.=<<___; .globl GFp_${PREFIX}_encrypt .type GFp_${PREFIX}_encrypt,\@abi-omnipotent .align 16 GFp_${PREFIX}_encrypt: .cfi_startproc movups ($inp),$inout0 # load input mov 240($key),$rounds # key->rounds ___ &aesni_generate1("enc",$key,$rounds); $code.=<<___; pxor $rndkey0,$rndkey0 # clear register bank pxor $rndkey1,$rndkey1 movups $inout0,($out) # output pxor $inout0,$inout0 ret .cfi_endproc .size GFp_${PREFIX}_encrypt,.-GFp_${PREFIX}_encrypt ___ } # _aesni_[en|de]cryptN are private interfaces, N denotes interleave # factor. Why 3x subroutine were originally used in loops? Even though # aes[enc|dec] latency was originally 6, it could be scheduled only # every *2nd* cycle. Thus 3x interleave was the one providing optimal # utilization, i.e. when subroutine's throughput is virtually same as # of non-interleaved subroutine [for number of input blocks up to 3]. # This is why it originally made no sense to implement 2x subroutine. # But times change and it became appropriate to spend extra 192 bytes # on 2x subroutine on Atom Silvermont account. For processors that # can schedule aes[enc|dec] every cycle optimal interleave factor # equals to corresponding instructions latency. 8x is optimal for # * Bridge and "super-optimal" for other Intel CPUs... sub aesni_generate2 { my $dir=shift; # As already mentioned it takes in $key and $rounds, which are *not* # preserved. $inout[0-1] is cipher/clear text... $code.=<<___; .type _aesni_${dir}rypt2,\@abi-omnipotent .align 16 _aesni_${dir}rypt2: .cfi_startproc $movkey ($key),$rndkey0 shl \$4,$rounds $movkey 16($key),$rndkey1 xorps $rndkey0,$inout0 xorps $rndkey0,$inout1 $movkey 32($key),$rndkey0 lea 32($key,$rounds),$key neg %rax # $rounds add \$16,%rax .L${dir}_loop2: aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 $movkey ($key,%rax),$rndkey1 add \$32,%rax aes${dir} $rndkey0,$inout0 aes${dir} $rndkey0,$inout1 $movkey -16($key,%rax),$rndkey0 jnz .L${dir}_loop2 aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir}last $rndkey0,$inout0 aes${dir}last $rndkey0,$inout1 ret .cfi_endproc .size _aesni_${dir}rypt2,.-_aesni_${dir}rypt2 ___ } sub aesni_generate3 { my $dir=shift; # As already mentioned it takes in $key and $rounds, which are *not* # preserved. $inout[0-2] is cipher/clear text... $code.=<<___; .type _aesni_${dir}rypt3,\@abi-omnipotent .align 16 _aesni_${dir}rypt3: .cfi_startproc $movkey ($key),$rndkey0 shl \$4,$rounds $movkey 16($key),$rndkey1 xorps $rndkey0,$inout0 xorps $rndkey0,$inout1 xorps $rndkey0,$inout2 $movkey 32($key),$rndkey0 lea 32($key,$rounds),$key neg %rax # $rounds add \$16,%rax .L${dir}_loop3: aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 $movkey ($key,%rax),$rndkey1 add \$32,%rax aes${dir} $rndkey0,$inout0 aes${dir} $rndkey0,$inout1 aes${dir} $rndkey0,$inout2 $movkey -16($key,%rax),$rndkey0 jnz .L${dir}_loop3 aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 aes${dir}last $rndkey0,$inout0 aes${dir}last $rndkey0,$inout1 aes${dir}last $rndkey0,$inout2 ret .cfi_endproc .size _aesni_${dir}rypt3,.-_aesni_${dir}rypt3 ___ } # 4x interleave is implemented to improve small block performance, # most notably [and naturally] 4 block by ~30%. One can argue that one # should have implemented 5x as well, but improvement would be <20%, # so it's not worth it... sub aesni_generate4 { my $dir=shift; # As already mentioned it takes in $key and $rounds, which are *not* # preserved. $inout[0-3] is cipher/clear text... $code.=<<___; .type _aesni_${dir}rypt4,\@abi-omnipotent .align 16 _aesni_${dir}rypt4: .cfi_startproc $movkey ($key),$rndkey0 shl \$4,$rounds $movkey 16($key),$rndkey1 xorps $rndkey0,$inout0 xorps $rndkey0,$inout1 xorps $rndkey0,$inout2 xorps $rndkey0,$inout3 $movkey 32($key),$rndkey0 lea 32($key,$rounds),$key neg %rax # $rounds .byte 0x0f,0x1f,0x00 add \$16,%rax .L${dir}_loop4: aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 aes${dir} $rndkey1,$inout3 $movkey ($key,%rax),$rndkey1 add \$32,%rax aes${dir} $rndkey0,$inout0 aes${dir} $rndkey0,$inout1 aes${dir} $rndkey0,$inout2 aes${dir} $rndkey0,$inout3 $movkey -16($key,%rax),$rndkey0 jnz .L${dir}_loop4 aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 aes${dir} $rndkey1,$inout3 aes${dir}last $rndkey0,$inout0 aes${dir}last $rndkey0,$inout1 aes${dir}last $rndkey0,$inout2 aes${dir}last $rndkey0,$inout3 ret .cfi_endproc .size _aesni_${dir}rypt4,.-_aesni_${dir}rypt4 ___ } sub aesni_generate6 { my $dir=shift; # As already mentioned it takes in $key and $rounds, which are *not* # preserved. $inout[0-5] is cipher/clear text... $code.=<<___; .type _aesni_${dir}rypt6,\@abi-omnipotent .align 16 _aesni_${dir}rypt6: .cfi_startproc $movkey ($key),$rndkey0 shl \$4,$rounds $movkey 16($key),$rndkey1 xorps $rndkey0,$inout0 pxor $rndkey0,$inout1 pxor $rndkey0,$inout2 aes${dir} $rndkey1,$inout0 lea 32($key,$rounds),$key neg %rax # $rounds aes${dir} $rndkey1,$inout1 pxor $rndkey0,$inout3 pxor $rndkey0,$inout4 aes${dir} $rndkey1,$inout2 pxor $rndkey0,$inout5 $movkey ($key,%rax),$rndkey0 add \$16,%rax jmp .L${dir}_loop6_enter .align 16 .L${dir}_loop6: aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 .L${dir}_loop6_enter: aes${dir} $rndkey1,$inout3 aes${dir} $rndkey1,$inout4 aes${dir} $rndkey1,$inout5 $movkey ($key,%rax),$rndkey1 add \$32,%rax aes${dir} $rndkey0,$inout0 aes${dir} $rndkey0,$inout1 aes${dir} $rndkey0,$inout2 aes${dir} $rndkey0,$inout3 aes${dir} $rndkey0,$inout4 aes${dir} $rndkey0,$inout5 $movkey -16($key,%rax),$rndkey0 jnz .L${dir}_loop6 aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 aes${dir} $rndkey1,$inout3 aes${dir} $rndkey1,$inout4 aes${dir} $rndkey1,$inout5 aes${dir}last $rndkey0,$inout0 aes${dir}last $rndkey0,$inout1 aes${dir}last $rndkey0,$inout2 aes${dir}last $rndkey0,$inout3 aes${dir}last $rndkey0,$inout4 aes${dir}last $rndkey0,$inout5 ret .cfi_endproc .size _aesni_${dir}rypt6,.-_aesni_${dir}rypt6 ___ } sub aesni_generate8 { my $dir=shift; # As already mentioned it takes in $key and $rounds, which are *not* # preserved. $inout[0-7] is cipher/clear text... $code.=<<___; .type _aesni_${dir}rypt8,\@abi-omnipotent .align 16 _aesni_${dir}rypt8: .cfi_startproc $movkey ($key),$rndkey0 shl \$4,$rounds $movkey 16($key),$rndkey1 xorps $rndkey0,$inout0 xorps $rndkey0,$inout1 pxor $rndkey0,$inout2 pxor $rndkey0,$inout3 pxor $rndkey0,$inout4 lea 32($key,$rounds),$key neg %rax # $rounds aes${dir} $rndkey1,$inout0 pxor $rndkey0,$inout5 pxor $rndkey0,$inout6 aes${dir} $rndkey1,$inout1 pxor $rndkey0,$inout7 $movkey ($key,%rax),$rndkey0 add \$16,%rax jmp .L${dir}_loop8_inner .align 16 .L${dir}_loop8: aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 .L${dir}_loop8_inner: aes${dir} $rndkey1,$inout2 aes${dir} $rndkey1,$inout3 aes${dir} $rndkey1,$inout4 aes${dir} $rndkey1,$inout5 aes${dir} $rndkey1,$inout6 aes${dir} $rndkey1,$inout7 .L${dir}_loop8_enter: $movkey ($key,%rax),$rndkey1 add \$32,%rax aes${dir} $rndkey0,$inout0 aes${dir} $rndkey0,$inout1 aes${dir} $rndkey0,$inout2 aes${dir} $rndkey0,$inout3 aes${dir} $rndkey0,$inout4 aes${dir} $rndkey0,$inout5 aes${dir} $rndkey0,$inout6 aes${dir} $rndkey0,$inout7 $movkey -16($key,%rax),$rndkey0 jnz .L${dir}_loop8 aes${dir} $rndkey1,$inout0 aes${dir} $rndkey1,$inout1 aes${dir} $rndkey1,$inout2 aes${dir} $rndkey1,$inout3 aes${dir} $rndkey1,$inout4 aes${dir} $rndkey1,$inout5 aes${dir} $rndkey1,$inout6 aes${dir} $rndkey1,$inout7 aes${dir}last $rndkey0,$inout0 aes${dir}last $rndkey0,$inout1 aes${dir}last $rndkey0,$inout2 aes${dir}last $rndkey0,$inout3 aes${dir}last $rndkey0,$inout4 aes${dir}last $rndkey0,$inout5 aes${dir}last $rndkey0,$inout6 aes${dir}last $rndkey0,$inout7 ret .cfi_endproc .size _aesni_${dir}rypt8,.-_aesni_${dir}rypt8 ___ } &aesni_generate2("enc") if ($PREFIX eq "aes_hw"); &aesni_generate3("enc") if ($PREFIX eq "aes_hw"); &aesni_generate4("enc") if ($PREFIX eq "aes_hw"); &aesni_generate6("enc") if ($PREFIX eq "aes_hw"); &aesni_generate8("enc") if ($PREFIX eq "aes_hw"); if ($PREFIX eq "aes_hw") { { ###################################################################### # void GFp_aes_hw_ctr32_encrypt_blocks (const void *in, void *out, # size_t blocks, const AES_KEY *key, # const char *ivec); # # Handles only complete blocks, operates on 32-bit counter and # does not update *ivec! (see crypto/modes/ctr128.c for details) # # Overhaul based on suggestions from Shay Gueron and Vlad Krasnov, # http://rt.openssl.org/Ticket/Display.html?id=3021&user=guest&pass=guest. # Keywords are full unroll and modulo-schedule counter calculations # with zero-round key xor. { my ($in0,$in1,$in2,$in3,$in4,$in5)=map("%xmm$_",(10..15)); my ($key0,$ctr)=("%ebp","${ivp}d"); my $frame_size = 0x80 + ($win64?160:0); $code.=<<___; .globl GFp_${PREFIX}_ctr32_encrypt_blocks .type GFp_${PREFIX}_ctr32_encrypt_blocks,\@function,5 .align 16 GFp_${PREFIX}_ctr32_encrypt_blocks: .cfi_startproc cmp \$1,$len jne .Lctr32_bulk # handle single block without allocating stack frame, # useful when handling edges movups ($ivp),$inout0 movups ($inp),$inout1 mov 240($key),%edx # key->rounds ___ &aesni_generate1("enc",$key,"%edx"); $code.=<<___; pxor $rndkey0,$rndkey0 # clear register bank pxor $rndkey1,$rndkey1 xorps $inout1,$inout0 pxor $inout1,$inout1 movups $inout0,($out) xorps $inout0,$inout0 jmp .Lctr32_epilogue .align 16 .Lctr32_bulk: lea (%rsp),$key_ # use $key_ as frame pointer .cfi_def_cfa_register $key_ push %rbp .cfi_push %rbp sub \$$frame_size,%rsp and \$-16,%rsp # Linux kernel stack can be incorrectly seeded ___ $code.=<<___ if ($win64); movaps %xmm6,-0xa8($key_) # offload everything movaps %xmm7,-0x98($key_) movaps %xmm8,-0x88($key_) movaps %xmm9,-0x78($key_) movaps %xmm10,-0x68($key_) movaps %xmm11,-0x58($key_) movaps %xmm12,-0x48($key_) movaps %xmm13,-0x38($key_) movaps %xmm14,-0x28($key_) movaps %xmm15,-0x18($key_) .Lctr32_body: ___ $code.=<<___; # 8 16-byte words on top of stack are counter values # xor-ed with zero-round key movdqu ($ivp),$inout0 movdqu ($key),$rndkey0 mov 12($ivp),$ctr # counter LSB pxor $rndkey0,$inout0 mov 12($key),$key0 # 0-round key LSB movdqa $inout0,0x00(%rsp) # populate counter block bswap $ctr movdqa $inout0,$inout1 movdqa $inout0,$inout2 movdqa $inout0,$inout3 movdqa $inout0,0x40(%rsp) movdqa $inout0,0x50(%rsp) movdqa $inout0,0x60(%rsp) mov %rdx,%r10 # about to borrow %rdx movdqa $inout0,0x70(%rsp) lea 1($ctr),%rax lea 2($ctr),%rdx bswap %eax bswap %edx xor $key0,%eax xor $key0,%edx pinsrd \$3,%eax,$inout1 lea 3($ctr),%rax movdqa $inout1,0x10(%rsp) pinsrd \$3,%edx,$inout2 bswap %eax mov %r10,%rdx # restore %rdx lea 4($ctr),%r10 movdqa $inout2,0x20(%rsp) xor $key0,%eax bswap %r10d pinsrd \$3,%eax,$inout3 xor $key0,%r10d movdqa $inout3,0x30(%rsp) lea 5($ctr),%r9 mov %r10d,0x40+12(%rsp) bswap %r9d lea 6($ctr),%r10 mov 240($key),$rounds # key->rounds xor $key0,%r9d bswap %r10d mov %r9d,0x50+12(%rsp) xor $key0,%r10d lea 7($ctr),%r9 mov %r10d,0x60+12(%rsp) bswap %r9d leaq GFp_ia32cap_P(%rip),%r10 mov 4(%r10),%r10d xor $key0,%r9d and \$`1<<26|1<<22`,%r10d # isolate XSAVE+MOVBE mov %r9d,0x70+12(%rsp) $movkey 0x10($key),$rndkey1 movdqa 0x40(%rsp),$inout4 movdqa 0x50(%rsp),$inout5 cmp \$8,$len # $len is in blocks jb .Lctr32_tail # short input if ($len<8) sub \$6,$len # $len is biased by -6 cmp \$`1<<22`,%r10d # check for MOVBE without XSAVE je .Lctr32_6x # [which denotes Atom Silvermont] lea 0x80($key),$key # size optimization sub \$2,$len # $len is biased by -8 jmp .Lctr32_loop8 .align 16 .Lctr32_6x: shl \$4,$rounds mov \$48,$rnds_ bswap $key0 lea 32($key,$rounds),$key # end of key schedule sub %rax,%r10 # twisted $rounds jmp .Lctr32_loop6 .align 16 .Lctr32_loop6: add \$6,$ctr # next counter value $movkey -48($key,$rnds_),$rndkey0 aesenc $rndkey1,$inout0 mov $ctr,%eax xor $key0,%eax aesenc $rndkey1,$inout1 movbe %eax,`0x00+12`(%rsp) # store next counter value lea 1($ctr),%eax aesenc $rndkey1,$inout2 xor $key0,%eax movbe %eax,`0x10+12`(%rsp) aesenc $rndkey1,$inout3 lea 2($ctr),%eax xor $key0,%eax aesenc $rndkey1,$inout4 movbe %eax,`0x20+12`(%rsp) lea 3($ctr),%eax aesenc $rndkey1,$inout5 $movkey -32($key,$rnds_),$rndkey1 xor $key0,%eax aesenc $rndkey0,$inout0 movbe %eax,`0x30+12`(%rsp) lea 4($ctr),%eax aesenc $rndkey0,$inout1 xor $key0,%eax movbe %eax,`0x40+12`(%rsp) aesenc $rndkey0,$inout2 lea 5($ctr),%eax xor $key0,%eax aesenc $rndkey0,$inout3 movbe %eax,`0x50+12`(%rsp) mov %r10,%rax # mov $rnds_,$rounds aesenc $rndkey0,$inout4 aesenc $rndkey0,$inout5 $movkey -16($key,$rnds_),$rndkey0 call .Lenc_loop6 movdqu ($inp),$inout6 # load 6 input blocks movdqu 0x10($inp),$inout7 movdqu 0x20($inp),$in0 movdqu 0x30($inp),$in1 movdqu 0x40($inp),$in2 movdqu 0x50($inp),$in3 lea 0x60($inp),$inp # $inp+=6*16 $movkey -64($key,$rnds_),$rndkey1 pxor $inout0,$inout6 # inp^=E(ctr) movaps 0x00(%rsp),$inout0 # load next counter [xor-ed with 0 round] pxor $inout1,$inout7 movaps 0x10(%rsp),$inout1 pxor $inout2,$in0 movaps 0x20(%rsp),$inout2 pxor $inout3,$in1 movaps 0x30(%rsp),$inout3 pxor $inout4,$in2 movaps 0x40(%rsp),$inout4 pxor $inout5,$in3 movaps 0x50(%rsp),$inout5 movdqu $inout6,($out) # store 6 output blocks movdqu $inout7,0x10($out) movdqu $in0,0x20($out) movdqu $in1,0x30($out) movdqu $in2,0x40($out) movdqu $in3,0x50($out) lea 0x60($out),$out # $out+=6*16 sub \$6,$len jnc .Lctr32_loop6 # loop if $len-=6 didn't borrow add \$6,$len # restore real remaining $len jz .Lctr32_done # done if ($len==0) lea -48($rnds_),$rounds lea -80($key,$rnds_),$key # restore $key neg $rounds shr \$4,$rounds # restore $rounds jmp .Lctr32_tail .align 32 .Lctr32_loop8: add \$8,$ctr # next counter value movdqa 0x60(%rsp),$inout6 aesenc $rndkey1,$inout0 mov $ctr,%r9d movdqa 0x70(%rsp),$inout7 aesenc $rndkey1,$inout1 bswap %r9d $movkey 0x20-0x80($key),$rndkey0 aesenc $rndkey1,$inout2 xor $key0,%r9d nop aesenc $rndkey1,$inout3 mov %r9d,0x00+12(%rsp) # store next counter value lea 1($ctr),%r9 aesenc $rndkey1,$inout4 aesenc $rndkey1,$inout5 aesenc $rndkey1,$inout6 aesenc $rndkey1,$inout7 $movkey 0x30-0x80($key),$rndkey1 ___ for($i=2;$i<8;$i++) { my $rndkeyx = ($i&1)?$rndkey1:$rndkey0; $code.=<<___; bswap %r9d aesenc $rndkeyx,$inout0 aesenc $rndkeyx,$inout1 xor $key0,%r9d .byte 0x66,0x90 aesenc $rndkeyx,$inout2 aesenc $rndkeyx,$inout3 mov %r9d,`0x10*($i-1)`+12(%rsp) lea $i($ctr),%r9 aesenc $rndkeyx,$inout4 aesenc $rndkeyx,$inout5 aesenc $rndkeyx,$inout6 aesenc $rndkeyx,$inout7 $movkey `0x20+0x10*$i`-0x80($key),$rndkeyx ___ } $code.=<<___; bswap %r9d aesenc $rndkey0,$inout0 aesenc $rndkey0,$inout1 aesenc $rndkey0,$inout2 xor $key0,%r9d movdqu 0x00($inp),$in0 # start loading input aesenc $rndkey0,$inout3 mov %r9d,0x70+12(%rsp) cmp \$11,$rounds aesenc $rndkey0,$inout4 aesenc $rndkey0,$inout5 aesenc $rndkey0,$inout6 aesenc $rndkey0,$inout7 $movkey 0xa0-0x80($key),$rndkey0 jb .Lctr32_enc_done aesenc $rndkey1,$inout0 aesenc $rndkey1,$inout1 aesenc $rndkey1,$inout2 aesenc $rndkey1,$inout3 aesenc $rndkey1,$inout4 aesenc $rndkey1,$inout5 aesenc $rndkey1,$inout6 aesenc $rndkey1,$inout7 $movkey 0xb0-0x80($key),$rndkey1 aesenc $rndkey0,$inout0 aesenc $rndkey0,$inout1 aesenc $rndkey0,$inout2 aesenc $rndkey0,$inout3 aesenc $rndkey0,$inout4 aesenc $rndkey0,$inout5 aesenc $rndkey0,$inout6 aesenc $rndkey0,$inout7 $movkey 0xc0-0x80($key),$rndkey0 # 192-bit key support was removed. aesenc $rndkey1,$inout0 aesenc $rndkey1,$inout1 aesenc $rndkey1,$inout2 aesenc $rndkey1,$inout3 aesenc $rndkey1,$inout4 aesenc $rndkey1,$inout5 aesenc $rndkey1,$inout6 aesenc $rndkey1,$inout7 $movkey 0xd0-0x80($key),$rndkey1 aesenc $rndkey0,$inout0 aesenc $rndkey0,$inout1 aesenc $rndkey0,$inout2 aesenc $rndkey0,$inout3 aesenc $rndkey0,$inout4 aesenc $rndkey0,$inout5 aesenc $rndkey0,$inout6 aesenc $rndkey0,$inout7 $movkey 0xe0-0x80($key),$rndkey0 jmp .Lctr32_enc_done .align 16 .Lctr32_enc_done: movdqu 0x10($inp),$in1 pxor $rndkey0,$in0 # input^=round[last] movdqu 0x20($inp),$in2 pxor $rndkey0,$in1 movdqu 0x30($inp),$in3 pxor $rndkey0,$in2 movdqu 0x40($inp),$in4 pxor $rndkey0,$in3 movdqu 0x50($inp),$in5 pxor $rndkey0,$in4 pxor $rndkey0,$in5 aesenc $rndkey1,$inout0 aesenc $rndkey1,$inout1 aesenc $rndkey1,$inout2 aesenc $rndkey1,$inout3 aesenc $rndkey1,$inout4 aesenc $rndkey1,$inout5 aesenc $rndkey1,$inout6 aesenc $rndkey1,$inout7 movdqu 0x60($inp),$rndkey1 # borrow $rndkey1 for inp[6] lea 0x80($inp),$inp # $inp+=8*16 aesenclast $in0,$inout0 # $inN is inp[N]^round[last] pxor $rndkey0,$rndkey1 # borrowed $rndkey movdqu 0x70-0x80($inp),$in0 aesenclast $in1,$inout1 pxor $rndkey0,$in0 movdqa 0x00(%rsp),$in1 # load next counter block aesenclast $in2,$inout2 aesenclast $in3,$inout3 movdqa 0x10(%rsp),$in2 movdqa 0x20(%rsp),$in3 aesenclast $in4,$inout4 aesenclast $in5,$inout5 movdqa 0x30(%rsp),$in4 movdqa 0x40(%rsp),$in5 aesenclast $rndkey1,$inout6 movdqa 0x50(%rsp),$rndkey0 $movkey 0x10-0x80($key),$rndkey1#real 1st-round key aesenclast $in0,$inout7 movups $inout0,($out) # store 8 output blocks movdqa $in1,$inout0 movups $inout1,0x10($out) movdqa $in2,$inout1 movups $inout2,0x20($out) movdqa $in3,$inout2 movups $inout3,0x30($out) movdqa $in4,$inout3 movups $inout4,0x40($out) movdqa $in5,$inout4 movups $inout5,0x50($out) movdqa $rndkey0,$inout5 movups $inout6,0x60($out) movups $inout7,0x70($out) lea 0x80($out),$out # $out+=8*16 sub \$8,$len jnc .Lctr32_loop8 # loop if $len-=8 didn't borrow add \$8,$len # restore real remaining $len jz .Lctr32_done # done if ($len==0) lea -0x80($key),$key .Lctr32_tail: # note that at this point $inout0..5 are populated with # counter values xor-ed with 0-round key lea 16($key),$key cmp \$4,$len jb .Lctr32_loop3 je .Lctr32_loop4 # if ($len>4) compute 7 E(counter) shl \$4,$rounds movdqa 0x60(%rsp),$inout6 pxor $inout7,$inout7 $movkey 16($key),$rndkey0 aesenc $rndkey1,$inout0 aesenc $rndkey1,$inout1 lea 32-16($key,$rounds),$key# prepare for .Lenc_loop8_enter neg %rax aesenc $rndkey1,$inout2 add \$16,%rax # prepare for .Lenc_loop8_enter movups ($inp),$in0 aesenc $rndkey1,$inout3 aesenc $rndkey1,$inout4 movups 0x10($inp),$in1 # pre-load input movups 0x20($inp),$in2 aesenc $rndkey1,$inout5 aesenc $rndkey1,$inout6 call .Lenc_loop8_enter movdqu 0x30($inp),$in3 pxor $in0,$inout0 movdqu 0x40($inp),$in0 pxor $in1,$inout1 movdqu $inout0,($out) # store output pxor $in2,$inout2 movdqu $inout1,0x10($out) pxor $in3,$inout3 movdqu $inout2,0x20($out) pxor $in0,$inout4 movdqu $inout3,0x30($out) movdqu $inout4,0x40($out) cmp \$6,$len jb .Lctr32_done # $len was 5, stop store movups 0x50($inp),$in1 xorps $in1,$inout5 movups $inout5,0x50($out) je .Lctr32_done # $len was 6, stop store movups 0x60($inp),$in2 xorps $in2,$inout6 movups $inout6,0x60($out) jmp .Lctr32_done # $len was 7, stop store .align 32 .Lctr32_loop4: aesenc $rndkey1,$inout0 lea 16($key),$key dec $rounds aesenc $rndkey1,$inout1 aesenc $rndkey1,$inout2 aesenc $rndkey1,$inout3 $movkey ($key),$rndkey1 jnz .Lctr32_loop4 aesenclast $rndkey1,$inout0 aesenclast $rndkey1,$inout1 movups ($inp),$in0 # load input movups 0x10($inp),$in1 aesenclast $rndkey1,$inout2 aesenclast $rndkey1,$inout3 movups 0x20($inp),$in2 movups 0x30($inp),$in3 xorps $in0,$inout0 movups $inout0,($out) # store output xorps $in1,$inout1 movups $inout1,0x10($out) pxor $in2,$inout2 movdqu $inout2,0x20($out) pxor $in3,$inout3 movdqu $inout3,0x30($out) jmp .Lctr32_done # $len was 4, stop store .align 32 .Lctr32_loop3: aesenc $rndkey1,$inout0 lea 16($key),$key dec $rounds aesenc $rndkey1,$inout1 aesenc $rndkey1,$inout2 $movkey ($key),$rndkey1 jnz .Lctr32_loop3 aesenclast $rndkey1,$inout0 aesenclast $rndkey1,$inout1 aesenclast $rndkey1,$inout2 movups ($inp),$in0 # load input xorps $in0,$inout0 movups $inout0,($out) # store output cmp \$2,$len jb .Lctr32_done # $len was 1, stop store movups 0x10($inp),$in1 xorps $in1,$inout1 movups $inout1,0x10($out) je .Lctr32_done # $len was 2, stop store movups 0x20($inp),$in2 xorps $in2,$inout2 movups $inout2,0x20($out) # $len was 3, stop store .Lctr32_done: xorps %xmm0,%xmm0 # clear register bank xor $key0,$key0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 ___ $code.=<<___ if (!$win64); pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 movaps %xmm0,0x00(%rsp) # clear stack pxor %xmm8,%xmm8 movaps %xmm0,0x10(%rsp) pxor %xmm9,%xmm9 movaps %xmm0,0x20(%rsp) pxor %xmm10,%xmm10 movaps %xmm0,0x30(%rsp) pxor %xmm11,%xmm11 movaps %xmm0,0x40(%rsp) pxor %xmm12,%xmm12 movaps %xmm0,0x50(%rsp) pxor %xmm13,%xmm13 movaps %xmm0,0x60(%rsp) pxor %xmm14,%xmm14 movaps %xmm0,0x70(%rsp) pxor %xmm15,%xmm15 ___ $code.=<<___ if ($win64); movaps -0xa8($key_),%xmm6 movaps %xmm0,-0xa8($key_) # clear stack movaps -0x98($key_),%xmm7 movaps %xmm0,-0x98($key_) movaps -0x88($key_),%xmm8 movaps %xmm0,-0x88($key_) movaps -0x78($key_),%xmm9 movaps %xmm0,-0x78($key_) movaps -0x68($key_),%xmm10 movaps %xmm0,-0x68($key_) movaps -0x58($key_),%xmm11 movaps %xmm0,-0x58($key_) movaps -0x48($key_),%xmm12 movaps %xmm0,-0x48($key_) movaps -0x38($key_),%xmm13 movaps %xmm0,-0x38($key_) movaps -0x28($key_),%xmm14 movaps %xmm0,-0x28($key_) movaps -0x18($key_),%xmm15 movaps %xmm0,-0x18($key_) movaps %xmm0,0x00(%rsp) movaps %xmm0,0x10(%rsp) movaps %xmm0,0x20(%rsp) movaps %xmm0,0x30(%rsp) movaps %xmm0,0x40(%rsp) movaps %xmm0,0x50(%rsp) movaps %xmm0,0x60(%rsp) movaps %xmm0,0x70(%rsp) ___ $code.=<<___; mov -8($key_),%rbp .cfi_restore %rbp lea ($key_),%rsp .cfi_def_cfa_register %rsp .Lctr32_epilogue: ret .cfi_endproc .size GFp_${PREFIX}_ctr32_encrypt_blocks,.-GFp_${PREFIX}_ctr32_encrypt_blocks ___ } }} { my ($inp,$bits,$key) = @_4args; $bits =~ s/%r/%e/; # This is based on submission by # # Huang Ying # Vinodh Gopal # Kahraman Akdemir # # Aggressively optimized in respect to aeskeygenassist's critical path # and is contained in %xmm0-5 to meet Win64 ABI requirement. # # int GFp_${PREFIX}_set_encrypt_key(const unsigned char *inp, # int bits, AES_KEY * const key); # # input: $inp user-supplied key # $bits $inp length in bits # $key pointer to key schedule # output: %eax 0 denoting success, -1 or -2 - failure (see C) # $bits rounds-1 (used in aesni_set_decrypt_key) # *$key key schedule # $key pointer to key schedule (used in # aesni_set_decrypt_key) # # Subroutine is frame-less, which means that only volatile registers # are used. Note that it's declared "abi-omnipotent", which means that # amount of volatile registers is smaller on Windows. # $code.=<<___; .globl GFp_${PREFIX}_set_encrypt_key .type GFp_${PREFIX}_set_encrypt_key,\@abi-omnipotent .align 16 GFp_${PREFIX}_set_encrypt_key: __aesni_set_encrypt_key: .cfi_startproc .byte 0x48,0x83,0xEC,0x08 # sub rsp,8 .cfi_adjust_cfa_offset 8 mov \$-1,%rax test $inp,$inp jz .Lenc_key_ret test $key,$key jz .Lenc_key_ret movups ($inp),%xmm0 # pull first 128 bits of *userKey xorps %xmm4,%xmm4 # low dword of xmm4 is assumed 0 leaq GFp_ia32cap_P(%rip),%r10 movl 4(%r10),%r10d and \$`1<<28|1<<11`,%r10d # AVX and XOP bits lea 16($key),%rax # %rax is used as modifiable copy of $key cmp \$256,$bits je .L14rounds # 192-bit key support was removed. cmp \$128,$bits jne .Lbad_keybits .L10rounds: mov \$9,$bits # 10 rounds for 128-bit key cmp \$`1<<28`,%r10d # AVX, bit no XOP je .L10rounds_alt $movkey %xmm0,($key) # round 0 aeskeygenassist \$0x1,%xmm0,%xmm1 # round 1 call .Lkey_expansion_128_cold aeskeygenassist \$0x2,%xmm0,%xmm1 # round 2 call .Lkey_expansion_128 aeskeygenassist \$0x4,%xmm0,%xmm1 # round 3 call .Lkey_expansion_128 aeskeygenassist \$0x8,%xmm0,%xmm1 # round 4 call .Lkey_expansion_128 aeskeygenassist \$0x10,%xmm0,%xmm1 # round 5 call .Lkey_expansion_128 aeskeygenassist \$0x20,%xmm0,%xmm1 # round 6 call .Lkey_expansion_128 aeskeygenassist \$0x40,%xmm0,%xmm1 # round 7 call .Lkey_expansion_128 aeskeygenassist \$0x80,%xmm0,%xmm1 # round 8 call .Lkey_expansion_128 aeskeygenassist \$0x1b,%xmm0,%xmm1 # round 9 call .Lkey_expansion_128 aeskeygenassist \$0x36,%xmm0,%xmm1 # round 10 call .Lkey_expansion_128 $movkey %xmm0,(%rax) mov $bits,80(%rax) # 240(%rdx) xor %eax,%eax jmp .Lenc_key_ret .align 16 .L10rounds_alt: movdqa .Lkey_rotate(%rip),%xmm5 mov \$8,%r10d movdqa .Lkey_rcon1(%rip),%xmm4 movdqa %xmm0,%xmm2 movdqu %xmm0,($key) jmp .Loop_key128 .align 16 .Loop_key128: pshufb %xmm5,%xmm0 aesenclast %xmm4,%xmm0 pslld \$1,%xmm4 lea 16(%rax),%rax movdqa %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,-16(%rax) movdqa %xmm0,%xmm2 dec %r10d jnz .Loop_key128 movdqa .Lkey_rcon1b(%rip),%xmm4 pshufb %xmm5,%xmm0 aesenclast %xmm4,%xmm0 pslld \$1,%xmm4 movdqa %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) movdqa %xmm0,%xmm2 pshufb %xmm5,%xmm0 aesenclast %xmm4,%xmm0 movdqa %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm2,%xmm3 pslldq \$4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,16(%rax) mov $bits,96(%rax) # 240($key) xor %eax,%eax jmp .Lenc_key_ret # 192-bit key support was removed. .align 16 .L14rounds: movups 16($inp),%xmm2 # remaining half of *userKey mov \$13,$bits # 14 rounds for 256 lea 16(%rax),%rax cmp \$`1<<28`,%r10d # AVX, but no XOP je .L14rounds_alt $movkey %xmm0,($key) # round 0 $movkey %xmm2,16($key) # round 1 aeskeygenassist \$0x1,%xmm2,%xmm1 # round 2 call .Lkey_expansion_256a_cold aeskeygenassist \$0x1,%xmm0,%xmm1 # round 3 call .Lkey_expansion_256b aeskeygenassist \$0x2,%xmm2,%xmm1 # round 4 call .Lkey_expansion_256a aeskeygenassist \$0x2,%xmm0,%xmm1 # round 5 call .Lkey_expansion_256b aeskeygenassist \$0x4,%xmm2,%xmm1 # round 6 call .Lkey_expansion_256a aeskeygenassist \$0x4,%xmm0,%xmm1 # round 7 call .Lkey_expansion_256b aeskeygenassist \$0x8,%xmm2,%xmm1 # round 8 call .Lkey_expansion_256a aeskeygenassist \$0x8,%xmm0,%xmm1 # round 9 call .Lkey_expansion_256b aeskeygenassist \$0x10,%xmm2,%xmm1 # round 10 call .Lkey_expansion_256a aeskeygenassist \$0x10,%xmm0,%xmm1 # round 11 call .Lkey_expansion_256b aeskeygenassist \$0x20,%xmm2,%xmm1 # round 12 call .Lkey_expansion_256a aeskeygenassist \$0x20,%xmm0,%xmm1 # round 13 call .Lkey_expansion_256b aeskeygenassist \$0x40,%xmm2,%xmm1 # round 14 call .Lkey_expansion_256a $movkey %xmm0,(%rax) mov $bits,16(%rax) # 240(%rdx) xor %rax,%rax jmp .Lenc_key_ret .align 16 .L14rounds_alt: movdqa .Lkey_rotate(%rip),%xmm5 movdqa .Lkey_rcon1(%rip),%xmm4 mov \$7,%r10d movdqu %xmm0,0($key) movdqa %xmm2,%xmm1 movdqu %xmm2,16($key) jmp .Loop_key256 .align 16 .Loop_key256: pshufb %xmm5,%xmm2 aesenclast %xmm4,%xmm2 movdqa %xmm0,%xmm3 pslldq \$4,%xmm0 pxor %xmm0,%xmm3 pslldq \$4,%xmm0 pxor %xmm0,%xmm3 pslldq \$4,%xmm0 pxor %xmm3,%xmm0 pslld \$1,%xmm4 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) dec %r10d jz .Ldone_key256 pshufd \$0xff,%xmm0,%xmm2 pxor %xmm3,%xmm3 aesenclast %xmm3,%xmm2 movdqa %xmm1,%xmm3 pslldq \$4,%xmm1 pxor %xmm1,%xmm3 pslldq \$4,%xmm1 pxor %xmm1,%xmm3 pslldq \$4,%xmm1 pxor %xmm3,%xmm1 pxor %xmm1,%xmm2 movdqu %xmm2,16(%rax) lea 32(%rax),%rax movdqa %xmm2,%xmm1 jmp .Loop_key256 .Ldone_key256: mov $bits,16(%rax) # 240($key) xor %eax,%eax jmp .Lenc_key_ret .align 16 .Lbad_keybits: mov \$-2,%rax .Lenc_key_ret: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 add \$8,%rsp .cfi_adjust_cfa_offset -8 ret .cfi_endproc .LSEH_end_GFp_set_encrypt_key: .align 16 .Lkey_expansion_128: $movkey %xmm0,(%rax) lea 16(%rax),%rax .Lkey_expansion_128_cold: shufps \$0b00010000,%xmm0,%xmm4 xorps %xmm4, %xmm0 shufps \$0b10001100,%xmm0,%xmm4 xorps %xmm4, %xmm0 shufps \$0b11111111,%xmm1,%xmm1 # critical path xorps %xmm1,%xmm0 ret .align 16 .Lkey_expansion_192a: $movkey %xmm0,(%rax) lea 16(%rax),%rax .Lkey_expansion_192a_cold: movaps %xmm2, %xmm5 .Lkey_expansion_192b_warm: shufps \$0b00010000,%xmm0,%xmm4 movdqa %xmm2,%xmm3 xorps %xmm4,%xmm0 shufps \$0b10001100,%xmm0,%xmm4 pslldq \$4,%xmm3 xorps %xmm4,%xmm0 pshufd \$0b01010101,%xmm1,%xmm1 # critical path pxor %xmm3,%xmm2 pxor %xmm1,%xmm0 pshufd \$0b11111111,%xmm0,%xmm3 pxor %xmm3,%xmm2 ret .align 16 .Lkey_expansion_192b: movaps %xmm0,%xmm3 shufps \$0b01000100,%xmm0,%xmm5 $movkey %xmm5,(%rax) shufps \$0b01001110,%xmm2,%xmm3 $movkey %xmm3,16(%rax) lea 32(%rax),%rax jmp .Lkey_expansion_192b_warm .align 16 .Lkey_expansion_256a: $movkey %xmm2,(%rax) lea 16(%rax),%rax .Lkey_expansion_256a_cold: shufps \$0b00010000,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps \$0b10001100,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps \$0b11111111,%xmm1,%xmm1 # critical path xorps %xmm1,%xmm0 ret .align 16 .Lkey_expansion_256b: $movkey %xmm0,(%rax) lea 16(%rax),%rax shufps \$0b00010000,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps \$0b10001100,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps \$0b10101010,%xmm1,%xmm1 # critical path xorps %xmm1,%xmm2 ret .size GFp_${PREFIX}_set_encrypt_key,.-GFp_${PREFIX}_set_encrypt_key .size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key ___ } $code.=<<___; .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .Lincrement32: .long 6,6,6,0 .Lincrement64: .long 1,0,0,0 .Lincrement1: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 .Lkey_rotate: .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d .Lkey_rotate192: .long 0x04070605,0x04070605,0x04070605,0x04070605 .Lkey_rcon1: .long 1,1,1,1 .Lkey_rcon1b: .long 0x1b,0x1b,0x1b,0x1b .asciz "AES for Intel AES-NI, CRYPTOGAMS by " .align 64 ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind ___ $code.=<<___ if ($PREFIX eq "aes_hw"); .type ctr_xts_se_handler,\@abi-omnipotent .align 16 ctr_xts_se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue lable cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail mov 208($context),%rax # pull context->R11 lea -0xa8(%rax),%rsi # %xmm save area lea 512($context),%rdi # & context.Xmm6 mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) .long 0xa548f3fc # cld; rep movsq mov -8(%rax),%rbp # restore saved %rbp mov %rbp,160($context) # restore context->Rbp .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size ctr_xts_se_handler,.-ctr_xts_se_handler .section .pdata .align 4 ___ $code.=<<___ if ($PREFIX eq "aes_hw"); .rva .LSEH_begin_GFp_${PREFIX}_ctr32_encrypt_blocks .rva .LSEH_end_GFp_${PREFIX}_ctr32_encrypt_blocks .rva .LSEH_info_GFp_ctr32 ___ $code.=<<___; .rva GFp_${PREFIX}_set_encrypt_key .rva .LSEH_end_GFp_set_encrypt_key .rva .LSEH_info_GFp_key .section .xdata .align 8 ___ $code.=<<___ if ($PREFIX eq "aes_hw"); .LSEH_info_GFp_ctr32: .byte 9,0,0,0 .rva ctr_xts_se_handler .rva .Lctr32_body,.Lctr32_epilogue # HandlerData[] ___ $code.=<<___; .LSEH_info_GFp_key: .byte 0x01,0x04,0x01,0x00 .byte 0x04,0x02,0x00,0x00 # sub rsp,8 ___ } sub rex { local *opcode=shift; my ($dst,$src)=@_; my $rex=0; $rex|=0x04 if($dst>=8); $rex|=0x01 if($src>=8); push @opcode,$rex|0x40 if($rex); } sub aesni { my $line=shift; my @opcode=(0x66); if ($line=~/(aeskeygenassist)\s+\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { rex(\@opcode,$4,$3); push @opcode,0x0f,0x3a,0xdf; push @opcode,0xc0|($3&7)|(($4&7)<<3); # ModR/M my $c=$2; push @opcode,$c=~/^0/?oct($c):$c; return ".byte\t".join(',',@opcode); } elsif ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { my %opcodelet = ( "aesimc" => 0xdb, "aesenc" => 0xdc, "aesenclast" => 0xdd, "aesdec" => 0xde, "aesdeclast" => 0xdf ); return undef if (!defined($opcodelet{$1})); rex(\@opcode,$3,$2); push @opcode,0x0f,0x38,$opcodelet{$1}; push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M return ".byte\t".join(',',@opcode); } elsif ($line=~/(aes[a-z]+)\s+([0x1-9a-fA-F]*)\(%rsp\),\s*%xmm([0-9]+)/) { my %opcodelet = ( "aesenc" => 0xdc, "aesenclast" => 0xdd, "aesdec" => 0xde, "aesdeclast" => 0xdf ); return undef if (!defined($opcodelet{$1})); my $off = $2; push @opcode,0x44 if ($3>=8); push @opcode,0x0f,0x38,$opcodelet{$1}; push @opcode,0x44|(($3&7)<<3),0x24; # ModR/M push @opcode,($off=~/^0/?oct($off):$off)&0xff; return ".byte\t".join(',',@opcode); } return $line; } sub movbe { ".byte 0x0f,0x38,0xf1,0x44,0x24,".shift; } $code =~ s/\`([^\`]*)\`/eval($1)/gem; $code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; #$code =~ s/\bmovbe\s+%eax/bswap %eax; mov %eax/gm; # debugging artefact $code =~ s/\bmovbe\s+%eax,\s*([0-9]+)\(%rsp\)/movbe($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/aesv8-armx.pl000064400000000000000000000342511352416253600203170ustar0000000000000000#! /usr/bin/env perl # Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements support for ARMv8 AES instructions. The # module is endian-agnostic in sense that it supports both big- and # little-endian cases. As does it support both 32- and 64-bit modes # of operation. Latter is achieved by limiting amount of utilized # registers to 16, which implies additional NEON load and integer # instructions. This has no effect on mighty Apple A7, where results # are literally equal to the theoretical estimates based on AES # instruction latencies and issue rates. On Cortex-A53, an in-order # execution core, this costs up to 10-15%, which is partially # compensated by implementing dedicated code path for 128-bit # CBC encrypt case. On Cortex-A57 parallelizable mode performance # seems to be limited by sheer amount of NEON instructions... # # Performance in cycles per byte processed with 128-bit key: # # CBC enc CBC dec CTR # Apple A7 2.39 1.20 1.20 # Cortex-A53 1.32 1.29 1.46 # Cortex-A57(*) 1.95 0.85 0.93 # Denver 1.96 0.86 0.80 # Mongoose 1.33 1.20 1.20 # # (*) original 3.64/1.34/1.32 results were for r0p0 revision # and are still same even for updated module; $flavour = shift; $output = shift; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; $prefix="aes_hw"; $code=<<___; #include #if __ARM_MAX_ARCH__>=7 .text ___ $code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/); $code.=<<___ if ($flavour !~ /64/); .arch armv7-a // don't confuse not-so-latest binutils with argv8 :-) .fpu neon .code 32 #undef __thumb2__ ___ # Assembler mnemonics are an eclectic mix of 32- and 64-bit syntax, # NEON is mostly 32-bit mnemonics, integer - mostly 64. Goal is to # maintain both 32- and 64-bit codes within single module and # transliterate common code to either flavour with regex vodoo. # {{{ my ($inp,$bits,$out,$ptr,$rounds)=("x0","w1","x2","x3","w12"); my ($zero,$rcon,$mask,$in0,$in1,$tmp,$key)= $flavour=~/64/? map("q$_",(0..6)) : map("q$_",(0..3,8..10)); # On AArch64, put the data .rodata and use adrp + add for compatibility with # execute-only memory. On AArch32, put it in .text and use adr. $code.= ".section .rodata\n" if ($flavour =~ /64/); $code.=<<___; .align 5 .Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b .text .globl GFp_${prefix}_set_encrypt_key .type GFp_${prefix}_set_encrypt_key,%function .align 5 GFp_${prefix}_set_encrypt_key: .Lenc_key: ___ $code.=<<___ if ($flavour =~ /64/); stp x29,x30,[sp,#-16]! add x29,sp,#0 ___ $code.=<<___; mov $ptr,#-1 cmp $inp,#0 b.eq .Lenc_key_abort cmp $out,#0 b.eq .Lenc_key_abort mov $ptr,#-2 cmp $bits,#128 b.lt .Lenc_key_abort cmp $bits,#256 b.gt .Lenc_key_abort tst $bits,#0x3f b.ne .Lenc_key_abort ___ $code.=<<___ if ($flavour =~ /64/); adrp $ptr,:pg_hi21:.Lrcon add $ptr,$ptr,:lo12:.Lrcon ___ $code.=<<___ if ($flavour !~ /64/); adr $ptr,.Lrcon ___ $code.=<<___; cmp $bits,#192 veor $zero,$zero,$zero vld1.8 {$in0},[$inp],#16 mov $bits,#8 // reuse $bits vld1.32 {$rcon,$mask},[$ptr],#32 b.lt .Loop128 // 192-bit key support was removed. b .L256 .align 4 .Loop128: vtbl.8 $key,{$in0},$mask vext.8 $tmp,$zero,$in0,#12 vst1.32 {$in0},[$out],#16 aese $key,$zero subs $bits,$bits,#1 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $key,$key,$rcon veor $in0,$in0,$tmp vshl.u8 $rcon,$rcon,#1 veor $in0,$in0,$key b.ne .Loop128 vld1.32 {$rcon},[$ptr] vtbl.8 $key,{$in0},$mask vext.8 $tmp,$zero,$in0,#12 vst1.32 {$in0},[$out],#16 aese $key,$zero veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $key,$key,$rcon veor $in0,$in0,$tmp vshl.u8 $rcon,$rcon,#1 veor $in0,$in0,$key vtbl.8 $key,{$in0},$mask vext.8 $tmp,$zero,$in0,#12 vst1.32 {$in0},[$out],#16 aese $key,$zero veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $key,$key,$rcon veor $in0,$in0,$tmp veor $in0,$in0,$key vst1.32 {$in0},[$out] add $out,$out,#0x50 mov $rounds,#10 b .Ldone // 192-bit key support was removed. .align 4 .L256: vld1.8 {$in1},[$inp] mov $bits,#7 mov $rounds,#14 vst1.32 {$in0},[$out],#16 .Loop256: vtbl.8 $key,{$in1},$mask vext.8 $tmp,$zero,$in0,#12 vst1.32 {$in1},[$out],#16 aese $key,$zero subs $bits,$bits,#1 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in0,$in0,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $key,$key,$rcon veor $in0,$in0,$tmp vshl.u8 $rcon,$rcon,#1 veor $in0,$in0,$key vst1.32 {$in0},[$out],#16 b.eq .Ldone vdup.32 $key,${in0}[3] // just splat vext.8 $tmp,$zero,$in1,#12 aese $key,$zero veor $in1,$in1,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in1,$in1,$tmp vext.8 $tmp,$zero,$tmp,#12 veor $in1,$in1,$tmp veor $in1,$in1,$key b .Loop256 .Ldone: str $rounds,[$out] mov $ptr,#0 .Lenc_key_abort: mov x0,$ptr // return value `"ldr x29,[sp],#16" if ($flavour =~ /64/)` ret .size GFp_${prefix}_set_encrypt_key,.-GFp_${prefix}_set_encrypt_key ___ }}} {{{ sub gen_block () { my $dir = shift; my ($e,$mc) = $dir eq "en" ? ("e","mc") : ("d","imc"); my ($inp,$out,$key)=map("x$_",(0..2)); my $rounds="w3"; my ($rndkey0,$rndkey1,$inout)=map("q$_",(0..3)); $code.=<<___; .globl GFp_${prefix}_${dir}crypt .type GFp_${prefix}_${dir}crypt,%function .align 5 GFp_${prefix}_${dir}crypt: ldr $rounds,[$key,#240] vld1.32 {$rndkey0},[$key],#16 vld1.8 {$inout},[$inp] sub $rounds,$rounds,#2 vld1.32 {$rndkey1},[$key],#16 .Loop_${dir}c: aes$e $inout,$rndkey0 aes$mc $inout,$inout vld1.32 {$rndkey0},[$key],#16 subs $rounds,$rounds,#2 aes$e $inout,$rndkey1 aes$mc $inout,$inout vld1.32 {$rndkey1},[$key],#16 b.gt .Loop_${dir}c aes$e $inout,$rndkey0 aes$mc $inout,$inout vld1.32 {$rndkey0},[$key] aes$e $inout,$rndkey1 veor $inout,$inout,$rndkey0 vst1.8 {$inout},[$out] ret .size GFp_${prefix}_${dir}crypt,.-GFp_${prefix}_${dir}crypt ___ } &gen_block("en"); &gen_block("de"); }}} {{{ my ($inp,$out,$len,$key,$ivp)=map("x$_",(0..4)); my ($rounds,$cnt,$key_)=("w5","w6","x7"); my ($ctr,$tctr0,$tctr1,$tctr2)=map("w$_",(8..10,12)); my $step="x12"; # aliases with $tctr2 my ($dat0,$dat1,$in0,$in1,$tmp0,$tmp1,$ivec,$rndlast)=map("q$_",(0..7)); my ($dat2,$in2,$tmp2)=map("q$_",(10,11,9)); my ($dat,$tmp)=($dat0,$tmp0); ### q8-q15 preloaded key schedule $code.=<<___; .globl GFp_${prefix}_ctr32_encrypt_blocks .type GFp_${prefix}_ctr32_encrypt_blocks,%function .align 5 GFp_${prefix}_ctr32_encrypt_blocks: ___ $code.=<<___ if ($flavour =~ /64/); stp x29,x30,[sp,#-16]! add x29,sp,#0 ___ $code.=<<___ if ($flavour !~ /64/); mov ip,sp stmdb sp!,{r4-r10,lr} vstmdb sp!,{d8-d15} @ ABI specification says so ldr r4, [ip] @ load remaining arg ___ $code.=<<___; ldr $rounds,[$key,#240] ldr $ctr, [$ivp, #12] vld1.32 {$dat0},[$ivp] vld1.32 {q8-q9},[$key] // load key schedule... sub $rounds,$rounds,#4 mov $step,#16 cmp $len,#2 add $key_,$key,x5,lsl#4 // pointer to last 5 round keys sub $rounds,$rounds,#2 vld1.32 {q12-q13},[$key_],#32 vld1.32 {q14-q15},[$key_],#32 vld1.32 {$rndlast},[$key_] add $key_,$key,#32 mov $cnt,$rounds cclr $step,lo #ifndef __ARMEB__ rev $ctr, $ctr #endif vorr $dat1,$dat0,$dat0 add $tctr1, $ctr, #1 vorr $dat2,$dat0,$dat0 add $ctr, $ctr, #2 vorr $ivec,$dat0,$dat0 rev $tctr1, $tctr1 vmov.32 ${dat1}[3],$tctr1 b.ls .Lctr32_tail rev $tctr2, $ctr sub $len,$len,#3 // bias vmov.32 ${dat2}[3],$tctr2 b .Loop3x_ctr32 .align 4 .Loop3x_ctr32: aese $dat0,q8 aesmc $dat0,$dat0 aese $dat1,q8 aesmc $dat1,$dat1 aese $dat2,q8 aesmc $dat2,$dat2 vld1.32 {q8},[$key_],#16 subs $cnt,$cnt,#2 aese $dat0,q9 aesmc $dat0,$dat0 aese $dat1,q9 aesmc $dat1,$dat1 aese $dat2,q9 aesmc $dat2,$dat2 vld1.32 {q9},[$key_],#16 b.gt .Loop3x_ctr32 aese $dat0,q8 aesmc $tmp0,$dat0 aese $dat1,q8 aesmc $tmp1,$dat1 vld1.8 {$in0},[$inp],#16 vorr $dat0,$ivec,$ivec aese $dat2,q8 aesmc $dat2,$dat2 vld1.8 {$in1},[$inp],#16 vorr $dat1,$ivec,$ivec aese $tmp0,q9 aesmc $tmp0,$tmp0 aese $tmp1,q9 aesmc $tmp1,$tmp1 vld1.8 {$in2},[$inp],#16 mov $key_,$key aese $dat2,q9 aesmc $tmp2,$dat2 vorr $dat2,$ivec,$ivec add $tctr0,$ctr,#1 aese $tmp0,q12 aesmc $tmp0,$tmp0 aese $tmp1,q12 aesmc $tmp1,$tmp1 veor $in0,$in0,$rndlast add $tctr1,$ctr,#2 aese $tmp2,q12 aesmc $tmp2,$tmp2 veor $in1,$in1,$rndlast add $ctr,$ctr,#3 aese $tmp0,q13 aesmc $tmp0,$tmp0 aese $tmp1,q13 aesmc $tmp1,$tmp1 veor $in2,$in2,$rndlast rev $tctr0,$tctr0 aese $tmp2,q13 aesmc $tmp2,$tmp2 vmov.32 ${dat0}[3], $tctr0 rev $tctr1,$tctr1 aese $tmp0,q14 aesmc $tmp0,$tmp0 aese $tmp1,q14 aesmc $tmp1,$tmp1 vmov.32 ${dat1}[3], $tctr1 rev $tctr2,$ctr aese $tmp2,q14 aesmc $tmp2,$tmp2 vmov.32 ${dat2}[3], $tctr2 subs $len,$len,#3 aese $tmp0,q15 aese $tmp1,q15 aese $tmp2,q15 veor $in0,$in0,$tmp0 vld1.32 {q8},[$key_],#16 // re-pre-load rndkey[0] vst1.8 {$in0},[$out],#16 veor $in1,$in1,$tmp1 mov $cnt,$rounds vst1.8 {$in1},[$out],#16 veor $in2,$in2,$tmp2 vld1.32 {q9},[$key_],#16 // re-pre-load rndkey[1] vst1.8 {$in2},[$out],#16 b.hs .Loop3x_ctr32 adds $len,$len,#3 b.eq .Lctr32_done cmp $len,#1 mov $step,#16 cclr $step,eq .Lctr32_tail: aese $dat0,q8 aesmc $dat0,$dat0 aese $dat1,q8 aesmc $dat1,$dat1 vld1.32 {q8},[$key_],#16 subs $cnt,$cnt,#2 aese $dat0,q9 aesmc $dat0,$dat0 aese $dat1,q9 aesmc $dat1,$dat1 vld1.32 {q9},[$key_],#16 b.gt .Lctr32_tail aese $dat0,q8 aesmc $dat0,$dat0 aese $dat1,q8 aesmc $dat1,$dat1 aese $dat0,q9 aesmc $dat0,$dat0 aese $dat1,q9 aesmc $dat1,$dat1 vld1.8 {$in0},[$inp],$step aese $dat0,q12 aesmc $dat0,$dat0 aese $dat1,q12 aesmc $dat1,$dat1 vld1.8 {$in1},[$inp] aese $dat0,q13 aesmc $dat0,$dat0 aese $dat1,q13 aesmc $dat1,$dat1 veor $in0,$in0,$rndlast aese $dat0,q14 aesmc $dat0,$dat0 aese $dat1,q14 aesmc $dat1,$dat1 veor $in1,$in1,$rndlast aese $dat0,q15 aese $dat1,q15 cmp $len,#1 veor $in0,$in0,$dat0 veor $in1,$in1,$dat1 vst1.8 {$in0},[$out],#16 b.eq .Lctr32_done vst1.8 {$in1},[$out] .Lctr32_done: ___ $code.=<<___ if ($flavour !~ /64/); vldmia sp!,{d8-d15} ldmia sp!,{r4-r10,pc} ___ $code.=<<___ if ($flavour =~ /64/); ldr x29,[sp],#16 ret ___ $code.=<<___; .size GFp_${prefix}_ctr32_encrypt_blocks,.-GFp_${prefix}_ctr32_encrypt_blocks ___ }}} $code.=<<___; #endif ___ ######################################## if ($flavour =~ /64/) { ######## 64-bit code my %opcode = ( "aesd" => 0x4e285800, "aese" => 0x4e284800, "aesimc"=> 0x4e287800, "aesmc" => 0x4e286800 ); local *unaes = sub { my ($mnemonic,$arg)=@_; $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o && sprintf ".inst\t0x%08x\t//%s %s", $opcode{$mnemonic}|$1|($2<<5), $mnemonic,$arg; }; foreach(split("\n",$code)) { s/\`([^\`]*)\`/eval($1)/geo; s/\bq([0-9]+)\b/"v".($1<8?$1:$1+8).".16b"/geo; # old->new registers s/@\s/\/\//o; # old->new style commentary #s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or s/cclr\s+([wx])([^,]+),\s*([a-z]+)/csel $1$2,$1zr,$1$2,$3/o or s/mov\.([a-z]+)\s+([wx][0-9]+),\s*([wx][0-9]+)/csel $2,$3,$2,$1/o or s/vmov\.i8/movi/o or # fix up legacy mnemonics s/vext\.8/ext/o or s/vrev32\.8/rev32/o or s/vtst\.8/cmtst/o or s/vshr/ushr/o or s/^(\s+)v/$1/o or # strip off v prefix s/\bbx\s+lr\b/ret/o; # fix up remaining legacy suffixes s/\.[ui]?8//o; m/\],#8/o and s/\.16b/\.8b/go; s/\.[ui]?32//o and s/\.16b/\.4s/go; s/\.[ui]?64//o and s/\.16b/\.2d/go; s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o; print $_,"\n"; } } else { ######## 32-bit code my %opcode = ( "aesd" => 0xf3b00340, "aese" => 0xf3b00300, "aesimc"=> 0xf3b003c0, "aesmc" => 0xf3b00380 ); local *unaes = sub { my ($mnemonic,$arg)=@_; if ($arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o) { my $word = $opcode{$mnemonic}|(($1&7)<<13)|(($1&8)<<19) |(($2&7)<<1) |(($2&8)<<2); # since ARMv7 instructions are always encoded little-endian. # correct solution is to use .inst directive, but older # assemblers don't implement it:-( sprintf ".byte\t0x%02x,0x%02x,0x%02x,0x%02x\t@ %s %s", $word&0xff,($word>>8)&0xff, ($word>>16)&0xff,($word>>24)&0xff, $mnemonic,$arg; } }; sub unvtbl { my $arg=shift; $arg =~ m/q([0-9]+),\s*\{q([0-9]+)\},\s*q([0-9]+)/o && sprintf "vtbl.8 d%d,{q%d},d%d\n\t". "vtbl.8 d%d,{q%d},d%d", 2*$1,$2,2*$3, 2*$1+1,$2,2*$3+1; } sub unvdup32 { my $arg=shift; $arg =~ m/q([0-9]+),\s*q([0-9]+)\[([0-3])\]/o && sprintf "vdup.32 q%d,d%d[%d]",$1,2*$2+($3>>1),$3&1; } sub unvmov32 { my $arg=shift; $arg =~ m/q([0-9]+)\[([0-3])\],(.*)/o && sprintf "vmov.32 d%d[%d],%s",2*$1+($2>>1),$2&1,$3; } foreach(split("\n",$code)) { s/\`([^\`]*)\`/eval($1)/geo; s/\b[wx]([0-9]+)\b/r$1/go; # new->old registers s/\bv([0-9])\.[12468]+[bsd]\b/q$1/go; # new->old registers s/\/\/\s?/@ /o; # new->old style commentary # fix up remaining new-style suffixes s/\{q([0-9]+)\},\s*\[(.+)\],#8/sprintf "{d%d},[$2]!",2*$1/eo or s/\],#[0-9]+/]!/o; s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or s/cclr\s+([^,]+),\s*([a-z]+)/mov$2 $1,#0/o or s/vtbl\.8\s+(.*)/unvtbl($1)/geo or s/vdup\.32\s+(.*)/unvdup32($1)/geo or s/vmov\.32\s+(.*)/unvmov32($1)/geo or s/^(\s+)b\./$1b/o or s/^(\s+)mov\./$1mov/o or s/^(\s+)ret/$1bx\tlr/o; print $_,"\n"; } } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/bsaes-armv7.pl000064400000000000000000000726221352416253600204570ustar0000000000000000#! /usr/bin/env perl # Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # # Specific modes and adaptation for Linux kernel by Ard Biesheuvel # of Linaro. Permission to use under GPL terms is granted. # ==================================================================== # Bit-sliced AES for ARM NEON # # February 2012. # # This implementation is direct adaptation of bsaes-x86_64 module for # ARM NEON. Except that this module is endian-neutral [in sense that # it can be compiled for either endianness] by courtesy of vld1.8's # neutrality. Initial version doesn't implement interface to OpenSSL, # only low-level primitives and unsupported entry points, just enough # to collect performance results, which for Cortex-A8 core are: # # encrypt 19.5 cycles per byte processed with 128-bit key # decrypt 22.1 cycles per byte processed with 128-bit key # key conv. 440 cycles per 128-bit key/0.18 of 8x block # # Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, # which is [much] worse than anticipated (for further details see # http://www.openssl.org/~appro/Snapdragon-S4.html). # # Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code # manages in 20.0 cycles]. # # When comparing to x86_64 results keep in mind that NEON unit is # [mostly] single-issue and thus can't [fully] benefit from # instruction-level parallelism. And when comparing to aes-armv4 # results keep in mind key schedule conversion overhead (see # bsaes-x86_64.pl for further details)... # # # April-August 2013 # Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } my ($inp,$out,$len,$key)=("r0","r1","r2","r3"); my @XMM=map("q$_",(0..15)); { my ($key,$rounds,$const)=("r4","r5","r6"); sub Dlo() { shift=~m|q([1]?[0-9])|?"d".($1*2):""; } sub Dhi() { shift=~m|q([1]?[0-9])|?"d".($1*2+1):""; } sub Sbox { # input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb # output in lsb > [b0, b1, b4, b6, b3, b7, b2, b5] < msb my @b=@_[0..7]; my @t=@_[8..11]; my @s=@_[12..15]; &InBasisChange (@b); &Inv_GF256 (@b[6,5,0,3,7,1,4,2],@t,@s); &OutBasisChange (@b[7,1,4,2,6,5,0,3]); } sub InBasisChange { # input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb # output in lsb > [b6, b5, b0, b3, b7, b1, b4, b2] < msb my @b=@_[0..7]; $code.=<<___; veor @b[2], @b[2], @b[1] veor @b[5], @b[5], @b[6] veor @b[3], @b[3], @b[0] veor @b[6], @b[6], @b[2] veor @b[5], @b[5], @b[0] veor @b[6], @b[6], @b[3] veor @b[3], @b[3], @b[7] veor @b[7], @b[7], @b[5] veor @b[3], @b[3], @b[4] veor @b[4], @b[4], @b[5] veor @b[2], @b[2], @b[7] veor @b[3], @b[3], @b[1] veor @b[1], @b[1], @b[5] ___ } sub OutBasisChange { # input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb # output in lsb > [b6, b1, b2, b4, b7, b0, b3, b5] < msb my @b=@_[0..7]; $code.=<<___; veor @b[0], @b[0], @b[6] veor @b[1], @b[1], @b[4] veor @b[4], @b[4], @b[6] veor @b[2], @b[2], @b[0] veor @b[6], @b[6], @b[1] veor @b[1], @b[1], @b[5] veor @b[5], @b[5], @b[3] veor @b[3], @b[3], @b[7] veor @b[7], @b[7], @b[5] veor @b[2], @b[2], @b[5] veor @b[4], @b[4], @b[7] ___ } sub InvSbox { # input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb # output in lsb > [b0, b1, b6, b4, b2, b7, b3, b5] < msb my @b=@_[0..7]; my @t=@_[8..11]; my @s=@_[12..15]; &InvInBasisChange (@b); &Inv_GF256 (@b[5,1,2,6,3,7,0,4],@t,@s); &InvOutBasisChange (@b[3,7,0,4,5,1,2,6]); } sub InvInBasisChange { # OutBasisChange in reverse (with twist) my @b=@_[5,1,2,6,3,7,0,4]; $code.=<<___ veor @b[1], @b[1], @b[7] veor @b[4], @b[4], @b[7] veor @b[7], @b[7], @b[5] veor @b[1], @b[1], @b[3] veor @b[2], @b[2], @b[5] veor @b[3], @b[3], @b[7] veor @b[6], @b[6], @b[1] veor @b[2], @b[2], @b[0] veor @b[5], @b[5], @b[3] veor @b[4], @b[4], @b[6] veor @b[0], @b[0], @b[6] veor @b[1], @b[1], @b[4] ___ } sub InvOutBasisChange { # InBasisChange in reverse my @b=@_[2,5,7,3,6,1,0,4]; $code.=<<___; veor @b[1], @b[1], @b[5] veor @b[2], @b[2], @b[7] veor @b[3], @b[3], @b[1] veor @b[4], @b[4], @b[5] veor @b[7], @b[7], @b[5] veor @b[3], @b[3], @b[4] veor @b[5], @b[5], @b[0] veor @b[3], @b[3], @b[7] veor @b[6], @b[6], @b[2] veor @b[2], @b[2], @b[1] veor @b[6], @b[6], @b[3] veor @b[3], @b[3], @b[0] veor @b[5], @b[5], @b[6] ___ } sub Mul_GF4 { #;************************************************************* #;* Mul_GF4: Input x0-x1,y0-y1 Output x0-x1 Temp t0 (8) * #;************************************************************* my ($x0,$x1,$y0,$y1,$t0,$t1)=@_; $code.=<<___; veor $t0, $y0, $y1 vand $t0, $t0, $x0 veor $x0, $x0, $x1 vand $t1, $x1, $y0 vand $x0, $x0, $y1 veor $x1, $t1, $t0 veor $x0, $x0, $t1 ___ } sub Mul_GF4_N { # not used, see next subroutine # multiply and scale by N my ($x0,$x1,$y0,$y1,$t0)=@_; $code.=<<___; veor $t0, $y0, $y1 vand $t0, $t0, $x0 veor $x0, $x0, $x1 vand $x1, $x1, $y0 vand $x0, $x0, $y1 veor $x1, $x1, $x0 veor $x0, $x0, $t0 ___ } sub Mul_GF4_N_GF4 { # interleaved Mul_GF4_N and Mul_GF4 my ($x0,$x1,$y0,$y1,$t0, $x2,$x3,$y2,$y3,$t1)=@_; $code.=<<___; veor $t0, $y0, $y1 veor $t1, $y2, $y3 vand $t0, $t0, $x0 vand $t1, $t1, $x2 veor $x0, $x0, $x1 veor $x2, $x2, $x3 vand $x1, $x1, $y0 vand $x3, $x3, $y2 vand $x0, $x0, $y1 vand $x2, $x2, $y3 veor $x1, $x1, $x0 veor $x2, $x2, $x3 veor $x0, $x0, $t0 veor $x3, $x3, $t1 ___ } sub Mul_GF16_2 { my @x=@_[0..7]; my @y=@_[8..11]; my @t=@_[12..15]; $code.=<<___; veor @t[0], @x[0], @x[2] veor @t[1], @x[1], @x[3] ___ &Mul_GF4 (@x[0], @x[1], @y[0], @y[1], @t[2..3]); $code.=<<___; veor @y[0], @y[0], @y[2] veor @y[1], @y[1], @y[3] ___ Mul_GF4_N_GF4 (@t[0], @t[1], @y[0], @y[1], @t[3], @x[2], @x[3], @y[2], @y[3], @t[2]); $code.=<<___; veor @x[0], @x[0], @t[0] veor @x[2], @x[2], @t[0] veor @x[1], @x[1], @t[1] veor @x[3], @x[3], @t[1] veor @t[0], @x[4], @x[6] veor @t[1], @x[5], @x[7] ___ &Mul_GF4_N_GF4 (@t[0], @t[1], @y[0], @y[1], @t[3], @x[6], @x[7], @y[2], @y[3], @t[2]); $code.=<<___; veor @y[0], @y[0], @y[2] veor @y[1], @y[1], @y[3] ___ &Mul_GF4 (@x[4], @x[5], @y[0], @y[1], @t[2..3]); $code.=<<___; veor @x[4], @x[4], @t[0] veor @x[6], @x[6], @t[0] veor @x[5], @x[5], @t[1] veor @x[7], @x[7], @t[1] ___ } sub Inv_GF256 { #;******************************************************************** #;* Inv_GF256: Input x0-x7 Output x0-x7 Temp t0-t3,s0-s3 (144) * #;******************************************************************** my @x=@_[0..7]; my @t=@_[8..11]; my @s=@_[12..15]; # direct optimizations from hardware $code.=<<___; veor @t[3], @x[4], @x[6] veor @t[2], @x[5], @x[7] veor @t[1], @x[1], @x[3] veor @s[1], @x[7], @x[6] vmov @t[0], @t[2] veor @s[0], @x[0], @x[2] vorr @t[2], @t[2], @t[1] veor @s[3], @t[3], @t[0] vand @s[2], @t[3], @s[0] vorr @t[3], @t[3], @s[0] veor @s[0], @s[0], @t[1] vand @t[0], @t[0], @t[1] veor @t[1], @x[3], @x[2] vand @s[3], @s[3], @s[0] vand @s[1], @s[1], @t[1] veor @t[1], @x[4], @x[5] veor @s[0], @x[1], @x[0] veor @t[3], @t[3], @s[1] veor @t[2], @t[2], @s[1] vand @s[1], @t[1], @s[0] vorr @t[1], @t[1], @s[0] veor @t[3], @t[3], @s[3] veor @t[0], @t[0], @s[1] veor @t[2], @t[2], @s[2] veor @t[1], @t[1], @s[3] veor @t[0], @t[0], @s[2] vand @s[0], @x[7], @x[3] veor @t[1], @t[1], @s[2] vand @s[1], @x[6], @x[2] vand @s[2], @x[5], @x[1] vorr @s[3], @x[4], @x[0] veor @t[3], @t[3], @s[0] veor @t[1], @t[1], @s[2] veor @t[0], @t[0], @s[3] veor @t[2], @t[2], @s[1] @ Inv_GF16 \t0, \t1, \t2, \t3, \s0, \s1, \s2, \s3 @ new smaller inversion vand @s[2], @t[3], @t[1] vmov @s[0], @t[0] veor @s[1], @t[2], @s[2] veor @s[3], @t[0], @s[2] veor @s[2], @t[0], @s[2] @ @s[2]=@s[3] vbsl @s[1], @t[1], @t[0] vbsl @s[3], @t[3], @t[2] veor @t[3], @t[3], @t[2] vbsl @s[0], @s[1], @s[2] vbsl @t[0], @s[2], @s[1] vand @s[2], @s[0], @s[3] veor @t[1], @t[1], @t[0] veor @s[2], @s[2], @t[3] ___ # output in s3, s2, s1, t1 # Mul_GF16_2 \x0, \x1, \x2, \x3, \x4, \x5, \x6, \x7, \t2, \t3, \t0, \t1, \s0, \s1, \s2, \s3 # Mul_GF16_2 \x0, \x1, \x2, \x3, \x4, \x5, \x6, \x7, \s3, \s2, \s1, \t1, \s0, \t0, \t2, \t3 &Mul_GF16_2(@x,@s[3,2,1],@t[1],@s[0],@t[0,2,3]); ### output msb > [x3,x2,x1,x0,x7,x6,x5,x4] < lsb } # AES linear components sub ShiftRows { my @x=@_[0..7]; my @t=@_[8..11]; my $mask=pop; $code.=<<___; vldmia $key!, {@t[0]-@t[3]} veor @t[0], @t[0], @x[0] veor @t[1], @t[1], @x[1] vtbl.8 `&Dlo(@x[0])`, {@t[0]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[0])`, {@t[0]}, `&Dhi($mask)` vldmia $key!, {@t[0]} veor @t[2], @t[2], @x[2] vtbl.8 `&Dlo(@x[1])`, {@t[1]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[1])`, {@t[1]}, `&Dhi($mask)` vldmia $key!, {@t[1]} veor @t[3], @t[3], @x[3] vtbl.8 `&Dlo(@x[2])`, {@t[2]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[2])`, {@t[2]}, `&Dhi($mask)` vldmia $key!, {@t[2]} vtbl.8 `&Dlo(@x[3])`, {@t[3]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[3])`, {@t[3]}, `&Dhi($mask)` vldmia $key!, {@t[3]} veor @t[0], @t[0], @x[4] veor @t[1], @t[1], @x[5] vtbl.8 `&Dlo(@x[4])`, {@t[0]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[4])`, {@t[0]}, `&Dhi($mask)` veor @t[2], @t[2], @x[6] vtbl.8 `&Dlo(@x[5])`, {@t[1]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[5])`, {@t[1]}, `&Dhi($mask)` veor @t[3], @t[3], @x[7] vtbl.8 `&Dlo(@x[6])`, {@t[2]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[6])`, {@t[2]}, `&Dhi($mask)` vtbl.8 `&Dlo(@x[7])`, {@t[3]}, `&Dlo($mask)` vtbl.8 `&Dhi(@x[7])`, {@t[3]}, `&Dhi($mask)` ___ } sub MixColumns { # modified to emit output in order suitable for feeding back to aesenc[last] my @x=@_[0..7]; my @t=@_[8..15]; my $inv=@_[16]; # optional $code.=<<___; vext.8 @t[0], @x[0], @x[0], #12 @ x0 <<< 32 vext.8 @t[1], @x[1], @x[1], #12 veor @x[0], @x[0], @t[0] @ x0 ^ (x0 <<< 32) vext.8 @t[2], @x[2], @x[2], #12 veor @x[1], @x[1], @t[1] vext.8 @t[3], @x[3], @x[3], #12 veor @x[2], @x[2], @t[2] vext.8 @t[4], @x[4], @x[4], #12 veor @x[3], @x[3], @t[3] vext.8 @t[5], @x[5], @x[5], #12 veor @x[4], @x[4], @t[4] vext.8 @t[6], @x[6], @x[6], #12 veor @x[5], @x[5], @t[5] vext.8 @t[7], @x[7], @x[7], #12 veor @x[6], @x[6], @t[6] veor @t[1], @t[1], @x[0] veor @x[7], @x[7], @t[7] vext.8 @x[0], @x[0], @x[0], #8 @ (x0 ^ (x0 <<< 32)) <<< 64) veor @t[2], @t[2], @x[1] veor @t[0], @t[0], @x[7] veor @t[1], @t[1], @x[7] vext.8 @x[1], @x[1], @x[1], #8 veor @t[5], @t[5], @x[4] veor @x[0], @x[0], @t[0] veor @t[6], @t[6], @x[5] veor @x[1], @x[1], @t[1] vext.8 @t[0], @x[4], @x[4], #8 veor @t[4], @t[4], @x[3] vext.8 @t[1], @x[5], @x[5], #8 veor @t[7], @t[7], @x[6] vext.8 @x[4], @x[3], @x[3], #8 veor @t[3], @t[3], @x[2] vext.8 @x[5], @x[7], @x[7], #8 veor @t[4], @t[4], @x[7] vext.8 @x[3], @x[6], @x[6], #8 veor @t[3], @t[3], @x[7] vext.8 @x[6], @x[2], @x[2], #8 veor @x[7], @t[1], @t[5] ___ $code.=<<___ if (!$inv); veor @x[2], @t[0], @t[4] veor @x[4], @x[4], @t[3] veor @x[5], @x[5], @t[7] veor @x[3], @x[3], @t[6] @ vmov @x[2], @t[0] veor @x[6], @x[6], @t[2] @ vmov @x[7], @t[1] ___ $code.=<<___ if ($inv); veor @t[3], @t[3], @x[4] veor @x[5], @x[5], @t[7] veor @x[2], @x[3], @t[6] veor @x[3], @t[0], @t[4] veor @x[4], @x[6], @t[2] vmov @x[6], @t[3] @ vmov @x[7], @t[1] ___ } sub InvMixColumns_orig { my @x=@_[0..7]; my @t=@_[8..15]; $code.=<<___; @ multiplication by 0x0e vext.8 @t[7], @x[7], @x[7], #12 vmov @t[2], @x[2] veor @x[2], @x[2], @x[5] @ 2 5 veor @x[7], @x[7], @x[5] @ 7 5 vext.8 @t[0], @x[0], @x[0], #12 vmov @t[5], @x[5] veor @x[5], @x[5], @x[0] @ 5 0 [1] veor @x[0], @x[0], @x[1] @ 0 1 vext.8 @t[1], @x[1], @x[1], #12 veor @x[1], @x[1], @x[2] @ 1 25 veor @x[0], @x[0], @x[6] @ 01 6 [2] vext.8 @t[3], @x[3], @x[3], #12 veor @x[1], @x[1], @x[3] @ 125 3 [4] veor @x[2], @x[2], @x[0] @ 25 016 [3] veor @x[3], @x[3], @x[7] @ 3 75 veor @x[7], @x[7], @x[6] @ 75 6 [0] vext.8 @t[6], @x[6], @x[6], #12 vmov @t[4], @x[4] veor @x[6], @x[6], @x[4] @ 6 4 veor @x[4], @x[4], @x[3] @ 4 375 [6] veor @x[3], @x[3], @x[7] @ 375 756=36 veor @x[6], @x[6], @t[5] @ 64 5 [7] veor @x[3], @x[3], @t[2] @ 36 2 vext.8 @t[5], @t[5], @t[5], #12 veor @x[3], @x[3], @t[4] @ 362 4 [5] ___ my @y = @x[7,5,0,2,1,3,4,6]; $code.=<<___; @ multiplication by 0x0b veor @y[1], @y[1], @y[0] veor @y[0], @y[0], @t[0] vext.8 @t[2], @t[2], @t[2], #12 veor @y[1], @y[1], @t[1] veor @y[0], @y[0], @t[5] vext.8 @t[4], @t[4], @t[4], #12 veor @y[1], @y[1], @t[6] veor @y[0], @y[0], @t[7] veor @t[7], @t[7], @t[6] @ clobber t[7] veor @y[3], @y[3], @t[0] veor @y[1], @y[1], @y[0] vext.8 @t[0], @t[0], @t[0], #12 veor @y[2], @y[2], @t[1] veor @y[4], @y[4], @t[1] vext.8 @t[1], @t[1], @t[1], #12 veor @y[2], @y[2], @t[2] veor @y[3], @y[3], @t[2] veor @y[5], @y[5], @t[2] veor @y[2], @y[2], @t[7] vext.8 @t[2], @t[2], @t[2], #12 veor @y[3], @y[3], @t[3] veor @y[6], @y[6], @t[3] veor @y[4], @y[4], @t[3] veor @y[7], @y[7], @t[4] vext.8 @t[3], @t[3], @t[3], #12 veor @y[5], @y[5], @t[4] veor @y[7], @y[7], @t[7] veor @t[7], @t[7], @t[5] @ clobber t[7] even more veor @y[3], @y[3], @t[5] veor @y[4], @y[4], @t[4] veor @y[5], @y[5], @t[7] vext.8 @t[4], @t[4], @t[4], #12 veor @y[6], @y[6], @t[7] veor @y[4], @y[4], @t[7] veor @t[7], @t[7], @t[5] vext.8 @t[5], @t[5], @t[5], #12 @ multiplication by 0x0d veor @y[4], @y[4], @y[7] veor @t[7], @t[7], @t[6] @ restore t[7] veor @y[7], @y[7], @t[4] vext.8 @t[6], @t[6], @t[6], #12 veor @y[2], @y[2], @t[0] veor @y[7], @y[7], @t[5] vext.8 @t[7], @t[7], @t[7], #12 veor @y[2], @y[2], @t[2] veor @y[3], @y[3], @y[1] veor @y[1], @y[1], @t[1] veor @y[0], @y[0], @t[0] veor @y[3], @y[3], @t[0] veor @y[1], @y[1], @t[5] veor @y[0], @y[0], @t[5] vext.8 @t[0], @t[0], @t[0], #12 veor @y[1], @y[1], @t[7] veor @y[0], @y[0], @t[6] veor @y[3], @y[3], @y[1] veor @y[4], @y[4], @t[1] vext.8 @t[1], @t[1], @t[1], #12 veor @y[7], @y[7], @t[7] veor @y[4], @y[4], @t[2] veor @y[5], @y[5], @t[2] veor @y[2], @y[2], @t[6] veor @t[6], @t[6], @t[3] @ clobber t[6] vext.8 @t[2], @t[2], @t[2], #12 veor @y[4], @y[4], @y[7] veor @y[3], @y[3], @t[6] veor @y[6], @y[6], @t[6] veor @y[5], @y[5], @t[5] vext.8 @t[5], @t[5], @t[5], #12 veor @y[6], @y[6], @t[4] vext.8 @t[4], @t[4], @t[4], #12 veor @y[5], @y[5], @t[6] veor @y[6], @y[6], @t[7] vext.8 @t[7], @t[7], @t[7], #12 veor @t[6], @t[6], @t[3] @ restore t[6] vext.8 @t[3], @t[3], @t[3], #12 @ multiplication by 0x09 veor @y[4], @y[4], @y[1] veor @t[1], @t[1], @y[1] @ t[1]=y[1] veor @t[0], @t[0], @t[5] @ clobber t[0] vext.8 @t[6], @t[6], @t[6], #12 veor @t[1], @t[1], @t[5] veor @y[3], @y[3], @t[0] veor @t[0], @t[0], @y[0] @ t[0]=y[0] veor @t[1], @t[1], @t[6] veor @t[6], @t[6], @t[7] @ clobber t[6] veor @y[4], @y[4], @t[1] veor @y[7], @y[7], @t[4] veor @y[6], @y[6], @t[3] veor @y[5], @y[5], @t[2] veor @t[4], @t[4], @y[4] @ t[4]=y[4] veor @t[3], @t[3], @y[3] @ t[3]=y[3] veor @t[5], @t[5], @y[5] @ t[5]=y[5] veor @t[2], @t[2], @y[2] @ t[2]=y[2] veor @t[3], @t[3], @t[7] veor @XMM[5], @t[5], @t[6] veor @XMM[6], @t[6], @y[6] @ t[6]=y[6] veor @XMM[2], @t[2], @t[6] veor @XMM[7], @t[7], @y[7] @ t[7]=y[7] vmov @XMM[0], @t[0] vmov @XMM[1], @t[1] @ vmov @XMM[2], @t[2] vmov @XMM[3], @t[3] vmov @XMM[4], @t[4] @ vmov @XMM[5], @t[5] @ vmov @XMM[6], @t[6] @ vmov @XMM[7], @t[7] ___ } sub InvMixColumns { my @x=@_[0..7]; my @t=@_[8..15]; # Thanks to Jussi Kivilinna for providing pointer to # # | 0e 0b 0d 09 | | 02 03 01 01 | | 05 00 04 00 | # | 09 0e 0b 0d | = | 01 02 03 01 | x | 00 05 00 04 | # | 0d 09 0e 0b | | 01 01 02 03 | | 04 00 05 00 | # | 0b 0d 09 0e | | 03 01 01 02 | | 00 04 00 05 | $code.=<<___; @ multiplication by 0x05-0x00-0x04-0x00 vext.8 @t[0], @x[0], @x[0], #8 vext.8 @t[6], @x[6], @x[6], #8 vext.8 @t[7], @x[7], @x[7], #8 veor @t[0], @t[0], @x[0] vext.8 @t[1], @x[1], @x[1], #8 veor @t[6], @t[6], @x[6] vext.8 @t[2], @x[2], @x[2], #8 veor @t[7], @t[7], @x[7] vext.8 @t[3], @x[3], @x[3], #8 veor @t[1], @t[1], @x[1] vext.8 @t[4], @x[4], @x[4], #8 veor @t[2], @t[2], @x[2] vext.8 @t[5], @x[5], @x[5], #8 veor @t[3], @t[3], @x[3] veor @t[4], @t[4], @x[4] veor @t[5], @t[5], @x[5] veor @x[0], @x[0], @t[6] veor @x[1], @x[1], @t[6] veor @x[2], @x[2], @t[0] veor @x[4], @x[4], @t[2] veor @x[3], @x[3], @t[1] veor @x[1], @x[1], @t[7] veor @x[2], @x[2], @t[7] veor @x[4], @x[4], @t[6] veor @x[5], @x[5], @t[3] veor @x[3], @x[3], @t[6] veor @x[6], @x[6], @t[4] veor @x[4], @x[4], @t[7] veor @x[5], @x[5], @t[7] veor @x[7], @x[7], @t[5] ___ &MixColumns (@x,@t,1); # flipped 2<->3 and 4<->6 } sub swapmove { my ($a,$b,$n,$mask,$t)=@_; $code.=<<___; vshr.u64 $t, $b, #$n veor $t, $t, $a vand $t, $t, $mask veor $a, $a, $t vshl.u64 $t, $t, #$n veor $b, $b, $t ___ } sub swapmove2x { my ($a0,$b0,$a1,$b1,$n,$mask,$t0,$t1)=@_; $code.=<<___; vshr.u64 $t0, $b0, #$n vshr.u64 $t1, $b1, #$n veor $t0, $t0, $a0 veor $t1, $t1, $a1 vand $t0, $t0, $mask vand $t1, $t1, $mask veor $a0, $a0, $t0 vshl.u64 $t0, $t0, #$n veor $a1, $a1, $t1 vshl.u64 $t1, $t1, #$n veor $b0, $b0, $t0 veor $b1, $b1, $t1 ___ } sub bitslice { my @x=reverse(@_[0..7]); my ($t0,$t1,$t2,$t3)=@_[8..11]; $code.=<<___; vmov.i8 $t0,#0x55 @ compose .LBS0 vmov.i8 $t1,#0x33 @ compose .LBS1 ___ &swapmove2x(@x[0,1,2,3],1,$t0,$t2,$t3); &swapmove2x(@x[4,5,6,7],1,$t0,$t2,$t3); $code.=<<___; vmov.i8 $t0,#0x0f @ compose .LBS2 ___ &swapmove2x(@x[0,2,1,3],2,$t1,$t2,$t3); &swapmove2x(@x[4,6,5,7],2,$t1,$t2,$t3); &swapmove2x(@x[0,4,1,5],4,$t0,$t2,$t3); &swapmove2x(@x[2,6,3,7],4,$t0,$t2,$t3); } $code.=<<___; #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} # define VFP_ABI_FRAME 0x40 #else # define VFP_ABI_PUSH # define VFP_ABI_POP # define VFP_ABI_FRAME 0 # define BSAES_ASM_EXTENDED_KEY # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif #ifdef __thumb__ # define adrl adr #endif #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .text .syntax unified @ ARMv7-capable assembler is expected to handle this #if defined(__thumb2__) && !defined(__APPLE__) .thumb #else .code 32 # undef __thumb2__ #endif .type _bsaes_const,%object .align 6 _bsaes_const: .LM0ISR: @ InvShiftRows constants .quad 0x0a0e0206070b0f03, 0x0004080c0d010509 .LISR: .quad 0x0504070602010003, 0x0f0e0d0c080b0a09 .LISRM0: .quad 0x01040b0e0205080f, 0x0306090c00070a0d .LM0SR: @ ShiftRows constants .quad 0x0a0e02060f03070b, 0x0004080c05090d01 .LSR: .quad 0x0504070600030201, 0x0f0e0d0c0a09080b .LSRM0: .quad 0x0304090e00050a0f, 0x01060b0c0207080d .LM0: .quad 0x02060a0e03070b0f, 0x0004080c0105090d .LREVM0SR: .quad 0x090d01050c000408, 0x03070b0f060a0e02 .asciz "Bit-sliced AES for NEON, CRYPTOGAMS by " .align 6 .size _bsaes_const,.-_bsaes_const .type _bsaes_encrypt8,%function .align 4 _bsaes_encrypt8: adr $const,. vldmia $key!, {@XMM[9]} @ round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr $const,.LM0SR #else sub $const,$const,#_bsaes_encrypt8-.LM0SR #endif vldmia $const!, {@XMM[8]} @ .LM0SR _bsaes_encrypt8_alt: veor @XMM[10], @XMM[0], @XMM[9] @ xor with round0 key veor @XMM[11], @XMM[1], @XMM[9] vtbl.8 `&Dlo(@XMM[0])`, {@XMM[10]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[0])`, {@XMM[10]}, `&Dhi(@XMM[8])` veor @XMM[12], @XMM[2], @XMM[9] vtbl.8 `&Dlo(@XMM[1])`, {@XMM[11]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[1])`, {@XMM[11]}, `&Dhi(@XMM[8])` veor @XMM[13], @XMM[3], @XMM[9] vtbl.8 `&Dlo(@XMM[2])`, {@XMM[12]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[2])`, {@XMM[12]}, `&Dhi(@XMM[8])` veor @XMM[14], @XMM[4], @XMM[9] vtbl.8 `&Dlo(@XMM[3])`, {@XMM[13]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[3])`, {@XMM[13]}, `&Dhi(@XMM[8])` veor @XMM[15], @XMM[5], @XMM[9] vtbl.8 `&Dlo(@XMM[4])`, {@XMM[14]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[4])`, {@XMM[14]}, `&Dhi(@XMM[8])` veor @XMM[10], @XMM[6], @XMM[9] vtbl.8 `&Dlo(@XMM[5])`, {@XMM[15]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[5])`, {@XMM[15]}, `&Dhi(@XMM[8])` veor @XMM[11], @XMM[7], @XMM[9] vtbl.8 `&Dlo(@XMM[6])`, {@XMM[10]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[6])`, {@XMM[10]}, `&Dhi(@XMM[8])` vtbl.8 `&Dlo(@XMM[7])`, {@XMM[11]}, `&Dlo(@XMM[8])` vtbl.8 `&Dhi(@XMM[7])`, {@XMM[11]}, `&Dhi(@XMM[8])` _bsaes_encrypt8_bitslice: ___ &bitslice (@XMM[0..7, 8..11]); $code.=<<___; sub $rounds,$rounds,#1 b .Lenc_sbox .align 4 .Lenc_loop: ___ &ShiftRows (@XMM[0..7, 8..12]); $code.=".Lenc_sbox:\n"; &Sbox (@XMM[0..7, 8..15]); $code.=<<___; subs $rounds,$rounds,#1 bcc .Lenc_done ___ &MixColumns (@XMM[0,1,4,6,3,7,2,5, 8..15]); $code.=<<___; vldmia $const, {@XMM[12]} @ .LSR ite eq @ Thumb2 thing, samity check in ARM addeq $const,$const,#0x10 bne .Lenc_loop vldmia $const, {@XMM[12]} @ .LSRM0 b .Lenc_loop .align 4 .Lenc_done: ___ # output in lsb > [t0, t1, t4, t6, t3, t7, t2, t5] < msb &bitslice (@XMM[0,1,4,6,3,7,2,5, 8..11]); $code.=<<___; vldmia $key, {@XMM[8]} @ last round key veor @XMM[4], @XMM[4], @XMM[8] veor @XMM[6], @XMM[6], @XMM[8] veor @XMM[3], @XMM[3], @XMM[8] veor @XMM[7], @XMM[7], @XMM[8] veor @XMM[2], @XMM[2], @XMM[8] veor @XMM[5], @XMM[5], @XMM[8] veor @XMM[0], @XMM[0], @XMM[8] veor @XMM[1], @XMM[1], @XMM[8] bx lr .size _bsaes_encrypt8,.-_bsaes_encrypt8 ___ } { my ($out,$inp,$rounds,$const)=("r12","r4","r5","r6"); sub bitslice_key { my @x=reverse(@_[0..7]); my ($bs0,$bs1,$bs2,$t2,$t3)=@_[8..12]; &swapmove (@x[0,1],1,$bs0,$t2,$t3); $code.=<<___; @ &swapmove(@x[2,3],1,$t0,$t2,$t3); vmov @x[2], @x[0] vmov @x[3], @x[1] ___ #&swapmove2x(@x[4,5,6,7],1,$t0,$t2,$t3); &swapmove2x (@x[0,2,1,3],2,$bs1,$t2,$t3); $code.=<<___; @ &swapmove2x(@x[4,6,5,7],2,$t1,$t2,$t3); vmov @x[4], @x[0] vmov @x[6], @x[2] vmov @x[5], @x[1] vmov @x[7], @x[3] ___ &swapmove2x (@x[0,4,1,5],4,$bs2,$t2,$t3); &swapmove2x (@x[2,6,3,7],4,$bs2,$t2,$t3); } $code.=<<___; .type _bsaes_key_convert,%function .align 4 _bsaes_key_convert: adr $const,. vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr $const,.LM0 #else sub $const,$const,#_bsaes_key_convert-.LM0 #endif vld1.8 {@XMM[15]}, [$inp]! @ load round 1 key vmov.i8 @XMM[8], #0x01 @ bit masks vmov.i8 @XMM[9], #0x02 vmov.i8 @XMM[10], #0x04 vmov.i8 @XMM[11], #0x08 vmov.i8 @XMM[12], #0x10 vmov.i8 @XMM[13], #0x20 vldmia $const, {@XMM[14]} @ .LM0 #ifdef __ARMEL__ vrev32.8 @XMM[7], @XMM[7] vrev32.8 @XMM[15], @XMM[15] #endif sub $rounds,$rounds,#1 vstmia $out!, {@XMM[7]} @ save round 0 key b .Lkey_loop .align 4 .Lkey_loop: vtbl.8 `&Dlo(@XMM[7])`,{@XMM[15]},`&Dlo(@XMM[14])` vtbl.8 `&Dhi(@XMM[7])`,{@XMM[15]},`&Dhi(@XMM[14])` vmov.i8 @XMM[6], #0x40 vmov.i8 @XMM[15], #0x80 vtst.8 @XMM[0], @XMM[7], @XMM[8] vtst.8 @XMM[1], @XMM[7], @XMM[9] vtst.8 @XMM[2], @XMM[7], @XMM[10] vtst.8 @XMM[3], @XMM[7], @XMM[11] vtst.8 @XMM[4], @XMM[7], @XMM[12] vtst.8 @XMM[5], @XMM[7], @XMM[13] vtst.8 @XMM[6], @XMM[7], @XMM[6] vtst.8 @XMM[7], @XMM[7], @XMM[15] vld1.8 {@XMM[15]}, [$inp]! @ load next round key vmvn @XMM[0], @XMM[0] @ "pnot" vmvn @XMM[1], @XMM[1] vmvn @XMM[5], @XMM[5] vmvn @XMM[6], @XMM[6] #ifdef __ARMEL__ vrev32.8 @XMM[15], @XMM[15] #endif subs $rounds,$rounds,#1 vstmia $out!,{@XMM[0]-@XMM[7]} @ write bit-sliced round key bne .Lkey_loop vmov.i8 @XMM[7],#0x63 @ compose .L63 @ don't save last round key bx lr .size _bsaes_key_convert,.-_bsaes_key_convert ___ } { my ($inp,$out,$len,$key, $ctr,$fp,$rounds)=(map("r$_",(0..3,8..10))); my $const = "r6"; # shared with _bsaes_encrypt8_alt my $keysched = "sp"; $code.=<<___; .global GFp_bsaes_ctr32_encrypt_blocks .type GFp_bsaes_ctr32_encrypt_blocks,%function .align 5 GFp_bsaes_ctr32_encrypt_blocks: @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this @ out to retain a constant-time implementation. mov ip, sp stmdb sp!, {r4-r10, lr} VFP_ABI_PUSH ldr $ctr, [ip] @ ctr is 1st arg on the stack sub sp, sp, #0x10 @ scratch space to carry over the ctr mov $fp, sp @ save sp ldr $rounds, [$key, #240] @ get # of rounds #ifndef BSAES_ASM_EXTENDED_KEY @ allocate the key schedule on the stack sub r12, sp, $rounds, lsl#7 @ 128 bytes per inner round key add r12, #`128-32` @ size of bit-sliced key schedule @ populate the key schedule mov r4, $key @ pass key mov r5, $rounds @ pass # of rounds mov sp, r12 @ sp is $keysched bl _bsaes_key_convert veor @XMM[7],@XMM[7],@XMM[15] @ fix up last round key vstmia r12, {@XMM[7]} @ save last round key vld1.8 {@XMM[0]}, [$ctr] @ load counter #ifdef __APPLE__ mov $ctr, #:lower16:(.LREVM0SR-.LM0) add $ctr, $const, $ctr #else add $ctr, $const, #.LREVM0SR-.LM0 @ borrow $ctr #endif vldmia $keysched, {@XMM[4]} @ load round0 key #else ldr r12, [$key, #244] eors r12, #1 beq 0f @ populate the key schedule str r12, [$key, #244] mov r4, $key @ pass key mov r5, $rounds @ pass # of rounds add r12, $key, #248 @ pass key schedule bl _bsaes_key_convert veor @XMM[7],@XMM[7],@XMM[15] @ fix up last round key vstmia r12, {@XMM[7]} @ save last round key .align 2 0: add r12, $key, #248 vld1.8 {@XMM[0]}, [$ctr] @ load counter adrl $ctr, .LREVM0SR @ borrow $ctr vldmia r12, {@XMM[4]} @ load round0 key sub sp, #0x10 @ place for adjusted round0 key #endif vmov.i32 @XMM[8],#1 @ compose 1<<96 veor @XMM[9],@XMM[9],@XMM[9] vrev32.8 @XMM[0],@XMM[0] vext.8 @XMM[8],@XMM[9],@XMM[8],#4 vrev32.8 @XMM[4],@XMM[4] vadd.u32 @XMM[9],@XMM[8],@XMM[8] @ compose 2<<96 vstmia $keysched, {@XMM[4]} @ save adjusted round0 key b .Lctr_enc_loop .align 4 .Lctr_enc_loop: vadd.u32 @XMM[10], @XMM[8], @XMM[9] @ compose 3<<96 vadd.u32 @XMM[1], @XMM[0], @XMM[8] @ +1 vadd.u32 @XMM[2], @XMM[0], @XMM[9] @ +2 vadd.u32 @XMM[3], @XMM[0], @XMM[10] @ +3 vadd.u32 @XMM[4], @XMM[1], @XMM[10] vadd.u32 @XMM[5], @XMM[2], @XMM[10] vadd.u32 @XMM[6], @XMM[3], @XMM[10] vadd.u32 @XMM[7], @XMM[4], @XMM[10] vadd.u32 @XMM[10], @XMM[5], @XMM[10] @ next counter @ Borrow prologue from _bsaes_encrypt8 to use the opportunity @ to flip byte order in 32-bit counter vldmia $keysched, {@XMM[9]} @ load round0 key #ifndef BSAES_ASM_EXTENDED_KEY add r4, $keysched, #0x10 @ pass next round key #else add r4, $key, #`248+16` #endif vldmia $ctr, {@XMM[8]} @ .LREVM0SR mov r5, $rounds @ pass rounds vstmia $fp, {@XMM[10]} @ save next counter #ifdef __APPLE__ mov $const, #:lower16:(.LREVM0SR-.LSR) sub $const, $ctr, $const #else sub $const, $ctr, #.LREVM0SR-.LSR @ pass constants #endif bl _bsaes_encrypt8_alt subs $len, $len, #8 blo .Lctr_enc_loop_done vld1.8 {@XMM[8]-@XMM[9]}, [$inp]! @ load input vld1.8 {@XMM[10]-@XMM[11]}, [$inp]! veor @XMM[0], @XMM[8] veor @XMM[1], @XMM[9] vld1.8 {@XMM[12]-@XMM[13]}, [$inp]! veor @XMM[4], @XMM[10] veor @XMM[6], @XMM[11] vld1.8 {@XMM[14]-@XMM[15]}, [$inp]! veor @XMM[3], @XMM[12] vst1.8 {@XMM[0]-@XMM[1]}, [$out]! @ write output veor @XMM[7], @XMM[13] veor @XMM[2], @XMM[14] vst1.8 {@XMM[4]}, [$out]! veor @XMM[5], @XMM[15] vst1.8 {@XMM[6]}, [$out]! vmov.i32 @XMM[8], #1 @ compose 1<<96 vst1.8 {@XMM[3]}, [$out]! veor @XMM[9], @XMM[9], @XMM[9] vst1.8 {@XMM[7]}, [$out]! vext.8 @XMM[8], @XMM[9], @XMM[8], #4 vst1.8 {@XMM[2]}, [$out]! vadd.u32 @XMM[9],@XMM[8],@XMM[8] @ compose 2<<96 vst1.8 {@XMM[5]}, [$out]! vldmia $fp, {@XMM[0]} @ load counter bne .Lctr_enc_loop b .Lctr_enc_done .align 4 .Lctr_enc_loop_done: add $len, $len, #8 vld1.8 {@XMM[8]}, [$inp]! @ load input veor @XMM[0], @XMM[8] vst1.8 {@XMM[0]}, [$out]! @ write output cmp $len, #2 blo .Lctr_enc_done vld1.8 {@XMM[9]}, [$inp]! veor @XMM[1], @XMM[9] vst1.8 {@XMM[1]}, [$out]! beq .Lctr_enc_done vld1.8 {@XMM[10]}, [$inp]! veor @XMM[4], @XMM[10] vst1.8 {@XMM[4]}, [$out]! cmp $len, #4 blo .Lctr_enc_done vld1.8 {@XMM[11]}, [$inp]! veor @XMM[6], @XMM[11] vst1.8 {@XMM[6]}, [$out]! beq .Lctr_enc_done vld1.8 {@XMM[12]}, [$inp]! veor @XMM[3], @XMM[12] vst1.8 {@XMM[3]}, [$out]! cmp $len, #6 blo .Lctr_enc_done vld1.8 {@XMM[13]}, [$inp]! veor @XMM[7], @XMM[13] vst1.8 {@XMM[7]}, [$out]! beq .Lctr_enc_done vld1.8 {@XMM[14]}, [$inp] veor @XMM[2], @XMM[14] vst1.8 {@XMM[2]}, [$out]! .Lctr_enc_done: vmov.i32 q0, #0 vmov.i32 q1, #0 #ifndef BSAES_ASM_EXTENDED_KEY .Lctr_enc_bzero: @ wipe key schedule [if any] vstmia $keysched!, {q0-q1} cmp $keysched, $fp bne .Lctr_enc_bzero #else vstmia $keysched, {q0-q1} #endif mov sp, $fp add sp, #0x10 @ add sp,$fp,#0x10 is no good for thumb VFP_ABI_POP ldmia sp!, {r4-r10, pc} @ return @ OpenSSL contains aes_nohw_* fallback code here. We patch this @ out to retain a constant-time implementation. .size GFp_bsaes_ctr32_encrypt_blocks,.-GFp_bsaes_ctr32_encrypt_blocks ___ } $code.=<<___; #endif ___ $code =~ s/\`([^\`]*)\`/eval($1)/gem; open SELF,$0; while() { next if (/^#!/); last if (!s/^#/@/ and !/^$/); print; } close SELF; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/vpaes-x86.pl000064400000000000000000000431101352416253600200570ustar0000000000000000#! /usr/bin/env perl # Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html ###################################################################### ## Constant-time SSSE3 AES core implementation. ## version 0.1 ## ## By Mike Hamburg (Stanford University), 2009 ## Public domain. ## ## For details see http://shiftleft.org/papers/vector_aes/ and ## http://crypto.stanford.edu/vpaes/. ###################################################################### # September 2011. # # Port vpaes-x86_64.pl as 32-bit "almost" drop-in replacement for # aes-586.pl. "Almost" refers to the fact that AES_cbc_encrypt # doesn't handle partial vectors (doesn't have to if called from # EVP only). "Drop-in" implies that this module doesn't share key # schedule structure with the original nor does it make assumption # about its alignment... # # Performance summary. aes-586.pl column lists large-block CBC # encrypt/decrypt/with-hyper-threading-off(*) results in cycles per # byte processed with 128-bit key, and vpaes-x86.pl column - [also # large-block CBC] encrypt/decrypt. # # aes-586.pl vpaes-x86.pl # # Core 2(**) 28.1/41.4/18.3 21.9/25.2(***) # Nehalem 27.9/40.4/18.1 10.2/11.9 # Atom 70.7/92.1/60.1 61.1/75.4(***) # Silvermont 45.4/62.9/24.1 49.2/61.1(***) # # (*) "Hyper-threading" in the context refers rather to cache shared # among multiple cores, than to specifically Intel HTT. As vast # majority of contemporary cores share cache, slower code path # is common place. In other words "with-hyper-threading-off" # results are presented mostly for reference purposes. # # (**) "Core 2" refers to initial 65nm design, a.k.a. Conroe. # # (***) Less impressive improvement on Core 2 and Atom is due to slow # pshufb, yet it's respectable +28%/64% improvement on Core 2 # and +15% on Atom (as implied, over "hyper-threading-safe" # code path). # # $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output = pop; open OUT,">$output"; *STDOUT=*OUT; &asm_init($ARGV[0],$x86only = $ARGV[$#ARGV] eq "386"); $PREFIX="vpaes"; my ($round, $base, $magic, $key, $const, $inp, $out)= ("eax", "ebx", "ecx", "edx","ebp", "esi","edi"); &static_label("_vpaes_consts"); &static_label("_vpaes_schedule_low_round"); &set_label("_vpaes_consts",64); $k_inv=-0x30; # inv, inva &data_word(0x0D080180,0x0E05060F,0x0A0B0C02,0x04070309); &data_word(0x0F0B0780,0x01040A06,0x02050809,0x030D0E0C); $k_s0F=-0x10; # s0F &data_word(0x0F0F0F0F,0x0F0F0F0F,0x0F0F0F0F,0x0F0F0F0F); $k_ipt=0x00; # input transform (lo, hi) &data_word(0x5A2A7000,0xC2B2E898,0x52227808,0xCABAE090); &data_word(0x317C4D00,0x4C01307D,0xB0FDCC81,0xCD80B1FC); $k_sb1=0x20; # sb1u, sb1t &data_word(0xCB503E00,0xB19BE18F,0x142AF544,0xA5DF7A6E); &data_word(0xFAE22300,0x3618D415,0x0D2ED9EF,0x3BF7CCC1); $k_sb2=0x40; # sb2u, sb2t &data_word(0x0B712400,0xE27A93C6,0xBC982FCD,0x5EB7E955); &data_word(0x0AE12900,0x69EB8840,0xAB82234A,0xC2A163C8); $k_sbo=0x60; # sbou, sbot &data_word(0x6FBDC700,0xD0D26D17,0xC502A878,0x15AABF7A); &data_word(0x5FBB6A00,0xCFE474A5,0x412B35FA,0x8E1E90D1); $k_mc_forward=0x80; # mc_forward &data_word(0x00030201,0x04070605,0x080B0A09,0x0C0F0E0D); &data_word(0x04070605,0x080B0A09,0x0C0F0E0D,0x00030201); &data_word(0x080B0A09,0x0C0F0E0D,0x00030201,0x04070605); &data_word(0x0C0F0E0D,0x00030201,0x04070605,0x080B0A09); $k_mc_backward=0xc0; # mc_backward &data_word(0x02010003,0x06050407,0x0A09080B,0x0E0D0C0F); &data_word(0x0E0D0C0F,0x02010003,0x06050407,0x0A09080B); &data_word(0x0A09080B,0x0E0D0C0F,0x02010003,0x06050407); &data_word(0x06050407,0x0A09080B,0x0E0D0C0F,0x02010003); $k_sr=0x100; # sr &data_word(0x03020100,0x07060504,0x0B0A0908,0x0F0E0D0C); &data_word(0x0F0A0500,0x030E0904,0x07020D08,0x0B06010C); &data_word(0x0B020900,0x0F060D04,0x030A0108,0x070E050C); &data_word(0x070A0D00,0x0B0E0104,0x0F020508,0x0306090C); $k_rcon=0x140; # rcon &data_word(0xAF9DEEB6,0x1F8391B9,0x4D7C7D81,0x702A9808); $k_s63=0x150; # s63: all equal to 0x63 transformed &data_word(0x5B5B5B5B,0x5B5B5B5B,0x5B5B5B5B,0x5B5B5B5B); $k_opt=0x160; # output transform &data_word(0xD6B66000,0xFF9F4929,0xDEBE6808,0xF7974121); &data_word(0x50BCEC00,0x01EDBD51,0xB05C0CE0,0xE10D5DB1); $k_deskew=0x180; # deskew tables: inverts the sbox's "skew" &data_word(0x47A4E300,0x07E4A340,0x5DBEF91A,0x1DFEB95A); &data_word(0x83EA6900,0x5F36B5DC,0xF49D1E77,0x2841C2AB); &asciz ("Vector Permutation AES for x86/SSSE3, Mike Hamburg (Stanford University)"); &align (64); &function_begin_B("_vpaes_preheat"); &add ($const,&DWP(0,"esp")); &movdqa ("xmm7",&QWP($k_inv,$const)); &movdqa ("xmm6",&QWP($k_s0F,$const)); &ret (); &function_end_B("_vpaes_preheat"); ## ## _aes_encrypt_core ## ## AES-encrypt %xmm0. ## ## Inputs: ## %xmm0 = input ## %xmm6-%xmm7 as in _vpaes_preheat ## (%edx) = scheduled keys ## ## Output in %xmm0 ## Clobbers %xmm1-%xmm5, %eax, %ebx, %ecx, %edx ## ## &function_begin_B("_vpaes_encrypt_core"); &mov ($magic,16); &mov ($round,&DWP(240,$key)); &movdqa ("xmm1","xmm6") &movdqa ("xmm2",&QWP($k_ipt,$const)); &pandn ("xmm1","xmm0"); &pand ("xmm0","xmm6"); &movdqu ("xmm5",&QWP(0,$key)); &pshufb ("xmm2","xmm0"); &movdqa ("xmm0",&QWP($k_ipt+16,$const)); &pxor ("xmm2","xmm5"); &psrld ("xmm1",4); &add ($key,16); &pshufb ("xmm0","xmm1"); &lea ($base,&DWP($k_mc_backward,$const)); &pxor ("xmm0","xmm2"); &jmp (&label("enc_entry")); &set_label("enc_loop",16); # middle of middle round &movdqa ("xmm4",&QWP($k_sb1,$const)); # 4 : sb1u &movdqa ("xmm0",&QWP($k_sb1+16,$const));# 0 : sb1t &pshufb ("xmm4","xmm2"); # 4 = sb1u &pshufb ("xmm0","xmm3"); # 0 = sb1t &pxor ("xmm4","xmm5"); # 4 = sb1u + k &movdqa ("xmm5",&QWP($k_sb2,$const)); # 4 : sb2u &pxor ("xmm0","xmm4"); # 0 = A &movdqa ("xmm1",&QWP(-0x40,$base,$magic));# .Lk_mc_forward[] &pshufb ("xmm5","xmm2"); # 4 = sb2u &movdqa ("xmm2",&QWP($k_sb2+16,$const));# 2 : sb2t &movdqa ("xmm4",&QWP(0,$base,$magic)); # .Lk_mc_backward[] &pshufb ("xmm2","xmm3"); # 2 = sb2t &movdqa ("xmm3","xmm0"); # 3 = A &pxor ("xmm2","xmm5"); # 2 = 2A &pshufb ("xmm0","xmm1"); # 0 = B &add ($key,16); # next key &pxor ("xmm0","xmm2"); # 0 = 2A+B &pshufb ("xmm3","xmm4"); # 3 = D &add ($magic,16); # next mc &pxor ("xmm3","xmm0"); # 3 = 2A+B+D &pshufb ("xmm0","xmm1"); # 0 = 2B+C &and ($magic,0x30); # ... mod 4 &sub ($round,1); # nr-- &pxor ("xmm0","xmm3"); # 0 = 2A+3B+C+D &set_label("enc_entry"); # top of round &movdqa ("xmm1","xmm6"); # 1 : i &movdqa ("xmm5",&QWP($k_inv+16,$const));# 2 : a/k &pandn ("xmm1","xmm0"); # 1 = i<<4 &psrld ("xmm1",4); # 1 = i &pand ("xmm0","xmm6"); # 0 = k &pshufb ("xmm5","xmm0"); # 2 = a/k &movdqa ("xmm3","xmm7"); # 3 : 1/i &pxor ("xmm0","xmm1"); # 0 = j &pshufb ("xmm3","xmm1"); # 3 = 1/i &movdqa ("xmm4","xmm7"); # 4 : 1/j &pxor ("xmm3","xmm5"); # 3 = iak = 1/i + a/k &pshufb ("xmm4","xmm0"); # 4 = 1/j &movdqa ("xmm2","xmm7"); # 2 : 1/iak &pxor ("xmm4","xmm5"); # 4 = jak = 1/j + a/k &pshufb ("xmm2","xmm3"); # 2 = 1/iak &movdqa ("xmm3","xmm7"); # 3 : 1/jak &pxor ("xmm2","xmm0"); # 2 = io &pshufb ("xmm3","xmm4"); # 3 = 1/jak &movdqu ("xmm5",&QWP(0,$key)); &pxor ("xmm3","xmm1"); # 3 = jo &jnz (&label("enc_loop")); # middle of last round &movdqa ("xmm4",&QWP($k_sbo,$const)); # 3 : sbou .Lk_sbo &movdqa ("xmm0",&QWP($k_sbo+16,$const));# 3 : sbot .Lk_sbo+16 &pshufb ("xmm4","xmm2"); # 4 = sbou &pxor ("xmm4","xmm5"); # 4 = sb1u + k &pshufb ("xmm0","xmm3"); # 0 = sb1t &movdqa ("xmm1",&QWP(0x40,$base,$magic));# .Lk_sr[] &pxor ("xmm0","xmm4"); # 0 = A &pshufb ("xmm0","xmm1"); &ret (); &function_end_B("_vpaes_encrypt_core"); ######################################################## ## ## ## AES key schedule ## ## ## ######################################################## &function_begin_B("_vpaes_schedule_core"); &add ($const,&DWP(0,"esp")); &movdqu ("xmm0",&QWP(0,$inp)); # load key (unaligned) &movdqa ("xmm2",&QWP($k_rcon,$const)); # load rcon # input transform &movdqa ("xmm3","xmm0"); &lea ($base,&DWP($k_ipt,$const)); &movdqa (&QWP(4,"esp"),"xmm2"); # xmm8 &call ("_vpaes_schedule_transform"); &movdqa ("xmm7","xmm0"); &test ($out,$out); &jnz (&label("schedule_am_decrypting")); # encrypting, output zeroth round key after transform &movdqu (&QWP(0,$key),"xmm0"); &jmp (&label("schedule_go")); &set_label("schedule_am_decrypting"); # decrypting, output zeroth round key after shiftrows &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); &pshufb ("xmm3","xmm1"); &movdqu (&QWP(0,$key),"xmm3"); &xor ($magic,0x30); &set_label("schedule_go"); &cmp ($round,192); &ja (&label("schedule_256")); # 192-bit key support was removed. # 128: fall though ## ## .schedule_128 ## ## 128-bit specific part of key schedule. ## ## This schedule is really simple, because all its parts ## are accomplished by the subroutines. ## &set_label("schedule_128"); &mov ($round,10); &set_label("loop_schedule_128"); &call ("_vpaes_schedule_round"); &dec ($round); &jz (&label("schedule_mangle_last")); &call ("_vpaes_schedule_mangle"); # write output &jmp (&label("loop_schedule_128")); ## ## .aes_schedule_256 ## ## 256-bit specific part of key schedule. ## ## The structure here is very similar to the 128-bit ## schedule, but with an additional "low side" in ## %xmm6. The low side's rounds are the same as the ## high side's, except no rcon and no rotation. ## &set_label("schedule_256",16); &movdqu ("xmm0",&QWP(16,$inp)); # load key part 2 (unaligned) &call ("_vpaes_schedule_transform"); # input transform &mov ($round,7); &set_label("loop_schedule_256"); &call ("_vpaes_schedule_mangle"); # output low result &movdqa ("xmm6","xmm0"); # save cur_lo in xmm6 # high round &call ("_vpaes_schedule_round"); &dec ($round); &jz (&label("schedule_mangle_last")); &call ("_vpaes_schedule_mangle"); # low round. swap xmm7 and xmm6 &pshufd ("xmm0","xmm0",0xFF); &movdqa (&QWP(20,"esp"),"xmm7"); &movdqa ("xmm7","xmm6"); &call ("_vpaes_schedule_low_round"); &movdqa ("xmm7",&QWP(20,"esp")); &jmp (&label("loop_schedule_256")); ## ## .aes_schedule_mangle_last ## ## Mangler for last round of key schedule ## Mangles %xmm0 ## when encrypting, outputs out(%xmm0) ^ 63 ## when decrypting, outputs unskew(%xmm0) ## ## Always called right before return... jumps to cleanup and exits ## &set_label("schedule_mangle_last",16); # schedule last round key from xmm0 &lea ($base,&DWP($k_deskew,$const)); &test ($out,$out); &jnz (&label("schedule_mangle_last_dec")); # encrypting &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); &pshufb ("xmm0","xmm1"); # output permute &lea ($base,&DWP($k_opt,$const)); # prepare to output transform &add ($key,32); &set_label("schedule_mangle_last_dec"); &add ($key,-16); &pxor ("xmm0",&QWP($k_s63,$const)); &call ("_vpaes_schedule_transform"); # output transform &movdqu (&QWP(0,$key),"xmm0"); # save last key # cleanup &pxor ("xmm0","xmm0"); &pxor ("xmm1","xmm1"); &pxor ("xmm2","xmm2"); &pxor ("xmm3","xmm3"); &pxor ("xmm4","xmm4"); &pxor ("xmm5","xmm5"); &pxor ("xmm6","xmm6"); &pxor ("xmm7","xmm7"); &ret (); &function_end_B("_vpaes_schedule_core"); ## ## .aes_schedule_round ## ## Runs one main round of the key schedule on %xmm0, %xmm7 ## ## Specifically, runs subbytes on the high dword of %xmm0 ## then rotates it by one byte and xors into the low dword of ## %xmm7. ## ## Adds rcon from low byte of %xmm8, then rotates %xmm8 for ## next rcon. ## ## Smears the dwords of %xmm7 by xoring the low into the ## second low, result into third, result into highest. ## ## Returns results in %xmm7 = %xmm0. ## Clobbers %xmm1-%xmm5. ## &function_begin_B("_vpaes_schedule_round"); # extract rcon from xmm8 &movdqa ("xmm2",&QWP(8,"esp")); # xmm8 &pxor ("xmm1","xmm1"); &palignr("xmm1","xmm2",15); &palignr("xmm2","xmm2",15); &pxor ("xmm7","xmm1"); # rotate &pshufd ("xmm0","xmm0",0xFF); &palignr("xmm0","xmm0",1); # fall through... &movdqa (&QWP(8,"esp"),"xmm2"); # xmm8 # low round: same as high round, but no rotation and no rcon. &set_label("_vpaes_schedule_low_round"); # smear xmm7 &movdqa ("xmm1","xmm7"); &pslldq ("xmm7",4); &pxor ("xmm7","xmm1"); &movdqa ("xmm1","xmm7"); &pslldq ("xmm7",8); &pxor ("xmm7","xmm1"); &pxor ("xmm7",&QWP($k_s63,$const)); # subbyte &movdqa ("xmm4",&QWP($k_s0F,$const)); &movdqa ("xmm5",&QWP($k_inv,$const)); # 4 : 1/j &movdqa ("xmm1","xmm4"); &pandn ("xmm1","xmm0"); &psrld ("xmm1",4); # 1 = i &pand ("xmm0","xmm4"); # 0 = k &movdqa ("xmm2",&QWP($k_inv+16,$const));# 2 : a/k &pshufb ("xmm2","xmm0"); # 2 = a/k &pxor ("xmm0","xmm1"); # 0 = j &movdqa ("xmm3","xmm5"); # 3 : 1/i &pshufb ("xmm3","xmm1"); # 3 = 1/i &pxor ("xmm3","xmm2"); # 3 = iak = 1/i + a/k &movdqa ("xmm4","xmm5"); # 4 : 1/j &pshufb ("xmm4","xmm0"); # 4 = 1/j &pxor ("xmm4","xmm2"); # 4 = jak = 1/j + a/k &movdqa ("xmm2","xmm5"); # 2 : 1/iak &pshufb ("xmm2","xmm3"); # 2 = 1/iak &pxor ("xmm2","xmm0"); # 2 = io &movdqa ("xmm3","xmm5"); # 3 : 1/jak &pshufb ("xmm3","xmm4"); # 3 = 1/jak &pxor ("xmm3","xmm1"); # 3 = jo &movdqa ("xmm4",&QWP($k_sb1,$const)); # 4 : sbou &pshufb ("xmm4","xmm2"); # 4 = sbou &movdqa ("xmm0",&QWP($k_sb1+16,$const));# 0 : sbot &pshufb ("xmm0","xmm3"); # 0 = sb1t &pxor ("xmm0","xmm4"); # 0 = sbox output # add in smeared stuff &pxor ("xmm0","xmm7"); &movdqa ("xmm7","xmm0"); &ret (); &function_end_B("_vpaes_schedule_round"); ## ## .aes_schedule_transform ## ## Linear-transform %xmm0 according to tables at (%ebx) ## ## Output in %xmm0 ## Clobbers %xmm1, %xmm2 ## &function_begin_B("_vpaes_schedule_transform"); &movdqa ("xmm2",&QWP($k_s0F,$const)); &movdqa ("xmm1","xmm2"); &pandn ("xmm1","xmm0"); &psrld ("xmm1",4); &pand ("xmm0","xmm2"); &movdqa ("xmm2",&QWP(0,$base)); &pshufb ("xmm2","xmm0"); &movdqa ("xmm0",&QWP(16,$base)); &pshufb ("xmm0","xmm1"); &pxor ("xmm0","xmm2"); &ret (); &function_end_B("_vpaes_schedule_transform"); ## ## .aes_schedule_mangle ## ## Mangle xmm0 from (basis-transformed) standard version ## to our version. ## ## On encrypt, ## xor with 0x63 ## multiply by circulant 0,1,1,1 ## apply shiftrows transform ## ## On decrypt, ## xor with 0x63 ## multiply by "inverse mixcolumns" circulant E,B,D,9 ## deskew ## apply shiftrows transform ## ## ## Writes out to (%edx), and increments or decrements it ## Keeps track of round number mod 4 in %ecx ## Preserves xmm0 ## Clobbers xmm1-xmm5 ## &function_begin_B("_vpaes_schedule_mangle"); &movdqa ("xmm4","xmm0"); # save xmm0 for later &movdqa ("xmm5",&QWP($k_mc_forward,$const)); &test ($out,$out); &jnz (&label("schedule_mangle_dec")); # encrypting &add ($key,16); &pxor ("xmm4",&QWP($k_s63,$const)); &pshufb ("xmm4","xmm5"); &movdqa ("xmm3","xmm4"); &pshufb ("xmm4","xmm5"); &pxor ("xmm3","xmm4"); &pshufb ("xmm4","xmm5"); &pxor ("xmm3","xmm4"); &jmp (&label("schedule_mangle_both")); &set_label("schedule_mangle_dec",16); # inverse mix columns &movdqa ("xmm2",&QWP($k_s0F,$const)); &lea ($inp,&DWP($k_dksd,$const)); &movdqa ("xmm1","xmm2"); &pandn ("xmm1","xmm4"); &psrld ("xmm1",4); # 1 = hi &pand ("xmm4","xmm2"); # 4 = lo &movdqa ("xmm2",&QWP(0,$inp)); &pshufb ("xmm2","xmm4"); &movdqa ("xmm3",&QWP(0x10,$inp)); &pshufb ("xmm3","xmm1"); &pxor ("xmm3","xmm2"); &pshufb ("xmm3","xmm5"); &movdqa ("xmm2",&QWP(0x20,$inp)); &pshufb ("xmm2","xmm4"); &pxor ("xmm2","xmm3"); &movdqa ("xmm3",&QWP(0x30,$inp)); &pshufb ("xmm3","xmm1"); &pxor ("xmm3","xmm2"); &pshufb ("xmm3","xmm5"); &movdqa ("xmm2",&QWP(0x40,$inp)); &pshufb ("xmm2","xmm4"); &pxor ("xmm2","xmm3"); &movdqa ("xmm3",&QWP(0x50,$inp)); &pshufb ("xmm3","xmm1"); &pxor ("xmm3","xmm2"); &pshufb ("xmm3","xmm5"); &movdqa ("xmm2",&QWP(0x60,$inp)); &pshufb ("xmm2","xmm4"); &pxor ("xmm2","xmm3"); &movdqa ("xmm3",&QWP(0x70,$inp)); &pshufb ("xmm3","xmm1"); &pxor ("xmm3","xmm2"); &add ($key,-16); &set_label("schedule_mangle_both"); &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); &pshufb ("xmm3","xmm1"); &add ($magic,-16); &and ($magic,0x30); &movdqu (&QWP(0,$key),"xmm3"); &ret (); &function_end_B("_vpaes_schedule_mangle"); # # Interface to OpenSSL # &function_begin("GFp_${PREFIX}_set_encrypt_key"); &mov ($inp,&wparam(0)); # inp &lea ($base,&DWP(-56,"esp")); &mov ($round,&wparam(1)); # bits &and ($base,-16); &mov ($key,&wparam(2)); # key &xchg ($base,"esp"); # alloca &mov (&DWP(48,"esp"),$base); &mov ($base,$round); &shr ($base,5); &add ($base,5); &mov (&DWP(240,$key),$base); # AES_KEY->rounds = nbits/32+5; &mov ($magic,0x30); &mov ($out,0); &lea ($const,&DWP(&label("_vpaes_consts")."+0x30-".&label("pic_point"))); &call ("_vpaes_schedule_core"); &set_label("pic_point"); &mov ("esp",&DWP(48,"esp")); &xor ("eax","eax"); &function_end("GFp_${PREFIX}_set_encrypt_key"); &function_begin("GFp_${PREFIX}_encrypt"); &lea ($const,&DWP(&label("_vpaes_consts")."+0x30-".&label("pic_point"))); &call ("_vpaes_preheat"); &set_label("pic_point"); &mov ($inp,&wparam(0)); # inp &lea ($base,&DWP(-56,"esp")); &mov ($out,&wparam(1)); # out &and ($base,-16); &mov ($key,&wparam(2)); # key &xchg ($base,"esp"); # alloca &mov (&DWP(48,"esp"),$base); &movdqu ("xmm0",&QWP(0,$inp)); &call ("_vpaes_encrypt_core"); &movdqu (&QWP(0,$out),"xmm0"); &mov ("esp",&DWP(48,"esp")); &function_end("GFp_${PREFIX}_encrypt"); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl000064400000000000000000000460161352416253600204000ustar0000000000000000#! /usr/bin/env perl # Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html ###################################################################### ## Constant-time SSSE3 AES core implementation. ## version 0.1 ## ## By Mike Hamburg (Stanford University), 2009 ## Public domain. ## ## For details see http://shiftleft.org/papers/vector_aes/ and ## http://crypto.stanford.edu/vpaes/. ###################################################################### # September 2011. # # Interface to OpenSSL as "almost" drop-in replacement for # aes-x86_64.pl. "Almost" refers to the fact that AES_cbc_encrypt # doesn't handle partial vectors (doesn't have to if called from # EVP only). "Drop-in" implies that this module doesn't share key # schedule structure with the original nor does it make assumption # about its alignment... # # Performance summary. aes-x86_64.pl column lists large-block CBC # encrypt/decrypt/with-hyper-threading-off(*) results in cycles per # byte processed with 128-bit key, and vpaes-x86_64.pl column - # [also large-block CBC] encrypt/decrypt. # # aes-x86_64.pl vpaes-x86_64.pl # # Core 2(**) 29.6/41.1/14.3 21.9/25.2(***) # Nehalem 29.6/40.3/14.6 10.0/11.8 # Atom 57.3/74.2/32.1 60.9/77.2(***) # Silvermont 52.7/64.0/19.5 48.8/60.8(***) # Goldmont 38.9/49.0/17.8 10.6/12.6 # # (*) "Hyper-threading" in the context refers rather to cache shared # among multiple cores, than to specifically Intel HTT. As vast # majority of contemporary cores share cache, slower code path # is common place. In other words "with-hyper-threading-off" # results are presented mostly for reference purposes. # # (**) "Core 2" refers to initial 65nm design, a.k.a. Conroe. # # (***) Less impressive improvement on Core 2 and Atom is due to slow # pshufb, yet it's respectable +36%/62% improvement on Core 2 # (as implied, over "hyper-threading-safe" code path). # # $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $PREFIX="vpaes"; $code.=<<___; .text ## ## _aes_encrypt_core ## ## AES-encrypt %xmm0. ## ## Inputs: ## %xmm0 = input ## %xmm9-%xmm15 as in _vpaes_preheat ## (%rdx) = scheduled keys ## ## Output in %xmm0 ## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax ## Preserves %xmm6 - %xmm8 so you get some local vectors ## ## .type _vpaes_encrypt_core,\@abi-omnipotent .align 16 _vpaes_encrypt_core: .cfi_startproc mov %rdx, %r9 mov \$16, %r11 mov 240(%rdx),%eax movdqa %xmm9, %xmm1 movdqa .Lk_ipt(%rip), %xmm2 # iptlo pandn %xmm0, %xmm1 movdqu (%r9), %xmm5 # round0 key psrld \$4, %xmm1 pand %xmm9, %xmm0 pshufb %xmm0, %xmm2 movdqa .Lk_ipt+16(%rip), %xmm0 # ipthi pshufb %xmm1, %xmm0 pxor %xmm5, %xmm2 add \$16, %r9 pxor %xmm2, %xmm0 lea .Lk_mc_backward(%rip),%r10 jmp .Lenc_entry .align 16 .Lenc_loop: # middle of middle round movdqa %xmm13, %xmm4 # 4 : sb1u movdqa %xmm12, %xmm0 # 0 : sb1t pshufb %xmm2, %xmm4 # 4 = sb1u pshufb %xmm3, %xmm0 # 0 = sb1t pxor %xmm5, %xmm4 # 4 = sb1u + k movdqa %xmm15, %xmm5 # 4 : sb2u pxor %xmm4, %xmm0 # 0 = A movdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] pshufb %xmm2, %xmm5 # 4 = sb2u movdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] movdqa %xmm14, %xmm2 # 2 : sb2t pshufb %xmm3, %xmm2 # 2 = sb2t movdqa %xmm0, %xmm3 # 3 = A pxor %xmm5, %xmm2 # 2 = 2A pshufb %xmm1, %xmm0 # 0 = B add \$16, %r9 # next key pxor %xmm2, %xmm0 # 0 = 2A+B pshufb %xmm4, %xmm3 # 3 = D add \$16, %r11 # next mc pxor %xmm0, %xmm3 # 3 = 2A+B+D pshufb %xmm1, %xmm0 # 0 = 2B+C and \$0x30, %r11 # ... mod 4 sub \$1,%rax # nr-- pxor %xmm3, %xmm0 # 0 = 2A+3B+C+D .Lenc_entry: # top of round movdqa %xmm9, %xmm1 # 1 : i movdqa %xmm11, %xmm5 # 2 : a/k pandn %xmm0, %xmm1 # 1 = i<<4 psrld \$4, %xmm1 # 1 = i pand %xmm9, %xmm0 # 0 = k pshufb %xmm0, %xmm5 # 2 = a/k movdqa %xmm10, %xmm3 # 3 : 1/i pxor %xmm1, %xmm0 # 0 = j pshufb %xmm1, %xmm3 # 3 = 1/i movdqa %xmm10, %xmm4 # 4 : 1/j pxor %xmm5, %xmm3 # 3 = iak = 1/i + a/k pshufb %xmm0, %xmm4 # 4 = 1/j movdqa %xmm10, %xmm2 # 2 : 1/iak pxor %xmm5, %xmm4 # 4 = jak = 1/j + a/k pshufb %xmm3, %xmm2 # 2 = 1/iak movdqa %xmm10, %xmm3 # 3 : 1/jak pxor %xmm0, %xmm2 # 2 = io pshufb %xmm4, %xmm3 # 3 = 1/jak movdqu (%r9), %xmm5 pxor %xmm1, %xmm3 # 3 = jo jnz .Lenc_loop # middle of last round movdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo movdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 pshufb %xmm2, %xmm4 # 4 = sbou pxor %xmm5, %xmm4 # 4 = sb1u + k pshufb %xmm3, %xmm0 # 0 = sb1t movdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] pxor %xmm4, %xmm0 # 0 = A pshufb %xmm1, %xmm0 ret .cfi_endproc .size _vpaes_encrypt_core,.-_vpaes_encrypt_core ######################################################## ## ## ## AES key schedule ## ## ## ######################################################## .type _vpaes_schedule_core,\@abi-omnipotent .align 16 _vpaes_schedule_core: .cfi_startproc # rdi = key # rsi = size in bits # rdx = buffer # rcx = direction. 0=encrypt, 1=decrypt call _vpaes_preheat # load the tables movdqa .Lk_rcon(%rip), %xmm8 # load rcon movdqu (%rdi), %xmm0 # load key (unaligned) # input transform movdqa %xmm0, %xmm3 lea .Lk_ipt(%rip), %r11 call _vpaes_schedule_transform movdqa %xmm0, %xmm7 lea .Lk_sr(%rip),%r10 # encrypting, output zeroth round key after transform movdqu %xmm0, (%rdx) .Lschedule_go: cmp \$192, %esi ja .Lschedule_256 # 192-bit key support was removed. # 128: fall though ## ## .schedule_128 ## ## 128-bit specific part of key schedule. ## ## This schedule is really simple, because all its parts ## are accomplished by the subroutines. ## .Lschedule_128: mov \$10, %esi .Loop_schedule_128: call _vpaes_schedule_round dec %rsi jz .Lschedule_mangle_last call _vpaes_schedule_mangle # write output jmp .Loop_schedule_128 ## ## .aes_schedule_256 ## ## 256-bit specific part of key schedule. ## ## The structure here is very similar to the 128-bit ## schedule, but with an additional "low side" in ## %xmm6. The low side's rounds are the same as the ## high side's, except no rcon and no rotation. ## .align 16 .Lschedule_256: movdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) call _vpaes_schedule_transform # input transform mov \$7, %esi .Loop_schedule_256: call _vpaes_schedule_mangle # output low result movdqa %xmm0, %xmm6 # save cur_lo in xmm6 # high round call _vpaes_schedule_round dec %rsi jz .Lschedule_mangle_last call _vpaes_schedule_mangle # low round. swap xmm7 and xmm6 pshufd \$0xFF, %xmm0, %xmm0 movdqa %xmm7, %xmm5 movdqa %xmm6, %xmm7 call _vpaes_schedule_low_round movdqa %xmm5, %xmm7 jmp .Loop_schedule_256 ## ## .aes_schedule_mangle_last ## ## Mangler for last round of key schedule ## Mangles %xmm0 ## when encrypting, outputs out(%xmm0) ^ 63 ## when decrypting, outputs unskew(%xmm0) ## ## Always called right before return... jumps to cleanup and exits ## .align 16 .Lschedule_mangle_last: # schedule last round key from xmm0 lea .Lk_deskew(%rip),%r11 # prepare to deskew # encrypting movdqa (%r8,%r10),%xmm1 pshufb %xmm1, %xmm0 # output permute lea .Lk_opt(%rip), %r11 # prepare to output transform add \$32, %rdx .Lschedule_mangle_last_dec: add \$-16, %rdx pxor .Lk_s63(%rip), %xmm0 call _vpaes_schedule_transform # output transform movdqu %xmm0, (%rdx) # save last key # cleanup pxor %xmm0, %xmm0 pxor %xmm1, %xmm1 pxor %xmm2, %xmm2 pxor %xmm3, %xmm3 pxor %xmm4, %xmm4 pxor %xmm5, %xmm5 pxor %xmm6, %xmm6 pxor %xmm7, %xmm7 ret .cfi_endproc .size _vpaes_schedule_core,.-_vpaes_schedule_core ## ## .aes_schedule_round ## ## Runs one main round of the key schedule on %xmm0, %xmm7 ## ## Specifically, runs subbytes on the high dword of %xmm0 ## then rotates it by one byte and xors into the low dword of ## %xmm7. ## ## Adds rcon from low byte of %xmm8, then rotates %xmm8 for ## next rcon. ## ## Smears the dwords of %xmm7 by xoring the low into the ## second low, result into third, result into highest. ## ## Returns results in %xmm7 = %xmm0. ## Clobbers %xmm1-%xmm4, %r11. ## .type _vpaes_schedule_round,\@abi-omnipotent .align 16 _vpaes_schedule_round: .cfi_startproc # extract rcon from xmm8 pxor %xmm1, %xmm1 palignr \$15, %xmm8, %xmm1 palignr \$15, %xmm8, %xmm8 pxor %xmm1, %xmm7 # rotate pshufd \$0xFF, %xmm0, %xmm0 palignr \$1, %xmm0, %xmm0 # fall through... # low round: same as high round, but no rotation and no rcon. _vpaes_schedule_low_round: # smear xmm7 movdqa %xmm7, %xmm1 pslldq \$4, %xmm7 pxor %xmm1, %xmm7 movdqa %xmm7, %xmm1 pslldq \$8, %xmm7 pxor %xmm1, %xmm7 pxor .Lk_s63(%rip), %xmm7 # subbytes movdqa %xmm9, %xmm1 pandn %xmm0, %xmm1 psrld \$4, %xmm1 # 1 = i pand %xmm9, %xmm0 # 0 = k movdqa %xmm11, %xmm2 # 2 : a/k pshufb %xmm0, %xmm2 # 2 = a/k pxor %xmm1, %xmm0 # 0 = j movdqa %xmm10, %xmm3 # 3 : 1/i pshufb %xmm1, %xmm3 # 3 = 1/i pxor %xmm2, %xmm3 # 3 = iak = 1/i + a/k movdqa %xmm10, %xmm4 # 4 : 1/j pshufb %xmm0, %xmm4 # 4 = 1/j pxor %xmm2, %xmm4 # 4 = jak = 1/j + a/k movdqa %xmm10, %xmm2 # 2 : 1/iak pshufb %xmm3, %xmm2 # 2 = 1/iak pxor %xmm0, %xmm2 # 2 = io movdqa %xmm10, %xmm3 # 3 : 1/jak pshufb %xmm4, %xmm3 # 3 = 1/jak pxor %xmm1, %xmm3 # 3 = jo movdqa %xmm13, %xmm4 # 4 : sbou pshufb %xmm2, %xmm4 # 4 = sbou movdqa %xmm12, %xmm0 # 0 : sbot pshufb %xmm3, %xmm0 # 0 = sb1t pxor %xmm4, %xmm0 # 0 = sbox output # add in smeared stuff pxor %xmm7, %xmm0 movdqa %xmm0, %xmm7 ret .cfi_endproc .size _vpaes_schedule_round,.-_vpaes_schedule_round ## ## .aes_schedule_transform ## ## Linear-transform %xmm0 according to tables at (%r11) ## ## Requires that %xmm9 = 0x0F0F... as in preheat ## Output in %xmm0 ## Clobbers %xmm1, %xmm2 ## .type _vpaes_schedule_transform,\@abi-omnipotent .align 16 _vpaes_schedule_transform: .cfi_startproc movdqa %xmm9, %xmm1 pandn %xmm0, %xmm1 psrld \$4, %xmm1 pand %xmm9, %xmm0 movdqa (%r11), %xmm2 # lo pshufb %xmm0, %xmm2 movdqa 16(%r11), %xmm0 # hi pshufb %xmm1, %xmm0 pxor %xmm2, %xmm0 ret .cfi_endproc .size _vpaes_schedule_transform,.-_vpaes_schedule_transform ## ## .aes_schedule_mangle ## ## Mangle xmm0 from (basis-transformed) standard version ## to our version. ## ## On encrypt, ## xor with 0x63 ## multiply by circulant 0,1,1,1 ## apply shiftrows transform ## ## On decrypt, ## xor with 0x63 ## multiply by "inverse mixcolumns" circulant E,B,D,9 ## deskew ## apply shiftrows transform ## ## ## Writes out to (%rdx), and increments or decrements it ## Keeps track of round number mod 4 in %r8 ## Preserves xmm0 ## Clobbers xmm1-xmm5 ## .type _vpaes_schedule_mangle,\@abi-omnipotent .align 16 _vpaes_schedule_mangle: .cfi_startproc movdqa %xmm0, %xmm4 # save xmm0 for later movdqa .Lk_mc_forward(%rip),%xmm5 # encrypting add \$16, %rdx pxor .Lk_s63(%rip),%xmm4 pshufb %xmm5, %xmm4 movdqa %xmm4, %xmm3 pshufb %xmm5, %xmm4 pxor %xmm4, %xmm3 pshufb %xmm5, %xmm4 pxor %xmm4, %xmm3 .Lschedule_mangle_both: movdqa (%r8,%r10),%xmm1 pshufb %xmm1,%xmm3 add \$-16, %r8 and \$0x30, %r8 movdqu %xmm3, (%rdx) ret .cfi_endproc .size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle # # Interface to OpenSSL # .globl GFp_${PREFIX}_set_encrypt_key .type GFp_${PREFIX}_set_encrypt_key,\@function,3 .align 16 GFp_${PREFIX}_set_encrypt_key: .cfi_startproc ___ $code.=<<___ if ($win64); lea -0xb8(%rsp),%rsp movaps %xmm6,0x10(%rsp) movaps %xmm7,0x20(%rsp) movaps %xmm8,0x30(%rsp) movaps %xmm9,0x40(%rsp) movaps %xmm10,0x50(%rsp) movaps %xmm11,0x60(%rsp) movaps %xmm12,0x70(%rsp) movaps %xmm13,0x80(%rsp) movaps %xmm14,0x90(%rsp) movaps %xmm15,0xa0(%rsp) .Lenc_key_body: ___ $code.=<<___; mov %esi,%eax shr \$5,%eax add \$5,%eax mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; mov \$0,%ecx mov \$0x30,%r8d call _vpaes_schedule_core ___ $code.=<<___ if ($win64); movaps 0x10(%rsp),%xmm6 movaps 0x20(%rsp),%xmm7 movaps 0x30(%rsp),%xmm8 movaps 0x40(%rsp),%xmm9 movaps 0x50(%rsp),%xmm10 movaps 0x60(%rsp),%xmm11 movaps 0x70(%rsp),%xmm12 movaps 0x80(%rsp),%xmm13 movaps 0x90(%rsp),%xmm14 movaps 0xa0(%rsp),%xmm15 lea 0xb8(%rsp),%rsp .Lenc_key_epilogue: ___ $code.=<<___; xor %eax,%eax ret .cfi_endproc .size GFp_${PREFIX}_set_encrypt_key,.-GFp_${PREFIX}_set_encrypt_key .globl GFp_${PREFIX}_encrypt .type GFp_${PREFIX}_encrypt,\@function,3 .align 16 GFp_${PREFIX}_encrypt: .cfi_startproc ___ $code.=<<___ if ($win64); lea -0xb8(%rsp),%rsp movaps %xmm6,0x10(%rsp) movaps %xmm7,0x20(%rsp) movaps %xmm8,0x30(%rsp) movaps %xmm9,0x40(%rsp) movaps %xmm10,0x50(%rsp) movaps %xmm11,0x60(%rsp) movaps %xmm12,0x70(%rsp) movaps %xmm13,0x80(%rsp) movaps %xmm14,0x90(%rsp) movaps %xmm15,0xa0(%rsp) .Lenc_body: ___ $code.=<<___; movdqu (%rdi),%xmm0 call _vpaes_preheat call _vpaes_encrypt_core movdqu %xmm0,(%rsi) ___ $code.=<<___ if ($win64); movaps 0x10(%rsp),%xmm6 movaps 0x20(%rsp),%xmm7 movaps 0x30(%rsp),%xmm8 movaps 0x40(%rsp),%xmm9 movaps 0x50(%rsp),%xmm10 movaps 0x60(%rsp),%xmm11 movaps 0x70(%rsp),%xmm12 movaps 0x80(%rsp),%xmm13 movaps 0x90(%rsp),%xmm14 movaps 0xa0(%rsp),%xmm15 lea 0xb8(%rsp),%rsp .Lenc_epilogue: ___ $code.=<<___; ret .cfi_endproc .size GFp_${PREFIX}_encrypt,.-GFp_${PREFIX}_encrypt ___ $code.=<<___; ## ## _aes_preheat ## ## Fills register %r10 -> .aes_consts (so you can -fPIC) ## and %xmm9-%xmm15 as specified below. ## .type _vpaes_preheat,\@abi-omnipotent .align 16 _vpaes_preheat: .cfi_startproc lea .Lk_s0F(%rip), %r10 movdqa -0x20(%r10), %xmm10 # .Lk_inv movdqa -0x10(%r10), %xmm11 # .Lk_inv+16 movdqa 0x00(%r10), %xmm9 # .Lk_s0F movdqa 0x30(%r10), %xmm13 # .Lk_sb1 movdqa 0x40(%r10), %xmm12 # .Lk_sb1+16 movdqa 0x50(%r10), %xmm15 # .Lk_sb2 movdqa 0x60(%r10), %xmm14 # .Lk_sb2+16 ret .cfi_endproc .size _vpaes_preheat,.-_vpaes_preheat ######################################################## ## ## ## Constants ## ## ## ######################################################## .type _vpaes_consts,\@object .align 64 _vpaes_consts: .Lk_inv: # inv, inva .quad 0x0E05060F0D080180, 0x040703090A0B0C02 .quad 0x01040A060F0B0780, 0x030D0E0C02050809 .Lk_s0F: # s0F .quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F .Lk_ipt: # input transform (lo, hi) .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 .Lk_sb1: # sb1u, sb1t .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF .Lk_sb2: # sb2u, sb2t .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A .Lk_sbo: # sbou, sbot .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA .Lk_mc_forward: # mc_forward .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 .quad 0x080B0A0904070605, 0x000302010C0F0E0D .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 .quad 0x000302010C0F0E0D, 0x080B0A0904070605 .Lk_mc_backward:# mc_backward .quad 0x0605040702010003, 0x0E0D0C0F0A09080B .quad 0x020100030E0D0C0F, 0x0A09080B06050407 .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 .quad 0x0A09080B06050407, 0x020100030E0D0C0F .Lk_sr: # sr .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 .quad 0x030E09040F0A0500, 0x0B06010C07020D08 .quad 0x0F060D040B020900, 0x070E050C030A0108 .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 .Lk_rcon: # rcon .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 .Lk_s63: # s63: all equal to 0x63 transformed .quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B .Lk_opt: # output transform .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 .Lk_deskew: # deskew tables: inverts the sbox's "skew" .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 ___ if ($win64) { # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type se_handler,\@abi-omnipotent .align 16 se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lin_prologue lea 16(%rax),%rsi # %xmm save area lea 512($context),%rdi # &context.Xmm6 mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) .long 0xa548f3fc # cld; rep movsq lea 0xb8(%rax),%rax # adjust stack pointer .Lin_prologue: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$`1232/8`,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size se_handler,.-se_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_${PREFIX}_set_encrypt_key .rva .LSEH_end_GFp_${PREFIX}_set_encrypt_key .rva .LSEH_info_GFp_${PREFIX}_set_encrypt_key .rva .LSEH_begin_GFp_${PREFIX}_encrypt .rva .LSEH_end_GFp_${PREFIX}_encrypt .rva .LSEH_info_GFp_${PREFIX}_encrypt .section .xdata .align 8 .LSEH_info_GFp_${PREFIX}_set_encrypt_key: .byte 9,0,0,0 .rva se_handler .rva .Lenc_key_body,.Lenc_key_epilogue # HandlerData[] .LSEH_info_GFp_${PREFIX}_encrypt: .byte 9,0,0,0 .rva se_handler .rva .Lenc_body,.Lenc_epilogue # HandlerData[] ___ } $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/asm/armv4-mont.pl000064400000000000000000000467131352416253600201650ustar0000000000000000#! /usr/bin/env perl # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # January 2007. # Montgomery multiplication for ARMv4. # # Performance improvement naturally varies among CPU implementations # and compilers. The code was observed to provide +65-35% improvement # [depending on key length, less for longer keys] on ARM920T, and # +115-80% on Intel IXP425. This is compared to pre-bn_mul_mont code # base and compiler generated code with in-lined umull and even umlal # instructions. The latter means that this code didn't really have an # "advantage" of utilizing some "secret" instruction. # # The code is interoperable with Thumb ISA and is rather compact, less # than 1/2KB. Windows CE port would be trivial, as it's exclusively # about decorations, ABI and instruction syntax are identical. # November 2013 # # Add NEON code path, which handles lengths divisible by 8. RSA/DSA # performance improvement on Cortex-A8 is ~45-100% depending on key # length, more for longer keys. On Cortex-A15 the span is ~10-105%. # On Snapdragon S4 improvement was measured to vary from ~70% to # incredible ~380%, yes, 4.8x faster, for RSA4096 sign. But this is # rather because original integer-only code seems to perform # suboptimally on S4. Situation on Cortex-A9 is unfortunately # different. It's being looked into, but the trouble is that # performance for vectors longer than 256 bits is actually couple # of percent worse than for integer-only code. The code is chosen # for execution on all NEON-capable processors, because gain on # others outweighs the marginal loss on Cortex-A9. # September 2015 # # Align Cortex-A9 performance with November 2013 improvements, i.e. # NEON code is now ~20-105% faster than integer-only one on this # processor. But this optimization further improved performance even # on other processors: NEON code path is ~45-180% faster than original # integer-only on Cortex-A8, ~10-210% on Cortex-A15, ~70-450% on # Snapdragon S4. $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $num="r0"; # starts as num argument, but holds &tp[num-1] $ap="r1"; $bp="r2"; $bi="r2"; $rp="r2"; $np="r3"; $tp="r4"; $aj="r5"; $nj="r6"; $tj="r7"; $n0="r8"; ########### # r9 is reserved by ELF as platform specific, e.g. TLS pointer $alo="r10"; # sl, gcc uses it to keep @GOT $ahi="r11"; # fp $nlo="r12"; # ip ########### # r13 is stack pointer $nhi="r14"; # lr ########### # r15 is program counter #### argument block layout relative to &tp[num-1], a.k.a. $num $_rp="$num,#12*4"; # ap permanently resides in r1 $_bp="$num,#13*4"; # np permanently resides in r3 $_n0="$num,#14*4"; $_num="$num,#15*4"; $_bpend=$_num; $code=<<___; #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif #if __ARM_MAX_ARCH__>=7 .align 5 .LOPENSSL_armcap: .word GFp_armcap_P-.Lbn_mul_mont #endif .global GFp_bn_mul_mont .type GFp_bn_mul_mont,%function .align 5 GFp_bn_mul_mont: .Lbn_mul_mont: ldr ip,[sp,#4] @ load num stmdb sp!,{r0,r2} @ sp points at argument block #if __ARM_MAX_ARCH__>=7 tst ip,#7 bne .Lialu adr r0,.Lbn_mul_mont ldr r2,.LOPENSSL_armcap ldr r0,[r0,r2] #ifdef __APPLE__ ldr r0,[r0] #endif tst r0,#ARMV7_NEON @ NEON available? ldmia sp, {r0,r2} beq .Lialu add sp,sp,#8 b bn_mul8x_mont_neon .align 4 .Lialu: #endif cmp ip,#2 mov $num,ip @ load num #ifdef __thumb2__ ittt lt #endif movlt r0,#0 addlt sp,sp,#2*4 blt .Labrt stmdb sp!,{r4-r12,lr} @ save 10 registers mov $num,$num,lsl#2 @ rescale $num for byte count sub sp,sp,$num @ alloca(4*num) sub sp,sp,#4 @ +extra dword sub $num,$num,#4 @ "num=num-1" add $tp,$bp,$num @ &bp[num-1] add $num,sp,$num @ $num to point at &tp[num-1] ldr $n0,[$_n0] @ &n0 ldr $bi,[$bp] @ bp[0] ldr $aj,[$ap],#4 @ ap[0],ap++ ldr $nj,[$np],#4 @ np[0],np++ ldr $n0,[$n0] @ *n0 str $tp,[$_bpend] @ save &bp[num] umull $alo,$ahi,$aj,$bi @ ap[0]*bp[0] str $n0,[$_n0] @ save n0 value mul $n0,$alo,$n0 @ "tp[0]"*n0 mov $nlo,#0 umlal $alo,$nlo,$nj,$n0 @ np[0]*n0+"t[0]" mov $tp,sp .L1st: ldr $aj,[$ap],#4 @ ap[j],ap++ mov $alo,$ahi ldr $nj,[$np],#4 @ np[j],np++ mov $ahi,#0 umlal $alo,$ahi,$aj,$bi @ ap[j]*bp[0] mov $nhi,#0 umlal $nlo,$nhi,$nj,$n0 @ np[j]*n0 adds $nlo,$nlo,$alo str $nlo,[$tp],#4 @ tp[j-1]=,tp++ adc $nlo,$nhi,#0 cmp $tp,$num bne .L1st adds $nlo,$nlo,$ahi ldr $tp,[$_bp] @ restore bp mov $nhi,#0 ldr $n0,[$_n0] @ restore n0 adc $nhi,$nhi,#0 str $nlo,[$num] @ tp[num-1]= mov $tj,sp str $nhi,[$num,#4] @ tp[num]= .Louter: sub $tj,$num,$tj @ "original" $num-1 value sub $ap,$ap,$tj @ "rewind" ap to &ap[1] ldr $bi,[$tp,#4]! @ *(++bp) sub $np,$np,$tj @ "rewind" np to &np[1] ldr $aj,[$ap,#-4] @ ap[0] ldr $alo,[sp] @ tp[0] ldr $nj,[$np,#-4] @ np[0] ldr $tj,[sp,#4] @ tp[1] mov $ahi,#0 umlal $alo,$ahi,$aj,$bi @ ap[0]*bp[i]+tp[0] str $tp,[$_bp] @ save bp mul $n0,$alo,$n0 mov $nlo,#0 umlal $alo,$nlo,$nj,$n0 @ np[0]*n0+"tp[0]" mov $tp,sp .Linner: ldr $aj,[$ap],#4 @ ap[j],ap++ adds $alo,$ahi,$tj @ +=tp[j] ldr $nj,[$np],#4 @ np[j],np++ mov $ahi,#0 umlal $alo,$ahi,$aj,$bi @ ap[j]*bp[i] mov $nhi,#0 umlal $nlo,$nhi,$nj,$n0 @ np[j]*n0 adc $ahi,$ahi,#0 ldr $tj,[$tp,#8] @ tp[j+1] adds $nlo,$nlo,$alo str $nlo,[$tp],#4 @ tp[j-1]=,tp++ adc $nlo,$nhi,#0 cmp $tp,$num bne .Linner adds $nlo,$nlo,$ahi mov $nhi,#0 ldr $tp,[$_bp] @ restore bp adc $nhi,$nhi,#0 ldr $n0,[$_n0] @ restore n0 adds $nlo,$nlo,$tj ldr $tj,[$_bpend] @ restore &bp[num] adc $nhi,$nhi,#0 str $nlo,[$num] @ tp[num-1]= str $nhi,[$num,#4] @ tp[num]= cmp $tp,$tj #ifdef __thumb2__ itt ne #endif movne $tj,sp bne .Louter ldr $rp,[$_rp] @ pull rp mov $aj,sp add $num,$num,#4 @ $num to point at &tp[num] sub $aj,$num,$aj @ "original" num value mov $tp,sp @ "rewind" $tp mov $ap,$tp @ "borrow" $ap sub $np,$np,$aj @ "rewind" $np to &np[0] subs $tj,$tj,$tj @ "clear" carry flag .Lsub: ldr $tj,[$tp],#4 ldr $nj,[$np],#4 sbcs $tj,$tj,$nj @ tp[j]-np[j] str $tj,[$rp],#4 @ rp[j]= teq $tp,$num @ preserve carry bne .Lsub sbcs $nhi,$nhi,#0 @ upmost carry mov $tp,sp @ "rewind" $tp sub $rp,$rp,$aj @ "rewind" $rp .Lcopy: ldr $tj,[$tp] @ conditional copy ldr $aj,[$rp] str sp,[$tp],#4 @ zap tp #ifdef __thumb2__ it cc #endif movcc $aj,$tj str $aj,[$rp],#4 teq $tp,$num @ preserve carry bne .Lcopy mov sp,$num add sp,sp,#4 @ skip over tp[num+1] ldmia sp!,{r4-r12,lr} @ restore registers add sp,sp,#2*4 @ skip over {r0,r2} mov r0,#1 .Labrt: #if __ARM_ARCH__>=5 ret @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_bn_mul_mont,.-GFp_bn_mul_mont ___ { my ($A0,$A1,$A2,$A3)=map("d$_",(0..3)); my ($N0,$N1,$N2,$N3)=map("d$_",(4..7)); my ($Z,$Temp)=("q4","q5"); my @ACC=map("q$_",(6..13)); my ($Bi,$Ni,$M0)=map("d$_",(28..31)); my $zero="$Z#lo"; my $temp="$Temp#lo"; my ($rptr,$aptr,$bptr,$nptr,$n0,$num)=map("r$_",(0..5)); my ($tinptr,$toutptr,$inner,$outer,$bnptr)=map("r$_",(6..11)); $code.=<<___; #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type bn_mul8x_mont_neon,%function .align 5 bn_mul8x_mont_neon: mov ip,sp stmdb sp!,{r4-r11} vstmdb sp!,{d8-d15} @ ABI specification says so ldmia ip,{r4-r5} @ load rest of parameter block mov ip,sp cmp $num,#8 bhi .LNEON_8n @ special case for $num==8, everything is in register bank... vld1.32 {${Bi}[0]}, [$bptr,:32]! veor $zero,$zero,$zero sub $toutptr,sp,$num,lsl#4 vld1.32 {$A0-$A3}, [$aptr]! @ can't specify :32 :-( and $toutptr,$toutptr,#-64 vld1.32 {${M0}[0]}, [$n0,:32] mov sp,$toutptr @ alloca vzip.16 $Bi,$zero vmull.u32 @ACC[0],$Bi,${A0}[0] vmull.u32 @ACC[1],$Bi,${A0}[1] vmull.u32 @ACC[2],$Bi,${A1}[0] vshl.i64 $Ni,@ACC[0]#hi,#16 vmull.u32 @ACC[3],$Bi,${A1}[1] vadd.u64 $Ni,$Ni,@ACC[0]#lo veor $zero,$zero,$zero vmul.u32 $Ni,$Ni,$M0 vmull.u32 @ACC[4],$Bi,${A2}[0] vld1.32 {$N0-$N3}, [$nptr]! vmull.u32 @ACC[5],$Bi,${A2}[1] vmull.u32 @ACC[6],$Bi,${A3}[0] vzip.16 $Ni,$zero vmull.u32 @ACC[7],$Bi,${A3}[1] vmlal.u32 @ACC[0],$Ni,${N0}[0] sub $outer,$num,#1 vmlal.u32 @ACC[1],$Ni,${N0}[1] vmlal.u32 @ACC[2],$Ni,${N1}[0] vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vmov $Temp,@ACC[0] vmlal.u32 @ACC[5],$Ni,${N2}[1] vmov @ACC[0],@ACC[1] vmlal.u32 @ACC[6],$Ni,${N3}[0] vmov @ACC[1],@ACC[2] vmlal.u32 @ACC[7],$Ni,${N3}[1] vmov @ACC[2],@ACC[3] vmov @ACC[3],@ACC[4] vshr.u64 $temp,$temp,#16 vmov @ACC[4],@ACC[5] vmov @ACC[5],@ACC[6] vadd.u64 $temp,$temp,$Temp#hi vmov @ACC[6],@ACC[7] veor @ACC[7],@ACC[7] vshr.u64 $temp,$temp,#16 b .LNEON_outer8 .align 4 .LNEON_outer8: vld1.32 {${Bi}[0]}, [$bptr,:32]! veor $zero,$zero,$zero vzip.16 $Bi,$zero vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp vmlal.u32 @ACC[0],$Bi,${A0}[0] vmlal.u32 @ACC[1],$Bi,${A0}[1] vmlal.u32 @ACC[2],$Bi,${A1}[0] vshl.i64 $Ni,@ACC[0]#hi,#16 vmlal.u32 @ACC[3],$Bi,${A1}[1] vadd.u64 $Ni,$Ni,@ACC[0]#lo veor $zero,$zero,$zero subs $outer,$outer,#1 vmul.u32 $Ni,$Ni,$M0 vmlal.u32 @ACC[4],$Bi,${A2}[0] vmlal.u32 @ACC[5],$Bi,${A2}[1] vmlal.u32 @ACC[6],$Bi,${A3}[0] vzip.16 $Ni,$zero vmlal.u32 @ACC[7],$Bi,${A3}[1] vmlal.u32 @ACC[0],$Ni,${N0}[0] vmlal.u32 @ACC[1],$Ni,${N0}[1] vmlal.u32 @ACC[2],$Ni,${N1}[0] vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vmov $Temp,@ACC[0] vmlal.u32 @ACC[5],$Ni,${N2}[1] vmov @ACC[0],@ACC[1] vmlal.u32 @ACC[6],$Ni,${N3}[0] vmov @ACC[1],@ACC[2] vmlal.u32 @ACC[7],$Ni,${N3}[1] vmov @ACC[2],@ACC[3] vmov @ACC[3],@ACC[4] vshr.u64 $temp,$temp,#16 vmov @ACC[4],@ACC[5] vmov @ACC[5],@ACC[6] vadd.u64 $temp,$temp,$Temp#hi vmov @ACC[6],@ACC[7] veor @ACC[7],@ACC[7] vshr.u64 $temp,$temp,#16 bne .LNEON_outer8 vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp mov $toutptr,sp vshr.u64 $temp,@ACC[0]#lo,#16 mov $inner,$num vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp add $tinptr,sp,#96 vshr.u64 $temp,@ACC[0]#hi,#16 vzip.16 @ACC[0]#lo,@ACC[0]#hi b .LNEON_tail_entry .align 4 .LNEON_8n: veor @ACC[0],@ACC[0],@ACC[0] sub $toutptr,sp,#128 veor @ACC[1],@ACC[1],@ACC[1] sub $toutptr,$toutptr,$num,lsl#4 veor @ACC[2],@ACC[2],@ACC[2] and $toutptr,$toutptr,#-64 veor @ACC[3],@ACC[3],@ACC[3] mov sp,$toutptr @ alloca veor @ACC[4],@ACC[4],@ACC[4] add $toutptr,$toutptr,#256 veor @ACC[5],@ACC[5],@ACC[5] sub $inner,$num,#8 veor @ACC[6],@ACC[6],@ACC[6] veor @ACC[7],@ACC[7],@ACC[7] .LNEON_8n_init: vst1.64 {@ACC[0]-@ACC[1]},[$toutptr,:256]! subs $inner,$inner,#8 vst1.64 {@ACC[2]-@ACC[3]},[$toutptr,:256]! vst1.64 {@ACC[4]-@ACC[5]},[$toutptr,:256]! vst1.64 {@ACC[6]-@ACC[7]},[$toutptr,:256]! bne .LNEON_8n_init add $tinptr,sp,#256 vld1.32 {$A0-$A3},[$aptr]! add $bnptr,sp,#8 vld1.32 {${M0}[0]},[$n0,:32] mov $outer,$num b .LNEON_8n_outer .align 4 .LNEON_8n_outer: vld1.32 {${Bi}[0]},[$bptr,:32]! @ *b++ veor $zero,$zero,$zero vzip.16 $Bi,$zero add $toutptr,sp,#128 vld1.32 {$N0-$N3},[$nptr]! vmlal.u32 @ACC[0],$Bi,${A0}[0] vmlal.u32 @ACC[1],$Bi,${A0}[1] veor $zero,$zero,$zero vmlal.u32 @ACC[2],$Bi,${A1}[0] vshl.i64 $Ni,@ACC[0]#hi,#16 vmlal.u32 @ACC[3],$Bi,${A1}[1] vadd.u64 $Ni,$Ni,@ACC[0]#lo vmlal.u32 @ACC[4],$Bi,${A2}[0] vmul.u32 $Ni,$Ni,$M0 vmlal.u32 @ACC[5],$Bi,${A2}[1] vst1.32 {$Bi},[sp,:64] @ put aside smashed b[8*i+0] vmlal.u32 @ACC[6],$Bi,${A3}[0] vzip.16 $Ni,$zero vmlal.u32 @ACC[7],$Bi,${A3}[1] ___ for ($i=0; $i<7;) { $code.=<<___; vld1.32 {${Bi}[0]},[$bptr,:32]! @ *b++ vmlal.u32 @ACC[0],$Ni,${N0}[0] veor $temp,$temp,$temp vmlal.u32 @ACC[1],$Ni,${N0}[1] vzip.16 $Bi,$temp vmlal.u32 @ACC[2],$Ni,${N1}[0] vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vadd.u64 @ACC[0]#lo,@ACC[0]#lo,@ACC[0]#hi vmlal.u32 @ACC[5],$Ni,${N2}[1] vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 vmlal.u32 @ACC[6],$Ni,${N3}[0] vmlal.u32 @ACC[7],$Ni,${N3}[1] vadd.u64 @ACC[1]#lo,@ACC[1]#lo,@ACC[0]#lo vst1.32 {$Ni},[$bnptr,:64]! @ put aside smashed m[8*i+$i] ___ push(@ACC,shift(@ACC)); $i++; $code.=<<___; vmlal.u32 @ACC[0],$Bi,${A0}[0] vld1.64 {@ACC[7]},[$tinptr,:128]! vmlal.u32 @ACC[1],$Bi,${A0}[1] veor $zero,$zero,$zero vmlal.u32 @ACC[2],$Bi,${A1}[0] vshl.i64 $Ni,@ACC[0]#hi,#16 vmlal.u32 @ACC[3],$Bi,${A1}[1] vadd.u64 $Ni,$Ni,@ACC[0]#lo vmlal.u32 @ACC[4],$Bi,${A2}[0] vmul.u32 $Ni,$Ni,$M0 vmlal.u32 @ACC[5],$Bi,${A2}[1] vst1.32 {$Bi},[$bnptr,:64]! @ put aside smashed b[8*i+$i] vmlal.u32 @ACC[6],$Bi,${A3}[0] vzip.16 $Ni,$zero vmlal.u32 @ACC[7],$Bi,${A3}[1] ___ } $code.=<<___; vld1.32 {$Bi},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 @ACC[0],$Ni,${N0}[0] vld1.32 {$A0-$A3},[$aptr]! vmlal.u32 @ACC[1],$Ni,${N0}[1] vmlal.u32 @ACC[2],$Ni,${N1}[0] vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vadd.u64 @ACC[0]#lo,@ACC[0]#lo,@ACC[0]#hi vmlal.u32 @ACC[5],$Ni,${N2}[1] vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 vmlal.u32 @ACC[6],$Ni,${N3}[0] vmlal.u32 @ACC[7],$Ni,${N3}[1] vadd.u64 @ACC[1]#lo,@ACC[1]#lo,@ACC[0]#lo vst1.32 {$Ni},[$bnptr,:64] @ put aside smashed m[8*i+$i] add $bnptr,sp,#8 @ rewind ___ push(@ACC,shift(@ACC)); $code.=<<___; sub $inner,$num,#8 b .LNEON_8n_inner .align 4 .LNEON_8n_inner: subs $inner,$inner,#8 vmlal.u32 @ACC[0],$Bi,${A0}[0] vld1.64 {@ACC[7]},[$tinptr,:128] vmlal.u32 @ACC[1],$Bi,${A0}[1] vld1.32 {$Ni},[$bnptr,:64]! @ pull smashed m[8*i+0] vmlal.u32 @ACC[2],$Bi,${A1}[0] vld1.32 {$N0-$N3},[$nptr]! vmlal.u32 @ACC[3],$Bi,${A1}[1] it ne addne $tinptr,$tinptr,#16 @ don't advance in last iteration vmlal.u32 @ACC[4],$Bi,${A2}[0] vmlal.u32 @ACC[5],$Bi,${A2}[1] vmlal.u32 @ACC[6],$Bi,${A3}[0] vmlal.u32 @ACC[7],$Bi,${A3}[1] ___ for ($i=1; $i<8; $i++) { $code.=<<___; vld1.32 {$Bi},[$bnptr,:64]! @ pull smashed b[8*i+$i] vmlal.u32 @ACC[0],$Ni,${N0}[0] vmlal.u32 @ACC[1],$Ni,${N0}[1] vmlal.u32 @ACC[2],$Ni,${N1}[0] vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vmlal.u32 @ACC[5],$Ni,${N2}[1] vmlal.u32 @ACC[6],$Ni,${N3}[0] vmlal.u32 @ACC[7],$Ni,${N3}[1] vst1.64 {@ACC[0]},[$toutptr,:128]! ___ push(@ACC,shift(@ACC)); $code.=<<___; vmlal.u32 @ACC[0],$Bi,${A0}[0] vld1.64 {@ACC[7]},[$tinptr,:128] vmlal.u32 @ACC[1],$Bi,${A0}[1] vld1.32 {$Ni},[$bnptr,:64]! @ pull smashed m[8*i+$i] vmlal.u32 @ACC[2],$Bi,${A1}[0] it ne addne $tinptr,$tinptr,#16 @ don't advance in last iteration vmlal.u32 @ACC[3],$Bi,${A1}[1] vmlal.u32 @ACC[4],$Bi,${A2}[0] vmlal.u32 @ACC[5],$Bi,${A2}[1] vmlal.u32 @ACC[6],$Bi,${A3}[0] vmlal.u32 @ACC[7],$Bi,${A3}[1] ___ } $code.=<<___; it eq subeq $aptr,$aptr,$num,lsl#2 @ rewind vmlal.u32 @ACC[0],$Ni,${N0}[0] vld1.32 {$Bi},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 @ACC[1],$Ni,${N0}[1] vld1.32 {$A0-$A3},[$aptr]! vmlal.u32 @ACC[2],$Ni,${N1}[0] add $bnptr,sp,#8 @ rewind vmlal.u32 @ACC[3],$Ni,${N1}[1] vmlal.u32 @ACC[4],$Ni,${N2}[0] vmlal.u32 @ACC[5],$Ni,${N2}[1] vmlal.u32 @ACC[6],$Ni,${N3}[0] vst1.64 {@ACC[0]},[$toutptr,:128]! vmlal.u32 @ACC[7],$Ni,${N3}[1] bne .LNEON_8n_inner ___ push(@ACC,shift(@ACC)); $code.=<<___; add $tinptr,sp,#128 vst1.64 {@ACC[0]-@ACC[1]},[$toutptr,:256]! veor q2,q2,q2 @ $N0-$N1 vst1.64 {@ACC[2]-@ACC[3]},[$toutptr,:256]! veor q3,q3,q3 @ $N2-$N3 vst1.64 {@ACC[4]-@ACC[5]},[$toutptr,:256]! vst1.64 {@ACC[6]},[$toutptr,:128] subs $outer,$outer,#8 vld1.64 {@ACC[0]-@ACC[1]},[$tinptr,:256]! vld1.64 {@ACC[2]-@ACC[3]},[$tinptr,:256]! vld1.64 {@ACC[4]-@ACC[5]},[$tinptr,:256]! vld1.64 {@ACC[6]-@ACC[7]},[$tinptr,:256]! itt ne subne $nptr,$nptr,$num,lsl#2 @ rewind bne .LNEON_8n_outer add $toutptr,sp,#128 vst1.64 {q2-q3}, [sp,:256]! @ start wiping stack frame vshr.u64 $temp,@ACC[0]#lo,#16 vst1.64 {q2-q3},[sp,:256]! vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp vst1.64 {q2-q3}, [sp,:256]! vshr.u64 $temp,@ACC[0]#hi,#16 vst1.64 {q2-q3}, [sp,:256]! vzip.16 @ACC[0]#lo,@ACC[0]#hi mov $inner,$num b .LNEON_tail_entry .align 4 .LNEON_tail: vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp vshr.u64 $temp,@ACC[0]#lo,#16 vld1.64 {@ACC[2]-@ACC[3]}, [$tinptr, :256]! vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp vld1.64 {@ACC[4]-@ACC[5]}, [$tinptr, :256]! vshr.u64 $temp,@ACC[0]#hi,#16 vld1.64 {@ACC[6]-@ACC[7]}, [$tinptr, :256]! vzip.16 @ACC[0]#lo,@ACC[0]#hi .LNEON_tail_entry: ___ for ($i=1; $i<8; $i++) { $code.=<<___; vadd.u64 @ACC[1]#lo,@ACC[1]#lo,$temp vst1.32 {@ACC[0]#lo[0]}, [$toutptr, :32]! vshr.u64 $temp,@ACC[1]#lo,#16 vadd.u64 @ACC[1]#hi,@ACC[1]#hi,$temp vshr.u64 $temp,@ACC[1]#hi,#16 vzip.16 @ACC[1]#lo,@ACC[1]#hi ___ push(@ACC,shift(@ACC)); } push(@ACC,shift(@ACC)); $code.=<<___; vld1.64 {@ACC[0]-@ACC[1]}, [$tinptr, :256]! subs $inner,$inner,#8 vst1.32 {@ACC[7]#lo[0]}, [$toutptr, :32]! bne .LNEON_tail vst1.32 {${temp}[0]}, [$toutptr, :32] @ top-most bit sub $nptr,$nptr,$num,lsl#2 @ rewind $nptr subs $aptr,sp,#0 @ clear carry flag add $bptr,sp,$num,lsl#2 .LNEON_sub: ldmia $aptr!, {r4-r7} ldmia $nptr!, {r8-r11} sbcs r8, r4,r8 sbcs r9, r5,r9 sbcs r10,r6,r10 sbcs r11,r7,r11 teq $aptr,$bptr @ preserves carry stmia $rptr!, {r8-r11} bne .LNEON_sub ldr r10, [$aptr] @ load top-most bit mov r11,sp veor q0,q0,q0 sub r11,$bptr,r11 @ this is num*4 veor q1,q1,q1 mov $aptr,sp sub $rptr,$rptr,r11 @ rewind $rptr mov $nptr,$bptr @ second 3/4th of frame sbcs r10,r10,#0 @ result is carry flag .LNEON_copy_n_zap: ldmia $aptr!, {r4-r7} ldmia $rptr, {r8-r11} it cc movcc r8, r4 vst1.64 {q0-q1}, [$nptr,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0-q1}, [$nptr,:256]! @ wipe it cc movcc r11,r7 ldmia $aptr, {r4-r7} stmia $rptr!, {r8-r11} sub $aptr,$aptr,#16 ldmia $rptr, {r8-r11} it cc movcc r8, r4 vst1.64 {q0-q1}, [$aptr,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0-q1}, [$nptr,:256]! @ wipe it cc movcc r11,r7 teq $aptr,$bptr @ preserves carry stmia $rptr!, {r8-r11} bne .LNEON_copy_n_zap mov sp,ip vldmia sp!,{d8-d15} ldmia sp!,{r4-r11} ret @ bx lr .size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon #endif ___ } $code.=<<___; .asciz "Montgomery multiplication for ARMv4/NEON, CRYPTOGAMS by " .align 2 #if __ARM_MAX_ARCH__>=7 .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif ___ foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/ge; s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/ge or s/\bret\b/bx lr/g or s/\bbx\s+lr\b/.word\t0xe12fff1e/g; # make it possible to compile with -march=armv4 print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/asm/armv8-mont.pl000064400000000000000000001077251352416253600201720ustar0000000000000000#! /usr/bin/env perl # Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # March 2015 # # "Teaser" Montgomery multiplication module for ARMv8. Needs more # work. While it does improve RSA sign performance by 20-30% (less for # longer keys) on most processors, for some reason RSA2048 is not # faster and RSA4096 goes 15-20% slower on Cortex-A57. Multiplication # instruction issue rate is limited on processor in question, meaning # that dedicated squaring procedure is a must. Well, actually all # contemporary AArch64 processors seem to have limited multiplication # issue rate, i.e. they can't issue multiplication every cycle, which # explains moderate improvement coefficients in comparison to # compiler-generated code. Recall that compiler is instructed to use # umulh and therefore uses same amount of multiplication instructions # to do the job. Assembly's edge is to minimize number of "collateral" # instructions and of course instruction scheduling. # # April 2015 # # Squaring procedure that handles lengths divisible by 8 improves # RSA/DSA performance by 25-40-60% depending on processor and key # length. Overall improvement coefficients are always positive in # comparison to compiler-generated code. On Cortex-A57 improvement # is still modest on longest key lengths, while others exhibit e.g. # 50-70% improvement for RSA4096 sign. RSA2048 sign is ~25% faster # on Cortex-A57 and ~60-100% faster on others. $flavour = shift; $output = shift; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; ($lo0,$hi0,$aj,$m0,$alo,$ahi, $lo1,$hi1,$nj,$m1,$nlo,$nhi, $ovf, $i,$j,$tp,$tj) = map("x$_",6..17,19..24); # int GFp_bn_mul_mont( $rp="x0"; # BN_ULONG *rp, $ap="x1"; # const BN_ULONG *ap, $bp="x2"; # const BN_ULONG *bp, $np="x3"; # const BN_ULONG *np, $n0="x4"; # const BN_ULONG *n0, $num="x5"; # size_t num); $code.=<<___; .text .globl GFp_bn_mul_mont .type GFp_bn_mul_mont,%function .align 5 GFp_bn_mul_mont: tst $num,#7 b.eq __bn_sqr8x_mont tst $num,#3 b.eq __bn_mul4x_mont .Lmul_mont: stp x29,x30,[sp,#-64]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] ldr $m0,[$bp],#8 // bp[0] sub $tp,sp,$num,lsl#3 ldp $hi0,$aj,[$ap],#16 // ap[0..1] lsl $num,$num,#3 ldr $n0,[$n0] // *n0 and $tp,$tp,#-16 // ABI says so ldp $hi1,$nj,[$np],#16 // np[0..1] mul $lo0,$hi0,$m0 // ap[0]*bp[0] sub $j,$num,#16 // j=num-2 umulh $hi0,$hi0,$m0 mul $alo,$aj,$m0 // ap[1]*bp[0] umulh $ahi,$aj,$m0 mul $m1,$lo0,$n0 // "tp[0]"*n0 mov sp,$tp // alloca // (*) mul $lo1,$hi1,$m1 // np[0]*m1 umulh $hi1,$hi1,$m1 mul $nlo,$nj,$m1 // np[1]*m1 // (*) adds $lo1,$lo1,$lo0 // discarded // (*) As for removal of first multiplication and addition // instructions. The outcome of first addition is // guaranteed to be zero, which leaves two computationally // significant outcomes: it either carries or not. Then // question is when does it carry? Is there alternative // way to deduce it? If you follow operations, you can // observe that condition for carry is quite simple: // $lo0 being non-zero. So that carry can be calculated // by adding -1 to $lo0. That's what next instruction does. subs xzr,$lo0,#1 // (*) umulh $nhi,$nj,$m1 adc $hi1,$hi1,xzr cbz $j,.L1st_skip .L1st: ldr $aj,[$ap],#8 adds $lo0,$alo,$hi0 sub $j,$j,#8 // j-- adc $hi0,$ahi,xzr ldr $nj,[$np],#8 adds $lo1,$nlo,$hi1 mul $alo,$aj,$m0 // ap[j]*bp[0] adc $hi1,$nhi,xzr umulh $ahi,$aj,$m0 adds $lo1,$lo1,$lo0 mul $nlo,$nj,$m1 // np[j]*m1 adc $hi1,$hi1,xzr umulh $nhi,$nj,$m1 str $lo1,[$tp],#8 // tp[j-1] cbnz $j,.L1st .L1st_skip: adds $lo0,$alo,$hi0 sub $ap,$ap,$num // rewind $ap adc $hi0,$ahi,xzr adds $lo1,$nlo,$hi1 sub $np,$np,$num // rewind $np adc $hi1,$nhi,xzr adds $lo1,$lo1,$lo0 sub $i,$num,#8 // i=num-1 adcs $hi1,$hi1,$hi0 adc $ovf,xzr,xzr // upmost overflow bit stp $lo1,$hi1,[$tp] .Louter: ldr $m0,[$bp],#8 // bp[i] ldp $hi0,$aj,[$ap],#16 ldr $tj,[sp] // tp[0] add $tp,sp,#8 mul $lo0,$hi0,$m0 // ap[0]*bp[i] sub $j,$num,#16 // j=num-2 umulh $hi0,$hi0,$m0 ldp $hi1,$nj,[$np],#16 mul $alo,$aj,$m0 // ap[1]*bp[i] adds $lo0,$lo0,$tj umulh $ahi,$aj,$m0 adc $hi0,$hi0,xzr mul $m1,$lo0,$n0 sub $i,$i,#8 // i-- // (*) mul $lo1,$hi1,$m1 // np[0]*m1 umulh $hi1,$hi1,$m1 mul $nlo,$nj,$m1 // np[1]*m1 // (*) adds $lo1,$lo1,$lo0 subs xzr,$lo0,#1 // (*) umulh $nhi,$nj,$m1 cbz $j,.Linner_skip .Linner: ldr $aj,[$ap],#8 adc $hi1,$hi1,xzr ldr $tj,[$tp],#8 // tp[j] adds $lo0,$alo,$hi0 sub $j,$j,#8 // j-- adc $hi0,$ahi,xzr adds $lo1,$nlo,$hi1 ldr $nj,[$np],#8 adc $hi1,$nhi,xzr mul $alo,$aj,$m0 // ap[j]*bp[i] adds $lo0,$lo0,$tj umulh $ahi,$aj,$m0 adc $hi0,$hi0,xzr mul $nlo,$nj,$m1 // np[j]*m1 adds $lo1,$lo1,$lo0 umulh $nhi,$nj,$m1 str $lo1,[$tp,#-16] // tp[j-1] cbnz $j,.Linner .Linner_skip: ldr $tj,[$tp],#8 // tp[j] adc $hi1,$hi1,xzr adds $lo0,$alo,$hi0 sub $ap,$ap,$num // rewind $ap adc $hi0,$ahi,xzr adds $lo1,$nlo,$hi1 sub $np,$np,$num // rewind $np adcs $hi1,$nhi,$ovf adc $ovf,xzr,xzr adds $lo0,$lo0,$tj adc $hi0,$hi0,xzr adds $lo1,$lo1,$lo0 adcs $hi1,$hi1,$hi0 adc $ovf,$ovf,xzr // upmost overflow bit stp $lo1,$hi1,[$tp,#-16] cbnz $i,.Louter // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr $tj,[sp] // tp[0] add $tp,sp,#8 ldr $nj,[$np],#8 // np[0] subs $j,$num,#8 // j=num-1 and clear borrow mov $ap,$rp .Lsub: sbcs $aj,$tj,$nj // tp[j]-np[j] ldr $tj,[$tp],#8 sub $j,$j,#8 // j-- ldr $nj,[$np],#8 str $aj,[$ap],#8 // rp[j]=tp[j]-np[j] cbnz $j,.Lsub sbcs $aj,$tj,$nj sbcs $ovf,$ovf,xzr // did it borrow? str $aj,[$ap],#8 // rp[num-1] ldr $tj,[sp] // tp[0] add $tp,sp,#8 ldr $aj,[$rp],#8 // rp[0] sub $num,$num,#8 // num-- nop .Lcond_copy: sub $num,$num,#8 // num-- csel $nj,$tj,$aj,lo // did it borrow? ldr $tj,[$tp],#8 ldr $aj,[$rp],#8 str xzr,[$tp,#-16] // wipe tp str $nj,[$rp,#-16] cbnz $num,.Lcond_copy csel $nj,$tj,$aj,lo str xzr,[$tp,#-8] // wipe tp str $nj,[$rp,#-8] ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldr x29,[sp],#64 ret .size GFp_bn_mul_mont,.-GFp_bn_mul_mont ___ { ######################################################################## # Following is ARMv8 adaptation of sqrx8x_mont from x86_64-mont5 module. my ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("x$_",(6..13)); my ($t0,$t1,$t2,$t3)=map("x$_",(14..17)); my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("x$_",(19..26)); my ($cnt,$carry,$topmost)=("x27","x28","x30"); my ($tp,$ap_end,$na0)=($bp,$np,$carry); $code.=<<___; .type __bn_sqr8x_mont,%function .align 5 __bn_sqr8x_mont: cmp $ap,$bp b.ne __bn_mul4x_mont .Lsqr8x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] stp $rp,$np,[sp,#96] // offload rp and np ldp $a0,$a1,[$ap,#8*0] ldp $a2,$a3,[$ap,#8*2] ldp $a4,$a5,[$ap,#8*4] ldp $a6,$a7,[$ap,#8*6] sub $tp,sp,$num,lsl#4 lsl $num,$num,#3 ldr $n0,[$n0] // *n0 mov sp,$tp // alloca sub $cnt,$num,#8*8 b .Lsqr8x_zero_start .Lsqr8x_zero: sub $cnt,$cnt,#8*8 stp xzr,xzr,[$tp,#8*0] stp xzr,xzr,[$tp,#8*2] stp xzr,xzr,[$tp,#8*4] stp xzr,xzr,[$tp,#8*6] .Lsqr8x_zero_start: stp xzr,xzr,[$tp,#8*8] stp xzr,xzr,[$tp,#8*10] stp xzr,xzr,[$tp,#8*12] stp xzr,xzr,[$tp,#8*14] add $tp,$tp,#8*16 cbnz $cnt,.Lsqr8x_zero add $ap_end,$ap,$num add $ap,$ap,#8*8 mov $acc0,xzr mov $acc1,xzr mov $acc2,xzr mov $acc3,xzr mov $acc4,xzr mov $acc5,xzr mov $acc6,xzr mov $acc7,xzr mov $tp,sp str $n0,[x29,#112] // offload n0 // Multiply everything but a[i]*a[i] .align 4 .Lsqr8x_outer_loop: // a[1]a[0] (i) // a[2]a[0] // a[3]a[0] // a[4]a[0] // a[5]a[0] // a[6]a[0] // a[7]a[0] // a[2]a[1] (ii) // a[3]a[1] // a[4]a[1] // a[5]a[1] // a[6]a[1] // a[7]a[1] // a[3]a[2] (iii) // a[4]a[2] // a[5]a[2] // a[6]a[2] // a[7]a[2] // a[4]a[3] (iv) // a[5]a[3] // a[6]a[3] // a[7]a[3] // a[5]a[4] (v) // a[6]a[4] // a[7]a[4] // a[6]a[5] (vi) // a[7]a[5] // a[7]a[6] (vii) mul $t0,$a1,$a0 // lo(a[1..7]*a[0]) (i) mul $t1,$a2,$a0 mul $t2,$a3,$a0 mul $t3,$a4,$a0 adds $acc1,$acc1,$t0 // t[1]+lo(a[1]*a[0]) mul $t0,$a5,$a0 adcs $acc2,$acc2,$t1 mul $t1,$a6,$a0 adcs $acc3,$acc3,$t2 mul $t2,$a7,$a0 adcs $acc4,$acc4,$t3 umulh $t3,$a1,$a0 // hi(a[1..7]*a[0]) adcs $acc5,$acc5,$t0 umulh $t0,$a2,$a0 adcs $acc6,$acc6,$t1 umulh $t1,$a3,$a0 adcs $acc7,$acc7,$t2 umulh $t2,$a4,$a0 stp $acc0,$acc1,[$tp],#8*2 // t[0..1] adc $acc0,xzr,xzr // t[8] adds $acc2,$acc2,$t3 // t[2]+lo(a[1]*a[0]) umulh $t3,$a5,$a0 adcs $acc3,$acc3,$t0 umulh $t0,$a6,$a0 adcs $acc4,$acc4,$t1 umulh $t1,$a7,$a0 adcs $acc5,$acc5,$t2 mul $t2,$a2,$a1 // lo(a[2..7]*a[1]) (ii) adcs $acc6,$acc6,$t3 mul $t3,$a3,$a1 adcs $acc7,$acc7,$t0 mul $t0,$a4,$a1 adc $acc0,$acc0,$t1 mul $t1,$a5,$a1 adds $acc3,$acc3,$t2 mul $t2,$a6,$a1 adcs $acc4,$acc4,$t3 mul $t3,$a7,$a1 adcs $acc5,$acc5,$t0 umulh $t0,$a2,$a1 // hi(a[2..7]*a[1]) adcs $acc6,$acc6,$t1 umulh $t1,$a3,$a1 adcs $acc7,$acc7,$t2 umulh $t2,$a4,$a1 adcs $acc0,$acc0,$t3 umulh $t3,$a5,$a1 stp $acc2,$acc3,[$tp],#8*2 // t[2..3] adc $acc1,xzr,xzr // t[9] adds $acc4,$acc4,$t0 umulh $t0,$a6,$a1 adcs $acc5,$acc5,$t1 umulh $t1,$a7,$a1 adcs $acc6,$acc6,$t2 mul $t2,$a3,$a2 // lo(a[3..7]*a[2]) (iii) adcs $acc7,$acc7,$t3 mul $t3,$a4,$a2 adcs $acc0,$acc0,$t0 mul $t0,$a5,$a2 adc $acc1,$acc1,$t1 mul $t1,$a6,$a2 adds $acc5,$acc5,$t2 mul $t2,$a7,$a2 adcs $acc6,$acc6,$t3 umulh $t3,$a3,$a2 // hi(a[3..7]*a[2]) adcs $acc7,$acc7,$t0 umulh $t0,$a4,$a2 adcs $acc0,$acc0,$t1 umulh $t1,$a5,$a2 adcs $acc1,$acc1,$t2 umulh $t2,$a6,$a2 stp $acc4,$acc5,[$tp],#8*2 // t[4..5] adc $acc2,xzr,xzr // t[10] adds $acc6,$acc6,$t3 umulh $t3,$a7,$a2 adcs $acc7,$acc7,$t0 mul $t0,$a4,$a3 // lo(a[4..7]*a[3]) (iv) adcs $acc0,$acc0,$t1 mul $t1,$a5,$a3 adcs $acc1,$acc1,$t2 mul $t2,$a6,$a3 adc $acc2,$acc2,$t3 mul $t3,$a7,$a3 adds $acc7,$acc7,$t0 umulh $t0,$a4,$a3 // hi(a[4..7]*a[3]) adcs $acc0,$acc0,$t1 umulh $t1,$a5,$a3 adcs $acc1,$acc1,$t2 umulh $t2,$a6,$a3 adcs $acc2,$acc2,$t3 umulh $t3,$a7,$a3 stp $acc6,$acc7,[$tp],#8*2 // t[6..7] adc $acc3,xzr,xzr // t[11] adds $acc0,$acc0,$t0 mul $t0,$a5,$a4 // lo(a[5..7]*a[4]) (v) adcs $acc1,$acc1,$t1 mul $t1,$a6,$a4 adcs $acc2,$acc2,$t2 mul $t2,$a7,$a4 adc $acc3,$acc3,$t3 umulh $t3,$a5,$a4 // hi(a[5..7]*a[4]) adds $acc1,$acc1,$t0 umulh $t0,$a6,$a4 adcs $acc2,$acc2,$t1 umulh $t1,$a7,$a4 adcs $acc3,$acc3,$t2 mul $t2,$a6,$a5 // lo(a[6..7]*a[5]) (vi) adc $acc4,xzr,xzr // t[12] adds $acc2,$acc2,$t3 mul $t3,$a7,$a5 adcs $acc3,$acc3,$t0 umulh $t0,$a6,$a5 // hi(a[6..7]*a[5]) adc $acc4,$acc4,$t1 umulh $t1,$a7,$a5 adds $acc3,$acc3,$t2 mul $t2,$a7,$a6 // lo(a[7]*a[6]) (vii) adcs $acc4,$acc4,$t3 umulh $t3,$a7,$a6 // hi(a[7]*a[6]) adc $acc5,xzr,xzr // t[13] adds $acc4,$acc4,$t0 sub $cnt,$ap_end,$ap // done yet? adc $acc5,$acc5,$t1 adds $acc5,$acc5,$t2 sub $t0,$ap_end,$num // rewinded ap adc $acc6,xzr,xzr // t[14] add $acc6,$acc6,$t3 cbz $cnt,.Lsqr8x_outer_break mov $n0,$a0 ldp $a0,$a1,[$tp,#8*0] ldp $a2,$a3,[$tp,#8*2] ldp $a4,$a5,[$tp,#8*4] ldp $a6,$a7,[$tp,#8*6] adds $acc0,$acc0,$a0 adcs $acc1,$acc1,$a1 ldp $a0,$a1,[$ap,#8*0] adcs $acc2,$acc2,$a2 adcs $acc3,$acc3,$a3 ldp $a2,$a3,[$ap,#8*2] adcs $acc4,$acc4,$a4 adcs $acc5,$acc5,$a5 ldp $a4,$a5,[$ap,#8*4] adcs $acc6,$acc6,$a6 mov $rp,$ap adcs $acc7,xzr,$a7 ldp $a6,$a7,[$ap,#8*6] add $ap,$ap,#8*8 //adc $carry,xzr,xzr // moved below mov $cnt,#-8*8 // a[8]a[0] // a[9]a[0] // a[a]a[0] // a[b]a[0] // a[c]a[0] // a[d]a[0] // a[e]a[0] // a[f]a[0] // a[8]a[1] // a[f]a[1]........................ // a[8]a[2] // a[f]a[2]........................ // a[8]a[3] // a[f]a[3]........................ // a[8]a[4] // a[f]a[4]........................ // a[8]a[5] // a[f]a[5]........................ // a[8]a[6] // a[f]a[6]........................ // a[8]a[7] // a[f]a[7]........................ .Lsqr8x_mul: mul $t0,$a0,$n0 adc $carry,xzr,xzr // carry bit, modulo-scheduled mul $t1,$a1,$n0 add $cnt,$cnt,#8 mul $t2,$a2,$n0 mul $t3,$a3,$n0 adds $acc0,$acc0,$t0 mul $t0,$a4,$n0 adcs $acc1,$acc1,$t1 mul $t1,$a5,$n0 adcs $acc2,$acc2,$t2 mul $t2,$a6,$n0 adcs $acc3,$acc3,$t3 mul $t3,$a7,$n0 adcs $acc4,$acc4,$t0 umulh $t0,$a0,$n0 adcs $acc5,$acc5,$t1 umulh $t1,$a1,$n0 adcs $acc6,$acc6,$t2 umulh $t2,$a2,$n0 adcs $acc7,$acc7,$t3 umulh $t3,$a3,$n0 adc $carry,$carry,xzr str $acc0,[$tp],#8 adds $acc0,$acc1,$t0 umulh $t0,$a4,$n0 adcs $acc1,$acc2,$t1 umulh $t1,$a5,$n0 adcs $acc2,$acc3,$t2 umulh $t2,$a6,$n0 adcs $acc3,$acc4,$t3 umulh $t3,$a7,$n0 ldr $n0,[$rp,$cnt] adcs $acc4,$acc5,$t0 adcs $acc5,$acc6,$t1 adcs $acc6,$acc7,$t2 adcs $acc7,$carry,$t3 //adc $carry,xzr,xzr // moved above cbnz $cnt,.Lsqr8x_mul // note that carry flag is guaranteed // to be zero at this point cmp $ap,$ap_end // done yet? b.eq .Lsqr8x_break ldp $a0,$a1,[$tp,#8*0] ldp $a2,$a3,[$tp,#8*2] ldp $a4,$a5,[$tp,#8*4] ldp $a6,$a7,[$tp,#8*6] adds $acc0,$acc0,$a0 ldr $n0,[$rp,#-8*8] adcs $acc1,$acc1,$a1 ldp $a0,$a1,[$ap,#8*0] adcs $acc2,$acc2,$a2 adcs $acc3,$acc3,$a3 ldp $a2,$a3,[$ap,#8*2] adcs $acc4,$acc4,$a4 adcs $acc5,$acc5,$a5 ldp $a4,$a5,[$ap,#8*4] adcs $acc6,$acc6,$a6 mov $cnt,#-8*8 adcs $acc7,$acc7,$a7 ldp $a6,$a7,[$ap,#8*6] add $ap,$ap,#8*8 //adc $carry,xzr,xzr // moved above b .Lsqr8x_mul .align 4 .Lsqr8x_break: ldp $a0,$a1,[$rp,#8*0] add $ap,$rp,#8*8 ldp $a2,$a3,[$rp,#8*2] sub $t0,$ap_end,$ap // is it last iteration? ldp $a4,$a5,[$rp,#8*4] sub $t1,$tp,$t0 ldp $a6,$a7,[$rp,#8*6] cbz $t0,.Lsqr8x_outer_loop stp $acc0,$acc1,[$tp,#8*0] ldp $acc0,$acc1,[$t1,#8*0] stp $acc2,$acc3,[$tp,#8*2] ldp $acc2,$acc3,[$t1,#8*2] stp $acc4,$acc5,[$tp,#8*4] ldp $acc4,$acc5,[$t1,#8*4] stp $acc6,$acc7,[$tp,#8*6] mov $tp,$t1 ldp $acc6,$acc7,[$t1,#8*6] b .Lsqr8x_outer_loop .align 4 .Lsqr8x_outer_break: // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] ldp $a1,$a3,[$t0,#8*0] // recall that $t0 is &a[0] ldp $t1,$t2,[sp,#8*1] ldp $a5,$a7,[$t0,#8*2] add $ap,$t0,#8*4 ldp $t3,$t0,[sp,#8*3] stp $acc0,$acc1,[$tp,#8*0] mul $acc0,$a1,$a1 stp $acc2,$acc3,[$tp,#8*2] umulh $a1,$a1,$a1 stp $acc4,$acc5,[$tp,#8*4] mul $a2,$a3,$a3 stp $acc6,$acc7,[$tp,#8*6] mov $tp,sp umulh $a3,$a3,$a3 adds $acc1,$a1,$t1,lsl#1 extr $t1,$t2,$t1,#63 sub $cnt,$num,#8*4 .Lsqr4x_shift_n_add: adcs $acc2,$a2,$t1 extr $t2,$t3,$t2,#63 sub $cnt,$cnt,#8*4 adcs $acc3,$a3,$t2 ldp $t1,$t2,[$tp,#8*5] mul $a4,$a5,$a5 ldp $a1,$a3,[$ap],#8*2 umulh $a5,$a5,$a5 mul $a6,$a7,$a7 umulh $a7,$a7,$a7 extr $t3,$t0,$t3,#63 stp $acc0,$acc1,[$tp,#8*0] adcs $acc4,$a4,$t3 extr $t0,$t1,$t0,#63 stp $acc2,$acc3,[$tp,#8*2] adcs $acc5,$a5,$t0 ldp $t3,$t0,[$tp,#8*7] extr $t1,$t2,$t1,#63 adcs $acc6,$a6,$t1 extr $t2,$t3,$t2,#63 adcs $acc7,$a7,$t2 ldp $t1,$t2,[$tp,#8*9] mul $a0,$a1,$a1 ldp $a5,$a7,[$ap],#8*2 umulh $a1,$a1,$a1 mul $a2,$a3,$a3 umulh $a3,$a3,$a3 stp $acc4,$acc5,[$tp,#8*4] extr $t3,$t0,$t3,#63 stp $acc6,$acc7,[$tp,#8*6] add $tp,$tp,#8*8 adcs $acc0,$a0,$t3 extr $t0,$t1,$t0,#63 adcs $acc1,$a1,$t0 ldp $t3,$t0,[$tp,#8*3] extr $t1,$t2,$t1,#63 cbnz $cnt,.Lsqr4x_shift_n_add ___ my ($np,$np_end)=($ap,$ap_end); $code.=<<___; ldp $np,$n0,[x29,#104] // pull np and n0 adcs $acc2,$a2,$t1 extr $t2,$t3,$t2,#63 adcs $acc3,$a3,$t2 ldp $t1,$t2,[$tp,#8*5] mul $a4,$a5,$a5 umulh $a5,$a5,$a5 stp $acc0,$acc1,[$tp,#8*0] mul $a6,$a7,$a7 umulh $a7,$a7,$a7 stp $acc2,$acc3,[$tp,#8*2] extr $t3,$t0,$t3,#63 adcs $acc4,$a4,$t3 extr $t0,$t1,$t0,#63 ldp $acc0,$acc1,[sp,#8*0] adcs $acc5,$a5,$t0 extr $t1,$t2,$t1,#63 ldp $a0,$a1,[$np,#8*0] adcs $acc6,$a6,$t1 extr $t2,xzr,$t2,#63 ldp $a2,$a3,[$np,#8*2] adc $acc7,$a7,$t2 ldp $a4,$a5,[$np,#8*4] // Reduce by 512 bits per iteration mul $na0,$n0,$acc0 // t[0]*n0 ldp $a6,$a7,[$np,#8*6] add $np_end,$np,$num ldp $acc2,$acc3,[sp,#8*2] stp $acc4,$acc5,[$tp,#8*4] ldp $acc4,$acc5,[sp,#8*4] stp $acc6,$acc7,[$tp,#8*6] ldp $acc6,$acc7,[sp,#8*6] add $np,$np,#8*8 mov $topmost,xzr // initial top-most carry mov $tp,sp mov $cnt,#8 .Lsqr8x_reduction: // (*) mul $t0,$a0,$na0 // lo(n[0-7])*lo(t[0]*n0) mul $t1,$a1,$na0 sub $cnt,$cnt,#1 mul $t2,$a2,$na0 str $na0,[$tp],#8 // put aside t[0]*n0 for tail processing mul $t3,$a3,$na0 // (*) adds xzr,$acc0,$t0 subs xzr,$acc0,#1 // (*) mul $t0,$a4,$na0 adcs $acc0,$acc1,$t1 mul $t1,$a5,$na0 adcs $acc1,$acc2,$t2 mul $t2,$a6,$na0 adcs $acc2,$acc3,$t3 mul $t3,$a7,$na0 adcs $acc3,$acc4,$t0 umulh $t0,$a0,$na0 // hi(n[0-7])*lo(t[0]*n0) adcs $acc4,$acc5,$t1 umulh $t1,$a1,$na0 adcs $acc5,$acc6,$t2 umulh $t2,$a2,$na0 adcs $acc6,$acc7,$t3 umulh $t3,$a3,$na0 adc $acc7,xzr,xzr adds $acc0,$acc0,$t0 umulh $t0,$a4,$na0 adcs $acc1,$acc1,$t1 umulh $t1,$a5,$na0 adcs $acc2,$acc2,$t2 umulh $t2,$a6,$na0 adcs $acc3,$acc3,$t3 umulh $t3,$a7,$na0 mul $na0,$n0,$acc0 // next t[0]*n0 adcs $acc4,$acc4,$t0 adcs $acc5,$acc5,$t1 adcs $acc6,$acc6,$t2 adc $acc7,$acc7,$t3 cbnz $cnt,.Lsqr8x_reduction ldp $t0,$t1,[$tp,#8*0] ldp $t2,$t3,[$tp,#8*2] mov $rp,$tp sub $cnt,$np_end,$np // done yet? adds $acc0,$acc0,$t0 adcs $acc1,$acc1,$t1 ldp $t0,$t1,[$tp,#8*4] adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 ldp $t2,$t3,[$tp,#8*6] adcs $acc4,$acc4,$t0 adcs $acc5,$acc5,$t1 adcs $acc6,$acc6,$t2 adcs $acc7,$acc7,$t3 //adc $carry,xzr,xzr // moved below cbz $cnt,.Lsqr8x8_post_condition ldr $n0,[$tp,#-8*8] ldp $a0,$a1,[$np,#8*0] ldp $a2,$a3,[$np,#8*2] ldp $a4,$a5,[$np,#8*4] mov $cnt,#-8*8 ldp $a6,$a7,[$np,#8*6] add $np,$np,#8*8 .Lsqr8x_tail: mul $t0,$a0,$n0 adc $carry,xzr,xzr // carry bit, modulo-scheduled mul $t1,$a1,$n0 add $cnt,$cnt,#8 mul $t2,$a2,$n0 mul $t3,$a3,$n0 adds $acc0,$acc0,$t0 mul $t0,$a4,$n0 adcs $acc1,$acc1,$t1 mul $t1,$a5,$n0 adcs $acc2,$acc2,$t2 mul $t2,$a6,$n0 adcs $acc3,$acc3,$t3 mul $t3,$a7,$n0 adcs $acc4,$acc4,$t0 umulh $t0,$a0,$n0 adcs $acc5,$acc5,$t1 umulh $t1,$a1,$n0 adcs $acc6,$acc6,$t2 umulh $t2,$a2,$n0 adcs $acc7,$acc7,$t3 umulh $t3,$a3,$n0 adc $carry,$carry,xzr str $acc0,[$tp],#8 adds $acc0,$acc1,$t0 umulh $t0,$a4,$n0 adcs $acc1,$acc2,$t1 umulh $t1,$a5,$n0 adcs $acc2,$acc3,$t2 umulh $t2,$a6,$n0 adcs $acc3,$acc4,$t3 umulh $t3,$a7,$n0 ldr $n0,[$rp,$cnt] adcs $acc4,$acc5,$t0 adcs $acc5,$acc6,$t1 adcs $acc6,$acc7,$t2 adcs $acc7,$carry,$t3 //adc $carry,xzr,xzr // moved above cbnz $cnt,.Lsqr8x_tail // note that carry flag is guaranteed // to be zero at this point ldp $a0,$a1,[$tp,#8*0] sub $cnt,$np_end,$np // done yet? sub $t2,$np_end,$num // rewinded np ldp $a2,$a3,[$tp,#8*2] ldp $a4,$a5,[$tp,#8*4] ldp $a6,$a7,[$tp,#8*6] cbz $cnt,.Lsqr8x_tail_break ldr $n0,[$rp,#-8*8] adds $acc0,$acc0,$a0 adcs $acc1,$acc1,$a1 ldp $a0,$a1,[$np,#8*0] adcs $acc2,$acc2,$a2 adcs $acc3,$acc3,$a3 ldp $a2,$a3,[$np,#8*2] adcs $acc4,$acc4,$a4 adcs $acc5,$acc5,$a5 ldp $a4,$a5,[$np,#8*4] adcs $acc6,$acc6,$a6 mov $cnt,#-8*8 adcs $acc7,$acc7,$a7 ldp $a6,$a7,[$np,#8*6] add $np,$np,#8*8 //adc $carry,xzr,xzr // moved above b .Lsqr8x_tail .align 4 .Lsqr8x_tail_break: ldr $n0,[x29,#112] // pull n0 add $cnt,$tp,#8*8 // end of current t[num] window subs xzr,$topmost,#1 // "move" top-most carry to carry bit adcs $t0,$acc0,$a0 adcs $t1,$acc1,$a1 ldp $acc0,$acc1,[$rp,#8*0] adcs $acc2,$acc2,$a2 ldp $a0,$a1,[$t2,#8*0] // recall that $t2 is &n[0] adcs $acc3,$acc3,$a3 ldp $a2,$a3,[$t2,#8*2] adcs $acc4,$acc4,$a4 adcs $acc5,$acc5,$a5 ldp $a4,$a5,[$t2,#8*4] adcs $acc6,$acc6,$a6 adcs $acc7,$acc7,$a7 ldp $a6,$a7,[$t2,#8*6] add $np,$t2,#8*8 adc $topmost,xzr,xzr // top-most carry mul $na0,$n0,$acc0 stp $t0,$t1,[$tp,#8*0] stp $acc2,$acc3,[$tp,#8*2] ldp $acc2,$acc3,[$rp,#8*2] stp $acc4,$acc5,[$tp,#8*4] ldp $acc4,$acc5,[$rp,#8*4] cmp $cnt,x29 // did we hit the bottom? stp $acc6,$acc7,[$tp,#8*6] mov $tp,$rp // slide the window ldp $acc6,$acc7,[$rp,#8*6] mov $cnt,#8 b.ne .Lsqr8x_reduction // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr $rp,[x29,#96] // pull rp add $tp,$tp,#8*8 subs $t0,$acc0,$a0 sbcs $t1,$acc1,$a1 sub $cnt,$num,#8*8 mov $ap_end,$rp // $rp copy .Lsqr8x_sub: sbcs $t2,$acc2,$a2 ldp $a0,$a1,[$np,#8*0] sbcs $t3,$acc3,$a3 stp $t0,$t1,[$rp,#8*0] sbcs $t0,$acc4,$a4 ldp $a2,$a3,[$np,#8*2] sbcs $t1,$acc5,$a5 stp $t2,$t3,[$rp,#8*2] sbcs $t2,$acc6,$a6 ldp $a4,$a5,[$np,#8*4] sbcs $t3,$acc7,$a7 ldp $a6,$a7,[$np,#8*6] add $np,$np,#8*8 ldp $acc0,$acc1,[$tp,#8*0] sub $cnt,$cnt,#8*8 ldp $acc2,$acc3,[$tp,#8*2] ldp $acc4,$acc5,[$tp,#8*4] ldp $acc6,$acc7,[$tp,#8*6] add $tp,$tp,#8*8 stp $t0,$t1,[$rp,#8*4] sbcs $t0,$acc0,$a0 stp $t2,$t3,[$rp,#8*6] add $rp,$rp,#8*8 sbcs $t1,$acc1,$a1 cbnz $cnt,.Lsqr8x_sub sbcs $t2,$acc2,$a2 mov $tp,sp add $ap,sp,$num ldp $a0,$a1,[$ap_end,#8*0] sbcs $t3,$acc3,$a3 stp $t0,$t1,[$rp,#8*0] sbcs $t0,$acc4,$a4 ldp $a2,$a3,[$ap_end,#8*2] sbcs $t1,$acc5,$a5 stp $t2,$t3,[$rp,#8*2] sbcs $t2,$acc6,$a6 ldp $acc0,$acc1,[$ap,#8*0] sbcs $t3,$acc7,$a7 ldp $acc2,$acc3,[$ap,#8*2] sbcs xzr,$topmost,xzr // did it borrow? ldr x30,[x29,#8] // pull return address stp $t0,$t1,[$rp,#8*4] stp $t2,$t3,[$rp,#8*6] sub $cnt,$num,#8*4 .Lsqr4x_cond_copy: sub $cnt,$cnt,#8*4 csel $t0,$acc0,$a0,lo stp xzr,xzr,[$tp,#8*0] csel $t1,$acc1,$a1,lo ldp $a0,$a1,[$ap_end,#8*4] ldp $acc0,$acc1,[$ap,#8*4] csel $t2,$acc2,$a2,lo stp xzr,xzr,[$tp,#8*2] add $tp,$tp,#8*4 csel $t3,$acc3,$a3,lo ldp $a2,$a3,[$ap_end,#8*6] ldp $acc2,$acc3,[$ap,#8*6] add $ap,$ap,#8*4 stp $t0,$t1,[$ap_end,#8*0] stp $t2,$t3,[$ap_end,#8*2] add $ap_end,$ap_end,#8*4 stp xzr,xzr,[$ap,#8*0] stp xzr,xzr,[$ap,#8*2] cbnz $cnt,.Lsqr4x_cond_copy csel $t0,$acc0,$a0,lo stp xzr,xzr,[$tp,#8*0] csel $t1,$acc1,$a1,lo stp xzr,xzr,[$tp,#8*2] csel $t2,$acc2,$a2,lo csel $t3,$acc3,$a3,lo stp $t0,$t1,[$ap_end,#8*0] stp $t2,$t3,[$ap_end,#8*2] b .Lsqr8x_done .align 4 .Lsqr8x8_post_condition: adc $carry,xzr,xzr ldr x30,[x29,#8] // pull return address // $acc0-7,$carry hold result, $a0-7 hold modulus subs $a0,$acc0,$a0 ldr $ap,[x29,#96] // pull rp sbcs $a1,$acc1,$a1 stp xzr,xzr,[sp,#8*0] sbcs $a2,$acc2,$a2 stp xzr,xzr,[sp,#8*2] sbcs $a3,$acc3,$a3 stp xzr,xzr,[sp,#8*4] sbcs $a4,$acc4,$a4 stp xzr,xzr,[sp,#8*6] sbcs $a5,$acc5,$a5 stp xzr,xzr,[sp,#8*8] sbcs $a6,$acc6,$a6 stp xzr,xzr,[sp,#8*10] sbcs $a7,$acc7,$a7 stp xzr,xzr,[sp,#8*12] sbcs $carry,$carry,xzr // did it borrow? stp xzr,xzr,[sp,#8*14] // $a0-7 hold result-modulus csel $a0,$acc0,$a0,lo csel $a1,$acc1,$a1,lo csel $a2,$acc2,$a2,lo csel $a3,$acc3,$a3,lo stp $a0,$a1,[$ap,#8*0] csel $a4,$acc4,$a4,lo csel $a5,$acc5,$a5,lo stp $a2,$a3,[$ap,#8*2] csel $a6,$acc6,$a6,lo csel $a7,$acc7,$a7,lo stp $a4,$a5,[$ap,#8*4] stp $a6,$a7,[$ap,#8*6] .Lsqr8x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .size __bn_sqr8x_mont,.-__bn_sqr8x_mont ___ } { ######################################################################## # Even though this might look as ARMv8 adaptation of mulx4x_mont from # x86_64-mont5 module, it's different in sense that it performs # reduction 256 bits at a time. my ($a0,$a1,$a2,$a3, $t0,$t1,$t2,$t3, $m0,$m1,$m2,$m3, $acc0,$acc1,$acc2,$acc3,$acc4, $bi,$mi,$tp,$ap_end,$cnt) = map("x$_",(6..17,19..28)); my $bp_end=$rp; my ($carry,$topmost) = ($rp,"x30"); $code.=<<___; .type __bn_mul4x_mont,%function .align 5 __bn_mul4x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub $tp,sp,$num,lsl#3 lsl $num,$num,#3 ldr $n0,[$n0] // *n0 sub sp,$tp,#8*4 // alloca add $t0,$bp,$num add $ap_end,$ap,$num stp $rp,$t0,[x29,#96] // offload rp and &b[num] ldr $bi,[$bp,#8*0] // b[0] ldp $a0,$a1,[$ap,#8*0] // a[0..3] ldp $a2,$a3,[$ap,#8*2] add $ap,$ap,#8*4 mov $acc0,xzr mov $acc1,xzr mov $acc2,xzr mov $acc3,xzr ldp $m0,$m1,[$np,#8*0] // n[0..3] ldp $m2,$m3,[$np,#8*2] adds $np,$np,#8*4 // clear carry bit mov $carry,xzr mov $cnt,#0 mov $tp,sp .Loop_mul4x_1st_reduction: mul $t0,$a0,$bi // lo(a[0..3]*b[0]) adc $carry,$carry,xzr // modulo-scheduled mul $t1,$a1,$bi add $cnt,$cnt,#8 mul $t2,$a2,$bi and $cnt,$cnt,#31 mul $t3,$a3,$bi adds $acc0,$acc0,$t0 umulh $t0,$a0,$bi // hi(a[0..3]*b[0]) adcs $acc1,$acc1,$t1 mul $mi,$acc0,$n0 // t[0]*n0 adcs $acc2,$acc2,$t2 umulh $t1,$a1,$bi adcs $acc3,$acc3,$t3 umulh $t2,$a2,$bi adc $acc4,xzr,xzr umulh $t3,$a3,$bi ldr $bi,[$bp,$cnt] // next b[i] (or b[0]) adds $acc1,$acc1,$t0 // (*) mul $t0,$m0,$mi // lo(n[0..3]*t[0]*n0) str $mi,[$tp],#8 // put aside t[0]*n0 for tail processing adcs $acc2,$acc2,$t1 mul $t1,$m1,$mi adcs $acc3,$acc3,$t2 mul $t2,$m2,$mi adc $acc4,$acc4,$t3 // can't overflow mul $t3,$m3,$mi // (*) adds xzr,$acc0,$t0 subs xzr,$acc0,#1 // (*) umulh $t0,$m0,$mi // hi(n[0..3]*t[0]*n0) adcs $acc0,$acc1,$t1 umulh $t1,$m1,$mi adcs $acc1,$acc2,$t2 umulh $t2,$m2,$mi adcs $acc2,$acc3,$t3 umulh $t3,$m3,$mi adcs $acc3,$acc4,$carry adc $carry,xzr,xzr adds $acc0,$acc0,$t0 sub $t0,$ap_end,$ap adcs $acc1,$acc1,$t1 adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_1st_reduction cbz $t0,.Lmul4x4_post_condition ldp $a0,$a1,[$ap,#8*0] // a[4..7] ldp $a2,$a3,[$ap,#8*2] add $ap,$ap,#8*4 ldr $mi,[sp] // a[0]*n0 ldp $m0,$m1,[$np,#8*0] // n[4..7] ldp $m2,$m3,[$np,#8*2] add $np,$np,#8*4 .Loop_mul4x_1st_tail: mul $t0,$a0,$bi // lo(a[4..7]*b[i]) adc $carry,$carry,xzr // modulo-scheduled mul $t1,$a1,$bi add $cnt,$cnt,#8 mul $t2,$a2,$bi and $cnt,$cnt,#31 mul $t3,$a3,$bi adds $acc0,$acc0,$t0 umulh $t0,$a0,$bi // hi(a[4..7]*b[i]) adcs $acc1,$acc1,$t1 umulh $t1,$a1,$bi adcs $acc2,$acc2,$t2 umulh $t2,$a2,$bi adcs $acc3,$acc3,$t3 umulh $t3,$a3,$bi adc $acc4,xzr,xzr ldr $bi,[$bp,$cnt] // next b[i] (or b[0]) adds $acc1,$acc1,$t0 mul $t0,$m0,$mi // lo(n[4..7]*a[0]*n0) adcs $acc2,$acc2,$t1 mul $t1,$m1,$mi adcs $acc3,$acc3,$t2 mul $t2,$m2,$mi adc $acc4,$acc4,$t3 // can't overflow mul $t3,$m3,$mi adds $acc0,$acc0,$t0 umulh $t0,$m0,$mi // hi(n[4..7]*a[0]*n0) adcs $acc1,$acc1,$t1 umulh $t1,$m1,$mi adcs $acc2,$acc2,$t2 umulh $t2,$m2,$mi adcs $acc3,$acc3,$t3 adcs $acc4,$acc4,$carry umulh $t3,$m3,$mi adc $carry,xzr,xzr ldr $mi,[sp,$cnt] // next t[0]*n0 str $acc0,[$tp],#8 // result!!! adds $acc0,$acc1,$t0 sub $t0,$ap_end,$ap // done yet? adcs $acc1,$acc2,$t1 adcs $acc2,$acc3,$t2 adcs $acc3,$acc4,$t3 //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_1st_tail sub $t1,$ap_end,$num // rewinded $ap cbz $t0,.Lmul4x_proceed ldp $a0,$a1,[$ap,#8*0] ldp $a2,$a3,[$ap,#8*2] add $ap,$ap,#8*4 ldp $m0,$m1,[$np,#8*0] ldp $m2,$m3,[$np,#8*2] add $np,$np,#8*4 b .Loop_mul4x_1st_tail .align 5 .Lmul4x_proceed: ldr $bi,[$bp,#8*4]! // *++b adc $topmost,$carry,xzr ldp $a0,$a1,[$t1,#8*0] // a[0..3] sub $np,$np,$num // rewind np ldp $a2,$a3,[$t1,#8*2] add $ap,$t1,#8*4 stp $acc0,$acc1,[$tp,#8*0] // result!!! ldp $acc0,$acc1,[sp,#8*4] // t[0..3] stp $acc2,$acc3,[$tp,#8*2] // result!!! ldp $acc2,$acc3,[sp,#8*6] ldp $m0,$m1,[$np,#8*0] // n[0..3] mov $tp,sp ldp $m2,$m3,[$np,#8*2] adds $np,$np,#8*4 // clear carry bit mov $carry,xzr .align 4 .Loop_mul4x_reduction: mul $t0,$a0,$bi // lo(a[0..3]*b[4]) adc $carry,$carry,xzr // modulo-scheduled mul $t1,$a1,$bi add $cnt,$cnt,#8 mul $t2,$a2,$bi and $cnt,$cnt,#31 mul $t3,$a3,$bi adds $acc0,$acc0,$t0 umulh $t0,$a0,$bi // hi(a[0..3]*b[4]) adcs $acc1,$acc1,$t1 mul $mi,$acc0,$n0 // t[0]*n0 adcs $acc2,$acc2,$t2 umulh $t1,$a1,$bi adcs $acc3,$acc3,$t3 umulh $t2,$a2,$bi adc $acc4,xzr,xzr umulh $t3,$a3,$bi ldr $bi,[$bp,$cnt] // next b[i] adds $acc1,$acc1,$t0 // (*) mul $t0,$m0,$mi str $mi,[$tp],#8 // put aside t[0]*n0 for tail processing adcs $acc2,$acc2,$t1 mul $t1,$m1,$mi // lo(n[0..3]*t[0]*n0 adcs $acc3,$acc3,$t2 mul $t2,$m2,$mi adc $acc4,$acc4,$t3 // can't overflow mul $t3,$m3,$mi // (*) adds xzr,$acc0,$t0 subs xzr,$acc0,#1 // (*) umulh $t0,$m0,$mi // hi(n[0..3]*t[0]*n0 adcs $acc0,$acc1,$t1 umulh $t1,$m1,$mi adcs $acc1,$acc2,$t2 umulh $t2,$m2,$mi adcs $acc2,$acc3,$t3 umulh $t3,$m3,$mi adcs $acc3,$acc4,$carry adc $carry,xzr,xzr adds $acc0,$acc0,$t0 adcs $acc1,$acc1,$t1 adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_reduction adc $carry,$carry,xzr ldp $t0,$t1,[$tp,#8*4] // t[4..7] ldp $t2,$t3,[$tp,#8*6] ldp $a0,$a1,[$ap,#8*0] // a[4..7] ldp $a2,$a3,[$ap,#8*2] add $ap,$ap,#8*4 adds $acc0,$acc0,$t0 adcs $acc1,$acc1,$t1 adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 //adc $carry,$carry,xzr ldr $mi,[sp] // t[0]*n0 ldp $m0,$m1,[$np,#8*0] // n[4..7] ldp $m2,$m3,[$np,#8*2] add $np,$np,#8*4 .align 4 .Loop_mul4x_tail: mul $t0,$a0,$bi // lo(a[4..7]*b[4]) adc $carry,$carry,xzr // modulo-scheduled mul $t1,$a1,$bi add $cnt,$cnt,#8 mul $t2,$a2,$bi and $cnt,$cnt,#31 mul $t3,$a3,$bi adds $acc0,$acc0,$t0 umulh $t0,$a0,$bi // hi(a[4..7]*b[4]) adcs $acc1,$acc1,$t1 umulh $t1,$a1,$bi adcs $acc2,$acc2,$t2 umulh $t2,$a2,$bi adcs $acc3,$acc3,$t3 umulh $t3,$a3,$bi adc $acc4,xzr,xzr ldr $bi,[$bp,$cnt] // next b[i] adds $acc1,$acc1,$t0 mul $t0,$m0,$mi // lo(n[4..7]*t[0]*n0) adcs $acc2,$acc2,$t1 mul $t1,$m1,$mi adcs $acc3,$acc3,$t2 mul $t2,$m2,$mi adc $acc4,$acc4,$t3 // can't overflow mul $t3,$m3,$mi adds $acc0,$acc0,$t0 umulh $t0,$m0,$mi // hi(n[4..7]*t[0]*n0) adcs $acc1,$acc1,$t1 umulh $t1,$m1,$mi adcs $acc2,$acc2,$t2 umulh $t2,$m2,$mi adcs $acc3,$acc3,$t3 umulh $t3,$m3,$mi adcs $acc4,$acc4,$carry ldr $mi,[sp,$cnt] // next a[0]*n0 adc $carry,xzr,xzr str $acc0,[$tp],#8 // result!!! adds $acc0,$acc1,$t0 sub $t0,$ap_end,$ap // done yet? adcs $acc1,$acc2,$t1 adcs $acc2,$acc3,$t2 adcs $acc3,$acc4,$t3 //adc $carry,$carry,xzr cbnz $cnt,.Loop_mul4x_tail sub $t1,$np,$num // rewinded np? adc $carry,$carry,xzr cbz $t0,.Loop_mul4x_break ldp $t0,$t1,[$tp,#8*4] ldp $t2,$t3,[$tp,#8*6] ldp $a0,$a1,[$ap,#8*0] ldp $a2,$a3,[$ap,#8*2] add $ap,$ap,#8*4 adds $acc0,$acc0,$t0 adcs $acc1,$acc1,$t1 adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 //adc $carry,$carry,xzr ldp $m0,$m1,[$np,#8*0] ldp $m2,$m3,[$np,#8*2] add $np,$np,#8*4 b .Loop_mul4x_tail .align 4 .Loop_mul4x_break: ldp $t2,$t3,[x29,#96] // pull rp and &b[num] adds $acc0,$acc0,$topmost add $bp,$bp,#8*4 // bp++ adcs $acc1,$acc1,xzr sub $ap,$ap,$num // rewind ap adcs $acc2,$acc2,xzr stp $acc0,$acc1,[$tp,#8*0] // result!!! adcs $acc3,$acc3,xzr ldp $acc0,$acc1,[sp,#8*4] // t[0..3] adc $topmost,$carry,xzr stp $acc2,$acc3,[$tp,#8*2] // result!!! cmp $bp,$t3 // done yet? ldp $acc2,$acc3,[sp,#8*6] ldp $m0,$m1,[$t1,#8*0] // n[0..3] ldp $m2,$m3,[$t1,#8*2] add $np,$t1,#8*4 b.eq .Lmul4x_post ldr $bi,[$bp] ldp $a0,$a1,[$ap,#8*0] // a[0..3] ldp $a2,$a3,[$ap,#8*2] adds $ap,$ap,#8*4 // clear carry bit mov $carry,xzr mov $tp,sp b .Loop_mul4x_reduction .align 4 .Lmul4x_post: // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. mov $rp,$t2 mov $ap_end,$t2 // $rp copy subs $t0,$acc0,$m0 add $tp,sp,#8*8 sbcs $t1,$acc1,$m1 sub $cnt,$num,#8*4 .Lmul4x_sub: sbcs $t2,$acc2,$m2 ldp $m0,$m1,[$np,#8*0] sub $cnt,$cnt,#8*4 ldp $acc0,$acc1,[$tp,#8*0] sbcs $t3,$acc3,$m3 ldp $m2,$m3,[$np,#8*2] add $np,$np,#8*4 ldp $acc2,$acc3,[$tp,#8*2] add $tp,$tp,#8*4 stp $t0,$t1,[$rp,#8*0] sbcs $t0,$acc0,$m0 stp $t2,$t3,[$rp,#8*2] add $rp,$rp,#8*4 sbcs $t1,$acc1,$m1 cbnz $cnt,.Lmul4x_sub sbcs $t2,$acc2,$m2 mov $tp,sp add $ap,sp,#8*4 ldp $a0,$a1,[$ap_end,#8*0] sbcs $t3,$acc3,$m3 stp $t0,$t1,[$rp,#8*0] ldp $a2,$a3,[$ap_end,#8*2] stp $t2,$t3,[$rp,#8*2] ldp $acc0,$acc1,[$ap,#8*0] ldp $acc2,$acc3,[$ap,#8*2] sbcs xzr,$topmost,xzr // did it borrow? ldr x30,[x29,#8] // pull return address sub $cnt,$num,#8*4 .Lmul4x_cond_copy: sub $cnt,$cnt,#8*4 csel $t0,$acc0,$a0,lo stp xzr,xzr,[$tp,#8*0] csel $t1,$acc1,$a1,lo ldp $a0,$a1,[$ap_end,#8*4] ldp $acc0,$acc1,[$ap,#8*4] csel $t2,$acc2,$a2,lo stp xzr,xzr,[$tp,#8*2] add $tp,$tp,#8*4 csel $t3,$acc3,$a3,lo ldp $a2,$a3,[$ap_end,#8*6] ldp $acc2,$acc3,[$ap,#8*6] add $ap,$ap,#8*4 stp $t0,$t1,[$ap_end,#8*0] stp $t2,$t3,[$ap_end,#8*2] add $ap_end,$ap_end,#8*4 cbnz $cnt,.Lmul4x_cond_copy csel $t0,$acc0,$a0,lo stp xzr,xzr,[$tp,#8*0] csel $t1,$acc1,$a1,lo stp xzr,xzr,[$tp,#8*2] csel $t2,$acc2,$a2,lo stp xzr,xzr,[$tp,#8*3] csel $t3,$acc3,$a3,lo stp xzr,xzr,[$tp,#8*4] stp $t0,$t1,[$ap_end,#8*0] stp $t2,$t3,[$ap_end,#8*2] b .Lmul4x_done .align 4 .Lmul4x4_post_condition: adc $carry,$carry,xzr ldr $ap,[x29,#96] // pull rp // $acc0-3,$carry hold result, $m0-7 hold modulus subs $a0,$acc0,$m0 ldr x30,[x29,#8] // pull return address sbcs $a1,$acc1,$m1 stp xzr,xzr,[sp,#8*0] sbcs $a2,$acc2,$m2 stp xzr,xzr,[sp,#8*2] sbcs $a3,$acc3,$m3 stp xzr,xzr,[sp,#8*4] sbcs xzr,$carry,xzr // did it borrow? stp xzr,xzr,[sp,#8*6] // $a0-3 hold result-modulus csel $a0,$acc0,$a0,lo csel $a1,$acc1,$a1,lo csel $a2,$acc2,$a2,lo csel $a3,$acc3,$a3,lo stp $a0,$a1,[$ap,#8*0] stp $a2,$a3,[$ap,#8*2] .Lmul4x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .size __bn_mul4x_mont,.-__bn_mul4x_mont ___ } $code.=<<___; .asciz "Montgomery Multiplication for ARMv8, CRYPTOGAMS by " .align 4 ___ print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/asm/x86-mont.pl000064400000000000000000000227311352416253600175530ustar0000000000000000#! /usr/bin/env perl # Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # October 2005 # # This is a "teaser" code, as it can be improved in several ways... # First of all non-SSE2 path should be implemented (yes, for now it # performs Montgomery multiplication/convolution only on SSE2-capable # CPUs such as P4, others fall down to original code). Then inner loop # can be unrolled and modulo-scheduled to improve ILP and possibly # moved to 128-bit XMM register bank (though it would require input # rearrangement and/or increase bus bandwidth utilization). Dedicated # squaring procedure should give further performance improvement... # Yet, for being draft, the code improves rsa512 *sign* benchmark by # 110%(!), rsa1024 one - by 70% and rsa4096 - by 20%:-) # December 2006 # # Modulo-scheduling SSE2 loops results in further 15-20% improvement. # Integer-only code [being equipped with dedicated squaring procedure] # gives ~40% on rsa512 sign benchmark... $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output = pop; open STDOUT,">$output"; &asm_init($ARGV[0]); $sse2=0; for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &external_label("GFp_ia32cap_P") if ($sse2); &function_begin("GFp_bn_mul_mont"); $i="edx"; $j="ecx"; $ap="esi"; $tp="esi"; # overlapping variables!!! $rp="edi"; $bp="edi"; # overlapping variables!!! $np="ebp"; $num="ebx"; $_num=&DWP(4*0,"esp"); # stack top layout $_rp=&DWP(4*1,"esp"); $_ap=&DWP(4*2,"esp"); $_bp=&DWP(4*3,"esp"); $_np=&DWP(4*4,"esp"); $_n0=&DWP(4*5,"esp"); $_n0q=&QWP(4*5,"esp"); $_sp=&DWP(4*6,"esp"); $_bpend=&DWP(4*7,"esp"); $frame=32; # size of above frame rounded up to 16n &xor ("eax","eax"); &mov ("edi",&wparam(5)); # int num &lea ("esi",&wparam(0)); # put aside pointer to argument block &lea ("edx",&wparam(1)); # load ap &add ("edi",2); # extra two words on top of tp &neg ("edi"); &lea ("ebp",&DWP(-$frame,"esp","edi",4)); # future alloca($frame+4*(num+2)) &neg ("edi"); # minimize cache contention by arranging 2K window between stack # pointer and ap argument [np is also position sensitive vector, # but it's assumed to be near ap, as it's allocated at ~same # time]. &mov ("eax","ebp"); &sub ("eax","edx"); &and ("eax",2047); &sub ("ebp","eax"); # this aligns sp and ap modulo 2048 &xor ("edx","ebp"); &and ("edx",2048); &xor ("edx",2048); &sub ("ebp","edx"); # this splits them apart modulo 4096 &and ("ebp",-64); # align to cache line # An OS-agnostic version of __chkstk. # # Some OSes (Windows) insist on stack being "wired" to # physical memory in strictly sequential manner, i.e. if stack # allocation spans two pages, then reference to farmost one can # be punishable by SEGV. But page walking can do good even on # other OSes, because it guarantees that villain thread hits # the guard page before it can make damage to innocent one... &mov ("eax","esp"); &sub ("eax","ebp"); &and ("eax",-4096); &mov ("edx","esp"); # saved stack pointer! &lea ("esp",&DWP(0,"ebp","eax")); &mov ("eax",&DWP(0,"esp")); &cmp ("esp","ebp"); &ja (&label("page_walk")); &jmp (&label("page_walk_done")); &set_label("page_walk",16); &lea ("esp",&DWP(-4096,"esp")); &mov ("eax",&DWP(0,"esp")); &cmp ("esp","ebp"); &ja (&label("page_walk")); &set_label("page_walk_done"); ################################# load argument block... &mov ("eax",&DWP(0*4,"esi"));# BN_ULONG *rp &mov ("ebx",&DWP(1*4,"esi"));# const BN_ULONG *ap &mov ("ecx",&DWP(2*4,"esi"));# const BN_ULONG *bp &mov ("ebp",&DWP(3*4,"esi"));# const BN_ULONG *np &mov ("esi",&DWP(4*4,"esi"));# const BN_ULONG *n0 #&mov ("edi",&DWP(5*4,"esi"));# int num &mov ("esi",&DWP(0,"esi")); # pull n0[0] &mov ($_rp,"eax"); # ... save a copy of argument block &mov ($_ap,"ebx"); &mov ($_bp,"ecx"); &mov ($_np,"ebp"); &mov ($_n0,"esi"); &lea ($num,&DWP(-3,"edi")); # num=num-1 to assist modulo-scheduling #&mov ($_num,$num); # redundant as $num is not reused &mov ($_sp,"edx"); # saved stack pointer! if($sse2) { $acc0="mm0"; # mmx register bank layout $acc1="mm1"; $car0="mm2"; $car1="mm3"; $mul0="mm4"; $mul1="mm5"; $temp="mm6"; $mask="mm7"; &picmeup("eax","GFp_ia32cap_P"); &bt (&DWP(0,"eax"),26); # The non-SSE2 code was removed. &mov ("eax",-1); &movd ($mask,"eax"); # mask 32 lower bits &mov ($ap,$_ap); # load input pointers &mov ($bp,$_bp); &mov ($np,$_np); &xor ($i,$i); # i=0 &xor ($j,$j); # j=0 &movd ($mul0,&DWP(0,$bp)); # bp[0] &movd ($mul1,&DWP(0,$ap)); # ap[0] &movd ($car1,&DWP(0,$np)); # np[0] &pmuludq($mul1,$mul0); # ap[0]*bp[0] &movq ($car0,$mul1); &movq ($acc0,$mul1); # I wish movd worked for &pand ($acc0,$mask); # inter-register transfers &pmuludq($mul1,$_n0q); # *=n0 &pmuludq($car1,$mul1); # "t[0]"*np[0]*n0 &paddq ($car1,$acc0); &movd ($acc1,&DWP(4,$np)); # np[1] &movd ($acc0,&DWP(4,$ap)); # ap[1] &psrlq ($car0,32); &psrlq ($car1,32); &inc ($j); # j++ &set_label("1st",16); &pmuludq($acc0,$mul0); # ap[j]*bp[0] &pmuludq($acc1,$mul1); # np[j]*m1 &paddq ($car0,$acc0); # +=c0 &paddq ($car1,$acc1); # +=c1 &movq ($acc0,$car0); &pand ($acc0,$mask); &movd ($acc1,&DWP(4,$np,$j,4)); # np[j+1] &paddq ($car1,$acc0); # +=ap[j]*bp[0]; &movd ($acc0,&DWP(4,$ap,$j,4)); # ap[j+1] &psrlq ($car0,32); &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[j-1]= &psrlq ($car1,32); &lea ($j,&DWP(1,$j)); &cmp ($j,$num); &jl (&label("1st")); &pmuludq($acc0,$mul0); # ap[num-1]*bp[0] &pmuludq($acc1,$mul1); # np[num-1]*m1 &paddq ($car0,$acc0); # +=c0 &paddq ($car1,$acc1); # +=c1 &movq ($acc0,$car0); &pand ($acc0,$mask); &paddq ($car1,$acc0); # +=ap[num-1]*bp[0]; &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[num-2]= &psrlq ($car0,32); &psrlq ($car1,32); &paddq ($car1,$car0); &movq (&QWP($frame,"esp",$num,4),$car1); # tp[num].tp[num-1] &inc ($i); # i++ &set_label("outer"); &xor ($j,$j); # j=0 &movd ($mul0,&DWP(0,$bp,$i,4)); # bp[i] &movd ($mul1,&DWP(0,$ap)); # ap[0] &movd ($temp,&DWP($frame,"esp")); # tp[0] &movd ($car1,&DWP(0,$np)); # np[0] &pmuludq($mul1,$mul0); # ap[0]*bp[i] &paddq ($mul1,$temp); # +=tp[0] &movq ($acc0,$mul1); &movq ($car0,$mul1); &pand ($acc0,$mask); &pmuludq($mul1,$_n0q); # *=n0 &pmuludq($car1,$mul1); &paddq ($car1,$acc0); &movd ($temp,&DWP($frame+4,"esp")); # tp[1] &movd ($acc1,&DWP(4,$np)); # np[1] &movd ($acc0,&DWP(4,$ap)); # ap[1] &psrlq ($car0,32); &psrlq ($car1,32); &paddq ($car0,$temp); # +=tp[1] &inc ($j); # j++ &dec ($num); &set_label("inner"); &pmuludq($acc0,$mul0); # ap[j]*bp[i] &pmuludq($acc1,$mul1); # np[j]*m1 &paddq ($car0,$acc0); # +=c0 &paddq ($car1,$acc1); # +=c1 &movq ($acc0,$car0); &movd ($temp,&DWP($frame+4,"esp",$j,4));# tp[j+1] &pand ($acc0,$mask); &movd ($acc1,&DWP(4,$np,$j,4)); # np[j+1] &paddq ($car1,$acc0); # +=ap[j]*bp[i]+tp[j] &movd ($acc0,&DWP(4,$ap,$j,4)); # ap[j+1] &psrlq ($car0,32); &movd (&DWP($frame-4,"esp",$j,4),$car1);# tp[j-1]= &psrlq ($car1,32); &paddq ($car0,$temp); # +=tp[j+1] &dec ($num); &lea ($j,&DWP(1,$j)); # j++ &jnz (&label("inner")); &mov ($num,$j); &pmuludq($acc0,$mul0); # ap[num-1]*bp[i] &pmuludq($acc1,$mul1); # np[num-1]*m1 &paddq ($car0,$acc0); # +=c0 &paddq ($car1,$acc1); # +=c1 &movq ($acc0,$car0); &pand ($acc0,$mask); &paddq ($car1,$acc0); # +=ap[num-1]*bp[i]+tp[num-1] &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[num-2]= &psrlq ($car0,32); &psrlq ($car1,32); &movd ($temp,&DWP($frame+4,"esp",$num,4)); # += tp[num] &paddq ($car1,$car0); &paddq ($car1,$temp); &movq (&QWP($frame,"esp",$num,4),$car1); # tp[num].tp[num-1] &lea ($i,&DWP(1,$i)); # i++ &cmp ($i,$num); &jle (&label("outer")); &emms (); # done with mmx bank } # The non-SSE2 code was removed. &set_label("common_tail",16); &mov ($np,$_np); # load modulus pointer &mov ($rp,$_rp); # load result pointer &lea ($tp,&DWP($frame,"esp")); # [$ap and $bp are zapped] &mov ("eax",&DWP(0,$tp)); # tp[0] &mov ($j,$num); # j=num-1 &xor ($i,$i); # i=0 and clear CF! &set_label("sub",16); &sbb ("eax",&DWP(0,$np,$i,4)); &mov (&DWP(0,$rp,$i,4),"eax"); # rp[i]=tp[i]-np[i] &dec ($j); # doesn't affect CF! &mov ("eax",&DWP(4,$tp,$i,4)); # tp[i+1] &lea ($i,&DWP(1,$i)); # i++ &jge (&label("sub")); &sbb ("eax",0); # handle upmost overflow bit &mov ("edx",-1); &xor ("edx","eax"); &jmp (&label("copy")); &set_label("copy",16); # conditional copy &mov ($tp,&DWP($frame,"esp",$num,4)); &mov ($np,&DWP(0,$rp,$num,4)); &mov (&DWP($frame,"esp",$num,4),$j); # zap temporary vector &and ($tp,"eax"); &and ($np,"edx"); &or ($np,$tp); &mov (&DWP(0,$rp,$num,4),$np); &dec ($num); &jge (&label("copy")); &mov ("esp",$_sp); # pull saved stack pointer &mov ("eax",1); &function_end("GFp_bn_mul_mont"); &asciz("Montgomery Multiplication for x86, CRYPTOGAMS by "); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/asm/x86_64-mont.pl000064400000000000000000001002331352416253600200560ustar0000000000000000#! /usr/bin/env perl # Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # October 2005. # # Montgomery multiplication routine for x86_64. While it gives modest # 9% improvement of rsa4096 sign on Opteron, rsa512 sign runs more # than twice, >2x, as fast. Most common rsa1024 sign is improved by # respectful 50%. It remains to be seen if loop unrolling and # dedicated squaring routine can provide further improvement... # July 2011. # # Add dedicated squaring procedure. Performance improvement varies # from platform to platform, but in average it's ~5%/15%/25%/33% # for 512-/1024-/2048-/4096-bit RSA *sign* benchmarks respectively. # August 2011. # # Unroll and modulo-schedule inner loops in such manner that they # are "fallen through" for input lengths of 8, which is critical for # 1024-bit RSA *sign*. Average performance improvement in comparison # to *initial* version of this module from 2005 is ~0%/30%/40%/45% # for 512-/1024-/2048-/4096-bit RSA *sign* benchmarks respectively. # June 2013. # # Optimize reduction in squaring procedure and improve 1024+-bit RSA # sign performance by 10-16% on Intel Sandy Bridge and later # (virtually same on non-Intel processors). # August 2013. # # Add MULX/ADOX/ADCX code path. $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; # In upstream, this is controlled by shelling out to the compiler to check # versions, but BoringSSL is intended to be used with pre-generated perlasm # output, so this isn't useful anyway. $addx = 1; # void GFp_bn_mul_mont( $rp="%rdi"; # BN_ULONG *rp, $ap="%rsi"; # const BN_ULONG *ap, $bp="%rdx"; # const BN_ULONG *bp, $np="%rcx"; # const BN_ULONG *np, $n0="%r8"; # const BN_ULONG *n0, # TODO(davidben): The code below treats $num as an int, but C passes in a # size_t. $num="%r9"; # size_t num); $lo0="%r10"; $hi0="%r11"; $hi1="%r13"; $i="%r14"; $j="%r15"; $m0="%rbx"; $m1="%rbp"; $code=<<___; .text .extern GFp_ia32cap_P .globl GFp_bn_mul_mont .type GFp_bn_mul_mont,\@function,6 .align 16 GFp_bn_mul_mont: .cfi_startproc mov ${num}d,${num}d mov %rsp,%rax .cfi_def_cfa_register %rax test \$3,${num}d jnz .Lmul_enter cmp \$8,${num}d jb .Lmul_enter ___ $code.=<<___ if ($addx); mov GFp_ia32cap_P+8(%rip),%r11d ___ $code.=<<___; cmp $ap,$bp jne .Lmul4x_enter test \$7,${num}d jz .Lsqr8x_enter jmp .Lmul4x_enter .align 16 .Lmul_enter: push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 neg $num mov %rsp,%r11 lea -16(%rsp,$num,8),%r10 # future alloca(8*(num+2)) neg $num # restore $num and \$-1024,%r10 # minimize TLB usage # An OS-agnostic version of __chkstk. # # Some OSes (Windows) insist on stack being "wired" to # physical memory in strictly sequential manner, i.e. if stack # allocation spans two pages, then reference to farmost one can # be punishable by SEGV. But page walking can do good even on # other OSes, because it guarantees that villain thread hits # the guard page before it can make damage to innocent one... sub %r10,%r11 and \$-4096,%r11 lea (%r10,%r11),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul_page_walk jmp .Lmul_page_walk_done .align 16 .Lmul_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul_page_walk .Lmul_page_walk_done: mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp .cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 .Lmul_body: mov $bp,%r12 # reassign $bp ___ $bp="%r12"; $code.=<<___; mov ($n0),$n0 # pull n0[0] value mov ($bp),$m0 # m0=bp[0] mov ($ap),%rax xor $i,$i # i=0 xor $j,$j # j=0 mov $n0,$m1 mulq $m0 # ap[0]*bp[0] mov %rax,$lo0 mov ($np),%rax imulq $lo0,$m1 # "tp[0]"*n0 mov %rdx,$hi0 mulq $m1 # np[0]*m1 add %rax,$lo0 # discarded mov 8($ap),%rax adc \$0,%rdx mov %rdx,$hi1 lea 1($j),$j # j++ jmp .L1st_enter .align 16 .L1st: add %rax,$hi1 mov ($ap,$j,8),%rax adc \$0,%rdx add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] mov $lo0,$hi0 adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 .L1st_enter: mulq $m0 # ap[j]*bp[0] add %rax,$hi0 mov ($np,$j,8),%rax adc \$0,%rdx lea 1($j),$j # j++ mov %rdx,$lo0 mulq $m1 # np[j]*m1 cmp $num,$j jne .L1st add %rax,$hi1 mov ($ap),%rax # ap[0] adc \$0,%rdx add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 mov $lo0,$hi0 xor %rdx,%rdx add $hi0,$hi1 adc \$0,%rdx mov $hi1,-8(%rsp,$num,8) mov %rdx,(%rsp,$num,8) # store upmost overflow bit lea 1($i),$i # i++ jmp .Louter .align 16 .Louter: mov ($bp,$i,8),$m0 # m0=bp[i] xor $j,$j # j=0 mov $n0,$m1 mov (%rsp),$lo0 mulq $m0 # ap[0]*bp[i] add %rax,$lo0 # ap[0]*bp[i]+tp[0] mov ($np),%rax adc \$0,%rdx imulq $lo0,$m1 # tp[0]*n0 mov %rdx,$hi0 mulq $m1 # np[0]*m1 add %rax,$lo0 # discarded mov 8($ap),%rax adc \$0,%rdx mov 8(%rsp),$lo0 # tp[1] mov %rdx,$hi1 lea 1($j),$j # j++ jmp .Linner_enter .align 16 .Linner: add %rax,$hi1 mov ($ap,$j,8),%rax adc \$0,%rdx add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] mov (%rsp,$j,8),$lo0 adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 .Linner_enter: mulq $m0 # ap[j]*bp[i] add %rax,$hi0 mov ($np,$j,8),%rax adc \$0,%rdx add $hi0,$lo0 # ap[j]*bp[i]+tp[j] mov %rdx,$hi0 adc \$0,$hi0 lea 1($j),$j # j++ mulq $m1 # np[j]*m1 cmp $num,$j jne .Linner add %rax,$hi1 mov ($ap),%rax # ap[0] adc \$0,%rdx add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] mov (%rsp,$j,8),$lo0 adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 xor %rdx,%rdx add $hi0,$hi1 adc \$0,%rdx add $lo0,$hi1 # pull upmost overflow bit adc \$0,%rdx mov $hi1,-8(%rsp,$num,8) mov %rdx,(%rsp,$num,8) # store upmost overflow bit lea 1($i),$i # i++ cmp $num,$i jb .Louter xor $i,$i # i=0 and clear CF! mov (%rsp),%rax # tp[0] mov $num,$j # j=num .align 16 .Lsub: sbb ($np,$i,8),%rax mov %rax,($rp,$i,8) # rp[i]=tp[i]-np[i] mov 8(%rsp,$i,8),%rax # tp[i+1] lea 1($i),$i # i++ dec $j # doesn't affect CF! jnz .Lsub sbb \$0,%rax # handle upmost overflow bit mov \$-1,%rbx xor %rax,%rbx # not %rax xor $i,$i mov $num,$j # j=num .Lcopy: # conditional copy mov ($rp,$i,8),%rcx mov (%rsp,$i,8),%rdx and %rbx,%rcx and %rax,%rdx mov $num,(%rsp,$i,8) # zap temporary vector or %rcx,%rdx mov %rdx,($rp,$i,8) # rp[i]=tp[i] lea 1($i),$i sub \$1,$j jnz .Lcopy mov 8(%rsp,$num,8),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul_epilogue: ret .cfi_endproc .size GFp_bn_mul_mont,.-GFp_bn_mul_mont ___ {{{ my @A=("%r10","%r11"); my @N=("%r13","%rdi"); $code.=<<___; .type bn_mul4x_mont,\@function,6 .align 16 bn_mul4x_mont: .cfi_startproc mov ${num}d,${num}d mov %rsp,%rax .cfi_def_cfa_register %rax .Lmul4x_enter: ___ $code.=<<___ if ($addx); and \$0x80100,%r11d cmp \$0x80100,%r11d je .Lmulx4x_enter ___ $code.=<<___; push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 neg $num mov %rsp,%r11 lea -32(%rsp,$num,8),%r10 # future alloca(8*(num+4)) neg $num # restore and \$-1024,%r10 # minimize TLB usage sub %r10,%r11 and \$-4096,%r11 lea (%r10,%r11),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul4x_page_walk jmp .Lmul4x_page_walk_done .Lmul4x_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul4x_page_walk .Lmul4x_page_walk_done: mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp .cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 .Lmul4x_body: mov $rp,16(%rsp,$num,8) # tp[num+2]=$rp mov %rdx,%r12 # reassign $bp ___ $bp="%r12"; $code.=<<___; mov ($n0),$n0 # pull n0[0] value mov ($bp),$m0 # m0=bp[0] mov ($ap),%rax xor $i,$i # i=0 xor $j,$j # j=0 mov $n0,$m1 mulq $m0 # ap[0]*bp[0] mov %rax,$A[0] mov ($np),%rax imulq $A[0],$m1 # "tp[0]"*n0 mov %rdx,$A[1] mulq $m1 # np[0]*m1 add %rax,$A[0] # discarded mov 8($ap),%rax adc \$0,%rdx mov %rdx,$N[1] mulq $m0 add %rax,$A[1] mov 8($np),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 add %rax,$N[1] mov 16($ap),%rax adc \$0,%rdx add $A[1],$N[1] lea 4($j),$j # j++ adc \$0,%rdx mov $N[1],(%rsp) mov %rdx,$N[0] jmp .L1st4x .align 16 .L1st4x: mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov -16($np,$j,8),%rax adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-24(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov -8($np,$j,8),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$j,8),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[1],-16(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov ($np,$j,8),%rax adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov 8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-8(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov 8($np,$j,8),%rax adc \$0,%rdx lea 4($j),$j # j++ mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov -16($ap,$j,8),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[1],-32(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] cmp $num,$j jb .L1st4x mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov -16($np,$j,8),%rax adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-24(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov -8($np,$j,8),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap),%rax # ap[0] adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[1],-16(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] xor $N[1],$N[1] add $A[0],$N[0] adc \$0,$N[1] mov $N[0],-8(%rsp,$j,8) mov $N[1],(%rsp,$j,8) # store upmost overflow bit lea 1($i),$i # i++ .align 4 .Louter4x: mov ($bp,$i,8),$m0 # m0=bp[i] xor $j,$j # j=0 mov (%rsp),$A[0] mov $n0,$m1 mulq $m0 # ap[0]*bp[i] add %rax,$A[0] # ap[0]*bp[i]+tp[0] mov ($np),%rax adc \$0,%rdx imulq $A[0],$m1 # tp[0]*n0 mov %rdx,$A[1] mulq $m1 # np[0]*m1 add %rax,$A[0] # "$N[0]", discarded mov 8($ap),%rax adc \$0,%rdx mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov 8($np),%rax adc \$0,%rdx add 8(%rsp),$A[1] # +tp[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov 16($ap),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[i]+tp[j] lea 4($j),$j # j+=2 adc \$0,%rdx mov $N[1],(%rsp) # tp[j-1] mov %rdx,$N[0] jmp .Linner4x .align 16 .Linner4x: mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov -16($np,$j,8),%rax adc \$0,%rdx add -16(%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[0],-24(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov -8($np,$j,8),%rax adc \$0,%rdx add -8(%rsp,$j,8),$A[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$j,8),%rax adc \$0,%rdx add $A[1],$N[1] adc \$0,%rdx mov $N[1],-16(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov ($np,$j,8),%rax adc \$0,%rdx add (%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov 8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[0],-8(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov 8($np,$j,8),%rax adc \$0,%rdx add 8(%rsp,$j,8),$A[1] adc \$0,%rdx lea 4($j),$j # j++ mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov -16($ap,$j,8),%rax adc \$0,%rdx add $A[1],$N[1] adc \$0,%rdx mov $N[1],-32(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] cmp $num,$j jb .Linner4x mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov -16($np,$j,8),%rax adc \$0,%rdx add -16(%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j,8),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[0],-24(%rsp,$j,8) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov -8($np,$j,8),%rax adc \$0,%rdx add -8(%rsp,$j,8),$A[1] adc \$0,%rdx lea 1($i),$i # i++ mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap),%rax # ap[0] adc \$0,%rdx add $A[1],$N[1] adc \$0,%rdx mov $N[1],-16(%rsp,$j,8) # tp[j-1] mov %rdx,$N[0] xor $N[1],$N[1] add $A[0],$N[0] adc \$0,$N[1] add (%rsp,$num,8),$N[0] # pull upmost overflow bit adc \$0,$N[1] mov $N[0],-8(%rsp,$j,8) mov $N[1],(%rsp,$j,8) # store upmost overflow bit cmp $num,$i jb .Louter4x ___ { my @ri=("%rax","%rdx",$m0,$m1); $code.=<<___; mov 16(%rsp,$num,8),$rp # restore $rp lea -4($num),$j mov 0(%rsp),@ri[0] # tp[0] mov 8(%rsp),@ri[1] # tp[1] shr \$2,$j # j=num/4-1 lea (%rsp),$ap # borrow ap for tp xor $i,$i # i=0 and clear CF! sub 0($np),@ri[0] mov 16($ap),@ri[2] # tp[2] mov 24($ap),@ri[3] # tp[3] sbb 8($np),@ri[1] .Lsub4x: mov @ri[0],0($rp,$i,8) # rp[i]=tp[i]-np[i] mov @ri[1],8($rp,$i,8) # rp[i]=tp[i]-np[i] sbb 16($np,$i,8),@ri[2] mov 32($ap,$i,8),@ri[0] # tp[i+1] mov 40($ap,$i,8),@ri[1] sbb 24($np,$i,8),@ri[3] mov @ri[2],16($rp,$i,8) # rp[i]=tp[i]-np[i] mov @ri[3],24($rp,$i,8) # rp[i]=tp[i]-np[i] sbb 32($np,$i,8),@ri[0] mov 48($ap,$i,8),@ri[2] mov 56($ap,$i,8),@ri[3] sbb 40($np,$i,8),@ri[1] lea 4($i),$i # i++ dec $j # doesn't affect CF! jnz .Lsub4x mov @ri[0],0($rp,$i,8) # rp[i]=tp[i]-np[i] mov 32($ap,$i,8),@ri[0] # load overflow bit sbb 16($np,$i,8),@ri[2] mov @ri[1],8($rp,$i,8) # rp[i]=tp[i]-np[i] sbb 24($np,$i,8),@ri[3] mov @ri[2],16($rp,$i,8) # rp[i]=tp[i]-np[i] sbb \$0,@ri[0] # handle upmost overflow bit mov @ri[3],24($rp,$i,8) # rp[i]=tp[i]-np[i] pxor %xmm0,%xmm0 movq @ri[0],%xmm4 pcmpeqd %xmm5,%xmm5 pshufd \$0,%xmm4,%xmm4 mov $num,$j pxor %xmm4,%xmm5 shr \$2,$j # j=num/4 xor %eax,%eax # i=0 jmp .Lcopy4x .align 16 .Lcopy4x: # conditional copy movdqa (%rsp,%rax),%xmm1 movdqu ($rp,%rax),%xmm2 pand %xmm4,%xmm1 pand %xmm5,%xmm2 movdqa 16(%rsp,%rax),%xmm3 movdqa %xmm0,(%rsp,%rax) por %xmm2,%xmm1 movdqu 16($rp,%rax),%xmm2 movdqu %xmm1,($rp,%rax) pand %xmm4,%xmm3 pand %xmm5,%xmm2 movdqa %xmm0,16(%rsp,%rax) por %xmm2,%xmm3 movdqu %xmm3,16($rp,%rax) lea 32(%rax),%rax dec $j jnz .Lcopy4x ___ } $code.=<<___; mov 8(%rsp,$num,8),%rsi # restore %rsp .cfi_def_cfa %rsi, 8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul4x_epilogue: ret .cfi_endproc .size bn_mul4x_mont,.-bn_mul4x_mont ___ }}} {{{ ###################################################################### # void bn_sqr8x_mont( my $rptr="%rdi"; # const BN_ULONG *rptr, my $aptr="%rsi"; # const BN_ULONG *aptr, my $bptr="%rdx"; # not used my $nptr="%rcx"; # const BN_ULONG *nptr, my $n0 ="%r8"; # const BN_ULONG *n0); my $num ="%r9"; # int num, has to be divisible by 8 my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); my @A0=("%r10","%r11"); my @A1=("%r12","%r13"); my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); $code.=<<___ if ($addx); .extern GFp_bn_sqrx8x_internal # see x86_64-mont5 module ___ $code.=<<___; .extern GFp_bn_sqr8x_internal # see x86_64-mont5 module .type bn_sqr8x_mont,\@function,6 .align 32 bn_sqr8x_mont: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax .Lsqr8x_enter: push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lsqr8x_prologue: mov ${num}d,%r10d shl \$3,${num}d # convert $num to bytes shl \$3+2,%r10 # 4*$num neg $num ############################################################## # ensure that stack frame doesn't alias with $aptr modulo # 4096. this is done to allow memory disambiguation logic # do its job. # lea -64(%rsp,$num,2),%r11 mov %rsp,%rbp mov ($n0),$n0 # *n0 sub $aptr,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lsqr8x_sp_alt sub %r11,%rbp # align with $aptr lea -64(%rbp,$num,2),%rbp # future alloca(frame+2*$num) jmp .Lsqr8x_sp_done .align 32 .Lsqr8x_sp_alt: lea 4096-64(,$num,2),%r10 # 4096-frame-2*$num lea -64(%rbp,$num,2),%rbp # future alloca(frame+2*$num) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lsqr8x_sp_done: and \$-64,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lsqr8x_page_walk jmp .Lsqr8x_page_walk_done .align 16 .Lsqr8x_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lsqr8x_page_walk .Lsqr8x_page_walk_done: mov $num,%r10 neg $num mov $n0, 32(%rsp) mov %rax, 40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 .Lsqr8x_body: movq $nptr, %xmm2 # save pointer to modulus pxor %xmm0,%xmm0 movq $rptr,%xmm1 # save $rptr movq %r10, %xmm3 # -$num ___ $code.=<<___ if ($addx); mov GFp_ia32cap_P+8(%rip),%eax and \$0x80100,%eax cmp \$0x80100,%eax jne .Lsqr8x_nox call GFp_bn_sqrx8x_internal # see x86_64-mont5 module # %rax top-most carry # %rbp nptr # %rcx -8*num # %r8 end of tp[2*num] lea (%r8,%rcx),%rbx mov %rcx,$num mov %rcx,%rdx movq %xmm1,$rptr sar \$3+2,%rcx # %cf=0 jmp .Lsqr8x_sub .align 32 .Lsqr8x_nox: ___ $code.=<<___; call GFp_bn_sqr8x_internal # see x86_64-mont5 module # %rax top-most carry # %rbp nptr # %r8 -8*num # %rdi end of tp[2*num] lea (%rdi,$num),%rbx mov $num,%rcx mov $num,%rdx movq %xmm1,$rptr sar \$3+2,%rcx # %cf=0 jmp .Lsqr8x_sub .align 32 .Lsqr8x_sub: mov 8*0(%rbx),%r12 mov 8*1(%rbx),%r13 mov 8*2(%rbx),%r14 mov 8*3(%rbx),%r15 lea 8*4(%rbx),%rbx sbb 8*0(%rbp),%r12 sbb 8*1(%rbp),%r13 sbb 8*2(%rbp),%r14 sbb 8*3(%rbp),%r15 lea 8*4(%rbp),%rbp mov %r12,8*0($rptr) mov %r13,8*1($rptr) mov %r14,8*2($rptr) mov %r15,8*3($rptr) lea 8*4($rptr),$rptr inc %rcx # preserves %cf jnz .Lsqr8x_sub sbb \$0,%rax # top-most carry lea (%rbx,$num),%rbx # rewind lea ($rptr,$num),$rptr # rewind movq %rax,%xmm1 pxor %xmm0,%xmm0 pshufd \$0,%xmm1,%xmm1 mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 jmp .Lsqr8x_cond_copy .align 32 .Lsqr8x_cond_copy: movdqa 16*0(%rbx),%xmm2 movdqa 16*1(%rbx),%xmm3 lea 16*2(%rbx),%rbx movdqu 16*0($rptr),%xmm4 movdqu 16*1($rptr),%xmm5 lea 16*2($rptr),$rptr movdqa %xmm0,-16*2(%rbx) # zero tp movdqa %xmm0,-16*1(%rbx) movdqa %xmm0,-16*2(%rbx,%rdx) movdqa %xmm0,-16*1(%rbx,%rdx) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-16*2($rptr) movdqu %xmm5,-16*1($rptr) add \$32,$num jnz .Lsqr8x_cond_copy mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lsqr8x_epilogue: ret .cfi_endproc .size bn_sqr8x_mont,.-bn_sqr8x_mont ___ }}} if ($addx) {{{ my $bp="%rdx"; # original value $code.=<<___; .type bn_mulx4x_mont,\@function,6 .align 32 bn_mulx4x_mont: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax .Lmulx4x_enter: push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lmulx4x_prologue: shl \$3,${num}d # convert $num to bytes xor %r10,%r10 sub $num,%r10 # -$num mov ($n0),$n0 # *n0 lea -72(%rsp,%r10),%rbp # future alloca(frame+$num+8) and \$-128,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmulx4x_page_walk jmp .Lmulx4x_page_walk_done .align 16 .Lmulx4x_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmulx4x_page_walk .Lmulx4x_page_walk_done: lea ($bp,$num),%r10 ############################################################## # Stack layout # +0 num # +8 off-loaded &b[i] # +16 end of b[num] # +24 saved n0 # +32 saved rp # +40 saved %rsp # +48 inner counter # +56 # +64 tmp[num+1] # mov $num,0(%rsp) # save $num shr \$5,$num mov %r10,16(%rsp) # end of b[num] sub \$1,$num mov $n0, 24(%rsp) # save *n0 mov $rp, 32(%rsp) # save $rp mov %rax,40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 mov $num,48(%rsp) # inner counter jmp .Lmulx4x_body .align 32 .Lmulx4x_body: ___ my ($aptr, $bptr, $nptr, $tptr, $mi, $bi, $zero, $num)= ("%rsi","%rdi","%rcx","%rbx","%r8","%r9","%rbp","%rax"); my $rptr=$bptr; $code.=<<___; lea 8($bp),$bptr mov ($bp),%rdx # b[0], $bp==%rdx actually lea 64+32(%rsp),$tptr mov %rdx,$bi mulx 0*8($aptr),$mi,%rax # a[0]*b[0] mulx 1*8($aptr),%r11,%r14 # a[1]*b[0] add %rax,%r11 mov $bptr,8(%rsp) # off-load &b[i] mulx 2*8($aptr),%r12,%r13 # ... adc %r14,%r12 adc \$0,%r13 mov $mi,$bptr # borrow $bptr imulq 24(%rsp),$mi # "t[0]"*n0 xor $zero,$zero # cf=0, of=0 mulx 3*8($aptr),%rax,%r14 mov $mi,%rdx lea 4*8($aptr),$aptr adcx %rax,%r13 adcx $zero,%r14 # cf=0 mulx 0*8($nptr),%rax,%r10 adcx %rax,$bptr # discarded adox %r11,%r10 mulx 1*8($nptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 # mulx 2*8($nptr),%rax,%r12 mov 48(%rsp),$bptr # counter value mov %r10,-4*8($tptr) adcx %rax,%r11 adox %r13,%r12 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r11,-3*8($tptr) adcx %rax,%r12 adox $zero,%r15 # of=0 lea 4*8($nptr),$nptr mov %r12,-2*8($tptr) jmp .Lmulx4x_1st .align 32 .Lmulx4x_1st: adcx $zero,%r15 # cf=0, modulo-scheduled mulx 0*8($aptr),%r10,%rax # a[4]*b[0] adcx %r14,%r10 mulx 1*8($aptr),%r11,%r14 # a[5]*b[0] adcx %rax,%r11 mulx 2*8($aptr),%r12,%rax # ... adcx %r14,%r12 mulx 3*8($aptr),%r13,%r14 .byte 0x67,0x67 mov $mi,%rdx adcx %rax,%r13 adcx $zero,%r14 # cf=0 lea 4*8($aptr),$aptr lea 4*8($tptr),$tptr adox %r15,%r10 mulx 0*8($nptr),%rax,%r15 adcx %rax,%r10 adox %r15,%r11 mulx 1*8($nptr),%rax,%r15 adcx %rax,%r11 adox %r15,%r12 mulx 2*8($nptr),%rax,%r15 mov %r10,-5*8($tptr) adcx %rax,%r12 mov %r11,-4*8($tptr) adox %r15,%r13 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r12,-3*8($tptr) adcx %rax,%r13 adox $zero,%r15 lea 4*8($nptr),$nptr mov %r13,-2*8($tptr) dec $bptr # of=0, pass cf jnz .Lmulx4x_1st mov 0(%rsp),$num # load num mov 8(%rsp),$bptr # re-load &b[i] adc $zero,%r15 # modulo-scheduled add %r15,%r14 sbb %r15,%r15 # top-most carry mov %r14,-1*8($tptr) jmp .Lmulx4x_outer .align 32 .Lmulx4x_outer: mov ($bptr),%rdx # b[i] lea 8($bptr),$bptr # b++ sub $num,$aptr # rewind $aptr mov %r15,($tptr) # save top-most carry lea 64+4*8(%rsp),$tptr sub $num,$nptr # rewind $nptr mulx 0*8($aptr),$mi,%r11 # a[0]*b[i] xor %ebp,%ebp # xor $zero,$zero # cf=0, of=0 mov %rdx,$bi mulx 1*8($aptr),%r14,%r12 # a[1]*b[i] adox -4*8($tptr),$mi adcx %r14,%r11 mulx 2*8($aptr),%r15,%r13 # ... adox -3*8($tptr),%r11 adcx %r15,%r12 adox -2*8($tptr),%r12 adcx $zero,%r13 adox $zero,%r13 mov $bptr,8(%rsp) # off-load &b[i] mov $mi,%r15 imulq 24(%rsp),$mi # "t[0]"*n0 xor %ebp,%ebp # xor $zero,$zero # cf=0, of=0 mulx 3*8($aptr),%rax,%r14 mov $mi,%rdx adcx %rax,%r13 adox -1*8($tptr),%r13 adcx $zero,%r14 lea 4*8($aptr),$aptr adox $zero,%r14 mulx 0*8($nptr),%rax,%r10 adcx %rax,%r15 # discarded adox %r11,%r10 mulx 1*8($nptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 mulx 2*8($nptr),%rax,%r12 mov %r10,-4*8($tptr) adcx %rax,%r11 adox %r13,%r12 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r11,-3*8($tptr) lea 4*8($nptr),$nptr adcx %rax,%r12 adox $zero,%r15 # of=0 mov 48(%rsp),$bptr # counter value mov %r12,-2*8($tptr) jmp .Lmulx4x_inner .align 32 .Lmulx4x_inner: mulx 0*8($aptr),%r10,%rax # a[4]*b[i] adcx $zero,%r15 # cf=0, modulo-scheduled adox %r14,%r10 mulx 1*8($aptr),%r11,%r14 # a[5]*b[i] adcx 0*8($tptr),%r10 adox %rax,%r11 mulx 2*8($aptr),%r12,%rax # ... adcx 1*8($tptr),%r11 adox %r14,%r12 mulx 3*8($aptr),%r13,%r14 mov $mi,%rdx adcx 2*8($tptr),%r12 adox %rax,%r13 adcx 3*8($tptr),%r13 adox $zero,%r14 # of=0 lea 4*8($aptr),$aptr lea 4*8($tptr),$tptr adcx $zero,%r14 # cf=0 adox %r15,%r10 mulx 0*8($nptr),%rax,%r15 adcx %rax,%r10 adox %r15,%r11 mulx 1*8($nptr),%rax,%r15 adcx %rax,%r11 adox %r15,%r12 mulx 2*8($nptr),%rax,%r15 mov %r10,-5*8($tptr) adcx %rax,%r12 adox %r15,%r13 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r11,-4*8($tptr) mov %r12,-3*8($tptr) adcx %rax,%r13 adox $zero,%r15 lea 4*8($nptr),$nptr mov %r13,-2*8($tptr) dec $bptr # of=0, pass cf jnz .Lmulx4x_inner mov 0(%rsp),$num # load num mov 8(%rsp),$bptr # re-load &b[i] adc $zero,%r15 # modulo-scheduled sub 0*8($tptr),$zero # pull top-most carry adc %r15,%r14 sbb %r15,%r15 # top-most carry mov %r14,-1*8($tptr) cmp 16(%rsp),$bptr jne .Lmulx4x_outer lea 64(%rsp),$tptr sub $num,$nptr # rewind $nptr neg %r15 mov $num,%rdx shr \$3+2,$num # %cf=0 mov 32(%rsp),$rptr # restore rp jmp .Lmulx4x_sub .align 32 .Lmulx4x_sub: mov 8*0($tptr),%r11 mov 8*1($tptr),%r12 mov 8*2($tptr),%r13 mov 8*3($tptr),%r14 lea 8*4($tptr),$tptr sbb 8*0($nptr),%r11 sbb 8*1($nptr),%r12 sbb 8*2($nptr),%r13 sbb 8*3($nptr),%r14 lea 8*4($nptr),$nptr mov %r11,8*0($rptr) mov %r12,8*1($rptr) mov %r13,8*2($rptr) mov %r14,8*3($rptr) lea 8*4($rptr),$rptr dec $num # preserves %cf jnz .Lmulx4x_sub sbb \$0,%r15 # top-most carry lea 64(%rsp),$tptr sub %rdx,$rptr # rewind movq %r15,%xmm1 pxor %xmm0,%xmm0 pshufd \$0,%xmm1,%xmm1 mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 jmp .Lmulx4x_cond_copy .align 32 .Lmulx4x_cond_copy: movdqa 16*0($tptr),%xmm2 movdqa 16*1($tptr),%xmm3 lea 16*2($tptr),$tptr movdqu 16*0($rptr),%xmm4 movdqu 16*1($rptr),%xmm5 lea 16*2($rptr),$rptr movdqa %xmm0,-16*2($tptr) # zero tp movdqa %xmm0,-16*1($tptr) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-16*2($rptr) movdqu %xmm5,-16*1($rptr) sub \$32,%rdx jnz .Lmulx4x_cond_copy mov %rdx,($tptr) mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmulx4x_epilogue: ret .cfi_endproc .size bn_mulx4x_mont,.-bn_mulx4x_mont ___ }}} $code.=<<___; .asciz "Montgomery Multiplication for x86_64, CRYPTOGAMS by " .align 16 ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type mul_handler,\@abi-omnipotent .align 16 mul_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # end of prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail mov 192($context),%r10 # pull $num mov 8(%rax,%r10,8),%rax # pull saved stack pointer jmp .Lcommon_pop_regs .size mul_handler,.-mul_handler .type sqr_handler,\@abi-omnipotent .align 16 sqr_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # end of prologue label cmp %r10,%rbx # context->Rip<.Lsqr_prologue jb .Lcommon_seh_tail mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # body label cmp %r10,%rbx # context->Rip<.Lsqr_body jb .Lcommon_pop_regs mov 152($context),%rax # pull context->Rsp mov 8(%r11),%r10d # HandlerData[2] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=.Lsqr_epilogue jae .Lcommon_seh_tail mov 40(%rax),%rax # pull saved stack pointer .Lcommon_pop_regs: mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size sqr_handler,.-sqr_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_bn_mul_mont .rva .LSEH_end_GFp_bn_mul_mont .rva .LSEH_info_GFp_bn_mul_mont .rva .LSEH_begin_bn_mul4x_mont .rva .LSEH_end_bn_mul4x_mont .rva .LSEH_info_bn_mul4x_mont .rva .LSEH_begin_bn_sqr8x_mont .rva .LSEH_end_bn_sqr8x_mont .rva .LSEH_info_bn_sqr8x_mont ___ $code.=<<___ if ($addx); .rva .LSEH_begin_bn_mulx4x_mont .rva .LSEH_end_bn_mulx4x_mont .rva .LSEH_info_bn_mulx4x_mont ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_GFp_bn_mul_mont: .byte 9,0,0,0 .rva mul_handler .rva .Lmul_body,.Lmul_epilogue # HandlerData[] .LSEH_info_bn_mul4x_mont: .byte 9,0,0,0 .rva mul_handler .rva .Lmul4x_body,.Lmul4x_epilogue # HandlerData[] .LSEH_info_bn_sqr8x_mont: .byte 9,0,0,0 .rva sqr_handler .rva .Lsqr8x_prologue,.Lsqr8x_body,.Lsqr8x_epilogue # HandlerData[] .align 8 ___ $code.=<<___ if ($addx); .LSEH_info_bn_mulx4x_mont: .byte 9,0,0,0 .rva sqr_handler .rva .Lmulx4x_prologue,.Lmulx4x_body,.Lmulx4x_epilogue # HandlerData[] .align 8 ___ } print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/asm/x86_64-mont5.pl000064400000000000000000002524741352416253600201620ustar0000000000000000#! /usr/bin/env perl # Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # August 2011. # # Companion to x86_64-mont.pl that optimizes cache-timing attack # countermeasures. The subroutines are produced by replacing bp[i] # references in their x86_64-mont.pl counterparts with cache-neutral # references to powers table computed in BN_mod_exp_mont_consttime. # In addition subroutine that scatters elements of the powers table # is implemented, so that scatter-/gathering can be tuned without # bn_exp.c modifications. # August 2013. # # Add MULX/AD*X code paths and additional interfaces to optimize for # branch prediction unit. For input lengths that are multiples of 8 # the np argument is not just modulus value, but one interleaved # with 0. This is to optimize post-condition... $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; # In upstream, this is controlled by shelling out to the compiler to check # versions, but BoringSSL is intended to be used with pre-generated perlasm # output, so this isn't useful anyway. $addx = 1; # int GFp_bn_mul_mont_gather5( $rp="%rdi"; # BN_ULONG *rp, $ap="%rsi"; # const BN_ULONG *ap, $bp="%rdx"; # const BN_ULONG *bp, $np="%rcx"; # const BN_ULONG *np, $n0="%r8"; # const BN_ULONG *n0, $num="%r9"; # int num, # int idx); # 0 to 2^5-1, "index" in $bp holding # pre-computed powers of a', interlaced # in such manner that b[0] is $bp[idx], # b[1] is [2^5+idx], etc. $lo0="%r10"; $hi0="%r11"; $hi1="%r13"; $i="%r14"; $j="%r15"; $m0="%rbx"; $m1="%rbp"; $code=<<___; .text .extern GFp_ia32cap_P .globl GFp_bn_mul_mont_gather5 .type GFp_bn_mul_mont_gather5,\@function,6 .align 64 GFp_bn_mul_mont_gather5: .cfi_startproc mov ${num}d,${num}d mov %rsp,%rax .cfi_def_cfa_register %rax test \$7,${num}d jnz .Lmul_enter ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip),%r11 mov 8(%r11),%r11d ___ $code.=<<___; jmp .Lmul4x_enter .align 16 .Lmul_enter: movd `($win64?56:8)`(%rsp),%xmm5 # load 7th argument push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 neg $num mov %rsp,%r11 lea -280(%rsp,$num,8),%r10 # future alloca(8*(num+2)+256+8) neg $num # restore $num and \$-1024,%r10 # minimize TLB usage # An OS-agnostic version of __chkstk. # # Some OSes (Windows) insist on stack being "wired" to # physical memory in strictly sequential manner, i.e. if stack # allocation spans two pages, then reference to farmost one can # be punishable by SEGV. But page walking can do good even on # other OSes, because it guarantees that villain thread hits # the guard page before it can make damage to innocent one... sub %r10,%r11 and \$-4096,%r11 lea (%r10,%r11),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul_page_walk jmp .Lmul_page_walk_done .Lmul_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r11 cmp %r10,%rsp ja .Lmul_page_walk .Lmul_page_walk_done: lea .Linc(%rip),%r10 mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp .cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 .Lmul_body: lea 128($bp),%r12 # reassign $bp (+size optimization) ___ $bp="%r12"; $STRIDE=2**5*8; # 5 is "window size" $N=$STRIDE/4; # should match cache line size $code.=<<___; movdqa 0(%r10),%xmm0 # 00000001000000010000000000000000 movdqa 16(%r10),%xmm1 # 00000002000000020000000200000002 lea 24-112(%rsp,$num,8),%r10# place the mask after tp[num+3] (+ICache optimization) and \$-16,%r10 pshufd \$0,%xmm5,%xmm5 # broadcast index movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 ___ ######################################################################## # calculate mask by comparing 0..31 to index and save result to stack # $code.=<<___; paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 .byte 0x67 movdqa %xmm4,%xmm3 ___ for($k=0;$k<$STRIDE/16-4;$k+=4) { $code.=<<___; paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 # compare to 3,2 movdqa %xmm0,`16*($k+0)+112`(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 # compare to 5,4 movdqa %xmm1,`16*($k+1)+112`(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 # compare to 7,6 movdqa %xmm2,`16*($k+2)+112`(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,`16*($k+3)+112`(%r10) movdqa %xmm4,%xmm3 ___ } $code.=<<___; # last iteration can be optimized paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,`16*($k+0)+112`(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,`16*($k+1)+112`(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,`16*($k+2)+112`(%r10) pand `16*($k+0)-128`($bp),%xmm0 # while it's still in register pand `16*($k+1)-128`($bp),%xmm1 pand `16*($k+2)-128`($bp),%xmm2 movdqa %xmm3,`16*($k+3)+112`(%r10) pand `16*($k+3)-128`($bp),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ for($k=0;$k<$STRIDE/16-4;$k+=4) { $code.=<<___; movdqa `16*($k+0)-128`($bp),%xmm4 movdqa `16*($k+1)-128`($bp),%xmm5 movdqa `16*($k+2)-128`($bp),%xmm2 pand `16*($k+0)+112`(%r10),%xmm4 movdqa `16*($k+3)-128`($bp),%xmm3 pand `16*($k+1)+112`(%r10),%xmm5 por %xmm4,%xmm0 pand `16*($k+2)+112`(%r10),%xmm2 por %xmm5,%xmm1 pand `16*($k+3)+112`(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ } $code.=<<___; por %xmm1,%xmm0 pshufd \$0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[0] mov ($n0),$n0 # pull n0[0] value mov ($ap),%rax xor $i,$i # i=0 xor $j,$j # j=0 mov $n0,$m1 mulq $m0 # ap[0]*bp[0] mov %rax,$lo0 mov ($np),%rax imulq $lo0,$m1 # "tp[0]"*n0 mov %rdx,$hi0 mulq $m1 # np[0]*m1 add %rax,$lo0 # discarded mov 8($ap),%rax adc \$0,%rdx mov %rdx,$hi1 lea 1($j),$j # j++ jmp .L1st_enter .align 16 .L1st: add %rax,$hi1 mov ($ap,$j,8),%rax adc \$0,%rdx add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] mov $lo0,$hi0 adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 .L1st_enter: mulq $m0 # ap[j]*bp[0] add %rax,$hi0 mov ($np,$j,8),%rax adc \$0,%rdx lea 1($j),$j # j++ mov %rdx,$lo0 mulq $m1 # np[j]*m1 cmp $num,$j jne .L1st # note that upon exit $j==$num, so # they can be used interchangeably add %rax,$hi1 adc \$0,%rdx add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $hi1,-16(%rsp,$num,8) # tp[num-1] mov %rdx,$hi1 mov $lo0,$hi0 xor %rdx,%rdx add $hi0,$hi1 adc \$0,%rdx mov $hi1,-8(%rsp,$num,8) mov %rdx,(%rsp,$num,8) # store upmost overflow bit lea 1($i),$i # i++ jmp .Louter .align 16 .Louter: lea 24+128(%rsp,$num,8),%rdx # where 256-byte mask is (+size optimization) and \$-16,%rdx pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 ___ for($k=0;$k<$STRIDE/16;$k+=4) { $code.=<<___; movdqa `16*($k+0)-128`($bp),%xmm0 movdqa `16*($k+1)-128`($bp),%xmm1 movdqa `16*($k+2)-128`($bp),%xmm2 movdqa `16*($k+3)-128`($bp),%xmm3 pand `16*($k+0)-128`(%rdx),%xmm0 pand `16*($k+1)-128`(%rdx),%xmm1 por %xmm0,%xmm4 pand `16*($k+2)-128`(%rdx),%xmm2 por %xmm1,%xmm5 pand `16*($k+3)-128`(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 ___ } $code.=<<___; por %xmm5,%xmm4 pshufd \$0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 lea $STRIDE($bp),$bp mov ($ap),%rax # ap[0] movq %xmm0,$m0 # m0=bp[i] xor $j,$j # j=0 mov $n0,$m1 mov (%rsp),$lo0 mulq $m0 # ap[0]*bp[i] add %rax,$lo0 # ap[0]*bp[i]+tp[0] mov ($np),%rax adc \$0,%rdx imulq $lo0,$m1 # tp[0]*n0 mov %rdx,$hi0 mulq $m1 # np[0]*m1 add %rax,$lo0 # discarded mov 8($ap),%rax adc \$0,%rdx mov 8(%rsp),$lo0 # tp[1] mov %rdx,$hi1 lea 1($j),$j # j++ jmp .Linner_enter .align 16 .Linner: add %rax,$hi1 mov ($ap,$j,8),%rax adc \$0,%rdx add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] mov (%rsp,$j,8),$lo0 adc \$0,%rdx mov $hi1,-16(%rsp,$j,8) # tp[j-1] mov %rdx,$hi1 .Linner_enter: mulq $m0 # ap[j]*bp[i] add %rax,$hi0 mov ($np,$j,8),%rax adc \$0,%rdx add $hi0,$lo0 # ap[j]*bp[i]+tp[j] mov %rdx,$hi0 adc \$0,$hi0 lea 1($j),$j # j++ mulq $m1 # np[j]*m1 cmp $num,$j jne .Linner # note that upon exit $j==$num, so # they can be used interchangeably add %rax,$hi1 adc \$0,%rdx add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] mov (%rsp,$num,8),$lo0 adc \$0,%rdx mov $hi1,-16(%rsp,$num,8) # tp[num-1] mov %rdx,$hi1 xor %rdx,%rdx add $hi0,$hi1 adc \$0,%rdx add $lo0,$hi1 # pull upmost overflow bit adc \$0,%rdx mov $hi1,-8(%rsp,$num,8) mov %rdx,(%rsp,$num,8) # store upmost overflow bit lea 1($i),$i # i++ cmp $num,$i jb .Louter xor $i,$i # i=0 and clear CF! mov (%rsp),%rax # tp[0] lea (%rsp),$ap # borrow ap for tp mov $num,$j # j=num jmp .Lsub .align 16 .Lsub: sbb ($np,$i,8),%rax mov %rax,($rp,$i,8) # rp[i]=tp[i]-np[i] mov 8($ap,$i,8),%rax # tp[i+1] lea 1($i),$i # i++ dec $j # doesn't affect CF! jnz .Lsub sbb \$0,%rax # handle upmost overflow bit mov \$-1,%rbx xor %rax,%rbx xor $i,$i mov $num,$j # j=num .Lcopy: # conditional copy mov ($rp,$i,8),%rcx mov (%rsp,$i,8),%rdx and %rbx,%rcx and %rax,%rdx mov $i,(%rsp,$i,8) # zap temporary vector or %rcx,%rdx mov %rdx,($rp,$i,8) # rp[i]=tp[i] lea 1($i),$i sub \$1,$j jnz .Lcopy mov 8(%rsp,$num,8),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul_epilogue: ret .cfi_endproc .size GFp_bn_mul_mont_gather5,.-GFp_bn_mul_mont_gather5 ___ {{{ my @A=("%r10","%r11"); my @N=("%r13","%rdi"); $code.=<<___; .type bn_mul4x_mont_gather5,\@function,6 .align 32 bn_mul4x_mont_gather5: .cfi_startproc .byte 0x67 mov %rsp,%rax .cfi_def_cfa_register %rax .Lmul4x_enter: ___ $code.=<<___ if ($addx); and \$0x80108,%r11d cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 je .Lmulx4x_enter ___ $code.=<<___; push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lmul4x_prologue: .byte 0x67 shl \$3,${num}d # convert $num to bytes lea ($num,$num,2),%r10 # 3*$num in bytes neg $num # -$num ############################################################## # Ensure that stack frame doesn't alias with $rptr+3*$num # modulo 4096, which covers ret[num], am[num] and n[num] # (see bn_exp.c). This is done to allow memory disambiguation # logic do its magic. [Extra [num] is allocated in order # to align with GFp_bn_power5's frame, which is cleansed after # completing exponentiation. Extra 256 bytes is for power mask # calculated from 7th argument, the index.] # lea -320(%rsp,$num,2),%r11 mov %rsp,%rbp sub $rp,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lmul4xsp_alt sub %r11,%rbp # align with $rp lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) jmp .Lmul4xsp_done .align 32 .Lmul4xsp_alt: lea 4096-320(,$num,2),%r10 lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lmul4xsp_done: and \$-64,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmul4x_page_walk jmp .Lmul4x_page_walk_done .Lmul4x_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmul4x_page_walk .Lmul4x_page_walk_done: neg $num mov %rax,40(%rsp) .cfi_cfa_expression %rsp+40,deref,+8 .Lmul4x_body: call mul4x_internal mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul4x_epilogue: ret .cfi_endproc .size bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5 .type mul4x_internal,\@abi-omnipotent .align 32 mul4x_internal: .cfi_startproc shl \$5,$num # $num was in bytes movd `($win64?56:8)`(%rax),%xmm5 # load 7th argument, index lea .Linc(%rip),%rax lea 128(%rdx,$num),%r13 # end of powers table (+size optimization) shr \$5,$num # restore $num ___ $bp="%r12"; $STRIDE=2**5*8; # 5 is "window size" $N=$STRIDE/4; # should match cache line size $tp=$i; $code.=<<___; movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 lea 88-112(%rsp,$num),%r10 # place the mask after tp[num+1] (+ICache optimization) lea 128(%rdx),$bp # size optimization pshufd \$0,%xmm5,%xmm5 # broadcast index movdqa %xmm1,%xmm4 .byte 0x67,0x67 movdqa %xmm1,%xmm2 ___ ######################################################################## # calculate mask by comparing 0..31 to index and save result to stack # $code.=<<___; paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 .byte 0x67 movdqa %xmm4,%xmm3 ___ for($i=0;$i<$STRIDE/16-4;$i+=4) { $code.=<<___; paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 # compare to 3,2 movdqa %xmm0,`16*($i+0)+112`(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 # compare to 5,4 movdqa %xmm1,`16*($i+1)+112`(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 # compare to 7,6 movdqa %xmm2,`16*($i+2)+112`(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,`16*($i+3)+112`(%r10) movdqa %xmm4,%xmm3 ___ } $code.=<<___; # last iteration can be optimized paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,`16*($i+0)+112`(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,`16*($i+1)+112`(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,`16*($i+2)+112`(%r10) pand `16*($i+0)-128`($bp),%xmm0 # while it's still in register pand `16*($i+1)-128`($bp),%xmm1 pand `16*($i+2)-128`($bp),%xmm2 movdqa %xmm3,`16*($i+3)+112`(%r10) pand `16*($i+3)-128`($bp),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ for($i=0;$i<$STRIDE/16-4;$i+=4) { $code.=<<___; movdqa `16*($i+0)-128`($bp),%xmm4 movdqa `16*($i+1)-128`($bp),%xmm5 movdqa `16*($i+2)-128`($bp),%xmm2 pand `16*($i+0)+112`(%r10),%xmm4 movdqa `16*($i+3)-128`($bp),%xmm3 pand `16*($i+1)+112`(%r10),%xmm5 por %xmm4,%xmm0 pand `16*($i+2)+112`(%r10),%xmm2 por %xmm5,%xmm1 pand `16*($i+3)+112`(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ } $code.=<<___; por %xmm1,%xmm0 pshufd \$0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[0] mov %r13,16+8(%rsp) # save end of b[num] mov $rp, 56+8(%rsp) # save $rp mov ($n0),$n0 # pull n0[0] value mov ($ap),%rax lea ($ap,$num),$ap # end of a[num] neg $num mov $n0,$m1 mulq $m0 # ap[0]*bp[0] mov %rax,$A[0] mov ($np),%rax imulq $A[0],$m1 # "tp[0]"*n0 lea 64+8(%rsp),$tp mov %rdx,$A[1] mulq $m1 # np[0]*m1 add %rax,$A[0] # discarded mov 8($ap,$num),%rax adc \$0,%rdx mov %rdx,$N[1] mulq $m0 add %rax,$A[1] mov 8*1($np),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 add %rax,$N[1] mov 16($ap,$num),%rax adc \$0,%rdx add $A[1],$N[1] lea 4*8($num),$j # j=4 lea 8*4($np),$np adc \$0,%rdx mov $N[1],($tp) mov %rdx,$N[0] jmp .L1st4x .align 32 .L1st4x: mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov -8*2($np),%rax lea 32($tp),$tp adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-24($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov -8*1($np),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$j),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[1],-16($tp) # tp[j-1] mov %rdx,$N[0] mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov 8*0($np),%rax adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov 8($ap,$j),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-8($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov 8*1($np),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov 16($ap,$j),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] lea 8*4($np),$np adc \$0,%rdx mov $N[1],($tp) # tp[j-1] mov %rdx,$N[0] add \$32,$j # j+=4 jnz .L1st4x mulq $m0 # ap[j]*bp[0] add %rax,$A[0] mov -8*2($np),%rax lea 32($tp),$tp adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap),%rax adc \$0,%rdx add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[0],-24($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[0] add %rax,$A[1] mov -8*1($np),%rax adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$num),%rax # ap[0] adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] adc \$0,%rdx mov $N[1],-16($tp) # tp[j-1] mov %rdx,$N[0] lea ($np,$num),$np # rewind $np xor $N[1],$N[1] add $A[0],$N[0] adc \$0,$N[1] mov $N[0],-8($tp) jmp .Louter4x .align 32 .Louter4x: lea 16+128($tp),%rdx # where 256-byte mask is (+size optimization) pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 ___ for($i=0;$i<$STRIDE/16;$i+=4) { $code.=<<___; movdqa `16*($i+0)-128`($bp),%xmm0 movdqa `16*($i+1)-128`($bp),%xmm1 movdqa `16*($i+2)-128`($bp),%xmm2 movdqa `16*($i+3)-128`($bp),%xmm3 pand `16*($i+0)-128`(%rdx),%xmm0 pand `16*($i+1)-128`(%rdx),%xmm1 por %xmm0,%xmm4 pand `16*($i+2)-128`(%rdx),%xmm2 por %xmm1,%xmm5 pand `16*($i+3)-128`(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 ___ } $code.=<<___; por %xmm5,%xmm4 pshufd \$0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[i] mov ($tp,$num),$A[0] mov $n0,$m1 mulq $m0 # ap[0]*bp[i] add %rax,$A[0] # ap[0]*bp[i]+tp[0] mov ($np),%rax adc \$0,%rdx imulq $A[0],$m1 # tp[0]*n0 mov %rdx,$A[1] mov $N[1],($tp) # store upmost overflow bit lea ($tp,$num),$tp # rewind $tp mulq $m1 # np[0]*m1 add %rax,$A[0] # "$N[0]", discarded mov 8($ap,$num),%rax adc \$0,%rdx mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov 8*1($np),%rax adc \$0,%rdx add 8($tp),$A[1] # +tp[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov 16($ap,$num),%rax adc \$0,%rdx add $A[1],$N[1] # np[j]*m1+ap[j]*bp[i]+tp[j] lea 4*8($num),$j # j=4 lea 8*4($np),$np adc \$0,%rdx mov %rdx,$N[0] jmp .Linner4x .align 32 .Linner4x: mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov -8*2($np),%rax adc \$0,%rdx add 16($tp),$A[0] # ap[j]*bp[i]+tp[j] lea 32($tp),$tp adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap,$j),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[1],-32($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov -8*1($np),%rax adc \$0,%rdx add -8($tp),$A[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$j),%rax adc \$0,%rdx add $A[1],$N[1] adc \$0,%rdx mov $N[0],-24($tp) # tp[j-1] mov %rdx,$N[0] mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov 8*0($np),%rax adc \$0,%rdx add ($tp),$A[0] # ap[j]*bp[i]+tp[j] adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov 8($ap,$j),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[1],-16($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov 8*1($np),%rax adc \$0,%rdx add 8($tp),$A[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov 16($ap,$j),%rax adc \$0,%rdx add $A[1],$N[1] lea 8*4($np),$np adc \$0,%rdx mov $N[0],-8($tp) # tp[j-1] mov %rdx,$N[0] add \$32,$j # j+=4 jnz .Linner4x mulq $m0 # ap[j]*bp[i] add %rax,$A[0] mov -8*2($np),%rax adc \$0,%rdx add 16($tp),$A[0] # ap[j]*bp[i]+tp[j] lea 32($tp),$tp adc \$0,%rdx mov %rdx,$A[1] mulq $m1 # np[j]*m1 add %rax,$N[0] mov -8($ap),%rax adc \$0,%rdx add $A[0],$N[0] adc \$0,%rdx mov $N[1],-32($tp) # tp[j-1] mov %rdx,$N[1] mulq $m0 # ap[j]*bp[i] add %rax,$A[1] mov $m1,%rax mov -8*1($np),$m1 adc \$0,%rdx add -8($tp),$A[1] adc \$0,%rdx mov %rdx,$A[0] mulq $m1 # np[j]*m1 add %rax,$N[1] mov ($ap,$num),%rax # ap[0] adc \$0,%rdx add $A[1],$N[1] adc \$0,%rdx mov $N[0],-24($tp) # tp[j-1] mov %rdx,$N[0] mov $N[1],-16($tp) # tp[j-1] lea ($np,$num),$np # rewind $np xor $N[1],$N[1] add $A[0],$N[0] adc \$0,$N[1] add ($tp),$N[0] # pull upmost overflow bit adc \$0,$N[1] # upmost overflow bit mov $N[0],-8($tp) cmp 16+8(%rsp),$bp jb .Louter4x ___ if (1) { $code.=<<___; xor %rax,%rax sub $N[0],$m1 # compare top-most words adc $j,$j # $j is zero or $j,$N[1] sub $N[1],%rax # %rax=-$N[1] lea ($tp,$num),%rbx # tptr in .sqr4x_sub mov ($np),%r12 lea ($np),%rbp # nptr in .sqr4x_sub mov %r9,%rcx sar \$3+2,%rcx mov 56+8(%rsp),%rdi # rptr in .sqr4x_sub dec %r12 # so that after 'not' we get -n[0] xor %r10,%r10 mov 8*1(%rbp),%r13 mov 8*2(%rbp),%r14 mov 8*3(%rbp),%r15 jmp .Lsqr4x_sub_entry ___ } else { my @ri=("%rax",$bp,$m0,$m1); my $rp="%rdx"; $code.=<<___ xor \$1,$N[1] lea ($tp,$num),$tp # rewind $tp sar \$5,$num # cf=0 lea ($np,$N[1],8),$np mov 56+8(%rsp),$rp # restore $rp jmp .Lsub4x .align 32 .Lsub4x: .byte 0x66 mov 8*0($tp),@ri[0] mov 8*1($tp),@ri[1] .byte 0x66 sbb 16*0($np),@ri[0] mov 8*2($tp),@ri[2] sbb 16*1($np),@ri[1] mov 3*8($tp),@ri[3] lea 4*8($tp),$tp sbb 16*2($np),@ri[2] mov @ri[0],8*0($rp) sbb 16*3($np),@ri[3] lea 16*4($np),$np mov @ri[1],8*1($rp) mov @ri[2],8*2($rp) mov @ri[3],8*3($rp) lea 8*4($rp),$rp inc $num jnz .Lsub4x ret ___ } $code.=<<___; .cfi_endproc .size mul4x_internal,.-mul4x_internal ___ }}} {{{ ###################################################################### # void GFp_bn_power5( my $rptr="%rdi"; # BN_ULONG *rptr, my $aptr="%rsi"; # const BN_ULONG *aptr, my $bptr="%rdx"; # const void *table, my $nptr="%rcx"; # const BN_ULONG *nptr, my $n0 ="%r8"; # const BN_ULONG *n0); my $num ="%r9"; # int num, has to be divisible by 8 # int pwr my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); my @A0=("%r10","%r11"); my @A1=("%r12","%r13"); my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); $code.=<<___; .globl GFp_bn_power5 .type GFp_bn_power5,\@function,6 .align 32 GFp_bn_power5: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip),%r11 mov 8(%r11),%r11d and \$0x80108,%r11d cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 je .Lpowerx5_enter ___ $code.=<<___; push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lpower5_prologue: shl \$3,${num}d # convert $num to bytes lea ($num,$num,2),%r10d # 3*$num neg $num mov ($n0),$n0 # *n0 ############################################################## # Ensure that stack frame doesn't alias with $rptr+3*$num # modulo 4096, which covers ret[num], am[num] and n[num] # (see bn_exp.c). This is done to allow memory disambiguation # logic do its magic. [Extra 256 bytes is for power mask # calculated from 7th argument, the index.] # lea -320(%rsp,$num,2),%r11 mov %rsp,%rbp sub $rptr,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lpwr_sp_alt sub %r11,%rbp # align with $aptr lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) jmp .Lpwr_sp_done .align 32 .Lpwr_sp_alt: lea 4096-320(,$num,2),%r10 lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lpwr_sp_done: and \$-64,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lpwr_page_walk jmp .Lpwr_page_walk_done .Lpwr_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lpwr_page_walk .Lpwr_page_walk_done: mov $num,%r10 neg $num ############################################################## # Stack layout # # +0 saved $num, used in reduction section # +8 &t[2*$num], used in reduction section # +32 saved *n0 # +40 saved %rsp # +48 t[2*$num] # mov $n0, 32(%rsp) mov %rax, 40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 .Lpower5_body: movq $rptr,%xmm1 # save $rptr, used in sqr8x movq $nptr,%xmm2 # save $nptr movq %r10, %xmm3 # -$num, used in sqr8x movq $bptr,%xmm4 call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal movq %xmm2,$nptr movq %xmm4,$bptr mov $aptr,$rptr mov 40(%rsp),%rax lea 32(%rsp),$n0 call mul4x_internal mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpower5_epilogue: ret .cfi_endproc .size GFp_bn_power5,.-GFp_bn_power5 .globl GFp_bn_sqr8x_internal .hidden GFp_bn_sqr8x_internal .type GFp_bn_sqr8x_internal,\@abi-omnipotent .align 32 GFp_bn_sqr8x_internal: __bn_sqr8x_internal: .cfi_startproc ############################################################## # Squaring part: # # a) multiply-n-add everything but a[i]*a[i]; # b) shift result of a) by 1 to the left and accumulate # a[i]*a[i] products; # ############################################################## # a[1]a[0] # a[2]a[0] # a[3]a[0] # a[2]a[1] # a[4]a[0] # a[3]a[1] # a[5]a[0] # a[4]a[1] # a[3]a[2] # a[6]a[0] # a[5]a[1] # a[4]a[2] # a[7]a[0] # a[6]a[1] # a[5]a[2] # a[4]a[3] # a[7]a[1] # a[6]a[2] # a[5]a[3] # a[7]a[2] # a[6]a[3] # a[5]a[4] # a[7]a[3] # a[6]a[4] # a[7]a[4] # a[6]a[5] # a[7]a[5] # a[7]a[6] # a[1]a[0] # a[2]a[0] # a[3]a[0] # a[4]a[0] # a[5]a[0] # a[6]a[0] # a[7]a[0] # a[2]a[1] # a[3]a[1] # a[4]a[1] # a[5]a[1] # a[6]a[1] # a[7]a[1] # a[3]a[2] # a[4]a[2] # a[5]a[2] # a[6]a[2] # a[7]a[2] # a[4]a[3] # a[5]a[3] # a[6]a[3] # a[7]a[3] # a[5]a[4] # a[6]a[4] # a[7]a[4] # a[6]a[5] # a[7]a[5] # a[7]a[6] # a[0]a[0] # a[1]a[1] # a[2]a[2] # a[3]a[3] # a[4]a[4] # a[5]a[5] # a[6]a[6] # a[7]a[7] lea 32(%r10),$i # $i=-($num-32) lea ($aptr,$num),$aptr # end of a[] buffer, ($aptr,$i)=&ap[2] mov $num,$j # $j=$num # comments apply to $num==8 case mov -32($aptr,$i),$a0 # a[0] lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] mov -24($aptr,$i),%rax # a[1] lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] mov -16($aptr,$i),$ai # a[2] mov %rax,$a1 mul $a0 # a[1]*a[0] mov %rax,$A0[0] # a[1]*a[0] mov $ai,%rax # a[2] mov %rdx,$A0[1] mov $A0[0],-24($tptr,$i) # t[1] mul $a0 # a[2]*a[0] add %rax,$A0[1] mov $ai,%rax adc \$0,%rdx mov $A0[1],-16($tptr,$i) # t[2] mov %rdx,$A0[0] mov -8($aptr,$i),$ai # a[3] mul $a1 # a[2]*a[1] mov %rax,$A1[0] # a[2]*a[1]+t[3] mov $ai,%rax mov %rdx,$A1[1] lea ($i),$j mul $a0 # a[3]*a[0] add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] mov $ai,%rax mov %rdx,$A0[1] adc \$0,$A0[1] add $A1[0],$A0[0] adc \$0,$A0[1] mov $A0[0],-8($tptr,$j) # t[3] jmp .Lsqr4x_1st .align 32 .Lsqr4x_1st: mov ($aptr,$j),$ai # a[4] mul $a1 # a[3]*a[1] add %rax,$A1[1] # a[3]*a[1]+t[4] mov $ai,%rax mov %rdx,$A1[0] adc \$0,$A1[0] mul $a0 # a[4]*a[0] add %rax,$A0[1] # a[4]*a[0]+a[3]*a[1]+t[4] mov $ai,%rax # a[3] mov 8($aptr,$j),$ai # a[5] mov %rdx,$A0[0] adc \$0,$A0[0] add $A1[1],$A0[1] adc \$0,$A0[0] mul $a1 # a[4]*a[3] add %rax,$A1[0] # a[4]*a[3]+t[5] mov $ai,%rax mov $A0[1],($tptr,$j) # t[4] mov %rdx,$A1[1] adc \$0,$A1[1] mul $a0 # a[5]*a[2] add %rax,$A0[0] # a[5]*a[2]+a[4]*a[3]+t[5] mov $ai,%rax mov 16($aptr,$j),$ai # a[6] mov %rdx,$A0[1] adc \$0,$A0[1] add $A1[0],$A0[0] adc \$0,$A0[1] mul $a1 # a[5]*a[3] add %rax,$A1[1] # a[5]*a[3]+t[6] mov $ai,%rax mov $A0[0],8($tptr,$j) # t[5] mov %rdx,$A1[0] adc \$0,$A1[0] mul $a0 # a[6]*a[2] add %rax,$A0[1] # a[6]*a[2]+a[5]*a[3]+t[6] mov $ai,%rax # a[3] mov 24($aptr,$j),$ai # a[7] mov %rdx,$A0[0] adc \$0,$A0[0] add $A1[1],$A0[1] adc \$0,$A0[0] mul $a1 # a[6]*a[5] add %rax,$A1[0] # a[6]*a[5]+t[7] mov $ai,%rax mov $A0[1],16($tptr,$j) # t[6] mov %rdx,$A1[1] adc \$0,$A1[1] lea 32($j),$j mul $a0 # a[7]*a[4] add %rax,$A0[0] # a[7]*a[4]+a[6]*a[5]+t[6] mov $ai,%rax mov %rdx,$A0[1] adc \$0,$A0[1] add $A1[0],$A0[0] adc \$0,$A0[1] mov $A0[0],-8($tptr,$j) # t[7] cmp \$0,$j jne .Lsqr4x_1st mul $a1 # a[7]*a[5] add %rax,$A1[1] lea 16($i),$i adc \$0,%rdx add $A0[1],$A1[1] adc \$0,%rdx mov $A1[1],($tptr) # t[8] mov %rdx,$A1[0] mov %rdx,8($tptr) # t[9] jmp .Lsqr4x_outer .align 32 .Lsqr4x_outer: # comments apply to $num==6 case mov -32($aptr,$i),$a0 # a[0] lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] mov -24($aptr,$i),%rax # a[1] lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] mov -16($aptr,$i),$ai # a[2] mov %rax,$a1 mul $a0 # a[1]*a[0] mov -24($tptr,$i),$A0[0] # t[1] add %rax,$A0[0] # a[1]*a[0]+t[1] mov $ai,%rax # a[2] adc \$0,%rdx mov $A0[0],-24($tptr,$i) # t[1] mov %rdx,$A0[1] mul $a0 # a[2]*a[0] add %rax,$A0[1] mov $ai,%rax adc \$0,%rdx add -16($tptr,$i),$A0[1] # a[2]*a[0]+t[2] mov %rdx,$A0[0] adc \$0,$A0[0] mov $A0[1],-16($tptr,$i) # t[2] xor $A1[0],$A1[0] mov -8($aptr,$i),$ai # a[3] mul $a1 # a[2]*a[1] add %rax,$A1[0] # a[2]*a[1]+t[3] mov $ai,%rax adc \$0,%rdx add -8($tptr,$i),$A1[0] mov %rdx,$A1[1] adc \$0,$A1[1] mul $a0 # a[3]*a[0] add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] mov $ai,%rax adc \$0,%rdx add $A1[0],$A0[0] mov %rdx,$A0[1] adc \$0,$A0[1] mov $A0[0],-8($tptr,$i) # t[3] lea ($i),$j jmp .Lsqr4x_inner .align 32 .Lsqr4x_inner: mov ($aptr,$j),$ai # a[4] mul $a1 # a[3]*a[1] add %rax,$A1[1] # a[3]*a[1]+t[4] mov $ai,%rax mov %rdx,$A1[0] adc \$0,$A1[0] add ($tptr,$j),$A1[1] adc \$0,$A1[0] .byte 0x67 mul $a0 # a[4]*a[0] add %rax,$A0[1] # a[4]*a[0]+a[3]*a[1]+t[4] mov $ai,%rax # a[3] mov 8($aptr,$j),$ai # a[5] mov %rdx,$A0[0] adc \$0,$A0[0] add $A1[1],$A0[1] adc \$0,$A0[0] mul $a1 # a[4]*a[3] add %rax,$A1[0] # a[4]*a[3]+t[5] mov $A0[1],($tptr,$j) # t[4] mov $ai,%rax mov %rdx,$A1[1] adc \$0,$A1[1] add 8($tptr,$j),$A1[0] lea 16($j),$j # j++ adc \$0,$A1[1] mul $a0 # a[5]*a[2] add %rax,$A0[0] # a[5]*a[2]+a[4]*a[3]+t[5] mov $ai,%rax adc \$0,%rdx add $A1[0],$A0[0] mov %rdx,$A0[1] adc \$0,$A0[1] mov $A0[0],-8($tptr,$j) # t[5], "preloaded t[1]" below cmp \$0,$j jne .Lsqr4x_inner .byte 0x67 mul $a1 # a[5]*a[3] add %rax,$A1[1] adc \$0,%rdx add $A0[1],$A1[1] adc \$0,%rdx mov $A1[1],($tptr) # t[6], "preloaded t[2]" below mov %rdx,$A1[0] mov %rdx,8($tptr) # t[7], "preloaded t[3]" below add \$16,$i jnz .Lsqr4x_outer # comments apply to $num==4 case mov -32($aptr),$a0 # a[0] lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] mov -24($aptr),%rax # a[1] lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] mov -16($aptr),$ai # a[2] mov %rax,$a1 mul $a0 # a[1]*a[0] add %rax,$A0[0] # a[1]*a[0]+t[1], preloaded t[1] mov $ai,%rax # a[2] mov %rdx,$A0[1] adc \$0,$A0[1] mul $a0 # a[2]*a[0] add %rax,$A0[1] mov $ai,%rax mov $A0[0],-24($tptr) # t[1] mov %rdx,$A0[0] adc \$0,$A0[0] add $A1[1],$A0[1] # a[2]*a[0]+t[2], preloaded t[2] mov -8($aptr),$ai # a[3] adc \$0,$A0[0] mul $a1 # a[2]*a[1] add %rax,$A1[0] # a[2]*a[1]+t[3], preloaded t[3] mov $ai,%rax mov $A0[1],-16($tptr) # t[2] mov %rdx,$A1[1] adc \$0,$A1[1] mul $a0 # a[3]*a[0] add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] mov $ai,%rax mov %rdx,$A0[1] adc \$0,$A0[1] add $A1[0],$A0[0] adc \$0,$A0[1] mov $A0[0],-8($tptr) # t[3] mul $a1 # a[3]*a[1] add %rax,$A1[1] mov -16($aptr),%rax # a[2] adc \$0,%rdx add $A0[1],$A1[1] adc \$0,%rdx mov $A1[1],($tptr) # t[4] mov %rdx,$A1[0] mov %rdx,8($tptr) # t[5] mul $ai # a[2]*a[3] ___ { my ($shift,$carry)=($a0,$a1); my @S=(@A1,$ai,$n0); $code.=<<___; add \$16,$i xor $shift,$shift sub $num,$i # $i=16-$num xor $carry,$carry add $A1[0],%rax # t[5] adc \$0,%rdx mov %rax,8($tptr) # t[5] mov %rdx,16($tptr) # t[6] mov $carry,24($tptr) # t[7] mov -16($aptr,$i),%rax # a[0] lea 48+8(%rsp),$tptr xor $A0[0],$A0[0] # t[0] mov 8($tptr),$A0[1] # t[1] lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift shr \$63,$A0[0] lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[1] # | t[2*i]>>63 mov 16($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov 24($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[0] mov -8($aptr,$i),%rax # a[i+1] # prefetch mov $S[0],($tptr) adc %rdx,$S[1] lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift mov $S[1],8($tptr) sbb $carry,$carry # mov cf,$carry shr \$63,$A0[0] lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[3] # | t[2*i]>>63 mov 32($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov 40($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[2] mov 0($aptr,$i),%rax # a[i+1] # prefetch mov $S[2],16($tptr) adc %rdx,$S[3] lea 16($i),$i mov $S[3],24($tptr) sbb $carry,$carry # mov cf,$carry lea 64($tptr),$tptr jmp .Lsqr4x_shift_n_add .align 32 .Lsqr4x_shift_n_add: lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift shr \$63,$A0[0] lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[1] # | t[2*i]>>63 mov -16($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov -8($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[0] mov -8($aptr,$i),%rax # a[i+1] # prefetch mov $S[0],-32($tptr) adc %rdx,$S[1] lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift mov $S[1],-24($tptr) sbb $carry,$carry # mov cf,$carry shr \$63,$A0[0] lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[3] # | t[2*i]>>63 mov 0($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov 8($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[2] mov 0($aptr,$i),%rax # a[i+1] # prefetch mov $S[2],-16($tptr) adc %rdx,$S[3] lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift mov $S[3],-8($tptr) sbb $carry,$carry # mov cf,$carry shr \$63,$A0[0] lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[1] # | t[2*i]>>63 mov 16($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov 24($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[0] mov 8($aptr,$i),%rax # a[i+1] # prefetch mov $S[0],0($tptr) adc %rdx,$S[1] lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift mov $S[1],8($tptr) sbb $carry,$carry # mov cf,$carry shr \$63,$A0[0] lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[3] # | t[2*i]>>63 mov 32($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov 40($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[2] mov 16($aptr,$i),%rax # a[i+1] # prefetch mov $S[2],16($tptr) adc %rdx,$S[3] mov $S[3],24($tptr) sbb $carry,$carry # mov cf,$carry lea 64($tptr),$tptr add \$32,$i jnz .Lsqr4x_shift_n_add lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift .byte 0x67 shr \$63,$A0[0] lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[1] # | t[2*i]>>63 mov -16($tptr),$A0[0] # t[2*i+2] # prefetch mov $A0[1],$shift # shift=t[2*i+1]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf mov -8($tptr),$A0[1] # t[2*i+2+1] # prefetch adc %rax,$S[0] mov -8($aptr),%rax # a[i+1] # prefetch mov $S[0],-32($tptr) adc %rdx,$S[1] lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1|shift mov $S[1],-24($tptr) sbb $carry,$carry # mov cf,$carry shr \$63,$A0[0] lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | shr \$63,$A0[1] or $A0[0],$S[3] # | t[2*i]>>63 mul %rax # a[i]*a[i] neg $carry # mov $carry,cf adc %rax,$S[2] adc %rdx,$S[3] mov $S[2],-16($tptr) mov $S[3],-8($tptr) ___ } ###################################################################### # Montgomery reduction part, "word-by-word" algorithm. # # This new path is inspired by multiple submissions from Intel, by # Shay Gueron, Vlad Krasnov, Erdinc Ozturk, James Guilford, # Vinodh Gopal... { my ($nptr,$tptr,$carry,$m0)=("%rbp","%rdi","%rsi","%rbx"); $code.=<<___; movq %xmm2,$nptr __bn_sqr8x_reduction: xor %rax,%rax lea ($nptr,$num),%rcx # end of n[] lea 48+8(%rsp,$num,2),%rdx # end of t[] buffer mov %rcx,0+8(%rsp) lea 48+8(%rsp,$num),$tptr # end of initial t[] window mov %rdx,8+8(%rsp) neg $num jmp .L8x_reduction_loop .align 32 .L8x_reduction_loop: lea ($tptr,$num),$tptr # start of current t[] window .byte 0x66 mov 8*0($tptr),$m0 mov 8*1($tptr),%r9 mov 8*2($tptr),%r10 mov 8*3($tptr),%r11 mov 8*4($tptr),%r12 mov 8*5($tptr),%r13 mov 8*6($tptr),%r14 mov 8*7($tptr),%r15 mov %rax,(%rdx) # store top-most carry bit lea 8*8($tptr),$tptr .byte 0x67 mov $m0,%r8 imulq 32+8(%rsp),$m0 # n0*a[0] mov 8*0($nptr),%rax # n[0] mov \$8,%ecx jmp .L8x_reduce .align 32 .L8x_reduce: mulq $m0 mov 8*1($nptr),%rax # n[1] neg %r8 mov %rdx,%r8 adc \$0,%r8 mulq $m0 add %rax,%r9 mov 8*2($nptr),%rax adc \$0,%rdx add %r9,%r8 mov $m0,48-8+8(%rsp,%rcx,8) # put aside n0*a[i] mov %rdx,%r9 adc \$0,%r9 mulq $m0 add %rax,%r10 mov 8*3($nptr),%rax adc \$0,%rdx add %r10,%r9 mov 32+8(%rsp),$carry # pull n0, borrow $carry mov %rdx,%r10 adc \$0,%r10 mulq $m0 add %rax,%r11 mov 8*4($nptr),%rax adc \$0,%rdx imulq %r8,$carry # modulo-scheduled add %r11,%r10 mov %rdx,%r11 adc \$0,%r11 mulq $m0 add %rax,%r12 mov 8*5($nptr),%rax adc \$0,%rdx add %r12,%r11 mov %rdx,%r12 adc \$0,%r12 mulq $m0 add %rax,%r13 mov 8*6($nptr),%rax adc \$0,%rdx add %r13,%r12 mov %rdx,%r13 adc \$0,%r13 mulq $m0 add %rax,%r14 mov 8*7($nptr),%rax adc \$0,%rdx add %r14,%r13 mov %rdx,%r14 adc \$0,%r14 mulq $m0 mov $carry,$m0 # n0*a[i] add %rax,%r15 mov 8*0($nptr),%rax # n[0] adc \$0,%rdx add %r15,%r14 mov %rdx,%r15 adc \$0,%r15 dec %ecx jnz .L8x_reduce lea 8*8($nptr),$nptr xor %rax,%rax mov 8+8(%rsp),%rdx # pull end of t[] cmp 0+8(%rsp),$nptr # end of n[]? jae .L8x_no_tail .byte 0x66 add 8*0($tptr),%r8 adc 8*1($tptr),%r9 adc 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 sbb $carry,$carry # top carry mov 48+56+8(%rsp),$m0 # pull n0*a[0] mov \$8,%ecx mov 8*0($nptr),%rax jmp .L8x_tail .align 32 .L8x_tail: mulq $m0 add %rax,%r8 mov 8*1($nptr),%rax mov %r8,($tptr) # save result mov %rdx,%r8 adc \$0,%r8 mulq $m0 add %rax,%r9 mov 8*2($nptr),%rax adc \$0,%rdx add %r9,%r8 lea 8($tptr),$tptr # $tptr++ mov %rdx,%r9 adc \$0,%r9 mulq $m0 add %rax,%r10 mov 8*3($nptr),%rax adc \$0,%rdx add %r10,%r9 mov %rdx,%r10 adc \$0,%r10 mulq $m0 add %rax,%r11 mov 8*4($nptr),%rax adc \$0,%rdx add %r11,%r10 mov %rdx,%r11 adc \$0,%r11 mulq $m0 add %rax,%r12 mov 8*5($nptr),%rax adc \$0,%rdx add %r12,%r11 mov %rdx,%r12 adc \$0,%r12 mulq $m0 add %rax,%r13 mov 8*6($nptr),%rax adc \$0,%rdx add %r13,%r12 mov %rdx,%r13 adc \$0,%r13 mulq $m0 add %rax,%r14 mov 8*7($nptr),%rax adc \$0,%rdx add %r14,%r13 mov %rdx,%r14 adc \$0,%r14 mulq $m0 mov 48-16+8(%rsp,%rcx,8),$m0# pull n0*a[i] add %rax,%r15 adc \$0,%rdx add %r15,%r14 mov 8*0($nptr),%rax # pull n[0] mov %rdx,%r15 adc \$0,%r15 dec %ecx jnz .L8x_tail lea 8*8($nptr),$nptr mov 8+8(%rsp),%rdx # pull end of t[] cmp 0+8(%rsp),$nptr # end of n[]? jae .L8x_tail_done # break out of loop mov 48+56+8(%rsp),$m0 # pull n0*a[0] neg $carry mov 8*0($nptr),%rax # pull n[0] adc 8*0($tptr),%r8 adc 8*1($tptr),%r9 adc 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 sbb $carry,$carry # top carry mov \$8,%ecx jmp .L8x_tail .align 32 .L8x_tail_done: xor %rax,%rax add (%rdx),%r8 # can this overflow? adc \$0,%r9 adc \$0,%r10 adc \$0,%r11 adc \$0,%r12 adc \$0,%r13 adc \$0,%r14 adc \$0,%r15 adc \$0,%rax neg $carry .L8x_no_tail: adc 8*0($tptr),%r8 adc 8*1($tptr),%r9 adc 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 adc \$0,%rax # top-most carry mov -8($nptr),%rcx # np[num-1] xor $carry,$carry movq %xmm2,$nptr # restore $nptr mov %r8,8*0($tptr) # store top 512 bits mov %r9,8*1($tptr) movq %xmm3,$num # $num is %r9, can't be moved upwards mov %r10,8*2($tptr) mov %r11,8*3($tptr) mov %r12,8*4($tptr) mov %r13,8*5($tptr) mov %r14,8*6($tptr) mov %r15,8*7($tptr) lea 8*8($tptr),$tptr cmp %rdx,$tptr # end of t[]? jb .L8x_reduction_loop ret .cfi_endproc .size GFp_bn_sqr8x_internal,.-GFp_bn_sqr8x_internal ___ } ############################################################## # Post-condition, 4x unrolled # { my ($tptr,$nptr)=("%rbx","%rbp"); $code.=<<___; .type __bn_post4x_internal,\@abi-omnipotent .align 32 __bn_post4x_internal: .cfi_startproc mov 8*0($nptr),%r12 lea (%rdi,$num),$tptr # %rdi was $tptr above mov $num,%rcx movq %xmm1,$rptr # restore $rptr neg %rax movq %xmm1,$aptr # prepare for back-to-back call sar \$3+2,%rcx dec %r12 # so that after 'not' we get -n[0] xor %r10,%r10 mov 8*1($nptr),%r13 mov 8*2($nptr),%r14 mov 8*3($nptr),%r15 jmp .Lsqr4x_sub_entry .align 16 .Lsqr4x_sub: mov 8*0($nptr),%r12 mov 8*1($nptr),%r13 mov 8*2($nptr),%r14 mov 8*3($nptr),%r15 .Lsqr4x_sub_entry: lea 8*4($nptr),$nptr not %r12 not %r13 not %r14 not %r15 and %rax,%r12 and %rax,%r13 and %rax,%r14 and %rax,%r15 neg %r10 # mov %r10,%cf adc 8*0($tptr),%r12 adc 8*1($tptr),%r13 adc 8*2($tptr),%r14 adc 8*3($tptr),%r15 mov %r12,8*0($rptr) lea 8*4($tptr),$tptr mov %r13,8*1($rptr) sbb %r10,%r10 # mov %cf,%r10 mov %r14,8*2($rptr) mov %r15,8*3($rptr) lea 8*4($rptr),$rptr inc %rcx # pass %cf jnz .Lsqr4x_sub mov $num,%r10 # prepare for back-to-back call neg $num # restore $num ret .cfi_endproc .size __bn_post4x_internal,.-__bn_post4x_internal ___ } { $code.=<<___; .globl GFp_bn_from_montgomery .type GFp_bn_from_montgomery,\@abi-omnipotent .align 32 GFp_bn_from_montgomery: .cfi_startproc testl \$7,`($win64?"48(%rsp)":"%r9d")` jz bn_from_mont8x xor %eax,%eax ret .cfi_endproc .size GFp_bn_from_montgomery,.-GFp_bn_from_montgomery .type bn_from_mont8x,\@function,6 .align 32 bn_from_mont8x: .cfi_startproc .byte 0x67 mov %rsp,%rax .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lfrom_prologue: shl \$3,${num}d # convert $num to bytes lea ($num,$num,2),%r10 # 3*$num in bytes neg $num mov ($n0),$n0 # *n0 ############################################################## # Ensure that stack frame doesn't alias with $rptr+3*$num # modulo 4096, which covers ret[num], am[num] and n[num] # (see bn_exp.c). The stack is allocated to aligned with # GFp_bn_power5's frame, and as GFp_bn_from_montgomery happens to be # last operation, we use the opportunity to cleanse it. # lea -320(%rsp,$num,2),%r11 mov %rsp,%rbp sub $rptr,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lfrom_sp_alt sub %r11,%rbp # align with $aptr lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) jmp .Lfrom_sp_done .align 32 .Lfrom_sp_alt: lea 4096-320(,$num,2),%r10 lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lfrom_sp_done: and \$-64,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lfrom_page_walk jmp .Lfrom_page_walk_done .Lfrom_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lfrom_page_walk .Lfrom_page_walk_done: mov $num,%r10 neg $num ############################################################## # Stack layout # # +0 saved $num, used in reduction section # +8 &t[2*$num], used in reduction section # +32 saved *n0 # +40 saved %rsp # +48 t[2*$num] # mov $n0, 32(%rsp) mov %rax, 40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 .Lfrom_body: mov $num,%r11 lea 48(%rsp),%rax pxor %xmm0,%xmm0 jmp .Lmul_by_1 .align 32 .Lmul_by_1: movdqu ($aptr),%xmm1 movdqu 16($aptr),%xmm2 movdqu 32($aptr),%xmm3 movdqa %xmm0,(%rax,$num) movdqu 48($aptr),%xmm4 movdqa %xmm0,16(%rax,$num) .byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 # lea 64($aptr),$aptr movdqa %xmm1,(%rax) movdqa %xmm0,32(%rax,$num) movdqa %xmm2,16(%rax) movdqa %xmm0,48(%rax,$num) movdqa %xmm3,32(%rax) movdqa %xmm4,48(%rax) lea 64(%rax),%rax sub \$64,%r11 jnz .Lmul_by_1 movq $rptr,%xmm1 movq $nptr,%xmm2 .byte 0x67 mov $nptr,%rbp movq %r10, %xmm3 # -num ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip),%r11 mov 8(%r11),%r11d and \$0x80108,%r11d cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 jne .Lfrom_mont_nox lea (%rax,$num),$rptr call __bn_sqrx8x_reduction call __bn_postx4x_internal pxor %xmm0,%xmm0 lea 48(%rsp),%rax jmp .Lfrom_mont_zero .align 32 .Lfrom_mont_nox: ___ $code.=<<___; call __bn_sqr8x_reduction call __bn_post4x_internal pxor %xmm0,%xmm0 lea 48(%rsp),%rax jmp .Lfrom_mont_zero .align 32 .Lfrom_mont_zero: mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 movdqa %xmm0,16*0(%rax) movdqa %xmm0,16*1(%rax) movdqa %xmm0,16*2(%rax) movdqa %xmm0,16*3(%rax) lea 16*4(%rax),%rax sub \$32,$num jnz .Lfrom_mont_zero mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lfrom_epilogue: ret .cfi_endproc .size bn_from_mont8x,.-bn_from_mont8x ___ } }}} if ($addx) {{{ my $bp="%rdx"; # restore original value $code.=<<___; .type bn_mulx4x_mont_gather5,\@function,6 .align 32 bn_mulx4x_mont_gather5: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax .Lmulx4x_enter: push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lmulx4x_prologue: shl \$3,${num}d # convert $num to bytes lea ($num,$num,2),%r10 # 3*$num in bytes neg $num # -$num mov ($n0),$n0 # *n0 ############################################################## # Ensure that stack frame doesn't alias with $rptr+3*$num # modulo 4096, which covers ret[num], am[num] and n[num] # (see bn_exp.c). This is done to allow memory disambiguation # logic do its magic. [Extra [num] is allocated in order # to align with GFp_bn_power5's frame, which is cleansed after # completing exponentiation. Extra 256 bytes is for power mask # calculated from 7th argument, the index.] # lea -320(%rsp,$num,2),%r11 mov %rsp,%rbp sub $rp,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lmulx4xsp_alt sub %r11,%rbp # align with $aptr lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) jmp .Lmulx4xsp_done .Lmulx4xsp_alt: lea 4096-320(,$num,2),%r10 lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lmulx4xsp_done: and \$-64,%rbp # ensure alignment mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmulx4x_page_walk jmp .Lmulx4x_page_walk_done .Lmulx4x_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lmulx4x_page_walk .Lmulx4x_page_walk_done: ############################################################## # Stack layout # +0 -num # +8 off-loaded &b[i] # +16 end of b[num] # +24 inner counter # +32 saved n0 # +40 saved %rsp # +48 # +56 saved rp # +64 tmp[num+1] # mov $n0, 32(%rsp) # save *n0 mov %rax,40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 .Lmulx4x_body: call mulx4x_internal mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmulx4x_epilogue: ret .cfi_endproc .size bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5 .type mulx4x_internal,\@abi-omnipotent .align 32 mulx4x_internal: .cfi_startproc mov $num,8(%rsp) # save -$num (it was in bytes) mov $num,%r10 neg $num # restore $num shl \$5,$num neg %r10 # restore $num lea 128($bp,$num),%r13 # end of powers table (+size optimization) shr \$5+5,$num movd `($win64?56:8)`(%rax),%xmm5 # load 7th argument sub \$1,$num lea .Linc(%rip),%rax mov %r13,16+8(%rsp) # end of b[num] mov $num,24+8(%rsp) # inner counter mov $rp, 56+8(%rsp) # save $rp ___ my ($aptr, $bptr, $nptr, $tptr, $mi, $bi, $zero, $num)= ("%rsi","%rdi","%rcx","%rbx","%r8","%r9","%rbp","%rax"); my $rptr=$bptr; my $STRIDE=2**5*8; # 5 is "window size" my $N=$STRIDE/4; # should match cache line size $code.=<<___; movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 lea 88-112(%rsp,%r10),%r10 # place the mask after tp[num+1] (+ICache optimization) lea 128($bp),$bptr # size optimization pshufd \$0,%xmm5,%xmm5 # broadcast index movdqa %xmm1,%xmm4 .byte 0x67 movdqa %xmm1,%xmm2 ___ ######################################################################## # calculate mask by comparing 0..31 to index and save result to stack # $code.=<<___; .byte 0x67 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 movdqa %xmm4,%xmm3 ___ for($i=0;$i<$STRIDE/16-4;$i+=4) { $code.=<<___; paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 # compare to 3,2 movdqa %xmm0,`16*($i+0)+112`(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 # compare to 5,4 movdqa %xmm1,`16*($i+1)+112`(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 # compare to 7,6 movdqa %xmm2,`16*($i+2)+112`(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,`16*($i+3)+112`(%r10) movdqa %xmm4,%xmm3 ___ } $code.=<<___; # last iteration can be optimized .byte 0x67 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,`16*($i+0)+112`(%r10) paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,`16*($i+1)+112`(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,`16*($i+2)+112`(%r10) pand `16*($i+0)-128`($bptr),%xmm0 # while it's still in register pand `16*($i+1)-128`($bptr),%xmm1 pand `16*($i+2)-128`($bptr),%xmm2 movdqa %xmm3,`16*($i+3)+112`(%r10) pand `16*($i+3)-128`($bptr),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ for($i=0;$i<$STRIDE/16-4;$i+=4) { $code.=<<___; movdqa `16*($i+0)-128`($bptr),%xmm4 movdqa `16*($i+1)-128`($bptr),%xmm5 movdqa `16*($i+2)-128`($bptr),%xmm2 pand `16*($i+0)+112`(%r10),%xmm4 movdqa `16*($i+3)-128`($bptr),%xmm3 pand `16*($i+1)+112`(%r10),%xmm5 por %xmm4,%xmm0 pand `16*($i+2)+112`(%r10),%xmm2 por %xmm5,%xmm1 pand `16*($i+3)+112`(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 ___ } $code.=<<___; pxor %xmm1,%xmm0 pshufd \$0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 lea $STRIDE($bptr),$bptr movq %xmm0,%rdx # bp[0] lea 64+8*4+8(%rsp),$tptr mov %rdx,$bi mulx 0*8($aptr),$mi,%rax # a[0]*b[0] mulx 1*8($aptr),%r11,%r12 # a[1]*b[0] add %rax,%r11 mulx 2*8($aptr),%rax,%r13 # ... adc %rax,%r12 adc \$0,%r13 mulx 3*8($aptr),%rax,%r14 mov $mi,%r15 imulq 32+8(%rsp),$mi # "t[0]"*n0 xor $zero,$zero # cf=0, of=0 mov $mi,%rdx mov $bptr,8+8(%rsp) # off-load &b[i] lea 4*8($aptr),$aptr adcx %rax,%r13 adcx $zero,%r14 # cf=0 mulx 0*8($nptr),%rax,%r10 adcx %rax,%r15 # discarded adox %r11,%r10 mulx 1*8($nptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 mulx 2*8($nptr),%rax,%r12 mov 24+8(%rsp),$bptr # counter value mov %r10,-8*4($tptr) adcx %rax,%r11 adox %r13,%r12 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r11,-8*3($tptr) adcx %rax,%r12 adox $zero,%r15 # of=0 lea 4*8($nptr),$nptr mov %r12,-8*2($tptr) jmp .Lmulx4x_1st .align 32 .Lmulx4x_1st: adcx $zero,%r15 # cf=0, modulo-scheduled mulx 0*8($aptr),%r10,%rax # a[4]*b[0] adcx %r14,%r10 mulx 1*8($aptr),%r11,%r14 # a[5]*b[0] adcx %rax,%r11 mulx 2*8($aptr),%r12,%rax # ... adcx %r14,%r12 mulx 3*8($aptr),%r13,%r14 .byte 0x67,0x67 mov $mi,%rdx adcx %rax,%r13 adcx $zero,%r14 # cf=0 lea 4*8($aptr),$aptr lea 4*8($tptr),$tptr adox %r15,%r10 mulx 0*8($nptr),%rax,%r15 adcx %rax,%r10 adox %r15,%r11 mulx 1*8($nptr),%rax,%r15 adcx %rax,%r11 adox %r15,%r12 mulx 2*8($nptr),%rax,%r15 mov %r10,-5*8($tptr) adcx %rax,%r12 mov %r11,-4*8($tptr) adox %r15,%r13 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov %r12,-3*8($tptr) adcx %rax,%r13 adox $zero,%r15 lea 4*8($nptr),$nptr mov %r13,-2*8($tptr) dec $bptr # of=0, pass cf jnz .Lmulx4x_1st mov 8(%rsp),$num # load -num adc $zero,%r15 # modulo-scheduled lea ($aptr,$num),$aptr # rewind $aptr add %r15,%r14 mov 8+8(%rsp),$bptr # re-load &b[i] adc $zero,$zero # top-most carry mov %r14,-1*8($tptr) jmp .Lmulx4x_outer .align 32 .Lmulx4x_outer: lea 16-256($tptr),%r10 # where 256-byte mask is (+density control) pxor %xmm4,%xmm4 .byte 0x67,0x67 pxor %xmm5,%xmm5 ___ for($i=0;$i<$STRIDE/16;$i+=4) { $code.=<<___; movdqa `16*($i+0)-128`($bptr),%xmm0 movdqa `16*($i+1)-128`($bptr),%xmm1 movdqa `16*($i+2)-128`($bptr),%xmm2 pand `16*($i+0)+256`(%r10),%xmm0 movdqa `16*($i+3)-128`($bptr),%xmm3 pand `16*($i+1)+256`(%r10),%xmm1 por %xmm0,%xmm4 pand `16*($i+2)+256`(%r10),%xmm2 por %xmm1,%xmm5 pand `16*($i+3)+256`(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 ___ } $code.=<<___; por %xmm5,%xmm4 pshufd \$0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 lea $STRIDE($bptr),$bptr movq %xmm0,%rdx # m0=bp[i] mov $zero,($tptr) # save top-most carry lea 4*8($tptr,$num),$tptr # rewind $tptr mulx 0*8($aptr),$mi,%r11 # a[0]*b[i] xor $zero,$zero # cf=0, of=0 mov %rdx,$bi mulx 1*8($aptr),%r14,%r12 # a[1]*b[i] adox -4*8($tptr),$mi # +t[0] adcx %r14,%r11 mulx 2*8($aptr),%r15,%r13 # ... adox -3*8($tptr),%r11 adcx %r15,%r12 mulx 3*8($aptr),%rdx,%r14 adox -2*8($tptr),%r12 adcx %rdx,%r13 lea ($nptr,$num),$nptr # rewind $nptr lea 4*8($aptr),$aptr adox -1*8($tptr),%r13 adcx $zero,%r14 adox $zero,%r14 mov $mi,%r15 imulq 32+8(%rsp),$mi # "t[0]"*n0 mov $mi,%rdx xor $zero,$zero # cf=0, of=0 mov $bptr,8+8(%rsp) # off-load &b[i] mulx 0*8($nptr),%rax,%r10 adcx %rax,%r15 # discarded adox %r11,%r10 mulx 1*8($nptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 mulx 2*8($nptr),%rax,%r12 adcx %rax,%r11 adox %r13,%r12 mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx mov 24+8(%rsp),$bptr # counter value mov %r10,-8*4($tptr) adcx %rax,%r12 mov %r11,-8*3($tptr) adox $zero,%r15 # of=0 mov %r12,-8*2($tptr) lea 4*8($nptr),$nptr jmp .Lmulx4x_inner .align 32 .Lmulx4x_inner: mulx 0*8($aptr),%r10,%rax # a[4]*b[i] adcx $zero,%r15 # cf=0, modulo-scheduled adox %r14,%r10 mulx 1*8($aptr),%r11,%r14 # a[5]*b[i] adcx 0*8($tptr),%r10 adox %rax,%r11 mulx 2*8($aptr),%r12,%rax # ... adcx 1*8($tptr),%r11 adox %r14,%r12 mulx 3*8($aptr),%r13,%r14 mov $mi,%rdx adcx 2*8($tptr),%r12 adox %rax,%r13 adcx 3*8($tptr),%r13 adox $zero,%r14 # of=0 lea 4*8($aptr),$aptr lea 4*8($tptr),$tptr adcx $zero,%r14 # cf=0 adox %r15,%r10 mulx 0*8($nptr),%rax,%r15 adcx %rax,%r10 adox %r15,%r11 mulx 1*8($nptr),%rax,%r15 adcx %rax,%r11 adox %r15,%r12 mulx 2*8($nptr),%rax,%r15 mov %r10,-5*8($tptr) adcx %rax,%r12 adox %r15,%r13 mov %r11,-4*8($tptr) mulx 3*8($nptr),%rax,%r15 mov $bi,%rdx lea 4*8($nptr),$nptr mov %r12,-3*8($tptr) adcx %rax,%r13 adox $zero,%r15 mov %r13,-2*8($tptr) dec $bptr # of=0, pass cf jnz .Lmulx4x_inner mov 0+8(%rsp),$num # load -num adc $zero,%r15 # modulo-scheduled sub 0*8($tptr),$bptr # pull top-most carry to %cf mov 8+8(%rsp),$bptr # re-load &b[i] mov 16+8(%rsp),%r10 adc %r15,%r14 lea ($aptr,$num),$aptr # rewind $aptr adc $zero,$zero # top-most carry mov %r14,-1*8($tptr) cmp %r10,$bptr jb .Lmulx4x_outer mov -8($nptr),%r10 mov $zero,%r8 mov ($nptr,$num),%r12 lea ($nptr,$num),%rbp # rewind $nptr mov $num,%rcx lea ($tptr,$num),%rdi # rewind $tptr xor %eax,%eax xor %r15,%r15 sub %r14,%r10 # compare top-most words adc %r15,%r15 or %r15,%r8 sar \$3+2,%rcx sub %r8,%rax # %rax=-%r8 mov 56+8(%rsp),%rdx # restore rp dec %r12 # so that after 'not' we get -n[0] mov 8*1(%rbp),%r13 xor %r8,%r8 mov 8*2(%rbp),%r14 mov 8*3(%rbp),%r15 jmp .Lsqrx4x_sub_entry # common post-condition .cfi_endproc .size mulx4x_internal,.-mulx4x_internal ___ } { ###################################################################### # void GFp_bn_power5( my $rptr="%rdi"; # BN_ULONG *rptr, my $aptr="%rsi"; # const BN_ULONG *aptr, my $bptr="%rdx"; # const void *table, my $nptr="%rcx"; # const BN_ULONG *nptr, my $n0 ="%r8"; # const BN_ULONG *n0); my $num ="%r9"; # int num, has to be divisible by 8 # int pwr); my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); my @A0=("%r10","%r11"); my @A1=("%r12","%r13"); my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); $code.=<<___; .type bn_powerx5,\@function,6 .align 32 bn_powerx5: .cfi_startproc mov %rsp,%rax .cfi_def_cfa_register %rax .Lpowerx5_enter: push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lpowerx5_prologue: shl \$3,${num}d # convert $num to bytes lea ($num,$num,2),%r10 # 3*$num in bytes neg $num mov ($n0),$n0 # *n0 ############################################################## # Ensure that stack frame doesn't alias with $rptr+3*$num # modulo 4096, which covers ret[num], am[num] and n[num] # (see bn_exp.c). This is done to allow memory disambiguation # logic do its magic. [Extra 256 bytes is for power mask # calculated from 7th argument, the index.] # lea -320(%rsp,$num,2),%r11 mov %rsp,%rbp sub $rptr,%r11 and \$4095,%r11 cmp %r11,%r10 jb .Lpwrx_sp_alt sub %r11,%rbp # align with $aptr lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) jmp .Lpwrx_sp_done .align 32 .Lpwrx_sp_alt: lea 4096-320(,$num,2),%r10 lea -320(%rbp,$num,2),%rbp # alloca(frame+2*$num*8+256) sub %r10,%r11 mov \$0,%r10 cmovc %r10,%r11 sub %r11,%rbp .Lpwrx_sp_done: and \$-64,%rbp mov %rsp,%r11 sub %rbp,%r11 and \$-4096,%r11 lea (%rbp,%r11),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lpwrx_page_walk jmp .Lpwrx_page_walk_done .Lpwrx_page_walk: lea -4096(%rsp),%rsp mov (%rsp),%r10 cmp %rbp,%rsp ja .Lpwrx_page_walk .Lpwrx_page_walk_done: mov $num,%r10 neg $num ############################################################## # Stack layout # # +0 saved $num, used in reduction section # +8 &t[2*$num], used in reduction section # +16 intermediate carry bit # +24 top-most carry bit, used in reduction section # +32 saved *n0 # +40 saved %rsp # +48 t[2*$num] # pxor %xmm0,%xmm0 movq $rptr,%xmm1 # save $rptr movq $nptr,%xmm2 # save $nptr movq %r10, %xmm3 # -$num movq $bptr,%xmm4 mov $n0, 32(%rsp) mov %rax, 40(%rsp) # save original %rsp .cfi_cfa_expression %rsp+40,deref,+8 .Lpowerx5_body: call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal mov %r10,$num # -num mov $aptr,$rptr movq %xmm2,$nptr movq %xmm4,$bptr mov 40(%rsp),%rax call mulx4x_internal mov 40(%rsp),%rsi # restore %rsp .cfi_def_cfa %rsi,8 mov \$1,%rax mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpowerx5_epilogue: ret .cfi_endproc .size bn_powerx5,.-bn_powerx5 .globl GFp_bn_sqrx8x_internal .type GFp_bn_sqrx8x_internal,\@abi-omnipotent .align 32 GFp_bn_sqrx8x_internal: __bn_sqrx8x_internal: .cfi_startproc ################################################################## # Squaring part: # # a) multiply-n-add everything but a[i]*a[i]; # b) shift result of a) by 1 to the left and accumulate # a[i]*a[i] products; # ################################################################## # a[7]a[7]a[6]a[6]a[5]a[5]a[4]a[4]a[3]a[3]a[2]a[2]a[1]a[1]a[0]a[0] # a[1]a[0] # a[2]a[0] # a[3]a[0] # a[2]a[1] # a[3]a[1] # a[3]a[2] # # a[4]a[0] # a[5]a[0] # a[6]a[0] # a[7]a[0] # a[4]a[1] # a[5]a[1] # a[6]a[1] # a[7]a[1] # a[4]a[2] # a[5]a[2] # a[6]a[2] # a[7]a[2] # a[4]a[3] # a[5]a[3] # a[6]a[3] # a[7]a[3] # # a[5]a[4] # a[6]a[4] # a[7]a[4] # a[6]a[5] # a[7]a[5] # a[7]a[6] # a[7]a[7]a[6]a[6]a[5]a[5]a[4]a[4]a[3]a[3]a[2]a[2]a[1]a[1]a[0]a[0] ___ { my ($zero,$carry)=("%rbp","%rcx"); my $aaptr=$zero; $code.=<<___; lea 48+8(%rsp),$tptr lea ($aptr,$num),$aaptr mov $num,0+8(%rsp) # save $num mov $aaptr,8+8(%rsp) # save end of $aptr jmp .Lsqr8x_zero_start .align 32 .byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 .Lsqrx8x_zero: .byte 0x3e movdqa %xmm0,0*8($tptr) movdqa %xmm0,2*8($tptr) movdqa %xmm0,4*8($tptr) movdqa %xmm0,6*8($tptr) .Lsqr8x_zero_start: # aligned at 32 movdqa %xmm0,8*8($tptr) movdqa %xmm0,10*8($tptr) movdqa %xmm0,12*8($tptr) movdqa %xmm0,14*8($tptr) lea 16*8($tptr),$tptr sub \$64,$num jnz .Lsqrx8x_zero mov 0*8($aptr),%rdx # a[0], modulo-scheduled #xor %r9,%r9 # t[1], ex-$num, zero already xor %r10,%r10 xor %r11,%r11 xor %r12,%r12 xor %r13,%r13 xor %r14,%r14 xor %r15,%r15 lea 48+8(%rsp),$tptr xor $zero,$zero # cf=0, cf=0 jmp .Lsqrx8x_outer_loop .align 32 .Lsqrx8x_outer_loop: mulx 1*8($aptr),%r8,%rax # a[1]*a[0] adcx %r9,%r8 # a[1]*a[0]+=t[1] adox %rax,%r10 mulx 2*8($aptr),%r9,%rax # a[2]*a[0] adcx %r10,%r9 adox %rax,%r11 .byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 # mulx 3*8($aptr),%r10,%rax # ... adcx %r11,%r10 adox %rax,%r12 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 # mulx 4*8($aptr),%r11,%rax adcx %r12,%r11 adox %rax,%r13 mulx 5*8($aptr),%r12,%rax adcx %r13,%r12 adox %rax,%r14 mulx 6*8($aptr),%r13,%rax adcx %r14,%r13 adox %r15,%rax mulx 7*8($aptr),%r14,%r15 mov 1*8($aptr),%rdx # a[1] adcx %rax,%r14 adox $zero,%r15 adc 8*8($tptr),%r15 mov %r8,1*8($tptr) # t[1] mov %r9,2*8($tptr) # t[2] sbb $carry,$carry # mov %cf,$carry xor $zero,$zero # cf=0, of=0 mulx 2*8($aptr),%r8,%rbx # a[2]*a[1] mulx 3*8($aptr),%r9,%rax # a[3]*a[1] adcx %r10,%r8 adox %rbx,%r9 mulx 4*8($aptr),%r10,%rbx # ... adcx %r11,%r9 adox %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 # mulx 5*8($aptr),%r11,%rax adcx %r12,%r10 adox %rbx,%r11 .byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 # mulx 6*8($aptr),%r12,%rbx adcx %r13,%r11 adox %r14,%r12 .byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 # mulx 7*8($aptr),%r13,%r14 mov 2*8($aptr),%rdx # a[2] adcx %rax,%r12 adox %rbx,%r13 adcx %r15,%r13 adox $zero,%r14 # of=0 adcx $zero,%r14 # cf=0 mov %r8,3*8($tptr) # t[3] mov %r9,4*8($tptr) # t[4] mulx 3*8($aptr),%r8,%rbx # a[3]*a[2] mulx 4*8($aptr),%r9,%rax # a[4]*a[2] adcx %r10,%r8 adox %rbx,%r9 mulx 5*8($aptr),%r10,%rbx # ... adcx %r11,%r9 adox %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 # mulx 6*8($aptr),%r11,%rax adcx %r12,%r10 adox %r13,%r11 .byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 # mulx 7*8($aptr),%r12,%r13 .byte 0x3e mov 3*8($aptr),%rdx # a[3] adcx %rbx,%r11 adox %rax,%r12 adcx %r14,%r12 mov %r8,5*8($tptr) # t[5] mov %r9,6*8($tptr) # t[6] mulx 4*8($aptr),%r8,%rax # a[4]*a[3] adox $zero,%r13 # of=0 adcx $zero,%r13 # cf=0 mulx 5*8($aptr),%r9,%rbx # a[5]*a[3] adcx %r10,%r8 adox %rax,%r9 mulx 6*8($aptr),%r10,%rax # ... adcx %r11,%r9 adox %r12,%r10 mulx 7*8($aptr),%r11,%r12 mov 4*8($aptr),%rdx # a[4] mov 5*8($aptr),%r14 # a[5] adcx %rbx,%r10 adox %rax,%r11 mov 6*8($aptr),%r15 # a[6] adcx %r13,%r11 adox $zero,%r12 # of=0 adcx $zero,%r12 # cf=0 mov %r8,7*8($tptr) # t[7] mov %r9,8*8($tptr) # t[8] mulx %r14,%r9,%rax # a[5]*a[4] mov 7*8($aptr),%r8 # a[7] adcx %r10,%r9 mulx %r15,%r10,%rbx # a[6]*a[4] adox %rax,%r10 adcx %r11,%r10 mulx %r8,%r11,%rax # a[7]*a[4] mov %r14,%rdx # a[5] adox %rbx,%r11 adcx %r12,%r11 #adox $zero,%rax # of=0 adcx $zero,%rax # cf=0 mulx %r15,%r14,%rbx # a[6]*a[5] mulx %r8,%r12,%r13 # a[7]*a[5] mov %r15,%rdx # a[6] lea 8*8($aptr),$aptr adcx %r14,%r11 adox %rbx,%r12 adcx %rax,%r12 adox $zero,%r13 .byte 0x67,0x67 mulx %r8,%r8,%r14 # a[7]*a[6] adcx %r8,%r13 adcx $zero,%r14 cmp 8+8(%rsp),$aptr je .Lsqrx8x_outer_break neg $carry # mov $carry,%cf mov \$-8,%rcx mov $zero,%r15 mov 8*8($tptr),%r8 adcx 9*8($tptr),%r9 # +=t[9] adcx 10*8($tptr),%r10 # ... adcx 11*8($tptr),%r11 adc 12*8($tptr),%r12 adc 13*8($tptr),%r13 adc 14*8($tptr),%r14 adc 15*8($tptr),%r15 lea ($aptr),$aaptr lea 2*64($tptr),$tptr sbb %rax,%rax # mov %cf,$carry mov -64($aptr),%rdx # a[0] mov %rax,16+8(%rsp) # offload $carry mov $tptr,24+8(%rsp) #lea 8*8($tptr),$tptr # see 2*8*8($tptr) above xor %eax,%eax # cf=0, of=0 jmp .Lsqrx8x_loop .align 32 .Lsqrx8x_loop: mov %r8,%rbx mulx 0*8($aaptr),%rax,%r8 # a[8]*a[i] adcx %rax,%rbx # +=t[8] adox %r9,%r8 mulx 1*8($aaptr),%rax,%r9 # ... adcx %rax,%r8 adox %r10,%r9 mulx 2*8($aaptr),%rax,%r10 adcx %rax,%r9 adox %r11,%r10 mulx 3*8($aaptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 4*8($aaptr),%rax,%r12 adcx %rax,%r11 adox %r13,%r12 mulx 5*8($aaptr),%rax,%r13 adcx %rax,%r12 adox %r14,%r13 mulx 6*8($aaptr),%rax,%r14 mov %rbx,($tptr,%rcx,8) # store t[8+i] mov \$0,%ebx adcx %rax,%r13 adox %r15,%r14 .byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 # mulx 7*8($aaptr),%rax,%r15 mov 8($aptr,%rcx,8),%rdx # a[i] adcx %rax,%r14 adox %rbx,%r15 # %rbx is 0, of=0 adcx %rbx,%r15 # cf=0 .byte 0x67 inc %rcx # of=0 jnz .Lsqrx8x_loop lea 8*8($aaptr),$aaptr mov \$-8,%rcx cmp 8+8(%rsp),$aaptr # done? je .Lsqrx8x_break sub 16+8(%rsp),%rbx # mov 16(%rsp),%cf .byte 0x66 mov -64($aptr),%rdx adcx 0*8($tptr),%r8 adcx 1*8($tptr),%r9 adc 2*8($tptr),%r10 adc 3*8($tptr),%r11 adc 4*8($tptr),%r12 adc 5*8($tptr),%r13 adc 6*8($tptr),%r14 adc 7*8($tptr),%r15 lea 8*8($tptr),$tptr .byte 0x67 sbb %rax,%rax # mov %cf,%rax xor %ebx,%ebx # cf=0, of=0 mov %rax,16+8(%rsp) # offload carry jmp .Lsqrx8x_loop .align 32 .Lsqrx8x_break: xor $zero,$zero sub 16+8(%rsp),%rbx # mov 16(%rsp),%cf adcx $zero,%r8 mov 24+8(%rsp),$carry # initial $tptr, borrow $carry adcx $zero,%r9 mov 0*8($aptr),%rdx # a[8], modulo-scheduled adc \$0,%r10 mov %r8,0*8($tptr) adc \$0,%r11 adc \$0,%r12 adc \$0,%r13 adc \$0,%r14 adc \$0,%r15 cmp $carry,$tptr # cf=0, of=0 je .Lsqrx8x_outer_loop mov %r9,1*8($tptr) mov 1*8($carry),%r9 mov %r10,2*8($tptr) mov 2*8($carry),%r10 mov %r11,3*8($tptr) mov 3*8($carry),%r11 mov %r12,4*8($tptr) mov 4*8($carry),%r12 mov %r13,5*8($tptr) mov 5*8($carry),%r13 mov %r14,6*8($tptr) mov 6*8($carry),%r14 mov %r15,7*8($tptr) mov 7*8($carry),%r15 mov $carry,$tptr jmp .Lsqrx8x_outer_loop .align 32 .Lsqrx8x_outer_break: mov %r9,9*8($tptr) # t[9] movq %xmm3,%rcx # -$num mov %r10,10*8($tptr) # ... mov %r11,11*8($tptr) mov %r12,12*8($tptr) mov %r13,13*8($tptr) mov %r14,14*8($tptr) ___ } { my $i="%rcx"; $code.=<<___; lea 48+8(%rsp),$tptr mov ($aptr,$i),%rdx # a[0] mov 8($tptr),$A0[1] # t[1] xor $A0[0],$A0[0] # t[0], of=0, cf=0 mov 0+8(%rsp),$num # restore $num adox $A0[1],$A0[1] mov 16($tptr),$A1[0] # t[2] # prefetch mov 24($tptr),$A1[1] # t[3] # prefetch #jmp .Lsqrx4x_shift_n_add # happens to be aligned .align 32 .Lsqrx4x_shift_n_add: mulx %rdx,%rax,%rbx adox $A1[0],$A1[0] adcx $A0[0],%rax .byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 # mov 8($aptr,$i),%rdx # a[i+1] # prefetch .byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 # mov 32($tptr),$A0[0] # t[2*i+4] # prefetch adox $A1[1],$A1[1] adcx $A0[1],%rbx mov 40($tptr),$A0[1] # t[2*i+4+1] # prefetch mov %rax,0($tptr) mov %rbx,8($tptr) mulx %rdx,%rax,%rbx adox $A0[0],$A0[0] adcx $A1[0],%rax mov 16($aptr,$i),%rdx # a[i+2] # prefetch mov 48($tptr),$A1[0] # t[2*i+6] # prefetch adox $A0[1],$A0[1] adcx $A1[1],%rbx mov 56($tptr),$A1[1] # t[2*i+6+1] # prefetch mov %rax,16($tptr) mov %rbx,24($tptr) mulx %rdx,%rax,%rbx adox $A1[0],$A1[0] adcx $A0[0],%rax mov 24($aptr,$i),%rdx # a[i+3] # prefetch lea 32($i),$i mov 64($tptr),$A0[0] # t[2*i+8] # prefetch adox $A1[1],$A1[1] adcx $A0[1],%rbx mov 72($tptr),$A0[1] # t[2*i+8+1] # prefetch mov %rax,32($tptr) mov %rbx,40($tptr) mulx %rdx,%rax,%rbx adox $A0[0],$A0[0] adcx $A1[0],%rax jrcxz .Lsqrx4x_shift_n_add_break .byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 # mov 0($aptr,$i),%rdx # a[i+4] # prefetch adox $A0[1],$A0[1] adcx $A1[1],%rbx mov 80($tptr),$A1[0] # t[2*i+10] # prefetch mov 88($tptr),$A1[1] # t[2*i+10+1] # prefetch mov %rax,48($tptr) mov %rbx,56($tptr) lea 64($tptr),$tptr nop jmp .Lsqrx4x_shift_n_add .align 32 .Lsqrx4x_shift_n_add_break: adcx $A1[1],%rbx mov %rax,48($tptr) mov %rbx,56($tptr) lea 64($tptr),$tptr # end of t[] buffer ___ } ###################################################################### # Montgomery reduction part, "word-by-word" algorithm. # # This new path is inspired by multiple submissions from Intel, by # Shay Gueron, Vlad Krasnov, Erdinc Ozturk, James Guilford, # Vinodh Gopal... { my ($nptr,$carry,$m0)=("%rbp","%rsi","%rdx"); $code.=<<___; movq %xmm2,$nptr __bn_sqrx8x_reduction: xor %eax,%eax # initial top-most carry bit mov 32+8(%rsp),%rbx # n0 mov 48+8(%rsp),%rdx # "%r8", 8*0($tptr) lea -8*8($nptr,$num),%rcx # end of n[] #lea 48+8(%rsp,$num,2),$tptr # end of t[] buffer mov %rcx, 0+8(%rsp) # save end of n[] mov $tptr,8+8(%rsp) # save end of t[] lea 48+8(%rsp),$tptr # initial t[] window jmp .Lsqrx8x_reduction_loop .align 32 .Lsqrx8x_reduction_loop: mov 8*1($tptr),%r9 mov 8*2($tptr),%r10 mov 8*3($tptr),%r11 mov 8*4($tptr),%r12 mov %rdx,%r8 imulq %rbx,%rdx # n0*a[i] mov 8*5($tptr),%r13 mov 8*6($tptr),%r14 mov 8*7($tptr),%r15 mov %rax,24+8(%rsp) # store top-most carry bit lea 8*8($tptr),$tptr xor $carry,$carry # cf=0,of=0 mov \$-8,%rcx jmp .Lsqrx8x_reduce .align 32 .Lsqrx8x_reduce: mov %r8, %rbx mulx 8*0($nptr),%rax,%r8 # n[0] adcx %rbx,%rax # discarded adox %r9,%r8 mulx 8*1($nptr),%rbx,%r9 # n[1] adcx %rbx,%r8 adox %r10,%r9 mulx 8*2($nptr),%rbx,%r10 adcx %rbx,%r9 adox %r11,%r10 mulx 8*3($nptr),%rbx,%r11 adcx %rbx,%r10 adox %r12,%r11 .byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 8*4($nptr),%rbx,%r12 mov %rdx,%rax mov %r8,%rdx adcx %rbx,%r11 adox %r13,%r12 mulx 32+8(%rsp),%rbx,%rdx # %rdx discarded mov %rax,%rdx mov %rax,64+48+8(%rsp,%rcx,8) # put aside n0*a[i] mulx 8*5($nptr),%rax,%r13 adcx %rax,%r12 adox %r14,%r13 mulx 8*6($nptr),%rax,%r14 adcx %rax,%r13 adox %r15,%r14 mulx 8*7($nptr),%rax,%r15 mov %rbx,%rdx adcx %rax,%r14 adox $carry,%r15 # $carry is 0 adcx $carry,%r15 # cf=0 .byte 0x67,0x67,0x67 inc %rcx # of=0 jnz .Lsqrx8x_reduce mov $carry,%rax # xor %rax,%rax cmp 0+8(%rsp),$nptr # end of n[]? jae .Lsqrx8x_no_tail mov 48+8(%rsp),%rdx # pull n0*a[0] add 8*0($tptr),%r8 lea 8*8($nptr),$nptr mov \$-8,%rcx adcx 8*1($tptr),%r9 adcx 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 lea 8*8($tptr),$tptr sbb %rax,%rax # top carry xor $carry,$carry # of=0, cf=0 mov %rax,16+8(%rsp) jmp .Lsqrx8x_tail .align 32 .Lsqrx8x_tail: mov %r8,%rbx mulx 8*0($nptr),%rax,%r8 adcx %rax,%rbx adox %r9,%r8 mulx 8*1($nptr),%rax,%r9 adcx %rax,%r8 adox %r10,%r9 mulx 8*2($nptr),%rax,%r10 adcx %rax,%r9 adox %r11,%r10 mulx 8*3($nptr),%rax,%r11 adcx %rax,%r10 adox %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 8*4($nptr),%rax,%r12 adcx %rax,%r11 adox %r13,%r12 mulx 8*5($nptr),%rax,%r13 adcx %rax,%r12 adox %r14,%r13 mulx 8*6($nptr),%rax,%r14 adcx %rax,%r13 adox %r15,%r14 mulx 8*7($nptr),%rax,%r15 mov 72+48+8(%rsp,%rcx,8),%rdx # pull n0*a[i] adcx %rax,%r14 adox $carry,%r15 mov %rbx,($tptr,%rcx,8) # save result mov %r8,%rbx adcx $carry,%r15 # cf=0 inc %rcx # of=0 jnz .Lsqrx8x_tail cmp 0+8(%rsp),$nptr # end of n[]? jae .Lsqrx8x_tail_done # break out of loop sub 16+8(%rsp),$carry # mov 16(%rsp),%cf mov 48+8(%rsp),%rdx # pull n0*a[0] lea 8*8($nptr),$nptr adc 8*0($tptr),%r8 adc 8*1($tptr),%r9 adc 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 lea 8*8($tptr),$tptr sbb %rax,%rax sub \$8,%rcx # mov \$-8,%rcx xor $carry,$carry # of=0, cf=0 mov %rax,16+8(%rsp) jmp .Lsqrx8x_tail .align 32 .Lsqrx8x_tail_done: xor %rax,%rax add 24+8(%rsp),%r8 # can this overflow? adc \$0,%r9 adc \$0,%r10 adc \$0,%r11 adc \$0,%r12 adc \$0,%r13 adc \$0,%r14 adc \$0,%r15 adc \$0,%rax sub 16+8(%rsp),$carry # mov 16(%rsp),%cf .Lsqrx8x_no_tail: # %cf is 0 if jumped here adc 8*0($tptr),%r8 movq %xmm3,%rcx adc 8*1($tptr),%r9 mov 8*7($nptr),$carry movq %xmm2,$nptr # restore $nptr adc 8*2($tptr),%r10 adc 8*3($tptr),%r11 adc 8*4($tptr),%r12 adc 8*5($tptr),%r13 adc 8*6($tptr),%r14 adc 8*7($tptr),%r15 adc \$0,%rax # top-most carry mov 32+8(%rsp),%rbx # n0 mov 8*8($tptr,%rcx),%rdx # modulo-scheduled "%r8" mov %r8,8*0($tptr) # store top 512 bits lea 8*8($tptr),%r8 # borrow %r8 mov %r9,8*1($tptr) mov %r10,8*2($tptr) mov %r11,8*3($tptr) mov %r12,8*4($tptr) mov %r13,8*5($tptr) mov %r14,8*6($tptr) mov %r15,8*7($tptr) lea 8*8($tptr,%rcx),$tptr # start of current t[] window cmp 8+8(%rsp),%r8 # end of t[]? jb .Lsqrx8x_reduction_loop ret .cfi_endproc .size GFp_bn_sqrx8x_internal,.-GFp_bn_sqrx8x_internal ___ } ############################################################## # Post-condition, 4x unrolled # { my ($rptr,$nptr)=("%rdx","%rbp"); $code.=<<___; .align 32 .type __bn_postx4x_internal,\@abi-omnipotent __bn_postx4x_internal: .cfi_startproc mov 8*0($nptr),%r12 mov %rcx,%r10 # -$num mov %rcx,%r9 # -$num neg %rax sar \$3+2,%rcx #lea 48+8(%rsp,%r9),$tptr movq %xmm1,$rptr # restore $rptr movq %xmm1,$aptr # prepare for back-to-back call dec %r12 # so that after 'not' we get -n[0] mov 8*1($nptr),%r13 xor %r8,%r8 mov 8*2($nptr),%r14 mov 8*3($nptr),%r15 jmp .Lsqrx4x_sub_entry .align 16 .Lsqrx4x_sub: mov 8*0($nptr),%r12 mov 8*1($nptr),%r13 mov 8*2($nptr),%r14 mov 8*3($nptr),%r15 .Lsqrx4x_sub_entry: andn %rax,%r12,%r12 lea 8*4($nptr),$nptr andn %rax,%r13,%r13 andn %rax,%r14,%r14 andn %rax,%r15,%r15 neg %r8 # mov %r8,%cf adc 8*0($tptr),%r12 adc 8*1($tptr),%r13 adc 8*2($tptr),%r14 adc 8*3($tptr),%r15 mov %r12,8*0($rptr) lea 8*4($tptr),$tptr mov %r13,8*1($rptr) sbb %r8,%r8 # mov %cf,%r8 mov %r14,8*2($rptr) mov %r15,8*3($rptr) lea 8*4($rptr),$rptr inc %rcx jnz .Lsqrx4x_sub neg %r9 # restore $num ret .cfi_endproc .size __bn_postx4x_internal,.-__bn_postx4x_internal ___ } }}} { my ($inp,$num,$tbl,$idx)=$win64?("%rcx","%edx","%r8", "%r9d") : # Win64 order ("%rdi","%esi","%rdx","%ecx"); # Unix order my $out=$inp; my $STRIDE=2**5*8; my $N=$STRIDE/4; $code.=<<___; .globl GFp_bn_scatter5 .type GFp_bn_scatter5,\@abi-omnipotent .align 16 GFp_bn_scatter5: .cfi_startproc cmp \$0, $num jz .Lscatter_epilogue lea ($tbl,$idx,8),$tbl .Lscatter: mov ($inp),%rax lea 8($inp),$inp mov %rax,($tbl) lea 32*8($tbl),$tbl sub \$1,$num jnz .Lscatter .Lscatter_epilogue: ret .cfi_endproc .size GFp_bn_scatter5,.-GFp_bn_scatter5 .globl GFp_bn_gather5 .type GFp_bn_gather5,\@abi-omnipotent .align 32 GFp_bn_gather5: .cfi_startproc .LSEH_begin_GFp_bn_gather5: # Win64 thing, but harmless in other cases # I can't trust assembler to use specific encoding:-( .byte 0x4c,0x8d,0x14,0x24 #lea (%rsp),%r10 .cfi_def_cfa_register %r10 .byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 #sub $0x108,%rsp lea .Linc(%rip),%rax and \$-16,%rsp # shouldn't be formally required movd $idx,%xmm5 movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 lea 128($tbl),%r11 # size optimization lea 128(%rsp),%rax # size optimization pshufd \$0,%xmm5,%xmm5 # broadcast $idx movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 ___ ######################################################################## # calculate mask by comparing 0..31 to $idx and save result to stack # for($i=0;$i<$STRIDE/16;$i+=4) { $code.=<<___; paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 ___ $code.=<<___ if ($i); movdqa %xmm3,`16*($i-1)-128`(%rax) ___ $code.=<<___; movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 # compare to 3,2 movdqa %xmm0,`16*($i+0)-128`(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 # compare to 5,4 movdqa %xmm1,`16*($i+1)-128`(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 # compare to 7,6 movdqa %xmm2,`16*($i+2)-128`(%rax) movdqa %xmm4,%xmm2 ___ } $code.=<<___; movdqa %xmm3,`16*($i-1)-128`(%rax) jmp .Lgather .align 32 .Lgather: pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 ___ for($i=0;$i<$STRIDE/16;$i+=4) { $code.=<<___; movdqa `16*($i+0)-128`(%r11),%xmm0 movdqa `16*($i+1)-128`(%r11),%xmm1 movdqa `16*($i+2)-128`(%r11),%xmm2 pand `16*($i+0)-128`(%rax),%xmm0 movdqa `16*($i+3)-128`(%r11),%xmm3 pand `16*($i+1)-128`(%rax),%xmm1 por %xmm0,%xmm4 pand `16*($i+2)-128`(%rax),%xmm2 por %xmm1,%xmm5 pand `16*($i+3)-128`(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 ___ } $code.=<<___; por %xmm5,%xmm4 lea $STRIDE(%r11),%r11 pshufd \$0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 movq %xmm0,($out) # m0=bp[0] lea 8($out),$out sub \$1,$num jnz .Lgather lea (%r10),%rsp .cfi_def_cfa_register %rsp ret .LSEH_end_GFp_bn_gather5: .cfi_endproc .size GFp_bn_gather5,.-GFp_bn_gather5 ___ } $code.=<<___; .align 64 .Linc: .long 0,0, 1,1 .long 2,2, 2,2 .asciz "Montgomery Multiplication with scatter/gather for x86_64, CRYPTOGAMS by " ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type mul_handler,\@abi-omnipotent .align 16 mul_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # end of prologue label cmp %r10,%rbx # context->RipRipRsp mov 8(%r11),%r10d # HandlerData[2] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail lea .Lmul_epilogue(%rip),%r10 cmp %r10,%rbx ja .Lbody_40 mov 192($context),%r10 # pull $num mov 8(%rax,%r10,8),%rax # pull saved stack pointer jmp .Lcommon_pop_regs .Lbody_40: mov 40(%rax),%rax # pull saved stack pointer .Lcommon_pop_regs: mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size mul_handler,.-mul_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_bn_mul_mont_gather5 .rva .LSEH_end_GFp_bn_mul_mont_gather5 .rva .LSEH_info_GFp_bn_mul_mont_gather5 .rva .LSEH_begin_bn_mul4x_mont_gather5 .rva .LSEH_end_bn_mul4x_mont_gather5 .rva .LSEH_info_bn_mul4x_mont_gather5 .rva .LSEH_begin_GFp_bn_power5 .rva .LSEH_end_GFp_bn_power5 .rva .LSEH_info_GFp_bn_power5 .rva .LSEH_begin_bn_from_mont8x .rva .LSEH_end_bn_from_mont8x .rva .LSEH_info_bn_from_mont8x ___ $code.=<<___ if ($addx); .rva .LSEH_begin_bn_mulx4x_mont_gather5 .rva .LSEH_end_bn_mulx4x_mont_gather5 .rva .LSEH_info_bn_mulx4x_mont_gather5 .rva .LSEH_begin_bn_powerx5 .rva .LSEH_end_bn_powerx5 .rva .LSEH_info_GFp_bn_powerx5 ___ $code.=<<___; .rva .LSEH_begin_GFp_bn_gather5 .rva .LSEH_end_GFp_bn_gather5 .rva .LSEH_info_GFp_bn_gather5 .section .xdata .align 8 .LSEH_info_GFp_bn_mul_mont_gather5: .byte 9,0,0,0 .rva mul_handler .rva .Lmul_body,.Lmul_body,.Lmul_epilogue # HandlerData[] .align 8 .LSEH_info_bn_mul4x_mont_gather5: .byte 9,0,0,0 .rva mul_handler .rva .Lmul4x_prologue,.Lmul4x_body,.Lmul4x_epilogue # HandlerData[] .align 8 .LSEH_info_GFp_bn_power5: .byte 9,0,0,0 .rva mul_handler .rva .Lpower5_prologue,.Lpower5_body,.Lpower5_epilogue # HandlerData[] .align 8 .LSEH_info_bn_from_mont8x: .byte 9,0,0,0 .rva mul_handler .rva .Lfrom_prologue,.Lfrom_body,.Lfrom_epilogue # HandlerData[] ___ $code.=<<___ if ($addx); .align 8 .LSEH_info_bn_mulx4x_mont_gather5: .byte 9,0,0,0 .rva mul_handler .rva .Lmulx4x_prologue,.Lmulx4x_body,.Lmulx4x_epilogue # HandlerData[] .align 8 .LSEH_info_GFp_bn_powerx5: .byte 9,0,0,0 .rva mul_handler .rva .Lpowerx5_prologue,.Lpowerx5_body,.Lpowerx5_epilogue # HandlerData[] ___ $code.=<<___; .align 8 .LSEH_info_GFp_bn_gather5: .byte 0x01,0x0b,0x03,0x0a .byte 0x0b,0x01,0x21,0x00 # sub rsp,0x108 .byte 0x04,0xa3,0x00,0x00 # lea r10,(rsp) .align 8 ___ } $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/bn/generic.c000064400000000000000000000100611352416253600166070ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "internal.h" #define mul_add(r, a, w, c) \ do { \ BN_ULONG high, low, ret, tmp = (a); \ ret = (r); \ bn_umult_lohi(&low, &high, w, tmp); \ ret += (c); \ (c) = (ret < (c)) ? 1 : 0; \ (c) += high; \ ret += low; \ (c) += (ret < low) ? 1 : 0; \ (r) = ret; \ } while (0) BN_ULONG GFp_bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, size_t num, BN_ULONG w) { BN_ULONG c1 = 0; if (num == 0) { return c1; } while (num >= 4) { mul_add(rp[0], ap[0], w, c1); mul_add(rp[1], ap[1], w, c1); mul_add(rp[2], ap[2], w, c1); mul_add(rp[3], ap[3], w, c1); ap += 4; rp += 4; num -= 4; } while (num) { mul_add(rp[0], ap[0], w, c1); ap++; rp++; num--; } return c1; } ring-0.16.9/crypto/fipsmodule/bn/internal.h000064400000000000000000000220501353036607100170120ustar0000000000000000/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ /* ==================================================================== * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ /* ==================================================================== * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. * * Portions of the attached software ("Contribution") are developed by * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. * * The Contribution is licensed pursuant to the Eric Young open source * license provided above. * * The binary polynomial arithmetic software is originally written by * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems * Laboratories. */ #ifndef OPENSSL_HEADER_BN_INTERNAL_H #define OPENSSL_HEADER_BN_INTERNAL_H #include #if defined(OPENSSL_X86_64) && defined(_MSC_VER) && !defined(__clang__) #pragma warning(push, 3) #include #pragma warning(pop) #pragma intrinsic(_umul128) #endif #include "../../internal.h" typedef crypto_word BN_ULONG; #if defined(OPENSSL_64_BIT) #if defined(BORINGSSL_HAS_UINT128) // MSVC doesn't support two-word integers on 64-bit. #define BN_ULLONG uint128_t #endif #define BN_BITS2 64 #define BN_MONT_CTX_N0_LIMBS 1 #define BN_MONT_CTX_N0(hi, lo) TOBN(hi, lo), 0 #define TOBN(hi, lo) ((BN_ULONG)(hi) << 32 | (lo)) #elif defined(OPENSSL_32_BIT) #define BN_ULLONG uint64_t #define BN_BITS2 32 // On some 32-bit platforms, Montgomery multiplication is done using 64-bit // arithmetic with SIMD instructions. On such platforms, |BN_MONT_CTX::n0| // needs to be two words long. Only certain 32-bit platforms actually make use // of n0[1] and shorter R value would suffice for the others. However, // currently only the assembly files know which is which. #define BN_MONT_CTX_N0_LIMBS 2 #define BN_MONT_CTX_N0(hi, lo) TOBN(hi, lo) #define TOBN(hi, lo) (lo), (hi) #else #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" #endif // bn_mul_add_words multiples |ap| by |w|, adds the result to |rp|, and places // the result in |rp|. |ap| and |rp| must both be |num| words long. It returns // the carry word of the operation. |ap| and |rp| may be equal but otherwise may // not alias. BN_ULONG GFp_bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, size_t num, BN_ULONG w); // |num| must be at least 4, at least on x86. // // In other forks, |bn_mul_mont| returns an |int| indicating whether it // actually did the multiplication. All our implementations always do the // multiplication, and forcing callers to deal with the possibility of it // failing just leads to further problems. // // In other forks, |bn_mod_mul|'s `num` argument has type |int| but it is // implicitly treated as a |size_t|; when |int| is smaller than |size_t| // then the |movq 48(%rsp),%r9| done by x86_64-xlate.pl implicitly does the // conversion. OPENSSL_STATIC_ASSERT(sizeof(int) == sizeof(size_t) || (sizeof(int) == 4 && sizeof(size_t) == 8), "int and size_t ABI mismatch"); void GFp_bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, size_t num); static inline void bn_umult_lohi(BN_ULONG *low_out, BN_ULONG *high_out, BN_ULONG a, BN_ULONG b) { #if defined(OPENSSL_X86_64) && defined(_MSC_VER) && !defined(__clang__) *low_out = _umul128(a, b, high_out); #else BN_ULLONG result = (BN_ULLONG)a * b; *low_out = (BN_ULONG)result; *high_out = (BN_ULONG)(result >> BN_BITS2); #endif } #endif // OPENSSL_HEADER_BN_INTERNAL_H ring-0.16.9/crypto/fipsmodule/bn/montgomery.c000064400000000000000000000167401353036607100174020ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ /* ==================================================================== * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ #include "internal.h" #include "../../internal.h" #include "../../limbs/limbs.inl" OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2, "BN_MONT_CTX_N0_LIMBS value is invalid"); OPENSSL_STATIC_ASSERT( sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t), "uint64_t is insufficient precision for n0"); int GFp_bn_from_montgomery_in_place(BN_ULONG r[], size_t num_r, BN_ULONG a[], size_t num_a, const BN_ULONG n[], size_t num_n, const BN_ULONG n0_[BN_MONT_CTX_N0_LIMBS]) { ASSERT(num_n != 0); if (num_r != num_n || num_a != 2 * num_n) { return 0; } // Add multiples of |n| to |r| until R = 2^(nl * BN_BITS2) divides it. On // input, we had |r| < |n| * R, so now |r| < 2 * |n| * R. Note that |r| // includes |carry| which is stored separately. BN_ULONG n0 = n0_[0]; BN_ULONG carry = 0; for (size_t i = 0; i < num_n; i++) { BN_ULONG v = GFp_bn_mul_add_words(a + i, n, num_n, a[i] * n0); v += carry + a[i + num_n]; carry |= (v != a[i + num_n]); carry &= (v <= a[i + num_n]); a[i + num_n] = v; } // Shift |num_n| words to divide by R. We have |a| < 2 * |n|. Note that |a| // includes |carry| which is stored separately. a += num_n; // |a| thus requires at most one additional subtraction |n| to be reduced. // Subtract |n| and select the answer in constant time. BN_ULONG v = limbs_sub(r, a, n, num_n) - carry; // |v| is one if |a| - |n| underflowed or zero if it did not. Note |v| cannot // be -1. That would imply the subtraction did not fit in |num_n| words, and // we know at most one subtraction is needed. v = 0u - v; for (size_t i = 0; i < num_n; i++) { r[i] = constant_time_select_w(v, a[i], r[i]); a[i] = 0; } return 1; } ring-0.16.9/crypto/fipsmodule/bn/montgomery_inv.c000064400000000000000000000104761353036607100202560ustar0000000000000000/* Copyright 2016 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "internal.h" #include "../../internal.h" OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2, "BN_MONT_CTX_N0_LIMBS value is invalid"); OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t), "uint64_t is insufficient precision for n0"); // LG_LITTLE_R is log_2(r). #define LG_LITTLE_R (BN_MONT_CTX_N0_LIMBS * BN_BITS2) // bn_neg_inv_r_mod_n_u64 calculates the -1/n mod r; i.e. it calculates |v| // such that u*r - v*n == 1. |r| is the constant defined in |bn_mont_n0|. |n| // must be odd. // // This is derived from |xbinGCD| in Henry S. Warren, Jr.'s "Montgomery // Multiplication" (http://www.hackersdelight.org/MontgomeryMultiplication.pdf). // It is very similar to the MODULAR-INVERSE function in Stephen R. Dussé's and // Burton S. Kaliski Jr.'s "A Cryptographic Library for the Motorola DSP56000" // (http://link.springer.com/chapter/10.1007%2F3-540-46877-3_21). // // This is inspired by Joppe W. Bos's "Constant Time Modular Inversion" // (http://www.joppebos.com/files/CTInversion.pdf) so that the inversion is // constant-time with respect to |n|. We assume uint64_t additions, // subtractions, shifts, and bitwise operations are all constant time, which // may be a large leap of faith on 32-bit targets. We avoid division and // multiplication, which tend to be the most problematic in terms of timing // leaks. // // Most GCD implementations return values such that |u*r + v*n == 1|, so the // caller would have to negate the resultant |v| for the purpose of Montgomery // multiplication. This implementation does the negation implicitly by doing // the computations as a difference instead of a sum. uint64_t GFp_bn_neg_inv_mod_r_u64(uint64_t n) { ASSERT(n % 2 == 1); // alpha == 2**(lg r - 1) == r / 2. static const uint64_t alpha = UINT64_C(1) << (LG_LITTLE_R - 1); const uint64_t beta = n; uint64_t u = 1; uint64_t v = 0; // The invariant maintained from here on is: // 2**(lg r - i) == u*2*alpha - v*beta. for (size_t i = 0; i < LG_LITTLE_R; ++i) { #if BN_BITS2 == 64 && defined(BN_ULLONG) ASSERT((BN_ULLONG)(1) << (LG_LITTLE_R - i) == ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); #endif // Delete a common factor of 2 in u and v if |u| is even. Otherwise, set // |u = (u + beta) / 2| and |v = (v / 2) + alpha|. uint64_t u_is_odd = UINT64_C(0) - (u & 1); // Either 0xff..ff or 0. // The addition can overflow, so use Dietz's method for it. // // Dietz calculates (x+y)/2 by (x xor y)>>1 + x&y. This is valid for all // (unsigned) x and y, even when x+y overflows. Evidence for 32-bit values // (embedded in 64 bits to so that overflow can be ignored): // // (declare-fun x () (_ BitVec 64)) // (declare-fun y () (_ BitVec 64)) // (assert (let ( // (one (_ bv1 64)) // (thirtyTwo (_ bv32 64))) // (and // (bvult x (bvshl one thirtyTwo)) // (bvult y (bvshl one thirtyTwo)) // (not (= // (bvadd (bvlshr (bvxor x y) one) (bvand x y)) // (bvlshr (bvadd x y) one))) // ))) // (check-sat) uint64_t beta_if_u_is_odd = beta & u_is_odd; // Either |beta| or 0. u = ((u ^ beta_if_u_is_odd) >> 1) + (u & beta_if_u_is_odd); uint64_t alpha_if_u_is_odd = alpha & u_is_odd; /* Either |alpha| or 0. */ v = (v >> 1) + alpha_if_u_is_odd; } // The invariant now shows that u*r - v*n == 1 since r == 2 * alpha. #if BN_BITS2 == 64 && defined(BN_ULLONG) ASSERT(1 == ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); #endif return v; } ring-0.16.9/crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl000064400000000000000000000755111352416253600214310ustar0000000000000000#! /usr/bin/env perl # Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # ECP_NISTZ256 module for ARMv4. # # October 2014. # # Original ECP_NISTZ256 submission targeting x86_64 is detailed in # http://eprint.iacr.org/2013/816. In the process of adaptation # original .c module was made 32-bit savvy in order to make this # implementation possible. # # with/without -DECP_NISTZ256_ASM # Cortex-A8 +53-170% # Cortex-A9 +76-205% # Cortex-A15 +100-316% # Snapdragon S4 +66-187% # # Ranges denote minimum and maximum improvement coefficients depending # on benchmark. Lower coefficients are for ECDSA sign, server-side # operation. Keep in mind that +200% means 3x improvement. $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $code.=<<___; #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .asciz "ECP_NISTZ256 for ARMv4, CRYPTOGAMS by " .align 6 ___ ######################################################################## # common register layout, note that $t2 is link register, so that if # internal subroutine uses $t2, then it has to offload lr... ($r_ptr,$a_ptr,$b_ptr,$ff,$a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$t1,$t2)= map("r$_",(0..12,14)); ($t0,$t3)=($ff,$a_ptr); $code.=<<___; .type __ecp_nistz256_mul_by_2,%function .align 4 __ecp_nistz256_mul_by_2: ldr $a0,[$a_ptr,#0] ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] adds $a0,$a0,$a0 @ a[0:7]+=a[0:7], i.e. add with itself ldr $a3,[$a_ptr,#12] adcs $a1,$a1,$a1 ldr $a4,[$a_ptr,#16] adcs $a2,$a2,$a2 ldr $a5,[$a_ptr,#20] adcs $a3,$a3,$a3 ldr $a6,[$a_ptr,#24] adcs $a4,$a4,$a4 ldr $a7,[$a_ptr,#28] adcs $a5,$a5,$a5 adcs $a6,$a6,$a6 mov $ff,#0 adcs $a7,$a7,$a7 adc $ff,$ff,#0 b .Lreduce_by_sub .size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2 @ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl GFp_nistz256_add .type GFp_nistz256_add,%function .align 4 GFp_nistz256_add: stmdb sp!,{r4-r12,lr} bl __ecp_nistz256_add #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_add,.-GFp_nistz256_add .type __ecp_nistz256_add,%function .align 4 __ecp_nistz256_add: str lr,[sp,#-4]! @ push lr ldr $a0,[$a_ptr,#0] ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] ldr $a3,[$a_ptr,#12] ldr $a4,[$a_ptr,#16] ldr $t0,[$b_ptr,#0] ldr $a5,[$a_ptr,#20] ldr $t1,[$b_ptr,#4] ldr $a6,[$a_ptr,#24] ldr $t2,[$b_ptr,#8] ldr $a7,[$a_ptr,#28] ldr $t3,[$b_ptr,#12] adds $a0,$a0,$t0 ldr $t0,[$b_ptr,#16] adcs $a1,$a1,$t1 ldr $t1,[$b_ptr,#20] adcs $a2,$a2,$t2 ldr $t2,[$b_ptr,#24] adcs $a3,$a3,$t3 ldr $t3,[$b_ptr,#28] adcs $a4,$a4,$t0 adcs $a5,$a5,$t1 adcs $a6,$a6,$t2 mov $ff,#0 adcs $a7,$a7,$t3 adc $ff,$ff,#0 ldr lr,[sp],#4 @ pop lr .Lreduce_by_sub: @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs $a0,$a0,#-1 sbcs $a1,$a1,#-1 sbcs $a2,$a2,#-1 sbcs $a3,$a3,#0 sbcs $a4,$a4,#0 sbcs $a5,$a5,#0 sbcs $a6,$a6,#1 sbcs $a7,$a7,#-1 sbc $ff,$ff,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow $ff register... adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff str $a0,[$r_ptr,#0] adcs $a2,$a2,$ff str $a1,[$r_ptr,#4] adcs $a3,$a3,#0 str $a2,[$r_ptr,#8] adcs $a4,$a4,#0 str $a3,[$r_ptr,#12] adcs $a5,$a5,#0 str $a4,[$r_ptr,#16] adcs $a6,$a6,$ff,lsr#31 str $a5,[$r_ptr,#20] adcs $a7,$a7,$ff str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_add,.-__ecp_nistz256_add .type __ecp_nistz256_mul_by_3,%function .align 4 __ecp_nistz256_mul_by_3: str lr,[sp,#-4]! @ push lr @ As multiplication by 3 is performed as 2*n+n, below are inline @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see @ corresponding subroutines for details. ldr $a0,[$a_ptr,#0] ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] adds $a0,$a0,$a0 @ a[0:7]+=a[0:7] ldr $a3,[$a_ptr,#12] adcs $a1,$a1,$a1 ldr $a4,[$a_ptr,#16] adcs $a2,$a2,$a2 ldr $a5,[$a_ptr,#20] adcs $a3,$a3,$a3 ldr $a6,[$a_ptr,#24] adcs $a4,$a4,$a4 ldr $a7,[$a_ptr,#28] adcs $a5,$a5,$a5 adcs $a6,$a6,$a6 mov $ff,#0 adcs $a7,$a7,$a7 adc $ff,$ff,#0 subs $a0,$a0,#-1 @ .Lreduce_by_sub but without stores sbcs $a1,$a1,#-1 sbcs $a2,$a2,#-1 sbcs $a3,$a3,#0 sbcs $a4,$a4,#0 sbcs $a5,$a5,#0 sbcs $a6,$a6,#1 sbcs $a7,$a7,#-1 sbc $ff,$ff,#0 adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff adcs $a2,$a2,$ff adcs $a3,$a3,#0 adcs $a4,$a4,#0 ldr $b_ptr,[$a_ptr,#0] adcs $a5,$a5,#0 ldr $t1,[$a_ptr,#4] adcs $a6,$a6,$ff,lsr#31 ldr $t2,[$a_ptr,#8] adc $a7,$a7,$ff ldr $t0,[$a_ptr,#12] adds $a0,$a0,$b_ptr @ 2*a[0:7]+=a[0:7] ldr $b_ptr,[$a_ptr,#16] adcs $a1,$a1,$t1 ldr $t1,[$a_ptr,#20] adcs $a2,$a2,$t2 ldr $t2,[$a_ptr,#24] adcs $a3,$a3,$t0 ldr $t3,[$a_ptr,#28] adcs $a4,$a4,$b_ptr adcs $a5,$a5,$t1 adcs $a6,$a6,$t2 mov $ff,#0 adcs $a7,$a7,$t3 adc $ff,$ff,#0 ldr lr,[sp],#4 @ pop lr b .Lreduce_by_sub .size __ecp_nistz256_mul_by_3,.-__ecp_nistz256_mul_by_3 .type __ecp_nistz256_div_by_2,%function .align 4 __ecp_nistz256_div_by_2: @ ret = (a is odd ? a+mod : a) >> 1 ldr $a0,[$a_ptr,#0] ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] mov $ff,$a0,lsl#31 @ place least significant bit to most @ significant position, now arithmetic @ right shift by 31 will produce -1 or @ 0, while logical right shift 1 or 0, @ this is how modulus is conditionally @ synthesized in this case... ldr $a3,[$a_ptr,#12] adds $a0,$a0,$ff,asr#31 ldr $a4,[$a_ptr,#16] adcs $a1,$a1,$ff,asr#31 ldr $a5,[$a_ptr,#20] adcs $a2,$a2,$ff,asr#31 ldr $a6,[$a_ptr,#24] adcs $a3,$a3,#0 ldr $a7,[$a_ptr,#28] adcs $a4,$a4,#0 mov $a0,$a0,lsr#1 @ a[0:7]>>=1, we can start early @ because it doesn't affect flags adcs $a5,$a5,#0 orr $a0,$a0,$a1,lsl#31 adcs $a6,$a6,$ff,lsr#31 mov $b_ptr,#0 adcs $a7,$a7,$ff,asr#31 mov $a1,$a1,lsr#1 adc $b_ptr,$b_ptr,#0 @ top-most carry bit from addition orr $a1,$a1,$a2,lsl#31 mov $a2,$a2,lsr#1 str $a0,[$r_ptr,#0] orr $a2,$a2,$a3,lsl#31 mov $a3,$a3,lsr#1 str $a1,[$r_ptr,#4] orr $a3,$a3,$a4,lsl#31 mov $a4,$a4,lsr#1 str $a2,[$r_ptr,#8] orr $a4,$a4,$a5,lsl#31 mov $a5,$a5,lsr#1 str $a3,[$r_ptr,#12] orr $a5,$a5,$a6,lsl#31 mov $a6,$a6,lsr#1 str $a4,[$r_ptr,#16] orr $a6,$a6,$a7,lsl#31 mov $a7,$a7,lsr#1 str $a5,[$r_ptr,#20] orr $a7,$a7,$b_ptr,lsl#31 @ don't forget the top-most carry bit str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 .type __ecp_nistz256_sub,%function .align 4 __ecp_nistz256_sub: str lr,[sp,#-4]! @ push lr ldr $a0,[$a_ptr,#0] ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] ldr $a3,[$a_ptr,#12] ldr $a4,[$a_ptr,#16] ldr $t0,[$b_ptr,#0] ldr $a5,[$a_ptr,#20] ldr $t1,[$b_ptr,#4] ldr $a6,[$a_ptr,#24] ldr $t2,[$b_ptr,#8] ldr $a7,[$a_ptr,#28] ldr $t3,[$b_ptr,#12] subs $a0,$a0,$t0 ldr $t0,[$b_ptr,#16] sbcs $a1,$a1,$t1 ldr $t1,[$b_ptr,#20] sbcs $a2,$a2,$t2 ldr $t2,[$b_ptr,#24] sbcs $a3,$a3,$t3 ldr $t3,[$b_ptr,#28] sbcs $a4,$a4,$t0 sbcs $a5,$a5,$t1 sbcs $a6,$a6,$t2 sbcs $a7,$a7,$t3 sbc $ff,$ff,$ff @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr .Lreduce_by_add: @ if a-b borrows, add modulus. @ @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, $ff, and using it as @ a whole or extracting single bit. adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff str $a0,[$r_ptr,#0] adcs $a2,$a2,$ff str $a1,[$r_ptr,#4] adcs $a3,$a3,#0 str $a2,[$r_ptr,#8] adcs $a4,$a4,#0 str $a3,[$r_ptr,#12] adcs $a5,$a5,#0 str $a4,[$r_ptr,#16] adcs $a6,$a6,$ff,lsr#31 str $a5,[$r_ptr,#20] adcs $a7,$a7,$ff str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_sub,.-__ecp_nistz256_sub @ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); .globl GFp_nistz256_neg .type GFp_nistz256_neg,%function .align 4 GFp_nistz256_neg: stmdb sp!,{r4-r12,lr} bl __ecp_nistz256_neg #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_neg,.-GFp_nistz256_neg .type __ecp_nistz256_neg,%function .align 4 __ecp_nistz256_neg: ldr $a0,[$a_ptr,#0] eor $ff,$ff,$ff ldr $a1,[$a_ptr,#4] ldr $a2,[$a_ptr,#8] subs $a0,$ff,$a0 ldr $a3,[$a_ptr,#12] sbcs $a1,$ff,$a1 ldr $a4,[$a_ptr,#16] sbcs $a2,$ff,$a2 ldr $a5,[$a_ptr,#20] sbcs $a3,$ff,$a3 ldr $a6,[$a_ptr,#24] sbcs $a4,$ff,$a4 ldr $a7,[$a_ptr,#28] sbcs $a5,$ff,$a5 sbcs $a6,$ff,$a6 sbcs $a7,$ff,$a7 sbc $ff,$ff,$ff b .Lreduce_by_add .size __ecp_nistz256_neg,.-__ecp_nistz256_neg ___ { my @acc=map("r$_",(3..11)); my ($t0,$t1,$bj,$t2,$t3)=map("r$_",(0,1,2,12,14)); $code.=<<___; @ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,%function .align 4 GFp_nistz256_mul_mont: stmdb sp!,{r4-r12,lr} bl __ecp_nistz256_mul_mont #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont .type __ecp_nistz256_mul_mont,%function .align 4 __ecp_nistz256_mul_mont: stmdb sp!,{r0-r2,lr} @ make a copy of arguments too ldr $bj,[$b_ptr,#0] @ b[0] ldmia $a_ptr,{@acc[1]-@acc[8]} umull @acc[0],$t3,@acc[1],$bj @ r[0]=a[0]*b[0] stmdb sp!,{$acc[1]-@acc[8]} @ copy a[0-7] to stack, so @ that it can be addressed @ without spending register @ on address umull @acc[1],$t0,@acc[2],$bj @ r[1]=a[1]*b[0] umull @acc[2],$t1,@acc[3],$bj adds @acc[1],@acc[1],$t3 @ accumulate high part of mult umull @acc[3],$t2,@acc[4],$bj adcs @acc[2],@acc[2],$t0 umull @acc[4],$t3,@acc[5],$bj adcs @acc[3],@acc[3],$t1 umull @acc[5],$t0,@acc[6],$bj adcs @acc[4],@acc[4],$t2 umull @acc[6],$t1,@acc[7],$bj adcs @acc[5],@acc[5],$t3 umull @acc[7],$t2,@acc[8],$bj adcs @acc[6],@acc[6],$t0 adcs @acc[7],@acc[7],$t1 eor $t3,$t3,$t3 @ first overflow bit is zero adc @acc[8],$t2,#0 ___ for(my $i=1;$i<8;$i++) { my $t4=@acc[0]; # Reduction iteration is normally performed by accumulating # result of multiplication of modulus by "magic" digit [and # omitting least significant word, which is guaranteed to # be 0], but thanks to special form of modulus and "magic" # digit being equal to least significant word, it can be # performed with additions and subtractions alone. Indeed: # # ffff.0001.0000.0000.0000.ffff.ffff.ffff # * abcd # + xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd # # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we # rewrite above as: # # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd # + abcd.0000.abcd.0000.0000.abcd.0000.0000.0000 # - abcd.0000.0000.0000.0000.0000.0000.abcd # # or marking redundant operations: # # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.---- # + abcd.0000.abcd.0000.0000.abcd.----.----.---- # - abcd.----.----.----.----.----.----.---- $code.=<<___; @ multiplication-less reduction $i adds @acc[3],@acc[3],@acc[0] @ r[3]+=r[0] ldr $bj,[sp,#40] @ restore b_ptr adcs @acc[4],@acc[4],#0 @ r[4]+=0 adcs @acc[5],@acc[5],#0 @ r[5]+=0 adcs @acc[6],@acc[6],@acc[0] @ r[6]+=r[0] ldr $t1,[sp,#0] @ load a[0] adcs @acc[7],@acc[7],#0 @ r[7]+=0 ldr $bj,[$bj,#4*$i] @ load b[i] adcs @acc[8],@acc[8],@acc[0] @ r[8]+=r[0] eor $t0,$t0,$t0 adc $t3,$t3,#0 @ overflow bit subs @acc[7],@acc[7],@acc[0] @ r[7]-=r[0] ldr $t2,[sp,#4] @ a[1] sbcs @acc[8],@acc[8],#0 @ r[8]-=0 umlal @acc[1],$t0,$t1,$bj @ "r[0]"+=a[0]*b[i] eor $t1,$t1,$t1 sbc @acc[0],$t3,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr $t3,[sp,#8] @ a[2] umlal @acc[2],$t1,$t2,$bj @ "r[1]"+=a[1]*b[i] str @acc[0],[sp,#36] @ temporarily offload overflow eor $t2,$t2,$t2 ldr $t4,[sp,#12] @ a[3], $t4 is alias @acc[0] umlal @acc[3],$t2,$t3,$bj @ "r[2]"+=a[2]*b[i] eor $t3,$t3,$t3 adds @acc[2],@acc[2],$t0 @ accumulate high part of mult ldr $t0,[sp,#16] @ a[4] umlal @acc[4],$t3,$t4,$bj @ "r[3]"+=a[3]*b[i] eor $t4,$t4,$t4 adcs @acc[3],@acc[3],$t1 ldr $t1,[sp,#20] @ a[5] umlal @acc[5],$t4,$t0,$bj @ "r[4]"+=a[4]*b[i] eor $t0,$t0,$t0 adcs @acc[4],@acc[4],$t2 ldr $t2,[sp,#24] @ a[6] umlal @acc[6],$t0,$t1,$bj @ "r[5]"+=a[5]*b[i] eor $t1,$t1,$t1 adcs @acc[5],@acc[5],$t3 ldr $t3,[sp,#28] @ a[7] umlal @acc[7],$t1,$t2,$bj @ "r[6]"+=a[6]*b[i] eor $t2,$t2,$t2 adcs @acc[6],@acc[6],$t4 ldr @acc[0],[sp,#36] @ restore overflow bit umlal @acc[8],$t2,$t3,$bj @ "r[7]"+=a[7]*b[i] eor $t3,$t3,$t3 adcs @acc[7],@acc[7],$t0 adcs @acc[8],@acc[8],$t1 adcs @acc[0],$acc[0],$t2 adc $t3,$t3,#0 @ new overflow bit ___ push(@acc,shift(@acc)); # rotate registers, so that # "r[i]" becomes r[i] } $code.=<<___; @ last multiplication-less reduction adds @acc[3],@acc[3],@acc[0] ldr $r_ptr,[sp,#32] @ restore r_ptr adcs @acc[4],@acc[4],#0 adcs @acc[5],@acc[5],#0 adcs @acc[6],@acc[6],@acc[0] adcs @acc[7],@acc[7],#0 adcs @acc[8],@acc[8],@acc[0] adc $t3,$t3,#0 subs @acc[7],@acc[7],@acc[0] sbcs @acc[8],@acc[8],#0 sbc @acc[0],$t3,#0 @ overflow bit @ Final step is "if result > mod, subtract mod", but we do it @ "other way around", namely subtract modulus from result @ and if it borrowed, add modulus back. adds @acc[1],@acc[1],#1 @ subs @acc[1],@acc[1],#-1 adcs @acc[2],@acc[2],#0 @ sbcs @acc[2],@acc[2],#-1 adcs @acc[3],@acc[3],#0 @ sbcs @acc[3],@acc[3],#-1 sbcs @acc[4],@acc[4],#0 sbcs @acc[5],@acc[5],#0 sbcs @acc[6],@acc[6],#0 sbcs @acc[7],@acc[7],#1 adcs @acc[8],@acc[8],#0 @ sbcs @acc[8],@acc[8],#-1 ldr lr,[sp,#44] @ restore lr sbc @acc[0],@acc[0],#0 @ broadcast borrow bit add sp,sp,#48 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, @acc[0], and using it as @ a whole or extracting single bit. adds @acc[1],@acc[1],@acc[0] @ add modulus or zero adcs @acc[2],@acc[2],@acc[0] str @acc[1],[$r_ptr,#0] adcs @acc[3],@acc[3],@acc[0] str @acc[2],[$r_ptr,#4] adcs @acc[4],@acc[4],#0 str @acc[3],[$r_ptr,#8] adcs @acc[5],@acc[5],#0 str @acc[4],[$r_ptr,#12] adcs @acc[6],@acc[6],#0 str @acc[5],[$r_ptr,#16] adcs @acc[7],@acc[7],@acc[0],lsr#31 str @acc[6],[$r_ptr,#20] adc @acc[8],@acc[8],@acc[0] str @acc[7],[$r_ptr,#24] str @acc[8],[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont ___ } if (0) { # In comparison to integer-only equivalent of below subroutine: # # Cortex-A8 +10% # Cortex-A9 -10% # Snapdragon S4 +5% # # As not all time is spent in multiplication, overall impact is deemed # too low to care about. my ($A0,$A1,$A2,$A3,$Bi,$zero,$temp)=map("d$_",(0..7)); my $mask="q4"; my $mult="q5"; my @AxB=map("q$_",(8..15)); my ($rptr,$aptr,$bptr,$toutptr)=map("r$_",(0..3)); $code.=<<___; #if __ARM_ARCH__>=7 .fpu neon .type ecp_nistz256_mul_mont_neon,%function .align 5 ecp_nistz256_mul_mont_neon: mov ip,sp stmdb sp!,{r4-r9} vstmdb sp!,{q4-q5} @ ABI specification says so sub $toutptr,sp,#40 vld1.32 {${Bi}[0]},[$bptr,:32]! veor $zero,$zero,$zero vld1.32 {$A0-$A3}, [$aptr] @ can't specify :32 :-( vzip.16 $Bi,$zero mov sp,$toutptr @ alloca vmov.i64 $mask,#0xffff vmull.u32 @AxB[0],$Bi,${A0}[0] vmull.u32 @AxB[1],$Bi,${A0}[1] vmull.u32 @AxB[2],$Bi,${A1}[0] vmull.u32 @AxB[3],$Bi,${A1}[1] vshr.u64 $temp,@AxB[0]#lo,#16 vmull.u32 @AxB[4],$Bi,${A2}[0] vadd.u64 @AxB[0]#hi,@AxB[0]#hi,$temp vmull.u32 @AxB[5],$Bi,${A2}[1] vshr.u64 $temp,@AxB[0]#hi,#16 @ upper 32 bits of a[0]*b[0] vmull.u32 @AxB[6],$Bi,${A3}[0] vand.u64 @AxB[0],@AxB[0],$mask @ lower 32 bits of a[0]*b[0] vmull.u32 @AxB[7],$Bi,${A3}[1] ___ for($i=1;$i<8;$i++) { $code.=<<___; vld1.32 {${Bi}[0]},[$bptr,:32]! veor $zero,$zero,$zero vadd.u64 @AxB[1]#lo,@AxB[1]#lo,$temp @ reduction vshl.u64 $mult,@AxB[0],#32 vadd.u64 @AxB[3],@AxB[3],@AxB[0] vsub.u64 $mult,$mult,@AxB[0] vzip.16 $Bi,$zero vadd.u64 @AxB[6],@AxB[6],@AxB[0] vadd.u64 @AxB[7],@AxB[7],$mult ___ push(@AxB,shift(@AxB)); $code.=<<___; vmlal.u32 @AxB[0],$Bi,${A0}[0] vmlal.u32 @AxB[1],$Bi,${A0}[1] vmlal.u32 @AxB[2],$Bi,${A1}[0] vmlal.u32 @AxB[3],$Bi,${A1}[1] vshr.u64 $temp,@AxB[0]#lo,#16 vmlal.u32 @AxB[4],$Bi,${A2}[0] vadd.u64 @AxB[0]#hi,@AxB[0]#hi,$temp vmlal.u32 @AxB[5],$Bi,${A2}[1] vshr.u64 $temp,@AxB[0]#hi,#16 @ upper 33 bits of a[0]*b[i]+t[0] vmlal.u32 @AxB[6],$Bi,${A3}[0] vand.u64 @AxB[0],@AxB[0],$mask @ lower 32 bits of a[0]*b[0] vmull.u32 @AxB[7],$Bi,${A3}[1] ___ } $code.=<<___; vadd.u64 @AxB[1]#lo,@AxB[1]#lo,$temp @ last reduction vshl.u64 $mult,@AxB[0],#32 vadd.u64 @AxB[3],@AxB[3],@AxB[0] vsub.u64 $mult,$mult,@AxB[0] vadd.u64 @AxB[6],@AxB[6],@AxB[0] vadd.u64 @AxB[7],@AxB[7],$mult vshr.u64 $temp,@AxB[1]#lo,#16 @ convert vadd.u64 @AxB[1]#hi,@AxB[1]#hi,$temp vshr.u64 $temp,@AxB[1]#hi,#16 vzip.16 @AxB[1]#lo,@AxB[1]#hi ___ foreach (2..7) { $code.=<<___; vadd.u64 @AxB[$_]#lo,@AxB[$_]#lo,$temp vst1.32 {@AxB[$_-1]#lo[0]},[$toutptr,:32]! vshr.u64 $temp,@AxB[$_]#lo,#16 vadd.u64 @AxB[$_]#hi,@AxB[$_]#hi,$temp vshr.u64 $temp,@AxB[$_]#hi,#16 vzip.16 @AxB[$_]#lo,@AxB[$_]#hi ___ } $code.=<<___; vst1.32 {@AxB[7]#lo[0]},[$toutptr,:32]! vst1.32 {$temp},[$toutptr] @ upper 33 bits ldr r1,[sp,#0] ldr r2,[sp,#4] ldr r3,[sp,#8] subs r1,r1,#-1 ldr r4,[sp,#12] sbcs r2,r2,#-1 ldr r5,[sp,#16] sbcs r3,r3,#-1 ldr r6,[sp,#20] sbcs r4,r4,#0 ldr r7,[sp,#24] sbcs r5,r5,#0 ldr r8,[sp,#28] sbcs r6,r6,#0 ldr r9,[sp,#32] @ top-most bit sbcs r7,r7,#1 sub sp,ip,#40+16 sbcs r8,r8,#-1 sbc r9,r9,#0 vldmia sp!,{q4-q5} adds r1,r1,r9 adcs r2,r2,r9 str r1,[$rptr,#0] adcs r3,r3,r9 str r2,[$rptr,#4] adcs r4,r4,#0 str r3,[$rptr,#8] adcs r5,r5,#0 str r4,[$rptr,#12] adcs r6,r6,#0 str r5,[$rptr,#16] adcs r7,r7,r9,lsr#31 str r6,[$rptr,#20] adcs r8,r8,r9 str r7,[$rptr,#24] str r8,[$rptr,#28] ldmia sp!,{r4-r9} bx lr .size ecp_nistz256_mul_mont_neon,.-ecp_nistz256_mul_mont_neon #endif ___ } {{{ ######################################################################## # Below $aN assignment matches order in which 256-bit result appears in # register bank at return from __ecp_nistz256_mul_mont, so that we can # skip over reloading it from memory. This means that below functions # use custom calling sequence accepting 256-bit input in registers, # output pointer in r0, $r_ptr, and optional pointer in r2, $b_ptr. # # See their "normal" counterparts for insights on calculations. my ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7, $t0,$t1,$t2,$t3)=map("r$_",(11,3..10,12,14,1)); my $ff=$b_ptr; $code.=<<___; .type __ecp_nistz256_sub_from,%function .align 5 __ecp_nistz256_sub_from: str lr,[sp,#-4]! @ push lr ldr $t0,[$b_ptr,#0] ldr $t1,[$b_ptr,#4] ldr $t2,[$b_ptr,#8] ldr $t3,[$b_ptr,#12] subs $a0,$a0,$t0 ldr $t0,[$b_ptr,#16] sbcs $a1,$a1,$t1 ldr $t1,[$b_ptr,#20] sbcs $a2,$a2,$t2 ldr $t2,[$b_ptr,#24] sbcs $a3,$a3,$t3 ldr $t3,[$b_ptr,#28] sbcs $a4,$a4,$t0 sbcs $a5,$a5,$t1 sbcs $a6,$a6,$t2 sbcs $a7,$a7,$t3 sbc $ff,$ff,$ff @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff str $a0,[$r_ptr,#0] adcs $a2,$a2,$ff str $a1,[$r_ptr,#4] adcs $a3,$a3,#0 str $a2,[$r_ptr,#8] adcs $a4,$a4,#0 str $a3,[$r_ptr,#12] adcs $a5,$a5,#0 str $a4,[$r_ptr,#16] adcs $a6,$a6,$ff,lsr#31 str $a5,[$r_ptr,#20] adcs $a7,$a7,$ff str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from .type __ecp_nistz256_sub_morf,%function .align 5 __ecp_nistz256_sub_morf: str lr,[sp,#-4]! @ push lr ldr $t0,[$b_ptr,#0] ldr $t1,[$b_ptr,#4] ldr $t2,[$b_ptr,#8] ldr $t3,[$b_ptr,#12] subs $a0,$t0,$a0 ldr $t0,[$b_ptr,#16] sbcs $a1,$t1,$a1 ldr $t1,[$b_ptr,#20] sbcs $a2,$t2,$a2 ldr $t2,[$b_ptr,#24] sbcs $a3,$t3,$a3 ldr $t3,[$b_ptr,#28] sbcs $a4,$t0,$a4 sbcs $a5,$t1,$a5 sbcs $a6,$t2,$a6 sbcs $a7,$t3,$a7 sbc $ff,$ff,$ff @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff str $a0,[$r_ptr,#0] adcs $a2,$a2,$ff str $a1,[$r_ptr,#4] adcs $a3,$a3,#0 str $a2,[$r_ptr,#8] adcs $a4,$a4,#0 str $a3,[$r_ptr,#12] adcs $a5,$a5,#0 str $a4,[$r_ptr,#16] adcs $a6,$a6,$ff,lsr#31 str $a5,[$r_ptr,#20] adcs $a7,$a7,$ff str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf .type __ecp_nistz256_add_self,%function .align 4 __ecp_nistz256_add_self: adds $a0,$a0,$a0 @ a[0:7]+=a[0:7] adcs $a1,$a1,$a1 adcs $a2,$a2,$a2 adcs $a3,$a3,$a3 adcs $a4,$a4,$a4 adcs $a5,$a5,$a5 adcs $a6,$a6,$a6 mov $ff,#0 adcs $a7,$a7,$a7 adc $ff,$ff,#0 @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs $a0,$a0,#-1 sbcs $a1,$a1,#-1 sbcs $a2,$a2,#-1 sbcs $a3,$a3,#0 sbcs $a4,$a4,#0 sbcs $a5,$a5,#0 sbcs $a6,$a6,#1 sbcs $a7,$a7,#-1 sbc $ff,$ff,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow $ff register... adds $a0,$a0,$ff @ add synthesized modulus adcs $a1,$a1,$ff str $a0,[$r_ptr,#0] adcs $a2,$a2,$ff str $a1,[$r_ptr,#4] adcs $a3,$a3,#0 str $a2,[$r_ptr,#8] adcs $a4,$a4,#0 str $a3,[$r_ptr,#12] adcs $a5,$a5,#0 str $a4,[$r_ptr,#16] adcs $a6,$a6,$ff,lsr#31 str $a5,[$r_ptr,#20] adcs $a7,$a7,$ff str $a6,[$r_ptr,#24] str $a7,[$r_ptr,#28] mov pc,lr .size __ecp_nistz256_add_self,.-__ecp_nistz256_add_self ___ ######################################################################## # following subroutines are "literal" implementation of those found in # ecp_nistz256.c # ######################################################################## # void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); # { my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); # above map() describes stack layout with 5 temporary # 256-bit vectors on top. Then note that we push # starting from r0, which means that we have copy of # input arguments just below these temporary vectors. $code.=<<___; .globl GFp_nistz256_point_double .type GFp_nistz256_point_double,%function .align 5 GFp_nistz256_point_double: stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*5 .Lpoint_double_shortcut: add r3,sp,#$in_x ldmia $a_ptr!,{r4-r11} @ copy in_x stmia r3,{r4-r11} add $r_ptr,sp,#$S bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); add $b_ptr,$a_ptr,#32 add $a_ptr,$a_ptr,#32 add $r_ptr,sp,#$Zsqr bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); add $a_ptr,sp,#$S add $b_ptr,sp,#$S add $r_ptr,sp,#$S bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); ldr $b_ptr,[sp,#32*5+4] add $a_ptr,$b_ptr,#32 add $b_ptr,$b_ptr,#64 add $r_ptr,sp,#$tmp0 bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); ldr $r_ptr,[sp,#32*5] add $r_ptr,$r_ptr,#64 bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); add $a_ptr,sp,#$in_x add $b_ptr,sp,#$Zsqr add $r_ptr,sp,#$M bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); add $a_ptr,sp,#$in_x add $b_ptr,sp,#$Zsqr add $r_ptr,sp,#$Zsqr bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); add $a_ptr,sp,#$S add $b_ptr,sp,#$S add $r_ptr,sp,#$tmp0 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); add $a_ptr,sp,#$Zsqr add $b_ptr,sp,#$M add $r_ptr,sp,#$M bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); ldr $r_ptr,[sp,#32*5] add $a_ptr,sp,#$tmp0 add $r_ptr,$r_ptr,#32 bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); add $a_ptr,sp,#$M add $r_ptr,sp,#$M bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); add $a_ptr,sp,#$in_x add $b_ptr,sp,#$S add $r_ptr,sp,#$S bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); add $r_ptr,sp,#$tmp0 bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); ldr $r_ptr,[sp,#32*5] add $a_ptr,sp,#$M add $b_ptr,sp,#$M bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); add $b_ptr,sp,#$tmp0 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); add $b_ptr,sp,#$S add $r_ptr,sp,#$S bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); add $a_ptr,sp,#$M add $b_ptr,sp,#$S bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); ldr $r_ptr,[sp,#32*5] add $b_ptr,$r_ptr,#32 add $r_ptr,$r_ptr,#32 bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_point_double,.-GFp_nistz256_point_double ___ } ######################################################################## # void GFp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1, # const P256_POINT_AFFINE *in2); { my ($res_x,$res_y,$res_z, $in1_x,$in1_y,$in1_z, $in2_x,$in2_y, $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14)); my $Z1sqr = $S2; # above map() describes stack layout with 18 temporary # 256-bit vectors on top. Then note that we push # starting from r0, which means that we have copy of # input arguments just below these temporary vectors. # We use two of them for !in1infty, !in2intfy. my @ONE_mont=(1,0,0,-1,-1,-1,-2,0); $code.=<<___; .globl GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,%function .align 5 GFp_nistz256_point_add_affine: stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*15 ldmia $a_ptr!,{r4-r11} @ copy in1_x add r3,sp,#$in1_x stmia r3!,{r4-r11} ldmia $a_ptr!,{r4-r11} @ copy in1_y stmia r3!,{r4-r11} ldmia $a_ptr,{r4-r11} @ copy in1_z orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 stmia r3,{r4-r11} str r12,[sp,#32*15+4] @ !in1infty ldmia $b_ptr!,{r4-r11} @ copy in2_x add r3,sp,#$in2_x orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4-r11} ldmia $b_ptr!,{r4-r11} @ copy in2_y orr r12,r12,r4 orr r12,r12,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4-r11} cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 str r12,[sp,#32*15+8] @ !in2infty add $a_ptr,sp,#$in1_z add $b_ptr,sp,#$in1_z add $r_ptr,sp,#$Z1sqr bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z1sqr, in1_z); add $a_ptr,sp,#$Z1sqr add $b_ptr,sp,#$in2_x add $r_ptr,sp,#$U2 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, Z1sqr, in2_x); add $b_ptr,sp,#$in1_x add $r_ptr,sp,#$H bl __ecp_nistz256_sub_from @ p256_sub(H, U2, in1_x); add $a_ptr,sp,#$Z1sqr add $b_ptr,sp,#$in1_z add $r_ptr,sp,#$S2 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, Z1sqr, in1_z); add $a_ptr,sp,#$H add $b_ptr,sp,#$in1_z add $r_ptr,sp,#$res_z bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, H, in1_z); add $a_ptr,sp,#$in2_y add $b_ptr,sp,#$S2 add $r_ptr,sp,#$S2 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S2, in2_y); add $b_ptr,sp,#$in1_y add $r_ptr,sp,#$R bl __ecp_nistz256_sub_from @ p256_sub(R, S2, in1_y); add $a_ptr,sp,#$H add $b_ptr,sp,#$H add $r_ptr,sp,#$Hsqr bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Hsqr, H); add $a_ptr,sp,#$R add $b_ptr,sp,#$R add $r_ptr,sp,#$Rsqr bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Rsqr, R); add $a_ptr,sp,#$H add $b_ptr,sp,#$Hsqr add $r_ptr,sp,#$Hcub bl __ecp_nistz256_mul_mont @ p256_mul_mont(Hcub, Hsqr, H); add $a_ptr,sp,#$Hsqr add $b_ptr,sp,#$in1_x add $r_ptr,sp,#$U2 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, in1_x, Hsqr); add $r_ptr,sp,#$Hsqr bl __ecp_nistz256_add_self @ p256_mul_by_2(Hsqr, U2); add $b_ptr,sp,#$Rsqr add $r_ptr,sp,#$res_x bl __ecp_nistz256_sub_morf @ p256_sub(res_x, Rsqr, Hsqr); add $b_ptr,sp,#$Hcub bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, Hcub); add $b_ptr,sp,#$U2 add $r_ptr,sp,#$res_y bl __ecp_nistz256_sub_morf @ p256_sub(res_y, U2, res_x); add $a_ptr,sp,#$Hcub add $b_ptr,sp,#$in1_y add $r_ptr,sp,#$S2 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, in1_y, Hcub); add $a_ptr,sp,#$R add $b_ptr,sp,#$res_y add $r_ptr,sp,#$res_y bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_y, res_y, R); add $b_ptr,sp,#$S2 bl __ecp_nistz256_sub_from @ p256_sub(res_y, res_y, S2); ldr r11,[sp,#32*15+4] @ !in1intfy ldr r12,[sp,#32*15+8] @ !in2intfy add r1,sp,#$res_x add r2,sp,#$in2_x and r10,r11,r12 mvn r11,r11 add r3,sp,#$in1_x and r11,r11,r12 mvn r12,r12 ldr $r_ptr,[sp,#32*15] ___ for($i=0;$i<64;$i+=8) { # conditional moves $code.=<<___; ldmia r1!,{r4-r5} @ res_x ldmia r2!,{r6-r7} @ in2_x ldmia r3!,{r8-r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia $r_ptr!,{r4-r5} ___ } for(;$i<96;$i+=8) { my $j=($i-64)/4; $code.=<<___; ldmia r1!,{r4-r5} @ res_z ldmia r3!,{r8-r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#@ONE_mont[$j] and r7,r11,#@ONE_mont[$j+1] and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia $r_ptr!,{r4-r5} ___ } $code.=<<___; add sp,sp,#32*15+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine ___ } }}} foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl000064400000000000000000000602171352416253600214320ustar0000000000000000#! /usr/bin/env perl # Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. All advertising materials mentioning features or use of this # software must display the following acknowledgment: # "This product includes software developed by the OpenSSL Project # for use in the OpenSSL Toolkit. (http://www.openssl.org/)" # # 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to # endorse or promote products derived from this software without # prior written permission. For written permission, please contact # openssl-core@openssl.org. # # 5. Products derived from this software may not be called "OpenSSL" # nor may "OpenSSL" appear in their names without prior written # permission of the OpenSSL Project. # # 6. Redistributions of any form whatsoever must retain the following # acknowledgment: # "This product includes software developed by the OpenSSL Project # for use in the OpenSSL Toolkit (http://www.openssl.org/)" # # THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # ==================================================================== # # This product includes cryptographic software written by Eric Young # (eay@cryptsoft.com). This product includes software written by Tim # Hudson (tjh@cryptsoft.com). # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # ECP_NISTZ256 module for ARMv8. # # February 2015. # # Original ECP_NISTZ256 submission targeting x86_64 is detailed in # http://eprint.iacr.org/2013/816. # # with/without -DECP_NISTZ256_ASM # Apple A7 +120-360% # Cortex-A53 +120-400% # Cortex-A57 +120-350% # X-Gene +200-330% # Denver +140-400% # # Ranges denote minimum and maximum improvement coefficients depending # on benchmark. Lower coefficients are for ECDSA sign, server-side # operation. Keep in mind that +400% means 5x improvement. $flavour = shift; while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; { my ($rp,$ap,$bp,$bi,$a0,$a1,$a2,$a3,$t0,$t1,$t2,$t3,$poly1,$poly3, $acc0,$acc1,$acc2,$acc3,$acc4,$acc5) = map("x$_",(0..17,19,20)); my ($acc6,$acc7)=($ap,$bp); # used in __ecp_nistz256_sqr_mont $code.=<<___; #include .text .align 5 .Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 .Lone_mont: .quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe .Lone: .quad 1,0,0,0 .asciz "ECP_NISTZ256 for ARMv8, CRYPTOGAMS by " // void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,%function .align 4 GFp_nistz256_mul_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldr $bi,[$bp] // bp[0] ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] ldr $poly1,.Lpoly+8 ldr $poly3,.Lpoly+24 bl __ecp_nistz256_mul_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont // void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl GFp_nistz256_sqr_mont .type GFp_nistz256_sqr_mont,%function .align 4 GFp_nistz256_sqr_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] ldr $poly1,.Lpoly+8 ldr $poly3,.Lpoly+24 bl __ecp_nistz256_sqr_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret .size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont // void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl GFp_nistz256_add .type GFp_nistz256_add,%function .align 4 GFp_nistz256_add: stp x29,x30,[sp,#-16]! add x29,sp,#0 ldp $acc0,$acc1,[$ap] ldp $t0,$t1,[$bp] ldp $acc2,$acc3,[$ap,#16] ldp $t2,$t3,[$bp,#16] ldr $poly1,.Lpoly+8 ldr $poly3,.Lpoly+24 bl __ecp_nistz256_add ldp x29,x30,[sp],#16 ret .size GFp_nistz256_add,.-GFp_nistz256_add // void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl GFp_nistz256_neg .type GFp_nistz256_neg,%function .align 4 GFp_nistz256_neg: stp x29,x30,[sp,#-16]! add x29,sp,#0 mov $bp,$ap mov $acc0,xzr // a = 0 mov $acc1,xzr mov $acc2,xzr mov $acc3,xzr ldr $poly1,.Lpoly+8 ldr $poly3,.Lpoly+24 bl __ecp_nistz256_sub_from ldp x29,x30,[sp],#16 ret .size GFp_nistz256_neg,.-GFp_nistz256_neg // note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded // to $a0-$a3 and b[0] - to $bi .type __ecp_nistz256_mul_mont,%function .align 4 __ecp_nistz256_mul_mont: mul $acc0,$a0,$bi // a[0]*b[0] umulh $t0,$a0,$bi mul $acc1,$a1,$bi // a[1]*b[0] umulh $t1,$a1,$bi mul $acc2,$a2,$bi // a[2]*b[0] umulh $t2,$a2,$bi mul $acc3,$a3,$bi // a[3]*b[0] umulh $t3,$a3,$bi ldr $bi,[$bp,#8] // b[1] adds $acc1,$acc1,$t0 // accumulate high parts of multiplication lsl $t0,$acc0,#32 adcs $acc2,$acc2,$t1 lsr $t1,$acc0,#32 adcs $acc3,$acc3,$t2 adc $acc4,xzr,$t3 mov $acc5,xzr ___ for($i=1;$i<4;$i++) { # Reduction iteration is normally performed by accumulating # result of multiplication of modulus by "magic" digit [and # omitting least significant word, which is guaranteed to # be 0], but thanks to special form of modulus and "magic" # digit being equal to least significant word, it can be # performed with additions and subtractions alone. Indeed: # # ffff0001.00000000.0000ffff.ffffffff # * abcdefgh # + xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh # # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we # rewrite above as: # # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh # + abcdefgh.abcdefgh.0000abcd.efgh0000.00000000 # - 0000abcd.efgh0000.00000000.00000000.abcdefgh # # or marking redundant operations: # # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.-------- # + abcdefgh.abcdefgh.0000abcd.efgh0000.-------- # - 0000abcd.efgh0000.--------.--------.-------- $code.=<<___; subs $t2,$acc0,$t0 // "*0xffff0001" sbc $t3,$acc0,$t1 adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] mul $t0,$a0,$bi // lo(a[0]*b[i]) adcs $acc1,$acc2,$t1 mul $t1,$a1,$bi // lo(a[1]*b[i]) adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 mul $t2,$a2,$bi // lo(a[2]*b[i]) adcs $acc3,$acc4,$t3 mul $t3,$a3,$bi // lo(a[3]*b[i]) adc $acc4,$acc5,xzr adds $acc0,$acc0,$t0 // accumulate low parts of multiplication umulh $t0,$a0,$bi // hi(a[0]*b[i]) adcs $acc1,$acc1,$t1 umulh $t1,$a1,$bi // hi(a[1]*b[i]) adcs $acc2,$acc2,$t2 umulh $t2,$a2,$bi // hi(a[2]*b[i]) adcs $acc3,$acc3,$t3 umulh $t3,$a3,$bi // hi(a[3]*b[i]) adc $acc4,$acc4,xzr ___ $code.=<<___ if ($i<3); ldr $bi,[$bp,#8*($i+1)] // b[$i+1] ___ $code.=<<___; adds $acc1,$acc1,$t0 // accumulate high parts of multiplication lsl $t0,$acc0,#32 adcs $acc2,$acc2,$t1 lsr $t1,$acc0,#32 adcs $acc3,$acc3,$t2 adcs $acc4,$acc4,$t3 adc $acc5,xzr,xzr ___ } $code.=<<___; // last reduction subs $t2,$acc0,$t0 // "*0xffff0001" sbc $t3,$acc0,$t1 adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] adcs $acc1,$acc2,$t1 adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 adcs $acc3,$acc4,$t3 adc $acc4,$acc5,xzr adds $t0,$acc0,#1 // subs $t0,$acc0,#-1 // tmp = ret-modulus sbcs $t1,$acc1,$poly1 sbcs $t2,$acc2,xzr sbcs $t3,$acc3,$poly3 sbcs xzr,$acc4,xzr // did it borrow? csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus csel $acc1,$acc1,$t1,lo csel $acc2,$acc2,$t2,lo stp $acc0,$acc1,[$rp] csel $acc3,$acc3,$t3,lo stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont // note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded // to $a0-$a3 .type __ecp_nistz256_sqr_mont,%function .align 4 __ecp_nistz256_sqr_mont: // | | | | | |a1*a0| | // | | | | |a2*a0| | | // | |a3*a2|a3*a0| | | | // | | | |a2*a1| | | | // | | |a3*a1| | | | | // *| | | | | | | | 2| // +|a3*a3|a2*a2|a1*a1|a0*a0| // |--+--+--+--+--+--+--+--| // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx // // "can't overflow" below mark carrying into high part of // multiplication result, which can't overflow, because it // can never be all ones. mul $acc1,$a1,$a0 // a[1]*a[0] umulh $t1,$a1,$a0 mul $acc2,$a2,$a0 // a[2]*a[0] umulh $t2,$a2,$a0 mul $acc3,$a3,$a0 // a[3]*a[0] umulh $acc4,$a3,$a0 adds $acc2,$acc2,$t1 // accumulate high parts of multiplication mul $t0,$a2,$a1 // a[2]*a[1] umulh $t1,$a2,$a1 adcs $acc3,$acc3,$t2 mul $t2,$a3,$a1 // a[3]*a[1] umulh $t3,$a3,$a1 adc $acc4,$acc4,xzr // can't overflow mul $acc5,$a3,$a2 // a[3]*a[2] umulh $acc6,$a3,$a2 adds $t1,$t1,$t2 // accumulate high parts of multiplication mul $acc0,$a0,$a0 // a[0]*a[0] adc $t2,$t3,xzr // can't overflow adds $acc3,$acc3,$t0 // accumulate low parts of multiplication umulh $a0,$a0,$a0 adcs $acc4,$acc4,$t1 mul $t1,$a1,$a1 // a[1]*a[1] adcs $acc5,$acc5,$t2 umulh $a1,$a1,$a1 adc $acc6,$acc6,xzr // can't overflow adds $acc1,$acc1,$acc1 // acc[1-6]*=2 mul $t2,$a2,$a2 // a[2]*a[2] adcs $acc2,$acc2,$acc2 umulh $a2,$a2,$a2 adcs $acc3,$acc3,$acc3 mul $t3,$a3,$a3 // a[3]*a[3] adcs $acc4,$acc4,$acc4 umulh $a3,$a3,$a3 adcs $acc5,$acc5,$acc5 adcs $acc6,$acc6,$acc6 adc $acc7,xzr,xzr adds $acc1,$acc1,$a0 // +a[i]*a[i] adcs $acc2,$acc2,$t1 adcs $acc3,$acc3,$a1 adcs $acc4,$acc4,$t2 adcs $acc5,$acc5,$a2 lsl $t0,$acc0,#32 adcs $acc6,$acc6,$t3 lsr $t1,$acc0,#32 adc $acc7,$acc7,$a3 ___ for($i=0;$i<3;$i++) { # reductions, see commentary in # multiplication for details $code.=<<___; subs $t2,$acc0,$t0 // "*0xffff0001" sbc $t3,$acc0,$t1 adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] adcs $acc1,$acc2,$t1 lsl $t0,$acc0,#32 adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 lsr $t1,$acc0,#32 adc $acc3,$t3,xzr // can't overflow ___ } $code.=<<___; subs $t2,$acc0,$t0 // "*0xffff0001" sbc $t3,$acc0,$t1 adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] adcs $acc1,$acc2,$t1 adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 adc $acc3,$t3,xzr // can't overflow adds $acc0,$acc0,$acc4 // accumulate upper half adcs $acc1,$acc1,$acc5 adcs $acc2,$acc2,$acc6 adcs $acc3,$acc3,$acc7 adc $acc4,xzr,xzr adds $t0,$acc0,#1 // subs $t0,$acc0,#-1 // tmp = ret-modulus sbcs $t1,$acc1,$poly1 sbcs $t2,$acc2,xzr sbcs $t3,$acc3,$poly3 sbcs xzr,$acc4,xzr // did it borrow? csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus csel $acc1,$acc1,$t1,lo csel $acc2,$acc2,$t2,lo stp $acc0,$acc1,[$rp] csel $acc3,$acc3,$t3,lo stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont // Note that __ecp_nistz256_add expects both input vectors pre-loaded to // $a0-$a3 and $t0-$t3. This is done because it's used in multiple // contexts, e.g. in multiplication by 2 and 3... .type __ecp_nistz256_add,%function .align 4 __ecp_nistz256_add: adds $acc0,$acc0,$t0 // ret = a+b adcs $acc1,$acc1,$t1 adcs $acc2,$acc2,$t2 adcs $acc3,$acc3,$t3 adc $ap,xzr,xzr // zap $ap adds $t0,$acc0,#1 // subs $t0,$a0,#-1 // tmp = ret-modulus sbcs $t1,$acc1,$poly1 sbcs $t2,$acc2,xzr sbcs $t3,$acc3,$poly3 sbcs xzr,$ap,xzr // did subtraction borrow? csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus csel $acc1,$acc1,$t1,lo csel $acc2,$acc2,$t2,lo stp $acc0,$acc1,[$rp] csel $acc3,$acc3,$t3,lo stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_add,.-__ecp_nistz256_add .type __ecp_nistz256_sub_from,%function .align 4 __ecp_nistz256_sub_from: ldp $t0,$t1,[$bp] ldp $t2,$t3,[$bp,#16] subs $acc0,$acc0,$t0 // ret = a-b sbcs $acc1,$acc1,$t1 sbcs $acc2,$acc2,$t2 sbcs $acc3,$acc3,$t3 sbc $ap,xzr,xzr // zap $ap subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = ret+modulus adcs $t1,$acc1,$poly1 adcs $t2,$acc2,xzr adc $t3,$acc3,$poly3 cmp $ap,xzr // did subtraction borrow? csel $acc0,$acc0,$t0,eq // ret = borrow ? ret+modulus : ret csel $acc1,$acc1,$t1,eq csel $acc2,$acc2,$t2,eq stp $acc0,$acc1,[$rp] csel $acc3,$acc3,$t3,eq stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from .type __ecp_nistz256_sub_morf,%function .align 4 __ecp_nistz256_sub_morf: ldp $t0,$t1,[$bp] ldp $t2,$t3,[$bp,#16] subs $acc0,$t0,$acc0 // ret = b-a sbcs $acc1,$t1,$acc1 sbcs $acc2,$t2,$acc2 sbcs $acc3,$t3,$acc3 sbc $ap,xzr,xzr // zap $ap subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = ret+modulus adcs $t1,$acc1,$poly1 adcs $t2,$acc2,xzr adc $t3,$acc3,$poly3 cmp $ap,xzr // did subtraction borrow? csel $acc0,$acc0,$t0,eq // ret = borrow ? ret+modulus : ret csel $acc1,$acc1,$t1,eq csel $acc2,$acc2,$t2,eq stp $acc0,$acc1,[$rp] csel $acc3,$acc3,$t3,eq stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf .type __ecp_nistz256_div_by_2,%function .align 4 __ecp_nistz256_div_by_2: subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = a+modulus adcs $t1,$acc1,$poly1 adcs $t2,$acc2,xzr adcs $t3,$acc3,$poly3 adc $ap,xzr,xzr // zap $ap tst $acc0,#1 // is a even? csel $acc0,$acc0,$t0,eq // ret = even ? a : a+modulus csel $acc1,$acc1,$t1,eq csel $acc2,$acc2,$t2,eq csel $acc3,$acc3,$t3,eq csel $ap,xzr,$ap,eq lsr $acc0,$acc0,#1 // ret >>= 1 orr $acc0,$acc0,$acc1,lsl#63 lsr $acc1,$acc1,#1 orr $acc1,$acc1,$acc2,lsl#63 lsr $acc2,$acc2,#1 orr $acc2,$acc2,$acc3,lsl#63 lsr $acc3,$acc3,#1 stp $acc0,$acc1,[$rp] orr $acc3,$acc3,$ap,lsl#63 stp $acc2,$acc3,[$rp,#16] ret .size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 ___ ######################################################################## # following subroutines are "literal" implementation of those found in # ecp_nistz256.c # ######################################################################## # void GFp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); # { my ($S,$M,$Zsqr,$tmp0)=map(32*$_,(0..3)); # above map() describes stack layout with 4 temporary # 256-bit vectors on top. my ($rp_real,$ap_real) = map("x$_",(21,22)); $code.=<<___; .globl GFp_nistz256_point_double .type GFp_nistz256_point_double,%function .align 5 GFp_nistz256_point_double: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] sub sp,sp,#32*4 .Ldouble_shortcut: ldp $acc0,$acc1,[$ap,#32] mov $rp_real,$rp ldp $acc2,$acc3,[$ap,#48] mov $ap_real,$ap ldr $poly1,.Lpoly+8 mov $t0,$acc0 ldr $poly3,.Lpoly+24 mov $t1,$acc1 ldp $a0,$a1,[$ap_real,#64] // forward load for p256_sqr_mont mov $t2,$acc2 mov $t3,$acc3 ldp $a2,$a3,[$ap_real,#64+16] add $rp,sp,#$S bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); add $rp,sp,#$Zsqr bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); ldp $t0,$t1,[$ap_real] ldp $t2,$t3,[$ap_real,#16] mov $a0,$acc0 // put Zsqr aside for p256_sub mov $a1,$acc1 mov $a2,$acc2 mov $a3,$acc3 add $rp,sp,#$M bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); add $bp,$ap_real,#0 mov $acc0,$a0 // restore Zsqr mov $acc1,$a1 ldp $a0,$a1,[sp,#$S] // forward load for p256_sqr_mont mov $acc2,$a2 mov $acc3,$a3 ldp $a2,$a3,[sp,#$S+16] add $rp,sp,#$Zsqr bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); add $rp,sp,#$S bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); ldr $bi,[$ap_real,#32] ldp $a0,$a1,[$ap_real,#64] ldp $a2,$a3,[$ap_real,#64+16] add $bp,$ap_real,#32 add $rp,sp,#$tmp0 bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); mov $t0,$acc0 mov $t1,$acc1 ldp $a0,$a1,[sp,#$S] // forward load for p256_sqr_mont mov $t2,$acc2 mov $t3,$acc3 ldp $a2,$a3,[sp,#$S+16] add $rp,$rp_real,#64 bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); add $rp,sp,#$tmp0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); ldr $bi,[sp,#$Zsqr] // forward load for p256_mul_mont ldp $a0,$a1,[sp,#$M] ldp $a2,$a3,[sp,#$M+16] add $rp,$rp_real,#32 bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); add $bp,sp,#$Zsqr add $rp,sp,#$M bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); mov $t0,$acc0 // duplicate M mov $t1,$acc1 mov $t2,$acc2 mov $t3,$acc3 mov $a0,$acc0 // put M aside mov $a1,$acc1 mov $a2,$acc2 mov $a3,$acc3 add $rp,sp,#$M bl __ecp_nistz256_add mov $t0,$a0 // restore M mov $t1,$a1 ldr $bi,[$ap_real] // forward load for p256_mul_mont mov $t2,$a2 ldp $a0,$a1,[sp,#$S] mov $t3,$a3 ldp $a2,$a3,[sp,#$S+16] bl __ecp_nistz256_add // p256_mul_by_3(M, M); add $bp,$ap_real,#0 add $rp,sp,#$S bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); mov $t0,$acc0 mov $t1,$acc1 ldp $a0,$a1,[sp,#$M] // forward load for p256_sqr_mont mov $t2,$acc2 mov $t3,$acc3 ldp $a2,$a3,[sp,#$M+16] add $rp,sp,#$tmp0 bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); add $rp,$rp_real,#0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); add $bp,sp,#$tmp0 bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); add $bp,sp,#$S add $rp,sp,#$S bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); ldr $bi,[sp,#$M] mov $a0,$acc0 // copy S mov $a1,$acc1 mov $a2,$acc2 mov $a3,$acc3 add $bp,sp,#$M bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); add $bp,$rp_real,#32 add $rp,$rp_real,#32 bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x29,x30,[sp],#80 ret .size GFp_nistz256_point_double,.-GFp_nistz256_point_double ___ } ######################################################################## # void GFp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1, # const P256_POINT_AFFINE *in2); { my ($res_x,$res_y,$res_z, $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..9)); my $Z1sqr = $S2; # above map() describes stack layout with 10 temporary # 256-bit vectors on top. my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp)=map("x$_",(21..26)); $code.=<<___; .globl GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,%function .align 5 GFp_nistz256_point_add_affine: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] sub sp,sp,#32*10 mov $rp_real,$rp mov $ap_real,$ap mov $bp_real,$bp ldr $poly1,.Lpoly+8 ldr $poly3,.Lpoly+24 ldp $a0,$a1,[$ap,#64] // in1_z ldp $a2,$a3,[$ap,#64+16] orr $t0,$a0,$a1 orr $t2,$a2,$a3 orr $in1infty,$t0,$t2 cmp $in1infty,#0 csetm $in1infty,ne // !in1infty ldp $acc0,$acc1,[$bp] // in2_x ldp $acc2,$acc3,[$bp,#16] ldp $t0,$t1,[$bp,#32] // in2_y ldp $t2,$t3,[$bp,#48] orr $acc0,$acc0,$acc1 orr $acc2,$acc2,$acc3 orr $t0,$t0,$t1 orr $t2,$t2,$t3 orr $acc0,$acc0,$acc2 orr $t0,$t0,$t2 orr $in2infty,$acc0,$t0 cmp $in2infty,#0 csetm $in2infty,ne // !in2infty add $rp,sp,#$Z1sqr bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); mov $a0,$acc0 mov $a1,$acc1 mov $a2,$acc2 mov $a3,$acc3 ldr $bi,[$bp_real] add $bp,$bp_real,#0 add $rp,sp,#$U2 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); add $bp,$ap_real,#0 ldr $bi,[$ap_real,#64] // forward load for p256_mul_mont ldp $a0,$a1,[sp,#$Z1sqr] ldp $a2,$a3,[sp,#$Z1sqr+16] add $rp,sp,#$H bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); add $bp,$ap_real,#64 add $rp,sp,#$S2 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); ldr $bi,[$ap_real,#64] ldp $a0,$a1,[sp,#$H] ldp $a2,$a3,[sp,#$H+16] add $bp,$ap_real,#64 add $rp,sp,#$res_z bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); ldr $bi,[$bp_real,#32] ldp $a0,$a1,[sp,#$S2] ldp $a2,$a3,[sp,#$S2+16] add $bp,$bp_real,#32 add $rp,sp,#$S2 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); add $bp,$ap_real,#32 ldp $a0,$a1,[sp,#$H] // forward load for p256_sqr_mont ldp $a2,$a3,[sp,#$H+16] add $rp,sp,#$R bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); add $rp,sp,#$Hsqr bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); ldp $a0,$a1,[sp,#$R] ldp $a2,$a3,[sp,#$R+16] add $rp,sp,#$Rsqr bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); ldr $bi,[sp,#$H] ldp $a0,$a1,[sp,#$Hsqr] ldp $a2,$a3,[sp,#$Hsqr+16] add $bp,sp,#$H add $rp,sp,#$Hcub bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); ldr $bi,[$ap_real] ldp $a0,$a1,[sp,#$Hsqr] ldp $a2,$a3,[sp,#$Hsqr+16] add $bp,$ap_real,#0 add $rp,sp,#$U2 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); mov $t0,$acc0 mov $t1,$acc1 mov $t2,$acc2 mov $t3,$acc3 add $rp,sp,#$Hsqr bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); add $bp,sp,#$Rsqr add $rp,sp,#$res_x bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); add $bp,sp,#$Hcub bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); add $bp,sp,#$U2 ldr $bi,[$ap_real,#32] // forward load for p256_mul_mont ldp $a0,$a1,[sp,#$Hcub] ldp $a2,$a3,[sp,#$Hcub+16] add $rp,sp,#$res_y bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); add $bp,$ap_real,#32 add $rp,sp,#$S2 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); ldr $bi,[sp,#$R] ldp $a0,$a1,[sp,#$res_y] ldp $a2,$a3,[sp,#$res_y+16] add $bp,sp,#$R add $rp,sp,#$res_y bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); add $bp,sp,#$S2 bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); ldp $a0,$a1,[sp,#$res_x] // res ldp $a2,$a3,[sp,#$res_x+16] ldp $t0,$t1,[$bp_real] // in2 ldp $t2,$t3,[$bp_real,#16] ___ for($i=0;$i<64;$i+=32) { # conditional moves $code.=<<___; ldp $acc0,$acc1,[$ap_real,#$i] // in1 cmp $in1infty,#0 // !$in1intfy, remember? ldp $acc2,$acc3,[$ap_real,#$i+16] csel $t0,$a0,$t0,ne csel $t1,$a1,$t1,ne ldp $a0,$a1,[sp,#$res_x+$i+32] // res csel $t2,$a2,$t2,ne csel $t3,$a3,$t3,ne cmp $in2infty,#0 // !$in2intfy, remember? ldp $a2,$a3,[sp,#$res_x+$i+48] csel $acc0,$t0,$acc0,ne csel $acc1,$t1,$acc1,ne ldp $t0,$t1,[$bp_real,#$i+32] // in2 csel $acc2,$t2,$acc2,ne csel $acc3,$t3,$acc3,ne ldp $t2,$t3,[$bp_real,#$i+48] stp $acc0,$acc1,[$rp_real,#$i] stp $acc2,$acc3,[$rp_real,#$i+16] ___ $code.=<<___ if ($i == 0); adr $bp_real,.Lone_mont-64 ___ } $code.=<<___; ldp $acc0,$acc1,[$ap_real,#$i] // in1 cmp $in1infty,#0 // !$in1intfy, remember? ldp $acc2,$acc3,[$ap_real,#$i+16] csel $t0,$a0,$t0,ne csel $t1,$a1,$t1,ne csel $t2,$a2,$t2,ne csel $t3,$a3,$t3,ne cmp $in2infty,#0 // !$in2intfy, remember? csel $acc0,$t0,$acc0,ne csel $acc1,$t1,$acc1,ne csel $acc2,$t2,$acc2,ne csel $acc3,$t3,$acc3,ne stp $acc0,$acc1,[$rp_real,#$i] stp $acc2,$acc3,[$rp_real,#$i+16] add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x29,x30,[sp],#80 ret .size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine ___ } } foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/ge; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl000064400000000000000000001037271352416253600210260ustar0000000000000000#! /usr/bin/env perl # Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. All advertising materials mentioning features or use of this # software must display the following acknowledgment: # "This product includes software developed by the OpenSSL Project # for use in the OpenSSL Toolkit. (http://www.openssl.org/)" # # 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to # endorse or promote products derived from this software without # prior written permission. For written permission, please contact # openssl-core@openssl.org. # # 5. Products derived from this software may not be called "OpenSSL" # nor may "OpenSSL" appear in their names without prior written # permission of the OpenSSL Project. # # 6. Redistributions of any form whatsoever must retain the following # acknowledgment: # "This product includes software developed by the OpenSSL Project # for use in the OpenSSL Toolkit (http://www.openssl.org/)" # # THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # ==================================================================== # # This product includes cryptographic software written by Eric Young # (eay@cryptsoft.com). This product includes software written by Tim # Hudson (tjh@cryptsoft.com). # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # ECP_NISTZ256 module for x86/SSE2. # # October 2014. # # Original ECP_NISTZ256 submission targeting x86_64 is detailed in # http://eprint.iacr.org/2013/816. In the process of adaptation # original .c module was made 32-bit savvy in order to make this # implementation possible. # # with/without -DECP_NISTZ256_ASM # Pentium +66-163% # PIII +72-172% # P4 +65-132% # Core2 +90-215% # Sandy Bridge +105-265% (contemporary i[57]-* are all close to this) # Atom +65-155% # Opteron +54-110% # Bulldozer +99-240% # VIA Nano +93-290% # # Ranges denote minimum and maximum improvement coefficients depending # on benchmark. Lower coefficients are for ECDSA sign, server-side # operation. Keep in mind that +200% means 3x improvement. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output=pop; open STDOUT,">$output"; &asm_init($ARGV[0],"ecp_nistz256-x86.pl",$ARGV[$#ARGV] eq "386"); $sse2=0; for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &external_label("GFp_ia32cap_P") if ($sse2); ######################################################################## # Keep in mind that constants are stored least to most significant word &static_label("ONE_mont"); &set_label("ONE_mont"); &data_word(1,0,0,-1,-1,-1,-2,0); &function_begin_B("_ecp_nistz256_div_by_2"); # tmp = a is odd ? a+mod : a # # note that because mod has special form, i.e. consists of # 0xffffffff, 1 and 0s, we can conditionally synthesize it by # assigning least significant bit of input to one register, # %ebp, and its negative to another, %edx. &mov ("ebp",&DWP(0,"esi")); &xor ("edx","edx"); &mov ("ebx",&DWP(4,"esi")); &mov ("eax","ebp"); &and ("ebp",1); &mov ("ecx",&DWP(8,"esi")); &sub ("edx","ebp"); &add ("eax","edx"); &adc ("ebx","edx"); &mov (&DWP(0,"edi"),"eax"); &adc ("ecx","edx"); &mov (&DWP(4,"edi"),"ebx"); &mov (&DWP(8,"edi"),"ecx"); &mov ("eax",&DWP(12,"esi")); &mov ("ebx",&DWP(16,"esi")); &adc ("eax",0); &mov ("ecx",&DWP(20,"esi")); &adc ("ebx",0); &mov (&DWP(12,"edi"),"eax"); &adc ("ecx",0); &mov (&DWP(16,"edi"),"ebx"); &mov (&DWP(20,"edi"),"ecx"); &mov ("eax",&DWP(24,"esi")); &mov ("ebx",&DWP(28,"esi")); &adc ("eax","ebp"); &adc ("ebx","edx"); &mov (&DWP(24,"edi"),"eax"); &sbb ("esi","esi"); # broadcast carry bit &mov (&DWP(28,"edi"),"ebx"); # ret = tmp >> 1 &mov ("eax",&DWP(0,"edi")); &mov ("ebx",&DWP(4,"edi")); &mov ("ecx",&DWP(8,"edi")); &mov ("edx",&DWP(12,"edi")); &shr ("eax",1); &mov ("ebp","ebx"); &shl ("ebx",31); &or ("eax","ebx"); &shr ("ebp",1); &mov ("ebx","ecx"); &shl ("ecx",31); &mov (&DWP(0,"edi"),"eax"); &or ("ebp","ecx"); &mov ("eax",&DWP(16,"edi")); &shr ("ebx",1); &mov ("ecx","edx"); &shl ("edx",31); &mov (&DWP(4,"edi"),"ebp"); &or ("ebx","edx"); &mov ("ebp",&DWP(20,"edi")); &shr ("ecx",1); &mov ("edx","eax"); &shl ("eax",31); &mov (&DWP(8,"edi"),"ebx"); &or ("ecx","eax"); &mov ("ebx",&DWP(24,"edi")); &shr ("edx",1); &mov ("eax","ebp"); &shl ("ebp",31); &mov (&DWP(12,"edi"),"ecx"); &or ("edx","ebp"); &mov ("ecx",&DWP(28,"edi")); &shr ("eax",1); &mov ("ebp","ebx"); &shl ("ebx",31); &mov (&DWP(16,"edi"),"edx"); &or ("eax","ebx"); &shr ("ebp",1); &mov ("ebx","ecx"); &shl ("ecx",31); &mov (&DWP(20,"edi"),"eax"); &or ("ebp","ecx"); &shr ("ebx",1); &shl ("esi",31); &mov (&DWP(24,"edi"),"ebp"); &or ("ebx","esi"); # handle top-most carry bit &mov (&DWP(28,"edi"),"ebx"); &ret (); &function_end_B("_ecp_nistz256_div_by_2"); ######################################################################## # void GFp_nistz256_add(BN_ULONG edi[8],const BN_ULONG esi[8], # const BN_ULONG ebp[8]); &function_begin("GFp_nistz256_add"); &mov ("esi",&wparam(1)); &mov ("ebp",&wparam(2)); &mov ("edi",&wparam(0)); &call ("_ecp_nistz256_add"); &function_end("GFp_nistz256_add"); &function_begin_B("_ecp_nistz256_add"); &mov ("eax",&DWP(0,"esi")); &mov ("ebx",&DWP(4,"esi")); &mov ("ecx",&DWP(8,"esi")); &add ("eax",&DWP(0,"ebp")); &mov ("edx",&DWP(12,"esi")); &adc ("ebx",&DWP(4,"ebp")); &mov (&DWP(0,"edi"),"eax"); &adc ("ecx",&DWP(8,"ebp")); &mov (&DWP(4,"edi"),"ebx"); &adc ("edx",&DWP(12,"ebp")); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &mov ("eax",&DWP(16,"esi")); &mov ("ebx",&DWP(20,"esi")); &mov ("ecx",&DWP(24,"esi")); &adc ("eax",&DWP(16,"ebp")); &mov ("edx",&DWP(28,"esi")); &adc ("ebx",&DWP(20,"ebp")); &mov (&DWP(16,"edi"),"eax"); &adc ("ecx",&DWP(24,"ebp")); &mov (&DWP(20,"edi"),"ebx"); &mov ("esi",0); &adc ("edx",&DWP(28,"ebp")); &mov (&DWP(24,"edi"),"ecx"); &adc ("esi",0); &mov (&DWP(28,"edi"),"edx"); # if a+b >= modulus, subtract modulus. # # But since comparison implies subtraction, we subtract modulus # to see if it borrows, and then subtract it for real if # subtraction didn't borrow. &mov ("eax",&DWP(0,"edi")); &mov ("ebx",&DWP(4,"edi")); &mov ("ecx",&DWP(8,"edi")); &sub ("eax",-1); &mov ("edx",&DWP(12,"edi")); &sbb ("ebx",-1); &mov ("eax",&DWP(16,"edi")); &sbb ("ecx",-1); &mov ("ebx",&DWP(20,"edi")); &sbb ("edx",0); &mov ("ecx",&DWP(24,"edi")); &sbb ("eax",0); &mov ("edx",&DWP(28,"edi")); &sbb ("ebx",0); &sbb ("ecx",1); &sbb ("edx",-1); &sbb ("esi",0); # Note that because mod has special form, i.e. consists of # 0xffffffff, 1 and 0s, we can conditionally synthesize it by # by using borrow. ¬ ("esi"); &mov ("eax",&DWP(0,"edi")); &mov ("ebp","esi"); &mov ("ebx",&DWP(4,"edi")); &shr ("ebp",31); &mov ("ecx",&DWP(8,"edi")); &sub ("eax","esi"); &mov ("edx",&DWP(12,"edi")); &sbb ("ebx","esi"); &mov (&DWP(0,"edi"),"eax"); &sbb ("ecx","esi"); &mov (&DWP(4,"edi"),"ebx"); &sbb ("edx",0); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &mov ("eax",&DWP(16,"edi")); &mov ("ebx",&DWP(20,"edi")); &mov ("ecx",&DWP(24,"edi")); &sbb ("eax",0); &mov ("edx",&DWP(28,"edi")); &sbb ("ebx",0); &mov (&DWP(16,"edi"),"eax"); &sbb ("ecx","ebp"); &mov (&DWP(20,"edi"),"ebx"); &sbb ("edx","esi"); &mov (&DWP(24,"edi"),"ecx"); &mov (&DWP(28,"edi"),"edx"); &ret (); &function_end_B("_ecp_nistz256_add"); &function_begin_B("_ecp_nistz256_sub"); &mov ("eax",&DWP(0,"esi")); &mov ("ebx",&DWP(4,"esi")); &mov ("ecx",&DWP(8,"esi")); &sub ("eax",&DWP(0,"ebp")); &mov ("edx",&DWP(12,"esi")); &sbb ("ebx",&DWP(4,"ebp")); &mov (&DWP(0,"edi"),"eax"); &sbb ("ecx",&DWP(8,"ebp")); &mov (&DWP(4,"edi"),"ebx"); &sbb ("edx",&DWP(12,"ebp")); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &mov ("eax",&DWP(16,"esi")); &mov ("ebx",&DWP(20,"esi")); &mov ("ecx",&DWP(24,"esi")); &sbb ("eax",&DWP(16,"ebp")); &mov ("edx",&DWP(28,"esi")); &sbb ("ebx",&DWP(20,"ebp")); &sbb ("ecx",&DWP(24,"ebp")); &mov (&DWP(16,"edi"),"eax"); &sbb ("edx",&DWP(28,"ebp")); &mov (&DWP(20,"edi"),"ebx"); &sbb ("esi","esi"); # broadcast borrow bit &mov (&DWP(24,"edi"),"ecx"); &mov (&DWP(28,"edi"),"edx"); # if a-b borrows, add modulus. # # Note that because mod has special form, i.e. consists of # 0xffffffff, 1 and 0s, we can conditionally synthesize it by # assigning borrow bit to one register, %ebp, and its negative # to another, %esi. But we started by calculating %esi... &mov ("eax",&DWP(0,"edi")); &mov ("ebp","esi"); &mov ("ebx",&DWP(4,"edi")); &shr ("ebp",31); &mov ("ecx",&DWP(8,"edi")); &add ("eax","esi"); &mov ("edx",&DWP(12,"edi")); &adc ("ebx","esi"); &mov (&DWP(0,"edi"),"eax"); &adc ("ecx","esi"); &mov (&DWP(4,"edi"),"ebx"); &adc ("edx",0); &mov (&DWP(8,"edi"),"ecx"); &mov (&DWP(12,"edi"),"edx"); &mov ("eax",&DWP(16,"edi")); &mov ("ebx",&DWP(20,"edi")); &mov ("ecx",&DWP(24,"edi")); &adc ("eax",0); &mov ("edx",&DWP(28,"edi")); &adc ("ebx",0); &mov (&DWP(16,"edi"),"eax"); &adc ("ecx","ebp"); &mov (&DWP(20,"edi"),"ebx"); &adc ("edx","esi"); &mov (&DWP(24,"edi"),"ecx"); &mov (&DWP(28,"edi"),"edx"); &ret (); &function_end_B("_ecp_nistz256_sub"); ######################################################################## # void GFp_nistz256_neg(BN_ULONG edi[8],const BN_ULONG esi[8]); &function_begin("GFp_nistz256_neg"); &mov ("ebp",&wparam(1)); &mov ("edi",&wparam(0)); &xor ("eax","eax"); &stack_push(8); &mov (&DWP(0,"esp"),"eax"); &mov ("esi","esp"); &mov (&DWP(4,"esp"),"eax"); &mov (&DWP(8,"esp"),"eax"); &mov (&DWP(12,"esp"),"eax"); &mov (&DWP(16,"esp"),"eax"); &mov (&DWP(20,"esp"),"eax"); &mov (&DWP(24,"esp"),"eax"); &mov (&DWP(28,"esp"),"eax"); &call ("_ecp_nistz256_sub"); &stack_pop(8); &function_end("GFp_nistz256_neg"); &function_begin_B("_picup_eax"); &mov ("eax",&DWP(0,"esp")); &ret (); &function_end_B("_picup_eax"); ######################################################################## # void GFp_nistz256_mul_mont(BN_ULONG edi[8],const BN_ULONG esi[8], # const BN_ULONG ebp[8]); &function_begin("GFp_nistz256_mul_mont"); &mov ("esi",&wparam(1)); &mov ("ebp",&wparam(2)); if ($sse2) { &call ("_picup_eax"); &set_label("pic"); &picmeup("eax","GFp_ia32cap_P","eax",&label("pic")); &mov ("eax",&DWP(0,"eax")); } &mov ("edi",&wparam(0)); &call ("_ecp_nistz256_mul_mont"); &function_end("GFp_nistz256_mul_mont"); &function_begin_B("_ecp_nistz256_mul_mont"); if ($sse2) { # We always use SSE2 ######################################## # SSE2 code path featuring 32x16-bit # multiplications is ~2x faster than # IALU counterpart (except on Atom)... ######################################## # stack layout: # +------------------------------------+< %esp # | 7 16-byte temporary XMM words, | # | "sliding" toward lower address | # . . # +------------------------------------+ # | unused XMM word | # +------------------------------------+< +128,%ebx # | 8 16-byte XMM words holding copies | # | of a[i]<<64|a[i] | # . . # . . # +------------------------------------+< +256 &mov ("edx","esp"); &sub ("esp",0x100); &movd ("xmm7",&DWP(0,"ebp")); # b[0] -> 0000.00xy &lea ("ebp",&DWP(4,"ebp")); &pcmpeqd("xmm6","xmm6"); &psrlq ("xmm6",48); # compose 0xffff<<64|0xffff &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y &and ("esp",-64); &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y &lea ("ebx",&DWP(0x80,"esp")); &movd ("xmm0",&DWP(4*0,"esi")); # a[0] -> 0000.00xy &pshufd ("xmm0","xmm0",0b11001100); # 0000.00xy -> 00xy.00xy &movd ("xmm1",&DWP(4*1,"esi")); # a[1] -> ... &movdqa (&QWP(0x00,"ebx"),"xmm0"); # offload converted a[0] &pmuludq("xmm0","xmm7"); # a[0]*b[0] &movd ("xmm2",&DWP(4*2,"esi")); &pshufd ("xmm1","xmm1",0b11001100); &movdqa (&QWP(0x10,"ebx"),"xmm1"); &pmuludq("xmm1","xmm7"); # a[1]*b[0] &movq ("xmm4","xmm0"); # clear upper 64 bits &pslldq("xmm4",6); &paddq ("xmm4","xmm0"); &movdqa("xmm5","xmm4"); &psrldq("xmm4",10); # upper 32 bits of a[0]*b[0] &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[0] # Upper half of a[0]*b[i] is carried into next multiplication # iteration, while lower one "participates" in actual reduction. # Normally latter is done by accumulating result of multiplication # of modulus by "magic" digit, but thanks to special form of modulus # and "magic" digit it can be performed only with additions and # subtractions (see note in IALU section below). Note that we are # not bothered with carry bits, they are accumulated in "flatten" # phase after all multiplications and reductions. &movd ("xmm3",&DWP(4*3,"esi")); &pshufd ("xmm2","xmm2",0b11001100); &movdqa (&QWP(0x20,"ebx"),"xmm2"); &pmuludq("xmm2","xmm7"); # a[2]*b[0] &paddq ("xmm1","xmm4"); # a[1]*b[0]+hw(a[0]*b[0]), carry &movdqa (&QWP(0x00,"esp"),"xmm1"); # t[0] &movd ("xmm0",&DWP(4*4,"esi")); &pshufd ("xmm3","xmm3",0b11001100); &movdqa (&QWP(0x30,"ebx"),"xmm3"); &pmuludq("xmm3","xmm7"); # a[3]*b[0] &movdqa (&QWP(0x10,"esp"),"xmm2"); &movd ("xmm1",&DWP(4*5,"esi")); &pshufd ("xmm0","xmm0",0b11001100); &movdqa (&QWP(0x40,"ebx"),"xmm0"); &pmuludq("xmm0","xmm7"); # a[4]*b[0] &paddq ("xmm3","xmm5"); # a[3]*b[0]+lw(a[0]*b[0]), reduction step &movdqa (&QWP(0x20,"esp"),"xmm3"); &movd ("xmm2",&DWP(4*6,"esi")); &pshufd ("xmm1","xmm1",0b11001100); &movdqa (&QWP(0x50,"ebx"),"xmm1"); &pmuludq("xmm1","xmm7"); # a[5]*b[0] &movdqa (&QWP(0x30,"esp"),"xmm0"); &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step &movd ("xmm3",&DWP(4*7,"esi")); &pshufd ("xmm2","xmm2",0b11001100); &movdqa (&QWP(0x60,"ebx"),"xmm2"); &pmuludq("xmm2","xmm7"); # a[6]*b[0] &movdqa (&QWP(0x40,"esp"),"xmm1"); &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step &movd ("xmm0",&DWP(0,"ebp")); # b[1] -> 0000.00xy &pshufd ("xmm3","xmm3",0b11001100); &movdqa (&QWP(0x70,"ebx"),"xmm3"); &pmuludq("xmm3","xmm7"); # a[7]*b[0] &pshuflw("xmm7","xmm0",0b11011100); # 0000.00xy -> 0000.0x0y &movdqa ("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0] &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y &mov ("ecx",6); &lea ("ebp",&DWP(4,"ebp")); &jmp (&label("madd_sse2")); &set_label("madd_sse2",16); &paddq ("xmm2","xmm5"); # a[6]*b[i-1]+lw(a[0]*b[i-1]), reduction step [modulo-scheduled] &paddq ("xmm3","xmm4"); # a[7]*b[i-1]+lw(a[0]*b[i-1])*0xffffffff, reduction step [modulo-scheduled] &movdqa ("xmm1",&QWP(0x10,"ebx")); &pmuludq("xmm0","xmm7"); # a[0]*b[i] &movdqa(&QWP(0x50,"esp"),"xmm2"); &movdqa ("xmm2",&QWP(0x20,"ebx")); &pmuludq("xmm1","xmm7"); # a[1]*b[i] &movdqa(&QWP(0x60,"esp"),"xmm3"); &paddq ("xmm0",&QWP(0x00,"esp")); &movdqa ("xmm3",&QWP(0x30,"ebx")); &pmuludq("xmm2","xmm7"); # a[2]*b[i] &movq ("xmm4","xmm0"); # clear upper 64 bits &pslldq("xmm4",6); &paddq ("xmm1",&QWP(0x10,"esp")); &paddq ("xmm4","xmm0"); &movdqa("xmm5","xmm4"); &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0] &movdqa ("xmm0",&QWP(0x40,"ebx")); &pmuludq("xmm3","xmm7"); # a[3]*b[i] &paddq ("xmm1","xmm4"); # a[1]*b[i]+hw(a[0]*b[i]), carry &paddq ("xmm2",&QWP(0x20,"esp")); &movdqa (&QWP(0x00,"esp"),"xmm1"); &movdqa ("xmm1",&QWP(0x50,"ebx")); &pmuludq("xmm0","xmm7"); # a[4]*b[i] &paddq ("xmm3",&QWP(0x30,"esp")); &movdqa (&QWP(0x10,"esp"),"xmm2"); &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i] &movdqa ("xmm2",&QWP(0x60,"ebx")); &pmuludq("xmm1","xmm7"); # a[5]*b[i] &paddq ("xmm3","xmm5"); # a[3]*b[i]+lw(a[0]*b[i]), reduction step &paddq ("xmm0",&QWP(0x40,"esp")); &movdqa (&QWP(0x20,"esp"),"xmm3"); &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step &movdqa ("xmm3","xmm7"); &pmuludq("xmm2","xmm7"); # a[6]*b[i] &movd ("xmm7",&DWP(0,"ebp")); # b[i++] -> 0000.00xy &lea ("ebp",&DWP(4,"ebp")); &paddq ("xmm1",&QWP(0x50,"esp")); &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step &movdqa (&QWP(0x30,"esp"),"xmm0"); &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y &pmuludq("xmm3",&QWP(0x70,"ebx")); # a[7]*b[i] &pshufd("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y &movdqa("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0] &movdqa (&QWP(0x40,"esp"),"xmm1"); &paddq ("xmm2",&QWP(0x60,"esp")); &dec ("ecx"); &jnz (&label("madd_sse2")); &paddq ("xmm2","xmm5"); # a[6]*b[6]+lw(a[0]*b[6]), reduction step [modulo-scheduled] &paddq ("xmm3","xmm4"); # a[7]*b[6]+lw(a[0]*b[6])*0xffffffff, reduction step [modulo-scheduled] &movdqa ("xmm1",&QWP(0x10,"ebx")); &pmuludq("xmm0","xmm7"); # a[0]*b[7] &movdqa(&QWP(0x50,"esp"),"xmm2"); &movdqa ("xmm2",&QWP(0x20,"ebx")); &pmuludq("xmm1","xmm7"); # a[1]*b[7] &movdqa(&QWP(0x60,"esp"),"xmm3"); &paddq ("xmm0",&QWP(0x00,"esp")); &movdqa ("xmm3",&QWP(0x30,"ebx")); &pmuludq("xmm2","xmm7"); # a[2]*b[7] &movq ("xmm4","xmm0"); # clear upper 64 bits &pslldq("xmm4",6); &paddq ("xmm1",&QWP(0x10,"esp")); &paddq ("xmm4","xmm0"); &movdqa("xmm5","xmm4"); &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0] &movdqa ("xmm0",&QWP(0x40,"ebx")); &pmuludq("xmm3","xmm7"); # a[3]*b[7] &paddq ("xmm1","xmm4"); # a[1]*b[7]+hw(a[0]*b[7]), carry &paddq ("xmm2",&QWP(0x20,"esp")); &movdqa (&QWP(0x00,"esp"),"xmm1"); &movdqa ("xmm1",&QWP(0x50,"ebx")); &pmuludq("xmm0","xmm7"); # a[4]*b[7] &paddq ("xmm3",&QWP(0x30,"esp")); &movdqa (&QWP(0x10,"esp"),"xmm2"); &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i] &movdqa ("xmm2",&QWP(0x60,"ebx")); &pmuludq("xmm1","xmm7"); # a[5]*b[7] &paddq ("xmm3","xmm5"); # reduction step &paddq ("xmm0",&QWP(0x40,"esp")); &movdqa (&QWP(0x20,"esp"),"xmm3"); &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step &movdqa ("xmm3",&QWP(0x70,"ebx")); &pmuludq("xmm2","xmm7"); # a[6]*b[7] &paddq ("xmm1",&QWP(0x50,"esp")); &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step &movdqa (&QWP(0x30,"esp"),"xmm0"); &pmuludq("xmm3","xmm7"); # a[7]*b[7] &pcmpeqd("xmm7","xmm7"); &movdqa ("xmm0",&QWP(0x00,"esp")); &pslldq ("xmm7",8); &movdqa (&QWP(0x40,"esp"),"xmm1"); &paddq ("xmm2",&QWP(0x60,"esp")); &paddq ("xmm2","xmm5"); # a[6]*b[7]+lw(a[0]*b[7]), reduction step &paddq ("xmm3","xmm4"); # a[6]*b[7]+lw(a[0]*b[7])*0xffffffff, reduction step &movdqa(&QWP(0x50,"esp"),"xmm2"); &movdqa(&QWP(0x60,"esp"),"xmm3"); &movdqa ("xmm1",&QWP(0x10,"esp")); &movdqa ("xmm2",&QWP(0x20,"esp")); &movdqa ("xmm3",&QWP(0x30,"esp")); &movq ("xmm4","xmm0"); # "flatten" &pand ("xmm0","xmm7"); &xor ("ebp","ebp"); &pslldq ("xmm4",6); &movq ("xmm5","xmm1"); &paddq ("xmm0","xmm4"); &pand ("xmm1","xmm7"); &psrldq ("xmm0",6); &movd ("eax","xmm0"); &psrldq ("xmm0",4); &paddq ("xmm5","xmm0"); &movdqa ("xmm0",&QWP(0x40,"esp")); &sub ("eax",-1); # start subtracting modulus, # this is used to determine # if result is larger/smaller # than modulus (see below) &pslldq ("xmm5",6); &movq ("xmm4","xmm2"); &paddq ("xmm1","xmm5"); &pand ("xmm2","xmm7"); &psrldq ("xmm1",6); &mov (&DWP(4*0,"edi"),"eax"); &movd ("eax","xmm1"); &psrldq ("xmm1",4); &paddq ("xmm4","xmm1"); &movdqa ("xmm1",&QWP(0x50,"esp")); &sbb ("eax",-1); &pslldq ("xmm4",6); &movq ("xmm5","xmm3"); &paddq ("xmm2","xmm4"); &pand ("xmm3","xmm7"); &psrldq ("xmm2",6); &mov (&DWP(4*1,"edi"),"eax"); &movd ("eax","xmm2"); &psrldq ("xmm2",4); &paddq ("xmm5","xmm2"); &movdqa ("xmm2",&QWP(0x60,"esp")); &sbb ("eax",-1); &pslldq ("xmm5",6); &movq ("xmm4","xmm0"); &paddq ("xmm3","xmm5"); &pand ("xmm0","xmm7"); &psrldq ("xmm3",6); &mov (&DWP(4*2,"edi"),"eax"); &movd ("eax","xmm3"); &psrldq ("xmm3",4); &paddq ("xmm4","xmm3"); &sbb ("eax",0); &pslldq ("xmm4",6); &movq ("xmm5","xmm1"); &paddq ("xmm0","xmm4"); &pand ("xmm1","xmm7"); &psrldq ("xmm0",6); &mov (&DWP(4*3,"edi"),"eax"); &movd ("eax","xmm0"); &psrldq ("xmm0",4); &paddq ("xmm5","xmm0"); &sbb ("eax",0); &pslldq ("xmm5",6); &movq ("xmm4","xmm2"); &paddq ("xmm1","xmm5"); &pand ("xmm2","xmm7"); &psrldq ("xmm1",6); &movd ("ebx","xmm1"); &psrldq ("xmm1",4); &mov ("esp","edx"); &paddq ("xmm4","xmm1"); &pslldq ("xmm4",6); &paddq ("xmm2","xmm4"); &psrldq ("xmm2",6); &movd ("ecx","xmm2"); &psrldq ("xmm2",4); &sbb ("ebx",0); &movd ("edx","xmm2"); &pextrw ("esi","xmm2",2); # top-most overflow bit &sbb ("ecx",1); &sbb ("edx",-1); &sbb ("esi",0); # borrow from subtraction # Final step is "if result > mod, subtract mod", and at this point # we have result - mod written to output buffer, as well as borrow # bit from this subtraction, and if borrow bit is set, we add # modulus back. # # Note that because mod has special form, i.e. consists of # 0xffffffff, 1 and 0s, we can conditionally synthesize it by # assigning borrow bit to one register, %ebp, and its negative # to another, %esi. But we started by calculating %esi... &sub ("ebp","esi"); &add (&DWP(4*0,"edi"),"esi"); # add modulus or zero &adc (&DWP(4*1,"edi"),"esi"); &adc (&DWP(4*2,"edi"),"esi"); &adc (&DWP(4*3,"edi"),0); &adc ("eax",0); &adc ("ebx",0); &mov (&DWP(4*4,"edi"),"eax"); &adc ("ecx","ebp"); &mov (&DWP(4*5,"edi"),"ebx"); &adc ("edx","esi"); &mov (&DWP(4*6,"edi"),"ecx"); &mov (&DWP(4*7,"edi"),"edx"); &ret (); } # Non-SSE2 code removed. &function_end_B("_ecp_nistz256_mul_mont"); ######################################################################## # following subroutines are "literal" implementation of those found in # ecp_nistz256.c # ######################################################################## # void GFp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); # &static_label("point_double_shortcut"); &function_begin("GFp_nistz256_point_double"); { my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); &mov ("esi",&wparam(1)); # above map() describes stack layout with 5 temporary # 256-bit vectors on top, then we take extra word for # GFp_ia32cap_P copy. &stack_push(8*5+1); if ($sse2) { &call ("_picup_eax"); &set_label("pic"); &picmeup("edx","GFp_ia32cap_P","eax",&label("pic")); &mov ("ebp",&DWP(0,"edx")); } &set_label("point_double_shortcut"); &mov ("eax",&DWP(0,"esi")); # copy in_x &mov ("ebx",&DWP(4,"esi")); &mov ("ecx",&DWP(8,"esi")); &mov ("edx",&DWP(12,"esi")); &mov (&DWP($in_x+0,"esp"),"eax"); &mov (&DWP($in_x+4,"esp"),"ebx"); &mov (&DWP($in_x+8,"esp"),"ecx"); &mov (&DWP($in_x+12,"esp"),"edx"); &mov ("eax",&DWP(16,"esi")); &mov ("ebx",&DWP(20,"esi")); &mov ("ecx",&DWP(24,"esi")); &mov ("edx",&DWP(28,"esi")); &mov (&DWP($in_x+16,"esp"),"eax"); &mov (&DWP($in_x+20,"esp"),"ebx"); &mov (&DWP($in_x+24,"esp"),"ecx"); &mov (&DWP($in_x+28,"esp"),"edx"); &mov (&DWP(32*5,"esp"),"ebp"); # GFp_ia32cap_P copy &lea ("ebp",&DWP(32,"esi")); &lea ("esi",&DWP(32,"esi")); &lea ("edi",&DWP($S,"esp")); &call ("_ecp_nistz256_add"); # p256_mul_by_2(S, in_y); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &mov ("esi",64); &add ("esi",&wparam(1)); &lea ("edi",&DWP($Zsqr,"esp")); &mov ("ebp","esi"); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Zsqr, in_z); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($S,"esp")); &lea ("ebp",&DWP($S,"esp")); &lea ("edi",&DWP($S,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(S, S); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &mov ("ebp",&wparam(1)); &lea ("esi",&DWP(32,"ebp")); &lea ("ebp",&DWP(64,"ebp")); &lea ("edi",&DWP($tmp0,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(tmp0, in_z, in_y); &lea ("esi",&DWP($in_x,"esp")); &lea ("ebp",&DWP($Zsqr,"esp")); &lea ("edi",&DWP($M,"esp")); &call ("_ecp_nistz256_add"); # p256_add(M, in_x, Zsqr); &mov ("edi",64); &lea ("esi",&DWP($tmp0,"esp")); &lea ("ebp",&DWP($tmp0,"esp")); &add ("edi",&wparam(0)); &call ("_ecp_nistz256_add"); # p256_mul_by_2(res_z, tmp0); &lea ("esi",&DWP($in_x,"esp")); &lea ("ebp",&DWP($Zsqr,"esp")); &lea ("edi",&DWP($Zsqr,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(Zsqr, in_x, Zsqr); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($S,"esp")); &lea ("ebp",&DWP($S,"esp")); &lea ("edi",&DWP($tmp0,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(tmp0, S); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($M,"esp")); &lea ("ebp",&DWP($Zsqr,"esp")); &lea ("edi",&DWP($M,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(M, M, Zsqr); &mov ("edi",32); &lea ("esi",&DWP($tmp0,"esp")); &add ("edi",&wparam(0)); &call ("_ecp_nistz256_div_by_2"); # p256_div_by_2(res_y, tmp0); &lea ("esi",&DWP($M,"esp")); &lea ("ebp",&DWP($M,"esp")); &lea ("edi",&DWP($tmp0,"esp")); &call ("_ecp_nistz256_add"); # 1/2 p256_mul_by_3(M, M); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in_x,"esp")); &lea ("ebp",&DWP($S,"esp")); &lea ("edi",&DWP($S,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, in_x); &lea ("esi",&DWP($tmp0,"esp")); &lea ("ebp",&DWP($M,"esp")); &lea ("edi",&DWP($M,"esp")); &call ("_ecp_nistz256_add"); # 2/2 p256_mul_by_3(M, M); &lea ("esi",&DWP($S,"esp")); &lea ("ebp",&DWP($S,"esp")); &lea ("edi",&DWP($tmp0,"esp")); &call ("_ecp_nistz256_add"); # p256_mul_by_2(tmp0, S); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($M,"esp")); &lea ("ebp",&DWP($M,"esp")); &mov ("edi",&wparam(0)); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(res_x, M); &mov ("esi","edi"); # %edi is still res_x here &lea ("ebp",&DWP($tmp0,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, tmp0); &lea ("esi",&DWP($S,"esp")); &mov ("ebp","edi"); # %edi is still res_x &lea ("edi",&DWP($S,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(S, S, res_x); &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy &mov ("esi","edi"); # %edi is still &S &lea ("ebp",&DWP($M,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, M); &mov ("ebp",32); &lea ("esi",&DWP($S,"esp")); &add ("ebp",&wparam(0)); &mov ("edi","ebp"); &call ("_ecp_nistz256_sub"); # p256_sub(res_y, S, res_y); &stack_pop(8*5+1); } &function_end("GFp_nistz256_point_double"); ######################################################################## # void GFp_nistz256_point_add_affine(P256_POINT *out, # const P256_POINT *in1, # const P256_POINT_AFFINE *in2); &function_begin("GFp_nistz256_point_add_affine"); { my ($res_x,$res_y,$res_z, $in1_x,$in1_y,$in1_z, $in2_x,$in2_y, $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14)); my $Z1sqr = $S2; my @ONE_mont=(1,0,0,-1,-1,-1,-2,0); &mov ("esi",&wparam(1)); # above map() describes stack layout with 15 temporary # 256-bit vectors on top, then we take extra words for # !in1infty, !in2infty, and GFp_ia32cap_P copy. &stack_push(8*15+3); if ($sse2) { &call ("_picup_eax"); &set_label("pic"); &picmeup("edx","GFp_ia32cap_P","eax",&label("pic")); &mov ("ebp",&DWP(0,"edx")); } &lea ("edi",&DWP($in1_x,"esp")); for($i=0;$i<96;$i+=16) { &mov ("eax",&DWP($i+0,"esi")); # copy in1 &mov ("ebx",&DWP($i+4,"esi")); &mov ("ecx",&DWP($i+8,"esi")); &mov ("edx",&DWP($i+12,"esi")); &mov (&DWP($i+0,"edi"),"eax"); &mov (&DWP(32*15+8,"esp"),"ebp") if ($i==0); &mov ("ebp","eax") if ($i==64); &or ("ebp","eax") if ($i>64); &mov (&DWP($i+4,"edi"),"ebx"); &or ("ebp","ebx") if ($i>=64); &mov (&DWP($i+8,"edi"),"ecx"); &or ("ebp","ecx") if ($i>=64); &mov (&DWP($i+12,"edi"),"edx"); &or ("ebp","edx") if ($i>=64); } &xor ("eax","eax"); &mov ("esi",&wparam(2)); &sub ("eax","ebp"); &or ("ebp","eax"); &sar ("ebp",31); &mov (&DWP(32*15+0,"esp"),"ebp"); # !in1infty &lea ("edi",&DWP($in2_x,"esp")); for($i=0;$i<64;$i+=16) { &mov ("eax",&DWP($i+0,"esi")); # copy in2 &mov ("ebx",&DWP($i+4,"esi")); &mov ("ecx",&DWP($i+8,"esi")); &mov ("edx",&DWP($i+12,"esi")); &mov (&DWP($i+0,"edi"),"eax"); &mov ("ebp","eax") if ($i==0); &or ("ebp","eax") if ($i!=0); &mov (&DWP($i+4,"edi"),"ebx"); &or ("ebp","ebx"); &mov (&DWP($i+8,"edi"),"ecx"); &or ("ebp","ecx"); &mov (&DWP($i+12,"edi"),"edx"); &or ("ebp","edx"); } &xor ("ebx","ebx"); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &sub ("ebx","ebp"); &lea ("esi",&DWP($in1_z,"esp")); &or ("ebx","ebp"); &lea ("ebp",&DWP($in1_z,"esp")); &sar ("ebx",31); &lea ("edi",&DWP($Z1sqr,"esp")); &mov (&DWP(32*15+4,"esp"),"ebx"); # !in2infty &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Z1sqr, in1_z); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in2_x,"esp")); &mov ("ebp","edi"); # %esi is stull &Z1sqr &lea ("edi",&DWP($U2,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, Z1sqr, in2_x); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in1_z,"esp")); &lea ("ebp",&DWP($Z1sqr,"esp")); &lea ("edi",&DWP($S2,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Z1sqr, in1_z); &lea ("esi",&DWP($U2,"esp")); &lea ("ebp",&DWP($in1_x,"esp")); &lea ("edi",&DWP($H,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(H, U2, in1_x); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in2_y,"esp")); &lea ("ebp",&DWP($S2,"esp")); &lea ("edi",&DWP($S2,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, S2, in2_y); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in1_z,"esp")); &lea ("ebp",&DWP($H,"esp")); &lea ("edi",&DWP($res_z,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_z, H, in1_z); &lea ("esi",&DWP($S2,"esp")); &lea ("ebp",&DWP($in1_y,"esp")); &lea ("edi",&DWP($R,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(R, S2, in1_y); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($H,"esp")); &lea ("ebp",&DWP($H,"esp")); &lea ("edi",&DWP($Hsqr,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Hsqr, H); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($R,"esp")); &lea ("ebp",&DWP($R,"esp")); &lea ("edi",&DWP($Rsqr,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Rsqr, R); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($in1_x,"esp")); &lea ("ebp",&DWP($Hsqr,"esp")); &lea ("edi",&DWP($U2,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, in1_x, Hsqr); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($H,"esp")); &lea ("ebp",&DWP($Hsqr,"esp")); &lea ("edi",&DWP($Hcub,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(Hcub, Hsqr, H); &lea ("esi",&DWP($U2,"esp")); &lea ("ebp",&DWP($U2,"esp")); &lea ("edi",&DWP($Hsqr,"esp")); &call ("_ecp_nistz256_add"); # p256_mul_by_2(Hsqr, U2); &lea ("esi",&DWP($Rsqr,"esp")); &lea ("ebp",&DWP($Hsqr,"esp")); &lea ("edi",&DWP($res_x,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(res_x, Rsqr, Hsqr); &lea ("esi",&DWP($res_x,"esp")); &lea ("ebp",&DWP($Hcub,"esp")); &lea ("edi",&DWP($res_x,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, Hcub); &lea ("esi",&DWP($U2,"esp")); &lea ("ebp",&DWP($res_x,"esp")); &lea ("edi",&DWP($res_y,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(res_y, U2, res_x); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($Hcub,"esp")); &lea ("ebp",&DWP($in1_y,"esp")); &lea ("edi",&DWP($S2,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Hcub, in1_y); &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy &lea ("esi",&DWP($R,"esp")); &lea ("ebp",&DWP($res_y,"esp")); &lea ("edi",&DWP($res_y,"esp")); &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_y, res_y, R); &lea ("esi",&DWP($res_y,"esp")); &lea ("ebp",&DWP($S2,"esp")); &lea ("edi",&DWP($res_y,"esp")); &call ("_ecp_nistz256_sub"); # p256_sub(res_y, res_y, S2); &mov ("ebp",&DWP(32*15+0,"esp")); # !in1infty &mov ("esi",&DWP(32*15+4,"esp")); # !in2infty &mov ("edi",&wparam(0)); &mov ("edx","ebp"); ¬ ("ebp"); &and ("edx","esi"); &and ("ebp","esi"); ¬ ("esi"); ######################################## # conditional moves for($i=64;$i<96;$i+=4) { my $one=@ONE_mont[($i-64)/4]; &mov ("eax","edx"); &and ("eax",&DWP($res_x+$i,"esp")); &mov ("ebx","ebp") if ($one && $one!=-1); &and ("ebx",$one) if ($one && $one!=-1); &mov ("ecx","esi"); &and ("ecx",&DWP($in1_x+$i,"esp")); &or ("eax",$one==-1?"ebp":"ebx") if ($one); &or ("eax","ecx"); &mov (&DWP($i,"edi"),"eax"); } for($i=0;$i<64;$i+=4) { &mov ("eax","edx"); &and ("eax",&DWP($res_x+$i,"esp")); &mov ("ebx","ebp"); &and ("ebx",&DWP($in2_x+$i,"esp")); &mov ("ecx","esi"); &and ("ecx",&DWP($in1_x+$i,"esp")); &or ("eax","ebx"); &or ("eax","ecx"); &mov (&DWP($i,"edi"),"eax"); } &stack_pop(8*15+3); } &function_end("GFp_nistz256_point_add_affine"); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl000064400000000000000000002642751352416253600203640ustar0000000000000000#! /usr/bin/env perl # Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. # Copyright (c) 2014, Intel Corporation. All Rights Reserved. # Copyright (c) 2015 CloudFlare, Inc. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # Originally written by Shay Gueron (1, 2), and Vlad Krasnov (1, 3) # (1) Intel Corporation, Israel Development Center, Haifa, Israel # (2) University of Haifa, Israel # (3) CloudFlare, Inc. # # Reference: # S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with # 256 Bit Primes" # Further optimization by : # # this/original with/without -DECP_NISTZ256_ASM(*) # Opteron +15-49% +150-195% # Bulldozer +18-45% +175-240% # P4 +24-46% +100-150% # Westmere +18-34% +87-160% # Sandy Bridge +14-35% +120-185% # Ivy Bridge +11-35% +125-180% # Haswell +10-37% +160-200% # Broadwell +24-58% +210-270% # Atom +20-50% +180-240% # VIA Nano +50-160% +480-480% # # (*) "without -DECP_NISTZ256_ASM" refers to build with # "enable-ec_nistp_64_gcc_128"; # # Ranges denote minimum and maximum improvement coefficients depending # on benchmark. In "this/original" column lower coefficient is for # ECDSA sign, while in "with/without" - for ECDH key agreement, and # higher - for ECDSA sign, relatively fastest server-side operation. # Keep in mind that +100% means 2x improvement. $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $avx = 2; $addx = 1; $code.=<<___; .text .extern GFp_ia32cap_P # The polynomial .align 64 .Lpoly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 .LOne: .long 1,1,1,1,1,1,1,1 .LTwo: .long 2,2,2,2,2,2,2,2 .LThree: .long 3,3,3,3,3,3,3,3 .LONE_mont: .quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe # Constants for computations modulo ord(p256) .Lord: .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 .LordK: .quad 0xccd1c8aaee00bc4f ___ { my ($a0,$a1,$a2,$a3)=map("%r$_",(8..11)); my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rdx","%rcx","%r12","%r13"); my ($r_ptr,$a_ptr,$b_ptr)=("%rdi","%rsi","%rdx"); $code.=<<___; ################################################################################ # void GFp_nistz256_add(uint64_t res[4], uint64_t a[4], uint64_t b[4]); .globl GFp_nistz256_add .type GFp_nistz256_add,\@function,3 .align 32 GFp_nistz256_add: push %r12 push %r13 mov 8*0($a_ptr), $a0 xor $t4, $t4 mov 8*1($a_ptr), $a1 mov 8*2($a_ptr), $a2 mov 8*3($a_ptr), $a3 lea .Lpoly(%rip), $a_ptr add 8*0($b_ptr), $a0 adc 8*1($b_ptr), $a1 mov $a0, $t0 adc 8*2($b_ptr), $a2 adc 8*3($b_ptr), $a3 mov $a1, $t1 adc \$0, $t4 sub 8*0($a_ptr), $a0 mov $a2, $t2 sbb 8*1($a_ptr), $a1 sbb 8*2($a_ptr), $a2 mov $a3, $t3 sbb 8*3($a_ptr), $a3 sbb \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 mov $a0, 8*0($r_ptr) cmovc $t2, $a2 mov $a1, 8*1($r_ptr) cmovc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) pop %r13 pop %r12 ret .size GFp_nistz256_add,.-GFp_nistz256_add ################################################################################ # void GFp_nistz256_neg(uint64_t res[4], uint64_t a[4]); .globl GFp_nistz256_neg .type GFp_nistz256_neg,\@function,2 .align 32 GFp_nistz256_neg: .cfi_startproc push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 .Lneg_body: xor $a0, $a0 xor $a1, $a1 xor $a2, $a2 xor $a3, $a3 xor $t4, $t4 sub 8*0($a_ptr), $a0 sbb 8*1($a_ptr), $a1 sbb 8*2($a_ptr), $a2 mov $a0, $t0 sbb 8*3($a_ptr), $a3 lea .Lpoly(%rip), $a_ptr mov $a1, $t1 sbb \$0, $t4 add 8*0($a_ptr), $a0 mov $a2, $t2 adc 8*1($a_ptr), $a1 adc 8*2($a_ptr), $a2 mov $a3, $t3 adc 8*3($a_ptr), $a3 test $t4, $t4 cmovz $t0, $a0 cmovz $t1, $a1 mov $a0, 8*0($r_ptr) cmovz $t2, $a2 mov $a1, 8*1($r_ptr) cmovz $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) mov 0(%rsp),%r13 .cfi_restore %r13 mov 8(%rsp),%r12 .cfi_restore %r12 lea 16(%rsp),%rsp .cfi_adjust_cfa_offset -16 .Lneg_epilogue: ret .cfi_endproc .size GFp_nistz256_neg,.-GFp_nistz256_neg ___ } { my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx"); my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15)); my ($t0,$t1,$t2,$t3,$t4)=("%rcx","%rbp","%rbx","%rdx","%rax"); my ($poly1,$poly3)=($acc6,$acc7); $code.=<<___; ################################################################################ # void GFp_p256_scalar_mul_mont( # uint64_t res[4], # uint64_t a[4], # uint64_t b[4]); .globl GFp_p256_scalar_mul_mont .type GFp_p256_scalar_mul_mont,\@function,3 .align 32 GFp_p256_scalar_mul_mont: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx cmp \$0x80100, %ecx je .Lecp_nistz256_ord_mul_montx ___ $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lord_mul_body: mov 8*0($b_org), %rax mov $b_org, $b_ptr lea .Lord(%rip), %r14 mov .LordK(%rip), %r15 ################################# * b[0] mov %rax, $t0 mulq 8*0($a_ptr) mov %rax, $acc0 mov $t0, %rax mov %rdx, $acc1 mulq 8*1($a_ptr) add %rax, $acc1 mov $t0, %rax adc \$0, %rdx mov %rdx, $acc2 mulq 8*2($a_ptr) add %rax, $acc2 mov $t0, %rax adc \$0, %rdx mov $acc0, $acc5 imulq %r15,$acc0 mov %rdx, $acc3 mulq 8*3($a_ptr) add %rax, $acc3 mov $acc0, %rax adc \$0, %rdx mov %rdx, $acc4 ################################# First reduction step mulq 8*0(%r14) mov $acc0, $t1 add %rax, $acc5 # guaranteed to be zero mov $acc0, %rax adc \$0, %rdx mov %rdx, $t0 sub $acc0, $acc2 sbb \$0, $acc0 # can't borrow mulq 8*1(%r14) add $t0, $acc1 adc \$0, %rdx add %rax, $acc1 mov $t1, %rax adc %rdx, $acc2 mov $t1, %rdx adc \$0, $acc0 # can't overflow shl \$32, %rax shr \$32, %rdx sub %rax, $acc3 mov 8*1($b_ptr), %rax sbb %rdx, $t1 # can't borrow add $acc0, $acc3 adc $t1, $acc4 adc \$0, $acc5 ################################# * b[1] mov %rax, $t0 mulq 8*0($a_ptr) add %rax, $acc1 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*1($a_ptr) add $t1, $acc2 adc \$0, %rdx add %rax, $acc2 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*2($a_ptr) add $t1, $acc3 adc \$0, %rdx add %rax, $acc3 mov $t0, %rax adc \$0, %rdx mov $acc1, $t0 imulq %r15, $acc1 mov %rdx, $t1 mulq 8*3($a_ptr) add $t1, $acc4 adc \$0, %rdx xor $acc0, $acc0 add %rax, $acc4 mov $acc1, %rax adc %rdx, $acc5 adc \$0, $acc0 ################################# Second reduction step mulq 8*0(%r14) mov $acc1, $t1 add %rax, $t0 # guaranteed to be zero mov $acc1, %rax adc %rdx, $t0 sub $acc1, $acc3 sbb \$0, $acc1 # can't borrow mulq 8*1(%r14) add $t0, $acc2 adc \$0, %rdx add %rax, $acc2 mov $t1, %rax adc %rdx, $acc3 mov $t1, %rdx adc \$0, $acc1 # can't overflow shl \$32, %rax shr \$32, %rdx sub %rax, $acc4 mov 8*2($b_ptr), %rax sbb %rdx, $t1 # can't borrow add $acc1, $acc4 adc $t1, $acc5 adc \$0, $acc0 ################################## * b[2] mov %rax, $t0 mulq 8*0($a_ptr) add %rax, $acc2 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*1($a_ptr) add $t1, $acc3 adc \$0, %rdx add %rax, $acc3 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*2($a_ptr) add $t1, $acc4 adc \$0, %rdx add %rax, $acc4 mov $t0, %rax adc \$0, %rdx mov $acc2, $t0 imulq %r15, $acc2 mov %rdx, $t1 mulq 8*3($a_ptr) add $t1, $acc5 adc \$0, %rdx xor $acc1, $acc1 add %rax, $acc5 mov $acc2, %rax adc %rdx, $acc0 adc \$0, $acc1 ################################# Third reduction step mulq 8*0(%r14) mov $acc2, $t1 add %rax, $t0 # guaranteed to be zero mov $acc2, %rax adc %rdx, $t0 sub $acc2, $acc4 sbb \$0, $acc2 # can't borrow mulq 8*1(%r14) add $t0, $acc3 adc \$0, %rdx add %rax, $acc3 mov $t1, %rax adc %rdx, $acc4 mov $t1, %rdx adc \$0, $acc2 # can't overflow shl \$32, %rax shr \$32, %rdx sub %rax, $acc5 mov 8*3($b_ptr), %rax sbb %rdx, $t1 # can't borrow add $acc2, $acc5 adc $t1, $acc0 adc \$0, $acc1 ################################# * b[3] mov %rax, $t0 mulq 8*0($a_ptr) add %rax, $acc3 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*1($a_ptr) add $t1, $acc4 adc \$0, %rdx add %rax, $acc4 mov $t0, %rax adc \$0, %rdx mov %rdx, $t1 mulq 8*2($a_ptr) add $t1, $acc5 adc \$0, %rdx add %rax, $acc5 mov $t0, %rax adc \$0, %rdx mov $acc3, $t0 imulq %r15, $acc3 mov %rdx, $t1 mulq 8*3($a_ptr) add $t1, $acc0 adc \$0, %rdx xor $acc2, $acc2 add %rax, $acc0 mov $acc3, %rax adc %rdx, $acc1 adc \$0, $acc2 ################################# Last reduction step mulq 8*0(%r14) mov $acc3, $t1 add %rax, $t0 # guaranteed to be zero mov $acc3, %rax adc %rdx, $t0 sub $acc3, $acc5 sbb \$0, $acc3 # can't borrow mulq 8*1(%r14) add $t0, $acc4 adc \$0, %rdx add %rax, $acc4 mov $t1, %rax adc %rdx, $acc5 mov $t1, %rdx adc \$0, $acc3 # can't overflow shl \$32, %rax shr \$32, %rdx sub %rax, $acc0 sbb %rdx, $t1 # can't borrow add $acc3, $acc0 adc $t1, $acc1 adc \$0, $acc2 ################################# Subtract ord mov $acc4, $a_ptr sub 8*0(%r14), $acc4 mov $acc5, $acc3 sbb 8*1(%r14), $acc5 mov $acc0, $t0 sbb 8*2(%r14), $acc0 mov $acc1, $t1 sbb 8*3(%r14), $acc1 sbb \$0, $acc2 cmovc $a_ptr, $acc4 cmovc $acc3, $acc5 cmovc $t0, $acc0 cmovc $t1, $acc1 mov $acc4, 8*0($r_ptr) mov $acc5, 8*1($r_ptr) mov $acc0, 8*2($r_ptr) mov $acc1, 8*3($r_ptr) mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_mul_epilogue: ret .cfi_endproc .size GFp_p256_scalar_mul_mont,.-GFp_p256_scalar_mul_mont ################################################################################ # void GFp_p256_scalar_sqr_rep_mont( # uint64_t res[4], # uint64_t a[4], # uint64_t rep); .globl GFp_p256_scalar_sqr_rep_mont .type GFp_p256_scalar_sqr_rep_mont,\@function,3 .align 32 GFp_p256_scalar_sqr_rep_mont: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx cmp \$0x80100, %ecx je .Lecp_nistz256_ord_sqr_montx ___ $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lord_sqr_body: mov 8*0($a_ptr), $acc0 mov 8*1($a_ptr), %rax mov 8*2($a_ptr), $acc6 mov 8*3($a_ptr), $acc7 lea .Lord(%rip), $a_ptr # pointer to modulus mov $b_org, $b_ptr jmp .Loop_ord_sqr .align 32 .Loop_ord_sqr: ################################# a[1:] * a[0] mov %rax, $t1 # put aside a[1] mul $acc0 # a[1] * a[0] mov %rax, $acc1 movq $t1, %xmm1 # offload a[1] mov $acc6, %rax mov %rdx, $acc2 mul $acc0 # a[2] * a[0] add %rax, $acc2 mov $acc7, %rax movq $acc6, %xmm2 # offload a[2] adc \$0, %rdx mov %rdx, $acc3 mul $acc0 # a[3] * a[0] add %rax, $acc3 mov $acc7, %rax movq $acc7, %xmm3 # offload a[3] adc \$0, %rdx mov %rdx, $acc4 ################################# a[3] * a[2] mul $acc6 # a[3] * a[2] mov %rax, $acc5 mov $acc6, %rax mov %rdx, $acc6 ################################# a[2:] * a[1] mul $t1 # a[2] * a[1] add %rax, $acc3 mov $acc7, %rax adc \$0, %rdx mov %rdx, $acc7 mul $t1 # a[3] * a[1] add %rax, $acc4 adc \$0, %rdx add $acc7, $acc4 adc %rdx, $acc5 adc \$0, $acc6 # can't overflow ################################# *2 xor $acc7, $acc7 mov $acc0, %rax add $acc1, $acc1 adc $acc2, $acc2 adc $acc3, $acc3 adc $acc4, $acc4 adc $acc5, $acc5 adc $acc6, $acc6 adc \$0, $acc7 ################################# Missing products mul %rax # a[0] * a[0] mov %rax, $acc0 movq %xmm1, %rax mov %rdx, $t1 mul %rax # a[1] * a[1] add $t1, $acc1 adc %rax, $acc2 movq %xmm2, %rax adc \$0, %rdx mov %rdx, $t1 mul %rax # a[2] * a[2] add $t1, $acc3 adc %rax, $acc4 movq %xmm3, %rax adc \$0, %rdx mov %rdx, $t1 mov $acc0, $t0 imulq 8*4($a_ptr), $acc0 # *= .LordK mul %rax # a[3] * a[3] add $t1, $acc5 adc %rax, $acc6 mov 8*0($a_ptr), %rax # modulus[0] adc %rdx, $acc7 # can't overflow ################################# First reduction step mul $acc0 mov $acc0, $t1 add %rax, $t0 # guaranteed to be zero mov 8*1($a_ptr), %rax # modulus[1] adc %rdx, $t0 sub $acc0, $acc2 sbb \$0, $t1 # can't borrow mul $acc0 add $t0, $acc1 adc \$0, %rdx add %rax, $acc1 mov $acc0, %rax adc %rdx, $acc2 mov $acc0, %rdx adc \$0, $t1 # can't overflow mov $acc1, $t0 imulq 8*4($a_ptr), $acc1 # *= .LordK shl \$32, %rax shr \$32, %rdx sub %rax, $acc3 mov 8*0($a_ptr), %rax sbb %rdx, $acc0 # can't borrow add $t1, $acc3 adc \$0, $acc0 # can't overflow ################################# Second reduction step mul $acc1 mov $acc1, $t1 add %rax, $t0 # guaranteed to be zero mov 8*1($a_ptr), %rax adc %rdx, $t0 sub $acc1, $acc3 sbb \$0, $t1 # can't borrow mul $acc1 add $t0, $acc2 adc \$0, %rdx add %rax, $acc2 mov $acc1, %rax adc %rdx, $acc3 mov $acc1, %rdx adc \$0, $t1 # can't overflow mov $acc2, $t0 imulq 8*4($a_ptr), $acc2 # *= .LordK shl \$32, %rax shr \$32, %rdx sub %rax, $acc0 mov 8*0($a_ptr), %rax sbb %rdx, $acc1 # can't borrow add $t1, $acc0 adc \$0, $acc1 # can't overflow ################################# Third reduction step mul $acc2 mov $acc2, $t1 add %rax, $t0 # guaranteed to be zero mov 8*1($a_ptr), %rax adc %rdx, $t0 sub $acc2, $acc0 sbb \$0, $t1 # can't borrow mul $acc2 add $t0, $acc3 adc \$0, %rdx add %rax, $acc3 mov $acc2, %rax adc %rdx, $acc0 mov $acc2, %rdx adc \$0, $t1 # can't overflow mov $acc3, $t0 imulq 8*4($a_ptr), $acc3 # *= .LordK shl \$32, %rax shr \$32, %rdx sub %rax, $acc1 mov 8*0($a_ptr), %rax sbb %rdx, $acc2 # can't borrow add $t1, $acc1 adc \$0, $acc2 # can't overflow ################################# Last reduction step mul $acc3 mov $acc3, $t1 add %rax, $t0 # guaranteed to be zero mov 8*1($a_ptr), %rax adc %rdx, $t0 sub $acc3, $acc1 sbb \$0, $t1 # can't borrow mul $acc3 add $t0, $acc0 adc \$0, %rdx add %rax, $acc0 mov $acc3, %rax adc %rdx, $acc1 mov $acc3, %rdx adc \$0, $t1 # can't overflow shl \$32, %rax shr \$32, %rdx sub %rax, $acc2 sbb %rdx, $acc3 # can't borrow add $t1, $acc2 adc \$0, $acc3 # can't overflow ################################# Add bits [511:256] of the sqr result xor %rdx, %rdx add $acc4, $acc0 adc $acc5, $acc1 mov $acc0, $acc4 adc $acc6, $acc2 adc $acc7, $acc3 mov $acc1, %rax adc \$0, %rdx ################################# Compare to modulus sub 8*0($a_ptr), $acc0 mov $acc2, $acc6 sbb 8*1($a_ptr), $acc1 sbb 8*2($a_ptr), $acc2 mov $acc3, $acc7 sbb 8*3($a_ptr), $acc3 sbb \$0, %rdx cmovc $acc4, $acc0 cmovnc $acc1, %rax cmovnc $acc2, $acc6 cmovnc $acc3, $acc7 dec $b_ptr jnz .Loop_ord_sqr mov $acc0, 8*0($r_ptr) mov %rax, 8*1($r_ptr) pxor %xmm1, %xmm1 mov $acc6, 8*2($r_ptr) pxor %xmm2, %xmm2 mov $acc7, 8*3($r_ptr) pxor %xmm3, %xmm3 mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_sqr_epilogue: ret .cfi_endproc .size GFp_p256_scalar_sqr_rep_mont,.-GFp_p256_scalar_sqr_rep_mont ___ $code.=<<___ if ($addx); ################################################################################ .type ecp_nistz256_ord_mul_montx,\@function,3 .align 32 ecp_nistz256_ord_mul_montx: .cfi_startproc .Lecp_nistz256_ord_mul_montx: push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lord_mulx_body: mov $b_org, $b_ptr mov 8*0($b_org), %rdx mov 8*0($a_ptr), $acc1 mov 8*1($a_ptr), $acc2 mov 8*2($a_ptr), $acc3 mov 8*3($a_ptr), $acc4 lea -128($a_ptr), $a_ptr # control u-op density lea .Lord-128(%rip), %r14 mov .LordK(%rip), %r15 ################################# Multiply by b[0] mulx $acc1, $acc0, $acc1 mulx $acc2, $t0, $acc2 mulx $acc3, $t1, $acc3 add $t0, $acc1 mulx $acc4, $t0, $acc4 mov $acc0, %rdx mulx %r15, %rdx, %rax adc $t1, $acc2 adc $t0, $acc3 adc \$0, $acc4 ################################# reduction xor $acc5, $acc5 # $acc5=0, cf=0, of=0 mulx 8*0+128(%r14), $t0, $t1 adcx $t0, $acc0 # guaranteed to be zero adox $t1, $acc1 mulx 8*1+128(%r14), $t0, $t1 adcx $t0, $acc1 adox $t1, $acc2 mulx 8*2+128(%r14), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*3+128(%r14), $t0, $t1 mov 8*1($b_ptr), %rdx adcx $t0, $acc3 adox $t1, $acc4 adcx $acc0, $acc4 adox $acc0, $acc5 adc \$0, $acc5 # cf=0, of=0 ################################# Multiply by b[1] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc1 adox $t1, $acc2 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc1, %rdx mulx %r15, %rdx, %rax adcx $t0, $acc4 adox $t1, $acc5 adcx $acc0, $acc5 adox $acc0, $acc0 adc \$0, $acc0 # cf=0, of=0 ################################# reduction mulx 8*0+128(%r14), $t0, $t1 adcx $t0, $acc1 # guaranteed to be zero adox $t1, $acc2 mulx 8*1+128(%r14), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*2+128(%r14), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*3+128(%r14), $t0, $t1 mov 8*2($b_ptr), %rdx adcx $t0, $acc4 adox $t1, $acc5 adcx $acc1, $acc5 adox $acc1, $acc0 adc \$0, $acc0 # cf=0, of=0 ################################# Multiply by b[2] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc2, %rdx mulx %r15, %rdx, %rax adcx $t0, $acc5 adox $t1, $acc0 adcx $acc1, $acc0 adox $acc1, $acc1 adc \$0, $acc1 # cf=0, of=0 ################################# reduction mulx 8*0+128(%r14), $t0, $t1 adcx $t0, $acc2 # guaranteed to be zero adox $t1, $acc3 mulx 8*1+128(%r14), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*2+128(%r14), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*3+128(%r14), $t0, $t1 mov 8*3($b_ptr), %rdx adcx $t0, $acc5 adox $t1, $acc0 adcx $acc2, $acc0 adox $acc2, $acc1 adc \$0, $acc1 # cf=0, of=0 ################################# Multiply by b[3] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc5 adox $t1, $acc0 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc3, %rdx mulx %r15, %rdx, %rax adcx $t0, $acc0 adox $t1, $acc1 adcx $acc2, $acc1 adox $acc2, $acc2 adc \$0, $acc2 # cf=0, of=0 ################################# reduction mulx 8*0+128(%r14), $t0, $t1 adcx $t0, $acc3 # guranteed to be zero adox $t1, $acc4 mulx 8*1+128(%r14), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*2+128(%r14), $t0, $t1 adcx $t0, $acc5 adox $t1, $acc0 mulx 8*3+128(%r14), $t0, $t1 lea 128(%r14),%r14 mov $acc4, $t2 adcx $t0, $acc0 adox $t1, $acc1 mov $acc5, $t3 adcx $acc3, $acc1 adox $acc3, $acc2 adc \$0, $acc2 ################################# # Branch-less conditional subtraction of P mov $acc0, $t0 sub 8*0(%r14), $acc4 sbb 8*1(%r14), $acc5 sbb 8*2(%r14), $acc0 mov $acc1, $t1 sbb 8*3(%r14), $acc1 sbb \$0, $acc2 cmovc $t2, $acc4 cmovc $t3, $acc5 cmovc $t0, $acc0 cmovc $t1, $acc1 mov $acc4, 8*0($r_ptr) mov $acc5, 8*1($r_ptr) mov $acc0, 8*2($r_ptr) mov $acc1, 8*3($r_ptr) mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_mulx_epilogue: ret .cfi_endproc .size ecp_nistz256_ord_mul_montx,.-ecp_nistz256_ord_mul_montx .type ecp_nistz256_ord_sqr_montx,\@function,3 .align 32 ecp_nistz256_ord_sqr_montx: .cfi_startproc .Lecp_nistz256_ord_sqr_montx: push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lord_sqrx_body: mov $b_org, $b_ptr mov 8*0($a_ptr), %rdx mov 8*1($a_ptr), $acc6 mov 8*2($a_ptr), $acc7 mov 8*3($a_ptr), $acc0 lea .Lord(%rip), $a_ptr jmp .Loop_ord_sqrx .align 32 .Loop_ord_sqrx: mulx $acc6, $acc1, $acc2 # a[0]*a[1] mulx $acc7, $t0, $acc3 # a[0]*a[2] mov %rdx, %rax # offload a[0] movq $acc6, %xmm1 # offload a[1] mulx $acc0, $t1, $acc4 # a[0]*a[3] mov $acc6, %rdx add $t0, $acc2 movq $acc7, %xmm2 # offload a[2] adc $t1, $acc3 adc \$0, $acc4 xor $acc5, $acc5 # $acc5=0,cf=0,of=0 ################################# mulx $acc7, $t0, $t1 # a[1]*a[2] adcx $t0, $acc3 adox $t1, $acc4 mulx $acc0, $t0, $t1 # a[1]*a[3] mov $acc7, %rdx adcx $t0, $acc4 adox $t1, $acc5 adc \$0, $acc5 ################################# mulx $acc0, $t0, $acc6 # a[2]*a[3] mov %rax, %rdx movq $acc0, %xmm3 # offload a[3] xor $acc7, $acc7 # $acc7=0,cf=0,of=0 adcx $acc1, $acc1 # acc1:6<<1 adox $t0, $acc5 adcx $acc2, $acc2 adox $acc7, $acc6 # of=0 ################################# a[i]*a[i] mulx %rdx, $acc0, $t1 movq %xmm1, %rdx adcx $acc3, $acc3 adox $t1, $acc1 adcx $acc4, $acc4 mulx %rdx, $t0, $t4 movq %xmm2, %rdx adcx $acc5, $acc5 adox $t0, $acc2 adcx $acc6, $acc6 mulx %rdx, $t0, $t1 .byte 0x67 movq %xmm3, %rdx adox $t4, $acc3 adcx $acc7, $acc7 adox $t0, $acc4 adox $t1, $acc5 mulx %rdx, $t0, $t4 adox $t0, $acc6 adox $t4, $acc7 ################################# reduction mov $acc0, %rdx mulx 8*4($a_ptr), %rdx, $t0 xor %rax, %rax # cf=0, of=0 mulx 8*0($a_ptr), $t0, $t1 adcx $t0, $acc0 # guaranteed to be zero adox $t1, $acc1 mulx 8*1($a_ptr), $t0, $t1 adcx $t0, $acc1 adox $t1, $acc2 mulx 8*2($a_ptr), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*3($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc0 # of=0 adcx %rax, $acc0 # cf=0 ################################# mov $acc1, %rdx mulx 8*4($a_ptr), %rdx, $t0 mulx 8*0($a_ptr), $t0, $t1 adox $t0, $acc1 # guaranteed to be zero adcx $t1, $acc2 mulx 8*1($a_ptr), $t0, $t1 adox $t0, $acc2 adcx $t1, $acc3 mulx 8*2($a_ptr), $t0, $t1 adox $t0, $acc3 adcx $t1, $acc0 mulx 8*3($a_ptr), $t0, $t1 adox $t0, $acc0 adcx $t1, $acc1 # cf=0 adox %rax, $acc1 # of=0 ################################# mov $acc2, %rdx mulx 8*4($a_ptr), %rdx, $t0 mulx 8*0($a_ptr), $t0, $t1 adcx $t0, $acc2 # guaranteed to be zero adox $t1, $acc3 mulx 8*1($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc0 mulx 8*2($a_ptr), $t0, $t1 adcx $t0, $acc0 adox $t1, $acc1 mulx 8*3($a_ptr), $t0, $t1 adcx $t0, $acc1 adox $t1, $acc2 # of=0 adcx %rax, $acc2 # cf=0 ################################# mov $acc3, %rdx mulx 8*4($a_ptr), %rdx, $t0 mulx 8*0($a_ptr), $t0, $t1 adox $t0, $acc3 # guaranteed to be zero adcx $t1, $acc0 mulx 8*1($a_ptr), $t0, $t1 adox $t0, $acc0 adcx $t1, $acc1 mulx 8*2($a_ptr), $t0, $t1 adox $t0, $acc1 adcx $t1, $acc2 mulx 8*3($a_ptr), $t0, $t1 adox $t0, $acc2 adcx $t1, $acc3 adox %rax, $acc3 ################################# accumulate upper half add $acc0, $acc4 # add $acc4, $acc0 adc $acc5, $acc1 mov $acc4, %rdx adc $acc6, $acc2 adc $acc7, $acc3 mov $acc1, $acc6 adc \$0, %rax ################################# compare to modulus sub 8*0($a_ptr), $acc4 mov $acc2, $acc7 sbb 8*1($a_ptr), $acc1 sbb 8*2($a_ptr), $acc2 mov $acc3, $acc0 sbb 8*3($a_ptr), $acc3 sbb \$0, %rax cmovnc $acc4, %rdx cmovnc $acc1, $acc6 cmovnc $acc2, $acc7 cmovnc $acc3, $acc0 dec $b_ptr jnz .Loop_ord_sqrx mov %rdx, 8*0($r_ptr) mov $acc6, 8*1($r_ptr) pxor %xmm1, %xmm1 mov $acc7, 8*2($r_ptr) pxor %xmm2, %xmm2 mov $acc0, 8*3($r_ptr) pxor %xmm3, %xmm3 mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_sqrx_epilogue: ret .cfi_endproc .size ecp_nistz256_ord_sqr_montx,.-ecp_nistz256_ord_sqr_montx ___ $code.=<<___; ################################################################################ # void GFp_nistz256_mul_mont( # uint64_t res[4], # uint64_t a[4], # uint64_t b[4]); .globl GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,\@function,3 .align 32 GFp_nistz256_mul_mont: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx ___ $code.=<<___; .Lmul_mont: push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lmul_body: ___ $code.=<<___ if ($addx); cmp \$0x80100, %ecx je .Lmul_montx ___ $code.=<<___; mov $b_org, $b_ptr mov 8*0($b_org), %rax mov 8*0($a_ptr), $acc1 mov 8*1($a_ptr), $acc2 mov 8*2($a_ptr), $acc3 mov 8*3($a_ptr), $acc4 call __ecp_nistz256_mul_montq ___ $code.=<<___ if ($addx); jmp .Lmul_mont_done .align 32 .Lmul_montx: mov $b_org, $b_ptr mov 8*0($b_org), %rdx mov 8*0($a_ptr), $acc1 mov 8*1($a_ptr), $acc2 mov 8*2($a_ptr), $acc3 mov 8*3($a_ptr), $acc4 lea -128($a_ptr), $a_ptr # control u-op density call __ecp_nistz256_mul_montx ___ $code.=<<___; .Lmul_mont_done: mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lmul_epilogue: ret .cfi_endproc .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont .type __ecp_nistz256_mul_montq,\@abi-omnipotent .align 32 __ecp_nistz256_mul_montq: .cfi_startproc ######################################################################## # Multiply a by b[0] mov %rax, $t1 mulq $acc1 mov .Lpoly+8*1(%rip),$poly1 mov %rax, $acc0 mov $t1, %rax mov %rdx, $acc1 mulq $acc2 mov .Lpoly+8*3(%rip),$poly3 add %rax, $acc1 mov $t1, %rax adc \$0, %rdx mov %rdx, $acc2 mulq $acc3 add %rax, $acc2 mov $t1, %rax adc \$0, %rdx mov %rdx, $acc3 mulq $acc4 add %rax, $acc3 mov $acc0, %rax adc \$0, %rdx xor $acc5, $acc5 mov %rdx, $acc4 ######################################################################## # First reduction step # Basically now we want to multiply acc[0] by p256, # and add the result to the acc. # Due to the special form of p256 we do some optimizations # # acc[0] x p256[0..1] = acc[0] x 2^96 - acc[0] # then we add acc[0] and get acc[0] x 2^96 mov $acc0, $t1 shl \$32, $acc0 mulq $poly3 shr \$32, $t1 add $acc0, $acc1 # +=acc[0]<<96 adc $t1, $acc2 adc %rax, $acc3 mov 8*1($b_ptr), %rax adc %rdx, $acc4 adc \$0, $acc5 xor $acc0, $acc0 ######################################################################## # Multiply by b[1] mov %rax, $t1 mulq 8*0($a_ptr) add %rax, $acc1 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*1($a_ptr) add $t0, $acc2 adc \$0, %rdx add %rax, $acc2 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*2($a_ptr) add $t0, $acc3 adc \$0, %rdx add %rax, $acc3 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*3($a_ptr) add $t0, $acc4 adc \$0, %rdx add %rax, $acc4 mov $acc1, %rax adc %rdx, $acc5 adc \$0, $acc0 ######################################################################## # Second reduction step mov $acc1, $t1 shl \$32, $acc1 mulq $poly3 shr \$32, $t1 add $acc1, $acc2 adc $t1, $acc3 adc %rax, $acc4 mov 8*2($b_ptr), %rax adc %rdx, $acc5 adc \$0, $acc0 xor $acc1, $acc1 ######################################################################## # Multiply by b[2] mov %rax, $t1 mulq 8*0($a_ptr) add %rax, $acc2 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*1($a_ptr) add $t0, $acc3 adc \$0, %rdx add %rax, $acc3 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*2($a_ptr) add $t0, $acc4 adc \$0, %rdx add %rax, $acc4 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*3($a_ptr) add $t0, $acc5 adc \$0, %rdx add %rax, $acc5 mov $acc2, %rax adc %rdx, $acc0 adc \$0, $acc1 ######################################################################## # Third reduction step mov $acc2, $t1 shl \$32, $acc2 mulq $poly3 shr \$32, $t1 add $acc2, $acc3 adc $t1, $acc4 adc %rax, $acc5 mov 8*3($b_ptr), %rax adc %rdx, $acc0 adc \$0, $acc1 xor $acc2, $acc2 ######################################################################## # Multiply by b[3] mov %rax, $t1 mulq 8*0($a_ptr) add %rax, $acc3 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*1($a_ptr) add $t0, $acc4 adc \$0, %rdx add %rax, $acc4 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*2($a_ptr) add $t0, $acc5 adc \$0, %rdx add %rax, $acc5 mov $t1, %rax adc \$0, %rdx mov %rdx, $t0 mulq 8*3($a_ptr) add $t0, $acc0 adc \$0, %rdx add %rax, $acc0 mov $acc3, %rax adc %rdx, $acc1 adc \$0, $acc2 ######################################################################## # Final reduction step mov $acc3, $t1 shl \$32, $acc3 mulq $poly3 shr \$32, $t1 add $acc3, $acc4 adc $t1, $acc5 mov $acc4, $t0 adc %rax, $acc0 adc %rdx, $acc1 mov $acc5, $t1 adc \$0, $acc2 ######################################################################## # Branch-less conditional subtraction of P sub \$-1, $acc4 # .Lpoly[0] mov $acc0, $t2 sbb $poly1, $acc5 # .Lpoly[1] sbb \$0, $acc0 # .Lpoly[2] mov $acc1, $t3 sbb $poly3, $acc1 # .Lpoly[3] sbb \$0, $acc2 cmovc $t0, $acc4 cmovc $t1, $acc5 mov $acc4, 8*0($r_ptr) cmovc $t2, $acc0 mov $acc5, 8*1($r_ptr) cmovc $t3, $acc1 mov $acc0, 8*2($r_ptr) mov $acc1, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq ################################################################################ # void GFp_nistz256_sqr_mont( # uint64_t res[4], # uint64_t a[4]); # we optimize the square according to S.Gueron and V.Krasnov, # "Speeding up Big-Number Squaring" .globl GFp_nistz256_sqr_mont .type GFp_nistz256_sqr_mont,\@function,2 .align 32 GFp_nistz256_sqr_mont: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx ___ $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 .Lsqr_body: ___ $code.=<<___ if ($addx); cmp \$0x80100, %ecx je .Lsqr_montx ___ $code.=<<___; mov 8*0($a_ptr), %rax mov 8*1($a_ptr), $acc6 mov 8*2($a_ptr), $acc7 mov 8*3($a_ptr), $acc0 call __ecp_nistz256_sqr_montq ___ $code.=<<___ if ($addx); jmp .Lsqr_mont_done .align 32 .Lsqr_montx: mov 8*0($a_ptr), %rdx mov 8*1($a_ptr), $acc6 mov 8*2($a_ptr), $acc7 mov 8*3($a_ptr), $acc0 lea -128($a_ptr), $a_ptr # control u-op density call __ecp_nistz256_sqr_montx ___ $code.=<<___; .Lsqr_mont_done: mov 0(%rsp),%r15 .cfi_restore %r15 mov 8(%rsp),%r14 .cfi_restore %r14 mov 16(%rsp),%r13 .cfi_restore %r13 mov 24(%rsp),%r12 .cfi_restore %r12 mov 32(%rsp),%rbx .cfi_restore %rbx mov 40(%rsp),%rbp .cfi_restore %rbp lea 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lsqr_epilogue: ret .cfi_endproc .size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont .type __ecp_nistz256_sqr_montq,\@abi-omnipotent .align 32 __ecp_nistz256_sqr_montq: .cfi_startproc mov %rax, $acc5 mulq $acc6 # a[1]*a[0] mov %rax, $acc1 mov $acc7, %rax mov %rdx, $acc2 mulq $acc5 # a[0]*a[2] add %rax, $acc2 mov $acc0, %rax adc \$0, %rdx mov %rdx, $acc3 mulq $acc5 # a[0]*a[3] add %rax, $acc3 mov $acc7, %rax adc \$0, %rdx mov %rdx, $acc4 ################################# mulq $acc6 # a[1]*a[2] add %rax, $acc3 mov $acc0, %rax adc \$0, %rdx mov %rdx, $t1 mulq $acc6 # a[1]*a[3] add %rax, $acc4 mov $acc0, %rax adc \$0, %rdx add $t1, $acc4 mov %rdx, $acc5 adc \$0, $acc5 ################################# mulq $acc7 # a[2]*a[3] xor $acc7, $acc7 add %rax, $acc5 mov 8*0($a_ptr), %rax mov %rdx, $acc6 adc \$0, $acc6 add $acc1, $acc1 # acc1:6<<1 adc $acc2, $acc2 adc $acc3, $acc3 adc $acc4, $acc4 adc $acc5, $acc5 adc $acc6, $acc6 adc \$0, $acc7 mulq %rax mov %rax, $acc0 mov 8*1($a_ptr), %rax mov %rdx, $t0 mulq %rax add $t0, $acc1 adc %rax, $acc2 mov 8*2($a_ptr), %rax adc \$0, %rdx mov %rdx, $t0 mulq %rax add $t0, $acc3 adc %rax, $acc4 mov 8*3($a_ptr), %rax adc \$0, %rdx mov %rdx, $t0 mulq %rax add $t0, $acc5 adc %rax, $acc6 mov $acc0, %rax adc %rdx, $acc7 mov .Lpoly+8*1(%rip), $a_ptr mov .Lpoly+8*3(%rip), $t1 ########################################## # Now the reduction # First iteration mov $acc0, $t0 shl \$32, $acc0 mulq $t1 shr \$32, $t0 add $acc0, $acc1 # +=acc[0]<<96 adc $t0, $acc2 adc %rax, $acc3 mov $acc1, %rax adc \$0, %rdx ########################################## # Second iteration mov $acc1, $t0 shl \$32, $acc1 mov %rdx, $acc0 mulq $t1 shr \$32, $t0 add $acc1, $acc2 adc $t0, $acc3 adc %rax, $acc0 mov $acc2, %rax adc \$0, %rdx ########################################## # Third iteration mov $acc2, $t0 shl \$32, $acc2 mov %rdx, $acc1 mulq $t1 shr \$32, $t0 add $acc2, $acc3 adc $t0, $acc0 adc %rax, $acc1 mov $acc3, %rax adc \$0, %rdx ########################################### # Last iteration mov $acc3, $t0 shl \$32, $acc3 mov %rdx, $acc2 mulq $t1 shr \$32, $t0 add $acc3, $acc0 adc $t0, $acc1 adc %rax, $acc2 adc \$0, %rdx xor $acc3, $acc3 ############################################ # Add the rest of the acc add $acc0, $acc4 adc $acc1, $acc5 mov $acc4, $acc0 adc $acc2, $acc6 adc %rdx, $acc7 mov $acc5, $acc1 adc \$0, $acc3 sub \$-1, $acc4 # .Lpoly[0] mov $acc6, $acc2 sbb $a_ptr, $acc5 # .Lpoly[1] sbb \$0, $acc6 # .Lpoly[2] mov $acc7, $t0 sbb $t1, $acc7 # .Lpoly[3] sbb \$0, $acc3 cmovc $acc0, $acc4 cmovc $acc1, $acc5 mov $acc4, 8*0($r_ptr) cmovc $acc2, $acc6 mov $acc5, 8*1($r_ptr) cmovc $t0, $acc7 mov $acc6, 8*2($r_ptr) mov $acc7, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq ___ if ($addx) { $code.=<<___; .type __ecp_nistz256_mul_montx,\@abi-omnipotent .align 32 __ecp_nistz256_mul_montx: .cfi_startproc ######################################################################## # Multiply by b[0] mulx $acc1, $acc0, $acc1 mulx $acc2, $t0, $acc2 mov \$32, $poly1 xor $acc5, $acc5 # cf=0 mulx $acc3, $t1, $acc3 mov .Lpoly+8*3(%rip), $poly3 adc $t0, $acc1 mulx $acc4, $t0, $acc4 mov $acc0, %rdx adc $t1, $acc2 shlx $poly1,$acc0,$t1 adc $t0, $acc3 shrx $poly1,$acc0,$t0 adc \$0, $acc4 ######################################################################## # First reduction step add $t1, $acc1 adc $t0, $acc2 mulx $poly3, $t0, $t1 mov 8*1($b_ptr), %rdx adc $t0, $acc3 adc $t1, $acc4 adc \$0, $acc5 xor $acc0, $acc0 # $acc0=0,cf=0,of=0 ######################################################################## # Multiply by b[1] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc1 adox $t1, $acc2 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc1, %rdx adcx $t0, $acc4 shlx $poly1, $acc1, $t0 adox $t1, $acc5 shrx $poly1, $acc1, $t1 adcx $acc0, $acc5 adox $acc0, $acc0 adc \$0, $acc0 ######################################################################## # Second reduction step add $t0, $acc2 adc $t1, $acc3 mulx $poly3, $t0, $t1 mov 8*2($b_ptr), %rdx adc $t0, $acc4 adc $t1, $acc5 adc \$0, $acc0 xor $acc1 ,$acc1 # $acc1=0,cf=0,of=0 ######################################################################## # Multiply by b[2] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc2 adox $t1, $acc3 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc2, %rdx adcx $t0, $acc5 shlx $poly1, $acc2, $t0 adox $t1, $acc0 shrx $poly1, $acc2, $t1 adcx $acc1, $acc0 adox $acc1, $acc1 adc \$0, $acc1 ######################################################################## # Third reduction step add $t0, $acc3 adc $t1, $acc4 mulx $poly3, $t0, $t1 mov 8*3($b_ptr), %rdx adc $t0, $acc5 adc $t1, $acc0 adc \$0, $acc1 xor $acc2, $acc2 # $acc2=0,cf=0,of=0 ######################################################################## # Multiply by b[3] mulx 8*0+128($a_ptr), $t0, $t1 adcx $t0, $acc3 adox $t1, $acc4 mulx 8*1+128($a_ptr), $t0, $t1 adcx $t0, $acc4 adox $t1, $acc5 mulx 8*2+128($a_ptr), $t0, $t1 adcx $t0, $acc5 adox $t1, $acc0 mulx 8*3+128($a_ptr), $t0, $t1 mov $acc3, %rdx adcx $t0, $acc0 shlx $poly1, $acc3, $t0 adox $t1, $acc1 shrx $poly1, $acc3, $t1 adcx $acc2, $acc1 adox $acc2, $acc2 adc \$0, $acc2 ######################################################################## # Fourth reduction step add $t0, $acc4 adc $t1, $acc5 mulx $poly3, $t0, $t1 mov $acc4, $t2 mov .Lpoly+8*1(%rip), $poly1 adc $t0, $acc0 mov $acc5, $t3 adc $t1, $acc1 adc \$0, $acc2 ######################################################################## # Branch-less conditional subtraction of P xor %eax, %eax mov $acc0, $t0 sbb \$-1, $acc4 # .Lpoly[0] sbb $poly1, $acc5 # .Lpoly[1] sbb \$0, $acc0 # .Lpoly[2] mov $acc1, $t1 sbb $poly3, $acc1 # .Lpoly[3] sbb \$0, $acc2 cmovc $t2, $acc4 cmovc $t3, $acc5 mov $acc4, 8*0($r_ptr) cmovc $t0, $acc0 mov $acc5, 8*1($r_ptr) cmovc $t1, $acc1 mov $acc0, 8*2($r_ptr) mov $acc1, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_mul_montx,.-__ecp_nistz256_mul_montx .type __ecp_nistz256_sqr_montx,\@abi-omnipotent .align 32 __ecp_nistz256_sqr_montx: .cfi_startproc mulx $acc6, $acc1, $acc2 # a[0]*a[1] mulx $acc7, $t0, $acc3 # a[0]*a[2] xor %eax, %eax adc $t0, $acc2 mulx $acc0, $t1, $acc4 # a[0]*a[3] mov $acc6, %rdx adc $t1, $acc3 adc \$0, $acc4 xor $acc5, $acc5 # $acc5=0,cf=0,of=0 ################################# mulx $acc7, $t0, $t1 # a[1]*a[2] adcx $t0, $acc3 adox $t1, $acc4 mulx $acc0, $t0, $t1 # a[1]*a[3] mov $acc7, %rdx adcx $t0, $acc4 adox $t1, $acc5 adc \$0, $acc5 ################################# mulx $acc0, $t0, $acc6 # a[2]*a[3] mov 8*0+128($a_ptr), %rdx xor $acc7, $acc7 # $acc7=0,cf=0,of=0 adcx $acc1, $acc1 # acc1:6<<1 adox $t0, $acc5 adcx $acc2, $acc2 adox $acc7, $acc6 # of=0 mulx %rdx, $acc0, $t1 mov 8*1+128($a_ptr), %rdx adcx $acc3, $acc3 adox $t1, $acc1 adcx $acc4, $acc4 mulx %rdx, $t0, $t4 mov 8*2+128($a_ptr), %rdx adcx $acc5, $acc5 adox $t0, $acc2 adcx $acc6, $acc6 .byte 0x67 mulx %rdx, $t0, $t1 mov 8*3+128($a_ptr), %rdx adox $t4, $acc3 adcx $acc7, $acc7 adox $t0, $acc4 mov \$32, $a_ptr adox $t1, $acc5 .byte 0x67,0x67 mulx %rdx, $t0, $t4 mov .Lpoly+8*3(%rip), %rdx adox $t0, $acc6 shlx $a_ptr, $acc0, $t0 adox $t4, $acc7 shrx $a_ptr, $acc0, $t4 mov %rdx,$t1 # reduction step 1 add $t0, $acc1 adc $t4, $acc2 mulx $acc0, $t0, $acc0 adc $t0, $acc3 shlx $a_ptr, $acc1, $t0 adc \$0, $acc0 shrx $a_ptr, $acc1, $t4 # reduction step 2 add $t0, $acc2 adc $t4, $acc3 mulx $acc1, $t0, $acc1 adc $t0, $acc0 shlx $a_ptr, $acc2, $t0 adc \$0, $acc1 shrx $a_ptr, $acc2, $t4 # reduction step 3 add $t0, $acc3 adc $t4, $acc0 mulx $acc2, $t0, $acc2 adc $t0, $acc1 shlx $a_ptr, $acc3, $t0 adc \$0, $acc2 shrx $a_ptr, $acc3, $t4 # reduction step 4 add $t0, $acc0 adc $t4, $acc1 mulx $acc3, $t0, $acc3 adc $t0, $acc2 adc \$0, $acc3 xor $t3, $t3 add $acc0, $acc4 # accumulate upper half mov .Lpoly+8*1(%rip), $a_ptr adc $acc1, $acc5 mov $acc4, $acc0 adc $acc2, $acc6 adc $acc3, $acc7 mov $acc5, $acc1 adc \$0, $t3 sub \$-1, $acc4 # .Lpoly[0] mov $acc6, $acc2 sbb $a_ptr, $acc5 # .Lpoly[1] sbb \$0, $acc6 # .Lpoly[2] mov $acc7, $acc3 sbb $t1, $acc7 # .Lpoly[3] sbb \$0, $t3 cmovc $acc0, $acc4 cmovc $acc1, $acc5 mov $acc4, 8*0($r_ptr) cmovc $acc2, $acc6 mov $acc5, 8*1($r_ptr) cmovc $acc3, $acc7 mov $acc6, 8*2($r_ptr) mov $acc7, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_sqr_montx,.-__ecp_nistz256_sqr_montx ___ } } { my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); my ($ONE,$INDEX,$Ra,$Rb,$Rc,$Rd,$Re,$Rf)=map("%xmm$_",(0..7)); my ($M0,$T0a,$T0b,$T0c,$T0d,$T0e,$T0f,$TMP0)=map("%xmm$_",(8..15)); my ($M1,$T2a,$T2b,$TMP2,$M2,$T2a,$T2b,$TMP2)=map("%xmm$_",(8..15)); $code.=<<___; ################################################################################ # void GFp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, int index); .globl GFp_nistz256_select_w5 .type GFp_nistz256_select_w5,\@abi-omnipotent .align 32 GFp_nistz256_select_w5: .cfi_startproc ___ $code.=<<___ if ($avx>1); leaq GFp_ia32cap_P(%rip), %rax mov 8(%rax), %rax test \$`1<<5`, %eax jnz .Lavx2_select_w5 ___ $code.=<<___ if ($win64); lea -0x88(%rsp), %rax .LSEH_begin_GFp_nistz256_select_w5: .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax) .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax) .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax) .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax) .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax) .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax) .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax) .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax) .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax) .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax) ___ $code.=<<___; movdqa .LOne(%rip), $ONE movd $index, $INDEX pxor $Ra, $Ra pxor $Rb, $Rb pxor $Rc, $Rc pxor $Rd, $Rd pxor $Re, $Re pxor $Rf, $Rf movdqa $ONE, $M0 pshufd \$0, $INDEX, $INDEX mov \$16, %rax .Lselect_loop_sse_w5: movdqa $M0, $TMP0 paddd $ONE, $M0 pcmpeqd $INDEX, $TMP0 movdqa 16*0($in_t), $T0a movdqa 16*1($in_t), $T0b movdqa 16*2($in_t), $T0c movdqa 16*3($in_t), $T0d movdqa 16*4($in_t), $T0e movdqa 16*5($in_t), $T0f lea 16*6($in_t), $in_t pand $TMP0, $T0a pand $TMP0, $T0b por $T0a, $Ra pand $TMP0, $T0c por $T0b, $Rb pand $TMP0, $T0d por $T0c, $Rc pand $TMP0, $T0e por $T0d, $Rd pand $TMP0, $T0f por $T0e, $Re por $T0f, $Rf dec %rax jnz .Lselect_loop_sse_w5 movdqu $Ra, 16*0($val) movdqu $Rb, 16*1($val) movdqu $Rc, 16*2($val) movdqu $Rd, 16*3($val) movdqu $Re, 16*4($val) movdqu $Rf, 16*5($val) ___ $code.=<<___ if ($win64); movaps (%rsp), %xmm6 movaps 0x10(%rsp), %xmm7 movaps 0x20(%rsp), %xmm8 movaps 0x30(%rsp), %xmm9 movaps 0x40(%rsp), %xmm10 movaps 0x50(%rsp), %xmm11 movaps 0x60(%rsp), %xmm12 movaps 0x70(%rsp), %xmm13 movaps 0x80(%rsp), %xmm14 movaps 0x90(%rsp), %xmm15 lea 0xa8(%rsp), %rsp ___ $code.=<<___; ret .cfi_endproc .LSEH_end_GFp_nistz256_select_w5: .size GFp_nistz256_select_w5,.-GFp_nistz256_select_w5 ################################################################################ # void GFp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, int index); .globl GFp_nistz256_select_w7 .type GFp_nistz256_select_w7,\@abi-omnipotent .align 32 GFp_nistz256_select_w7: .cfi_startproc ___ $code.=<<___ if ($avx>1); leaq GFp_ia32cap_P(%rip), %rax mov 8(%rax), %rax test \$`1<<5`, %eax jnz .Lavx2_select_w7 ___ $code.=<<___ if ($win64); lea -0x88(%rsp), %rax .LSEH_begin_GFp_nistz256_select_w7: .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax) .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax) .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax) .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax) .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax) .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax) .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax) .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax) .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax) .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax) ___ $code.=<<___; movdqa .LOne(%rip), $M0 movd $index, $INDEX pxor $Ra, $Ra pxor $Rb, $Rb pxor $Rc, $Rc pxor $Rd, $Rd movdqa $M0, $ONE pshufd \$0, $INDEX, $INDEX mov \$64, %rax .Lselect_loop_sse_w7: movdqa $M0, $TMP0 paddd $ONE, $M0 movdqa 16*0($in_t), $T0a movdqa 16*1($in_t), $T0b pcmpeqd $INDEX, $TMP0 movdqa 16*2($in_t), $T0c movdqa 16*3($in_t), $T0d lea 16*4($in_t), $in_t pand $TMP0, $T0a pand $TMP0, $T0b por $T0a, $Ra pand $TMP0, $T0c por $T0b, $Rb pand $TMP0, $T0d por $T0c, $Rc prefetcht0 255($in_t) por $T0d, $Rd dec %rax jnz .Lselect_loop_sse_w7 movdqu $Ra, 16*0($val) movdqu $Rb, 16*1($val) movdqu $Rc, 16*2($val) movdqu $Rd, 16*3($val) ___ $code.=<<___ if ($win64); movaps (%rsp), %xmm6 movaps 0x10(%rsp), %xmm7 movaps 0x20(%rsp), %xmm8 movaps 0x30(%rsp), %xmm9 movaps 0x40(%rsp), %xmm10 movaps 0x50(%rsp), %xmm11 movaps 0x60(%rsp), %xmm12 movaps 0x70(%rsp), %xmm13 movaps 0x80(%rsp), %xmm14 movaps 0x90(%rsp), %xmm15 lea 0xa8(%rsp), %rsp ___ $code.=<<___; ret .cfi_endproc .LSEH_end_GFp_nistz256_select_w7: .size GFp_nistz256_select_w7,.-GFp_nistz256_select_w7 ___ } if ($avx>1) { my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); my ($TWO,$INDEX,$Ra,$Rb,$Rc)=map("%ymm$_",(0..4)); my ($M0,$T0a,$T0b,$T0c,$TMP0)=map("%ymm$_",(5..9)); my ($M1,$T1a,$T1b,$T1c,$TMP1)=map("%ymm$_",(10..14)); $code.=<<___; ################################################################################ # void GFp_nistz256_avx2_select_w5(uint64_t *val, uint64_t *in_t, int index); .type GFp_nistz256_avx2_select_w5,\@abi-omnipotent .align 32 GFp_nistz256_avx2_select_w5: .cfi_startproc .Lavx2_select_w5: vzeroupper ___ $code.=<<___ if ($win64); lea -0x88(%rsp), %rax mov %rsp,%r11 .LSEH_begin_GFp_nistz256_avx2_select_w5: .byte 0x48,0x8d,0x60,0xe0 # lea -0x20(%rax), %rsp .byte 0xc5,0xf8,0x29,0x70,0xe0 # vmovaps %xmm6, -0x20(%rax) .byte 0xc5,0xf8,0x29,0x78,0xf0 # vmovaps %xmm7, -0x10(%rax) .byte 0xc5,0x78,0x29,0x40,0x00 # vmovaps %xmm8, 8(%rax) .byte 0xc5,0x78,0x29,0x48,0x10 # vmovaps %xmm9, 0x10(%rax) .byte 0xc5,0x78,0x29,0x50,0x20 # vmovaps %xmm10, 0x20(%rax) .byte 0xc5,0x78,0x29,0x58,0x30 # vmovaps %xmm11, 0x30(%rax) .byte 0xc5,0x78,0x29,0x60,0x40 # vmovaps %xmm12, 0x40(%rax) .byte 0xc5,0x78,0x29,0x68,0x50 # vmovaps %xmm13, 0x50(%rax) .byte 0xc5,0x78,0x29,0x70,0x60 # vmovaps %xmm14, 0x60(%rax) .byte 0xc5,0x78,0x29,0x78,0x70 # vmovaps %xmm15, 0x70(%rax) ___ $code.=<<___; vmovdqa .LTwo(%rip), $TWO vpxor $Ra, $Ra, $Ra vpxor $Rb, $Rb, $Rb vpxor $Rc, $Rc, $Rc vmovdqa .LOne(%rip), $M0 vmovdqa .LTwo(%rip), $M1 vmovd $index, %xmm1 vpermd $INDEX, $Ra, $INDEX mov \$8, %rax .Lselect_loop_avx2_w5: vmovdqa 32*0($in_t), $T0a vmovdqa 32*1($in_t), $T0b vmovdqa 32*2($in_t), $T0c vmovdqa 32*3($in_t), $T1a vmovdqa 32*4($in_t), $T1b vmovdqa 32*5($in_t), $T1c vpcmpeqd $INDEX, $M0, $TMP0 vpcmpeqd $INDEX, $M1, $TMP1 vpaddd $TWO, $M0, $M0 vpaddd $TWO, $M1, $M1 lea 32*6($in_t), $in_t vpand $TMP0, $T0a, $T0a vpand $TMP0, $T0b, $T0b vpand $TMP0, $T0c, $T0c vpand $TMP1, $T1a, $T1a vpand $TMP1, $T1b, $T1b vpand $TMP1, $T1c, $T1c vpxor $T0a, $Ra, $Ra vpxor $T0b, $Rb, $Rb vpxor $T0c, $Rc, $Rc vpxor $T1a, $Ra, $Ra vpxor $T1b, $Rb, $Rb vpxor $T1c, $Rc, $Rc dec %rax jnz .Lselect_loop_avx2_w5 vmovdqu $Ra, 32*0($val) vmovdqu $Rb, 32*1($val) vmovdqu $Rc, 32*2($val) vzeroupper ___ $code.=<<___ if ($win64); movaps (%rsp), %xmm6 movaps 0x10(%rsp), %xmm7 movaps 0x20(%rsp), %xmm8 movaps 0x30(%rsp), %xmm9 movaps 0x40(%rsp), %xmm10 movaps 0x50(%rsp), %xmm11 movaps 0x60(%rsp), %xmm12 movaps 0x70(%rsp), %xmm13 movaps 0x80(%rsp), %xmm14 movaps 0x90(%rsp), %xmm15 lea (%r11), %rsp ___ $code.=<<___; ret .cfi_endproc .LSEH_end_GFp_nistz256_avx2_select_w5: .size GFp_nistz256_avx2_select_w5,.-GFp_nistz256_avx2_select_w5 ___ } if ($avx>1) { my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); my ($THREE,$INDEX,$Ra,$Rb)=map("%ymm$_",(0..3)); my ($M0,$T0a,$T0b,$TMP0)=map("%ymm$_",(4..7)); my ($M1,$T1a,$T1b,$TMP1)=map("%ymm$_",(8..11)); my ($M2,$T2a,$T2b,$TMP2)=map("%ymm$_",(12..15)); $code.=<<___; ################################################################################ # void GFp_nistz256_avx2_select_w7(uint64_t *val, uint64_t *in_t, int index); .globl GFp_nistz256_avx2_select_w7 .type GFp_nistz256_avx2_select_w7,\@abi-omnipotent .align 32 GFp_nistz256_avx2_select_w7: .cfi_startproc .Lavx2_select_w7: vzeroupper ___ $code.=<<___ if ($win64); mov %rsp,%r11 lea -0x88(%rsp), %rax .LSEH_begin_GFp_nistz256_avx2_select_w7: .byte 0x48,0x8d,0x60,0xe0 # lea -0x20(%rax), %rsp .byte 0xc5,0xf8,0x29,0x70,0xe0 # vmovaps %xmm6, -0x20(%rax) .byte 0xc5,0xf8,0x29,0x78,0xf0 # vmovaps %xmm7, -0x10(%rax) .byte 0xc5,0x78,0x29,0x40,0x00 # vmovaps %xmm8, 8(%rax) .byte 0xc5,0x78,0x29,0x48,0x10 # vmovaps %xmm9, 0x10(%rax) .byte 0xc5,0x78,0x29,0x50,0x20 # vmovaps %xmm10, 0x20(%rax) .byte 0xc5,0x78,0x29,0x58,0x30 # vmovaps %xmm11, 0x30(%rax) .byte 0xc5,0x78,0x29,0x60,0x40 # vmovaps %xmm12, 0x40(%rax) .byte 0xc5,0x78,0x29,0x68,0x50 # vmovaps %xmm13, 0x50(%rax) .byte 0xc5,0x78,0x29,0x70,0x60 # vmovaps %xmm14, 0x60(%rax) .byte 0xc5,0x78,0x29,0x78,0x70 # vmovaps %xmm15, 0x70(%rax) ___ $code.=<<___; vmovdqa .LThree(%rip), $THREE vpxor $Ra, $Ra, $Ra vpxor $Rb, $Rb, $Rb vmovdqa .LOne(%rip), $M0 vmovdqa .LTwo(%rip), $M1 vmovdqa .LThree(%rip), $M2 vmovd $index, %xmm1 vpermd $INDEX, $Ra, $INDEX # Skip index = 0, because it is implicitly the point at infinity mov \$21, %rax .Lselect_loop_avx2_w7: vmovdqa 32*0($in_t), $T0a vmovdqa 32*1($in_t), $T0b vmovdqa 32*2($in_t), $T1a vmovdqa 32*3($in_t), $T1b vmovdqa 32*4($in_t), $T2a vmovdqa 32*5($in_t), $T2b vpcmpeqd $INDEX, $M0, $TMP0 vpcmpeqd $INDEX, $M1, $TMP1 vpcmpeqd $INDEX, $M2, $TMP2 vpaddd $THREE, $M0, $M0 vpaddd $THREE, $M1, $M1 vpaddd $THREE, $M2, $M2 lea 32*6($in_t), $in_t vpand $TMP0, $T0a, $T0a vpand $TMP0, $T0b, $T0b vpand $TMP1, $T1a, $T1a vpand $TMP1, $T1b, $T1b vpand $TMP2, $T2a, $T2a vpand $TMP2, $T2b, $T2b vpxor $T0a, $Ra, $Ra vpxor $T0b, $Rb, $Rb vpxor $T1a, $Ra, $Ra vpxor $T1b, $Rb, $Rb vpxor $T2a, $Ra, $Ra vpxor $T2b, $Rb, $Rb dec %rax jnz .Lselect_loop_avx2_w7 vmovdqa 32*0($in_t), $T0a vmovdqa 32*1($in_t), $T0b vpcmpeqd $INDEX, $M0, $TMP0 vpand $TMP0, $T0a, $T0a vpand $TMP0, $T0b, $T0b vpxor $T0a, $Ra, $Ra vpxor $T0b, $Rb, $Rb vmovdqu $Ra, 32*0($val) vmovdqu $Rb, 32*1($val) vzeroupper ___ $code.=<<___ if ($win64); movaps (%rsp), %xmm6 movaps 0x10(%rsp), %xmm7 movaps 0x20(%rsp), %xmm8 movaps 0x30(%rsp), %xmm9 movaps 0x40(%rsp), %xmm10 movaps 0x50(%rsp), %xmm11 movaps 0x60(%rsp), %xmm12 movaps 0x70(%rsp), %xmm13 movaps 0x80(%rsp), %xmm14 movaps 0x90(%rsp), %xmm15 lea (%r11), %rsp ___ $code.=<<___; ret .cfi_endproc .LSEH_end_GFp_nistz256_avx2_select_w7: .size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 ___ } else { $code.=<<___; .globl GFp_nistz256_avx2_select_w7 .type GFp_nistz256_avx2_select_w7,\@function,3 .align 32 GFp_nistz256_avx2_select_w7: .byte 0x0f,0x0b # ud2 ret .size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 ___ } {{{ ######################################################################## # This block implements higher level point_double, point_add and # point_add_affine. The key to performance in this case is to allow # out-of-order execution logic to overlap computations from next step # with tail processing from current step. By using tailored calling # sequence we minimize inter-step overhead to give processor better # shot at overlapping operations... # # You will notice that input data is copied to stack. Trouble is that # there are no registers to spare for holding original pointers and # reloading them, pointers, would create undesired dependencies on # effective addresses calculation paths. In other words it's too done # to favour out-of-order execution logic. # my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx"); my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15)); my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rbp","%rcx",$acc4,$acc4); my ($poly1,$poly3)=($acc6,$acc7); sub load_for_mul () { my ($a,$b,$src0) = @_; my $bias = $src0 eq "%rax" ? 0 : -128; " mov $b, $src0 lea $b, $b_ptr mov 8*0+$a, $acc1 mov 8*1+$a, $acc2 lea $bias+$a, $a_ptr mov 8*2+$a, $acc3 mov 8*3+$a, $acc4" } sub load_for_sqr () { my ($a,$src0) = @_; my $bias = $src0 eq "%rax" ? 0 : -128; " mov 8*0+$a, $src0 mov 8*1+$a, $acc6 lea $bias+$a, $a_ptr mov 8*2+$a, $acc7 mov 8*3+$a, $acc0" } { ######################################################################## # operate in 4-5-0-1 "name space" that matches multiplication output # my ($a0,$a1,$a2,$a3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); $code.=<<___; .type __ecp_nistz256_add_toq,\@abi-omnipotent .align 32 __ecp_nistz256_add_toq: .cfi_startproc xor $t4,$t4 add 8*0($b_ptr), $a0 adc 8*1($b_ptr), $a1 mov $a0, $t0 adc 8*2($b_ptr), $a2 adc 8*3($b_ptr), $a3 mov $a1, $t1 adc \$0, $t4 sub \$-1, $a0 mov $a2, $t2 sbb $poly1, $a1 sbb \$0, $a2 mov $a3, $t3 sbb $poly3, $a3 sbb \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 mov $a0, 8*0($r_ptr) cmovc $t2, $a2 mov $a1, 8*1($r_ptr) cmovc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq .type __ecp_nistz256_sub_fromq,\@abi-omnipotent .align 32 __ecp_nistz256_sub_fromq: .cfi_startproc sub 8*0($b_ptr), $a0 sbb 8*1($b_ptr), $a1 mov $a0, $t0 sbb 8*2($b_ptr), $a2 sbb 8*3($b_ptr), $a3 mov $a1, $t1 sbb $t4, $t4 add \$-1, $a0 mov $a2, $t2 adc $poly1, $a1 adc \$0, $a2 mov $a3, $t3 adc $poly3, $a3 test $t4, $t4 cmovz $t0, $a0 cmovz $t1, $a1 mov $a0, 8*0($r_ptr) cmovz $t2, $a2 mov $a1, 8*1($r_ptr) cmovz $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq .type __ecp_nistz256_subq,\@abi-omnipotent .align 32 __ecp_nistz256_subq: .cfi_startproc sub $a0, $t0 sbb $a1, $t1 mov $t0, $a0 sbb $a2, $t2 sbb $a3, $t3 mov $t1, $a1 sbb $t4, $t4 add \$-1, $t0 mov $t2, $a2 adc $poly1, $t1 adc \$0, $t2 mov $t3, $a3 adc $poly3, $t3 test $t4, $t4 cmovnz $t0, $a0 cmovnz $t1, $a1 cmovnz $t2, $a2 cmovnz $t3, $a3 ret .cfi_endproc .size __ecp_nistz256_subq,.-__ecp_nistz256_subq .type __ecp_nistz256_mul_by_2q,\@abi-omnipotent .align 32 __ecp_nistz256_mul_by_2q: .cfi_startproc xor $t4, $t4 add $a0, $a0 # a0:a3+a0:a3 adc $a1, $a1 mov $a0, $t0 adc $a2, $a2 adc $a3, $a3 mov $a1, $t1 adc \$0, $t4 sub \$-1, $a0 mov $a2, $t2 sbb $poly1, $a1 sbb \$0, $a2 mov $a3, $t3 sbb $poly3, $a3 sbb \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 mov $a0, 8*0($r_ptr) cmovc $t2, $a2 mov $a1, 8*1($r_ptr) cmovc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q ___ } sub gen_double () { my $x = shift; my ($src0,$sfx,$bias); my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); if ($x ne "x") { $src0 = "%rax"; $sfx = ""; $bias = 0; $code.=<<___; .globl GFp_nistz256_point_double .type GFp_nistz256_point_double,\@function,2 .align 32 GFp_nistz256_point_double: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx cmp \$0x80100, %ecx je .Lpoint_doublex ___ } else { $src0 = "%rdx"; $sfx = "x"; $bias = 128; $code.=<<___; .type GFp_nistz256_point_doublex,\@function,2 .align 32 GFp_nistz256_point_doublex: .cfi_startproc .Lpoint_doublex: ___ } $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 sub \$32*5+8, %rsp .cfi_adjust_cfa_offset 32*5+8 .Lpoint_double${x}_body: .Lpoint_double_shortcut$x: movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr.x mov $a_ptr, $b_ptr # backup copy movdqu 0x10($a_ptr), %xmm1 mov 0x20+8*0($a_ptr), $acc4 # load in_y in "5-4-0-1" order mov 0x20+8*1($a_ptr), $acc5 mov 0x20+8*2($a_ptr), $acc0 mov 0x20+8*3($a_ptr), $acc1 mov .Lpoly+8*1(%rip), $poly1 mov .Lpoly+8*3(%rip), $poly3 movdqa %xmm0, $in_x(%rsp) movdqa %xmm1, $in_x+0x10(%rsp) lea 0x20($r_ptr), $acc2 lea 0x40($r_ptr), $acc3 movq $r_ptr, %xmm0 movq $acc2, %xmm1 movq $acc3, %xmm2 lea $S(%rsp), $r_ptr call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(S, in_y); mov 0x40+8*0($a_ptr), $src0 mov 0x40+8*1($a_ptr), $acc6 mov 0x40+8*2($a_ptr), $acc7 mov 0x40+8*3($a_ptr), $acc0 lea 0x40-$bias($a_ptr), $a_ptr lea $Zsqr(%rsp), $r_ptr call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Zsqr, in_z); `&load_for_sqr("$S(%rsp)", "$src0")` lea $S(%rsp), $r_ptr call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(S, S); mov 0x20($b_ptr), $src0 # $b_ptr is still valid mov 0x40+8*0($b_ptr), $acc1 mov 0x40+8*1($b_ptr), $acc2 mov 0x40+8*2($b_ptr), $acc3 mov 0x40+8*3($b_ptr), $acc4 lea 0x40-$bias($b_ptr), $a_ptr lea 0x20($b_ptr), $b_ptr movq %xmm2, $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, in_z, in_y); call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(res_z, res_z); mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order mov $in_x+8*1(%rsp), $acc5 lea $Zsqr(%rsp), $b_ptr mov $in_x+8*2(%rsp), $acc0 mov $in_x+8*3(%rsp), $acc1 lea $M(%rsp), $r_ptr call __ecp_nistz256_add_to$x # p256_add(M, in_x, Zsqr); mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order mov $in_x+8*1(%rsp), $acc5 lea $Zsqr(%rsp), $b_ptr mov $in_x+8*2(%rsp), $acc0 mov $in_x+8*3(%rsp), $acc1 lea $Zsqr(%rsp), $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(Zsqr, in_x, Zsqr); `&load_for_sqr("$S(%rsp)", "$src0")` movq %xmm1, $r_ptr call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_y, S); ___ { ######## GFp_nistz256_div_by_2(res_y, res_y); ########################## # operate in 4-5-6-7 "name space" that matches squaring output # my ($poly1,$poly3)=($a_ptr,$t1); my ($a0,$a1,$a2,$a3,$t3,$t4,$t1)=($acc4,$acc5,$acc6,$acc7,$acc0,$acc1,$acc2); $code.=<<___; xor $t4, $t4 mov $a0, $t0 add \$-1, $a0 mov $a1, $t1 adc $poly1, $a1 mov $a2, $t2 adc \$0, $a2 mov $a3, $t3 adc $poly3, $a3 adc \$0, $t4 xor $a_ptr, $a_ptr # borrow $a_ptr test \$1, $t0 cmovz $t0, $a0 cmovz $t1, $a1 cmovz $t2, $a2 cmovz $t3, $a3 cmovz $a_ptr, $t4 mov $a1, $t0 # a0:a3>>1 shr \$1, $a0 shl \$63, $t0 mov $a2, $t1 shr \$1, $a1 or $t0, $a0 shl \$63, $t1 mov $a3, $t2 shr \$1, $a2 or $t1, $a1 shl \$63, $t2 mov $a0, 8*0($r_ptr) shr \$1, $a3 mov $a1, 8*1($r_ptr) shl \$63, $t4 or $t2, $a2 or $t4, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ___ } $code.=<<___; `&load_for_mul("$M(%rsp)", "$Zsqr(%rsp)", "$src0")` lea $M(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(M, M, Zsqr); lea $tmp0(%rsp), $r_ptr call __ecp_nistz256_mul_by_2$x lea $M(%rsp), $b_ptr lea $M(%rsp), $r_ptr call __ecp_nistz256_add_to$x # p256_mul_by_3(M, M); `&load_for_mul("$S(%rsp)", "$in_x(%rsp)", "$src0")` lea $S(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, in_x); lea $tmp0(%rsp), $r_ptr call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(tmp0, S); `&load_for_sqr("$M(%rsp)", "$src0")` movq %xmm0, $r_ptr call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_x, M); lea $tmp0(%rsp), $b_ptr mov $acc6, $acc0 # harmonize sqr output and sub input mov $acc7, $acc1 mov $a_ptr, $poly1 mov $t1, $poly3 call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, tmp0); mov $S+8*0(%rsp), $t0 mov $S+8*1(%rsp), $t1 mov $S+8*2(%rsp), $t2 mov $S+8*3(%rsp), $acc2 # "4-5-0-1" order lea $S(%rsp), $r_ptr call __ecp_nistz256_sub$x # p256_sub(S, S, res_x); mov $M(%rsp), $src0 lea $M(%rsp), $b_ptr mov $acc4, $acc6 # harmonize sub output and mul input xor %ecx, %ecx mov $acc4, $S+8*0(%rsp) # have to save:-( mov $acc5, $acc2 mov $acc5, $S+8*1(%rsp) cmovz $acc0, $acc3 mov $acc0, $S+8*2(%rsp) lea $S-$bias(%rsp), $a_ptr cmovz $acc1, $acc4 mov $acc1, $S+8*3(%rsp) mov $acc6, $acc1 lea $S(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, M); movq %xmm1, $b_ptr movq %xmm1, $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(res_y, S, res_y); lea 32*5+56(%rsp), %rsi .cfi_def_cfa %rsi,8 mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbx .cfi_restore %rbx mov -8(%rsi),%rbp .cfi_restore %rbp lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_double${x}_epilogue: ret .cfi_endproc .size GFp_nistz256_point_double$sfx,.-GFp_nistz256_point_double$sfx ___ } &gen_double("q"); sub gen_add () { my $x = shift; my ($src0,$sfx,$bias); my ($H,$Hsqr,$R,$Rsqr,$Hcub, $U1,$U2,$S1,$S2, $res_x,$res_y,$res_z, $in1_x,$in1_y,$in1_z, $in2_x,$in2_y,$in2_z)=map(32*$_,(0..17)); my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr); if ($x ne "x") { $src0 = "%rax"; $sfx = ""; $bias = 0; $code.=<<___; .globl GFp_nistz256_point_add .type GFp_nistz256_point_add,\@function,3 .align 32 GFp_nistz256_point_add: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx cmp \$0x80100, %ecx je .Lpoint_addx ___ } else { $src0 = "%rdx"; $sfx = "x"; $bias = 128; $code.=<<___; .type GFp_nistz256_point_addx,\@function,3 .align 32 GFp_nistz256_point_addx: .cfi_startproc .Lpoint_addx: ___ } $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 sub \$32*18+8, %rsp .cfi_adjust_cfa_offset 32*18+8 .Lpoint_add${x}_body: movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr movdqu 0x10($a_ptr), %xmm1 movdqu 0x20($a_ptr), %xmm2 movdqu 0x30($a_ptr), %xmm3 movdqu 0x40($a_ptr), %xmm4 movdqu 0x50($a_ptr), %xmm5 mov $a_ptr, $b_ptr # reassign mov $b_org, $a_ptr # reassign movdqa %xmm0, $in1_x(%rsp) movdqa %xmm1, $in1_x+0x10(%rsp) movdqa %xmm2, $in1_y(%rsp) movdqa %xmm3, $in1_y+0x10(%rsp) movdqa %xmm4, $in1_z(%rsp) movdqa %xmm5, $in1_z+0x10(%rsp) por %xmm4, %xmm5 movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$b_ptr pshufd \$0xb1, %xmm5, %xmm3 movdqu 0x10($a_ptr), %xmm1 movdqu 0x20($a_ptr), %xmm2 por %xmm3, %xmm5 movdqu 0x30($a_ptr), %xmm3 mov 0x40+8*0($a_ptr), $src0 # load original in2_z mov 0x40+8*1($a_ptr), $acc6 mov 0x40+8*2($a_ptr), $acc7 mov 0x40+8*3($a_ptr), $acc0 movdqa %xmm0, $in2_x(%rsp) pshufd \$0x1e, %xmm5, %xmm4 movdqa %xmm1, $in2_x+0x10(%rsp) movdqu 0x40($a_ptr),%xmm0 # in2_z again movdqu 0x50($a_ptr),%xmm1 movdqa %xmm2, $in2_y(%rsp) movdqa %xmm3, $in2_y+0x10(%rsp) por %xmm4, %xmm5 pxor %xmm4, %xmm4 por %xmm0, %xmm1 movq $r_ptr, %xmm0 # save $r_ptr lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid mov $src0, $in2_z+8*0(%rsp) # make in2_z copy mov $acc6, $in2_z+8*1(%rsp) mov $acc7, $in2_z+8*2(%rsp) mov $acc0, $in2_z+8*3(%rsp) lea $Z2sqr(%rsp), $r_ptr # Z2^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z2sqr, in2_z); pcmpeqd %xmm4, %xmm5 pshufd \$0xb1, %xmm1, %xmm4 por %xmm1, %xmm4 pshufd \$0, %xmm5, %xmm5 # in1infty pshufd \$0x1e, %xmm4, %xmm3 por %xmm3, %xmm4 pxor %xmm3, %xmm3 pcmpeqd %xmm3, %xmm4 pshufd \$0, %xmm4, %xmm4 # in2infty mov 0x40+8*0($b_ptr), $src0 # load original in1_z mov 0x40+8*1($b_ptr), $acc6 mov 0x40+8*2($b_ptr), $acc7 mov 0x40+8*3($b_ptr), $acc0 movq $b_ptr, %xmm1 lea 0x40-$bias($b_ptr), $a_ptr lea $Z1sqr(%rsp), $r_ptr # Z1^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z); `&load_for_mul("$Z2sqr(%rsp)", "$in2_z(%rsp)", "$src0")` lea $S1(%rsp), $r_ptr # S1 = Z2^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, Z2sqr, in2_z); `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr # S2 = Z1^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z); `&load_for_mul("$S1(%rsp)", "$in1_y(%rsp)", "$src0")` lea $S1(%rsp), $r_ptr # S1 = Y1*Z2^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, S1, in1_y); `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y); lea $S1(%rsp), $b_ptr lea $R(%rsp), $r_ptr # R = S2 - S1 call __ecp_nistz256_sub_from$x # p256_sub(R, S2, S1); or $acc5, $acc4 # see if result is zero movdqa %xmm4, %xmm2 or $acc0, $acc4 or $acc1, $acc4 por %xmm5, %xmm2 # in1infty || in2infty movq $acc4, %xmm3 `&load_for_mul("$Z2sqr(%rsp)", "$in1_x(%rsp)", "$src0")` lea $U1(%rsp), $r_ptr # U1 = X1*Z2^2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U1, in1_x, Z2sqr); `&load_for_mul("$Z1sqr(%rsp)", "$in2_x(%rsp)", "$src0")` lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in2_x, Z1sqr); lea $U1(%rsp), $b_ptr lea $H(%rsp), $r_ptr # H = U2 - U1 call __ecp_nistz256_sub_from$x # p256_sub(H, U2, U1); or $acc5, $acc4 # see if result is zero or $acc0, $acc4 or $acc1, $acc4 # !is_equal(U1, U2) movq %xmm2, $acc0 movq %xmm3, $acc1 or $acc0, $acc4 .byte 0x3e # predict taken jnz .Ladd_proceed$x # !is_equal(U1, U2) || in1infty || in2infty # We now know A = B or A = -B and neither is infinity. Compare the # y-coordinates via S1 and S2. test $acc1, $acc1 jz .Ladd_double$x # is_equal(S1, S2) # A = -B, so the result is infinity. # # TODO(davidben): Does .Ladd_proceed handle this case? It seems to, in # which case we should eliminate this special-case and simplify the # timing analysis. movq %xmm0, $r_ptr # restore $r_ptr pxor %xmm0, %xmm0 movdqu %xmm0, 0x00($r_ptr) movdqu %xmm0, 0x10($r_ptr) movdqu %xmm0, 0x20($r_ptr) movdqu %xmm0, 0x30($r_ptr) movdqu %xmm0, 0x40($r_ptr) movdqu %xmm0, 0x50($r_ptr) jmp .Ladd_done$x .align 32 .Ladd_double$x: movq %xmm1, $a_ptr # restore $a_ptr movq %xmm0, $r_ptr # restore $r_ptr add \$`32*(18-5)`, %rsp # difference in frame sizes .cfi_adjust_cfa_offset `-32*(18-5)` jmp .Lpoint_double_shortcut$x .cfi_adjust_cfa_offset `32*(18-5)` .align 32 .Ladd_proceed$x: `&load_for_sqr("$R(%rsp)", "$src0")` lea $Rsqr(%rsp), $r_ptr # R^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R); `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")` lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z); `&load_for_sqr("$H(%rsp)", "$src0")` lea $Hsqr(%rsp), $r_ptr # H^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H); `&load_for_mul("$res_z(%rsp)", "$in2_z(%rsp)", "$src0")` lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, res_z, in2_z); `&load_for_mul("$Hsqr(%rsp)", "$H(%rsp)", "$src0")` lea $Hcub(%rsp), $r_ptr # H^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H); `&load_for_mul("$Hsqr(%rsp)", "$U1(%rsp)", "$src0")` lea $U2(%rsp), $r_ptr # U1*H^2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, U1, Hsqr); ___ { ####################################################################### # operate in 4-5-0-1 "name space" that matches multiplication output # my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); my ($poly1, $poly3)=($acc6,$acc7); $code.=<<___; #lea $U2(%rsp), $a_ptr #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2 #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); xor $t4, $t4 add $acc0, $acc0 # a0:a3+a0:a3 lea $Rsqr(%rsp), $a_ptr adc $acc1, $acc1 mov $acc0, $t0 adc $acc2, $acc2 adc $acc3, $acc3 mov $acc1, $t1 adc \$0, $t4 sub \$-1, $acc0 mov $acc2, $t2 sbb $poly1, $acc1 sbb \$0, $acc2 mov $acc3, $t3 sbb $poly3, $acc3 sbb \$0, $t4 cmovc $t0, $acc0 mov 8*0($a_ptr), $t0 cmovc $t1, $acc1 mov 8*1($a_ptr), $t1 cmovc $t2, $acc2 mov 8*2($a_ptr), $t2 cmovc $t3, $acc3 mov 8*3($a_ptr), $t3 call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr); lea $Hcub(%rsp), $b_ptr lea $res_x(%rsp), $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub); mov $U2+8*0(%rsp), $t0 mov $U2+8*1(%rsp), $t1 mov $U2+8*2(%rsp), $t2 mov $U2+8*3(%rsp), $t3 lea $res_y(%rsp), $r_ptr call __ecp_nistz256_sub$x # p256_sub(res_y, U2, res_x); mov $acc0, 8*0($r_ptr) # save the result, as mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't mov $acc2, 8*2($r_ptr) mov $acc3, 8*3($r_ptr) ___ } $code.=<<___; `&load_for_mul("$S1(%rsp)", "$Hcub(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S1, Hcub); `&load_for_mul("$R(%rsp)", "$res_y(%rsp)", "$src0")` lea $res_y(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_y, R, res_y); lea $S2(%rsp), $b_ptr lea $res_y(%rsp), $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(res_y, res_y, S2); movq %xmm0, $r_ptr # restore $r_ptr movdqa %xmm5, %xmm0 # copy_conditional(res_z, in2_z, in1infty); movdqa %xmm5, %xmm1 pandn $res_z(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_z+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand $in2_z(%rsp), %xmm2 pand $in2_z+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_z(%rsp), %xmm2 pand $in1_z+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x40($r_ptr) movdqu %xmm3, 0x50($r_ptr) movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty); movdqa %xmm5, %xmm1 pandn $res_x(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_x+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand $in2_x(%rsp), %xmm2 pand $in2_x+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_x(%rsp), %xmm2 pand $in1_x+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x00($r_ptr) movdqu %xmm3, 0x10($r_ptr) movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty); movdqa %xmm5, %xmm1 pandn $res_y(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_y+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand $in2_y(%rsp), %xmm2 pand $in2_y+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_y(%rsp), %xmm2 pand $in1_y+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x20($r_ptr) movdqu %xmm3, 0x30($r_ptr) .Ladd_done$x: lea 32*18+56(%rsp), %rsi .cfi_def_cfa %rsi,8 mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbx .cfi_restore %rbx mov -8(%rsi),%rbp .cfi_restore %rbp lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_add${x}_epilogue: ret .cfi_endproc .size GFp_nistz256_point_add$sfx,.-GFp_nistz256_point_add$sfx ___ } &gen_add("q"); sub gen_add_affine () { my $x = shift; my ($src0,$sfx,$bias); my ($U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr, $res_x,$res_y,$res_z, $in1_x,$in1_y,$in1_z, $in2_x,$in2_y)=map(32*$_,(0..14)); my $Z1sqr = $S2; if ($x ne "x") { $src0 = "%rax"; $sfx = ""; $bias = 0; $code.=<<___; .globl GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,\@function,3 .align 32 GFp_nistz256_point_add_affine: .cfi_startproc ___ $code.=<<___ if ($addx); leaq GFp_ia32cap_P(%rip), %rcx mov 8(%rcx), %rcx and \$0x80100, %ecx cmp \$0x80100, %ecx je .Lpoint_add_affinex ___ } else { $src0 = "%rdx"; $sfx = "x"; $bias = 128; $code.=<<___; .type GFp_nistz256_point_add_affinex,\@function,3 .align 32 GFp_nistz256_point_add_affinex: .cfi_startproc .Lpoint_add_affinex: ___ } $code.=<<___; push %rbp .cfi_push %rbp push %rbx .cfi_push %rbx push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 sub \$32*15+8, %rsp .cfi_adjust_cfa_offset 32*15+8 .Ladd_affine${x}_body: movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr mov $b_org, $b_ptr # reassign movdqu 0x10($a_ptr), %xmm1 movdqu 0x20($a_ptr), %xmm2 movdqu 0x30($a_ptr), %xmm3 movdqu 0x40($a_ptr), %xmm4 movdqu 0x50($a_ptr), %xmm5 mov 0x40+8*0($a_ptr), $src0 # load original in1_z mov 0x40+8*1($a_ptr), $acc6 mov 0x40+8*2($a_ptr), $acc7 mov 0x40+8*3($a_ptr), $acc0 movdqa %xmm0, $in1_x(%rsp) movdqa %xmm1, $in1_x+0x10(%rsp) movdqa %xmm2, $in1_y(%rsp) movdqa %xmm3, $in1_y+0x10(%rsp) movdqa %xmm4, $in1_z(%rsp) movdqa %xmm5, $in1_z+0x10(%rsp) por %xmm4, %xmm5 movdqu 0x00($b_ptr), %xmm0 # copy *(P256_POINT_AFFINE *)$b_ptr pshufd \$0xb1, %xmm5, %xmm3 movdqu 0x10($b_ptr), %xmm1 movdqu 0x20($b_ptr), %xmm2 por %xmm3, %xmm5 movdqu 0x30($b_ptr), %xmm3 movdqa %xmm0, $in2_x(%rsp) pshufd \$0x1e, %xmm5, %xmm4 movdqa %xmm1, $in2_x+0x10(%rsp) por %xmm0, %xmm1 movq $r_ptr, %xmm0 # save $r_ptr movdqa %xmm2, $in2_y(%rsp) movdqa %xmm3, $in2_y+0x10(%rsp) por %xmm2, %xmm3 por %xmm4, %xmm5 pxor %xmm4, %xmm4 por %xmm1, %xmm3 lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid lea $Z1sqr(%rsp), $r_ptr # Z1^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z); pcmpeqd %xmm4, %xmm5 pshufd \$0xb1, %xmm3, %xmm4 mov 0x00($b_ptr), $src0 # $b_ptr is still valid #lea 0x00($b_ptr), $b_ptr mov $acc4, $acc1 # harmonize sqr output and mul input por %xmm3, %xmm4 pshufd \$0, %xmm5, %xmm5 # in1infty pshufd \$0x1e, %xmm4, %xmm3 mov $acc5, $acc2 por %xmm3, %xmm4 pxor %xmm3, %xmm3 mov $acc6, $acc3 pcmpeqd %xmm3, %xmm4 pshufd \$0, %xmm4, %xmm4 # in2infty lea $Z1sqr-$bias(%rsp), $a_ptr mov $acc7, $acc4 lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, Z1sqr, in2_x); lea $in1_x(%rsp), $b_ptr lea $H(%rsp), $r_ptr # H = U2 - U1 call __ecp_nistz256_sub_from$x # p256_sub(H, U2, in1_x); `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr # S2 = Z1^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z); `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")` lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z); `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y); lea $in1_y(%rsp), $b_ptr lea $R(%rsp), $r_ptr # R = S2 - S1 call __ecp_nistz256_sub_from$x # p256_sub(R, S2, in1_y); `&load_for_sqr("$H(%rsp)", "$src0")` lea $Hsqr(%rsp), $r_ptr # H^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H); `&load_for_sqr("$R(%rsp)", "$src0")` lea $Rsqr(%rsp), $r_ptr # R^2 call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R); `&load_for_mul("$H(%rsp)", "$Hsqr(%rsp)", "$src0")` lea $Hcub(%rsp), $r_ptr # H^3 call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H); `&load_for_mul("$Hsqr(%rsp)", "$in1_x(%rsp)", "$src0")` lea $U2(%rsp), $r_ptr # U1*H^2 call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in1_x, Hsqr); ___ { ####################################################################### # operate in 4-5-0-1 "name space" that matches multiplication output # my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); my ($poly1, $poly3)=($acc6,$acc7); $code.=<<___; #lea $U2(%rsp), $a_ptr #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2 #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); xor $t4, $t4 add $acc0, $acc0 # a0:a3+a0:a3 lea $Rsqr(%rsp), $a_ptr adc $acc1, $acc1 mov $acc0, $t0 adc $acc2, $acc2 adc $acc3, $acc3 mov $acc1, $t1 adc \$0, $t4 sub \$-1, $acc0 mov $acc2, $t2 sbb $poly1, $acc1 sbb \$0, $acc2 mov $acc3, $t3 sbb $poly3, $acc3 sbb \$0, $t4 cmovc $t0, $acc0 mov 8*0($a_ptr), $t0 cmovc $t1, $acc1 mov 8*1($a_ptr), $t1 cmovc $t2, $acc2 mov 8*2($a_ptr), $t2 cmovc $t3, $acc3 mov 8*3($a_ptr), $t3 call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr); lea $Hcub(%rsp), $b_ptr lea $res_x(%rsp), $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub); mov $U2+8*0(%rsp), $t0 mov $U2+8*1(%rsp), $t1 mov $U2+8*2(%rsp), $t2 mov $U2+8*3(%rsp), $t3 lea $H(%rsp), $r_ptr call __ecp_nistz256_sub$x # p256_sub(H, U2, res_x); mov $acc0, 8*0($r_ptr) # save the result, as mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't mov $acc2, 8*2($r_ptr) mov $acc3, 8*3($r_ptr) ___ } $code.=<<___; `&load_for_mul("$Hcub(%rsp)", "$in1_y(%rsp)", "$src0")` lea $S2(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Hcub, in1_y); `&load_for_mul("$H(%rsp)", "$R(%rsp)", "$src0")` lea $H(%rsp), $r_ptr call __ecp_nistz256_mul_mont$x # p256_mul_mont(H, H, R); lea $S2(%rsp), $b_ptr lea $res_y(%rsp), $r_ptr call __ecp_nistz256_sub_from$x # p256_sub(res_y, H, S2); movq %xmm0, $r_ptr # restore $r_ptr movdqa %xmm5, %xmm0 # copy_conditional(res_z, ONE, in1infty); movdqa %xmm5, %xmm1 pandn $res_z(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_z+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand .LONE_mont(%rip), %xmm2 pand .LONE_mont+0x10(%rip), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_z(%rsp), %xmm2 pand $in1_z+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x40($r_ptr) movdqu %xmm3, 0x50($r_ptr) movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty); movdqa %xmm5, %xmm1 pandn $res_x(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_x+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand $in2_x(%rsp), %xmm2 pand $in2_x+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_x(%rsp), %xmm2 pand $in1_x+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x00($r_ptr) movdqu %xmm3, 0x10($r_ptr) movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty); movdqa %xmm5, %xmm1 pandn $res_y(%rsp), %xmm0 movdqa %xmm5, %xmm2 pandn $res_y+0x10(%rsp), %xmm1 movdqa %xmm5, %xmm3 pand $in2_y(%rsp), %xmm2 pand $in2_y+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty); movdqa %xmm4, %xmm1 pandn %xmm2, %xmm0 movdqa %xmm4, %xmm2 pandn %xmm3, %xmm1 movdqa %xmm4, %xmm3 pand $in1_y(%rsp), %xmm2 pand $in1_y+0x10(%rsp), %xmm3 por %xmm0, %xmm2 por %xmm1, %xmm3 movdqu %xmm2, 0x20($r_ptr) movdqu %xmm3, 0x30($r_ptr) lea 32*15+56(%rsp), %rsi .cfi_def_cfa %rsi,8 mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbx .cfi_restore %rbx mov -8(%rsi),%rbp .cfi_restore %rbp lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Ladd_affine${x}_epilogue: ret .cfi_endproc .size GFp_nistz256_point_add_affine$sfx,.-GFp_nistz256_point_add_affine$sfx ___ } &gen_add_affine("q"); ######################################################################## # AD*X magic # if ($addx) { { ######################################################################## # operate in 4-5-0-1 "name space" that matches multiplication output # my ($a0,$a1,$a2,$a3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); $code.=<<___; .type __ecp_nistz256_add_tox,\@abi-omnipotent .align 32 __ecp_nistz256_add_tox: .cfi_startproc xor $t4, $t4 adc 8*0($b_ptr), $a0 adc 8*1($b_ptr), $a1 mov $a0, $t0 adc 8*2($b_ptr), $a2 adc 8*3($b_ptr), $a3 mov $a1, $t1 adc \$0, $t4 xor $t3, $t3 sbb \$-1, $a0 mov $a2, $t2 sbb $poly1, $a1 sbb \$0, $a2 mov $a3, $t3 sbb $poly3, $a3 sbb \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 mov $a0, 8*0($r_ptr) cmovc $t2, $a2 mov $a1, 8*1($r_ptr) cmovc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_add_tox,.-__ecp_nistz256_add_tox .type __ecp_nistz256_sub_fromx,\@abi-omnipotent .align 32 __ecp_nistz256_sub_fromx: .cfi_startproc xor $t4, $t4 sbb 8*0($b_ptr), $a0 sbb 8*1($b_ptr), $a1 mov $a0, $t0 sbb 8*2($b_ptr), $a2 sbb 8*3($b_ptr), $a3 mov $a1, $t1 sbb \$0, $t4 xor $t3, $t3 adc \$-1, $a0 mov $a2, $t2 adc $poly1, $a1 adc \$0, $a2 mov $a3, $t3 adc $poly3, $a3 bt \$0, $t4 cmovnc $t0, $a0 cmovnc $t1, $a1 mov $a0, 8*0($r_ptr) cmovnc $t2, $a2 mov $a1, 8*1($r_ptr) cmovnc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_sub_fromx,.-__ecp_nistz256_sub_fromx .type __ecp_nistz256_subx,\@abi-omnipotent .align 32 __ecp_nistz256_subx: .cfi_startproc xor $t4, $t4 sbb $a0, $t0 sbb $a1, $t1 mov $t0, $a0 sbb $a2, $t2 sbb $a3, $t3 mov $t1, $a1 sbb \$0, $t4 xor $a3 ,$a3 adc \$-1, $t0 mov $t2, $a2 adc $poly1, $t1 adc \$0, $t2 mov $t3, $a3 adc $poly3, $t3 bt \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 cmovc $t2, $a2 cmovc $t3, $a3 ret .cfi_endproc .size __ecp_nistz256_subx,.-__ecp_nistz256_subx .type __ecp_nistz256_mul_by_2x,\@abi-omnipotent .align 32 __ecp_nistz256_mul_by_2x: .cfi_startproc xor $t4, $t4 adc $a0, $a0 # a0:a3+a0:a3 adc $a1, $a1 mov $a0, $t0 adc $a2, $a2 adc $a3, $a3 mov $a1, $t1 adc \$0, $t4 xor $t3, $t3 sbb \$-1, $a0 mov $a2, $t2 sbb $poly1, $a1 sbb \$0, $a2 mov $a3, $t3 sbb $poly3, $a3 sbb \$0, $t4 cmovc $t0, $a0 cmovc $t1, $a1 mov $a0, 8*0($r_ptr) cmovc $t2, $a2 mov $a1, 8*1($r_ptr) cmovc $t3, $a3 mov $a2, 8*2($r_ptr) mov $a3, 8*3($r_ptr) ret .cfi_endproc .size __ecp_nistz256_mul_by_2x,.-__ecp_nistz256_mul_by_2x ___ } &gen_double("x"); &gen_add("x"); &gen_add_affine("x"); } }}} # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type short_handler,\@abi-omnipotent .align 16 short_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # end of prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail lea 16(%rax),%rax mov -8(%rax),%r12 mov -16(%rax),%r13 mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 jmp .Lcommon_seh_tail .size short_handler,.-short_handler .type full_handler,\@abi-omnipotent .align 16 full_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # end of prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail mov 8(%r11),%r10d # HandlerData[2] lea (%rax,%r10),%rax mov -8(%rax),%rbp mov -16(%rax),%rbx mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size full_handler,.-full_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_nistz256_neg .rva .LSEH_end_GFp_nistz256_neg .rva .LSEH_info_GFp_nistz256_neg .rva .LSEH_begin_GFp_p256_scalar_mul_mont .rva .LSEH_end_GFp_p256_scalar_mul_mont .rva .LSEH_info_GFp_p256_scalar_mul_mont .rva .LSEH_begin_GFp_p256_scalar_sqr_rep_mont .rva .LSEH_end_GFp_p256_scalar_sqr_rep_mont .rva .LSEH_info_GFp_p256_scalar_sqr_rep_mont ___ $code.=<<___ if ($addx); .rva .LSEH_begin_ecp_nistz256_ord_mul_montx .rva .LSEH_end_ecp_nistz256_ord_mul_montx .rva .LSEH_info_ecp_nistz256_ord_mul_montx .rva .LSEH_begin_ecp_nistz256_ord_sqr_montx .rva .LSEH_end_ecp_nistz256_ord_sqr_montx .rva .LSEH_info_ecp_nistz256_ord_sqr_montx ___ $code.=<<___; .rva .LSEH_begin_GFp_nistz256_mul_mont .rva .LSEH_end_GFp_nistz256_mul_mont .rva .LSEH_info_GFp_nistz256_mul_mont .rva .LSEH_begin_GFp_nistz256_sqr_mont .rva .LSEH_end_GFp_nistz256_sqr_mont .rva .LSEH_info_GFp_nistz256_sqr_mont .rva .LSEH_begin_GFp_nistz256_select_w5 .rva .LSEH_end_GFp_nistz256_select_w5 .rva .LSEH_info_GFp_nistz256_select_wX .rva .LSEH_begin_GFp_nistz256_select_w7 .rva .LSEH_end_GFp_nistz256_select_w7 .rva .LSEH_info_GFp_nistz256_select_wX ___ $code.=<<___ if ($avx>1); .rva .LSEH_begin_GFp_nistz256_avx2_select_w5 .rva .LSEH_end_GFp_nistz256_avx2_select_w5 .rva .LSEH_info_GFp_nistz256_avx2_select_wX .rva .LSEH_begin_GFp_nistz256_avx2_select_w7 .rva .LSEH_end_GFp_nistz256_avx2_select_w7 .rva .LSEH_info_GFp_nistz256_avx2_select_wX ___ $code.=<<___; .rva .LSEH_begin_GFp_nistz256_point_double .rva .LSEH_end_GFp_nistz256_point_double .rva .LSEH_info_GFp_nistz256_point_double .rva .LSEH_begin_GFp_nistz256_point_add .rva .LSEH_end_GFp_nistz256_point_add .rva .LSEH_info_GFp_nistz256_point_add .rva .LSEH_begin_GFp_nistz256_point_add_affine .rva .LSEH_end_GFp_nistz256_point_add_affine .rva .LSEH_info_GFp_nistz256_point_add_affine ___ $code.=<<___ if ($addx); .rva .LSEH_begin_GFp_nistz256_point_doublex .rva .LSEH_end_GFp_nistz256_point_doublex .rva .LSEH_info_GFp_nistz256_point_doublex .rva .LSEH_begin_GFp_nistz256_point_addx .rva .LSEH_end_GFp_nistz256_point_addx .rva .LSEH_info_GFp_nistz256_point_addx .rva .LSEH_begin_GFp_nistz256_point_add_affinex .rva .LSEH_end_GFp_nistz256_point_add_affinex .rva .LSEH_info_GFp_nistz256_point_add_affinex ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_GFp_nistz256_neg: .byte 9,0,0,0 .rva short_handler .rva .Lneg_body,.Lneg_epilogue # HandlerData[] .LSEH_info_GFp_p256_scalar_mul_mont: .byte 9,0,0,0 .rva full_handler .rva .Lord_mul_body,.Lord_mul_epilogue # HandlerData[] .long 48,0 .LSEH_info_GFp_p256_scalar_sqr_rep_mont: .byte 9,0,0,0 .rva full_handler .rva .Lord_sqr_body,.Lord_sqr_epilogue # HandlerData[] .long 48,0 ___ $code.=<<___ if ($addx); .LSEH_info_ecp_nistz256_ord_mul_montx: .byte 9,0,0,0 .rva full_handler .rva .Lord_mulx_body,.Lord_mulx_epilogue # HandlerData[] .long 48,0 .LSEH_info_ecp_nistz256_ord_sqr_montx: .byte 9,0,0,0 .rva full_handler .rva .Lord_sqrx_body,.Lord_sqrx_epilogue # HandlerData[] .long 48,0 ___ $code.=<<___; .LSEH_info_GFp_nistz256_mul_mont: .byte 9,0,0,0 .rva full_handler .rva .Lmul_body,.Lmul_epilogue # HandlerData[] .long 48,0 .LSEH_info_GFp_nistz256_sqr_mont: .byte 9,0,0,0 .rva full_handler .rva .Lsqr_body,.Lsqr_epilogue # HandlerData[] .long 48,0 .LSEH_info_GFp_nistz256_select_wX: .byte 0x01,0x33,0x16,0x00 .byte 0x33,0xf8,0x09,0x00 #movaps 0x90(rsp),xmm15 .byte 0x2e,0xe8,0x08,0x00 #movaps 0x80(rsp),xmm14 .byte 0x29,0xd8,0x07,0x00 #movaps 0x70(rsp),xmm13 .byte 0x24,0xc8,0x06,0x00 #movaps 0x60(rsp),xmm12 .byte 0x1f,0xb8,0x05,0x00 #movaps 0x50(rsp),xmm11 .byte 0x1a,0xa8,0x04,0x00 #movaps 0x40(rsp),xmm10 .byte 0x15,0x98,0x03,0x00 #movaps 0x30(rsp),xmm9 .byte 0x10,0x88,0x02,0x00 #movaps 0x20(rsp),xmm8 .byte 0x0c,0x78,0x01,0x00 #movaps 0x10(rsp),xmm7 .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 .byte 0x04,0x01,0x15,0x00 #sub rsp,0xa8 .align 8 ___ $code.=<<___ if ($avx>1); .LSEH_info_GFp_nistz256_avx2_select_wX: .byte 0x01,0x36,0x17,0x0b .byte 0x36,0xf8,0x09,0x00 # vmovaps 0x90(rsp),xmm15 .byte 0x31,0xe8,0x08,0x00 # vmovaps 0x80(rsp),xmm14 .byte 0x2c,0xd8,0x07,0x00 # vmovaps 0x70(rsp),xmm13 .byte 0x27,0xc8,0x06,0x00 # vmovaps 0x60(rsp),xmm12 .byte 0x22,0xb8,0x05,0x00 # vmovaps 0x50(rsp),xmm11 .byte 0x1d,0xa8,0x04,0x00 # vmovaps 0x40(rsp),xmm10 .byte 0x18,0x98,0x03,0x00 # vmovaps 0x30(rsp),xmm9 .byte 0x13,0x88,0x02,0x00 # vmovaps 0x20(rsp),xmm8 .byte 0x0e,0x78,0x01,0x00 # vmovaps 0x10(rsp),xmm7 .byte 0x09,0x68,0x00,0x00 # vmovaps 0x00(rsp),xmm6 .byte 0x04,0x01,0x15,0x00 # sub rsp,0xa8 .byte 0x00,0xb3,0x00,0x00 # set_frame r11 .align 8 ___ $code.=<<___; .LSEH_info_GFp_nistz256_point_double: .byte 9,0,0,0 .rva full_handler .rva .Lpoint_doubleq_body,.Lpoint_doubleq_epilogue # HandlerData[] .long 32*5+56,0 .LSEH_info_GFp_nistz256_point_add: .byte 9,0,0,0 .rva full_handler .rva .Lpoint_addq_body,.Lpoint_addq_epilogue # HandlerData[] .long 32*18+56,0 .LSEH_info_GFp_nistz256_point_add_affine: .byte 9,0,0,0 .rva full_handler .rva .Ladd_affineq_body,.Ladd_affineq_epilogue # HandlerData[] .long 32*15+56,0 ___ $code.=<<___ if ($addx); .align 8 .LSEH_info_GFp_nistz256_point_doublex: .byte 9,0,0,0 .rva full_handler .rva .Lpoint_doublex_body,.Lpoint_doublex_epilogue # HandlerData[] .long 32*5+56,0 .LSEH_info_GFp_nistz256_point_addx: .byte 9,0,0,0 .rva full_handler .rva .Lpoint_addx_body,.Lpoint_addx_epilogue # HandlerData[] .long 32*18+56,0 .LSEH_info_GFp_nistz256_point_add_affinex: .byte 9,0,0,0 .rva full_handler .rva .Ladd_affinex_body,.Ladd_affinex_epilogue # HandlerData[] .long 32*15+56,0 ___ } $code =~ s/\`([^\`]*)\`/eval $1/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz.c000064400000000000000000000041511353036607100171610ustar0000000000000000/* Copyright (c) 2014, Intel Corporation. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "ecp_nistz.h" #if defined(__GNUC__) #pragma GCC diagnostic ignored "-Wconversion" #endif /* Fills |str| with the bytewise little-endian encoding of |scalar|, where * |scalar| has |num_limbs| limbs. |str| is padded with zeros at the end up * to |str_len| bytes. Actually, |str_len| must be exactly one byte more than * needed to encode |num_limbs| losslessly, so that there is an extra byte at * the end. The extra byte is useful because the caller will be breaking |str| * up into windows of a number of bits (5 or 7) that isn't divisible by 8, and * so it is useful for it to be able to read an extra zero byte. */ void gfp_little_endian_bytes_from_scalar(uint8_t str[], size_t str_len, const Limb scalar[], size_t num_limbs) { ASSERT(str_len == (num_limbs * sizeof(Limb)) + 1); size_t i; for (i = 0; i < num_limbs * sizeof(Limb); i += sizeof(Limb)) { Limb d = scalar[i / sizeof(Limb)]; str[i + 0] = d & 0xff; str[i + 1] = (d >> 8) & 0xff; str[i + 2] = (d >> 16) & 0xff; str[i + 3] = (d >>= 24) & 0xff; if (sizeof(Limb) == 8) { d >>= 8; str[i + 4] = d & 0xff; str[i + 5] = (d >> 8) & 0xff; str[i + 6] = (d >> 16) & 0xff; str[i + 7] = (d >> 24) & 0xff; } } for (; i < str_len; i++) { str[i] = 0; } } ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz.h000064400000000000000000000274701353036607100171770ustar0000000000000000/* Copyright (c) 2015, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef OPENSSL_HEADER_EC_ECP_NISTZ_H #define OPENSSL_HEADER_EC_ECP_NISTZ_H #include #include "../../limbs/limbs.h" #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #endif // This function looks at `w + 1` scalar bits (`w` current, 1 adjacent less // significant bit), and recodes them into a signed digit for use in fast point // multiplication: the use of signed rather than unsigned digits means that // fewer points need to be precomputed, given that point inversion is easy (a // precomputed point dP makes -dP available as well). // // BACKGROUND: // // Signed digits for multiplication were introduced by Booth ("A signed binary // multiplication technique", Quart. Journ. Mech. and Applied Math., vol. IV, // pt. 2 (1951), pp. 236-240), in that case for multiplication of integers. // Booth's original encoding did not generally improve the density of nonzero // digits over the binary representation, and was merely meant to simplify the // handling of signed factors given in two's complement; but it has since been // shown to be the basis of various signed-digit representations that do have // further advantages, including the wNAF, using the following general // approach: // // (1) Given a binary representation // // b_k ... b_2 b_1 b_0, // // of a nonnegative integer (b_k in {0, 1}), rewrite it in digits 0, 1, -1 // by using bit-wise subtraction as follows: // // b_k b_(k-1) ... b_2 b_1 b_0 // - b_k ... b_3 b_2 b_1 b_0 // ----------------------------------------- // s_(k+1) s_k ... s_3 s_2 s_1 s_0 // // A left-shift followed by subtraction of the original value yields a new // representation of the same value, using signed bits s_i = b_(i-1) - b_i. // This representation from Booth's paper has since appeared in the // literature under a variety of different names including "reversed binary // form", "alternating greedy expansion", "mutual opposite form", and // "sign-alternating {+-1}-representation". // // An interesting property is that among the nonzero bits, values 1 and -1 // strictly alternate. // // (2) Various window schemes can be applied to the Booth representation of // integers: for example, right-to-left sliding windows yield the wNAF // (a signed-digit encoding independently discovered by various researchers // in the 1990s), and left-to-right sliding windows yield a left-to-right // equivalent of the wNAF (independently discovered by various researchers // around 2004). // // To prevent leaking information through side channels in point multiplication, // we need to recode the given integer into a regular pattern: sliding windows // as in wNAFs won't do, we need their fixed-window equivalent -- which is a few // decades older: we'll be using the so-called "modified Booth encoding" due to // MacSorley ("High-speed arithmetic in binary computers", Proc. IRE, vol. 49 // (1961), pp. 67-91), in a radix-2**w setting. That is, we always combine `w` // signed bits into a signed digit, e.g. (for `w == 5`): // // s_(5j + 4) s_(5j + 3) s_(5j + 2) s_(5j + 1) s_(5j) // // The sign-alternating property implies that the resulting digit values are // integers from `-2**(w-1)` to `2**(w-1)`, e.g. -16 to 16 for `w == 5`. // // Of course, we don't actually need to compute the signed digits s_i as an // intermediate step (that's just a nice way to see how this scheme relates // to the wNAF): a direct computation obtains the recoded digit from the // six bits b_(5j + 4) ... b_(5j - 1). // // This function takes those `w` bits as an integer (e.g. 0 .. 63), writing the // recoded digit to *sign (0 for positive, 1 for negative) and *digit (absolute // value, in the range 0 .. 2**(w-1). Note that this integer essentially provides // the input bits "shifted to the left" by one position: for example, the input // to compute the least significant recoded digit, given that there's no bit // b_-1, has to be b_4 b_3 b_2 b_1 b_0 0. // // DOUBLING CASE: // // Point addition formulas for short Weierstrass curves are often incomplete. // Edge cases such as P + P or P + ∞ must be handled separately. This // complicates constant-time requirements. P + ∞ cannot be avoided (any window // may be zero) and is handled with constant-time selects. P + P (where P is not // ∞) usually is not. Instead, windowing strategies are chosen to avoid this // case. Whether this happens depends on the group order. // // Let w be the window width (in this function, w = 5). The non-trivial doubling // case in single-point scalar multiplication may occur if and only if the // 2^(w-1) bit of the group order is zero. // // Note the above only holds if the scalar is fully reduced and the group order // is a prime that is much larger than 2^w. It also only holds when windows // are applied from most significant to least significant, doubling between each // window. It does not apply to more complex table strategies such as // |EC_GFp_nistz256_method|. // // PROOF: // // Let n be the group order. Let l be the number of bits needed to represent n. // Assume there exists some 0 <= k < n such that signed w-bit windowed // multiplication hits the doubling case. // // Windowed multiplication consists of iterating over groups of s_i (defined // above based on k's binary representation) from most to least significant. At // iteration i (for i = ..., 3w, 2w, w, 0, starting from the most significant // window), we: // // 1. Double the accumulator A, w times. Let A_i be the value of A at this // point. // // 2. Set A to T_i + A_i, where T_i is a precomputed multiple of P // corresponding to the window s_(i+w-1) ... s_i. // // Let j be the index such that A_j = T_j ≠ ∞. Looking at A_i and T_i as // multiples of P, define a_i and t_i to be scalar coefficients of A_i and T_i. // Thus a_j = t_j ≠ 0 (mod n). Note a_i and t_i may not be reduced mod n. t_i is // the value of the w signed bits s_(i+w-1) ... s_i. a_i is computed as a_i = // 2^w * (a_(i+w) + t_(i+w)). // // t_i is bounded by -2^(w-1) <= t_i <= 2^(w-1). Additionally, we may write it // in terms of unsigned bits b_i. t_i consists of signed bits s_(i+w-1) ... s_i. // This is computed as: // // b_(i+w-2) b_(i+w-3) ... b_i b_(i-1) // - b_(i+w-1) b_(i+w-2) ... b_(i+1) b_i // -------------------------------------------- // t_i = s_(i+w-1) s_(i+w-2) ... s_(i+1) s_i // // Observe that b_(i+w-2) through b_i occur in both terms. Let x be the integer // represented by that bit string, i.e. 2^(w-2)*b_(i+w-2) + ... + b_i. // // t_i = (2*x + b_(i-1)) - (2^(w-1)*b_(i+w-1) + x) // = x - 2^(w-1)*b_(i+w-1) + b_(i-1) // // Or, using C notation for bit operations: // // t_i = (k>>i) & ((1<<(w-1)) - 1) - (k>>i) & (1<<(w-1)) + (k>>(i-1)) & 1 // // Note b_(i-1) is added in left-shifted by one (or doubled) from its place. // This is compensated by t_(i-w)'s subtraction term. Thus, a_i may be computed // by adding b_l b_(l-1) ... b_(i+1) b_i and an extra copy of b_(i-1). In C // notation, this is: // // a_i = (k>>(i+w)) << w + ((k>>(i+w-1)) & 1) << w // // Observe that, while t_i may be positive or negative, a_i is bounded by // 0 <= a_i < n + 2^w. Additionally, a_i can only be zero if b_(i+w-1) and up // are all zero. (Note this implies a non-trivial P + (-P) is unreachable for // all groups. That would imply the subsequent a_i is zero, which means all // terms thus far were zero.) // // Returning to our doubling position, we have a_j = t_j (mod n). We now // determine the value of a_j - t_j, which must be divisible by n. Our bounds on // a_j and t_j imply a_j - t_j is 0 or n. If it is 0, a_j = t_j. However, 2^w // divides a_j and -2^(w-1) <= t_j <= 2^(w-1), so this can only happen if // a_j = t_j = 0, which is a trivial doubling. Therefore, a_j - t_j = n. // // Now we determine j. Suppose j > 0. w divides j, so j >= w. Then, // // n = a_j - t_j = (k>>(j+w)) << w + ((k>>(j+w-1)) & 1) << w - t_j // <= k/2^j + 2^w - t_j // < n/2^w + 2^w + 2^(w-1) // // n is much larger than 2^w, so this is impossible. Thus, j = 0: only the final // addition may hit the doubling case. // // Finally, we consider bit patterns for n and k. Divide k into k_H + k_M + k_L // such that k_H is the contribution from b_(l-1) .. b_w, k_M is the // contribution from b_(w-1), and k_L is the contribution from b_(w-2) ... b_0. // That is: // // - 2^w divides k_H // - k_M is 0 or 2^(w-1) // - 0 <= k_L < 2^(w-1) // // Divide n into n_H + n_M + n_L similarly. We thus have: // // t_0 = (k>>0) & ((1<<(w-1)) - 1) - (k>>0) & (1<<(w-1)) + (k>>(0-1)) & 1 // = k & ((1<<(w-1)) - 1) - k & (1<<(w-1)) // = k_L - k_M // // a_0 = (k>>(0+w)) << w + ((k>>(0+w-1)) & 1) << w // = (k>>w) << w + ((k>>(w-1)) & 1) << w // = k_H + 2*k_M // // n = a_0 - t_0 // n_H + n_M + n_L = (k_H + 2*k_M) - (k_L - k_M) // = k_H + 3*k_M - k_L // // k_H - k_L < k and k < n, so k_H - k_L ≠ n. Therefore k_M is not 0 and must be // 2^(w-1). Now we consider k_H and n_H. We know k_H <= n_H. Suppose k_H = n_H. // Then, // // n_M + n_L = 3*(2^(w-1)) - k_L // > 3*(2^(w-1)) - 2^(w-1) // = 2^w // // Contradiction (n_M + n_L is the bottom w bits of n). Thus k_H < n_H. Suppose // k_H < n_H - 2*2^w. Then, // // n_H + n_M + n_L = k_H + 3*(2^(w-1)) - k_L // < n_H - 2*2^w + 3*(2^(w-1)) - k_L // n_M + n_L < -2^(w-1) - k_L // // Contradiction. Thus, k_H = n_H - 2^w. (Note 2^w divides n_H and k_H.) Thus, // // n_H + n_M + n_L = k_H + 3*(2^(w-1)) - k_L // = n_H - 2^w + 3*(2^(w-1)) - k_L // n_M + n_L = 2^(w-1) - k_L // <= 2^(w-1) // // Equality would mean 2^(w-1) divides n, which is impossible if n is prime. // Thus n_M + n_L < 2^(w-1), so n_M is zero, proving our condition. // // This proof constructs k, so, to show the converse, let k_H = n_H - 2^w, // k_M = 2^(w-1), k_L = 2^(w-1) - n_L. This will result in a non-trivial point // doubling in the final addition and is the only such scalar. // // COMMON CURVES: // // The group orders for common curves end in the following bit patterns: // // P-521: ...00001001; w = 4 is okay // P-384: ...01110011; w = 2, 5, 6, 7 are okay // P-256: ...01010001; w = 5, 7 are okay // P-224: ...00111101; w = 3, 4, 5, 6 are okay static inline void booth_recode(Limb *is_negative, unsigned *digit, unsigned in, unsigned w) { ASSERT(w >= 2); ASSERT(w <= 7); // Set all bits of `s` to MSB(in), similar to |constant_time_msb_s|, // but 'in' seen as (`w+1`)-bit value. Limb s = ~((in >> w) - 1); unsigned d; d = (1 << (w + 1)) - in - 1; d = (d & s) | (in & ~s); d = (d >> 1) + (d & 1); *is_negative = constant_time_is_nonzero_w(s & 1); *digit = d; } #if defined(__GNUC__) #pragma GCC diagnostic pop #endif void gfp_little_endian_bytes_from_scalar(uint8_t str[], size_t str_len, const Limb scalar[], size_t num_limbs); #endif // OPENSSL_HEADER_EC_ECP_NISTZ_H ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz256.c000064400000000000000000000266451353036607100174320ustar0000000000000000/* Copyright (c) 2014, Intel Corporation. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Developers and authors: * Shay Gueron (1, 2), and Vlad Krasnov (1) * (1) Intel Corporation, Israel Development Center * (2) University of Haifa * Reference: * Shay Gueron and Vlad Krasnov * "Fast Prime Field Elliptic Curve Cryptography with 256 Bit Primes" * http://eprint.iacr.org/2013/816 */ #include "ecp_nistz256.h" #include "ecp_nistz.h" #include "../bn/internal.h" #include "../../limbs/limbs.inl" #if defined(__GNUC__) #pragma GCC diagnostic ignored "-Wsign-conversion" #endif /* Functions implemented in assembly */ /* Modular neg: res = -a mod P */ void GFp_nistz256_neg(Limb res[P256_LIMBS], const Limb a[P256_LIMBS]); /* One converted into the Montgomery domain */ static const Limb ONE[P256_LIMBS] = { TOBN(0x00000000, 0x00000001), TOBN(0xffffffff, 0x00000000), TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0xfffffffe), }; /* Precomputed tables for the default generator */ #include "ecp_nistz256_table.inl" /* This assumes that |x| and |y| have been each been reduced to their minimal * unique representations. */ static Limb is_infinity(const Limb x[P256_LIMBS], const Limb y[P256_LIMBS]) { Limb acc = 0; for (size_t i = 0; i < P256_LIMBS; ++i) { acc |= x[i] | y[i]; } return constant_time_is_zero_w(acc); } static void copy_conditional(Limb dst[P256_LIMBS], const Limb src[P256_LIMBS], Limb move) { Limb mask1 = move; Limb mask2 = ~mask1; dst[0] = (src[0] & mask1) ^ (dst[0] & mask2); dst[1] = (src[1] & mask1) ^ (dst[1] & mask2); dst[2] = (src[2] & mask1) ^ (dst[2] & mask2); dst[3] = (src[3] & mask1) ^ (dst[3] & mask2); if (P256_LIMBS == 8) { dst[4] = (src[4] & mask1) ^ (dst[4] & mask2); dst[5] = (src[5] & mask1) ^ (dst[5] & mask2); dst[6] = (src[6] & mask1) ^ (dst[6] & mask2); dst[7] = (src[7] & mask1) ^ (dst[7] & mask2); } } void GFp_nistz256_point_double(P256_POINT *r, const P256_POINT *a); void GFp_nistz256_point_add_affine(P256_POINT *r, const P256_POINT *a, const P256_POINT_AFFINE *b); #if defined(OPENSSL_X86_64) void GFp_nistz256_point_add(P256_POINT *r, const P256_POINT *a, const P256_POINT *b); #else static const BN_ULONG Q[P256_LIMBS] = { TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0xffffffff), TOBN(0x00000000, 0x00000000), TOBN(0xffffffff, 0x00000001), }; static inline Limb is_equal(const Limb a[P256_LIMBS], const Limb b[P256_LIMBS]) { return LIMBS_equal(a, b, P256_LIMBS); } static inline Limb is_zero(const BN_ULONG a[P256_LIMBS]) { return LIMBS_are_zero(a, P256_LIMBS); } static inline void elem_mul_by_2(Limb r[P256_LIMBS], const Limb a[P256_LIMBS]) { LIMBS_shl_mod(r, a, Q, P256_LIMBS); } static inline void elem_mul_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS], const Limb b[P256_LIMBS]) { GFp_nistz256_mul_mont(r, a, b); } static inline void elem_sqr_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS]) { GFp_nistz256_sqr_mont(r, a); } static inline void elem_sub(Limb r[P256_LIMBS], const Limb a[P256_LIMBS], const Limb b[P256_LIMBS]) { LIMBS_sub_mod(r, a, b, Q, P256_LIMBS); } /* Point addition: r = a+b */ void GFp_nistz256_point_add(P256_POINT *r, const P256_POINT *a, const P256_POINT *b) { BN_ULONG U2[P256_LIMBS], S2[P256_LIMBS]; BN_ULONG U1[P256_LIMBS], S1[P256_LIMBS]; BN_ULONG Z1sqr[P256_LIMBS]; BN_ULONG Z2sqr[P256_LIMBS]; BN_ULONG H[P256_LIMBS], R[P256_LIMBS]; BN_ULONG Hsqr[P256_LIMBS]; BN_ULONG Rsqr[P256_LIMBS]; BN_ULONG Hcub[P256_LIMBS]; BN_ULONG res_x[P256_LIMBS]; BN_ULONG res_y[P256_LIMBS]; BN_ULONG res_z[P256_LIMBS]; const BN_ULONG *in1_x = a->X; const BN_ULONG *in1_y = a->Y; const BN_ULONG *in1_z = a->Z; const BN_ULONG *in2_x = b->X; const BN_ULONG *in2_y = b->Y; const BN_ULONG *in2_z = b->Z; BN_ULONG in1infty = is_zero(a->Z); BN_ULONG in2infty = is_zero(b->Z); elem_sqr_mont(Z2sqr, in2_z); /* Z2^2 */ elem_sqr_mont(Z1sqr, in1_z); /* Z1^2 */ elem_mul_mont(S1, Z2sqr, in2_z); /* S1 = Z2^3 */ elem_mul_mont(S2, Z1sqr, in1_z); /* S2 = Z1^3 */ elem_mul_mont(S1, S1, in1_y); /* S1 = Y1*Z2^3 */ elem_mul_mont(S2, S2, in2_y); /* S2 = Y2*Z1^3 */ elem_sub(R, S2, S1); /* R = S2 - S1 */ elem_mul_mont(U1, in1_x, Z2sqr); /* U1 = X1*Z2^2 */ elem_mul_mont(U2, in2_x, Z1sqr); /* U2 = X2*Z1^2 */ elem_sub(H, U2, U1); /* H = U2 - U1 */ BN_ULONG is_exceptional = is_equal(U1, U2) & ~in1infty & ~in2infty; if (is_exceptional) { if (is_equal(S1, S2)) { GFp_nistz256_point_double(r, a); } else { limbs_zero(r->X, P256_LIMBS); limbs_zero(r->Y, P256_LIMBS); limbs_zero(r->Z, P256_LIMBS); } return; } elem_sqr_mont(Rsqr, R); /* R^2 */ elem_mul_mont(res_z, H, in1_z); /* Z3 = H*Z1*Z2 */ elem_sqr_mont(Hsqr, H); /* H^2 */ elem_mul_mont(res_z, res_z, in2_z); /* Z3 = H*Z1*Z2 */ elem_mul_mont(Hcub, Hsqr, H); /* H^3 */ elem_mul_mont(U2, U1, Hsqr); /* U1*H^2 */ elem_mul_by_2(Hsqr, U2); /* 2*U1*H^2 */ elem_sub(res_x, Rsqr, Hsqr); elem_sub(res_x, res_x, Hcub); elem_sub(res_y, U2, res_x); elem_mul_mont(S2, S1, Hcub); elem_mul_mont(res_y, R, res_y); elem_sub(res_y, res_y, S2); copy_conditional(res_x, in2_x, in1infty); copy_conditional(res_y, in2_y, in1infty); copy_conditional(res_z, in2_z, in1infty); copy_conditional(res_x, in1_x, in2infty); copy_conditional(res_y, in1_y, in2infty); copy_conditional(res_z, in1_z, in2infty); limbs_copy(r->X, res_x, P256_LIMBS); limbs_copy(r->Y, res_y, P256_LIMBS); limbs_copy(r->Z, res_z, P256_LIMBS); } #endif /* r = p * p_scalar */ void GFp_nistz256_point_mul(P256_POINT *r, const Limb p_scalar[P256_LIMBS], const Limb p_x[P256_LIMBS], const Limb p_y[P256_LIMBS]) { static const unsigned kWindowSize = 5; static const unsigned kMask = (1 << (5 /* kWindowSize */ + 1)) - 1; uint8_t p_str[(P256_LIMBS * sizeof(Limb)) + 1]; gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), p_scalar, P256_LIMBS); /* A |P256_POINT| is (3 * 32) = 96 bytes, and the 64-byte alignment should * add no more than 63 bytes of overhead. Thus, |table| should require * ~1599 ((96 * 16) + 63) bytes of stack space. */ alignas(64) P256_POINT table[16]; /* table[0] is implicitly (0,0,0) (the point at infinity), therefore it is * not stored. All other values are actually stored with an offset of -1 in * table. */ P256_POINT *row = table; limbs_copy(row[1 - 1].X, p_x, P256_LIMBS); limbs_copy(row[1 - 1].Y, p_y, P256_LIMBS); limbs_copy(row[1 - 1].Z, ONE, P256_LIMBS); GFp_nistz256_point_double(&row[2 - 1], &row[1 - 1]); GFp_nistz256_point_add(&row[3 - 1], &row[2 - 1], &row[1 - 1]); GFp_nistz256_point_double(&row[4 - 1], &row[2 - 1]); GFp_nistz256_point_double(&row[6 - 1], &row[3 - 1]); GFp_nistz256_point_double(&row[8 - 1], &row[4 - 1]); GFp_nistz256_point_double(&row[12 - 1], &row[6 - 1]); GFp_nistz256_point_add(&row[5 - 1], &row[4 - 1], &row[1 - 1]); GFp_nistz256_point_add(&row[7 - 1], &row[6 - 1], &row[1 - 1]); GFp_nistz256_point_add(&row[9 - 1], &row[8 - 1], &row[1 - 1]); GFp_nistz256_point_add(&row[13 - 1], &row[12 - 1], &row[1 - 1]); GFp_nistz256_point_double(&row[14 - 1], &row[7 - 1]); GFp_nistz256_point_double(&row[10 - 1], &row[5 - 1]); GFp_nistz256_point_add(&row[15 - 1], &row[14 - 1], &row[1 - 1]); GFp_nistz256_point_add(&row[11 - 1], &row[10 - 1], &row[1 - 1]); GFp_nistz256_point_double(&row[16 - 1], &row[8 - 1]); Limb tmp[P256_LIMBS]; alignas(32) P256_POINT h; static const unsigned START_INDEX = 256 - 1; unsigned index = START_INDEX; unsigned raw_wvalue; Limb recoded_is_negative; unsigned recoded; raw_wvalue = p_str[(index - 1) / 8]; raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); ASSERT(!recoded_is_negative); GFp_nistz256_select_w5(r, table, recoded); while (index >= kWindowSize) { if (index != START_INDEX) { unsigned off = (index - 1) / 8; raw_wvalue = p_str[off] | p_str[off + 1] << 8; raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); GFp_nistz256_select_w5(&h, table, recoded); GFp_nistz256_neg(tmp, h.Y); copy_conditional(h.Y, tmp, recoded_is_negative); GFp_nistz256_point_add(r, r, &h); } index -= kWindowSize; GFp_nistz256_point_double(r, r); GFp_nistz256_point_double(r, r); GFp_nistz256_point_double(r, r); GFp_nistz256_point_double(r, r); GFp_nistz256_point_double(r, r); } /* Final window */ raw_wvalue = p_str[0]; raw_wvalue = (raw_wvalue << 1) & kMask; booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); GFp_nistz256_select_w5(&h, table, recoded); GFp_nistz256_neg(tmp, h.Y); copy_conditional(h.Y, tmp, recoded_is_negative); GFp_nistz256_point_add(r, r, &h); } static const unsigned kWindowSize = 7; static inline void select_precomputed(P256_POINT_AFFINE *p, size_t i, unsigned raw_wvalue) { Limb recoded_is_negative; unsigned recoded; booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); GFp_nistz256_select_w7(p, GFp_nistz256_precomputed[i], recoded); Limb neg_y[P256_LIMBS]; GFp_nistz256_neg(neg_y, p->Y); copy_conditional(p->Y, neg_y, recoded_is_negative); } void GFp_nistz256_point_mul_base(P256_POINT *r, const Limb g_scalar[P256_LIMBS]) { static const unsigned kMask = (1 << (7 /* kWindowSize */ + 1)) - 1; uint8_t p_str[(P256_LIMBS * sizeof(Limb)) + 1]; gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), g_scalar, P256_LIMBS); /* First window */ unsigned index = kWindowSize; alignas(32) P256_POINT_AFFINE t; unsigned raw_wvalue = (p_str[0] << 1) & kMask; select_precomputed(&t, 0, raw_wvalue); alignas(32) P256_POINT p; limbs_copy(p.X, t.X, P256_LIMBS); limbs_copy(p.Y, t.Y, P256_LIMBS); limbs_copy(p.Z, ONE, P256_LIMBS); /* If it is at the point at infinity then p.p.X will be zero. */ copy_conditional(p.Z, p.X, is_infinity(p.X, p.Y)); for (size_t i = 1; i < 37; i++) { unsigned off = (index - 1) / 8; raw_wvalue = p_str[off] | p_str[off + 1] << 8; raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; index += kWindowSize; select_precomputed(&t, i, raw_wvalue); GFp_nistz256_point_add_affine(&p, &p, &t); } limbs_copy(r->X, p.X, P256_LIMBS); limbs_copy(r->Y, p.Y, P256_LIMBS); limbs_copy(r->Z, p.Z, P256_LIMBS); } ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz256.h000064400000000000000000000032701352416253600174270ustar0000000000000000/* Copyright (c) 2014, Intel Corporation. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef OPENSSL_HEADER_EC_ECP_NISTZ256_H #define OPENSSL_HEADER_EC_ECP_NISTZ256_H #include "../../limbs/limbs.h" #define P256_LIMBS (256u / LIMB_BITS) typedef struct { Limb X[P256_LIMBS]; Limb Y[P256_LIMBS]; Limb Z[P256_LIMBS]; } P256_POINT; typedef struct { Limb X[P256_LIMBS]; Limb Y[P256_LIMBS]; } P256_POINT_AFFINE; typedef Limb PRECOMP256_ROW[64 * 2 * P256_LIMBS]; // 64 (x, y) entries. void GFp_nistz256_mul_mont(Limb res[P256_LIMBS], const Limb a[P256_LIMBS], const Limb b[P256_LIMBS]); void GFp_nistz256_sqr_mont(Limb res[P256_LIMBS], const Limb a[P256_LIMBS]); /* Functions that perform constant time access to the precomputed tables */ void GFp_nistz256_select_w5(P256_POINT *out, const P256_POINT table[16], int index); void GFp_nistz256_select_w7(P256_POINT_AFFINE *out, const PRECOMP256_ROW table, int index); #endif /* OPENSSL_HEADER_EC_ECP_NISTZ256_H */ ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz256_table.inl000064400000000000000000023777121352416253600211520ustar0000000000000000/* Copyright (c) 2015, Intel Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // This is the precomputed constant time access table for the code in // GFp_nistz256.c, for the default generator. The table consists of 37 // subtables, each subtable contains 64 affine points. The affine points are // encoded as eight uint64's, four for the x coordinate and four for the y. // Both values are in little-endian order. There are 37 tables because a // signed, 6-bit recoding of the scalar is used and ceil(256/(6 + 1)) = 37. // Within each table there are 64 values because the 6-bit recoding can take // 64 values, ignoring the sign bit, which is implemented by performing a // negation of the affine point when required. We would like to align it to 2MB // in order to increase the chances of using a large page but that appears to // lead to invalid ELF files being produced. // This file is generated by make_p256-x86_64-table.go. static const alignas(4096) PRECOMP256_ROW GFp_nistz256_precomputed[37] = { {TOBN(0x79e730d4, 0x18a9143c), TOBN(0x75ba95fc, 0x5fedb601), TOBN(0x79fb732b, 0x77622510), TOBN(0x18905f76, 0xa53755c6), TOBN(0xddf25357, 0xce95560a), TOBN(0x8b4ab8e4, 0xba19e45c), TOBN(0xd2e88688, 0xdd21f325), TOBN(0x8571ff18, 0x25885d85), TOBN(0x850046d4, 0x10ddd64d), TOBN(0xaa6ae3c1, 0xa433827d), TOBN(0x73220503, 0x8d1490d9), TOBN(0xf6bb32e4, 0x3dcf3a3b), TOBN(0x2f3648d3, 0x61bee1a5), TOBN(0x152cd7cb, 0xeb236ff8), TOBN(0x19a8fb0e, 0x92042dbe), TOBN(0x78c57751, 0x0a5b8a3b), TOBN(0xffac3f90, 0x4eebc127), TOBN(0xb027f84a, 0x087d81fb), TOBN(0x66ad77dd, 0x87cbbc98), TOBN(0x26936a3f, 0xb6ff747e), TOBN(0xb04c5c1f, 0xc983a7eb), TOBN(0x583e47ad, 0x0861fe1a), TOBN(0x78820831, 0x1a2ee98e), TOBN(0xd5f06a29, 0xe587cc07), TOBN(0x74b0b50d, 0x46918dcc), TOBN(0x4650a6ed, 0xc623c173), TOBN(0x0cdaacac, 0xe8100af2), TOBN(0x577362f5, 0x41b0176b), TOBN(0x2d96f24c, 0xe4cbaba6), TOBN(0x17628471, 0xfad6f447), TOBN(0x6b6c36de, 0xe5ddd22e), TOBN(0x84b14c39, 0x4c5ab863), TOBN(0xbe1b8aae, 0xc45c61f5), TOBN(0x90ec649a, 0x94b9537d), TOBN(0x941cb5aa, 0xd076c20c), TOBN(0xc9079605, 0x890523c8), TOBN(0xeb309b4a, 0xe7ba4f10), TOBN(0x73c568ef, 0xe5eb882b), TOBN(0x3540a987, 0x7e7a1f68), TOBN(0x73a076bb, 0x2dd1e916), TOBN(0x40394737, 0x3e77664a), TOBN(0x55ae744f, 0x346cee3e), TOBN(0xd50a961a, 0x5b17a3ad), TOBN(0x13074b59, 0x54213673), TOBN(0x93d36220, 0xd377e44b), TOBN(0x299c2b53, 0xadff14b5), TOBN(0xf424d44c, 0xef639f11), TOBN(0xa4c9916d, 0x4a07f75f), TOBN(0x0746354e, 0xa0173b4f), TOBN(0x2bd20213, 0xd23c00f7), TOBN(0xf43eaab5, 0x0c23bb08), TOBN(0x13ba5119, 0xc3123e03), TOBN(0x2847d030, 0x3f5b9d4d), TOBN(0x6742f2f2, 0x5da67bdd), TOBN(0xef933bdc, 0x77c94195), TOBN(0xeaedd915, 0x6e240867), TOBN(0x27f14cd1, 0x9499a78f), TOBN(0x462ab5c5, 0x6f9b3455), TOBN(0x8f90f02a, 0xf02cfc6b), TOBN(0xb763891e, 0xb265230d), TOBN(0xf59da3a9, 0x532d4977), TOBN(0x21e3327d, 0xcf9eba15), TOBN(0x123c7b84, 0xbe60bbf0), TOBN(0x56ec12f2, 0x7706df76), TOBN(0x75c96e8f, 0x264e20e8), TOBN(0xabe6bfed, 0x59a7a841), TOBN(0x2cc09c04, 0x44c8eb00), TOBN(0xe05b3080, 0xf0c4e16b), TOBN(0x1eb7777a, 0xa45f3314), TOBN(0x56af7bed, 0xce5d45e3), TOBN(0x2b6e019a, 0x88b12f1a), TOBN(0x086659cd, 0xfd835f9b), TOBN(0x2c18dbd1, 0x9dc21ec8), TOBN(0x98f9868a, 0x0fcf8139), TOBN(0x737d2cd6, 0x48250b49), TOBN(0xcc61c947, 0x24b3428f), TOBN(0x0c2b4078, 0x80dd9e76), TOBN(0xc43a8991, 0x383fbe08), TOBN(0x5f7d2d65, 0x779be5d2), TOBN(0x78719a54, 0xeb3b4ab5), TOBN(0xea7d260a, 0x6245e404), TOBN(0x9de40795, 0x6e7fdfe0), TOBN(0x1ff3a415, 0x8dac1ab5), TOBN(0x3e7090f1, 0x649c9073), TOBN(0x1a768561, 0x2b944e88), TOBN(0x250f939e, 0xe57f61c8), TOBN(0x0c0daa89, 0x1ead643d), TOBN(0x68930023, 0xe125b88e), TOBN(0x04b71aa7, 0xd2697768), TOBN(0xabdedef5, 0xca345a33), TOBN(0x2409d29d, 0xee37385e), TOBN(0x4ee1df77, 0xcb83e156), TOBN(0x0cac12d9, 0x1cbb5b43), TOBN(0x170ed2f6, 0xca895637), TOBN(0x28228cfa, 0x8ade6d66), TOBN(0x7ff57c95, 0x53238aca), TOBN(0xccc42563, 0x4b2ed709), TOBN(0x0e356769, 0x856fd30d), TOBN(0xbcbcd43f, 0x559e9811), TOBN(0x738477ac, 0x5395b759), TOBN(0x35752b90, 0xc00ee17f), TOBN(0x68748390, 0x742ed2e3), TOBN(0x7cd06422, 0xbd1f5bc1), TOBN(0xfbc08769, 0xc9e7b797), TOBN(0xa242a35b, 0xb0cf664a), TOBN(0x126e48f7, 0x7f9707e3), TOBN(0x1717bf54, 0xc6832660), TOBN(0xfaae7332, 0xfd12c72e), TOBN(0x27b52db7, 0x995d586b), TOBN(0xbe29569e, 0x832237c2), TOBN(0xe8e4193e, 0x2a65e7db), TOBN(0x152706dc, 0x2eaa1bbb), TOBN(0x72bcd8b7, 0xbc60055b), TOBN(0x03cc23ee, 0x56e27e4b), TOBN(0xee337424, 0xe4819370), TOBN(0xe2aa0e43, 0x0ad3da09), TOBN(0x40b8524f, 0x6383c45d), TOBN(0xd7663554, 0x42a41b25), TOBN(0x64efa6de, 0x778a4797), TOBN(0x2042170a, 0x7079adf4), TOBN(0x808b0b65, 0x0bc6fb80), TOBN(0x5882e075, 0x3ffe2e6b), TOBN(0xd5ef2f7c, 0x2c83f549), TOBN(0x54d63c80, 0x9103b723), TOBN(0xf2f11bd6, 0x52a23f9b), TOBN(0x3670c319, 0x4b0b6587), TOBN(0x55c4623b, 0xb1580e9e), TOBN(0x64edf7b2, 0x01efe220), TOBN(0x97091dcb, 0xd53c5c9d), TOBN(0xf17624b6, 0xac0a177b), TOBN(0xb0f13975, 0x2cfe2dff), TOBN(0xc1a35c0a, 0x6c7a574e), TOBN(0x227d3146, 0x93e79987), TOBN(0x0575bf30, 0xe89cb80e), TOBN(0x2f4e247f, 0x0d1883bb), TOBN(0xebd51226, 0x3274c3d0), TOBN(0x5f3e51c8, 0x56ada97a), TOBN(0x4afc964d, 0x8f8b403e), TOBN(0xa6f247ab, 0x412e2979), TOBN(0x675abd1b, 0x6f80ebda), TOBN(0x66a2bd72, 0x5e485a1d), TOBN(0x4b2a5caf, 0x8f4f0b3c), TOBN(0x2626927f, 0x1b847bba), TOBN(0x6c6fc7d9, 0x0502394d), TOBN(0xfea912ba, 0xa5659ae8), TOBN(0x68363aba, 0x25e1a16e), TOBN(0xb8842277, 0x752c41ac), TOBN(0xfe545c28, 0x2897c3fc), TOBN(0x2d36e9e7, 0xdc4c696b), TOBN(0x5806244a, 0xfba977c5), TOBN(0x85665e9b, 0xe39508c1), TOBN(0xf720ee25, 0x6d12597b), TOBN(0x8a979129, 0xd2337a31), TOBN(0x5916868f, 0x0f862bdc), TOBN(0x048099d9, 0x5dd283ba), TOBN(0xe2d1eeb6, 0xfe5bfb4e), TOBN(0x82ef1c41, 0x7884005d), TOBN(0xa2d4ec17, 0xffffcbae), TOBN(0x9161c53f, 0x8aa95e66), TOBN(0x5ee104e1, 0xc5fee0d0), TOBN(0x562e4cec, 0xc135b208), TOBN(0x74e1b265, 0x4783f47d), TOBN(0x6d2a506c, 0x5a3f3b30), TOBN(0xecead9f4, 0xc16762fc), TOBN(0xf29dd4b2, 0xe286e5b9), TOBN(0x1b0fadc0, 0x83bb3c61), TOBN(0x7a75023e, 0x7fac29a4), TOBN(0xc086d5f1, 0xc9477fa3), TOBN(0x0fc61135, 0x2f6f3076), TOBN(0xc99ffa23, 0xe3912a9a), TOBN(0x6a0b0685, 0xd2f8ba3d), TOBN(0xfdc777e8, 0xe93358a4), TOBN(0x94a787bb, 0x35415f04), TOBN(0x640c2d6a, 0x4d23fea4), TOBN(0x9de917da, 0x153a35b5), TOBN(0x793e8d07, 0x5d5cd074), TOBN(0xf4f87653, 0x2de45068), TOBN(0x37c7a7e8, 0x9e2e1f6e), TOBN(0xd0825fa2, 0xa3584069), TOBN(0xaf2cea7c, 0x1727bf42), TOBN(0x0360a4fb, 0x9e4785a9), TOBN(0xe5fda49c, 0x27299f4a), TOBN(0x48068e13, 0x71ac2f71), TOBN(0x83d0687b, 0x9077666f), TOBN(0x6d3883b2, 0x15d02819), TOBN(0x6d0d7550, 0x40dd9a35), TOBN(0x61d7cbf9, 0x1d2b469f), TOBN(0xf97b232f, 0x2efc3115), TOBN(0xa551d750, 0xb24bcbc7), TOBN(0x11ea4949, 0x88a1e356), TOBN(0x7669f031, 0x93cb7501), TOBN(0x595dc55e, 0xca737b8a), TOBN(0xa4a319ac, 0xd837879f), TOBN(0x6fc1b49e, 0xed6b67b0), TOBN(0xe3959933, 0x32f1f3af), TOBN(0x966742eb, 0x65432a2e), TOBN(0x4b8dc9fe, 0xb4966228), TOBN(0x96cc6312, 0x43f43950), TOBN(0x12068859, 0xc9b731ee), TOBN(0x7b948dc3, 0x56f79968), TOBN(0x61e4ad32, 0xed1f8008), TOBN(0xe6c9267a, 0xd8b17538), TOBN(0x1ac7c5eb, 0x857ff6fb), TOBN(0x994baaa8, 0x55f2fb10), TOBN(0x84cf14e1, 0x1d248018), TOBN(0x5a39898b, 0x628ac508), TOBN(0x14fde97b, 0x5fa944f5), TOBN(0xed178030, 0xd12e5ac7), TOBN(0x042c2af4, 0x97e2feb4), TOBN(0xd36a42d7, 0xaebf7313), TOBN(0x49d2c9eb, 0x084ffdd7), TOBN(0x9f8aa54b, 0x2ef7c76a), TOBN(0x9200b7ba, 0x09895e70), TOBN(0x3bd0c66f, 0xddb7fb58), TOBN(0x2d97d108, 0x78eb4cbb), TOBN(0x2d431068, 0xd84bde31), TOBN(0x4b523eb7, 0x172ccd1f), TOBN(0x7323cb28, 0x30a6a892), TOBN(0x97082ec0, 0xcfe153eb), TOBN(0xe97f6b6a, 0xf2aadb97), TOBN(0x1d3d393e, 0xd1a83da1), TOBN(0xa6a7f9c7, 0x804b2a68), TOBN(0x4a688b48, 0x2d0cb71e), TOBN(0xa9b4cc5f, 0x40585278), TOBN(0x5e5db46a, 0xcb66e132), TOBN(0xf1be963a, 0x0d925880), TOBN(0x944a7027, 0x0317b9e2), TOBN(0xe266f959, 0x48603d48), TOBN(0x98db6673, 0x5c208899), TOBN(0x90472447, 0xa2fb18a3), TOBN(0x8a966939, 0x777c619f), TOBN(0x3798142a, 0x2a3be21b), TOBN(0xb4241cb1, 0x3298b343), TOBN(0xa3a14e49, 0xb44f65a1), TOBN(0xc5f4d6cd, 0x3ac77acd), TOBN(0xd0288cb5, 0x52b6fc3c), TOBN(0xd5cc8c2f, 0x1c040abc), TOBN(0xb675511e, 0x06bf9b4a), TOBN(0xd667da37, 0x9b3aa441), TOBN(0x460d45ce, 0x51601f72), TOBN(0xe2f73c69, 0x6755ff89), TOBN(0xdd3cf7e7, 0x473017e6), TOBN(0x8ef5689d, 0x3cf7600d), TOBN(0x948dc4f8, 0xb1fc87b4), TOBN(0xd9e9fe81, 0x4ea53299), TOBN(0x2d921ca2, 0x98eb6028), TOBN(0xfaecedfd, 0x0c9803fc), TOBN(0xf38ae891, 0x4d7b4745), TOBN(0xd8c5fccf, 0xc5e3a3d8), TOBN(0xbefd904c, 0x4079dfbf), TOBN(0xbc6d6a58, 0xfead0197), TOBN(0x39227077, 0x695532a4), TOBN(0x09e23e6d, 0xdbef42f5), TOBN(0x7e449b64, 0x480a9908), TOBN(0x7b969c1a, 0xad9a2e40), TOBN(0x6231d792, 0x9591c2a4), TOBN(0x87151456, 0x0f664534), TOBN(0x85ceae7c, 0x4b68f103), TOBN(0xac09c4ae, 0x65578ab9), TOBN(0x33ec6868, 0xf044b10c), TOBN(0x6ac4832b, 0x3a8ec1f1), TOBN(0x5509d128, 0x5847d5ef), TOBN(0xf909604f, 0x763f1574), TOBN(0xb16c4303, 0xc32f63c4), TOBN(0xb6ab2014, 0x7ca23cd3), TOBN(0xcaa7a5c6, 0xa391849d), TOBN(0x5b0673a3, 0x75678d94), TOBN(0xc982ddd4, 0xdd303e64), TOBN(0xfd7b000b, 0x5db6f971), TOBN(0xbba2cb1f, 0x6f876f92), TOBN(0xc77332a3, 0x3c569426), TOBN(0xa159100c, 0x570d74f8), TOBN(0xfd16847f, 0xdec67ef5), TOBN(0x742ee464, 0x233e76b7), TOBN(0x0b8e4134, 0xefc2b4c8), TOBN(0xca640b86, 0x42a3e521), TOBN(0x653a0190, 0x8ceb6aa9), TOBN(0x313c300c, 0x547852d5), TOBN(0x24e4ab12, 0x6b237af7), TOBN(0x2ba90162, 0x8bb47af8), TOBN(0x3d5e58d6, 0xa8219bb7), TOBN(0xc691d0bd, 0x1b06c57f), TOBN(0x0ae4cb10, 0xd257576e), TOBN(0x3569656c, 0xd54a3dc3), TOBN(0xe5ebaebd, 0x94cda03a), TOBN(0x934e82d3, 0x162bfe13), TOBN(0x450ac0ba, 0xe251a0c6), TOBN(0x480b9e11, 0xdd6da526), TOBN(0x00467bc5, 0x8cce08b5), TOBN(0xb636458c, 0x7f178d55), TOBN(0xc5748bae, 0xa677d806), TOBN(0x2763a387, 0xdfa394eb), TOBN(0xa12b448a, 0x7d3cebb6), TOBN(0xe7adda3e, 0x6f20d850), TOBN(0xf63ebce5, 0x1558462c), TOBN(0x58b36143, 0x620088a8), TOBN(0x8a2cc3ca, 0x4d63c0ee), TOBN(0x51233117, 0x0fe948ce), TOBN(0x7463fd85, 0x222ef33b), TOBN(0xadf0c7dc, 0x7c603d6c), TOBN(0x0ec32d3b, 0xfe7765e5), TOBN(0xccaab359, 0xbf380409), TOBN(0xbdaa84d6, 0x8e59319c), TOBN(0xd9a4c280, 0x9c80c34d), TOBN(0xa9d89488, 0xa059c142), TOBN(0x6f5ae714, 0xff0b9346), TOBN(0x068f237d, 0x16fb3664), TOBN(0x5853e4c4, 0x363186ac), TOBN(0xe2d87d23, 0x63c52f98), TOBN(0x2ec4a766, 0x81828876), TOBN(0x47b864fa, 0xe14e7b1c), TOBN(0x0c0bc0e5, 0x69192408), TOBN(0xe4d7681d, 0xb82e9f3e), TOBN(0x83200f0b, 0xdf25e13c), TOBN(0x8909984c, 0x66f27280), TOBN(0x462d7b00, 0x75f73227), TOBN(0xd90ba188, 0xf2651798), TOBN(0x74c6e18c, 0x36ab1c34), TOBN(0xab256ea3, 0x5ef54359), TOBN(0x03466612, 0xd1aa702f), TOBN(0x624d6049, 0x2ed22e91), TOBN(0x6fdfe0b5, 0x6f072822), TOBN(0xeeca1115, 0x39ce2271), TOBN(0x98100a4f, 0xdb01614f), TOBN(0xb6b0daa2, 0xa35c628f), TOBN(0xb6f94d2e, 0xc87e9a47), TOBN(0xc6773259, 0x1d57d9ce), TOBN(0xf70bfeec, 0x03884a7b), TOBN(0x5fb35ccf, 0xed2bad01), TOBN(0xa155cbe3, 0x1da6a5c7), TOBN(0xc2e2594c, 0x30a92f8f), TOBN(0x649c89ce, 0x5bfafe43), TOBN(0xd158667d, 0xe9ff257a), TOBN(0x9b359611, 0xf32c50ae), TOBN(0x4b00b20b, 0x906014cf), TOBN(0xf3a8cfe3, 0x89bc7d3d), TOBN(0x4ff23ffd, 0x248a7d06), TOBN(0x80c5bfb4, 0x878873fa), TOBN(0xb7d9ad90, 0x05745981), TOBN(0x179c85db, 0x3db01994), TOBN(0xba41b062, 0x61a6966c), TOBN(0x4d82d052, 0xeadce5a8), TOBN(0x9e91cd3b, 0xa5e6a318), TOBN(0x47795f4f, 0x95b2dda0), TOBN(0xecfd7c1f, 0xd55a897c), TOBN(0x009194ab, 0xb29110fb), TOBN(0x5f0e2046, 0xe381d3b0), TOBN(0x5f3425f6, 0xa98dd291), TOBN(0xbfa06687, 0x730d50da), TOBN(0x0423446c, 0x4b083b7f), TOBN(0x397a247d, 0xd69d3417), TOBN(0xeb629f90, 0x387ba42a), TOBN(0x1ee426cc, 0xd5cd79bf), TOBN(0x0032940b, 0x946c6e18), TOBN(0x1b1e8ae0, 0x57477f58), TOBN(0xe94f7d34, 0x6d823278), TOBN(0xc747cb96, 0x782ba21a), TOBN(0xc5254469, 0xf72b33a5), TOBN(0x772ef6de, 0xc7f80c81), TOBN(0xd73acbfe, 0x2cd9e6b5), TOBN(0x4075b5b1, 0x49ee90d9), TOBN(0x785c339a, 0xa06e9eba), TOBN(0xa1030d5b, 0xabf825e0), TOBN(0xcec684c3, 0xa42931dc), TOBN(0x42ab62c9, 0xc1586e63), TOBN(0x45431d66, 0x5ab43f2b), TOBN(0x57c8b2c0, 0x55f7835d), TOBN(0x033da338, 0xc1b7f865), TOBN(0x283c7513, 0xcaa76097), TOBN(0x0a624fa9, 0x36c83906), TOBN(0x6b20afec, 0x715af2c7), TOBN(0x4b969974, 0xeba78bfd), TOBN(0x220755cc, 0xd921d60e), TOBN(0x9b944e10, 0x7baeca13), TOBN(0x04819d51, 0x5ded93d4), TOBN(0x9bbff86e, 0x6dddfd27), TOBN(0x6b344130, 0x77adc612), TOBN(0xa7496529, 0xbbd803a0), TOBN(0x1a1baaa7, 0x6d8805bd), TOBN(0xc8403902, 0x470343ad), TOBN(0x39f59f66, 0x175adff1), TOBN(0x0b26d7fb, 0xb7d8c5b7), TOBN(0xa875f5ce, 0x529d75e3), TOBN(0x85efc7e9, 0x41325cc2), TOBN(0x21950b42, 0x1ff6acd3), TOBN(0xffe70484, 0x53dc6909), TOBN(0xff4cd0b2, 0x28766127), TOBN(0xabdbe608, 0x4fb7db2b), TOBN(0x837c9228, 0x5e1109e8), TOBN(0x26147d27, 0xf4645b5a), TOBN(0x4d78f592, 0xf7818ed8), TOBN(0xd394077e, 0xf247fa36), TOBN(0x0fb9c2d0, 0x488c171a), TOBN(0xa78bfbaa, 0x13685278), TOBN(0xedfbe268, 0xd5b1fa6a), TOBN(0x0dceb8db, 0x2b7eaba7), TOBN(0xbf9e8089, 0x9ae2b710), TOBN(0xefde7ae6, 0xa4449c96), TOBN(0x43b7716b, 0xcc143a46), TOBN(0xd7d34194, 0xc3628c13), TOBN(0x508cec1c, 0x3b3f64c9), TOBN(0xe20bc0ba, 0x1e5edf3f), TOBN(0xda1deb85, 0x2f4318d4), TOBN(0xd20ebe0d, 0x5c3fa443), TOBN(0x370b4ea7, 0x73241ea3), TOBN(0x61f1511c, 0x5e1a5f65), TOBN(0x99a5e23d, 0x82681c62), TOBN(0xd731e383, 0xa2f54c2d), TOBN(0x2692f36e, 0x83445904), TOBN(0x2e0ec469, 0xaf45f9c0), TOBN(0x905a3201, 0xc67528b7), TOBN(0x88f77f34, 0xd0e5e542), TOBN(0xf67a8d29, 0x5864687c), TOBN(0x23b92eae, 0x22df3562), TOBN(0x5c27014b, 0x9bbec39e), TOBN(0x7ef2f226, 0x9c0f0f8d), TOBN(0x97359638, 0x546c4d8d), TOBN(0x5f9c3fc4, 0x92f24679), TOBN(0x912e8bed, 0xa8c8acd9), TOBN(0xec3a318d, 0x306634b0), TOBN(0x80167f41, 0xc31cb264), TOBN(0x3db82f6f, 0x522113f2), TOBN(0xb155bcd2, 0xdcafe197), TOBN(0xfba1da59, 0x43465283), TOBN(0xa0425b8e, 0xb212cf53), TOBN(0x4f2e512e, 0xf8557c5f), TOBN(0xc1286ff9, 0x25c4d56c), TOBN(0xbb8a0fea, 0xee26c851), TOBN(0xc28f70d2, 0xe7d6107e), TOBN(0x7ee0c444, 0xe76265aa), TOBN(0x3df277a4, 0x1d1936b1), TOBN(0x1a556e3f, 0xea9595eb), TOBN(0x258bbbf9, 0xe7305683), TOBN(0x31eea5bf, 0x07ef5be6), TOBN(0x0deb0e4a, 0x46c814c1), TOBN(0x5cee8449, 0xa7b730dd), TOBN(0xeab495c5, 0xa0182bde), TOBN(0xee759f87, 0x9e27a6b4), TOBN(0xc2cf6a68, 0x80e518ca), TOBN(0x25e8013f, 0xf14cf3f4), TOBN(0x8fc44140, 0x7e8d7a14), TOBN(0xbb1ff3ca, 0x9556f36a), TOBN(0x6a844385, 0x14600044), TOBN(0xba3f0c4a, 0x7451ae63), TOBN(0xdfcac25b, 0x1f9af32a), TOBN(0x01e0db86, 0xb1f2214b), TOBN(0x4e9a5bc2, 0xa4b596ac), TOBN(0x83927681, 0x026c2c08), TOBN(0x3ec832e7, 0x7acaca28), TOBN(0x1bfeea57, 0xc7385b29), TOBN(0x068212e3, 0xfd1eaf38), TOBN(0xc1329830, 0x6acf8ccc), TOBN(0xb909f2db, 0x2aac9e59), TOBN(0x5748060d, 0xb661782a), TOBN(0xc5ab2632, 0xc79b7a01), TOBN(0xda44c6c6, 0x00017626), TOBN(0xf26c00e8, 0xa7ea82f0), TOBN(0x99cac80d, 0xe4299aaf), TOBN(0xd66fe3b6, 0x7ed78be1), TOBN(0x305f725f, 0x648d02cd), TOBN(0x33ed1bc4, 0x623fb21b), TOBN(0xfa70533e, 0x7a6319ad), TOBN(0x17ab562d, 0xbe5ffb3e), TOBN(0x06374994, 0x56674741), TOBN(0x69d44ed6, 0x5c46aa8e), TOBN(0x2100d5d3, 0xa8d063d1), TOBN(0xcb9727ea, 0xa2d17c36), TOBN(0x4c2bab1b, 0x8add53b7), TOBN(0xa084e90c, 0x15426704), TOBN(0x778afcd3, 0xa837ebea), TOBN(0x6651f701, 0x7ce477f8), TOBN(0xa0624998, 0x46fb7a8b), TOBN(0xdc1e6828, 0xed8a6e19), TOBN(0x33fc2336, 0x4189d9c7), TOBN(0x026f8fe2, 0x671c39bc), TOBN(0xd40c4ccd, 0xbc6f9915), TOBN(0xafa135bb, 0xf80e75ca), TOBN(0x12c651a0, 0x22adff2c), TOBN(0xc40a04bd, 0x4f51ad96), TOBN(0x04820109, 0xbbe4e832), TOBN(0x3667eb1a, 0x7f4c04cc), TOBN(0x59556621, 0xa9404f84), TOBN(0x71cdf653, 0x7eceb50a), TOBN(0x994a44a6, 0x9b8335fa), TOBN(0xd7faf819, 0xdbeb9b69), TOBN(0x473c5680, 0xeed4350d), TOBN(0xb6658466, 0xda44bba2), TOBN(0x0d1bc780, 0x872bdbf3), TOBN(0xe535f175, 0xa1962f91), TOBN(0x6ed7e061, 0xed58f5a7), TOBN(0x177aa4c0, 0x2089a233), TOBN(0x0dbcb03a, 0xe539b413), TOBN(0xe3dc424e, 0xbb32e38e), TOBN(0x6472e5ef, 0x6806701e), TOBN(0xdd47ff98, 0x814be9ee), TOBN(0x6b60cfff, 0x35ace009), TOBN(0xb8d3d931, 0x9ff91fe5), TOBN(0x039c4800, 0xf0518eed), TOBN(0x95c37632, 0x9182cb26), TOBN(0x0763a434, 0x82fc568d), TOBN(0x707c04d5, 0x383e76ba), TOBN(0xac98b930, 0x824e8197), TOBN(0x92bf7c8f, 0x91230de0), TOBN(0x90876a01, 0x40959b70), TOBN(0xdb6d96f3, 0x05968b80), TOBN(0x380a0913, 0x089f73b9), TOBN(0x7da70b83, 0xc2c61e01), TOBN(0x95fb8394, 0x569b38c7), TOBN(0x9a3c6512, 0x80edfe2f), TOBN(0x8f726bb9, 0x8faeaf82), TOBN(0x8010a4a0, 0x78424bf8), TOBN(0x29672044, 0x0e844970)}, {TOBN(0x63c5cb81, 0x7a2ad62a), TOBN(0x7ef2b6b9, 0xac62ff54), TOBN(0x3749bba4, 0xb3ad9db5), TOBN(0xad311f2c, 0x46d5a617), TOBN(0xb77a8087, 0xc2ff3b6d), TOBN(0xb46feaf3, 0x367834ff), TOBN(0xf8aa266d, 0x75d6b138), TOBN(0xfa38d320, 0xec008188), TOBN(0x486d8ffa, 0x696946fc), TOBN(0x50fbc6d8, 0xb9cba56d), TOBN(0x7e3d423e, 0x90f35a15), TOBN(0x7c3da195, 0xc0dd962c), TOBN(0xe673fdb0, 0x3cfd5d8b), TOBN(0x0704b7c2, 0x889dfca5), TOBN(0xf6ce581f, 0xf52305aa), TOBN(0x399d49eb, 0x914d5e53), TOBN(0x380a496d, 0x6ec293cd), TOBN(0x733dbda7, 0x8e7051f5), TOBN(0x037e388d, 0xb849140a), TOBN(0xee4b32b0, 0x5946dbf6), TOBN(0xb1c4fda9, 0xcae368d1), TOBN(0x5001a7b0, 0xfdb0b2f3), TOBN(0x6df59374, 0x2e3ac46e), TOBN(0x4af675f2, 0x39b3e656), TOBN(0x44e38110, 0x39949296), TOBN(0x5b63827b, 0x361db1b5), TOBN(0x3e5323ed, 0x206eaff5), TOBN(0x942370d2, 0xc21f4290), TOBN(0xf2caaf2e, 0xe0d985a1), TOBN(0x192cc64b, 0x7239846d), TOBN(0x7c0b8f47, 0xae6312f8), TOBN(0x7dc61f91, 0x96620108), TOBN(0xb830fb5b, 0xc2da7de9), TOBN(0xd0e643df, 0x0ff8d3be), TOBN(0x31ee77ba, 0x188a9641), TOBN(0x4e8aa3aa, 0xbcf6d502), TOBN(0xf9fb6532, 0x9a49110f), TOBN(0xd18317f6, 0x2dd6b220), TOBN(0x7e3ced41, 0x52c3ea5a), TOBN(0x0d296a14, 0x7d579c4a), TOBN(0x35d6a53e, 0xed4c3717), TOBN(0x9f8240cf, 0x3d0ed2a3), TOBN(0x8c0d4d05, 0xe5543aa5), TOBN(0x45d5bbfb, 0xdd33b4b4), TOBN(0xfa04cc73, 0x137fd28e), TOBN(0x862ac6ef, 0xc73b3ffd), TOBN(0x403ff9f5, 0x31f51ef2), TOBN(0x34d5e0fc, 0xbc73f5a2), TOBN(0xf2526820, 0x08913f4f), TOBN(0xea20ed61, 0xeac93d95), TOBN(0x51ed38b4, 0x6ca6b26c), TOBN(0x8662dcbc, 0xea4327b0), TOBN(0x6daf295c, 0x725d2aaa), TOBN(0xbad2752f, 0x8e52dcda), TOBN(0x2210e721, 0x0b17dacc), TOBN(0xa37f7912, 0xd51e8232), TOBN(0x4f7081e1, 0x44cc3add), TOBN(0xd5ffa1d6, 0x87be82cf), TOBN(0x89890b6c, 0x0edd6472), TOBN(0xada26e1a, 0x3ed17863), TOBN(0x276f2715, 0x63483caa), TOBN(0xe6924cd9, 0x2f6077fd), TOBN(0x05a7fe98, 0x0a466e3c), TOBN(0xf1c794b0, 0xb1902d1f), TOBN(0xe5213688, 0x82a8042c), TOBN(0xd931cfaf, 0xcd278298), TOBN(0x069a0ae0, 0xf597a740), TOBN(0x0adbb3f3, 0xeb59107c), TOBN(0x983e951e, 0x5eaa8eb8), TOBN(0xe663a8b5, 0x11b48e78), TOBN(0x1631cc0d, 0x8a03f2c5), TOBN(0x7577c11e, 0x11e271e2), TOBN(0x33b2385c, 0x08369a90), TOBN(0x2990c59b, 0x190eb4f8), TOBN(0x819a6145, 0xc68eac80), TOBN(0x7a786d62, 0x2ec4a014), TOBN(0x33faadbe, 0x20ac3a8d), TOBN(0x31a21781, 0x5aba2d30), TOBN(0x209d2742, 0xdba4f565), TOBN(0xdb2ce9e3, 0x55aa0fbb), TOBN(0x8cef334b, 0x168984df), TOBN(0xe81dce17, 0x33879638), TOBN(0xf6e6949c, 0x263720f0), TOBN(0x5c56feaf, 0xf593cbec), TOBN(0x8bff5601, 0xfde58c84), TOBN(0x74e24117, 0x2eccb314), TOBN(0xbcf01b61, 0x4c9a8a78), TOBN(0xa233e35e, 0x544c9868), TOBN(0xb3156bf3, 0x8bd7aff1), TOBN(0x1b5ee4cb, 0x1d81b146), TOBN(0x7ba1ac41, 0xd628a915), TOBN(0x8f3a8f9c, 0xfd89699e), TOBN(0x7329b9c9, 0xa0748be7), TOBN(0x1d391c95, 0xa92e621f), TOBN(0xe51e6b21, 0x4d10a837), TOBN(0xd255f53a, 0x4947b435), TOBN(0x07669e04, 0xf1788ee3), TOBN(0xc14f27af, 0xa86938a2), TOBN(0x8b47a334, 0xe93a01c0), TOBN(0xff627438, 0xd9366808), TOBN(0x7a0985d8, 0xca2a5965), TOBN(0x3d9a5542, 0xd6e9b9b3), TOBN(0xc23eb80b, 0x4cf972e8), TOBN(0x5c1c33bb, 0x4fdf72fd), TOBN(0x0c4a58d4, 0x74a86108), TOBN(0xf8048a8f, 0xee4c5d90), TOBN(0xe3c7c924, 0xe86d4c80), TOBN(0x28c889de, 0x056a1e60), TOBN(0x57e2662e, 0xb214a040), TOBN(0xe8c48e98, 0x37e10347), TOBN(0x87742862, 0x80ac748a), TOBN(0xf1c24022, 0x186b06f2), TOBN(0xac2dd4c3, 0x5f74040a), TOBN(0x409aeb71, 0xfceac957), TOBN(0x4fbad782, 0x55c4ec23), TOBN(0xb359ed61, 0x8a7b76ec), TOBN(0x12744926, 0xed6f4a60), TOBN(0xe21e8d7f, 0x4b912de3), TOBN(0xe2575a59, 0xfc705a59), TOBN(0x72f1d4de, 0xed2dbc0e), TOBN(0x3d2b24b9, 0xeb7926b8), TOBN(0xbff88cb3, 0xcdbe5509), TOBN(0xd0f399af, 0xe4dd640b), TOBN(0x3c5fe130, 0x2f76ed45), TOBN(0x6f3562f4, 0x3764fb3d), TOBN(0x7b5af318, 0x3151b62d), TOBN(0xd5bd0bc7, 0xd79ce5f3), TOBN(0xfdaf6b20, 0xec66890f), TOBN(0x735c67ec, 0x6063540c), TOBN(0x50b259c2, 0xe5f9cb8f), TOBN(0xb8734f9a, 0x3f99c6ab), TOBN(0xf8cc13d5, 0xa3a7bc85), TOBN(0x80c1b305, 0xc5217659), TOBN(0xfe5364d4, 0x4ec12a54), TOBN(0xbd87045e, 0x681345fe), TOBN(0x7f8efeb1, 0x582f897f), TOBN(0xe8cbf1e5, 0xd5923359), TOBN(0xdb0cea9d, 0x539b9fb0), TOBN(0x0c5b34cf, 0x49859b98), TOBN(0x5e583c56, 0xa4403cc6), TOBN(0x11fc1a2d, 0xd48185b7), TOBN(0xc93fbc7e, 0x6e521787), TOBN(0x47e7a058, 0x05105b8b), TOBN(0x7b4d4d58, 0xdb8260c8), TOBN(0xe33930b0, 0x46eb842a), TOBN(0x8e844a9a, 0x7bdae56d), TOBN(0x34ef3a9e, 0x13f7fdfc), TOBN(0xb3768f82, 0x636ca176), TOBN(0x2821f4e0, 0x4e09e61c), TOBN(0x414dc3a1, 0xa0c7cddc), TOBN(0xd5379437, 0x54945fcd), TOBN(0x151b6eef, 0xb3555ff1), TOBN(0xb31bd613, 0x6339c083), TOBN(0x39ff8155, 0xdfb64701), TOBN(0x7c3388d2, 0xe29604ab), TOBN(0x1e19084b, 0xa6b10442), TOBN(0x17cf54c0, 0xeccd47ef), TOBN(0x89693385, 0x4a5dfb30), TOBN(0x69d023fb, 0x47daf9f6), TOBN(0x9222840b, 0x7d91d959), TOBN(0x439108f5, 0x803bac62), TOBN(0x0b7dd91d, 0x379bd45f), TOBN(0xd651e827, 0xca63c581), TOBN(0x5c5d75f6, 0x509c104f), TOBN(0x7d5fc738, 0x1f2dc308), TOBN(0x20faa7bf, 0xd98454be), TOBN(0x95374bee, 0xa517b031), TOBN(0xf036b9b1, 0x642692ac), TOBN(0xc5106109, 0x39842194), TOBN(0xb7e2353e, 0x49d05295), TOBN(0xfc8c1d5c, 0xefb42ee0), TOBN(0xe04884eb, 0x08ce811c), TOBN(0xf1f75d81, 0x7419f40e), TOBN(0x5b0ac162, 0xa995c241), TOBN(0x120921bb, 0xc4c55646), TOBN(0x713520c2, 0x8d33cf97), TOBN(0xb4a65a5c, 0xe98c5100), TOBN(0x6cec871d, 0x2ddd0f5a), TOBN(0x251f0b7f, 0x9ba2e78b), TOBN(0x224a8434, 0xce3a2a5f), TOBN(0x26827f61, 0x25f5c46f), TOBN(0x6a22bedc, 0x48545ec0), TOBN(0x25ae5fa0, 0xb1bb5cdc), TOBN(0xd693682f, 0xfcb9b98f), TOBN(0x32027fe8, 0x91e5d7d3), TOBN(0xf14b7d17, 0x73a07678), TOBN(0xf88497b3, 0xc0dfdd61), TOBN(0xf7c2eec0, 0x2a8c4f48), TOBN(0xaa5573f4, 0x3756e621), TOBN(0xc013a240, 0x1825b948), TOBN(0x1c03b345, 0x63878572), TOBN(0xa0472bea, 0x653a4184), TOBN(0xf4222e27, 0x0ac69a80), TOBN(0x34096d25, 0xf51e54f6), TOBN(0x00a648cb, 0x8fffa591), TOBN(0x4e87acdc, 0x69b6527f), TOBN(0x0575e037, 0xe285ccb4), TOBN(0x188089e4, 0x50ddcf52), TOBN(0xaa96c9a8, 0x870ff719), TOBN(0x74a56cd8, 0x1fc7e369), TOBN(0x41d04ee2, 0x1726931a), TOBN(0x0bbbb2c8, 0x3660ecfd), TOBN(0xa6ef6de5, 0x24818e18), TOBN(0xe421cc51, 0xe7d57887), TOBN(0xf127d208, 0xbea87be6), TOBN(0x16a475d3, 0xb1cdd682), TOBN(0x9db1b684, 0x439b63f7), TOBN(0x5359b3db, 0xf0f113b6), TOBN(0xdfccf1de, 0x8bf06e31), TOBN(0x1fdf8f44, 0xdd383901), TOBN(0x10775cad, 0x5017e7d2), TOBN(0xdfc3a597, 0x58d11eef), TOBN(0x6ec9c8a0, 0xb1ecff10), TOBN(0xee6ed6cc, 0x28400549), TOBN(0xb5ad7bae, 0x1b4f8d73), TOBN(0x61b4f11d, 0xe00aaab9), TOBN(0x7b32d69b, 0xd4eff2d7), TOBN(0x88ae6771, 0x4288b60f), TOBN(0x159461b4, 0x37a1e723), TOBN(0x1f3d4789, 0x570aae8c), TOBN(0x869118c0, 0x7f9871da), TOBN(0x35fbda78, 0xf635e278), TOBN(0x738f3641, 0xe1541dac), TOBN(0x6794b13a, 0xc0dae45f), TOBN(0x065064ac, 0x09cc0917), TOBN(0x27c53729, 0xc68540fd), TOBN(0x0d2d4c8e, 0xef227671), TOBN(0xd23a9f80, 0xa1785a04), TOBN(0x98c59528, 0x52650359), TOBN(0xfa09ad01, 0x74a1acad), TOBN(0x082d5a29, 0x0b55bf5c), TOBN(0xa40f1c67, 0x419b8084), TOBN(0x3a5c752e, 0xdcc18770), TOBN(0x4baf1f2f, 0x8825c3a5), TOBN(0xebd63f74, 0x21b153ed), TOBN(0xa2383e47, 0xb2f64723), TOBN(0xe7bf620a, 0x2646d19a), TOBN(0x56cb44ec, 0x03c83ffd), TOBN(0xaf7267c9, 0x4f6be9f1), TOBN(0x8b2dfd7b, 0xc06bb5e9), TOBN(0xb87072f2, 0xa672c5c7), TOBN(0xeacb11c8, 0x0d53c5e2), TOBN(0x22dac29d, 0xff435932), TOBN(0x37bdb99d, 0x4408693c), TOBN(0xf6e62fb6, 0x2899c20f), TOBN(0x3535d512, 0x447ece24), TOBN(0xfbdc6b88, 0xff577ce3), TOBN(0x726693bd, 0x190575f2), TOBN(0x6772b0e5, 0xab4b35a2), TOBN(0x1d8b6001, 0xf5eeaacf), TOBN(0x728f7ce4, 0x795b9580), TOBN(0x4a20ed2a, 0x41fb81da), TOBN(0x9f685cd4, 0x4fec01e6), TOBN(0x3ed7ddcc, 0xa7ff50ad), TOBN(0x460fd264, 0x0c2d97fd), TOBN(0x3a241426, 0xeb82f4f9), TOBN(0x17d1df2c, 0x6a8ea820), TOBN(0xb2b50d3b, 0xf22cc254), TOBN(0x03856cba, 0xb7291426), TOBN(0x87fd26ae, 0x04f5ee39), TOBN(0x9cb696cc, 0x02bee4ba), TOBN(0x53121804, 0x06820fd6), TOBN(0xa5dfc269, 0x0212e985), TOBN(0x666f7ffa, 0x160f9a09), TOBN(0xc503cd33, 0xbccd9617), TOBN(0x365dede4, 0xba7730a3), TOBN(0x798c6355, 0x5ddb0786), TOBN(0xa6c3200e, 0xfc9cd3bc), TOBN(0x060ffb2c, 0xe5e35efd), TOBN(0x99a4e25b, 0x5555a1c1), TOBN(0x11d95375, 0xf70b3751), TOBN(0x0a57354a, 0x160e1bf6), TOBN(0xecb3ae4b, 0xf8e4b065), TOBN(0x07a834c4, 0x2e53022b), TOBN(0x1cd300b3, 0x8692ed96), TOBN(0x16a6f792, 0x61ee14ec), TOBN(0x8f1063c6, 0x6a8649ed), TOBN(0xfbcdfcfe, 0x869f3e14), TOBN(0x2cfb97c1, 0x00a7b3ec), TOBN(0xcea49b3c, 0x7130c2f1), TOBN(0x462d044f, 0xe9d96488), TOBN(0x4b53d52e, 0x8182a0c1), TOBN(0x84b6ddd3, 0x0391e9e9), TOBN(0x80ab7b48, 0xb1741a09), TOBN(0xec0e15d4, 0x27d3317f), TOBN(0x8dfc1ddb, 0x1a64671e), TOBN(0x93cc5d5f, 0xd49c5b92), TOBN(0xc995d53d, 0x3674a331), TOBN(0x302e41ec, 0x090090ae), TOBN(0x2278a0cc, 0xedb06830), TOBN(0x1d025932, 0xfbc99690), TOBN(0x0c32fbd2, 0xb80d68da), TOBN(0xd79146da, 0xf341a6c1), TOBN(0xae0ba139, 0x1bef68a0), TOBN(0xc6b8a563, 0x8d774b3a), TOBN(0x1cf307bd, 0x880ba4d7), TOBN(0xc033bdc7, 0x19803511), TOBN(0xa9f97b3b, 0x8888c3be), TOBN(0x3d68aebc, 0x85c6d05e), TOBN(0xc3b88a9d, 0x193919eb), TOBN(0x2d300748, 0xc48b0ee3), TOBN(0x7506bc7c, 0x07a746c1), TOBN(0xfc48437c, 0x6e6d57f3), TOBN(0x5bd71587, 0xcfeaa91a), TOBN(0xa4ed0408, 0xc1bc5225), TOBN(0xd0b946db, 0x2719226d), TOBN(0x109ecd62, 0x758d2d43), TOBN(0x75c8485a, 0x2751759b), TOBN(0xb0b75f49, 0x9ce4177a), TOBN(0x4fa61a1e, 0x79c10c3d), TOBN(0xc062d300, 0xa167fcd7), TOBN(0x4df3874c, 0x750f0fa8), TOBN(0x29ae2cf9, 0x83dfedc9), TOBN(0xf8437134, 0x8d87631a), TOBN(0xaf571711, 0x7429c8d2), TOBN(0x18d15867, 0x146d9272), TOBN(0x83053ecf, 0x69769bb7), TOBN(0xc55eb856, 0xc479ab82), TOBN(0x5ef7791c, 0x21b0f4b2), TOBN(0xaa5956ba, 0x3d491525), TOBN(0x407a96c2, 0x9fe20eba), TOBN(0xf27168bb, 0xe52a5ad3), TOBN(0x43b60ab3, 0xbf1d9d89), TOBN(0xe45c51ef, 0x710e727a), TOBN(0xdfca5276, 0x099b4221), TOBN(0x8dc6407c, 0x2557a159), TOBN(0x0ead8335, 0x91035895), TOBN(0x0a9db957, 0x9c55dc32), TOBN(0xe40736d3, 0xdf61bc76), TOBN(0x13a619c0, 0x3f778cdb), TOBN(0x6dd921a4, 0xc56ea28f), TOBN(0x76a52433, 0x2fa647b4), TOBN(0x23591891, 0xac5bdc5d), TOBN(0xff4a1a72, 0xbac7dc01), TOBN(0x9905e261, 0x62df8453), TOBN(0x3ac045df, 0xe63b265f), TOBN(0x8a3f341b, 0xad53dba7), TOBN(0x8ec269cc, 0x837b625a), TOBN(0xd71a2782, 0x3ae31189), TOBN(0x8fb4f9a3, 0x55e96120), TOBN(0x804af823, 0xff9875cf), TOBN(0x23224f57, 0x5d442a9b), TOBN(0x1c4d3b9e, 0xecc62679), TOBN(0x91da22fb, 0xa0e7ddb1), TOBN(0xa370324d, 0x6c04a661), TOBN(0x9710d3b6, 0x5e376d17), TOBN(0xed8c98f0, 0x3044e357), TOBN(0xc364ebbe, 0x6422701c), TOBN(0x347f5d51, 0x7733d61c), TOBN(0xd55644b9, 0xcea826c3), TOBN(0x80c6e0ad, 0x55a25548), TOBN(0x0aa7641d, 0x844220a7), TOBN(0x1438ec81, 0x31810660), TOBN(0x9dfa6507, 0xde4b4043), TOBN(0x10b515d8, 0xcc3e0273), TOBN(0x1b6066dd, 0x28d8cfb2), TOBN(0xd3b04591, 0x9c9efebd), TOBN(0x425d4bdf, 0xa21c1ff4), TOBN(0x5fe5af19, 0xd57607d3), TOBN(0xbbf773f7, 0x54481084), TOBN(0x8435bd69, 0x94b03ed1), TOBN(0xd9ad1de3, 0x634cc546), TOBN(0x2cf423fc, 0x00e420ca), TOBN(0xeed26d80, 0xa03096dd), TOBN(0xd7f60be7, 0xa4db09d2), TOBN(0xf47f569d, 0x960622f7), TOBN(0xe5925fd7, 0x7296c729), TOBN(0xeff2db26, 0x26ca2715), TOBN(0xa6fcd014, 0xb913e759), TOBN(0x53da4786, 0x8ff4de93), TOBN(0x14616d79, 0xc32068e1), TOBN(0xb187d664, 0xccdf352e), TOBN(0xf7afb650, 0x1dc90b59), TOBN(0x8170e943, 0x7daa1b26), TOBN(0xc8e3bdd8, 0x700c0a84), TOBN(0x6e8d345f, 0x6482bdfa), TOBN(0x84cfbfa1, 0xc5c5ea50), TOBN(0xd3baf14c, 0x67960681), TOBN(0x26398403, 0x0dd50942), TOBN(0xe4b7839c, 0x4716a663), TOBN(0xd5f1f794, 0xe7de6dc0), TOBN(0x5cd0f4d4, 0x622aa7ce), TOBN(0x5295f3f1, 0x59acfeec), TOBN(0x8d933552, 0x953e0607), TOBN(0xc7db8ec5, 0x776c5722), TOBN(0xdc467e62, 0x2b5f290c), TOBN(0xd4297e70, 0x4ff425a9), TOBN(0x4be924c1, 0x0cf7bb72), TOBN(0x0d5dc5ae, 0xa1892131), TOBN(0x8bf8a8e3, 0xa705c992), TOBN(0x73a0b064, 0x7a305ac5), TOBN(0x00c9ca4e, 0x9a8c77a8), TOBN(0x5dfee80f, 0x83774bdd), TOBN(0x63131602, 0x85734485), TOBN(0xa1b524ae, 0x914a69a9), TOBN(0xebc2ffaf, 0xd4e300d7), TOBN(0x52c93db7, 0x7cfa46a5), TOBN(0x71e6161f, 0x21653b50), TOBN(0x3574fc57, 0xa4bc580a), TOBN(0xc09015dd, 0xe1bc1253), TOBN(0x4b7b47b2, 0xd174d7aa), TOBN(0x4072d8e8, 0xf3a15d04), TOBN(0xeeb7d47f, 0xd6fa07ed), TOBN(0x6f2b9ff9, 0xedbdafb1), TOBN(0x18c51615, 0x3760fe8a), TOBN(0x7a96e6bf, 0xf06c6c13), TOBN(0x4d7a0410, 0x0ea2d071), TOBN(0xa1914e9b, 0x0be2a5ce), TOBN(0x5726e357, 0xd8a3c5cf), TOBN(0x1197ecc3, 0x2abb2b13), TOBN(0x6c0d7f7f, 0x31ae88dd), TOBN(0x15b20d1a, 0xfdbb3efe), TOBN(0xcd06aa26, 0x70584039), TOBN(0x2277c969, 0xa7dc9747), TOBN(0xbca69587, 0x7855d815), TOBN(0x899ea238, 0x5188b32a), TOBN(0x37d9228b, 0x760c1c9d), TOBN(0xc7efbb11, 0x9b5c18da), TOBN(0x7f0d1bc8, 0x19f6dbc5), TOBN(0x4875384b, 0x07e6905b), TOBN(0xc7c50baa, 0x3ba8cd86), TOBN(0xb0ce40fb, 0xc2905de0), TOBN(0x70840673, 0x7a231952), TOBN(0xa912a262, 0xcf43de26), TOBN(0x9c38ddcc, 0xeb5b76c1), TOBN(0x746f5285, 0x26fc0ab4), TOBN(0x52a63a50, 0xd62c269f), TOBN(0x60049c55, 0x99458621), TOBN(0xe7f48f82, 0x3c2f7c9e), TOBN(0x6bd99043, 0x917d5cf3), TOBN(0xeb1317a8, 0x8701f469), TOBN(0xbd3fe2ed, 0x9a449fe0), TOBN(0x421e79ca, 0x12ef3d36), TOBN(0x9ee3c36c, 0x3e7ea5de), TOBN(0xe48198b5, 0xcdff36f7), TOBN(0xaff4f967, 0xc6b82228), TOBN(0x15e19dd0, 0xc47adb7e), TOBN(0x45699b23, 0x032e7dfa), TOBN(0x40680c8b, 0x1fae026a), TOBN(0x5a347a48, 0x550dbf4d), TOBN(0xe652533b, 0x3cef0d7d), TOBN(0xd94f7b18, 0x2bbb4381), TOBN(0x838752be, 0x0e80f500), TOBN(0x8e6e2488, 0x9e9c9bfb), TOBN(0xc9751697, 0x16caca6a), TOBN(0x866c49d8, 0x38531ad9), TOBN(0xc917e239, 0x7151ade1), TOBN(0x2d016ec1, 0x6037c407), TOBN(0xa407ccc9, 0x00eac3f9), TOBN(0x835f6280, 0xe2ed4748), TOBN(0xcc54c347, 0x1cc98e0d), TOBN(0x0e969937, 0xdcb572eb), TOBN(0x1b16c8e8, 0x8f30c9cb), TOBN(0xa606ae75, 0x373c4661), TOBN(0x47aa689b, 0x35502cab), TOBN(0xf89014ae, 0x4d9bb64f), TOBN(0x202f6a9c, 0x31c71f7b), TOBN(0x01f95aa3, 0x296ffe5c), TOBN(0x5fc06014, 0x53cec3a3), TOBN(0xeb991237, 0x5f498a45), TOBN(0xae9a935e, 0x5d91ba87), TOBN(0xc6ac6281, 0x0b564a19), TOBN(0x8a8fe81c, 0x3bd44e69), TOBN(0x7c8b467f, 0x9dd11d45), TOBN(0xf772251f, 0xea5b8e69), TOBN(0xaeecb3bd, 0xc5b75fbc), TOBN(0x1aca3331, 0x887ff0e5), TOBN(0xbe5d49ff, 0x19f0a131), TOBN(0x582c13aa, 0xe5c8646f), TOBN(0xdbaa12e8, 0x20e19980), TOBN(0x8f40f31a, 0xf7abbd94), TOBN(0x1f13f5a8, 0x1dfc7663), TOBN(0x5d81f1ee, 0xaceb4fc0), TOBN(0x36256002, 0x5e6f0f42), TOBN(0x4b67d6d7, 0x751370c8), TOBN(0x2608b698, 0x03e80589), TOBN(0xcfc0d2fc, 0x05268301), TOBN(0xa6943d39, 0x40309212), TOBN(0x192a90c2, 0x1fd0e1c2), TOBN(0xb209f113, 0x37f1dc76), TOBN(0xefcc5e06, 0x97bf1298), TOBN(0xcbdb6730, 0x219d639e), TOBN(0xd009c116, 0xb81e8c6f), TOBN(0xa3ffdde3, 0x1a7ce2e5), TOBN(0xc53fbaaa, 0xa914d3ba), TOBN(0x836d500f, 0x88df85ee), TOBN(0xd98dc71b, 0x66ee0751), TOBN(0x5a3d7005, 0x714516fd), TOBN(0x21d3634d, 0x39eedbba), TOBN(0x35cd2e68, 0x0455a46d), TOBN(0xc8cafe65, 0xf9d7eb0c), TOBN(0xbda3ce9e, 0x00cefb3e), TOBN(0xddc17a60, 0x2c9cf7a4), TOBN(0x01572ee4, 0x7bcb8773), TOBN(0xa92b2b01, 0x8c7548df), TOBN(0x732fd309, 0xa84600e3), TOBN(0xe22109c7, 0x16543a40), TOBN(0x9acafd36, 0xfede3c6c), TOBN(0xfb206852, 0x6824e614), TOBN(0x2a4544a9, 0xda25dca0), TOBN(0x25985262, 0x91d60b06), TOBN(0x281b7be9, 0x28753545), TOBN(0xec667b1a, 0x90f13b27), TOBN(0x33a83aff, 0x940e2eb4), TOBN(0x80009862, 0xd5d721d5), TOBN(0x0c3357a3, 0x5bd3a182), TOBN(0x27f3a83b, 0x7aa2cda4), TOBN(0xb58ae74e, 0xf6f83085), TOBN(0x2a911a81, 0x2e6dad6b), TOBN(0xde286051, 0xf43d6c5b), TOBN(0x4bdccc41, 0xf996c4d8), TOBN(0xe7312ec0, 0x0ae1e24e)}, {TOBN(0xf8d112e7, 0x6e6485b3), TOBN(0x4d3e24db, 0x771c52f8), TOBN(0x48e3ee41, 0x684a2f6d), TOBN(0x7161957d, 0x21d95551), TOBN(0x19631283, 0xcdb12a6c), TOBN(0xbf3fa882, 0x2e50e164), TOBN(0xf6254b63, 0x3166cc73), TOBN(0x3aefa7ae, 0xaee8cc38), TOBN(0x79b0fe62, 0x3b36f9fd), TOBN(0x26543b23, 0xfde19fc0), TOBN(0x136e64a0, 0x958482ef), TOBN(0x23f63771, 0x9b095825), TOBN(0x14cfd596, 0xb6a1142e), TOBN(0x5ea6aac6, 0x335aac0b), TOBN(0x86a0e8bd, 0xf3081dd5), TOBN(0x5fb89d79, 0x003dc12a), TOBN(0xf615c33a, 0xf72e34d4), TOBN(0x0bd9ea40, 0x110eec35), TOBN(0x1c12bc5b, 0xc1dea34e), TOBN(0x686584c9, 0x49ae4699), TOBN(0x13ad95d3, 0x8c97b942), TOBN(0x4609561a, 0x4e5c7562), TOBN(0x9e94a4ae, 0xf2737f89), TOBN(0xf57594c6, 0x371c78b6), TOBN(0x0f0165fc, 0xe3779ee3), TOBN(0xe00e7f9d, 0xbd495d9e), TOBN(0x1fa4efa2, 0x20284e7a), TOBN(0x4564bade, 0x47ac6219), TOBN(0x90e6312a, 0xc4708e8e), TOBN(0x4f5725fb, 0xa71e9adf), TOBN(0xe95f55ae, 0x3d684b9f), TOBN(0x47f7ccb1, 0x1e94b415), TOBN(0x7322851b, 0x8d946581), TOBN(0xf0d13133, 0xbdf4a012), TOBN(0xa3510f69, 0x6584dae0), TOBN(0x03a7c171, 0x3c9f6c6d), TOBN(0x5be97f38, 0xe475381a), TOBN(0xca1ba422, 0x85823334), TOBN(0xf83cc5c7, 0x0be17dda), TOBN(0x158b1494, 0x0b918c0f), TOBN(0xda3a77e5, 0x522e6b69), TOBN(0x69c908c3, 0xbbcd6c18), TOBN(0x1f1b9e48, 0xd924fd56), TOBN(0x37c64e36, 0xaa4bb3f7), TOBN(0x5a4fdbdf, 0xee478d7d), TOBN(0xba75c8bc, 0x0193f7a0), TOBN(0x84bc1e84, 0x56cd16df), TOBN(0x1fb08f08, 0x46fad151), TOBN(0x8a7cabf9, 0x842e9f30), TOBN(0xa331d4bf, 0x5eab83af), TOBN(0xd272cfba, 0x017f2a6a), TOBN(0x27560abc, 0x83aba0e3), TOBN(0x94b83387, 0x0e3a6b75), TOBN(0x25c6aea2, 0x6b9f50f5), TOBN(0x803d691d, 0xb5fdf6d0), TOBN(0x03b77509, 0xe6333514), TOBN(0x36178903, 0x61a341c1), TOBN(0x3604dc60, 0x0cfd6142), TOBN(0x022295eb, 0x8533316c), TOBN(0x3dbde4ac, 0x44af2922), TOBN(0x898afc5d, 0x1c7eef69), TOBN(0x58896805, 0xd14f4fa1), TOBN(0x05002160, 0x203c21ca), TOBN(0x6f0d1f30, 0x40ef730b), TOBN(0x8e8c44d4, 0x196224f8), TOBN(0x75a4ab95, 0x374d079d), TOBN(0x79085ecc, 0x7d48f123), TOBN(0x56f04d31, 0x1bf65ad8), TOBN(0xe220bf1c, 0xbda602b2), TOBN(0x73ee1742, 0xf9612c69), TOBN(0x76008fc8, 0x084fd06b), TOBN(0x4000ef9f, 0xf11380d1), TOBN(0x48201b4b, 0x12cfe297), TOBN(0x3eee129c, 0x292f74e5), TOBN(0xe1fe114e, 0xc9e874e8), TOBN(0x899b055c, 0x92c5fc41), TOBN(0x4e477a64, 0x3a39c8cf), TOBN(0x82f09efe, 0x78963cc9), TOBN(0x6fd3fd8f, 0xd333f863), TOBN(0x85132b2a, 0xdc949c63), TOBN(0x7e06a3ab, 0x516eb17b), TOBN(0x73bec06f, 0xd2c7372b), TOBN(0xe4f74f55, 0xba896da6), TOBN(0xbb4afef8, 0x8e9eb40f), TOBN(0x2d75bec8, 0xe61d66b0), TOBN(0x02bda4b4, 0xef29300b), TOBN(0x8bbaa8de, 0x026baa5a), TOBN(0xff54befd, 0xa07f4440), TOBN(0xbd9b8b1d, 0xbe7a2af3), TOBN(0xec51caa9, 0x4fb74a72), TOBN(0xb9937a4b, 0x63879697), TOBN(0x7c9a9d20, 0xec2687d5), TOBN(0x1773e44f, 0x6ef5f014), TOBN(0x8abcf412, 0xe90c6900), TOBN(0x387bd022, 0x8142161e), TOBN(0x50393755, 0xfcb6ff2a), TOBN(0x9813fd56, 0xed6def63), TOBN(0x53cf6482, 0x7d53106c), TOBN(0x991a35bd, 0x431f7ac1), TOBN(0xf1e274dd, 0x63e65faf), TOBN(0xf63ffa3c, 0x44cc7880), TOBN(0x411a426b, 0x7c256981), TOBN(0xb698b9fd, 0x93a420e0), TOBN(0x89fdddc0, 0xae53f8fe), TOBN(0x766e0722, 0x32398baa), TOBN(0x205fee42, 0x5cfca031), TOBN(0xa49f5341, 0x7a029cf2), TOBN(0xa88c68b8, 0x4023890d), TOBN(0xbc275041, 0x7337aaa8), TOBN(0x9ed364ad, 0x0eb384f4), TOBN(0xe0816f85, 0x29aba92f), TOBN(0x2e9e1941, 0x04e38a88), TOBN(0x57eef44a, 0x3dafd2d5), TOBN(0x35d1fae5, 0x97ed98d8), TOBN(0x50628c09, 0x2307f9b1), TOBN(0x09d84aae, 0xd6cba5c6), TOBN(0x67071bc7, 0x88aaa691), TOBN(0x2dea57a9, 0xafe6cb03), TOBN(0xdfe11bb4, 0x3d78ac01), TOBN(0x7286418c, 0x7fd7aa51), TOBN(0xfabf7709, 0x77f7195a), TOBN(0x8ec86167, 0xadeb838f), TOBN(0xea1285a8, 0xbb4f012d), TOBN(0xd6883503, 0x9a3eab3f), TOBN(0xee5d24f8, 0x309004c2), TOBN(0xa96e4b76, 0x13ffe95e), TOBN(0x0cdffe12, 0xbd223ea4), TOBN(0x8f5c2ee5, 0xb6739a53), TOBN(0x5cb4aaa5, 0xdd968198), TOBN(0xfa131c52, 0x72413a6c), TOBN(0x53d46a90, 0x9536d903), TOBN(0xb270f0d3, 0x48606d8e), TOBN(0x518c7564, 0xa053a3bc), TOBN(0x088254b7, 0x1a86caef), TOBN(0xb3ba8cb4, 0x0ab5efd0), TOBN(0x5c59900e, 0x4605945d), TOBN(0xecace1dd, 0xa1887395), TOBN(0x40960f36, 0x932a65de), TOBN(0x9611ff5c, 0x3aa95529), TOBN(0xc58215b0, 0x7c1e5a36), TOBN(0xd48c9b58, 0xf0e1a524), TOBN(0xb406856b, 0xf590dfb8), TOBN(0xc7605e04, 0x9cd95662), TOBN(0x0dd036ee, 0xa33ecf82), TOBN(0xa50171ac, 0xc33156b3), TOBN(0xf09d24ea, 0x4a80172e), TOBN(0x4e1f72c6, 0x76dc8eef), TOBN(0xe60caadc, 0x5e3d44ee), TOBN(0x006ef8a6, 0x979b1d8f), TOBN(0x60908a1c, 0x97788d26), TOBN(0x6e08f95b, 0x266feec0), TOBN(0x618427c2, 0x22e8c94e), TOBN(0x3d613339, 0x59145a65), TOBN(0xcd9bc368, 0xfa406337), TOBN(0x82d11be3, 0x2d8a52a0), TOBN(0xf6877b27, 0x97a1c590), TOBN(0x837a819b, 0xf5cbdb25), TOBN(0x2a4fd1d8, 0xde090249), TOBN(0x622a7de7, 0x74990e5f), TOBN(0x840fa5a0, 0x7945511b), TOBN(0x30b974be, 0x6558842d), TOBN(0x70df8c64, 0x17f3d0a6), TOBN(0x7c803520, 0x7542e46d), TOBN(0x7251fe7f, 0xe4ecc823), TOBN(0xe59134cb, 0x5e9aac9a), TOBN(0x11bb0934, 0xf0045d71), TOBN(0x53e5d9b5, 0xdbcb1d4e), TOBN(0x8d97a905, 0x92defc91), TOBN(0xfe289327, 0x7946d3f9), TOBN(0xe132bd24, 0x07472273), TOBN(0xeeeb510c, 0x1eb6ae86), TOBN(0x777708c5, 0xf0595067), TOBN(0x18e2c8cd, 0x1297029e), TOBN(0x2c61095c, 0xbbf9305e), TOBN(0xe466c258, 0x6b85d6d9), TOBN(0x8ac06c36, 0xda1ea530), TOBN(0xa365dc39, 0xa1304668), TOBN(0xe4a9c885, 0x07f89606), TOBN(0x65a4898f, 0xacc7228d), TOBN(0x3e2347ff, 0x84ca8303), TOBN(0xa5f6fb77, 0xea7d23a3), TOBN(0x2fac257d, 0x672a71cd), TOBN(0x6908bef8, 0x7e6a44d3), TOBN(0x8ff87566, 0x891d3d7a), TOBN(0xe58e90b3, 0x6b0cf82e), TOBN(0x6438d246, 0x2615b5e7), TOBN(0x07b1f8fc, 0x669c145a), TOBN(0xb0d8b2da, 0x36f1e1cb), TOBN(0x54d5dadb, 0xd9184c4d), TOBN(0x3dbb18d5, 0xf93d9976), TOBN(0x0a3e0f56, 0xd1147d47), TOBN(0x2afa8c8d, 0xa0a48609), TOBN(0x275353e8, 0xbc36742c), TOBN(0x898f427e, 0xeea0ed90), TOBN(0x26f4947e, 0x3e477b00), TOBN(0x8ad8848a, 0x308741e3), TOBN(0x6c703c38, 0xd74a2a46), TOBN(0x5e3e05a9, 0x9ba17ba2), TOBN(0xc1fa6f66, 0x4ab9a9e4), TOBN(0x474a2d9a, 0x3841d6ec), TOBN(0x871239ad, 0x653ae326), TOBN(0x14bcf72a, 0xa74cbb43), TOBN(0x8737650e, 0x20d4c083), TOBN(0x3df86536, 0x110ed4af), TOBN(0xd2d86fe7, 0xb53ca555), TOBN(0x688cb00d, 0xabd5d538), TOBN(0xcf81bda3, 0x1ad38468), TOBN(0x7ccfe3cc, 0xf01167b6), TOBN(0xcf4f47e0, 0x6c4c1fe6), TOBN(0x557e1f1a, 0x298bbb79), TOBN(0xf93b974f, 0x30d45a14), TOBN(0x174a1d2d, 0x0baf97c4), TOBN(0x7a003b30, 0xc51fbf53), TOBN(0xd8940991, 0xee68b225), TOBN(0x5b0aa7b7, 0x1c0f4173), TOBN(0x975797c9, 0xa20a7153), TOBN(0x26e08c07, 0xe3533d77), TOBN(0xd7222e6a, 0x2e341c99), TOBN(0x9d60ec3d, 0x8d2dc4ed), TOBN(0xbdfe0d8f, 0x7c476cf8), TOBN(0x1fe59ab6, 0x1d056605), TOBN(0xa9ea9df6, 0x86a8551f), TOBN(0x8489941e, 0x47fb8d8c), TOBN(0xfeb874eb, 0x4a7f1b10), TOBN(0xfe5fea86, 0x7ee0d98f), TOBN(0x201ad34b, 0xdbf61864), TOBN(0x45d8fe47, 0x37c031d4), TOBN(0xd5f49fae, 0x795f0822), TOBN(0xdb0fb291, 0xc7f4a40c), TOBN(0x2e69d9c1, 0x730ddd92), TOBN(0x754e1054, 0x49d76987), TOBN(0x8a24911d, 0x7662db87), TOBN(0x61fc1810, 0x60a71676), TOBN(0xe852d1a8, 0xf66a8ad1), TOBN(0x172bbd65, 0x6417231e), TOBN(0x0d6de7bd, 0x3babb11f), TOBN(0x6fde6f88, 0xc8e347f8), TOBN(0x1c587547, 0x9bd99cc3), TOBN(0x78e54ed0, 0x34076950), TOBN(0x97f0f334, 0x796e83ba), TOBN(0xe4dbe1ce, 0x4924867a), TOBN(0xbd5f51b0, 0x60b84917), TOBN(0x37530040, 0x3cb09a79), TOBN(0xdb3fe0f8, 0xff1743d8), TOBN(0xed7894d8, 0x556fa9db), TOBN(0xfa262169, 0x23412fbf), TOBN(0x563be0db, 0xba7b9291), TOBN(0x6ca8b8c0, 0x0c9fb234), TOBN(0xed406aa9, 0xbd763802), TOBN(0xc21486a0, 0x65303da1), TOBN(0x61ae291e, 0xc7e62ec4), TOBN(0x622a0492, 0xdf99333e), TOBN(0x7fd80c9d, 0xbb7a8ee0), TOBN(0xdc2ed3bc, 0x6c01aedb), TOBN(0x35c35a12, 0x08be74ec), TOBN(0xd540cb1a, 0x469f671f), TOBN(0xd16ced4e, 0xcf84f6c7), TOBN(0x8561fb9c, 0x2d090f43), TOBN(0x7e693d79, 0x6f239db4), TOBN(0xa736f928, 0x77bd0d94), TOBN(0x07b4d929, 0x2c1950ee), TOBN(0xda177543, 0x56dc11b3), TOBN(0xa5dfbbaa, 0x7a6a878e), TOBN(0x1c70cb29, 0x4decb08a), TOBN(0xfba28c8b, 0x6f0f7c50), TOBN(0xa8eba2b8, 0x854dcc6d), TOBN(0x5ff8e89a, 0x36b78642), TOBN(0x070c1c8e, 0xf6873adf), TOBN(0xbbd3c371, 0x6484d2e4), TOBN(0xfb78318f, 0x0d414129), TOBN(0x2621a39c, 0x6ad93b0b), TOBN(0x979d74c2, 0xa9e917f7), TOBN(0xfc195647, 0x61fb0428), TOBN(0x4d78954a, 0xbee624d4), TOBN(0xb94896e0, 0xb8ae86fd), TOBN(0x6667ac0c, 0xc91c8b13), TOBN(0x9f180512, 0x43bcf832), TOBN(0xfbadf8b7, 0xa0010137), TOBN(0xc69b4089, 0xb3ba8aa7), TOBN(0xfac4bacd, 0xe687ce85), TOBN(0x9164088d, 0x977eab40), TOBN(0x51f4c5b6, 0x2760b390), TOBN(0xd238238f, 0x340dd553), TOBN(0x358566c3, 0xdb1d31c9), TOBN(0x3a5ad69e, 0x5068f5ff), TOBN(0xf31435fc, 0xdaff6b06), TOBN(0xae549a5b, 0xd6debff0), TOBN(0x59e5f0b7, 0x75e01331), TOBN(0x5d492fb8, 0x98559acf), TOBN(0x96018c2e, 0x4db79b50), TOBN(0x55f4a48f, 0x609f66aa), TOBN(0x1943b3af, 0x4900a14f), TOBN(0xc22496df, 0x15a40d39), TOBN(0xb2a44684, 0x4c20f7c5), TOBN(0x76a35afa, 0x3b98404c), TOBN(0xbec75725, 0xff5d1b77), TOBN(0xb67aa163, 0xbea06444), TOBN(0x27e95bb2, 0xf724b6f2), TOBN(0x3c20e3e9, 0xd238c8ab), TOBN(0x1213754e, 0xddd6ae17), TOBN(0x8c431020, 0x716e0f74), TOBN(0x6679c82e, 0xffc095c2), TOBN(0x2eb3adf4, 0xd0ac2932), TOBN(0x2cc970d3, 0x01bb7a76), TOBN(0x70c71f2f, 0x740f0e66), TOBN(0x545c616b, 0x2b6b23cc), TOBN(0x4528cfcb, 0xb40a8bd7), TOBN(0xff839633, 0x2ab27722), TOBN(0x049127d9, 0x025ac99a), TOBN(0xd314d4a0, 0x2b63e33b), TOBN(0xc8c310e7, 0x28d84519), TOBN(0x0fcb8983, 0xb3bc84ba), TOBN(0x2cc52261, 0x38634818), TOBN(0x501814f4, 0xb44c2e0b), TOBN(0xf7e181aa, 0x54dfdba3), TOBN(0xcfd58ff0, 0xe759718c), TOBN(0xf90cdb14, 0xd3b507a8), TOBN(0x57bd478e, 0xc50bdad8), TOBN(0x29c197e2, 0x50e5f9aa), TOBN(0x4db6eef8, 0xe40bc855), TOBN(0x2cc8f21a, 0xd1fc0654), TOBN(0xc71cc963, 0x81269d73), TOBN(0xecfbb204, 0x077f49f9), TOBN(0xdde92571, 0xca56b793), TOBN(0x9abed6a3, 0xf97ad8f7), TOBN(0xe6c19d3f, 0x924de3bd), TOBN(0x8dce92f4, 0xa140a800), TOBN(0x85f44d1e, 0x1337af07), TOBN(0x5953c08b, 0x09d64c52), TOBN(0xa1b5e49f, 0xf5df9749), TOBN(0x336a8fb8, 0x52735f7d), TOBN(0xb332b6db, 0x9add676b), TOBN(0x558b88a0, 0xb4511aa4), TOBN(0x09788752, 0xdbd5cc55), TOBN(0x16b43b9c, 0xd8cd52bd), TOBN(0x7f0bc5a0, 0xc2a2696b), TOBN(0x146e12d4, 0xc11f61ef), TOBN(0x9ce10754, 0x3a83e79e), TOBN(0x08ec73d9, 0x6cbfca15), TOBN(0x09ff29ad, 0x5b49653f), TOBN(0xe31b72bd, 0xe7da946e), TOBN(0xebf9eb3b, 0xee80a4f2), TOBN(0xd1aabd08, 0x17598ce4), TOBN(0x18b5fef4, 0x53f37e80), TOBN(0xd5d5cdd3, 0x5958cd79), TOBN(0x3580a1b5, 0x1d373114), TOBN(0xa36e4c91, 0xfa935726), TOBN(0xa38c534d, 0xef20d760), TOBN(0x7088e40a, 0x2ff5845b), TOBN(0xe5bb40bd, 0xbd78177f), TOBN(0x4f06a7a8, 0x857f9920), TOBN(0xe3cc3e50, 0xe968f05d), TOBN(0x1d68b7fe, 0xe5682d26), TOBN(0x5206f76f, 0xaec7f87c), TOBN(0x41110530, 0x041951ab), TOBN(0x58ec52c1, 0xd4b5a71a), TOBN(0xf3488f99, 0x0f75cf9a), TOBN(0xf411951f, 0xba82d0d5), TOBN(0x27ee75be, 0x618895ab), TOBN(0xeae060d4, 0x6d8aab14), TOBN(0x9ae1df73, 0x7fb54dc2), TOBN(0x1f3e391b, 0x25963649), TOBN(0x242ec32a, 0xfe055081), TOBN(0x5bd450ef, 0x8491c9bd), TOBN(0x367efc67, 0x981eb389), TOBN(0xed7e1928, 0x3a0550d5), TOBN(0x362e776b, 0xab3ce75c), TOBN(0xe890e308, 0x1f24c523), TOBN(0xb961b682, 0xfeccef76), TOBN(0x8b8e11f5, 0x8bba6d92), TOBN(0x8f2ccc4c, 0x2b2375c4), TOBN(0x0d7f7a52, 0xe2f86cfa), TOBN(0xfd94d30a, 0x9efe5633), TOBN(0x2d8d246b, 0x5451f934), TOBN(0x2234c6e3, 0x244e6a00), TOBN(0xde2b5b0d, 0xddec8c50), TOBN(0x2ce53c5a, 0xbf776f5b), TOBN(0x6f724071, 0x60357b05), TOBN(0xb2593717, 0x71bf3f7a), TOBN(0x87d2501c, 0x440c4a9f), TOBN(0x440552e1, 0x87b05340), TOBN(0xb7bf7cc8, 0x21624c32), TOBN(0x4155a6ce, 0x22facddb), TOBN(0x5a4228cb, 0x889837ef), TOBN(0xef87d6d6, 0xfd4fd671), TOBN(0xa233687e, 0xc2daa10e), TOBN(0x75622244, 0x03c0eb96), TOBN(0x7632d184, 0x8bf19be6), TOBN(0x05d0f8e9, 0x40735ff4), TOBN(0x3a3e6e13, 0xc00931f1), TOBN(0x31ccde6a, 0xdafe3f18), TOBN(0xf381366a, 0xcfe51207), TOBN(0x24c222a9, 0x60167d92), TOBN(0x62f9d6f8, 0x7529f18c), TOBN(0x412397c0, 0x0353b114), TOBN(0x334d89dc, 0xef808043), TOBN(0xd9ec63ba, 0x2a4383ce), TOBN(0xcec8e937, 0x5cf92ba0), TOBN(0xfb8b4288, 0xc8be74c0), TOBN(0x67d6912f, 0x105d4391), TOBN(0x7b996c46, 0x1b913149), TOBN(0x36aae2ef, 0x3a4e02da), TOBN(0xb68aa003, 0x972de594), TOBN(0x284ec70d, 0x4ec6d545), TOBN(0xf3d2b2d0, 0x61391d54), TOBN(0x69c5d5d6, 0xfe114e92), TOBN(0xbe0f00b5, 0xb4482dff), TOBN(0xe1596fa5, 0xf5bf33c5), TOBN(0x10595b56, 0x96a71cba), TOBN(0x944938b2, 0xfdcadeb7), TOBN(0xa282da4c, 0xfccd8471), TOBN(0x98ec05f3, 0x0d37bfe1), TOBN(0xe171ce1b, 0x0698304a), TOBN(0x2d691444, 0x21bdf79b), TOBN(0xd0cd3b74, 0x1b21dec1), TOBN(0x712ecd8b, 0x16a15f71), TOBN(0x8d4c00a7, 0x00fd56e1), TOBN(0x02ec9692, 0xf9527c18), TOBN(0x21c44937, 0x4a3e42e1), TOBN(0x9176fbab, 0x1392ae0a), TOBN(0x8726f1ba, 0x44b7b618), TOBN(0xb4d7aae9, 0xf1de491c), TOBN(0xf91df7b9, 0x07b582c0), TOBN(0x7e116c30, 0xef60aa3a), TOBN(0x99270f81, 0x466265d7), TOBN(0xb15b6fe2, 0x4df7adf0), TOBN(0xfe33b2d3, 0xf9738f7f), TOBN(0x48553ab9, 0xd6d70f95), TOBN(0x2cc72ac8, 0xc21e94db), TOBN(0x795ac38d, 0xbdc0bbee), TOBN(0x0a1be449, 0x2e40478f), TOBN(0x81bd3394, 0x052bde55), TOBN(0x63c8dbe9, 0x56b3c4f2), TOBN(0x017a99cf, 0x904177cc), TOBN(0x947bbddb, 0x4d010fc1), TOBN(0xacf9b00b, 0xbb2c9b21), TOBN(0x2970bc8d, 0x47173611), TOBN(0x1a4cbe08, 0xac7d756f), TOBN(0x06d9f4aa, 0x67d541a2), TOBN(0xa3e8b689, 0x59c2cf44), TOBN(0xaad066da, 0x4d88f1dd), TOBN(0xc604f165, 0x7ad35dea), TOBN(0x7edc0720, 0x4478ca67), TOBN(0xa10dfae0, 0xba02ce06), TOBN(0xeceb1c76, 0xaf36f4e4), TOBN(0x994b2292, 0xaf3f8f48), TOBN(0xbf9ed77b, 0x77c8a68c), TOBN(0x74f544ea, 0x51744c9d), TOBN(0x82d05bb9, 0x8113a757), TOBN(0x4ef2d2b4, 0x8a9885e4), TOBN(0x1e332be5, 0x1aa7865f), TOBN(0x22b76b18, 0x290d1a52), TOBN(0x308a2310, 0x44351683), TOBN(0x9d861896, 0xa3f22840), TOBN(0x5959ddcd, 0x841ed947), TOBN(0x0def0c94, 0x154b73bf), TOBN(0xf0105417, 0x4c7c15e0), TOBN(0x539bfb02, 0x3a277c32), TOBN(0xe699268e, 0xf9dccf5f), TOBN(0x9f5796a5, 0x0247a3bd), TOBN(0x8b839de8, 0x4f157269), TOBN(0xc825c1e5, 0x7a30196b), TOBN(0x6ef0aabc, 0xdc8a5a91), TOBN(0xf4a8ce6c, 0x498b7fe6), TOBN(0x1cce35a7, 0x70cbac78), TOBN(0x83488e9b, 0xf6b23958), TOBN(0x0341a070, 0xd76cb011), TOBN(0xda6c9d06, 0xae1b2658), TOBN(0xb701fb30, 0xdd648c52), TOBN(0x994ca02c, 0x52fb9fd1), TOBN(0x06933117, 0x6f563086), TOBN(0x3d2b8100, 0x17856bab), TOBN(0xe89f48c8, 0x5963a46e), TOBN(0x658ab875, 0xa99e61c7), TOBN(0x6e296f87, 0x4b8517b4), TOBN(0x36c4fcdc, 0xfc1bc656), TOBN(0xde5227a1, 0xa3906def), TOBN(0x9fe95f57, 0x62418945), TOBN(0x20c91e81, 0xfdd96cde), TOBN(0x5adbe47e, 0xda4480de), TOBN(0xa009370f, 0x396de2b6), TOBN(0x98583d4b, 0xf0ecc7bd), TOBN(0xf44f6b57, 0xe51d0672), TOBN(0x03d6b078, 0x556b1984), TOBN(0x27dbdd93, 0xb0b64912), TOBN(0x9b3a3434, 0x15687b09), TOBN(0x0dba6461, 0x51ec20a9), TOBN(0xec93db7f, 0xff28187c), TOBN(0x00ff8c24, 0x66e48bdd), TOBN(0x2514f2f9, 0x11ccd78e), TOBN(0xeba11f4f, 0xe1250603), TOBN(0x8a22cd41, 0x243fa156), TOBN(0xa4e58df4, 0xb283e4c6), TOBN(0x78c29859, 0x8b39783f), TOBN(0x5235aee2, 0xa5259809), TOBN(0xc16284b5, 0x0e0227dd), TOBN(0xa5f57916, 0x1338830d), TOBN(0x6d4b8a6b, 0xd2123fca), TOBN(0x236ea68a, 0xf9c546f8), TOBN(0xc1d36873, 0xfa608d36), TOBN(0xcd76e495, 0x8d436d13), TOBN(0xd4d9c221, 0x8fb080af), TOBN(0x665c1728, 0xe8ad3fb5), TOBN(0xcf1ebe4d, 0xb3d572e0), TOBN(0xa7a8746a, 0x584c5e20), TOBN(0x267e4ea1, 0xb9dc7035), TOBN(0x593a15cf, 0xb9548c9b), TOBN(0x5e6e2135, 0x4bd012f3), TOBN(0xdf31cc6a, 0x8c8f936e), TOBN(0x8af84d04, 0xb5c241dc), TOBN(0x63990a6f, 0x345efb86), TOBN(0x6fef4e61, 0xb9b962cb)}, {TOBN(0xf6368f09, 0x25722608), TOBN(0x131260db, 0x131cf5c6), TOBN(0x40eb353b, 0xfab4f7ac), TOBN(0x85c78880, 0x37eee829), TOBN(0x4c1581ff, 0xc3bdf24e), TOBN(0x5bff75cb, 0xf5c3c5a8), TOBN(0x35e8c83f, 0xa14e6f40), TOBN(0xb81d1c0f, 0x0295e0ca), TOBN(0xfcde7cc8, 0xf43a730f), TOBN(0xe89b6f3c, 0x33ab590e), TOBN(0xc823f529, 0xad03240b), TOBN(0x82b79afe, 0x98bea5db), TOBN(0x568f2856, 0x962fe5de), TOBN(0x0c590adb, 0x60c591f3), TOBN(0x1fc74a14, 0x4a28a858), TOBN(0x3b662498, 0xb3203f4c), TOBN(0x91e3cf0d, 0x6c39765a), TOBN(0xa2db3acd, 0xac3cca0b), TOBN(0x288f2f08, 0xcb953b50), TOBN(0x2414582c, 0xcf43cf1a), TOBN(0x8dec8bbc, 0x60eee9a8), TOBN(0x54c79f02, 0x729aa042), TOBN(0xd81cd5ec, 0x6532f5d5), TOBN(0xa672303a, 0xcf82e15f), TOBN(0x376aafa8, 0x719c0563), TOBN(0xcd8ad2dc, 0xbc5fc79f), TOBN(0x303fdb9f, 0xcb750cd3), TOBN(0x14ff052f, 0x4418b08e), TOBN(0xf75084cf, 0x3e2d6520), TOBN(0x7ebdf0f8, 0x144ed509), TOBN(0xf43bf0f2, 0xd3f25b98), TOBN(0x86ad71cf, 0xa354d837), TOBN(0xb827fe92, 0x26f43572), TOBN(0xdfd3ab5b, 0x5d824758), TOBN(0x315dd23a, 0x539094c1), TOBN(0x85c0e37a, 0x66623d68), TOBN(0x575c7972, 0x7be19ae0), TOBN(0x616a3396, 0xdf0d36b5), TOBN(0xa1ebb3c8, 0x26b1ff7e), TOBN(0x635b9485, 0x140ad453), TOBN(0x92bf3cda, 0xda430c0b), TOBN(0x4702850e, 0x3a96dac6), TOBN(0xc91cf0a5, 0x15ac326a), TOBN(0x95de4f49, 0xab8c25e4), TOBN(0xb01bad09, 0xe265c17c), TOBN(0x24e45464, 0x087b3881), TOBN(0xd43e583c, 0xe1fac5ca), TOBN(0xe17cb318, 0x6ead97a6), TOBN(0x6cc39243, 0x74dcec46), TOBN(0x33cfc02d, 0x54c2b73f), TOBN(0x82917844, 0xf26cd99c), TOBN(0x8819dd95, 0xd1773f89), TOBN(0x09572aa6, 0x0871f427), TOBN(0x8e0cf365, 0xf6f01c34), TOBN(0x7fa52988, 0xbff1f5af), TOBN(0x4eb357ea, 0xe75e8e50), TOBN(0xd9d0c8c4, 0x868af75d), TOBN(0xd7325cff, 0x45c8c7ea), TOBN(0xab471996, 0xcc81ecb0), TOBN(0xff5d55f3, 0x611824ed), TOBN(0xbe314541, 0x1977a0ee), TOBN(0x5085c4c5, 0x722038c6), TOBN(0x2d5335bf, 0xf94bb495), TOBN(0x894ad8a6, 0xc8e2a082), TOBN(0x5c3e2341, 0xada35438), TOBN(0xf4a9fc89, 0x049b8c4e), TOBN(0xbeeb355a, 0x9f17cf34), TOBN(0x3f311e0e, 0x6c91fe10), TOBN(0xc2d20038, 0x92ab9891), TOBN(0x257bdcc1, 0x3e8ce9a9), TOBN(0x1b2d9789, 0x88c53bee), TOBN(0x927ce89a, 0xcdba143a), TOBN(0xb0a32cca, 0x523db280), TOBN(0x5c889f8a, 0x50d43783), TOBN(0x503e04b3, 0x4897d16f), TOBN(0x8cdb6e78, 0x08f5f2e8), TOBN(0x6ab91cf0, 0x179c8e74), TOBN(0xd8874e52, 0x48211d60), TOBN(0xf948d4d5, 0xea851200), TOBN(0x4076d41e, 0xe6f9840a), TOBN(0xc20e263c, 0x47b517ea), TOBN(0x79a448fd, 0x30685e5e), TOBN(0xe55f6f78, 0xf90631a0), TOBN(0x88a790b1, 0xa79e6346), TOBN(0x62160c7d, 0x80969fe8), TOBN(0x54f92fd4, 0x41491bb9), TOBN(0xa6645c23, 0x5c957526), TOBN(0xf44cc5ae, 0xbea3ce7b), TOBN(0xf7628327, 0x8b1e68b7), TOBN(0xc731ad7a, 0x303f29d3), TOBN(0xfe5a9ca9, 0x57d03ecb), TOBN(0x96c0d50c, 0x41bc97a7), TOBN(0xc4669fe7, 0x9b4f7f24), TOBN(0xfdd781d8, 0x3d9967ef), TOBN(0x7892c7c3, 0x5d2c208d), TOBN(0x8bf64f7c, 0xae545cb3), TOBN(0xc01f862c, 0x467be912), TOBN(0xf4c85ee9, 0xc73d30cc), TOBN(0x1fa6f4be, 0x6ab83ec7), TOBN(0xa07a3c1c, 0x4e3e3cf9), TOBN(0x87f8ef45, 0x0c00beb3), TOBN(0x30e2c2b3, 0x000d4c3e), TOBN(0x1aa00b94, 0xfe08bf5b), TOBN(0x32c133aa, 0x9224ef52), TOBN(0x38df16bb, 0x32e5685d), TOBN(0x68a9e069, 0x58e6f544), TOBN(0x495aaff7, 0xcdc5ebc6), TOBN(0xf894a645, 0x378b135f), TOBN(0xf316350a, 0x09e27ecf), TOBN(0xeced201e, 0x58f7179d), TOBN(0x2eec273c, 0xe97861ba), TOBN(0x47ec2cae, 0xd693be2e), TOBN(0xfa4c97c4, 0xf68367ce), TOBN(0xe4f47d0b, 0xbe5a5755), TOBN(0x17de815d, 0xb298a979), TOBN(0xd7eca659, 0xc177dc7d), TOBN(0x20fdbb71, 0x49ded0a3), TOBN(0x4cb2aad4, 0xfb34d3c5), TOBN(0x2cf31d28, 0x60858a33), TOBN(0x3b6873ef, 0xa24aa40f), TOBN(0x540234b2, 0x2c11bb37), TOBN(0x2d0366dd, 0xed4c74a3), TOBN(0xf9a968da, 0xeec5f25d), TOBN(0x36601068, 0x67b63142), TOBN(0x07cd6d2c, 0x68d7b6d4), TOBN(0xa8f74f09, 0x0c842942), TOBN(0xe2751404, 0x7768b1ee), TOBN(0x4b5f7e89, 0xfe62aee4), TOBN(0xc6a77177, 0x89070d26), TOBN(0xa1f28e4e, 0xdd1c8bc7), TOBN(0xea5f4f06, 0x469e1f17), TOBN(0x78fc242a, 0xfbdb78e0), TOBN(0xc9c7c592, 0x8b0588f1), TOBN(0xb6b7a0fd, 0x1535921e), TOBN(0xcc5bdb91, 0xbde5ae35), TOBN(0xb42c485e, 0x12ff1864), TOBN(0xa1113e13, 0xdbab98aa), TOBN(0xde9d469b, 0xa17b1024), TOBN(0x23f48b37, 0xc0462d3a), TOBN(0x3752e537, 0x7c5c078d), TOBN(0xe3a86add, 0x15544eb9), TOBN(0xf013aea7, 0x80fba279), TOBN(0x8b5bb76c, 0xf22001b5), TOBN(0xe617ba14, 0xf02891ab), TOBN(0xd39182a6, 0x936219d3), TOBN(0x5ce1f194, 0xae51cb19), TOBN(0xc78f8598, 0xbf07a74c), TOBN(0x6d7158f2, 0x22cbf1bc), TOBN(0x3b846b21, 0xe300ce18), TOBN(0x35fba630, 0x2d11275d), TOBN(0x5fe25c36, 0xa0239b9b), TOBN(0xd8beb35d, 0xdf05d940), TOBN(0x4db02bb0, 0x1f7e320d), TOBN(0x0641c364, 0x6da320ea), TOBN(0x6d95fa5d, 0x821389a3), TOBN(0x92699748, 0x8fcd8e3d), TOBN(0x316fef17, 0xceb6c143), TOBN(0x67fcb841, 0xd933762b), TOBN(0xbb837e35, 0x118b17f8), TOBN(0x4b92552f, 0x9fd24821), TOBN(0xae6bc70e, 0x46aca793), TOBN(0x1cf0b0e4, 0xe579311b), TOBN(0x8dc631be, 0x5802f716), TOBN(0x099bdc6f, 0xbddbee4d), TOBN(0xcc352bb2, 0x0caf8b05), TOBN(0xf74d505a, 0x72d63df2), TOBN(0xb9876d4b, 0x91c4f408), TOBN(0x1ce18473, 0x9e229b2d), TOBN(0x49507597, 0x83abdb4a), TOBN(0x850fbcb6, 0xdee84b18), TOBN(0x6325236e, 0x609e67dc), TOBN(0x04d831d9, 0x9336c6d8), TOBN(0x8deaae3b, 0xfa12d45d), TOBN(0xe425f8ce, 0x4746e246), TOBN(0x8004c175, 0x24f5f31e), TOBN(0xaca16d8f, 0xad62c3b7), TOBN(0x0dc15a6a, 0x9152f934), TOBN(0xf1235e5d, 0xed0e12c1), TOBN(0xc33c06ec, 0xda477dac), TOBN(0x76be8732, 0xb2ea0006), TOBN(0xcf3f7831, 0x0c0cd313), TOBN(0x3c524553, 0xa614260d), TOBN(0x31a756f8, 0xcab22d15), TOBN(0x03ee10d1, 0x77827a20), TOBN(0xd1e059b2, 0x1994ef20), TOBN(0x2a653b69, 0x638ae318), TOBN(0x70d5eb58, 0x2f699010), TOBN(0x279739f7, 0x09f5f84a), TOBN(0x5da4663c, 0x8b799336), TOBN(0xfdfdf14d, 0x203c37eb), TOBN(0x32d8a9dc, 0xa1dbfb2d), TOBN(0xab40cff0, 0x77d48f9b), TOBN(0xc018b383, 0xd20b42d5), TOBN(0xf9a810ef, 0x9f78845f), TOBN(0x40af3753, 0xbdba9df0), TOBN(0xb90bdcfc, 0x131dfdf9), TOBN(0x18720591, 0xf01ab782), TOBN(0xc823f211, 0x6af12a88), TOBN(0xa51b80f3, 0x0dc14401), TOBN(0xde248f77, 0xfb2dfbe3), TOBN(0xef5a44e5, 0x0cafe751), TOBN(0x73997c9c, 0xd4dcd221), TOBN(0x32fd86d1, 0xde854024), TOBN(0xd5b53adc, 0xa09b84bb), TOBN(0x008d7a11, 0xdcedd8d1), TOBN(0x406bd1c8, 0x74b32c84), TOBN(0x5d4472ff, 0x05dde8b1), TOBN(0x2e25f2cd, 0xfce2b32f), TOBN(0xbec0dd5e, 0x29dfc254), TOBN(0x4455fcf6, 0x2b98b267), TOBN(0x0b4d43a5, 0xc72df2ad), TOBN(0xea70e6be, 0x48a75397), TOBN(0x2aad6169, 0x5820f3bf), TOBN(0xf410d2dd, 0x9e37f68f), TOBN(0x70fb7dba, 0x7be5ac83), TOBN(0x636bb645, 0x36ec3eec), TOBN(0x27104ea3, 0x9754e21c), TOBN(0xbc87a3e6, 0x8d63c373), TOBN(0x483351d7, 0x4109db9a), TOBN(0x0fa724e3, 0x60134da7), TOBN(0x9ff44c29, 0xb0720b16), TOBN(0x2dd0cf13, 0x06aceead), TOBN(0x5942758c, 0xe26929a6), TOBN(0x96c5db92, 0xb766a92b), TOBN(0xcec7d4c0, 0x5f18395e), TOBN(0xd3f22744, 0x1f80d032), TOBN(0x7a68b37a, 0xcb86075b), TOBN(0x074764dd, 0xafef92db), TOBN(0xded1e950, 0x7bc7f389), TOBN(0xc580c850, 0xb9756460), TOBN(0xaeeec2a4, 0x7da48157), TOBN(0x3f0b4e7f, 0x82c587b3), TOBN(0x231c6de8, 0xa9f19c53), TOBN(0x5717bd73, 0x6974e34e), TOBN(0xd9e1d216, 0xf1508fa9), TOBN(0x9f112361, 0xdadaa124), TOBN(0x80145e31, 0x823b7348), TOBN(0x4dd8f0d5, 0xac634069), TOBN(0xe3d82fc7, 0x2297c258), TOBN(0x276fcfee, 0x9cee7431), TOBN(0x8eb61b5e, 0x2bc0aea9), TOBN(0x4f668fd5, 0xde329431), TOBN(0x03a32ab1, 0x38e4b87e), TOBN(0xe1374517, 0x73d0ef0b), TOBN(0x1a46f7e6, 0x853ac983), TOBN(0xc3bdf42e, 0x68e78a57), TOBN(0xacf20785, 0x2ea96dd1), TOBN(0xa10649b9, 0xf1638460), TOBN(0xf2369f0b, 0x879fbbed), TOBN(0x0ff0ae86, 0xda9d1869), TOBN(0x5251d759, 0x56766f45), TOBN(0x4984d8c0, 0x2be8d0fc), TOBN(0x7ecc95a6, 0xd21008f0), TOBN(0x29bd54a0, 0x3a1a1c49), TOBN(0xab9828c5, 0xd26c50f3), TOBN(0x32c0087c, 0x51d0d251), TOBN(0x9bac3ce6, 0x0c1cdb26), TOBN(0xcd94d947, 0x557ca205), TOBN(0x1b1bd598, 0x9db1fdcd), TOBN(0x0eda0108, 0xa3d8b149), TOBN(0x95066610, 0x56152fcc), TOBN(0xc2f037e6, 0xe7192b33), TOBN(0xdeffb41a, 0xc92e05a4), TOBN(0x1105f6c2, 0xc2f6c62e), TOBN(0x68e73500, 0x8733913c), TOBN(0xcce86163, 0x3f3adc40), TOBN(0xf407a942, 0x38a278e9), TOBN(0xd13c1b9d, 0x2ab21292), TOBN(0x93ed7ec7, 0x1c74cf5c), TOBN(0x8887dc48, 0xf1a4c1b4), TOBN(0x3830ff30, 0x4b3a11f1), TOBN(0x358c5a3c, 0x58937cb6), TOBN(0x027dc404, 0x89022829), TOBN(0x40e93977, 0x3b798f79), TOBN(0x90ad3337, 0x38be6ead), TOBN(0x9c23f6bc, 0xf34c0a5d), TOBN(0xd1711a35, 0xfbffd8bb), TOBN(0x60fcfb49, 0x1949d3dd), TOBN(0x09c8ef4b, 0x7825d93a), TOBN(0x24233cff, 0xa0a8c968), TOBN(0x67ade46c, 0xe6d982af), TOBN(0xebb6bf3e, 0xe7544d7c), TOBN(0xd6b9ba76, 0x3d8bd087), TOBN(0x46fe382d, 0x4dc61280), TOBN(0xbd39a7e8, 0xb5bdbd75), TOBN(0xab381331, 0xb8f228fe), TOBN(0x0709a77c, 0xce1c4300), TOBN(0x6a247e56, 0xf337ceac), TOBN(0x8f34f21b, 0x636288be), TOBN(0x9dfdca74, 0xc8a7c305), TOBN(0x6decfd1b, 0xea919e04), TOBN(0xcdf2688d, 0x8e1991f8), TOBN(0xe607df44, 0xd0f8a67e), TOBN(0xd985df4b, 0x0b58d010), TOBN(0x57f834c5, 0x0c24f8f4), TOBN(0xe976ef56, 0xa0bf01ae), TOBN(0x536395ac, 0xa1c32373), TOBN(0x351027aa, 0x734c0a13), TOBN(0xd2f1b5d6, 0x5e6bd5bc), TOBN(0x2b539e24, 0x223debed), TOBN(0xd4994cec, 0x0eaa1d71), TOBN(0x2a83381d, 0x661dcf65), TOBN(0x5f1aed2f, 0x7b54c740), TOBN(0x0bea3fa5, 0xd6dda5ee), TOBN(0x9d4fb684, 0x36cc6134), TOBN(0x8eb9bbf3, 0xc0a443dd), TOBN(0xfc500e2e, 0x383b7d2a), TOBN(0x7aad621c, 0x5b775257), TOBN(0x69284d74, 0x0a8f7cc0), TOBN(0xe820c2ce, 0x07562d65), TOBN(0xbf9531b9, 0x499758ee), TOBN(0x73e95ca5, 0x6ee0cc2d), TOBN(0xf61790ab, 0xfbaf50a5), TOBN(0xdf55e76b, 0x684e0750), TOBN(0xec516da7, 0xf176b005), TOBN(0x575553bb, 0x7a2dddc7), TOBN(0x37c87ca3, 0x553afa73), TOBN(0x315f3ffc, 0x4d55c251), TOBN(0xe846442a, 0xaf3e5d35), TOBN(0x61b91149, 0x6495ff28), TOBN(0x23cc95d3, 0xfa326dc3), TOBN(0x1df4da1f, 0x18fc2cea), TOBN(0x24bf9adc, 0xd0a37d59), TOBN(0xb6710053, 0x320d6e1e), TOBN(0x96f9667e, 0x618344d1), TOBN(0xcc7ce042, 0xa06445af), TOBN(0xa02d8514, 0xd68dbc3a), TOBN(0x4ea109e4, 0x280b5a5b), TOBN(0x5741a7ac, 0xb40961bf), TOBN(0x4ada5937, 0x6aa56bfa), TOBN(0x7feb9145, 0x02b765d1), TOBN(0x561e97be, 0xe6ad1582), TOBN(0xbbc4a5b6, 0xda3982f5), TOBN(0x0c2659ed, 0xb546f468), TOBN(0xb8e7e6aa, 0x59612d20), TOBN(0xd83dfe20, 0xac19e8e0), TOBN(0x8530c45f, 0xb835398c), TOBN(0x6106a8bf, 0xb38a41c2), TOBN(0x21e8f9a6, 0x35f5dcdb), TOBN(0x39707137, 0xcae498ed), TOBN(0x70c23834, 0xd8249f00), TOBN(0x9f14b58f, 0xab2537a0), TOBN(0xd043c365, 0x5f61c0c2), TOBN(0xdc5926d6, 0x09a194a7), TOBN(0xddec0339, 0x8e77738a), TOBN(0xd07a63ef, 0xfba46426), TOBN(0x2e58e79c, 0xee7f6e86), TOBN(0xe59b0459, 0xff32d241), TOBN(0xc5ec84e5, 0x20fa0338), TOBN(0x97939ac8, 0xeaff5ace), TOBN(0x0310a4e3, 0xb4a38313), TOBN(0x9115fba2, 0x8f9d9885), TOBN(0x8dd710c2, 0x5fadf8c3), TOBN(0x66be38a2, 0xce19c0e2), TOBN(0xd42a279c, 0x4cfe5022), TOBN(0x597bb530, 0x0e24e1b8), TOBN(0x3cde86b7, 0xc153ca7f), TOBN(0xa8d30fb3, 0x707d63bd), TOBN(0xac905f92, 0xbd60d21e), TOBN(0x98e7ffb6, 0x7b9a54ab), TOBN(0xd7147df8, 0xe9726a30), TOBN(0xb5e216ff, 0xafce3533), TOBN(0xb550b799, 0x2ff1ec40), TOBN(0x6b613b87, 0xa1e953fd), TOBN(0x87b88dba, 0x792d5610), TOBN(0x2ee1270a, 0xa190fbe1), TOBN(0x02f4e2dc, 0x2ef581da), TOBN(0x016530e4, 0xeff82a95), TOBN(0xcbb93dfd, 0x8fd6ee89), TOBN(0x16d3d986, 0x46848fff), TOBN(0x600eff24, 0x1da47adf), TOBN(0x1b9754a0, 0x0ad47a71), TOBN(0x8f9266df, 0x70c33b98), TOBN(0xaadc87ae, 0xdf34186e), TOBN(0x0d2ce8e1, 0x4ad24132), TOBN(0x8a47cbfc, 0x19946eba), TOBN(0x47feeb66, 0x62b5f3af), TOBN(0xcefab561, 0x0abb3734), TOBN(0x449de60e, 0x19f35cb1), TOBN(0x39f8db14, 0x157f0eb9), TOBN(0xffaecc5b, 0x3c61bfd6), TOBN(0xa5a4d41d, 0x41216703), TOBN(0x7f8fabed, 0x224e1cc2), TOBN(0x0d5a8186, 0x871ad953), TOBN(0xf10774f7, 0xd22da9a9), TOBN(0x45b8a678, 0xcc8a9b0d), TOBN(0xd9c2e722, 0xbdc32cff), TOBN(0xbf71b5f5, 0x337202a5), TOBN(0x95c57f2f, 0x69fc4db9), TOBN(0xb6dad34c, 0x765d01e1), TOBN(0x7e0bd13f, 0xcb904635), TOBN(0x61751253, 0x763a588c), TOBN(0xd85c2997, 0x81af2c2d), TOBN(0xc0f7d9c4, 0x81b9d7da), TOBN(0x838a34ae, 0x08533e8d), TOBN(0x15c4cb08, 0x311d8311), TOBN(0x97f83285, 0x8e121e14), TOBN(0xeea7dc1e, 0x85000a5f), TOBN(0x0c6059b6, 0x5d256274), TOBN(0xec9beace, 0xb95075c0), TOBN(0x173daad7, 0x1df97828), TOBN(0xbf851cb5, 0xa8937877), TOBN(0xb083c594, 0x01646f3c), TOBN(0x3bad30cf, 0x50c6d352), TOBN(0xfeb2b202, 0x496bbcea), TOBN(0x3cf9fd4f, 0x18a1e8ba), TOBN(0xd26de7ff, 0x1c066029), TOBN(0x39c81e9e, 0x4e9ed4f8), TOBN(0xd8be0cb9, 0x7b390d35), TOBN(0x01df2bbd, 0x964aab27), TOBN(0x3e8c1a65, 0xc3ef64f8), TOBN(0x567291d1, 0x716ed1dd), TOBN(0x95499c6c, 0x5f5406d3), TOBN(0x71fdda39, 0x5ba8e23f), TOBN(0xcfeb320e, 0xd5096ece), TOBN(0xbe7ba92b, 0xca66dd16), TOBN(0x4608d36b, 0xc6fb5a7d), TOBN(0xe3eea15a, 0x6d2dd0e0), TOBN(0x75b0a3eb, 0x8f97a36a), TOBN(0xf59814cc, 0x1c83de1e), TOBN(0x56c9c5b0, 0x1c33c23f), TOBN(0xa96c1da4, 0x6faa4136), TOBN(0x46bf2074, 0xde316551), TOBN(0x3b866e7b, 0x1f756c8f), TOBN(0x727727d8, 0x1495ed6b), TOBN(0xb2394243, 0xb682dce7), TOBN(0x8ab8454e, 0x758610f3), TOBN(0xc243ce84, 0x857d72a4), TOBN(0x7b320d71, 0xdbbf370f), TOBN(0xff9afa37, 0x78e0f7ca), TOBN(0x0119d1e0, 0xea7b523f), TOBN(0xb997f8cb, 0x058c7d42), TOBN(0x285bcd2a, 0x37bbb184), TOBN(0x51dcec49, 0xa45d1fa6), TOBN(0x6ade3b64, 0xe29634cb), TOBN(0x080c94a7, 0x26b86ef1), TOBN(0xba583db1, 0x2283fbe3), TOBN(0x902bddc8, 0x5a9315ed), TOBN(0x07c1ccb3, 0x86964bec), TOBN(0x78f4eacf, 0xb6258301), TOBN(0x4bdf3a49, 0x56f90823), TOBN(0xba0f5080, 0x741d777b), TOBN(0x091d71c3, 0xf38bf760), TOBN(0x9633d50f, 0x9b625b02), TOBN(0x03ecb743, 0xb8c9de61), TOBN(0xb4751254, 0x5de74720), TOBN(0x9f9defc9, 0x74ce1cb2), TOBN(0x774a4f6a, 0x00bd32ef), TOBN(0xaca385f7, 0x73848f22), TOBN(0x53dad716, 0xf3f8558e), TOBN(0xab7b34b0, 0x93c471f9), TOBN(0xf530e069, 0x19644bc7), TOBN(0x3d9fb1ff, 0xdd59d31a), TOBN(0x4382e0df, 0x08daa795), TOBN(0x165c6f4b, 0xd5cc88d7), TOBN(0xeaa392d5, 0x4a18c900), TOBN(0x94203c67, 0x648024ee), TOBN(0x188763f2, 0x8c2fabcd), TOBN(0xa80f87ac, 0xbbaec835), TOBN(0x632c96e0, 0xf29d8d54), TOBN(0x29b0a60e, 0x4c00a95e), TOBN(0x2ef17f40, 0xe011e9fa), TOBN(0xf6c0e1d1, 0x15b77223), TOBN(0xaaec2c62, 0x14b04e32), TOBN(0xd35688d8, 0x3d84e58c), TOBN(0x2af5094c, 0x958571db), TOBN(0x4fff7e19, 0x760682a6), TOBN(0x4cb27077, 0xe39a407c), TOBN(0x0f59c547, 0x4ff0e321), TOBN(0x169f34a6, 0x1b34c8ff), TOBN(0x2bff1096, 0x52bc1ba7), TOBN(0xa25423b7, 0x83583544), TOBN(0x5d55d5d5, 0x0ac8b782), TOBN(0xff6622ec, 0x2db3c892), TOBN(0x48fce741, 0x6b8bb642), TOBN(0x31d6998c, 0x69d7e3dc), TOBN(0xdbaf8004, 0xcadcaed0), TOBN(0x801b0142, 0xd81d053c), TOBN(0x94b189fc, 0x59630ec6), TOBN(0x120e9934, 0xaf762c8e), TOBN(0x53a29aa4, 0xfdc6a404), TOBN(0x19d8e01e, 0xa1909948), TOBN(0x3cfcabf1, 0xd7e89681), TOBN(0x3321a50d, 0x4e132d37), TOBN(0xd0496863, 0xe9a86111), TOBN(0x8c0cde61, 0x06a3bc65), TOBN(0xaf866c49, 0xfc9f8eef), TOBN(0x2066350e, 0xff7f5141), TOBN(0x4f8a4689, 0xe56ddfbd), TOBN(0xea1b0c07, 0xfe32983a), TOBN(0x2b317462, 0x873cb8cb), TOBN(0x658deddc, 0x2d93229f), TOBN(0x65efaf4d, 0x0f64ef58), TOBN(0xfe43287d, 0x730cc7a8), TOBN(0xaebc0c72, 0x3d047d70), TOBN(0x92efa539, 0xd92d26c9), TOBN(0x06e78457, 0x94b56526), TOBN(0x415cb80f, 0x0961002d), TOBN(0x89e5c565, 0x76dcb10f), TOBN(0x8bbb6982, 0xff9259fe), TOBN(0x4fe8795b, 0x9abc2668), TOBN(0xb5d4f534, 0x1e678fb1), TOBN(0x6601f3be, 0x7b7da2b9), TOBN(0x98da59e2, 0xa13d6805), TOBN(0x190d8ea6, 0x01799a52), TOBN(0xa20cec41, 0xb86d2952), TOBN(0x3062ffb2, 0x7fff2a7c), TOBN(0x741b32e5, 0x79f19d37), TOBN(0xf80d8181, 0x4eb57d47), TOBN(0x7a2d0ed4, 0x16aef06b), TOBN(0x09735fb0, 0x1cecb588), TOBN(0x1641caaa, 0xc6061f5b)}, {TOBN(0x7f99824f, 0x20151427), TOBN(0x206828b6, 0x92430206), TOBN(0xaa9097d7, 0xe1112357), TOBN(0xacf9a2f2, 0x09e414ec), TOBN(0xdbdac9da, 0x27915356), TOBN(0x7e0734b7, 0x001efee3), TOBN(0x54fab5bb, 0xd2b288e2), TOBN(0x4c630fc4, 0xf62dd09c), TOBN(0x8537107a, 0x1ac2703b), TOBN(0xb49258d8, 0x6bc857b5), TOBN(0x57df14de, 0xbcdaccd1), TOBN(0x24ab68d7, 0xc4ae8529), TOBN(0x7ed8b5d4, 0x734e59d0), TOBN(0x5f8740c8, 0xc495cc80), TOBN(0x84aedd5a, 0x291db9b3), TOBN(0x80b360f8, 0x4fb995be), TOBN(0xae915f5d, 0x5fa067d1), TOBN(0x4134b57f, 0x9668960c), TOBN(0xbd3656d6, 0xa48edaac), TOBN(0xdac1e3e4, 0xfc1d7436), TOBN(0x674ff869, 0xd81fbb26), TOBN(0x449ed3ec, 0xb26c33d4), TOBN(0x85138705, 0xd94203e8), TOBN(0xccde538b, 0xbeeb6f4a), TOBN(0x55d5c68d, 0xa61a76fa), TOBN(0x598b441d, 0xca1554dc), TOBN(0xd39923b9, 0x773b279c), TOBN(0x33331d3c, 0x36bf9efc), TOBN(0x2d4c848e, 0x298de399), TOBN(0xcfdb8e77, 0xa1a27f56), TOBN(0x94c855ea, 0x57b8ab70), TOBN(0xdcdb9dae, 0x6f7879ba), TOBN(0x7bdff8c2, 0x019f2a59), TOBN(0xb3ce5bb3, 0xcb4fbc74), TOBN(0xea907f68, 0x8a9173dd), TOBN(0x6cd3d0d3, 0x95a75439), TOBN(0x92ecc4d6, 0xefed021c), TOBN(0x09a9f9b0, 0x6a77339a), TOBN(0x87ca6b15, 0x7188c64a), TOBN(0x10c29968, 0x44899158), TOBN(0x5859a229, 0xed6e82ef), TOBN(0x16f338e3, 0x65ebaf4e), TOBN(0x0cd31387, 0x5ead67ae), TOBN(0x1c73d228, 0x54ef0bb4), TOBN(0x4cb55131, 0x74a5c8c7), TOBN(0x01cd2970, 0x7f69ad6a), TOBN(0xa04d00dd, 0xe966f87e), TOBN(0xd96fe447, 0x0b7b0321), TOBN(0x342ac06e, 0x88fbd381), TOBN(0x02cd4a84, 0x5c35a493), TOBN(0xe8fa89de, 0x54f1bbcd), TOBN(0x341d6367, 0x2575ed4c), TOBN(0xebe357fb, 0xd238202b), TOBN(0x600b4d1a, 0xa984ead9), TOBN(0xc35c9f44, 0x52436ea0), TOBN(0x96fe0a39, 0xa370751b), TOBN(0x4c4f0736, 0x7f636a38), TOBN(0x9f943fb7, 0x0e76d5cb), TOBN(0xb03510ba, 0xa8b68b8b), TOBN(0xc246780a, 0x9ed07a1f), TOBN(0x3c051415, 0x6d549fc2), TOBN(0xc2953f31, 0x607781ca), TOBN(0x955e2c69, 0xd8d95413), TOBN(0xb300fadc, 0x7bd282e3), TOBN(0x81fe7b50, 0x87e9189f), TOBN(0xdb17375c, 0xf42dda27), TOBN(0x22f7d896, 0xcf0a5904), TOBN(0xa0e57c5a, 0xebe348e6), TOBN(0xa61011d3, 0xf40e3c80), TOBN(0xb1189321, 0x8db705c5), TOBN(0x4ed9309e, 0x50fedec3), TOBN(0xdcf14a10, 0x4d6d5c1d), TOBN(0x056c265b, 0x55691342), TOBN(0xe8e08504, 0x91049dc7), TOBN(0x131329f5, 0xc9bae20a), TOBN(0x96c8b3e8, 0xd9dccdb4), TOBN(0x8c5ff838, 0xfb4ee6b4), TOBN(0xfc5a9aeb, 0x41e8ccf0), TOBN(0x7417b764, 0xfae050c6), TOBN(0x0953c3d7, 0x00452080), TOBN(0x21372682, 0x38dfe7e8), TOBN(0xea417e15, 0x2bb79d4b), TOBN(0x59641f1c, 0x76e7cf2d), TOBN(0x271e3059, 0xea0bcfcc), TOBN(0x624c7dfd, 0x7253ecbd), TOBN(0x2f552e25, 0x4fca6186), TOBN(0xcbf84ecd, 0x4d866e9c), TOBN(0x73967709, 0xf68d4610), TOBN(0xa14b1163, 0xc27901b4), TOBN(0xfd9236e0, 0x899b8bf3), TOBN(0x42b091ec, 0xcbc6da0a), TOBN(0xbb1dac6f, 0x5ad1d297), TOBN(0x80e61d53, 0xa91cf76e), TOBN(0x4110a412, 0xd31f1ee7), TOBN(0x2d87c3ba, 0x13efcf77), TOBN(0x1f374bb4, 0xdf450d76), TOBN(0x5e78e2f2, 0x0d188dab), TOBN(0xe3968ed0, 0xf4b885ef), TOBN(0x46c0568e, 0x7314570f), TOBN(0x31616338, 0x01170521), TOBN(0x18e1e7e2, 0x4f0c8afe), TOBN(0x4caa75ff, 0xdeea78da), TOBN(0x82db67f2, 0x7c5d8a51), TOBN(0x36a44d86, 0x6f505370), TOBN(0xd72c5bda, 0x0333974f), TOBN(0x5db516ae, 0x27a70146), TOBN(0x34705281, 0x210ef921), TOBN(0xbff17a8f, 0x0c9c38e5), TOBN(0x78f4814e, 0x12476da1), TOBN(0xc1e16613, 0x33c16980), TOBN(0x9e5b386f, 0x424d4bca), TOBN(0x4c274e87, 0xc85740de), TOBN(0xb6a9b88d, 0x6c2f5226), TOBN(0x14d1b944, 0x550d7ca8), TOBN(0x580c85fc, 0x1fc41709), TOBN(0xc1da368b, 0x54c6d519), TOBN(0x2b0785ce, 0xd5113cf7), TOBN(0x0670f633, 0x5a34708f), TOBN(0x46e23767, 0x15cc3f88), TOBN(0x1b480cfa, 0x50c72c8f), TOBN(0x20288602, 0x4147519a), TOBN(0xd0981eac, 0x26b372f0), TOBN(0xa9d4a7ca, 0xa785ebc8), TOBN(0xd953c50d, 0xdbdf58e9), TOBN(0x9d6361cc, 0xfd590f8f), TOBN(0x72e9626b, 0x44e6c917), TOBN(0x7fd96110, 0x22eb64cf), TOBN(0x863ebb7e, 0x9eb288f3), TOBN(0x6e6ab761, 0x6aca8ee7), TOBN(0x97d10b39, 0xd7b40358), TOBN(0x1687d377, 0x1e5feb0d), TOBN(0xc83e50e4, 0x8265a27a), TOBN(0x8f75a9fe, 0xc954b313), TOBN(0xcc2e8f47, 0x310d1f61), TOBN(0xf5ba81c5, 0x6557d0e0), TOBN(0x25f9680c, 0x3eaf6207), TOBN(0xf95c6609, 0x4354080b), TOBN(0x5225bfa5, 0x7bf2fe1c), TOBN(0xc5c004e2, 0x5c7d98fa), TOBN(0x3561bf1c, 0x019aaf60), TOBN(0x5e6f9f17, 0xba151474), TOBN(0xdec2f934, 0xb04f6eca), TOBN(0x64e368a1, 0x269acb1e), TOBN(0x1332d9e4, 0x0cdda493), TOBN(0x60d6cf69, 0xdf23de05), TOBN(0x66d17da2, 0x009339a0), TOBN(0x9fcac985, 0x0a693923), TOBN(0xbcf057fc, 0xed7c6a6d), TOBN(0xc3c5c8c5, 0xf0b5662c), TOBN(0x25318dd8, 0xdcba4f24), TOBN(0x60e8cb75, 0x082b69ff), TOBN(0x7c23b3ee, 0x1e728c01), TOBN(0x15e10a0a, 0x097e4403), TOBN(0xcb3d0a86, 0x19854665), TOBN(0x88d8e211, 0xd67d4826), TOBN(0xb39af66e, 0x0b9d2839), TOBN(0xa5f94588, 0xbd475ca8), TOBN(0xe06b7966, 0xc077b80b), TOBN(0xfedb1485, 0xda27c26c), TOBN(0xd290d33a, 0xfe0fd5e0), TOBN(0xa40bcc47, 0xf34fb0fa), TOBN(0xb4760cc8, 0x1fb1ab09), TOBN(0x8fca0993, 0xa273bfe3), TOBN(0x13e4fe07, 0xf70b213c), TOBN(0x3bcdb992, 0xfdb05163), TOBN(0x8c484b11, 0x0c2b19b6), TOBN(0x1acb815f, 0xaaf2e3e2), TOBN(0xc6905935, 0xb89ff1b4), TOBN(0xb2ad6f9d, 0x586e74e1), TOBN(0x488883ad, 0x67b80484), TOBN(0x758aa2c7, 0x369c3ddb), TOBN(0x8ab74e69, 0x9f9afd31), TOBN(0x10fc2d28, 0x5e21beb1), TOBN(0x3484518a, 0x318c42f9), TOBN(0x377427dc, 0x53cf40c3), TOBN(0x9de0781a, 0x391bc1d9), TOBN(0x8faee858, 0x693807e1), TOBN(0xa3865327, 0x4e81ccc7), TOBN(0x02c30ff2, 0x6f835b84), TOBN(0xb604437b, 0x0d3d38d4), TOBN(0xb3fc8a98, 0x5ca1823d), TOBN(0xb82f7ec9, 0x03be0324), TOBN(0xee36d761, 0xcf684a33), TOBN(0x5a01df0e, 0x9f29bf7d), TOBN(0x686202f3, 0x1306583d), TOBN(0x05b10da0, 0x437c622e), TOBN(0xbf9aaa0f, 0x076a7bc8), TOBN(0x25e94efb, 0x8f8f4e43), TOBN(0x8a35c9b7, 0xfa3dc26d), TOBN(0xe0e5fb93, 0x96ff03c5), TOBN(0xa77e3843, 0xebc394ce), TOBN(0xcede6595, 0x8361de60), TOBN(0xd27c22f6, 0xa1993545), TOBN(0xab01cc36, 0x24d671ba), TOBN(0x63fa2877, 0xa169c28e), TOBN(0x925ef904, 0x2eb08376), TOBN(0x3b2fa3cf, 0x53aa0b32), TOBN(0xb27beb5b, 0x71c49d7a), TOBN(0xb60e1834, 0xd105e27f), TOBN(0xd6089788, 0x4f68570d), TOBN(0x23094ce0, 0xd6fbc2ac), TOBN(0x738037a1, 0x815ff551), TOBN(0xda73b1bb, 0x6bef119c), TOBN(0xdcf6c430, 0xeef506ba), TOBN(0x00e4fe7b, 0xe3ef104a), TOBN(0xebdd9a2c, 0x0a065628), TOBN(0x853a81c3, 0x8792043e), TOBN(0x22ad6ece, 0xb3b59108), TOBN(0x9fb813c0, 0x39cd297d), TOBN(0x8ec7e16e, 0x05bda5d9), TOBN(0x2834797c, 0x0d104b96), TOBN(0xcc11a2e7, 0x7c511510), TOBN(0x96ca5a53, 0x96ee6380), TOBN(0x054c8655, 0xcea38742), TOBN(0xb5946852, 0xd54dfa7d), TOBN(0x97c422e7, 0x1f4ab207), TOBN(0xbf907509, 0x0c22b540), TOBN(0x2cde42aa, 0xb7c267d4), TOBN(0xba18f9ed, 0x5ab0d693), TOBN(0x3ba62aa6, 0x6e4660d9), TOBN(0xb24bf97b, 0xab9ea96a), TOBN(0x5d039642, 0xe3b60e32), TOBN(0x4e6a4506, 0x7c4d9bd5), TOBN(0x666c5b9e, 0x7ed4a6a4), TOBN(0xfa3fdcd9, 0x8edbd7cc), TOBN(0x4660bb87, 0xc6ccd753), TOBN(0x9ae90820, 0x21e6b64f), TOBN(0x8a56a713, 0xb36bfb3f), TOBN(0xabfce096, 0x5726d47f), TOBN(0x9eed01b2, 0x0b1a9a7f), TOBN(0x30e9cad4, 0x4eb74a37), TOBN(0x7b2524cc, 0x53e9666d), TOBN(0x6a29683b, 0x8f4b002f), TOBN(0xc2200d7a, 0x41f4fc20), TOBN(0xcf3af47a, 0x3a338acc), TOBN(0x6539a4fb, 0xe7128975), TOBN(0xcec31c14, 0xc33c7fcf), TOBN(0x7eb6799b, 0xc7be322b), TOBN(0x119ef4e9, 0x6646f623), TOBN(0x7b7a26a5, 0x54d7299b), TOBN(0xcb37f08d, 0x403f46f2), TOBN(0x94b8fc43, 0x1a0ec0c7), TOBN(0xbb8514e3, 0xc332142f), TOBN(0xf3ed2c33, 0xe80d2a7a), TOBN(0x8d2080af, 0xb639126c), TOBN(0xf7b6be60, 0xe3553ade), TOBN(0x3950aa9f, 0x1c7e2b09), TOBN(0x847ff958, 0x6410f02b), TOBN(0x877b7cf5, 0x678a31b0), TOBN(0xd50301ae, 0x3998b620), TOBN(0x734257c5, 0xc00fb396), TOBN(0xf9fb18a0, 0x04e672a6), TOBN(0xff8bd8eb, 0xe8758851), TOBN(0x1e64e4c6, 0x5d99ba44), TOBN(0x4b8eaedf, 0x7dfd93b7), TOBN(0xba2f2a98, 0x04e76b8c), TOBN(0x7d790cba, 0xe8053433), TOBN(0xc8e725a0, 0x3d2c9585), TOBN(0x58c5c476, 0xcdd8f5ed), TOBN(0xd106b952, 0xefa9fe1d), TOBN(0x3c5c775b, 0x0eff13a9), TOBN(0x242442ba, 0xe057b930), TOBN(0xe9f458d4, 0xc9b70cbd), TOBN(0x69b71448, 0xa3cdb89a), TOBN(0x41ee46f6, 0x0e2ed742), TOBN(0x573f1045, 0x40067493), TOBN(0xb1e154ff, 0x9d54c304), TOBN(0x2ad0436a, 0x8d3a7502), TOBN(0xee4aaa2d, 0x431a8121), TOBN(0xcd38b3ab, 0x886f11ed), TOBN(0x57d49ea6, 0x034a0eb7), TOBN(0xd2b773bd, 0xf7e85e58), TOBN(0x4a559ac4, 0x9b5c1f14), TOBN(0xc444be1a, 0x3e54df2b), TOBN(0x13aad704, 0xeda41891), TOBN(0xcd927bec, 0x5eb5c788), TOBN(0xeb3c8516, 0xe48c8a34), TOBN(0x1b7ac812, 0x4b546669), TOBN(0x1815f896, 0x594df8ec), TOBN(0x87c6a79c, 0x79227865), TOBN(0xae02a2f0, 0x9b56ddbd), TOBN(0x1339b5ac, 0x8a2f1cf3), TOBN(0xf2b569c7, 0x839dff0d), TOBN(0xb0b9e864, 0xfee9a43d), TOBN(0x4ff8ca41, 0x77bb064e), TOBN(0x145a2812, 0xfd249f63), TOBN(0x3ab7beac, 0xf86f689a), TOBN(0x9bafec27, 0x01d35f5e), TOBN(0x28054c65, 0x4265aa91), TOBN(0xa4b18304, 0x035efe42), TOBN(0x6887b0e6, 0x9639dec7), TOBN(0xf4b8f6ad, 0x3d52aea5), TOBN(0xfb9293cc, 0x971a8a13), TOBN(0x3f159e5d, 0x4c934d07), TOBN(0x2c50e9b1, 0x09acbc29), TOBN(0x08eb65e6, 0x7154d129), TOBN(0x4feff589, 0x30b75c3e), TOBN(0x0bb82fe2, 0x94491c93), TOBN(0xd8ac377a, 0x89af62bb), TOBN(0xd7b51490, 0x9685e49f), TOBN(0xabca9a7b, 0x04497f19), TOBN(0x1b35ed0a, 0x1a7ad13f), TOBN(0x6b601e21, 0x3ec86ed6), TOBN(0xda91fcb9, 0xce0c76f1), TOBN(0x9e28507b, 0xd7ab27e1), TOBN(0x7c19a555, 0x63945b7b), TOBN(0x6b43f0a1, 0xaafc9827), TOBN(0x443b4fbd, 0x3aa55b91), TOBN(0x962b2e65, 0x6962c88f), TOBN(0x139da8d4, 0xce0db0ca), TOBN(0xb93f05dd, 0x1b8d6c4f), TOBN(0x779cdff7, 0x180b9824), TOBN(0xbba23fdd, 0xae57c7b7), TOBN(0x345342f2, 0x1b932522), TOBN(0xfd9c80fe, 0x556d4aa3), TOBN(0xa03907ba, 0x6525bb61), TOBN(0x38b010e1, 0xff218933), TOBN(0xc066b654, 0xaa52117b), TOBN(0x8e141920, 0x94f2e6ea), TOBN(0x66a27dca, 0x0d32f2b2), TOBN(0x69c7f993, 0x048b3717), TOBN(0xbf5a989a, 0xb178ae1c), TOBN(0x49fa9058, 0x564f1d6b), TOBN(0x27ec6e15, 0xd31fde4e), TOBN(0x4cce0373, 0x7276e7fc), TOBN(0x64086d79, 0x89d6bf02), TOBN(0x5a72f046, 0x4ccdd979), TOBN(0x909c3566, 0x47775631), TOBN(0x1c07bc6b, 0x75dd7125), TOBN(0xb4c6bc97, 0x87a0428d), TOBN(0x507ece52, 0xfdeb6b9d), TOBN(0xfca56512, 0xb2c95432), TOBN(0x15d97181, 0xd0e8bd06), TOBN(0x384dd317, 0xc6bb46ea), TOBN(0x5441ea20, 0x3952b624), TOBN(0xbcf70dee, 0x4e7dc2fb), TOBN(0x372b016e, 0x6628e8c3), TOBN(0x07a0d667, 0xb60a7522), TOBN(0xcf05751b, 0x0a344ee2), TOBN(0x0ec09a48, 0x118bdeec), TOBN(0x6e4b3d4e, 0xd83dce46), TOBN(0x43a6316d, 0x99d2fc6e), TOBN(0xa99d8989, 0x56cf044c), TOBN(0x7c7f4454, 0xae3e5fb7), TOBN(0xb2e6b121, 0xfbabbe92), TOBN(0x281850fb, 0xe1330076), TOBN(0x093581ec, 0x97890015), TOBN(0x69b1dded, 0x75ff77f5), TOBN(0x7cf0b18f, 0xab105105), TOBN(0x953ced31, 0xa89ccfef), TOBN(0x3151f85f, 0xeb914009), TOBN(0x3c9f1b87, 0x88ed48ad), TOBN(0xc9aba1a1, 0x4a7eadcb), TOBN(0x928e7501, 0x522e71cf), TOBN(0xeaede727, 0x3a2e4f83), TOBN(0x467e10d1, 0x1ce3bbd3), TOBN(0xf3442ac3, 0xb955dcf0), TOBN(0xba96307d, 0xd3d5e527), TOBN(0xf763a10e, 0xfd77f474), TOBN(0x5d744bd0, 0x6a6e1ff0), TOBN(0xd287282a, 0xa777899e), TOBN(0xe20eda8f, 0xd03f3cde), TOBN(0x6a7e75bb, 0x50b07d31), TOBN(0x0b7e2a94, 0x6f379de4), TOBN(0x31cb64ad, 0x19f593cf), TOBN(0x7b1a9e4f, 0x1e76ef1d), TOBN(0xe18c9c9d, 0xb62d609c), TOBN(0x439bad6d, 0xe779a650), TOBN(0x219d9066, 0xe032f144), TOBN(0x1db632b8, 0xe8b2ec6a), TOBN(0xff0d0fd4, 0xfda12f78), TOBN(0x56fb4c2d, 0x2a25d265), TOBN(0x5f4e2ee1, 0x255a03f1), TOBN(0x61cd6af2, 0xe96af176), TOBN(0xe0317ba8, 0xd068bc97), TOBN(0x927d6bab, 0x264b988e), TOBN(0xa18f07e0, 0xe90fb21e), TOBN(0x00fd2b80, 0xbba7fca1), TOBN(0x20387f27, 0x95cd67b5), TOBN(0x5b89a4e7, 0xd39707f7), TOBN(0x8f83ad3f, 0x894407ce), TOBN(0xa0025b94, 0x6c226132), TOBN(0xc79563c7, 0xf906c13b), TOBN(0x5f548f31, 0x4e7bb025), TOBN(0x2b4c6b8f, 0xeac6d113), TOBN(0xa67e3f9c, 0x0e813c76), TOBN(0x3982717c, 0x3fe1f4b9), TOBN(0x58865819, 0x26d8050e), TOBN(0x99f3640c, 0xf7f06f20), TOBN(0xdc610216, 0x2a66ebc2), TOBN(0x52f2c175, 0x767a1e08), TOBN(0x05660e1a, 0x5999871b), TOBN(0x6b0f1762, 0x6d3c4693), TOBN(0xf0e7d627, 0x37ed7bea), TOBN(0xc51758c7, 0xb75b226d), TOBN(0x40a88628, 0x1f91613b), TOBN(0x889dbaa7, 0xbbb38ce0), TOBN(0xe0404b65, 0xbddcad81), TOBN(0xfebccd3a, 0x8bc9671f), TOBN(0xfbf9a357, 0xee1f5375), TOBN(0x5dc169b0, 0x28f33398), TOBN(0xb07ec11d, 0x72e90f65), TOBN(0xae7f3b4a, 0xfaab1eb1), TOBN(0xd970195e, 0x5f17538a), TOBN(0x52b05cbe, 0x0181e640), TOBN(0xf5debd62, 0x2643313d), TOBN(0x76148154, 0x5df31f82), TOBN(0x23e03b33, 0x3a9e13c5), TOBN(0xff758949, 0x4fde0c1f), TOBN(0xbf8a1abe, 0xe5b6ec20), TOBN(0x702278fb, 0x87e1db6c), TOBN(0xc447ad7a, 0x35ed658f), TOBN(0x48d4aa38, 0x03d0ccf2), TOBN(0x80acb338, 0x819a7c03), TOBN(0x9bc7c89e, 0x6e17cecc), TOBN(0x46736b8b, 0x03be1d82), TOBN(0xd65d7b60, 0xc0432f96), TOBN(0xddebe7a3, 0xdeb5442f), TOBN(0x79a25307, 0x7dff69a2), TOBN(0x37a56d94, 0x02cf3122), TOBN(0x8bab8aed, 0xf2350d0a), TOBN(0x13c3f276, 0x037b0d9a), TOBN(0xc664957c, 0x44c65cae), TOBN(0x88b44089, 0xc2e71a88), TOBN(0xdb88e5a3, 0x5cb02664), TOBN(0x5d4c0bf1, 0x8686c72e), TOBN(0xea3d9b62, 0xa682d53e), TOBN(0x9b605ef4, 0x0b2ad431), TOBN(0x71bac202, 0xc69645d0), TOBN(0xa115f03a, 0x6a1b66e7), TOBN(0xfe2c563a, 0x158f4dc4), TOBN(0xf715b3a0, 0x4d12a78c), TOBN(0x8f7f0a48, 0xd413213a), TOBN(0x2035806d, 0xc04becdb), TOBN(0xecd34a99, 0x5d8587f5), TOBN(0x4d8c3079, 0x9f6d3a71), TOBN(0x1b2a2a67, 0x8d95a8f6), TOBN(0xc58c9d7d, 0xf2110d0d), TOBN(0xdeee81d5, 0xcf8fba3f), TOBN(0xa42be3c0, 0x0c7cdf68), TOBN(0x2126f742, 0xd43b5eaa), TOBN(0x054a0766, 0xdfa59b85), TOBN(0x9d0d5e36, 0x126bfd45), TOBN(0xa1f8fbd7, 0x384f8a8f), TOBN(0x317680f5, 0xd563fccc), TOBN(0x48ca5055, 0xf280a928), TOBN(0xe00b81b2, 0x27b578cf), TOBN(0x10aad918, 0x2994a514), TOBN(0xd9e07b62, 0xb7bdc953), TOBN(0x9f0f6ff2, 0x5bc086dd), TOBN(0x09d1ccff, 0x655eee77), TOBN(0x45475f79, 0x5bef7df1), TOBN(0x3faa28fa, 0x86f702cc), TOBN(0x92e60905, 0x0f021f07), TOBN(0xe9e62968, 0x7f8fa8c6), TOBN(0xbd71419a, 0xf036ea2c), TOBN(0x171ee1cc, 0x6028da9a), TOBN(0x5352fe1a, 0xc251f573), TOBN(0xf8ff236e, 0x3fa997f4), TOBN(0xd831b6c9, 0xa5749d5f), TOBN(0x7c872e1d, 0xe350e2c2), TOBN(0xc56240d9, 0x1e0ce403), TOBN(0xf9deb077, 0x6974f5cb), TOBN(0x7d50ba87, 0x961c3728), TOBN(0xd6f89426, 0x5a3a2518), TOBN(0xcf817799, 0xc6303d43), TOBN(0x510a0471, 0x619e5696), TOBN(0xab049ff6, 0x3a5e307b), TOBN(0xe4cdf9b0, 0xfeb13ec7), TOBN(0xd5e97117, 0x9d8ff90c), TOBN(0xf6f64d06, 0x9afa96af), TOBN(0x00d0bf5e, 0x9d2012a2), TOBN(0xe63f301f, 0x358bcdc0), TOBN(0x07689e99, 0x0a9d47f8), TOBN(0x1f689e2f, 0x4f43d43a), TOBN(0x4d542a16, 0x90920904), TOBN(0xaea293d5, 0x9ca0a707), TOBN(0xd061fe45, 0x8ac68065), TOBN(0x1033bf1b, 0x0090008c), TOBN(0x29749558, 0xc08a6db6), TOBN(0x74b5fc59, 0xc1d5d034), TOBN(0xf712e9f6, 0x67e215e0), TOBN(0xfd520cbd, 0x860200e6), TOBN(0x0229acb4, 0x3ea22588), TOBN(0x9cd1e14c, 0xfff0c82e), TOBN(0x87684b62, 0x59c69e73), TOBN(0xda85e61c, 0x96ccb989), TOBN(0x2d5dbb02, 0xa3d06493), TOBN(0xf22ad33a, 0xe86b173c), TOBN(0xe8e41ea5, 0xa79ff0e3), TOBN(0x01d2d725, 0xdd0d0c10), TOBN(0x31f39088, 0x032d28f9), TOBN(0x7b3f71e1, 0x7829839e), TOBN(0x0cf691b4, 0x4502ae58), TOBN(0xef658dbd, 0xbefc6115), TOBN(0xa5cd6ee5, 0xb3ab5314), TOBN(0x206c8d7b, 0x5f1d2347), TOBN(0x794645ba, 0x4cc2253a), TOBN(0xd517d8ff, 0x58389e08), TOBN(0x4fa20dee, 0x9f847288), TOBN(0xeba072d8, 0xd797770a), TOBN(0x7360c91d, 0xbf429e26), TOBN(0x7200a3b3, 0x80af8279), TOBN(0x6a1c9150, 0x82dadce3), TOBN(0x0ee6d3a7, 0xc35d8794), TOBN(0x042e6558, 0x0356bae5), TOBN(0x9f59698d, 0x643322fd), TOBN(0x9379ae15, 0x50a61967), TOBN(0x64b9ae62, 0xfcc9981e), TOBN(0xaed3d631, 0x6d2934c6), TOBN(0x2454b302, 0x5e4e65eb), TOBN(0xab09f647, 0xf9950428)}, {TOBN(0xb2083a12, 0x22248acc), TOBN(0x1f6ec0ef, 0x3264e366), TOBN(0x5659b704, 0x5afdee28), TOBN(0x7a823a40, 0xe6430bb5), TOBN(0x24592a04, 0xe1900a79), TOBN(0xcde09d4a, 0xc9ee6576), TOBN(0x52b6463f, 0x4b5ea54a), TOBN(0x1efe9ed3, 0xd3ca65a7), TOBN(0xe27a6dbe, 0x305406dd), TOBN(0x8eb7dc7f, 0xdd5d1957), TOBN(0xf54a6876, 0x387d4d8f), TOBN(0x9c479409, 0xc7762de4), TOBN(0xbe4d5b5d, 0x99b30778), TOBN(0x25380c56, 0x6e793682), TOBN(0x602d37f3, 0xdac740e3), TOBN(0x140deabe, 0x1566e4ae), TOBN(0x4481d067, 0xafd32acf), TOBN(0xd8f0fcca, 0xe1f71ccf), TOBN(0xd208dd0c, 0xb596f2da), TOBN(0xd049d730, 0x9aad93f9), TOBN(0xc79f263d, 0x42ab580e), TOBN(0x09411bb1, 0x23f707b4), TOBN(0x8cfde1ff, 0x835e0eda), TOBN(0x72707490, 0x90f03402), TOBN(0xeaee6126, 0xc49a861e), TOBN(0x024f3b65, 0xe14f0d06), TOBN(0x51a3f1e8, 0xc69bfc17), TOBN(0xc3c3a8e9, 0xa7686381), TOBN(0x3400752c, 0xb103d4c8), TOBN(0x02bc4613, 0x9218b36b), TOBN(0xc67f75eb, 0x7651504a), TOBN(0xd6848b56, 0xd02aebfa), TOBN(0xbd9802e6, 0xc30fa92b), TOBN(0x5a70d96d, 0x9a552784), TOBN(0x9085c4ea, 0x3f83169b), TOBN(0xfa9423bb, 0x06908228), TOBN(0x2ffebe12, 0xfe97a5b9), TOBN(0x85da6049, 0x71b99118), TOBN(0x9cbc2f7f, 0x63178846), TOBN(0xfd96bc70, 0x9153218e), TOBN(0x958381db, 0x1782269b), TOBN(0xae34bf79, 0x2597e550), TOBN(0xbb5c6064, 0x5f385153), TOBN(0x6f0e96af, 0xe3088048), TOBN(0xbf6a0215, 0x77884456), TOBN(0xb3b5688c, 0x69310ea7), TOBN(0x17c94295, 0x04fad2de), TOBN(0xe020f0e5, 0x17896d4d), TOBN(0x730ba0ab, 0x0976505f), TOBN(0x567f6813, 0x095e2ec5), TOBN(0x47062010, 0x6331ab71), TOBN(0x72cfa977, 0x41d22b9f), TOBN(0x33e55ead, 0x8a2373da), TOBN(0xa8d0d5f4, 0x7ba45a68), TOBN(0xba1d8f9c, 0x03029d15), TOBN(0x8f34f1cc, 0xfc55b9f3), TOBN(0xcca4428d, 0xbbe5a1a9), TOBN(0x8187fd5f, 0x3126bd67), TOBN(0x0036973a, 0x48105826), TOBN(0xa39b6663, 0xb8bd61a0), TOBN(0x6d42deef, 0x2d65a808), TOBN(0x4969044f, 0x94636b19), TOBN(0xf611ee47, 0xdd5d564c), TOBN(0x7b2f3a49, 0xd2873077), TOBN(0x94157d45, 0x300eb294), TOBN(0x2b2a656e, 0x169c1494), TOBN(0xc000dd76, 0xd3a47aa9), TOBN(0xa2864e4f, 0xa6243ea4), TOBN(0x82716c47, 0xdb89842e), TOBN(0x12dfd7d7, 0x61479fb7), TOBN(0x3b9a2c56, 0xe0b2f6dc), TOBN(0x46be862a, 0xd7f85d67), TOBN(0x03b0d8dd, 0x0f82b214), TOBN(0x460c34f9, 0xf103cbc6), TOBN(0xf32e5c03, 0x18d79e19), TOBN(0x8b8888ba, 0xa84117f8), TOBN(0x8f3c37dc, 0xc0722677), TOBN(0x10d21be9, 0x1c1c0f27), TOBN(0xd47c8468, 0xe0f7a0c6), TOBN(0x9bf02213, 0xadecc0e0), TOBN(0x0baa7d12, 0x42b48b99), TOBN(0x1bcb665d, 0x48424096), TOBN(0x8b847cd6, 0xebfb5cfb), TOBN(0x87c2ae56, 0x9ad4d10d), TOBN(0xf1cbb122, 0x0de36726), TOBN(0xe7043c68, 0x3fdfbd21), TOBN(0x4bd0826a, 0x4e79d460), TOBN(0x11f5e598, 0x4bd1a2cb), TOBN(0x97554160, 0xb7fe7b6e), TOBN(0x7d16189a, 0x400a3fb2), TOBN(0xd73e9bea, 0xe328ca1e), TOBN(0x0dd04b97, 0xe793d8cc), TOBN(0xa9c83c9b, 0x506db8cc), TOBN(0x5cd47aae, 0xcf38814c), TOBN(0x26fc430d, 0xb64b45e6), TOBN(0x079b5499, 0xd818ea84), TOBN(0xebb01102, 0xc1c24a3b), TOBN(0xca24e568, 0x1c161c1a), TOBN(0x103eea69, 0x36f00a4a), TOBN(0x9ad76ee8, 0x76176c7b), TOBN(0x97451fc2, 0x538e0ff7), TOBN(0x94f89809, 0x6604b3b0), TOBN(0x6311436e, 0x3249cfd7), TOBN(0x27b4a7bd, 0x41224f69), TOBN(0x03b5d21a, 0xe0ac2941), TOBN(0x279b0254, 0xc2d31937), TOBN(0x3307c052, 0xcac992d0), TOBN(0x6aa7cb92, 0xefa8b1f3), TOBN(0x5a182580, 0x0d37c7a5), TOBN(0x13380c37, 0x342d5422), TOBN(0x92ac2d66, 0xd5d2ef92), TOBN(0x035a70c9, 0x030c63c6), TOBN(0xc16025dd, 0x4ce4f152), TOBN(0x1f419a71, 0xf9df7c06), TOBN(0x6d5b2214, 0x91e4bb14), TOBN(0xfc43c6cc, 0x839fb4ce), TOBN(0x49f06591, 0x925d6b2d), TOBN(0x4b37d9d3, 0x62186598), TOBN(0x8c54a971, 0xd01b1629), TOBN(0xe1a9c29f, 0x51d50e05), TOBN(0x5109b785, 0x71ba1861), TOBN(0x48b22d5c, 0xd0c8f93d), TOBN(0xe8fa84a7, 0x8633bb93), TOBN(0x53fba6ba, 0x5aebbd08), TOBN(0x7ff27df3, 0xe5eea7d8), TOBN(0x521c8796, 0x68ca7158), TOBN(0xb9d5133b, 0xce6f1a05), TOBN(0x2d50cd53, 0xfd0ebee4), TOBN(0xc82115d6, 0xc5a3ef16), TOBN(0x993eff9d, 0xba079221), TOBN(0xe4da2c5e, 0x4b5da81c), TOBN(0x9a89dbdb, 0x8033fd85), TOBN(0x60819ebf, 0x2b892891), TOBN(0x53902b21, 0x5d14a4d5), TOBN(0x6ac35051, 0xd7fda421), TOBN(0xcc6ab885, 0x61c83284), TOBN(0x14eba133, 0xf74cff17), TOBN(0x240aaa03, 0xecb813f2), TOBN(0xcfbb6540, 0x6f665bee), TOBN(0x084b1fe4, 0xa425ad73), TOBN(0x009d5d16, 0xd081f6a6), TOBN(0x35304fe8, 0xeef82c90), TOBN(0xf20346d5, 0xaa9eaa22), TOBN(0x0ada9f07, 0xac1c91e3), TOBN(0xa6e21678, 0x968a6144), TOBN(0x54c1f77c, 0x07b31a1e), TOBN(0xd6bb787e, 0x5781fbe1), TOBN(0x61bd2ee0, 0xe31f1c4a), TOBN(0xf25aa1e9, 0x781105fc), TOBN(0x9cf2971f, 0x7b2f8e80), TOBN(0x26d15412, 0xcdff919b), TOBN(0x01db4ebe, 0x34bc896e), TOBN(0x7d9b3e23, 0xb40df1cf), TOBN(0x59337373, 0x94e971b4), TOBN(0xbf57bd14, 0x669cf921), TOBN(0x865daedf, 0x0c1a1064), TOBN(0x3eb70bd3, 0x83279125), TOBN(0xbc3d5b9f, 0x34ecdaab), TOBN(0x91e3ed7e, 0x5f755caf), TOBN(0x49699f54, 0xd41e6f02), TOBN(0x185770e1, 0xd4a7a15b), TOBN(0x08f3587a, 0xeaac87e7), TOBN(0x352018db, 0x473133ea), TOBN(0x674ce719, 0x04fd30fc), TOBN(0x7b8d9835, 0x088b3e0e), TOBN(0x7a0356a9, 0x5d0d47a1), TOBN(0x9d9e7659, 0x6474a3c4), TOBN(0x61ea48a7, 0xff66966c), TOBN(0x30417758, 0x0f3e4834), TOBN(0xfdbb21c2, 0x17a9afcb), TOBN(0x756fa17f, 0x2f9a67b3), TOBN(0x2a6b2421, 0xa245c1a8), TOBN(0x64be2794, 0x4af02291), TOBN(0xade465c6, 0x2a5804fe), TOBN(0x8dffbd39, 0xa6f08fd7), TOBN(0xc4efa84c, 0xaa14403b), TOBN(0xa1b91b2a, 0x442b0f5c), TOBN(0xb748e317, 0xcf997736), TOBN(0x8d1b62bf, 0xcee90e16), TOBN(0x907ae271, 0x0b2078c0), TOBN(0xdf31534b, 0x0c9bcddd), TOBN(0x043fb054, 0x39adce83), TOBN(0x99031043, 0xd826846a), TOBN(0x61a9c0d6, 0xb144f393), TOBN(0xdab48046, 0x47718427), TOBN(0xdf17ff9b, 0x6e830f8b), TOBN(0x408d7ee8, 0xe49a1347), TOBN(0x6ac71e23, 0x91c1d4ae), TOBN(0xc8cbb9fd, 0x1defd73c), TOBN(0x19840657, 0xbbbbfec5), TOBN(0x39db1cb5, 0x9e7ef8ea), TOBN(0x78aa8296, 0x64105f30), TOBN(0xa3d9b7f0, 0xa3738c29), TOBN(0x0a2f235a, 0xbc3250a3), TOBN(0x55e506f6, 0x445e4caf), TOBN(0x0974f73d, 0x33475f7a), TOBN(0xd37dbba3, 0x5ba2f5a8), TOBN(0x542c6e63, 0x6af40066), TOBN(0x26d99b53, 0xc5d73e2c), TOBN(0x06060d7d, 0x6c3ca33e), TOBN(0xcdbef1c2, 0x065fef4a), TOBN(0x77e60f7d, 0xfd5b92e3), TOBN(0xd7c549f0, 0x26708350), TOBN(0x201b3ad0, 0x34f121bf), TOBN(0x5fcac2a1, 0x0334fc14), TOBN(0x8a9a9e09, 0x344552f6), TOBN(0x7dd8a1d3, 0x97653082), TOBN(0x5fc0738f, 0x79d4f289), TOBN(0x787d244d, 0x17d2d8c3), TOBN(0xeffc6345, 0x70830684), TOBN(0x5ddb96dd, 0xe4f73ae5), TOBN(0x8efb14b1, 0x172549a5), TOBN(0x6eb73eee, 0x2245ae7a), TOBN(0xbca4061e, 0xea11f13e), TOBN(0xb577421d, 0x30b01f5d), TOBN(0xaa688b24, 0x782e152c), TOBN(0x67608e71, 0xbd3502ba), TOBN(0x4ef41f24, 0xb4de75a0), TOBN(0xb08dde5e, 0xfd6125e5), TOBN(0xde484825, 0xa409543f), TOBN(0x1f198d98, 0x65cc2295), TOBN(0x428a3771, 0x6e0edfa2), TOBN(0x4f9697a2, 0xadf35fc7), TOBN(0x01a43c79, 0xf7cac3c7), TOBN(0xb05d7059, 0x0fd3659a), TOBN(0x8927f30c, 0xbb7f2d9a), TOBN(0x4023d1ac, 0x8cf984d3), TOBN(0x32125ed3, 0x02897a45), TOBN(0xfb572dad, 0x3d414205), TOBN(0x73000ef2, 0xe3fa82a9), TOBN(0x4c0868e9, 0xf10a5581), TOBN(0x5b61fc67, 0x6b0b3ca5), TOBN(0xc1258d5b, 0x7cae440c), TOBN(0x21c08b41, 0x402b7531), TOBN(0xf61a8955, 0xde932321), TOBN(0x3568faf8, 0x2d1408af), TOBN(0x71b15e99, 0x9ecf965b), TOBN(0xf14ed248, 0xe917276f), TOBN(0xc6f4caa1, 0x820cf9e2), TOBN(0x681b20b2, 0x18d83c7e), TOBN(0x6cde738d, 0xc6c01120), TOBN(0x71db0813, 0xae70e0db), TOBN(0x95fc0644, 0x74afe18c), TOBN(0x34619053, 0x129e2be7), TOBN(0x80615cea, 0xdb2a3b15), TOBN(0x0a49a19e, 0xdb4c7073), TOBN(0x0e1b84c8, 0x8fd2d367), TOBN(0xd74bf462, 0x033fb8aa), TOBN(0x889f6d65, 0x533ef217), TOBN(0x7158c7e4, 0xc3ca2e87), TOBN(0xfb670dfb, 0xdc2b4167), TOBN(0x75910a01, 0x844c257f), TOBN(0xf336bf07, 0xcf88577d), TOBN(0x22245250, 0xe45e2ace), TOBN(0x2ed92e8d, 0x7ca23d85), TOBN(0x29f8be4c, 0x2b812f58), TOBN(0xdd9ebaa7, 0x076fe12b), TOBN(0x3f2400cb, 0xae1537f9), TOBN(0x1aa93528, 0x17bdfb46), TOBN(0xc0f98430, 0x67883b41), TOBN(0x5590ede1, 0x0170911d), TOBN(0x7562f5bb, 0x34d4b17f), TOBN(0xe1fa1df2, 0x1826b8d2), TOBN(0xb40b796a, 0x6bd80d59), TOBN(0xd65bf197, 0x3467ba92), TOBN(0x8c9b46db, 0xf70954b0), TOBN(0x97c8a0f3, 0x0e78f15d), TOBN(0xa8f3a69a, 0x85a4c961), TOBN(0x4242660f, 0x61e4ce9b), TOBN(0xbf06aab3, 0x6ea6790c), TOBN(0xc6706f8e, 0xec986416), TOBN(0x9e56dec1, 0x9a9fc225), TOBN(0x527c46f4, 0x9a9898d9), TOBN(0xd799e77b, 0x5633cdef), TOBN(0x24eacc16, 0x7d9e4297), TOBN(0xabb61cea, 0x6b1cb734), TOBN(0xbee2e8a7, 0xf778443c), TOBN(0x3bb42bf1, 0x29de2fe6), TOBN(0xcbed86a1, 0x3003bb6f), TOBN(0xd3918e6c, 0xd781cdf6), TOBN(0x4bee3271, 0x9a5103f1), TOBN(0x5243efc6, 0xf50eac06), TOBN(0xb8e122cb, 0x6adcc119), TOBN(0x1b7faa84, 0xc0b80a08), TOBN(0x32c3d1bd, 0x6dfcd08c), TOBN(0x129dec4e, 0x0be427de), TOBN(0x98ab679c, 0x1d263c83), TOBN(0xafc83cb7, 0xcef64eff), TOBN(0x85eb6088, 0x2fa6be76), TOBN(0x892585fb, 0x1328cbfe), TOBN(0xc154d3ed, 0xcf618dda), TOBN(0xc44f601b, 0x3abaf26e), TOBN(0x7bf57d0b, 0x2be1fdfd), TOBN(0xa833bd2d, 0x21137fee), TOBN(0x9353af36, 0x2db591a8), TOBN(0xc76f26dc, 0x5562a056), TOBN(0x1d87e47d, 0x3fdf5a51), TOBN(0x7afb5f93, 0x55c9cab0), TOBN(0x91bbf58f, 0x89e0586e), TOBN(0x7c72c018, 0x0d843709), TOBN(0xa9a5aafb, 0x99b5c3dc), TOBN(0xa48a0f1d, 0x3844aeb0), TOBN(0x7178b7dd, 0xb667e482), TOBN(0x453985e9, 0x6e23a59a), TOBN(0x4a54c860, 0x01b25dd8), TOBN(0x0dd37f48, 0xfb897c8a), TOBN(0x5f8aa610, 0x0ea90cd9), TOBN(0xc8892c68, 0x16d5830d), TOBN(0xeb4befc0, 0xef514ca5), TOBN(0x478eb679, 0xe72c9ee6), TOBN(0x9bca20da, 0xdbc40d5f), TOBN(0xf015de21, 0xdde4f64a), TOBN(0xaa6a4de0, 0xeaf4b8a5), TOBN(0x68cfd9ca, 0x4bc60e32), TOBN(0x668a4b01, 0x7fd15e70), TOBN(0xd9f0694a, 0xf27dc09d), TOBN(0xf6c3cad5, 0xba708bcd), TOBN(0x5cd2ba69, 0x5bb95c2a), TOBN(0xaa28c1d3, 0x33c0a58f), TOBN(0x23e274e3, 0xabc77870), TOBN(0x44c3692d, 0xdfd20a4a), TOBN(0x091c5fd3, 0x81a66653), TOBN(0x6c0bb691, 0x09a0757d), TOBN(0x9072e8b9, 0x667343ea), TOBN(0x31d40eb0, 0x80848bec), TOBN(0x95bd480a, 0x79fd36cc), TOBN(0x01a77c61, 0x65ed43f5), TOBN(0xafccd127, 0x2e0d40bf), TOBN(0xeccfc82d, 0x1cc1884b), TOBN(0xc85ac201, 0x5d4753b4), TOBN(0xc7a6caac, 0x658e099f), TOBN(0xcf46369e, 0x04b27390), TOBN(0xe2e7d049, 0x506467ea), TOBN(0x481b63a2, 0x37cdeccc), TOBN(0x4029abd8, 0xed80143a), TOBN(0x28bfe3c7, 0xbcb00b88), TOBN(0x3bec1009, 0x0643d84a), TOBN(0x885f3668, 0xabd11041), TOBN(0xdb02432c, 0xf83a34d6), TOBN(0x32f7b360, 0x719ceebe), TOBN(0xf06c7837, 0xdad1fe7a), TOBN(0x60a157a9, 0x5441a0b0), TOBN(0x704970e9, 0xe2d47550), TOBN(0xcd2bd553, 0x271b9020), TOBN(0xff57f82f, 0x33e24a0b), TOBN(0x9cbee23f, 0xf2565079), TOBN(0x16353427, 0xeb5f5825), TOBN(0x276feec4, 0xe948d662), TOBN(0xd1b62bc6, 0xda10032b), TOBN(0x718351dd, 0xf0e72a53), TOBN(0x93452076, 0x2420e7ba), TOBN(0x96368fff, 0x3a00118d), TOBN(0x00ce2d26, 0x150a49e4), TOBN(0x0c28b636, 0x3f04706b), TOBN(0xbad65a46, 0x58b196d0), TOBN(0x6c8455fc, 0xec9f8b7c), TOBN(0xe90c895f, 0x2d71867e), TOBN(0x5c0be31b, 0xedf9f38c), TOBN(0x2a37a15e, 0xd8f6ec04), TOBN(0x239639e7, 0x8cd85251), TOBN(0xd8975315, 0x9c7c4c6b), TOBN(0x603aa3c0, 0xd7409af7), TOBN(0xb8d53d0c, 0x007132fb), TOBN(0x68d12af7, 0xa6849238), TOBN(0xbe0607e7, 0xbf5d9279), TOBN(0x9aa50055, 0xaada74ce), TOBN(0xe81079cb, 0xba7e8ccb), TOBN(0x610c71d1, 0xa5f4ff5e), TOBN(0x9e2ee1a7, 0x5aa07093), TOBN(0xca84004b, 0xa75da47c), TOBN(0x074d3951, 0x3de75401), TOBN(0xf938f756, 0xbb311592), TOBN(0x96197618, 0x00a43421), TOBN(0x39a25362, 0x07bc78c8), TOBN(0x278f710a, 0x0a171276), TOBN(0xb28446ea, 0x8d1a8f08), TOBN(0x184781bf, 0xe3b6a661), TOBN(0x7751cb1d, 0xe6d279f7), TOBN(0xf8ff95d6, 0xc59eb662), TOBN(0x186d90b7, 0x58d3dea7), TOBN(0x0e4bb6c1, 0xdfb4f754), TOBN(0x5c5cf56b, 0x2b2801dc), TOBN(0xc561e452, 0x1f54564d), TOBN(0xb4fb8c60, 0xf0dd7f13), TOBN(0xf8849630, 0x33ff98c7), TOBN(0x9619fffa, 0xcf17769c), TOBN(0xf8090bf6, 0x1bfdd80a), TOBN(0x14d9a149, 0x422cfe63), TOBN(0xb354c360, 0x6f6df9ea), TOBN(0xdbcf770d, 0x218f17ea), TOBN(0x207db7c8, 0x79eb3480), TOBN(0x213dbda8, 0x559b6a26), TOBN(0xac4c200b, 0x29fc81b3), TOBN(0xebc3e09f, 0x171d87c1), TOBN(0x91799530, 0x1481aa9e), TOBN(0x051b92e1, 0x92e114fa), TOBN(0xdf8f92e9, 0xecb5537f), TOBN(0x44b1b2cc, 0x290c7483), TOBN(0xa711455a, 0x2adeb016), TOBN(0x964b6856, 0x81a10c2c), TOBN(0x4f159d99, 0xcec03623), TOBN(0x05532225, 0xef3271ea), TOBN(0xb231bea3, 0xc5ee4849), TOBN(0x57a54f50, 0x7094f103), TOBN(0x3e2d421d, 0x9598b352), TOBN(0xe865a49c, 0x67412ab4), TOBN(0xd2998a25, 0x1cc3a912), TOBN(0x5d092808, 0x0c74d65d), TOBN(0x73f45908, 0x4088567a), TOBN(0xeb6b280e, 0x1f214a61), TOBN(0x8c9adc34, 0xcaf0c13d), TOBN(0x39d12938, 0xf561fb80), TOBN(0xb2dc3a5e, 0xbc6edfb4), TOBN(0x7485b1b1, 0xfe4d210e), TOBN(0x062e0400, 0xe186ae72), TOBN(0x91e32d5c, 0x6eeb3b88), TOBN(0x6df574d7, 0x4be59224), TOBN(0xebc88ccc, 0x716d55f3), TOBN(0x26c2e6d0, 0xcad6ed33), TOBN(0xc6e21e7d, 0x0d3e8b10), TOBN(0x2cc5840e, 0x5bcc36bb), TOBN(0x9292445e, 0x7da74f69), TOBN(0x8be8d321, 0x4e5193a8), TOBN(0x3ec23629, 0x8df06413), TOBN(0xc7e9ae85, 0xb134defa), TOBN(0x6073b1d0, 0x1bb2d475), TOBN(0xb9ad615e, 0x2863c00d), TOBN(0x9e29493d, 0x525f4ac4), TOBN(0xc32b1dea, 0x4e9acf4f), TOBN(0x3e1f01c8, 0xa50db88d), TOBN(0xb05d70ea, 0x04da916c), TOBN(0x714b0d0a, 0xd865803e), TOBN(0x4bd493fc, 0x9920cb5e), TOBN(0x5b44b1f7, 0x92c7a3ac), TOBN(0xa2a77293, 0xbcec9235), TOBN(0x5ee06e87, 0xcd378553), TOBN(0xceff8173, 0xda621607), TOBN(0x2bb03e4c, 0x99f5d290), TOBN(0x2945106a, 0xa6f734ac), TOBN(0xb5056604, 0xd25c4732), TOBN(0x5945920c, 0xe079afee), TOBN(0x686e17a0, 0x6789831f), TOBN(0x5966bee8, 0xb74a5ae5), TOBN(0x38a673a2, 0x1e258d46), TOBN(0xbd1cc1f2, 0x83141c95), TOBN(0x3b2ecf4f, 0x0e96e486), TOBN(0xcd3aa896, 0x74e5fc78), TOBN(0x415ec10c, 0x2482fa7a), TOBN(0x15234419, 0x80503380), TOBN(0x513d917a, 0xd314b392), TOBN(0xb0b52f4e, 0x63caecae), TOBN(0x07bf22ad, 0x2dc7780b), TOBN(0xe761e8a1, 0xe4306839), TOBN(0x1b3be962, 0x5dd7feaa), TOBN(0x4fe728de, 0x74c778f1), TOBN(0xf1fa0bda, 0x5e0070f6), TOBN(0x85205a31, 0x6ec3f510), TOBN(0x2c7e4a14, 0xd2980475), TOBN(0xde3c19c0, 0x6f30ebfd), TOBN(0xdb1c1f38, 0xd4b7e644), TOBN(0xfe291a75, 0x5dce364a), TOBN(0xb7b22a3c, 0x058f5be3), TOBN(0x2cd2c302, 0x37fea38c), TOBN(0x2930967a, 0x2e17be17), TOBN(0x87f009de, 0x0c061c65), TOBN(0xcb014aac, 0xedc6ed44), TOBN(0x49bd1cb4, 0x3bafb1eb), TOBN(0x81bd8b5c, 0x282d3688), TOBN(0x1cdab87e, 0xf01a17af), TOBN(0x21f37ac4, 0xe710063b), TOBN(0x5a6c5676, 0x42fc8193), TOBN(0xf4753e70, 0x56a6015c), TOBN(0x020f795e, 0xa15b0a44), TOBN(0x8f37c8d7, 0x8958a958), TOBN(0x63b7e89b, 0xa4b675b5), TOBN(0xb4fb0c0c, 0x0fc31aea), TOBN(0xed95e639, 0xa7ff1f2e), TOBN(0x9880f5a3, 0x619614fb), TOBN(0xdeb6ff02, 0x947151ab), TOBN(0x5bc5118c, 0xa868dcdb), TOBN(0xd8da2055, 0x4c20cea5), TOBN(0xcac2776e, 0x14c4d69a), TOBN(0xcccb22c1, 0x622d599b), TOBN(0xa4ddb653, 0x68a9bb50), TOBN(0x2c4ff151, 0x1b4941b4), TOBN(0xe1ff19b4, 0x6efba588), TOBN(0x35034363, 0xc48345e0), TOBN(0x45542e3d, 0x1e29dfc4), TOBN(0xf197cb91, 0x349f7aed), TOBN(0x3b2b5a00, 0x8fca8420), TOBN(0x7c175ee8, 0x23aaf6d8), TOBN(0x54dcf421, 0x35af32b6), TOBN(0x0ba14307, 0x27d6561e), TOBN(0x879d5ee4, 0xd175b1e2), TOBN(0xc7c43673, 0x99807db5), TOBN(0x77a54455, 0x9cd55bcd), TOBN(0xe6c2ff13, 0x0105c072), TOBN(0x18f7a99f, 0x8dda7da4), TOBN(0x4c301820, 0x0e2d35c1), TOBN(0x06a53ca0, 0xd9cc6c82), TOBN(0xaa21cc1e, 0xf1aa1d9e), TOBN(0x32414334, 0x4a75b1e8), TOBN(0x2a6d1328, 0x0ebe9fdc), TOBN(0x16bd173f, 0x98a4755a), TOBN(0xfbb9b245, 0x2133ffd9), TOBN(0x39a8b2f1, 0x830f1a20), TOBN(0x484bc97d, 0xd5a1f52a), TOBN(0xd6aebf56, 0xa40eddf8), TOBN(0x32257acb, 0x76ccdac6), TOBN(0xaf4d36ec, 0x1586ff27), TOBN(0x8eaa8863, 0xf8de7dd1), TOBN(0x0045d5cf, 0x88647c16)}, {TOBN(0xa6f3d574, 0xc005979d), TOBN(0xc2072b42, 0x6a40e350), TOBN(0xfca5c156, 0x8de2ecf9), TOBN(0xa8c8bf5b, 0xa515344e), TOBN(0x97aee555, 0x114df14a), TOBN(0xd4374a4d, 0xfdc5ec6b), TOBN(0x754cc28f, 0x2ca85418), TOBN(0x71cb9e27, 0xd3c41f78), TOBN(0x89105079, 0x03605c39), TOBN(0xf0843d9e, 0xa142c96c), TOBN(0xf3744934, 0x16923684), TOBN(0x732caa2f, 0xfa0a2893), TOBN(0xb2e8c270, 0x61160170), TOBN(0xc32788cc, 0x437fbaa3), TOBN(0x39cd818e, 0xa6eda3ac), TOBN(0xe2e94239, 0x9e2b2e07), TOBN(0x6967d39b, 0x0260e52a), TOBN(0xd42585cc, 0x90653325), TOBN(0x0d9bd605, 0x21ca7954), TOBN(0x4fa20877, 0x81ed57b3), TOBN(0x60c1eff8, 0xe34a0bbe), TOBN(0x56b0040c, 0x84f6ef64), TOBN(0x28be2b24, 0xb1af8483), TOBN(0xb2278163, 0xf5531614), TOBN(0x8df27545, 0x5922ac1c), TOBN(0xa7b3ef5c, 0xa52b3f63), TOBN(0x8e77b214, 0x71de57c4), TOBN(0x31682c10, 0x834c008b), TOBN(0xc76824f0, 0x4bd55d31), TOBN(0xb6d1c086, 0x17b61c71), TOBN(0x31db0903, 0xc2a5089d), TOBN(0x9c092172, 0x184e5d3f), TOBN(0xdd7ced5b, 0xc00cc638), TOBN(0x1a2015eb, 0x61278fc2), TOBN(0x2e8e5288, 0x6a37f8d6), TOBN(0xc457786f, 0xe79933ad), TOBN(0xb3fe4cce, 0x2c51211a), TOBN(0xad9b10b2, 0x24c20498), TOBN(0x90d87a4f, 0xd28db5e5), TOBN(0x698cd105, 0x3aca2fc3), TOBN(0x4f112d07, 0xe91b536d), TOBN(0xceb982f2, 0x9eba09d6), TOBN(0x3c157b2c, 0x197c396f), TOBN(0xe23c2d41, 0x7b66eb24), TOBN(0x480c57d9, 0x3f330d37), TOBN(0xb3a4c8a1, 0x79108deb), TOBN(0x702388de, 0xcb199ce5), TOBN(0x0b019211, 0xb944a8d4), TOBN(0x24f2a692, 0x840bb336), TOBN(0x7c353bdc, 0xa669fa7b), TOBN(0xda20d6fc, 0xdec9c300), TOBN(0x625fbe2f, 0xa13a4f17), TOBN(0xa2b1b61a, 0xdbc17328), TOBN(0x008965bf, 0xa9515621), TOBN(0x49690939, 0xc620ff46), TOBN(0x182dd27d, 0x8717e91c), TOBN(0x5ace5035, 0xea6c3997), TOBN(0x54259aaa, 0xc2610bef), TOBN(0xef18bb3f, 0x3c80dd39), TOBN(0x6910b95b, 0x5fc3fa39), TOBN(0xfce2f510, 0x43e09aee), TOBN(0xced56c9f, 0xa7675665), TOBN(0x10e265ac, 0xd872db61), TOBN(0x6982812e, 0xae9fce69), TOBN(0x29be11c6, 0xce800998), TOBN(0x72bb1752, 0xb90360d9), TOBN(0x2c193197, 0x5a4ad590), TOBN(0x2ba2f548, 0x9fc1dbc0), TOBN(0x7fe4eebb, 0xe490ebe0), TOBN(0x12a0a4cd, 0x7fae11c0), TOBN(0x7197cf81, 0xe903ba37), TOBN(0xcf7d4aa8, 0xde1c6dd8), TOBN(0x92af6bf4, 0x3fd5684c), TOBN(0x2b26eecf, 0x80360aa1), TOBN(0xbd960f30, 0x00546a82), TOBN(0x407b3c43, 0xf59ad8fe), TOBN(0x86cae5fe, 0x249c82ba), TOBN(0x9e0faec7, 0x2463744c), TOBN(0x87f551e8, 0x94916272), TOBN(0x033f9344, 0x6ceb0615), TOBN(0x1e5eb0d1, 0x8be82e84), TOBN(0x89967f0e, 0x7a582fef), TOBN(0xbcf687d5, 0xa6e921fa), TOBN(0xdfee4cf3, 0xd37a09ba), TOBN(0x94f06965, 0xb493c465), TOBN(0x638b9a1c, 0x7635c030), TOBN(0x76667864, 0x66f05e9f), TOBN(0xccaf6808, 0xc04da725), TOBN(0xca2eb690, 0x768fccfc), TOBN(0xf402d37d, 0xb835b362), TOBN(0x0efac0d0, 0xe2fdfcce), TOBN(0xefc9cdef, 0xb638d990), TOBN(0x2af12b72, 0xd1669a8b), TOBN(0x33c536bc, 0x5774ccbd), TOBN(0x30b21909, 0xfb34870e), TOBN(0xc38fa2f7, 0x7df25aca), TOBN(0x74c5f02b, 0xbf81f3f5), TOBN(0x0525a5ae, 0xaf7e4581), TOBN(0x88d2aaba, 0x433c54ae), TOBN(0xed9775db, 0x806a56c5), TOBN(0xd320738a, 0xc0edb37d), TOBN(0x25fdb6ee, 0x66cc1f51), TOBN(0xac661d17, 0x10600d76), TOBN(0x931ec1f3, 0xbdd1ed76), TOBN(0x65c11d62, 0x19ee43f1), TOBN(0x5cd57c3e, 0x60829d97), TOBN(0xd26c91a3, 0x984be6e8), TOBN(0xf08d9309, 0x8b0c53bd), TOBN(0x94bc9e5b, 0xc016e4ea), TOBN(0xd3916839, 0x11d43d2b), TOBN(0x886c5ad7, 0x73701155), TOBN(0xe0377626, 0x20b00715), TOBN(0x7f01c9ec, 0xaa80ba59), TOBN(0x3083411a, 0x68538e51), TOBN(0x970370f1, 0xe88128af), TOBN(0x625cc3db, 0x91dec14b), TOBN(0xfef9666c, 0x01ac3107), TOBN(0xb2a8d577, 0xd5057ac3), TOBN(0xb0f26299, 0x92be5df7), TOBN(0xf579c8e5, 0x00353924), TOBN(0xb8fa3d93, 0x1341ed7a), TOBN(0x4223272c, 0xa7b59d49), TOBN(0x3dcb1947, 0x83b8c4a4), TOBN(0x4e413c01, 0xed1302e4), TOBN(0x6d999127, 0xe17e44ce), TOBN(0xee86bf75, 0x33b3adfb), TOBN(0xf6902fe6, 0x25aa96ca), TOBN(0xb73540e4, 0xe5aae47d), TOBN(0x32801d7b, 0x1b4a158c), TOBN(0xe571c99e, 0x27e2a369), TOBN(0x40cb76c0, 0x10d9f197), TOBN(0xc308c289, 0x3167c0ae), TOBN(0xa6ef9dd3, 0xeb7958f2), TOBN(0xa7226dfc, 0x300879b1), TOBN(0x6cd0b362, 0x7edf0636), TOBN(0x4efbce6c, 0x7bc37eed), TOBN(0x75f92a05, 0x8d699021), TOBN(0x586d4c79, 0x772566e3), TOBN(0x378ca5f1, 0x761ad23a), TOBN(0x650d86fc, 0x1465a8ac), TOBN(0x7a4ed457, 0x842ba251), TOBN(0x6b65e3e6, 0x42234933), TOBN(0xaf1543b7, 0x31aad657), TOBN(0xa4cefe98, 0xcbfec369), TOBN(0xb587da90, 0x9f47befb), TOBN(0x6562e9fb, 0x41312d13), TOBN(0xa691ea59, 0xeff1cefe), TOBN(0xcc30477a, 0x05fc4cf6), TOBN(0xa1632461, 0x0b0ffd3d), TOBN(0xa1f16f3b, 0x5b355956), TOBN(0x5b148d53, 0x4224ec24), TOBN(0xdc834e7b, 0xf977012a), TOBN(0x7bfc5e75, 0xb2c69dbc), TOBN(0x3aa77a29, 0x03c3da6c), TOBN(0xde0df03c, 0xca910271), TOBN(0xcbd5ca4a, 0x7806dc55), TOBN(0xe1ca5807, 0x6db476cb), TOBN(0xfde15d62, 0x5f37a31e), TOBN(0xf49af520, 0xf41af416), TOBN(0x96c5c5b1, 0x7d342db5), TOBN(0x155c43b7, 0xeb4ceb9b), TOBN(0x2e993010, 0x4e77371a), TOBN(0x1d2987da, 0x675d43af), TOBN(0xef2bc1c0, 0x8599fd72), TOBN(0x96894b7b, 0x9342f6b2), TOBN(0x201eadf2, 0x7c8e71f0), TOBN(0xf3479d9f, 0x4a1f3efc), TOBN(0xe0f8a742, 0x702a9704), TOBN(0xeafd44b6, 0xb3eba40c), TOBN(0xf9739f29, 0xc1c1e0d0), TOBN(0x0091471a, 0x619d505e), TOBN(0xc15f9c96, 0x9d7c263e), TOBN(0x5be47285, 0x83afbe33), TOBN(0xa3b6d6af, 0x04f1e092), TOBN(0xe76526b9, 0x751a9d11), TOBN(0x2ec5b26d, 0x9a4ae4d2), TOBN(0xeb66f4d9, 0x02f6fb8d), TOBN(0x4063c561, 0x96912164), TOBN(0xeb7050c1, 0x80ef3000), TOBN(0x288d1c33, 0xeaa5b3f0), TOBN(0xe87c68d6, 0x07806fd8), TOBN(0xb2f7f9d5, 0x4bbbf50f), TOBN(0x25972f3a, 0xac8d6627), TOBN(0xf8547774, 0x10e8c13b), TOBN(0xcc50ef6c, 0x872b4a60), TOBN(0xab2a34a4, 0x4613521b), TOBN(0x39c5c190, 0x983e15d1), TOBN(0x61dde5df, 0x59905512), TOBN(0xe417f621, 0x9f2275f3), TOBN(0x0750c8b6, 0x451d894b), TOBN(0x75b04ab9, 0x78b0bdaa), TOBN(0x3bfd9fd4, 0x458589bd), TOBN(0xf1013e30, 0xee9120b6), TOBN(0x2b51af93, 0x23a4743e), TOBN(0xea96ffae, 0x48d14d9e), TOBN(0x71dc0dbe, 0x698a1d32), TOBN(0x914962d2, 0x0180cca4), TOBN(0x1ae60677, 0xc3568963), TOBN(0x8cf227b1, 0x437bc444), TOBN(0xc650c83b, 0xc9962c7a), TOBN(0x23c2c7dd, 0xfe7ccfc4), TOBN(0xf925c89d, 0x1b929d48), TOBN(0x4460f74b, 0x06783c33), TOBN(0xac2c8d49, 0xa590475a), TOBN(0xfb40b407, 0xb807bba0), TOBN(0x9d1e362d, 0x69ff8f3a), TOBN(0xa33e9681, 0xcbef64a4), TOBN(0x67ece5fa, 0x332fb4b2), TOBN(0x6900a99b, 0x739f10e3), TOBN(0xc3341ca9, 0xff525925), TOBN(0xee18a626, 0xa9e2d041), TOBN(0xa5a83685, 0x29580ddd), TOBN(0xf3470c81, 0x9d7de3cd), TOBN(0xedf02586, 0x2062cf9c), TOBN(0xf43522fa, 0xc010edb0), TOBN(0x30314135, 0x13a4b1ae), TOBN(0xc792e02a, 0xdb22b94b), TOBN(0x993d8ae9, 0xa1eaa45b), TOBN(0x8aad6cd3, 0xcd1e1c63), TOBN(0x89529ca7, 0xc5ce688a), TOBN(0x2ccee3aa, 0xe572a253), TOBN(0xe02b6438, 0x02a21efb), TOBN(0xa7091b6e, 0xc9430358), TOBN(0x06d1b1fa, 0x9d7db504), TOBN(0x58846d32, 0xc4744733), TOBN(0x40517c71, 0x379f9e34), TOBN(0x2f65655f, 0x130ef6ca), TOBN(0x526e4488, 0xf1f3503f), TOBN(0x8467bd17, 0x7ee4a976), TOBN(0x1d9dc913, 0x921363d1), TOBN(0xd8d24c33, 0xb069e041), TOBN(0x5eb5da0a, 0x2cdf7f51), TOBN(0x1c0f3cb1, 0x197b994f), TOBN(0x3c95a6c5, 0x2843eae9), TOBN(0x7766ffc9, 0xa6097ea5), TOBN(0x7bea4093, 0xd723b867), TOBN(0xb48e1f73, 0x4db378f9), TOBN(0x70025b00, 0xe37b77ac), TOBN(0x943dc8e7, 0xaf24ad46), TOBN(0xb98a15ac, 0x16d00a85), TOBN(0x3adc38ba, 0x2743b004), TOBN(0xb1c7f4f7, 0x334415ee), TOBN(0xea43df8f, 0x1e62d05a), TOBN(0x32618905, 0x9d76a3b6), TOBN(0x2fbd0bb5, 0xa23a0f46), TOBN(0x5bc971db, 0x6a01918c), TOBN(0x7801d94a, 0xb4743f94), TOBN(0xb94df65e, 0x676ae22b), TOBN(0xaafcbfab, 0xaf95894c), TOBN(0x7b9bdc07, 0x276b2241), TOBN(0xeaf98362, 0x5bdda48b), TOBN(0x5977faf2, 0xa3fcb4df), TOBN(0xbed042ef, 0x052c4b5b), TOBN(0x9fe87f71, 0x067591f0), TOBN(0xc89c73ca, 0x22f24ec7), TOBN(0x7d37fa9e, 0xe64a9f1b), TOBN(0x2710841a, 0x15562627), TOBN(0x2c01a613, 0xc243b034), TOBN(0x1d135c56, 0x2bc68609), TOBN(0xc2ca1715, 0x8b03f1f6), TOBN(0xc9966c2d, 0x3eb81d82), TOBN(0xc02abf4a, 0x8f6df13e), TOBN(0x77b34bd7, 0x8f72b43b), TOBN(0xaff6218f, 0x360c82b0), TOBN(0x0aa5726c, 0x8d55b9d2), TOBN(0xdc0adbe9, 0x99e9bffb), TOBN(0x9097549c, 0xefb9e72a), TOBN(0x16755712, 0x9dfb3111), TOBN(0xdd8bf984, 0xf26847f9), TOBN(0xbcb8e387, 0xdfb30cb7), TOBN(0xc1fd32a7, 0x5171ef9c), TOBN(0x977f3fc7, 0x389b363f), TOBN(0x116eaf2b, 0xf4babda0), TOBN(0xfeab68bd, 0xf7113c8e), TOBN(0xd1e3f064, 0xb7def526), TOBN(0x1ac30885, 0xe0b3fa02), TOBN(0x1c5a6e7b, 0x40142d9d), TOBN(0x839b5603, 0x30921c0b), TOBN(0x48f301fa, 0x36a116a3), TOBN(0x380e1107, 0xcfd9ee6d), TOBN(0x7945ead8, 0x58854be1), TOBN(0x4111c12e, 0xcbd4d49d), TOBN(0xece3b1ec, 0x3a29c2ef), TOBN(0x6356d404, 0x8d3616f5), TOBN(0x9f0d6a8f, 0x594d320e), TOBN(0x0989316d, 0xf651ccd2), TOBN(0x6c32117a, 0x0f8fdde4), TOBN(0x9abe5cc5, 0xa26a9bbc), TOBN(0xcff560fb, 0x9723f671), TOBN(0x21b2a12d, 0x7f3d593c), TOBN(0xe4cb18da, 0x24ba0696), TOBN(0x186e2220, 0xc3543384), TOBN(0x722f64e0, 0x88312c29), TOBN(0x94282a99, 0x17dc7752), TOBN(0x62467bbf, 0x5a85ee89), TOBN(0xf435c650, 0xf10076a0), TOBN(0xc9ff1539, 0x43b3a50b), TOBN(0x7132130c, 0x1a53efbc), TOBN(0x31bfe063, 0xf7b0c5b7), TOBN(0xb0179a7d, 0x4ea994cc), TOBN(0x12d064b3, 0xc85f455b), TOBN(0x47259328, 0x8f6e0062), TOBN(0xf64e590b, 0xb875d6d9), TOBN(0x22dd6225, 0xad92bcc7), TOBN(0xb658038e, 0xb9c3bd6d), TOBN(0x00cdb0d6, 0xfbba27c8), TOBN(0x0c681337, 0x1062c45d), TOBN(0xd8515b8c, 0x2d33407d), TOBN(0xcb8f699e, 0x8cbb5ecf), TOBN(0x8c4347f8, 0xc608d7d8), TOBN(0x2c11850a, 0xbb3e00db), TOBN(0x20a8dafd, 0xecb49d19), TOBN(0xbd781480, 0x45ee2f40), TOBN(0x75e354af, 0x416b60cf), TOBN(0xde0b58a1, 0x8d49a8c4), TOBN(0xe40e94e2, 0xfa359536), TOBN(0xbd4fa59f, 0x62accd76), TOBN(0x05cf466a, 0x8c762837), TOBN(0xb5abda99, 0x448c277b), TOBN(0x5a9e01bf, 0x48b13740), TOBN(0x9d457798, 0x326aad8d), TOBN(0xbdef4954, 0xc396f7e7), TOBN(0x6fb274a2, 0xc253e292), TOBN(0x2800bf0a, 0x1cfe53e7), TOBN(0x22426d31, 0x44438fd4), TOBN(0xef233923, 0x5e259f9a), TOBN(0x4188503c, 0x03f66264), TOBN(0x9e5e7f13, 0x7f9fdfab), TOBN(0x565eb76c, 0x5fcc1aba), TOBN(0xea632548, 0x59b5bff8), TOBN(0x5587c087, 0xaab6d3fa), TOBN(0x92b639ea, 0x6ce39c1b), TOBN(0x0706e782, 0x953b135c), TOBN(0x7308912e, 0x425268ef), TOBN(0x599e92c7, 0x090e7469), TOBN(0x83b90f52, 0x9bc35e75), TOBN(0x4750b3d0, 0x244975b3), TOBN(0xf3a44358, 0x11965d72), TOBN(0x179c6774, 0x9c8dc751), TOBN(0xff18cdfe, 0xd23d9ff0), TOBN(0xc4013833, 0x2028e247), TOBN(0x96e280e2, 0xf3bfbc79), TOBN(0xf60417bd, 0xd0880a84), TOBN(0x263c9f3d, 0x2a568151), TOBN(0x36be15b3, 0x2d2ce811), TOBN(0x846dc0c2, 0xf8291d21), TOBN(0x5cfa0ecb, 0x789fcfdb), TOBN(0x45a0beed, 0xd7535b9a), TOBN(0xec8e9f07, 0x96d69af1), TOBN(0x31a7c5b8, 0x599ab6dc), TOBN(0xd36d45ef, 0xf9e2e09f), TOBN(0x3cf49ef1, 0xdcee954b), TOBN(0x6be34cf3, 0x086cff9b), TOBN(0x88dbd491, 0x39a3360f), TOBN(0x1e96b8cc, 0x0dbfbd1d), TOBN(0xc1e5f7bf, 0xcb7e2552), TOBN(0x0547b214, 0x28819d98), TOBN(0xc770dd9c, 0x7aea9dcb), TOBN(0xaef0d4c7, 0x041d68c8), TOBN(0xcc2b9818, 0x13cb9ba8), TOBN(0x7fc7bc76, 0xfe86c607), TOBN(0x6b7b9337, 0x502a9a95), TOBN(0x1948dc27, 0xd14dab63), TOBN(0x249dd198, 0xdae047be), TOBN(0xe8356584, 0xa981a202), TOBN(0x3531dd18, 0x3a893387), TOBN(0x1be11f90, 0xc85c7209), TOBN(0x93d2fe1e, 0xe2a52b5a), TOBN(0x8225bfe2, 0xec6d6b97), TOBN(0x9cf6d6f4, 0xbd0aa5de), TOBN(0x911459cb, 0x54779f5f), TOBN(0x5649cddb, 0x86aeb1f3), TOBN(0x32133579, 0x3f26ce5a), TOBN(0xc289a102, 0x550f431e), TOBN(0x559dcfda, 0x73b84c6f), TOBN(0x84973819, 0xee3ac4d7), TOBN(0xb51e55e6, 0xf2606a82), TOBN(0xe25f7061, 0x90f2fb57), TOBN(0xacef6c2a, 0xb1a4e37c), TOBN(0x864e359d, 0x5dcf2706), TOBN(0x479e6b18, 0x7ce57316), TOBN(0x2cab2500, 0x3a96b23d), TOBN(0xed489862, 0x8ef16df7), TOBN(0x2056538c, 0xef3758b5), TOBN(0xa7df865e, 0xf15d3101), TOBN(0x80c5533a, 0x61b553d7), TOBN(0x366e1997, 0x4ed14294), TOBN(0x6620741f, 0xb3c0bcd6), TOBN(0x21d1d9c4, 0xedc45418), TOBN(0x005b859e, 0xc1cc4a9d), TOBN(0xdf01f630, 0xa1c462f0), TOBN(0x15d06cf3, 0xf26820c7), TOBN(0x9f7f24ee, 0x3484be47), TOBN(0x2ff33e96, 0x4a0c902f), TOBN(0x00bdf457, 0x5a0bc453), TOBN(0x2378dfaf, 0x1aa238db), TOBN(0x272420ec, 0x856720f2), TOBN(0x2ad9d95b, 0x96797291), TOBN(0xd1242cc6, 0x768a1558), TOBN(0x2e287f8b, 0x5cc86aa8), TOBN(0x796873d0, 0x990cecaa), TOBN(0xade55f81, 0x675d4080), TOBN(0x2645eea3, 0x21f0cd84), TOBN(0x7a1efa0f, 0xb4e17d02), TOBN(0xf6858420, 0x037cc061), TOBN(0x682e05f0, 0xd5d43e12), TOBN(0x59c36994, 0x27218710), TOBN(0x85cbba4d, 0x3f7cd2fc), TOBN(0x726f9729, 0x7a3cd22a), TOBN(0x9f8cd5dc, 0x4a628397), TOBN(0x17b93ab9, 0xc23165ed), TOBN(0xff5f5dbf, 0x122823d4), TOBN(0xc1e4e4b5, 0x654a446d), TOBN(0xd1a9496f, 0x677257ba), TOBN(0x6387ba94, 0xde766a56), TOBN(0x23608bc8, 0x521ec74a), TOBN(0x16a522d7, 0x6688c4d4), TOBN(0x9d6b4282, 0x07373abd), TOBN(0xa62f07ac, 0xb42efaa3), TOBN(0xf73e00f7, 0xe3b90180), TOBN(0x36175fec, 0x49421c3e), TOBN(0xc4e44f9b, 0x3dcf2678), TOBN(0x76df436b, 0x7220f09f), TOBN(0x172755fb, 0x3aa8b6cf), TOBN(0xbab89d57, 0x446139cc), TOBN(0x0a0a6e02, 0x5fe0208f), TOBN(0xcdbb63e2, 0x11e5d399), TOBN(0x33ecaa12, 0xa8977f0b), TOBN(0x59598b21, 0xf7c42664), TOBN(0xb3e91b32, 0xab65d08a), TOBN(0x035822ee, 0xf4502526), TOBN(0x1dcf0176, 0x720a82a9), TOBN(0x50f8598f, 0x3d589e02), TOBN(0xdf0478ff, 0xb1d63d2c), TOBN(0x8b8068bd, 0x1571cd07), TOBN(0x30c3aa4f, 0xd79670cd), TOBN(0x25e8fd4b, 0x941ade7f), TOBN(0x3d1debdc, 0x32790011), TOBN(0x65b6dcbd, 0x3a3f9ff0), TOBN(0x282736a4, 0x793de69c), TOBN(0xef69a0c3, 0xd41d3bd3), TOBN(0xb533b8c9, 0x07a26bde), TOBN(0xe2801d97, 0xdb2edf9f), TOBN(0xdc4a8269, 0xe1877af0), TOBN(0x6c1c5851, 0x3d590dbe), TOBN(0x84632f6b, 0xee4e9357), TOBN(0xd36d36b7, 0x79b33374), TOBN(0xb46833e3, 0x9bbca2e6), TOBN(0x37893913, 0xf7fc0586), TOBN(0x385315f7, 0x66bf4719), TOBN(0x72c56293, 0xb31855dc), TOBN(0xd1416d4e, 0x849061fe), TOBN(0xbeb3ab78, 0x51047213), TOBN(0x447f6e61, 0xf040c996), TOBN(0xd06d310d, 0x638b1d0c), TOBN(0xe28a413f, 0xbad1522e), TOBN(0x685a76cb, 0x82003f86), TOBN(0x610d07f7, 0x0bcdbca3), TOBN(0x6ff66021, 0x9ca4c455), TOBN(0x7df39b87, 0xcea10eec), TOBN(0xb9255f96, 0xe22db218), TOBN(0x8cc6d9eb, 0x08a34c44), TOBN(0xcd4ffb86, 0x859f9276), TOBN(0x8fa15eb2, 0x50d07335), TOBN(0xdf553845, 0xcf2c24b5), TOBN(0x89f66a9f, 0x52f9c3ba), TOBN(0x8f22b5b9, 0xe4a7ceb3), TOBN(0xaffef809, 0x0e134686), TOBN(0x3e53e1c6, 0x8eb8fac2), TOBN(0x93c1e4eb, 0x28aec98e), TOBN(0xb6b91ec5, 0x32a43bcb), TOBN(0x2dbfa947, 0xb2d74a51), TOBN(0xe065d190, 0xca84bad7), TOBN(0xfb13919f, 0xad58e65c), TOBN(0x3c41718b, 0xf1cb6e31), TOBN(0x688969f0, 0x06d05c3f), TOBN(0xd4f94ce7, 0x21264d45), TOBN(0xfdfb65e9, 0x7367532b), TOBN(0x5b1be8b1, 0x0945a39d), TOBN(0x229f789c, 0x2b8baf3b), TOBN(0xd8f41f3e, 0x6f49f15d), TOBN(0x678ce828, 0x907f0792), TOBN(0xc69ace82, 0xfca6e867), TOBN(0x106451ae, 0xd01dcc89), TOBN(0x1bb4f7f0, 0x19fc32d2), TOBN(0x64633dfc, 0xb00c52d2), TOBN(0x8f13549a, 0xad9ea445), TOBN(0x99a3bf50, 0xfb323705), TOBN(0x0c9625a2, 0x534d4dbc), TOBN(0x45b8f1d1, 0xc2a2fea3), TOBN(0x76ec21a1, 0xa530fc1a), TOBN(0x4bac9c2a, 0x9e5bd734), TOBN(0x5996d76a, 0x7b4e3587), TOBN(0x0045cdee, 0x1182d9e3), TOBN(0x1aee24b9, 0x1207f13d), TOBN(0x66452e97, 0x97345a41), TOBN(0x16e5b054, 0x9f950cd0), TOBN(0x9cc72fb1, 0xd7fdd075), TOBN(0x6edd61e7, 0x66249663), TOBN(0xde4caa4d, 0xf043cccb), TOBN(0x11b1f57a, 0x55c7ac17), TOBN(0x779cbd44, 0x1a85e24d), TOBN(0x78030f86, 0xe46081e7), TOBN(0xfd4a6032, 0x8e20f643), TOBN(0xcc7a6488, 0x0a750c0f), TOBN(0x39bacfe3, 0x4e548e83), TOBN(0x3d418c76, 0x0c110f05), TOBN(0x3e4daa4c, 0xb1f11588), TOBN(0x2733e7b5, 0x5ffc69ff), TOBN(0x46f147bc, 0x92053127), TOBN(0x885b2434, 0xd722df94), TOBN(0x6a444f65, 0xe6fc6b7c)}, {TOBN(0x7a1a465a, 0xc3f16ea8), TOBN(0x115a461d, 0xb2f1d11c), TOBN(0x4767dd95, 0x6c68a172), TOBN(0x3392f2eb, 0xd13a4698), TOBN(0xc7a99ccd, 0xe526cdc7), TOBN(0x8e537fdc, 0x22292b81), TOBN(0x76d8cf69, 0xa6d39198), TOBN(0xffc5ff43, 0x2446852d), TOBN(0x97b14f7e, 0xa90567e6), TOBN(0x513257b7, 0xb6ae5cb7), TOBN(0x85454a3c, 0x9f10903d), TOBN(0xd8d2c9ad, 0x69bc3724), TOBN(0x38da9324, 0x6b29cb44), TOBN(0xb540a21d, 0x77c8cbac), TOBN(0x9bbfe435, 0x01918e42), TOBN(0xfffa707a, 0x56c3614e), TOBN(0x0ce4e3f1, 0xd4e353b7), TOBN(0x062d8a14, 0xef46b0a0), TOBN(0x6408d5ab, 0x574b73fd), TOBN(0xbc41d1c9, 0xd3273ffd), TOBN(0x3538e1e7, 0x6be77800), TOBN(0x71fe8b37, 0xc5655031), TOBN(0x1cd91621, 0x6b9b331a), TOBN(0xad825d0b, 0xbb388f73), TOBN(0x56c2e05b, 0x1cb76219), TOBN(0x0ec0bf91, 0x71567e7e), TOBN(0xe7076f86, 0x61c4c910), TOBN(0xd67b085b, 0xbabc04d9), TOBN(0x9fb90459, 0x5e93a96a), TOBN(0x7526c1ea, 0xfbdc249a), TOBN(0x0d44d367, 0xecdd0bb7), TOBN(0x95399917, 0x9dc0d695), TOBN(0x61360ee9, 0x9e240d18), TOBN(0x057cdcac, 0xb4b94466), TOBN(0xe7667cd1, 0x2fe5325c), TOBN(0x1fa297b5, 0x21974e3b), TOBN(0xfa4081e7, 0xdb083d76), TOBN(0x31993be6, 0xf206bd15), TOBN(0x8949269b, 0x14c19f8c), TOBN(0x21468d72, 0xa9d92357), TOBN(0x2ccbc583, 0xa4c506ec), TOBN(0x957ed188, 0xd1acfe97), TOBN(0x8baed833, 0x12f1aea2), TOBN(0xef2a6cb4, 0x8325362d), TOBN(0x130dde42, 0x8e195c43), TOBN(0xc842025a, 0x0e6050c6), TOBN(0x2da972a7, 0x08686a5d), TOBN(0xb52999a1, 0xe508b4a8), TOBN(0xd9f090b9, 0x10a5a8bd), TOBN(0xca91d249, 0x096864da), TOBN(0x8e6a93be, 0x3f67dbc1), TOBN(0xacae6fba, 0xf5f4764c), TOBN(0x1563c6e0, 0xd21411a0), TOBN(0x28fa787f, 0xda0a4ad8), TOBN(0xd524491c, 0x908c8030), TOBN(0x1257ba0e, 0x4c795f07), TOBN(0x83f49167, 0xceca9754), TOBN(0x426d2cf6, 0x4b7939a0), TOBN(0x2555e355, 0x723fd0bf), TOBN(0xa96e6d06, 0xc4f144e2), TOBN(0x4768a8dd, 0x87880e61), TOBN(0x15543815, 0xe508e4d5), TOBN(0x09d7e772, 0xb1b65e15), TOBN(0x63439dd6, 0xac302fa0), TOBN(0xb93f802f, 0xc14e35c2), TOBN(0x71735b7c, 0x4341333c), TOBN(0x03a25104, 0x16d4f362), TOBN(0x3f4d069b, 0xbf433c8e), TOBN(0x0d83ae01, 0xf78f5a7c), TOBN(0x50a8ffbe, 0x7c4eed07), TOBN(0xc74f8906, 0x76e10f83), TOBN(0x7d080966, 0x9ddaf8e1), TOBN(0xb11df8e1, 0x698e04cc), TOBN(0x877be203, 0x169005c8), TOBN(0x32749e8c, 0x4f3c6179), TOBN(0x2dbc9d0a, 0x7853fc05), TOBN(0x187d4f93, 0x9454d937), TOBN(0xe682ce9d, 0xb4800e1b), TOBN(0xa9129ad8, 0x165e68e8), TOBN(0x0fe29735, 0xbe7f785b), TOBN(0x5303f40c, 0x5b9e02b7), TOBN(0xa37c9692, 0x35ee04e8), TOBN(0x5f46cc20, 0x34d6632b), TOBN(0x55ef72b2, 0x96ac545b), TOBN(0xabec5c1f, 0x7b91b062), TOBN(0x0a79e1c7, 0xbb33e821), TOBN(0xbb04b428, 0x3a9f4117), TOBN(0x0de1f28f, 0xfd2a475a), TOBN(0x31019ccf, 0x3a4434b4), TOBN(0xa3458111, 0x1a7954dc), TOBN(0xa9dac80d, 0xe34972a7), TOBN(0xb043d054, 0x74f6b8dd), TOBN(0x021c319e, 0x11137b1a), TOBN(0x00a754ce, 0xed5cc03f), TOBN(0x0aa2c794, 0xcbea5ad4), TOBN(0x093e67f4, 0x70c015b6), TOBN(0x72cdfee9, 0xc97e3f6b), TOBN(0xc10bcab4, 0xb6da7461), TOBN(0x3b02d2fc, 0xb59806b9), TOBN(0x85185e89, 0xa1de6f47), TOBN(0x39e6931f, 0x0eb6c4d4), TOBN(0x4d4440bd, 0xd4fa5b04), TOBN(0x5418786e, 0x34be7eb8), TOBN(0x6380e521, 0x9d7259bc), TOBN(0x20ac0351, 0xd598d710), TOBN(0x272c4166, 0xcb3a4da4), TOBN(0xdb82fe1a, 0xca71de1f), TOBN(0x746e79f2, 0xd8f54b0f), TOBN(0x6e7fc736, 0x4b573e9b), TOBN(0x75d03f46, 0xfd4b5040), TOBN(0x5c1cc36d, 0x0b98d87b), TOBN(0x513ba3f1, 0x1f472da1), TOBN(0x79d0af26, 0xabb177dd), TOBN(0xf82ab568, 0x7891d564), TOBN(0x2b6768a9, 0x72232173), TOBN(0xefbb3bb0, 0x8c1f6619), TOBN(0xb29c11db, 0xa6d18358), TOBN(0x519e2797, 0xb0916d3a), TOBN(0xd4dc18f0, 0x9188e290), TOBN(0x648e86e3, 0x98b0ca7f), TOBN(0x859d3145, 0x983c38b5), TOBN(0xb14f176c, 0x637abc8b), TOBN(0x2793fb9d, 0xcaff7be6), TOBN(0xebe5a55f, 0x35a66a5a), TOBN(0x7cec1dcd, 0x9f87dc59), TOBN(0x7c595cd3, 0xfbdbf560), TOBN(0x5b543b22, 0x26eb3257), TOBN(0x69080646, 0xc4c935fd), TOBN(0x7f2e4403, 0x81e9ede3), TOBN(0x243c3894, 0xcaf6df0a), TOBN(0x7c605bb1, 0x1c073b11), TOBN(0xcd06a541, 0xba6a4a62), TOBN(0x29168949, 0x49d4e2e5), TOBN(0x33649d07, 0x4af66880), TOBN(0xbfc0c885, 0xe9a85035), TOBN(0xb4e52113, 0xfc410f4b), TOBN(0xdca3b706, 0x78a6513b), TOBN(0x92ea4a2a, 0x9edb1943), TOBN(0x02642216, 0xdb6e2dd8), TOBN(0x9b45d0b4, 0x9fd57894), TOBN(0x114e70db, 0xc69d11ae), TOBN(0x1477dd19, 0x4c57595f), TOBN(0xbc2208b4, 0xec77c272), TOBN(0x95c5b4d7, 0xdb68f59c), TOBN(0xb8c4fc63, 0x42e532b7), TOBN(0x386ba422, 0x9ae35290), TOBN(0xfb5dda42, 0xd201ecbc), TOBN(0x2353dc8b, 0xa0e38fd6), TOBN(0x9a0b85ea, 0x68f7e978), TOBN(0x96ec5682, 0x2ad6d11f), TOBN(0x5e279d6c, 0xe5f6886d), TOBN(0xd3fe03cd, 0x3cb1914d), TOBN(0xfe541fa4, 0x7ea67c77), TOBN(0x952bd2af, 0xe3ea810c), TOBN(0x791fef56, 0x8d01d374), TOBN(0xa3a1c621, 0x0f11336e), TOBN(0x5ad0d5a9, 0xc7ec6d79), TOBN(0xff7038af, 0x3225c342), TOBN(0x003c6689, 0xbc69601b), TOBN(0x25059bc7, 0x45e8747d), TOBN(0xfa4965b2, 0xf2086fbf), TOBN(0xf6840ea6, 0x86916078), TOBN(0xd7ac7620, 0x70081d6c), TOBN(0xe600da31, 0xb5328645), TOBN(0x01916f63, 0x529b8a80), TOBN(0xe80e4858, 0x2d7d6f3e), TOBN(0x29eb0fe8, 0xd664ca7c), TOBN(0xf017637b, 0xe7b43b0c), TOBN(0x9a75c806, 0x76cb2566), TOBN(0x8f76acb1, 0xb24892d9), TOBN(0x7ae7b9cc, 0x1f08fe45), TOBN(0x19ef7329, 0x6a4907d8), TOBN(0x2db4ab71, 0x5f228bf0), TOBN(0xf3cdea39, 0x817032d7), TOBN(0x0b1f482e, 0xdcabe3c0), TOBN(0x3baf76b4, 0xbb86325c), TOBN(0xd49065e0, 0x10089465), TOBN(0x3bab5d29, 0x8e77c596), TOBN(0x7636c3a6, 0x193dbd95), TOBN(0xdef5d294, 0xb246e499), TOBN(0xb22c58b9, 0x286b2475), TOBN(0xa0b93939, 0xcd80862b), TOBN(0x3002c83a, 0xf0992388), TOBN(0x6de01f9b, 0xeacbe14c), TOBN(0x6aac688e, 0xadd70482), TOBN(0x708de92a, 0x7b4a4e8a), TOBN(0x75b6dd73, 0x758a6eef), TOBN(0xea4bf352, 0x725b3c43), TOBN(0x10041f2c, 0x87912868), TOBN(0xb1b1be95, 0xef09297a), TOBN(0x19ae23c5, 0xa9f3860a), TOBN(0xc4f0f839, 0x515dcf4b), TOBN(0x3c7ecca3, 0x97f6306a), TOBN(0x744c44ae, 0x68a3a4b0), TOBN(0x69cd13a0, 0xb3a1d8a2), TOBN(0x7cad0a1e, 0x5256b578), TOBN(0xea653fcd, 0x33791d9e), TOBN(0x9cc2a05d, 0x74b2e05f), TOBN(0x73b391dc, 0xfd7affa2), TOBN(0xddb7091e, 0xb6b05442), TOBN(0xc71e27bf, 0x8538a5c6), TOBN(0x195c63dd, 0x89abff17), TOBN(0xfd315285, 0x1b71e3da), TOBN(0x9cbdfda7, 0xfa680fa0), TOBN(0x9db876ca, 0x849d7eab), TOBN(0xebe2764b, 0x3c273271), TOBN(0x663357e3, 0xf208dcea), TOBN(0x8c5bd833, 0x565b1b70), TOBN(0xccc3b4f5, 0x9837fc0d), TOBN(0x9b641ba8, 0xa79cf00f), TOBN(0x7428243d, 0xdfdf3990), TOBN(0x83a594c4, 0x020786b1), TOBN(0xb712451a, 0x526c4502), TOBN(0x9d39438e, 0x6adb3f93), TOBN(0xfdb261e3, 0xe9ff0ccd), TOBN(0x80344e3c, 0xe07af4c3), TOBN(0x75900d7c, 0x2fa4f126), TOBN(0x08a3b865, 0x5c99a232), TOBN(0x2478b6bf, 0xdb25e0c3), TOBN(0x482cc2c2, 0x71db2edf), TOBN(0x37df7e64, 0x5f321bb8), TOBN(0x8a93821b, 0x9a8005b4), TOBN(0x3fa2f10c, 0xcc8c1958), TOBN(0x0d332218, 0x2c269d0a), TOBN(0x20ab8119, 0xe246b0e6), TOBN(0xb39781e4, 0xd349fd17), TOBN(0xd293231e, 0xb31aa100), TOBN(0x4b779c97, 0xbb032168), TOBN(0x4b3f19e1, 0xc8470500), TOBN(0x45b7efe9, 0x0c4c869d), TOBN(0xdb84f38a, 0xa1a6bbcc), TOBN(0x3b59cb15, 0xb2fddbc1), TOBN(0xba5514df, 0x3fd165e8), TOBN(0x499fd6a9, 0x061f8811), TOBN(0x72cd1fe0, 0xbfef9f00), TOBN(0x120a4bb9, 0x79ad7e8a), TOBN(0xf2ffd095, 0x5f4a5ac5), TOBN(0xcfd174f1, 0x95a7a2f0), TOBN(0xd42301ba, 0x9d17baf1), TOBN(0xd2fa487a, 0x77f22089), TOBN(0x9cb09efe, 0xb1dc77e1), TOBN(0xe9566939, 0x21c99682), TOBN(0x8c546901, 0x6c6067bb), TOBN(0xfd378574, 0x61c24456), TOBN(0x2b6a6cbe, 0x81796b33), TOBN(0x62d550f6, 0x58e87f8b), TOBN(0x1b763e1c, 0x7f1b01b4), TOBN(0x4b93cfea, 0x1b1b5e12), TOBN(0xb9345238, 0x1d531696), TOBN(0x57201c00, 0x88cdde69), TOBN(0xdde92251, 0x9a86afc7), TOBN(0xe3043895, 0xbd35cea8), TOBN(0x7608c1e1, 0x8555970d), TOBN(0x8267dfa9, 0x2535935e), TOBN(0xd4c60a57, 0x322ea38b), TOBN(0xe0bf7977, 0x804ef8b5), TOBN(0x1a0dab28, 0xc06fece4), TOBN(0xd405991e, 0x94e7b49d), TOBN(0xc542b6d2, 0x706dab28), TOBN(0xcb228da3, 0xa91618fb), TOBN(0x224e4164, 0x107d1cea), TOBN(0xeb9fdab3, 0xd0f5d8f1), TOBN(0xc02ba386, 0x0d6e41cd), TOBN(0x676a72c5, 0x9b1f7146), TOBN(0xffd6dd98, 0x4d6cb00b), TOBN(0xcef9c5ca, 0xde2e8d7c), TOBN(0xa1bbf5d7, 0x641c7936), TOBN(0x1b95b230, 0xee8f772e), TOBN(0xf765a92e, 0xe8ac25b1), TOBN(0xceb04cfc, 0x3a18b7c6), TOBN(0x27944cef, 0x0acc8966), TOBN(0xcbb3c957, 0x434c1004), TOBN(0x9c9971a1, 0xa43ff93c), TOBN(0x5bc2db17, 0xa1e358a9), TOBN(0x45b4862e, 0xa8d9bc82), TOBN(0x70ebfbfb, 0x2201e052), TOBN(0xafdf64c7, 0x92871591), TOBN(0xea5bcae6, 0xb42d0219), TOBN(0xde536c55, 0x2ad8f03c), TOBN(0xcd6c3f4d, 0xa76aa33c), TOBN(0xbeb5f623, 0x0bca6de3), TOBN(0xdd20dd99, 0xb1e706fd), TOBN(0x90b3ff9d, 0xac9059d4), TOBN(0x2d7b2902, 0x7ccccc4e), TOBN(0x8a090a59, 0xce98840f), TOBN(0xa5d947e0, 0x8410680a), TOBN(0x49ae346a, 0x923379a5), TOBN(0x7dbc84f9, 0xb28a3156), TOBN(0xfd40d916, 0x54a1aff2), TOBN(0xabf318ba, 0x3a78fb9b), TOBN(0x50152ed8, 0x3029f95e), TOBN(0x9fc1dd77, 0xc58ad7fa), TOBN(0x5fa57915, 0x13595c17), TOBN(0xb9504668, 0x8f62b3a9), TOBN(0x907b5b24, 0xff3055b0), TOBN(0x2e995e35, 0x9a84f125), TOBN(0x87dacf69, 0x7e9bbcfb), TOBN(0x95d0c1d6, 0xe86d96e3), TOBN(0x65726e3c, 0x2d95a75c), TOBN(0x2c3c9001, 0xacd27f21), TOBN(0x1deab561, 0x6c973f57), TOBN(0x108b7e2c, 0xa5221643), TOBN(0x5fee9859, 0xc4ef79d4), TOBN(0xbd62b88a, 0x40d4b8c6), TOBN(0xb4dd29c4, 0x197c75d6), TOBN(0x266a6df2, 0xb7076feb), TOBN(0x9512d0ea, 0x4bf2df11), TOBN(0x1320c24f, 0x6b0cc9ec), TOBN(0x6bb1e0e1, 0x01a59596), TOBN(0x8317c5bb, 0xeff9aaac), TOBN(0x65bb405e, 0x385aa6c9), TOBN(0x613439c1, 0x8f07988f), TOBN(0xd730049f, 0x16a66e91), TOBN(0xe97f2820, 0xfa1b0e0d), TOBN(0x4131e003, 0x304c28ea), TOBN(0x820ab732, 0x526bac62), TOBN(0xb2ac9ef9, 0x28714423), TOBN(0x54ecfffa, 0xadb10cb2), TOBN(0x8781476e, 0xf886a4cc), TOBN(0x4b2c87b5, 0xdb2f8d49), TOBN(0xe857cd20, 0x0a44295d), TOBN(0x707d7d21, 0x58c6b044), TOBN(0xae8521f9, 0xf596757c), TOBN(0x87448f03, 0x67b2b714), TOBN(0x13a9bc45, 0x5ebcd58d), TOBN(0x79bcced9, 0x9122d3c1), TOBN(0x3c644247, 0x9e076642), TOBN(0x0cf22778, 0x2df4767d), TOBN(0x5e61aee4, 0x71d444b6), TOBN(0x211236bf, 0xc5084a1d), TOBN(0x7e15bc9a, 0x4fd3eaf6), TOBN(0x68df2c34, 0xab622bf5), TOBN(0x9e674f0f, 0x59bf4f36), TOBN(0xf883669b, 0xd7f34d73), TOBN(0xc48ac1b8, 0x31497b1d), TOBN(0x323b925d, 0x5106703b), TOBN(0x22156f42, 0x74082008), TOBN(0xeffc521a, 0xc8482bcb), TOBN(0x5c6831bf, 0x12173479), TOBN(0xcaa2528f, 0xc4739490), TOBN(0x84d2102a, 0x8f1b3c4d), TOBN(0xcf64dfc1, 0x2d9bec0d), TOBN(0x433febad, 0x78a546ef), TOBN(0x1f621ec3, 0x7b73cef1), TOBN(0x6aecd627, 0x37338615), TOBN(0x162082ab, 0x01d8edf6), TOBN(0x833a8119, 0x19e86b66), TOBN(0x6023a251, 0xd299b5db), TOBN(0xf5bb0c3a, 0xbbf04b89), TOBN(0x6735eb69, 0xae749a44), TOBN(0xd0e058c5, 0x4713de3b), TOBN(0xfdf2593e, 0x2c3d4ccd), TOBN(0x1b8f414e, 0xfdd23667), TOBN(0xdd52aaca, 0xfa2015ee), TOBN(0x3e31b517, 0xbd9625ff), TOBN(0x5ec9322d, 0x8db5918c), TOBN(0xbc73ac85, 0xa96f5294), TOBN(0x82aa5bf3, 0x61a0666a), TOBN(0x49755810, 0xbf08ac42), TOBN(0xd21cdfd5, 0x891cedfc), TOBN(0x918cb57b, 0x67f8be10), TOBN(0x365d1a7c, 0x56ffa726), TOBN(0x2435c504, 0x6532de93), TOBN(0xc0fc5e10, 0x2674cd02), TOBN(0x6e51fcf8, 0x9cbbb142), TOBN(0x1d436e5a, 0xafc50692), TOBN(0x766bffff, 0x3fbcae22), TOBN(0x3148c2fd, 0xfd55d3b8), TOBN(0x52c7fdc9, 0x233222fa), TOBN(0x89ff1092, 0xe419fb6b), TOBN(0x3cd6db99, 0x25254977), TOBN(0x2e85a161, 0x1cf12ca7), TOBN(0xadd2547c, 0xdc810bc9), TOBN(0xea3f458f, 0x9d257c22), TOBN(0x642c1fbe, 0x27d6b19b), TOBN(0xed07e6b5, 0x140481a6), TOBN(0x6ada1d42, 0x86d2e0f8), TOBN(0xe5920122, 0x0e8a9fd5), TOBN(0x02c936af, 0x708c1b49), TOBN(0x60f30fee, 0x2b4bfaff), TOBN(0x6637ad06, 0x858e6a61), TOBN(0xce4c7767, 0x3fd374d0), TOBN(0x39d54b2d, 0x7188defb), TOBN(0xa8c9d250, 0xf56a6b66), TOBN(0x58fc0f5e, 0xb24fe1dc), TOBN(0x9eaf9dee, 0x6b73f24c), TOBN(0xa90d588b, 0x33650705), TOBN(0xde5b62c5, 0xaf2ec729), TOBN(0x5c72cfae, 0xd3c2b36e), TOBN(0x868c19d5, 0x034435da), TOBN(0x88605f93, 0xe17ee145), TOBN(0xaa60c4ee, 0x77a5d5b1), TOBN(0xbcf5bfd2, 0x3b60c472), TOBN(0xaf4ef13c, 0xeb1d3049), TOBN(0x373f44fc, 0xe13895c9), TOBN(0xf29b382f, 0x0cbc9822), TOBN(0x1bfcb853, 0x73efaef6), TOBN(0xcf56ac9c, 0xa8c96f40), TOBN(0xd7adf109, 0x7a191e24), TOBN(0x98035f44, 0xbf8a8dc2), TOBN(0xf40a71b9, 0x1e750c84), TOBN(0xc57f7b0c, 0x5dc6c469), TOBN(0x49a0e79c, 0x6fbc19c1), TOBN(0x6b0f5889, 0xa48ebdb8), TOBN(0x5d3fd084, 0xa07c4e9f), TOBN(0xc3830111, 0xab27de14), TOBN(0x0e4929fe, 0x33e08dcc), TOBN(0xf4a5ad24, 0x40bb73a3), TOBN(0xde86c2bf, 0x490f97ca), TOBN(0x288f09c6, 0x67a1ce18), TOBN(0x364bb886, 0x1844478d), TOBN(0x7840fa42, 0xceedb040), TOBN(0x1269fdd2, 0x5a631b37), TOBN(0x94761f1e, 0xa47c8b7d), TOBN(0xfc0c2e17, 0x481c6266), TOBN(0x85e16ea2, 0x3daa5fa7), TOBN(0xccd86033, 0x92491048), TOBN(0x0c2f6963, 0xf4d402d7), TOBN(0x6336f7df, 0xdf6a865c), TOBN(0x0a2a463c, 0xb5c02a87), TOBN(0xb0e29be7, 0xbf2f12ee), TOBN(0xf0a22002, 0x66bad988), TOBN(0x27f87e03, 0x9123c1d7), TOBN(0x21669c55, 0x328a8c98), TOBN(0x186b9803, 0x92f14529), TOBN(0xd3d056cc, 0x63954df3), TOBN(0x2f03fd58, 0x175a46f6), TOBN(0x63e34ebe, 0x11558558), TOBN(0xe13fedee, 0x5b80cfa5), TOBN(0xe872a120, 0xd401dbd1), TOBN(0x52657616, 0xe8a9d667), TOBN(0xbc8da4b6, 0xe08d6693), TOBN(0x370fb9bb, 0x1b703e75), TOBN(0x6773b186, 0xd4338363), TOBN(0x18dad378, 0xecef7bff), TOBN(0xaac787ed, 0x995677da), TOBN(0x4801ea8b, 0x0437164b), TOBN(0xf430ad20, 0x73fe795e), TOBN(0xb164154d, 0x8ee5eb73), TOBN(0x0884ecd8, 0x108f7c0e), TOBN(0x0e6ec096, 0x5f520698), TOBN(0x640631fe, 0x44f7b8d9), TOBN(0x92fd34fc, 0xa35a68b9), TOBN(0x9c5a4b66, 0x4d40cf4e), TOBN(0x949454bf, 0x80b6783d), TOBN(0x80e701fe, 0x3a320a10), TOBN(0x8d1a564a, 0x1a0a39b2), TOBN(0x1436d53d, 0x320587db), TOBN(0xf5096e6d, 0x6556c362), TOBN(0xbc23a3c0, 0xe2455d7e), TOBN(0x3a7aee54, 0x807230f9), TOBN(0x9ba1cfa6, 0x22ae82fd), TOBN(0x833a057a, 0x99c5d706), TOBN(0x8be85f4b, 0x842315c9), TOBN(0xd083179a, 0x66a72f12), TOBN(0x2fc77d5d, 0xcdcc73cd), TOBN(0x22b88a80, 0x5616ee30), TOBN(0xfb09548f, 0xe7ab1083), TOBN(0x8ad6ab0d, 0x511270cd), TOBN(0x61f6c57a, 0x6924d9ab), TOBN(0xa0f7bf72, 0x90aecb08), TOBN(0x849f87c9, 0x0df784a4), TOBN(0x27c79c15, 0xcfaf1d03), TOBN(0xbbf9f675, 0xc463face), TOBN(0x91502c65, 0x765ba543), TOBN(0x18ce3cac, 0x42ea60dd), TOBN(0xe5cee6ac, 0x6e43ecb3), TOBN(0x63e4e910, 0x68f2aeeb), TOBN(0x26234fa3, 0xc85932ee), TOBN(0x96883e8b, 0x4c90c44d), TOBN(0x29b9e738, 0xa18a50f6), TOBN(0xbfc62b2a, 0x3f0420df), TOBN(0xd22a7d90, 0x6d3e1fa9), TOBN(0x17115618, 0xfe05b8a3), TOBN(0x2a0c9926, 0xbb2b9c01), TOBN(0xc739fcc6, 0xe07e76a2), TOBN(0x540e9157, 0x165e439a), TOBN(0x06353a62, 0x6a9063d8), TOBN(0x84d95594, 0x61e927a3), TOBN(0x013b9b26, 0xe2e0be7f), TOBN(0x4feaec3b, 0x973497f1), TOBN(0x15c0f94e, 0x093ebc2d), TOBN(0x6af5f227, 0x33af0583), TOBN(0x0c2af206, 0xc61f3340), TOBN(0xd25dbdf1, 0x4457397c), TOBN(0x2e8ed017, 0xcabcbae0), TOBN(0xe3010938, 0xc2815306), TOBN(0xbaa99337, 0xe8c6cd68), TOBN(0x08513182, 0x3b0ec7de), TOBN(0x1e1b822b, 0x58df05df), TOBN(0x5c14842f, 0xa5c3b683), TOBN(0x98fe977e, 0x3eba34ce), TOBN(0xfd2316c2, 0x0d5e8873), TOBN(0xe48d839a, 0xbd0d427d), TOBN(0x495b2218, 0x623fc961), TOBN(0x24ee56e7, 0xb46fba5e), TOBN(0x9184a55b, 0x91e4de58), TOBN(0xa7488ca5, 0xdfdea288), TOBN(0xa723862e, 0xa8dcc943), TOBN(0x92d762b2, 0x849dc0fc), TOBN(0x3c444a12, 0x091ff4a9), TOBN(0x581113fa, 0x0cada274), TOBN(0xb9de0a45, 0x30d8eae2), TOBN(0x5e0fcd85, 0xdf6b41ea), TOBN(0x6233ea68, 0xc094dbb5), TOBN(0xb77d062e, 0xd968d410), TOBN(0x3e719bbc, 0x58b3002d), TOBN(0x68e7dd3d, 0x3dc49d58), TOBN(0x8d825740, 0x013a5e58), TOBN(0x21311747, 0x3c9e3c1b), TOBN(0x0cb0a2a7, 0x7c99b6ab), TOBN(0x5c48a3b3, 0xc2f888f2)}, {TOBN(0xc7913e91, 0x991724f3), TOBN(0x5eda799c, 0x39cbd686), TOBN(0xddb595c7, 0x63d4fc1e), TOBN(0x6b63b80b, 0xac4fed54), TOBN(0x6ea0fc69, 0x7e5fb516), TOBN(0x737708ba, 0xd0f1c964), TOBN(0x9628745f, 0x11a92ca5), TOBN(0x61f37958, 0x9a86967a), TOBN(0x9af39b2c, 0xaa665072), TOBN(0x78322fa4, 0xefd324ef), TOBN(0x3d153394, 0xc327bd31), TOBN(0x81d5f271, 0x3129dab0), TOBN(0xc72e0c42, 0xf48027f5), TOBN(0xaa40cdbc, 0x8536e717), TOBN(0xf45a657a, 0x2d369d0f), TOBN(0xb03bbfc4, 0xea7f74e6), TOBN(0x46a8c418, 0x0d738ded), TOBN(0x6f1a5bb0, 0xe0de5729), TOBN(0xf10230b9, 0x8ba81675), TOBN(0x32c6f30c, 0x112b33d4), TOBN(0x7559129d, 0xd8fffb62), TOBN(0x6a281b47, 0xb459bf05), TOBN(0x77c1bd3a, 0xfa3b6776), TOBN(0x0709b380, 0x7829973a), TOBN(0x8c26b232, 0xa3326505), TOBN(0x38d69272, 0xee1d41bf), TOBN(0x0459453e, 0xffe32afa), TOBN(0xce8143ad, 0x7cb3ea87), TOBN(0x932ec1fa, 0x7e6ab666), TOBN(0x6cd2d230, 0x22286264), TOBN(0x459a46fe, 0x6736f8ed), TOBN(0x50bf0d00, 0x9eca85bb), TOBN(0x0b825852, 0x877a21ec), TOBN(0x300414a7, 0x0f537a94), TOBN(0x3f1cba40, 0x21a9a6a2), TOBN(0x50824eee, 0x76943c00), TOBN(0xa0dbfcec, 0xf83cba5d), TOBN(0xf9538148, 0x93b4f3c0), TOBN(0x61744162, 0x48f24dd7), TOBN(0x5322d64d, 0xe4fb09dd), TOBN(0x57447384, 0x3d9325f3), TOBN(0xa9bef2d0, 0xf371cb84), TOBN(0x77d2188b, 0xa61e36c5), TOBN(0xbbd6a7d7, 0xc602df72), TOBN(0xba3aa902, 0x8f61bc0b), TOBN(0xf49085ed, 0x6ed0b6a1), TOBN(0x8bc625d6, 0xae6e8298), TOBN(0x832b0b1d, 0xa2e9c01d), TOBN(0xa337c447, 0xf1f0ced1), TOBN(0x800cc793, 0x9492dd2b), TOBN(0x4b93151d, 0xbea08efa), TOBN(0x820cf3f8, 0xde0a741e), TOBN(0xff1982dc, 0x1c0f7d13), TOBN(0xef921960, 0x84dde6ca), TOBN(0x1ad7d972, 0x45f96ee3), TOBN(0x319c8dbe, 0x29dea0c7), TOBN(0xd3ea3871, 0x7b82b99b), TOBN(0x75922d4d, 0x470eb624), TOBN(0x8f66ec54, 0x3b95d466), TOBN(0x66e673cc, 0xbee1e346), TOBN(0x6afe67c4, 0xb5f2b89a), TOBN(0x3de9c1e6, 0x290e5cd3), TOBN(0x8c278bb6, 0x310a2ada), TOBN(0x420fa384, 0x0bdb323b), TOBN(0x0ae1d63b, 0x0eb919b0), TOBN(0xd74ee51d, 0xa74b9620), TOBN(0x395458d0, 0xa674290c), TOBN(0x324c930f, 0x4620a510), TOBN(0x2d1f4d19, 0xfbac27d4), TOBN(0x4086e8ca, 0x9bedeeac), TOBN(0x0cdd211b, 0x9b679ab8), TOBN(0x5970167d, 0x7090fec4), TOBN(0x3420f2c9, 0xfaf1fc63), TOBN(0x616d333a, 0x328c8bb4), TOBN(0x7d65364c, 0x57f1fe4a), TOBN(0x9343e877, 0x55e5c73a), TOBN(0x5795176b, 0xe970e78c), TOBN(0xa36ccebf, 0x60533627), TOBN(0xfc7c7380, 0x09cdfc1b), TOBN(0xb39a2afe, 0xb3fec326), TOBN(0xb7ff1ba1, 0x6224408a), TOBN(0xcc856e92, 0x247cfc5e), TOBN(0x01f102e7, 0xc18bc493), TOBN(0x4613ab74, 0x2091c727), TOBN(0xaa25e89c, 0xc420bf2b), TOBN(0x00a53176, 0x90337ec2), TOBN(0xd2be9f43, 0x7d025fc7), TOBN(0x3316fb85, 0x6e6fe3dc), TOBN(0x27520af5, 0x9ac50814), TOBN(0xfdf95e78, 0x9a8e4223), TOBN(0xb7e7df2a, 0x56bec5a0), TOBN(0xf7022f7d, 0xdf159e5d), TOBN(0x93eeeab1, 0xcac1fe8f), TOBN(0x8040188c, 0x37451168), TOBN(0x7ee8aa8a, 0xd967dce6), TOBN(0xfa0e79e7, 0x3abc9299), TOBN(0x67332cfc, 0x2064cfd1), TOBN(0x339c31de, 0xb0651934), TOBN(0x719b28d5, 0x2a3bcbea), TOBN(0xee74c82b, 0x9d6ae5c6), TOBN(0x0927d05e, 0xbaf28ee6), TOBN(0x82cecf2c, 0x9d719028), TOBN(0x0b0d353e, 0xddb30289), TOBN(0xfe4bb977, 0xfddb2e29), TOBN(0xbb5bb990, 0x640bfd9e), TOBN(0xd226e277, 0x82f62108), TOBN(0x4bf00985, 0x02ffdd56), TOBN(0x7756758a, 0x2ca1b1b5), TOBN(0xc32b62a3, 0x5285fe91), TOBN(0xedbc546a, 0x8c9cd140), TOBN(0x1e47a013, 0xaf5cb008), TOBN(0xbca7e720, 0x073ce8f2), TOBN(0xe10b2ab8, 0x17a91cae), TOBN(0xb89aab65, 0x08e27f63), TOBN(0x7b3074a7, 0xdba3ddf9), TOBN(0x1c20ce09, 0x330c2972), TOBN(0x6b9917b4, 0x5fcf7e33), TOBN(0xe6793743, 0x945ceb42), TOBN(0x18fc2215, 0x5c633d19), TOBN(0xad1adb3c, 0xc7485474), TOBN(0x646f9679, 0x6424c49b), TOBN(0xf888dfe8, 0x67c241c9), TOBN(0xe12d4b93, 0x24f68b49), TOBN(0x9a6b62d8, 0xa571df20), TOBN(0x81b4b26d, 0x179483cb), TOBN(0x666f9632, 0x9511fae2), TOBN(0xd281b3e4, 0xd53aa51f), TOBN(0x7f96a765, 0x7f3dbd16), TOBN(0xa7f8b5bf, 0x074a30ce), TOBN(0xd7f52107, 0x005a32e6), TOBN(0x6f9e0907, 0x50237ed4), TOBN(0x2f21da47, 0x8096fa2b), TOBN(0xf3e19cb4, 0xeec863a0), TOBN(0xd18f77fd, 0x9527620a), TOBN(0x9505c81c, 0x407c1cf8), TOBN(0x9998db4e, 0x1b6ec284), TOBN(0x7e3389e5, 0xc247d44d), TOBN(0x12507141, 0x3f4f3d80), TOBN(0xd4ba0110, 0x4a78a6c7), TOBN(0x312874a0, 0x767720be), TOBN(0xded059a6, 0x75944370), TOBN(0xd6123d90, 0x3b2c0bdd), TOBN(0xa56b717b, 0x51c108e3), TOBN(0x9bb7940e, 0x070623e9), TOBN(0x794e2d59, 0x84ac066c), TOBN(0xf5954a92, 0xe68c69a0), TOBN(0x28c52458, 0x4fd99dcc), TOBN(0x60e639fc, 0xb1012517), TOBN(0xc2e60125, 0x7de79248), TOBN(0xe9ef6404, 0xf12fc6d7), TOBN(0x4c4f2808, 0x2a3b5d32), TOBN(0x865ad32e, 0xc768eb8a), TOBN(0xac02331b, 0x13fb70b6), TOBN(0x037b44c1, 0x95599b27), TOBN(0x1a860fc4, 0x60bd082c), TOBN(0xa2e25745, 0xc980cd01), TOBN(0xee3387a8, 0x1da0263e), TOBN(0x931bfb95, 0x2d10f3d6), TOBN(0x5b687270, 0xa1f24a32), TOBN(0xf140e65d, 0xca494b86), TOBN(0x4f4ddf91, 0xb2f1ac7a), TOBN(0xf99eaabb, 0x760fee27), TOBN(0x57f4008a, 0x49c228e5), TOBN(0x090be440, 0x1cf713bb), TOBN(0xac91fbe4, 0x5004f022), TOBN(0xd838c2c2, 0x569e1af6), TOBN(0xd6c7d20b, 0x0f1daaa5), TOBN(0xaa063ac1, 0x1bbb02c0), TOBN(0x0938a422, 0x59558a78), TOBN(0x5343c669, 0x8435da2f), TOBN(0x96f67b18, 0x034410dc), TOBN(0x7cc1e424, 0x84510804), TOBN(0x86a1543f, 0x16dfbb7d), TOBN(0x921fa942, 0x5b5bd592), TOBN(0x9dcccb6e, 0xb33dd03c), TOBN(0x8581ddd9, 0xb843f51e), TOBN(0x54935fcb, 0x81d73c9e), TOBN(0x6d07e979, 0x0a5e97ab), TOBN(0x4dc7b30a, 0xcf3a6bab), TOBN(0x147ab1f3, 0x170bee11), TOBN(0x0aaf8e3d, 0x9fafdee4), TOBN(0xfab3dbcb, 0x538a8b95), TOBN(0x405df4b3, 0x6ef13871), TOBN(0xf1f4e9cb, 0x088d5a49), TOBN(0x9bcd24d3, 0x66b33f1d), TOBN(0x3b97b820, 0x5ce445c0), TOBN(0xe2926549, 0xba93ff61), TOBN(0xd9c341ce, 0x4dafe616), TOBN(0xfb30a76e, 0x16efb6f3), TOBN(0xdf24b8ca, 0x605b953c), TOBN(0x8bd52afe, 0xc2fffb9f), TOBN(0xbbac5ff7, 0xe19d0b96), TOBN(0x43c01b87, 0x459afccd), TOBN(0x6bd45143, 0xb7432652), TOBN(0x84734530, 0x55b5d78e), TOBN(0x81088fdb, 0x1554ba7d), TOBN(0xada0a52c, 0x1e269375), TOBN(0xf9f037c4, 0x2dc5ec10), TOBN(0xc0660607, 0x94bfbc11), TOBN(0xc0a630bb, 0xc9c40d2f), TOBN(0x5efc797e, 0xab64c31e), TOBN(0xffdb1dab, 0x74507144), TOBN(0xf6124287, 0x1ca6790c), TOBN(0xe9609d81, 0xe69bf1bf), TOBN(0xdb898595, 0x00d24fc9), TOBN(0x9c750333, 0xe51fb417), TOBN(0x51830a91, 0xfef7bbde), TOBN(0x0ce67dc8, 0x945f585c), TOBN(0x9a730ed4, 0x4763eb50), TOBN(0x24a0e221, 0xc1ab0d66), TOBN(0x643b6393, 0x648748f3), TOBN(0x1982daa1, 0x6d3c6291), TOBN(0x6f00a9f7, 0x8bbc5549), TOBN(0x7a1783e1, 0x7f36384e), TOBN(0xe8346323, 0xde977f50), TOBN(0x91ab688d, 0xb245502a), TOBN(0x331ab6b5, 0x6d0bdd66), TOBN(0x0a6ef32e, 0x64b71229), TOBN(0x1028150e, 0xfe7c352f), TOBN(0x27e04350, 0xce7b39d3), TOBN(0x2a3c8acd, 0xc1070c82), TOBN(0xfb2034d3, 0x80c9feef), TOBN(0x2d729621, 0x709f3729), TOBN(0x8df290bf, 0x62cb4549), TOBN(0x02f99f33, 0xfc2e4326), TOBN(0x3b30076d, 0x5eddf032), TOBN(0xbb21f8cf, 0x0c652fb5), TOBN(0x314fb49e, 0xed91cf7b), TOBN(0xa013eca5, 0x2f700750), TOBN(0x2b9e3c23, 0x712a4575), TOBN(0xe5355557, 0xaf30fbb0), TOBN(0x1ada3516, 0x7c77e771), TOBN(0x45f6ecb2, 0x7b135670), TOBN(0xe85d19df, 0x7cfc202e), TOBN(0x0f1b50c7, 0x58d1be9f), TOBN(0x5ebf2c0a, 0xead2e344), TOBN(0x1531fe4e, 0xabc199c9), TOBN(0xc7032592, 0x56bab0ae), TOBN(0x16ab2e48, 0x6c1fec54), TOBN(0x0f87fda8, 0x04280188), TOBN(0xdc9f46fc, 0x609e4a74), TOBN(0x2a44a143, 0xba667f91), TOBN(0xbc3d8b95, 0xb4d83436), TOBN(0xa01e4bd0, 0xc7bd2958), TOBN(0x7b182932, 0x73483c90), TOBN(0xa79c6aa1, 0xa7c7b598), TOBN(0xbf3983c6, 0xeaaac07e), TOBN(0x8f18181e, 0x96e0d4e6), TOBN(0x8553d37c, 0x051af62b), TOBN(0xe9a998eb, 0x0bf94496), TOBN(0xe0844f9f, 0xb0d59aa1), TOBN(0x983fd558, 0xe6afb813), TOBN(0x9670c0ca, 0x65d69804), TOBN(0x732b22de, 0x6ea5ff2d), TOBN(0xd7640ba9, 0x5fd8623b), TOBN(0x9f619163, 0xa6351782), TOBN(0x0bfc27ee, 0xacee5043), TOBN(0xae419e73, 0x2eb10f02), TOBN(0x19c028d1, 0x8943fb05), TOBN(0x71f01cf7, 0xff13aa2a), TOBN(0x7790737e, 0x8887a132), TOBN(0x67513309, 0x66318410), TOBN(0x9819e8a3, 0x7ddb795e), TOBN(0xfecb8ef5, 0xdad100b2), TOBN(0x59f74a22, 0x3021926a), TOBN(0xb7c28a49, 0x6f9b4c1c), TOBN(0xed1a733f, 0x912ad0ab), TOBN(0x42a910af, 0x01a5659c), TOBN(0x3842c6e0, 0x7bd68cab), TOBN(0x2b57fa38, 0x76d70ac8), TOBN(0x8a6707a8, 0x3c53aaeb), TOBN(0x62c1c510, 0x65b4db18), TOBN(0x8de2c1fb, 0xb2d09dc7), TOBN(0xc3dfed12, 0x266bd23b), TOBN(0x927d039b, 0xd5b27db6), TOBN(0x2fb2f0f1, 0x103243da), TOBN(0xf855a07b, 0x80be7399), TOBN(0xed9327ce, 0x1f9f27a8), TOBN(0xa0bd99c7, 0x729bdef7), TOBN(0x2b67125e, 0x28250d88), TOBN(0x784b26e8, 0x8670ced7), TOBN(0xe3dfe41f, 0xc31bd3b4), TOBN(0x9e353a06, 0xbcc85cbc), TOBN(0x302e2909, 0x60178a9d), TOBN(0x860abf11, 0xa6eac16e), TOBN(0x76447000, 0xaa2b3aac), TOBN(0x46ff9d19, 0x850afdab), TOBN(0x35bdd6a5, 0xfdb2d4c1), TOBN(0xe82594b0, 0x7e5c9ce9), TOBN(0x0f379e53, 0x20af346e), TOBN(0x608b31e3, 0xbc65ad4a), TOBN(0x710c6b12, 0x267c4826), TOBN(0x51c966f9, 0x71954cf1), TOBN(0xb1cec793, 0x0d0aa215), TOBN(0x1f155989, 0x86bd23a8), TOBN(0xae2ff99c, 0xf9452e86), TOBN(0xd8dd953c, 0x340ceaa2), TOBN(0x26355275, 0x2e2e9333), TOBN(0x15d4e5f9, 0x8586f06d), TOBN(0xd6bf94a8, 0xf7cab546), TOBN(0x33c59a0a, 0xb76a9af0), TOBN(0x52740ab3, 0xba095af7), TOBN(0xc444de8a, 0x24389ca0), TOBN(0xcc6f9863, 0x706da0cb), TOBN(0xb5a741a7, 0x6b2515cf), TOBN(0x71c41601, 0x9585c749), TOBN(0x78350d4f, 0xe683de97), TOBN(0x31d61524, 0x63d0b5f5), TOBN(0x7a0cc5e1, 0xfbce090b), TOBN(0xaac927ed, 0xfbcb2a5b), TOBN(0xe920de49, 0x20d84c35), TOBN(0x8c06a0b6, 0x22b4de26), TOBN(0xd34dd58b, 0xafe7ddf3), TOBN(0x55851fed, 0xc1e6e55b), TOBN(0xd1395616, 0x960696e7), TOBN(0x940304b2, 0x5f22705f), TOBN(0x6f43f861, 0xb0a2a860), TOBN(0xcf121282, 0x0e7cc981), TOBN(0x12186212, 0x0ab64a96), TOBN(0x09215b9a, 0xb789383c), TOBN(0x311eb305, 0x37387c09), TOBN(0xc5832fce, 0xf03ee760), TOBN(0x30358f58, 0x32f7ea19), TOBN(0xe01d3c34, 0x91d53551), TOBN(0x1ca5ee41, 0xda48ea80), TOBN(0x34e71e8e, 0xcf4fa4c1), TOBN(0x312abd25, 0x7af1e1c7), TOBN(0xe3afcdeb, 0x2153f4a5), TOBN(0x9d5c84d7, 0x00235e9a), TOBN(0x0308d3f4, 0x8c4c836f), TOBN(0xc0a66b04, 0x89332de5), TOBN(0x610dd399, 0x89e566ef), TOBN(0xf8eea460, 0xd1ac1635), TOBN(0x84cbb3fb, 0x20a2c0df), TOBN(0x40afb488, 0xe74a48c5), TOBN(0x29738198, 0xd326b150), TOBN(0x2a17747f, 0xa6d74081), TOBN(0x60ea4c05, 0x55a26214), TOBN(0x53514bb4, 0x1f88c5fe), TOBN(0xedd64567, 0x7e83426c), TOBN(0xd5d6cbec, 0x96460b25), TOBN(0xa12fd0ce, 0x68dc115e), TOBN(0xc5bc3ed2, 0x697840ea), TOBN(0x969876a8, 0xa6331e31), TOBN(0x60c36217, 0x472ff580), TOBN(0xf4229705, 0x4ad41393), TOBN(0x4bd99ef0, 0xa03b8b92), TOBN(0x501c7317, 0xc144f4f6), TOBN(0x159009b3, 0x18464945), TOBN(0x6d5e594c, 0x74c5c6be), TOBN(0x2d587011, 0x321a3660), TOBN(0xd1e184b1, 0x3898d022), TOBN(0x5ba04752, 0x4c6a7e04), TOBN(0x47fa1e2b, 0x45550b65), TOBN(0x9419daf0, 0x48c0a9a5), TOBN(0x66362953, 0x7c243236), TOBN(0xcd0744b1, 0x5cb12a88), TOBN(0x561b6f9a, 0x2b646188), TOBN(0x599415a5, 0x66c2c0c0), TOBN(0xbe3f0859, 0x0f83f09a), TOBN(0x9141c5be, 0xb92041b8), TOBN(0x01ae38c7, 0x26477d0d), TOBN(0xca8b71f3, 0xd12c7a94), TOBN(0xfab5b31f, 0x765c70db), TOBN(0x76ae7492, 0x487443e9), TOBN(0x8595a310, 0x990d1349), TOBN(0xf8dbeda8, 0x7d460a37), TOBN(0x7f7ad082, 0x1e45a38f), TOBN(0xed1d4db6, 0x1059705a), TOBN(0xa3dd492a, 0xe6b9c697), TOBN(0x4b92ee3a, 0x6eb38bd5), TOBN(0xbab2609d, 0x67cc0bb7), TOBN(0x7fc4fe89, 0x6e70ee82), TOBN(0xeff2c56e, 0x13e6b7e3), TOBN(0x9b18959e, 0x34d26fca), TOBN(0x2517ab66, 0x889d6b45), TOBN(0xf167b4e0, 0xbdefdd4f), TOBN(0x69958465, 0xf366e401), TOBN(0x5aa368ab, 0xa73bbec0), TOBN(0x12148709, 0x7b240c21), TOBN(0x378c3233, 0x18969006), TOBN(0xcb4d73ce, 0xe1fe53d1), TOBN(0x5f50a80e, 0x130c4361), TOBN(0xd67f5951, 0x7ef5212b), TOBN(0xf145e21e, 0x9e70c72e), TOBN(0xb2e52e29, 0x5566d2fb), TOBN(0x44eaba4a, 0x032397f5), TOBN(0x5e56937b, 0x7e31a7de), TOBN(0x68dcf517, 0x456c61e1), TOBN(0xbc2e954a, 0xa8b0a388), TOBN(0xe3552fa7, 0x60a8b755), TOBN(0x03442dae, 0x73ad0cde), TOBN(0x37ffe747, 0xceb26210), TOBN(0x983545e8, 0x787baef9), TOBN(0x8b8c8535, 0x86a3de31), TOBN(0xc621dbcb, 0xfacd46db), TOBN(0x82e442e9, 0x59266fbb), TOBN(0xa3514c37, 0x339d471c), TOBN(0x3a11b771, 0x62cdad96), TOBN(0xf0cb3b3c, 0xecf9bdf0), TOBN(0x3fcbdbce, 0x478e2135), TOBN(0x7547b5cf, 0xbda35342), TOBN(0xa97e81f1, 0x8a677af6), TOBN(0xc8c2bf83, 0x28817987), TOBN(0xdf07eaaf, 0x45580985), TOBN(0xc68d1f05, 0xc93b45cb), TOBN(0x106aa2fe, 0xc77b4cac), TOBN(0x4c1d8afc, 0x04a7ae86), TOBN(0xdb41c3fd, 0x9eb45ab2), TOBN(0x5b234b5b, 0xd4b22e74), TOBN(0xda253dec, 0xf215958a), TOBN(0x67e0606e, 0xa04edfa0), TOBN(0xabbbf070, 0xef751b11), TOBN(0xf352f175, 0xf6f06dce), TOBN(0xdfc4b6af, 0x6839f6b4), TOBN(0x53ddf9a8, 0x9959848e), TOBN(0xda49c379, 0xc21520b0), TOBN(0x90864ff0, 0xdbd5d1b6), TOBN(0x2f055d23, 0x5f49c7f7), TOBN(0xe51e4e6a, 0xa796b2d8), TOBN(0xc361a67f, 0x5c9dc340), TOBN(0x5ad53c37, 0xbca7c620), TOBN(0xda1d6588, 0x32c756d0), TOBN(0xad60d911, 0x8bb67e13), TOBN(0xd6c47bdf, 0x0eeec8c6), TOBN(0x4a27fec1, 0x078a1821), TOBN(0x081f7415, 0xc3099524), TOBN(0x8effdf0b, 0x82cd8060), TOBN(0xdb70ec1c, 0x65842df8), TOBN(0x8821b358, 0xd319a901), TOBN(0x72ee56ee, 0xde42b529), TOBN(0x5bb39592, 0x236e4286), TOBN(0xd1183316, 0xfd6f7140), TOBN(0xf9fadb5b, 0xbd8e81f7), TOBN(0x701d5e0c, 0x5a02d962), TOBN(0xfdee4dbf, 0x1b601324), TOBN(0xbed17407, 0x35d7620e), TOBN(0x04e3c2c3, 0xf48c0012), TOBN(0x9ee29da7, 0x3455449a), TOBN(0x562cdef4, 0x91a836c4), TOBN(0x8f682a5f, 0x47701097), TOBN(0x617125d8, 0xff88d0c2), TOBN(0x948fda24, 0x57bb86dd), TOBN(0x348abb8f, 0x289f7286), TOBN(0xeb10eab5, 0x99d94bbd), TOBN(0xd51ba28e, 0x4684d160), TOBN(0xabe0e51c, 0x30c8f41a), TOBN(0x66588b45, 0x13254f4a), TOBN(0x147ebf01, 0xfad097a5), TOBN(0x49883ea8, 0x610e815d), TOBN(0xe44d60ba, 0x8a11de56), TOBN(0xa970de6e, 0x827a7a6d), TOBN(0x2be41424, 0x5e17fc19), TOBN(0xd833c657, 0x01214057), TOBN(0x1375813b, 0x363e723f), TOBN(0x6820bb88, 0xe6a52e9b), TOBN(0x7e7f6970, 0xd875d56a), TOBN(0xd6a0a9ac, 0x51fbf6bf), TOBN(0x54ba8790, 0xa3083c12), TOBN(0xebaeb23d, 0x6ae7eb64), TOBN(0xa8685c3a, 0xb99a907a), TOBN(0xf1e74550, 0x026bf40b), TOBN(0x7b73a027, 0xc802cd9e), TOBN(0x9a8a927c, 0x4fef4635), TOBN(0xe1b6f60c, 0x08191224), TOBN(0xc4126ebb, 0xde4ec091), TOBN(0xe1dff4dc, 0x4ae38d84), TOBN(0xde3f57db, 0x4f2ef985), TOBN(0x34964337, 0xd446a1dd), TOBN(0x7bf217a0, 0x859e77f6), TOBN(0x8ff10527, 0x8e1d13f5), TOBN(0xa304ef03, 0x74eeae27), TOBN(0xfc6f5e47, 0xd19dfa5a), TOBN(0xdb007de3, 0x7fad982b), TOBN(0x28205ad1, 0x613715f5), TOBN(0x251e6729, 0x7889529e), TOBN(0x72705184, 0x1ae98e78), TOBN(0xf818537d, 0x271cac32), TOBN(0xc8a15b7e, 0xb7f410f5), TOBN(0xc474356f, 0x81f62393), TOBN(0x92dbdc5a, 0xc242316b), TOBN(0xabe060ac, 0xdbf4aff5), TOBN(0x6e8c38fe, 0x909a8ec6), TOBN(0x43e514e5, 0x6116cb94), TOBN(0x2078fa38, 0x07d784f9), TOBN(0x1161a880, 0xf4b5b357), TOBN(0x5283ce79, 0x13adea3d), TOBN(0x0756c3e6, 0xcc6a910b), TOBN(0x60bcfe01, 0xaaa79697), TOBN(0x04a73b29, 0x56391db1), TOBN(0xdd8dad47, 0x189b45a0), TOBN(0xbfac0dd0, 0x48d5b8d9), TOBN(0x34ab3af5, 0x7d3d2ec2), TOBN(0x6fa2fc2d, 0x207bd3af), TOBN(0x9ff40092, 0x66550ded), TOBN(0x719b3e87, 0x1fd5b913), TOBN(0xa573a496, 0x6d17fbc7), TOBN(0x0cd1a70a, 0x73d2b24e), TOBN(0x34e2c5ca, 0xb2676937), TOBN(0xe7050b06, 0xbf669f21), TOBN(0xfbe948b6, 0x1ede9046), TOBN(0xa0530051, 0x97662659), TOBN(0x58cbd4ed, 0xf10124c5), TOBN(0xde2646e4, 0xdd6c06c8), TOBN(0x332f8108, 0x8cad38c0), TOBN(0x471b7e90, 0x6bd68ae2), TOBN(0x56ac3fb2, 0x0d8e27a3), TOBN(0xb54660db, 0x136b4b0d), TOBN(0x123a1e11, 0xa6fd8de4), TOBN(0x44dbffea, 0xa37799ef), TOBN(0x4540b977, 0xce6ac17c), TOBN(0x495173a8, 0xaf60acef)}, {TOBN(0x9ebb284d, 0x391c2a82), TOBN(0xbcdd4863, 0x158308e8), TOBN(0x006f16ec, 0x83f1edca), TOBN(0xa13e2c37, 0x695dc6c8), TOBN(0x2ab756f0, 0x4a057a87), TOBN(0xa8765500, 0xa6b48f98), TOBN(0x4252face, 0x68651c44), TOBN(0xa52b540b, 0xe1765e02), TOBN(0x4f922fc5, 0x16a0d2bb), TOBN(0x0d5cc16c, 0x1a623499), TOBN(0x9241cf3a, 0x57c62c8b), TOBN(0x2f5e6961, 0xfd1b667f), TOBN(0x5c15c70b, 0xf5a01797), TOBN(0x3d20b44d, 0x60956192), TOBN(0x04911b37, 0x071fdb52), TOBN(0xf648f916, 0x8d6f0f7b), TOBN(0x6dc1acaf, 0xe60b7cf7), TOBN(0x25860a50, 0x84a9d869), TOBN(0x56fc6f09, 0xe7ba8ac4), TOBN(0x828c5bd0, 0x6148d29e), TOBN(0xac6b435e, 0xdc55ae5f), TOBN(0xa527f56c, 0xc0117411), TOBN(0x94d5045e, 0xfd24342c), TOBN(0x2c4c0a35, 0x70b67c0d), TOBN(0x027cc8b8, 0xfac61d9a), TOBN(0x7d25e062, 0xe3c6fe8a), TOBN(0xe08805bf, 0xe5bff503), TOBN(0x13271e6c, 0x6ff632f7), TOBN(0x55dca6c0, 0x232f76a5), TOBN(0x8957c32d, 0x701ef426), TOBN(0xee728bcb, 0xa10a5178), TOBN(0x5ea60411, 0xb62c5173), TOBN(0xfc4e964e, 0xd0b8892b), TOBN(0x9ea17683, 0x9301bb74), TOBN(0x6265c5ae, 0xfcc48626), TOBN(0xe60cf82e, 0xbb3e9102), TOBN(0x57adf797, 0xd4df5531), TOBN(0x235b59a1, 0x8deeefe2), TOBN(0x60adcf58, 0x3f306eb1), TOBN(0x105c2753, 0x3d09492d), TOBN(0x4090914b, 0xb5def996), TOBN(0x1cb69c83, 0x233dd1e7), TOBN(0xc1e9c1d3, 0x9b3d5e76), TOBN(0x1f3338ed, 0xfccf6012), TOBN(0xb1e95d0d, 0x2f5378a8), TOBN(0xacf4c2c7, 0x2f00cd21), TOBN(0x6e984240, 0xeb5fe290), TOBN(0xd66c038d, 0x248088ae), TOBN(0x804d264a, 0xf94d70cf), TOBN(0xbdb802ef, 0x7314bf7e), TOBN(0x8fb54de2, 0x4333ed02), TOBN(0x740461e0, 0x285635d9), TOBN(0x4113b2c8, 0x365e9383), TOBN(0xea762c83, 0x3fdef652), TOBN(0x4eec6e2e, 0x47b956c1), TOBN(0xa3d814be, 0x65620fa4), TOBN(0x9ad5462b, 0xb4d8bc50), TOBN(0x181c0b16, 0xa9195770), TOBN(0xebd4fe1c, 0x78412a68), TOBN(0xae0341bc, 0xc0dff48c), TOBN(0xb6bc45cf, 0x7003e866), TOBN(0xf11a6dea, 0x8a24a41b), TOBN(0x5407151a, 0xd04c24c2), TOBN(0x62c9d27d, 0xda5b7b68), TOBN(0x2e964235, 0x88cceff6), TOBN(0x8594c54f, 0x8b07ed69), TOBN(0x1578e73c, 0xc84d0d0d), TOBN(0x7b4e1055, 0xff532868), TOBN(0xa348c0d5, 0xb5ec995a), TOBN(0xbf4b9d55, 0x14289a54), TOBN(0x9ba155a6, 0x58fbd777), TOBN(0x186ed7a8, 0x1a84491d), TOBN(0xd4992b30, 0x614c0900), TOBN(0xda98d121, 0xbd00c24b), TOBN(0x7f534dc8, 0x7ec4bfa1), TOBN(0x4a5ff674, 0x37dc34bc), TOBN(0x68c196b8, 0x1d7ea1d7), TOBN(0x38cf2893, 0x80a6d208), TOBN(0xfd56cd09, 0xe3cbbd6e), TOBN(0xec72e27e, 0x4205a5b6), TOBN(0x15ea68f5, 0xa44f77f7), TOBN(0x7aa5f9fd, 0xb43c52bc), TOBN(0x86ff676f, 0x94f0e609), TOBN(0xa4cde963, 0x2e2d432b), TOBN(0x8cafa0c0, 0xeee470af), TOBN(0x84137d0e, 0x8a3f5ec8), TOBN(0xebb40411, 0xfaa31231), TOBN(0xa239c13f, 0x6f7f7ccf), TOBN(0x32865719, 0xa8afd30b), TOBN(0x86798328, 0x8a826dce), TOBN(0xdf04e891, 0xc4a8fbe0), TOBN(0xbb6b6e1b, 0xebf56ad3), TOBN(0x0a695b11, 0x471f1ff0), TOBN(0xd76c3389, 0xbe15baf0), TOBN(0x018edb95, 0xbe96c43e), TOBN(0xf2beaaf4, 0x90794158), TOBN(0x152db09e, 0xc3076a27), TOBN(0x5e82908e, 0xe416545d), TOBN(0xa2c41272, 0x356d6f2e), TOBN(0xdc9c9642, 0x31fd74e1), TOBN(0x66ceb88d, 0x519bf615), TOBN(0xe29ecd76, 0x05a2274e), TOBN(0x3a0473c4, 0xbf5e2fa0), TOBN(0x6b6eb671, 0x64284e67), TOBN(0xe8b97932, 0xb88756dd), TOBN(0xed4e8652, 0xf17e3e61), TOBN(0xc2dd1499, 0x3ee1c4a4), TOBN(0xc0aaee17, 0x597f8c0e), TOBN(0x15c4edb9, 0x6c168af3), TOBN(0x6563c7bf, 0xb39ae875), TOBN(0xadfadb6f, 0x20adb436), TOBN(0xad55e8c9, 0x9a042ac0), TOBN(0x975a1ed8, 0xb76da1f5), TOBN(0x10dfa466, 0xa58acb94), TOBN(0x8dd7f7e3, 0xac060282), TOBN(0x6813e66a, 0x572a051e), TOBN(0xb4ccae1e, 0x350cb901), TOBN(0xb653d656, 0x50cb7822), TOBN(0x42484710, 0xdfab3b87), TOBN(0xcd7ee537, 0x9b670fd0), TOBN(0x0a50b12e, 0x523b8bf6), TOBN(0x8009eb5b, 0x8f910c1b), TOBN(0xf535af82, 0x4a167588), TOBN(0x0f835f9c, 0xfb2a2abd), TOBN(0xf59b2931, 0x2afceb62), TOBN(0xc797df2a, 0x169d383f), TOBN(0xeb3f5fb0, 0x66ac02b0), TOBN(0x029d4c6f, 0xdaa2d0ca), TOBN(0xd4059bc1, 0xafab4bc5), TOBN(0x833f5c6f, 0x56783247), TOBN(0xb5346630, 0x8d2d3605), TOBN(0x83387891, 0xd34d8433), TOBN(0xd973b30f, 0xadd9419a), TOBN(0xbcca1099, 0xafe3fce8), TOBN(0x08178315, 0x0809aac6), TOBN(0x01b7f21a, 0x540f0f11), TOBN(0x65c29219, 0x909523c8), TOBN(0xa62f648f, 0xa3a1c741), TOBN(0x88598d4f, 0x60c9e55a), TOBN(0xbce9141b, 0x0e4f347a), TOBN(0x9af97d84, 0x35f9b988), TOBN(0x0210da62, 0x320475b6), TOBN(0x3c076e22, 0x9191476c), TOBN(0x7520dbd9, 0x44fc7834), TOBN(0x6a6b2cfe, 0xc1ab1bbd), TOBN(0xef8a65be, 0xdc650938), TOBN(0x72855540, 0x805d7bc4), TOBN(0xda389396, 0xed11fdfd), TOBN(0xa9d5bd36, 0x74660876), TOBN(0x11d67c54, 0xb45dff35), TOBN(0x6af7d148, 0xa4f5da94), TOBN(0xbb8d4c3f, 0xc0bbeb31), TOBN(0x87a7ebd1, 0xe0a1b12a), TOBN(0x1e4ef88d, 0x770ba95f), TOBN(0x8c33345c, 0xdc2ae9cb), TOBN(0xcecf1276, 0x01cc8403), TOBN(0x687c012e, 0x1b39b80f), TOBN(0xfd90d0ad, 0x35c33ba4), TOBN(0xa3ef5a67, 0x5c9661c2), TOBN(0x368fc88e, 0xe017429e), TOBN(0xd30c6761, 0x196a2fa2), TOBN(0x931b9817, 0xbd5b312e), TOBN(0xba01000c, 0x72f54a31), TOBN(0xa203d2c8, 0x66eaa541), TOBN(0xf2abdee0, 0x98939db3), TOBN(0xe37d6c2c, 0x3e606c02), TOBN(0xf2921574, 0x521ff643), TOBN(0x2781b3c4, 0xd7e2fca3), TOBN(0x664300b0, 0x7850ec06), TOBN(0xac5a38b9, 0x7d3a10cf), TOBN(0x9233188d, 0xe34ab39d), TOBN(0xe77057e4, 0x5072cbb9), TOBN(0xbcf0c042, 0xb59e78df), TOBN(0x4cfc91e8, 0x1d97de52), TOBN(0x4661a26c, 0x3ee0ca4a), TOBN(0x5620a4c1, 0xfb8507bc), TOBN(0x4b44d4aa, 0x049f842c), TOBN(0xceabc5d5, 0x1540e82b), TOBN(0x306710fd, 0x15c6f156), TOBN(0xbe5ae52b, 0x63db1d72), TOBN(0x06f1e7e6, 0x334957f1), TOBN(0x57e388f0, 0x31144a70), TOBN(0xfb69bb2f, 0xdf96447b), TOBN(0x0f78ebd3, 0x73e38a12), TOBN(0xb8222605, 0x2b7ce542), TOBN(0xe6d4ce99, 0x7472bde1), TOBN(0x53e16ebe, 0x09d2f4da), TOBN(0x180ff42e, 0x53b92b2e), TOBN(0xc59bcc02, 0x2c34a1c6), TOBN(0x3803d6f9, 0x422c46c2), TOBN(0x18aff74f, 0x5c14a8a2), TOBN(0x55aebf80, 0x10a08b28), TOBN(0x66097d58, 0x7135593f), TOBN(0x32e6eff7, 0x2be570cd), TOBN(0x584e6a10, 0x2a8c860d), TOBN(0xcd185890, 0xa2eb4163), TOBN(0x7ceae99d, 0x6d97e134), TOBN(0xd42c6b70, 0xdd8447ce), TOBN(0x59ddbb4a, 0xb8c50273), TOBN(0x03c612df, 0x3cf34e1e), TOBN(0x84b9ca15, 0x04b6c5a0), TOBN(0x35216f39, 0x18f0e3a3), TOBN(0x3ec2d2bc, 0xbd986c00), TOBN(0x8bf546d9, 0xd19228fe), TOBN(0xd1c655a4, 0x4cd623c3), TOBN(0x366ce718, 0x502b8e5a), TOBN(0x2cfc84b4, 0xeea0bfe7), TOBN(0xe01d5cee, 0xcf443e8e), TOBN(0x8ec045d9, 0x036520f8), TOBN(0xdfb3c3d1, 0x92d40e98), TOBN(0x0bac4cce, 0xcc559a04), TOBN(0x35eccae5, 0x240ea6b1), TOBN(0x180b32db, 0xf8a5a0ac), TOBN(0x547972a5, 0xeb699700), TOBN(0xa3765801, 0xca26bca0), TOBN(0x57e09d0e, 0xa647f25a), TOBN(0xb956970e, 0x2fdd23cc), TOBN(0xb80288bc, 0x5682e971), TOBN(0xe6e6d91e, 0x9ae86ebc), TOBN(0x0564c83f, 0x8c9f1939), TOBN(0x551932a2, 0x39560368), TOBN(0xe893752b, 0x049c28e2), TOBN(0x0b03cee5, 0xa6a158c3), TOBN(0xe12d656b, 0x04964263), TOBN(0x4b47554e, 0x63e3bc1d), TOBN(0xc719b6a2, 0x45044ff7), TOBN(0x4f24d30a, 0xe48daa07), TOBN(0xa3f37556, 0xc8c1edc3), TOBN(0x9a47bf76, 0x0700d360), TOBN(0xbb1a1824, 0x822ae4e2), TOBN(0x22e275a3, 0x89f1fb4c), TOBN(0x72b1aa23, 0x9968c5f5), TOBN(0xa75feaca, 0xbe063f64), TOBN(0x9b392f43, 0xbce47a09), TOBN(0xd4241509, 0x1ad07aca), TOBN(0x4b0c591b, 0x8d26cd0f), TOBN(0x2d42ddfd, 0x92f1169a), TOBN(0x63aeb1ac, 0x4cbf2392), TOBN(0x1de9e877, 0x0691a2af), TOBN(0xebe79af7, 0xd98021da), TOBN(0xcfdf2a4e, 0x40e50acf), TOBN(0xf0a98ad7, 0xaf01d665), TOBN(0xefb640bf, 0x1831be1f), TOBN(0x6fe8bd2f, 0x80e9ada0), TOBN(0x94c103a1, 0x6cafbc91), TOBN(0x170f8759, 0x8308e08c), TOBN(0x5de2d2ab, 0x9780ff4f), TOBN(0x666466bc, 0x45b201f2), TOBN(0x58af2010, 0xf5b343bc), TOBN(0x0f2e400a, 0xf2f142fe), TOBN(0x3483bfde, 0xa85f4bdf), TOBN(0xf0b1d093, 0x03bfeaa9), TOBN(0x2ea01b95, 0xc7081603), TOBN(0xe943e4c9, 0x3dba1097), TOBN(0x47be92ad, 0xb438f3a6), TOBN(0x00bb7742, 0xe5bf6636), TOBN(0x136b7083, 0x824297b4), TOBN(0x9d0e5580, 0x5584455f), TOBN(0xab48cedc, 0xf1c7d69e), TOBN(0x53a9e481, 0x2a256e76), TOBN(0x0402b0e0, 0x65eb2413), TOBN(0xdadbbb84, 0x8fc407a7), TOBN(0xa65cd5a4, 0x8d7f5492), TOBN(0x21d44293, 0x74bae294), TOBN(0x66917ce6, 0x3b5f1cc4), TOBN(0x37ae52ea, 0xce872e62), TOBN(0xbb087b72, 0x2905f244), TOBN(0x12077086, 0x1e6af74f), TOBN(0x4b644e49, 0x1058edea), TOBN(0x827510e3, 0xb638ca1d), TOBN(0x8cf2b704, 0x6038591c), TOBN(0xffc8b47a, 0xfe635063), TOBN(0x3ae220e6, 0x1b4d5e63), TOBN(0xbd864742, 0x9d961b4b), TOBN(0x610c107e, 0x9bd16bed), TOBN(0x4270352a, 0x1127147b), TOBN(0x7d17ffe6, 0x64cfc50e), TOBN(0x50dee01a, 0x1e36cb42), TOBN(0x068a7622, 0x35dc5f9a), TOBN(0x9a08d536, 0xdf53f62c), TOBN(0x4ed71457, 0x6be5f7de), TOBN(0xd93006f8, 0xc2263c9e), TOBN(0xe073694c, 0xcacacb36), TOBN(0x2ff7a5b4, 0x3ae118ab), TOBN(0x3cce53f1, 0xcd871236), TOBN(0xf156a39d, 0xc2aa6d52), TOBN(0x9cc5f271, 0xb198d76d), TOBN(0xbc615b6f, 0x81383d39), TOBN(0xa54538e8, 0xde3eee6b), TOBN(0x58c77538, 0xab910d91), TOBN(0x31e5bdbc, 0x58d278bd), TOBN(0x3cde4adf, 0xb963acae), TOBN(0xb1881fd2, 0x5302169c), TOBN(0x8ca60fa0, 0xa989ed8b), TOBN(0xa1999458, 0xff96a0ee), TOBN(0xc1141f03, 0xac6c283d), TOBN(0x7677408d, 0x6dfafed3), TOBN(0x33a01653, 0x39661588), TOBN(0x3c9c15ec, 0x0b726fa0), TOBN(0x090cfd93, 0x6c9b56da), TOBN(0xe34f4bae, 0xa3c40af5), TOBN(0x3469eadb, 0xd21129f1), TOBN(0xcc51674a, 0x1e207ce8), TOBN(0x1e293b24, 0xc83b1ef9), TOBN(0x17173d13, 0x1e6c0bb4), TOBN(0x19004695, 0x90776d35), TOBN(0xe7980e34, 0x6de6f922), TOBN(0x873554cb, 0xf4dd9a22), TOBN(0x0316c627, 0xcbf18a51), TOBN(0x4d93651b, 0x3032c081), TOBN(0x207f2771, 0x3946834d), TOBN(0x2c08d7b4, 0x30cdbf80), TOBN(0x137a4fb4, 0x86df2a61), TOBN(0xa1ed9c07, 0xecf7b4a2), TOBN(0xb2e460e2, 0x7bd042ff), TOBN(0xb7f5e2fa, 0x5f62f5ec), TOBN(0x7aa6ec6b, 0xcc2423b7), TOBN(0x75ce0a7f, 0xba63eea7), TOBN(0x67a45fb1, 0xf250a6e1), TOBN(0x93bc919c, 0xe53cdc9f), TOBN(0x9271f56f, 0x871942df), TOBN(0x2372ff6f, 0x7859ad66), TOBN(0x5f4c2b96, 0x33cb1a78), TOBN(0xe3e29101, 0x5838aa83), TOBN(0xa7ed1611, 0xe4e8110c), TOBN(0x2a2d70d5, 0x330198ce), TOBN(0xbdf132e8, 0x6720efe0), TOBN(0xe61a8962, 0x66a471bf), TOBN(0x796d3a85, 0x825808bd), TOBN(0x51dc3cb7, 0x3fd6e902), TOBN(0x643c768a, 0x916219d1), TOBN(0x36cd7685, 0xa2ad7d32), TOBN(0xe3db9d05, 0xb22922a4), TOBN(0x6494c87e, 0xdba29660), TOBN(0xf0ac91df, 0xbcd2ebc7), TOBN(0x4deb57a0, 0x45107f8d), TOBN(0x42271f59, 0xc3d12a73), TOBN(0x5f71687c, 0xa5c2c51d), TOBN(0xcb1f50c6, 0x05797bcb), TOBN(0x29ed0ed9, 0xd6d34eb0), TOBN(0xe5fe5b47, 0x4683c2eb), TOBN(0x4956eeb5, 0x97447c46), TOBN(0x5b163a43, 0x71207167), TOBN(0x93fa2fed, 0x0248c5ef), TOBN(0x67930af2, 0x31f63950), TOBN(0xa77797c1, 0x14caa2c9), TOBN(0x526e80ee, 0x27ac7e62), TOBN(0xe1e6e626, 0x58b28aec), TOBN(0x636178b0, 0xb3c9fef0), TOBN(0xaf7752e0, 0x6d5f90be), TOBN(0x94ecaf18, 0xeece51cf), TOBN(0x2864d0ed, 0xca806e1f), TOBN(0x6de2e383, 0x97c69134), TOBN(0x5a42c316, 0xeb291293), TOBN(0xc7779219, 0x6a60bae0), TOBN(0xa24de346, 0x6b7599d1), TOBN(0x49d374aa, 0xb75d4941), TOBN(0x98900586, 0x2d501ff0), TOBN(0x9f16d40e, 0xeb7974cf), TOBN(0x1033860b, 0xcdd8c115), TOBN(0xb6c69ac8, 0x2094cec3), TOBN(0x9976fb88, 0x403b770c), TOBN(0x1dea026c, 0x4859590d), TOBN(0xb6acbb46, 0x8562d1fd), TOBN(0x7cd6c461, 0x44569d85), TOBN(0xc3190a36, 0x97f0891d), TOBN(0xc6f53195, 0x48d5a17d), TOBN(0x7d919966, 0xd749abc8), TOBN(0x65104837, 0xdd1c8a20), TOBN(0x7e5410c8, 0x2f683419), TOBN(0x958c3ca8, 0xbe94022e), TOBN(0x605c3197, 0x6145dac2), TOBN(0x3fc07501, 0x01683d54), TOBN(0x1d7127c5, 0x595b1234), TOBN(0x10b8f87c, 0x9481277f), TOBN(0x677db2a8, 0xe65a1adb), TOBN(0xec2fccaa, 0xddce3345), TOBN(0x2a6811b7, 0x012a4350), TOBN(0x96760ff1, 0xac598bdc), TOBN(0x054d652a, 0xd1bf4128), TOBN(0x0a1151d4, 0x92a21005), TOBN(0xad7f3971, 0x33110fdf), TOBN(0x8c95928c, 0x1960100f), TOBN(0x6c91c825, 0x7bf03362), TOBN(0xc8c8b2a2, 0xce309f06), TOBN(0xfdb27b59, 0xca27204b), TOBN(0xd223eaa5, 0x0848e32e), TOBN(0xb93e4b2e, 0xe7bfaf1e), TOBN(0xc5308ae6, 0x44aa3ded), TOBN(0x317a666a, 0xc015d573), TOBN(0xc888ce23, 0x1a979707), TOBN(0xf141c1e6, 0x0d5c4958), TOBN(0xb53b7de5, 0x61906373), TOBN(0x858dbade, 0xeb999595), TOBN(0x8cbb47b2, 0xa59e5c36), TOBN(0x660318b3, 0xdcf4e842), TOBN(0xbd161ccd, 0x12ba4b7a), TOBN(0xf399daab, 0xf8c8282a), TOBN(0x1587633a, 0xeeb2130d), TOBN(0xa465311a, 0xda38dd7d), TOBN(0x5f75eec8, 0x64d3779b), TOBN(0x3c5d0476, 0xad64c171), TOBN(0x87410371, 0x2a914428), TOBN(0x8096a891, 0x90e2fc29), TOBN(0xd3d2ae9d, 0x23b3ebc2), TOBN(0x90bdd6db, 0xa580cfd6), TOBN(0x52dbb7f3, 0xc5b01f6c), TOBN(0xe68eded4, 0xe102a2dc), TOBN(0x17785b77, 0x99eb6df0), TOBN(0x26c3cc51, 0x7386b779), TOBN(0x345ed988, 0x6417a48e), TOBN(0xe990b4e4, 0x07d6ef31), TOBN(0x0f456b7e, 0x2586abba), TOBN(0x239ca6a5, 0x59c96e9a), TOBN(0xe327459c, 0xe2eb4206), TOBN(0x3a4c3313, 0xa002b90a), TOBN(0x2a114806, 0xf6a3f6fb), TOBN(0xad5cad2f, 0x85c251dd), TOBN(0x92c1f613, 0xf5a784d3), TOBN(0xec7bfacf, 0x349766d5), TOBN(0x04b3cd33, 0x3e23cb3b), TOBN(0x3979fe84, 0xc5a64b2d), TOBN(0x192e2720, 0x7e589106), TOBN(0xa60c43d1, 0xa15b527f), TOBN(0x2dae9082, 0xbe7cf3a6), TOBN(0xcc86ba92, 0xbc967274), TOBN(0xf28a2ce8, 0xaea0a8a9), TOBN(0x404ca6d9, 0x6ee988b3), TOBN(0xfd7e9c5d, 0x005921b8), TOBN(0xf56297f1, 0x44e79bf9), TOBN(0xa163b460, 0x0d75ddc2), TOBN(0x30b23616, 0xa1f2be87), TOBN(0x4b070d21, 0xbfe50e2b), TOBN(0x7ef8cfd0, 0xe1bfede1), TOBN(0xadba0011, 0x2aac4ae0), TOBN(0x2a3e7d01, 0xb9ebd033), TOBN(0x995277ec, 0xe38d9d1c), TOBN(0xb500249e, 0x9c5d2de3), TOBN(0x8912b820, 0xf13ca8c9), TOBN(0xc8798114, 0x877793af), TOBN(0x19e6125d, 0xec3f1dec), TOBN(0x07b1f040, 0x911178da), TOBN(0xd93ededa, 0x904a6738), TOBN(0x55187a5a, 0x0bebedcd), TOBN(0xf7d04722, 0xeb329d41), TOBN(0xf449099e, 0xf170b391), TOBN(0xfd317a69, 0xca99f828), TOBN(0x50c3db2b, 0x34a4976d), TOBN(0xe9ba7784, 0x3757b392), TOBN(0x326caefd, 0xaa3ca05a), TOBN(0x78e5293b, 0xf1e593d4), TOBN(0x7842a937, 0x0d98fd13), TOBN(0xe694bf96, 0x5f96b10d), TOBN(0x373a9df6, 0x06a8cd05), TOBN(0x997d1e51, 0xe8f0c7fc), TOBN(0x1d019790, 0x63fd972e), TOBN(0x0064d858, 0x5499fb32), TOBN(0x7b67bad9, 0x77a8aeb7), TOBN(0x1d3eb977, 0x2d08eec5), TOBN(0x5fc047a6, 0xcbabae1d), TOBN(0x0577d159, 0xe54a64bb), TOBN(0x8862201b, 0xc43497e4), TOBN(0xad6b4e28, 0x2ce0608d), TOBN(0x8b687b7d, 0x0b167aac), TOBN(0x6ed4d367, 0x8b2ecfa9), TOBN(0x24dfe62d, 0xa90c3c38), TOBN(0xa1862e10, 0x3fe5c42b), TOBN(0x1ca73dca, 0xd5732a9f), TOBN(0x35f038b7, 0x76bb87ad), TOBN(0x674976ab, 0xf242b81f), TOBN(0x4f2bde7e, 0xb0fd90cd), TOBN(0x6efc172e, 0xa7fdf092), TOBN(0x3806b69b, 0x92222f1f), TOBN(0x5a2459ca, 0x6cf7ae70), TOBN(0x6789f69c, 0xa85217ee), TOBN(0x5f232b5e, 0xe3dc85ac), TOBN(0x660e3ec5, 0x48e9e516), TOBN(0x124b4e47, 0x3197eb31), TOBN(0x10a0cb13, 0xaafcca23), TOBN(0x7bd63ba4, 0x8213224f), TOBN(0xaffad7cc, 0x290a7f4f), TOBN(0x6b409c9e, 0x0286b461), TOBN(0x58ab809f, 0xffa407af), TOBN(0xc3122eed, 0xc68ac073), TOBN(0x17bf9e50, 0x4ef24d7e), TOBN(0x5d929794, 0x3e2a5811), TOBN(0x519bc867, 0x02902e01), TOBN(0x76bba5da, 0x39c8a851), TOBN(0xe9f9669c, 0xda94951e), TOBN(0x4b6af58d, 0x66b8d418), TOBN(0xfa321074, 0x17d426a4), TOBN(0xc78e66a9, 0x9dde6027), TOBN(0x0516c083, 0x4a53b964), TOBN(0xfc659d38, 0xff602330), TOBN(0x0ab55e5c, 0x58c5c897), TOBN(0x985099b2, 0x838bc5df), TOBN(0x061d9efc, 0xc52fc238), TOBN(0x712b2728, 0x6ac1da3f), TOBN(0xfb658149, 0x9283fe08), TOBN(0x4954ac94, 0xb8aaa2f7), TOBN(0x85c0ada4, 0x7fb2e74f), TOBN(0xee8ba98e, 0xb89926b0), TOBN(0xe4f9d37d, 0x23d1af5b), TOBN(0x14ccdbf9, 0xba9b015e), TOBN(0xb674481b, 0x7bfe7178), TOBN(0x4e1debae, 0x65405868), TOBN(0x061b2821, 0xc48c867d), TOBN(0x69c15b35, 0x513b30ea), TOBN(0x3b4a1666, 0x36871088), TOBN(0xe5e29f5d, 0x1220b1ff), TOBN(0x4b82bb35, 0x233d9f4d), TOBN(0x4e076333, 0x18cdc675)}, {TOBN(0x0d53f5c7, 0xa3e6fced), TOBN(0xe8cbbdd5, 0xf45fbdeb), TOBN(0xf85c01df, 0x13339a70), TOBN(0x0ff71880, 0x142ceb81), TOBN(0x4c4e8774, 0xbd70437a), TOBN(0x5fb32891, 0xba0bda6a), TOBN(0x1cdbebd2, 0xf18bd26e), TOBN(0x2f9526f1, 0x03a9d522), TOBN(0x40ce3051, 0x92c4d684), TOBN(0x8b04d725, 0x7612efcd), TOBN(0xb9dcda36, 0x6f9cae20), TOBN(0x0edc4d24, 0xf058856c), TOBN(0x64f2e6bf, 0x85427900), TOBN(0x3de81295, 0xdc09dfea), TOBN(0xd41b4487, 0x379bf26c), TOBN(0x50b62c6d, 0x6df135a9), TOBN(0xd4f8e3b4, 0xc72dfe67), TOBN(0xc416b0f6, 0x90e19fdf), TOBN(0x18b9098d, 0x4c13bd35), TOBN(0xac11118a, 0x15b8cb9e), TOBN(0xf598a318, 0xf0062841), TOBN(0xbfe0602f, 0x89f356f4), TOBN(0x7ae3637e, 0x30177a0c), TOBN(0x34097747, 0x61136537), TOBN(0x0db2fb5e, 0xd005832a), TOBN(0x5f5efd3b, 0x91042e4f), TOBN(0x8c4ffdc6, 0xed70f8ca), TOBN(0xe4645d0b, 0xb52da9cc), TOBN(0x9596f58b, 0xc9001d1f), TOBN(0x52c8f0bc, 0x4e117205), TOBN(0xfd4aa0d2, 0xe398a084), TOBN(0x815bfe3a, 0x104f49de), TOBN(0x97e5443f, 0x23885e5f), TOBN(0xf72f8f99, 0xe8433aab), TOBN(0xbd00b154, 0xe4d4e604), TOBN(0xd0b35e6a, 0xe5e173ff), TOBN(0x57b2a048, 0x9164722d), TOBN(0x3e3c665b, 0x88761ec8), TOBN(0x6bdd1397, 0x3da83832), TOBN(0x3c8b1a1e, 0x73dafe3b), TOBN(0x4497ace6, 0x54317cac), TOBN(0xbe600ab9, 0x521771b3), TOBN(0xb42e409e, 0xb0dfe8b8), TOBN(0x386a67d7, 0x3942310f), TOBN(0x25548d8d, 0x4431cc28), TOBN(0xa7cff142, 0x985dc524), TOBN(0x4d60f5a1, 0x93c4be32), TOBN(0x83ebd5c8, 0xd071c6e1), TOBN(0xba3a80a7, 0xb1fd2b0b), TOBN(0x9b3ad396, 0x5bec33e8), TOBN(0xb3868d61, 0x79743fb3), TOBN(0xcfd169fc, 0xfdb462fa), TOBN(0xd3b499d7, 0x9ce0a6af), TOBN(0x55dc1cf1, 0xe42d3ff8), TOBN(0x04fb9e6c, 0xc6c3e1b2), TOBN(0x47e6961d, 0x6f69a474), TOBN(0x54eb3acc, 0xe548b37b), TOBN(0xb38e7542, 0x84d40549), TOBN(0x8c3daa51, 0x7b341b4f), TOBN(0x2f6928ec, 0x690bf7fa), TOBN(0x0496b323, 0x86ce6c41), TOBN(0x01be1c55, 0x10adadcd), TOBN(0xc04e67e7, 0x4bb5faf9), TOBN(0x3cbaf678, 0xe15c9985), TOBN(0x8cd12145, 0x50ca4247), TOBN(0xba1aa47a, 0xe7dd30aa), TOBN(0x2f81ddf1, 0xe58fee24), TOBN(0x03452936, 0xeec9b0e8), TOBN(0x8bdc3b81, 0x243aea96), TOBN(0x9a2919af, 0x15c3d0e5), TOBN(0x9ea640ec, 0x10948361), TOBN(0x5ac86d5b, 0x6e0bcccf), TOBN(0xf892d918, 0xc36cf440), TOBN(0xaed3e837, 0xc939719c), TOBN(0xb07b08d2, 0xc0218b64), TOBN(0x6f1bcbba, 0xce9790dd), TOBN(0x4a84d6ed, 0x60919b8e), TOBN(0xd8900791, 0x8ac1f9eb), TOBN(0xf84941aa, 0x0dd5daef), TOBN(0xb22fe40a, 0x67fd62c5), TOBN(0x97e15ba2, 0x157f2db3), TOBN(0xbda2fc8f, 0x8e28ca9c), TOBN(0x5d050da4, 0x37b9f454), TOBN(0x3d57eb57, 0x2379d72e), TOBN(0xe9b5eba2, 0xfb5ee997), TOBN(0x01648ca2, 0xe11538ca), TOBN(0x32bb76f6, 0xf6327974), TOBN(0x338f14b8, 0xff3f4bb7), TOBN(0x524d226a, 0xd7ab9a2d), TOBN(0x9c00090d, 0x7dfae958), TOBN(0x0ba5f539, 0x8751d8c2), TOBN(0x8afcbcdd, 0x3ab8262d), TOBN(0x57392729, 0xe99d043b), TOBN(0xef51263b, 0xaebc943a), TOBN(0x9feace93, 0x20862935), TOBN(0x639efc03, 0xb06c817b), TOBN(0x1fe054b3, 0x66b4be7a), TOBN(0x3f25a9de, 0x84a37a1e), TOBN(0xf39ef1ad, 0x78d75cd9), TOBN(0xd7b58f49, 0x5062c1b5), TOBN(0x6f74f9a9, 0xff563436), TOBN(0xf718ff29, 0xe8af51e7), TOBN(0x5234d313, 0x15e97fec), TOBN(0xb6a8e2b1, 0x292f1c0a), TOBN(0xa7f53aa8, 0x327720c1), TOBN(0x956ca322, 0xba092cc8), TOBN(0x8f03d64a, 0x28746c4d), TOBN(0x51fe1782, 0x66d0d392), TOBN(0xd19b34db, 0x3c832c80), TOBN(0x60dccc5c, 0x6da2e3b4), TOBN(0x245dd62e, 0x0a104ccc), TOBN(0xa7ab1de1, 0x620b21fd), TOBN(0xb293ae0b, 0x3893d123), TOBN(0xf7b75783, 0xb15ee71c), TOBN(0x5aa3c614, 0x42a9468b), TOBN(0xd686123c, 0xdb15d744), TOBN(0x8c616891, 0xa7ab4116), TOBN(0x6fcd72c8, 0xa4e6a459), TOBN(0xac219110, 0x77e5fad7), TOBN(0xfb6a20e7, 0x704fa46b), TOBN(0xe839be7d, 0x341d81dc), TOBN(0xcddb6889, 0x32148379), TOBN(0xda6211a1, 0xf7026ead), TOBN(0xf3b2575f, 0xf4d1cc5e), TOBN(0x40cfc8f6, 0xa7a73ae6), TOBN(0x83879a5e, 0x61d5b483), TOBN(0xc5acb1ed, 0x41a50ebc), TOBN(0x59a60cc8, 0x3c07d8fa), TOBN(0x1b73bdce, 0xb1876262), TOBN(0x2b0d79f0, 0x12af4ee9), TOBN(0x8bcf3b0b, 0xd46e1d07), TOBN(0x17d6af9d, 0xe45d152f), TOBN(0x73520461, 0x6d736451), TOBN(0x43cbbd97, 0x56b0bf5a), TOBN(0xb0833a5b, 0xd5999b9d), TOBN(0x702614f0, 0xeb72e398), TOBN(0x0aadf01a, 0x59c3e9f8), TOBN(0x40200e77, 0xce6b3d16), TOBN(0xda22bdd3, 0xdeddafad), TOBN(0x76dedaf4, 0x310d72e1), TOBN(0x49ef807c, 0x4bc2e88f), TOBN(0x6ba81291, 0x146dd5a5), TOBN(0xa1a4077a, 0x7d8d59e9), TOBN(0x87b6a2e7, 0x802db349), TOBN(0xd5679997, 0x1b4e598e), TOBN(0xf499ef1f, 0x06fe4b1d), TOBN(0x3978d3ae, 0xfcb267c5), TOBN(0xb582b557, 0x235786d0), TOBN(0x32b3b2ca, 0x1715cb07), TOBN(0x4c3de6a2, 0x8480241d), TOBN(0x63b5ffed, 0xcb571ecd), TOBN(0xeaf53900, 0xed2fe9a9), TOBN(0xdec98d4a, 0xc3b81990), TOBN(0x1cb83722, 0x9e0cc8fe), TOBN(0xfe0b0491, 0xd2b427b9), TOBN(0x0f2386ac, 0xe983a66c), TOBN(0x930c4d1e, 0xb3291213), TOBN(0xa2f82b2e, 0x59a62ae4), TOBN(0x77233853, 0xf93e89e3), TOBN(0x7f8063ac, 0x11777c7f), TOBN(0xff0eb567, 0x59ad2877), TOBN(0x6f454642, 0x9865c754), TOBN(0xe6fe701a, 0x236e9a84), TOBN(0xc586ef16, 0x06e40fc3), TOBN(0x3f62b6e0, 0x24bafad9), TOBN(0xc8b42bd2, 0x64da906a), TOBN(0xc98e1eb4, 0xda3276a0), TOBN(0x30d0e5fc, 0x06cbf852), TOBN(0x1b6b2ae1, 0xe8b4dfd4), TOBN(0xd754d5c7, 0x8301cbac), TOBN(0x66097629, 0x112a39ac), TOBN(0xf86b5999, 0x93ba4ab9), TOBN(0x26c9dea7, 0x99f9d581), TOBN(0x0473b1a8, 0xc2fafeaa), TOBN(0x1469af55, 0x3b2505a5), TOBN(0x227d16d7, 0xd6a43323), TOBN(0x3316f73c, 0xad3d97f9), TOBN(0x52bf3bb5, 0x1f137455), TOBN(0x953eafeb, 0x09954e7c), TOBN(0xa721dfed, 0xdd732411), TOBN(0xb4929821, 0x141d4579), TOBN(0x3411321c, 0xaa3bd435), TOBN(0xafb355aa, 0x17fa6015), TOBN(0xb4e7ef4a, 0x18e42f0e), TOBN(0x604ac97c, 0x59371000), TOBN(0xe1c48c70, 0x7f759c18), TOBN(0x3f62ecc5, 0xa5db6b65), TOBN(0x0a78b173, 0x38a21495), TOBN(0x6be1819d, 0xbcc8ad94), TOBN(0x70dc04f6, 0xd89c3400), TOBN(0x462557b4, 0xa6b4840a), TOBN(0x544c6ade, 0x60bd21c0), TOBN(0x6a00f24e, 0x907a544b), TOBN(0xa7520dcb, 0x313da210), TOBN(0xfe939b75, 0x11e4994b), TOBN(0x918b6ba6, 0xbc275d70), TOBN(0xd3e5e0fc, 0x644be892), TOBN(0x707a9816, 0xfdaf6c42), TOBN(0x60145567, 0xf15c13fe), TOBN(0x4818ebaa, 0xe130a54a), TOBN(0x28aad3ad, 0x58d2f767), TOBN(0xdc5267fd, 0xd7e7c773), TOBN(0x4919cc88, 0xc3afcc98), TOBN(0xaa2e6ab0, 0x2db8cd4b), TOBN(0xd46fec04, 0xd0c63eaa), TOBN(0xa1cb92c5, 0x19ffa832), TOBN(0x678dd178, 0xe43a631f), TOBN(0xfb5ae1cd, 0x3dc788b3), TOBN(0x68b4fb90, 0x6e77de04), TOBN(0x7992bcf0, 0xf06dbb97), TOBN(0x896e6a13, 0xc417c01d), TOBN(0x8d96332c, 0xb956be01), TOBN(0x902fc93a, 0x413aa2b9), TOBN(0x99a4d915, 0xfc98c8a5), TOBN(0x52c29407, 0x565f1137), TOBN(0x4072690f, 0x21e4f281), TOBN(0x36e607cf, 0x02ff6072), TOBN(0xa47d2ca9, 0x8ad98cdc), TOBN(0xbf471d1e, 0xf5f56609), TOBN(0xbcf86623, 0xf264ada0), TOBN(0xb70c0687, 0xaa9e5cb6), TOBN(0xc98124f2, 0x17401c6c), TOBN(0x8189635f, 0xd4a61435), TOBN(0xd28fb8af, 0xa9d98ea6), TOBN(0xb9a67c2a, 0x40c251f8), TOBN(0x88cd5d87, 0xa2da44be), TOBN(0x437deb96, 0xe09b5423), TOBN(0x150467db, 0x64287dc1), TOBN(0xe161debb, 0xcdabb839), TOBN(0xa79e9742, 0xf1839a3e), TOBN(0xbb8dd3c2, 0x652d202b), TOBN(0x7b3e67f7, 0xe9f97d96), TOBN(0x5aa5d78f, 0xb1cb6ac9), TOBN(0xffa13e8e, 0xca1d0d45), TOBN(0x369295dd, 0x2ba5bf95), TOBN(0xd68bd1f8, 0x39aff05e), TOBN(0xaf0d86f9, 0x26d783f2), TOBN(0x543a59b3, 0xfc3aafc1), TOBN(0x3fcf81d2, 0x7b7da97c), TOBN(0xc990a056, 0xd25dee46), TOBN(0x3e6775b8, 0x519cce2c), TOBN(0xfc9af71f, 0xae13d863), TOBN(0x774a4a6f, 0x47c1605c), TOBN(0x46ba4245, 0x2fd205e8), TOBN(0xa06feea4, 0xd3fd524d), TOBN(0x1e724641, 0x6de1acc2), TOBN(0xf53816f1, 0x334e2b42), TOBN(0x49e5918e, 0x922f0024), TOBN(0x439530b6, 0x65c7322d), TOBN(0xcf12cc01, 0xb3c1b3fb), TOBN(0xc70b0186, 0x0172f685), TOBN(0xb915ee22, 0x1b58391d), TOBN(0x9afdf03b, 0xa317db24), TOBN(0x87dec659, 0x17b8ffc4), TOBN(0x7f46597b, 0xe4d3d050), TOBN(0x80a1c1ed, 0x006500e7), TOBN(0x84902a96, 0x78bf030e), TOBN(0xfb5e9c9a, 0x50560148), TOBN(0x6dae0a92, 0x63362426), TOBN(0xdcaeecf4, 0xa9e30c40), TOBN(0xc0d887bb, 0x518d0c6b), TOBN(0x99181152, 0xcb985b9d), TOBN(0xad186898, 0xef7bc381), TOBN(0x18168ffb, 0x9ee46201), TOBN(0x9a04cdaa, 0x2502753c), TOBN(0xbb279e26, 0x51407c41), TOBN(0xeacb03aa, 0xf23564e5), TOBN(0x18336582, 0x71e61016), TOBN(0x8684b8c4, 0xeb809877), TOBN(0xb336e18d, 0xea0e672e), TOBN(0xefb601f0, 0x34ee5867), TOBN(0x2733edbe, 0x1341cfd1), TOBN(0xb15e809a, 0x26025c3c), TOBN(0xe6e981a6, 0x9350df88), TOBN(0x92376237, 0x8502fd8e), TOBN(0x4791f216, 0x0c12be9b), TOBN(0xb7256789, 0x25f02425), TOBN(0xec863194, 0x7a974443), TOBN(0x7c0ce882, 0xfb41cc52), TOBN(0xc266ff7e, 0xf25c07f2), TOBN(0x3d4da8c3, 0x017025f3), TOBN(0xefcf628c, 0xfb9579b4), TOBN(0x5c4d0016, 0x1f3716ec), TOBN(0x9c27ebc4, 0x6801116e), TOBN(0x5eba0ea1, 0x1da1767e), TOBN(0xfe151452, 0x47004c57), TOBN(0x3ace6df6, 0x8c2373b7), TOBN(0x75c3dffe, 0x5dbc37ac), TOBN(0x3dc32a73, 0xddc925fc), TOBN(0xb679c841, 0x2f65ee0b), TOBN(0x715a3295, 0x451cbfeb), TOBN(0xd9889768, 0xf76e9a29), TOBN(0xec20ce7f, 0xb28ad247), TOBN(0xe99146c4, 0x00894d79), TOBN(0x71457d7c, 0x9f5e3ea7), TOBN(0x097b2662, 0x38030031), TOBN(0xdb7f6ae6, 0xcf9f82a8), TOBN(0x319decb9, 0x438f473a), TOBN(0xa63ab386, 0x283856c3), TOBN(0x13e3172f, 0xb06a361b), TOBN(0x2959f8dc, 0x7d5a006c), TOBN(0x2dbc27c6, 0x75fba752), TOBN(0xc1227ab2, 0x87c22c9e), TOBN(0x06f61f75, 0x71a268b2), TOBN(0x1b6bb971, 0x04779ce2), TOBN(0xaca83812, 0x0aadcb1d), TOBN(0x297ae0bc, 0xaeaab2d5), TOBN(0xa5c14ee7, 0x5bfb9f13), TOBN(0xaa00c583, 0xf17a62c7), TOBN(0x39eb962c, 0x173759f6), TOBN(0x1eeba1d4, 0x86c9a88f), TOBN(0x0ab6c37a, 0xdf016c5e), TOBN(0xa2a147db, 0xa28a0749), TOBN(0x246c20d6, 0xee519165), TOBN(0x5068d1b1, 0xd3810715), TOBN(0xb1e7018c, 0x748160b9), TOBN(0x03f5b1fa, 0xf380ff62), TOBN(0xef7fb1dd, 0xf3cb2c1e), TOBN(0xeab539a8, 0xfc91a7da), TOBN(0x83ddb707, 0xf3f9b561), TOBN(0xc550e211, 0xfe7df7a4), TOBN(0xa7cd07f2, 0x063f6f40), TOBN(0xb0de3635, 0x2976879c), TOBN(0xb5f83f85, 0xe55741da), TOBN(0x4ea9d25e, 0xf3d8ac3d), TOBN(0x6fe2066f, 0x62819f02), TOBN(0x4ab2b9c2, 0xcef4a564), TOBN(0x1e155d96, 0x5ffa2de3), TOBN(0x0eb0a19b, 0xc3a72d00), TOBN(0x4037665b, 0x8513c31b), TOBN(0x2fb2b6bf, 0x04c64637), TOBN(0x45c34d6e, 0x08cdc639), TOBN(0x56f1e10f, 0xf01fd796), TOBN(0x4dfb8101, 0xfe3667b8), TOBN(0xe0eda253, 0x9021d0c0), TOBN(0x7a94e9ff, 0x8a06c6ab), TOBN(0x2d3bb0d9, 0xbb9aa882), TOBN(0xea20e4e5, 0xec05fd10), TOBN(0xed7eeb5f, 0x1a1ca64e), TOBN(0x2fa6b43c, 0xc6327cbd), TOBN(0xb577e3cf, 0x3aa91121), TOBN(0x8c6bd5ea, 0x3a34079b), TOBN(0xd7e5ba39, 0x60e02fc0), TOBN(0xf16dd2c3, 0x90141bf8), TOBN(0xb57276d9, 0x80101b98), TOBN(0x760883fd, 0xb82f0f66), TOBN(0x89d7de75, 0x4bc3eff3), TOBN(0x03b60643, 0x5dc2ab40), TOBN(0xcd6e53df, 0xe05beeac), TOBN(0xf2f1e862, 0xbc3325cd), TOBN(0xdd0f7921, 0x774f03c3), TOBN(0x97ca7221, 0x4552cc1b), TOBN(0x5a0d6afe, 0x1cd19f72), TOBN(0xa20915dc, 0xf183fbeb), TOBN(0x9fda4b40, 0x832c403c), TOBN(0x32738edd, 0xbe425442), TOBN(0x469a1df6, 0xb5eccf1a), TOBN(0x4b5aff42, 0x28bbe1f0), TOBN(0x31359d7f, 0x570dfc93), TOBN(0xa18be235, 0xf0088628), TOBN(0xa5b30fba, 0xb00ed3a9), TOBN(0x34c61374, 0x73cdf8be), TOBN(0x2c5c5f46, 0xabc56797), TOBN(0x5cecf93d, 0xb82a8ae2), TOBN(0x7d3dbe41, 0xa968fbf0), TOBN(0xd23d4583, 0x1a5c7f3d), TOBN(0xf28f69a0, 0xc087a9c7), TOBN(0xc2d75471, 0x474471ca), TOBN(0x36ec9f4a, 0x4eb732ec), TOBN(0x6c943bbd, 0xb1ca6bed), TOBN(0xd64535e1, 0xf2457892), TOBN(0x8b84a8ea, 0xf7e2ac06), TOBN(0xe0936cd3, 0x2499dd5f), TOBN(0x12053d7e, 0x0ed04e57), TOBN(0x4bdd0076, 0xe4305d9d), TOBN(0x34a527b9, 0x1f67f0a2), TOBN(0xe79a4af0, 0x9cec46ea), TOBN(0xb15347a1, 0x658b9bc7), TOBN(0x6bd2796f, 0x35af2f75), TOBN(0xac957990, 0x4051c435), TOBN(0x2669dda3, 0xc33a655d), TOBN(0x5d503c2e, 0x88514aa3), TOBN(0xdfa11337, 0x3753dd41), TOBN(0x3f054673, 0x0b754f78), TOBN(0xbf185677, 0x496125bd), TOBN(0xfb0023c8, 0x3775006c), TOBN(0xfa0f072f, 0x3a037899), TOBN(0x4222b6eb, 0x0e4aea57), TOBN(0x3dde5e76, 0x7866d25a), TOBN(0xb6eb04f8, 0x4837aa6f), TOBN(0x5315591a, 0x2cf1cdb8), TOBN(0x6dfb4f41, 0x2d4e683c), TOBN(0x7e923ea4, 0x48ee1f3a), TOBN(0x9604d9f7, 0x05a2afd5), TOBN(0xbe1d4a33, 0x40ea4948), TOBN(0x5b45f1f4, 0xb44cbd2f), TOBN(0x5faf8376, 0x4acc757e), TOBN(0xa7cf9ab8, 0x63d68ff7), TOBN(0x8ad62f69, 0xdf0e404b), TOBN(0xd65f33c2, 0x12bdafdf), TOBN(0xc365de15, 0xa377b14e), TOBN(0x6bf5463b, 0x8e39f60c), TOBN(0x62030d2d, 0x2ce68148), TOBN(0xd95867ef, 0xe6f843a8), TOBN(0xd39a0244, 0xef5ab017), TOBN(0x0bd2d8c1, 0x4ab55d12), TOBN(0xc9503db3, 0x41639169), TOBN(0x2d4e25b0, 0xf7660c8a), TOBN(0x760cb3b5, 0xe224c5d7), TOBN(0xfa3baf8c, 0x68616919), TOBN(0x9fbca113, 0x8d142552), TOBN(0x1ab18bf1, 0x7669ebf5), TOBN(0x55e6f53e, 0x9bdf25dd), TOBN(0x04cc0bf3, 0xcb6cd154), TOBN(0x595bef49, 0x95e89080), TOBN(0xfe9459a8, 0x104a9ac1), TOBN(0xad2d89ca, 0xcce9bb32), TOBN(0xddea65e1, 0xf7de8285), TOBN(0x62ed8c35, 0xb351bd4b), TOBN(0x4150ff36, 0x0c0e19a7), TOBN(0x86e3c801, 0x345f4e47), TOBN(0x3bf21f71, 0x203a266c), TOBN(0x7ae110d4, 0x855b1f13), TOBN(0x5d6aaf6a, 0x07262517), TOBN(0x1e0f12e1, 0x813d28f1), TOBN(0x6000e11d, 0x7ad7a523), TOBN(0xc7d8deef, 0xc744a17b), TOBN(0x1e990b48, 0x14c05a00), TOBN(0x68fddaee, 0x93e976d5), TOBN(0x696241d1, 0x46610d63), TOBN(0xb204e7c3, 0x893dda88), TOBN(0x8bccfa65, 0x6a3a6946), TOBN(0xb59425b4, 0xc5cd1411), TOBN(0x701b4042, 0xff3658b1), TOBN(0xe3e56bca, 0x4784cf93), TOBN(0x27de5f15, 0x8fe68d60), TOBN(0x4ab9cfce, 0xf8d53f19), TOBN(0xddb10311, 0xa40a730d), TOBN(0x6fa73cd1, 0x4eee0a8a), TOBN(0xfd548748, 0x5249719d), TOBN(0x49d66316, 0xa8123ef0), TOBN(0x73c32db4, 0xe7f95438), TOBN(0x2e2ed209, 0x0d9e7854), TOBN(0xf98a9329, 0x9d9f0507), TOBN(0xc5d33cf6, 0x0c6aa20a), TOBN(0x9a32ba14, 0x75279bb2), TOBN(0x7e3202cb, 0x774a7307), TOBN(0x64ed4bc4, 0xe8c42dbd), TOBN(0xc20f1a06, 0xd4caed0d), TOBN(0xb8021407, 0x171d22b3), TOBN(0xd426ca04, 0xd13268d7), TOBN(0x92377007, 0x25f4d126), TOBN(0x4204cbc3, 0x71f21a85), TOBN(0x18461b7a, 0xf82369ba), TOBN(0xc0c07d31, 0x3fc858f9), TOBN(0x5deb5a50, 0xe2bab569), TOBN(0xd5959d46, 0xd5eea89e), TOBN(0xfdff8424, 0x08437f4b), TOBN(0xf21071e4, 0x3cfe254f), TOBN(0x72417696, 0x95468321), TOBN(0x5d8288b9, 0x102cae3e), TOBN(0x2d143e3d, 0xf1965dff), TOBN(0x00c9a376, 0xa078d847), TOBN(0x6fc0da31, 0x26028731), TOBN(0xa2baeadf, 0xe45083a2), TOBN(0x66bc7218, 0x5e5b4bcd), TOBN(0x2c826442, 0xd04b8e7f), TOBN(0xc19f5451, 0x6c4b586b), TOBN(0x60182c49, 0x5b7eeed5), TOBN(0xd9954ecd, 0x7aa9dfa1), TOBN(0xa403a8ec, 0xc73884ad), TOBN(0x7fb17de2, 0x9bb39041), TOBN(0x694b64c5, 0xabb020e8), TOBN(0x3d18c184, 0x19c4eec7), TOBN(0x9c4673ef, 0x1c4793e5), TOBN(0xc7b8aeb5, 0x056092e6), TOBN(0x3aa1ca43, 0xf0f8c16b), TOBN(0x224ed5ec, 0xd679b2f6), TOBN(0x0d56eeaf, 0x55a205c9), TOBN(0xbfe115ba, 0x4b8e028b), TOBN(0x97e60849, 0x3927f4fe), TOBN(0xf91fbf94, 0x759aa7c5), TOBN(0x985af769, 0x6be90a51), TOBN(0xc1277b78, 0x78ccb823), TOBN(0x395b656e, 0xe7a75952), TOBN(0x00df7de0, 0x928da5f5), TOBN(0x09c23175, 0x4ca4454f), TOBN(0x4ec971f4, 0x7aa2d3c1), TOBN(0x45c3c507, 0xe75d9ccc), TOBN(0x63b7be8a, 0x3dc90306), TOBN(0x37e09c66, 0x5db44bdc), TOBN(0x50d60da1, 0x6841c6a2), TOBN(0x6f9b65ee, 0x08df1b12), TOBN(0x38734879, 0x7ff089df), TOBN(0x9c331a66, 0x3fe8013d), TOBN(0x017f5de9, 0x5f42fcc8), TOBN(0x43077866, 0xe8e57567), TOBN(0xc9f781ce, 0xf9fcdb18), TOBN(0x38131dda, 0x9b12e174), TOBN(0x25d84aa3, 0x8a03752a), TOBN(0x45e09e09, 0x4d0c0ce2), TOBN(0x1564008b, 0x92bebba5), TOBN(0xf7e8ad31, 0xa87284c7), TOBN(0xb7c4b46c, 0x97e7bbaa), TOBN(0x3e22a7b3, 0x97acf4ec), TOBN(0x0426c400, 0x5ea8b640), TOBN(0x5e3295a6, 0x4e969285), TOBN(0x22aabc59, 0xa6a45670), TOBN(0xb929714c, 0x5f5942bc), TOBN(0x9a6168bd, 0xfa3182ed), TOBN(0x2216a665, 0x104152ba), TOBN(0x46908d03, 0xb6926368)}, {TOBN(0xa9f5d874, 0x5a1251fb), TOBN(0x967747a8, 0xc72725c7), TOBN(0x195c33e5, 0x31ffe89e), TOBN(0x609d210f, 0xe964935e), TOBN(0xcafd6ca8, 0x2fe12227), TOBN(0xaf9b5b96, 0x0426469d), TOBN(0x2e9ee04c, 0x5693183c), TOBN(0x1084a333, 0xc8146fef), TOBN(0x96649933, 0xaed1d1f7), TOBN(0x566eaff3, 0x50563090), TOBN(0x345057f0, 0xad2e39cf), TOBN(0x148ff65b, 0x1f832124), TOBN(0x042e89d4, 0xcf94cf0d), TOBN(0x319bec84, 0x520c58b3), TOBN(0x2a267626, 0x5361aa0d), TOBN(0xc86fa302, 0x8fbc87ad), TOBN(0xfc83d2ab, 0x5c8b06d5), TOBN(0xb1a785a2, 0xfe4eac46), TOBN(0xb99315bc, 0x846f7779), TOBN(0xcf31d816, 0xef9ea505), TOBN(0x2391fe6a, 0x15d7dc85), TOBN(0x2f132b04, 0xb4016b33), TOBN(0x29547fe3, 0x181cb4c7), TOBN(0xdb66d8a6, 0x650155a1), TOBN(0x6b66d7e1, 0xadc1696f), TOBN(0x98ebe593, 0x0acd72d0), TOBN(0x65f24550, 0xcc1b7435), TOBN(0xce231393, 0xb4b9a5ec), TOBN(0x234a22d4, 0xdb067df9), TOBN(0x98dda095, 0xcaff9b00), TOBN(0x1bbc75a0, 0x6100c9c1), TOBN(0x1560a9c8, 0x939cf695), TOBN(0xcf006d3e, 0x99e0925f), TOBN(0x2dd74a96, 0x6322375a), TOBN(0xc58b446a, 0xb56af5ba), TOBN(0x50292683, 0xe0b9b4f1), TOBN(0xe2c34cb4, 0x1aeaffa3), TOBN(0x8b17203f, 0x9b9587c1), TOBN(0x6d559207, 0xead1350c), TOBN(0x2b66a215, 0xfb7f9604), TOBN(0x0850325e, 0xfe51bf74), TOBN(0x9c4f579e, 0x5e460094), TOBN(0x5c87b92a, 0x76da2f25), TOBN(0x889de4e0, 0x6febef33), TOBN(0x6900ec06, 0x646083ce), TOBN(0xbe2a0335, 0xbfe12773), TOBN(0xadd1da35, 0xc5344110), TOBN(0x757568b7, 0xb802cd20), TOBN(0x75559779, 0x00f7e6c8), TOBN(0x38e8b94f, 0x0facd2f0), TOBN(0xfea1f3af, 0x03fde375), TOBN(0x5e11a1d8, 0x75881dfc), TOBN(0xb3a6b02e, 0xc1e2f2ef), TOBN(0x193d2bbb, 0xc605a6c5), TOBN(0x325ffeee, 0x339a0b2d), TOBN(0x27b6a724, 0x9e0c8846), TOBN(0xe4050f1c, 0xf1c367ca), TOBN(0x9bc85a9b, 0xc90fbc7d), TOBN(0xa373c4a2, 0xe1a11032), TOBN(0xb64232b7, 0xad0393a9), TOBN(0xf5577eb0, 0x167dad29), TOBN(0x1604f301, 0x94b78ab2), TOBN(0x0baa94af, 0xe829348b), TOBN(0x77fbd8dd, 0x41654342), TOBN(0xdab50ea5, 0xb964e39a), TOBN(0xd4c29e3c, 0xd0d3c76e), TOBN(0x80dae67c, 0x56d11964), TOBN(0x7307a8bf, 0xe5ffcc2f), TOBN(0x65bbc1aa, 0x91708c3b), TOBN(0xa151e62c, 0x28bf0eeb), TOBN(0x6cb53381, 0x6fa34db7), TOBN(0x5139e05c, 0xa29403a8), TOBN(0x6ff651b4, 0x94a7cd2e), TOBN(0x5671ffd1, 0x0699336c), TOBN(0x6f5fd2cc, 0x979a896a), TOBN(0x11e893a8, 0xd8148cef), TOBN(0x988906a1, 0x65cf7b10), TOBN(0x81b67178, 0xc50d8485), TOBN(0x7c0deb35, 0x8a35b3de), TOBN(0x423ac855, 0xc1d29799), TOBN(0xaf580d87, 0xdac50b74), TOBN(0x28b2b89f, 0x5869734c), TOBN(0x99a3b936, 0x874e28fb), TOBN(0xbb2c9190, 0x25f3f73a), TOBN(0x199f6918, 0x84a9d5b7), TOBN(0x7ebe2325, 0x7e770374), TOBN(0xf442e107, 0x0738efe2), TOBN(0xcf9f3f56, 0xcf9082d2), TOBN(0x719f69e1, 0x09618708), TOBN(0xcc9e8364, 0xc183f9b1), TOBN(0xec203a95, 0x366a21af), TOBN(0x6aec5d6d, 0x068b141f), TOBN(0xee2df78a, 0x994f04e9), TOBN(0xb39ccae8, 0x271245b0), TOBN(0xb875a4a9, 0x97e43f4f), TOBN(0x507dfe11, 0xdb2cea98), TOBN(0x4fbf81cb, 0x489b03e9), TOBN(0xdb86ec5b, 0x6ec414fa), TOBN(0xfad444f9, 0xf51b3ae5), TOBN(0xca7d33d6, 0x1914e3fe), TOBN(0xa9c32f5c, 0x0ae6c4d0), TOBN(0xa9ca1d1e, 0x73969568), TOBN(0x98043c31, 0x1aa7467e), TOBN(0xe832e75c, 0xe21b5ac6), TOBN(0x314b7aea, 0x5232123d), TOBN(0x08307c8c, 0x65ae86db), TOBN(0x06e7165c, 0xaa4668ed), TOBN(0xb170458b, 0xb4d3ec39), TOBN(0x4d2e3ec6, 0xc19bb986), TOBN(0xc5f34846, 0xae0304ed), TOBN(0x917695a0, 0x6c9f9722), TOBN(0x6c7f7317, 0x4cab1c0a), TOBN(0x6295940e, 0x9d6d2e8b), TOBN(0xd318b8c1, 0x549f7c97), TOBN(0x22453204, 0x97713885), TOBN(0x468d834b, 0xa8a440fe), TOBN(0xd81fe5b2, 0xbfba796e), TOBN(0x152364db, 0x6d71f116), TOBN(0xbb8c7c59, 0xb5b66e53), TOBN(0x0b12c61b, 0x2641a192), TOBN(0x31f14802, 0xfcf0a7fd), TOBN(0x42fd0789, 0x5488b01e), TOBN(0x71d78d6d, 0x9952b498), TOBN(0x8eb572d9, 0x07ac5201), TOBN(0xe0a2a44c, 0x4d194a88), TOBN(0xd2b63fd9, 0xba017e66), TOBN(0x78efc6c8, 0xf888aefc), TOBN(0xb76f6bda, 0x4a881a11), TOBN(0x187f314b, 0xb46c2397), TOBN(0x004cf566, 0x5ded2819), TOBN(0xa9ea5704, 0x38764d34), TOBN(0xbba45217, 0x78084709), TOBN(0x06474571, 0x1171121e), TOBN(0xad7b7eb1, 0xe7c9b671), TOBN(0xdacfbc40, 0x730f7507), TOBN(0x178cd8c6, 0xc7ad7bd1), TOBN(0xbf0be101, 0xb2a67238), TOBN(0x3556d367, 0xaf9c14f2), TOBN(0x104b7831, 0xa5662075), TOBN(0x58ca59bb, 0x79d9e60a), TOBN(0x4bc45392, 0xa569a73b), TOBN(0x517a52e8, 0x5698f6c9), TOBN(0x85643da5, 0xaeadd755), TOBN(0x1aed0cd5, 0x2a581b84), TOBN(0xb9b4ff84, 0x80af1372), TOBN(0x244c3113, 0xf1ba5d1f), TOBN(0x2a5dacbe, 0xf5f98d31), TOBN(0x2c3323e8, 0x4375bc2a), TOBN(0x17a3ab4a, 0x5594b1dd), TOBN(0xa1928bfb, 0xceb4797e), TOBN(0xe83af245, 0xe4886a19), TOBN(0x8979d546, 0x72b5a74a), TOBN(0xa0f726bc, 0x19f9e967), TOBN(0xd9d03152, 0xe8fbbf4e), TOBN(0xcfd6f51d, 0xb7707d40), TOBN(0x633084d9, 0x63f6e6e0), TOBN(0xedcd9cdc, 0x55667eaf), TOBN(0x73b7f92b, 0x2e44d56f), TOBN(0xfb2e39b6, 0x4e962b14), TOBN(0x7d408f6e, 0xf671fcbf), TOBN(0xcc634ddc, 0x164a89bb), TOBN(0x74a42bb2, 0x3ef3bd05), TOBN(0x1280dbb2, 0x428decbb), TOBN(0x6103f6bb, 0x402c8596), TOBN(0xfa2bf581, 0x355a5752), TOBN(0x562f96a8, 0x00946674), TOBN(0x4e4ca16d, 0x6da0223b), TOBN(0xfe47819f, 0x28d3aa25), TOBN(0x9eea3075, 0xf8dfcf8a), TOBN(0xa284f0aa, 0x95669825), TOBN(0xb3fca250, 0x867d3fd8), TOBN(0x20757b5f, 0x269d691e), TOBN(0xf2c24020, 0x93b8a5de), TOBN(0xd3f93359, 0xebc06da6), TOBN(0x1178293e, 0xb2739c33), TOBN(0xd2a3e770, 0xbcd686e5), TOBN(0xa76f49f4, 0xcd941534), TOBN(0x0d37406b, 0xe3c71c0e), TOBN(0x172d9397, 0x3b97f7e3), TOBN(0xec17e239, 0xbd7fd0de), TOBN(0xe3290551, 0x6f496ba2), TOBN(0x6a693172, 0x36ad50e7), TOBN(0xc4e539a2, 0x83e7eff5), TOBN(0x752737e7, 0x18e1b4cf), TOBN(0xa2f7932c, 0x68af43ee), TOBN(0x5502468e, 0x703d00bd), TOBN(0xe5dc978f, 0x2fb061f5), TOBN(0xc9a1904a, 0x28c815ad), TOBN(0xd3af538d, 0x470c56a4), TOBN(0x159abc5f, 0x193d8ced), TOBN(0x2a37245f, 0x20108ef3), TOBN(0xfa17081e, 0x223f7178), TOBN(0x27b0fb2b, 0x10c8c0f5), TOBN(0x2102c3ea, 0x40650547), TOBN(0x594564df, 0x8ac3bfa7), TOBN(0x98102033, 0x509dad96), TOBN(0x6989643f, 0xf1d18a13), TOBN(0x35eebd91, 0xd7fc5af0), TOBN(0x078d096a, 0xfaeaafd8), TOBN(0xb7a89341, 0xdef3de98), TOBN(0x2a206e8d, 0xecf2a73a), TOBN(0x066a6397, 0x8e551994), TOBN(0x3a6a088a, 0xb98d53a2), TOBN(0x0ce7c67c, 0x2d1124aa), TOBN(0x48cec671, 0x759a113c), TOBN(0xe3b373d3, 0x4f6f67fa), TOBN(0x5455d479, 0xfd36727b), TOBN(0xe5a428ee, 0xa13c0d81), TOBN(0xb853dbc8, 0x1c86682b), TOBN(0xb78d2727, 0xb8d02b2a), TOBN(0xaaf69bed, 0x8ebc329a), TOBN(0xdb6b40b3, 0x293b2148), TOBN(0xe42ea77d, 0xb8c4961f), TOBN(0xb1a12f7c, 0x20e5e0ab), TOBN(0xa0ec5274, 0x79e8b05e), TOBN(0x68027391, 0xfab60a80), TOBN(0x6bfeea5f, 0x16b1bd5e), TOBN(0xf957e420, 0x4de30ad3), TOBN(0xcbaf664e, 0x6a353b9e), TOBN(0x5c873312, 0x26d14feb), TOBN(0x4e87f98c, 0xb65f57cb), TOBN(0xdb60a621, 0x5e0cdd41), TOBN(0x67c16865, 0xa6881440), TOBN(0x1093ef1a, 0x46ab52aa), TOBN(0xc095afb5, 0x3f4ece64), TOBN(0x6a6bb02e, 0x7604551a), TOBN(0x55d44b4e, 0x0b26b8cd), TOBN(0xe5f9a999, 0xf971268a), TOBN(0xc08ec425, 0x11a7de84), TOBN(0x83568095, 0xfda469dd), TOBN(0x737bfba1, 0x6c6c90a2), TOBN(0x1cb9c4a0, 0xbe229831), TOBN(0x93bccbba, 0xbb2eec64), TOBN(0xa0c23b64, 0xda03adbe), TOBN(0x5f7aa00a, 0xe0e86ac4), TOBN(0x470b941e, 0xfc1401e6), TOBN(0x5ad8d679, 0x9df43574), TOBN(0x4ccfb8a9, 0x0f65d810), TOBN(0x1bce80e3, 0xaa7fbd81), TOBN(0x273291ad, 0x9508d20a), TOBN(0xf5c4b46b, 0x42a92806), TOBN(0x810684ec, 0xa86ab44a), TOBN(0x4591640b, 0xca0bc9f8), TOBN(0xb5efcdfc, 0x5c4b6054), TOBN(0x16fc8907, 0x6e9edd12), TOBN(0xe29d0b50, 0xd4d792f9), TOBN(0xa45fd01c, 0x9b03116d), TOBN(0x85035235, 0xc81765a4), TOBN(0x1fe2a9b2, 0xb4b4b67c), TOBN(0xc1d10df0, 0xe8020604), TOBN(0x9d64abfc, 0xbc8058d8), TOBN(0x8943b9b2, 0x712a0fbb), TOBN(0x90eed914, 0x3b3def04), TOBN(0x85ab3aa2, 0x4ce775ff), TOBN(0x605fd4ca, 0x7bbc9040), TOBN(0x8b34a564, 0xe2c75dfb), TOBN(0x41ffc94a, 0x10358560), TOBN(0x2d8a5072, 0x9e5c28aa), TOBN(0xe915a0fc, 0x4cc7eb15), TOBN(0xe9efab05, 0x8f6d0f5d), TOBN(0xdbab47a9, 0xd19e9b91), TOBN(0x8cfed745, 0x0276154c), TOBN(0x154357ae, 0x2cfede0d), TOBN(0x520630df, 0x19f5a4ef), TOBN(0x25759f7c, 0xe382360f), TOBN(0xb6db05c9, 0x88bf5857), TOBN(0x2917d61d, 0x6c58d46c), TOBN(0x14f8e491, 0xfd20cb7a), TOBN(0xb68a727a, 0x11c20340), TOBN(0x0386f86f, 0xaf7ccbb6), TOBN(0x5c8bc6cc, 0xfee09a20), TOBN(0x7d76ff4a, 0xbb7eea35), TOBN(0xa7bdebe7, 0xdb15be7a), TOBN(0x67a08054, 0xd89f0302), TOBN(0x56bf0ea9, 0xc1193364), TOBN(0xc8244467, 0x62837ebe), TOBN(0x32bd8e8b, 0x20d841b8), TOBN(0x127a0548, 0xdbb8a54f), TOBN(0x83dd4ca6, 0x63b20236), TOBN(0x87714718, 0x203491fa), TOBN(0x4dabcaaa, 0xaa8a5288), TOBN(0x91cc0c8a, 0xaf23a1c9), TOBN(0x34c72c6a, 0x3f220e0c), TOBN(0xbcc20bdf, 0x1232144a), TOBN(0x6e2f42da, 0xa20ede1b), TOBN(0xc441f00c, 0x74a00515), TOBN(0xbf46a5b6, 0x734b8c4b), TOBN(0x57409503, 0x7b56c9a4), TOBN(0x9f735261, 0xe4585d45), TOBN(0x9231faed, 0x6734e642), TOBN(0x1158a176, 0xbe70ee6c), TOBN(0x35f1068d, 0x7c3501bf), TOBN(0x6beef900, 0xa2d26115), TOBN(0x649406f2, 0xef0afee3), TOBN(0x3f43a60a, 0xbc2420a1), TOBN(0x509002a7, 0xd5aee4ac), TOBN(0xb46836a5, 0x3ff3571b), TOBN(0x24f98b78, 0x837927c1), TOBN(0x6254256a, 0x4533c716), TOBN(0xf27abb0b, 0xd07ee196), TOBN(0xd7cf64fc, 0x5c6d5bfd), TOBN(0x6915c751, 0xf0cd7a77), TOBN(0xd9f59012, 0x8798f534), TOBN(0x772b0da8, 0xf81d8b5f), TOBN(0x1244260c, 0x2e03fa69), TOBN(0x36cf0e3a, 0x3be1a374), TOBN(0x6e7c1633, 0xef06b960), TOBN(0xa71a4c55, 0x671f90f6), TOBN(0x7a941251, 0x33c673db), TOBN(0xc0bea510, 0x73e8c131), TOBN(0x61a8a699, 0xd4f6c734), TOBN(0x25e78c88, 0x341ed001), TOBN(0x5c18acf8, 0x8e2f7d90), TOBN(0xfdbf33d7, 0x77be32cd), TOBN(0x0a085cd7, 0xd2eb5ee9), TOBN(0x2d702cfb, 0xb3201115), TOBN(0xb6e0ebdb, 0x85c88ce8), TOBN(0x23a3ce3c, 0x1e01d617), TOBN(0x3041618e, 0x567333ac), TOBN(0x9dd0fd8f, 0x157edb6b), TOBN(0x27f74702, 0xb57872b8), TOBN(0x2ef26b4f, 0x657d5fe1), TOBN(0x95426f0a, 0x57cf3d40), TOBN(0x847e2ad1, 0x65a6067a), TOBN(0xd474d9a0, 0x09996a74), TOBN(0x16a56acd, 0x2a26115c), TOBN(0x02a615c3, 0xd16f4d43), TOBN(0xcc3fc965, 0xaadb85b7), TOBN(0x386bda73, 0xce07d1b0), TOBN(0xd82910c2, 0x58ad4178), TOBN(0x124f82cf, 0xcd2617f4), TOBN(0xcc2f5e8d, 0xef691770), TOBN(0x82702550, 0xb8c30ccc), TOBN(0x7b856aea, 0x1a8e575a), TOBN(0xbb822fef, 0xb1ab9459), TOBN(0x085928bc, 0xec24e38e), TOBN(0x5d0402ec, 0xba8f4b4d), TOBN(0xc07cd4ba, 0x00b4d58b), TOBN(0x5d8dffd5, 0x29227e7a), TOBN(0x61d44d0c, 0x31bf386f), TOBN(0xe486dc2b, 0x135e6f4d), TOBN(0x680962eb, 0xe79410ef), TOBN(0xa61bd343, 0xf10088b5), TOBN(0x6aa76076, 0xe2e28686), TOBN(0x80463d11, 0x8fb98871), TOBN(0xcb26f5c3, 0xbbc76aff), TOBN(0xd4ab8edd, 0xfbe03614), TOBN(0xc8eb579b, 0xc0cf2dee), TOBN(0xcc004c15, 0xc93bae41), TOBN(0x46fbae5d, 0x3aeca3b2), TOBN(0x671235cf, 0x0f1e9ab1), TOBN(0xadfba934, 0x9ec285c1), TOBN(0x88ded013, 0xf216c980), TOBN(0xc8ac4fb8, 0xf79e0bc1), TOBN(0xa29b89c6, 0xfb97a237), TOBN(0xb697b780, 0x9922d8e7), TOBN(0x3142c639, 0xddb945b5), TOBN(0x447b06c7, 0xe094c3a9), TOBN(0xcdcb3642, 0x72266c90), TOBN(0x633aad08, 0xa9385046), TOBN(0xa36c936b, 0xb57c6477), TOBN(0x871f8b64, 0xe94dbcc6), TOBN(0x28d0fb62, 0xa591a67b), TOBN(0x9d40e081, 0xc1d926f5), TOBN(0x3111eaf6, 0xf2d84b5a), TOBN(0x228993f9, 0xa565b644), TOBN(0x0ccbf592, 0x2c83188b), TOBN(0xf87b30ab, 0x3df3e197), TOBN(0xb8658b31, 0x7642bca8), TOBN(0x1a032d7f, 0x52800f17), TOBN(0x051dcae5, 0x79bf9445), TOBN(0xeba6b8ee, 0x54a2e253), TOBN(0x5c8b9cad, 0xd4485692), TOBN(0x84bda40e, 0x8986e9be), TOBN(0xd16d16a4, 0x2f0db448), TOBN(0x8ec80050, 0xa14d4188), TOBN(0xb2b26107, 0x98fa7aaa), TOBN(0x41209ee4, 0xf073aa4e), TOBN(0xf1570359, 0xf2d6b19b), TOBN(0xcbe6868c, 0xfc577caf), TOBN(0x186c4bdc, 0x32c04dd3), TOBN(0xa6c35fae, 0xcfeee397), TOBN(0xb4a1b312, 0xf086c0cf), TOBN(0xe0a5ccc6, 0xd9461fe2), TOBN(0xc32278aa, 0x1536189f), TOBN(0x1126c55f, 0xba6df571), TOBN(0x0f71a602, 0xb194560e), TOBN(0x8b2d7405, 0x324bd6e1), TOBN(0x8481939e, 0x3738be71), TOBN(0xb5090b1a, 0x1a4d97a9), TOBN(0x116c65a3, 0xf05ba915), TOBN(0x21863ad3, 0xaae448aa), TOBN(0xd24e2679, 0xa7aae5d3), TOBN(0x7076013d, 0x0de5c1c4), TOBN(0x2d50f8ba, 0xbb05b629), TOBN(0x73c1abe2, 0x6e66efbb), TOBN(0xefd4b422, 0xf2488af7), TOBN(0xe4105d02, 0x663ba575), TOBN(0x7eb60a8b, 0x53a69457), TOBN(0x62210008, 0xc945973b), TOBN(0xfb255478, 0x77a50ec6), TOBN(0xbf0392f7, 0x0a37a72c), TOBN(0xa0a7a19c, 0x4be18e7a), TOBN(0x90d8ea16, 0x25b1e0af), TOBN(0x7582a293, 0xef953f57), TOBN(0x90a64d05, 0xbdc5465a), TOBN(0xca79c497, 0xe2510717), TOBN(0x560dbb7c, 0x18cb641f), TOBN(0x1d8e3286, 0x4b66abfb), TOBN(0xd26f52e5, 0x59030900), TOBN(0x1ee3f643, 0x5584941a), TOBN(0x6d3b3730, 0x569f5958), TOBN(0x9ff2a62f, 0x4789dba5), TOBN(0x91fcb815, 0x72b5c9b7), TOBN(0xf446cb7d, 0x6c8f9a0e), TOBN(0x48f625c1, 0x39b7ecb5), TOBN(0xbabae801, 0x1c6219b8), TOBN(0xe7a562d9, 0x28ac2f23), TOBN(0xe1b48732, 0x26e20588), TOBN(0x06ee1cad, 0x775af051), TOBN(0xda29ae43, 0xfaff79f7), TOBN(0xc141a412, 0x652ee9e0), TOBN(0x1e127f6f, 0x195f4bd0), TOBN(0x29c6ab4f, 0x072f34f8), TOBN(0x7b7c1477, 0x30448112), TOBN(0x82b51af1, 0xe4a38656), TOBN(0x2bf2028a, 0x2f315010), TOBN(0xc9a4a01f, 0x6ea88cd4), TOBN(0xf63e95d8, 0x257e5818), TOBN(0xdd8efa10, 0xb4519b16), TOBN(0xed8973e0, 0x0da910bf), TOBN(0xed49d077, 0x5c0fe4a9), TOBN(0xac3aac5e, 0xb7caee1e), TOBN(0x1033898d, 0xa7f4da57), TOBN(0x42145c0e, 0x5c6669b9), TOBN(0x42daa688, 0xc1aa2aa0), TOBN(0x629cc15c, 0x1a1d885a), TOBN(0x25572ec0, 0xf4b76817), TOBN(0x8312e435, 0x9c8f8f28), TOBN(0x8107f8cd, 0x81965490), TOBN(0x516ff3a3, 0x6fa6110c), TOBN(0x74fb1eb1, 0xfb93561f), TOBN(0x6c0c9047, 0x8457522b), TOBN(0xcfd32104, 0x6bb8bdc6), TOBN(0x2d6884a2, 0xcc80ad57), TOBN(0x7c27fc35, 0x86a9b637), TOBN(0x3461baed, 0xadf4e8cd), TOBN(0x1d56251a, 0x617242f0), TOBN(0x0b80d209, 0xc955bef4), TOBN(0xdf02cad2, 0x06adb047), TOBN(0xf0d7cb91, 0x5ec74fee), TOBN(0xd2503375, 0x1111ba44), TOBN(0x9671755e, 0xdf53cb36), TOBN(0x54dcb612, 0x3368551b), TOBN(0x66d69aac, 0xc8a025a4), TOBN(0x6be946c6, 0xe77ef445), TOBN(0x719946d1, 0xa995e094), TOBN(0x65e848f6, 0xe51e04d8), TOBN(0xe62f3300, 0x6a1e3113), TOBN(0x1541c7c1, 0x501de503), TOBN(0x4daac9fa, 0xf4acfade), TOBN(0x0e585897, 0x44cd0b71), TOBN(0x544fd869, 0x0a51cd77), TOBN(0x60fc20ed, 0x0031016d), TOBN(0x58b404ec, 0xa4276867), TOBN(0x46f6c3cc, 0x34f34993), TOBN(0x477ca007, 0xc636e5bd), TOBN(0x8018f5e5, 0x7c458b47), TOBN(0xa1202270, 0xe47b668f), TOBN(0xcef48ccd, 0xee14f203), TOBN(0x23f98bae, 0x62ff9b4d), TOBN(0x55acc035, 0xc589eddd), TOBN(0x3fe712af, 0x64db4444), TOBN(0x19e9d634, 0xbecdd480), TOBN(0xe08bc047, 0xa930978a), TOBN(0x2dbf24ec, 0xa1280733), TOBN(0x3c0ae38c, 0x2cd706b2), TOBN(0x5b012a5b, 0x359017b9), TOBN(0x3943c38c, 0x72e0f5ae), TOBN(0x786167ea, 0x57176fa3), TOBN(0xe5f9897d, 0x594881dc), TOBN(0x6b5efad8, 0xcfb820c1), TOBN(0xb2179093, 0xd55018de), TOBN(0x39ad7d32, 0x0bac56ce), TOBN(0xb55122e0, 0x2cfc0e81), TOBN(0x117c4661, 0xf6d89daa), TOBN(0x362d01e1, 0xcb64fa09), TOBN(0x6a309b4e, 0x3e9c4ddd), TOBN(0xfa979fb7, 0xabea49b1), TOBN(0xb4b1d27d, 0x10e2c6c5), TOBN(0xbd61c2c4, 0x23afde7a), TOBN(0xeb6614f8, 0x9786d358), TOBN(0x4a5d816b, 0x7f6f7459), TOBN(0xe431a44f, 0x09360e7b), TOBN(0x8c27a032, 0xc309914c), TOBN(0xcea5d68a, 0xcaede3d8), TOBN(0x3668f665, 0x3a0a3f95), TOBN(0x89369416, 0x7ceba27b), TOBN(0x89981fad, 0xe4728fe9), TOBN(0x7102c8a0, 0x8a093562), TOBN(0xbb80310e, 0x235d21c8), TOBN(0x505e55d1, 0xbefb7f7b), TOBN(0xa0a90811, 0x12958a67), TOBN(0xd67e106a, 0x4d851fef), TOBN(0xb84011a9, 0x431dd80e), TOBN(0xeb7c7cca, 0x73306cd9), TOBN(0x20fadd29, 0xd1b3b730), TOBN(0x83858b5b, 0xfe37b3d3), TOBN(0xbf4cd193, 0xb6251d5c), TOBN(0x1cca1fd3, 0x1352d952), TOBN(0xc66157a4, 0x90fbc051), TOBN(0x7990a638, 0x89b98636)}, {TOBN(0xe5aa692a, 0x87dec0e1), TOBN(0x010ded8d, 0xf7b39d00), TOBN(0x7b1b80c8, 0x54cfa0b5), TOBN(0x66beb876, 0xa0f8ea28), TOBN(0x50d7f531, 0x3476cd0e), TOBN(0xa63d0e65, 0xb08d3949), TOBN(0x1a09eea9, 0x53479fc6), TOBN(0x82ae9891, 0xf499e742), TOBN(0xab58b910, 0x5ca7d866), TOBN(0x582967e2, 0x3adb3b34), TOBN(0x89ae4447, 0xcceac0bc), TOBN(0x919c667c, 0x7bf56af5), TOBN(0x9aec17b1, 0x60f5dcd7), TOBN(0xec697b9f, 0xddcaadbc), TOBN(0x0b98f341, 0x463467f5), TOBN(0xb187f1f7, 0xa967132f), TOBN(0x90fe7a1d, 0x214aeb18), TOBN(0x1506af3c, 0x741432f7), TOBN(0xbb5565f9, 0xe591a0c4), TOBN(0x10d41a77, 0xb44f1bc3), TOBN(0xa09d65e4, 0xa84bde96), TOBN(0x42f060d8, 0xf20a6a1c), TOBN(0x652a3bfd, 0xf27f9ce7), TOBN(0xb6bdb65c, 0x3b3d739f), TOBN(0xeb5ddcb6, 0xec7fae9f), TOBN(0x995f2714, 0xefb66e5a), TOBN(0xdee95d8e, 0x69445d52), TOBN(0x1b6c2d46, 0x09e27620), TOBN(0x32621c31, 0x8129d716), TOBN(0xb03909f1, 0x0958c1aa), TOBN(0x8c468ef9, 0x1af4af63), TOBN(0x162c429f, 0xfba5cdf6), TOBN(0x2f682343, 0x753b9371), TOBN(0x29cab45a, 0x5f1f9cd7), TOBN(0x571623ab, 0xb245db96), TOBN(0xc507db09, 0x3fd79999), TOBN(0x4e2ef652, 0xaf036c32), TOBN(0x86f0cc78, 0x05018e5c), TOBN(0xc10a73d4, 0xab8be350), TOBN(0x6519b397, 0x7e826327), TOBN(0xe8cb5eef, 0x9c053df7), TOBN(0x8de25b37, 0xb300ea6f), TOBN(0xdb03fa92, 0xc849cffb), TOBN(0x242e43a7, 0xe84169bb), TOBN(0xe4fa51f4, 0xdd6f958e), TOBN(0x6925a77f, 0xf4445a8d), TOBN(0xe6e72a50, 0xe90d8949), TOBN(0xc66648e3, 0x2b1f6390), TOBN(0xb2ab1957, 0x173e460c), TOBN(0x1bbbce75, 0x30704590), TOBN(0xc0a90dbd, 0xdb1c7162), TOBN(0x505e399e, 0x15cdd65d), TOBN(0x68434dcb, 0x57797ab7), TOBN(0x60ad35ba, 0x6a2ca8e8), TOBN(0x4bfdb1e0, 0xde3336c1), TOBN(0xbbef99eb, 0xd8b39015), TOBN(0x6c3b96f3, 0x1711ebec), TOBN(0x2da40f1f, 0xce98fdc4), TOBN(0xb99774d3, 0x57b4411f), TOBN(0x87c8bdf4, 0x15b65bb6), TOBN(0xda3a89e3, 0xc2eef12d), TOBN(0xde95bb9b, 0x3c7471f3), TOBN(0x600f225b, 0xd812c594), TOBN(0x54907c5d, 0x2b75a56b), TOBN(0xa93cc5f0, 0x8db60e35), TOBN(0x743e3cd6, 0xfa833319), TOBN(0x7dad5c41, 0xf81683c9), TOBN(0x70c1e7d9, 0x9c34107e), TOBN(0x0edc4a39, 0xa6be0907), TOBN(0x36d47035, 0x86d0b7d3), TOBN(0x8c76da03, 0x272bfa60), TOBN(0x0b4a07ea, 0x0f08a414), TOBN(0x699e4d29, 0x45c1dd53), TOBN(0xcadc5898, 0x231debb5), TOBN(0xdf49fcc7, 0xa77f00e0), TOBN(0x93057bbf, 0xa73e5a0e), TOBN(0x2f8b7ecd, 0x027a4cd1), TOBN(0x114734b3, 0xc614011a), TOBN(0xe7a01db7, 0x67677c68), TOBN(0x89d9be5e, 0x7e273f4f), TOBN(0xd225cb2e, 0x089808ef), TOBN(0xf1f7a27d, 0xd59e4107), TOBN(0x53afc761, 0x8211b9c9), TOBN(0x0361bc67, 0xe6819159), TOBN(0x2a865d0b, 0x7f071426), TOBN(0x6a3c1810, 0xe7072567), TOBN(0x3e3bca1e, 0x0d6bcabd), TOBN(0xa1b02bc1, 0x408591bc), TOBN(0xe0deee59, 0x31fba239), TOBN(0xf47424d3, 0x98bd91d1), TOBN(0x0f8886f4, 0x071a3c1d), TOBN(0x3f7d41e8, 0xa819233b), TOBN(0x708623c2, 0xcf6eb998), TOBN(0x86bb49af, 0x609a287f), TOBN(0x942bb249, 0x63c90762), TOBN(0x0ef6eea5, 0x55a9654b), TOBN(0x5f6d2d72, 0x36f5defe), TOBN(0xfa9922dc, 0x56f99176), TOBN(0x6c8c5ece, 0xf78ce0c7), TOBN(0x7b44589d, 0xbe09b55e), TOBN(0xe11b3bca, 0x9ea83770), TOBN(0xd7fa2c7f, 0x2ab71547), TOBN(0x2a3dd6fa, 0x2a1ddcc0), TOBN(0x09acb430, 0x5a7b7707), TOBN(0x4add4a2e, 0x649d4e57), TOBN(0xcd53a2b0, 0x1917526e), TOBN(0xc5262330, 0x20b44ac4), TOBN(0x4028746a, 0xbaa2c31d), TOBN(0x51318390, 0x64291d4c), TOBN(0xbf48f151, 0xee5ad909), TOBN(0xcce57f59, 0x7b185681), TOBN(0x7c3ac1b0, 0x4854d442), TOBN(0x65587dc3, 0xc093c171), TOBN(0xae7acb24, 0x24f42b65), TOBN(0x5a338adb, 0x955996cb), TOBN(0xc8e65675, 0x6051f91b), TOBN(0x66711fba, 0x28b8d0b1), TOBN(0x15d74137, 0xb6c10a90), TOBN(0x70cdd7eb, 0x3a232a80), TOBN(0xc9e2f07f, 0x6191ed24), TOBN(0xa80d1db6, 0xf79588c0), TOBN(0xfa52fc69, 0xb55768cc), TOBN(0x0b4df1ae, 0x7f54438a), TOBN(0x0cadd1a7, 0xf9b46a4f), TOBN(0xb40ea6b3, 0x1803dd6f), TOBN(0x488e4fa5, 0x55eaae35), TOBN(0x9f047d55, 0x382e4e16), TOBN(0xc9b5b7e0, 0x2f6e0c98), TOBN(0x6b1bd2d3, 0x95762649), TOBN(0xa9604ee7, 0xc7aea3f6), TOBN(0x3646ff27, 0x6dc6f896), TOBN(0x9bf0e7f5, 0x2860bad1), TOBN(0x2d92c821, 0x7cb44b92), TOBN(0xa2f5ce63, 0xaea9c182), TOBN(0xd0a2afb1, 0x9154a5fd), TOBN(0x482e474c, 0x95801da6), TOBN(0xc19972d0, 0xb611c24b), TOBN(0x1d468e65, 0x60a8f351), TOBN(0xeb758069, 0x7bcf6421), TOBN(0xec9dd0ee, 0x88fbc491), TOBN(0x5b59d2bf, 0x956c2e32), TOBN(0x73dc6864, 0xdcddf94e), TOBN(0xfd5e2321, 0xbcee7665), TOBN(0xa7b4f8ef, 0x5e9a06c4), TOBN(0xfba918dd, 0x7280f855), TOBN(0xbbaac260, 0x8baec688), TOBN(0xa3b3f00f, 0x33400f42), TOBN(0x3d2dba29, 0x66f2e6e4), TOBN(0xb6f71a94, 0x98509375), TOBN(0x8f33031f, 0xcea423cc), TOBN(0x009b8dd0, 0x4807e6fb), TOBN(0x5163cfe5, 0x5cdb954c), TOBN(0x03cc8f17, 0xcf41c6e8), TOBN(0xf1f03c2a, 0x037b925c), TOBN(0xc39c19cc, 0x66d2427c), TOBN(0x823d24ba, 0x7b6c18e4), TOBN(0x32ef9013, 0x901f0b4f), TOBN(0x684360f1, 0xf8941c2e), TOBN(0x0ebaff52, 0x2c28092e), TOBN(0x7891e4e3, 0x256c932f), TOBN(0x51264319, 0xac445e3d), TOBN(0x553432e7, 0x8ea74381), TOBN(0xe6eeaa69, 0x67e9c50a), TOBN(0x27ced284, 0x62e628c7), TOBN(0x3f96d375, 0x7a4afa57), TOBN(0xde0a14c3, 0xe484c150), TOBN(0x364a24eb, 0x38bd9923), TOBN(0x1df18da0, 0xe5177422), TOBN(0x174e8f82, 0xd8d38a9b), TOBN(0x2e97c600, 0xe7de1391), TOBN(0xc5709850, 0xa1c175dd), TOBN(0x969041a0, 0x32ae5035), TOBN(0xcbfd533b, 0x76a2086b), TOBN(0xd6bba71b, 0xd7c2e8fe), TOBN(0xb2d58ee6, 0x099dfb67), TOBN(0x3a8b342d, 0x064a85d9), TOBN(0x3bc07649, 0x522f9be3), TOBN(0x690c075b, 0xdf1f49a8), TOBN(0x80e1aee8, 0x3854ec42), TOBN(0x2a7dbf44, 0x17689dc7), TOBN(0xc004fc0e, 0x3faf4078), TOBN(0xb2f02e9e, 0xdf11862c), TOBN(0xf10a5e0f, 0xa0a1b7b3), TOBN(0x30aca623, 0x8936ec80), TOBN(0xf83cbf05, 0x02f40d9a), TOBN(0x4681c468, 0x2c318a4d), TOBN(0x98575618, 0x0e9c2674), TOBN(0xbe79d046, 0x1847092e), TOBN(0xaf1e480a, 0x78bd01e0), TOBN(0x6dd359e4, 0x72a51db9), TOBN(0x62ce3821, 0xe3afbab6), TOBN(0xc5cee5b6, 0x17733199), TOBN(0xe08b30d4, 0x6ffd9fbb), TOBN(0x6e5bc699, 0x36c610b7), TOBN(0xf343cff2, 0x9ce262cf), TOBN(0xca2e4e35, 0x68b914c1), TOBN(0x011d64c0, 0x16de36c5), TOBN(0xe0b10fdd, 0x42e2b829), TOBN(0x78942981, 0x6685aaf8), TOBN(0xe7511708, 0x230ede97), TOBN(0x671ed8fc, 0x3b922bf8), TOBN(0xe4d8c0a0, 0x4c29b133), TOBN(0x87eb1239, 0x3b6e99c4), TOBN(0xaff3974c, 0x8793beba), TOBN(0x03749405, 0x2c18df9b), TOBN(0xc5c3a293, 0x91007139), TOBN(0x6a77234f, 0xe37a0b95), TOBN(0x02c29a21, 0xb661c96b), TOBN(0xc3aaf1d6, 0x141ecf61), TOBN(0x9195509e, 0x3bb22f53), TOBN(0x29597404, 0x22d51357), TOBN(0x1b083822, 0x537bed60), TOBN(0xcd7d6e35, 0xe07289f0), TOBN(0x1f94c48c, 0x6dd86eff), TOBN(0xc8bb1f82, 0xeb0f9cfa), TOBN(0x9ee0b7e6, 0x1b2eb97d), TOBN(0x5a52fe2e, 0x34d74e31), TOBN(0xa352c310, 0x3bf79ab6), TOBN(0x97ff6c5a, 0xabfeeb8f), TOBN(0xbfbe8fef, 0xf5c97305), TOBN(0xd6081ce6, 0xa7904608), TOBN(0x1f812f3a, 0xc4fca249), TOBN(0x9b24bc9a, 0xb9e5e200), TOBN(0x91022c67, 0x38012ee8), TOBN(0xe83d9c5d, 0x30a713a1), TOBN(0x4876e3f0, 0x84ef0f93), TOBN(0xc9777029, 0xc1fbf928), TOBN(0xef7a6bb3, 0xbce7d2a4), TOBN(0xb8067228, 0xdfa2a659), TOBN(0xd5cd3398, 0xd877a48f), TOBN(0xbea4fd8f, 0x025d0f3f), TOBN(0xd67d2e35, 0x2eae7c2b), TOBN(0x184de7d7, 0xcc5f4394), TOBN(0xb5551b5c, 0x4536e142), TOBN(0x2e89b212, 0xd34aa60a), TOBN(0x14a96fea, 0xf50051d5), TOBN(0x4e21ef74, 0x0d12bb0b), TOBN(0xc522f020, 0x60b9677e), TOBN(0x8b12e467, 0x2df7731d), TOBN(0x39f80382, 0x7b326d31), TOBN(0xdfb8630c, 0x39024a94), TOBN(0xaacb96a8, 0x97319452), TOBN(0xd68a3961, 0xeda3867c), TOBN(0x0c58e2b0, 0x77c4ffca), TOBN(0x3d545d63, 0x4da919fa), TOBN(0xef79b69a, 0xf15e2289), TOBN(0x54bc3d3d, 0x808bab10), TOBN(0xc8ab3007, 0x45f82c37), TOBN(0xc12738b6, 0x7c4a658a), TOBN(0xb3c47639, 0x40e72182), TOBN(0x3b77be46, 0x8798e44f), TOBN(0xdc047df2, 0x17a7f85f), TOBN(0x2439d4c5, 0x5e59d92d), TOBN(0xcedca475, 0xe8e64d8d), TOBN(0xa724cd0d, 0x87ca9b16), TOBN(0x35e4fd59, 0xa5540dfe), TOBN(0xf8c1ff18, 0xe4bcf6b1), TOBN(0x856d6285, 0x295018fa), TOBN(0x433f665c, 0x3263c949), TOBN(0xa6a76dd6, 0xa1f21409), TOBN(0x17d32334, 0xcc7b4f79), TOBN(0xa1d03122, 0x06720e4a), TOBN(0xadb6661d, 0x81d9bed5), TOBN(0xf0d6fb02, 0x11db15d1), TOBN(0x7fd11ad5, 0x1fb747d2), TOBN(0xab50f959, 0x3033762b), TOBN(0x2a7e711b, 0xfbefaf5a), TOBN(0xc7393278, 0x3fef2bbf), TOBN(0xe29fa244, 0x0df6f9be), TOBN(0x9092757b, 0x71efd215), TOBN(0xee60e311, 0x4f3d6fd9), TOBN(0x338542d4, 0x0acfb78b), TOBN(0x44a23f08, 0x38961a0f), TOBN(0x1426eade, 0x986987ca), TOBN(0x36e6ee2e, 0x4a863cc6), TOBN(0x48059420, 0x628b8b79), TOBN(0x30303ad8, 0x7396e1de), TOBN(0x5c8bdc48, 0x38c5aad1), TOBN(0x3e40e11f, 0x5c8f5066), TOBN(0xabd6e768, 0x8d246bbd), TOBN(0x68aa40bb, 0x23330a01), TOBN(0xd23f5ee4, 0xc34eafa0), TOBN(0x3bbee315, 0x5de02c21), TOBN(0x18dd4397, 0xd1d8dd06), TOBN(0x3ba1939a, 0x122d7b44), TOBN(0xe6d3b40a, 0xa33870d6), TOBN(0x8e620f70, 0x1c4fe3f8), TOBN(0xf6bba1a5, 0xd3a50cbf), TOBN(0x4a78bde5, 0xcfc0aee0), TOBN(0x847edc46, 0xc08c50bd), TOBN(0xbaa2439c, 0xad63c9b2), TOBN(0xceb4a728, 0x10fc2acb), TOBN(0xa419e40e, 0x26da033d), TOBN(0x6cc3889d, 0x03e02683), TOBN(0x1cd28559, 0xfdccf725), TOBN(0x0fd7e0f1, 0x8d13d208), TOBN(0x01b9733b, 0x1f0df9d4), TOBN(0x8cc2c5f3, 0xa2b5e4f3), TOBN(0x43053bfa, 0x3a304fd4), TOBN(0x8e87665c, 0x0a9f1aa7), TOBN(0x087f29ec, 0xd73dc965), TOBN(0x15ace455, 0x3e9023db), TOBN(0x2370e309, 0x2bce28b4), TOBN(0xf9723442, 0xb6b1e84a), TOBN(0xbeee662e, 0xb72d9f26), TOBN(0xb19396de, 0xf0e47109), TOBN(0x85b1fa73, 0xe13289d0), TOBN(0x436cf77e, 0x54e58e32), TOBN(0x0ec833b3, 0xe990ef77), TOBN(0x7373e3ed, 0x1b11fc25), TOBN(0xbe0eda87, 0x0fc332ce), TOBN(0xced04970, 0x8d7ea856), TOBN(0xf85ff785, 0x7e977ca0), TOBN(0xb66ee8da, 0xdfdd5d2b), TOBN(0xf5e37950, 0x905af461), TOBN(0x587b9090, 0x966d487c), TOBN(0x6a198a1b, 0x32ba0127), TOBN(0xa7720e07, 0x141615ac), TOBN(0xa23f3499, 0x996ef2f2), TOBN(0xef5f64b4, 0x470bcb3d), TOBN(0xa526a962, 0x92b8c559), TOBN(0x0c14aac0, 0x69740a0f), TOBN(0x0d41a9e3, 0xa6bdc0a5), TOBN(0x97d52106, 0x9c48aef4), TOBN(0xcf16bd30, 0x3e7c253b), TOBN(0xcc834b1a, 0x47fdedc1), TOBN(0x7362c6e5, 0x373aab2e), TOBN(0x264ed85e, 0xc5f590ff), TOBN(0x7a46d9c0, 0x66d41870), TOBN(0xa50c20b1, 0x4787ba09), TOBN(0x185e7e51, 0xe3d44635), TOBN(0xb3b3e080, 0x31e2d8dc), TOBN(0xbed1e558, 0xa179e9d9), TOBN(0x2daa3f79, 0x74a76781), TOBN(0x4372baf2, 0x3a40864f), TOBN(0x46900c54, 0x4fe75cb5), TOBN(0xb95f171e, 0xf76765d0), TOBN(0x4ad726d2, 0x95c87502), TOBN(0x2ec769da, 0x4d7c99bd), TOBN(0x5e2ddd19, 0xc36cdfa8), TOBN(0xc22117fc, 0xa93e6dea), TOBN(0xe8a2583b, 0x93771123), TOBN(0xbe2f6089, 0xfa08a3a2), TOBN(0x4809d5ed, 0x8f0e1112), TOBN(0x3b414aa3, 0xda7a095e), TOBN(0x9049acf1, 0x26f5aadd), TOBN(0x78d46a4d, 0x6be8b84a), TOBN(0xd66b1963, 0xb732b9b3), TOBN(0x5c2ac2a0, 0xde6e9555), TOBN(0xcf52d098, 0xb5bd8770), TOBN(0x15a15fa6, 0x0fd28921), TOBN(0x56ccb81e, 0x8b27536d), TOBN(0x0f0d8ab8, 0x9f4ccbb8), TOBN(0xed5f44d2, 0xdb221729), TOBN(0x43141988, 0x00bed10c), TOBN(0xc94348a4, 0x1d735b8b), TOBN(0x79f3e9c4, 0x29ef8479), TOBN(0x4c13a4e3, 0x614c693f), TOBN(0x32c9af56, 0x8e143a14), TOBN(0xbc517799, 0xe29ac5c4), TOBN(0x05e17992, 0x2774856f), TOBN(0x6e52fb05, 0x6c1bf55f), TOBN(0xaeda4225, 0xe4f19e16), TOBN(0x70f4728a, 0xaf5ccb26), TOBN(0x5d2118d1, 0xb2947f22), TOBN(0xc827ea16, 0x281d6fb9), TOBN(0x8412328d, 0x8cf0eabd), TOBN(0x45ee9fb2, 0x03ef9dcf), TOBN(0x8e700421, 0xbb937d63), TOBN(0xdf8ff2d5, 0xcc4b37a6), TOBN(0xa4c0d5b2, 0x5ced7b68), TOBN(0x6537c1ef, 0xc7308f59), TOBN(0x25ce6a26, 0x3b37f8e8), TOBN(0x170e9a9b, 0xdeebc6ce), TOBN(0xdd037952, 0x8728d72c), TOBN(0x445b0e55, 0x850154bc), TOBN(0x4b7d0e06, 0x83a7337b), TOBN(0x1e3416d4, 0xffecf249), TOBN(0x24840eff, 0x66a2b71f), TOBN(0xd0d9a50a, 0xb37cc26d), TOBN(0xe2198150, 0x6fe28ef7), TOBN(0x3cc5ef16, 0x23324c7f), TOBN(0x220f3455, 0x769b5263), TOBN(0xe2ade2f1, 0xa10bf475), TOBN(0x28cd20fa, 0x458d3671), TOBN(0x1549722c, 0x2dc4847b), TOBN(0x6dd01e55, 0x591941e3), TOBN(0x0e6fbcea, 0x27128ccb), TOBN(0xae1a1e6b, 0x3bef0262), TOBN(0xfa8c472c, 0x8f54e103), TOBN(0x7539c0a8, 0x72c052ec), TOBN(0xd7b27369, 0x5a3490e9), TOBN(0x143fe1f1, 0x71684349), TOBN(0x36b4722e, 0x32e19b97), TOBN(0xdc059227, 0x90980aff), TOBN(0x175c9c88, 0x9e13d674), TOBN(0xa7de5b22, 0x6e6bfdb1), TOBN(0x5ea5b7b2, 0xbedb4b46), TOBN(0xd5570191, 0xd34a6e44), TOBN(0xfcf60d2e, 0xa24ff7e6), TOBN(0x614a392d, 0x677819e1), TOBN(0x7be74c7e, 0xaa5a29e8), TOBN(0xab50fece, 0x63c85f3f), TOBN(0xaca2e2a9, 0x46cab337), TOBN(0x7f700388, 0x122a6fe3), TOBN(0xdb69f703, 0x882a04a8), TOBN(0x9a77935d, 0xcf7aed57), TOBN(0xdf16207c, 0x8d91c86f), TOBN(0x2fca49ab, 0x63ed9998), TOBN(0xa3125c44, 0xa77ddf96), TOBN(0x05dd8a86, 0x24344072), TOBN(0xa023dda2, 0xfec3fb56), TOBN(0x421b41fc, 0x0c743032), TOBN(0x4f2120c1, 0x5e438639), TOBN(0xfb7cae51, 0xc83c1b07), TOBN(0xb2370caa, 0xcac2171a), TOBN(0x2eb2d962, 0x6cc820fb), TOBN(0x59feee5c, 0xb85a44bf), TOBN(0x94620fca, 0x5b6598f0), TOBN(0x6b922cae, 0x7e314051), TOBN(0xff8745ad, 0x106bed4e), TOBN(0x546e71f5, 0xdfa1e9ab), TOBN(0x935c1e48, 0x1ec29487), TOBN(0x9509216c, 0x4d936530), TOBN(0xc7ca3067, 0x85c9a2db), TOBN(0xd6ae5152, 0x6be8606f), TOBN(0x09dbcae6, 0xe14c651d), TOBN(0xc9536e23, 0x9bc32f96), TOBN(0xa90535a9, 0x34521b03), TOBN(0xf39c526c, 0x878756ff), TOBN(0x383172ec, 0x8aedf03c), TOBN(0x20a8075e, 0xefe0c034), TOBN(0xf22f9c62, 0x64026422), TOBN(0x8dd10780, 0x24b9d076), TOBN(0x944c742a, 0x3bef2950), TOBN(0x55b9502e, 0x88a2b00b), TOBN(0xa59e14b4, 0x86a09817), TOBN(0xa39dd3ac, 0x47bb4071), TOBN(0x55137f66, 0x3be0592f), TOBN(0x07fcafd4, 0xc9e63f5b), TOBN(0x963652ee, 0x346eb226), TOBN(0x7dfab085, 0xec2facb7), TOBN(0x273bf2b8, 0x691add26), TOBN(0x30d74540, 0xf2b46c44), TOBN(0x05e8e73e, 0xf2c2d065), TOBN(0xff9b8a00, 0xd42eeac9), TOBN(0x2fcbd205, 0x97209d22), TOBN(0xeb740ffa, 0xde14ea2c), TOBN(0xc71ff913, 0xa8aef518), TOBN(0x7bfc74bb, 0xfff4cfa2), TOBN(0x1716680c, 0xb6b36048), TOBN(0x121b2cce, 0x9ef79af1), TOBN(0xbff3c836, 0xa01eb3d3), TOBN(0x50eb1c6a, 0x5f79077b), TOBN(0xa48c32d6, 0xa004bbcf), TOBN(0x47a59316, 0x7d64f61d), TOBN(0x6068147f, 0x93102016), TOBN(0x12c5f654, 0x94d12576), TOBN(0xefb071a7, 0xc9bc6b91), TOBN(0x7c2da0c5, 0x6e23ea95), TOBN(0xf4fd45b6, 0xd4a1dd5d), TOBN(0x3e7ad9b6, 0x9122b13c), TOBN(0x342ca118, 0xe6f57a48), TOBN(0x1c2e94a7, 0x06f8288f), TOBN(0x99e68f07, 0x5a97d231), TOBN(0x7c80de97, 0x4d838758), TOBN(0xbce0f5d0, 0x05872727), TOBN(0xbe5d95c2, 0x19c4d016), TOBN(0x921d5cb1, 0x9c2492ee), TOBN(0x42192dc1, 0x404d6fb3), TOBN(0x4c84dcd1, 0x32f988d3), TOBN(0xde26d61f, 0xa17b8e85), TOBN(0xc466dcb6, 0x137c7408), TOBN(0x9a38d7b6, 0x36a266da), TOBN(0x7ef5cb06, 0x83bebf1b), TOBN(0xe5cdcbbf, 0x0fd014e3), TOBN(0x30aa376d, 0xf65965a0), TOBN(0x60fe88c2, 0xebb3e95e), TOBN(0x33fd0b61, 0x66ee6f20), TOBN(0x8827dcdb, 0x3f41f0a0), TOBN(0xbf8a9d24, 0x0c56c690), TOBN(0x40265dad, 0xddb7641d), TOBN(0x522b05bf, 0x3a6b662b), TOBN(0x466d1dfe, 0xb1478c9b), TOBN(0xaa616962, 0x1484469b), TOBN(0x0db60549, 0x02df8f9f), TOBN(0xc37bca02, 0x3cb8bf51), TOBN(0x5effe346, 0x21371ce8), TOBN(0xe8f65264, 0xff112c32), TOBN(0x8a9c736d, 0x7b971fb2), TOBN(0xa4f19470, 0x7b75080d), TOBN(0xfc3f2c5a, 0x8839c59b), TOBN(0x1d6c777e, 0x5aeb49c2), TOBN(0xf3db034d, 0xda1addfe), TOBN(0xd76fee5a, 0x5535affc), TOBN(0x0853ac70, 0xb92251fd), TOBN(0x37e3d594, 0x8b2a29d5), TOBN(0x28f1f457, 0x4de00ddb), TOBN(0x8083c1b5, 0xf42c328b), TOBN(0xd8ef1d8f, 0xe493c73b), TOBN(0x96fb6260, 0x41dc61bd), TOBN(0xf74e8a9d, 0x27ee2f8a), TOBN(0x7c605a80, 0x2c946a5d), TOBN(0xeed48d65, 0x3839ccfd), TOBN(0x9894344f, 0x3a29467a), TOBN(0xde81e949, 0xc51eba6d), TOBN(0xdaea066b, 0xa5e5c2f2), TOBN(0x3fc8a614, 0x08c8c7b3), TOBN(0x7adff88f, 0x06d0de9f), TOBN(0xbbc11cf5, 0x3b75ce0a), TOBN(0x9fbb7acc, 0xfbbc87d5), TOBN(0xa1458e26, 0x7badfde2)}, {TOBN(0x1cb43668, 0xe039c256), TOBN(0x5f26fb8b, 0x7c17fd5d), TOBN(0xeee426af, 0x79aa062b), TOBN(0x072002d0, 0xd78fbf04), TOBN(0x4c9ca237, 0xe84fb7e3), TOBN(0xb401d8a1, 0x0c82133d), TOBN(0xaaa52592, 0x6d7e4181), TOBN(0xe9430833, 0x73dbb152), TOBN(0xf92dda31, 0xbe24319a), TOBN(0x03f7d28b, 0xe095a8e7), TOBN(0xa52fe840, 0x98782185), TOBN(0x276ddafe, 0x29c24dbc), TOBN(0x80cd5496, 0x1d7a64eb), TOBN(0xe4360889, 0x7f1dbe42), TOBN(0x2f81a877, 0x8438d2d5), TOBN(0x7e4d52a8, 0x85169036), TOBN(0x19e3d5b1, 0x1d59715d), TOBN(0xc7eaa762, 0xd788983e), TOBN(0xe5a730b0, 0xabf1f248), TOBN(0xfbab8084, 0xfae3fd83), TOBN(0x65e50d21, 0x53765b2f), TOBN(0xbdd4e083, 0xfa127f3d), TOBN(0x9cf3c074, 0x397b1b10), TOBN(0x59f8090c, 0xb1b59fd3), TOBN(0x7b15fd9d, 0x615faa8f), TOBN(0x8fa1eb40, 0x968554ed), TOBN(0x7bb4447e, 0x7aa44882), TOBN(0x2bb2d0d1, 0x029fff32), TOBN(0x075e2a64, 0x6caa6d2f), TOBN(0x8eb879de, 0x22e7351b), TOBN(0xbcd5624e, 0x9a506c62), TOBN(0x218eaef0, 0xa87e24dc), TOBN(0x37e56847, 0x44ddfa35), TOBN(0x9ccfc5c5, 0xdab3f747), TOBN(0x9ac1df3f, 0x1ee96cf4), TOBN(0x0c0571a1, 0x3b480b8f), TOBN(0x2fbeb3d5, 0x4b3a7b3c), TOBN(0x35c03669, 0x5dcdbb99), TOBN(0x52a0f5dc, 0xb2415b3a), TOBN(0xd57759b4, 0x4413ed9a), TOBN(0x1fe647d8, 0x3d30a2c5), TOBN(0x0857f77e, 0xf78a81dc), TOBN(0x11d5a334, 0x131a4a9b), TOBN(0xc0a94af9, 0x29d393f5), TOBN(0xbc3a5c0b, 0xdaa6ec1a), TOBN(0xba9fe493, 0x88d2d7ed), TOBN(0xbb4335b4, 0xbb614797), TOBN(0x991c4d68, 0x72f83533), TOBN(0x53258c28, 0xd2f01cb3), TOBN(0x93d6eaa3, 0xd75db0b1), TOBN(0x419a2b0d, 0xe87d0db4), TOBN(0xa1e48f03, 0xd8fe8493), TOBN(0xf747faf6, 0xc508b23a), TOBN(0xf137571a, 0x35d53549), TOBN(0x9f5e58e2, 0xfcf9b838), TOBN(0xc7186cee, 0xa7fd3cf5), TOBN(0x77b868ce, 0xe978a1d3), TOBN(0xe3a68b33, 0x7ab92d04), TOBN(0x51029794, 0x87a5b862), TOBN(0x5f0606c3, 0x3a61d41d), TOBN(0x2814be27, 0x6f9326f1), TOBN(0x2f521c14, 0xc6fe3c2e), TOBN(0x17464d7d, 0xacdf7351), TOBN(0x10f5f9d3, 0x777f7e44), TOBN(0xce8e616b, 0x269fb37d), TOBN(0xaaf73804, 0x7de62de5), TOBN(0xaba11175, 0x4fdd4153), TOBN(0x515759ba, 0x3770b49b), TOBN(0x8b09ebf8, 0xaa423a61), TOBN(0x592245a1, 0xcd41fb92), TOBN(0x1cba8ec1, 0x9b4c8936), TOBN(0xa87e91e3, 0xaf36710e), TOBN(0x1fd84ce4, 0x3d34a2e3), TOBN(0xee3759ce, 0xb43b5d61), TOBN(0x895bc78c, 0x619186c7), TOBN(0xf19c3809, 0xcbb9725a), TOBN(0xc0be21aa, 0xde744b1f), TOBN(0xa7d222b0, 0x60f8056b), TOBN(0x74be6157, 0xb23efe11), TOBN(0x6fab2b4f, 0x0cd68253), TOBN(0xad33ea5f, 0x4bf1d725), TOBN(0x9c1d8ee2, 0x4f6c950f), TOBN(0x544ee78a, 0xa377af06), TOBN(0x54f489bb, 0x94a113e1), TOBN(0x8f11d634, 0x992fb7e8), TOBN(0x0169a7aa, 0xa2a44347), TOBN(0x1d49d4af, 0x95020e00), TOBN(0x95945722, 0xe08e120b), TOBN(0xb6e33878, 0xa4d32282), TOBN(0xe36e029d, 0x48020ae7), TOBN(0xe05847fb, 0x37a9b750), TOBN(0xf876812c, 0xb29e3819), TOBN(0x84ad138e, 0xd23a17f0), TOBN(0x6d7b4480, 0xf0b3950e), TOBN(0xdfa8aef4, 0x2fd67ae0), TOBN(0x8d3eea24, 0x52333af6), TOBN(0x0d052075, 0xb15d5acc), TOBN(0xc6d9c79f, 0xbd815bc4), TOBN(0x8dcafd88, 0xdfa36cf2), TOBN(0x908ccbe2, 0x38aa9070), TOBN(0x638722c4, 0xba35afce), TOBN(0x5a3da8b0, 0xfd6abf0b), TOBN(0x2dce252c, 0xc9c335c1), TOBN(0x84e7f0de, 0x65aa799b), TOBN(0x2101a522, 0xb99a72cb), TOBN(0x06de6e67, 0x87618016), TOBN(0x5ff8c7cd, 0xe6f3653e), TOBN(0x0a821ab5, 0xc7a6754a), TOBN(0x7e3fa52b, 0x7cb0b5a2), TOBN(0xa7fb121c, 0xc9048790), TOBN(0x1a725020, 0x06ce053a), TOBN(0xb490a31f, 0x04e929b0), TOBN(0xe17be47d, 0x62dd61ad), TOBN(0x781a961c, 0x6be01371), TOBN(0x1063bfd3, 0xdae3cbba), TOBN(0x35647406, 0x7f73c9ba), TOBN(0xf50e957b, 0x2736a129), TOBN(0xa6313702, 0xed13f256), TOBN(0x9436ee65, 0x3a19fcc5), TOBN(0xcf2bdb29, 0xe7a4c8b6), TOBN(0xb06b1244, 0xc5f95cd8), TOBN(0xda8c8af0, 0xf4ab95f4), TOBN(0x1bae59c2, 0xb9e5836d), TOBN(0x07d51e7e, 0x3acffffc), TOBN(0x01e15e6a, 0xc2ccbcda), TOBN(0x3bc1923f, 0x8528c3e0), TOBN(0x43324577, 0xa49fead4), TOBN(0x61a1b884, 0x2aa7a711), TOBN(0xf9a86e08, 0x700230ef), TOBN(0x0af585a1, 0xbd19adf8), TOBN(0x7645f361, 0xf55ad8f2), TOBN(0x6e676223, 0x46c3614c), TOBN(0x23cb257c, 0x4e774d3f), TOBN(0x82a38513, 0xac102d1b), TOBN(0x9bcddd88, 0x7b126aa5), TOBN(0xe716998b, 0xeefd3ee4), TOBN(0x4239d571, 0xfb167583), TOBN(0xdd011c78, 0xd16c8f8a), TOBN(0x271c2895, 0x69a27519), TOBN(0x9ce0a3b7, 0xd2d64b6a), TOBN(0x8c977289, 0xd5ec6738), TOBN(0xa3b49f9a, 0x8840ef6b), TOBN(0x808c14c9, 0x9a453419), TOBN(0x5c00295b, 0x0cf0a2d5), TOBN(0x524414fb, 0x1d4bcc76), TOBN(0xb07691d2, 0x459a88f1), TOBN(0x77f43263, 0xf70d110f), TOBN(0x64ada5e0, 0xb7abf9f3), TOBN(0xafd0f94e, 0x5b544cf5), TOBN(0xb4a13a15, 0xfd2713fe), TOBN(0xb99b7d6e, 0x250c74f4), TOBN(0x097f2f73, 0x20324e45), TOBN(0x994b37d8, 0xaffa8208), TOBN(0xc3c31b0b, 0xdc29aafc), TOBN(0x3da74651, 0x7a3a607f), TOBN(0xd8e1b8c1, 0xfe6955d6), TOBN(0x716e1815, 0xc8418682), TOBN(0x541d487f, 0x7dc91d97), TOBN(0x48a04669, 0xc6996982), TOBN(0xf39cab15, 0x83a6502e), TOBN(0x025801a0, 0xe68db055), TOBN(0xf3569758, 0xba3338d5), TOBN(0xb0c8c0aa, 0xee2afa84), TOBN(0x4f6985d3, 0xfb6562d1), TOBN(0x351f1f15, 0x132ed17a), TOBN(0x510ed0b4, 0xc04365fe), TOBN(0xa3f98138, 0xe5b1f066), TOBN(0xbc9d95d6, 0x32df03dc), TOBN(0xa83ccf6e, 0x19abd09e), TOBN(0x0b4097c1, 0x4ff17edb), TOBN(0x58a5c478, 0xd64a06ce), TOBN(0x2ddcc3fd, 0x544a58fd), TOBN(0xd449503d, 0x9e8153b8), TOBN(0x3324fd02, 0x7774179b), TOBN(0xaf5d47c8, 0xdbd9120c), TOBN(0xeb860162, 0x34fa94db), TOBN(0x5817bdd1, 0x972f07f4), TOBN(0xe5579e2e, 0xd27bbceb), TOBN(0x86847a1f, 0x5f11e5a6), TOBN(0xb39ed255, 0x7c3cf048), TOBN(0xe1076417, 0xa2f62e55), TOBN(0x6b9ab38f, 0x1bcf82a2), TOBN(0x4bb7c319, 0x7aeb29f9), TOBN(0xf6d17da3, 0x17227a46), TOBN(0xab53ddbd, 0x0f968c00), TOBN(0xa03da7ec, 0x000c880b), TOBN(0x7b239624, 0x6a9ad24d), TOBN(0x612c0401, 0x01ec60d0), TOBN(0x70d10493, 0x109f5df1), TOBN(0xfbda4030, 0x80af7550), TOBN(0x30b93f95, 0xc6b9a9b3), TOBN(0x0c74ec71, 0x007d9418), TOBN(0x94175564, 0x6edb951f), TOBN(0x5f4a9d78, 0x7f22c282), TOBN(0xb7870895, 0xb38d1196), TOBN(0xbc593df3, 0xa228ce7c), TOBN(0xc78c5bd4, 0x6af3641a), TOBN(0x7802200b, 0x3d9b3dcc), TOBN(0x0dc73f32, 0x8be33304), TOBN(0x847ed87d, 0x61ffb79a), TOBN(0xf85c974e, 0x6d671192), TOBN(0x1e14100a, 0xde16f60f), TOBN(0x45cb0d5a, 0x95c38797), TOBN(0x18923bba, 0x9b022da4), TOBN(0xef2be899, 0xbbe7e86e), TOBN(0x4a1510ee, 0x216067bf), TOBN(0xd98c8154, 0x84d5ce3e), TOBN(0x1af777f0, 0xf92a2b90), TOBN(0x9fbcb400, 0x4ef65724), TOBN(0x3e04a4c9, 0x3c0ca6fe), TOBN(0xfb3e2cb5, 0x55002994), TOBN(0x1f3a93c5, 0x5363ecab), TOBN(0x1fe00efe, 0x3923555b), TOBN(0x744bedd9, 0x1e1751ea), TOBN(0x3fb2db59, 0x6ab69357), TOBN(0x8dbd7365, 0xf5e6618b), TOBN(0x99d53099, 0xdf1ea40e), TOBN(0xb3f24a0b, 0x57d61e64), TOBN(0xd088a198, 0x596eb812), TOBN(0x22c8361b, 0x5762940b), TOBN(0x66f01f97, 0xf9c0d95c), TOBN(0x88461172, 0x8e43cdae), TOBN(0x11599a7f, 0xb72b15c3), TOBN(0x135a7536, 0x420d95cc), TOBN(0x2dcdf0f7, 0x5f7ae2f6), TOBN(0x15fc6e1d, 0xd7fa6da2), TOBN(0x81ca829a, 0xd1d441b6), TOBN(0x84c10cf8, 0x04a106b6), TOBN(0xa9b26c95, 0xa73fbbd0), TOBN(0x7f24e0cb, 0x4d8f6ee8), TOBN(0x48b45937, 0x1e25a043), TOBN(0xf8a74fca, 0x036f3dfe), TOBN(0x1ed46585, 0xc9f84296), TOBN(0x7fbaa8fb, 0x3bc278b0), TOBN(0xa8e96cd4, 0x6c4fcbd0), TOBN(0x940a1202, 0x73b60a5f), TOBN(0x34aae120, 0x55a4aec8), TOBN(0x550e9a74, 0xdbd742f0), TOBN(0x794456d7, 0x228c68ab), TOBN(0x492f8868, 0xa4e25ec6), TOBN(0x682915ad, 0xb2d8f398), TOBN(0xf13b51cc, 0x5b84c953), TOBN(0xcda90ab8, 0x5bb917d6), TOBN(0x4b615560, 0x4ea3dee1), TOBN(0x578b4e85, 0x0a52c1c8), TOBN(0xeab1a695, 0x20b75fc4), TOBN(0x60c14f3c, 0xaa0bb3c6), TOBN(0x220f448a, 0xb8216094), TOBN(0x4fe7ee31, 0xb0e63d34), TOBN(0xf4600572, 0xa9e54fab), TOBN(0xc0493334, 0xd5e7b5a4), TOBN(0x8589fb92, 0x06d54831), TOBN(0xaa70f5cc, 0x6583553a), TOBN(0x0879094a, 0xe25649e5), TOBN(0xcc904507, 0x10044652), TOBN(0xebb0696d, 0x02541c4f), TOBN(0x5a171fde, 0xb9718710), TOBN(0x38f1bed8, 0xf374a9f5), TOBN(0xc8c582e1, 0xba39bdc1), TOBN(0xfc457b0a, 0x908cc0ce), TOBN(0x9a187fd4, 0x883841e2), TOBN(0x8ec25b39, 0x38725381), TOBN(0x2553ed05, 0x96f84395), TOBN(0x095c7661, 0x6f6c6897), TOBN(0x917ac85c, 0x4bdc5610), TOBN(0xb2885fe4, 0x179eb301), TOBN(0x5fc65547, 0x8b78bdcc), TOBN(0x4a9fc893, 0xe59e4699), TOBN(0xbb7ff0cd, 0x3ce299af), TOBN(0x195be9b3, 0xadf38b20), TOBN(0x6a929c87, 0xd38ddb8f), TOBN(0x55fcc99c, 0xb21a51b9), TOBN(0x2b695b4c, 0x721a4593), TOBN(0xed1e9a15, 0x768eaac2), TOBN(0xfb63d71c, 0x7489f914), TOBN(0xf98ba31c, 0x78118910), TOBN(0x80291373, 0x9b128eb4), TOBN(0x7801214e, 0xd448af4a), TOBN(0xdbd2e22b, 0x55418dd3), TOBN(0xeffb3c0d, 0xd3998242), TOBN(0xdfa6077c, 0xc7bf3827), TOBN(0xf2165bcb, 0x47f8238f), TOBN(0xfe37cf68, 0x8564d554), TOBN(0xe5f825c4, 0x0a81fb98), TOBN(0x43cc4f67, 0xffed4d6f), TOBN(0xbc609578, 0xb50a34b0), TOBN(0x8aa8fcf9, 0x5041faf1), TOBN(0x5659f053, 0x651773b6), TOBN(0xe87582c3, 0x6044d63b), TOBN(0xa6089409, 0x0cdb0ca0), TOBN(0x8c993e0f, 0xbfb2bcf6), TOBN(0xfc64a719, 0x45985cfc), TOBN(0x15c4da80, 0x83dbedba), TOBN(0x804ae112, 0x2be67df7), TOBN(0xda4c9658, 0xa23defde), TOBN(0x12002ddd, 0x5156e0d3), TOBN(0xe68eae89, 0x5dd21b96), TOBN(0x8b99f28b, 0xcf44624d), TOBN(0x0ae00808, 0x1ec8897a), TOBN(0xdd0a9303, 0x6712f76e), TOBN(0x96237522, 0x4e233de4), TOBN(0x192445b1, 0x2b36a8a5), TOBN(0xabf9ff74, 0x023993d9), TOBN(0x21f37bf4, 0x2aad4a8f), TOBN(0x340a4349, 0xf8bd2bbd), TOBN(0x1d902cd9, 0x4868195d), TOBN(0x3d27bbf1, 0xe5fdb6f1), TOBN(0x7a5ab088, 0x124f9f1c), TOBN(0xc466ab06, 0xf7a09e03), TOBN(0x2f8a1977, 0x31f2c123), TOBN(0xda355dc7, 0x041b6657), TOBN(0xcb840d12, 0x8ece2a7c), TOBN(0xb600ad9f, 0x7db32675), TOBN(0x78fea133, 0x07a06f1b), TOBN(0x5d032269, 0xb31f6094), TOBN(0x07753ef5, 0x83ec37aa), TOBN(0x03485aed, 0x9c0bea78), TOBN(0x41bb3989, 0xbc3f4524), TOBN(0x09403761, 0x697f726d), TOBN(0x6109beb3, 0xdf394820), TOBN(0x804111ea, 0x3b6d1145), TOBN(0xb6271ea9, 0xa8582654), TOBN(0x619615e6, 0x24e66562), TOBN(0xa2554945, 0xd7b6ad9c), TOBN(0xd9c4985e, 0x99bfe35f), TOBN(0x9770ccc0, 0x7b51cdf6), TOBN(0x7c327013, 0x92881832), TOBN(0x8777d45f, 0x286b26d1), TOBN(0x9bbeda22, 0xd847999d), TOBN(0x03aa33b6, 0xc3525d32), TOBN(0x4b7b96d4, 0x28a959a1), TOBN(0xbb3786e5, 0x31e5d234), TOBN(0xaeb5d3ce, 0x6961f247), TOBN(0x20aa85af, 0x02f93d3f), TOBN(0x9cd1ad3d, 0xd7a7ae4f), TOBN(0xbf6688f0, 0x781adaa8), TOBN(0xb1b40e86, 0x7469cead), TOBN(0x1904c524, 0x309fca48), TOBN(0x9b7312af, 0x4b54bbc7), TOBN(0xbe24bf8f, 0x593affa2), TOBN(0xbe5e0790, 0xbd98764b), TOBN(0xa0f45f17, 0xa26e299e), TOBN(0x4af0d2c2, 0x6b8fe4c7), TOBN(0xef170db1, 0x8ae8a3e6), TOBN(0x0e8d61a0, 0x29e0ccc1), TOBN(0xcd53e87e, 0x60ad36ca), TOBN(0x328c6623, 0xc8173822), TOBN(0x7ee1767d, 0xa496be55), TOBN(0x89f13259, 0x648945af), TOBN(0x9e45a5fd, 0x25c8009c), TOBN(0xaf2febd9, 0x1f61ab8c), TOBN(0x43f6bc86, 0x8a275385), TOBN(0x87792348, 0xf2142e79), TOBN(0x17d89259, 0xc6e6238a), TOBN(0x7536d2f6, 0x4a839d9b), TOBN(0x1f428fce, 0x76a1fbdc), TOBN(0x1c109601, 0x0db06dfe), TOBN(0xbfc16bc1, 0x50a3a3cc), TOBN(0xf9cbd9ec, 0x9b30f41b), TOBN(0x5b5da0d6, 0x00138cce), TOBN(0xec1d0a48, 0x56ef96a7), TOBN(0xb47eb848, 0x982bf842), TOBN(0x66deae32, 0xec3f700d), TOBN(0x4e43c42c, 0xaa1181e0), TOBN(0xa1d72a31, 0xd1a4aa2a), TOBN(0x440d4668, 0xc004f3ce), TOBN(0x0d6a2d3b, 0x45fe8a7a), TOBN(0x820e52e2, 0xfb128365), TOBN(0x29ac5fcf, 0x25e51b09), TOBN(0x180cd2bf, 0x2023d159), TOBN(0xa9892171, 0xa1ebf90e), TOBN(0xf97c4c87, 0x7c132181), TOBN(0x9f1dc724, 0xc03dbb7e), TOBN(0xae043765, 0x018cbbe4), TOBN(0xfb0b2a36, 0x0767d153), TOBN(0xa8e2f4d6, 0x249cbaeb), TOBN(0x172a5247, 0xd95ea168), TOBN(0x1758fada, 0x2970764a), TOBN(0xac803a51, 0x1d978169), TOBN(0x299cfe2e, 0xde77e01b), TOBN(0x652a1e17, 0xb0a98927), TOBN(0x2e26e1d1, 0x20014495), TOBN(0x7ae0af9f, 0x7175b56a), TOBN(0xc2e22a80, 0xd64b9f95), TOBN(0x4d0ff9fb, 0xd90a060a), TOBN(0x496a27db, 0xbaf38085), TOBN(0x32305401, 0xda776bcf), TOBN(0xb8cdcef6, 0x725f209e), TOBN(0x61ba0f37, 0x436a0bba), TOBN(0x263fa108, 0x76860049), TOBN(0x92beb98e, 0xda3542cf), TOBN(0xa2d4d14a, 0xd5849538), TOBN(0x989b9d68, 0x12e9a1bc), TOBN(0x61d9075c, 0x5f6e3268), TOBN(0x352c6aa9, 0x99ace638), TOBN(0xde4e4a55, 0x920f43ff), TOBN(0xe5e4144a, 0xd673c017), TOBN(0x667417ae, 0x6f6e05ea), TOBN(0x613416ae, 0xdcd1bd56), TOBN(0x5eb36201, 0x86693711), TOBN(0x2d7bc504, 0x3a1aa914), TOBN(0x175a1299, 0x76dc5975), TOBN(0xe900e0f2, 0x3fc8125c), TOBN(0x569ef68c, 0x11198875), TOBN(0x9012db63, 0x63a113b4), TOBN(0xe3bd3f56, 0x98835766), TOBN(0xa5c94a52, 0x76412dea), TOBN(0xad9e2a09, 0xaa735e5c), TOBN(0x405a984c, 0x508b65e9), TOBN(0xbde4a1d1, 0x6df1a0d1), TOBN(0x1a9433a1, 0xdfba80da), TOBN(0xe9192ff9, 0x9440ad2e), TOBN(0x9f649696, 0x5099fe92), TOBN(0x25ddb65c, 0x0b27a54a), TOBN(0x178279dd, 0xc590da61), TOBN(0x5479a999, 0xfbde681a), TOBN(0xd0e84e05, 0x013fe162), TOBN(0xbe11dc92, 0x632d471b), TOBN(0xdf0b0c45, 0xfc0e089f), TOBN(0x04fb15b0, 0x4c144025), TOBN(0xa61d5fc2, 0x13c99927), TOBN(0xa033e9e0, 0x3de2eb35), TOBN(0xf8185d5c, 0xb8dacbb4), TOBN(0x9a88e265, 0x8644549d), TOBN(0xf717af62, 0x54671ff6), TOBN(0x4bd4241b, 0x5fa58603), TOBN(0x06fba40b, 0xe67773c0), TOBN(0xc1d933d2, 0x6a2847e9), TOBN(0xf4f5acf3, 0x689e2c70), TOBN(0x92aab0e7, 0x46bafd31), TOBN(0x798d76aa, 0x3473f6e5), TOBN(0xcc6641db, 0x93141934), TOBN(0xcae27757, 0xd31e535e), TOBN(0x04cc43b6, 0x87c2ee11), TOBN(0x8d1f9675, 0x2e029ffa), TOBN(0xc2150672, 0xe4cc7a2c), TOBN(0x3b03c1e0, 0x8d68b013), TOBN(0xa9d6816f, 0xedf298f3), TOBN(0x1bfbb529, 0xa2804464), TOBN(0x95a52fae, 0x5db22125), TOBN(0x55b32160, 0x0e1cb64e), TOBN(0x004828f6, 0x7e7fc9fe), TOBN(0x13394b82, 0x1bb0fb93), TOBN(0xb6293a2d, 0x35f1a920), TOBN(0xde35ef21, 0xd145d2d9), TOBN(0xbe6225b3, 0xbb8fa603), TOBN(0x00fc8f6b, 0x32cf252d), TOBN(0xa28e52e6, 0x117cf8c2), TOBN(0x9d1dc89b, 0x4c371e6d), TOBN(0xcebe0675, 0x36ef0f28), TOBN(0x5de05d09, 0xa4292f81), TOBN(0xa8303593, 0x353e3083), TOBN(0xa1715b0a, 0x7e37a9bb), TOBN(0x8c56f61e, 0x2b8faec3), TOBN(0x52507431, 0x33c9b102), TOBN(0x0130cefc, 0xa44431f0), TOBN(0x56039fa0, 0xbd865cfb), TOBN(0x4b03e578, 0xbc5f1dd7), TOBN(0x40edf2e4, 0xbabe7224), TOBN(0xc752496d, 0x3a1988f6), TOBN(0xd1572d3b, 0x564beb6b), TOBN(0x0db1d110, 0x39a1c608), TOBN(0x568d1934, 0x16f60126), TOBN(0x05ae9668, 0xf354af33), TOBN(0x19de6d37, 0xc92544f2), TOBN(0xcc084353, 0xa35837d5), TOBN(0xcbb6869c, 0x1a514ece), TOBN(0xb633e728, 0x2e1d1066), TOBN(0xf15dd69f, 0x936c581c), TOBN(0x96e7b8ce, 0x7439c4f9), TOBN(0x5e676f48, 0x2e448a5b), TOBN(0xb2ca7d5b, 0xfd916bbb), TOBN(0xd55a2541, 0xf5024025), TOBN(0x47bc5769, 0xe4c2d937), TOBN(0x7d31b92a, 0x0362189f), TOBN(0x83f3086e, 0xef7816f9), TOBN(0xf9f46d94, 0xb587579a), TOBN(0xec2d22d8, 0x30e76c5f), TOBN(0x27d57461, 0xb000ffcf), TOBN(0xbb7e65f9, 0x364ffc2c), TOBN(0x7c7c9477, 0x6652a220), TOBN(0x61618f89, 0xd696c981), TOBN(0x5021701d, 0x89effff3), TOBN(0xf2c8ff8e, 0x7c314163), TOBN(0x2da413ad, 0x8efb4d3e), TOBN(0x937b5adf, 0xce176d95), TOBN(0x22867d34, 0x2a67d51c), TOBN(0x262b9b10, 0x18eb3ac9), TOBN(0x4e314fe4, 0xc43ff28b), TOBN(0x76476627, 0x6a664e7a), TOBN(0x3e90e40b, 0xb7a565c2), TOBN(0x8588993a, 0xc1acf831), TOBN(0xd7b501d6, 0x8f938829), TOBN(0x996627ee, 0x3edd7d4c), TOBN(0x37d44a62, 0x90cd34c7), TOBN(0xa8327499, 0xf3833e8d), TOBN(0x2e18917d, 0x4bf50353), TOBN(0x85dd726b, 0x556765fb), TOBN(0x54fe65d6, 0x93d5ab66), TOBN(0x3ddbaced, 0x915c25fe), TOBN(0xa799d9a4, 0x12f22e85), TOBN(0xe2a24867, 0x6d06f6bc), TOBN(0xf4f1ee56, 0x43ca1637), TOBN(0xfda2828b, 0x61ece30a), TOBN(0x758c1a3e, 0xa2dee7a6), TOBN(0xdcde2f3c, 0x734b2284), TOBN(0xaba445d2, 0x4eaba6ad), TOBN(0x35aaf668, 0x76cee0a7), TOBN(0x7e0b04a9, 0xe5aa049a), TOBN(0xe74083ad, 0x91103e84), TOBN(0xbeb183ce, 0x40afecc3), TOBN(0x6b89de9f, 0xea043f7a)}, {TOBN(0x0e299d23, 0xfe67ba66), TOBN(0x91450760, 0x93cf2f34), TOBN(0xf45b5ea9, 0x97fcf913), TOBN(0x5be00843, 0x8bd7ddda), TOBN(0x358c3e05, 0xd53ff04d), TOBN(0xbf7ccdc3, 0x5de91ef7), TOBN(0xad684dbf, 0xb69ec1a0), TOBN(0x367e7cf2, 0x801fd997), TOBN(0x0ca1f3b7, 0xb0dc8595), TOBN(0x27de4608, 0x9f1d9f2e), TOBN(0x1af3bf39, 0xbadd82a7), TOBN(0x79356a79, 0x65862448), TOBN(0xc0602345, 0xf5f9a052), TOBN(0x1a8b0f89, 0x139a42f9), TOBN(0xb53eee42, 0x844d40fc), TOBN(0x93b0bfe5, 0x4e5b6368), TOBN(0x5434dd02, 0xc024789c), TOBN(0x90dca9ea, 0x41b57bfc), TOBN(0x8aa898e2, 0x243398df), TOBN(0xf607c834, 0x894a94bb), TOBN(0xbb07be97, 0xc2c99b76), TOBN(0x6576ba67, 0x18c29302), TOBN(0x3d79efcc, 0xe703a88c), TOBN(0xf259ced7, 0xb6a0d106), TOBN(0x0f893a5d, 0xc8de610b), TOBN(0xe8c515fb, 0x67e223ce), TOBN(0x7774bfa6, 0x4ead6dc5), TOBN(0x89d20f95, 0x925c728f), TOBN(0x7a1e0966, 0x098583ce), TOBN(0xa2eedb94, 0x93f2a7d7), TOBN(0x1b282097, 0x4c304d4a), TOBN(0x0842e3da, 0xc077282d), TOBN(0xe4d972a3, 0x3b9e2d7b), TOBN(0x7cc60b27, 0xc48218ff), TOBN(0x8fc70838, 0x84149d91), TOBN(0x5c04346f, 0x2f461ecc), TOBN(0xebe9fdf2, 0x614650a9), TOBN(0x5e35b537, 0xc1f666ac), TOBN(0x645613d1, 0x88babc83), TOBN(0x88cace3a, 0xc5e1c93e), TOBN(0x209ca375, 0x3de92e23), TOBN(0xccb03cc8, 0x5fbbb6e3), TOBN(0xccb90f03, 0xd7b1487e), TOBN(0xfa9c2a38, 0xc710941f), TOBN(0x756c3823, 0x6724ceed), TOBN(0x3a902258, 0x192d0323), TOBN(0xb150e519, 0xea5e038e), TOBN(0xdcba2865, 0xc7427591), TOBN(0xe549237f, 0x78890732), TOBN(0xc443bef9, 0x53fcb4d9), TOBN(0x9884d8a6, 0xeb3480d6), TOBN(0x8a35b6a1, 0x3048b186), TOBN(0xb4e44716, 0x65e9a90a), TOBN(0x45bf380d, 0x653006c0), TOBN(0x8f3f820d, 0x4fe9ae3b), TOBN(0x244a35a0, 0x979a3b71), TOBN(0xa1010e9d, 0x74cd06ff), TOBN(0x9c17c7df, 0xaca3eeac), TOBN(0x74c86cd3, 0x8063aa2b), TOBN(0x8595c4b3, 0x734614ff), TOBN(0xa3de00ca, 0x990f62cc), TOBN(0xd9bed213, 0xca0c3be5), TOBN(0x7886078a, 0xdf8ce9f5), TOBN(0xddb27ce3, 0x5cd44444), TOBN(0xed374a66, 0x58926ddd), TOBN(0x138b2d49, 0x908015b8), TOBN(0x886c6579, 0xde1f7ab8), TOBN(0x888b9aa0, 0xc3020b7a), TOBN(0xd3ec034e, 0x3a96e355), TOBN(0xba65b0b8, 0xf30fbe9a), TOBN(0x064c8e50, 0xff21367a), TOBN(0x1f508ea4, 0x0b04b46e), TOBN(0x98561a49, 0x747c866c), TOBN(0xbbb1e5fe, 0x0518a062), TOBN(0x20ff4e8b, 0xecdc3608), TOBN(0x7f55cded, 0x20184027), TOBN(0x8d73ec95, 0xf38c85f0), TOBN(0x5b589fdf, 0x8bc3b8c3), TOBN(0xbe95dd98, 0x0f12b66f), TOBN(0xf5bd1a09, 0x0e338e01), TOBN(0x65163ae5, 0x5e915918), TOBN(0x6158d6d9, 0x86f8a46b), TOBN(0x8466b538, 0xeeebf99c), TOBN(0xca8761f6, 0xbca477ef), TOBN(0xaf3449c2, 0x9ebbc601), TOBN(0xef3b0f41, 0xe0c3ae2f), TOBN(0xaa6c577d, 0x5de63752), TOBN(0xe9166601, 0x64682a51), TOBN(0x5a3097be, 0xfc15aa1e), TOBN(0x40d12548, 0xb54b0745), TOBN(0x5bad4706, 0x519a5f12), TOBN(0xed03f717, 0xa439dee6), TOBN(0x0794bb6c, 0x4a02c499), TOBN(0xf725083d, 0xcffe71d2), TOBN(0x2cad7519, 0x0f3adcaf), TOBN(0x7f68ea1c, 0x43729310), TOBN(0xe747c8c7, 0xb7ffd977), TOBN(0xec104c35, 0x80761a22), TOBN(0x8395ebaf, 0x5a3ffb83), TOBN(0xfb3261f4, 0xe4b63db7), TOBN(0x53544960, 0xd883e544), TOBN(0x13520d70, 0x8cc2eeb8), TOBN(0x08f6337b, 0xd3d65f99), TOBN(0x83997db2, 0x781cf95b), TOBN(0xce6ff106, 0x0dbd2c01), TOBN(0x4f8eea6b, 0x1f9ce934), TOBN(0x546f7c4b, 0x0e993921), TOBN(0x6236a324, 0x5e753fc7), TOBN(0x65a41f84, 0xa16022e9), TOBN(0x0c18d878, 0x43d1dbb2), TOBN(0x73c55640, 0x2d4cef9c), TOBN(0xa0428108, 0x70444c74), TOBN(0x68e4f15e, 0x9afdfb3c), TOBN(0x49a56143, 0x5bdfb6df), TOBN(0xa9bc1bd4, 0x5f823d97), TOBN(0xbceb5970, 0xea111c2a), TOBN(0x366b455f, 0xb269bbc4), TOBN(0x7cd85e1e, 0xe9bc5d62), TOBN(0xc743c41c, 0x4f18b086), TOBN(0xa4b40990, 0x95294fb9), TOBN(0x9c7c581d, 0x26ee8382), TOBN(0xcf17dcc5, 0x359d638e), TOBN(0xee8273ab, 0xb728ae3d), TOBN(0x1d112926, 0xf821f047), TOBN(0x11498477, 0x50491a74), TOBN(0x687fa761, 0xfde0dfb9), TOBN(0x2c258022, 0x7ea435ab), TOBN(0x6b8bdb94, 0x91ce7e3f), TOBN(0x4c5b5dc9, 0x3bf834aa), TOBN(0x04371819, 0x4f6c7e4b), TOBN(0xc284e00a, 0x3736bcad), TOBN(0x0d881118, 0x21ae8f8d), TOBN(0xf9cf0f82, 0xf48c8e33), TOBN(0xa11fd075, 0xa1bf40db), TOBN(0xdceab0de, 0xdc2733e5), TOBN(0xc560a8b5, 0x8e986bd7), TOBN(0x48dd1fe2, 0x3929d097), TOBN(0x3885b290, 0x92f188f1), TOBN(0x0f2ae613, 0xda6fcdac), TOBN(0x9054303e, 0xb662a46c), TOBN(0xb6871e44, 0x0738042a), TOBN(0x98e6a977, 0xbdaf6449), TOBN(0xd8bc0650, 0xd1c9df1b), TOBN(0xef3d6451, 0x36e098f9), TOBN(0x03fbae82, 0xb6d72d28), TOBN(0x77ca9db1, 0xf5d84080), TOBN(0x8a112cff, 0xa58efc1c), TOBN(0x518d761c, 0xc564cb4a), TOBN(0x69b5740e, 0xf0d1b5ce), TOBN(0x717039cc, 0xe9eb1785), TOBN(0x3fe29f90, 0x22f53382), TOBN(0x8e54ba56, 0x6bc7c95c), TOBN(0x9c806d8a, 0xf7f91d0f), TOBN(0x3b61b0f1, 0xa82a5728), TOBN(0x4640032d, 0x94d76754), TOBN(0x273eb5de, 0x47d834c6), TOBN(0x2988abf7, 0x7b4e4d53), TOBN(0xb7ce66bf, 0xde401777), TOBN(0x9fba6b32, 0x715071b3), TOBN(0x82413c24, 0xad3a1a98), TOBN(0x5b7fc8c4, 0xe0e8ad93), TOBN(0xb5679aee, 0x5fab868d), TOBN(0xb1f9d2fa, 0x2b3946f3), TOBN(0x458897dc, 0x5685b50a), TOBN(0x1e98c930, 0x89d0caf3), TOBN(0x39564c5f, 0x78642e92), TOBN(0x1b77729a, 0x0dbdaf18), TOBN(0xf9170722, 0x579e82e6), TOBN(0x680c0317, 0xe4515fa5), TOBN(0xf85cff84, 0xfb0c790f), TOBN(0xc7a82aab, 0x6d2e0765), TOBN(0x7446bca9, 0x35c82b32), TOBN(0x5de607aa, 0x6d63184f), TOBN(0x7c1a46a8, 0x262803a6), TOBN(0xd218313d, 0xaebe8035), TOBN(0x92113ffd, 0xc73c51f8), TOBN(0x4b38e083, 0x12e7e46c), TOBN(0x69d0a37a, 0x56126bd5), TOBN(0xfb3f324b, 0x73c07e04), TOBN(0xa0c22f67, 0x8fda7267), TOBN(0x8f2c0051, 0x4d2c7d8f), TOBN(0xbc45ced3, 0xcbe2cae5), TOBN(0xe1c6cf07, 0xa8f0f277), TOBN(0xbc392312, 0x1eb99a98), TOBN(0x75537b7e, 0x3cc8ac85), TOBN(0x8d725f57, 0xdd02753b), TOBN(0xfd05ff64, 0xb737df2f), TOBN(0x55fe8712, 0xf6d2531d), TOBN(0x57ce04a9, 0x6ab6b01c), TOBN(0x69a02a89, 0x7cd93724), TOBN(0x4f82ac35, 0xcf86699b), TOBN(0x8242d3ad, 0x9cb4b232), TOBN(0x713d0f65, 0xd62105e5), TOBN(0xbb222bfa, 0x2d29be61), TOBN(0xf2f9a79e, 0x6cfbef09), TOBN(0xfc24d8d3, 0xd5d6782f), TOBN(0x5db77085, 0xd4129967), TOBN(0xdb81c3cc, 0xdc3c2a43), TOBN(0x9d655fc0, 0x05d8d9a3), TOBN(0x3f5d057a, 0x54298026), TOBN(0x1157f56d, 0x88c54694), TOBN(0xb26baba5, 0x9b09573e), TOBN(0x2cab03b0, 0x22adffd1), TOBN(0x60a412c8, 0xdd69f383), TOBN(0xed76e98b, 0x54b25039), TOBN(0xd4ee67d3, 0x687e714d), TOBN(0x87739648, 0x7b00b594), TOBN(0xce419775, 0xc9ef709b), TOBN(0x40f76f85, 0x1c203a40), TOBN(0x30d352d6, 0xeafd8f91), TOBN(0xaf196d3d, 0x95578dd2), TOBN(0xea4bb3d7, 0x77cc3f3d), TOBN(0x42a5bd03, 0xb98e782b), TOBN(0xac958c40, 0x0624920d), TOBN(0xb838134c, 0xfc56fcc8), TOBN(0x86ec4ccf, 0x89572e5e), TOBN(0x69c43526, 0x9be47be0), TOBN(0x323b7dd8, 0xcb28fea1), TOBN(0xfa5538ba, 0x3a6c67e5), TOBN(0xef921d70, 0x1d378e46), TOBN(0xf92961fc, 0x3c4b880e), TOBN(0x3f6f914e, 0x98940a67), TOBN(0xa990eb0a, 0xfef0ff39), TOBN(0xa6c2920f, 0xf0eeff9c), TOBN(0xca804166, 0x51b8d9a3), TOBN(0x42531bc9, 0x0ffb0db1), TOBN(0x72ce4718, 0xaa82e7ce), TOBN(0x6e199913, 0xdf574741), TOBN(0xd5f1b13d, 0xd5d36946), TOBN(0x8255dc65, 0xf68f0194), TOBN(0xdc9df4cd, 0x8710d230), TOBN(0x3453c20f, 0x138c1988), TOBN(0x9af98dc0, 0x89a6ef01), TOBN(0x4dbcc3f0, 0x9857df85), TOBN(0x34805601, 0x5c1ad924), TOBN(0x40448da5, 0xd0493046), TOBN(0xf629926d, 0x4ee343e2), TOBN(0x6343f1bd, 0x90e8a301), TOBN(0xefc93491, 0x40815b3f), TOBN(0xf882a423, 0xde8f66fb), TOBN(0x3a12d5f4, 0xe7db9f57), TOBN(0x7dfba38a, 0x3c384c27), TOBN(0x7a904bfd, 0x6fc660b1), TOBN(0xeb6c5db3, 0x2773b21c), TOBN(0xc350ee66, 0x1cdfe049), TOBN(0x9baac0ce, 0x44540f29), TOBN(0xbc57b6ab, 0xa5ec6aad), TOBN(0x167ce8c3, 0x0a7c1baa), TOBN(0xb23a03a5, 0x53fb2b56), TOBN(0x6ce141e7, 0x4e057f78), TOBN(0x796525c3, 0x89e490d9), TOBN(0x0bc95725, 0xa31a7e75), TOBN(0x1ec56791, 0x1220fd06), TOBN(0x716e3a3c, 0x408b0bd6), TOBN(0x31cd6bf7, 0xe8ebeba9), TOBN(0xa7326ca6, 0xbee6b670), TOBN(0x3d9f851c, 0xcd090c43), TOBN(0x561e8f13, 0xf12c3988), TOBN(0x50490b6a, 0x904b7be4), TOBN(0x61690ce1, 0x0410737b), TOBN(0x299e9a37, 0x0f009052), TOBN(0x258758f0, 0xf026092e), TOBN(0x9fa255f3, 0xfdfcdc0f), TOBN(0xdbc9fb1f, 0xc0e1bcd2), TOBN(0x35f9dd6e, 0x24651840), TOBN(0xdca45a84, 0xa5c59abc), TOBN(0x103d396f, 0xecca4938), TOBN(0x4532da0a, 0xb97b3f29), TOBN(0xc4135ea5, 0x1999a6bf), TOBN(0x3aa9505a, 0x5e6bf2ee), TOBN(0xf77cef06, 0x3f5be093), TOBN(0x97d1a0f8, 0xa943152e), TOBN(0x2cb0ebba, 0x2e1c21dd), TOBN(0xf41b29fc, 0x2c6797c4), TOBN(0xc6e17321, 0xb300101f), TOBN(0x4422b0e9, 0xd0d79a89), TOBN(0x49e4901c, 0x92f1bfc4), TOBN(0x06ab1f8f, 0xe1e10ed9), TOBN(0x84d35577, 0xdb2926b8), TOBN(0xca349d39, 0x356e8ec2), TOBN(0x70b63d32, 0x343bf1a9), TOBN(0x8fd3bd28, 0x37d1a6b1), TOBN(0x0454879c, 0x316865b4), TOBN(0xee959ff6, 0xc458efa2), TOBN(0x0461dcf8, 0x9706dc3f), TOBN(0x737db0e2, 0x164e4b2e), TOBN(0x09262680, 0x2f8843c8), TOBN(0x54498bbc, 0x7745e6f6), TOBN(0x359473fa, 0xa29e24af), TOBN(0xfcc3c454, 0x70aa87a1), TOBN(0xfd2c4bf5, 0x00573ace), TOBN(0xb65b514e, 0x28dd1965), TOBN(0xe46ae7cf, 0x2193e393), TOBN(0x60e9a4e1, 0xf5444d97), TOBN(0xe7594e96, 0x00ff38ed), TOBN(0x43d84d2f, 0x0a0e0f02), TOBN(0x8b6db141, 0xee398a21), TOBN(0xb88a56ae, 0xe3bcc5be), TOBN(0x0a1aa52f, 0x373460ea), TOBN(0x20da1a56, 0x160bb19b), TOBN(0xfb54999d, 0x65bf0384), TOBN(0x71a14d24, 0x5d5a180e), TOBN(0xbc44db7b, 0x21737b04), TOBN(0xd84fcb18, 0x01dd8e92), TOBN(0x80de937b, 0xfa44b479), TOBN(0x53505499, 0x5c98fd4f), TOBN(0x1edb12ab, 0x28f08727), TOBN(0x4c58b582, 0xa5f3ef53), TOBN(0xbfb236d8, 0x8327f246), TOBN(0xc3a3bfaa, 0x4d7df320), TOBN(0xecd96c59, 0xb96024f2), TOBN(0xfc293a53, 0x7f4e0433), TOBN(0x5341352b, 0x5acf6e10), TOBN(0xc50343fd, 0xafe652c3), TOBN(0x4af3792d, 0x18577a7f), TOBN(0xe1a4c617, 0xaf16823d), TOBN(0x9b26d0cd, 0x33425d0a), TOBN(0x306399ed, 0x9b7bc47f), TOBN(0x2a792f33, 0x706bb20b), TOBN(0x31219614, 0x98111055), TOBN(0x864ec064, 0x87f5d28b), TOBN(0x11392d91, 0x962277fd), TOBN(0xb5aa7942, 0xbb6aed5f), TOBN(0x080094dc, 0x47e799d9), TOBN(0x4afa588c, 0x208ba19b), TOBN(0xd3e7570f, 0x8512f284), TOBN(0xcbae64e6, 0x02f5799a), TOBN(0xdeebe7ef, 0x514b9492), TOBN(0x30300f98, 0xe5c298ff), TOBN(0x17f561be, 0x3678361f), TOBN(0xf52ff312, 0x98cb9a16), TOBN(0x6233c3bc, 0x5562d490), TOBN(0x7bfa15a1, 0x92e3a2cb), TOBN(0x961bcfd1, 0xe6365119), TOBN(0x3bdd29bf, 0x2c8c53b1), TOBN(0x739704df, 0x822844ba), TOBN(0x7dacfb58, 0x7e7b754b), TOBN(0x23360791, 0xa806c9b9), TOBN(0xe7eb88c9, 0x23504452), TOBN(0x2983e996, 0x852c1783), TOBN(0xdd4ae529, 0x958d881d), TOBN(0x026bae03, 0x262c7b3c), TOBN(0x3a6f9193, 0x960b52d1), TOBN(0xd0980f90, 0x92696cfb), TOBN(0x4c1f428c, 0xd5f30851), TOBN(0x94dfed27, 0x2a4f6630), TOBN(0x4df53772, 0xfc5d48a4), TOBN(0xdd2d5a2f, 0x933260ce), TOBN(0x574115bd, 0xd44cc7a5), TOBN(0x4ba6b20d, 0xbd12533a), TOBN(0x30e93cb8, 0x243057c9), TOBN(0x794c486a, 0x14de320e), TOBN(0xe925d4ce, 0xf21496e4), TOBN(0xf951d198, 0xec696331), TOBN(0x9810e2de, 0x3e8d812f), TOBN(0xd0a47259, 0x389294ab), TOBN(0x513ba2b5, 0x0e3bab66), TOBN(0x462caff5, 0xabad306f), TOBN(0xe2dc6d59, 0xaf04c49e), TOBN(0x1aeb8750, 0xe0b84b0b), TOBN(0xc034f12f, 0x2f7d0ca2), TOBN(0x6d2e8128, 0xe06acf2f), TOBN(0x801f4f83, 0x21facc2f), TOBN(0xa1170c03, 0xf40ef607), TOBN(0xfe0a1d4f, 0x7805a99c), TOBN(0xbde56a36, 0xcc26aba5), TOBN(0x5b1629d0, 0x35531f40), TOBN(0xac212c2b, 0x9afa6108), TOBN(0x30a06bf3, 0x15697be5), TOBN(0x6f0545dc, 0x2c63c7c1), TOBN(0x5d8cb842, 0x7ccdadaf), TOBN(0xd52e379b, 0xac7015bb), TOBN(0xc4f56147, 0xf462c23e), TOBN(0xd44a4298, 0x46bc24b0), TOBN(0xbc73d23a, 0xe2856d4f), TOBN(0x61cedd8c, 0x0832bcdf), TOBN(0x60953556, 0x99f241d7), TOBN(0xee4adbd7, 0x001a349d), TOBN(0x0b35bf6a, 0xaa89e491), TOBN(0x7f0076f4, 0x136f7546), TOBN(0xd19a18ba, 0x9264da3d), TOBN(0x6eb2d2cd, 0x62a7a28b), TOBN(0xcdba941f, 0x8761c971), TOBN(0x1550518b, 0xa3be4a5d), TOBN(0xd0e8e2f0, 0x57d0b70c), TOBN(0xeea8612e, 0xcd133ba3), TOBN(0x814670f0, 0x44416aec), TOBN(0x424db6c3, 0x30775061), TOBN(0xd96039d1, 0x16213fd1), TOBN(0xc61e7fa5, 0x18a3478f), TOBN(0xa805bdcc, 0xcb0c5021), TOBN(0xbdd6f3a8, 0x0cc616dd), TOBN(0x06009667, 0x5d97f7e2), TOBN(0x31db0fc1, 0xaf0bf4b6), TOBN(0x23680ed4, 0x5491627a), TOBN(0xb99a3c66, 0x7d741fb1), TOBN(0xe9bb5f55, 0x36b1ff92), TOBN(0x29738577, 0x512b388d), TOBN(0xdb8a2ce7, 0x50fcf263), TOBN(0x385346d4, 0x6c4f7b47), TOBN(0xbe86c5ef, 0x31631f9e), TOBN(0xbf91da21, 0x03a57a29), TOBN(0xc3b1f796, 0x7b23f821), TOBN(0x0f7d00d2, 0x770db354), TOBN(0x8ffc6c3b, 0xd8fe79da), TOBN(0xcc5e8c40, 0xd525c996), TOBN(0x4640991d, 0xcfff632a), TOBN(0x64d97e8c, 0x67112528), TOBN(0xc232d973, 0x02f1cd1e), TOBN(0xce87eacb, 0x1dd212a4), TOBN(0x6e4c8c73, 0xe69802f7), TOBN(0x12ef0290, 0x1fffddbd), TOBN(0x941ec74e, 0x1bcea6e2), TOBN(0xd0b54024, 0x3cb92cbb), TOBN(0x809fb9d4, 0x7e8f9d05), TOBN(0x3bf16159, 0xf2992aae), TOBN(0xad40f279, 0xf8a7a838), TOBN(0x11aea631, 0x05615660), TOBN(0xbf52e6f1, 0xa01f6fa1), TOBN(0xef046995, 0x3dc2aec9), TOBN(0x785dbec9, 0xd8080711), TOBN(0xe1aec60a, 0x9fdedf76), TOBN(0xece797b5, 0xfa21c126), TOBN(0xc66e898f, 0x05e52732), TOBN(0x39bb69c4, 0x08811fdb), TOBN(0x8bfe1ef8, 0x2fc7f082), TOBN(0xc8e7a393, 0x174f4138), TOBN(0xfba8ad1d, 0xd58d1f98), TOBN(0xbc21d0ce, 0xbfd2fd5b), TOBN(0x0b839a82, 0x6ee60d61), TOBN(0xaacf7658, 0xafd22253), TOBN(0xb526bed8, 0xaae396b3), TOBN(0xccc1bbc2, 0x38564464), TOBN(0x9e3ff947, 0x8c45bc73), TOBN(0xcde9bca3, 0x58188a78), TOBN(0x138b8ee0, 0xd73bf8f7), TOBN(0x5c7e234c, 0x4123c489), TOBN(0x66e69368, 0xfa643297), TOBN(0x0629eeee, 0x39a15fa3), TOBN(0x95fab881, 0xa9e2a927), TOBN(0xb2497007, 0xeafbb1e1), TOBN(0xd75c9ce6, 0xe75b7a93), TOBN(0x3558352d, 0xefb68d78), TOBN(0xa2f26699, 0x223f6396), TOBN(0xeb911ecf, 0xe469b17a), TOBN(0x62545779, 0xe72d3ec2), TOBN(0x8ea47de7, 0x82cb113f), TOBN(0xebe4b086, 0x4e1fa98d), TOBN(0xec2d5ed7, 0x8cdfedb1), TOBN(0xa535c077, 0xfe211a74), TOBN(0x9678109b, 0x11d244c5), TOBN(0xf17c8bfb, 0xbe299a76), TOBN(0xb651412e, 0xfb11fbc4), TOBN(0xea0b5482, 0x94ab3f65), TOBN(0xd8dffd95, 0x0cf78243), TOBN(0x2e719e57, 0xce0361d4), TOBN(0x9007f085, 0x304ddc5b), TOBN(0x095e8c6d, 0x4daba2ea), TOBN(0x5a33cdb4, 0x3f9d28a9), TOBN(0x85b95cd8, 0xe2283003), TOBN(0xbcd6c819, 0xb9744733), TOBN(0x29c5f538, 0xfc7f5783), TOBN(0x6c49b2fa, 0xd59038e4), TOBN(0x68349cc1, 0x3bbe1018), TOBN(0xcc490c1d, 0x21830ee5), TOBN(0x36f9c4ee, 0xe9bfa297), TOBN(0x58fd7294, 0x48de1a94), TOBN(0xaadb13a8, 0x4e8f2cdc), TOBN(0x515eaaa0, 0x81313dba), TOBN(0xc76bb468, 0xc2152dd8), TOBN(0x357f8d75, 0xa653dbf8), TOBN(0xe4d8c4d1, 0xb14ac143), TOBN(0xbdb8e675, 0xb055cb40), TOBN(0x898f8e7b, 0x977b5167), TOBN(0xecc65651, 0xb82fb863), TOBN(0x56544814, 0x6d88f01f), TOBN(0xb0928e95, 0x263a75a9), TOBN(0xcfb6836f, 0x1a22fcda), TOBN(0x651d14db, 0x3f3bd37c), TOBN(0x1d3837fb, 0xb6ad4664), TOBN(0x7c5fb538, 0xff4f94ab), TOBN(0x7243c712, 0x6d7fb8f2), TOBN(0xef13d60c, 0xa85c5287), TOBN(0x18cfb7c7, 0x4bb8dd1b), TOBN(0x82f9bfe6, 0x72908219), TOBN(0x35c4592b, 0x9d5144ab), TOBN(0x52734f37, 0x9cf4b42f), TOBN(0x6bac55e7, 0x8c60ddc4), TOBN(0xb5cd811e, 0x94dea0f6), TOBN(0x259ecae4, 0xe18cc1a3), TOBN(0x6a0e836e, 0x15e660f8), TOBN(0x6c639ea6, 0x0e02bff2), TOBN(0x8721b8cb, 0x7e1026fd), TOBN(0x9e73b50b, 0x63261942), TOBN(0xb8c70974, 0x77f01da3), TOBN(0x1839e6a6, 0x8268f57f), TOBN(0x571b9415, 0x5150b805), TOBN(0x1892389e, 0xf92c7097), TOBN(0x8d69c18e, 0x4a084b95), TOBN(0x7014c512, 0xbe5b495c), TOBN(0x4780db36, 0x1b07523c), TOBN(0x2f6219ce, 0x2c1c64fa), TOBN(0xc38b81b0, 0x602c105a), TOBN(0xab4f4f20, 0x5dc8e360), TOBN(0x20d3c982, 0xcf7d62d2), TOBN(0x1f36e29d, 0x23ba8150), TOBN(0x48ae0bf0, 0x92763f9e), TOBN(0x7a527e6b, 0x1d3a7007), TOBN(0xb4a89097, 0x581a85e3), TOBN(0x1f1a520f, 0xdc158be5), TOBN(0xf98db37d, 0x167d726e), TOBN(0x8802786e, 0x1113e862)}, {TOBN(0xefb2149e, 0x36f09ab0), TOBN(0x03f163ca, 0x4a10bb5b), TOBN(0xd0297045, 0x06e20998), TOBN(0x56f0af00, 0x1b5a3bab), TOBN(0x7af4cfec, 0x70880e0d), TOBN(0x7332a66f, 0xbe3d913f), TOBN(0x32e6c84a, 0x7eceb4bd), TOBN(0xedc4a79a, 0x9c228f55), TOBN(0xc37c7dd0, 0xc55c4496), TOBN(0xa6a96357, 0x25bbabd2), TOBN(0x5b7e63f2, 0xadd7f363), TOBN(0x9dce3782, 0x2e73f1df), TOBN(0xe1e5a16a, 0xb2b91f71), TOBN(0xe4489823, 0x5ba0163c), TOBN(0xf2759c32, 0xf6e515ad), TOBN(0xa5e2f1f8, 0x8615eecf), TOBN(0x74519be7, 0xabded551), TOBN(0x03d358b8, 0xc8b74410), TOBN(0x4d00b10b, 0x0e10d9a9), TOBN(0x6392b0b1, 0x28da52b7), TOBN(0x6744a298, 0x0b75c904), TOBN(0xc305b0ae, 0xa8f7f96c), TOBN(0x042e421d, 0x182cf932), TOBN(0xf6fc5d50, 0x9e4636ca), TOBN(0x795847c9, 0xd64cc78c), TOBN(0x6c50621b, 0x9b6cb27b), TOBN(0x07099bf8, 0xdf8022ab), TOBN(0x48f862eb, 0xc04eda1d), TOBN(0xd12732ed, 0xe1603c16), TOBN(0x19a80e0f, 0x5c9a9450), TOBN(0xe2257f54, 0xb429b4fc), TOBN(0x66d3b2c6, 0x45460515), TOBN(0x6ca4f87e, 0x822e37be), TOBN(0x73f237b4, 0x253bda4e), TOBN(0xf747f3a2, 0x41190aeb), TOBN(0xf06fa36f, 0x804cf284), TOBN(0x0a6bbb6e, 0xfc621c12), TOBN(0x5d624b64, 0x40b80ec6), TOBN(0x4b072425, 0x7ba556f3), TOBN(0x7fa0c354, 0x3e2d20a8), TOBN(0xe921fa31, 0xe3229d41), TOBN(0xa929c652, 0x94531bd4), TOBN(0x84156027, 0xa6d38209), TOBN(0xf3d69f73, 0x6bdb97bd), TOBN(0x8906d19a, 0x16833631), TOBN(0x68a34c2e, 0x03d51be3), TOBN(0xcb59583b, 0x0e511cd8), TOBN(0x99ce6bfd, 0xfdc132a8), TOBN(0x3facdaaa, 0xffcdb463), TOBN(0x658bbc1a, 0x34a38b08), TOBN(0x12a801f8, 0xf1a9078d), TOBN(0x1567bcf9, 0x6ab855de), TOBN(0xe08498e0, 0x3572359b), TOBN(0xcf0353e5, 0x8659e68b), TOBN(0xbb86e9c8, 0x7d23807c), TOBN(0xbc08728d, 0x2198e8a2), TOBN(0x8de2b7bc, 0x453cadd6), TOBN(0x203900a7, 0xbc0bc1f8), TOBN(0xbcd86e47, 0xa6abd3af), TOBN(0x911cac12, 0x8502effb), TOBN(0x2d550242, 0xec965469), TOBN(0x0e9f7692, 0x29e0017e), TOBN(0x633f078f, 0x65979885), TOBN(0xfb87d449, 0x4cf751ef), TOBN(0xe1790e4b, 0xfc25419a), TOBN(0x36467203, 0x4bff3cfd), TOBN(0xc8db6386, 0x25b6e83f), TOBN(0x6cc69f23, 0x6cad6fd2), TOBN(0x0219e45a, 0x6bc68bb9), TOBN(0xe43d79b6, 0x297f7334), TOBN(0x7d445368, 0x465dc97c), TOBN(0x4b9eea32, 0x2a0b949a), TOBN(0x1b96c6ba, 0x6102d021), TOBN(0xeaafac78, 0x2f4461ea), TOBN(0xd4b85c41, 0xc49f19a8), TOBN(0x275c28e4, 0xcf538875), TOBN(0x35451a9d, 0xdd2e54e0), TOBN(0x6991adb5, 0x0605618b), TOBN(0x5b8b4bcd, 0x7b36cd24), TOBN(0x372a4f8c, 0x56f37216), TOBN(0xc890bd73, 0xa6a5da60), TOBN(0x6f083da0, 0xdc4c9ff0), TOBN(0xf4e14d94, 0xf0536e57), TOBN(0xf9ee1eda, 0xaaec8243), TOBN(0x571241ec, 0x8bdcf8e7), TOBN(0xa5db8271, 0x0b041e26), TOBN(0x9a0b9a99, 0xe3fff040), TOBN(0xcaaf21dd, 0x7c271202), TOBN(0xb4e2b2e1, 0x4f0dd2e8), TOBN(0xe77e7c4f, 0x0a377ac7), TOBN(0x69202c3f, 0x0d7a2198), TOBN(0xf759b7ff, 0x28200eb8), TOBN(0xc87526ed, 0xdcfe314e), TOBN(0xeb84c524, 0x53d5cf99), TOBN(0xb1b52ace, 0x515138b6), TOBN(0x5aa7ff8c, 0x23fca3f4), TOBN(0xff0b13c3, 0xb9791a26), TOBN(0x960022da, 0xcdd58b16), TOBN(0xdbd55c92, 0x57aad2de), TOBN(0x3baaaaa3, 0xf30fe619), TOBN(0x9a4b2346, 0x0d881efd), TOBN(0x506416c0, 0x46325e2a), TOBN(0x91381e76, 0x035c18d4), TOBN(0xb3bb68be, 0xf27817b0), TOBN(0x15bfb8bf, 0x5116f937), TOBN(0x7c64a586, 0xc1268943), TOBN(0x71e25cc3, 0x8419a2c8), TOBN(0x9fd6b0c4, 0x8335f463), TOBN(0x4bf0ba3c, 0xe8ee0e0e), TOBN(0x6f6fba60, 0x298c21fa), TOBN(0x57d57b39, 0xae66bee0), TOBN(0x292d5130, 0x22672544), TOBN(0xf451105d, 0xbab093b3), TOBN(0x012f59b9, 0x02839986), TOBN(0x8a915802, 0x3474a89c), TOBN(0x048c919c, 0x2de03e97), TOBN(0xc476a2b5, 0x91071cd5), TOBN(0x791ed89a, 0x034970a5), TOBN(0x89bd9042, 0xe1b7994b), TOBN(0x8eaf5179, 0xa1057ffd), TOBN(0x6066e2a2, 0xd551ee10), TOBN(0x87a8f1d8, 0x727e09a6), TOBN(0x00d08bab, 0x2c01148d), TOBN(0x6da8e4f1, 0x424f33fe), TOBN(0x466d17f0, 0xcf9a4e71), TOBN(0xff502010, 0x3bf5cb19), TOBN(0xdccf97d8, 0xd062ecc0), TOBN(0x80c0d9af, 0x81d80ac4), TOBN(0xe87771d8, 0x033f2876), TOBN(0xb0186ec6, 0x7d5cc3db), TOBN(0x58e8bb80, 0x3bc9bc1d), TOBN(0x4d1395cc, 0x6f6ef60e), TOBN(0xa73c62d6, 0x186244a0), TOBN(0x918e5f23, 0x110a5b53), TOBN(0xed4878ca, 0x741b7eab), TOBN(0x3038d71a, 0xdbe03e51), TOBN(0x840204b7, 0xa93c3246), TOBN(0x21ab6069, 0xa0b9b4cd), TOBN(0xf5fa6e2b, 0xb1d64218), TOBN(0x1de6ad0e, 0xf3d56191), TOBN(0x570aaa88, 0xff1929c7), TOBN(0xc6df4c6b, 0x640e87b5), TOBN(0xde8a74f2, 0xc65f0ccc), TOBN(0x8b972fd5, 0xe6f6cc01), TOBN(0x3fff36b6, 0x0b846531), TOBN(0xba7e45e6, 0x10a5e475), TOBN(0x84a1d10e, 0x4145b6c5), TOBN(0xf1f7f91a, 0x5e046d9d), TOBN(0x0317a692, 0x44de90d7), TOBN(0x951a1d4a, 0xf199c15e), TOBN(0x91f78046, 0xc9d73deb), TOBN(0x74c82828, 0xfab8224f), TOBN(0xaa6778fc, 0xe7560b90), TOBN(0xb4073e61, 0xa7e824ce), TOBN(0xff0d693c, 0xd642eba8), TOBN(0x7ce2e57a, 0x5dccef38), TOBN(0x89c2c789, 0x1df1ad46), TOBN(0x83a06922, 0x098346fd), TOBN(0x2d715d72, 0xda2fc177), TOBN(0x7b6dd71d, 0x85b6cf1d), TOBN(0xc60a6d0a, 0x73fa9cb0), TOBN(0xedd3992e, 0x328bf5a9), TOBN(0xc380ddd0, 0x832c8c82), TOBN(0xd182d410, 0xa2a0bf50), TOBN(0x7d9d7438, 0xd9a528db), TOBN(0xe8b1a0e9, 0xcaf53994), TOBN(0xddd6e5fe, 0x0e19987c), TOBN(0xacb8df03, 0x190b059d), TOBN(0x53703a32, 0x8300129f), TOBN(0x1f637662, 0x68c43bfd), TOBN(0xbcbd1913, 0x00e54051), TOBN(0x812fcc62, 0x7bf5a8c5), TOBN(0x3f969d5f, 0x29fb85da), TOBN(0x72f4e00a, 0x694759e8), TOBN(0x426b6e52, 0x790726b7), TOBN(0x617bbc87, 0x3bdbb209), TOBN(0x511f8bb9, 0x97aee317), TOBN(0x812a4096, 0xe81536a8), TOBN(0x137dfe59, 0x3ac09b9b), TOBN(0x0682238f, 0xba8c9a7a), TOBN(0x7072ead6, 0xaeccb4bd), TOBN(0x6a34e9aa, 0x692ba633), TOBN(0xc82eaec2, 0x6fff9d33), TOBN(0xfb753512, 0x1d4d2b62), TOBN(0x1a0445ff, 0x1d7aadab), TOBN(0x65d38260, 0xd5f6a67c), TOBN(0x6e62fb08, 0x91cfb26f), TOBN(0xef1e0fa5, 0x5c7d91d6), TOBN(0x47e7c7ba, 0x33db72cd), TOBN(0x017cbc09, 0xfa7c74b2), TOBN(0x3c931590, 0xf50a503c), TOBN(0xcac54f60, 0x616baa42), TOBN(0x9b6cd380, 0xb2369f0f), TOBN(0x97d3a70d, 0x23c76151), TOBN(0x5f9dd6fc, 0x9862a9c6), TOBN(0x044c4ab2, 0x12312f51), TOBN(0x035ea0fd, 0x834a2ddc), TOBN(0x49e6b862, 0xcc7b826d), TOBN(0xb03d6883, 0x62fce490), TOBN(0x62f2497a, 0xb37e36e9), TOBN(0x04b005b6, 0xc6458293), TOBN(0x36bb5276, 0xe8d10af7), TOBN(0xacf2dc13, 0x8ee617b8), TOBN(0x470d2d35, 0xb004b3d4), TOBN(0x06790832, 0xfeeb1b77), TOBN(0x2bb75c39, 0x85657f9c), TOBN(0xd70bd4ed, 0xc0f60004), TOBN(0xfe797ecc, 0x219b018b), TOBN(0x9b5bec2a, 0x753aebcc), TOBN(0xdaf9f3dc, 0xc939eca5), TOBN(0xd6bc6833, 0xd095ad09), TOBN(0x98abdd51, 0xdaa4d2fc), TOBN(0xd9840a31, 0x8d168be5), TOBN(0xcf7c10e0, 0x2325a23c), TOBN(0xa5c02aa0, 0x7e6ecfaf), TOBN(0x2462e7e6, 0xb5bfdf18), TOBN(0xab2d8a8b, 0xa0cc3f12), TOBN(0x68dd485d, 0xbc672a29), TOBN(0x72039752, 0x596f2cd3), TOBN(0x5d3eea67, 0xa0cf3d8d), TOBN(0x810a1a81, 0xe6602671), TOBN(0x8f144a40, 0x14026c0c), TOBN(0xbc753a6d, 0x76b50f85), TOBN(0xc4dc21e8, 0x645cd4a4), TOBN(0xc5262dea, 0x521d0378), TOBN(0x802b8e0e, 0x05011c6f), TOBN(0x1ba19cbb, 0x0b4c19ea), TOBN(0x21db64b5, 0xebf0aaec), TOBN(0x1f394ee9, 0x70342f9d), TOBN(0x93a10aee, 0x1bc44a14), TOBN(0xa7eed31b, 0x3efd0baa), TOBN(0x6e7c824e, 0x1d154e65), TOBN(0xee23fa81, 0x9966e7ee), TOBN(0x64ec4aa8, 0x05b7920d), TOBN(0x2d44462d, 0x2d90aad4), TOBN(0xf44dd195, 0xdf277ad5), TOBN(0x8d6471f1, 0xbb46b6a1), TOBN(0x1e65d313, 0xfd885090), TOBN(0x33a800f5, 0x13a977b4), TOBN(0xaca9d721, 0x0797e1ef), TOBN(0x9a5a85a0, 0xfcff6a17), TOBN(0x9970a3f3, 0x1eca7cee), TOBN(0xbb9f0d6b, 0xc9504be3), TOBN(0xe0c504be, 0xadd24ee2), TOBN(0x7e09d956, 0x77fcc2f4), TOBN(0xef1a5227, 0x65bb5fc4), TOBN(0x145d4fb1, 0x8b9286aa), TOBN(0x66fd0c5d, 0x6649028b), TOBN(0x98857ceb, 0x1bf4581c), TOBN(0xe635e186, 0xaca7b166), TOBN(0x278ddd22, 0x659722ac), TOBN(0xa0903c4c, 0x1db68007), TOBN(0x366e4589, 0x48f21402), TOBN(0x31b49c14, 0xb96abda2), TOBN(0x329c4b09, 0xe0403190), TOBN(0x97197ca3, 0xd29f43fe), TOBN(0x8073dd1e, 0x274983d8), TOBN(0xda1a3bde, 0x55717c8f), TOBN(0xfd3d4da2, 0x0361f9d1), TOBN(0x1332d081, 0x4c7de1ce), TOBN(0x9b7ef7a3, 0xaa6d0e10), TOBN(0x17db2e73, 0xf54f1c4a), TOBN(0xaf3dffae, 0x4cd35567), TOBN(0xaaa2f406, 0xe56f4e71), TOBN(0x8966759e, 0x7ace3fc7), TOBN(0x9594eacf, 0x45a8d8c6), TOBN(0x8de3bd8b, 0x91834e0e), TOBN(0xafe4ca53, 0x548c0421), TOBN(0xfdd7e856, 0xe6ee81c6), TOBN(0x8f671beb, 0x6b891a3a), TOBN(0xf7a58f2b, 0xfae63829), TOBN(0x9ab186fb, 0x9c11ac9f), TOBN(0x8d6eb369, 0x10b5be76), TOBN(0x046b7739, 0xfb040bcd), TOBN(0xccb4529f, 0xcb73de88), TOBN(0x1df0fefc, 0xcf26be03), TOBN(0xad7757a6, 0xbcfcd027), TOBN(0xa8786c75, 0xbb3165ca), TOBN(0xe9db1e34, 0x7e99a4d9), TOBN(0x99ee86df, 0xb06c504b), TOBN(0x5b7c2ddd, 0xc15c9f0a), TOBN(0xdf87a734, 0x4295989e), TOBN(0x59ece47c, 0x03d08fda), TOBN(0xb074d3dd, 0xad5fc702), TOBN(0x20407903, 0x51a03776), TOBN(0x2bb1f77b, 0x2a608007), TOBN(0x25c58f4f, 0xe1153185), TOBN(0xe6df62f6, 0x766e6447), TOBN(0xefb3d1be, 0xed51275a), TOBN(0x5de47dc7, 0x2f0f483f), TOBN(0x7932d98e, 0x97c2bedf), TOBN(0xd5c11927, 0x0219f8a1), TOBN(0x9d751200, 0xa73a294e), TOBN(0x5f88434a, 0x9dc20172), TOBN(0xd28d9fd3, 0xa26f506a), TOBN(0xa890cd31, 0x9d1dcd48), TOBN(0x0aebaec1, 0x70f4d3b4), TOBN(0xfd1a1369, 0x0ffc8d00), TOBN(0xb9d9c240, 0x57d57838), TOBN(0x45929d26, 0x68bac361), TOBN(0x5a2cd060, 0x25b15ca6), TOBN(0x4b3c83e1, 0x6e474446), TOBN(0x1aac7578, 0xee1e5134), TOBN(0xa418f5d6, 0xc91e2f41), TOBN(0x6936fc8a, 0x213ed68b), TOBN(0x860ae7ed, 0x510a5224), TOBN(0x63660335, 0xdef09b53), TOBN(0x641b2897, 0xcd79c98d), TOBN(0x29bd38e1, 0x01110f35), TOBN(0x79c26f42, 0x648b1937), TOBN(0x64dae519, 0x9d9164f4), TOBN(0xd85a2310, 0x0265c273), TOBN(0x7173dd5d, 0x4b07e2b1), TOBN(0xd144c4cb, 0x8d9ea221), TOBN(0xe8b04ea4, 0x1105ab14), TOBN(0x92dda542, 0xfe80d8f1), TOBN(0xe9982fa8, 0xcf03dce6), TOBN(0x8b5ea965, 0x1a22cffc), TOBN(0xf7f4ea7f, 0x3fad88c4), TOBN(0x62db773e, 0x6a5ba95c), TOBN(0xd20f02fb, 0x93f24567), TOBN(0xfd46c69a, 0x315257ca), TOBN(0x0ac74cc7, 0x8bcab987), TOBN(0x46f31c01, 0x5ceca2f5), TOBN(0x40aedb59, 0x888b219e), TOBN(0xe50ecc37, 0xe1fccd02), TOBN(0x1bcd9dad, 0x911f816c), TOBN(0x583cc1ec, 0x8db9b00c), TOBN(0xf3cd2e66, 0xa483bf11), TOBN(0xfa08a6f5, 0xb1b2c169), TOBN(0xf375e245, 0x4be9fa28), TOBN(0x99a7ffec, 0x5b6d011f), TOBN(0x6a3ebddb, 0xc4ae62da), TOBN(0x6cea00ae, 0x374aef5d), TOBN(0xab5fb98d, 0x9d4d05bc), TOBN(0x7cba1423, 0xd560f252), TOBN(0x49b2cc21, 0x208490de), TOBN(0x1ca66ec3, 0xbcfb2879), TOBN(0x7f1166b7, 0x1b6fb16f), TOBN(0xfff63e08, 0x65fe5db3), TOBN(0xb8345abe, 0x8b2610be), TOBN(0xb732ed80, 0x39de3df4), TOBN(0x0e24ed50, 0x211c32b4), TOBN(0xd10d8a69, 0x848ff27d), TOBN(0xc1074398, 0xed4de248), TOBN(0xd7cedace, 0x10488927), TOBN(0xa4aa6bf8, 0x85673e13), TOBN(0xb46bae91, 0x6daf30af), TOBN(0x07088472, 0xfcef7ad8), TOBN(0x61151608, 0xd4b35e97), TOBN(0xbcfe8f26, 0xdde29986), TOBN(0xeb84c4c7, 0xd5a34c79), TOBN(0xc1eec55c, 0x164e1214), TOBN(0x891be86d, 0xa147bb03), TOBN(0x9fab4d10, 0x0ba96835), TOBN(0xbf01e9b8, 0xa5c1ae9f), TOBN(0x6b4de139, 0xb186ebc0), TOBN(0xd5c74c26, 0x85b91bca), TOBN(0x5086a99c, 0xc2d93854), TOBN(0xeed62a7b, 0xa7a9dfbc), TOBN(0x8778ed6f, 0x76b7618a), TOBN(0xbff750a5, 0x03b66062), TOBN(0x4cb7be22, 0xb65186db), TOBN(0x369dfbf0, 0xcc3a6d13), TOBN(0xc7dab26c, 0x7191a321), TOBN(0x9edac3f9, 0x40ed718e), TOBN(0xbc142b36, 0xd0cfd183), TOBN(0xc8af82f6, 0x7c991693), TOBN(0xb3d1e4d8, 0x97ce0b2a), TOBN(0xe6d7c87f, 0xc3a55cdf), TOBN(0x35846b95, 0x68b81afe), TOBN(0x018d12af, 0xd3c239d8), TOBN(0x2b2c6208, 0x01206e15), TOBN(0xe0e42453, 0xa3b882c6), TOBN(0x854470a3, 0xa50162d5), TOBN(0x08157478, 0x7017a62a), TOBN(0x18bd3fb4, 0x820357c7), TOBN(0x992039ae, 0x6f1458ad), TOBN(0x9a1df3c5, 0x25b44aa1), TOBN(0x2d780357, 0xed3d5281), TOBN(0x58cf7e4d, 0xc77ad4d4), TOBN(0xd49a7998, 0xf9df4fc4), TOBN(0x4465a8b5, 0x1d71205e), TOBN(0xa0ee0ea6, 0x649254aa), TOBN(0x4b5eeecf, 0xab7bd771), TOBN(0x6c873073, 0x35c262b9), TOBN(0xdc5bd648, 0x3c9d61e7), TOBN(0x233d6d54, 0x321460d2), TOBN(0xd20c5626, 0xfc195bcc), TOBN(0x25445958, 0x04d78b63), TOBN(0xe03fcb3d, 0x17ec8ef3), TOBN(0x54b690d1, 0x46b8f781), TOBN(0x82fa2c8a, 0x21230646), TOBN(0xf51aabb9, 0x084f418c), TOBN(0xff4fbec1, 0x1a30ba43), TOBN(0x6a5acf73, 0x743c9df7), TOBN(0x1da2b357, 0xd635b4d5), TOBN(0xc3de68dd, 0xecd5c1da), TOBN(0xa689080b, 0xd61af0dd), TOBN(0xdea5938a, 0xd665bf99), TOBN(0x0231d71a, 0xfe637294), TOBN(0x01968aa6, 0xa5a81cd8), TOBN(0x11252d50, 0x048e63b5), TOBN(0xc446bc52, 0x6ca007e9), TOBN(0xef8c50a6, 0x96d6134b), TOBN(0x9361fbf5, 0x9e09a05c), TOBN(0xf17f85a6, 0xdca3291a), TOBN(0xb178d548, 0xff251a21), TOBN(0x87f6374b, 0xa4df3915), TOBN(0x566ce1bf, 0x2fd5d608), TOBN(0x425cba4d, 0x7de35102), TOBN(0x6b745f8f, 0x58c5d5e2), TOBN(0x88402af6, 0x63122edf), TOBN(0x3190f9ed, 0x3b989a89), TOBN(0x4ad3d387, 0xebba3156), TOBN(0xef385ad9, 0xc7c469a5), TOBN(0xb08281de, 0x3f642c29), TOBN(0x20be0888, 0x910ffb88), TOBN(0xf353dd4a, 0xd5292546), TOBN(0x3f1627de, 0x8377a262), TOBN(0xa5faa013, 0xeefcd638), TOBN(0x8f3bf626, 0x74cc77c3), TOBN(0x32618f65, 0xa348f55e), TOBN(0x5787c0dc, 0x9fefeb9e), TOBN(0xf1673aa2, 0xd9a23e44), TOBN(0x88dfa993, 0x4e10690d), TOBN(0x1ced1b36, 0x2bf91108), TOBN(0x9193ceca, 0x3af48649), TOBN(0xfb34327d, 0x2d738fc5), TOBN(0x6697b037, 0x975fee6c), TOBN(0x2f485da0, 0xc04079a5), TOBN(0x2cdf5735, 0x2feaa1ac), TOBN(0x76944420, 0xbd55659e), TOBN(0x7973e32b, 0x4376090c), TOBN(0x86bb4fe1, 0x163b591a), TOBN(0x10441aed, 0xc196f0ca), TOBN(0x3b431f4a, 0x045ad915), TOBN(0x6c11b437, 0xa4afacb1), TOBN(0x30b0c7db, 0x71fdbbd8), TOBN(0xb642931f, 0xeda65acd), TOBN(0x4baae6e8, 0x9c92b235), TOBN(0xa73bbd0e, 0x6b3993a1), TOBN(0xd06d60ec, 0x693dd031), TOBN(0x03cab91b, 0x7156881c), TOBN(0xd615862f, 0x1db3574b), TOBN(0x485b0185, 0x64bb061a), TOBN(0x27434988, 0xa0181e06), TOBN(0x2cd61ad4, 0xc1c0c757), TOBN(0x3effed5a, 0x2ff9f403), TOBN(0x8dc98d8b, 0x62239029), TOBN(0x2206021e, 0x1f17b70d), TOBN(0xafbec0ca, 0xbf510015), TOBN(0x9fed7164, 0x80130dfa), TOBN(0x306dc2b5, 0x8a02dcf5), TOBN(0x48f06620, 0xfeb10fc0), TOBN(0x78d1e1d5, 0x5a57cf51), TOBN(0xadef8c5a, 0x192ef710), TOBN(0x88afbd4b, 0x3b7431f9), TOBN(0x7e1f7407, 0x64250c9e), TOBN(0x6e31318d, 0xb58bec07), TOBN(0xfd4fc4b8, 0x24f89b4e), TOBN(0x65a5dd88, 0x48c36a2a), TOBN(0x4f1eccff, 0xf024baa7), TOBN(0x22a21cf2, 0xcba94650), TOBN(0x95d29dee, 0x42a554f7), TOBN(0x828983a5, 0x002ec4ba), TOBN(0x8112a1f7, 0x8badb73d), TOBN(0x79ea8897, 0xa27c1839), TOBN(0x8969a5a7, 0xd065fd83), TOBN(0xf49af791, 0xb262a0bc), TOBN(0xfcdea8b6, 0xaf2b5127), TOBN(0x10e913e1, 0x564c2dbc), TOBN(0x51239d14, 0xbc21ef51), TOBN(0xe51c3ceb, 0x4ce57292), TOBN(0x795ff068, 0x47bbcc3b), TOBN(0x86b46e1e, 0xbd7e11e6), TOBN(0x0ea6ba23, 0x80041ef4), TOBN(0xd72fe505, 0x6262342e), TOBN(0x8abc6dfd, 0x31d294d4), TOBN(0xbbe017a2, 0x1278c2c9), TOBN(0xb1fcfa09, 0xb389328a), TOBN(0x322fbc62, 0xd01771b5), TOBN(0x04c0d063, 0x60b045bf), TOBN(0xdb652edc, 0x10e52d01), TOBN(0x50ef932c, 0x03ec6627), TOBN(0xde1b3b2d, 0xc1ee50e3), TOBN(0x5ab7bdc5, 0xdc37a90d), TOBN(0xfea67213, 0x31e33a96), TOBN(0x6482b5cb, 0x4f2999aa), TOBN(0x38476cc6, 0xb8cbf0dd), TOBN(0x93ebfacb, 0x173405bb), TOBN(0x15cdafe7, 0xe52369ec), TOBN(0xd42d5ba4, 0xd935b7db), TOBN(0x648b6004, 0x1c99a4cd), TOBN(0x785101bd, 0xa3b5545b), TOBN(0x4bf2c38a, 0x9dd67faf), TOBN(0xb1aadc63, 0x4442449c), TOBN(0xe0e9921a, 0x33ad4fb8), TOBN(0x5c552313, 0xaa686d82), TOBN(0xdee635fa, 0x465d866c), TOBN(0xbc3c224a, 0x18ee6e8a), TOBN(0xeed748a6, 0xed42e02f), TOBN(0xe70f930a, 0xd474cd08), TOBN(0x774ea6ec, 0xfff24adf), TOBN(0x03e2de1c, 0xf3480d4a), TOBN(0xf0d8edc7, 0xbc8acf1a), TOBN(0xf23e3303, 0x68295a9c), TOBN(0xfadd5f68, 0xc546a97d), TOBN(0x895597ad, 0x96f8acb1), TOBN(0xbddd49d5, 0x671bdae2), TOBN(0x16fcd528, 0x21dd43f4), TOBN(0xa5a45412, 0x6619141a)}, {TOBN(0x8ce9b6bf, 0xc360e25a), TOBN(0xe6425195, 0x075a1a78), TOBN(0x9dc756a8, 0x481732f4), TOBN(0x83c0440f, 0x5432b57a), TOBN(0xc670b3f1, 0xd720281f), TOBN(0x2205910e, 0xd135e051), TOBN(0xded14b0e, 0xdb052be7), TOBN(0x697b3d27, 0xc568ea39), TOBN(0x2e599b9a, 0xfb3ff9ed), TOBN(0x28c2e0ab, 0x17f6515c), TOBN(0x1cbee4fd, 0x474da449), TOBN(0x071279a4, 0x4f364452), TOBN(0x97abff66, 0x01fbe855), TOBN(0x3ee394e8, 0x5fda51c4), TOBN(0x190385f6, 0x67597c0b), TOBN(0x6e9fccc6, 0xa27ee34b), TOBN(0x0b89de93, 0x14092ebb), TOBN(0xf17256bd, 0x428e240c), TOBN(0xcf89a7f3, 0x93d2f064), TOBN(0x4f57841e, 0xe1ed3b14), TOBN(0x4ee14405, 0xe708d855), TOBN(0x856aae72, 0x03f1c3d0), TOBN(0xc8e5424f, 0xbdd7eed5), TOBN(0x3333e4ef, 0x73ab4270), TOBN(0x3bc77ade, 0xdda492f8), TOBN(0xc11a3aea, 0x78297205), TOBN(0x5e89a3e7, 0x34931b4c), TOBN(0x17512e2e, 0x9f5694bb), TOBN(0x5dc349f3, 0x177bf8b6), TOBN(0x232ea4ba, 0x08c7ff3e), TOBN(0x9c4f9d16, 0xf511145d), TOBN(0xccf109a3, 0x33b379c3), TOBN(0xe75e7a88, 0xa1f25897), TOBN(0x7ac6961f, 0xa1b5d4d8), TOBN(0xe3e10773, 0x08f3ed5c), TOBN(0x208a54ec, 0x0a892dfb), TOBN(0xbe826e19, 0x78660710), TOBN(0x0cf70a97, 0x237df2c8), TOBN(0x418a7340, 0xed704da5), TOBN(0xa3eeb9a9, 0x08ca33fd), TOBN(0x49d96233, 0x169bca96), TOBN(0x04d286d4, 0x2da6aafb), TOBN(0xc09606ec, 0xa0c2fa94), TOBN(0x8869d0d5, 0x23ff0fb3), TOBN(0xa99937e5, 0xd0150d65), TOBN(0xa92e2503, 0x240c14c9), TOBN(0x656bf945, 0x108e2d49), TOBN(0x152a733a, 0xa2f59e2b), TOBN(0xb4323d58, 0x8434a920), TOBN(0xc0af8e93, 0x622103c5), TOBN(0x667518ef, 0x938dbf9a), TOBN(0xa1843073, 0x83a9cdf2), TOBN(0x350a94aa, 0x5447ab80), TOBN(0xe5e5a325, 0xc75a3d61), TOBN(0x74ba507f, 0x68411a9e), TOBN(0x10581fc1, 0x594f70c5), TOBN(0x60e28570, 0x80eb24a9), TOBN(0x7bedfb4d, 0x488e0cfd), TOBN(0x721ebbd7, 0xc259cdb8), TOBN(0x0b0da855, 0xbc6390a9), TOBN(0x2b4d04db, 0xde314c70), TOBN(0xcdbf1fbc, 0x6c32e846), TOBN(0x33833eab, 0xb162fc9e), TOBN(0x9939b48b, 0xb0dd3ab7), TOBN(0x5aaa98a7, 0xcb0c9c8c), TOBN(0x75105f30, 0x81c4375c), TOBN(0xceee5057, 0x5ef1c90f), TOBN(0xb31e065f, 0xc23a17bf), TOBN(0x5364d275, 0xd4b6d45a), TOBN(0xd363f3ad, 0x62ec8996), TOBN(0xb5d21239, 0x4391c65b), TOBN(0x84564765, 0xebb41b47), TOBN(0x20d18ecc, 0x37107c78), TOBN(0xacff3b6b, 0x570c2a66), TOBN(0x22f975d9, 0x9bd0d845), TOBN(0xef0a0c46, 0xba178fa0), TOBN(0x1a419651, 0x76b6028e), TOBN(0xc49ec674, 0x248612d4), TOBN(0x5b6ac4f2, 0x7338af55), TOBN(0x06145e62, 0x7bee5a36), TOBN(0x33e95d07, 0xe75746b5), TOBN(0x1c1e1f6d, 0xc40c78be), TOBN(0x967833ef, 0x222ff8e2), TOBN(0x4bedcf6a, 0xb49180ad), TOBN(0x6b37e9c1, 0x3d7a4c8a), TOBN(0x2748887c, 0x6ddfe760), TOBN(0xf7055123, 0xaa3a5bbc), TOBN(0x954ff225, 0x7bbb8e74), TOBN(0xc42b8ab1, 0x97c3dfb9), TOBN(0x55a549b0, 0xcf168154), TOBN(0xad6748e7, 0xc1b50692), TOBN(0x2775780f, 0x6fc5cbcb), TOBN(0x4eab80b8, 0xe1c9d7c8), TOBN(0x8c69dae1, 0x3fdbcd56), TOBN(0x47e6b4fb, 0x9969eace), TOBN(0x002f1085, 0xa705cb5a), TOBN(0x4e23ca44, 0x6d3fea55), TOBN(0xb4ae9c86, 0xf4810568), TOBN(0x47bfb91b, 0x2a62f27d), TOBN(0x60deb4c9, 0xd9bac28c), TOBN(0xa892d894, 0x7de6c34c), TOBN(0x4ee68259, 0x4494587d), TOBN(0x914ee14e, 0x1a3f8a5b), TOBN(0xbb113eaa, 0x28700385), TOBN(0x81ca03b9, 0x2115b4c9), TOBN(0x7c163d38, 0x8908cad1), TOBN(0xc912a118, 0xaa18179a), TOBN(0xe09ed750, 0x886e3081), TOBN(0xa676e3fa, 0x26f516ca), TOBN(0x753cacf7, 0x8e732f91), TOBN(0x51592aea, 0x833da8b4), TOBN(0xc626f42f, 0x4cbea8aa), TOBN(0xef9dc899, 0xa7b56eaf), TOBN(0x00c0e52c, 0x34ef7316), TOBN(0x5b1e4e24, 0xfe818a86), TOBN(0x9d31e20d, 0xc538be47), TOBN(0x22eb932d, 0x3ed68974), TOBN(0xe44bbc08, 0x7c4e87c4), TOBN(0x4121086e, 0x0dde9aef), TOBN(0x8e6b9cff, 0x134f4345), TOBN(0x96892c1f, 0x711b0eb9), TOBN(0xb905f2c8, 0x780ab954), TOBN(0xace26309, 0xa20792db), TOBN(0xec8ac9b3, 0x0684e126), TOBN(0x486ad8b6, 0xb40a2447), TOBN(0x60121fc1, 0x9fe3fb24), TOBN(0x5626fccf, 0x1a8e3b3f), TOBN(0x4e568622, 0x6ad1f394), TOBN(0xda7aae0d, 0x196aa5a1), TOBN(0xe0df8c77, 0x1041b5fb), TOBN(0x451465d9, 0x26b318b7), TOBN(0xc29b6e55, 0x7ab136e9), TOBN(0x2c2ab48b, 0x71148463), TOBN(0xb5738de3, 0x64454a76), TOBN(0x54ccf9a0, 0x5a03abe4), TOBN(0x377c0296, 0x0427d58e), TOBN(0x73f5f0b9, 0x2bb39c1f), TOBN(0x14373f2c, 0xe608d8c5), TOBN(0xdcbfd314, 0x00fbb805), TOBN(0xdf18fb20, 0x83afdcfb), TOBN(0x81a57f42, 0x42b3523f), TOBN(0xe958532d, 0x87f650fb), TOBN(0xaa8dc8b6, 0x8b0a7d7c), TOBN(0x1b75dfb7, 0x150166be), TOBN(0x90e4f7c9, 0x2d7d1413), TOBN(0x67e2d6b5, 0x9834f597), TOBN(0x4fd4f4f9, 0xa808c3e8), TOBN(0xaf8237e0, 0xd5281ec1), TOBN(0x25ab5fdc, 0x84687cee), TOBN(0xc5ded6b1, 0xa5b26c09), TOBN(0x8e4a5aec, 0xc8ea7650), TOBN(0x23b73e5c, 0x14cc417f), TOBN(0x2bfb4318, 0x3037bf52), TOBN(0xb61e6db5, 0x78c725d7), TOBN(0x8efd4060, 0xbbb3e5d7), TOBN(0x2e014701, 0xdbac488e), TOBN(0xac75cf9a, 0x360aa449), TOBN(0xb70cfd05, 0x79634d08), TOBN(0xa591536d, 0xfffb15ef), TOBN(0xb2c37582, 0xd07c106c), TOBN(0xb4293fdc, 0xf50225f9), TOBN(0xc52e175c, 0xb0e12b03), TOBN(0xf649c3ba, 0xd0a8bf64), TOBN(0x745a8fef, 0xeb8ae3c6), TOBN(0x30d7e5a3, 0x58321bc3), TOBN(0xb1732be7, 0x0bc4df48), TOBN(0x1f217993, 0xe9ea5058), TOBN(0xf7a71cde, 0x3e4fd745), TOBN(0x86cc533e, 0x894c5bbb), TOBN(0x6915c7d9, 0x69d83082), TOBN(0xa6aa2d05, 0x5815c244), TOBN(0xaeeee592, 0x49b22ce5), TOBN(0x89e39d13, 0x78135486), TOBN(0x3a275c1f, 0x16b76f2f), TOBN(0xdb6bcc1b, 0xe036e8f5), TOBN(0x4df69b21, 0x5e4709f5), TOBN(0xa188b250, 0x2d0f39aa), TOBN(0x622118bb, 0x15a85947), TOBN(0x2ebf520f, 0xfde0f4fa), TOBN(0xa40e9f29, 0x4860e539), TOBN(0x7b6a51eb, 0x22b57f0f), TOBN(0x849a33b9, 0x7e80644a), TOBN(0x50e5d16f, 0x1cf095fe), TOBN(0xd754b54e, 0xec55f002), TOBN(0x5cfbbb22, 0x236f4a98), TOBN(0x0b0c59e9, 0x066800bb), TOBN(0x4ac69a8f, 0x5a9a7774), TOBN(0x2b33f804, 0xd6bec948), TOBN(0xb3729295, 0x32e6c466), TOBN(0x68956d0f, 0x4e599c73), TOBN(0xa47a249f, 0x155c31cc), TOBN(0x24d80f0d, 0xe1ce284e), TOBN(0xcd821dfb, 0x988baf01), TOBN(0xe6331a7d, 0xdbb16647), TOBN(0x1eb8ad33, 0x094cb960), TOBN(0x593cca38, 0xc91bbca5), TOBN(0x384aac8d, 0x26567456), TOBN(0x40fa0309, 0xc04b6490), TOBN(0x97834cd6, 0xdab6c8f6), TOBN(0x68a7318d, 0x3f91e55f), TOBN(0xa00fd04e, 0xfc4d3157), TOBN(0xb56f8ab2, 0x2bf3bdea), TOBN(0x014f5648, 0x4fa57172), TOBN(0x948c5860, 0x450abdb3), TOBN(0x342b5df0, 0x0ebd4f08), TOBN(0x3e5168cd, 0x0e82938e), TOBN(0x7aedc1ce, 0xb0df5dd0), TOBN(0x6bbbc6d9, 0xe5732516), TOBN(0xc7bfd486, 0x605daaa6), TOBN(0x46fd72b7, 0xbb9a6c9e), TOBN(0xe4847fb1, 0xa124fb89), TOBN(0x75959cbd, 0xa2d8ffbc), TOBN(0x42579f65, 0xc8a588ee), TOBN(0x368c92e6, 0xb80b499d), TOBN(0xea4ef6cd, 0x999a5df1), TOBN(0xaa73bb7f, 0x936fe604), TOBN(0xf347a70d, 0x6457d188), TOBN(0x86eda86b, 0x8b7a388b), TOBN(0xb7cdff06, 0x0ccd6013), TOBN(0xbeb1b6c7, 0xd0053fb2), TOBN(0x0b022387, 0x99240a9f), TOBN(0x1bbb384f, 0x776189b2), TOBN(0x8695e71e, 0x9066193a), TOBN(0x2eb50097, 0x06ffac7e), TOBN(0x0654a9c0, 0x4a7d2caa), TOBN(0x6f3fb3d1, 0xa5aaa290), TOBN(0x835db041, 0xff476e8f), TOBN(0x540b8b0b, 0xc42295e4), TOBN(0xa5c73ac9, 0x05e214f5), TOBN(0x9a74075a, 0x56a0b638), TOBN(0x2e4b1090, 0xce9e680b), TOBN(0x57a5b479, 0x6b8d9afa), TOBN(0x0dca48e7, 0x26bfe65c), TOBN(0x097e391c, 0x7290c307), TOBN(0x683c462e, 0x6669e72e), TOBN(0xf505be1e, 0x062559ac), TOBN(0x5fbe3ea1, 0xe3a3035a), TOBN(0x6431ebf6, 0x9cd50da8), TOBN(0xfd169d5c, 0x1f6407f2), TOBN(0x8d838a95, 0x60fce6b8), TOBN(0x2a2bfa7f, 0x650006f0), TOBN(0xdfd7dad3, 0x50c0fbb2), TOBN(0x92452495, 0xccf9ad96), TOBN(0x183bf494, 0xd95635f9), TOBN(0x02d5df43, 0x4a7bd989), TOBN(0x505385cc, 0xa5431095), TOBN(0xdd98e67d, 0xfd43f53e), TOBN(0xd61e1a6c, 0x500c34a9), TOBN(0x5a4b46c6, 0x4a8a3d62), TOBN(0x8469c4d0, 0x247743d2), TOBN(0x2bb3a13d, 0x88f7e433), TOBN(0x62b23a10, 0x01be5849), TOBN(0xe83596b4, 0xa63d1a4c), TOBN(0x454e7fea, 0x7d183f3e), TOBN(0x643fce61, 0x17afb01c), TOBN(0x4e65e5e6, 0x1c4c3638), TOBN(0x41d85ea1, 0xef74c45b), TOBN(0x2cfbfa66, 0xae328506), TOBN(0x98b078f5, 0x3ada7da9), TOBN(0xd985fe37, 0xec752fbb), TOBN(0xeece68fe, 0x5a0148b4), TOBN(0x6f9a55c7, 0x2d78136d), TOBN(0x232dccc4, 0xd2b729ce), TOBN(0xa27e0dfd, 0x90aafbc4), TOBN(0x96474452, 0x12b4603e), TOBN(0xa876c551, 0x6b706d14), TOBN(0xdf145fcf, 0x69a9d412), TOBN(0xe2ab75b7, 0x2d479c34), TOBN(0x12df9a76, 0x1a23ff97), TOBN(0xc6138992, 0x5d359d10), TOBN(0x6e51c7ae, 0xfa835f22), TOBN(0x69a79cb1, 0xc0fcc4d9), TOBN(0xf57f350d, 0x594cc7e1), TOBN(0x3079ca63, 0x3350ab79), TOBN(0x226fb614, 0x9aff594a), TOBN(0x35afec02, 0x6d59a62b), TOBN(0x9bee46f4, 0x06ed2c6e), TOBN(0x58da1735, 0x7d939a57), TOBN(0x44c50402, 0x8fd1797e), TOBN(0xd8853e7c, 0x5ccea6ca), TOBN(0x4065508d, 0xa35fcd5f), TOBN(0x8965df8c, 0x495ccaeb), TOBN(0x0f2da850, 0x12e1a962), TOBN(0xee471b94, 0xc1cf1cc4), TOBN(0xcef19bc8, 0x0a08fb75), TOBN(0x704958f5, 0x81de3591), TOBN(0x2867f8b2, 0x3aef4f88), TOBN(0x8d749384, 0xea9f9a5f), TOBN(0x1b385537, 0x8c9049f4), TOBN(0x5be948f3, 0x7b92d8b6), TOBN(0xd96f725d, 0xb6e2bd6b), TOBN(0x37a222bc, 0x958c454d), TOBN(0xe7c61abb, 0x8809bf61), TOBN(0x46f07fbc, 0x1346f18d), TOBN(0xfb567a7a, 0xe87c0d1c), TOBN(0x84a461c8, 0x7ef3d07a), TOBN(0x0a5adce6, 0xd9278d98), TOBN(0x24d94813, 0x9dfc73e1), TOBN(0x4f3528b6, 0x054321c3), TOBN(0x2e03fdde, 0x692ea706), TOBN(0x10e60619, 0x47b533c0), TOBN(0x1a8bc73f, 0x2ca3c055), TOBN(0xae58d4b2, 0x1bb62b8f), TOBN(0xb2045a73, 0x584a24e3), TOBN(0x3ab3d5af, 0xbd76e195), TOBN(0x478dd1ad, 0x6938a810), TOBN(0x6ffab393, 0x6ee3d5cb), TOBN(0xdfb693db, 0x22b361e4), TOBN(0xf9694496, 0x51dbf1a7), TOBN(0xcab4b4ef, 0x08a2e762), TOBN(0xe8c92f25, 0xd39bba9a), TOBN(0x850e61bc, 0xf1464d96), TOBN(0xb7e830e3, 0xdc09508b), TOBN(0xfaf6d2cf, 0x74317655), TOBN(0x72606ceb, 0xdf690355), TOBN(0x48bb92b3, 0xd0c3ded6), TOBN(0x65b75484, 0x5c7cf892), TOBN(0xf6cd7ac9, 0xd5d5f01f), TOBN(0xc2c30a59, 0x96401d69), TOBN(0x91268650, 0xed921878), TOBN(0x380bf913, 0xb78c558f), TOBN(0x43c0baeb, 0xc8afdaa9), TOBN(0x377f61d5, 0x54f169d3), TOBN(0xf8da07e3, 0xae5ff20b), TOBN(0xb676c49d, 0xa8a90ea8), TOBN(0x81c1ff2b, 0x83a29b21), TOBN(0x383297ac, 0x2ad8d276), TOBN(0x3001122f, 0xba89f982), TOBN(0xe1d794be, 0x6718e448), TOBN(0x246c1482, 0x7c3e6e13), TOBN(0x56646ef8, 0x5d26b5ef), TOBN(0x80f5091e, 0x88069cdd), TOBN(0xc5992e2f, 0x724bdd38), TOBN(0x02e915b4, 0x8471e8c7), TOBN(0x96ff320a, 0x0d0ff2a9), TOBN(0xbf886487, 0x4384d1a0), TOBN(0xbbe1e6a6, 0xc93f72d6), TOBN(0xd5f75d12, 0xcad800ea), TOBN(0xfa40a09f, 0xe7acf117), TOBN(0x32c8cdd5, 0x7581a355), TOBN(0x74221992, 0x7023c499), TOBN(0xa8afe5d7, 0x38ec3901), TOBN(0x5691afcb, 0xa90e83f0), TOBN(0x41bcaa03, 0x0b8f8eac), TOBN(0xe38b5ff9, 0x8d2668d5), TOBN(0x0715281a, 0x7ad81965), TOBN(0x1bc8fc7c, 0x03c6ce11), TOBN(0xcbbee6e2, 0x8b650436), TOBN(0x06b00fe8, 0x0cdb9808), TOBN(0x17d6e066, 0xfe3ed315), TOBN(0x2e9d38c6, 0x4d0b5018), TOBN(0xab8bfd56, 0x844dcaef), TOBN(0x42894a59, 0x513aed8b), TOBN(0xf77f3b6d, 0x314bd07a), TOBN(0xbbdecb8f, 0x8e42b582), TOBN(0xf10e2fa8, 0xd2390fe6), TOBN(0xefb95022, 0x62a2f201), TOBN(0x4d59ea50, 0x50ee32b0), TOBN(0xd87f7728, 0x6da789a8), TOBN(0xcf98a2cf, 0xf79492c4), TOBN(0xf9577239, 0x720943c2), TOBN(0xba044cf5, 0x3990b9d0), TOBN(0x5aa8e823, 0x95f2884a), TOBN(0x834de6ed, 0x0278a0af), TOBN(0xc8e1ee9a, 0x5f25bd12), TOBN(0x9259ceaa, 0x6f7ab271), TOBN(0x7e6d97a2, 0x77d00b76), TOBN(0x5c0c6eea, 0xa437832a), TOBN(0x5232c20f, 0x5606b81d), TOBN(0xabd7b375, 0x0d991ee5), TOBN(0x4d2bfe35, 0x8632d951), TOBN(0x78f85146, 0x98ed9364), TOBN(0x951873f0, 0xf30c3282), TOBN(0x0da8ac80, 0xa789230b), TOBN(0x3ac7789c, 0x5398967f), TOBN(0xa69b8f7f, 0xbdda0fb5), TOBN(0xe5db7717, 0x6add8545), TOBN(0x1b71cb66, 0x72c49b66), TOBN(0xd8560739, 0x68421d77), TOBN(0x03840fe8, 0x83e3afea), TOBN(0xb391dad5, 0x1ec69977), TOBN(0xae243fb9, 0x307f6726), TOBN(0xc88ac87b, 0xe8ca160c), TOBN(0x5174cced, 0x4ce355f4), TOBN(0x98a35966, 0xe58ba37d), TOBN(0xfdcc8da2, 0x7817335d), TOBN(0x5b752830, 0x83fbc7bf), TOBN(0x68e419d4, 0xd9c96984), TOBN(0x409a39f4, 0x02a40380), TOBN(0x88940faf, 0x1fe977bc), TOBN(0xc640a94b, 0x8f8edea6), TOBN(0x1e22cd17, 0xed11547d), TOBN(0xe28568ce, 0x59ffc3e2), TOBN(0x60aa1b55, 0xc1dee4e7), TOBN(0xc67497c8, 0x837cb363), TOBN(0x06fb438a, 0x105a2bf2), TOBN(0x30357ec4, 0x500d8e20), TOBN(0x1ad9095d, 0x0670db10), TOBN(0x7f589a05, 0xc73b7cfd), TOBN(0xf544607d, 0x880d6d28), TOBN(0x17ba93b1, 0xa20ef103), TOBN(0xad859130, 0x6ba6577b), TOBN(0x65c91cf6, 0x6fa214a0), TOBN(0xd7d49c6c, 0x27990da5), TOBN(0xecd9ec8d, 0x20bb569d), TOBN(0xbd4b2502, 0xeeffbc33), TOBN(0x2056ca5a, 0x6bed0467), TOBN(0x7916a1f7, 0x5b63728c), TOBN(0xd4f9497d, 0x53a4f566), TOBN(0x89734664, 0x97b56810), TOBN(0xf8e1da74, 0x0494a621), TOBN(0x82546a93, 0x8d011c68), TOBN(0x1f3acb19, 0xc61ac162), TOBN(0x52f8fa9c, 0xabad0d3e), TOBN(0x15356523, 0xb4b7ea43), TOBN(0x5a16ad61, 0xae608125), TOBN(0xb0bcb87f, 0x4faed184), TOBN(0x5f236b1d, 0x5029f45f), TOBN(0xd42c7607, 0x0bc6b1fc), TOBN(0xc644324e, 0x68aefce3), TOBN(0x8e191d59, 0x5c5d8446), TOBN(0xc0208077, 0x13ae1979), TOBN(0xadcaee55, 0x3ba59cc7), TOBN(0x20ed6d6b, 0xa2cb81ba), TOBN(0x0952ba19, 0xb6efcffc), TOBN(0x60f12d68, 0x97c0b87c), TOBN(0x4ee2c7c4, 0x9caa30bc), TOBN(0x767238b7, 0x97fbff4e), TOBN(0xebc73921, 0x501b5d92), TOBN(0x3279e3df, 0xc2a37737), TOBN(0x9fc12bc8, 0x6d197543), TOBN(0xfa94dc6f, 0x0a40db4e), TOBN(0x7392b41a, 0x530ccbbd), TOBN(0x87c82146, 0xea823525), TOBN(0xa52f984c, 0x05d98d0c), TOBN(0x2ae57d73, 0x5ef6974c), TOBN(0x9377f7bf, 0x3042a6dd), TOBN(0xb1a007c0, 0x19647a64), TOBN(0xfaa9079a, 0x0cca9767), TOBN(0x3d81a25b, 0xf68f72d5), TOBN(0x752067f8, 0xff81578e), TOBN(0x78622150, 0x9045447d), TOBN(0xc0c22fcf, 0x0505aa6f), TOBN(0x1030f0a6, 0x6bed1c77), TOBN(0x31f29f15, 0x1f0bd739), TOBN(0x2d7989c7, 0xe6debe85), TOBN(0x5c070e72, 0x8e677e98), TOBN(0x0a817bd3, 0x06e81fd5), TOBN(0xc110d830, 0xb0f2ac95), TOBN(0x48d0995a, 0xab20e64e), TOBN(0x0f3e00e1, 0x7729cd9a), TOBN(0x2a570c20, 0xdd556946), TOBN(0x912dbcfd, 0x4e86214d), TOBN(0x2d014ee2, 0xcf615498), TOBN(0x55e2b1e6, 0x3530d76e), TOBN(0xc5135ae4, 0xfd0fd6d1), TOBN(0x0066273a, 0xd4f3049f), TOBN(0xbb8e9893, 0xe7087477), TOBN(0x2dba1ddb, 0x14c6e5fd), TOBN(0xdba37886, 0x51f57e6c), TOBN(0x5aaee0a6, 0x5a72f2cf), TOBN(0x1208bfbf, 0x7bea5642), TOBN(0xf5c6aa3b, 0x67872c37), TOBN(0xd726e083, 0x43f93224), TOBN(0x1854daa5, 0x061f1658), TOBN(0xc0016df1, 0xdf0cd2b3), TOBN(0xc2a3f23e, 0x833d50de), TOBN(0x73b681d2, 0xbbbd3017), TOBN(0x2f046dc4, 0x3ac343c0), TOBN(0x9c847e7d, 0x85716421), TOBN(0xe1e13c91, 0x0917eed4), TOBN(0x3fc9eebd, 0x63a1b9c6), TOBN(0x0f816a72, 0x7fe02299), TOBN(0x6335ccc2, 0x294f3319), TOBN(0x3820179f, 0x4745c5be), TOBN(0xe647b782, 0x922f066e), TOBN(0xc22e49de, 0x02cafb8a), TOBN(0x299bc2ff, 0xfcc2eccc), TOBN(0x9a8feea2, 0x6e0e8282), TOBN(0xa627278b, 0xfe893205), TOBN(0xa7e19733, 0x7933e47b), TOBN(0xf4ff6b13, 0x2e766402), TOBN(0xa4d8be0a, 0x98440d9f), TOBN(0x658f5c2f, 0x38938808), TOBN(0x90b75677, 0xc95b3b3e), TOBN(0xfa044269, 0x3137b6ff), TOBN(0x077b039b, 0x43c47c29), TOBN(0xcca95dd3, 0x8a6445b2), TOBN(0x0b498ba4, 0x2333fc4c), TOBN(0x274f8e68, 0xf736a1b1), TOBN(0x6ca348fd, 0x5f1d4b2e), TOBN(0x24d3be78, 0xa8f10199), TOBN(0x8535f858, 0xca14f530), TOBN(0xa6e7f163, 0x5b982e51), TOBN(0x847c8512, 0x36e1bf62), TOBN(0xf6a7c58e, 0x03448418), TOBN(0x583f3703, 0xf9374ab6), TOBN(0x864f9195, 0x6e564145), TOBN(0x33bc3f48, 0x22526d50), TOBN(0x9f323c80, 0x1262a496), TOBN(0xaa97a7ae, 0x3f046a9a), TOBN(0x70da183e, 0xdf8a039a), TOBN(0x5b68f71c, 0x52aa0ba6), TOBN(0x9be0fe51, 0x21459c2d), TOBN(0xc1e17eb6, 0xcbc613e5), TOBN(0x33131d55, 0x497ea61c), TOBN(0x2f69d39e, 0xaf7eded5), TOBN(0x73c2f434, 0xde6af11b), TOBN(0x4ca52493, 0xa4a375fa), TOBN(0x5f06787c, 0xb833c5c2), TOBN(0x814e091f, 0x3e6e71cf), TOBN(0x76451f57, 0x8b746666)}, {TOBN(0x80f9bdef, 0x694db7e0), TOBN(0xedca8787, 0xb9fcddc6), TOBN(0x51981c34, 0x03b8dce1), TOBN(0x4274dcf1, 0x70e10ba1), TOBN(0xf72743b8, 0x6def6d1a), TOBN(0xd25b1670, 0xebdb1866), TOBN(0xc4491e8c, 0x050c6f58), TOBN(0x2be2b2ab, 0x87fbd7f5), TOBN(0x3e0e5c9d, 0xd111f8ec), TOBN(0xbcc33f8d, 0xb7c4e760), TOBN(0x702f9a91, 0xbd392a51), TOBN(0x7da4a795, 0xc132e92d), TOBN(0x1a0b0ae3, 0x0bb1151b), TOBN(0x54febac8, 0x02e32251), TOBN(0xea3a5082, 0x694e9e78), TOBN(0xe58ffec1, 0xe4fe40b8), TOBN(0xf85592fc, 0xd1e0cf9e), TOBN(0xdea75f0d, 0xc0e7b2e8), TOBN(0xc04215cf, 0xc135584e), TOBN(0x174fc727, 0x2f57092a), TOBN(0xe7277877, 0xeb930bea), TOBN(0x504caccb, 0x5eb02a5a), TOBN(0xf9fe08f7, 0xf5241b9b), TOBN(0xe7fb62f4, 0x8d5ca954), TOBN(0xfbb8349d, 0x29c4120b), TOBN(0x9f94391f, 0xc0d0d915), TOBN(0xc4074fa7, 0x5410ba51), TOBN(0xa66adbf6, 0x150a5911), TOBN(0xc164543c, 0x34bfca38), TOBN(0xe0f27560, 0xb9e1ccfc), TOBN(0x99da0f53, 0xe820219c), TOBN(0xe8234498, 0xc6b4997a), TOBN(0xcfb88b76, 0x9d4c5423), TOBN(0x9e56eb10, 0xb0521c49), TOBN(0x418e0b5e, 0xbe8700a1), TOBN(0x00cbaad6, 0xf93cb58a), TOBN(0xe923fbde, 0xd92a5e67), TOBN(0xca4979ac, 0x1f347f11), TOBN(0x89162d85, 0x6bc0585b), TOBN(0xdd6254af, 0xac3c70e3), TOBN(0x7b23c513, 0x516e19e4), TOBN(0x56e2e847, 0xc5c4d593), TOBN(0x9f727d73, 0x5ce71ef6), TOBN(0x5b6304a6, 0xf79a44c5), TOBN(0x6638a736, 0x3ab7e433), TOBN(0x1adea470, 0xfe742f83), TOBN(0xe054b854, 0x5b7fc19f), TOBN(0xf935381a, 0xba1d0698), TOBN(0x546eab2d, 0x799e9a74), TOBN(0x96239e0e, 0xa949f729), TOBN(0xca274c6b, 0x7090055a), TOBN(0x835142c3, 0x9020c9b0), TOBN(0xa405667a, 0xa2e8807f), TOBN(0x29f2c085, 0x1aa3d39e), TOBN(0xcc555d64, 0x42fc72f5), TOBN(0xe856e0e7, 0xfbeacb3c), TOBN(0xb5504f9d, 0x918e4936), TOBN(0x65035ef6, 0xb2513982), TOBN(0x0553a0c2, 0x6f4d9cb9), TOBN(0x6cb10d56, 0xbea85509), TOBN(0x48d957b7, 0xa242da11), TOBN(0x16a4d3dd, 0x672b7268), TOBN(0x3d7e637c, 0x8502a96b), TOBN(0x27c7032b, 0x730d463b), TOBN(0xbdc02b18, 0xe4136a14), TOBN(0xbacf969d, 0x678e32bf), TOBN(0xc98d89a3, 0xdd9c3c03), TOBN(0x7b92420a, 0x23becc4f), TOBN(0xd4b41f78, 0xc64d565c), TOBN(0x9f969d00, 0x10f28295), TOBN(0xec7f7f76, 0xb13d051a), TOBN(0x08945e1e, 0xa92da585), TOBN(0x55366b7d, 0x5846426f), TOBN(0xe7d09e89, 0x247d441d), TOBN(0x510b404d, 0x736fbf48), TOBN(0x7fa003d0, 0xe784bd7d), TOBN(0x25f7614f, 0x17fd9596), TOBN(0x49e0e0a1, 0x35cb98db), TOBN(0x2c65957b, 0x2e83a76a), TOBN(0x5d40da8d, 0xcddbe0f8), TOBN(0xf2b8c405, 0x050bad24), TOBN(0x8918426d, 0xc2aa4823), TOBN(0x2aeab3dd, 0xa38365a7), TOBN(0x72031717, 0x7c91b690), TOBN(0x8b00d699, 0x60a94120), TOBN(0x478a255d, 0xe99eaeec), TOBN(0xbf656a5f, 0x6f60aafd), TOBN(0xdfd7cb75, 0x5dee77b3), TOBN(0x37f68bb4, 0xa595939d), TOBN(0x03556479, 0x28740217), TOBN(0x8e740e7c, 0x84ad7612), TOBN(0xd89bc843, 0x9044695f), TOBN(0xf7f3da5d, 0x85a9184d), TOBN(0x562563bb, 0x9fc0b074), TOBN(0x06d2e6aa, 0xf88a888e), TOBN(0x612d8643, 0x161fbe7c), TOBN(0x465edba7, 0xf64085e7), TOBN(0xb230f304, 0x29aa8511), TOBN(0x53388426, 0xcda2d188), TOBN(0x90885735, 0x4b666649), TOBN(0x6f02ff9a, 0x652f54f6), TOBN(0x65c82294, 0x5fae2bf0), TOBN(0x7816ade0, 0x62f5eee3), TOBN(0xdcdbdf43, 0xfcc56d70), TOBN(0x9fb3bba3, 0x54530bb2), TOBN(0xbde3ef77, 0xcb0869ea), TOBN(0x89bc9046, 0x0b431163), TOBN(0x4d03d7d2, 0xe4819a35), TOBN(0x33ae4f9e, 0x43b6a782), TOBN(0x216db307, 0x9c88a686), TOBN(0x91dd88e0, 0x00ffedd9), TOBN(0xb280da9f, 0x12bd4840), TOBN(0x32a7cb8a, 0x1635e741), TOBN(0xfe14008a, 0x78be02a7), TOBN(0x3fafb334, 0x1b7ae030), TOBN(0x7fd508e7, 0x5add0ce9), TOBN(0x72c83219, 0xd607ad51), TOBN(0x0f229c0a, 0x8d40964a), TOBN(0x1be2c336, 0x1c878da2), TOBN(0xe0c96742, 0xeab2ab86), TOBN(0x458f8691, 0x3e538cd7), TOBN(0xa7001f6c, 0x8e08ad53), TOBN(0x52b8c6e6, 0xbf5d15ff), TOBN(0x548234a4, 0x011215dd), TOBN(0xff5a9d2d, 0x3d5b4045), TOBN(0xb0ffeeb6, 0x4a904190), TOBN(0x55a3aca4, 0x48607f8b), TOBN(0x8cbd665c, 0x30a0672a), TOBN(0x87f834e0, 0x42583068), TOBN(0x02da2aeb, 0xf3f6e683), TOBN(0x6b763e5d, 0x05c12248), TOBN(0x7230378f, 0x65a8aefc), TOBN(0x93bd80b5, 0x71e8e5ca), TOBN(0x53ab041c, 0xb3b62524), TOBN(0x1b860513, 0x6c9c552e), TOBN(0xe84d402c, 0xd5524e66), TOBN(0xa37f3573, 0xf37f5937), TOBN(0xeb0f6c7d, 0xd1e4fca5), TOBN(0x2965a554, 0xac8ab0fc), TOBN(0x17fbf56c, 0x274676ac), TOBN(0x2e2f6bd9, 0xacf7d720), TOBN(0x41fc8f88, 0x10224766), TOBN(0x517a14b3, 0x85d53bef), TOBN(0xdae327a5, 0x7d76a7d1), TOBN(0x6ad0a065, 0xc4818267), TOBN(0x33aa189b, 0x37c1bbc1), TOBN(0x64970b52, 0x27392a92), TOBN(0x21699a1c, 0x2d1535ea), TOBN(0xcd20779c, 0xc2d7a7fd), TOBN(0xe3186059, 0x99c83cf2), TOBN(0x9b69440b, 0x72c0b8c7), TOBN(0xa81497d7, 0x7b9e0e4d), TOBN(0x515d5c89, 0x1f5f82dc), TOBN(0x9a7f67d7, 0x6361079e), TOBN(0xa8da81e3, 0x11a35330), TOBN(0xe44990c4, 0x4b18be1b), TOBN(0xc7d5ed95, 0xaf103e59), TOBN(0xece8aba7, 0x8dac9261), TOBN(0xbe82b099, 0x9394b8d3), TOBN(0x6830f09a, 0x16adfe83), TOBN(0x250a29b4, 0x88172d01), TOBN(0x8b20bd65, 0xcaff9e02), TOBN(0xb8a7661e, 0xe8a6329a), TOBN(0x4520304d, 0xd3fce920), TOBN(0xae45da1f, 0x2b47f7ef), TOBN(0xe07f5288, 0x5bffc540), TOBN(0xf7997009, 0x3464f874), TOBN(0x2244c2cd, 0xa6fa1f38), TOBN(0x43c41ac1, 0x94d7d9b1), TOBN(0x5bafdd82, 0xc82e7f17), TOBN(0xdf0614c1, 0x5fda0fca), TOBN(0x74b043a7, 0xa8ae37ad), TOBN(0x3ba6afa1, 0x9e71734c), TOBN(0x15d5437e, 0x9c450f2e), TOBN(0x4a5883fe, 0x67e242b1), TOBN(0x5143bdc2, 0x2c1953c2), TOBN(0x542b8b53, 0xfc5e8920), TOBN(0x363bf9a8, 0x9a9cee08), TOBN(0x02375f10, 0xc3486e08), TOBN(0x2037543b, 0x8c5e70d2), TOBN(0x7109bccc, 0x625640b4), TOBN(0xcbc1051e, 0x8bc62c3b), TOBN(0xf8455fed, 0x803f26ea), TOBN(0x6badceab, 0xeb372424), TOBN(0xa2a9ce7c, 0x6b53f5f9), TOBN(0x64246595, 0x1b176d99), TOBN(0xb1298d36, 0xb95c081b), TOBN(0x53505bb8, 0x1d9a9ee6), TOBN(0x3f6f9e61, 0xf2ba70b0), TOBN(0xd07e16c9, 0x8afad453), TOBN(0x9f1694bb, 0xe7eb4a6a), TOBN(0xdfebced9, 0x3cb0bc8e), TOBN(0x92d3dcdc, 0x53868c8b), TOBN(0x174311a2, 0x386107a6), TOBN(0x4109e07c, 0x689b4e64), TOBN(0x30e4587f, 0x2df3dcb6), TOBN(0x841aea31, 0x0811b3b2), TOBN(0x6144d41d, 0x0cce43ea), TOBN(0x464c4581, 0x2a9a7803), TOBN(0xd03d371f, 0x3e158930), TOBN(0xc676d7f2, 0xb1f3390b), TOBN(0x9f7a1b8c, 0xa5b61272), TOBN(0x4ebebfc9, 0xc2e127a9), TOBN(0x4602500c, 0x5dd997bf), TOBN(0x7f09771c, 0x4711230f), TOBN(0x058eb37c, 0x020f09c1), TOBN(0xab693d4b, 0xfee5e38b), TOBN(0x9289eb1f, 0x4653cbc0), TOBN(0xbecf46ab, 0xd51b9cf5), TOBN(0xd2aa9c02, 0x9f0121af), TOBN(0x36aaf7d2, 0xe90dc274), TOBN(0x909e4ea0, 0x48b95a3c), TOBN(0xe6b70496, 0x6f32dbdb), TOBN(0x672188a0, 0x8b030b3e), TOBN(0xeeffe5b3, 0xcfb617e2), TOBN(0x87e947de, 0x7c82709e), TOBN(0xa44d2b39, 0x1770f5a7), TOBN(0xe4d4d791, 0x0e44eb82), TOBN(0x42e69d1e, 0x3f69712a), TOBN(0xbf11c4d6, 0xac6a820e), TOBN(0xb5e7f3e5, 0x42c4224c), TOBN(0xd6b4e81c, 0x449d941c), TOBN(0x5d72bd16, 0x5450e878), TOBN(0x6a61e28a, 0xee25ac54), TOBN(0x33272094, 0xe6f1cd95), TOBN(0x7512f30d, 0x0d18673f), TOBN(0x32f7a4ca, 0x5afc1464), TOBN(0x2f095656, 0x6bbb977b), TOBN(0x586f47ca, 0xa8226200), TOBN(0x02c868ad, 0x1ac07369), TOBN(0x4ef2b845, 0xc613acbe), TOBN(0x43d7563e, 0x0386054c), TOBN(0x54da9dc7, 0xab952578), TOBN(0xb5423df2, 0x26e84d0b), TOBN(0xa8b64eeb, 0x9b872042), TOBN(0xac205782, 0x5990f6df), TOBN(0x4ff696eb, 0x21f4c77a), TOBN(0x1a79c3e4, 0xaab273af), TOBN(0x29bc922e, 0x9436b3f1), TOBN(0xff807ef8, 0xd6d9a27a), TOBN(0x82acea3d, 0x778f22a0), TOBN(0xfb10b2e8, 0x5b5e7469), TOBN(0xc0b16980, 0x2818ee7d), TOBN(0x011afff4, 0xc91c1a2f), TOBN(0x95a6d126, 0xad124418), TOBN(0x31c081a5, 0xe72e295f), TOBN(0x36bb283a, 0xf2f4db75), TOBN(0xd115540f, 0x7acef462), TOBN(0xc7f3a8f8, 0x33f6746c), TOBN(0x21e46f65, 0xfea990ca), TOBN(0x915fd5c5, 0xcaddb0a9), TOBN(0xbd41f016, 0x78614555), TOBN(0x346f4434, 0x426ffb58), TOBN(0x80559436, 0x14dbc204), TOBN(0xf3dd20fe, 0x5a969b7f), TOBN(0x9d59e956, 0xe899a39a), TOBN(0xf1b0971c, 0x8ad4cf4b), TOBN(0x03448860, 0x2ffb8fb8), TOBN(0xf071ac3c, 0x65340ba4), TOBN(0x408d0596, 0xb27fd758), TOBN(0xe7c78ea4, 0x98c364b0), TOBN(0xa4aac4a5, 0x051e8ab5), TOBN(0xb9e1d560, 0x485d9002), TOBN(0x9acd518a, 0x88844455), TOBN(0xe4ca688f, 0xd06f56c0), TOBN(0xa48af70d, 0xdf027972), TOBN(0x691f0f04, 0x5e9a609d), TOBN(0xa9dd82cd, 0xee61270e), TOBN(0x8903ca63, 0xa0ef18d3), TOBN(0x9fb7ee35, 0x3d6ca3bd), TOBN(0xa7b4a09c, 0xabf47d03), TOBN(0x4cdada01, 0x1c67de8e), TOBN(0x52003749, 0x9355a244), TOBN(0xe77fd2b6, 0x4f2151a9), TOBN(0x695d6cf6, 0x66b4efcb), TOBN(0xc5a0cacf, 0xda2cfe25), TOBN(0x104efe5c, 0xef811865), TOBN(0xf52813e8, 0x9ea5cc3d), TOBN(0x855683dc, 0x40b58dbc), TOBN(0x0338ecde, 0x175fcb11), TOBN(0xf9a05637, 0x74921592), TOBN(0xb4f1261d, 0xb9bb9d31), TOBN(0x551429b7, 0x4e9c5459), TOBN(0xbe182e6f, 0x6ea71f53), TOBN(0xd3a3b07c, 0xdfc50573), TOBN(0x9ba1afda, 0x62be8d44), TOBN(0x9bcfd2cb, 0x52ab65d3), TOBN(0xdf11d547, 0xa9571802), TOBN(0x099403ee, 0x02a2404a), TOBN(0x497406f4, 0x21088a71), TOBN(0x99479409, 0x5004ae71), TOBN(0xbdb42078, 0xa812c362), TOBN(0x2b72a30f, 0xd8828442), TOBN(0x283add27, 0xfcb5ed1c), TOBN(0xf7c0e200, 0x66a40015), TOBN(0x3e3be641, 0x08b295ef), TOBN(0xac127dc1, 0xe038a675), TOBN(0x729deff3, 0x8c5c6320), TOBN(0xb7df8fd4, 0xa90d2c53), TOBN(0x9b74b0ec, 0x681e7cd3), TOBN(0x5cb5a623, 0xdab407e5), TOBN(0xcdbd3615, 0x76b340c6), TOBN(0xa184415a, 0x7d28392c), TOBN(0xc184c1d8, 0xe96f7830), TOBN(0xc3204f19, 0x81d3a80f), TOBN(0xfde0c841, 0xc8e02432), TOBN(0x78203b3e, 0x8149e0c1), TOBN(0x5904bdbb, 0x08053a73), TOBN(0x30fc1dd1, 0x101b6805), TOBN(0x43c223bc, 0x49aa6d49), TOBN(0x9ed67141, 0x7a174087), TOBN(0x311469a0, 0xd5997008), TOBN(0xb189b684, 0x5e43fc61), TOBN(0xf3282375, 0xe0d3ab57), TOBN(0x4fa34b67, 0xb1181da8), TOBN(0x621ed0b2, 0x99ee52b8), TOBN(0x9b178de1, 0xad990676), TOBN(0xd51de67b, 0x56d54065), TOBN(0x2a2c27c4, 0x7538c201), TOBN(0x33856ec8, 0x38a40f5c), TOBN(0x2522fc15, 0xbe6cdcde), TOBN(0x1e603f33, 0x9f0c6f89), TOBN(0x7994edc3, 0x103e30a6), TOBN(0x033a00db, 0x220c853e), TOBN(0xd3cfa409, 0xf7bb7fd7), TOBN(0x70f8781e, 0x462d18f6), TOBN(0xbbd82980, 0x687fe295), TOBN(0x6eef4c32, 0x595669f3), TOBN(0x86a9303b, 0x2f7e85c3), TOBN(0x5fce4621, 0x71988f9b), TOBN(0x5b935bf6, 0xc138acb5), TOBN(0x30ea7d67, 0x25661212), TOBN(0xef1eb5f4, 0xe51ab9a2), TOBN(0x0587c98a, 0xae067c78), TOBN(0xb3ce1b3c, 0x77ca9ca6), TOBN(0x2a553d4d, 0x54b5f057), TOBN(0xc7898236, 0x4da29ec2), TOBN(0xdbdd5d13, 0xb9c57316), TOBN(0xc57d6e6b, 0x2cd80d47), TOBN(0x80b460cf, 0xfe9e7391), TOBN(0x98648cab, 0xf963c31e), TOBN(0x67f9f633, 0xcc4d32fd), TOBN(0x0af42a9d, 0xfdf7c687), TOBN(0x55f292a3, 0x0b015ea7), TOBN(0x89e468b2, 0xcd21ab3d), TOBN(0xe504f022, 0xc393d392), TOBN(0xab21e1d4, 0xa5013af9), TOBN(0xe3283f78, 0xc2c28acb), TOBN(0xf38b35f6, 0x226bf99f), TOBN(0xe8354274, 0x0e291e69), TOBN(0x61673a15, 0xb20c162d), TOBN(0xc101dc75, 0xb04fbdbe), TOBN(0x8323b4c2, 0x255bd617), TOBN(0x6c969693, 0x6c2a9154), TOBN(0xc6e65860, 0x62679387), TOBN(0x8e01db0c, 0xb8c88e23), TOBN(0x33c42873, 0x893a5559), TOBN(0x7630f04b, 0x47a3e149), TOBN(0xb5d80805, 0xddcf35f8), TOBN(0x582ca080, 0x77dfe732), TOBN(0x2c7156e1, 0x0b1894a0), TOBN(0x92034001, 0xd81c68c0), TOBN(0xed225d00, 0xc8b115b5), TOBN(0x237f9c22, 0x83b907f2), TOBN(0x0ea2f32f, 0x4470e2c0), TOBN(0xb725f7c1, 0x58be4e95), TOBN(0x0f1dcafa, 0xb1ae5463), TOBN(0x59ed5187, 0x1ba2fc04), TOBN(0xf6e0f316, 0xd0115d4d), TOBN(0x5180b12f, 0xd3691599), TOBN(0x157e32c9, 0x527f0a41), TOBN(0x7b0b081d, 0xa8e0ecc0), TOBN(0x6dbaaa8a, 0xbf4f0dd0), TOBN(0x99b289c7, 0x4d252696), TOBN(0x79b7755e, 0xdbf864fe), TOBN(0x6974e2b1, 0x76cad3ab), TOBN(0x35dbbee2, 0x06ddd657), TOBN(0xe7cbdd11, 0x2ff3a96d), TOBN(0x88381968, 0x076be758), TOBN(0x2d737e72, 0x08c91f5d), TOBN(0x5f83ab62, 0x86ec3776), TOBN(0x98aa649d, 0x945fa7a1), TOBN(0xf477ec37, 0x72ef0933), TOBN(0x66f52b1e, 0x098c17b1), TOBN(0x9eec58fb, 0xd803738b), TOBN(0x91aaade7, 0xe4e86aa4), TOBN(0x6b1ae617, 0xa5b51492), TOBN(0x63272121, 0xbbc45974), TOBN(0x7e0e28f0, 0x862c5129), TOBN(0x0a8f79a9, 0x3321a4a0), TOBN(0xe26d1664, 0x5041c88f), TOBN(0x0571b805, 0x53233e3a), TOBN(0xd1b0ccde, 0xc9520711), TOBN(0x55a9e4ed, 0x3c8b84bf), TOBN(0x9426bd39, 0xa1fef314), TOBN(0x4f5f638e, 0x6eb93f2b), TOBN(0xba2a1ed3, 0x2bf9341b), TOBN(0xd63c1321, 0x4d42d5a9), TOBN(0xd2964a89, 0x316dc7c5), TOBN(0xd1759606, 0xca511851), TOBN(0xd8a9201f, 0xf9e6ed35), TOBN(0xb7b5ee45, 0x6736925a), TOBN(0x0a83fbbc, 0x99581af7), TOBN(0x3076bc40, 0x64eeb051), TOBN(0x5511c98c, 0x02dec312), TOBN(0x270de898, 0x238dcb78), TOBN(0x2cf4cf9c, 0x539c08c9), TOBN(0xa70cb65e, 0x38d3b06e), TOBN(0xb12ec10e, 0xcfe57bbd), TOBN(0x82c7b656, 0x35a0c2b5), TOBN(0xddc7d5cd, 0x161c67bd), TOBN(0xe32e8985, 0xae3a32cc), TOBN(0x7aba9444, 0xd11a5529), TOBN(0xe964ed02, 0x2427fa1a), TOBN(0x1528392d, 0x24a1770a), TOBN(0xa152ce2c, 0x12c72fcd), TOBN(0x714553a4, 0x8ec07649), TOBN(0x18b4c290, 0x459dd453), TOBN(0xea32b714, 0x7b64b110), TOBN(0xb871bfa5, 0x2e6f07a2), TOBN(0xb67112e5, 0x9e2e3c9b), TOBN(0xfbf250e5, 0x44aa90f6), TOBN(0xf77aedb8, 0xbd539006), TOBN(0x3b0cdf9a, 0xd172a66f), TOBN(0xedf69fea, 0xf8c51187), TOBN(0x05bb67ec, 0x741e4da7), TOBN(0x47df0f32, 0x08114345), TOBN(0x56facb07, 0xbb9792b1), TOBN(0xf3e007e9, 0x8f6229e4), TOBN(0x62d103f4, 0x526fba0f), TOBN(0x4f33bef7, 0xb0339d79), TOBN(0x9841357b, 0xb59bfec1), TOBN(0xfa8dbb59, 0xc34e6705), TOBN(0xc3c7180b, 0x7fdaa84c), TOBN(0xf95872fc, 0xa4108537), TOBN(0x8750cc3b, 0x932a3e5a), TOBN(0xb61cc69d, 0xb7275d7d), TOBN(0xffa0168b, 0x2e59b2e9), TOBN(0xca032abc, 0x6ecbb493), TOBN(0x1d86dbd3, 0x2c9082d8), TOBN(0xae1e0b67, 0xe28ef5ba), TOBN(0x2c9a4699, 0xcb18e169), TOBN(0x0ecd0e33, 0x1e6bbd20), TOBN(0x571b360e, 0xaf5e81d2), TOBN(0xcd9fea58, 0x101c1d45), TOBN(0x6651788e, 0x18880452), TOBN(0xa9972635, 0x1f8dd446), TOBN(0x44bed022, 0xe37281d0), TOBN(0x094b2b2d, 0x33da525d), TOBN(0xf193678e, 0x13144fd8), TOBN(0xb8ab5ba4, 0xf4c1061d), TOBN(0x4343b5fa, 0xdccbe0f4), TOBN(0xa8702371, 0x63812713), TOBN(0x47bf6d2d, 0xf7611d93), TOBN(0x46729b8c, 0xbd21e1d7), TOBN(0x7484d4e0, 0xd629e77d), TOBN(0x830e6eea, 0x60dbac1f), TOBN(0x23d8c484, 0xda06a2f7), TOBN(0x896714b0, 0x50ca535b), TOBN(0xdc8d3644, 0xebd97a9b), TOBN(0x106ef9fa, 0xb12177b4), TOBN(0xf79bf464, 0x534d5d9c), TOBN(0x2537a349, 0xa6ab360b), TOBN(0xc7c54253, 0xa00c744f), TOBN(0xb3c7a047, 0xe5911a76), TOBN(0x61ffa5c8, 0x647f1ee7), TOBN(0x15aed36f, 0x8f56ab42), TOBN(0x6a0d41b0, 0xa3ff9ac9), TOBN(0x68f469f5, 0xcc30d357), TOBN(0xbe9adf81, 0x6b72be96), TOBN(0x1cd926fe, 0x903ad461), TOBN(0x7e89e38f, 0xcaca441b), TOBN(0xf0f82de5, 0xfacf69d4), TOBN(0x363b7e76, 0x4775344c), TOBN(0x6894f312, 0xb2e36d04), TOBN(0x3c6cb4fe, 0x11d1c9a5), TOBN(0x85d9c339, 0x4008e1f2), TOBN(0x5e9a85ea, 0x249f326c), TOBN(0xdc35c60a, 0x678c5e06), TOBN(0xc08b944f, 0x9f86fba9), TOBN(0xde40c02c, 0x89f71f0f), TOBN(0xad8f3e31, 0xff3da3c0), TOBN(0x3ea5096b, 0x42125ded), TOBN(0x13879cbf, 0xa7379183), TOBN(0x6f4714a5, 0x6b306a0b), TOBN(0x359c2ea6, 0x67646c5e), TOBN(0xfacf8943, 0x07726368), TOBN(0x07a58935, 0x65ff431e), TOBN(0x24d661d1, 0x68754ab0), TOBN(0x801fce1d, 0x6f429a76), TOBN(0xc068a85f, 0xa58ce769), TOBN(0xedc35c54, 0x5d5eca2b), TOBN(0xea31276f, 0xa3f660d1), TOBN(0xa0184ebe, 0xb8fc7167), TOBN(0x0f20f21a, 0x1d8db0ae), TOBN(0xd96d095f, 0x56c35e12), TOBN(0xedf402b5, 0xf8c2a25b), TOBN(0x1bb772b9, 0x059204b6), TOBN(0x50cbeae2, 0x19b4e34c), TOBN(0x93109d80, 0x3fa0845a), TOBN(0x54f7ccf7, 0x8ef59fb5), TOBN(0x3b438fe2, 0x88070963), TOBN(0x9e28c659, 0x31f3ba9b), TOBN(0x9cc31b46, 0xead9da92), TOBN(0x3c2f0ba9, 0xb733aa5f), TOBN(0xdece47cb, 0xf05af235), TOBN(0xf8e3f715, 0xa2ac82a5), TOBN(0xc97ba641, 0x2203f18a), TOBN(0xc3af5504, 0x09c11060), TOBN(0x56ea2c05, 0x46af512d), TOBN(0xfac28daf, 0xf3f28146), TOBN(0x87fab43a, 0x959ef494)}, {TOBN(0x09891641, 0xd4c5105f), TOBN(0x1ae80f8e, 0x6d7fbd65), TOBN(0x9d67225f, 0xbee6bdb0), TOBN(0x3b433b59, 0x7fc4d860), TOBN(0x44e66db6, 0x93e85638), TOBN(0xf7b59252, 0xe3e9862f), TOBN(0xdb785157, 0x665c32ec), TOBN(0x702fefd7, 0xae362f50), TOBN(0x3754475d, 0x0fefb0c3), TOBN(0xd48fb56b, 0x46d7c35d), TOBN(0xa070b633, 0x363798a4), TOBN(0xae89f3d2, 0x8fdb98e6), TOBN(0x970b89c8, 0x6363d14c), TOBN(0x89817521, 0x67abd27d), TOBN(0x9bf7d474, 0x44d5a021), TOBN(0xb3083baf, 0xcac72aee), TOBN(0x389741de, 0xbe949a44), TOBN(0x638e9388, 0x546a4fa5), TOBN(0x3fe6419c, 0xa0047bdc), TOBN(0x7047f648, 0xaaea57ca), TOBN(0x54e48a90, 0x41fbab17), TOBN(0xda8e0b28, 0x576bdba2), TOBN(0xe807eebc, 0xc72afddc), TOBN(0x07d3336d, 0xf42577bf), TOBN(0x62a8c244, 0xbfe20925), TOBN(0x91c19ac3, 0x8fdce867), TOBN(0x5a96a5d5, 0xdd387063), TOBN(0x61d587d4, 0x21d324f6), TOBN(0xe87673a2, 0xa37173ea), TOBN(0x23848008, 0x53778b65), TOBN(0x10f8441e, 0x05bab43e), TOBN(0xfa11fe12, 0x4621efbe), TOBN(0x047b772e, 0x81685d7b), TOBN(0x23f27d81, 0xbf34a976), TOBN(0xc27608e2, 0x915f48ef), TOBN(0x3b0b43fa, 0xa521d5c3), TOBN(0x7613fb26, 0x63ca7284), TOBN(0x7f5729b4, 0x1d4db837), TOBN(0x87b14898, 0x583b526b), TOBN(0x00b732a6, 0xbbadd3d1), TOBN(0x8e02f426, 0x2048e396), TOBN(0x436b50b6, 0x383d9de4), TOBN(0xf78d3481, 0x471e85ad), TOBN(0x8b01ea6a, 0xd005c8d6), TOBN(0xd3c7afee, 0x97015c07), TOBN(0x46cdf1a9, 0x4e3ba2ae), TOBN(0x7a42e501, 0x83d3a1d2), TOBN(0xd54b5268, 0xb541dff4), TOBN(0x3f24cf30, 0x4e23e9bc), TOBN(0x4387f816, 0x126e3624), TOBN(0x26a46a03, 0x3b0b6d61), TOBN(0xaf1bc845, 0x8b2d777c), TOBN(0x25c401ba, 0x527de79c), TOBN(0x0e1346d4, 0x4261bbb6), TOBN(0x4b96c44b, 0x287b4bc7), TOBN(0x658493c7, 0x5254562f), TOBN(0x23f949fe, 0xb8a24a20), TOBN(0x17ebfed1, 0xf52ca53f), TOBN(0x9b691bbe, 0xbcfb4853), TOBN(0x5617ff6b, 0x6278a05d), TOBN(0x241b34c5, 0xe3c99ebd), TOBN(0xfc64242e, 0x1784156a), TOBN(0x4206482f, 0x695d67df), TOBN(0xb967ce0e, 0xee27c011), TOBN(0x65db3751, 0x21c80b5d), TOBN(0x2e7a563c, 0xa31ecca0), TOBN(0xe56ffc4e, 0x5238a07e), TOBN(0x3d6c2966, 0x32ced854), TOBN(0xe99d7d1a, 0xaf70b885), TOBN(0xafc3bad9, 0x2d686459), TOBN(0x9c78bf46, 0x0cc8ba5b), TOBN(0x5a439519, 0x18955aa3), TOBN(0xf8b517a8, 0x5fe4e314), TOBN(0xe60234d0, 0xfcb8906f), TOBN(0xffe542ac, 0xf2061b23), TOBN(0x287e191f, 0x6b4cb59c), TOBN(0x21857ddc, 0x09d877d8), TOBN(0x1c23478c, 0x14678941), TOBN(0xbbf0c056, 0xb6e05ea4), TOBN(0x82da4b53, 0xb01594fe), TOBN(0xf7526791, 0xfadb8608), TOBN(0x049e832d, 0x7b74cdf6), TOBN(0xa43581cc, 0xc2b90a34), TOBN(0x73639eb8, 0x9360b10c), TOBN(0x4fba331f, 0xe1e4a71b), TOBN(0x6ffd6b93, 0x8072f919), TOBN(0x6e53271c, 0x65679032), TOBN(0x67206444, 0xf14272ce), TOBN(0xc0f734a3, 0xb2335834), TOBN(0x9526205a, 0x90ef6860), TOBN(0xcb8be717, 0x04e2bb0d), TOBN(0x2418871e, 0x02f383fa), TOBN(0xd7177681, 0x4082c157), TOBN(0xcc914ad0, 0x29c20073), TOBN(0xf186c1eb, 0xe587e728), TOBN(0x6fdb3c22, 0x61bcd5fd), TOBN(0x30d014a6, 0xf2f9f8e9), TOBN(0x963ece23, 0x4fec49d2), TOBN(0x862025c5, 0x9605a8d9), TOBN(0x39874445, 0x19f8929a), TOBN(0x01b6ff65, 0x12bf476a), TOBN(0x598a64d8, 0x09cf7d91), TOBN(0xd7ec7749, 0x93be56ca), TOBN(0x10899785, 0xcbb33615), TOBN(0xb8a092fd, 0x02eee3ad), TOBN(0xa86b3d35, 0x30145270), TOBN(0x323d98c6, 0x8512b675), TOBN(0x4b8bc785, 0x62ebb40f), TOBN(0x7d301f54, 0x413f9cde), TOBN(0xa5e4fb4f, 0x2bab5664), TOBN(0x1d2b252d, 0x1cbfec23), TOBN(0xfcd576bb, 0xe177120d), TOBN(0x04427d3e, 0x83731a34), TOBN(0x2bb9028e, 0xed836e8e), TOBN(0xb36acff8, 0xb612ca7c), TOBN(0xb88fe5ef, 0xd3d9c73a), TOBN(0xbe2a6bc6, 0xedea4eb3), TOBN(0x43b93133, 0x488eec77), TOBN(0xf41ff566, 0xb17106e1), TOBN(0x469e9172, 0x654efa32), TOBN(0xb4480f04, 0x41c23fa3), TOBN(0xb4712eb0, 0xc1989a2e), TOBN(0x3ccbba0f, 0x93a29ca7), TOBN(0x6e205c14, 0xd619428c), TOBN(0x90db7957, 0xb3641686), TOBN(0x0432691d, 0x45ac8b4e), TOBN(0x07a759ac, 0xf64e0350), TOBN(0x0514d89c, 0x9c972517), TOBN(0x1701147f, 0xa8e67fc3), TOBN(0x9e2e0b8b, 0xab2085be), TOBN(0xd5651824, 0xac284e57), TOBN(0x890d4325, 0x74893664), TOBN(0x8a7c5e6e, 0xc55e68a3), TOBN(0xbf12e90b, 0x4339c85a), TOBN(0x31846b85, 0xf922b655), TOBN(0x9a54ce4d, 0x0bf4d700), TOBN(0xd7f4e83a, 0xf1a14295), TOBN(0x916f955c, 0xb285d4f9), TOBN(0xe57bb0e0, 0x99ffdaba), TOBN(0x28a43034, 0xeab0d152), TOBN(0x0a36ffa2, 0xb8a9cef8), TOBN(0x5517407e, 0xb9ec051a), TOBN(0x9c796096, 0xea68e672), TOBN(0x853db5fb, 0xfb3c77fb), TOBN(0x21474ba9, 0xe864a51a), TOBN(0x6c267699, 0x6e8a1b8b), TOBN(0x7c823626, 0x94120a28), TOBN(0xe61e9a48, 0x8383a5db), TOBN(0x7dd75003, 0x9f84216d), TOBN(0xab020d07, 0xad43cd85), TOBN(0x9437ae48, 0xda12c659), TOBN(0x6449c2eb, 0xe65452ad), TOBN(0xcc7c4c1c, 0x2cf9d7c1), TOBN(0x1320886a, 0xee95e5ab), TOBN(0xbb7b9056, 0xbeae170c), TOBN(0xc8a5b250, 0xdbc0d662), TOBN(0x4ed81432, 0xc11d2303), TOBN(0x7da66912, 0x1f03769f), TOBN(0x3ac7a5fd, 0x84539828), TOBN(0x14dada94, 0x3bccdd02), TOBN(0x8b84c321, 0x7ef6b0d1), TOBN(0x52a9477a, 0x7c933f22), TOBN(0x5ef6728a, 0xfd440b82), TOBN(0x5c3bd859, 0x6ce4bd5e), TOBN(0x918b80f5, 0xf22c2d3e), TOBN(0x368d5040, 0xb7bb6cc5), TOBN(0xb66142a1, 0x2695a11c), TOBN(0x60ac583a, 0xeb19ea70), TOBN(0x317cbb98, 0x0eab2437), TOBN(0x8cc08c55, 0x5e2654c8), TOBN(0xfe2d6520, 0xe6d8307f), TOBN(0xe9f147f3, 0x57428993), TOBN(0x5f9c7d14, 0xd2fd6cf1), TOBN(0xa3ecd064, 0x2d4fcbb0), TOBN(0xad83fef0, 0x8e7341f7), TOBN(0x643f23a0, 0x3a63115c), TOBN(0xd38a78ab, 0xe65ab743), TOBN(0xbf7c75b1, 0x35edc89c), TOBN(0x3dd8752e, 0x530df568), TOBN(0xf85c4a76, 0xe308c682), TOBN(0x4c9955b2, 0xe68acf37), TOBN(0xa544df3d, 0xab32af85), TOBN(0x4b8ec3f5, 0xa25cf493), TOBN(0x4d8f2764, 0x1a622feb), TOBN(0x7bb4f7aa, 0xf0dcbc49), TOBN(0x7de551f9, 0x70bbb45b), TOBN(0xcfd0f3e4, 0x9f2ca2e5), TOBN(0xece58709, 0x1f5c76ef), TOBN(0x32920edd, 0x167d79ae), TOBN(0x039df8a2, 0xfa7d7ec1), TOBN(0xf46206c0, 0xbb30af91), TOBN(0x1ff5e2f5, 0x22676b59), TOBN(0x11f4a039, 0x6ea51d66), TOBN(0x506c1445, 0x807d7a26), TOBN(0x60da5705, 0x755a9b24), TOBN(0x8fc8cc32, 0x1f1a319e), TOBN(0x83642d4d, 0x9433d67d), TOBN(0x7fa5cb8f, 0x6a7dd296), TOBN(0x576591db, 0x9b7bde07), TOBN(0x13173d25, 0x419716fb), TOBN(0xea30599d, 0xd5b340ff), TOBN(0xfc6b5297, 0xb0fe76c5), TOBN(0x1c6968c8, 0xab8f5adc), TOBN(0xf723c7f5, 0x901c928d), TOBN(0x4203c321, 0x9773d402), TOBN(0xdf7c6aa3, 0x1b51dd47), TOBN(0x3d49e37a, 0x552be23c), TOBN(0x57febee8, 0x0b5a6e87), TOBN(0xc5ecbee4, 0x7bd8e739), TOBN(0x79d44994, 0xae63bf75), TOBN(0x168bd00f, 0x38fb8923), TOBN(0x75d48ee4, 0xd0533130), TOBN(0x554f77aa, 0xdb5cdf33), TOBN(0x3396e896, 0x3c696769), TOBN(0x2fdddbf2, 0xd3fd674e), TOBN(0xbbb8f6ee, 0x99d0e3e5), TOBN(0x51b90651, 0xcbae2f70), TOBN(0xefc4bc05, 0x93aaa8eb), TOBN(0x8ecd8689, 0xdd1df499), TOBN(0x1aee99a8, 0x22f367a5), TOBN(0x95d485b9, 0xae8274c5), TOBN(0x6c14d445, 0x7d30b39c), TOBN(0xbafea90b, 0xbcc1ef81), TOBN(0x7c5f317a, 0xa459a2ed), TOBN(0x01211075, 0x4ef44227), TOBN(0xa17bed6e, 0xdc20f496), TOBN(0x0cdfe424, 0x819853cd), TOBN(0x13793298, 0xf71e2ce7), TOBN(0x3c1f3078, 0xdbbe307b), TOBN(0x6dd1c20e, 0x76ee9936), TOBN(0x23ee4b57, 0x423caa20), TOBN(0x4ac3793b, 0x8efb840e), TOBN(0x934438eb, 0xed1f8ca0), TOBN(0x3e546658, 0x4ebb25a2), TOBN(0xc415af0e, 0xc069896f), TOBN(0xc13eddb0, 0x9a5aa43d), TOBN(0x7a04204f, 0xd49eb8f6), TOBN(0xd0d5bdfc, 0xd74f1670), TOBN(0x3697e286, 0x56fc0558), TOBN(0x10207371, 0x01cebade), TOBN(0x5f87e690, 0x0647a82b), TOBN(0x908e0ed4, 0x8f40054f), TOBN(0xa9f633d4, 0x79853803), TOBN(0x8ed13c9a, 0x4a28b252), TOBN(0x3e2ef676, 0x1f460f64), TOBN(0x53930b9b, 0x36d06336), TOBN(0x347073ac, 0x8fc4979b), TOBN(0x84380e0e, 0x5ecd5597), TOBN(0xe3b22c6b, 0xc4fe3c39), TOBN(0xba4a8153, 0x6c7bebdf), TOBN(0xf23ab6b7, 0x25693459), TOBN(0x53bc3770, 0x14922b11), TOBN(0x4645c8ab, 0x5afc60db), TOBN(0xaa022355, 0x20b9f2a3), TOBN(0x52a2954c, 0xce0fc507), TOBN(0x8c2731bb, 0x7ce1c2e7), TOBN(0xf39608ab, 0x18a0339d), TOBN(0xac7a658d, 0x3735436c), TOBN(0xb22c2b07, 0xcd992b4f), TOBN(0x4e83daec, 0xf40dcfd4), TOBN(0x8a34c7be, 0x2f39ea3e), TOBN(0xef0c005f, 0xb0a56d2e), TOBN(0x62731f6a, 0x6edd8038), TOBN(0x5721d740, 0x4e3cb075), TOBN(0x1ea41511, 0xfbeeee1b), TOBN(0xd1ef5e73, 0xef1d0c05), TOBN(0x42feefd1, 0x73c07d35), TOBN(0xe530a00a, 0x8a329493), TOBN(0x5d55b7fe, 0xf15ebfb0), TOBN(0x549de03c, 0xd322491a), TOBN(0xf7b5f602, 0x745b3237), TOBN(0x3632a3a2, 0x1ab6e2b6), TOBN(0x0d3bba89, 0x0ef59f78), TOBN(0x0dfc6443, 0xc9e52b9a), TOBN(0x1dc79699, 0x72631447), TOBN(0xef033917, 0xb3be20b1), TOBN(0x0c92735d, 0xb1383948), TOBN(0xc1fc29a2, 0xc0dd7d7d), TOBN(0x6485b697, 0x403ed068), TOBN(0x13bfaab3, 0xaac93bdc), TOBN(0x410dc6a9, 0x0deeaf52), TOBN(0xb003fb02, 0x4c641c15), TOBN(0x1384978c, 0x5bc504c4), TOBN(0x37640487, 0x864a6a77), TOBN(0x05991bc6, 0x222a77da), TOBN(0x62260a57, 0x5e47eb11), TOBN(0xc7af6613, 0xf21b432c), TOBN(0x22f3acc9, 0xab4953e9), TOBN(0x52934922, 0x8e41d155), TOBN(0x4d024568, 0x3ac059ef), TOBN(0xb0201755, 0x4d884411), TOBN(0xce8055cf, 0xa59a178f), TOBN(0xcd77d1af, 0xf6204549), TOBN(0xa0a00a3e, 0xc7066759), TOBN(0x471071ef, 0x0272c229), TOBN(0x009bcf6b, 0xd3c4b6b0), TOBN(0x2a2638a8, 0x22305177), TOBN(0xd51d59df, 0x41645bbf), TOBN(0xa81142fd, 0xc0a7a3c0), TOBN(0xa17eca6d, 0x4c7063ee), TOBN(0x0bb887ed, 0x60d9dcec), TOBN(0xd6d28e51, 0x20ad2455), TOBN(0xebed6308, 0xa67102ba), TOBN(0x042c3114, 0x8bffa408), TOBN(0xfd099ac5, 0x8aa68e30), TOBN(0x7a6a3d7c, 0x1483513e), TOBN(0xffcc6b75, 0xba2d8f0c), TOBN(0x54dacf96, 0x1e78b954), TOBN(0xf645696f, 0xa4a9af89), TOBN(0x3a411940, 0x06ac98ec), TOBN(0x41b8b3f6, 0x22a67a20), TOBN(0x2d0b1e0f, 0x99dec626), TOBN(0x27c89192, 0x40be34e8), TOBN(0xc7162b37, 0x91907f35), TOBN(0x90188ec1, 0xa956702b), TOBN(0xca132f7d, 0xdf93769c), TOBN(0x3ece44f9, 0x0e2025b4), TOBN(0x67aaec69, 0x0c62f14c), TOBN(0xad741418, 0x22e3cc11), TOBN(0xcf9b75c3, 0x7ff9a50e), TOBN(0x02fa2b16, 0x4d348272), TOBN(0xbd99d61a, 0x9959d56d), TOBN(0xbc4f19db, 0x18762916), TOBN(0xcc7cce50, 0x49c1ac80), TOBN(0x4d59ebaa, 0xd846bd83), TOBN(0x8775a9dc, 0xa9202849), TOBN(0x07ec4ae1, 0x6e1f4ca9), TOBN(0x27eb5875, 0xba893f11), TOBN(0x00284d51, 0x662cc565), TOBN(0x82353a6b, 0x0db4138d), TOBN(0xd9c7aaaa, 0xaa32a594), TOBN(0xf5528b5e, 0xa5669c47), TOBN(0xf3220231, 0x2f23c5ff), TOBN(0xe3e8147a, 0x6affa3a1), TOBN(0xfb423d5c, 0x202ddda0), TOBN(0x3d6414ac, 0x6b871bd4), TOBN(0x586f82e1, 0xa51a168a), TOBN(0xb712c671, 0x48ae5448), TOBN(0x9a2e4bd1, 0x76233eb8), TOBN(0x0188223a, 0x78811ca9), TOBN(0x553c5e21, 0xf7c18de1), TOBN(0x7682e451, 0xb27bb286), TOBN(0x3ed036b3, 0x0e51e929), TOBN(0xf487211b, 0xec9cb34f), TOBN(0x0d094277, 0x0c24efc8), TOBN(0x0349fd04, 0xbef737a4), TOBN(0x6d1c9dd2, 0x514cdd28), TOBN(0x29c135ff, 0x30da9521), TOBN(0xea6e4508, 0xf78b0b6f), TOBN(0x176f5dd2, 0x678c143c), TOBN(0x08148418, 0x4be21e65), TOBN(0x27f7525c, 0xe7df38c4), TOBN(0x1fb70e09, 0x748ab1a4), TOBN(0x9cba50a0, 0x5efe4433), TOBN(0x7846c7a6, 0x15f75af2), TOBN(0x2a7c2c57, 0x5ee73ea8), TOBN(0x42e566a4, 0x3f0a449a), TOBN(0x45474c3b, 0xad90fc3d), TOBN(0x7447be3d, 0x8b61d057), TOBN(0x3e9d1cf1, 0x3a4ec092), TOBN(0x1603e453, 0xf380a6e6), TOBN(0x0b86e431, 0x9b1437c2), TOBN(0x7a4173f2, 0xef29610a), TOBN(0x8fa729a7, 0xf03d57f7), TOBN(0x3e186f6e, 0x6c9c217e), TOBN(0xbe1d3079, 0x91919524), TOBN(0x92a62a70, 0x153d4fb1), TOBN(0x32ed3e34, 0xd68c2f71), TOBN(0xd785027f, 0x9eb1a8b7), TOBN(0xbc37eb77, 0xc5b22fe8), TOBN(0x466b34f0, 0xb9d6a191), TOBN(0x008a89af, 0x9a05f816), TOBN(0x19b028fb, 0x7d42c10a), TOBN(0x7fe8c92f, 0x49b3f6b8), TOBN(0x58907cc0, 0xa5a0ade3), TOBN(0xb3154f51, 0x559d1a7c), TOBN(0x5066efb6, 0xd9790ed6), TOBN(0xa77a0cbc, 0xa6aa793b), TOBN(0x1a915f3c, 0x223e042e), TOBN(0x1c5def04, 0x69c5874b), TOBN(0x0e830078, 0x73b6c1da), TOBN(0x55cf85d2, 0xfcd8557a), TOBN(0x0f7c7c76, 0x0460f3b1), TOBN(0x87052acb, 0x46e58063), TOBN(0x09212b80, 0x907eae66), TOBN(0x3cb068e0, 0x4d721c89), TOBN(0xa87941ae, 0xdd45ac1c), TOBN(0xde8d5c0d, 0x0daa0dbb), TOBN(0xda421fdc, 0xe3502e6e), TOBN(0xc8944201, 0x4d89a084), TOBN(0x7307ba5e, 0xf0c24bfb), TOBN(0xda212beb, 0x20bde0ef), TOBN(0xea2da24b, 0xf82ce682), TOBN(0x058d3816, 0x07f71fe4), TOBN(0x35a02462, 0x5ffad8de), TOBN(0xcd7b05dc, 0xaadcefab), TOBN(0xd442f8ed, 0x1d9f54ec), TOBN(0x8be3d618, 0xb2d3b5ca), TOBN(0xe2220ed0, 0xe06b2ce2), TOBN(0x82699a5f, 0x1b0da4c0), TOBN(0x3ff106f5, 0x71c0c3a7), TOBN(0x8f580f5a, 0x0d34180c), TOBN(0x4ebb120e, 0x22d7d375), TOBN(0x5e5782cc, 0xe9513675), TOBN(0x2275580c, 0x99c82a70), TOBN(0xe8359fbf, 0x15ea8c4c), TOBN(0x53b48db8, 0x7b415e70), TOBN(0xaacf2240, 0x100c6014), TOBN(0x9faaccf5, 0xe4652f1d), TOBN(0xbd6fdd2a, 0xd56157b2), TOBN(0xa4f4fb1f, 0x6261ec50), TOBN(0x244e55ad, 0x476bcd52), TOBN(0x881c9305, 0x047d320b), TOBN(0x1ca983d5, 0x6181263f), TOBN(0x354e9a44, 0x278fb8ee), TOBN(0xad2dbc0f, 0x396e4964), TOBN(0x723f3aa2, 0x9268b3de), TOBN(0x0d1ca29a, 0xe6e0609a), TOBN(0x794866aa, 0x6cf44252), TOBN(0x0b59f3e3, 0x01af87ed), TOBN(0xe234e5ff, 0x7f4a6c51), TOBN(0xa8768fd2, 0x61dc2f7e), TOBN(0xdafc7332, 0x0a94d81f), TOBN(0xd7f84282, 0x06938ce1), TOBN(0xae0b3c0e, 0x0546063e), TOBN(0x7fbadcb2, 0x5d61abc6), TOBN(0xd5d7a2c9, 0x369ac400), TOBN(0xa5978d09, 0xae67d10c), TOBN(0x290f211e, 0x4f85eaac), TOBN(0xe61e2ad1, 0xfacac681), TOBN(0xae125225, 0x388384cd), TOBN(0xa7fb68e9, 0xccfde30f), TOBN(0x7a59b936, 0x3daed4c2), TOBN(0x80a9aa40, 0x2606f789), TOBN(0xb40c1ea5, 0xf6a6d90a), TOBN(0x948364d3, 0x514d5885), TOBN(0x062ebc60, 0x70985182), TOBN(0xa6db5b0e, 0x33310895), TOBN(0x64a12175, 0xe329c2f5), TOBN(0xc5f25bd2, 0x90ea237e), TOBN(0x7915c524, 0x2d0a4c23), TOBN(0xeb5d26e4, 0x6bb3cc52), TOBN(0x369a9116, 0xc09e2c92), TOBN(0x0c527f92, 0xcf182cf8), TOBN(0x9e591938, 0x2aede0ac), TOBN(0xb2922208, 0x6cc34939), TOBN(0x3c9d8962, 0x99a34361), TOBN(0x3c81836d, 0xc1905fe6), TOBN(0x4bfeb57f, 0xa001ec5a), TOBN(0xe993f5bb, 0xa0dc5dba), TOBN(0x47884109, 0x724a1380), TOBN(0x8a0369ab, 0x32fe9a04), TOBN(0xea068d60, 0x8c927db8), TOBN(0xbf5f37cf, 0x94655741), TOBN(0x47d402a2, 0x04b6c7ea), TOBN(0x4551c295, 0x6af259cb), TOBN(0x698b71e7, 0xed77ee8b), TOBN(0xbddf7bd0, 0xf309d5c7), TOBN(0x6201c22c, 0x34e780ca), TOBN(0xab04f7d8, 0x4c295ef4), TOBN(0x1c947294, 0x4313a8ce), TOBN(0xe532e4ac, 0x92ca4cfe), TOBN(0x89738f80, 0xd0a7a97a), TOBN(0xec088c88, 0xa580fd5b), TOBN(0x612b1ecc, 0x42ce9e51), TOBN(0x8f9840fd, 0xb25fdd2a), TOBN(0x3cda78c0, 0x01e7f839), TOBN(0x546b3d3a, 0xece05480), TOBN(0x271719a9, 0x80d30916), TOBN(0x45497107, 0x584c20c4), TOBN(0xaf8f9478, 0x5bc78608), TOBN(0x28c7d484, 0x277e2a4c), TOBN(0xfce01767, 0x88a2ffe4), TOBN(0xdc506a35, 0x28e169a5), TOBN(0x0ea10861, 0x7af9c93a), TOBN(0x1ed24361, 0x03fa0e08), TOBN(0x96eaaa92, 0xa3d694e7), TOBN(0xc0f43b4d, 0xef50bc74), TOBN(0xce6aa58c, 0x64114db4), TOBN(0x8218e8ea, 0x7c000fd4), TOBN(0xac815dfb, 0x185f8844), TOBN(0xcd7e90cb, 0x1557abfb), TOBN(0x23d16655, 0xafbfecdf), TOBN(0x80f3271f, 0x085cac4a), TOBN(0x7fc39aa7, 0xd0e62f47), TOBN(0x88d519d1, 0x460a48e5), TOBN(0x59559ac4, 0xd28f101e), TOBN(0x7981d9e9, 0xca9ae816), TOBN(0x5c38652c, 0x9ac38203), TOBN(0x86eaf87f, 0x57657fe5), TOBN(0x568fc472, 0xe21f5416), TOBN(0x2afff39c, 0xe7e597b5), TOBN(0x3adbbb07, 0x256d4eab), TOBN(0x22598692, 0x8285ab89), TOBN(0x35f8112a, 0x041caefe), TOBN(0x95df02e3, 0xa5064c8b), TOBN(0x4d63356e, 0xc7004bf3), TOBN(0x230a08f4, 0xdb83c7de), TOBN(0xca27b270, 0x8709a7b7), TOBN(0x0d1c4cc4, 0xcb9abd2d), TOBN(0x8a0bc66e, 0x7550fee8), TOBN(0x369cd4c7, 0x9cf7247e), TOBN(0x75562e84, 0x92b5b7e7), TOBN(0x8fed0da0, 0x5802af7b), TOBN(0x6a7091c2, 0xe48fb889), TOBN(0x26882c13, 0x7b8a9d06), TOBN(0xa2498663, 0x1b82a0e2), TOBN(0x844ed736, 0x3518152d), TOBN(0x282f476f, 0xd86e27c7), TOBN(0xa04edaca, 0x04afefdc), TOBN(0x8b256ebc, 0x6119e34d), TOBN(0x56a413e9, 0x0787d78b)}, {TOBN(0x82ee061d, 0x5a74be50), TOBN(0xe41781c4, 0xdea16ff5), TOBN(0xe0b0c81e, 0x99bfc8a2), TOBN(0x624f4d69, 0x0b547e2d), TOBN(0x3a83545d, 0xbdcc9ae4), TOBN(0x2573dbb6, 0x409b1e8e), TOBN(0x482960c4, 0xa6c93539), TOBN(0xf01059ad, 0x5ae18798), TOBN(0x715c9f97, 0x3112795f), TOBN(0xe8244437, 0x984e6ee1), TOBN(0x55cb4858, 0xecb66bcd), TOBN(0x7c136735, 0xabaffbee), TOBN(0x54661595, 0x5dbec38e), TOBN(0x51c0782c, 0x388ad153), TOBN(0x9ba4c53a, 0xc6e0952f), TOBN(0x27e6782a, 0x1b21dfa8), TOBN(0x682f903d, 0x4ed2dbc2), TOBN(0x0eba59c8, 0x7c3b2d83), TOBN(0x8e9dc84d, 0x9c7e9335), TOBN(0x5f9b21b0, 0x0eb226d7), TOBN(0xe33bd394, 0xaf267bae), TOBN(0xaa86cc25, 0xbe2e15ae), TOBN(0x4f0bf67d, 0x6a8ec500), TOBN(0x5846aa44, 0xf9630658), TOBN(0xfeb09740, 0xe2c2bf15), TOBN(0x627a2205, 0xa9e99704), TOBN(0xec8d73d0, 0xc2fbc565), TOBN(0x223eed8f, 0xc20c8de8), TOBN(0x1ee32583, 0xa8363b49), TOBN(0x1a0b6cb9, 0xc9c2b0a6), TOBN(0x49f7c3d2, 0x90dbc85c), TOBN(0xa8dfbb97, 0x1ef4c1ac), TOBN(0xafb34d4c, 0x65c7c2ab), TOBN(0x1d4610e7, 0xe2c5ea84), TOBN(0x893f6d1b, 0x973c4ab5), TOBN(0xa3cdd7e9, 0x945ba5c4), TOBN(0x60514983, 0x064417ee), TOBN(0x1459b23c, 0xad6bdf2b), TOBN(0x23b2c341, 0x5cf726c3), TOBN(0x3a829635, 0x32d6354a), TOBN(0x294f901f, 0xab192c18), TOBN(0xec5fcbfe, 0x7030164f), TOBN(0xe2e2fcb7, 0xe2246ba6), TOBN(0x1e7c88b3, 0x221a1a0c), TOBN(0x72c7dd93, 0xc92d88c5), TOBN(0x41c2148e, 0x1106fb59), TOBN(0x547dd4f5, 0xa0f60f14), TOBN(0xed9b52b2, 0x63960f31), TOBN(0x6c8349eb, 0xb0a5b358), TOBN(0xb154c5c2, 0x9e7e2ed6), TOBN(0xcad5eccf, 0xeda462db), TOBN(0xf2d6dbe4, 0x2de66b69), TOBN(0x426aedf3, 0x8665e5b2), TOBN(0x488a8513, 0x7b7f5723), TOBN(0x15cc43b3, 0x8bcbb386), TOBN(0x27ad0af3, 0xd791d879), TOBN(0xc16c236e, 0x846e364f), TOBN(0x7f33527c, 0xdea50ca0), TOBN(0xc4810775, 0x0926b86d), TOBN(0x6c2a3609, 0x0598e70c), TOBN(0xa6755e52, 0xf024e924), TOBN(0xe0fa07a4, 0x9db4afca), TOBN(0x15c3ce7d, 0x66831790), TOBN(0x5b4ef350, 0xa6cbb0d6), TOBN(0x2c4aafc4, 0xb6205969), TOBN(0x42563f02, 0xf6c7854f), TOBN(0x016aced5, 0x1d983b48), TOBN(0xfeb356d8, 0x99949755), TOBN(0x8c2a2c81, 0xd1a39bd7), TOBN(0x8f44340f, 0xe6934ae9), TOBN(0x148cf91c, 0x447904da), TOBN(0x7340185f, 0x0f51a926), TOBN(0x2f8f00fb, 0x7409ab46), TOBN(0x057e78e6, 0x80e289b2), TOBN(0x03e5022c, 0xa888e5d1), TOBN(0x3c87111a, 0x9dede4e2), TOBN(0x5b9b0e1c, 0x7809460b), TOBN(0xe751c852, 0x71c9abc7), TOBN(0x8b944e28, 0xc7cc1dc9), TOBN(0x4f201ffa, 0x1d3cfa08), TOBN(0x02fc905c, 0x3e6721ce), TOBN(0xd52d70da, 0xd0b3674c), TOBN(0x5dc2e5ca, 0x18810da4), TOBN(0xa984b273, 0x5c69dd99), TOBN(0x63b92527, 0x84de5ca4), TOBN(0x2f1c9872, 0xc852dec4), TOBN(0x18b03593, 0xc2e3de09), TOBN(0x19d70b01, 0x9813dc2f), TOBN(0x42806b2d, 0xa6dc1d29), TOBN(0xd3030009, 0xf871e144), TOBN(0xa1feb333, 0xaaf49276), TOBN(0xb5583b9e, 0xc70bc04b), TOBN(0x1db0be78, 0x95695f20), TOBN(0xfc841811, 0x89d012b5), TOBN(0x6409f272, 0x05f61643), TOBN(0x40d34174, 0xd5883128), TOBN(0xd79196f5, 0x67419833), TOBN(0x6059e252, 0x863b7b08), TOBN(0x84da1817, 0x1c56700c), TOBN(0x5758ee56, 0xb28d3ec4), TOBN(0x7da2771d, 0x013b0ea6), TOBN(0xfddf524b, 0x54c5e9b9), TOBN(0x7df4faf8, 0x24305d80), TOBN(0x58f5c1bf, 0x3a97763f), TOBN(0xa5af37f1, 0x7c696042), TOBN(0xd4cba22c, 0x4a2538de), TOBN(0x211cb995, 0x9ea42600), TOBN(0xcd105f41, 0x7b069889), TOBN(0xb1e1cf19, 0xddb81e74), TOBN(0x472f2d89, 0x5157b8ca), TOBN(0x086fb008, 0xee9db885), TOBN(0x365cd570, 0x0f26d131), TOBN(0x284b02bb, 0xa2be7053), TOBN(0xdcbbf7c6, 0x7ab9a6d6), TOBN(0x4425559c, 0x20f7a530), TOBN(0x961f2dfa, 0x188767c8), TOBN(0xe2fd9435, 0x70dc80c4), TOBN(0x104d6b63, 0xf0784120), TOBN(0x7f592bc1, 0x53567122), TOBN(0xf6bc1246, 0xf688ad77), TOBN(0x05214c05, 0x0f15dde9), TOBN(0xa47a76a8, 0x0d5f2b82), TOBN(0xbb254d30, 0x62e82b62), TOBN(0x11a05fe0, 0x3ec955ee), TOBN(0x7eaff46e, 0x9d529b36), TOBN(0x55ab1301, 0x8f9e3df6), TOBN(0xc463e371, 0x99317698), TOBN(0xfd251438, 0xccda47ad), TOBN(0xca9c3547, 0x23d695ea), TOBN(0x48ce626e, 0x16e589b5), TOBN(0x6b5b64c7, 0xb187d086), TOBN(0xd02e1794, 0xb2207948), TOBN(0x8b58e98f, 0x7198111d), TOBN(0x90ca6305, 0xdcf9c3cc), TOBN(0x5691fe72, 0xf34089b0), TOBN(0x60941af1, 0xfc7c80ff), TOBN(0xa09bc0a2, 0x22eb51e5), TOBN(0xc0bb7244, 0xaa9cf09a), TOBN(0x36a8077f, 0x80159f06), TOBN(0x8b5c989e, 0xdddc560e), TOBN(0x19d2f316, 0x512e1f43), TOBN(0x02eac554, 0xad08ff62), TOBN(0x012ab84c, 0x07d20b4e), TOBN(0x37d1e115, 0xd6d4e4e1), TOBN(0xb6443e1a, 0xab7b19a8), TOBN(0xf08d067e, 0xdef8cd45), TOBN(0x63adf3e9, 0x685e03da), TOBN(0xcf15a10e, 0x4792b916), TOBN(0xf44bcce5, 0xb738a425), TOBN(0xebe131d5, 0x9636b2fd), TOBN(0x94068841, 0x7850d605), TOBN(0x09684eaa, 0xb40d749d), TOBN(0x8c3c669c, 0x72ba075b), TOBN(0x89f78b55, 0xba469015), TOBN(0x5706aade, 0x3e9f8ba8), TOBN(0x6d8bd565, 0xb32d7ed7), TOBN(0x25f4e63b, 0x805f08d6), TOBN(0x7f48200d, 0xc3bcc1b5), TOBN(0x4e801968, 0xb025d847), TOBN(0x74afac04, 0x87cbe0a8), TOBN(0x43ed2c2b, 0x7e63d690), TOBN(0xefb6bbf0, 0x0223cdb8), TOBN(0x4fec3cae, 0x2884d3fe), TOBN(0x065ecce6, 0xd75e25a4), TOBN(0x6c2294ce, 0x69f79071), TOBN(0x0d9a8e5f, 0x044b8666), TOBN(0x5009f238, 0x17b69d8f), TOBN(0x3c29f8fe, 0xc5dfdaf7), TOBN(0x9067528f, 0xebae68c4), TOBN(0x5b385632, 0x30c5ba21), TOBN(0x540df119, 0x1fdd1aec), TOBN(0xcf37825b, 0xcfba4c78), TOBN(0x77eff980, 0xbeb11454), TOBN(0x40a1a991, 0x60c1b066), TOBN(0xe8018980, 0xf889a1c7), TOBN(0xb9c52ae9, 0x76c24be0), TOBN(0x05fbbcce, 0x45650ef4), TOBN(0xae000f10, 0x8aa29ac7), TOBN(0x884b7172, 0x4f04c470), TOBN(0x7cd4fde2, 0x19bb5c25), TOBN(0x6477b22a, 0xe8840869), TOBN(0xa8868859, 0x5fbd0686), TOBN(0xf23cc02e, 0x1116dfba), TOBN(0x76cd563f, 0xd87d7776), TOBN(0xe2a37598, 0xa9d82abf), TOBN(0x5f188ccb, 0xe6c170f5), TOBN(0x81682200, 0x5066b087), TOBN(0xda22c212, 0xc7155ada), TOBN(0x151e5d3a, 0xfbddb479), TOBN(0x4b606b84, 0x6d715b99), TOBN(0x4a73b54b, 0xf997cb2e), TOBN(0x9a1bfe43, 0x3ecd8b66), TOBN(0x1c312809, 0x2a67d48a), TOBN(0xcd6a671e, 0x031fa9e2), TOBN(0xbec3312a, 0x0e43a34a), TOBN(0x1d935639, 0x55ef47d3), TOBN(0x5ea02489, 0x8fea73ea), TOBN(0x8247b364, 0xa035afb2), TOBN(0xb58300a6, 0x5265b54c), TOBN(0x3286662f, 0x722c7148), TOBN(0xb77fd76b, 0xb4ec4c20), TOBN(0xf0a12fa7, 0x0f3fe3fd), TOBN(0xf845bbf5, 0x41d8c7e8), TOBN(0xe4d969ca, 0x5ec10aa8), TOBN(0x4c0053b7, 0x43e232a3), TOBN(0xdc7a3fac, 0x37f8a45a), TOBN(0x3c4261c5, 0x20d81c8f), TOBN(0xfd4b3453, 0xb00eab00), TOBN(0x76d48f86, 0xd36e3062), TOBN(0x626c5277, 0xa143ff02), TOBN(0x538174de, 0xaf76f42e), TOBN(0x2267aa86, 0x6407ceac), TOBN(0xfad76351, 0x72e572d5), TOBN(0xab861af7, 0xba7330eb), TOBN(0xa0a1c8c7, 0x418d8657), TOBN(0x988821cb, 0x20289a52), TOBN(0x79732522, 0xcccc18ad), TOBN(0xaadf3f8d, 0xf1a6e027), TOBN(0xf7382c93, 0x17c2354d), TOBN(0x5ce1680c, 0xd818b689), TOBN(0x359ebbfc, 0xd9ecbee9), TOBN(0x4330689c, 0x1cae62ac), TOBN(0xb55ce5b4, 0xc51ac38a), TOBN(0x7921dfea, 0xfe238ee8), TOBN(0x3972bef8, 0x271d1ca5), TOBN(0x3e423bc7, 0xe8aabd18), TOBN(0x57b09f3f, 0x44a3e5e3), TOBN(0x5da886ae, 0x7b444d66), TOBN(0x68206634, 0xa9964375), TOBN(0x356a2fa3, 0x699cd0ff), TOBN(0xaf0faa24, 0xdba515e9), TOBN(0x536e1f5c, 0xb321d79a), TOBN(0xd3b9913a, 0x5c04e4ea), TOBN(0xd549dcfe, 0xd6f11513), TOBN(0xee227bf5, 0x79fd1d94), TOBN(0x9f35afee, 0xb43f2c67), TOBN(0xd2638d24, 0xf1314f53), TOBN(0x62baf948, 0xcabcd822), TOBN(0x5542de29, 0x4ef48db0), TOBN(0xb3eb6a04, 0xfc5f6bb2), TOBN(0x23c110ae, 0x1208e16a), TOBN(0x1a4d15b5, 0xf8363e24), TOBN(0x30716844, 0x164be00b), TOBN(0xa8e24824, 0xf6f4690d), TOBN(0x548773a2, 0x90b170cf), TOBN(0xa1bef331, 0x42f191f4), TOBN(0x70f418d0, 0x9247aa97), TOBN(0xea06028e, 0x48be9147), TOBN(0xe13122f3, 0xdbfb894e), TOBN(0xbe9b79f6, 0xce274b18), TOBN(0x85a49de5, 0xca58aadf), TOBN(0x24957758, 0x11487351), TOBN(0x111def61, 0xbb939099), TOBN(0x1d6a974a, 0x26d13694), TOBN(0x4474b4ce, 0xd3fc253b), TOBN(0x3a1485e6, 0x4c5db15e), TOBN(0xe79667b4, 0x147c15b4), TOBN(0xe34f553b, 0x7bc61301), TOBN(0x032b80f8, 0x17094381), TOBN(0x55d8bafd, 0x723eaa21), TOBN(0x5a987995, 0xf1c0e74e), TOBN(0x5a9b292e, 0xebba289c), TOBN(0x413cd4b2, 0xeb4c8251), TOBN(0x98b5d243, 0xd162db0a), TOBN(0xbb47bf66, 0x68342520), TOBN(0x08d68949, 0xbaa862d1), TOBN(0x11f349c7, 0xe906abcd), TOBN(0x454ce985, 0xed7bf00e), TOBN(0xacab5c9e, 0xb55b803b), TOBN(0xb03468ea, 0x31e3c16d), TOBN(0x5c24213d, 0xd273bf12), TOBN(0x211538eb, 0x71587887), TOBN(0x198e4a2f, 0x731dea2d), TOBN(0xd5856cf2, 0x74ed7b2a), TOBN(0x86a632eb, 0x13a664fe), TOBN(0x932cd909, 0xbda41291), TOBN(0x850e95d4, 0xc0c4ddc0), TOBN(0xc0f422f8, 0x347fc2c9), TOBN(0xe68cbec4, 0x86076bcb), TOBN(0xf9e7c0c0, 0xcd6cd286), TOBN(0x65994ddb, 0x0f5f27ca), TOBN(0xe85461fb, 0xa80d59ff), TOBN(0xff05481a, 0x66601023), TOBN(0xc665427a, 0xfc9ebbfb), TOBN(0xb0571a69, 0x7587fd52), TOBN(0x935289f8, 0x8d49efce), TOBN(0x61becc60, 0xea420688), TOBN(0xb22639d9, 0x13a786af), TOBN(0x1a8e6220, 0x361ecf90), TOBN(0x001f23e0, 0x25506463), TOBN(0xe4ae9b5d, 0x0a5c2b79), TOBN(0xebc9cdad, 0xd8149db5), TOBN(0xb33164a1, 0x934aa728), TOBN(0x750eb00e, 0xae9b60f3), TOBN(0x5a91615b, 0x9b9cfbfd), TOBN(0x97015cbf, 0xef45f7f6), TOBN(0xb462c4a5, 0xbf5151df), TOBN(0x21adcc41, 0xb07118f2), TOBN(0xd60c545b, 0x043fa42c), TOBN(0xfc21aa54, 0xe96be1ab), TOBN(0xe84bc32f, 0x4e51ea80), TOBN(0x3dae45f0, 0x259b5d8d), TOBN(0xbb73c7eb, 0xc38f1b5e), TOBN(0xe405a74a, 0xe8ae617d), TOBN(0xbb1ae9c6, 0x9f1c56bd), TOBN(0x8c176b98, 0x49f196a4), TOBN(0xc448f311, 0x6875092b), TOBN(0xb5afe3de, 0x9f976033), TOBN(0xa8dafd49, 0x145813e5), TOBN(0x687fc4d9, 0xe2b34226), TOBN(0xf2dfc92d, 0x4c7ff57f), TOBN(0x004e3fc1, 0x401f1b46), TOBN(0x5afddab6, 0x1430c9ab), TOBN(0x0bdd41d3, 0x2238e997), TOBN(0xf0947430, 0x418042ae), TOBN(0x71f9adda, 0xcdddc4cb), TOBN(0x7090c016, 0xc52dd907), TOBN(0xd9bdf44d, 0x29e2047f), TOBN(0xe6f1fe80, 0x1b1011a6), TOBN(0xb63accbc, 0xd9acdc78), TOBN(0xcfc7e235, 0x1272a95b), TOBN(0x0c667717, 0xa6276ac8), TOBN(0x3c0d3709, 0xe2d7eef7), TOBN(0x5add2b06, 0x9a685b3e), TOBN(0x363ad32d, 0x14ea5d65), TOBN(0xf8e01f06, 0x8d7dd506), TOBN(0xc9ea2213, 0x75b4aac6), TOBN(0xed2a2bf9, 0x0d353466), TOBN(0x439d79b5, 0xe9d3a7c3), TOBN(0x8e0ee5a6, 0x81b7f34b), TOBN(0xcf3dacf5, 0x1dc4ba75), TOBN(0x1d3d1773, 0xeb3310c7), TOBN(0xa8e67112, 0x7747ae83), TOBN(0x31f43160, 0x197d6b40), TOBN(0x0521ccee, 0xcd961400), TOBN(0x67246f11, 0xf6535768), TOBN(0x702fcc5a, 0xef0c3133), TOBN(0x247cc45d, 0x7e16693b), TOBN(0xfd484e49, 0xc729b749), TOBN(0x522cef7d, 0xb218320f), TOBN(0xe56ef405, 0x59ab93b3), TOBN(0x225fba11, 0x9f181071), TOBN(0x33bd6595, 0x15330ed0), TOBN(0xc4be69d5, 0x1ddb32f7), TOBN(0x264c7668, 0x0448087c), TOBN(0xac30903f, 0x71432dae), TOBN(0x3851b266, 0x00f9bf47), TOBN(0x400ed311, 0x6cdd6d03), TOBN(0x045e79fe, 0xf8fd2424), TOBN(0xfdfd974a, 0xfa6da98b), TOBN(0x45c9f641, 0x0c1e673a), TOBN(0x76f2e733, 0x5b2c5168), TOBN(0x1adaebb5, 0x2a601753), TOBN(0xb286514c, 0xc57c2d49), TOBN(0xd8769670, 0x1e0bfd24), TOBN(0x950c547e, 0x04478922), TOBN(0xd1d41969, 0xe5d32bfe), TOBN(0x30bc1472, 0x750d6c3e), TOBN(0x8f3679fe, 0xe0e27f3a), TOBN(0x8f64a7dc, 0xa4a6ee0c), TOBN(0x2fe59937, 0x633dfb1f), TOBN(0xea82c395, 0x977f2547), TOBN(0xcbdfdf1a, 0x661ea646), TOBN(0xc7ccc591, 0xb9085451), TOBN(0x82177962, 0x81761e13), TOBN(0xda57596f, 0x9196885c), TOBN(0xbc17e849, 0x28ffbd70), TOBN(0x1e6e0a41, 0x2671d36f), TOBN(0x61ae872c, 0x4152fcf5), TOBN(0x441c87b0, 0x9e77e754), TOBN(0xd0799dd5, 0xa34dff09), TOBN(0x766b4e44, 0x88a6b171), TOBN(0xdc06a512, 0x11f1c792), TOBN(0xea02ae93, 0x4be35c3e), TOBN(0xe5ca4d6d, 0xe90c469e), TOBN(0x4df4368e, 0x56e4ff5c), TOBN(0x7817acab, 0x4baef62e), TOBN(0x9f5a2202, 0xa85b91e8), TOBN(0x9666ebe6, 0x6ce57610), TOBN(0x32ad31f3, 0xf73bfe03), TOBN(0x628330a4, 0x25bcf4d6), TOBN(0xea950593, 0x515056e6), TOBN(0x59811c89, 0xe1332156), TOBN(0xc89cf1fe, 0x8c11b2d7), TOBN(0x75b63913, 0x04e60cc0), TOBN(0xce811e8d, 0x4625d375), TOBN(0x030e43fc, 0x2d26e562), TOBN(0xfbb30b4b, 0x608d36a0), TOBN(0x634ff82c, 0x48528118), TOBN(0x7c6fe085, 0xcd285911), TOBN(0x7f2830c0, 0x99358f28), TOBN(0x2e60a95e, 0x665e6c09), TOBN(0x08407d3d, 0x9b785dbf), TOBN(0x530889ab, 0xa759bce7), TOBN(0xf228e0e6, 0x52f61239), TOBN(0x2b6d1461, 0x6879be3c), TOBN(0xe6902c04, 0x51a7bbf7), TOBN(0x30ad99f0, 0x76f24a64), TOBN(0x66d9317a, 0x98bc6da0), TOBN(0xf4f877f3, 0xcb596ac0), TOBN(0xb05ff62d, 0x4c44f119), TOBN(0x4555f536, 0xe9b77416), TOBN(0xc7c0d059, 0x8caed63b), TOBN(0x0cd2b7ce, 0xc358b2a9), TOBN(0x3f33287b, 0x46945fa3), TOBN(0xf8785b20, 0xd67c8791), TOBN(0xc54a7a61, 0x9637bd08), TOBN(0x54d4598c, 0x18be79d7), TOBN(0x889e5acb, 0xc46d7ce1), TOBN(0x9a515bb7, 0x8b085877), TOBN(0xfac1a03d, 0x0b7a5050), TOBN(0x7d3e738a, 0xf2926035), TOBN(0x861cc2ce, 0x2a6cb0eb), TOBN(0x6f2e2955, 0x8f7adc79), TOBN(0x61c4d451, 0x33016376), TOBN(0xd9fd2c80, 0x5ad59090), TOBN(0xe5a83738, 0xb2b836a1), TOBN(0x855b41a0, 0x7c0d6622), TOBN(0x186fe317, 0x7cc19af1), TOBN(0x6465c1ff, 0xfdd99acb), TOBN(0x46e5c23f, 0x6974b99e), TOBN(0x75a7cf8b, 0xa2717cbe), TOBN(0x4d2ebc3f, 0x062be658), TOBN(0x094b4447, 0x5f209c98), TOBN(0x4af285ed, 0xb940cb5a), TOBN(0x6706d792, 0x7cc82f10), TOBN(0xc8c8776c, 0x030526fa), TOBN(0xfa8e6f76, 0xa0da9140), TOBN(0x77ea9d34, 0x591ee4f0), TOBN(0x5f46e337, 0x40274166), TOBN(0x1bdf98bb, 0xea671457), TOBN(0xd7c08b46, 0x862a1fe2), TOBN(0x46cc303c, 0x1c08ad63), TOBN(0x99543440, 0x4c845e7b), TOBN(0x1b8fbdb5, 0x48f36bf7), TOBN(0x5b82c392, 0x8c8273a7), TOBN(0x08f712c4, 0x928435d5), TOBN(0x071cf0f1, 0x79330380), TOBN(0xc74c2d24, 0xa8da054a), TOBN(0xcb0e7201, 0x43c46b5c), TOBN(0x0ad7337a, 0xc0b7eff3), TOBN(0x8552225e, 0xc5e48b3c), TOBN(0xe6f78b0c, 0x73f13a5f), TOBN(0x5e70062e, 0x82349cbe), TOBN(0x6b8d5048, 0xe7073969), TOBN(0x392d2a29, 0xc33cb3d2), TOBN(0xee4f727c, 0x4ecaa20f), TOBN(0xa068c99e, 0x2ccde707), TOBN(0xfcd5651f, 0xb87a2913), TOBN(0xea3e3c15, 0x3cc252f0), TOBN(0x777d92df, 0x3b6cd3e4), TOBN(0x7a414143, 0xc5a732e7), TOBN(0xa895951a, 0xa71ff493), TOBN(0xfe980c92, 0xbbd37cf6), TOBN(0x45bd5e64, 0xdecfeeff), TOBN(0x910dc2a9, 0xa44c43e9), TOBN(0xcb403f26, 0xcca9f54d), TOBN(0x928bbdfb, 0x9303f6db), TOBN(0x3c37951e, 0xa9eee67c), TOBN(0x3bd61a52, 0xf79961c3), TOBN(0x09a238e6, 0x395c9a79), TOBN(0x6940ca2d, 0x61eb352d), TOBN(0x7d1e5c5e, 0xc1875631), TOBN(0x1e19742c, 0x1e1b20d1), TOBN(0x4633d908, 0x23fc2e6e), TOBN(0xa76e29a9, 0x08959149), TOBN(0x61069d9c, 0x84ed7da5), TOBN(0x0baa11cf, 0x5dbcad51), TOBN(0xd01eec64, 0x961849da), TOBN(0x93b75f1f, 0xaf3d8c28), TOBN(0x57bc4f9f, 0x1ca2ee44), TOBN(0x5a26322d, 0x00e00558), TOBN(0x1888d658, 0x61a023ef), TOBN(0x1d72aab4, 0xb9e5246e), TOBN(0xa9a26348, 0xe5563ec0), TOBN(0xa0971963, 0xc3439a43), TOBN(0x567dd54b, 0xadb9b5b7), TOBN(0x73fac1a1, 0xc45a524b), TOBN(0x8fe97ef7, 0xfe38e608), TOBN(0x608748d2, 0x3f384f48), TOBN(0xb0571794, 0xc486094f), TOBN(0x869254a3, 0x8bf3a8d6), TOBN(0x148a8dd1, 0x310b0e25), TOBN(0x99ab9f3f, 0x9aa3f7d8), TOBN(0x0927c68a, 0x6706c02e), TOBN(0x22b5e76c, 0x69790e6c), TOBN(0x6c325260, 0x6c71376c), TOBN(0x53a57690, 0x09ef6657), TOBN(0x8d63f852, 0xedffcf3a), TOBN(0xb4d2ed04, 0x3c0a6f55), TOBN(0xdb3aa8de, 0x12519b9e), TOBN(0x5d38e9c4, 0x1e0a569a), TOBN(0x871528bf, 0x303747e2), TOBN(0xa208e77c, 0xf5b5c18d), TOBN(0x9d129c88, 0xca6bf923), TOBN(0xbcbf197f, 0xbf02839f), TOBN(0x9b9bf030, 0x27323194), TOBN(0x3b055a8b, 0x339ca59d), TOBN(0xb46b2312, 0x0f669520), TOBN(0x19789f1f, 0x497e5f24), TOBN(0x9c499468, 0xaaf01801), TOBN(0x72ee1190, 0x8b69d59c), TOBN(0x8bd39595, 0xacf4c079), TOBN(0x3ee11ece, 0x8e0cd048), TOBN(0xebde86ec, 0x1ed66f18), TOBN(0x225d906b, 0xd61fce43), TOBN(0x5cab07d6, 0xe8bed74d), TOBN(0x16e4617f, 0x27855ab7), TOBN(0x6568aadd, 0xb2fbc3dd), TOBN(0xedb5484f, 0x8aeddf5b), TOBN(0x878f20e8, 0x6dcf2fad), TOBN(0x3516497c, 0x615f5699)}, {TOBN(0xef0a3fec, 0xfa181e69), TOBN(0x9ea02f81, 0x30d69a98), TOBN(0xb2e9cf8e, 0x66eab95d), TOBN(0x520f2beb, 0x24720021), TOBN(0x621c540a, 0x1df84361), TOBN(0x12037721, 0x71fa6d5d), TOBN(0x6e3c7b51, 0x0ff5f6ff), TOBN(0x817a069b, 0xabb2bef3), TOBN(0x83572fb6, 0xb294cda6), TOBN(0x6ce9bf75, 0xb9039f34), TOBN(0x20e012f0, 0x095cbb21), TOBN(0xa0aecc1b, 0xd063f0da), TOBN(0x57c21c3a, 0xf02909e5), TOBN(0xc7d59ecf, 0x48ce9cdc), TOBN(0x2732b844, 0x8ae336f8), TOBN(0x056e3723, 0x3f4f85f4), TOBN(0x8a10b531, 0x89e800ca), TOBN(0x50fe0c17, 0x145208fd), TOBN(0x9e43c0d3, 0xb714ba37), TOBN(0x427d200e, 0x34189acc), TOBN(0x05dee24f, 0xe616e2c0), TOBN(0x9c25f4c8, 0xee1854c1), TOBN(0x4d3222a5, 0x8f342a73), TOBN(0x0807804f, 0xa027c952), TOBN(0xc222653a, 0x4f0d56f3), TOBN(0x961e4047, 0xca28b805), TOBN(0x2c03f8b0, 0x4a73434b), TOBN(0x4c966787, 0xab712a19), TOBN(0xcc196c42, 0x864fee42), TOBN(0xc1be93da, 0x5b0ece5c), TOBN(0xa87d9f22, 0xc131c159), TOBN(0x2bb6d593, 0xdce45655), TOBN(0x22c49ec9, 0xb809b7ce), TOBN(0x8a41486b, 0xe2c72c2c), TOBN(0x813b9420, 0xfea0bf36), TOBN(0xb3d36ee9, 0xa66dac69), TOBN(0x6fddc08a, 0x328cc987), TOBN(0x0a3bcd2c, 0x3a326461), TOBN(0x7103c49d, 0xd810dbba), TOBN(0xf9d81a28, 0x4b78a4c4), TOBN(0x3de865ad, 0xe4d55941), TOBN(0xdedafa5e, 0x30384087), TOBN(0x6f414abb, 0x4ef18b9b), TOBN(0x9ee9ea42, 0xfaee5268), TOBN(0x260faa16, 0x37a55a4a), TOBN(0xeb19a514, 0x015f93b9), TOBN(0x51d7ebd2, 0x9e9c3598), TOBN(0x523fc56d, 0x1932178e), TOBN(0x501d070c, 0xb98fe684), TOBN(0xd60fbe9a, 0x124a1458), TOBN(0xa45761c8, 0x92bc6b3f), TOBN(0xf5384858, 0xfe6f27cb), TOBN(0x4b0271f7, 0xb59e763b), TOBN(0x3d4606a9, 0x5b5a8e5e), TOBN(0x1eda5d9b, 0x05a48292), TOBN(0xda7731d0, 0xe6fec446), TOBN(0xa3e33693, 0x90d45871), TOBN(0xe9764040, 0x06166d8d), TOBN(0xb5c33682, 0x89a90403), TOBN(0x4bd17983, 0x72f1d637), TOBN(0xa616679e, 0xd5d2c53a), TOBN(0x5ec4bcd8, 0xfdcf3b87), TOBN(0xae6d7613, 0xb66a694e), TOBN(0x7460fc76, 0xe3fc27e5), TOBN(0x70469b82, 0x95caabee), TOBN(0xde024ca5, 0x889501e3), TOBN(0x6bdadc06, 0x076ed265), TOBN(0x0cb1236b, 0x5a0ef8b2), TOBN(0x4065ddbf, 0x0972ebf9), TOBN(0xf1dd3875, 0x22aca432), TOBN(0xa88b97cf, 0x744aff76), TOBN(0xd1359afd, 0xfe8e3d24), TOBN(0x52a3ba2b, 0x91502cf3), TOBN(0x2c3832a8, 0x084db75d), TOBN(0x04a12ddd, 0xde30b1c9), TOBN(0x7802eabc, 0xe31fd60c), TOBN(0x33707327, 0xa37fddab), TOBN(0x65d6f2ab, 0xfaafa973), TOBN(0x3525c5b8, 0x11e6f91a), TOBN(0x76aeb0c9, 0x5f46530b), TOBN(0xe8815ff6, 0x2f93a675), TOBN(0xa6ec9684, 0x05f48679), TOBN(0x6dcbb556, 0x358ae884), TOBN(0x0af61472, 0xe19e3873), TOBN(0x72334372, 0xa5f696be), TOBN(0xc65e57ea, 0x6f22fb70), TOBN(0x268da30c, 0x946cea90), TOBN(0x136a8a87, 0x65681b2a), TOBN(0xad5e81dc, 0x0f9f44d4), TOBN(0xf09a6960, 0x2c46585a), TOBN(0xd1649164, 0xc447d1b1), TOBN(0x3b4b36c8, 0x879dc8b1), TOBN(0x20d4177b, 0x3b6b234c), TOBN(0x096a2505, 0x1730d9d0), TOBN(0x0611b9b8, 0xef80531d), TOBN(0xba904b3b, 0x64bb495d), TOBN(0x1192d9d4, 0x93a3147a), TOBN(0x9f30a5dc, 0x9a565545), TOBN(0x90b1f9cb, 0x6ef07212), TOBN(0x29958546, 0x0d87fc13), TOBN(0xd3323eff, 0xc17db9ba), TOBN(0xcb18548c, 0xcb1644a8), TOBN(0x18a306d4, 0x4f49ffbc), TOBN(0x28d658f1, 0x4c2e8684), TOBN(0x44ba60cd, 0xa99f8c71), TOBN(0x67b7abdb, 0x4bf742ff), TOBN(0x66310f9c, 0x914b3f99), TOBN(0xae430a32, 0xf412c161), TOBN(0x1e6776d3, 0x88ace52f), TOBN(0x4bc0fa24, 0x52d7067d), TOBN(0x03c286aa, 0x8f07cd1b), TOBN(0x4cb8f38c, 0xa985b2c1), TOBN(0x83ccbe80, 0x8c3bff36), TOBN(0x005a0bd2, 0x5263e575), TOBN(0x460d7dda, 0x259bdcd1), TOBN(0x4a1c5642, 0xfa5cab6b), TOBN(0x2b7bdbb9, 0x9fe4fc88), TOBN(0x09418e28, 0xcc97bbb5), TOBN(0xd8274fb4, 0xa12321ae), TOBN(0xb137007d, 0x5c87b64e), TOBN(0x80531fe1, 0xc63c4962), TOBN(0x50541e89, 0x981fdb25), TOBN(0xdc1291a1, 0xfd4c2b6b), TOBN(0xc0693a17, 0xa6df4fca), TOBN(0xb2c4604e, 0x0117f203), TOBN(0x245f1963, 0x0a99b8d0), TOBN(0xaedc20aa, 0xc6212c44), TOBN(0xb1ed4e56, 0x520f52a8), TOBN(0xfe48f575, 0xf8547be3), TOBN(0x0a7033cd, 0xa9e45f98), TOBN(0x4b45d3a9, 0x18c50100), TOBN(0xb2a6cd6a, 0xa61d41da), TOBN(0x60bbb4f5, 0x57933c6b), TOBN(0xa7538ebd, 0x2b0d7ffc), TOBN(0x9ea3ab8d, 0x8cd626b6), TOBN(0x8273a484, 0x3601625a), TOBN(0x88859845, 0x0168e508), TOBN(0x8cbc9bb2, 0x99a94abd), TOBN(0x713ac792, 0xfab0a671), TOBN(0xa3995b19, 0x6c9ebffc), TOBN(0xe711668e, 0x1239e152), TOBN(0x56892558, 0xbbb8dff4), TOBN(0x8bfc7dab, 0xdbf17963), TOBN(0x5b59fe5a, 0xb3de1253), TOBN(0x7e3320eb, 0x34a9f7ae), TOBN(0xe5e8cf72, 0xd751efe4), TOBN(0x7ea003bc, 0xd9be2f37), TOBN(0xc0f551a0, 0xb6c08ef7), TOBN(0x56606268, 0x038f6725), TOBN(0x1dd38e35, 0x6d92d3b6), TOBN(0x07dfce7c, 0xc3cbd686), TOBN(0x4e549e04, 0x651c5da8), TOBN(0x4058f93b, 0x08b19340), TOBN(0xc2fae6f4, 0xcac6d89d), TOBN(0x4bad8a8c, 0x8f159cc7), TOBN(0x0ddba4b3, 0xcb0b601c), TOBN(0xda4fc7b5, 0x1dd95f8c), TOBN(0x1d163cd7, 0xcea5c255), TOBN(0x30707d06, 0x274a8c4c), TOBN(0x79d9e008, 0x2802e9ce), TOBN(0x02a29ebf, 0xe6ddd505), TOBN(0x37064e74, 0xb50bed1a), TOBN(0x3f6bae65, 0xa7327d57), TOBN(0x3846f5f1, 0xf83920bc), TOBN(0x87c37491, 0x60df1b9b), TOBN(0x4cfb2895, 0x2d1da29f), TOBN(0x10a478ca, 0x4ed1743c), TOBN(0x390c6030, 0x3edd47c6), TOBN(0x8f3e5312, 0x8c0a78de), TOBN(0xccd02bda, 0x1e85df70), TOBN(0xd6c75c03, 0xa61b6582), TOBN(0x0762921c, 0xfc0eebd1), TOBN(0xd34d0823, 0xd85010c0), TOBN(0xd73aaacb, 0x0044cf1f), TOBN(0xfb4159bb, 0xa3b5e78a), TOBN(0x2287c7f7, 0xe5826f3f), TOBN(0x4aeaf742, 0x580b1a01), TOBN(0xf080415d, 0x60423b79), TOBN(0xe12622cd, 0xa7dea144), TOBN(0x49ea4996, 0x59d62472), TOBN(0xb42991ef, 0x571f3913), TOBN(0x0610f214, 0xf5b25a8a), TOBN(0x47adc585, 0x30b79e8f), TOBN(0xf90e3df6, 0x07a065a2), TOBN(0x5d0a5deb, 0x43e2e034), TOBN(0x53fb5a34, 0x444024aa), TOBN(0xa8628c68, 0x6b0c9f7f), TOBN(0x9c69c29c, 0xac563656), TOBN(0x5a231feb, 0xbace47b6), TOBN(0xbdce0289, 0x9ea5a2ec), TOBN(0x05da1fac, 0x9463853e), TOBN(0x96812c52, 0x509e78aa), TOBN(0xd3fb5771, 0x57151692), TOBN(0xeb2721f8, 0xd98e1c44), TOBN(0xc0506087, 0x32399be1), TOBN(0xda5a5511, 0xd979d8b8), TOBN(0x737ed55d, 0xc6f56780), TOBN(0xe20d3004, 0x0dc7a7f4), TOBN(0x02ce7301, 0xf5941a03), TOBN(0x91ef5215, 0xed30f83a), TOBN(0x28727fc1, 0x4092d85f), TOBN(0x72d223c6, 0x5c49e41a), TOBN(0xa7cf30a2, 0xba6a4d81), TOBN(0x7c086209, 0xb030d87d), TOBN(0x04844c7d, 0xfc588b09), TOBN(0x728cd499, 0x5874bbb0), TOBN(0xcc1281ee, 0xe84c0495), TOBN(0x0769b5ba, 0xec31958f), TOBN(0x665c228b, 0xf99c2471), TOBN(0xf2d8a11b, 0x191eb110), TOBN(0x4594f494, 0xd36d7024), TOBN(0x482ded8b, 0xcdcb25a1), TOBN(0xc958a9d8, 0xdadd4885), TOBN(0x7004477e, 0xf1d2b547), TOBN(0x0a45f6ef, 0x2a0af550), TOBN(0x4fc739d6, 0x2f8d6351), TOBN(0x75cdaf27, 0x786f08a9), TOBN(0x8700bb26, 0x42c2737f), TOBN(0x855a7141, 0x1c4e2670), TOBN(0x810188c1, 0x15076fef), TOBN(0xc251d0c9, 0xabcd3297), TOBN(0xae4c8967, 0xf48108eb), TOBN(0xbd146de7, 0x18ceed30), TOBN(0xf9d4f07a, 0xc986bced), TOBN(0x5ad98ed5, 0x83fa1e08), TOBN(0x7780d33e, 0xbeabd1fb), TOBN(0xe330513c, 0x903b1196), TOBN(0xba11de9e, 0xa47bc8c4), TOBN(0x684334da, 0x02c2d064), TOBN(0x7ecf360d, 0xa48de23b), TOBN(0x57a1b474, 0x0a9089d8), TOBN(0xf28fa439, 0xff36734c), TOBN(0xf2a482cb, 0xea4570b3), TOBN(0xee65d68b, 0xa5ebcee9), TOBN(0x988d0036, 0xb9694cd5), TOBN(0x53edd0e9, 0x37885d32), TOBN(0xe37e3307, 0xbeb9bc6d), TOBN(0xe9abb907, 0x9f5c6768), TOBN(0x4396ccd5, 0x51f2160f), TOBN(0x2500888c, 0x47336da6), TOBN(0x383f9ed9, 0x926fce43), TOBN(0x809dd1c7, 0x04da2930), TOBN(0x30f6f596, 0x8a4cb227), TOBN(0x0d700c7f, 0x73a56b38), TOBN(0x1825ea33, 0xab64a065), TOBN(0xaab9b735, 0x1338df80), TOBN(0x1516100d, 0x9b63f57f), TOBN(0x2574395a, 0x27a6a634), TOBN(0xb5560fb6, 0x700a1acd), TOBN(0xe823fd73, 0xfd999681), TOBN(0xda915d1f, 0x6cb4e1ba), TOBN(0x0d030118, 0x6ebe00a3), TOBN(0x744fb0c9, 0x89fca8cd), TOBN(0x970d01db, 0xf9da0e0b), TOBN(0x0ad8c564, 0x7931d76f), TOBN(0xb15737bf, 0xf659b96a), TOBN(0xdc9933e8, 0xa8b484e7), TOBN(0xb2fdbdf9, 0x7a26dec7), TOBN(0x2349e9a4, 0x9f1f0136), TOBN(0x7860368e, 0x70fddddb), TOBN(0xd93d2c1c, 0xf9ad3e18), TOBN(0x6d6c5f17, 0x689f4e79), TOBN(0x7a544d91, 0xb24ff1b6), TOBN(0x3e12a5eb, 0xfe16cd8c), TOBN(0x543574e9, 0xa56b872f), TOBN(0xa1ad550c, 0xfcf68ea2), TOBN(0x689e37d2, 0x3f560ef7), TOBN(0x8c54b9ca, 0xc9d47a8b), TOBN(0x46d40a4a, 0x088ac342), TOBN(0xec450c7c, 0x1576c6d0), TOBN(0xb589e31c, 0x1f9689e9), TOBN(0xdacf2602, 0xb8781718), TOBN(0xa89237c6, 0xc8cb6b42), TOBN(0x1326fc93, 0xb96ef381), TOBN(0x55d56c6d, 0xb5f07825), TOBN(0xacba2eea, 0x7449e22d), TOBN(0x74e0887a, 0x633c3000), TOBN(0xcb6cd172, 0xd7cbcf71), TOBN(0x309e81de, 0xc36cf1be), TOBN(0x07a18a6d, 0x60ae399b), TOBN(0xb36c2679, 0x9edce57e), TOBN(0x52b892f4, 0xdf001d41), TOBN(0xd884ae5d, 0x16a1f2c6), TOBN(0x9b329424, 0xefcc370a), TOBN(0x3120daf2, 0xbd2e21df), TOBN(0x55298d2d, 0x02470a99), TOBN(0x0b78af6c, 0xa05db32e), TOBN(0x5c76a331, 0x601f5636), TOBN(0xaae861ff, 0xf8a4f29c), TOBN(0x70dc9240, 0xd68f8d49), TOBN(0x960e649f, 0x81b1321c), TOBN(0x3d2c801b, 0x8792e4ce), TOBN(0xf479f772, 0x42521876), TOBN(0x0bed93bc, 0x416c79b1), TOBN(0xa67fbc05, 0x263e5bc9), TOBN(0x01e8e630, 0x521db049), TOBN(0x76f26738, 0xc6f3431e), TOBN(0xe609cb02, 0xe3267541), TOBN(0xb10cff2d, 0x818c877c), TOBN(0x1f0e75ce, 0x786a13cb), TOBN(0xf4fdca64, 0x1158544d), TOBN(0x5d777e89, 0x6cb71ed0), TOBN(0x3c233737, 0xa9aa4755), TOBN(0x7b453192, 0xe527ab40), TOBN(0xdb59f688, 0x39f05ffe), TOBN(0x8f4f4be0, 0x6d82574e), TOBN(0xcce3450c, 0xee292d1b), TOBN(0xaa448a12, 0x61ccd086), TOBN(0xabce91b3, 0xf7914967), TOBN(0x4537f09b, 0x1908a5ed), TOBN(0xa812421e, 0xf51042e7), TOBN(0xfaf5cebc, 0xec0b3a34), TOBN(0x730ffd87, 0x4ca6b39a), TOBN(0x70fb72ed, 0x02efd342), TOBN(0xeb4735f9, 0xd75c8edb), TOBN(0xc11f2157, 0xc278aa51), TOBN(0xc459f635, 0xbf3bfebf), TOBN(0x3a1ff0b4, 0x6bd9601f), TOBN(0xc9d12823, 0xc420cb73), TOBN(0x3e9af3e2, 0x3c2915a3), TOBN(0xe0c82c72, 0xb41c3440), TOBN(0x175239e5, 0xe3039a5f), TOBN(0xe1084b8a, 0x558795a3), TOBN(0x328d0a1d, 0xd01e5c60), TOBN(0x0a495f2e, 0xd3788a04), TOBN(0x25d8ff16, 0x66c11a9f), TOBN(0xf5155f05, 0x9ed692d6), TOBN(0x954fa107, 0x4f425fe4), TOBN(0xd16aabf2, 0xe98aaa99), TOBN(0x90cd8ba0, 0x96b0f88a), TOBN(0x957f4782, 0xc154026a), TOBN(0x54ee0734, 0x52af56d2), TOBN(0xbcf89e54, 0x45b4147a), TOBN(0x3d102f21, 0x9a52816c), TOBN(0x6808517e, 0x39b62e77), TOBN(0x92e25421, 0x69169ad8), TOBN(0xd721d871, 0xbb608558), TOBN(0x60e4ebae, 0xf6d4ff9b), TOBN(0x0ba10819, 0x41f2763e), TOBN(0xca2e45be, 0x51ee3247), TOBN(0x66d172ec, 0x2bfd7a5f), TOBN(0x528a8f2f, 0x74d0b12d), TOBN(0xe17f1e38, 0xdabe70dc), TOBN(0x1d5d7316, 0x9f93983c), TOBN(0x51b2184a, 0xdf423e31), TOBN(0xcb417291, 0xaedb1a10), TOBN(0x2054ca93, 0x625bcab9), TOBN(0x54396860, 0xa98998f0), TOBN(0x4e53f6c4, 0xa54ae57e), TOBN(0x0ffeb590, 0xee648e9d), TOBN(0xfbbdaadc, 0x6afaf6bc), TOBN(0xf88ae796, 0xaa3bfb8a), TOBN(0x209f1d44, 0xd2359ed9), TOBN(0xac68dd03, 0xf3544ce2), TOBN(0xf378da47, 0xfd51e569), TOBN(0xe1abd860, 0x2cc80097), TOBN(0x23ca18d9, 0x343b6e3a), TOBN(0x480797e8, 0xb40a1bae), TOBN(0xd1f0c717, 0x533f3e67), TOBN(0x44896970, 0x06e6cdfc), TOBN(0x8ca21055, 0x52a82e8d), TOBN(0xb2caf785, 0x78460cdc), TOBN(0x4c1b7b62, 0xe9037178), TOBN(0xefc09d2c, 0xdb514b58), TOBN(0x5f2df9ee, 0x9113be5c), TOBN(0x2fbda78f, 0xb3f9271c), TOBN(0xe09a81af, 0x8f83fc54), TOBN(0x06b13866, 0x8afb5141), TOBN(0x38f6480f, 0x43e3865d), TOBN(0x72dd77a8, 0x1ddf47d9), TOBN(0xf2a8e971, 0x4c205ff7), TOBN(0x46d449d8, 0x9d088ad8), TOBN(0x926619ea, 0x185d706f), TOBN(0xe47e02eb, 0xc7dd7f62), TOBN(0xe7f120a7, 0x8cbc2031), TOBN(0xc18bef00, 0x998d4ac9), TOBN(0x18f37a9c, 0x6bdf22da), TOBN(0xefbc432f, 0x90dc82df), TOBN(0xc52cef8e, 0x5d703651), TOBN(0x82887ba0, 0xd99881a5), TOBN(0x7cec9dda, 0xb920ec1d), TOBN(0xd0d7e8c3, 0xec3e8d3b), TOBN(0x445bc395, 0x4ca88747), TOBN(0xedeaa2e0, 0x9fd53535), TOBN(0x461b1d93, 0x6cc87475), TOBN(0xd92a52e2, 0x6d2383bd), TOBN(0xfabccb59, 0xd7903546), TOBN(0x6111a761, 0x3d14b112), TOBN(0x0ae584fe, 0xb3d5f612), TOBN(0x5ea69b8d, 0x60e828ec), TOBN(0x6c078985, 0x54087030), TOBN(0x649cab04, 0xac4821fe), TOBN(0x25ecedcf, 0x8bdce214), TOBN(0xb5622f72, 0x86af7361), TOBN(0x0e1227aa, 0x7038b9e2), TOBN(0xd0efb273, 0xac20fa77), TOBN(0x817ff88b, 0x79df975b), TOBN(0x856bf286, 0x1999503e), TOBN(0xb4d5351f, 0x5038ec46), TOBN(0x740a52c5, 0xfc42af6e), TOBN(0x2e38bb15, 0x2cbb1a3f), TOBN(0xc3eb99fe, 0x17a83429), TOBN(0xca4fcbf1, 0xdd66bb74), TOBN(0x880784d6, 0xcde5e8fc), TOBN(0xddc84c1c, 0xb4e7a0be), TOBN(0x8780510d, 0xbd15a72f), TOBN(0x44bcf1af, 0x81ec30e1), TOBN(0x141e50a8, 0x0a61073e), TOBN(0x0d955718, 0x47be87ae), TOBN(0x68a61417, 0xf76a4372), TOBN(0xf57e7e87, 0xc607c3d3), TOBN(0x043afaf8, 0x5252f332), TOBN(0xcc14e121, 0x1552a4d2), TOBN(0xb6dee692, 0xbb4d4ab4), TOBN(0xb6ab74c8, 0xa03816a4), TOBN(0x84001ae4, 0x6f394a29), TOBN(0x5bed8344, 0xd795fb45), TOBN(0x57326e7d, 0xb79f55a5), TOBN(0xc9533ce0, 0x4accdffc), TOBN(0x53473caf, 0x3993fa04), TOBN(0x7906eb93, 0xa13df4c8), TOBN(0xa73e51f6, 0x97cbe46f), TOBN(0xd1ab3ae1, 0x0ae4ccf8), TOBN(0x25614508, 0x8a5b3dbc), TOBN(0x61eff962, 0x11a71b27), TOBN(0xdf71412b, 0x6bb7fa39), TOBN(0xb31ba6b8, 0x2bd7f3ef), TOBN(0xb0b9c415, 0x69180d29), TOBN(0xeec14552, 0x014cdde5), TOBN(0x702c624b, 0x227b4bbb), TOBN(0x2b15e8c2, 0xd3e988f3), TOBN(0xee3bcc6d, 0xa4f7fd04), TOBN(0x9d00822a, 0x42ac6c85), TOBN(0x2db0cea6, 0x1df9f2b7), TOBN(0xd7cad2ab, 0x42de1e58), TOBN(0x346ed526, 0x2d6fbb61), TOBN(0xb3962995, 0x1a2faf09), TOBN(0x2fa8a580, 0x7c25612e), TOBN(0x30ae04da, 0x7cf56490), TOBN(0x75662908, 0x0eea3961), TOBN(0x3609f5c5, 0x3d080847), TOBN(0xcb081d39, 0x5241d4f6), TOBN(0xb4fb3810, 0x77961a63), TOBN(0xc20c5984, 0x2abb66fc), TOBN(0x3d40aa7c, 0xf902f245), TOBN(0x9cb12736, 0x4e536b1e), TOBN(0x5eda24da, 0x99b3134f), TOBN(0xafbd9c69, 0x5cd011af), TOBN(0x9a16e30a, 0xc7088c7d), TOBN(0x5ab65710, 0x3207389f), TOBN(0x1b09547f, 0xe7407a53), TOBN(0x2322f9d7, 0x4fdc6eab), TOBN(0xc0f2f22d, 0x7430de4d), TOBN(0x19382696, 0xe68ca9a9), TOBN(0x17f1eff1, 0x918e5868), TOBN(0xe3b5b635, 0x586f4204), TOBN(0x146ef980, 0x3fbc4341), TOBN(0x359f2c80, 0x5b5eed4e), TOBN(0x9f35744e, 0x7482e41d), TOBN(0x9a9ac3ec, 0xf3b224c2), TOBN(0x9161a6fe, 0x91fc50ae), TOBN(0x89ccc66b, 0xc613fa7c), TOBN(0x89268b14, 0xc732f15a), TOBN(0x7cd6f4e2, 0xb467ed03), TOBN(0xfbf79869, 0xce56b40e), TOBN(0xf93e094c, 0xc02dde98), TOBN(0xefe0c3a8, 0xedee2cd7), TOBN(0x90f3ffc0, 0xb268fd42), TOBN(0x81a7fd56, 0x08241aed), TOBN(0x95ab7ad8, 0x00b1afe8), TOBN(0x40127056, 0x3e310d52), TOBN(0xd3ffdeb1, 0x09d9fc43), TOBN(0xc8f85c91, 0xd11a8594), TOBN(0x2e74d258, 0x31cf6db8), TOBN(0x829c7ca3, 0x02b5dfd0), TOBN(0xe389cfbe, 0x69143c86), TOBN(0xd01b6405, 0x941768d8), TOBN(0x45103995, 0x03bf825d), TOBN(0xcc4ee166, 0x56cd17e2), TOBN(0xbea3c283, 0xba037e79), TOBN(0x4e1ac06e, 0xd9a47520), TOBN(0xfbfe18aa, 0xaf852404), TOBN(0x5615f8e2, 0x8087648a), TOBN(0x7301e47e, 0xb9d150d9), TOBN(0x79f9f9dd, 0xb299b977), TOBN(0x76697a7b, 0xa5b78314), TOBN(0x10d67468, 0x7d7c90e7), TOBN(0x7afffe03, 0x937210b5), TOBN(0x5aef3e4b, 0x28c22cee), TOBN(0xefb0ecd8, 0x09fd55ae), TOBN(0x4cea7132, 0x0d2a5d6a), TOBN(0x9cfb5fa1, 0x01db6357), TOBN(0x395e0b57, 0xf36e1ac5), TOBN(0x008fa9ad, 0x36cafb7d), TOBN(0x8f6cdf70, 0x5308c4db), TOBN(0x51527a37, 0x95ed2477), TOBN(0xba0dee30, 0x5bd21311), TOBN(0x6ed41b22, 0x909c90d7), TOBN(0xc5f6b758, 0x7c8696d3), TOBN(0x0db8eaa8, 0x3ce83a80), TOBN(0xd297fe37, 0xb24b4b6f), TOBN(0xfe58afe8, 0x522d1f0d), TOBN(0x97358736, 0x8c98dbd9), TOBN(0x6bc226ca, 0x9454a527), TOBN(0xa12b384e, 0xce53c2d0), TOBN(0x779d897d, 0x5e4606da), TOBN(0xa53e47b0, 0x73ec12b0), TOBN(0x462dbbba, 0x5756f1ad), TOBN(0x69fe09f2, 0xcafe37b6), TOBN(0x273d1ebf, 0xecce2e17), TOBN(0x8ac1d538, 0x3cf607fd), TOBN(0x8035f7ff, 0x12e10c25)}, {TOBN(0x854d34c7, 0x7e6c5520), TOBN(0xc27df9ef, 0xdcb9ea58), TOBN(0x405f2369, 0xd686666d), TOBN(0x29d1febf, 0x0417aa85), TOBN(0x9846819e, 0x93470afe), TOBN(0x3e6a9669, 0xe2a27f9e), TOBN(0x24d008a2, 0xe31e6504), TOBN(0xdba7cecf, 0x9cb7680a), TOBN(0xecaff541, 0x338d6e43), TOBN(0x56f7dd73, 0x4541d5cc), TOBN(0xb5d426de, 0x96bc88ca), TOBN(0x48d94f6b, 0x9ed3a2c3), TOBN(0x6354a3bb, 0x2ef8279c), TOBN(0xd575465b, 0x0b1867f2), TOBN(0xef99b0ff, 0x95225151), TOBN(0xf3e19d88, 0xf94500d8), TOBN(0x92a83268, 0xe32dd620), TOBN(0x913ec99f, 0x627849a2), TOBN(0xedd8fdfa, 0x2c378882), TOBN(0xaf96f33e, 0xee6f8cfe), TOBN(0xc06737e5, 0xdc3fa8a5), TOBN(0x236bb531, 0xb0b03a1d), TOBN(0x33e59f29, 0x89f037b0), TOBN(0x13f9b5a7, 0xd9a12a53), TOBN(0x0d0df6ce, 0x51efb310), TOBN(0xcb5b2eb4, 0x958df5be), TOBN(0xd6459e29, 0x36158e59), TOBN(0x82aae2b9, 0x1466e336), TOBN(0xfb658a39, 0x411aa636), TOBN(0x7152ecc5, 0xd4c0a933), TOBN(0xf10c758a, 0x49f026b7), TOBN(0xf4837f97, 0xcb09311f), TOBN(0xddfb02c4, 0xc753c45f), TOBN(0x18ca81b6, 0xf9c840fe), TOBN(0x846fd09a, 0xb0f8a3e6), TOBN(0xb1162add, 0xe7733dbc), TOBN(0x7070ad20, 0x236e3ab6), TOBN(0xf88cdaf5, 0xb2a56326), TOBN(0x05fc8719, 0x997cbc7a), TOBN(0x442cd452, 0x4b665272), TOBN(0x7807f364, 0xb71698f5), TOBN(0x6ba418d2, 0x9f7b605e), TOBN(0xfd20b00f, 0xa03b2cbb), TOBN(0x883eca37, 0xda54386f), TOBN(0xff0be43f, 0xf3437f24), TOBN(0xe910b432, 0xa48bb33c), TOBN(0x4963a128, 0x329df765), TOBN(0xac1dd556, 0xbe2fe6f7), TOBN(0x557610f9, 0x24a0a3fc), TOBN(0x38e17bf4, 0xe881c3f9), TOBN(0x6ba84faf, 0xed0dac99), TOBN(0xd4a222c3, 0x59eeb918), TOBN(0xc79c1dbe, 0x13f542b6), TOBN(0x1fc65e0d, 0xe425d457), TOBN(0xeffb754f, 0x1debb779), TOBN(0x638d8fd0, 0x9e08af60), TOBN(0x994f523a, 0x626332d5), TOBN(0x7bc38833, 0x5561bb44), TOBN(0x005ed4b0, 0x3d845ea2), TOBN(0xd39d3ee1, 0xc2a1f08a), TOBN(0x6561fdd3, 0xe7676b0d), TOBN(0x620e35ff, 0xfb706017), TOBN(0x36ce424f, 0xf264f9a8), TOBN(0xc4c3419f, 0xda2681f7), TOBN(0xfb6afd2f, 0x69beb6e8), TOBN(0x3a50b993, 0x6d700d03), TOBN(0xc840b2ad, 0x0c83a14f), TOBN(0x573207be, 0x54085bef), TOBN(0x5af882e3, 0x09fe7e5b), TOBN(0x957678a4, 0x3b40a7e1), TOBN(0x172d4bdd, 0x543056e2), TOBN(0x9c1b26b4, 0x0df13c0a), TOBN(0x1c30861c, 0xf405ff06), TOBN(0xebac86bd, 0x486e828b), TOBN(0xe791a971, 0x636933fc), TOBN(0x50e7c2be, 0x7aeee947), TOBN(0xc3d4a095, 0xfa90d767), TOBN(0xae60eb7b, 0xe670ab7b), TOBN(0x17633a64, 0x397b056d), TOBN(0x93a21f33, 0x105012aa), TOBN(0x663c370b, 0xabb88643), TOBN(0x91df36d7, 0x22e21599), TOBN(0x183ba835, 0x8b761671), TOBN(0x381eea1d, 0x728f3bf1), TOBN(0xb9b2f1ba, 0x39966e6c), TOBN(0x7c464a28, 0xe7295492), TOBN(0x0fd5f70a, 0x09b26b7f), TOBN(0xa9aba1f9, 0xfbe009df), TOBN(0x857c1f22, 0x369b87ad), TOBN(0x3c00e5d9, 0x32fca556), TOBN(0x1ad74cab, 0x90b06466), TOBN(0xa7112386, 0x550faaf2), TOBN(0x7435e198, 0x6d9bd5f5), TOBN(0x2dcc7e38, 0x59c3463f), TOBN(0xdc7df748, 0xca7bd4b2), TOBN(0x13cd4c08, 0x9dec2f31), TOBN(0x0d3b5df8, 0xe3237710), TOBN(0x0dadb26e, 0xcbd2f7b0), TOBN(0x9f5966ab, 0xe4aa082b), TOBN(0x666ec8de, 0x350e966e), TOBN(0x1bfd1ed5, 0xee524216), TOBN(0xcd93c59b, 0x41dab0b6), TOBN(0x658a8435, 0xd186d6ba), TOBN(0x1b7d34d2, 0x159d1195), TOBN(0x5936e460, 0x22caf46b), TOBN(0x6a45dd8f, 0x9a96fe4f), TOBN(0xf7925434, 0xb98f474e), TOBN(0x41410412, 0x0053ef15), TOBN(0x71cf8d12, 0x41de97bf), TOBN(0xb8547b61, 0xbd80bef4), TOBN(0xb47d3970, 0xc4db0037), TOBN(0xf1bcd328, 0xfef20dff), TOBN(0x31a92e09, 0x10caad67), TOBN(0x1f591960, 0x5531a1e1), TOBN(0x3bb852e0, 0x5f4fc840), TOBN(0x63e297ca, 0x93a72c6c), TOBN(0x3c2b0b2e, 0x49abad67), TOBN(0x6ec405fc, 0xed3db0d9), TOBN(0xdc14a530, 0x7fef1d40), TOBN(0xccd19846, 0x280896fc), TOBN(0x00f83176, 0x9bb81648), TOBN(0xd69eb485, 0x653120d0), TOBN(0xd17d75f4, 0x4ccabc62), TOBN(0x34a07f82, 0xb749fcb1), TOBN(0x2c3af787, 0xbbfb5554), TOBN(0xb06ed4d0, 0x62e283f8), TOBN(0x5722889f, 0xa19213a0), TOBN(0x162b085e, 0xdcf3c7b4), TOBN(0xbcaecb31, 0xe0dd3eca), TOBN(0xc6237fbc, 0xe52f13a5), TOBN(0xcc2b6b03, 0x27bac297), TOBN(0x2ae1cac5, 0xb917f54a), TOBN(0x474807d4, 0x7845ae4f), TOBN(0xfec7dd92, 0xce5972e0), TOBN(0xc3bd2541, 0x1d7915bb), TOBN(0x66f85dc4, 0xd94907ca), TOBN(0xd981b888, 0xbdbcf0ca), TOBN(0xd75f5da6, 0xdf279e9f), TOBN(0x128bbf24, 0x7054e934), TOBN(0x3c6ff6e5, 0x81db134b), TOBN(0x795b7cf4, 0x047d26e4), TOBN(0xf370f7b8, 0x5049ec37), TOBN(0xc6712d4d, 0xced945af), TOBN(0xdf30b5ec, 0x095642bc), TOBN(0x9b034c62, 0x4896246e), TOBN(0x5652c016, 0xee90bbd1), TOBN(0xeb38636f, 0x87fedb73), TOBN(0x5e32f847, 0x0135a613), TOBN(0x0703b312, 0xcf933c83), TOBN(0xd05bb76e, 0x1a7f47e6), TOBN(0x825e4f0c, 0x949c2415), TOBN(0x569e5622, 0x7250d6f8), TOBN(0xbbe9eb3a, 0x6568013e), TOBN(0x8dbd203f, 0x22f243fc), TOBN(0x9dbd7694, 0xb342734a), TOBN(0x8f6d12f8, 0x46afa984), TOBN(0xb98610a2, 0xc9eade29), TOBN(0xbab4f323, 0x47dd0f18), TOBN(0x5779737b, 0x671c0d46), TOBN(0x10b6a7c6, 0xd3e0a42a), TOBN(0xfb19ddf3, 0x3035b41c), TOBN(0xd336343f, 0x99c45895), TOBN(0x61fe4938, 0x54c857e5), TOBN(0xc4d506be, 0xae4e57d5), TOBN(0x3cd8c8cb, 0xbbc33f75), TOBN(0x7281f08a, 0x9262c77d), TOBN(0x083f4ea6, 0xf11a2823), TOBN(0x8895041e, 0x9fba2e33), TOBN(0xfcdfea49, 0x9c438edf), TOBN(0x7678dcc3, 0x91edba44), TOBN(0xf07b3b87, 0xe2ba50f0), TOBN(0xc13888ef, 0x43948c1b), TOBN(0xc2135ad4, 0x1140af42), TOBN(0x8e5104f3, 0x926ed1a7), TOBN(0xf24430cb, 0x88f6695f), TOBN(0x0ce0637b, 0x6d73c120), TOBN(0xb2db01e6, 0xfe631e8f), TOBN(0x1c5563d7, 0xd7bdd24b), TOBN(0x8daea3ba, 0x369ad44f), TOBN(0x000c81b6, 0x8187a9f9), TOBN(0x5f48a951, 0xaae1fd9a), TOBN(0xe35626c7, 0x8d5aed8a), TOBN(0x20952763, 0x0498c622), TOBN(0x76d17634, 0x773aa504), TOBN(0x36d90dda, 0xeb300f7a), TOBN(0x9dcf7dfc, 0xedb5e801), TOBN(0x645cb268, 0x74d5244c), TOBN(0xa127ee79, 0x348e3aa2), TOBN(0x488acc53, 0x575f1dbb), TOBN(0x95037e85, 0x80e6161e), TOBN(0x57e59283, 0x292650d0), TOBN(0xabe67d99, 0x14938216), TOBN(0x3c7f944b, 0x3f8e1065), TOBN(0xed908cb6, 0x330e8924), TOBN(0x08ee8fd5, 0x6f530136), TOBN(0x2227b7d5, 0xd7ffc169), TOBN(0x4f55c893, 0xb5cd6dd5), TOBN(0x82225e11, 0xa62796e8), TOBN(0x5c6cead1, 0xcb18e12c), TOBN(0x4381ae0c, 0x84f5a51a), TOBN(0x345913d3, 0x7fafa4c8), TOBN(0x3d918082, 0x0491aac0), TOBN(0x9347871f, 0x3e69264c), TOBN(0xbea9dd3c, 0xb4f4f0cd), TOBN(0xbda5d067, 0x3eadd3e7), TOBN(0x0033c1b8, 0x0573bcd8), TOBN(0x25589379, 0x5da2486c), TOBN(0xcb89ee5b, 0x86abbee7), TOBN(0x8fe0a8f3, 0x22532e5d), TOBN(0xb6410ff0, 0x727dfc4c), TOBN(0x619b9d58, 0x226726db), TOBN(0x5ec25669, 0x7a2b2dc7), TOBN(0xaf4d2e06, 0x4c3beb01), TOBN(0x852123d0, 0x7acea556), TOBN(0x0e9470fa, 0xf783487a), TOBN(0x75a7ea04, 0x5664b3eb), TOBN(0x4ad78f35, 0x6798e4ba), TOBN(0x9214e6e5, 0xc7d0e091), TOBN(0xc420b488, 0xb1290403), TOBN(0x64049e0a, 0xfc295749), TOBN(0x03ef5af1, 0x3ae9841f), TOBN(0xdbe4ca19, 0xb0b662a6), TOBN(0x46845c5f, 0xfa453458), TOBN(0xf8dabf19, 0x10b66722), TOBN(0xb650f0aa, 0xcce2793b), TOBN(0x71db851e, 0xc5ec47c1), TOBN(0x3eb78f3e, 0x3b234fa9), TOBN(0xb0c60f35, 0xfc0106ce), TOBN(0x05427121, 0x774eadbd), TOBN(0x25367faf, 0xce323863), TOBN(0x7541b5c9, 0xcd086976), TOBN(0x4ff069e2, 0xdc507ad1), TOBN(0x74145256, 0x8776e667), TOBN(0x6e76142c, 0xb23c6bb5), TOBN(0xdbf30712, 0x1b3a8a87), TOBN(0x60e7363e, 0x98450836), TOBN(0x5741450e, 0xb7366d80), TOBN(0xe4ee14ca, 0x4837dbdf), TOBN(0xa765eb9b, 0x69d4316f), TOBN(0x04548dca, 0x8ef43825), TOBN(0x9c9f4e4c, 0x5ae888eb), TOBN(0x733abb51, 0x56e9ac99), TOBN(0xdaad3c20, 0xba6ac029), TOBN(0x9b8dd3d3, 0x2ba3e38e), TOBN(0xa9bb4c92, 0x0bc5d11a), TOBN(0xf20127a7, 0x9c5f88a3), TOBN(0x4f52b06e, 0x161d3cb8), TOBN(0x26c1ff09, 0x6afaf0a6), TOBN(0x32670d2f, 0x7189e71f), TOBN(0xc6438748, 0x5ecf91e7), TOBN(0x15758e57, 0xdb757a21), TOBN(0x427d09f8, 0x290a9ce5), TOBN(0x846a308f, 0x38384a7a), TOBN(0xaac3acb4, 0xb0732b99), TOBN(0x9e941009, 0x17845819), TOBN(0x95cba111, 0xa7ce5e03), TOBN(0x6f3d4f7f, 0xb00009c4), TOBN(0xb8396c27, 0x8ff28b5f), TOBN(0xb1a9ae43, 0x1c97975d), TOBN(0x9d7ba8af, 0xe5d9fed5), TOBN(0x338cf09f, 0x34f485b6), TOBN(0xbc0ddacc, 0x64122516), TOBN(0xa450da12, 0x05d471fe), TOBN(0x4c3a6250, 0x628dd8c9), TOBN(0x69c7d103, 0xd1295837), TOBN(0xa2893e50, 0x3807eb2f), TOBN(0xd6e1e1de, 0xbdb41491), TOBN(0xc630745b, 0x5e138235), TOBN(0xc892109e, 0x48661ae1), TOBN(0x8d17e7eb, 0xea2b2674), TOBN(0x00ec0f87, 0xc328d6b5), TOBN(0x6d858645, 0xf079ff9e), TOBN(0x6cdf243e, 0x19115ead), TOBN(0x1ce1393e, 0x4bac4fcf), TOBN(0x2c960ed0, 0x9c29f25b), TOBN(0x59be4d8e, 0x9d388a05), TOBN(0x0d46e06c, 0xd0def72b), TOBN(0xb923db5d, 0xe0342748), TOBN(0xf7d3aacd, 0x936d4a3d), TOBN(0x558519cc, 0x0b0b099e), TOBN(0x3ea8ebf8, 0x827097ef), TOBN(0x259353db, 0xd054f55d), TOBN(0x84c89abc, 0x6d2ed089), TOBN(0x5c548b69, 0x8e096a7c), TOBN(0xd587f616, 0x994b995d), TOBN(0x4d1531f6, 0xa5845601), TOBN(0x792ab31e, 0x451fd9f0), TOBN(0xc8b57bb2, 0x65adf6ca), TOBN(0x68440fcb, 0x1cd5ad73), TOBN(0xb9c860e6, 0x6144da4f), TOBN(0x2ab286aa, 0x8462beb8), TOBN(0xcc6b8fff, 0xef46797f), TOBN(0xac820da4, 0x20c8a471), TOBN(0x69ae05a1, 0x77ff7faf), TOBN(0xb9163f39, 0xbfb5da77), TOBN(0xbd03e590, 0x2c73ab7a), TOBN(0x7e862b5e, 0xb2940d9e), TOBN(0x3c663d86, 0x4b9af564), TOBN(0xd8309031, 0xbde3033d), TOBN(0x298231b2, 0xd42c5bc6), TOBN(0x42090d2c, 0x552ad093), TOBN(0xa4799d1c, 0xff854695), TOBN(0x0a88b5d6, 0xd31f0d00), TOBN(0xf8b40825, 0xa2f26b46), TOBN(0xec29b1ed, 0xf1bd7218), TOBN(0xd491c53b, 0x4b24c86e), TOBN(0xd2fe588f, 0x3395ea65), TOBN(0x6f3764f7, 0x4456ef15), TOBN(0xdb43116d, 0xcdc34800), TOBN(0xcdbcd456, 0xc1e33955), TOBN(0xefdb5540, 0x74ab286b), TOBN(0x948c7a51, 0xd18c5d7c), TOBN(0xeb81aa37, 0x7378058e), TOBN(0x41c746a1, 0x04411154), TOBN(0xa10c73bc, 0xfb828ac7), TOBN(0x6439be91, 0x9d972b29), TOBN(0x4bf3b4b0, 0x43a2fbad), TOBN(0x39e6dadf, 0x82b5e840), TOBN(0x4f716408, 0x6397bd4c), TOBN(0x0f7de568, 0x7f1eeccb), TOBN(0x5865c5a1, 0xd2ffbfc1), TOBN(0xf74211fa, 0x4ccb6451), TOBN(0x66368a88, 0xc0b32558), TOBN(0x5b539dc2, 0x9ad7812e), TOBN(0x579483d0, 0x2f3af6f6), TOBN(0x52132078, 0x99934ece), TOBN(0x50b9650f, 0xdcc9e983), TOBN(0xca989ec9, 0xaee42b8a), TOBN(0x6a44c829, 0xd6f62f99), TOBN(0x8f06a309, 0x4c2a7c0c), TOBN(0x4ea2b3a0, 0x98a0cb0a), TOBN(0x5c547b70, 0xbeee8364), TOBN(0x461d40e1, 0x682afe11), TOBN(0x9e0fc77a, 0x7b41c0a8), TOBN(0x79e4aefd, 0xe20d5d36), TOBN(0x2916e520, 0x32dd9f63), TOBN(0xf59e52e8, 0x3f883faf), TOBN(0x396f9639, 0x2b868d35), TOBN(0xc902a9df, 0x4ca19881), TOBN(0x0fc96822, 0xdb2401a6), TOBN(0x41237587, 0x66f1c68d), TOBN(0x10fc6de3, 0xfb476c0d), TOBN(0xf8b6b579, 0x841f5d90), TOBN(0x2ba8446c, 0xfa24f44a), TOBN(0xa237b920, 0xef4a9975), TOBN(0x60bb6004, 0x2330435f), TOBN(0xd6f4ab5a, 0xcfb7e7b5), TOBN(0xb2ac5097, 0x83435391), TOBN(0xf036ee2f, 0xb0d1ea67), TOBN(0xae779a6a, 0x74c56230), TOBN(0x59bff8c8, 0xab838ae6), TOBN(0xcd83ca99, 0x9b38e6f0), TOBN(0xbb27bef5, 0xe33deed3), TOBN(0xe6356f6f, 0x001892a8), TOBN(0xbf3be6cc, 0x7adfbd3e), TOBN(0xaecbc81c, 0x33d1ac9d), TOBN(0xe4feb909, 0xe6e861dc), TOBN(0x90a247a4, 0x53f5f801), TOBN(0x01c50acb, 0x27346e57), TOBN(0xce29242e, 0x461acc1b), TOBN(0x04dd214a, 0x2f998a91), TOBN(0x271ee9b1, 0xd4baf27b), TOBN(0x7e3027d1, 0xe8c26722), TOBN(0x21d1645c, 0x1820dce5), TOBN(0x086f242c, 0x7501779c), TOBN(0xf0061407, 0xfa0e8009), TOBN(0xf23ce477, 0x60187129), TOBN(0x05bbdedb, 0x0fde9bd0), TOBN(0x682f4832, 0x25d98473), TOBN(0xf207fe85, 0x5c658427), TOBN(0xb6fdd7ba, 0x4166ffa1), TOBN(0x0c314056, 0x9eed799d), TOBN(0x0db8048f, 0x4107e28f), TOBN(0x74ed3871, 0x41216840), TOBN(0x74489f8f, 0x56a3c06e), TOBN(0x1e1c005b, 0x12777134), TOBN(0xdb332a73, 0xf37ec3c3), TOBN(0xc65259bd, 0xdd59eba0), TOBN(0x2291709c, 0xdb4d3257), TOBN(0x9a793b25, 0xbd389390), TOBN(0xf39fe34b, 0xe43756f0), TOBN(0x2f76bdce, 0x9afb56c9), TOBN(0x9f37867a, 0x61208b27), TOBN(0xea1d4307, 0x089972c3), TOBN(0x8c595330, 0x8bdf623a), TOBN(0x5f5accda, 0x8441fb7d), TOBN(0xfafa9418, 0x32ddfd95), TOBN(0x6ad40c5a, 0x0fde9be7), TOBN(0x43faba89, 0xaeca8709), TOBN(0xc64a7cf1, 0x2c248a9d), TOBN(0x16620252, 0x72637a76), TOBN(0xaee1c791, 0x22b8d1bb), TOBN(0xf0f798fd, 0x21a843b2), TOBN(0x56e4ed4d, 0x8d005cb1), TOBN(0x355f7780, 0x1f0d8abe), TOBN(0x197b04cf, 0x34522326), TOBN(0x41f9b31f, 0xfd42c13f), TOBN(0x5ef7feb2, 0xb40f933d), TOBN(0x27326f42, 0x5d60bad4), TOBN(0x027ecdb2, 0x8c92cf89), TOBN(0x04aae4d1, 0x4e3352fe), TOBN(0x08414d2f, 0x73591b90), TOBN(0x5ed6124e, 0xb7da7d60), TOBN(0xb985b931, 0x4d13d4ec), TOBN(0xa592d3ab, 0x96bf36f9), TOBN(0x012dbed5, 0xbbdf51df), TOBN(0xa57963c0, 0xdf6c177d), TOBN(0x010ec869, 0x87ca29cf), TOBN(0xba1700f6, 0xbf926dff), TOBN(0x7c9fdbd1, 0xf4bf6bc2), TOBN(0xdc18dc8f, 0x64da11f5), TOBN(0xa6074b7a, 0xd938ae75), TOBN(0x14270066, 0xe84f44a4), TOBN(0x99998d38, 0xd27b954e), TOBN(0xc1be8ab2, 0xb4f38e9a), TOBN(0x8bb55bbf, 0x15c01016), TOBN(0xf73472b4, 0x0ea2ab30), TOBN(0xd365a340, 0xf73d68dd), TOBN(0xc01a7168, 0x19c2e1eb), TOBN(0x32f49e37, 0x34061719), TOBN(0xb73c57f1, 0x01d8b4d6), TOBN(0x03c8423c, 0x26b47700), TOBN(0x321d0bc8, 0xa4d8826a), TOBN(0x6004213c, 0x4bc0e638), TOBN(0xf78c64a1, 0xc1c06681), TOBN(0x16e0a16f, 0xef018e50), TOBN(0x31cbdf91, 0xdb42b2b3), TOBN(0xf8f4ffce, 0xe0d36f58), TOBN(0xcdcc71cd, 0x4cc5e3e0), TOBN(0xd55c7cfa, 0xa129e3e0), TOBN(0xccdb6ba0, 0x0fb2cbf1), TOBN(0x6aba0005, 0xc4bce3cb), TOBN(0x501cdb30, 0xd232cfc4), TOBN(0x9ddcf12e, 0xd58a3cef), TOBN(0x02d2cf9c, 0x87e09149), TOBN(0xdc5d7ec7, 0x2c976257), TOBN(0x6447986e, 0x0b50d7dd), TOBN(0x88fdbaf7, 0x807f112a), TOBN(0x58c9822a, 0xb00ae9f6), TOBN(0x6abfb950, 0x6d3d27e0), TOBN(0xd0a74487, 0x8a429f4f), TOBN(0x0649712b, 0xdb516609), TOBN(0xb826ba57, 0xe769b5df), TOBN(0x82335df2, 0x1fc7aaf2), TOBN(0x2389f067, 0x5c93d995), TOBN(0x59ac367a, 0x68677be6), TOBN(0xa77985ff, 0x21d9951b), TOBN(0x038956fb, 0x85011cce), TOBN(0x608e48cb, 0xbb734e37), TOBN(0xc08c0bf2, 0x2be5b26f), TOBN(0x17bbdd3b, 0xf9b1a0d9), TOBN(0xeac7d898, 0x10483319), TOBN(0xc95c4baf, 0xbc1a6dea), TOBN(0xfdd0e2bf, 0x172aafdb), TOBN(0x40373cbc, 0x8235c41a), TOBN(0x14303f21, 0xfb6f41d5), TOBN(0xba063621, 0x0408f237), TOBN(0xcad3b09a, 0xecd2d1ed), TOBN(0x4667855a, 0x52abb6a2), TOBN(0xba9157dc, 0xaa8b417b), TOBN(0xfe7f3507, 0x4f013efb), TOBN(0x1b112c4b, 0xaa38c4a2), TOBN(0xa1406a60, 0x9ba64345), TOBN(0xe53cba33, 0x6993c80b), TOBN(0x45466063, 0xded40d23), TOBN(0x3d5f1f4d, 0x54908e25), TOBN(0x9ebefe62, 0x403c3c31), TOBN(0x274ea0b5, 0x0672a624), TOBN(0xff818d99, 0x451d1b71), TOBN(0x80e82643, 0x8f79cf79), TOBN(0xa165df13, 0x73ce37f5), TOBN(0xa744ef4f, 0xfe3a21fd), TOBN(0x73f1e7f5, 0xcf551396), TOBN(0xc616898e, 0x868c676b), TOBN(0x671c28c7, 0x8c442c36), TOBN(0xcfe5e558, 0x5e0a317d), TOBN(0x1242d818, 0x7051f476), TOBN(0x56fad2a6, 0x14f03442), TOBN(0x262068bc, 0x0a44d0f6), TOBN(0xdfa2cd6e, 0xce6edf4e), TOBN(0x0f43813a, 0xd15d1517), TOBN(0x61214cb2, 0x377d44f5), TOBN(0xd399aa29, 0xc639b35f), TOBN(0x42136d71, 0x54c51c19), TOBN(0x9774711b, 0x08417221), TOBN(0x0a5546b3, 0x52545a57), TOBN(0x80624c41, 0x1150582d), TOBN(0x9ec5c418, 0xfbc555bc), TOBN(0x2c87dcad, 0x771849f1), TOBN(0xb0c932c5, 0x01d7bf6f), TOBN(0x6aa5cd3e, 0x89116eb2), TOBN(0xd378c25a, 0x51ca7bd3), TOBN(0xc612a0da, 0x9e6e3e31), TOBN(0x0417a54d, 0xb68ad5d0), TOBN(0x00451e4a, 0x22c6edb8), TOBN(0x9fbfe019, 0xb42827ce), TOBN(0x2fa92505, 0xba9384a2), TOBN(0x21b8596e, 0x64ad69c1), TOBN(0x8f4fcc49, 0x983b35a6), TOBN(0xde093760, 0x72754672), TOBN(0x2f14ccc8, 0xf7bffe6d), TOBN(0x27566bff, 0x5d94263d), TOBN(0xb5b4e9c6, 0x2df3ec30), TOBN(0x94f1d7d5, 0x3e6ea6ba), TOBN(0x97b7851a, 0xaaca5e9b), TOBN(0x518aa521, 0x56713b97), TOBN(0x3357e8c7, 0x150a61f6), TOBN(0x7842e7e2, 0xec2c2b69), TOBN(0x8dffaf65, 0x6868a548), TOBN(0xd963bd82, 0xe068fc81), TOBN(0x64da5c8b, 0x65917733), TOBN(0x927090ff, 0x7b247328)}, {TOBN(0x214bc9a7, 0xd298c241), TOBN(0xe3b697ba, 0x56807cfd), TOBN(0xef1c7802, 0x4564eadb), TOBN(0xdde8cdcf, 0xb48149c5), TOBN(0x946bf0a7, 0x5a4d2604), TOBN(0x27154d7f, 0x6c1538af), TOBN(0x95cc9230, 0xde5b1fcc), TOBN(0xd88519e9, 0x66864f82), TOBN(0xb828dd1a, 0x7cb1282c), TOBN(0xa08d7626, 0xbe46973a), TOBN(0x6baf8d40, 0xe708d6b2), TOBN(0x72571fa1, 0x4daeb3f3), TOBN(0x85b1732f, 0xf22dfd98), TOBN(0x87ab01a7, 0x0087108d), TOBN(0xaaaafea8, 0x5988207a), TOBN(0xccc832f8, 0x69f00755), TOBN(0x964d950e, 0x36ff3bf0), TOBN(0x8ad20f6f, 0xf0b34638), TOBN(0x4d9177b3, 0xb5d7585f), TOBN(0xcf839760, 0xef3f019f), TOBN(0x582fc5b3, 0x8288c545), TOBN(0x2f8e4e9b, 0x13116bd1), TOBN(0xf91e1b2f, 0x332120ef), TOBN(0xcf568724, 0x2a17dd23), TOBN(0x488f1185, 0xca8d9d1a), TOBN(0xadf2c77d, 0xd987ded2), TOBN(0x5f3039f0, 0x60c46124), TOBN(0xe5d70b75, 0x71e095f4), TOBN(0x82d58650, 0x6260e70f), TOBN(0x39d75ea7, 0xf750d105), TOBN(0x8cf3d0b1, 0x75bac364), TOBN(0xf3a7564d, 0x21d01329), TOBN(0x182f04cd, 0x2f52d2a7), TOBN(0x4fde149a, 0xe2df565a), TOBN(0xb80c5eec, 0xa79fb2f7), TOBN(0xab491d7b, 0x22ddc897), TOBN(0x99d76c18, 0xc6312c7f), TOBN(0xca0d5f3d, 0x6aa41a57), TOBN(0x71207325, 0xd15363a0), TOBN(0xe82aa265, 0xbeb252c2), TOBN(0x94ab4700, 0xec3128c2), TOBN(0x6c76d862, 0x8e383f49), TOBN(0xdc36b150, 0xc03024eb), TOBN(0xfb439477, 0x53daac69), TOBN(0xfc68764a, 0x8dc79623), TOBN(0x5b86995d, 0xb440fbb2), TOBN(0xd66879bf, 0xccc5ee0d), TOBN(0x05228942, 0x95aa8bd3), TOBN(0xb51a40a5, 0x1e6a75c1), TOBN(0x24327c76, 0x0ea7d817), TOBN(0x06630182, 0x07774597), TOBN(0xd6fdbec3, 0x97fa7164), TOBN(0x20c99dfb, 0x13c90f48), TOBN(0xd6ac5273, 0x686ef263), TOBN(0xc6a50bdc, 0xfef64eeb), TOBN(0xcd87b281, 0x86fdfc32), TOBN(0xb24aa43e, 0x3fcd3efc), TOBN(0xdd26c034, 0xb8088e9a), TOBN(0xa5ef4dc9, 0xbd3d46ea), TOBN(0xa2f99d58, 0x8a4c6a6f), TOBN(0xddabd355, 0x2f1da46c), TOBN(0x72c3f8ce, 0x1afacdd1), TOBN(0xd90c4eee, 0x92d40578), TOBN(0xd28bb41f, 0xca623b94), TOBN(0x50fc0711, 0x745edc11), TOBN(0x9dd9ad7d, 0x3dc87558), TOBN(0xce6931fb, 0xb49d1e64), TOBN(0x6c77a0a2, 0xc98bd0f9), TOBN(0x62b9a629, 0x6baf7cb1), TOBN(0xcf065f91, 0xccf72d22), TOBN(0x7203cce9, 0x79639071), TOBN(0x09ae4885, 0xf9cb732f), TOBN(0x5e7c3bec, 0xee8314f3), TOBN(0x1c068aed, 0xdbea298f), TOBN(0x08d381f1, 0x7c80acec), TOBN(0x03b56be8, 0xe330495b), TOBN(0xaeffb8f2, 0x9222882d), TOBN(0x95ff38f6, 0xc4af8bf7), TOBN(0x50e32d35, 0x1fc57d8c), TOBN(0x6635be52, 0x17b444f0), TOBN(0x04d15276, 0xa5177900), TOBN(0x4e1dbb47, 0xf6858752), TOBN(0x5b475622, 0xc615796c), TOBN(0xa6fa0387, 0x691867bf), TOBN(0xed7f5d56, 0x2844c6d0), TOBN(0xc633cf9b, 0x03a2477d), TOBN(0xf6be5c40, 0x2d3721d6), TOBN(0xaf312eb7, 0xe9fd68e6), TOBN(0x242792d2, 0xe7417ce1), TOBN(0xff42bc71, 0x970ee7f5), TOBN(0x1ff4dc6d, 0x5c67a41e), TOBN(0x77709b7b, 0x20882a58), TOBN(0x3554731d, 0xbe217f2c), TOBN(0x2af2a8cd, 0x5bb72177), TOBN(0x58eee769, 0x591dd059), TOBN(0xbb2930c9, 0x4bba6477), TOBN(0x863ee047, 0x7d930cfc), TOBN(0x4c262ad1, 0x396fd1f4), TOBN(0xf4765bc8, 0x039af7e1), TOBN(0x2519834b, 0x5ba104f6), TOBN(0x7cd61b4c, 0xd105f961), TOBN(0xa5415da5, 0xd63bca54), TOBN(0x778280a0, 0x88a1f17c), TOBN(0xc4968949, 0x2329512c), TOBN(0x174a9126, 0xcecdaa7a), TOBN(0xfc8c7e0e, 0x0b13247b), TOBN(0x29c110d2, 0x3484c1c4), TOBN(0xf8eb8757, 0x831dfc3b), TOBN(0x022f0212, 0xc0067452), TOBN(0x3f6f69ee, 0x7b9b926c), TOBN(0x09032da0, 0xef42daf4), TOBN(0x79f00ade, 0x83f80de4), TOBN(0x6210db71, 0x81236c97), TOBN(0x74f7685b, 0x3ee0781f), TOBN(0x4df7da7b, 0xa3e41372), TOBN(0x2aae38b1, 0xb1a1553e), TOBN(0x1688e222, 0xf6dd9d1b), TOBN(0x57695448, 0x5b8b6487), TOBN(0x478d2127, 0x4b2edeaa), TOBN(0xb2818fa5, 0x1e85956a), TOBN(0x1e6addda, 0xf176f2c0), TOBN(0x01ca4604, 0xe2572658), TOBN(0x0a404ded, 0x85342ffb), TOBN(0x8cf60f96, 0x441838d6), TOBN(0x9bbc691c, 0xc9071c4a), TOBN(0xfd588744, 0x34442803), TOBN(0x97101c85, 0x809c0d81), TOBN(0xa7fb754c, 0x8c456f7f), TOBN(0xc95f3c5c, 0xd51805e1), TOBN(0xab4ccd39, 0xb299dca8), TOBN(0x3e03d20b, 0x47eaf500), TOBN(0xfa3165c1, 0xd7b80893), TOBN(0x005e8b54, 0xe160e552), TOBN(0xdc4972ba, 0x9019d11f), TOBN(0x21a6972e, 0x0c9a4a7a), TOBN(0xa52c258f, 0x37840fd7), TOBN(0xf8559ff4, 0xc1e99d81), TOBN(0x08e1a7d6, 0xa3c617c0), TOBN(0xb398fd43, 0x248c6ba7), TOBN(0x6ffedd91, 0xd1283794), TOBN(0x8a6a59d2, 0xd629d208), TOBN(0xa9d141d5, 0x3490530e), TOBN(0x42f6fc18, 0x38505989), TOBN(0x09bf250d, 0x479d94ee), TOBN(0x223ad3b1, 0xb3822790), TOBN(0x6c5926c0, 0x93b8971c), TOBN(0x609efc7e, 0x75f7fa62), TOBN(0x45d66a6d, 0x1ec2d989), TOBN(0x4422d663, 0x987d2792), TOBN(0x4a73caad, 0x3eb31d2b), TOBN(0xf06c2ac1, 0xa32cb9e6), TOBN(0xd9445c5f, 0x91aeba84), TOBN(0x6af7a1d5, 0xaf71013f), TOBN(0xe68216e5, 0x0bedc946), TOBN(0xf4cba30b, 0xd27370a0), TOBN(0x7981afbf, 0x870421cc), TOBN(0x02496a67, 0x9449f0e1), TOBN(0x86cfc4be, 0x0a47edae), TOBN(0x3073c936, 0xb1feca22), TOBN(0xf5694612, 0x03f8f8fb), TOBN(0xd063b723, 0x901515ea), TOBN(0x4c6c77a5, 0x749cf038), TOBN(0x6361e360, 0xab9e5059), TOBN(0x596cf171, 0xa76a37c0), TOBN(0x800f53fa, 0x6530ae7a), TOBN(0x0f5e631e, 0x0792a7a6), TOBN(0x5cc29c24, 0xefdb81c9), TOBN(0xa269e868, 0x3f9c40ba), TOBN(0xec14f9e1, 0x2cb7191e), TOBN(0x78ea1bd8, 0xe5b08ea6), TOBN(0x3c65aa9b, 0x46332bb9), TOBN(0x84cc22b3, 0xbf80ce25), TOBN(0x0098e9e9, 0xd49d5bf1), TOBN(0xcd4ec1c6, 0x19087da4), TOBN(0x3c9d07c5, 0xaef6e357), TOBN(0x839a0268, 0x9f8f64b8), TOBN(0xc5e9eb62, 0xc6d8607f), TOBN(0x759689f5, 0x6aa995e4), TOBN(0x70464669, 0xbbb48317), TOBN(0x921474bf, 0xe402417d), TOBN(0xcabe135b, 0x2a354c8c), TOBN(0xd51e52d2, 0x812fa4b5), TOBN(0xec741096, 0x53311fe8), TOBN(0x4f774535, 0xb864514b), TOBN(0xbcadd671, 0x5bde48f8), TOBN(0xc9703873, 0x2189bc7d), TOBN(0x5d45299e, 0xc709ee8a), TOBN(0xd1287ee2, 0x845aaff8), TOBN(0x7d1f8874, 0xdb1dbf1f), TOBN(0xea46588b, 0x990c88d6), TOBN(0x60ba649a, 0x84368313), TOBN(0xd5fdcbce, 0x60d543ae), TOBN(0x90b46d43, 0x810d5ab0), TOBN(0x6739d8f9, 0x04d7e5cc), TOBN(0x021c1a58, 0x0d337c33), TOBN(0x00a61162, 0x68e67c40), TOBN(0x95ef413b, 0x379f0a1f), TOBN(0xfe126605, 0xe9e2ab95), TOBN(0x67578b85, 0x2f5f199c), TOBN(0xf5c00329, 0x2cb84913), TOBN(0xf7956430, 0x37577dd8), TOBN(0x83b82af4, 0x29c5fe88), TOBN(0x9c1bea26, 0xcdbdc132), TOBN(0x589fa086, 0x9c04339e), TOBN(0x033e9538, 0xb13799df), TOBN(0x85fa8b21, 0xd295d034), TOBN(0xdf17f73f, 0xbd9ddcca), TOBN(0xf32bd122, 0xddb66334), TOBN(0x55ef88a7, 0x858b044c), TOBN(0x1f0d69c2, 0x5aa9e397), TOBN(0x55fd9cc3, 0x40d85559), TOBN(0xc774df72, 0x7785ddb2), TOBN(0x5dcce9f6, 0xd3bd2e1c), TOBN(0xeb30da20, 0xa85dfed0), TOBN(0x5ed7f5bb, 0xd3ed09c4), TOBN(0x7d42a35c, 0x82a9c1bd), TOBN(0xcf3de995, 0x9890272d), TOBN(0x75f3432a, 0x3e713a10), TOBN(0x5e13479f, 0xe28227b8), TOBN(0xb8561ea9, 0xfefacdc8), TOBN(0xa6a297a0, 0x8332aafd), TOBN(0x9b0d8bb5, 0x73809b62), TOBN(0xd2fa1cfd, 0x0c63036f), TOBN(0x7a16eb55, 0xbd64bda8), TOBN(0x3f5cf5f6, 0x78e62ddc), TOBN(0x2267c454, 0x07fd752b), TOBN(0x5e361b6b, 0x5e437bbe), TOBN(0x95c59501, 0x8354e075), TOBN(0xec725f85, 0xf2b254d9), TOBN(0x844b617d, 0x2cb52b4e), TOBN(0xed8554f5, 0xcf425fb5), TOBN(0xab67703e, 0x2af9f312), TOBN(0x4cc34ec1, 0x3cf48283), TOBN(0xb09daa25, 0x9c8a705e), TOBN(0xd1e9d0d0, 0x5b7d4f84), TOBN(0x4df6ef64, 0xdb38929d), TOBN(0xe16b0763, 0xaa21ba46), TOBN(0xc6b1d178, 0xa293f8fb), TOBN(0x0ff5b602, 0xd520aabf), TOBN(0x94d671bd, 0xc339397a), TOBN(0x7c7d98cf, 0x4f5792fa), TOBN(0x7c5e0d67, 0x11215261), TOBN(0x9b19a631, 0xa7c5a6d4), TOBN(0xc8511a62, 0x7a45274d), TOBN(0x0c16621c, 0xa5a60d99), TOBN(0xf7fbab88, 0xcf5e48cb), TOBN(0xab1e6ca2, 0xf7ddee08), TOBN(0x83bd08ce, 0xe7867f3c), TOBN(0xf7e48e8a, 0x2ac13e27), TOBN(0x4494f6df, 0x4eb1a9f5), TOBN(0xedbf84eb, 0x981f0a62), TOBN(0x49badc32, 0x536438f0), TOBN(0x50bea541, 0x004f7571), TOBN(0xbac67d10, 0xdf1c94ee), TOBN(0x253d73a1, 0xb727bc31), TOBN(0xb3d01cf2, 0x30686e28), TOBN(0x51b77b1b, 0x55fd0b8b), TOBN(0xa099d183, 0xfeec3173), TOBN(0x202b1fb7, 0x670e72b7), TOBN(0xadc88b33, 0xa8e1635f), TOBN(0x34e8216a, 0xf989d905), TOBN(0xc2e68d20, 0x29b58d01), TOBN(0x11f81c92, 0x6fe55a93), TOBN(0x15f1462a, 0x8f296f40), TOBN(0x1915d375, 0xea3d62f2), TOBN(0xa17765a3, 0x01c8977d), TOBN(0x7559710a, 0xe47b26f6), TOBN(0xe0bd29c8, 0x535077a5), TOBN(0x615f976d, 0x08d84858), TOBN(0x370dfe85, 0x69ced5c1), TOBN(0xbbc7503c, 0xa734fa56), TOBN(0xfbb9f1ec, 0x91ac4574), TOBN(0x95d7ec53, 0x060dd7ef), TOBN(0xeef2dacd, 0x6e657979), TOBN(0x54511af3, 0xe2a08235), TOBN(0x1e324aa4, 0x1f4aea3d), TOBN(0x550e7e71, 0xe6e67671), TOBN(0xbccd5190, 0xbf52faf7), TOBN(0xf880d316, 0x223cc62a), TOBN(0x0d402c7e, 0x2b32eb5d), TOBN(0xa40bc039, 0x306a5a3b), TOBN(0x4e0a41fd, 0x96783a1b), TOBN(0xa1e8d39a, 0x0253cdd4), TOBN(0x6480be26, 0xc7388638), TOBN(0xee365e1d, 0x2285f382), TOBN(0x188d8d8f, 0xec0b5c36), TOBN(0x34ef1a48, 0x1f0f4d82), TOBN(0x1a8f43e1, 0xa487d29a), TOBN(0x8168226d, 0x77aefb3a), TOBN(0xf69a751e, 0x1e72c253), TOBN(0x8e04359a, 0xe9594df1), TOBN(0x475ffd7d, 0xd14c0467), TOBN(0xb5a2c2b1, 0x3844e95c), TOBN(0x85caf647, 0xdd12ef94), TOBN(0x1ecd2a9f, 0xf1063d00), TOBN(0x1dd2e229, 0x23843311), TOBN(0x38f0e09d, 0x73d17244), TOBN(0x3ede7746, 0x8fc653f1), TOBN(0xae4459f5, 0xdc20e21c), TOBN(0x00db2ffa, 0x6a8599ea), TOBN(0x11682c39, 0x30cfd905), TOBN(0x4934d074, 0xa5c112a6), TOBN(0xbdf063c5, 0x568bfe95), TOBN(0x779a440a, 0x016c441a), TOBN(0x0c23f218, 0x97d6fbdc), TOBN(0xd3a5cd87, 0xe0776aac), TOBN(0xcee37f72, 0xd712e8db), TOBN(0xfb28c70d, 0x26f74e8d), TOBN(0xffe0c728, 0xb61301a0), TOBN(0xa6282168, 0xd3724354), TOBN(0x7ff4cb00, 0x768ffedc), TOBN(0xc51b3088, 0x03b02de9), TOBN(0xa5a8147c, 0x3902dda5), TOBN(0x35d2f706, 0xfe6973b4), TOBN(0x5ac2efcf, 0xc257457e), TOBN(0x933f48d4, 0x8700611b), TOBN(0xc365af88, 0x4912beb2), TOBN(0x7f5a4de6, 0x162edf94), TOBN(0xc646ba7c, 0x0c32f34b), TOBN(0x632c6af3, 0xb2091074), TOBN(0x58d4f2e3, 0x753e43a9), TOBN(0x70e1d217, 0x24d4e23f), TOBN(0xb24bf729, 0xafede6a6), TOBN(0x7f4a94d8, 0x710c8b60), TOBN(0xaad90a96, 0x8d4faa6a), TOBN(0xd9ed0b32, 0xb066b690), TOBN(0x52fcd37b, 0x78b6dbfd), TOBN(0x0b64615e, 0x8bd2b431), TOBN(0x228e2048, 0xcfb9fad5), TOBN(0xbeaa386d, 0x240b76bd), TOBN(0x2d6681c8, 0x90dad7bc), TOBN(0x3e553fc3, 0x06d38f5e), TOBN(0xf27cdb9b, 0x9d5f9750), TOBN(0x3e85c52a, 0xd28c5b0e), TOBN(0x190795af, 0x5247c39b), TOBN(0x547831eb, 0xbddd6828), TOBN(0xf327a227, 0x4a82f424), TOBN(0x36919c78, 0x7e47f89d), TOBN(0xe4783919, 0x43c7392c), TOBN(0xf101b9aa, 0x2316fefe), TOBN(0xbcdc9e9c, 0x1c5009d2), TOBN(0xfb55ea13, 0x9cd18345), TOBN(0xf5b5e231, 0xa3ce77c7), TOBN(0xde6b4527, 0xd2f2cb3d), TOBN(0x10f6a333, 0x9bb26f5f), TOBN(0x1e85db8e, 0x044d85b6), TOBN(0xc3697a08, 0x94197e54), TOBN(0x65e18cc0, 0xa7cb4ea8), TOBN(0xa38c4f50, 0xa471fe6e), TOBN(0xf031747a, 0x2f13439c), TOBN(0x53c4a6ba, 0xc007318b), TOBN(0xa8da3ee5, 0x1deccb3d), TOBN(0x0555b31c, 0x558216b1), TOBN(0x90c7810c, 0x2f79e6c2), TOBN(0x9b669f4d, 0xfe8eed3c), TOBN(0x70398ec8, 0xe0fac126), TOBN(0xa96a449e, 0xf701b235), TOBN(0x0ceecdb3, 0xeb94f395), TOBN(0x285fc368, 0xd0cb7431), TOBN(0x0d37bb52, 0x16a18c64), TOBN(0x05110d38, 0xb880d2dd), TOBN(0xa60f177b, 0x65930d57), TOBN(0x7da34a67, 0xf36235f5), TOBN(0x47f5e17c, 0x183816b9), TOBN(0xc7664b57, 0xdb394af4), TOBN(0x39ba215d, 0x7036f789), TOBN(0x46d2ca0e, 0x2f27b472), TOBN(0xc42647ee, 0xf73a84b7), TOBN(0x44bc7545, 0x64488f1d), TOBN(0xaa922708, 0xf4cf85d5), TOBN(0x721a01d5, 0x53e4df63), TOBN(0x649c0c51, 0x5db46ced), TOBN(0x6bf0d64e, 0x3cffcb6c), TOBN(0xe3bf93fe, 0x50f71d96), TOBN(0x75044558, 0xbcc194a0), TOBN(0x16ae3372, 0x6afdc554), TOBN(0xbfc01adf, 0x5ca48f3f), TOBN(0x64352f06, 0xe22a9b84), TOBN(0xcee54da1, 0xc1099e4a), TOBN(0xbbda54e8, 0xfa1b89c0), TOBN(0x166a3df5, 0x6f6e55fb), TOBN(0x1ca44a24, 0x20176f88), TOBN(0x936afd88, 0xdfb7b5ff), TOBN(0xe34c2437, 0x8611d4a0), TOBN(0x7effbb75, 0x86142103), TOBN(0x6704ba1b, 0x1f34fc4d), TOBN(0x7c2a468f, 0x10c1b122), TOBN(0x36b3a610, 0x8c6aace9), TOBN(0xabfcc0a7, 0x75a0d050), TOBN(0x066f9197, 0x3ce33e32), TOBN(0xce905ef4, 0x29fe09be), TOBN(0x89ee25ba, 0xa8376351), TOBN(0x2a3ede22, 0xfd29dc76), TOBN(0x7fd32ed9, 0x36f17260), TOBN(0x0cadcf68, 0x284b4126), TOBN(0x63422f08, 0xa7951fc8), TOBN(0x562b24f4, 0x0807e199), TOBN(0xfe9ce5d1, 0x22ad4490), TOBN(0xc2f51b10, 0x0db2b1b4), TOBN(0xeb3613ff, 0xe4541d0d), TOBN(0xbd2c4a05, 0x2680813b), TOBN(0x527aa55d, 0x561b08d6), TOBN(0xa9f8a40e, 0xa7205558), TOBN(0xe3eea56f, 0x243d0bec), TOBN(0x7b853817, 0xa0ff58b3), TOBN(0xb67d3f65, 0x1a69e627), TOBN(0x0b76bbb9, 0xa869b5d6), TOBN(0xa3afeb82, 0x546723ed), TOBN(0x5f24416d, 0x3e554892), TOBN(0x8413b53d, 0x430e2a45), TOBN(0x99c56aee, 0x9032a2a0), TOBN(0x09432bf6, 0xeec367b1), TOBN(0x552850c6, 0xdaf0ecc1), TOBN(0x49ebce55, 0x5bc92048), TOBN(0xdfb66ba6, 0x54811307), TOBN(0x1b84f797, 0x6f298597), TOBN(0x79590481, 0x8d1d7a0d), TOBN(0xd9fabe03, 0x3a6fa556), TOBN(0xa40f9c59, 0xba9e5d35), TOBN(0xcb1771c1, 0xf6247577), TOBN(0x542a47ca, 0xe9a6312b), TOBN(0xa34b3560, 0x552dd8c5), TOBN(0xfdf94de0, 0x0d794716), TOBN(0xd46124a9, 0x9c623094), TOBN(0x56b7435d, 0x68afe8b4), TOBN(0x27f20540, 0x6c0d8ea1), TOBN(0x12b77e14, 0x73186898), TOBN(0xdbc3dd46, 0x7479490f), TOBN(0x951a9842, 0xc03b0c05), TOBN(0x8b1b3bb3, 0x7921bc96), TOBN(0xa573b346, 0x2b202e0a), TOBN(0x77e4665d, 0x47254d56), TOBN(0x08b70dfc, 0xd23e3984), TOBN(0xab86e8bc, 0xebd14236), TOBN(0xaa3e07f8, 0x57114ba7), TOBN(0x5ac71689, 0xab0ef4f2), TOBN(0x88fca384, 0x0139d9af), TOBN(0x72733f88, 0x76644af0), TOBN(0xf122f72a, 0x65d74f4a), TOBN(0x13931577, 0xa5626c7a), TOBN(0xd5b5d9eb, 0x70f8d5a4), TOBN(0x375adde7, 0xd7bbb228), TOBN(0x31e88b86, 0x0c1c0b32), TOBN(0xd1f568c4, 0x173edbaa), TOBN(0x1592fc83, 0x5459df02), TOBN(0x2beac0fb, 0x0fcd9a7e), TOBN(0xb0a6fdb8, 0x1b473b0a), TOBN(0xe3224c6f, 0x0fe8fc48), TOBN(0x680bd00e, 0xe87edf5b), TOBN(0x30385f02, 0x20e77cf5), TOBN(0xe9ab98c0, 0x4d42d1b2), TOBN(0x72d191d2, 0xd3816d77), TOBN(0x1564daca, 0x0917d9e5), TOBN(0x394eab59, 0x1f8fed7f), TOBN(0xa209aa8d, 0x7fbb3896), TOBN(0x5564f3b9, 0xbe6ac98e), TOBN(0xead21d05, 0xd73654ef), TOBN(0x68d1a9c4, 0x13d78d74), TOBN(0x61e01708, 0x6d4973a0), TOBN(0x83da3500, 0x46e6d32a), TOBN(0x6a3dfca4, 0x68ae0118), TOBN(0xa1b9a4c9, 0xd02da069), TOBN(0x0b2ff9c7, 0xebab8302), TOBN(0x98af07c3, 0x944ba436), TOBN(0x85997326, 0x995f0f9f), TOBN(0x467fade0, 0x71b58bc6), TOBN(0x47e4495a, 0xbd625a2b), TOBN(0xfdd2d01d, 0x33c3b8cd), TOBN(0x2c38ae28, 0xc693f9fa), TOBN(0x48622329, 0x348f7999), TOBN(0x97bf738e, 0x2161f583), TOBN(0x15ee2fa7, 0x565e8cc9), TOBN(0xa1a5c845, 0x5777e189), TOBN(0xcc10bee0, 0x456f2829), TOBN(0x8ad95c56, 0xda762bd5), TOBN(0x152e2214, 0xe9d91da8), TOBN(0x975b0e72, 0x7cb23c74), TOBN(0xfd5d7670, 0xa90c66df), TOBN(0xb5b5b8ad, 0x225ffc53), TOBN(0xab6dff73, 0xfaded2ae), TOBN(0xebd56781, 0x6f4cbe9d), TOBN(0x0ed8b249, 0x6a574bd7), TOBN(0x41c246fe, 0x81a881fa), TOBN(0x91564805, 0xc3db9c70), TOBN(0xd7c12b08, 0x5b862809), TOBN(0x1facd1f1, 0x55858d7b), TOBN(0x7693747c, 0xaf09e92a), TOBN(0x3b69dcba, 0x189a425f), TOBN(0x0be28e9f, 0x967365ef), TOBN(0x57300eb2, 0xe801f5c9), TOBN(0x93b8ac6a, 0xd583352f), TOBN(0xa2cf1f89, 0xcd05b2b7), TOBN(0x7c0c9b74, 0x4dcc40cc), TOBN(0xfee38c45, 0xada523fb), TOBN(0xb49a4dec, 0x1099cc4d), TOBN(0x325c377f, 0x69f069c6), TOBN(0xe12458ce, 0x476cc9ff), TOBN(0x580e0b6c, 0xc6d4cb63), TOBN(0xd561c8b7, 0x9072289b), TOBN(0x0377f264, 0xa619e6da), TOBN(0x26685362, 0x88e591a5), TOBN(0xa453a7bd, 0x7523ca2b), TOBN(0x8a9536d2, 0xc1df4533), TOBN(0xc8e50f2f, 0xbe972f79), TOBN(0xd433e50f, 0x6d3549cf), TOBN(0x6f33696f, 0xfacd665e), TOBN(0x695bfdac, 0xce11fcb4), TOBN(0x810ee252, 0xaf7c9860), TOBN(0x65450fe1, 0x7159bb2c), TOBN(0xf7dfbebe, 0x758b357b), TOBN(0x2b057e74, 0xd69fea72), TOBN(0xd485717a, 0x92731745)}, {TOBN(0x896c42e8, 0xee36860c), TOBN(0xdaf04dfd, 0x4113c22d), TOBN(0x1adbb7b7, 0x44104213), TOBN(0xe5fd5fa1, 0x1fd394ea), TOBN(0x68235d94, 0x1a4e0551), TOBN(0x6772cfbe, 0x18d10151), TOBN(0x276071e3, 0x09984523), TOBN(0xe4e879de, 0x5a56ba98), TOBN(0xaaafafb0, 0x285b9491), TOBN(0x01a0be88, 0x1e4c705e), TOBN(0xff1d4f5d, 0x2ad9caab), TOBN(0x6e349a4a, 0xc37a233f), TOBN(0xcf1c1246, 0x4a1c6a16), TOBN(0xd99e6b66, 0x29383260), TOBN(0xea3d4366, 0x5f6d5471), TOBN(0x36974d04, 0xff8cc89b), TOBN(0xc26c49a1, 0xcfe89d80), TOBN(0xb42c026d, 0xda9c8371), TOBN(0xca6c013a, 0xdad066d2), TOBN(0xfb8f7228, 0x56a4f3ee), TOBN(0x08b579ec, 0xd850935b), TOBN(0x34c1a74c, 0xd631e1b3), TOBN(0xcb5fe596, 0xac198534), TOBN(0x39ff21f6, 0xe1f24f25), TOBN(0x27f29e14, 0x8f929057), TOBN(0x7a64ae06, 0xc0c853df), TOBN(0x256cd183, 0x58e9c5ce), TOBN(0x9d9cce82, 0xded092a5), TOBN(0xcc6e5979, 0x6e93b7c7), TOBN(0xe1e47092, 0x31bb9e27), TOBN(0xb70b3083, 0xaa9e29a0), TOBN(0xbf181a75, 0x3785e644), TOBN(0xf53f2c65, 0x8ead09f7), TOBN(0x1335e1d5, 0x9780d14d), TOBN(0x69cc20e0, 0xcd1b66bc), TOBN(0x9b670a37, 0xbbe0bfc8), TOBN(0xce53dc81, 0x28efbeed), TOBN(0x0c74e77c, 0x8326a6e5), TOBN(0x3604e0d2, 0xb88e9a63), TOBN(0xbab38fca, 0x13dc2248), TOBN(0x8ed6e8c8, 0x5c0a3f1e), TOBN(0xbcad2492, 0x7c87c37f), TOBN(0xfdfb62bb, 0x9ee3b78d), TOBN(0xeba8e477, 0xcbceba46), TOBN(0x37d38cb0, 0xeeaede4b), TOBN(0x0bc498e8, 0x7976deb6), TOBN(0xb2944c04, 0x6b6147fb), TOBN(0x8b123f35, 0xf71f9609), TOBN(0xa155dcc7, 0xde79dc24), TOBN(0xf1168a32, 0x558f69cd), TOBN(0xbac21595, 0x0d1850df), TOBN(0x15c8295b, 0xb204c848), TOBN(0xf661aa36, 0x7d8184ff), TOBN(0xc396228e, 0x30447bdb), TOBN(0x11cd5143, 0xbde4a59e), TOBN(0xe3a26e3b, 0x6beab5e6), TOBN(0xd3b3a13f, 0x1402b9d0), TOBN(0x573441c3, 0x2c7bc863), TOBN(0x4b301ec4, 0x578c3e6e), TOBN(0xc26fc9c4, 0x0adaf57e), TOBN(0x96e71bfd, 0x7493cea3), TOBN(0xd05d4b3f, 0x1af81456), TOBN(0xdaca2a8a, 0x6a8c608f), TOBN(0x53ef07f6, 0x0725b276), TOBN(0x07a5fbd2, 0x7824fc56), TOBN(0x34675218, 0x13289077), TOBN(0x5bf69fd5, 0xe0c48349), TOBN(0xa613ddd3, 0xb6aa7875), TOBN(0x7f78c19c, 0x5450d866), TOBN(0x46f4409c, 0x8f84a481), TOBN(0x9f1d1928, 0x90fce239), TOBN(0x016c4168, 0xb2ce44b9), TOBN(0xbae023f0, 0xc7435978), TOBN(0xb152c888, 0x20e30e19), TOBN(0x9c241645, 0xe3fa6faf), TOBN(0x735d95c1, 0x84823e60), TOBN(0x03197573, 0x03955317), TOBN(0x0b4b02a9, 0xf03b4995), TOBN(0x076bf559, 0x70274600), TOBN(0x32c5cc53, 0xaaf57508), TOBN(0xe8af6d1f, 0x60624129), TOBN(0xb7bc5d64, 0x9a5e2b5e), TOBN(0x3814b048, 0x5f082d72), TOBN(0x76f267f2, 0xce19677a), TOBN(0x626c630f, 0xb36eed93), TOBN(0x55230cd7, 0x3bf56803), TOBN(0x78837949, 0xce2736a0), TOBN(0x0d792d60, 0xaa6c55f1), TOBN(0x0318dbfd, 0xd5c7c5d2), TOBN(0xb38f8da7, 0x072b342d), TOBN(0x3569bddc, 0x7b8de38a), TOBN(0xf25b5887, 0xa1c94842), TOBN(0xb2d5b284, 0x2946ad60), TOBN(0x854f29ad, 0xe9d1707e), TOBN(0xaa5159dc, 0x2c6a4509), TOBN(0x899f94c0, 0x57189837), TOBN(0xcf6adc51, 0xf4a55b03), TOBN(0x261762de, 0x35e3b2d5), TOBN(0x4cc43012, 0x04827b51), TOBN(0xcd22a113, 0xc6021442), TOBN(0xce2fd61a, 0x247c9569), TOBN(0x59a50973, 0xd152beca), TOBN(0x6c835a11, 0x63a716d4), TOBN(0xc26455ed, 0x187dedcf), TOBN(0x27f536e0, 0x49ce89e7), TOBN(0x18908539, 0xcc890cb5), TOBN(0x308909ab, 0xd83c2aa1), TOBN(0xecd3142b, 0x1ab73bd3), TOBN(0x6a85bf59, 0xb3f5ab84), TOBN(0x3c320a68, 0xf2bea4c6), TOBN(0xad8dc538, 0x6da4541f), TOBN(0xeaf34eb0, 0xb7c41186), TOBN(0x1c780129, 0x977c97c4), TOBN(0x5ff9beeb, 0xc57eb9fa), TOBN(0xa24d0524, 0xc822c478), TOBN(0xfd8eec2a, 0x461cd415), TOBN(0xfbde194e, 0xf027458c), TOBN(0xb4ff5319, 0x1d1be115), TOBN(0x63f874d9, 0x4866d6f4), TOBN(0x35c75015, 0xb21ad0c9), TOBN(0xa6b5c9d6, 0x46ac49d2), TOBN(0x42c77c0b, 0x83137aa9), TOBN(0x24d000fc, 0x68225a38), TOBN(0x0f63cfc8, 0x2fe1e907), TOBN(0x22d1b01b, 0xc6441f95), TOBN(0x7d38f719, 0xec8e448f), TOBN(0x9b33fa5f, 0x787fb1ba), TOBN(0x94dcfda1, 0x190158df), TOBN(0xc47cb339, 0x5f6d4a09), TOBN(0x6b4f355c, 0xee52b826), TOBN(0x3d100f5d, 0xf51b930a), TOBN(0xf4512fac, 0x9f668f69), TOBN(0x546781d5, 0x206c4c74), TOBN(0xd021d4d4, 0xcb4d2e48), TOBN(0x494a54c2, 0xca085c2d), TOBN(0xf1dbaca4, 0x520850a8), TOBN(0x63c79326, 0x490a1aca), TOBN(0xcb64dd9c, 0x41526b02), TOBN(0xbb772591, 0xa2979258), TOBN(0x3f582970, 0x48d97846), TOBN(0xd66b70d1, 0x7c213ba7), TOBN(0xc28febb5, 0xe8a0ced4), TOBN(0x6b911831, 0xc10338c1), TOBN(0x0d54e389, 0xbf0126f3), TOBN(0x7048d460, 0x4af206ee), TOBN(0x786c88f6, 0x77e97cb9), TOBN(0xd4375ae1, 0xac64802e), TOBN(0x469bcfe1, 0xd53ec11c), TOBN(0xfc9b340d, 0x47062230), TOBN(0xe743bb57, 0xc5b4a3ac), TOBN(0xfe00b4aa, 0x59ef45ac), TOBN(0x29a4ef23, 0x59edf188), TOBN(0x40242efe, 0xb483689b), TOBN(0x2575d3f6, 0x513ac262), TOBN(0xf30037c8, 0x0ca6db72), TOBN(0xc9fcce82, 0x98864be2), TOBN(0x84a112ff, 0x0149362d), TOBN(0x95e57582, 0x1c4ae971), TOBN(0x1fa4b1a8, 0x945cf86c), TOBN(0x4525a734, 0x0b024a2f), TOBN(0xe76c8b62, 0x8f338360), TOBN(0x483ff593, 0x28edf32b), TOBN(0x67e8e90a, 0x298b1aec), TOBN(0x9caab338, 0x736d9a21), TOBN(0x5c09d2fd, 0x66892709), TOBN(0x2496b4dc, 0xb55a1d41), TOBN(0x93f5fb1a, 0xe24a4394), TOBN(0x08c75049, 0x6fa8f6c1), TOBN(0xcaead1c2, 0xc905d85f), TOBN(0xe9d7f790, 0x0733ae57), TOBN(0x24c9a65c, 0xf07cdd94), TOBN(0x7389359c, 0xa4b55931), TOBN(0xf58709b7, 0x367e45f7), TOBN(0x1f203067, 0xcb7e7adc), TOBN(0x82444bff, 0xc7b72818), TOBN(0x07303b35, 0xbaac8033), TOBN(0x1e1ee4e4, 0xd13b7ea1), TOBN(0xe6489b24, 0xe0e74180), TOBN(0xa5f2c610, 0x7e70ef70), TOBN(0xa1655412, 0xbdd10894), TOBN(0x555ebefb, 0x7af4194e), TOBN(0x533c1c3c, 0x8e89bd9c), TOBN(0x735b9b57, 0x89895856), TOBN(0x15fb3cd2, 0x567f5c15), TOBN(0x057fed45, 0x526f09fd), TOBN(0xe8a4f10c, 0x8128240a), TOBN(0x9332efc4, 0xff2bfd8d), TOBN(0x214e77a0, 0xbd35aa31), TOBN(0x32896d73, 0x14faa40e), TOBN(0x767867ec, 0x01e5f186), TOBN(0xc9adf8f1, 0x17a1813e), TOBN(0xcb6cda78, 0x54741795), TOBN(0xb7521b6d, 0x349d51aa), TOBN(0xf56b5a9e, 0xe3c7b8e9), TOBN(0xc6f1e5c9, 0x32a096df), TOBN(0x083667c4, 0xa3635024), TOBN(0x365ea135, 0x18087f2f), TOBN(0xf1b8eaac, 0xd136e45d), TOBN(0xc8a0e484, 0x73aec989), TOBN(0xd75a324b, 0x142c9259), TOBN(0xb7b4d001, 0x01dae185), TOBN(0x45434e0b, 0x9b7a94bc), TOBN(0xf54339af, 0xfbd8cb0b), TOBN(0xdcc4569e, 0xe98ef49e), TOBN(0x7789318a, 0x09a51299), TOBN(0x81b4d206, 0xb2b025d8), TOBN(0xf64aa418, 0xfae85792), TOBN(0x3e50258f, 0xacd7baf7), TOBN(0xdce84cdb, 0x2996864b), TOBN(0xa2e67089, 0x1f485fa4), TOBN(0xb28b2bb6, 0x534c6a5a), TOBN(0x31a7ec6b, 0xc94b9d39), TOBN(0x1d217766, 0xd6bc20da), TOBN(0x4acdb5ec, 0x86761190), TOBN(0x68726328, 0x73701063), TOBN(0x4d24ee7c, 0x2128c29b), TOBN(0xc072ebd3, 0xa19fd868), TOBN(0x612e481c, 0xdb8ddd3b), TOBN(0xb4e1d754, 0x1a64d852), TOBN(0x00ef95ac, 0xc4c6c4ab), TOBN(0x1536d2ed, 0xaa0a6c46), TOBN(0x61294086, 0x43774790), TOBN(0x54af25e8, 0x343fda10), TOBN(0x9ff9d98d, 0xfd25d6f2), TOBN(0x0746af7c, 0x468b8835), TOBN(0x977a31cb, 0x730ecea7), TOBN(0xa5096b80, 0xc2cf4a81), TOBN(0xaa986833, 0x6458c37a), TOBN(0x6af29bf3, 0xa6bd9d34), TOBN(0x6a62fe9b, 0x33c5d854), TOBN(0x50e6c304, 0xb7133b5e), TOBN(0x04b60159, 0x7d6e6848), TOBN(0x4cd296df, 0x5579bea4), TOBN(0x10e35ac8, 0x5ceedaf1), TOBN(0x04c4c5fd, 0xe3bcc5b1), TOBN(0x95f9ee8a, 0x89412cf9), TOBN(0x2c9459ee, 0x82b6eb0f), TOBN(0x2e845765, 0x95c2aadd), TOBN(0x774a84ae, 0xd327fcfe), TOBN(0xd8c93722, 0x0368d476), TOBN(0x0dbd5748, 0xf83e8a3b), TOBN(0xa579aa96, 0x8d2495f3), TOBN(0x535996a0, 0xae496e9b), TOBN(0x07afbfe9, 0xb7f9bcc2), TOBN(0x3ac1dc6d, 0x5b7bd293), TOBN(0x3b592cff, 0x7022323d), TOBN(0xba0deb98, 0x9c0a3e76), TOBN(0x18e78e9f, 0x4b197acb), TOBN(0x211cde10, 0x296c36ef), TOBN(0x7ee89672, 0x82c4da77), TOBN(0xb617d270, 0xa57836da), TOBN(0xf0cd9c31, 0x9cb7560b), TOBN(0x01fdcbf7, 0xe455fe90), TOBN(0x3fb53cbb, 0x7e7334f3), TOBN(0x781e2ea4, 0x4e7de4ec), TOBN(0x8adab3ad, 0x0b384fd0), TOBN(0x129eee2f, 0x53d64829), TOBN(0x7a471e17, 0xa261492b), TOBN(0xe4f9adb9, 0xe4cb4a2c), TOBN(0x3d359f6f, 0x97ba2c2d), TOBN(0x346c6786, 0x0aacd697), TOBN(0x92b444c3, 0x75c2f8a8), TOBN(0xc79fa117, 0xd85df44e), TOBN(0x56782372, 0x398ddf31), TOBN(0x60e690f2, 0xbbbab3b8), TOBN(0x4851f8ae, 0x8b04816b), TOBN(0xc72046ab, 0x9c92e4d2), TOBN(0x518c74a1, 0x7cf3136b), TOBN(0xff4eb50a, 0xf9877d4c), TOBN(0x14578d90, 0xa919cabb), TOBN(0x8218f8c4, 0xac5eb2b6), TOBN(0xa3ccc547, 0x542016e4), TOBN(0x025bf48e, 0x327f8349), TOBN(0xf3e97346, 0xf43cb641), TOBN(0xdc2bafdf, 0x500f1085), TOBN(0x57167876, 0x2f063055), TOBN(0x5bd914b9, 0x411925a6), TOBN(0x7c078d48, 0xa1123de5), TOBN(0xee6bf835, 0x182b165d), TOBN(0xb11b5e5b, 0xba519727), TOBN(0xe33ea76c, 0x1eea7b85), TOBN(0x2352b461, 0x92d4f85e), TOBN(0xf101d334, 0xafe115bb), TOBN(0xfabc1294, 0x889175a3), TOBN(0x7f6bcdc0, 0x5233f925), TOBN(0xe0a802db, 0xe77fec55), TOBN(0xbdb47b75, 0x8069b659), TOBN(0x1c5e12de, 0xf98fbd74), TOBN(0x869c58c6, 0x4b8457ee), TOBN(0xa5360f69, 0x4f7ea9f7), TOBN(0xe576c09f, 0xf460b38f), TOBN(0x6b70d548, 0x22b7fb36), TOBN(0x3fd237f1, 0x3bfae315), TOBN(0x33797852, 0xcbdff369), TOBN(0x97df25f5, 0x25b516f9), TOBN(0x46f388f2, 0xba38ad2d), TOBN(0x656c4658, 0x89d8ddbb), TOBN(0x8830b26e, 0x70f38ee8), TOBN(0x4320fd5c, 0xde1212b0), TOBN(0xc34f30cf, 0xe4a2edb2), TOBN(0xabb131a3, 0x56ab64b8), TOBN(0x7f77f0cc, 0xd99c5d26), TOBN(0x66856a37, 0xbf981d94), TOBN(0x19e76d09, 0x738bd76e), TOBN(0xe76c8ac3, 0x96238f39), TOBN(0xc0a482be, 0xa830b366), TOBN(0xb7b8eaff, 0x0b4eb499), TOBN(0x8ecd83bc, 0x4bfb4865), TOBN(0x971b2cb7, 0xa2f3776f), TOBN(0xb42176a4, 0xf4b88adf), TOBN(0xb9617df5, 0xbe1fa446), TOBN(0x8b32d508, 0xcd031bd2), TOBN(0x1c6bd47d, 0x53b618c0), TOBN(0xc424f46c, 0x6a227923), TOBN(0x7303ffde, 0xdd92d964), TOBN(0xe9712878, 0x71b5abf2), TOBN(0x8f48a632, 0xf815561d), TOBN(0x85f48ff5, 0xd3c055d1), TOBN(0x222a1427, 0x7525684f), TOBN(0xd0d841a0, 0x67360cc3), TOBN(0x4245a926, 0x0b9267c6), TOBN(0xc78913f1, 0xcf07f863), TOBN(0xaa844c8e, 0x4d0d9e24), TOBN(0xa42ad522, 0x3d5f9017), TOBN(0xbd371749, 0xa2c989d5), TOBN(0x928292df, 0xe1f5e78e), TOBN(0x493b383e, 0x0a1ea6da), TOBN(0x5136fd8d, 0x13aee529), TOBN(0x860c44b1, 0xf2c34a99), TOBN(0x3b00aca4, 0xbf5855ac), TOBN(0xabf6aaa0, 0xfaaf37be), TOBN(0x65f43682, 0x2a53ec08), TOBN(0x1d9a5801, 0xa11b12e1), TOBN(0x78a7ab2c, 0xe20ed475), TOBN(0x0de1067e, 0x9a41e0d5), TOBN(0x30473f5f, 0x305023ea), TOBN(0xdd3ae09d, 0x169c7d97), TOBN(0x5cd5baa4, 0xcfaef9cd), TOBN(0x5cd7440b, 0x65a44803), TOBN(0xdc13966a, 0x47f364de), TOBN(0x077b2be8, 0x2b8357c1), TOBN(0x0cb1b4c5, 0xe9d57c2a), TOBN(0x7a4ceb32, 0x05ff363e), TOBN(0xf310fa4d, 0xca35a9ef), TOBN(0xdbb7b352, 0xf97f68c6), TOBN(0x0c773b50, 0x0b02cf58), TOBN(0xea2e4821, 0x3c1f96d9), TOBN(0xffb357b0, 0xeee01815), TOBN(0xb9c924cd, 0xe0f28039), TOBN(0x0b36c95a, 0x46a3fbe4), TOBN(0x1faaaea4, 0x5e46db6c), TOBN(0xcae575c3, 0x1928aaff), TOBN(0x7f671302, 0xa70dab86), TOBN(0xfcbd12a9, 0x71c58cfc), TOBN(0xcbef9acf, 0xbee0cb92), TOBN(0x573da0b9, 0xf8c1b583), TOBN(0x4752fcfe, 0x0d41d550), TOBN(0xe7eec0e3, 0x2155cffe), TOBN(0x0fc39fcb, 0x545ae248), TOBN(0x522cb8d1, 0x8065f44e), TOBN(0x263c962a, 0x70cbb96c), TOBN(0xe034362a, 0xbcd124a9), TOBN(0xf120db28, 0x3c2ae58d), TOBN(0xb9a38d49, 0xfef6d507), TOBN(0xb1fd2a82, 0x1ff140fd), TOBN(0xbd162f30, 0x20aee7e0), TOBN(0x4e17a5d4, 0xcb251949), TOBN(0x2aebcb83, 0x4f7e1c3d), TOBN(0x608eb25f, 0x937b0527), TOBN(0xf42e1e47, 0xeb7d9997), TOBN(0xeba699c4, 0xb8a53a29), TOBN(0x1f921c71, 0xe091b536), TOBN(0xcce29e7b, 0x5b26bbd5), TOBN(0x7a8ef5ed, 0x3b61a680), TOBN(0xe5ef8043, 0xba1f1c7e), TOBN(0x16ea8217, 0x18158dda), TOBN(0x01778a2b, 0x599ff0f9), TOBN(0x68a923d7, 0x8104fc6b), TOBN(0x5bfa44df, 0xda694ff3), TOBN(0x4f7199db, 0xf7667f12), TOBN(0xc06d8ff6, 0xe46f2a79), TOBN(0x08b5dead, 0xe9f8131d), TOBN(0x02519a59, 0xabb4ce7c), TOBN(0xc4f710bc, 0xb42aec3e), TOBN(0x3d77b057, 0x78bde41a), TOBN(0x6474bf80, 0xb4186b5a), TOBN(0x048b3f67, 0x88c65741), TOBN(0xc64519de, 0x03c7c154), TOBN(0xdf073846, 0x0edfcc4f), TOBN(0x319aa737, 0x48f1aa6b), TOBN(0x8b9f8a02, 0xca909f77), TOBN(0x90258139, 0x7580bfef), TOBN(0xd8bfd3ca, 0xc0c22719), TOBN(0xc60209e4, 0xc9ca151e), TOBN(0x7a744ab5, 0xd9a1a69c), TOBN(0x6de5048b, 0x14937f8f), TOBN(0x171938d8, 0xe115ac04), TOBN(0x7df70940, 0x1c6b16d2), TOBN(0xa6aeb663, 0x7f8e94e7), TOBN(0xc130388e, 0x2a2cf094), TOBN(0x1850be84, 0x77f54e6e), TOBN(0x9f258a72, 0x65d60fe5), TOBN(0xff7ff0c0, 0x6c9146d6), TOBN(0x039aaf90, 0xe63a830b), TOBN(0x38f27a73, 0x9460342f), TOBN(0x4703148c, 0x3f795f8a), TOBN(0x1bb5467b, 0x9681a97e), TOBN(0x00931ba5, 0xecaeb594), TOBN(0xcdb6719d, 0x786f337c), TOBN(0xd9c01cd2, 0xe704397d), TOBN(0x0f4a3f20, 0x555c2fef), TOBN(0x00452509, 0x7c0af223), TOBN(0x54a58047, 0x84db8e76), TOBN(0x3bacf1aa, 0x93c8aa06), TOBN(0x11ca957c, 0xf7919422), TOBN(0x50641053, 0x78cdaa40), TOBN(0x7a303874, 0x9f7144ae), TOBN(0x170c963f, 0x43d4acfd), TOBN(0x5e148149, 0x58ddd3ef), TOBN(0xa7bde582, 0x9e72dba8), TOBN(0x0769da8b, 0x6fa68750), TOBN(0xfa64e532, 0x572e0249), TOBN(0xfcaadf9d, 0x2619ad31), TOBN(0x87882daa, 0xa7b349cd), TOBN(0x9f6eb731, 0x6c67a775), TOBN(0xcb10471a, 0xefc5d0b1), TOBN(0xb433750c, 0xe1b806b2), TOBN(0x19c5714d, 0x57b1ae7e), TOBN(0xc0dc8b7b, 0xed03fd3f), TOBN(0xdd03344f, 0x31bc194e), TOBN(0xa66c52a7, 0x8c6320b5), TOBN(0x8bc82ce3, 0xd0b6fd93), TOBN(0xf8e13501, 0xb35f1341), TOBN(0xe53156dd, 0x25a43e42), TOBN(0xd3adf27e, 0x4daeb85c), TOBN(0xb81d8379, 0xbbeddeb5), TOBN(0x1b0b546e, 0x2e435867), TOBN(0x9020eb94, 0xeba5dd60), TOBN(0x37d91161, 0x8210cb9d), TOBN(0x4c596b31, 0x5c91f1cf), TOBN(0xb228a90f, 0x0e0b040d), TOBN(0xbaf02d82, 0x45ff897f), TOBN(0x2aac79e6, 0x00fa6122), TOBN(0x24828817, 0x8e36f557), TOBN(0xb9521d31, 0x113ec356), TOBN(0x9e48861e, 0x15eff1f8), TOBN(0x2aa1d412, 0xe0d41715), TOBN(0x71f86203, 0x53f131b8), TOBN(0xf60da8da, 0x3fd19408), TOBN(0x4aa716dc, 0x278d9d99), TOBN(0x394531f7, 0xa8c51c90), TOBN(0xb560b0e8, 0xf59db51c), TOBN(0xa28fc992, 0xfa34bdad), TOBN(0xf024fa14, 0x9cd4f8bd), TOBN(0x5cf530f7, 0x23a9d0d3), TOBN(0x615ca193, 0xe28c9b56), TOBN(0x6d2a483d, 0x6f73c51e), TOBN(0xa4cb2412, 0xea0dc2dd), TOBN(0x50663c41, 0x1eb917ff), TOBN(0x3d3a74cf, 0xeade299e), TOBN(0x29b3990f, 0x4a7a9202), TOBN(0xa9bccf59, 0xa7b15c3d), TOBN(0x66a3ccdc, 0xa5df9208), TOBN(0x48027c14, 0x43f2f929), TOBN(0xd385377c, 0x40b557f0), TOBN(0xe001c366, 0xcd684660), TOBN(0x1b18ed6b, 0xe2183a27), TOBN(0x879738d8, 0x63210329), TOBN(0xa687c74b, 0xbda94882), TOBN(0xd1bbcc48, 0xa684b299), TOBN(0xaf6f1112, 0x863b3724), TOBN(0x6943d1b4, 0x2c8ce9f8), TOBN(0xe044a3bb, 0x098cafb4), TOBN(0x27ed2310, 0x60d48caf), TOBN(0x542b5675, 0x3a31b84d), TOBN(0xcbf3dd50, 0xfcddbed7), TOBN(0x25031f16, 0x41b1d830), TOBN(0xa7ec851d, 0xcb0c1e27), TOBN(0xac1c8fe0, 0xb5ae75db), TOBN(0xb24c7557, 0x08c52120), TOBN(0x57f811dc, 0x1d4636c3), TOBN(0xf8436526, 0x681a9939), TOBN(0x1f6bc6d9, 0x9c81adb3), TOBN(0x840f8ac3, 0x5b7d80d4), TOBN(0x731a9811, 0xf4387f1a), TOBN(0x7c501cd3, 0xb5156880), TOBN(0xa5ca4a07, 0xdfe68867), TOBN(0xf123d8f0, 0x5fcea120), TOBN(0x1fbb0e71, 0xd607039e), TOBN(0x2b70e215, 0xcd3a4546), TOBN(0x32d2f01d, 0x53324091), TOBN(0xb796ff08, 0x180ab19b), TOBN(0x32d87a86, 0x3c57c4aa), TOBN(0x2aed9caf, 0xb7c49a27), TOBN(0x9fb35eac, 0x31630d98), TOBN(0x338e8cdf, 0x5c3e20a3), TOBN(0x80f16182, 0x66cde8db), TOBN(0x4e159980, 0x2d72fd36), TOBN(0xd7b8f13b, 0x9b6e5072), TOBN(0xf5213907, 0x3b7b5dc1), TOBN(0x4d431f1d, 0x8ce4396e), TOBN(0x37a1a680, 0xa7ed2142), TOBN(0xbf375696, 0xd01aaf6b), TOBN(0xaa1c0c54, 0xe63aab66), TOBN(0x3014368b, 0x4ed80940), TOBN(0x67e6d056, 0x7a6fcedd), TOBN(0x7c208c49, 0xca97579f), TOBN(0xfe3d7a81, 0xa23597f6), TOBN(0x5e203202, 0x7e096ae2), TOBN(0xb1f3e1e7, 0x24b39366), TOBN(0x26da26f3, 0x2fdcdffc), TOBN(0x79422f1d, 0x6097be83)}, {TOBN(0x263a2cfb, 0x9db3b381), TOBN(0x9c3a2dee, 0xd4df0a4b), TOBN(0x728d06e9, 0x7d04e61f), TOBN(0x8b1adfbc, 0x42449325), TOBN(0x6ec1d939, 0x7e053a1b), TOBN(0xee2be5c7, 0x66daf707), TOBN(0x80ba1e14, 0x810ac7ab), TOBN(0xdd2ae778, 0xf530f174), TOBN(0x0435d97a, 0x205b9d8b), TOBN(0x6eb8f064, 0x056756d4), TOBN(0xd5e88a8b, 0xb6f8210e), TOBN(0x070ef12d, 0xec9fd9ea), TOBN(0x4d849505, 0x3bcc876a), TOBN(0x12a75338, 0xa7404ce3), TOBN(0xd22b49e1, 0xb8a1db5e), TOBN(0xec1f2051, 0x14bfa5ad), TOBN(0xadbaeb79, 0xb6828f36), TOBN(0x9d7a0258, 0x01bd5b9e), TOBN(0xeda01e0d, 0x1e844b0c), TOBN(0x4b625175, 0x887edfc9), TOBN(0x14109fdd, 0x9669b621), TOBN(0x88a2ca56, 0xf6f87b98), TOBN(0xfe2eb788, 0x170df6bc), TOBN(0x0cea06f4, 0xffa473f9), TOBN(0x43ed81b5, 0xc4e83d33), TOBN(0xd9f35879, 0x5efd488b), TOBN(0x164a620f, 0x9deb4d0f), TOBN(0xc6927bdb, 0xac6a7394), TOBN(0x45c28df7, 0x9f9e0f03), TOBN(0x2868661e, 0xfcd7e1a9), TOBN(0x7cf4e8d0, 0xffa348f1), TOBN(0x6bd4c284, 0x398538e0), TOBN(0x2618a091, 0x289a8619), TOBN(0xef796e60, 0x6671b173), TOBN(0x664e46e5, 0x9090c632), TOBN(0xa38062d4, 0x1e66f8fb), TOBN(0x6c744a20, 0x0573274e), TOBN(0xd07b67e4, 0xa9271394), TOBN(0x391223b2, 0x6bdc0e20), TOBN(0xbe2d93f1, 0xeb0a05a7), TOBN(0xf23e2e53, 0x3f36d141), TOBN(0xe84bb3d4, 0x4dfca442), TOBN(0xb804a48d, 0x6b7c023a), TOBN(0x1e16a8fa, 0x76431c3b), TOBN(0x1b5452ad, 0xddd472e0), TOBN(0x7d405ee7, 0x0d1ee127), TOBN(0x50fc6f1d, 0xffa27599), TOBN(0x351ac53c, 0xbf391b35), TOBN(0x7efa14b8, 0x4444896b), TOBN(0x64974d2f, 0xf94027fb), TOBN(0xefdcd0e8, 0xde84487d), TOBN(0x8c45b260, 0x2b48989b), TOBN(0xa8fcbbc2, 0xd8463487), TOBN(0xd1b2b3f7, 0x3fbc476c), TOBN(0x21d005b7, 0xc8f443c0), TOBN(0x518f2e67, 0x40c0139c), TOBN(0x56036e8c, 0x06d75fc1), TOBN(0x2dcf7bb7, 0x3249a89f), TOBN(0x81dd1d3d, 0xe245e7dd), TOBN(0xf578dc4b, 0xebd6e2a7), TOBN(0x4c028903, 0xdf2ce7a0), TOBN(0xaee36288, 0x9c39afac), TOBN(0xdc847c31, 0x146404ab), TOBN(0x6304c0d8, 0xa4e97818), TOBN(0xae51dca2, 0xa91f6791), TOBN(0x2abe4190, 0x9baa9efc), TOBN(0xd9d2e2f4, 0x559c7ac1), TOBN(0xe82f4b51, 0xfc9f773a), TOBN(0xa7713027, 0x4073e81c), TOBN(0xc0276fac, 0xfbb596fc), TOBN(0x1d819fc9, 0xa684f70c), TOBN(0x29b47fdd, 0xc9f7b1e0), TOBN(0x358de103, 0x459b1940), TOBN(0xec881c59, 0x5b013e93), TOBN(0x51574c93, 0x49532ad3), TOBN(0x2db1d445, 0xb37b46de), TOBN(0xc6445b87, 0xdf239fd8), TOBN(0xc718af75, 0x151d24ee), TOBN(0xaea1c4a4, 0xf43c6259), TOBN(0x40c0e5d7, 0x70be02f7), TOBN(0x6a4590f4, 0x721b33f2), TOBN(0x2124f1fb, 0xfedf04ea), TOBN(0xf8e53cde, 0x9745efe7), TOBN(0xe7e10432, 0x65f046d9), TOBN(0xc3fca28e, 0xe4d0c7e6), TOBN(0x847e339a, 0x87253b1b), TOBN(0x9b595348, 0x3743e643), TOBN(0xcb6a0a0b, 0x4fd12fc5), TOBN(0xfb6836c3, 0x27d02dcc), TOBN(0x5ad00982, 0x7a68bcc2), TOBN(0x1b24b44c, 0x005e912d), TOBN(0xcc83d20f, 0x811fdcfe), TOBN(0x36527ec1, 0x666fba0c), TOBN(0x69948197, 0x14754635), TOBN(0xfcdcb1a8, 0x556da9c2), TOBN(0xa5934267, 0x81a732b2), TOBN(0xec1214ed, 0xa714181d), TOBN(0x609ac13b, 0x6067b341), TOBN(0xff4b4c97, 0xa545df1f), TOBN(0xa1240501, 0x34d2076b), TOBN(0x6efa0c23, 0x1409ca97), TOBN(0x254cc1a8, 0x20638c43), TOBN(0xd4e363af, 0xdcfb46cd), TOBN(0x62c2adc3, 0x03942a27), TOBN(0xc67b9df0, 0x56e46483), TOBN(0xa55abb20, 0x63736356), TOBN(0xab93c098, 0xc551bc52), TOBN(0x382b49f9, 0xb15fe64b), TOBN(0x9ec221ad, 0x4dff8d47), TOBN(0x79caf615, 0x437df4d6), TOBN(0x5f13dc64, 0xbb456509), TOBN(0xe4c589d9, 0x191f0714), TOBN(0x27b6a8ab, 0x3fd40e09), TOBN(0xe455842e, 0x77313ea9), TOBN(0x8b51d1e2, 0x1f55988b), TOBN(0x5716dd73, 0x062bbbfc), TOBN(0x633c11e5, 0x4e8bf3de), TOBN(0x9a0e77b6, 0x1b85be3b), TOBN(0x56510729, 0x0911cca6), TOBN(0x27e76495, 0xefa6590f), TOBN(0xe4ac8b33, 0x070d3aab), TOBN(0x2643672b, 0x9a2cd5e5), TOBN(0x52eff79b, 0x1cfc9173), TOBN(0x665ca49b, 0x90a7c13f), TOBN(0x5a8dda59, 0xb3efb998), TOBN(0x8a5b922d, 0x052f1341), TOBN(0xae9ebbab, 0x3cf9a530), TOBN(0x35986e7b, 0xf56da4d7), TOBN(0x3a636b5c, 0xff3513cc), TOBN(0xbb0cf8ba, 0x3198f7dd), TOBN(0xb8d40522, 0x41f16f86), TOBN(0x760575d8, 0xde13a7bf), TOBN(0x36f74e16, 0x9f7aa181), TOBN(0x163a3ecf, 0xf509ed1c), TOBN(0x6aead61f, 0x3c40a491), TOBN(0x158c95fc, 0xdfe8fcaa), TOBN(0xa3991b6e, 0x13cda46f), TOBN(0x79482415, 0x342faed0), TOBN(0xf3ba5bde, 0x666b5970), TOBN(0x1d52e6bc, 0xb26ab6dd), TOBN(0x768ba1e7, 0x8608dd3d), TOBN(0x4930db2a, 0xea076586), TOBN(0xd9575714, 0xe7dc1afa), TOBN(0x1fc7bf7d, 0xf7c58817), TOBN(0x6b47accd, 0xd9eee96c), TOBN(0x0ca277fb, 0xe58cec37), TOBN(0x113fe413, 0xe702c42a), TOBN(0xdd1764ee, 0xc47cbe51), TOBN(0x041e7cde, 0x7b3ed739), TOBN(0x50cb7459, 0x5ce9e1c0), TOBN(0x35568513, 0x2925b212), TOBN(0x7cff95c4, 0x001b081c), TOBN(0x63ee4cbd, 0x8088b454), TOBN(0xdb7f32f7, 0x9a9e0c8a), TOBN(0xb377d418, 0x6b2447cb), TOBN(0xe3e982aa, 0xd370219b), TOBN(0x06ccc1e4, 0xc2a2a593), TOBN(0x72c36865, 0x0773f24f), TOBN(0xa13b4da7, 0x95859423), TOBN(0x8bbf1d33, 0x75040c8f), TOBN(0x726f0973, 0xda50c991), TOBN(0x48afcd5b, 0x822d6ee2), TOBN(0xe5fc718b, 0x20fd7771), TOBN(0xb9e8e77d, 0xfd0807a1), TOBN(0x7f5e0f44, 0x99a7703d), TOBN(0x6972930e, 0x618e36f3), TOBN(0x2b7c77b8, 0x23807bbe), TOBN(0xe5b82405, 0xcb27ff50), TOBN(0xba8b8be3, 0xbd379062), TOBN(0xd64b7a1d, 0x2dce4a92), TOBN(0x040a73c5, 0xb2952e37), TOBN(0x0a9e252e, 0xd438aeca), TOBN(0xdd43956b, 0xc39d3bcb), TOBN(0x1a31ca00, 0xb32b2d63), TOBN(0xd67133b8, 0x5c417a18), TOBN(0xd08e4790, 0x2ef442c8), TOBN(0x98cb1ae9, 0x255c0980), TOBN(0x4bd86381, 0x2b4a739f), TOBN(0x5a5c31e1, 0x1e4a45a1), TOBN(0x1e5d55fe, 0x9cb0db2f), TOBN(0x74661b06, 0x8ff5cc29), TOBN(0x026b389f, 0x0eb8a4f4), TOBN(0x536b21a4, 0x58848c24), TOBN(0x2e5bf8ec, 0x81dc72b0), TOBN(0x03c187d0, 0xad886aac), TOBN(0x5c16878a, 0xb771b645), TOBN(0xb07dfc6f, 0xc74045ab), TOBN(0x2c6360bf, 0x7800caed), TOBN(0x24295bb5, 0xb9c972a3), TOBN(0xc9e6f88e, 0x7c9a6dba), TOBN(0x90ffbf24, 0x92a79aa6), TOBN(0xde29d50a, 0x41c26ac2), TOBN(0x9f0af483, 0xd309cbe6), TOBN(0x5b020d8a, 0xe0bced4f), TOBN(0x606e986d, 0xb38023e3), TOBN(0xad8f2c9d, 0x1abc6933), TOBN(0x19292e1d, 0xe7400e93), TOBN(0xfe3e18a9, 0x52be5e4d), TOBN(0xe8e9771d, 0x2e0680bf), TOBN(0x8c5bec98, 0xc54db063), TOBN(0x2af9662a, 0x74a55d1f), TOBN(0xe3fbf28f, 0x046f66d8), TOBN(0xa3a72ab4, 0xd4dc4794), TOBN(0x09779f45, 0x5c7c2dd8), TOBN(0xd893bdaf, 0xc3d19d8d), TOBN(0xd5a75094, 0x57d6a6df), TOBN(0x8cf8fef9, 0x952e6255), TOBN(0x3da67cfb, 0xda9a8aff), TOBN(0x4c23f62a, 0x2c160dcd), TOBN(0x34e6c5e3, 0x8f90eaef), TOBN(0x35865519, 0xa9a65d5a), TOBN(0x07c48aae, 0x8fd38a3d), TOBN(0xb7e7aeda, 0x50068527), TOBN(0x2c09ef23, 0x1c90936a), TOBN(0x31ecfeb6, 0xe879324c), TOBN(0xa0871f6b, 0xfb0ec938), TOBN(0xb1f0fb68, 0xd84d835d), TOBN(0xc90caf39, 0x861dc1e6), TOBN(0x12e5b046, 0x7594f8d7), TOBN(0x26897ae2, 0x65012b92), TOBN(0xbcf68a08, 0xa4d6755d), TOBN(0x403ee41c, 0x0991fbda), TOBN(0x733e343e, 0x3bbf17e8), TOBN(0xd2c7980d, 0x679b3d65), TOBN(0x33056232, 0xd2e11305), TOBN(0x966be492, 0xf3c07a6f), TOBN(0x6a8878ff, 0xbb15509d), TOBN(0xff221101, 0x0a9b59a4), TOBN(0x6c9f564a, 0xabe30129), TOBN(0xc6f2c940, 0x336e64cf), TOBN(0x0fe75262, 0x8b0c8022), TOBN(0xbe0267e9, 0x6ae8db87), TOBN(0x22e192f1, 0x93bc042b), TOBN(0xf085b534, 0xb237c458), TOBN(0xa0d192bd, 0x832c4168), TOBN(0x7a76e9e3, 0xbdf6271d), TOBN(0x52a882fa, 0xb88911b5), TOBN(0xc85345e4, 0xb4db0eb5), TOBN(0xa3be02a6, 0x81a7c3ff), TOBN(0x51889c8c, 0xf0ec0469), TOBN(0x9d031369, 0xa5e829e5), TOBN(0xcbb4c6fc, 0x1607aa41), TOBN(0x75ac59a6, 0x241d84c1), TOBN(0xc043f2bf, 0x8829e0ee), TOBN(0x82a38f75, 0x8ea5e185), TOBN(0x8bda40b9, 0xd87cbd9f), TOBN(0x9e65e75e, 0x2d8fc601), TOBN(0x3d515f74, 0xa35690b3), TOBN(0x534acf4f, 0xda79e5ac), TOBN(0x68b83b3a, 0x8630215f), TOBN(0x5c748b2e, 0xd085756e), TOBN(0xb0317258, 0xe5d37cb2), TOBN(0x6735841a, 0xc5ccc2c4), TOBN(0x7d7dc96b, 0x3d9d5069), TOBN(0xa147e410, 0xfd1754bd), TOBN(0x65296e94, 0xd399ddd5), TOBN(0xf6b5b2d0, 0xbc8fa5bc), TOBN(0x8a5ead67, 0x500c277b), TOBN(0x214625e6, 0xdfa08a5d), TOBN(0x51fdfedc, 0x959cf047), TOBN(0x6bc9430b, 0x289fca32), TOBN(0xe36ff0cf, 0x9d9bdc3f), TOBN(0x2fe187cb, 0x58ea0ede), TOBN(0xed66af20, 0x5a900b3f), TOBN(0x00e0968b, 0x5fa9f4d6), TOBN(0x2d4066ce, 0x37a362e7), TOBN(0xa99a9748, 0xbd07e772), TOBN(0x710989c0, 0x06a4f1d0), TOBN(0xd5dedf35, 0xce40cbd8), TOBN(0xab55c5f0, 0x1743293d), TOBN(0x766f1144, 0x8aa24e2c), TOBN(0x94d874f8, 0x605fbcb4), TOBN(0xa365f0e8, 0xa518001b), TOBN(0xee605eb6, 0x9d04ef0f), TOBN(0x5a3915cd, 0xba8d4d25), TOBN(0x44c0e1b8, 0xb5113472), TOBN(0xcbb024e8, 0x8b6740dc), TOBN(0x89087a53, 0xee1d4f0c), TOBN(0xa88fa05c, 0x1fc4e372), TOBN(0x8bf395cb, 0xaf8b3af2), TOBN(0x1e71c9a1, 0xdeb8568b), TOBN(0xa35daea0, 0x80fb3d32), TOBN(0xe8b6f266, 0x2cf8fb81), TOBN(0x6d51afe8, 0x9490696a), TOBN(0x81beac6e, 0x51803a19), TOBN(0xe3d24b7f, 0x86219080), TOBN(0x727cfd9d, 0xdf6f463c), TOBN(0x8c6865ca, 0x72284ee8), TOBN(0x32c88b7d, 0xb743f4ef), TOBN(0x3793909b, 0xe7d11dce), TOBN(0xd398f922, 0x2ff2ebe8), TOBN(0x2c70ca44, 0xe5e49796), TOBN(0xdf4d9929, 0xcb1131b1), TOBN(0x7826f298, 0x25888e79), TOBN(0x4d3a112c, 0xf1d8740a), TOBN(0x00384cb6, 0x270afa8b), TOBN(0xcb64125b, 0x3ab48095), TOBN(0x3451c256, 0x62d05106), TOBN(0xd73d577d, 0xa4955845), TOBN(0x39570c16, 0xbf9f4433), TOBN(0xd7dfaad3, 0xadecf263), TOBN(0xf1c3d8d1, 0xdc76e102), TOBN(0x5e774a58, 0x54c6a836), TOBN(0xdad4b672, 0x3e92d47b), TOBN(0xbe7e990f, 0xf0d796a0), TOBN(0x5fc62478, 0xdf0e8b02), TOBN(0x8aae8bf4, 0x030c00ad), TOBN(0x3d2db93b, 0x9004ba0f), TOBN(0xe48c8a79, 0xd85d5ddc), TOBN(0xe907caa7, 0x6bb07f34), TOBN(0x58db343a, 0xa39eaed5), TOBN(0x0ea6e007, 0xadaf5724), TOBN(0xe00df169, 0xd23233f3), TOBN(0x3e322796, 0x77cb637f), TOBN(0x1f897c0e, 0x1da0cf6c), TOBN(0xa651f5d8, 0x31d6bbdd), TOBN(0xdd61af19, 0x1a230c76), TOBN(0xbd527272, 0xcdaa5e4a), TOBN(0xca753636, 0xd0abcd7e), TOBN(0x78bdd37c, 0x370bd8dc), TOBN(0xc23916c2, 0x17cd93fe), TOBN(0x65b97a4d, 0xdadce6e2), TOBN(0xe04ed4eb, 0x174e42f8), TOBN(0x1491ccaa, 0xbb21480a), TOBN(0x145a8280, 0x23196332), TOBN(0x3c3862d7, 0x587b479a), TOBN(0x9f4a88a3, 0x01dcd0ed), TOBN(0x4da2b7ef, 0x3ea12f1f), TOBN(0xf8e7ae33, 0xb126e48e), TOBN(0x404a0b32, 0xf494e237), TOBN(0x9beac474, 0xc55acadb), TOBN(0x4ee5cf3b, 0xcbec9fd9), TOBN(0x336b33b9, 0x7df3c8c3), TOBN(0xbd905fe3, 0xb76808fd), TOBN(0x8f436981, 0xaa45c16a), TOBN(0x255c5bfa, 0x3dd27b62), TOBN(0x71965cbf, 0xc3dd9b4d), TOBN(0xce23edbf, 0xfc068a87), TOBN(0xb78d4725, 0x745b029b), TOBN(0x74610713, 0xcefdd9bd), TOBN(0x7116f75f, 0x1266bf52), TOBN(0x02046722, 0x18e49bb6), TOBN(0xdf43df9f, 0x3d6f19e3), TOBN(0xef1bc7d0, 0xe685cb2f), TOBN(0xcddb27c1, 0x7078c432), TOBN(0xe1961b9c, 0xb77fedb7), TOBN(0x1edc2f5c, 0xc2290570), TOBN(0x2c3fefca, 0x19cbd886), TOBN(0xcf880a36, 0xc2af389a), TOBN(0x96c610fd, 0xbda71cea), TOBN(0xf03977a9, 0x32aa8463), TOBN(0x8eb7763f, 0x8586d90a), TOBN(0x3f342454, 0x2a296e77), TOBN(0xc8718683, 0x42837a35), TOBN(0x7dc71090, 0x6a09c731), TOBN(0x54778ffb, 0x51b816db), TOBN(0x6b33bfec, 0xaf06defd), TOBN(0xfe3c105f, 0x8592b70b), TOBN(0xf937fda4, 0x61da6114), TOBN(0x3c13e651, 0x4c266ad7), TOBN(0xe363a829, 0x855938e8), TOBN(0x2eeb5d9e, 0x9de54b72), TOBN(0xbeb93b0e, 0x20ccfab9), TOBN(0x3dffbb5f, 0x25e61a25), TOBN(0x7f655e43, 0x1acc093d), TOBN(0x0cb6cc3d, 0x3964ce61), TOBN(0x6ab283a1, 0xe5e9b460), TOBN(0x55d787c5, 0xa1c7e72d), TOBN(0x4d2efd47, 0xdeadbf02), TOBN(0x11e80219, 0xac459068), TOBN(0x810c7626, 0x71f311f0), TOBN(0xfa17ef8d, 0x4ab6ef53), TOBN(0xaf47fd25, 0x93e43bff), TOBN(0x5cb5ff3f, 0x0be40632), TOBN(0x54687106, 0x8ee61da3), TOBN(0x7764196e, 0xb08afd0f), TOBN(0x831ab3ed, 0xf0290a8f), TOBN(0xcae81966, 0xcb47c387), TOBN(0xaad7dece, 0x184efb4f), TOBN(0xdcfc53b3, 0x4749110e), TOBN(0x6698f23c, 0x4cb632f9), TOBN(0xc42a1ad6, 0xb91f8067), TOBN(0xb116a81d, 0x6284180a), TOBN(0xebedf5f8, 0xe901326f), TOBN(0xf2274c9f, 0x97e3e044), TOBN(0x42018520, 0x11d09fc9), TOBN(0x56a65f17, 0xd18e6e23), TOBN(0x2ea61e2a, 0x352b683c), TOBN(0x27d291bc, 0x575eaa94), TOBN(0x9e7bc721, 0xb8ff522d), TOBN(0x5f7268bf, 0xa7f04d6f), TOBN(0x5868c73f, 0xaba41748), TOBN(0x9f85c2db, 0x7be0eead), TOBN(0x511e7842, 0xff719135), TOBN(0x5a06b1e9, 0xc5ea90d7), TOBN(0x0c19e283, 0x26fab631), TOBN(0x8af8f0cf, 0xe9206c55), TOBN(0x89389cb4, 0x3553c06a), TOBN(0x39dbed97, 0xf65f8004), TOBN(0x0621b037, 0xc508991d), TOBN(0x1c52e635, 0x96e78cc4), TOBN(0x5385c8b2, 0x0c06b4a8), TOBN(0xd84ddfdb, 0xb0e87d03), TOBN(0xc49dfb66, 0x934bafad), TOBN(0x7071e170, 0x59f70772), TOBN(0x3a073a84, 0x3a1db56b), TOBN(0x03494903, 0x3b8af190), TOBN(0x7d882de3, 0xd32920f0), TOBN(0x91633f0a, 0xb2cf8940), TOBN(0x72b0b178, 0x6f948f51), TOBN(0x2d28dc30, 0x782653c8), TOBN(0x88829849, 0xdb903a05), TOBN(0xb8095d0c, 0x6a19d2bb), TOBN(0x4b9e7f0c, 0x86f782cb), TOBN(0x7af73988, 0x2d907064), TOBN(0xd12be0fe, 0x8b32643c), TOBN(0x358ed23d, 0x0e165dc3), TOBN(0x3d47ce62, 0x4e2378ce), TOBN(0x7e2bb0b9, 0xfeb8a087), TOBN(0x3246e8ae, 0xe29e10b9), TOBN(0x459f4ec7, 0x03ce2b4d), TOBN(0xe9b4ca1b, 0xbbc077cf), TOBN(0x2613b4f2, 0x0e9940c1), TOBN(0xfc598bb9, 0x047d1eb1), TOBN(0x9744c62b, 0x45036099), TOBN(0xa9dee742, 0x167c65d8), TOBN(0x0c511525, 0xdabe1943), TOBN(0xda110554, 0x93c6c624), TOBN(0xae00a52c, 0x651a3be2), TOBN(0xcda5111d, 0x884449a6), TOBN(0x063c06f4, 0xff33bed1), TOBN(0x73baaf9a, 0x0d3d76b4), TOBN(0x52fb0c9d, 0x7fc63668), TOBN(0x6886c9dd, 0x0c039cde), TOBN(0x602bd599, 0x55b22351), TOBN(0xb00cab02, 0x360c7c13), TOBN(0x8cb616bc, 0x81b69442), TOBN(0x41486700, 0xb55c3cee), TOBN(0x71093281, 0xf49ba278), TOBN(0xad956d9c, 0x64a50710), TOBN(0x9561f28b, 0x638a7e81), TOBN(0x54155cdf, 0x5980ddc3), TOBN(0xb2db4a96, 0xd26f247a), TOBN(0x9d774e4e, 0x4787d100), TOBN(0x1a9e6e2e, 0x078637d2), TOBN(0x1c363e2d, 0x5e0ae06a), TOBN(0x7493483e, 0xe9cfa354), TOBN(0x76843cb3, 0x7f74b98d), TOBN(0xbaca6591, 0xd4b66947), TOBN(0xb452ce98, 0x04460a8c), TOBN(0x6830d246, 0x43768f55), TOBN(0xf4197ed8, 0x7dff12df), TOBN(0x6521b472, 0x400dd0f7), TOBN(0x59f5ca8f, 0x4b1e7093), TOBN(0x6feff11b, 0x080338ae), TOBN(0x0ada31f6, 0xa29ca3c6), TOBN(0x24794eb6, 0x94a2c215), TOBN(0xd83a43ab, 0x05a57ab4), TOBN(0x264a543a, 0x2a6f89fe), TOBN(0x2c2a3868, 0xdd5ec7c2), TOBN(0xd3373940, 0x8439d9b2), TOBN(0x715ea672, 0x0acd1f11), TOBN(0x42c1d235, 0xe7e6cc19), TOBN(0x81ce6e96, 0xb990585c), TOBN(0x04e5dfe0, 0xd809c7bd), TOBN(0xd7b2580c, 0x8f1050ab), TOBN(0x6d91ad78, 0xd8a4176f), TOBN(0x0af556ee, 0x4e2e897c), TOBN(0x162a8b73, 0x921de0ac), TOBN(0x52ac9c22, 0x7ea78400), TOBN(0xee2a4eea, 0xefce2174), TOBN(0xbe61844e, 0x6d637f79), TOBN(0x0491f1bc, 0x789a283b), TOBN(0x72d3ac3d, 0x880836f4), TOBN(0xaa1c5ea3, 0x88e5402d), TOBN(0x1b192421, 0xd5cc473d), TOBN(0x5c0b9998, 0x9dc84cac), TOBN(0xb0a8482d, 0x9c6e75b8), TOBN(0x639961d0, 0x3a191ce2), TOBN(0xda3bc865, 0x6d837930), TOBN(0xca990653, 0x056e6f8f), TOBN(0x84861c41, 0x64d133a7), TOBN(0x8b403276, 0x746abe40), TOBN(0xb7b4d51a, 0xebf8e303), TOBN(0x05b43211, 0x220a255d), TOBN(0xc997152c, 0x02419e6e), TOBN(0x76ff47b6, 0x630c2fea), TOBN(0x50518677, 0x281fdade), TOBN(0x3283b8ba, 0xcf902b0b), TOBN(0x8d4b4eb5, 0x37db303b), TOBN(0xcc89f42d, 0x755011bc), TOBN(0xb43d74bb, 0xdd09d19b), TOBN(0x65746bc9, 0x8adba350), TOBN(0x364eaf8c, 0xb51c1927), TOBN(0x13c76596, 0x10ad72ec), TOBN(0x30045121, 0xf8d40c20), TOBN(0x6d2d99b7, 0xea7b979b), TOBN(0xcd78cd74, 0xe6fb3bcd), TOBN(0x11e45a9e, 0x86cffbfe), TOBN(0x78a61cf4, 0x637024f6), TOBN(0xd06bc872, 0x3d502295), TOBN(0xf1376854, 0x458cb288), TOBN(0xb9db26a1, 0x342f8586), TOBN(0xf33effcf, 0x4beee09e), TOBN(0xd7e0c4cd, 0xb30cfb3a), TOBN(0x6d09b8c1, 0x6c9db4c8), TOBN(0x40ba1a42, 0x07c8d9df), TOBN(0x6fd495f7, 0x1c52c66d), TOBN(0xfb0e169f, 0x275264da), TOBN(0x80c2b746, 0xe57d8362), TOBN(0xedd987f7, 0x49ad7222), TOBN(0xfdc229af, 0x4398ec7b)}, {TOBN(0xb0d1ed84, 0x52666a58), TOBN(0x4bcb6e00, 0xe6a9c3c2), TOBN(0x3c57411c, 0x26906408), TOBN(0xcfc20755, 0x13556400), TOBN(0xa08b1c50, 0x5294dba3), TOBN(0xa30ba286, 0x8b7dd31e), TOBN(0xd70ba90e, 0x991eca74), TOBN(0x094e142c, 0xe762c2b9), TOBN(0xb81d783e, 0x979f3925), TOBN(0x1efd130a, 0xaf4c89a7), TOBN(0x525c2144, 0xfd1bf7fa), TOBN(0x4b296904, 0x1b265a9e), TOBN(0xed8e9634, 0xb9db65b6), TOBN(0x35c82e32, 0x03599d8a), TOBN(0xdaa7a54f, 0x403563f3), TOBN(0x9df088ad, 0x022c38ab), TOBN(0xe5cfb066, 0xbb3fd30a), TOBN(0x429169da, 0xeff0354e), TOBN(0x809cf852, 0x3524e36c), TOBN(0x136f4fb3, 0x0155be1d), TOBN(0x4826af01, 0x1fbba712), TOBN(0x6ef0f0b4, 0x506ba1a1), TOBN(0xd9928b31, 0x77aea73e), TOBN(0xe2bf6af2, 0x5eaa244e), TOBN(0x8d084f12, 0x4237b64b), TOBN(0x688ebe99, 0xe3ecfd07), TOBN(0x57b8a70c, 0xf6845dd8), TOBN(0x808fc59c, 0x5da4a325), TOBN(0xa9032b2b, 0xa3585862), TOBN(0xb66825d5, 0xedf29386), TOBN(0xb5a5a8db, 0x431ec29b), TOBN(0xbb143a98, 0x3a1e8dc8), TOBN(0x35ee94ce, 0x12ae381b), TOBN(0x3a7f176c, 0x86ccda90), TOBN(0xc63a657e, 0x4606eaca), TOBN(0x9ae5a380, 0x43cd04df), TOBN(0x9bec8d15, 0xed251b46), TOBN(0x1f5d6d30, 0xcaca5e64), TOBN(0x347b3b35, 0x9ff20f07), TOBN(0x4d65f034, 0xf7e4b286), TOBN(0x9e93ba24, 0xf111661e), TOBN(0xedced484, 0xb105eb04), TOBN(0x96dc9ba1, 0xf424b578), TOBN(0xbf8f66b7, 0xe83e9069), TOBN(0x872d4df4, 0xd7ed8216), TOBN(0xbf07f377, 0x8e2cbecf), TOBN(0x4281d899, 0x98e73754), TOBN(0xfec85fbb, 0x8aab8708), TOBN(0x9a3c0dee, 0xa5ba5b0b), TOBN(0xe6a116ce, 0x42d05299), TOBN(0xae9775fe, 0xe9b02d42), TOBN(0x72b05200, 0xa1545cb6), TOBN(0xbc506f7d, 0x31a3b4ea), TOBN(0xe5893078, 0x8bbd9b32), TOBN(0xc8bc5f37, 0xe4b12a97), TOBN(0x6b000c06, 0x4a73b671), TOBN(0x13b5bf22, 0x765fa7d0), TOBN(0x59805bf0, 0x1d6a5370), TOBN(0x67a5e29d, 0x4280db98), TOBN(0x4f53916f, 0x776b1ce3), TOBN(0x714ff61f, 0x33ddf626), TOBN(0x4206238e, 0xa085d103), TOBN(0x1c50d4b7, 0xe5809ee3), TOBN(0x999f450d, 0x85f8eb1d), TOBN(0x658a6051, 0xe4c79e9b), TOBN(0x1394cb73, 0xc66a9fea), TOBN(0x27f31ed5, 0xc6be7b23), TOBN(0xf4c88f36, 0x5aa6f8fe), TOBN(0x0fb0721f, 0x4aaa499e), TOBN(0x68b3a7d5, 0xe3fb2a6b), TOBN(0xa788097d, 0x3a92851d), TOBN(0x060e7f8a, 0xe96f4913), TOBN(0x82eebe73, 0x1a3a93bc), TOBN(0x42bbf465, 0xa21adc1a), TOBN(0xc10b6fa4, 0xef030efd), TOBN(0x247aa4c7, 0x87b097bb), TOBN(0x8b8dc632, 0xf60c77da), TOBN(0x6ffbc26a, 0xc223523e), TOBN(0xa4f6ff11, 0x344579cf), TOBN(0x5825653c, 0x980250f6), TOBN(0xb2dd097e, 0xbc1aa2b9), TOBN(0x07889393, 0x37a0333a), TOBN(0x1cf55e71, 0x37a0db38), TOBN(0x2648487f, 0x792c1613), TOBN(0xdad01336, 0x3fcef261), TOBN(0x6239c81d, 0x0eabf129), TOBN(0x8ee761de, 0x9d276be2), TOBN(0x406a7a34, 0x1eda6ad3), TOBN(0x4bf367ba, 0x4a493b31), TOBN(0x54f20a52, 0x9bf7f026), TOBN(0xb696e062, 0x9795914b), TOBN(0xcddab96d, 0x8bf236ac), TOBN(0x4ff2c70a, 0xed25ea13), TOBN(0xfa1d09eb, 0x81cbbbe7), TOBN(0x88fc8c87, 0x468544c5), TOBN(0x847a670d, 0x696b3317), TOBN(0xf133421e, 0x64bcb626), TOBN(0xaea638c8, 0x26dee0b5), TOBN(0xd6e7680b, 0xb310346c), TOBN(0xe06f4097, 0xd5d4ced3), TOBN(0x09961452, 0x7512a30b), TOBN(0xf3d867fd, 0xe589a59a), TOBN(0x2e73254f, 0x52d0c180), TOBN(0x9063d8a3, 0x333c74ac), TOBN(0xeda6c595, 0xd314e7bc), TOBN(0x2ee7464b, 0x467899ed), TOBN(0x1cef423c, 0x0a1ed5d3), TOBN(0x217e76ea, 0x69cc7613), TOBN(0x27ccce1f, 0xe7cda917), TOBN(0x12d8016b, 0x8a893f16), TOBN(0xbcd6de84, 0x9fc74f6b), TOBN(0xfa5817e2, 0xf3144e61), TOBN(0x1f354164, 0x0821ee4c), TOBN(0x1583eab4, 0x0bc61992), TOBN(0x7490caf6, 0x1d72879f), TOBN(0x998ad9f3, 0xf76ae7b2), TOBN(0x1e181950, 0xa41157f7), TOBN(0xa9d7e1e6, 0xe8da3a7e), TOBN(0x963784eb, 0x8426b95f), TOBN(0x0ee4ed6e, 0x542e2a10), TOBN(0xb79d4cc5, 0xac751e7b), TOBN(0x93f96472, 0xfd4211bd), TOBN(0x8c72d3d2, 0xc8de4fc6), TOBN(0x7b69cbf5, 0xdf44f064), TOBN(0x3da90ca2, 0xf4bf94e1), TOBN(0x1a5325f8, 0xf12894e2), TOBN(0x0a437f6c, 0x7917d60b), TOBN(0x9be70486, 0x96c9cb5d), TOBN(0xb4d880bf, 0xe1dc5c05), TOBN(0xd738adda, 0xeebeeb57), TOBN(0x6f0119d3, 0xdf0fe6a3), TOBN(0x5c686e55, 0x66eaaf5a), TOBN(0x9cb10b50, 0xdfd0b7ec), TOBN(0xbdd0264b, 0x6a497c21), TOBN(0xfc093514, 0x8c546c96), TOBN(0x58a947fa, 0x79dbf42a), TOBN(0xc0b48d4e, 0x49ccd6d7), TOBN(0xff8fb02c, 0x88bd5580), TOBN(0xc75235e9, 0x07d473b2), TOBN(0x4fab1ac5, 0xa2188af3), TOBN(0x030fa3bc, 0x97576ec0), TOBN(0xe8c946e8, 0x0b7e7d2f), TOBN(0x40a5c9cc, 0x70305600), TOBN(0x6d8260a9, 0xc8b013b4), TOBN(0x0368304f, 0x70bba85c), TOBN(0xad090da1, 0xa4a0d311), TOBN(0x7170e870, 0x2415eec1), TOBN(0xbfba35fe, 0x8461ea47), TOBN(0x6279019a, 0xc1e91938), TOBN(0xa47638f3, 0x1afc415f), TOBN(0x36c65cbb, 0xbcba0e0f), TOBN(0x02160efb, 0x034e2c48), TOBN(0xe6c51073, 0x615cd9e4), TOBN(0x498ec047, 0xf1243c06), TOBN(0x3e5a8809, 0xb17b3d8c), TOBN(0x5cd99e61, 0x0cc565f1), TOBN(0x81e312df, 0x7851dafe), TOBN(0xf156f5ba, 0xa79061e2), TOBN(0x80d62b71, 0x880c590e), TOBN(0xbec9746f, 0x0a39faa1), TOBN(0x1d98a9c1, 0xc8ed1f7a), TOBN(0x09e43bb5, 0xa81d5ff2), TOBN(0xd5f00f68, 0x0da0794a), TOBN(0x412050d9, 0x661aa836), TOBN(0xa89f7c4e, 0x90747e40), TOBN(0x6dc05ebb, 0xb62a3686), TOBN(0xdf4de847, 0x308e3353), TOBN(0x53868fbb, 0x9fb53bb9), TOBN(0x2b09d2c3, 0xcfdcf7dd), TOBN(0x41a9fce3, 0x723fcab4), TOBN(0x73d905f7, 0x07f57ca3), TOBN(0x080f9fb1, 0xac8e1555), TOBN(0x7c088e84, 0x9ba7a531), TOBN(0x07d35586, 0xed9a147f), TOBN(0x602846ab, 0xaf48c336), TOBN(0x7320fd32, 0x0ccf0e79), TOBN(0xaa780798, 0xb18bd1ff), TOBN(0x52c2e300, 0xafdd2905), TOBN(0xf27ea3d6, 0x434267cd), TOBN(0x8b96d16d, 0x15605b5f), TOBN(0x7bb31049, 0x4b45706b), TOBN(0xe7f58b8e, 0x743d25f8), TOBN(0xe9b5e45b, 0x87f30076), TOBN(0xd19448d6, 0x5d053d5a), TOBN(0x1ecc8cb9, 0xd3210a04), TOBN(0x6bc7d463, 0xdafb5269), TOBN(0x3e59b10a, 0x67c3489f), TOBN(0x1769788c, 0x65641e1b), TOBN(0x8a53b82d, 0xbd6cb838), TOBN(0x7066d6e6, 0x236d5f22), TOBN(0x03aa1c61, 0x6908536e), TOBN(0xc971da0d, 0x66ae9809), TOBN(0x01b3a86b, 0xc49a2fac), TOBN(0x3b8420c0, 0x3092e77a), TOBN(0x02057300, 0x7d6fb556), TOBN(0x6941b2a1, 0xbff40a87), TOBN(0x140b6308, 0x0658ff2a), TOBN(0x87804363, 0x3424ab36), TOBN(0x0253bd51, 0x5751e299), TOBN(0xc75bcd76, 0x449c3e3a), TOBN(0x92eb4090, 0x7f8f875d), TOBN(0x9c9d754e, 0x56c26bbf), TOBN(0x158cea61, 0x8110bbe7), TOBN(0x62a6b802, 0x745f91ea), TOBN(0xa79c41aa, 0xc6e7394b), TOBN(0x445b6a83, 0xad57ef10), TOBN(0x0c5277eb, 0x6ea6f40c), TOBN(0x319fe96b, 0x88633365), TOBN(0x0b0fc61f, 0x385f63cb), TOBN(0x41250c84, 0x22bdd127), TOBN(0x67d153f1, 0x09e942c2), TOBN(0x60920d08, 0xc021ad5d), TOBN(0x229f5746, 0x724d81a5), TOBN(0xb7ffb892, 0x5bba3299), TOBN(0x518c51a1, 0xde413032), TOBN(0x2a9bfe77, 0x3c2fd94c), TOBN(0xcbcde239, 0x3191f4fd), TOBN(0x43093e16, 0xd3d6ada1), TOBN(0x184579f3, 0x58769606), TOBN(0x2c94a8b3, 0xd236625c), TOBN(0x6922b9c0, 0x5c437d8e), TOBN(0x3d4ae423, 0xd8d9f3c8), TOBN(0xf72c31c1, 0x2e7090a2), TOBN(0x4ac3f5f3, 0xd76a55bd), TOBN(0x342508fc, 0x6b6af991), TOBN(0x0d527100, 0x1b5cebbd), TOBN(0xb84740d0, 0xdd440dd7), TOBN(0x748ef841, 0x780162fd), TOBN(0xa8dbfe0e, 0xdfc6fafb), TOBN(0xeadfdf05, 0xf7300f27), TOBN(0x7d06555f, 0xfeba4ec9), TOBN(0x12c56f83, 0x9e25fa97), TOBN(0x77f84203, 0xd39b8c34), TOBN(0xed8b1be6, 0x3125eddb), TOBN(0x5bbf2441, 0xf6e39dc5), TOBN(0xb00f6ee6, 0x6a5d678a), TOBN(0xba456ecf, 0x57d0ea99), TOBN(0xdcae0f58, 0x17e06c43), TOBN(0x01643de4, 0x0f5b4baa), TOBN(0x2c324341, 0xd161b9be), TOBN(0x80177f55, 0xe126d468), TOBN(0xed325f1f, 0x76748e09), TOBN(0x6116004a, 0xcfa9bdc2), TOBN(0x2d8607e6, 0x3a9fb468), TOBN(0x0e573e27, 0x6009d660), TOBN(0x3a525d2e, 0x8d10c5a1), TOBN(0xd26cb45c, 0x3b9009a0), TOBN(0xb6b0cdc0, 0xde9d7448), TOBN(0x949c9976, 0xe1337c26), TOBN(0x6faadebd, 0xd73d68e5), TOBN(0x9e158614, 0xf1b768d9), TOBN(0x22dfa557, 0x9cc4f069), TOBN(0xccd6da17, 0xbe93c6d6), TOBN(0x24866c61, 0xa504f5b9), TOBN(0x2121353c, 0x8d694da1), TOBN(0x1c6ca580, 0x0140b8c6), TOBN(0xc245ad8c, 0xe964021e), TOBN(0xb83bffba, 0x032b82b3), TOBN(0xfaa220c6, 0x47ef9898), TOBN(0x7e8d3ac6, 0x982c948a), TOBN(0x1faa2091, 0xbc2d124a), TOBN(0xbd54c3dd, 0x05b15ff4), TOBN(0x386bf3ab, 0xc87c6fb7), TOBN(0xfb2b0563, 0xfdeb6f66), TOBN(0x4e77c557, 0x5b45afb4), TOBN(0xe9ded649, 0xefb8912d), TOBN(0x7ec9bbf5, 0x42f6e557), TOBN(0x2570dfff, 0x62671f00), TOBN(0x2b3bfb78, 0x88e084bd), TOBN(0xa024b238, 0xf37fe5b4), TOBN(0x44e7dc04, 0x95649aee), TOBN(0x498ca255, 0x5e7ec1d8), TOBN(0x3bc766ea, 0xaaa07e86), TOBN(0x0db6facb, 0xf3608586), TOBN(0xbadd2549, 0xbdc259c8), TOBN(0x95af3c6e, 0x041c649f), TOBN(0xb36a928c, 0x02e30afb), TOBN(0x9b5356ad, 0x008a88b8), TOBN(0x4b67a5f1, 0xcf1d9e9d), TOBN(0xc6542e47, 0xa5d8d8ce), TOBN(0x73061fe8, 0x7adfb6cc), TOBN(0xcc826fd3, 0x98678141), TOBN(0x00e758b1, 0x3c80515a), TOBN(0x6afe3247, 0x41485083), TOBN(0x0fcb08b9, 0xb6ae8a75), TOBN(0xb8cf388d, 0x4acf51e1), TOBN(0x344a5560, 0x6961b9d6), TOBN(0x1a6778b8, 0x6a97fd0c), TOBN(0xd840fdc1, 0xecc4c7e3), TOBN(0xde9fe47d, 0x16db68cc), TOBN(0xe95f89de, 0xa3e216aa), TOBN(0x84f1a6a4, 0x9594a8be), TOBN(0x7ddc7d72, 0x5a7b162b), TOBN(0xc5cfda19, 0xadc817a3), TOBN(0x80a5d350, 0x78b58d46), TOBN(0x93365b13, 0x82978f19), TOBN(0x2e44d225, 0x26a1fc90), TOBN(0x0d6d10d2, 0x4d70705d), TOBN(0xd94b6b10, 0xd70c45f4), TOBN(0x0f201022, 0xb216c079), TOBN(0xcec966c5, 0x658fde41), TOBN(0xa8d2bc7d, 0x7e27601d), TOBN(0xbfcce3e1, 0xff230be7), TOBN(0x3394ff6b, 0x0033ffb5), TOBN(0xd890c509, 0x8132c9af), TOBN(0xaac4b0eb, 0x361e7868), TOBN(0x5194ded3, 0xe82d15aa), TOBN(0x4550bd2e, 0x23ae6b7d), TOBN(0x3fda318e, 0xea5399d4), TOBN(0xd989bffa, 0x91638b80), TOBN(0x5ea124d0, 0xa14aa12d), TOBN(0x1fb1b899, 0x3667b944), TOBN(0x95ec7969, 0x44c44d6a), TOBN(0x91df144a, 0x57e86137), TOBN(0x915fd620, 0x73adac44), TOBN(0x8f01732d, 0x59a83801), TOBN(0xec579d25, 0x3aa0a633), TOBN(0x06de5e7c, 0xc9d6d59c), TOBN(0xc132f958, 0xb1ef8010), TOBN(0x29476f96, 0xe65c1a02), TOBN(0x336a77c0, 0xd34c3565), TOBN(0xef1105b2, 0x1b9f1e9e), TOBN(0x63e6d08b, 0xf9e08002), TOBN(0x9aff2f21, 0xc613809e), TOBN(0xb5754f85, 0x3a80e75d), TOBN(0xde71853e, 0x6bbda681), TOBN(0x86f041df, 0x8197fd7a), TOBN(0x8b332e08, 0x127817fa), TOBN(0x05d99be8, 0xb9c20cda), TOBN(0x89f7aad5, 0xd5cd0c98), TOBN(0x7ef936fe, 0x5bb94183), TOBN(0x92ca0753, 0xb05cd7f2), TOBN(0x9d65db11, 0x74a1e035), TOBN(0x02628cc8, 0x13eaea92), TOBN(0xf2d9e242, 0x49e4fbf2), TOBN(0x94fdfd9b, 0xe384f8b7), TOBN(0x65f56054, 0x63428c6b), TOBN(0x2f7205b2, 0x90b409a5), TOBN(0xf778bb78, 0xff45ae11), TOBN(0xa13045be, 0xc5ee53b2), TOBN(0xe00a14ff, 0x03ef77fe), TOBN(0x689cd59f, 0xffef8bef), TOBN(0x3578f0ed, 0x1e9ade22), TOBN(0xe99f3ec0, 0x6268b6a8), TOBN(0xa2057d91, 0xea1b3c3e), TOBN(0x2d1a7053, 0xb8823a4a), TOBN(0xabbb336a, 0x2cca451e), TOBN(0xcd2466e3, 0x2218bb5d), TOBN(0x3ac1f42f, 0xc8cb762d), TOBN(0x7e312aae, 0x7690211f), TOBN(0xebb9bd73, 0x45d07450), TOBN(0x207c4b82, 0x46c2213f), TOBN(0x99d425c1, 0x375913ec), TOBN(0x94e45e96, 0x67908220), TOBN(0xc08f3087, 0xcd67dbf6), TOBN(0xa5670fbe, 0xc0887056), TOBN(0x6717b64a, 0x66f5b8fc), TOBN(0xd5a56aea, 0x786fec28), TOBN(0xa8c3f55f, 0xc0ff4952), TOBN(0xa77fefae, 0x457ac49b), TOBN(0x29882d7c, 0x98379d44), TOBN(0xd000bdfb, 0x509edc8a), TOBN(0xc6f95979, 0xe66fe464), TOBN(0x504a6115, 0xfa61bde0), TOBN(0x56b3b871, 0xeffea31a), TOBN(0x2d3de26d, 0xf0c21a54), TOBN(0x21dbff31, 0x834753bf), TOBN(0xe67ecf49, 0x69269d86), TOBN(0x7a176952, 0x151fe690), TOBN(0x03515804, 0x7f2adb5f), TOBN(0xee794b15, 0xd1b62a8d), TOBN(0xf004ceec, 0xaae454e6), TOBN(0x0897ea7c, 0xf0386fac), TOBN(0x3b62ff12, 0xd1fca751), TOBN(0x154181df, 0x1b7a04ec), TOBN(0x2008e04a, 0xfb5847ec), TOBN(0xd147148e, 0x41dbd772), TOBN(0x2b419f73, 0x22942654), TOBN(0x669f30d3, 0xe9c544f7), TOBN(0x52a2c223, 0xc8540149), TOBN(0x5da9ee14, 0x634dfb02), TOBN(0x5f074ff0, 0xf47869f3), TOBN(0x74ee878d, 0xa3933acc), TOBN(0xe6510651, 0x4fe35ed1), TOBN(0xb3eb9482, 0xf1012e7a), TOBN(0x51013cc0, 0xa8a566ae), TOBN(0xdd5e9243, 0x47c00d3b), TOBN(0x7fde089d, 0x946bb0e5), TOBN(0x030754fe, 0xc731b4b3), TOBN(0x12a136a4, 0x99fda062), TOBN(0x7c1064b8, 0x5a1a35bc), TOBN(0xbf1f5763, 0x446c84ef), TOBN(0xed29a56d, 0xa16d4b34), TOBN(0x7fba9d09, 0xdca21c4f), TOBN(0x66d7ac00, 0x6d8de486), TOBN(0x60061987, 0x73a2a5e1), TOBN(0x8b400f86, 0x9da28ff0), TOBN(0x3133f708, 0x43c4599c), TOBN(0x9911c9b8, 0xee28cb0d), TOBN(0xcd7e2874, 0x8e0af61d), TOBN(0x5a85f0f2, 0x72ed91fc), TOBN(0x85214f31, 0x9cd4a373), TOBN(0x881fe5be, 0x1925253c), TOBN(0xd8dc98e0, 0x91e8bc76), TOBN(0x7120affe, 0x585cc3a2), TOBN(0x724952ed, 0x735bf97a), TOBN(0x5581e7dc, 0x3eb34581), TOBN(0x5cbff4f2, 0xe52ee57d), TOBN(0x8d320a0e, 0x87d8cc7b), TOBN(0x9beaa7f3, 0xf1d280d0), TOBN(0x7a0b9571, 0x9beec704), TOBN(0x9126332e, 0x5b7f0057), TOBN(0x01fbc1b4, 0x8ed3bd6d), TOBN(0x35bb2c12, 0xd945eb24), TOBN(0x6404694e, 0x9a8ae255), TOBN(0xb6092eec, 0x8d6abfb3), TOBN(0x4d76143f, 0xcc058865), TOBN(0x7b0a5af2, 0x6e249922), TOBN(0x8aef9440, 0x6a50d353), TOBN(0xe11e4bcc, 0x64f0e07a), TOBN(0x4472993a, 0xa14a90fa), TOBN(0x7706e20c, 0xba0c51d4), TOBN(0xf403292f, 0x1532672d), TOBN(0x52573bfa, 0x21829382), TOBN(0x6a7bb6a9, 0x3b5bdb83), TOBN(0x08da65c0, 0xa4a72318), TOBN(0xc58d22aa, 0x63eb065f), TOBN(0x1717596c, 0x1b15d685), TOBN(0x112df0d0, 0xb266d88b), TOBN(0xf688ae97, 0x5941945a), TOBN(0x487386e3, 0x7c292cac), TOBN(0x42f3b50d, 0x57d6985c), TOBN(0x6da4f998, 0x6a90fc34), TOBN(0xc8f257d3, 0x65ca8a8d), TOBN(0xc2feabca, 0x6951f762), TOBN(0xe1bc81d0, 0x74c323ac), TOBN(0x1bc68f67, 0x251a2a12), TOBN(0x10d86587, 0xbe8a70dc), TOBN(0xd648af7f, 0xf0f84d2e), TOBN(0xf0aa9ebc, 0x6a43ac92), TOBN(0x69e3be04, 0x27596893), TOBN(0xb6bb02a6, 0x45bf452b), TOBN(0x0875c11a, 0xf4c698c8), TOBN(0x6652b5c7, 0xbece3794), TOBN(0x7b3755fd, 0x4f5c0499), TOBN(0x6ea16558, 0xb5532b38), TOBN(0xd1c69889, 0xa2e96ef7), TOBN(0x9c773c3a, 0x61ed8f48), TOBN(0x2b653a40, 0x9b323abc), TOBN(0xe26605e1, 0xf0e1d791), TOBN(0x45d41064, 0x4a87157a), TOBN(0x8f9a78b7, 0xcbbce616), TOBN(0xcf1e44aa, 0xc407eddd), TOBN(0x81ddd1d8, 0xa35b964f), TOBN(0x473e339e, 0xfd083999), TOBN(0x6c94bdde, 0x8e796802), TOBN(0x5a304ada, 0x8545d185), TOBN(0x82ae44ea, 0x738bb8cb), TOBN(0x628a35e3, 0xdf87e10e), TOBN(0xd3624f3d, 0xa15b9fe3), TOBN(0xcc44209b, 0x14be4254), TOBN(0x7d0efcbc, 0xbdbc2ea5), TOBN(0x1f603362, 0x04c37bbe), TOBN(0x21f363f5, 0x56a5852c), TOBN(0xa1503d1c, 0xa8501550), TOBN(0x2251e0e1, 0xd8ab10bb), TOBN(0xde129c96, 0x6961c51c), TOBN(0x1f7246a4, 0x81910f68), TOBN(0x2eb744ee, 0x5f2591f2), TOBN(0x3c47d33f, 0x5e627157), TOBN(0x4d6d62c9, 0x22f3bd68), TOBN(0x6120a64b, 0xcb8df856), TOBN(0x3a9ac6c0, 0x7b5d07df), TOBN(0xa92b9558, 0x7ef39783), TOBN(0xe128a134, 0xab3a9b4f), TOBN(0x41c18807, 0xb1252f05), TOBN(0xfc7ed089, 0x80ba9b1c), TOBN(0xac8dc6de, 0xc532a9dd), TOBN(0xbf829cef, 0x55246809), TOBN(0x101b784f, 0x5b4ee80f), TOBN(0xc09945bb, 0xb6f11603), TOBN(0x57b09dbe, 0x41d2801e), TOBN(0xfba5202f, 0xa97534a8), TOBN(0x7fd8ae5f, 0xc17b9614), TOBN(0xa50ba666, 0x78308435), TOBN(0x9572f77c, 0xd3868c4d), TOBN(0x0cef7bfd, 0x2dd7aab0), TOBN(0xe7958e08, 0x2c7c79ff), TOBN(0x81262e42, 0x25346689), TOBN(0x716da290, 0xb07c7004), TOBN(0x35f911ea, 0xb7950ee3), TOBN(0x6fd72969, 0x261d21b5), TOBN(0x52389803, 0x08b640d3), TOBN(0x5b0026ee, 0x887f12a1), TOBN(0x20e21660, 0x742e9311), TOBN(0x0ef6d541, 0x5ff77ff7), TOBN(0x969127f0, 0xf9c41135), TOBN(0xf21d60c9, 0x68a64993), TOBN(0x656e5d0c, 0xe541875c), TOBN(0xf1e0f84e, 0xa1d3c233), TOBN(0x9bcca359, 0x06002d60), TOBN(0xbe2da60c, 0x06191552), TOBN(0x5da8bbae, 0x61181ec3), TOBN(0x9f04b823, 0x65806f19), TOBN(0xf1604a7d, 0xd4b79bb8), TOBN(0xaee806fb, 0x52c878c8), TOBN(0x34144f11, 0x8d47b8e8), TOBN(0x72edf52b, 0x949f9054), TOBN(0xebfca84e, 0x2127015a), TOBN(0x9051d0c0, 0x9cb7cef3), TOBN(0x86e8fe58, 0x296deec8), TOBN(0x33b28188, 0x41010d74)}, {TOBN(0x01079383, 0x171b445f), TOBN(0x9bcf21e3, 0x8131ad4c), TOBN(0x8cdfe205, 0xc93987e8), TOBN(0xe63f4152, 0xc92e8c8f), TOBN(0x729462a9, 0x30add43d), TOBN(0x62ebb143, 0xc980f05a), TOBN(0x4f3954e5, 0x3b06e968), TOBN(0xfe1d75ad, 0x242cf6b1), TOBN(0x5f95c6c7, 0xaf8685c8), TOBN(0xd4c1c8ce, 0x2f8f01aa), TOBN(0xc44bbe32, 0x2574692a), TOBN(0xb8003478, 0xd4a4a068), TOBN(0x7c8fc6e5, 0x2eca3cdb), TOBN(0xea1db16b, 0xec04d399), TOBN(0xb05bc82e, 0x8f2bc5cf), TOBN(0x763d517f, 0xf44793d2), TOBN(0x4451c1b8, 0x08bd98d0), TOBN(0x644b1cd4, 0x6575f240), TOBN(0x6907eb33, 0x7375d270), TOBN(0x56c8bebd, 0xfa2286bd), TOBN(0xc713d2ac, 0xc4632b46), TOBN(0x17da427a, 0xafd60242), TOBN(0x313065b7, 0xc95c7546), TOBN(0xf8239898, 0xbf17a3de), TOBN(0xf3b7963f, 0x4c830320), TOBN(0x842c7aa0, 0x903203e3), TOBN(0xaf22ca0a, 0xe7327afb), TOBN(0x38e13092, 0x967609b6), TOBN(0x73b8fb62, 0x757558f1), TOBN(0x3cc3e831, 0xf7eca8c1), TOBN(0xe4174474, 0xf6331627), TOBN(0xa77989ca, 0xc3c40234), TOBN(0xe5fd17a1, 0x44a081e0), TOBN(0xd797fb7d, 0xb70e296a), TOBN(0x2b472b30, 0x481f719c), TOBN(0x0e632a98, 0xfe6f8c52), TOBN(0x89ccd116, 0xc5f0c284), TOBN(0xf51088af, 0x2d987c62), TOBN(0x2a2bccda, 0x4c2de6cf), TOBN(0x810f9efe, 0xf679f0f9), TOBN(0xb0f394b9, 0x7ffe4b3e), TOBN(0x0b691d21, 0xe5fa5d21), TOBN(0xb0bd7747, 0x9dfbbc75), TOBN(0xd2830fda, 0xfaf78b00), TOBN(0xf78c249c, 0x52434f57), TOBN(0x4b1f7545, 0x98096dab), TOBN(0x73bf6f94, 0x8ff8c0b3), TOBN(0x34aef03d, 0x454e134c), TOBN(0xf8d151f4, 0xb7ac7ec5), TOBN(0xd6ceb95a, 0xe50da7d5), TOBN(0xa1b492b0, 0xdc3a0eb8), TOBN(0x75157b69, 0xb3dd2863), TOBN(0xe2c4c74e, 0xc5413d62), TOBN(0xbe329ff7, 0xbc5fc4c7), TOBN(0x835a2aea, 0x60fa9dda), TOBN(0xf117f5ad, 0x7445cb87), TOBN(0xae8317f4, 0xb0166f7a), TOBN(0xfbd3e3f7, 0xceec74e6), TOBN(0xfdb516ac, 0xe0874bfd), TOBN(0x3d846019, 0xc681f3a3), TOBN(0x0b12ee5c, 0x7c1620b0), TOBN(0xba68b4dd, 0x2b63c501), TOBN(0xac03cd32, 0x6668c51e), TOBN(0x2a6279f7, 0x4e0bcb5b), TOBN(0x17bd69b0, 0x6ae85c10), TOBN(0x72946979, 0x1dfdd3a6), TOBN(0xd9a03268, 0x2c078bec), TOBN(0x41c6a658, 0xbfd68a52), TOBN(0xcdea1024, 0x0e023900), TOBN(0xbaeec121, 0xb10d144d), TOBN(0x5a600e74, 0x058ab8dc), TOBN(0x1333af21, 0xbb89ccdd), TOBN(0xdf25eae0, 0x3aaba1f1), TOBN(0x2cada16e, 0x3b7144cf), TOBN(0x657ee27d, 0x71ab98bc), TOBN(0x99088b4c, 0x7a6fc96e), TOBN(0x05d5c0a0, 0x3549dbd4), TOBN(0x42cbdf8f, 0xf158c3ac), TOBN(0x3fb6b3b0, 0x87edd685), TOBN(0x22071cf6, 0x86f064d0), TOBN(0xd2d6721f, 0xff2811e5), TOBN(0xdb81b703, 0xfe7fae8c), TOBN(0x3cfb74ef, 0xd3f1f7bb), TOBN(0x0cdbcd76, 0x16cdeb5d), TOBN(0x4f39642a, 0x566a808c), TOBN(0x02b74454, 0x340064d6), TOBN(0xfabbadca, 0x0528fa6f), TOBN(0xe4c3074c, 0xd3fc0bb6), TOBN(0xb32cb8b0, 0xb796d219), TOBN(0xc3e95f4f, 0x34741dd9), TOBN(0x87212125, 0x68edf6f5), TOBN(0x7a03aee4, 0xa2b9cb8e), TOBN(0x0cd3c376, 0xf53a89aa), TOBN(0x0d8af9b1, 0x948a28dc), TOBN(0xcf86a3f4, 0x902ab04f), TOBN(0x8aacb62a, 0x7f42002d), TOBN(0x106985eb, 0xf62ffd52), TOBN(0xe670b54e, 0x5797bf10), TOBN(0x4b405209, 0xc5e30aef), TOBN(0x12c97a20, 0x4365b5e9), TOBN(0x104646ce, 0x1fe32093), TOBN(0x13cb4ff6, 0x3907a8c9), TOBN(0x8b9f30d1, 0xd46e726b), TOBN(0xe1985e21, 0xaba0f499), TOBN(0xc573dea9, 0x10a230cd), TOBN(0x24f46a93, 0xcd30f947), TOBN(0xf2623fcf, 0xabe2010a), TOBN(0x3f278cb2, 0x73f00e4f), TOBN(0xed55c67d, 0x50b920eb), TOBN(0xf1cb9a2d, 0x8e760571), TOBN(0x7c50d109, 0x0895b709), TOBN(0x4207cf07, 0x190d4369), TOBN(0x3b027e81, 0xc4127fe1), TOBN(0xa9f8b9ad, 0x3ae9c566), TOBN(0x5ab10851, 0xacbfbba5), TOBN(0xa747d648, 0x569556f5), TOBN(0xcc172b5c, 0x2ba97bf7), TOBN(0x15e0f77d, 0xbcfa3324), TOBN(0xa345b797, 0x7686279d), TOBN(0x5a723480, 0xe38003d3), TOBN(0xfd8e139f, 0x8f5fcda8), TOBN(0xf3e558c4, 0xbdee5bfd), TOBN(0xd76cbaf4, 0xe33f9f77), TOBN(0x3a4c97a4, 0x71771969), TOBN(0xda27e84b, 0xf6dce6a7), TOBN(0xff373d96, 0x13e6c2d1), TOBN(0xf115193c, 0xd759a6e9), TOBN(0x3f9b7025, 0x63d2262c), TOBN(0xd9764a31, 0x317cd062), TOBN(0x30779d8e, 0x199f8332), TOBN(0xd8074106, 0x16b11b0b), TOBN(0x7917ab9f, 0x78aeaed8), TOBN(0xb67a9cbe, 0x28fb1d8e), TOBN(0x2e313563, 0x136eda33), TOBN(0x010b7069, 0xa371a86c), TOBN(0x44d90fa2, 0x6744e6b7), TOBN(0x68190867, 0xd6b3e243), TOBN(0x9fe6cd9d, 0x59048c48), TOBN(0xb900b028, 0x95731538), TOBN(0xa012062f, 0x32cae04f), TOBN(0x8107c8bc, 0x9399d082), TOBN(0x47e8c54a, 0x41df12e2), TOBN(0x14ba5117, 0xb6ef3f73), TOBN(0x22260bea, 0x81362f0b), TOBN(0x90ea261e, 0x1a18cc20), TOBN(0x2192999f, 0x2321d636), TOBN(0xef64d314, 0xe311b6a0), TOBN(0xd7401e4c, 0x3b54a1f5), TOBN(0x19019983, 0x6fbca2ba), TOBN(0x46ad3293, 0x8fbffc4b), TOBN(0xa142d3f6, 0x3786bf40), TOBN(0xeb5cbc26, 0xb67039fc), TOBN(0x9cb0ae6c, 0x252bd479), TOBN(0x05e0f88a, 0x12b5848f), TOBN(0x78f6d2b2, 0xa5c97663), TOBN(0x6f6e149b, 0xc162225c), TOBN(0xe602235c, 0xde601a89), TOBN(0xd17bbe98, 0xf373be1f), TOBN(0xcaf49a5b, 0xa8471827), TOBN(0x7e1a0a85, 0x18aaa116), TOBN(0x6c833196, 0x270580c3), TOBN(0x1e233839, 0xf1c98a14), TOBN(0x67b2f7b4, 0xae34e0a5), TOBN(0x47ac8745, 0xd8ce7289), TOBN(0x2b74779a, 0x100dd467), TOBN(0x274a4337, 0x4ee50d09), TOBN(0x603dcf13, 0x83608bc9), TOBN(0xcd9da6c3, 0xc89e8388), TOBN(0x2660199f, 0x355116ac), TOBN(0xcc38bb59, 0xb6d18eed), TOBN(0x3075f31f, 0x2f4bc071), TOBN(0x9774457f, 0x265dc57e), TOBN(0x06a6a9c8, 0xc6db88bb), TOBN(0x6429d07f, 0x4ec98e04), TOBN(0x8d05e57b, 0x05ecaa8b), TOBN(0x20f140b1, 0x7872ea7b), TOBN(0xdf8c0f09, 0xca494693), TOBN(0x48d3a020, 0xf252e909), TOBN(0x4c5c29af, 0x57b14b12), TOBN(0x7e6fa37d, 0xbf47ad1c), TOBN(0x66e7b506, 0x49a0c938), TOBN(0xb72c0d48, 0x6be5f41f), TOBN(0x6a6242b8, 0xb2359412), TOBN(0xcd35c774, 0x8e859480), TOBN(0x12536fea, 0x87baa627), TOBN(0x58c1fec1, 0xf72aa680), TOBN(0x6c29b637, 0x601e5dc9), TOBN(0x9e3c3c1c, 0xde9e01b9), TOBN(0xefc8127b, 0x2bcfe0b0), TOBN(0x35107102, 0x2a12f50d), TOBN(0x6ccd6cb1, 0x4879b397), TOBN(0xf792f804, 0xf8a82f21), TOBN(0x509d4804, 0xa9b46402), TOBN(0xedddf85d, 0xc10f0850), TOBN(0x928410dc, 0x4b6208aa), TOBN(0xf6229c46, 0x391012dc), TOBN(0xc5a7c41e, 0x7727b9b6), TOBN(0x289e4e4b, 0xaa444842), TOBN(0x049ba1d9, 0xe9a947ea), TOBN(0x44f9e47f, 0x83c8debc), TOBN(0xfa77a1fe, 0x611f8b8e), TOBN(0xfd2e416a, 0xf518f427), TOBN(0xc5fffa70, 0x114ebac3), TOBN(0xfe57c4e9, 0x5d89697b), TOBN(0xfdd053ac, 0xb1aaf613), TOBN(0x31df210f, 0xea585a45), TOBN(0x318cc10e, 0x24985034), TOBN(0x1a38efd1, 0x5f1d6130), TOBN(0xbf86f237, 0x0b1e9e21), TOBN(0xb258514d, 0x1dbe88aa), TOBN(0x1e38a588, 0x90c1baf9), TOBN(0x2936a01e, 0xbdb9b692), TOBN(0xd576de98, 0x6dd5b20c), TOBN(0xb586bf71, 0x70f98ecf), TOBN(0xcccf0f12, 0xc42d2fd7), TOBN(0x8717e61c, 0xfb35bd7b), TOBN(0x8b1e5722, 0x35e6fc06), TOBN(0x3477728f, 0x0b3e13d5), TOBN(0x150c294d, 0xaa8a7372), TOBN(0xc0291d43, 0x3bfa528a), TOBN(0xc6c8bc67, 0xcec5a196), TOBN(0xdeeb31e4, 0x5c2e8a7c), TOBN(0xba93e244, 0xfb6e1c51), TOBN(0xb9f8b71b, 0x2e28e156), TOBN(0xce65a287, 0x968a2ab9), TOBN(0xe3c5ce69, 0x46bbcb1f), TOBN(0xf8c835b9, 0xe7ae3f30), TOBN(0x16bbee26, 0xff72b82b), TOBN(0x665e2017, 0xfd42cd22), TOBN(0x1e139970, 0xf8b1d2a0), TOBN(0x125cda29, 0x79204932), TOBN(0x7aee94a5, 0x49c3bee5), TOBN(0x68c70160, 0x89821a66), TOBN(0xf7c37678, 0x8f981669), TOBN(0xd90829fc, 0x48cc3645), TOBN(0x346af049, 0xd70addfc), TOBN(0x2057b232, 0x370bf29c), TOBN(0xf90c73ce, 0x42e650ee), TOBN(0xe03386ea, 0xa126ab90), TOBN(0x0e266e7e, 0x975a087b), TOBN(0x80578eb9, 0x0fca65d9), TOBN(0x7e2989ea, 0x16af45b8), TOBN(0x7438212d, 0xcac75a4e), TOBN(0x38c7ca39, 0x4fef36b8), TOBN(0x8650c494, 0xd402676a), TOBN(0x26ab5a66, 0xf72c7c48), TOBN(0x4e6cb426, 0xce3a464e), TOBN(0xf8f99896, 0x2b72f841), TOBN(0x8c318491, 0x1a335cc8), TOBN(0x563459ba, 0x6a5913e4), TOBN(0x1b920d61, 0xc7b32919), TOBN(0x805ab8b6, 0xa02425ad), TOBN(0x2ac512da, 0x8d006086), TOBN(0x6ca4846a, 0xbcf5c0fd), TOBN(0xafea51d8, 0xac2138d7), TOBN(0xcb647545, 0x344cd443), TOBN(0x0429ee8f, 0xbd7d9040), TOBN(0xee66a2de, 0x819b9c96), TOBN(0x54f9ec25, 0xdea7d744), TOBN(0x2ffea642, 0x671721bb), TOBN(0x4f19dbd1, 0x114344ea), TOBN(0x04304536, 0xfd0dbc8b), TOBN(0x014b50aa, 0x29ec7f91), TOBN(0xb5fc22fe, 0xbb06014d), TOBN(0x60d963a9, 0x1ee682e0), TOBN(0xdf48abc0, 0xfe85c727), TOBN(0x0cadba13, 0x2e707c2d), TOBN(0xde608d3a, 0xa645aeff), TOBN(0x05f1c28b, 0xedafd883), TOBN(0x3c362ede, 0xbd94de1f), TOBN(0x8dd0629d, 0x13593e41), TOBN(0x0a5e736f, 0x766d6eaf), TOBN(0xbfa92311, 0xf68cf9d1), TOBN(0xa4f9ef87, 0xc1797556), TOBN(0x10d75a1f, 0x5601c209), TOBN(0x651c374c, 0x09b07361), TOBN(0x49950b58, 0x88b5cead), TOBN(0x0ef00058, 0x6fa9dbaa), TOBN(0xf51ddc26, 0x4e15f33a), TOBN(0x1f8b5ca6, 0x2ef46140), TOBN(0x343ac0a3, 0xee9523f0), TOBN(0xbb75eab2, 0x975ea978), TOBN(0x1bccf332, 0x107387f4), TOBN(0x790f9259, 0x9ab0062e), TOBN(0xf1a363ad, 0x1e4f6a5f), TOBN(0x06e08b84, 0x62519a50), TOBN(0x60915187, 0x7265f1ee), TOBN(0x6a80ca34, 0x93ae985e), TOBN(0x81b29768, 0xaaba4864), TOBN(0xb13cabf2, 0x8d52a7d6), TOBN(0xb5c36348, 0x8ead03f1), TOBN(0xc932ad95, 0x81c7c1c0), TOBN(0x5452708e, 0xcae1e27b), TOBN(0x9dac4269, 0x1b0df648), TOBN(0x233e3f0c, 0xdfcdb8bc), TOBN(0xe6ceccdf, 0xec540174), TOBN(0xbd0d845e, 0x95081181), TOBN(0xcc8a7920, 0x699355d5), TOBN(0x111c0f6d, 0xc3b375a8), TOBN(0xfd95bc6b, 0xfd51e0dc), TOBN(0x4a106a26, 0x6888523a), TOBN(0x4d142bd6, 0xcb01a06d), TOBN(0x79bfd289, 0xadb9b397), TOBN(0x0bdbfb94, 0xe9863914), TOBN(0x29d8a229, 0x1660f6a6), TOBN(0x7f6abcd6, 0x551c042d), TOBN(0x13039deb, 0x0ac3ffe8), TOBN(0xa01be628, 0xec8523fb), TOBN(0x6ea34103, 0x0ca1c328), TOBN(0xc74114bd, 0xb903928e), TOBN(0x8aa4ff4e, 0x9e9144b0), TOBN(0x7064091f, 0x7f9a4b17), TOBN(0xa3f4f521, 0xe447f2c4), TOBN(0x81b8da7a, 0x604291f0), TOBN(0xd680bc46, 0x7d5926de), TOBN(0x84f21fd5, 0x34a1202f), TOBN(0x1d1e3181, 0x4e9df3d8), TOBN(0x1ca4861a, 0x39ab8d34), TOBN(0x809ddeec, 0x5b19aa4a), TOBN(0x59f72f7e, 0x4d329366), TOBN(0xa2f93f41, 0x386d5087), TOBN(0x40bf739c, 0xdd67d64f), TOBN(0xb4494205, 0x66702158), TOBN(0xc33c65be, 0x73b1e178), TOBN(0xcdcd657c, 0x38ca6153), TOBN(0x97f4519a, 0xdc791976), TOBN(0xcc7c7f29, 0xcd6e1f39), TOBN(0x38de9cfb, 0x7e3c3932), TOBN(0xe448eba3, 0x7b793f85), TOBN(0xe9f8dbf9, 0xf067e914), TOBN(0xc0390266, 0xf114ae87), TOBN(0x39ed75a7, 0xcd6a8e2a), TOBN(0xadb14848, 0x7ffba390), TOBN(0x67f8cb8b, 0x6af9bc09), TOBN(0x322c3848, 0x9c7476db), TOBN(0xa320fecf, 0x52a538d6), TOBN(0xe0493002, 0xb2aced2b), TOBN(0xdfba1809, 0x616bd430), TOBN(0x531c4644, 0xc331be70), TOBN(0xbc04d32e, 0x90d2e450), TOBN(0x1805a0d1, 0x0f9f142d), TOBN(0x2c44a0c5, 0x47ee5a23), TOBN(0x31875a43, 0x3989b4e3), TOBN(0x6b1949fd, 0x0c063481), TOBN(0x2dfb9e08, 0xbe0f4492), TOBN(0x3ff0da03, 0xe9d5e517), TOBN(0x03dbe9a1, 0xf79466a8), TOBN(0x0b87bcd0, 0x15ea9932), TOBN(0xeb64fc83, 0xab1f58ab), TOBN(0x6d9598da, 0x817edc8a), TOBN(0x699cff66, 0x1d3b67e5), TOBN(0x645c0f29, 0x92635853), TOBN(0x253cdd82, 0xeabaf21c), TOBN(0x82b9602a, 0x2241659e), TOBN(0x2cae07ec, 0x2d9f7091), TOBN(0xbe4c720c, 0x8b48cd9b), TOBN(0x6ce5bc03, 0x6f08d6c9), TOBN(0x36e8a997, 0xaf10bf40), TOBN(0x83422d21, 0x3e10ff12), TOBN(0x7b26d3eb, 0xbcc12494), TOBN(0xb240d2d0, 0xc9469ad6), TOBN(0xc4a11b4d, 0x30afa05b), TOBN(0x4b604ace, 0xdd6ba286), TOBN(0x18486600, 0x3ee2864c), TOBN(0x5869d6ba, 0x8d9ce5be), TOBN(0x0d8f68c5, 0xff4bfb0d), TOBN(0xb69f210b, 0x5700cf73), TOBN(0x61f6653a, 0x6d37c135), TOBN(0xff3d432b, 0x5aff5a48), TOBN(0x0d81c4b9, 0x72ba3a69), TOBN(0xee879ae9, 0xfa1899ef), TOBN(0xbac7e2a0, 0x2d6acafd), TOBN(0xd6d93f6c, 0x1c664399), TOBN(0x4c288de1, 0x5bcb135d), TOBN(0x83031dab, 0x9dab7cbf), TOBN(0xfe23feb0, 0x3abbf5f0), TOBN(0x9f1b2466, 0xcdedca85), TOBN(0x140bb710, 0x1a09538c), TOBN(0xac8ae851, 0x5e11115d), TOBN(0x0d63ff67, 0x6f03f59e), TOBN(0x755e5551, 0x7d234afb), TOBN(0x61c2db4e, 0x7e208fc1), TOBN(0xaa9859ce, 0xf28a4b5d), TOBN(0xbdd6d4fc, 0x34af030f), TOBN(0xd1c4a26d, 0x3be01cb1), TOBN(0x9ba14ffc, 0x243aa07c), TOBN(0xf95cd3a9, 0xb2503502), TOBN(0xe379bc06, 0x7d2a93ab), TOBN(0x3efc18e9, 0xd4ca8d68), TOBN(0x083558ec, 0x80bb412a), TOBN(0xd903b940, 0x9645a968), TOBN(0xa499f0b6, 0x9ba6054f), TOBN(0x208b573c, 0xb8349abe), TOBN(0x3baab3e5, 0x30b4fc1c), TOBN(0x87e978ba, 0xcb524990), TOBN(0x3524194e, 0xccdf0e80), TOBN(0x62711725, 0x7d4bcc42), TOBN(0xe90a3d9b, 0xb90109ba), TOBN(0x3b1bdd57, 0x1323e1e0), TOBN(0xb78e9bd5, 0x5eae1599), TOBN(0x0794b746, 0x9e03d278), TOBN(0x80178605, 0xd70e6297), TOBN(0x171792f8, 0x99c97855), TOBN(0x11b393ee, 0xf5a86b5c), TOBN(0x48ef6582, 0xd8884f27), TOBN(0xbd44737a, 0xbf19ba5f), TOBN(0x8698de4c, 0xa42062c6), TOBN(0x8975eb80, 0x61ce9c54), TOBN(0xd50e57c7, 0xd7fe71f3), TOBN(0x15342190, 0xbc97ce38), TOBN(0x51bda2de, 0x4df07b63), TOBN(0xba12aeae, 0x200eb87d), TOBN(0xabe135d2, 0xa9b4f8f6), TOBN(0x04619d65, 0xfad6d99c), TOBN(0x4a6683a7, 0x7994937c), TOBN(0x7a778c8b, 0x6f94f09a), TOBN(0x8c508623, 0x20a71b89), TOBN(0x241a2aed, 0x1c229165), TOBN(0x352be595, 0xaaf83a99), TOBN(0x9fbfee7f, 0x1562bac8), TOBN(0xeaf658b9, 0x5c4017e3), TOBN(0x1dc7f9e0, 0x15120b86), TOBN(0xd84f13dd, 0x4c034d6f), TOBN(0x283dd737, 0xeaea3038), TOBN(0x197f2609, 0xcd85d6a2), TOBN(0x6ebbc345, 0xfae60177), TOBN(0xb80f031b, 0x4e12fede), TOBN(0xde55d0c2, 0x07a2186b), TOBN(0x1fb3e37f, 0x24dcdd5a), TOBN(0x8d602da5, 0x7ed191fb), TOBN(0x108fb056, 0x76023e0d), TOBN(0x70178c71, 0x459c20c0), TOBN(0xfad5a386, 0x3fe54cf0), TOBN(0xa4a3ec4f, 0x02bbb475), TOBN(0x1aa5ec20, 0x919d94d7), TOBN(0x5d3b63b5, 0xa81e4ab3), TOBN(0x7fa733d8, 0x5ad3d2af), TOBN(0xfbc586dd, 0xd1ac7a37), TOBN(0x282925de, 0x40779614), TOBN(0xfe0ffffb, 0xe74a242a), TOBN(0x3f39e67f, 0x906151e5), TOBN(0xcea27f5f, 0x55e10649), TOBN(0xdca1d4e1, 0xc17cf7b7), TOBN(0x0c326d12, 0x2fe2362d), TOBN(0x05f7ac33, 0x7dd35df3), TOBN(0x0c3b7639, 0xc396dbdf), TOBN(0x0912f5ac, 0x03b7db1c), TOBN(0x9dea4b70, 0x5c9ed4a9), TOBN(0x475e6e53, 0xaae3f639), TOBN(0xfaba0e7c, 0xfc278bac), TOBN(0x16f9e221, 0x9490375f), TOBN(0xaebf9746, 0xa5a7ed0a), TOBN(0x45f9af3f, 0xf41ad5d6), TOBN(0x03c4623c, 0xb2e99224), TOBN(0x82c5bb5c, 0xb3cf56aa), TOBN(0x64311819, 0x34567ed3), TOBN(0xec57f211, 0x8be489ac), TOBN(0x2821895d, 0xb9a1104b), TOBN(0x610dc875, 0x6064e007), TOBN(0x8e526f3f, 0x5b20d0fe), TOBN(0x6e71ca77, 0x5b645aee), TOBN(0x3d1dcb9f, 0x800e10ff), TOBN(0x36b51162, 0x189cf6de), TOBN(0x2c5a3e30, 0x6bb17353), TOBN(0xc186cd3e, 0x2a6c6fbf), TOBN(0xa74516fa, 0x4bf97906), TOBN(0x5b4b8f4b, 0x279d6901), TOBN(0x0c4e57b4, 0x2b573743), TOBN(0x75fdb229, 0xb6e386b6), TOBN(0xb46793fd, 0x99deac27), TOBN(0xeeec47ea, 0xcf712629), TOBN(0xe965f3c4, 0xcbc3b2dd), TOBN(0x8dd1fb83, 0x425c6559), TOBN(0x7fc00ee6, 0x0af06fda), TOBN(0xe98c9225, 0x33d956df), TOBN(0x0f1ef335, 0x4fbdc8a2), TOBN(0x2abb5145, 0xb79b8ea2), TOBN(0x40fd2945, 0xbdbff288), TOBN(0x6a814ac4, 0xd7185db7), TOBN(0xc4329d6f, 0xc084609a), TOBN(0xc9ba7b52, 0xed1be45d), TOBN(0x891dd20d, 0xe4cd2c74), TOBN(0x5a4d4a7f, 0x824139b1), TOBN(0x66c17716, 0xb873c710), TOBN(0x5e5bc141, 0x2843c4e0), TOBN(0xd5ac4817, 0xb97eb5bf), TOBN(0xc0f8af54, 0x450c95c7), TOBN(0xc91b3fa0, 0x318406c5), TOBN(0x360c340a, 0xab9d97f8), TOBN(0xfb57bd07, 0x90a2d611), TOBN(0x4339ae3c, 0xa6a6f7e5), TOBN(0x9c1fcd2a, 0x2feb8a10), TOBN(0x972bcca9, 0xc7ea7432), TOBN(0x1b0b924c, 0x308076f6), TOBN(0x80b2814a, 0x2a5b4ca5), TOBN(0x2f78f55b, 0x61ef3b29), TOBN(0xf838744a, 0xc18a414f), TOBN(0xc611eaae, 0x903d0a86), TOBN(0x94dabc16, 0x2a453f55), TOBN(0xe6f2e3da, 0x14efb279), TOBN(0x5b7a6017, 0x9320dc3c), TOBN(0x692e382f, 0x8df6b5a4), TOBN(0x3f5e15e0, 0x2d40fa90), TOBN(0xc87883ae, 0x643dd318), TOBN(0x511053e4, 0x53544774), TOBN(0x834d0ecc, 0x3adba2bc), TOBN(0x4215d7f7, 0xbae371f5), TOBN(0xfcfd57bf, 0x6c8663bc), TOBN(0xded2383d, 0xd6901b1d), TOBN(0x3b49fbb4, 0xb5587dc3), TOBN(0xfd44a08d, 0x07625f62), TOBN(0x3ee4d65b, 0x9de9b762)}, {TOBN(0x64e5137d, 0x0d63d1fa), TOBN(0x658fc052, 0x02a9d89f), TOBN(0x48894874, 0x50436309), TOBN(0xe9ae30f8, 0xd598da61), TOBN(0x2ed710d1, 0x818baf91), TOBN(0xe27e9e06, 0x8b6a0c20), TOBN(0x1e28dcfb, 0x1c1a6b44), TOBN(0x883acb64, 0xd6ac57dc), TOBN(0x8735728d, 0xc2c6ff70), TOBN(0x79d6122f, 0xc5dc2235), TOBN(0x23f5d003, 0x19e277f9), TOBN(0x7ee84e25, 0xdded8cc7), TOBN(0x91a8afb0, 0x63cd880a), TOBN(0x3f3ea7c6, 0x3574af60), TOBN(0x0cfcdc84, 0x02de7f42), TOBN(0x62d0792f, 0xb31aa152), TOBN(0x8e1b4e43, 0x8a5807ce), TOBN(0xad283893, 0xe4109a7e), TOBN(0xc30cc9cb, 0xafd59dda), TOBN(0xf65f36c6, 0x3d8d8093), TOBN(0xdf31469e, 0xa60d32b2), TOBN(0xee93df4b, 0x3e8191c8), TOBN(0x9c1017c5, 0x355bdeb5), TOBN(0xd2623185, 0x8616aa28), TOBN(0xb02c83f9, 0xdec31a21), TOBN(0x988c8b23, 0x6ad9d573), TOBN(0x53e983ae, 0xa57be365), TOBN(0xe968734d, 0x646f834e), TOBN(0x9137ea8f, 0x5da6309b), TOBN(0x10f3a624, 0xc1f1ce16), TOBN(0x782a9ea2, 0xca440921), TOBN(0xdf94739e, 0x5b46f1b5), TOBN(0x9f9be006, 0xcce85c9b), TOBN(0x360e70d6, 0xa4c7c2d3), TOBN(0x2cd5beea, 0xaefa1e60), TOBN(0x64cf63c0, 0x8c3d2b6d), TOBN(0xfb107fa3, 0xe1cf6f90), TOBN(0xb7e937c6, 0xd5e044e6), TOBN(0x74e8ca78, 0xce34db9f), TOBN(0x4f8b36c1, 0x3e210bd0), TOBN(0x1df165a4, 0x34a35ea8), TOBN(0x3418e0f7, 0x4d4412f6), TOBN(0x5af1f8af, 0x518836c3), TOBN(0x42ceef4d, 0x130e1965), TOBN(0x5560ca0b, 0x543a1957), TOBN(0xc33761e5, 0x886cb123), TOBN(0x66624b1f, 0xfe98ed30), TOBN(0xf772f4bf, 0x1090997d), TOBN(0xf4e540bb, 0x4885d410), TOBN(0x7287f810, 0x9ba5f8d7), TOBN(0x22d0d865, 0xde98dfb1), TOBN(0x49ff51a1, 0xbcfbb8a3), TOBN(0xb6b6fa53, 0x6bc3012e), TOBN(0x3d31fd72, 0x170d541d), TOBN(0x8018724f, 0x4b0f4966), TOBN(0x79e7399f, 0x87dbde07), TOBN(0x56f8410e, 0xf4f8b16a), TOBN(0x97241afe, 0xc47b266a), TOBN(0x0a406b8e, 0x6d9c87c1), TOBN(0x803f3e02, 0xcd42ab1b), TOBN(0x7f0309a8, 0x04dbec69), TOBN(0xa83b85f7, 0x3bbad05f), TOBN(0xc6097273, 0xad8e197f), TOBN(0xc097440e, 0x5067adc1), TOBN(0x730eafb6, 0x3524ff16), TOBN(0xd7f9b51e, 0x823fc6ce), TOBN(0x27bd0d32, 0x443e4ac0), TOBN(0x40c59ad9, 0x4d66f217), TOBN(0x6c33136f, 0x17c387a4), TOBN(0x5043b8d5, 0xeb86804d), TOBN(0x74970312, 0x675a73c9), TOBN(0x838fdb31, 0xf16669b6), TOBN(0xc507b6dd, 0x418e7ddd), TOBN(0x39888d93, 0x472f19d6), TOBN(0x7eae26be, 0x0c27eb4d), TOBN(0x17b53ed3, 0xfbabb884), TOBN(0xfc27021b, 0x2b01ae4f), TOBN(0x88462e87, 0xcf488682), TOBN(0xbee096ec, 0x215e2d87), TOBN(0xeb2fea9a, 0xd242e29b), TOBN(0x5d985b5f, 0xb821fc28), TOBN(0x89d2e197, 0xdc1e2ad2), TOBN(0x55b566b8, 0x9030ba62), TOBN(0xe3fd41b5, 0x4f41b1c6), TOBN(0xb738ac2e, 0xb9a96d61), TOBN(0x7f8567ca, 0x369443f4), TOBN(0x8698622d, 0xf803a440), TOBN(0x2b586236, 0x8fe2f4dc), TOBN(0xbbcc00c7, 0x56b95bce), TOBN(0x5ec03906, 0x616da680), TOBN(0x79162ee6, 0x72214252), TOBN(0x43132b63, 0x86a892d2), TOBN(0x4bdd3ff2, 0x2f3263bf), TOBN(0xd5b3733c, 0x9cd0a142), TOBN(0x592eaa82, 0x44415ccb), TOBN(0x663e8924, 0x8d5474ea), TOBN(0x8058a25e, 0x5236344e), TOBN(0x82e8df9d, 0xbda76ee6), TOBN(0xdcf6efd8, 0x11cc3d22), TOBN(0x00089cda, 0x3b4ab529), TOBN(0x91d3a071, 0xbd38a3db), TOBN(0x4ea97fc0, 0xef72b925), TOBN(0x0c9fc15b, 0xea3edf75), TOBN(0x5a6297cd, 0xa4348ed3), TOBN(0x0d38ab35, 0xce7c42d4), TOBN(0x9fd493ef, 0x82feab10), TOBN(0x46056b6d, 0x82111b45), TOBN(0xda11dae1, 0x73efc5c3), TOBN(0xdc740278, 0x5545a7fb), TOBN(0xbdb2601c, 0x40d507e6), TOBN(0x121dfeeb, 0x7066fa58), TOBN(0x214369a8, 0x39ae8c2a), TOBN(0x195709cb, 0x06e0956c), TOBN(0x4c9d254f, 0x010cd34b), TOBN(0xf51e13f7, 0x0471a532), TOBN(0xe19d6791, 0x1e73054d), TOBN(0xf702a628, 0xdb5c7be3), TOBN(0xc7141218, 0xb24dde05), TOBN(0xdc18233c, 0xf29b2e2e), TOBN(0x3a6bd1e8, 0x85342dba), TOBN(0x3f747fa0, 0xb311898c), TOBN(0xe2a272e4, 0xcd0eac65), TOBN(0x4bba5851, 0xf914d0bc), TOBN(0x7a1a9660, 0xc4a43ee3), TOBN(0xe5a367ce, 0xa1c8cde9), TOBN(0x9d958ba9, 0x7271abe3), TOBN(0xf3ff7eb6, 0x3d1615cd), TOBN(0xa2280dce, 0xf5ae20b0), TOBN(0x56dba5c1, 0xcf640147), TOBN(0xea5a2e3d, 0x5e83d118), TOBN(0x04cd6b6d, 0xda24c511), TOBN(0x1c0f4671, 0xe854d214), TOBN(0x91a6b7a9, 0x69565381), TOBN(0xdc966240, 0xdecf1f5b), TOBN(0x1b22d21c, 0xfcf5d009), TOBN(0x2a05f641, 0x9021dbd5), TOBN(0x8c0ed566, 0xd4312483), TOBN(0x5179a95d, 0x643e216f), TOBN(0xcc185fec, 0x17044493), TOBN(0xb3063339, 0x54991a21), TOBN(0xd801ecdb, 0x0081a726), TOBN(0x0149b0c6, 0x4fa89bbb), TOBN(0xafe9065a, 0x4391b6b9), TOBN(0xedc92786, 0xd633f3a3), TOBN(0xe408c24a, 0xae6a8e13), TOBN(0x85833fde, 0x9f3897ab), TOBN(0x43800e7e, 0xd81a0715), TOBN(0xde08e346, 0xb44ffc5f), TOBN(0x7094184c, 0xcdeff2e0), TOBN(0x49f9387b, 0x165eaed1), TOBN(0x635d6129, 0x777c468a), TOBN(0x8c0dcfd1, 0x538c2dd8), TOBN(0xd6d9d9e3, 0x7a6a308b), TOBN(0x62375830, 0x4c2767d3), TOBN(0x874a8bc6, 0xf38cbeb6), TOBN(0xd94d3f1a, 0xccb6fd9e), TOBN(0x92a9735b, 0xba21f248), TOBN(0x272ad0e5, 0x6cd1efb0), TOBN(0x7437b69c, 0x05b03284), TOBN(0xe7f04702, 0x6948c225), TOBN(0x8a56c04a, 0xcba2ecec), TOBN(0x0c181270, 0xe3a73e41), TOBN(0x6cb34e9d, 0x03e93725), TOBN(0xf77c8713, 0x496521a9), TOBN(0x94569183, 0xfa7f9f90), TOBN(0xf2e7aa4c, 0x8c9707ad), TOBN(0xced2c9ba, 0x26c1c9a3), TOBN(0x9109fe96, 0x40197507), TOBN(0x9ae868a9, 0xe9adfe1c), TOBN(0x3984403d, 0x314e39bb), TOBN(0xb5875720, 0xf2fe378f), TOBN(0x33f901e0, 0xba44a628), TOBN(0xea1125fe, 0x3652438c), TOBN(0xae9ec4e6, 0x9dd1f20b), TOBN(0x1e740d9e, 0xbebf7fbd), TOBN(0x6dbd3ddc, 0x42dbe79c), TOBN(0x62082aec, 0xedd36776), TOBN(0xf612c478, 0xe9859039), TOBN(0xa493b201, 0x032f7065), TOBN(0xebd4d8f2, 0x4ff9b211), TOBN(0x3f23a0aa, 0xaac4cb32), TOBN(0xea3aadb7, 0x15ed4005), TOBN(0xacf17ea4, 0xafa27e63), TOBN(0x56125c1a, 0xc11fd66c), TOBN(0x266344a4, 0x3794f8dc), TOBN(0xdcca923a, 0x483c5c36), TOBN(0x2d6b6bbf, 0x3f9d10a0), TOBN(0xb320c5ca, 0x81d9bdf3), TOBN(0x620e28ff, 0x47b50a95), TOBN(0x933e3b01, 0xcef03371), TOBN(0xf081bf85, 0x99100153), TOBN(0x183be9a0, 0xc3a8c8d6), TOBN(0x4e3ddc5a, 0xd6bbe24d), TOBN(0xc6c74630, 0x53843795), TOBN(0x78193dd7, 0x65ec2d4c), TOBN(0xb8df26cc, 0xcd3c89b2), TOBN(0x98dbe399, 0x5a483f8d), TOBN(0x72d8a957, 0x7dd3313a), TOBN(0x65087294, 0xab0bd375), TOBN(0xfcd89248, 0x7c259d16), TOBN(0x8a9443d7, 0x7613aa81), TOBN(0x80100800, 0x85fe6584), TOBN(0x70fc4dbc, 0x7fb10288), TOBN(0xf58280d3, 0xe86beee8), TOBN(0x14fdd82f, 0x7c978c38), TOBN(0xdf1204c1, 0x0de44d7b), TOBN(0xa08a1c84, 0x4160252f), TOBN(0x591554ca, 0xc17646a5), TOBN(0x214a37d6, 0xa05bd525), TOBN(0x48d5f09b, 0x07957b3c), TOBN(0x0247cdcb, 0xd7109bc9), TOBN(0x40f9e4bb, 0x30599ce7), TOBN(0xc325fa03, 0xf46ad2ec), TOBN(0x00f766cf, 0xc3e3f9ee), TOBN(0xab556668, 0xd43a4577), TOBN(0x68d30a61, 0x3ee03b93), TOBN(0x7ddc81ea, 0x77b46a08), TOBN(0xcf5a6477, 0xc7480699), TOBN(0x43a8cb34, 0x6633f683), TOBN(0x1b867e6b, 0x92363c60), TOBN(0x43921114, 0x1f60558e), TOBN(0xcdbcdd63, 0x2f41450e), TOBN(0x7fc04601, 0xcc630e8b), TOBN(0xea7c66d5, 0x97038b43), TOBN(0x7259b8a5, 0x04e99fd8), TOBN(0x98a8dd12, 0x4785549a), TOBN(0x0e459a7c, 0x840552e1), TOBN(0xcdfcf4d0, 0x4bb0909e), TOBN(0x34a86db2, 0x53758da7), TOBN(0xe643bb83, 0xeac997e1), TOBN(0x96400bd7, 0x530c5b7e), TOBN(0x9f97af87, 0xb41c8b52), TOBN(0x34fc8820, 0xfbeee3f9), TOBN(0x93e53490, 0x49091afd), TOBN(0x764b9be5, 0x9a31f35c), TOBN(0x71f37864, 0x57e3d924), TOBN(0x02fb34e0, 0x943aa75e), TOBN(0xa18c9c58, 0xab8ff6e4), TOBN(0x080f31b1, 0x33cf0d19), TOBN(0x5c9682db, 0x083518a7), TOBN(0x873d4ca6, 0xb709c3de), TOBN(0x64a84262, 0x3575b8f0), TOBN(0x6275da1f, 0x020154bb), TOBN(0x97678caa, 0xd17cf1ab), TOBN(0x8779795f, 0x951a95c3), TOBN(0xdd35b163, 0x50fccc08), TOBN(0x32709627, 0x33d8f031), TOBN(0x3c5ab10a, 0x498dd85c), TOBN(0xb6c185c3, 0x41dca566), TOBN(0x7de7feda, 0xd8622aa3), TOBN(0x99e84d92, 0x901b6dfb), TOBN(0x30a02b0e, 0x7c4ad288), TOBN(0xc7c81daa, 0x2fd3cf36), TOBN(0xd1319547, 0xdf89e59f), TOBN(0xb2be8184, 0xcd496733), TOBN(0xd5f449eb, 0x93d3412b), TOBN(0x7ea41b1b, 0x25fe531d), TOBN(0xf9797432, 0x6a1d5646), TOBN(0x86067f72, 0x2bde501a), TOBN(0xf91481c0, 0x0c85e89c), TOBN(0xca8ee465, 0xf8b05bc6), TOBN(0x1844e1cf, 0x02e83cda), TOBN(0xca82114a, 0xb4dbe33b), TOBN(0x0f9f8769, 0x4eabfde2), TOBN(0x4936b1c0, 0x38b27fe2), TOBN(0x63b6359b, 0xaba402df), TOBN(0x40c0ea2f, 0x656bdbab), TOBN(0x9c992a89, 0x6580c39c), TOBN(0x600e8f15, 0x2a60aed1), TOBN(0xeb089ca4, 0xe0bf49df), TOBN(0x9c233d7d, 0x2d42d99a), TOBN(0x648d3f95, 0x4c6bc2fa), TOBN(0xdcc383a8, 0xe1add3f3), TOBN(0xf42c0c6a, 0x4f64a348), TOBN(0x2abd176f, 0x0030dbdb), TOBN(0x4de501a3, 0x7d6c215e), TOBN(0x4a107c1f, 0x4b9a64bc), TOBN(0xa77f0ad3, 0x2496cd59), TOBN(0xfb78ac62, 0x7688dffb), TOBN(0x7025a2ca, 0x67937d8e), TOBN(0xfde8b2d1, 0xd1a8f4e7), TOBN(0xf5b3da47, 0x7354927c), TOBN(0xe48606a3, 0xd9205735), TOBN(0xac477cc6, 0xe177b917), TOBN(0xfb1f73d2, 0xa883239a), TOBN(0xe12572f6, 0xcc8b8357), TOBN(0x9d355e9c, 0xfb1f4f86), TOBN(0x89b795f8, 0xd9f3ec6e), TOBN(0x27be56f1, 0xb54398dc), TOBN(0x1890efd7, 0x3fedeed5), TOBN(0x62f77f1f, 0x9c6d0140), TOBN(0x7ef0e314, 0x596f0ee4), TOBN(0x50ca6631, 0xcc61dab3), TOBN(0x4a39801d, 0xf4866e4f), TOBN(0x66c8d032, 0xae363b39), TOBN(0x22c591e5, 0x2ead66aa), TOBN(0x954ba308, 0xde02a53e), TOBN(0x2a6c060f, 0xd389f357), TOBN(0xe6cfcde8, 0xfbf40b66), TOBN(0x8e02fc56, 0xc6340ce1), TOBN(0xe4957795, 0x73adb4ba), TOBN(0x7b86122c, 0xa7b03805), TOBN(0x63f83512, 0x0c8e6fa6), TOBN(0x83660ea0, 0x057d7804), TOBN(0xbad79105, 0x21ba473c), TOBN(0xb6c50bee, 0xded5389d), TOBN(0xee2caf4d, 0xaa7c9bc0), TOBN(0xd97b8de4, 0x8c4e98a7), TOBN(0xa9f63e70, 0xab3bbddb), TOBN(0x3898aabf, 0x2597815a), TOBN(0x7659af89, 0xac15b3d9), TOBN(0xedf7725b, 0x703ce784), TOBN(0x25470fab, 0xe085116b), TOBN(0x04a43375, 0x87285310), TOBN(0x4e39187e, 0xe2bfd52f), TOBN(0x36166b44, 0x7d9ebc74), TOBN(0x92ad433c, 0xfd4b322c), TOBN(0x726aa817, 0xba79ab51), TOBN(0xf96eacd8, 0xc1db15eb), TOBN(0xfaf71e91, 0x0476be63), TOBN(0xdd69a640, 0x641fad98), TOBN(0xb7995918, 0x29622559), TOBN(0x03c6daa5, 0xde4199dc), TOBN(0x92cadc97, 0xad545eb4), TOBN(0x1028238b, 0x256534e4), TOBN(0x73e80ce6, 0x8595409a), TOBN(0x690d4c66, 0xd05dc59b), TOBN(0xc95f7b8f, 0x981dee80), TOBN(0xf4337014, 0xd856ac25), TOBN(0x441bd9dd, 0xac524dca), TOBN(0x640b3d85, 0x5f0499f5), TOBN(0x39cf84a9, 0xd5fda182), TOBN(0x04e7b055, 0xb2aa95a0), TOBN(0x29e33f0a, 0x0ddf1860), TOBN(0x082e74b5, 0x423f6b43), TOBN(0x217edeb9, 0x0aaa2b0f), TOBN(0x58b83f35, 0x83cbea55), TOBN(0xc485ee4d, 0xbc185d70), TOBN(0x833ff03b, 0x1e5f6992), TOBN(0xb5b9b9cc, 0xcf0c0dd5), TOBN(0x7caaee8e, 0x4e9e8a50), TOBN(0x462e907b, 0x6269dafd), TOBN(0x6ed5cee9, 0xfbe791c6), TOBN(0x68ca3259, 0xed430790), TOBN(0x2b72bdf2, 0x13b5ba88), TOBN(0x60294c8a, 0x35ef0ac4), TOBN(0x9c3230ed, 0x19b99b08), TOBN(0x560fff17, 0x6c2589aa), TOBN(0x552b8487, 0xd6770374), TOBN(0xa373202d, 0x9a56f685), TOBN(0xd3e7f907, 0x45f175d9), TOBN(0x3c2f315f, 0xd080d810), TOBN(0x1130e9dd, 0x7b9520e8), TOBN(0xc078f9e2, 0x0af037b5), TOBN(0x38cd2ec7, 0x1e9c104c), TOBN(0x0f684368, 0xc472fe92), TOBN(0xd3f1b5ed, 0x6247e7ef), TOBN(0xb32d33a9, 0x396dfe21), TOBN(0x46f59cf4, 0x4a9aa2c2), TOBN(0x69cd5168, 0xff0f7e41), TOBN(0x3f59da0f, 0x4b3234da), TOBN(0xcf0b0235, 0xb4579ebe), TOBN(0x6d1cbb25, 0x6d2476c7), TOBN(0x4f0837e6, 0x9dc30f08), TOBN(0x9a4075bb, 0x906f6e98), TOBN(0x253bb434, 0xc761e7d1), TOBN(0xde2e645f, 0x6e73af10), TOBN(0xb89a4060, 0x0c5f131c), TOBN(0xd12840c5, 0xb8cc037f), TOBN(0x3d093a5b, 0x7405bb47), TOBN(0x6202c253, 0x206348b8), TOBN(0xbf5d57fc, 0xc55a3ca7), TOBN(0x89f6c90c, 0x8c3bef48), TOBN(0x23ac7623, 0x5a0a960a), TOBN(0xdfbd3d6b, 0x552b42ab), TOBN(0x3ef22458, 0x132061f6), TOBN(0xd74e9bda, 0xc97e6516), TOBN(0x88779360, 0xc230f49e), TOBN(0xa6ec1de3, 0x1e74ea49), TOBN(0x581dcee5, 0x3fb645a2), TOBN(0xbaef2391, 0x8f483f14), TOBN(0x6d2dddfc, 0xd137d13b), TOBN(0x54cde50e, 0xd2743a42), TOBN(0x89a34fc5, 0xe4d97e67), TOBN(0x13f1f5b3, 0x12e08ce5), TOBN(0xa80540b8, 0xa7f0b2ca), TOBN(0x854bcf77, 0x01982805), TOBN(0xb8653ffd, 0x233bea04), TOBN(0x8e7b8787, 0x02b0b4c9), TOBN(0x2675261f, 0x9acb170a), TOBN(0x061a9d90, 0x930c14e5), TOBN(0xb59b30e0, 0xdef0abea), TOBN(0x1dc19ea6, 0x0200ec7d), TOBN(0xb6f4a3f9, 0x0bce132b), TOBN(0xb8d5de90, 0xf13e27e0), TOBN(0xbaee5ef0, 0x1fade16f), TOBN(0x6f406aaa, 0xe4c6cf38), TOBN(0xab4cfe06, 0xd1369815), TOBN(0x0dcffe87, 0xefd550c6), TOBN(0x9d4f59c7, 0x75ff7d39), TOBN(0xb02553b1, 0x51deb6ad), TOBN(0x812399a4, 0xb1877749), TOBN(0xce90f71f, 0xca6006e1), TOBN(0xc32363a6, 0xb02b6e77), TOBN(0x02284fbe, 0xdc36c64d), TOBN(0x86c81e31, 0xa7e1ae61), TOBN(0x2576c7e5, 0xb909d94a), TOBN(0x8b6f7d02, 0x818b2bb0), TOBN(0xeca3ed07, 0x56faa38a), TOBN(0xa3790e6c, 0x9305bb54), TOBN(0xd784eeda, 0x7bc73061), TOBN(0xbd56d369, 0x6dd50614), TOBN(0xd6575949, 0x229a8aa9), TOBN(0xdcca8f47, 0x4595ec28), TOBN(0x814305c1, 0x06ab4fe6), TOBN(0xc8c39768, 0x24f43f16), TOBN(0xe2a45f36, 0x523f2b36), TOBN(0x995c6493, 0x920d93bb), TOBN(0xf8afdab7, 0x90f1632b), TOBN(0x79ebbecd, 0x1c295954), TOBN(0xc7bb3ddb, 0x79592f48), TOBN(0x67216a7b, 0x5f88e998), TOBN(0xd91f098b, 0xbc01193e), TOBN(0xf7d928a5, 0xb1db83fc), TOBN(0x55e38417, 0xe991f600), TOBN(0x2a91113e, 0x2981a934), TOBN(0xcbc9d648, 0x06b13bde), TOBN(0xb011b6ac, 0x0755ff44), TOBN(0x6f4cb518, 0x045ec613), TOBN(0x522d2d31, 0xc2f5930a), TOBN(0x5acae1af, 0x382e65de), TOBN(0x57643067, 0x27bc966f), TOBN(0x5e12705d, 0x1c7193f0), TOBN(0xf0f32f47, 0x3be8858e), TOBN(0x785c3d7d, 0x96c6dfc7), TOBN(0xd75b4a20, 0xbf31795d), TOBN(0x91acf17b, 0x342659d4), TOBN(0xe596ea34, 0x44f0378f), TOBN(0x4515708f, 0xce52129d), TOBN(0x17387e1e, 0x79f2f585), TOBN(0x72cfd2e9, 0x49dee168), TOBN(0x1ae05223, 0x3e2af239), TOBN(0x009e75be, 0x1d94066a), TOBN(0x6cca31c7, 0x38abf413), TOBN(0xb50bd61d, 0x9bc49908), TOBN(0x4a9b4a8c, 0xf5e2bc1e), TOBN(0xeb6cc5f7, 0x946f83ac), TOBN(0x27da93fc, 0xebffab28), TOBN(0xea314c96, 0x4821c8c5), TOBN(0x8de49ded, 0xa83c15f4), TOBN(0x7a64cf20, 0x7af33004), TOBN(0x45f1bfeb, 0xc9627e10), TOBN(0x878b0626, 0x54b9df60), TOBN(0x5e4fdc3c, 0xa95c0b33), TOBN(0xe54a37ca, 0xc2035d8e), TOBN(0x9087cda9, 0x80f20b8c), TOBN(0x36f61c23, 0x8319ade4), TOBN(0x766f287a, 0xde8cfdf8), TOBN(0x48821948, 0x346f3705), TOBN(0x49a7b853, 0x16e4f4a2), TOBN(0xb9b3f8a7, 0x5cedadfd), TOBN(0x8f562815, 0x8db2a815), TOBN(0xc0b7d554, 0x01f68f95), TOBN(0x12971e27, 0x688a208e), TOBN(0xc9f8b696, 0xd0ff34fc), TOBN(0x20824de2, 0x1222718c), TOBN(0x7213cf9f, 0x0c95284d), TOBN(0xe2ad741b, 0xdc158240), TOBN(0x0ee3a6df, 0x54043ccf), TOBN(0x16ff479b, 0xd84412b3), TOBN(0xf6c74ee0, 0xdfc98af0), TOBN(0xa78a169f, 0x52fcd2fb), TOBN(0xd8ae8746, 0x99c930e9), TOBN(0x1d33e858, 0x49e117a5), TOBN(0x7581fcb4, 0x6624759f), TOBN(0xde50644f, 0x5bedc01d), TOBN(0xbeec5d00, 0xcaf3155e), TOBN(0x672d66ac, 0xbc73e75f), TOBN(0x86b9d8c6, 0x270b01db), TOBN(0xd249ef83, 0x50f55b79), TOBN(0x6131d6d4, 0x73978fe3), TOBN(0xcc4e4542, 0x754b00a1), TOBN(0x4e05df05, 0x57dfcfe9), TOBN(0x94b29cdd, 0x51ef6bf0), TOBN(0xe4530cff, 0x9bc7edf2), TOBN(0x8ac236fd, 0xd3da65f3), TOBN(0x0faf7d5f, 0xc8eb0b48), TOBN(0x4d2de14c, 0x660eb039), TOBN(0xc006bba7, 0x60430e54), TOBN(0x10a2d0d6, 0xda3289ab), TOBN(0x9c037a5d, 0xd7979c59), TOBN(0x04d1f3d3, 0xa116d944), TOBN(0x9ff22473, 0x8a0983cd), TOBN(0x28e25b38, 0xc883cabb), TOBN(0xe968dba5, 0x47a58995), TOBN(0x2c80b505, 0x774eebdf), TOBN(0xee763b71, 0x4a953beb), TOBN(0x502e223f, 0x1642e7f6), TOBN(0x6fe4b641, 0x61d5e722), TOBN(0x9d37c5b0, 0xdbef5316), TOBN(0x0115ed70, 0xf8330bc7), TOBN(0x139850e6, 0x75a72789), TOBN(0x27d7faec, 0xffceccc2), TOBN(0x3016a860, 0x4fd9f7f6), TOBN(0xc492ec64, 0x4cd8f64c), TOBN(0x58a2d790, 0x279d7b51), TOBN(0x0ced1fc5, 0x1fc75256), TOBN(0x3e658aed, 0x8f433017), TOBN(0x0b61942e, 0x05da59eb), TOBN(0xba3d60a3, 0x0ddc3722), TOBN(0x7c311cd1, 0x742e7f87), TOBN(0x6473ffee, 0xf6b01b6e)}, {TOBN(0x8303604f, 0x692ac542), TOBN(0xf079ffe1, 0x227b91d3), TOBN(0x19f63e63, 0x15aaf9bd), TOBN(0xf99ee565, 0xf1f344fb), TOBN(0x8a1d661f, 0xd6219199), TOBN(0x8c883bc6, 0xd48ce41c), TOBN(0x1065118f, 0x3c74d904), TOBN(0x713889ee, 0x0faf8b1b), TOBN(0x972b3f8f, 0x81a1b3be), TOBN(0x4f3ce145, 0xce2764a0), TOBN(0xe2d0f1cc, 0x28c4f5f7), TOBN(0xdeee0c0d, 0xc7f3985b), TOBN(0x7df4adc0, 0xd39e25c3), TOBN(0x40619820, 0xc467a080), TOBN(0x440ebc93, 0x61cf5a58), TOBN(0x527729a6, 0x422ad600), TOBN(0xca6c0937, 0xb1b76ba6), TOBN(0x1a2eab85, 0x4d2026dc), TOBN(0xb1715e15, 0x19d9ae0a), TOBN(0xf1ad9199, 0xbac4a026), TOBN(0x35b3dfb8, 0x07ea7b0e), TOBN(0xedf5496f, 0x3ed9eb89), TOBN(0x8932e5ff, 0x2d6d08ab), TOBN(0xf314874e, 0x25bd2731), TOBN(0xefb26a75, 0x3f73f449), TOBN(0x1d1c94f8, 0x8d44fc79), TOBN(0x49f0fbc5, 0x3bc0dc4d), TOBN(0xb747ea0b, 0x3698a0d0), TOBN(0x5218c3fe, 0x228d291e), TOBN(0x35b804b5, 0x43c129d6), TOBN(0xfac859b8, 0xd1acc516), TOBN(0x6c10697d, 0x95d6e668), TOBN(0xc38e438f, 0x0876fd4e), TOBN(0x45f0c307, 0x83d2f383), TOBN(0x203cc2ec, 0xb10934cb), TOBN(0x6a8f2439, 0x2c9d46ee), TOBN(0xf16b431b, 0x65ccde7b), TOBN(0x41e2cd18, 0x27e76a6f), TOBN(0xb9c8cf8f, 0x4e3484d7), TOBN(0x64426efd, 0x8315244a), TOBN(0x1c0a8e44, 0xfc94dea3), TOBN(0x34c8cdbf, 0xdad6a0b0), TOBN(0x919c3840, 0x04113cef), TOBN(0xfd32fba4, 0x15490ffa), TOBN(0x58d190f6, 0x795dcfb7), TOBN(0xfef01b03, 0x83588baf), TOBN(0x9e6d1d63, 0xca1fc1c0), TOBN(0x53173f96, 0xf0a41ac9), TOBN(0x2b1d402a, 0xba16f73b), TOBN(0x2fb31014, 0x8cf9b9fc), TOBN(0x2d51e60e, 0x446ef7bf), TOBN(0xc731021b, 0xb91e1745), TOBN(0x9d3b4724, 0x4fee99d4), TOBN(0x4bca48b6, 0xfac5c1ea), TOBN(0x70f5f514, 0xbbea9af7), TOBN(0x751f55a5, 0x974c283a), TOBN(0x6e30251a, 0xcb452fdb), TOBN(0x31ee6965, 0x50f30650), TOBN(0xb0b3e508, 0x933548d9), TOBN(0xb8949a4f, 0xf4b0ef5b), TOBN(0x208b8326, 0x3c88f3bd), TOBN(0xab147c30, 0xdb1d9989), TOBN(0xed6515fd, 0x44d4df03), TOBN(0x17a12f75, 0xe72eb0c5), TOBN(0x3b59796d, 0x36cf69db), TOBN(0x1219eee9, 0x56670c18), TOBN(0xfe3341f7, 0x7a070d8e), TOBN(0x9b70130b, 0xa327f90c), TOBN(0x36a32462, 0x0ae18e0e), TOBN(0x2021a623, 0x46c0a638), TOBN(0x251b5817, 0xc62eb0d4), TOBN(0x87bfbcdf, 0x4c762293), TOBN(0xf78ab505, 0xcdd61d64), TOBN(0x8c7a53fc, 0xc8c18857), TOBN(0xa653ce6f, 0x16147515), TOBN(0x9c923aa5, 0xea7d52d5), TOBN(0xc24709cb, 0x5c18871f), TOBN(0x7d53bec8, 0x73b3cc74), TOBN(0x59264aff, 0xfdd1d4c4), TOBN(0x5555917e, 0x240da582), TOBN(0xcae8bbda, 0x548f5a0e), TOBN(0x1910eaba, 0x3bbfbbe1), TOBN(0xae579685, 0x7677afc3), TOBN(0x49ea61f1, 0x73ff0b5c), TOBN(0x78655478, 0x4f7c3922), TOBN(0x95d337cd, 0x20c68eef), TOBN(0x68f1e1e5, 0xdf779ab9), TOBN(0x14b491b0, 0xb5cf69a8), TOBN(0x7a6cbbe0, 0x28e3fe89), TOBN(0xe7e1fee4, 0xc5aac0eb), TOBN(0x7f47eda5, 0x697e5140), TOBN(0x4f450137, 0xb454921f), TOBN(0xdb625f84, 0x95cd8185), TOBN(0x74be0ba1, 0xcdb2e583), TOBN(0xaee4fd7c, 0xdd5e6de4), TOBN(0x4251437d, 0xe8101739), TOBN(0x686d72a0, 0xac620366), TOBN(0x4be3fb9c, 0xb6d59344), TOBN(0x6e8b44e7, 0xa1eb75b9), TOBN(0x84e39da3, 0x91a5c10c), TOBN(0x37cc1490, 0xb38f0409), TOBN(0x02951943, 0x2c2ade82), TOBN(0x9b688783, 0x1190a2d8), TOBN(0x25627d14, 0x231182ba), TOBN(0x6eb550aa, 0x658a6d87), TOBN(0x1405aaa7, 0xcf9c7325), TOBN(0xd147142e, 0x5c8748c9), TOBN(0x7f637e4f, 0x53ede0e0), TOBN(0xf8ca2776, 0x14ffad2c), TOBN(0xe58fb1bd, 0xbafb6791), TOBN(0x17158c23, 0xbf8f93fc), TOBN(0x7f15b373, 0x0a4a4655), TOBN(0x39d4add2, 0xd842ca72), TOBN(0xa71e4391, 0x3ed96305), TOBN(0x5bb09cbe, 0x6700be14), TOBN(0x68d69d54, 0xd8befcf6), TOBN(0xa45f5367, 0x37183bcf), TOBN(0x7152b7bb, 0x3370dff7), TOBN(0xcf887baa, 0xbf12525b), TOBN(0xe7ac7bdd, 0xd6d1e3cd), TOBN(0x25914f78, 0x81fdad90), TOBN(0xcf638f56, 0x0d2cf6ab), TOBN(0xb90bc03f, 0xcc054de5), TOBN(0x932811a7, 0x18b06350), TOBN(0x2f00b330, 0x9bbd11ff), TOBN(0x76108a6f, 0xb4044974), TOBN(0x801bb9e0, 0xa851d266), TOBN(0x0dd099be, 0xbf8990c1), TOBN(0x58c5aaaa, 0xabe32986), TOBN(0x0fe9dd2a, 0x50d59c27), TOBN(0x84951ff4, 0x8d307305), TOBN(0x6c23f829, 0x86529b78), TOBN(0x50bb2218, 0x0b136a79), TOBN(0x7e2174de, 0x77a20996), TOBN(0x6f00a4b9, 0xc0bb4da6), TOBN(0x89a25a17, 0xefdde8da), TOBN(0xf728a27e, 0xc11ee01d), TOBN(0xf900553a, 0xe5f10dfb), TOBN(0x189a83c8, 0x02ec893c), TOBN(0x3ca5bdc1, 0x23f66d77), TOBN(0x98781537, 0x97eada9f), TOBN(0x59c50ab3, 0x10256230), TOBN(0x346042d9, 0x323c69b3), TOBN(0x1b715a6d, 0x2c460449), TOBN(0xa41dd476, 0x6ae06e0b), TOBN(0xcdd7888e, 0x9d42e25f), TOBN(0x0f395f74, 0x56b25a20), TOBN(0xeadfe0ae, 0x8700e27e), TOBN(0xb09d52a9, 0x69950093), TOBN(0x3525d9cb, 0x327f8d40), TOBN(0xb8235a94, 0x67df886a), TOBN(0x77e4b0dd, 0x035faec2), TOBN(0x115eb20a, 0x517d7061), TOBN(0x77fe3433, 0x6c2df683), TOBN(0x6870ddc7, 0xcdc6fc67), TOBN(0xb1610588, 0x0b87de83), TOBN(0x343584ca, 0xd9c4ddbe), TOBN(0xb3164f1c, 0x3d754be2), TOBN(0x0731ed3a, 0xc1e6c894), TOBN(0x26327dec, 0x4f6b904c), TOBN(0x9d49c6de, 0x97b5cd32), TOBN(0x40835dae, 0xb5eceecd), TOBN(0xc66350ed, 0xd9ded7fe), TOBN(0x8aeebb5c, 0x7a678804), TOBN(0x51d42fb7, 0x5b8ee9ec), TOBN(0xd7a17bdd, 0x8e3ca118), TOBN(0x40d7511a, 0x2ef4400e), TOBN(0xc48990ac, 0x875a66f4), TOBN(0x8de07d2a, 0x2199e347), TOBN(0xbee75556, 0x2a39e051), TOBN(0x56918786, 0x916e51dc), TOBN(0xeb191313, 0x4a2d89ec), TOBN(0x6679610d, 0x37d341ed), TOBN(0x434fbb41, 0x56d51c2b), TOBN(0xe54b7ee7, 0xd7492dba), TOBN(0xaa33a79a, 0x59021493), TOBN(0x49fc5054, 0xe4bd6d3d), TOBN(0x09540f04, 0x5ab551d0), TOBN(0x8acc9085, 0x4942d3a6), TOBN(0x231af02f, 0x2d28323b), TOBN(0x93458cac, 0x0992c163), TOBN(0x1fef8e71, 0x888e3bb4), TOBN(0x27578da5, 0xbe8c268c), TOBN(0xcc8be792, 0xe805ec00), TOBN(0x29267bae, 0xc61c3855), TOBN(0xebff429d, 0x58c1fd3b), TOBN(0x22d886c0, 0x8c0b93b8), TOBN(0xca5e00b2, 0x2ddb8953), TOBN(0xcf330117, 0xc3fed8b7), TOBN(0xd49ac6fa, 0x819c01f6), TOBN(0x6ddaa6bd, 0x3c0fbd54), TOBN(0x91743068, 0x8049a2cf), TOBN(0xd67f981e, 0xaff2ef81), TOBN(0xc3654d35, 0x2818ae80), TOBN(0x81d05044, 0x1b2aa892), TOBN(0x2db067bf, 0x3d099328), TOBN(0xe7c79e86, 0x703dcc97), TOBN(0xe66f9b37, 0xe133e215), TOBN(0xcdf119a6, 0xe39a7a5c), TOBN(0x47c60de3, 0x876f1b61), TOBN(0x6e405939, 0xd860f1b2), TOBN(0x3e9a1dbc, 0xf5ed4d4a), TOBN(0x3f23619e, 0xc9b6bcbd), TOBN(0x5ee790cf, 0x734e4497), TOBN(0xf0a834b1, 0x5bdaf9bb), TOBN(0x02cedda7, 0x4ca295f0), TOBN(0x4619aa2b, 0xcb8e378c), TOBN(0xe5613244, 0xcc987ea4), TOBN(0x0bc022cc, 0x76b23a50), TOBN(0x4a2793ad, 0x0a6c21ce), TOBN(0x38328780, 0x89cac3f5), TOBN(0x29176f1b, 0xcba26d56), TOBN(0x06296187, 0x4f6f59eb), TOBN(0x86e9bca9, 0x8bdc658e), TOBN(0x2ca9c4d3, 0x57e30402), TOBN(0x5438b216, 0x516a09bb), TOBN(0x0a6a063c, 0x7672765a), TOBN(0x37a3ce64, 0x0547b9bf), TOBN(0x42c099c8, 0x98b1a633), TOBN(0xb5ab800d, 0x05ee6961), TOBN(0xf1963f59, 0x11a5acd6), TOBN(0xbaee6157, 0x46201063), TOBN(0x36d9a649, 0xa596210a), TOBN(0xaed04363, 0x1ba7138c), TOBN(0xcf817d1c, 0xa4a82b76), TOBN(0x5586960e, 0xf3806be9), TOBN(0x7ab67c89, 0x09dc6bb5), TOBN(0x52ace7a0, 0x114fe7eb), TOBN(0xcd987618, 0xcbbc9b70), TOBN(0x4f06fd5a, 0x604ca5e1), TOBN(0x90af14ca, 0x6dbde133), TOBN(0x1afe4322, 0x948a3264), TOBN(0xa70d2ca6, 0xc44b2c6c), TOBN(0xab726799, 0x0ef87dfe), TOBN(0x310f64dc, 0x2e696377), TOBN(0x49b42e68, 0x4c8126a0), TOBN(0x0ea444c3, 0xcea0b176), TOBN(0x53a8ddf7, 0xcb269182), TOBN(0xf3e674eb, 0xbbba9dcb), TOBN(0x0d2878a8, 0xd8669d33), TOBN(0x04b935d5, 0xd019b6a3), TOBN(0xbb5cf88e, 0x406f1e46), TOBN(0xa1912d16, 0x5b57c111), TOBN(0x9803fc21, 0x19ebfd78), TOBN(0x4f231c9e, 0xc07764a9), TOBN(0xd93286ee, 0xb75bd055), TOBN(0x83a9457d, 0x8ee6c9de), TOBN(0x04695915, 0x6087ec90), TOBN(0x14c6dd8a, 0x58d6cd46), TOBN(0x9cb633b5, 0x8e6634d2), TOBN(0xc1305047, 0xf81bc328), TOBN(0x12ede0e2, 0x26a177e5), TOBN(0x332cca62, 0x065a6f4f), TOBN(0xc3a47ecd, 0x67be487b), TOBN(0x741eb187, 0x0f47ed1c), TOBN(0x99e66e58, 0xe7598b14), TOBN(0x6f0544ca, 0x63d0ff12), TOBN(0xe5efc784, 0xb610a05f), TOBN(0xf72917b1, 0x7cad7b47), TOBN(0x3ff6ea20, 0xf2cac0c0), TOBN(0xcc23791b, 0xf21db8b7), TOBN(0x7dac70b1, 0xd7d93565), TOBN(0x682cda1d, 0x694bdaad), TOBN(0xeb88bb8c, 0x1023516d), TOBN(0xc4c634b4, 0xdfdbeb1b), TOBN(0x22f5ca72, 0xb4ee4dea), TOBN(0x1045a368, 0xe6524821), TOBN(0xed9e8a3f, 0x052b18b2), TOBN(0x9b7f2cb1, 0xb961f49a), TOBN(0x7fee2ec1, 0x7b009670), TOBN(0x350d8754, 0x22507a6d), TOBN(0x561bd711, 0x4db55f1d), TOBN(0x4c189ccc, 0x320bbcaf), TOBN(0x568434cf, 0xdf1de48c), TOBN(0x6af1b00e, 0x0fa8f128), TOBN(0xf0ba9d02, 0x8907583c), TOBN(0x735a4004, 0x32ff9f60), TOBN(0x3dd8e4b6, 0xc25dcf33), TOBN(0xf2230f16, 0x42c74cef), TOBN(0xd8117623, 0x013fa8ad), TOBN(0x36822876, 0xf51fe76e), TOBN(0x8a6811cc, 0x11d62589), TOBN(0xc3fc7e65, 0x46225718), TOBN(0xb7df2c9f, 0xc82fdbcd), TOBN(0x3b1d4e52, 0xdd7b205b), TOBN(0xb6959478, 0x47a2e414), TOBN(0x05e4d793, 0xefa91148), TOBN(0xb47ed446, 0xfd2e9675), TOBN(0x1a7098b9, 0x04c9d9bf), TOBN(0x661e2881, 0x1b793048), TOBN(0xb1a16966, 0xb01ee461), TOBN(0xbc521308, 0x2954746f), TOBN(0xc909a0fc, 0x2477de50), TOBN(0xd80bb41c, 0x7dbd51ef), TOBN(0xa85be7ec, 0x53294905), TOBN(0x6d465b18, 0x83958f97), TOBN(0x16f6f330, 0xfb6840fd), TOBN(0xfaaeb214, 0x3401e6c8), TOBN(0xaf83d30f, 0xccb5b4f8), TOBN(0x22885739, 0x266dec4b), TOBN(0x51b4367c, 0x7bc467df), TOBN(0x926562e3, 0xd842d27a), TOBN(0xdfcb6614, 0x0fea14a6), TOBN(0xeb394dae, 0xf2734cd9), TOBN(0x3eeae5d2, 0x11c0be98), TOBN(0xb1e6ed11, 0x814e8165), TOBN(0x191086bc, 0xe52bce1c), TOBN(0x14b74cc6, 0xa75a04da), TOBN(0x63cf1186, 0x8c060985), TOBN(0x071047de, 0x2dbd7f7c), TOBN(0x4e433b8b, 0xce0942ca), TOBN(0xecbac447, 0xd8fec61d), TOBN(0x8f0ed0e2, 0xebf3232f), TOBN(0xfff80f9e, 0xc52a2edd), TOBN(0xad9ab433, 0x75b55fdb), TOBN(0x73ca7820, 0xe42e0c11), TOBN(0x6dace0a0, 0xe6251b46), TOBN(0x89bc6b5c, 0x4c0d932d), TOBN(0x3438cd77, 0x095da19a), TOBN(0x2f24a939, 0x8d48bdfb), TOBN(0x99b47e46, 0x766561b7), TOBN(0x736600e6, 0x0ed0322a), TOBN(0x06a47cb1, 0x638e1865), TOBN(0x927c1c2d, 0xcb136000), TOBN(0x29542337, 0x0cc5df69), TOBN(0x99b37c02, 0x09d649a9), TOBN(0xc5f0043c, 0x6aefdb27), TOBN(0x6cdd9987, 0x1be95c27), TOBN(0x69850931, 0x390420d2), TOBN(0x299c40ac, 0x0983efa4), TOBN(0x3a05e778, 0xaf39aead), TOBN(0x84274408, 0x43a45193), TOBN(0x6bcd0fb9, 0x91a711a0), TOBN(0x461592c8, 0x9f52ab17), TOBN(0xb49302b4, 0xda3c6ed6), TOBN(0xc51fddc7, 0x330d7067), TOBN(0x94babeb6, 0xda50d531), TOBN(0x521b840d, 0xa6a7b9da), TOBN(0x5305151e, 0x404bdc89), TOBN(0x1bcde201, 0xd0d07449), TOBN(0xf427a78b, 0x3b76a59a), TOBN(0xf84841ce, 0x07791a1b), TOBN(0xebd314be, 0xbf91ed1c), TOBN(0x8e61d34c, 0xbf172943), TOBN(0x1d5dc451, 0x5541b892), TOBN(0xb186ee41, 0xfc9d9e54), TOBN(0x9d9f345e, 0xd5bf610d), TOBN(0x3e7ba65d, 0xf6acca9f), TOBN(0x9dda787a, 0xa8369486), TOBN(0x09f9dab7, 0x8eb5ba53), TOBN(0x5afb2033, 0xd6481bc3), TOBN(0x76f4ce30, 0xafa62104), TOBN(0xa8fa00cf, 0xf4f066b5), TOBN(0x89ab5143, 0x461dafc2), TOBN(0x44339ed7, 0xa3389998), TOBN(0x2ff862f1, 0xbc214903), TOBN(0x2c88f985, 0xb05556e3), TOBN(0xcd96058e, 0x3467081e), TOBN(0x7d6a4176, 0xedc637ea), TOBN(0xe1743d09, 0x36a5acdc), TOBN(0x66fd72e2, 0x7eb37726), TOBN(0xf7fa264e, 0x1481a037), TOBN(0x9fbd3bde, 0x45f4aa79), TOBN(0xed1e0147, 0x767c3e22), TOBN(0x7621f979, 0x82e7abe2), TOBN(0x19eedc72, 0x45f633f8), TOBN(0xe69b155e, 0x6137bf3a), TOBN(0xa0ad13ce, 0x414ee94e), TOBN(0x93e3d524, 0x1c0e651a), TOBN(0xab1a6e2a, 0x02ce227e), TOBN(0xe7af1797, 0x4ab27eca), TOBN(0x245446de, 0xbd444f39), TOBN(0x59e22a21, 0x56c07613), TOBN(0x43deafce, 0xf4275498), TOBN(0x10834ccb, 0x67fd0946), TOBN(0xa75841e5, 0x47406edf), TOBN(0xebd6a677, 0x7b0ac93d), TOBN(0xa6e37b0d, 0x78f5e0d7), TOBN(0x2516c096, 0x76f5492b), TOBN(0x1e4bf888, 0x9ac05f3a), TOBN(0xcdb42ce0, 0x4df0ba2b), TOBN(0x935d5cfd, 0x5062341b), TOBN(0x8a303333, 0x82acac20), TOBN(0x429438c4, 0x5198b00e), TOBN(0x1d083bc9, 0x049d33fa), TOBN(0x58b82dda, 0x946f67ff), TOBN(0xac3e2db8, 0x67a1d6a3), TOBN(0x62e6bead, 0x1798aac8), TOBN(0xfc85980f, 0xde46c58c), TOBN(0xa7f69379, 0x69c8d7be), TOBN(0x23557927, 0x837b35ec), TOBN(0x06a933d8, 0xe0790c0c), TOBN(0x827c0e9b, 0x077ff55d), TOBN(0x53977798, 0xbb26e680), TOBN(0x59530874, 0x1d9cb54f), TOBN(0xcca3f449, 0x4aac53ef), TOBN(0x11dc5c87, 0xa07eda0f), TOBN(0xc138bccf, 0xfd6400c8), TOBN(0x549680d3, 0x13e5da72), TOBN(0xc93eed82, 0x4540617e), TOBN(0xfd3db157, 0x4d0b75c0), TOBN(0x9716eb42, 0x6386075b), TOBN(0x0639605c, 0x817b2c16), TOBN(0x09915109, 0xf1e4f201), TOBN(0x35c9a928, 0x5cca6c3b), TOBN(0xb25f7d1a, 0x3505c900), TOBN(0xeb9f7d20, 0x630480c4), TOBN(0xc3c7b8c6, 0x2a1a501c), TOBN(0x3f99183c, 0x5a1f8e24), TOBN(0xfdb118fa, 0x9dd255f0), TOBN(0xb9b18b90, 0xc27f62a6), TOBN(0xe8f732f7, 0x396ec191), TOBN(0x524a2d91, 0x0be786ab), TOBN(0x5d32adef, 0x0ac5a0f5), TOBN(0x9b53d4d6, 0x9725f694), TOBN(0x032a76c6, 0x0510ba89), TOBN(0x840391a3, 0xebeb1544), TOBN(0x44b7b88c, 0x3ed73ac3), TOBN(0xd24bae7a, 0x256cb8b3), TOBN(0x7ceb151a, 0xe394cb12), TOBN(0xbd6b66d0, 0x5bc1e6a8), TOBN(0xec70cecb, 0x090f07bf), TOBN(0x270644ed, 0x7d937589), TOBN(0xee9e1a3d, 0x5f1dccfe), TOBN(0xb0d40a84, 0x745b98d2), TOBN(0xda429a21, 0x2556ed40), TOBN(0xf676eced, 0x85148cb9), TOBN(0x5a22d40c, 0xded18936), TOBN(0x3bc4b9e5, 0x70e8a4ce), TOBN(0xbfd1445b, 0x9eae0379), TOBN(0xf23f2c0c, 0x1a0bd47e), TOBN(0xa9c0bb31, 0xe1845531), TOBN(0x9ddc4d60, 0x0a4c3f6b), TOBN(0xbdfaad79, 0x2c15ef44), TOBN(0xce55a236, 0x7f484acc), TOBN(0x08653ca7, 0x055b1f15), TOBN(0x2efa8724, 0x538873a3), TOBN(0x09299e5d, 0xace1c7e7), TOBN(0x07afab66, 0xade332ba), TOBN(0x9be1fdf6, 0x92dd71b7), TOBN(0xa49b5d59, 0x5758b11c), TOBN(0x0b852893, 0xc8654f40), TOBN(0xb63ef6f4, 0x52379447), TOBN(0xd4957d29, 0x105e690c), TOBN(0x7d484363, 0x646559b0), TOBN(0xf4a8273c, 0x49788a8e), TOBN(0xee406cb8, 0x34ce54a9), TOBN(0x1e1c260f, 0xf86fda9b), TOBN(0xe150e228, 0xcf6a4a81), TOBN(0x1fa3b6a3, 0x1b488772), TOBN(0x1e6ff110, 0xc5a9c15b), TOBN(0xc6133b91, 0x8ad6aa47), TOBN(0x8ac5d55c, 0x9dffa978), TOBN(0xba1d1c1d, 0x5f3965f2), TOBN(0xf969f4e0, 0x7732b52f), TOBN(0xfceecdb5, 0xa5172a07), TOBN(0xb0120a5f, 0x10f2b8f5), TOBN(0xc83a6cdf, 0x5c4c2f63), TOBN(0x4d47a491, 0xf8f9c213), TOBN(0xd9e1cce5, 0xd3f1bbd5), TOBN(0x0d91bc7c, 0xaba7e372), TOBN(0xfcdc74c8, 0xdfd1a2db), TOBN(0x05efa800, 0x374618e5), TOBN(0x11216969, 0x15a7925e), TOBN(0xd4c89823, 0xf6021c5d), TOBN(0x880d5e84, 0xeff14423), TOBN(0x6523bc5a, 0x6dcd1396), TOBN(0xd1acfdfc, 0x113c978b), TOBN(0xb0c164e8, 0xbbb66840), TOBN(0xf7f4301e, 0x72b58459), TOBN(0xc29ad4a6, 0xa638e8ec), TOBN(0xf5ab8961, 0x46b78699), TOBN(0x9dbd7974, 0x0e954750), TOBN(0x0121de88, 0x64f9d2c6), TOBN(0x2e597b42, 0xd985232e), TOBN(0x55b6c3c5, 0x53451777), TOBN(0xbb53e547, 0x519cb9fb), TOBN(0xf134019f, 0x8428600d), TOBN(0x5a473176, 0xe081791a), TOBN(0x2f3e2263, 0x35fb0c08), TOBN(0xb28c3017, 0x73d273b0), TOBN(0xccd21076, 0x7721ef9a), TOBN(0x054cc292, 0xb650dc39), TOBN(0x662246de, 0x6188045e), TOBN(0x904b52fa, 0x6b83c0d1), TOBN(0xa72df267, 0x97e9cd46), TOBN(0x886b43cd, 0x899725e4), TOBN(0x2b651688, 0xd849ff22), TOBN(0x60479b79, 0x02f34533), TOBN(0x5e354c14, 0x0c77c148), TOBN(0xb4bb7581, 0xa8537c78), TOBN(0x188043d7, 0xefe1495f), TOBN(0x9ba12f42, 0x8c1d5026), TOBN(0x2e0c8a26, 0x93d4aaab), TOBN(0xbdba7b8b, 0xaa57c450), TOBN(0x140c9ad6, 0x9bbdafef), TOBN(0x2067aa42, 0x25ac0f18), TOBN(0xf7b1295b, 0x04d1fbf3), TOBN(0x14829111, 0xa4b04824), TOBN(0x2ce3f192, 0x33bd5e91), TOBN(0x9c7a1d55, 0x8f2e1b72), TOBN(0xfe932286, 0x302aa243), TOBN(0x497ca7b4, 0xd4be9554), TOBN(0xb8e821b8, 0xe0547a6e), TOBN(0xfb2838be, 0x67e573e0), TOBN(0x05891db9, 0x4084c44b), TOBN(0x91311373, 0x96c1c2c5), TOBN(0x6aebfa3f, 0xd958444b), TOBN(0xac9cdce9, 0xe56e55c1), TOBN(0x7148ced3, 0x2caa46d0), TOBN(0x2e10c7ef, 0xb61fe8eb), TOBN(0x9fd835da, 0xff97cf4d)}, {TOBN(0xa36da109, 0x081e9387), TOBN(0xfb9780d7, 0x8c935828), TOBN(0xd5940332, 0xe540b015), TOBN(0xc9d7b51b, 0xe0f466fa), TOBN(0xfaadcd41, 0xd6d9f671), TOBN(0xba6c1e28, 0xb1a2ac17), TOBN(0x066a7833, 0xed201e5f), TOBN(0x19d99719, 0xf90f462b), TOBN(0xf431f462, 0x060b5f61), TOBN(0xa56f46b4, 0x7bd057c2), TOBN(0x348dca6c, 0x47e1bf65), TOBN(0x9a38783e, 0x41bcf1ff), TOBN(0x7a5d33a9, 0xda710718), TOBN(0x5a779987, 0x2e0aeaf6), TOBN(0xca87314d, 0x2d29d187), TOBN(0xfa0edc3e, 0xc687d733), TOBN(0x9df33621, 0x6a31e09b), TOBN(0xde89e44d, 0xc1350e35), TOBN(0x29214871, 0x4ca0cf52), TOBN(0xdf379672, 0x0b88a538), TOBN(0xc92a510a, 0x2591d61b), TOBN(0x79aa87d7, 0x585b447b), TOBN(0xf67db604, 0xe5287f77), TOBN(0x1697c8bf, 0x5efe7a80), TOBN(0x1c894849, 0xcb198ac7), TOBN(0xa884a93d, 0x0f264665), TOBN(0x2da964ef, 0x9b200678), TOBN(0x3c351b87, 0x009834e6), TOBN(0xafb2ef9f, 0xe2c4b44b), TOBN(0x580f6c47, 0x3326790c), TOBN(0xb8480521, 0x0b02264a), TOBN(0x8ba6f9e2, 0x42a194e2), TOBN(0xfc87975f, 0x8fb54738), TOBN(0x35160788, 0x27c3ead3), TOBN(0x834116d2, 0xb74a085a), TOBN(0x53c99a73, 0xa62fe996), TOBN(0x87585be0, 0x5b81c51b), TOBN(0x925bafa8, 0xbe0852b7), TOBN(0x76a4fafd, 0xa84d19a7), TOBN(0x39a45982, 0x585206d4), TOBN(0x499b6ab6, 0x5eb03c0e), TOBN(0xf19b7954, 0x72bc3fde), TOBN(0xa86b5b9c, 0x6e3a80d2), TOBN(0xe4377508, 0x6d42819f), TOBN(0xc1663650, 0xbb3ee8a3), TOBN(0x75eb14fc, 0xb132075f), TOBN(0xa8ccc906, 0x7ad834f6), TOBN(0xea6a2474, 0xe6e92ffd), TOBN(0x9d72fd95, 0x0f8d6758), TOBN(0xcb84e101, 0x408c07dd), TOBN(0xb9114bfd, 0xa5e23221), TOBN(0x358b5fe2, 0xe94e742c), TOBN(0x1c0577ec, 0x95f40e75), TOBN(0xf0155451, 0x3d73f3d6), TOBN(0x9d55cd67, 0xbd1b9b66), TOBN(0x63e86e78, 0xaf8d63c7), TOBN(0x39d934ab, 0xd3c095f1), TOBN(0x04b261be, 0xe4b76d71), TOBN(0x1d2e6970, 0xe73e6984), TOBN(0x879fb23b, 0x5e5fcb11), TOBN(0x11506c72, 0xdfd75490), TOBN(0x3a97d085, 0x61bcf1c1), TOBN(0x43201d82, 0xbf5e7007), TOBN(0x7f0ac52f, 0x798232a7), TOBN(0x2715cbc4, 0x6eb564d4), TOBN(0x8d6c752c, 0x9e570e29), TOBN(0xf80247c8, 0x9ef5fd5d), TOBN(0xc3c66b46, 0xd53eb514), TOBN(0x9666b401, 0x0f87de56), TOBN(0xce62c06f, 0xc6c603b5), TOBN(0xae7b4c60, 0x7e4fc942), TOBN(0x38ac0b77, 0x663a9c19), TOBN(0xcb4d20ee, 0x4b049136), TOBN(0x8b63bf12, 0x356a4613), TOBN(0x1221aef6, 0x70e08128), TOBN(0xe62d8c51, 0x4acb6b16), TOBN(0x71f64a67, 0x379e7896), TOBN(0xb25237a2, 0xcafd7fa5), TOBN(0xf077bd98, 0x3841ba6a), TOBN(0xc4ac0244, 0x3cd16e7e), TOBN(0x548ba869, 0x21fea4ca), TOBN(0xd36d0817, 0xf3dfdac1), TOBN(0x09d8d71f, 0xf4685faf), TOBN(0x8eff66be, 0xc52c459a), TOBN(0x182faee7, 0x0b57235e), TOBN(0xee3c39b1, 0x0106712b), TOBN(0x5107331f, 0xc0fcdcb0), TOBN(0x669fb9dc, 0xa51054ba), TOBN(0xb25101fb, 0x319d7682), TOBN(0xb0293129, 0x0a982fee), TOBN(0x51c1c9b9, 0x0261b344), TOBN(0x0e008c5b, 0xbfd371fa), TOBN(0xd866dd1c, 0x0278ca33), TOBN(0x666f76a6, 0xe5aa53b1), TOBN(0xe5cfb779, 0x6013a2cf), TOBN(0x1d3a1aad, 0xa3521836), TOBN(0xcedd2531, 0x73faa485), TOBN(0xc8ee6c4f, 0xc0a76878), TOBN(0xddbccfc9, 0x2a11667d), TOBN(0x1a418ea9, 0x1c2f695a), TOBN(0xdb11bd92, 0x51f73971), TOBN(0x3e4b3c82, 0xda2ed89f), TOBN(0x9a44f3f4, 0xe73e0319), TOBN(0xd1e3de0f, 0x303431af), TOBN(0x3c5604ff, 0x50f75f9c), TOBN(0x1d8eddf3, 0x7e752b22), TOBN(0x0ef074dd, 0x3c9a1118), TOBN(0xd0ffc172, 0xccb86d7b), TOBN(0xabd1ece3, 0x037d90f2), TOBN(0xe3f307d6, 0x6055856c), TOBN(0x422f9328, 0x7e4c6daf), TOBN(0x902aac66, 0x334879a0), TOBN(0xb6a1e7bf, 0x94cdfade), TOBN(0x6c97e1ed, 0x7fc6d634), TOBN(0x662ad24d, 0xa2fb63f8), TOBN(0xf81be1b9, 0xa5928405), TOBN(0x86d765e4, 0xd14b4206), TOBN(0xbecc2e0e, 0x8fa0db65), TOBN(0xa28838e0, 0xb17fc76c), TOBN(0xe49a602a, 0xe37cf24e), TOBN(0x76b4131a, 0x567193ec), TOBN(0xaf3c305a, 0xe5f6e70b), TOBN(0x9587bd39, 0x031eebdd), TOBN(0x5709def8, 0x71bbe831), TOBN(0x57059983, 0x0eb2b669), TOBN(0x4d80ce1b, 0x875b7029), TOBN(0x838a7da8, 0x0364ac16), TOBN(0x2f431d23, 0xbe1c83ab), TOBN(0xe56812a6, 0xf9294dd3), TOBN(0xb448d01f, 0x9b4b0d77), TOBN(0xf3ae6061, 0x04e8305c), TOBN(0x2bead645, 0x94d8c63e), TOBN(0x0a85434d, 0x84fd8b07), TOBN(0x537b983f, 0xf7a9dee5), TOBN(0xedcc5f18, 0xef55bd85), TOBN(0x2041af62, 0x21c6cf8b), TOBN(0x8e52874c, 0xb940c71e), TOBN(0x211935a9, 0xdb5f4b3a), TOBN(0x94350492, 0x301b1dc3), TOBN(0x33d2646d, 0x29958620), TOBN(0x16b0d64b, 0xef911404), TOBN(0x9d1f25ea, 0x9a3c5ef4), TOBN(0x20f200eb, 0x4a352c78), TOBN(0x43929f2c, 0x4bd0b428), TOBN(0xa5656667, 0xc7196e29), TOBN(0x7992c2f0, 0x9391be48), TOBN(0xaaa97cbd, 0x9ee0cd6e), TOBN(0x51b0310c, 0x3dc8c9bf), TOBN(0x237f8acf, 0xdd9f22cb), TOBN(0xbb1d81a1, 0xb585d584), TOBN(0x8d5d85f5, 0x8c416388), TOBN(0x0d6e5a5a, 0x42fe474f), TOBN(0xe7812766, 0x38235d4e), TOBN(0x1c62bd67, 0x496e3298), TOBN(0x8378660c, 0x3f175bc8), TOBN(0x4d04e189, 0x17afdd4d), TOBN(0x32a81601, 0x85a8068c), TOBN(0xdb58e4e1, 0x92b29a85), TOBN(0xe8a65b86, 0xc70d8a3b), TOBN(0x5f0e6f4e, 0x98a0403b), TOBN(0x08129684, 0x69ed2370), TOBN(0x34dc30bd, 0x0871ee26), TOBN(0x3a5ce948, 0x7c9c5b05), TOBN(0x7d487b80, 0x43a90c87), TOBN(0x4089ba37, 0xdd0e7179), TOBN(0x45f80191, 0xb4041811), TOBN(0x1c3e1058, 0x98747ba5), TOBN(0x98c4e13a, 0x6e1ae592), TOBN(0xd44636e6, 0xe82c9f9e), TOBN(0x711db87c, 0xc33a1043), TOBN(0x6f431263, 0xaa8aec05), TOBN(0x43ff120d, 0x2744a4aa), TOBN(0xd3bd892f, 0xae77779b), TOBN(0xf0fe0cc9, 0x8cdc9f82), TOBN(0xca5f7fe6, 0xf1c5b1bc), TOBN(0xcc63a682, 0x44929a72), TOBN(0xc7eaba0c, 0x09dbe19a), TOBN(0x2f3585ad, 0x6b5c73c2), TOBN(0x8ab8924b, 0x0ae50c30), TOBN(0x17fcd27a, 0x638b30ba), TOBN(0xaf414d34, 0x10b3d5a5), TOBN(0x09c107d2, 0x2a9accf1), TOBN(0x15dac49f, 0x946a6242), TOBN(0xaec3df2a, 0xd707d642), TOBN(0x2c2492b7, 0x3f894ae0), TOBN(0xf59df3e5, 0xb75f18ce), TOBN(0x7cb740d2, 0x8f53cad0), TOBN(0x3eb585fb, 0xc4f01294), TOBN(0x17da0c86, 0x32c7f717), TOBN(0xeb8c795b, 0xaf943f4c), TOBN(0x4ee23fb5, 0xf67c51d2), TOBN(0xef187575, 0x68889949), TOBN(0xa6b4bdb2, 0x0389168b), TOBN(0xc4ecd258, 0xea577d03), TOBN(0x3a63782b, 0x55743082), TOBN(0x6f678f4c, 0xc72f08cd), TOBN(0x553511cf, 0x65e58dd8), TOBN(0xd53b4e3e, 0xd402c0cd), TOBN(0x37de3e29, 0xa037c14c), TOBN(0x86b6c516, 0xc05712aa), TOBN(0x2834da3e, 0xb38dff6f), TOBN(0xbe012c52, 0xea636be8), TOBN(0x292d238c, 0x61dd37f8), TOBN(0x0e54523f, 0x8f8142db), TOBN(0xe31eb436, 0x036a05d8), TOBN(0x83e3cdff, 0x1e93c0ff), TOBN(0x3fd2fe0f, 0x50821ddf), TOBN(0xc8e19b0d, 0xff9eb33b), TOBN(0xc8cc943f, 0xb569a5fe), TOBN(0xad0090d4, 0xd4342d75), TOBN(0x82090b4b, 0xcaeca000), TOBN(0xca39687f, 0x1bd410eb), TOBN(0xe7bb0df7, 0x65959d77), TOBN(0x39d78218, 0x9c964999), TOBN(0xd87f62e8, 0xb2415451), TOBN(0xe5efb774, 0xbed76108), TOBN(0x3ea011a4, 0xe822f0d0), TOBN(0xbc647ad1, 0x5a8704f8), TOBN(0xbb315b35, 0x50c6820f), TOBN(0x863dec3d, 0xb7e76bec), TOBN(0x01ff5d3a, 0xf017bfc7), TOBN(0x20054439, 0x976b8229), TOBN(0x067fca37, 0x0bbd0d3b), TOBN(0xf63dde64, 0x7f5e3d0f), TOBN(0x22dbefb3, 0x2a4c94e9), TOBN(0xafbff0fe, 0x96f8278a), TOBN(0x80aea0b1, 0x3503793d), TOBN(0xb2238029, 0x5f06cd29), TOBN(0x65703e57, 0x8ec3feca), TOBN(0x06c38314, 0x393e7053), TOBN(0xa0b751eb, 0x7c6734c4), TOBN(0xd2e8a435, 0xc59f0f1e), TOBN(0x147d9052, 0x5e9ca895), TOBN(0x2f4dd31e, 0x972072df), TOBN(0xa16fda8e, 0xe6c6755c), TOBN(0xc66826ff, 0xcf196558), TOBN(0x1f1a76a3, 0x0cf43895), TOBN(0xa9d604e0, 0x83c3097b), TOBN(0xe1908309, 0x66390e0e), TOBN(0xa50bf753, 0xb3c85eff), TOBN(0x0696bdde, 0xf6a70251), TOBN(0x548b801b, 0x3c6ab16a), TOBN(0x37fcf704, 0xa4d08762), TOBN(0x090b3def, 0xdff76c4e), TOBN(0x87e8cb89, 0x69cb9158), TOBN(0x44a90744, 0x995ece43), TOBN(0xf85395f4, 0x0ad9fbf5), TOBN(0x49b0f6c5, 0x4fb0c82d), TOBN(0x75d9bc15, 0xadf7cccf), TOBN(0x81a3e5d6, 0xdfa1e1b0), TOBN(0x8c39e444, 0x249bc17e), TOBN(0xf37dccb2, 0x8ea7fd43), TOBN(0xda654873, 0x907fba12), TOBN(0x35daa6da, 0x4a372904), TOBN(0x0564cfc6, 0x6283a6c5), TOBN(0xd09fa4f6, 0x4a9395bf), TOBN(0x688e9ec9, 0xaeb19a36), TOBN(0xd913f1ce, 0xc7bfbfb4), TOBN(0x797b9a3c, 0x61c2faa6), TOBN(0x2f979bec, 0x6a0a9c12), TOBN(0xb5969d0f, 0x359679ec), TOBN(0xebcf523d, 0x079b0460), TOBN(0xfd6b0008, 0x10fab870), TOBN(0x3f2edcda, 0x9373a39c), TOBN(0x0d64f9a7, 0x6f568431), TOBN(0xf848c27c, 0x02f8898c), TOBN(0xf418ade1, 0x260b5bd5), TOBN(0xc1f3e323, 0x6973dee8), TOBN(0x46e9319c, 0x26c185dd), TOBN(0x6d85b7d8, 0x546f0ac4), TOBN(0x427965f2, 0x247f9d57), TOBN(0xb519b636, 0xb0035f48), TOBN(0x6b6163a9, 0xab87d59c), TOBN(0xff9f58c3, 0x39caaa11), TOBN(0x4ac39cde, 0x3177387b), TOBN(0x5f6557c2, 0x873e77f9), TOBN(0x67504006, 0x36a83041), TOBN(0x9b1c96ca, 0x75ef196c), TOBN(0xf34283de, 0xb08c7940), TOBN(0x7ea09644, 0x1128c316), TOBN(0xb510b3b5, 0x6aa39dff), TOBN(0x59b43da2, 0x9f8e4d8c), TOBN(0xa8ce31fd, 0x9e4c4b9f), TOBN(0x0e20be26, 0xc1303c01), TOBN(0x18187182, 0xe8ee47c9), TOBN(0xd9687cdb, 0x7db98101), TOBN(0x7a520e4d, 0xa1e14ff6), TOBN(0x429808ba, 0x8836d572), TOBN(0xa37ca60d, 0x4944b663), TOBN(0xf901f7a9, 0xa3f91ae5), TOBN(0xe4e3e76e, 0x9e36e3b1), TOBN(0x9aa219cf, 0x29d93250), TOBN(0x347fe275, 0x056a2512), TOBN(0xa4d643d9, 0xde65d95c), TOBN(0x9669d396, 0x699fc3ed), TOBN(0xb598dee2, 0xcf8c6bbe), TOBN(0x682ac1e5, 0xdda9e5c6), TOBN(0x4e0d3c72, 0xcaa9fc95), TOBN(0x17faaade, 0x772bea44), TOBN(0x5ef8428c, 0xab0009c8), TOBN(0xcc4ce47a, 0x460ff016), TOBN(0xda6d12bf, 0x725281cb), TOBN(0x44c67848, 0x0223aad2), TOBN(0x6e342afa, 0x36256e28), TOBN(0x1400bb0b, 0x93a37c04), TOBN(0x62b1bc9b, 0xdd10bd96), TOBN(0x7251adeb, 0x0dac46b7), TOBN(0x7d33b92e, 0x7be4ef51), TOBN(0x28b2a94b, 0xe61fa29a), TOBN(0x4b2be13f, 0x06422233), TOBN(0x36d6d062, 0x330d8d37), TOBN(0x5ef80e1e, 0xb28ca005), TOBN(0x174d4699, 0x6d16768e), TOBN(0x9fc4ff6a, 0x628bf217), TOBN(0x77705a94, 0x154e490d), TOBN(0x9d96dd28, 0x8d2d997a), TOBN(0x77e2d9d8, 0xce5d72c4), TOBN(0x9d06c5a4, 0xc11c714f), TOBN(0x02aa5136, 0x79e4a03e), TOBN(0x1386b3c2, 0x030ff28b), TOBN(0xfe82e8a6, 0xfb283f61), TOBN(0x7df203e5, 0xf3abc3fb), TOBN(0xeec7c351, 0x3a4d3622), TOBN(0xf7d17dbf, 0xdf762761), TOBN(0xc3956e44, 0x522055f0), TOBN(0xde3012db, 0x8fa748db), TOBN(0xca9fcb63, 0xbf1dcc14), TOBN(0xa56d9dcf, 0xbe4e2f3a), TOBN(0xb86186b6, 0x8bcec9c2), TOBN(0x7cf24df9, 0x680b9f06), TOBN(0xc46b45ea, 0xc0d29281), TOBN(0xfff42bc5, 0x07b10e12), TOBN(0x12263c40, 0x4d289427), TOBN(0x3d5f1899, 0xb4848ec4), TOBN(0x11f97010, 0xd040800c), TOBN(0xb4c5f529, 0x300feb20), TOBN(0xcc543f8f, 0xde94fdcb), TOBN(0xe96af739, 0xc7c2f05e), TOBN(0xaa5e0036, 0x882692e1), TOBN(0x09c75b68, 0x950d4ae9), TOBN(0x62f63df2, 0xb5932a7a), TOBN(0x2658252e, 0xde0979ad), TOBN(0x2a19343f, 0xb5e69631), TOBN(0x718c7501, 0x525b666b), TOBN(0x26a42d69, 0xea40dc3a), TOBN(0xdc84ad22, 0xaecc018f), TOBN(0x25c36c7b, 0x3270f04a), TOBN(0x46ba6d47, 0x50fa72ed), TOBN(0x6c37d1c5, 0x93e58a8e), TOBN(0xa2394731, 0x120c088c), TOBN(0xc3be4263, 0xcb6e86da), TOBN(0x2c417d36, 0x7126d038), TOBN(0x5b70f9c5, 0x8b6f8efa), TOBN(0x671a2faa, 0x37718536), TOBN(0xd3ced3c6, 0xb539c92b), TOBN(0xe56f1bd9, 0xa31203c2), TOBN(0x8b096ec4, 0x9ff3c8eb), TOBN(0x2deae432, 0x43491cea), TOBN(0x2465c6eb, 0x17943794), TOBN(0x5d267e66, 0x20586843), TOBN(0x9d3d116d, 0xb07159d0), TOBN(0xae07a67f, 0xc1896210), TOBN(0x8fc84d87, 0xbb961579), TOBN(0x30009e49, 0x1c1f8dd6), TOBN(0x8a8caf22, 0xe3132819), TOBN(0xcffa197c, 0xf23ab4ff), TOBN(0x58103a44, 0x205dd687), TOBN(0x57b796c3, 0x0ded67a2), TOBN(0x0b9c3a6c, 0xa1779ad7), TOBN(0xa33cfe2e, 0x357c09c5), TOBN(0x2ea29315, 0x3db4a57e), TOBN(0x91959695, 0x8ebeb52e), TOBN(0x118db9a6, 0xe546c879), TOBN(0x8e996df4, 0x6295c8d6), TOBN(0xdd990484, 0x55ec806b), TOBN(0x24f291ca, 0x165c1035), TOBN(0xcca523bb, 0x440e2229), TOBN(0x324673a2, 0x73ef4d04), TOBN(0xaf3adf34, 0x3e11ec39), TOBN(0x6136d7f1, 0xdc5968d3), TOBN(0x7a7b2899, 0xb053a927), TOBN(0x3eaa2661, 0xae067ecd), TOBN(0x8549b9c8, 0x02779cd9), TOBN(0x061d7940, 0xc53385ea), TOBN(0x3e0ba883, 0xf06d18bd), TOBN(0x4ba6de53, 0xb2700843), TOBN(0xb966b668, 0x591a9e4d), TOBN(0x93f67567, 0x7f4fa0ed), TOBN(0x5a02711b, 0x4347237b), TOBN(0xbc041e2f, 0xe794608e), TOBN(0x55af10f5, 0x70f73d8c), TOBN(0xd2d4d4f7, 0xbb7564f7), TOBN(0xd7d27a89, 0xb3e93ce7), TOBN(0xf7b5a875, 0x5d3a2c1b), TOBN(0xb29e68a0, 0x255b218a), TOBN(0xb533837e, 0x8af76754), TOBN(0xd1b05a73, 0x579fab2e), TOBN(0xb41055a1, 0xecd74385), TOBN(0xb2369274, 0x445e9115), TOBN(0x2972a7c4, 0xf520274e), TOBN(0x6c08334e, 0xf678e68a), TOBN(0x4e4160f0, 0x99b057ed), TOBN(0x3cfe11b8, 0x52ccb69a), TOBN(0x2fd1823a, 0x21c8f772), TOBN(0xdf7f072f, 0x3298f055), TOBN(0x8c0566f9, 0xfec74a6e), TOBN(0xe549e019, 0x5bb4d041), TOBN(0x7c3930ba, 0x9208d850), TOBN(0xe07141fc, 0xaaa2902b), TOBN(0x539ad799, 0xe4f69ad3), TOBN(0xa6453f94, 0x813f9ffd), TOBN(0xc58d3c48, 0x375bc2f7), TOBN(0xb3326fad, 0x5dc64e96), TOBN(0x3aafcaa9, 0xb240e354), TOBN(0x1d1b0903, 0xaca1e7a9), TOBN(0x4ceb9767, 0x1211b8a0), TOBN(0xeca83e49, 0xe32a858e), TOBN(0x4c32892e, 0xae907bad), TOBN(0xd5b42ab6, 0x2eb9b494), TOBN(0x7fde3ee2, 0x1eabae1b), TOBN(0x13b5ab09, 0xcaf54957), TOBN(0xbfb028be, 0xe5f5d5d5), TOBN(0x928a0650, 0x2003e2c0), TOBN(0x90793aac, 0x67476843), TOBN(0x5e942e79, 0xc81710a0), TOBN(0x557e4a36, 0x27ccadd4), TOBN(0x72a2bc56, 0x4bcf6d0c), TOBN(0x09ee5f43, 0x26d7b80c), TOBN(0x6b70dbe9, 0xd4292f19), TOBN(0x56f74c26, 0x63f16b18), TOBN(0xc23db0f7, 0x35fbb42a), TOBN(0xb606bdf6, 0x6ae10040), TOBN(0x1eb15d4d, 0x044573ac), TOBN(0x7dc3cf86, 0x556b0ba4), TOBN(0x97af9a33, 0xc60df6f7), TOBN(0x0b1ef85c, 0xa716ce8c), TOBN(0x2922f884, 0xc96958be), TOBN(0x7c32fa94, 0x35690963), TOBN(0x2d7f667c, 0xeaa00061), TOBN(0xeaaf7c17, 0x3547365c), TOBN(0x1eb4de46, 0x87032d58), TOBN(0xc54f3d83, 0x5e2c79e0), TOBN(0x07818df4, 0x5d04ef23), TOBN(0x55faa9c8, 0x673d41b4), TOBN(0xced64f6f, 0x89b95355), TOBN(0x4860d2ea, 0xb7415c84), TOBN(0x5fdb9bd2, 0x050ebad3), TOBN(0xdb53e0cc, 0x6685a5bf), TOBN(0xb830c031, 0x9feb6593), TOBN(0xdd87f310, 0x6accff17), TOBN(0x2303ebab, 0x9f555c10), TOBN(0x94603695, 0x287e7065), TOBN(0xf88311c3, 0x2e83358c), TOBN(0x508dd9b4, 0xeefb0178), TOBN(0x7ca23706, 0x2dba8652), TOBN(0x62aac5a3, 0x0047abe5), TOBN(0x9a61d2a0, 0x8b1ea7b3), TOBN(0xd495ab63, 0xae8b1485), TOBN(0x38740f84, 0x87052f99), TOBN(0x178ebe5b, 0xb2974eea), TOBN(0x030bbcca, 0x5b36d17f), TOBN(0xb5e4cce3, 0xaaf86eea), TOBN(0xb51a0220, 0x68f8e9e0), TOBN(0xa4348796, 0x09eb3e75), TOBN(0xbe592309, 0xeef1a752), TOBN(0x5d7162d7, 0x6f2aa1ed), TOBN(0xaebfb5ed, 0x0f007dd2), TOBN(0x255e14b2, 0xc89edd22), TOBN(0xba85e072, 0x0303b697), TOBN(0xc5d17e25, 0xf05720ff), TOBN(0x02b58d6e, 0x5128ebb6), TOBN(0x2c80242d, 0xd754e113), TOBN(0x919fca5f, 0xabfae1ca), TOBN(0x937afaac, 0x1a21459b), TOBN(0x9e0ca91c, 0x1f66a4d2), TOBN(0x194cc7f3, 0x23ec1331), TOBN(0xad25143a, 0x8aa11690), TOBN(0xbe40ad8d, 0x09b59e08), TOBN(0x37d60d9b, 0xe750860a), TOBN(0x6c53b008, 0xc6bf434c), TOBN(0xb572415d, 0x1356eb80), TOBN(0xb8bf9da3, 0x9578ded8), TOBN(0x22658e36, 0x5e8fb38b), TOBN(0x9b70ce22, 0x5af8cb22), TOBN(0x7c00018a, 0x829a8180), TOBN(0x84329f93, 0xb81ed295), TOBN(0x7c343ea2, 0x5f3cea83), TOBN(0x38f8655f, 0x67586536), TOBN(0xa661a0d0, 0x1d3ec517), TOBN(0x98744652, 0x512321ae), TOBN(0x084ca591, 0xeca92598), TOBN(0xa9bb9dc9, 0x1dcb3feb), TOBN(0x14c54355, 0x78b4c240), TOBN(0x5ed62a3b, 0x610cafdc), TOBN(0x07512f37, 0x1b38846b), TOBN(0x571bb70a, 0xb0e38161), TOBN(0xb556b95b, 0x2da705d2), TOBN(0x3ef8ada6, 0xb1a08f98), TOBN(0x85302ca7, 0xddecfbe5), TOBN(0x0e530573, 0x943105cd), TOBN(0x60554d55, 0x21a9255d), TOBN(0x63a32fa1, 0xf2f3802a), TOBN(0x35c8c5b0, 0xcd477875), TOBN(0x97f458ea, 0x6ad42da1), TOBN(0x832d7080, 0xeb6b242d), TOBN(0xd30bd023, 0x3b71e246), TOBN(0x7027991b, 0xbe31139d), TOBN(0x68797e91, 0x462e4e53), TOBN(0x423fe20a, 0x6b4e185a), TOBN(0x82f2c67e, 0x42d9b707), TOBN(0x25c81768, 0x4cf7811b), TOBN(0xbd53005e, 0x045bb95d)}, {TOBN(0xe5f649be, 0x9d8e68fd), TOBN(0xdb0f0533, 0x1b044320), TOBN(0xf6fde9b3, 0xe0c33398), TOBN(0x92f4209b, 0x66c8cfae), TOBN(0xe9d1afcc, 0x1a739d4b), TOBN(0x09aea75f, 0xa28ab8de), TOBN(0x14375fb5, 0xeac6f1d0), TOBN(0x6420b560, 0x708f7aa5), TOBN(0x9eae499c, 0x6254dc41), TOBN(0x7e293924, 0x7a837e7e), TOBN(0x74aec08c, 0x090524a7), TOBN(0xf82b9219, 0x8d6f55f2), TOBN(0x493c962e, 0x1402cec5), TOBN(0x9f17ca17, 0xfa2f30e7), TOBN(0xbcd783e8, 0xe9b879cb), TOBN(0xea3d8c14, 0x5a6f145f), TOBN(0xdede15e7, 0x5e0dee6e), TOBN(0x74f24872, 0xdc628aa2), TOBN(0xd3e9c4fe, 0x7861bb93), TOBN(0x56d4822a, 0x6187b2e0), TOBN(0xb66417cf, 0xc59826f9), TOBN(0xca260969, 0x2408169e), TOBN(0xedf69d06, 0xc79ef885), TOBN(0x00031f8a, 0xdc7d138f), TOBN(0x103c46e6, 0x0ebcf726), TOBN(0x4482b831, 0x6231470e), TOBN(0x6f6dfaca, 0x487c2109), TOBN(0x2e0ace97, 0x62e666ef), TOBN(0x3246a9d3, 0x1f8d1f42), TOBN(0x1b1e83f1, 0x574944d2), TOBN(0x13dfa63a, 0xa57f334b), TOBN(0x0cf8daed, 0x9f025d81), TOBN(0x30d78ea8, 0x00ee11c1), TOBN(0xeb053cd4, 0xb5e3dd75), TOBN(0x9b65b13e, 0xd58c43c5), TOBN(0xc3ad49bd, 0xbd151663), TOBN(0x99fd8e41, 0xb6427990), TOBN(0x12cf15bd, 0x707eae1e), TOBN(0x29ad4f1b, 0x1aabb71e), TOBN(0x5143e74d, 0x07545d0e), TOBN(0x30266336, 0xc88bdee1), TOBN(0x25f29306, 0x5876767c), TOBN(0x9c078571, 0xc6731996), TOBN(0xc88690b2, 0xed552951), TOBN(0x274f2c2d, 0x852705b4), TOBN(0xb0bf8d44, 0x4e09552d), TOBN(0x7628beeb, 0x986575d1), TOBN(0x407be238, 0x7f864651), TOBN(0x0e5e3049, 0xa639fc6b), TOBN(0xe75c35d9, 0x86003625), TOBN(0x0cf35bd8, 0x5dcc1646), TOBN(0x8bcaced2, 0x6c26273a), TOBN(0xe22ecf1d, 0xb5536742), TOBN(0x013dd897, 0x1a9e068b), TOBN(0x17f411cb, 0x8a7909c5), TOBN(0x5757ac98, 0x861dd506), TOBN(0x85de1f0d, 0x1e935abb), TOBN(0xdefd10b4, 0x154de37a), TOBN(0xb8d9e392, 0x369cebb5), TOBN(0x54d5ef9b, 0x761324be), TOBN(0x4d6341ba, 0x74f17e26), TOBN(0xc0a0e3c8, 0x78c1dde4), TOBN(0xa6d77581, 0x87d918fd), TOBN(0x66876015, 0x02ca3a13), TOBN(0xc7313e9c, 0xf36658f0), TOBN(0xc433ef1c, 0x71f8057e), TOBN(0x85326246, 0x1b6a835a), TOBN(0xc8f05398, 0x7c86394c), TOBN(0xff398cdf, 0xe983c4a1), TOBN(0xbf5e8162, 0x03b7b931), TOBN(0x93193c46, 0xb7b9045b), TOBN(0x1e4ebf5d, 0xa4a6e46b), TOBN(0xf9942a60, 0x43a24fe7), TOBN(0x29c1191e, 0xffb3492b), TOBN(0x9f662449, 0x902fde05), TOBN(0xc792a7ac, 0x6713c32d), TOBN(0x2fd88ad8, 0xb737982c), TOBN(0x7e3a0319, 0xa21e60e3), TOBN(0x09b0de44, 0x7383591a), TOBN(0x6df141ee, 0x8310a456), TOBN(0xaec1a039, 0xe6d6f471), TOBN(0x14b2ba0f, 0x1198d12e), TOBN(0xebc1a160, 0x3aeee5ac), TOBN(0x401f4836, 0xe0b964ce), TOBN(0x2ee43796, 0x4fd03f66), TOBN(0x3fdb4e49, 0xdd8f3f12), TOBN(0x6ef267f6, 0x29380f18), TOBN(0x3e8e9670, 0x8da64d16), TOBN(0xbc19180c, 0x207674f1), TOBN(0x112e09a7, 0x33ae8fdb), TOBN(0x99667554, 0x6aaeb71e), TOBN(0x79432af1, 0xe101b1c7), TOBN(0xd5eb558f, 0xde2ddec6), TOBN(0x81392d1f, 0x5357753f), TOBN(0xa7a76b97, 0x3ae1158a), TOBN(0x416fbbff, 0x4a899991), TOBN(0x9e65fdfd, 0x0d4a9dcf), TOBN(0x7bc29e48, 0x944ddf12), TOBN(0xbc1a92d9, 0x3c856866), TOBN(0x273c6905, 0x6e98dfe2), TOBN(0x69fce418, 0xcdfaa6b8), TOBN(0x606bd823, 0x5061c69f), TOBN(0x42d495a0, 0x6af75e27), TOBN(0x8ed3d505, 0x6d873a1f), TOBN(0xaf552841, 0x6ab25b6a), TOBN(0xc6c0ffc7, 0x2b1a4523), TOBN(0xab18827b, 0x21c99e03), TOBN(0x060e8648, 0x9034691b), TOBN(0x5207f90f, 0x93c7f398), TOBN(0x9f4a96cb, 0x82f8d10b), TOBN(0xdd71cd79, 0x3ad0f9e3), TOBN(0x84f435d2, 0xfc3a54f5), TOBN(0x4b03c55b, 0x8e33787f), TOBN(0xef42f975, 0xa6384673), TOBN(0xff7304f7, 0x5051b9f0), TOBN(0x18aca1dc, 0x741c87c2), TOBN(0x56f120a7, 0x2d4bfe80), TOBN(0xfd823b3d, 0x053e732c), TOBN(0x11bccfe4, 0x7537ca16), TOBN(0xdf6c9c74, 0x1b5a996b), TOBN(0xee7332c7, 0x904fc3fa), TOBN(0x14a23f45, 0xc7e3636a), TOBN(0xc38659c3, 0xf091d9aa), TOBN(0x4a995e5d, 0xb12d8540), TOBN(0x20a53bec, 0xf3a5598a), TOBN(0x56534b17, 0xb1eaa995), TOBN(0x9ed3dca4, 0xbf04e03c), TOBN(0x716c563a, 0xd8d56268), TOBN(0x27ba77a4, 0x1d6178e7), TOBN(0xe4c80c40, 0x68a1ff8e), TOBN(0x75011099, 0x0a13f63d), TOBN(0x7bf33521, 0xa61d46f3), TOBN(0x0aff218e, 0x10b365bb), TOBN(0x81021804, 0x0fd7ea75), TOBN(0x05a3fd8a, 0xa4b3a925), TOBN(0xb829e75f, 0x9b3db4e6), TOBN(0x6bdc75a5, 0x4d53e5fb), TOBN(0x04a5dc02, 0xd52717e3), TOBN(0x86af502f, 0xe9a42ec2), TOBN(0x8867e8fb, 0x2630e382), TOBN(0xbf845c6e, 0xbec9889b), TOBN(0x54f491f2, 0xcb47c98d), TOBN(0xa3091fba, 0x790c2a12), TOBN(0xd7f6fd78, 0xc20f708b), TOBN(0xa569ac30, 0xacde5e17), TOBN(0xd0f996d0, 0x6852b4d7), TOBN(0xe51d4bb5, 0x4609ae54), TOBN(0x3fa37d17, 0x0daed061), TOBN(0x62a88684, 0x34b8fb41), TOBN(0x99a2acbd, 0x9efb64f1), TOBN(0xb75c1a5e, 0x6448e1f2), TOBN(0xfa99951a, 0x42b5a069), TOBN(0x6d956e89, 0x2f3b26e7), TOBN(0xf4709860, 0xda875247), TOBN(0x3ad15179, 0x2482dda3), TOBN(0xd64110e3, 0x017d82f0), TOBN(0x14928d2c, 0xfad414e4), TOBN(0x2b155f58, 0x2ed02b24), TOBN(0x481a141b, 0xcb821bf1), TOBN(0x12e3c770, 0x4f81f5da), TOBN(0xe49c5de5, 0x9fff8381), TOBN(0x11053232, 0x5bbec894), TOBN(0xa0d051cc, 0x454d88c4), TOBN(0x4f6db89c, 0x1f8e531b), TOBN(0x34fe3fd6, 0xca563a44), TOBN(0x7f5c2215, 0x58da8ab9), TOBN(0x8445016d, 0x9474f0a1), TOBN(0x17d34d61, 0xcb7d8a0a), TOBN(0x8e9d3910, 0x1c474019), TOBN(0xcaff2629, 0xd52ceefb), TOBN(0xf9cf3e32, 0xc1622c2b), TOBN(0xd4b95e3c, 0xe9071a05), TOBN(0xfbbca61f, 0x1594438c), TOBN(0x1eb6e6a6, 0x04aadedf), TOBN(0x853027f4, 0x68e14940), TOBN(0x221d322a, 0xdfabda9c), TOBN(0xed8ea9f6, 0xb7cb179a), TOBN(0xdc7b764d, 0xb7934dcc), TOBN(0xfcb13940, 0x5e09180d), TOBN(0x6629a6bf, 0xb47dc2dd), TOBN(0xbfc55e4e, 0x9f5a915e), TOBN(0xb1db9d37, 0x6204441e), TOBN(0xf82d68cf, 0x930c5f53), TOBN(0x17d3a142, 0xcbb605b1), TOBN(0xdd5944ea, 0x308780f2), TOBN(0xdc8de761, 0x3845f5e4), TOBN(0x6beaba7d, 0x7624d7a3), TOBN(0x1e709afd, 0x304df11e), TOBN(0x95364376, 0x02170456), TOBN(0xbf204b3a, 0xc8f94b64), TOBN(0x4e53af7c, 0x5680ca68), TOBN(0x0526074a, 0xe0c67574), TOBN(0x95d8cef8, 0xecd92af6), TOBN(0xe6b9fa7a, 0x6cd1745a), TOBN(0x3d546d3d, 0xa325c3e4), TOBN(0x1f57691d, 0x9ae93aae), TOBN(0xe891f3fe, 0x9d2e1a33), TOBN(0xd430093f, 0xac063d35), TOBN(0xeda59b12, 0x5513a327), TOBN(0xdc2134f3, 0x5536f18f), TOBN(0xaa51fe2c, 0x5c210286), TOBN(0x3f68aaee, 0x1cab658c), TOBN(0x5a23a00b, 0xf9357292), TOBN(0x9a626f39, 0x7efdabed), TOBN(0xfe2b3bf3, 0x199d78e3), TOBN(0xb7a2af77, 0x71bbc345), TOBN(0x3d19827a, 0x1e59802c), TOBN(0x823bbc15, 0xb487a51c), TOBN(0x856139f2, 0x99d0a422), TOBN(0x9ac3df65, 0xf456c6fb), TOBN(0xaddf65c6, 0x701f8bd6), TOBN(0x149f321e, 0x3758df87), TOBN(0xb1ecf714, 0x721b7eba), TOBN(0xe17df098, 0x31a3312a), TOBN(0xdb2fd6ec, 0xd5c4d581), TOBN(0xfd02996f, 0x8fcea1b3), TOBN(0xe29fa63e, 0x7882f14f), TOBN(0xc9f6dc35, 0x07c6cadc), TOBN(0x46f22d6f, 0xb882bed0), TOBN(0x1a45755b, 0xd118e52c), TOBN(0x9f2c7c27, 0x7c4608cf), TOBN(0x7ccbdf32, 0x568012c2), TOBN(0xfcb0aedd, 0x61729b0e), TOBN(0x7ca2ca9e, 0xf7d75dbf), TOBN(0xf58fecb1, 0x6f640f62), TOBN(0xe274b92b, 0x39f51946), TOBN(0x7f4dfc04, 0x6288af44), TOBN(0x0a91f32a, 0xeac329e5), TOBN(0x43ad274b, 0xd6aaba31), TOBN(0x719a1640, 0x0f6884f9), TOBN(0x685d29f6, 0xdaf91e20), TOBN(0x5ec1cc33, 0x27e49d52), TOBN(0x38f4de96, 0x3b54a059), TOBN(0x0e0015e5, 0xefbcfdb3), TOBN(0x177d23d9, 0x4dbb8da6), TOBN(0x98724aa2, 0x97a617ad), TOBN(0x30f0885b, 0xfdb6558e), TOBN(0xf9f7a28a, 0xc7899a96), TOBN(0xd2ae8ac8, 0x872dc112), TOBN(0xfa0642ca, 0x73c3c459), TOBN(0x15296981, 0xe7dfc8d6), TOBN(0x67cd4450, 0x1fb5b94a), TOBN(0x0ec71cf1, 0x0eddfd37), TOBN(0xc7e5eeb3, 0x9a8eddc7), TOBN(0x02ac8e3d, 0x81d95028), TOBN(0x0088f172, 0x70b0e35d), TOBN(0xec041fab, 0xe1881fe3), TOBN(0x62cf71b8, 0xd99e7faa), TOBN(0x5043dea7, 0xe0f222c2), TOBN(0x309d42ac, 0x72e65142), TOBN(0x94fe9ddd, 0x9216cd30), TOBN(0xd6539c7d, 0x0f87feec), TOBN(0x03c5a57c, 0x432ac7d7), TOBN(0x72692cf0, 0x327fda10), TOBN(0xec28c85f, 0x280698de), TOBN(0x2331fb46, 0x7ec283b1), TOBN(0xd34bfa32, 0x2867e633), TOBN(0x78709a82, 0x0a9cc815), TOBN(0xb7fe6964, 0x875e2fa5), TOBN(0x25cc064f, 0x9e98bfb5), TOBN(0x9eb0151c, 0x493a65c5), TOBN(0x5fb5d941, 0x53182464), TOBN(0x69e6f130, 0xf04618e2), TOBN(0xa8ecec22, 0xf89c8ab6), TOBN(0xcd6ac88b, 0xb96209bd), TOBN(0x65fa8cdb, 0xb3e1c9e0), TOBN(0xa47d22f5, 0x4a8d8eac), TOBN(0x83895cdf, 0x8d33f963), TOBN(0xa8adca59, 0xb56cd3d1), TOBN(0x10c8350b, 0xdaf38232), TOBN(0x2b161fb3, 0xa5080a9f), TOBN(0xbe7f5c64, 0x3af65b3a), TOBN(0x2c754039, 0x97403a11), TOBN(0x94626cf7, 0x121b96af), TOBN(0x431de7c4, 0x6a983ec2), TOBN(0x3780dd3a, 0x52cc3df7), TOBN(0xe28a0e46, 0x2baf8e3b), TOBN(0xabe68aad, 0x51d299ae), TOBN(0x603eb8f9, 0x647a2408), TOBN(0x14c61ed6, 0x5c750981), TOBN(0x88b34414, 0xc53352e7), TOBN(0x5a34889c, 0x1337d46e), TOBN(0x612c1560, 0xf95f2bc8), TOBN(0x8a3f8441, 0xd4807a3a), TOBN(0x680d9e97, 0x5224da68), TOBN(0x60cd6e88, 0xc3eb00e9), TOBN(0x3875a98e, 0x9a6bc375), TOBN(0xdc80f924, 0x4fd554c2), TOBN(0x6c4b3415, 0x6ac77407), TOBN(0xa1e5ea8f, 0x25420681), TOBN(0x541bfa14, 0x4607a458), TOBN(0x5dbc7e7a, 0x96d7fbf9), TOBN(0x646a851b, 0x31590a47), TOBN(0x039e85ba, 0x15ee6df8), TOBN(0xd19fa231, 0xd7b43fc0), TOBN(0x84bc8be8, 0x299a0e04), TOBN(0x2b9d2936, 0xf20df03a), TOBN(0x24054382, 0x8608d472), TOBN(0x76b6ba04, 0x9149202a), TOBN(0xb21c3831, 0x3670e7b7), TOBN(0xddd93059, 0xd6fdee10), TOBN(0x9da47ad3, 0x78488e71), TOBN(0x99cc1dfd, 0xa0fcfb25), TOBN(0x42abde10, 0x64696954), TOBN(0x14cc15fc, 0x17eab9fe), TOBN(0xd6e863e4, 0xd3e70972), TOBN(0x29a7765c, 0x6432112c), TOBN(0x88660001, 0x5b0774d8), TOBN(0x3729175a, 0x2c088eae), TOBN(0x13afbcae, 0x8230b8d4), TOBN(0x44768151, 0x915f4379), TOBN(0xf086431a, 0xd8d22812), TOBN(0x37461955, 0xc298b974), TOBN(0x905fb5f0, 0xf8711e04), TOBN(0x787abf3a, 0xfe969d18), TOBN(0x392167c2, 0x6f6a494e), TOBN(0xfc7a0d2d, 0x28c511da), TOBN(0xf127c7dc, 0xb66a262d), TOBN(0xf9c4bb95, 0xfd63fdf0), TOBN(0x90016589, 0x3913ef46), TOBN(0x74d2a73c, 0x11aa600d), TOBN(0x2f5379bd, 0x9fb5ab52), TOBN(0xe49e53a4, 0x7fb70068), TOBN(0x68dd39e5, 0x404aa9a7), TOBN(0xb9b0cf57, 0x2ecaa9c3), TOBN(0xba0e103b, 0xe824826b), TOBN(0x60c2198b, 0x4631a3c4), TOBN(0xc5ff84ab, 0xfa8966a2), TOBN(0x2d6ebe22, 0xac95aff8), TOBN(0x1c9bb6db, 0xb5a46d09), TOBN(0x419062da, 0x53ee4f8d), TOBN(0x7b9042d0, 0xbb97efef), TOBN(0x0f87f080, 0x830cf6bd), TOBN(0x4861d19a, 0x6ec8a6c6), TOBN(0xd3a0daa1, 0x202f01aa), TOBN(0xb0111674, 0xf25afbd5), TOBN(0x6d00d6cf, 0x1afb20d9), TOBN(0x13695000, 0x40671bc5), TOBN(0x913ab0dc, 0x2485ea9b), TOBN(0x1f2bed06, 0x9eef61ac), TOBN(0x850c8217, 0x6d799e20), TOBN(0x93415f37, 0x3271c2de), TOBN(0x5afb06e9, 0x6c4f5910), TOBN(0x688a52df, 0xc4e9e421), TOBN(0x30495ba3, 0xe2a9a6db), TOBN(0x4601303d, 0x58f9268b), TOBN(0xbe3b0dad, 0x7eb0f04f), TOBN(0x4ea47250, 0x4456936d), TOBN(0x8caf8798, 0xd33fd3e7), TOBN(0x1ccd8a89, 0xeb433708), TOBN(0x9effe3e8, 0x87fd50ad), TOBN(0xbe240a56, 0x6b29c4df), TOBN(0xec4ffd98, 0xca0e7ebd), TOBN(0xf586783a, 0xe748616e), TOBN(0xa5b00d8f, 0xc77baa99), TOBN(0x0acada29, 0xb4f34c9c), TOBN(0x36dad67d, 0x0fe723ac), TOBN(0x1d8e53a5, 0x39c36c1e), TOBN(0xe4dd342d, 0x1f4bea41), TOBN(0x64fd5e35, 0xebc9e4e0), TOBN(0x96f01f90, 0x57908805), TOBN(0xb5b9ea3d, 0x5ed480dd), TOBN(0x366c5dc2, 0x3efd2dd0), TOBN(0xed2fe305, 0x6e9dfa27), TOBN(0x4575e892, 0x6e9197e2), TOBN(0x11719c09, 0xab502a5d), TOBN(0x264c7bec, 0xe81f213f), TOBN(0x741b9241, 0x55f5c457), TOBN(0x78ac7b68, 0x49a5f4f4), TOBN(0xf91d70a2, 0x9fc45b7d), TOBN(0x39b05544, 0xb0f5f355), TOBN(0x11f06bce, 0xeef930d9), TOBN(0xdb84d25d, 0x038d05e1), TOBN(0x04838ee5, 0xbacc1d51), TOBN(0x9da3ce86, 0x9e8ee00b), TOBN(0xc3412057, 0xc36eda1f), TOBN(0xae80b913, 0x64d9c2f4), TOBN(0x7468bac3, 0xa010a8ff), TOBN(0xdfd20037, 0x37359d41), TOBN(0x1a0f5ab8, 0x15efeacc), TOBN(0x7c25ad2f, 0x659d0ce0), TOBN(0x4011bcbb, 0x6785cff1), TOBN(0x128b9912, 0x7e2192c7), TOBN(0xa549d8e1, 0x13ccb0e8), TOBN(0x805588d8, 0xc85438b1), TOBN(0x5680332d, 0xbc25cb27), TOBN(0xdcd1bc96, 0x1a4bfdf4), TOBN(0x779ff428, 0x706f6566), TOBN(0x8bbee998, 0xf059987a), TOBN(0xf6ce8cf2, 0xcc686de7), TOBN(0xf8ad3c4a, 0x953cfdb2), TOBN(0xd1d426d9, 0x2205da36), TOBN(0xb3c0f13f, 0xc781a241), TOBN(0x3e89360e, 0xd75362a8), TOBN(0xccd05863, 0xc8a91184), TOBN(0x9bd0c9b7, 0xefa8a7f4), TOBN(0x97ee4d53, 0x8a912a4b), TOBN(0xde5e15f8, 0xbcf518fd), TOBN(0x6a055bf8, 0xc467e1e0), TOBN(0x10be4b4b, 0x1587e256), TOBN(0xd90c14f2, 0x668621c9), TOBN(0xd5518f51, 0xab9c92c1), TOBN(0x8e6a0100, 0xd6d47b3c), TOBN(0xcbe980dd, 0x66716175), TOBN(0x500d3f10, 0xddd83683), TOBN(0x3b6cb35d, 0x99cac73c), TOBN(0x53730c8b, 0x6083d550), TOBN(0xcf159767, 0xdf0a1987), TOBN(0x84bfcf53, 0x43ad73b3), TOBN(0x1b528c20, 0x4f035a94), TOBN(0x4294edf7, 0x33eeac69), TOBN(0xb6283e83, 0x817f3240), TOBN(0xc3fdc959, 0x0a5f25b1), TOBN(0xefaf8aa5, 0x5844ee22), TOBN(0xde269ba5, 0xdbdde4de), TOBN(0xe3347160, 0xc56133bf), TOBN(0xc1184219, 0x8d9ea9f8), TOBN(0x090de5db, 0xf3fc1ab5), TOBN(0x404c37b1, 0x0bf22cda), TOBN(0x7de20ec8, 0xf5618894), TOBN(0x754c588e, 0xecdaecab), TOBN(0x6ca4b0ed, 0x88342743), TOBN(0x76f08bdd, 0xf4a938ec), TOBN(0xd182de89, 0x91493ccb), TOBN(0xd652c53e, 0xc8a4186a), TOBN(0xb3e878db, 0x946d8e33), TOBN(0x088453c0, 0x5f37663c), TOBN(0x5cd9daaa, 0xb407748b), TOBN(0xa1f5197f, 0x586d5e72), TOBN(0x47500be8, 0xc443ca59), TOBN(0x78ef35b2, 0xe2652424), TOBN(0x09c5d26f, 0x6dd7767d), TOBN(0x7175a79a, 0xa74d3f7b), TOBN(0x0428fd8d, 0xcf5ea459), TOBN(0x511cb97c, 0xa5d1746d), TOBN(0x36363939, 0xe71d1278), TOBN(0xcf2df955, 0x10350bf4), TOBN(0xb3817439, 0x60aae782), TOBN(0xa748c0e4, 0x3e688809), TOBN(0x98021fbf, 0xd7a5a006), TOBN(0x9076a70c, 0x0e367a98), TOBN(0xbea1bc15, 0x0f62b7c2), TOBN(0x2645a68c, 0x30fe0343), TOBN(0xacaffa78, 0x699dc14f), TOBN(0xf4469964, 0x457bf9c4), TOBN(0x0db6407b, 0x0d2ead83), TOBN(0x68d56cad, 0xb2c6f3eb), TOBN(0x3b512e73, 0xf376356c), TOBN(0xe43b0e1f, 0xfce10408), TOBN(0x89ddc003, 0x5a5e257d), TOBN(0xb0ae0d12, 0x0362e5b3), TOBN(0x07f983c7, 0xb0519161), TOBN(0xc2e94d15, 0x5d5231e7), TOBN(0xcff22aed, 0x0b4f9513), TOBN(0xb02588dd, 0x6ad0b0b5), TOBN(0xb967d1ac, 0x11d0dcd5), TOBN(0x8dac6bc6, 0xcf777b6c), TOBN(0x0062bdbd, 0x4c6d1959), TOBN(0x53da71b5, 0x0ef5cc85), TOBN(0x07012c7d, 0x4006f14f), TOBN(0x4617f962, 0xac47800d), TOBN(0x53365f2b, 0xc102ed75), TOBN(0xb422efcb, 0x4ab8c9d3), TOBN(0x195cb26b, 0x34af31c9), TOBN(0x3a926e29, 0x05f2c4ce), TOBN(0xbd2bdecb, 0x9856966c), TOBN(0x5d16ab3a, 0x85527015), TOBN(0x9f81609e, 0x4486c231), TOBN(0xd8b96b2c, 0xda350002), TOBN(0xbd054690, 0xfa1b7d36), TOBN(0xdc90ebf5, 0xe71d79bc), TOBN(0xf241b6f9, 0x08964e4e), TOBN(0x7c838643, 0x2fe3cd4c), TOBN(0xe0f33acb, 0xb4bc633c), TOBN(0xb4a9ecec, 0x3d139f1f), TOBN(0x05ce69cd, 0xdc4a1f49), TOBN(0xa19d1b16, 0xf5f98aaf), TOBN(0x45bb71d6, 0x6f23e0ef), TOBN(0x33789fcd, 0x46cdfdd3), TOBN(0x9b8e2978, 0xcee040ca), TOBN(0x9c69b246, 0xae0a6828), TOBN(0xba533d24, 0x7078d5aa), TOBN(0x7a2e42c0, 0x7bb4fbdb), TOBN(0xcfb4879a, 0x7035385c), TOBN(0x8c3dd30b, 0x3281705b), TOBN(0x7e361c6c, 0x404fe081), TOBN(0x7b21649c, 0x3f604edf), TOBN(0x5dbf6a3f, 0xe52ffe47), TOBN(0xc41b7c23, 0x4b54d9bf), TOBN(0x1374e681, 0x3511c3d9), TOBN(0x1863bf16, 0xc1b2b758), TOBN(0x90e78507, 0x1e9e6a96), TOBN(0xab4bf98d, 0x5d86f174), TOBN(0xd74e0bd3, 0x85e96fe4), TOBN(0x8afde39f, 0xcac5d344), TOBN(0x90946dbc, 0xbd91b847), TOBN(0xf5b42358, 0xfe1a838c), TOBN(0x05aae6c5, 0x620ac9d8), TOBN(0x8e193bd8, 0xa1ce5a0b), TOBN(0x8f710571, 0x4dabfd72), TOBN(0x8d8fdd48, 0x182caaac), TOBN(0x8c4aeefa, 0x040745cf), TOBN(0x73c6c30a, 0xf3b93e6d), TOBN(0x991241f3, 0x16f42011), TOBN(0xa0158eea, 0xe457a477), TOBN(0xd19857db, 0xee6ddc05), TOBN(0xb3265224, 0x18c41671), TOBN(0x3ffdfc7e, 0x3c2c0d58), TOBN(0x3a3a5254, 0x26ee7cda), TOBN(0x341b0869, 0xdf02c3a8), TOBN(0xa023bf42, 0x723bbfc8), TOBN(0x3d15002a, 0x14452691)}, {TOBN(0x5ef7324c, 0x85edfa30), TOBN(0x25976554, 0x87d4f3da), TOBN(0x352f5bc0, 0xdcb50c86), TOBN(0x8f6927b0, 0x4832a96c), TOBN(0xd08ee1ba, 0x55f2f94c), TOBN(0x6a996f99, 0x344b45fa), TOBN(0xe133cb8d, 0xa8aa455d), TOBN(0x5d0721ec, 0x758dc1f7), TOBN(0x6ba7a920, 0x79e5fb67), TOBN(0xe1331feb, 0x70aa725e), TOBN(0x5080ccf5, 0x7df5d837), TOBN(0xe4cae01d, 0x7ff72e21), TOBN(0xd9243ee6, 0x0412a77d), TOBN(0x06ff7cac, 0xdf449025), TOBN(0xbe75f7cd, 0x23ef5a31), TOBN(0xbc957822, 0x0ddef7a8), TOBN(0x8cf7230c, 0xb0ce1c55), TOBN(0x5b534d05, 0x0bbfb607), TOBN(0xee1ef113, 0x0e16363b), TOBN(0x27e0aa7a, 0xb4999e82), TOBN(0xce1dac2d, 0x79362c41), TOBN(0x67920c90, 0x91bb6cb0), TOBN(0x1e648d63, 0x2223df24), TOBN(0x0f7d9eef, 0xe32e8f28), TOBN(0x6943f39a, 0xfa833834), TOBN(0x22951722, 0xa6328562), TOBN(0x81d63dd5, 0x4170fc10), TOBN(0x9f5fa58f, 0xaecc2e6d), TOBN(0xb66c8725, 0xe77d9a3b), TOBN(0x11235cea, 0x6384ebe0), TOBN(0x06a8c118, 0x5845e24a), TOBN(0x0137b286, 0xebd093b1), TOBN(0xc589e1ce, 0x44ace150), TOBN(0xe0f8d3d9, 0x4381e97c), TOBN(0x59e99b11, 0x62c5a4b8), TOBN(0x90d262f7, 0xfd0ec9f9), TOBN(0xfbc854c9, 0x283e13c9), TOBN(0x2d04fde7, 0xaedc7085), TOBN(0x057d7765, 0x47dcbecb), TOBN(0x8dbdf591, 0x9a76fa5f), TOBN(0xd0150695, 0x0de1e578), TOBN(0x2e1463e7, 0xe9f72bc6), TOBN(0xffa68441, 0x1b39eca5), TOBN(0x673c8530, 0x7c037f2f), TOBN(0xd0d6a600, 0x747f91da), TOBN(0xb08d43e1, 0xc9cb78e9), TOBN(0x0fc0c644, 0x27b5cef5), TOBN(0x5c1d160a, 0xa60a2fd6), TOBN(0xf98cae53, 0x28c8e13b), TOBN(0x375f10c4, 0xb2eddcd1), TOBN(0xd4eb8b7f, 0x5cce06ad), TOBN(0xb4669f45, 0x80a2e1ef), TOBN(0xd593f9d0, 0x5bbd8699), TOBN(0x5528a4c9, 0xe7976d13), TOBN(0x3923e095, 0x1c7e28d3), TOBN(0xb9293790, 0x3f6bb577), TOBN(0xdb567d6a, 0xc42bd6d2), TOBN(0x6df86468, 0xbb1f96ae), TOBN(0x0efe5b1a, 0x4843b28e), TOBN(0x961bbb05, 0x6379b240), TOBN(0xb6caf5f0, 0x70a6a26b), TOBN(0x70686c0d, 0x328e6e39), TOBN(0x80da06cf, 0x895fc8d3), TOBN(0x804d8810, 0xb363fdc9), TOBN(0xbe22877b, 0x207f1670), TOBN(0x9b0dd188, 0x4e615291), TOBN(0x625ae8dc, 0x97a3c2bf), TOBN(0x08584ef7, 0x439b86e8), TOBN(0xde7190a5, 0xdcd898ff), TOBN(0x26286c40, 0x2058ee3d), TOBN(0x3db0b217, 0x5f87b1c1), TOBN(0xcc334771, 0x102a6db5), TOBN(0xd99de954, 0x2f770fb1), TOBN(0x97c1c620, 0x4cd7535e), TOBN(0xd3b6c448, 0x3f09cefc), TOBN(0xd725af15, 0x5a63b4f8), TOBN(0x0c95d24f, 0xc01e20ec), TOBN(0xdfd37494, 0x9ae7121f), TOBN(0x7d6ddb72, 0xec77b7ec), TOBN(0xfe079d3b, 0x0353a4ae), TOBN(0x3066e70a, 0x2e6ac8d2), TOBN(0x9c6b5a43, 0x106e5c05), TOBN(0x52d3c6f5, 0xede59b8c), TOBN(0x30d6a5c3, 0xfccec9ae), TOBN(0xedec7c22, 0x4fc0a9ef), TOBN(0x190ff083, 0x95c16ced), TOBN(0xbe12ec8f, 0x94de0fde), TOBN(0x0d131ab8, 0x852d3433), TOBN(0x42ace07e, 0x85701291), TOBN(0x94793ed9, 0x194061a8), TOBN(0x30e83ed6, 0xd7f4a485), TOBN(0x9eec7269, 0xf9eeff4d), TOBN(0x90acba59, 0x0c9d8005), TOBN(0x5feca458, 0x1e79b9d1), TOBN(0x8fbe5427, 0x1d506a1e), TOBN(0xa32b2c8e, 0x2439cfa7), TOBN(0x1671c173, 0x73dd0b4e), TOBN(0x37a28214, 0x44a054c6), TOBN(0x81760a1b, 0x4e8b53f1), TOBN(0xa6c04224, 0xf9f93b9e), TOBN(0x18784b34, 0xcf671e3c), TOBN(0x81bbecd2, 0xcda9b994), TOBN(0x38831979, 0xb2ab3848), TOBN(0xef54feb7, 0xf2e03c2d), TOBN(0xcf197ca7, 0xfb8088fa), TOBN(0x01427247, 0x4ddc96c5), TOBN(0xa2d2550a, 0x30777176), TOBN(0x53469898, 0x4d0cf71d), TOBN(0x6ce937b8, 0x3a2aaac6), TOBN(0xe9f91dc3, 0x5af38d9b), TOBN(0x2598ad83, 0xc8bf2899), TOBN(0x8e706ac9, 0xb5536c16), TOBN(0x40dc7495, 0xf688dc98), TOBN(0x26490cd7, 0x124c4afc), TOBN(0xe651ec84, 0x1f18775c), TOBN(0x393ea6c3, 0xb4fdaf4a), TOBN(0x1e1f3343, 0x7f338e0d), TOBN(0x39fb832b, 0x6053e7b5), TOBN(0x46e702da, 0x619e14d5), TOBN(0x859cacd1, 0xcdeef6e0), TOBN(0x63b99ce7, 0x4462007d), TOBN(0xb8ab48a5, 0x4cb5f5b7), TOBN(0x9ec673d2, 0xf55edde7), TOBN(0xd1567f74, 0x8cfaefda), TOBN(0x46381b6b, 0x0887bcec), TOBN(0x694497ce, 0xe178f3c2), TOBN(0x5e6525e3, 0x1e6266cb), TOBN(0x5931de26, 0x697d6413), TOBN(0x87f8df7c, 0x0e58d493), TOBN(0xb1ae5ed0, 0x58b73f12), TOBN(0xc368f784, 0xdea0c34d), TOBN(0x9bd0a120, 0x859a91a0), TOBN(0xb00d88b7, 0xcc863c68), TOBN(0x3a1cc11e, 0x3d1f4d65), TOBN(0xea38e0e7, 0x0aa85593), TOBN(0x37f13e98, 0x7dc4aee8), TOBN(0x10d38667, 0xbc947bad), TOBN(0x738e07ce, 0x2a36ee2e), TOBN(0xc93470cd, 0xc577fcac), TOBN(0xdee1b616, 0x2782470d), TOBN(0x36a25e67, 0x2e793d12), TOBN(0xd6aa6cae, 0xe0f186da), TOBN(0x474d0fd9, 0x80e07af7), TOBN(0xf7cdc47d, 0xba8a5cd4), TOBN(0x28af6d9d, 0xab15247f), TOBN(0x7c789c10, 0x493a537f), TOBN(0x7ac9b110, 0x23a334e7), TOBN(0x0236ac09, 0x12c9c277), TOBN(0xa7e5bd25, 0x1d7a5144), TOBN(0x098b9c2a, 0xf13ec4ec), TOBN(0x3639daca, 0xd3f0abca), TOBN(0x642da81a, 0xa23960f9), TOBN(0x7d2e5c05, 0x4f7269b1), TOBN(0xfcf30777, 0xe287c385), TOBN(0x10edc84f, 0xf2a46f21), TOBN(0x35441757, 0x4f43fa36), TOBN(0xf1327899, 0xfd703431), TOBN(0xa438d7a6, 0x16dd587a), TOBN(0x65c34c57, 0xe9c8352d), TOBN(0xa728edab, 0x5cc5a24e), TOBN(0xaed78abc, 0x42531689), TOBN(0x0a51a0e8, 0x010963ef), TOBN(0x5776fa0a, 0xd717d9b3), TOBN(0xf356c239, 0x7dd3428b), TOBN(0x29903fff, 0x8d3a3dac), TOBN(0x409597fa, 0x3d94491f), TOBN(0x4cd7a5ff, 0xbf4a56a4), TOBN(0xe5096474, 0x8adab462), TOBN(0xa97b5126, 0x5c3427b0), TOBN(0x6401405c, 0xd282c9bd), TOBN(0x3629f8d7, 0x222c5c45), TOBN(0xb1c02c16, 0xe8d50aed), TOBN(0xbea2ed75, 0xd9635bc9), TOBN(0x226790c7, 0x6e24552f), TOBN(0x3c33f2a3, 0x65f1d066), TOBN(0x2a43463e, 0x6dfccc2e), TOBN(0x8cc3453a, 0xdb483761), TOBN(0xe7cc6085, 0x65d5672b), TOBN(0x277ed6cb, 0xde3efc87), TOBN(0x19f2f368, 0x69234eaf), TOBN(0x9aaf4317, 0x5c0b800b), TOBN(0x1f1e7c89, 0x8b6da6e2), TOBN(0x6cfb4715, 0xb94ec75e), TOBN(0xd590dd5f, 0x453118c2), TOBN(0x14e49da1, 0x1f17a34c), TOBN(0x5420ab39, 0x235a1456), TOBN(0xb7637241, 0x2f50363b), TOBN(0x7b15d623, 0xc3fabb6e), TOBN(0xa0ef40b1, 0xe274e49c), TOBN(0x5cf50744, 0x96b1860a), TOBN(0xd6583fbf, 0x66afe5a4), TOBN(0x44240510, 0xf47e3e9a), TOBN(0x99254343, 0x11b2d595), TOBN(0xf1367499, 0xeec8df57), TOBN(0x3cb12c61, 0x3e73dd05), TOBN(0xd248c033, 0x7dac102a), TOBN(0xcf154f13, 0xa77739f5), TOBN(0xbf4288cb, 0x23d2af42), TOBN(0xaa64c9b6, 0x32e4a1cf), TOBN(0xee8c07a8, 0xc8a208f3), TOBN(0xe10d4999, 0x6fe8393f), TOBN(0x0f809a3f, 0xe91f3a32), TOBN(0x61096d1c, 0x802f63c8), TOBN(0x289e1462, 0x57750d3d), TOBN(0xed06167e, 0x9889feea), TOBN(0xd5c9c0e2, 0xe0993909), TOBN(0x46fca0d8, 0x56508ac6), TOBN(0x91826047, 0x4f1b8e83), TOBN(0x4f2c877a, 0x9a4a2751), TOBN(0x71bd0072, 0xcae6fead), TOBN(0x38df8dcc, 0x06aa1941), TOBN(0x5a074b4c, 0x63beeaa8), TOBN(0xd6d65934, 0xc1cec8ed), TOBN(0xa6ecb49e, 0xaabc03bd), TOBN(0xaade91c2, 0xde8a8415), TOBN(0xcfb0efdf, 0x691136e0), TOBN(0x11af45ee, 0x23ab3495), TOBN(0xa132df88, 0x0b77463d), TOBN(0x8923c15c, 0x815d06f4), TOBN(0xc3ceb3f5, 0x0d61a436), TOBN(0xaf52291d, 0xe88fb1da), TOBN(0xea057974, 0x1da12179), TOBN(0xb0d7218c, 0xd2fef720), TOBN(0x6c0899c9, 0x8e1d8845), TOBN(0x98157504, 0x752ddad7), TOBN(0xd60bd74f, 0xa1a68a97), TOBN(0x7047a3a9, 0xf658fb99), TOBN(0x1f5d86d6, 0x5f8511e4), TOBN(0xb8a4bc42, 0x4b5a6d88), TOBN(0x69eb2c33, 0x1abefa7d), TOBN(0x95bf39e8, 0x13c9c510), TOBN(0xf571960a, 0xd48aab43), TOBN(0x7e8cfbcf, 0x704e23c6), TOBN(0xc71b7d22, 0x28aaa65b), TOBN(0xa041b2bd, 0x245e3c83), TOBN(0x69b98834, 0xd21854ff), TOBN(0x89d227a3, 0x963bfeec), TOBN(0x99947aaa, 0xde7da7cb), TOBN(0x1d9ee9db, 0xee68a9b1), TOBN(0x0a08f003, 0x698ec368), TOBN(0xe9ea4094, 0x78ef2487), TOBN(0xc8d2d415, 0x02cfec26), TOBN(0xc52f9a6e, 0xb7dcf328), TOBN(0x0ed489e3, 0x85b6a937), TOBN(0x9b94986b, 0xbef3366e), TOBN(0x0de59c70, 0xedddddb8), TOBN(0xffdb748c, 0xeadddbe2), TOBN(0x9b9784bb, 0x8266ea40), TOBN(0x142b5502, 0x1a93507a), TOBN(0xb4cd1187, 0x8d3c06cf), TOBN(0xdf70e76a, 0x91ec3f40), TOBN(0x484e81ad, 0x4e7553c2), TOBN(0x830f87b5, 0x272e9d6e), TOBN(0xea1c93e5, 0xc6ff514a), TOBN(0x67cc2adc, 0xc4192a8e), TOBN(0xc77e27e2, 0x42f4535a), TOBN(0x9cdbab36, 0xd2b713c5), TOBN(0x86274ea0, 0xcf7b0cd3), TOBN(0x784680f3, 0x09af826b), TOBN(0xbfcc837a, 0x0c72dea3), TOBN(0xa8bdfe9d, 0xd6529b73), TOBN(0x708aa228, 0x63a88002), TOBN(0x6c7a9a54, 0xc91d45b9), TOBN(0xdf1a38bb, 0xfd004f56), TOBN(0x2e8c9a26, 0xb8bad853), TOBN(0x2d52cea3, 0x3723eae7), TOBN(0x054d6d81, 0x56ca2830), TOBN(0xa3317d14, 0x9a8dc411), TOBN(0xa08662fe, 0xfd4ddeda), TOBN(0xed2a153a, 0xb55d792b), TOBN(0x7035c16a, 0xbfc6e944), TOBN(0xb6bc5834, 0x00171cf3), TOBN(0xe27152b3, 0x83d102b6), TOBN(0xfe695a47, 0x0646b848), TOBN(0xa5bb09d8, 0x916e6d37), TOBN(0xb4269d64, 0x0d17015e), TOBN(0x8d8156a1, 0x0a1d2285), TOBN(0xfeef6c51, 0x46d26d72), TOBN(0x9dac57c8, 0x4c5434a7), TOBN(0x0282e5be, 0x59d39e31), TOBN(0xedfff181, 0x721c486d), TOBN(0x301baf10, 0xbc58824e), TOBN(0x8136a6aa, 0x00570031), TOBN(0x55aaf78c, 0x1cddde68), TOBN(0x26829371, 0x59c63952), TOBN(0x3a3bd274, 0x8bc25baf), TOBN(0xecdf8657, 0xb7e52dc3), TOBN(0x2dd8c087, 0xfd78e6c8), TOBN(0x20553274, 0xf5531461), TOBN(0x8b4a1281, 0x5d95499b), TOBN(0xe2c8763a, 0x1a80f9d2), TOBN(0xd1dbe32b, 0x4ddec758), TOBN(0xaf12210d, 0x30c34169), TOBN(0xba74a953, 0x78baa533), TOBN(0x3d133c6e, 0xa438f254), TOBN(0xa431531a, 0x201bef5b), TOBN(0x15295e22, 0xf669d7ec), TOBN(0xca374f64, 0x357fb515), TOBN(0x8a8406ff, 0xeaa3fdb3), TOBN(0x106ae448, 0xdf3f2da8), TOBN(0x8f9b0a90, 0x33c8e9a1), TOBN(0x234645e2, 0x71ad5885), TOBN(0x3d083224, 0x1c0aed14), TOBN(0xf10a7d3e, 0x7a942d46), TOBN(0x7c11deee, 0x40d5c9be), TOBN(0xb2bae7ff, 0xba84ed98), TOBN(0x93e97139, 0xaad58ddd), TOBN(0x3d872796, 0x3f6d1fa3), TOBN(0x483aca81, 0x8569ff13), TOBN(0x8b89a5fb, 0x9a600f72), TOBN(0x4cbc27c3, 0xc06f2b86), TOBN(0x22130713, 0x63ad9c0b), TOBN(0xb5358b1e, 0x48ac2840), TOBN(0x18311294, 0xecba9477), TOBN(0xda58f990, 0xa6946b43), TOBN(0x3098baf9, 0x9ab41819), TOBN(0x66c4c158, 0x4198da52), TOBN(0xab4fc17c, 0x146bfd1b), TOBN(0x2f0a4c3c, 0xbf36a908), TOBN(0x2ae9e34b, 0x58cf7838), TOBN(0xf411529e, 0x3fa11b1f), TOBN(0x21e43677, 0x974af2b4), TOBN(0x7c20958e, 0xc230793b), TOBN(0x710ea885, 0x16e840f3), TOBN(0xfc0b21fc, 0xc5dc67cf), TOBN(0x08d51647, 0x88405718), TOBN(0xd955c21f, 0xcfe49eb7), TOBN(0x9722a5d5, 0x56dd4a1f), TOBN(0xc9ef50e2, 0xc861baa5), TOBN(0xc0c21a5d, 0x9505ac3e), TOBN(0xaf6b9a33, 0x8b7c063f), TOBN(0xc6370339, 0x2f4779c1), TOBN(0x22df99c7, 0x638167c3), TOBN(0xfe6ffe76, 0x795db30c), TOBN(0x2b822d33, 0xa4854989), TOBN(0xfef031dd, 0x30563aa5), TOBN(0x16b09f82, 0xd57c667f), TOBN(0xc70312ce, 0xcc0b76f1), TOBN(0xbf04a9e6, 0xc9118aec), TOBN(0x82fcb419, 0x3409d133), TOBN(0x1a8ab385, 0xab45d44d), TOBN(0xfba07222, 0x617b83a3), TOBN(0xb05f50dd, 0x58e81b52), TOBN(0x1d8db553, 0x21ce5aff), TOBN(0x3097b8d4, 0xe344a873), TOBN(0x7d8d116d, 0xfe36d53e), TOBN(0x6db22f58, 0x7875e750), TOBN(0x2dc5e373, 0x43e144ea), TOBN(0xc05f32e6, 0xe799eb95), TOBN(0xe9e5f4df, 0x6899e6ec), TOBN(0xbdc3bd68, 0x1fab23d5), TOBN(0xb72b8ab7, 0x73af60e6), TOBN(0x8db27ae0, 0x2cecc84a), TOBN(0x600016d8, 0x7bdb871c), TOBN(0x42a44b13, 0xd7c46f58), TOBN(0xb8919727, 0xc3a77d39), TOBN(0xcfc6bbbd, 0xdafd6088), TOBN(0x1a740146, 0x6bd20d39), TOBN(0x8c747abd, 0x98c41072), TOBN(0x4c91e765, 0xbdf68ea1), TOBN(0x7c95e5ca, 0x08819a78), TOBN(0xcf48b729, 0xc9587921), TOBN(0x091c7c5f, 0xdebbcc7d), TOBN(0x6f287404, 0xf0e05149), TOBN(0xf83b5ac2, 0x26cd44ec), TOBN(0x88ae32a6, 0xcfea250e), TOBN(0x6ac5047a, 0x1d06ebc5), TOBN(0xc7e550b4, 0xd434f781), TOBN(0x61ab1cf2, 0x5c727bd2), TOBN(0x2e4badb1, 0x1cf915b0), TOBN(0x1b4dadec, 0xf69d3920), TOBN(0xe61b1ca6, 0xf14c1dfe), TOBN(0x90b479cc, 0xbd6bd51f), TOBN(0x8024e401, 0x8045ec30), TOBN(0xcab29ca3, 0x25ef0e62), TOBN(0x4f2e9416, 0x49e4ebc0), TOBN(0x45eb40ec, 0x0ccced58), TOBN(0x25cd4b9c, 0x0da44f98), TOBN(0x43e06458, 0x871812c6), TOBN(0x99f80d55, 0x16cef651), TOBN(0x571340c9, 0xce6dc153), TOBN(0x138d5117, 0xd8665521), TOBN(0xacdb45bc, 0x4e07014d), TOBN(0x2f34bb38, 0x84b60b91), TOBN(0xf44a4fd2, 0x2ae8921e), TOBN(0xb039288e, 0x892ba1e2), TOBN(0x9da50174, 0xb1c180b2), TOBN(0x6b70ab66, 0x1693dc87), TOBN(0x7e9babc9, 0xe7057481), TOBN(0x4581ddef, 0x9c80dc41), TOBN(0x0c890da9, 0x51294682), TOBN(0x0b5629d3, 0x3f4736e5), TOBN(0x2340c79e, 0xb06f5b41), TOBN(0xa42e84ce, 0x4e243469), TOBN(0xf9a20135, 0x045a71a9), TOBN(0xefbfb415, 0xd27b6fb6), TOBN(0x25ebea23, 0x9d33cd6f), TOBN(0x9caedb88, 0xaa6c0af8), TOBN(0x53dc7e9a, 0xd9ce6f96), TOBN(0x3897f9fd, 0x51e0b15a), TOBN(0xf51cb1f8, 0x8e5d788e), TOBN(0x1aec7ba8, 0xe1d490ee), TOBN(0x265991e0, 0xcc58cb3c), TOBN(0x9f306e8c, 0x9fc3ad31), TOBN(0x5fed006e, 0x5040a0ac), TOBN(0xca9d5043, 0xfb476f2e), TOBN(0xa19c06e8, 0xbeea7a23), TOBN(0xd2865801, 0x0edabb63), TOBN(0xdb92293f, 0x6967469a), TOBN(0x2894d839, 0x8d8a8ed8), TOBN(0x87c9e406, 0xbbc77122), TOBN(0x8671c6f1, 0x2ea3a26a), TOBN(0xe42df8d6, 0xd7de9853), TOBN(0x2e3ce346, 0xb1f2bcc7), TOBN(0xda601dfc, 0x899d50cf), TOBN(0xbfc913de, 0xfb1b598f), TOBN(0x81c4909f, 0xe61f7908), TOBN(0x192e304f, 0x9bbc7b29), TOBN(0xc3ed8738, 0xc104b338), TOBN(0xedbe9e47, 0x783f5d61), TOBN(0x0c06e9be, 0x2db30660), TOBN(0xda3e613f, 0xc0eb7d8e), TOBN(0xd8fa3e97, 0x322e096e), TOBN(0xfebd91e8, 0xd336e247), TOBN(0x8f13ccc4, 0xdf655a49), TOBN(0xa9e00dfc, 0x5eb20210), TOBN(0x84631d0f, 0xc656b6ea), TOBN(0x93a058cd, 0xd8c0d947), TOBN(0x6846904a, 0x67bd3448), TOBN(0x4a3d4e1a, 0xf394fd5c), TOBN(0xc102c1a5, 0xdb225f52), TOBN(0xe3455bba, 0xfc4f5e9a), TOBN(0x6b36985b, 0x4b9ad1ce), TOBN(0xa9818536, 0x5bb7f793), TOBN(0x6c25e1d0, 0x48b1a416), TOBN(0x1381dd53, 0x3c81bee7), TOBN(0xd2a30d61, 0x7a4a7620), TOBN(0xc8412926, 0x39b8944c), TOBN(0x3c1c6fbe, 0x7a97c33a), TOBN(0x941e541d, 0x938664e7), TOBN(0x417499e8, 0x4a34f239), TOBN(0x15fdb83c, 0xb90402d5), TOBN(0xb75f46bf, 0x433aa832), TOBN(0xb61e15af, 0x63215db1), TOBN(0xaabe59d4, 0xa127f89a), TOBN(0x5d541e0c, 0x07e816da), TOBN(0xaaba0659, 0xa618b692), TOBN(0x55327733, 0x17266026), TOBN(0xaf53a0fc, 0x95f57552), TOBN(0x32947650, 0x6cacb0c9), TOBN(0x253ff58d, 0xc821be01), TOBN(0xb0309531, 0xa06f1146), TOBN(0x59bbbdf5, 0x05c2e54d), TOBN(0x158f27ad, 0x26e8dd22), TOBN(0xcc5b7ffb, 0x397e1e53), TOBN(0xae03f65b, 0x7fc1e50d), TOBN(0xa9784ebd, 0x9c95f0f9), TOBN(0x5ed9deb2, 0x24640771), TOBN(0x31244af7, 0x035561c4), TOBN(0x87332f3a, 0x7ee857de), TOBN(0x09e16e9e, 0x2b9e0d88), TOBN(0x52d910f4, 0x56a06049), TOBN(0x507ed477, 0xa9592f48), TOBN(0x85cb917b, 0x2365d678), TOBN(0xf8511c93, 0x4c8998d1), TOBN(0x2186a3f1, 0x730ea58f), TOBN(0x50189626, 0xb2029db0), TOBN(0x9137a6d9, 0x02ceb75a), TOBN(0x2fe17f37, 0x748bc82c), TOBN(0x87c2e931, 0x80469f8c), TOBN(0x850f71cd, 0xbf891aa2), TOBN(0x0ca1b89b, 0x75ec3d8d), TOBN(0x516c43aa, 0x5e1cd3cd), TOBN(0x89397808, 0x9a887c28), TOBN(0x0059c699, 0xddea1f9f), TOBN(0x7737d6fa, 0x8e6868f7), TOBN(0x6d93746a, 0x60f1524b), TOBN(0x36985e55, 0xba052aa7), TOBN(0x41b1d322, 0xed923ea5), TOBN(0x3429759f, 0x25852a11), TOBN(0xbeca6ec3, 0x092e9f41), TOBN(0x3a238c66, 0x62256bbd), TOBN(0xd82958ea, 0x70ad487d), TOBN(0x4ac8aaf9, 0x65610d93), TOBN(0x3fa101b1, 0x5e4ccab0), TOBN(0x9bf430f2, 0x9de14bfb), TOBN(0xa10f5cc6, 0x6531899d), TOBN(0x590005fb, 0xea8ce17d), TOBN(0xc437912f, 0x24544cb6), TOBN(0x9987b71a, 0xd79ac2e3), TOBN(0x13e3d9dd, 0xc058a212), TOBN(0x00075aac, 0xd2de9606), TOBN(0x80ab508b, 0x6cac8369), TOBN(0x87842be7, 0xf54f6c89), TOBN(0xa7ad663d, 0x6bc532a4), TOBN(0x67813de7, 0x78a91bc8), TOBN(0x5dcb61ce, 0xc3427239), TOBN(0x5f3c7cf0, 0xc56934d9), TOBN(0xc079e0fb, 0xe3191591), TOBN(0xe40896bd, 0xb01aada7), TOBN(0x8d466791, 0x0492d25f), TOBN(0x8aeb30c9, 0xe7408276), TOBN(0xe9437495, 0x9287aacc), TOBN(0x23d4708d, 0x79fe03d4), TOBN(0x8cda9cf2, 0xd0c05199), TOBN(0x502fbc22, 0xfae78454), TOBN(0xc0bda9df, 0xf572a182), TOBN(0x5f9b71b8, 0x6158b372), TOBN(0xe0f33a59, 0x2b82dd07), TOBN(0x76302735, 0x9523032e), TOBN(0x7fe1a721, 0xc4505a32), TOBN(0x7b6e3e82, 0xf796409f)}, {TOBN(0xe3417bc0, 0x35d0b34a), TOBN(0x440b386b, 0x8327c0a7), TOBN(0x8fb7262d, 0xac0362d1), TOBN(0x2c41114c, 0xe0cdf943), TOBN(0x2ba5cef1, 0xad95a0b1), TOBN(0xc09b37a8, 0x67d54362), TOBN(0x26d6cdd2, 0x01e486c9), TOBN(0x20477abf, 0x42ff9297), TOBN(0xa004dcb3, 0x292a9287), TOBN(0xddc15cf6, 0x77b092c7), TOBN(0x083a8464, 0x806c0605), TOBN(0x4a68df70, 0x3db997b0), TOBN(0x9c134e45, 0x05bf7dd0), TOBN(0xa4e63d39, 0x8ccf7f8c), TOBN(0xa6e6517f, 0x41b5f8af), TOBN(0xaa8b9342, 0xad7bc1cc), TOBN(0x126f35b5, 0x1e706ad9), TOBN(0xb99cebb4, 0xc3a9ebdf), TOBN(0xa75389af, 0xbf608d90), TOBN(0x76113c4f, 0xc6c89858), TOBN(0x80de8eb0, 0x97e2b5aa), TOBN(0x7e1022cc, 0x63b91304), TOBN(0x3bdab605, 0x6ccc066c), TOBN(0x33cbb144, 0xb2edf900), TOBN(0xc4176471, 0x7af715d2), TOBN(0xe2f7f594, 0xd0134a96), TOBN(0x2c1873ef, 0xa41ec956), TOBN(0xe4e7b4f6, 0x77821304), TOBN(0xe5c8ff97, 0x88d5374a), TOBN(0x2b915e63, 0x80823d5b), TOBN(0xea6bc755, 0xb2ee8fe2), TOBN(0x6657624c, 0xe7112651), TOBN(0x157af101, 0xdace5aca), TOBN(0xc4fdbcf2, 0x11a6a267), TOBN(0xdaddf340, 0xc49c8609), TOBN(0x97e49f52, 0xe9604a65), TOBN(0x9be8e790, 0x937e2ad5), TOBN(0x846e2508, 0x326e17f1), TOBN(0x3f38007a, 0x0bbbc0dc), TOBN(0xcf03603f, 0xb11e16d6), TOBN(0xd6f800e0, 0x7442f1d5), TOBN(0x475607d1, 0x66e0e3ab), TOBN(0x82807f16, 0xb7c64047), TOBN(0x8858e1e3, 0xa749883d), TOBN(0x5859120b, 0x8231ee10), TOBN(0x1b80e7eb, 0x638a1ece), TOBN(0xcb72525a, 0xc6aa73a4), TOBN(0xa7cdea3d, 0x844423ac), TOBN(0x5ed0c007, 0xf8ae7c38), TOBN(0x6db07a5c, 0x3d740192), TOBN(0xbe5e9c2a, 0x5fe36db3), TOBN(0xd5b9d57a, 0x76e95046), TOBN(0x54ac32e7, 0x8eba20f2), TOBN(0xef11ca8f, 0x71b9a352), TOBN(0x305e373e, 0xff98a658), TOBN(0xffe5a100, 0x823eb667), TOBN(0x57477b11, 0xe51732d2), TOBN(0xdfd6eb28, 0x2538fc0e), TOBN(0x5c43b0cc, 0x3b39eec5), TOBN(0x6af12778, 0xcb36cc57), TOBN(0x70b0852d, 0x06c425ae), TOBN(0x6df92f8c, 0x5c221b9b), TOBN(0x6c8d4f9e, 0xce826d9c), TOBN(0xf59aba7b, 0xb49359c3), TOBN(0x5c8ed8d5, 0xda64309d), TOBN(0x61a6de56, 0x91b30704), TOBN(0xd6b52f6a, 0x2f9b5808), TOBN(0x0eee4194, 0x98c958a7), TOBN(0xcddd9aab, 0x771e4caa), TOBN(0x83965dfd, 0x78bc21be), TOBN(0x02affce3, 0xb3b504f5), TOBN(0x30847a21, 0x561c8291), TOBN(0xd2eb2cf1, 0x52bfda05), TOBN(0xe0e4c4e9, 0x6197b98c), TOBN(0x1d35076c, 0xf8a1726f), TOBN(0x6c06085b, 0x2db11e3d), TOBN(0x15c0c4d7, 0x4463ba14), TOBN(0x9d292f83, 0x0030238c), TOBN(0x1311ee8b, 0x3727536d), TOBN(0xfeea86ef, 0xbeaedc1e), TOBN(0xb9d18cd3, 0x66131e2e), TOBN(0xf31d974f, 0x80fe2682), TOBN(0xb6e49e0f, 0xe4160289), TOBN(0x7c48ec0b, 0x08e92799), TOBN(0x818111d8, 0xd1989aa7), TOBN(0xb34fa0aa, 0xebf926f9), TOBN(0xdb5fe2f5, 0xa245474a), TOBN(0xf80a6ebb, 0x3c7ca756), TOBN(0xa7f96054, 0xafa05dd8), TOBN(0x26dfcf21, 0xfcaf119e), TOBN(0xe20ef2e3, 0x0564bb59), TOBN(0xef4dca50, 0x61cb02b8), TOBN(0xcda7838a, 0x65d30672), TOBN(0x8b08d534, 0xfd657e86), TOBN(0x4c5b4395, 0x46d595c8), TOBN(0x39b58725, 0x425cb836), TOBN(0x8ea61059, 0x3de9abe3), TOBN(0x40434881, 0x9cdc03be), TOBN(0x9b261245, 0xcfedce8c), TOBN(0x78c318b4, 0xcf5234a1), TOBN(0x510bcf16, 0xfde24c99), TOBN(0x2a77cb75, 0xa2c2ff5d), TOBN(0x9c895c2b, 0x27960fb4), TOBN(0xd30ce975, 0xb0eda42b), TOBN(0xfda85393, 0x1a62cc26), TOBN(0x23c69b96, 0x50c0e052), TOBN(0xa227df15, 0xbfc633f3), TOBN(0x2ac78848, 0x1bae7d48), TOBN(0x487878f9, 0x187d073d), TOBN(0x6c2be919, 0x967f807d), TOBN(0x765861d8, 0x336e6d8f), TOBN(0x88b8974c, 0xce528a43), TOBN(0x09521177, 0xff57d051), TOBN(0x2ff38037, 0xfb6a1961), TOBN(0xfc0aba74, 0xa3d76ad4), TOBN(0x7c764803, 0x25a7ec17), TOBN(0x7532d75f, 0x48879bc8), TOBN(0xea7eacc0, 0x58ce6bc1), TOBN(0xc82176b4, 0x8e896c16), TOBN(0x9a30e0b2, 0x2c750fed), TOBN(0xc37e2c2e, 0x421d3aa4), TOBN(0xf926407c, 0xe84fa840), TOBN(0x18abc03d, 0x1454e41c), TOBN(0x26605ecd, 0x3f7af644), TOBN(0x242341a6, 0xd6a5eabf), TOBN(0x1edb84f4, 0x216b668e), TOBN(0xd836edb8, 0x04010102), TOBN(0x5b337ce7, 0x945e1d8c), TOBN(0xd2075c77, 0xc055dc14), TOBN(0x2a0ffa25, 0x81d89cdf), TOBN(0x8ce815ea, 0x6ffdcbaf), TOBN(0xa3428878, 0xfb648867), TOBN(0x277699cf, 0x884655fb), TOBN(0xfa5b5bd6, 0x364d3e41), TOBN(0x01f680c6, 0x441e1cb7), TOBN(0x3fd61e66, 0xb70a7d67), TOBN(0x666ba2dc, 0xcc78cf66), TOBN(0xb3018174, 0x6fdbff77), TOBN(0x8d4dd0db, 0x168d4668), TOBN(0x259455d0, 0x1dab3a2a), TOBN(0xf58564c5, 0xcde3acec), TOBN(0x77141925, 0x13adb276), TOBN(0x527d725d, 0x8a303f65), TOBN(0x55deb6c9, 0xe6f38f7b), TOBN(0xfd5bb657, 0xb1fa70fb), TOBN(0xfa07f50f, 0xd8073a00), TOBN(0xf72e3aa7, 0xbca02500), TOBN(0xf68f895d, 0x9975740d), TOBN(0x30112060, 0x5cae2a6a), TOBN(0x01bd7218, 0x02874842), TOBN(0x3d423891, 0x7ce47bd3), TOBN(0xa66663c1, 0x789544f6), TOBN(0x864d05d7, 0x3272d838), TOBN(0xe22924f9, 0xfa6295c5), TOBN(0x8189593f, 0x6c2fda32), TOBN(0x330d7189, 0xb184b544), TOBN(0x79efa62c, 0xbde1f714), TOBN(0x35771c94, 0xe5cb1a63), TOBN(0x2f4826b8, 0x641c8332), TOBN(0x00a894fb, 0xc8cee854), TOBN(0xb4b9a39b, 0x36194d40), TOBN(0xe857a7c5, 0x77612601), TOBN(0xf4209dd2, 0x4ecf2f58), TOBN(0x82b9e66d, 0x5a033487), TOBN(0xc1e36934, 0xe4e8b9dd), TOBN(0xd2372c9d, 0xa42377d7), TOBN(0x51dc94c7, 0x0e3ae43b), TOBN(0x4c57761e, 0x04474f6f), TOBN(0xdcdacd0a, 0x1058a318), TOBN(0x369cf3f5, 0x78053a9a), TOBN(0xc6c3de50, 0x31c68de2), TOBN(0x4653a576, 0x3c4b6d9f), TOBN(0x1688dd5a, 0xaa4e5c97), TOBN(0x5be80aa1, 0xb7ab3c74), TOBN(0x70cefe7c, 0xbc65c283), TOBN(0x57f95f13, 0x06867091), TOBN(0xa39114e2, 0x4415503b), TOBN(0xc08ff7c6, 0x4cbb17e9), TOBN(0x1eff674d, 0xd7dec966), TOBN(0x6d4690af, 0x53376f63), TOBN(0xff6fe32e, 0xea74237b), TOBN(0xc436d17e, 0xcd57508e), TOBN(0x15aa28e1, 0xedcc40fe), TOBN(0x0d769c04, 0x581bbb44), TOBN(0xc240b6de, 0x34eaacda), TOBN(0xd9e116e8, 0x2ba0f1de), TOBN(0xcbe45ec7, 0x79438e55), TOBN(0x91787c9d, 0x96f752d7), TOBN(0x897f532b, 0xf129ac2f), TOBN(0xd307b7c8, 0x5a36e22c), TOBN(0x91940675, 0x749fb8f3), TOBN(0xd14f95d0, 0x157fdb28), TOBN(0xfe51d029, 0x6ae55043), TOBN(0x8931e98f, 0x44a87de1), TOBN(0xe57f1cc6, 0x09e4fee2), TOBN(0x0d063b67, 0x4e072d92), TOBN(0x70a998b9, 0xed0e4316), TOBN(0xe74a736b, 0x306aca46), TOBN(0xecf0fbf2, 0x4fda97c7), TOBN(0xa40f65cb, 0x3e178d93), TOBN(0x16253604, 0x16df4285), TOBN(0xb0c9babb, 0xd0c56ae2), TOBN(0x73032b19, 0xcfc5cfc3), TOBN(0xe497e5c3, 0x09752056), TOBN(0x12096bb4, 0x164bda96), TOBN(0x1ee42419, 0xa0b74da1), TOBN(0x8fc36243, 0x403826ba), TOBN(0x0c8f0069, 0xdc09e660), TOBN(0x8667e981, 0xc27253c9), TOBN(0x05a6aefb, 0x92b36a45), TOBN(0xa62c4b36, 0x9cb7bb46), TOBN(0x8394f375, 0x11f7027b), TOBN(0x747bc79c, 0x5f109d0f), TOBN(0xcad88a76, 0x5b8cc60a), TOBN(0x80c5a66b, 0x58f09e68), TOBN(0xe753d451, 0xf6127eac), TOBN(0xc44b74a1, 0x5b0ec6f5), TOBN(0x47989fe4, 0x5289b2b8), TOBN(0x745f8484, 0x58d6fc73), TOBN(0xec362a6f, 0xf61c70ab), TOBN(0x070c98a7, 0xb3a8ad41), TOBN(0x73a20fc0, 0x7b63db51), TOBN(0xed2c2173, 0xf44c35f4), TOBN(0x8a56149d, 0x9acc9dca), TOBN(0x98f17881, 0x9ac6e0f4), TOBN(0x360fdeaf, 0xa413b5ed), TOBN(0x0625b8f4, 0xa300b0fd), TOBN(0xf1f4d76a, 0x5b3222d3), TOBN(0x9d6f5109, 0x587f76b8), TOBN(0x8b4ee08d, 0x2317fdb5), TOBN(0x88089bb7, 0x8c68b095), TOBN(0x95570e9a, 0x5808d9b9), TOBN(0xa395c36f, 0x35d33ae7), TOBN(0x200ea123, 0x50bb5a94), TOBN(0x20c789bd, 0x0bafe84b), TOBN(0x243ef52d, 0x0919276a), TOBN(0x3934c577, 0xe23ae233), TOBN(0xb93807af, 0xa460d1ec), TOBN(0xb72a53b1, 0xf8fa76a4), TOBN(0xd8914cb0, 0xc3ca4491), TOBN(0x2e128494, 0x3fb42622), TOBN(0x3b2700ac, 0x500907d5), TOBN(0xf370fb09, 0x1a95ec63), TOBN(0xf8f30be2, 0x31b6dfbd), TOBN(0xf2b2f8d2, 0x69e55f15), TOBN(0x1fead851, 0xcc1323e9), TOBN(0xfa366010, 0xd9e5eef6), TOBN(0x64d487b0, 0xe316107e), TOBN(0x4c076b86, 0xd23ddc82), TOBN(0x03fd344c, 0x7e0143f0), TOBN(0xa95362ff, 0x317af2c5), TOBN(0x0add3db7, 0xe18b7a4f), TOBN(0x9c673e3f, 0x8260e01b), TOBN(0xfbeb49e5, 0x54a1cc91), TOBN(0x91351bf2, 0x92f2e433), TOBN(0xc755e7ec, 0x851141eb), TOBN(0xc9a95139, 0x29607745), TOBN(0x0ca07420, 0xa26f2b28), TOBN(0xcb2790e7, 0x4bc6f9dd), TOBN(0x345bbb58, 0xadcaffc0), TOBN(0xc65ea38c, 0xbe0f27a2), TOBN(0x67c24d7c, 0x641fcb56), TOBN(0x2c25f0a7, 0xa9e2c757), TOBN(0x93f5cdb0, 0x16f16c49), TOBN(0x2ca5a9d7, 0xc5ee30a1), TOBN(0xd1593635, 0xb909b729), TOBN(0x804ce9f3, 0xdadeff48), TOBN(0xec464751, 0xb07c30c3), TOBN(0x89d65ff3, 0x9e49af6a), TOBN(0xf2d6238a, 0x6f3d01bc), TOBN(0x1095561e, 0x0bced843), TOBN(0x51789e12, 0xc8a13fd8), TOBN(0xd633f929, 0x763231df), TOBN(0x46df9f7d, 0xe7cbddef), TOBN(0x01c889c0, 0xcb265da8), TOBN(0xfce1ad10, 0xaf4336d2), TOBN(0x8d110df6, 0xfc6a0a7e), TOBN(0xdd431b98, 0x6da425dc), TOBN(0xcdc4aeab, 0x1834aabe), TOBN(0x84deb124, 0x8439b7fc), TOBN(0x8796f169, 0x3c2a5998), TOBN(0x9b9247b4, 0x7947190d), TOBN(0x55b9d9a5, 0x11597014), TOBN(0x7e9dd70d, 0x7b1566ee), TOBN(0x94ad78f7, 0xcbcd5e64), TOBN(0x0359ac17, 0x9bd4c032), TOBN(0x3b11baaf, 0x7cc222ae), TOBN(0xa6a6e284, 0xba78e812), TOBN(0x8392053f, 0x24cea1a0), TOBN(0xc97bce4a, 0x33621491), TOBN(0x7eb1db34, 0x35399ee9), TOBN(0x473f78ef, 0xece81ad1), TOBN(0x41d72fe0, 0xf63d3d0d), TOBN(0xe620b880, 0xafab62fc), TOBN(0x92096bc9, 0x93158383), TOBN(0x41a21357, 0x8f896f6c), TOBN(0x1b5ee2fa, 0xc7dcfcab), TOBN(0x650acfde, 0x9546e007), TOBN(0xc081b749, 0xb1b02e07), TOBN(0xda9e41a0, 0xf9eca03d), TOBN(0x013ba727, 0x175a54ab), TOBN(0xca0cd190, 0xea5d8d10), TOBN(0x85ea52c0, 0x95fd96a9), TOBN(0x2c591b9f, 0xbc5c3940), TOBN(0x6fb4d4e4, 0x2bad4d5f), TOBN(0xfa4c3590, 0xfef0059b), TOBN(0x6a10218a, 0xf5122294), TOBN(0x9a78a81a, 0xa85751d1), TOBN(0x04f20579, 0xa98e84e7), TOBN(0xfe1242c0, 0x4997e5b5), TOBN(0xe77a273b, 0xca21e1e4), TOBN(0xfcc8b1ef, 0x9411939d), TOBN(0xe20ea302, 0x92d0487a), TOBN(0x1442dbec, 0x294b91fe), TOBN(0x1f7a4afe, 0xbb6b0e8f), TOBN(0x1700ef74, 0x6889c318), TOBN(0xf5bbffc3, 0x70f1fc62), TOBN(0x3b31d4b6, 0x69c79cca), TOBN(0xe8bc2aab, 0xa7f6340d), TOBN(0xb0b08ab4, 0xa725e10a), TOBN(0x44f05701, 0xae340050), TOBN(0xba4b3016, 0x1cf0c569), TOBN(0x5aa29f83, 0xfbe19a51), TOBN(0x1b9ed428, 0xb71d752e), TOBN(0x1666e54e, 0xeb4819f5), TOBN(0x616cdfed, 0x9e18b75b), TOBN(0x112ed5be, 0x3ee27b0b), TOBN(0xfbf28319, 0x44c7de4d), TOBN(0xd685ec85, 0xe0e60d84), TOBN(0x68037e30, 0x1db7ee78), TOBN(0x5b65bdcd, 0x003c4d6e), TOBN(0x33e7363a, 0x93e29a6a), TOBN(0x995b3a61, 0x08d0756c), TOBN(0xd727f85c, 0x2faf134b), TOBN(0xfac6edf7, 0x1d337823), TOBN(0x99b9aa50, 0x0439b8b4), TOBN(0x722eb104, 0xe2b4e075), TOBN(0x49987295, 0x437c4926), TOBN(0xb1e4c0e4, 0x46a9b82d), TOBN(0xd0cb3197, 0x57a006f5), TOBN(0xf3de0f7d, 0xd7808c56), TOBN(0xb5c54d8f, 0x51f89772), TOBN(0x500a114a, 0xadbd31aa), TOBN(0x9afaaaa6, 0x295f6cab), TOBN(0x94705e21, 0x04cf667a), TOBN(0xfc2a811b, 0x9d3935d7), TOBN(0x560b0280, 0x6d09267c), TOBN(0xf19ed119, 0xf780e53b), TOBN(0xf0227c09, 0x067b6269), TOBN(0x967b8533, 0x5caef599), TOBN(0x155b9243, 0x68efeebc), TOBN(0xcd6d34f5, 0xc497bae6), TOBN(0x1dd8d5d3, 0x6cceb370), TOBN(0x2aeac579, 0xa78d7bf9), TOBN(0x5d65017d, 0x70b67a62), TOBN(0x70c8e44f, 0x17c53f67), TOBN(0xd1fc0950, 0x86a34d09), TOBN(0xe0fca256, 0xe7134907), TOBN(0xe24fa29c, 0x80fdd315), TOBN(0x2c4acd03, 0xd87499ad), TOBN(0xbaaf7517, 0x3b5a9ba6), TOBN(0xb9cbe1f6, 0x12e51a51), TOBN(0xd88edae3, 0x5e154897), TOBN(0xe4309c3c, 0x77b66ca0), TOBN(0xf5555805, 0xf67f3746), TOBN(0x85fc37ba, 0xa36401ff), TOBN(0xdf86e2ca, 0xd9499a53), TOBN(0x6270b2a3, 0xecbc955b), TOBN(0xafae64f5, 0x974ad33b), TOBN(0x04d85977, 0xfe7b2df1), TOBN(0x2a3db3ff, 0x4ab03f73), TOBN(0x0b87878a, 0x8702740a), TOBN(0x6d263f01, 0x5a061732), TOBN(0xc25430ce, 0xa32a1901), TOBN(0xf7ebab3d, 0xdb155018), TOBN(0x3a86f693, 0x63a9b78e), TOBN(0x349ae368, 0xda9f3804), TOBN(0x470f07fe, 0xa164349c), TOBN(0xd52f4cc9, 0x8562baa5), TOBN(0xc74a9e86, 0x2b290df3), TOBN(0xd3a1aa35, 0x43471a24), TOBN(0x239446be, 0xb8194511), TOBN(0xbec2dd00, 0x81dcd44d), TOBN(0xca3d7f0f, 0xc42ac82d), TOBN(0x1f3db085, 0xfdaf4520), TOBN(0xbb6d3e80, 0x4549daf2), TOBN(0xf5969d8a, 0x19ad5c42), TOBN(0x7052b13d, 0xdbfd1511), TOBN(0x11890d1b, 0x682b9060), TOBN(0xa71d3883, 0xac34452c), TOBN(0xa438055b, 0x783805b4), TOBN(0x43241277, 0x4725b23e), TOBN(0xf20cf96e, 0x4901bbed), TOBN(0x6419c710, 0xf432a2bb), TOBN(0x57a0fbb9, 0xdfa9cd7d), TOBN(0x589111e4, 0x00daa249), TOBN(0x19809a33, 0x7b60554e), TOBN(0xea5f8887, 0xede283a4), TOBN(0x2d713802, 0x503bfd35), TOBN(0x151bb0af, 0x585d2a53), TOBN(0x40b08f74, 0x43b30ca8), TOBN(0xe10b5bba, 0xd9934583), TOBN(0xe8a546d6, 0xb51110ad), TOBN(0x1dd50e66, 0x28e0b6c5), TOBN(0x292e9d54, 0xcff2b821), TOBN(0x3882555d, 0x47281760), TOBN(0x134838f8, 0x3724d6e3), TOBN(0xf2c679e0, 0x22ddcda1), TOBN(0x40ee8815, 0x6d2a5768), TOBN(0x7f227bd2, 0x1c1e7e2d), TOBN(0x487ba134, 0xd04ff443), TOBN(0x76e2ff3d, 0xc614e54b), TOBN(0x36b88d6f, 0xa3177ec7), TOBN(0xbf731d51, 0x2328fff5), TOBN(0x758caea2, 0x49ba158e), TOBN(0x5ab8ff4c, 0x02938188), TOBN(0x33e16056, 0x35edc56d), TOBN(0x5a69d349, 0x7e940d79), TOBN(0x6c4fd001, 0x03866dcb), TOBN(0x20a38f57, 0x4893cdef), TOBN(0xfbf3e790, 0xfac3a15b), TOBN(0x6ed7ea2e, 0x7a4f8e6b), TOBN(0xa663eb4f, 0xbc3aca86), TOBN(0x22061ea5, 0x080d53f7), TOBN(0x2480dfe6, 0xf546783f), TOBN(0xd38bc6da, 0x5a0a641e), TOBN(0xfb093cd1, 0x2ede8965), TOBN(0x89654db4, 0xacb455cf), TOBN(0x413cbf9a, 0x26e1adee), TOBN(0x291f3764, 0x373294d4), TOBN(0x00797257, 0x648083fe), TOBN(0x25f504d3, 0x208cc341), TOBN(0x635a8e5e, 0xc3a0ee43), TOBN(0x70aaebca, 0x679898ff), TOBN(0x9ee9f547, 0x5dc63d56), TOBN(0xce987966, 0xffb34d00), TOBN(0xf9f86b19, 0x5e26310a), TOBN(0x9e435484, 0x382a8ca8), TOBN(0x253bcb81, 0xc2352fe4), TOBN(0xa4eac8b0, 0x4474b571), TOBN(0xc1b97512, 0xc1ad8cf8), TOBN(0x193b4e9e, 0x99e0b697), TOBN(0x939d2716, 0x01e85df0), TOBN(0x4fb265b3, 0xcd44eafd), TOBN(0x321e7dcd, 0xe51e1ae2), TOBN(0x8e3a8ca6, 0xe3d8b096), TOBN(0x8de46cb0, 0x52604998), TOBN(0x91099ad8, 0x39072aa7), TOBN(0x2617f91c, 0x93aa96b8), TOBN(0x0fc8716b, 0x7fca2e13), TOBN(0xa7106f5e, 0x95328723), TOBN(0xd1c9c40b, 0x262e6522), TOBN(0xb9bafe86, 0x42b7c094), TOBN(0x1873439d, 0x1543c021), TOBN(0xe1baa5de, 0x5cbefd5d), TOBN(0xa363fc5e, 0x521e8aff), TOBN(0xefe6320d, 0xf862eaac), TOBN(0x14419c63, 0x22c647dc), TOBN(0x0e06707c, 0x4e46d428), TOBN(0xcb6c834f, 0x4a178f8f), TOBN(0x0f993a45, 0xd30f917c), TOBN(0xd4c4b049, 0x9879afee), TOBN(0xb6142a1e, 0x70500063), TOBN(0x7c9b41c3, 0xa5d9d605), TOBN(0xbc00fc2f, 0x2f8ba2c7), TOBN(0x0966eb2f, 0x7c67aa28), TOBN(0x13f7b516, 0x5a786972), TOBN(0x3bfb7557, 0x8a2fbba0), TOBN(0x131c4f23, 0x5a2b9620), TOBN(0xbff3ed27, 0x6faf46be), TOBN(0x9b4473d1, 0x7e172323), TOBN(0x421e8878, 0x339f6246), TOBN(0x0fa8587a, 0x25a41632), TOBN(0xc0814124, 0xa35b6c93), TOBN(0x2b18a9f5, 0x59ebb8db), TOBN(0x264e3357, 0x76edb29c), TOBN(0xaf245ccd, 0xc87c51e2), TOBN(0x16b3015b, 0x501e6214), TOBN(0xbb31c560, 0x0a3882ce), TOBN(0x6961bb94, 0xfec11e04), TOBN(0x3b825b8d, 0xeff7a3a0), TOBN(0xbec33738, 0xb1df7326), TOBN(0x68ad747c, 0x99604a1f), TOBN(0xd154c934, 0x9a3bd499), TOBN(0xac33506f, 0x1cc7a906), TOBN(0x73bb5392, 0x6c560e8f), TOBN(0x6428fcbe, 0x263e3944), TOBN(0xc11828d5, 0x1c387434), TOBN(0x3cd04be1, 0x3e4b12ff), TOBN(0xc3aad9f9, 0x2d88667c), TOBN(0xc52ddcf8, 0x248120cf), TOBN(0x985a892e, 0x2a389532), TOBN(0xfbb4b21b, 0x3bb85fa0), TOBN(0xf95375e0, 0x8dfc6269), TOBN(0xfb4fb06c, 0x7ee2acea), TOBN(0x6785426e, 0x309c4d1f), TOBN(0x659b17c8, 0xd8ceb147), TOBN(0x9b649eee, 0xb70a5554), TOBN(0x6b7fa0b5, 0xac6bc634), TOBN(0xd99fe2c7, 0x1d6e732f), TOBN(0x30e6e762, 0x8d3abba2), TOBN(0x18fee6e7, 0xa797b799), TOBN(0x5c9d360d, 0xc696464d), TOBN(0xe3baeb48, 0x27bfde12), TOBN(0x2bf5db47, 0xf23206d5), TOBN(0x2f6d3420, 0x1d260152), TOBN(0x17b87653, 0x3f8ff89a), TOBN(0x5157c30c, 0x378fa458), TOBN(0x7517c5c5, 0x2d4fb936), TOBN(0xef22f7ac, 0xe6518cdc), TOBN(0xdeb483e6, 0xbf847a64), TOBN(0xf5084558, 0x92e0fa89)}, {TOBN(0xab9659d8, 0xdf7304d4), TOBN(0xb71bcf1b, 0xff210e8e), TOBN(0xa9a2438b, 0xd73fbd60), TOBN(0x4595cd1f, 0x5d11b4de), TOBN(0x9c0d329a, 0x4835859d), TOBN(0x4a0f0d2d, 0x7dbb6e56), TOBN(0xc6038e5e, 0xdf928a4e), TOBN(0xc9429621, 0x8f5ad154), TOBN(0x91213462, 0xf23f2d92), TOBN(0x6cab71bd, 0x60b94078), TOBN(0x6bdd0a63, 0x176cde20), TOBN(0x54c9b20c, 0xee4d54bc), TOBN(0x3cd2d8aa, 0x9f2ac02f), TOBN(0x03f8e617, 0x206eedb0), TOBN(0xc7f68e16, 0x93086434), TOBN(0x831469c5, 0x92dd3db9), TOBN(0x8521df24, 0x8f981354), TOBN(0x587e23ec, 0x3588a259), TOBN(0xcbedf281, 0xd7a0992c), TOBN(0x06930a55, 0x38961407), TOBN(0x09320deb, 0xbe5bbe21), TOBN(0xa7ffa5b5, 0x2491817f), TOBN(0xe6c8b4d9, 0x09065160), TOBN(0xac4f3992, 0xfff6d2a9), TOBN(0x7aa7a158, 0x3ae9c1bd), TOBN(0xe0af6d98, 0xe37ce240), TOBN(0xe54342d9, 0x28ab38b4), TOBN(0xe8b75007, 0x0a1c98ca), TOBN(0xefce86af, 0xe02358f2), TOBN(0x31b8b856, 0xea921228), TOBN(0x052a1912, 0x0a1c67fc), TOBN(0xb4069ea4, 0xe3aead59), TOBN(0x3232d6e2, 0x7fa03cb3), TOBN(0xdb938e5b, 0x0fdd7d88), TOBN(0x04c1d2cd, 0x2ccbfc5d), TOBN(0xd2f45c12, 0xaf3a580f), TOBN(0x592620b5, 0x7883e614), TOBN(0x5fd27e68, 0xbe7c5f26), TOBN(0x139e45a9, 0x1567e1e3), TOBN(0x2cc71d2d, 0x44d8aaaf), TOBN(0x4a9090cd, 0xe36d0757), TOBN(0xf722d7b1, 0xd9a29382), TOBN(0xfb7fb04c, 0x04b48ddf), TOBN(0x628ad2a7, 0xebe16f43), TOBN(0xcd3fbfb5, 0x20226040), TOBN(0x6c34ecb1, 0x5104b6c4), TOBN(0x30c0754e, 0xc903c188), TOBN(0xec336b08, 0x2d23cab0), TOBN(0x473d62a2, 0x1e206ee5), TOBN(0xf1e27480, 0x8c49a633), TOBN(0x87ab956c, 0xe9f6b2c3), TOBN(0x61830b48, 0x62b606ea), TOBN(0x67cd6846, 0xe78e815f), TOBN(0xfe40139f, 0x4c02082a), TOBN(0x52bbbfcb, 0x952ec365), TOBN(0x74c11642, 0x6b9836ab), TOBN(0x9f51439e, 0x558df019), TOBN(0x230da4ba, 0xac712b27), TOBN(0x518919e3, 0x55185a24), TOBN(0x4dcefcdd, 0x84b78f50), TOBN(0xa7d90fb2, 0xa47d4c5a), TOBN(0x55ac9abf, 0xb30e009e), TOBN(0xfd2fc359, 0x74eed273), TOBN(0xb72d824c, 0xdbea8faf), TOBN(0xce721a74, 0x4513e2ca), TOBN(0x0b418612, 0x38240b2c), TOBN(0x05199968, 0xd5baa450), TOBN(0xeb1757ed, 0x2b0e8c25), TOBN(0x6ebc3e28, 0x3dfac6d5), TOBN(0xb2431e2e, 0x48a237f5), TOBN(0x2acb5e23, 0x52f61499), TOBN(0x5558a2a7, 0xe06c936b), TOBN(0xd213f923, 0xcbb13d1b), TOBN(0x98799f42, 0x5bfb9bfe), TOBN(0x1ae8ddc9, 0x701144a9), TOBN(0x0b8b3bb6, 0x4c5595ee), TOBN(0x0ea9ef2e, 0x3ecebb21), TOBN(0x17cb6c4b, 0x3671f9a7), TOBN(0x47ef464f, 0x726f1d1f), TOBN(0x171b9484, 0x6943a276), TOBN(0x51a4ae2d, 0x7ef0329c), TOBN(0x08509222, 0x91c4402a), TOBN(0x64a61d35, 0xafd45bbc), TOBN(0x38f096fe, 0x3035a851), TOBN(0xc7468b74, 0xa1dec027), TOBN(0xe8cf10e7, 0x4fc7dcba), TOBN(0xea35ff40, 0xf4a06353), TOBN(0x0b4c0dfa, 0x8b77dd66), TOBN(0x779b8552, 0xde7e5c19), TOBN(0xfab28609, 0xc1c0256c), TOBN(0x64f58eee, 0xabd4743d), TOBN(0x4e8ef838, 0x7b6cc93b), TOBN(0xee650d26, 0x4cb1bf3d), TOBN(0x4c1f9d09, 0x73dedf61), TOBN(0xaef7c9d7, 0xbfb70ced), TOBN(0x1ec0507e, 0x1641de1e), TOBN(0xcd7e5cc7, 0xcde45079), TOBN(0xde173c9a, 0x516ac9e4), TOBN(0x517a8494, 0xc170315c), TOBN(0x438fd905, 0x91d8e8fb), TOBN(0x5145c506, 0xc7d9630b), TOBN(0x6457a87b, 0xf47d4d75), TOBN(0xd31646bf, 0x0d9a80e8), TOBN(0x453add2b, 0xcef3aabe), TOBN(0xc9941109, 0xa607419d), TOBN(0xfaa71e62, 0xbb6bca80), TOBN(0x34158c13, 0x07c431f3), TOBN(0x594abebc, 0x992bc47a), TOBN(0x6dfea691, 0xeb78399f), TOBN(0x48aafb35, 0x3f42cba4), TOBN(0xedcd65af, 0x077c04f0), TOBN(0x1a29a366, 0xe884491a), TOBN(0x023a40e5, 0x1c21f2bf), TOBN(0xf99a513c, 0xa5057aee), TOBN(0xa3fe7e25, 0xbcab072e), TOBN(0x8568d2e1, 0x40e32bcf), TOBN(0x904594eb, 0xd3f69d9f), TOBN(0x181a9733, 0x07affab1), TOBN(0xe4d68d76, 0xb6e330f4), TOBN(0x87a6dafb, 0xc75a7fc1), TOBN(0x549db2b5, 0xef7d9289), TOBN(0x2480d4a8, 0x197f015a), TOBN(0x61d5590b, 0xc40493b6), TOBN(0x3a55b52e, 0x6f780331), TOBN(0x40eb8115, 0x309eadb0), TOBN(0xdea7de5a, 0x92e5c625), TOBN(0x64d631f0, 0xcc6a3d5a), TOBN(0x9d5e9d7c, 0x93e8dd61), TOBN(0xf297bef5, 0x206d3ffc), TOBN(0x23d5e033, 0x7d808bd4), TOBN(0x4a4f6912, 0xd24cf5ba), TOBN(0xe4d8163b, 0x09cdaa8a), TOBN(0x0e0de9ef, 0xd3082e8e), TOBN(0x4fe1246c, 0x0192f360), TOBN(0x1f900150, 0x4b8eee0a), TOBN(0x5219da81, 0xf1da391b), TOBN(0x7bf6a5c1, 0xf7ea25aa), TOBN(0xd165e6bf, 0xfbb07d5f), TOBN(0xe3539361, 0x89e78671), TOBN(0xa3fcac89, 0x2bac4219), TOBN(0xdfab6fd4, 0xf0baa8ab), TOBN(0x5a4adac1, 0xe2c1c2e5), TOBN(0x6cd75e31, 0x40d85849), TOBN(0xce263fea, 0x19b39181), TOBN(0xcb6803d3, 0x07032c72), TOBN(0x7f40d5ce, 0x790968c8), TOBN(0xa6de86bd, 0xdce978f0), TOBN(0x25547c4f, 0x368f751c), TOBN(0xb1e685fd, 0x65fb2a9e), TOBN(0xce69336f, 0x1eb9179c), TOBN(0xb15d1c27, 0x12504442), TOBN(0xb7df465c, 0xb911a06b), TOBN(0xb8d804a3, 0x315980cd), TOBN(0x693bc492, 0xfa3bebf7), TOBN(0x3578aeee, 0x2253c504), TOBN(0x158de498, 0xcd2474a2), TOBN(0x1331f5c7, 0xcfda8368), TOBN(0xd2d7bbb3, 0x78d7177e), TOBN(0xdf61133a, 0xf3c1e46e), TOBN(0x5836ce7d, 0xd30e7be8), TOBN(0x83084f19, 0x94f834cb), TOBN(0xd35653d4, 0x429ed782), TOBN(0xa542f16f, 0x59e58243), TOBN(0xc2b52f65, 0x0470a22d), TOBN(0xe3b6221b, 0x18f23d96), TOBN(0xcb05abac, 0x3f5252b4), TOBN(0xca00938b, 0x87d61402), TOBN(0x2f186cdd, 0x411933e4), TOBN(0xe042ece5, 0x9a29a5c5), TOBN(0xb19b3c07, 0x3b6c8402), TOBN(0xc97667c7, 0x19d92684), TOBN(0xb5624622, 0xebc66372), TOBN(0x0cb96e65, 0x3c04fa02), TOBN(0x83a7176c, 0x8eaa39aa), TOBN(0x2033561d, 0xeaa1633f), TOBN(0x45a9d086, 0x4533df73), TOBN(0xe0542c1d, 0x3dc090bc), TOBN(0x82c996ef, 0xaa59c167), TOBN(0xe3f735e8, 0x0ee7fc4d), TOBN(0x7b179393, 0x7c35db79), TOBN(0xb6419e25, 0xf8c5dbfd), TOBN(0x4d9d7a1e, 0x1f327b04), TOBN(0x979f6f9b, 0x298dfca8), TOBN(0xc7c5dff1, 0x8de9366a), TOBN(0x1b7a588d, 0x04c82bdd), TOBN(0x68005534, 0xf8319dfd), TOBN(0xde8a55b5, 0xd8eb9580), TOBN(0x5ea886da, 0x8d5bca81), TOBN(0xe8530a01, 0x252a0b4d), TOBN(0x1bffb4fe, 0x35eaa0a1), TOBN(0x2ad828b1, 0xd8e99563), TOBN(0x7de96ef5, 0x95f9cd87), TOBN(0x4abb2d0c, 0xd77d970c), TOBN(0x03cfb933, 0xd33ef9cb), TOBN(0xb0547c01, 0x8b211fe9), TOBN(0x2fe64809, 0xa56ed1c6), TOBN(0xcb7d5624, 0xc2ac98cc), TOBN(0x2a1372c0, 0x1a393e33), TOBN(0xc8d1ec1c, 0x29660521), TOBN(0xf3d31b04, 0xb37ac3e9), TOBN(0xa29ae9df, 0x5ece6e7c), TOBN(0x0603ac8f, 0x0facfb55), TOBN(0xcfe85b7a, 0xdda233a5), TOBN(0xe618919f, 0xbd75f0b8), TOBN(0xf555a3d2, 0x99bf1603), TOBN(0x1f43afc9, 0xf184255a), TOBN(0xdcdaf341, 0x319a3e02), TOBN(0xd3b117ef, 0x03903a39), TOBN(0xe095da13, 0x65d1d131), TOBN(0x86f16367, 0xc37ad03e), TOBN(0x5f37389e, 0x462cd8dd), TOBN(0xc103fa04, 0xd67a60e6), TOBN(0x57c34344, 0xf4b478f0), TOBN(0xce91edd8, 0xe117c98d), TOBN(0x001777b0, 0x231fc12e), TOBN(0x11ae47f2, 0xb207bccb), TOBN(0xd983cf8d, 0x20f8a242), TOBN(0x7aff5b1d, 0xf22e1ad8), TOBN(0x68fd11d0, 0x7fc4feb3), TOBN(0x5d53ae90, 0xb0f1c3e1), TOBN(0x50fb7905, 0xec041803), TOBN(0x85e3c977, 0x14404888), TOBN(0x0e67faed, 0xac628d8f), TOBN(0x2e865150, 0x6668532c), TOBN(0x15acaaa4, 0x6a67a6b0), TOBN(0xf4cdee25, 0xb25cec41), TOBN(0x49ee565a, 0xe4c6701e), TOBN(0x2a04ca66, 0xfc7d63d8), TOBN(0xeb105018, 0xef0543fb), TOBN(0xf709a4f5, 0xd1b0d81d), TOBN(0x5b906ee6, 0x2915d333), TOBN(0xf4a87412, 0x96f1f0ab), TOBN(0xb6b82fa7, 0x4d82f4c2), TOBN(0x90725a60, 0x6804efb3), TOBN(0xbc82ec46, 0xadc3425e), TOBN(0xb7b80581, 0x2787843e), TOBN(0xdf46d91c, 0xdd1fc74c), TOBN(0xdc1c62cb, 0xe783a6c4), TOBN(0x59d1b9f3, 0x1a04cbba), TOBN(0xd87f6f72, 0x95e40764), TOBN(0x02b4cfc1, 0x317f4a76), TOBN(0x8d2703eb, 0x91036bce), TOBN(0x98206cc6, 0xa5e72a56), TOBN(0x57be9ed1, 0xcf53fb0f), TOBN(0x09374571, 0xef0b17ac), TOBN(0x74b2655e, 0xd9181b38), TOBN(0xc8f80ea8, 0x89935d0e), TOBN(0xc0d9e942, 0x91529936), TOBN(0x19686041, 0x1e84e0e5), TOBN(0xa5db84d3, 0xaea34c93), TOBN(0xf9d5bb19, 0x7073a732), TOBN(0xb8d2fe56, 0x6bcfd7c0), TOBN(0x45775f36, 0xf3eb82fa), TOBN(0x8cb20ccc, 0xfdff8b58), TOBN(0x1659b65f, 0x8374c110), TOBN(0xb8b4a422, 0x330c789a), TOBN(0x75e3c3ea, 0x6fe8208b), TOBN(0xbd74b9e4, 0x286e78fe), TOBN(0x0be2e81b, 0xd7d93a1a), TOBN(0x7ed06e27, 0xdd0a5aae), TOBN(0x721f5a58, 0x6be8b800), TOBN(0x428299d1, 0xd846db28), TOBN(0x95cb8e6b, 0x5be88ed3), TOBN(0xc3186b23, 0x1c034e11), TOBN(0xa6312c9e, 0x8977d99b), TOBN(0xbe944331, 0x83f531e7), TOBN(0x8232c0c2, 0x18d3b1d4), TOBN(0x617aae8b, 0xe1247b73), TOBN(0x40153fc4, 0x282aec3b), TOBN(0xc6063d2f, 0xf7b8f823), TOBN(0x68f10e58, 0x3304f94c), TOBN(0x31efae74, 0xee676346), TOBN(0xbadb6c6d, 0x40a9b97c), TOBN(0x14702c63, 0x4f666256), TOBN(0xdeb954f1, 0x5184b2e3), TOBN(0x5184a526, 0x94b6ca40), TOBN(0xfff05337, 0x003c32ea), TOBN(0x5aa374dd, 0x205974c7), TOBN(0x9a763854, 0x4b0dd71a), TOBN(0x459cd27f, 0xdeb947ec), TOBN(0xa6e28161, 0x459c2b92), TOBN(0x2f020fa8, 0x75ee8ef5), TOBN(0xb132ec2d, 0x30b06310), TOBN(0xc3e15899, 0xbc6a4530), TOBN(0xdc5f53fe, 0xaa3f451a), TOBN(0x3a3c7f23, 0xc2d9acac), TOBN(0x2ec2f892, 0x6b27e58b), TOBN(0x68466ee7, 0xd742799f), TOBN(0x98324dd4, 0x1fa26613), TOBN(0xa2dc6dab, 0xbdc29d63), TOBN(0xf9675faa, 0xd712d657), TOBN(0x813994be, 0x21fd8d15), TOBN(0x5ccbb722, 0xfd4f7553), TOBN(0x5135ff8b, 0xf3a36b20), TOBN(0x44be28af, 0x69559df5), TOBN(0x40b65bed, 0x9d41bf30), TOBN(0xd98bf2a4, 0x3734e520), TOBN(0x5e3abbe3, 0x209bdcba), TOBN(0x77c76553, 0xbc945b35), TOBN(0x5331c093, 0xc6ef14aa), TOBN(0x518ffe29, 0x76b60c80), TOBN(0x2285593b, 0x7ace16f8), TOBN(0xab1f64cc, 0xbe2b9784), TOBN(0xe8f2c0d9, 0xab2421b6), TOBN(0x617d7174, 0xc1df065c), TOBN(0xafeeb5ab, 0x5f6578fa), TOBN(0x16ff1329, 0x263b54a8), TOBN(0x45c55808, 0xc990dce3), TOBN(0x42eab6c0, 0xecc8c177), TOBN(0x799ea9b5, 0x5982ecaa), TOBN(0xf65da244, 0xb607ef8e), TOBN(0x8ab226ce, 0x32a3fc2c), TOBN(0x745741e5, 0x7ea973dc), TOBN(0x5c00ca70, 0x20888f2e), TOBN(0x7cdce3cf, 0x45fd9cf1), TOBN(0x8a741ef1, 0x5507f872), TOBN(0x47c51c2f, 0x196b4cec), TOBN(0x70d08e43, 0xc97ea618), TOBN(0x930da15c, 0x15b18a2b), TOBN(0x33b6c678, 0x2f610514), TOBN(0xc662e4f8, 0x07ac9794), TOBN(0x1eccf050, 0xba06cb79), TOBN(0x1ff08623, 0xe7d954e5), TOBN(0x6ef2c5fb, 0x24cf71c3), TOBN(0xb2c063d2, 0x67978453), TOBN(0xa0cf3796, 0x1d654af8), TOBN(0x7cb242ea, 0x7ebdaa37), TOBN(0x206e0b10, 0xb86747e0), TOBN(0x481dae5f, 0xd5ecfefc), TOBN(0x07084fd8, 0xc2bff8fc), TOBN(0x8040a01a, 0xea324596), TOBN(0x4c646980, 0xd4de4036), TOBN(0x9eb8ab4e, 0xd65abfc3), TOBN(0xe01cb91f, 0x13541ec7), TOBN(0x8f029adb, 0xfd695012), TOBN(0x9ae28483, 0x3c7569ec), TOBN(0xa5614c9e, 0xa66d80a1), TOBN(0x680a3e44, 0x75f5f911), TOBN(0x0c07b14d, 0xceba4fc1), TOBN(0x891c285b, 0xa13071c1), TOBN(0xcac67ceb, 0x799ece3c), TOBN(0x29b910a9, 0x41e07e27), TOBN(0x66bdb409, 0xf2e43123), TOBN(0x06f8b137, 0x7ac9ecbe), TOBN(0x5981fafd, 0x38547090), TOBN(0x19ab8b9f, 0x85e3415d), TOBN(0xfc28c194, 0xc7e31b27), TOBN(0x843be0aa, 0x6fbcbb42), TOBN(0xf3b1ed43, 0xa6db836c), TOBN(0x2a1330e4, 0x01a45c05), TOBN(0x4f19f3c5, 0x95c1a377), TOBN(0xa85f39d0, 0x44b5ee33), TOBN(0x3da18e6d, 0x4ae52834), TOBN(0x5a403b39, 0x7423dcb0), TOBN(0xbb555e0a, 0xf2374aef), TOBN(0x2ad599c4, 0x1e8ca111), TOBN(0x1b3a2fb9, 0x014b3bf8), TOBN(0x73092684, 0xf66d5007), TOBN(0x079f1426, 0xc4340102), TOBN(0x1827cf81, 0x8fddf4de), TOBN(0xc83605f6, 0xf10ff927), TOBN(0xd3871451, 0x23739fc6), TOBN(0x6d163450, 0xcac1c2cc), TOBN(0x6b521296, 0xa2ec1ac5), TOBN(0x0606c4f9, 0x6e3cb4a5), TOBN(0xe47d3f41, 0x778abff7), TOBN(0x425a8d5e, 0xbe8e3a45), TOBN(0x53ea9e97, 0xa6102160), TOBN(0x477a106e, 0x39cbb688), TOBN(0x532401d2, 0xf3386d32), TOBN(0x8e564f64, 0xb1b9b421), TOBN(0xca9b8388, 0x81dad33f), TOBN(0xb1422b4e, 0x2093913e), TOBN(0x533d2f92, 0x69bc8112), TOBN(0x3fa017be, 0xebe7b2c7), TOBN(0xb2767c4a, 0xcaf197c6), TOBN(0xc925ff87, 0xaedbae9f), TOBN(0x7daf0eb9, 0x36880a54), TOBN(0x9284ddf5, 0x9c4d0e71), TOBN(0x1581cf93, 0x316f8cf5), TOBN(0x3eeca887, 0x3ac1f452), TOBN(0xb417fce9, 0xfb6aeffe), TOBN(0xa5918046, 0xeefb8dc3), TOBN(0x73d318ac, 0x02209400), TOBN(0xe800400f, 0x728693e5), TOBN(0xe87d814b, 0x339927ed), TOBN(0x93e94d3b, 0x57ea9910), TOBN(0xff8a35b6, 0x2245fb69), TOBN(0x043853d7, 0x7f200d34), TOBN(0x470f1e68, 0x0f653ce1), TOBN(0x81ac05bd, 0x59a06379), TOBN(0xa14052c2, 0x03930c29), TOBN(0x6b72fab5, 0x26bc2797), TOBN(0x13670d16, 0x99f16771), TOBN(0x00170052, 0x1e3e48d1), TOBN(0x978fe401, 0xb7adf678), TOBN(0x55ecfb92, 0xd41c5dd4), TOBN(0x5ff8e247, 0xc7b27da5), TOBN(0xe7518272, 0x013fb606), TOBN(0x5768d7e5, 0x2f547a3c), TOBN(0xbb24eaa3, 0x60017a5f), TOBN(0x6b18e6e4, 0x9c64ce9b), TOBN(0xc225c655, 0x103dde07), TOBN(0xfc3672ae, 0x7592f7ea), TOBN(0x9606ad77, 0xd06283a1), TOBN(0x542fc650, 0xe4d59d99), TOBN(0xabb57c49, 0x2a40e7c2), TOBN(0xac948f13, 0xa8db9f55), TOBN(0x6d4c9682, 0xb04465c3), TOBN(0xe3d062fa, 0x6468bd15), TOBN(0xa51729ac, 0x5f318d7e), TOBN(0x1fc87df6, 0x9eb6fc95), TOBN(0x63d146a8, 0x0591f652), TOBN(0xa861b8f7, 0x589621aa), TOBN(0x59f5f15a, 0xce31348c), TOBN(0x8f663391, 0x440da6da), TOBN(0xcfa778ac, 0xb591ffa3), TOBN(0x027ca9c5, 0x4cdfebce), TOBN(0xbe8e05a5, 0x444ea6b3), TOBN(0x8aab4e69, 0xa78d8254), TOBN(0x2437f04f, 0xb474d6b8), TOBN(0x6597ffd4, 0x045b3855), TOBN(0xbb0aea4e, 0xca47ecaa), TOBN(0x568aae83, 0x85c7ebfc), TOBN(0x0e966e64, 0xc73b2383), TOBN(0x49eb3447, 0xd17d8762), TOBN(0xde107821, 0x8da05dab), TOBN(0x443d8baa, 0x016b7236), TOBN(0x163b63a5, 0xea7610d6), TOBN(0xe47e4185, 0xce1ca979), TOBN(0xae648b65, 0x80baa132), TOBN(0xebf53de2, 0x0e0d5b64), TOBN(0x8d3bfcb4, 0xd3c8c1ca), TOBN(0x0d914ef3, 0x5d04b309), TOBN(0x55ef6415, 0x3de7d395), TOBN(0xbde1666f, 0x26b850e8), TOBN(0xdbe1ca6e, 0xd449ab19), TOBN(0x8902b322, 0xe89a2672), TOBN(0xb1674b7e, 0xdacb7a53), TOBN(0x8e9faf6e, 0xf52523ff), TOBN(0x6ba535da, 0x9a85788b), TOBN(0xd21f03ae, 0xbd0626d4), TOBN(0x099f8c47, 0xe873dc64), TOBN(0xcda8564d, 0x018ec97e), TOBN(0x3e8d7a5c, 0xde92c68c), TOBN(0x78e035a1, 0x73323cc4), TOBN(0x3ef26275, 0xf880ff7c), TOBN(0xa4ee3dff, 0x273eedaa), TOBN(0x58823507, 0xaf4e18f8), TOBN(0x967ec9b5, 0x0672f328), TOBN(0x9ded19d9, 0x559d3186), TOBN(0x5e2ab3de, 0x6cdce39c), TOBN(0xabad6e4d, 0x11c226df), TOBN(0xf9783f43, 0x87723014), TOBN(0x9a49a0cf, 0x1a885719), TOBN(0xfc0c1a5a, 0x90da9dbf), TOBN(0x8bbaec49, 0x571d92ac), TOBN(0x569e85fe, 0x4692517f), TOBN(0x8333b014, 0xa14ea4af), TOBN(0x32f2a62f, 0x12e5c5ad), TOBN(0x98c2ce3a, 0x06d89b85), TOBN(0xb90741aa, 0x2ff77a08), TOBN(0x2530defc, 0x01f795a2), TOBN(0xd6e5ba0b, 0x84b3c199), TOBN(0x7d8e8451, 0x12e4c936), TOBN(0xae419f7d, 0xbd0be17b), TOBN(0xa583fc8c, 0x22262bc9), TOBN(0x6b842ac7, 0x91bfe2bd), TOBN(0x33cef4e9, 0x440d6827), TOBN(0x5f69f4de, 0xef81fb14), TOBN(0xf16cf6f6, 0x234fbb92), TOBN(0x76ae3fc3, 0xd9e7e158), TOBN(0x4e89f6c2, 0xe9740b33), TOBN(0x677bc85d, 0x4962d6a1), TOBN(0x6c6d8a7f, 0x68d10d15), TOBN(0x5f9a7224, 0x0257b1cd), TOBN(0x7096b916, 0x4ad85961), TOBN(0x5f8c47f7, 0xe657ab4a), TOBN(0xde57d7d0, 0xf7461d7e), TOBN(0x7eb6094d, 0x80ce5ee2), TOBN(0x0b1e1dfd, 0x34190547), TOBN(0x8a394f43, 0xf05dd150), TOBN(0x0a9eb24d, 0x97df44e6), TOBN(0x78ca06bf, 0x87675719), TOBN(0x6f0b3462, 0x6ffeec22), TOBN(0x9d91bcea, 0x36cdd8fb), TOBN(0xac83363c, 0xa105be47), TOBN(0x81ba76c1, 0x069710e3), TOBN(0x3d1b24cb, 0x28c682c6), TOBN(0x27f25228, 0x8612575b), TOBN(0xb587c779, 0xe8e66e98), TOBN(0x7b0c03e9, 0x405eb1fe), TOBN(0xfdf0d030, 0x15b548e7), TOBN(0xa8be76e0, 0x38b36af7), TOBN(0x4cdab04a, 0x4f310c40), TOBN(0x6287223e, 0xf47ecaec), TOBN(0x678e6055, 0x8b399320), TOBN(0x61fe3fa6, 0xc01e4646), TOBN(0xc482866b, 0x03261a5e), TOBN(0xdfcf45b8, 0x5c2f244a), TOBN(0x8fab9a51, 0x2f684b43), TOBN(0xf796c654, 0xc7220a66), TOBN(0x1d90707e, 0xf5afa58f), TOBN(0x2c421d97, 0x4fdbe0de), TOBN(0xc4f4cda3, 0xaf2ebc2f), TOBN(0xa0af843d, 0xcb4efe24), TOBN(0x53b857c1, 0x9ccd10b1), TOBN(0xddc9d1eb, 0x914d3e04), TOBN(0x7bdec8bb, 0x62771deb), TOBN(0x829277aa, 0x91c5aa81), TOBN(0x7af18dd6, 0x832391ae), TOBN(0x1740f316, 0xc71a84ca)}, {TOBN(0x8928e99a, 0xeeaf8c49), TOBN(0xee7aa73d, 0x6e24d728), TOBN(0x4c5007c2, 0xe72b156c), TOBN(0x5fcf57c5, 0xed408a1d), TOBN(0x9f719e39, 0xb6057604), TOBN(0x7d343c01, 0xc2868bbf), TOBN(0x2cca254b, 0x7e103e2d), TOBN(0xe6eb38a9, 0xf131bea2), TOBN(0xb33e624f, 0x8be762b4), TOBN(0x2a9ee4d1, 0x058e3413), TOBN(0x968e6369, 0x67d805fa), TOBN(0x9848949b, 0x7db8bfd7), TOBN(0x5308d7e5, 0xd23a8417), TOBN(0x892f3b1d, 0xf3e29da5), TOBN(0xc95c139e, 0x3dee471f), TOBN(0x8631594d, 0xd757e089), TOBN(0xe0c82a3c, 0xde918dcc), TOBN(0x2e7b5994, 0x26fdcf4b), TOBN(0x82c50249, 0x32cb1b2d), TOBN(0xea613a9d, 0x7657ae07), TOBN(0xc2eb5f6c, 0xf1fdc9f7), TOBN(0xb6eae8b8, 0x879fe682), TOBN(0x253dfee0, 0x591cbc7f), TOBN(0x000da713, 0x3e1290e6), TOBN(0x1083e2ea, 0x1f095615), TOBN(0x0a28ad77, 0x14e68c33), TOBN(0x6bfc0252, 0x3d8818be), TOBN(0xb585113a, 0xf35850cd), TOBN(0x7d935f0b, 0x30df8aa1), TOBN(0xaddda07c, 0x4ab7e3ac), TOBN(0x92c34299, 0x552f00cb), TOBN(0xc33ed1de, 0x2909df6c), TOBN(0x22c2195d, 0x80e87766), TOBN(0x9e99e6d8, 0x9ddf4ac0), TOBN(0x09642e4e, 0x65e74934), TOBN(0x2610ffa2, 0xff1ff241), TOBN(0x4d1d47d4, 0x751c8159), TOBN(0x697b4985, 0xaf3a9363), TOBN(0x0318ca46, 0x87477c33), TOBN(0xa90cb565, 0x9441eff3), TOBN(0x58bb3848, 0x36f024cb), TOBN(0x85be1f77, 0x36016168), TOBN(0x6c59587c, 0xdc7e07f1), TOBN(0x191be071, 0xaf1d8f02), TOBN(0xbf169fa5, 0xcca5e55c), TOBN(0x3864ba3c, 0xf7d04eac), TOBN(0x915e367f, 0x8d7d05db), TOBN(0xb48a876d, 0xa6549e5d), TOBN(0xef89c656, 0x580e40a2), TOBN(0xf194ed8c, 0x728068bc), TOBN(0x74528045, 0xa47990c9), TOBN(0xf53fc7d7, 0x5e1a4649), TOBN(0xbec5ae9b, 0x78593e7d), TOBN(0x2cac4ee3, 0x41db65d7), TOBN(0xa8c1eb24, 0x04a3d39b), TOBN(0x53b7d634, 0x03f8f3ef), TOBN(0x2dc40d48, 0x3e07113c), TOBN(0x6e4a5d39, 0x7d8b63ae), TOBN(0x5582a94b, 0x79684c2b), TOBN(0x932b33d4, 0x622da26c), TOBN(0xf534f651, 0x0dbbf08d), TOBN(0x211d07c9, 0x64c23a52), TOBN(0x0eeece0f, 0xee5bdc9b), TOBN(0xdf178168, 0xf7015558), TOBN(0xd4294635, 0x0a712229), TOBN(0x93cbe448, 0x09273f8c), TOBN(0x00b095ef, 0x8f13bc83), TOBN(0xbb741972, 0x8798978c), TOBN(0x9d7309a2, 0x56dbe6e7), TOBN(0xe578ec56, 0x5a5d39ec), TOBN(0x3961151b, 0x851f9a31), TOBN(0x2da7715d, 0xe5709eb4), TOBN(0x867f3017, 0x53dfabf0), TOBN(0x728d2078, 0xb8e39259), TOBN(0x5c75a0cd, 0x815d9958), TOBN(0xf84867a6, 0x16603be1), TOBN(0xc865b13d, 0x70e35b1c), TOBN(0x02414468, 0x19b03e2c), TOBN(0xe46041da, 0xac1f3121), TOBN(0x7c9017ad, 0x6f028a7c), TOBN(0xabc96de9, 0x0a482873), TOBN(0x4265d6b1, 0xb77e54d4), TOBN(0x68c38e79, 0xa57d88e7), TOBN(0xd461d766, 0x9ce82de3), TOBN(0x817a9ec5, 0x64a7e489), TOBN(0xcc5675cd, 0xa0def5f2), TOBN(0x9a00e785, 0x985d494e), TOBN(0xc626833f, 0x1b03514a), TOBN(0xabe7905a, 0x83cdd60e), TOBN(0x50602fb5, 0xa1170184), TOBN(0x689886cd, 0xb023642a), TOBN(0xd568d090, 0xa6e1fb00), TOBN(0x5b1922c7, 0x0259217f), TOBN(0x93831cd9, 0xc43141e4), TOBN(0xdfca3587, 0x0c95f86e), TOBN(0xdec2057a, 0x568ae828), TOBN(0xc44ea599, 0xf98a759a), TOBN(0x55a0a7a2, 0xf7c23c1d), TOBN(0xd5ffb6e6, 0x94c4f687), TOBN(0x3563cce2, 0x12848478), TOBN(0x812b3517, 0xe7b1fbe1), TOBN(0x8a7dc979, 0x4f7338e0), TOBN(0x211ecee9, 0x52d048db), TOBN(0x2eea4056, 0xc86ea3b8), TOBN(0xd8cb68a7, 0xba772b34), TOBN(0xe16ed341, 0x5f4e2541), TOBN(0x9b32f6a6, 0x0fec14db), TOBN(0xeee376f7, 0x391698be), TOBN(0xe9a7aa17, 0x83674c02), TOBN(0x65832f97, 0x5843022a), TOBN(0x29f3a8da, 0x5ba4990f), TOBN(0x79a59c3a, 0xfb8e3216), TOBN(0x9cdc4d2e, 0xbd19bb16), TOBN(0xc6c7cfd0, 0xb3262d86), TOBN(0xd4ce14d0, 0x969c0b47), TOBN(0x1fa352b7, 0x13e56128), TOBN(0x383d55b8, 0x973db6d3), TOBN(0x71836850, 0xe8e5b7bf), TOBN(0xc7714596, 0xe6bb571f), TOBN(0x259df31f, 0x2d5b2dd2), TOBN(0x568f8925, 0x913cc16d), TOBN(0x18bc5b6d, 0xe1a26f5a), TOBN(0xdfa413be, 0xf5f499ae), TOBN(0xf8835dec, 0xc3f0ae84), TOBN(0xb6e60bd8, 0x65a40ab0), TOBN(0x65596439, 0x194b377e), TOBN(0xbcd85625, 0x92084a69), TOBN(0x5ce433b9, 0x4f23ede0), TOBN(0xe8e8f04f, 0x6ad65143), TOBN(0x11511827, 0xd6e14af6), TOBN(0x3d390a10, 0x8295c0c7), TOBN(0x71e29ee4, 0x621eba16), TOBN(0xa588fc09, 0x63717b46), TOBN(0x02be02fe, 0xe06ad4a2), TOBN(0x931558c6, 0x04c22b22), TOBN(0xbb4d4bd6, 0x12f3c849), TOBN(0x54a4f496, 0x20efd662), TOBN(0x92ba6d20, 0xc5952d14), TOBN(0x2db8ea1e, 0xcc9784c2), TOBN(0x81cc10ca, 0x4b353644), TOBN(0x40b570ad, 0x4b4d7f6c), TOBN(0x5c9f1d96, 0x84a1dcd2), TOBN(0x01379f81, 0x3147e797), TOBN(0xe5c6097b, 0x2bd499f5), TOBN(0x40dcafa6, 0x328e5e20), TOBN(0xf7b5244a, 0x54815550), TOBN(0xb9a4f118, 0x47bfc978), TOBN(0x0ea0e79f, 0xd25825b1), TOBN(0xa50f96eb, 0x646c7ecf), TOBN(0xeb811493, 0x446dea9d), TOBN(0x2af04677, 0xdfabcf69), TOBN(0xbe3a068f, 0xc713f6e8), TOBN(0x860d523d, 0x42e06189), TOBN(0xbf077941, 0x4e3aff13), TOBN(0x0b616dca, 0xc1b20650), TOBN(0xe66dd6d1, 0x2131300d), TOBN(0xd4a0fd67, 0xff99abde), TOBN(0xc9903550, 0xc7aac50d), TOBN(0x022ecf8b, 0x7c46b2d7), TOBN(0x3333b1e8, 0x3abf92af), TOBN(0x11cc113c, 0x6c491c14), TOBN(0x05976688, 0x80dd3f88), TOBN(0xf5b4d9e7, 0x29d932ed), TOBN(0xe982aad8, 0xa2c38b6d), TOBN(0x6f925347, 0x8be0dcf0), TOBN(0x700080ae, 0x65ca53f2), TOBN(0xd8131156, 0x443ca77f), TOBN(0xe92d6942, 0xec51f984), TOBN(0xd2a08af8, 0x85dfe9ae), TOBN(0xd825d9a5, 0x4d2a86ca), TOBN(0x2c53988d, 0x39dff020), TOBN(0xf38b135a, 0x430cdc40), TOBN(0x0c918ae0, 0x62a7150b), TOBN(0xf31fd8de, 0x0c340e9b), TOBN(0xafa0e7ae, 0x4dbbf02e), TOBN(0x5847fb2a, 0x5eba6239), TOBN(0x6b1647dc, 0xdccbac8b), TOBN(0xb642aa78, 0x06f485c8), TOBN(0x873f3765, 0x7038ecdf), TOBN(0x2ce5e865, 0xfa49d3fe), TOBN(0xea223788, 0xc98c4400), TOBN(0x8104a8cd, 0xf1fa5279), TOBN(0xbcf7cc7a, 0x06becfd7), TOBN(0x49424316, 0xc8f974ae), TOBN(0xc0da65e7, 0x84d6365d), TOBN(0xbcb7443f, 0x8f759fb8), TOBN(0x35c712b1, 0x7ae81930), TOBN(0x80428dff, 0x4c6e08ab), TOBN(0xf19dafef, 0xa4faf843), TOBN(0xced8538d, 0xffa9855f), TOBN(0x20ac409c, 0xbe3ac7ce), TOBN(0x358c1fb6, 0x882da71e), TOBN(0xafa9c0e5, 0xfd349961), TOBN(0x2b2cfa51, 0x8421c2fc), TOBN(0x2a80db17, 0xf3a28d38), TOBN(0xa8aba539, 0x5d138e7e), TOBN(0x52012d1d, 0x6e96eb8d), TOBN(0x65d8dea0, 0xcbaf9622), TOBN(0x57735447, 0xb264f56c), TOBN(0xbeebef3f, 0x1b6c8da2), TOBN(0xfc346d98, 0xce785254), TOBN(0xd50e8d72, 0xbb64a161), TOBN(0xc03567c7, 0x49794add), TOBN(0x15a76065, 0x752c7ef6), TOBN(0x59f3a222, 0x961f23d6), TOBN(0x378e4438, 0x73ecc0b0), TOBN(0xc74be434, 0x5a82fde4), TOBN(0xae509af2, 0xd8b9cf34), TOBN(0x4a61ee46, 0x577f44a1), TOBN(0xe09b748c, 0xb611deeb), TOBN(0xc0481b2c, 0xf5f7b884), TOBN(0x35626678, 0x61acfa6b), TOBN(0x37f4c518, 0xbf8d21e6), TOBN(0x22d96531, 0xb205a76d), TOBN(0x37fb85e1, 0x954073c0), TOBN(0xbceafe4f, 0x65b3a567), TOBN(0xefecdef7, 0xbe42a582), TOBN(0xd3fc6080, 0x65046be6), TOBN(0xc9af13c8, 0x09e8dba9), TOBN(0x1e6c9847, 0x641491ff), TOBN(0x3b574925, 0xd30c31f7), TOBN(0xb7eb72ba, 0xac2a2122), TOBN(0x776a0dac, 0xef0859e7), TOBN(0x06fec314, 0x21900942), TOBN(0x2464bc10, 0xf8c22049), TOBN(0x9bfbcce7, 0x875ebf69), TOBN(0xd7a88e2a, 0x4336326b), TOBN(0xda05261c, 0x5bc2acfa), TOBN(0xc29f5bdc, 0xeba7efc8), TOBN(0x471237ca, 0x25dbbf2e), TOBN(0xa72773f2, 0x2975f127), TOBN(0xdc744e8e, 0x04d0b326), TOBN(0x38a7ed16, 0xa56edb73), TOBN(0x64357e37, 0x2c007e70), TOBN(0xa167d15b, 0x5080b400), TOBN(0x07b41164, 0x23de4be1), TOBN(0xb2d91e32, 0x74c89883), TOBN(0x3c162821, 0x2882e7ed), TOBN(0xad6b36ba, 0x7503e482), TOBN(0x48434e8e, 0x0ea34331), TOBN(0x79f4f24f, 0x2c7ae0b9), TOBN(0xc46fbf81, 0x1939b44a), TOBN(0x76fefae8, 0x56595eb1), TOBN(0x417b66ab, 0xcd5f29c7), TOBN(0x5f2332b2, 0xc5ceec20), TOBN(0xd69661ff, 0xe1a1cae2), TOBN(0x5ede7e52, 0x9b0286e6), TOBN(0x9d062529, 0xe276b993), TOBN(0x324794b0, 0x7e50122b), TOBN(0xdd744f8b, 0x4af07ca5), TOBN(0x30a12f08, 0xd63fc97b), TOBN(0x39650f1a, 0x76626d9d), TOBN(0x101b47f7, 0x1fa38477), TOBN(0x3d815f19, 0xd4dc124f), TOBN(0x1569ae95, 0xb26eb58a), TOBN(0xc3cde188, 0x95fb1887), TOBN(0x54e9f37b, 0xf9539a48), TOBN(0xb0100e06, 0x7408c1a5), TOBN(0x821d9811, 0xea580cbb), TOBN(0x8af52d35, 0x86e50c56), TOBN(0xdfbd9d47, 0xdbbf698b), TOBN(0x2961a1ea, 0x03dc1c73), TOBN(0x203d38f8, 0xe76a5df8), TOBN(0x08a53a68, 0x6def707a), TOBN(0x26eefb48, 0x1bee45d4), TOBN(0xb3cee346, 0x3c688036), TOBN(0x463c5315, 0xc42f2469), TOBN(0x19d84d2e, 0x81378162), TOBN(0x22d7c3c5, 0x1c4d349f), TOBN(0x65965844, 0x163d59c5), TOBN(0xcf198c56, 0xb8abceae), TOBN(0x6fb1fb1b, 0x628559d5), TOBN(0x8bbffd06, 0x07bf8fe3), TOBN(0x46259c58, 0x3467734b), TOBN(0xd8953cea, 0x35f7f0d3), TOBN(0x1f0bece2, 0xd65b0ff1), TOBN(0xf7d5b4b3, 0xf3c72914), TOBN(0x29e8ea95, 0x3cb53389), TOBN(0x4a365626, 0x836b6d46), TOBN(0xe849f910, 0xea174fde), TOBN(0x7ec62fbb, 0xf4737f21), TOBN(0xd8dba5ab, 0x6209f5ac), TOBN(0x24b5d7a9, 0xa5f9adbe), TOBN(0x707d28f7, 0xa61dc768), TOBN(0x7711460b, 0xcaa999ea), TOBN(0xba7b174d, 0x1c92e4cc), TOBN(0x3c4bab66, 0x18d4bf2d), TOBN(0xb8f0c980, 0xeb8bd279), TOBN(0x024bea9a, 0x324b4737), TOBN(0xfba9e423, 0x32a83bca), TOBN(0x6e635643, 0xa232dced), TOBN(0x99619367, 0x2571c8ba), TOBN(0xe8c9f357, 0x54b7032b), TOBN(0xf936b3ba, 0x2442d54a), TOBN(0x2263f0f0, 0x8290c65a), TOBN(0x48989780, 0xee2c7fdb), TOBN(0xadc5d55a, 0x13d4f95e), TOBN(0x737cff85, 0xad9b8500), TOBN(0x271c557b, 0x8a73f43d), TOBN(0xbed617a4, 0xe18bc476), TOBN(0x66245401, 0x7dfd8ab2), TOBN(0xae7b89ae, 0x3a2870aa), TOBN(0x1b555f53, 0x23a7e545), TOBN(0x6791e247, 0xbe057e4c), TOBN(0x860136ad, 0x324fa34d), TOBN(0xea111447, 0x4cbeae28), TOBN(0x023a4270, 0xbedd3299), TOBN(0x3d5c3a7f, 0xc1c35c34), TOBN(0xb0f6db67, 0x8d0412d2), TOBN(0xd92625e2, 0xfcdc6b9a), TOBN(0x92ae5ccc, 0x4e28a982), TOBN(0xea251c36, 0x47a3ce7e), TOBN(0x9d658932, 0x790691bf), TOBN(0xed610589, 0x06b736ae), TOBN(0x712c2f04, 0xc0d63b6e), TOBN(0x5cf06fd5, 0xc63d488f), TOBN(0x97363fac, 0xd9588e41), TOBN(0x1f9bf762, 0x2b93257e), TOBN(0xa9d1ffc4, 0x667acace), TOBN(0x1cf4a1aa, 0x0a061ecf), TOBN(0x40e48a49, 0xdc1818d0), TOBN(0x0643ff39, 0xa3621ab0), TOBN(0x5768640c, 0xe39ef639), TOBN(0x1fc099ea, 0x04d86854), TOBN(0x9130b9c3, 0xeccd28fd), TOBN(0xd743cbd2, 0x7eec54ab), TOBN(0x052b146f, 0xe5b475b6), TOBN(0x058d9a82, 0x900a7d1f), TOBN(0x65e02292, 0x91262b72), TOBN(0x96f924f9, 0xbb0edf03), TOBN(0x5cfa59c8, 0xfe206842), TOBN(0xf6037004, 0x5eafa720), TOBN(0x5f30699e, 0x18d7dd96), TOBN(0x381e8782, 0xcbab2495), TOBN(0x91669b46, 0xdd8be949), TOBN(0xb40606f5, 0x26aae8ef), TOBN(0x2812b839, 0xfc6751a4), TOBN(0x16196214, 0xfba800ef), TOBN(0x4398d5ca, 0x4c1a2875), TOBN(0x720c00ee, 0x653d8349), TOBN(0xc2699eb0, 0xd820007c), TOBN(0x880ee660, 0xa39b5825), TOBN(0x70694694, 0x471f6984), TOBN(0xf7d16ea8, 0xe3dda99a), TOBN(0x28d675b2, 0xc0519a23), TOBN(0x9ebf94fe, 0x4f6952e3), TOBN(0xf28bb767, 0xa2294a8a), TOBN(0x85512b4d, 0xfe0af3f5), TOBN(0x18958ba8, 0x99b16a0d), TOBN(0x95c2430c, 0xba7548a7), TOBN(0xb30d1b10, 0xa16be615), TOBN(0xe3ebbb97, 0x85bfb74c), TOBN(0xa3273cfe, 0x18549fdb), TOBN(0xf6e200bf, 0x4fcdb792), TOBN(0x54a76e18, 0x83aba56c), TOBN(0x73ec66f6, 0x89ef6aa2), TOBN(0x8d17add7, 0xd1b9a305), TOBN(0xa959c5b9, 0xb7ae1b9d), TOBN(0x88643522, 0x6bcc094a), TOBN(0xcc5616c4, 0xd7d429b9), TOBN(0xa6dada01, 0xe6a33f7c), TOBN(0xc6217a07, 0x9d4e70ad), TOBN(0xd619a818, 0x09c15b7c), TOBN(0xea06b329, 0x0e80c854), TOBN(0x174811ce, 0xa5f5e7b9), TOBN(0x66dfc310, 0x787c65f4), TOBN(0x4ea7bd69, 0x3316ab54), TOBN(0xc12c4acb, 0x1dcc0f70), TOBN(0xe4308d1a, 0x1e407dd9), TOBN(0xe8a3587c, 0x91afa997), TOBN(0xea296c12, 0xab77b7a5), TOBN(0xb5ad49e4, 0x673c0d52), TOBN(0x40f9b2b2, 0x7006085a), TOBN(0xa88ff340, 0x87bf6ec2), TOBN(0x978603b1, 0x4e3066a6), TOBN(0xb3f99fc2, 0xb5e486e2), TOBN(0x07b53f5e, 0xb2e63645), TOBN(0xbe57e547, 0x84c84232), TOBN(0xd779c216, 0x7214d5cf), TOBN(0x617969cd, 0x029a3aca), TOBN(0xd17668cd, 0x8a7017a0), TOBN(0x77b4d19a, 0xbe9b7ee8), TOBN(0x58fd0e93, 0x9c161776), TOBN(0xa8c4f4ef, 0xd5968a72), TOBN(0x296071cc, 0x67b3de77), TOBN(0xae3c0b8e, 0x634f7905), TOBN(0x67e440c2, 0x8a7100c9), TOBN(0xbb8c3c1b, 0xeb4b9b42), TOBN(0x6d71e8ea, 0xc51b3583), TOBN(0x7591f5af, 0x9525e642), TOBN(0xf73a2f7b, 0x13f509f3), TOBN(0x618487aa, 0x5619ac9b), TOBN(0x3a72e5f7, 0x9d61718a), TOBN(0x00413bcc, 0x7592d28c), TOBN(0x7d9b11d3, 0x963c35cf), TOBN(0x77623bcf, 0xb90a46ed), TOBN(0xdeef273b, 0xdcdd2a50), TOBN(0x4a741f9b, 0x0601846e), TOBN(0x33b89e51, 0x0ec6e929), TOBN(0xcb02319f, 0x8b7f22cd), TOBN(0xbbe1500d, 0x084bae24), TOBN(0x2f0ae8d7, 0x343d2693), TOBN(0xacffb5f2, 0x7cdef811), TOBN(0xaa0c030a, 0x263fb94f), TOBN(0x6eef0d61, 0xa0f442de), TOBN(0xf92e1817, 0x27b139d3), TOBN(0x1ae6deb7, 0x0ad8bc28), TOBN(0xa89e38dc, 0xc0514130), TOBN(0x81eeb865, 0xd2fdca23), TOBN(0x5a15ee08, 0xcc8ef895), TOBN(0x768fa10a, 0x01905614), TOBN(0xeff5b8ef, 0x880ee19b), TOBN(0xf0c0cabb, 0xcb1c8a0e), TOBN(0x2e1ee9cd, 0xb8c838f9), TOBN(0x0587d8b8, 0x8a4a14c0), TOBN(0xf6f27896, 0x2ff698e5), TOBN(0xed38ef1c, 0x89ee6256), TOBN(0xf44ee1fe, 0x6b353b45), TOBN(0x9115c0c7, 0x70e903b3), TOBN(0xc78ec0a1, 0x818f31df), TOBN(0x6c003324, 0xb7dccbc6), TOBN(0xd96dd1f3, 0x163bbc25), TOBN(0x33aa82dd, 0x5cedd805), TOBN(0x123aae4f, 0x7f7eb2f1), TOBN(0x1723fcf5, 0xa26262cd), TOBN(0x1f7f4d5d, 0x0060ebd5), TOBN(0xf19c5c01, 0xb2eaa3af), TOBN(0x2ccb9b14, 0x9790accf), TOBN(0x1f9c1cad, 0x52324aa6), TOBN(0x63200526, 0x7247df54), TOBN(0x5732fe42, 0xbac96f82), TOBN(0x52fe771f, 0x01a1c384), TOBN(0x546ca13d, 0xb1001684), TOBN(0xb56b4eee, 0xa1709f75), TOBN(0x266545a9, 0xd5db8672), TOBN(0xed971c90, 0x1e8f3cfb), TOBN(0x4e7d8691, 0xe3a07b29), TOBN(0x7570d9ec, 0xe4b696b9), TOBN(0xdc5fa067, 0x7bc7e9ae), TOBN(0x68b44caf, 0xc82c4844), TOBN(0x519d34b3, 0xbf44da80), TOBN(0x283834f9, 0x5ab32e66), TOBN(0x6e608797, 0x6278a000), TOBN(0x1e62960e, 0x627312f6), TOBN(0x9b87b27b, 0xe6901c55), TOBN(0x80e78538, 0x24fdbc1f), TOBN(0xbbbc0951, 0x2facc27d), TOBN(0x06394239, 0xac143b5a), TOBN(0x35bb4a40, 0x376c1944), TOBN(0x7cb62694, 0x63da1511), TOBN(0xafd29161, 0xb7148a3b), TOBN(0xa6f9d9ed, 0x4e2ea2ee), TOBN(0x15dc2ca2, 0x880dd212), TOBN(0x903c3813, 0xa61139a9), TOBN(0x2aa7b46d, 0x6c0f8785), TOBN(0x36ce2871, 0x901c60ff), TOBN(0xc683b028, 0xe10d9c12), TOBN(0x7573baa2, 0x032f33d3), TOBN(0x87a9b1f6, 0x67a31b58), TOBN(0xfd3ed11a, 0xf4ffae12), TOBN(0x83dcaa9a, 0x0cb2748e), TOBN(0x8239f018, 0x5d6fdf16), TOBN(0xba67b49c, 0x72753941), TOBN(0x2beec455, 0xc321cb36), TOBN(0x88015606, 0x3f8b84ce), TOBN(0x76417083, 0x8d38c86f), TOBN(0x054f1ca7, 0x598953dd), TOBN(0xc939e110, 0x4e8e7429), TOBN(0x9b1ac2b3, 0x5a914f2f), TOBN(0x39e35ed3, 0xe74b8f9c), TOBN(0xd0debdb2, 0x781b2fb0), TOBN(0x1585638f, 0x2d997ba2), TOBN(0x9c4b646e, 0x9e2fce99), TOBN(0x68a21081, 0x1e80857f), TOBN(0x06d54e44, 0x3643b52a), TOBN(0xde8d6d63, 0x0d8eb843), TOBN(0x70321563, 0x42146a0a), TOBN(0x8ba826f2, 0x5eaa3622), TOBN(0x227a58bd, 0x86138787), TOBN(0x43b6c03c, 0x10281d37), TOBN(0x6326afbb, 0xb54dde39), TOBN(0x744e5e8a, 0xdb6f2d5f), TOBN(0x48b2a99a, 0xcff158e1), TOBN(0xa93c8fa0, 0xef87918f), TOBN(0x2182f956, 0xde058c5c), TOBN(0x216235d2, 0x936f9e7a), TOBN(0xace0c0db, 0xd2e31e67), TOBN(0xc96449bf, 0xf23ac3e7), TOBN(0x7e9a2874, 0x170693bd), TOBN(0xa28e14fd, 0xa45e6335), TOBN(0x5757f6b3, 0x56427344), TOBN(0x822e4556, 0xacf8edf9), TOBN(0x2b7a6ee2, 0xe6a285cd), TOBN(0x5866f211, 0xa9df3af0), TOBN(0x40dde2dd, 0xf845b844), TOBN(0x986c3726, 0x110e5e49), TOBN(0x73680c2a, 0xf7172277), TOBN(0x57b94f0f, 0x0cccb244), TOBN(0xbdff7267, 0x2d438ca7), TOBN(0xbad1ce11, 0xcf4663fd), TOBN(0x9813ed9d, 0xd8f71cae), TOBN(0xf43272a6, 0x961fdaa6), TOBN(0xbeff0119, 0xbd6d1637), TOBN(0xfebc4f91, 0x30361978), TOBN(0x02b37a95, 0x2f41deff), TOBN(0x0e44a59a, 0xe63b89b7), TOBN(0x673257dc, 0x143ff951), TOBN(0x19c02205, 0xd752baf4), TOBN(0x46c23069, 0xc4b7d692), TOBN(0x2e6392c3, 0xfd1502ac), TOBN(0x6057b1a2, 0x1b220846), TOBN(0xe51ff946, 0x0c1b5b63)}, {TOBN(0x6e85cb51, 0x566c5c43), TOBN(0xcff9c919, 0x3597f046), TOBN(0x9354e90c, 0x4994d94a), TOBN(0xe0a39332, 0x2147927d), TOBN(0x8427fac1, 0x0dc1eb2b), TOBN(0x88cfd8c2, 0x2ff319fa), TOBN(0xe2d4e684, 0x01965274), TOBN(0xfa2e067d, 0x67aaa746), TOBN(0xb6d92a7f, 0x3e5f9f11), TOBN(0x9afe153a, 0xd6cb3b8e), TOBN(0x4d1a6dd7, 0xddf800bd), TOBN(0xf6c13cc0, 0xcaf17e19), TOBN(0x15f6c58e, 0x325fc3ee), TOBN(0x71095400, 0xa31dc3b2), TOBN(0x168e7c07, 0xafa3d3e7), TOBN(0x3f8417a1, 0x94c7ae2d), TOBN(0xec234772, 0x813b230d), TOBN(0x634d0f5f, 0x17344427), TOBN(0x11548ab1, 0xd77fc56a), TOBN(0x7fab1750, 0xce06af77), TOBN(0xb62c10a7, 0x4f7c4f83), TOBN(0xa7d2edc4, 0x220a67d9), TOBN(0x1c404170, 0x921209a0), TOBN(0x0b9815a0, 0xface59f0), TOBN(0x2842589b, 0x319540c3), TOBN(0x18490f59, 0xa283d6f8), TOBN(0xa2731f84, 0xdaae9fcb), TOBN(0x3db6d960, 0xc3683ba0), TOBN(0xc85c63bb, 0x14611069), TOBN(0xb19436af, 0x0788bf05), TOBN(0x905459df, 0x347460d2), TOBN(0x73f6e094, 0xe11a7db1), TOBN(0xdc7f938e, 0xb6357f37), TOBN(0xc5d00f79, 0x2bd8aa62), TOBN(0xc878dcb9, 0x2ca979fc), TOBN(0x37e83ed9, 0xeb023a99), TOBN(0x6b23e273, 0x1560bf3d), TOBN(0x1086e459, 0x1d0fae61), TOBN(0x78248316, 0x9a9414bd), TOBN(0x1b956bc0, 0xf0ea9ea1), TOBN(0x7b85bb91, 0xc31b9c38), TOBN(0x0c5aa90b, 0x48ef57b5), TOBN(0xdedeb169, 0xaf3bab6f), TOBN(0xe610ad73, 0x2d373685), TOBN(0xf13870df, 0x02ba8e15), TOBN(0x0337edb6, 0x8ca7f771), TOBN(0xe4acf747, 0xb62c036c), TOBN(0xd921d576, 0xb6b94e81), TOBN(0xdbc86439, 0x2c422f7a), TOBN(0xfb635362, 0xed348898), TOBN(0x83084668, 0xc45bfcd1), TOBN(0xc357c9e3, 0x2b315e11), TOBN(0xb173b540, 0x5b2e5b8c), TOBN(0x7e946931, 0xe102b9a4), TOBN(0x17c890eb, 0x7b0fb199), TOBN(0xec225a83, 0xd61b662b), TOBN(0xf306a3c8, 0xee3c76cb), TOBN(0x3cf11623, 0xd32a1f6e), TOBN(0xe6d5ab64, 0x6863e956), TOBN(0x3b8a4cbe, 0x5c005c26), TOBN(0xdcd529a5, 0x9ce6bb27), TOBN(0xc4afaa52, 0x04d4b16f), TOBN(0xb0624a26, 0x7923798d), TOBN(0x85e56df6, 0x6b307fab), TOBN(0x0281893c, 0x2bf29698), TOBN(0x91fc19a4, 0xd7ce7603), TOBN(0x75a5dca3, 0xad9a558f), TOBN(0x40ceb3fa, 0x4d50bf77), TOBN(0x1baf6060, 0xbc9ba369), TOBN(0x927e1037, 0x597888c2), TOBN(0xd936bf19, 0x86a34c07), TOBN(0xd4cf10c1, 0xc34ae980), TOBN(0x3a3e5334, 0x859dd614), TOBN(0x9c475b5b, 0x18d0c8ee), TOBN(0x63080d1f, 0x07cd51d5), TOBN(0xc9c0d0a6, 0xb88b4326), TOBN(0x1ac98691, 0xc234296f), TOBN(0x2a0a83a4, 0x94887fb6), TOBN(0x56511427, 0x0cea9cf2), TOBN(0x5230a6e8, 0xa24802f5), TOBN(0xf7a2bf0f, 0x72e3d5c1), TOBN(0x37717446, 0x4f21439e), TOBN(0xfedcbf25, 0x9ce30334), TOBN(0xe0030a78, 0x7ce202f9), TOBN(0x6f2d9ebf, 0x1202e9ca), TOBN(0xe79dde6c, 0x75e6e591), TOBN(0xf52072af, 0xf1dac4f8), TOBN(0x6c8d087e, 0xbb9b404d), TOBN(0xad0fc73d, 0xbce913af), TOBN(0x909e587b, 0x458a07cb), TOBN(0x1300da84, 0xd4f00c8a), TOBN(0x425cd048, 0xb54466ac), TOBN(0xb59cb9be, 0x90e9d8bf), TOBN(0x991616db, 0x3e431b0e), TOBN(0xd3aa117a, 0x531aecff), TOBN(0x91af92d3, 0x59f4dc3b), TOBN(0x9b1ec292, 0xe93fda29), TOBN(0x76bb6c17, 0xe97d91bc), TOBN(0x7509d95f, 0xaface1e6), TOBN(0x3653fe47, 0xbe855ae3), TOBN(0x73180b28, 0x0f680e75), TOBN(0x75eefd1b, 0xeeb6c26c), TOBN(0xa4cdf29f, 0xb66d4236), TOBN(0x2d70a997, 0x6b5821d8), TOBN(0x7a3ee207, 0x20445c36), TOBN(0x71d1ac82, 0x59877174), TOBN(0x0fc539f7, 0x949f73e9), TOBN(0xd05cf3d7, 0x982e3081), TOBN(0x8758e20b, 0x7b1c7129), TOBN(0xffadcc20, 0x569e61f2), TOBN(0xb05d3a2f, 0x59544c2d), TOBN(0xbe16f5c1, 0x9fff5e53), TOBN(0x73cf65b8, 0xaad58135), TOBN(0x622c2119, 0x037aa5be), TOBN(0x79373b3f, 0x646fd6a0), TOBN(0x0e029db5, 0x0d3978cf), TOBN(0x8bdfc437, 0x94fba037), TOBN(0xaefbd687, 0x620797a6), TOBN(0x3fa5382b, 0xbd30d38e), TOBN(0x7627cfbf, 0x585d7464), TOBN(0xb2330fef, 0x4e4ca463), TOBN(0xbcef7287, 0x3566cc63), TOBN(0xd161d2ca, 0xcf780900), TOBN(0x135dc539, 0x5b54827d), TOBN(0x638f052e, 0x27bf1bc6), TOBN(0x10a224f0, 0x07dfa06c), TOBN(0xe973586d, 0x6d3321da), TOBN(0x8b0c5738, 0x26152c8f), TOBN(0x07ef4f2a, 0x34606074), TOBN(0x80fe7fe8, 0xa0f7047a), TOBN(0x3d1a8152, 0xe1a0e306), TOBN(0x32cf43d8, 0x88da5222), TOBN(0xbf89a95f, 0x5f02ffe6), TOBN(0x3d9eb9a4, 0x806ad3ea), TOBN(0x012c17bb, 0x79c8e55e), TOBN(0xfdcd1a74, 0x99c81dac), TOBN(0x7043178b, 0xb9556098), TOBN(0x4090a1df, 0x801c3886), TOBN(0x759800ff, 0x9b67b912), TOBN(0x3e5c0304, 0x232620c8), TOBN(0x4b9d3c4b, 0x70dceeca), TOBN(0xbb2d3c15, 0x181f648e), TOBN(0xf981d837, 0x6e33345c), TOBN(0xb626289b, 0x0cf2297a), TOBN(0x766ac659, 0x8baebdcf), TOBN(0x1a28ae09, 0x75df01e5), TOBN(0xb71283da, 0x375876d8), TOBN(0x4865a96d, 0x607b9800), TOBN(0x25dd1bcd, 0x237936b2), TOBN(0x332f4f4b, 0x60417494), TOBN(0xd0923d68, 0x370a2147), TOBN(0x497f5dfb, 0xdc842203), TOBN(0x9dc74cbd, 0x32be5e0f), TOBN(0x7475bcb7, 0x17a01375), TOBN(0x438477c9, 0x50d872b1), TOBN(0xcec67879, 0xffe1d63d), TOBN(0x9b006014, 0xd8578c70), TOBN(0xc9ad99a8, 0x78bb6b8b), TOBN(0x6799008e, 0x11fb3806), TOBN(0xcfe81435, 0xcd44cab3), TOBN(0xa2ee1582, 0x2f4fb344), TOBN(0xb8823450, 0x483fa6eb), TOBN(0x622d323d, 0x652c7749), TOBN(0xd8474a98, 0xbeb0a15b), TOBN(0xe43c154d, 0x5d1c00d0), TOBN(0x7fd581d9, 0x0e3e7aac), TOBN(0x2b44c619, 0x2525ddf8), TOBN(0x67a033eb, 0xb8ae9739), TOBN(0x113ffec1, 0x9ef2d2e4), TOBN(0x1bf6767e, 0xd5a0ea7f), TOBN(0x57fff75e, 0x03714c0a), TOBN(0xa23c422e, 0x0a23e9ee), TOBN(0xdd5f6b2d, 0x540f83af), TOBN(0xc2c2c27e, 0x55ea46a7), TOBN(0xeb6b4246, 0x672a1208), TOBN(0xd13599f7, 0xae634f7a), TOBN(0xcf914b5c, 0xd7b32c6e), TOBN(0x61a5a640, 0xeaf61814), TOBN(0x8dc3df8b, 0x208a1bbb), TOBN(0xef627fd6, 0xb6d79aa5), TOBN(0x44232ffc, 0xc4c86bc8), TOBN(0xe6f9231b, 0x061539fe), TOBN(0x1d04f25a, 0x958b9533), TOBN(0x180cf934, 0x49e8c885), TOBN(0x89689595, 0x9884aaf7), TOBN(0xb1959be3, 0x07b348a6), TOBN(0x96250e57, 0x3c147c87), TOBN(0xae0efb3a, 0xdd0c61f8), TOBN(0xed00745e, 0xca8c325e), TOBN(0x3c911696, 0xecff3f70), TOBN(0x73acbc65, 0x319ad41d), TOBN(0x7b01a020, 0xf0b1c7ef), TOBN(0xea32b293, 0x63a1483f), TOBN(0x89eabe71, 0x7a248f96), TOBN(0x9c6231d3, 0x343157e5), TOBN(0x93a375e5, 0xdf3c546d), TOBN(0xe76e9343, 0x6a2afe69), TOBN(0xc4f89100, 0xe166c88e), TOBN(0x248efd0d, 0x4f872093), TOBN(0xae0eb3ea, 0x8fe0ea61), TOBN(0xaf89790d, 0x9d79046e), TOBN(0x4d650f2d, 0x6cee0976), TOBN(0xa3935d9a, 0x43071eca), TOBN(0x66fcd2c9, 0x283b0bfe), TOBN(0x0e665eb5, 0x696605f1), TOBN(0xe77e5d07, 0xa54cd38d), TOBN(0x90ee050a, 0x43d950cf), TOBN(0x86ddebda, 0xd32e69b5), TOBN(0x6ad94a3d, 0xfddf7415), TOBN(0xf7fa1309, 0x3f6e8d5a), TOBN(0xc4831d1d, 0xe9957f75), TOBN(0x7de28501, 0xd5817447), TOBN(0x6f1d7078, 0x9e2aeb6b), TOBN(0xba2b9ff4, 0xf67a53c2), TOBN(0x36963767, 0xdf9defc3), TOBN(0x479deed3, 0x0d38022c), TOBN(0xd2edb89b, 0x3a8631e8), TOBN(0x8de855de, 0x7a213746), TOBN(0xb2056cb7, 0xb00c5f11), TOBN(0xdeaefbd0, 0x2c9b85e4), TOBN(0x03f39a8d, 0xd150892d), TOBN(0x37b84686, 0x218b7985), TOBN(0x36296dd8, 0xb7375f1a), TOBN(0x472cd4b1, 0xb78e898e), TOBN(0x15dff651, 0xe9f05de9), TOBN(0xd4045069, 0x2ce98ba9), TOBN(0x8466a7ae, 0x9b38024c), TOBN(0xb910e700, 0xe5a6b5ef), TOBN(0xae1c56ea, 0xb3aa8f0d), TOBN(0xbab2a507, 0x7eee74a6), TOBN(0x0dca11e2, 0x4b4c4620), TOBN(0xfd896e2e, 0x4c47d1f4), TOBN(0xeb45ae53, 0x308fbd93), TOBN(0x46cd5a2e, 0x02c36fda), TOBN(0x6a3d4e90, 0xbaa48385), TOBN(0xdd55e62e, 0x9dbe9960), TOBN(0xa1406aa0, 0x2a81ede7), TOBN(0x6860dd14, 0xf9274ea7), TOBN(0xcfdcb0c2, 0x80414f86), TOBN(0xff410b10, 0x22f94327), TOBN(0x5a33cc38, 0x49ad467b), TOBN(0xefb48b6c, 0x0a7335f1), TOBN(0x14fb54a4, 0xb153a360), TOBN(0x604aa9d2, 0xb52469cc), TOBN(0x5e9dc486, 0x754e48e9), TOBN(0x693cb455, 0x37471e8e), TOBN(0xfb2fd7cd, 0x8d3b37b6), TOBN(0x63345e16, 0xcf09ff07), TOBN(0x9910ba6b, 0x23a5d896), TOBN(0x1fe19e35, 0x7fe4364e), TOBN(0x6e1da8c3, 0x9a33c677), TOBN(0x15b4488b, 0x29fd9fd0), TOBN(0x1f439254, 0x1a1f22bf), TOBN(0x920a8a70, 0xab8163e8), TOBN(0x3fd1b249, 0x07e5658e), TOBN(0xf2c4f79c, 0xb6ec839b), TOBN(0x1abbc3d0, 0x4aa38d1b), TOBN(0x3b0db35c, 0xb5d9510e), TOBN(0x1754ac78, 0x3e60dec0), TOBN(0x53272fd7, 0xea099b33), TOBN(0x5fb0494f, 0x07a8e107), TOBN(0x4a89e137, 0x6a8191fa), TOBN(0xa113b7f6, 0x3c4ad544), TOBN(0x88a2e909, 0x6cb9897b), TOBN(0x17d55de3, 0xb44a3f84), TOBN(0xacb2f344, 0x17c6c690), TOBN(0x32088168, 0x10232390), TOBN(0xf2e8a61f, 0x6c733bf7), TOBN(0xa774aab6, 0x9c2d7652), TOBN(0xfb5307e3, 0xed95c5bc), TOBN(0xa05c73c2, 0x4981f110), TOBN(0x1baae31c, 0xa39458c9), TOBN(0x1def185b, 0xcbea62e7), TOBN(0xe8ac9eae, 0xeaf63059), TOBN(0x098a8cfd, 0x9921851c), TOBN(0xd959c3f1, 0x3abe2f5b), TOBN(0xa4f19525, 0x20e40ae5), TOBN(0x320789e3, 0x07a24aa1), TOBN(0x259e6927, 0x7392b2bc), TOBN(0x58f6c667, 0x1918668b), TOBN(0xce1db2bb, 0xc55d2d8b), TOBN(0x41d58bb7, 0xf4f6ca56), TOBN(0x7650b680, 0x8f877614), TOBN(0x905e16ba, 0xf4c349ed), TOBN(0xed415140, 0xf661acac), TOBN(0x3b8784f0, 0xcb2270af), TOBN(0x3bc280ac, 0x8a402cba), TOBN(0xd53f7146, 0x0937921a), TOBN(0xc03c8ee5, 0xe5681e83), TOBN(0x62126105, 0xf6ac9e4a), TOBN(0x9503a53f, 0x936b1a38), TOBN(0x3d45e2d4, 0x782fecbd), TOBN(0x69a5c439, 0x76e8ae98), TOBN(0xb53b2eeb, 0xbfb4b00e), TOBN(0xf1674712, 0x72386c89), TOBN(0x30ca34a2, 0x4268bce4), TOBN(0x7f1ed86c, 0x78341730), TOBN(0x8ef5beb8, 0xb525e248), TOBN(0xbbc489fd, 0xb74fbf38), TOBN(0x38a92a0e, 0x91a0b382), TOBN(0x7a77ba3f, 0x22433ccf), TOBN(0xde8362d6, 0xa29f05a9), TOBN(0x7f6a30ea, 0x61189afc), TOBN(0x693b5505, 0x59ef114f), TOBN(0x50266bc0, 0xcd1797a1), TOBN(0xea17b47e, 0xf4b7af2d), TOBN(0xd6c4025c, 0x3df9483e), TOBN(0x8cbb9d9f, 0xa37b18c9), TOBN(0x91cbfd9c, 0x4d8424cf), TOBN(0xdb7048f1, 0xab1c3506), TOBN(0x9eaf641f, 0x028206a3), TOBN(0xf986f3f9, 0x25bdf6ce), TOBN(0x262143b5, 0x224c08dc), TOBN(0x2bbb09b4, 0x81b50c91), TOBN(0xc16ed709, 0xaca8c84f), TOBN(0xa6210d9d, 0xb2850ca8), TOBN(0x6d8df67a, 0x09cb54d6), TOBN(0x91eef6e0, 0x500919a4), TOBN(0x90f61381, 0x0f132857), TOBN(0x9acede47, 0xf8d5028b), TOBN(0x844d1b71, 0x90b771c3), TOBN(0x563b71e4, 0xba6426be), TOBN(0x2efa2e83, 0xbdb802ff), TOBN(0x3410cbab, 0xab5b4a41), TOBN(0x555b2d26, 0x30da84dd), TOBN(0xd0711ae9, 0xee1cc29a), TOBN(0xcf3e8c60, 0x2f547792), TOBN(0x03d7d5de, 0xdc678b35), TOBN(0x071a2fa8, 0xced806b8), TOBN(0x222e6134, 0x697f1478), TOBN(0xdc16fd5d, 0xabfcdbbf), TOBN(0x44912ebf, 0x121b53b8), TOBN(0xac943674, 0x2496c27c), TOBN(0x8ea3176c, 0x1ffc26b0), TOBN(0xb6e224ac, 0x13debf2c), TOBN(0x524cc235, 0xf372a832), TOBN(0xd706e1d8, 0x9f6f1b18), TOBN(0x2552f005, 0x44cce35b), TOBN(0x8c8326c2, 0xa88e31fc), TOBN(0xb5468b2c, 0xf9552047), TOBN(0xce683e88, 0x3ff90f2b), TOBN(0x77947bdf, 0x2f0a5423), TOBN(0xd0a1b28b, 0xed56e328), TOBN(0xaee35253, 0xc20134ac), TOBN(0x7e98367d, 0x3567962f), TOBN(0x379ed61f, 0x8188bffb), TOBN(0x73bba348, 0xfaf130a1), TOBN(0x6c1f75e1, 0x904ed734), TOBN(0x18956642, 0x3b4a79fc), TOBN(0xf20bc83d, 0x54ef4493), TOBN(0x836d425d, 0x9111eca1), TOBN(0xe5b5c318, 0x009a8dcf), TOBN(0x3360b25d, 0x13221bc5), TOBN(0x707baad2, 0x6b3eeaf7), TOBN(0xd7279ed8, 0x743a95a1), TOBN(0x7450a875, 0x969e809f), TOBN(0x32b6bd53, 0xe5d0338f), TOBN(0x1e77f7af, 0x2b883bbc), TOBN(0x90da12cc, 0x1063ecd0), TOBN(0xe2697b58, 0xc315be47), TOBN(0x2771a5bd, 0xda85d534), TOBN(0x53e78c1f, 0xff980eea), TOBN(0xadf1cf84, 0x900385e7), TOBN(0x7d3b14f6, 0xc9387b62), TOBN(0x170e74b0, 0xcb8f2bd2), TOBN(0x2d50b486, 0x827fa993), TOBN(0xcdbe8c9a, 0xf6f32bab), TOBN(0x55e906b0, 0xc3b93ab8), TOBN(0x747f22fc, 0x8fe280d1), TOBN(0xcd8e0de5, 0xb2e114ab), TOBN(0x5ab7dbeb, 0xe10b68b0), TOBN(0x9dc63a9c, 0xa480d4b2), TOBN(0x78d4bc3b, 0x4be1495f), TOBN(0x25eb3db8, 0x9359122d), TOBN(0x3f8ac05b, 0x0809cbdc), TOBN(0xbf4187bb, 0xd37c702f), TOBN(0x84cea069, 0x1416a6a5), TOBN(0x8f860c79, 0x43ef881c), TOBN(0x41311f8a, 0x38038a5d), TOBN(0xe78c2ec0, 0xfc612067), TOBN(0x494d2e81, 0x5ad73581), TOBN(0xb4cc9e00, 0x59604097), TOBN(0xff558aec, 0xf3612cba), TOBN(0x35beef7a, 0x9e36c39e), TOBN(0x1845c7cf, 0xdbcf41b9), TOBN(0x5703662a, 0xaea997c0), TOBN(0x8b925afe, 0xe402f6d8), TOBN(0xd0a1b1ae, 0x4dd72162), TOBN(0x9f47b375, 0x03c41c4b), TOBN(0xa023829b, 0x0391d042), TOBN(0x5f5045c3, 0x503b8b0a), TOBN(0x123c2688, 0x98c010e5), TOBN(0x324ec0cc, 0x36ba06ee), TOBN(0xface3115, 0x3dd2cc0c), TOBN(0xb364f3be, 0xf333e91f), TOBN(0xef8aff73, 0x28e832b0), TOBN(0x1e9bad04, 0x2d05841b), TOBN(0x42f0e3df, 0x356a21e2), TOBN(0xa3270bcb, 0x4add627e), TOBN(0xb09a8158, 0xd322e711), TOBN(0x86e326a1, 0x0fee104a), TOBN(0xad7788f8, 0x3703f65d), TOBN(0x7e765430, 0x47bc4833), TOBN(0x6cee582b, 0x2b9b893a), TOBN(0x9cd2a167, 0xe8f55a7b), TOBN(0xefbee3c6, 0xd9e4190d), TOBN(0x33ee7185, 0xd40c2e9d), TOBN(0x844cc9c5, 0xa380b548), TOBN(0x323f8ecd, 0x66926e04), TOBN(0x0001e38f, 0x8110c1ba), TOBN(0x8dbcac12, 0xfc6a7f07), TOBN(0xd65e1d58, 0x0cec0827), TOBN(0xd2cd4141, 0xbe76ca2d), TOBN(0x7895cf5c, 0xe892f33a), TOBN(0x956d230d, 0x367139d2), TOBN(0xa91abd3e, 0xd012c4c1), TOBN(0x34fa4883, 0x87eb36bf), TOBN(0xc5f07102, 0x914b8fb4), TOBN(0x90f0e579, 0xadb9c95f), TOBN(0xfe6ea8cb, 0x28888195), TOBN(0x7b9b5065, 0xedfa9284), TOBN(0x6c510bd2, 0x2b8c8d65), TOBN(0xd7b8ebef, 0xcbe8aafd), TOBN(0xedb3af98, 0x96b1da07), TOBN(0x28ff779d, 0x6295d426), TOBN(0x0c4f6ac7, 0x3fa3ad7b), TOBN(0xec44d054, 0x8b8e2604), TOBN(0x9b32a66d, 0x8b0050e1), TOBN(0x1f943366, 0xf0476ce2), TOBN(0x7554d953, 0xa602c7b4), TOBN(0xbe35aca6, 0x524f2809), TOBN(0xb6881229, 0xfd4edbea), TOBN(0xe8cd0c8f, 0x508efb63), TOBN(0x9eb5b5c8, 0x6abcefc7), TOBN(0xf5621f5f, 0xb441ab4f), TOBN(0x79e6c046, 0xb76a2b22), TOBN(0x74a4792c, 0xe37a1f69), TOBN(0xcbd252cb, 0x03542b60), TOBN(0x785f65d5, 0xb3c20bd3), TOBN(0x8dea6143, 0x4fabc60c), TOBN(0x45e21446, 0xde673629), TOBN(0x57f7aa1e, 0x703c2d21), TOBN(0xa0e99b7f, 0x98c868c7), TOBN(0x4e42f66d, 0x8b641676), TOBN(0x602884dc, 0x91077896), TOBN(0xa0d690cf, 0xc2c9885b), TOBN(0xfeb4da33, 0x3b9a5187), TOBN(0x5f789598, 0x153c87ee), TOBN(0x2192dd47, 0x52b16dba), TOBN(0xdeefc0e6, 0x3524c1b1), TOBN(0x465ea76e, 0xe4383693), TOBN(0x79401711, 0x361b8d98), TOBN(0xa5f9ace9, 0xf21a15cb), TOBN(0x73d26163, 0xefee9aeb), TOBN(0xcca844b3, 0xe677016c), TOBN(0x6c122b07, 0x57eaee06), TOBN(0xb782dce7, 0x15f09690), TOBN(0x508b9b12, 0x2dfc0fc9), TOBN(0x9015ab4b, 0x65d89fc6), TOBN(0x5e79dab7, 0xd6d5bb0f), TOBN(0x64f021f0, 0x6c775aa2), TOBN(0xdf09d8cc, 0x37c7eca1), TOBN(0x9a761367, 0xef2fa506), TOBN(0xed4ca476, 0x5b81eec6), TOBN(0x262ede36, 0x10bbb8b5), TOBN(0x0737ce83, 0x0641ada3), TOBN(0x4c94288a, 0xe9831ccc), TOBN(0x487fc1ce, 0x8065e635), TOBN(0xb13d7ab3, 0xb8bb3659), TOBN(0xdea5df3e, 0x855e4120), TOBN(0xb9a18573, 0x85eb0244), TOBN(0x1a1b8ea3, 0xa7cfe0a3), TOBN(0x3b837119, 0x67b0867c), TOBN(0x8d5e0d08, 0x9d364520), TOBN(0x52dccc1e, 0xd930f0e3), TOBN(0xefbbcec7, 0xbf20bbaf), TOBN(0x99cffcab, 0x0263ad10), TOBN(0xd8199e6d, 0xfcd18f8a), TOBN(0x64e2773f, 0xe9f10617), TOBN(0x0079e8e1, 0x08704848), TOBN(0x1169989f, 0x8a342283), TOBN(0x8097799c, 0xa83012e6), TOBN(0xece966cb, 0x8a6a9001), TOBN(0x93b3afef, 0x072ac7fc), TOBN(0xe6893a2a, 0x2db3d5ba), TOBN(0x263dc462, 0x89bf4fdc), TOBN(0x8852dfc9, 0xe0396673), TOBN(0x7ac70895, 0x3af362b6), TOBN(0xbb9cce4d, 0x5c2f342b), TOBN(0xbf80907a, 0xb52d7aae), TOBN(0x97f3d3cd, 0x2161bcd0), TOBN(0xb25b0834, 0x0962744d), TOBN(0xc5b18ea5, 0x6c3a1dda), TOBN(0xfe4ec7eb, 0x06c92317), TOBN(0xb787b890, 0xad1c4afe), TOBN(0xdccd9a92, 0x0ede801a), TOBN(0x9ac6ddda, 0xdb58da1f), TOBN(0x22bbc12f, 0xb8cae6ee), TOBN(0xc6f8bced, 0x815c4a43), TOBN(0x8105a92c, 0xf96480c7), TOBN(0x0dc3dbf3, 0x7a859d51), TOBN(0xe3ec7ce6, 0x3041196b), TOBN(0xd9f64b25, 0x0d1067c9), TOBN(0xf2321321, 0x3d1f8dd8), TOBN(0x8b5c619c, 0x76497ee8), TOBN(0x5d2b0ac6, 0xc717370e), TOBN(0x98204cb6, 0x4fcf68e1), TOBN(0x0bdec211, 0x62bc6792), TOBN(0x6973ccef, 0xa63b1011), TOBN(0xf9e3fa97, 0xe0de1ac5), TOBN(0x5efb693e, 0x3d0e0c8b), TOBN(0x037248e9, 0xd2d4fcb4)}, {TOBN(0x80802dc9, 0x1ec34f9e), TOBN(0xd8772d35, 0x33810603), TOBN(0x3f06d66c, 0x530cb4f3), TOBN(0x7be5ed0d, 0xc475c129), TOBN(0xcb9e3c19, 0x31e82b10), TOBN(0xc63d2857, 0xc9ff6b4c), TOBN(0xb92118c6, 0x92a1b45e), TOBN(0x0aec4414, 0x7285bbca), TOBN(0xfc189ae7, 0x1e29a3ef), TOBN(0xcbe906f0, 0x4c93302e), TOBN(0xd0107914, 0xceaae10e), TOBN(0xb7a23f34, 0xb68e19f8), TOBN(0xe9d875c2, 0xefd2119d), TOBN(0x03198c6e, 0xfcadc9c8), TOBN(0x65591bf6, 0x4da17113), TOBN(0x3cf0bbf8, 0x3d443038), TOBN(0xae485bb7, 0x2b724759), TOBN(0x945353e1, 0xb2d4c63a), TOBN(0x82159d07, 0xde7d6f2c), TOBN(0x389caef3, 0x4ec5b109), TOBN(0x4a8ebb53, 0xdb65ef14), TOBN(0x2dc2cb7e, 0xdd99de43), TOBN(0x816fa3ed, 0x83f2405f), TOBN(0x73429bb9, 0xc14208a3), TOBN(0xb618d590, 0xb01e6e27), TOBN(0x047e2ccd, 0xe180b2dc), TOBN(0xd1b299b5, 0x04aea4a9), TOBN(0x412c9e1e, 0x9fa403a4), TOBN(0x88d28a36, 0x79407552), TOBN(0x49c50136, 0xf332b8e3), TOBN(0x3a1b6fcc, 0xe668de19), TOBN(0x178851bc, 0x75122b97), TOBN(0xb1e13752, 0xfb85fa4c), TOBN(0xd61257ce, 0x383c8ce9), TOBN(0xd43da670, 0xd2f74dae), TOBN(0xa35aa23f, 0xbf846bbb), TOBN(0x5e74235d, 0x4421fc83), TOBN(0xf6df8ee0, 0xc363473b), TOBN(0x34d7f52a, 0x3c4aa158), TOBN(0x50d05aab, 0x9bc6d22e), TOBN(0x8c56e735, 0xa64785f4), TOBN(0xbc56637b, 0x5f29cd07), TOBN(0x53b2bb80, 0x3ee35067), TOBN(0x50235a0f, 0xdc919270), TOBN(0x191ab6d8, 0xf2c4aa65), TOBN(0xc3475831, 0x8396023b), TOBN(0x80400ba5, 0xf0f805ba), TOBN(0x8881065b, 0x5ec0f80f), TOBN(0xc370e522, 0xcc1b5e83), TOBN(0xde2d4ad1, 0x860b8bfb), TOBN(0xad364df0, 0x67b256df), TOBN(0x8f12502e, 0xe0138997), TOBN(0x503fa0dc, 0x7783920a), TOBN(0xe80014ad, 0xc0bc866a), TOBN(0x3f89b744, 0xd3064ba6), TOBN(0x03511dcd, 0xcba5dba5), TOBN(0x197dd46d, 0x95a7b1a2), TOBN(0x9c4e7ad6, 0x3c6341fb), TOBN(0x426eca29, 0x484c2ece), TOBN(0x9211e489, 0xde7f4f8a), TOBN(0x14997f6e, 0xc78ef1f4), TOBN(0x2b2c0910, 0x06574586), TOBN(0x17286a6e, 0x1c3eede8), TOBN(0x25f92e47, 0x0f60e018), TOBN(0x805c5646, 0x31890a36), TOBN(0x703ef600, 0x57feea5b), TOBN(0x389f747c, 0xaf3c3030), TOBN(0xe0e5daeb, 0x54dd3739), TOBN(0xfe24a4c3, 0xc9c9f155), TOBN(0x7e4bf176, 0xb5393962), TOBN(0x37183de2, 0xaf20bf29), TOBN(0x4a1bd7b5, 0xf95a8c3b), TOBN(0xa83b9699, 0x46191d3d), TOBN(0x281fc8dd, 0x7b87f257), TOBN(0xb18e2c13, 0x54107588), TOBN(0x6372def7, 0x9b2bafe8), TOBN(0xdaf4bb48, 0x0d8972ca), TOBN(0x3f2dd4b7, 0x56167a3f), TOBN(0x1eace32d, 0x84310cf4), TOBN(0xe3bcefaf, 0xe42700aa), TOBN(0x5fe5691e, 0xd785e73d), TOBN(0xa5db5ab6, 0x2ea60467), TOBN(0x02e23d41, 0xdfc6514a), TOBN(0x35e8048e, 0xe03c3665), TOBN(0x3f8b118f, 0x1adaa0f8), TOBN(0x28ec3b45, 0x84ce1a5a), TOBN(0xe8cacc6e, 0x2c6646b8), TOBN(0x1343d185, 0xdbd0e40f), TOBN(0xe5d7f844, 0xcaaa358c), TOBN(0x1a1db7e4, 0x9924182a), TOBN(0xd64cd42d, 0x9c875d9a), TOBN(0xb37b515f, 0x042eeec8), TOBN(0x4d4dd409, 0x7b165fbe), TOBN(0xfc322ed9, 0xe206eff3), TOBN(0x7dee4102, 0x59b7e17e), TOBN(0x55a481c0, 0x8236ca00), TOBN(0x8c885312, 0xc23fc975), TOBN(0x15715806, 0x05d6297b), TOBN(0xa078868e, 0xf78edd39), TOBN(0x956b31e0, 0x03c45e52), TOBN(0x470275d5, 0xff7b33a6), TOBN(0xc8d5dc3a, 0x0c7e673f), TOBN(0x419227b4, 0x7e2f2598), TOBN(0x8b37b634, 0x4c14a975), TOBN(0xd0667ed6, 0x8b11888c), TOBN(0x5e0e8c3e, 0x803e25dc), TOBN(0x34e5d0dc, 0xb987a24a), TOBN(0x9f40ac3b, 0xae920323), TOBN(0x5463de95, 0x34e0f63a), TOBN(0xa128bf92, 0x6b6328f9), TOBN(0x491ccd7c, 0xda64f1b7), TOBN(0x7ef1ec27, 0xc47bde35), TOBN(0xa857240f, 0xa36a2737), TOBN(0x35dc1366, 0x63621bc1), TOBN(0x7a3a6453, 0xd4fb6897), TOBN(0x80f1a439, 0xc929319d), TOBN(0xfc18274b, 0xf8cb0ba0), TOBN(0xb0b53766, 0x8078c5eb), TOBN(0xfb0d4924, 0x1e01d0ef), TOBN(0x50d7c67d, 0x372ab09c), TOBN(0xb4e370af, 0x3aeac968), TOBN(0xe4f7fee9, 0xc4b63266), TOBN(0xb4acd4c2, 0xe3ac5664), TOBN(0xf8910bd2, 0xceb38cbf), TOBN(0x1c3ae50c, 0xc9c0726e), TOBN(0x15309569, 0xd97b40bf), TOBN(0x70884b7f, 0xfd5a5a1b), TOBN(0x3890896a, 0xef8314cd), TOBN(0x58e1515c, 0xa5618c93), TOBN(0xe665432b, 0x77d942d1), TOBN(0xb32181bf, 0xb6f767a8), TOBN(0x753794e8, 0x3a604110), TOBN(0x09afeb7c, 0xe8c0dbcc), TOBN(0x31e02613, 0x598673a3), TOBN(0x5d98e557, 0x7d46db00), TOBN(0xfc21fb8c, 0x9d985b28), TOBN(0xc9040116, 0xb0843e0b), TOBN(0x53b1b3a8, 0x69b04531), TOBN(0xdd1649f0, 0x85d7d830), TOBN(0xbb3bcc87, 0xcb7427e8), TOBN(0x77261100, 0xc93dce83), TOBN(0x7e79da61, 0xa1922a2a), TOBN(0x587a2b02, 0xf3149ce8), TOBN(0x147e1384, 0xde92ec83), TOBN(0x484c83d3, 0xaf077f30), TOBN(0xea78f844, 0x0658b53a), TOBN(0x912076c2, 0x027aec53), TOBN(0xf34714e3, 0x93c8177d), TOBN(0x37ef5d15, 0xc2376c84), TOBN(0x8315b659, 0x3d1aa783), TOBN(0x3a75c484, 0xef852a90), TOBN(0x0ba0c58a, 0x16086bd4), TOBN(0x29688d7a, 0x529a6d48), TOBN(0x9c7f250d, 0xc2f19203), TOBN(0x123042fb, 0x682e2df9), TOBN(0x2b7587e7, 0xad8121bc), TOBN(0x30fc0233, 0xe0182a65), TOBN(0xb82ecf87, 0xe3e1128a), TOBN(0x71682861, 0x93fb098f), TOBN(0x043e21ae, 0x85e9e6a7), TOBN(0xab5b49d6, 0x66c834ea), TOBN(0x3be43e18, 0x47414287), TOBN(0xf40fb859, 0x219a2a47), TOBN(0x0e6559e9, 0xcc58df3c), TOBN(0xfe1dfe8e, 0x0c6615b4), TOBN(0x14abc8fd, 0x56459d70), TOBN(0x7be0fa8e, 0x05de0386), TOBN(0x8e63ef68, 0xe9035c7c), TOBN(0x116401b4, 0x53b31e91), TOBN(0x0cba7ad4, 0x4436b4d8), TOBN(0x9151f9a0, 0x107afd66), TOBN(0xafaca8d0, 0x1f0ee4c4), TOBN(0x75fe5c1d, 0x9ee9761c), TOBN(0x3497a16b, 0xf0c0588f), TOBN(0x3ee2bebd, 0x0304804c), TOBN(0xa8fb9a60, 0xc2c990b9), TOBN(0xd14d32fe, 0x39251114), TOBN(0x36bf25bc, 0xcac73366), TOBN(0xc9562c66, 0xdba7495c), TOBN(0x324d301b, 0x46ad348b), TOBN(0x9f46620c, 0xd670407e), TOBN(0x0ea8d4f1, 0xe3733a01), TOBN(0xd396d532, 0xb0c324e0), TOBN(0x5b211a0e, 0x03c317cd), TOBN(0x090d7d20, 0x5ffe7b37), TOBN(0x3b7f3efb, 0x1747d2da), TOBN(0xa2cb525f, 0xb54fc519), TOBN(0x6e220932, 0xf66a971e), TOBN(0xddc160df, 0xb486d440), TOBN(0x7fcfec46, 0x3fe13465), TOBN(0x83da7e4e, 0x76e4c151), TOBN(0xd6fa48a1, 0xd8d302b5), TOBN(0xc6304f26, 0x5872cd88), TOBN(0x806c1d3c, 0x278b90a1), TOBN(0x3553e725, 0xcaf0bc1c), TOBN(0xff59e603, 0xbb9d8d5c), TOBN(0xa4550f32, 0x7a0b85dd), TOBN(0xdec5720a, 0x93ecc217), TOBN(0x0b88b741, 0x69d62213), TOBN(0x7212f245, 0x5b365955), TOBN(0x20764111, 0xb5cae787), TOBN(0x13cb7f58, 0x1dfd3124), TOBN(0x2dca77da, 0x1175aefb), TOBN(0xeb75466b, 0xffaae775), TOBN(0x74d76f3b, 0xdb6cff32), TOBN(0x7440f37a, 0x61fcda9a), TOBN(0x1bb3ac92, 0xb525028b), TOBN(0x20fbf8f7, 0xa1975f29), TOBN(0x982692e1, 0xdf83097f), TOBN(0x28738f6c, 0x554b0800), TOBN(0xdc703717, 0xa2ce2f2f), TOBN(0x7913b93c, 0x40814194), TOBN(0x04924593, 0x1fe89636), TOBN(0x7b98443f, 0xf78834a6), TOBN(0x11c6ab01, 0x5114a5a1), TOBN(0x60deb383, 0xffba5f4c), TOBN(0x4caa54c6, 0x01a982e6), TOBN(0x1dd35e11, 0x3491cd26), TOBN(0x973c315f, 0x7cbd6b05), TOBN(0xcab00775, 0x52494724), TOBN(0x04659b1f, 0x6565e15a), TOBN(0xbf30f529, 0x8c8fb026), TOBN(0xfc21641b, 0xa8a0de37), TOBN(0xe9c7a366, 0xfa5e5114), TOBN(0xdb849ca5, 0x52f03ad8), TOBN(0xc7e8dbe9, 0x024e35c0), TOBN(0xa1a2bbac, 0xcfc3c789), TOBN(0xbf733e7d, 0x9c26f262), TOBN(0x882ffbf5, 0xb8444823), TOBN(0xb7224e88, 0x6bf8483b), TOBN(0x53023b8b, 0x65bef640), TOBN(0xaabfec91, 0xd4d5f8cd), TOBN(0xa40e1510, 0x079ea1bd), TOBN(0x1ad9addc, 0xd05d5d26), TOBN(0xdb3f2eab, 0x13e68d4f), TOBN(0x1cff1ae2, 0x640f803f), TOBN(0xe0e7b749, 0xd4cee117), TOBN(0x8e9f275b, 0x4036d909), TOBN(0xce34e31d, 0x8f4d4c38), TOBN(0x22b37f69, 0xd75130fc), TOBN(0x83e0f1fd, 0xb4014604), TOBN(0xa8ce9919, 0x89415078), TOBN(0x82375b75, 0x41792efe), TOBN(0x4f59bf5c, 0x97d4515b), TOBN(0xac4f324f, 0x923a277d), TOBN(0xd9bc9b7d, 0x650f3406), TOBN(0xc6fa87d1, 0x8a39bc51), TOBN(0x82588530, 0x5ccc108f), TOBN(0x5ced3c9f, 0x82e4c634), TOBN(0x8efb8314, 0x3a4464f8), TOBN(0xe706381b, 0x7a1dca25), TOBN(0x6cd15a3c, 0x5a2a412b), TOBN(0x9347a8fd, 0xbfcd8fb5), TOBN(0x31db2eef, 0x6e54cd22), TOBN(0xc4aeb11e, 0xf8d8932f), TOBN(0x11e7c1ed, 0x344411af), TOBN(0x2653050c, 0xdc9a151e), TOBN(0x9edbfc08, 0x3bb0a859), TOBN(0x926c81c7, 0xfd5691e7), TOBN(0x9c1b2342, 0x6f39019a), TOBN(0x64a81c8b, 0x7f8474b9), TOBN(0x90657c07, 0x01761819), TOBN(0x390b3331, 0x55e0375a), TOBN(0xc676c626, 0xb6ebc47d), TOBN(0x51623247, 0xb7d6dee8), TOBN(0x0948d927, 0x79659313), TOBN(0x99700161, 0xe9ab35ed), TOBN(0x06cc32b4, 0x8ddde408), TOBN(0x6f2fd664, 0x061ef338), TOBN(0x1606fa02, 0xc202e9ed), TOBN(0x55388bc1, 0x929ba99b), TOBN(0xc4428c5e, 0x1e81df69), TOBN(0xce2028ae, 0xf91b0b2a), TOBN(0xce870a23, 0xf03dfd3f), TOBN(0x66ec2c87, 0x0affe8ed), TOBN(0xb205fb46, 0x284d0c00), TOBN(0xbf5dffe7, 0x44cefa48), TOBN(0xb6fc37a8, 0xa19876d7), TOBN(0xbecfa84c, 0x08b72863), TOBN(0xd7205ff5, 0x2576374f), TOBN(0x80330d32, 0x8887de41), TOBN(0x5de0df0c, 0x869ea534), TOBN(0x13f42753, 0x3c56ea17), TOBN(0xeb1f6069, 0x452b1a78), TOBN(0x50474396, 0xe30ea15c), TOBN(0x575816a1, 0xc1494125), TOBN(0xbe1ce55b, 0xfe6bb38f), TOBN(0xb901a948, 0x96ae30f7), TOBN(0xe5af0f08, 0xd8fc3548), TOBN(0x5010b5d0, 0xd73bfd08), TOBN(0x993d2880, 0x53fe655a), TOBN(0x99f2630b, 0x1c1309fd), TOBN(0xd8677baf, 0xb4e3b76f), TOBN(0x14e51ddc, 0xb840784b), TOBN(0x326c750c, 0xbf0092ce), TOBN(0xc83d306b, 0xf528320f), TOBN(0xc4456715, 0x77d4715c), TOBN(0xd30019f9, 0x6b703235), TOBN(0x207ccb2e, 0xd669e986), TOBN(0x57c824af, 0xf6dbfc28), TOBN(0xf0eb532f, 0xd8f92a23), TOBN(0x4a557fd4, 0x9bb98fd2), TOBN(0xa57acea7, 0xc1e6199a), TOBN(0x0c663820, 0x8b94b1ed), TOBN(0x9b42be8f, 0xf83a9266), TOBN(0xc7741c97, 0x0101bd45), TOBN(0x95770c11, 0x07bd9ceb), TOBN(0x1f50250a, 0x8b2e0744), TOBN(0xf762eec8, 0x1477b654), TOBN(0xc65b900e, 0x15efe59a), TOBN(0x88c96148, 0x9546a897), TOBN(0x7e8025b3, 0xc30b4d7c), TOBN(0xae4065ef, 0x12045cf9), TOBN(0x6fcb2caf, 0x9ccce8bd), TOBN(0x1fa0ba4e, 0xf2cf6525), TOBN(0xf683125d, 0xcb72c312), TOBN(0xa01da4ea, 0xe312410e), TOBN(0x67e28677, 0x6cd8e830), TOBN(0xabd95752, 0x98fb3f07), TOBN(0x05f11e11, 0xeef649a5), TOBN(0xba47faef, 0x9d3472c2), TOBN(0x3adff697, 0xc77d1345), TOBN(0x4761fa04, 0xdd15afee), TOBN(0x64f1f61a, 0xb9e69462), TOBN(0xfa691fab, 0x9bfb9093), TOBN(0x3df8ae8f, 0xa1133dfe), TOBN(0xcd5f8967, 0x58cc710d), TOBN(0xfbb88d50, 0x16c7fe79), TOBN(0x8e011b4c, 0xe88c50d1), TOBN(0x7532e807, 0xa8771c4f), TOBN(0x64c78a48, 0xe2278ee4), TOBN(0x0b283e83, 0x3845072a), TOBN(0x98a6f291, 0x49e69274), TOBN(0xb96e9668, 0x1868b21c), TOBN(0x38f0adc2, 0xb1a8908e), TOBN(0x90afcff7, 0x1feb829d), TOBN(0x9915a383, 0x210b0856), TOBN(0xa5a80602, 0xdef04889), TOBN(0x800e9af9, 0x7c64d509), TOBN(0x81382d0b, 0xb8996f6f), TOBN(0x490eba53, 0x81927e27), TOBN(0x46c63b32, 0x4af50182), TOBN(0x784c5fd9, 0xd3ad62ce), TOBN(0xe4fa1870, 0xf8ae8736), TOBN(0x4ec9d0bc, 0xd7466b25), TOBN(0x84ddbe1a, 0xdb235c65), TOBN(0x5e2645ee, 0x163c1688), TOBN(0x570bd00e, 0x00eba747), TOBN(0xfa51b629, 0x128bfa0f), TOBN(0x92fce1bd, 0x6c1d3b68), TOBN(0x3e7361dc, 0xb66778b1), TOBN(0x9c7d249d, 0x5561d2bb), TOBN(0xa40b28bf, 0x0bbc6229), TOBN(0x1c83c05e, 0xdfd91497), TOBN(0x5f9f5154, 0xf083df05), TOBN(0xbac38b3c, 0xeee66c9d), TOBN(0xf71db7e3, 0xec0dfcfd), TOBN(0xf2ecda8e, 0x8b0a8416), TOBN(0x52fddd86, 0x7812aa66), TOBN(0x2896ef10, 0x4e6f4272), TOBN(0xff27186a, 0x0fe9a745), TOBN(0x08249fcd, 0x49ca70db), TOBN(0x7425a2e6, 0x441cac49), TOBN(0xf4a0885a, 0xece5ff57), TOBN(0x6e2cb731, 0x7d7ead58), TOBN(0xf96cf7d6, 0x1898d104), TOBN(0xafe67c9d, 0x4f2c9a89), TOBN(0x89895a50, 0x1c7bf5bc), TOBN(0xdc7cb8e5, 0x573cecfa), TOBN(0x66497eae, 0xd15f03e6), TOBN(0x6bc0de69, 0x3f084420), TOBN(0x323b9b36, 0xacd532b0), TOBN(0xcfed390a, 0x0115a3c1), TOBN(0x9414c40b, 0x2d65ca0e), TOBN(0x641406bd, 0x2f530c78), TOBN(0x29369a44, 0x833438f2), TOBN(0x996884f5, 0x903fa271), TOBN(0xe6da0fd2, 0xb9da921e), TOBN(0xa6f2f269, 0x5db01e54), TOBN(0x1ee3e9bd, 0x6876214e), TOBN(0xa26e181c, 0xe27a9497), TOBN(0x36d254e4, 0x8e215e04), TOBN(0x42f32a6c, 0x252cabca), TOBN(0x99481487, 0x80b57614), TOBN(0x4c4dfe69, 0x40d9cae1), TOBN(0x05869580, 0x11a10f09), TOBN(0xca287b57, 0x3491b64b), TOBN(0x77862d5d, 0x3fd4a53b), TOBN(0xbf94856e, 0x50349126), TOBN(0x2be30bd1, 0x71c5268f), TOBN(0x10393f19, 0xcbb650a6), TOBN(0x639531fe, 0x778cf9fd), TOBN(0x02556a11, 0xb2935359), TOBN(0xda38aa96, 0xaf8c126e), TOBN(0x47dbe6c2, 0x0960167f), TOBN(0x37bbabb6, 0x501901cd), TOBN(0xb6e979e0, 0x2c947778), TOBN(0xd69a5175, 0x7a1a1dc6), TOBN(0xc3ed5095, 0x9d9faf0c), TOBN(0x4dd9c096, 0x1d5fa5f0), TOBN(0xa0c4304d, 0x64f16ea8), TOBN(0x8b1cac16, 0x7e718623), TOBN(0x0b576546, 0x7c67f03e), TOBN(0x559cf5ad, 0xcbd88c01), TOBN(0x074877bb, 0x0e2af19a), TOBN(0x1f717ec1, 0xa1228c92), TOBN(0x70bcb800, 0x326e8920), TOBN(0xec6e2c5c, 0x4f312804), TOBN(0x426aea7d, 0x3fca4752), TOBN(0xf12c0949, 0x2211f62a), TOBN(0x24beecd8, 0x7be7b6b5), TOBN(0xb77eaf4c, 0x36d7a27d), TOBN(0x154c2781, 0xfda78fd3), TOBN(0x848a83b0, 0x264eeabe), TOBN(0x81287ef0, 0x4ffe2bc4), TOBN(0x7b6d88c6, 0xb6b6fc2a), TOBN(0x805fb947, 0xce417d99), TOBN(0x4b93dcc3, 0x8b916cc4), TOBN(0x72e65bb3, 0x21273323), TOBN(0xbcc1badd, 0x6ea9886e), TOBN(0x0e223011, 0x4bc5ee85), TOBN(0xa561be74, 0xc18ee1e4), TOBN(0x762fd2d4, 0xa6bcf1f1), TOBN(0x50e6a5a4, 0x95231489), TOBN(0xca96001f, 0xa00b500b), TOBN(0x5c098cfc, 0x5d7dcdf5), TOBN(0xa64e2d2e, 0x8c446a85), TOBN(0xbae9bcf1, 0x971f3c62), TOBN(0x4ec22683, 0x8435a2c5), TOBN(0x8ceaed6c, 0x4bad4643), TOBN(0xe9f8fb47, 0xccccf4e3), TOBN(0xbd4f3fa4, 0x1ce3b21e), TOBN(0xd79fb110, 0xa3db3292), TOBN(0xe28a37da, 0xb536c66a), TOBN(0x279ce87b, 0x8e49e6a9), TOBN(0x70ccfe8d, 0xfdcec8e3), TOBN(0x2193e4e0, 0x3ba464b2), TOBN(0x0f39d60e, 0xaca9a398), TOBN(0x7d7932af, 0xf82c12ab), TOBN(0xd8ff50ed, 0x91e7e0f7), TOBN(0xea961058, 0xfa28a7e0), TOBN(0xc726cf25, 0x0bf5ec74), TOBN(0xe74d55c8, 0xdb229666), TOBN(0x0bd9abbf, 0xa57f5799), TOBN(0x7479ef07, 0x4dfc47b3), TOBN(0xd9c65fc3, 0x0c52f91d), TOBN(0x8e0283fe, 0x36a8bde2), TOBN(0xa32a8b5e, 0x7d4b7280), TOBN(0x6a677c61, 0x12e83233), TOBN(0x0fbb3512, 0xdcc9bf28), TOBN(0x562e8ea5, 0x0d780f61), TOBN(0x0db8b22b, 0x1dc4e89c), TOBN(0x0a6fd1fb, 0x89be0144), TOBN(0x8c77d246, 0xca57113b), TOBN(0x4639075d, 0xff09c91c), TOBN(0x5b47b17f, 0x5060824c), TOBN(0x58aea2b0, 0x16287b52), TOBN(0xa1343520, 0xd0cd8eb0), TOBN(0x6148b4d0, 0xc5d58573), TOBN(0xdd2b6170, 0x291c68ae), TOBN(0xa61b3929, 0x1da3b3b7), TOBN(0x5f946d79, 0x08c4ac10), TOBN(0x4105d4a5, 0x7217d583), TOBN(0x5061da3d, 0x25e6de5e), TOBN(0x3113940d, 0xec1b4991), TOBN(0xf12195e1, 0x36f485ae), TOBN(0xa7507fb2, 0x731a2ee0), TOBN(0x95057a8e, 0x6e9e196e), TOBN(0xa3c2c911, 0x2e130136), TOBN(0x97dfbb36, 0x33c60d15), TOBN(0xcaf3c581, 0xb300ee2b), TOBN(0x77f25d90, 0xf4bac8b8), TOBN(0xdb1c4f98, 0x6d840cd6), TOBN(0x471d62c0, 0xe634288c), TOBN(0x8ec2f85e, 0xcec8a161), TOBN(0x41f37cbc, 0xfa6f4ae2), TOBN(0x6793a20f, 0x4b709985), TOBN(0x7a7bd33b, 0xefa8985b), TOBN(0x2c6a3fbd, 0x938e6446), TOBN(0x19042619, 0x2a8d47c1), TOBN(0x16848667, 0xcc36975f), TOBN(0x02acf168, 0x9d5f1dfb), TOBN(0x62d41ad4, 0x613baa94), TOBN(0xb56fbb92, 0x9f684670), TOBN(0xce610d0d, 0xe9e40569), TOBN(0x7b99c65f, 0x35489fef), TOBN(0x0c88ad1b, 0x3df18b97), TOBN(0x81b7d9be, 0x5d0e9edb), TOBN(0xd85218c0, 0xc716cc0a), TOBN(0xf4b5ff90, 0x85691c49), TOBN(0xa4fd666b, 0xce356ac6), TOBN(0x17c72895, 0x4b327a7a), TOBN(0xf93d5085, 0xda6be7de), TOBN(0xff71530e, 0x3301d34e), TOBN(0x4cd96442, 0xd8f448e8), TOBN(0x9283d331, 0x2ed18ffa), TOBN(0x4d33dd99, 0x2a849870), TOBN(0xa716964b, 0x41576335), TOBN(0xff5e3a9b, 0x179be0e5), TOBN(0x5b9d6b1b, 0x83b13632), TOBN(0x3b8bd7d4, 0xa52f313b), TOBN(0xc9dd95a0, 0x637a4660), TOBN(0x30035962, 0x0b3e218f), TOBN(0xce1481a3, 0xc7b28a3c), TOBN(0xab41b43a, 0x43228d83), TOBN(0x24ae1c30, 0x4ad63f99), TOBN(0x8e525f1a, 0x46a51229), TOBN(0x14af860f, 0xcd26d2b4), TOBN(0xd6baef61, 0x3f714aa1), TOBN(0xf51865ad, 0xeb78795e), TOBN(0xd3e21fce, 0xe6a9d694), TOBN(0x82ceb1dd, 0x8a37b527)}}; ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz384.h000064400000000000000000000022051352416253600174260ustar0000000000000000/* Copyright (c) 2014, Intel Corporation. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef OPENSSL_HEADER_EC_ECP_NISTZ384_H #define OPENSSL_HEADER_EC_ECP_NISTZ384_H #include "../../limbs/limbs.h" #define P384_LIMBS (384u / LIMB_BITS) typedef struct { Limb X[P384_LIMBS]; Limb Y[P384_LIMBS]; Limb Z[P384_LIMBS]; } P384_POINT; typedef struct { Limb X[P384_LIMBS]; Limb Y[P384_LIMBS]; } P384_POINT_AFFINE; #endif // OPENSSL_HEADER_EC_ECP_NISTZ384_H ring-0.16.9/crypto/fipsmodule/ec/ecp_nistz384.inl000064400000000000000000000177141353036607100177710ustar0000000000000000/* Copyright (c) 2014, Intel Corporation. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Developers and authors: * Shay Gueron (1, 2), and Vlad Krasnov (1) * (1) Intel Corporation, Israel Development Center * (2) University of Haifa * Reference: * Shay Gueron and Vlad Krasnov * "Fast Prime Field Elliptic Curve Cryptography with 256 Bit Primes" * http://eprint.iacr.org/2013/816 */ #include "ecp_nistz.h" #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-conversion" #endif /* Point double: r = 2*a */ void GFp_nistz384_point_double(P384_POINT *r, const P384_POINT *a) { BN_ULONG S[P384_LIMBS]; BN_ULONG M[P384_LIMBS]; BN_ULONG Zsqr[P384_LIMBS]; BN_ULONG tmp0[P384_LIMBS]; const BN_ULONG *in_x = a->X; const BN_ULONG *in_y = a->Y; const BN_ULONG *in_z = a->Z; BN_ULONG *res_x = r->X; BN_ULONG *res_y = r->Y; BN_ULONG *res_z = r->Z; elem_mul_by_2(S, in_y); elem_sqr_mont(Zsqr, in_z); elem_sqr_mont(S, S); elem_mul_mont(res_z, in_z, in_y); elem_mul_by_2(res_z, res_z); elem_add(M, in_x, Zsqr); elem_sub(Zsqr, in_x, Zsqr); elem_sqr_mont(res_y, S); elem_div_by_2(res_y, res_y); elem_mul_mont(M, M, Zsqr); elem_mul_by_3(M, M); elem_mul_mont(S, S, in_x); elem_mul_by_2(tmp0, S); elem_sqr_mont(res_x, M); elem_sub(res_x, res_x, tmp0); elem_sub(S, S, res_x); elem_mul_mont(S, S, M); elem_sub(res_y, S, res_y); } /* Point addition: r = a+b */ void GFp_nistz384_point_add(P384_POINT *r, const P384_POINT *a, const P384_POINT *b) { BN_ULONG U2[P384_LIMBS], S2[P384_LIMBS]; BN_ULONG U1[P384_LIMBS], S1[P384_LIMBS]; BN_ULONG Z1sqr[P384_LIMBS]; BN_ULONG Z2sqr[P384_LIMBS]; BN_ULONG H[P384_LIMBS], R[P384_LIMBS]; BN_ULONG Hsqr[P384_LIMBS]; BN_ULONG Rsqr[P384_LIMBS]; BN_ULONG Hcub[P384_LIMBS]; BN_ULONG res_x[P384_LIMBS]; BN_ULONG res_y[P384_LIMBS]; BN_ULONG res_z[P384_LIMBS]; const BN_ULONG *in1_x = a->X; const BN_ULONG *in1_y = a->Y; const BN_ULONG *in1_z = a->Z; const BN_ULONG *in2_x = b->X; const BN_ULONG *in2_y = b->Y; const BN_ULONG *in2_z = b->Z; BN_ULONG in1infty = is_zero(a->Z); BN_ULONG in2infty = is_zero(b->Z); elem_sqr_mont(Z2sqr, in2_z); /* Z2^2 */ elem_sqr_mont(Z1sqr, in1_z); /* Z1^2 */ elem_mul_mont(S1, Z2sqr, in2_z); /* S1 = Z2^3 */ elem_mul_mont(S2, Z1sqr, in1_z); /* S2 = Z1^3 */ elem_mul_mont(S1, S1, in1_y); /* S1 = Y1*Z2^3 */ elem_mul_mont(S2, S2, in2_y); /* S2 = Y2*Z1^3 */ elem_sub(R, S2, S1); /* R = S2 - S1 */ elem_mul_mont(U1, in1_x, Z2sqr); /* U1 = X1*Z2^2 */ elem_mul_mont(U2, in2_x, Z1sqr); /* U2 = X2*Z1^2 */ elem_sub(H, U2, U1); /* H = U2 - U1 */ BN_ULONG is_exceptional = is_equal(U1, U2) & ~in1infty & ~in2infty; if (is_exceptional) { if (is_equal(S1, S2)) { GFp_nistz384_point_double(r, a); } else { limbs_zero(r->X, P384_LIMBS); limbs_zero(r->Y, P384_LIMBS); limbs_zero(r->Z, P384_LIMBS); } return; } elem_sqr_mont(Rsqr, R); /* R^2 */ elem_mul_mont(res_z, H, in1_z); /* Z3 = H*Z1*Z2 */ elem_sqr_mont(Hsqr, H); /* H^2 */ elem_mul_mont(res_z, res_z, in2_z); /* Z3 = H*Z1*Z2 */ elem_mul_mont(Hcub, Hsqr, H); /* H^3 */ elem_mul_mont(U2, U1, Hsqr); /* U1*H^2 */ elem_mul_by_2(Hsqr, U2); /* 2*U1*H^2 */ elem_sub(res_x, Rsqr, Hsqr); elem_sub(res_x, res_x, Hcub); elem_sub(res_y, U2, res_x); elem_mul_mont(S2, S1, Hcub); elem_mul_mont(res_y, R, res_y); elem_sub(res_y, res_y, S2); copy_conditional(res_x, in2_x, in1infty); copy_conditional(res_y, in2_y, in1infty); copy_conditional(res_z, in2_z, in1infty); copy_conditional(res_x, in1_x, in2infty); copy_conditional(res_y, in1_y, in2infty); copy_conditional(res_z, in1_z, in2infty); limbs_copy(r->X, res_x, P384_LIMBS); limbs_copy(r->Y, res_y, P384_LIMBS); limbs_copy(r->Z, res_z, P384_LIMBS); } static void add_precomputed_w5(P384_POINT *r, unsigned wvalue, const P384_POINT table[16]) { BN_ULONG recoded_is_negative; unsigned int recoded; booth_recode(&recoded_is_negative, &recoded, wvalue, 5); alignas(64) P384_POINT h; gfp_p384_point_select_w5(&h, table, recoded); alignas(64) BN_ULONG tmp[P384_LIMBS]; GFp_p384_elem_neg(tmp, h.Y); copy_conditional(h.Y, tmp, recoded_is_negative); GFp_nistz384_point_add(r, r, &h); } /* r = p * p_scalar */ void GFp_nistz384_point_mul(P384_POINT *r, const BN_ULONG p_scalar[P384_LIMBS], const BN_ULONG p_x[P384_LIMBS], const BN_ULONG p_y[P384_LIMBS]) { static const unsigned kWindowSize = 5; static const unsigned kMask = (1 << (5 /* kWindowSize */ + 1)) - 1; uint8_t p_str[(P384_LIMBS * sizeof(Limb)) + 1]; gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), p_scalar, P384_LIMBS); /* A |P384_POINT| is (3 * 48) = 144 bytes, and the 64-byte alignment should * add no more than 63 bytes of overhead. Thus, |table| should require * ~2367 ((144 * 16) + 63) bytes of stack space. */ alignas(64) P384_POINT table[16]; /* table[0] is implicitly (0,0,0) (the point at infinity), therefore it is * not stored. All other values are actually stored with an offset of -1 in * table. */ P384_POINT *row = table; limbs_copy(row[1 - 1].X, p_x, P384_LIMBS); limbs_copy(row[1 - 1].Y, p_y, P384_LIMBS); limbs_copy(row[1 - 1].Z, ONE, P384_LIMBS); GFp_nistz384_point_double(&row[2 - 1], &row[1 - 1]); GFp_nistz384_point_add(&row[3 - 1], &row[2 - 1], &row[1 - 1]); GFp_nistz384_point_double(&row[4 - 1], &row[2 - 1]); GFp_nistz384_point_double(&row[6 - 1], &row[3 - 1]); GFp_nistz384_point_double(&row[8 - 1], &row[4 - 1]); GFp_nistz384_point_double(&row[12 - 1], &row[6 - 1]); GFp_nistz384_point_add(&row[5 - 1], &row[4 - 1], &row[1 - 1]); GFp_nistz384_point_add(&row[7 - 1], &row[6 - 1], &row[1 - 1]); GFp_nistz384_point_add(&row[9 - 1], &row[8 - 1], &row[1 - 1]); GFp_nistz384_point_add(&row[13 - 1], &row[12 - 1], &row[1 - 1]); GFp_nistz384_point_double(&row[14 - 1], &row[7 - 1]); GFp_nistz384_point_double(&row[10 - 1], &row[5 - 1]); GFp_nistz384_point_add(&row[15 - 1], &row[14 - 1], &row[1 - 1]); GFp_nistz384_point_add(&row[11 - 1], &row[10 - 1], &row[1 - 1]); GFp_nistz384_point_double(&row[16 - 1], &row[8 - 1]); static const unsigned START_INDEX = 384 - 4; unsigned index = START_INDEX; BN_ULONG recoded_is_negative; unsigned recoded; unsigned wvalue = p_str[(index - 1) / 8]; wvalue = (wvalue >> ((index - 1) % 8)) & kMask; booth_recode(&recoded_is_negative, &recoded, wvalue, 5); ASSERT(!recoded_is_negative); gfp_p384_point_select_w5(r, table, recoded); while (index >= kWindowSize) { if (index != START_INDEX) { unsigned off = (index - 1) / 8; wvalue = p_str[off] | p_str[off + 1] << 8; wvalue = (wvalue >> ((index - 1) % 8)) & kMask; add_precomputed_w5(r, wvalue, table); } index -= kWindowSize; GFp_nistz384_point_double(r, r); GFp_nistz384_point_double(r, r); GFp_nistz384_point_double(r, r); GFp_nistz384_point_double(r, r); GFp_nistz384_point_double(r, r); } /* Final window */ wvalue = p_str[0]; wvalue = (wvalue << 1) & kMask; add_precomputed_w5(r, wvalue, table); } #if defined(__GNUC__) #pragma GCC diagnostic pop #endif ring-0.16.9/crypto/fipsmodule/ec/gfp_p256.c000064400000000000000000000066721353036607100165250ustar0000000000000000/* Copyright 2016 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "ecp_nistz256.h" #include "../../limbs/limbs.h" #include "../../internal.h" #include "../bn/internal.h" #include "../../limbs/limbs.inl" typedef Limb Elem[P256_LIMBS]; typedef Limb ScalarMont[P256_LIMBS]; typedef Limb Scalar[P256_LIMBS]; void GFp_p256_scalar_sqr_rep_mont(ScalarMont r, const ScalarMont a, Limb rep); #if defined(OPENSSL_ARM) || defined(OPENSSL_X86) void GFp_nistz256_sqr_mont(Elem r, const Elem a) { /* XXX: Inefficient. TODO: optimize with dedicated squaring routine. */ GFp_nistz256_mul_mont(r, a, a); } #endif #if !defined(OPENSSL_X86_64) void GFp_p256_scalar_mul_mont(ScalarMont r, const ScalarMont a, const ScalarMont b) { static const BN_ULONG N[] = { TOBN(0xf3b9cac2, 0xfc632551), TOBN(0xbce6faad, 0xa7179e84), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0x00000000), }; static const BN_ULONG N_N0[] = { BN_MONT_CTX_N0(0xccd1c8aa, 0xee00bc4f) }; /* XXX: Inefficient. TODO: optimize with dedicated multiplication routine. */ GFp_bn_mul_mont(r, a, b, N, N_N0, P256_LIMBS); } #endif #if defined(OPENSSL_X86_64) void GFp_p256_scalar_sqr_mont(ScalarMont r, const ScalarMont a) { GFp_p256_scalar_sqr_rep_mont(r, a, 1); } #else void GFp_p256_scalar_sqr_mont(ScalarMont r, const ScalarMont a) { GFp_p256_scalar_mul_mont(r, a, a); } void GFp_p256_scalar_sqr_rep_mont(ScalarMont r, const ScalarMont a, Limb rep) { ASSERT(rep >= 1); GFp_p256_scalar_sqr_mont(r, a); for (Limb i = 1; i < rep; ++i) { GFp_p256_scalar_sqr_mont(r, r); } } #endif #if !defined(OPENSSL_X86_64) /* TODO(perf): Optimize these. */ void GFp_nistz256_select_w5(P256_POINT *out, const P256_POINT table[16], int index) { ASSERT(index >= 0); size_t index_s = (size_t)index; /* XXX: constant time? */ alignas(32) Elem x; limbs_zero(x, P256_LIMBS); alignas(32) Elem y; limbs_zero(y, P256_LIMBS); alignas(32) Elem z; limbs_zero(z, P256_LIMBS); for (size_t i = 0; i < 16; ++i) { Limb mask = constant_time_eq_w(index_s, i + 1); for (size_t j = 0; j < P256_LIMBS; ++j) { x[j] |= table[i].X[j] & mask; y[j] |= table[i].Y[j] & mask; z[j] |= table[i].Z[j] & mask; } } limbs_copy(out->X, x, P256_LIMBS); limbs_copy(out->Y, y, P256_LIMBS); limbs_copy(out->Z, z, P256_LIMBS); } void GFp_nistz256_select_w7(P256_POINT_AFFINE *out, const PRECOMP256_ROW table, int index) { ASSERT(index >= 0); size_t index_as_s = (size_t)index; /* XXX: constant time? */ alignas(32) Limb xy[P256_LIMBS * 2]; limbs_select(xy, table, P256_LIMBS * 2, 64, index_as_s - 1); limbs_copy(out->X, &xy[0], P256_LIMBS); limbs_copy(out->Y, &xy[P256_LIMBS], P256_LIMBS); } #endif ring-0.16.9/crypto/fipsmodule/ec/gfp_p384.c000064400000000000000000000175451353036607100165300ustar0000000000000000/* Copyright 2016 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../limbs/limbs.h" #include "ecp_nistz384.h" #include "../bn/internal.h" #include "../../internal.h" #include "../../limbs/limbs.inl" /* XXX: Here we assume that the conversion from |Carry| to |Limb| is * constant-time, but we haven't verified that assumption. TODO: Fix it so * we don't need to make that assumption. */ typedef Limb Elem[P384_LIMBS]; typedef Limb ScalarMont[P384_LIMBS]; typedef Limb Scalar[P384_LIMBS]; static const BN_ULONG Q[P384_LIMBS] = { TOBN(0x00000000, 0xffffffff), TOBN(0xffffffff, 0x00000000), TOBN(0xffffffff, 0xfffffffe), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), }; static const BN_ULONG N[P384_LIMBS] = { TOBN(0xecec196a, 0xccc52973), TOBN(0x581a0db2, 0x48b0a77a), TOBN(0xc7634d81, 0xf4372ddf), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), }; static const BN_ULONG ONE[P384_LIMBS] = { TOBN(0xffffffff, 1), TOBN(0, 0xffffffff), TOBN(0, 1), TOBN(0, 0), TOBN(0, 0), TOBN(0, 0), }; /* XXX: MSVC for x86 warns when it fails to inline these functions it should * probably inline. */ #if defined(_MSC_VER) && !defined(__clang__) && defined(OPENSSL_X86) #define INLINE_IF_POSSIBLE __forceinline #else #define INLINE_IF_POSSIBLE inline #endif static inline Limb is_equal(const Elem a, const Elem b) { return LIMBS_equal(a, b, P384_LIMBS); } static inline Limb is_zero(const BN_ULONG a[P384_LIMBS]) { return LIMBS_are_zero(a, P384_LIMBS); } static inline void copy_conditional(Elem r, const Elem a, const Limb condition) { for (size_t i = 0; i < P384_LIMBS; ++i) { r[i] = constant_time_select_w(condition, a[i], r[i]); } } static inline void elem_add(Elem r, const Elem a, const Elem b) { LIMBS_add_mod(r, a, b, Q, P384_LIMBS); } static inline void elem_sub(Elem r, const Elem a, const Elem b) { LIMBS_sub_mod(r, a, b, Q, P384_LIMBS); } static void elem_div_by_2(Elem r, const Elem a) { /* Consider the case where `a` is even. Then we can shift `a` right one bit * and the result will still be valid because we didn't lose any bits and so * `(a >> 1) * 2 == a (mod q)`, which is the invariant we must satisfy. * * The remainder of this comment is considering the case where `a` is odd. * * Since `a` is odd, it isn't the case that `(a >> 1) * 2 == a (mod q)` * because the lowest bit is lost during the shift. For example, consider: * * ```python * q = 2**384 - 2**128 - 2**96 + 2**32 - 1 * a = 2**383 * two_a = a * 2 % q * assert two_a == 0x100000000ffffffffffffffff00000001 * ``` * * Notice there how `(2 * a) % q` wrapped around to a smaller odd value. When * we divide `two_a` by two (mod q), we need to get the value `2**383`, which * we obviously can't get with just a right shift. * * `q` is odd, and `a` is odd, so `a + q` is even. We could calculate * `(a + q) >> 1` and then reduce it mod `q`. However, then we would have to * keep track of an extra most significant bit. We can avoid that by instead * calculating `(a >> 1) + ((q + 1) >> 1)`. The `1` in `q + 1` is the least * significant bit of `a`. `q + 1` is even, which means it can be shifted * without losing any bits. Since `q` is odd, `q - 1` is even, so the largest * odd field element is `q - 2`. Thus we know that `a <= q - 2`. We know * `(q + 1) >> 1` is `(q + 1) / 2` since (`q + 1`) is even. The value of * `a >> 1` is `(a - 1)/2` since the shift will drop the least significant * bit of `a`, which is 1. Thus: * * sum = ((q + 1) >> 1) + (a >> 1) * sum = (q + 1)/2 + (a >> 1) (substituting (q + 1)/2) * <= (q + 1)/2 + (q - 2 - 1)/2 (substituting a <= q - 2) * <= (q + 1)/2 + (q - 3)/2 (simplifying) * <= (q + 1 + q - 3)/2 (factoring out the common divisor) * <= (2q - 2)/2 (simplifying) * <= q - 1 (simplifying) * * Thus, no reduction of the sum mod `q` is necessary. */ Limb is_odd = constant_time_is_nonzero_w(a[0] & 1); /* r = a >> 1. */ Limb carry = a[P384_LIMBS - 1] & 1; r[P384_LIMBS - 1] = a[P384_LIMBS - 1] >> 1; for (size_t i = 1; i < P384_LIMBS; ++i) { Limb new_carry = a[P384_LIMBS - i - 1]; r[P384_LIMBS - i - 1] = (a[P384_LIMBS - i - 1] >> 1) | (carry << (LIMB_BITS - 1)); carry = new_carry; } static const Elem Q_PLUS_1_SHR_1 = { TOBN(0x00000000, 0x80000000), TOBN(0x7fffffff, 0x80000000), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), TOBN(0x7fffffff, 0xffffffff), }; Elem adjusted; BN_ULONG carry2 = limbs_add(adjusted, r, Q_PLUS_1_SHR_1, P384_LIMBS); #if defined(NDEBUG) (void)carry2; #endif ASSERT(carry2 == 0); copy_conditional(r, adjusted, is_odd); } static inline void elem_mul_mont(Elem r, const Elem a, const Elem b) { static const BN_ULONG Q_N0[] = { BN_MONT_CTX_N0(0x1, 0x1) }; /* XXX: Not (clearly) constant-time; inefficient.*/ GFp_bn_mul_mont(r, a, b, Q, Q_N0, P384_LIMBS); } static inline void elem_mul_by_2(Elem r, const Elem a) { LIMBS_shl_mod(r, a, Q, P384_LIMBS); } static INLINE_IF_POSSIBLE void elem_mul_by_3(Elem r, const Elem a) { /* XXX: inefficient. TODO: Replace with an integrated shift + add. */ Elem doubled; elem_add(doubled, a, a); elem_add(r, doubled, a); } static inline void elem_sqr_mont(Elem r, const Elem a) { /* XXX: Inefficient. TODO: Add a dedicated squaring routine. */ elem_mul_mont(r, a, a); } void GFp_p384_elem_add(Elem r, const Elem a, const Elem b) { elem_add(r, a, b); } void GFp_p384_elem_sub(Elem r, const Elem a, const Elem b) { elem_sub(r, a, b); } void GFp_p384_elem_div_by_2(Elem r, const Elem a) { elem_div_by_2(r, a); } void GFp_p384_elem_mul_mont(Elem r, const Elem a, const Elem b) { elem_mul_mont(r, a, b); } void GFp_p384_elem_neg(Elem r, const Elem a) { Limb is_zero = LIMBS_are_zero(a, P384_LIMBS); Carry borrow = limbs_sub(r, Q, a, P384_LIMBS); #if defined(NDEBUG) (void)borrow; #endif ASSERT(borrow == 0); for (size_t i = 0; i < P384_LIMBS; ++i) { r[i] = constant_time_select_w(is_zero, 0, r[i]); } } void GFp_p384_scalar_mul_mont(ScalarMont r, const ScalarMont a, const ScalarMont b) { static const BN_ULONG N_N0[] = { BN_MONT_CTX_N0(0x6ed46089, 0xe88fdc45) }; /* XXX: Inefficient. TODO: Add dedicated multiplication routine. */ GFp_bn_mul_mont(r, a, b, N, N_N0, P384_LIMBS); } /* TODO(perf): Optimize this. */ static void gfp_p384_point_select_w5(P384_POINT *out, const P384_POINT table[16], size_t index) { Elem x; limbs_zero(x, P384_LIMBS); Elem y; limbs_zero(y, P384_LIMBS); Elem z; limbs_zero(z, P384_LIMBS); for (size_t i = 0; i < 16; ++i) { Limb mask = constant_time_eq_w(index, i + 1); for (size_t j = 0; j < P384_LIMBS; ++j) { x[j] |= table[i].X[j] & mask; y[j] |= table[i].Y[j] & mask; z[j] |= table[i].Z[j] & mask; } } limbs_copy(out->X, x, P384_LIMBS); limbs_copy(out->Y, y, P384_LIMBS); limbs_copy(out->Z, z, P384_LIMBS); } #include "ecp_nistz384.inl" ring-0.16.9/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt000064400000000000000000002321741352416253600221500ustar0000000000000000# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Verification Test # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # # NIST's files provide message and digest pairs. Since this is a low-level test, # the digests have been extracted. P-521 test vectors were fixed to have the # right number of leading zeros. Curve = P-256 X = 1198b3c409a8b47edb1347e0982d533cb1813e5cb2a92c824b2881b3cd2f3f4a Y = 0bdbac5fa02e41e775f8d602446d58ecb2209b5a3d79ae69eef399016e992e87 Digest = 01ed0c41d650479c47057f61433d7e8b24492649 R = 9206d435f148f88c15b2effbf3c506e41b2c620102022b801e371d0767b54bea S = cbc4e1674ae1af69873946ccf6275946e59e0107278749b2d0010795833d80fa Invalid = Y Curve = P-256 X = f7c6280aecd6b936513b0ca84e63346333dc41437a15442e605d46bba93ae101 Y = 3c834cecc16167b07866a9478f9f2d882de7ef937da447cd837e60cb5ed65d81 Digest = f91b4dfddd5eb33a875d2e50d1e949211ac819da R = f615af212ab030c4bbf9362d9815a1462312df4beb4358a7ce80d820355420bf S = d12ed715ef65cfe6fe6bf348364088a0e7f70927bbafe4c12fc4cb65c0cc51bc Invalid = Y Curve = P-256 X = 0e7632dbc4db879e10d1d80f2789d9fa414c1fe77a6c1e56d6667af43e36e610 Y = 6f0dd2a5840e5a6f6ff7e23f656f5c945b7a493fbb0cfd5b9b531bf04435b1ef Digest = 3905696f8bad8205fa1445df0e91ade3dbc413e6 R = 2b0b9ab4a575732a168f28494b66a855fc1a757fb1177864bf3e4f0a000c4a86 S = 54901ce2f92f55ac112afa0f8b62bc00b44c8c10fe0c863675bfd305d6dc0cd8 Invalid = Y Curve = P-256 X = 1613f12bae8e98d09b4bba53f5229596a0d417d2c625f41bb15f923b3c1e4b57 Y = 411319fa85227997a4cf3b1756161485124d2cedc38c9c30d82f42dc2647d545 Digest = 580d31ce22700a20c2db81bcdac37330b491c86f R = ed058d476a77be99c1b0fc8502abe545541b4c0ff3eed3f558133ae2f02042b0 S = c571b4895712a4f64f7220b0694cab767379b09f1824fe7874acd127deb2371e Invalid = Y Curve = P-256 X = 88bb041dcb1733a676a7f4ae8d3e407d72d5396547f07db77078485c1d5db077 Y = 72cf2b55e596cd140c58228f1b0a19c34fca26ffac043528a417c5abb6fca9c9 Digest = 7900a02f768b0718a13525c33adace583de15c50 R = 87208734deb125dca68f0d33f9d369cf1b79cf5a021391b9c6c1727d2efe663a S = b984f722de18f1ce407104342948f03f2b55413a096c4b5fca1e032a2c814a4a Invalid = Y Curve = P-256 X = 811eb5180def7fb60d632f8cb2cba831b88cee778aa2a82ec3a5fc3d80ff7fb6 Y = db88d65b0fc35d9ba1f1ced0400434979ae895d371d1441d7c7a441a9fb1709b Digest = 17b7451ea903125ccb293ffaa9d1a4ca1141a2c5 R = c329fa28dac0018276c5af0cd770e60be50bc14e2562d5556991971edc7d4916 S = 2d111d13837a02fa279fe835a7dc59a521864d92b26649ca4e24b36ae93878e8 Invalid = Y Curve = P-256 X = 4a6f1e7f7268174d23993b8b58aa60c2a87b18de79b36a750ec86dd6f9e12227 Y = 572df22bd6487a863a51ca544b8c5de2b47f801372a881cb996a97d9a98aa825 Digest = 54e9a048559f370425e9c8e54a460ec91bcc930a R = 4a800e24de65e5c57d4cab4dd1ef7b6c38a2f0aa5cfd3a571a4b552fb1993e69 S = d9c89fb983640a7e65edf632cacd1de0823b7efbc798fc1f7bbfacdda7398955 Invalid = Y Curve = P-256 X = f3033d1e548d245b5e45ff1147db8cd44db8a1f2823c3c164125be88f9a982c2 Y = 3c078f6cee2f50e95e8916aa9c4e93de3fdf9b045abac6f707cfcb22d065638e Digest = e8d38e4c6a905a814b04c2841d898ed6da023c34 R = d4255db86a416a5a688de4e238071ef16e5f2a20e31b9490c03dee9ae6164c34 S = 4e0ac1e1a6725bf7c6bd207439b2d370c5f2dea1ff4decf1650ab84c7769efc0 Curve = P-256 X = 0ea0a6bb6c70966fad1a2307479c12de2322795bdecb70e4b286bd6200ba9c1a Y = c40eda3947021348db691ac4086fb6c06b587ce37c155bb0a7d912b93226de81 Digest = 3b08bf1b67abc03c1cd69b0e24743b5c2d49e506 R = f5509deff7bfda3f3759800fa4033af6a84466b114ecb48eac37eff48d2ae1b3 S = 8c4b62dce2082f80caf220cdbb1d02567bbdfab40564b90ef31d86e3e10ce80a Invalid = Y Curve = P-256 X = e7a57e0f6ec0fa9c7c34978034cf82f039f8fd62804070ad943573fc8efa5775 Y = 87b2cc85dfff2dae5620fbe3e6256bd728de28fc9dc1b5eb6b5d7bd5d29186ad Digest = a8c5dc0344b1442dfdb5f8836251893d6c4ecbe9 R = 97642038932fdddbe2021ec1af53ae6b9af00ef9c8b9f26aea582892e80e6285 S = 9cb14918359338041cf795cf6781e4905837fa5ce3b3e50ffafb5f13c73b5bc8 Invalid = Y Curve = P-256 X = be7a651be0c87278569987cf62d7fa1dd1b3d6e1b868d8f4dfb56135a9960eec Y = b7a62c588a987760b915edbd7f95506870c60f042471de1d8b2d4cd9d6563391 Digest = 2f93ee45db133a14c26d418c2ffd3470ae63bf50 R = aa889fb608b6939f6eeacf2f64c3b2e3a6061f2834058c7e724321720b737a63 S = 6cd6d0ef2b93a760daa914e11b9b414bd4d72457405f00a62ab63f36d76efb73 Invalid = Y Curve = P-256 X = 76ddc46d8db8d7ce2ce837f60cdabcee92b7c7817ee41c8f066f1ae65f85c318 Y = bea47191f1c584c87250370ce337a1de1583bcfc20ccc23b7a82e83f19adaa88 Digest = 2136a5470ff9d45214a0b2c300042efea8ff7266 R = 84a42efbf7ec04166ad144d19cd98c120aa2e79d483b5eea6fbdfa7f1222e07b S = e41531205e691e65668f69f518abc7b60f32c373434872a043b7358462babf83 Invalid = Y Curve = P-256 X = 2f71b932f770ba9daf7c1dd47444ab6cb8881f71a1c597e719845b15cb84ca35 Y = ab928625b40ec0738d0fc8dbc4df4a1f65d20bc0447b69cfa13bb20b95bb41d4 Digest = ae6093bb37c1264ca3ead439e4f678721912c8c4 R = 63fca172bbca6197cd2802a9cb61d74c2b47cf35f6d35203e67ffbaa838be775 S = e70ec283cd212df6ba3723e26b697501f112d7cf64e4f45185dae76055e09f1e Curve = P-256 X = ce775648b928db82ac5edb3b009d32959a73b86c45e96d4b8d5b6e640b7c2790 Y = 52455caf08ee94d86f0984e9ec9268d74823f2102dd97fced59638055f6af18e Digest = 60054807acb29e3091a023c42b9885c4945249e1 R = 2a64b29146588f3153fee1029a0131ac0a8a25ba2ecc494f697c166c7c91fc08 S = 7b429bc12a72ca3d76c119eea9f4098633cc31c87831e54d5d93afd6e8d20f4f Invalid = Y Curve = P-256 X = cd2f29a53f0ce57e0e4a542c3256e65ebbdc30415f4de771d5d706d3aeacc852 Y = dbbf2c129f30d11fe77d7816a24187764eae3fb2ff70c1ec745e876e26f5232f Digest = 5f50e35b134942295c16d003742fd6bce5bdab45 R = 2454c5ee84e4f77b554acd368dd412389db8c78429590a092f24db2da43cb761 S = 63e870ce2fa4085d4ff1e360f7a5c101a1f8b288abe71cca56887e613ad034b7 Curve = P-256 X = 843f6d83d777aac75b758d58c670f417c8deea8d339a440bb626114318c34f29 Y = 83e0c70008521c8509044b724420463e3478e3c91874d424be44413d1ce555f3 Digest = cda2c7ad9abb2a858c4981550f78974c69e41cc31fa33509e3e83dc2 R = d08e9a5db411019d826b20ac889227ed245503a6d839494db1e8d7995a6b245b S = 8d46a204054125d0dc776ab1055302ec4eb0f20b90bca6d205f21d3cefd29097 Curve = P-256 X = f08b56f73f7a0e098444f6f0a02ad81ce0b914a11cafa15893d1c84704e1c564 Y = bbee9aeb91cdc2d1d1437b4168df73acfd64e8b02962b14c85e67187e1ef80a4 Digest = 5453c2656550e9b3dc6c40a3f1362a73522396bc35d383dd6451128f R = 71b3ec982725a007ac18a5cf60587e1fd1beb57685a1f9df3cddd9df25dcbc18 S = 407e41217325f92f8a031cfcc4eb64c1a4b17b0a7459c254af754a7ea9eac997 Invalid = Y Curve = P-256 X = 0b688e761e1ddda2305e002809da65bf5916dfe1356a5b99b61f5576a9b90efa Y = 90ec958e2e3a676e7bbf8e9394f72742875836125a317b0ae38374953f746a91 Digest = 7289573d6bb7486e428e086bec9da9d7ff3c5f8bd0db2ec209fed6ae R = ef89df3bbf079fb250f7e882c4f85c0023fc3804e862d9ef4d9530a15f1013f0 S = 4ba985e900e6737b8e07eac638f7b38277ead4faee6d2076a2eee90fd2a6bf0f Invalid = Y Curve = P-256 X = 0b64480783e260e1e9caef37b4cc9c650d2d57e2c594b1106314843d8d7ab74e Y = 29d373d8522deffe40055aef539f53f38937eb799b44f05a8d8c0b381f12907f Digest = 497656e780360ec3b4bd1be97570615e4a32467982cd9330bc6aa224 R = c5c26b0b21eef0f7a0f1cff38d0079d890376759369b01d8d8e959c1c785e203 S = fecc400bf0deab99d87da168b9d0dd31d2dfa3435b0fe9d38b5fb8efd45195a4 Invalid = Y Curve = P-256 X = 7f78a8fd880c509940e2b83de67c9ab553ab91489bae75cdc1d5b523b06ab7f5 Y = 7786aee7032c373cdfad7d9ddb6fa09a026f6da30fd477ab014d30a289d542a1 Digest = 6d88da9e83ae9457e233d7977172c062dfbdd17d365694515251e031 R = c93ada69db326f76b1362d610cb8bcc6e7ef1dc03d3d11367e153c0e39d5dc86 S = d0c02c71b14ef7a4af4e23bd207ce98449f5d6e7e5b3ec8cbbca9549e97d379d Curve = P-256 X = e58cdc207c56f62e0bb7c0b55b7f7236a6b308f8fc4de3e61cdb3bf20ad2f62c Y = 6056c0ee827e85ba284838954d0c6cc096df03b4611b1e0f7f9002bac86856d4 Digest = 3f9a97b8ea807edc88788df8956c296b1daaed8dd12d50c712344091 R = 2df3906527ad322000285bccdd11dd09130d633cf43534f5802604639eb847e0 S = adaaad19b7c66836ef0f4afeff8ac5e898cd2523246a74a1a291a3a1ff583322 Curve = P-256 X = 70b4bba10b7bbc6d4175ada8d485f3685b13916d0c992301f47e45b629c63d0e Y = 257a93be31b09ff4cd22e3375e30b5a79f3bf3c74c80dde93e5d65e88c07c1c4 Digest = cc3a0d3a5d4f28dc9144a3cdb276eb92265f1157a8d8192cf628673c R = 6e714a737b07a4784d26bde0399d8eee81998a13363785e2e4fb527e6a5c9e4e S = 94c0220f0f3fa66ff24f96717f464b66ae3a7b0f228ab6a0b5775038da13768a Invalid = Y Curve = P-256 X = 8b11b48d2397355000a5289d816b9892ae64dffc842abec02a2fb2db2bb34310 Y = fc1a42528a0473cfc2c2e184b8bc5055096350fe1549d24b526d6536681026e8 Digest = f340e491fa935be8945b8caa485d0699c66331e0e17c7407da1b018e R = 61a91dd1c80049e70dc4aea84bda0efc6ec9c7b9dd16ecbccf687244c51184ce S = e381e7b32bab49578c7e7ce7784ce19263e4a7dab4b614df411d20eaebfc391c Invalid = Y Curve = P-256 X = 7bad1b3d8bad4355a44511d2eb50daeae793af99418ada118327359936aa0e1d Y = e7eff40334b7a5455f6b0d0ecdcdc513702857bb5bbb73c910c86746092bcd7d Digest = 9cf84546c046b370c372c167ebba39af6aadd60463626453787bb058 R = fd961b60b21be32b47abafa77e22197dc99af6825dcca46e0e3b1991a90aa202 S = a0477f97b94a1c26a3b2d186791d7fc9dfa8130bbae79c28fa11ec93a3aeac0b Invalid = Y Curve = P-256 X = 407d92c9b28723602bf09f20f0de002afdf90e22cb709a8d38e3c51e82cba96c Y = 4530659432e1dd74237768133e1f9808e62d0fbe5d1d979d1571baf645dcb84c Digest = 0cf5cd48c93f45472d254196bebea4bddb272a2adff23bab8c3adf99 R = a7dc65293ee3deb0008ae3e2d7ef9e9a4ebb8bf7b10d165f80ab8bed58d6fdef S = 3e8300a3ee603a8d8234fe265c628e705015bf1903eb74c943323050626f701f Invalid = Y Curve = P-256 X = 26aea3dd5c53f984dbdaf415c7f26e1e73048658a548eb3b59dd5f721899919a Y = dff15f57bd9b08644d49cbb214403647195725cd4d4511bc8a48b0770466ae9f Digest = 75d6b6b575d0a2c89528b83c94ef864c825b66253ab662b36bb0e716 R = 726af92afe53e8125b0b9f3659745be401a37ae658b7b1aa88c3cb97e9de22c3 S = 794484c5837a419efe11a4e4293341a6fa36d21230925a0e5e135887302acca9 Invalid = Y Curve = P-256 X = e73418677ce044b331a6d60773cbae199221699d31e1bec4b68b9bc0b87e4cd0 Y = 37215db4e3d9161f3351b385a61ddb2fcf1cec469d1659e7574610ed27fe879f Digest = dcbb92e3be3951d37e37852d508f78da29c8183c5dbe59d6549f78ed R = ac469290a8f61a2a8c6adc7533dd5cfe804e2e7bf101cc74e5f624f301bccd23 S = 4c328c3bc259316641fff44753743afebe89b8627f904df7245e42adcff2dc76 Invalid = Y Curve = P-256 X = b0892b19c508b3543a5ae864ba9194084c8f7ae544760759550cc160972e87ff Y = 9208e9b0c86ad6bc833e53026f233db9a42298cdb35d906326008377520b7d98 Digest = 90333facb4f5068c1d05d1a478fb46d02f367e271a000474c06a5fec R = a62dd0d1518c6b9c60de766b952312a8d8c6eaa36a68196d2a30a46fb17dc067 S = b9ded660e978129277f74c1d436003d1e6d556dc8eed9d505bbaf4c67cb13d21 Invalid = Y Curve = P-256 X = 8c5c41cb07d828a6a86be4533aef791d3a70a95cb285aa2956b21feeac2f8c49 Y = 84101581cad7a48b7d0596df7ffed47085d22e8a4af685cddbeeb32ea69ae190 Digest = 8bb52bd045c985167f673c07b613a3402f435a54c122877bc0c5fe34 R = 9812449df0a51f7a2a8f78aa9a589ca9644dce285f1e69658daaea759fa5bd7e S = beb4c27c748a7944e37afe861576f76b5a749a8ccbbd7dec00838ba250ddfe1a Invalid = Y Curve = P-256 X = 788d7e54ab03020e4954f41259052ee5af68361492b180da31fbbe68d868aa95 Y = 982a3ababa6d351649e56da3faeb7160b9de74e22fe93a06ead1bd9a8dffdf7e Digest = 9870ae25b0f0403eff1079b94669cf95fb250fb098eeb885ff08f117 R = 3ddea06bf8aa4a1b0c68674a2c4796def0bfb52236f4efb3332204a41fd8ea89 S = 871237039431a41aeefcdd08f67848b2b09067e3a1344c8ed9b372d1b1c754a6 Invalid = Y Curve = P-256 X = 87f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555 Y = e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9 Digest = a82c31412f537135d1c418bd7136fb5fde9426e70c70e7c2fb11f02f30fdeae2 R = d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0 S = a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6 Invalid = Y Curve = P-256 X = 5cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2 Y = ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85 Digest = 5984eab8854d0a9aa5f0c70f96deeb510e5f9ff8c51befcdc3c41bac53577f22 R = dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693 S = d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c Invalid = Y Curve = P-256 X = 2ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb Y = 5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64 Digest = 44b02ad3088076f997220a68ff0b27a58ecfa528b604427097cce5ca956274c5 R = 9913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda8 S = 9467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc Invalid = Y Curve = P-256 X = e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c Y = 970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927 Digest = d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94 R = bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f S = 17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c Curve = P-256 X = e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d2864 Y = 7f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a Digest = b9336a8d1f3e8ede001d19f41320bc7672d772a3d2cb0e435fff3c27d6804a2c R = 1d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407 S = cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a Curve = P-256 X = a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86 Y = bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471 Digest = 640c13e290147a48c83e0ea75a0f92723cda125ee21a747e34c8d1b36f16cf2d R = 25acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d6 S = 9b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537 Invalid = Y Curve = P-256 X = 3dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5df Y = f22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb Digest = 8a3e7ad7b9b1b0cdc48e58d1e651fe6d710fef1420addeb61582bdd982d2b44c R = 548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a S = e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75 Invalid = Y Curve = P-256 X = 69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214 Y = d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f Digest = d80e9933e86769731ec16ff31e6821531bcf07fcbad9e2ac16ec9e6cb343a870 R = 288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790 S = 247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979 Invalid = Y Curve = P-256 X = bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682 Y = 069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03 Digest = 7c1048884558961c7e178b3a9b22583fca0d17f355a9887e2f96d363d2a776a3 R = f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad S = 049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d Invalid = Y Curve = P-256 X = 224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de Y = 178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9 Digest = 4c8d1afb724ad0c2ec458d866ac1dbb4497e273bbf05f88153102987e376fa75 R = 87b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d2 S = 4044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66 Invalid = Y Curve = P-256 X = 43691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369 Y = f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac Digest = 8581034ec7d7a6b163d71820923f616b362748f2846042c9896d8e4bf7577960 R = 8acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce S = cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154 Invalid = Y Curve = P-256 X = 9157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596 Y = 972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405 Digest = e5b30e0041a33281210644938d9aaa15ef2c1247b4178f7ca1ee935ce23daabc R = dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb S = 8f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2 Invalid = Y Curve = P-256 X = 072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda Y = 9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5 Digest = edd72dc0aa91649e09e2489c37ec27efab3b61953762c6b4532a9b1cd08a500d R = 09f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19 S = a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d Invalid = Y Curve = P-256 X = 09308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24 Y = f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5 Digest = 0d06ba42d256062e16b319a0f3099109518a765f26bac3b9f56930d965617726 R = 5cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e73 S = 9c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7 Invalid = Y Curve = P-256 X = 2d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d Y = 9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a Digest = 41007876926a20f821d72d9c6f2c9dae6c03954123ea6e6939d7e6e669438891 R = 06108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959 S = 62b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce Curve = P-256 X = 40ded13dbbe72c629c38f07f7f95cf75a50e2a524897604c84fafde5e4cafb9f Y = a17202e92d7d6a37c438779349fd79567d75a40ef22b7d09ca21ccf4aec9a66c Digest = 5aa8e8a6f0622b841416e1a70d79a54641d2c699a075b6960fe5dcf96301da8ca6f15b0948d4ededac30a42e00d3b310 R = be34730c31730b4e412e6c52c23edbd36583ace2102b39afa11d24b6848cb77f S = 03655202d5fd8c9e3ae971b6f080640c406112fd95e7015874e9b6ee77752b10 Invalid = Y Curve = P-256 X = 1f80e19ffeb51dd74f1c397ac3dfd3415ab16ebd0847ed119e6c3b15a1a884b8 Y = 9b395787371dbfb55d1347d7bed1c261d2908121fb78de1d1bf2d00666a62aed Digest = 244656186c11c2e67be88099d55e60f4b68e61fba0b214aac3399dc559cfccc02f9884e85623426dbdc3243f2b5374f7 R = 249ca2c3eb6e04ac57334c2f75dc5e658bbb485bf187100774f5099dd13ef707 S = 97363a05202b602d13166346694e38135bbce025be94950e9233f4c8013bf5bf Invalid = Y Curve = P-256 X = ce4dcfa7384c83443ace0fb82c4ac1adfa100a9b2c7bf09f093f8b6d084e50c2 Y = d98ae7b91abee648d0bfde192703741ac21daad7262af418b50e406d825eb0d6 Digest = adaeadda3f0e941fba1d3e206a84e6d7530d800e0f215b3ddd82022f27c5be44fed27bc73084c6f7ca55555532be2e3b R = 597e1e04d93a6b444ccc447a48651f17657ff43fb65fe94461d2bf816b01af40 S = 359fe3817963548e676d6da34c2d0866aa42499237b682002889eaf8893814d2 Curve = P-256 X = 1b677f535ac69d1acd4592c0d12fac13c9131e5a6f8ab4f9d0afdcb3a3f327e0 Y = 5dca2c73ec89e58ef8267cba2bb5eb0f551f412f9dc087c1a6944f0ce475277a Digest = e34a541f87ff0eaa0c640f555caec6bf11a1320c74c47a8ff172c4e2ec902e48d499732b12a86189e750bbf4c0424c72 R = df0b0cd76d2555d4c38b3d70bfdf964884d0beeb9f74385f0893e87d20c9642d S = 128299aabf1f5496112be1fe04365f5f8215b08a040abdfeca4626f4d15c005b Invalid = Y Curve = P-256 X = 7ffc2853f3e17887dda13b0eb43f183ce50a5ac0f8bba75fb1921172484f9b94 Y = 4cc523d14192f80bd5b27d30b3b41e064da87bfbae15572dd382b9a176c123a2 Digest = 0689927a38486cccf28fe9454e08e0d74843424b89be4cdee8e48f39a69addec730184da72f914cea67231c765ee2574 R = 3156176d52eb26f9391229de4251993a41b8172f78970bb70e32a245be4bb653 S = 62827a29e12d2f29b00fb2d02dd5f2d5412e17a4455f4431a5c996881fdfc0ee Invalid = Y Curve = P-256 X = 5569f76dc94243cde819fb6fc85144ec67e2b5d49539f62e24d406d1b68f0058 Y = 1208c38dbe25870deab53c486f793a1e250c9d1b8e7c147ea68b71196c440730 Digest = 97f8f8cea435282ac746730ac744bf97d85d4e249c0b1d9c7b83c7e59aed172ffc3724d7e6fab7d6ab55ffb3a39c0775 R = 706f2ba4025e7c06b66d6369a3f93b2fec46c51eceff42a158f7431919506cfb S = b4e75ac34a96393237fc4337789e37168d79382705b248051c9c72bcbac5f516 Invalid = Y Curve = P-256 X = e4b470c65b2c04db060d7105ec6911589863d3c7f7ce48726ba3f369ea3467e8 Y = 44c38d3ae098de05f5915a5868c17fee296a6e150beb1f000df5f3bec8fc4532 Digest = 5b937a2af46dbf18b4a6fb042ea353a6878e0d4beac016002b3d91a42bcba52856c07a3f35c08dfecb4f03e1c0b9948e R = c9c347ee5717e4c759ddaf09e86f4e1db2c8658593177cfda4e6514b5e3ecb87 S = baae01e9e44a7b04d69c8eaaed77c9e3a36ce8962f95cc50a0db146b4e49eb40 Invalid = Y Curve = P-256 X = 96050c5fa2ddd1b2e5451d89ee74a0b7b54347364ddc0231715a6ef1146fe8dc Y = e0888a9e78aeea87f6e1e9002b2651169f36c4ee53013cfc8c9912b7fd504858 Digest = b123e07744f05ad523790ea5bfa3f848869a3bfdbf936a496c8606b577ed8427eb7ee888e0fe18d4e3cfac73baad883f R = 2353d6cd3c21b8ea7dbc1cd940519812dbe365a3b15cd6aebba9d11cf269867a S = 85f560273cd9e82e6801e4cb1c8cd29cdac34a020da211d77453756b604b8fa7 Curve = P-256 X = 0c07bb79f44012299fbfd5a0f31397aaf7d757f8a38437407c1b09271c6551a0 Y = 84fe7846d5d403dc92c0091fbd39f3c5cbca3f94c10b5cae44e2e96562131b13 Digest = fb8d12652de59e63ef5297641dfbce084808de146720e9069c2ef814bcd80b6187f7422a6cd9c706f8d64ccf80e8bc54 R = 49e9425f82d0a8c503009cead24e12adc9d48a08594094ca4f6d13ad1e3c571d S = 1f1b70aaa30a8ff639aa0935944e9b88326a213ab8fce5194c1a9dec070eb433 Invalid = Y Curve = P-256 X = 71db1de1a1f38f356c91feaff5cfe395d1a5b9d23cf6aa19f38ae0bcc90a486d Y = ecdd6ffb174a50f1cc792985c2f9608c399c98b8a64a69d2b5b7cdd9241f67e2 Digest = 2d8c6585a3b6319a556e27b53d434f455f73e771c8fc6a115f5c92a8e9a81ce2b4336a5c3edf98910689d11f4c93632a R = b0443b33a6f249470d2f943675009d21b9ccbead1525ae57815df86bb20470bf S = 316dbee27d998e09128539c269e297ac8f34b9ef8249a0619168c3495c5c1198 Invalid = Y Curve = P-256 X = 8219b225aa15472262c648cac8de9aad4173d17a231ba24352a5a1c4eea70fad Y = 0fee2b08ad39fbf0db0016ef2896ca99adc07efc8c415f640f3720498be26037 Digest = a4cc3b23f54d9d48ba6b0ad3da3b2e3a0806f41348bd7844e9c9b8648753bdeef8a039e1fa4f5172c89148d65b14056f R = 134fb689101aaad3954de2819d9fbd12072fe2bc36f496bbf0d13fa72114ab96 S = e65c232bd915b59e087e7fd5ec90bf636cfa80526345c79a0adfd75003045d6f Invalid = Y Curve = P-256 X = c934195de33b60cf00461fc3c45dad068e9f5f7af5c7fa78591e95aeb04e2617 Y = b588dd5f9965fdaa523b475c2812c251bc6973e2df21d9beaace976abf5728cb Digest = b962b63a7743ad77f9072f2f08d277f6dda8cc3420ddd37d873746008895902bcce218fbfed1a8cb28406978dd8e5134 R = 71f302440eb4ed2a939b69e33e905e6fdc545c743458d38f7e1a1d456e35f389 S = 54eaa0eb9cd7503b19a9658f0a04955d9f0ab20ebc8a0877e33c89ee88ad068f Invalid = Y Curve = P-256 X = 9e1adcd48e2e3f0e4c213501808228e587c40558f52bb54ddbb6102d4048ea92 Y = 34eff98704790938e7e0bdf87ae39807a6b77dfdc9ecdfe6dd0f241abae1aeb2 Digest = 21b883fae159867731b123a2606e9b3320fb53a00e4a5dfe3bc3429dd53b8068197be3c7288c1e0bf28a4fc7b13bd70f R = ce4f0d7480522c8dd1b02dd0eb382f22406642f038c1ede9411883d72b3e7ed0 S = 8546e1ee3b77f9927cdaccbc2f1cf19d6b5576b0f738bb1b86a0c66b39ca56fb Invalid = Y Curve = P-256 X = 93edbecb0b019c2cc03060f54cb4904b920fdb34eb83badd752be9443036ae13 Y = b494e9295e080a9080fe7e73249b3a5904aa84e1c028121eecd3e2cf1a55f598 Digest = fcc17b88077570c053650e1de42ae6bb1522900b38996decc87704aab6a87ab01d52f83f6442875f378a262c22d23ab2 R = eec2986d47b71995892b0915d3d5becc4dcb2ab55206d772e0189541b2184ddf S = 8a6c1edeb6452627ad27c8319599c54ac44cdd831ea66f13f49d90affe6ad45b Curve = P-256 X = 3205bae876f9bd50b0713959e72457165e826cbbe3895d67320909daa48b0ebc Y = d1592562273e5e0f57bbfb92cedd9af7f133255684ee050af9b6f02019bbcafa Digest = 299a6070d32a5557010753d7559dbd8d2bde8a8feae5417616ceb5b167997fd2fac0c2bd44264106d3a9720d5e805a04 R = 0124f3f1c61ec458561a4eaa6c155bd29e59703d14556324924683db3a4cf43b S = 688a5c5fc0c7ba92210c50cce5b512a468a880e05acc21ca56571d89f45f603a Invalid = Y Curve = P-256 X = 484e31e69ef70bb8527853c22c6b6b4cd2a51311dde66c7b63f097dbb6ab27bf Y = e1ff8177f4061d4fbbacbbc70519f0fc8c8b6053d72af0fe4f048d615004f74e Digest = f1e9cda2e096ece9a1fc57e55eeeb56b1c635380c0f9a1800a4a1a5f105d1fc0c60e776234daaa8a6f7c0f5286bb420b3f607e7cc0a7d840ad5dcbab26c797b0 R = 91a303d8fe3ab4176070f6406267f6b79bfe5eb5f62ae6aeb374d90667858518 S = e152119cefa26826ea07ec40a428869132d70812c5578c5a260e48d6800e046a Invalid = Y Curve = P-256 X = 8b75fc0129c9a78f8395c63ae9694b05cd6950665cf5da7d66118de451422624 Y = b394171981d4896d6e1b4ef2336d9befe7d27e1eb87f1c14b8ddda622af379dc Digest = 0527199fadea30f9e5e66166a3ebcdf6aedf906984535f48165e591eff36f1c0de6b0fa69aefb6399e8a213cc2ce53268fbe18c3471b7708bc27c426aaa769a4 R = 17e298e67ad2af76f6892fdcead00a88256573868f79dc74431b55103058f0b0 S = 881328cd91e43d30133f6e471e0b9b04353b17893fb7614fd7333d812a3df6b4 Invalid = Y Curve = P-256 X = 76e51086e078b2b116fd1e9c6fa3d53f675ae40252fb9f0cc62817bd9ce8831d Y = ca7e609a0b1d14b7c9249b53da0b2050450e2a25cb6c8f81c5311974a7efb576 Digest = c926a5026d8f83ffa2092caf863f2d8a886af391462969b13a11d3c6c5fa66bb4281bc6e60a1e99a2e1ae95d689a66282096a0f27aacc048f32d39297649a014 R = 23b653faaa7d4552388771931803ce939dd5ee62d3fa72b019be1b2272c85592 S = a03c6f5c54a10861d6b8922821708e9306fd6d5d10d566845a106539cbf4fadd Invalid = Y Curve = P-256 X = bc7c8e09bd093468f706740a4130c544374fdc924a535ef02e9d3be6c6d3bbfa Y = af3f813ae6646f5b6dbfb0f261fd42537705c800bb1647386343428a9f2e10fc Digest = 4d74631eb67fd1a6fa93ecb6e6112b6699e78c1d4c24ae81d0d5842efe5d93c2fd7a7863f8d45d1b2fafecbe41b7dc19c4b2bc208e014ffdc216e7eda0392a70 R = 6bd7ce95af25abfbf14aef4b17392f1da877ab562eca38d785fe39682e9c9324 S = 6688bea20c87bab34d420642da9bdd4c69456bdec50835887367bb4fb7cd8650 Invalid = Y Curve = P-256 X = 9cb0cf69303dafc761d4e4687b4ecf039e6d34ab964af80810d8d558a4a8d6f7 Y = 2d51233a1788920a86ee08a1962c79efa317fb7879e297dad2146db995fa1c78 Digest = 0250f93e6932887df519921f9a8dcff110be0768dc351ef73a940a579fae2d20061759e892e289c3e4ba5f7fe17d6ebb15c5931d48db55ebc81549f6637292fe R = 4b9f91e4285287261a1d1c923cf619cd52c175cfe7f1be60a5258c610348ba3d S = 28c45f901d71c41b298638ec0d6a85d7fcb0c33bbfec5a9c810846b639289a84 Curve = P-256 X = e31096c2d512fbf84f81e9bdb16f33121702897605b43a3db546f8fb695b5f6f Y = 6fbec6a04a8c59d61c900a851d8bf8522187d3ec2637b10fa8f377689e086bba Digest = f91b09107d10904d3968ec29f85e456ac4e828f32e8da3db6a13f5566bfa625e2ad03f8dad5425a073c0d61d25de63dcafa9f4fcd206f29e9cb6b0fecd74aa57 R = 1b244c21c08c0c0a10477fb7a21382d405b95c755088292859ca0e71bab68361 S = 852f4cbfd346e90f404e1dd5c4b2c1debca3ea1abefe8400685d703aea6c5c7f Invalid = Y Curve = P-256 X = 633c2ee5630b62c9ce839efd4d485a6d35e8b9430d264ffe501d28dbace79123 Y = 4b668a1a6d1a25b089f75c2bd8d8c6a9a14fe7b729f45a82565da2e866e2c490 Digest = 575c64df58c8dc517ce65b388fa3ed69470163afecbabc3fa94b497ff7f3fe36ff12fabe2b84cebbf667744195091e4e2335a71d36414e0af0d0260fc8e8ea44 R = bf2111c93ec055a7eda90c106fce494fd866045634fd2aa28d6e018f9106994e S = 86b0341208a0aa55edecfd272f49cb34408ce54b7febc1d0a1c2ce77ab6988f8 Invalid = Y Curve = P-256 X = f78dce40d1cb8c4af2749bf22c6f8a9a470b1e41112796215dd017e57df1b38a Y = 61b29b0bc03dff7fa00613b4de1e2317cfbf2badd50dee3376c032a887c5b865 Digest = 4c097f2f5b2489c94258b34d529675bb5d77d4be083b51b01188dd42b4b5473982728763ee6fbad479375c5eacb5edaaec0b6583a10b19aad81ec88dde2d0e7f R = 4a96169a5dea36a2594011537ee0dc19e8f9f74e82c07434079447155a830152 S = a204eaa4e97d7553a1521d9f6baadc0b6d6183ba0f385d8593d6ca83607c4d82 Invalid = Y Curve = P-256 X = 3fcc3b3e1b103fe435ac214c756bdaad309389e1c803e6d84bbbc27039fcf900 Y = 7f09edd1ec87a6d36dc81c1528d52a62776e666c274415a9f441d6a8df6b9237 Digest = 1a3dd21cb6ac1fa7fc196319cf534b7608afb93805420fcb5250dff453564a5b22e22971a3ce6dd222405fea018cd0508d86c561eca15e1ac7d79c14e916b86a R = 1cac13f277354456ae67ab09b09e07eb1af2a2bf45108da70f5c8c6a4cbcd538 S = 5d83752e540525602ba7e6fee4d4263f3eda59e67df20aac79ca67e8899fed0d Invalid = Y Curve = P-256 X = 5ec702d43a67ada86efbfc136cf16d96078906954a3f1f9e440674cd907e4676 Y = 05a62044fed8470dd4fca38d89d583ce36d50d28b66ab0b51922b21da92c56d9 Digest = c5c016f6c9b525987dd835131def77cc72d8360d364eeccdd7af8b95712b6cd487c0b846201f3b64466fd140833514ae8d765da395fbd9d3c03ca410effa9a69 R = 75f3037298f1457dba55743999976a1c2636b2b8ab2ed3df4736a6d2934acc83 S = 19d43ad168dda1bb8ac423f8f08876515234b3d841e57faef1b5ab27359b27ef Invalid = Y Curve = P-256 X = f63afe99e1b5fc652782f86b59926af22e6072be93390fe41f541204f9c935d1 Y = f6e19ce5935e336183c21becf66596b8f559d2d02ee282aa87a7d6f936f7260c Digest = 9eb2f9fa96a1f3ffcef9600522730e86d26d328ec0c1bf2fbfe55a38754610341fda1b894fdcf10c9bc4f48819010fdcf0d24f27ff539e40c6855cafbd306386 R = cef4831e4515c77ca062282614b54a11b7dc4057e6997685c2fbfa95b392bf72 S = f20dc01bf38e1344ba675a22239d9893b3a3e33d9a403329a3d21650e9125b75 Curve = P-256 X = 6d11b09d2767cf8d275faee746c203486259f66dd2bfa3a65c39371a66b23385 Y = 4eb05c73e05261e979182833f20311e5366f72f4b949665ff294f959375534c6 Digest = 0e71b28b0a1eac7aa881c09daec616c93d9a9286b5f5fdf2642d211021b125fa884b2595b73c7c3e649e61cd7157ef6660076a3b87ddf830db46533f3aa30afa R = 15a697cdb614e11c0810e1e764cd501fcabc70874c957587bc4883d9438e177f S = 7bf6244f92bc768063cecb5336c8eaacd23db930b28703560f241c7d93950dfd Invalid = Y Curve = P-256 X = f3899caba038efb534c4cea0bd276814ffd80194473c903b81af11c8c05cb6e6 Y = 6ea6b17402fcf2e8e737d11ffc7c2ed3b2d0bc3b8f271a381f4294cff62682c3 Digest = 104ace16689d785df09a81c5cf47a496db30fbd696aa4df080219487575a23641436e70329dd1c13290582c0d03aae200e51189d43666c86f38a5203c16cd7e4 R = 57b99380452e1d37b133c49b9ba493dee8630940477ca3351a43d90b99871e6a S = df599c3a37105af3ecc159b3b685ccb3e151b7d5cf2d97147974ae71f466b615 Invalid = Y Curve = P-256 X = 1fd6f4b98d0755291e7a230e9f81ecf909e6350aadb08e42a3262ff19200fbd2 Y = 5578fef79bc477acfb8ed0dc10c4f5809c14dc5492405b3792a7940650b305d7 Digest = 761a54f3718985b6d7bcfdd57d6c4823f854831bd29305fcb07e34e3f825d451fca28a62ce9582e3957d89ea7c1bc1afe3aa58fd2fa18566974600fc394cf2a8 R = 97a99e96e407b3ada2c2dcf9ceeeb984d9a4d0aa66ddf0a74ca23cabfb1566cc S = 0ecac315dc199cfea3c15348c130924a1f787019fe4cd3ae47ca8b111268754a Invalid = Y Curve = P-256 X = 2dcbd8790cee552e9f18f2b3149a2252dcd58b99ca7dc9680b92c8c43aa33874 Y = 5dbc8bb8813c8e019d80e19acdb0792f537980fecde93db621aaf1f6d0e6ee34 Digest = 45b082e804443b53a82229cdf13e4c5f8f31fe93170cc8a23f63eef506cb7748388e1a971a2f81e3daa324cf2bb69118f7418f40df66a24f50c34a55e1416c3a R = 2bdbd8b0d759595662cc10b10236136ef6ce429641f68cf6480f472fcc77bc9f S = 7e7df0c8b86f7db06caf1610166f7b9c4c75447f991d5aaf4dea720c25985c8c Curve = P-384 X = 6881154cfe3f09affbee04cd387b27b7854326faf8906c4b9c9e6ac2c632e0d59717b3f33f6d747d7b7cbb4e4dc01fb8 Y = ba295ae0966f06ad9d84b3bb4da7f99b56044c99f88d71082cfea6964ea3c63bb79806a6a41fcc314b55b3f64f82b68a Digest = 8a6429d55885146f7aab582a1aa9360fa9591b0a R = 2112385a75d4edda89ae2bc3c74524dc792544a3a52fdb588da3f0feaee6a11623db275e2ab8abdd998cc42a29c60856 S = 8d308a3987b81c595f8cec19898b1a42da8eda97496af280033b0f915283f171fed7e2a221fa9c78927962189333f437 Invalid = Y Curve = P-384 X = 2f2f43f244ae027c3d2ec5c900393f80a8ad0e9b9a12a047195d29a39f2b7026b071688dd9a6764379d02a5ed8035ec1 Y = e43d45851bc76c37d34dbed996a65ffcfbbaf0e2cbfbc9f62d2116bdf3b330bbef5acdbcd0aa6d949f771daa17cda1e3 Digest = 5f41322db1a276042ae807f0f0d6f1e04cb5cd26 R = c011c52e9cb02048957a233704ff9a2c1d4c56e08ebb083aa8ba351f041a23a7d0da19088ac6c60ea2ca117531c7cf35 S = a66ca9bf06c35d129a8253a0f793acf681e482d9994868b275a230b215286e03a66a0de77c7a53174375137fd4688556 Invalid = Y Curve = P-384 X = 9a5e1932d318bfa7986f0dac4489c6f55775427bb60fb24bac7646b9994bbc3a9b5cd15e818cc4e832afc1c3fca9abae Y = 64c89e7c3399c136b2718ab675944207157f0bf23d9e2a807ae7ac3bef81da7ec3c56c2d2c08afc53301af2a3cc71861 Digest = d36ef9ee70a3b61ba31cdfcd0cac6e49331a407f R = 4cf6c63fea6c80efc105cd99afe2b53da05ae16566ddb20b9d40a076575ffac419b6807fa336fc6e7c7416c59775ef09 S = aec2d96054b4b23c49faaf9903ccf63bc96281fb7c1b9d14daa54bba51bb2b2f4d3a901f3b0b9cb2b62976459219350c Invalid = Y Curve = P-384 X = b3aeff27b65540c6da10a88008404b1d49239c87fbf47932518fb87a9bb132403d1f310f531d086340bb4a68c3e64b9b Y = 567e75f442fcd81017b8adc4cce634f5ffa3cd497d38221d34dc1f43aef99133131ff1b197f7b9f37beecae5c438849a Digest = dd0f9c326fb50593fd0a0df31abeeb00a22eb956 R = 3b94a2514eb915b71e18c867ad7f508a35375c5bcd4b797b86054798569870b2477e2ac14406628017d829400efc63b2 S = 179a10441a0beea3b375248e697e0d19e24bb68184c373fe4302839b97dd7353a5a25929c2733796b0c0d8211bd67c51 Invalid = Y Curve = P-384 X = 0874a2e0b8ff448f0e54321e27f4f1e64d064cdeb7d26f458c32e930120f4e57dc85c2693f977eed4a8ecc8db981b4d9 Y = 1f69446df4f4c6f5de19003f45f891d0ebcd2fffdb5c81c040e8d6994c43c7feedb98a4a31edfb35e89a30013c3b9267 Digest = a871caf9fff9856031a79a55b96753c1a34ccb73 R = 8d9d3e3d0b2b2871ea2f03f27ba8699f214be8d875c0d770b0fff1c4ce341f0c834ac11f9ec12bfdb8320b1724c8c220 S = 62150dfba8e65c0c7be7ef81c87241d2c37a83c27eb31ccc2b3c3957670a744c81be6d741340b5189cc0c547df81b0d2 Curve = P-384 X = b4b92211edbd41c5468d2ba70810bc37b5e7c954c7bd0db80c4fa89ccba10bf07cdab953828a068bc0104d28e4040c14 Y = 93ed318efce3dff98fc782b788d78658ea5ecde4f716e2d5d0ec2d87a2e761daa1f1658cfb857762caa567baaccf9924 Digest = 765343d50541bc2c0e20193648048016a95e7588 R = aa3978eabd196ddf9cab2815cc9cbab0b61cd639deaf70e093a10a58ddf9f410ee1ab965ff8fbb98efbe812421a613d3 S = 02761a2947e1855806b8a25b9ebb0762be9f5517461a371e5783f34b184f32c4ea684b362119b1a2d8a3ff439f10291f Curve = P-384 X = 63b4cc14f9efd3b8f29e65806591d1e9c54f34a3f5231339bcdbfa4109c42d946a59cdd7bbd2591fd1b2383a0819772f Y = 55ab3d208109da6ef039c23cddd52a5af619266d8fe066dcabb1af885ad5501401a78c44ed3b5fff2892fdcb2a3ac8b2 Digest = 4535ef8d7396b4f2af65660ebbb56f356cacefd9 R = a3f9b840fd7201356f35b5dde39027410aad26ac61919c14fe7b0535bb74e7218cb3312bfa60aac63f14166f32ceff26 S = 1b1bcbcb0237fad4e406c8d4e3e39b55642d8535afa9ccbc9c601cb4e01891df79f1bc792687cb3a5ee7703565c4a13b Invalid = Y Curve = P-384 X = f82f82f8f7454ce7a94a040ec0bbb52d49e3b9f8ddd095704973c760ee6067a5c28369656f22d70d8bb1cd70ef9bfea0 Y = 0e36e256d02870ee5646a17aac4b280c9d1d2e1d4803eb3cb32e7f754cc889522120efd7c4d8a82e509a4d8f266d3ce4 Digest = 26302c41e6da59e2df2e26c12382738880be94cc R = 27a2332f3c59464f5dfe7bb1201a3936248d375bde603724c048eb8f7c0c2be3ed4b56c14b51d7d68bd2554526b36d9e S = e1f90367b0cc530c545f95163d9ffb1208c943685d5ae221052b83ee40953397be581e5979c9855b20246e9d26d57acc Invalid = Y Curve = P-384 X = 7d40b51127cb1642dd8538d4124138a2f49c41b4d12f702c1b0cec8deba50c3712e01c2e1e693e00438af0e86025da33 Y = e734b5939b673c45dd32baf20d234f01b7124b391d14beea231e9c604e813fc83b3a77b0cb1f2ce4873a69b0165e369d Digest = 0b30b209147432207a72177997d28d6f1d03330f R = abf16821b6657e0005071f78c679cbbb130bee6e7ca63526eef0f747fb721feefe6258dae1aa02064a700e963bd9dedf S = 3f7e61c34a30cc5ff7a8be375fcc9c38a76dbc0c30a4356843421ca37a7bcf24edcd41d8235903bb522fb6e5a8033885 Invalid = Y Curve = P-384 X = a5b59d59599c105e39f61354da99c7c9135c749cf996cc2252eb83b008299cdafbcb44227d2d2c4a5ffa44823922893b Y = 0399fb0edcbfd0b76b524f22b7b87ddbb4fa02f510661615312a4492eb3f2001e0fc0e479f77c33a88f9a7e20757373c Digest = 44aa3083d111bbce7feb412af74a782cd320becd R = a4c9cac2409a9bfea1ebe28fec4e19545f08cd18fdd31048f52a3f2d32b2ed859dcae4dc12fb2fecabe542c4f03191ba S = b4d83f927ad1980d96cbb0ccc36aa640f786293b8b19e4dd97a797d192b420f630a5e42ac42d8736e7d42008f445dbc1 Invalid = Y Curve = P-384 X = 29178ce9127e1048ea70c7d435439e9ff9915387e51b7e5ca10bfdafe53565978eb3784d9a4226f443d4834f4d451685 Y = 5cc2970589a453488649711bdf3cdac9a200519aae65b1c6bd54fed0d965755b36b74d978d674275bd71a03e8f054b0e Digest = c679b4a0e61406c4869d721192bd314d77e1cb39 R = 5d6f5e9a94d9c92a0890c558bc0408b3405cd04e33f663df16701e80520e4394f1c54d3c8225d36f4753a799aaf6ff90 S = d895b1cc522ceec6a7867867b8f603245c6e4d48945dfc43af721ebae4683d40a3c21b905ca3bd4b974d36806825b2cd Invalid = Y Curve = P-384 X = 9f03569f8c6ca2c16d707f0ca36a8a8cf214a9d5c14034829d709e283cd675eb4e3090c6b973429efdf476c0782e0a7c Y = e1b842536731e91596782787d57af17db85dc92fd2fb95ac65339174aee66775ce0a4721d1faeb29da968ea5eb705e59 Digest = ae1a63f88a59c7da5d9f512d11bbd5d75dd1f583 R = 31ccbe22a360b1786dac89394c6ef4ed6604943e50837395f96052821f6182914840096e90f2ad650917bd91d7bd4cfd S = d97199a6b952dcaefb1defe23def92bf2ee236ad18046a2ccf8924d42ee10a62e70ffe7f3c909b11112278f160d98b7a Curve = P-384 X = b85e78a935d169dd5ba8f558f964b21c07804464816f9231233184675f557463a8b00470ac0ca8278cd008f4642e7962 Y = 8edf7be8584c5f207939d479e65173e2e69673090a8538fa93efb4432127895d92b4e4cf13b7632a830e9a33b37f75e1 Digest = 811685f7ff2701e692f6830a33d8712d0432cd5a R = fd2876b250a94ced71734aa7a0d32423b2c6f039c926c557e748f38e23bbdb46e17d1204832c6f76c3ea854e1da23979 S = 76409e381799502c81194ba87540aec0b89fc4680dd683780d49f82a46a7191b40f5f06ccb02e45e704c31fcd59382b9 Invalid = Y Curve = P-384 X = 0c74aaa0527524cb6171ab741896b405a6ac4615e474cdc09c9457b18bed33c6383e1b92f2fa1306e8e5dcd1667e45fe Y = 7b00d934dfd876f6e07dc0582b20ed650be104fa603a5a1255c62b6059d2685aa9773f1ba31254d213c815d0efc8ed93 Digest = 328029316d73d1b8d2b8927d12332036e5671384 R = 832c62b0f34986eda9d1ace5068a0c5318051b0d0166d3dacf137ac072cc359f109ad6e17059e700bb1958bcf4101246 S = 6bb56f4eb550688ea66e5dd09aebe7e0b39e2716b4697ebb68f113e080f0ff26fd0fc947a34f3c5a8a2f10e07dc1405e Invalid = Y Curve = P-384 X = 4104de08b4108ee26ee239e0a5d340c1b1aa48b1b3b40717debd6ed3ff0d777923c106f857a3830ce7f3d08d0d6d7908 Y = 00498c38393e6393edcf254804558f86e461df1f5a6557bc5144f8d2f3806413d372b6ce417d531c08a52d1e38e8b949 Digest = a13ebaf4431c43b684d1e18e610a75fd7527200e R = 9924a3273248db20db007309560a0e616572ac799d773529a5215786cf4a6e03cc73bea81d4810c1eee4b5e975652eee S = 6cc8ea4c4c56da87c25946a198e86917227bcb90da7be1dcde7b6547bc45a98e8175dd54af15bb6ef955b4cb48b7bb0a Invalid = Y Curve = P-384 X = b6bc9418f3da0cce38a65f1b52bb3a9d22a0368e02f5f12fa1f1303ac67df1cffa55d049a782bf5bddb5e841b125aed6 Y = 3b578a0560280a2958a14286e10faa7f5dec77fd8d90123aff5780efa8a636cee833fc9f10d7a164f1254a483b613746 Digest = 7b44de2e448107197558cb071bb5bec9a5849467827d29b2c6625708 R = 6602090aec001c16e5f6e7e3e488bed5d1702d36b258b6a8a2d8392a5ff30a6af12fbf4308d67eed6aaa8b7be8b831c5 S = 65d0c3bb1910ba0b7cc108ae1ccaae63405ff01a8df91021e17cd46aa6f8ca8f4eaeac6d6fc26fc816a3ea537fd9576b Invalid = Y Curve = P-384 X = b4ab83a4ded7d76aa15eaecb1bafe59427d3cfc38564af9123cb707da2405184acd40a6c093ba29e321ba0f67c1e0c6a Y = 26e2902499495f8550e798617a44ac9990c4c1cc3527dc0dd003a15aee3cbd3955151f7863de1692a94aafd3730e7665 Digest = 8f902a34f36d7cd36748d5ddcc8fba6040be223a462842d506f185d1 R = 61e48d5a100049578e820768ea57f30f27ffd1a1f839fabc55e8f4816c9b95d042619cd3bcc7180fd99834e344f53e7f S = 977b81d43216f31d8bedc3ffe873047817de3441df8b80a321aa0a80931f25a15c6628f43cf8e48d5c6aeca7626b0a18 Curve = P-384 X = f886f36fcf34e8df2a7e09220051b9981a3a6f693ec5999f28864e012c13896d633c9564f0118a95631cea8355b25b20 Y = 746f9a77835325f18338dee5dc88a9b086b858ce15b4e4462a98844bb01811195f4fae0bee8f457c32823e142210dbb8 Digest = 6a80377d3c7f0e6a50f6dc1656cef5a0d33cf7934441244f69f0062a R = 665390653ed280b8f6bd3718d8423f26cb38d2d7faa10fc0f094295677d9dafad45fc64cfc22ded56afdd86a77cf3c33 S = 864f0eb3a8d93c388d987cfcb60bba76098039d46bf4ff4be083961f70a29e724c25cf56685802b7b5be048107ad52e3 Invalid = Y Curve = P-384 X = 5fc835a2f5429adb719ed22f11dfcb02731da6759a8ea75c21d1af9631187626c31e191f4dcdc183df01c48e13dbbce6 Y = 9ed2d03df1cbeaefd4478b8106e90f92e0b6e958145cb81b9648aef0b96b71d1d55918564694b1987d68cc8e7cbd7dd1 Digest = 807f609592e2ededa12792a7006a6db641904e86a1df3cec477dfd3c R = 94d9dedd27f2d014ba84ea58d2e88d68f3e86ba88b93750e50255211effe88b0a0e2f62017f22965726cdc77c55bca4f S = 14814bd09d9b7ba81b2485777cc588b5c0a4064df95c63f18a8bfd57494cd0f40c5bda9dc6c01ea72540f57a354360ef Invalid = Y Curve = P-384 X = 0b86851d7c19f0f04a16e5e2903a36d09bf1863e152d87936fb2d74cf916bcf6dedf3c066d242f7dd327df0fcb42270a Y = b0c93480740bb635e6c25fb61630fdfcc462a1418366a51b1265656f721e18ba89ebf754c7dfdad865a252c884a6c4fc Digest = c34e896a31fc4de7596679e12bb2416a51e58e8942eabd5cb01f0737 R = 33fa5fe3e495076e90f4b62753d3cdc7603aa7f5b407dbf89a854b9521d15e6c381d3cf28f103035dc4291ae318c5f82 S = 30919a2a3fae71e1afe8378aedcaa08fadfab6c6bf954031452d4fe514969ede2acf0347a2f1e81abf1bfb9d8bd55a36 Invalid = Y Curve = P-384 X = 6f8f2fc40d1db28309c8850bf94d77c01c5449b4fc556e6bf50e5ee805209c4489d8ff9bd781699eb0e42f6a962d56fe Y = a4c7c77271dbbe7e00d1c6e4287dddc5463c6803a577a18f89a5eea01c6addc12404353abbc128cb9cf2496732312d65 Digest = c19cabc6141b2adf67fe4bd0a3fead50473dea8cb0276de1fdc467c5 R = 327c4642019a635d80dab82f7dc22e3102a3c1ba684c2b6de67d3d3009a17d39ae3d58ca2caec9f6f03f5ba3b406178c S = 6b1af807cc7265cc6d3049959cd7779ae0de819036647f9510b0e9f7e4c0e3fece5fc3741b68881145a2c944dc5c54d1 Curve = P-384 X = e98ba8016a976dcc3c50127d2af792969835b1096b1644b37c004d1786f4fb1026233f33ad56cd9444ba0a332c92efb8 Y = 54bbcb78ffa3c855dd24bf182376ff5d28dd7b7551e4b05a19549c9f59c83dcc12a43092d63c5967fc0256612475b7d4 Digest = d8d9319d3f705d03dfc992e8e7596586200fb1574f2a918350deb268 R = 3b76a0c0ece2348085f3554fc92b9e5b0fe84801ab2adf1d239d7c81c9697b62285e8e5667774559d1bbc6e86f2ade64 S = 91d929e42f8223ccc74d4cb09ee7eb619d3a348886c21091ec55d36164ad3cc04e1da6edd88ad89710a908ca4bc00333 Invalid = Y Curve = P-384 X = b8d7a836715635a8b095d3712817aa9e6ffdd98d24be2db751bb0c1fad42b082542500ea255cde17525ec159afca7002 Y = 1a526c876d4771157b4f66e3056485c95066d4bd1e73e991ce6d5d3642807efe80015c52ef3cf8c86e57ab9a510ec86a Digest = fe23e8ab9dc934144247930a48babb0d8ba57703c2bef60e0e9a1e2b R = 9e36f47ec1b7ffdc6e3472f3cbec913494c0bbaa0c073f597e01845b5a3107c0e23a4575de4f2b582e1c2fe3067ec048 S = b013cf51008a89b379a2a6b519b8d229ff0374401eae21a8da350fe35756b94168e7fafbd81f0f681f21c056941a82eb Invalid = Y Curve = P-384 X = 4ffdecf5d5f7c1164297a93742c8a685bb425b97fdfe85f630dab2064ab29e52a0df34629c2531048c288216723fc9bf Y = 84fcff3e7e478a6932ace6f6b0ab70e61d8a5137b76886c59e721d938e0e252e2f7e57c2ab7dab90493446ad85c3fe4c Digest = 28d44c363bfb2e36bc59bb68c56e8b5d2587f149839fd3b8c05d9eb3 R = 7d909d9aacf064c32d070c3149ace8b8f5d83b2006e8460b84c4bce664fc20e91c61ac8b415965b6155eddbe9238fe3d S = 19d909e358e71985179dab9113941ecad21e4f3608cb3a32dd065868af1657df8e06aa86855ac7ad757a7f8fb568a953 Invalid = Y Curve = P-384 X = e805e0733fc156bd582faaf794e58d4630ce73fc383cdc964dd337728f774e4989a697d79665a3282ee6e0ee343d6c7b Y = 43821b7b9a6ce1ddf0c59ada552668a0cfc85a87a610b5c36b7a691947116b49a4099340306e53494fc6b496cb8d12b0 Digest = fd1bb27d666e3d40f5bd19d8c026a3614404b9edc11e582eb80b044c R = 3d4fa4ec95b55feac607fddc618d6f4eed71da65dc49d732e64460e5c80c57dc4421c64bacf3ef1e22995fd19c2a3cf5 S = b11898ba475f2b28402d038afc15f171b99aab93437b35a2f8a3b89f42fdb7f93a0469d9da7652882000dd5bb1e8b9a8 Invalid = Y Curve = P-384 X = e15c7ef9791b9392c3e97389f2597ee161545c267e584b94262870ef25fda348f72349f396c27ac884fa8d776387fdd8 Y = 107b4a7da8be564a14f9c45e4df5cc9b62f0671b3f2c0573c33fa37f985fefd1ae3ff2640947ebb12dffda72757db6af Digest = 3d9611421379fc93226fff23f5fe472a33f6bdc759d5705f7e9a2be3 R = 9d715fd1a3668283fa83c407242e8d2a4f3fa1bf41919ca4101114bd0e0ac1b16c4379edb11de5210eee8618d42e9ed1 S = 2dc37f453c8cfe01ea80c56d1865daf0f28847b12970132a1853c3ed80da6693e0da47a2476207947f29da34d68d604a Invalid = Y Curve = P-384 X = efcb97dd73106b0a2be4f665c496352f6938da9d0fa97690dc0e8d018b06dce2ba8d19b93ddfe889d549a33e64497c31 Y = 66a0cb7e64f40470b6d09b9e12f217b59e9e6615af52fbdc4ddcb379e77809361eca2093a3e24c7103e971567018400f Digest = 5598b06acf834ffbb2e50784fe2bc493fa51967f7ffadf1ece63f9b2 R = 4ea5d4faf8ee52540db2f4c6283cea5302a3540a56e14c8a7533441c248465be99e10f23bba85be9634efaba7a8b172e S = 4c98a2142ecaba7db44c78658efffc1175f810a147306ba2e6498553526adb1507d7a99a372e0f84c8dbd160ef7fd5bf Curve = P-384 X = 4e916a3cf2561580b49ecc52321db7103292fd2fcce8dd4d6f86be6035808e0df51c3c4ac1894f0b08ef6ebf953e0d18 Y = 4e6f28895d024b4c71220b27052ddd4bf6115a260825acade48c043b3e06d2b6b8e4ebdf465980f3b013cb575d475bbb Digest = 1668ee6ae19c2d6f23b9184b6895ede8f55549b23095d53ef89487f6 R = efce00544ebe0d98ba6015c07e3e9d09af808d49a0820c22ef572a3ef9c8a684b377bef1f8b3bbddb734b9b0bd0b1cd4 S = e80d0e183b3f00098308e20e5b4ae393a07f1d1a8defda9a9d10f19b3e5236e42f593b1dc57f6718dd8d4583f0175ff7 Invalid = Y Curve = P-384 X = 3c6528c82d9d5e8dddf41a211c70f78604d81f49853bdc746270f1340a2a645dca3bc7844c3680268fa5973cd1758313 Y = 4b9e697f1caf83d3224486bb0a8cd6a7c56e47c91043d8cba3aba51b6e504441d37abcc9b7b2d49b9126463703e514a0 Digest = 1b39217bcc5dc841b32ddf00245623c581f19cac8a4ecd03eb2c07f0 R = 848814c01c3d18534f39bcd53a8736db16f0f77a015a0e578cbb2f831739723e83b29cb6d4eee7822c76ff056d0f467d S = 05beb19f766bd1d4ec5e65786042258298a2dc617e3f13d8e2f0f4b50d934565f3162c737fa791a81897397f29305943 Invalid = Y Curve = P-384 X = 80c3f6488dcd76f33cdb75e30f8452ab9a3bd6110f14e25179b0aefe4c19c60a07b4af10844b130b0b75a7024e341298 Y = 6c85a17ad4bbefb33910250e05ac02a17c892c3380712d06dd070843dff0d040e219dae78679b774cd5eff0adb67189a Digest = 23cd0066d1d88702c5d4461deff89aa5662b517806a04c4da30e0d82 R = bc444deb0c7dd9f96f20a7ffd3ddb35a1189316655531860c39b5f87f09992106985e5562e083ee9f538c8e2d5363c52 S = 91adde5d47eae80a98661f4347fd6e4778478c3d4aff3cff8aa92e2345a8e03cd4ab64adfd38e461bb98b496516439e7 Invalid = Y Curve = P-384 X = 97c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d Y = 553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0 Digest = 647eb206a8477440b4bd048d00f37dca8635b15c2a8e79e2a9d74fb9a5553211 R = 7b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec S = 4bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6 Invalid = Y Curve = P-384 X = 08bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbd Y = d9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73 Digest = 9a4985f744dd6f2774cb6f20ad6b6969e212abf4ac035b72ad3f8b1955ae1862 R = 8b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c S = b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49 Invalid = Y Curve = P-384 X = 10a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80d Y = a1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e Digest = f5b47101b4ff9baf64aca830b6afbc4f9620035d88a1d84a12cefa6f7f99faf2 R = d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f128 S = 0cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673 Invalid = Y Curve = P-384 X = 8760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cf Y = ebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc Digest = 979131ca1d07e0b4ac6f27b20a978e0a230159eec4906db5dbd22b10ec71af87 R = 1db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d S = 3e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f Invalid = Y Curve = P-384 X = 2b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de2071 Y = 33f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934 Digest = a1daaf888d93a2a7e52bcd2a66cca3ff2e02916616d1919adefdd7257490e5b8 R = 23d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da9 S = 2cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb Invalid = Y Curve = P-384 X = 86ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66fae Y = ac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38 Digest = e3bcded61cbb0bf6ec20d59f91e8e73e532f15b082b89c984c1b51fb0d1db8a9 R = 798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8 S = b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b Curve = P-384 X = 9e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d Y = 892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3 Digest = 0f2a9b447ea5cfcfb9e67d661d7f0752befd3b4e3454fe40b9ae1eca47806025 R = 2452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c S = 499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38 Invalid = Y Curve = P-384 X = 0cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429 Y = fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4 Digest = 331aefe2369b9c5ee6dd9f850259b3b8512f5934434e61573f97fe2c1cd2b147 R = 3812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c5402527 S = 5dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398 Invalid = Y Curve = P-384 X = 6c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce99994 Y = 35a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e Digest = 153475076a003545d3ca3d4a772866f12cc85f6e69f8c486a91a80fd709206b1 R = 89ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed S = 8dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04 Invalid = Y Curve = P-384 X = 499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075 Y = a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed Digest = 5f00b3b48c1ee8287abe6f3fbc3438b91f4268f318ae2aa1e7810369d6716020 R = 25d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5 S = e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd Invalid = Y Curve = P-384 X = 9a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da7 Y = 6f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced Digest = 45c3a1b29a18780234f12f5e4b64e7af9de2acf0029ce55b706cc79a7e4df994 R = acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af S = 7f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa Curve = P-384 X = e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533 Y = af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618 Digest = ef1057d83a6e6481be7caf2c12c15f085ff971f02f0db8544352558e2b9fd61c R = c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad7 S = 2ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205 Invalid = Y Curve = P-384 X = fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f57 Y = 18c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e Digest = 0c7152ec620fe9b783625196b41192dd5d49df184ad26965c970ac5e28bb1c4b R = fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f03 S = 485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9 Curve = P-384 X = e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac Y = 63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d Digest = d925955406f6b6dd4df05270a2539a5924830dfbcbf6a5a34f21354db246244b R = 96c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a1 S = 373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96 Invalid = Y Curve = P-384 X = c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d007668979 Y = 6728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4 Digest = 6d5fa5b492406a1e93df6bb6364d7b17a24ef43807a1159acc77486dd7b49b60 R = d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f5218 S = 0941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb Invalid = Y Curve = P-384 X = 1f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b19160 Y = 1c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c Digest = 8cf5e81c6858b8395421d8c913f1ac887e282b5818eab525fb79feb9bc64bca7eb98f94b9e48b705e6c28311bb0ca672 R = 3c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd S = 9de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab Invalid = Y Curve = P-384 X = cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144 Y = cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb Digest = 965b83f5d34f7443eb88e78fcc23479156c9cb0080dd68334dac0ad33ba8c774100e440063db28b40b51ac37705d4d70 R = 33f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba S = 4428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae Curve = P-384 X = 9b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec Y = 695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6 Digest = c68382d0641ffad850c41365a8ec68e3d55acba376d1bb941e7dcdf7b71f37b8288b023b942373a40be1dfaaf4aea633 R = 202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2 S = db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981 Invalid = Y Curve = P-384 X = 5140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31 Y = ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4 Digest = 4b945020c329a61221060e924ec682eceb842c09537fe26265ad084753b89f7650cee4e8df30b38126984d80fd25d246 R = b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f S = 0775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e Invalid = Y Curve = P-384 X = 31f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1 Y = fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc Digest = 2d6affdf541609f649dbe9fd5829059bf42021fcfefee42d8c9cd5c127015c06b4c3c13ef56d08767788955887752e44 R = 706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf S = 42c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490 Invalid = Y Curve = P-384 X = 1f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bb Y = f11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4 Digest = f4b0a912331e7fc59a7071e5f47c9dafa6dc09b32c5c3d05301b3833bbe0b9168e2b63f12248849572a322b2f5423b8d R = 3587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c S = 73a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30 Invalid = Y Curve = P-384 X = 2039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6 Y = e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc Digest = cae50a424395e38bde9ba31fa5ea0c107ccceaff06663719162aac2c3e15f2b2cfd376f90d371326e1d29e0392a756ee R = 164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f S = 4e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54 Invalid = Y Curve = P-384 X = 46dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e Y = 79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b Digest = 039fe89dfc54e7f2162545af700a8c49a1216b08854643656b07d74e7032516fd0c9368c5e5ce54655e4d08baa29b6f0 R = 5ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac S = 0d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4 Invalid = Y Curve = P-384 X = 097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f Y = 716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66 Digest = 02afb35f1df33b3d83df3391ca4184121ca52f520dd12ffc891aee77eab6503f232a5b1231bd997239751f46c4133edb R = 1c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c S = c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c Invalid = Y Curve = P-384 X = d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511a Y = e585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe Digest = e66b11b84f87c38526438e5e3c5b4521248c358eaab80e40526906a05fb29d14d4e5686681f03bc3f0025d45dfb83b5f R = 49c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f286 S = 1fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7 Invalid = Y Curve = P-384 X = cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60e Y = f2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6 Digest = f6325d6bcaaaf1aba1197a290b33974f2fe8af200d5d726e78705904e9894ec31988e35dc76b9976834b7cd1c4c67146 R = addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f1 S = 1c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e Invalid = Y Curve = P-384 X = a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02c Y = d397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec Digest = 709d1bf45b5817f5a67b859651eb47133ebed2622fda09ab66d3467b5e95da50ecc2c74d8f4d289feebec29729a4bfa3 R = c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe6391 S = 6b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0 Curve = P-384 X = d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a6 Y = 21f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3 Digest = 5d54d236db6ab4691b3d50dc81471c5d388e5735ebdd435e9742a5a8a0ad0e841bab57326c8535a680ada57d2b3a70fa R = 6101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd4383 S = 4e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f Invalid = Y Curve = P-384 X = d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8 Y = 062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661 Digest = 67cf9e6f9e9558a379ef7361771323a4f3925f2c7a5d94d9156bf2d9d45f9f8fc4d47322da622fbce92fc764a2ccc327 R = e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c958 S = 696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389 Curve = P-384 X = c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f Y = 42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e Digest = e8d6b550271b486e79f6975cff753d49519ed9393b207af7039b4c070cbc2fe7d49dd1bb87f7021e442fadd80ce8a5b0 R = b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44 S = d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344 Invalid = Y Curve = P-384 X = d4e93c4bafb54c06814011309e9f3d8e68b76a5452e364ef05ccc3b44b271e576c9028106b1584f09271c886d467f41d Y = db730ccfdeb6644362f4fb510d5254bfe6f23e891e936132f90f1913e93baa8b1f8c0613a0f0c61a760ce659f22babc6 Digest = d5c82ff11f555ce21c3f20a9ecfa6047cb6895e32fa0fb379f49085a59f61b7c8fa05058ef144cf47db5738fa40f4890cb59695998a2358162bbbf6d7f53517b R = 8d0fd14a59c24b0c2a34b438e162f1f536fe09a698cacfe0760d026d1593265d02f2668d2a5e49ac0b21e93807aa9c18 S = 3162ffd2adc9dd5ec1bb1d97d2b0c27b8ae234235ffb374878d0b76382002ea505e885c178d56a2d7809bd1d83117ef1 Invalid = Y Curve = P-384 X = c665feccf51e6bca31593087df60f65b9fe14a12022814615deb892eedb99d86069a82aa91319310b66588185282dad6 Y = 1e6e25bb8ae7714415b94f89def0f75dcb81d4af6b78d61f277b74b990c11aff51bd12fc88d691c99f2afde7fbd13e51 Digest = ea056beb112fa9aad69c8dfe51ea947b772bf1c11287edcede43a98089d21492ed581edcb6d1823e2873aabba213b84291db3bffa6eac3ae43a92fc2da276a24 R = 0e18c4063137468fe864fdc405ad4e120176eb91b4538b28ce43a22ae1a310cc22a2f7a2b3a0f3d15e0f82038b4a4301 S = 5a1620e42041ce4357daf824befbb2ed65596bcd8214e88726149b26b1f416b9472a8877413f1c3705fc2edf4731943b Curve = P-384 X = a6bbf85e8068151482ce855ccf0ed22988fcf4b162c4b811cb7243b849299e3390a083147fbd68683203ba33588b13ae Y = 5c837ec9f2eda225c83ab2d5f10b1aa5bfb56387deebf27ecda779f6254a17968260247c75dd813ea0e1926887d46f86 Digest = 81b1303e10f25d37877b09f9d82dbd894e40264992d86cc74656ebeef505b46fdf9dec312a7f0a26e3f56a7195d5b01d198c378fff9d049e00cbad9586da20c9 R = 9c11879e59659848274fc1ef5a6a181af813d23708b09a24dc06c089b93b918828dd938a75a34d5a681b0af362dc19a0 S = 9c362231962ba7579c4a874e87bdc60dc15cb2e0677149c8ea31162963e05a6614616f67a5269616071cf095be7ff44b Invalid = Y Curve = P-384 X = 9c1eb5cdb1a873e4c275b7ded8712b9058ee0d9ded06c96a2a8d7c652b82e894e2f918dd8e18138e5c34821744b97952 Y = dd474c93619f02b5d4fe30ea7805c1a13fb80008a81bb5f3eeb95cd11f38841b8e34d64f2c6cc2d6cc2587365eed6b6e Digest = c0f9ae90fe8aaf54962e7d47a832e4ca6e60355e4066cd2b08bff78650d4e4a5d1eb1de296f9f0ef92887e09f82e0db4411aa9c3c6b109159bd39feed40419a3 R = f17b2f2fa3b5c8e9c62a633e5d417139ddf3dafba75b464fa156c99b3948a0aca532c7fd3e14a266eb17e7fa80881da2 S = 01c246866983fa74d6dff38b1ea091f8afd218b5a42467761b147c19a3bb20cd24be8ed1f95f1e61863a709d2d0148e2 Invalid = Y Curve = P-384 X = 20622a293edc96d83fee77cf1ee8077c61d6f8ed0073d53cfb5ee9c68e764c553fa4fc35fe42dade3a7307179d6fc9c2 Y = 710fa24383f78cc4568fe0f4ecbbe6b11f0dce5434f4483712a6d2befae975a2efb554907aa46356f29bf7c6c2707c65 Digest = 5cb8ed471a4001e280a0927faf25183c857b9b2de21c8566e8a1bf04ee085c36db7fab9d8f627898b3bb23c10225305938b56a732659f2cab3fa857d80dfde19 R = 45a6cf5cef06256139caa709292d1e0f963d176add188572e9c7be29af21a95853a98e23aef0a0850e58d44d60b6d780 S = df8d71cd5ab22fc718070078103483e5258734872ab935435f21ea199018e49a69c064a63801beb0759fde6e2c4a85b8 Invalid = Y Curve = P-384 X = 83a4fecc0bf0a353b0acf6f54094b822f2b12564e172b296f3461cafa7315d7d31d0089b1b4c18ad3c86bd18f539774a Y = e4fd57c5b2937e6fba1e7d72fc3f02352bd79c13611931935f4dfd073b9379f862f2277585137e996e212b5b6533dcba Digest = cd7c623c3c3b52f46be0ebb2b353ff97db3cd7dfc1a059a57668fc50101aeeb37b8aee9ddda8ab611546999a120cc9acb0e2c3df48dee66d5c31a46a7be94bc7 R = fb02804010a570d702ebfbcf3d6cc9d55ddac2bd4b4de56d325e9790571b1737f91d3fa1d4caeec6eea806195aed3187 S = 1fd20fe383e907e77639c05594642798619b2742090919bedeefb672c5700881baf0df19b9529d64bc7bb02683226103 Curve = P-384 X = 208a8c5a6b59458160c5b680116c8b23799c54a7ee8954a4869425a717739facfe4fe24540505cdc133fde8c74bfca78 Y = 22aa7aba797bde1e8389c3c3f8d8d9aa2a914f4d2d7aaf7187ebed9b2761975718ef97660ba0b8a71dee17f2b982e2cf Digest = 007b907b90fa60835d45d2f0201a4486d9782fea4f0a235d97d4968336c5369c6c2e82bded56288a10fd6741f4c15d1633bc92e0196308d9f0490fc2077d3b6c R = 0b4e835ed83151d2bde96e201c54544ba5f301aca853957d3c538c9858fcce796b60fc50f5600a48dcdf13e5bc029827 S = 0270adf02d31d5428d523e13d7d315c1929a1d89bbd0f61eec0b1186abe1c307cbba6b1067a68bc3947e6196d49719a0 Invalid = Y Curve = P-384 X = 80ae47e99107d6148b1088c6694df5c1273ff336b66e45b68a7c65fed735129dadcaf2b900e9f8ec50eff70a5ba89ea3 Y = 47450efb5669bfacd7cbff1f801aafa0812ff88a6ae7b5a1f85e88e19129ed995f509fbf8dec15ce42bbbbd33814c09e Digest = 1cacc8f609080e7b8339529f944850a700977ef9107f40956fb35645e15fdd54ef01755f07a2582d0bf2ca0cb84ee8ab154fe0914dfc9ad7ad5fe54b857d0f4e R = bae6fba7b1485ecdca48219ead3c39295fa9c196b1f0941445b1ac768e33962f68d37f1f1749eaad7200064aa202fb41 S = b411a38d02deb42d1015a7837b033c89d2f37d92c70fa8bb1f592223f7750520b950f30277abfb4155a3ab194b3beca0 Invalid = Y Curve = P-384 X = 45cb6dcca8d2e80ac04536a22f9d68ea2313245550108ddcd32799d154c0a55492e49463e826275bd9bf0d5e380205c1 Y = 6fd124f5a6c745751ccfb3ba4dd9144ea8fd41a4d9a4b34820434da66aa7385e73ffe71e6c11ed1beb6c7af22ce00edf Digest = dd7947a5b9a1c988dd7dff537e15335aacafd3e602adc8373765013f338334dd58aed4fb7144de0007c3410d79f5e78bcd4cf0dd63cc33ed3dd564882e299c7b R = 2c782c4263eeee63657fbf20fa287a1a81fcd14b1d3bae333928ba4fc31abb20edebc130714380608e38ea74309eca9d S = 716113d95bc9dba532bfb470112b0d43d9cd6560ad15e0de2e514994801ff339bcf19ad4ee2b8af573f57c038fbd70f0 Curve = P-384 X = 36c1459d9e9f7b6c1598778c784cbf94661a2b11370c02ee092f6ea0ca20acf81f1ed5048a28a1466a91689df26bc291 Y = d1367418c7b216bd32c6dafc8b2be99d02cab68df990758b2ddd543b7eb6ff6e285b649ffe588b1811b549cfb5f0289b Digest = 242ff2713c03e3d5277652f8e7fb1e5a1f0422b6652e1bdd696e46c03cdd3aaac329b1d88e7aa345ff7224ce6dc6df05c7e9d7dc2665282c817d15a15b8288fd R = 40c338adeb504193444bdb95336177362031aaadc5b7e151e42030df9dd8687f3cb8fe2292fd4f9206989c089d966dae S = be4b2ba251094c24de006c89af2b5c77e6937f36d7bb703b4f8edcfe65d45f4b2fd2486222163ae0ed9e215c0a96f488 Invalid = Y Curve = P-384 X = b5eb6670bb0b0d3aef10e533d3660756b7372a2a081d9d920130034f48202cd43b9e2d1e5893d0cfb322db65ab839716 Y = e28444770396041b489b302786a57fca9a98f19685cb4b455d219151e64645ad30dd3149ec96f3bc90879834b65e58aa Digest = 8d2e653807e87962883956ee3705b2167c50370c3af12eb8f6c26f0f15ede56dddc7d0c9642a1c1c2444b06571fa1a4d47e7884acc7ea3884daaa50940f782e2 R = 0887a13df940907864b425ec0d8f91ac719abcc62b276fa08c5122b38831c8930abd3c8454e98182bb588fc72843717a S = a380284eacaa36a34e35f04fbf6e28ffb59176f41ea52d9c9bc1362eccd8e0d699c2e08111d93e9dc2785637b1f4f09e Invalid = Y Curve = P-384 X = 700e8f65e052e918a63a96fa57f4eda849f9f9faca3302d6ead66ebf85838f8145a6d6718a681b7bef73170d7254958f Y = 9e9e10357658913007803859165926cd1e5e92c3a644d834098cb1cbfab466349bf4238a5154cf50ed77c77a78263e81 Digest = cf885fa7a96db595f825a0ccc56b70b60e0e1c30d0a15af636d1f4957328aecb7eeb734d5874bd72ddaf15c357ca36bd42abf387f7b771ea6160e2e23a08652e R = 59be870e0fd684b000cce95c616d9f34674354e9d20db15d204b8a6285ff55258e4eeb49da1573ef1030cd6b2626dcfb S = c0bbbf71d87479d82575458be9f4d686921db7ea458d620271f51ec3f4d1afe3bf25ef9c0c400eb7b92cd7058fb17346 Invalid = Y Curve = P-384 X = a9de6f029445fffcf16349b44095cc83b11e3d0d9f08654b158014803b1cc31b8dfe00b1a8167c6f704d69cdd62c6512 Y = 27336a503a669ba1d1f3619f51dc8aa2a44b2075c682a36f071be486e7dafba9adfac2ce74be0442b7251e99304ffc05 Digest = b7e73f38767f253790e7fff019b4e0e61562aeb97b2b749afec2a61c87ab0e15916d4286c0a13989912f6bafdf3efc6f64ddc3b944f9041266e5abd4480c1606 R = f93a4d2eb94d087f28572847e0099ae2ee944efacdad392ec268c9c1e632e6ccd670c36584e58aba52a4c2b07127d55a S = 941ee89cea6e7ed20213a95482fae134707ddf4d292ab1952ed5464f1f1138669dedbfc9998b696eaf469be5fb240c80 Invalid = Y Curve = P-384 X = e63500d6d13069c01fafc4518f1d429661c5bb6ad1ff0383037ca6a469a5c20c453dce03bf6e4164f7e26f849016b3d0 Y = 83b7b731c2531c3ac61b194cf3db6dc02ccdfa16d9eb49f97bc4ec3fe6c8bd865ea27f1538531ad07dc44fc5107af8e6 Digest = afc0ed355377d0ab0c4f79d420dcf67ad4920c013d5c8afde2287525da4596672927540418a61568b21ae7799d7659f16b85f611bd6e8d2066a55903da0c48b9 R = eb78733e73fd64a6a1f23eba5311af23d26816fb8847671e01fdbd8dc7d5fce1a0823b080ee99e8d75edb3f100e16077 S = bcaedfe599f98b51542c0f94ae1010611c6767ac3abb2bd887399d62fd0f1b3a0e97deb24c95a76de44521bf24c8645e Invalid = Y Curve = P-384 X = 3ebd869be687f82d844416e6816d698d82e1e22a1f451d50b6c146134deb07f05204c0b04e7dc07ebdcfd916531dc7c3 Y = 6e4d7bde063edb7254a82b9d9249d2a2b9ad8988c37a84ac9f7c09daed42b1fd28f7cca1ea8b4f91a66e878224800bdc Digest = 56a61339a35750e95770f28846930e3f594e8d759e07423718734a82b2a80430b0fb3378e40bdcf5c12be135be9a9bec32916b4988a763091a6da7b44631414e R = 575f87a8a7980555a198cfdec279cbb2f89551b5271d242397c29f6bc4bf413dc30312a7e626ef7fc77a9124a79bf9be S = f0b7d759246ad36ba8240c537b1eeb5d148c38d324f48028c598eaef6e49d79ff3f6cfe3a32fbbf6f3ed3aaaec31d572 Invalid = Y # The following tests use digests equal to the order and 2^n - 1, where n is # the number of bits in the order. This is to test the truncated digest not # being fully reduced. Curve = P-256 X = e57231383637c82c1ac801724cf7e03e67198f467a9beb60ac13cb582d13afa8 Y = 8f190e090155fcf63810b858bc88e259dc49afef8bdef6fd06d93dddb1991aed Digest = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 R = 05cc6037bb021f4910ea2e489fab2bae6bb6a2769a97f42ba5736994102b7f10 S = 5db54832ceabf8bccdb8be99b1a49cecff8feee045cb697dec43118e2695b1da Curve = P-256 X = 6e0e2897b9a554ee287cdaf43bfbe25ca8404373971575a0e4b61c61aff5a2fe Y = 23ea7823a411eb1b39f81bbde24c2cd6ac68be2c7eec3a0671c8676131b8905c Digest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff R = 16831feeceab2fab1c575e073e944d73ce7e6f3e9b06312088f06159c530ff50 S = 870cb824692638538b1569c6093fcb693c054e8e3b9a919e3bb26798910f66e9 Curve = P-384 X = f4a961c19f9cc4ebe4f43081110955f3cede085a08c1415d726e80b2eb774028c5fc96f092ba3ea7d1288dd57fe1db08 Y = 981398eed0895e09b3b582a0616f3024e51cca7b1ecc347dbf0d24a5f6a222b0c31912f8f5e427d4dde5c6c45212bb10 Digest = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 R = 0b77eaff05bbd922dd80525d2ab301cc119318f5a920a12c71c4b5ff5bb77d25a538983df9bdd5984b0d159daf21f1a2 S = 73af85ad03a34b6b3993082bf719018d25d1555717b2d2f2535d0601af06a71ad020eff8232d065ab9d7fc4cd0c0ee42 Curve = P-384 X = 54dd8d7cbf2ccdf1a42f5bbc615a372803b094f6040e3c7b651a61bc6912432c836cf2410ab7d67f543236751d81066f Y = 2219d6257b1c80bf327c96786f2b5d0b5a9b9bf7eee9c853bf66a3bf09520494cb1f7823e4c566d79a617b7e201ead96 Digest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff R = 9d923e199d98272e44b8fba382bf3c19660ecb4a9aae3513ff6802a73fef510c15c202807c3f9334b0bce7d6c6a80839 S = 520784e6290d04d9b61993ee5ebc6fa8ff527fb0777c43cdefc7586701e60edb399005a5648ff852de80208232849fbd # The following tests are intended to stress the final comparison in ECDSA. # ECDSA verification computes some curve point (x, y), picking the fully-reduced # representive of x mod p, and checking that x mod n is r. (n is the order of # the group and p defines the underlying prime field.) # # This makes the computation sensitive to values near n and p, and which of n or # p is larger. Additionally, there is an optimization that performs the # comparison mod p rather than n and compensates for the difference. # # These tests were generated by picking a target value of r and x, adjusting # both until x corresponded to a point on the curve, and then computing the # public key by solving for P in ECDSA's (x, y) = u1*G + u2*P. The digest is the # hash of "hello, world" with the suitably-sized SHA-2 hash, so the test vectors # are suitable for both message- and digest-based APIs. # # "x" in the comments refer to the x-coordinate of the computed point, not that # of the public key. # r = 5, x = 5 is valid. Curve = P-256 X = 264d796a0dab9b376d34eea6fe297dde1c7b73e53944bc96c8f1e8a6850bb6c9 Y = cf5308020eed460c649ddae61d4ef8bb79958113f106befaf4f18876d12a5e64 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = 0000000000000000000000000000000000000000000000000000000000000005 S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e # r = 5 + n, x = 5 is invalid. r must already be reduced. Curve = P-256 X = 264d796a0dab9b376d34eea6fe297dde1c7b73e53944bc96c8f1e8a6850bb6c9 Y = cf5308020eed460c649ddae61d4ef8bb79958113f106befaf4f18876d12a5e64 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556 S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e Invalid = Y # r = n-2, x = n-2 is the largest x without a reduction. Curve = P-256 X = 50a50c01132bf79e42b31fb278f7317b29515e9e1c973a41266b69048826fb8e Y = aac53e7df37b5eb25ce4ddb705fc7135c6b1e00a7f56e30744f62f258afa5537 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e # r = n-3, x = n-2 is incorrect. Curve = P-256 X = 50a50c01132bf79e42b31fb278f7317b29515e9e1c973a41266b69048826fb8e Y = aac53e7df37b5eb25ce4ddb705fc7135c6b1e00a7f56e30744f62f258afa5537 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e Invalid = Y # r = 3, x = n+3 is the smallest x with a reduction. Curve = P-256 X = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e Y = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = 0000000000000000000000000000000000000000000000000000000000000003 S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e # r = 4, x = n+3 is incorrect. Curve = P-256 X = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e Y = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = 0000000000000000000000000000000000000000000000000000000000000004 S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e Invalid = Y # r = p-3-n, x = p-3 is the largest valid x. Curve = P-256 X = 768a0d300a595005a520130e50927d403395c8e1e40be997b48fc048410f7cdb Y = 16f217d8e1c02bd887e5de388a17783b182e61b5d534152dc2c4be8d75fdd706 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = 000000000000000000000000000000004319055358e8617b0c46353d039cdaab S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e # r = p-n+5, x = 5 is incorrect. r is too large to compare r+n with x. Curve = P-256 X = 0ec505bc19b14a43e05678cccf07a443d3e871a2e19b68a4da91859a0650f324 Y = 77300e4f64e9982d94dff5d294428bb37cc9be66117cae9c389d2d495f68b987 Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b R = 000000000000000000000000000000004319055358e8617b0c46353d039cdab3 S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e Invalid = Y # r = 2, x = 2 is valid. Curve = P-384 X = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f Y = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 # r = 2 + n, x = 2 is invalid. r must already be reduced. Curve = P-384 X = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f Y = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 Invalid = Y # r = n-1, x = n-1 is the largest x without a reduction. Curve = P-384 X = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811 Y = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1 Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 # r = n-2, x = n-1 is incorrect. Curve = P-384 X = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811 Y = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1 Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 Invalid = Y # r = 2, x = n+2 is the smallest x with a reduction. Curve = P-384 X = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c Y = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 # r = 3, x = n+2 is incorrect. Curve = P-384 X = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c Y = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 Invalid = Y # r = p-1-n, x = p-1 is the largest valid x. Curve = P-384 X = c4fd8e68006b83f7b7b20b731ae405813aa05f6e57374589b36ae1cecd1d49cae1418c22f398188bcf4ef02e89fe7394 Y = dd1164b3707f59e05129fa228b8448031db159985f035d93470dc42b3ab4129f0760c46cf201d42e73a7e33ba7402ea6 Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 # r = p-n+2, x = 2 is incorrect. r is too large to compare r+n with x. Curve = P-384 X = 4e5e4f1a6e97059a6cf2f4e8129e5c7c64cb84f9994a41ff5bf30b29c1bf5ba6898627c91a23c73e05cd1a43c8f908c0 Y = 06a0aed7f1e63a728f87dbd5360a67571a076ab0b4cde81b10d499959814ddb3a8c7854b0bbfa87cc272f90bca2a2254 Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e R = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 Invalid = Y ring-0.16.9/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl000064400000000000000000000753431352416253600214710ustar0000000000000000#! /usr/bin/env perl # Copyright 2013-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # # AES-NI-CTR+GHASH stitch. # # February 2013 # # OpenSSL GCM implementation is organized in such way that its # performance is rather close to the sum of its streamed components, # in the context parallelized AES-NI CTR and modulo-scheduled # PCLMULQDQ-enabled GHASH. Unfortunately, as no stitch implementation # was observed to perform significantly better than the sum of the # components on contemporary CPUs, the effort was deemed impossible to # justify. This module is based on combination of Intel submissions, # [1] and [2], with MOVBE twist suggested by Ilya Albrekht and Max # Locktyukhin of Intel Corp. who verified that it reduces shuffles # pressure with notable relative improvement, achieving 1.0 cycle per # byte processed with 128-bit key on Haswell processor, 0.74 - on # Broadwell, 0.63 - on Skylake... [Mentioned results are raw profiled # measurements for favourable packet size, one divisible by 96. # Applications using the EVP interface will observe a few percent # worse performance.] # # Knights Landing processes 1 byte in 1.25 cycles (measured with EVP). # # [1] http://rt.openssl.org/Ticket/Display.html?id=2900&user=guest&pass=guest # [2] http://www.intel.com/content/dam/www/public/us/en/documents/software-support/enabling-high-performance-gcm.pdf $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; # |$avx| in ghash-x86_64.pl must be set to at least 1; otherwise tags will # be computed incorrectly. # # In upstream, this is controlled by shelling out to the compiler to check # versions, but BoringSSL is intended to be used with pre-generated perlasm # output, so this isn't useful anyway. # # The upstream code uses the condition |$avx>1| even though no AVX2 # instructions are used, because it assumes MOVBE is supported by the assembler # if and only if AVX2 is also supported by the assembler; see # https://marc.info/?l=openssl-dev&m=146567589526984&w=2. $avx = 2; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; # See the comment above regarding why the condition is ($avx>1) when there are # no AVX2 instructions being used. if ($avx>1) {{{ ($inp,$out,$len,$key,$ivp,$Xip)=("%rdi","%rsi","%rdx","%rcx","%r8","%r9"); ($Ii,$T1,$T2,$Hkey, $Z0,$Z1,$Z2,$Z3,$Xi) = map("%xmm$_",(0..8)); ($inout0,$inout1,$inout2,$inout3,$inout4,$inout5,$rndkey) = map("%xmm$_",(9..15)); ($counter,$rounds,$ret,$const,$in0,$end0)=("%ebx","%ebp","%r10","%r11","%r14","%r15"); $code=<<___; .text .type _aesni_ctr32_ghash_6x,\@abi-omnipotent .align 32 _aesni_ctr32_ghash_6x: .cfi_startproc vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb sub \$6,$len vpxor $Z0,$Z0,$Z0 # $Z0 = 0 vmovdqu 0x00-0x80($key),$rndkey vpaddb $T2,$T1,$inout1 vpaddb $T2,$inout1,$inout2 vpaddb $T2,$inout2,$inout3 vpaddb $T2,$inout3,$inout4 vpaddb $T2,$inout4,$inout5 vpxor $rndkey,$T1,$inout0 vmovdqu $Z0,16+8(%rsp) # "$Z3" = 0 jmp .Loop6x .align 32 .Loop6x: add \$`6<<24`,$counter jc .Lhandle_ctr32 # discard $inout[1-5]? vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 vpaddb $T2,$inout5,$T1 # next counter value vpxor $rndkey,$inout1,$inout1 vpxor $rndkey,$inout2,$inout2 .Lresume_ctr32: vmovdqu $T1,($ivp) # save next counter value vpclmulqdq \$0x10,$Hkey,$Z3,$Z1 vpxor $rndkey,$inout3,$inout3 vmovups 0x10-0x80($key),$T2 # borrow $T2 for $rndkey vpclmulqdq \$0x01,$Hkey,$Z3,$Z2 # At this point, the current block of 96 (0x60) bytes has already been # loaded into registers. Concurrently with processing it, we want to # load the next 96 bytes of input for the next round. Obviously, we can # only do this if there are at least 96 more bytes of input beyond the # input we're currently processing, or else we'd read past the end of # the input buffer. Here, we set |%r12| to 96 if there are at least 96 # bytes of input beyond the 96 bytes we're already processing, and we # set |%r12| to 0 otherwise. In the case where we set |%r12| to 96, # we'll read in the next block so that it is in registers for the next # loop iteration. In the case where we set |%r12| to 0, we'll re-read # the current block and then ignore what we re-read. # # At this point, |$in0| points to the current (already read into # registers) block, and |$end0| points to 2*96 bytes before the end of # the input. Thus, |$in0| > |$end0| means that we do not have the next # 96-byte block to read in, and |$in0| <= |$end0| means we do. xor %r12,%r12 cmp $in0,$end0 vaesenc $T2,$inout0,$inout0 vmovdqu 0x30+8(%rsp),$Ii # I[4] vpxor $rndkey,$inout4,$inout4 vpclmulqdq \$0x00,$Hkey,$Z3,$T1 vaesenc $T2,$inout1,$inout1 vpxor $rndkey,$inout5,$inout5 setnc %r12b vpclmulqdq \$0x11,$Hkey,$Z3,$Z3 vaesenc $T2,$inout2,$inout2 vmovdqu 0x10-0x20($Xip),$Hkey # $Hkey^2 neg %r12 vaesenc $T2,$inout3,$inout3 vpxor $Z1,$Z2,$Z2 vpclmulqdq \$0x00,$Hkey,$Ii,$Z1 vpxor $Z0,$Xi,$Xi # modulo-scheduled vaesenc $T2,$inout4,$inout4 vpxor $Z1,$T1,$Z0 and \$0x60,%r12 vmovups 0x20-0x80($key),$rndkey vpclmulqdq \$0x10,$Hkey,$Ii,$T1 vaesenc $T2,$inout5,$inout5 vpclmulqdq \$0x01,$Hkey,$Ii,$T2 lea ($in0,%r12),$in0 vaesenc $rndkey,$inout0,$inout0 vpxor 16+8(%rsp),$Xi,$Xi # modulo-scheduled [vpxor $Z3,$Xi,$Xi] vpclmulqdq \$0x11,$Hkey,$Ii,$Hkey vmovdqu 0x40+8(%rsp),$Ii # I[3] vaesenc $rndkey,$inout1,$inout1 movbe 0x58($in0),%r13 vaesenc $rndkey,$inout2,$inout2 movbe 0x50($in0),%r12 vaesenc $rndkey,$inout3,$inout3 mov %r13,0x20+8(%rsp) vaesenc $rndkey,$inout4,$inout4 mov %r12,0x28+8(%rsp) vmovdqu 0x30-0x20($Xip),$Z1 # borrow $Z1 for $Hkey^3 vaesenc $rndkey,$inout5,$inout5 vmovups 0x30-0x80($key),$rndkey vpxor $T1,$Z2,$Z2 vpclmulqdq \$0x00,$Z1,$Ii,$T1 vaesenc $rndkey,$inout0,$inout0 vpxor $T2,$Z2,$Z2 vpclmulqdq \$0x10,$Z1,$Ii,$T2 vaesenc $rndkey,$inout1,$inout1 vpxor $Hkey,$Z3,$Z3 vpclmulqdq \$0x01,$Z1,$Ii,$Hkey vaesenc $rndkey,$inout2,$inout2 vpclmulqdq \$0x11,$Z1,$Ii,$Z1 vmovdqu 0x50+8(%rsp),$Ii # I[2] vaesenc $rndkey,$inout3,$inout3 vaesenc $rndkey,$inout4,$inout4 vpxor $T1,$Z0,$Z0 vmovdqu 0x40-0x20($Xip),$T1 # borrow $T1 for $Hkey^4 vaesenc $rndkey,$inout5,$inout5 vmovups 0x40-0x80($key),$rndkey vpxor $T2,$Z2,$Z2 vpclmulqdq \$0x00,$T1,$Ii,$T2 vaesenc $rndkey,$inout0,$inout0 vpxor $Hkey,$Z2,$Z2 vpclmulqdq \$0x10,$T1,$Ii,$Hkey vaesenc $rndkey,$inout1,$inout1 movbe 0x48($in0),%r13 vpxor $Z1,$Z3,$Z3 vpclmulqdq \$0x01,$T1,$Ii,$Z1 vaesenc $rndkey,$inout2,$inout2 movbe 0x40($in0),%r12 vpclmulqdq \$0x11,$T1,$Ii,$T1 vmovdqu 0x60+8(%rsp),$Ii # I[1] vaesenc $rndkey,$inout3,$inout3 mov %r13,0x30+8(%rsp) vaesenc $rndkey,$inout4,$inout4 mov %r12,0x38+8(%rsp) vpxor $T2,$Z0,$Z0 vmovdqu 0x60-0x20($Xip),$T2 # borrow $T2 for $Hkey^5 vaesenc $rndkey,$inout5,$inout5 vmovups 0x50-0x80($key),$rndkey vpxor $Hkey,$Z2,$Z2 vpclmulqdq \$0x00,$T2,$Ii,$Hkey vaesenc $rndkey,$inout0,$inout0 vpxor $Z1,$Z2,$Z2 vpclmulqdq \$0x10,$T2,$Ii,$Z1 vaesenc $rndkey,$inout1,$inout1 movbe 0x38($in0),%r13 vpxor $T1,$Z3,$Z3 vpclmulqdq \$0x01,$T2,$Ii,$T1 vpxor 0x70+8(%rsp),$Xi,$Xi # accumulate I[0] vaesenc $rndkey,$inout2,$inout2 movbe 0x30($in0),%r12 vpclmulqdq \$0x11,$T2,$Ii,$T2 vaesenc $rndkey,$inout3,$inout3 mov %r13,0x40+8(%rsp) vaesenc $rndkey,$inout4,$inout4 mov %r12,0x48+8(%rsp) vpxor $Hkey,$Z0,$Z0 vmovdqu 0x70-0x20($Xip),$Hkey # $Hkey^6 vaesenc $rndkey,$inout5,$inout5 vmovups 0x60-0x80($key),$rndkey vpxor $Z1,$Z2,$Z2 vpclmulqdq \$0x10,$Hkey,$Xi,$Z1 vaesenc $rndkey,$inout0,$inout0 vpxor $T1,$Z2,$Z2 vpclmulqdq \$0x01,$Hkey,$Xi,$T1 vaesenc $rndkey,$inout1,$inout1 movbe 0x28($in0),%r13 vpxor $T2,$Z3,$Z3 vpclmulqdq \$0x00,$Hkey,$Xi,$T2 vaesenc $rndkey,$inout2,$inout2 movbe 0x20($in0),%r12 vpclmulqdq \$0x11,$Hkey,$Xi,$Xi vaesenc $rndkey,$inout3,$inout3 mov %r13,0x50+8(%rsp) vaesenc $rndkey,$inout4,$inout4 mov %r12,0x58+8(%rsp) vpxor $Z1,$Z2,$Z2 vaesenc $rndkey,$inout5,$inout5 vpxor $T1,$Z2,$Z2 vmovups 0x70-0x80($key),$rndkey vpslldq \$8,$Z2,$Z1 vpxor $T2,$Z0,$Z0 vmovdqu 0x10($const),$Hkey # .Lpoly vaesenc $rndkey,$inout0,$inout0 vpxor $Xi,$Z3,$Z3 vaesenc $rndkey,$inout1,$inout1 vpxor $Z1,$Z0,$Z0 movbe 0x18($in0),%r13 vaesenc $rndkey,$inout2,$inout2 movbe 0x10($in0),%r12 vpalignr \$8,$Z0,$Z0,$Ii # 1st phase vpclmulqdq \$0x10,$Hkey,$Z0,$Z0 mov %r13,0x60+8(%rsp) vaesenc $rndkey,$inout3,$inout3 mov %r12,0x68+8(%rsp) vaesenc $rndkey,$inout4,$inout4 vmovups 0x80-0x80($key),$T1 # borrow $T1 for $rndkey vaesenc $rndkey,$inout5,$inout5 vaesenc $T1,$inout0,$inout0 vmovups 0x90-0x80($key),$rndkey vaesenc $T1,$inout1,$inout1 vpsrldq \$8,$Z2,$Z2 vaesenc $T1,$inout2,$inout2 vpxor $Z2,$Z3,$Z3 vaesenc $T1,$inout3,$inout3 vpxor $Ii,$Z0,$Z0 movbe 0x08($in0),%r13 vaesenc $T1,$inout4,$inout4 movbe 0x00($in0),%r12 vaesenc $T1,$inout5,$inout5 vmovups 0xa0-0x80($key),$T1 cmp \$11,$rounds jb .Lenc_tail # 128-bit key vaesenc $rndkey,$inout0,$inout0 vaesenc $rndkey,$inout1,$inout1 vaesenc $rndkey,$inout2,$inout2 vaesenc $rndkey,$inout3,$inout3 vaesenc $rndkey,$inout4,$inout4 vaesenc $rndkey,$inout5,$inout5 vaesenc $T1,$inout0,$inout0 vaesenc $T1,$inout1,$inout1 vaesenc $T1,$inout2,$inout2 vaesenc $T1,$inout3,$inout3 vaesenc $T1,$inout4,$inout4 vmovups 0xb0-0x80($key),$rndkey vaesenc $T1,$inout5,$inout5 vmovups 0xc0-0x80($key),$T1 # 192-bit key support was removed. vaesenc $rndkey,$inout0,$inout0 vaesenc $rndkey,$inout1,$inout1 vaesenc $rndkey,$inout2,$inout2 vaesenc $rndkey,$inout3,$inout3 vaesenc $rndkey,$inout4,$inout4 vaesenc $rndkey,$inout5,$inout5 vaesenc $T1,$inout0,$inout0 vaesenc $T1,$inout1,$inout1 vaesenc $T1,$inout2,$inout2 vaesenc $T1,$inout3,$inout3 vaesenc $T1,$inout4,$inout4 vmovups 0xd0-0x80($key),$rndkey vaesenc $T1,$inout5,$inout5 vmovups 0xe0-0x80($key),$T1 jmp .Lenc_tail # 256-bit key .align 32 .Lhandle_ctr32: vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask vpshufb $Ii,$T1,$Z2 # byte-swap counter vmovdqu 0x30($const),$Z1 # borrow $Z1, .Ltwo_lsb vpaddd 0x40($const),$Z2,$inout1 # .Lone_lsb vpaddd $Z1,$Z2,$inout2 vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 vpaddd $Z1,$inout1,$inout3 vpshufb $Ii,$inout1,$inout1 vpaddd $Z1,$inout2,$inout4 vpshufb $Ii,$inout2,$inout2 vpxor $rndkey,$inout1,$inout1 vpaddd $Z1,$inout3,$inout5 vpshufb $Ii,$inout3,$inout3 vpxor $rndkey,$inout2,$inout2 vpaddd $Z1,$inout4,$T1 # byte-swapped next counter value vpshufb $Ii,$inout4,$inout4 vpshufb $Ii,$inout5,$inout5 vpshufb $Ii,$T1,$T1 # next counter value jmp .Lresume_ctr32 .align 32 .Lenc_tail: vaesenc $rndkey,$inout0,$inout0 vmovdqu $Z3,16+8(%rsp) # postpone vpxor $Z3,$Xi,$Xi vpalignr \$8,$Z0,$Z0,$Xi # 2nd phase vaesenc $rndkey,$inout1,$inout1 vpclmulqdq \$0x10,$Hkey,$Z0,$Z0 vpxor 0x00($inp),$T1,$T2 vaesenc $rndkey,$inout2,$inout2 vpxor 0x10($inp),$T1,$Ii vaesenc $rndkey,$inout3,$inout3 vpxor 0x20($inp),$T1,$Z1 vaesenc $rndkey,$inout4,$inout4 vpxor 0x30($inp),$T1,$Z2 vaesenc $rndkey,$inout5,$inout5 vpxor 0x40($inp),$T1,$Z3 vpxor 0x50($inp),$T1,$Hkey vmovdqu ($ivp),$T1 # load next counter value vaesenclast $T2,$inout0,$inout0 vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb vaesenclast $Ii,$inout1,$inout1 vpaddb $T2,$T1,$Ii mov %r13,0x70+8(%rsp) lea 0x60($inp),$inp vaesenclast $Z1,$inout2,$inout2 vpaddb $T2,$Ii,$Z1 mov %r12,0x78+8(%rsp) lea 0x60($out),$out vmovdqu 0x00-0x80($key),$rndkey vaesenclast $Z2,$inout3,$inout3 vpaddb $T2,$Z1,$Z2 vaesenclast $Z3, $inout4,$inout4 vpaddb $T2,$Z2,$Z3 vaesenclast $Hkey,$inout5,$inout5 vpaddb $T2,$Z3,$Hkey add \$0x60,$ret sub \$0x6,$len jc .L6x_done vmovups $inout0,-0x60($out) # save output vpxor $rndkey,$T1,$inout0 vmovups $inout1,-0x50($out) vmovdqa $Ii,$inout1 # 0 latency vmovups $inout2,-0x40($out) vmovdqa $Z1,$inout2 # 0 latency vmovups $inout3,-0x30($out) vmovdqa $Z2,$inout3 # 0 latency vmovups $inout4,-0x20($out) vmovdqa $Z3,$inout4 # 0 latency vmovups $inout5,-0x10($out) vmovdqa $Hkey,$inout5 # 0 latency vmovdqu 0x20+8(%rsp),$Z3 # I[5] jmp .Loop6x .L6x_done: vpxor 16+8(%rsp),$Xi,$Xi # modulo-scheduled vpxor $Z0,$Xi,$Xi # modulo-scheduled ret .cfi_endproc .size _aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x ___ ###################################################################### # # size_t GFp_aesni_gcm_[en|de]crypt(const void *inp, void *out, size_t len, # const AES_KEY *key, unsigned char iv[16], # struct { u128 Xi,H,Htbl[9]; } *Xip); $code.=<<___; .globl GFp_aesni_gcm_decrypt .type GFp_aesni_gcm_decrypt,\@function,6 .align 32 GFp_aesni_gcm_decrypt: .cfi_startproc xor $ret,$ret # We call |_aesni_ctr32_ghash_6x|, which requires at least 96 (0x60) # bytes of input. cmp \$0x60,$len # minimal accepted length jb .Lgcm_dec_abort lea (%rsp),%rax # save stack pointer .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 ___ $code.=<<___ if ($win64); lea -0xa8(%rsp),%rsp movaps %xmm6,-0xd8(%rax) movaps %xmm7,-0xc8(%rax) movaps %xmm8,-0xb8(%rax) movaps %xmm9,-0xa8(%rax) movaps %xmm10,-0x98(%rax) movaps %xmm11,-0x88(%rax) movaps %xmm12,-0x78(%rax) movaps %xmm13,-0x68(%rax) movaps %xmm14,-0x58(%rax) movaps %xmm15,-0x48(%rax) .Lgcm_dec_body: ___ $code.=<<___; vzeroupper vmovdqu ($ivp),$T1 # input counter value add \$-128,%rsp mov 12($ivp),$counter lea .Lbswap_mask(%rip),$const lea -0x80($key),$in0 # borrow $in0 mov \$0xf80,$end0 # borrow $end0 vmovdqu ($Xip),$Xi # load Xi and \$-128,%rsp # ensure stack alignment vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask lea 0x80($key),$key # size optimization lea 0x20+0x20($Xip),$Xip # size optimization mov 0xf0-0x80($key),$rounds vpshufb $Ii,$Xi,$Xi and $end0,$in0 and %rsp,$end0 sub $in0,$end0 jc .Ldec_no_key_aliasing cmp \$768,$end0 jnc .Ldec_no_key_aliasing sub $end0,%rsp # avoid aliasing with key .Ldec_no_key_aliasing: vmovdqu 0x50($inp),$Z3 # I[5] lea ($inp),$in0 vmovdqu 0x40($inp),$Z0 # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) # bytes before the end of the input. Note, in particular, that this is # correct even if |$len| is not an even multiple of 96 or 16. XXX: This # seems to require that |$inp| + |$len| >= 2*96 (0xc0); i.e. |$inp| must # not be near the very beginning of the address space when |$len| < 2*96 # (0xc0). lea -0xc0($inp,$len),$end0 vmovdqu 0x30($inp),$Z1 shr \$4,$len xor $ret,$ret vmovdqu 0x20($inp),$Z2 vpshufb $Ii,$Z3,$Z3 # passed to _aesni_ctr32_ghash_6x vmovdqu 0x10($inp),$T2 vpshufb $Ii,$Z0,$Z0 vmovdqu ($inp),$Hkey vpshufb $Ii,$Z1,$Z1 vmovdqu $Z0,0x30(%rsp) vpshufb $Ii,$Z2,$Z2 vmovdqu $Z1,0x40(%rsp) vpshufb $Ii,$T2,$T2 vmovdqu $Z2,0x50(%rsp) vpshufb $Ii,$Hkey,$Hkey vmovdqu $T2,0x60(%rsp) vmovdqu $Hkey,0x70(%rsp) call _aesni_ctr32_ghash_6x vmovups $inout0,-0x60($out) # save output vmovups $inout1,-0x50($out) vmovups $inout2,-0x40($out) vmovups $inout3,-0x30($out) vmovups $inout4,-0x20($out) vmovups $inout5,-0x10($out) vpshufb ($const),$Xi,$Xi # .Lbswap_mask vmovdqu $Xi,-0x40($Xip) # output Xi vzeroupper ___ $code.=<<___ if ($win64); movaps -0xd8(%rax),%xmm6 movaps -0xc8(%rax),%xmm7 movaps -0xb8(%rax),%xmm8 movaps -0xa8(%rax),%xmm9 movaps -0x98(%rax),%xmm10 movaps -0x88(%rax),%xmm11 movaps -0x78(%rax),%xmm12 movaps -0x68(%rax),%xmm13 movaps -0x58(%rax),%xmm14 movaps -0x48(%rax),%xmm15 ___ $code.=<<___; mov -48(%rax),%r15 .cfi_restore %r15 mov -40(%rax),%r14 .cfi_restore %r14 mov -32(%rax),%r13 .cfi_restore %r13 mov -24(%rax),%r12 .cfi_restore %r12 mov -16(%rax),%rbp .cfi_restore %rbp mov -8(%rax),%rbx .cfi_restore %rbx lea (%rax),%rsp # restore %rsp .cfi_def_cfa_register %rsp .Lgcm_dec_abort: mov $ret,%rax # return value ret .cfi_endproc .size GFp_aesni_gcm_decrypt,.-GFp_aesni_gcm_decrypt ___ $code.=<<___; .type _aesni_ctr32_6x,\@abi-omnipotent .align 32 _aesni_ctr32_6x: .cfi_startproc vmovdqu 0x00-0x80($key),$Z0 # borrow $Z0 for $rndkey vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb lea -1($rounds),%r13 vmovups 0x10-0x80($key),$rndkey lea 0x20-0x80($key),%r12 vpxor $Z0,$T1,$inout0 add \$`6<<24`,$counter jc .Lhandle_ctr32_2 vpaddb $T2,$T1,$inout1 vpaddb $T2,$inout1,$inout2 vpxor $Z0,$inout1,$inout1 vpaddb $T2,$inout2,$inout3 vpxor $Z0,$inout2,$inout2 vpaddb $T2,$inout3,$inout4 vpxor $Z0,$inout3,$inout3 vpaddb $T2,$inout4,$inout5 vpxor $Z0,$inout4,$inout4 vpaddb $T2,$inout5,$T1 vpxor $Z0,$inout5,$inout5 jmp .Loop_ctr32 .align 16 .Loop_ctr32: vaesenc $rndkey,$inout0,$inout0 vaesenc $rndkey,$inout1,$inout1 vaesenc $rndkey,$inout2,$inout2 vaesenc $rndkey,$inout3,$inout3 vaesenc $rndkey,$inout4,$inout4 vaesenc $rndkey,$inout5,$inout5 vmovups (%r12),$rndkey lea 0x10(%r12),%r12 dec %r13d jnz .Loop_ctr32 vmovdqu (%r12),$Hkey # last round key vaesenc $rndkey,$inout0,$inout0 vpxor 0x00($inp),$Hkey,$Z0 vaesenc $rndkey,$inout1,$inout1 vpxor 0x10($inp),$Hkey,$Z1 vaesenc $rndkey,$inout2,$inout2 vpxor 0x20($inp),$Hkey,$Z2 vaesenc $rndkey,$inout3,$inout3 vpxor 0x30($inp),$Hkey,$Xi vaesenc $rndkey,$inout4,$inout4 vpxor 0x40($inp),$Hkey,$T2 vaesenc $rndkey,$inout5,$inout5 vpxor 0x50($inp),$Hkey,$Hkey lea 0x60($inp),$inp vaesenclast $Z0,$inout0,$inout0 vaesenclast $Z1,$inout1,$inout1 vaesenclast $Z2,$inout2,$inout2 vaesenclast $Xi,$inout3,$inout3 vaesenclast $T2,$inout4,$inout4 vaesenclast $Hkey,$inout5,$inout5 vmovups $inout0,0x00($out) vmovups $inout1,0x10($out) vmovups $inout2,0x20($out) vmovups $inout3,0x30($out) vmovups $inout4,0x40($out) vmovups $inout5,0x50($out) lea 0x60($out),$out ret .align 32 .Lhandle_ctr32_2: vpshufb $Ii,$T1,$Z2 # byte-swap counter vmovdqu 0x30($const),$Z1 # borrow $Z1, .Ltwo_lsb vpaddd 0x40($const),$Z2,$inout1 # .Lone_lsb vpaddd $Z1,$Z2,$inout2 vpaddd $Z1,$inout1,$inout3 vpshufb $Ii,$inout1,$inout1 vpaddd $Z1,$inout2,$inout4 vpshufb $Ii,$inout2,$inout2 vpxor $Z0,$inout1,$inout1 vpaddd $Z1,$inout3,$inout5 vpshufb $Ii,$inout3,$inout3 vpxor $Z0,$inout2,$inout2 vpaddd $Z1,$inout4,$T1 # byte-swapped next counter value vpshufb $Ii,$inout4,$inout4 vpxor $Z0,$inout3,$inout3 vpshufb $Ii,$inout5,$inout5 vpxor $Z0,$inout4,$inout4 vpshufb $Ii,$T1,$T1 # next counter value vpxor $Z0,$inout5,$inout5 jmp .Loop_ctr32 .cfi_endproc .size _aesni_ctr32_6x,.-_aesni_ctr32_6x .globl GFp_aesni_gcm_encrypt .type GFp_aesni_gcm_encrypt,\@function,6 .align 32 GFp_aesni_gcm_encrypt: .cfi_startproc xor $ret,$ret # We call |_aesni_ctr32_6x| twice, each call consuming 96 bytes of # input. Then we call |_aesni_ctr32_ghash_6x|, which requires at # least 96 more bytes of input. cmp \$0x60*3,$len # minimal accepted length jb .Lgcm_enc_abort lea (%rsp),%rax # save stack pointer .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 ___ $code.=<<___ if ($win64); lea -0xa8(%rsp),%rsp movaps %xmm6,-0xd8(%rax) movaps %xmm7,-0xc8(%rax) movaps %xmm8,-0xb8(%rax) movaps %xmm9,-0xa8(%rax) movaps %xmm10,-0x98(%rax) movaps %xmm11,-0x88(%rax) movaps %xmm12,-0x78(%rax) movaps %xmm13,-0x68(%rax) movaps %xmm14,-0x58(%rax) movaps %xmm15,-0x48(%rax) .Lgcm_enc_body: ___ $code.=<<___; vzeroupper vmovdqu ($ivp),$T1 # input counter value add \$-128,%rsp mov 12($ivp),$counter lea .Lbswap_mask(%rip),$const lea -0x80($key),$in0 # borrow $in0 mov \$0xf80,$end0 # borrow $end0 lea 0x80($key),$key # size optimization vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask and \$-128,%rsp # ensure stack alignment mov 0xf0-0x80($key),$rounds and $end0,$in0 and %rsp,$end0 sub $in0,$end0 jc .Lenc_no_key_aliasing cmp \$768,$end0 jnc .Lenc_no_key_aliasing sub $end0,%rsp # avoid aliasing with key .Lenc_no_key_aliasing: lea ($out),$in0 # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) # bytes before the end of the input. Note, in particular, that this is # correct even if |$len| is not an even multiple of 96 or 16. Unlike in # the decryption case, there's no caveat that |$out| must not be near # the very beginning of the address space, because we know that # |$len| >= 3*96 from the check above, and so we know # |$out| + |$len| >= 2*96 (0xc0). lea -0xc0($out,$len),$end0 shr \$4,$len call _aesni_ctr32_6x vpshufb $Ii,$inout0,$Xi # save bswapped output on stack vpshufb $Ii,$inout1,$T2 vmovdqu $Xi,0x70(%rsp) vpshufb $Ii,$inout2,$Z0 vmovdqu $T2,0x60(%rsp) vpshufb $Ii,$inout3,$Z1 vmovdqu $Z0,0x50(%rsp) vpshufb $Ii,$inout4,$Z2 vmovdqu $Z1,0x40(%rsp) vpshufb $Ii,$inout5,$Z3 # passed to _aesni_ctr32_ghash_6x vmovdqu $Z2,0x30(%rsp) call _aesni_ctr32_6x vmovdqu ($Xip),$Xi # load Xi lea 0x20+0x20($Xip),$Xip # size optimization sub \$12,$len mov \$0x60*2,$ret vpshufb $Ii,$Xi,$Xi call _aesni_ctr32_ghash_6x vmovdqu 0x20(%rsp),$Z3 # I[5] vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 vpunpckhqdq $Z3,$Z3,$T1 vmovdqu 0x20-0x20($Xip),$rndkey # borrow $rndkey for $HK vmovups $inout0,-0x60($out) # save output vpshufb $Ii,$inout0,$inout0 # but keep bswapped copy vpxor $Z3,$T1,$T1 vmovups $inout1,-0x50($out) vpshufb $Ii,$inout1,$inout1 vmovups $inout2,-0x40($out) vpshufb $Ii,$inout2,$inout2 vmovups $inout3,-0x30($out) vpshufb $Ii,$inout3,$inout3 vmovups $inout4,-0x20($out) vpshufb $Ii,$inout4,$inout4 vmovups $inout5,-0x10($out) vpshufb $Ii,$inout5,$inout5 vmovdqu $inout0,0x10(%rsp) # free $inout0 ___ { my ($HK,$T3)=($rndkey,$inout0); $code.=<<___; vmovdqu 0x30(%rsp),$Z2 # I[4] vmovdqu 0x10-0x20($Xip),$Ii # borrow $Ii for $Hkey^2 vpunpckhqdq $Z2,$Z2,$T2 vpclmulqdq \$0x00,$Hkey,$Z3,$Z1 vpxor $Z2,$T2,$T2 vpclmulqdq \$0x11,$Hkey,$Z3,$Z3 vpclmulqdq \$0x00,$HK,$T1,$T1 vmovdqu 0x40(%rsp),$T3 # I[3] vpclmulqdq \$0x00,$Ii,$Z2,$Z0 vmovdqu 0x30-0x20($Xip),$Hkey # $Hkey^3 vpxor $Z1,$Z0,$Z0 vpunpckhqdq $T3,$T3,$Z1 vpclmulqdq \$0x11,$Ii,$Z2,$Z2 vpxor $T3,$Z1,$Z1 vpxor $Z3,$Z2,$Z2 vpclmulqdq \$0x10,$HK,$T2,$T2 vmovdqu 0x50-0x20($Xip),$HK vpxor $T1,$T2,$T2 vmovdqu 0x50(%rsp),$T1 # I[2] vpclmulqdq \$0x00,$Hkey,$T3,$Z3 vmovdqu 0x40-0x20($Xip),$Ii # borrow $Ii for $Hkey^4 vpxor $Z0,$Z3,$Z3 vpunpckhqdq $T1,$T1,$Z0 vpclmulqdq \$0x11,$Hkey,$T3,$T3 vpxor $T1,$Z0,$Z0 vpxor $Z2,$T3,$T3 vpclmulqdq \$0x00,$HK,$Z1,$Z1 vpxor $T2,$Z1,$Z1 vmovdqu 0x60(%rsp),$T2 # I[1] vpclmulqdq \$0x00,$Ii,$T1,$Z2 vmovdqu 0x60-0x20($Xip),$Hkey # $Hkey^5 vpxor $Z3,$Z2,$Z2 vpunpckhqdq $T2,$T2,$Z3 vpclmulqdq \$0x11,$Ii,$T1,$T1 vpxor $T2,$Z3,$Z3 vpxor $T3,$T1,$T1 vpclmulqdq \$0x10,$HK,$Z0,$Z0 vmovdqu 0x80-0x20($Xip),$HK vpxor $Z1,$Z0,$Z0 vpxor 0x70(%rsp),$Xi,$Xi # accumulate I[0] vpclmulqdq \$0x00,$Hkey,$T2,$Z1 vmovdqu 0x70-0x20($Xip),$Ii # borrow $Ii for $Hkey^6 vpunpckhqdq $Xi,$Xi,$T3 vpxor $Z2,$Z1,$Z1 vpclmulqdq \$0x11,$Hkey,$T2,$T2 vpxor $Xi,$T3,$T3 vpxor $T1,$T2,$T2 vpclmulqdq \$0x00,$HK,$Z3,$Z3 vpxor $Z0,$Z3,$Z0 vpclmulqdq \$0x00,$Ii,$Xi,$Z2 vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 vpunpckhqdq $inout5,$inout5,$T1 vpclmulqdq \$0x11,$Ii,$Xi,$Xi vpxor $inout5,$T1,$T1 vpxor $Z1,$Z2,$Z1 vpclmulqdq \$0x10,$HK,$T3,$T3 vmovdqu 0x20-0x20($Xip),$HK vpxor $T2,$Xi,$Z3 vpxor $Z0,$T3,$Z2 vmovdqu 0x10-0x20($Xip),$Ii # borrow $Ii for $Hkey^2 vpxor $Z1,$Z3,$T3 # aggregated Karatsuba post-processing vpclmulqdq \$0x00,$Hkey,$inout5,$Z0 vpxor $T3,$Z2,$Z2 vpunpckhqdq $inout4,$inout4,$T2 vpclmulqdq \$0x11,$Hkey,$inout5,$inout5 vpxor $inout4,$T2,$T2 vpslldq \$8,$Z2,$T3 vpclmulqdq \$0x00,$HK,$T1,$T1 vpxor $T3,$Z1,$Xi vpsrldq \$8,$Z2,$Z2 vpxor $Z2,$Z3,$Z3 vpclmulqdq \$0x00,$Ii,$inout4,$Z1 vmovdqu 0x30-0x20($Xip),$Hkey # $Hkey^3 vpxor $Z0,$Z1,$Z1 vpunpckhqdq $inout3,$inout3,$T3 vpclmulqdq \$0x11,$Ii,$inout4,$inout4 vpxor $inout3,$T3,$T3 vpxor $inout5,$inout4,$inout4 vpalignr \$8,$Xi,$Xi,$inout5 # 1st phase vpclmulqdq \$0x10,$HK,$T2,$T2 vmovdqu 0x50-0x20($Xip),$HK vpxor $T1,$T2,$T2 vpclmulqdq \$0x00,$Hkey,$inout3,$Z0 vmovdqu 0x40-0x20($Xip),$Ii # borrow $Ii for $Hkey^4 vpxor $Z1,$Z0,$Z0 vpunpckhqdq $inout2,$inout2,$T1 vpclmulqdq \$0x11,$Hkey,$inout3,$inout3 vpxor $inout2,$T1,$T1 vpxor $inout4,$inout3,$inout3 vxorps 0x10(%rsp),$Z3,$Z3 # accumulate $inout0 vpclmulqdq \$0x00,$HK,$T3,$T3 vpxor $T2,$T3,$T3 vpclmulqdq \$0x10,0x10($const),$Xi,$Xi vxorps $inout5,$Xi,$Xi vpclmulqdq \$0x00,$Ii,$inout2,$Z1 vmovdqu 0x60-0x20($Xip),$Hkey # $Hkey^5 vpxor $Z0,$Z1,$Z1 vpunpckhqdq $inout1,$inout1,$T2 vpclmulqdq \$0x11,$Ii,$inout2,$inout2 vpxor $inout1,$T2,$T2 vpalignr \$8,$Xi,$Xi,$inout5 # 2nd phase vpxor $inout3,$inout2,$inout2 vpclmulqdq \$0x10,$HK,$T1,$T1 vmovdqu 0x80-0x20($Xip),$HK vpxor $T3,$T1,$T1 vxorps $Z3,$inout5,$inout5 vpclmulqdq \$0x10,0x10($const),$Xi,$Xi vxorps $inout5,$Xi,$Xi vpclmulqdq \$0x00,$Hkey,$inout1,$Z0 vmovdqu 0x70-0x20($Xip),$Ii # borrow $Ii for $Hkey^6 vpxor $Z1,$Z0,$Z0 vpunpckhqdq $Xi,$Xi,$T3 vpclmulqdq \$0x11,$Hkey,$inout1,$inout1 vpxor $Xi,$T3,$T3 vpxor $inout2,$inout1,$inout1 vpclmulqdq \$0x00,$HK,$T2,$T2 vpxor $T1,$T2,$T2 vpclmulqdq \$0x00,$Ii,$Xi,$Z1 vpclmulqdq \$0x11,$Ii,$Xi,$Z3 vpxor $Z0,$Z1,$Z1 vpclmulqdq \$0x10,$HK,$T3,$Z2 vpxor $inout1,$Z3,$Z3 vpxor $T2,$Z2,$Z2 vpxor $Z1,$Z3,$Z0 # aggregated Karatsuba post-processing vpxor $Z0,$Z2,$Z2 vpslldq \$8,$Z2,$T1 vmovdqu 0x10($const),$Hkey # .Lpoly vpsrldq \$8,$Z2,$Z2 vpxor $T1,$Z1,$Xi vpxor $Z2,$Z3,$Z3 vpalignr \$8,$Xi,$Xi,$T2 # 1st phase vpclmulqdq \$0x10,$Hkey,$Xi,$Xi vpxor $T2,$Xi,$Xi vpalignr \$8,$Xi,$Xi,$T2 # 2nd phase vpclmulqdq \$0x10,$Hkey,$Xi,$Xi vpxor $Z3,$T2,$T2 vpxor $T2,$Xi,$Xi ___ } $code.=<<___; vpshufb ($const),$Xi,$Xi # .Lbswap_mask vmovdqu $Xi,-0x40($Xip) # output Xi vzeroupper ___ $code.=<<___ if ($win64); movaps -0xd8(%rax),%xmm6 movaps -0xc8(%rax),%xmm7 movaps -0xb8(%rax),%xmm8 movaps -0xa8(%rax),%xmm9 movaps -0x98(%rax),%xmm10 movaps -0x88(%rax),%xmm11 movaps -0x78(%rax),%xmm12 movaps -0x68(%rax),%xmm13 movaps -0x58(%rax),%xmm14 movaps -0x48(%rax),%xmm15 ___ $code.=<<___; mov -48(%rax),%r15 .cfi_restore %r15 mov -40(%rax),%r14 .cfi_restore %r14 mov -32(%rax),%r13 .cfi_restore %r13 mov -24(%rax),%r12 .cfi_restore %r12 mov -16(%rax),%rbp .cfi_restore %rbp mov -8(%rax),%rbx .cfi_restore %rbx lea (%rax),%rsp # restore %rsp .cfi_def_cfa_register %rsp .Lgcm_enc_abort: mov $ret,%rax # return value ret .cfi_endproc .size GFp_aesni_gcm_encrypt,.-GFp_aesni_gcm_encrypt ___ $code.=<<___; .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .Lpoly: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 .Lone_msb: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 .Ltwo_lsb: .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .Lone_lsb: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .asciz "AES-NI GCM module for x86_64, CRYPTOGAMS by " .align 64 ___ if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___ .extern __imp_RtlVirtualUnwind .type gcm_se_handler,\@abi-omnipotent .align 16 gcm_se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail mov 120($context),%rax # pull context->Rax mov -48(%rax),%r15 mov -40(%rax),%r14 mov -32(%rax),%r13 mov -24(%rax),%r12 mov -16(%rax),%rbp mov -8(%rax),%rbx mov %r15,240($context) mov %r14,232($context) mov %r13,224($context) mov %r12,216($context) mov %rbp,160($context) mov %rbx,144($context) lea -0xd8(%rax),%rsi # %xmm save area lea 512($context),%rdi # & context.Xmm6 mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) .long 0xa548f3fc # cld; rep movsq .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size gcm_se_handler,.-gcm_se_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_aesni_gcm_decrypt .rva .LSEH_end_GFp_aesni_gcm_decrypt .rva .LSEH_gcm_dec_info .rva .LSEH_begin_GFp_aesni_gcm_encrypt .rva .LSEH_end_GFp_aesni_gcm_encrypt .rva .LSEH_GFp_gcm_enc_info .section .xdata .align 8 .LSEH_gcm_dec_info: .byte 9,0,0,0 .rva gcm_se_handler .rva .Lgcm_dec_body,.Lgcm_dec_abort .LSEH_GFp_gcm_enc_info: .byte 9,0,0,0 .rva gcm_se_handler .rva .Lgcm_enc_body,.Lgcm_enc_abort ___ } }}} $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/modes/asm/ghash-armv4.pl000064400000000000000000000214501352416253600210010ustar0000000000000000#! /usr/bin/env perl # Copyright 2010-2018 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # April 2010 # # The module implements "4-bit" GCM GHASH function and underlying # single multiplication operation in GF(2^128). "4-bit" means that it # uses 256 bytes per-key table [+32 bytes shared table]. There is no # experimental performance data available yet. The only approximation # that can be made at this point is based on code size. Inner loop is # 32 instructions long and on single-issue core should execute in <40 # cycles. Having verified that gcc 3.4 didn't unroll corresponding # loop, this assembler loop body was found to be ~3x smaller than # compiler-generated one... # # July 2010 # # Rescheduling for dual-issue pipeline resulted in 8.5% improvement on # Cortex A8 core and ~25 cycles per processed byte (which was observed # to be ~3 times faster than gcc-generated code:-) # # February 2011 # # Profiler-assisted and platform-specific optimization resulted in 7% # improvement on Cortex A8 core and ~23.5 cycles per byte. # # March 2011 # # Add NEON implementation featuring polynomial multiplication, i.e. no # lookup tables involved. On Cortex A8 it was measured to process one # byte in 15 cycles or 55% faster than integer-only code. # # April 2014 # # Switch to multiplication algorithm suggested in paper referred # below and combine it with reduction algorithm from x86 module. # Performance improvement over previous version varies from 65% on # Snapdragon S4 to 110% on Cortex A9. In absolute terms Cortex A8 # processes one byte in 8.45 cycles, A9 - in 10.2, A15 - in 7.63, # Snapdragon S4 - in 9.33. # # Câmara, D.; Gouvêa, C. P. L.; López, J. & Dahab, R.: Fast Software # Polynomial Multiplication on ARM Processors using the NEON Engine. # # http://conradoplg.cryptoland.net/files/2010/12/mocrysen13.pdf # ==================================================================== # Note about "528B" variant. In ARM case it makes lesser sense to # implement it for following reasons: # # - performance improvement won't be anywhere near 50%, because 128- # bit shift operation is neatly fused with 128-bit xor here, and # "538B" variant would eliminate only 4-5 instructions out of 32 # in the inner loop (meaning that estimated improvement is ~15%); # - ARM-based systems are often embedded ones and extra memory # consumption might be unappreciated (for so little improvement); # # Byte order [in]dependence. ========================================= # # Caller is expected to maintain specific *dword* order in Htable, # namely with *least* significant dword of 128-bit value at *lower* # address. This differs completely from C code and has everything to # do with ldm instruction and order in which dwords are "consumed" by # algorithm. *Byte* order within these dwords in turn is whatever # *native* byte order on current platform. See gcm128.c for working # example... $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $Xi="r0"; # argument block $Htbl="r1"; $inp="r2"; $len="r3"; $code=<<___; #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL @ instructions are in aesv8-armx.pl.) .arch armv7-a .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #define ldrplb ldrbpl #define ldrneb ldrbne #endif #if defined(__thumb2__) .thumb #else .code 32 #endif ___ { my ($Xl,$Xm,$Xh,$IN)=map("q$_",(0..3)); my ($t0,$t1,$t2,$t3)=map("q$_",(8..12)); my ($Hlo,$Hhi,$Hhl,$k48,$k32,$k16)=map("d$_",(26..31)); sub clmul64x64 { my ($r,$a,$b)=@_; $code.=<<___; vext.8 $t0#lo, $a, $a, #1 @ A1 vmull.p8 $t0, $t0#lo, $b @ F = A1*B vext.8 $r#lo, $b, $b, #1 @ B1 vmull.p8 $r, $a, $r#lo @ E = A*B1 vext.8 $t1#lo, $a, $a, #2 @ A2 vmull.p8 $t1, $t1#lo, $b @ H = A2*B vext.8 $t3#lo, $b, $b, #2 @ B2 vmull.p8 $t3, $a, $t3#lo @ G = A*B2 vext.8 $t2#lo, $a, $a, #3 @ A3 veor $t0, $t0, $r @ L = E + F vmull.p8 $t2, $t2#lo, $b @ J = A3*B vext.8 $r#lo, $b, $b, #3 @ B3 veor $t1, $t1, $t3 @ M = G + H vmull.p8 $r, $a, $r#lo @ I = A*B3 veor $t0#lo, $t0#lo, $t0#hi @ t0 = (L) (P0 + P1) << 8 vand $t0#hi, $t0#hi, $k48 vext.8 $t3#lo, $b, $b, #4 @ B4 veor $t1#lo, $t1#lo, $t1#hi @ t1 = (M) (P2 + P3) << 16 vand $t1#hi, $t1#hi, $k32 vmull.p8 $t3, $a, $t3#lo @ K = A*B4 veor $t2, $t2, $r @ N = I + J veor $t0#lo, $t0#lo, $t0#hi veor $t1#lo, $t1#lo, $t1#hi veor $t2#lo, $t2#lo, $t2#hi @ t2 = (N) (P4 + P5) << 24 vand $t2#hi, $t2#hi, $k16 vext.8 $t0, $t0, $t0, #15 veor $t3#lo, $t3#lo, $t3#hi @ t3 = (K) (P6 + P7) << 32 vmov.i64 $t3#hi, #0 vext.8 $t1, $t1, $t1, #14 veor $t2#lo, $t2#lo, $t2#hi vmull.p8 $r, $a, $b @ D = A*B vext.8 $t3, $t3, $t3, #12 vext.8 $t2, $t2, $t2, #13 veor $t0, $t0, $t1 veor $t2, $t2, $t3 veor $r, $r, $t0 veor $r, $r, $t2 ___ } $code.=<<___; #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .global GFp_gcm_init_neon .type GFp_gcm_init_neon,%function .align 4 GFp_gcm_init_neon: vld1.64 $IN#hi,[r1]! @ load H vmov.i8 $t0,#0xe1 vld1.64 $IN#lo,[r1] vshl.i64 $t0#hi,#57 vshr.u64 $t0#lo,#63 @ t0=0xc2....01 vdup.8 $t1,$IN#hi[7] vshr.u64 $Hlo,$IN#lo,#63 vshr.s8 $t1,#7 @ broadcast carry bit vshl.i64 $IN,$IN,#1 vand $t0,$t0,$t1 vorr $IN#hi,$Hlo @ H<<<=1 veor $IN,$IN,$t0 @ twisted H vstmia r0,{$IN} ret @ bx lr .size GFp_gcm_init_neon,.-GFp_gcm_init_neon .global GFp_gcm_gmult_neon .type GFp_gcm_gmult_neon,%function .align 4 GFp_gcm_gmult_neon: vld1.64 $IN#hi,[$Xi]! @ load Xi vld1.64 $IN#lo,[$Xi]! vmov.i64 $k48,#0x0000ffffffffffff vldmia $Htbl,{$Hlo-$Hhi} @ load twisted H vmov.i64 $k32,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 $IN,$IN #endif vmov.i64 $k16,#0x000000000000ffff veor $Hhl,$Hlo,$Hhi @ Karatsuba pre-processing mov $len,#16 b .Lgmult_neon .size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon .global GFp_gcm_ghash_neon .type GFp_gcm_ghash_neon,%function .align 4 GFp_gcm_ghash_neon: vld1.64 $Xl#hi,[$Xi]! @ load Xi vld1.64 $Xl#lo,[$Xi]! vmov.i64 $k48,#0x0000ffffffffffff vldmia $Htbl,{$Hlo-$Hhi} @ load twisted H vmov.i64 $k32,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 $Xl,$Xl #endif vmov.i64 $k16,#0x000000000000ffff veor $Hhl,$Hlo,$Hhi @ Karatsuba pre-processing .Loop_neon: vld1.64 $IN#hi,[$inp]! @ load inp vld1.64 $IN#lo,[$inp]! #ifdef __ARMEL__ vrev64.8 $IN,$IN #endif veor $IN,$Xl @ inp^=Xi .Lgmult_neon: ___ &clmul64x64 ($Xl,$Hlo,"$IN#lo"); # H.lo·Xi.lo $code.=<<___; veor $IN#lo,$IN#lo,$IN#hi @ Karatsuba pre-processing ___ &clmul64x64 ($Xm,$Hhl,"$IN#lo"); # (H.lo+H.hi)·(Xi.lo+Xi.hi) &clmul64x64 ($Xh,$Hhi,"$IN#hi"); # H.hi·Xi.hi $code.=<<___; veor $Xm,$Xm,$Xl @ Karatsuba post-processing veor $Xm,$Xm,$Xh veor $Xl#hi,$Xl#hi,$Xm#lo veor $Xh#lo,$Xh#lo,$Xm#hi @ Xh|Xl - 256-bit result @ equivalent of reduction_avx from ghash-x86_64.pl vshl.i64 $t1,$Xl,#57 @ 1st phase vshl.i64 $t2,$Xl,#62 veor $t2,$t2,$t1 @ vshl.i64 $t1,$Xl,#63 veor $t2, $t2, $t1 @ veor $Xl#hi,$Xl#hi,$t2#lo @ veor $Xh#lo,$Xh#lo,$t2#hi vshr.u64 $t2,$Xl,#1 @ 2nd phase veor $Xh,$Xh,$Xl veor $Xl,$Xl,$t2 @ vshr.u64 $t2,$t2,#6 vshr.u64 $Xl,$Xl,#1 @ veor $Xl,$Xl,$Xh @ veor $Xl,$Xl,$t2 @ subs $len,#16 bne .Loop_neon #ifdef __ARMEL__ vrev64.8 $Xl,$Xl #endif sub $Xi,#16 vst1.64 $Xl#hi,[$Xi]! @ write out Xi vst1.64 $Xl#lo,[$Xi] ret @ bx lr .size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon #endif ___ } $code.=<<___; .asciz "GHASH for ARMv4/NEON, CRYPTOGAMS by " .align 2 ___ foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or s/\bret\b/bx lr/go or s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4 print $_,"\n"; } close STDOUT or die "error closing STDOUT"; # enforce flush ring-0.16.9/crypto/fipsmodule/modes/asm/ghash-x86.pl000064400000000000000000000550541352416253600204040ustar0000000000000000#! /usr/bin/env perl # Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # March, May, June 2010 # # The module implements "4-bit" GCM GHASH function and underlying # single multiplication operation in GF(2^128). "4-bit" means that it # uses 256 bytes per-key table [+64/128 bytes fixed table]. It has two # code paths: vanilla x86 and vanilla SSE. Former will be executed on # 486 and Pentium, latter on all others. SSE GHASH features so called # "528B" variant of "4-bit" method utilizing additional 256+16 bytes # of per-key storage [+512 bytes shared table]. Performance results # are for streamed GHASH subroutine and are expressed in cycles per # processed byte, less is better: # # gcc 2.95.3(*) SSE assembler x86 assembler # # Pentium 105/111(**) - 50 # PIII 68 /75 12.2 24 # P4 125/125 17.8 84(***) # Opteron 66 /70 10.1 30 # Core2 54 /67 8.4 18 # Atom 105/105 16.8 53 # VIA Nano 69 /71 13.0 27 # # (*) gcc 3.4.x was observed to generate few percent slower code, # which is one of reasons why 2.95.3 results were chosen, # another reason is lack of 3.4.x results for older CPUs; # comparison with SSE results is not completely fair, because C # results are for vanilla "256B" implementation, while # assembler results are for "528B";-) # (**) second number is result for code compiled with -fPIC flag, # which is actually more relevant, because assembler code is # position-independent; # (***) see comment in non-MMX routine for further details; # # To summarize, it's >2-5 times faster than gcc-generated code. To # anchor it to something else SHA1 assembler processes one byte in # ~7 cycles on contemporary x86 cores. As for choice of MMX/SSE # in particular, see comment at the end of the file... # May 2010 # # Add PCLMULQDQ version performing at 2.10 cycles per processed byte. # The question is how close is it to theoretical limit? The pclmulqdq # instruction latency appears to be 14 cycles and there can't be more # than 2 of them executing at any given time. This means that single # Karatsuba multiplication would take 28 cycles *plus* few cycles for # pre- and post-processing. Then multiplication has to be followed by # modulo-reduction. Given that aggregated reduction method [see # "Carry-less Multiplication and Its Usage for Computing the GCM Mode" # white paper by Intel] allows you to perform reduction only once in # a while we can assume that asymptotic performance can be estimated # as (28+Tmod/Naggr)/16, where Tmod is time to perform reduction # and Naggr is the aggregation factor. # # Before we proceed to this implementation let's have closer look at # the best-performing code suggested by Intel in their white paper. # By tracing inter-register dependencies Tmod is estimated as ~19 # cycles and Naggr chosen by Intel is 4, resulting in 2.05 cycles per # processed byte. As implied, this is quite optimistic estimate, # because it does not account for Karatsuba pre- and post-processing, # which for a single multiplication is ~5 cycles. Unfortunately Intel # does not provide performance data for GHASH alone. But benchmarking # AES_GCM_encrypt ripped out of Fig. 15 of the white paper with aadt # alone resulted in 2.46 cycles per byte of out 16KB buffer. Note that # the result accounts even for pre-computing of degrees of the hash # key H, but its portion is negligible at 16KB buffer size. # # Moving on to the implementation in question. Tmod is estimated as # ~13 cycles and Naggr is 2, giving asymptotic performance of ... # 2.16. How is it possible that measured performance is better than # optimistic theoretical estimate? There is one thing Intel failed # to recognize. By serializing GHASH with CTR in same subroutine # former's performance is really limited to above (Tmul + Tmod/Naggr) # equation. But if GHASH procedure is detached, the modulo-reduction # can be interleaved with Naggr-1 multiplications at instruction level # and under ideal conditions even disappear from the equation. So that # optimistic theoretical estimate for this implementation is ... # 28/16=1.75, and not 2.16. Well, it's probably way too optimistic, # at least for such small Naggr. I'd argue that (28+Tproc/Naggr), # where Tproc is time required for Karatsuba pre- and post-processing, # is more realistic estimate. In this case it gives ... 1.91 cycles. # Or in other words, depending on how well we can interleave reduction # and one of the two multiplications the performance should be between # 1.91 and 2.16. As already mentioned, this implementation processes # one byte out of 8KB buffer in 2.10 cycles, while x86_64 counterpart # - in 2.02. x86_64 performance is better, because larger register # bank allows to interleave reduction and multiplication better. # # Does it make sense to increase Naggr? To start with it's virtually # impossible in 32-bit mode, because of limited register bank # capacity. Otherwise improvement has to be weighed against slower # setup, as well as code size and complexity increase. As even # optimistic estimate doesn't promise 30% performance improvement, # there are currently no plans to increase Naggr. # # Special thanks to David Woodhouse for providing access to a # Westmere-based system on behalf of Intel Open Source Technology Centre. # January 2010 # # Tweaked to optimize transitions between integer and FP operations # on same XMM register, PCLMULQDQ subroutine was measured to process # one byte in 2.07 cycles on Sandy Bridge, and in 2.12 - on Westmere. # The minor regression on Westmere is outweighed by ~15% improvement # on Sandy Bridge. Strangely enough attempt to modify 64-bit code in # similar manner resulted in almost 20% degradation on Sandy Bridge, # where original 64-bit code processes one byte in 1.95 cycles. ##################################################################### # For reference, AMD Bulldozer processes one byte in 1.98 cycles in # 32-bit mode and 1.89 in 64-bit. # February 2013 # # Overhaul: aggregate Karatsuba post-processing, improve ILP in # reduction_alg9. Resulting performance is 1.96 cycles per byte on # Westmere, 1.95 - on Sandy/Ivy Bridge, 1.76 - on Bulldozer. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../../perlasm"); require "x86asm.pl"; $output=pop; open STDOUT,">$output"; &asm_init($ARGV[0],$x86only = $ARGV[$#ARGV] eq "386"); $sse2=1; if ($sse2) {{ ###################################################################### # PCLMULQDQ version. $Xip="eax"; $Htbl="edx"; $const="ecx"; $inp="esi"; $len="ebx"; ($Xi,$Xhi)=("xmm0","xmm1"); $Hkey="xmm2"; ($T1,$T2,$T3)=("xmm3","xmm4","xmm5"); ($Xn,$Xhn)=("xmm6","xmm7"); &static_label("bswap"); sub clmul64x64_T2 { # minimal "register" pressure my ($Xhi,$Xi,$Hkey,$HK)=@_; &movdqa ($Xhi,$Xi); # &pshufd ($T1,$Xi,0b01001110); &pshufd ($T2,$Hkey,0b01001110) if (!defined($HK)); &pxor ($T1,$Xi); # &pxor ($T2,$Hkey) if (!defined($HK)); $HK=$T2 if (!defined($HK)); &pclmulqdq ($Xi,$Hkey,0x00); ####### &pclmulqdq ($Xhi,$Hkey,0x11); ####### &pclmulqdq ($T1,$HK,0x00); ####### &xorps ($T1,$Xi); # &xorps ($T1,$Xhi); # &movdqa ($T2,$T1); # &psrldq ($T1,8); &pslldq ($T2,8); # &pxor ($Xhi,$T1); &pxor ($Xi,$T2); # } sub clmul64x64_T3 { # Even though this subroutine offers visually better ILP, it # was empirically found to be a tad slower than above version. # At least in GFp_gcm_ghash_clmul context. But it's just as well, # because loop modulo-scheduling is possible only thanks to # minimized "register" pressure... my ($Xhi,$Xi,$Hkey)=@_; &movdqa ($T1,$Xi); # &movdqa ($Xhi,$Xi); &pclmulqdq ($Xi,$Hkey,0x00); ####### &pclmulqdq ($Xhi,$Hkey,0x11); ####### &pshufd ($T2,$T1,0b01001110); # &pshufd ($T3,$Hkey,0b01001110); &pxor ($T2,$T1); # &pxor ($T3,$Hkey); &pclmulqdq ($T2,$T3,0x00); ####### &pxor ($T2,$Xi); # &pxor ($T2,$Xhi); # &movdqa ($T3,$T2); # &psrldq ($T2,8); &pslldq ($T3,8); # &pxor ($Xhi,$T2); &pxor ($Xi,$T3); # } if (1) { # Algorithm 9 with <<1 twist. # Reduction is shorter and uses only two # temporary registers, which makes it better # candidate for interleaving with 64x64 # multiplication. Pre-modulo-scheduled loop # was found to be ~20% faster than Algorithm 5 # below. Algorithm 9 was therefore chosen for # further optimization... sub reduction_alg9 { # 17/11 times faster than Intel version my ($Xhi,$Xi) = @_; # 1st phase &movdqa ($T2,$Xi); # &movdqa ($T1,$Xi); &psllq ($Xi,5); &pxor ($T1,$Xi); # &psllq ($Xi,1); &pxor ($Xi,$T1); # &psllq ($Xi,57); # &movdqa ($T1,$Xi); # &pslldq ($Xi,8); &psrldq ($T1,8); # &pxor ($Xi,$T2); &pxor ($Xhi,$T1); # # 2nd phase &movdqa ($T2,$Xi); &psrlq ($Xi,1); &pxor ($Xhi,$T2); # &pxor ($T2,$Xi); &psrlq ($Xi,5); &pxor ($Xi,$T2); # &psrlq ($Xi,1); # &pxor ($Xi,$Xhi) # } &function_begin_B("GFp_gcm_init_clmul"); &mov ($Htbl,&wparam(0)); &mov ($Xip,&wparam(1)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Hkey,&QWP(0,$Xip)); &pshufd ($Hkey,$Hkey,0b01001110);# dword swap # <<1 twist &pshufd ($T2,$Hkey,0b11111111); # broadcast uppermost dword &movdqa ($T1,$Hkey); &psllq ($Hkey,1); &pxor ($T3,$T3); # &psrlq ($T1,63); &pcmpgtd ($T3,$T2); # broadcast carry bit &pslldq ($T1,8); &por ($Hkey,$T1); # H<<=1 # magic reduction &pand ($T3,&QWP(16,$const)); # 0x1c2_polynomial &pxor ($Hkey,$T3); # if(carry) H^=0x1c2_polynomial # calculate H^2 &movdqa ($Xi,$Hkey); &clmul64x64_T2 ($Xhi,$Xi,$Hkey); &reduction_alg9 ($Xhi,$Xi); &pshufd ($T1,$Hkey,0b01001110); &pshufd ($T2,$Xi,0b01001110); &pxor ($T1,$Hkey); # Karatsuba pre-processing &movdqu (&QWP(0,$Htbl),$Hkey); # save H &pxor ($T2,$Xi); # Karatsuba pre-processing &movdqu (&QWP(16,$Htbl),$Xi); # save H^2 &palignr ($T2,$T1,8); # low part is H.lo^H.hi &movdqu (&QWP(32,$Htbl),$T2); # save Karatsuba "salt" &ret (); &function_end_B("GFp_gcm_init_clmul"); &function_begin_B("GFp_gcm_gmult_clmul"); &mov ($Xip,&wparam(0)); &mov ($Htbl,&wparam(1)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Xi,&QWP(0,$Xip)); &movdqa ($T3,&QWP(0,$const)); &movups ($Hkey,&QWP(0,$Htbl)); &pshufb ($Xi,$T3); &movups ($T2,&QWP(32,$Htbl)); &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$T2); &reduction_alg9 ($Xhi,$Xi); &pshufb ($Xi,$T3); &movdqu (&QWP(0,$Xip),$Xi); &ret (); &function_end_B("GFp_gcm_gmult_clmul"); &function_begin("GFp_gcm_ghash_clmul"); &mov ($Xip,&wparam(0)); &mov ($Htbl,&wparam(1)); &mov ($inp,&wparam(2)); &mov ($len,&wparam(3)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Xi,&QWP(0,$Xip)); &movdqa ($T3,&QWP(0,$const)); &movdqu ($Hkey,&QWP(0,$Htbl)); &pshufb ($Xi,$T3); &sub ($len,0x10); &jz (&label("odd_tail")); ####### # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = # [(H*Ii+1) + (H*Xi+1)] mod P = # [(H*Ii+1) + H^2*(Ii+Xi)] mod P # &movdqu ($T1,&QWP(0,$inp)); # Ii &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 &pshufb ($T1,$T3); &pshufb ($Xn,$T3); &movdqu ($T3,&QWP(32,$Htbl)); &pxor ($Xi,$T1); # Ii+Xi &pshufd ($T1,$Xn,0b01001110); # H*Ii+1 &movdqa ($Xhn,$Xn); &pxor ($T1,$Xn); # &lea ($inp,&DWP(32,$inp)); # i+=2 &pclmulqdq ($Xn,$Hkey,0x00); ####### &pclmulqdq ($Xhn,$Hkey,0x11); ####### &pclmulqdq ($T1,$T3,0x00); ####### &movups ($Hkey,&QWP(16,$Htbl)); # load H^2 &nop (); &sub ($len,0x20); &jbe (&label("even_tail")); &jmp (&label("mod_loop")); &set_label("mod_loop",32); &pshufd ($T2,$Xi,0b01001110); # H^2*(Ii+Xi) &movdqa ($Xhi,$Xi); &pxor ($T2,$Xi); # &nop (); &pclmulqdq ($Xi,$Hkey,0x00); ####### &pclmulqdq ($Xhi,$Hkey,0x11); ####### &pclmulqdq ($T2,$T3,0x10); ####### &movups ($Hkey,&QWP(0,$Htbl)); # load H &xorps ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) &movdqa ($T3,&QWP(0,$const)); &xorps ($Xhi,$Xhn); &movdqu ($Xhn,&QWP(0,$inp)); # Ii &pxor ($T1,$Xi); # aggregated Karatsuba post-processing &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 &pxor ($T1,$Xhi); # &pshufb ($Xhn,$T3); &pxor ($T2,$T1); # &movdqa ($T1,$T2); # &psrldq ($T2,8); &pslldq ($T1,8); # &pxor ($Xhi,$T2); &pxor ($Xi,$T1); # &pshufb ($Xn,$T3); &pxor ($Xhi,$Xhn); # "Ii+Xi", consume early &movdqa ($Xhn,$Xn); #&clmul64x64_TX ($Xhn,$Xn,$Hkey); H*Ii+1 &movdqa ($T2,$Xi); #&reduction_alg9($Xhi,$Xi); 1st phase &movdqa ($T1,$Xi); &psllq ($Xi,5); &pxor ($T1,$Xi); # &psllq ($Xi,1); &pxor ($Xi,$T1); # &pclmulqdq ($Xn,$Hkey,0x00); ####### &movups ($T3,&QWP(32,$Htbl)); &psllq ($Xi,57); # &movdqa ($T1,$Xi); # &pslldq ($Xi,8); &psrldq ($T1,8); # &pxor ($Xi,$T2); &pxor ($Xhi,$T1); # &pshufd ($T1,$Xhn,0b01001110); &movdqa ($T2,$Xi); # 2nd phase &psrlq ($Xi,1); &pxor ($T1,$Xhn); &pxor ($Xhi,$T2); # &pclmulqdq ($Xhn,$Hkey,0x11); ####### &movups ($Hkey,&QWP(16,$Htbl)); # load H^2 &pxor ($T2,$Xi); &psrlq ($Xi,5); &pxor ($Xi,$T2); # &psrlq ($Xi,1); # &pxor ($Xi,$Xhi) # &pclmulqdq ($T1,$T3,0x00); ####### &lea ($inp,&DWP(32,$inp)); &sub ($len,0x20); &ja (&label("mod_loop")); &set_label("even_tail"); &pshufd ($T2,$Xi,0b01001110); # H^2*(Ii+Xi) &movdqa ($Xhi,$Xi); &pxor ($T2,$Xi); # &pclmulqdq ($Xi,$Hkey,0x00); ####### &pclmulqdq ($Xhi,$Hkey,0x11); ####### &pclmulqdq ($T2,$T3,0x10); ####### &movdqa ($T3,&QWP(0,$const)); &xorps ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) &xorps ($Xhi,$Xhn); &pxor ($T1,$Xi); # aggregated Karatsuba post-processing &pxor ($T1,$Xhi); # &pxor ($T2,$T1); # &movdqa ($T1,$T2); # &psrldq ($T2,8); &pslldq ($T1,8); # &pxor ($Xhi,$T2); &pxor ($Xi,$T1); # &reduction_alg9 ($Xhi,$Xi); &test ($len,$len); &jnz (&label("done")); &movups ($Hkey,&QWP(0,$Htbl)); # load H &set_label("odd_tail"); &movdqu ($T1,&QWP(0,$inp)); # Ii &pshufb ($T1,$T3); &pxor ($Xi,$T1); # Ii+Xi &clmul64x64_T2 ($Xhi,$Xi,$Hkey); # H*(Ii+Xi) &reduction_alg9 ($Xhi,$Xi); &set_label("done"); &pshufb ($Xi,$T3); &movdqu (&QWP(0,$Xip),$Xi); &function_end("GFp_gcm_ghash_clmul"); } else { # Algorithm 5. Kept for reference purposes. sub reduction_alg5 { # 19/16 times faster than Intel version my ($Xhi,$Xi)=@_; # <<1 &movdqa ($T1,$Xi); # &movdqa ($T2,$Xhi); &pslld ($Xi,1); &pslld ($Xhi,1); # &psrld ($T1,31); &psrld ($T2,31); # &movdqa ($T3,$T1); &pslldq ($T1,4); &psrldq ($T3,12); # &pslldq ($T2,4); &por ($Xhi,$T3); # &por ($Xi,$T1); &por ($Xhi,$T2); # # 1st phase &movdqa ($T1,$Xi); &movdqa ($T2,$Xi); &movdqa ($T3,$Xi); # &pslld ($T1,31); &pslld ($T2,30); &pslld ($Xi,25); # &pxor ($T1,$T2); &pxor ($T1,$Xi); # &movdqa ($T2,$T1); # &pslldq ($T1,12); &psrldq ($T2,4); # &pxor ($T3,$T1); # 2nd phase &pxor ($Xhi,$T3); # &movdqa ($Xi,$T3); &movdqa ($T1,$T3); &psrld ($Xi,1); # &psrld ($T1,2); &psrld ($T3,7); # &pxor ($Xi,$T1); &pxor ($Xhi,$T2); &pxor ($Xi,$T3); # &pxor ($Xi,$Xhi); # } &function_begin_B("GFp_gcm_init_clmul"); &mov ($Htbl,&wparam(0)); &mov ($Xip,&wparam(1)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Hkey,&QWP(0,$Xip)); &pshufd ($Hkey,$Hkey,0b01001110);# dword swap # calculate H^2 &movdqa ($Xi,$Hkey); &clmul64x64_T3 ($Xhi,$Xi,$Hkey); &reduction_alg5 ($Xhi,$Xi); &movdqu (&QWP(0,$Htbl),$Hkey); # save H &movdqu (&QWP(16,$Htbl),$Xi); # save H^2 &ret (); &function_end_B("GFp_gcm_init_clmul"); &function_begin_B("GFp_gcm_gmult_clmul"); &mov ($Xip,&wparam(0)); &mov ($Htbl,&wparam(1)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Xi,&QWP(0,$Xip)); &movdqa ($Xn,&QWP(0,$const)); &movdqu ($Hkey,&QWP(0,$Htbl)); &pshufb ($Xi,$Xn); &clmul64x64_T3 ($Xhi,$Xi,$Hkey); &reduction_alg5 ($Xhi,$Xi); &pshufb ($Xi,$Xn); &movdqu (&QWP(0,$Xip),$Xi); &ret (); &function_end_B("GFp_gcm_gmult_clmul"); &function_begin("GFp_gcm_ghash_clmul"); &mov ($Xip,&wparam(0)); &mov ($Htbl,&wparam(1)); &mov ($inp,&wparam(2)); &mov ($len,&wparam(3)); &call (&label("pic")); &set_label("pic"); &blindpop ($const); &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); &movdqu ($Xi,&QWP(0,$Xip)); &movdqa ($T3,&QWP(0,$const)); &movdqu ($Hkey,&QWP(0,$Htbl)); &pshufb ($Xi,$T3); &sub ($len,0x10); &jz (&label("odd_tail")); ####### # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = # [(H*Ii+1) + (H*Xi+1)] mod P = # [(H*Ii+1) + H^2*(Ii+Xi)] mod P # &movdqu ($T1,&QWP(0,$inp)); # Ii &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 &pshufb ($T1,$T3); &pshufb ($Xn,$T3); &pxor ($Xi,$T1); # Ii+Xi &clmul64x64_T3 ($Xhn,$Xn,$Hkey); # H*Ii+1 &movdqu ($Hkey,&QWP(16,$Htbl)); # load H^2 &sub ($len,0x20); &lea ($inp,&DWP(32,$inp)); # i+=2 &jbe (&label("even_tail")); &set_label("mod_loop"); &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H^2*(Ii+Xi) &movdqu ($Hkey,&QWP(0,$Htbl)); # load H &pxor ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) &pxor ($Xhi,$Xhn); &reduction_alg5 ($Xhi,$Xi); ####### &movdqa ($T3,&QWP(0,$const)); &movdqu ($T1,&QWP(0,$inp)); # Ii &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 &pshufb ($T1,$T3); &pshufb ($Xn,$T3); &pxor ($Xi,$T1); # Ii+Xi &clmul64x64_T3 ($Xhn,$Xn,$Hkey); # H*Ii+1 &movdqu ($Hkey,&QWP(16,$Htbl)); # load H^2 &sub ($len,0x20); &lea ($inp,&DWP(32,$inp)); &ja (&label("mod_loop")); &set_label("even_tail"); &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H^2*(Ii+Xi) &pxor ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) &pxor ($Xhi,$Xhn); &reduction_alg5 ($Xhi,$Xi); &movdqa ($T3,&QWP(0,$const)); &test ($len,$len); &jnz (&label("done")); &movdqu ($Hkey,&QWP(0,$Htbl)); # load H &set_label("odd_tail"); &movdqu ($T1,&QWP(0,$inp)); # Ii &pshufb ($T1,$T3); &pxor ($Xi,$T1); # Ii+Xi &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H*(Ii+Xi) &reduction_alg5 ($Xhi,$Xi); &movdqa ($T3,&QWP(0,$const)); &set_label("done"); &pshufb ($Xi,$T3); &movdqu (&QWP(0,$Xip),$Xi); &function_end("GFp_gcm_ghash_clmul"); } &set_label("bswap",64); &data_byte(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); &data_byte(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2); # 0x1c2_polynomial &set_label("rem_8bit",64); &data_short(0x0000,0x01C2,0x0384,0x0246,0x0708,0x06CA,0x048C,0x054E); &data_short(0x0E10,0x0FD2,0x0D94,0x0C56,0x0918,0x08DA,0x0A9C,0x0B5E); &data_short(0x1C20,0x1DE2,0x1FA4,0x1E66,0x1B28,0x1AEA,0x18AC,0x196E); &data_short(0x1230,0x13F2,0x11B4,0x1076,0x1538,0x14FA,0x16BC,0x177E); &data_short(0x3840,0x3982,0x3BC4,0x3A06,0x3F48,0x3E8A,0x3CCC,0x3D0E); &data_short(0x3650,0x3792,0x35D4,0x3416,0x3158,0x309A,0x32DC,0x331E); &data_short(0x2460,0x25A2,0x27E4,0x2626,0x2368,0x22AA,0x20EC,0x212E); &data_short(0x2A70,0x2BB2,0x29F4,0x2836,0x2D78,0x2CBA,0x2EFC,0x2F3E); &data_short(0x7080,0x7142,0x7304,0x72C6,0x7788,0x764A,0x740C,0x75CE); &data_short(0x7E90,0x7F52,0x7D14,0x7CD6,0x7998,0x785A,0x7A1C,0x7BDE); &data_short(0x6CA0,0x6D62,0x6F24,0x6EE6,0x6BA8,0x6A6A,0x682C,0x69EE); &data_short(0x62B0,0x6372,0x6134,0x60F6,0x65B8,0x647A,0x663C,0x67FE); &data_short(0x48C0,0x4902,0x4B44,0x4A86,0x4FC8,0x4E0A,0x4C4C,0x4D8E); &data_short(0x46D0,0x4712,0x4554,0x4496,0x41D8,0x401A,0x425C,0x439E); &data_short(0x54E0,0x5522,0x5764,0x56A6,0x53E8,0x522A,0x506C,0x51AE); &data_short(0x5AF0,0x5B32,0x5974,0x58B6,0x5DF8,0x5C3A,0x5E7C,0x5FBE); &data_short(0xE100,0xE0C2,0xE284,0xE346,0xE608,0xE7CA,0xE58C,0xE44E); &data_short(0xEF10,0xEED2,0xEC94,0xED56,0xE818,0xE9DA,0xEB9C,0xEA5E); &data_short(0xFD20,0xFCE2,0xFEA4,0xFF66,0xFA28,0xFBEA,0xF9AC,0xF86E); &data_short(0xF330,0xF2F2,0xF0B4,0xF176,0xF438,0xF5FA,0xF7BC,0xF67E); &data_short(0xD940,0xD882,0xDAC4,0xDB06,0xDE48,0xDF8A,0xDDCC,0xDC0E); &data_short(0xD750,0xD692,0xD4D4,0xD516,0xD058,0xD19A,0xD3DC,0xD21E); &data_short(0xC560,0xC4A2,0xC6E4,0xC726,0xC268,0xC3AA,0xC1EC,0xC02E); &data_short(0xCB70,0xCAB2,0xC8F4,0xC936,0xCC78,0xCDBA,0xCFFC,0xCE3E); &data_short(0x9180,0x9042,0x9204,0x93C6,0x9688,0x974A,0x950C,0x94CE); &data_short(0x9F90,0x9E52,0x9C14,0x9DD6,0x9898,0x995A,0x9B1C,0x9ADE); &data_short(0x8DA0,0x8C62,0x8E24,0x8FE6,0x8AA8,0x8B6A,0x892C,0x88EE); &data_short(0x83B0,0x8272,0x8034,0x81F6,0x84B8,0x857A,0x873C,0x86FE); &data_short(0xA9C0,0xA802,0xAA44,0xAB86,0xAEC8,0xAF0A,0xAD4C,0xAC8E); &data_short(0xA7D0,0xA612,0xA454,0xA596,0xA0D8,0xA11A,0xA35C,0xA29E); &data_short(0xB5E0,0xB422,0xB664,0xB7A6,0xB2E8,0xB32A,0xB16C,0xB0AE); &data_short(0xBBF0,0xBA32,0xB874,0xB9B6,0xBCF8,0xBD3A,0xBF7C,0xBEBE); }} # $sse2 &asciz("GHASH for x86, CRYPTOGAMS by "); &asm_finish(); close STDOUT or die "error closing STDOUT"; # A question was risen about choice of vanilla MMX. Or rather why wasn't # SSE2 chosen instead? In addition to the fact that MMX runs on legacy # CPUs such as PIII, "4-bit" MMX version was observed to provide better # performance than *corresponding* SSE2 one even on contemporary CPUs. # SSE2 results were provided by Peter-Michael Hager. He maintains SSE2 # implementation featuring full range of lookup-table sizes, but with # per-invocation lookup table setup. Latter means that table size is # chosen depending on how much data is to be hashed in every given call, # more data - larger table. Best reported result for Core2 is ~4 cycles # per processed byte out of 64KB block. This number accounts even for # 64KB table setup overhead. As discussed in gcm128.c we choose to be # more conservative in respect to lookup table sizes, but how do the # results compare? Minimalistic "256B" MMX version delivers ~11 cycles # on same platform. As also discussed in gcm128.c, next in line "8-bit # Shoup's" or "4KB" method should deliver twice the performance of # "256B" one, in other words not worse than ~6 cycles per byte. It # should be also be noted that in SSE2 case improvement can be "super- # linear," i.e. more than twice, mostly because >>8 maps to single # instruction on SSE2 register. This is unlike "4-bit" case when >>4 # maps to same amount of instructions in both MMX and SSE2 cases. # Bottom line is that switch to SSE2 is considered to be justifiable # only in case we choose to implement "8-bit" method... ring-0.16.9/crypto/fipsmodule/modes/asm/ghash-x86_64.pl000064400000000000000000001036721352416253600207150ustar0000000000000000#! /usr/bin/env perl # Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # March, June 2010 # # The module implements "4-bit" GCM GHASH function and underlying # single multiplication operation in GF(2^128). "4-bit" means that # it uses 256 bytes per-key table [+128 bytes shared table]. GHASH # function features so called "528B" variant utilizing additional # 256+16 bytes of per-key storage [+512 bytes shared table]. # Performance results are for this streamed GHASH subroutine and are # expressed in cycles per processed byte, less is better: # # gcc 3.4.x(*) assembler # # P4 28.6 14.0 +100% # Opteron 19.3 7.7 +150% # Core2 17.8 8.1(**) +120% # Atom 31.6 16.8 +88% # VIA Nano 21.8 10.1 +115% # # (*) comparison is not completely fair, because C results are # for vanilla "256B" implementation, while assembler results # are for "528B";-) # (**) it's mystery [to me] why Core2 result is not same as for # Opteron; # May 2010 # # Add PCLMULQDQ version performing at 2.02 cycles per processed byte. # See ghash-x86.pl for background information and details about coding # techniques. # # Special thanks to David Woodhouse for providing access to a # Westmere-based system on behalf of Intel Open Source Technology Centre. # December 2012 # # Overhaul: aggregate Karatsuba post-processing, improve ILP in # reduction_alg9, increase reduction aggregate factor to 4x. As for # the latter. ghash-x86.pl discusses that it makes lesser sense to # increase aggregate factor. Then why increase here? Critical path # consists of 3 independent pclmulqdq instructions, Karatsuba post- # processing and reduction. "On top" of this we lay down aggregated # multiplication operations, triplets of independent pclmulqdq's. As # issue rate for pclmulqdq is limited, it makes lesser sense to # aggregate more multiplications than it takes to perform remaining # non-multiplication operations. 2x is near-optimal coefficient for # contemporary Intel CPUs (therefore modest improvement coefficient), # but not for Bulldozer. Latter is because logical SIMD operations # are twice as slow in comparison to Intel, so that critical path is # longer. A CPU with higher pclmulqdq issue rate would also benefit # from higher aggregate factor... # # Westmere 1.78(+13%) # Sandy Bridge 1.80(+8%) # Ivy Bridge 1.80(+7%) # Haswell 0.55(+93%) (if system doesn't support AVX) # Broadwell 0.45(+110%)(if system doesn't support AVX) # Skylake 0.44(+110%)(if system doesn't support AVX) # Bulldozer 1.49(+27%) # Silvermont 2.88(+13%) # Knights L 2.12(-) (if system doesn't support AVX) # Goldmont 1.08(+24%) # March 2013 # # ... 8x aggregate factor AVX code path is using reduction algorithm # suggested by Shay Gueron[1]. Even though contemporary AVX-capable # CPUs such as Sandy and Ivy Bridge can execute it, the code performs # sub-optimally in comparison to above mentioned version. But thanks # to Ilya Albrekht and Max Locktyukhin of Intel Corp. we knew that # it performs in 0.41 cycles per byte on Haswell processor, in # 0.29 on Broadwell, and in 0.36 on Skylake. # # Knights Landing achieves 1.09 cpb. # # [1] http://rt.openssl.org/Ticket/Display.html?id=2900&user=guest&pass=guest $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; # See the notes about |$avx| in aesni-gcm-x86_64.pl; otherwise tags will be # computed incorrectly. # # In upstream, this is controlled by shelling out to the compiler to check # versions, but BoringSSL is intended to be used with pre-generated perlasm # output, so this isn't useful anyway. $avx = 1; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; $do4xaggr=1; $code=<<___; .text .extern GFp_ia32cap_P ___ ###################################################################### # PCLMULQDQ version. @_4args=$win64? ("%rcx","%rdx","%r8", "%r9") : # Win64 order ("%rdi","%rsi","%rdx","%rcx"); # Unix order ($Xi,$Xhi)=("%xmm0","%xmm1"); $Hkey="%xmm2"; ($T1,$T2,$T3)=("%xmm3","%xmm4","%xmm5"); sub clmul64x64_T2 { # minimal register pressure my ($Xhi,$Xi,$Hkey,$HK)=@_; if (!defined($HK)) { $HK = $T2; $code.=<<___; movdqa $Xi,$Xhi # pshufd \$0b01001110,$Xi,$T1 pshufd \$0b01001110,$Hkey,$T2 pxor $Xi,$T1 # pxor $Hkey,$T2 ___ } else { $code.=<<___; movdqa $Xi,$Xhi # pshufd \$0b01001110,$Xi,$T1 pxor $Xi,$T1 # ___ } $code.=<<___; pclmulqdq \$0x00,$Hkey,$Xi ####### pclmulqdq \$0x11,$Hkey,$Xhi ####### pclmulqdq \$0x00,$HK,$T1 ####### pxor $Xi,$T1 # pxor $Xhi,$T1 # movdqa $T1,$T2 # psrldq \$8,$T1 pslldq \$8,$T2 # pxor $T1,$Xhi pxor $T2,$Xi # ___ } sub reduction_alg9 { # 17/11 times faster than Intel version my ($Xhi,$Xi) = @_; $code.=<<___; # 1st phase movdqa $Xi,$T2 # movdqa $Xi,$T1 psllq \$5,$Xi pxor $Xi,$T1 # psllq \$1,$Xi pxor $T1,$Xi # psllq \$57,$Xi # movdqa $Xi,$T1 # pslldq \$8,$Xi psrldq \$8,$T1 # pxor $T2,$Xi pxor $T1,$Xhi # # 2nd phase movdqa $Xi,$T2 psrlq \$1,$Xi pxor $T2,$Xhi # pxor $Xi,$T2 psrlq \$5,$Xi pxor $T2,$Xi # psrlq \$1,$Xi # pxor $Xhi,$Xi # ___ } { my ($Htbl,$Xip)=@_4args; my $HK="%xmm6"; $code.=<<___; .globl GFp_gcm_init_clmul .type GFp_gcm_init_clmul,\@abi-omnipotent .align 16 GFp_gcm_init_clmul: .cfi_startproc .L_init_clmul: ___ $code.=<<___ if ($win64); .LSEH_begin_GFp_gcm_init_clmul: # I can't trust assembler to use specific encoding:-( .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) ___ $code.=<<___; movdqu ($Xip),$Hkey pshufd \$0b01001110,$Hkey,$Hkey # dword swap # <<1 twist pshufd \$0b11111111,$Hkey,$T2 # broadcast uppermost dword movdqa $Hkey,$T1 psllq \$1,$Hkey pxor $T3,$T3 # psrlq \$63,$T1 pcmpgtd $T2,$T3 # broadcast carry bit pslldq \$8,$T1 por $T1,$Hkey # H<<=1 # magic reduction pand .L0x1c2_polynomial(%rip),$T3 pxor $T3,$Hkey # if(carry) H^=0x1c2_polynomial # calculate H^2 pshufd \$0b01001110,$Hkey,$HK movdqa $Hkey,$Xi pxor $Hkey,$HK ___ &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); &reduction_alg9 ($Xhi,$Xi); $code.=<<___; pshufd \$0b01001110,$Hkey,$T1 pshufd \$0b01001110,$Xi,$T2 pxor $Hkey,$T1 # Karatsuba pre-processing movdqu $Hkey,0x00($Htbl) # save H pxor $Xi,$T2 # Karatsuba pre-processing movdqu $Xi,0x10($Htbl) # save H^2 palignr \$8,$T1,$T2 # low part is H.lo^H.hi... movdqu $T2,0x20($Htbl) # save Karatsuba "salt" ___ if ($do4xaggr) { &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H^3 &reduction_alg9 ($Xhi,$Xi); $code.=<<___; movdqa $Xi,$T3 ___ &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H^4 &reduction_alg9 ($Xhi,$Xi); $code.=<<___; pshufd \$0b01001110,$T3,$T1 pshufd \$0b01001110,$Xi,$T2 pxor $T3,$T1 # Karatsuba pre-processing movdqu $T3,0x30($Htbl) # save H^3 pxor $Xi,$T2 # Karatsuba pre-processing movdqu $Xi,0x40($Htbl) # save H^4 palignr \$8,$T1,$T2 # low part is H^3.lo^H^3.hi... movdqu $T2,0x50($Htbl) # save Karatsuba "salt" ___ } $code.=<<___ if ($win64); movaps (%rsp),%xmm6 lea 0x18(%rsp),%rsp .LSEH_end_GFp_gcm_init_clmul: ___ $code.=<<___; ret .cfi_endproc .size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul ___ } { my ($Xip,$Htbl)=@_4args; $code.=<<___; .globl GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,\@abi-omnipotent .align 16 .cfi_startproc GFp_gcm_gmult_clmul: movdqu ($Xip),$Xi movdqa .Lbswap_mask(%rip),$T3 movdqu ($Htbl),$Hkey movdqu 0x20($Htbl),$T2 pshufb $T3,$Xi ___ &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$T2); $code.=<<___ if (0 || (&reduction_alg9($Xhi,$Xi)&&0)); # experimental alternative. special thing about is that there # no dependency between the two multiplications... mov \$`0xE1<<1`,%eax mov \$0xA040608020C0E000,%r10 # ((7..0)·0xE0)&0xff mov \$0x07,%r11d movq %rax,$T1 movq %r10,$T2 movq %r11,$T3 # borrow $T3 pand $Xi,$T3 pshufb $T3,$T2 # ($Xi&7)·0xE0 movq %rax,$T3 pclmulqdq \$0x00,$Xi,$T1 # ·(0xE1<<1) pxor $Xi,$T2 pslldq \$15,$T2 paddd $T2,$T2 # <<(64+56+1) pxor $T2,$Xi pclmulqdq \$0x01,$T3,$Xi movdqa .Lbswap_mask(%rip),$T3 # reload $T3 psrldq \$1,$T1 pxor $T1,$Xhi pslldq \$7,$Xi pxor $Xhi,$Xi ___ $code.=<<___; pshufb $T3,$Xi movdqu $Xi,($Xip) ret .cfi_endproc .size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul ___ } { my ($Xip,$Htbl,$inp,$len)=@_4args; my ($Xln,$Xmn,$Xhn,$Hkey2,$HK) = map("%xmm$_",(3..7)); my ($T1,$T2,$T3)=map("%xmm$_",(8..10)); $code.=<<___; .globl GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,\@abi-omnipotent .align 32 GFp_gcm_ghash_clmul: .cfi_startproc .L_ghash_clmul: ___ $code.=<<___ if ($win64); lea -0x88(%rsp),%rax .LSEH_begin_GFp_gcm_ghash_clmul: # I can't trust assembler to use specific encoding:-( .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) ___ $code.=<<___; movdqa .Lbswap_mask(%rip),$T3 movdqu ($Xip),$Xi movdqu ($Htbl),$Hkey movdqu 0x20($Htbl),$HK pshufb $T3,$Xi sub \$0x10,$len jz .Lodd_tail movdqu 0x10($Htbl),$Hkey2 ___ if ($do4xaggr) { my ($Xl,$Xm,$Xh,$Hkey3,$Hkey4)=map("%xmm$_",(11..15)); $code.=<<___; leaq GFp_ia32cap_P(%rip),%rax mov 4(%rax),%eax cmp \$0x30,$len jb .Lskip4x and \$`1<<26|1<<22`,%eax # isolate MOVBE+XSAVE cmp \$`1<<22`,%eax # check for MOVBE without XSAVE je .Lskip4x sub \$0x30,$len mov \$0xA040608020C0E000,%rax # ((7..0)·0xE0)&0xff movdqu 0x30($Htbl),$Hkey3 movdqu 0x40($Htbl),$Hkey4 ####### # Xi+4 =[(H*Ii+3) + (H^2*Ii+2) + (H^3*Ii+1) + H^4*(Ii+Xi)] mod P # movdqu 0x30($inp),$Xln movdqu 0x20($inp),$Xl pshufb $T3,$Xln pshufb $T3,$Xl movdqa $Xln,$Xhn pshufd \$0b01001110,$Xln,$Xmn pxor $Xln,$Xmn pclmulqdq \$0x00,$Hkey,$Xln pclmulqdq \$0x11,$Hkey,$Xhn pclmulqdq \$0x00,$HK,$Xmn movdqa $Xl,$Xh pshufd \$0b01001110,$Xl,$Xm pxor $Xl,$Xm pclmulqdq \$0x00,$Hkey2,$Xl pclmulqdq \$0x11,$Hkey2,$Xh pclmulqdq \$0x10,$HK,$Xm xorps $Xl,$Xln xorps $Xh,$Xhn movups 0x50($Htbl),$HK xorps $Xm,$Xmn movdqu 0x10($inp),$Xl movdqu 0($inp),$T1 pshufb $T3,$Xl pshufb $T3,$T1 movdqa $Xl,$Xh pshufd \$0b01001110,$Xl,$Xm pxor $T1,$Xi pxor $Xl,$Xm pclmulqdq \$0x00,$Hkey3,$Xl movdqa $Xi,$Xhi pshufd \$0b01001110,$Xi,$T1 pxor $Xi,$T1 pclmulqdq \$0x11,$Hkey3,$Xh pclmulqdq \$0x00,$HK,$Xm xorps $Xl,$Xln xorps $Xh,$Xhn lea 0x40($inp),$inp sub \$0x40,$len jc .Ltail4x jmp .Lmod4_loop .align 32 .Lmod4_loop: pclmulqdq \$0x00,$Hkey4,$Xi xorps $Xm,$Xmn movdqu 0x30($inp),$Xl pshufb $T3,$Xl pclmulqdq \$0x11,$Hkey4,$Xhi xorps $Xln,$Xi movdqu 0x20($inp),$Xln movdqa $Xl,$Xh pclmulqdq \$0x10,$HK,$T1 pshufd \$0b01001110,$Xl,$Xm xorps $Xhn,$Xhi pxor $Xl,$Xm pshufb $T3,$Xln movups 0x20($Htbl),$HK xorps $Xmn,$T1 pclmulqdq \$0x00,$Hkey,$Xl pshufd \$0b01001110,$Xln,$Xmn pxor $Xi,$T1 # aggregated Karatsuba post-processing movdqa $Xln,$Xhn pxor $Xhi,$T1 # pxor $Xln,$Xmn movdqa $T1,$T2 # pclmulqdq \$0x11,$Hkey,$Xh pslldq \$8,$T1 psrldq \$8,$T2 # pxor $T1,$Xi movdqa .L7_mask(%rip),$T1 pxor $T2,$Xhi # movq %rax,$T2 pand $Xi,$T1 # 1st phase pshufb $T1,$T2 # pxor $Xi,$T2 # pclmulqdq \$0x00,$HK,$Xm psllq \$57,$T2 # movdqa $T2,$T1 # pslldq \$8,$T2 pclmulqdq \$0x00,$Hkey2,$Xln psrldq \$8,$T1 # pxor $T2,$Xi pxor $T1,$Xhi # movdqu 0($inp),$T1 movdqa $Xi,$T2 # 2nd phase psrlq \$1,$Xi pclmulqdq \$0x11,$Hkey2,$Xhn xorps $Xl,$Xln movdqu 0x10($inp),$Xl pshufb $T3,$Xl pclmulqdq \$0x10,$HK,$Xmn xorps $Xh,$Xhn movups 0x50($Htbl),$HK pshufb $T3,$T1 pxor $T2,$Xhi # pxor $Xi,$T2 psrlq \$5,$Xi movdqa $Xl,$Xh pxor $Xm,$Xmn pshufd \$0b01001110,$Xl,$Xm pxor $T2,$Xi # pxor $T1,$Xhi pxor $Xl,$Xm pclmulqdq \$0x00,$Hkey3,$Xl psrlq \$1,$Xi # pxor $Xhi,$Xi # movdqa $Xi,$Xhi pclmulqdq \$0x11,$Hkey3,$Xh xorps $Xl,$Xln pshufd \$0b01001110,$Xi,$T1 pxor $Xi,$T1 pclmulqdq \$0x00,$HK,$Xm xorps $Xh,$Xhn lea 0x40($inp),$inp sub \$0x40,$len jnc .Lmod4_loop .Ltail4x: pclmulqdq \$0x00,$Hkey4,$Xi pclmulqdq \$0x11,$Hkey4,$Xhi pclmulqdq \$0x10,$HK,$T1 xorps $Xm,$Xmn xorps $Xln,$Xi xorps $Xhn,$Xhi pxor $Xi,$Xhi # aggregated Karatsuba post-processing pxor $Xmn,$T1 pxor $Xhi,$T1 # pxor $Xi,$Xhi movdqa $T1,$T2 # psrldq \$8,$T1 pslldq \$8,$T2 # pxor $T1,$Xhi pxor $T2,$Xi # ___ &reduction_alg9($Xhi,$Xi); $code.=<<___; add \$0x40,$len jz .Ldone movdqu 0x20($Htbl),$HK sub \$0x10,$len jz .Lodd_tail .Lskip4x: ___ } $code.=<<___; ####### # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = # [(H*Ii+1) + (H*Xi+1)] mod P = # [(H*Ii+1) + H^2*(Ii+Xi)] mod P # movdqu ($inp),$T1 # Ii movdqu 16($inp),$Xln # Ii+1 pshufb $T3,$T1 pshufb $T3,$Xln pxor $T1,$Xi # Ii+Xi movdqa $Xln,$Xhn pshufd \$0b01001110,$Xln,$Xmn pxor $Xln,$Xmn pclmulqdq \$0x00,$Hkey,$Xln pclmulqdq \$0x11,$Hkey,$Xhn pclmulqdq \$0x00,$HK,$Xmn lea 32($inp),$inp # i+=2 nop sub \$0x20,$len jbe .Leven_tail nop jmp .Lmod_loop .align 32 .Lmod_loop: movdqa $Xi,$Xhi movdqa $Xmn,$T1 pshufd \$0b01001110,$Xi,$Xmn # pxor $Xi,$Xmn # pclmulqdq \$0x00,$Hkey2,$Xi pclmulqdq \$0x11,$Hkey2,$Xhi pclmulqdq \$0x10,$HK,$Xmn pxor $Xln,$Xi # (H*Ii+1) + H^2*(Ii+Xi) pxor $Xhn,$Xhi movdqu ($inp),$T2 # Ii pxor $Xi,$T1 # aggregated Karatsuba post-processing pshufb $T3,$T2 movdqu 16($inp),$Xln # Ii+1 pxor $Xhi,$T1 pxor $T2,$Xhi # "Ii+Xi", consume early pxor $T1,$Xmn pshufb $T3,$Xln movdqa $Xmn,$T1 # psrldq \$8,$T1 pslldq \$8,$Xmn # pxor $T1,$Xhi pxor $Xmn,$Xi # movdqa $Xln,$Xhn # movdqa $Xi,$T2 # 1st phase movdqa $Xi,$T1 psllq \$5,$Xi pxor $Xi,$T1 # pclmulqdq \$0x00,$Hkey,$Xln ####### psllq \$1,$Xi pxor $T1,$Xi # psllq \$57,$Xi # movdqa $Xi,$T1 # pslldq \$8,$Xi psrldq \$8,$T1 # pxor $T2,$Xi pshufd \$0b01001110,$Xhn,$Xmn pxor $T1,$Xhi # pxor $Xhn,$Xmn # movdqa $Xi,$T2 # 2nd phase psrlq \$1,$Xi pclmulqdq \$0x11,$Hkey,$Xhn ####### pxor $T2,$Xhi # pxor $Xi,$T2 psrlq \$5,$Xi pxor $T2,$Xi # lea 32($inp),$inp psrlq \$1,$Xi # pclmulqdq \$0x00,$HK,$Xmn ####### pxor $Xhi,$Xi # sub \$0x20,$len ja .Lmod_loop .Leven_tail: movdqa $Xi,$Xhi movdqa $Xmn,$T1 pshufd \$0b01001110,$Xi,$Xmn # pxor $Xi,$Xmn # pclmulqdq \$0x00,$Hkey2,$Xi pclmulqdq \$0x11,$Hkey2,$Xhi pclmulqdq \$0x10,$HK,$Xmn pxor $Xln,$Xi # (H*Ii+1) + H^2*(Ii+Xi) pxor $Xhn,$Xhi pxor $Xi,$T1 pxor $Xhi,$T1 pxor $T1,$Xmn movdqa $Xmn,$T1 # psrldq \$8,$T1 pslldq \$8,$Xmn # pxor $T1,$Xhi pxor $Xmn,$Xi # ___ &reduction_alg9 ($Xhi,$Xi); $code.=<<___; test $len,$len jnz .Ldone .Lodd_tail: movdqu ($inp),$T1 # Ii pshufb $T3,$T1 pxor $T1,$Xi # Ii+Xi ___ &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H*(Ii+Xi) &reduction_alg9 ($Xhi,$Xi); $code.=<<___; .Ldone: pshufb $T3,$Xi movdqu $Xi,($Xip) ___ $code.=<<___ if ($win64); movaps (%rsp),%xmm6 movaps 0x10(%rsp),%xmm7 movaps 0x20(%rsp),%xmm8 movaps 0x30(%rsp),%xmm9 movaps 0x40(%rsp),%xmm10 movaps 0x50(%rsp),%xmm11 movaps 0x60(%rsp),%xmm12 movaps 0x70(%rsp),%xmm13 movaps 0x80(%rsp),%xmm14 movaps 0x90(%rsp),%xmm15 lea 0xa8(%rsp),%rsp .LSEH_end_GFp_gcm_ghash_clmul: ___ $code.=<<___; ret .cfi_endproc .size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul ___ } $code.=<<___; .globl GFp_gcm_init_avx .type GFp_gcm_init_avx,\@abi-omnipotent .align 32 GFp_gcm_init_avx: .cfi_startproc ___ if ($avx) { my ($Htbl,$Xip)=@_4args; my $HK="%xmm6"; $code.=<<___ if ($win64); .LSEH_begin_GFp_gcm_init_avx: # I can't trust assembler to use specific encoding:-( .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) ___ $code.=<<___; vzeroupper vmovdqu ($Xip),$Hkey vpshufd \$0b01001110,$Hkey,$Hkey # dword swap # <<1 twist vpshufd \$0b11111111,$Hkey,$T2 # broadcast uppermost dword vpsrlq \$63,$Hkey,$T1 vpsllq \$1,$Hkey,$Hkey vpxor $T3,$T3,$T3 # vpcmpgtd $T2,$T3,$T3 # broadcast carry bit vpslldq \$8,$T1,$T1 vpor $T1,$Hkey,$Hkey # H<<=1 # magic reduction vpand .L0x1c2_polynomial(%rip),$T3,$T3 vpxor $T3,$Hkey,$Hkey # if(carry) H^=0x1c2_polynomial vpunpckhqdq $Hkey,$Hkey,$HK vmovdqa $Hkey,$Xi vpxor $Hkey,$HK,$HK mov \$4,%r10 # up to H^8 jmp .Linit_start_avx ___ sub clmul64x64_avx { my ($Xhi,$Xi,$Hkey,$HK)=@_; if (!defined($HK)) { $HK = $T2; $code.=<<___; vpunpckhqdq $Xi,$Xi,$T1 vpunpckhqdq $Hkey,$Hkey,$T2 vpxor $Xi,$T1,$T1 # vpxor $Hkey,$T2,$T2 ___ } else { $code.=<<___; vpunpckhqdq $Xi,$Xi,$T1 vpxor $Xi,$T1,$T1 # ___ } $code.=<<___; vpclmulqdq \$0x11,$Hkey,$Xi,$Xhi ####### vpclmulqdq \$0x00,$Hkey,$Xi,$Xi ####### vpclmulqdq \$0x00,$HK,$T1,$T1 ####### vpxor $Xi,$Xhi,$T2 # vpxor $T2,$T1,$T1 # vpslldq \$8,$T1,$T2 # vpsrldq \$8,$T1,$T1 vpxor $T2,$Xi,$Xi # vpxor $T1,$Xhi,$Xhi ___ } sub reduction_avx { my ($Xhi,$Xi) = @_; $code.=<<___; vpsllq \$57,$Xi,$T1 # 1st phase vpsllq \$62,$Xi,$T2 vpxor $T1,$T2,$T2 # vpsllq \$63,$Xi,$T1 vpxor $T1,$T2,$T2 # vpslldq \$8,$T2,$T1 # vpsrldq \$8,$T2,$T2 vpxor $T1,$Xi,$Xi # vpxor $T2,$Xhi,$Xhi vpsrlq \$1,$Xi,$T2 # 2nd phase vpxor $Xi,$Xhi,$Xhi vpxor $T2,$Xi,$Xi # vpsrlq \$5,$T2,$T2 vpxor $T2,$Xi,$Xi # vpsrlq \$1,$Xi,$Xi # vpxor $Xhi,$Xi,$Xi # ___ } $code.=<<___; .align 32 .Linit_loop_avx: vpalignr \$8,$T1,$T2,$T3 # low part is H.lo^H.hi... vmovdqu $T3,-0x10($Htbl) # save Karatsuba "salt" ___ &clmul64x64_avx ($Xhi,$Xi,$Hkey,$HK); # calculate H^3,5,7 &reduction_avx ($Xhi,$Xi); $code.=<<___; .Linit_start_avx: vmovdqa $Xi,$T3 ___ &clmul64x64_avx ($Xhi,$Xi,$Hkey,$HK); # calculate H^2,4,6,8 &reduction_avx ($Xhi,$Xi); $code.=<<___; vpshufd \$0b01001110,$T3,$T1 vpshufd \$0b01001110,$Xi,$T2 vpxor $T3,$T1,$T1 # Karatsuba pre-processing vmovdqu $T3,0x00($Htbl) # save H^1,3,5,7 vpxor $Xi,$T2,$T2 # Karatsuba pre-processing vmovdqu $Xi,0x10($Htbl) # save H^2,4,6,8 lea 0x30($Htbl),$Htbl sub \$1,%r10 jnz .Linit_loop_avx vpalignr \$8,$T2,$T1,$T3 # last "salt" is flipped vmovdqu $T3,-0x10($Htbl) vzeroupper ___ $code.=<<___ if ($win64); movaps (%rsp),%xmm6 lea 0x18(%rsp),%rsp .LSEH_end_GFp_gcm_init_avx: ___ $code.=<<___; ret .cfi_endproc .size GFp_gcm_init_avx,.-GFp_gcm_init_avx ___ } else { $code.=<<___; jmp .L_init_clmul .size GFp_gcm_init_avx,.-GFp_gcm_init_avx ___ } $code.=<<___; .globl GFp_gcm_ghash_avx .type GFp_gcm_ghash_avx,\@abi-omnipotent .align 32 GFp_gcm_ghash_avx: .cfi_startproc ___ if ($avx) { my ($Xip,$Htbl,$inp,$len)=@_4args; my ($Xlo,$Xhi,$Xmi, $Zlo,$Zhi,$Zmi, $Hkey,$HK,$T1,$T2, $Xi,$Xo,$Tred,$bswap,$Ii,$Ij) = map("%xmm$_",(0..15)); $code.=<<___ if ($win64); lea -0x88(%rsp),%rax .LSEH_begin_GFp_gcm_ghash_avx: # I can't trust assembler to use specific encoding:-( .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) ___ $code.=<<___; vzeroupper vmovdqu ($Xip),$Xi # load $Xi lea .L0x1c2_polynomial(%rip),%r10 lea 0x40($Htbl),$Htbl # size optimization vmovdqu .Lbswap_mask(%rip),$bswap vpshufb $bswap,$Xi,$Xi cmp \$0x80,$len jb .Lshort_avx sub \$0x80,$len vmovdqu 0x70($inp),$Ii # I[7] vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 vpshufb $bswap,$Ii,$Ii vmovdqu 0x20-0x40($Htbl),$HK vpunpckhqdq $Ii,$Ii,$T2 vmovdqu 0x60($inp),$Ij # I[6] vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpxor $Ii,$T2,$T2 vpshufb $bswap,$Ij,$Ij vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 vpunpckhqdq $Ij,$Ij,$T1 vmovdqu 0x50($inp),$Ii # I[5] vpclmulqdq \$0x00,$HK,$T2,$Xmi vpxor $Ij,$T1,$T1 vpshufb $bswap,$Ii,$Ii vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpunpckhqdq $Ii,$Ii,$T2 vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 vpxor $Ii,$T2,$T2 vmovdqu 0x40($inp),$Ij # I[4] vpclmulqdq \$0x10,$HK,$T1,$Zmi vmovdqu 0x50-0x40($Htbl),$HK vpshufb $bswap,$Ij,$Ij vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpxor $Xhi,$Zhi,$Zhi vpunpckhqdq $Ij,$Ij,$T1 vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T2,$Xmi vpxor $Ij,$T1,$T1 vmovdqu 0x30($inp),$Ii # I[3] vpxor $Zlo,$Xlo,$Xlo vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpxor $Zhi,$Xhi,$Xhi vpshufb $bswap,$Ii,$Ii vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 vpxor $Zmi,$Xmi,$Xmi vpunpckhqdq $Ii,$Ii,$T2 vpclmulqdq \$0x10,$HK,$T1,$Zmi vmovdqu 0x80-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vmovdqu 0x20($inp),$Ij # I[2] vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpxor $Xhi,$Zhi,$Zhi vpshufb $bswap,$Ij,$Ij vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 vpxor $Xmi,$Zmi,$Zmi vpunpckhqdq $Ij,$Ij,$T1 vpclmulqdq \$0x00,$HK,$T2,$Xmi vpxor $Ij,$T1,$T1 vmovdqu 0x10($inp),$Ii # I[1] vpxor $Zlo,$Xlo,$Xlo vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpxor $Zhi,$Xhi,$Xhi vpshufb $bswap,$Ii,$Ii vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 vpxor $Zmi,$Xmi,$Xmi vpunpckhqdq $Ii,$Ii,$T2 vpclmulqdq \$0x10,$HK,$T1,$Zmi vmovdqu 0xb0-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vmovdqu ($inp),$Ij # I[0] vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpxor $Xhi,$Zhi,$Zhi vpshufb $bswap,$Ij,$Ij vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0xa0-0x40($Htbl),$Hkey # $Hkey^8 vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x10,$HK,$T2,$Xmi lea 0x80($inp),$inp cmp \$0x80,$len jb .Ltail_avx vpxor $Xi,$Ij,$Ij # accumulate $Xi sub \$0x80,$len jmp .Loop8x_avx .align 32 .Loop8x_avx: vpunpckhqdq $Ij,$Ij,$T1 vmovdqu 0x70($inp),$Ii # I[7] vpxor $Xlo,$Zlo,$Zlo vpxor $Ij,$T1,$T1 vpclmulqdq \$0x00,$Hkey,$Ij,$Xi vpshufb $bswap,$Ii,$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xo vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 vpunpckhqdq $Ii,$Ii,$T2 vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Tred vmovdqu 0x20-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vmovdqu 0x60($inp),$Ij # I[6] vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpxor $Zlo,$Xi,$Xi # collect result vpshufb $bswap,$Ij,$Ij vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vxorps $Zhi,$Xo,$Xo vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 vpunpckhqdq $Ij,$Ij,$T1 vpclmulqdq \$0x00,$HK, $T2,$Xmi vpxor $Zmi,$Tred,$Tred vxorps $Ij,$T1,$T1 vmovdqu 0x50($inp),$Ii # I[5] vpxor $Xi,$Tred,$Tred # aggregated Karatsuba post-processing vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpxor $Xo,$Tred,$Tred vpslldq \$8,$Tred,$T2 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vpsrldq \$8,$Tred,$Tred vpxor $T2, $Xi, $Xi vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 vpshufb $bswap,$Ii,$Ii vxorps $Tred,$Xo, $Xo vpxor $Xhi,$Zhi,$Zhi vpunpckhqdq $Ii,$Ii,$T2 vpclmulqdq \$0x10,$HK, $T1,$Zmi vmovdqu 0x50-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vpxor $Xmi,$Zmi,$Zmi vmovdqu 0x40($inp),$Ij # I[4] vpalignr \$8,$Xi,$Xi,$Tred # 1st phase vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpshufb $bswap,$Ij,$Ij vpxor $Zlo,$Xlo,$Xlo vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 vpunpckhqdq $Ij,$Ij,$T1 vpxor $Zhi,$Xhi,$Xhi vpclmulqdq \$0x00,$HK, $T2,$Xmi vxorps $Ij,$T1,$T1 vpxor $Zmi,$Xmi,$Xmi vmovdqu 0x30($inp),$Ii # I[3] vpclmulqdq \$0x10,(%r10),$Xi,$Xi vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpshufb $bswap,$Ii,$Ii vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 vpunpckhqdq $Ii,$Ii,$T2 vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x10,$HK, $T1,$Zmi vmovdqu 0x80-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vpxor $Xmi,$Zmi,$Zmi vmovdqu 0x20($inp),$Ij # I[2] vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpshufb $bswap,$Ij,$Ij vpxor $Zlo,$Xlo,$Xlo vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 vpunpckhqdq $Ij,$Ij,$T1 vpxor $Zhi,$Xhi,$Xhi vpclmulqdq \$0x00,$HK, $T2,$Xmi vpxor $Ij,$T1,$T1 vpxor $Zmi,$Xmi,$Xmi vxorps $Tred,$Xi,$Xi vmovdqu 0x10($inp),$Ii # I[1] vpalignr \$8,$Xi,$Xi,$Tred # 2nd phase vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo vpshufb $bswap,$Ii,$Ii vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 vpclmulqdq \$0x10,(%r10),$Xi,$Xi vxorps $Xo,$Tred,$Tred vpunpckhqdq $Ii,$Ii,$T2 vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x10,$HK, $T1,$Zmi vmovdqu 0xb0-0x40($Htbl),$HK vpxor $Ii,$T2,$T2 vpxor $Xmi,$Zmi,$Zmi vmovdqu ($inp),$Ij # I[0] vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo vpshufb $bswap,$Ij,$Ij vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi vmovdqu 0xa0-0x40($Htbl),$Hkey # $Hkey^8 vpxor $Tred,$Ij,$Ij vpclmulqdq \$0x10,$HK, $T2,$Xmi vpxor $Xi,$Ij,$Ij # accumulate $Xi lea 0x80($inp),$inp sub \$0x80,$len jnc .Loop8x_avx add \$0x80,$len jmp .Ltail_no_xor_avx .align 32 .Lshort_avx: vmovdqu -0x10($inp,$len),$Ii # very last word lea ($inp,$len),$inp vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 vmovdqu 0x20-0x40($Htbl),$HK vpshufb $bswap,$Ii,$Ij vmovdqa $Xlo,$Zlo # subtle way to zero $Zlo, vmovdqa $Xhi,$Zhi # $Zhi and vmovdqa $Xmi,$Zmi # $Zmi sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x20($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vpsrldq \$8,$HK,$HK sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x30($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vmovdqu 0x50-0x40($Htbl),$HK sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x40($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vpsrldq \$8,$HK,$HK sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x50($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vmovdqu 0x80-0x40($Htbl),$HK sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x60($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vpsrldq \$8,$HK,$HK sub \$0x10,$len jz .Ltail_avx vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vmovdqu -0x70($inp),$Ii vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 vpshufb $bswap,$Ii,$Ij vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vmovq 0xb8-0x40($Htbl),$HK sub \$0x10,$len jmp .Ltail_avx .align 32 .Ltail_avx: vpxor $Xi,$Ij,$Ij # accumulate $Xi .Ltail_no_xor_avx: vpunpckhqdq $Ij,$Ij,$T1 vpxor $Xlo,$Zlo,$Zlo vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo vpxor $Ij,$T1,$T1 vpxor $Xhi,$Zhi,$Zhi vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi vpxor $Xmi,$Zmi,$Zmi vpclmulqdq \$0x00,$HK,$T1,$Xmi vmovdqu (%r10),$Tred vpxor $Xlo,$Zlo,$Xi vpxor $Xhi,$Zhi,$Xo vpxor $Xmi,$Zmi,$Zmi vpxor $Xi, $Zmi,$Zmi # aggregated Karatsuba post-processing vpxor $Xo, $Zmi,$Zmi vpslldq \$8, $Zmi,$T2 vpsrldq \$8, $Zmi,$Zmi vpxor $T2, $Xi, $Xi vpxor $Zmi,$Xo, $Xo vpclmulqdq \$0x10,$Tred,$Xi,$T2 # 1st phase vpalignr \$8,$Xi,$Xi,$Xi vpxor $T2,$Xi,$Xi vpclmulqdq \$0x10,$Tred,$Xi,$T2 # 2nd phase vpalignr \$8,$Xi,$Xi,$Xi vpxor $Xo,$Xi,$Xi vpxor $T2,$Xi,$Xi cmp \$0,$len jne .Lshort_avx vpshufb $bswap,$Xi,$Xi vmovdqu $Xi,($Xip) vzeroupper ___ $code.=<<___ if ($win64); movaps (%rsp),%xmm6 movaps 0x10(%rsp),%xmm7 movaps 0x20(%rsp),%xmm8 movaps 0x30(%rsp),%xmm9 movaps 0x40(%rsp),%xmm10 movaps 0x50(%rsp),%xmm11 movaps 0x60(%rsp),%xmm12 movaps 0x70(%rsp),%xmm13 movaps 0x80(%rsp),%xmm14 movaps 0x90(%rsp),%xmm15 lea 0xa8(%rsp),%rsp .LSEH_end_GFp_gcm_ghash_avx: ___ $code.=<<___; ret .cfi_endproc .size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx ___ } else { $code.=<<___; jmp .L_ghash_clmul .size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx ___ } $code.=<<___; .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .L0x1c2_polynomial: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 .L7_mask: .long 7,0,7,0 .asciz "GHASH for x86_64, CRYPTOGAMS by " .align 64 ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type se_handler,\@abi-omnipotent .align 16 se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lin_prologue lea 48+280(%rax),%rax # adjust "rsp" mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 .Lin_prologue: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$`1232/8`,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size se_handler,.-se_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_gcm_init_clmul .rva .LSEH_end_GFp_gcm_init_clmul .rva .LSEH_info_GFp_gcm_init_clmul .rva .LSEH_begin_GFp_gcm_ghash_clmul .rva .LSEH_end_GFp_gcm_ghash_clmul .rva .LSEH_info_GFp_gcm_ghash_clmul ___ $code.=<<___ if ($avx); .rva .LSEH_begin_GFp_gcm_init_avx .rva .LSEH_end_GFp_gcm_init_avx .rva .LSEH_info_GFp_gcm_init_clmul .rva .LSEH_begin_GFp_gcm_ghash_avx .rva .LSEH_end_GFp_gcm_ghash_avx .rva .LSEH_info_GFp_gcm_ghash_clmul ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_GFp_gcm_init_clmul: .byte 0x01,0x08,0x03,0x00 .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 .byte 0x04,0x22,0x00,0x00 #sub rsp,0x18 .LSEH_info_GFp_gcm_ghash_clmul: .byte 0x01,0x33,0x16,0x00 .byte 0x33,0xf8,0x09,0x00 #movaps 0x90(rsp),xmm15 .byte 0x2e,0xe8,0x08,0x00 #movaps 0x80(rsp),xmm14 .byte 0x29,0xd8,0x07,0x00 #movaps 0x70(rsp),xmm13 .byte 0x24,0xc8,0x06,0x00 #movaps 0x60(rsp),xmm12 .byte 0x1f,0xb8,0x05,0x00 #movaps 0x50(rsp),xmm11 .byte 0x1a,0xa8,0x04,0x00 #movaps 0x40(rsp),xmm10 .byte 0x15,0x98,0x03,0x00 #movaps 0x30(rsp),xmm9 .byte 0x10,0x88,0x02,0x00 #movaps 0x20(rsp),xmm8 .byte 0x0c,0x78,0x01,0x00 #movaps 0x10(rsp),xmm7 .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 .byte 0x04,0x01,0x15,0x00 #sub rsp,0xa8 ___ } $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/modes/asm/ghashv8-armx.pl000064400000000000000000000274311352416253600212020ustar0000000000000000#! /usr/bin/env perl # Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # GHASH for ARMv8 Crypto Extension, 64-bit polynomial multiplication. # # June 2014 # Initial version was developed in tight cooperation with Ard Biesheuvel # of Linaro from bits-n-pieces from other assembly modules. Just like # aesv8-armx.pl this module supports both AArch32 and AArch64 execution modes. # # July 2014 # Implement 2x aggregated reduction [see ghash-x86.pl for background # information]. # # Current performance in cycles per processed byte: # # PMULL[2] 32-bit NEON(*) # Apple A7 0.92 5.62 # Cortex-A53 1.01 8.39 # Cortex-A57 1.17 7.61 # Denver 0.71 6.02 # Mongoose 1.10 8.06 # Kryo 1.16 8.00 # # (*) presented for reference/comparison purposes; $flavour = shift; $output = shift; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; $Xi="x0"; # argument block $Htbl="x1"; $inp="x2"; $len="x3"; $inc="x12"; { my ($Xl,$Xm,$Xh,$IN)=map("q$_",(0..3)); my ($t0,$t1,$t2,$xC2,$H,$Hhl,$H2)=map("q$_",(8..14)); $code=<<___; #include .text ___ $code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/); $code.=<<___ if ($flavour !~ /64/); .fpu neon .code 32 #undef __thumb2__ ___ ################################################################################ # void GFp_gcm_init_clmul(u128 Htable[16],const u64 H[2]); # # input: 128-bit H - secret parameter E(K,0^128) # output: precomputed table filled with degrees of twisted H; # H is twisted to handle reverse bitness of GHASH; # only few of 16 slots of Htable[16] are used; # data is opaque to outside world (which allows to # optimize the code independently); # $code.=<<___; .global GFp_gcm_init_clmul .type GFp_gcm_init_clmul,%function .align 4 GFp_gcm_init_clmul: vld1.64 {$t1},[x1] @ load input H vmov.i8 $xC2,#0xe1 vshl.i64 $xC2,$xC2,#57 @ 0xc2.0 vext.8 $IN,$t1,$t1,#8 vshr.u64 $t2,$xC2,#63 vdup.32 $t1,${t1}[1] vext.8 $t0,$t2,$xC2,#8 @ t0=0xc2....01 vshr.u64 $t2,$IN,#63 vshr.s32 $t1,$t1,#31 @ broadcast carry bit vand $t2,$t2,$t0 vshl.i64 $IN,$IN,#1 vext.8 $t2,$t2,$t2,#8 vand $t0,$t0,$t1 vorr $IN,$IN,$t2 @ H<<<=1 veor $H,$IN,$t0 @ twisted H vst1.64 {$H},[x0],#16 @ store Htable[0] @ calculate H^2 vext.8 $t0,$H,$H,#8 @ Karatsuba pre-processing vpmull.p64 $Xl,$H,$H veor $t0,$t0,$H vpmull2.p64 $Xh,$H,$H vpmull.p64 $Xm,$t0,$t0 vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing veor $t2,$Xl,$Xh veor $Xm,$Xm,$t1 veor $Xm,$Xm,$t2 vpmull.p64 $t2,$Xl,$xC2 @ 1st phase vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl veor $Xl,$Xm,$t2 vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase vpmull.p64 $Xl,$Xl,$xC2 veor $t2,$t2,$Xh veor $H2,$Xl,$t2 vext.8 $t1,$H2,$H2,#8 @ Karatsuba pre-processing veor $t1,$t1,$H2 vext.8 $Hhl,$t0,$t1,#8 @ pack Karatsuba pre-processed vst1.64 {$Hhl-$H2},[x0] @ store Htable[1..2] ret .size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul ___ ################################################################################ # void GFp_gcm_gmult_clmul(u64 Xi[2],const u128 Htable[16]); # # input: Xi - current hash value; # Htable - table precomputed in GFp_gcm_init_clmul; # output: Xi - next hash value Xi; # $code.=<<___; .global GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,%function .align 4 GFp_gcm_gmult_clmul: vld1.64 {$t1},[$Xi] @ load Xi vmov.i8 $xC2,#0xe1 vld1.64 {$H-$Hhl},[$Htbl] @ load twisted H, ... vshl.u64 $xC2,$xC2,#57 #ifndef __ARMEB__ vrev64.8 $t1,$t1 #endif vext.8 $IN,$t1,$t1,#8 vpmull.p64 $Xl,$H,$IN @ H.lo·Xi.lo veor $t1,$t1,$IN @ Karatsuba pre-processing vpmull2.p64 $Xh,$H,$IN @ H.hi·Xi.hi vpmull.p64 $Xm,$Hhl,$t1 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing veor $t2,$Xl,$Xh veor $Xm,$Xm,$t1 veor $Xm,$Xm,$t2 vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl veor $Xl,$Xm,$t2 vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction vpmull.p64 $Xl,$Xl,$xC2 veor $t2,$t2,$Xh veor $Xl,$Xl,$t2 #ifndef __ARMEB__ vrev64.8 $Xl,$Xl #endif vext.8 $Xl,$Xl,$Xl,#8 vst1.64 {$Xl},[$Xi] @ write out Xi ret .size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul ___ ################################################################################ # void GFp_gcm_ghash_clmul(u64 Xi[2], const u128 Htable[16], const u8 *inp, # size_t len); # # input: table precomputed in GFp_gcm_init_clmul; # current hash value Xi; # pointer to input data; # length of input data in bytes, but divisible by block size; # output: next hash value Xi; # $code.=<<___; .global GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,%function .align 4 GFp_gcm_ghash_clmul: ___ $code.=<<___ if ($flavour !~ /64/); vstmdb sp!,{d8-d15} @ 32-bit ABI says so ___ $code.=<<___; vld1.64 {$Xl},[$Xi] @ load [rotated] Xi @ "[rotated]" means that @ loaded value would have @ to be rotated in order to @ make it appear as in @ algorithm specification subs $len,$len,#32 @ see if $len is 32 or larger mov $inc,#16 @ $inc is used as post- @ increment for input pointer; @ as loop is modulo-scheduled @ $inc is zeroed just in time @ to preclude overstepping @ inp[len], which means that @ last block[s] are actually @ loaded twice, but last @ copy is not processed vld1.64 {$H-$Hhl},[$Htbl],#32 @ load twisted H, ..., H^2 vmov.i8 $xC2,#0xe1 vld1.64 {$H2},[$Htbl] cclr $inc,eq @ is it time to zero $inc? vext.8 $Xl,$Xl,$Xl,#8 @ rotate Xi vld1.64 {$t0},[$inp],#16 @ load [rotated] I[0] vshl.u64 $xC2,$xC2,#57 @ compose 0xc2.0 constant #ifndef __ARMEB__ vrev64.8 $t0,$t0 vrev64.8 $Xl,$Xl #endif vext.8 $IN,$t0,$t0,#8 @ rotate I[0] b.lo .Lodd_tail_v8 @ $len was less than 32 ___ { my ($Xln,$Xmn,$Xhn,$In) = map("q$_",(4..7)); ####### # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = # [(H*Ii+1) + (H*Xi+1)] mod P = # [(H*Ii+1) + H^2*(Ii+Xi)] mod P # $code.=<<___; vld1.64 {$t1},[$inp],$inc @ load [rotated] I[1] #ifndef __ARMEB__ vrev64.8 $t1,$t1 #endif vext.8 $In,$t1,$t1,#8 veor $IN,$IN,$Xl @ I[i]^=Xi vpmull.p64 $Xln,$H,$In @ H·Ii+1 veor $t1,$t1,$In @ Karatsuba pre-processing vpmull2.p64 $Xhn,$H,$In b .Loop_mod2x_v8 .align 4 .Loop_mod2x_v8: vext.8 $t2,$IN,$IN,#8 subs $len,$len,#32 @ is there more data? vpmull.p64 $Xl,$H2,$IN @ H^2.lo·Xi.lo cclr $inc,lo @ is it time to zero $inc? vpmull.p64 $Xmn,$Hhl,$t1 veor $t2,$t2,$IN @ Karatsuba pre-processing vpmull2.p64 $Xh,$H2,$IN @ H^2.hi·Xi.hi veor $Xl,$Xl,$Xln @ accumulate vpmull2.p64 $Xm,$Hhl,$t2 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) vld1.64 {$t0},[$inp],$inc @ load [rotated] I[i+2] veor $Xh,$Xh,$Xhn cclr $inc,eq @ is it time to zero $inc? veor $Xm,$Xm,$Xmn vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing veor $t2,$Xl,$Xh veor $Xm,$Xm,$t1 vld1.64 {$t1},[$inp],$inc @ load [rotated] I[i+3] #ifndef __ARMEB__ vrev64.8 $t0,$t0 #endif veor $Xm,$Xm,$t2 vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction #ifndef __ARMEB__ vrev64.8 $t1,$t1 #endif vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl vext.8 $In,$t1,$t1,#8 vext.8 $IN,$t0,$t0,#8 veor $Xl,$Xm,$t2 vpmull.p64 $Xln,$H,$In @ H·Ii+1 veor $IN,$IN,$Xh @ accumulate $IN early vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction vpmull.p64 $Xl,$Xl,$xC2 veor $IN,$IN,$t2 veor $t1,$t1,$In @ Karatsuba pre-processing veor $IN,$IN,$Xl vpmull2.p64 $Xhn,$H,$In b.hs .Loop_mod2x_v8 @ there was at least 32 more bytes veor $Xh,$Xh,$t2 vext.8 $IN,$t0,$t0,#8 @ re-construct $IN adds $len,$len,#32 @ re-construct $len veor $Xl,$Xl,$Xh @ re-construct $Xl b.eq .Ldone_v8 @ is $len zero? ___ } $code.=<<___; .Lodd_tail_v8: vext.8 $t2,$Xl,$Xl,#8 veor $IN,$IN,$Xl @ inp^=Xi veor $t1,$t0,$t2 @ $t1 is rotated inp^Xi vpmull.p64 $Xl,$H,$IN @ H.lo·Xi.lo veor $t1,$t1,$IN @ Karatsuba pre-processing vpmull2.p64 $Xh,$H,$IN @ H.hi·Xi.hi vpmull.p64 $Xm,$Hhl,$t1 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing veor $t2,$Xl,$Xh veor $Xm,$Xm,$t1 veor $Xm,$Xm,$t2 vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl veor $Xl,$Xm,$t2 vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction vpmull.p64 $Xl,$Xl,$xC2 veor $t2,$t2,$Xh veor $Xl,$Xl,$t2 .Ldone_v8: #ifndef __ARMEB__ vrev64.8 $Xl,$Xl #endif vext.8 $Xl,$Xl,$Xl,#8 vst1.64 {$Xl},[$Xi] @ write out Xi ___ $code.=<<___ if ($flavour !~ /64/); vldmia sp!,{d8-d15} @ 32-bit ABI says so ___ $code.=<<___; ret .size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul ___ } $code.=<<___; .asciz "GHASH for ARMv8, CRYPTOGAMS by " .align 2 ___ if ($flavour =~ /64/) { ######## 64-bit code sub unvmov { my $arg=shift; $arg =~ m/q([0-9]+)#(lo|hi),\s*q([0-9]+)#(lo|hi)/o && sprintf "ins v%d.d[%d],v%d.d[%d]",$1,($2 eq "lo")?0:1,$3,($4 eq "lo")?0:1; } foreach(split("\n",$code)) { s/cclr\s+([wx])([^,]+),\s*([a-z]+)/csel $1$2,$1zr,$1$2,$3/o or s/vmov\.i8/movi/o or # fix up legacy mnemonics s/vmov\s+(.*)/unvmov($1)/geo or s/vext\.8/ext/o or s/vshr\.s/sshr\.s/o or s/vshr/ushr/o or s/^(\s+)v/$1/o or # strip off v prefix s/\bbx\s+lr\b/ret/o; s/\bq([0-9]+)\b/"v".($1<8?$1:$1+8).".16b"/geo; # old->new registers s/@\s/\/\//o; # old->new style commentary # fix up remaining legacy suffixes s/\.[ui]?8(\s)/$1/o; s/\.[uis]?32//o and s/\.16b/\.4s/go; m/\.p64/o and s/\.16b/\.1q/o; # 1st pmull argument m/l\.p64/o and s/\.16b/\.1d/go; # 2nd and 3rd pmull arguments s/\.[uisp]?64//o and s/\.16b/\.2d/go; s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o; print $_,"\n"; } } else { ######## 32-bit code sub unvdup32 { my $arg=shift; $arg =~ m/q([0-9]+),\s*q([0-9]+)\[([0-3])\]/o && sprintf "vdup.32 q%d,d%d[%d]",$1,2*$2+($3>>1),$3&1; } sub unvpmullp64 { my ($mnemonic,$arg)=@_; if ($arg =~ m/q([0-9]+),\s*q([0-9]+),\s*q([0-9]+)/o) { my $word = 0xf2a00e00|(($1&7)<<13)|(($1&8)<<19) |(($2&7)<<17)|(($2&8)<<4) |(($3&7)<<1) |(($3&8)<<2); $word |= 0x00010001 if ($mnemonic =~ "2"); # since ARMv7 instructions are always encoded little-endian. # correct solution is to use .inst directive, but older # assemblers don't implement it:-( sprintf ".byte\t0x%02x,0x%02x,0x%02x,0x%02x\t@ %s %s", $word&0xff,($word>>8)&0xff, ($word>>16)&0xff,($word>>24)&0xff, $mnemonic,$arg; } } foreach(split("\n",$code)) { s/\b[wx]([0-9]+)\b/r$1/go; # new->old registers s/\bv([0-9])\.[12468]+[bsd]\b/q$1/go; # new->old registers s/\/\/\s?/@ /o; # new->old style commentary # fix up remaining new-style suffixes s/\],#[0-9]+/]!/o; s/cclr\s+([^,]+),\s*([a-z]+)/mov$2 $1,#0/o or s/vdup\.32\s+(.*)/unvdup32($1)/geo or s/v?(pmull2?)\.p64\s+(.*)/unvpmullp64($1,$2)/geo or s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or s/^(\s+)b\./$1b/o or s/^(\s+)ret/$1bx\tlr/o; print $_,"\n"; } } close STDOUT or die "error closing STDOUT"; # enforce flush ring-0.16.9/crypto/fipsmodule/modes/gcm.c000064400000000000000000000164051352416253600164610ustar0000000000000000/* ==================================================================== * Copyright (c) 2008 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== */ #include #include "internal.h" #include "../../internal.h" #define PACK(s) ((size_t)(s) << (sizeof(size_t) * 8 - 16)) #define REDUCE1BIT(V) \ do { \ if (sizeof(size_t) == 8) { \ uint64_t T = UINT64_C(0xe100000000000000) & (0 - ((V).lo & 1)); \ (V).lo = ((V).hi << 63) | ((V).lo >> 1); \ (V).hi = ((V).hi >> 1) ^ T; \ } else { \ uint32_t T = 0xe1000000U & (0 - (uint32_t)((V).lo & 1)); \ (V).lo = ((V).hi << 63) | ((V).lo >> 1); \ (V).hi = ((V).hi >> 1) ^ ((uint64_t)T << 32); \ } \ } while (0) void GFp_gcm_init_4bit(u128 Htable[16], const uint64_t H[2]); void GFp_gcm_init_4bit(u128 Htable[16], const uint64_t H[2]) { u128 V; Htable[0].hi = 0; Htable[0].lo = 0; V.hi = H[0]; V.lo = H[1]; Htable[8] = V; REDUCE1BIT(V); Htable[4] = V; REDUCE1BIT(V); Htable[2] = V; REDUCE1BIT(V); Htable[1] = V; Htable[3].hi = V.hi ^ Htable[2].hi, Htable[3].lo = V.lo ^ Htable[2].lo; V = Htable[4]; Htable[5].hi = V.hi ^ Htable[1].hi, Htable[5].lo = V.lo ^ Htable[1].lo; Htable[6].hi = V.hi ^ Htable[2].hi, Htable[6].lo = V.lo ^ Htable[2].lo; Htable[7].hi = V.hi ^ Htable[3].hi, Htable[7].lo = V.lo ^ Htable[3].lo; V = Htable[8]; Htable[9].hi = V.hi ^ Htable[1].hi, Htable[9].lo = V.lo ^ Htable[1].lo; Htable[10].hi = V.hi ^ Htable[2].hi, Htable[10].lo = V.lo ^ Htable[2].lo; Htable[11].hi = V.hi ^ Htable[3].hi, Htable[11].lo = V.lo ^ Htable[3].lo; Htable[12].hi = V.hi ^ Htable[4].hi, Htable[12].lo = V.lo ^ Htable[4].lo; Htable[13].hi = V.hi ^ Htable[5].hi, Htable[13].lo = V.lo ^ Htable[5].lo; Htable[14].hi = V.hi ^ Htable[6].hi, Htable[14].lo = V.lo ^ Htable[6].lo; Htable[15].hi = V.hi ^ Htable[7].hi, Htable[15].lo = V.lo ^ Htable[7].lo; } static const size_t rem_4bit[16] = { PACK(0x0000), PACK(0x1C20), PACK(0x3840), PACK(0x2460), PACK(0x7080), PACK(0x6CA0), PACK(0x48C0), PACK(0x54E0), PACK(0xE100), PACK(0xFD20), PACK(0xD940), PACK(0xC560), PACK(0x9180), PACK(0x8DA0), PACK(0xA9C0), PACK(0xB5E0)}; void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]); void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]) { u128 Z; int cnt = 15; size_t rem, nlo, nhi; nlo = Xi[15]; nhi = nlo >> 4; nlo &= 0xf; Z.hi = Htable[nlo].hi; Z.lo = Htable[nlo].lo; while (1) { rem = (size_t)Z.lo & 0xf; Z.lo = (Z.hi << 60) | (Z.lo >> 4); Z.hi = (Z.hi >> 4); if (sizeof(size_t) == 8) { Z.hi ^= rem_4bit[rem]; } else { Z.hi ^= (uint64_t)rem_4bit[rem] << 32; } Z.hi ^= Htable[nhi].hi; Z.lo ^= Htable[nhi].lo; if (--cnt < 0) { break; } nlo = Xi[cnt]; nhi = nlo >> 4; nlo &= 0xf; rem = (size_t)Z.lo & 0xf; Z.lo = (Z.hi << 60) | (Z.lo >> 4); Z.hi = (Z.hi >> 4); if (sizeof(size_t) == 8) { Z.hi ^= rem_4bit[rem]; } else { Z.hi ^= (uint64_t)rem_4bit[rem] << 32; } Z.hi ^= Htable[nlo].hi; Z.lo ^= Htable[nlo].lo; } to_be_u64_ptr(Xi, Z.hi); to_be_u64_ptr(Xi + 8, Z.lo); } void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16], const uint8_t *inp, size_t len); // Streamed gcm_mult_4bit, see GFp_gcm128_[en|de]crypt for // details... Compiler-generated code doesn't seem to give any // performance improvement, at least not on x86[_64]. It's here // mostly as reference and a placeholder for possible future // non-trivial optimization[s]... void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16], const uint8_t *inp, size_t len) { u128 Z; int cnt; size_t rem, nlo, nhi; do { cnt = 15; nlo = Xi[15]; nlo ^= inp[15]; nhi = nlo >> 4; nlo &= 0xf; Z.hi = Htable[nlo].hi; Z.lo = Htable[nlo].lo; while (1) { rem = (size_t)Z.lo & 0xf; Z.lo = (Z.hi << 60) | (Z.lo >> 4); Z.hi = (Z.hi >> 4); if (sizeof(size_t) == 8) { Z.hi ^= rem_4bit[rem]; } else { Z.hi ^= (uint64_t)rem_4bit[rem] << 32; } Z.hi ^= Htable[nhi].hi; Z.lo ^= Htable[nhi].lo; if (--cnt < 0) { break; } nlo = Xi[cnt]; nlo ^= inp[cnt]; nhi = nlo >> 4; nlo &= 0xf; rem = (size_t)Z.lo & 0xf; Z.lo = (Z.hi << 60) | (Z.lo >> 4); Z.hi = (Z.hi >> 4); if (sizeof(size_t) == 8) { Z.hi ^= rem_4bit[rem]; } else { Z.hi ^= (uint64_t)rem_4bit[rem] << 32; } Z.hi ^= Htable[nlo].hi; Z.lo ^= Htable[nlo].lo; } to_be_u64_ptr(Xi, Z.hi); to_be_u64_ptr(Xi + 8, Z.lo); } while (inp += 16, len -= 16); } ring-0.16.9/crypto/fipsmodule/modes/internal.h000064400000000000000000000061021352416253600175250ustar0000000000000000/* ==================================================================== * Copyright (c) 2008 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== */ #ifndef OPENSSL_HEADER_MODES_INTERNAL_H #define OPENSSL_HEADER_MODES_INTERNAL_H #include "../../internal.h" // GCM definitions typedef struct { uint64_t hi,lo; } u128; #define GCM128_HTABLE_LEN 16 // Keep in sync with GCM128_KEY in aes_gcm.rs. typedef struct { alignas(16) u128 Htable[GCM128_HTABLE_LEN]; } GCM128_KEY; // Keep in sync with GCK_CONTEXT in aes_gcm.rs. typedef struct { // Relative position of Xi, H and pre-computed Htable is used in some // assembler modules, i.e. don't change the order! alignas(16) uint8_t Xi[16]; struct { uint64_t u[2]; } H_unused; GCM128_KEY key; } GCM128_CONTEXT; #endif // OPENSSL_HEADER_MODES_INTERNAL_H ring-0.16.9/crypto/fipsmodule/sha/asm/sha256-armv4.pl000064400000000000000000000447221352416253600203720ustar0000000000000000#! /usr/bin/env perl # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # # Permission to use under GPL terms is granted. # ==================================================================== # SHA256 block procedure for ARMv4. May 2007. # Performance is ~2x better than gcc 3.4 generated code and in "abso- # lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per # byte [on single-issue Xscale PXA250 core]. # July 2010. # # Rescheduling for dual-issue pipeline resulted in 22% improvement on # Cortex A8 core and ~20 cycles per processed byte. # February 2011. # # Profiler-assisted and platform-specific optimization resulted in 16% # improvement on Cortex A8 core and ~15.4 cycles per processed byte. # September 2013. # # Add NEON implementation. On Cortex A8 it was measured to process one # byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon # S4 does it in 12.5 cycles too, but it's 50% faster than integer-only # code (meaning that latter performs sub-optimally, nothing was done # about it). # May 2014. # # Add ARMv8 code path performing at 2.0 cpb on Apple A7. $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $ctx="r0"; $t0="r0"; $inp="r1"; $t4="r1"; $len="r2"; $t1="r2"; $T1="r3"; $t3="r3"; $A="r4"; $B="r5"; $C="r6"; $D="r7"; $E="r8"; $F="r9"; $G="r10"; $H="r11"; @V=($A,$B,$C,$D,$E,$F,$G,$H); $t2="r12"; $Ktbl="r14"; @Sigma0=( 2,13,22); @Sigma1=( 6,11,25); @sigma0=( 7,18, 3); @sigma1=(17,19,10); sub BODY_00_15 { my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; $code.=<<___ if ($i<16); #if __ARM_ARCH__>=7 @ ldr $t1,[$inp],#4 @ $i # if $i==15 str $inp,[sp,#17*4] @ make room for $t4 # endif eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` add $a,$a,$t2 @ h+=Maj(a,b,c) from the past eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) # ifndef __ARMEB__ rev $t1,$t1 # endif #else @ ldrb $t1,[$inp,#3] @ $i add $a,$a,$t2 @ h+=Maj(a,b,c) from the past ldrb $t2,[$inp,#2] ldrb $t0,[$inp,#1] orr $t1,$t1,$t2,lsl#8 ldrb $t2,[$inp],#4 orr $t1,$t1,$t0,lsl#16 # if $i==15 str $inp,[sp,#17*4] @ make room for $t4 # endif eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` orr $t1,$t1,$t2,lsl#24 eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) #endif ___ $code.=<<___; ldr $t2,[$Ktbl],#4 @ *K256++ add $h,$h,$t1 @ h+=X[i] str $t1,[sp,#`$i%16`*4] eor $t1,$f,$g add $h,$h,$t0,ror#$Sigma1[0] @ h+=Sigma1(e) and $t1,$t1,$e add $h,$h,$t2 @ h+=K256[i] eor $t1,$t1,$g @ Ch(e,f,g) eor $t0,$a,$a,ror#`$Sigma0[1]-$Sigma0[0]` add $h,$h,$t1 @ h+=Ch(e,f,g) #if $i==31 and $t2,$t2,#0xff cmp $t2,#0xf2 @ done? #endif #if $i<15 # if __ARM_ARCH__>=7 ldr $t1,[$inp],#4 @ prefetch # else ldrb $t1,[$inp,#3] # endif eor $t2,$a,$b @ a^b, b^c in next round #else ldr $t1,[sp,#`($i+2)%16`*4] @ from future BODY_16_xx eor $t2,$a,$b @ a^b, b^c in next round ldr $t4,[sp,#`($i+15)%16`*4] @ from future BODY_16_xx #endif eor $t0,$t0,$a,ror#`$Sigma0[2]-$Sigma0[0]` @ Sigma0(a) and $t3,$t3,$t2 @ (b^c)&=(a^b) add $d,$d,$h @ d+=h eor $t3,$t3,$b @ Maj(a,b,c) add $h,$h,$t0,ror#$Sigma0[0] @ h+=Sigma0(a) @ add $h,$h,$t3 @ h+=Maj(a,b,c) ___ ($t2,$t3)=($t3,$t2); } sub BODY_16_XX { my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; $code.=<<___; @ ldr $t1,[sp,#`($i+1)%16`*4] @ $i @ ldr $t4,[sp,#`($i+14)%16`*4] mov $t0,$t1,ror#$sigma0[0] add $a,$a,$t2 @ h+=Maj(a,b,c) from the past mov $t2,$t4,ror#$sigma1[0] eor $t0,$t0,$t1,ror#$sigma0[1] eor $t2,$t2,$t4,ror#$sigma1[1] eor $t0,$t0,$t1,lsr#$sigma0[2] @ sigma0(X[i+1]) ldr $t1,[sp,#`($i+0)%16`*4] eor $t2,$t2,$t4,lsr#$sigma1[2] @ sigma1(X[i+14]) ldr $t4,[sp,#`($i+9)%16`*4] add $t2,$t2,$t0 eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` @ from BODY_00_15 add $t1,$t1,$t2 eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) add $t1,$t1,$t4 @ X[i] ___ &BODY_00_15(@_); } $code=<<___; #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those @ instructions are manually-encoded. (See unsha256.) .arch armv7-a .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .type K256,%object .align 5 K256: .word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .size K256,.-K256 .word 0 @ terminator #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .LOPENSSL_armcap: .word GFp_armcap_P-.Lsha256_block_data_order #endif .align 5 .global GFp_sha256_block_data_order .type GFp_sha256_block_data_order,%function GFp_sha256_block_data_order: .Lsha256_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ GFp_sha256_block_data_order #else adr r3,.Lsha256_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,.LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV8_SHA256 bne .LARMv8 tst r12,#ARMV7_NEON bne .LNEON #endif add $len,$inp,$len,lsl#6 @ len to point at the end of inp stmdb sp!,{$ctx,$inp,$len,r4-r11,lr} ldmia $ctx,{$A,$B,$C,$D,$E,$F,$G,$H} sub $Ktbl,r3,#256+32 @ K256 sub sp,sp,#16*4 @ alloca(X[16]) .Loop: # if __ARM_ARCH__>=7 ldr $t1,[$inp],#4 # else ldrb $t1,[$inp,#3] # endif eor $t3,$B,$C @ magic eor $t2,$t2,$t2 ___ for($i=0;$i<16;$i++) { &BODY_00_15($i,@V); unshift(@V,pop(@V)); } $code.=".Lrounds_16_xx:\n"; for (;$i<32;$i++) { &BODY_16_XX($i,@V); unshift(@V,pop(@V)); } $code.=<<___; #if __ARM_ARCH__>=7 ite eq @ Thumb2 thing, sanity check in ARM #endif ldreq $t3,[sp,#16*4] @ pull ctx bne .Lrounds_16_xx add $A,$A,$t2 @ h+=Maj(a,b,c) from the past ldr $t0,[$t3,#0] ldr $t1,[$t3,#4] ldr $t2,[$t3,#8] add $A,$A,$t0 ldr $t0,[$t3,#12] add $B,$B,$t1 ldr $t1,[$t3,#16] add $C,$C,$t2 ldr $t2,[$t3,#20] add $D,$D,$t0 ldr $t0,[$t3,#24] add $E,$E,$t1 ldr $t1,[$t3,#28] add $F,$F,$t2 ldr $inp,[sp,#17*4] @ pull inp ldr $t2,[sp,#18*4] @ pull inp+len add $G,$G,$t0 add $H,$H,$t1 stmia $t3,{$A,$B,$C,$D,$E,$F,$G,$H} cmp $inp,$t2 sub $Ktbl,$Ktbl,#256 @ rewind Ktbl bne .Loop add sp,sp,#`16+3`*4 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4-r11,pc} #else ldmia sp!,{r4-r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order ___ ###################################################################### # NEON stuff # {{{ my @X=map("q$_",(0..3)); my ($T0,$T1,$T2,$T3,$T4,$T5)=("q8","q9","q10","q11","d24","d25"); my $Xfer=$t4; my $j=0; sub Dlo() { shift=~m|q([1]?[0-9])|?"d".($1*2):""; } sub Dhi() { shift=~m|q([1]?[0-9])|?"d".($1*2+1):""; } sub AUTOLOAD() # thunk [simplified] x86-style perlasm { my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; my $arg = pop; $arg = "#$arg" if ($arg*1 eq $arg); $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; } sub Xupdate() { use integer; my $body = shift; my @insns = (&$body,&$body,&$body,&$body); my ($a,$b,$c,$d,$e,$f,$g,$h); &vext_8 ($T0,@X[0],@X[1],4); # X[1..4] eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &vext_8 ($T1,@X[2],@X[3],4); # X[9..12] eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T2,$T0,$sigma0[0]); eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 (@X[0],@X[0],$T1); # X[0..3] += X[9..12] eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T1,$T0,$sigma0[2]); eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T2,$T0,32-$sigma0[0]); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T3,$T0,$sigma0[1]); eval(shift(@insns)); eval(shift(@insns)); &veor ($T1,$T1,$T2); eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T3,$T0,32-$sigma0[1]); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T4,&Dhi(@X[3]),$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &veor ($T1,$T1,$T3); # sigma0(X[1..4]) eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T4,&Dhi(@X[3]),32-$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T5,&Dhi(@X[3]),$sigma1[2]); eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 (@X[0],@X[0],$T1); # X[0..3] += sigma0(X[1..4]) eval(shift(@insns)); eval(shift(@insns)); &veor ($T5,$T5,$T4); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T4,&Dhi(@X[3]),$sigma1[1]); eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T4,&Dhi(@X[3]),32-$sigma1[1]); eval(shift(@insns)); eval(shift(@insns)); &veor ($T5,$T5,$T4); # sigma1(X[14..15]) eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 (&Dlo(@X[0]),&Dlo(@X[0]),$T5);# X[0..1] += sigma1(X[14..15]) eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T4,&Dlo(@X[0]),$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T4,&Dlo(@X[0]),32-$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T5,&Dlo(@X[0]),$sigma1[2]); eval(shift(@insns)); eval(shift(@insns)); &veor ($T5,$T5,$T4); eval(shift(@insns)); eval(shift(@insns)); &vshr_u32 ($T4,&Dlo(@X[0]),$sigma1[1]); eval(shift(@insns)); eval(shift(@insns)); &vld1_32 ("{$T0}","[$Ktbl,:128]!"); eval(shift(@insns)); eval(shift(@insns)); &vsli_32 ($T4,&Dlo(@X[0]),32-$sigma1[1]); eval(shift(@insns)); eval(shift(@insns)); &veor ($T5,$T5,$T4); # sigma1(X[16..17]) eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 (&Dhi(@X[0]),&Dhi(@X[0]),$T5);# X[2..3] += sigma1(X[16..17]) eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 ($T0,$T0,@X[0]); while($#insns>=2) { eval(shift(@insns)); } &vst1_32 ("{$T0}","[$Xfer,:128]!"); eval(shift(@insns)); eval(shift(@insns)); push(@X,shift(@X)); # "rotate" X[] } sub Xpreload() { use integer; my $body = shift; my @insns = (&$body,&$body,&$body,&$body); my ($a,$b,$c,$d,$e,$f,$g,$h); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &vld1_32 ("{$T0}","[$Ktbl,:128]!"); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &vrev32_8 (@X[0],@X[0]); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &vadd_i32 ($T0,$T0,@X[0]); foreach (@insns) { eval; } # remaining instructions &vst1_32 ("{$T0}","[$Xfer,:128]!"); push(@X,shift(@X)); # "rotate" X[] } sub body_00_15 () { ( '($a,$b,$c,$d,$e,$f,$g,$h)=@V;'. '&add ($h,$h,$t1)', # h+=X[i]+K[i] '&eor ($t1,$f,$g)', '&eor ($t0,$e,$e,"ror#".($Sigma1[1]-$Sigma1[0]))', '&add ($a,$a,$t2)', # h+=Maj(a,b,c) from the past '&and ($t1,$t1,$e)', '&eor ($t2,$t0,$e,"ror#".($Sigma1[2]-$Sigma1[0]))', # Sigma1(e) '&eor ($t0,$a,$a,"ror#".($Sigma0[1]-$Sigma0[0]))', '&eor ($t1,$t1,$g)', # Ch(e,f,g) '&add ($h,$h,$t2,"ror#$Sigma1[0]")', # h+=Sigma1(e) '&eor ($t2,$a,$b)', # a^b, b^c in next round '&eor ($t0,$t0,$a,"ror#".($Sigma0[2]-$Sigma0[0]))', # Sigma0(a) '&add ($h,$h,$t1)', # h+=Ch(e,f,g) '&ldr ($t1,sprintf "[sp,#%d]",4*(($j+1)&15)) if (($j&15)!=15);'. '&ldr ($t1,"[$Ktbl]") if ($j==15);'. '&ldr ($t1,"[sp,#64]") if ($j==31)', '&and ($t3,$t3,$t2)', # (b^c)&=(a^b) '&add ($d,$d,$h)', # d+=h '&add ($h,$h,$t0,"ror#$Sigma0[0]");'. # h+=Sigma0(a) '&eor ($t3,$t3,$b)', # Maj(a,b,c) '$j++; unshift(@V,pop(@V)); ($t2,$t3)=($t3,$t2);' ) } $code.=<<___; #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type sha256_block_data_order_neon,%function .align 5 .skip 16 sha256_block_data_order_neon: .LNEON: stmdb sp!,{r4-r12,lr} sub $H,sp,#16*4+16 adr $Ktbl,K256 bic $H,$H,#15 @ align for 128-bit stores mov $t2,sp mov sp,$H @ alloca add $len,$inp,$len,lsl#6 @ len to point at the end of inp vld1.8 {@X[0]},[$inp]! vld1.8 {@X[1]},[$inp]! vld1.8 {@X[2]},[$inp]! vld1.8 {@X[3]},[$inp]! vld1.32 {$T0},[$Ktbl,:128]! vld1.32 {$T1},[$Ktbl,:128]! vld1.32 {$T2},[$Ktbl,:128]! vld1.32 {$T3},[$Ktbl,:128]! vrev32.8 @X[0],@X[0] @ yes, even on str $ctx,[sp,#64] vrev32.8 @X[1],@X[1] @ big-endian str $inp,[sp,#68] mov $Xfer,sp vrev32.8 @X[2],@X[2] str $len,[sp,#72] vrev32.8 @X[3],@X[3] str $t2,[sp,#76] @ save original sp vadd.i32 $T0,$T0,@X[0] vadd.i32 $T1,$T1,@X[1] vst1.32 {$T0},[$Xfer,:128]! vadd.i32 $T2,$T2,@X[2] vst1.32 {$T1},[$Xfer,:128]! vadd.i32 $T3,$T3,@X[3] vst1.32 {$T2},[$Xfer,:128]! vst1.32 {$T3},[$Xfer,:128]! ldmia $ctx,{$A-$H} sub $Xfer,$Xfer,#64 ldr $t1,[sp,#0] eor $t2,$t2,$t2 eor $t3,$B,$C b .L_00_48 .align 4 .L_00_48: ___ &Xupdate(\&body_00_15); &Xupdate(\&body_00_15); &Xupdate(\&body_00_15); &Xupdate(\&body_00_15); $code.=<<___; teq $t1,#0 @ check for K256 terminator ldr $t1,[sp,#0] sub $Xfer,$Xfer,#64 bne .L_00_48 ldr $inp,[sp,#68] ldr $t0,[sp,#72] sub $Ktbl,$Ktbl,#256 @ rewind $Ktbl teq $inp,$t0 it eq subeq $inp,$inp,#64 @ avoid SEGV vld1.8 {@X[0]},[$inp]! @ load next input block vld1.8 {@X[1]},[$inp]! vld1.8 {@X[2]},[$inp]! vld1.8 {@X[3]},[$inp]! it ne strne $inp,[sp,#68] mov $Xfer,sp ___ &Xpreload(\&body_00_15); &Xpreload(\&body_00_15); &Xpreload(\&body_00_15); &Xpreload(\&body_00_15); $code.=<<___; ldr $t0,[$t1,#0] add $A,$A,$t2 @ h+=Maj(a,b,c) from the past ldr $t2,[$t1,#4] ldr $t3,[$t1,#8] ldr $t4,[$t1,#12] add $A,$A,$t0 @ accumulate ldr $t0,[$t1,#16] add $B,$B,$t2 ldr $t2,[$t1,#20] add $C,$C,$t3 ldr $t3,[$t1,#24] add $D,$D,$t4 ldr $t4,[$t1,#28] add $E,$E,$t0 str $A,[$t1],#4 add $F,$F,$t2 str $B,[$t1],#4 add $G,$G,$t3 str $C,[$t1],#4 add $H,$H,$t4 str $D,[$t1],#4 stmia $t1,{$E-$H} ittte ne movne $Xfer,sp ldrne $t1,[sp,#0] eorne $t2,$t2,$t2 ldreq sp,[sp,#76] @ restore original sp itt ne eorne $t3,$B,$C bne .L_00_48 ldmia sp!,{r4-r12,pc} .size sha256_block_data_order_neon,.-sha256_block_data_order_neon #endif ___ }}} ###################################################################### # ARMv8 stuff # {{{ my ($ABCD,$EFGH,$abcd)=map("q$_",(0..2)); my @MSG=map("q$_",(8..11)); my ($W0,$W1,$ABCD_SAVE,$EFGH_SAVE)=map("q$_",(12..15)); my $Ktbl="r3"; $code.=<<___; #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) # if defined(__thumb2__) # define INST(a,b,c,d) .byte c,d|0xc,a,b # else # define INST(a,b,c,d) .byte a,b,c,d # endif .type sha256_block_data_order_armv8,%function .align 5 sha256_block_data_order_armv8: .LARMv8: vld1.32 {$ABCD,$EFGH},[$ctx] sub $Ktbl,$Ktbl,#256+32 add $len,$inp,$len,lsl#6 @ len to point at the end of inp b .Loop_v8 .align 4 .Loop_v8: vld1.8 {@MSG[0]-@MSG[1]},[$inp]! vld1.8 {@MSG[2]-@MSG[3]},[$inp]! vld1.32 {$W0},[$Ktbl]! vrev32.8 @MSG[0],@MSG[0] vrev32.8 @MSG[1],@MSG[1] vrev32.8 @MSG[2],@MSG[2] vrev32.8 @MSG[3],@MSG[3] vmov $ABCD_SAVE,$ABCD @ offload vmov $EFGH_SAVE,$EFGH teq $inp,$len ___ for($i=0;$i<12;$i++) { $code.=<<___; vld1.32 {$W1},[$Ktbl]! vadd.i32 $W0,$W0,@MSG[0] sha256su0 @MSG[0],@MSG[1] vmov $abcd,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 sha256su1 @MSG[0],@MSG[2],@MSG[3] ___ ($W0,$W1)=($W1,$W0); push(@MSG,shift(@MSG)); } $code.=<<___; vld1.32 {$W1},[$Ktbl]! vadd.i32 $W0,$W0,@MSG[0] vmov $abcd,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 vld1.32 {$W0},[$Ktbl]! vadd.i32 $W1,$W1,@MSG[1] vmov $abcd,$ABCD sha256h $ABCD,$EFGH,$W1 sha256h2 $EFGH,$abcd,$W1 vld1.32 {$W1},[$Ktbl] vadd.i32 $W0,$W0,@MSG[2] sub $Ktbl,$Ktbl,#256-16 @ rewind vmov $abcd,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 vadd.i32 $W1,$W1,@MSG[3] vmov $abcd,$ABCD sha256h $ABCD,$EFGH,$W1 sha256h2 $EFGH,$abcd,$W1 vadd.i32 $ABCD,$ABCD,$ABCD_SAVE vadd.i32 $EFGH,$EFGH,$EFGH_SAVE it ne bne .Loop_v8 vst1.32 {$ABCD,$EFGH},[$ctx] ret @ bx lr .size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8 #endif ___ }}} $code.=<<___; .asciz "SHA256 block transform for ARMv4/NEON/ARMv8, CRYPTOGAMS by " .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif ___ open SELF,$0; while() { next if (/^#!/); last if (!s/^#/@/ and !/^$/); print; } close SELF; { my %opcode = ( "sha256h" => 0xf3000c40, "sha256h2" => 0xf3100c40, "sha256su0" => 0xf3ba03c0, "sha256su1" => 0xf3200c40 ); sub unsha256 { my ($mnemonic,$arg)=@_; if ($arg =~ m/q([0-9]+)(?:,\s*q([0-9]+))?,\s*q([0-9]+)/o) { my $word = $opcode{$mnemonic}|(($1&7)<<13)|(($1&8)<<19) |(($2&7)<<17)|(($2&8)<<4) |(($3&7)<<1) |(($3&8)<<2); # since ARMv7 instructions are always encoded little-endian. # correct solution is to use .inst directive, but older # assemblers don't implement it:-( sprintf "INST(0x%02x,0x%02x,0x%02x,0x%02x)\t@ %s %s", $word&0xff,($word>>8)&0xff, ($word>>16)&0xff,($word>>24)&0xff, $mnemonic,$arg; } } } foreach (split($/,$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\b(sha256\w+)\s+(q.*)/unsha256($1,$2)/geo; s/\bret\b/bx lr/go or s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4 print $_,"\n"; } close STDOUT or die "error closing STDOUT"; # enforce flush ring-0.16.9/crypto/fipsmodule/sha/asm/sha512-armv4.pl000064400000000000000000000426501352416253600203630ustar0000000000000000#! /usr/bin/env perl # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # # Permission to use under GPL terms is granted. # ==================================================================== # SHA512 block procedure for ARMv4. September 2007. # This code is ~4.5 (four and a half) times faster than code generated # by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue # Xscale PXA250 core]. # # July 2010. # # Rescheduling for dual-issue pipeline resulted in 6% improvement on # Cortex A8 core and ~40 cycles per processed byte. # February 2011. # # Profiler-assisted and platform-specific optimization resulted in 7% # improvement on Coxtex A8 core and ~38 cycles per byte. # March 2011. # # Add NEON implementation. On Cortex A8 it was measured to process # one byte in 23.3 cycles or ~60% faster than integer-only code. # August 2012. # # Improve NEON performance by 12% on Snapdragon S4. In absolute # terms it's 22.6 cycles per byte, which is disappointing result. # Technical writers asserted that 3-way S4 pipeline can sustain # multiple NEON instructions per cycle, but dual NEON issue could # not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html # for further details. On side note Cortex-A15 processes one byte in # 16 cycles. # Byte order [in]dependence. ========================================= # # Originally caller was expected to maintain specific *dword* order in # h[0-7], namely with most significant dword at *lower* address, which # was reflected in below two parameters as 0 and 4. Now caller is # expected to maintain native byte order for whole 64-bit values. $hi="HI"; $lo="LO"; # ==================================================================== $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } $ctx="r0"; # parameter block $inp="r1"; $len="r2"; $Tlo="r3"; $Thi="r4"; $Alo="r5"; $Ahi="r6"; $Elo="r7"; $Ehi="r8"; $t0="r9"; $t1="r10"; $t2="r11"; $t3="r12"; ############ r13 is stack pointer $Ktbl="r14"; ############ r15 is program counter $Aoff=8*0; $Boff=8*1; $Coff=8*2; $Doff=8*3; $Eoff=8*4; $Foff=8*5; $Goff=8*6; $Hoff=8*7; $Xoff=8*8; sub BODY_00_15() { my $magic = shift; $code.=<<___; @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 mov $t0,$Elo,lsr#14 str $Tlo,[sp,#$Xoff+0] mov $t1,$Ehi,lsr#14 str $Thi,[sp,#$Xoff+4] eor $t0,$t0,$Ehi,lsl#18 ldr $t2,[sp,#$Hoff+0] @ h.lo eor $t1,$t1,$Elo,lsl#18 ldr $t3,[sp,#$Hoff+4] @ h.hi eor $t0,$t0,$Elo,lsr#18 eor $t1,$t1,$Ehi,lsr#18 eor $t0,$t0,$Ehi,lsl#14 eor $t1,$t1,$Elo,lsl#14 eor $t0,$t0,$Ehi,lsr#9 eor $t1,$t1,$Elo,lsr#9 eor $t0,$t0,$Elo,lsl#23 eor $t1,$t1,$Ehi,lsl#23 @ Sigma1(e) adds $Tlo,$Tlo,$t0 ldr $t0,[sp,#$Foff+0] @ f.lo adc $Thi,$Thi,$t1 @ T += Sigma1(e) ldr $t1,[sp,#$Foff+4] @ f.hi adds $Tlo,$Tlo,$t2 ldr $t2,[sp,#$Goff+0] @ g.lo adc $Thi,$Thi,$t3 @ T += h ldr $t3,[sp,#$Goff+4] @ g.hi eor $t0,$t0,$t2 str $Elo,[sp,#$Eoff+0] eor $t1,$t1,$t3 str $Ehi,[sp,#$Eoff+4] and $t0,$t0,$Elo str $Alo,[sp,#$Aoff+0] and $t1,$t1,$Ehi str $Ahi,[sp,#$Aoff+4] eor $t0,$t0,$t2 ldr $t2,[$Ktbl,#$lo] @ K[i].lo eor $t1,$t1,$t3 @ Ch(e,f,g) ldr $t3,[$Ktbl,#$hi] @ K[i].hi adds $Tlo,$Tlo,$t0 ldr $Elo,[sp,#$Doff+0] @ d.lo adc $Thi,$Thi,$t1 @ T += Ch(e,f,g) ldr $Ehi,[sp,#$Doff+4] @ d.hi adds $Tlo,$Tlo,$t2 and $t0,$t2,#0xff adc $Thi,$Thi,$t3 @ T += K[i] adds $Elo,$Elo,$Tlo ldr $t2,[sp,#$Boff+0] @ b.lo adc $Ehi,$Ehi,$Thi @ d += T teq $t0,#$magic ldr $t3,[sp,#$Coff+0] @ c.lo #if __ARM_ARCH__>=7 it eq @ Thumb2 thing, sanity check in ARM #endif orreq $Ktbl,$Ktbl,#1 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 mov $t0,$Alo,lsr#28 mov $t1,$Ahi,lsr#28 eor $t0,$t0,$Ahi,lsl#4 eor $t1,$t1,$Alo,lsl#4 eor $t0,$t0,$Ahi,lsr#2 eor $t1,$t1,$Alo,lsr#2 eor $t0,$t0,$Alo,lsl#30 eor $t1,$t1,$Ahi,lsl#30 eor $t0,$t0,$Ahi,lsr#7 eor $t1,$t1,$Alo,lsr#7 eor $t0,$t0,$Alo,lsl#25 eor $t1,$t1,$Ahi,lsl#25 @ Sigma0(a) adds $Tlo,$Tlo,$t0 and $t0,$Alo,$t2 adc $Thi,$Thi,$t1 @ T += Sigma0(a) ldr $t1,[sp,#$Boff+4] @ b.hi orr $Alo,$Alo,$t2 ldr $t2,[sp,#$Coff+4] @ c.hi and $Alo,$Alo,$t3 and $t3,$Ahi,$t1 orr $Ahi,$Ahi,$t1 orr $Alo,$Alo,$t0 @ Maj(a,b,c).lo and $Ahi,$Ahi,$t2 adds $Alo,$Alo,$Tlo orr $Ahi,$Ahi,$t3 @ Maj(a,b,c).hi sub sp,sp,#8 adc $Ahi,$Ahi,$Thi @ h += T tst $Ktbl,#1 add $Ktbl,$Ktbl,#8 ___ } $code=<<___; #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 # define VFP_ABI_PUSH # define VFP_ABI_POP #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a #ifdef __ARMEL__ # define LO 0 # define HI 4 # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 #else # define HI 0 # define LO 4 # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 #endif .text #if defined(__thumb2__) .syntax unified .thumb # define adrl adr #else .code 32 #endif .type K512,%object .align 5 K512: WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) .size K512,.-K512 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .LOPENSSL_armcap: .word GFp_armcap_P-.Lsha512_block_data_order .skip 32-4 #else .skip 32 #endif .global GFp_sha512_block_data_order .type GFp_sha512_block_data_order,%function GFp_sha512_block_data_order: .Lsha512_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ GFp_sha512_block_data_order #else adr r3,.Lsha512_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,.LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV7_NEON bne .LNEON #endif add $len,$inp,$len,lsl#7 @ len to point at the end of inp stmdb sp!,{r4-r12,lr} sub $Ktbl,r3,#672 @ K512 sub sp,sp,#9*8 ldr $Elo,[$ctx,#$Eoff+$lo] ldr $Ehi,[$ctx,#$Eoff+$hi] ldr $t0, [$ctx,#$Goff+$lo] ldr $t1, [$ctx,#$Goff+$hi] ldr $t2, [$ctx,#$Hoff+$lo] ldr $t3, [$ctx,#$Hoff+$hi] .Loop: str $t0, [sp,#$Goff+0] str $t1, [sp,#$Goff+4] str $t2, [sp,#$Hoff+0] str $t3, [sp,#$Hoff+4] ldr $Alo,[$ctx,#$Aoff+$lo] ldr $Ahi,[$ctx,#$Aoff+$hi] ldr $Tlo,[$ctx,#$Boff+$lo] ldr $Thi,[$ctx,#$Boff+$hi] ldr $t0, [$ctx,#$Coff+$lo] ldr $t1, [$ctx,#$Coff+$hi] ldr $t2, [$ctx,#$Doff+$lo] ldr $t3, [$ctx,#$Doff+$hi] str $Tlo,[sp,#$Boff+0] str $Thi,[sp,#$Boff+4] str $t0, [sp,#$Coff+0] str $t1, [sp,#$Coff+4] str $t2, [sp,#$Doff+0] str $t3, [sp,#$Doff+4] ldr $Tlo,[$ctx,#$Foff+$lo] ldr $Thi,[$ctx,#$Foff+$hi] str $Tlo,[sp,#$Foff+0] str $Thi,[sp,#$Foff+4] .L00_15: #if __ARM_ARCH__<7 ldrb $Tlo,[$inp,#7] ldrb $t0, [$inp,#6] ldrb $t1, [$inp,#5] ldrb $t2, [$inp,#4] ldrb $Thi,[$inp,#3] ldrb $t3, [$inp,#2] orr $Tlo,$Tlo,$t0,lsl#8 ldrb $t0, [$inp,#1] orr $Tlo,$Tlo,$t1,lsl#16 ldrb $t1, [$inp],#8 orr $Tlo,$Tlo,$t2,lsl#24 orr $Thi,$Thi,$t3,lsl#8 orr $Thi,$Thi,$t0,lsl#16 orr $Thi,$Thi,$t1,lsl#24 #else ldr $Tlo,[$inp,#4] ldr $Thi,[$inp],#8 #ifdef __ARMEL__ rev $Tlo,$Tlo rev $Thi,$Thi #endif #endif ___ &BODY_00_15(0x94); $code.=<<___; tst $Ktbl,#1 beq .L00_15 ldr $t0,[sp,#`$Xoff+8*(16-1)`+0] ldr $t1,[sp,#`$Xoff+8*(16-1)`+4] bic $Ktbl,$Ktbl,#1 .L16_79: @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 mov $Tlo,$t0,lsr#1 ldr $t2,[sp,#`$Xoff+8*(16-14)`+0] mov $Thi,$t1,lsr#1 ldr $t3,[sp,#`$Xoff+8*(16-14)`+4] eor $Tlo,$Tlo,$t1,lsl#31 eor $Thi,$Thi,$t0,lsl#31 eor $Tlo,$Tlo,$t0,lsr#8 eor $Thi,$Thi,$t1,lsr#8 eor $Tlo,$Tlo,$t1,lsl#24 eor $Thi,$Thi,$t0,lsl#24 eor $Tlo,$Tlo,$t0,lsr#7 eor $Thi,$Thi,$t1,lsr#7 eor $Tlo,$Tlo,$t1,lsl#25 @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 mov $t0,$t2,lsr#19 mov $t1,$t3,lsr#19 eor $t0,$t0,$t3,lsl#13 eor $t1,$t1,$t2,lsl#13 eor $t0,$t0,$t3,lsr#29 eor $t1,$t1,$t2,lsr#29 eor $t0,$t0,$t2,lsl#3 eor $t1,$t1,$t3,lsl#3 eor $t0,$t0,$t2,lsr#6 eor $t1,$t1,$t3,lsr#6 ldr $t2,[sp,#`$Xoff+8*(16-9)`+0] eor $t0,$t0,$t3,lsl#26 ldr $t3,[sp,#`$Xoff+8*(16-9)`+4] adds $Tlo,$Tlo,$t0 ldr $t0,[sp,#`$Xoff+8*16`+0] adc $Thi,$Thi,$t1 ldr $t1,[sp,#`$Xoff+8*16`+4] adds $Tlo,$Tlo,$t2 adc $Thi,$Thi,$t3 adds $Tlo,$Tlo,$t0 adc $Thi,$Thi,$t1 ___ &BODY_00_15(0x17); $code.=<<___; #if __ARM_ARCH__>=7 ittt eq @ Thumb2 thing, sanity check in ARM #endif ldreq $t0,[sp,#`$Xoff+8*(16-1)`+0] ldreq $t1,[sp,#`$Xoff+8*(16-1)`+4] beq .L16_79 bic $Ktbl,$Ktbl,#1 ldr $Tlo,[sp,#$Boff+0] ldr $Thi,[sp,#$Boff+4] ldr $t0, [$ctx,#$Aoff+$lo] ldr $t1, [$ctx,#$Aoff+$hi] ldr $t2, [$ctx,#$Boff+$lo] ldr $t3, [$ctx,#$Boff+$hi] adds $t0,$Alo,$t0 str $t0, [$ctx,#$Aoff+$lo] adc $t1,$Ahi,$t1 str $t1, [$ctx,#$Aoff+$hi] adds $t2,$Tlo,$t2 str $t2, [$ctx,#$Boff+$lo] adc $t3,$Thi,$t3 str $t3, [$ctx,#$Boff+$hi] ldr $Alo,[sp,#$Coff+0] ldr $Ahi,[sp,#$Coff+4] ldr $Tlo,[sp,#$Doff+0] ldr $Thi,[sp,#$Doff+4] ldr $t0, [$ctx,#$Coff+$lo] ldr $t1, [$ctx,#$Coff+$hi] ldr $t2, [$ctx,#$Doff+$lo] ldr $t3, [$ctx,#$Doff+$hi] adds $t0,$Alo,$t0 str $t0, [$ctx,#$Coff+$lo] adc $t1,$Ahi,$t1 str $t1, [$ctx,#$Coff+$hi] adds $t2,$Tlo,$t2 str $t2, [$ctx,#$Doff+$lo] adc $t3,$Thi,$t3 str $t3, [$ctx,#$Doff+$hi] ldr $Tlo,[sp,#$Foff+0] ldr $Thi,[sp,#$Foff+4] ldr $t0, [$ctx,#$Eoff+$lo] ldr $t1, [$ctx,#$Eoff+$hi] ldr $t2, [$ctx,#$Foff+$lo] ldr $t3, [$ctx,#$Foff+$hi] adds $Elo,$Elo,$t0 str $Elo,[$ctx,#$Eoff+$lo] adc $Ehi,$Ehi,$t1 str $Ehi,[$ctx,#$Eoff+$hi] adds $t2,$Tlo,$t2 str $t2, [$ctx,#$Foff+$lo] adc $t3,$Thi,$t3 str $t3, [$ctx,#$Foff+$hi] ldr $Alo,[sp,#$Goff+0] ldr $Ahi,[sp,#$Goff+4] ldr $Tlo,[sp,#$Hoff+0] ldr $Thi,[sp,#$Hoff+4] ldr $t0, [$ctx,#$Goff+$lo] ldr $t1, [$ctx,#$Goff+$hi] ldr $t2, [$ctx,#$Hoff+$lo] ldr $t3, [$ctx,#$Hoff+$hi] adds $t0,$Alo,$t0 str $t0, [$ctx,#$Goff+$lo] adc $t1,$Ahi,$t1 str $t1, [$ctx,#$Goff+$hi] adds $t2,$Tlo,$t2 str $t2, [$ctx,#$Hoff+$lo] adc $t3,$Thi,$t3 str $t3, [$ctx,#$Hoff+$hi] add sp,sp,#640 sub $Ktbl,$Ktbl,#640 teq $inp,$len bne .Loop add sp,sp,#8*9 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4-r12,pc} #else ldmia sp!,{r4-r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order ___ { my @Sigma0=(28,34,39); my @Sigma1=(14,18,41); my @sigma0=(1, 8, 7); my @sigma1=(19,61,6); my $Ktbl="r3"; my $cnt="r12"; # volatile register known as ip, intra-procedure-call scratch my @X=map("d$_",(0..15)); my @V=($A,$B,$C,$D,$E,$F,$G,$H)=map("d$_",(16..23)); sub NEON_00_15() { my $i=shift; my ($a,$b,$c,$d,$e,$f,$g,$h)=@_; my ($t0,$t1,$t2,$T1,$K,$Ch,$Maj)=map("d$_",(24..31)); # temps $code.=<<___ if ($i<16 || $i&1); vshr.u64 $t0,$e,#@Sigma1[0] @ $i #if $i<16 vld1.64 {@X[$i%16]},[$inp]! @ handles unaligned #endif vshr.u64 $t1,$e,#@Sigma1[1] #if $i>0 vadd.i64 $a,$Maj @ h+=Maj from the past #endif vshr.u64 $t2,$e,#@Sigma1[2] ___ $code.=<<___; vld1.64 {$K},[$Ktbl,:64]! @ K[i++] vsli.64 $t0,$e,#`64-@Sigma1[0]` vsli.64 $t1,$e,#`64-@Sigma1[1]` vmov $Ch,$e vsli.64 $t2,$e,#`64-@Sigma1[2]` #if $i<16 && defined(__ARMEL__) vrev64.8 @X[$i],@X[$i] #endif veor $t1,$t0 vbsl $Ch,$f,$g @ Ch(e,f,g) vshr.u64 $t0,$a,#@Sigma0[0] veor $t2,$t1 @ Sigma1(e) vadd.i64 $T1,$Ch,$h vshr.u64 $t1,$a,#@Sigma0[1] vsli.64 $t0,$a,#`64-@Sigma0[0]` vadd.i64 $T1,$t2 vshr.u64 $t2,$a,#@Sigma0[2] vadd.i64 $K,@X[$i%16] vsli.64 $t1,$a,#`64-@Sigma0[1]` veor $Maj,$a,$b vsli.64 $t2,$a,#`64-@Sigma0[2]` veor $h,$t0,$t1 vadd.i64 $T1,$K vbsl $Maj,$c,$b @ Maj(a,b,c) veor $h,$t2 @ Sigma0(a) vadd.i64 $d,$T1 vadd.i64 $Maj,$T1 @ vadd.i64 $h,$Maj ___ } sub NEON_16_79() { my $i=shift; if ($i&1) { &NEON_00_15($i,@_); return; } # 2x-vectorized, therefore runs every 2nd round my @X=map("q$_",(0..7)); # view @X as 128-bit vector my ($t0,$t1,$s0,$s1) = map("q$_",(12..15)); # temps my ($d0,$d1,$d2) = map("d$_",(24..26)); # temps from NEON_00_15 my $e=@_[4]; # $e from NEON_00_15 $i /= 2; $code.=<<___; vshr.u64 $t0,@X[($i+7)%8],#@sigma1[0] vshr.u64 $t1,@X[($i+7)%8],#@sigma1[1] vadd.i64 @_[0],d30 @ h+=Maj from the past vshr.u64 $s1,@X[($i+7)%8],#@sigma1[2] vsli.64 $t0,@X[($i+7)%8],#`64-@sigma1[0]` vext.8 $s0,@X[$i%8],@X[($i+1)%8],#8 @ X[i+1] vsli.64 $t1,@X[($i+7)%8],#`64-@sigma1[1]` veor $s1,$t0 vshr.u64 $t0,$s0,#@sigma0[0] veor $s1,$t1 @ sigma1(X[i+14]) vshr.u64 $t1,$s0,#@sigma0[1] vadd.i64 @X[$i%8],$s1 vshr.u64 $s1,$s0,#@sigma0[2] vsli.64 $t0,$s0,#`64-@sigma0[0]` vsli.64 $t1,$s0,#`64-@sigma0[1]` vext.8 $s0,@X[($i+4)%8],@X[($i+5)%8],#8 @ X[i+9] veor $s1,$t0 vshr.u64 $d0,$e,#@Sigma1[0] @ from NEON_00_15 vadd.i64 @X[$i%8],$s0 vshr.u64 $d1,$e,#@Sigma1[1] @ from NEON_00_15 veor $s1,$t1 @ sigma0(X[i+1]) vshr.u64 $d2,$e,#@Sigma1[2] @ from NEON_00_15 vadd.i64 @X[$i%8],$s1 ___ &NEON_00_15(2*$i,@_); } $code.=<<___; #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type sha512_block_data_order_neon,%function .align 4 sha512_block_data_order_neon: .LNEON: dmb @ errata #451034 on early Cortex A8 add $len,$inp,$len,lsl#7 @ len to point at the end of inp adr $Ktbl,K512 VFP_ABI_PUSH vldmia $ctx,{$A-$H} @ load context .Loop_neon: ___ for($i=0;$i<16;$i++) { &NEON_00_15($i,@V); unshift(@V,pop(@V)); } $code.=<<___; mov $cnt,#4 .L16_79_neon: subs $cnt,#1 ___ for(;$i<32;$i++) { &NEON_16_79($i,@V); unshift(@V,pop(@V)); } $code.=<<___; bne .L16_79_neon vadd.i64 $A,d30 @ h+=Maj from the past vldmia $ctx,{d24-d31} @ load context to temp vadd.i64 q8,q12 @ vectorized accumulate vadd.i64 q9,q13 vadd.i64 q10,q14 vadd.i64 q11,q15 vstmia $ctx,{$A-$H} @ save context teq $inp,$len sub $Ktbl,#640 @ rewind K512 bne .Loop_neon VFP_ABI_POP ret @ bx lr .size sha512_block_data_order_neon,.-sha512_block_data_order_neon #endif ___ } $code.=<<___; .asciz "SHA512 block transform for ARMv4/NEON, CRYPTOGAMS by " .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif ___ $code =~ s/\`([^\`]*)\`/eval $1/gem; $code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm; # make it possible to compile with -march=armv4 $code =~ s/\bret\b/bx lr/gm; open SELF,$0; while() { next if (/^#!/); last if (!s/^#/@/ and !/^$/); print; } close SELF; print $code; close STDOUT or die "error closing STDOUT"; # enforce flush ring-0.16.9/crypto/fipsmodule/sha/asm/sha512-armv8.pl000064400000000000000000000306241352416253600203650ustar0000000000000000#! /usr/bin/env perl # Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # # Permission to use under GPLv2 terms is granted. # ==================================================================== # # SHA256/512 for ARMv8. # # Performance in cycles per processed byte and improvement coefficient # over code generated with "default" compiler: # # SHA256-hw SHA256(*) SHA512 # Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) # Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) # Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) # Denver 2.01 10.5 (+26%) 6.70 (+8%) # X-Gene 20.0 (+100%) 12.8 (+300%(***)) # Mongoose 2.36 13.0 (+50%) 8.36 (+33%) # # (*) Software SHA256 results are of lesser relevance, presented # mostly for informational purposes. # (**) The result is a trade-off: it's possible to improve it by # 10% (or by 1 cycle per round), but at the cost of 20% loss # on Cortex-A53 (or by 4 cycles per round). # (***) Super-impressive coefficients over gcc-generated code are # indication of some compiler "pathology", most notably code # generated with -mgeneral-regs-only is significanty faster # and the gap is only 40-90%. $output=pop; $flavour=pop; if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; } else { open STDOUT,">$output"; } if ($output =~ /sha512-armv8/) { $BITS=512; $SZ=8; @Sigma0=(28,34,39); @Sigma1=(14,18,41); @sigma0=(1, 8, 7); @sigma1=(19,61, 6); $rounds=80; $reg_t="x"; } else { $BITS=256; $SZ=4; @Sigma0=( 2,13,22); @Sigma1=( 6,11,25); @sigma0=( 7,18, 3); @sigma1=(17,19,10); $rounds=64; $reg_t="w"; } $func="GFp_sha${BITS}_block_data_order"; ($ctx,$inp,$num,$Ktbl)=map("x$_",(0..2,30)); @X=map("$reg_t$_",(3..15,0..2)); @V=($A,$B,$C,$D,$E,$F,$G,$H)=map("$reg_t$_",(20..27)); ($t0,$t1,$t2,$t3)=map("$reg_t$_",(16,17,19,28)); sub BODY_00_xx { my ($i,$a,$b,$c,$d,$e,$f,$g,$h)=@_; my $j=($i+1)&15; my ($T0,$T1,$T2)=(@X[($i-8)&15],@X[($i-9)&15],@X[($i-10)&15]); $T0=@X[$i+3] if ($i<11); $code.=<<___ if ($i<16); #ifndef __ARMEB__ rev @X[$i],@X[$i] // $i #endif ___ $code.=<<___ if ($i<13 && ($i&1)); ldp @X[$i+1],@X[$i+2],[$inp],#2*$SZ ___ $code.=<<___ if ($i==13); ldp @X[14],@X[15],[$inp] ___ $code.=<<___ if ($i>=14); ldr @X[($i-11)&15],[sp,#`$SZ*(($i-11)%4)`] ___ $code.=<<___ if ($i>0 && $i<16); add $a,$a,$t1 // h+=Sigma0(a) ___ $code.=<<___ if ($i>=11); str @X[($i-8)&15],[sp,#`$SZ*(($i-8)%4)`] ___ # While ARMv8 specifies merged rotate-n-logical operation such as # 'eor x,y,z,ror#n', it was found to negatively affect performance # on Apple A7. The reason seems to be that it requires even 'y' to # be available earlier. This means that such merged instruction is # not necessarily best choice on critical path... On the other hand # Cortex-A5x handles merged instructions much better than disjoint # rotate and logical... See (**) footnote above. $code.=<<___ if ($i<15); ror $t0,$e,#$Sigma1[0] add $h,$h,$t2 // h+=K[i] eor $T0,$e,$e,ror#`$Sigma1[2]-$Sigma1[1]` and $t1,$f,$e bic $t2,$g,$e add $h,$h,@X[$i&15] // h+=X[i] orr $t1,$t1,$t2 // Ch(e,f,g) eor $t2,$a,$b // a^b, b^c in next round eor $t0,$t0,$T0,ror#$Sigma1[1] // Sigma1(e) ror $T0,$a,#$Sigma0[0] add $h,$h,$t1 // h+=Ch(e,f,g) eor $t1,$a,$a,ror#`$Sigma0[2]-$Sigma0[1]` add $h,$h,$t0 // h+=Sigma1(e) and $t3,$t3,$t2 // (b^c)&=(a^b) add $d,$d,$h // d+=h eor $t3,$t3,$b // Maj(a,b,c) eor $t1,$T0,$t1,ror#$Sigma0[1] // Sigma0(a) add $h,$h,$t3 // h+=Maj(a,b,c) ldr $t3,[$Ktbl],#$SZ // *K++, $t2 in next round //add $h,$h,$t1 // h+=Sigma0(a) ___ $code.=<<___ if ($i>=15); ror $t0,$e,#$Sigma1[0] add $h,$h,$t2 // h+=K[i] ror $T1,@X[($j+1)&15],#$sigma0[0] and $t1,$f,$e ror $T2,@X[($j+14)&15],#$sigma1[0] bic $t2,$g,$e ror $T0,$a,#$Sigma0[0] add $h,$h,@X[$i&15] // h+=X[i] eor $t0,$t0,$e,ror#$Sigma1[1] eor $T1,$T1,@X[($j+1)&15],ror#$sigma0[1] orr $t1,$t1,$t2 // Ch(e,f,g) eor $t2,$a,$b // a^b, b^c in next round eor $t0,$t0,$e,ror#$Sigma1[2] // Sigma1(e) eor $T0,$T0,$a,ror#$Sigma0[1] add $h,$h,$t1 // h+=Ch(e,f,g) and $t3,$t3,$t2 // (b^c)&=(a^b) eor $T2,$T2,@X[($j+14)&15],ror#$sigma1[1] eor $T1,$T1,@X[($j+1)&15],lsr#$sigma0[2] // sigma0(X[i+1]) add $h,$h,$t0 // h+=Sigma1(e) eor $t3,$t3,$b // Maj(a,b,c) eor $t1,$T0,$a,ror#$Sigma0[2] // Sigma0(a) eor $T2,$T2,@X[($j+14)&15],lsr#$sigma1[2] // sigma1(X[i+14]) add @X[$j],@X[$j],@X[($j+9)&15] add $d,$d,$h // d+=h add $h,$h,$t3 // h+=Maj(a,b,c) ldr $t3,[$Ktbl],#$SZ // *K++, $t2 in next round add @X[$j],@X[$j],$T1 add $h,$h,$t1 // h+=Sigma0(a) add @X[$j],@X[$j],$T2 ___ ($t2,$t3)=($t3,$t2); } $code.=<<___; #ifndef __KERNEL__ # include #endif .text .extern GFp_armcap_P .globl $func .type $func,%function .align 6 $func: ___ $code.=<<___ if ($SZ==4); #ifndef __KERNEL__ adrp x16,:pg_hi21:GFp_armcap_P add x16,x16,:lo12:GFp_armcap_P ldr w16,[x16] tst w16,#ARMV8_SHA256 b.ne .Lv8_entry #endif ___ $code.=<<___; stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#4*$SZ ldp $A,$B,[$ctx] // load context ldp $C,$D,[$ctx,#2*$SZ] ldp $E,$F,[$ctx,#4*$SZ] add $num,$inp,$num,lsl#`log(16*$SZ)/log(2)` // end of input ldp $G,$H,[$ctx,#6*$SZ] adrp $Ktbl,:pg_hi21:.LK$BITS add $Ktbl,$Ktbl,:lo12:.LK$BITS stp $ctx,$num,[x29,#96] .Loop: ldp @X[0],@X[1],[$inp],#2*$SZ ldr $t2,[$Ktbl],#$SZ // *K++ eor $t3,$B,$C // magic seed str $inp,[x29,#112] ___ for ($i=0;$i<16;$i++) { &BODY_00_xx($i,@V); unshift(@V,pop(@V)); } $code.=".Loop_16_xx:\n"; for (;$i<32;$i++) { &BODY_00_xx($i,@V); unshift(@V,pop(@V)); } $code.=<<___; cbnz $t2,.Loop_16_xx ldp $ctx,$num,[x29,#96] ldr $inp,[x29,#112] sub $Ktbl,$Ktbl,#`$SZ*($rounds+1)` // rewind ldp @X[0],@X[1],[$ctx] ldp @X[2],@X[3],[$ctx,#2*$SZ] add $inp,$inp,#14*$SZ // advance input pointer ldp @X[4],@X[5],[$ctx,#4*$SZ] add $A,$A,@X[0] ldp @X[6],@X[7],[$ctx,#6*$SZ] add $B,$B,@X[1] add $C,$C,@X[2] add $D,$D,@X[3] stp $A,$B,[$ctx] add $E,$E,@X[4] add $F,$F,@X[5] stp $C,$D,[$ctx,#2*$SZ] add $G,$G,@X[6] add $H,$H,@X[7] cmp $inp,$num stp $E,$F,[$ctx,#4*$SZ] stp $G,$H,[$ctx,#6*$SZ] b.ne .Loop ldp x19,x20,[x29,#16] add sp,sp,#4*$SZ ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#128 ret .size $func,.-$func .section .rodata .align 6 .type .LK$BITS,%object .LK$BITS: ___ $code.=<<___ if ($SZ==8); .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0 // terminator ___ $code.=<<___ if ($SZ==4); .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0 //terminator ___ $code.=<<___; .size .LK$BITS,.-.LK$BITS .asciz "SHA$BITS block transform for ARMv8, CRYPTOGAMS by " .align 2 ___ if ($SZ==4) { my $Ktbl="x3"; my ($ABCD,$EFGH,$abcd)=map("v$_.16b",(0..2)); my @MSG=map("v$_.16b",(4..7)); my ($W0,$W1)=("v16.4s","v17.4s"); my ($ABCD_SAVE,$EFGH_SAVE)=("v18.16b","v19.16b"); $code.=<<___; .text #ifndef __KERNEL__ .type sha256_block_armv8,%function .align 6 sha256_block_armv8: .Lv8_entry: stp x29,x30,[sp,#-16]! add x29,sp,#0 ld1.32 {$ABCD,$EFGH},[$ctx] adrp $Ktbl,:pg_hi21:.LK256 add $Ktbl,$Ktbl,:lo12:.LK256 .Loop_hw: ld1 {@MSG[0]-@MSG[3]},[$inp],#64 sub $num,$num,#1 ld1.32 {$W0},[$Ktbl],#16 rev32 @MSG[0],@MSG[0] rev32 @MSG[1],@MSG[1] rev32 @MSG[2],@MSG[2] rev32 @MSG[3],@MSG[3] orr $ABCD_SAVE,$ABCD,$ABCD // offload orr $EFGH_SAVE,$EFGH,$EFGH ___ for($i=0;$i<12;$i++) { $code.=<<___; ld1.32 {$W1},[$Ktbl],#16 add.i32 $W0,$W0,@MSG[0] sha256su0 @MSG[0],@MSG[1] orr $abcd,$ABCD,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 sha256su1 @MSG[0],@MSG[2],@MSG[3] ___ ($W0,$W1)=($W1,$W0); push(@MSG,shift(@MSG)); } $code.=<<___; ld1.32 {$W1},[$Ktbl],#16 add.i32 $W0,$W0,@MSG[0] orr $abcd,$ABCD,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 ld1.32 {$W0},[$Ktbl],#16 add.i32 $W1,$W1,@MSG[1] orr $abcd,$ABCD,$ABCD sha256h $ABCD,$EFGH,$W1 sha256h2 $EFGH,$abcd,$W1 ld1.32 {$W1},[$Ktbl] add.i32 $W0,$W0,@MSG[2] sub $Ktbl,$Ktbl,#$rounds*$SZ-16 // rewind orr $abcd,$ABCD,$ABCD sha256h $ABCD,$EFGH,$W0 sha256h2 $EFGH,$abcd,$W0 add.i32 $W1,$W1,@MSG[3] orr $abcd,$ABCD,$ABCD sha256h $ABCD,$EFGH,$W1 sha256h2 $EFGH,$abcd,$W1 add.i32 $ABCD,$ABCD,$ABCD_SAVE add.i32 $EFGH,$EFGH,$EFGH_SAVE cbnz $num,.Loop_hw st1.32 {$ABCD,$EFGH},[$ctx] ldr x29,[sp],#16 ret .size sha256_block_armv8,.-sha256_block_armv8 #endif ___ } $code.=<<___; #ifndef __KERNEL__ .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif ___ { my %opcode = ( "sha256h" => 0x5e004000, "sha256h2" => 0x5e005000, "sha256su0" => 0x5e282800, "sha256su1" => 0x5e006000 ); sub unsha256 { my ($mnemonic,$arg)=@_; $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)[^,]*(?:,\s*[qv]([0-9]+))?/o && sprintf ".inst\t0x%08x\t//%s %s", $opcode{$mnemonic}|$1|($2<<5)|($3<<16), $mnemonic,$arg; } } open SELF,$0; while() { next if (/^#!/); last if (!s/^#/\/\// and !/^$/); print; } close SELF; foreach(split("\n",$code)) { s/\`([^\`]*)\`/eval($1)/geo; s/\b(sha256\w+)\s+([qv].*)/unsha256($1,$2)/geo; s/\.\w?32\b//o and s/\.16b/\.4s/go; m/(ld|st)1[^\[]+\[0\]/o and s/\.4s/\.s/go; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/fipsmodule/sha/asm/sha512-x86_64.pl000064400000000000000000001477141352416253600202770ustar0000000000000000#! /usr/bin/env perl # Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. Rights for redistribution and usage in source and binary # forms are granted according to the OpenSSL license. # ==================================================================== # # sha256/512_block procedure for x86_64. # # 40% improvement over compiler-generated code on Opteron. On EM64T # sha256 was observed to run >80% faster and sha512 - >40%. No magical # tricks, just straight implementation... I really wonder why gcc # [being armed with inline assembler] fails to generate as fast code. # The only thing which is cool about this module is that it's very # same instruction sequence used for both SHA-256 and SHA-512. In # former case the instructions operate on 32-bit operands, while in # latter - on 64-bit ones. All I had to do is to get one flavor right, # the other one passed the test right away:-) # # sha256_block runs in ~1005 cycles on Opteron, which gives you # asymptotic performance of 64*1000/1005=63.7MBps times CPU clock # frequency in GHz. sha512_block runs in ~1275 cycles, which results # in 128*1000/1275=100MBps per GHz. Is there room for improvement? # Well, if you compare it to IA-64 implementation, which maintains # X[16] in register bank[!], tends to 4 instructions per CPU clock # cycle and runs in 1003 cycles, 1275 is very good result for 3-way # issue Opteron pipeline and X[16] maintained in memory. So that *if* # there is a way to improve it, *then* the only way would be to try to # offload X[16] updates to SSE unit, but that would require "deeper" # loop unroll, which in turn would naturally cause size blow-up, not # to mention increased complexity! And once again, only *if* it's # actually possible to noticeably improve overall ILP, instruction # level parallelism, on a given CPU implementation in this case. # # Special note on Intel EM64T. While Opteron CPU exhibits perfect # performance ratio of 1.5 between 64- and 32-bit flavors [see above], # [currently available] EM64T CPUs apparently are far from it. On the # contrary, 64-bit version, sha512_block, is ~30% *slower* than 32-bit # sha256_block:-( This is presumably because 64-bit shifts/rotates # apparently are not atomic instructions, but implemented in microcode. # # May 2012. # # Optimization including one of Pavel Semjanov's ideas, alternative # Maj, resulted in >=5% improvement on most CPUs, +20% SHA256 and # unfortunately -2% SHA512 on P4 [which nobody should care about # that much]. # # June 2012. # # Add SIMD code paths, see below for improvement coefficients. SSSE3 # code path was not attempted for SHA512, because improvement is not # estimated to be high enough, noticeably less than 9%, to justify # the effort, not on pre-AVX processors. [Obviously with exclusion # for VIA Nano, but it has SHA512 instruction that is faster and # should be used instead.] For reference, corresponding estimated # upper limit for improvement for SSSE3 SHA256 is 28%. The fact that # higher coefficients are observed on VIA Nano and Bulldozer has more # to do with specifics of their architecture [which is topic for # separate discussion]. # # November 2012. # # Add AVX2 code path. Two consecutive input blocks are loaded to # 256-bit %ymm registers, with data from first block to least # significant 128-bit halves and data from second to most significant. # The data is then processed with same SIMD instruction sequence as # for AVX, but with %ymm as operands. Side effect is increased stack # frame, 448 additional bytes in SHA256 and 1152 in SHA512, and 1.2KB # code size increase. # # March 2014. # # Add support for Intel SHA Extensions. ###################################################################### # Current performance in cycles per processed byte (less is better): # # SHA256 SSSE3 AVX/XOP(*) SHA512 AVX/XOP(*) # # AMD K8 14.9 - - 9.57 - # P4 17.3 - - 30.8 - # Core 2 15.6 13.8(+13%) - 9.97 - # Westmere 14.8 12.3(+19%) - 9.58 - # Sandy Bridge 17.4 14.2(+23%) 11.6(+50%(**)) 11.2 8.10(+38%(**)) # Ivy Bridge 12.6 10.5(+20%) 10.3(+22%) 8.17 7.22(+13%) # Haswell 12.2 9.28(+31%) 7.80(+56%) 7.66 5.40(+42%) # Skylake 11.4 9.03(+26%) 7.70(+48%) 7.25 5.20(+40%) # Bulldozer 21.1 13.6(+54%) 13.6(+54%(***)) 13.5 8.58(+57%) # Ryzen 11.0 9.02(+22%) 2.05(+440%) 7.05 5.67(+20%) # VIA Nano 23.0 16.5(+39%) - 14.7 - # Atom 23.0 18.9(+22%) - 14.7 - # Silvermont 27.4 20.6(+33%) - 17.5 - # Knights L 27.4 21.0(+30%) 19.6(+40%) 17.5 12.8(+37%) # Goldmont 18.9 14.3(+32%) 4.16(+350%) 12.0 - # # (*) whichever best applicable, including SHAEXT; # (**) switch from ror to shrd stands for fair share of improvement; # (***) execution time is fully determined by remaining integer-only # part, body_00_15; reducing the amount of SIMD instructions # below certain limit makes no difference/sense; to conserve # space SHA256 XOP code path is therefore omitted; # # Modified from upstream OpenSSL to remove the XOP code. $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; # In upstream, this is controlled by shelling out to the compiler to check # versions, but BoringSSL is intended to be used with pre-generated perlasm # output, so this isn't useful anyway. $avx = 2; $shaext=0; $avx=1 if (!$shaext && $avx); open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; if ($output =~ /sha512-x86_64/) { $func="GFp_sha512_block_data_order"; $TABLE="K512"; $SZ=8; @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%rax","%rbx","%rcx","%rdx", "%r8", "%r9", "%r10","%r11"); ($T1,$a0,$a1,$a2,$a3)=("%r12","%r13","%r14","%r15","%rdi"); @Sigma0=(28,34,39); @Sigma1=(14,18,41); @sigma0=(1, 8, 7); @sigma1=(19,61, 6); $rounds=80; } else { $func="GFp_sha256_block_data_order"; $TABLE="K256"; $SZ=4; @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%eax","%ebx","%ecx","%edx", "%r8d","%r9d","%r10d","%r11d"); ($T1,$a0,$a1,$a2,$a3)=("%r12d","%r13d","%r14d","%r15d","%edi"); @Sigma0=( 2,13,22); @Sigma1=( 6,11,25); @sigma0=( 7,18, 3); @sigma1=(17,19,10); $rounds=64; } $ctx="%rdi"; # 1st arg, zapped by $a3 $inp="%rsi"; # 2nd arg $Tbl="%rbp"; $_ctx="16*$SZ+0*8(%rsp)"; $_inp="16*$SZ+1*8(%rsp)"; $_end="16*$SZ+2*8(%rsp)"; $_rsp="`16*$SZ+3*8`(%rsp)"; $framesz="16*$SZ+4*8"; sub ROUND_00_15() { my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; my $STRIDE=$SZ; $STRIDE += 16 if ($i%(16/$SZ)==(16/$SZ-1)); $code.=<<___; ror \$`$Sigma1[2]-$Sigma1[1]`,$a0 mov $f,$a2 xor $e,$a0 ror \$`$Sigma0[2]-$Sigma0[1]`,$a1 xor $g,$a2 # f^g mov $T1,`$SZ*($i&0xf)`(%rsp) xor $a,$a1 and $e,$a2 # (f^g)&e ror \$`$Sigma1[1]-$Sigma1[0]`,$a0 add $h,$T1 # T1+=h xor $g,$a2 # Ch(e,f,g)=((f^g)&e)^g ror \$`$Sigma0[1]-$Sigma0[0]`,$a1 xor $e,$a0 add $a2,$T1 # T1+=Ch(e,f,g) mov $a,$a2 add ($Tbl),$T1 # T1+=K[round] xor $a,$a1 xor $b,$a2 # a^b, b^c in next round ror \$$Sigma1[0],$a0 # Sigma1(e) mov $b,$h and $a2,$a3 ror \$$Sigma0[0],$a1 # Sigma0(a) add $a0,$T1 # T1+=Sigma1(e) xor $a3,$h # h=Maj(a,b,c)=Ch(a^b,c,b) add $T1,$d # d+=T1 add $T1,$h # h+=T1 lea $STRIDE($Tbl),$Tbl # round++ ___ $code.=<<___ if ($i<15); add $a1,$h # h+=Sigma0(a) ___ ($a2,$a3) = ($a3,$a2); } sub ROUND_16_XX() { my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; $code.=<<___; mov `$SZ*(($i+1)&0xf)`(%rsp),$a0 mov `$SZ*(($i+14)&0xf)`(%rsp),$a2 mov $a0,$T1 ror \$`$sigma0[1]-$sigma0[0]`,$a0 add $a1,$a # modulo-scheduled h+=Sigma0(a) mov $a2,$a1 ror \$`$sigma1[1]-$sigma1[0]`,$a2 xor $T1,$a0 shr \$$sigma0[2],$T1 ror \$$sigma0[0],$a0 xor $a1,$a2 shr \$$sigma1[2],$a1 ror \$$sigma1[0],$a2 xor $a0,$T1 # sigma0(X[(i+1)&0xf]) xor $a1,$a2 # sigma1(X[(i+14)&0xf]) add `$SZ*(($i+9)&0xf)`(%rsp),$T1 add `$SZ*($i&0xf)`(%rsp),$T1 mov $e,$a0 add $a2,$T1 mov $a,$a1 ___ &ROUND_00_15(@_); } $code=<<___; .text .extern GFp_ia32cap_P .globl $func .type $func,\@function,3 .align 16 $func: .cfi_startproc ___ $code.=<<___ if ($SZ==4 || $avx); leaq GFp_ia32cap_P(%rip),%r11 mov 0(%r11),%r9d mov 4(%r11),%r10d mov 8(%r11),%r11d ___ $code.=<<___ if ($SZ==4 && $shaext); test \$`1<<29`,%r11d # check for SHA jnz _shaext_shortcut ___ # XOP codepath removed. $code.=<<___ if ($avx>1); and \$`1<<8|1<<5|1<<3`,%r11d # check for BMI2+AVX2+BMI1 cmp \$`1<<8|1<<5|1<<3`,%r11d je .Lavx2_shortcut ___ $code.=<<___ if ($avx); and \$`1<<30`,%r9d # mask "Intel CPU" bit and \$`1<<28|1<<9`,%r10d # mask AVX and SSSE3 bits or %r9d,%r10d cmp \$`1<<28|1<<9|1<<30`,%r10d je .Lavx_shortcut ___ $code.=<<___ if ($SZ==4); test \$`1<<9`,%r10d jnz .Lssse3_shortcut ___ $code.=<<___; mov %rsp,%rax # copy %rsp .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 shl \$4,%rdx # num*16 sub \$$framesz,%rsp lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ and \$-64,%rsp # align stack frame mov $ctx,$_ctx # save ctx, 1st arg mov $inp,$_inp # save inp, 2nd arh mov %rdx,$_end # save end pointer, "3rd" arg mov %rax,$_rsp # save copy of %rsp .cfi_cfa_expression $_rsp,deref,+8 .Lprologue: mov $SZ*0($ctx),$A mov $SZ*1($ctx),$B mov $SZ*2($ctx),$C mov $SZ*3($ctx),$D mov $SZ*4($ctx),$E mov $SZ*5($ctx),$F mov $SZ*6($ctx),$G mov $SZ*7($ctx),$H jmp .Lloop .align 16 .Lloop: mov $B,$a3 lea $TABLE(%rip),$Tbl xor $C,$a3 # magic ___ for($i=0;$i<16;$i++) { $code.=" mov $SZ*$i($inp),$T1\n"; $code.=" mov @ROT[4],$a0\n"; $code.=" mov @ROT[0],$a1\n"; $code.=" bswap $T1\n"; &ROUND_00_15($i,@ROT); unshift(@ROT,pop(@ROT)); } $code.=<<___; jmp .Lrounds_16_xx .align 16 .Lrounds_16_xx: ___ for(;$i<32;$i++) { &ROUND_16_XX($i,@ROT); unshift(@ROT,pop(@ROT)); } $code.=<<___; cmpb \$0,`$SZ-1`($Tbl) jnz .Lrounds_16_xx mov $_ctx,$ctx add $a1,$A # modulo-scheduled h+=Sigma0(a) lea 16*$SZ($inp),$inp add $SZ*0($ctx),$A add $SZ*1($ctx),$B add $SZ*2($ctx),$C add $SZ*3($ctx),$D add $SZ*4($ctx),$E add $SZ*5($ctx),$F add $SZ*6($ctx),$G add $SZ*7($ctx),$H cmp $_end,$inp mov $A,$SZ*0($ctx) mov $B,$SZ*1($ctx) mov $C,$SZ*2($ctx) mov $D,$SZ*3($ctx) mov $E,$SZ*4($ctx) mov $F,$SZ*5($ctx) mov $G,$SZ*6($ctx) mov $H,$SZ*7($ctx) jb .Lloop mov $_rsp,%rsi .cfi_def_cfa %rsi,8 mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue: ret .cfi_endproc .size $func,.-$func ___ if ($SZ==4) { $code.=<<___; .align 64 .type $TABLE,\@object $TABLE: .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .asciz "SHA256 block transform for x86_64, CRYPTOGAMS by " ___ } else { $code.=<<___; .align 64 .type $TABLE,\@object $TABLE: .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .asciz "SHA512 block transform for x86_64, CRYPTOGAMS by " ___ } ###################################################################### # SIMD code paths # if ($SZ==4 && $shaext) {{{ ###################################################################### # Intel SHA Extensions implementation of SHA256 update function. # my ($ctx,$inp,$num,$Tbl)=("%rdi","%rsi","%rdx","%rcx"); my ($Wi,$ABEF,$CDGH,$TMP,$BSWAP,$ABEF_SAVE,$CDGH_SAVE)=map("%xmm$_",(0..2,7..10)); my @MSG=map("%xmm$_",(3..6)); $code.=<<___; .type GFp_sha256_block_data_order_shaext,\@function,3 .align 64 GFp_sha256_block_data_order_shaext: _shaext_shortcut: ___ $code.=<<___ if ($win64); lea `-8-5*16`(%rsp),%rsp movaps %xmm6,-8-5*16(%rax) movaps %xmm7,-8-4*16(%rax) movaps %xmm8,-8-3*16(%rax) movaps %xmm9,-8-2*16(%rax) movaps %xmm10,-8-1*16(%rax) .Lprologue_shaext: ___ $code.=<<___; lea K256+0x80(%rip),$Tbl movdqu ($ctx),$ABEF # DCBA movdqu 16($ctx),$CDGH # HGFE movdqa 0x200-0x80($Tbl),$TMP # byte swap mask pshufd \$0x1b,$ABEF,$Wi # ABCD pshufd \$0xb1,$ABEF,$ABEF # CDAB pshufd \$0x1b,$CDGH,$CDGH # EFGH movdqa $TMP,$BSWAP # offload palignr \$8,$CDGH,$ABEF # ABEF punpcklqdq $Wi,$CDGH # CDGH jmp .Loop_shaext .align 16 .Loop_shaext: movdqu ($inp),@MSG[0] movdqu 0x10($inp),@MSG[1] movdqu 0x20($inp),@MSG[2] pshufb $TMP,@MSG[0] movdqu 0x30($inp),@MSG[3] movdqa 0*32-0x80($Tbl),$Wi paddd @MSG[0],$Wi pshufb $TMP,@MSG[1] movdqa $CDGH,$CDGH_SAVE # offload sha256rnds2 $ABEF,$CDGH # 0-3 pshufd \$0x0e,$Wi,$Wi nop movdqa $ABEF,$ABEF_SAVE # offload sha256rnds2 $CDGH,$ABEF movdqa 1*32-0x80($Tbl),$Wi paddd @MSG[1],$Wi pshufb $TMP,@MSG[2] sha256rnds2 $ABEF,$CDGH # 4-7 pshufd \$0x0e,$Wi,$Wi lea 0x40($inp),$inp sha256msg1 @MSG[1],@MSG[0] sha256rnds2 $CDGH,$ABEF movdqa 2*32-0x80($Tbl),$Wi paddd @MSG[2],$Wi pshufb $TMP,@MSG[3] sha256rnds2 $ABEF,$CDGH # 8-11 pshufd \$0x0e,$Wi,$Wi movdqa @MSG[3],$TMP palignr \$4,@MSG[2],$TMP nop paddd $TMP,@MSG[0] sha256msg1 @MSG[2],@MSG[1] sha256rnds2 $CDGH,$ABEF movdqa 3*32-0x80($Tbl),$Wi paddd @MSG[3],$Wi sha256msg2 @MSG[3],@MSG[0] sha256rnds2 $ABEF,$CDGH # 12-15 pshufd \$0x0e,$Wi,$Wi movdqa @MSG[0],$TMP palignr \$4,@MSG[3],$TMP nop paddd $TMP,@MSG[1] sha256msg1 @MSG[3],@MSG[2] sha256rnds2 $CDGH,$ABEF ___ for($i=4;$i<16-3;$i++) { $code.=<<___; movdqa $i*32-0x80($Tbl),$Wi paddd @MSG[0],$Wi sha256msg2 @MSG[0],@MSG[1] sha256rnds2 $ABEF,$CDGH # 16-19... pshufd \$0x0e,$Wi,$Wi movdqa @MSG[1],$TMP palignr \$4,@MSG[0],$TMP nop paddd $TMP,@MSG[2] sha256msg1 @MSG[0],@MSG[3] sha256rnds2 $CDGH,$ABEF ___ push(@MSG,shift(@MSG)); } $code.=<<___; movdqa 13*32-0x80($Tbl),$Wi paddd @MSG[0],$Wi sha256msg2 @MSG[0],@MSG[1] sha256rnds2 $ABEF,$CDGH # 52-55 pshufd \$0x0e,$Wi,$Wi movdqa @MSG[1],$TMP palignr \$4,@MSG[0],$TMP sha256rnds2 $CDGH,$ABEF paddd $TMP,@MSG[2] movdqa 14*32-0x80($Tbl),$Wi paddd @MSG[1],$Wi sha256rnds2 $ABEF,$CDGH # 56-59 pshufd \$0x0e,$Wi,$Wi sha256msg2 @MSG[1],@MSG[2] movdqa $BSWAP,$TMP sha256rnds2 $CDGH,$ABEF movdqa 15*32-0x80($Tbl),$Wi paddd @MSG[2],$Wi nop sha256rnds2 $ABEF,$CDGH # 60-63 pshufd \$0x0e,$Wi,$Wi dec $num nop sha256rnds2 $CDGH,$ABEF paddd $CDGH_SAVE,$CDGH paddd $ABEF_SAVE,$ABEF jnz .Loop_shaext pshufd \$0xb1,$CDGH,$CDGH # DCHG pshufd \$0x1b,$ABEF,$TMP # FEBA pshufd \$0xb1,$ABEF,$ABEF # BAFE punpckhqdq $CDGH,$ABEF # DCBA palignr \$8,$TMP,$CDGH # HGFE movdqu $ABEF,($ctx) movdqu $CDGH,16($ctx) ___ $code.=<<___ if ($win64); movaps -8-5*16(%rax),%xmm6 movaps -8-4*16(%rax),%xmm7 movaps -8-3*16(%rax),%xmm8 movaps -8-2*16(%rax),%xmm9 movaps -8-1*16(%rax),%xmm10 mov %rax,%rsp .Lepilogue_shaext: ___ $code.=<<___; ret .size GFp_sha256_block_data_order_shaext,.-GFp_sha256_block_data_order_shaext ___ }}} {{{ my $a4=$T1; my ($a,$b,$c,$d,$e,$f,$g,$h); sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm { my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; my $arg = pop; $arg = "\$$arg" if ($arg*1 eq $arg); $code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n"; } sub body_00_15 () { ( '($a,$b,$c,$d,$e,$f,$g,$h)=@ROT;'. '&ror ($a0,$Sigma1[2]-$Sigma1[1])', '&mov ($a,$a1)', '&mov ($a4,$f)', '&ror ($a1,$Sigma0[2]-$Sigma0[1])', '&xor ($a0,$e)', '&xor ($a4,$g)', # f^g '&ror ($a0,$Sigma1[1]-$Sigma1[0])', '&xor ($a1,$a)', '&and ($a4,$e)', # (f^g)&e '&xor ($a0,$e)', '&add ($h,$SZ*($i&15)."(%rsp)")', # h+=X[i]+K[i] '&mov ($a2,$a)', '&xor ($a4,$g)', # Ch(e,f,g)=((f^g)&e)^g '&ror ($a1,$Sigma0[1]-$Sigma0[0])', '&xor ($a2,$b)', # a^b, b^c in next round '&add ($h,$a4)', # h+=Ch(e,f,g) '&ror ($a0,$Sigma1[0])', # Sigma1(e) '&and ($a3,$a2)', # (b^c)&(a^b) '&xor ($a1,$a)', '&add ($h,$a0)', # h+=Sigma1(e) '&xor ($a3,$b)', # Maj(a,b,c)=Ch(a^b,c,b) '&ror ($a1,$Sigma0[0])', # Sigma0(a) '&add ($d,$h)', # d+=h '&add ($h,$a3)', # h+=Maj(a,b,c) '&mov ($a0,$d)', '&add ($a1,$h);'. # h+=Sigma0(a) '($a2,$a3) = ($a3,$a2); unshift(@ROT,pop(@ROT)); $i++;' ); } ###################################################################### # SSSE3 code path # if ($SZ==4) { # SHA256 only my @X = map("%xmm$_",(0..3)); my ($t0,$t1,$t2,$t3, $t4,$t5) = map("%xmm$_",(4..9)); $code.=<<___; .type ${func}_ssse3,\@function,3 .align 64 ${func}_ssse3: .cfi_startproc .Lssse3_shortcut: mov %rsp,%rax # copy %rsp .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 shl \$4,%rdx # num*16 sub \$`$framesz+$win64*16*4`,%rsp lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ and \$-64,%rsp # align stack frame mov $ctx,$_ctx # save ctx, 1st arg mov $inp,$_inp # save inp, 2nd arh mov %rdx,$_end # save end pointer, "3rd" arg mov %rax,$_rsp # save copy of %rsp .cfi_cfa_expression $_rsp,deref,+8 ___ $code.=<<___ if ($win64); movaps %xmm6,16*$SZ+32(%rsp) movaps %xmm7,16*$SZ+48(%rsp) movaps %xmm8,16*$SZ+64(%rsp) movaps %xmm9,16*$SZ+80(%rsp) ___ $code.=<<___; .Lprologue_ssse3: mov $SZ*0($ctx),$A mov $SZ*1($ctx),$B mov $SZ*2($ctx),$C mov $SZ*3($ctx),$D mov $SZ*4($ctx),$E mov $SZ*5($ctx),$F mov $SZ*6($ctx),$G mov $SZ*7($ctx),$H ___ $code.=<<___; #movdqa $TABLE+`$SZ*2*$rounds`+32(%rip),$t4 #movdqa $TABLE+`$SZ*2*$rounds`+64(%rip),$t5 jmp .Lloop_ssse3 .align 16 .Lloop_ssse3: movdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 movdqu 0x00($inp),@X[0] movdqu 0x10($inp),@X[1] movdqu 0x20($inp),@X[2] pshufb $t3,@X[0] movdqu 0x30($inp),@X[3] lea $TABLE(%rip),$Tbl pshufb $t3,@X[1] movdqa 0x00($Tbl),$t0 movdqa 0x20($Tbl),$t1 pshufb $t3,@X[2] paddd @X[0],$t0 movdqa 0x40($Tbl),$t2 pshufb $t3,@X[3] movdqa 0x60($Tbl),$t3 paddd @X[1],$t1 paddd @X[2],$t2 paddd @X[3],$t3 movdqa $t0,0x00(%rsp) mov $A,$a1 movdqa $t1,0x10(%rsp) mov $B,$a3 movdqa $t2,0x20(%rsp) xor $C,$a3 # magic movdqa $t3,0x30(%rsp) mov $E,$a0 jmp .Lssse3_00_47 .align 16 .Lssse3_00_47: sub \$`-16*2*$SZ`,$Tbl # size optimization ___ sub Xupdate_256_SSSE3 () { ( '&movdqa ($t0,@X[1]);', '&movdqa ($t3,@X[3])', '&palignr ($t0,@X[0],$SZ)', # X[1..4] '&palignr ($t3,@X[2],$SZ);', # X[9..12] '&movdqa ($t1,$t0)', '&movdqa ($t2,$t0);', '&psrld ($t0,$sigma0[2])', '&paddd (@X[0],$t3);', # X[0..3] += X[9..12] '&psrld ($t2,$sigma0[0])', '&pshufd ($t3,@X[3],0b11111010)',# X[14..15] '&pslld ($t1,8*$SZ-$sigma0[1]);'. '&pxor ($t0,$t2)', '&psrld ($t2,$sigma0[1]-$sigma0[0]);'. '&pxor ($t0,$t1)', '&pslld ($t1,$sigma0[1]-$sigma0[0]);'. '&pxor ($t0,$t2);', '&movdqa ($t2,$t3)', '&pxor ($t0,$t1);', # sigma0(X[1..4]) '&psrld ($t3,$sigma1[2])', '&paddd (@X[0],$t0);', # X[0..3] += sigma0(X[1..4]) '&psrlq ($t2,$sigma1[0])', '&pxor ($t3,$t2);', '&psrlq ($t2,$sigma1[1]-$sigma1[0])', '&pxor ($t3,$t2)', '&pshufb ($t3,$t4)', # sigma1(X[14..15]) '&paddd (@X[0],$t3)', # X[0..1] += sigma1(X[14..15]) '&pshufd ($t3,@X[0],0b01010000)',# X[16..17] '&movdqa ($t2,$t3);', '&psrld ($t3,$sigma1[2])', '&psrlq ($t2,$sigma1[0])', '&pxor ($t3,$t2);', '&psrlq ($t2,$sigma1[1]-$sigma1[0])', '&pxor ($t3,$t2);', '&movdqa ($t2,16*2*$j."($Tbl)")', '&pshufb ($t3,$t5)', '&paddd (@X[0],$t3)' # X[2..3] += sigma1(X[16..17]) ); } sub SSSE3_256_00_47 () { my $j = shift; my $body = shift; my @X = @_; my @insns = (&$body,&$body,&$body,&$body); # 104 instructions if (0) { foreach (Xupdate_256_SSSE3()) { # 36 instructions eval; eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); } } else { # squeeze extra 4% on Westmere and 19% on Atom eval(shift(@insns)); #@ &movdqa ($t0,@X[1]); eval(shift(@insns)); eval(shift(@insns)); &movdqa ($t3,@X[3]); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ eval(shift(@insns)); &palignr ($t0,@X[0],$SZ); # X[1..4] eval(shift(@insns)); eval(shift(@insns)); &palignr ($t3,@X[2],$SZ); # X[9..12] eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ &movdqa ($t1,$t0); eval(shift(@insns)); eval(shift(@insns)); &movdqa ($t2,$t0); eval(shift(@insns)); #@ eval(shift(@insns)); &psrld ($t0,$sigma0[2]); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &paddd (@X[0],$t3); # X[0..3] += X[9..12] eval(shift(@insns)); #@ eval(shift(@insns)); &psrld ($t2,$sigma0[0]); eval(shift(@insns)); eval(shift(@insns)); &pshufd ($t3,@X[3],0b11111010); # X[4..15] eval(shift(@insns)); eval(shift(@insns)); #@ &pslld ($t1,8*$SZ-$sigma0[1]); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t0,$t2); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ &psrld ($t2,$sigma0[1]-$sigma0[0]); eval(shift(@insns)); &pxor ($t0,$t1); eval(shift(@insns)); eval(shift(@insns)); &pslld ($t1,$sigma0[1]-$sigma0[0]); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t0,$t2); eval(shift(@insns)); eval(shift(@insns)); #@ &movdqa ($t2,$t3); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t0,$t1); # sigma0(X[1..4]) eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); &psrld ($t3,$sigma1[2]); eval(shift(@insns)); eval(shift(@insns)); &paddd (@X[0],$t0); # X[0..3] += sigma0(X[1..4]) eval(shift(@insns)); #@ eval(shift(@insns)); &psrlq ($t2,$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t3,$t2); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ &psrlq ($t2,$sigma1[1]-$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t3,$t2); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); #&pshufb ($t3,$t4); # sigma1(X[14..15]) &pshufd ($t3,$t3,0b10000000); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &psrldq ($t3,8); eval(shift(@insns)); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ &paddd (@X[0],$t3); # X[0..1] += sigma1(X[14..15]) eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &pshufd ($t3,@X[0],0b01010000); # X[16..17] eval(shift(@insns)); eval(shift(@insns)); #@ eval(shift(@insns)); &movdqa ($t2,$t3); eval(shift(@insns)); eval(shift(@insns)); &psrld ($t3,$sigma1[2]); eval(shift(@insns)); eval(shift(@insns)); #@ &psrlq ($t2,$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t3,$t2); eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ eval(shift(@insns)); &psrlq ($t2,$sigma1[1]-$sigma1[0]); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &pxor ($t3,$t2); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); #@ #&pshufb ($t3,$t5); &pshufd ($t3,$t3,0b00001000); eval(shift(@insns)); eval(shift(@insns)); &movdqa ($t2,16*2*$j."($Tbl)"); eval(shift(@insns)); #@ eval(shift(@insns)); &pslldq ($t3,8); eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); &paddd (@X[0],$t3); # X[2..3] += sigma1(X[16..17]) eval(shift(@insns)); #@ eval(shift(@insns)); eval(shift(@insns)); } &paddd ($t2,@X[0]); foreach (@insns) { eval; } # remaining instructions &movdqa (16*$j."(%rsp)",$t2); } for ($i=0,$j=0; $j<4; $j++) { &SSSE3_256_00_47($j,\&body_00_15,@X); push(@X,shift(@X)); # rotate(@X) } &cmpb ($SZ-1+16*2*$SZ."($Tbl)",0); &jne (".Lssse3_00_47"); for ($i=0; $i<16; ) { foreach(body_00_15()) { eval; } } $code.=<<___; mov $_ctx,$ctx mov $a1,$A add $SZ*0($ctx),$A lea 16*$SZ($inp),$inp add $SZ*1($ctx),$B add $SZ*2($ctx),$C add $SZ*3($ctx),$D add $SZ*4($ctx),$E add $SZ*5($ctx),$F add $SZ*6($ctx),$G add $SZ*7($ctx),$H cmp $_end,$inp mov $A,$SZ*0($ctx) mov $B,$SZ*1($ctx) mov $C,$SZ*2($ctx) mov $D,$SZ*3($ctx) mov $E,$SZ*4($ctx) mov $F,$SZ*5($ctx) mov $G,$SZ*6($ctx) mov $H,$SZ*7($ctx) jb .Lloop_ssse3 mov $_rsp,%rsi .cfi_def_cfa %rsi,8 ___ $code.=<<___ if ($win64); movaps 16*$SZ+32(%rsp),%xmm6 movaps 16*$SZ+48(%rsp),%xmm7 movaps 16*$SZ+64(%rsp),%xmm8 movaps 16*$SZ+80(%rsp),%xmm9 ___ $code.=<<___; mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_ssse3: ret .cfi_endproc .size ${func}_ssse3,.-${func}_ssse3 ___ } if ($avx) {{ ###################################################################### # AVX+shrd code path # local *ror = sub { &shrd(@_[0],@_) }; $code.=<<___; .type ${func}_avx,\@function,3 .align 64 ${func}_avx: .cfi_startproc .Lavx_shortcut: mov %rsp,%rax # copy %rsp .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 shl \$4,%rdx # num*16 sub \$`$framesz+$win64*16*($SZ==4?4:6)`,%rsp lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ and \$-64,%rsp # align stack frame mov $ctx,$_ctx # save ctx, 1st arg mov $inp,$_inp # save inp, 2nd arh mov %rdx,$_end # save end pointer, "3rd" arg mov %rax,$_rsp # save copy of %rsp .cfi_cfa_expression $_rsp,deref,+8 ___ $code.=<<___ if ($win64); movaps %xmm6,16*$SZ+32(%rsp) movaps %xmm7,16*$SZ+48(%rsp) movaps %xmm8,16*$SZ+64(%rsp) movaps %xmm9,16*$SZ+80(%rsp) ___ $code.=<<___ if ($win64 && $SZ>4); movaps %xmm10,16*$SZ+96(%rsp) movaps %xmm11,16*$SZ+112(%rsp) ___ $code.=<<___; .Lprologue_avx: vzeroupper mov $SZ*0($ctx),$A mov $SZ*1($ctx),$B mov $SZ*2($ctx),$C mov $SZ*3($ctx),$D mov $SZ*4($ctx),$E mov $SZ*5($ctx),$F mov $SZ*6($ctx),$G mov $SZ*7($ctx),$H ___ if ($SZ==4) { # SHA256 my @X = map("%xmm$_",(0..3)); my ($t0,$t1,$t2,$t3, $t4,$t5) = map("%xmm$_",(4..9)); $code.=<<___; vmovdqa $TABLE+`$SZ*2*$rounds`+32(%rip),$t4 vmovdqa $TABLE+`$SZ*2*$rounds`+64(%rip),$t5 jmp .Lloop_avx .align 16 .Lloop_avx: vmovdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 vmovdqu 0x00($inp),@X[0] vmovdqu 0x10($inp),@X[1] vmovdqu 0x20($inp),@X[2] vmovdqu 0x30($inp),@X[3] vpshufb $t3,@X[0],@X[0] lea $TABLE(%rip),$Tbl vpshufb $t3,@X[1],@X[1] vpshufb $t3,@X[2],@X[2] vpaddd 0x00($Tbl),@X[0],$t0 vpshufb $t3,@X[3],@X[3] vpaddd 0x20($Tbl),@X[1],$t1 vpaddd 0x40($Tbl),@X[2],$t2 vpaddd 0x60($Tbl),@X[3],$t3 vmovdqa $t0,0x00(%rsp) mov $A,$a1 vmovdqa $t1,0x10(%rsp) mov $B,$a3 vmovdqa $t2,0x20(%rsp) xor $C,$a3 # magic vmovdqa $t3,0x30(%rsp) mov $E,$a0 jmp .Lavx_00_47 .align 16 .Lavx_00_47: sub \$`-16*2*$SZ`,$Tbl # size optimization ___ sub Xupdate_256_AVX () { ( '&vpalignr ($t0,@X[1],@X[0],$SZ)', # X[1..4] '&vpalignr ($t3,@X[3],@X[2],$SZ)', # X[9..12] '&vpsrld ($t2,$t0,$sigma0[0]);', '&vpaddd (@X[0],@X[0],$t3)', # X[0..3] += X[9..12] '&vpsrld ($t3,$t0,$sigma0[2])', '&vpslld ($t1,$t0,8*$SZ-$sigma0[1]);', '&vpxor ($t0,$t3,$t2)', '&vpshufd ($t3,@X[3],0b11111010)',# X[14..15] '&vpsrld ($t2,$t2,$sigma0[1]-$sigma0[0]);', '&vpxor ($t0,$t0,$t1)', '&vpslld ($t1,$t1,$sigma0[1]-$sigma0[0]);', '&vpxor ($t0,$t0,$t2)', '&vpsrld ($t2,$t3,$sigma1[2]);', '&vpxor ($t0,$t0,$t1)', # sigma0(X[1..4]) '&vpsrlq ($t3,$t3,$sigma1[0]);', '&vpaddd (@X[0],@X[0],$t0)', # X[0..3] += sigma0(X[1..4]) '&vpxor ($t2,$t2,$t3);', '&vpsrlq ($t3,$t3,$sigma1[1]-$sigma1[0])', '&vpxor ($t2,$t2,$t3)', '&vpshufb ($t2,$t2,$t4)', # sigma1(X[14..15]) '&vpaddd (@X[0],@X[0],$t2)', # X[0..1] += sigma1(X[14..15]) '&vpshufd ($t3,@X[0],0b01010000)',# X[16..17] '&vpsrld ($t2,$t3,$sigma1[2])', '&vpsrlq ($t3,$t3,$sigma1[0])', '&vpxor ($t2,$t2,$t3);', '&vpsrlq ($t3,$t3,$sigma1[1]-$sigma1[0])', '&vpxor ($t2,$t2,$t3)', '&vpshufb ($t2,$t2,$t5)', '&vpaddd (@X[0],@X[0],$t2)' # X[2..3] += sigma1(X[16..17]) ); } sub AVX_256_00_47 () { my $j = shift; my $body = shift; my @X = @_; my @insns = (&$body,&$body,&$body,&$body); # 104 instructions foreach (Xupdate_256_AVX()) { # 29 instructions eval; eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); } &vpaddd ($t2,@X[0],16*2*$j."($Tbl)"); foreach (@insns) { eval; } # remaining instructions &vmovdqa (16*$j."(%rsp)",$t2); } for ($i=0,$j=0; $j<4; $j++) { &AVX_256_00_47($j,\&body_00_15,@X); push(@X,shift(@X)); # rotate(@X) } &cmpb ($SZ-1+16*2*$SZ."($Tbl)",0); &jne (".Lavx_00_47"); for ($i=0; $i<16; ) { foreach(body_00_15()) { eval; } } } else { # SHA512 my @X = map("%xmm$_",(0..7)); my ($t0,$t1,$t2,$t3) = map("%xmm$_",(8..11)); $code.=<<___; jmp .Lloop_avx .align 16 .Lloop_avx: vmovdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 vmovdqu 0x00($inp),@X[0] lea $TABLE+0x80(%rip),$Tbl # size optimization vmovdqu 0x10($inp),@X[1] vmovdqu 0x20($inp),@X[2] vpshufb $t3,@X[0],@X[0] vmovdqu 0x30($inp),@X[3] vpshufb $t3,@X[1],@X[1] vmovdqu 0x40($inp),@X[4] vpshufb $t3,@X[2],@X[2] vmovdqu 0x50($inp),@X[5] vpshufb $t3,@X[3],@X[3] vmovdqu 0x60($inp),@X[6] vpshufb $t3,@X[4],@X[4] vmovdqu 0x70($inp),@X[7] vpshufb $t3,@X[5],@X[5] vpaddq -0x80($Tbl),@X[0],$t0 vpshufb $t3,@X[6],@X[6] vpaddq -0x60($Tbl),@X[1],$t1 vpshufb $t3,@X[7],@X[7] vpaddq -0x40($Tbl),@X[2],$t2 vpaddq -0x20($Tbl),@X[3],$t3 vmovdqa $t0,0x00(%rsp) vpaddq 0x00($Tbl),@X[4],$t0 vmovdqa $t1,0x10(%rsp) vpaddq 0x20($Tbl),@X[5],$t1 vmovdqa $t2,0x20(%rsp) vpaddq 0x40($Tbl),@X[6],$t2 vmovdqa $t3,0x30(%rsp) vpaddq 0x60($Tbl),@X[7],$t3 vmovdqa $t0,0x40(%rsp) mov $A,$a1 vmovdqa $t1,0x50(%rsp) mov $B,$a3 vmovdqa $t2,0x60(%rsp) xor $C,$a3 # magic vmovdqa $t3,0x70(%rsp) mov $E,$a0 jmp .Lavx_00_47 .align 16 .Lavx_00_47: add \$`16*2*$SZ`,$Tbl ___ sub Xupdate_512_AVX () { ( '&vpalignr ($t0,@X[1],@X[0],$SZ)', # X[1..2] '&vpalignr ($t3,@X[5],@X[4],$SZ)', # X[9..10] '&vpsrlq ($t2,$t0,$sigma0[0])', '&vpaddq (@X[0],@X[0],$t3);', # X[0..1] += X[9..10] '&vpsrlq ($t3,$t0,$sigma0[2])', '&vpsllq ($t1,$t0,8*$SZ-$sigma0[1]);', '&vpxor ($t0,$t3,$t2)', '&vpsrlq ($t2,$t2,$sigma0[1]-$sigma0[0]);', '&vpxor ($t0,$t0,$t1)', '&vpsllq ($t1,$t1,$sigma0[1]-$sigma0[0]);', '&vpxor ($t0,$t0,$t2)', '&vpsrlq ($t3,@X[7],$sigma1[2]);', '&vpxor ($t0,$t0,$t1)', # sigma0(X[1..2]) '&vpsllq ($t2,@X[7],8*$SZ-$sigma1[1]);', '&vpaddq (@X[0],@X[0],$t0)', # X[0..1] += sigma0(X[1..2]) '&vpsrlq ($t1,@X[7],$sigma1[0]);', '&vpxor ($t3,$t3,$t2)', '&vpsllq ($t2,$t2,$sigma1[1]-$sigma1[0]);', '&vpxor ($t3,$t3,$t1)', '&vpsrlq ($t1,$t1,$sigma1[1]-$sigma1[0]);', '&vpxor ($t3,$t3,$t2)', '&vpxor ($t3,$t3,$t1)', # sigma1(X[14..15]) '&vpaddq (@X[0],@X[0],$t3)', # X[0..1] += sigma1(X[14..15]) ); } sub AVX_512_00_47 () { my $j = shift; my $body = shift; my @X = @_; my @insns = (&$body,&$body); # 52 instructions foreach (Xupdate_512_AVX()) { # 23 instructions eval; eval(shift(@insns)); eval(shift(@insns)); } &vpaddq ($t2,@X[0],16*2*$j-0x80."($Tbl)"); foreach (@insns) { eval; } # remaining instructions &vmovdqa (16*$j."(%rsp)",$t2); } for ($i=0,$j=0; $j<8; $j++) { &AVX_512_00_47($j,\&body_00_15,@X); push(@X,shift(@X)); # rotate(@X) } &cmpb ($SZ-1+16*2*$SZ-0x80."($Tbl)",0); &jne (".Lavx_00_47"); for ($i=0; $i<16; ) { foreach(body_00_15()) { eval; } } } $code.=<<___; mov $_ctx,$ctx mov $a1,$A add $SZ*0($ctx),$A lea 16*$SZ($inp),$inp add $SZ*1($ctx),$B add $SZ*2($ctx),$C add $SZ*3($ctx),$D add $SZ*4($ctx),$E add $SZ*5($ctx),$F add $SZ*6($ctx),$G add $SZ*7($ctx),$H cmp $_end,$inp mov $A,$SZ*0($ctx) mov $B,$SZ*1($ctx) mov $C,$SZ*2($ctx) mov $D,$SZ*3($ctx) mov $E,$SZ*4($ctx) mov $F,$SZ*5($ctx) mov $G,$SZ*6($ctx) mov $H,$SZ*7($ctx) jb .Lloop_avx mov $_rsp,%rsi .cfi_def_cfa %rsi,8 vzeroupper ___ $code.=<<___ if ($win64); movaps 16*$SZ+32(%rsp),%xmm6 movaps 16*$SZ+48(%rsp),%xmm7 movaps 16*$SZ+64(%rsp),%xmm8 movaps 16*$SZ+80(%rsp),%xmm9 ___ $code.=<<___ if ($win64 && $SZ>4); movaps 16*$SZ+96(%rsp),%xmm10 movaps 16*$SZ+112(%rsp),%xmm11 ___ $code.=<<___; mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_avx: ret .cfi_endproc .size ${func}_avx,.-${func}_avx ___ if ($avx>1) {{ ###################################################################### # AVX2+BMI code path # my $a5=$SZ==4?"%esi":"%rsi"; # zap $inp my $PUSH8=8*2*$SZ; use integer; sub bodyx_00_15 () { # at start $a1 should be zero, $a3 - $b^$c and $a4 copy of $f ( '($a,$b,$c,$d,$e,$f,$g,$h)=@ROT;'. '&add ($h,(32*($i/(16/$SZ))+$SZ*($i%(16/$SZ)))%$PUSH8.$base)', # h+=X[i]+K[i] '&and ($a4,$e)', # f&e '&rorx ($a0,$e,$Sigma1[2])', '&rorx ($a2,$e,$Sigma1[1])', '&lea ($a,"($a,$a1)")', # h+=Sigma0(a) from the past '&lea ($h,"($h,$a4)")', '&andn ($a4,$e,$g)', # ~e&g '&xor ($a0,$a2)', '&rorx ($a1,$e,$Sigma1[0])', '&lea ($h,"($h,$a4)")', # h+=Ch(e,f,g)=(e&f)+(~e&g) '&xor ($a0,$a1)', # Sigma1(e) '&mov ($a2,$a)', '&rorx ($a4,$a,$Sigma0[2])', '&lea ($h,"($h,$a0)")', # h+=Sigma1(e) '&xor ($a2,$b)', # a^b, b^c in next round '&rorx ($a1,$a,$Sigma0[1])', '&rorx ($a0,$a,$Sigma0[0])', '&lea ($d,"($d,$h)")', # d+=h '&and ($a3,$a2)', # (b^c)&(a^b) '&xor ($a1,$a4)', '&xor ($a3,$b)', # Maj(a,b,c)=Ch(a^b,c,b) '&xor ($a1,$a0)', # Sigma0(a) '&lea ($h,"($h,$a3)");'. # h+=Maj(a,b,c) '&mov ($a4,$e)', # copy of f in future '($a2,$a3) = ($a3,$a2); unshift(@ROT,pop(@ROT)); $i++;' ); # and at the finish one has to $a+=$a1 } $code.=<<___; .type ${func}_avx2,\@function,3 .align 64 ${func}_avx2: .cfi_startproc .Lavx2_shortcut: mov %rsp,%rax # copy %rsp .cfi_def_cfa_register %rax push %rbx .cfi_push %rbx push %rbp .cfi_push %rbp push %r12 .cfi_push %r12 push %r13 .cfi_push %r13 push %r14 .cfi_push %r14 push %r15 .cfi_push %r15 sub \$`2*$SZ*$rounds+4*8+$win64*16*($SZ==4?4:6)`,%rsp shl \$4,%rdx # num*16 and \$-256*$SZ,%rsp # align stack frame lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ add \$`2*$SZ*($rounds-8)`,%rsp mov $ctx,$_ctx # save ctx, 1st arg mov $inp,$_inp # save inp, 2nd arh mov %rdx,$_end # save end pointer, "3rd" arg mov %rax,$_rsp # save copy of %rsp .cfi_cfa_expression $_rsp,deref,+8 ___ $code.=<<___ if ($win64); movaps %xmm6,16*$SZ+32(%rsp) movaps %xmm7,16*$SZ+48(%rsp) movaps %xmm8,16*$SZ+64(%rsp) movaps %xmm9,16*$SZ+80(%rsp) ___ $code.=<<___ if ($win64 && $SZ>4); movaps %xmm10,16*$SZ+96(%rsp) movaps %xmm11,16*$SZ+112(%rsp) ___ $code.=<<___; .Lprologue_avx2: vzeroupper sub \$-16*$SZ,$inp # inp++, size optimization mov $SZ*0($ctx),$A mov $inp,%r12 # borrow $T1 mov $SZ*1($ctx),$B cmp %rdx,$inp # $_end mov $SZ*2($ctx),$C cmove %rsp,%r12 # next block or random data mov $SZ*3($ctx),$D mov $SZ*4($ctx),$E mov $SZ*5($ctx),$F mov $SZ*6($ctx),$G mov $SZ*7($ctx),$H ___ if ($SZ==4) { # SHA256 my @X = map("%ymm$_",(0..3)); my ($t0,$t1,$t2,$t3, $t4,$t5) = map("%ymm$_",(4..9)); $code.=<<___; vmovdqa $TABLE+`$SZ*2*$rounds`+32(%rip),$t4 vmovdqa $TABLE+`$SZ*2*$rounds`+64(%rip),$t5 jmp .Loop_avx2 .align 16 .Loop_avx2: vmovdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 vmovdqu -16*$SZ+0($inp),%xmm0 vmovdqu -16*$SZ+16($inp),%xmm1 vmovdqu -16*$SZ+32($inp),%xmm2 vmovdqu -16*$SZ+48($inp),%xmm3 #mov $inp,$_inp # offload $inp vinserti128 \$1,(%r12),@X[0],@X[0] vinserti128 \$1,16(%r12),@X[1],@X[1] vpshufb $t3,@X[0],@X[0] vinserti128 \$1,32(%r12),@X[2],@X[2] vpshufb $t3,@X[1],@X[1] vinserti128 \$1,48(%r12),@X[3],@X[3] lea $TABLE(%rip),$Tbl vpshufb $t3,@X[2],@X[2] vpaddd 0x00($Tbl),@X[0],$t0 vpshufb $t3,@X[3],@X[3] vpaddd 0x20($Tbl),@X[1],$t1 vpaddd 0x40($Tbl),@X[2],$t2 vpaddd 0x60($Tbl),@X[3],$t3 vmovdqa $t0,0x00(%rsp) xor $a1,$a1 vmovdqa $t1,0x20(%rsp) lea -$PUSH8(%rsp),%rsp mov $B,$a3 vmovdqa $t2,0x00(%rsp) xor $C,$a3 # magic vmovdqa $t3,0x20(%rsp) mov $F,$a4 sub \$-16*2*$SZ,$Tbl # size optimization jmp .Lavx2_00_47 .align 16 .Lavx2_00_47: ___ sub AVX2_256_00_47 () { my $j = shift; my $body = shift; my @X = @_; my @insns = (&$body,&$body,&$body,&$body); # 96 instructions my $base = "+2*$PUSH8(%rsp)"; &lea ("%rsp","-$PUSH8(%rsp)") if (($j%2)==0); foreach (Xupdate_256_AVX()) { # 29 instructions eval; eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); } &vpaddd ($t2,@X[0],16*2*$j."($Tbl)"); foreach (@insns) { eval; } # remaining instructions &vmovdqa ((32*$j)%$PUSH8."(%rsp)",$t2); } for ($i=0,$j=0; $j<4; $j++) { &AVX2_256_00_47($j,\&bodyx_00_15,@X); push(@X,shift(@X)); # rotate(@X) } &lea ($Tbl,16*2*$SZ."($Tbl)"); &cmpb (($SZ-1)."($Tbl)",0); &jne (".Lavx2_00_47"); for ($i=0; $i<16; ) { my $base=$i<8?"+$PUSH8(%rsp)":"(%rsp)"; foreach(bodyx_00_15()) { eval; } } } else { # SHA512 my @X = map("%ymm$_",(0..7)); my ($t0,$t1,$t2,$t3) = map("%ymm$_",(8..11)); $code.=<<___; jmp .Loop_avx2 .align 16 .Loop_avx2: vmovdqu -16*$SZ($inp),%xmm0 vmovdqu -16*$SZ+16($inp),%xmm1 vmovdqu -16*$SZ+32($inp),%xmm2 lea $TABLE+0x80(%rip),$Tbl # size optimization vmovdqu -16*$SZ+48($inp),%xmm3 vmovdqu -16*$SZ+64($inp),%xmm4 vmovdqu -16*$SZ+80($inp),%xmm5 vmovdqu -16*$SZ+96($inp),%xmm6 vmovdqu -16*$SZ+112($inp),%xmm7 #mov $inp,$_inp # offload $inp vmovdqa `$SZ*2*$rounds-0x80`($Tbl),$t2 vinserti128 \$1,(%r12),@X[0],@X[0] vinserti128 \$1,16(%r12),@X[1],@X[1] vpshufb $t2,@X[0],@X[0] vinserti128 \$1,32(%r12),@X[2],@X[2] vpshufb $t2,@X[1],@X[1] vinserti128 \$1,48(%r12),@X[3],@X[3] vpshufb $t2,@X[2],@X[2] vinserti128 \$1,64(%r12),@X[4],@X[4] vpshufb $t2,@X[3],@X[3] vinserti128 \$1,80(%r12),@X[5],@X[5] vpshufb $t2,@X[4],@X[4] vinserti128 \$1,96(%r12),@X[6],@X[6] vpshufb $t2,@X[5],@X[5] vinserti128 \$1,112(%r12),@X[7],@X[7] vpaddq -0x80($Tbl),@X[0],$t0 vpshufb $t2,@X[6],@X[6] vpaddq -0x60($Tbl),@X[1],$t1 vpshufb $t2,@X[7],@X[7] vpaddq -0x40($Tbl),@X[2],$t2 vpaddq -0x20($Tbl),@X[3],$t3 vmovdqa $t0,0x00(%rsp) vpaddq 0x00($Tbl),@X[4],$t0 vmovdqa $t1,0x20(%rsp) vpaddq 0x20($Tbl),@X[5],$t1 vmovdqa $t2,0x40(%rsp) vpaddq 0x40($Tbl),@X[6],$t2 vmovdqa $t3,0x60(%rsp) lea -$PUSH8(%rsp),%rsp vpaddq 0x60($Tbl),@X[7],$t3 vmovdqa $t0,0x00(%rsp) xor $a1,$a1 vmovdqa $t1,0x20(%rsp) mov $B,$a3 vmovdqa $t2,0x40(%rsp) xor $C,$a3 # magic vmovdqa $t3,0x60(%rsp) mov $F,$a4 add \$16*2*$SZ,$Tbl jmp .Lavx2_00_47 .align 16 .Lavx2_00_47: ___ sub AVX2_512_00_47 () { my $j = shift; my $body = shift; my @X = @_; my @insns = (&$body,&$body); # 48 instructions my $base = "+2*$PUSH8(%rsp)"; &lea ("%rsp","-$PUSH8(%rsp)") if (($j%4)==0); foreach (Xupdate_512_AVX()) { # 23 instructions eval; if ($_ !~ /\;$/) { eval(shift(@insns)); eval(shift(@insns)); eval(shift(@insns)); } } &vpaddq ($t2,@X[0],16*2*$j-0x80."($Tbl)"); foreach (@insns) { eval; } # remaining instructions &vmovdqa ((32*$j)%$PUSH8."(%rsp)",$t2); } for ($i=0,$j=0; $j<8; $j++) { &AVX2_512_00_47($j,\&bodyx_00_15,@X); push(@X,shift(@X)); # rotate(@X) } &lea ($Tbl,16*2*$SZ."($Tbl)"); &cmpb (($SZ-1-0x80)."($Tbl)",0); &jne (".Lavx2_00_47"); for ($i=0; $i<16; ) { my $base=$i<8?"+$PUSH8(%rsp)":"(%rsp)"; foreach(bodyx_00_15()) { eval; } } } $code.=<<___; mov `2*$SZ*$rounds`(%rsp),$ctx # $_ctx add $a1,$A #mov `2*$SZ*$rounds+8`(%rsp),$inp # $_inp lea `2*$SZ*($rounds-8)`(%rsp),$Tbl add $SZ*0($ctx),$A add $SZ*1($ctx),$B add $SZ*2($ctx),$C add $SZ*3($ctx),$D add $SZ*4($ctx),$E add $SZ*5($ctx),$F add $SZ*6($ctx),$G add $SZ*7($ctx),$H mov $A,$SZ*0($ctx) mov $B,$SZ*1($ctx) mov $C,$SZ*2($ctx) mov $D,$SZ*3($ctx) mov $E,$SZ*4($ctx) mov $F,$SZ*5($ctx) mov $G,$SZ*6($ctx) mov $H,$SZ*7($ctx) cmp `$PUSH8+2*8`($Tbl),$inp # $_end je .Ldone_avx2 xor $a1,$a1 mov $B,$a3 xor $C,$a3 # magic mov $F,$a4 jmp .Lower_avx2 .align 16 .Lower_avx2: ___ for ($i=0; $i<8; ) { my $base="+16($Tbl)"; foreach(bodyx_00_15()) { eval; } } $code.=<<___; lea -$PUSH8($Tbl),$Tbl cmp %rsp,$Tbl jae .Lower_avx2 mov `2*$SZ*$rounds`(%rsp),$ctx # $_ctx add $a1,$A #mov `2*$SZ*$rounds+8`(%rsp),$inp # $_inp lea `2*$SZ*($rounds-8)`(%rsp),%rsp add $SZ*0($ctx),$A add $SZ*1($ctx),$B add $SZ*2($ctx),$C add $SZ*3($ctx),$D add $SZ*4($ctx),$E add $SZ*5($ctx),$F lea `2*16*$SZ`($inp),$inp # inp+=2 add $SZ*6($ctx),$G mov $inp,%r12 add $SZ*7($ctx),$H cmp $_end,$inp mov $A,$SZ*0($ctx) cmove %rsp,%r12 # next block or stale data mov $B,$SZ*1($ctx) mov $C,$SZ*2($ctx) mov $D,$SZ*3($ctx) mov $E,$SZ*4($ctx) mov $F,$SZ*5($ctx) mov $G,$SZ*6($ctx) mov $H,$SZ*7($ctx) jbe .Loop_avx2 lea (%rsp),$Tbl .Ldone_avx2: lea ($Tbl),%rsp mov $_rsp,%rsi .cfi_def_cfa %rsi,8 vzeroupper ___ $code.=<<___ if ($win64); movaps 16*$SZ+32(%rsp),%xmm6 movaps 16*$SZ+48(%rsp),%xmm7 movaps 16*$SZ+64(%rsp),%xmm8 movaps 16*$SZ+80(%rsp),%xmm9 ___ $code.=<<___ if ($win64 && $SZ>4); movaps 16*$SZ+96(%rsp),%xmm10 movaps 16*$SZ+112(%rsp),%xmm11 ___ $code.=<<___; mov -48(%rsi),%r15 .cfi_restore %r15 mov -40(%rsi),%r14 .cfi_restore %r14 mov -32(%rsi),%r13 .cfi_restore %r13 mov -24(%rsi),%r12 .cfi_restore %r12 mov -16(%rsi),%rbp .cfi_restore %rbp mov -8(%rsi),%rbx .cfi_restore %rbx lea (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_avx2: ret .cfi_endproc .size ${func}_avx2,.-${func}_avx2 ___ }} }}}}} # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type se_handler,\@abi-omnipotent .align 16 se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HanderlData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lin_prologue ___ $code.=<<___ if ($avx>1); lea .Lavx2_shortcut(%rip),%r10 cmp %r10,%rbx # context->RipRbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R15 lea .Lepilogue(%rip),%r10 cmp %r10,%rbx jb .Lin_prologue # non-AVX code lea 16*$SZ+4*8(%rsi),%rsi # Xmm6- save area lea 512($context),%rdi # &context.Xmm6 mov \$`$SZ==4?8:12`,%ecx .long 0xa548f3fc # cld; rep movsq .Lin_prologue: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size se_handler,.-se_handler ___ $code.=<<___ if ($SZ==4 && $shaext); .type shaext_handler,\@abi-omnipotent .align 16 shaext_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip lea .Lprologue_shaext(%rip),%r10 cmp %r10,%rbx # context->Rip<.Lprologue jb .Lin_prologue lea .Lepilogue_shaext(%rip),%r10 cmp %r10,%rbx # context->Rip>=.Lepilogue jae .Lin_prologue lea -8-5*16(%rax),%rsi lea 512($context),%rdi # &context.Xmm6 mov \$10,%ecx .long 0xa548f3fc # cld; rep movsq jmp .Lin_prologue .size shaext_handler,.-shaext_handler ___ $code.=<<___; .section .pdata .align 4 .rva .LSEH_begin_$func .rva .LSEH_end_$func .rva .LSEH_info_$func ___ $code.=<<___ if ($SZ==4 && $shaext); .rva .LSEH_begin_${func}_shaext .rva .LSEH_end_${func}_shaext .rva .LSEH_info_${func}_shaext ___ $code.=<<___ if ($SZ==4); .rva .LSEH_begin_${func}_ssse3 .rva .LSEH_end_${func}_ssse3 .rva .LSEH_info_${func}_ssse3 ___ $code.=<<___ if ($avx); .rva .LSEH_begin_${func}_avx .rva .LSEH_end_${func}_avx .rva .LSEH_info_${func}_avx ___ $code.=<<___ if ($avx>1); .rva .LSEH_begin_${func}_avx2 .rva .LSEH_end_${func}_avx2 .rva .LSEH_info_${func}_avx2 ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_$func: .byte 9,0,0,0 .rva se_handler .rva .Lprologue,.Lepilogue # HandlerData[] ___ $code.=<<___ if ($SZ==4 && $shaext); .LSEH_info_${func}_shaext: .byte 9,0,0,0 .rva shaext_handler ___ $code.=<<___ if ($SZ==4); .LSEH_info_${func}_ssse3: .byte 9,0,0,0 .rva se_handler .rva .Lprologue_ssse3,.Lepilogue_ssse3 # HandlerData[] ___ $code.=<<___ if ($avx); .LSEH_info_${func}_avx: .byte 9,0,0,0 .rva se_handler .rva .Lprologue_avx,.Lepilogue_avx # HandlerData[] ___ $code.=<<___ if ($avx>1); .LSEH_info_${func}_avx2: .byte 9,0,0,0 .rva se_handler .rva .Lprologue_avx2,.Lepilogue_avx2 # HandlerData[] ___ } sub sha256op38 { my $instr = shift; my %opcodelet = ( "sha256rnds2" => 0xcb, "sha256msg1" => 0xcc, "sha256msg2" => 0xcd ); if (defined($opcodelet{$instr}) && @_[0] =~ /%xmm([0-7]),\s*%xmm([0-7])/) { my @opcode=(0x0f,0x38); push @opcode,$opcodelet{$instr}; push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M return ".byte\t".join(',',@opcode); } else { return $instr."\t".@_[0]; } } foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\b(sha256[^\s]*)\s+(.*)/sha256op38($1,$2)/geo; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/internal.h000064400000000000000000000272031353036607100142510ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ /* ==================================================================== * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ #ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H #define OPENSSL_HEADER_CRYPTO_INTERNAL_H #include // Must be first. #if !defined(NDEBUG) #include #define ASSERT(x) assert(x) #else #define ASSERT(x) ((void)0) #endif #if defined(__GNUC__) && \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 // |alignas| and |alignof| were added in C11. GCC added support in version 4.8. // Testing for __STDC_VERSION__/__cplusplus doesn't work because 4.7 already // reports support for C11. #define alignas(x) __attribute__ ((aligned (x))) #elif defined(_MSC_VER) && !defined(__clang__) #define alignas(x) __declspec(align(x)) #else #include #endif #if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT) #define BORINGSSL_HAS_UINT128 typedef __int128_t int128_t; typedef __uint128_t uint128_t; #endif // Constant-time utility functions. // // The following methods return a bitmask of all ones (0xff...f) for true and 0 // for false. This is useful for choosing a value based on the result of a // conditional in constant time. For example, // // if (a < b) { // c = a; // } else { // c = b; // } // // can be written as // // crypto_word lt = constant_time_lt_w(a, b); // c = constant_time_select_w(lt, a, b); // crypto_word is the type that most constant-time functions use. Ideally we // would like it to be |size_t|, but NaCl builds in 64-bit mode with 32-bit // pointers, which means that |size_t| can be 32 bits when |crypto_word| is 64 // bits. #if defined(OPENSSL_64_BIT) typedef uint64_t crypto_word; #define CRYPTO_WORD_BITS (64u) #elif defined(OPENSSL_32_BIT) typedef uint32_t crypto_word; #define CRYPTO_WORD_BITS (32u) #else #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" #endif #define CONSTTIME_TRUE_W ~((crypto_word)0) #define CONSTTIME_FALSE_W ((crypto_word)0) // value_barrier_w returns |a|, but prevents GCC and Clang from reasoning about // the returned value. This is used to mitigate compilers undoing constant-time // code, until we can express our requirements directly in the language. // // Note the compiler is aware that |value_barrier_w| has no side effects and // always has the same output for a given input. This allows it to eliminate // dead code, move computations across loops, and vectorize. static inline crypto_word value_barrier_w(crypto_word a) { #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; } // value_barrier_u32 behaves like |value_barrier_w| but takes a |uint32_t|. static inline uint32_t value_barrier_u32(uint32_t a) { #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; } // value_barrier_u64 behaves like |value_barrier_w| but takes a |uint64_t|. static inline uint64_t value_barrier_u64(uint64_t a) { #if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; } // constant_time_msb_w returns the given value with the MSB copied to all the // other bits. static inline crypto_word constant_time_msb_w(crypto_word a) { return 0u - (a >> (sizeof(a) * 8 - 1)); } // constant_time_is_zero_w returns 0xff..f if a == 0 and 0 otherwise. static inline crypto_word constant_time_is_zero_w(crypto_word a) { // Here is an SMT-LIB verification of this formula: // // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32) // (bvand (bvnot a) (bvsub a #x00000001)) // ) // // (declare-fun a () (_ BitVec 32)) // // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a #x00000000)))) // (check-sat) // (get-model) return constant_time_msb_w(~a & (a - 1)); } static inline crypto_word constant_time_is_nonzero_w(crypto_word a) { return ~constant_time_is_zero_w(a); } // constant_time_eq_w returns 0xff..f if a == b and 0 otherwise. static inline crypto_word constant_time_eq_w(crypto_word a, crypto_word b) { return constant_time_is_zero_w(a ^ b); } // constant_time_select_w returns (mask & a) | (~mask & b). When |mask| is all // 1s or all 0s (as returned by the methods above), the select methods return // either |a| (if |mask| is nonzero) or |b| (if |mask| is zero). static inline crypto_word constant_time_select_w(crypto_word mask, crypto_word a, crypto_word b) { // Clang recognizes this pattern as a select. While it usually transforms it // to a cmov, it sometimes further transforms it into a branch, which we do // not want. // // Adding barriers to both |mask| and |~mask| breaks the relationship between // the two, which makes the compiler stick with bitmasks. return (value_barrier_w(mask) & a) | (value_barrier_w(~mask) & b); } // from_be_u32_ptr returns the 32-bit big-endian-encoded value at |data|. static inline uint32_t from_be_u32_ptr(const uint8_t *data) { return ((uint32_t)data[0] << 24) | ((uint32_t)data[1] << 16) | ((uint32_t)data[2] << 8) | ((uint32_t)data[3]); } // to_be_u32_ptr writes the value |x| to the location |out| in big-endian // order. static inline void to_be_u32_ptr(uint8_t *out, uint32_t value) { out[0] = (uint8_t)(value >> 24); out[1] = (uint8_t)(value >> 16); out[2] = (uint8_t)(value >> 8); out[3] = (uint8_t)value; } // to_be_u64_ptr writes the value |value| to the location |out| in big-endian // order. static inline void to_be_u64_ptr(uint8_t *out, uint64_t value) { out[0] = (uint8_t)(value >> 56); out[1] = (uint8_t)(value >> 48); out[2] = (uint8_t)(value >> 40); out[3] = (uint8_t)(value >> 32); out[4] = (uint8_t)(value >> 24); out[5] = (uint8_t)(value >> 16); out[6] = (uint8_t)(value >> 8); out[7] = (uint8_t)value; } static inline void bytes_copy(uint8_t out[], const uint8_t in[], size_t len) { for (size_t i = 0; i < len; ++i) { out[i] = in[i]; } } #endif // OPENSSL_HEADER_CRYPTO_INTERNAL_H ring-0.16.9/crypto/limbs/limbs.c000064400000000000000000000150561353036607100146470ustar0000000000000000/* Copyright 2016-2017 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "limbs.h" #include "../internal.h" #include "limbs.inl" /* XXX: We assume that the conversion from |Carry| to |Limb| is constant-time, * but we haven't verified that assumption. TODO: Fix it so we don't need to * make that assumption. */ /* Returns 0xfff..f if |a| is all zero limbs, and zero otherwise. |num_limbs| * may be zero. */ Limb LIMBS_are_zero(const Limb a[], size_t num_limbs) { Limb is_zero = CONSTTIME_TRUE_W; for (size_t i = 0; i < num_limbs; ++i) { is_zero = constant_time_select_w(is_zero, constant_time_is_zero_w(a[i]), is_zero); } return is_zero; } /* Returns 0xffff..f if |a == b|, and zero otherwise. |num_limbs| may be zero. */ Limb LIMBS_equal(const Limb a[], const Limb b[], size_t num_limbs) { Limb eq = CONSTTIME_TRUE_W; for (size_t i = 0; i < num_limbs; ++i) { eq = constant_time_select_w(eq, constant_time_eq_w(a[i], b[i]), eq); } return eq; } /* Returns 0xffff..f if |a == b|, and zero otherwise. |num_limbs| may be zero. */ Limb LIMBS_equal_limb(const Limb a[], Limb b, size_t num_limbs) { if (num_limbs == 0) { return constant_time_is_zero_w(b); } ASSERT(num_limbs >= 1); Limb lo_equal = constant_time_eq_w(a[0], b); Limb hi_zero = LIMBS_are_zero(&a[1], num_limbs - 1); return constant_time_select_w(lo_equal, hi_zero, 0); } /* Returns 0xfff..f if |a| is all zero limbs, and zero otherwise. * |num_limbs| may be zero. */ Limb LIMBS_are_even(const Limb a[], size_t num_limbs) { Limb lo; if (num_limbs == 0) { lo = 0; } else { lo = a[0]; } return constant_time_is_zero_w(lo & 1); } /* Returns 0xffff...f if |a| is less than |b|, and zero otherwise. */ Limb LIMBS_less_than(const Limb a[], const Limb b[], size_t num_limbs) { ASSERT(num_limbs >= 1); /* There are lots of ways to implement this. It is implemented this way to * be consistent with |LIMBS_limbs_reduce_once| and other code that makes such * comparisons as part of doing conditional reductions. */ Limb dummy; Carry borrow = limb_sub(&dummy, a[0], b[0]); for (size_t i = 1; i < num_limbs; ++i) { borrow = limb_sbb(&dummy, a[i], b[i], borrow); } return constant_time_is_nonzero_w(borrow); } Limb LIMBS_less_than_limb(const Limb a[], Limb b, size_t num_limbs) { ASSERT(num_limbs >= 1); Limb dummy; Limb lo = constant_time_is_nonzero_w(limb_sub(&dummy, a[0], b)); Limb hi = LIMBS_are_zero(&a[1], num_limbs - 1); return constant_time_select_w(lo, hi, lo); } void LIMBS_copy(Limb r[], const Limb a[], size_t num_limbs) { limbs_copy(r, a, num_limbs); } /* if (r >= m) { r -= m; } */ void LIMBS_reduce_once(Limb r[], const Limb m[], size_t num_limbs) { ASSERT(num_limbs >= 1); /* This could be done more efficiently if we had |num_limbs| of extra space * available, by storing |r - m| and then doing a conditional copy of either * |r| or |r - m|. But, in order to operate in constant space, with an eye * towards this function being used in RSA in the future, we do things a * slightly less efficient way. */ Limb lt = LIMBS_less_than(r, m, num_limbs); Carry borrow = limb_sub(&r[0], r[0], constant_time_select_w(lt, 0, m[0])); for (size_t i = 1; i < num_limbs; ++i) { /* XXX: This is probably particularly inefficient because the operations in * constant_time_select affect the carry flag, so there will likely be * loads and stores of |borrow|. */ borrow = limb_sbb(&r[i], r[i], constant_time_select_w(lt, 0, m[i]), borrow); } ASSERT(borrow == 0); } void LIMBS_add_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], size_t num_limbs) { Limb overflow1 = constant_time_is_nonzero_w(limbs_add(r, a, b, num_limbs)); Limb overflow2 = ~LIMBS_less_than(r, m, num_limbs); Limb overflow = overflow1 | overflow2; Carry borrow = limb_sub(&r[0], r[0], m[0] & overflow); for (size_t i = 1; i < num_limbs; ++i) { borrow = limb_sbb(&r[i], r[i], m[i] & overflow, borrow); } } void LIMBS_sub_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], size_t num_limbs) { Limb underflow = constant_time_is_nonzero_w(limbs_sub(r, a, b, num_limbs)); Carry carry = limb_add(&r[0], r[0], m[0] & underflow); for (size_t i = 1; i < num_limbs; ++i) { carry = limb_adc(&r[i], r[i], m[i] & underflow, carry); } } void LIMBS_shl_mod(Limb r[], const Limb a[], const Limb m[], size_t num_limbs) { Limb overflow1 = constant_time_is_nonzero_w(a[num_limbs - 1] & LIMB_HIGH_BIT); Limb carry = 0; for (size_t i = 0; i < num_limbs; ++i) { Limb limb = a[i]; Limb new_carry = limb >> (LIMB_BITS - 1); r[i] = (limb << 1) | carry; carry = new_carry; } Limb overflow2 = ~LIMBS_less_than(r, m, num_limbs); Limb overflow = overflow1 | overflow2; Carry borrow = limb_sub(&r[0], r[0], m[0] & overflow); for (size_t i = 1; i < num_limbs; ++i) { borrow = limb_sbb(&r[i], r[i], m[i] & overflow, borrow); } } int LIMBS_select_512_32(Limb r[], const Limb table[], size_t num_limbs, crypto_word index) { if (num_limbs % (512 / LIMB_BITS) != 0) { return 0; } limbs_select(r, table, num_limbs, 32, index); return 1; } static const Limb FIVE_BITS_MASK = 0x1f; crypto_word LIMBS_window5_split_window(Limb lower_limb, Limb higher_limb, size_t index_within_word) { Limb high_bits = (higher_limb << (LIMB_BITS - index_within_word)) & FIVE_BITS_MASK; // There are no bits outside the window above |index_within_word| (if there // were then this wouldn't be a split window), so we don't need to mask // |low_bits|. Limb low_bits = lower_limb >> index_within_word; return low_bits | high_bits; } crypto_word LIMBS_window5_unsplit_window(Limb limb, size_t index_within_word) { return (limb >> index_within_word) & FIVE_BITS_MASK; } Limb LIMB_shr(Limb a, size_t shift) { return a >> shift; } ring-0.16.9/crypto/limbs/limbs.h000064400000000000000000000032261352416253600146530ustar0000000000000000/* Copyright 2016 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef RING_LIMBS_H #define RING_LIMBS_H #include #include "../internal.h" typedef crypto_word Limb; #define LIMB_BITS CRYPTO_WORD_BITS #define LIMB_HIGH_BIT ((Limb)(1) << (LIMB_BITS - 1)) Limb LIMBS_are_zero(const Limb a[], size_t num_limbs); Limb LIMBS_are_even(const Limb a[], size_t num_limbs); void LIMBS_copy(Limb r[], const Limb a[], size_t num_limbs); Limb LIMBS_equal(const Limb a[], const Limb b[], size_t num_limbs); Limb LIMBS_equal_limb(const Limb a[], Limb b, size_t num_limbs); void LIMBS_reduce_once(Limb r[], const Limb m[], size_t num_limbs); void LIMBS_add_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], size_t num_limbs); void LIMBS_sub_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], size_t num_limbs); void LIMBS_shl_mod(Limb r[], const Limb a[], const Limb m[], size_t num_limbs); #endif /* RING_LIMBS_H */ ring-0.16.9/crypto/limbs/limbs.inl000064400000000000000000000115241353036607100152030ustar0000000000000000/* Copyright 2016 Brian Smith. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "limbs.h" #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(push, 3) #include #pragma warning(pop) /* MSVC 2015 RC, when compiling for x86 with /Ox (at least), miscompiles * _addcarry_u32(c, 0, prod_hi, &x) like so: * * add eax,esi ; The previous add that might have set the carry flag. * xor esi,esi ; OOPS! Carry flag is now reset! * mov dword ptr [edi-4],eax * adc esi,dword ptr [prod_hi] * * We test with MSVC 2015 update 2, so make sure we're using a version at least * as new as that. */ #if _MSC_FULL_VER < 190023918 #error "MSVC 2015 Update 2 or later is required." #endif typedef uint8_t Carry; #if LIMB_BITS == 64 #pragma intrinsic(_addcarry_u64, _subborrow_u64) #define GFp_ADDCARRY_INTRINSIC _addcarry_u64 #define GFp_SUBBORROW_INTRINSIC _subborrow_u64 #elif LIMB_BITS == 32 #pragma intrinsic(_addcarry_u32, _subborrow_u32) #define GFp_ADDCARRY_INTRINSIC _addcarry_u32 #define GFp_SUBBORROW_INTRINSIC _subborrow_u32 typedef uint64_t DoubleLimb; #endif #else typedef Limb Carry; #if LIMB_BITS == 64 typedef __uint128_t DoubleLimb; #elif LIMB_BITS == 32 typedef uint64_t DoubleLimb; #endif #endif /* |*r = a + b + carry_in|, returning carry out bit. |carry_in| must be 0 or 1. */ static inline Carry limb_adc(Limb *r, Limb a, Limb b, Carry carry_in) { ASSERT(carry_in == 0 || carry_in == 1); Carry ret; #if defined(GFp_ADDCARRY_INTRINSIC) ret = GFp_ADDCARRY_INTRINSIC(carry_in, a, b, r); #else DoubleLimb x = (DoubleLimb)a + b + carry_in; *r = (Limb)x; ret = (Carry)(x >> LIMB_BITS); #endif ASSERT(ret == 0 || ret == 1); return ret; } /* |*r = a + b|, returning carry bit. */ static inline Carry limb_add(Limb *r, Limb a, Limb b) { Carry ret; #if defined(GFp_ADDCARRY_INTRINSIC) ret = GFp_ADDCARRY_INTRINSIC(0, a, b, r); #else DoubleLimb x = (DoubleLimb)a + b; *r = (Limb)x; ret = (Carry)(x >> LIMB_BITS); #endif ASSERT(ret == 0 || ret == 1); return ret; } /* |*r = a - b - borrow_in|, returning the borrow out bit. |borrow_in| must be * 0 or 1. */ static inline Carry limb_sbb(Limb *r, Limb a, Limb b, Carry borrow_in) { ASSERT(borrow_in == 0 || borrow_in == 1); Carry ret; #if defined(GFp_SUBBORROW_INTRINSIC) ret = GFp_SUBBORROW_INTRINSIC(borrow_in, a, b, r); #else DoubleLimb x = (DoubleLimb)a - b - borrow_in; *r = (Limb)x; ret = (Carry)((x >> LIMB_BITS) & 1); #endif ASSERT(ret == 0 || ret == 1); return ret; } /* |*r = a - b|, returning borrow bit. */ static inline Carry limb_sub(Limb *r, Limb a, Limb b) { Carry ret; #if defined(GFp_SUBBORROW_INTRINSIC) ret = GFp_SUBBORROW_INTRINSIC(0, a, b, r); #else DoubleLimb x = (DoubleLimb)a - b; *r = (Limb)x; ret = (Carry)((x >> LIMB_BITS) & 1); #endif ASSERT(ret == 0 || ret == 1); return ret; } static inline Carry limbs_add(Limb r[], const Limb a[], const Limb b[], size_t num_limbs) { ASSERT(num_limbs >= 1); Carry carry = limb_add(&r[0], a[0], b[0]); for (size_t i = 1; i < num_limbs; ++i) { carry = limb_adc(&r[i], a[i], b[i], carry); } return carry; } /* |r -= s|, returning the borrow. */ static inline Carry limbs_sub(Limb r[], const Limb a[], const Limb b[], size_t num_limbs) { ASSERT(num_limbs >= 1); Carry borrow = limb_sub(&r[0], a[0], b[0]); for (size_t i = 1; i < num_limbs; ++i) { borrow = limb_sbb(&r[i], a[i], b[i], borrow); } return borrow; } static inline void limbs_copy(Limb r[], const Limb a[], size_t num_limbs) { for (size_t i = 0; i < num_limbs; ++i) { r[i] = a[i]; } } static inline void limbs_select(Limb r[], const Limb table[], size_t num_limbs, size_t num_entries, crypto_word index) { for (size_t i = 0; i < num_limbs; ++i) { r[i] = 0; } for (size_t e = 0; e < num_entries; ++e) { Limb equal = constant_time_eq_w(index, e); for (size_t i = 0; i < num_limbs; ++i) { r[i] = constant_time_select_w(equal, table[(e * num_limbs) + i], r[i]); } } } static inline void limbs_zero(Limb r[], size_t num_limbs) { for (size_t i = 0; i < num_limbs; ++i) { r[i] = 0; } } ring-0.16.9/crypto/mem.c000064400000000000000000000064211352416253600132100ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include int GFp_memcmp(const uint8_t *a, const uint8_t *b, size_t len) { uint8_t x = 0; for (size_t i = 0; i < len; i++) { x |= a[i] ^ b[i]; } return x; } ring-0.16.9/crypto/perlasm/arm-xlate.pl000064400000000000000000000130311353036607100161500ustar0000000000000000#! /usr/bin/env perl # Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html use strict; my $flavour = shift; my $output = shift; open STDOUT,">$output" || die "can't open $output: $!"; $flavour = "linux32" if (!$flavour or $flavour eq "void"); my %GLOBALS; my $dotinlocallabels=($flavour=~/linux/)?1:0; ################################################################ # directives which need special treatment on different platforms ################################################################ my $arch = sub { if ($flavour =~ /linux/) { ".arch\t".join(',',@_); } else { ""; } }; my $fpu = sub { if ($flavour =~ /linux/) { ".fpu\t".join(',',@_); } else { ""; } }; my $hidden = sub { if ($flavour =~ /ios/) { ".private_extern\t".join(',',@_); } else { ".hidden\t".join(',',@_); } }; my $comm = sub { my @args = split(/,\s*/,shift); my $name = @args[0]; my $global = \$GLOBALS{$name}; my $ret; if ($flavour =~ /ios32/) { $ret = ".comm\t_$name,@args[1]\n"; $ret .= ".non_lazy_symbol_pointer\n"; $ret .= "$name:\n"; $ret .= ".indirect_symbol\t_$name\n"; $ret .= ".long\t0"; $name = "_$name"; } else { $ret = ".comm\t".join(',',@args); } $$global = $name; $ret; }; my $globl = sub { my $name = shift; my $global = \$GLOBALS{$name}; my $ret; SWITCH: for ($flavour) { /ios/ && do { $name = "_$name"; last; }; } $ret = ".globl $name\n"; # All symbols in assembly files are hidden. $ret .= &$hidden($name); $$global = $name; $ret; }; my $global = $globl; my $extern = sub { &$globl(@_); return; # return nothing }; my $type = sub { if ($flavour =~ /linux/) { ".type\t".join(',',@_); } elsif ($flavour =~ /ios32/) { if (join(',',@_) =~ /(\w+),%function/) { "#ifdef __thumb2__\n". ".thumb_func $1\n". "#endif"; } } else { ""; } }; my $size = sub { if ($flavour =~ /linux/) { ".size\t".join(',',@_); } else { ""; } }; my $inst = sub { if ($flavour =~ /linux/) { ".inst\t".join(',',@_); } else { ".long\t".join(',',@_); } }; my $asciz = sub { my $line = join(",",@_); if ($line =~ /^"(.*)"$/) { ".byte " . join(",",unpack("C*",$1),0) . "\n.align 2"; } else { ""; } }; my $section = sub { if ($flavour =~ /ios/) { if ($_[0] eq ".rodata") { return ".section\t__TEXT,__const"; } die "Unknown section name $_[0]"; } else { return ".section\t" . join(",", @_); } }; sub range { my ($r,$sfx,$start,$end) = @_; join(",",map("$r$_$sfx",($start..$end))); } sub expand_line { my $line = shift; my @ret = (); pos($line)=0; while ($line =~ m/\G[^@\/\{\"]*/g) { if ($line =~ m/\G(@|\/\/|$)/gc) { last; } elsif ($line =~ m/\G\{/gc) { my $saved_pos = pos($line); $line =~ s/\G([rdqv])([0-9]+)([^\-]*)\-\1([0-9]+)\3/range($1,$3,$2,$4)/e; pos($line) = $saved_pos; $line =~ m/\G[^\}]*\}/g; } elsif ($line =~ m/\G\"/gc) { $line =~ m/\G[^\"]*\"/g; } } $line =~ s/\b(\w+)/$GLOBALS{$1} or $1/ge; return $line; } print <<___; // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) ___ print "#if defined(__arm__)\n" if ($flavour eq "linux32"); print "#if defined(__aarch64__)\n" if ($flavour eq "linux64"); while(my $line=<>) { if ($line =~ m/^\s*(#|@|\/\/)/) { print $line; next; } $line =~ s|/\*.*\*/||; # get rid of C-style comments... $line =~ s|^\s+||; # ... and skip white spaces in beginning... $line =~ s|\s+$||; # ... and at the end if ($flavour =~ /64/) { my $copy = $line; # Also remove line comments. $copy =~ s|//.*||; if ($copy =~ /\b[wx]18\b/) { die "r18 is reserved by the platform and may not be used."; } } { $line =~ s|[\b\.]L(\w{2,})|L$1|g; # common denominator for Locallabel $line =~ s|\bL(\w{2,})|\.L$1|g if ($dotinlocallabels); } { $line =~ s|(^[\.\w]+)\:\s*||; my $label = $1; if ($label) { printf "%s:",($GLOBALS{$label} or $label); } } if ($line !~ m/^[#@]/) { $line =~ s|^\s*(\.?)(\S+)\s*||; my $c = $1; $c = "\t" if ($c eq ""); my $mnemonic = $2; my $opcode; if ($mnemonic =~ m/([^\.]+)\.([^\.]+)/) { $opcode = eval("\$$1_$2"); } else { $opcode = eval("\$$mnemonic"); } if ($flavour =~ /ios/) { # Mach-O and ELF use different syntax for these relocations. Note # that we require :pg_hi21: to be explicitly listed. It is normally # optional with adrp instructions. $line =~ s|:pg_hi21:(\w+)|\1\@PAGE|; $line =~ s|:lo12:(\w+)|\1\@PAGEOFF|; } else { # Clang's integrated assembly does not support the optional # :pg_hi21: markers, so erase them. $line =~ s|:pg_hi21:||; } my $arg=expand_line($line); if (ref($opcode) eq 'CODE') { $line = &$opcode($arg); } elsif ($mnemonic) { $line = $c.$mnemonic; $line.= "\t$arg" if ($arg ne ""); } } print $line if ($line); print "\n"; } print "#endif\n" if ($flavour eq "linux32" || $flavour eq "linux64"); print "#endif // !OPENSSL_NO_ASM\n"; close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/perlasm/x86_64-xlate.pl000064400000000000000000001312561353036607100163410ustar0000000000000000#! /usr/bin/env perl # Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # Ascetic x86_64 AT&T to MASM/NASM assembler translator by . # # Why AT&T to MASM and not vice versa? Several reasons. Because AT&T # format is way easier to parse. Because it's simpler to "gear" from # Unix ABI to Windows one [see cross-reference "card" at the end of # file]. Because Linux targets were available first... # # In addition the script also "distills" code suitable for GNU # assembler, so that it can be compiled with more rigid assemblers, # such as Solaris /usr/ccs/bin/as. # # This translator is not designed to convert *arbitrary* assembler # code from AT&T format to MASM one. It's designed to convert just # enough to provide for dual-ABI OpenSSL modules development... # There *are* limitations and you might have to modify your assembler # code or this script to achieve the desired result... # # Currently recognized limitations: # # - can't use multiple ops per line; # # Dual-ABI styling rules. # # 1. Adhere to Unix register and stack layout [see cross-reference # ABI "card" at the end for explanation]. # 2. Forget about "red zone," stick to more traditional blended # stack frame allocation. If volatile storage is actually required # that is. If not, just leave the stack as is. # 3. Functions tagged with ".type name,@function" get crafted with # unified Win64 prologue and epilogue automatically. If you want # to take care of ABI differences yourself, tag functions as # ".type name,@abi-omnipotent" instead. # 4. To optimize the Win64 prologue you can specify number of input # arguments as ".type name,@function,N." Keep in mind that if N is # larger than 6, then you *have to* write "abi-omnipotent" code, # because >6 cases can't be addressed with unified prologue. # 5. Name local labels as .L*, do *not* use dynamic labels such as 1: # (sorry about latter). # 6. Don't use [or hand-code with .byte] "rep ret." "ret" mnemonic is # required to identify the spots, where to inject Win64 epilogue! # But on the pros, it's then prefixed with rep automatically:-) # 7. Stick to explicit ip-relative addressing. If you have to use # GOTPCREL addressing, stick to mov symbol@GOTPCREL(%rip),%r??. # Both are recognized and translated to proper Win64 addressing # modes. # # 8. In order to provide for structured exception handling unified # Win64 prologue copies %rsp value to %rax. For further details # see SEH paragraph at the end. # 9. .init segment is allowed to contain calls to functions only. # a. If function accepts more than 4 arguments *and* >4th argument # is declared as non 64-bit value, do clear its upper part. use strict; my $flavour = shift; my $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } open STDOUT,">$output" || die "can't open $output: $!" if (defined($output)); my $gas=1; $gas=0 if ($output =~ /\.asm$/); my $elf=1; $elf=0 if (!$gas); my $win64=0; my $prefix=""; my $decor=".L"; my $masmref=8 + 50727*2**-32; # 8.00.50727 shipped with VS2005 my $masm=0; my $PTR=" PTR"; my $nasmref=2.03; my $nasm=0; if ($flavour eq "mingw64") { $gas=1; $elf=0; $win64=1; # TODO(davidben): Before supporting the # mingw64 perlasm flavour, do away with this # environment variable check. die "mingw64 not supported"; $prefix=`echo __USER_LABEL_PREFIX__ | $ENV{CC} -E -P -`; $prefix =~ s|\R$||; # Better chomp } elsif ($flavour eq "macosx") { $gas=1; $elf=0; $prefix="_"; $decor="L\$"; } elsif ($flavour eq "masm") { $gas=0; $elf=0; $masm=$masmref; $win64=1; $decor="\$L\$"; } elsif ($flavour eq "nasm") { $gas=0; $elf=0; $nasm=$nasmref; $win64=1; $decor="\$L\$"; $PTR=""; } elsif (!$gas) { die "unknown flavour $flavour"; } my $current_segment; my $current_function; my %globals; { package opcode; # pick up opcodes sub re { my ($class, $line) = @_; my $self = {}; my $ret; if ($$line =~ /^([a-z][a-z0-9]*)/i) { bless $self,$class; $self->{op} = $1; $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; undef $self->{sz}; if ($self->{op} =~ /^(movz)x?([bw]).*/) { # movz is pain... $self->{op} = $1; $self->{sz} = $2; } elsif ($self->{op} =~ /call|jmp/) { $self->{sz} = ""; } elsif ($self->{op} =~ /^p/ && $' !~ /^(ush|op|insrw)/) { # SSEn $self->{sz} = ""; } elsif ($self->{op} =~ /^[vk]/) { # VEX or k* such as kmov $self->{sz} = ""; } elsif ($self->{op} =~ /mov[dq]/ && $$line =~ /%xmm/) { $self->{sz} = ""; } elsif ($self->{op} =~ /^or([qlwb])$/) { $self->{op} = "or"; $self->{sz} = $1; } elsif ($self->{op} =~ /([a-z]{3,})([qlwb])$/) { $self->{op} = $1; $self->{sz} = $2; } } $ret; } sub size { my ($self, $sz) = @_; $self->{sz} = $sz if (defined($sz) && !defined($self->{sz})); $self->{sz}; } sub out { my $self = shift; if ($gas) { if ($self->{op} eq "movz") { # movz is pain... sprintf "%s%s%s",$self->{op},$self->{sz},shift; } elsif ($self->{op} =~ /^set/) { "$self->{op}"; } elsif ($self->{op} eq "ret") { my $epilogue = ""; if ($win64 && $current_function->{abi} eq "svr4") { $epilogue = "movq 8(%rsp),%rdi\n\t" . "movq 16(%rsp),%rsi\n\t"; } $epilogue . ".byte 0xf3,0xc3"; } elsif ($self->{op} eq "call" && !$elf && $current_segment eq ".init") { ".p2align\t3\n\t.quad"; } else { "$self->{op}$self->{sz}"; } } else { $self->{op} =~ s/^movz/movzx/; if ($self->{op} eq "ret") { $self->{op} = ""; if ($win64 && $current_function->{abi} eq "svr4") { $self->{op} = "mov rdi,QWORD$PTR\[8+rsp\]\t;WIN64 epilogue\n\t". "mov rsi,QWORD$PTR\[16+rsp\]\n\t"; } $self->{op} .= "DB\t0F3h,0C3h\t\t;repret"; } elsif ($self->{op} =~ /^(pop|push)f/) { $self->{op} .= $self->{sz}; } elsif ($self->{op} eq "call" && $current_segment eq ".CRT\$XCU") { $self->{op} = "\tDQ"; } $self->{op}; } } sub mnemonic { my ($self, $op) = @_; $self->{op}=$op if (defined($op)); $self->{op}; } } { package const; # pick up constants, which start with $ sub re { my ($class, $line) = @_; my $self = {}; my $ret; if ($$line =~ /^\$([^,]+)/) { bless $self, $class; $self->{value} = $1; $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; } $ret; } sub out { my $self = shift; $self->{value} =~ s/\b(0b[0-1]+)/oct($1)/eig; if ($gas) { # Solaris /usr/ccs/bin/as can't handle multiplications # in $self->{value} my $value = $self->{value}; no warnings; # oct might complain about overflow, ignore here... $value =~ s/(?{value} = $value; } sprintf "\$%s",$self->{value}; } else { my $value = $self->{value}; $value =~ s/0x([0-9a-f]+)/0$1h/ig if ($masm); sprintf "%s",$value; } } } { package ea; # pick up effective addresses: expr(%reg,%reg,scale) my %szmap = ( b=>"BYTE$PTR", w=>"WORD$PTR", l=>"DWORD$PTR", d=>"DWORD$PTR", q=>"QWORD$PTR", o=>"OWORD$PTR", x=>"XMMWORD$PTR", y=>"YMMWORD$PTR", z=>"ZMMWORD$PTR" ) if (!$gas); sub re { my ($class, $line, $opcode) = @_; my $self = {}; my $ret; # optional * ----vvv--- appears in indirect jmp/call if ($$line =~ /^(\*?)([^\(,]*)\(([%\w,]+)\)((?:{[^}]+})*)/) { bless $self, $class; $self->{asterisk} = $1; $self->{label} = $2; ($self->{base},$self->{index},$self->{scale})=split(/,/,$3); $self->{scale} = 1 if (!defined($self->{scale})); $self->{opmask} = $4; $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; if ($win64 && $self->{label} =~ s/\@GOTPCREL//) { die if ($opcode->mnemonic() ne "mov"); $opcode->mnemonic("lea"); } $self->{base} =~ s/^%//; $self->{index} =~ s/^%// if (defined($self->{index})); $self->{opcode} = $opcode; } $ret; } sub size {} sub out { my ($self, $sz) = @_; $self->{label} =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; $self->{label} =~ s/\.L/$decor/g; # Silently convert all EAs to 64-bit. This is required for # elder GNU assembler and results in more compact code, # *but* most importantly AES module depends on this feature! $self->{index} =~ s/^[er](.?[0-9xpi])[d]?$/r\1/; $self->{base} =~ s/^[er](.?[0-9xpi])[d]?$/r\1/; # Solaris /usr/ccs/bin/as can't handle multiplications # in $self->{label}... use integer; $self->{label} =~ s/(?{label} =~ s/\b([0-9]+\s*[\*\/\%]\s*[0-9]+)\b/eval($1)/eg; # Some assemblers insist on signed presentation of 32-bit # offsets, but sign extension is a tricky business in perl... if ((1<<31)<<1) { $self->{label} =~ s/\b([0-9]+)\b/$1<<32>>32/eg; } else { $self->{label} =~ s/\b([0-9]+)\b/$1>>0/eg; } # if base register is %rbp or %r13, see if it's possible to # flip base and index registers [for better performance] if (!$self->{label} && $self->{index} && $self->{scale}==1 && $self->{base} =~ /(rbp|r13)/) { $self->{base} = $self->{index}; $self->{index} = $1; } if ($gas) { $self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64"); if (defined($self->{index})) { sprintf "%s%s(%s,%%%s,%d)%s", $self->{asterisk},$self->{label}, $self->{base}?"%$self->{base}":"", $self->{index},$self->{scale}, $self->{opmask}; } else { sprintf "%s%s(%%%s)%s", $self->{asterisk},$self->{label}, $self->{base},$self->{opmask}; } } else { $self->{label} =~ s/\./\$/g; $self->{label} =~ s/(?{label} = "($self->{label})" if ($self->{label} =~ /[\*\+\-\/]/); my $mnemonic = $self->{opcode}->mnemonic(); ($self->{asterisk}) && ($sz="q") || ($mnemonic =~ /^v?mov([qd])$/) && ($sz=$1) || ($mnemonic =~ /^v?pinsr([qdwb])$/) && ($sz=$1) || ($mnemonic =~ /^vpbroadcast([qdwb])$/) && ($sz=$1) || ($mnemonic =~ /^v(?!perm)[a-z]+[fi]128$/) && ($sz="x"); $self->{opmask} =~ s/%(k[0-7])/$1/; if (defined($self->{index})) { sprintf "%s[%s%s*%d%s]%s",$szmap{$sz}, $self->{label}?"$self->{label}+":"", $self->{index},$self->{scale}, $self->{base}?"+$self->{base}":"", $self->{opmask}; } elsif ($self->{base} eq "rip") { sprintf "%s[%s]",$szmap{$sz},$self->{label}; } else { sprintf "%s[%s%s]%s", $szmap{$sz}, $self->{label}?"$self->{label}+":"", $self->{base},$self->{opmask}; } } } } { package register; # pick up registers, which start with %. sub re { my ($class, $line, $opcode) = @_; my $self = {}; my $ret; # optional * ----vvv--- appears in indirect jmp/call if ($$line =~ /^(\*?)%(\w+)((?:{[^}]+})*)/) { bless $self,$class; $self->{asterisk} = $1; $self->{value} = $2; $self->{opmask} = $3; $opcode->size($self->size()); $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; } $ret; } sub size { my $self = shift; my $ret; if ($self->{value} =~ /^r[\d]+b$/i) { $ret="b"; } elsif ($self->{value} =~ /^r[\d]+w$/i) { $ret="w"; } elsif ($self->{value} =~ /^r[\d]+d$/i) { $ret="l"; } elsif ($self->{value} =~ /^r[\w]+$/i) { $ret="q"; } elsif ($self->{value} =~ /^[a-d][hl]$/i){ $ret="b"; } elsif ($self->{value} =~ /^[\w]{2}l$/i) { $ret="b"; } elsif ($self->{value} =~ /^[\w]{2}$/i) { $ret="w"; } elsif ($self->{value} =~ /^e[a-z]{2}$/i){ $ret="l"; } $ret; } sub out { my $self = shift; if ($gas) { sprintf "%s%%%s%s", $self->{asterisk}, $self->{value}, $self->{opmask}; } else { $self->{opmask} =~ s/%(k[0-7])/$1/; $self->{value}.$self->{opmask}; } } } { package label; # pick up labels, which end with : sub re { my ($class, $line) = @_; my $self = {}; my $ret; if ($$line =~ /(^[\.\w]+)\:/) { bless $self,$class; $self->{value} = $1; $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; $self->{value} =~ s/^\.L/$decor/; } $ret; } sub out { my $self = shift; if ($gas) { my $func = ($globals{$self->{value}} or $self->{value}) . ":"; if ($win64 && $current_function->{name} eq $self->{value} && $current_function->{abi} eq "svr4") { $func .= "\n"; $func .= " movq %rdi,8(%rsp)\n"; $func .= " movq %rsi,16(%rsp)\n"; $func .= " movq %rsp,%rax\n"; $func .= "${decor}SEH_begin_$current_function->{name}:\n"; my $narg = $current_function->{narg}; $narg=6 if (!defined($narg)); $func .= " movq %rcx,%rdi\n" if ($narg>0); $func .= " movq %rdx,%rsi\n" if ($narg>1); $func .= " movq %r8,%rdx\n" if ($narg>2); $func .= " movq %r9,%rcx\n" if ($narg>3); $func .= " movq 40(%rsp),%r8\n" if ($narg>4); $func .= " movq 48(%rsp),%r9\n" if ($narg>5); } $func; } elsif ($self->{value} ne "$current_function->{name}") { # Make all labels in masm global. $self->{value} .= ":" if ($masm); $self->{value} . ":"; } elsif ($win64 && $current_function->{abi} eq "svr4") { my $func = "$current_function->{name}" . ($nasm ? ":" : "\tPROC $current_function->{scope}") . "\n"; $func .= " mov QWORD$PTR\[8+rsp\],rdi\t;WIN64 prologue\n"; $func .= " mov QWORD$PTR\[16+rsp\],rsi\n"; $func .= " mov rax,rsp\n"; $func .= "${decor}SEH_begin_$current_function->{name}:"; $func .= ":" if ($masm); $func .= "\n"; my $narg = $current_function->{narg}; $narg=6 if (!defined($narg)); $func .= " mov rdi,rcx\n" if ($narg>0); $func .= " mov rsi,rdx\n" if ($narg>1); $func .= " mov rdx,r8\n" if ($narg>2); $func .= " mov rcx,r9\n" if ($narg>3); $func .= " mov r8,QWORD$PTR\[40+rsp\]\n" if ($narg>4); $func .= " mov r9,QWORD$PTR\[48+rsp\]\n" if ($narg>5); $func .= "\n"; } else { "$current_function->{name}". ($nasm ? ":" : "\tPROC $current_function->{scope}"); } } } { package expr; # pick up expressions sub re { my ($class, $line, $opcode) = @_; my $self = {}; my $ret; if ($$line =~ /(^[^,]+)/) { bless $self,$class; $self->{value} = $1; $ret = $self; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; $self->{value} =~ s/\@PLT// if (!$elf); $self->{value} =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; $self->{value} =~ s/\.L/$decor/g; $self->{opcode} = $opcode; } $ret; } sub out { my $self = shift; if ($nasm && $self->{opcode}->mnemonic()=~m/^j(?![re]cxz)/) { "NEAR ".$self->{value}; } else { $self->{value}; } } } { package cfi_directive; # CFI directives annotate instructions that are significant for # stack unwinding procedure compliant with DWARF specification, # see http://dwarfstd.org/. Besides naturally expected for this # script platform-specific filtering function, this module adds # three auxiliary synthetic directives not recognized by [GNU] # assembler: # # - .cfi_push to annotate push instructions in prologue, which # translates to .cfi_adjust_cfa_offset (if needed) and # .cfi_offset; # - .cfi_pop to annotate pop instructions in epilogue, which # translates to .cfi_adjust_cfa_offset (if needed) and # .cfi_restore; # - [and most notably] .cfi_cfa_expression which encodes # DW_CFA_def_cfa_expression and passes it to .cfi_escape as # byte vector; # # CFA expressions were introduced in DWARF specification version # 3 and describe how to deduce CFA, Canonical Frame Address. This # becomes handy if your stack frame is variable and you can't # spare register for [previous] frame pointer. Suggested directive # syntax is made-up mix of DWARF operator suffixes [subset of] # and references to registers with optional bias. Following example # describes offloaded *original* stack pointer at specific offset # from *current* stack pointer: # # .cfi_cfa_expression %rsp+40,deref,+8 # # Final +8 has everything to do with the fact that CFA is defined # as reference to top of caller's stack, and on x86_64 call to # subroutine pushes 8-byte return address. In other words original # stack pointer upon entry to a subroutine is 8 bytes off from CFA. # Below constants are taken from "DWARF Expressions" section of the # DWARF specification, section is numbered 7.7 in versions 3 and 4. my %DW_OP_simple = ( # no-arg operators, mapped directly deref => 0x06, dup => 0x12, drop => 0x13, over => 0x14, pick => 0x15, swap => 0x16, rot => 0x17, xderef => 0x18, abs => 0x19, and => 0x1a, div => 0x1b, minus => 0x1c, mod => 0x1d, mul => 0x1e, neg => 0x1f, not => 0x20, or => 0x21, plus => 0x22, shl => 0x24, shr => 0x25, shra => 0x26, xor => 0x27, ); my %DW_OP_complex = ( # used in specific subroutines constu => 0x10, # uleb128 consts => 0x11, # sleb128 plus_uconst => 0x23, # uleb128 lit0 => 0x30, # add 0-31 to opcode reg0 => 0x50, # add 0-31 to opcode breg0 => 0x70, # add 0-31 to opcole, sleb128 regx => 0x90, # uleb28 fbreg => 0x91, # sleb128 bregx => 0x92, # uleb128, sleb128 piece => 0x93, # uleb128 ); # Following constants are defined in x86_64 ABI supplement, for # example available at https://www.uclibc.org/docs/psABI-x86_64.pdf, # see section 3.7 "Stack Unwind Algorithm". my %DW_reg_idx = ( "%rax"=>0, "%rdx"=>1, "%rcx"=>2, "%rbx"=>3, "%rsi"=>4, "%rdi"=>5, "%rbp"=>6, "%rsp"=>7, "%r8" =>8, "%r9" =>9, "%r10"=>10, "%r11"=>11, "%r12"=>12, "%r13"=>13, "%r14"=>14, "%r15"=>15 ); my ($cfa_reg, $cfa_rsp); my @cfa_stack; # [us]leb128 format is variable-length integer representation base # 2^128, with most significant bit of each byte being 0 denoting # *last* most significant digit. See "Variable Length Data" in the # DWARF specification, numbered 7.6 at least in versions 3 and 4. sub sleb128 { use integer; # get right shift extend sign my $val = shift; my $sign = ($val < 0) ? -1 : 0; my @ret = (); while(1) { push @ret, $val&0x7f; # see if remaining bits are same and equal to most # significant bit of the current digit, if so, it's # last digit... last if (($val>>6) == $sign); @ret[-1] |= 0x80; $val >>= 7; } return @ret; } sub uleb128 { my $val = shift; my @ret = (); while(1) { push @ret, $val&0x7f; # see if it's last significant digit... last if (($val >>= 7) == 0); @ret[-1] |= 0x80; } return @ret; } sub const { my $val = shift; if ($val >= 0 && $val < 32) { return ($DW_OP_complex{lit0}+$val); } return ($DW_OP_complex{consts}, sleb128($val)); } sub reg { my $val = shift; return if ($val !~ m/^(%r\w+)(?:([\+\-])((?:0x)?[0-9a-f]+))?/); my $reg = $DW_reg_idx{$1}; my $off = eval ("0 $2 $3"); return (($DW_OP_complex{breg0} + $reg), sleb128($off)); # Yes, we use DW_OP_bregX+0 to push register value and not # DW_OP_regX, because latter would require even DW_OP_piece, # which would be a waste under the circumstances. If you have # to use DWP_OP_reg, use "regx:N"... } sub cfa_expression { my $line = shift; my @ret; foreach my $token (split(/,\s*/,$line)) { if ($token =~ /^%r/) { push @ret,reg($token); } elsif ($token =~ /((?:0x)?[0-9a-f]+)\((%r\w+)\)/) { push @ret,reg("$2+$1"); } elsif ($token =~ /(\w+):(\-?(?:0x)?[0-9a-f]+)(U?)/i) { my $i = 1*eval($2); push @ret,$DW_OP_complex{$1}, ($3 ? uleb128($i) : sleb128($i)); } elsif (my $i = 1*eval($token) or $token eq "0") { if ($token =~ /^\+/) { push @ret,$DW_OP_complex{plus_uconst},uleb128($i); } else { push @ret,const($i); } } else { push @ret,$DW_OP_simple{$token}; } } # Finally we return DW_CFA_def_cfa_expression, 15, followed by # length of the expression and of course the expression itself. return (15,scalar(@ret),@ret); } sub re { my ($class, $line) = @_; my $self = {}; my $ret; if ($$line =~ s/^\s*\.cfi_(\w+)\s*//) { bless $self,$class; $ret = $self; undef $self->{value}; my $dir = $1; SWITCH: for ($dir) { # What is $cfa_rsp? Effectively it's difference between %rsp # value and current CFA, Canonical Frame Address, which is # why it starts with -8. Recall that CFA is top of caller's # stack... /startproc/ && do { ($cfa_reg, $cfa_rsp) = ("%rsp", -8); last; }; /endproc/ && do { ($cfa_reg, $cfa_rsp) = ("%rsp", 0); last; }; /def_cfa_register/ && do { $cfa_reg = $$line; last; }; /def_cfa_offset/ && do { $cfa_rsp = -1*eval($$line) if ($cfa_reg eq "%rsp"); last; }; /adjust_cfa_offset/ && do { $cfa_rsp -= 1*eval($$line) if ($cfa_reg eq "%rsp"); last; }; /def_cfa/ && do { if ($$line =~ /(%r\w+)\s*,\s*(.+)/) { $cfa_reg = $1; $cfa_rsp = -1*eval($2) if ($cfa_reg eq "%rsp"); } last; }; /push/ && do { $dir = undef; $cfa_rsp -= 8; if ($cfa_reg eq "%rsp") { $self->{value} = ".cfi_adjust_cfa_offset\t8\n"; } $self->{value} .= ".cfi_offset\t$$line,$cfa_rsp"; last; }; /pop/ && do { $dir = undef; $cfa_rsp += 8; if ($cfa_reg eq "%rsp") { $self->{value} = ".cfi_adjust_cfa_offset\t-8\n"; } $self->{value} .= ".cfi_restore\t$$line"; last; }; /cfa_expression/ && do { $dir = undef; $self->{value} = ".cfi_escape\t" . join(",", map(sprintf("0x%02x", $_), cfa_expression($$line))); last; }; /remember_state/ && do { push @cfa_stack, [$cfa_reg, $cfa_rsp]; last; }; /restore_state/ && do { ($cfa_reg, $cfa_rsp) = @{pop @cfa_stack}; last; }; } $self->{value} = ".cfi_$dir\t$$line" if ($dir); $$line = ""; } return $ret; } sub out { my $self = shift; return ($elf ? $self->{value} : undef); } } { package directive; # pick up directives, which start with . sub re { my ($class, $line) = @_; my $self = {}; my $ret; my $dir; # chain-call to cfi_directive $ret = cfi_directive->re($line) and return $ret; if ($$line =~ /^\s*(\.\w+)/) { bless $self,$class; $dir = $1; $ret = $self; undef $self->{value}; $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; SWITCH: for ($dir) { /\.global|\.globl|\.extern/ && do { $globals{$$line} = $prefix . $$line; $$line = $globals{$$line} if ($prefix); last; }; /\.type/ && do { my ($sym,$type,$narg) = split(/\s*,\s*/,$$line); if ($type eq "\@function") { undef $current_function; $current_function->{name} = $sym; $current_function->{abi} = "svr4"; $current_function->{narg} = $narg; $current_function->{scope} = defined($globals{$sym})?"PUBLIC":"PRIVATE"; } elsif ($type eq "\@abi-omnipotent") { undef $current_function; $current_function->{name} = $sym; $current_function->{scope} = defined($globals{$sym})?"PUBLIC":"PRIVATE"; } $$line =~ s/\@abi\-omnipotent/\@function/; $$line =~ s/\@function.*/\@function/; last; }; /\.asciz/ && do { if ($$line =~ /^"(.*)"$/) { $dir = ".byte"; $$line = join(",",unpack("C*",$1),0); } last; }; /\.rva|\.long|\.quad|\.byte/ && do { $$line =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; $$line =~ s/\.L/$decor/g; last; }; } if ($gas) { $self->{value} = $dir . "\t" . $$line; if ($dir =~ /\.extern/) { if ($flavour eq "elf") { $self->{value} .= "\n.hidden $$line"; } else { $self->{value} = ""; } } elsif (!$elf && $dir =~ /\.type/) { $self->{value} = ""; $self->{value} = ".def\t" . ($globals{$1} or $1) . ";\t" . (defined($globals{$1})?".scl 2;":".scl 3;") . "\t.type 32;\t.endef" if ($win64 && $$line =~ /([^,]+),\@function/); } elsif (!$elf && $dir =~ /\.size/) { $self->{value} = ""; if (defined($current_function)) { $self->{value} .= "${decor}SEH_end_$current_function->{name}:" if ($win64 && $current_function->{abi} eq "svr4"); undef $current_function; } } elsif (!$elf && $dir =~ /\.align/) { $self->{value} = ".p2align\t" . (log($$line)/log(2)); } elsif ($dir eq ".section") { $current_segment=$$line; if (!$elf && $current_segment eq ".init") { if ($flavour eq "macosx") { $self->{value} = ".mod_init_func"; } elsif ($flavour eq "mingw64") { $self->{value} = ".section\t.ctors"; } } } elsif ($dir =~ /\.(text|data)/) { $current_segment=".$1"; } elsif ($dir =~ /\.global|\.globl|\.extern/) { if ($flavour eq "macosx") { $self->{value} .= "\n.private_extern $$line"; } else { $self->{value} .= "\n.hidden $$line"; } } elsif ($dir =~ /\.hidden/) { if ($flavour eq "macosx") { $self->{value} = ".private_extern\t$prefix$$line"; } elsif ($flavour eq "mingw64") { $self->{value} = ""; } } elsif ($dir =~ /\.comm/) { $self->{value} = "$dir\t$prefix$$line"; $self->{value} =~ s|,([0-9]+),([0-9]+)$|",$1,".log($2)/log(2)|e if ($flavour eq "macosx"); } $$line = ""; return $self; } # non-gas case or nasm/masm SWITCH: for ($dir) { /\.text/ && do { my $v=undef; if ($nasm) { $v="section .text code align=64\n"; } else { $v="$current_segment\tENDS\n" if ($current_segment); $current_segment = ".text\$"; $v.="$current_segment\tSEGMENT "; $v.=$masm>=$masmref ? "ALIGN(256)" : "PAGE"; $v.=" 'CODE'"; } $self->{value} = $v; last; }; /\.data/ && do { my $v=undef; if ($nasm) { $v="section .data data align=8\n"; } else { $v="$current_segment\tENDS\n" if ($current_segment); $current_segment = "_DATA"; $v.="$current_segment\tSEGMENT"; } $self->{value} = $v; last; }; /\.section/ && do { my $v=undef; $$line =~ s/([^,]*).*/$1/; $$line = ".CRT\$XCU" if ($$line eq ".init"); if ($nasm) { $v="section $$line"; if ($$line=~/\.([px])data/) { $v.=" rdata align="; $v.=$1 eq "p"? 4 : 8; } elsif ($$line=~/\.CRT\$/i) { $v.=" rdata align=8"; } } else { $v="$current_segment\tENDS\n" if ($current_segment); $v.="$$line\tSEGMENT"; if ($$line=~/\.([px])data/) { $v.=" READONLY"; $v.=" ALIGN(".($1 eq "p" ? 4 : 8).")" if ($masm>=$masmref); } elsif ($$line=~/\.CRT\$/i) { $v.=" READONLY "; $v.=$masm>=$masmref ? "ALIGN(8)" : "DWORD"; } } $current_segment = $$line; $self->{value} = $v; last; }; /\.extern/ && do { $self->{value} = "EXTERN\t".$$line; $self->{value} .= ":NEAR" if ($masm); last; }; /\.globl|.global/ && do { $self->{value} = $masm?"PUBLIC":"global"; $self->{value} .= "\t".$$line; last; }; /\.size/ && do { if (defined($current_function)) { undef $self->{value}; if ($current_function->{abi} eq "svr4") { $self->{value}="${decor}SEH_end_$current_function->{name}:"; $self->{value}.=":\n" if($masm); } $self->{value}.="$current_function->{name}\tENDP" if($masm && $current_function->{name}); undef $current_function; } last; }; /\.align/ && do { my $max = ($masm && $masm>=$masmref) ? 256 : 4096; $self->{value} = "ALIGN\t".($$line>$max?$max:$$line); last; }; /\.(value|long|rva|quad)/ && do { my $sz = substr($1,0,1); my @arr = split(/,\s*/,$$line); my $last = pop(@arr); my $conv = sub { my $var=shift; $var=~s/^(0b[0-1]+)/oct($1)/eig; $var=~s/^0x([0-9a-f]+)/0$1h/ig if ($masm); if ($sz eq "D" && ($current_segment=~/.[px]data/ || $dir eq ".rva")) { $var=~s/^([_a-z\$\@][_a-z0-9\$\@]*)/$nasm?"$1 wrt ..imagebase":"imagerel $1"/egi; } $var; }; $sz =~ tr/bvlrq/BWDDQ/; $self->{value} = "\tD$sz\t"; for (@arr) { $self->{value} .= &$conv($_).","; } $self->{value} .= &$conv($last); last; }; /\.byte/ && do { my @str=split(/,\s*/,$$line); map(s/(0b[0-1]+)/oct($1)/eig,@str); map(s/0x([0-9a-f]+)/0$1h/ig,@str) if ($masm); while ($#str>15) { $self->{value}.="DB\t" .join(",",@str[0..15])."\n"; foreach (0..15) { shift @str; } } $self->{value}.="DB\t" .join(",",@str) if (@str); last; }; /\.comm/ && do { my @str=split(/,\s*/,$$line); my $v=undef; if ($nasm) { $v.="common $prefix@str[0] @str[1]"; } else { $v="$current_segment\tENDS\n" if ($current_segment); $current_segment = "_DATA"; $v.="$current_segment\tSEGMENT\n"; $v.="COMM @str[0]:DWORD:".@str[1]/4; } $self->{value} = $v; last; }; } $$line = ""; } $ret; } sub out { my $self = shift; $self->{value}; } } # Upon initial x86_64 introduction SSE>2 extensions were not introduced # yet. In order not to be bothered by tracing exact assembler versions, # but at the same time to provide a bare security minimum of AES-NI, we # hard-code some instructions. Extensions past AES-NI on the other hand # are traced by examining assembler version in individual perlasm # modules... my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); sub rex { my $opcode=shift; my ($dst,$src,$rex)=@_; $rex|=0x04 if($dst>=8); $rex|=0x01 if($src>=8); push @$opcode,($rex|0x40) if ($rex); } my $movq = sub { # elderly gas can't handle inter-register movq my $arg = shift; my @opcode=(0x66); if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) { my ($src,$dst)=($1,$2); if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } rex(\@opcode,$src,$dst,0x8); push @opcode,0x0f,0x7e; push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M @opcode; } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) { my ($src,$dst)=($2,$1); if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } rex(\@opcode,$src,$dst,0x8); push @opcode,0x0f,0x6e; push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M @opcode; } else { (); } }; my $pextrd = sub { if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { my @opcode=(0x66); my $imm=$1; my $src=$2; my $dst=$3; if ($dst =~ /%r([0-9]+)d/) { $dst = $1; } elsif ($dst =~ /%e/) { $dst = $regrm{$dst}; } rex(\@opcode,$src,$dst); push @opcode,0x0f,0x3a,0x16; push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M push @opcode,$imm; @opcode; } else { (); } }; my $pinsrd = sub { if (shift =~ /\$([0-9]+),\s*(%\w+),\s*%xmm([0-9]+)/) { my @opcode=(0x66); my $imm=$1; my $src=$2; my $dst=$3; if ($src =~ /%r([0-9]+)/) { $src = $1; } elsif ($src =~ /%e/) { $src = $regrm{$src}; } rex(\@opcode,$dst,$src); push @opcode,0x0f,0x3a,0x22; push @opcode,0xc0|(($dst&7)<<3)|($src&7); # ModR/M push @opcode,$imm; @opcode; } else { (); } }; my $pshufb = sub { if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) { my @opcode=(0x66); rex(\@opcode,$2,$1); push @opcode,0x0f,0x38,0x00; push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M @opcode; } else { (); } }; my $palignr = sub { if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { my @opcode=(0x66); rex(\@opcode,$3,$2); push @opcode,0x0f,0x3a,0x0f; push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M push @opcode,$1; @opcode; } else { (); } }; my $pclmulqdq = sub { if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { my @opcode=(0x66); rex(\@opcode,$3,$2); push @opcode,0x0f,0x3a,0x44; push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M my $c=$1; push @opcode,$c=~/^0/?oct($c):$c; @opcode; } else { (); } }; my $rdrand = sub { if (shift =~ /%[er](\w+)/) { my @opcode=(); my $dst=$1; if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } rex(\@opcode,0,$dst,8); push @opcode,0x0f,0xc7,0xf0|($dst&7); @opcode; } else { (); } }; my $rdseed = sub { if (shift =~ /%[er](\w+)/) { my @opcode=(); my $dst=$1; if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } rex(\@opcode,0,$dst,8); push @opcode,0x0f,0xc7,0xf8|($dst&7); @opcode; } else { (); } }; # Not all AVX-capable assemblers recognize AMD XOP extension. Since we # are using only two instructions hand-code them in order to be excused # from chasing assembler versions... sub rxb { my $opcode=shift; my ($dst,$src1,$src2,$rxb)=@_; $rxb|=0x7<<5; $rxb&=~(0x04<<5) if($dst>=8); $rxb&=~(0x01<<5) if($src1>=8); $rxb&=~(0x02<<5) if($src2>=8); push @$opcode,$rxb; } my $vprotd = sub { if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { my @opcode=(0x8f); rxb(\@opcode,$3,$2,-1,0x08); push @opcode,0x78,0xc2; push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M my $c=$1; push @opcode,$c=~/^0/?oct($c):$c; @opcode; } else { (); } }; my $vprotq = sub { if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { my @opcode=(0x8f); rxb(\@opcode,$3,$2,-1,0x08); push @opcode,0x78,0xc3; push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M my $c=$1; push @opcode,$c=~/^0/?oct($c):$c; @opcode; } else { (); } }; # Intel Control-flow Enforcement Technology extension. All functions and # indirect branch targets will have to start with this instruction... my $endbranch = sub { (0xf3,0x0f,0x1e,0xfa); }; ######################################################################## { my $comment = "#"; $comment = ";" if ($masm || $nasm); print <<___; $comment This file is generated from a similarly-named Perl script in the BoringSSL $comment source tree. Do not edit by hand. ___ } if ($nasm) { print <<___; default rel %define XMMWORD %define YMMWORD %define ZMMWORD ___ } elsif ($masm) { print <<___; OPTION DOTNAME ___ } if ($gas) { print <<___; #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) ___ } while(defined(my $line=<>)) { $line =~ s|\R$||; # Better chomp if ($nasm) { $line =~ s|^#ifdef |%ifdef |; $line =~ s|^#ifndef |%ifndef |; $line =~ s|^#endif|%endif|; $line =~ s|[#!].*$||; # get rid of asm-style comments... } else { # Get rid of asm-style comments but not preprocessor directives. The # former are identified by having a letter after the '#' and starting in # the first column. $line =~ s|!.*$||; $line =~ s|(?<=.)#.*$||; $line =~ s|^#([^a-z].*)?$||; } $line =~ s|/\*.*\*/||; # ... and C-style comments... $line =~ s|^\s+||; # ... and skip white spaces in beginning $line =~ s|\s+$||; # ... and at the end if (my $label=label->re(\$line)) { print $label->out(); } if (my $directive=directive->re(\$line)) { printf "%s",$directive->out(); } elsif (my $opcode=opcode->re(\$line)) { my $asm = eval("\$".$opcode->mnemonic()); if ((ref($asm) eq 'CODE') && scalar(my @bytes=&$asm($line))) { print $gas?".byte\t":"DB\t",join(',',@bytes),"\n"; next; } my @args; ARGUMENT: while (1) { my $arg; ($arg=register->re(\$line, $opcode))|| ($arg=const->re(\$line)) || ($arg=ea->re(\$line, $opcode)) || ($arg=expr->re(\$line, $opcode)) || last ARGUMENT; push @args,$arg; last ARGUMENT if ($line !~ /^,/); $line =~ s/^,\s*//; } # ARGUMENT: if ($#args>=0) { my $insn; my $sz=$opcode->size(); if ($gas) { $insn = $opcode->out($#args>=1?$args[$#args]->size():$sz); @args = map($_->out($sz),@args); printf "\t%s\t%s",$insn,join(",",@args); } else { $insn = $opcode->out(); foreach (@args) { my $arg = $_->out(); # $insn.=$sz compensates for movq, pinsrw, ... if ($arg =~ /^xmm[0-9]+$/) { $insn.=$sz; $sz="x" if(!$sz); last; } if ($arg =~ /^ymm[0-9]+$/) { $insn.=$sz; $sz="y" if(!$sz); last; } if ($arg =~ /^zmm[0-9]+$/) { $insn.=$sz; $sz="z" if(!$sz); last; } if ($arg =~ /^mm[0-9]+$/) { $insn.=$sz; $sz="q" if(!$sz); last; } } @args = reverse(@args); undef $sz if ($nasm && $opcode->mnemonic() eq "lea"); printf "\t%s\t%s",$insn,join(",",map($_->out($sz),@args)); } } else { printf "\t%s",$opcode->out(); } } print $line,"\n"; } print "\n$current_segment\tENDS\n" if ($current_segment && $masm); print "END\n" if ($masm); print "#endif\n" if ($gas); close STDOUT or die "error closing STDOUT"; ################################################# # Cross-reference x86_64 ABI "card" # # Unix Win64 # %rax * * # %rbx - - # %rcx #4 #1 # %rdx #3 #2 # %rsi #2 - # %rdi #1 - # %rbp - - # %rsp - - # %r8 #5 #3 # %r9 #6 #4 # %r10 * * # %r11 * * # %r12 - - # %r13 - - # %r14 - - # %r15 - - # # (*) volatile register # (-) preserved by callee # (#) Nth argument, volatile # # In Unix terms top of stack is argument transfer area for arguments # which could not be accommodated in registers. Or in other words 7th # [integer] argument resides at 8(%rsp) upon function entry point. # 128 bytes above %rsp constitute a "red zone" which is not touched # by signal handlers and can be used as temporal storage without # allocating a frame. # # In Win64 terms N*8 bytes on top of stack is argument transfer area, # which belongs to/can be overwritten by callee. N is the number of # arguments passed to callee, *but* not less than 4! This means that # upon function entry point 5th argument resides at 40(%rsp), as well # as that 32 bytes from 8(%rsp) can always be used as temporal # storage [without allocating a frame]. One can actually argue that # one can assume a "red zone" above stack pointer under Win64 as well. # Point is that at apparently no occasion Windows kernel would alter # the area above user stack pointer in true asynchronous manner... # # All the above means that if assembler programmer adheres to Unix # register and stack layout, but disregards the "red zone" existence, # it's possible to use following prologue and epilogue to "gear" from # Unix to Win64 ABI in leaf functions with not more than 6 arguments. # # omnipotent_function: # ifdef WIN64 # movq %rdi,8(%rsp) # movq %rsi,16(%rsp) # movq %rcx,%rdi ; if 1st argument is actually present # movq %rdx,%rsi ; if 2nd argument is actually ... # movq %r8,%rdx ; if 3rd argument is ... # movq %r9,%rcx ; if 4th argument ... # movq 40(%rsp),%r8 ; if 5th ... # movq 48(%rsp),%r9 ; if 6th ... # endif # ... # ifdef WIN64 # movq 8(%rsp),%rdi # movq 16(%rsp),%rsi # endif # ret # ################################################# # Win64 SEH, Structured Exception Handling. # # Unlike on Unix systems(*) lack of Win64 stack unwinding information # has undesired side-effect at run-time: if an exception is raised in # assembler subroutine such as those in question (basically we're # referring to segmentation violations caused by malformed input # parameters), the application is briskly terminated without invoking # any exception handlers, most notably without generating memory dump # or any user notification whatsoever. This poses a problem. It's # possible to address it by registering custom language-specific # handler that would restore processor context to the state at # subroutine entry point and return "exception is not handled, keep # unwinding" code. Writing such handler can be a challenge... But it's # doable, though requires certain coding convention. Consider following # snippet: # # .type function,@function # function: # movq %rsp,%rax # copy rsp to volatile register # pushq %r15 # save non-volatile registers # pushq %rbx # pushq %rbp # movq %rsp,%r11 # subq %rdi,%r11 # prepare [variable] stack frame # andq $-64,%r11 # movq %rax,0(%r11) # check for exceptions # movq %r11,%rsp # allocate [variable] stack frame # movq %rax,0(%rsp) # save original rsp value # magic_point: # ... # movq 0(%rsp),%rcx # pull original rsp value # movq -24(%rcx),%rbp # restore non-volatile registers # movq -16(%rcx),%rbx # movq -8(%rcx),%r15 # movq %rcx,%rsp # restore original rsp # magic_epilogue: # ret # .size function,.-function # # The key is that up to magic_point copy of original rsp value remains # in chosen volatile register and no non-volatile register, except for # rsp, is modified. While past magic_point rsp remains constant till # the very end of the function. In this case custom language-specific # exception handler would look like this: # # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) # { ULONG64 *rsp = (ULONG64 *)context->Rax; # ULONG64 rip = context->Rip; # # if (rip >= magic_point) # { rsp = (ULONG64 *)context->Rsp; # if (rip < magic_epilogue) # { rsp = (ULONG64 *)rsp[0]; # context->Rbp = rsp[-3]; # context->Rbx = rsp[-2]; # context->R15 = rsp[-1]; # } # } # context->Rsp = (ULONG64)rsp; # context->Rdi = rsp[1]; # context->Rsi = rsp[2]; # # memcpy (disp->ContextRecord,context,sizeof(CONTEXT)); # RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp->ImageBase, # dips->ControlPc,disp->FunctionEntry,disp->ContextRecord, # &disp->HandlerData,&disp->EstablisherFrame,NULL); # return ExceptionContinueSearch; # } # # It's appropriate to implement this handler in assembler, directly in # function's module. In order to do that one has to know members' # offsets in CONTEXT and DISPATCHER_CONTEXT structures and some constant # values. Here they are: # # CONTEXT.Rax 120 # CONTEXT.Rcx 128 # CONTEXT.Rdx 136 # CONTEXT.Rbx 144 # CONTEXT.Rsp 152 # CONTEXT.Rbp 160 # CONTEXT.Rsi 168 # CONTEXT.Rdi 176 # CONTEXT.R8 184 # CONTEXT.R9 192 # CONTEXT.R10 200 # CONTEXT.R11 208 # CONTEXT.R12 216 # CONTEXT.R13 224 # CONTEXT.R14 232 # CONTEXT.R15 240 # CONTEXT.Rip 248 # CONTEXT.Xmm6 512 # sizeof(CONTEXT) 1232 # DISPATCHER_CONTEXT.ControlPc 0 # DISPATCHER_CONTEXT.ImageBase 8 # DISPATCHER_CONTEXT.FunctionEntry 16 # DISPATCHER_CONTEXT.EstablisherFrame 24 # DISPATCHER_CONTEXT.TargetIp 32 # DISPATCHER_CONTEXT.ContextRecord 40 # DISPATCHER_CONTEXT.LanguageHandler 48 # DISPATCHER_CONTEXT.HandlerData 56 # UNW_FLAG_NHANDLER 0 # ExceptionContinueSearch 1 # # In order to tie the handler to the function one has to compose # couple of structures: one for .xdata segment and one for .pdata. # # UNWIND_INFO structure for .xdata segment would be # # function_unwind_info: # .byte 9,0,0,0 # .rva handler # # This structure designates exception handler for a function with # zero-length prologue, no stack frame or frame register. # # To facilitate composing of .pdata structures, auto-generated "gear" # prologue copies rsp value to rax and denotes next instruction with # .LSEH_begin_{function_name} label. This essentially defines the SEH # styling rule mentioned in the beginning. Position of this label is # chosen in such manner that possible exceptions raised in the "gear" # prologue would be accounted to caller and unwound from latter's frame. # End of function is marked with respective .LSEH_end_{function_name} # label. To summarize, .pdata segment would contain # # .rva .LSEH_begin_function # .rva .LSEH_end_function # .rva function_unwind_info # # Reference to function_unwind_info from .xdata segment is the anchor. # In case you wonder why references are 32-bit .rvas and not 64-bit # .quads. References put into these two segments are required to be # *relative* to the base address of the current binary module, a.k.a. # image base. No Win64 module, be it .exe or .dll, can be larger than # 2GB and thus such relative references can be and are accommodated in # 32 bits. # # Having reviewed the example function code, one can argue that "movq # %rsp,%rax" above is redundant. It is not! Keep in mind that on Unix # rax would contain an undefined value. If this "offends" you, use # another register and refrain from modifying rax till magic_point is # reached, i.e. as if it was a non-volatile register. If more registers # are required prior [variable] frame setup is completed, note that # nobody says that you can have only one "magic point." You can # "liberate" non-volatile registers by denoting last stack off-load # instruction and reflecting it in finer grade unwind logic in handler. # After all, isn't it why it's called *language-specific* handler... # # SE handlers are also involved in unwinding stack when executable is # profiled or debugged. Profiling implies additional limitations that # are too subtle to discuss here. For now it's sufficient to say that # in order to simplify handlers one should either a) offload original # %rsp to stack (like discussed above); or b) if you have a register to # spare for frame pointer, choose volatile one. # # (*) Note that we're talking about run-time, not debug-time. Lack of # unwind information makes debugging hard on both Windows and # Unix. "Unlike" refers to the fact that on Unix signal handler # will always be invoked, core dumped and appropriate exit code # returned to parent (for user notification). ring-0.16.9/crypto/perlasm/x86asm.pl000064400000000000000000000174011352416253600154140ustar0000000000000000#! /usr/bin/env perl # Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html # require 'x86asm.pl'; # &asm_init([,$i386only]); # &function_begin("foo"); # ... # &function_end("foo"); # &asm_finish $out=(); $i386=0; # AUTOLOAD is this context has quite unpleasant side effect, namely # that typos in function calls effectively go to assembler output, # but on the pros side we don't have to implement one subroutine per # each opcode... sub ::AUTOLOAD { my $opcode = $AUTOLOAD; die "more than 4 arguments passed to $opcode" if ($#_>3); $opcode =~ s/.*:://; if ($opcode =~ /^push/) { $stack+=4; } elsif ($opcode =~ /^pop/) { $stack-=4; } &generic($opcode,@_) or die "undefined subroutine \&$AUTOLOAD"; } sub ::emit { my $opcode=shift; if ($#_==-1) { push(@out,"\t$opcode\n"); } else { push(@out,"\t$opcode\t".join(',',@_)."\n"); } } sub ::LB { $_[0] =~ m/^e?([a-d])x$/o or die "$_[0] does not have a 'low byte'"; $1."l"; } sub ::HB { $_[0] =~ m/^e?([a-d])x$/o or die "$_[0] does not have a 'high byte'"; $1."h"; } sub ::stack_push{ my $num=$_[0]*4; $stack+=$num; &sub("esp",$num); } sub ::stack_pop { my $num=$_[0]*4; $stack-=$num; &add("esp",$num); } sub ::blindpop { &pop($_[0]); $stack+=4; } sub ::wparam { &DWP($stack+4*$_[0],"esp"); } sub ::swtmp { &DWP(4*$_[0],"esp"); } sub ::bswap { if ($i386) # emulate bswap for i386 { &comment("bswap @_"); &xchg(&HB(@_),&LB(@_)); &ror (@_,16); &xchg(&HB(@_),&LB(@_)); } else { &generic("bswap",@_); } } # These are made-up opcodes introduced over the years essentially # by ignorance, just alias them to real ones... sub ::movb { &mov(@_); } sub ::xorb { &xor(@_); } sub ::rotl { &rol(@_); } sub ::rotr { &ror(@_); } sub ::exch { &xchg(@_); } sub ::halt { &hlt; } sub ::movz { &movzx(@_); } sub ::pushf { &pushfd; } sub ::popf { &popfd; } # 3 argument instructions sub ::movq { my($p1,$p2,$optimize)=@_; if ($optimize && $p1=~/^mm[0-7]$/ && $p2=~/^mm[0-7]$/) # movq between mmx registers can sink Intel CPUs { &::pshufw($p1,$p2,0xe4); } else { &::generic("movq",@_); } } # SSE>2 instructions my %regrm = ( "eax"=>0, "ecx"=>1, "edx"=>2, "ebx"=>3, "esp"=>4, "ebp"=>5, "esi"=>6, "edi"=>7 ); sub ::pextrd { my($dst,$src,$imm)=@_; if ("$dst:$src" =~ /(e[a-dsd][ixp]):xmm([0-7])/) { &::data_byte(0x66,0x0f,0x3a,0x16,0xc0|($2<<3)|$regrm{$1},$imm); } else { &::generic("pextrd",@_); } } sub ::pinsrd { my($dst,$src,$imm)=@_; if ("$dst:$src" =~ /xmm([0-7]):(e[a-dsd][ixp])/) { &::data_byte(0x66,0x0f,0x3a,0x22,0xc0|($1<<3)|$regrm{$2},$imm); } else { &::generic("pinsrd",@_); } } sub ::pshufb { my($dst,$src)=@_; if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) { &data_byte(0x66,0x0f,0x38,0x00,0xc0|($1<<3)|$2); } else { &::generic("pshufb",@_); } } sub ::palignr { my($dst,$src,$imm)=@_; if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) { &::data_byte(0x66,0x0f,0x3a,0x0f,0xc0|($1<<3)|$2,$imm); } else { &::generic("palignr",@_); } } sub ::pclmulqdq { my($dst,$src,$imm)=@_; if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) { &::data_byte(0x66,0x0f,0x3a,0x44,0xc0|($1<<3)|$2,$imm); } else { &::generic("pclmulqdq",@_); } } sub ::rdrand { my ($dst)=@_; if ($dst =~ /(e[a-dsd][ixp])/) { &::data_byte(0x0f,0xc7,0xf0|$regrm{$dst}); } else { &::generic("rdrand",@_); } } sub ::rdseed { my ($dst)=@_; if ($dst =~ /(e[a-dsd][ixp])/) { &::data_byte(0x0f,0xc7,0xf8|$regrm{$dst}); } else { &::generic("rdrand",@_); } } sub rxb { local *opcode=shift; my ($dst,$src1,$src2,$rxb)=@_; $rxb|=0x7<<5; $rxb&=~(0x04<<5) if($dst>=8); $rxb&=~(0x01<<5) if($src1>=8); $rxb&=~(0x02<<5) if($src2>=8); push @opcode,$rxb; } sub ::vprotd { my $args=join(',',@_); if ($args =~ /xmm([0-7]),xmm([0-7]),([x0-9a-f]+)/) { my @opcode=(0x8f); rxb(\@opcode,$1,$2,-1,0x08); push @opcode,0x78,0xc2; push @opcode,0xc0|($2&7)|(($1&7)<<3); # ModR/M my $c=$3; push @opcode,$c=~/^0/?oct($c):$c; &::data_byte(@opcode); } else { &::generic("vprotd",@_); } } sub ::endbranch { &::data_byte(0xf3,0x0f,0x1e,0xfb); } # label management $lbdecor="L"; # local label decoration, set by package $label="000"; sub ::islabel # see is argument is a known label { my $i; foreach $i (values %label) { return $i if ($i eq $_[0]); } $label{$_[0]}; # can be undef } sub ::label # instantiate a function-scope label { if (!defined($label{$_[0]})) { $label{$_[0]}="${lbdecor}${label}${_[0]}"; $label++; } $label{$_[0]}; } sub ::LABEL # instantiate a file-scope label { $label{$_[0]}=$_[1] if (!defined($label{$_[0]})); $label{$_[0]}; } sub ::static_label { &::LABEL($_[0],$lbdecor.$_[0]); } sub ::set_label_B { push(@out,"@_:\n"); } sub ::set_label { my $label=&::label($_[0]); &::align($_[1]) if ($_[1]>1); &::set_label_B($label); $label; } sub ::wipe_labels # wipes function-scope labels { foreach $i (keys %label) { delete $label{$i} if ($label{$i} =~ /^\Q${lbdecor}\E[0-9]{3}/); } } # subroutine management sub ::function_begin { &function_begin_B(@_); $stack=4; &push("ebp"); &push("ebx"); &push("esi"); &push("edi"); } sub ::function_end { &pop("edi"); &pop("esi"); &pop("ebx"); &pop("ebp"); &ret(); &function_end_B(@_); $stack=0; &wipe_labels(); } sub ::function_end_A { &pop("edi"); &pop("esi"); &pop("ebx"); &pop("ebp"); &ret(); $stack+=16; # readjust esp as if we didn't pop anything } sub ::asciz { my @str=unpack("C*",shift); push @str,0; while ($#str>15) { &data_byte(@str[0..15]); foreach (0..15) { shift @str; } } &data_byte(@str) if (@str); } sub ::asm_finish { &file_end(); my $comment = "#"; $comment = ";" if ($win32 || $netware); print <<___; $comment This file is generated from a similarly-named Perl script in the BoringSSL $comment source tree. Do not edit by hand. ___ if ($win32 || $netware) { print <<___ unless $masm; %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif ___ } else { print <<___; #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif ___ } print @out; print "#endif\n" unless ($win32 || $netware); } sub ::asm_init { my ($type,$cpu)=@_; $i386=$cpu; $elf=$cpp=$coff=$aout=$macosx=$win32=$netware=$mwerks=$android=0; if (($type eq "elf")) { $elf=1; require "x86gas.pl"; } elsif (($type eq "elf-1")) { $elf=-1; require "x86gas.pl"; } elsif (($type eq "a\.out")) { $aout=1; require "x86gas.pl"; } elsif (($type eq "coff" or $type eq "gaswin")) { $coff=1; require "x86gas.pl"; } elsif (($type eq "win32n")) { $win32=1; require "x86nasm.pl"; } elsif (($type eq "nw-nasm")) { $netware=1; require "x86nasm.pl"; } #elsif (($type eq "nw-mwasm")) #{ $netware=1; $mwerks=1; require "x86nasm.pl"; } elsif (($type eq "win32")) { $win32=1; $masm=1; require "x86masm.pl"; } elsif (($type eq "macosx")) { $aout=1; $macosx=1; require "x86gas.pl"; } elsif (($type eq "android")) { $elf=1; $android=1; require "x86gas.pl"; } else { print STDERR <<"EOF"; Pick one target type from elf - Linux, FreeBSD, Solaris x86, etc. a.out - DJGPP, elder OpenBSD, etc. coff - GAS/COFF such as Win32 targets win32n - Windows 95/Windows NT NASM format nw-nasm - NetWare NASM format macosx - Mac OS X EOF exit(1); } $pic=0; for (@ARGV) { $pic=1 if (/\-[fK]PIC/i); } &file(); } sub ::hidden {} 1; ring-0.16.9/crypto/perlasm/x86gas.pl000064400000000000000000000146311352416253600154100ustar0000000000000000#! /usr/bin/env perl # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html package x86gas; *out=\@::out; $::lbdecor=$::aout?"L":".L"; # local label decoration $nmdecor=($::aout or $::coff)?"_":""; # external name decoration $initseg=""; $align=16; $align=log($align)/log(2) if ($::aout); $com_start="#" if ($::aout or $::coff); sub opsize() { my $reg=shift; if ($reg =~ m/^%e/o) { "l"; } elsif ($reg =~ m/^%[a-d][hl]$/o) { "b"; } elsif ($reg =~ m/^%[yxm]/o) { undef; } else { "w"; } } # swap arguments; # expand opcode with size suffix; # prefix numeric constants with $; sub ::generic { my($opcode,@arg)=@_; my($suffix,$dst,$src); @arg=reverse(@arg); for (@arg) { s/^(\*?)(e?[a-dsixphl]{2})$/$1%$2/o; # gp registers s/^([xy]?mm[0-7])$/%$1/o; # xmm/mmx registers s/^(\-?[0-9]+)$/\$$1/o; # constants s/^(\-?0x[0-9a-f]+)$/\$$1/o; # constants } $dst = $arg[$#arg] if ($#arg>=0); $src = $arg[$#arg-1] if ($#arg>=1); if ($dst =~ m/^%/o) { $suffix=&opsize($dst); } elsif ($src =~ m/^%/o) { $suffix=&opsize($src); } else { $suffix="l"; } undef $suffix if ($dst =~ m/^%[xm]/o || $src =~ m/^%[xm]/o); if ($#_==0) { &::emit($opcode); } elsif ($#_==1 && $opcode =~ m/^(call|clflush|j|loop|set)/o) { &::emit($opcode,@arg); } else { &::emit($opcode.$suffix,@arg);} 1; } # # opcodes not covered by ::generic above, mostly inconsistent namings... # sub ::movzx { &::movzb(@_); } sub ::pushfd { &::pushfl; } sub ::popfd { &::popfl; } sub ::cpuid { &::emit(".byte\t0x0f,0xa2"); } sub ::rdtsc { &::emit(".byte\t0x0f,0x31"); } sub ::call { &::emit("call",(&::islabel($_[0]) or "$nmdecor$_[0]")); } sub ::call_ptr { &::generic("call","*$_[0]"); } sub ::jmp_ptr { &::generic("jmp","*$_[0]"); } *::bswap = sub { &::emit("bswap","%$_[0]"); } if (!$::i386); sub ::DWP { my($addr,$reg1,$reg2,$idx)=@_; my $ret=""; if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } $addr =~ s/^\s+//; # prepend global references with optional underscore $addr =~ s/^([^\+\-0-9][^\+\-]*)/&::islabel($1) or "$nmdecor$1"/ige; $reg1 = "%$reg1" if ($reg1); $reg2 = "%$reg2" if ($reg2); $ret .= $addr if (($addr ne "") && ($addr ne 0)); if ($reg2) { $idx!= 0 or $idx=1; $ret .= "($reg1,$reg2,$idx)"; } elsif ($reg1) { $ret .= "($reg1)"; } $ret; } sub ::QWP { &::DWP(@_); } sub ::BP { &::DWP(@_); } sub ::WP { &::DWP(@_); } sub ::BC { @_; } sub ::DWC { @_; } sub ::file { push(@out,".text\n"); } sub ::function_begin_B { my $func=shift; my $global=($func !~ /^_/); my $begin="${::lbdecor}_${func}_begin"; &::LABEL($func,$global?"$begin":"$nmdecor$func"); $func=$nmdecor.$func; push(@out,".globl\t$func\n") if ($global); if ($::macosx) { push(@out,".private_extern\t$func\n"); } else { push(@out,".hidden\t$func\n"); } if ($::coff) { push(@out,".def\t$func;\t.scl\t".(3-$global).";\t.type\t32;\t.endef\n"); } elsif (($::aout and !$::pic) or $::macosx) { } else { push(@out,".type $func,\@function\n"); } push(@out,".align\t$align\n"); push(@out,"$func:\n"); push(@out,"$begin:\n") if ($global); $::stack=4; } sub ::function_end_B { my $func=shift; push(@out,".size\t$nmdecor$func,.-".&::LABEL($func)."\n") if ($::elf); $::stack=0; &::wipe_labels(); } sub ::comment { if (!defined($com_start) or $::elf) { # Regarding $::elf above... # GNU and SVR4 as'es use different comment delimiters, push(@out,"\n"); # so we just skip ELF comments... return; } foreach (@_) { if (/^\s*$/) { push(@out,"\n"); } else { push(@out,"\t$com_start $_ $com_end\n"); } } } sub ::external_label { foreach(@_) { &::LABEL($_,$nmdecor.$_); } } sub ::public_label { push(@out,".globl\t".&::LABEL($_[0],$nmdecor.$_[0])."\n"); } sub ::file_end { if ($::macosx) { if (%non_lazy_ptr) { push(@out,".section __IMPORT,__pointers,non_lazy_symbol_pointers\n"); foreach $i (keys %non_lazy_ptr) { push(@out,"$non_lazy_ptr{$i}:\n.indirect_symbol\t$i\n.long\t0\n"); } } } if (0 && grep {/\b${nmdecor}GFp_ia32cap_P\b/i} @out) { my $tmp=".comm\t${nmdecor}GFp_ia32cap_P,16"; if ($::macosx) { push (@out,"$tmp,2\n"); } elsif ($::elf) { push (@out,"$tmp,4\n"); } else { push (@out,"$tmp\n"); } } push(@out,$initseg) if ($initseg); } sub ::data_byte { push(@out,".byte\t".join(',',@_)."\n"); } sub ::data_short{ push(@out,".value\t".join(',',@_)."\n"); } sub ::data_word { push(@out,".long\t".join(',',@_)."\n"); } sub ::align { my $val=$_[0]; if ($::aout) { $val=int(log($val)/log(2)); $val.=",0x90"; } push(@out,".align\t$val\n"); } sub ::picmeup { my($dst,$sym,$base,$reflabel)=@_; if (($::pic && ($::elf || $::aout)) || $::macosx) { if (!defined($base)) { &::call(&::label("PIC_me_up")); &::set_label("PIC_me_up"); &::blindpop($dst); $base=$dst; $reflabel=&::label("PIC_me_up"); } if ($::macosx) { my $indirect=&::static_label("$nmdecor$sym\$non_lazy_ptr"); &::mov($dst,&::DWP("$indirect-$reflabel",$base)); $non_lazy_ptr{"$nmdecor$sym"}=$indirect; } elsif ($sym eq "GFp_ia32cap_P" && $::elf>0) { &::lea($dst,&::DWP("$sym-$reflabel",$base)); } else { &::lea($dst,&::DWP("_GLOBAL_OFFSET_TABLE_+[.-$reflabel]", $base)); &::mov($dst,&::DWP("$sym\@GOT",$dst)); } } else { &::lea($dst,&::DWP($sym)); } } sub ::initseg { my $f=$nmdecor.shift; if ($::android) { $initseg.=<<___; .section .init_array .align 4 .long $f ___ } elsif ($::elf) { $initseg.=<<___; .section .init call $f ___ } elsif ($::coff) { $initseg.=<<___; # applies to both Cygwin and Mingw .section .ctors .long $f ___ } elsif ($::macosx) { $initseg.=<<___; .mod_init_func .align 2 .long $f ___ } elsif ($::aout) { my $ctor="${nmdecor}_GLOBAL_\$I\$$f"; $initseg.=".text\n"; $initseg.=".type $ctor,\@function\n" if ($::pic); $initseg.=<<___; # OpenBSD way... .globl $ctor .align 2 $ctor: jmp $f ___ } } sub ::dataseg { push(@out,".data\n"); } *::hidden = sub { push(@out,".hidden\t$nmdecor$_[0]\n"); } if ($::elf); 1; ring-0.16.9/crypto/perlasm/x86nasm.pl000064400000000000000000000112471352331573000155670ustar0000000000000000#! /usr/bin/env perl # Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the OpenSSL license (the "License"). You may not use # this file except in compliance with the License. You can obtain a copy # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html package x86nasm; *out=\@::out; $::lbdecor="L\$"; # local label decoration $nmdecor=$::netware?"":"_"; # external name decoration $drdecor=$::mwerks?".":""; # directive decoration $initseg=""; sub ::generic { my $opcode=shift; my $tmp; if (!$::mwerks) { if ($opcode =~ m/^j/o && $#_==0) # optimize jumps { $_[0] = "NEAR $_[0]"; } elsif ($opcode eq "lea" && $#_==1) # wipe storage qualifier from lea { $_[1] =~ s/^[^\[]*\[/\[/o; } elsif ($opcode eq "clflush" && $#_==0) { $_[0] =~ s/^[^\[]*\[/\[/o; } } &::emit($opcode,@_); 1; } # # opcodes not covered by ::generic above, mostly inconsistent namings... # sub ::call { &::emit("call",(&::islabel($_[0]) or "$nmdecor$_[0]")); } sub ::call_ptr { &::emit("call",@_); } sub ::jmp_ptr { &::emit("jmp",@_); } sub get_mem { my($size,$addr,$reg1,$reg2,$idx)=@_; my($post,$ret); if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } if ($size ne "") { $ret .= "$size"; $ret .= " PTR" if ($::mwerks); $ret .= " "; } $ret .= "["; $addr =~ s/^\s+//; # prepend global references with optional underscore $addr =~ s/^([^\+\-0-9][^\+\-]*)/::islabel($1) or "$nmdecor$1"/ige; # put address arithmetic expression in parenthesis $addr="($addr)" if ($addr =~ /^.+[\-\+].+$/); if (($addr ne "") && ($addr ne 0)) { if ($addr !~ /^-/) { $ret .= "$addr+"; } else { $post=$addr; } } if ($reg2 ne "") { $idx!=0 or $idx=1; $ret .= "$reg2*$idx"; $ret .= "+$reg1" if ($reg1 ne ""); } else { $ret .= "$reg1"; } $ret .= "$post]"; $ret =~ s/\+\]/]/; # in case $addr was the only argument $ret; } sub ::BP { &get_mem("BYTE",@_); } sub ::DWP { &get_mem("DWORD",@_); } sub ::WP { &get_mem("WORD",@_); } sub ::QWP { &get_mem("",@_); } sub ::BC { (($::mwerks)?"":"BYTE ")."@_"; } sub ::DWC { (($::mwerks)?"":"DWORD ")."@_"; } sub ::file { if ($::mwerks) { push(@out,".section\t.text,64\n"); } else { my $tmp=<<___; %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes @feat.00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else \$\@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ___ push(@out,$tmp); } } sub ::function_begin_B { my $func=shift; my $global=($func !~ /^_/); my $begin="${::lbdecor}_${func}_begin"; $begin =~ s/^\@/./ if ($::mwerks); # the torture never stops &::LABEL($func,$global?"$begin":"$nmdecor$func"); $func=$nmdecor.$func; push(@out,"${drdecor}global $func\n") if ($global); push(@out,"${drdecor}align 16\n"); push(@out,"$func:\n"); push(@out,"$begin:\n") if ($global); $::stack=4; } sub ::function_end_B { $::stack=0; &::wipe_labels(); } sub ::file_end { if (grep {/\b${nmdecor}GFp_ia32cap_P\b/i} @out) { my $comm=<<___; ${drdecor}segment .bss ${drdecor}common ${nmdecor}GFp_ia32cap_P 16 ___ # comment out GFp_ia32cap_P declarations grep {s/(^extern\s+${nmdecor}GFp_ia32cap_P)/\;$1/} @out; push (@out,$comm) } push (@out,$initseg) if ($initseg); } sub ::comment { foreach (@_) { push(@out,"\t; $_\n"); } } sub ::external_label { foreach(@_) { push(@out,"${drdecor}extern\t".&::LABEL($_,$nmdecor.$_)."\n"); } } sub ::public_label { push(@out,"${drdecor}global\t".&::LABEL($_[0],$nmdecor.$_[0])."\n"); } sub ::data_byte { push(@out,(($::mwerks)?".byte\t":"db\t").join(',',@_)."\n"); } sub ::data_short { push(@out,(($::mwerks)?".word\t":"dw\t").join(',',@_)."\n"); } sub ::data_word { push(@out,(($::mwerks)?".long\t":"dd\t").join(',',@_)."\n"); } sub ::align { push(@out,"${drdecor}align\t$_[0]\n"); } sub ::picmeup { my($dst,$sym)=@_; &::lea($dst,&::DWP($sym)); } sub ::initseg { my $f=$nmdecor.shift; if ($::win32) { $initseg=<<___; segment .CRT\$XCU data align=4 extern $f dd $f ___ } } sub ::dataseg { if ($mwerks) { push(@out,".section\t.data,4\n"); } else { push(@out,"section\t.data align=4\n"); } } sub ::safeseh { my $nm=shift; push(@out,"%if __NASM_VERSION_ID__ >= 0x02030000\n"); push(@out,"safeseh ".&::LABEL($nm,$nmdecor.$nm)."\n"); push(@out,"%endif\n"); } 1; ring-0.16.9/crypto/poly1305/asm/poly1305-armv4.pl000064400000000000000000000715421352416253600172300ustar0000000000000000#!/usr/bin/env perl # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # IALU(*)/gcc-4.4 NEON # # ARM11xx(ARMv6) 7.78/+100% - # Cortex-A5 6.35/+130% 3.00 # Cortex-A8 6.25/+115% 2.36 # Cortex-A9 5.10/+95% 2.55 # Cortex-A15 3.85/+85% 1.25(**) # Snapdragon S4 5.70/+100% 1.48(**) # # (*) this is for -march=armv6, i.e. with bunch of ldrb loading data; # (**) these are trade-off results, they can be improved by ~8% but at # the cost of 15/12% regression on Cortex-A5/A7, it's even possible # to improve Cortex-A9 result, but then A5/A7 loose more than 20%; $flavour = shift; if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } if ($flavour && $flavour ne "void") { $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open STDOUT,"| \"$^X\" $xlate $flavour $output"; } else { open STDOUT,">$output"; } ($ctx,$inp,$len,$padbit)=map("r$_",(0..3)); $code.=<<___; #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .globl GFp_poly1305_emit .globl GFp_poly1305_blocks .globl GFp_poly1305_init_asm .type GFp_poly1305_init_asm,%function .align 5 GFp_poly1305_init_asm: .Lpoly1305_init: stmdb sp!,{r4-r11} eor r3,r3,r3 cmp $inp,#0 str r3,[$ctx,#0] @ zero hash value str r3,[$ctx,#4] str r3,[$ctx,#8] str r3,[$ctx,#12] str r3,[$ctx,#16] str r3,[$ctx,#36] @ is_base2_26 add $ctx,$ctx,#20 #ifdef __thumb2__ it eq #endif moveq r0,#0 beq .Lno_key #if __ARM_MAX_ARCH__>=7 adr r11,.Lpoly1305_init ldr r12,.LOPENSSL_armcap #endif ldrb r4,[$inp,#0] mov r10,#0x0fffffff ldrb r5,[$inp,#1] and r3,r10,#-4 @ 0x0ffffffc ldrb r6,[$inp,#2] ldrb r7,[$inp,#3] orr r4,r4,r5,lsl#8 ldrb r5,[$inp,#4] orr r4,r4,r6,lsl#16 ldrb r6,[$inp,#5] orr r4,r4,r7,lsl#24 ldrb r7,[$inp,#6] and r4,r4,r10 #if __ARM_MAX_ARCH__>=7 ldr r12,[r11,r12] @ GFp_armcap_P # ifdef __APPLE__ ldr r12,[r12] # endif #endif ldrb r8,[$inp,#7] orr r5,r5,r6,lsl#8 ldrb r6,[$inp,#8] orr r5,r5,r7,lsl#16 ldrb r7,[$inp,#9] orr r5,r5,r8,lsl#24 ldrb r8,[$inp,#10] and r5,r5,r3 #if __ARM_MAX_ARCH__>=7 tst r12,#ARMV7_NEON @ check for NEON # ifdef __APPLE__ adr r9,poly1305_blocks_neon adr r11,GFp_poly1305_blocks # ifdef __thumb2__ it ne # endif movne r11,r9 adr r12,GFp_poly1305_emit adr r10,poly1305_emit_neon # ifdef __thumb2__ it ne # endif movne r12,r10 # else # ifdef __thumb2__ itete eq # endif addeq r12,r11,#(GFp_poly1305_emit-.Lpoly1305_init) addne r12,r11,#(poly1305_emit_neon-.Lpoly1305_init) addeq r11,r11,#(GFp_poly1305_blocks-.Lpoly1305_init) addne r11,r11,#(poly1305_blocks_neon-.Lpoly1305_init) # endif # ifdef __thumb2__ orr r12,r12,#1 @ thumb-ify address orr r11,r11,#1 # endif #endif ldrb r9,[$inp,#11] orr r6,r6,r7,lsl#8 ldrb r7,[$inp,#12] orr r6,r6,r8,lsl#16 ldrb r8,[$inp,#13] orr r6,r6,r9,lsl#24 ldrb r9,[$inp,#14] and r6,r6,r3 ldrb r10,[$inp,#15] orr r7,r7,r8,lsl#8 str r4,[$ctx,#0] orr r7,r7,r9,lsl#16 str r5,[$ctx,#4] orr r7,r7,r10,lsl#24 str r6,[$ctx,#8] and r7,r7,r3 str r7,[$ctx,#12] #if __ARM_MAX_ARCH__>=7 stmia r2,{r11,r12} @ fill functions table mov r0,#1 #else mov r0,#0 #endif .Lno_key: ldmia sp!,{r4-r11} #if __ARM_ARCH__>=5 ret @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm ___ { my ($h0,$h1,$h2,$h3,$h4,$r0,$r1,$r2,$r3)=map("r$_",(4..12)); my ($s1,$s2,$s3)=($r1,$r2,$r3); $code.=<<___; .type GFp_poly1305_blocks,%function .align 5 GFp_poly1305_blocks: stmdb sp!,{r3-r11,lr} ands $len,$len,#-16 beq .Lno_data cmp $padbit,#0 add $len,$len,$inp @ end pointer sub sp,sp,#32 ldmia $ctx,{$h0-$r3} @ load context str $ctx,[sp,#12] @ offload stuff mov lr,$inp str $len,[sp,#16] str $r1,[sp,#20] str $r2,[sp,#24] str $r3,[sp,#28] b .Loop .Loop: #if __ARM_ARCH__<7 ldrb r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi $h4,$h4,#1 @ 1<<128 ldrb r1,[lr,#-15] ldrb r2,[lr,#-14] ldrb r3,[lr,#-13] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-12] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-11] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-10] adds $h0,$h0,r3 @ accumulate input ldrb r3,[lr,#-9] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-8] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-7] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-6] adcs $h1,$h1,r3 ldrb r3,[lr,#-5] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-4] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-3] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-2] adcs $h2,$h2,r3 ldrb r3,[lr,#-1] orr r1,r0,r1,lsl#8 str lr,[sp,#8] @ offload input pointer orr r2,r1,r2,lsl#16 add $s1,$r1,$r1,lsr#2 orr r3,r2,r3,lsl#24 #else ldr r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi $h4,$h4,#1 @ padbit ldr r1,[lr,#-12] ldr r2,[lr,#-8] ldr r3,[lr,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif adds $h0,$h0,r0 @ accumulate input str lr,[sp,#8] @ offload input pointer adcs $h1,$h1,r1 add $s1,$r1,$r1,lsr#2 adcs $h2,$h2,r2 #endif add $s2,$r2,$r2,lsr#2 adcs $h3,$h3,r3 add $s3,$r3,$r3,lsr#2 umull r2,r3,$h1,$r0 adc $h4,$h4,#0 umull r0,r1,$h0,$r0 umlal r2,r3,$h4,$s1 umlal r0,r1,$h3,$s1 ldr $r1,[sp,#20] @ reload $r1 umlal r2,r3,$h2,$s3 umlal r0,r1,$h1,$s3 umlal r2,r3,$h3,$s2 umlal r0,r1,$h2,$s2 umlal r2,r3,$h0,$r1 str r0,[sp,#0] @ future $h0 mul r0,$s2,$h4 ldr $r2,[sp,#24] @ reload $r2 adds r2,r2,r1 @ d1+=d0>>32 eor r1,r1,r1 adc lr,r3,#0 @ future $h2 str r2,[sp,#4] @ future $h1 mul r2,$s3,$h4 eor r3,r3,r3 umlal r0,r1,$h3,$s3 ldr $r3,[sp,#28] @ reload $r3 umlal r2,r3,$h3,$r0 umlal r0,r1,$h2,$r0 umlal r2,r3,$h2,$r1 umlal r0,r1,$h1,$r1 umlal r2,r3,$h1,$r2 umlal r0,r1,$h0,$r2 umlal r2,r3,$h0,$r3 ldr $h0,[sp,#0] mul $h4,$r0,$h4 ldr $h1,[sp,#4] adds $h2,lr,r0 @ d2+=d1>>32 ldr lr,[sp,#8] @ reload input pointer adc r1,r1,#0 adds $h3,r2,r1 @ d3+=d2>>32 ldr r0,[sp,#16] @ reload end pointer adc r3,r3,#0 add $h4,$h4,r3 @ h4+=d3>>32 and r1,$h4,#-4 and $h4,$h4,#3 add r1,r1,r1,lsr#2 @ *=5 adds $h0,$h0,r1 adcs $h1,$h1,#0 adcs $h2,$h2,#0 adcs $h3,$h3,#0 adc $h4,$h4,#0 cmp r0,lr @ done yet? bhi .Loop ldr $ctx,[sp,#12] add sp,sp,#32 stmia $ctx,{$h0-$h4} @ store the result .Lno_data: #if __ARM_ARCH__>=5 ldmia sp!,{r3-r11,pc} #else ldmia sp!,{r3-r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_blocks,.-GFp_poly1305_blocks ___ } { my ($ctx,$mac,$nonce)=map("r$_",(0..2)); my ($h0,$h1,$h2,$h3,$h4,$g0,$g1,$g2,$g3)=map("r$_",(3..11)); my $g4=$h4; $code.=<<___; .type GFp_poly1305_emit,%function .align 5 GFp_poly1305_emit: stmdb sp!,{r4-r11} .Lpoly1305_emit_enter: ldmia $ctx,{$h0-$h4} adds $g0,$h0,#5 @ compare to modulus adcs $g1,$h1,#0 adcs $g2,$h2,#0 adcs $g3,$h3,#0 adc $g4,$h4,#0 tst $g4,#4 @ did it carry/borrow? #ifdef __thumb2__ it ne #endif movne $h0,$g0 ldr $g0,[$nonce,#0] #ifdef __thumb2__ it ne #endif movne $h1,$g1 ldr $g1,[$nonce,#4] #ifdef __thumb2__ it ne #endif movne $h2,$g2 ldr $g2,[$nonce,#8] #ifdef __thumb2__ it ne #endif movne $h3,$g3 ldr $g3,[$nonce,#12] adds $h0,$h0,$g0 adcs $h1,$h1,$g1 adcs $h2,$h2,$g2 adc $h3,$h3,$g3 #if __ARM_ARCH__>=7 # ifdef __ARMEB__ rev $h0,$h0 rev $h1,$h1 rev $h2,$h2 rev $h3,$h3 # endif str $h0,[$mac,#0] str $h1,[$mac,#4] str $h2,[$mac,#8] str $h3,[$mac,#12] #else strb $h0,[$mac,#0] mov $h0,$h0,lsr#8 strb $h1,[$mac,#4] mov $h1,$h1,lsr#8 strb $h2,[$mac,#8] mov $h2,$h2,lsr#8 strb $h3,[$mac,#12] mov $h3,$h3,lsr#8 strb $h0,[$mac,#1] mov $h0,$h0,lsr#8 strb $h1,[$mac,#5] mov $h1,$h1,lsr#8 strb $h2,[$mac,#9] mov $h2,$h2,lsr#8 strb $h3,[$mac,#13] mov $h3,$h3,lsr#8 strb $h0,[$mac,#2] mov $h0,$h0,lsr#8 strb $h1,[$mac,#6] mov $h1,$h1,lsr#8 strb $h2,[$mac,#10] mov $h2,$h2,lsr#8 strb $h3,[$mac,#14] mov $h3,$h3,lsr#8 strb $h0,[$mac,#3] strb $h1,[$mac,#7] strb $h2,[$mac,#11] strb $h3,[$mac,#15] #endif ldmia sp!,{r4-r11} #if __ARM_ARCH__>=5 ret @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_emit,.-GFp_poly1305_emit ___ { my ($R0,$R1,$S1,$R2,$S2,$R3,$S3,$R4,$S4) = map("d$_",(0..9)); my ($D0,$D1,$D2,$D3,$D4, $H0,$H1,$H2,$H3,$H4) = map("q$_",(5..14)); my ($T0,$T1,$MASK) = map("q$_",(15,4,0)); my ($in2,$zeros,$tbl0,$tbl1) = map("r$_",(4..7)); $code.=<<___; #if __ARM_MAX_ARCH__>=7 .fpu neon .type poly1305_init_neon,%function .align 5 poly1305_init_neon: ldr r4,[$ctx,#20] @ load key base 2^32 ldr r5,[$ctx,#24] ldr r6,[$ctx,#28] ldr r7,[$ctx,#32] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 and r3,r3,#0x03ffffff and r4,r4,#0x03ffffff and r5,r5,#0x03ffffff vdup.32 $R0,r2 @ r^1 in both lanes add r2,r3,r3,lsl#2 @ *5 vdup.32 $R1,r3 add r3,r4,r4,lsl#2 vdup.32 $S1,r2 vdup.32 $R2,r4 add r4,r5,r5,lsl#2 vdup.32 $S2,r3 vdup.32 $R3,r5 add r5,r6,r6,lsl#2 vdup.32 $S3,r4 vdup.32 $R4,r6 vdup.32 $S4,r5 mov $zeros,#2 @ counter .Lsquare_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 vmull.u32 $D0,$R0,${R0}[1] vmull.u32 $D1,$R1,${R0}[1] vmull.u32 $D2,$R2,${R0}[1] vmull.u32 $D3,$R3,${R0}[1] vmull.u32 $D4,$R4,${R0}[1] vmlal.u32 $D0,$R4,${S1}[1] vmlal.u32 $D1,$R0,${R1}[1] vmlal.u32 $D2,$R1,${R1}[1] vmlal.u32 $D3,$R2,${R1}[1] vmlal.u32 $D4,$R3,${R1}[1] vmlal.u32 $D0,$R3,${S2}[1] vmlal.u32 $D1,$R4,${S2}[1] vmlal.u32 $D3,$R1,${R2}[1] vmlal.u32 $D2,$R0,${R2}[1] vmlal.u32 $D4,$R2,${R2}[1] vmlal.u32 $D0,$R2,${S3}[1] vmlal.u32 $D3,$R0,${R3}[1] vmlal.u32 $D1,$R3,${S3}[1] vmlal.u32 $D2,$R4,${S3}[1] vmlal.u32 $D4,$R1,${R3}[1] vmlal.u32 $D3,$R4,${S4}[1] vmlal.u32 $D0,$R1,${S4}[1] vmlal.u32 $D1,$R2,${S4}[1] vmlal.u32 $D2,$R3,${S4}[1] vmlal.u32 $D4,$R0,${R4}[1] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction as discussed in "NEON crypto" by D.J. Bernstein @ and P. Schwabe @ @ H0>>+H1>>+H2>>+H3>>+H4 @ H3>>+H4>>*5+H0>>+H1 @ @ Trivia. @ @ Result of multiplication of n-bit number by m-bit number is @ n+m bits wide. However! Even though 2^n is a n+1-bit number, @ m-bit number multiplied by 2^n is still n+m bits wide. @ @ Sum of two n-bit numbers is n+1 bits wide, sum of three - n+2, @ and so is sum of four. Sum of 2^m n-m-bit numbers and n-bit @ one is n+1 bits wide. @ @ >>+ denotes Hnext += Hn>>26, Hn &= 0x3ffffff. This means that @ H0, H2, H3 are guaranteed to be 26 bits wide, while H1 and H4 @ can be 27. However! In cases when their width exceeds 26 bits @ they are limited by 2^26+2^6. This in turn means that *sum* @ of the products with these values can still be viewed as sum @ of 52-bit numbers as long as the amount of addends is not a @ power of 2. For example, @ @ H4 = H4*R0 + H3*R1 + H2*R2 + H1*R3 + H0 * R4, @ @ which can't be larger than 5 * (2^26 + 2^6) * (2^26 + 2^6), or @ 5 * (2^52 + 2*2^32 + 2^12), which in turn is smaller than @ 8 * (2^52) or 2^55. However, the value is then multiplied by @ by 5, so we should be looking at 5 * 5 * (2^52 + 2^33 + 2^12), @ which is less than 32 * (2^52) or 2^57. And when processing @ data we are looking at triple as many addends... @ @ In key setup procedure pre-reduced H0 is limited by 5*4+1 and @ 5*H4 - by 5*5 52-bit addends, or 57 bits. But when hashing the @ input H0 is limited by (5*4+1)*3 addends, or 58 bits, while @ 5*H4 by 5*5*3, or 59[!] bits. How is this relevant? vmlal.u32 @ instruction accepts 2x32-bit input and writes 2x64-bit result. @ This means that result of reduction have to be compressed upon @ loop wrap-around. This can be done in the process of reduction @ to minimize amount of instructions [as well as amount of @ 128-bit instructions, which benefits low-end processors], but @ one has to watch for H2 (which is narrower than H0) and 5*H4 @ not being wider than 58 bits, so that result of right shift @ by 26 bits fits in 32 bits. This is also useful on x86, @ because it allows to use paddd in place for paddq, which @ benefits Atom, where paddq is ridiculously slow. vshr.u64 $T0,$D3,#26 vmovn.i64 $D3#lo,$D3 vshr.u64 $T1,$D0,#26 vmovn.i64 $D0#lo,$D0 vadd.i64 $D4,$D4,$T0 @ h3 -> h4 vbic.i32 $D3#lo,#0xfc000000 @ &=0x03ffffff vadd.i64 $D1,$D1,$T1 @ h0 -> h1 vbic.i32 $D0#lo,#0xfc000000 vshrn.u64 $T0#lo,$D4,#26 vmovn.i64 $D4#lo,$D4 vshr.u64 $T1,$D1,#26 vmovn.i64 $D1#lo,$D1 vadd.i64 $D2,$D2,$T1 @ h1 -> h2 vbic.i32 $D4#lo,#0xfc000000 vbic.i32 $D1#lo,#0xfc000000 vadd.i32 $D0#lo,$D0#lo,$T0#lo vshl.u32 $T0#lo,$T0#lo,#2 vshrn.u64 $T1#lo,$D2,#26 vmovn.i64 $D2#lo,$D2 vadd.i32 $D0#lo,$D0#lo,$T0#lo @ h4 -> h0 vadd.i32 $D3#lo,$D3#lo,$T1#lo @ h2 -> h3 vbic.i32 $D2#lo,#0xfc000000 vshr.u32 $T0#lo,$D0#lo,#26 vbic.i32 $D0#lo,#0xfc000000 vshr.u32 $T1#lo,$D3#lo,#26 vbic.i32 $D3#lo,#0xfc000000 vadd.i32 $D1#lo,$D1#lo,$T0#lo @ h0 -> h1 vadd.i32 $D4#lo,$D4#lo,$T1#lo @ h3 -> h4 subs $zeros,$zeros,#1 beq .Lsquare_break_neon add $tbl0,$ctx,#(48+0*9*4) add $tbl1,$ctx,#(48+1*9*4) vtrn.32 $R0,$D0#lo @ r^2:r^1 vtrn.32 $R2,$D2#lo vtrn.32 $R3,$D3#lo vtrn.32 $R1,$D1#lo vtrn.32 $R4,$D4#lo vshl.u32 $S2,$R2,#2 @ *5 vshl.u32 $S3,$R3,#2 vshl.u32 $S1,$R1,#2 vshl.u32 $S4,$R4,#2 vadd.i32 $S2,$S2,$R2 vadd.i32 $S1,$S1,$R1 vadd.i32 $S3,$S3,$R3 vadd.i32 $S4,$S4,$R4 vst4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! vst4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! vst4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]! vst4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]! vst1.32 {${S4}[0]},[$tbl0,:32] vst1.32 {${S4}[1]},[$tbl1,:32] b .Lsquare_neon .align 4 .Lsquare_break_neon: add $tbl0,$ctx,#(48+2*4*9) add $tbl1,$ctx,#(48+3*4*9) vmov $R0,$D0#lo @ r^4:r^3 vshl.u32 $S1,$D1#lo,#2 @ *5 vmov $R1,$D1#lo vshl.u32 $S2,$D2#lo,#2 vmov $R2,$D2#lo vshl.u32 $S3,$D3#lo,#2 vmov $R3,$D3#lo vshl.u32 $S4,$D4#lo,#2 vmov $R4,$D4#lo vadd.i32 $S1,$S1,$D1#lo vadd.i32 $S2,$S2,$D2#lo vadd.i32 $S3,$S3,$D3#lo vadd.i32 $S4,$S4,$D4#lo vst4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! vst4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! vst4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]! vst4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]! vst1.32 {${S4}[0]},[$tbl0] vst1.32 {${S4}[1]},[$tbl1] ret @ bx lr .size poly1305_init_neon,.-poly1305_init_neon .type poly1305_blocks_neon,%function .align 5 poly1305_blocks_neon: ldr ip,[$ctx,#36] @ is_base2_26 ands $len,$len,#-16 beq .Lno_data_neon cmp $len,#64 bhs .Lenter_neon tst ip,ip @ is_base2_26? beq GFp_poly1305_blocks .Lenter_neon: stmdb sp!,{r4-r7} vstmdb sp!,{d8-d15} @ ABI specification says so tst ip,ip @ is_base2_26? bne .Lbase2_26_neon stmdb sp!,{r1-r3,lr} bl poly1305_init_neon ldr r4,[$ctx,#0] @ load hash value base 2^32 ldr r5,[$ctx,#4] ldr r6,[$ctx,#8] ldr r7,[$ctx,#12] ldr ip,[$ctx,#16] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 veor $D0#lo,$D0#lo,$D0#lo mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 veor $D1#lo,$D1#lo,$D1#lo mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 veor $D2#lo,$D2#lo,$D2#lo mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 veor $D3#lo,$D3#lo,$D3#lo and r3,r3,#0x03ffffff orr r6,r6,ip,lsl#24 veor $D4#lo,$D4#lo,$D4#lo and r4,r4,#0x03ffffff mov r1,#1 and r5,r5,#0x03ffffff str r1,[$ctx,#36] @ is_base2_26 vmov.32 $D0#lo[0],r2 vmov.32 $D1#lo[0],r3 vmov.32 $D2#lo[0],r4 vmov.32 $D3#lo[0],r5 vmov.32 $D4#lo[0],r6 adr $zeros,.Lzeros ldmia sp!,{r1-r3,lr} b .Lbase2_32_neon .align 4 .Lbase2_26_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ load hash value veor $D0#lo,$D0#lo,$D0#lo veor $D1#lo,$D1#lo,$D1#lo veor $D2#lo,$D2#lo,$D2#lo veor $D3#lo,$D3#lo,$D3#lo veor $D4#lo,$D4#lo,$D4#lo vld4.32 {$D0#lo[0],$D1#lo[0],$D2#lo[0],$D3#lo[0]},[$ctx]! adr $zeros,.Lzeros vld1.32 {$D4#lo[0]},[$ctx] sub $ctx,$ctx,#16 @ rewind .Lbase2_32_neon: add $in2,$inp,#32 mov $padbit,$padbit,lsl#24 tst $len,#31 beq .Leven vld4.32 {$H0#lo[0],$H1#lo[0],$H2#lo[0],$H3#lo[0]},[$inp]! vmov.32 $H4#lo[0],$padbit sub $len,$len,#16 add $in2,$inp,#32 # ifdef __ARMEB__ vrev32.8 $H0,$H0 vrev32.8 $H3,$H3 vrev32.8 $H1,$H1 vrev32.8 $H2,$H2 # endif vsri.u32 $H4#lo,$H3#lo,#8 @ base 2^32 -> base 2^26 vshl.u32 $H3#lo,$H3#lo,#18 vsri.u32 $H3#lo,$H2#lo,#14 vshl.u32 $H2#lo,$H2#lo,#12 vadd.i32 $H4#hi,$H4#lo,$D4#lo @ add hash value and move to #hi vbic.i32 $H3#lo,#0xfc000000 vsri.u32 $H2#lo,$H1#lo,#20 vshl.u32 $H1#lo,$H1#lo,#6 vbic.i32 $H2#lo,#0xfc000000 vsri.u32 $H1#lo,$H0#lo,#26 vadd.i32 $H3#hi,$H3#lo,$D3#lo vbic.i32 $H0#lo,#0xfc000000 vbic.i32 $H1#lo,#0xfc000000 vadd.i32 $H2#hi,$H2#lo,$D2#lo vadd.i32 $H0#hi,$H0#lo,$D0#lo vadd.i32 $H1#hi,$H1#lo,$D1#lo mov $tbl1,$zeros add $tbl0,$ctx,#48 cmp $len,$len b .Long_tail .align 4 .Leven: subs $len,$len,#64 it lo movlo $in2,$zeros vmov.i32 $H4,#1<<24 @ padbit, yes, always vld4.32 {$H0#lo,$H1#lo,$H2#lo,$H3#lo},[$inp] @ inp[0:1] add $inp,$inp,#64 vld4.32 {$H0#hi,$H1#hi,$H2#hi,$H3#hi},[$in2] @ inp[2:3] (or 0) add $in2,$in2,#64 itt hi addhi $tbl1,$ctx,#(48+1*9*4) addhi $tbl0,$ctx,#(48+3*9*4) # ifdef __ARMEB__ vrev32.8 $H0,$H0 vrev32.8 $H3,$H3 vrev32.8 $H1,$H1 vrev32.8 $H2,$H2 # endif vsri.u32 $H4,$H3,#8 @ base 2^32 -> base 2^26 vshl.u32 $H3,$H3,#18 vsri.u32 $H3,$H2,#14 vshl.u32 $H2,$H2,#12 vbic.i32 $H3,#0xfc000000 vsri.u32 $H2,$H1,#20 vshl.u32 $H1,$H1,#6 vbic.i32 $H2,#0xfc000000 vsri.u32 $H1,$H0,#26 vbic.i32 $H0,#0xfc000000 vbic.i32 $H1,#0xfc000000 bls .Lskip_loop vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^2 vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^4 vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]! vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]! b .Loop_neon .align 5 .Loop_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r @ \___________________/ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r @ \___________________/ \____________________/ @ @ Note that we start with inp[2:3]*r^2. This is because it @ doesn't depend on reduction in previous iteration. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ inp[2:3]*r^2 vadd.i32 $H2#lo,$H2#lo,$D2#lo @ accumulate inp[0:1] vmull.u32 $D2,$H2#hi,${R0}[1] vadd.i32 $H0#lo,$H0#lo,$D0#lo vmull.u32 $D0,$H0#hi,${R0}[1] vadd.i32 $H3#lo,$H3#lo,$D3#lo vmull.u32 $D3,$H3#hi,${R0}[1] vmlal.u32 $D2,$H1#hi,${R1}[1] vadd.i32 $H1#lo,$H1#lo,$D1#lo vmull.u32 $D1,$H1#hi,${R0}[1] vadd.i32 $H4#lo,$H4#lo,$D4#lo vmull.u32 $D4,$H4#hi,${R0}[1] subs $len,$len,#64 vmlal.u32 $D0,$H4#hi,${S1}[1] it lo movlo $in2,$zeros vmlal.u32 $D3,$H2#hi,${R1}[1] vld1.32 ${S4}[1],[$tbl1,:32] vmlal.u32 $D1,$H0#hi,${R1}[1] vmlal.u32 $D4,$H3#hi,${R1}[1] vmlal.u32 $D0,$H3#hi,${S2}[1] vmlal.u32 $D3,$H1#hi,${R2}[1] vmlal.u32 $D4,$H2#hi,${R2}[1] vmlal.u32 $D1,$H4#hi,${S2}[1] vmlal.u32 $D2,$H0#hi,${R2}[1] vmlal.u32 $D3,$H0#hi,${R3}[1] vmlal.u32 $D0,$H2#hi,${S3}[1] vmlal.u32 $D4,$H1#hi,${R3}[1] vmlal.u32 $D1,$H3#hi,${S3}[1] vmlal.u32 $D2,$H4#hi,${S3}[1] vmlal.u32 $D3,$H4#hi,${S4}[1] vmlal.u32 $D0,$H1#hi,${S4}[1] vmlal.u32 $D4,$H0#hi,${R4}[1] vmlal.u32 $D1,$H2#hi,${S4}[1] vmlal.u32 $D2,$H3#hi,${S4}[1] vld4.32 {$H0#hi,$H1#hi,$H2#hi,$H3#hi},[$in2] @ inp[2:3] (or 0) add $in2,$in2,#64 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4 and accumulate vmlal.u32 $D3,$H3#lo,${R0}[0] vmlal.u32 $D0,$H0#lo,${R0}[0] vmlal.u32 $D4,$H4#lo,${R0}[0] vmlal.u32 $D1,$H1#lo,${R0}[0] vmlal.u32 $D2,$H2#lo,${R0}[0] vld1.32 ${S4}[0],[$tbl0,:32] vmlal.u32 $D3,$H2#lo,${R1}[0] vmlal.u32 $D0,$H4#lo,${S1}[0] vmlal.u32 $D4,$H3#lo,${R1}[0] vmlal.u32 $D1,$H0#lo,${R1}[0] vmlal.u32 $D2,$H1#lo,${R1}[0] vmlal.u32 $D3,$H1#lo,${R2}[0] vmlal.u32 $D0,$H3#lo,${S2}[0] vmlal.u32 $D4,$H2#lo,${R2}[0] vmlal.u32 $D1,$H4#lo,${S2}[0] vmlal.u32 $D2,$H0#lo,${R2}[0] vmlal.u32 $D3,$H0#lo,${R3}[0] vmlal.u32 $D0,$H2#lo,${S3}[0] vmlal.u32 $D4,$H1#lo,${R3}[0] vmlal.u32 $D1,$H3#lo,${S3}[0] vmlal.u32 $D3,$H4#lo,${S4}[0] vmlal.u32 $D2,$H4#lo,${S3}[0] vmlal.u32 $D0,$H1#lo,${S4}[0] vmlal.u32 $D4,$H0#lo,${R4}[0] vmov.i32 $H4,#1<<24 @ padbit, yes, always vmlal.u32 $D1,$H2#lo,${S4}[0] vmlal.u32 $D2,$H3#lo,${S4}[0] vld4.32 {$H0#lo,$H1#lo,$H2#lo,$H3#lo},[$inp] @ inp[0:1] add $inp,$inp,#64 # ifdef __ARMEB__ vrev32.8 $H0,$H0 vrev32.8 $H1,$H1 vrev32.8 $H2,$H2 vrev32.8 $H3,$H3 # endif @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction interleaved with base 2^32 -> base 2^26 of @ inp[0:3] previously loaded to $H0-$H3 and smashed to $H0-$H4. vshr.u64 $T0,$D3,#26 vmovn.i64 $D3#lo,$D3 vshr.u64 $T1,$D0,#26 vmovn.i64 $D0#lo,$D0 vadd.i64 $D4,$D4,$T0 @ h3 -> h4 vbic.i32 $D3#lo,#0xfc000000 vsri.u32 $H4,$H3,#8 @ base 2^32 -> base 2^26 vadd.i64 $D1,$D1,$T1 @ h0 -> h1 vshl.u32 $H3,$H3,#18 vbic.i32 $D0#lo,#0xfc000000 vshrn.u64 $T0#lo,$D4,#26 vmovn.i64 $D4#lo,$D4 vshr.u64 $T1,$D1,#26 vmovn.i64 $D1#lo,$D1 vadd.i64 $D2,$D2,$T1 @ h1 -> h2 vsri.u32 $H3,$H2,#14 vbic.i32 $D4#lo,#0xfc000000 vshl.u32 $H2,$H2,#12 vbic.i32 $D1#lo,#0xfc000000 vadd.i32 $D0#lo,$D0#lo,$T0#lo vshl.u32 $T0#lo,$T0#lo,#2 vbic.i32 $H3,#0xfc000000 vshrn.u64 $T1#lo,$D2,#26 vmovn.i64 $D2#lo,$D2 vaddl.u32 $D0,$D0#lo,$T0#lo @ h4 -> h0 [widen for a sec] vsri.u32 $H2,$H1,#20 vadd.i32 $D3#lo,$D3#lo,$T1#lo @ h2 -> h3 vshl.u32 $H1,$H1,#6 vbic.i32 $D2#lo,#0xfc000000 vbic.i32 $H2,#0xfc000000 vshrn.u64 $T0#lo,$D0,#26 @ re-narrow vmovn.i64 $D0#lo,$D0 vsri.u32 $H1,$H0,#26 vbic.i32 $H0,#0xfc000000 vshr.u32 $T1#lo,$D3#lo,#26 vbic.i32 $D3#lo,#0xfc000000 vbic.i32 $D0#lo,#0xfc000000 vadd.i32 $D1#lo,$D1#lo,$T0#lo @ h0 -> h1 vadd.i32 $D4#lo,$D4#lo,$T1#lo @ h3 -> h4 vbic.i32 $H1,#0xfc000000 bhi .Loop_neon .Lskip_loop: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 add $tbl1,$ctx,#(48+0*9*4) add $tbl0,$ctx,#(48+1*9*4) adds $len,$len,#32 it ne movne $len,#0 bne .Long_tail vadd.i32 $H2#hi,$H2#lo,$D2#lo @ add hash value and move to #hi vadd.i32 $H0#hi,$H0#lo,$D0#lo vadd.i32 $H3#hi,$H3#lo,$D3#lo vadd.i32 $H1#hi,$H1#lo,$D1#lo vadd.i32 $H4#hi,$H4#lo,$D4#lo .Long_tail: vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^1 vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^2 vadd.i32 $H2#lo,$H2#lo,$D2#lo @ can be redundant vmull.u32 $D2,$H2#hi,$R0 vadd.i32 $H0#lo,$H0#lo,$D0#lo vmull.u32 $D0,$H0#hi,$R0 vadd.i32 $H3#lo,$H3#lo,$D3#lo vmull.u32 $D3,$H3#hi,$R0 vadd.i32 $H1#lo,$H1#lo,$D1#lo vmull.u32 $D1,$H1#hi,$R0 vadd.i32 $H4#lo,$H4#lo,$D4#lo vmull.u32 $D4,$H4#hi,$R0 vmlal.u32 $D0,$H4#hi,$S1 vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]! vmlal.u32 $D3,$H2#hi,$R1 vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]! vmlal.u32 $D1,$H0#hi,$R1 vmlal.u32 $D4,$H3#hi,$R1 vmlal.u32 $D2,$H1#hi,$R1 vmlal.u32 $D3,$H1#hi,$R2 vld1.32 ${S4}[1],[$tbl1,:32] vmlal.u32 $D0,$H3#hi,$S2 vld1.32 ${S4}[0],[$tbl0,:32] vmlal.u32 $D4,$H2#hi,$R2 vmlal.u32 $D1,$H4#hi,$S2 vmlal.u32 $D2,$H0#hi,$R2 vmlal.u32 $D3,$H0#hi,$R3 it ne addne $tbl1,$ctx,#(48+2*9*4) vmlal.u32 $D0,$H2#hi,$S3 it ne addne $tbl0,$ctx,#(48+3*9*4) vmlal.u32 $D4,$H1#hi,$R3 vmlal.u32 $D1,$H3#hi,$S3 vmlal.u32 $D2,$H4#hi,$S3 vmlal.u32 $D3,$H4#hi,$S4 vorn $MASK,$MASK,$MASK @ all-ones, can be redundant vmlal.u32 $D0,$H1#hi,$S4 vshr.u64 $MASK,$MASK,#38 vmlal.u32 $D4,$H0#hi,$R4 vmlal.u32 $D1,$H2#hi,$S4 vmlal.u32 $D2,$H3#hi,$S4 beq .Lshort_tail @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4:r^3 and accumulate vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^3 vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^4 vmlal.u32 $D2,$H2#lo,$R0 vmlal.u32 $D0,$H0#lo,$R0 vmlal.u32 $D3,$H3#lo,$R0 vmlal.u32 $D1,$H1#lo,$R0 vmlal.u32 $D4,$H4#lo,$R0 vmlal.u32 $D0,$H4#lo,$S1 vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]! vmlal.u32 $D3,$H2#lo,$R1 vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]! vmlal.u32 $D1,$H0#lo,$R1 vmlal.u32 $D4,$H3#lo,$R1 vmlal.u32 $D2,$H1#lo,$R1 vmlal.u32 $D3,$H1#lo,$R2 vld1.32 ${S4}[1],[$tbl1,:32] vmlal.u32 $D0,$H3#lo,$S2 vld1.32 ${S4}[0],[$tbl0,:32] vmlal.u32 $D4,$H2#lo,$R2 vmlal.u32 $D1,$H4#lo,$S2 vmlal.u32 $D2,$H0#lo,$R2 vmlal.u32 $D3,$H0#lo,$R3 vmlal.u32 $D0,$H2#lo,$S3 vmlal.u32 $D4,$H1#lo,$R3 vmlal.u32 $D1,$H3#lo,$S3 vmlal.u32 $D2,$H4#lo,$S3 vmlal.u32 $D3,$H4#lo,$S4 vorn $MASK,$MASK,$MASK @ all-ones vmlal.u32 $D0,$H1#lo,$S4 vshr.u64 $MASK,$MASK,#38 vmlal.u32 $D4,$H0#lo,$R4 vmlal.u32 $D1,$H2#lo,$S4 vmlal.u32 $D2,$H3#lo,$S4 .Lshort_tail: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ horizontal addition vadd.i64 $D3#lo,$D3#lo,$D3#hi vadd.i64 $D0#lo,$D0#lo,$D0#hi vadd.i64 $D4#lo,$D4#lo,$D4#hi vadd.i64 $D1#lo,$D1#lo,$D1#hi vadd.i64 $D2#lo,$D2#lo,$D2#hi @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction, but without narrowing vshr.u64 $T0,$D3,#26 vand.i64 $D3,$D3,$MASK vshr.u64 $T1,$D0,#26 vand.i64 $D0,$D0,$MASK vadd.i64 $D4,$D4,$T0 @ h3 -> h4 vadd.i64 $D1,$D1,$T1 @ h0 -> h1 vshr.u64 $T0,$D4,#26 vand.i64 $D4,$D4,$MASK vshr.u64 $T1,$D1,#26 vand.i64 $D1,$D1,$MASK vadd.i64 $D2,$D2,$T1 @ h1 -> h2 vadd.i64 $D0,$D0,$T0 vshl.u64 $T0,$T0,#2 vshr.u64 $T1,$D2,#26 vand.i64 $D2,$D2,$MASK vadd.i64 $D0,$D0,$T0 @ h4 -> h0 vadd.i64 $D3,$D3,$T1 @ h2 -> h3 vshr.u64 $T0,$D0,#26 vand.i64 $D0,$D0,$MASK vshr.u64 $T1,$D3,#26 vand.i64 $D3,$D3,$MASK vadd.i64 $D1,$D1,$T0 @ h0 -> h1 vadd.i64 $D4,$D4,$T1 @ h3 -> h4 cmp $len,#0 bne .Leven @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ store hash value vst4.32 {$D0#lo[0],$D1#lo[0],$D2#lo[0],$D3#lo[0]},[$ctx]! vst1.32 {$D4#lo[0]},[$ctx] vldmia sp!,{d8-d15} @ epilogue ldmia sp!,{r4-r7} .Lno_data_neon: ret @ bx lr .size poly1305_blocks_neon,.-poly1305_blocks_neon .type poly1305_emit_neon,%function .align 5 poly1305_emit_neon: ldr ip,[$ctx,#36] @ is_base2_26 stmdb sp!,{r4-r11} tst ip,ip beq .Lpoly1305_emit_enter ldmia $ctx,{$h0-$h4} eor $g0,$g0,$g0 adds $h0,$h0,$h1,lsl#26 @ base 2^26 -> base 2^32 mov $h1,$h1,lsr#6 adcs $h1,$h1,$h2,lsl#20 mov $h2,$h2,lsr#12 adcs $h2,$h2,$h3,lsl#14 mov $h3,$h3,lsr#18 adcs $h3,$h3,$h4,lsl#8 adc $h4,$g0,$h4,lsr#24 @ can be partially reduced ... and $g0,$h4,#-4 @ ... so reduce and $h4,$h3,#3 add $g0,$g0,$g0,lsr#2 @ *= 5 adds $h0,$h0,$g0 adcs $h1,$h1,#0 adcs $h2,$h2,#0 adcs $h3,$h3,#0 adc $h4,$h4,#0 adds $g0,$h0,#5 @ compare to modulus adcs $g1,$h1,#0 adcs $g2,$h2,#0 adcs $g3,$h3,#0 adc $g4,$h4,#0 tst $g4,#4 @ did it carry/borrow? it ne movne $h0,$g0 ldr $g0,[$nonce,#0] it ne movne $h1,$g1 ldr $g1,[$nonce,#4] it ne movne $h2,$g2 ldr $g2,[$nonce,#8] it ne movne $h3,$g3 ldr $g3,[$nonce,#12] adds $h0,$h0,$g0 @ accumulate nonce adcs $h1,$h1,$g1 adcs $h2,$h2,$g2 adc $h3,$h3,$g3 # ifdef __ARMEB__ rev $h0,$h0 rev $h1,$h1 rev $h2,$h2 rev $h3,$h3 # endif str $h0,[$mac,#0] @ store the result str $h1,[$mac,#4] str $h2,[$mac,#8] str $h3,[$mac,#12] ldmia sp!,{r4-r11} ret @ bx lr .size poly1305_emit_neon,.-poly1305_emit_neon .align 5 .Lzeros: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .LOPENSSL_armcap: .word GFp_armcap_P-.Lpoly1305_init #endif ___ } } $code.=<<___; .asciz "Poly1305 for ARMv4/NEON, CRYPTOGAMS by " .align 2 #if __ARM_MAX_ARCH__>=7 .comm GFp_armcap_P,4,4 #endif ___ foreach (split("\n",$code)) { s/\`([^\`]*)\`/eval $1/geo; s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or s/\bret\b/bx lr/go or s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4 print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/poly1305/asm/poly1305-armv8.pl000064400000000000000000000513051352416253600172270ustar0000000000000000#!/usr/bin/env perl # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements Poly1305 hash for ARMv8. # # June 2015 # # Numbers are cycles per processed byte with GFp_poly1305_blocks alone. # # IALU/gcc-4.9 NEON # # Apple A7 1.86/+5% 0.72 # Cortex-A53 2.69/+58% 1.47 # Cortex-A57 2.70/+7% 1.14 # Denver 1.64/+50% 1.18(*) # X-Gene 2.13/+68% 2.27 # # (*) estimate based on resources availability is less than 1.0, # i.e. measured result is worse than expected, presumably binary # translator is not almighty; $flavour=shift; $output=shift; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or die "can't locate arm-xlate.pl"; open OUT,"| \"$^X\" $xlate $flavour $output"; *STDOUT=*OUT; my ($ctx,$inp,$len,$padbit) = map("x$_",(0..3)); my ($mac,$nonce)=($inp,$len); my ($h0,$h1,$h2,$r0,$r1,$s1,$t0,$t1,$d0,$d1,$d2) = map("x$_",(4..14)); $code.=<<___; #include .text // forward "declarations" are required for Apple .extern GFp_armcap_P .globl GFp_poly1305_blocks .globl GFp_poly1305_emit .globl GFp_poly1305_init_asm .type GFp_poly1305_init_asm,%function .align 5 GFp_poly1305_init_asm: cmp $inp,xzr stp xzr,xzr,[$ctx] // zero hash value stp xzr,xzr,[$ctx,#16] // [along with is_base2_26] csel x0,xzr,x0,eq b.eq .Lno_key #ifdef __ILP32__ ldrsw $t1,.LGFp_armcap_P #else ldr $t1,.LGFp_armcap_P #endif adr $t0,.LGFp_armcap_P ldp $r0,$r1,[$inp] // load key mov $s1,#0xfffffffc0fffffff movk $s1,#0x0fff,lsl#48 ldr w17,[$t0,$t1] #ifdef __ARMEB__ rev $r0,$r0 // flip bytes rev $r1,$r1 #endif and $r0,$r0,$s1 // &=0ffffffc0fffffff and $s1,$s1,#-4 and $r1,$r1,$s1 // &=0ffffffc0ffffffc stp $r0,$r1,[$ctx,#32] // save key value tst w17,#ARMV7_NEON adr $d0,GFp_poly1305_blocks adr $r0,poly1305_blocks_neon adr $d1,GFp_poly1305_emit adr $r1,poly1305_emit_neon csel $d0,$d0,$r0,eq csel $d1,$d1,$r1,eq stp $d0,$d1,[$len] mov x0,#1 .Lno_key: ret .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm .type GFp_poly1305_blocks,%function .align 5 GFp_poly1305_blocks: ands $len,$len,#-16 b.eq .Lno_data ldp $h0,$h1,[$ctx] // load hash value ldp $r0,$r1,[$ctx,#32] // load key value ldr $h2,[$ctx,#16] add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2) b .Loop .align 5 .Loop: ldp $t0,$t1,[$inp],#16 // load input sub $len,$len,#16 #ifdef __ARMEB__ rev $t0,$t0 rev $t1,$t1 #endif adds $h0,$h0,$t0 // accumulate input adcs $h1,$h1,$t1 mul $d0,$h0,$r0 // h0*r0 adc $h2,$h2,$padbit umulh $d1,$h0,$r0 mul $t0,$h1,$s1 // h1*5*r1 umulh $t1,$h1,$s1 adds $d0,$d0,$t0 mul $t0,$h0,$r1 // h0*r1 adc $d1,$d1,$t1 umulh $d2,$h0,$r1 adds $d1,$d1,$t0 mul $t0,$h1,$r0 // h1*r0 adc $d2,$d2,xzr umulh $t1,$h1,$r0 adds $d1,$d1,$t0 mul $t0,$h2,$s1 // h2*5*r1 adc $d2,$d2,$t1 mul $t1,$h2,$r0 // h2*r0 adds $d1,$d1,$t0 adc $d2,$d2,$t1 and $t0,$d2,#-4 // final reduction and $h2,$d2,#3 add $t0,$t0,$d2,lsr#2 adds $h0,$d0,$t0 adcs $h1,$d1,xzr adc $h2,$h2,xzr cbnz $len,.Loop stp $h0,$h1,[$ctx] // store hash value str $h2,[$ctx,#16] .Lno_data: ret .size GFp_poly1305_blocks,.-GFp_poly1305_blocks .type GFp_poly1305_emit,%function .align 5 GFp_poly1305_emit: ldp $h0,$h1,[$ctx] // load hash base 2^64 ldr $h2,[$ctx,#16] ldp $t0,$t1,[$nonce] // load nonce adds $d0,$h0,#5 // compare to modulus adcs $d1,$h1,xzr adc $d2,$h2,xzr tst $d2,#-4 // see if it's carried/borrowed csel $h0,$h0,$d0,eq csel $h1,$h1,$d1,eq #ifdef __ARMEB__ ror $t0,$t0,#32 // flip nonce words ror $t1,$t1,#32 #endif adds $h0,$h0,$t0 // accumulate nonce adc $h1,$h1,$t1 #ifdef __ARMEB__ rev $h0,$h0 // flip output bytes rev $h1,$h1 #endif stp $h0,$h1,[$mac] // write result ret .size GFp_poly1305_emit,.-GFp_poly1305_emit ___ my ($R0,$R1,$S1,$R2,$S2,$R3,$S3,$R4,$S4) = map("v$_.4s",(0..8)); my ($IN01_0,$IN01_1,$IN01_2,$IN01_3,$IN01_4) = map("v$_.2s",(9..13)); my ($IN23_0,$IN23_1,$IN23_2,$IN23_3,$IN23_4) = map("v$_.2s",(14..18)); my ($ACC0,$ACC1,$ACC2,$ACC3,$ACC4) = map("v$_.2d",(19..23)); my ($H0,$H1,$H2,$H3,$H4) = map("v$_.2s",(24..28)); my ($T0,$T1,$MASK) = map("v$_",(29..31)); my ($in2,$zeros)=("x16","x17"); my $is_base2_26 = $zeros; # borrow $code.=<<___; .type poly1305_mult,%function .align 5 poly1305_mult: mul $d0,$h0,$r0 // h0*r0 umulh $d1,$h0,$r0 mul $t0,$h1,$s1 // h1*5*r1 umulh $t1,$h1,$s1 adds $d0,$d0,$t0 mul $t0,$h0,$r1 // h0*r1 adc $d1,$d1,$t1 umulh $d2,$h0,$r1 adds $d1,$d1,$t0 mul $t0,$h1,$r0 // h1*r0 adc $d2,$d2,xzr umulh $t1,$h1,$r0 adds $d1,$d1,$t0 mul $t0,$h2,$s1 // h2*5*r1 adc $d2,$d2,$t1 mul $t1,$h2,$r0 // h2*r0 adds $d1,$d1,$t0 adc $d2,$d2,$t1 and $t0,$d2,#-4 // final reduction and $h2,$d2,#3 add $t0,$t0,$d2,lsr#2 adds $h0,$d0,$t0 adcs $h1,$d1,xzr adc $h2,$h2,xzr ret .size poly1305_mult,.-poly1305_mult .type poly1305_splat,%function .align 5 poly1305_splat: and x12,$h0,#0x03ffffff // base 2^64 -> base 2^26 ubfx x13,$h0,#26,#26 extr x14,$h1,$h0,#52 and x14,x14,#0x03ffffff ubfx x15,$h1,#14,#26 extr x16,$h2,$h1,#40 str w12,[$ctx,#16*0] // r0 add w12,w13,w13,lsl#2 // r1*5 str w13,[$ctx,#16*1] // r1 add w13,w14,w14,lsl#2 // r2*5 str w12,[$ctx,#16*2] // s1 str w14,[$ctx,#16*3] // r2 add w14,w15,w15,lsl#2 // r3*5 str w13,[$ctx,#16*4] // s2 str w15,[$ctx,#16*5] // r3 add w15,w16,w16,lsl#2 // r4*5 str w14,[$ctx,#16*6] // s3 str w16,[$ctx,#16*7] // r4 str w15,[$ctx,#16*8] // s4 ret .size poly1305_splat,.-poly1305_splat .type poly1305_blocks_neon,%function .align 5 poly1305_blocks_neon: ldr $is_base2_26,[$ctx,#24] cmp $len,#128 b.hs .Lblocks_neon cbz $is_base2_26,GFp_poly1305_blocks .Lblocks_neon: stp x29,x30,[sp,#-80]! add x29,sp,#0 ands $len,$len,#-16 b.eq .Lno_data_neon cbz $is_base2_26,.Lbase2_64_neon ldp w10,w11,[$ctx] // load hash value base 2^26 ldp w12,w13,[$ctx,#8] ldr w14,[$ctx,#16] tst $len,#31 b.eq .Leven_neon ldp $r0,$r1,[$ctx,#32] // load key value add $h0,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr $h1,x12,#12 adds $h0,$h0,x12,lsl#52 add $h1,$h1,x13,lsl#14 adc $h1,$h1,xzr lsr $h2,x14,#24 adds $h1,$h1,x14,lsl#40 adc $d2,$h2,xzr // can be partially reduced... ldp $d0,$d1,[$inp],#16 // load input sub $len,$len,#16 add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2) and $t0,$d2,#-4 // ... so reduce and $h2,$d2,#3 add $t0,$t0,$d2,lsr#2 adds $h0,$h0,$t0 adcs $h1,$h1,xzr adc $h2,$h2,xzr #ifdef __ARMEB__ rev $d0,$d0 rev $d1,$d1 #endif adds $h0,$h0,$d0 // accumulate input adcs $h1,$h1,$d1 adc $h2,$h2,$padbit bl poly1305_mult ldr x30,[sp,#8] cbz $padbit,.Lstore_base2_64_neon and x10,$h0,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,$h0,#26,#26 extr x12,$h1,$h0,#52 and x12,x12,#0x03ffffff ubfx x13,$h1,#14,#26 extr x14,$h2,$h1,#40 cbnz $len,.Leven_neon stp w10,w11,[$ctx] // store hash value base 2^26 stp w12,w13,[$ctx,#8] str w14,[$ctx,#16] b .Lno_data_neon .align 4 .Lstore_base2_64_neon: stp $h0,$h1,[$ctx] // store hash value base 2^64 stp $h2,xzr,[$ctx,#16] // note that is_base2_26 is zeroed b .Lno_data_neon .align 4 .Lbase2_64_neon: ldp $r0,$r1,[$ctx,#32] // load key value ldp $h0,$h1,[$ctx] // load hash value base 2^64 ldr $h2,[$ctx,#16] tst $len,#31 b.eq .Linit_neon ldp $d0,$d1,[$inp],#16 // load input sub $len,$len,#16 add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2) #ifdef __ARMEB__ rev $d0,$d0 rev $d1,$d1 #endif adds $h0,$h0,$d0 // accumulate input adcs $h1,$h1,$d1 adc $h2,$h2,$padbit bl poly1305_mult .Linit_neon: and x10,$h0,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,$h0,#26,#26 extr x12,$h1,$h0,#52 and x12,x12,#0x03ffffff ubfx x13,$h1,#14,#26 extr x14,$h2,$h1,#40 stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov ${H0},x10 fmov ${H1},x11 fmov ${H2},x12 fmov ${H3},x13 fmov ${H4},x14 ////////////////////////////////// initialize r^n table mov $h0,$r0 // r^1 add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2) mov $h1,$r1 mov $h2,xzr add $ctx,$ctx,#48+12 bl poly1305_splat bl poly1305_mult // r^2 sub $ctx,$ctx,#4 bl poly1305_splat bl poly1305_mult // r^3 sub $ctx,$ctx,#4 bl poly1305_splat bl poly1305_mult // r^4 sub $ctx,$ctx,#4 bl poly1305_splat ldr x30,[sp,#8] add $in2,$inp,#32 adr $zeros,.Lzeros subs $len,$len,#64 csel $in2,$zeros,$in2,lo mov x4,#1 str x4,[$ctx,#-24] // set is_base2_26 sub $ctx,$ctx,#48 // restore original $ctx b .Ldo_neon .align 4 .Leven_neon: add $in2,$inp,#32 adr $zeros,.Lzeros subs $len,$len,#64 csel $in2,$zeros,$in2,lo stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov ${H0},x10 fmov ${H1},x11 fmov ${H2},x12 fmov ${H3},x13 fmov ${H4},x14 .Ldo_neon: ldp x8,x12,[$in2],#16 // inp[2:3] (or zero) ldp x9,x13,[$in2],#48 lsl $padbit,$padbit,#24 add x15,$ctx,#48 #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov $IN23_0,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,$padbit,x12,lsr#40 add x13,$padbit,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov $IN23_1,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 fmov $IN23_2,x8 fmov $IN23_3,x10 fmov $IN23_4,x12 ldp x8,x12,[$inp],#16 // inp[0:1] ldp x9,x13,[$inp],#48 ld1 {$R0,$R1,$S1,$R2},[x15],#64 ld1 {$S2,$R3,$S3,$R4},[x15],#64 ld1 {$S4},[x15] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov $IN01_0,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,$padbit,x12,lsr#40 add x13,$padbit,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov $IN01_1,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 movi $MASK.2d,#-1 fmov $IN01_2,x8 fmov $IN01_3,x10 fmov $IN01_4,x12 ushr $MASK.2d,$MASK.2d,#38 b.ls .Lskip_loop .align 4 .Loop_neon: //////////////////////////////////////////////////////////////// // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r // \___________________/ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r // \___________________/ \____________________/ // // Note that we start with inp[2:3]*r^2. This is because it // doesn't depend on reduction in previous iteration. //////////////////////////////////////////////////////////////// // d4 = h0*r4 + h1*r3 + h2*r2 + h3*r1 + h4*r0 // d3 = h0*r3 + h1*r2 + h2*r1 + h3*r0 + h4*5*r4 // d2 = h0*r2 + h1*r1 + h2*r0 + h3*5*r4 + h4*5*r3 // d1 = h0*r1 + h1*r0 + h2*5*r4 + h3*5*r3 + h4*5*r2 // d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1 subs $len,$len,#64 umull $ACC4,$IN23_0,${R4}[2] csel $in2,$zeros,$in2,lo umull $ACC3,$IN23_0,${R3}[2] umull $ACC2,$IN23_0,${R2}[2] ldp x8,x12,[$in2],#16 // inp[2:3] (or zero) umull $ACC1,$IN23_0,${R1}[2] ldp x9,x13,[$in2],#48 umull $ACC0,$IN23_0,${R0}[2] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif umlal $ACC4,$IN23_1,${R3}[2] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal $ACC3,$IN23_1,${R2}[2] and x5,x9,#0x03ffffff umlal $ACC2,$IN23_1,${R1}[2] ubfx x6,x8,#26,#26 umlal $ACC1,$IN23_1,${R0}[2] ubfx x7,x9,#26,#26 umlal $ACC0,$IN23_1,${S4}[2] add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal $ACC4,$IN23_2,${R2}[2] extr x8,x12,x8,#52 umlal $ACC3,$IN23_2,${R1}[2] extr x9,x13,x9,#52 umlal $ACC2,$IN23_2,${R0}[2] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal $ACC1,$IN23_2,${S4}[2] fmov $IN23_0,x4 umlal $ACC0,$IN23_2,${S3}[2] and x8,x8,#0x03ffffff umlal $ACC4,$IN23_3,${R1}[2] and x9,x9,#0x03ffffff umlal $ACC3,$IN23_3,${R0}[2] ubfx x10,x12,#14,#26 umlal $ACC2,$IN23_3,${S4}[2] ubfx x11,x13,#14,#26 umlal $ACC1,$IN23_3,${S3}[2] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal $ACC0,$IN23_3,${S2}[2] fmov $IN23_1,x6 add $IN01_2,$IN01_2,$H2 add x12,$padbit,x12,lsr#40 umlal $ACC4,$IN23_4,${R0}[2] add x13,$padbit,x13,lsr#40 umlal $ACC3,$IN23_4,${S4}[2] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal $ACC2,$IN23_4,${S3}[2] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal $ACC1,$IN23_4,${S2}[2] fmov $IN23_2,x8 umlal $ACC0,$IN23_4,${S1}[2] fmov $IN23_3,x10 //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4 and accumulate add $IN01_0,$IN01_0,$H0 fmov $IN23_4,x12 umlal $ACC3,$IN01_2,${R1}[0] ldp x8,x12,[$inp],#16 // inp[0:1] umlal $ACC0,$IN01_2,${S3}[0] ldp x9,x13,[$inp],#48 umlal $ACC4,$IN01_2,${R2}[0] umlal $ACC1,$IN01_2,${S4}[0] umlal $ACC2,$IN01_2,${R0}[0] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif add $IN01_1,$IN01_1,$H1 umlal $ACC3,$IN01_0,${R3}[0] umlal $ACC4,$IN01_0,${R4}[0] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal $ACC2,$IN01_0,${R2}[0] and x5,x9,#0x03ffffff umlal $ACC0,$IN01_0,${R0}[0] ubfx x6,x8,#26,#26 umlal $ACC1,$IN01_0,${R1}[0] ubfx x7,x9,#26,#26 add $IN01_3,$IN01_3,$H3 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal $ACC3,$IN01_1,${R2}[0] extr x8,x12,x8,#52 umlal $ACC4,$IN01_1,${R3}[0] extr x9,x13,x9,#52 umlal $ACC0,$IN01_1,${S4}[0] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal $ACC2,$IN01_1,${R1}[0] fmov $IN01_0,x4 umlal $ACC1,$IN01_1,${R0}[0] and x8,x8,#0x03ffffff add $IN01_4,$IN01_4,$H4 and x9,x9,#0x03ffffff umlal $ACC3,$IN01_3,${R0}[0] ubfx x10,x12,#14,#26 umlal $ACC0,$IN01_3,${S2}[0] ubfx x11,x13,#14,#26 umlal $ACC4,$IN01_3,${R1}[0] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal $ACC1,$IN01_3,${S3}[0] fmov $IN01_1,x6 umlal $ACC2,$IN01_3,${S4}[0] add x12,$padbit,x12,lsr#40 umlal $ACC3,$IN01_4,${S4}[0] add x13,$padbit,x13,lsr#40 umlal $ACC0,$IN01_4,${S1}[0] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal $ACC4,$IN01_4,${R0}[0] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal $ACC1,$IN01_4,${S2}[0] fmov $IN01_2,x8 umlal $ACC2,$IN01_4,${S3}[0] fmov $IN01_3,x10 fmov $IN01_4,x12 ///////////////////////////////////////////////////////////////// // lazy reduction as discussed in "NEON crypto" by D.J. Bernstein // and P. Schwabe // // [see discussion in poly1305-armv4 module] ushr $T0.2d,$ACC3,#26 xtn $H3,$ACC3 ushr $T1.2d,$ACC0,#26 and $ACC0,$ACC0,$MASK.2d add $ACC4,$ACC4,$T0.2d // h3 -> h4 bic $H3,#0xfc,lsl#24 // &=0x03ffffff add $ACC1,$ACC1,$T1.2d // h0 -> h1 ushr $T0.2d,$ACC4,#26 xtn $H4,$ACC4 ushr $T1.2d,$ACC1,#26 xtn $H1,$ACC1 bic $H4,#0xfc,lsl#24 add $ACC2,$ACC2,$T1.2d // h1 -> h2 add $ACC0,$ACC0,$T0.2d shl $T0.2d,$T0.2d,#2 shrn $T1.2s,$ACC2,#26 xtn $H2,$ACC2 add $ACC0,$ACC0,$T0.2d // h4 -> h0 bic $H1,#0xfc,lsl#24 add $H3,$H3,$T1.2s // h2 -> h3 bic $H2,#0xfc,lsl#24 shrn $T0.2s,$ACC0,#26 xtn $H0,$ACC0 ushr $T1.2s,$H3,#26 bic $H3,#0xfc,lsl#24 bic $H0,#0xfc,lsl#24 add $H1,$H1,$T0.2s // h0 -> h1 add $H4,$H4,$T1.2s // h3 -> h4 b.hi .Loop_neon .Lskip_loop: dup $IN23_2,${IN23_2}[0] add $IN01_2,$IN01_2,$H2 //////////////////////////////////////////////////////////////// // multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 adds $len,$len,#32 b.ne .Long_tail dup $IN23_2,${IN01_2}[0] add $IN23_0,$IN01_0,$H0 add $IN23_3,$IN01_3,$H3 add $IN23_1,$IN01_1,$H1 add $IN23_4,$IN01_4,$H4 .Long_tail: dup $IN23_0,${IN23_0}[0] umull2 $ACC0,$IN23_2,${S3} umull2 $ACC3,$IN23_2,${R1} umull2 $ACC4,$IN23_2,${R2} umull2 $ACC2,$IN23_2,${R0} umull2 $ACC1,$IN23_2,${S4} dup $IN23_1,${IN23_1}[0] umlal2 $ACC0,$IN23_0,${R0} umlal2 $ACC2,$IN23_0,${R2} umlal2 $ACC3,$IN23_0,${R3} umlal2 $ACC4,$IN23_0,${R4} umlal2 $ACC1,$IN23_0,${R1} dup $IN23_3,${IN23_3}[0] umlal2 $ACC0,$IN23_1,${S4} umlal2 $ACC3,$IN23_1,${R2} umlal2 $ACC2,$IN23_1,${R1} umlal2 $ACC4,$IN23_1,${R3} umlal2 $ACC1,$IN23_1,${R0} dup $IN23_4,${IN23_4}[0] umlal2 $ACC3,$IN23_3,${R0} umlal2 $ACC4,$IN23_3,${R1} umlal2 $ACC0,$IN23_3,${S2} umlal2 $ACC1,$IN23_3,${S3} umlal2 $ACC2,$IN23_3,${S4} umlal2 $ACC3,$IN23_4,${S4} umlal2 $ACC0,$IN23_4,${S1} umlal2 $ACC4,$IN23_4,${R0} umlal2 $ACC1,$IN23_4,${S2} umlal2 $ACC2,$IN23_4,${S3} b.eq .Lshort_tail //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4:r^3 and accumulate add $IN01_0,$IN01_0,$H0 umlal $ACC3,$IN01_2,${R1} umlal $ACC0,$IN01_2,${S3} umlal $ACC4,$IN01_2,${R2} umlal $ACC1,$IN01_2,${S4} umlal $ACC2,$IN01_2,${R0} add $IN01_1,$IN01_1,$H1 umlal $ACC3,$IN01_0,${R3} umlal $ACC0,$IN01_0,${R0} umlal $ACC4,$IN01_0,${R4} umlal $ACC1,$IN01_0,${R1} umlal $ACC2,$IN01_0,${R2} add $IN01_3,$IN01_3,$H3 umlal $ACC3,$IN01_1,${R2} umlal $ACC0,$IN01_1,${S4} umlal $ACC4,$IN01_1,${R3} umlal $ACC1,$IN01_1,${R0} umlal $ACC2,$IN01_1,${R1} add $IN01_4,$IN01_4,$H4 umlal $ACC3,$IN01_3,${R0} umlal $ACC0,$IN01_3,${S2} umlal $ACC4,$IN01_3,${R1} umlal $ACC1,$IN01_3,${S3} umlal $ACC2,$IN01_3,${S4} umlal $ACC3,$IN01_4,${S4} umlal $ACC0,$IN01_4,${S1} umlal $ACC4,$IN01_4,${R0} umlal $ACC1,$IN01_4,${S2} umlal $ACC2,$IN01_4,${S3} .Lshort_tail: //////////////////////////////////////////////////////////////// // horizontal add addp $ACC3,$ACC3,$ACC3 ldp d8,d9,[sp,#16] // meet ABI requirements addp $ACC0,$ACC0,$ACC0 ldp d10,d11,[sp,#32] addp $ACC4,$ACC4,$ACC4 ldp d12,d13,[sp,#48] addp $ACC1,$ACC1,$ACC1 ldp d14,d15,[sp,#64] addp $ACC2,$ACC2,$ACC2 //////////////////////////////////////////////////////////////// // lazy reduction, but without narrowing ushr $T0.2d,$ACC3,#26 and $ACC3,$ACC3,$MASK.2d ushr $T1.2d,$ACC0,#26 and $ACC0,$ACC0,$MASK.2d add $ACC4,$ACC4,$T0.2d // h3 -> h4 add $ACC1,$ACC1,$T1.2d // h0 -> h1 ushr $T0.2d,$ACC4,#26 and $ACC4,$ACC4,$MASK.2d ushr $T1.2d,$ACC1,#26 and $ACC1,$ACC1,$MASK.2d add $ACC2,$ACC2,$T1.2d // h1 -> h2 add $ACC0,$ACC0,$T0.2d shl $T0.2d,$T0.2d,#2 ushr $T1.2d,$ACC2,#26 and $ACC2,$ACC2,$MASK.2d add $ACC0,$ACC0,$T0.2d // h4 -> h0 add $ACC3,$ACC3,$T1.2d // h2 -> h3 ushr $T0.2d,$ACC0,#26 and $ACC0,$ACC0,$MASK.2d ushr $T1.2d,$ACC3,#26 and $ACC3,$ACC3,$MASK.2d add $ACC1,$ACC1,$T0.2d // h0 -> h1 add $ACC4,$ACC4,$T1.2d // h3 -> h4 //////////////////////////////////////////////////////////////// // write the result, can be partially reduced st4 {$ACC0,$ACC1,$ACC2,$ACC3}[0],[$ctx],#16 st1 {$ACC4}[0],[$ctx] .Lno_data_neon: ldr x29,[sp],#80 ret .size poly1305_blocks_neon,.-poly1305_blocks_neon .type poly1305_emit_neon,%function .align 5 poly1305_emit_neon: ldr $is_base2_26,[$ctx,#24] cbz $is_base2_26,GFp_poly1305_emit ldp w10,w11,[$ctx] // load hash value base 2^26 ldp w12,w13,[$ctx,#8] ldr w14,[$ctx,#16] add $h0,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr $h1,x12,#12 adds $h0,$h0,x12,lsl#52 add $h1,$h1,x13,lsl#14 adc $h1,$h1,xzr lsr $h2,x14,#24 adds $h1,$h1,x14,lsl#40 adc $h2,$h2,xzr // can be partially reduced... ldp $t0,$t1,[$nonce] // load nonce and $d0,$h2,#-4 // ... so reduce add $d0,$d0,$h2,lsr#2 and $h2,$h2,#3 adds $h0,$h0,$d0 adcs $h1,$h1,xzr adc $h2,$h2,xzr adds $d0,$h0,#5 // compare to modulus adcs $d1,$h1,xzr adc $d2,$h2,xzr tst $d2,#-4 // see if it's carried/borrowed csel $h0,$h0,$d0,eq csel $h1,$h1,$d1,eq #ifdef __ARMEB__ ror $t0,$t0,#32 // flip nonce words ror $t1,$t1,#32 #endif adds $h0,$h0,$t0 // accumulate nonce adc $h1,$h1,$t1 #ifdef __ARMEB__ rev $h0,$h0 // flip output bytes rev $h1,$h1 #endif stp $h0,$h1,[$mac] // write result ret .size poly1305_emit_neon,.-poly1305_emit_neon .align 5 .Lzeros: .long 0,0,0,0,0,0,0,0 .LGFp_armcap_P: #ifdef __ILP32__ .long GFp_armcap_P-. #else .quad GFp_armcap_P-. #endif .asciz "Poly1305 for ARMv8, CRYPTOGAMS by " .align 2 ___ foreach (split("\n",$code)) { s/\b(shrn\s+v[0-9]+)\.[24]d/$1.2s/ or s/\b(fmov\s+)v([0-9]+)[^,]*,\s*x([0-9]+)/$1d$2,x$3/ or (m/\bdup\b/ and (s/\.[24]s/.2d/g or 1)) or (m/\b(eor|and)/ and (s/\.[248][sdh]/.16b/g or 1)) or (m/\bum(ul|la)l\b/ and (s/\.4s/.2s/g or 1)) or (m/\bum(ul|la)l2\b/ and (s/\.2s/.4s/g or 1)) or (m/\bst[1-4]\s+{[^}]+}\[/ and (s/\.[24]d/.s/g or 1)); s/\.[124]([sd])\[/.$1\[/; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/poly1305/asm/poly1305-x86.pl000064400000000000000000001013331352416253600166140ustar0000000000000000#!/usr/bin/env perl # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements Poly1305 hash for x86. # # April 2015 # # Numbers are cycles per processed byte with poly1305_blocks alone, # measured with rdtsc at fixed clock frequency. # # IALU/gcc-3.4(*) SSE2(**) AVX2 # Pentium 15.7/+80% - # PIII 6.21/+90% - # P4 19.8/+40% 3.24 # Core 2 4.85/+90% 1.80 # Westmere 4.58/+100% 1.43 # Sandy Bridge 3.90/+100% 1.36 # Haswell 3.88/+70% 1.18 0.72 # Silvermont 11.0/+40% 4.80 # VIA Nano 6.71/+90% 2.47 # Sledgehammer 3.51/+180% 4.27 # Bulldozer 4.53/+140% 1.31 # # (*) gcc 4.8 for some reason generated worse code; # (**) besides SSE2 there are floating-point and AVX options; FP # is deemed unnecessary, because pre-SSE2 processor are too # old to care about, while it's not the fastest option on # SSE2-capable ones; AVX is omitted, because it doesn't give # a lot of improvement, 5-10% depending on processor; $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; push(@INC,"${dir}","${dir}../../perlasm"); require "x86asm.pl"; $output=pop; open STDOUT,">$output"; &asm_init($ARGV[0],"poly1305-x86.pl",$ARGV[$#ARGV] eq "386"); $sse2=$avx=0; for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } if ($sse2) { &static_label("const_sse2"); &static_label("enter_blocks"); &static_label("enter_emit"); &external_label("GFp_ia32cap_P"); # This may be set to 2, but valgrind can't do AVX2 on 32-bit. Without a # way to verify test coverage, keep it disabled. # The AVX2 code was removed. $avx = 0; } ######################################################################## # Layout of opaque area is following. # # unsigned __int32 h[5]; # current hash value base 2^32 # unsigned __int32 pad; # is_base2_26 in vector context # unsigned __int32 r[4]; # key value base 2^32 &align(64); &function_begin("GFp_poly1305_init_asm"); &mov ("edi",&wparam(0)); # context &mov ("esi",&wparam(1)); # key &mov ("ebp",&wparam(2)); # function table &xor ("eax","eax"); &mov (&DWP(4*0,"edi"),"eax"); # zero hash value &mov (&DWP(4*1,"edi"),"eax"); &mov (&DWP(4*2,"edi"),"eax"); &mov (&DWP(4*3,"edi"),"eax"); &mov (&DWP(4*4,"edi"),"eax"); &mov (&DWP(4*5,"edi"),"eax"); # is_base2_26 &cmp ("esi",0); &je (&label("nokey")); if ($sse2) { &call (&label("pic_point")); &set_label("pic_point"); &blindpop("ebx"); &lea ("eax",&DWP("GFp_poly1305_blocks-".&label("pic_point"),"ebx")); &lea ("edx",&DWP("GFp_poly1305_emit-".&label("pic_point"),"ebx")); &picmeup("edi","GFp_ia32cap_P","ebx",&label("pic_point")); &mov ("ecx",&DWP(0,"edi")); &and ("ecx",1<<26|1<<24); &cmp ("ecx",1<<26|1<<24); # SSE2 and XMM? # The non-SSE2 code was removed. &lea ("eax",&DWP("_poly1305_blocks_sse2-".&label("pic_point"),"ebx")); &lea ("edx",&DWP("_poly1305_emit_sse2-".&label("pic_point"),"ebx")); # AVX2 code removed. # The non-SSE2 code was removed. &mov ("edi",&wparam(0)); # reload context &mov (&DWP(0,"ebp"),"eax"); # fill function table &mov (&DWP(4,"ebp"),"edx"); } &mov ("eax",&DWP(4*0,"esi")); # load input key &mov ("ebx",&DWP(4*1,"esi")); &mov ("ecx",&DWP(4*2,"esi")); &mov ("edx",&DWP(4*3,"esi")); &and ("eax",0x0fffffff); &and ("ebx",0x0ffffffc); &and ("ecx",0x0ffffffc); &and ("edx",0x0ffffffc); &mov (&DWP(4*6,"edi"),"eax"); &mov (&DWP(4*7,"edi"),"ebx"); &mov (&DWP(4*8,"edi"),"ecx"); &mov (&DWP(4*9,"edi"),"edx"); &mov ("eax",$sse2); &set_label("nokey"); &function_end("GFp_poly1305_init_asm"); ($h0,$h1,$h2,$h3,$h4, $d0,$d1,$d2,$d3, $r0,$r1,$r2,$r3, $s1,$s2,$s3)=map(4*$_,(0..15)); &function_begin("GFp_poly1305_blocks"); &mov ("edi",&wparam(0)); # ctx &mov ("esi",&wparam(1)); # inp &mov ("ecx",&wparam(2)); # len &set_label("enter_blocks"); &and ("ecx",-15); &jz (&label("nodata")); &stack_push(16); &mov ("eax",&DWP(4*6,"edi")); # r0 &mov ("ebx",&DWP(4*7,"edi")); # r1 &lea ("ebp",&DWP(0,"esi","ecx")); # end of input &mov ("ecx",&DWP(4*8,"edi")); # r2 &mov ("edx",&DWP(4*9,"edi")); # r3 &mov (&wparam(2),"ebp"); &mov ("ebp","esi"); &mov (&DWP($r0,"esp"),"eax"); # r0 &mov ("eax","ebx"); &shr ("eax",2); &mov (&DWP($r1,"esp"),"ebx"); # r1 &add ("eax","ebx"); # s1 &mov ("ebx","ecx"); &shr ("ebx",2); &mov (&DWP($r2,"esp"),"ecx"); # r2 &add ("ebx","ecx"); # s2 &mov ("ecx","edx"); &shr ("ecx",2); &mov (&DWP($r3,"esp"),"edx"); # r3 &add ("ecx","edx"); # s3 &mov (&DWP($s1,"esp"),"eax"); # s1 &mov (&DWP($s2,"esp"),"ebx"); # s2 &mov (&DWP($s3,"esp"),"ecx"); # s3 &mov ("eax",&DWP(4*0,"edi")); # load hash value &mov ("ebx",&DWP(4*1,"edi")); &mov ("ecx",&DWP(4*2,"edi")); &mov ("esi",&DWP(4*3,"edi")); &mov ("edi",&DWP(4*4,"edi")); &jmp (&label("loop")); &set_label("loop",32); &add ("eax",&DWP(4*0,"ebp")); # accumulate input &adc ("ebx",&DWP(4*1,"ebp")); &adc ("ecx",&DWP(4*2,"ebp")); &adc ("esi",&DWP(4*3,"ebp")); &lea ("ebp",&DWP(4*4,"ebp")); &adc ("edi",&wparam(3)); # padbit &mov (&DWP($h0,"esp"),"eax"); # put aside hash[+inp] &mov (&DWP($h3,"esp"),"esi"); &mul (&DWP($r0,"esp")); # h0*r0 &mov (&DWP($h4,"esp"),"edi"); &mov ("edi","eax"); &mov ("eax","ebx"); # h1 &mov ("esi","edx"); &mul (&DWP($s3,"esp")); # h1*s3 &add ("edi","eax"); &mov ("eax","ecx"); # h2 &adc ("esi","edx"); &mul (&DWP($s2,"esp")); # h2*s2 &add ("edi","eax"); &mov ("eax",&DWP($h3,"esp")); &adc ("esi","edx"); &mul (&DWP($s1,"esp")); # h3*s1 &add ("edi","eax"); &mov ("eax",&DWP($h0,"esp")); &adc ("esi","edx"); &mul (&DWP($r1,"esp")); # h0*r1 &mov (&DWP($d0,"esp"),"edi"); &xor ("edi","edi"); &add ("esi","eax"); &mov ("eax","ebx"); # h1 &adc ("edi","edx"); &mul (&DWP($r0,"esp")); # h1*r0 &add ("esi","eax"); &mov ("eax","ecx"); # h2 &adc ("edi","edx"); &mul (&DWP($s3,"esp")); # h2*s3 &add ("esi","eax"); &mov ("eax",&DWP($h3,"esp")); &adc ("edi","edx"); &mul (&DWP($s2,"esp")); # h3*s2 &add ("esi","eax"); &mov ("eax",&DWP($h4,"esp")); &adc ("edi","edx"); &imul ("eax",&DWP($s1,"esp")); # h4*s1 &add ("esi","eax"); &mov ("eax",&DWP($h0,"esp")); &adc ("edi",0); &mul (&DWP($r2,"esp")); # h0*r2 &mov (&DWP($d1,"esp"),"esi"); &xor ("esi","esi"); &add ("edi","eax"); &mov ("eax","ebx"); # h1 &adc ("esi","edx"); &mul (&DWP($r1,"esp")); # h1*r1 &add ("edi","eax"); &mov ("eax","ecx"); # h2 &adc ("esi","edx"); &mul (&DWP($r0,"esp")); # h2*r0 &add ("edi","eax"); &mov ("eax",&DWP($h3,"esp")); &adc ("esi","edx"); &mul (&DWP($s3,"esp")); # h3*s3 &add ("edi","eax"); &mov ("eax",&DWP($h4,"esp")); &adc ("esi","edx"); &imul ("eax",&DWP($s2,"esp")); # h4*s2 &add ("edi","eax"); &mov ("eax",&DWP($h0,"esp")); &adc ("esi",0); &mul (&DWP($r3,"esp")); # h0*r3 &mov (&DWP($d2,"esp"),"edi"); &xor ("edi","edi"); &add ("esi","eax"); &mov ("eax","ebx"); # h1 &adc ("edi","edx"); &mul (&DWP($r2,"esp")); # h1*r2 &add ("esi","eax"); &mov ("eax","ecx"); # h2 &adc ("edi","edx"); &mul (&DWP($r1,"esp")); # h2*r1 &add ("esi","eax"); &mov ("eax",&DWP($h3,"esp")); &adc ("edi","edx"); &mul (&DWP($r0,"esp")); # h3*r0 &add ("esi","eax"); &mov ("ecx",&DWP($h4,"esp")); &adc ("edi","edx"); &mov ("edx","ecx"); &imul ("ecx",&DWP($s3,"esp")); # h4*s3 &add ("esi","ecx"); &mov ("eax",&DWP($d0,"esp")); &adc ("edi",0); &imul ("edx",&DWP($r0,"esp")); # h4*r0 &add ("edx","edi"); &mov ("ebx",&DWP($d1,"esp")); &mov ("ecx",&DWP($d2,"esp")); &mov ("edi","edx"); # last reduction step &shr ("edx",2); &and ("edi",3); &lea ("edx",&DWP(0,"edx","edx",4)); # *5 &add ("eax","edx"); &adc ("ebx",0); &adc ("ecx",0); &adc ("esi",0); &adc ("edi",0); &cmp ("ebp",&wparam(2)); # done yet? &jne (&label("loop")); &mov ("edx",&wparam(0)); # ctx &stack_pop(16); &mov (&DWP(4*0,"edx"),"eax"); # store hash value &mov (&DWP(4*1,"edx"),"ebx"); &mov (&DWP(4*2,"edx"),"ecx"); &mov (&DWP(4*3,"edx"),"esi"); &mov (&DWP(4*4,"edx"),"edi"); &set_label("nodata"); &function_end("GFp_poly1305_blocks"); &function_begin("GFp_poly1305_emit"); &mov ("ebp",&wparam(0)); # context &set_label("enter_emit"); &mov ("edi",&wparam(1)); # output &mov ("eax",&DWP(4*0,"ebp")); # load hash value &mov ("ebx",&DWP(4*1,"ebp")); &mov ("ecx",&DWP(4*2,"ebp")); &mov ("edx",&DWP(4*3,"ebp")); &mov ("esi",&DWP(4*4,"ebp")); &add ("eax",5); # compare to modulus &adc ("ebx",0); &adc ("ecx",0); &adc ("edx",0); &adc ("esi",0); &shr ("esi",2); # did it carry/borrow? &neg ("esi"); # do we choose hash-modulus? &and ("eax","esi"); &and ("ebx","esi"); &and ("ecx","esi"); &and ("edx","esi"); &mov (&DWP(4*0,"edi"),"eax"); &mov (&DWP(4*1,"edi"),"ebx"); &mov (&DWP(4*2,"edi"),"ecx"); &mov (&DWP(4*3,"edi"),"edx"); ¬ ("esi"); # or original hash value? &mov ("eax",&DWP(4*0,"ebp")); &mov ("ebx",&DWP(4*1,"ebp")); &mov ("ecx",&DWP(4*2,"ebp")); &mov ("edx",&DWP(4*3,"ebp")); &mov ("ebp",&wparam(2)); &and ("eax","esi"); &and ("ebx","esi"); &and ("ecx","esi"); &and ("edx","esi"); &or ("eax",&DWP(4*0,"edi")); &or ("ebx",&DWP(4*1,"edi")); &or ("ecx",&DWP(4*2,"edi")); &or ("edx",&DWP(4*3,"edi")); &add ("eax",&DWP(4*0,"ebp")); # accumulate key &adc ("ebx",&DWP(4*1,"ebp")); &adc ("ecx",&DWP(4*2,"ebp")); &adc ("edx",&DWP(4*3,"ebp")); &mov (&DWP(4*0,"edi"),"eax"); &mov (&DWP(4*1,"edi"),"ebx"); &mov (&DWP(4*2,"edi"),"ecx"); &mov (&DWP(4*3,"edi"),"edx"); &function_end("GFp_poly1305_emit"); if ($sse2) { ######################################################################## # Layout of opaque area is following. # # unsigned __int32 h[5]; # current hash value base 2^26 # unsigned __int32 is_base2_26; # unsigned __int32 r[4]; # key value base 2^32 # unsigned __int32 pad[2]; # struct { unsigned __int32 r^4, r^3, r^2, r^1; } r[9]; # # where r^n are base 2^26 digits of degrees of multiplier key. There are # 5 digits, but last four are interleaved with multiples of 5, totalling # in 9 elements: r0, r1, 5*r1, r2, 5*r2, r3, 5*r3, r4, 5*r4. my ($D0,$D1,$D2,$D3,$D4,$T0,$T1,$T2)=map("xmm$_",(0..7)); my $MASK=$T2; # borrow and keep in mind &align (32); &function_begin_B("_poly1305_init_sse2"); &movdqu ($D4,&QWP(4*6,"edi")); # key base 2^32 &lea ("edi",&DWP(16*3,"edi")); # size optimization &mov ("ebp","esp"); &sub ("esp",16*(9+5)); &and ("esp",-16); #&pand ($D4,&QWP(96,"ebx")); # magic mask &movq ($MASK,&QWP(64,"ebx")); &movdqa ($D0,$D4); &movdqa ($D1,$D4); &movdqa ($D2,$D4); &pand ($D0,$MASK); # -> base 2^26 &psrlq ($D1,26); &psrldq ($D2,6); &pand ($D1,$MASK); &movdqa ($D3,$D2); &psrlq ($D2,4) &psrlq ($D3,30); &pand ($D2,$MASK); &pand ($D3,$MASK); &psrldq ($D4,13); &lea ("edx",&DWP(16*9,"esp")); # size optimization &mov ("ecx",2); &set_label("square"); &movdqa (&QWP(16*0,"esp"),$D0); &movdqa (&QWP(16*1,"esp"),$D1); &movdqa (&QWP(16*2,"esp"),$D2); &movdqa (&QWP(16*3,"esp"),$D3); &movdqa (&QWP(16*4,"esp"),$D4); &movdqa ($T1,$D1); &movdqa ($T0,$D2); &pslld ($T1,2); &pslld ($T0,2); &paddd ($T1,$D1); # *5 &paddd ($T0,$D2); # *5 &movdqa (&QWP(16*5,"esp"),$T1); &movdqa (&QWP(16*6,"esp"),$T0); &movdqa ($T1,$D3); &movdqa ($T0,$D4); &pslld ($T1,2); &pslld ($T0,2); &paddd ($T1,$D3); # *5 &paddd ($T0,$D4); # *5 &movdqa (&QWP(16*7,"esp"),$T1); &movdqa (&QWP(16*8,"esp"),$T0); &pshufd ($T1,$D0,0b01000100); &movdqa ($T0,$D1); &pshufd ($D1,$D1,0b01000100); &pshufd ($D2,$D2,0b01000100); &pshufd ($D3,$D3,0b01000100); &pshufd ($D4,$D4,0b01000100); &movdqa (&QWP(16*0,"edx"),$T1); &movdqa (&QWP(16*1,"edx"),$D1); &movdqa (&QWP(16*2,"edx"),$D2); &movdqa (&QWP(16*3,"edx"),$D3); &movdqa (&QWP(16*4,"edx"),$D4); ################################################################ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 &pmuludq ($D4,$D0); # h4*r0 &pmuludq ($D3,$D0); # h3*r0 &pmuludq ($D2,$D0); # h2*r0 &pmuludq ($D1,$D0); # h1*r0 &pmuludq ($D0,$T1); # h0*r0 sub pmuladd { my $load = shift; my $base = shift; $base = "esp" if (!defined($base)); ################################################################ # As for choice to "rotate" $T0-$T2 in order to move paddq # past next multiplication. While it makes code harder to read # and doesn't have significant effect on most processors, it # makes a lot of difference on Atom, up to 30% improvement. &movdqa ($T1,$T0); &pmuludq ($T0,&QWP(16*3,$base)); # r1*h3 &movdqa ($T2,$T1); &pmuludq ($T1,&QWP(16*2,$base)); # r1*h2 &paddq ($D4,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&QWP(16*1,$base)); # r1*h1 &paddq ($D3,$T1); &$load ($T1,5); # s1 &pmuludq ($T0,&QWP(16*0,$base)); # r1*h0 &paddq ($D2,$T2); &pmuludq ($T1,&QWP(16*4,$base)); # s1*h4 &$load ($T2,2); # r2^n &paddq ($D1,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&QWP(16*2,$base)); # r2*h2 &paddq ($D0,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&QWP(16*1,$base)); # r2*h1 &paddq ($D4,$T2); &$load ($T2,6); # s2^n &pmuludq ($T1,&QWP(16*0,$base)); # r2*h0 &paddq ($D3,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&QWP(16*4,$base)); # s2*h4 &paddq ($D2,$T1); &pmuludq ($T0,&QWP(16*3,$base)); # s2*h3 &$load ($T1,3); # r3^n &paddq ($D1,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&QWP(16*1,$base)); # r3*h1 &paddq ($D0,$T0); &$load ($T0,7); # s3^n &pmuludq ($T2,&QWP(16*0,$base)); # r3*h0 &paddq ($D4,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&QWP(16*4,$base)); # s3*h4 &paddq ($D3,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&QWP(16*3,$base)); # s3*h3 &paddq ($D2,$T0); &pmuludq ($T2,&QWP(16*2,$base)); # s3*h2 &$load ($T0,4); # r4^n &paddq ($D1,$T1); &$load ($T1,8); # s4^n &pmuludq ($T0,&QWP(16*0,$base)); # r4*h0 &paddq ($D0,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&QWP(16*4,$base)); # s4*h4 &paddq ($D4,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&QWP(16*1,$base)); # s4*h1 &paddq ($D3,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&QWP(16*2,$base)); # s4*h2 &paddq ($D0,$T2); &pmuludq ($T1,&QWP(16*3,$base)); # s4*h3 &movdqa ($MASK,&QWP(64,"ebx")); &paddq ($D1,$T0); &paddq ($D2,$T1); } &pmuladd (sub { my ($reg,$i)=@_; &movdqa ($reg,&QWP(16*$i,"esp")); },"edx"); sub lazy_reduction { my $extra = shift; ################################################################ # lazy reduction as discussed in "NEON crypto" by D.J. Bernstein # and P. Schwabe # # [(*) see discussion in poly1305-armv4 module] &movdqa ($T0,$D3); &pand ($D3,$MASK); &psrlq ($T0,26); &$extra () if (defined($extra)); &paddq ($T0,$D4); # h3 -> h4 &movdqa ($T1,$D0); &pand ($D0,$MASK); &psrlq ($T1,26); &movdqa ($D4,$T0); &paddq ($T1,$D1); # h0 -> h1 &psrlq ($T0,26); &pand ($D4,$MASK); &movdqa ($D1,$T1); &psrlq ($T1,26); &paddd ($D0,$T0); # favour paddd when # possible, because # paddq is "broken" # on Atom &psllq ($T0,2); &paddq ($T1,$D2); # h1 -> h2 &paddq ($T0,$D0); # h4 -> h0 (*) &pand ($D1,$MASK); &movdqa ($D2,$T1); &psrlq ($T1,26); &pand ($D2,$MASK); &paddd ($T1,$D3); # h2 -> h3 &movdqa ($D0,$T0); &psrlq ($T0,26); &movdqa ($D3,$T1); &psrlq ($T1,26); &pand ($D0,$MASK); &paddd ($D1,$T0); # h0 -> h1 &pand ($D3,$MASK); &paddd ($D4,$T1); # h3 -> h4 } &lazy_reduction (); &dec ("ecx"); &jz (&label("square_break")); &punpcklqdq ($D0,&QWP(16*0,"esp")); # 0:r^1:0:r^2 &punpcklqdq ($D1,&QWP(16*1,"esp")); &punpcklqdq ($D2,&QWP(16*2,"esp")); &punpcklqdq ($D3,&QWP(16*3,"esp")); &punpcklqdq ($D4,&QWP(16*4,"esp")); &jmp (&label("square")); &set_label("square_break"); &psllq ($D0,32); # -> r^3:0:r^4:0 &psllq ($D1,32); &psllq ($D2,32); &psllq ($D3,32); &psllq ($D4,32); &por ($D0,&QWP(16*0,"esp")); # r^3:r^1:r^4:r^2 &por ($D1,&QWP(16*1,"esp")); &por ($D2,&QWP(16*2,"esp")); &por ($D3,&QWP(16*3,"esp")); &por ($D4,&QWP(16*4,"esp")); &pshufd ($D0,$D0,0b10001101); # -> r^1:r^2:r^3:r^4 &pshufd ($D1,$D1,0b10001101); &pshufd ($D2,$D2,0b10001101); &pshufd ($D3,$D3,0b10001101); &pshufd ($D4,$D4,0b10001101); &movdqu (&QWP(16*0,"edi"),$D0); # save the table &movdqu (&QWP(16*1,"edi"),$D1); &movdqu (&QWP(16*2,"edi"),$D2); &movdqu (&QWP(16*3,"edi"),$D3); &movdqu (&QWP(16*4,"edi"),$D4); &movdqa ($T1,$D1); &movdqa ($T0,$D2); &pslld ($T1,2); &pslld ($T0,2); &paddd ($T1,$D1); # *5 &paddd ($T0,$D2); # *5 &movdqu (&QWP(16*5,"edi"),$T1); &movdqu (&QWP(16*6,"edi"),$T0); &movdqa ($T1,$D3); &movdqa ($T0,$D4); &pslld ($T1,2); &pslld ($T0,2); &paddd ($T1,$D3); # *5 &paddd ($T0,$D4); # *5 &movdqu (&QWP(16*7,"edi"),$T1); &movdqu (&QWP(16*8,"edi"),$T0); &mov ("esp","ebp"); &lea ("edi",&DWP(-16*3,"edi")); # size de-optimization &ret (); &function_end_B("_poly1305_init_sse2"); &align (32); &function_begin("_poly1305_blocks_sse2"); &mov ("edi",&wparam(0)); # ctx &mov ("esi",&wparam(1)); # inp &mov ("ecx",&wparam(2)); # len &mov ("eax",&DWP(4*5,"edi")); # is_base2_26 &and ("ecx",-16); &jz (&label("nodata")); &cmp ("ecx",64); &jae (&label("enter_sse2")); &test ("eax","eax"); # is_base2_26? &jz (&label("enter_blocks")); &set_label("enter_sse2",16); &call (&label("pic_point")); &set_label("pic_point"); &blindpop("ebx"); &lea ("ebx",&DWP(&label("const_sse2")."-".&label("pic_point"),"ebx")); &test ("eax","eax"); # is_base2_26? &jnz (&label("base2_26")); &call ("_poly1305_init_sse2"); ################################################# base 2^32 -> base 2^26 &mov ("eax",&DWP(0,"edi")); &mov ("ecx",&DWP(3,"edi")); &mov ("edx",&DWP(6,"edi")); &mov ("esi",&DWP(9,"edi")); &mov ("ebp",&DWP(13,"edi")); &mov (&DWP(4*5,"edi"),1); # is_base2_26 &shr ("ecx",2); &and ("eax",0x3ffffff); &shr ("edx",4); &and ("ecx",0x3ffffff); &shr ("esi",6); &and ("edx",0x3ffffff); &movd ($D0,"eax"); &movd ($D1,"ecx"); &movd ($D2,"edx"); &movd ($D3,"esi"); &movd ($D4,"ebp"); &mov ("esi",&wparam(1)); # [reload] inp &mov ("ecx",&wparam(2)); # [reload] len &jmp (&label("base2_32")); &set_label("base2_26",16); &movd ($D0,&DWP(4*0,"edi")); # load hash value &movd ($D1,&DWP(4*1,"edi")); &movd ($D2,&DWP(4*2,"edi")); &movd ($D3,&DWP(4*3,"edi")); &movd ($D4,&DWP(4*4,"edi")); &movdqa ($MASK,&QWP(64,"ebx")); &set_label("base2_32"); &mov ("eax",&wparam(3)); # padbit &mov ("ebp","esp"); &sub ("esp",16*(5+5+5+9+9)); &and ("esp",-16); &lea ("edi",&DWP(16*3,"edi")); # size optimization &shl ("eax",24); # padbit &test ("ecx",31); &jz (&label("even")); ################################################################ # process single block, with SSE2, because it's still faster # even though half of result is discarded &movdqu ($T1,&QWP(0,"esi")); # input &lea ("esi",&DWP(16,"esi")); &movdqa ($T0,$T1); # -> base 2^26 ... &pand ($T1,$MASK); &paddd ($D0,$T1); # ... and accumuate &movdqa ($T1,$T0); &psrlq ($T0,26); &psrldq ($T1,6); &pand ($T0,$MASK); &paddd ($D1,$T0); &movdqa ($T0,$T1); &psrlq ($T1,4); &pand ($T1,$MASK); &paddd ($D2,$T1); &movdqa ($T1,$T0); &psrlq ($T0,30); &pand ($T0,$MASK); &psrldq ($T1,7); &paddd ($D3,$T0); &movd ($T0,"eax"); # padbit &paddd ($D4,$T1); &movd ($T1,&DWP(16*0+12,"edi")); # r0 &paddd ($D4,$T0); &movdqa (&QWP(16*0,"esp"),$D0); &movdqa (&QWP(16*1,"esp"),$D1); &movdqa (&QWP(16*2,"esp"),$D2); &movdqa (&QWP(16*3,"esp"),$D3); &movdqa (&QWP(16*4,"esp"),$D4); ################################################################ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 &pmuludq ($D0,$T1); # h4*r0 &pmuludq ($D1,$T1); # h3*r0 &pmuludq ($D2,$T1); # h2*r0 &movd ($T0,&DWP(16*1+12,"edi")); # r1 &pmuludq ($D3,$T1); # h1*r0 &pmuludq ($D4,$T1); # h0*r0 &pmuladd (sub { my ($reg,$i)=@_; &movd ($reg,&DWP(16*$i+12,"edi")); }); &lazy_reduction (); &sub ("ecx",16); &jz (&label("done")); &set_label("even"); &lea ("edx",&DWP(16*(5+5+5+9),"esp"));# size optimization &lea ("eax",&DWP(-16*2,"esi")); &sub ("ecx",64); ################################################################ # expand and copy pre-calculated table to stack &movdqu ($T0,&QWP(16*0,"edi")); # r^1:r^2:r^3:r^4 &pshufd ($T1,$T0,0b01000100); # duplicate r^3:r^4 &cmovb ("esi","eax"); &pshufd ($T0,$T0,0b11101110); # duplicate r^1:r^2 &movdqa (&QWP(16*0,"edx"),$T1); &lea ("eax",&DWP(16*10,"esp")); &movdqu ($T1,&QWP(16*1,"edi")); &movdqa (&QWP(16*(0-9),"edx"),$T0); &pshufd ($T0,$T1,0b01000100); &pshufd ($T1,$T1,0b11101110); &movdqa (&QWP(16*1,"edx"),$T0); &movdqu ($T0,&QWP(16*2,"edi")); &movdqa (&QWP(16*(1-9),"edx"),$T1); &pshufd ($T1,$T0,0b01000100); &pshufd ($T0,$T0,0b11101110); &movdqa (&QWP(16*2,"edx"),$T1); &movdqu ($T1,&QWP(16*3,"edi")); &movdqa (&QWP(16*(2-9),"edx"),$T0); &pshufd ($T0,$T1,0b01000100); &pshufd ($T1,$T1,0b11101110); &movdqa (&QWP(16*3,"edx"),$T0); &movdqu ($T0,&QWP(16*4,"edi")); &movdqa (&QWP(16*(3-9),"edx"),$T1); &pshufd ($T1,$T0,0b01000100); &pshufd ($T0,$T0,0b11101110); &movdqa (&QWP(16*4,"edx"),$T1); &movdqu ($T1,&QWP(16*5,"edi")); &movdqa (&QWP(16*(4-9),"edx"),$T0); &pshufd ($T0,$T1,0b01000100); &pshufd ($T1,$T1,0b11101110); &movdqa (&QWP(16*5,"edx"),$T0); &movdqu ($T0,&QWP(16*6,"edi")); &movdqa (&QWP(16*(5-9),"edx"),$T1); &pshufd ($T1,$T0,0b01000100); &pshufd ($T0,$T0,0b11101110); &movdqa (&QWP(16*6,"edx"),$T1); &movdqu ($T1,&QWP(16*7,"edi")); &movdqa (&QWP(16*(6-9),"edx"),$T0); &pshufd ($T0,$T1,0b01000100); &pshufd ($T1,$T1,0b11101110); &movdqa (&QWP(16*7,"edx"),$T0); &movdqu ($T0,&QWP(16*8,"edi")); &movdqa (&QWP(16*(7-9),"edx"),$T1); &pshufd ($T1,$T0,0b01000100); &pshufd ($T0,$T0,0b11101110); &movdqa (&QWP(16*8,"edx"),$T1); &movdqa (&QWP(16*(8-9),"edx"),$T0); sub load_input { my ($inpbase,$offbase)=@_; &movdqu ($T0,&QWP($inpbase+0,"esi")); # load input &movdqu ($T1,&QWP($inpbase+16,"esi")); &lea ("esi",&DWP(16*2,"esi")); &movdqa (&QWP($offbase+16*2,"esp"),$D2); &movdqa (&QWP($offbase+16*3,"esp"),$D3); &movdqa (&QWP($offbase+16*4,"esp"),$D4); &movdqa ($D2,$T0); # splat input &movdqa ($D3,$T1); &psrldq ($D2,6); &psrldq ($D3,6); &movdqa ($D4,$T0); &punpcklqdq ($D2,$D3); # 2:3 &punpckhqdq ($D4,$T1); # 4 &punpcklqdq ($T0,$T1); # 0:1 &movdqa ($D3,$D2); &psrlq ($D2,4); &psrlq ($D3,30); &movdqa ($T1,$T0); &psrlq ($D4,40); # 4 &psrlq ($T1,26); &pand ($T0,$MASK); # 0 &pand ($T1,$MASK); # 1 &pand ($D2,$MASK); # 2 &pand ($D3,$MASK); # 3 &por ($D4,&QWP(0,"ebx")); # padbit, yes, always &movdqa (&QWP($offbase+16*0,"esp"),$D0) if ($offbase); &movdqa (&QWP($offbase+16*1,"esp"),$D1) if ($offbase); } &load_input (16*2,16*5); &jbe (&label("skip_loop")); &jmp (&label("loop")); &set_label("loop",32); ################################################################ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r # \___________________/ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r # \___________________/ \____________________/ ################################################################ &movdqa ($T2,&QWP(16*(0-9),"edx")); # r0^2 &movdqa (&QWP(16*1,"eax"),$T1); &movdqa (&QWP(16*2,"eax"),$D2); &movdqa (&QWP(16*3,"eax"),$D3); &movdqa (&QWP(16*4,"eax"),$D4); ################################################################ # d4 = h4*r0 + h0*r4 + h1*r3 + h2*r2 + h3*r1 # d3 = h3*r0 + h0*r3 + h1*r2 + h2*r1 + h4*5*r4 # d2 = h2*r0 + h0*r2 + h1*r1 + h3*5*r4 + h4*5*r3 # d1 = h1*r0 + h0*r1 + h2*5*r4 + h3*5*r3 + h4*5*r2 # d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1 &movdqa ($D1,$T0); &pmuludq ($T0,$T2); # h0*r0 &movdqa ($D0,$T1); &pmuludq ($T1,$T2); # h1*r0 &pmuludq ($D2,$T2); # h2*r0 &pmuludq ($D3,$T2); # h3*r0 &pmuludq ($D4,$T2); # h4*r0 sub pmuladd_alt { my $addr = shift; &pmuludq ($D0,&$addr(8)); # h1*s4 &movdqa ($T2,$D1); &pmuludq ($D1,&$addr(1)); # h0*r1 &paddq ($D0,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&$addr(2)); # h0*r2 &paddq ($D1,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&$addr(3)); # h0*r3 &paddq ($D2,$T2); &movdqa ($T2,&QWP(16*1,"eax")); # pull h1 &pmuludq ($T1,&$addr(4)); # h0*r4 &paddq ($D3,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&$addr(1)); # h1*r1 &paddq ($D4,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&$addr(2)); # h1*r2 &paddq ($D2,$T2); &movdqa ($T2,&QWP(16*2,"eax")); # pull h2 &pmuludq ($T1,&$addr(3)); # h1*r3 &paddq ($D3,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&$addr(7)); # h2*s3 &paddq ($D4,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&$addr(8)); # h2*s4 &paddq ($D0,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&$addr(1)); # h2*r1 &paddq ($D1,$T0); &movdqa ($T0,&QWP(16*3,"eax")); # pull h3 &pmuludq ($T2,&$addr(2)); # h2*r2 &paddq ($D3,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&$addr(6)); # h3*s2 &paddq ($D4,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&$addr(7)); # h3*s3 &paddq ($D0,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&$addr(8)); # h3*s4 &paddq ($D1,$T1); &movdqa ($T1,&QWP(16*4,"eax")); # pull h4 &pmuludq ($T0,&$addr(1)); # h3*r1 &paddq ($D2,$T2); &movdqa ($T2,$T1); &pmuludq ($T1,&$addr(8)); # h4*s4 &paddq ($D4,$T0); &movdqa ($T0,$T2); &pmuludq ($T2,&$addr(5)); # h4*s1 &paddq ($D3,$T1); &movdqa ($T1,$T0); &pmuludq ($T0,&$addr(6)); # h4*s2 &paddq ($D0,$T2); &movdqa ($MASK,&QWP(64,"ebx")); &pmuludq ($T1,&$addr(7)); # h4*s3 &paddq ($D1,$T0); &paddq ($D2,$T1); } &pmuladd_alt (sub { my $i=shift; &QWP(16*($i-9),"edx"); }); &load_input (-16*2,0); &lea ("eax",&DWP(-16*2,"esi")); &sub ("ecx",64); &paddd ($T0,&QWP(16*(5+0),"esp")); # add hash value &paddd ($T1,&QWP(16*(5+1),"esp")); &paddd ($D2,&QWP(16*(5+2),"esp")); &paddd ($D3,&QWP(16*(5+3),"esp")); &paddd ($D4,&QWP(16*(5+4),"esp")); &cmovb ("esi","eax"); &lea ("eax",&DWP(16*10,"esp")); &movdqa ($T2,&QWP(16*0,"edx")); # r0^4 &movdqa (&QWP(16*1,"esp"),$D1); &movdqa (&QWP(16*1,"eax"),$T1); &movdqa (&QWP(16*2,"eax"),$D2); &movdqa (&QWP(16*3,"eax"),$D3); &movdqa (&QWP(16*4,"eax"),$D4); ################################################################ # d4 += h4*r0 + h0*r4 + h1*r3 + h2*r2 + h3*r1 # d3 += h3*r0 + h0*r3 + h1*r2 + h2*r1 + h4*5*r4 # d2 += h2*r0 + h0*r2 + h1*r1 + h3*5*r4 + h4*5*r3 # d1 += h1*r0 + h0*r1 + h2*5*r4 + h3*5*r3 + h4*5*r2 # d0 += h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1 &movdqa ($D1,$T0); &pmuludq ($T0,$T2); # h0*r0 &paddq ($T0,$D0); &movdqa ($D0,$T1); &pmuludq ($T1,$T2); # h1*r0 &pmuludq ($D2,$T2); # h2*r0 &pmuludq ($D3,$T2); # h3*r0 &pmuludq ($D4,$T2); # h4*r0 &paddq ($T1,&QWP(16*1,"esp")); &paddq ($D2,&QWP(16*2,"esp")); &paddq ($D3,&QWP(16*3,"esp")); &paddq ($D4,&QWP(16*4,"esp")); &pmuladd_alt (sub { my $i=shift; &QWP(16*$i,"edx"); }); &lazy_reduction (); &load_input (16*2,16*5); &ja (&label("loop")); &set_label("skip_loop"); ################################################################ # multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 &pshufd ($T2,&QWP(16*(0-9),"edx"),0x10);# r0^n &add ("ecx",32); &jnz (&label("long_tail")); &paddd ($T0,$D0); # add hash value &paddd ($T1,$D1); &paddd ($D2,&QWP(16*7,"esp")); &paddd ($D3,&QWP(16*8,"esp")); &paddd ($D4,&QWP(16*9,"esp")); &set_label("long_tail"); &movdqa (&QWP(16*0,"eax"),$T0); &movdqa (&QWP(16*1,"eax"),$T1); &movdqa (&QWP(16*2,"eax"),$D2); &movdqa (&QWP(16*3,"eax"),$D3); &movdqa (&QWP(16*4,"eax"),$D4); ################################################################ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 &pmuludq ($T0,$T2); # h0*r0 &pmuludq ($T1,$T2); # h1*r0 &pmuludq ($D2,$T2); # h2*r0 &movdqa ($D0,$T0); &pshufd ($T0,&QWP(16*(1-9),"edx"),0x10);# r1^n &pmuludq ($D3,$T2); # h3*r0 &movdqa ($D1,$T1); &pmuludq ($D4,$T2); # h4*r0 &pmuladd (sub { my ($reg,$i)=@_; &pshufd ($reg,&QWP(16*($i-9),"edx"),0x10); },"eax"); &jz (&label("short_tail")); &load_input (-16*2,0); &pshufd ($T2,&QWP(16*0,"edx"),0x10); # r0^n &paddd ($T0,&QWP(16*5,"esp")); # add hash value &paddd ($T1,&QWP(16*6,"esp")); &paddd ($D2,&QWP(16*7,"esp")); &paddd ($D3,&QWP(16*8,"esp")); &paddd ($D4,&QWP(16*9,"esp")); ################################################################ # multiply inp[0:1] by r^4:r^3 and accumulate &movdqa (&QWP(16*0,"esp"),$T0); &pmuludq ($T0,$T2); # h0*r0 &movdqa (&QWP(16*1,"esp"),$T1); &pmuludq ($T1,$T2); # h1*r0 &paddq ($D0,$T0); &movdqa ($T0,$D2); &pmuludq ($D2,$T2); # h2*r0 &paddq ($D1,$T1); &movdqa ($T1,$D3); &pmuludq ($D3,$T2); # h3*r0 &paddq ($D2,&QWP(16*2,"esp")); &movdqa (&QWP(16*2,"esp"),$T0); &pshufd ($T0,&QWP(16*1,"edx"),0x10); # r1^n &paddq ($D3,&QWP(16*3,"esp")); &movdqa (&QWP(16*3,"esp"),$T1); &movdqa ($T1,$D4); &pmuludq ($D4,$T2); # h4*r0 &paddq ($D4,&QWP(16*4,"esp")); &movdqa (&QWP(16*4,"esp"),$T1); &pmuladd (sub { my ($reg,$i)=@_; &pshufd ($reg,&QWP(16*$i,"edx"),0x10); }); &set_label("short_tail"); ################################################################ # horizontal addition &pshufd ($T1,$D4,0b01001110); &pshufd ($T0,$D3,0b01001110); &paddq ($D4,$T1); &paddq ($D3,$T0); &pshufd ($T1,$D0,0b01001110); &pshufd ($T0,$D1,0b01001110); &paddq ($D0,$T1); &paddq ($D1,$T0); &pshufd ($T1,$D2,0b01001110); #&paddq ($D2,$T1); &lazy_reduction (sub { &paddq ($D2,$T1) }); &set_label("done"); &movd (&DWP(-16*3+4*0,"edi"),$D0); # store hash value &movd (&DWP(-16*3+4*1,"edi"),$D1); &movd (&DWP(-16*3+4*2,"edi"),$D2); &movd (&DWP(-16*3+4*3,"edi"),$D3); &movd (&DWP(-16*3+4*4,"edi"),$D4); &mov ("esp","ebp"); &set_label("nodata"); &function_end("_poly1305_blocks_sse2"); &align (32); &function_begin("_poly1305_emit_sse2"); &mov ("ebp",&wparam(0)); # context &cmp (&DWP(4*5,"ebp"),0); # is_base2_26? &je (&label("enter_emit")); &mov ("eax",&DWP(4*0,"ebp")); # load hash value &mov ("edi",&DWP(4*1,"ebp")); &mov ("ecx",&DWP(4*2,"ebp")); &mov ("edx",&DWP(4*3,"ebp")); &mov ("esi",&DWP(4*4,"ebp")); &mov ("ebx","edi"); # base 2^26 -> base 2^32 &shl ("edi",26); &shr ("ebx",6); &add ("eax","edi"); &mov ("edi","ecx"); &adc ("ebx",0); &shl ("edi",20); &shr ("ecx",12); &add ("ebx","edi"); &mov ("edi","edx"); &adc ("ecx",0); &shl ("edi",14); &shr ("edx",18); &add ("ecx","edi"); &mov ("edi","esi"); &adc ("edx",0); &shl ("edi",8); &shr ("esi",24); &add ("edx","edi"); &adc ("esi",0); # can be partially reduced &mov ("edi","esi"); # final reduction &and ("esi",3); &shr ("edi",2); &lea ("ebp",&DWP(0,"edi","edi",4)); # *5 &mov ("edi",&wparam(1)); # output &add ("eax","ebp"); &mov ("ebp",&wparam(2)); # key &adc ("ebx",0); &adc ("ecx",0); &adc ("edx",0); &adc ("esi",0); &movd ($D0,"eax"); # offload original hash value &add ("eax",5); # compare to modulus &movd ($D1,"ebx"); &adc ("ebx",0); &movd ($D2,"ecx"); &adc ("ecx",0); &movd ($D3,"edx"); &adc ("edx",0); &adc ("esi",0); &shr ("esi",2); # did it carry/borrow? &neg ("esi"); # do we choose (hash-modulus) ... &and ("eax","esi"); &and ("ebx","esi"); &and ("ecx","esi"); &and ("edx","esi"); &mov (&DWP(4*0,"edi"),"eax"); &movd ("eax",$D0); &mov (&DWP(4*1,"edi"),"ebx"); &movd ("ebx",$D1); &mov (&DWP(4*2,"edi"),"ecx"); &movd ("ecx",$D2); &mov (&DWP(4*3,"edi"),"edx"); &movd ("edx",$D3); ¬ ("esi"); # ... or original hash value? &and ("eax","esi"); &and ("ebx","esi"); &or ("eax",&DWP(4*0,"edi")); &and ("ecx","esi"); &or ("ebx",&DWP(4*1,"edi")); &and ("edx","esi"); &or ("ecx",&DWP(4*2,"edi")); &or ("edx",&DWP(4*3,"edi")); &add ("eax",&DWP(4*0,"ebp")); # accumulate key &adc ("ebx",&DWP(4*1,"ebp")); &mov (&DWP(4*0,"edi"),"eax"); &adc ("ecx",&DWP(4*2,"ebp")); &mov (&DWP(4*1,"edi"),"ebx"); &adc ("edx",&DWP(4*3,"ebp")); &mov (&DWP(4*2,"edi"),"ecx"); &mov (&DWP(4*3,"edi"),"edx"); &function_end("_poly1305_emit_sse2"); # The AVX2 code was removed. &set_label("const_sse2",64); &data_word(1<<24,0, 1<<24,0, 1<<24,0, 1<<24,0); &data_word(0,0, 0,0, 0,0, 0,0); &data_word(0x03ffffff,0,0x03ffffff,0, 0x03ffffff,0, 0x03ffffff,0); &data_word(0x0fffffff,0x0ffffffc,0x0ffffffc,0x0ffffffc); } &asciz ("Poly1305 for x86, CRYPTOGAMS by "); &align (4); &asm_finish(); close STDOUT or die "error closing STDOUT"; ring-0.16.9/crypto/poly1305/asm/poly1305-x86_64.pl000064400000000000000000001464441352416253600171410ustar0000000000000000#!/usr/bin/env perl # # ==================================================================== # Written by Andy Polyakov for the OpenSSL # project. The module is, however, dual licensed under OpenSSL and # CRYPTOGAMS licenses depending on where you obtain it. For further # details see http://www.openssl.org/~appro/cryptogams/. # ==================================================================== # # This module implements Poly1305 hash for x86_64. # # March 2015 # # Numbers are cycles per processed byte with poly1305_blocks alone, # measured with rdtsc at fixed clock frequency. # # IALU/gcc-4.8(*) AVX(**) AVX2 # P4 4.46/+120% - # Core 2 2.41/+90% - # Westmere 1.88/+120% - # Sandy Bridge 1.39/+140% 1.10 # Haswell 1.14/+175% 1.11 0.65 # Skylake 1.13/+120% 0.96 0.51 # Silvermont 2.83/+95% - # VIA Nano 1.82/+150% - # Sledgehammer 1.38/+160% - # Bulldozer 2.30/+130% 0.97 # # (*) improvement coefficients relative to clang are more modest and # are ~50% on most processors, in both cases we are comparing to # __int128 code; # (**) SSE2 implementation was attempted, but among non-AVX processors # it was faster than integer-only code only on older Intel P4 and # Core processors, 50-30%, less newer processor is, but slower on # contemporary ones, for example almost 2x slower on Atom, and as # former are naturally disappearing, SSE2 is deemed unnecessary; $flavour = shift; $output = shift; if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or die "can't locate x86_64-xlate.pl"; $avx = 2; open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; *STDOUT=*OUT; my ($ctx,$inp,$len,$padbit)=("%rdi","%rsi","%rdx","%rcx"); my ($mac,$nonce)=($inp,$len); # *_emit arguments my ($d1,$d2,$d3, $r0,$r1,$s1)=map("%r$_",(8..13)); my ($h0,$h1,$h2)=("%r14","%rbx","%rbp"); sub poly1305_iteration { # input: copy of $r1 in %rax, $h0-$h2, $r0-$r1 # output: $h0-$h2 *= $r0-$r1 $code.=<<___; mulq $h0 # h0*r1 mov %rax,$d2 mov $r0,%rax mov %rdx,$d3 mulq $h0 # h0*r0 mov %rax,$h0 # future $h0 mov $r0,%rax mov %rdx,$d1 mulq $h1 # h1*r0 add %rax,$d2 mov $s1,%rax adc %rdx,$d3 mulq $h1 # h1*s1 mov $h2,$h1 # borrow $h1 add %rax,$h0 adc %rdx,$d1 imulq $s1,$h1 # h2*s1 add $h1,$d2 mov $d1,$h1 adc \$0,$d3 imulq $r0,$h2 # h2*r0 add $d2,$h1 mov \$-4,%rax # mask value adc $h2,$d3 and $d3,%rax # last reduction step mov $d3,$h2 shr \$2,$d3 and \$3,$h2 add $d3,%rax add %rax,$h0 adc \$0,$h1 adc \$0,$h2 ___ } ######################################################################## # Layout of opaque area is following. # # unsigned __int64 h[3]; # current hash value base 2^64 # unsigned __int64 r[2]; # key value base 2^64 $code.=<<___; .text .extern GFp_ia32cap_P .globl GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .globl GFp_poly1305_blocks .hidden GFp_poly1305_blocks .globl GFp_poly1305_emit .hidden GFp_poly1305_emit .type GFp_poly1305_init_asm,\@function,3 .align 32 GFp_poly1305_init_asm: xor %rax,%rax mov %rax,0($ctx) # initialize hash value mov %rax,8($ctx) mov %rax,16($ctx) cmp \$0,$inp je .Lno_key lea GFp_poly1305_blocks(%rip),%r10 lea GFp_poly1305_emit(%rip),%r11 ___ $code.=<<___ if ($avx); mov GFp_ia32cap_P+4(%rip),%r9 lea poly1305_blocks_avx(%rip),%rax lea poly1305_emit_avx(%rip),%rcx bt \$`60-32`,%r9 # AVX? cmovc %rax,%r10 cmovc %rcx,%r11 ___ $code.=<<___ if ($avx>1); lea poly1305_blocks_avx2(%rip),%rax bt \$`5+32`,%r9 # AVX2? cmovc %rax,%r10 ___ $code.=<<___; mov \$0x0ffffffc0fffffff,%rax mov \$0x0ffffffc0ffffffc,%rcx and 0($inp),%rax and 8($inp),%rcx mov %rax,24($ctx) mov %rcx,32($ctx) ___ $code.=<<___ if ($flavour !~ /elf32/); mov %r10,0(%rdx) mov %r11,8(%rdx) ___ $code.=<<___ if ($flavour =~ /elf32/); mov %r10d,0(%rdx) mov %r11d,4(%rdx) ___ $code.=<<___; mov \$1,%eax .Lno_key: ret .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm .type GFp_poly1305_blocks,\@function,4 .align 32 GFp_poly1305_blocks: .Lblocks: shr \$4,$len jz .Lno_data # too short push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 .Lblocks_body: mov $len,%r15 # reassign $len mov 24($ctx),$r0 # load r mov 32($ctx),$s1 mov 0($ctx),$h0 # load hash value mov 8($ctx),$h1 mov 16($ctx),$h2 mov $s1,$r1 shr \$2,$s1 mov $r1,%rax add $r1,$s1 # s1 = r1 + (r1 >> 2) jmp .Loop .align 32 .Loop: add 0($inp),$h0 # accumulate input adc 8($inp),$h1 lea 16($inp),$inp adc $padbit,$h2 ___ &poly1305_iteration(); $code.=<<___; mov $r1,%rax dec %r15 # len-=16 jnz .Loop mov $h0,0($ctx) # store hash value mov $h1,8($ctx) mov $h2,16($ctx) mov 0(%rsp),%r15 mov 8(%rsp),%r14 mov 16(%rsp),%r13 mov 24(%rsp),%r12 mov 32(%rsp),%rbp mov 40(%rsp),%rbx lea 48(%rsp),%rsp .Lno_data: .Lblocks_epilogue: ret .size GFp_poly1305_blocks,.-GFp_poly1305_blocks .type GFp_poly1305_emit,\@function,3 .align 32 GFp_poly1305_emit: .Lemit: mov 0($ctx),%r8 # load hash value mov 8($ctx),%r9 mov 16($ctx),%r10 mov %r8,%rax add \$5,%r8 # compare to modulus mov %r9,%rcx adc \$0,%r9 adc \$0,%r10 shr \$2,%r10 # did 130-bit value overfow? cmovnz %r8,%rax cmovnz %r9,%rcx add 0($nonce),%rax # accumulate nonce adc 8($nonce),%rcx mov %rax,0($mac) # write result mov %rcx,8($mac) ret .size GFp_poly1305_emit,.-GFp_poly1305_emit ___ if ($avx) { ######################################################################## # Layout of opaque area is following. # # unsigned __int32 h[5]; # current hash value base 2^26 # unsigned __int32 is_base2_26; # unsigned __int64 r[2]; # key value base 2^64 # unsigned __int64 pad; # struct { unsigned __int32 r^2, r^1, r^4, r^3; } r[9]; # # where r^n are base 2^26 digits of degrees of multiplier key. There are # 5 digits, but last four are interleaved with multiples of 5, totalling # in 9 elements: r0, r1, 5*r1, r2, 5*r2, r3, 5*r3, r4, 5*r4. my ($H0,$H1,$H2,$H3,$H4, $T0,$T1,$T2,$T3,$T4, $D0,$D1,$D2,$D3,$D4, $MASK) = map("%xmm$_",(0..15)); $code.=<<___; .type __poly1305_block,\@abi-omnipotent .align 32 __poly1305_block: ___ &poly1305_iteration(); $code.=<<___; ret .size __poly1305_block,.-__poly1305_block .type __poly1305_init_avx,\@abi-omnipotent .align 32 __poly1305_init_avx: mov $r0,$h0 mov $r1,$h1 xor $h2,$h2 lea 48+64($ctx),$ctx # size optimization mov $r1,%rax call __poly1305_block # r^2 mov \$0x3ffffff,%eax # save interleaved r^2 and r base 2^26 mov \$0x3ffffff,%edx mov $h0,$d1 and $h0#d,%eax mov $r0,$d2 and $r0#d,%edx mov %eax,`16*0+0-64`($ctx) shr \$26,$d1 mov %edx,`16*0+4-64`($ctx) shr \$26,$d2 mov \$0x3ffffff,%eax mov \$0x3ffffff,%edx and $d1#d,%eax and $d2#d,%edx mov %eax,`16*1+0-64`($ctx) lea (%rax,%rax,4),%eax # *5 mov %edx,`16*1+4-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 mov %eax,`16*2+0-64`($ctx) shr \$26,$d1 mov %edx,`16*2+4-64`($ctx) shr \$26,$d2 mov $h1,%rax mov $r1,%rdx shl \$12,%rax shl \$12,%rdx or $d1,%rax or $d2,%rdx and \$0x3ffffff,%eax and \$0x3ffffff,%edx mov %eax,`16*3+0-64`($ctx) lea (%rax,%rax,4),%eax # *5 mov %edx,`16*3+4-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 mov %eax,`16*4+0-64`($ctx) mov $h1,$d1 mov %edx,`16*4+4-64`($ctx) mov $r1,$d2 mov \$0x3ffffff,%eax mov \$0x3ffffff,%edx shr \$14,$d1 shr \$14,$d2 and $d1#d,%eax and $d2#d,%edx mov %eax,`16*5+0-64`($ctx) lea (%rax,%rax,4),%eax # *5 mov %edx,`16*5+4-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 mov %eax,`16*6+0-64`($ctx) shr \$26,$d1 mov %edx,`16*6+4-64`($ctx) shr \$26,$d2 mov $h2,%rax shl \$24,%rax or %rax,$d1 mov $d1#d,`16*7+0-64`($ctx) lea ($d1,$d1,4),$d1 # *5 mov $d2#d,`16*7+4-64`($ctx) lea ($d2,$d2,4),$d2 # *5 mov $d1#d,`16*8+0-64`($ctx) mov $d2#d,`16*8+4-64`($ctx) mov $r1,%rax call __poly1305_block # r^3 mov \$0x3ffffff,%eax # save r^3 base 2^26 mov $h0,$d1 and $h0#d,%eax shr \$26,$d1 mov %eax,`16*0+12-64`($ctx) mov \$0x3ffffff,%edx and $d1#d,%edx mov %edx,`16*1+12-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 shr \$26,$d1 mov %edx,`16*2+12-64`($ctx) mov $h1,%rax shl \$12,%rax or $d1,%rax and \$0x3ffffff,%eax mov %eax,`16*3+12-64`($ctx) lea (%rax,%rax,4),%eax # *5 mov $h1,$d1 mov %eax,`16*4+12-64`($ctx) mov \$0x3ffffff,%edx shr \$14,$d1 and $d1#d,%edx mov %edx,`16*5+12-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 shr \$26,$d1 mov %edx,`16*6+12-64`($ctx) mov $h2,%rax shl \$24,%rax or %rax,$d1 mov $d1#d,`16*7+12-64`($ctx) lea ($d1,$d1,4),$d1 # *5 mov $d1#d,`16*8+12-64`($ctx) mov $r1,%rax call __poly1305_block # r^4 mov \$0x3ffffff,%eax # save r^4 base 2^26 mov $h0,$d1 and $h0#d,%eax shr \$26,$d1 mov %eax,`16*0+8-64`($ctx) mov \$0x3ffffff,%edx and $d1#d,%edx mov %edx,`16*1+8-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 shr \$26,$d1 mov %edx,`16*2+8-64`($ctx) mov $h1,%rax shl \$12,%rax or $d1,%rax and \$0x3ffffff,%eax mov %eax,`16*3+8-64`($ctx) lea (%rax,%rax,4),%eax # *5 mov $h1,$d1 mov %eax,`16*4+8-64`($ctx) mov \$0x3ffffff,%edx shr \$14,$d1 and $d1#d,%edx mov %edx,`16*5+8-64`($ctx) lea (%rdx,%rdx,4),%edx # *5 shr \$26,$d1 mov %edx,`16*6+8-64`($ctx) mov $h2,%rax shl \$24,%rax or %rax,$d1 mov $d1#d,`16*7+8-64`($ctx) lea ($d1,$d1,4),$d1 # *5 mov $d1#d,`16*8+8-64`($ctx) lea -48-64($ctx),$ctx # size [de-]optimization ret .size __poly1305_init_avx,.-__poly1305_init_avx .type poly1305_blocks_avx,\@function,4 .align 32 poly1305_blocks_avx: mov 20($ctx),%r8d # is_base2_26 cmp \$128,$len jae .Lblocks_avx test %r8d,%r8d jz .Lblocks .Lblocks_avx: and \$-16,$len jz .Lno_data_avx vzeroupper test %r8d,%r8d jz .Lbase2_64_avx test \$31,$len jz .Leven_avx push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 .Lblocks_avx_body: mov $len,%r15 # reassign $len mov 0($ctx),$d1 # load hash value mov 8($ctx),$d2 mov 16($ctx),$h2#d mov 24($ctx),$r0 # load r mov 32($ctx),$s1 ################################# base 2^26 -> base 2^64 mov $d1#d,$h0#d and \$`-1*(1<<31)`,$d1 mov $d2,$r1 # borrow $r1 mov $d2#d,$h1#d and \$`-1*(1<<31)`,$d2 shr \$6,$d1 shl \$52,$r1 add $d1,$h0 shr \$12,$h1 shr \$18,$d2 add $r1,$h0 adc $d2,$h1 mov $h2,$d1 shl \$40,$d1 shr \$24,$h2 add $d1,$h1 adc \$0,$h2 # can be partially reduced... mov \$-4,$d2 # ... so reduce mov $h2,$d1 and $h2,$d2 shr \$2,$d1 and \$3,$h2 add $d2,$d1 # =*5 add $d1,$h0 adc \$0,$h1 adc \$0,$h2 mov $s1,$r1 mov $s1,%rax shr \$2,$s1 add $r1,$s1 # s1 = r1 + (r1 >> 2) add 0($inp),$h0 # accumulate input adc 8($inp),$h1 lea 16($inp),$inp adc $padbit,$h2 call __poly1305_block test $padbit,$padbit # if $padbit is zero, jz .Lstore_base2_64_avx # store hash in base 2^64 format ################################# base 2^64 -> base 2^26 mov $h0,%rax mov $h0,%rdx shr \$52,$h0 mov $h1,$r0 mov $h1,$r1 shr \$26,%rdx and \$0x3ffffff,%rax # h[0] shl \$12,$r0 and \$0x3ffffff,%rdx # h[1] shr \$14,$h1 or $r0,$h0 shl \$24,$h2 and \$0x3ffffff,$h0 # h[2] shr \$40,$r1 and \$0x3ffffff,$h1 # h[3] or $r1,$h2 # h[4] sub \$16,%r15 jz .Lstore_base2_26_avx vmovd %rax#d,$H0 vmovd %rdx#d,$H1 vmovd $h0#d,$H2 vmovd $h1#d,$H3 vmovd $h2#d,$H4 jmp .Lproceed_avx .align 32 .Lstore_base2_64_avx: mov $h0,0($ctx) mov $h1,8($ctx) mov $h2,16($ctx) # note that is_base2_26 is zeroed jmp .Ldone_avx .align 16 .Lstore_base2_26_avx: mov %rax#d,0($ctx) # store hash value base 2^26 mov %rdx#d,4($ctx) mov $h0#d,8($ctx) mov $h1#d,12($ctx) mov $h2#d,16($ctx) .align 16 .Ldone_avx: mov 0(%rsp),%r15 mov 8(%rsp),%r14 mov 16(%rsp),%r13 mov 24(%rsp),%r12 mov 32(%rsp),%rbp mov 40(%rsp),%rbx lea 48(%rsp),%rsp .Lno_data_avx: .Lblocks_avx_epilogue: ret .align 32 .Lbase2_64_avx: push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 .Lbase2_64_avx_body: mov $len,%r15 # reassign $len mov 24($ctx),$r0 # load r mov 32($ctx),$s1 mov 0($ctx),$h0 # load hash value mov 8($ctx),$h1 mov 16($ctx),$h2#d mov $s1,$r1 mov $s1,%rax shr \$2,$s1 add $r1,$s1 # s1 = r1 + (r1 >> 2) test \$31,$len jz .Linit_avx add 0($inp),$h0 # accumulate input adc 8($inp),$h1 lea 16($inp),$inp adc $padbit,$h2 sub \$16,%r15 call __poly1305_block .Linit_avx: ################################# base 2^64 -> base 2^26 mov $h0,%rax mov $h0,%rdx shr \$52,$h0 mov $h1,$d1 mov $h1,$d2 shr \$26,%rdx and \$0x3ffffff,%rax # h[0] shl \$12,$d1 and \$0x3ffffff,%rdx # h[1] shr \$14,$h1 or $d1,$h0 shl \$24,$h2 and \$0x3ffffff,$h0 # h[2] shr \$40,$d2 and \$0x3ffffff,$h1 # h[3] or $d2,$h2 # h[4] vmovd %rax#d,$H0 vmovd %rdx#d,$H1 vmovd $h0#d,$H2 vmovd $h1#d,$H3 vmovd $h2#d,$H4 movl \$1,20($ctx) # set is_base2_26 call __poly1305_init_avx .Lproceed_avx: mov %r15,$len mov 0(%rsp),%r15 mov 8(%rsp),%r14 mov 16(%rsp),%r13 mov 24(%rsp),%r12 mov 32(%rsp),%rbp mov 40(%rsp),%rbx lea 48(%rsp),%rax lea 48(%rsp),%rsp .Lbase2_64_avx_epilogue: jmp .Ldo_avx .align 32 .Leven_avx: vmovd 4*0($ctx),$H0 # load hash value vmovd 4*1($ctx),$H1 vmovd 4*2($ctx),$H2 vmovd 4*3($ctx),$H3 vmovd 4*4($ctx),$H4 .Ldo_avx: ___ $code.=<<___ if (!$win64); lea -0x58(%rsp),%r11 sub \$0x178,%rsp ___ $code.=<<___ if ($win64); lea -0xf8(%rsp),%r11 sub \$0x218,%rsp vmovdqa %xmm6,0x50(%r11) vmovdqa %xmm7,0x60(%r11) vmovdqa %xmm8,0x70(%r11) vmovdqa %xmm9,0x80(%r11) vmovdqa %xmm10,0x90(%r11) vmovdqa %xmm11,0xa0(%r11) vmovdqa %xmm12,0xb0(%r11) vmovdqa %xmm13,0xc0(%r11) vmovdqa %xmm14,0xd0(%r11) vmovdqa %xmm15,0xe0(%r11) .Ldo_avx_body: ___ $code.=<<___; sub \$64,$len lea -32($inp),%rax cmovc %rax,$inp vmovdqu `16*3`($ctx),$D4 # preload r0^2 lea `16*3+64`($ctx),$ctx # size optimization lea .Lconst(%rip),%rcx ################################################################ # load input vmovdqu 16*2($inp),$T0 vmovdqu 16*3($inp),$T1 vmovdqa 64(%rcx),$MASK # .Lmask26 vpsrldq \$6,$T0,$T2 # splat input vpsrldq \$6,$T1,$T3 vpunpckhqdq $T1,$T0,$T4 # 4 vpunpcklqdq $T1,$T0,$T0 # 0:1 vpunpcklqdq $T3,$T2,$T3 # 2:3 vpsrlq \$40,$T4,$T4 # 4 vpsrlq \$26,$T0,$T1 vpand $MASK,$T0,$T0 # 0 vpsrlq \$4,$T3,$T2 vpand $MASK,$T1,$T1 # 1 vpsrlq \$30,$T3,$T3 vpand $MASK,$T2,$T2 # 2 vpand $MASK,$T3,$T3 # 3 vpor 32(%rcx),$T4,$T4 # padbit, yes, always jbe .Lskip_loop_avx # expand and copy pre-calculated table to stack vmovdqu `16*1-64`($ctx),$D1 vmovdqu `16*2-64`($ctx),$D2 vpshufd \$0xEE,$D4,$D3 # 34xx -> 3434 vpshufd \$0x44,$D4,$D0 # xx12 -> 1212 vmovdqa $D3,-0x90(%r11) vmovdqa $D0,0x00(%rsp) vpshufd \$0xEE,$D1,$D4 vmovdqu `16*3-64`($ctx),$D0 vpshufd \$0x44,$D1,$D1 vmovdqa $D4,-0x80(%r11) vmovdqa $D1,0x10(%rsp) vpshufd \$0xEE,$D2,$D3 vmovdqu `16*4-64`($ctx),$D1 vpshufd \$0x44,$D2,$D2 vmovdqa $D3,-0x70(%r11) vmovdqa $D2,0x20(%rsp) vpshufd \$0xEE,$D0,$D4 vmovdqu `16*5-64`($ctx),$D2 vpshufd \$0x44,$D0,$D0 vmovdqa $D4,-0x60(%r11) vmovdqa $D0,0x30(%rsp) vpshufd \$0xEE,$D1,$D3 vmovdqu `16*6-64`($ctx),$D0 vpshufd \$0x44,$D1,$D1 vmovdqa $D3,-0x50(%r11) vmovdqa $D1,0x40(%rsp) vpshufd \$0xEE,$D2,$D4 vmovdqu `16*7-64`($ctx),$D1 vpshufd \$0x44,$D2,$D2 vmovdqa $D4,-0x40(%r11) vmovdqa $D2,0x50(%rsp) vpshufd \$0xEE,$D0,$D3 vmovdqu `16*8-64`($ctx),$D2 vpshufd \$0x44,$D0,$D0 vmovdqa $D3,-0x30(%r11) vmovdqa $D0,0x60(%rsp) vpshufd \$0xEE,$D1,$D4 vpshufd \$0x44,$D1,$D1 vmovdqa $D4,-0x20(%r11) vmovdqa $D1,0x70(%rsp) vpshufd \$0xEE,$D2,$D3 vmovdqa 0x00(%rsp),$D4 # preload r0^2 vpshufd \$0x44,$D2,$D2 vmovdqa $D3,-0x10(%r11) vmovdqa $D2,0x80(%rsp) jmp .Loop_avx .align 32 .Loop_avx: ################################################################ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r # \___________________/ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r # \___________________/ \____________________/ # # Note that we start with inp[2:3]*r^2. This is because it # doesn't depend on reduction in previous iteration. ################################################################ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 # # though note that $Tx and $Hx are "reversed" in this section, # and $D4 is preloaded with r0^2... vpmuludq $T0,$D4,$D0 # d0 = h0*r0 vpmuludq $T1,$D4,$D1 # d1 = h1*r0 vmovdqa $H2,0x20(%r11) # offload hash vpmuludq $T2,$D4,$D2 # d3 = h2*r0 vmovdqa 0x10(%rsp),$H2 # r1^2 vpmuludq $T3,$D4,$D3 # d3 = h3*r0 vpmuludq $T4,$D4,$D4 # d4 = h4*r0 vmovdqa $H0,0x00(%r11) # vpmuludq 0x20(%rsp),$T4,$H0 # h4*s1 vmovdqa $H1,0x10(%r11) # vpmuludq $T3,$H2,$H1 # h3*r1 vpaddq $H0,$D0,$D0 # d0 += h4*s1 vpaddq $H1,$D4,$D4 # d4 += h3*r1 vmovdqa $H3,0x30(%r11) # vpmuludq $T2,$H2,$H0 # h2*r1 vpmuludq $T1,$H2,$H1 # h1*r1 vpaddq $H0,$D3,$D3 # d3 += h2*r1 vmovdqa 0x30(%rsp),$H3 # r2^2 vpaddq $H1,$D2,$D2 # d2 += h1*r1 vmovdqa $H4,0x40(%r11) # vpmuludq $T0,$H2,$H2 # h0*r1 vpmuludq $T2,$H3,$H0 # h2*r2 vpaddq $H2,$D1,$D1 # d1 += h0*r1 vmovdqa 0x40(%rsp),$H4 # s2^2 vpaddq $H0,$D4,$D4 # d4 += h2*r2 vpmuludq $T1,$H3,$H1 # h1*r2 vpmuludq $T0,$H3,$H3 # h0*r2 vpaddq $H1,$D3,$D3 # d3 += h1*r2 vmovdqa 0x50(%rsp),$H2 # r3^2 vpaddq $H3,$D2,$D2 # d2 += h0*r2 vpmuludq $T4,$H4,$H0 # h4*s2 vpmuludq $T3,$H4,$H4 # h3*s2 vpaddq $H0,$D1,$D1 # d1 += h4*s2 vmovdqa 0x60(%rsp),$H3 # s3^2 vpaddq $H4,$D0,$D0 # d0 += h3*s2 vmovdqa 0x80(%rsp),$H4 # s4^2 vpmuludq $T1,$H2,$H1 # h1*r3 vpmuludq $T0,$H2,$H2 # h0*r3 vpaddq $H1,$D4,$D4 # d4 += h1*r3 vpaddq $H2,$D3,$D3 # d3 += h0*r3 vpmuludq $T4,$H3,$H0 # h4*s3 vpmuludq $T3,$H3,$H1 # h3*s3 vpaddq $H0,$D2,$D2 # d2 += h4*s3 vmovdqu 16*0($inp),$H0 # load input vpaddq $H1,$D1,$D1 # d1 += h3*s3 vpmuludq $T2,$H3,$H3 # h2*s3 vpmuludq $T2,$H4,$T2 # h2*s4 vpaddq $H3,$D0,$D0 # d0 += h2*s3 vmovdqu 16*1($inp),$H1 # vpaddq $T2,$D1,$D1 # d1 += h2*s4 vpmuludq $T3,$H4,$T3 # h3*s4 vpmuludq $T4,$H4,$T4 # h4*s4 vpsrldq \$6,$H0,$H2 # splat input vpaddq $T3,$D2,$D2 # d2 += h3*s4 vpaddq $T4,$D3,$D3 # d3 += h4*s4 vpsrldq \$6,$H1,$H3 # vpmuludq 0x70(%rsp),$T0,$T4 # h0*r4 vpmuludq $T1,$H4,$T0 # h1*s4 vpunpckhqdq $H1,$H0,$H4 # 4 vpaddq $T4,$D4,$D4 # d4 += h0*r4 vmovdqa -0x90(%r11),$T4 # r0^4 vpaddq $T0,$D0,$D0 # d0 += h1*s4 vpunpcklqdq $H1,$H0,$H0 # 0:1 vpunpcklqdq $H3,$H2,$H3 # 2:3 #vpsrlq \$40,$H4,$H4 # 4 vpsrldq \$`40/8`,$H4,$H4 # 4 vpsrlq \$26,$H0,$H1 vpand $MASK,$H0,$H0 # 0 vpsrlq \$4,$H3,$H2 vpand $MASK,$H1,$H1 # 1 vpand 0(%rcx),$H4,$H4 # .Lmask24 vpsrlq \$30,$H3,$H3 vpand $MASK,$H2,$H2 # 2 vpand $MASK,$H3,$H3 # 3 vpor 32(%rcx),$H4,$H4 # padbit, yes, always vpaddq 0x00(%r11),$H0,$H0 # add hash value vpaddq 0x10(%r11),$H1,$H1 vpaddq 0x20(%r11),$H2,$H2 vpaddq 0x30(%r11),$H3,$H3 vpaddq 0x40(%r11),$H4,$H4 lea 16*2($inp),%rax lea 16*4($inp),$inp sub \$64,$len cmovc %rax,$inp ################################################################ # Now we accumulate (inp[0:1]+hash)*r^4 ################################################################ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 vpmuludq $H0,$T4,$T0 # h0*r0 vpmuludq $H1,$T4,$T1 # h1*r0 vpaddq $T0,$D0,$D0 vpaddq $T1,$D1,$D1 vmovdqa -0x80(%r11),$T2 # r1^4 vpmuludq $H2,$T4,$T0 # h2*r0 vpmuludq $H3,$T4,$T1 # h3*r0 vpaddq $T0,$D2,$D2 vpaddq $T1,$D3,$D3 vpmuludq $H4,$T4,$T4 # h4*r0 vpmuludq -0x70(%r11),$H4,$T0 # h4*s1 vpaddq $T4,$D4,$D4 vpaddq $T0,$D0,$D0 # d0 += h4*s1 vpmuludq $H2,$T2,$T1 # h2*r1 vpmuludq $H3,$T2,$T0 # h3*r1 vpaddq $T1,$D3,$D3 # d3 += h2*r1 vmovdqa -0x60(%r11),$T3 # r2^4 vpaddq $T0,$D4,$D4 # d4 += h3*r1 vpmuludq $H1,$T2,$T1 # h1*r1 vpmuludq $H0,$T2,$T2 # h0*r1 vpaddq $T1,$D2,$D2 # d2 += h1*r1 vpaddq $T2,$D1,$D1 # d1 += h0*r1 vmovdqa -0x50(%r11),$T4 # s2^4 vpmuludq $H2,$T3,$T0 # h2*r2 vpmuludq $H1,$T3,$T1 # h1*r2 vpaddq $T0,$D4,$D4 # d4 += h2*r2 vpaddq $T1,$D3,$D3 # d3 += h1*r2 vmovdqa -0x40(%r11),$T2 # r3^4 vpmuludq $H0,$T3,$T3 # h0*r2 vpmuludq $H4,$T4,$T0 # h4*s2 vpaddq $T3,$D2,$D2 # d2 += h0*r2 vpaddq $T0,$D1,$D1 # d1 += h4*s2 vmovdqa -0x30(%r11),$T3 # s3^4 vpmuludq $H3,$T4,$T4 # h3*s2 vpmuludq $H1,$T2,$T1 # h1*r3 vpaddq $T4,$D0,$D0 # d0 += h3*s2 vmovdqa -0x10(%r11),$T4 # s4^4 vpaddq $T1,$D4,$D4 # d4 += h1*r3 vpmuludq $H0,$T2,$T2 # h0*r3 vpmuludq $H4,$T3,$T0 # h4*s3 vpaddq $T2,$D3,$D3 # d3 += h0*r3 vpaddq $T0,$D2,$D2 # d2 += h4*s3 vmovdqu 16*2($inp),$T0 # load input vpmuludq $H3,$T3,$T2 # h3*s3 vpmuludq $H2,$T3,$T3 # h2*s3 vpaddq $T2,$D1,$D1 # d1 += h3*s3 vmovdqu 16*3($inp),$T1 # vpaddq $T3,$D0,$D0 # d0 += h2*s3 vpmuludq $H2,$T4,$H2 # h2*s4 vpmuludq $H3,$T4,$H3 # h3*s4 vpsrldq \$6,$T0,$T2 # splat input vpaddq $H2,$D1,$D1 # d1 += h2*s4 vpmuludq $H4,$T4,$H4 # h4*s4 vpsrldq \$6,$T1,$T3 # vpaddq $H3,$D2,$H2 # h2 = d2 + h3*s4 vpaddq $H4,$D3,$H3 # h3 = d3 + h4*s4 vpmuludq -0x20(%r11),$H0,$H4 # h0*r4 vpmuludq $H1,$T4,$H0 vpunpckhqdq $T1,$T0,$T4 # 4 vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4 vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4 vpunpcklqdq $T1,$T0,$T0 # 0:1 vpunpcklqdq $T3,$T2,$T3 # 2:3 #vpsrlq \$40,$T4,$T4 # 4 vpsrldq \$`40/8`,$T4,$T4 # 4 vpsrlq \$26,$T0,$T1 vmovdqa 0x00(%rsp),$D4 # preload r0^2 vpand $MASK,$T0,$T0 # 0 vpsrlq \$4,$T3,$T2 vpand $MASK,$T1,$T1 # 1 vpand 0(%rcx),$T4,$T4 # .Lmask24 vpsrlq \$30,$T3,$T3 vpand $MASK,$T2,$T2 # 2 vpand $MASK,$T3,$T3 # 3 vpor 32(%rcx),$T4,$T4 # padbit, yes, always ################################################################ # lazy reduction as discussed in "NEON crypto" by D.J. Bernstein # and P. Schwabe vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$D1,$H1 # h0 -> h1 vpsrlq \$26,$H4,$D0 vpand $MASK,$H4,$H4 vpsrlq \$26,$H1,$D1 vpand $MASK,$H1,$H1 vpaddq $D1,$H2,$H2 # h1 -> h2 vpaddq $D0,$H0,$H0 vpsllq \$2,$D0,$D0 vpaddq $D0,$H0,$H0 # h4 -> h0 vpsrlq \$26,$H2,$D2 vpand $MASK,$H2,$H2 vpaddq $D2,$H3,$H3 # h2 -> h3 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$H1,$H1 # h0 -> h1 vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 ja .Loop_avx .Lskip_loop_avx: ################################################################ # multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 vpshufd \$0x10,$D4,$D4 # r0^n, xx12 -> x1x2 add \$32,$len jnz .Long_tail_avx vpaddq $H2,$T2,$T2 vpaddq $H0,$T0,$T0 vpaddq $H1,$T1,$T1 vpaddq $H3,$T3,$T3 vpaddq $H4,$T4,$T4 .Long_tail_avx: vmovdqa $H2,0x20(%r11) vmovdqa $H0,0x00(%r11) vmovdqa $H1,0x10(%r11) vmovdqa $H3,0x30(%r11) vmovdqa $H4,0x40(%r11) # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 vpmuludq $T2,$D4,$D2 # d2 = h2*r0 vpmuludq $T0,$D4,$D0 # d0 = h0*r0 vpshufd \$0x10,`16*1-64`($ctx),$H2 # r1^n vpmuludq $T1,$D4,$D1 # d1 = h1*r0 vpmuludq $T3,$D4,$D3 # d3 = h3*r0 vpmuludq $T4,$D4,$D4 # d4 = h4*r0 vpmuludq $T3,$H2,$H0 # h3*r1 vpaddq $H0,$D4,$D4 # d4 += h3*r1 vpshufd \$0x10,`16*2-64`($ctx),$H3 # s1^n vpmuludq $T2,$H2,$H1 # h2*r1 vpaddq $H1,$D3,$D3 # d3 += h2*r1 vpshufd \$0x10,`16*3-64`($ctx),$H4 # r2^n vpmuludq $T1,$H2,$H0 # h1*r1 vpaddq $H0,$D2,$D2 # d2 += h1*r1 vpmuludq $T0,$H2,$H2 # h0*r1 vpaddq $H2,$D1,$D1 # d1 += h0*r1 vpmuludq $T4,$H3,$H3 # h4*s1 vpaddq $H3,$D0,$D0 # d0 += h4*s1 vpshufd \$0x10,`16*4-64`($ctx),$H2 # s2^n vpmuludq $T2,$H4,$H1 # h2*r2 vpaddq $H1,$D4,$D4 # d4 += h2*r2 vpmuludq $T1,$H4,$H0 # h1*r2 vpaddq $H0,$D3,$D3 # d3 += h1*r2 vpshufd \$0x10,`16*5-64`($ctx),$H3 # r3^n vpmuludq $T0,$H4,$H4 # h0*r2 vpaddq $H4,$D2,$D2 # d2 += h0*r2 vpmuludq $T4,$H2,$H1 # h4*s2 vpaddq $H1,$D1,$D1 # d1 += h4*s2 vpshufd \$0x10,`16*6-64`($ctx),$H4 # s3^n vpmuludq $T3,$H2,$H2 # h3*s2 vpaddq $H2,$D0,$D0 # d0 += h3*s2 vpmuludq $T1,$H3,$H0 # h1*r3 vpaddq $H0,$D4,$D4 # d4 += h1*r3 vpmuludq $T0,$H3,$H3 # h0*r3 vpaddq $H3,$D3,$D3 # d3 += h0*r3 vpshufd \$0x10,`16*7-64`($ctx),$H2 # r4^n vpmuludq $T4,$H4,$H1 # h4*s3 vpaddq $H1,$D2,$D2 # d2 += h4*s3 vpshufd \$0x10,`16*8-64`($ctx),$H3 # s4^n vpmuludq $T3,$H4,$H0 # h3*s3 vpaddq $H0,$D1,$D1 # d1 += h3*s3 vpmuludq $T2,$H4,$H4 # h2*s3 vpaddq $H4,$D0,$D0 # d0 += h2*s3 vpmuludq $T0,$H2,$H2 # h0*r4 vpaddq $H2,$D4,$D4 # h4 = d4 + h0*r4 vpmuludq $T4,$H3,$H1 # h4*s4 vpaddq $H1,$D3,$D3 # h3 = d3 + h4*s4 vpmuludq $T3,$H3,$H0 # h3*s4 vpaddq $H0,$D2,$D2 # h2 = d2 + h3*s4 vpmuludq $T2,$H3,$H1 # h2*s4 vpaddq $H1,$D1,$D1 # h1 = d1 + h2*s4 vpmuludq $T1,$H3,$H3 # h1*s4 vpaddq $H3,$D0,$D0 # h0 = d0 + h1*s4 jz .Lshort_tail_avx vmovdqu 16*0($inp),$H0 # load input vmovdqu 16*1($inp),$H1 vpsrldq \$6,$H0,$H2 # splat input vpsrldq \$6,$H1,$H3 vpunpckhqdq $H1,$H0,$H4 # 4 vpunpcklqdq $H1,$H0,$H0 # 0:1 vpunpcklqdq $H3,$H2,$H3 # 2:3 vpsrlq \$40,$H4,$H4 # 4 vpsrlq \$26,$H0,$H1 vpand $MASK,$H0,$H0 # 0 vpsrlq \$4,$H3,$H2 vpand $MASK,$H1,$H1 # 1 vpsrlq \$30,$H3,$H3 vpand $MASK,$H2,$H2 # 2 vpand $MASK,$H3,$H3 # 3 vpor 32(%rcx),$H4,$H4 # padbit, yes, always vpshufd \$0x32,`16*0-64`($ctx),$T4 # r0^n, 34xx -> x3x4 vpaddq 0x00(%r11),$H0,$H0 vpaddq 0x10(%r11),$H1,$H1 vpaddq 0x20(%r11),$H2,$H2 vpaddq 0x30(%r11),$H3,$H3 vpaddq 0x40(%r11),$H4,$H4 ################################################################ # multiply (inp[0:1]+hash) by r^4:r^3 and accumulate vpmuludq $H0,$T4,$T0 # h0*r0 vpaddq $T0,$D0,$D0 # d0 += h0*r0 vpmuludq $H1,$T4,$T1 # h1*r0 vpaddq $T1,$D1,$D1 # d1 += h1*r0 vpmuludq $H2,$T4,$T0 # h2*r0 vpaddq $T0,$D2,$D2 # d2 += h2*r0 vpshufd \$0x32,`16*1-64`($ctx),$T2 # r1^n vpmuludq $H3,$T4,$T1 # h3*r0 vpaddq $T1,$D3,$D3 # d3 += h3*r0 vpmuludq $H4,$T4,$T4 # h4*r0 vpaddq $T4,$D4,$D4 # d4 += h4*r0 vpmuludq $H3,$T2,$T0 # h3*r1 vpaddq $T0,$D4,$D4 # d4 += h3*r1 vpshufd \$0x32,`16*2-64`($ctx),$T3 # s1 vpmuludq $H2,$T2,$T1 # h2*r1 vpaddq $T1,$D3,$D3 # d3 += h2*r1 vpshufd \$0x32,`16*3-64`($ctx),$T4 # r2 vpmuludq $H1,$T2,$T0 # h1*r1 vpaddq $T0,$D2,$D2 # d2 += h1*r1 vpmuludq $H0,$T2,$T2 # h0*r1 vpaddq $T2,$D1,$D1 # d1 += h0*r1 vpmuludq $H4,$T3,$T3 # h4*s1 vpaddq $T3,$D0,$D0 # d0 += h4*s1 vpshufd \$0x32,`16*4-64`($ctx),$T2 # s2 vpmuludq $H2,$T4,$T1 # h2*r2 vpaddq $T1,$D4,$D4 # d4 += h2*r2 vpmuludq $H1,$T4,$T0 # h1*r2 vpaddq $T0,$D3,$D3 # d3 += h1*r2 vpshufd \$0x32,`16*5-64`($ctx),$T3 # r3 vpmuludq $H0,$T4,$T4 # h0*r2 vpaddq $T4,$D2,$D2 # d2 += h0*r2 vpmuludq $H4,$T2,$T1 # h4*s2 vpaddq $T1,$D1,$D1 # d1 += h4*s2 vpshufd \$0x32,`16*6-64`($ctx),$T4 # s3 vpmuludq $H3,$T2,$T2 # h3*s2 vpaddq $T2,$D0,$D0 # d0 += h3*s2 vpmuludq $H1,$T3,$T0 # h1*r3 vpaddq $T0,$D4,$D4 # d4 += h1*r3 vpmuludq $H0,$T3,$T3 # h0*r3 vpaddq $T3,$D3,$D3 # d3 += h0*r3 vpshufd \$0x32,`16*7-64`($ctx),$T2 # r4 vpmuludq $H4,$T4,$T1 # h4*s3 vpaddq $T1,$D2,$D2 # d2 += h4*s3 vpshufd \$0x32,`16*8-64`($ctx),$T3 # s4 vpmuludq $H3,$T4,$T0 # h3*s3 vpaddq $T0,$D1,$D1 # d1 += h3*s3 vpmuludq $H2,$T4,$T4 # h2*s3 vpaddq $T4,$D0,$D0 # d0 += h2*s3 vpmuludq $H0,$T2,$T2 # h0*r4 vpaddq $T2,$D4,$D4 # d4 += h0*r4 vpmuludq $H4,$T3,$T1 # h4*s4 vpaddq $T1,$D3,$D3 # d3 += h4*s4 vpmuludq $H3,$T3,$T0 # h3*s4 vpaddq $T0,$D2,$D2 # d2 += h3*s4 vpmuludq $H2,$T3,$T1 # h2*s4 vpaddq $T1,$D1,$D1 # d1 += h2*s4 vpmuludq $H1,$T3,$T3 # h1*s4 vpaddq $T3,$D0,$D0 # d0 += h1*s4 .Lshort_tail_avx: ################################################################ # horizontal addition vpsrldq \$8,$D4,$T4 vpsrldq \$8,$D3,$T3 vpsrldq \$8,$D1,$T1 vpsrldq \$8,$D0,$T0 vpsrldq \$8,$D2,$T2 vpaddq $T3,$D3,$D3 vpaddq $T4,$D4,$D4 vpaddq $T0,$D0,$D0 vpaddq $T1,$D1,$D1 vpaddq $T2,$D2,$D2 ################################################################ # lazy reduction vpsrlq \$26,$D3,$H3 vpand $MASK,$D3,$D3 vpaddq $H3,$D4,$D4 # h3 -> h4 vpsrlq \$26,$D0,$H0 vpand $MASK,$D0,$D0 vpaddq $H0,$D1,$D1 # h0 -> h1 vpsrlq \$26,$D4,$H4 vpand $MASK,$D4,$D4 vpsrlq \$26,$D1,$H1 vpand $MASK,$D1,$D1 vpaddq $H1,$D2,$D2 # h1 -> h2 vpaddq $H4,$D0,$D0 vpsllq \$2,$H4,$H4 vpaddq $H4,$D0,$D0 # h4 -> h0 vpsrlq \$26,$D2,$H2 vpand $MASK,$D2,$D2 vpaddq $H2,$D3,$D3 # h2 -> h3 vpsrlq \$26,$D0,$H0 vpand $MASK,$D0,$D0 vpaddq $H0,$D1,$D1 # h0 -> h1 vpsrlq \$26,$D3,$H3 vpand $MASK,$D3,$D3 vpaddq $H3,$D4,$D4 # h3 -> h4 vmovd $D0,`4*0-48-64`($ctx) # save partially reduced vmovd $D1,`4*1-48-64`($ctx) vmovd $D2,`4*2-48-64`($ctx) vmovd $D3,`4*3-48-64`($ctx) vmovd $D4,`4*4-48-64`($ctx) ___ $code.=<<___ if ($win64); vmovdqa 0x50(%r11),%xmm6 vmovdqa 0x60(%r11),%xmm7 vmovdqa 0x70(%r11),%xmm8 vmovdqa 0x80(%r11),%xmm9 vmovdqa 0x90(%r11),%xmm10 vmovdqa 0xa0(%r11),%xmm11 vmovdqa 0xb0(%r11),%xmm12 vmovdqa 0xc0(%r11),%xmm13 vmovdqa 0xd0(%r11),%xmm14 vmovdqa 0xe0(%r11),%xmm15 lea 0xf8(%r11),%rsp .Ldo_avx_epilogue: ___ $code.=<<___ if (!$win64); lea 0x58(%r11),%rsp ___ $code.=<<___; vzeroupper ret .size poly1305_blocks_avx,.-poly1305_blocks_avx .type poly1305_emit_avx,\@function,3 .align 32 poly1305_emit_avx: cmpl \$0,20($ctx) # is_base2_26? je .Lemit mov 0($ctx),%eax # load hash value base 2^26 mov 4($ctx),%ecx mov 8($ctx),%r8d mov 12($ctx),%r11d mov 16($ctx),%r10d shl \$26,%rcx # base 2^26 -> base 2^64 mov %r8,%r9 shl \$52,%r8 add %rcx,%rax shr \$12,%r9 add %rax,%r8 # h0 adc \$0,%r9 shl \$14,%r11 mov %r10,%rax shr \$24,%r10 add %r11,%r9 shl \$40,%rax add %rax,%r9 # h1 adc \$0,%r10 # h2 mov %r10,%rax # could be partially reduced, so reduce mov %r10,%rcx and \$3,%r10 shr \$2,%rax and \$-4,%rcx add %rcx,%rax add %rax,%r8 adc \$0,%r9 adc \$0,%r10 mov %r8,%rax add \$5,%r8 # compare to modulus mov %r9,%rcx adc \$0,%r9 adc \$0,%r10 shr \$2,%r10 # did 130-bit value overfow? cmovnz %r8,%rax cmovnz %r9,%rcx add 0($nonce),%rax # accumulate nonce adc 8($nonce),%rcx mov %rax,0($mac) # write result mov %rcx,8($mac) ret .size poly1305_emit_avx,.-poly1305_emit_avx ___ if ($avx>1) { my ($H0,$H1,$H2,$H3,$H4, $MASK, $T4,$T0,$T1,$T2,$T3, $D0,$D1,$D2,$D3,$D4) = map("%ymm$_",(0..15)); my $S4=$MASK; $code.=<<___; .type poly1305_blocks_avx2,\@function,4 .align 32 poly1305_blocks_avx2: mov 20($ctx),%r8d # is_base2_26 cmp \$128,$len jae .Lblocks_avx2 test %r8d,%r8d jz .Lblocks .Lblocks_avx2: and \$-16,$len jz .Lno_data_avx2 vzeroupper test %r8d,%r8d jz .Lbase2_64_avx2 test \$63,$len jz .Leven_avx2 push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 .Lblocks_avx2_body: mov $len,%r15 # reassign $len mov 0($ctx),$d1 # load hash value mov 8($ctx),$d2 mov 16($ctx),$h2#d mov 24($ctx),$r0 # load r mov 32($ctx),$s1 ################################# base 2^26 -> base 2^64 mov $d1#d,$h0#d and \$`-1*(1<<31)`,$d1 mov $d2,$r1 # borrow $r1 mov $d2#d,$h1#d and \$`-1*(1<<31)`,$d2 shr \$6,$d1 shl \$52,$r1 add $d1,$h0 shr \$12,$h1 shr \$18,$d2 add $r1,$h0 adc $d2,$h1 mov $h2,$d1 shl \$40,$d1 shr \$24,$h2 add $d1,$h1 adc \$0,$h2 # can be partially reduced... mov \$-4,$d2 # ... so reduce mov $h2,$d1 and $h2,$d2 shr \$2,$d1 and \$3,$h2 add $d2,$d1 # =*5 add $d1,$h0 adc \$0,$h1 adc \$0,$h2 mov $s1,$r1 mov $s1,%rax shr \$2,$s1 add $r1,$s1 # s1 = r1 + (r1 >> 2) .Lbase2_26_pre_avx2: add 0($inp),$h0 # accumulate input adc 8($inp),$h1 lea 16($inp),$inp adc $padbit,$h2 sub \$16,%r15 call __poly1305_block mov $r1,%rax test \$63,%r15 jnz .Lbase2_26_pre_avx2 test $padbit,$padbit # if $padbit is zero, jz .Lstore_base2_64_avx2 # store hash in base 2^64 format ################################# base 2^64 -> base 2^26 mov $h0,%rax mov $h0,%rdx shr \$52,$h0 mov $h1,$r0 mov $h1,$r1 shr \$26,%rdx and \$0x3ffffff,%rax # h[0] shl \$12,$r0 and \$0x3ffffff,%rdx # h[1] shr \$14,$h1 or $r0,$h0 shl \$24,$h2 and \$0x3ffffff,$h0 # h[2] shr \$40,$r1 and \$0x3ffffff,$h1 # h[3] or $r1,$h2 # h[4] test %r15,%r15 jz .Lstore_base2_26_avx2 vmovd %rax#d,%x#$H0 vmovd %rdx#d,%x#$H1 vmovd $h0#d,%x#$H2 vmovd $h1#d,%x#$H3 vmovd $h2#d,%x#$H4 jmp .Lproceed_avx2 .align 32 .Lstore_base2_64_avx2: mov $h0,0($ctx) mov $h1,8($ctx) mov $h2,16($ctx) # note that is_base2_26 is zeroed jmp .Ldone_avx2 .align 16 .Lstore_base2_26_avx2: mov %rax#d,0($ctx) # store hash value base 2^26 mov %rdx#d,4($ctx) mov $h0#d,8($ctx) mov $h1#d,12($ctx) mov $h2#d,16($ctx) .align 16 .Ldone_avx2: mov 0(%rsp),%r15 mov 8(%rsp),%r14 mov 16(%rsp),%r13 mov 24(%rsp),%r12 mov 32(%rsp),%rbp mov 40(%rsp),%rbx lea 48(%rsp),%rsp .Lno_data_avx2: .Lblocks_avx2_epilogue: ret .align 32 .Lbase2_64_avx2: push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 .Lbase2_64_avx2_body: mov $len,%r15 # reassign $len mov 24($ctx),$r0 # load r mov 32($ctx),$s1 mov 0($ctx),$h0 # load hash value mov 8($ctx),$h1 mov 16($ctx),$h2#d mov $s1,$r1 mov $s1,%rax shr \$2,$s1 add $r1,$s1 # s1 = r1 + (r1 >> 2) test \$63,$len jz .Linit_avx2 .Lbase2_64_pre_avx2: add 0($inp),$h0 # accumulate input adc 8($inp),$h1 lea 16($inp),$inp adc $padbit,$h2 sub \$16,%r15 call __poly1305_block mov $r1,%rax test \$63,%r15 jnz .Lbase2_64_pre_avx2 .Linit_avx2: ################################# base 2^64 -> base 2^26 mov $h0,%rax mov $h0,%rdx shr \$52,$h0 mov $h1,$d1 mov $h1,$d2 shr \$26,%rdx and \$0x3ffffff,%rax # h[0] shl \$12,$d1 and \$0x3ffffff,%rdx # h[1] shr \$14,$h1 or $d1,$h0 shl \$24,$h2 and \$0x3ffffff,$h0 # h[2] shr \$40,$d2 and \$0x3ffffff,$h1 # h[3] or $d2,$h2 # h[4] vmovd %rax#d,%x#$H0 vmovd %rdx#d,%x#$H1 vmovd $h0#d,%x#$H2 vmovd $h1#d,%x#$H3 vmovd $h2#d,%x#$H4 movl \$1,20($ctx) # set is_base2_26 call __poly1305_init_avx .Lproceed_avx2: mov %r15,$len mov 0(%rsp),%r15 mov 8(%rsp),%r14 mov 16(%rsp),%r13 mov 24(%rsp),%r12 mov 32(%rsp),%rbp mov 40(%rsp),%rbx lea 48(%rsp),%rax lea 48(%rsp),%rsp .Lbase2_64_avx2_epilogue: jmp .Ldo_avx2 .align 32 .Leven_avx2: vmovd 4*0($ctx),%x#$H0 # load hash value base 2^26 vmovd 4*1($ctx),%x#$H1 vmovd 4*2($ctx),%x#$H2 vmovd 4*3($ctx),%x#$H3 vmovd 4*4($ctx),%x#$H4 .Ldo_avx2: ___ $code.=<<___ if (!$win64); lea -8(%rsp),%r11 sub \$0x128,%rsp ___ $code.=<<___ if ($win64); lea -0xf8(%rsp),%r11 sub \$0x1c8,%rsp vmovdqa %xmm6,0x50(%r11) vmovdqa %xmm7,0x60(%r11) vmovdqa %xmm8,0x70(%r11) vmovdqa %xmm9,0x80(%r11) vmovdqa %xmm10,0x90(%r11) vmovdqa %xmm11,0xa0(%r11) vmovdqa %xmm12,0xb0(%r11) vmovdqa %xmm13,0xc0(%r11) vmovdqa %xmm14,0xd0(%r11) vmovdqa %xmm15,0xe0(%r11) .Ldo_avx2_body: ___ $code.=<<___; lea 48+64($ctx),$ctx # size optimization lea .Lconst(%rip),%rcx # expand and copy pre-calculated table to stack vmovdqu `16*0-64`($ctx),%x#$T2 and \$-512,%rsp vmovdqu `16*1-64`($ctx),%x#$T3 vmovdqu `16*2-64`($ctx),%x#$T4 vmovdqu `16*3-64`($ctx),%x#$D0 vmovdqu `16*4-64`($ctx),%x#$D1 vmovdqu `16*5-64`($ctx),%x#$D2 vmovdqu `16*6-64`($ctx),%x#$D3 vpermq \$0x15,$T2,$T2 # 00003412 -> 12343434 vmovdqu `16*7-64`($ctx),%x#$D4 vpermq \$0x15,$T3,$T3 vpshufd \$0xc8,$T2,$T2 # 12343434 -> 14243444 vmovdqu `16*8-64`($ctx),%x#$MASK vpermq \$0x15,$T4,$T4 vpshufd \$0xc8,$T3,$T3 vmovdqa $T2,0x00(%rsp) vpermq \$0x15,$D0,$D0 vpshufd \$0xc8,$T4,$T4 vmovdqa $T3,0x20(%rsp) vpermq \$0x15,$D1,$D1 vpshufd \$0xc8,$D0,$D0 vmovdqa $T4,0x40(%rsp) vpermq \$0x15,$D2,$D2 vpshufd \$0xc8,$D1,$D1 vmovdqa $D0,0x60(%rsp) vpermq \$0x15,$D3,$D3 vpshufd \$0xc8,$D2,$D2 vmovdqa $D1,0x80(%rsp) vpermq \$0x15,$D4,$D4 vpshufd \$0xc8,$D3,$D3 vmovdqa $D2,0xa0(%rsp) vpermq \$0x15,$MASK,$MASK vpshufd \$0xc8,$D4,$D4 vmovdqa $D3,0xc0(%rsp) vpshufd \$0xc8,$MASK,$MASK vmovdqa $D4,0xe0(%rsp) vmovdqa $MASK,0x100(%rsp) vmovdqa 64(%rcx),$MASK # .Lmask26 ################################################################ # load input vmovdqu 16*0($inp),%x#$T0 vmovdqu 16*1($inp),%x#$T1 vinserti128 \$1,16*2($inp),$T0,$T0 vinserti128 \$1,16*3($inp),$T1,$T1 lea 16*4($inp),$inp vpsrldq \$6,$T0,$T2 # splat input vpsrldq \$6,$T1,$T3 vpunpckhqdq $T1,$T0,$T4 # 4 vpunpcklqdq $T3,$T2,$T2 # 2:3 vpunpcklqdq $T1,$T0,$T0 # 0:1 vpsrlq \$30,$T2,$T3 vpsrlq \$4,$T2,$T2 vpsrlq \$26,$T0,$T1 vpsrlq \$40,$T4,$T4 # 4 vpand $MASK,$T2,$T2 # 2 vpand $MASK,$T0,$T0 # 0 vpand $MASK,$T1,$T1 # 1 vpand $MASK,$T3,$T3 # 3 vpor 32(%rcx),$T4,$T4 # padbit, yes, always lea 0x90(%rsp),%rax # size optimization vpaddq $H2,$T2,$H2 # accumulate input sub \$64,$len jz .Ltail_avx2 jmp .Loop_avx2 .align 32 .Loop_avx2: ################################################################ # ((inp[0]*r^4+r[4])*r^4+r[8])*r^4 # ((inp[1]*r^4+r[5])*r^4+r[9])*r^3 # ((inp[2]*r^4+r[6])*r^4+r[10])*r^2 # ((inp[3]*r^4+r[7])*r^4+r[11])*r^1 # \________/\________/ ################################################################ #vpaddq $H2,$T2,$H2 # accumulate input vpaddq $H0,$T0,$H0 vmovdqa `32*0`(%rsp),$T0 # r0^4 vpaddq $H1,$T1,$H1 vmovdqa `32*1`(%rsp),$T1 # r1^4 vpaddq $H3,$T3,$H3 vmovdqa `32*3`(%rsp),$T2 # r2^4 vpaddq $H4,$T4,$H4 vmovdqa `32*6-0x90`(%rax),$T3 # s3^4 vmovdqa `32*8-0x90`(%rax),$S4 # s4^4 # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 # # however, as h2 is "chronologically" first one available pull # corresponding operations up, so it's # # d4 = h2*r2 + h4*r0 + h3*r1 + h1*r3 + h0*r4 # d3 = h2*r1 + h3*r0 + h1*r2 + h0*r3 + h4*5*r4 # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 # d1 = h2*5*r4 + h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 # d0 = h2*5*r3 + h0*r0 + h4*5*r1 + h3*5*r2 + h1*5*r4 vpmuludq $H2,$T0,$D2 # d2 = h2*r0 vpmuludq $H2,$T1,$D3 # d3 = h2*r1 vpmuludq $H2,$T2,$D4 # d4 = h2*r2 vpmuludq $H2,$T3,$D0 # d0 = h2*s3 vpmuludq $H2,$S4,$D1 # d1 = h2*s4 vpmuludq $H0,$T1,$T4 # h0*r1 vpmuludq $H1,$T1,$H2 # h1*r1, borrow $H2 as temp vpaddq $T4,$D1,$D1 # d1 += h0*r1 vpaddq $H2,$D2,$D2 # d2 += h1*r1 vpmuludq $H3,$T1,$T4 # h3*r1 vpmuludq `32*2`(%rsp),$H4,$H2 # h4*s1 vpaddq $T4,$D4,$D4 # d4 += h3*r1 vpaddq $H2,$D0,$D0 # d0 += h4*s1 vmovdqa `32*4-0x90`(%rax),$T1 # s2 vpmuludq $H0,$T0,$T4 # h0*r0 vpmuludq $H1,$T0,$H2 # h1*r0 vpaddq $T4,$D0,$D0 # d0 += h0*r0 vpaddq $H2,$D1,$D1 # d1 += h1*r0 vpmuludq $H3,$T0,$T4 # h3*r0 vpmuludq $H4,$T0,$H2 # h4*r0 vmovdqu 16*0($inp),%x#$T0 # load input vpaddq $T4,$D3,$D3 # d3 += h3*r0 vpaddq $H2,$D4,$D4 # d4 += h4*r0 vinserti128 \$1,16*2($inp),$T0,$T0 vpmuludq $H3,$T1,$T4 # h3*s2 vpmuludq $H4,$T1,$H2 # h4*s2 vmovdqu 16*1($inp),%x#$T1 vpaddq $T4,$D0,$D0 # d0 += h3*s2 vpaddq $H2,$D1,$D1 # d1 += h4*s2 vmovdqa `32*5-0x90`(%rax),$H2 # r3 vpmuludq $H1,$T2,$T4 # h1*r2 vpmuludq $H0,$T2,$T2 # h0*r2 vpaddq $T4,$D3,$D3 # d3 += h1*r2 vpaddq $T2,$D2,$D2 # d2 += h0*r2 vinserti128 \$1,16*3($inp),$T1,$T1 lea 16*4($inp),$inp vpmuludq $H1,$H2,$T4 # h1*r3 vpmuludq $H0,$H2,$H2 # h0*r3 vpsrldq \$6,$T0,$T2 # splat input vpaddq $T4,$D4,$D4 # d4 += h1*r3 vpaddq $H2,$D3,$D3 # d3 += h0*r3 vpmuludq $H3,$T3,$T4 # h3*s3 vpmuludq $H4,$T3,$H2 # h4*s3 vpsrldq \$6,$T1,$T3 vpaddq $T4,$D1,$D1 # d1 += h3*s3 vpaddq $H2,$D2,$D2 # d2 += h4*s3 vpunpckhqdq $T1,$T0,$T4 # 4 vpmuludq $H3,$S4,$H3 # h3*s4 vpmuludq $H4,$S4,$H4 # h4*s4 vpunpcklqdq $T1,$T0,$T0 # 0:1 vpaddq $H3,$D2,$H2 # h2 = d2 + h3*r4 vpaddq $H4,$D3,$H3 # h3 = d3 + h4*r4 vpunpcklqdq $T3,$T2,$T3 # 2:3 vpmuludq `32*7-0x90`(%rax),$H0,$H4 # h0*r4 vpmuludq $H1,$S4,$H0 # h1*s4 vmovdqa 64(%rcx),$MASK # .Lmask26 vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4 vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4 ################################################################ # lazy reduction (interleaved with tail of input splat) vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$D1,$H1 # h0 -> h1 vpsrlq \$26,$H4,$D4 vpand $MASK,$H4,$H4 vpsrlq \$4,$T3,$T2 vpsrlq \$26,$H1,$D1 vpand $MASK,$H1,$H1 vpaddq $D1,$H2,$H2 # h1 -> h2 vpaddq $D4,$H0,$H0 vpsllq \$2,$D4,$D4 vpaddq $D4,$H0,$H0 # h4 -> h0 vpand $MASK,$T2,$T2 # 2 vpsrlq \$26,$T0,$T1 vpsrlq \$26,$H2,$D2 vpand $MASK,$H2,$H2 vpaddq $D2,$H3,$H3 # h2 -> h3 vpaddq $T2,$H2,$H2 # modulo-scheduled vpsrlq \$30,$T3,$T3 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$H1,$H1 # h0 -> h1 vpsrlq \$40,$T4,$T4 # 4 vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 vpand $MASK,$T0,$T0 # 0 vpand $MASK,$T1,$T1 # 1 vpand $MASK,$T3,$T3 # 3 vpor 32(%rcx),$T4,$T4 # padbit, yes, always sub \$64,$len jnz .Loop_avx2 .byte 0x66,0x90 .Ltail_avx2: ################################################################ # while above multiplications were by r^4 in all lanes, in last # iteration we multiply least significant lane by r^4 and most # significant one by r, so copy of above except that references # to the precomputed table are displaced by 4... #vpaddq $H2,$T2,$H2 # accumulate input vpaddq $H0,$T0,$H0 vmovdqu `32*0+4`(%rsp),$T0 # r0^4 vpaddq $H1,$T1,$H1 vmovdqu `32*1+4`(%rsp),$T1 # r1^4 vpaddq $H3,$T3,$H3 vmovdqu `32*3+4`(%rsp),$T2 # r2^4 vpaddq $H4,$T4,$H4 vmovdqu `32*6+4-0x90`(%rax),$T3 # s3^4 vmovdqu `32*8+4-0x90`(%rax),$S4 # s4^4 vpmuludq $H2,$T0,$D2 # d2 = h2*r0 vpmuludq $H2,$T1,$D3 # d3 = h2*r1 vpmuludq $H2,$T2,$D4 # d4 = h2*r2 vpmuludq $H2,$T3,$D0 # d0 = h2*s3 vpmuludq $H2,$S4,$D1 # d1 = h2*s4 vpmuludq $H0,$T1,$T4 # h0*r1 vpmuludq $H1,$T1,$H2 # h1*r1 vpaddq $T4,$D1,$D1 # d1 += h0*r1 vpaddq $H2,$D2,$D2 # d2 += h1*r1 vpmuludq $H3,$T1,$T4 # h3*r1 vpmuludq `32*2+4`(%rsp),$H4,$H2 # h4*s1 vpaddq $T4,$D4,$D4 # d4 += h3*r1 vpaddq $H2,$D0,$D0 # d0 += h4*s1 vpmuludq $H0,$T0,$T4 # h0*r0 vpmuludq $H1,$T0,$H2 # h1*r0 vpaddq $T4,$D0,$D0 # d0 += h0*r0 vmovdqu `32*4+4-0x90`(%rax),$T1 # s2 vpaddq $H2,$D1,$D1 # d1 += h1*r0 vpmuludq $H3,$T0,$T4 # h3*r0 vpmuludq $H4,$T0,$H2 # h4*r0 vpaddq $T4,$D3,$D3 # d3 += h3*r0 vpaddq $H2,$D4,$D4 # d4 += h4*r0 vpmuludq $H3,$T1,$T4 # h3*s2 vpmuludq $H4,$T1,$H2 # h4*s2 vpaddq $T4,$D0,$D0 # d0 += h3*s2 vpaddq $H2,$D1,$D1 # d1 += h4*s2 vmovdqu `32*5+4-0x90`(%rax),$H2 # r3 vpmuludq $H1,$T2,$T4 # h1*r2 vpmuludq $H0,$T2,$T2 # h0*r2 vpaddq $T4,$D3,$D3 # d3 += h1*r2 vpaddq $T2,$D2,$D2 # d2 += h0*r2 vpmuludq $H1,$H2,$T4 # h1*r3 vpmuludq $H0,$H2,$H2 # h0*r3 vpaddq $T4,$D4,$D4 # d4 += h1*r3 vpaddq $H2,$D3,$D3 # d3 += h0*r3 vpmuludq $H3,$T3,$T4 # h3*s3 vpmuludq $H4,$T3,$H2 # h4*s3 vpaddq $T4,$D1,$D1 # d1 += h3*s3 vpaddq $H2,$D2,$D2 # d2 += h4*s3 vpmuludq $H3,$S4,$H3 # h3*s4 vpmuludq $H4,$S4,$H4 # h4*s4 vpaddq $H3,$D2,$H2 # h2 = d2 + h3*r4 vpaddq $H4,$D3,$H3 # h3 = d3 + h4*r4 vpmuludq `32*7+4-0x90`(%rax),$H0,$H4 # h0*r4 vpmuludq $H1,$S4,$H0 # h1*s4 vmovdqa 64(%rcx),$MASK # .Lmask26 vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4 vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4 ################################################################ # horizontal addition vpsrldq \$8,$D1,$T1 vpsrldq \$8,$H2,$T2 vpsrldq \$8,$H3,$T3 vpsrldq \$8,$H4,$T4 vpsrldq \$8,$H0,$T0 vpaddq $T1,$D1,$D1 vpaddq $T2,$H2,$H2 vpaddq $T3,$H3,$H3 vpaddq $T4,$H4,$H4 vpaddq $T0,$H0,$H0 vpermq \$0x2,$H3,$T3 vpermq \$0x2,$H4,$T4 vpermq \$0x2,$H0,$T0 vpermq \$0x2,$D1,$T1 vpermq \$0x2,$H2,$T2 vpaddq $T3,$H3,$H3 vpaddq $T4,$H4,$H4 vpaddq $T0,$H0,$H0 vpaddq $T1,$D1,$D1 vpaddq $T2,$H2,$H2 ################################################################ # lazy reduction vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$D1,$H1 # h0 -> h1 vpsrlq \$26,$H4,$D4 vpand $MASK,$H4,$H4 vpsrlq \$26,$H1,$D1 vpand $MASK,$H1,$H1 vpaddq $D1,$H2,$H2 # h1 -> h2 vpaddq $D4,$H0,$H0 vpsllq \$2,$D4,$D4 vpaddq $D4,$H0,$H0 # h4 -> h0 vpsrlq \$26,$H2,$D2 vpand $MASK,$H2,$H2 vpaddq $D2,$H3,$H3 # h2 -> h3 vpsrlq \$26,$H0,$D0 vpand $MASK,$H0,$H0 vpaddq $D0,$H1,$H1 # h0 -> h1 vpsrlq \$26,$H3,$D3 vpand $MASK,$H3,$H3 vpaddq $D3,$H4,$H4 # h3 -> h4 vmovd %x#$H0,`4*0-48-64`($ctx)# save partially reduced vmovd %x#$H1,`4*1-48-64`($ctx) vmovd %x#$H2,`4*2-48-64`($ctx) vmovd %x#$H3,`4*3-48-64`($ctx) vmovd %x#$H4,`4*4-48-64`($ctx) ___ $code.=<<___ if ($win64); vmovdqa 0x50(%r11),%xmm6 vmovdqa 0x60(%r11),%xmm7 vmovdqa 0x70(%r11),%xmm8 vmovdqa 0x80(%r11),%xmm9 vmovdqa 0x90(%r11),%xmm10 vmovdqa 0xa0(%r11),%xmm11 vmovdqa 0xb0(%r11),%xmm12 vmovdqa 0xc0(%r11),%xmm13 vmovdqa 0xd0(%r11),%xmm14 vmovdqa 0xe0(%r11),%xmm15 lea 0xf8(%r11),%rsp .Ldo_avx2_epilogue: ___ $code.=<<___ if (!$win64); lea 8(%r11),%rsp ___ $code.=<<___; vzeroupper ret .size poly1305_blocks_avx2,.-poly1305_blocks_avx2 ___ } $code.=<<___; .align 64 .Lconst: .Lmask24: .long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0 .L129: .long `1<<24`,0,`1<<24`,0,`1<<24`,0,`1<<24`,0 .Lmask26: .long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0 .Lfive: .long 5,0,5,0,5,0,5,0 ___ } $code.=<<___; .asciz "Poly1305 for x86_64, CRYPTOGAMS by " .align 16 ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, # CONTEXT *context,DISPATCHER_CONTEXT *disp) if ($win64) { $rec="%rcx"; $frame="%rdx"; $context="%r8"; $disp="%r9"; $code.=<<___; .extern __imp_RtlVirtualUnwind .type se_handler,\@abi-omnipotent .align 16 se_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->Rip<.Lprologue jb .Lcommon_seh_tail mov 152($context),%rax # pull context->Rsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=.Lepilogue jae .Lcommon_seh_tail lea 48(%rax),%rax mov -8(%rax),%rbx mov -16(%rax),%rbp mov -24(%rax),%r12 mov -32(%rax),%r13 mov -40(%rax),%r14 mov -48(%rax),%r15 mov %rbx,144($context) # restore context->Rbx mov %rbp,160($context) # restore context->Rbp mov %r12,216($context) # restore context->R12 mov %r13,224($context) # restore context->R13 mov %r14,232($context) # restore context->R14 mov %r15,240($context) # restore context->R14 jmp .Lcommon_seh_tail .size se_handler,.-se_handler .type avx_handler,\@abi-omnipotent .align 16 avx_handler: push %rsi push %rdi push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 pushfq sub \$64,%rsp mov 120($context),%rax # pull context->Rax mov 248($context),%rbx # pull context->Rip mov 8($disp),%rsi # disp->ImageBase mov 56($disp),%r11 # disp->HandlerData mov 0(%r11),%r10d # HandlerData[0] lea (%rsi,%r10),%r10 # prologue label cmp %r10,%rbx # context->RipRsp mov 4(%r11),%r10d # HandlerData[1] lea (%rsi,%r10),%r10 # epilogue label cmp %r10,%rbx # context->Rip>=epilogue label jae .Lcommon_seh_tail mov 208($context),%rax # pull context->R11 lea 0x50(%rax),%rsi lea 0xf8(%rax),%rax lea 512($context),%rdi # &context.Xmm6 mov \$20,%ecx .long 0xa548f3fc # cld; rep movsq .Lcommon_seh_tail: mov 8(%rax),%rdi mov 16(%rax),%rsi mov %rax,152($context) # restore context->Rsp mov %rsi,168($context) # restore context->Rsi mov %rdi,176($context) # restore context->Rdi mov 40($disp),%rdi # disp->ContextRecord mov $context,%rsi # context mov \$154,%ecx # sizeof(CONTEXT) .long 0xa548f3fc # cld; rep movsq mov $disp,%rsi xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER mov 8(%rsi),%rdx # arg2, disp->ImageBase mov 0(%rsi),%r8 # arg3, disp->ControlPc mov 16(%rsi),%r9 # arg4, disp->FunctionEntry mov 40(%rsi),%r10 # disp->ContextRecord lea 56(%rsi),%r11 # &disp->HandlerData lea 24(%rsi),%r12 # &disp->EstablisherFrame mov %r10,32(%rsp) # arg5 mov %r11,40(%rsp) # arg6 mov %r12,48(%rsp) # arg7 mov %rcx,56(%rsp) # arg8, (NULL) call *__imp_RtlVirtualUnwind(%rip) mov \$1,%eax # ExceptionContinueSearch add \$64,%rsp popfq pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx pop %rdi pop %rsi ret .size avx_handler,.-avx_handler .section .pdata .align 4 .rva .LSEH_begin_GFp_poly1305_init_asm .rva .LSEH_end_GFp_poly1305_init_asm .rva .LSEH_info_GFp_poly1305_init_asm .rva .LSEH_begin_GFp_poly1305_blocks .rva .LSEH_end_GFp_poly1305_blocks .rva .LSEH_info_GFp_poly1305_blocks .rva .LSEH_begin_GFp_poly1305_emit .rva .LSEH_end_GFp_poly1305_emit .rva .LSEH_info_GFp_poly1305_emit ___ $code.=<<___ if ($avx); .rva .LSEH_begin_poly1305_blocks_avx .rva .Lbase2_64_avx .rva .LSEH_info_poly1305_blocks_avx_1 .rva .Lbase2_64_avx .rva .Leven_avx .rva .LSEH_info_poly1305_blocks_avx_2 .rva .Leven_avx .rva .LSEH_end_poly1305_blocks_avx .rva .LSEH_info_poly1305_blocks_avx_3 .rva .LSEH_begin_poly1305_emit_avx .rva .LSEH_end_poly1305_emit_avx .rva .LSEH_info_poly1305_emit_avx ___ $code.=<<___ if ($avx>1); .rva .LSEH_begin_poly1305_blocks_avx2 .rva .Lbase2_64_avx2 .rva .LSEH_info_poly1305_blocks_avx2_1 .rva .Lbase2_64_avx2 .rva .Leven_avx2 .rva .LSEH_info_poly1305_blocks_avx2_2 .rva .Leven_avx2 .rva .LSEH_end_poly1305_blocks_avx2 .rva .LSEH_info_poly1305_blocks_avx2_3 ___ $code.=<<___; .section .xdata .align 8 .LSEH_info_GFp_poly1305_init_asm: .byte 9,0,0,0 .rva se_handler .rva .LSEH_begin_GFp_poly1305_init_asm,.LSEH_begin_GFp_poly1305_init_asm .LSEH_info_GFp_poly1305_blocks: .byte 9,0,0,0 .rva se_handler .rva .Lblocks_body,.Lblocks_epilogue .LSEH_info_GFp_poly1305_emit: .byte 9,0,0,0 .rva se_handler .rva .LSEH_begin_GFp_poly1305_emit,.LSEH_begin_GFp_poly1305_emit ___ $code.=<<___ if ($avx); .LSEH_info_poly1305_blocks_avx_1: .byte 9,0,0,0 .rva se_handler .rva .Lblocks_avx_body,.Lblocks_avx_epilogue # HandlerData[] .LSEH_info_poly1305_blocks_avx_2: .byte 9,0,0,0 .rva se_handler .rva .Lbase2_64_avx_body,.Lbase2_64_avx_epilogue # HandlerData[] .LSEH_info_poly1305_blocks_avx_3: .byte 9,0,0,0 .rva avx_handler .rva .Ldo_avx_body,.Ldo_avx_epilogue # HandlerData[] .LSEH_info_poly1305_emit_avx: .byte 9,0,0,0 .rva se_handler .rva .LSEH_begin_poly1305_emit_avx,.LSEH_begin_poly1305_emit_avx ___ $code.=<<___ if ($avx>1); .LSEH_info_poly1305_blocks_avx2_1: .byte 9,0,0,0 .rva se_handler .rva .Lblocks_avx2_body,.Lblocks_avx2_epilogue # HandlerData[] .LSEH_info_poly1305_blocks_avx2_2: .byte 9,0,0,0 .rva se_handler .rva .Lbase2_64_avx2_body,.Lbase2_64_avx2_epilogue # HandlerData[] .LSEH_info_poly1305_blocks_avx2_3: .byte 9,0,0,0 .rva avx_handler .rva .Ldo_avx2_body,.Ldo_avx2_epilogue # HandlerData[] ___ } foreach (split('\n',$code)) { s/\`([^\`]*)\`/eval($1)/ge; s/%r([a-z]+)#d/%e$1/g; s/%r([0-9]+)#d/%r$1d/g; s/%x#%y/%x/g; print $_,"\n"; } close STDOUT or die "error closing STDOUT"; ring-0.16.9/include/GFp/aes.h000064400000000000000000000054631352416253600137730ustar0000000000000000/* ==================================================================== * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== */ #ifndef OPENSSL_HEADER_AES_H #define OPENSSL_HEADER_AES_H #include // Raw AES functions. // AES_MAXNR is the maximum number of AES rounds. #define AES_MAXNR 14 // aes_key_st should be an opaque type, but EVP requires that the size be // known. struct aes_key_st { uint32_t rd_key[4 * (AES_MAXNR + 1)]; unsigned rounds; }; typedef struct aes_key_st AES_KEY; #endif // OPENSSL_HEADER_AES_H ring-0.16.9/include/GFp/arm_arch.h000064400000000000000000000107321352416253600147720ustar0000000000000000/* ==================================================================== * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ #ifndef OPENSSL_HEADER_ARM_ARCH_H #define OPENSSL_HEADER_ARM_ARCH_H #if !defined(__ARM_ARCH__) # if defined(__CC_ARM) # define __ARM_ARCH__ __TARGET_ARCH_ARM # if defined(__BIG_ENDIAN) # define __ARMEB__ # else # define __ARMEL__ # endif # elif defined(__GNUC__) # if defined(__aarch64__) # define __ARM_ARCH__ 8 # if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define __ARMEB__ # else # define __ARMEL__ # endif // Why doesn't gcc define __ARM_ARCH__? Instead it defines // bunch of below macros. See all_architectires[] table in // gcc/config/arm/arm.c. On a side note it defines // __ARMEL__/__ARMEB__ for little-/big-endian. # elif defined(__ARM_ARCH) # define __ARM_ARCH__ __ARM_ARCH # elif defined(__ARM_ARCH_8A__) # define __ARM_ARCH__ 8 # elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \ defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \ defined(__ARM_ARCH_7EM__) # define __ARM_ARCH__ 7 # elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \ defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \ defined(__ARM_ARCH_6T2__) # define __ARM_ARCH__ 6 # elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \ defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \ defined(__ARM_ARCH_5TEJ__) # define __ARM_ARCH__ 5 # elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) # define __ARM_ARCH__ 4 # else # error "unsupported ARM architecture" # endif # endif #endif // Even when building for 32-bit ARM, support for aarch64 crypto instructions // will be included. #if !defined(__ARM_MAX_ARCH__) #define __ARM_MAX_ARCH__ 8 #endif // ARMV7_NEON is true when a NEON unit is present in the current CPU. #define ARMV7_NEON (1 << 0) // ARMV8_SHA256 indicates support for hardware SHA-256 instructions. #define ARMV8_SHA256 (1 << 4) #endif // OPENSSL_HEADER_ARM_ARCH_H ring-0.16.9/include/GFp/base.h000064400000000000000000000112641353036607100141260ustar0000000000000000/* ==================================================================== * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ #ifndef OPENSSL_HEADER_BASE_H #define OPENSSL_HEADER_BASE_H // This file should be the first included by all BoringSSL headers. #include #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(push, 3) #endif #include #include #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(pop) #endif #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) #define OPENSSL_64_BIT #define OPENSSL_X86_64 #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86) #define OPENSSL_32_BIT #define OPENSSL_X86 #elif defined(__aarch64__) #define OPENSSL_64_BIT #define OPENSSL_AARCH64 #elif defined(__arm) || defined(__arm__) || defined(_M_ARM) #define OPENSSL_32_BIT #define OPENSSL_ARM #elif defined(__mips__) && !defined(__LP64__) #define OPENSSL_32_BIT #define OPENSSL_MIPS #elif defined(__mips__) && defined(__LP64__) #define OPENSSL_64_BIT #define OPENSSL_MIPS64 #else // Note BoringSSL only supports standard 32-bit and 64-bit two's-complement, // little-endian architectures. Functions will not produce the correct answer // on other systems. Run the crypto_test binary, notably // crypto/compiler_test.cc, before adding a new architecture. #error "Unknown target CPU" #endif #if defined(__APPLE__) #define OPENSSL_APPLE #endif #if defined(_WIN32) #define OPENSSL_WINDOWS #endif // *ring* doesn't support the `BORINGSSL_SHARED_LIBRARY` configuration, so // the default (usually "hidden") visibility is always used, even for exported // items. #define OPENSSL_EXPORT // `ring::c` would need to be customized on any platform where these assertions // fail. Keep in sync with `ring::c`. OPENSSL_STATIC_ASSERT(sizeof(int32_t) == sizeof(int), "int isn't 32 bits."); OPENSSL_STATIC_ASSERT(sizeof(uint32_t) == sizeof(unsigned int), "unsigned int isn't 32 bits."); OPENSSL_STATIC_ASSERT(sizeof(size_t) == sizeof(uintptr_t), "uintptr_t and size_t differ."); OPENSSL_STATIC_ASSERT(sizeof(size_t) <= sizeof(uint64_t), "size_t is larger than uint64_t."); OPENSSL_STATIC_ASSERT(sizeof(size_t) >= sizeof(uint32_t), "size_t is smaller than uint32_t."); #endif // OPENSSL_HEADER_BASE_H ring-0.16.9/include/GFp/cpu.h000064400000000000000000000102371352416253600140050ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ #ifndef OPENSSL_HEADER_CPU_H #define OPENSSL_HEADER_CPU_H #include // Runtime CPU feature support #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) // GFp_ia32cap_P contains the Intel CPUID bits when running on an x86 or // x86-64 system. // // Index 0: // EDX for CPUID where EAX = 1 // Bit 20 is always zero // Bit 28 is adjusted to reflect whether the data cache is shared between // multiple logical cores // Bit 30 is used to indicate an Intel CPU // Index 1: // ECX for CPUID where EAX = 1 // Bit 11 is used to indicate AMD XOP support, not SDBG // Index 2: // EBX for CPUID where EAX = 7 // Index 3: // ECX for CPUID where EAX = 7 // // Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM // bits in XCR0, so it is not necessary to check those. extern uint32_t GFp_ia32cap_P[4]; #endif #endif // OPENSSL_HEADER_CPU_H ring-0.16.9/include/GFp/mem.h000064400000000000000000000071401352416253600137730ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef OPENSSL_HEADER_MEM_H #define OPENSSL_HEADER_MEM_H #include // GFp_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It // takes an amount of time dependent on |len|, but independent of the contents // of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a // defined order as the return value when a != b is undefined, other than to be // non-zero. OPENSSL_EXPORT int GFp_memcmp(const uint8_t *a, const uint8_t *b, size_t len); #endif // OPENSSL_HEADER_MEM_H ring-0.16.9/include/GFp/type_check.h000064400000000000000000000074521352416253600153410ustar0000000000000000/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef OPENSSL_HEADER_TYPE_CHECK_H #define OPENSSL_HEADER_TYPE_CHECK_H #include #if defined(__cplusplus) || (defined(_MSC_VER) && !defined(__clang__)) // In C++ and non-clang MSVC, |static_assert| is a keyword. #define OPENSSL_STATIC_ASSERT(cond, msg) static_assert(cond, msg) #else // C11 defines the |_Static_assert| keyword and the |static_assert| macro in // assert.h. While the former is available at all versions in Clang and GCC, the // later depends on libc and, in glibc, depends on being built in C11 mode. We // do not require this, for now, so use |_Static_assert| directly. #define OPENSSL_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg) #endif #endif // OPENSSL_HEADER_TYPE_CHECK_H ring-0.16.9/pregenerated/aes-586-elf.S000064400000000000000000000600431353224261000153620ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .hidden _x86_AES_encrypt_compact .type _x86_AES_encrypt_compact,@function .align 16 _x86_AES_encrypt_compact: movl %edi,20(%esp) xorl (%edi),%eax xorl 4(%edi),%ebx xorl 8(%edi),%ecx xorl 12(%edi),%edx movl 240(%edi),%esi leal -2(%esi,%esi,1),%esi leal (%edi,%esi,8),%esi movl %esi,24(%esp) movl -128(%ebp),%edi movl -96(%ebp),%esi movl -64(%ebp),%edi movl -32(%ebp),%esi movl (%ebp),%edi movl 32(%ebp),%esi movl 64(%ebp),%edi movl 96(%ebp),%esi .align 16 .L000loop: movl %eax,%esi andl $255,%esi movzbl -128(%ebp,%esi,1),%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %ecx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %edx,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,4(%esp) movl %ebx,%esi andl $255,%esi shrl $16,%ebx movzbl -128(%ebp,%esi,1),%esi movzbl %ch,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %edx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %eax,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,8(%esp) movl %ecx,%esi andl $255,%esi shrl $24,%ecx movzbl -128(%ebp,%esi,1),%esi movzbl %dh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %eax,%edi shrl $16,%edi andl $255,%edx andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi andl $255,%edx movzbl -128(%ebp,%edx,1),%edx movzbl %ah,%eax movzbl -128(%ebp,%eax,1),%eax shll $8,%eax xorl %eax,%edx movl 4(%esp),%eax andl $255,%ebx movzbl -128(%ebp,%ebx,1),%ebx shll $16,%ebx xorl %ebx,%edx movl 8(%esp),%ebx movzbl -128(%ebp,%ecx,1),%ecx shll $24,%ecx xorl %ecx,%edx movl %esi,%ecx movl $2155905152,%ebp andl %ecx,%ebp leal (%ecx,%ecx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %ecx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %ecx,%edi xorl %esi,%ecx rorl $24,%edi xorl %ebp,%esi roll $24,%ecx xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%ecx andl %edx,%ebp leal (%edx,%edx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %edx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %edx,%edi xorl %esi,%edx rorl $24,%edi xorl %ebp,%esi roll $24,%edx xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%edx andl %eax,%ebp leal (%eax,%eax,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %eax,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %eax,%edi xorl %esi,%eax rorl $24,%edi xorl %ebp,%esi roll $24,%eax xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%eax andl %ebx,%ebp leal (%ebx,%ebx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %ebx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %ebx,%edi xorl %esi,%ebx rorl $24,%edi xorl %ebp,%esi roll $24,%ebx xorl %edi,%esi xorl %esi,%ebx movl 20(%esp),%edi movl 28(%esp),%ebp addl $16,%edi xorl (%edi),%eax xorl 4(%edi),%ebx xorl 8(%edi),%ecx xorl 12(%edi),%edx cmpl 24(%esp),%edi movl %edi,20(%esp) jb .L000loop movl %eax,%esi andl $255,%esi movzbl -128(%ebp,%esi,1),%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %ecx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %edx,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,4(%esp) movl %ebx,%esi andl $255,%esi shrl $16,%ebx movzbl -128(%ebp,%esi,1),%esi movzbl %ch,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %edx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %eax,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,8(%esp) movl %ecx,%esi andl $255,%esi shrl $24,%ecx movzbl -128(%ebp,%esi,1),%esi movzbl %dh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %eax,%edi shrl $16,%edi andl $255,%edx andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl 20(%esp),%edi andl $255,%edx movzbl -128(%ebp,%edx,1),%edx movzbl %ah,%eax movzbl -128(%ebp,%eax,1),%eax shll $8,%eax xorl %eax,%edx movl 4(%esp),%eax andl $255,%ebx movzbl -128(%ebp,%ebx,1),%ebx shll $16,%ebx xorl %ebx,%edx movl 8(%esp),%ebx movzbl -128(%ebp,%ecx,1),%ecx shll $24,%ecx xorl %ecx,%edx movl %esi,%ecx xorl 16(%edi),%eax xorl 20(%edi),%ebx xorl 24(%edi),%ecx xorl 28(%edi),%edx ret .size _x86_AES_encrypt_compact,.-_x86_AES_encrypt_compact .hidden _sse_AES_encrypt_compact .type _sse_AES_encrypt_compact,@function .align 16 _sse_AES_encrypt_compact: pxor (%edi),%mm0 pxor 8(%edi),%mm4 movl 240(%edi),%esi leal -2(%esi,%esi,1),%esi leal (%edi,%esi,8),%esi movl %esi,24(%esp) movl $454761243,%eax movl %eax,8(%esp) movl %eax,12(%esp) movl -128(%ebp),%eax movl -96(%ebp),%ebx movl -64(%ebp),%ecx movl -32(%ebp),%edx movl (%ebp),%eax movl 32(%ebp),%ebx movl 64(%ebp),%ecx movl 96(%ebp),%edx .align 16 .L001loop: pshufw $8,%mm0,%mm1 pshufw $13,%mm4,%mm5 movd %mm1,%eax movd %mm5,%ebx movl %edi,20(%esp) movzbl %al,%esi movzbl %ah,%edx pshufw $13,%mm0,%mm2 movzbl -128(%ebp,%esi,1),%ecx movzbl %bl,%edi movzbl -128(%ebp,%edx,1),%edx shrl $16,%eax shll $8,%edx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $16,%esi pshufw $8,%mm4,%mm6 orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %ah,%edi shll $24,%esi shrl $16,%ebx orl %esi,%edx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $8,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %al,%edi shll $24,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bl,%edi movd %mm2,%eax movd %ecx,%mm0 movzbl -128(%ebp,%edi,1),%ecx movzbl %ah,%edi shll $16,%ecx movd %mm6,%ebx orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $24,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bl,%edi shll $8,%esi shrl $16,%ebx orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %al,%edi shrl $16,%eax movd %ecx,%mm1 movzbl -128(%ebp,%edi,1),%ecx movzbl %ah,%edi shll $16,%ecx andl $255,%eax orl %esi,%ecx punpckldq %mm1,%mm0 movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $24,%esi andl $255,%ebx movzbl -128(%ebp,%eax,1),%eax orl %esi,%ecx shll $16,%eax movzbl -128(%ebp,%edi,1),%esi orl %eax,%edx shll $8,%esi movzbl -128(%ebp,%ebx,1),%ebx orl %esi,%ecx orl %ebx,%edx movl 20(%esp),%edi movd %ecx,%mm4 movd %edx,%mm5 punpckldq %mm5,%mm4 addl $16,%edi cmpl 24(%esp),%edi ja .L002out movq 8(%esp),%mm2 pxor %mm3,%mm3 pxor %mm7,%mm7 movq %mm0,%mm1 movq %mm4,%mm5 pcmpgtb %mm0,%mm3 pcmpgtb %mm4,%mm7 pand %mm2,%mm3 pand %mm2,%mm7 pshufw $177,%mm0,%mm2 pshufw $177,%mm4,%mm6 paddb %mm0,%mm0 paddb %mm4,%mm4 pxor %mm3,%mm0 pxor %mm7,%mm4 pshufw $177,%mm2,%mm3 pshufw $177,%mm6,%mm7 pxor %mm0,%mm1 pxor %mm4,%mm5 pxor %mm2,%mm0 pxor %mm6,%mm4 movq %mm3,%mm2 movq %mm7,%mm6 pslld $8,%mm3 pslld $8,%mm7 psrld $24,%mm2 psrld $24,%mm6 pxor %mm3,%mm0 pxor %mm7,%mm4 pxor %mm2,%mm0 pxor %mm6,%mm4 movq %mm1,%mm3 movq %mm5,%mm7 movq (%edi),%mm2 movq 8(%edi),%mm6 psrld $8,%mm1 psrld $8,%mm5 movl -128(%ebp),%eax pslld $24,%mm3 pslld $24,%mm7 movl -64(%ebp),%ebx pxor %mm1,%mm0 pxor %mm5,%mm4 movl (%ebp),%ecx pxor %mm3,%mm0 pxor %mm7,%mm4 movl 64(%ebp),%edx pxor %mm2,%mm0 pxor %mm6,%mm4 jmp .L001loop .align 16 .L002out: pxor (%edi),%mm0 pxor 8(%edi),%mm4 ret .size _sse_AES_encrypt_compact,.-_sse_AES_encrypt_compact .align 64 .LAES_Te: .long 2774754246,2774754246 .long 2222750968,2222750968 .long 2574743534,2574743534 .long 2373680118,2373680118 .long 234025727,234025727 .long 3177933782,3177933782 .long 2976870366,2976870366 .long 1422247313,1422247313 .long 1345335392,1345335392 .long 50397442,50397442 .long 2842126286,2842126286 .long 2099981142,2099981142 .long 436141799,436141799 .long 1658312629,1658312629 .long 3870010189,3870010189 .long 2591454956,2591454956 .long 1170918031,1170918031 .long 2642575903,2642575903 .long 1086966153,1086966153 .long 2273148410,2273148410 .long 368769775,368769775 .long 3948501426,3948501426 .long 3376891790,3376891790 .long 200339707,200339707 .long 3970805057,3970805057 .long 1742001331,1742001331 .long 4255294047,4255294047 .long 3937382213,3937382213 .long 3214711843,3214711843 .long 4154762323,4154762323 .long 2524082916,2524082916 .long 1539358875,1539358875 .long 3266819957,3266819957 .long 486407649,486407649 .long 2928907069,2928907069 .long 1780885068,1780885068 .long 1513502316,1513502316 .long 1094664062,1094664062 .long 49805301,49805301 .long 1338821763,1338821763 .long 1546925160,1546925160 .long 4104496465,4104496465 .long 887481809,887481809 .long 150073849,150073849 .long 2473685474,2473685474 .long 1943591083,1943591083 .long 1395732834,1395732834 .long 1058346282,1058346282 .long 201589768,201589768 .long 1388824469,1388824469 .long 1696801606,1696801606 .long 1589887901,1589887901 .long 672667696,672667696 .long 2711000631,2711000631 .long 251987210,251987210 .long 3046808111,3046808111 .long 151455502,151455502 .long 907153956,907153956 .long 2608889883,2608889883 .long 1038279391,1038279391 .long 652995533,652995533 .long 1764173646,1764173646 .long 3451040383,3451040383 .long 2675275242,2675275242 .long 453576978,453576978 .long 2659418909,2659418909 .long 1949051992,1949051992 .long 773462580,773462580 .long 756751158,756751158 .long 2993581788,2993581788 .long 3998898868,3998898868 .long 4221608027,4221608027 .long 4132590244,4132590244 .long 1295727478,1295727478 .long 1641469623,1641469623 .long 3467883389,3467883389 .long 2066295122,2066295122 .long 1055122397,1055122397 .long 1898917726,1898917726 .long 2542044179,2542044179 .long 4115878822,4115878822 .long 1758581177,1758581177 .long 0,0 .long 753790401,753790401 .long 1612718144,1612718144 .long 536673507,536673507 .long 3367088505,3367088505 .long 3982187446,3982187446 .long 3194645204,3194645204 .long 1187761037,1187761037 .long 3653156455,3653156455 .long 1262041458,1262041458 .long 3729410708,3729410708 .long 3561770136,3561770136 .long 3898103984,3898103984 .long 1255133061,1255133061 .long 1808847035,1808847035 .long 720367557,720367557 .long 3853167183,3853167183 .long 385612781,385612781 .long 3309519750,3309519750 .long 3612167578,3612167578 .long 1429418854,1429418854 .long 2491778321,2491778321 .long 3477423498,3477423498 .long 284817897,284817897 .long 100794884,100794884 .long 2172616702,2172616702 .long 4031795360,4031795360 .long 1144798328,1144798328 .long 3131023141,3131023141 .long 3819481163,3819481163 .long 4082192802,4082192802 .long 4272137053,4272137053 .long 3225436288,3225436288 .long 2324664069,2324664069 .long 2912064063,2912064063 .long 3164445985,3164445985 .long 1211644016,1211644016 .long 83228145,83228145 .long 3753688163,3753688163 .long 3249976951,3249976951 .long 1977277103,1977277103 .long 1663115586,1663115586 .long 806359072,806359072 .long 452984805,452984805 .long 250868733,250868733 .long 1842533055,1842533055 .long 1288555905,1288555905 .long 336333848,336333848 .long 890442534,890442534 .long 804056259,804056259 .long 3781124030,3781124030 .long 2727843637,2727843637 .long 3427026056,3427026056 .long 957814574,957814574 .long 1472513171,1472513171 .long 4071073621,4071073621 .long 2189328124,2189328124 .long 1195195770,1195195770 .long 2892260552,2892260552 .long 3881655738,3881655738 .long 723065138,723065138 .long 2507371494,2507371494 .long 2690670784,2690670784 .long 2558624025,2558624025 .long 3511635870,3511635870 .long 2145180835,2145180835 .long 1713513028,1713513028 .long 2116692564,2116692564 .long 2878378043,2878378043 .long 2206763019,2206763019 .long 3393603212,3393603212 .long 703524551,703524551 .long 3552098411,3552098411 .long 1007948840,1007948840 .long 2044649127,2044649127 .long 3797835452,3797835452 .long 487262998,487262998 .long 1994120109,1994120109 .long 1004593371,1004593371 .long 1446130276,1446130276 .long 1312438900,1312438900 .long 503974420,503974420 .long 3679013266,3679013266 .long 168166924,168166924 .long 1814307912,1814307912 .long 3831258296,3831258296 .long 1573044895,1573044895 .long 1859376061,1859376061 .long 4021070915,4021070915 .long 2791465668,2791465668 .long 2828112185,2828112185 .long 2761266481,2761266481 .long 937747667,937747667 .long 2339994098,2339994098 .long 854058965,854058965 .long 1137232011,1137232011 .long 1496790894,1496790894 .long 3077402074,3077402074 .long 2358086913,2358086913 .long 1691735473,1691735473 .long 3528347292,3528347292 .long 3769215305,3769215305 .long 3027004632,3027004632 .long 4199962284,4199962284 .long 133494003,133494003 .long 636152527,636152527 .long 2942657994,2942657994 .long 2390391540,2390391540 .long 3920539207,3920539207 .long 403179536,403179536 .long 3585784431,3585784431 .long 2289596656,2289596656 .long 1864705354,1864705354 .long 1915629148,1915629148 .long 605822008,605822008 .long 4054230615,4054230615 .long 3350508659,3350508659 .long 1371981463,1371981463 .long 602466507,602466507 .long 2094914977,2094914977 .long 2624877800,2624877800 .long 555687742,555687742 .long 3712699286,3712699286 .long 3703422305,3703422305 .long 2257292045,2257292045 .long 2240449039,2240449039 .long 2423288032,2423288032 .long 1111375484,1111375484 .long 3300242801,3300242801 .long 2858837708,2858837708 .long 3628615824,3628615824 .long 84083462,84083462 .long 32962295,32962295 .long 302911004,302911004 .long 2741068226,2741068226 .long 1597322602,1597322602 .long 4183250862,4183250862 .long 3501832553,3501832553 .long 2441512471,2441512471 .long 1489093017,1489093017 .long 656219450,656219450 .long 3114180135,3114180135 .long 954327513,954327513 .long 335083755,335083755 .long 3013122091,3013122091 .long 856756514,856756514 .long 3144247762,3144247762 .long 1893325225,1893325225 .long 2307821063,2307821063 .long 2811532339,2811532339 .long 3063651117,3063651117 .long 572399164,572399164 .long 2458355477,2458355477 .long 552200649,552200649 .long 1238290055,1238290055 .long 4283782570,4283782570 .long 2015897680,2015897680 .long 2061492133,2061492133 .long 2408352771,2408352771 .long 4171342169,4171342169 .long 2156497161,2156497161 .long 386731290,386731290 .long 3669999461,3669999461 .long 837215959,837215959 .long 3326231172,3326231172 .long 3093850320,3093850320 .long 3275833730,3275833730 .long 2962856233,2962856233 .long 1999449434,1999449434 .long 286199582,286199582 .long 3417354363,3417354363 .long 4233385128,4233385128 .long 3602627437,3602627437 .long 974525996,974525996 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .long 1,2,4,8 .long 16,32,64,128 .long 27,54,0,0 .long 0,0,0,0 .globl GFp_aes_nohw_encrypt .hidden GFp_aes_nohw_encrypt .type GFp_aes_nohw_encrypt,@function .align 16 GFp_aes_nohw_encrypt: .L_GFp_aes_nohw_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi movl 28(%esp),%edi movl %esp,%eax subl $36,%esp andl $-64,%esp leal -127(%edi),%ebx subl %esp,%ebx negl %ebx andl $960,%ebx subl %ebx,%esp addl $4,%esp movl %eax,28(%esp) call .L003pic_point .L003pic_point: popl %ebp leal GFp_ia32cap_P-.L003pic_point(%ebp),%eax leal .LAES_Te-.L003pic_point(%ebp),%ebp leal 764(%esp),%ebx subl %ebp,%ebx andl $768,%ebx leal 2176(%ebp,%ebx,1),%ebp btl $25,(%eax) jnc .L004x86 movq (%esi),%mm0 movq 8(%esi),%mm4 call _sse_AES_encrypt_compact movl 28(%esp),%esp movl 24(%esp),%esi movq %mm0,(%esi) movq %mm4,8(%esi) emms popl %edi popl %esi popl %ebx popl %ebp ret .align 16 .L004x86: movl %ebp,24(%esp) movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx call _x86_AES_encrypt_compact movl 28(%esp),%esp movl 24(%esp),%esi movl %eax,(%esi) movl %ebx,4(%esi) movl %ecx,8(%esi) movl %edx,12(%esi) popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_aes_nohw_encrypt,.-.L_GFp_aes_nohw_encrypt_begin .hidden _x86_AES_set_encrypt_key .type _x86_AES_set_encrypt_key,@function .align 16 _x86_AES_set_encrypt_key: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 32(%esp),%edi testl $-1,%esi jz .L005badpointer testl $-1,%edi jz .L005badpointer call .L006pic_point .L006pic_point: popl %ebp leal .LAES_Te-.L006pic_point(%ebp),%ebp leal 2176(%ebp),%ebp movl -128(%ebp),%eax movl -96(%ebp),%ebx movl -64(%ebp),%ecx movl -32(%ebp),%edx movl (%ebp),%eax movl 32(%ebp),%ebx movl 64(%ebp),%ecx movl 96(%ebp),%edx movl 28(%esp),%ecx cmpl $128,%ecx je .L00710rounds cmpl $256,%ecx je .L00814rounds movl $-2,%eax jmp .L009exit .L00710rounds: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) xorl %ecx,%ecx jmp .L01010shortcut .align 4 .L01110loop: movl (%edi),%eax movl 12(%edi),%edx .L01010shortcut: movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 896(%ebp,%ecx,4),%eax movl %eax,16(%edi) xorl 4(%edi),%eax movl %eax,20(%edi) xorl 8(%edi),%eax movl %eax,24(%edi) xorl 12(%edi),%eax movl %eax,28(%edi) incl %ecx addl $16,%edi cmpl $10,%ecx jl .L01110loop movl $10,80(%edi) xorl %eax,%eax jmp .L009exit .L00814rounds: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) movl %ebx,20(%edi) movl %ecx,24(%edi) movl %edx,28(%edi) xorl %ecx,%ecx jmp .L01214shortcut .align 4 .L01314loop: movl 28(%edi),%edx .L01214shortcut: movl (%edi),%eax movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 896(%ebp,%ecx,4),%eax movl %eax,32(%edi) xorl 4(%edi),%eax movl %eax,36(%edi) xorl 8(%edi),%eax movl %eax,40(%edi) xorl 12(%edi),%eax movl %eax,44(%edi) cmpl $6,%ecx je .L01414break incl %ecx movl %eax,%edx movl 16(%edi),%eax movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx shll $8,%ebx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $16,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $24,%ebx xorl %ebx,%eax movl %eax,48(%edi) xorl 20(%edi),%eax movl %eax,52(%edi) xorl 24(%edi),%eax movl %eax,56(%edi) xorl 28(%edi),%eax movl %eax,60(%edi) addl $32,%edi jmp .L01314loop .L01414break: movl $14,48(%edi) xorl %eax,%eax jmp .L009exit .L005badpointer: movl $-1,%eax .L009exit: popl %edi popl %esi popl %ebx popl %ebp ret .size _x86_AES_set_encrypt_key,.-_x86_AES_set_encrypt_key .globl GFp_aes_nohw_set_encrypt_key .hidden GFp_aes_nohw_set_encrypt_key .type GFp_aes_nohw_set_encrypt_key,@function .align 16 GFp_aes_nohw_set_encrypt_key: .L_GFp_aes_nohw_set_encrypt_key_begin: call _x86_AES_set_encrypt_key ret .size GFp_aes_nohw_set_encrypt_key,.-.L_GFp_aes_nohw_set_encrypt_key_begin .byte 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89 .byte 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 .byte 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 #endif ring-0.16.9/pregenerated/aes-586-macosx.S000064400000000000000000000573141353224260700161230ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .private_extern __x86_AES_encrypt_compact .align 4 __x86_AES_encrypt_compact: movl %edi,20(%esp) xorl (%edi),%eax xorl 4(%edi),%ebx xorl 8(%edi),%ecx xorl 12(%edi),%edx movl 240(%edi),%esi leal -2(%esi,%esi,1),%esi leal (%edi,%esi,8),%esi movl %esi,24(%esp) movl -128(%ebp),%edi movl -96(%ebp),%esi movl -64(%ebp),%edi movl -32(%ebp),%esi movl (%ebp),%edi movl 32(%ebp),%esi movl 64(%ebp),%edi movl 96(%ebp),%esi .align 4,0x90 L000loop: movl %eax,%esi andl $255,%esi movzbl -128(%ebp,%esi,1),%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %ecx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %edx,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,4(%esp) movl %ebx,%esi andl $255,%esi shrl $16,%ebx movzbl -128(%ebp,%esi,1),%esi movzbl %ch,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %edx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %eax,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,8(%esp) movl %ecx,%esi andl $255,%esi shrl $24,%ecx movzbl -128(%ebp,%esi,1),%esi movzbl %dh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %eax,%edi shrl $16,%edi andl $255,%edx andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi andl $255,%edx movzbl -128(%ebp,%edx,1),%edx movzbl %ah,%eax movzbl -128(%ebp,%eax,1),%eax shll $8,%eax xorl %eax,%edx movl 4(%esp),%eax andl $255,%ebx movzbl -128(%ebp,%ebx,1),%ebx shll $16,%ebx xorl %ebx,%edx movl 8(%esp),%ebx movzbl -128(%ebp,%ecx,1),%ecx shll $24,%ecx xorl %ecx,%edx movl %esi,%ecx movl $2155905152,%ebp andl %ecx,%ebp leal (%ecx,%ecx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %ecx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %ecx,%edi xorl %esi,%ecx rorl $24,%edi xorl %ebp,%esi roll $24,%ecx xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%ecx andl %edx,%ebp leal (%edx,%edx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %edx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %edx,%edi xorl %esi,%edx rorl $24,%edi xorl %ebp,%esi roll $24,%edx xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%edx andl %eax,%ebp leal (%eax,%eax,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %eax,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %eax,%edi xorl %esi,%eax rorl $24,%edi xorl %ebp,%esi roll $24,%eax xorl %edi,%esi movl $2155905152,%ebp xorl %esi,%eax andl %ebx,%ebp leal (%ebx,%ebx,1),%edi movl %ebp,%esi shrl $7,%ebp andl $4278124286,%edi subl %ebp,%esi movl %ebx,%ebp andl $454761243,%esi rorl $16,%ebp xorl %edi,%esi movl %ebx,%edi xorl %esi,%ebx rorl $24,%edi xorl %ebp,%esi roll $24,%ebx xorl %edi,%esi xorl %esi,%ebx movl 20(%esp),%edi movl 28(%esp),%ebp addl $16,%edi xorl (%edi),%eax xorl 4(%edi),%ebx xorl 8(%edi),%ecx xorl 12(%edi),%edx cmpl 24(%esp),%edi movl %edi,20(%esp) jb L000loop movl %eax,%esi andl $255,%esi movzbl -128(%ebp,%esi,1),%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %ecx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %edx,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,4(%esp) movl %ebx,%esi andl $255,%esi shrl $16,%ebx movzbl -128(%ebp,%esi,1),%esi movzbl %ch,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %edx,%edi shrl $16,%edi andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movl %eax,%edi shrl $24,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl %esi,8(%esp) movl %ecx,%esi andl $255,%esi shrl $24,%ecx movzbl -128(%ebp,%esi,1),%esi movzbl %dh,%edi movzbl -128(%ebp,%edi,1),%edi shll $8,%edi xorl %edi,%esi movl %eax,%edi shrl $16,%edi andl $255,%edx andl $255,%edi movzbl -128(%ebp,%edi,1),%edi shll $16,%edi xorl %edi,%esi movzbl %bh,%edi movzbl -128(%ebp,%edi,1),%edi shll $24,%edi xorl %edi,%esi movl 20(%esp),%edi andl $255,%edx movzbl -128(%ebp,%edx,1),%edx movzbl %ah,%eax movzbl -128(%ebp,%eax,1),%eax shll $8,%eax xorl %eax,%edx movl 4(%esp),%eax andl $255,%ebx movzbl -128(%ebp,%ebx,1),%ebx shll $16,%ebx xorl %ebx,%edx movl 8(%esp),%ebx movzbl -128(%ebp,%ecx,1),%ecx shll $24,%ecx xorl %ecx,%edx movl %esi,%ecx xorl 16(%edi),%eax xorl 20(%edi),%ebx xorl 24(%edi),%ecx xorl 28(%edi),%edx ret .private_extern __sse_AES_encrypt_compact .align 4 __sse_AES_encrypt_compact: pxor (%edi),%mm0 pxor 8(%edi),%mm4 movl 240(%edi),%esi leal -2(%esi,%esi,1),%esi leal (%edi,%esi,8),%esi movl %esi,24(%esp) movl $454761243,%eax movl %eax,8(%esp) movl %eax,12(%esp) movl -128(%ebp),%eax movl -96(%ebp),%ebx movl -64(%ebp),%ecx movl -32(%ebp),%edx movl (%ebp),%eax movl 32(%ebp),%ebx movl 64(%ebp),%ecx movl 96(%ebp),%edx .align 4,0x90 L001loop: pshufw $8,%mm0,%mm1 pshufw $13,%mm4,%mm5 movd %mm1,%eax movd %mm5,%ebx movl %edi,20(%esp) movzbl %al,%esi movzbl %ah,%edx pshufw $13,%mm0,%mm2 movzbl -128(%ebp,%esi,1),%ecx movzbl %bl,%edi movzbl -128(%ebp,%edx,1),%edx shrl $16,%eax shll $8,%edx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $16,%esi pshufw $8,%mm4,%mm6 orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %ah,%edi shll $24,%esi shrl $16,%ebx orl %esi,%edx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $8,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %al,%edi shll $24,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bl,%edi movd %mm2,%eax movd %ecx,%mm0 movzbl -128(%ebp,%edi,1),%ecx movzbl %ah,%edi shll $16,%ecx movd %mm6,%ebx orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $24,%esi orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %bl,%edi shll $8,%esi shrl $16,%ebx orl %esi,%ecx movzbl -128(%ebp,%edi,1),%esi movzbl %al,%edi shrl $16,%eax movd %ecx,%mm1 movzbl -128(%ebp,%edi,1),%ecx movzbl %ah,%edi shll $16,%ecx andl $255,%eax orl %esi,%ecx punpckldq %mm1,%mm0 movzbl -128(%ebp,%edi,1),%esi movzbl %bh,%edi shll $24,%esi andl $255,%ebx movzbl -128(%ebp,%eax,1),%eax orl %esi,%ecx shll $16,%eax movzbl -128(%ebp,%edi,1),%esi orl %eax,%edx shll $8,%esi movzbl -128(%ebp,%ebx,1),%ebx orl %esi,%ecx orl %ebx,%edx movl 20(%esp),%edi movd %ecx,%mm4 movd %edx,%mm5 punpckldq %mm5,%mm4 addl $16,%edi cmpl 24(%esp),%edi ja L002out movq 8(%esp),%mm2 pxor %mm3,%mm3 pxor %mm7,%mm7 movq %mm0,%mm1 movq %mm4,%mm5 pcmpgtb %mm0,%mm3 pcmpgtb %mm4,%mm7 pand %mm2,%mm3 pand %mm2,%mm7 pshufw $177,%mm0,%mm2 pshufw $177,%mm4,%mm6 paddb %mm0,%mm0 paddb %mm4,%mm4 pxor %mm3,%mm0 pxor %mm7,%mm4 pshufw $177,%mm2,%mm3 pshufw $177,%mm6,%mm7 pxor %mm0,%mm1 pxor %mm4,%mm5 pxor %mm2,%mm0 pxor %mm6,%mm4 movq %mm3,%mm2 movq %mm7,%mm6 pslld $8,%mm3 pslld $8,%mm7 psrld $24,%mm2 psrld $24,%mm6 pxor %mm3,%mm0 pxor %mm7,%mm4 pxor %mm2,%mm0 pxor %mm6,%mm4 movq %mm1,%mm3 movq %mm5,%mm7 movq (%edi),%mm2 movq 8(%edi),%mm6 psrld $8,%mm1 psrld $8,%mm5 movl -128(%ebp),%eax pslld $24,%mm3 pslld $24,%mm7 movl -64(%ebp),%ebx pxor %mm1,%mm0 pxor %mm5,%mm4 movl (%ebp),%ecx pxor %mm3,%mm0 pxor %mm7,%mm4 movl 64(%ebp),%edx pxor %mm2,%mm0 pxor %mm6,%mm4 jmp L001loop .align 4,0x90 L002out: pxor (%edi),%mm0 pxor 8(%edi),%mm4 ret .align 6,0x90 LAES_Te: .long 2774754246,2774754246 .long 2222750968,2222750968 .long 2574743534,2574743534 .long 2373680118,2373680118 .long 234025727,234025727 .long 3177933782,3177933782 .long 2976870366,2976870366 .long 1422247313,1422247313 .long 1345335392,1345335392 .long 50397442,50397442 .long 2842126286,2842126286 .long 2099981142,2099981142 .long 436141799,436141799 .long 1658312629,1658312629 .long 3870010189,3870010189 .long 2591454956,2591454956 .long 1170918031,1170918031 .long 2642575903,2642575903 .long 1086966153,1086966153 .long 2273148410,2273148410 .long 368769775,368769775 .long 3948501426,3948501426 .long 3376891790,3376891790 .long 200339707,200339707 .long 3970805057,3970805057 .long 1742001331,1742001331 .long 4255294047,4255294047 .long 3937382213,3937382213 .long 3214711843,3214711843 .long 4154762323,4154762323 .long 2524082916,2524082916 .long 1539358875,1539358875 .long 3266819957,3266819957 .long 486407649,486407649 .long 2928907069,2928907069 .long 1780885068,1780885068 .long 1513502316,1513502316 .long 1094664062,1094664062 .long 49805301,49805301 .long 1338821763,1338821763 .long 1546925160,1546925160 .long 4104496465,4104496465 .long 887481809,887481809 .long 150073849,150073849 .long 2473685474,2473685474 .long 1943591083,1943591083 .long 1395732834,1395732834 .long 1058346282,1058346282 .long 201589768,201589768 .long 1388824469,1388824469 .long 1696801606,1696801606 .long 1589887901,1589887901 .long 672667696,672667696 .long 2711000631,2711000631 .long 251987210,251987210 .long 3046808111,3046808111 .long 151455502,151455502 .long 907153956,907153956 .long 2608889883,2608889883 .long 1038279391,1038279391 .long 652995533,652995533 .long 1764173646,1764173646 .long 3451040383,3451040383 .long 2675275242,2675275242 .long 453576978,453576978 .long 2659418909,2659418909 .long 1949051992,1949051992 .long 773462580,773462580 .long 756751158,756751158 .long 2993581788,2993581788 .long 3998898868,3998898868 .long 4221608027,4221608027 .long 4132590244,4132590244 .long 1295727478,1295727478 .long 1641469623,1641469623 .long 3467883389,3467883389 .long 2066295122,2066295122 .long 1055122397,1055122397 .long 1898917726,1898917726 .long 2542044179,2542044179 .long 4115878822,4115878822 .long 1758581177,1758581177 .long 0,0 .long 753790401,753790401 .long 1612718144,1612718144 .long 536673507,536673507 .long 3367088505,3367088505 .long 3982187446,3982187446 .long 3194645204,3194645204 .long 1187761037,1187761037 .long 3653156455,3653156455 .long 1262041458,1262041458 .long 3729410708,3729410708 .long 3561770136,3561770136 .long 3898103984,3898103984 .long 1255133061,1255133061 .long 1808847035,1808847035 .long 720367557,720367557 .long 3853167183,3853167183 .long 385612781,385612781 .long 3309519750,3309519750 .long 3612167578,3612167578 .long 1429418854,1429418854 .long 2491778321,2491778321 .long 3477423498,3477423498 .long 284817897,284817897 .long 100794884,100794884 .long 2172616702,2172616702 .long 4031795360,4031795360 .long 1144798328,1144798328 .long 3131023141,3131023141 .long 3819481163,3819481163 .long 4082192802,4082192802 .long 4272137053,4272137053 .long 3225436288,3225436288 .long 2324664069,2324664069 .long 2912064063,2912064063 .long 3164445985,3164445985 .long 1211644016,1211644016 .long 83228145,83228145 .long 3753688163,3753688163 .long 3249976951,3249976951 .long 1977277103,1977277103 .long 1663115586,1663115586 .long 806359072,806359072 .long 452984805,452984805 .long 250868733,250868733 .long 1842533055,1842533055 .long 1288555905,1288555905 .long 336333848,336333848 .long 890442534,890442534 .long 804056259,804056259 .long 3781124030,3781124030 .long 2727843637,2727843637 .long 3427026056,3427026056 .long 957814574,957814574 .long 1472513171,1472513171 .long 4071073621,4071073621 .long 2189328124,2189328124 .long 1195195770,1195195770 .long 2892260552,2892260552 .long 3881655738,3881655738 .long 723065138,723065138 .long 2507371494,2507371494 .long 2690670784,2690670784 .long 2558624025,2558624025 .long 3511635870,3511635870 .long 2145180835,2145180835 .long 1713513028,1713513028 .long 2116692564,2116692564 .long 2878378043,2878378043 .long 2206763019,2206763019 .long 3393603212,3393603212 .long 703524551,703524551 .long 3552098411,3552098411 .long 1007948840,1007948840 .long 2044649127,2044649127 .long 3797835452,3797835452 .long 487262998,487262998 .long 1994120109,1994120109 .long 1004593371,1004593371 .long 1446130276,1446130276 .long 1312438900,1312438900 .long 503974420,503974420 .long 3679013266,3679013266 .long 168166924,168166924 .long 1814307912,1814307912 .long 3831258296,3831258296 .long 1573044895,1573044895 .long 1859376061,1859376061 .long 4021070915,4021070915 .long 2791465668,2791465668 .long 2828112185,2828112185 .long 2761266481,2761266481 .long 937747667,937747667 .long 2339994098,2339994098 .long 854058965,854058965 .long 1137232011,1137232011 .long 1496790894,1496790894 .long 3077402074,3077402074 .long 2358086913,2358086913 .long 1691735473,1691735473 .long 3528347292,3528347292 .long 3769215305,3769215305 .long 3027004632,3027004632 .long 4199962284,4199962284 .long 133494003,133494003 .long 636152527,636152527 .long 2942657994,2942657994 .long 2390391540,2390391540 .long 3920539207,3920539207 .long 403179536,403179536 .long 3585784431,3585784431 .long 2289596656,2289596656 .long 1864705354,1864705354 .long 1915629148,1915629148 .long 605822008,605822008 .long 4054230615,4054230615 .long 3350508659,3350508659 .long 1371981463,1371981463 .long 602466507,602466507 .long 2094914977,2094914977 .long 2624877800,2624877800 .long 555687742,555687742 .long 3712699286,3712699286 .long 3703422305,3703422305 .long 2257292045,2257292045 .long 2240449039,2240449039 .long 2423288032,2423288032 .long 1111375484,1111375484 .long 3300242801,3300242801 .long 2858837708,2858837708 .long 3628615824,3628615824 .long 84083462,84083462 .long 32962295,32962295 .long 302911004,302911004 .long 2741068226,2741068226 .long 1597322602,1597322602 .long 4183250862,4183250862 .long 3501832553,3501832553 .long 2441512471,2441512471 .long 1489093017,1489093017 .long 656219450,656219450 .long 3114180135,3114180135 .long 954327513,954327513 .long 335083755,335083755 .long 3013122091,3013122091 .long 856756514,856756514 .long 3144247762,3144247762 .long 1893325225,1893325225 .long 2307821063,2307821063 .long 2811532339,2811532339 .long 3063651117,3063651117 .long 572399164,572399164 .long 2458355477,2458355477 .long 552200649,552200649 .long 1238290055,1238290055 .long 4283782570,4283782570 .long 2015897680,2015897680 .long 2061492133,2061492133 .long 2408352771,2408352771 .long 4171342169,4171342169 .long 2156497161,2156497161 .long 386731290,386731290 .long 3669999461,3669999461 .long 837215959,837215959 .long 3326231172,3326231172 .long 3093850320,3093850320 .long 3275833730,3275833730 .long 2962856233,2962856233 .long 1999449434,1999449434 .long 286199582,286199582 .long 3417354363,3417354363 .long 4233385128,4233385128 .long 3602627437,3602627437 .long 974525996,974525996 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .byte 99,124,119,123,242,107,111,197 .byte 48,1,103,43,254,215,171,118 .byte 202,130,201,125,250,89,71,240 .byte 173,212,162,175,156,164,114,192 .byte 183,253,147,38,54,63,247,204 .byte 52,165,229,241,113,216,49,21 .byte 4,199,35,195,24,150,5,154 .byte 7,18,128,226,235,39,178,117 .byte 9,131,44,26,27,110,90,160 .byte 82,59,214,179,41,227,47,132 .byte 83,209,0,237,32,252,177,91 .byte 106,203,190,57,74,76,88,207 .byte 208,239,170,251,67,77,51,133 .byte 69,249,2,127,80,60,159,168 .byte 81,163,64,143,146,157,56,245 .byte 188,182,218,33,16,255,243,210 .byte 205,12,19,236,95,151,68,23 .byte 196,167,126,61,100,93,25,115 .byte 96,129,79,220,34,42,144,136 .byte 70,238,184,20,222,94,11,219 .byte 224,50,58,10,73,6,36,92 .byte 194,211,172,98,145,149,228,121 .byte 231,200,55,109,141,213,78,169 .byte 108,86,244,234,101,122,174,8 .byte 186,120,37,46,28,166,180,198 .byte 232,221,116,31,75,189,139,138 .byte 112,62,181,102,72,3,246,14 .byte 97,53,87,185,134,193,29,158 .byte 225,248,152,17,105,217,142,148 .byte 155,30,135,233,206,85,40,223 .byte 140,161,137,13,191,230,66,104 .byte 65,153,45,15,176,84,187,22 .long 1,2,4,8 .long 16,32,64,128 .long 27,54,0,0 .long 0,0,0,0 .globl _GFp_aes_nohw_encrypt .private_extern _GFp_aes_nohw_encrypt .align 4 _GFp_aes_nohw_encrypt: L_GFp_aes_nohw_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi movl 28(%esp),%edi movl %esp,%eax subl $36,%esp andl $-64,%esp leal -127(%edi),%ebx subl %esp,%ebx negl %ebx andl $960,%ebx subl %ebx,%esp addl $4,%esp movl %eax,28(%esp) call L003pic_point L003pic_point: popl %ebp movl L_GFp_ia32cap_P$non_lazy_ptr-L003pic_point(%ebp),%eax leal LAES_Te-L003pic_point(%ebp),%ebp leal 764(%esp),%ebx subl %ebp,%ebx andl $768,%ebx leal 2176(%ebp,%ebx,1),%ebp btl $25,(%eax) jnc L004x86 movq (%esi),%mm0 movq 8(%esi),%mm4 call __sse_AES_encrypt_compact movl 28(%esp),%esp movl 24(%esp),%esi movq %mm0,(%esi) movq %mm4,8(%esi) emms popl %edi popl %esi popl %ebx popl %ebp ret .align 4,0x90 L004x86: movl %ebp,24(%esp) movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx call __x86_AES_encrypt_compact movl 28(%esp),%esp movl 24(%esp),%esi movl %eax,(%esi) movl %ebx,4(%esi) movl %ecx,8(%esi) movl %edx,12(%esi) popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __x86_AES_set_encrypt_key .align 4 __x86_AES_set_encrypt_key: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 32(%esp),%edi testl $-1,%esi jz L005badpointer testl $-1,%edi jz L005badpointer call L006pic_point L006pic_point: popl %ebp leal LAES_Te-L006pic_point(%ebp),%ebp leal 2176(%ebp),%ebp movl -128(%ebp),%eax movl -96(%ebp),%ebx movl -64(%ebp),%ecx movl -32(%ebp),%edx movl (%ebp),%eax movl 32(%ebp),%ebx movl 64(%ebp),%ecx movl 96(%ebp),%edx movl 28(%esp),%ecx cmpl $128,%ecx je L00710rounds cmpl $256,%ecx je L00814rounds movl $-2,%eax jmp L009exit L00710rounds: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) xorl %ecx,%ecx jmp L01010shortcut .align 2,0x90 L01110loop: movl (%edi),%eax movl 12(%edi),%edx L01010shortcut: movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 896(%ebp,%ecx,4),%eax movl %eax,16(%edi) xorl 4(%edi),%eax movl %eax,20(%edi) xorl 8(%edi),%eax movl %eax,24(%edi) xorl 12(%edi),%eax movl %eax,28(%edi) incl %ecx addl $16,%edi cmpl $10,%ecx jl L01110loop movl $10,80(%edi) xorl %eax,%eax jmp L009exit L00814rounds: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) movl %ebx,20(%edi) movl %ecx,24(%edi) movl %edx,28(%edi) xorl %ecx,%ecx jmp L01214shortcut .align 2,0x90 L01314loop: movl 28(%edi),%edx L01214shortcut: movl (%edi),%eax movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 896(%ebp,%ecx,4),%eax movl %eax,32(%edi) xorl 4(%edi),%eax movl %eax,36(%edi) xorl 8(%edi),%eax movl %eax,40(%edi) xorl 12(%edi),%eax movl %eax,44(%edi) cmpl $6,%ecx je L01414break incl %ecx movl %eax,%edx movl 16(%edi),%eax movzbl %dl,%esi movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shrl $16,%edx shll $8,%ebx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx movzbl %dh,%esi shll $16,%ebx xorl %ebx,%eax movzbl -128(%ebp,%esi,1),%ebx shll $24,%ebx xorl %ebx,%eax movl %eax,48(%edi) xorl 20(%edi),%eax movl %eax,52(%edi) xorl 24(%edi),%eax movl %eax,56(%edi) xorl 28(%edi),%eax movl %eax,60(%edi) addl $32,%edi jmp L01314loop L01414break: movl $14,48(%edi) xorl %eax,%eax jmp L009exit L005badpointer: movl $-1,%eax L009exit: popl %edi popl %esi popl %ebx popl %ebp ret .globl _GFp_aes_nohw_set_encrypt_key .private_extern _GFp_aes_nohw_set_encrypt_key .align 4 _GFp_aes_nohw_set_encrypt_key: L_GFp_aes_nohw_set_encrypt_key_begin: call __x86_AES_set_encrypt_key ret .byte 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89 .byte 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 .byte 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/aes-586-win32n.obj000064400000000000000000000372371353224260700163230ustar0000000000000000LEi]:#.texti p`.bss0.debug$S #s80@B.debug$T s:@B|$33_3O3W t64t$}u}u}u }@u`&Ɓt5|=1|=1|=1t$ށt5|=1|=1|=1t$΁t5|=1|=1|=1TD1‹D$\1ڋ\$L 1ʉ񽀀!͍< )́11111!Ս<)Ձ11111!ō<)Ł11111!ݍ<)݁11111|$l$33_3O3W ;|$|$Ɓt5|=1|=1|=1t$ށt5|=1|=1|=1t$΁t5|=1|=1|=1|$TD1‹D$\1ڋ\$L 1ʉ3G3_3O3W gt64t$D$D$ E]MUE] M@U`vpp ~~|$p L5Tt=p t= t= t= t=~nL=~ t= t= t=nL=% bt=D t= \ ڋ|$nnb;|$oT$ooddpбppڱpoorrrroooowrrErr]MU@Ig cccc||||wwww{{{{ kkkkooooTT`00P`00PggggV++}V++}bbMMvvvvEE@@}}}}YYYYGGɎGG AAgg__EE##SSrrrr[[uu==L&&jL&&jl66Zl66Z~??A~??AOOh44\h44\QQ44qqqqssb11Sb11S*?*?  RRF##eF##e^^0(0(77  //  $6$6==&&N''iN''iuuuu  X,,tX,,t4.4.6-6-nnnnZZZZ[[RRRRv;;Mv;;Maa}}R)){R)){>>^//q^//qSSSShh,,@ `@ `yyȶ[[[[jjjjFFggr99Kr99KJJޔJJޘLLԘLL԰XXXXJJkk**OOCCņCCŚMMךMMf33Uf33UEEϊEEPPPPx<!>!KKݖKKaa pppp|>>B|>>BqqffffHHؐHHaaaaj55_j55_WWWWiiXX:':'''88++"3"3iiiipp33--<"<" IIUUUUP((xP((xzzYY   ee11BBƄBBhhhhAAÂAA))Z--wZ--w{{˨TTTTmm,:,:c|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-T @6USVWt$|$$_)ہ)܃D$]$) $oof8d$t$fw_^[]fl$^NV d$t$^NV _^[]Ít&USVWt$|$ ]E]MUE] M@U`L$^NV _OW 1vW \51\51\51\513G3GG3GG3G GA GP 1^NV _OW F^NVG_OW1vW\51\51\51\513G 3GG$3GG(3G G,WA‹G\51\51\51\51؉G03GG43GG83GG< KG01_^[]Í&AES for x86, CRYPTOGAMS by -P:\ring\pregenerated\tmp\aes-586-win32n.asm|<8ZW   ! "##&$)%,&/'2(5)8*@,B-H.M/P0U1X2Z3\4_5e6j7m8o9q:t;y<|=~>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd e fghij"k$l(m.n3o6p8q<rAsDtFuHvMwOxRyTzW{]|_}a~gjlnpsuxz   #%(+.26<>DILQTVX[afikmpuxz~ "$ ( . 3 6 8<ADFHKNQTU`cgmqtx }!"#$%&'()*+-./0123456789:;<=>?@ABCDEFGHIJK LMNOPQ R#S&T(U-V0W3X5Y:Z=[@\C]E^J_M`PaSbXc[d^ecfeghhmipjskyl~mnopqrstuvwxyz{|}~  $(,/37:=@CFILORW`cgh (08@HPX`hpx (08@HPX`hpx  ( 0 8 @ HPX`hpx !"#$ % & ' ( )( *0 +8 ,@ -H .P /X 0` 1h 2p 3x 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I( J0 K8 L@ MH NP OX P` Qh Rp Sx T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i( j0 k8 l@ mH nP oX p` qh rp sx t u v w x y z { | } ~           ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                  (08@HPX`hpx (08@HPX`hpx  ( 0 8 @ HPX`hpx !"#$%&'( )(*0+8,@-H.P/X0`1h2p3x45678=>?@ABCDEFGHIJKLMOPQRST UVWXY#Z([,\0]3^7_9`:a;b<c=d>e@gDhFiIjLkOlTmXn\o^paqdrgshtiujvkwlxpzq{r|s}t~x|  !$&+.138;=DGJMPSVYZ]`fmotvy|   "%(+-258: ? B D G JMPSVY\ahjotuvwx y"%&'().P:\ring\pregenerated\aes-586-win32n.objyasm 1.3.0#__x86_AES_encrypt_compact@L$000loop#`__sse_AES_encrypt_compactL$001loop`L$002outL$AES_Te_GFp_aes_nohw_encrypt'L$_GFp_aes_nohw_encrypt_beginL$003pic_point@L$004x86#p__x86_AES_set_encrypt_keyoL$005badpointerL$006pic_pointL$00710roundstL$00814roundstL$009exit L$01010shortcutL$01110loopL$01214shortcutL$01314loopaL$01414break'_GFp_aes_nohw_set_encrypt_key/L$_GFp_aes_nohw_set_encrypt_key_begind h         ! ! !! %! 5! 9! V! Z! ! ! ! ! ! ! ! ! ! ! " " " $" 9" =" N" R" i" m" " " " " " " " " " " .fileg@feat.00.text(B@L`fL$002out`L$AES_TepL$004x86@po tt! 1=MYaf.bss.debug$S #0.debug$T pregenerated\tmp\aes-586-win32n.asm__x86_AES_encrypt_compactL$000loop__sse_AES_encrypt_compactL$001loop_GFp_aes_nohw_encryptL$_GFp_aes_nohw_encrypt_beginL$003pic_point_GFp_ia32cap_P__x86_AES_set_encrypt_keyL$005badpointerL$006pic_pointL$00710roundsL$00814roundsL$009exitL$01010shortcutL$01110loopL$01214shortcutL$01314loopL$01414break_GFp_aes_nohw_set_encrypt_keyL$_GFp_aes_nohw_set_encrypt_key_beginring-0.16.9/pregenerated/aes-armv4-ios32.S000064400000000000000000000426261353224261000162710ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ ==================================================================== @ AES for ARMv4 @ January 2007. @ @ Code uses single 1K S-box and is >2 times faster than code generated @ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which @ allows to merge logical or arithmetic operation with shift or rotate @ in one instruction and emit combined result every cycle. The module @ is endian-neutral. The performance is ~42 cycles/byte for 128-bit @ key [on single-issue Xscale PXA250 core]. @ May 2007. @ @ AES_set_[en|de]crypt_key is added. @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 12% improvement on @ Cortex A8 core and ~25 cycles per byte processed with 128-bit key. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 16% @ improvement on Cortex A8 core and ~21.5 cycles per byte. #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 AES @ instructions are in aesv8-armx.pl.) .text #if defined(__thumb2__) && !defined(__APPLE__) .syntax unified .thumb #else .code 32 #undef __thumb2__ #endif .align 5 AES_Te: .word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d .word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554 .word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d .word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a .word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87 .word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b .word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea .word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b .word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a .word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f .word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108 .word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f .word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e .word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5 .word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d .word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f .word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e .word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb .word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce .word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497 .word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c .word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed .word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b .word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a .word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16 .word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594 .word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81 .word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3 .word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a .word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504 .word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163 .word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d .word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f .word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739 .word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47 .word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395 .word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f .word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883 .word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c .word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76 .word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e .word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4 .word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6 .word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b .word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7 .word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0 .word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25 .word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818 .word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72 .word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651 .word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21 .word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85 .word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa .word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12 .word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0 .word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9 .word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133 .word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7 .word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920 .word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a .word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17 .word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8 .word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11 .word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a @ Te4[256] .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 @ rcon[] .word 0x01000000, 0x02000000, 0x04000000, 0x08000000 .word 0x10000000, 0x20000000, 0x40000000, 0x80000000 .word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0 @ void GFp_aes_nohw_encrypt(const unsigned char *in, unsigned char *out, @ const AES_KEY *key) { .globl _GFp_aes_nohw_encrypt .private_extern _GFp_aes_nohw_encrypt #ifdef __thumb2__ .thumb_func _GFp_aes_nohw_encrypt #endif .align 5 _GFp_aes_nohw_encrypt: #ifndef __thumb2__ sub r3,pc,#8 @ _GFp_aes_nohw_encrypt #else adr r3,. #endif stmdb sp!,{r1,r4-r12,lr} #if defined(__thumb2__) || defined(__APPLE__) adr r10,AES_Te #else sub r10,r3,#_GFp_aes_nohw_encrypt-AES_Te @ Te #endif mov r12,r0 @ inp mov r11,r2 #if __ARM_ARCH__<7 ldrb r0,[r12,#3] @ load input data in endian-neutral ldrb r4,[r12,#2] @ manner... ldrb r5,[r12,#1] ldrb r6,[r12,#0] orr r0,r0,r4,lsl#8 ldrb r1,[r12,#7] orr r0,r0,r5,lsl#16 ldrb r4,[r12,#6] orr r0,r0,r6,lsl#24 ldrb r5,[r12,#5] ldrb r6,[r12,#4] orr r1,r1,r4,lsl#8 ldrb r2,[r12,#11] orr r1,r1,r5,lsl#16 ldrb r4,[r12,#10] orr r1,r1,r6,lsl#24 ldrb r5,[r12,#9] ldrb r6,[r12,#8] orr r2,r2,r4,lsl#8 ldrb r3,[r12,#15] orr r2,r2,r5,lsl#16 ldrb r4,[r12,#14] orr r2,r2,r6,lsl#24 ldrb r5,[r12,#13] ldrb r6,[r12,#12] orr r3,r3,r4,lsl#8 orr r3,r3,r5,lsl#16 orr r3,r3,r6,lsl#24 #else ldr r0,[r12,#0] ldr r1,[r12,#4] ldr r2,[r12,#8] ldr r3,[r12,#12] #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif #endif bl _armv4_AES_encrypt ldr r12,[sp],#4 @ pop out #if __ARM_ARCH__>=7 #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif str r0,[r12,#0] str r1,[r12,#4] str r2,[r12,#8] str r3,[r12,#12] #else mov r4,r0,lsr#24 @ write output in endian-neutral mov r5,r0,lsr#16 @ manner... mov r6,r0,lsr#8 strb r4,[r12,#0] strb r5,[r12,#1] mov r4,r1,lsr#24 strb r6,[r12,#2] mov r5,r1,lsr#16 strb r0,[r12,#3] mov r6,r1,lsr#8 strb r4,[r12,#4] strb r5,[r12,#5] mov r4,r2,lsr#24 strb r6,[r12,#6] mov r5,r2,lsr#16 strb r1,[r12,#7] mov r6,r2,lsr#8 strb r4,[r12,#8] strb r5,[r12,#9] mov r4,r3,lsr#24 strb r6,[r12,#10] mov r5,r3,lsr#16 strb r2,[r12,#11] mov r6,r3,lsr#8 strb r4,[r12,#12] strb r5,[r12,#13] strb r6,[r12,#14] strb r3,[r12,#15] #endif #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func _armv4_AES_encrypt #endif .align 2 _armv4_AES_encrypt: str lr,[sp,#-4]! @ push lr ldmia r11!,{r4,r5,r6,r7} eor r0,r0,r4 ldr r12,[r11,#240-16] eor r1,r1,r5 eor r2,r2,r6 eor r3,r3,r7 sub r12,r12,#1 mov lr,#255 and r7,lr,r0 and r8,lr,r0,lsr#8 and r9,lr,r0,lsr#16 mov r0,r0,lsr#24 Lenc_loop: ldr r4,[r10,r7,lsl#2] @ Te3[s0>>0] and r7,lr,r1,lsr#16 @ i0 ldr r5,[r10,r8,lsl#2] @ Te2[s0>>8] and r8,lr,r1 ldr r6,[r10,r9,lsl#2] @ Te1[s0>>16] and r9,lr,r1,lsr#8 ldr r0,[r10,r0,lsl#2] @ Te0[s0>>24] mov r1,r1,lsr#24 ldr r7,[r10,r7,lsl#2] @ Te1[s1>>16] ldr r8,[r10,r8,lsl#2] @ Te3[s1>>0] ldr r9,[r10,r9,lsl#2] @ Te2[s1>>8] eor r0,r0,r7,ror#8 ldr r1,[r10,r1,lsl#2] @ Te0[s1>>24] and r7,lr,r2,lsr#8 @ i0 eor r5,r5,r8,ror#8 and r8,lr,r2,lsr#16 @ i1 eor r6,r6,r9,ror#8 and r9,lr,r2 ldr r7,[r10,r7,lsl#2] @ Te2[s2>>8] eor r1,r1,r4,ror#24 ldr r8,[r10,r8,lsl#2] @ Te1[s2>>16] mov r2,r2,lsr#24 ldr r9,[r10,r9,lsl#2] @ Te3[s2>>0] eor r0,r0,r7,ror#16 ldr r2,[r10,r2,lsl#2] @ Te0[s2>>24] and r7,lr,r3 @ i0 eor r1,r1,r8,ror#8 and r8,lr,r3,lsr#8 @ i1 eor r6,r6,r9,ror#16 and r9,lr,r3,lsr#16 @ i2 ldr r7,[r10,r7,lsl#2] @ Te3[s3>>0] eor r2,r2,r5,ror#16 ldr r8,[r10,r8,lsl#2] @ Te2[s3>>8] mov r3,r3,lsr#24 ldr r9,[r10,r9,lsl#2] @ Te1[s3>>16] eor r0,r0,r7,ror#24 ldr r7,[r11],#16 eor r1,r1,r8,ror#16 ldr r3,[r10,r3,lsl#2] @ Te0[s3>>24] eor r2,r2,r9,ror#8 ldr r4,[r11,#-12] eor r3,r3,r6,ror#8 ldr r5,[r11,#-8] eor r0,r0,r7 ldr r6,[r11,#-4] and r7,lr,r0 eor r1,r1,r4 and r8,lr,r0,lsr#8 eor r2,r2,r5 and r9,lr,r0,lsr#16 eor r3,r3,r6 mov r0,r0,lsr#24 subs r12,r12,#1 bne Lenc_loop add r10,r10,#2 ldrb r4,[r10,r7,lsl#2] @ Te4[s0>>0] and r7,lr,r1,lsr#16 @ i0 ldrb r5,[r10,r8,lsl#2] @ Te4[s0>>8] and r8,lr,r1 ldrb r6,[r10,r9,lsl#2] @ Te4[s0>>16] and r9,lr,r1,lsr#8 ldrb r0,[r10,r0,lsl#2] @ Te4[s0>>24] mov r1,r1,lsr#24 ldrb r7,[r10,r7,lsl#2] @ Te4[s1>>16] ldrb r8,[r10,r8,lsl#2] @ Te4[s1>>0] ldrb r9,[r10,r9,lsl#2] @ Te4[s1>>8] eor r0,r7,r0,lsl#8 ldrb r1,[r10,r1,lsl#2] @ Te4[s1>>24] and r7,lr,r2,lsr#8 @ i0 eor r5,r8,r5,lsl#8 and r8,lr,r2,lsr#16 @ i1 eor r6,r9,r6,lsl#8 and r9,lr,r2 ldrb r7,[r10,r7,lsl#2] @ Te4[s2>>8] eor r1,r4,r1,lsl#24 ldrb r8,[r10,r8,lsl#2] @ Te4[s2>>16] mov r2,r2,lsr#24 ldrb r9,[r10,r9,lsl#2] @ Te4[s2>>0] eor r0,r7,r0,lsl#8 ldrb r2,[r10,r2,lsl#2] @ Te4[s2>>24] and r7,lr,r3 @ i0 eor r1,r1,r8,lsl#16 and r8,lr,r3,lsr#8 @ i1 eor r6,r9,r6,lsl#8 and r9,lr,r3,lsr#16 @ i2 ldrb r7,[r10,r7,lsl#2] @ Te4[s3>>0] eor r2,r5,r2,lsl#24 ldrb r8,[r10,r8,lsl#2] @ Te4[s3>>8] mov r3,r3,lsr#24 ldrb r9,[r10,r9,lsl#2] @ Te4[s3>>16] eor r0,r7,r0,lsl#8 ldr r7,[r11,#0] ldrb r3,[r10,r3,lsl#2] @ Te4[s3>>24] eor r1,r1,r8,lsl#8 ldr r4,[r11,#4] eor r2,r2,r9,lsl#16 ldr r5,[r11,#8] eor r3,r6,r3,lsl#24 ldr r6,[r11,#12] eor r0,r0,r7 eor r1,r1,r4 eor r2,r2,r5 eor r3,r3,r6 sub r10,r10,#2 ldr pc,[sp],#4 @ pop and return .globl _GFp_aes_nohw_set_encrypt_key .private_extern _GFp_aes_nohw_set_encrypt_key #ifdef __thumb2__ .thumb_func _GFp_aes_nohw_set_encrypt_key #endif .align 5 _GFp_aes_nohw_set_encrypt_key: _armv4_AES_set_encrypt_key: #ifndef __thumb2__ sub r3,pc,#8 @ _GFp_aes_nohw_set_encrypt_key #else adr r3,. #endif teq r0,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq Labrt teq r2,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq Labrt teq r1,#128 beq Lok teq r1,#256 #ifdef __thumb2__ itt ne @ Thumb2 thing, sanity check in ARM #endif movne r0,#-1 bne Labrt Lok: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} mov r12,r0 @ inp mov lr,r1 @ bits mov r11,r2 @ key #if defined(__thumb2__) || defined(__APPLE__) adr r10,AES_Te+1024 @ Te4 #else sub r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4 #endif #if __ARM_ARCH__<7 ldrb r0,[r12,#3] @ load input data in endian-neutral ldrb r4,[r12,#2] @ manner... ldrb r5,[r12,#1] ldrb r6,[r12,#0] orr r0,r0,r4,lsl#8 ldrb r1,[r12,#7] orr r0,r0,r5,lsl#16 ldrb r4,[r12,#6] orr r0,r0,r6,lsl#24 ldrb r5,[r12,#5] ldrb r6,[r12,#4] orr r1,r1,r4,lsl#8 ldrb r2,[r12,#11] orr r1,r1,r5,lsl#16 ldrb r4,[r12,#10] orr r1,r1,r6,lsl#24 ldrb r5,[r12,#9] ldrb r6,[r12,#8] orr r2,r2,r4,lsl#8 ldrb r3,[r12,#15] orr r2,r2,r5,lsl#16 ldrb r4,[r12,#14] orr r2,r2,r6,lsl#24 ldrb r5,[r12,#13] ldrb r6,[r12,#12] orr r3,r3,r4,lsl#8 str r0,[r11],#16 orr r3,r3,r5,lsl#16 str r1,[r11,#-12] orr r3,r3,r6,lsl#24 str r2,[r11,#-8] str r3,[r11,#-4] #else ldr r0,[r12,#0] ldr r1,[r12,#4] ldr r2,[r12,#8] ldr r3,[r12,#12] #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif str r0,[r11],#16 str r1,[r11,#-12] str r2,[r11,#-8] str r3,[r11,#-4] #endif teq lr,#128 bne Lnot128 mov r12,#10 str r12,[r11,#240-16] add r6,r10,#256 @ rcon mov lr,#255 L128_loop: and r5,lr,r3,lsr#24 and r7,lr,r3,lsr#16 ldrb r5,[r10,r5] and r8,lr,r3,lsr#8 ldrb r7,[r10,r7] and r9,lr,r3 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#24 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r6],#4 @ rcon[i++] orr r5,r5,r9,lsl#8 eor r5,r5,r4 eor r0,r0,r5 @ rk[4]=rk[0]^... eor r1,r1,r0 @ rk[5]=rk[1]^rk[4] str r0,[r11],#16 eor r2,r2,r1 @ rk[6]=rk[2]^rk[5] str r1,[r11,#-12] eor r3,r3,r2 @ rk[7]=rk[3]^rk[6] str r2,[r11,#-8] subs r12,r12,#1 str r3,[r11,#-4] bne L128_loop sub r2,r11,#176 b Ldone Lnot128: #if __ARM_ARCH__<7 ldrb r8,[r12,#19] ldrb r4,[r12,#18] ldrb r5,[r12,#17] ldrb r6,[r12,#16] orr r8,r8,r4,lsl#8 ldrb r9,[r12,#23] orr r8,r8,r5,lsl#16 ldrb r4,[r12,#22] orr r8,r8,r6,lsl#24 ldrb r5,[r12,#21] ldrb r6,[r12,#20] orr r9,r9,r4,lsl#8 orr r9,r9,r5,lsl#16 str r8,[r11],#8 orr r9,r9,r6,lsl#24 str r9,[r11,#-4] #else ldr r8,[r12,#16] ldr r9,[r12,#20] #ifdef __ARMEL__ rev r8,r8 rev r9,r9 #endif str r8,[r11],#8 str r9,[r11,#-4] #endif #if __ARM_ARCH__<7 ldrb r8,[r12,#27] ldrb r4,[r12,#26] ldrb r5,[r12,#25] ldrb r6,[r12,#24] orr r8,r8,r4,lsl#8 ldrb r9,[r12,#31] orr r8,r8,r5,lsl#16 ldrb r4,[r12,#30] orr r8,r8,r6,lsl#24 ldrb r5,[r12,#29] ldrb r6,[r12,#28] orr r9,r9,r4,lsl#8 orr r9,r9,r5,lsl#16 str r8,[r11],#8 orr r9,r9,r6,lsl#24 str r9,[r11,#-4] #else ldr r8,[r12,#24] ldr r9,[r12,#28] #ifdef __ARMEL__ rev r8,r8 rev r9,r9 #endif str r8,[r11],#8 str r9,[r11,#-4] #endif mov r12,#14 str r12,[r11,#240-32] add r6,r10,#256 @ rcon mov lr,#255 mov r12,#7 L256_loop: and r5,lr,r9,lsr#24 and r7,lr,r9,lsr#16 ldrb r5,[r10,r5] and r8,lr,r9,lsr#8 ldrb r7,[r10,r7] and r9,lr,r9 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#24 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r6],#4 @ rcon[i++] orr r5,r5,r9,lsl#8 eor r9,r5,r4 eor r0,r0,r9 @ rk[8]=rk[0]^... eor r1,r1,r0 @ rk[9]=rk[1]^rk[8] str r0,[r11],#32 eor r2,r2,r1 @ rk[10]=rk[2]^rk[9] str r1,[r11,#-28] eor r3,r3,r2 @ rk[11]=rk[3]^rk[10] str r2,[r11,#-24] subs r12,r12,#1 str r3,[r11,#-20] #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif subeq r2,r11,#256 beq Ldone and r5,lr,r3 and r7,lr,r3,lsr#8 ldrb r5,[r10,r5] and r8,lr,r3,lsr#16 ldrb r7,[r10,r7] and r9,lr,r3,lsr#24 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#8 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r11,#-48] orr r5,r5,r9,lsl#24 ldr r7,[r11,#-44] ldr r8,[r11,#-40] eor r4,r4,r5 @ rk[12]=rk[4]^... ldr r9,[r11,#-36] eor r7,r7,r4 @ rk[13]=rk[5]^rk[12] str r4,[r11,#-16] eor r8,r8,r7 @ rk[14]=rk[6]^rk[13] str r7,[r11,#-12] eor r9,r9,r8 @ rk[15]=rk[7]^rk[14] str r8,[r11,#-8] str r9,[r11,#-4] b L256_loop .align 2 Ldone: mov r0,#0 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} Labrt: #if __ARM_ARCH__>=5 bx lr @ .word 0xe12fff1e #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .byte 65,69,83,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/aes-armv4-linux32.S000064400000000000000000000430761353224261100166370ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ ==================================================================== @ AES for ARMv4 @ January 2007. @ @ Code uses single 1K S-box and is >2 times faster than code generated @ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which @ allows to merge logical or arithmetic operation with shift or rotate @ in one instruction and emit combined result every cycle. The module @ is endian-neutral. The performance is ~42 cycles/byte for 128-bit @ key [on single-issue Xscale PXA250 core]. @ May 2007. @ @ AES_set_[en|de]crypt_key is added. @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 12% improvement on @ Cortex A8 core and ~25 cycles per byte processed with 128-bit key. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 16% @ improvement on Cortex A8 core and ~21.5 cycles per byte. #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 AES @ instructions are in aesv8-armx.pl.) .arch armv7-a .text #if defined(__thumb2__) && !defined(__APPLE__) .syntax unified .thumb #else .code 32 #undef __thumb2__ #endif .type AES_Te,%object .align 5 AES_Te: .word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d .word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554 .word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d .word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a .word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87 .word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b .word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea .word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b .word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a .word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f .word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108 .word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f .word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e .word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5 .word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d .word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f .word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e .word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb .word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce .word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497 .word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c .word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed .word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b .word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a .word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16 .word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594 .word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81 .word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3 .word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a .word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504 .word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163 .word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d .word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f .word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739 .word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47 .word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395 .word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f .word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883 .word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c .word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76 .word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e .word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4 .word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6 .word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b .word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7 .word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0 .word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25 .word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818 .word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72 .word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651 .word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21 .word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85 .word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa .word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12 .word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0 .word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9 .word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133 .word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7 .word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920 .word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a .word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17 .word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8 .word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11 .word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a @ Te4[256] .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 @ rcon[] .word 0x01000000, 0x02000000, 0x04000000, 0x08000000 .word 0x10000000, 0x20000000, 0x40000000, 0x80000000 .word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0 .size AES_Te,.-AES_Te @ void GFp_aes_nohw_encrypt(const unsigned char *in, unsigned char *out, @ const AES_KEY *key) { .globl GFp_aes_nohw_encrypt .hidden GFp_aes_nohw_encrypt .type GFp_aes_nohw_encrypt,%function .align 5 GFp_aes_nohw_encrypt: #ifndef __thumb2__ sub r3,pc,#8 @ GFp_aes_nohw_encrypt #else adr r3,. #endif stmdb sp!,{r1,r4-r12,lr} #if defined(__thumb2__) || defined(__APPLE__) adr r10,AES_Te #else sub r10,r3,#GFp_aes_nohw_encrypt-AES_Te @ Te #endif mov r12,r0 @ inp mov r11,r2 #if __ARM_ARCH__<7 ldrb r0,[r12,#3] @ load input data in endian-neutral ldrb r4,[r12,#2] @ manner... ldrb r5,[r12,#1] ldrb r6,[r12,#0] orr r0,r0,r4,lsl#8 ldrb r1,[r12,#7] orr r0,r0,r5,lsl#16 ldrb r4,[r12,#6] orr r0,r0,r6,lsl#24 ldrb r5,[r12,#5] ldrb r6,[r12,#4] orr r1,r1,r4,lsl#8 ldrb r2,[r12,#11] orr r1,r1,r5,lsl#16 ldrb r4,[r12,#10] orr r1,r1,r6,lsl#24 ldrb r5,[r12,#9] ldrb r6,[r12,#8] orr r2,r2,r4,lsl#8 ldrb r3,[r12,#15] orr r2,r2,r5,lsl#16 ldrb r4,[r12,#14] orr r2,r2,r6,lsl#24 ldrb r5,[r12,#13] ldrb r6,[r12,#12] orr r3,r3,r4,lsl#8 orr r3,r3,r5,lsl#16 orr r3,r3,r6,lsl#24 #else ldr r0,[r12,#0] ldr r1,[r12,#4] ldr r2,[r12,#8] ldr r3,[r12,#12] #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif #endif bl _armv4_AES_encrypt ldr r12,[sp],#4 @ pop out #if __ARM_ARCH__>=7 #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif str r0,[r12,#0] str r1,[r12,#4] str r2,[r12,#8] str r3,[r12,#12] #else mov r4,r0,lsr#24 @ write output in endian-neutral mov r5,r0,lsr#16 @ manner... mov r6,r0,lsr#8 strb r4,[r12,#0] strb r5,[r12,#1] mov r4,r1,lsr#24 strb r6,[r12,#2] mov r5,r1,lsr#16 strb r0,[r12,#3] mov r6,r1,lsr#8 strb r4,[r12,#4] strb r5,[r12,#5] mov r4,r2,lsr#24 strb r6,[r12,#6] mov r5,r2,lsr#16 strb r1,[r12,#7] mov r6,r2,lsr#8 strb r4,[r12,#8] strb r5,[r12,#9] mov r4,r3,lsr#24 strb r6,[r12,#10] mov r5,r3,lsr#16 strb r2,[r12,#11] mov r6,r3,lsr#8 strb r4,[r12,#12] strb r5,[r12,#13] strb r6,[r12,#14] strb r3,[r12,#15] #endif #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_aes_nohw_encrypt,.-GFp_aes_nohw_encrypt .type _armv4_AES_encrypt,%function .align 2 _armv4_AES_encrypt: str lr,[sp,#-4]! @ push lr ldmia r11!,{r4,r5,r6,r7} eor r0,r0,r4 ldr r12,[r11,#240-16] eor r1,r1,r5 eor r2,r2,r6 eor r3,r3,r7 sub r12,r12,#1 mov lr,#255 and r7,lr,r0 and r8,lr,r0,lsr#8 and r9,lr,r0,lsr#16 mov r0,r0,lsr#24 .Lenc_loop: ldr r4,[r10,r7,lsl#2] @ Te3[s0>>0] and r7,lr,r1,lsr#16 @ i0 ldr r5,[r10,r8,lsl#2] @ Te2[s0>>8] and r8,lr,r1 ldr r6,[r10,r9,lsl#2] @ Te1[s0>>16] and r9,lr,r1,lsr#8 ldr r0,[r10,r0,lsl#2] @ Te0[s0>>24] mov r1,r1,lsr#24 ldr r7,[r10,r7,lsl#2] @ Te1[s1>>16] ldr r8,[r10,r8,lsl#2] @ Te3[s1>>0] ldr r9,[r10,r9,lsl#2] @ Te2[s1>>8] eor r0,r0,r7,ror#8 ldr r1,[r10,r1,lsl#2] @ Te0[s1>>24] and r7,lr,r2,lsr#8 @ i0 eor r5,r5,r8,ror#8 and r8,lr,r2,lsr#16 @ i1 eor r6,r6,r9,ror#8 and r9,lr,r2 ldr r7,[r10,r7,lsl#2] @ Te2[s2>>8] eor r1,r1,r4,ror#24 ldr r8,[r10,r8,lsl#2] @ Te1[s2>>16] mov r2,r2,lsr#24 ldr r9,[r10,r9,lsl#2] @ Te3[s2>>0] eor r0,r0,r7,ror#16 ldr r2,[r10,r2,lsl#2] @ Te0[s2>>24] and r7,lr,r3 @ i0 eor r1,r1,r8,ror#8 and r8,lr,r3,lsr#8 @ i1 eor r6,r6,r9,ror#16 and r9,lr,r3,lsr#16 @ i2 ldr r7,[r10,r7,lsl#2] @ Te3[s3>>0] eor r2,r2,r5,ror#16 ldr r8,[r10,r8,lsl#2] @ Te2[s3>>8] mov r3,r3,lsr#24 ldr r9,[r10,r9,lsl#2] @ Te1[s3>>16] eor r0,r0,r7,ror#24 ldr r7,[r11],#16 eor r1,r1,r8,ror#16 ldr r3,[r10,r3,lsl#2] @ Te0[s3>>24] eor r2,r2,r9,ror#8 ldr r4,[r11,#-12] eor r3,r3,r6,ror#8 ldr r5,[r11,#-8] eor r0,r0,r7 ldr r6,[r11,#-4] and r7,lr,r0 eor r1,r1,r4 and r8,lr,r0,lsr#8 eor r2,r2,r5 and r9,lr,r0,lsr#16 eor r3,r3,r6 mov r0,r0,lsr#24 subs r12,r12,#1 bne .Lenc_loop add r10,r10,#2 ldrb r4,[r10,r7,lsl#2] @ Te4[s0>>0] and r7,lr,r1,lsr#16 @ i0 ldrb r5,[r10,r8,lsl#2] @ Te4[s0>>8] and r8,lr,r1 ldrb r6,[r10,r9,lsl#2] @ Te4[s0>>16] and r9,lr,r1,lsr#8 ldrb r0,[r10,r0,lsl#2] @ Te4[s0>>24] mov r1,r1,lsr#24 ldrb r7,[r10,r7,lsl#2] @ Te4[s1>>16] ldrb r8,[r10,r8,lsl#2] @ Te4[s1>>0] ldrb r9,[r10,r9,lsl#2] @ Te4[s1>>8] eor r0,r7,r0,lsl#8 ldrb r1,[r10,r1,lsl#2] @ Te4[s1>>24] and r7,lr,r2,lsr#8 @ i0 eor r5,r8,r5,lsl#8 and r8,lr,r2,lsr#16 @ i1 eor r6,r9,r6,lsl#8 and r9,lr,r2 ldrb r7,[r10,r7,lsl#2] @ Te4[s2>>8] eor r1,r4,r1,lsl#24 ldrb r8,[r10,r8,lsl#2] @ Te4[s2>>16] mov r2,r2,lsr#24 ldrb r9,[r10,r9,lsl#2] @ Te4[s2>>0] eor r0,r7,r0,lsl#8 ldrb r2,[r10,r2,lsl#2] @ Te4[s2>>24] and r7,lr,r3 @ i0 eor r1,r1,r8,lsl#16 and r8,lr,r3,lsr#8 @ i1 eor r6,r9,r6,lsl#8 and r9,lr,r3,lsr#16 @ i2 ldrb r7,[r10,r7,lsl#2] @ Te4[s3>>0] eor r2,r5,r2,lsl#24 ldrb r8,[r10,r8,lsl#2] @ Te4[s3>>8] mov r3,r3,lsr#24 ldrb r9,[r10,r9,lsl#2] @ Te4[s3>>16] eor r0,r7,r0,lsl#8 ldr r7,[r11,#0] ldrb r3,[r10,r3,lsl#2] @ Te4[s3>>24] eor r1,r1,r8,lsl#8 ldr r4,[r11,#4] eor r2,r2,r9,lsl#16 ldr r5,[r11,#8] eor r3,r6,r3,lsl#24 ldr r6,[r11,#12] eor r0,r0,r7 eor r1,r1,r4 eor r2,r2,r5 eor r3,r3,r6 sub r10,r10,#2 ldr pc,[sp],#4 @ pop and return .size _armv4_AES_encrypt,.-_armv4_AES_encrypt .globl GFp_aes_nohw_set_encrypt_key .hidden GFp_aes_nohw_set_encrypt_key .type GFp_aes_nohw_set_encrypt_key,%function .align 5 GFp_aes_nohw_set_encrypt_key: _armv4_AES_set_encrypt_key: #ifndef __thumb2__ sub r3,pc,#8 @ GFp_aes_nohw_set_encrypt_key #else adr r3,. #endif teq r0,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq .Labrt teq r2,#0 #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif moveq r0,#-1 beq .Labrt teq r1,#128 beq .Lok teq r1,#256 #ifdef __thumb2__ itt ne @ Thumb2 thing, sanity check in ARM #endif movne r0,#-1 bne .Labrt .Lok: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} mov r12,r0 @ inp mov lr,r1 @ bits mov r11,r2 @ key #if defined(__thumb2__) || defined(__APPLE__) adr r10,AES_Te+1024 @ Te4 #else sub r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4 #endif #if __ARM_ARCH__<7 ldrb r0,[r12,#3] @ load input data in endian-neutral ldrb r4,[r12,#2] @ manner... ldrb r5,[r12,#1] ldrb r6,[r12,#0] orr r0,r0,r4,lsl#8 ldrb r1,[r12,#7] orr r0,r0,r5,lsl#16 ldrb r4,[r12,#6] orr r0,r0,r6,lsl#24 ldrb r5,[r12,#5] ldrb r6,[r12,#4] orr r1,r1,r4,lsl#8 ldrb r2,[r12,#11] orr r1,r1,r5,lsl#16 ldrb r4,[r12,#10] orr r1,r1,r6,lsl#24 ldrb r5,[r12,#9] ldrb r6,[r12,#8] orr r2,r2,r4,lsl#8 ldrb r3,[r12,#15] orr r2,r2,r5,lsl#16 ldrb r4,[r12,#14] orr r2,r2,r6,lsl#24 ldrb r5,[r12,#13] ldrb r6,[r12,#12] orr r3,r3,r4,lsl#8 str r0,[r11],#16 orr r3,r3,r5,lsl#16 str r1,[r11,#-12] orr r3,r3,r6,lsl#24 str r2,[r11,#-8] str r3,[r11,#-4] #else ldr r0,[r12,#0] ldr r1,[r12,#4] ldr r2,[r12,#8] ldr r3,[r12,#12] #ifdef __ARMEL__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 #endif str r0,[r11],#16 str r1,[r11,#-12] str r2,[r11,#-8] str r3,[r11,#-4] #endif teq lr,#128 bne .Lnot128 mov r12,#10 str r12,[r11,#240-16] add r6,r10,#256 @ rcon mov lr,#255 .L128_loop: and r5,lr,r3,lsr#24 and r7,lr,r3,lsr#16 ldrb r5,[r10,r5] and r8,lr,r3,lsr#8 ldrb r7,[r10,r7] and r9,lr,r3 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#24 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r6],#4 @ rcon[i++] orr r5,r5,r9,lsl#8 eor r5,r5,r4 eor r0,r0,r5 @ rk[4]=rk[0]^... eor r1,r1,r0 @ rk[5]=rk[1]^rk[4] str r0,[r11],#16 eor r2,r2,r1 @ rk[6]=rk[2]^rk[5] str r1,[r11,#-12] eor r3,r3,r2 @ rk[7]=rk[3]^rk[6] str r2,[r11,#-8] subs r12,r12,#1 str r3,[r11,#-4] bne .L128_loop sub r2,r11,#176 b .Ldone .Lnot128: #if __ARM_ARCH__<7 ldrb r8,[r12,#19] ldrb r4,[r12,#18] ldrb r5,[r12,#17] ldrb r6,[r12,#16] orr r8,r8,r4,lsl#8 ldrb r9,[r12,#23] orr r8,r8,r5,lsl#16 ldrb r4,[r12,#22] orr r8,r8,r6,lsl#24 ldrb r5,[r12,#21] ldrb r6,[r12,#20] orr r9,r9,r4,lsl#8 orr r9,r9,r5,lsl#16 str r8,[r11],#8 orr r9,r9,r6,lsl#24 str r9,[r11,#-4] #else ldr r8,[r12,#16] ldr r9,[r12,#20] #ifdef __ARMEL__ rev r8,r8 rev r9,r9 #endif str r8,[r11],#8 str r9,[r11,#-4] #endif #if __ARM_ARCH__<7 ldrb r8,[r12,#27] ldrb r4,[r12,#26] ldrb r5,[r12,#25] ldrb r6,[r12,#24] orr r8,r8,r4,lsl#8 ldrb r9,[r12,#31] orr r8,r8,r5,lsl#16 ldrb r4,[r12,#30] orr r8,r8,r6,lsl#24 ldrb r5,[r12,#29] ldrb r6,[r12,#28] orr r9,r9,r4,lsl#8 orr r9,r9,r5,lsl#16 str r8,[r11],#8 orr r9,r9,r6,lsl#24 str r9,[r11,#-4] #else ldr r8,[r12,#24] ldr r9,[r12,#28] #ifdef __ARMEL__ rev r8,r8 rev r9,r9 #endif str r8,[r11],#8 str r9,[r11,#-4] #endif mov r12,#14 str r12,[r11,#240-32] add r6,r10,#256 @ rcon mov lr,#255 mov r12,#7 .L256_loop: and r5,lr,r9,lsr#24 and r7,lr,r9,lsr#16 ldrb r5,[r10,r5] and r8,lr,r9,lsr#8 ldrb r7,[r10,r7] and r9,lr,r9 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#24 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r6],#4 @ rcon[i++] orr r5,r5,r9,lsl#8 eor r9,r5,r4 eor r0,r0,r9 @ rk[8]=rk[0]^... eor r1,r1,r0 @ rk[9]=rk[1]^rk[8] str r0,[r11],#32 eor r2,r2,r1 @ rk[10]=rk[2]^rk[9] str r1,[r11,#-28] eor r3,r3,r2 @ rk[11]=rk[3]^rk[10] str r2,[r11,#-24] subs r12,r12,#1 str r3,[r11,#-20] #ifdef __thumb2__ itt eq @ Thumb2 thing, sanity check in ARM #endif subeq r2,r11,#256 beq .Ldone and r5,lr,r3 and r7,lr,r3,lsr#8 ldrb r5,[r10,r5] and r8,lr,r3,lsr#16 ldrb r7,[r10,r7] and r9,lr,r3,lsr#24 ldrb r8,[r10,r8] orr r5,r5,r7,lsl#8 ldrb r9,[r10,r9] orr r5,r5,r8,lsl#16 ldr r4,[r11,#-48] orr r5,r5,r9,lsl#24 ldr r7,[r11,#-44] ldr r8,[r11,#-40] eor r4,r4,r5 @ rk[12]=rk[4]^... ldr r9,[r11,#-36] eor r7,r7,r4 @ rk[13]=rk[5]^rk[12] str r4,[r11,#-16] eor r8,r8,r7 @ rk[14]=rk[6]^rk[13] str r7,[r11,#-12] eor r9,r9,r8 @ rk[15]=rk[7]^rk[14] str r8,[r11,#-8] str r9,[r11,#-4] b .L256_loop .align 2 .Ldone: mov r0,#0 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} .Labrt: #if __ARM_ARCH__>=5 bx lr @ .word 0xe12fff1e #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_aes_nohw_set_encrypt_key,.-GFp_aes_nohw_set_encrypt_key .byte 65,69,83,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/aes-x86_64-elf.S000064400000000000000000000533371353224260300160100ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .type _x86_64_AES_encrypt_compact,@function .align 16 _x86_64_AES_encrypt_compact: .cfi_startproc leaq 128(%r14),%r8 movl 0-128(%r8),%edi movl 32-128(%r8),%ebp movl 64-128(%r8),%r10d movl 96-128(%r8),%r11d movl 128-128(%r8),%edi movl 160-128(%r8),%ebp movl 192-128(%r8),%r10d movl 224-128(%r8),%r11d jmp .Lenc_loop_compact .align 16 .Lenc_loop_compact: xorl 0(%r15),%eax xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx leaq 16(%r15),%r15 movzbl %al,%r10d movzbl %bl,%r11d movzbl %cl,%r12d movzbl %dl,%r8d movzbl %bh,%esi movzbl %ch,%edi shrl $16,%ecx movzbl %dh,%ebp movzbl (%r14,%r10,1),%r10d movzbl (%r14,%r11,1),%r11d movzbl (%r14,%r12,1),%r12d movzbl (%r14,%r8,1),%r8d movzbl (%r14,%rsi,1),%r9d movzbl %ah,%esi movzbl (%r14,%rdi,1),%r13d movzbl %cl,%edi movzbl (%r14,%rbp,1),%ebp movzbl (%r14,%rsi,1),%esi shll $8,%r9d shrl $16,%edx shll $8,%r13d xorl %r9d,%r10d shrl $16,%eax movzbl %dl,%r9d shrl $16,%ebx xorl %r13d,%r11d shll $8,%ebp movzbl %al,%r13d movzbl (%r14,%rdi,1),%edi xorl %ebp,%r12d shll $8,%esi movzbl %bl,%ebp shll $16,%edi xorl %esi,%r8d movzbl (%r14,%r9,1),%r9d movzbl %dh,%esi movzbl (%r14,%r13,1),%r13d xorl %edi,%r10d shrl $8,%ecx movzbl %ah,%edi shll $16,%r9d shrl $8,%ebx shll $16,%r13d xorl %r9d,%r11d movzbl (%r14,%rbp,1),%ebp movzbl (%r14,%rsi,1),%esi movzbl (%r14,%rdi,1),%edi movzbl (%r14,%rcx,1),%edx movzbl (%r14,%rbx,1),%ecx shll $16,%ebp xorl %r13d,%r12d shll $24,%esi xorl %ebp,%r8d shll $24,%edi xorl %esi,%r10d shll $24,%edx xorl %edi,%r11d shll $24,%ecx movl %r10d,%eax movl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx cmpq 16(%rsp),%r15 je .Lenc_compact_done movl $0x80808080,%r10d movl $0x80808080,%r11d andl %eax,%r10d andl %ebx,%r11d movl %r10d,%esi movl %r11d,%edi shrl $7,%r10d leal (%rax,%rax,1),%r8d shrl $7,%r11d leal (%rbx,%rbx,1),%r9d subl %r10d,%esi subl %r11d,%edi andl $0xfefefefe,%r8d andl $0xfefefefe,%r9d andl $0x1b1b1b1b,%esi andl $0x1b1b1b1b,%edi movl %eax,%r10d movl %ebx,%r11d xorl %esi,%r8d xorl %edi,%r9d xorl %r8d,%eax xorl %r9d,%ebx movl $0x80808080,%r12d roll $24,%eax movl $0x80808080,%ebp roll $24,%ebx andl %ecx,%r12d andl %edx,%ebp xorl %r8d,%eax xorl %r9d,%ebx movl %r12d,%esi rorl $16,%r10d movl %ebp,%edi rorl $16,%r11d leal (%rcx,%rcx,1),%r8d shrl $7,%r12d xorl %r10d,%eax shrl $7,%ebp xorl %r11d,%ebx rorl $8,%r10d leal (%rdx,%rdx,1),%r9d rorl $8,%r11d subl %r12d,%esi subl %ebp,%edi xorl %r10d,%eax xorl %r11d,%ebx andl $0xfefefefe,%r8d andl $0xfefefefe,%r9d andl $0x1b1b1b1b,%esi andl $0x1b1b1b1b,%edi movl %ecx,%r12d movl %edx,%ebp xorl %esi,%r8d xorl %edi,%r9d rorl $16,%r12d xorl %r8d,%ecx rorl $16,%ebp xorl %r9d,%edx roll $24,%ecx movl 0(%r14),%esi roll $24,%edx xorl %r8d,%ecx movl 64(%r14),%edi xorl %r9d,%edx movl 128(%r14),%r8d xorl %r12d,%ecx rorl $8,%r12d xorl %ebp,%edx rorl $8,%ebp xorl %r12d,%ecx movl 192(%r14),%r9d xorl %ebp,%edx jmp .Lenc_loop_compact .align 16 .Lenc_compact_done: xorl 0(%r15),%eax xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx .byte 0xf3,0xc3 .cfi_endproc .size _x86_64_AES_encrypt_compact,.-_x86_64_AES_encrypt_compact .align 16 .globl GFp_aes_nohw_encrypt .hidden GFp_aes_nohw_encrypt .type GFp_aes_nohw_encrypt,@function .hidden GFp_aes_nohw_encrypt GFp_aes_nohw_encrypt: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 leaq -63(%rdx),%rcx andq $-64,%rsp subq %rsp,%rcx negq %rcx andq $0x3c0,%rcx subq %rcx,%rsp subq $32,%rsp movq %rsi,16(%rsp) movq %rax,24(%rsp) .cfi_escape 0x0f,0x05,0x77,0x18,0x06,0x23,0x08 .Lenc_prologue: movq %rdx,%r15 movl 240(%r15),%r13d movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx shll $4,%r13d leaq (%r15,%r13,1),%rbp movq %r15,(%rsp) movq %rbp,8(%rsp) leaq .LAES_Te+2048(%rip),%r14 leaq 768(%rsp),%rbp subq %r14,%rbp andq $0x300,%rbp leaq (%r14,%rbp,1),%r14 call _x86_64_AES_encrypt_compact movq 16(%rsp),%r9 movq 24(%rsp),%rsi .cfi_def_cfa %rsi,8 movl %eax,0(%r9) movl %ebx,4(%r9) movl %ecx,8(%r9) movl %edx,12(%r9) movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lenc_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_aes_nohw_encrypt,.-GFp_aes_nohw_encrypt .align 16 .globl GFp_aes_nohw_set_encrypt_key .hidden GFp_aes_nohw_set_encrypt_key .type GFp_aes_nohw_set_encrypt_key,@function GFp_aes_nohw_set_encrypt_key: .cfi_startproc pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-16 pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $8,%rsp .cfi_adjust_cfa_offset 8 .Lenc_key_prologue: call _x86_64_AES_set_encrypt_key movq 40(%rsp),%rbp .cfi_restore %rbp movq 48(%rsp),%rbx .cfi_restore %rbx addq $56,%rsp .cfi_adjust_cfa_offset -56 .Lenc_key_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_aes_nohw_set_encrypt_key,.-GFp_aes_nohw_set_encrypt_key .type _x86_64_AES_set_encrypt_key,@function .align 16 _x86_64_AES_set_encrypt_key: .cfi_startproc movl %esi,%ecx movq %rdi,%rsi movq %rdx,%rdi testq $-1,%rsi jz .Lbadpointer testq $-1,%rdi jz .Lbadpointer leaq .LAES_Te(%rip),%rbp leaq 2048+128(%rbp),%rbp movl 0-128(%rbp),%eax movl 32-128(%rbp),%ebx movl 64-128(%rbp),%r8d movl 96-128(%rbp),%edx movl 128-128(%rbp),%eax movl 160-128(%rbp),%ebx movl 192-128(%rbp),%r8d movl 224-128(%rbp),%edx cmpl $128,%ecx je .L10rounds cmpl $256,%ecx je .L14rounds movq $-2,%rax jmp .Lexit .L10rounds: movq 0(%rsi),%rax movq 8(%rsi),%rdx movq %rax,0(%rdi) movq %rdx,8(%rdi) shrq $32,%rdx xorl %ecx,%ecx jmp .L10shortcut .align 4 .L10loop: movl 0(%rdi),%eax movl 12(%rdi),%edx .L10shortcut: movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 1024-128(%rbp,%rcx,4),%eax movl %eax,16(%rdi) xorl 4(%rdi),%eax movl %eax,20(%rdi) xorl 8(%rdi),%eax movl %eax,24(%rdi) xorl 12(%rdi),%eax movl %eax,28(%rdi) addl $1,%ecx leaq 16(%rdi),%rdi cmpl $10,%ecx jl .L10loop movl $10,80(%rdi) xorq %rax,%rax jmp .Lexit .L14rounds: movq 0(%rsi),%rax movq 8(%rsi),%rbx movq 16(%rsi),%rcx movq 24(%rsi),%rdx movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) shrq $32,%rdx xorl %ecx,%ecx jmp .L14shortcut .align 4 .L14loop: movl 0(%rdi),%eax movl 28(%rdi),%edx .L14shortcut: movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 1024-128(%rbp,%rcx,4),%eax movl %eax,32(%rdi) xorl 4(%rdi),%eax movl %eax,36(%rdi) xorl 8(%rdi),%eax movl %eax,40(%rdi) xorl 12(%rdi),%eax movl %eax,44(%rdi) cmpl $6,%ecx je .L14break addl $1,%ecx movl %eax,%edx movl 16(%rdi),%eax movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx shll $8,%ebx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $16,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $24,%ebx xorl %ebx,%eax movl %eax,48(%rdi) xorl 20(%rdi),%eax movl %eax,52(%rdi) xorl 24(%rdi),%eax movl %eax,56(%rdi) xorl 28(%rdi),%eax movl %eax,60(%rdi) leaq 32(%rdi),%rdi jmp .L14loop .L14break: movl $14,48(%rdi) xorq %rax,%rax jmp .Lexit .Lbadpointer: movq $-1,%rax .Lexit: .byte 0xf3,0xc3 .cfi_endproc .size _x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key .align 64 .LAES_Te: .long 0xa56363c6,0xa56363c6 .long 0x847c7cf8,0x847c7cf8 .long 0x997777ee,0x997777ee .long 0x8d7b7bf6,0x8d7b7bf6 .long 0x0df2f2ff,0x0df2f2ff .long 0xbd6b6bd6,0xbd6b6bd6 .long 0xb16f6fde,0xb16f6fde .long 0x54c5c591,0x54c5c591 .long 0x50303060,0x50303060 .long 0x03010102,0x03010102 .long 0xa96767ce,0xa96767ce .long 0x7d2b2b56,0x7d2b2b56 .long 0x19fefee7,0x19fefee7 .long 0x62d7d7b5,0x62d7d7b5 .long 0xe6abab4d,0xe6abab4d .long 0x9a7676ec,0x9a7676ec .long 0x45caca8f,0x45caca8f .long 0x9d82821f,0x9d82821f .long 0x40c9c989,0x40c9c989 .long 0x877d7dfa,0x877d7dfa .long 0x15fafaef,0x15fafaef .long 0xeb5959b2,0xeb5959b2 .long 0xc947478e,0xc947478e .long 0x0bf0f0fb,0x0bf0f0fb .long 0xecadad41,0xecadad41 .long 0x67d4d4b3,0x67d4d4b3 .long 0xfda2a25f,0xfda2a25f .long 0xeaafaf45,0xeaafaf45 .long 0xbf9c9c23,0xbf9c9c23 .long 0xf7a4a453,0xf7a4a453 .long 0x967272e4,0x967272e4 .long 0x5bc0c09b,0x5bc0c09b .long 0xc2b7b775,0xc2b7b775 .long 0x1cfdfde1,0x1cfdfde1 .long 0xae93933d,0xae93933d .long 0x6a26264c,0x6a26264c .long 0x5a36366c,0x5a36366c .long 0x413f3f7e,0x413f3f7e .long 0x02f7f7f5,0x02f7f7f5 .long 0x4fcccc83,0x4fcccc83 .long 0x5c343468,0x5c343468 .long 0xf4a5a551,0xf4a5a551 .long 0x34e5e5d1,0x34e5e5d1 .long 0x08f1f1f9,0x08f1f1f9 .long 0x937171e2,0x937171e2 .long 0x73d8d8ab,0x73d8d8ab .long 0x53313162,0x53313162 .long 0x3f15152a,0x3f15152a .long 0x0c040408,0x0c040408 .long 0x52c7c795,0x52c7c795 .long 0x65232346,0x65232346 .long 0x5ec3c39d,0x5ec3c39d .long 0x28181830,0x28181830 .long 0xa1969637,0xa1969637 .long 0x0f05050a,0x0f05050a .long 0xb59a9a2f,0xb59a9a2f .long 0x0907070e,0x0907070e .long 0x36121224,0x36121224 .long 0x9b80801b,0x9b80801b .long 0x3de2e2df,0x3de2e2df .long 0x26ebebcd,0x26ebebcd .long 0x6927274e,0x6927274e .long 0xcdb2b27f,0xcdb2b27f .long 0x9f7575ea,0x9f7575ea .long 0x1b090912,0x1b090912 .long 0x9e83831d,0x9e83831d .long 0x742c2c58,0x742c2c58 .long 0x2e1a1a34,0x2e1a1a34 .long 0x2d1b1b36,0x2d1b1b36 .long 0xb26e6edc,0xb26e6edc .long 0xee5a5ab4,0xee5a5ab4 .long 0xfba0a05b,0xfba0a05b .long 0xf65252a4,0xf65252a4 .long 0x4d3b3b76,0x4d3b3b76 .long 0x61d6d6b7,0x61d6d6b7 .long 0xceb3b37d,0xceb3b37d .long 0x7b292952,0x7b292952 .long 0x3ee3e3dd,0x3ee3e3dd .long 0x712f2f5e,0x712f2f5e .long 0x97848413,0x97848413 .long 0xf55353a6,0xf55353a6 .long 0x68d1d1b9,0x68d1d1b9 .long 0x00000000,0x00000000 .long 0x2cededc1,0x2cededc1 .long 0x60202040,0x60202040 .long 0x1ffcfce3,0x1ffcfce3 .long 0xc8b1b179,0xc8b1b179 .long 0xed5b5bb6,0xed5b5bb6 .long 0xbe6a6ad4,0xbe6a6ad4 .long 0x46cbcb8d,0x46cbcb8d .long 0xd9bebe67,0xd9bebe67 .long 0x4b393972,0x4b393972 .long 0xde4a4a94,0xde4a4a94 .long 0xd44c4c98,0xd44c4c98 .long 0xe85858b0,0xe85858b0 .long 0x4acfcf85,0x4acfcf85 .long 0x6bd0d0bb,0x6bd0d0bb .long 0x2aefefc5,0x2aefefc5 .long 0xe5aaaa4f,0xe5aaaa4f .long 0x16fbfbed,0x16fbfbed .long 0xc5434386,0xc5434386 .long 0xd74d4d9a,0xd74d4d9a .long 0x55333366,0x55333366 .long 0x94858511,0x94858511 .long 0xcf45458a,0xcf45458a .long 0x10f9f9e9,0x10f9f9e9 .long 0x06020204,0x06020204 .long 0x817f7ffe,0x817f7ffe .long 0xf05050a0,0xf05050a0 .long 0x443c3c78,0x443c3c78 .long 0xba9f9f25,0xba9f9f25 .long 0xe3a8a84b,0xe3a8a84b .long 0xf35151a2,0xf35151a2 .long 0xfea3a35d,0xfea3a35d .long 0xc0404080,0xc0404080 .long 0x8a8f8f05,0x8a8f8f05 .long 0xad92923f,0xad92923f .long 0xbc9d9d21,0xbc9d9d21 .long 0x48383870,0x48383870 .long 0x04f5f5f1,0x04f5f5f1 .long 0xdfbcbc63,0xdfbcbc63 .long 0xc1b6b677,0xc1b6b677 .long 0x75dadaaf,0x75dadaaf .long 0x63212142,0x63212142 .long 0x30101020,0x30101020 .long 0x1affffe5,0x1affffe5 .long 0x0ef3f3fd,0x0ef3f3fd .long 0x6dd2d2bf,0x6dd2d2bf .long 0x4ccdcd81,0x4ccdcd81 .long 0x140c0c18,0x140c0c18 .long 0x35131326,0x35131326 .long 0x2fececc3,0x2fececc3 .long 0xe15f5fbe,0xe15f5fbe .long 0xa2979735,0xa2979735 .long 0xcc444488,0xcc444488 .long 0x3917172e,0x3917172e .long 0x57c4c493,0x57c4c493 .long 0xf2a7a755,0xf2a7a755 .long 0x827e7efc,0x827e7efc .long 0x473d3d7a,0x473d3d7a .long 0xac6464c8,0xac6464c8 .long 0xe75d5dba,0xe75d5dba .long 0x2b191932,0x2b191932 .long 0x957373e6,0x957373e6 .long 0xa06060c0,0xa06060c0 .long 0x98818119,0x98818119 .long 0xd14f4f9e,0xd14f4f9e .long 0x7fdcdca3,0x7fdcdca3 .long 0x66222244,0x66222244 .long 0x7e2a2a54,0x7e2a2a54 .long 0xab90903b,0xab90903b .long 0x8388880b,0x8388880b .long 0xca46468c,0xca46468c .long 0x29eeeec7,0x29eeeec7 .long 0xd3b8b86b,0xd3b8b86b .long 0x3c141428,0x3c141428 .long 0x79dedea7,0x79dedea7 .long 0xe25e5ebc,0xe25e5ebc .long 0x1d0b0b16,0x1d0b0b16 .long 0x76dbdbad,0x76dbdbad .long 0x3be0e0db,0x3be0e0db .long 0x56323264,0x56323264 .long 0x4e3a3a74,0x4e3a3a74 .long 0x1e0a0a14,0x1e0a0a14 .long 0xdb494992,0xdb494992 .long 0x0a06060c,0x0a06060c .long 0x6c242448,0x6c242448 .long 0xe45c5cb8,0xe45c5cb8 .long 0x5dc2c29f,0x5dc2c29f .long 0x6ed3d3bd,0x6ed3d3bd .long 0xefacac43,0xefacac43 .long 0xa66262c4,0xa66262c4 .long 0xa8919139,0xa8919139 .long 0xa4959531,0xa4959531 .long 0x37e4e4d3,0x37e4e4d3 .long 0x8b7979f2,0x8b7979f2 .long 0x32e7e7d5,0x32e7e7d5 .long 0x43c8c88b,0x43c8c88b .long 0x5937376e,0x5937376e .long 0xb76d6dda,0xb76d6dda .long 0x8c8d8d01,0x8c8d8d01 .long 0x64d5d5b1,0x64d5d5b1 .long 0xd24e4e9c,0xd24e4e9c .long 0xe0a9a949,0xe0a9a949 .long 0xb46c6cd8,0xb46c6cd8 .long 0xfa5656ac,0xfa5656ac .long 0x07f4f4f3,0x07f4f4f3 .long 0x25eaeacf,0x25eaeacf .long 0xaf6565ca,0xaf6565ca .long 0x8e7a7af4,0x8e7a7af4 .long 0xe9aeae47,0xe9aeae47 .long 0x18080810,0x18080810 .long 0xd5baba6f,0xd5baba6f .long 0x887878f0,0x887878f0 .long 0x6f25254a,0x6f25254a .long 0x722e2e5c,0x722e2e5c .long 0x241c1c38,0x241c1c38 .long 0xf1a6a657,0xf1a6a657 .long 0xc7b4b473,0xc7b4b473 .long 0x51c6c697,0x51c6c697 .long 0x23e8e8cb,0x23e8e8cb .long 0x7cdddda1,0x7cdddda1 .long 0x9c7474e8,0x9c7474e8 .long 0x211f1f3e,0x211f1f3e .long 0xdd4b4b96,0xdd4b4b96 .long 0xdcbdbd61,0xdcbdbd61 .long 0x868b8b0d,0x868b8b0d .long 0x858a8a0f,0x858a8a0f .long 0x907070e0,0x907070e0 .long 0x423e3e7c,0x423e3e7c .long 0xc4b5b571,0xc4b5b571 .long 0xaa6666cc,0xaa6666cc .long 0xd8484890,0xd8484890 .long 0x05030306,0x05030306 .long 0x01f6f6f7,0x01f6f6f7 .long 0x120e0e1c,0x120e0e1c .long 0xa36161c2,0xa36161c2 .long 0x5f35356a,0x5f35356a .long 0xf95757ae,0xf95757ae .long 0xd0b9b969,0xd0b9b969 .long 0x91868617,0x91868617 .long 0x58c1c199,0x58c1c199 .long 0x271d1d3a,0x271d1d3a .long 0xb99e9e27,0xb99e9e27 .long 0x38e1e1d9,0x38e1e1d9 .long 0x13f8f8eb,0x13f8f8eb .long 0xb398982b,0xb398982b .long 0x33111122,0x33111122 .long 0xbb6969d2,0xbb6969d2 .long 0x70d9d9a9,0x70d9d9a9 .long 0x898e8e07,0x898e8e07 .long 0xa7949433,0xa7949433 .long 0xb69b9b2d,0xb69b9b2d .long 0x221e1e3c,0x221e1e3c .long 0x92878715,0x92878715 .long 0x20e9e9c9,0x20e9e9c9 .long 0x49cece87,0x49cece87 .long 0xff5555aa,0xff5555aa .long 0x78282850,0x78282850 .long 0x7adfdfa5,0x7adfdfa5 .long 0x8f8c8c03,0x8f8c8c03 .long 0xf8a1a159,0xf8a1a159 .long 0x80898909,0x80898909 .long 0x170d0d1a,0x170d0d1a .long 0xdabfbf65,0xdabfbf65 .long 0x31e6e6d7,0x31e6e6d7 .long 0xc6424284,0xc6424284 .long 0xb86868d0,0xb86868d0 .long 0xc3414182,0xc3414182 .long 0xb0999929,0xb0999929 .long 0x772d2d5a,0x772d2d5a .long 0x110f0f1e,0x110f0f1e .long 0xcbb0b07b,0xcbb0b07b .long 0xfc5454a8,0xfc5454a8 .long 0xd6bbbb6d,0xd6bbbb6d .long 0x3a16162c,0x3a16162c .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .long 0x00000001, 0x00000002, 0x00000004, 0x00000008 .long 0x00000010, 0x00000020, 0x00000040, 0x00000080 .long 0x0000001b, 0x00000036, 0x80808080, 0x80808080 .long 0xfefefefe, 0xfefefefe, 0x1b1b1b1b, 0x1b1b1b1b .byte 65,69,83,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 #endif ring-0.16.9/pregenerated/aes-x86_64-macosx.S000064400000000000000000000511171353224257600165370ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .p2align 4 _x86_64_AES_encrypt_compact: leaq 128(%r14),%r8 movl 0-128(%r8),%edi movl 32-128(%r8),%ebp movl 64-128(%r8),%r10d movl 96-128(%r8),%r11d movl 128-128(%r8),%edi movl 160-128(%r8),%ebp movl 192-128(%r8),%r10d movl 224-128(%r8),%r11d jmp L$enc_loop_compact .p2align 4 L$enc_loop_compact: xorl 0(%r15),%eax xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx leaq 16(%r15),%r15 movzbl %al,%r10d movzbl %bl,%r11d movzbl %cl,%r12d movzbl %dl,%r8d movzbl %bh,%esi movzbl %ch,%edi shrl $16,%ecx movzbl %dh,%ebp movzbl (%r14,%r10,1),%r10d movzbl (%r14,%r11,1),%r11d movzbl (%r14,%r12,1),%r12d movzbl (%r14,%r8,1),%r8d movzbl (%r14,%rsi,1),%r9d movzbl %ah,%esi movzbl (%r14,%rdi,1),%r13d movzbl %cl,%edi movzbl (%r14,%rbp,1),%ebp movzbl (%r14,%rsi,1),%esi shll $8,%r9d shrl $16,%edx shll $8,%r13d xorl %r9d,%r10d shrl $16,%eax movzbl %dl,%r9d shrl $16,%ebx xorl %r13d,%r11d shll $8,%ebp movzbl %al,%r13d movzbl (%r14,%rdi,1),%edi xorl %ebp,%r12d shll $8,%esi movzbl %bl,%ebp shll $16,%edi xorl %esi,%r8d movzbl (%r14,%r9,1),%r9d movzbl %dh,%esi movzbl (%r14,%r13,1),%r13d xorl %edi,%r10d shrl $8,%ecx movzbl %ah,%edi shll $16,%r9d shrl $8,%ebx shll $16,%r13d xorl %r9d,%r11d movzbl (%r14,%rbp,1),%ebp movzbl (%r14,%rsi,1),%esi movzbl (%r14,%rdi,1),%edi movzbl (%r14,%rcx,1),%edx movzbl (%r14,%rbx,1),%ecx shll $16,%ebp xorl %r13d,%r12d shll $24,%esi xorl %ebp,%r8d shll $24,%edi xorl %esi,%r10d shll $24,%edx xorl %edi,%r11d shll $24,%ecx movl %r10d,%eax movl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx cmpq 16(%rsp),%r15 je L$enc_compact_done movl $0x80808080,%r10d movl $0x80808080,%r11d andl %eax,%r10d andl %ebx,%r11d movl %r10d,%esi movl %r11d,%edi shrl $7,%r10d leal (%rax,%rax,1),%r8d shrl $7,%r11d leal (%rbx,%rbx,1),%r9d subl %r10d,%esi subl %r11d,%edi andl $0xfefefefe,%r8d andl $0xfefefefe,%r9d andl $0x1b1b1b1b,%esi andl $0x1b1b1b1b,%edi movl %eax,%r10d movl %ebx,%r11d xorl %esi,%r8d xorl %edi,%r9d xorl %r8d,%eax xorl %r9d,%ebx movl $0x80808080,%r12d roll $24,%eax movl $0x80808080,%ebp roll $24,%ebx andl %ecx,%r12d andl %edx,%ebp xorl %r8d,%eax xorl %r9d,%ebx movl %r12d,%esi rorl $16,%r10d movl %ebp,%edi rorl $16,%r11d leal (%rcx,%rcx,1),%r8d shrl $7,%r12d xorl %r10d,%eax shrl $7,%ebp xorl %r11d,%ebx rorl $8,%r10d leal (%rdx,%rdx,1),%r9d rorl $8,%r11d subl %r12d,%esi subl %ebp,%edi xorl %r10d,%eax xorl %r11d,%ebx andl $0xfefefefe,%r8d andl $0xfefefefe,%r9d andl $0x1b1b1b1b,%esi andl $0x1b1b1b1b,%edi movl %ecx,%r12d movl %edx,%ebp xorl %esi,%r8d xorl %edi,%r9d rorl $16,%r12d xorl %r8d,%ecx rorl $16,%ebp xorl %r9d,%edx roll $24,%ecx movl 0(%r14),%esi roll $24,%edx xorl %r8d,%ecx movl 64(%r14),%edi xorl %r9d,%edx movl 128(%r14),%r8d xorl %r12d,%ecx rorl $8,%r12d xorl %ebp,%edx rorl $8,%ebp xorl %r12d,%ecx movl 192(%r14),%r9d xorl %ebp,%edx jmp L$enc_loop_compact .p2align 4 L$enc_compact_done: xorl 0(%r15),%eax xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx .byte 0xf3,0xc3 .p2align 4 .globl _GFp_aes_nohw_encrypt .private_extern _GFp_aes_nohw_encrypt .private_extern _GFp_aes_nohw_encrypt _GFp_aes_nohw_encrypt: movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 leaq -63(%rdx),%rcx andq $-64,%rsp subq %rsp,%rcx negq %rcx andq $0x3c0,%rcx subq %rcx,%rsp subq $32,%rsp movq %rsi,16(%rsp) movq %rax,24(%rsp) L$enc_prologue: movq %rdx,%r15 movl 240(%r15),%r13d movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx shll $4,%r13d leaq (%r15,%r13,1),%rbp movq %r15,(%rsp) movq %rbp,8(%rsp) leaq L$AES_Te+2048(%rip),%r14 leaq 768(%rsp),%rbp subq %r14,%rbp andq $0x300,%rbp leaq (%r14,%rbp,1),%r14 call _x86_64_AES_encrypt_compact movq 16(%rsp),%r9 movq 24(%rsp),%rsi movl %eax,0(%r9) movl %ebx,4(%r9) movl %ecx,8(%r9) movl %edx,12(%r9) movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$enc_epilogue: .byte 0xf3,0xc3 .p2align 4 .globl _GFp_aes_nohw_set_encrypt_key .private_extern _GFp_aes_nohw_set_encrypt_key _GFp_aes_nohw_set_encrypt_key: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $8,%rsp L$enc_key_prologue: call _x86_64_AES_set_encrypt_key movq 40(%rsp),%rbp movq 48(%rsp),%rbx addq $56,%rsp L$enc_key_epilogue: .byte 0xf3,0xc3 .p2align 4 _x86_64_AES_set_encrypt_key: movl %esi,%ecx movq %rdi,%rsi movq %rdx,%rdi testq $-1,%rsi jz L$badpointer testq $-1,%rdi jz L$badpointer leaq L$AES_Te(%rip),%rbp leaq 2048+128(%rbp),%rbp movl 0-128(%rbp),%eax movl 32-128(%rbp),%ebx movl 64-128(%rbp),%r8d movl 96-128(%rbp),%edx movl 128-128(%rbp),%eax movl 160-128(%rbp),%ebx movl 192-128(%rbp),%r8d movl 224-128(%rbp),%edx cmpl $128,%ecx je L$10rounds cmpl $256,%ecx je L$14rounds movq $-2,%rax jmp L$exit L$10rounds: movq 0(%rsi),%rax movq 8(%rsi),%rdx movq %rax,0(%rdi) movq %rdx,8(%rdi) shrq $32,%rdx xorl %ecx,%ecx jmp L$10shortcut .p2align 2 L$10loop: movl 0(%rdi),%eax movl 12(%rdi),%edx L$10shortcut: movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 1024-128(%rbp,%rcx,4),%eax movl %eax,16(%rdi) xorl 4(%rdi),%eax movl %eax,20(%rdi) xorl 8(%rdi),%eax movl %eax,24(%rdi) xorl 12(%rdi),%eax movl %eax,28(%rdi) addl $1,%ecx leaq 16(%rdi),%rdi cmpl $10,%ecx jl L$10loop movl $10,80(%rdi) xorq %rax,%rax jmp L$exit L$14rounds: movq 0(%rsi),%rax movq 8(%rsi),%rbx movq 16(%rsi),%rcx movq 24(%rsi),%rdx movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) shrq $32,%rdx xorl %ecx,%ecx jmp L$14shortcut .p2align 2 L$14loop: movl 0(%rdi),%eax movl 28(%rdi),%edx L$14shortcut: movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $24,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $8,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $16,%ebx xorl %ebx,%eax xorl 1024-128(%rbp,%rcx,4),%eax movl %eax,32(%rdi) xorl 4(%rdi),%eax movl %eax,36(%rdi) xorl 8(%rdi),%eax movl %eax,40(%rdi) xorl 12(%rdi),%eax movl %eax,44(%rdi) cmpl $6,%ecx je L$14break addl $1,%ecx movl %eax,%edx movl 16(%rdi),%eax movzbl %dl,%esi movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shrl $16,%edx shll $8,%ebx movzbl %dl,%esi xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx movzbl %dh,%esi shll $16,%ebx xorl %ebx,%eax movzbl -128(%rbp,%rsi,1),%ebx shll $24,%ebx xorl %ebx,%eax movl %eax,48(%rdi) xorl 20(%rdi),%eax movl %eax,52(%rdi) xorl 24(%rdi),%eax movl %eax,56(%rdi) xorl 28(%rdi),%eax movl %eax,60(%rdi) leaq 32(%rdi),%rdi jmp L$14loop L$14break: movl $14,48(%rdi) xorq %rax,%rax jmp L$exit L$badpointer: movq $-1,%rax L$exit: .byte 0xf3,0xc3 .p2align 6 L$AES_Te: .long 0xa56363c6,0xa56363c6 .long 0x847c7cf8,0x847c7cf8 .long 0x997777ee,0x997777ee .long 0x8d7b7bf6,0x8d7b7bf6 .long 0x0df2f2ff,0x0df2f2ff .long 0xbd6b6bd6,0xbd6b6bd6 .long 0xb16f6fde,0xb16f6fde .long 0x54c5c591,0x54c5c591 .long 0x50303060,0x50303060 .long 0x03010102,0x03010102 .long 0xa96767ce,0xa96767ce .long 0x7d2b2b56,0x7d2b2b56 .long 0x19fefee7,0x19fefee7 .long 0x62d7d7b5,0x62d7d7b5 .long 0xe6abab4d,0xe6abab4d .long 0x9a7676ec,0x9a7676ec .long 0x45caca8f,0x45caca8f .long 0x9d82821f,0x9d82821f .long 0x40c9c989,0x40c9c989 .long 0x877d7dfa,0x877d7dfa .long 0x15fafaef,0x15fafaef .long 0xeb5959b2,0xeb5959b2 .long 0xc947478e,0xc947478e .long 0x0bf0f0fb,0x0bf0f0fb .long 0xecadad41,0xecadad41 .long 0x67d4d4b3,0x67d4d4b3 .long 0xfda2a25f,0xfda2a25f .long 0xeaafaf45,0xeaafaf45 .long 0xbf9c9c23,0xbf9c9c23 .long 0xf7a4a453,0xf7a4a453 .long 0x967272e4,0x967272e4 .long 0x5bc0c09b,0x5bc0c09b .long 0xc2b7b775,0xc2b7b775 .long 0x1cfdfde1,0x1cfdfde1 .long 0xae93933d,0xae93933d .long 0x6a26264c,0x6a26264c .long 0x5a36366c,0x5a36366c .long 0x413f3f7e,0x413f3f7e .long 0x02f7f7f5,0x02f7f7f5 .long 0x4fcccc83,0x4fcccc83 .long 0x5c343468,0x5c343468 .long 0xf4a5a551,0xf4a5a551 .long 0x34e5e5d1,0x34e5e5d1 .long 0x08f1f1f9,0x08f1f1f9 .long 0x937171e2,0x937171e2 .long 0x73d8d8ab,0x73d8d8ab .long 0x53313162,0x53313162 .long 0x3f15152a,0x3f15152a .long 0x0c040408,0x0c040408 .long 0x52c7c795,0x52c7c795 .long 0x65232346,0x65232346 .long 0x5ec3c39d,0x5ec3c39d .long 0x28181830,0x28181830 .long 0xa1969637,0xa1969637 .long 0x0f05050a,0x0f05050a .long 0xb59a9a2f,0xb59a9a2f .long 0x0907070e,0x0907070e .long 0x36121224,0x36121224 .long 0x9b80801b,0x9b80801b .long 0x3de2e2df,0x3de2e2df .long 0x26ebebcd,0x26ebebcd .long 0x6927274e,0x6927274e .long 0xcdb2b27f,0xcdb2b27f .long 0x9f7575ea,0x9f7575ea .long 0x1b090912,0x1b090912 .long 0x9e83831d,0x9e83831d .long 0x742c2c58,0x742c2c58 .long 0x2e1a1a34,0x2e1a1a34 .long 0x2d1b1b36,0x2d1b1b36 .long 0xb26e6edc,0xb26e6edc .long 0xee5a5ab4,0xee5a5ab4 .long 0xfba0a05b,0xfba0a05b .long 0xf65252a4,0xf65252a4 .long 0x4d3b3b76,0x4d3b3b76 .long 0x61d6d6b7,0x61d6d6b7 .long 0xceb3b37d,0xceb3b37d .long 0x7b292952,0x7b292952 .long 0x3ee3e3dd,0x3ee3e3dd .long 0x712f2f5e,0x712f2f5e .long 0x97848413,0x97848413 .long 0xf55353a6,0xf55353a6 .long 0x68d1d1b9,0x68d1d1b9 .long 0x00000000,0x00000000 .long 0x2cededc1,0x2cededc1 .long 0x60202040,0x60202040 .long 0x1ffcfce3,0x1ffcfce3 .long 0xc8b1b179,0xc8b1b179 .long 0xed5b5bb6,0xed5b5bb6 .long 0xbe6a6ad4,0xbe6a6ad4 .long 0x46cbcb8d,0x46cbcb8d .long 0xd9bebe67,0xd9bebe67 .long 0x4b393972,0x4b393972 .long 0xde4a4a94,0xde4a4a94 .long 0xd44c4c98,0xd44c4c98 .long 0xe85858b0,0xe85858b0 .long 0x4acfcf85,0x4acfcf85 .long 0x6bd0d0bb,0x6bd0d0bb .long 0x2aefefc5,0x2aefefc5 .long 0xe5aaaa4f,0xe5aaaa4f .long 0x16fbfbed,0x16fbfbed .long 0xc5434386,0xc5434386 .long 0xd74d4d9a,0xd74d4d9a .long 0x55333366,0x55333366 .long 0x94858511,0x94858511 .long 0xcf45458a,0xcf45458a .long 0x10f9f9e9,0x10f9f9e9 .long 0x06020204,0x06020204 .long 0x817f7ffe,0x817f7ffe .long 0xf05050a0,0xf05050a0 .long 0x443c3c78,0x443c3c78 .long 0xba9f9f25,0xba9f9f25 .long 0xe3a8a84b,0xe3a8a84b .long 0xf35151a2,0xf35151a2 .long 0xfea3a35d,0xfea3a35d .long 0xc0404080,0xc0404080 .long 0x8a8f8f05,0x8a8f8f05 .long 0xad92923f,0xad92923f .long 0xbc9d9d21,0xbc9d9d21 .long 0x48383870,0x48383870 .long 0x04f5f5f1,0x04f5f5f1 .long 0xdfbcbc63,0xdfbcbc63 .long 0xc1b6b677,0xc1b6b677 .long 0x75dadaaf,0x75dadaaf .long 0x63212142,0x63212142 .long 0x30101020,0x30101020 .long 0x1affffe5,0x1affffe5 .long 0x0ef3f3fd,0x0ef3f3fd .long 0x6dd2d2bf,0x6dd2d2bf .long 0x4ccdcd81,0x4ccdcd81 .long 0x140c0c18,0x140c0c18 .long 0x35131326,0x35131326 .long 0x2fececc3,0x2fececc3 .long 0xe15f5fbe,0xe15f5fbe .long 0xa2979735,0xa2979735 .long 0xcc444488,0xcc444488 .long 0x3917172e,0x3917172e .long 0x57c4c493,0x57c4c493 .long 0xf2a7a755,0xf2a7a755 .long 0x827e7efc,0x827e7efc .long 0x473d3d7a,0x473d3d7a .long 0xac6464c8,0xac6464c8 .long 0xe75d5dba,0xe75d5dba .long 0x2b191932,0x2b191932 .long 0x957373e6,0x957373e6 .long 0xa06060c0,0xa06060c0 .long 0x98818119,0x98818119 .long 0xd14f4f9e,0xd14f4f9e .long 0x7fdcdca3,0x7fdcdca3 .long 0x66222244,0x66222244 .long 0x7e2a2a54,0x7e2a2a54 .long 0xab90903b,0xab90903b .long 0x8388880b,0x8388880b .long 0xca46468c,0xca46468c .long 0x29eeeec7,0x29eeeec7 .long 0xd3b8b86b,0xd3b8b86b .long 0x3c141428,0x3c141428 .long 0x79dedea7,0x79dedea7 .long 0xe25e5ebc,0xe25e5ebc .long 0x1d0b0b16,0x1d0b0b16 .long 0x76dbdbad,0x76dbdbad .long 0x3be0e0db,0x3be0e0db .long 0x56323264,0x56323264 .long 0x4e3a3a74,0x4e3a3a74 .long 0x1e0a0a14,0x1e0a0a14 .long 0xdb494992,0xdb494992 .long 0x0a06060c,0x0a06060c .long 0x6c242448,0x6c242448 .long 0xe45c5cb8,0xe45c5cb8 .long 0x5dc2c29f,0x5dc2c29f .long 0x6ed3d3bd,0x6ed3d3bd .long 0xefacac43,0xefacac43 .long 0xa66262c4,0xa66262c4 .long 0xa8919139,0xa8919139 .long 0xa4959531,0xa4959531 .long 0x37e4e4d3,0x37e4e4d3 .long 0x8b7979f2,0x8b7979f2 .long 0x32e7e7d5,0x32e7e7d5 .long 0x43c8c88b,0x43c8c88b .long 0x5937376e,0x5937376e .long 0xb76d6dda,0xb76d6dda .long 0x8c8d8d01,0x8c8d8d01 .long 0x64d5d5b1,0x64d5d5b1 .long 0xd24e4e9c,0xd24e4e9c .long 0xe0a9a949,0xe0a9a949 .long 0xb46c6cd8,0xb46c6cd8 .long 0xfa5656ac,0xfa5656ac .long 0x07f4f4f3,0x07f4f4f3 .long 0x25eaeacf,0x25eaeacf .long 0xaf6565ca,0xaf6565ca .long 0x8e7a7af4,0x8e7a7af4 .long 0xe9aeae47,0xe9aeae47 .long 0x18080810,0x18080810 .long 0xd5baba6f,0xd5baba6f .long 0x887878f0,0x887878f0 .long 0x6f25254a,0x6f25254a .long 0x722e2e5c,0x722e2e5c .long 0x241c1c38,0x241c1c38 .long 0xf1a6a657,0xf1a6a657 .long 0xc7b4b473,0xc7b4b473 .long 0x51c6c697,0x51c6c697 .long 0x23e8e8cb,0x23e8e8cb .long 0x7cdddda1,0x7cdddda1 .long 0x9c7474e8,0x9c7474e8 .long 0x211f1f3e,0x211f1f3e .long 0xdd4b4b96,0xdd4b4b96 .long 0xdcbdbd61,0xdcbdbd61 .long 0x868b8b0d,0x868b8b0d .long 0x858a8a0f,0x858a8a0f .long 0x907070e0,0x907070e0 .long 0x423e3e7c,0x423e3e7c .long 0xc4b5b571,0xc4b5b571 .long 0xaa6666cc,0xaa6666cc .long 0xd8484890,0xd8484890 .long 0x05030306,0x05030306 .long 0x01f6f6f7,0x01f6f6f7 .long 0x120e0e1c,0x120e0e1c .long 0xa36161c2,0xa36161c2 .long 0x5f35356a,0x5f35356a .long 0xf95757ae,0xf95757ae .long 0xd0b9b969,0xd0b9b969 .long 0x91868617,0x91868617 .long 0x58c1c199,0x58c1c199 .long 0x271d1d3a,0x271d1d3a .long 0xb99e9e27,0xb99e9e27 .long 0x38e1e1d9,0x38e1e1d9 .long 0x13f8f8eb,0x13f8f8eb .long 0xb398982b,0xb398982b .long 0x33111122,0x33111122 .long 0xbb6969d2,0xbb6969d2 .long 0x70d9d9a9,0x70d9d9a9 .long 0x898e8e07,0x898e8e07 .long 0xa7949433,0xa7949433 .long 0xb69b9b2d,0xb69b9b2d .long 0x221e1e3c,0x221e1e3c .long 0x92878715,0x92878715 .long 0x20e9e9c9,0x20e9e9c9 .long 0x49cece87,0x49cece87 .long 0xff5555aa,0xff5555aa .long 0x78282850,0x78282850 .long 0x7adfdfa5,0x7adfdfa5 .long 0x8f8c8c03,0x8f8c8c03 .long 0xf8a1a159,0xf8a1a159 .long 0x80898909,0x80898909 .long 0x170d0d1a,0x170d0d1a .long 0xdabfbf65,0xdabfbf65 .long 0x31e6e6d7,0x31e6e6d7 .long 0xc6424284,0xc6424284 .long 0xb86868d0,0xb86868d0 .long 0xc3414182,0xc3414182 .long 0xb0999929,0xb0999929 .long 0x772d2d5a,0x772d2d5a .long 0x110f0f1e,0x110f0f1e .long 0xcbb0b07b,0xcbb0b07b .long 0xfc5454a8,0xfc5454a8 .long 0xd6bbbb6d,0xd6bbbb6d .long 0x3a16162c,0x3a16162c .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .byte 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 .byte 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 .byte 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 .byte 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 .byte 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc .byte 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 .byte 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a .byte 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 .byte 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 .byte 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 .byte 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b .byte 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf .byte 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 .byte 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 .byte 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 .byte 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 .byte 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 .byte 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 .byte 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 .byte 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb .byte 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c .byte 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 .byte 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 .byte 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 .byte 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 .byte 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a .byte 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e .byte 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e .byte 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 .byte 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf .byte 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 .byte 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 .long 0x00000001, 0x00000002, 0x00000004, 0x00000008 .long 0x00000010, 0x00000020, 0x00000040, 0x00000080 .long 0x0000001b, 0x00000036, 0x80808080, 0x80808080 .long 0xfefefefe, 0xfefefefe, 0x1b1b1b1b, 0x1b1b1b1b .byte 65,69,83,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 #endif ring-0.16.9/pregenerated/aes-x86_64-nasm.obj000064400000000000000000000367631353224260200165530ustar0000000000000000dEi]P8,.text p`.pdata @0@.xdata& Hh@@@.debug$S 5@@B.debug$T D8@BMAxAhEPEXA8Ah EP@EX`DA3A3_A3OA3W MDDDDGGG$&GE 6E,>A,.A46AAE1DE1DA<>A1A1G G,.A1AAE1A,.A46A<>AA E1A1A1A1DDD1D1L;|$AAA!A!DDADAD D)D)AAAAA1A1D1D1AA!!D1D1DAAD AD1D1AD AD))D1D1AAẢA1A1AD1D1A6D1A~@D1ED1A1D1E1f.A3A3_A3OA3W ffffff.H|$Ht$HHHLHSUATAUAVAWHJHH)HHH)H Ht$HD$IE_OW AK,/L<$Hl$L5 H$L)HM4.LL$Ht$AAYAIAQ L~LvLnLfHnH^H&H|$Ht$ffffff.H|$Ht$HHHLSUATAUAVAWH'Hl$(H\$0H8H|$Ht$ffff.HHHHH-HE]DEUE] DE@U`HHHVHHWH 1W \51\51\51\513G3GG3GG3G GH GP H1HH^HNHVHH_HOHWH 1W\51\51\51\513G 3GG$3GG(3G G,Z‹G\51\51\51\51؉G03GG43GG83GG>^//q^//qSSSShh,,@ `@ `yyȶ[[[[jjjjFFggr99Kr99KJJޔJJޘLLԘLL԰XXXXJJkk**OOCCņCCŚMMךMMf33Uf33UEEϊEEPPPPx<!>!KKݖKKaa pppp|>>B|>>BqqffffHHؐHHaaaaj55_j55_WWWWiiXX:':'''88++"3"3iiiipp33--<"<" IIUUUUP((xP((xzzYY   ee11BBƄBBhhhhAAÂAA))Z--wZ--w{{˨TTTTmm,:,:c|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-Tc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-T @6AES for x86_64, CRYPTOGAMS by fffff.VWSUATAUAVAWH@I@xIIqMY8ENL9^IESNL9FH@HXHhL`LhLpLxIIMMMMHxHpIIIfff.VWSUATAUAVAWH@I@xIIqMY8ENL9^IESNL9FH@8HXHhL`LhLpLxIIMMMMHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^ $ %    .P:\ring\pregenerated\tmp\aes-x86_64-nasm.asmxMw;=듐p "&+037;?CG K!O"S#V$Y%\&_'d(i)n*s,x-{./013456789:;<=>@ABCDEFGIJKLMNOPQRSUVW X YZ[\]^_!`$a'b,c2d8e>fAgDhGiJjNkRlVmZn]o`pgqnrtszt}uvwyz{|}~  "),0258?AFPSW[_apuz} "& * . 25:?APUZ]` c!f%g'h)j+l-n/p1t5y7~9;>?@EHIJLMNOQRUVWXYZ[\^_`ab cfghik l"m'n(p*q-s0t5u8v;w=yBzE{H|J~ORUW\_ahknqtwz}  &)+.169;@CFIKPSVX]`behknqtw{ (08@H P X ` h px !"# $(%0&8'@(H)P*X+`,h-p.x/0123456789:;<=>?@ABC D(E0F8G@HHIPJXK`LhMpNxOPQRSTUVWXYZ[\]^_ ` a b c d( e0 f8 g@ hH iP jX k` lh mp nx o p q r s t u v w x y z { | } ~      ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                  (08@H P X ` h px !"# $(%0&8'@(H)P*X+`,h-p.x/0123456789:;<=>?@ABC D(E0F8G@HHIPJXK`LhMpNxOPQRSTUVWXYZ[\]^_`abc d(e0f8g@hHiPjXk`lhmpnxopqrstuvwxyz{|} ~02@ABCDFHJLMQU\`dgknt{    $'+.4;?CFLPTX\`dhov}         /P:\ring\pregenerated\aes-x86_64-nasm.objyasm 1.3.0%_x86_64_AES_encrypt_compactL$enc_loop_compactL$enc_compact_doneGFp_aes_nohw_encrypt*L$SEH_begin_GFp_aes_nohw_encryptL$enc_prologueL$AES_TeL$enc_epilogue(L$SEH_end_GFp_aes_nohw_encrypt&GFp_aes_nohw_set_encrypt_key2L$SEH_begin_GFp_aes_nohw_set_encrypt_keyL$enc_key_prologue%_x86_64_AES_set_encrypt_keyL$enc_key_epilogue0L$SEH_end_GFp_aes_nohw_set_encrypt_keyL$badpointerL$10roundsL$14roundsL$exitL$10shortcutL$10loopL$14shortcutL$14loopL$14breakblock_se_handlerL$in_block_prologueL$common_seh_exitkey_se_handlerL$in_key_prologue,  L$SEH_info_GFp_aes_nohw_encrypt4  L$SEH_info_GFp_aes_nohw_set_encrypt_keyd h Z ^           # ' 7 ; Q U {          : > l p                 / 3 K O j n   ! ! $ $ % % .fileg.text)E0XPkp}L$AES_Te5AP]$t7SfL$exit-L$10loop(L$14loop@"1.pdataCc.xdata .debug$S @.debug$T pregenerated\tmp\aes-x86_64-nasm.asm_x86_64_AES_encrypt_compactL$enc_loop_compactL$enc_compact_doneGFp_aes_nohw_encryptL$SEH_begin_GFp_aes_nohw_encryptL$enc_prologueL$enc_epilogueL$SEH_end_GFp_aes_nohw_encryptGFp_aes_nohw_set_encrypt_keyL$SEH_begin_GFp_aes_nohw_set_encrypt_keyL$enc_key_prologue_x86_64_AES_set_encrypt_keyL$enc_key_epilogueL$SEH_end_GFp_aes_nohw_set_encrypt_keyL$badpointerL$10roundsL$14roundsL$10shortcutL$14shortcutL$14break__imp_RtlVirtualUnwindblock_se_handlerL$in_block_prologueL$common_seh_exitkey_se_handlerL$in_key_prologueL$SEH_info_GFp_aes_nohw_encryptL$SEH_info_GFp_aes_nohw_set_encrypt_keyring-0.16.9/pregenerated/aesni-gcm-x86_64-elf.S000064400000000000000000000455441353224260400171050ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .type _aesni_ctr32_ghash_6x,@function .align 32 _aesni_ctr32_ghash_6x: .cfi_startproc vmovdqu 32(%r11),%xmm2 subq $6,%rdx vpxor %xmm4,%xmm4,%xmm4 vmovdqu 0-128(%rcx),%xmm15 vpaddb %xmm2,%xmm1,%xmm10 vpaddb %xmm2,%xmm10,%xmm11 vpaddb %xmm2,%xmm11,%xmm12 vpaddb %xmm2,%xmm12,%xmm13 vpaddb %xmm2,%xmm13,%xmm14 vpxor %xmm15,%xmm1,%xmm9 vmovdqu %xmm4,16+8(%rsp) jmp .Loop6x .align 32 .Loop6x: addl $100663296,%ebx jc .Lhandle_ctr32 vmovdqu 0-32(%r9),%xmm3 vpaddb %xmm2,%xmm14,%xmm1 vpxor %xmm15,%xmm10,%xmm10 vpxor %xmm15,%xmm11,%xmm11 .Lresume_ctr32: vmovdqu %xmm1,(%r8) vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5 vpxor %xmm15,%xmm12,%xmm12 vmovups 16-128(%rcx),%xmm2 vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6 xorq %r12,%r12 cmpq %r14,%r15 vaesenc %xmm2,%xmm9,%xmm9 vmovdqu 48+8(%rsp),%xmm0 vpxor %xmm15,%xmm13,%xmm13 vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1 vaesenc %xmm2,%xmm10,%xmm10 vpxor %xmm15,%xmm14,%xmm14 setnc %r12b vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 vaesenc %xmm2,%xmm11,%xmm11 vmovdqu 16-32(%r9),%xmm3 negq %r12 vaesenc %xmm2,%xmm12,%xmm12 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5 vpxor %xmm4,%xmm8,%xmm8 vaesenc %xmm2,%xmm13,%xmm13 vpxor %xmm5,%xmm1,%xmm4 andq $0x60,%r12 vmovups 32-128(%rcx),%xmm15 vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1 vaesenc %xmm2,%xmm14,%xmm14 vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2 leaq (%r14,%r12,1),%r14 vaesenc %xmm15,%xmm9,%xmm9 vpxor 16+8(%rsp),%xmm8,%xmm8 vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3 vmovdqu 64+8(%rsp),%xmm0 vaesenc %xmm15,%xmm10,%xmm10 movbeq 88(%r14),%r13 vaesenc %xmm15,%xmm11,%xmm11 movbeq 80(%r14),%r12 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,32+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,40+8(%rsp) vmovdqu 48-32(%r9),%xmm5 vaesenc %xmm15,%xmm14,%xmm14 vmovups 48-128(%rcx),%xmm15 vpxor %xmm1,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm2,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2 vaesenc %xmm15,%xmm10,%xmm10 vpxor %xmm3,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3 vaesenc %xmm15,%xmm11,%xmm11 vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5 vmovdqu 80+8(%rsp),%xmm0 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vpxor %xmm1,%xmm4,%xmm4 vmovdqu 64-32(%r9),%xmm1 vaesenc %xmm15,%xmm14,%xmm14 vmovups 64-128(%rcx),%xmm15 vpxor %xmm2,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm3,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3 vaesenc %xmm15,%xmm10,%xmm10 movbeq 72(%r14),%r13 vpxor %xmm5,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5 vaesenc %xmm15,%xmm11,%xmm11 movbeq 64(%r14),%r12 vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1 vmovdqu 96+8(%rsp),%xmm0 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,48+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,56+8(%rsp) vpxor %xmm2,%xmm4,%xmm4 vmovdqu 96-32(%r9),%xmm2 vaesenc %xmm15,%xmm14,%xmm14 vmovups 80-128(%rcx),%xmm15 vpxor %xmm3,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5 vaesenc %xmm15,%xmm10,%xmm10 movbeq 56(%r14),%r13 vpxor %xmm1,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1 vpxor 112+8(%rsp),%xmm8,%xmm8 vaesenc %xmm15,%xmm11,%xmm11 movbeq 48(%r14),%r12 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,64+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,72+8(%rsp) vpxor %xmm3,%xmm4,%xmm4 vmovdqu 112-32(%r9),%xmm3 vaesenc %xmm15,%xmm14,%xmm14 vmovups 96-128(%rcx),%xmm15 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm1,%xmm6,%xmm6 vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1 vaesenc %xmm15,%xmm10,%xmm10 movbeq 40(%r14),%r13 vpxor %xmm2,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2 vaesenc %xmm15,%xmm11,%xmm11 movbeq 32(%r14),%r12 vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,80+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,88+8(%rsp) vpxor %xmm5,%xmm6,%xmm6 vaesenc %xmm15,%xmm14,%xmm14 vpxor %xmm1,%xmm6,%xmm6 vmovups 112-128(%rcx),%xmm15 vpslldq $8,%xmm6,%xmm5 vpxor %xmm2,%xmm4,%xmm4 vmovdqu 16(%r11),%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm8,%xmm7,%xmm7 vaesenc %xmm15,%xmm10,%xmm10 vpxor %xmm5,%xmm4,%xmm4 movbeq 24(%r14),%r13 vaesenc %xmm15,%xmm11,%xmm11 movbeq 16(%r14),%r12 vpalignr $8,%xmm4,%xmm4,%xmm0 vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 movq %r13,96+8(%rsp) vaesenc %xmm15,%xmm12,%xmm12 movq %r12,104+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 vmovups 128-128(%rcx),%xmm1 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vmovups 144-128(%rcx),%xmm15 vaesenc %xmm1,%xmm10,%xmm10 vpsrldq $8,%xmm6,%xmm6 vaesenc %xmm1,%xmm11,%xmm11 vpxor %xmm6,%xmm7,%xmm7 vaesenc %xmm1,%xmm12,%xmm12 vpxor %xmm0,%xmm4,%xmm4 movbeq 8(%r14),%r13 vaesenc %xmm1,%xmm13,%xmm13 movbeq 0(%r14),%r12 vaesenc %xmm1,%xmm14,%xmm14 vmovups 160-128(%rcx),%xmm1 cmpl $11,%ebp jb .Lenc_tail vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vaesenc %xmm1,%xmm10,%xmm10 vaesenc %xmm1,%xmm11,%xmm11 vaesenc %xmm1,%xmm12,%xmm12 vaesenc %xmm1,%xmm13,%xmm13 vmovups 176-128(%rcx),%xmm15 vaesenc %xmm1,%xmm14,%xmm14 vmovups 192-128(%rcx),%xmm1 vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vaesenc %xmm1,%xmm10,%xmm10 vaesenc %xmm1,%xmm11,%xmm11 vaesenc %xmm1,%xmm12,%xmm12 vaesenc %xmm1,%xmm13,%xmm13 vmovups 208-128(%rcx),%xmm15 vaesenc %xmm1,%xmm14,%xmm14 vmovups 224-128(%rcx),%xmm1 jmp .Lenc_tail .align 32 .Lhandle_ctr32: vmovdqu (%r11),%xmm0 vpshufb %xmm0,%xmm1,%xmm6 vmovdqu 48(%r11),%xmm5 vpaddd 64(%r11),%xmm6,%xmm10 vpaddd %xmm5,%xmm6,%xmm11 vmovdqu 0-32(%r9),%xmm3 vpaddd %xmm5,%xmm10,%xmm12 vpshufb %xmm0,%xmm10,%xmm10 vpaddd %xmm5,%xmm11,%xmm13 vpshufb %xmm0,%xmm11,%xmm11 vpxor %xmm15,%xmm10,%xmm10 vpaddd %xmm5,%xmm12,%xmm14 vpshufb %xmm0,%xmm12,%xmm12 vpxor %xmm15,%xmm11,%xmm11 vpaddd %xmm5,%xmm13,%xmm1 vpshufb %xmm0,%xmm13,%xmm13 vpshufb %xmm0,%xmm14,%xmm14 vpshufb %xmm0,%xmm1,%xmm1 jmp .Lresume_ctr32 .align 32 .Lenc_tail: vaesenc %xmm15,%xmm9,%xmm9 vmovdqu %xmm7,16+8(%rsp) vpalignr $8,%xmm4,%xmm4,%xmm8 vaesenc %xmm15,%xmm10,%xmm10 vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 vpxor 0(%rdi),%xmm1,%xmm2 vaesenc %xmm15,%xmm11,%xmm11 vpxor 16(%rdi),%xmm1,%xmm0 vaesenc %xmm15,%xmm12,%xmm12 vpxor 32(%rdi),%xmm1,%xmm5 vaesenc %xmm15,%xmm13,%xmm13 vpxor 48(%rdi),%xmm1,%xmm6 vaesenc %xmm15,%xmm14,%xmm14 vpxor 64(%rdi),%xmm1,%xmm7 vpxor 80(%rdi),%xmm1,%xmm3 vmovdqu (%r8),%xmm1 vaesenclast %xmm2,%xmm9,%xmm9 vmovdqu 32(%r11),%xmm2 vaesenclast %xmm0,%xmm10,%xmm10 vpaddb %xmm2,%xmm1,%xmm0 movq %r13,112+8(%rsp) leaq 96(%rdi),%rdi vaesenclast %xmm5,%xmm11,%xmm11 vpaddb %xmm2,%xmm0,%xmm5 movq %r12,120+8(%rsp) leaq 96(%rsi),%rsi vmovdqu 0-128(%rcx),%xmm15 vaesenclast %xmm6,%xmm12,%xmm12 vpaddb %xmm2,%xmm5,%xmm6 vaesenclast %xmm7,%xmm13,%xmm13 vpaddb %xmm2,%xmm6,%xmm7 vaesenclast %xmm3,%xmm14,%xmm14 vpaddb %xmm2,%xmm7,%xmm3 addq $0x60,%r10 subq $0x6,%rdx jc .L6x_done vmovups %xmm9,-96(%rsi) vpxor %xmm15,%xmm1,%xmm9 vmovups %xmm10,-80(%rsi) vmovdqa %xmm0,%xmm10 vmovups %xmm11,-64(%rsi) vmovdqa %xmm5,%xmm11 vmovups %xmm12,-48(%rsi) vmovdqa %xmm6,%xmm12 vmovups %xmm13,-32(%rsi) vmovdqa %xmm7,%xmm13 vmovups %xmm14,-16(%rsi) vmovdqa %xmm3,%xmm14 vmovdqu 32+8(%rsp),%xmm7 jmp .Loop6x .L6x_done: vpxor 16+8(%rsp),%xmm8,%xmm8 vpxor %xmm4,%xmm8,%xmm8 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x .globl GFp_aesni_gcm_decrypt .hidden GFp_aesni_gcm_decrypt .type GFp_aesni_gcm_decrypt,@function .align 32 GFp_aesni_gcm_decrypt: .cfi_startproc xorq %r10,%r10 cmpq $0x60,%rdx jb .Lgcm_dec_abort leaq (%rsp),%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 vzeroupper vmovdqu (%r8),%xmm1 addq $-128,%rsp movl 12(%r8),%ebx leaq .Lbswap_mask(%rip),%r11 leaq -128(%rcx),%r14 movq $0xf80,%r15 vmovdqu (%r9),%xmm8 andq $-128,%rsp vmovdqu (%r11),%xmm0 leaq 128(%rcx),%rcx leaq 32+32(%r9),%r9 movl 240-128(%rcx),%ebp vpshufb %xmm0,%xmm8,%xmm8 andq %r15,%r14 andq %rsp,%r15 subq %r14,%r15 jc .Ldec_no_key_aliasing cmpq $768,%r15 jnc .Ldec_no_key_aliasing subq %r15,%rsp .Ldec_no_key_aliasing: vmovdqu 80(%rdi),%xmm7 leaq (%rdi),%r14 vmovdqu 64(%rdi),%xmm4 leaq -192(%rdi,%rdx,1),%r15 vmovdqu 48(%rdi),%xmm5 shrq $4,%rdx xorq %r10,%r10 vmovdqu 32(%rdi),%xmm6 vpshufb %xmm0,%xmm7,%xmm7 vmovdqu 16(%rdi),%xmm2 vpshufb %xmm0,%xmm4,%xmm4 vmovdqu (%rdi),%xmm3 vpshufb %xmm0,%xmm5,%xmm5 vmovdqu %xmm4,48(%rsp) vpshufb %xmm0,%xmm6,%xmm6 vmovdqu %xmm5,64(%rsp) vpshufb %xmm0,%xmm2,%xmm2 vmovdqu %xmm6,80(%rsp) vpshufb %xmm0,%xmm3,%xmm3 vmovdqu %xmm2,96(%rsp) vmovdqu %xmm3,112(%rsp) call _aesni_ctr32_ghash_6x vmovups %xmm9,-96(%rsi) vmovups %xmm10,-80(%rsi) vmovups %xmm11,-64(%rsi) vmovups %xmm12,-48(%rsi) vmovups %xmm13,-32(%rsi) vmovups %xmm14,-16(%rsi) vpshufb (%r11),%xmm8,%xmm8 vmovdqu %xmm8,-64(%r9) vzeroupper movq -48(%rax),%r15 .cfi_restore %r15 movq -40(%rax),%r14 .cfi_restore %r14 movq -32(%rax),%r13 .cfi_restore %r13 movq -24(%rax),%r12 .cfi_restore %r12 movq -16(%rax),%rbp .cfi_restore %rbp movq -8(%rax),%rbx .cfi_restore %rbx leaq (%rax),%rsp .cfi_def_cfa_register %rsp .Lgcm_dec_abort: movq %r10,%rax .byte 0xf3,0xc3 .cfi_endproc .size GFp_aesni_gcm_decrypt,.-GFp_aesni_gcm_decrypt .type _aesni_ctr32_6x,@function .align 32 _aesni_ctr32_6x: .cfi_startproc vmovdqu 0-128(%rcx),%xmm4 vmovdqu 32(%r11),%xmm2 leaq -1(%rbp),%r13 vmovups 16-128(%rcx),%xmm15 leaq 32-128(%rcx),%r12 vpxor %xmm4,%xmm1,%xmm9 addl $100663296,%ebx jc .Lhandle_ctr32_2 vpaddb %xmm2,%xmm1,%xmm10 vpaddb %xmm2,%xmm10,%xmm11 vpxor %xmm4,%xmm10,%xmm10 vpaddb %xmm2,%xmm11,%xmm12 vpxor %xmm4,%xmm11,%xmm11 vpaddb %xmm2,%xmm12,%xmm13 vpxor %xmm4,%xmm12,%xmm12 vpaddb %xmm2,%xmm13,%xmm14 vpxor %xmm4,%xmm13,%xmm13 vpaddb %xmm2,%xmm14,%xmm1 vpxor %xmm4,%xmm14,%xmm14 jmp .Loop_ctr32 .align 16 .Loop_ctr32: vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vmovups (%r12),%xmm15 leaq 16(%r12),%r12 decl %r13d jnz .Loop_ctr32 vmovdqu (%r12),%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor 0(%rdi),%xmm3,%xmm4 vaesenc %xmm15,%xmm10,%xmm10 vpxor 16(%rdi),%xmm3,%xmm5 vaesenc %xmm15,%xmm11,%xmm11 vpxor 32(%rdi),%xmm3,%xmm6 vaesenc %xmm15,%xmm12,%xmm12 vpxor 48(%rdi),%xmm3,%xmm8 vaesenc %xmm15,%xmm13,%xmm13 vpxor 64(%rdi),%xmm3,%xmm2 vaesenc %xmm15,%xmm14,%xmm14 vpxor 80(%rdi),%xmm3,%xmm3 leaq 96(%rdi),%rdi vaesenclast %xmm4,%xmm9,%xmm9 vaesenclast %xmm5,%xmm10,%xmm10 vaesenclast %xmm6,%xmm11,%xmm11 vaesenclast %xmm8,%xmm12,%xmm12 vaesenclast %xmm2,%xmm13,%xmm13 vaesenclast %xmm3,%xmm14,%xmm14 vmovups %xmm9,0(%rsi) vmovups %xmm10,16(%rsi) vmovups %xmm11,32(%rsi) vmovups %xmm12,48(%rsi) vmovups %xmm13,64(%rsi) vmovups %xmm14,80(%rsi) leaq 96(%rsi),%rsi .byte 0xf3,0xc3 .align 32 .Lhandle_ctr32_2: vpshufb %xmm0,%xmm1,%xmm6 vmovdqu 48(%r11),%xmm5 vpaddd 64(%r11),%xmm6,%xmm10 vpaddd %xmm5,%xmm6,%xmm11 vpaddd %xmm5,%xmm10,%xmm12 vpshufb %xmm0,%xmm10,%xmm10 vpaddd %xmm5,%xmm11,%xmm13 vpshufb %xmm0,%xmm11,%xmm11 vpxor %xmm4,%xmm10,%xmm10 vpaddd %xmm5,%xmm12,%xmm14 vpshufb %xmm0,%xmm12,%xmm12 vpxor %xmm4,%xmm11,%xmm11 vpaddd %xmm5,%xmm13,%xmm1 vpshufb %xmm0,%xmm13,%xmm13 vpxor %xmm4,%xmm12,%xmm12 vpshufb %xmm0,%xmm14,%xmm14 vpxor %xmm4,%xmm13,%xmm13 vpshufb %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm14,%xmm14 jmp .Loop_ctr32 .cfi_endproc .size _aesni_ctr32_6x,.-_aesni_ctr32_6x .globl GFp_aesni_gcm_encrypt .hidden GFp_aesni_gcm_encrypt .type GFp_aesni_gcm_encrypt,@function .align 32 GFp_aesni_gcm_encrypt: .cfi_startproc xorq %r10,%r10 cmpq $288,%rdx jb .Lgcm_enc_abort leaq (%rsp),%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 vzeroupper vmovdqu (%r8),%xmm1 addq $-128,%rsp movl 12(%r8),%ebx leaq .Lbswap_mask(%rip),%r11 leaq -128(%rcx),%r14 movq $0xf80,%r15 leaq 128(%rcx),%rcx vmovdqu (%r11),%xmm0 andq $-128,%rsp movl 240-128(%rcx),%ebp andq %r15,%r14 andq %rsp,%r15 subq %r14,%r15 jc .Lenc_no_key_aliasing cmpq $768,%r15 jnc .Lenc_no_key_aliasing subq %r15,%rsp .Lenc_no_key_aliasing: leaq (%rsi),%r14 leaq -192(%rsi,%rdx,1),%r15 shrq $4,%rdx call _aesni_ctr32_6x vpshufb %xmm0,%xmm9,%xmm8 vpshufb %xmm0,%xmm10,%xmm2 vmovdqu %xmm8,112(%rsp) vpshufb %xmm0,%xmm11,%xmm4 vmovdqu %xmm2,96(%rsp) vpshufb %xmm0,%xmm12,%xmm5 vmovdqu %xmm4,80(%rsp) vpshufb %xmm0,%xmm13,%xmm6 vmovdqu %xmm5,64(%rsp) vpshufb %xmm0,%xmm14,%xmm7 vmovdqu %xmm6,48(%rsp) call _aesni_ctr32_6x vmovdqu (%r9),%xmm8 leaq 32+32(%r9),%r9 subq $12,%rdx movq $192,%r10 vpshufb %xmm0,%xmm8,%xmm8 call _aesni_ctr32_ghash_6x vmovdqu 32(%rsp),%xmm7 vmovdqu (%r11),%xmm0 vmovdqu 0-32(%r9),%xmm3 vpunpckhqdq %xmm7,%xmm7,%xmm1 vmovdqu 32-32(%r9),%xmm15 vmovups %xmm9,-96(%rsi) vpshufb %xmm0,%xmm9,%xmm9 vpxor %xmm7,%xmm1,%xmm1 vmovups %xmm10,-80(%rsi) vpshufb %xmm0,%xmm10,%xmm10 vmovups %xmm11,-64(%rsi) vpshufb %xmm0,%xmm11,%xmm11 vmovups %xmm12,-48(%rsi) vpshufb %xmm0,%xmm12,%xmm12 vmovups %xmm13,-32(%rsi) vpshufb %xmm0,%xmm13,%xmm13 vmovups %xmm14,-16(%rsi) vpshufb %xmm0,%xmm14,%xmm14 vmovdqu %xmm9,16(%rsp) vmovdqu 48(%rsp),%xmm6 vmovdqu 16-32(%r9),%xmm0 vpunpckhqdq %xmm6,%xmm6,%xmm2 vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5 vpxor %xmm6,%xmm2,%xmm2 vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 vmovdqu 64(%rsp),%xmm9 vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4 vmovdqu 48-32(%r9),%xmm3 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm9,%xmm9,%xmm5 vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6 vpxor %xmm9,%xmm5,%xmm5 vpxor %xmm7,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 vmovdqu 80-32(%r9),%xmm15 vpxor %xmm1,%xmm2,%xmm2 vmovdqu 80(%rsp),%xmm1 vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7 vmovdqu 64-32(%r9),%xmm0 vpxor %xmm4,%xmm7,%xmm7 vpunpckhqdq %xmm1,%xmm1,%xmm4 vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpxor %xmm6,%xmm9,%xmm9 vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 96(%rsp),%xmm2 vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6 vmovdqu 96-32(%r9),%xmm3 vpxor %xmm7,%xmm6,%xmm6 vpunpckhqdq %xmm2,%xmm2,%xmm7 vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1 vpxor %xmm2,%xmm7,%xmm7 vpxor %xmm9,%xmm1,%xmm1 vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4 vmovdqu 128-32(%r9),%xmm15 vpxor %xmm5,%xmm4,%xmm4 vpxor 112(%rsp),%xmm8,%xmm8 vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5 vmovdqu 112-32(%r9),%xmm0 vpunpckhqdq %xmm8,%xmm8,%xmm9 vpxor %xmm6,%xmm5,%xmm5 vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2 vpxor %xmm8,%xmm9,%xmm9 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7 vpxor %xmm4,%xmm7,%xmm4 vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6 vmovdqu 0-32(%r9),%xmm3 vpunpckhqdq %xmm14,%xmm14,%xmm1 vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8 vpxor %xmm14,%xmm1,%xmm1 vpxor %xmm5,%xmm6,%xmm5 vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9 vmovdqu 32-32(%r9),%xmm15 vpxor %xmm2,%xmm8,%xmm7 vpxor %xmm4,%xmm9,%xmm6 vmovdqu 16-32(%r9),%xmm0 vpxor %xmm5,%xmm7,%xmm9 vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4 vpxor %xmm9,%xmm6,%xmm6 vpunpckhqdq %xmm13,%xmm13,%xmm2 vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14 vpxor %xmm13,%xmm2,%xmm2 vpslldq $8,%xmm6,%xmm9 vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 vpxor %xmm9,%xmm5,%xmm8 vpsrldq $8,%xmm6,%xmm6 vpxor %xmm6,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5 vmovdqu 48-32(%r9),%xmm3 vpxor %xmm4,%xmm5,%xmm5 vpunpckhqdq %xmm12,%xmm12,%xmm9 vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13 vpxor %xmm12,%xmm9,%xmm9 vpxor %xmm14,%xmm13,%xmm13 vpalignr $8,%xmm8,%xmm8,%xmm14 vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 vmovdqu 80-32(%r9),%xmm15 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4 vmovdqu 64-32(%r9),%xmm0 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm11,%xmm11,%xmm1 vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12 vpxor %xmm11,%xmm1,%xmm1 vpxor %xmm13,%xmm12,%xmm12 vxorps 16(%rsp),%xmm7,%xmm7 vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9 vpxor %xmm2,%xmm9,%xmm9 vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 vxorps %xmm14,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5 vmovdqu 96-32(%r9),%xmm3 vpxor %xmm4,%xmm5,%xmm5 vpunpckhqdq %xmm10,%xmm10,%xmm2 vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11 vpxor %xmm10,%xmm2,%xmm2 vpalignr $8,%xmm8,%xmm8,%xmm14 vpxor %xmm12,%xmm11,%xmm11 vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1 vmovdqu 128-32(%r9),%xmm15 vpxor %xmm9,%xmm1,%xmm1 vxorps %xmm7,%xmm14,%xmm14 vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 vxorps %xmm14,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4 vmovdqu 112-32(%r9),%xmm0 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm8,%xmm8,%xmm9 vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10 vpxor %xmm8,%xmm9,%xmm9 vpxor %xmm11,%xmm10,%xmm10 vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5 vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7 vpxor %xmm4,%xmm5,%xmm5 vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6 vpxor %xmm10,%xmm7,%xmm7 vpxor %xmm2,%xmm6,%xmm6 vpxor %xmm5,%xmm7,%xmm4 vpxor %xmm4,%xmm6,%xmm6 vpslldq $8,%xmm6,%xmm1 vmovdqu 16(%r11),%xmm3 vpsrldq $8,%xmm6,%xmm6 vpxor %xmm1,%xmm5,%xmm8 vpxor %xmm6,%xmm7,%xmm7 vpalignr $8,%xmm8,%xmm8,%xmm2 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 vpxor %xmm2,%xmm8,%xmm8 vpalignr $8,%xmm8,%xmm8,%xmm2 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 vpxor %xmm7,%xmm2,%xmm2 vpxor %xmm2,%xmm8,%xmm8 vpshufb (%r11),%xmm8,%xmm8 vmovdqu %xmm8,-64(%r9) vzeroupper movq -48(%rax),%r15 .cfi_restore %r15 movq -40(%rax),%r14 .cfi_restore %r14 movq -32(%rax),%r13 .cfi_restore %r13 movq -24(%rax),%r12 .cfi_restore %r12 movq -16(%rax),%rbp .cfi_restore %rbp movq -8(%rax),%rbx .cfi_restore %rbx leaq (%rax),%rsp .cfi_def_cfa_register %rsp .Lgcm_enc_abort: movq %r10,%rax .byte 0xf3,0xc3 .cfi_endproc .size GFp_aesni_gcm_encrypt,.-GFp_aesni_gcm_encrypt .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .Lpoly: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 .Lone_msb: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 .Ltwo_lsb: .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .Lone_lsb: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 #endif ring-0.16.9/pregenerated/aesni-gcm-x86_64-macosx.S000064400000000000000000000436431353224257700176400ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .p2align 5 _aesni_ctr32_ghash_6x: vmovdqu 32(%r11),%xmm2 subq $6,%rdx vpxor %xmm4,%xmm4,%xmm4 vmovdqu 0-128(%rcx),%xmm15 vpaddb %xmm2,%xmm1,%xmm10 vpaddb %xmm2,%xmm10,%xmm11 vpaddb %xmm2,%xmm11,%xmm12 vpaddb %xmm2,%xmm12,%xmm13 vpaddb %xmm2,%xmm13,%xmm14 vpxor %xmm15,%xmm1,%xmm9 vmovdqu %xmm4,16+8(%rsp) jmp L$oop6x .p2align 5 L$oop6x: addl $100663296,%ebx jc L$handle_ctr32 vmovdqu 0-32(%r9),%xmm3 vpaddb %xmm2,%xmm14,%xmm1 vpxor %xmm15,%xmm10,%xmm10 vpxor %xmm15,%xmm11,%xmm11 L$resume_ctr32: vmovdqu %xmm1,(%r8) vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5 vpxor %xmm15,%xmm12,%xmm12 vmovups 16-128(%rcx),%xmm2 vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6 xorq %r12,%r12 cmpq %r14,%r15 vaesenc %xmm2,%xmm9,%xmm9 vmovdqu 48+8(%rsp),%xmm0 vpxor %xmm15,%xmm13,%xmm13 vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1 vaesenc %xmm2,%xmm10,%xmm10 vpxor %xmm15,%xmm14,%xmm14 setnc %r12b vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 vaesenc %xmm2,%xmm11,%xmm11 vmovdqu 16-32(%r9),%xmm3 negq %r12 vaesenc %xmm2,%xmm12,%xmm12 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5 vpxor %xmm4,%xmm8,%xmm8 vaesenc %xmm2,%xmm13,%xmm13 vpxor %xmm5,%xmm1,%xmm4 andq $0x60,%r12 vmovups 32-128(%rcx),%xmm15 vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1 vaesenc %xmm2,%xmm14,%xmm14 vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2 leaq (%r14,%r12,1),%r14 vaesenc %xmm15,%xmm9,%xmm9 vpxor 16+8(%rsp),%xmm8,%xmm8 vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3 vmovdqu 64+8(%rsp),%xmm0 vaesenc %xmm15,%xmm10,%xmm10 movbeq 88(%r14),%r13 vaesenc %xmm15,%xmm11,%xmm11 movbeq 80(%r14),%r12 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,32+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,40+8(%rsp) vmovdqu 48-32(%r9),%xmm5 vaesenc %xmm15,%xmm14,%xmm14 vmovups 48-128(%rcx),%xmm15 vpxor %xmm1,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm2,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2 vaesenc %xmm15,%xmm10,%xmm10 vpxor %xmm3,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3 vaesenc %xmm15,%xmm11,%xmm11 vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5 vmovdqu 80+8(%rsp),%xmm0 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vpxor %xmm1,%xmm4,%xmm4 vmovdqu 64-32(%r9),%xmm1 vaesenc %xmm15,%xmm14,%xmm14 vmovups 64-128(%rcx),%xmm15 vpxor %xmm2,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm3,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3 vaesenc %xmm15,%xmm10,%xmm10 movbeq 72(%r14),%r13 vpxor %xmm5,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5 vaesenc %xmm15,%xmm11,%xmm11 movbeq 64(%r14),%r12 vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1 vmovdqu 96+8(%rsp),%xmm0 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,48+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,56+8(%rsp) vpxor %xmm2,%xmm4,%xmm4 vmovdqu 96-32(%r9),%xmm2 vaesenc %xmm15,%xmm14,%xmm14 vmovups 80-128(%rcx),%xmm15 vpxor %xmm3,%xmm6,%xmm6 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5 vaesenc %xmm15,%xmm10,%xmm10 movbeq 56(%r14),%r13 vpxor %xmm1,%xmm7,%xmm7 vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1 vpxor 112+8(%rsp),%xmm8,%xmm8 vaesenc %xmm15,%xmm11,%xmm11 movbeq 48(%r14),%r12 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,64+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,72+8(%rsp) vpxor %xmm3,%xmm4,%xmm4 vmovdqu 112-32(%r9),%xmm3 vaesenc %xmm15,%xmm14,%xmm14 vmovups 96-128(%rcx),%xmm15 vpxor %xmm5,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm1,%xmm6,%xmm6 vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1 vaesenc %xmm15,%xmm10,%xmm10 movbeq 40(%r14),%r13 vpxor %xmm2,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2 vaesenc %xmm15,%xmm11,%xmm11 movbeq 32(%r14),%r12 vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8 vaesenc %xmm15,%xmm12,%xmm12 movq %r13,80+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 movq %r12,88+8(%rsp) vpxor %xmm5,%xmm6,%xmm6 vaesenc %xmm15,%xmm14,%xmm14 vpxor %xmm1,%xmm6,%xmm6 vmovups 112-128(%rcx),%xmm15 vpslldq $8,%xmm6,%xmm5 vpxor %xmm2,%xmm4,%xmm4 vmovdqu 16(%r11),%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor %xmm8,%xmm7,%xmm7 vaesenc %xmm15,%xmm10,%xmm10 vpxor %xmm5,%xmm4,%xmm4 movbeq 24(%r14),%r13 vaesenc %xmm15,%xmm11,%xmm11 movbeq 16(%r14),%r12 vpalignr $8,%xmm4,%xmm4,%xmm0 vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 movq %r13,96+8(%rsp) vaesenc %xmm15,%xmm12,%xmm12 movq %r12,104+8(%rsp) vaesenc %xmm15,%xmm13,%xmm13 vmovups 128-128(%rcx),%xmm1 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vmovups 144-128(%rcx),%xmm15 vaesenc %xmm1,%xmm10,%xmm10 vpsrldq $8,%xmm6,%xmm6 vaesenc %xmm1,%xmm11,%xmm11 vpxor %xmm6,%xmm7,%xmm7 vaesenc %xmm1,%xmm12,%xmm12 vpxor %xmm0,%xmm4,%xmm4 movbeq 8(%r14),%r13 vaesenc %xmm1,%xmm13,%xmm13 movbeq 0(%r14),%r12 vaesenc %xmm1,%xmm14,%xmm14 vmovups 160-128(%rcx),%xmm1 cmpl $11,%ebp jb L$enc_tail vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vaesenc %xmm1,%xmm10,%xmm10 vaesenc %xmm1,%xmm11,%xmm11 vaesenc %xmm1,%xmm12,%xmm12 vaesenc %xmm1,%xmm13,%xmm13 vmovups 176-128(%rcx),%xmm15 vaesenc %xmm1,%xmm14,%xmm14 vmovups 192-128(%rcx),%xmm1 vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vaesenc %xmm1,%xmm9,%xmm9 vaesenc %xmm1,%xmm10,%xmm10 vaesenc %xmm1,%xmm11,%xmm11 vaesenc %xmm1,%xmm12,%xmm12 vaesenc %xmm1,%xmm13,%xmm13 vmovups 208-128(%rcx),%xmm15 vaesenc %xmm1,%xmm14,%xmm14 vmovups 224-128(%rcx),%xmm1 jmp L$enc_tail .p2align 5 L$handle_ctr32: vmovdqu (%r11),%xmm0 vpshufb %xmm0,%xmm1,%xmm6 vmovdqu 48(%r11),%xmm5 vpaddd 64(%r11),%xmm6,%xmm10 vpaddd %xmm5,%xmm6,%xmm11 vmovdqu 0-32(%r9),%xmm3 vpaddd %xmm5,%xmm10,%xmm12 vpshufb %xmm0,%xmm10,%xmm10 vpaddd %xmm5,%xmm11,%xmm13 vpshufb %xmm0,%xmm11,%xmm11 vpxor %xmm15,%xmm10,%xmm10 vpaddd %xmm5,%xmm12,%xmm14 vpshufb %xmm0,%xmm12,%xmm12 vpxor %xmm15,%xmm11,%xmm11 vpaddd %xmm5,%xmm13,%xmm1 vpshufb %xmm0,%xmm13,%xmm13 vpshufb %xmm0,%xmm14,%xmm14 vpshufb %xmm0,%xmm1,%xmm1 jmp L$resume_ctr32 .p2align 5 L$enc_tail: vaesenc %xmm15,%xmm9,%xmm9 vmovdqu %xmm7,16+8(%rsp) vpalignr $8,%xmm4,%xmm4,%xmm8 vaesenc %xmm15,%xmm10,%xmm10 vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 vpxor 0(%rdi),%xmm1,%xmm2 vaesenc %xmm15,%xmm11,%xmm11 vpxor 16(%rdi),%xmm1,%xmm0 vaesenc %xmm15,%xmm12,%xmm12 vpxor 32(%rdi),%xmm1,%xmm5 vaesenc %xmm15,%xmm13,%xmm13 vpxor 48(%rdi),%xmm1,%xmm6 vaesenc %xmm15,%xmm14,%xmm14 vpxor 64(%rdi),%xmm1,%xmm7 vpxor 80(%rdi),%xmm1,%xmm3 vmovdqu (%r8),%xmm1 vaesenclast %xmm2,%xmm9,%xmm9 vmovdqu 32(%r11),%xmm2 vaesenclast %xmm0,%xmm10,%xmm10 vpaddb %xmm2,%xmm1,%xmm0 movq %r13,112+8(%rsp) leaq 96(%rdi),%rdi vaesenclast %xmm5,%xmm11,%xmm11 vpaddb %xmm2,%xmm0,%xmm5 movq %r12,120+8(%rsp) leaq 96(%rsi),%rsi vmovdqu 0-128(%rcx),%xmm15 vaesenclast %xmm6,%xmm12,%xmm12 vpaddb %xmm2,%xmm5,%xmm6 vaesenclast %xmm7,%xmm13,%xmm13 vpaddb %xmm2,%xmm6,%xmm7 vaesenclast %xmm3,%xmm14,%xmm14 vpaddb %xmm2,%xmm7,%xmm3 addq $0x60,%r10 subq $0x6,%rdx jc L$6x_done vmovups %xmm9,-96(%rsi) vpxor %xmm15,%xmm1,%xmm9 vmovups %xmm10,-80(%rsi) vmovdqa %xmm0,%xmm10 vmovups %xmm11,-64(%rsi) vmovdqa %xmm5,%xmm11 vmovups %xmm12,-48(%rsi) vmovdqa %xmm6,%xmm12 vmovups %xmm13,-32(%rsi) vmovdqa %xmm7,%xmm13 vmovups %xmm14,-16(%rsi) vmovdqa %xmm3,%xmm14 vmovdqu 32+8(%rsp),%xmm7 jmp L$oop6x L$6x_done: vpxor 16+8(%rsp),%xmm8,%xmm8 vpxor %xmm4,%xmm8,%xmm8 .byte 0xf3,0xc3 .globl _GFp_aesni_gcm_decrypt .private_extern _GFp_aesni_gcm_decrypt .p2align 5 _GFp_aesni_gcm_decrypt: xorq %r10,%r10 cmpq $0x60,%rdx jb L$gcm_dec_abort leaq (%rsp),%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 vzeroupper vmovdqu (%r8),%xmm1 addq $-128,%rsp movl 12(%r8),%ebx leaq L$bswap_mask(%rip),%r11 leaq -128(%rcx),%r14 movq $0xf80,%r15 vmovdqu (%r9),%xmm8 andq $-128,%rsp vmovdqu (%r11),%xmm0 leaq 128(%rcx),%rcx leaq 32+32(%r9),%r9 movl 240-128(%rcx),%ebp vpshufb %xmm0,%xmm8,%xmm8 andq %r15,%r14 andq %rsp,%r15 subq %r14,%r15 jc L$dec_no_key_aliasing cmpq $768,%r15 jnc L$dec_no_key_aliasing subq %r15,%rsp L$dec_no_key_aliasing: vmovdqu 80(%rdi),%xmm7 leaq (%rdi),%r14 vmovdqu 64(%rdi),%xmm4 leaq -192(%rdi,%rdx,1),%r15 vmovdqu 48(%rdi),%xmm5 shrq $4,%rdx xorq %r10,%r10 vmovdqu 32(%rdi),%xmm6 vpshufb %xmm0,%xmm7,%xmm7 vmovdqu 16(%rdi),%xmm2 vpshufb %xmm0,%xmm4,%xmm4 vmovdqu (%rdi),%xmm3 vpshufb %xmm0,%xmm5,%xmm5 vmovdqu %xmm4,48(%rsp) vpshufb %xmm0,%xmm6,%xmm6 vmovdqu %xmm5,64(%rsp) vpshufb %xmm0,%xmm2,%xmm2 vmovdqu %xmm6,80(%rsp) vpshufb %xmm0,%xmm3,%xmm3 vmovdqu %xmm2,96(%rsp) vmovdqu %xmm3,112(%rsp) call _aesni_ctr32_ghash_6x vmovups %xmm9,-96(%rsi) vmovups %xmm10,-80(%rsi) vmovups %xmm11,-64(%rsi) vmovups %xmm12,-48(%rsi) vmovups %xmm13,-32(%rsi) vmovups %xmm14,-16(%rsi) vpshufb (%r11),%xmm8,%xmm8 vmovdqu %xmm8,-64(%r9) vzeroupper movq -48(%rax),%r15 movq -40(%rax),%r14 movq -32(%rax),%r13 movq -24(%rax),%r12 movq -16(%rax),%rbp movq -8(%rax),%rbx leaq (%rax),%rsp L$gcm_dec_abort: movq %r10,%rax .byte 0xf3,0xc3 .p2align 5 _aesni_ctr32_6x: vmovdqu 0-128(%rcx),%xmm4 vmovdqu 32(%r11),%xmm2 leaq -1(%rbp),%r13 vmovups 16-128(%rcx),%xmm15 leaq 32-128(%rcx),%r12 vpxor %xmm4,%xmm1,%xmm9 addl $100663296,%ebx jc L$handle_ctr32_2 vpaddb %xmm2,%xmm1,%xmm10 vpaddb %xmm2,%xmm10,%xmm11 vpxor %xmm4,%xmm10,%xmm10 vpaddb %xmm2,%xmm11,%xmm12 vpxor %xmm4,%xmm11,%xmm11 vpaddb %xmm2,%xmm12,%xmm13 vpxor %xmm4,%xmm12,%xmm12 vpaddb %xmm2,%xmm13,%xmm14 vpxor %xmm4,%xmm13,%xmm13 vpaddb %xmm2,%xmm14,%xmm1 vpxor %xmm4,%xmm14,%xmm14 jmp L$oop_ctr32 .p2align 4 L$oop_ctr32: vaesenc %xmm15,%xmm9,%xmm9 vaesenc %xmm15,%xmm10,%xmm10 vaesenc %xmm15,%xmm11,%xmm11 vaesenc %xmm15,%xmm12,%xmm12 vaesenc %xmm15,%xmm13,%xmm13 vaesenc %xmm15,%xmm14,%xmm14 vmovups (%r12),%xmm15 leaq 16(%r12),%r12 decl %r13d jnz L$oop_ctr32 vmovdqu (%r12),%xmm3 vaesenc %xmm15,%xmm9,%xmm9 vpxor 0(%rdi),%xmm3,%xmm4 vaesenc %xmm15,%xmm10,%xmm10 vpxor 16(%rdi),%xmm3,%xmm5 vaesenc %xmm15,%xmm11,%xmm11 vpxor 32(%rdi),%xmm3,%xmm6 vaesenc %xmm15,%xmm12,%xmm12 vpxor 48(%rdi),%xmm3,%xmm8 vaesenc %xmm15,%xmm13,%xmm13 vpxor 64(%rdi),%xmm3,%xmm2 vaesenc %xmm15,%xmm14,%xmm14 vpxor 80(%rdi),%xmm3,%xmm3 leaq 96(%rdi),%rdi vaesenclast %xmm4,%xmm9,%xmm9 vaesenclast %xmm5,%xmm10,%xmm10 vaesenclast %xmm6,%xmm11,%xmm11 vaesenclast %xmm8,%xmm12,%xmm12 vaesenclast %xmm2,%xmm13,%xmm13 vaesenclast %xmm3,%xmm14,%xmm14 vmovups %xmm9,0(%rsi) vmovups %xmm10,16(%rsi) vmovups %xmm11,32(%rsi) vmovups %xmm12,48(%rsi) vmovups %xmm13,64(%rsi) vmovups %xmm14,80(%rsi) leaq 96(%rsi),%rsi .byte 0xf3,0xc3 .p2align 5 L$handle_ctr32_2: vpshufb %xmm0,%xmm1,%xmm6 vmovdqu 48(%r11),%xmm5 vpaddd 64(%r11),%xmm6,%xmm10 vpaddd %xmm5,%xmm6,%xmm11 vpaddd %xmm5,%xmm10,%xmm12 vpshufb %xmm0,%xmm10,%xmm10 vpaddd %xmm5,%xmm11,%xmm13 vpshufb %xmm0,%xmm11,%xmm11 vpxor %xmm4,%xmm10,%xmm10 vpaddd %xmm5,%xmm12,%xmm14 vpshufb %xmm0,%xmm12,%xmm12 vpxor %xmm4,%xmm11,%xmm11 vpaddd %xmm5,%xmm13,%xmm1 vpshufb %xmm0,%xmm13,%xmm13 vpxor %xmm4,%xmm12,%xmm12 vpshufb %xmm0,%xmm14,%xmm14 vpxor %xmm4,%xmm13,%xmm13 vpshufb %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm14,%xmm14 jmp L$oop_ctr32 .globl _GFp_aesni_gcm_encrypt .private_extern _GFp_aesni_gcm_encrypt .p2align 5 _GFp_aesni_gcm_encrypt: xorq %r10,%r10 cmpq $288,%rdx jb L$gcm_enc_abort leaq (%rsp),%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 vzeroupper vmovdqu (%r8),%xmm1 addq $-128,%rsp movl 12(%r8),%ebx leaq L$bswap_mask(%rip),%r11 leaq -128(%rcx),%r14 movq $0xf80,%r15 leaq 128(%rcx),%rcx vmovdqu (%r11),%xmm0 andq $-128,%rsp movl 240-128(%rcx),%ebp andq %r15,%r14 andq %rsp,%r15 subq %r14,%r15 jc L$enc_no_key_aliasing cmpq $768,%r15 jnc L$enc_no_key_aliasing subq %r15,%rsp L$enc_no_key_aliasing: leaq (%rsi),%r14 leaq -192(%rsi,%rdx,1),%r15 shrq $4,%rdx call _aesni_ctr32_6x vpshufb %xmm0,%xmm9,%xmm8 vpshufb %xmm0,%xmm10,%xmm2 vmovdqu %xmm8,112(%rsp) vpshufb %xmm0,%xmm11,%xmm4 vmovdqu %xmm2,96(%rsp) vpshufb %xmm0,%xmm12,%xmm5 vmovdqu %xmm4,80(%rsp) vpshufb %xmm0,%xmm13,%xmm6 vmovdqu %xmm5,64(%rsp) vpshufb %xmm0,%xmm14,%xmm7 vmovdqu %xmm6,48(%rsp) call _aesni_ctr32_6x vmovdqu (%r9),%xmm8 leaq 32+32(%r9),%r9 subq $12,%rdx movq $192,%r10 vpshufb %xmm0,%xmm8,%xmm8 call _aesni_ctr32_ghash_6x vmovdqu 32(%rsp),%xmm7 vmovdqu (%r11),%xmm0 vmovdqu 0-32(%r9),%xmm3 vpunpckhqdq %xmm7,%xmm7,%xmm1 vmovdqu 32-32(%r9),%xmm15 vmovups %xmm9,-96(%rsi) vpshufb %xmm0,%xmm9,%xmm9 vpxor %xmm7,%xmm1,%xmm1 vmovups %xmm10,-80(%rsi) vpshufb %xmm0,%xmm10,%xmm10 vmovups %xmm11,-64(%rsi) vpshufb %xmm0,%xmm11,%xmm11 vmovups %xmm12,-48(%rsi) vpshufb %xmm0,%xmm12,%xmm12 vmovups %xmm13,-32(%rsi) vpshufb %xmm0,%xmm13,%xmm13 vmovups %xmm14,-16(%rsi) vpshufb %xmm0,%xmm14,%xmm14 vmovdqu %xmm9,16(%rsp) vmovdqu 48(%rsp),%xmm6 vmovdqu 16-32(%r9),%xmm0 vpunpckhqdq %xmm6,%xmm6,%xmm2 vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5 vpxor %xmm6,%xmm2,%xmm2 vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 vmovdqu 64(%rsp),%xmm9 vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4 vmovdqu 48-32(%r9),%xmm3 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm9,%xmm9,%xmm5 vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6 vpxor %xmm9,%xmm5,%xmm5 vpxor %xmm7,%xmm6,%xmm6 vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 vmovdqu 80-32(%r9),%xmm15 vpxor %xmm1,%xmm2,%xmm2 vmovdqu 80(%rsp),%xmm1 vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7 vmovdqu 64-32(%r9),%xmm0 vpxor %xmm4,%xmm7,%xmm7 vpunpckhqdq %xmm1,%xmm1,%xmm4 vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpxor %xmm6,%xmm9,%xmm9 vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 96(%rsp),%xmm2 vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6 vmovdqu 96-32(%r9),%xmm3 vpxor %xmm7,%xmm6,%xmm6 vpunpckhqdq %xmm2,%xmm2,%xmm7 vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1 vpxor %xmm2,%xmm7,%xmm7 vpxor %xmm9,%xmm1,%xmm1 vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4 vmovdqu 128-32(%r9),%xmm15 vpxor %xmm5,%xmm4,%xmm4 vpxor 112(%rsp),%xmm8,%xmm8 vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5 vmovdqu 112-32(%r9),%xmm0 vpunpckhqdq %xmm8,%xmm8,%xmm9 vpxor %xmm6,%xmm5,%xmm5 vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2 vpxor %xmm8,%xmm9,%xmm9 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7 vpxor %xmm4,%xmm7,%xmm4 vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6 vmovdqu 0-32(%r9),%xmm3 vpunpckhqdq %xmm14,%xmm14,%xmm1 vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8 vpxor %xmm14,%xmm1,%xmm1 vpxor %xmm5,%xmm6,%xmm5 vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9 vmovdqu 32-32(%r9),%xmm15 vpxor %xmm2,%xmm8,%xmm7 vpxor %xmm4,%xmm9,%xmm6 vmovdqu 16-32(%r9),%xmm0 vpxor %xmm5,%xmm7,%xmm9 vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4 vpxor %xmm9,%xmm6,%xmm6 vpunpckhqdq %xmm13,%xmm13,%xmm2 vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14 vpxor %xmm13,%xmm2,%xmm2 vpslldq $8,%xmm6,%xmm9 vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 vpxor %xmm9,%xmm5,%xmm8 vpsrldq $8,%xmm6,%xmm6 vpxor %xmm6,%xmm7,%xmm7 vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5 vmovdqu 48-32(%r9),%xmm3 vpxor %xmm4,%xmm5,%xmm5 vpunpckhqdq %xmm12,%xmm12,%xmm9 vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13 vpxor %xmm12,%xmm9,%xmm9 vpxor %xmm14,%xmm13,%xmm13 vpalignr $8,%xmm8,%xmm8,%xmm14 vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 vmovdqu 80-32(%r9),%xmm15 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4 vmovdqu 64-32(%r9),%xmm0 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm11,%xmm11,%xmm1 vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12 vpxor %xmm11,%xmm1,%xmm1 vpxor %xmm13,%xmm12,%xmm12 vxorps 16(%rsp),%xmm7,%xmm7 vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9 vpxor %xmm2,%xmm9,%xmm9 vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 vxorps %xmm14,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5 vmovdqu 96-32(%r9),%xmm3 vpxor %xmm4,%xmm5,%xmm5 vpunpckhqdq %xmm10,%xmm10,%xmm2 vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11 vpxor %xmm10,%xmm2,%xmm2 vpalignr $8,%xmm8,%xmm8,%xmm14 vpxor %xmm12,%xmm11,%xmm11 vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1 vmovdqu 128-32(%r9),%xmm15 vpxor %xmm9,%xmm1,%xmm1 vxorps %xmm7,%xmm14,%xmm14 vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 vxorps %xmm14,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4 vmovdqu 112-32(%r9),%xmm0 vpxor %xmm5,%xmm4,%xmm4 vpunpckhqdq %xmm8,%xmm8,%xmm9 vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10 vpxor %xmm8,%xmm9,%xmm9 vpxor %xmm11,%xmm10,%xmm10 vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2 vpxor %xmm1,%xmm2,%xmm2 vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5 vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7 vpxor %xmm4,%xmm5,%xmm5 vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6 vpxor %xmm10,%xmm7,%xmm7 vpxor %xmm2,%xmm6,%xmm6 vpxor %xmm5,%xmm7,%xmm4 vpxor %xmm4,%xmm6,%xmm6 vpslldq $8,%xmm6,%xmm1 vmovdqu 16(%r11),%xmm3 vpsrldq $8,%xmm6,%xmm6 vpxor %xmm1,%xmm5,%xmm8 vpxor %xmm6,%xmm7,%xmm7 vpalignr $8,%xmm8,%xmm8,%xmm2 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 vpxor %xmm2,%xmm8,%xmm8 vpalignr $8,%xmm8,%xmm8,%xmm2 vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 vpxor %xmm7,%xmm2,%xmm2 vpxor %xmm2,%xmm8,%xmm8 vpshufb (%r11),%xmm8,%xmm8 vmovdqu %xmm8,-64(%r9) vzeroupper movq -48(%rax),%r15 movq -40(%rax),%r14 movq -32(%rax),%r13 movq -24(%rax),%r12 movq -16(%rax),%rbp movq -8(%rax),%rbx leaq (%rax),%rsp L$gcm_enc_abort: movq %r10,%rax .byte 0xf3,0xc3 .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 L$poly: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 L$one_msb: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 L$two_lsb: .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 L$one_lsb: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 #endif ring-0.16.9/pregenerated/aesni-gcm-x86_64-nasm.obj000064400000000000000000000332051353224260300176330ustar0000000000000000dEi]31+.text p`.pdata@0@.xdata ?@@@.debug$S@{.>@B.debug$T '1@BzoS Hzoyq)!Aqd$ fzoYʼnA)A!zADAQADM1M9b1oD$8AADb)A AADb!zoYIbyD9bI`xyyDb yDO4&B19D$yDoD$HB)M8nXB!M8fPBLl$(BLd$0zoiB xyyDB1yDB)yDB!yDoD$XBBzoI B xyyDB1yDB)M8nHyDB!M8f@yDoD$hBLl$8BLd$@zoQ@B xyyDB1yDB)M8n8yD9D$xB!M8f0yDBLl$HBLd$PzoYPB xy9DB19DB)M8n(9DB!M8f c9DBLl$XBLd$`B xyszo[B1AB)M8nB!M8fYYDLl$hBLd$pB B b1xyb)sb!bM8nbM8&b I B1B)B!BBB b1b)b!bbxy0b I@B1B)B!BBB b1b)b!bbxyPb I`pffffff.zoqzok0AIS@IzoY)b)!b!A)bA!őbb qB1|$cYB)YDB!GBo Bw0B @_Pzob1zoS b)Ll$xH`b!L$Hv`zoybbb I`HBxNAqxVyox^yoxfyoxnyoxvyoo|$(9D$9H|$Ht$HHHLLLD$(LL$0M1H`H$SUATAUAVAWH$X)()8D)HD)XD)hD)xD)`D)hD)pD)xwzoHĀAX LLqIǀAzoHzoHMI@ipb9M!I!M)IL)oPL7og@L@oo0HM1ow AoWYoQd$0Il$@it$PaT$`\$p&xNxVx^xfxnxvB9AzAw(((8D(HD(XD(hD(xD(`D(hD(pD(xLxLpLhL`HhHXH LH|$Ht$fffff.oazoS LmxyLaq́q))!!ʼn B1B)B!BBB Ax<$Md$Azo$B1'B)oB!w BaG0BW@B _PH`b1b)b!Bbb xxVx^ xf0xn@xvPHv`qzok0AIS@I)b)!b!)b!őbb q @H|$Ht$HHHLLLD$(LL$0M1H H$SUATAUAVAWH$X)()8D)HD)XD)hD)xD)`D)hD)pD)xwzoHĀAX L^LqIǀHzoH䀋ipM!I!M)IL)L6L@Hb1)zD$p!T$`d$Pl$@ t$0LAzoMI@H Ib9o|$ zozoYmAzo9xNb1xVb)x^b!xfbxnbxvb zL$ot$0zoAmADADqDzoL$@IDzoY1mIDQiDAzoy0oL$P1DzoA mc1D1QDoT$`qDzoY@mqDqYDAzoy`9D$piDzoAPA9miDA1AD9DzoY mc9DqC1DAzo9ŹűzoAA DImc DiűsqDAQsDzoYAmcDA1AC9iDAzoy0DzoA !mcDqAW|$C1D1C9DCA8W!DzoY@)mc!DiC9A!qDAzoy`qWC9DCA8W)DzoAPA9mc)DA1A)iD9D9D1DAszo[sQ9c9D99c9D9B9AzAw(((8D(HD(XD(hD(xD(`D(hD(pD(xLxLpLhL`HhHXH LH|$Ht$f. AES-NI GCM module for x86_64, CRYPTOGAMS by ffffff.ffffff.ffffff.VWSUATAUAVAWH@I@xIIqMY8ENL9uIESNL9]I@xLxLpLhL`HhHXMMMMIIH(IHHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^ # $   4P:\ring\pregenerated\tmp\aesni-gcm-x86_64-nasm.asmi} M{ chy #',27@FL R!V"[#`&e'k(p)u*{<~=?@ABCDEFGHIJKLMNOPQRSUVWXYZ [\]^ _%`*a/b4c:d?fDgHhNiSjWk]lbmfnloqpwq}rstuvxyz{|}~ !&,06<AGMRW\aekpuy #(-16;@EJOSX\bglqvy  %*06:@D I M R W [`einsx} !"#$%&')*+,-./0123 45678 9$;(<,=2?7@<AABECJDNESFWG\H`IeJiKoLtOzP~RYZ[]^_`abfjkmoqsuwy{|}~ #*/38?CFKNQTZagjorw $,49>CHLPTX\`cfkpr       !&+05:?DINSW\ a!f"k#p$u%y&~'()*+-.0123456789:;<=>?@ABCI K L M O P Q R S T# X& ]- ^3 `7 b8 d9 f; h= j? lA nI oP pW q_ rg so tw u| v w x z | } ~                           $ ) / 4 9 = A H M R X ] c g l q v z                                $ ( , 2 6 : @ D J P V Z ^ d h m s y }                                " ( . 2 7 = B G M S Y ] c !i "m #r $x %} & ' ( ) + , . / 0 1 2 3 4 5 6 7 8 : ; < > ? @ A B C D E F H I% J) K/ L4 M8 O< P@ QE RK SP TT UX W^ Xd Yh [n \t ]x ^| _ ` b c d e f g h i j k l m o q s u w y | } ~   0@P`p  $(/6=DKRY`eimqx5P:\ring\pregenerated\aesni-gcm-x86_64-nasm.objyasm 1.3.0_aesni_ctr32_ghash_6xL$oop6xL$handle_ctr32L$resume_ctr32L$enc_tailL$6x_doneGFp_aesni_gcm_decrypt+L$SEH_begin_GFp_aesni_gcm_decryptL$gcm_dec_abortL$gcm_dec_bodyL$bswap_maskL$dec_no_key_aliasing)L$SEH_end_GFp_aesni_gcm_decrypt_aesni_ctr32_6xL$handle_ctr32_2L$oop_ctr32GFp_aesni_gcm_encrypt+L$SEH_begin_GFp_aesni_gcm_encryptL$gcm_enc_abortL$gcm_enc_bodyL$enc_no_key_aliasing)L$SEH_end_GFp_aesni_gcm_encryptL$polyL$one_msbL$two_lsbL$one_lsbgcm_se_handlerL$common_seh_tail  L$SEH_gcm_dec_info#  L$SEH_GFp_gcm_enc_infoh l       * . D H Z ^ o s           + / V Z q u           ' + H L s w           # # $ $$ .fileg.text/L$oop6x@E T`cntxcjr"3? U w    L$poly 0@i.pdata"5.xdata .debug$S@>.debug$T Lpregenerated\tmp\aesni-gcm-x86_64-nasm.asm_aesni_ctr32_ghash_6xL$handle_ctr32L$resume_ctr32L$enc_tailL$6x_doneGFp_aesni_gcm_decryptL$SEH_begin_GFp_aesni_gcm_decryptL$gcm_dec_abortL$gcm_dec_bodyL$bswap_maskL$dec_no_key_aliasingL$SEH_end_GFp_aesni_gcm_decrypt_aesni_ctr32_6xL$handle_ctr32_2L$oop_ctr32GFp_aesni_gcm_encryptL$SEH_begin_GFp_aesni_gcm_encryptL$gcm_enc_abortL$gcm_enc_bodyL$enc_no_key_aliasingL$SEH_end_GFp_aesni_gcm_encryptL$one_msbL$two_lsbL$one_lsb__imp_RtlVirtualUnwindgcm_se_handlerL$common_seh_tailL$SEH_gcm_dec_infoL$SEH_GFp_gcm_enc_inforing-0.16.9/pregenerated/aesni-x86-elf.S000064400000000000000000000344111353224261000160140ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl GFp_aes_hw_encrypt .hidden GFp_aes_hw_encrypt .type GFp_aes_hw_encrypt,@function .align 16 GFp_aes_hw_encrypt: .L_GFp_aes_hw_encrypt_begin: movl 4(%esp),%eax movl 12(%esp),%edx movups (%eax),%xmm2 movl 240(%edx),%ecx movl 8(%esp),%eax movups (%edx),%xmm0 movups 16(%edx),%xmm1 leal 32(%edx),%edx xorps %xmm0,%xmm2 .L000enc1_loop_1: .byte 102,15,56,220,209 decl %ecx movups (%edx),%xmm1 leal 16(%edx),%edx jnz .L000enc1_loop_1 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movups %xmm2,(%eax) pxor %xmm2,%xmm2 ret .size GFp_aes_hw_encrypt,.-.L_GFp_aes_hw_encrypt_begin .hidden _aesni_encrypt2 .type _aesni_encrypt2,@function .align 16 _aesni_encrypt2: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx addl $16,%ecx .L001enc2_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 movups -16(%edx,%ecx,1),%xmm0 jnz .L001enc2_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,221,208 .byte 102,15,56,221,216 ret .size _aesni_encrypt2,.-_aesni_encrypt2 .hidden _aesni_encrypt3 .type _aesni_encrypt3,@function .align 16 _aesni_encrypt3: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx addl $16,%ecx .L002enc3_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 movups -16(%edx,%ecx,1),%xmm0 jnz .L002enc3_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 ret .size _aesni_encrypt3,.-_aesni_encrypt3 .hidden _aesni_encrypt4 .type _aesni_encrypt4,@function .align 16 _aesni_encrypt4: movups (%edx),%xmm0 movups 16(%edx),%xmm1 shll $4,%ecx xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx .byte 15,31,64,0 addl $16,%ecx .L003enc4_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movups -16(%edx,%ecx,1),%xmm0 jnz .L003enc4_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 ret .size _aesni_encrypt4,.-_aesni_encrypt4 .hidden _aesni_encrypt6 .type _aesni_encrypt6,@function .align 16 _aesni_encrypt6: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 .byte 102,15,56,220,209 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 .byte 102,15,56,220,217 leal 32(%edx,%ecx,1),%edx negl %ecx .byte 102,15,56,220,225 pxor %xmm0,%xmm7 movups (%edx,%ecx,1),%xmm0 addl $16,%ecx jmp .L004_aesni_encrypt6_inner .align 16 .L005enc6_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .L004_aesni_encrypt6_inner: .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .L_aesni_encrypt6_enter: movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%edx,%ecx,1),%xmm0 jnz .L005enc6_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 ret .size _aesni_encrypt6,.-_aesni_encrypt6 .globl GFp_aes_hw_ctr32_encrypt_blocks .hidden GFp_aes_hw_ctr32_encrypt_blocks .type GFp_aes_hw_ctr32_encrypt_blocks,@function .align 16 GFp_aes_hw_ctr32_encrypt_blocks: .L_GFp_aes_hw_ctr32_encrypt_blocks_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi movl 24(%esp),%edi movl 28(%esp),%eax movl 32(%esp),%edx movl 36(%esp),%ebx movl %esp,%ebp subl $88,%esp andl $-16,%esp movl %ebp,80(%esp) cmpl $1,%eax je .L006ctr32_one_shortcut movdqu (%ebx),%xmm7 movl $202182159,(%esp) movl $134810123,4(%esp) movl $67438087,8(%esp) movl $66051,12(%esp) movl $6,%ecx xorl %ebp,%ebp movl %ecx,16(%esp) movl %ecx,20(%esp) movl %ecx,24(%esp) movl %ebp,28(%esp) .byte 102,15,58,22,251,3 .byte 102,15,58,34,253,3 movl 240(%edx),%ecx bswap %ebx pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movdqa (%esp),%xmm2 .byte 102,15,58,34,195,0 leal 3(%ebx),%ebp .byte 102,15,58,34,205,0 incl %ebx .byte 102,15,58,34,195,1 incl %ebp .byte 102,15,58,34,205,1 incl %ebx .byte 102,15,58,34,195,2 incl %ebp .byte 102,15,58,34,205,2 movdqa %xmm0,48(%esp) .byte 102,15,56,0,194 movdqu (%edx),%xmm6 movdqa %xmm1,64(%esp) .byte 102,15,56,0,202 pshufd $192,%xmm0,%xmm2 pshufd $128,%xmm0,%xmm3 cmpl $6,%eax jb .L007ctr32_tail pxor %xmm6,%xmm7 shll $4,%ecx movl $16,%ebx movdqa %xmm7,32(%esp) movl %edx,%ebp subl %ecx,%ebx leal 32(%edx,%ecx,1),%edx subl $6,%eax jmp .L008ctr32_loop6 .align 16 .L008ctr32_loop6: pshufd $64,%xmm0,%xmm4 movdqa 32(%esp),%xmm0 pshufd $192,%xmm1,%xmm5 pxor %xmm0,%xmm2 pshufd $128,%xmm1,%xmm6 pxor %xmm0,%xmm3 pshufd $64,%xmm1,%xmm7 movups 16(%ebp),%xmm1 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 .byte 102,15,56,220,209 pxor %xmm0,%xmm6 pxor %xmm0,%xmm7 .byte 102,15,56,220,217 movups 32(%ebp),%xmm0 movl %ebx,%ecx .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 call .L_aesni_encrypt6_enter movups (%esi),%xmm1 movups 16(%esi),%xmm0 xorps %xmm1,%xmm2 movups 32(%esi),%xmm1 xorps %xmm0,%xmm3 movups %xmm2,(%edi) movdqa 16(%esp),%xmm0 xorps %xmm1,%xmm4 movdqa 64(%esp),%xmm1 movups %xmm3,16(%edi) movups %xmm4,32(%edi) paddd %xmm0,%xmm1 paddd 48(%esp),%xmm0 movdqa (%esp),%xmm2 movups 48(%esi),%xmm3 movups 64(%esi),%xmm4 xorps %xmm3,%xmm5 movups 80(%esi),%xmm3 leal 96(%esi),%esi movdqa %xmm0,48(%esp) .byte 102,15,56,0,194 xorps %xmm4,%xmm6 movups %xmm5,48(%edi) xorps %xmm3,%xmm7 movdqa %xmm1,64(%esp) .byte 102,15,56,0,202 movups %xmm6,64(%edi) pshufd $192,%xmm0,%xmm2 movups %xmm7,80(%edi) leal 96(%edi),%edi pshufd $128,%xmm0,%xmm3 subl $6,%eax jnc .L008ctr32_loop6 addl $6,%eax jz .L009ctr32_ret movdqu (%ebp),%xmm7 movl %ebp,%edx pxor 32(%esp),%xmm7 movl 240(%ebp),%ecx .L007ctr32_tail: por %xmm7,%xmm2 cmpl $2,%eax jb .L010ctr32_one pshufd $64,%xmm0,%xmm4 por %xmm7,%xmm3 je .L011ctr32_two pshufd $192,%xmm1,%xmm5 por %xmm7,%xmm4 cmpl $4,%eax jb .L012ctr32_three pshufd $128,%xmm1,%xmm6 por %xmm7,%xmm5 je .L013ctr32_four por %xmm7,%xmm6 call _aesni_encrypt6 movups (%esi),%xmm1 movups 16(%esi),%xmm0 xorps %xmm1,%xmm2 movups 32(%esi),%xmm1 xorps %xmm0,%xmm3 movups 48(%esi),%xmm0 xorps %xmm1,%xmm4 movups 64(%esi),%xmm1 xorps %xmm0,%xmm5 movups %xmm2,(%edi) xorps %xmm1,%xmm6 movups %xmm3,16(%edi) movups %xmm4,32(%edi) movups %xmm5,48(%edi) movups %xmm6,64(%edi) jmp .L009ctr32_ret .align 16 .L006ctr32_one_shortcut: movups (%ebx),%xmm2 movl 240(%edx),%ecx .L010ctr32_one: movups (%edx),%xmm0 movups 16(%edx),%xmm1 leal 32(%edx),%edx xorps %xmm0,%xmm2 .L014enc1_loop_2: .byte 102,15,56,220,209 decl %ecx movups (%edx),%xmm1 leal 16(%edx),%edx jnz .L014enc1_loop_2 .byte 102,15,56,221,209 movups (%esi),%xmm6 xorps %xmm2,%xmm6 movups %xmm6,(%edi) jmp .L009ctr32_ret .align 16 .L011ctr32_two: call _aesni_encrypt2 movups (%esi),%xmm5 movups 16(%esi),%xmm6 xorps %xmm5,%xmm2 xorps %xmm6,%xmm3 movups %xmm2,(%edi) movups %xmm3,16(%edi) jmp .L009ctr32_ret .align 16 .L012ctr32_three: call _aesni_encrypt3 movups (%esi),%xmm5 movups 16(%esi),%xmm6 xorps %xmm5,%xmm2 movups 32(%esi),%xmm7 xorps %xmm6,%xmm3 movups %xmm2,(%edi) xorps %xmm7,%xmm4 movups %xmm3,16(%edi) movups %xmm4,32(%edi) jmp .L009ctr32_ret .align 16 .L013ctr32_four: call _aesni_encrypt4 movups (%esi),%xmm6 movups 16(%esi),%xmm7 movups 32(%esi),%xmm1 xorps %xmm6,%xmm2 movups 48(%esi),%xmm0 xorps %xmm7,%xmm3 movups %xmm2,(%edi) xorps %xmm1,%xmm4 movups %xmm3,16(%edi) xorps %xmm0,%xmm5 movups %xmm4,32(%edi) movups %xmm5,48(%edi) .L009ctr32_ret: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 movdqa %xmm0,32(%esp) pxor %xmm5,%xmm5 movdqa %xmm0,48(%esp) pxor %xmm6,%xmm6 movdqa %xmm0,64(%esp) pxor %xmm7,%xmm7 movl 80(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_aes_hw_ctr32_encrypt_blocks,.-.L_GFp_aes_hw_ctr32_encrypt_blocks_begin .hidden _aesni_set_encrypt_key .type _aesni_set_encrypt_key,@function .align 16 _aesni_set_encrypt_key: pushl %ebp pushl %ebx testl %eax,%eax jz .L015bad_pointer testl %edx,%edx jz .L015bad_pointer call .L016pic .L016pic: popl %ebx leal .Lkey_const-.L016pic(%ebx),%ebx leal GFp_ia32cap_P-.Lkey_const(%ebx),%ebp movups (%eax),%xmm0 xorps %xmm4,%xmm4 movl 4(%ebp),%ebp leal 16(%edx),%edx andl $268437504,%ebp cmpl $256,%ecx je .L01714rounds cmpl $128,%ecx jne .L018bad_keybits .align 16 .L01910rounds: cmpl $268435456,%ebp je .L02010rounds_alt movl $9,%ecx movups %xmm0,-16(%edx) .byte 102,15,58,223,200,1 call .L021key_128_cold .byte 102,15,58,223,200,2 call .L022key_128 .byte 102,15,58,223,200,4 call .L022key_128 .byte 102,15,58,223,200,8 call .L022key_128 .byte 102,15,58,223,200,16 call .L022key_128 .byte 102,15,58,223,200,32 call .L022key_128 .byte 102,15,58,223,200,64 call .L022key_128 .byte 102,15,58,223,200,128 call .L022key_128 .byte 102,15,58,223,200,27 call .L022key_128 .byte 102,15,58,223,200,54 call .L022key_128 movups %xmm0,(%edx) movl %ecx,80(%edx) jmp .L023good_key .align 16 .L022key_128: movups %xmm0,(%edx) leal 16(%edx),%edx .L021key_128_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 ret .align 16 .L02010rounds_alt: movdqa (%ebx),%xmm5 movl $8,%ecx movdqa 32(%ebx),%xmm4 movdqa %xmm0,%xmm2 movdqu %xmm0,-16(%edx) .L024loop_key128: .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 leal 16(%edx),%edx movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,-16(%edx) movdqa %xmm0,%xmm2 decl %ecx jnz .L024loop_key128 movdqa 48(%ebx),%xmm4 .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,(%edx) movdqa %xmm0,%xmm2 .byte 102,15,56,0,197 .byte 102,15,56,221,196 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,16(%edx) movl $9,%ecx movl %ecx,96(%edx) jmp .L023good_key .align 16 .L01714rounds: movups 16(%eax),%xmm2 leal 16(%edx),%edx cmpl $268435456,%ebp je .L02514rounds_alt movl $13,%ecx movups %xmm0,-32(%edx) movups %xmm2,-16(%edx) .byte 102,15,58,223,202,1 call .L026key_256a_cold .byte 102,15,58,223,200,1 call .L027key_256b .byte 102,15,58,223,202,2 call .L028key_256a .byte 102,15,58,223,200,2 call .L027key_256b .byte 102,15,58,223,202,4 call .L028key_256a .byte 102,15,58,223,200,4 call .L027key_256b .byte 102,15,58,223,202,8 call .L028key_256a .byte 102,15,58,223,200,8 call .L027key_256b .byte 102,15,58,223,202,16 call .L028key_256a .byte 102,15,58,223,200,16 call .L027key_256b .byte 102,15,58,223,202,32 call .L028key_256a .byte 102,15,58,223,200,32 call .L027key_256b .byte 102,15,58,223,202,64 call .L028key_256a movups %xmm0,(%edx) movl %ecx,16(%edx) xorl %eax,%eax jmp .L023good_key .align 16 .L028key_256a: movups %xmm2,(%edx) leal 16(%edx),%edx .L026key_256a_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 ret .align 16 .L027key_256b: movups %xmm0,(%edx) leal 16(%edx),%edx shufps $16,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $140,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 ret .align 16 .L02514rounds_alt: movdqa (%ebx),%xmm5 movdqa 32(%ebx),%xmm4 movl $7,%ecx movdqu %xmm0,-32(%edx) movdqa %xmm2,%xmm1 movdqu %xmm2,-16(%edx) .L029loop_key256: .byte 102,15,56,0,213 .byte 102,15,56,221,212 movdqa %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm3,%xmm0 pslld $1,%xmm4 pxor %xmm2,%xmm0 movdqu %xmm0,(%edx) decl %ecx jz .L030done_key256 pshufd $255,%xmm0,%xmm2 pxor %xmm3,%xmm3 .byte 102,15,56,221,211 movdqa %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm3,%xmm1 pxor %xmm1,%xmm2 movdqu %xmm2,16(%edx) leal 32(%edx),%edx movdqa %xmm2,%xmm1 jmp .L029loop_key256 .L030done_key256: movl $13,%ecx movl %ecx,16(%edx) .L023good_key: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 xorl %eax,%eax popl %ebx popl %ebp ret .align 4 .L015bad_pointer: movl $-1,%eax popl %ebx popl %ebp ret .align 4 .L018bad_keybits: pxor %xmm0,%xmm0 movl $-2,%eax popl %ebx popl %ebp ret .size _aesni_set_encrypt_key,.-_aesni_set_encrypt_key .globl GFp_aes_hw_set_encrypt_key .hidden GFp_aes_hw_set_encrypt_key .type GFp_aes_hw_set_encrypt_key,@function .align 16 GFp_aes_hw_set_encrypt_key: .L_GFp_aes_hw_set_encrypt_key_begin: movl 4(%esp),%eax movl 8(%esp),%ecx movl 12(%esp),%edx call _aesni_set_encrypt_key ret .size GFp_aes_hw_set_encrypt_key,.-.L_GFp_aes_hw_set_encrypt_key_begin .align 64 .Lkey_const: .long 202313229,202313229,202313229,202313229 .long 67569157,67569157,67569157,67569157 .long 1,1,1,1 .long 27,27,27,27 .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 .byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 .byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 .byte 115,108,46,111,114,103,62,0 #endif ring-0.16.9/pregenerated/aesni-x86-macosx.S000064400000000000000000000333741353224260700165550ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl _GFp_aes_hw_encrypt .private_extern _GFp_aes_hw_encrypt .align 4 _GFp_aes_hw_encrypt: L_GFp_aes_hw_encrypt_begin: movl 4(%esp),%eax movl 12(%esp),%edx movups (%eax),%xmm2 movl 240(%edx),%ecx movl 8(%esp),%eax movups (%edx),%xmm0 movups 16(%edx),%xmm1 leal 32(%edx),%edx xorps %xmm0,%xmm2 L000enc1_loop_1: .byte 102,15,56,220,209 decl %ecx movups (%edx),%xmm1 leal 16(%edx),%edx jnz L000enc1_loop_1 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movups %xmm2,(%eax) pxor %xmm2,%xmm2 ret .private_extern __aesni_encrypt2 .align 4 __aesni_encrypt2: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx addl $16,%ecx L001enc2_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 movups -16(%edx,%ecx,1),%xmm0 jnz L001enc2_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,221,208 .byte 102,15,56,221,216 ret .private_extern __aesni_encrypt3 .align 4 __aesni_encrypt3: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx addl $16,%ecx L002enc3_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 movups -16(%edx,%ecx,1),%xmm0 jnz L002enc3_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 ret .private_extern __aesni_encrypt4 .align 4 __aesni_encrypt4: movups (%edx),%xmm0 movups 16(%edx),%xmm1 shll $4,%ecx xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 movups 32(%edx),%xmm0 leal 32(%edx,%ecx,1),%edx negl %ecx .byte 15,31,64,0 addl $16,%ecx L003enc4_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movups -16(%edx,%ecx,1),%xmm0 jnz L003enc4_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 ret .private_extern __aesni_encrypt6 .align 4 __aesni_encrypt6: movups (%edx),%xmm0 shll $4,%ecx movups 16(%edx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 .byte 102,15,56,220,209 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 .byte 102,15,56,220,217 leal 32(%edx,%ecx,1),%edx negl %ecx .byte 102,15,56,220,225 pxor %xmm0,%xmm7 movups (%edx,%ecx,1),%xmm0 addl $16,%ecx jmp L004_aesni_encrypt6_inner .align 4,0x90 L005enc6_loop: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 L004_aesni_encrypt6_inner: .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 L_aesni_encrypt6_enter: movups (%edx,%ecx,1),%xmm1 addl $32,%ecx .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%edx,%ecx,1),%xmm0 jnz L005enc6_loop .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 ret .globl _GFp_aes_hw_ctr32_encrypt_blocks .private_extern _GFp_aes_hw_ctr32_encrypt_blocks .align 4 _GFp_aes_hw_ctr32_encrypt_blocks: L_GFp_aes_hw_ctr32_encrypt_blocks_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi movl 24(%esp),%edi movl 28(%esp),%eax movl 32(%esp),%edx movl 36(%esp),%ebx movl %esp,%ebp subl $88,%esp andl $-16,%esp movl %ebp,80(%esp) cmpl $1,%eax je L006ctr32_one_shortcut movdqu (%ebx),%xmm7 movl $202182159,(%esp) movl $134810123,4(%esp) movl $67438087,8(%esp) movl $66051,12(%esp) movl $6,%ecx xorl %ebp,%ebp movl %ecx,16(%esp) movl %ecx,20(%esp) movl %ecx,24(%esp) movl %ebp,28(%esp) .byte 102,15,58,22,251,3 .byte 102,15,58,34,253,3 movl 240(%edx),%ecx bswap %ebx pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movdqa (%esp),%xmm2 .byte 102,15,58,34,195,0 leal 3(%ebx),%ebp .byte 102,15,58,34,205,0 incl %ebx .byte 102,15,58,34,195,1 incl %ebp .byte 102,15,58,34,205,1 incl %ebx .byte 102,15,58,34,195,2 incl %ebp .byte 102,15,58,34,205,2 movdqa %xmm0,48(%esp) .byte 102,15,56,0,194 movdqu (%edx),%xmm6 movdqa %xmm1,64(%esp) .byte 102,15,56,0,202 pshufd $192,%xmm0,%xmm2 pshufd $128,%xmm0,%xmm3 cmpl $6,%eax jb L007ctr32_tail pxor %xmm6,%xmm7 shll $4,%ecx movl $16,%ebx movdqa %xmm7,32(%esp) movl %edx,%ebp subl %ecx,%ebx leal 32(%edx,%ecx,1),%edx subl $6,%eax jmp L008ctr32_loop6 .align 4,0x90 L008ctr32_loop6: pshufd $64,%xmm0,%xmm4 movdqa 32(%esp),%xmm0 pshufd $192,%xmm1,%xmm5 pxor %xmm0,%xmm2 pshufd $128,%xmm1,%xmm6 pxor %xmm0,%xmm3 pshufd $64,%xmm1,%xmm7 movups 16(%ebp),%xmm1 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 .byte 102,15,56,220,209 pxor %xmm0,%xmm6 pxor %xmm0,%xmm7 .byte 102,15,56,220,217 movups 32(%ebp),%xmm0 movl %ebx,%ecx .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 call L_aesni_encrypt6_enter movups (%esi),%xmm1 movups 16(%esi),%xmm0 xorps %xmm1,%xmm2 movups 32(%esi),%xmm1 xorps %xmm0,%xmm3 movups %xmm2,(%edi) movdqa 16(%esp),%xmm0 xorps %xmm1,%xmm4 movdqa 64(%esp),%xmm1 movups %xmm3,16(%edi) movups %xmm4,32(%edi) paddd %xmm0,%xmm1 paddd 48(%esp),%xmm0 movdqa (%esp),%xmm2 movups 48(%esi),%xmm3 movups 64(%esi),%xmm4 xorps %xmm3,%xmm5 movups 80(%esi),%xmm3 leal 96(%esi),%esi movdqa %xmm0,48(%esp) .byte 102,15,56,0,194 xorps %xmm4,%xmm6 movups %xmm5,48(%edi) xorps %xmm3,%xmm7 movdqa %xmm1,64(%esp) .byte 102,15,56,0,202 movups %xmm6,64(%edi) pshufd $192,%xmm0,%xmm2 movups %xmm7,80(%edi) leal 96(%edi),%edi pshufd $128,%xmm0,%xmm3 subl $6,%eax jnc L008ctr32_loop6 addl $6,%eax jz L009ctr32_ret movdqu (%ebp),%xmm7 movl %ebp,%edx pxor 32(%esp),%xmm7 movl 240(%ebp),%ecx L007ctr32_tail: por %xmm7,%xmm2 cmpl $2,%eax jb L010ctr32_one pshufd $64,%xmm0,%xmm4 por %xmm7,%xmm3 je L011ctr32_two pshufd $192,%xmm1,%xmm5 por %xmm7,%xmm4 cmpl $4,%eax jb L012ctr32_three pshufd $128,%xmm1,%xmm6 por %xmm7,%xmm5 je L013ctr32_four por %xmm7,%xmm6 call __aesni_encrypt6 movups (%esi),%xmm1 movups 16(%esi),%xmm0 xorps %xmm1,%xmm2 movups 32(%esi),%xmm1 xorps %xmm0,%xmm3 movups 48(%esi),%xmm0 xorps %xmm1,%xmm4 movups 64(%esi),%xmm1 xorps %xmm0,%xmm5 movups %xmm2,(%edi) xorps %xmm1,%xmm6 movups %xmm3,16(%edi) movups %xmm4,32(%edi) movups %xmm5,48(%edi) movups %xmm6,64(%edi) jmp L009ctr32_ret .align 4,0x90 L006ctr32_one_shortcut: movups (%ebx),%xmm2 movl 240(%edx),%ecx L010ctr32_one: movups (%edx),%xmm0 movups 16(%edx),%xmm1 leal 32(%edx),%edx xorps %xmm0,%xmm2 L014enc1_loop_2: .byte 102,15,56,220,209 decl %ecx movups (%edx),%xmm1 leal 16(%edx),%edx jnz L014enc1_loop_2 .byte 102,15,56,221,209 movups (%esi),%xmm6 xorps %xmm2,%xmm6 movups %xmm6,(%edi) jmp L009ctr32_ret .align 4,0x90 L011ctr32_two: call __aesni_encrypt2 movups (%esi),%xmm5 movups 16(%esi),%xmm6 xorps %xmm5,%xmm2 xorps %xmm6,%xmm3 movups %xmm2,(%edi) movups %xmm3,16(%edi) jmp L009ctr32_ret .align 4,0x90 L012ctr32_three: call __aesni_encrypt3 movups (%esi),%xmm5 movups 16(%esi),%xmm6 xorps %xmm5,%xmm2 movups 32(%esi),%xmm7 xorps %xmm6,%xmm3 movups %xmm2,(%edi) xorps %xmm7,%xmm4 movups %xmm3,16(%edi) movups %xmm4,32(%edi) jmp L009ctr32_ret .align 4,0x90 L013ctr32_four: call __aesni_encrypt4 movups (%esi),%xmm6 movups 16(%esi),%xmm7 movups 32(%esi),%xmm1 xorps %xmm6,%xmm2 movups 48(%esi),%xmm0 xorps %xmm7,%xmm3 movups %xmm2,(%edi) xorps %xmm1,%xmm4 movups %xmm3,16(%edi) xorps %xmm0,%xmm5 movups %xmm4,32(%edi) movups %xmm5,48(%edi) L009ctr32_ret: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 movdqa %xmm0,32(%esp) pxor %xmm5,%xmm5 movdqa %xmm0,48(%esp) pxor %xmm6,%xmm6 movdqa %xmm0,64(%esp) pxor %xmm7,%xmm7 movl 80(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __aesni_set_encrypt_key .align 4 __aesni_set_encrypt_key: pushl %ebp pushl %ebx testl %eax,%eax jz L015bad_pointer testl %edx,%edx jz L015bad_pointer call L016pic L016pic: popl %ebx leal Lkey_const-L016pic(%ebx),%ebx movl L_GFp_ia32cap_P$non_lazy_ptr-Lkey_const(%ebx),%ebp movups (%eax),%xmm0 xorps %xmm4,%xmm4 movl 4(%ebp),%ebp leal 16(%edx),%edx andl $268437504,%ebp cmpl $256,%ecx je L01714rounds cmpl $128,%ecx jne L018bad_keybits .align 4,0x90 L01910rounds: cmpl $268435456,%ebp je L02010rounds_alt movl $9,%ecx movups %xmm0,-16(%edx) .byte 102,15,58,223,200,1 call L021key_128_cold .byte 102,15,58,223,200,2 call L022key_128 .byte 102,15,58,223,200,4 call L022key_128 .byte 102,15,58,223,200,8 call L022key_128 .byte 102,15,58,223,200,16 call L022key_128 .byte 102,15,58,223,200,32 call L022key_128 .byte 102,15,58,223,200,64 call L022key_128 .byte 102,15,58,223,200,128 call L022key_128 .byte 102,15,58,223,200,27 call L022key_128 .byte 102,15,58,223,200,54 call L022key_128 movups %xmm0,(%edx) movl %ecx,80(%edx) jmp L023good_key .align 4,0x90 L022key_128: movups %xmm0,(%edx) leal 16(%edx),%edx L021key_128_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 ret .align 4,0x90 L02010rounds_alt: movdqa (%ebx),%xmm5 movl $8,%ecx movdqa 32(%ebx),%xmm4 movdqa %xmm0,%xmm2 movdqu %xmm0,-16(%edx) L024loop_key128: .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 leal 16(%edx),%edx movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,-16(%edx) movdqa %xmm0,%xmm2 decl %ecx jnz L024loop_key128 movdqa 48(%ebx),%xmm4 .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,(%edx) movdqa %xmm0,%xmm2 .byte 102,15,56,0,197 .byte 102,15,56,221,196 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,16(%edx) movl $9,%ecx movl %ecx,96(%edx) jmp L023good_key .align 4,0x90 L01714rounds: movups 16(%eax),%xmm2 leal 16(%edx),%edx cmpl $268435456,%ebp je L02514rounds_alt movl $13,%ecx movups %xmm0,-32(%edx) movups %xmm2,-16(%edx) .byte 102,15,58,223,202,1 call L026key_256a_cold .byte 102,15,58,223,200,1 call L027key_256b .byte 102,15,58,223,202,2 call L028key_256a .byte 102,15,58,223,200,2 call L027key_256b .byte 102,15,58,223,202,4 call L028key_256a .byte 102,15,58,223,200,4 call L027key_256b .byte 102,15,58,223,202,8 call L028key_256a .byte 102,15,58,223,200,8 call L027key_256b .byte 102,15,58,223,202,16 call L028key_256a .byte 102,15,58,223,200,16 call L027key_256b .byte 102,15,58,223,202,32 call L028key_256a .byte 102,15,58,223,200,32 call L027key_256b .byte 102,15,58,223,202,64 call L028key_256a movups %xmm0,(%edx) movl %ecx,16(%edx) xorl %eax,%eax jmp L023good_key .align 4,0x90 L028key_256a: movups %xmm2,(%edx) leal 16(%edx),%edx L026key_256a_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 ret .align 4,0x90 L027key_256b: movups %xmm0,(%edx) leal 16(%edx),%edx shufps $16,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $140,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 ret .align 4,0x90 L02514rounds_alt: movdqa (%ebx),%xmm5 movdqa 32(%ebx),%xmm4 movl $7,%ecx movdqu %xmm0,-32(%edx) movdqa %xmm2,%xmm1 movdqu %xmm2,-16(%edx) L029loop_key256: .byte 102,15,56,0,213 .byte 102,15,56,221,212 movdqa %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm3,%xmm0 pslld $1,%xmm4 pxor %xmm2,%xmm0 movdqu %xmm0,(%edx) decl %ecx jz L030done_key256 pshufd $255,%xmm0,%xmm2 pxor %xmm3,%xmm3 .byte 102,15,56,221,211 movdqa %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm3,%xmm1 pxor %xmm1,%xmm2 movdqu %xmm2,16(%edx) leal 32(%edx),%edx movdqa %xmm2,%xmm1 jmp L029loop_key256 L030done_key256: movl $13,%ecx movl %ecx,16(%edx) L023good_key: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 xorl %eax,%eax popl %ebx popl %ebp ret .align 2,0x90 L015bad_pointer: movl $-1,%eax popl %ebx popl %ebp ret .align 2,0x90 L018bad_keybits: pxor %xmm0,%xmm0 movl $-2,%eax popl %ebx popl %ebp ret .globl _GFp_aes_hw_set_encrypt_key .private_extern _GFp_aes_hw_set_encrypt_key .align 4 _GFp_aes_hw_set_encrypt_key: L_GFp_aes_hw_set_encrypt_key_begin: movl 4(%esp),%eax movl 8(%esp),%ecx movl 12(%esp),%edx call __aesni_set_encrypt_key ret .align 6,0x90 Lkey_const: .long 202313229,202313229,202313229,202313229 .long 67569157,67569157,67569157,67569157 .long 1,1,1,1 .long 27,27,27,27 .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 .byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 .byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 .byte 115,108,46,111,114,103,62,0 .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/aesni-x86-win32n.obj000064400000000000000000000276021353224260700167500ustar0000000000000000LEi].(8.text l  p`.bss 0.debug$S(v $Z@B.debug$T "(@BD$T$ D$JR Wf8I Rf8fffÍ&JWfB T كf8f8 f8f8D f8f8f8f8Í&JWffB T كf8f8f8 f8f8f8D f8f8f8f8f8f8 JWfffB T @f8f8f8f8 f8f8f8f8D f8f8f8f8f8f8f8f8ÍvJWfff8fff8ٍT f8f  f8f8f8f8f8f8 f8f8f8f8f8f8D f8f8f8f8f8f8f8f8f8f8f8f8Ðt&USVWt$|$D$T$ \$$Xl$Pso;$ D$ D$D$ 1L$L$L$l$f:f:"fffo$f:"kf:"Cf:"Ef:"Cf:"Ef:"fD$0f8o2fL$@f8fpfp؀5ff|$ )ˍT  fp@foD$ fpffpffp@Mfff8fff8E f8f8f8f8FWN WfoD$WfoL$@_g ffD$0fo$^0f@W^Pv`fD$0f8Wo0WfL$@f8w@fpP`fp؀]o}f|$ f׃fp@ffpffpffFWN WF0WN@WW_g o0w@ JR Wf8I Rf86W7t&.vWW_af .vW~ WW_g 6&[6~N WF0WW_Wg o0ffffffD$ ffD$0ffD$@fd$P_^[]ÍUS[-WmRZf Bf:vf:ef:Zf:Of:Df: 9f:@.f:Ȁ#f:f:6 JPfRWWWÍt&fo+foc foBf8f8frRfofsffsffsffBfoIfoc0f8f8frfofsffsffsfffof8f8fofsffsffsffB J`PR BRf:f:f:f:f:if:~f:Sf:hf:=f:Rf: 'f: <f:@J1t&RWWWÍt&RWWɪWÍt&fo+foc BfoRf8f8fofsffsffsffrfIBfpff8fofsffsffsffRR fo Jffffff1[]ø[]f[] D$L$T$ /     AES for Intel AES-NI, CRYPTOGAMS by `!/P:\ring\pregenerated\tmp\aesni-x86-win32n.asm-ǭdnP gD  !"#$"&''((+).*4+9,=-A.D/H0I1P3S4V5Z6]7a8e9i:k;n=s>x?|@ABCDEFGHIJLMNOPQRSTUWXYZ[\]^_`ab cdef g!h0j3k7l:m=nAoEpIqMrQsStWuZw_xdyizn{r|u}z~$).25:?DINSX^chmrw| #(.178>?EFLMSY^bhmrwz       #) ,!2"6#:$>%D&I'M(Q)T*X+[,a-f.i/m0p1v2{3456789:;<=>?ABCDEFGHIJKLMNOPQRS T UVWXYZ [$\(],^0_5`@bCcIeLfPgShVj[k\l_mbnhomppqsrvs{tvwxyz{|}~ #'-156789:@ABDJLRWX^dgjmpv| #&*-148;<@DINRW\afimrv{       !$"'#-$3%8&<'@(F)K*Q+V,\-a.g/l0r1w2}3456789:;<=>?@ABCDEFHIKLMNOPQR T U V W X Y Z [ \ ] _$ `) a. b3 c7 d< fA gF hJ iO jS kX l\ ma ne oj pn qr rs sy t~ u v w x y z { | } ~                                @ P ` p     k0P:\ring\pregenerated\aesni-x86-win32n.objyasm 1.3.0_GFp_aes_hw_encrypt%L$_GFp_aes_hw_encrypt_begin"L$000enc1_loop_1P__aesni_encrypt2nL$001enc2_loop__aesni_encrypt3L$002enc3_loop0__aesni_encrypt4ZL$003enc4_loop__aesni_encrypt6$L$004_aesni_encrypt6_innerL$005enc6_loop!.L$_aesni_encrypt6_enter*_GFp_aes_hw_ctr32_encrypt_blocks2L$_GFp_aes_hw_ctr32_encrypt_blocks_begin!@L$006ctr32_one_shortcutL$007ctr32_tailL$008ctr32_loop6L$009ctr32_retIL$010ctr32_oneL$011ctr32_twoL$012ctr32_threeL$013ctr32_fourVL$014enc1_loop_2!@__aesni_set_encrypt_key L$015bad_pointerWL$016pic@ L$key_const L$01714rounds L$018bad_keybitsL$01910rounds@L$02010rounds_alt&L$021key_128_cold L$022key_128 L$023good_keyWL$024loop_key128 L$02514rounds_altL$026key_256a_cold L$027key_256bL$028key_256a< L$029loop_key256 L$030done_key256% _GFp_aes_hw_set_encrypt_key- L$_GFp_aes_hw_set_encrypt_key_begind h   2 6 Y ] u y             3 7 Y ] s w         4 8 P T j n             0 4 D H [ _ t x             0 4 M Q k o           .fileg@feat.00.text *>Z"kP|n0Z.?h@IV@ L$016picW)@ 5D R cq@&  W  <  $ @ .bss.debug$S(Z.debug$T dpregenerated\tmp\aesni-x86-win32n.asm_GFp_aes_hw_encryptL$_GFp_aes_hw_encrypt_beginL$000enc1_loop_1__aesni_encrypt2L$001enc2_loop__aesni_encrypt3L$002enc3_loop__aesni_encrypt4L$003enc4_loop__aesni_encrypt6L$004_aesni_encrypt6_innerL$005enc6_loopL$_aesni_encrypt6_enter_GFp_aes_hw_ctr32_encrypt_blocksL$_GFp_aes_hw_ctr32_encrypt_blocks_beginL$006ctr32_one_shortcutL$007ctr32_tailL$008ctr32_loop6L$009ctr32_retL$010ctr32_oneL$011ctr32_twoL$012ctr32_threeL$013ctr32_fourL$014enc1_loop_2__aesni_set_encrypt_keyL$015bad_pointerL$key_const_GFp_ia32cap_PL$01714roundsL$018bad_keybitsL$01910roundsL$02010rounds_altL$021key_128_coldL$022key_128L$023good_keyL$024loop_key128L$02514rounds_altL$026key_256a_coldL$027key_256bL$028key_256aL$029loop_key256L$030done_key256_GFp_aes_hw_set_encrypt_keyL$_GFp_aes_hw_set_encrypt_key_beginring-0.16.9/pregenerated/aesni-x86_64-elf.S000064400000000000000000000556561353224260300163450ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_aes_hw_encrypt .hidden GFp_aes_hw_encrypt .type GFp_aes_hw_encrypt,@function .align 16 GFp_aes_hw_encrypt: .cfi_startproc movups (%rdi),%xmm2 movl 240(%rdx),%eax movups (%rdx),%xmm0 movups 16(%rdx),%xmm1 leaq 32(%rdx),%rdx xorps %xmm0,%xmm2 .Loop_enc1_1: .byte 102,15,56,220,209 decl %eax movups (%rdx),%xmm1 leaq 16(%rdx),%rdx jnz .Loop_enc1_1 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movups %xmm2,(%rsi) pxor %xmm2,%xmm2 .byte 0xf3,0xc3 .cfi_endproc .size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt .type _aesni_encrypt2,@function .align 16 _aesni_encrypt2: .cfi_startproc movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax addq $16,%rax .Lenc_loop2: .byte 102,15,56,220,209 .byte 102,15,56,220,217 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 movups -16(%rcx,%rax,1),%xmm0 jnz .Lenc_loop2 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_encrypt2,.-_aesni_encrypt2 .type _aesni_encrypt3,@function .align 16 _aesni_encrypt3: .cfi_startproc movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 xorps %xmm0,%xmm4 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax addq $16,%rax .Lenc_loop3: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 movups -16(%rcx,%rax,1),%xmm0 jnz .Lenc_loop3 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_encrypt3,.-_aesni_encrypt3 .type _aesni_encrypt4,@function .align 16 _aesni_encrypt4: .cfi_startproc movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 xorps %xmm0,%xmm4 xorps %xmm0,%xmm5 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 0x0f,0x1f,0x00 addq $16,%rax .Lenc_loop4: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movups -16(%rcx,%rax,1),%xmm0 jnz .Lenc_loop4 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_encrypt4,.-_aesni_encrypt4 .type _aesni_encrypt6,@function .align 16 _aesni_encrypt6: .cfi_startproc movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 .byte 102,15,56,220,209 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,217 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 .byte 102,15,56,220,225 pxor %xmm0,%xmm7 movups (%rcx,%rax,1),%xmm0 addq $16,%rax jmp .Lenc_loop6_enter .align 16 .Lenc_loop6: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .Lenc_loop6_enter: .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%rcx,%rax,1),%xmm0 jnz .Lenc_loop6 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_encrypt6,.-_aesni_encrypt6 .type _aesni_encrypt8,@function .align 16 _aesni_encrypt8: .cfi_startproc movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,209 pxor %xmm0,%xmm7 pxor %xmm0,%xmm8 .byte 102,15,56,220,217 pxor %xmm0,%xmm9 movups (%rcx,%rax,1),%xmm0 addq $16,%rax jmp .Lenc_loop8_inner .align 16 .Lenc_loop8: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .Lenc_loop8_inner: .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 .Lenc_loop8_enter: movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups -16(%rcx,%rax,1),%xmm0 jnz .Lenc_loop8 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 .byte 102,68,15,56,221,192 .byte 102,68,15,56,221,200 .byte 0xf3,0xc3 .cfi_endproc .size _aesni_encrypt8,.-_aesni_encrypt8 .globl GFp_aes_hw_ctr32_encrypt_blocks .hidden GFp_aes_hw_ctr32_encrypt_blocks .type GFp_aes_hw_ctr32_encrypt_blocks,@function .align 16 GFp_aes_hw_ctr32_encrypt_blocks: .cfi_startproc cmpq $1,%rdx jne .Lctr32_bulk movups (%r8),%xmm2 movups (%rdi),%xmm3 movl 240(%rcx),%edx movups (%rcx),%xmm0 movups 16(%rcx),%xmm1 leaq 32(%rcx),%rcx xorps %xmm0,%xmm2 .Loop_enc1_2: .byte 102,15,56,220,209 decl %edx movups (%rcx),%xmm1 leaq 16(%rcx),%rcx jnz .Loop_enc1_2 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 xorps %xmm3,%xmm2 pxor %xmm3,%xmm3 movups %xmm2,(%rsi) xorps %xmm2,%xmm2 jmp .Lctr32_epilogue .align 16 .Lctr32_bulk: leaq (%rsp),%r11 .cfi_def_cfa_register %r11 pushq %rbp .cfi_offset %rbp,-16 subq $128,%rsp andq $-16,%rsp movdqu (%r8),%xmm2 movdqu (%rcx),%xmm0 movl 12(%r8),%r8d pxor %xmm0,%xmm2 movl 12(%rcx),%ebp movdqa %xmm2,0(%rsp) bswapl %r8d movdqa %xmm2,%xmm3 movdqa %xmm2,%xmm4 movdqa %xmm2,%xmm5 movdqa %xmm2,64(%rsp) movdqa %xmm2,80(%rsp) movdqa %xmm2,96(%rsp) movq %rdx,%r10 movdqa %xmm2,112(%rsp) leaq 1(%r8),%rax leaq 2(%r8),%rdx bswapl %eax bswapl %edx xorl %ebp,%eax xorl %ebp,%edx .byte 102,15,58,34,216,3 leaq 3(%r8),%rax movdqa %xmm3,16(%rsp) .byte 102,15,58,34,226,3 bswapl %eax movq %r10,%rdx leaq 4(%r8),%r10 movdqa %xmm4,32(%rsp) xorl %ebp,%eax bswapl %r10d .byte 102,15,58,34,232,3 xorl %ebp,%r10d movdqa %xmm5,48(%rsp) leaq 5(%r8),%r9 movl %r10d,64+12(%rsp) bswapl %r9d leaq 6(%r8),%r10 movl 240(%rcx),%eax xorl %ebp,%r9d bswapl %r10d movl %r9d,80+12(%rsp) xorl %ebp,%r10d leaq 7(%r8),%r9 movl %r10d,96+12(%rsp) bswapl %r9d leaq GFp_ia32cap_P(%rip),%r10 movl 4(%r10),%r10d xorl %ebp,%r9d andl $71303168,%r10d movl %r9d,112+12(%rsp) movups 16(%rcx),%xmm1 movdqa 64(%rsp),%xmm6 movdqa 80(%rsp),%xmm7 cmpq $8,%rdx jb .Lctr32_tail subq $6,%rdx cmpl $4194304,%r10d je .Lctr32_6x leaq 128(%rcx),%rcx subq $2,%rdx jmp .Lctr32_loop8 .align 16 .Lctr32_6x: shll $4,%eax movl $48,%r10d bswapl %ebp leaq 32(%rcx,%rax,1),%rcx subq %rax,%r10 jmp .Lctr32_loop6 .align 16 .Lctr32_loop6: addl $6,%r8d movups -48(%rcx,%r10,1),%xmm0 .byte 102,15,56,220,209 movl %r8d,%eax xorl %ebp,%eax .byte 102,15,56,220,217 .byte 0x0f,0x38,0xf1,0x44,0x24,12 leal 1(%r8),%eax .byte 102,15,56,220,225 xorl %ebp,%eax .byte 0x0f,0x38,0xf1,0x44,0x24,28 .byte 102,15,56,220,233 leal 2(%r8),%eax xorl %ebp,%eax .byte 102,15,56,220,241 .byte 0x0f,0x38,0xf1,0x44,0x24,44 leal 3(%r8),%eax .byte 102,15,56,220,249 movups -32(%rcx,%r10,1),%xmm1 xorl %ebp,%eax .byte 102,15,56,220,208 .byte 0x0f,0x38,0xf1,0x44,0x24,60 leal 4(%r8),%eax .byte 102,15,56,220,216 xorl %ebp,%eax .byte 0x0f,0x38,0xf1,0x44,0x24,76 .byte 102,15,56,220,224 leal 5(%r8),%eax xorl %ebp,%eax .byte 102,15,56,220,232 .byte 0x0f,0x38,0xf1,0x44,0x24,92 movq %r10,%rax .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%rcx,%r10,1),%xmm0 call .Lenc_loop6 movdqu (%rdi),%xmm8 movdqu 16(%rdi),%xmm9 movdqu 32(%rdi),%xmm10 movdqu 48(%rdi),%xmm11 movdqu 64(%rdi),%xmm12 movdqu 80(%rdi),%xmm13 leaq 96(%rdi),%rdi movups -64(%rcx,%r10,1),%xmm1 pxor %xmm2,%xmm8 movaps 0(%rsp),%xmm2 pxor %xmm3,%xmm9 movaps 16(%rsp),%xmm3 pxor %xmm4,%xmm10 movaps 32(%rsp),%xmm4 pxor %xmm5,%xmm11 movaps 48(%rsp),%xmm5 pxor %xmm6,%xmm12 movaps 64(%rsp),%xmm6 pxor %xmm7,%xmm13 movaps 80(%rsp),%xmm7 movdqu %xmm8,(%rsi) movdqu %xmm9,16(%rsi) movdqu %xmm10,32(%rsi) movdqu %xmm11,48(%rsi) movdqu %xmm12,64(%rsi) movdqu %xmm13,80(%rsi) leaq 96(%rsi),%rsi subq $6,%rdx jnc .Lctr32_loop6 addq $6,%rdx jz .Lctr32_done leal -48(%r10),%eax leaq -80(%rcx,%r10,1),%rcx negl %eax shrl $4,%eax jmp .Lctr32_tail .align 32 .Lctr32_loop8: addl $8,%r8d movdqa 96(%rsp),%xmm8 .byte 102,15,56,220,209 movl %r8d,%r9d movdqa 112(%rsp),%xmm9 .byte 102,15,56,220,217 bswapl %r9d movups 32-128(%rcx),%xmm0 .byte 102,15,56,220,225 xorl %ebp,%r9d nop .byte 102,15,56,220,233 movl %r9d,0+12(%rsp) leaq 1(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 48-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,16+12(%rsp) leaq 2(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 64-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,32+12(%rsp) leaq 3(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 80-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,48+12(%rsp) leaq 4(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 96-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,64+12(%rsp) leaq 5(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 112-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,80+12(%rsp) leaq 6(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 128-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,96+12(%rsp) leaq 7(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 144-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 xorl %ebp,%r9d movdqu 0(%rdi),%xmm10 .byte 102,15,56,220,232 movl %r9d,112+12(%rsp) cmpl $11,%eax .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 160-128(%rcx),%xmm0 jb .Lctr32_enc_done .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 176-128(%rcx),%xmm1 .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 192-128(%rcx),%xmm0 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 208-128(%rcx),%xmm1 .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 224-128(%rcx),%xmm0 jmp .Lctr32_enc_done .align 16 .Lctr32_enc_done: movdqu 16(%rdi),%xmm11 pxor %xmm0,%xmm10 movdqu 32(%rdi),%xmm12 pxor %xmm0,%xmm11 movdqu 48(%rdi),%xmm13 pxor %xmm0,%xmm12 movdqu 64(%rdi),%xmm14 pxor %xmm0,%xmm13 movdqu 80(%rdi),%xmm15 pxor %xmm0,%xmm14 pxor %xmm0,%xmm15 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movdqu 96(%rdi),%xmm1 leaq 128(%rdi),%rdi .byte 102,65,15,56,221,210 pxor %xmm0,%xmm1 movdqu 112-128(%rdi),%xmm10 .byte 102,65,15,56,221,219 pxor %xmm0,%xmm10 movdqa 0(%rsp),%xmm11 .byte 102,65,15,56,221,228 .byte 102,65,15,56,221,237 movdqa 16(%rsp),%xmm12 movdqa 32(%rsp),%xmm13 .byte 102,65,15,56,221,246 .byte 102,65,15,56,221,255 movdqa 48(%rsp),%xmm14 movdqa 64(%rsp),%xmm15 .byte 102,68,15,56,221,193 movdqa 80(%rsp),%xmm0 movups 16-128(%rcx),%xmm1 .byte 102,69,15,56,221,202 movups %xmm2,(%rsi) movdqa %xmm11,%xmm2 movups %xmm3,16(%rsi) movdqa %xmm12,%xmm3 movups %xmm4,32(%rsi) movdqa %xmm13,%xmm4 movups %xmm5,48(%rsi) movdqa %xmm14,%xmm5 movups %xmm6,64(%rsi) movdqa %xmm15,%xmm6 movups %xmm7,80(%rsi) movdqa %xmm0,%xmm7 movups %xmm8,96(%rsi) movups %xmm9,112(%rsi) leaq 128(%rsi),%rsi subq $8,%rdx jnc .Lctr32_loop8 addq $8,%rdx jz .Lctr32_done leaq -128(%rcx),%rcx .Lctr32_tail: leaq 16(%rcx),%rcx cmpq $4,%rdx jb .Lctr32_loop3 je .Lctr32_loop4 shll $4,%eax movdqa 96(%rsp),%xmm8 pxor %xmm9,%xmm9 movups 16(%rcx),%xmm0 .byte 102,15,56,220,209 .byte 102,15,56,220,217 leaq 32-16(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,225 addq $16,%rax movups (%rdi),%xmm10 .byte 102,15,56,220,233 .byte 102,15,56,220,241 movups 16(%rdi),%xmm11 movups 32(%rdi),%xmm12 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 call .Lenc_loop8_enter movdqu 48(%rdi),%xmm13 pxor %xmm10,%xmm2 movdqu 64(%rdi),%xmm10 pxor %xmm11,%xmm3 movdqu %xmm2,(%rsi) pxor %xmm12,%xmm4 movdqu %xmm3,16(%rsi) pxor %xmm13,%xmm5 movdqu %xmm4,32(%rsi) pxor %xmm10,%xmm6 movdqu %xmm5,48(%rsi) movdqu %xmm6,64(%rsi) cmpq $6,%rdx jb .Lctr32_done movups 80(%rdi),%xmm11 xorps %xmm11,%xmm7 movups %xmm7,80(%rsi) je .Lctr32_done movups 96(%rdi),%xmm12 xorps %xmm12,%xmm8 movups %xmm8,96(%rsi) jmp .Lctr32_done .align 32 .Lctr32_loop4: .byte 102,15,56,220,209 leaq 16(%rcx),%rcx decl %eax .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%rcx),%xmm1 jnz .Lctr32_loop4 .byte 102,15,56,221,209 .byte 102,15,56,221,217 movups (%rdi),%xmm10 movups 16(%rdi),%xmm11 .byte 102,15,56,221,225 .byte 102,15,56,221,233 movups 32(%rdi),%xmm12 movups 48(%rdi),%xmm13 xorps %xmm10,%xmm2 movups %xmm2,(%rsi) xorps %xmm11,%xmm3 movups %xmm3,16(%rsi) pxor %xmm12,%xmm4 movdqu %xmm4,32(%rsi) pxor %xmm13,%xmm5 movdqu %xmm5,48(%rsi) jmp .Lctr32_done .align 32 .Lctr32_loop3: .byte 102,15,56,220,209 leaq 16(%rcx),%rcx decl %eax .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%rcx),%xmm1 jnz .Lctr32_loop3 .byte 102,15,56,221,209 .byte 102,15,56,221,217 .byte 102,15,56,221,225 movups (%rdi),%xmm10 xorps %xmm10,%xmm2 movups %xmm2,(%rsi) cmpq $2,%rdx jb .Lctr32_done movups 16(%rdi),%xmm11 xorps %xmm11,%xmm3 movups %xmm3,16(%rsi) je .Lctr32_done movups 32(%rdi),%xmm12 xorps %xmm12,%xmm4 movups %xmm4,32(%rsi) .Lctr32_done: xorps %xmm0,%xmm0 xorl %ebp,%ebp pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 movaps %xmm0,0(%rsp) pxor %xmm8,%xmm8 movaps %xmm0,16(%rsp) pxor %xmm9,%xmm9 movaps %xmm0,32(%rsp) pxor %xmm10,%xmm10 movaps %xmm0,48(%rsp) pxor %xmm11,%xmm11 movaps %xmm0,64(%rsp) pxor %xmm12,%xmm12 movaps %xmm0,80(%rsp) pxor %xmm13,%xmm13 movaps %xmm0,96(%rsp) pxor %xmm14,%xmm14 movaps %xmm0,112(%rsp) pxor %xmm15,%xmm15 movq -8(%r11),%rbp .cfi_restore %rbp leaq (%r11),%rsp .cfi_def_cfa_register %rsp .Lctr32_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks .globl GFp_aes_hw_set_encrypt_key .hidden GFp_aes_hw_set_encrypt_key .type GFp_aes_hw_set_encrypt_key,@function .align 16 GFp_aes_hw_set_encrypt_key: __aesni_set_encrypt_key: .cfi_startproc .byte 0x48,0x83,0xEC,0x08 .cfi_adjust_cfa_offset 8 movq $-1,%rax testq %rdi,%rdi jz .Lenc_key_ret testq %rdx,%rdx jz .Lenc_key_ret movups (%rdi),%xmm0 xorps %xmm4,%xmm4 leaq GFp_ia32cap_P(%rip),%r10 movl 4(%r10),%r10d andl $268437504,%r10d leaq 16(%rdx),%rax cmpl $256,%esi je .L14rounds cmpl $128,%esi jne .Lbad_keybits .L10rounds: movl $9,%esi cmpl $268435456,%r10d je .L10rounds_alt movups %xmm0,(%rdx) .byte 102,15,58,223,200,1 call .Lkey_expansion_128_cold .byte 102,15,58,223,200,2 call .Lkey_expansion_128 .byte 102,15,58,223,200,4 call .Lkey_expansion_128 .byte 102,15,58,223,200,8 call .Lkey_expansion_128 .byte 102,15,58,223,200,16 call .Lkey_expansion_128 .byte 102,15,58,223,200,32 call .Lkey_expansion_128 .byte 102,15,58,223,200,64 call .Lkey_expansion_128 .byte 102,15,58,223,200,128 call .Lkey_expansion_128 .byte 102,15,58,223,200,27 call .Lkey_expansion_128 .byte 102,15,58,223,200,54 call .Lkey_expansion_128 movups %xmm0,(%rax) movl %esi,80(%rax) xorl %eax,%eax jmp .Lenc_key_ret .align 16 .L10rounds_alt: movdqa .Lkey_rotate(%rip),%xmm5 movl $8,%r10d movdqa .Lkey_rcon1(%rip),%xmm4 movdqa %xmm0,%xmm2 movdqu %xmm0,(%rdx) jmp .Loop_key128 .align 16 .Loop_key128: .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 leaq 16(%rax),%rax movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,-16(%rax) movdqa %xmm0,%xmm2 decl %r10d jnz .Loop_key128 movdqa .Lkey_rcon1b(%rip),%xmm4 .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) movdqa %xmm0,%xmm2 .byte 102,15,56,0,197 .byte 102,15,56,221,196 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,16(%rax) movl %esi,96(%rax) xorl %eax,%eax jmp .Lenc_key_ret .align 16 .L14rounds: movups 16(%rdi),%xmm2 movl $13,%esi leaq 16(%rax),%rax cmpl $268435456,%r10d je .L14rounds_alt movups %xmm0,(%rdx) movups %xmm2,16(%rdx) .byte 102,15,58,223,202,1 call .Lkey_expansion_256a_cold .byte 102,15,58,223,200,1 call .Lkey_expansion_256b .byte 102,15,58,223,202,2 call .Lkey_expansion_256a .byte 102,15,58,223,200,2 call .Lkey_expansion_256b .byte 102,15,58,223,202,4 call .Lkey_expansion_256a .byte 102,15,58,223,200,4 call .Lkey_expansion_256b .byte 102,15,58,223,202,8 call .Lkey_expansion_256a .byte 102,15,58,223,200,8 call .Lkey_expansion_256b .byte 102,15,58,223,202,16 call .Lkey_expansion_256a .byte 102,15,58,223,200,16 call .Lkey_expansion_256b .byte 102,15,58,223,202,32 call .Lkey_expansion_256a .byte 102,15,58,223,200,32 call .Lkey_expansion_256b .byte 102,15,58,223,202,64 call .Lkey_expansion_256a movups %xmm0,(%rax) movl %esi,16(%rax) xorq %rax,%rax jmp .Lenc_key_ret .align 16 .L14rounds_alt: movdqa .Lkey_rotate(%rip),%xmm5 movdqa .Lkey_rcon1(%rip),%xmm4 movl $7,%r10d movdqu %xmm0,0(%rdx) movdqa %xmm2,%xmm1 movdqu %xmm2,16(%rdx) jmp .Loop_key256 .align 16 .Loop_key256: .byte 102,15,56,0,213 .byte 102,15,56,221,212 movdqa %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm3,%xmm0 pslld $1,%xmm4 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) decl %r10d jz .Ldone_key256 pshufd $0xff,%xmm0,%xmm2 pxor %xmm3,%xmm3 .byte 102,15,56,221,211 movdqa %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm3,%xmm1 pxor %xmm1,%xmm2 movdqu %xmm2,16(%rax) leaq 32(%rax),%rax movdqa %xmm2,%xmm1 jmp .Loop_key256 .Ldone_key256: movl %esi,16(%rax) xorl %eax,%eax jmp .Lenc_key_ret .align 16 .Lbad_keybits: movq $-2,%rax .Lenc_key_ret: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 addq $8,%rsp .cfi_adjust_cfa_offset -8 .byte 0xf3,0xc3 .cfi_endproc .LSEH_end_GFp_set_encrypt_key: .align 16 .Lkey_expansion_128: movups %xmm0,(%rax) leaq 16(%rax),%rax .Lkey_expansion_128_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 .byte 0xf3,0xc3 .align 16 .Lkey_expansion_192a: movups %xmm0,(%rax) leaq 16(%rax),%rax .Lkey_expansion_192a_cold: movaps %xmm2,%xmm5 .Lkey_expansion_192b_warm: shufps $16,%xmm0,%xmm4 movdqa %xmm2,%xmm3 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 pslldq $4,%xmm3 xorps %xmm4,%xmm0 pshufd $85,%xmm1,%xmm1 pxor %xmm3,%xmm2 pxor %xmm1,%xmm0 pshufd $255,%xmm0,%xmm3 pxor %xmm3,%xmm2 .byte 0xf3,0xc3 .align 16 .Lkey_expansion_192b: movaps %xmm0,%xmm3 shufps $68,%xmm0,%xmm5 movups %xmm5,(%rax) shufps $78,%xmm2,%xmm3 movups %xmm3,16(%rax) leaq 32(%rax),%rax jmp .Lkey_expansion_192b_warm .align 16 .Lkey_expansion_256a: movups %xmm2,(%rax) leaq 16(%rax),%rax .Lkey_expansion_256a_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 .byte 0xf3,0xc3 .align 16 .Lkey_expansion_256b: movups %xmm0,(%rax) leaq 16(%rax),%rax shufps $16,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $140,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 .byte 0xf3,0xc3 .size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key .size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .Lincrement32: .long 6,6,6,0 .Lincrement64: .long 1,0,0,0 .Lincrement1: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 .Lkey_rotate: .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d .Lkey_rotate192: .long 0x04070605,0x04070605,0x04070605,0x04070605 .Lkey_rcon1: .long 1,1,1,1 .Lkey_rcon1b: .long 0x1b,0x1b,0x1b,0x1b .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 #endif ring-0.16.9/pregenerated/aesni-x86_64-macosx.S000064400000000000000000000536311353224257600170710ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_aes_hw_encrypt .private_extern _GFp_aes_hw_encrypt .p2align 4 _GFp_aes_hw_encrypt: movups (%rdi),%xmm2 movl 240(%rdx),%eax movups (%rdx),%xmm0 movups 16(%rdx),%xmm1 leaq 32(%rdx),%rdx xorps %xmm0,%xmm2 L$oop_enc1_1: .byte 102,15,56,220,209 decl %eax movups (%rdx),%xmm1 leaq 16(%rdx),%rdx jnz L$oop_enc1_1 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 movups %xmm2,(%rsi) pxor %xmm2,%xmm2 .byte 0xf3,0xc3 .p2align 4 _aesni_encrypt2: movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax addq $16,%rax L$enc_loop2: .byte 102,15,56,220,209 .byte 102,15,56,220,217 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 movups -16(%rcx,%rax,1),%xmm0 jnz L$enc_loop2 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 0xf3,0xc3 .p2align 4 _aesni_encrypt3: movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 xorps %xmm0,%xmm4 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax addq $16,%rax L$enc_loop3: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 movups -16(%rcx,%rax,1),%xmm0 jnz L$enc_loop3 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 0xf3,0xc3 .p2align 4 _aesni_encrypt4: movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 xorps %xmm0,%xmm4 xorps %xmm0,%xmm5 movups 32(%rcx),%xmm0 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 0x0f,0x1f,0x00 addq $16,%rax L$enc_loop4: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movups -16(%rcx,%rax,1),%xmm0 jnz L$enc_loop4 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 0xf3,0xc3 .p2align 4 _aesni_encrypt6: movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 pxor %xmm0,%xmm3 pxor %xmm0,%xmm4 .byte 102,15,56,220,209 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,217 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 .byte 102,15,56,220,225 pxor %xmm0,%xmm7 movups (%rcx,%rax,1),%xmm0 addq $16,%rax jmp L$enc_loop6_enter .p2align 4 L$enc_loop6: .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 L$enc_loop6_enter: .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%rcx,%rax,1),%xmm0 jnz L$enc_loop6 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 .byte 0xf3,0xc3 .p2align 4 _aesni_encrypt8: movups (%rcx),%xmm0 shll $4,%eax movups 16(%rcx),%xmm1 xorps %xmm0,%xmm2 xorps %xmm0,%xmm3 pxor %xmm0,%xmm4 pxor %xmm0,%xmm5 pxor %xmm0,%xmm6 leaq 32(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,209 pxor %xmm0,%xmm7 pxor %xmm0,%xmm8 .byte 102,15,56,220,217 pxor %xmm0,%xmm9 movups (%rcx,%rax,1),%xmm0 addq $16,%rax jmp L$enc_loop8_inner .p2align 4 L$enc_loop8: .byte 102,15,56,220,209 .byte 102,15,56,220,217 L$enc_loop8_inner: .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 L$enc_loop8_enter: movups (%rcx,%rax,1),%xmm1 addq $32,%rax .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups -16(%rcx,%rax,1),%xmm0 jnz L$enc_loop8 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 .byte 102,15,56,221,208 .byte 102,15,56,221,216 .byte 102,15,56,221,224 .byte 102,15,56,221,232 .byte 102,15,56,221,240 .byte 102,15,56,221,248 .byte 102,68,15,56,221,192 .byte 102,68,15,56,221,200 .byte 0xf3,0xc3 .globl _GFp_aes_hw_ctr32_encrypt_blocks .private_extern _GFp_aes_hw_ctr32_encrypt_blocks .p2align 4 _GFp_aes_hw_ctr32_encrypt_blocks: cmpq $1,%rdx jne L$ctr32_bulk movups (%r8),%xmm2 movups (%rdi),%xmm3 movl 240(%rcx),%edx movups (%rcx),%xmm0 movups 16(%rcx),%xmm1 leaq 32(%rcx),%rcx xorps %xmm0,%xmm2 L$oop_enc1_2: .byte 102,15,56,220,209 decl %edx movups (%rcx),%xmm1 leaq 16(%rcx),%rcx jnz L$oop_enc1_2 .byte 102,15,56,221,209 pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 xorps %xmm3,%xmm2 pxor %xmm3,%xmm3 movups %xmm2,(%rsi) xorps %xmm2,%xmm2 jmp L$ctr32_epilogue .p2align 4 L$ctr32_bulk: leaq (%rsp),%r11 pushq %rbp subq $128,%rsp andq $-16,%rsp movdqu (%r8),%xmm2 movdqu (%rcx),%xmm0 movl 12(%r8),%r8d pxor %xmm0,%xmm2 movl 12(%rcx),%ebp movdqa %xmm2,0(%rsp) bswapl %r8d movdqa %xmm2,%xmm3 movdqa %xmm2,%xmm4 movdqa %xmm2,%xmm5 movdqa %xmm2,64(%rsp) movdqa %xmm2,80(%rsp) movdqa %xmm2,96(%rsp) movq %rdx,%r10 movdqa %xmm2,112(%rsp) leaq 1(%r8),%rax leaq 2(%r8),%rdx bswapl %eax bswapl %edx xorl %ebp,%eax xorl %ebp,%edx .byte 102,15,58,34,216,3 leaq 3(%r8),%rax movdqa %xmm3,16(%rsp) .byte 102,15,58,34,226,3 bswapl %eax movq %r10,%rdx leaq 4(%r8),%r10 movdqa %xmm4,32(%rsp) xorl %ebp,%eax bswapl %r10d .byte 102,15,58,34,232,3 xorl %ebp,%r10d movdqa %xmm5,48(%rsp) leaq 5(%r8),%r9 movl %r10d,64+12(%rsp) bswapl %r9d leaq 6(%r8),%r10 movl 240(%rcx),%eax xorl %ebp,%r9d bswapl %r10d movl %r9d,80+12(%rsp) xorl %ebp,%r10d leaq 7(%r8),%r9 movl %r10d,96+12(%rsp) bswapl %r9d leaq _GFp_ia32cap_P(%rip),%r10 movl 4(%r10),%r10d xorl %ebp,%r9d andl $71303168,%r10d movl %r9d,112+12(%rsp) movups 16(%rcx),%xmm1 movdqa 64(%rsp),%xmm6 movdqa 80(%rsp),%xmm7 cmpq $8,%rdx jb L$ctr32_tail subq $6,%rdx cmpl $4194304,%r10d je L$ctr32_6x leaq 128(%rcx),%rcx subq $2,%rdx jmp L$ctr32_loop8 .p2align 4 L$ctr32_6x: shll $4,%eax movl $48,%r10d bswapl %ebp leaq 32(%rcx,%rax,1),%rcx subq %rax,%r10 jmp L$ctr32_loop6 .p2align 4 L$ctr32_loop6: addl $6,%r8d movups -48(%rcx,%r10,1),%xmm0 .byte 102,15,56,220,209 movl %r8d,%eax xorl %ebp,%eax .byte 102,15,56,220,217 .byte 0x0f,0x38,0xf1,0x44,0x24,12 leal 1(%r8),%eax .byte 102,15,56,220,225 xorl %ebp,%eax .byte 0x0f,0x38,0xf1,0x44,0x24,28 .byte 102,15,56,220,233 leal 2(%r8),%eax xorl %ebp,%eax .byte 102,15,56,220,241 .byte 0x0f,0x38,0xf1,0x44,0x24,44 leal 3(%r8),%eax .byte 102,15,56,220,249 movups -32(%rcx,%r10,1),%xmm1 xorl %ebp,%eax .byte 102,15,56,220,208 .byte 0x0f,0x38,0xf1,0x44,0x24,60 leal 4(%r8),%eax .byte 102,15,56,220,216 xorl %ebp,%eax .byte 0x0f,0x38,0xf1,0x44,0x24,76 .byte 102,15,56,220,224 leal 5(%r8),%eax xorl %ebp,%eax .byte 102,15,56,220,232 .byte 0x0f,0x38,0xf1,0x44,0x24,92 movq %r10,%rax .byte 102,15,56,220,240 .byte 102,15,56,220,248 movups -16(%rcx,%r10,1),%xmm0 call L$enc_loop6 movdqu (%rdi),%xmm8 movdqu 16(%rdi),%xmm9 movdqu 32(%rdi),%xmm10 movdqu 48(%rdi),%xmm11 movdqu 64(%rdi),%xmm12 movdqu 80(%rdi),%xmm13 leaq 96(%rdi),%rdi movups -64(%rcx,%r10,1),%xmm1 pxor %xmm2,%xmm8 movaps 0(%rsp),%xmm2 pxor %xmm3,%xmm9 movaps 16(%rsp),%xmm3 pxor %xmm4,%xmm10 movaps 32(%rsp),%xmm4 pxor %xmm5,%xmm11 movaps 48(%rsp),%xmm5 pxor %xmm6,%xmm12 movaps 64(%rsp),%xmm6 pxor %xmm7,%xmm13 movaps 80(%rsp),%xmm7 movdqu %xmm8,(%rsi) movdqu %xmm9,16(%rsi) movdqu %xmm10,32(%rsi) movdqu %xmm11,48(%rsi) movdqu %xmm12,64(%rsi) movdqu %xmm13,80(%rsi) leaq 96(%rsi),%rsi subq $6,%rdx jnc L$ctr32_loop6 addq $6,%rdx jz L$ctr32_done leal -48(%r10),%eax leaq -80(%rcx,%r10,1),%rcx negl %eax shrl $4,%eax jmp L$ctr32_tail .p2align 5 L$ctr32_loop8: addl $8,%r8d movdqa 96(%rsp),%xmm8 .byte 102,15,56,220,209 movl %r8d,%r9d movdqa 112(%rsp),%xmm9 .byte 102,15,56,220,217 bswapl %r9d movups 32-128(%rcx),%xmm0 .byte 102,15,56,220,225 xorl %ebp,%r9d nop .byte 102,15,56,220,233 movl %r9d,0+12(%rsp) leaq 1(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 48-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,16+12(%rsp) leaq 2(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 64-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,32+12(%rsp) leaq 3(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 80-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,48+12(%rsp) leaq 4(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 96-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,64+12(%rsp) leaq 5(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 112-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,224 .byte 102,15,56,220,232 movl %r9d,80+12(%rsp) leaq 6(%r8),%r9 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 128-128(%rcx),%xmm0 bswapl %r9d .byte 102,15,56,220,209 .byte 102,15,56,220,217 xorl %ebp,%r9d .byte 0x66,0x90 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movl %r9d,96+12(%rsp) leaq 7(%r8),%r9 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 144-128(%rcx),%xmm1 bswapl %r9d .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 xorl %ebp,%r9d movdqu 0(%rdi),%xmm10 .byte 102,15,56,220,232 movl %r9d,112+12(%rsp) cmpl $11,%eax .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 160-128(%rcx),%xmm0 jb L$ctr32_enc_done .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 176-128(%rcx),%xmm1 .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 192-128(%rcx),%xmm0 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movups 208-128(%rcx),%xmm1 .byte 102,15,56,220,208 .byte 102,15,56,220,216 .byte 102,15,56,220,224 .byte 102,15,56,220,232 .byte 102,15,56,220,240 .byte 102,15,56,220,248 .byte 102,68,15,56,220,192 .byte 102,68,15,56,220,200 movups 224-128(%rcx),%xmm0 jmp L$ctr32_enc_done .p2align 4 L$ctr32_enc_done: movdqu 16(%rdi),%xmm11 pxor %xmm0,%xmm10 movdqu 32(%rdi),%xmm12 pxor %xmm0,%xmm11 movdqu 48(%rdi),%xmm13 pxor %xmm0,%xmm12 movdqu 64(%rdi),%xmm14 pxor %xmm0,%xmm13 movdqu 80(%rdi),%xmm15 pxor %xmm0,%xmm14 pxor %xmm0,%xmm15 .byte 102,15,56,220,209 .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 .byte 102,15,56,220,241 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 .byte 102,68,15,56,220,201 movdqu 96(%rdi),%xmm1 leaq 128(%rdi),%rdi .byte 102,65,15,56,221,210 pxor %xmm0,%xmm1 movdqu 112-128(%rdi),%xmm10 .byte 102,65,15,56,221,219 pxor %xmm0,%xmm10 movdqa 0(%rsp),%xmm11 .byte 102,65,15,56,221,228 .byte 102,65,15,56,221,237 movdqa 16(%rsp),%xmm12 movdqa 32(%rsp),%xmm13 .byte 102,65,15,56,221,246 .byte 102,65,15,56,221,255 movdqa 48(%rsp),%xmm14 movdqa 64(%rsp),%xmm15 .byte 102,68,15,56,221,193 movdqa 80(%rsp),%xmm0 movups 16-128(%rcx),%xmm1 .byte 102,69,15,56,221,202 movups %xmm2,(%rsi) movdqa %xmm11,%xmm2 movups %xmm3,16(%rsi) movdqa %xmm12,%xmm3 movups %xmm4,32(%rsi) movdqa %xmm13,%xmm4 movups %xmm5,48(%rsi) movdqa %xmm14,%xmm5 movups %xmm6,64(%rsi) movdqa %xmm15,%xmm6 movups %xmm7,80(%rsi) movdqa %xmm0,%xmm7 movups %xmm8,96(%rsi) movups %xmm9,112(%rsi) leaq 128(%rsi),%rsi subq $8,%rdx jnc L$ctr32_loop8 addq $8,%rdx jz L$ctr32_done leaq -128(%rcx),%rcx L$ctr32_tail: leaq 16(%rcx),%rcx cmpq $4,%rdx jb L$ctr32_loop3 je L$ctr32_loop4 shll $4,%eax movdqa 96(%rsp),%xmm8 pxor %xmm9,%xmm9 movups 16(%rcx),%xmm0 .byte 102,15,56,220,209 .byte 102,15,56,220,217 leaq 32-16(%rcx,%rax,1),%rcx negq %rax .byte 102,15,56,220,225 addq $16,%rax movups (%rdi),%xmm10 .byte 102,15,56,220,233 .byte 102,15,56,220,241 movups 16(%rdi),%xmm11 movups 32(%rdi),%xmm12 .byte 102,15,56,220,249 .byte 102,68,15,56,220,193 call L$enc_loop8_enter movdqu 48(%rdi),%xmm13 pxor %xmm10,%xmm2 movdqu 64(%rdi),%xmm10 pxor %xmm11,%xmm3 movdqu %xmm2,(%rsi) pxor %xmm12,%xmm4 movdqu %xmm3,16(%rsi) pxor %xmm13,%xmm5 movdqu %xmm4,32(%rsi) pxor %xmm10,%xmm6 movdqu %xmm5,48(%rsi) movdqu %xmm6,64(%rsi) cmpq $6,%rdx jb L$ctr32_done movups 80(%rdi),%xmm11 xorps %xmm11,%xmm7 movups %xmm7,80(%rsi) je L$ctr32_done movups 96(%rdi),%xmm12 xorps %xmm12,%xmm8 movups %xmm8,96(%rsi) jmp L$ctr32_done .p2align 5 L$ctr32_loop4: .byte 102,15,56,220,209 leaq 16(%rcx),%rcx decl %eax .byte 102,15,56,220,217 .byte 102,15,56,220,225 .byte 102,15,56,220,233 movups (%rcx),%xmm1 jnz L$ctr32_loop4 .byte 102,15,56,221,209 .byte 102,15,56,221,217 movups (%rdi),%xmm10 movups 16(%rdi),%xmm11 .byte 102,15,56,221,225 .byte 102,15,56,221,233 movups 32(%rdi),%xmm12 movups 48(%rdi),%xmm13 xorps %xmm10,%xmm2 movups %xmm2,(%rsi) xorps %xmm11,%xmm3 movups %xmm3,16(%rsi) pxor %xmm12,%xmm4 movdqu %xmm4,32(%rsi) pxor %xmm13,%xmm5 movdqu %xmm5,48(%rsi) jmp L$ctr32_done .p2align 5 L$ctr32_loop3: .byte 102,15,56,220,209 leaq 16(%rcx),%rcx decl %eax .byte 102,15,56,220,217 .byte 102,15,56,220,225 movups (%rcx),%xmm1 jnz L$ctr32_loop3 .byte 102,15,56,221,209 .byte 102,15,56,221,217 .byte 102,15,56,221,225 movups (%rdi),%xmm10 xorps %xmm10,%xmm2 movups %xmm2,(%rsi) cmpq $2,%rdx jb L$ctr32_done movups 16(%rdi),%xmm11 xorps %xmm11,%xmm3 movups %xmm3,16(%rsi) je L$ctr32_done movups 32(%rdi),%xmm12 xorps %xmm12,%xmm4 movups %xmm4,32(%rsi) L$ctr32_done: xorps %xmm0,%xmm0 xorl %ebp,%ebp pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 movaps %xmm0,0(%rsp) pxor %xmm8,%xmm8 movaps %xmm0,16(%rsp) pxor %xmm9,%xmm9 movaps %xmm0,32(%rsp) pxor %xmm10,%xmm10 movaps %xmm0,48(%rsp) pxor %xmm11,%xmm11 movaps %xmm0,64(%rsp) pxor %xmm12,%xmm12 movaps %xmm0,80(%rsp) pxor %xmm13,%xmm13 movaps %xmm0,96(%rsp) pxor %xmm14,%xmm14 movaps %xmm0,112(%rsp) pxor %xmm15,%xmm15 movq -8(%r11),%rbp leaq (%r11),%rsp L$ctr32_epilogue: .byte 0xf3,0xc3 .globl _GFp_aes_hw_set_encrypt_key .private_extern _GFp_aes_hw_set_encrypt_key .p2align 4 _GFp_aes_hw_set_encrypt_key: __aesni_set_encrypt_key: .byte 0x48,0x83,0xEC,0x08 movq $-1,%rax testq %rdi,%rdi jz L$enc_key_ret testq %rdx,%rdx jz L$enc_key_ret movups (%rdi),%xmm0 xorps %xmm4,%xmm4 leaq _GFp_ia32cap_P(%rip),%r10 movl 4(%r10),%r10d andl $268437504,%r10d leaq 16(%rdx),%rax cmpl $256,%esi je L$14rounds cmpl $128,%esi jne L$bad_keybits L$10rounds: movl $9,%esi cmpl $268435456,%r10d je L$10rounds_alt movups %xmm0,(%rdx) .byte 102,15,58,223,200,1 call L$key_expansion_128_cold .byte 102,15,58,223,200,2 call L$key_expansion_128 .byte 102,15,58,223,200,4 call L$key_expansion_128 .byte 102,15,58,223,200,8 call L$key_expansion_128 .byte 102,15,58,223,200,16 call L$key_expansion_128 .byte 102,15,58,223,200,32 call L$key_expansion_128 .byte 102,15,58,223,200,64 call L$key_expansion_128 .byte 102,15,58,223,200,128 call L$key_expansion_128 .byte 102,15,58,223,200,27 call L$key_expansion_128 .byte 102,15,58,223,200,54 call L$key_expansion_128 movups %xmm0,(%rax) movl %esi,80(%rax) xorl %eax,%eax jmp L$enc_key_ret .p2align 4 L$10rounds_alt: movdqa L$key_rotate(%rip),%xmm5 movl $8,%r10d movdqa L$key_rcon1(%rip),%xmm4 movdqa %xmm0,%xmm2 movdqu %xmm0,(%rdx) jmp L$oop_key128 .p2align 4 L$oop_key128: .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 leaq 16(%rax),%rax movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,-16(%rax) movdqa %xmm0,%xmm2 decl %r10d jnz L$oop_key128 movdqa L$key_rcon1b(%rip),%xmm4 .byte 102,15,56,0,197 .byte 102,15,56,221,196 pslld $1,%xmm4 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) movdqa %xmm0,%xmm2 .byte 102,15,56,0,197 .byte 102,15,56,221,196 movdqa %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm2,%xmm3 pslldq $4,%xmm2 pxor %xmm3,%xmm2 pxor %xmm2,%xmm0 movdqu %xmm0,16(%rax) movl %esi,96(%rax) xorl %eax,%eax jmp L$enc_key_ret .p2align 4 L$14rounds: movups 16(%rdi),%xmm2 movl $13,%esi leaq 16(%rax),%rax cmpl $268435456,%r10d je L$14rounds_alt movups %xmm0,(%rdx) movups %xmm2,16(%rdx) .byte 102,15,58,223,202,1 call L$key_expansion_256a_cold .byte 102,15,58,223,200,1 call L$key_expansion_256b .byte 102,15,58,223,202,2 call L$key_expansion_256a .byte 102,15,58,223,200,2 call L$key_expansion_256b .byte 102,15,58,223,202,4 call L$key_expansion_256a .byte 102,15,58,223,200,4 call L$key_expansion_256b .byte 102,15,58,223,202,8 call L$key_expansion_256a .byte 102,15,58,223,200,8 call L$key_expansion_256b .byte 102,15,58,223,202,16 call L$key_expansion_256a .byte 102,15,58,223,200,16 call L$key_expansion_256b .byte 102,15,58,223,202,32 call L$key_expansion_256a .byte 102,15,58,223,200,32 call L$key_expansion_256b .byte 102,15,58,223,202,64 call L$key_expansion_256a movups %xmm0,(%rax) movl %esi,16(%rax) xorq %rax,%rax jmp L$enc_key_ret .p2align 4 L$14rounds_alt: movdqa L$key_rotate(%rip),%xmm5 movdqa L$key_rcon1(%rip),%xmm4 movl $7,%r10d movdqu %xmm0,0(%rdx) movdqa %xmm2,%xmm1 movdqu %xmm2,16(%rdx) jmp L$oop_key256 .p2align 4 L$oop_key256: .byte 102,15,56,0,213 .byte 102,15,56,221,212 movdqa %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm0,%xmm3 pslldq $4,%xmm0 pxor %xmm3,%xmm0 pslld $1,%xmm4 pxor %xmm2,%xmm0 movdqu %xmm0,(%rax) decl %r10d jz L$done_key256 pshufd $0xff,%xmm0,%xmm2 pxor %xmm3,%xmm3 .byte 102,15,56,221,211 movdqa %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm1,%xmm3 pslldq $4,%xmm1 pxor %xmm3,%xmm1 pxor %xmm1,%xmm2 movdqu %xmm2,16(%rax) leaq 32(%rax),%rax movdqa %xmm2,%xmm1 jmp L$oop_key256 L$done_key256: movl %esi,16(%rax) xorl %eax,%eax jmp L$enc_key_ret .p2align 4 L$bad_keybits: movq $-2,%rax L$enc_key_ret: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 addq $8,%rsp .byte 0xf3,0xc3 L$SEH_end_GFp_set_encrypt_key: .p2align 4 L$key_expansion_128: movups %xmm0,(%rax) leaq 16(%rax),%rax L$key_expansion_128_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 .byte 0xf3,0xc3 .p2align 4 L$key_expansion_192a: movups %xmm0,(%rax) leaq 16(%rax),%rax L$key_expansion_192a_cold: movaps %xmm2,%xmm5 L$key_expansion_192b_warm: shufps $16,%xmm0,%xmm4 movdqa %xmm2,%xmm3 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 pslldq $4,%xmm3 xorps %xmm4,%xmm0 pshufd $85,%xmm1,%xmm1 pxor %xmm3,%xmm2 pxor %xmm1,%xmm0 pshufd $255,%xmm0,%xmm3 pxor %xmm3,%xmm2 .byte 0xf3,0xc3 .p2align 4 L$key_expansion_192b: movaps %xmm0,%xmm3 shufps $68,%xmm0,%xmm5 movups %xmm5,(%rax) shufps $78,%xmm2,%xmm3 movups %xmm3,16(%rax) leaq 32(%rax),%rax jmp L$key_expansion_192b_warm .p2align 4 L$key_expansion_256a: movups %xmm2,(%rax) leaq 16(%rax),%rax L$key_expansion_256a_cold: shufps $16,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $140,%xmm0,%xmm4 xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 .byte 0xf3,0xc3 .p2align 4 L$key_expansion_256b: movups %xmm0,(%rax) leaq 16(%rax),%rax shufps $16,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $140,%xmm2,%xmm4 xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 .byte 0xf3,0xc3 .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 L$increment32: .long 6,6,6,0 L$increment64: .long 1,0,0,0 L$increment1: .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 L$key_rotate: .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d L$key_rotate192: .long 0x04070605,0x04070605,0x04070605,0x04070605 L$key_rcon1: .long 1,1,1,1 L$key_rcon1b: .long 0x1b,0x1b,0x1b,0x1b .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 #endif ring-0.16.9/pregenerated/aesni-x86_64-nasm.obj000064400000000000000000000466261353224260300171020ustar0000000000000000dEi]CM.text p`.pdata@0@.xdata ?W@@@.debug$S )u>@B.debug$T C@BAAAHM@ Wf8AM@f8fffff.IWWA HL HHf8f8 H f8f8Df8f8f8f8IWWWA HL HHf8f8f8 H f8f8f8Df8f8f8f8f8f8fff.IWWWWA HL HHf8f8f8f8 H f8f8f8f8Df8f8f8f8f8f8f8f8fIWfff8HL Hf8fff8fHff.f8f8f8f8f8f8 H f8f8f8f8f8f8Df8f8f8f8f8f8f8f8f8f8f8f8IWWfffHL Hf8ffDf8fDHf8f8f8f8f8f8fD8fD8 H f8f8f8f8f8f8fD8fD8Df8f8f8f8f8f8fD8fD8f8f8f8f8f8f8fD8fD8H|$Ht$HHHLLLD$(HXAIHI Wf8 HIf8ffWfW f.L$UH HA)XA)hE)xE)KE)SE)[E)cE)kE)sE){AooE@ fЋi f$AfofofofT$@fT$PfT$`IfT$pI@IP11f:"I@f\$f:"LMPfd$ 1Af:"A1fl$0MHDT$LAMPA1ADL$\A1MHDT$lALERA1A@DL$|Ifot$@fo|$PHHA@HH@A0HL I)ABDf8D1f88D$ A@f818D$f8A@1f88D$,A@f8BL1f88D$VWSUATAUAVAWH@I@xIIqMY8ENL9AIESNL9)IHXIHHhIHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^: @"E #6F A 0P:\ring\pregenerated\tmp\aesni-x86_64-nasm.asmE?@DGHIJKLMNOPSTUVWXYZ[\^ _`abc"d$h0k3l6m:n=o@pCqFrJsOtRuUvYy^zc{h|m}q~uz$).26;@EJOTY_dinsx} "',16;@FLQW\afkpu{  !"#$%&()*+,- ./0123!4&6084:5<<=@>H?P@XA]BbCgDlEqFvG{MNOPQRSTUVWXYZ[]^_`abcdefghijklmnop qrstu v#w(x+y/z4{7|>}B~ELQU[aekov| #(,.39<AFLQV\bhntx~ $+03:?BFKNOTY]bgmswz      !" #$%&'$(*)0*4+7,<-A.D/F0K1P2U3Y4^5c6i7o8s9v:{;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX Y Z [ \ ] ^ _! `' a- b1 d7 f< gA hF iK jP kU l[ ma ne pj qo rt sy t~ u v w x | } ~                       ! ' , 2 7 < A F K P U Z ` f k r x |                               " & , 0 6 : > B H N Q X ] a f k p s x |                                % ) + 0 5 : = C H M Q V [ ` e j n q u y !~ " # $ % ' ) * + , - . / 0 1 2 4 5 6 7 8 : ; < = ? @ A D E F G H I J K# L+ M3 N; OC PK QP RU SZ T_ Ud Vi Wn Xs Yx Z} [ \ ] ^ _ ` a b c d e f g i l m n s w y z { | }      !&-37=BHMSX^cinty "&+/28@EJOSX\aejnrvz  %+06; A F L Q W\bgmrux{ "$%'()*+,-.0134678:;< =>?@B C%D)E-G2J5K7L<N@PGRKSOTSUWV[W_XcZe^p`sawc{d~efghikmnprstuvwxyz{|}  "%),.@P`p    $'+.4;?CFLSZafjnuy}    ^1P:\ring\pregenerated\aesni-x86_64-nasm.objyasm 1.3.0GFp_aes_hw_encryptL$oop_enc1_1_aesni_encrypt2L$enc_loop2_aesni_encrypt3L$enc_loop3_aesni_encrypt4L$enc_loop4_aesni_encrypt6L$enc_loop6_enterL$enc_loop6_aesni_encrypt8L$enc_loop8_innerL$enc_loop8L$enc_loop8_enter)GFp_aes_hw_ctr32_encrypt_blocks5L$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocksL$ctr32_bulkL$oop_enc1_2L$ctr32_epilogueL$ctr32_bodyL$ctr32_tailL$ctr32_6xL$ctr32_loop8L$ctr32_loop6L$ctr32_doneL$ctr32_enc_doneL$ctr32_loop3L$ctr32_loop43L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocks$GFp_aes_hw_set_encrypt_key!__aesni_set_encrypt_keyL$enc_key_retL$14roundsL$bad_keybitsL$10roundsL$10rounds_alt"L$key_expansion_128_coldL$key_expansion_128L$key_rotateL$key_rcon1L$oop_key128L$key_rcon1bL$14rounds_alt#L$key_expansion_256a_coldL$key_expansion_256bL$key_expansion_256aL$oop_key256L$done_key256'L$SEH_end_GFp_set_encrypt_keyL$key_expansion_192a#L$key_expansion_192a_cold#L$key_expansion_192b_warmL$key_expansion_192bL$bswap_maskL$increment32L$increment64L$increment1L$key_rotate192ctr_xts_se_handlerL$common_seh_tail!  L$SEH_info_GFp_ctr32  L$SEH_info_GFp_keyd h " " "" &" :" >" U" Y" l" p" " " " " " " " " " " # # # ## :# ># W# [# n# r# # # # # # # $ $ $ !$ 9$ =$ Q$ U$ i$ m$ $ $ $ $ $ $ $ $ $ $ $! %! %" %" L%# P%# r%$ v%$ %% %% %& %& %' %' %( %( %) %) &* &* 1&+ 5&+ P&, T&, h&- l&- &. &. &/ &/ &0 &0 &1 &1 &2 &2 '3 '3 .'4 2'4 F'5 J'5 _'6 c'6 '7 '7 '8 '8 '9 '9 ': ': (; (; *(< .(< C(= G(= \(> `(> t(? x(? (A (A (B (B (E (E (F (F .fileg.text+9LYPipu0Y ;g0t {:        7 R jGx@!wp 4I^k2ye@P`p+;Reu.pdataw.xdata.debug$S ).debug$T pregenerated\tmp\aesni-x86_64-nasm.asmGFp_ia32cap_PGFp_aes_hw_encryptL$oop_enc1_1_aesni_encrypt2L$enc_loop2_aesni_encrypt3L$enc_loop3_aesni_encrypt4L$enc_loop4_aesni_encrypt6L$enc_loop6_enterL$enc_loop6_aesni_encrypt8L$enc_loop8_innerL$enc_loop8L$enc_loop8_enterGFp_aes_hw_ctr32_encrypt_blocksL$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocksL$ctr32_bulkL$oop_enc1_2L$ctr32_epilogueL$ctr32_bodyL$ctr32_tailL$ctr32_6xL$ctr32_loop8L$ctr32_loop6L$ctr32_doneL$ctr32_enc_doneL$ctr32_loop3L$ctr32_loop4L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocksGFp_aes_hw_set_encrypt_key__aesni_set_encrypt_keyL$enc_key_retL$14roundsL$bad_keybitsL$10roundsL$10rounds_altL$key_expansion_128_coldL$key_expansion_128L$key_rotateL$key_rcon1L$oop_key128L$key_rcon1bL$14rounds_altL$key_expansion_256a_coldL$key_expansion_256bL$key_expansion_256aL$oop_key256L$done_key256L$SEH_end_GFp_set_encrypt_keyL$key_expansion_192aL$key_expansion_192a_coldL$key_expansion_192b_warmL$key_expansion_192bL$bswap_maskL$increment32L$increment64L$increment1L$key_rotate192__imp_RtlVirtualUnwindctr_xts_se_handlerL$common_seh_tailL$SEH_info_GFp_ctr32L$SEH_info_GFp_keyring-0.16.9/pregenerated/aesv8-armx-ios32.S000064400000000000000000000214211353224261000164530ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include #if __ARM_MAX_ARCH__>=7 .text .code 32 #undef __thumb2__ .align 5 Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d @ rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b .text .globl _GFp_aes_hw_set_encrypt_key .private_extern _GFp_aes_hw_set_encrypt_key #ifdef __thumb2__ .thumb_func _GFp_aes_hw_set_encrypt_key #endif .align 5 _GFp_aes_hw_set_encrypt_key: Lenc_key: mov r3,#-1 cmp r0,#0 beq Lenc_key_abort cmp r2,#0 beq Lenc_key_abort mov r3,#-2 cmp r1,#128 blt Lenc_key_abort cmp r1,#256 bgt Lenc_key_abort tst r1,#0x3f bne Lenc_key_abort adr r3,Lrcon cmp r1,#192 veor q0,q0,q0 vld1.8 {q3},[r0]! mov r1,#8 @ reuse r1 vld1.32 {q1,q2},[r3]! blt Loop128 @ 192-bit key support was removed. b L256 .align 4 Loop128: vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 subs r1,r1,#1 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 bne Loop128 vld1.32 {q1},[r3] vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 veor q3,q3,q10 vst1.32 {q3},[r2] add r2,r2,#0x50 mov r12,#10 b Ldone @ 192-bit key support was removed. .align 4 L256: vld1.8 {q8},[r0] mov r1,#7 mov r12,#14 vst1.32 {q3},[r2]! Loop256: vtbl.8 d20,{q8},d4 vtbl.8 d21,{q8},d5 vext.8 q9,q0,q3,#12 vst1.32 {q8},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 subs r1,r1,#1 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 vst1.32 {q3},[r2]! beq Ldone vdup.32 q10,d7[1] vext.8 q9,q0,q8,#12 .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q8,q8,q9 vext.8 q9,q0,q9,#12 veor q8,q8,q9 vext.8 q9,q0,q9,#12 veor q8,q8,q9 veor q8,q8,q10 b Loop256 Ldone: str r12,[r2] mov r3,#0 Lenc_key_abort: mov r0,r3 @ return value bx lr .globl _GFp_aes_hw_encrypt .private_extern _GFp_aes_hw_encrypt #ifdef __thumb2__ .thumb_func _GFp_aes_hw_encrypt #endif .align 5 _GFp_aes_hw_encrypt: ldr r3,[r2,#240] vld1.32 {q0},[r2]! vld1.8 {q2},[r0] sub r3,r3,#2 vld1.32 {q1},[r2]! Loop_enc: .byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q0},[r2]! subs r3,r3,#2 .byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q1},[r2]! bgt Loop_enc .byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q0},[r2] .byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 veor q2,q2,q0 vst1.8 {q2},[r1] bx lr .globl _GFp_aes_hw_decrypt .private_extern _GFp_aes_hw_decrypt #ifdef __thumb2__ .thumb_func _GFp_aes_hw_decrypt #endif .align 5 _GFp_aes_hw_decrypt: ldr r3,[r2,#240] vld1.32 {q0},[r2]! vld1.8 {q2},[r0] sub r3,r3,#2 vld1.32 {q1},[r2]! Loop_dec: .byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q0},[r2]! subs r3,r3,#2 .byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q1},[r2]! bgt Loop_dec .byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q0},[r2] .byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 veor q2,q2,q0 vst1.8 {q2},[r1] bx lr .globl _GFp_aes_hw_ctr32_encrypt_blocks .private_extern _GFp_aes_hw_ctr32_encrypt_blocks #ifdef __thumb2__ .thumb_func _GFp_aes_hw_ctr32_encrypt_blocks #endif .align 5 _GFp_aes_hw_ctr32_encrypt_blocks: mov ip,sp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,lr} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so ldr r4, [ip] @ load remaining arg ldr r5,[r3,#240] ldr r8, [r4, #12] vld1.32 {q0},[r4] vld1.32 {q8,q9},[r3] @ load key schedule... sub r5,r5,#4 mov r12,#16 cmp r2,#2 add r7,r3,r5,lsl#4 @ pointer to last 5 round keys sub r5,r5,#2 vld1.32 {q12,q13},[r7]! vld1.32 {q14,q15},[r7]! vld1.32 {q7},[r7] add r7,r3,#32 mov r6,r5 movlo r12,#0 #ifndef __ARMEB__ rev r8, r8 #endif vorr q1,q0,q0 add r10, r8, #1 vorr q10,q0,q0 add r8, r8, #2 vorr q6,q0,q0 rev r10, r10 vmov.32 d3[1],r10 bls Lctr32_tail rev r12, r8 sub r2,r2,#3 @ bias vmov.32 d21[1],r12 b Loop3x_ctr32 .align 4 Loop3x_ctr32: .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.32 {q8},[r7]! subs r6,r6,#2 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.32 {q9},[r7]! bgt Loop3x_ctr32 .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x83,0xb0,0xf3 @ aesmc q4,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0xa3,0xb0,0xf3 @ aesmc q5,q1 vld1.8 {q2},[r0]! vorr q0,q6,q6 .byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.8 {q3},[r0]! vorr q1,q6,q6 .byte 0x22,0x83,0xb0,0xf3 @ aese q4,q9 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x22,0xa3,0xb0,0xf3 @ aese q5,q9 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 vld1.8 {q11},[r0]! mov r7,r3 .byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 .byte 0xa4,0x23,0xf0,0xf3 @ aesmc q9,q10 vorr q10,q6,q6 add r9,r8,#1 .byte 0x28,0x83,0xb0,0xf3 @ aese q4,q12 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x28,0xa3,0xb0,0xf3 @ aese q5,q12 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 veor q2,q2,q7 add r10,r8,#2 .byte 0x28,0x23,0xf0,0xf3 @ aese q9,q12 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 veor q3,q3,q7 add r8,r8,#3 .byte 0x2a,0x83,0xb0,0xf3 @ aese q4,q13 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x2a,0xa3,0xb0,0xf3 @ aese q5,q13 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 veor q11,q11,q7 rev r9,r9 .byte 0x2a,0x23,0xf0,0xf3 @ aese q9,q13 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 vmov.32 d1[1], r9 rev r10,r10 .byte 0x2c,0x83,0xb0,0xf3 @ aese q4,q14 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x2c,0xa3,0xb0,0xf3 @ aese q5,q14 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 vmov.32 d3[1], r10 rev r12,r8 .byte 0x2c,0x23,0xf0,0xf3 @ aese q9,q14 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 vmov.32 d21[1], r12 subs r2,r2,#3 .byte 0x2e,0x83,0xb0,0xf3 @ aese q4,q15 .byte 0x2e,0xa3,0xb0,0xf3 @ aese q5,q15 .byte 0x2e,0x23,0xf0,0xf3 @ aese q9,q15 veor q2,q2,q4 vld1.32 {q8},[r7]! @ re-pre-load rndkey[0] vst1.8 {q2},[r1]! veor q3,q3,q5 mov r6,r5 vst1.8 {q3},[r1]! veor q11,q11,q9 vld1.32 {q9},[r7]! @ re-pre-load rndkey[1] vst1.8 {q11},[r1]! bhs Loop3x_ctr32 adds r2,r2,#3 beq Lctr32_done cmp r2,#1 mov r12,#16 moveq r12,#0 Lctr32_tail: .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.32 {q8},[r7]! subs r6,r6,#2 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.32 {q9},[r7]! bgt Lctr32_tail .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.8 {q2},[r0],r12 .byte 0x28,0x03,0xb0,0xf3 @ aese q0,q12 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x28,0x23,0xb0,0xf3 @ aese q1,q12 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.8 {q3},[r0] .byte 0x2a,0x03,0xb0,0xf3 @ aese q0,q13 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x2a,0x23,0xb0,0xf3 @ aese q1,q13 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 veor q2,q2,q7 .byte 0x2c,0x03,0xb0,0xf3 @ aese q0,q14 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x2c,0x23,0xb0,0xf3 @ aese q1,q14 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 veor q3,q3,q7 .byte 0x2e,0x03,0xb0,0xf3 @ aese q0,q15 .byte 0x2e,0x23,0xb0,0xf3 @ aese q1,q15 cmp r2,#1 veor q2,q2,q0 veor q3,q3,q1 vst1.8 {q2},[r1]! beq Lctr32_done vst1.8 {q3},[r1] Lctr32_done: vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/aesv8-armx-ios64.S000064400000000000000000000166151353224260500164750ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include #if __ARM_MAX_ARCH__>=7 .text .section __TEXT,__const .align 5 Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b .text .globl _GFp_aes_hw_set_encrypt_key .private_extern _GFp_aes_hw_set_encrypt_key .align 5 _GFp_aes_hw_set_encrypt_key: Lenc_key: stp x29,x30,[sp,#-16]! add x29,sp,#0 mov x3,#-1 cmp x0,#0 b.eq Lenc_key_abort cmp x2,#0 b.eq Lenc_key_abort mov x3,#-2 cmp w1,#128 b.lt Lenc_key_abort cmp w1,#256 b.gt Lenc_key_abort tst w1,#0x3f b.ne Lenc_key_abort adrp x3,Lrcon@PAGE add x3,x3,Lrcon@PAGEOFF cmp w1,#192 eor v0.16b,v0.16b,v0.16b ld1 {v3.16b},[x0],#16 mov w1,#8 // reuse w1 ld1 {v1.4s,v2.4s},[x3],#32 b.lt Loop128 // 192-bit key support was removed. b L256 .align 4 Loop128: tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b subs w1,w1,#1 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b b.ne Loop128 ld1 {v1.4s},[x3] tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b eor v3.16b,v3.16b,v6.16b st1 {v3.4s},[x2] add x2,x2,#0x50 mov w12,#10 b Ldone // 192-bit key support was removed. .align 4 L256: ld1 {v4.16b},[x0] mov w1,#7 mov w12,#14 st1 {v3.4s},[x2],#16 Loop256: tbl v6.16b,{v4.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v4.4s},[x2],#16 aese v6.16b,v0.16b subs w1,w1,#1 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b st1 {v3.4s},[x2],#16 b.eq Ldone dup v6.4s,v3.s[3] // just splat ext v5.16b,v0.16b,v4.16b,#12 aese v6.16b,v0.16b eor v4.16b,v4.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v4.16b,v4.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v4.16b,v4.16b,v5.16b eor v4.16b,v4.16b,v6.16b b Loop256 Ldone: str w12,[x2] mov x3,#0 Lenc_key_abort: mov x0,x3 // return value ldr x29,[sp],#16 ret .globl _GFp_aes_hw_encrypt .private_extern _GFp_aes_hw_encrypt .align 5 _GFp_aes_hw_encrypt: ldr w3,[x2,#240] ld1 {v0.4s},[x2],#16 ld1 {v2.16b},[x0] sub w3,w3,#2 ld1 {v1.4s},[x2],#16 Loop_enc: aese v2.16b,v0.16b aesmc v2.16b,v2.16b ld1 {v0.4s},[x2],#16 subs w3,w3,#2 aese v2.16b,v1.16b aesmc v2.16b,v2.16b ld1 {v1.4s},[x2],#16 b.gt Loop_enc aese v2.16b,v0.16b aesmc v2.16b,v2.16b ld1 {v0.4s},[x2] aese v2.16b,v1.16b eor v2.16b,v2.16b,v0.16b st1 {v2.16b},[x1] ret .globl _GFp_aes_hw_decrypt .private_extern _GFp_aes_hw_decrypt .align 5 _GFp_aes_hw_decrypt: ldr w3,[x2,#240] ld1 {v0.4s},[x2],#16 ld1 {v2.16b},[x0] sub w3,w3,#2 ld1 {v1.4s},[x2],#16 Loop_dec: aesd v2.16b,v0.16b aesimc v2.16b,v2.16b ld1 {v0.4s},[x2],#16 subs w3,w3,#2 aesd v2.16b,v1.16b aesimc v2.16b,v2.16b ld1 {v1.4s},[x2],#16 b.gt Loop_dec aesd v2.16b,v0.16b aesimc v2.16b,v2.16b ld1 {v0.4s},[x2] aesd v2.16b,v1.16b eor v2.16b,v2.16b,v0.16b st1 {v2.16b},[x1] ret .globl _GFp_aes_hw_ctr32_encrypt_blocks .private_extern _GFp_aes_hw_ctr32_encrypt_blocks .align 5 _GFp_aes_hw_ctr32_encrypt_blocks: stp x29,x30,[sp,#-16]! add x29,sp,#0 ldr w5,[x3,#240] ldr w8, [x4, #12] ld1 {v0.4s},[x4] ld1 {v16.4s,v17.4s},[x3] // load key schedule... sub w5,w5,#4 mov x12,#16 cmp x2,#2 add x7,x3,x5,lsl#4 // pointer to last 5 round keys sub w5,w5,#2 ld1 {v20.4s,v21.4s},[x7],#32 ld1 {v22.4s,v23.4s},[x7],#32 ld1 {v7.4s},[x7] add x7,x3,#32 mov w6,w5 csel x12,xzr,x12,lo #ifndef __ARMEB__ rev w8, w8 #endif orr v1.16b,v0.16b,v0.16b add w10, w8, #1 orr v18.16b,v0.16b,v0.16b add w8, w8, #2 orr v6.16b,v0.16b,v0.16b rev w10, w10 mov v1.s[3],w10 b.ls Lctr32_tail rev w12, w8 sub x2,x2,#3 // bias mov v18.s[3],w12 b Loop3x_ctr32 .align 4 Loop3x_ctr32: aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b aese v18.16b,v16.16b aesmc v18.16b,v18.16b ld1 {v16.4s},[x7],#16 subs w6,w6,#2 aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b aese v18.16b,v17.16b aesmc v18.16b,v18.16b ld1 {v17.4s},[x7],#16 b.gt Loop3x_ctr32 aese v0.16b,v16.16b aesmc v4.16b,v0.16b aese v1.16b,v16.16b aesmc v5.16b,v1.16b ld1 {v2.16b},[x0],#16 orr v0.16b,v6.16b,v6.16b aese v18.16b,v16.16b aesmc v18.16b,v18.16b ld1 {v3.16b},[x0],#16 orr v1.16b,v6.16b,v6.16b aese v4.16b,v17.16b aesmc v4.16b,v4.16b aese v5.16b,v17.16b aesmc v5.16b,v5.16b ld1 {v19.16b},[x0],#16 mov x7,x3 aese v18.16b,v17.16b aesmc v17.16b,v18.16b orr v18.16b,v6.16b,v6.16b add w9,w8,#1 aese v4.16b,v20.16b aesmc v4.16b,v4.16b aese v5.16b,v20.16b aesmc v5.16b,v5.16b eor v2.16b,v2.16b,v7.16b add w10,w8,#2 aese v17.16b,v20.16b aesmc v17.16b,v17.16b eor v3.16b,v3.16b,v7.16b add w8,w8,#3 aese v4.16b,v21.16b aesmc v4.16b,v4.16b aese v5.16b,v21.16b aesmc v5.16b,v5.16b eor v19.16b,v19.16b,v7.16b rev w9,w9 aese v17.16b,v21.16b aesmc v17.16b,v17.16b mov v0.s[3], w9 rev w10,w10 aese v4.16b,v22.16b aesmc v4.16b,v4.16b aese v5.16b,v22.16b aesmc v5.16b,v5.16b mov v1.s[3], w10 rev w12,w8 aese v17.16b,v22.16b aesmc v17.16b,v17.16b mov v18.s[3], w12 subs x2,x2,#3 aese v4.16b,v23.16b aese v5.16b,v23.16b aese v17.16b,v23.16b eor v2.16b,v2.16b,v4.16b ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] st1 {v2.16b},[x1],#16 eor v3.16b,v3.16b,v5.16b mov w6,w5 st1 {v3.16b},[x1],#16 eor v19.16b,v19.16b,v17.16b ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] st1 {v19.16b},[x1],#16 b.hs Loop3x_ctr32 adds x2,x2,#3 b.eq Lctr32_done cmp x2,#1 mov x12,#16 csel x12,xzr,x12,eq Lctr32_tail: aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b ld1 {v16.4s},[x7],#16 subs w6,w6,#2 aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b ld1 {v17.4s},[x7],#16 b.gt Lctr32_tail aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b ld1 {v2.16b},[x0],x12 aese v0.16b,v20.16b aesmc v0.16b,v0.16b aese v1.16b,v20.16b aesmc v1.16b,v1.16b ld1 {v3.16b},[x0] aese v0.16b,v21.16b aesmc v0.16b,v0.16b aese v1.16b,v21.16b aesmc v1.16b,v1.16b eor v2.16b,v2.16b,v7.16b aese v0.16b,v22.16b aesmc v0.16b,v0.16b aese v1.16b,v22.16b aesmc v1.16b,v1.16b eor v3.16b,v3.16b,v7.16b aese v0.16b,v23.16b aese v1.16b,v23.16b cmp x2,#1 eor v2.16b,v2.16b,v0.16b eor v3.16b,v3.16b,v1.16b st1 {v2.16b},[x1],#16 b.eq Lctr32_done st1 {v3.16b},[x1] Lctr32_done: ldr x29,[sp],#16 ret #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/aesv8-armx-linux32.S000064400000000000000000000217641353224261100170330ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include #if __ARM_MAX_ARCH__>=7 .text .arch armv7-a @ don't confuse not-so-latest binutils with argv8 :-) .fpu neon .code 32 #undef __thumb2__ .align 5 .Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d @ rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b .text .globl GFp_aes_hw_set_encrypt_key .hidden GFp_aes_hw_set_encrypt_key .type GFp_aes_hw_set_encrypt_key,%function .align 5 GFp_aes_hw_set_encrypt_key: .Lenc_key: mov r3,#-1 cmp r0,#0 beq .Lenc_key_abort cmp r2,#0 beq .Lenc_key_abort mov r3,#-2 cmp r1,#128 blt .Lenc_key_abort cmp r1,#256 bgt .Lenc_key_abort tst r1,#0x3f bne .Lenc_key_abort adr r3,.Lrcon cmp r1,#192 veor q0,q0,q0 vld1.8 {q3},[r0]! mov r1,#8 @ reuse r1 vld1.32 {q1,q2},[r3]! blt .Loop128 @ 192-bit key support was removed. b .L256 .align 4 .Loop128: vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 subs r1,r1,#1 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 bne .Loop128 vld1.32 {q1},[r3] vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 vtbl.8 d20,{q3},d4 vtbl.8 d21,{q3},d5 vext.8 q9,q0,q3,#12 vst1.32 {q3},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 veor q3,q3,q10 vst1.32 {q3},[r2] add r2,r2,#0x50 mov r12,#10 b .Ldone @ 192-bit key support was removed. .align 4 .L256: vld1.8 {q8},[r0] mov r1,#7 mov r12,#14 vst1.32 {q3},[r2]! .Loop256: vtbl.8 d20,{q8},d4 vtbl.8 d21,{q8},d5 vext.8 q9,q0,q3,#12 vst1.32 {q8},[r2]! .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 subs r1,r1,#1 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q3,q3,q9 vext.8 q9,q0,q9,#12 veor q10,q10,q1 veor q3,q3,q9 vshl.u8 q1,q1,#1 veor q3,q3,q10 vst1.32 {q3},[r2]! beq .Ldone vdup.32 q10,d7[1] vext.8 q9,q0,q8,#12 .byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 veor q8,q8,q9 vext.8 q9,q0,q9,#12 veor q8,q8,q9 vext.8 q9,q0,q9,#12 veor q8,q8,q9 veor q8,q8,q10 b .Loop256 .Ldone: str r12,[r2] mov r3,#0 .Lenc_key_abort: mov r0,r3 @ return value bx lr .size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key .globl GFp_aes_hw_encrypt .hidden GFp_aes_hw_encrypt .type GFp_aes_hw_encrypt,%function .align 5 GFp_aes_hw_encrypt: ldr r3,[r2,#240] vld1.32 {q0},[r2]! vld1.8 {q2},[r0] sub r3,r3,#2 vld1.32 {q1},[r2]! .Loop_enc: .byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q0},[r2]! subs r3,r3,#2 .byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q1},[r2]! bgt .Loop_enc .byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 .byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 vld1.32 {q0},[r2] .byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 veor q2,q2,q0 vst1.8 {q2},[r1] bx lr .size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt .globl GFp_aes_hw_decrypt .hidden GFp_aes_hw_decrypt .type GFp_aes_hw_decrypt,%function .align 5 GFp_aes_hw_decrypt: ldr r3,[r2,#240] vld1.32 {q0},[r2]! vld1.8 {q2},[r0] sub r3,r3,#2 vld1.32 {q1},[r2]! .Loop_dec: .byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q0},[r2]! subs r3,r3,#2 .byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q1},[r2]! bgt .Loop_dec .byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 .byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 vld1.32 {q0},[r2] .byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 veor q2,q2,q0 vst1.8 {q2},[r1] bx lr .size GFp_aes_hw_decrypt,.-GFp_aes_hw_decrypt .globl GFp_aes_hw_ctr32_encrypt_blocks .hidden GFp_aes_hw_ctr32_encrypt_blocks .type GFp_aes_hw_ctr32_encrypt_blocks,%function .align 5 GFp_aes_hw_ctr32_encrypt_blocks: mov ip,sp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,lr} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so ldr r4, [ip] @ load remaining arg ldr r5,[r3,#240] ldr r8, [r4, #12] vld1.32 {q0},[r4] vld1.32 {q8,q9},[r3] @ load key schedule... sub r5,r5,#4 mov r12,#16 cmp r2,#2 add r7,r3,r5,lsl#4 @ pointer to last 5 round keys sub r5,r5,#2 vld1.32 {q12,q13},[r7]! vld1.32 {q14,q15},[r7]! vld1.32 {q7},[r7] add r7,r3,#32 mov r6,r5 movlo r12,#0 #ifndef __ARMEB__ rev r8, r8 #endif vorr q1,q0,q0 add r10, r8, #1 vorr q10,q0,q0 add r8, r8, #2 vorr q6,q0,q0 rev r10, r10 vmov.32 d3[1],r10 bls .Lctr32_tail rev r12, r8 sub r2,r2,#3 @ bias vmov.32 d21[1],r12 b .Loop3x_ctr32 .align 4 .Loop3x_ctr32: .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.32 {q8},[r7]! subs r6,r6,#2 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.32 {q9},[r7]! bgt .Loop3x_ctr32 .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x83,0xb0,0xf3 @ aesmc q4,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0xa3,0xb0,0xf3 @ aesmc q5,q1 vld1.8 {q2},[r0]! vorr q0,q6,q6 .byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 .byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 vld1.8 {q3},[r0]! vorr q1,q6,q6 .byte 0x22,0x83,0xb0,0xf3 @ aese q4,q9 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x22,0xa3,0xb0,0xf3 @ aese q5,q9 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 vld1.8 {q11},[r0]! mov r7,r3 .byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 .byte 0xa4,0x23,0xf0,0xf3 @ aesmc q9,q10 vorr q10,q6,q6 add r9,r8,#1 .byte 0x28,0x83,0xb0,0xf3 @ aese q4,q12 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x28,0xa3,0xb0,0xf3 @ aese q5,q12 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 veor q2,q2,q7 add r10,r8,#2 .byte 0x28,0x23,0xf0,0xf3 @ aese q9,q12 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 veor q3,q3,q7 add r8,r8,#3 .byte 0x2a,0x83,0xb0,0xf3 @ aese q4,q13 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x2a,0xa3,0xb0,0xf3 @ aese q5,q13 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 veor q11,q11,q7 rev r9,r9 .byte 0x2a,0x23,0xf0,0xf3 @ aese q9,q13 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 vmov.32 d1[1], r9 rev r10,r10 .byte 0x2c,0x83,0xb0,0xf3 @ aese q4,q14 .byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 .byte 0x2c,0xa3,0xb0,0xf3 @ aese q5,q14 .byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 vmov.32 d3[1], r10 rev r12,r8 .byte 0x2c,0x23,0xf0,0xf3 @ aese q9,q14 .byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 vmov.32 d21[1], r12 subs r2,r2,#3 .byte 0x2e,0x83,0xb0,0xf3 @ aese q4,q15 .byte 0x2e,0xa3,0xb0,0xf3 @ aese q5,q15 .byte 0x2e,0x23,0xf0,0xf3 @ aese q9,q15 veor q2,q2,q4 vld1.32 {q8},[r7]! @ re-pre-load rndkey[0] vst1.8 {q2},[r1]! veor q3,q3,q5 mov r6,r5 vst1.8 {q3},[r1]! veor q11,q11,q9 vld1.32 {q9},[r7]! @ re-pre-load rndkey[1] vst1.8 {q11},[r1]! bhs .Loop3x_ctr32 adds r2,r2,#3 beq .Lctr32_done cmp r2,#1 mov r12,#16 moveq r12,#0 .Lctr32_tail: .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.32 {q8},[r7]! subs r6,r6,#2 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.32 {q9},[r7]! bgt .Lctr32_tail .byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 .byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.8 {q2},[r0],r12 .byte 0x28,0x03,0xb0,0xf3 @ aese q0,q12 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x28,0x23,0xb0,0xf3 @ aese q1,q12 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 vld1.8 {q3},[r0] .byte 0x2a,0x03,0xb0,0xf3 @ aese q0,q13 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x2a,0x23,0xb0,0xf3 @ aese q1,q13 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 veor q2,q2,q7 .byte 0x2c,0x03,0xb0,0xf3 @ aese q0,q14 .byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 .byte 0x2c,0x23,0xb0,0xf3 @ aese q1,q14 .byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 veor q3,q3,q7 .byte 0x2e,0x03,0xb0,0xf3 @ aese q0,q15 .byte 0x2e,0x23,0xb0,0xf3 @ aese q1,q15 cmp r2,#1 veor q2,q2,q0 veor q3,q3,q1 vst1.8 {q2},[r1]! beq .Lctr32_done vst1.8 {q3},[r1] .Lctr32_done: vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} .size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/aesv8-armx-linux64.S000064400000000000000000000174441353224260600170440ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) #include #if __ARM_MAX_ARCH__>=7 .text .arch armv8-a+crypto .section .rodata .align 5 .Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b .text .globl GFp_aes_hw_set_encrypt_key .hidden GFp_aes_hw_set_encrypt_key .type GFp_aes_hw_set_encrypt_key,%function .align 5 GFp_aes_hw_set_encrypt_key: .Lenc_key: stp x29,x30,[sp,#-16]! add x29,sp,#0 mov x3,#-1 cmp x0,#0 b.eq .Lenc_key_abort cmp x2,#0 b.eq .Lenc_key_abort mov x3,#-2 cmp w1,#128 b.lt .Lenc_key_abort cmp w1,#256 b.gt .Lenc_key_abort tst w1,#0x3f b.ne .Lenc_key_abort adrp x3,.Lrcon add x3,x3,:lo12:.Lrcon cmp w1,#192 eor v0.16b,v0.16b,v0.16b ld1 {v3.16b},[x0],#16 mov w1,#8 // reuse w1 ld1 {v1.4s,v2.4s},[x3],#32 b.lt .Loop128 // 192-bit key support was removed. b .L256 .align 4 .Loop128: tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b subs w1,w1,#1 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b b.ne .Loop128 ld1 {v1.4s},[x3] tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b tbl v6.16b,{v3.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v3.4s},[x2],#16 aese v6.16b,v0.16b eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b eor v3.16b,v3.16b,v6.16b st1 {v3.4s},[x2] add x2,x2,#0x50 mov w12,#10 b .Ldone // 192-bit key support was removed. .align 4 .L256: ld1 {v4.16b},[x0] mov w1,#7 mov w12,#14 st1 {v3.4s},[x2],#16 .Loop256: tbl v6.16b,{v4.16b},v2.16b ext v5.16b,v0.16b,v3.16b,#12 st1 {v4.4s},[x2],#16 aese v6.16b,v0.16b subs w1,w1,#1 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v3.16b,v3.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v6.16b,v6.16b,v1.16b eor v3.16b,v3.16b,v5.16b shl v1.16b,v1.16b,#1 eor v3.16b,v3.16b,v6.16b st1 {v3.4s},[x2],#16 b.eq .Ldone dup v6.4s,v3.s[3] // just splat ext v5.16b,v0.16b,v4.16b,#12 aese v6.16b,v0.16b eor v4.16b,v4.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v4.16b,v4.16b,v5.16b ext v5.16b,v0.16b,v5.16b,#12 eor v4.16b,v4.16b,v5.16b eor v4.16b,v4.16b,v6.16b b .Loop256 .Ldone: str w12,[x2] mov x3,#0 .Lenc_key_abort: mov x0,x3 // return value ldr x29,[sp],#16 ret .size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key .globl GFp_aes_hw_encrypt .hidden GFp_aes_hw_encrypt .type GFp_aes_hw_encrypt,%function .align 5 GFp_aes_hw_encrypt: ldr w3,[x2,#240] ld1 {v0.4s},[x2],#16 ld1 {v2.16b},[x0] sub w3,w3,#2 ld1 {v1.4s},[x2],#16 .Loop_enc: aese v2.16b,v0.16b aesmc v2.16b,v2.16b ld1 {v0.4s},[x2],#16 subs w3,w3,#2 aese v2.16b,v1.16b aesmc v2.16b,v2.16b ld1 {v1.4s},[x2],#16 b.gt .Loop_enc aese v2.16b,v0.16b aesmc v2.16b,v2.16b ld1 {v0.4s},[x2] aese v2.16b,v1.16b eor v2.16b,v2.16b,v0.16b st1 {v2.16b},[x1] ret .size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt .globl GFp_aes_hw_decrypt .hidden GFp_aes_hw_decrypt .type GFp_aes_hw_decrypt,%function .align 5 GFp_aes_hw_decrypt: ldr w3,[x2,#240] ld1 {v0.4s},[x2],#16 ld1 {v2.16b},[x0] sub w3,w3,#2 ld1 {v1.4s},[x2],#16 .Loop_dec: aesd v2.16b,v0.16b aesimc v2.16b,v2.16b ld1 {v0.4s},[x2],#16 subs w3,w3,#2 aesd v2.16b,v1.16b aesimc v2.16b,v2.16b ld1 {v1.4s},[x2],#16 b.gt .Loop_dec aesd v2.16b,v0.16b aesimc v2.16b,v2.16b ld1 {v0.4s},[x2] aesd v2.16b,v1.16b eor v2.16b,v2.16b,v0.16b st1 {v2.16b},[x1] ret .size GFp_aes_hw_decrypt,.-GFp_aes_hw_decrypt .globl GFp_aes_hw_ctr32_encrypt_blocks .hidden GFp_aes_hw_ctr32_encrypt_blocks .type GFp_aes_hw_ctr32_encrypt_blocks,%function .align 5 GFp_aes_hw_ctr32_encrypt_blocks: stp x29,x30,[sp,#-16]! add x29,sp,#0 ldr w5,[x3,#240] ldr w8, [x4, #12] ld1 {v0.4s},[x4] ld1 {v16.4s,v17.4s},[x3] // load key schedule... sub w5,w5,#4 mov x12,#16 cmp x2,#2 add x7,x3,x5,lsl#4 // pointer to last 5 round keys sub w5,w5,#2 ld1 {v20.4s,v21.4s},[x7],#32 ld1 {v22.4s,v23.4s},[x7],#32 ld1 {v7.4s},[x7] add x7,x3,#32 mov w6,w5 csel x12,xzr,x12,lo #ifndef __ARMEB__ rev w8, w8 #endif orr v1.16b,v0.16b,v0.16b add w10, w8, #1 orr v18.16b,v0.16b,v0.16b add w8, w8, #2 orr v6.16b,v0.16b,v0.16b rev w10, w10 mov v1.s[3],w10 b.ls .Lctr32_tail rev w12, w8 sub x2,x2,#3 // bias mov v18.s[3],w12 b .Loop3x_ctr32 .align 4 .Loop3x_ctr32: aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b aese v18.16b,v16.16b aesmc v18.16b,v18.16b ld1 {v16.4s},[x7],#16 subs w6,w6,#2 aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b aese v18.16b,v17.16b aesmc v18.16b,v18.16b ld1 {v17.4s},[x7],#16 b.gt .Loop3x_ctr32 aese v0.16b,v16.16b aesmc v4.16b,v0.16b aese v1.16b,v16.16b aesmc v5.16b,v1.16b ld1 {v2.16b},[x0],#16 orr v0.16b,v6.16b,v6.16b aese v18.16b,v16.16b aesmc v18.16b,v18.16b ld1 {v3.16b},[x0],#16 orr v1.16b,v6.16b,v6.16b aese v4.16b,v17.16b aesmc v4.16b,v4.16b aese v5.16b,v17.16b aesmc v5.16b,v5.16b ld1 {v19.16b},[x0],#16 mov x7,x3 aese v18.16b,v17.16b aesmc v17.16b,v18.16b orr v18.16b,v6.16b,v6.16b add w9,w8,#1 aese v4.16b,v20.16b aesmc v4.16b,v4.16b aese v5.16b,v20.16b aesmc v5.16b,v5.16b eor v2.16b,v2.16b,v7.16b add w10,w8,#2 aese v17.16b,v20.16b aesmc v17.16b,v17.16b eor v3.16b,v3.16b,v7.16b add w8,w8,#3 aese v4.16b,v21.16b aesmc v4.16b,v4.16b aese v5.16b,v21.16b aesmc v5.16b,v5.16b eor v19.16b,v19.16b,v7.16b rev w9,w9 aese v17.16b,v21.16b aesmc v17.16b,v17.16b mov v0.s[3], w9 rev w10,w10 aese v4.16b,v22.16b aesmc v4.16b,v4.16b aese v5.16b,v22.16b aesmc v5.16b,v5.16b mov v1.s[3], w10 rev w12,w8 aese v17.16b,v22.16b aesmc v17.16b,v17.16b mov v18.s[3], w12 subs x2,x2,#3 aese v4.16b,v23.16b aese v5.16b,v23.16b aese v17.16b,v23.16b eor v2.16b,v2.16b,v4.16b ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] st1 {v2.16b},[x1],#16 eor v3.16b,v3.16b,v5.16b mov w6,w5 st1 {v3.16b},[x1],#16 eor v19.16b,v19.16b,v17.16b ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] st1 {v19.16b},[x1],#16 b.hs .Loop3x_ctr32 adds x2,x2,#3 b.eq .Lctr32_done cmp x2,#1 mov x12,#16 csel x12,xzr,x12,eq .Lctr32_tail: aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b ld1 {v16.4s},[x7],#16 subs w6,w6,#2 aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b ld1 {v17.4s},[x7],#16 b.gt .Lctr32_tail aese v0.16b,v16.16b aesmc v0.16b,v0.16b aese v1.16b,v16.16b aesmc v1.16b,v1.16b aese v0.16b,v17.16b aesmc v0.16b,v0.16b aese v1.16b,v17.16b aesmc v1.16b,v1.16b ld1 {v2.16b},[x0],x12 aese v0.16b,v20.16b aesmc v0.16b,v0.16b aese v1.16b,v20.16b aesmc v1.16b,v1.16b ld1 {v3.16b},[x0] aese v0.16b,v21.16b aesmc v0.16b,v0.16b aese v1.16b,v21.16b aesmc v1.16b,v1.16b eor v2.16b,v2.16b,v7.16b aese v0.16b,v22.16b aesmc v0.16b,v0.16b aese v1.16b,v22.16b aesmc v1.16b,v1.16b eor v3.16b,v3.16b,v7.16b aese v0.16b,v23.16b aese v1.16b,v23.16b cmp x2,#1 eor v2.16b,v2.16b,v0.16b eor v3.16b,v3.16b,v1.16b st1 {v2.16b},[x1],#16 b.eq .Lctr32_done st1 {v3.16b},[x1] .Lctr32_done: ldr x29,[sp],#16 ret .size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/armv4-mont-ios32.S000064400000000000000000000533341353224261000164740ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif #if __ARM_MAX_ARCH__>=7 .align 5 LOPENSSL_armcap: .word GFp_armcap_P-Lbn_mul_mont #endif .globl _GFp_bn_mul_mont .private_extern _GFp_bn_mul_mont #ifdef __thumb2__ .thumb_func _GFp_bn_mul_mont #endif .align 5 _GFp_bn_mul_mont: Lbn_mul_mont: ldr ip,[sp,#4] @ load num stmdb sp!,{r0,r2} @ sp points at argument block #if __ARM_MAX_ARCH__>=7 tst ip,#7 bne Lialu adr r0,Lbn_mul_mont ldr r2,LOPENSSL_armcap ldr r0,[r0,r2] #ifdef __APPLE__ ldr r0,[r0] #endif tst r0,#ARMV7_NEON @ NEON available? ldmia sp, {r0,r2} beq Lialu add sp,sp,#8 b bn_mul8x_mont_neon .align 4 Lialu: #endif cmp ip,#2 mov r0,ip @ load num #ifdef __thumb2__ ittt lt #endif movlt r0,#0 addlt sp,sp,#2*4 blt Labrt stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers mov r0,r0,lsl#2 @ rescale r0 for byte count sub sp,sp,r0 @ alloca(4*num) sub sp,sp,#4 @ +extra dword sub r0,r0,#4 @ "num=num-1" add r4,r2,r0 @ &bp[num-1] add r0,sp,r0 @ r0 to point at &tp[num-1] ldr r8,[r0,#14*4] @ &n0 ldr r2,[r2] @ bp[0] ldr r5,[r1],#4 @ ap[0],ap++ ldr r6,[r3],#4 @ np[0],np++ ldr r8,[r8] @ *n0 str r4,[r0,#15*4] @ save &bp[num] umull r10,r11,r5,r2 @ ap[0]*bp[0] str r8,[r0,#14*4] @ save n0 value mul r8,r10,r8 @ "tp[0]"*n0 mov r12,#0 umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]" mov r4,sp L1st: ldr r5,[r1],#4 @ ap[j],ap++ mov r10,r11 ldr r6,[r3],#4 @ np[j],np++ mov r11,#0 umlal r10,r11,r5,r2 @ ap[j]*bp[0] mov r14,#0 umlal r12,r14,r6,r8 @ np[j]*n0 adds r12,r12,r10 str r12,[r4],#4 @ tp[j-1]=,tp++ adc r12,r14,#0 cmp r4,r0 bne L1st adds r12,r12,r11 ldr r4,[r0,#13*4] @ restore bp mov r14,#0 ldr r8,[r0,#14*4] @ restore n0 adc r14,r14,#0 str r12,[r0] @ tp[num-1]= mov r7,sp str r14,[r0,#4] @ tp[num]= Louter: sub r7,r0,r7 @ "original" r0-1 value sub r1,r1,r7 @ "rewind" ap to &ap[1] ldr r2,[r4,#4]! @ *(++bp) sub r3,r3,r7 @ "rewind" np to &np[1] ldr r5,[r1,#-4] @ ap[0] ldr r10,[sp] @ tp[0] ldr r6,[r3,#-4] @ np[0] ldr r7,[sp,#4] @ tp[1] mov r11,#0 umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0] str r4,[r0,#13*4] @ save bp mul r8,r10,r8 mov r12,#0 umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]" mov r4,sp Linner: ldr r5,[r1],#4 @ ap[j],ap++ adds r10,r11,r7 @ +=tp[j] ldr r6,[r3],#4 @ np[j],np++ mov r11,#0 umlal r10,r11,r5,r2 @ ap[j]*bp[i] mov r14,#0 umlal r12,r14,r6,r8 @ np[j]*n0 adc r11,r11,#0 ldr r7,[r4,#8] @ tp[j+1] adds r12,r12,r10 str r12,[r4],#4 @ tp[j-1]=,tp++ adc r12,r14,#0 cmp r4,r0 bne Linner adds r12,r12,r11 mov r14,#0 ldr r4,[r0,#13*4] @ restore bp adc r14,r14,#0 ldr r8,[r0,#14*4] @ restore n0 adds r12,r12,r7 ldr r7,[r0,#15*4] @ restore &bp[num] adc r14,r14,#0 str r12,[r0] @ tp[num-1]= str r14,[r0,#4] @ tp[num]= cmp r4,r7 #ifdef __thumb2__ itt ne #endif movne r7,sp bne Louter ldr r2,[r0,#12*4] @ pull rp mov r5,sp add r0,r0,#4 @ r0 to point at &tp[num] sub r5,r0,r5 @ "original" num value mov r4,sp @ "rewind" r4 mov r1,r4 @ "borrow" r1 sub r3,r3,r5 @ "rewind" r3 to &np[0] subs r7,r7,r7 @ "clear" carry flag Lsub: ldr r7,[r4],#4 ldr r6,[r3],#4 sbcs r7,r7,r6 @ tp[j]-np[j] str r7,[r2],#4 @ rp[j]= teq r4,r0 @ preserve carry bne Lsub sbcs r14,r14,#0 @ upmost carry mov r4,sp @ "rewind" r4 sub r2,r2,r5 @ "rewind" r2 Lcopy: ldr r7,[r4] @ conditional copy ldr r5,[r2] str sp,[r4],#4 @ zap tp #ifdef __thumb2__ it cc #endif movcc r5,r7 str r5,[r2],#4 teq r4,r0 @ preserve carry bne Lcopy mov sp,r0 add sp,sp,#4 @ skip over tp[num+1] ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers add sp,sp,#2*4 @ skip over {r0,r2} mov r0,#1 Labrt: #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #if __ARM_MAX_ARCH__>=7 #ifdef __thumb2__ .thumb_func bn_mul8x_mont_neon #endif .align 5 bn_mul8x_mont_neon: mov ip,sp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so ldmia ip,{r4,r5} @ load rest of parameter block mov ip,sp cmp r5,#8 bhi LNEON_8n @ special case for r5==8, everything is in register bank... vld1.32 {d28[0]}, [r2,:32]! veor d8,d8,d8 sub r7,sp,r5,lsl#4 vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-( and r7,r7,#-64 vld1.32 {d30[0]}, [r4,:32] mov sp,r7 @ alloca vzip.16 d28,d8 vmull.u32 q6,d28,d0[0] vmull.u32 q7,d28,d0[1] vmull.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmull.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 veor d8,d8,d8 vmul.u32 d29,d29,d30 vmull.u32 q10,d28,d2[0] vld1.32 {d4,d5,d6,d7}, [r3]! vmull.u32 q11,d28,d2[1] vmull.u32 q12,d28,d3[0] vzip.16 d29,d8 vmull.u32 q13,d28,d3[1] vmlal.u32 q6,d29,d4[0] sub r9,r5,#1 vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmov q5,q6 vmlal.u32 q11,d29,d6[1] vmov q6,q7 vmlal.u32 q12,d29,d7[0] vmov q7,q8 vmlal.u32 q13,d29,d7[1] vmov q8,q9 vmov q9,q10 vshr.u64 d10,d10,#16 vmov q10,q11 vmov q11,q12 vadd.u64 d10,d10,d11 vmov q12,q13 veor q13,q13 vshr.u64 d10,d10,#16 b LNEON_outer8 .align 4 LNEON_outer8: vld1.32 {d28[0]}, [r2,:32]! veor d8,d8,d8 vzip.16 d28,d8 vadd.u64 d12,d12,d10 vmlal.u32 q6,d28,d0[0] vmlal.u32 q7,d28,d0[1] vmlal.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmlal.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 veor d8,d8,d8 subs r9,r9,#1 vmul.u32 d29,d29,d30 vmlal.u32 q10,d28,d2[0] vmlal.u32 q11,d28,d2[1] vmlal.u32 q12,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q13,d28,d3[1] vmlal.u32 q6,d29,d4[0] vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmov q5,q6 vmlal.u32 q11,d29,d6[1] vmov q6,q7 vmlal.u32 q12,d29,d7[0] vmov q7,q8 vmlal.u32 q13,d29,d7[1] vmov q8,q9 vmov q9,q10 vshr.u64 d10,d10,#16 vmov q10,q11 vmov q11,q12 vadd.u64 d10,d10,d11 vmov q12,q13 veor q13,q13 vshr.u64 d10,d10,#16 bne LNEON_outer8 vadd.u64 d12,d12,d10 mov r7,sp vshr.u64 d10,d12,#16 mov r8,r5 vadd.u64 d13,d13,d10 add r6,sp,#96 vshr.u64 d10,d13,#16 vzip.16 d12,d13 b LNEON_tail_entry .align 4 LNEON_8n: veor q6,q6,q6 sub r7,sp,#128 veor q7,q7,q7 sub r7,r7,r5,lsl#4 veor q8,q8,q8 and r7,r7,#-64 veor q9,q9,q9 mov sp,r7 @ alloca veor q10,q10,q10 add r7,r7,#256 veor q11,q11,q11 sub r8,r5,#8 veor q12,q12,q12 veor q13,q13,q13 LNEON_8n_init: vst1.64 {q6,q7},[r7,:256]! subs r8,r8,#8 vst1.64 {q8,q9},[r7,:256]! vst1.64 {q10,q11},[r7,:256]! vst1.64 {q12,q13},[r7,:256]! bne LNEON_8n_init add r6,sp,#256 vld1.32 {d0,d1,d2,d3},[r1]! add r10,sp,#8 vld1.32 {d30[0]},[r4,:32] mov r9,r5 b LNEON_8n_outer .align 4 LNEON_8n_outer: vld1.32 {d28[0]},[r2,:32]! @ *b++ veor d8,d8,d8 vzip.16 d28,d8 add r7,sp,#128 vld1.32 {d4,d5,d6,d7},[r3]! vmlal.u32 q6,d28,d0[0] vmlal.u32 q7,d28,d0[1] veor d8,d8,d8 vmlal.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmlal.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 vmlal.u32 q10,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q11,d28,d2[1] vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0] vmlal.u32 q12,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q13,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q6,d29,d4[0] veor d10,d10,d10 vmlal.u32 q7,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q8,d29,d5[0] vshr.u64 d12,d12,#16 vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vadd.u64 d12,d12,d13 vmlal.u32 q11,d29,d6[1] vshr.u64 d12,d12,#16 vmlal.u32 q12,d29,d7[0] vmlal.u32 q13,d29,d7[1] vadd.u64 d14,d14,d12 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0] vmlal.u32 q7,d28,d0[0] vld1.64 {q6},[r6,:128]! vmlal.u32 q8,d28,d0[1] veor d8,d8,d8 vmlal.u32 q9,d28,d1[0] vshl.i64 d29,d15,#16 vmlal.u32 q10,d28,d1[1] vadd.u64 d29,d29,d14 vmlal.u32 q11,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q12,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1] vmlal.u32 q13,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q6,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q7,d29,d4[0] veor d10,d10,d10 vmlal.u32 q8,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q9,d29,d5[0] vshr.u64 d14,d14,#16 vmlal.u32 q10,d29,d5[1] vmlal.u32 q11,d29,d6[0] vadd.u64 d14,d14,d15 vmlal.u32 q12,d29,d6[1] vshr.u64 d14,d14,#16 vmlal.u32 q13,d29,d7[0] vmlal.u32 q6,d29,d7[1] vadd.u64 d16,d16,d14 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1] vmlal.u32 q8,d28,d0[0] vld1.64 {q7},[r6,:128]! vmlal.u32 q9,d28,d0[1] veor d8,d8,d8 vmlal.u32 q10,d28,d1[0] vshl.i64 d29,d17,#16 vmlal.u32 q11,d28,d1[1] vadd.u64 d29,d29,d16 vmlal.u32 q12,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q13,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2] vmlal.u32 q6,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q7,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q8,d29,d4[0] veor d10,d10,d10 vmlal.u32 q9,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q10,d29,d5[0] vshr.u64 d16,d16,#16 vmlal.u32 q11,d29,d5[1] vmlal.u32 q12,d29,d6[0] vadd.u64 d16,d16,d17 vmlal.u32 q13,d29,d6[1] vshr.u64 d16,d16,#16 vmlal.u32 q6,d29,d7[0] vmlal.u32 q7,d29,d7[1] vadd.u64 d18,d18,d16 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2] vmlal.u32 q9,d28,d0[0] vld1.64 {q8},[r6,:128]! vmlal.u32 q10,d28,d0[1] veor d8,d8,d8 vmlal.u32 q11,d28,d1[0] vshl.i64 d29,d19,#16 vmlal.u32 q12,d28,d1[1] vadd.u64 d29,d29,d18 vmlal.u32 q13,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q6,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3] vmlal.u32 q7,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q8,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q9,d29,d4[0] veor d10,d10,d10 vmlal.u32 q10,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q11,d29,d5[0] vshr.u64 d18,d18,#16 vmlal.u32 q12,d29,d5[1] vmlal.u32 q13,d29,d6[0] vadd.u64 d18,d18,d19 vmlal.u32 q6,d29,d6[1] vshr.u64 d18,d18,#16 vmlal.u32 q7,d29,d7[0] vmlal.u32 q8,d29,d7[1] vadd.u64 d20,d20,d18 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3] vmlal.u32 q10,d28,d0[0] vld1.64 {q9},[r6,:128]! vmlal.u32 q11,d28,d0[1] veor d8,d8,d8 vmlal.u32 q12,d28,d1[0] vshl.i64 d29,d21,#16 vmlal.u32 q13,d28,d1[1] vadd.u64 d29,d29,d20 vmlal.u32 q6,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q7,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4] vmlal.u32 q8,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q9,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q10,d29,d4[0] veor d10,d10,d10 vmlal.u32 q11,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q12,d29,d5[0] vshr.u64 d20,d20,#16 vmlal.u32 q13,d29,d5[1] vmlal.u32 q6,d29,d6[0] vadd.u64 d20,d20,d21 vmlal.u32 q7,d29,d6[1] vshr.u64 d20,d20,#16 vmlal.u32 q8,d29,d7[0] vmlal.u32 q9,d29,d7[1] vadd.u64 d22,d22,d20 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4] vmlal.u32 q11,d28,d0[0] vld1.64 {q10},[r6,:128]! vmlal.u32 q12,d28,d0[1] veor d8,d8,d8 vmlal.u32 q13,d28,d1[0] vshl.i64 d29,d23,#16 vmlal.u32 q6,d28,d1[1] vadd.u64 d29,d29,d22 vmlal.u32 q7,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q8,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5] vmlal.u32 q9,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q10,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q11,d29,d4[0] veor d10,d10,d10 vmlal.u32 q12,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q13,d29,d5[0] vshr.u64 d22,d22,#16 vmlal.u32 q6,d29,d5[1] vmlal.u32 q7,d29,d6[0] vadd.u64 d22,d22,d23 vmlal.u32 q8,d29,d6[1] vshr.u64 d22,d22,#16 vmlal.u32 q9,d29,d7[0] vmlal.u32 q10,d29,d7[1] vadd.u64 d24,d24,d22 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5] vmlal.u32 q12,d28,d0[0] vld1.64 {q11},[r6,:128]! vmlal.u32 q13,d28,d0[1] veor d8,d8,d8 vmlal.u32 q6,d28,d1[0] vshl.i64 d29,d25,#16 vmlal.u32 q7,d28,d1[1] vadd.u64 d29,d29,d24 vmlal.u32 q8,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q9,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6] vmlal.u32 q10,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q11,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q12,d29,d4[0] veor d10,d10,d10 vmlal.u32 q13,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q6,d29,d5[0] vshr.u64 d24,d24,#16 vmlal.u32 q7,d29,d5[1] vmlal.u32 q8,d29,d6[0] vadd.u64 d24,d24,d25 vmlal.u32 q9,d29,d6[1] vshr.u64 d24,d24,#16 vmlal.u32 q10,d29,d7[0] vmlal.u32 q11,d29,d7[1] vadd.u64 d26,d26,d24 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6] vmlal.u32 q13,d28,d0[0] vld1.64 {q12},[r6,:128]! vmlal.u32 q6,d28,d0[1] veor d8,d8,d8 vmlal.u32 q7,d28,d1[0] vshl.i64 d29,d27,#16 vmlal.u32 q8,d28,d1[1] vadd.u64 d29,d29,d26 vmlal.u32 q9,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q10,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7] vmlal.u32 q11,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q12,d28,d3[1] vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 q13,d29,d4[0] vld1.32 {d0,d1,d2,d3},[r1]! vmlal.u32 q6,d29,d4[1] vmlal.u32 q7,d29,d5[0] vshr.u64 d26,d26,#16 vmlal.u32 q8,d29,d5[1] vmlal.u32 q9,d29,d6[0] vadd.u64 d26,d26,d27 vmlal.u32 q10,d29,d6[1] vshr.u64 d26,d26,#16 vmlal.u32 q11,d29,d7[0] vmlal.u32 q12,d29,d7[1] vadd.u64 d12,d12,d26 vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7] add r10,sp,#8 @ rewind sub r8,r5,#8 b LNEON_8n_inner .align 4 LNEON_8n_inner: subs r8,r8,#8 vmlal.u32 q6,d28,d0[0] vld1.64 {q13},[r6,:128] vmlal.u32 q7,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0] vmlal.u32 q8,d28,d1[0] vld1.32 {d4,d5,d6,d7},[r3]! vmlal.u32 q9,d28,d1[1] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q10,d28,d2[0] vmlal.u32 q11,d28,d2[1] vmlal.u32 q12,d28,d3[0] vmlal.u32 q13,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1] vmlal.u32 q6,d29,d4[0] vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmlal.u32 q11,d29,d6[1] vmlal.u32 q12,d29,d7[0] vmlal.u32 q13,d29,d7[1] vst1.64 {q6},[r7,:128]! vmlal.u32 q7,d28,d0[0] vld1.64 {q6},[r6,:128] vmlal.u32 q8,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1] vmlal.u32 q9,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q10,d28,d1[1] vmlal.u32 q11,d28,d2[0] vmlal.u32 q12,d28,d2[1] vmlal.u32 q13,d28,d3[0] vmlal.u32 q6,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2] vmlal.u32 q7,d29,d4[0] vmlal.u32 q8,d29,d4[1] vmlal.u32 q9,d29,d5[0] vmlal.u32 q10,d29,d5[1] vmlal.u32 q11,d29,d6[0] vmlal.u32 q12,d29,d6[1] vmlal.u32 q13,d29,d7[0] vmlal.u32 q6,d29,d7[1] vst1.64 {q7},[r7,:128]! vmlal.u32 q8,d28,d0[0] vld1.64 {q7},[r6,:128] vmlal.u32 q9,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2] vmlal.u32 q10,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q11,d28,d1[1] vmlal.u32 q12,d28,d2[0] vmlal.u32 q13,d28,d2[1] vmlal.u32 q6,d28,d3[0] vmlal.u32 q7,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3] vmlal.u32 q8,d29,d4[0] vmlal.u32 q9,d29,d4[1] vmlal.u32 q10,d29,d5[0] vmlal.u32 q11,d29,d5[1] vmlal.u32 q12,d29,d6[0] vmlal.u32 q13,d29,d6[1] vmlal.u32 q6,d29,d7[0] vmlal.u32 q7,d29,d7[1] vst1.64 {q8},[r7,:128]! vmlal.u32 q9,d28,d0[0] vld1.64 {q8},[r6,:128] vmlal.u32 q10,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3] vmlal.u32 q11,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q12,d28,d1[1] vmlal.u32 q13,d28,d2[0] vmlal.u32 q6,d28,d2[1] vmlal.u32 q7,d28,d3[0] vmlal.u32 q8,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4] vmlal.u32 q9,d29,d4[0] vmlal.u32 q10,d29,d4[1] vmlal.u32 q11,d29,d5[0] vmlal.u32 q12,d29,d5[1] vmlal.u32 q13,d29,d6[0] vmlal.u32 q6,d29,d6[1] vmlal.u32 q7,d29,d7[0] vmlal.u32 q8,d29,d7[1] vst1.64 {q9},[r7,:128]! vmlal.u32 q10,d28,d0[0] vld1.64 {q9},[r6,:128] vmlal.u32 q11,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4] vmlal.u32 q12,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q13,d28,d1[1] vmlal.u32 q6,d28,d2[0] vmlal.u32 q7,d28,d2[1] vmlal.u32 q8,d28,d3[0] vmlal.u32 q9,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5] vmlal.u32 q10,d29,d4[0] vmlal.u32 q11,d29,d4[1] vmlal.u32 q12,d29,d5[0] vmlal.u32 q13,d29,d5[1] vmlal.u32 q6,d29,d6[0] vmlal.u32 q7,d29,d6[1] vmlal.u32 q8,d29,d7[0] vmlal.u32 q9,d29,d7[1] vst1.64 {q10},[r7,:128]! vmlal.u32 q11,d28,d0[0] vld1.64 {q10},[r6,:128] vmlal.u32 q12,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5] vmlal.u32 q13,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q6,d28,d1[1] vmlal.u32 q7,d28,d2[0] vmlal.u32 q8,d28,d2[1] vmlal.u32 q9,d28,d3[0] vmlal.u32 q10,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6] vmlal.u32 q11,d29,d4[0] vmlal.u32 q12,d29,d4[1] vmlal.u32 q13,d29,d5[0] vmlal.u32 q6,d29,d5[1] vmlal.u32 q7,d29,d6[0] vmlal.u32 q8,d29,d6[1] vmlal.u32 q9,d29,d7[0] vmlal.u32 q10,d29,d7[1] vst1.64 {q11},[r7,:128]! vmlal.u32 q12,d28,d0[0] vld1.64 {q11},[r6,:128] vmlal.u32 q13,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6] vmlal.u32 q6,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q7,d28,d1[1] vmlal.u32 q8,d28,d2[0] vmlal.u32 q9,d28,d2[1] vmlal.u32 q10,d28,d3[0] vmlal.u32 q11,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7] vmlal.u32 q12,d29,d4[0] vmlal.u32 q13,d29,d4[1] vmlal.u32 q6,d29,d5[0] vmlal.u32 q7,d29,d5[1] vmlal.u32 q8,d29,d6[0] vmlal.u32 q9,d29,d6[1] vmlal.u32 q10,d29,d7[0] vmlal.u32 q11,d29,d7[1] vst1.64 {q12},[r7,:128]! vmlal.u32 q13,d28,d0[0] vld1.64 {q12},[r6,:128] vmlal.u32 q6,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7] vmlal.u32 q7,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q8,d28,d1[1] vmlal.u32 q9,d28,d2[0] vmlal.u32 q10,d28,d2[1] vmlal.u32 q11,d28,d3[0] vmlal.u32 q12,d28,d3[1] it eq subeq r1,r1,r5,lsl#2 @ rewind vmlal.u32 q13,d29,d4[0] vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 q6,d29,d4[1] vld1.32 {d0,d1,d2,d3},[r1]! vmlal.u32 q7,d29,d5[0] add r10,sp,#8 @ rewind vmlal.u32 q8,d29,d5[1] vmlal.u32 q9,d29,d6[0] vmlal.u32 q10,d29,d6[1] vmlal.u32 q11,d29,d7[0] vst1.64 {q13},[r7,:128]! vmlal.u32 q12,d29,d7[1] bne LNEON_8n_inner add r6,sp,#128 vst1.64 {q6,q7},[r7,:256]! veor q2,q2,q2 @ d4-d5 vst1.64 {q8,q9},[r7,:256]! veor q3,q3,q3 @ d6-d7 vst1.64 {q10,q11},[r7,:256]! vst1.64 {q12},[r7,:128] subs r9,r9,#8 vld1.64 {q6,q7},[r6,:256]! vld1.64 {q8,q9},[r6,:256]! vld1.64 {q10,q11},[r6,:256]! vld1.64 {q12,q13},[r6,:256]! itt ne subne r3,r3,r5,lsl#2 @ rewind bne LNEON_8n_outer add r7,sp,#128 vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame vshr.u64 d10,d12,#16 vst1.64 {q2,q3},[sp,:256]! vadd.u64 d13,d13,d10 vst1.64 {q2,q3}, [sp,:256]! vshr.u64 d10,d13,#16 vst1.64 {q2,q3}, [sp,:256]! vzip.16 d12,d13 mov r8,r5 b LNEON_tail_entry .align 4 LNEON_tail: vadd.u64 d12,d12,d10 vshr.u64 d10,d12,#16 vld1.64 {q8,q9}, [r6, :256]! vadd.u64 d13,d13,d10 vld1.64 {q10,q11}, [r6, :256]! vshr.u64 d10,d13,#16 vld1.64 {q12,q13}, [r6, :256]! vzip.16 d12,d13 LNEON_tail_entry: vadd.u64 d14,d14,d10 vst1.32 {d12[0]}, [r7, :32]! vshr.u64 d10,d14,#16 vadd.u64 d15,d15,d10 vshr.u64 d10,d15,#16 vzip.16 d14,d15 vadd.u64 d16,d16,d10 vst1.32 {d14[0]}, [r7, :32]! vshr.u64 d10,d16,#16 vadd.u64 d17,d17,d10 vshr.u64 d10,d17,#16 vzip.16 d16,d17 vadd.u64 d18,d18,d10 vst1.32 {d16[0]}, [r7, :32]! vshr.u64 d10,d18,#16 vadd.u64 d19,d19,d10 vshr.u64 d10,d19,#16 vzip.16 d18,d19 vadd.u64 d20,d20,d10 vst1.32 {d18[0]}, [r7, :32]! vshr.u64 d10,d20,#16 vadd.u64 d21,d21,d10 vshr.u64 d10,d21,#16 vzip.16 d20,d21 vadd.u64 d22,d22,d10 vst1.32 {d20[0]}, [r7, :32]! vshr.u64 d10,d22,#16 vadd.u64 d23,d23,d10 vshr.u64 d10,d23,#16 vzip.16 d22,d23 vadd.u64 d24,d24,d10 vst1.32 {d22[0]}, [r7, :32]! vshr.u64 d10,d24,#16 vadd.u64 d25,d25,d10 vshr.u64 d10,d25,#16 vzip.16 d24,d25 vadd.u64 d26,d26,d10 vst1.32 {d24[0]}, [r7, :32]! vshr.u64 d10,d26,#16 vadd.u64 d27,d27,d10 vshr.u64 d10,d27,#16 vzip.16 d26,d27 vld1.64 {q6,q7}, [r6, :256]! subs r8,r8,#8 vst1.32 {d26[0]}, [r7, :32]! bne LNEON_tail vst1.32 {d10[0]}, [r7, :32] @ top-most bit sub r3,r3,r5,lsl#2 @ rewind r3 subs r1,sp,#0 @ clear carry flag add r2,sp,r5,lsl#2 LNEON_sub: ldmia r1!, {r4,r5,r6,r7} ldmia r3!, {r8,r9,r10,r11} sbcs r8, r4,r8 sbcs r9, r5,r9 sbcs r10,r6,r10 sbcs r11,r7,r11 teq r1,r2 @ preserves carry stmia r0!, {r8,r9,r10,r11} bne LNEON_sub ldr r10, [r1] @ load top-most bit mov r11,sp veor q0,q0,q0 sub r11,r2,r11 @ this is num*4 veor q1,q1,q1 mov r1,sp sub r0,r0,r11 @ rewind r0 mov r3,r2 @ second 3/4th of frame sbcs r10,r10,#0 @ result is carry flag LNEON_copy_n_zap: ldmia r1!, {r4,r5,r6,r7} ldmia r0, {r8,r9,r10,r11} it cc movcc r8, r4 vst1.64 {q0,q1}, [r3,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0,q1}, [r3,:256]! @ wipe it cc movcc r11,r7 ldmia r1, {r4,r5,r6,r7} stmia r0!, {r8,r9,r10,r11} sub r1,r1,#16 ldmia r0, {r8,r9,r10,r11} it cc movcc r8, r4 vst1.64 {q0,q1}, [r1,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0,q1}, [r3,:256]! @ wipe it cc movcc r11,r7 teq r1,r2 @ preserves carry stmia r0!, {r8,r9,r10,r11} bne LNEON_copy_n_zap mov sp,ip vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} bx lr @ bx lr #endif .byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 .comm _GFp_armcap_P,4 .non_lazy_symbol_pointer GFp_armcap_P: .indirect_symbol _GFp_armcap_P .long 0 .private_extern _GFp_armcap_P #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/armv4-mont-linux32.S000064400000000000000000000534151353224261200170430ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif #if __ARM_MAX_ARCH__>=7 .align 5 .LOPENSSL_armcap: .word GFp_armcap_P-.Lbn_mul_mont #endif .globl GFp_bn_mul_mont .hidden GFp_bn_mul_mont .type GFp_bn_mul_mont,%function .align 5 GFp_bn_mul_mont: .Lbn_mul_mont: ldr ip,[sp,#4] @ load num stmdb sp!,{r0,r2} @ sp points at argument block #if __ARM_MAX_ARCH__>=7 tst ip,#7 bne .Lialu adr r0,.Lbn_mul_mont ldr r2,.LOPENSSL_armcap ldr r0,[r0,r2] #ifdef __APPLE__ ldr r0,[r0] #endif tst r0,#ARMV7_NEON @ NEON available? ldmia sp, {r0,r2} beq .Lialu add sp,sp,#8 b bn_mul8x_mont_neon .align 4 .Lialu: #endif cmp ip,#2 mov r0,ip @ load num #ifdef __thumb2__ ittt lt #endif movlt r0,#0 addlt sp,sp,#2*4 blt .Labrt stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers mov r0,r0,lsl#2 @ rescale r0 for byte count sub sp,sp,r0 @ alloca(4*num) sub sp,sp,#4 @ +extra dword sub r0,r0,#4 @ "num=num-1" add r4,r2,r0 @ &bp[num-1] add r0,sp,r0 @ r0 to point at &tp[num-1] ldr r8,[r0,#14*4] @ &n0 ldr r2,[r2] @ bp[0] ldr r5,[r1],#4 @ ap[0],ap++ ldr r6,[r3],#4 @ np[0],np++ ldr r8,[r8] @ *n0 str r4,[r0,#15*4] @ save &bp[num] umull r10,r11,r5,r2 @ ap[0]*bp[0] str r8,[r0,#14*4] @ save n0 value mul r8,r10,r8 @ "tp[0]"*n0 mov r12,#0 umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]" mov r4,sp .L1st: ldr r5,[r1],#4 @ ap[j],ap++ mov r10,r11 ldr r6,[r3],#4 @ np[j],np++ mov r11,#0 umlal r10,r11,r5,r2 @ ap[j]*bp[0] mov r14,#0 umlal r12,r14,r6,r8 @ np[j]*n0 adds r12,r12,r10 str r12,[r4],#4 @ tp[j-1]=,tp++ adc r12,r14,#0 cmp r4,r0 bne .L1st adds r12,r12,r11 ldr r4,[r0,#13*4] @ restore bp mov r14,#0 ldr r8,[r0,#14*4] @ restore n0 adc r14,r14,#0 str r12,[r0] @ tp[num-1]= mov r7,sp str r14,[r0,#4] @ tp[num]= .Louter: sub r7,r0,r7 @ "original" r0-1 value sub r1,r1,r7 @ "rewind" ap to &ap[1] ldr r2,[r4,#4]! @ *(++bp) sub r3,r3,r7 @ "rewind" np to &np[1] ldr r5,[r1,#-4] @ ap[0] ldr r10,[sp] @ tp[0] ldr r6,[r3,#-4] @ np[0] ldr r7,[sp,#4] @ tp[1] mov r11,#0 umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0] str r4,[r0,#13*4] @ save bp mul r8,r10,r8 mov r12,#0 umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]" mov r4,sp .Linner: ldr r5,[r1],#4 @ ap[j],ap++ adds r10,r11,r7 @ +=tp[j] ldr r6,[r3],#4 @ np[j],np++ mov r11,#0 umlal r10,r11,r5,r2 @ ap[j]*bp[i] mov r14,#0 umlal r12,r14,r6,r8 @ np[j]*n0 adc r11,r11,#0 ldr r7,[r4,#8] @ tp[j+1] adds r12,r12,r10 str r12,[r4],#4 @ tp[j-1]=,tp++ adc r12,r14,#0 cmp r4,r0 bne .Linner adds r12,r12,r11 mov r14,#0 ldr r4,[r0,#13*4] @ restore bp adc r14,r14,#0 ldr r8,[r0,#14*4] @ restore n0 adds r12,r12,r7 ldr r7,[r0,#15*4] @ restore &bp[num] adc r14,r14,#0 str r12,[r0] @ tp[num-1]= str r14,[r0,#4] @ tp[num]= cmp r4,r7 #ifdef __thumb2__ itt ne #endif movne r7,sp bne .Louter ldr r2,[r0,#12*4] @ pull rp mov r5,sp add r0,r0,#4 @ r0 to point at &tp[num] sub r5,r0,r5 @ "original" num value mov r4,sp @ "rewind" r4 mov r1,r4 @ "borrow" r1 sub r3,r3,r5 @ "rewind" r3 to &np[0] subs r7,r7,r7 @ "clear" carry flag .Lsub: ldr r7,[r4],#4 ldr r6,[r3],#4 sbcs r7,r7,r6 @ tp[j]-np[j] str r7,[r2],#4 @ rp[j]= teq r4,r0 @ preserve carry bne .Lsub sbcs r14,r14,#0 @ upmost carry mov r4,sp @ "rewind" r4 sub r2,r2,r5 @ "rewind" r2 .Lcopy: ldr r7,[r4] @ conditional copy ldr r5,[r2] str sp,[r4],#4 @ zap tp #ifdef __thumb2__ it cc #endif movcc r5,r7 str r5,[r2],#4 teq r4,r0 @ preserve carry bne .Lcopy mov sp,r0 add sp,sp,#4 @ skip over tp[num+1] ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers add sp,sp,#2*4 @ skip over {r0,r2} mov r0,#1 .Labrt: #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_bn_mul_mont,.-GFp_bn_mul_mont #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type bn_mul8x_mont_neon,%function .align 5 bn_mul8x_mont_neon: mov ip,sp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so ldmia ip,{r4,r5} @ load rest of parameter block mov ip,sp cmp r5,#8 bhi .LNEON_8n @ special case for r5==8, everything is in register bank... vld1.32 {d28[0]}, [r2,:32]! veor d8,d8,d8 sub r7,sp,r5,lsl#4 vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-( and r7,r7,#-64 vld1.32 {d30[0]}, [r4,:32] mov sp,r7 @ alloca vzip.16 d28,d8 vmull.u32 q6,d28,d0[0] vmull.u32 q7,d28,d0[1] vmull.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmull.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 veor d8,d8,d8 vmul.u32 d29,d29,d30 vmull.u32 q10,d28,d2[0] vld1.32 {d4,d5,d6,d7}, [r3]! vmull.u32 q11,d28,d2[1] vmull.u32 q12,d28,d3[0] vzip.16 d29,d8 vmull.u32 q13,d28,d3[1] vmlal.u32 q6,d29,d4[0] sub r9,r5,#1 vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmov q5,q6 vmlal.u32 q11,d29,d6[1] vmov q6,q7 vmlal.u32 q12,d29,d7[0] vmov q7,q8 vmlal.u32 q13,d29,d7[1] vmov q8,q9 vmov q9,q10 vshr.u64 d10,d10,#16 vmov q10,q11 vmov q11,q12 vadd.u64 d10,d10,d11 vmov q12,q13 veor q13,q13 vshr.u64 d10,d10,#16 b .LNEON_outer8 .align 4 .LNEON_outer8: vld1.32 {d28[0]}, [r2,:32]! veor d8,d8,d8 vzip.16 d28,d8 vadd.u64 d12,d12,d10 vmlal.u32 q6,d28,d0[0] vmlal.u32 q7,d28,d0[1] vmlal.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmlal.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 veor d8,d8,d8 subs r9,r9,#1 vmul.u32 d29,d29,d30 vmlal.u32 q10,d28,d2[0] vmlal.u32 q11,d28,d2[1] vmlal.u32 q12,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q13,d28,d3[1] vmlal.u32 q6,d29,d4[0] vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmov q5,q6 vmlal.u32 q11,d29,d6[1] vmov q6,q7 vmlal.u32 q12,d29,d7[0] vmov q7,q8 vmlal.u32 q13,d29,d7[1] vmov q8,q9 vmov q9,q10 vshr.u64 d10,d10,#16 vmov q10,q11 vmov q11,q12 vadd.u64 d10,d10,d11 vmov q12,q13 veor q13,q13 vshr.u64 d10,d10,#16 bne .LNEON_outer8 vadd.u64 d12,d12,d10 mov r7,sp vshr.u64 d10,d12,#16 mov r8,r5 vadd.u64 d13,d13,d10 add r6,sp,#96 vshr.u64 d10,d13,#16 vzip.16 d12,d13 b .LNEON_tail_entry .align 4 .LNEON_8n: veor q6,q6,q6 sub r7,sp,#128 veor q7,q7,q7 sub r7,r7,r5,lsl#4 veor q8,q8,q8 and r7,r7,#-64 veor q9,q9,q9 mov sp,r7 @ alloca veor q10,q10,q10 add r7,r7,#256 veor q11,q11,q11 sub r8,r5,#8 veor q12,q12,q12 veor q13,q13,q13 .LNEON_8n_init: vst1.64 {q6,q7},[r7,:256]! subs r8,r8,#8 vst1.64 {q8,q9},[r7,:256]! vst1.64 {q10,q11},[r7,:256]! vst1.64 {q12,q13},[r7,:256]! bne .LNEON_8n_init add r6,sp,#256 vld1.32 {d0,d1,d2,d3},[r1]! add r10,sp,#8 vld1.32 {d30[0]},[r4,:32] mov r9,r5 b .LNEON_8n_outer .align 4 .LNEON_8n_outer: vld1.32 {d28[0]},[r2,:32]! @ *b++ veor d8,d8,d8 vzip.16 d28,d8 add r7,sp,#128 vld1.32 {d4,d5,d6,d7},[r3]! vmlal.u32 q6,d28,d0[0] vmlal.u32 q7,d28,d0[1] veor d8,d8,d8 vmlal.u32 q8,d28,d1[0] vshl.i64 d29,d13,#16 vmlal.u32 q9,d28,d1[1] vadd.u64 d29,d29,d12 vmlal.u32 q10,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q11,d28,d2[1] vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0] vmlal.u32 q12,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q13,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q6,d29,d4[0] veor d10,d10,d10 vmlal.u32 q7,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q8,d29,d5[0] vshr.u64 d12,d12,#16 vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vadd.u64 d12,d12,d13 vmlal.u32 q11,d29,d6[1] vshr.u64 d12,d12,#16 vmlal.u32 q12,d29,d7[0] vmlal.u32 q13,d29,d7[1] vadd.u64 d14,d14,d12 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0] vmlal.u32 q7,d28,d0[0] vld1.64 {q6},[r6,:128]! vmlal.u32 q8,d28,d0[1] veor d8,d8,d8 vmlal.u32 q9,d28,d1[0] vshl.i64 d29,d15,#16 vmlal.u32 q10,d28,d1[1] vadd.u64 d29,d29,d14 vmlal.u32 q11,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q12,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1] vmlal.u32 q13,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q6,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q7,d29,d4[0] veor d10,d10,d10 vmlal.u32 q8,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q9,d29,d5[0] vshr.u64 d14,d14,#16 vmlal.u32 q10,d29,d5[1] vmlal.u32 q11,d29,d6[0] vadd.u64 d14,d14,d15 vmlal.u32 q12,d29,d6[1] vshr.u64 d14,d14,#16 vmlal.u32 q13,d29,d7[0] vmlal.u32 q6,d29,d7[1] vadd.u64 d16,d16,d14 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1] vmlal.u32 q8,d28,d0[0] vld1.64 {q7},[r6,:128]! vmlal.u32 q9,d28,d0[1] veor d8,d8,d8 vmlal.u32 q10,d28,d1[0] vshl.i64 d29,d17,#16 vmlal.u32 q11,d28,d1[1] vadd.u64 d29,d29,d16 vmlal.u32 q12,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q13,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2] vmlal.u32 q6,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q7,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q8,d29,d4[0] veor d10,d10,d10 vmlal.u32 q9,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q10,d29,d5[0] vshr.u64 d16,d16,#16 vmlal.u32 q11,d29,d5[1] vmlal.u32 q12,d29,d6[0] vadd.u64 d16,d16,d17 vmlal.u32 q13,d29,d6[1] vshr.u64 d16,d16,#16 vmlal.u32 q6,d29,d7[0] vmlal.u32 q7,d29,d7[1] vadd.u64 d18,d18,d16 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2] vmlal.u32 q9,d28,d0[0] vld1.64 {q8},[r6,:128]! vmlal.u32 q10,d28,d0[1] veor d8,d8,d8 vmlal.u32 q11,d28,d1[0] vshl.i64 d29,d19,#16 vmlal.u32 q12,d28,d1[1] vadd.u64 d29,d29,d18 vmlal.u32 q13,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q6,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3] vmlal.u32 q7,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q8,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q9,d29,d4[0] veor d10,d10,d10 vmlal.u32 q10,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q11,d29,d5[0] vshr.u64 d18,d18,#16 vmlal.u32 q12,d29,d5[1] vmlal.u32 q13,d29,d6[0] vadd.u64 d18,d18,d19 vmlal.u32 q6,d29,d6[1] vshr.u64 d18,d18,#16 vmlal.u32 q7,d29,d7[0] vmlal.u32 q8,d29,d7[1] vadd.u64 d20,d20,d18 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3] vmlal.u32 q10,d28,d0[0] vld1.64 {q9},[r6,:128]! vmlal.u32 q11,d28,d0[1] veor d8,d8,d8 vmlal.u32 q12,d28,d1[0] vshl.i64 d29,d21,#16 vmlal.u32 q13,d28,d1[1] vadd.u64 d29,d29,d20 vmlal.u32 q6,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q7,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4] vmlal.u32 q8,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q9,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q10,d29,d4[0] veor d10,d10,d10 vmlal.u32 q11,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q12,d29,d5[0] vshr.u64 d20,d20,#16 vmlal.u32 q13,d29,d5[1] vmlal.u32 q6,d29,d6[0] vadd.u64 d20,d20,d21 vmlal.u32 q7,d29,d6[1] vshr.u64 d20,d20,#16 vmlal.u32 q8,d29,d7[0] vmlal.u32 q9,d29,d7[1] vadd.u64 d22,d22,d20 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4] vmlal.u32 q11,d28,d0[0] vld1.64 {q10},[r6,:128]! vmlal.u32 q12,d28,d0[1] veor d8,d8,d8 vmlal.u32 q13,d28,d1[0] vshl.i64 d29,d23,#16 vmlal.u32 q6,d28,d1[1] vadd.u64 d29,d29,d22 vmlal.u32 q7,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q8,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5] vmlal.u32 q9,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q10,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q11,d29,d4[0] veor d10,d10,d10 vmlal.u32 q12,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q13,d29,d5[0] vshr.u64 d22,d22,#16 vmlal.u32 q6,d29,d5[1] vmlal.u32 q7,d29,d6[0] vadd.u64 d22,d22,d23 vmlal.u32 q8,d29,d6[1] vshr.u64 d22,d22,#16 vmlal.u32 q9,d29,d7[0] vmlal.u32 q10,d29,d7[1] vadd.u64 d24,d24,d22 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5] vmlal.u32 q12,d28,d0[0] vld1.64 {q11},[r6,:128]! vmlal.u32 q13,d28,d0[1] veor d8,d8,d8 vmlal.u32 q6,d28,d1[0] vshl.i64 d29,d25,#16 vmlal.u32 q7,d28,d1[1] vadd.u64 d29,d29,d24 vmlal.u32 q8,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q9,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6] vmlal.u32 q10,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q11,d28,d3[1] vld1.32 {d28[0]},[r2,:32]! @ *b++ vmlal.u32 q12,d29,d4[0] veor d10,d10,d10 vmlal.u32 q13,d29,d4[1] vzip.16 d28,d10 vmlal.u32 q6,d29,d5[0] vshr.u64 d24,d24,#16 vmlal.u32 q7,d29,d5[1] vmlal.u32 q8,d29,d6[0] vadd.u64 d24,d24,d25 vmlal.u32 q9,d29,d6[1] vshr.u64 d24,d24,#16 vmlal.u32 q10,d29,d7[0] vmlal.u32 q11,d29,d7[1] vadd.u64 d26,d26,d24 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6] vmlal.u32 q13,d28,d0[0] vld1.64 {q12},[r6,:128]! vmlal.u32 q6,d28,d0[1] veor d8,d8,d8 vmlal.u32 q7,d28,d1[0] vshl.i64 d29,d27,#16 vmlal.u32 q8,d28,d1[1] vadd.u64 d29,d29,d26 vmlal.u32 q9,d28,d2[0] vmul.u32 d29,d29,d30 vmlal.u32 q10,d28,d2[1] vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7] vmlal.u32 q11,d28,d3[0] vzip.16 d29,d8 vmlal.u32 q12,d28,d3[1] vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 q13,d29,d4[0] vld1.32 {d0,d1,d2,d3},[r1]! vmlal.u32 q6,d29,d4[1] vmlal.u32 q7,d29,d5[0] vshr.u64 d26,d26,#16 vmlal.u32 q8,d29,d5[1] vmlal.u32 q9,d29,d6[0] vadd.u64 d26,d26,d27 vmlal.u32 q10,d29,d6[1] vshr.u64 d26,d26,#16 vmlal.u32 q11,d29,d7[0] vmlal.u32 q12,d29,d7[1] vadd.u64 d12,d12,d26 vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7] add r10,sp,#8 @ rewind sub r8,r5,#8 b .LNEON_8n_inner .align 4 .LNEON_8n_inner: subs r8,r8,#8 vmlal.u32 q6,d28,d0[0] vld1.64 {q13},[r6,:128] vmlal.u32 q7,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0] vmlal.u32 q8,d28,d1[0] vld1.32 {d4,d5,d6,d7},[r3]! vmlal.u32 q9,d28,d1[1] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q10,d28,d2[0] vmlal.u32 q11,d28,d2[1] vmlal.u32 q12,d28,d3[0] vmlal.u32 q13,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1] vmlal.u32 q6,d29,d4[0] vmlal.u32 q7,d29,d4[1] vmlal.u32 q8,d29,d5[0] vmlal.u32 q9,d29,d5[1] vmlal.u32 q10,d29,d6[0] vmlal.u32 q11,d29,d6[1] vmlal.u32 q12,d29,d7[0] vmlal.u32 q13,d29,d7[1] vst1.64 {q6},[r7,:128]! vmlal.u32 q7,d28,d0[0] vld1.64 {q6},[r6,:128] vmlal.u32 q8,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1] vmlal.u32 q9,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q10,d28,d1[1] vmlal.u32 q11,d28,d2[0] vmlal.u32 q12,d28,d2[1] vmlal.u32 q13,d28,d3[0] vmlal.u32 q6,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2] vmlal.u32 q7,d29,d4[0] vmlal.u32 q8,d29,d4[1] vmlal.u32 q9,d29,d5[0] vmlal.u32 q10,d29,d5[1] vmlal.u32 q11,d29,d6[0] vmlal.u32 q12,d29,d6[1] vmlal.u32 q13,d29,d7[0] vmlal.u32 q6,d29,d7[1] vst1.64 {q7},[r7,:128]! vmlal.u32 q8,d28,d0[0] vld1.64 {q7},[r6,:128] vmlal.u32 q9,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2] vmlal.u32 q10,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q11,d28,d1[1] vmlal.u32 q12,d28,d2[0] vmlal.u32 q13,d28,d2[1] vmlal.u32 q6,d28,d3[0] vmlal.u32 q7,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3] vmlal.u32 q8,d29,d4[0] vmlal.u32 q9,d29,d4[1] vmlal.u32 q10,d29,d5[0] vmlal.u32 q11,d29,d5[1] vmlal.u32 q12,d29,d6[0] vmlal.u32 q13,d29,d6[1] vmlal.u32 q6,d29,d7[0] vmlal.u32 q7,d29,d7[1] vst1.64 {q8},[r7,:128]! vmlal.u32 q9,d28,d0[0] vld1.64 {q8},[r6,:128] vmlal.u32 q10,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3] vmlal.u32 q11,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q12,d28,d1[1] vmlal.u32 q13,d28,d2[0] vmlal.u32 q6,d28,d2[1] vmlal.u32 q7,d28,d3[0] vmlal.u32 q8,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4] vmlal.u32 q9,d29,d4[0] vmlal.u32 q10,d29,d4[1] vmlal.u32 q11,d29,d5[0] vmlal.u32 q12,d29,d5[1] vmlal.u32 q13,d29,d6[0] vmlal.u32 q6,d29,d6[1] vmlal.u32 q7,d29,d7[0] vmlal.u32 q8,d29,d7[1] vst1.64 {q9},[r7,:128]! vmlal.u32 q10,d28,d0[0] vld1.64 {q9},[r6,:128] vmlal.u32 q11,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4] vmlal.u32 q12,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q13,d28,d1[1] vmlal.u32 q6,d28,d2[0] vmlal.u32 q7,d28,d2[1] vmlal.u32 q8,d28,d3[0] vmlal.u32 q9,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5] vmlal.u32 q10,d29,d4[0] vmlal.u32 q11,d29,d4[1] vmlal.u32 q12,d29,d5[0] vmlal.u32 q13,d29,d5[1] vmlal.u32 q6,d29,d6[0] vmlal.u32 q7,d29,d6[1] vmlal.u32 q8,d29,d7[0] vmlal.u32 q9,d29,d7[1] vst1.64 {q10},[r7,:128]! vmlal.u32 q11,d28,d0[0] vld1.64 {q10},[r6,:128] vmlal.u32 q12,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5] vmlal.u32 q13,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q6,d28,d1[1] vmlal.u32 q7,d28,d2[0] vmlal.u32 q8,d28,d2[1] vmlal.u32 q9,d28,d3[0] vmlal.u32 q10,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6] vmlal.u32 q11,d29,d4[0] vmlal.u32 q12,d29,d4[1] vmlal.u32 q13,d29,d5[0] vmlal.u32 q6,d29,d5[1] vmlal.u32 q7,d29,d6[0] vmlal.u32 q8,d29,d6[1] vmlal.u32 q9,d29,d7[0] vmlal.u32 q10,d29,d7[1] vst1.64 {q11},[r7,:128]! vmlal.u32 q12,d28,d0[0] vld1.64 {q11},[r6,:128] vmlal.u32 q13,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6] vmlal.u32 q6,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q7,d28,d1[1] vmlal.u32 q8,d28,d2[0] vmlal.u32 q9,d28,d2[1] vmlal.u32 q10,d28,d3[0] vmlal.u32 q11,d28,d3[1] vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7] vmlal.u32 q12,d29,d4[0] vmlal.u32 q13,d29,d4[1] vmlal.u32 q6,d29,d5[0] vmlal.u32 q7,d29,d5[1] vmlal.u32 q8,d29,d6[0] vmlal.u32 q9,d29,d6[1] vmlal.u32 q10,d29,d7[0] vmlal.u32 q11,d29,d7[1] vst1.64 {q12},[r7,:128]! vmlal.u32 q13,d28,d0[0] vld1.64 {q12},[r6,:128] vmlal.u32 q6,d28,d0[1] vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7] vmlal.u32 q7,d28,d1[0] it ne addne r6,r6,#16 @ don't advance in last iteration vmlal.u32 q8,d28,d1[1] vmlal.u32 q9,d28,d2[0] vmlal.u32 q10,d28,d2[1] vmlal.u32 q11,d28,d3[0] vmlal.u32 q12,d28,d3[1] it eq subeq r1,r1,r5,lsl#2 @ rewind vmlal.u32 q13,d29,d4[0] vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] vmlal.u32 q6,d29,d4[1] vld1.32 {d0,d1,d2,d3},[r1]! vmlal.u32 q7,d29,d5[0] add r10,sp,#8 @ rewind vmlal.u32 q8,d29,d5[1] vmlal.u32 q9,d29,d6[0] vmlal.u32 q10,d29,d6[1] vmlal.u32 q11,d29,d7[0] vst1.64 {q13},[r7,:128]! vmlal.u32 q12,d29,d7[1] bne .LNEON_8n_inner add r6,sp,#128 vst1.64 {q6,q7},[r7,:256]! veor q2,q2,q2 @ d4-d5 vst1.64 {q8,q9},[r7,:256]! veor q3,q3,q3 @ d6-d7 vst1.64 {q10,q11},[r7,:256]! vst1.64 {q12},[r7,:128] subs r9,r9,#8 vld1.64 {q6,q7},[r6,:256]! vld1.64 {q8,q9},[r6,:256]! vld1.64 {q10,q11},[r6,:256]! vld1.64 {q12,q13},[r6,:256]! itt ne subne r3,r3,r5,lsl#2 @ rewind bne .LNEON_8n_outer add r7,sp,#128 vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame vshr.u64 d10,d12,#16 vst1.64 {q2,q3},[sp,:256]! vadd.u64 d13,d13,d10 vst1.64 {q2,q3}, [sp,:256]! vshr.u64 d10,d13,#16 vst1.64 {q2,q3}, [sp,:256]! vzip.16 d12,d13 mov r8,r5 b .LNEON_tail_entry .align 4 .LNEON_tail: vadd.u64 d12,d12,d10 vshr.u64 d10,d12,#16 vld1.64 {q8,q9}, [r6, :256]! vadd.u64 d13,d13,d10 vld1.64 {q10,q11}, [r6, :256]! vshr.u64 d10,d13,#16 vld1.64 {q12,q13}, [r6, :256]! vzip.16 d12,d13 .LNEON_tail_entry: vadd.u64 d14,d14,d10 vst1.32 {d12[0]}, [r7, :32]! vshr.u64 d10,d14,#16 vadd.u64 d15,d15,d10 vshr.u64 d10,d15,#16 vzip.16 d14,d15 vadd.u64 d16,d16,d10 vst1.32 {d14[0]}, [r7, :32]! vshr.u64 d10,d16,#16 vadd.u64 d17,d17,d10 vshr.u64 d10,d17,#16 vzip.16 d16,d17 vadd.u64 d18,d18,d10 vst1.32 {d16[0]}, [r7, :32]! vshr.u64 d10,d18,#16 vadd.u64 d19,d19,d10 vshr.u64 d10,d19,#16 vzip.16 d18,d19 vadd.u64 d20,d20,d10 vst1.32 {d18[0]}, [r7, :32]! vshr.u64 d10,d20,#16 vadd.u64 d21,d21,d10 vshr.u64 d10,d21,#16 vzip.16 d20,d21 vadd.u64 d22,d22,d10 vst1.32 {d20[0]}, [r7, :32]! vshr.u64 d10,d22,#16 vadd.u64 d23,d23,d10 vshr.u64 d10,d23,#16 vzip.16 d22,d23 vadd.u64 d24,d24,d10 vst1.32 {d22[0]}, [r7, :32]! vshr.u64 d10,d24,#16 vadd.u64 d25,d25,d10 vshr.u64 d10,d25,#16 vzip.16 d24,d25 vadd.u64 d26,d26,d10 vst1.32 {d24[0]}, [r7, :32]! vshr.u64 d10,d26,#16 vadd.u64 d27,d27,d10 vshr.u64 d10,d27,#16 vzip.16 d26,d27 vld1.64 {q6,q7}, [r6, :256]! subs r8,r8,#8 vst1.32 {d26[0]}, [r7, :32]! bne .LNEON_tail vst1.32 {d10[0]}, [r7, :32] @ top-most bit sub r3,r3,r5,lsl#2 @ rewind r3 subs r1,sp,#0 @ clear carry flag add r2,sp,r5,lsl#2 .LNEON_sub: ldmia r1!, {r4,r5,r6,r7} ldmia r3!, {r8,r9,r10,r11} sbcs r8, r4,r8 sbcs r9, r5,r9 sbcs r10,r6,r10 sbcs r11,r7,r11 teq r1,r2 @ preserves carry stmia r0!, {r8,r9,r10,r11} bne .LNEON_sub ldr r10, [r1] @ load top-most bit mov r11,sp veor q0,q0,q0 sub r11,r2,r11 @ this is num*4 veor q1,q1,q1 mov r1,sp sub r0,r0,r11 @ rewind r0 mov r3,r2 @ second 3/4th of frame sbcs r10,r10,#0 @ result is carry flag .LNEON_copy_n_zap: ldmia r1!, {r4,r5,r6,r7} ldmia r0, {r8,r9,r10,r11} it cc movcc r8, r4 vst1.64 {q0,q1}, [r3,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0,q1}, [r3,:256]! @ wipe it cc movcc r11,r7 ldmia r1, {r4,r5,r6,r7} stmia r0!, {r8,r9,r10,r11} sub r1,r1,#16 ldmia r0, {r8,r9,r10,r11} it cc movcc r8, r4 vst1.64 {q0,q1}, [r1,:256]! @ wipe itt cc movcc r9, r5 movcc r10,r6 vst1.64 {q0,q1}, [r3,:256]! @ wipe it cc movcc r11,r7 teq r1,r2 @ preserves carry stmia r0!, {r8,r9,r10,r11} bne .LNEON_copy_n_zap mov sp,ip vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} bx lr @ bx lr .size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon #endif .byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/armv8-mont-ios64.S000064400000000000000000000733251353224260500165130ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) .text .globl _GFp_bn_mul_mont .private_extern _GFp_bn_mul_mont .align 5 _GFp_bn_mul_mont: tst x5,#7 b.eq __bn_sqr8x_mont tst x5,#3 b.eq __bn_mul4x_mont Lmul_mont: stp x29,x30,[sp,#-64]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] ldr x9,[x2],#8 // bp[0] sub x22,sp,x5,lsl#3 ldp x7,x8,[x1],#16 // ap[0..1] lsl x5,x5,#3 ldr x4,[x4] // *n0 and x22,x22,#-16 // ABI says so ldp x13,x14,[x3],#16 // np[0..1] mul x6,x7,x9 // ap[0]*bp[0] sub x21,x5,#16 // j=num-2 umulh x7,x7,x9 mul x10,x8,x9 // ap[1]*bp[0] umulh x11,x8,x9 mul x15,x6,x4 // "tp[0]"*n0 mov sp,x22 // alloca // (*) mul x12,x13,x15 // np[0]*m1 umulh x13,x13,x15 mul x16,x14,x15 // np[1]*m1 // (*) adds x12,x12,x6 // discarded // (*) As for removal of first multiplication and addition // instructions. The outcome of first addition is // guaranteed to be zero, which leaves two computationally // significant outcomes: it either carries or not. Then // question is when does it carry? Is there alternative // way to deduce it? If you follow operations, you can // observe that condition for carry is quite simple: // x6 being non-zero. So that carry can be calculated // by adding -1 to x6. That's what next instruction does. subs xzr,x6,#1 // (*) umulh x17,x14,x15 adc x13,x13,xzr cbz x21,L1st_skip L1st: ldr x8,[x1],#8 adds x6,x10,x7 sub x21,x21,#8 // j-- adc x7,x11,xzr ldr x14,[x3],#8 adds x12,x16,x13 mul x10,x8,x9 // ap[j]*bp[0] adc x13,x17,xzr umulh x11,x8,x9 adds x12,x12,x6 mul x16,x14,x15 // np[j]*m1 adc x13,x13,xzr umulh x17,x14,x15 str x12,[x22],#8 // tp[j-1] cbnz x21,L1st L1st_skip: adds x6,x10,x7 sub x1,x1,x5 // rewind x1 adc x7,x11,xzr adds x12,x16,x13 sub x3,x3,x5 // rewind x3 adc x13,x17,xzr adds x12,x12,x6 sub x20,x5,#8 // i=num-1 adcs x13,x13,x7 adc x19,xzr,xzr // upmost overflow bit stp x12,x13,[x22] Louter: ldr x9,[x2],#8 // bp[i] ldp x7,x8,[x1],#16 ldr x23,[sp] // tp[0] add x22,sp,#8 mul x6,x7,x9 // ap[0]*bp[i] sub x21,x5,#16 // j=num-2 umulh x7,x7,x9 ldp x13,x14,[x3],#16 mul x10,x8,x9 // ap[1]*bp[i] adds x6,x6,x23 umulh x11,x8,x9 adc x7,x7,xzr mul x15,x6,x4 sub x20,x20,#8 // i-- // (*) mul x12,x13,x15 // np[0]*m1 umulh x13,x13,x15 mul x16,x14,x15 // np[1]*m1 // (*) adds x12,x12,x6 subs xzr,x6,#1 // (*) umulh x17,x14,x15 cbz x21,Linner_skip Linner: ldr x8,[x1],#8 adc x13,x13,xzr ldr x23,[x22],#8 // tp[j] adds x6,x10,x7 sub x21,x21,#8 // j-- adc x7,x11,xzr adds x12,x16,x13 ldr x14,[x3],#8 adc x13,x17,xzr mul x10,x8,x9 // ap[j]*bp[i] adds x6,x6,x23 umulh x11,x8,x9 adc x7,x7,xzr mul x16,x14,x15 // np[j]*m1 adds x12,x12,x6 umulh x17,x14,x15 str x12,[x22,#-16] // tp[j-1] cbnz x21,Linner Linner_skip: ldr x23,[x22],#8 // tp[j] adc x13,x13,xzr adds x6,x10,x7 sub x1,x1,x5 // rewind x1 adc x7,x11,xzr adds x12,x16,x13 sub x3,x3,x5 // rewind x3 adcs x13,x17,x19 adc x19,xzr,xzr adds x6,x6,x23 adc x7,x7,xzr adds x12,x12,x6 adcs x13,x13,x7 adc x19,x19,xzr // upmost overflow bit stp x12,x13,[x22,#-16] cbnz x20,Louter // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr x23,[sp] // tp[0] add x22,sp,#8 ldr x14,[x3],#8 // np[0] subs x21,x5,#8 // j=num-1 and clear borrow mov x1,x0 Lsub: sbcs x8,x23,x14 // tp[j]-np[j] ldr x23,[x22],#8 sub x21,x21,#8 // j-- ldr x14,[x3],#8 str x8,[x1],#8 // rp[j]=tp[j]-np[j] cbnz x21,Lsub sbcs x8,x23,x14 sbcs x19,x19,xzr // did it borrow? str x8,[x1],#8 // rp[num-1] ldr x23,[sp] // tp[0] add x22,sp,#8 ldr x8,[x0],#8 // rp[0] sub x5,x5,#8 // num-- nop Lcond_copy: sub x5,x5,#8 // num-- csel x14,x23,x8,lo // did it borrow? ldr x23,[x22],#8 ldr x8,[x0],#8 str xzr,[x22,#-16] // wipe tp str x14,[x0,#-16] cbnz x5,Lcond_copy csel x14,x23,x8,lo str xzr,[x22,#-8] // wipe tp str x14,[x0,#-8] ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldr x29,[sp],#64 ret .align 5 __bn_sqr8x_mont: cmp x1,x2 b.ne __bn_mul4x_mont Lsqr8x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] stp x0,x3,[sp,#96] // offload rp and np ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] ldp x10,x11,[x1,#8*4] ldp x12,x13,[x1,#8*6] sub x2,sp,x5,lsl#4 lsl x5,x5,#3 ldr x4,[x4] // *n0 mov sp,x2 // alloca sub x27,x5,#8*8 b Lsqr8x_zero_start Lsqr8x_zero: sub x27,x27,#8*8 stp xzr,xzr,[x2,#8*0] stp xzr,xzr,[x2,#8*2] stp xzr,xzr,[x2,#8*4] stp xzr,xzr,[x2,#8*6] Lsqr8x_zero_start: stp xzr,xzr,[x2,#8*8] stp xzr,xzr,[x2,#8*10] stp xzr,xzr,[x2,#8*12] stp xzr,xzr,[x2,#8*14] add x2,x2,#8*16 cbnz x27,Lsqr8x_zero add x3,x1,x5 add x1,x1,#8*8 mov x19,xzr mov x20,xzr mov x21,xzr mov x22,xzr mov x23,xzr mov x24,xzr mov x25,xzr mov x26,xzr mov x2,sp str x4,[x29,#112] // offload n0 // Multiply everything but a[i]*a[i] .align 4 Lsqr8x_outer_loop: // a[1]a[0] (i) // a[2]a[0] // a[3]a[0] // a[4]a[0] // a[5]a[0] // a[6]a[0] // a[7]a[0] // a[2]a[1] (ii) // a[3]a[1] // a[4]a[1] // a[5]a[1] // a[6]a[1] // a[7]a[1] // a[3]a[2] (iii) // a[4]a[2] // a[5]a[2] // a[6]a[2] // a[7]a[2] // a[4]a[3] (iv) // a[5]a[3] // a[6]a[3] // a[7]a[3] // a[5]a[4] (v) // a[6]a[4] // a[7]a[4] // a[6]a[5] (vi) // a[7]a[5] // a[7]a[6] (vii) mul x14,x7,x6 // lo(a[1..7]*a[0]) (i) mul x15,x8,x6 mul x16,x9,x6 mul x17,x10,x6 adds x20,x20,x14 // t[1]+lo(a[1]*a[0]) mul x14,x11,x6 adcs x21,x21,x15 mul x15,x12,x6 adcs x22,x22,x16 mul x16,x13,x6 adcs x23,x23,x17 umulh x17,x7,x6 // hi(a[1..7]*a[0]) adcs x24,x24,x14 umulh x14,x8,x6 adcs x25,x25,x15 umulh x15,x9,x6 adcs x26,x26,x16 umulh x16,x10,x6 stp x19,x20,[x2],#8*2 // t[0..1] adc x19,xzr,xzr // t[8] adds x21,x21,x17 // t[2]+lo(a[1]*a[0]) umulh x17,x11,x6 adcs x22,x22,x14 umulh x14,x12,x6 adcs x23,x23,x15 umulh x15,x13,x6 adcs x24,x24,x16 mul x16,x8,x7 // lo(a[2..7]*a[1]) (ii) adcs x25,x25,x17 mul x17,x9,x7 adcs x26,x26,x14 mul x14,x10,x7 adc x19,x19,x15 mul x15,x11,x7 adds x22,x22,x16 mul x16,x12,x7 adcs x23,x23,x17 mul x17,x13,x7 adcs x24,x24,x14 umulh x14,x8,x7 // hi(a[2..7]*a[1]) adcs x25,x25,x15 umulh x15,x9,x7 adcs x26,x26,x16 umulh x16,x10,x7 adcs x19,x19,x17 umulh x17,x11,x7 stp x21,x22,[x2],#8*2 // t[2..3] adc x20,xzr,xzr // t[9] adds x23,x23,x14 umulh x14,x12,x7 adcs x24,x24,x15 umulh x15,x13,x7 adcs x25,x25,x16 mul x16,x9,x8 // lo(a[3..7]*a[2]) (iii) adcs x26,x26,x17 mul x17,x10,x8 adcs x19,x19,x14 mul x14,x11,x8 adc x20,x20,x15 mul x15,x12,x8 adds x24,x24,x16 mul x16,x13,x8 adcs x25,x25,x17 umulh x17,x9,x8 // hi(a[3..7]*a[2]) adcs x26,x26,x14 umulh x14,x10,x8 adcs x19,x19,x15 umulh x15,x11,x8 adcs x20,x20,x16 umulh x16,x12,x8 stp x23,x24,[x2],#8*2 // t[4..5] adc x21,xzr,xzr // t[10] adds x25,x25,x17 umulh x17,x13,x8 adcs x26,x26,x14 mul x14,x10,x9 // lo(a[4..7]*a[3]) (iv) adcs x19,x19,x15 mul x15,x11,x9 adcs x20,x20,x16 mul x16,x12,x9 adc x21,x21,x17 mul x17,x13,x9 adds x26,x26,x14 umulh x14,x10,x9 // hi(a[4..7]*a[3]) adcs x19,x19,x15 umulh x15,x11,x9 adcs x20,x20,x16 umulh x16,x12,x9 adcs x21,x21,x17 umulh x17,x13,x9 stp x25,x26,[x2],#8*2 // t[6..7] adc x22,xzr,xzr // t[11] adds x19,x19,x14 mul x14,x11,x10 // lo(a[5..7]*a[4]) (v) adcs x20,x20,x15 mul x15,x12,x10 adcs x21,x21,x16 mul x16,x13,x10 adc x22,x22,x17 umulh x17,x11,x10 // hi(a[5..7]*a[4]) adds x20,x20,x14 umulh x14,x12,x10 adcs x21,x21,x15 umulh x15,x13,x10 adcs x22,x22,x16 mul x16,x12,x11 // lo(a[6..7]*a[5]) (vi) adc x23,xzr,xzr // t[12] adds x21,x21,x17 mul x17,x13,x11 adcs x22,x22,x14 umulh x14,x12,x11 // hi(a[6..7]*a[5]) adc x23,x23,x15 umulh x15,x13,x11 adds x22,x22,x16 mul x16,x13,x12 // lo(a[7]*a[6]) (vii) adcs x23,x23,x17 umulh x17,x13,x12 // hi(a[7]*a[6]) adc x24,xzr,xzr // t[13] adds x23,x23,x14 sub x27,x3,x1 // done yet? adc x24,x24,x15 adds x24,x24,x16 sub x14,x3,x5 // rewinded ap adc x25,xzr,xzr // t[14] add x25,x25,x17 cbz x27,Lsqr8x_outer_break mov x4,x6 ldp x6,x7,[x2,#8*0] ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] adds x19,x19,x6 adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x0,x1 adcs x26,xzr,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved below mov x27,#-8*8 // a[8]a[0] // a[9]a[0] // a[a]a[0] // a[b]a[0] // a[c]a[0] // a[d]a[0] // a[e]a[0] // a[f]a[0] // a[8]a[1] // a[f]a[1]........................ // a[8]a[2] // a[f]a[2]........................ // a[8]a[3] // a[f]a[3]........................ // a[8]a[4] // a[f]a[4]........................ // a[8]a[5] // a[f]a[5]........................ // a[8]a[6] // a[f]a[6]........................ // a[8]a[7] // a[f]a[7]........................ Lsqr8x_mul: mul x14,x6,x4 adc x28,xzr,xzr // carry bit, modulo-scheduled mul x15,x7,x4 add x27,x27,#8 mul x16,x8,x4 mul x17,x9,x4 adds x19,x19,x14 mul x14,x10,x4 adcs x20,x20,x15 mul x15,x11,x4 adcs x21,x21,x16 mul x16,x12,x4 adcs x22,x22,x17 mul x17,x13,x4 adcs x23,x23,x14 umulh x14,x6,x4 adcs x24,x24,x15 umulh x15,x7,x4 adcs x25,x25,x16 umulh x16,x8,x4 adcs x26,x26,x17 umulh x17,x9,x4 adc x28,x28,xzr str x19,[x2],#8 adds x19,x20,x14 umulh x14,x10,x4 adcs x20,x21,x15 umulh x15,x11,x4 adcs x21,x22,x16 umulh x16,x12,x4 adcs x22,x23,x17 umulh x17,x13,x4 ldr x4,[x0,x27] adcs x23,x24,x14 adcs x24,x25,x15 adcs x25,x26,x16 adcs x26,x28,x17 //adc x28,xzr,xzr // moved above cbnz x27,Lsqr8x_mul // note that carry flag is guaranteed // to be zero at this point cmp x1,x3 // done yet? b.eq Lsqr8x_break ldp x6,x7,[x2,#8*0] ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] adds x19,x19,x6 ldr x4,[x0,#-8*8] adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x27,#-8*8 adcs x26,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved above b Lsqr8x_mul .align 4 Lsqr8x_break: ldp x6,x7,[x0,#8*0] add x1,x0,#8*8 ldp x8,x9,[x0,#8*2] sub x14,x3,x1 // is it last iteration? ldp x10,x11,[x0,#8*4] sub x15,x2,x14 ldp x12,x13,[x0,#8*6] cbz x14,Lsqr8x_outer_loop stp x19,x20,[x2,#8*0] ldp x19,x20,[x15,#8*0] stp x21,x22,[x2,#8*2] ldp x21,x22,[x15,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[x15,#8*4] stp x25,x26,[x2,#8*6] mov x2,x15 ldp x25,x26,[x15,#8*6] b Lsqr8x_outer_loop .align 4 Lsqr8x_outer_break: // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] ldp x7,x9,[x14,#8*0] // recall that x14 is &a[0] ldp x15,x16,[sp,#8*1] ldp x11,x13,[x14,#8*2] add x1,x14,#8*4 ldp x17,x14,[sp,#8*3] stp x19,x20,[x2,#8*0] mul x19,x7,x7 stp x21,x22,[x2,#8*2] umulh x7,x7,x7 stp x23,x24,[x2,#8*4] mul x8,x9,x9 stp x25,x26,[x2,#8*6] mov x2,sp umulh x9,x9,x9 adds x20,x7,x15,lsl#1 extr x15,x16,x15,#63 sub x27,x5,#8*4 Lsqr4x_shift_n_add: adcs x21,x8,x15 extr x16,x17,x16,#63 sub x27,x27,#8*4 adcs x22,x9,x16 ldp x15,x16,[x2,#8*5] mul x10,x11,x11 ldp x7,x9,[x1],#8*2 umulh x11,x11,x11 mul x12,x13,x13 umulh x13,x13,x13 extr x17,x14,x17,#63 stp x19,x20,[x2,#8*0] adcs x23,x10,x17 extr x14,x15,x14,#63 stp x21,x22,[x2,#8*2] adcs x24,x11,x14 ldp x17,x14,[x2,#8*7] extr x15,x16,x15,#63 adcs x25,x12,x15 extr x16,x17,x16,#63 adcs x26,x13,x16 ldp x15,x16,[x2,#8*9] mul x6,x7,x7 ldp x11,x13,[x1],#8*2 umulh x7,x7,x7 mul x8,x9,x9 umulh x9,x9,x9 stp x23,x24,[x2,#8*4] extr x17,x14,x17,#63 stp x25,x26,[x2,#8*6] add x2,x2,#8*8 adcs x19,x6,x17 extr x14,x15,x14,#63 adcs x20,x7,x14 ldp x17,x14,[x2,#8*3] extr x15,x16,x15,#63 cbnz x27,Lsqr4x_shift_n_add ldp x1,x4,[x29,#104] // pull np and n0 adcs x21,x8,x15 extr x16,x17,x16,#63 adcs x22,x9,x16 ldp x15,x16,[x2,#8*5] mul x10,x11,x11 umulh x11,x11,x11 stp x19,x20,[x2,#8*0] mul x12,x13,x13 umulh x13,x13,x13 stp x21,x22,[x2,#8*2] extr x17,x14,x17,#63 adcs x23,x10,x17 extr x14,x15,x14,#63 ldp x19,x20,[sp,#8*0] adcs x24,x11,x14 extr x15,x16,x15,#63 ldp x6,x7,[x1,#8*0] adcs x25,x12,x15 extr x16,xzr,x16,#63 ldp x8,x9,[x1,#8*2] adc x26,x13,x16 ldp x10,x11,[x1,#8*4] // Reduce by 512 bits per iteration mul x28,x4,x19 // t[0]*n0 ldp x12,x13,[x1,#8*6] add x3,x1,x5 ldp x21,x22,[sp,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[sp,#8*4] stp x25,x26,[x2,#8*6] ldp x25,x26,[sp,#8*6] add x1,x1,#8*8 mov x30,xzr // initial top-most carry mov x2,sp mov x27,#8 Lsqr8x_reduction: // (*) mul x14,x6,x28 // lo(n[0-7])*lo(t[0]*n0) mul x15,x7,x28 sub x27,x27,#1 mul x16,x8,x28 str x28,[x2],#8 // put aside t[0]*n0 for tail processing mul x17,x9,x28 // (*) adds xzr,x19,x14 subs xzr,x19,#1 // (*) mul x14,x10,x28 adcs x19,x20,x15 mul x15,x11,x28 adcs x20,x21,x16 mul x16,x12,x28 adcs x21,x22,x17 mul x17,x13,x28 adcs x22,x23,x14 umulh x14,x6,x28 // hi(n[0-7])*lo(t[0]*n0) adcs x23,x24,x15 umulh x15,x7,x28 adcs x24,x25,x16 umulh x16,x8,x28 adcs x25,x26,x17 umulh x17,x9,x28 adc x26,xzr,xzr adds x19,x19,x14 umulh x14,x10,x28 adcs x20,x20,x15 umulh x15,x11,x28 adcs x21,x21,x16 umulh x16,x12,x28 adcs x22,x22,x17 umulh x17,x13,x28 mul x28,x4,x19 // next t[0]*n0 adcs x23,x23,x14 adcs x24,x24,x15 adcs x25,x25,x16 adc x26,x26,x17 cbnz x27,Lsqr8x_reduction ldp x14,x15,[x2,#8*0] ldp x16,x17,[x2,#8*2] mov x0,x2 sub x27,x3,x1 // done yet? adds x19,x19,x14 adcs x20,x20,x15 ldp x14,x15,[x2,#8*4] adcs x21,x21,x16 adcs x22,x22,x17 ldp x16,x17,[x2,#8*6] adcs x23,x23,x14 adcs x24,x24,x15 adcs x25,x25,x16 adcs x26,x26,x17 //adc x28,xzr,xzr // moved below cbz x27,Lsqr8x8_post_condition ldr x4,[x2,#-8*8] ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] ldp x10,x11,[x1,#8*4] mov x27,#-8*8 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 Lsqr8x_tail: mul x14,x6,x4 adc x28,xzr,xzr // carry bit, modulo-scheduled mul x15,x7,x4 add x27,x27,#8 mul x16,x8,x4 mul x17,x9,x4 adds x19,x19,x14 mul x14,x10,x4 adcs x20,x20,x15 mul x15,x11,x4 adcs x21,x21,x16 mul x16,x12,x4 adcs x22,x22,x17 mul x17,x13,x4 adcs x23,x23,x14 umulh x14,x6,x4 adcs x24,x24,x15 umulh x15,x7,x4 adcs x25,x25,x16 umulh x16,x8,x4 adcs x26,x26,x17 umulh x17,x9,x4 adc x28,x28,xzr str x19,[x2],#8 adds x19,x20,x14 umulh x14,x10,x4 adcs x20,x21,x15 umulh x15,x11,x4 adcs x21,x22,x16 umulh x16,x12,x4 adcs x22,x23,x17 umulh x17,x13,x4 ldr x4,[x0,x27] adcs x23,x24,x14 adcs x24,x25,x15 adcs x25,x26,x16 adcs x26,x28,x17 //adc x28,xzr,xzr // moved above cbnz x27,Lsqr8x_tail // note that carry flag is guaranteed // to be zero at this point ldp x6,x7,[x2,#8*0] sub x27,x3,x1 // done yet? sub x16,x3,x5 // rewinded np ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] cbz x27,Lsqr8x_tail_break ldr x4,[x0,#-8*8] adds x19,x19,x6 adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x27,#-8*8 adcs x26,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved above b Lsqr8x_tail .align 4 Lsqr8x_tail_break: ldr x4,[x29,#112] // pull n0 add x27,x2,#8*8 // end of current t[num] window subs xzr,x30,#1 // "move" top-most carry to carry bit adcs x14,x19,x6 adcs x15,x20,x7 ldp x19,x20,[x0,#8*0] adcs x21,x21,x8 ldp x6,x7,[x16,#8*0] // recall that x16 is &n[0] adcs x22,x22,x9 ldp x8,x9,[x16,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x16,#8*4] adcs x25,x25,x12 adcs x26,x26,x13 ldp x12,x13,[x16,#8*6] add x1,x16,#8*8 adc x30,xzr,xzr // top-most carry mul x28,x4,x19 stp x14,x15,[x2,#8*0] stp x21,x22,[x2,#8*2] ldp x21,x22,[x0,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[x0,#8*4] cmp x27,x29 // did we hit the bottom? stp x25,x26,[x2,#8*6] mov x2,x0 // slide the window ldp x25,x26,[x0,#8*6] mov x27,#8 b.ne Lsqr8x_reduction // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr x0,[x29,#96] // pull rp add x2,x2,#8*8 subs x14,x19,x6 sbcs x15,x20,x7 sub x27,x5,#8*8 mov x3,x0 // x0 copy Lsqr8x_sub: sbcs x16,x21,x8 ldp x6,x7,[x1,#8*0] sbcs x17,x22,x9 stp x14,x15,[x0,#8*0] sbcs x14,x23,x10 ldp x8,x9,[x1,#8*2] sbcs x15,x24,x11 stp x16,x17,[x0,#8*2] sbcs x16,x25,x12 ldp x10,x11,[x1,#8*4] sbcs x17,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 ldp x19,x20,[x2,#8*0] sub x27,x27,#8*8 ldp x21,x22,[x2,#8*2] ldp x23,x24,[x2,#8*4] ldp x25,x26,[x2,#8*6] add x2,x2,#8*8 stp x14,x15,[x0,#8*4] sbcs x14,x19,x6 stp x16,x17,[x0,#8*6] add x0,x0,#8*8 sbcs x15,x20,x7 cbnz x27,Lsqr8x_sub sbcs x16,x21,x8 mov x2,sp add x1,sp,x5 ldp x6,x7,[x3,#8*0] sbcs x17,x22,x9 stp x14,x15,[x0,#8*0] sbcs x14,x23,x10 ldp x8,x9,[x3,#8*2] sbcs x15,x24,x11 stp x16,x17,[x0,#8*2] sbcs x16,x25,x12 ldp x19,x20,[x1,#8*0] sbcs x17,x26,x13 ldp x21,x22,[x1,#8*2] sbcs xzr,x30,xzr // did it borrow? ldr x30,[x29,#8] // pull return address stp x14,x15,[x0,#8*4] stp x16,x17,[x0,#8*6] sub x27,x5,#8*4 Lsqr4x_cond_copy: sub x27,x27,#8*4 csel x14,x19,x6,lo stp xzr,xzr,[x2,#8*0] csel x15,x20,x7,lo ldp x6,x7,[x3,#8*4] ldp x19,x20,[x1,#8*4] csel x16,x21,x8,lo stp xzr,xzr,[x2,#8*2] add x2,x2,#8*4 csel x17,x22,x9,lo ldp x8,x9,[x3,#8*6] ldp x21,x22,[x1,#8*6] add x1,x1,#8*4 stp x14,x15,[x3,#8*0] stp x16,x17,[x3,#8*2] add x3,x3,#8*4 stp xzr,xzr,[x1,#8*0] stp xzr,xzr,[x1,#8*2] cbnz x27,Lsqr4x_cond_copy csel x14,x19,x6,lo stp xzr,xzr,[x2,#8*0] csel x15,x20,x7,lo stp xzr,xzr,[x2,#8*2] csel x16,x21,x8,lo csel x17,x22,x9,lo stp x14,x15,[x3,#8*0] stp x16,x17,[x3,#8*2] b Lsqr8x_done .align 4 Lsqr8x8_post_condition: adc x28,xzr,xzr ldr x30,[x29,#8] // pull return address // x19-7,x28 hold result, x6-7 hold modulus subs x6,x19,x6 ldr x1,[x29,#96] // pull rp sbcs x7,x20,x7 stp xzr,xzr,[sp,#8*0] sbcs x8,x21,x8 stp xzr,xzr,[sp,#8*2] sbcs x9,x22,x9 stp xzr,xzr,[sp,#8*4] sbcs x10,x23,x10 stp xzr,xzr,[sp,#8*6] sbcs x11,x24,x11 stp xzr,xzr,[sp,#8*8] sbcs x12,x25,x12 stp xzr,xzr,[sp,#8*10] sbcs x13,x26,x13 stp xzr,xzr,[sp,#8*12] sbcs x28,x28,xzr // did it borrow? stp xzr,xzr,[sp,#8*14] // x6-7 hold result-modulus csel x6,x19,x6,lo csel x7,x20,x7,lo csel x8,x21,x8,lo csel x9,x22,x9,lo stp x6,x7,[x1,#8*0] csel x10,x23,x10,lo csel x11,x24,x11,lo stp x8,x9,[x1,#8*2] csel x12,x25,x12,lo csel x13,x26,x13,lo stp x10,x11,[x1,#8*4] stp x12,x13,[x1,#8*6] Lsqr8x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .align 5 __bn_mul4x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub x26,sp,x5,lsl#3 lsl x5,x5,#3 ldr x4,[x4] // *n0 sub sp,x26,#8*4 // alloca add x10,x2,x5 add x27,x1,x5 stp x0,x10,[x29,#96] // offload rp and &b[num] ldr x24,[x2,#8*0] // b[0] ldp x6,x7,[x1,#8*0] // a[0..3] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 mov x19,xzr mov x20,xzr mov x21,xzr mov x22,xzr ldp x14,x15,[x3,#8*0] // n[0..3] ldp x16,x17,[x3,#8*2] adds x3,x3,#8*4 // clear carry bit mov x0,xzr mov x28,#0 mov x26,sp Loop_mul4x_1st_reduction: mul x10,x6,x24 // lo(a[0..3]*b[0]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[0..3]*b[0]) adcs x20,x20,x11 mul x25,x19,x4 // t[0]*n0 adcs x21,x21,x12 umulh x11,x7,x24 adcs x22,x22,x13 umulh x12,x8,x24 adc x23,xzr,xzr umulh x13,x9,x24 ldr x24,[x2,x28] // next b[i] (or b[0]) adds x20,x20,x10 // (*) mul x10,x14,x25 // lo(n[0..3]*t[0]*n0) str x25,[x26],#8 // put aside t[0]*n0 for tail processing adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 // (*) adds xzr,x19,x10 subs xzr,x19,#1 // (*) umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0) adcs x19,x20,x11 umulh x11,x15,x25 adcs x20,x21,x12 umulh x12,x16,x25 adcs x21,x22,x13 umulh x13,x17,x25 adcs x22,x23,x0 adc x0,xzr,xzr adds x19,x19,x10 sub x10,x27,x1 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr cbnz x28,Loop_mul4x_1st_reduction cbz x10,Lmul4x4_post_condition ldp x6,x7,[x1,#8*0] // a[4..7] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 ldr x25,[sp] // a[0]*n0 ldp x14,x15,[x3,#8*0] // n[4..7] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 Loop_mul4x_1st_tail: mul x10,x6,x24 // lo(a[4..7]*b[i]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[4..7]*b[i]) adcs x20,x20,x11 umulh x11,x7,x24 adcs x21,x21,x12 umulh x12,x8,x24 adcs x22,x22,x13 umulh x13,x9,x24 adc x23,xzr,xzr ldr x24,[x2,x28] // next b[i] (or b[0]) adds x20,x20,x10 mul x10,x14,x25 // lo(n[4..7]*a[0]*n0) adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 adds x19,x19,x10 umulh x10,x14,x25 // hi(n[4..7]*a[0]*n0) adcs x20,x20,x11 umulh x11,x15,x25 adcs x21,x21,x12 umulh x12,x16,x25 adcs x22,x22,x13 adcs x23,x23,x0 umulh x13,x17,x25 adc x0,xzr,xzr ldr x25,[sp,x28] // next t[0]*n0 str x19,[x26],#8 // result!!! adds x19,x20,x10 sub x10,x27,x1 // done yet? adcs x20,x21,x11 adcs x21,x22,x12 adcs x22,x23,x13 //adc x0,x0,xzr cbnz x28,Loop_mul4x_1st_tail sub x11,x27,x5 // rewinded x1 cbz x10,Lmul4x_proceed ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 ldp x14,x15,[x3,#8*0] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 b Loop_mul4x_1st_tail .align 5 Lmul4x_proceed: ldr x24,[x2,#8*4]! // *++b adc x30,x0,xzr ldp x6,x7,[x11,#8*0] // a[0..3] sub x3,x3,x5 // rewind np ldp x8,x9,[x11,#8*2] add x1,x11,#8*4 stp x19,x20,[x26,#8*0] // result!!! ldp x19,x20,[sp,#8*4] // t[0..3] stp x21,x22,[x26,#8*2] // result!!! ldp x21,x22,[sp,#8*6] ldp x14,x15,[x3,#8*0] // n[0..3] mov x26,sp ldp x16,x17,[x3,#8*2] adds x3,x3,#8*4 // clear carry bit mov x0,xzr .align 4 Loop_mul4x_reduction: mul x10,x6,x24 // lo(a[0..3]*b[4]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[0..3]*b[4]) adcs x20,x20,x11 mul x25,x19,x4 // t[0]*n0 adcs x21,x21,x12 umulh x11,x7,x24 adcs x22,x22,x13 umulh x12,x8,x24 adc x23,xzr,xzr umulh x13,x9,x24 ldr x24,[x2,x28] // next b[i] adds x20,x20,x10 // (*) mul x10,x14,x25 str x25,[x26],#8 // put aside t[0]*n0 for tail processing adcs x21,x21,x11 mul x11,x15,x25 // lo(n[0..3]*t[0]*n0 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 // (*) adds xzr,x19,x10 subs xzr,x19,#1 // (*) umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0 adcs x19,x20,x11 umulh x11,x15,x25 adcs x20,x21,x12 umulh x12,x16,x25 adcs x21,x22,x13 umulh x13,x17,x25 adcs x22,x23,x0 adc x0,xzr,xzr adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr cbnz x28,Loop_mul4x_reduction adc x0,x0,xzr ldp x10,x11,[x26,#8*4] // t[4..7] ldp x12,x13,[x26,#8*6] ldp x6,x7,[x1,#8*0] // a[4..7] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr ldr x25,[sp] // t[0]*n0 ldp x14,x15,[x3,#8*0] // n[4..7] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 .align 4 Loop_mul4x_tail: mul x10,x6,x24 // lo(a[4..7]*b[4]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[4..7]*b[4]) adcs x20,x20,x11 umulh x11,x7,x24 adcs x21,x21,x12 umulh x12,x8,x24 adcs x22,x22,x13 umulh x13,x9,x24 adc x23,xzr,xzr ldr x24,[x2,x28] // next b[i] adds x20,x20,x10 mul x10,x14,x25 // lo(n[4..7]*t[0]*n0) adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 adds x19,x19,x10 umulh x10,x14,x25 // hi(n[4..7]*t[0]*n0) adcs x20,x20,x11 umulh x11,x15,x25 adcs x21,x21,x12 umulh x12,x16,x25 adcs x22,x22,x13 umulh x13,x17,x25 adcs x23,x23,x0 ldr x25,[sp,x28] // next a[0]*n0 adc x0,xzr,xzr str x19,[x26],#8 // result!!! adds x19,x20,x10 sub x10,x27,x1 // done yet? adcs x20,x21,x11 adcs x21,x22,x12 adcs x22,x23,x13 //adc x0,x0,xzr cbnz x28,Loop_mul4x_tail sub x11,x3,x5 // rewinded np? adc x0,x0,xzr cbz x10,Loop_mul4x_break ldp x10,x11,[x26,#8*4] ldp x12,x13,[x26,#8*6] ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr ldp x14,x15,[x3,#8*0] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 b Loop_mul4x_tail .align 4 Loop_mul4x_break: ldp x12,x13,[x29,#96] // pull rp and &b[num] adds x19,x19,x30 add x2,x2,#8*4 // bp++ adcs x20,x20,xzr sub x1,x1,x5 // rewind ap adcs x21,x21,xzr stp x19,x20,[x26,#8*0] // result!!! adcs x22,x22,xzr ldp x19,x20,[sp,#8*4] // t[0..3] adc x30,x0,xzr stp x21,x22,[x26,#8*2] // result!!! cmp x2,x13 // done yet? ldp x21,x22,[sp,#8*6] ldp x14,x15,[x11,#8*0] // n[0..3] ldp x16,x17,[x11,#8*2] add x3,x11,#8*4 b.eq Lmul4x_post ldr x24,[x2] ldp x6,x7,[x1,#8*0] // a[0..3] ldp x8,x9,[x1,#8*2] adds x1,x1,#8*4 // clear carry bit mov x0,xzr mov x26,sp b Loop_mul4x_reduction .align 4 Lmul4x_post: // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. mov x0,x12 mov x27,x12 // x0 copy subs x10,x19,x14 add x26,sp,#8*8 sbcs x11,x20,x15 sub x28,x5,#8*4 Lmul4x_sub: sbcs x12,x21,x16 ldp x14,x15,[x3,#8*0] sub x28,x28,#8*4 ldp x19,x20,[x26,#8*0] sbcs x13,x22,x17 ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 ldp x21,x22,[x26,#8*2] add x26,x26,#8*4 stp x10,x11,[x0,#8*0] sbcs x10,x19,x14 stp x12,x13,[x0,#8*2] add x0,x0,#8*4 sbcs x11,x20,x15 cbnz x28,Lmul4x_sub sbcs x12,x21,x16 mov x26,sp add x1,sp,#8*4 ldp x6,x7,[x27,#8*0] sbcs x13,x22,x17 stp x10,x11,[x0,#8*0] ldp x8,x9,[x27,#8*2] stp x12,x13,[x0,#8*2] ldp x19,x20,[x1,#8*0] ldp x21,x22,[x1,#8*2] sbcs xzr,x30,xzr // did it borrow? ldr x30,[x29,#8] // pull return address sub x28,x5,#8*4 Lmul4x_cond_copy: sub x28,x28,#8*4 csel x10,x19,x6,lo stp xzr,xzr,[x26,#8*0] csel x11,x20,x7,lo ldp x6,x7,[x27,#8*4] ldp x19,x20,[x1,#8*4] csel x12,x21,x8,lo stp xzr,xzr,[x26,#8*2] add x26,x26,#8*4 csel x13,x22,x9,lo ldp x8,x9,[x27,#8*6] ldp x21,x22,[x1,#8*6] add x1,x1,#8*4 stp x10,x11,[x27,#8*0] stp x12,x13,[x27,#8*2] add x27,x27,#8*4 cbnz x28,Lmul4x_cond_copy csel x10,x19,x6,lo stp xzr,xzr,[x26,#8*0] csel x11,x20,x7,lo stp xzr,xzr,[x26,#8*2] csel x12,x21,x8,lo stp xzr,xzr,[x26,#8*3] csel x13,x22,x9,lo stp xzr,xzr,[x26,#8*4] stp x10,x11,[x27,#8*0] stp x12,x13,[x27,#8*2] b Lmul4x_done .align 4 Lmul4x4_post_condition: adc x0,x0,xzr ldr x1,[x29,#96] // pull rp // x19-3,x0 hold result, x14-7 hold modulus subs x6,x19,x14 ldr x30,[x29,#8] // pull return address sbcs x7,x20,x15 stp xzr,xzr,[sp,#8*0] sbcs x8,x21,x16 stp xzr,xzr,[sp,#8*2] sbcs x9,x22,x17 stp xzr,xzr,[sp,#8*4] sbcs xzr,x0,xzr // did it borrow? stp xzr,xzr,[sp,#8*6] // x6-3 hold result-modulus csel x6,x19,x6,lo csel x7,x20,x7,lo csel x8,x21,x8,lo csel x9,x22,x9,lo stp x6,x7,[x1,#8*0] stp x8,x9,[x1,#8*2] Lmul4x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/armv8-mont-linux64.S000064400000000000000000000740051353224260600170550ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) .text .globl GFp_bn_mul_mont .hidden GFp_bn_mul_mont .type GFp_bn_mul_mont,%function .align 5 GFp_bn_mul_mont: tst x5,#7 b.eq __bn_sqr8x_mont tst x5,#3 b.eq __bn_mul4x_mont .Lmul_mont: stp x29,x30,[sp,#-64]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] ldr x9,[x2],#8 // bp[0] sub x22,sp,x5,lsl#3 ldp x7,x8,[x1],#16 // ap[0..1] lsl x5,x5,#3 ldr x4,[x4] // *n0 and x22,x22,#-16 // ABI says so ldp x13,x14,[x3],#16 // np[0..1] mul x6,x7,x9 // ap[0]*bp[0] sub x21,x5,#16 // j=num-2 umulh x7,x7,x9 mul x10,x8,x9 // ap[1]*bp[0] umulh x11,x8,x9 mul x15,x6,x4 // "tp[0]"*n0 mov sp,x22 // alloca // (*) mul x12,x13,x15 // np[0]*m1 umulh x13,x13,x15 mul x16,x14,x15 // np[1]*m1 // (*) adds x12,x12,x6 // discarded // (*) As for removal of first multiplication and addition // instructions. The outcome of first addition is // guaranteed to be zero, which leaves two computationally // significant outcomes: it either carries or not. Then // question is when does it carry? Is there alternative // way to deduce it? If you follow operations, you can // observe that condition for carry is quite simple: // x6 being non-zero. So that carry can be calculated // by adding -1 to x6. That's what next instruction does. subs xzr,x6,#1 // (*) umulh x17,x14,x15 adc x13,x13,xzr cbz x21,.L1st_skip .L1st: ldr x8,[x1],#8 adds x6,x10,x7 sub x21,x21,#8 // j-- adc x7,x11,xzr ldr x14,[x3],#8 adds x12,x16,x13 mul x10,x8,x9 // ap[j]*bp[0] adc x13,x17,xzr umulh x11,x8,x9 adds x12,x12,x6 mul x16,x14,x15 // np[j]*m1 adc x13,x13,xzr umulh x17,x14,x15 str x12,[x22],#8 // tp[j-1] cbnz x21,.L1st .L1st_skip: adds x6,x10,x7 sub x1,x1,x5 // rewind x1 adc x7,x11,xzr adds x12,x16,x13 sub x3,x3,x5 // rewind x3 adc x13,x17,xzr adds x12,x12,x6 sub x20,x5,#8 // i=num-1 adcs x13,x13,x7 adc x19,xzr,xzr // upmost overflow bit stp x12,x13,[x22] .Louter: ldr x9,[x2],#8 // bp[i] ldp x7,x8,[x1],#16 ldr x23,[sp] // tp[0] add x22,sp,#8 mul x6,x7,x9 // ap[0]*bp[i] sub x21,x5,#16 // j=num-2 umulh x7,x7,x9 ldp x13,x14,[x3],#16 mul x10,x8,x9 // ap[1]*bp[i] adds x6,x6,x23 umulh x11,x8,x9 adc x7,x7,xzr mul x15,x6,x4 sub x20,x20,#8 // i-- // (*) mul x12,x13,x15 // np[0]*m1 umulh x13,x13,x15 mul x16,x14,x15 // np[1]*m1 // (*) adds x12,x12,x6 subs xzr,x6,#1 // (*) umulh x17,x14,x15 cbz x21,.Linner_skip .Linner: ldr x8,[x1],#8 adc x13,x13,xzr ldr x23,[x22],#8 // tp[j] adds x6,x10,x7 sub x21,x21,#8 // j-- adc x7,x11,xzr adds x12,x16,x13 ldr x14,[x3],#8 adc x13,x17,xzr mul x10,x8,x9 // ap[j]*bp[i] adds x6,x6,x23 umulh x11,x8,x9 adc x7,x7,xzr mul x16,x14,x15 // np[j]*m1 adds x12,x12,x6 umulh x17,x14,x15 str x12,[x22,#-16] // tp[j-1] cbnz x21,.Linner .Linner_skip: ldr x23,[x22],#8 // tp[j] adc x13,x13,xzr adds x6,x10,x7 sub x1,x1,x5 // rewind x1 adc x7,x11,xzr adds x12,x16,x13 sub x3,x3,x5 // rewind x3 adcs x13,x17,x19 adc x19,xzr,xzr adds x6,x6,x23 adc x7,x7,xzr adds x12,x12,x6 adcs x13,x13,x7 adc x19,x19,xzr // upmost overflow bit stp x12,x13,[x22,#-16] cbnz x20,.Louter // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr x23,[sp] // tp[0] add x22,sp,#8 ldr x14,[x3],#8 // np[0] subs x21,x5,#8 // j=num-1 and clear borrow mov x1,x0 .Lsub: sbcs x8,x23,x14 // tp[j]-np[j] ldr x23,[x22],#8 sub x21,x21,#8 // j-- ldr x14,[x3],#8 str x8,[x1],#8 // rp[j]=tp[j]-np[j] cbnz x21,.Lsub sbcs x8,x23,x14 sbcs x19,x19,xzr // did it borrow? str x8,[x1],#8 // rp[num-1] ldr x23,[sp] // tp[0] add x22,sp,#8 ldr x8,[x0],#8 // rp[0] sub x5,x5,#8 // num-- nop .Lcond_copy: sub x5,x5,#8 // num-- csel x14,x23,x8,lo // did it borrow? ldr x23,[x22],#8 ldr x8,[x0],#8 str xzr,[x22,#-16] // wipe tp str x14,[x0,#-16] cbnz x5,.Lcond_copy csel x14,x23,x8,lo str xzr,[x22,#-8] // wipe tp str x14,[x0,#-8] ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldr x29,[sp],#64 ret .size GFp_bn_mul_mont,.-GFp_bn_mul_mont .type __bn_sqr8x_mont,%function .align 5 __bn_sqr8x_mont: cmp x1,x2 b.ne __bn_mul4x_mont .Lsqr8x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] stp x0,x3,[sp,#96] // offload rp and np ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] ldp x10,x11,[x1,#8*4] ldp x12,x13,[x1,#8*6] sub x2,sp,x5,lsl#4 lsl x5,x5,#3 ldr x4,[x4] // *n0 mov sp,x2 // alloca sub x27,x5,#8*8 b .Lsqr8x_zero_start .Lsqr8x_zero: sub x27,x27,#8*8 stp xzr,xzr,[x2,#8*0] stp xzr,xzr,[x2,#8*2] stp xzr,xzr,[x2,#8*4] stp xzr,xzr,[x2,#8*6] .Lsqr8x_zero_start: stp xzr,xzr,[x2,#8*8] stp xzr,xzr,[x2,#8*10] stp xzr,xzr,[x2,#8*12] stp xzr,xzr,[x2,#8*14] add x2,x2,#8*16 cbnz x27,.Lsqr8x_zero add x3,x1,x5 add x1,x1,#8*8 mov x19,xzr mov x20,xzr mov x21,xzr mov x22,xzr mov x23,xzr mov x24,xzr mov x25,xzr mov x26,xzr mov x2,sp str x4,[x29,#112] // offload n0 // Multiply everything but a[i]*a[i] .align 4 .Lsqr8x_outer_loop: // a[1]a[0] (i) // a[2]a[0] // a[3]a[0] // a[4]a[0] // a[5]a[0] // a[6]a[0] // a[7]a[0] // a[2]a[1] (ii) // a[3]a[1] // a[4]a[1] // a[5]a[1] // a[6]a[1] // a[7]a[1] // a[3]a[2] (iii) // a[4]a[2] // a[5]a[2] // a[6]a[2] // a[7]a[2] // a[4]a[3] (iv) // a[5]a[3] // a[6]a[3] // a[7]a[3] // a[5]a[4] (v) // a[6]a[4] // a[7]a[4] // a[6]a[5] (vi) // a[7]a[5] // a[7]a[6] (vii) mul x14,x7,x6 // lo(a[1..7]*a[0]) (i) mul x15,x8,x6 mul x16,x9,x6 mul x17,x10,x6 adds x20,x20,x14 // t[1]+lo(a[1]*a[0]) mul x14,x11,x6 adcs x21,x21,x15 mul x15,x12,x6 adcs x22,x22,x16 mul x16,x13,x6 adcs x23,x23,x17 umulh x17,x7,x6 // hi(a[1..7]*a[0]) adcs x24,x24,x14 umulh x14,x8,x6 adcs x25,x25,x15 umulh x15,x9,x6 adcs x26,x26,x16 umulh x16,x10,x6 stp x19,x20,[x2],#8*2 // t[0..1] adc x19,xzr,xzr // t[8] adds x21,x21,x17 // t[2]+lo(a[1]*a[0]) umulh x17,x11,x6 adcs x22,x22,x14 umulh x14,x12,x6 adcs x23,x23,x15 umulh x15,x13,x6 adcs x24,x24,x16 mul x16,x8,x7 // lo(a[2..7]*a[1]) (ii) adcs x25,x25,x17 mul x17,x9,x7 adcs x26,x26,x14 mul x14,x10,x7 adc x19,x19,x15 mul x15,x11,x7 adds x22,x22,x16 mul x16,x12,x7 adcs x23,x23,x17 mul x17,x13,x7 adcs x24,x24,x14 umulh x14,x8,x7 // hi(a[2..7]*a[1]) adcs x25,x25,x15 umulh x15,x9,x7 adcs x26,x26,x16 umulh x16,x10,x7 adcs x19,x19,x17 umulh x17,x11,x7 stp x21,x22,[x2],#8*2 // t[2..3] adc x20,xzr,xzr // t[9] adds x23,x23,x14 umulh x14,x12,x7 adcs x24,x24,x15 umulh x15,x13,x7 adcs x25,x25,x16 mul x16,x9,x8 // lo(a[3..7]*a[2]) (iii) adcs x26,x26,x17 mul x17,x10,x8 adcs x19,x19,x14 mul x14,x11,x8 adc x20,x20,x15 mul x15,x12,x8 adds x24,x24,x16 mul x16,x13,x8 adcs x25,x25,x17 umulh x17,x9,x8 // hi(a[3..7]*a[2]) adcs x26,x26,x14 umulh x14,x10,x8 adcs x19,x19,x15 umulh x15,x11,x8 adcs x20,x20,x16 umulh x16,x12,x8 stp x23,x24,[x2],#8*2 // t[4..5] adc x21,xzr,xzr // t[10] adds x25,x25,x17 umulh x17,x13,x8 adcs x26,x26,x14 mul x14,x10,x9 // lo(a[4..7]*a[3]) (iv) adcs x19,x19,x15 mul x15,x11,x9 adcs x20,x20,x16 mul x16,x12,x9 adc x21,x21,x17 mul x17,x13,x9 adds x26,x26,x14 umulh x14,x10,x9 // hi(a[4..7]*a[3]) adcs x19,x19,x15 umulh x15,x11,x9 adcs x20,x20,x16 umulh x16,x12,x9 adcs x21,x21,x17 umulh x17,x13,x9 stp x25,x26,[x2],#8*2 // t[6..7] adc x22,xzr,xzr // t[11] adds x19,x19,x14 mul x14,x11,x10 // lo(a[5..7]*a[4]) (v) adcs x20,x20,x15 mul x15,x12,x10 adcs x21,x21,x16 mul x16,x13,x10 adc x22,x22,x17 umulh x17,x11,x10 // hi(a[5..7]*a[4]) adds x20,x20,x14 umulh x14,x12,x10 adcs x21,x21,x15 umulh x15,x13,x10 adcs x22,x22,x16 mul x16,x12,x11 // lo(a[6..7]*a[5]) (vi) adc x23,xzr,xzr // t[12] adds x21,x21,x17 mul x17,x13,x11 adcs x22,x22,x14 umulh x14,x12,x11 // hi(a[6..7]*a[5]) adc x23,x23,x15 umulh x15,x13,x11 adds x22,x22,x16 mul x16,x13,x12 // lo(a[7]*a[6]) (vii) adcs x23,x23,x17 umulh x17,x13,x12 // hi(a[7]*a[6]) adc x24,xzr,xzr // t[13] adds x23,x23,x14 sub x27,x3,x1 // done yet? adc x24,x24,x15 adds x24,x24,x16 sub x14,x3,x5 // rewinded ap adc x25,xzr,xzr // t[14] add x25,x25,x17 cbz x27,.Lsqr8x_outer_break mov x4,x6 ldp x6,x7,[x2,#8*0] ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] adds x19,x19,x6 adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x0,x1 adcs x26,xzr,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved below mov x27,#-8*8 // a[8]a[0] // a[9]a[0] // a[a]a[0] // a[b]a[0] // a[c]a[0] // a[d]a[0] // a[e]a[0] // a[f]a[0] // a[8]a[1] // a[f]a[1]........................ // a[8]a[2] // a[f]a[2]........................ // a[8]a[3] // a[f]a[3]........................ // a[8]a[4] // a[f]a[4]........................ // a[8]a[5] // a[f]a[5]........................ // a[8]a[6] // a[f]a[6]........................ // a[8]a[7] // a[f]a[7]........................ .Lsqr8x_mul: mul x14,x6,x4 adc x28,xzr,xzr // carry bit, modulo-scheduled mul x15,x7,x4 add x27,x27,#8 mul x16,x8,x4 mul x17,x9,x4 adds x19,x19,x14 mul x14,x10,x4 adcs x20,x20,x15 mul x15,x11,x4 adcs x21,x21,x16 mul x16,x12,x4 adcs x22,x22,x17 mul x17,x13,x4 adcs x23,x23,x14 umulh x14,x6,x4 adcs x24,x24,x15 umulh x15,x7,x4 adcs x25,x25,x16 umulh x16,x8,x4 adcs x26,x26,x17 umulh x17,x9,x4 adc x28,x28,xzr str x19,[x2],#8 adds x19,x20,x14 umulh x14,x10,x4 adcs x20,x21,x15 umulh x15,x11,x4 adcs x21,x22,x16 umulh x16,x12,x4 adcs x22,x23,x17 umulh x17,x13,x4 ldr x4,[x0,x27] adcs x23,x24,x14 adcs x24,x25,x15 adcs x25,x26,x16 adcs x26,x28,x17 //adc x28,xzr,xzr // moved above cbnz x27,.Lsqr8x_mul // note that carry flag is guaranteed // to be zero at this point cmp x1,x3 // done yet? b.eq .Lsqr8x_break ldp x6,x7,[x2,#8*0] ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] adds x19,x19,x6 ldr x4,[x0,#-8*8] adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x27,#-8*8 adcs x26,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved above b .Lsqr8x_mul .align 4 .Lsqr8x_break: ldp x6,x7,[x0,#8*0] add x1,x0,#8*8 ldp x8,x9,[x0,#8*2] sub x14,x3,x1 // is it last iteration? ldp x10,x11,[x0,#8*4] sub x15,x2,x14 ldp x12,x13,[x0,#8*6] cbz x14,.Lsqr8x_outer_loop stp x19,x20,[x2,#8*0] ldp x19,x20,[x15,#8*0] stp x21,x22,[x2,#8*2] ldp x21,x22,[x15,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[x15,#8*4] stp x25,x26,[x2,#8*6] mov x2,x15 ldp x25,x26,[x15,#8*6] b .Lsqr8x_outer_loop .align 4 .Lsqr8x_outer_break: // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] ldp x7,x9,[x14,#8*0] // recall that x14 is &a[0] ldp x15,x16,[sp,#8*1] ldp x11,x13,[x14,#8*2] add x1,x14,#8*4 ldp x17,x14,[sp,#8*3] stp x19,x20,[x2,#8*0] mul x19,x7,x7 stp x21,x22,[x2,#8*2] umulh x7,x7,x7 stp x23,x24,[x2,#8*4] mul x8,x9,x9 stp x25,x26,[x2,#8*6] mov x2,sp umulh x9,x9,x9 adds x20,x7,x15,lsl#1 extr x15,x16,x15,#63 sub x27,x5,#8*4 .Lsqr4x_shift_n_add: adcs x21,x8,x15 extr x16,x17,x16,#63 sub x27,x27,#8*4 adcs x22,x9,x16 ldp x15,x16,[x2,#8*5] mul x10,x11,x11 ldp x7,x9,[x1],#8*2 umulh x11,x11,x11 mul x12,x13,x13 umulh x13,x13,x13 extr x17,x14,x17,#63 stp x19,x20,[x2,#8*0] adcs x23,x10,x17 extr x14,x15,x14,#63 stp x21,x22,[x2,#8*2] adcs x24,x11,x14 ldp x17,x14,[x2,#8*7] extr x15,x16,x15,#63 adcs x25,x12,x15 extr x16,x17,x16,#63 adcs x26,x13,x16 ldp x15,x16,[x2,#8*9] mul x6,x7,x7 ldp x11,x13,[x1],#8*2 umulh x7,x7,x7 mul x8,x9,x9 umulh x9,x9,x9 stp x23,x24,[x2,#8*4] extr x17,x14,x17,#63 stp x25,x26,[x2,#8*6] add x2,x2,#8*8 adcs x19,x6,x17 extr x14,x15,x14,#63 adcs x20,x7,x14 ldp x17,x14,[x2,#8*3] extr x15,x16,x15,#63 cbnz x27,.Lsqr4x_shift_n_add ldp x1,x4,[x29,#104] // pull np and n0 adcs x21,x8,x15 extr x16,x17,x16,#63 adcs x22,x9,x16 ldp x15,x16,[x2,#8*5] mul x10,x11,x11 umulh x11,x11,x11 stp x19,x20,[x2,#8*0] mul x12,x13,x13 umulh x13,x13,x13 stp x21,x22,[x2,#8*2] extr x17,x14,x17,#63 adcs x23,x10,x17 extr x14,x15,x14,#63 ldp x19,x20,[sp,#8*0] adcs x24,x11,x14 extr x15,x16,x15,#63 ldp x6,x7,[x1,#8*0] adcs x25,x12,x15 extr x16,xzr,x16,#63 ldp x8,x9,[x1,#8*2] adc x26,x13,x16 ldp x10,x11,[x1,#8*4] // Reduce by 512 bits per iteration mul x28,x4,x19 // t[0]*n0 ldp x12,x13,[x1,#8*6] add x3,x1,x5 ldp x21,x22,[sp,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[sp,#8*4] stp x25,x26,[x2,#8*6] ldp x25,x26,[sp,#8*6] add x1,x1,#8*8 mov x30,xzr // initial top-most carry mov x2,sp mov x27,#8 .Lsqr8x_reduction: // (*) mul x14,x6,x28 // lo(n[0-7])*lo(t[0]*n0) mul x15,x7,x28 sub x27,x27,#1 mul x16,x8,x28 str x28,[x2],#8 // put aside t[0]*n0 for tail processing mul x17,x9,x28 // (*) adds xzr,x19,x14 subs xzr,x19,#1 // (*) mul x14,x10,x28 adcs x19,x20,x15 mul x15,x11,x28 adcs x20,x21,x16 mul x16,x12,x28 adcs x21,x22,x17 mul x17,x13,x28 adcs x22,x23,x14 umulh x14,x6,x28 // hi(n[0-7])*lo(t[0]*n0) adcs x23,x24,x15 umulh x15,x7,x28 adcs x24,x25,x16 umulh x16,x8,x28 adcs x25,x26,x17 umulh x17,x9,x28 adc x26,xzr,xzr adds x19,x19,x14 umulh x14,x10,x28 adcs x20,x20,x15 umulh x15,x11,x28 adcs x21,x21,x16 umulh x16,x12,x28 adcs x22,x22,x17 umulh x17,x13,x28 mul x28,x4,x19 // next t[0]*n0 adcs x23,x23,x14 adcs x24,x24,x15 adcs x25,x25,x16 adc x26,x26,x17 cbnz x27,.Lsqr8x_reduction ldp x14,x15,[x2,#8*0] ldp x16,x17,[x2,#8*2] mov x0,x2 sub x27,x3,x1 // done yet? adds x19,x19,x14 adcs x20,x20,x15 ldp x14,x15,[x2,#8*4] adcs x21,x21,x16 adcs x22,x22,x17 ldp x16,x17,[x2,#8*6] adcs x23,x23,x14 adcs x24,x24,x15 adcs x25,x25,x16 adcs x26,x26,x17 //adc x28,xzr,xzr // moved below cbz x27,.Lsqr8x8_post_condition ldr x4,[x2,#-8*8] ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] ldp x10,x11,[x1,#8*4] mov x27,#-8*8 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 .Lsqr8x_tail: mul x14,x6,x4 adc x28,xzr,xzr // carry bit, modulo-scheduled mul x15,x7,x4 add x27,x27,#8 mul x16,x8,x4 mul x17,x9,x4 adds x19,x19,x14 mul x14,x10,x4 adcs x20,x20,x15 mul x15,x11,x4 adcs x21,x21,x16 mul x16,x12,x4 adcs x22,x22,x17 mul x17,x13,x4 adcs x23,x23,x14 umulh x14,x6,x4 adcs x24,x24,x15 umulh x15,x7,x4 adcs x25,x25,x16 umulh x16,x8,x4 adcs x26,x26,x17 umulh x17,x9,x4 adc x28,x28,xzr str x19,[x2],#8 adds x19,x20,x14 umulh x14,x10,x4 adcs x20,x21,x15 umulh x15,x11,x4 adcs x21,x22,x16 umulh x16,x12,x4 adcs x22,x23,x17 umulh x17,x13,x4 ldr x4,[x0,x27] adcs x23,x24,x14 adcs x24,x25,x15 adcs x25,x26,x16 adcs x26,x28,x17 //adc x28,xzr,xzr // moved above cbnz x27,.Lsqr8x_tail // note that carry flag is guaranteed // to be zero at this point ldp x6,x7,[x2,#8*0] sub x27,x3,x1 // done yet? sub x16,x3,x5 // rewinded np ldp x8,x9,[x2,#8*2] ldp x10,x11,[x2,#8*4] ldp x12,x13,[x2,#8*6] cbz x27,.Lsqr8x_tail_break ldr x4,[x0,#-8*8] adds x19,x19,x6 adcs x20,x20,x7 ldp x6,x7,[x1,#8*0] adcs x21,x21,x8 adcs x22,x22,x9 ldp x8,x9,[x1,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x1,#8*4] adcs x25,x25,x12 mov x27,#-8*8 adcs x26,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 //adc x28,xzr,xzr // moved above b .Lsqr8x_tail .align 4 .Lsqr8x_tail_break: ldr x4,[x29,#112] // pull n0 add x27,x2,#8*8 // end of current t[num] window subs xzr,x30,#1 // "move" top-most carry to carry bit adcs x14,x19,x6 adcs x15,x20,x7 ldp x19,x20,[x0,#8*0] adcs x21,x21,x8 ldp x6,x7,[x16,#8*0] // recall that x16 is &n[0] adcs x22,x22,x9 ldp x8,x9,[x16,#8*2] adcs x23,x23,x10 adcs x24,x24,x11 ldp x10,x11,[x16,#8*4] adcs x25,x25,x12 adcs x26,x26,x13 ldp x12,x13,[x16,#8*6] add x1,x16,#8*8 adc x30,xzr,xzr // top-most carry mul x28,x4,x19 stp x14,x15,[x2,#8*0] stp x21,x22,[x2,#8*2] ldp x21,x22,[x0,#8*2] stp x23,x24,[x2,#8*4] ldp x23,x24,[x0,#8*4] cmp x27,x29 // did we hit the bottom? stp x25,x26,[x2,#8*6] mov x2,x0 // slide the window ldp x25,x26,[x0,#8*6] mov x27,#8 b.ne .Lsqr8x_reduction // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. ldr x0,[x29,#96] // pull rp add x2,x2,#8*8 subs x14,x19,x6 sbcs x15,x20,x7 sub x27,x5,#8*8 mov x3,x0 // x0 copy .Lsqr8x_sub: sbcs x16,x21,x8 ldp x6,x7,[x1,#8*0] sbcs x17,x22,x9 stp x14,x15,[x0,#8*0] sbcs x14,x23,x10 ldp x8,x9,[x1,#8*2] sbcs x15,x24,x11 stp x16,x17,[x0,#8*2] sbcs x16,x25,x12 ldp x10,x11,[x1,#8*4] sbcs x17,x26,x13 ldp x12,x13,[x1,#8*6] add x1,x1,#8*8 ldp x19,x20,[x2,#8*0] sub x27,x27,#8*8 ldp x21,x22,[x2,#8*2] ldp x23,x24,[x2,#8*4] ldp x25,x26,[x2,#8*6] add x2,x2,#8*8 stp x14,x15,[x0,#8*4] sbcs x14,x19,x6 stp x16,x17,[x0,#8*6] add x0,x0,#8*8 sbcs x15,x20,x7 cbnz x27,.Lsqr8x_sub sbcs x16,x21,x8 mov x2,sp add x1,sp,x5 ldp x6,x7,[x3,#8*0] sbcs x17,x22,x9 stp x14,x15,[x0,#8*0] sbcs x14,x23,x10 ldp x8,x9,[x3,#8*2] sbcs x15,x24,x11 stp x16,x17,[x0,#8*2] sbcs x16,x25,x12 ldp x19,x20,[x1,#8*0] sbcs x17,x26,x13 ldp x21,x22,[x1,#8*2] sbcs xzr,x30,xzr // did it borrow? ldr x30,[x29,#8] // pull return address stp x14,x15,[x0,#8*4] stp x16,x17,[x0,#8*6] sub x27,x5,#8*4 .Lsqr4x_cond_copy: sub x27,x27,#8*4 csel x14,x19,x6,lo stp xzr,xzr,[x2,#8*0] csel x15,x20,x7,lo ldp x6,x7,[x3,#8*4] ldp x19,x20,[x1,#8*4] csel x16,x21,x8,lo stp xzr,xzr,[x2,#8*2] add x2,x2,#8*4 csel x17,x22,x9,lo ldp x8,x9,[x3,#8*6] ldp x21,x22,[x1,#8*6] add x1,x1,#8*4 stp x14,x15,[x3,#8*0] stp x16,x17,[x3,#8*2] add x3,x3,#8*4 stp xzr,xzr,[x1,#8*0] stp xzr,xzr,[x1,#8*2] cbnz x27,.Lsqr4x_cond_copy csel x14,x19,x6,lo stp xzr,xzr,[x2,#8*0] csel x15,x20,x7,lo stp xzr,xzr,[x2,#8*2] csel x16,x21,x8,lo csel x17,x22,x9,lo stp x14,x15,[x3,#8*0] stp x16,x17,[x3,#8*2] b .Lsqr8x_done .align 4 .Lsqr8x8_post_condition: adc x28,xzr,xzr ldr x30,[x29,#8] // pull return address // x19-7,x28 hold result, x6-7 hold modulus subs x6,x19,x6 ldr x1,[x29,#96] // pull rp sbcs x7,x20,x7 stp xzr,xzr,[sp,#8*0] sbcs x8,x21,x8 stp xzr,xzr,[sp,#8*2] sbcs x9,x22,x9 stp xzr,xzr,[sp,#8*4] sbcs x10,x23,x10 stp xzr,xzr,[sp,#8*6] sbcs x11,x24,x11 stp xzr,xzr,[sp,#8*8] sbcs x12,x25,x12 stp xzr,xzr,[sp,#8*10] sbcs x13,x26,x13 stp xzr,xzr,[sp,#8*12] sbcs x28,x28,xzr // did it borrow? stp xzr,xzr,[sp,#8*14] // x6-7 hold result-modulus csel x6,x19,x6,lo csel x7,x20,x7,lo csel x8,x21,x8,lo csel x9,x22,x9,lo stp x6,x7,[x1,#8*0] csel x10,x23,x10,lo csel x11,x24,x11,lo stp x8,x9,[x1,#8*2] csel x12,x25,x12,lo csel x13,x26,x13,lo stp x10,x11,[x1,#8*4] stp x12,x13,[x1,#8*6] .Lsqr8x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .size __bn_sqr8x_mont,.-__bn_sqr8x_mont .type __bn_mul4x_mont,%function .align 5 __bn_mul4x_mont: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub x26,sp,x5,lsl#3 lsl x5,x5,#3 ldr x4,[x4] // *n0 sub sp,x26,#8*4 // alloca add x10,x2,x5 add x27,x1,x5 stp x0,x10,[x29,#96] // offload rp and &b[num] ldr x24,[x2,#8*0] // b[0] ldp x6,x7,[x1,#8*0] // a[0..3] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 mov x19,xzr mov x20,xzr mov x21,xzr mov x22,xzr ldp x14,x15,[x3,#8*0] // n[0..3] ldp x16,x17,[x3,#8*2] adds x3,x3,#8*4 // clear carry bit mov x0,xzr mov x28,#0 mov x26,sp .Loop_mul4x_1st_reduction: mul x10,x6,x24 // lo(a[0..3]*b[0]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[0..3]*b[0]) adcs x20,x20,x11 mul x25,x19,x4 // t[0]*n0 adcs x21,x21,x12 umulh x11,x7,x24 adcs x22,x22,x13 umulh x12,x8,x24 adc x23,xzr,xzr umulh x13,x9,x24 ldr x24,[x2,x28] // next b[i] (or b[0]) adds x20,x20,x10 // (*) mul x10,x14,x25 // lo(n[0..3]*t[0]*n0) str x25,[x26],#8 // put aside t[0]*n0 for tail processing adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 // (*) adds xzr,x19,x10 subs xzr,x19,#1 // (*) umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0) adcs x19,x20,x11 umulh x11,x15,x25 adcs x20,x21,x12 umulh x12,x16,x25 adcs x21,x22,x13 umulh x13,x17,x25 adcs x22,x23,x0 adc x0,xzr,xzr adds x19,x19,x10 sub x10,x27,x1 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr cbnz x28,.Loop_mul4x_1st_reduction cbz x10,.Lmul4x4_post_condition ldp x6,x7,[x1,#8*0] // a[4..7] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 ldr x25,[sp] // a[0]*n0 ldp x14,x15,[x3,#8*0] // n[4..7] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 .Loop_mul4x_1st_tail: mul x10,x6,x24 // lo(a[4..7]*b[i]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[4..7]*b[i]) adcs x20,x20,x11 umulh x11,x7,x24 adcs x21,x21,x12 umulh x12,x8,x24 adcs x22,x22,x13 umulh x13,x9,x24 adc x23,xzr,xzr ldr x24,[x2,x28] // next b[i] (or b[0]) adds x20,x20,x10 mul x10,x14,x25 // lo(n[4..7]*a[0]*n0) adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 adds x19,x19,x10 umulh x10,x14,x25 // hi(n[4..7]*a[0]*n0) adcs x20,x20,x11 umulh x11,x15,x25 adcs x21,x21,x12 umulh x12,x16,x25 adcs x22,x22,x13 adcs x23,x23,x0 umulh x13,x17,x25 adc x0,xzr,xzr ldr x25,[sp,x28] // next t[0]*n0 str x19,[x26],#8 // result!!! adds x19,x20,x10 sub x10,x27,x1 // done yet? adcs x20,x21,x11 adcs x21,x22,x12 adcs x22,x23,x13 //adc x0,x0,xzr cbnz x28,.Loop_mul4x_1st_tail sub x11,x27,x5 // rewinded x1 cbz x10,.Lmul4x_proceed ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 ldp x14,x15,[x3,#8*0] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 b .Loop_mul4x_1st_tail .align 5 .Lmul4x_proceed: ldr x24,[x2,#8*4]! // *++b adc x30,x0,xzr ldp x6,x7,[x11,#8*0] // a[0..3] sub x3,x3,x5 // rewind np ldp x8,x9,[x11,#8*2] add x1,x11,#8*4 stp x19,x20,[x26,#8*0] // result!!! ldp x19,x20,[sp,#8*4] // t[0..3] stp x21,x22,[x26,#8*2] // result!!! ldp x21,x22,[sp,#8*6] ldp x14,x15,[x3,#8*0] // n[0..3] mov x26,sp ldp x16,x17,[x3,#8*2] adds x3,x3,#8*4 // clear carry bit mov x0,xzr .align 4 .Loop_mul4x_reduction: mul x10,x6,x24 // lo(a[0..3]*b[4]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[0..3]*b[4]) adcs x20,x20,x11 mul x25,x19,x4 // t[0]*n0 adcs x21,x21,x12 umulh x11,x7,x24 adcs x22,x22,x13 umulh x12,x8,x24 adc x23,xzr,xzr umulh x13,x9,x24 ldr x24,[x2,x28] // next b[i] adds x20,x20,x10 // (*) mul x10,x14,x25 str x25,[x26],#8 // put aside t[0]*n0 for tail processing adcs x21,x21,x11 mul x11,x15,x25 // lo(n[0..3]*t[0]*n0 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 // (*) adds xzr,x19,x10 subs xzr,x19,#1 // (*) umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0 adcs x19,x20,x11 umulh x11,x15,x25 adcs x20,x21,x12 umulh x12,x16,x25 adcs x21,x22,x13 umulh x13,x17,x25 adcs x22,x23,x0 adc x0,xzr,xzr adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr cbnz x28,.Loop_mul4x_reduction adc x0,x0,xzr ldp x10,x11,[x26,#8*4] // t[4..7] ldp x12,x13,[x26,#8*6] ldp x6,x7,[x1,#8*0] // a[4..7] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr ldr x25,[sp] // t[0]*n0 ldp x14,x15,[x3,#8*0] // n[4..7] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 .align 4 .Loop_mul4x_tail: mul x10,x6,x24 // lo(a[4..7]*b[4]) adc x0,x0,xzr // modulo-scheduled mul x11,x7,x24 add x28,x28,#8 mul x12,x8,x24 and x28,x28,#31 mul x13,x9,x24 adds x19,x19,x10 umulh x10,x6,x24 // hi(a[4..7]*b[4]) adcs x20,x20,x11 umulh x11,x7,x24 adcs x21,x21,x12 umulh x12,x8,x24 adcs x22,x22,x13 umulh x13,x9,x24 adc x23,xzr,xzr ldr x24,[x2,x28] // next b[i] adds x20,x20,x10 mul x10,x14,x25 // lo(n[4..7]*t[0]*n0) adcs x21,x21,x11 mul x11,x15,x25 adcs x22,x22,x12 mul x12,x16,x25 adc x23,x23,x13 // can't overflow mul x13,x17,x25 adds x19,x19,x10 umulh x10,x14,x25 // hi(n[4..7]*t[0]*n0) adcs x20,x20,x11 umulh x11,x15,x25 adcs x21,x21,x12 umulh x12,x16,x25 adcs x22,x22,x13 umulh x13,x17,x25 adcs x23,x23,x0 ldr x25,[sp,x28] // next a[0]*n0 adc x0,xzr,xzr str x19,[x26],#8 // result!!! adds x19,x20,x10 sub x10,x27,x1 // done yet? adcs x20,x21,x11 adcs x21,x22,x12 adcs x22,x23,x13 //adc x0,x0,xzr cbnz x28,.Loop_mul4x_tail sub x11,x3,x5 // rewinded np? adc x0,x0,xzr cbz x10,.Loop_mul4x_break ldp x10,x11,[x26,#8*4] ldp x12,x13,[x26,#8*6] ldp x6,x7,[x1,#8*0] ldp x8,x9,[x1,#8*2] add x1,x1,#8*4 adds x19,x19,x10 adcs x20,x20,x11 adcs x21,x21,x12 adcs x22,x22,x13 //adc x0,x0,xzr ldp x14,x15,[x3,#8*0] ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 b .Loop_mul4x_tail .align 4 .Loop_mul4x_break: ldp x12,x13,[x29,#96] // pull rp and &b[num] adds x19,x19,x30 add x2,x2,#8*4 // bp++ adcs x20,x20,xzr sub x1,x1,x5 // rewind ap adcs x21,x21,xzr stp x19,x20,[x26,#8*0] // result!!! adcs x22,x22,xzr ldp x19,x20,[sp,#8*4] // t[0..3] adc x30,x0,xzr stp x21,x22,[x26,#8*2] // result!!! cmp x2,x13 // done yet? ldp x21,x22,[sp,#8*6] ldp x14,x15,[x11,#8*0] // n[0..3] ldp x16,x17,[x11,#8*2] add x3,x11,#8*4 b.eq .Lmul4x_post ldr x24,[x2] ldp x6,x7,[x1,#8*0] // a[0..3] ldp x8,x9,[x1,#8*2] adds x1,x1,#8*4 // clear carry bit mov x0,xzr mov x26,sp b .Loop_mul4x_reduction .align 4 .Lmul4x_post: // Final step. We see if result is larger than modulus, and // if it is, subtract the modulus. But comparison implies // subtraction. So we subtract modulus, see if it borrowed, // and conditionally copy original value. mov x0,x12 mov x27,x12 // x0 copy subs x10,x19,x14 add x26,sp,#8*8 sbcs x11,x20,x15 sub x28,x5,#8*4 .Lmul4x_sub: sbcs x12,x21,x16 ldp x14,x15,[x3,#8*0] sub x28,x28,#8*4 ldp x19,x20,[x26,#8*0] sbcs x13,x22,x17 ldp x16,x17,[x3,#8*2] add x3,x3,#8*4 ldp x21,x22,[x26,#8*2] add x26,x26,#8*4 stp x10,x11,[x0,#8*0] sbcs x10,x19,x14 stp x12,x13,[x0,#8*2] add x0,x0,#8*4 sbcs x11,x20,x15 cbnz x28,.Lmul4x_sub sbcs x12,x21,x16 mov x26,sp add x1,sp,#8*4 ldp x6,x7,[x27,#8*0] sbcs x13,x22,x17 stp x10,x11,[x0,#8*0] ldp x8,x9,[x27,#8*2] stp x12,x13,[x0,#8*2] ldp x19,x20,[x1,#8*0] ldp x21,x22,[x1,#8*2] sbcs xzr,x30,xzr // did it borrow? ldr x30,[x29,#8] // pull return address sub x28,x5,#8*4 .Lmul4x_cond_copy: sub x28,x28,#8*4 csel x10,x19,x6,lo stp xzr,xzr,[x26,#8*0] csel x11,x20,x7,lo ldp x6,x7,[x27,#8*4] ldp x19,x20,[x1,#8*4] csel x12,x21,x8,lo stp xzr,xzr,[x26,#8*2] add x26,x26,#8*4 csel x13,x22,x9,lo ldp x8,x9,[x27,#8*6] ldp x21,x22,[x1,#8*6] add x1,x1,#8*4 stp x10,x11,[x27,#8*0] stp x12,x13,[x27,#8*2] add x27,x27,#8*4 cbnz x28,.Lmul4x_cond_copy csel x10,x19,x6,lo stp xzr,xzr,[x26,#8*0] csel x11,x20,x7,lo stp xzr,xzr,[x26,#8*2] csel x12,x21,x8,lo stp xzr,xzr,[x26,#8*3] csel x13,x22,x9,lo stp xzr,xzr,[x26,#8*4] stp x10,x11,[x27,#8*0] stp x12,x13,[x27,#8*2] b .Lmul4x_done .align 4 .Lmul4x4_post_condition: adc x0,x0,xzr ldr x1,[x29,#96] // pull rp // x19-3,x0 hold result, x14-7 hold modulus subs x6,x19,x14 ldr x30,[x29,#8] // pull return address sbcs x7,x20,x15 stp xzr,xzr,[sp,#8*0] sbcs x8,x21,x16 stp xzr,xzr,[sp,#8*2] sbcs x9,x22,x17 stp xzr,xzr,[sp,#8*4] sbcs xzr,x0,xzr // did it borrow? stp xzr,xzr,[sp,#8*6] // x6-3 hold result-modulus csel x6,x19,x6,lo csel x7,x20,x7,lo csel x8,x21,x8,lo csel x9,x22,x9,lo stp x6,x7,[x1,#8*0] stp x8,x9,[x1,#8*2] .Lmul4x_done: ldp x19,x20,[x29,#16] mov sp,x29 ldp x21,x22,[x29,#32] mov x0,#1 ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldr x29,[sp],#128 ret .size __bn_mul4x_mont,.-__bn_mul4x_mont .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/bsaes-armv7-ios32.S000064400000000000000000000422751353224261000166210ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) @ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel @ of Linaro. Permission to use under GPL terms is granted. @ ==================================================================== @ Bit-sliced AES for ARM NEON @ @ February 2012. @ @ This implementation is direct adaptation of bsaes-x86_64 module for @ ARM NEON. Except that this module is endian-neutral [in sense that @ it can be compiled for either endianness] by courtesy of vld1.8's @ neutrality. Initial version doesn't implement interface to OpenSSL, @ only low-level primitives and unsupported entry points, just enough @ to collect performance results, which for Cortex-A8 core are: @ @ encrypt 19.5 cycles per byte processed with 128-bit key @ decrypt 22.1 cycles per byte processed with 128-bit key @ key conv. 440 cycles per 128-bit key/0.18 of 8x block @ @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, @ which is [much] worse than anticipated (for further details see @ http://www.openssl.org/~appro/Snapdragon-S4.html). @ @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code @ manages in 20.0 cycles]. @ @ When comparing to x86_64 results keep in mind that NEON unit is @ [mostly] single-issue and thus can't [fully] benefit from @ instruction-level parallelism. And when comparing to aes-armv4 @ results keep in mind key schedule conversion overhead (see @ bsaes-x86_64.pl for further details)... @ @ @ April-August 2013 @ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} # define VFP_ABI_FRAME 0x40 #else # define VFP_ABI_PUSH # define VFP_ABI_POP # define VFP_ABI_FRAME 0 # define BSAES_ASM_EXTENDED_KEY # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif #ifdef __thumb__ # define adrl adr #endif #if __ARM_MAX_ARCH__>=7 .text .syntax unified @ ARMv7-capable assembler is expected to handle this #if defined(__thumb2__) && !defined(__APPLE__) .thumb #else .code 32 # undef __thumb2__ #endif .align 6 _bsaes_const: LM0ISR:@ InvShiftRows constants .quad 0x0a0e0206070b0f03, 0x0004080c0d010509 LISR: .quad 0x0504070602010003, 0x0f0e0d0c080b0a09 LISRM0: .quad 0x01040b0e0205080f, 0x0306090c00070a0d LM0SR:@ ShiftRows constants .quad 0x0a0e02060f03070b, 0x0004080c05090d01 LSR: .quad 0x0504070600030201, 0x0f0e0d0c0a09080b LSRM0: .quad 0x0304090e00050a0f, 0x01060b0c0207080d LM0: .quad 0x02060a0e03070b0f, 0x0004080c0105090d LREVM0SR: .quad 0x090d01050c000408, 0x03070b0f060a0e02 .byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 6 #ifdef __thumb2__ .thumb_func _bsaes_encrypt8 #endif .align 4 _bsaes_encrypt8: adr r6,. vldmia r4!, {q9} @ round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr r6,LM0SR #else sub r6,r6,#_bsaes_encrypt8-LM0SR #endif vldmia r6!, {q8} @ LM0SR _bsaes_encrypt8_alt: veor q10, q0, q9 @ xor with round0 key veor q11, q1, q9 vtbl.8 d0, {q10}, d16 vtbl.8 d1, {q10}, d17 veor q12, q2, q9 vtbl.8 d2, {q11}, d16 vtbl.8 d3, {q11}, d17 veor q13, q3, q9 vtbl.8 d4, {q12}, d16 vtbl.8 d5, {q12}, d17 veor q14, q4, q9 vtbl.8 d6, {q13}, d16 vtbl.8 d7, {q13}, d17 veor q15, q5, q9 vtbl.8 d8, {q14}, d16 vtbl.8 d9, {q14}, d17 veor q10, q6, q9 vtbl.8 d10, {q15}, d16 vtbl.8 d11, {q15}, d17 veor q11, q7, q9 vtbl.8 d12, {q10}, d16 vtbl.8 d13, {q10}, d17 vtbl.8 d14, {q11}, d16 vtbl.8 d15, {q11}, d17 _bsaes_encrypt8_bitslice: vmov.i8 q8,#0x55 @ compose LBS0 vmov.i8 q9,#0x33 @ compose LBS1 vshr.u64 q10, q6, #1 vshr.u64 q11, q4, #1 veor q10, q10, q7 veor q11, q11, q5 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #1 veor q5, q5, q11 vshl.u64 q11, q11, #1 veor q6, q6, q10 veor q4, q4, q11 vshr.u64 q10, q2, #1 vshr.u64 q11, q0, #1 veor q10, q10, q3 veor q11, q11, q1 vand q10, q10, q8 vand q11, q11, q8 veor q3, q3, q10 vshl.u64 q10, q10, #1 veor q1, q1, q11 vshl.u64 q11, q11, #1 veor q2, q2, q10 veor q0, q0, q11 vmov.i8 q8,#0x0f @ compose LBS2 vshr.u64 q10, q5, #2 vshr.u64 q11, q4, #2 veor q10, q10, q7 veor q11, q11, q6 vand q10, q10, q9 vand q11, q11, q9 veor q7, q7, q10 vshl.u64 q10, q10, #2 veor q6, q6, q11 vshl.u64 q11, q11, #2 veor q5, q5, q10 veor q4, q4, q11 vshr.u64 q10, q1, #2 vshr.u64 q11, q0, #2 veor q10, q10, q3 veor q11, q11, q2 vand q10, q10, q9 vand q11, q11, q9 veor q3, q3, q10 vshl.u64 q10, q10, #2 veor q2, q2, q11 vshl.u64 q11, q11, #2 veor q1, q1, q10 veor q0, q0, q11 vshr.u64 q10, q3, #4 vshr.u64 q11, q2, #4 veor q10, q10, q7 veor q11, q11, q6 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #4 veor q6, q6, q11 vshl.u64 q11, q11, #4 veor q3, q3, q10 veor q2, q2, q11 vshr.u64 q10, q1, #4 vshr.u64 q11, q0, #4 veor q10, q10, q5 veor q11, q11, q4 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #4 veor q4, q4, q11 vshl.u64 q11, q11, #4 veor q1, q1, q10 veor q0, q0, q11 sub r5,r5,#1 b Lenc_sbox .align 4 Lenc_loop: vldmia r4!, {q8,q9,q10,q11} veor q8, q8, q0 veor q9, q9, q1 vtbl.8 d0, {q8}, d24 vtbl.8 d1, {q8}, d25 vldmia r4!, {q8} veor q10, q10, q2 vtbl.8 d2, {q9}, d24 vtbl.8 d3, {q9}, d25 vldmia r4!, {q9} veor q11, q11, q3 vtbl.8 d4, {q10}, d24 vtbl.8 d5, {q10}, d25 vldmia r4!, {q10} vtbl.8 d6, {q11}, d24 vtbl.8 d7, {q11}, d25 vldmia r4!, {q11} veor q8, q8, q4 veor q9, q9, q5 vtbl.8 d8, {q8}, d24 vtbl.8 d9, {q8}, d25 veor q10, q10, q6 vtbl.8 d10, {q9}, d24 vtbl.8 d11, {q9}, d25 veor q11, q11, q7 vtbl.8 d12, {q10}, d24 vtbl.8 d13, {q10}, d25 vtbl.8 d14, {q11}, d24 vtbl.8 d15, {q11}, d25 Lenc_sbox: veor q2, q2, q1 veor q5, q5, q6 veor q3, q3, q0 veor q6, q6, q2 veor q5, q5, q0 veor q6, q6, q3 veor q3, q3, q7 veor q7, q7, q5 veor q3, q3, q4 veor q4, q4, q5 veor q2, q2, q7 veor q3, q3, q1 veor q1, q1, q5 veor q11, q7, q4 veor q10, q1, q2 veor q9, q5, q3 veor q13, q2, q4 vmov q8, q10 veor q12, q6, q0 vorr q10, q10, q9 veor q15, q11, q8 vand q14, q11, q12 vorr q11, q11, q12 veor q12, q12, q9 vand q8, q8, q9 veor q9, q3, q0 vand q15, q15, q12 vand q13, q13, q9 veor q9, q7, q1 veor q12, q5, q6 veor q11, q11, q13 veor q10, q10, q13 vand q13, q9, q12 vorr q9, q9, q12 veor q11, q11, q15 veor q8, q8, q13 veor q10, q10, q14 veor q9, q9, q15 veor q8, q8, q14 vand q12, q2, q3 veor q9, q9, q14 vand q13, q4, q0 vand q14, q1, q5 vorr q15, q7, q6 veor q11, q11, q12 veor q9, q9, q14 veor q8, q8, q15 veor q10, q10, q13 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 @ new smaller inversion vand q14, q11, q9 vmov q12, q8 veor q13, q10, q14 veor q15, q8, q14 veor q14, q8, q14 @ q14=q15 vbsl q13, q9, q8 vbsl q15, q11, q10 veor q11, q11, q10 vbsl q12, q13, q14 vbsl q8, q14, q13 vand q14, q12, q15 veor q9, q9, q8 veor q14, q14, q11 veor q12, q6, q0 veor q8, q5, q3 veor q10, q15, q14 vand q10, q10, q6 veor q6, q6, q5 vand q11, q5, q15 vand q6, q6, q14 veor q5, q11, q10 veor q6, q6, q11 veor q15, q15, q13 veor q14, q14, q9 veor q11, q15, q14 veor q10, q13, q9 vand q11, q11, q12 vand q10, q10, q0 veor q12, q12, q8 veor q0, q0, q3 vand q8, q8, q15 vand q3, q3, q13 vand q12, q12, q14 vand q0, q0, q9 veor q8, q8, q12 veor q0, q0, q3 veor q12, q12, q11 veor q3, q3, q10 veor q6, q6, q12 veor q0, q0, q12 veor q5, q5, q8 veor q3, q3, q8 veor q12, q7, q4 veor q8, q1, q2 veor q11, q15, q14 veor q10, q13, q9 vand q11, q11, q12 vand q10, q10, q4 veor q12, q12, q8 veor q4, q4, q2 vand q8, q8, q15 vand q2, q2, q13 vand q12, q12, q14 vand q4, q4, q9 veor q8, q8, q12 veor q4, q4, q2 veor q12, q12, q11 veor q2, q2, q10 veor q15, q15, q13 veor q14, q14, q9 veor q10, q15, q14 vand q10, q10, q7 veor q7, q7, q1 vand q11, q1, q15 vand q7, q7, q14 veor q1, q11, q10 veor q7, q7, q11 veor q7, q7, q12 veor q4, q4, q12 veor q1, q1, q8 veor q2, q2, q8 veor q7, q7, q0 veor q1, q1, q6 veor q6, q6, q0 veor q4, q4, q7 veor q0, q0, q1 veor q1, q1, q5 veor q5, q5, q2 veor q2, q2, q3 veor q3, q3, q5 veor q4, q4, q5 veor q6, q6, q3 subs r5,r5,#1 bcc Lenc_done vext.8 q8, q0, q0, #12 @ x0 <<< 32 vext.8 q9, q1, q1, #12 veor q0, q0, q8 @ x0 ^ (x0 <<< 32) vext.8 q10, q4, q4, #12 veor q1, q1, q9 vext.8 q11, q6, q6, #12 veor q4, q4, q10 vext.8 q12, q3, q3, #12 veor q6, q6, q11 vext.8 q13, q7, q7, #12 veor q3, q3, q12 vext.8 q14, q2, q2, #12 veor q7, q7, q13 vext.8 q15, q5, q5, #12 veor q2, q2, q14 veor q9, q9, q0 veor q5, q5, q15 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) veor q10, q10, q1 veor q8, q8, q5 veor q9, q9, q5 vext.8 q1, q1, q1, #8 veor q13, q13, q3 veor q0, q0, q8 veor q14, q14, q7 veor q1, q1, q9 vext.8 q8, q3, q3, #8 veor q12, q12, q6 vext.8 q9, q7, q7, #8 veor q15, q15, q2 vext.8 q3, q6, q6, #8 veor q11, q11, q4 vext.8 q7, q5, q5, #8 veor q12, q12, q5 vext.8 q6, q2, q2, #8 veor q11, q11, q5 vext.8 q2, q4, q4, #8 veor q5, q9, q13 veor q4, q8, q12 veor q3, q3, q11 veor q7, q7, q15 veor q6, q6, q14 @ vmov q4, q8 veor q2, q2, q10 @ vmov q5, q9 vldmia r6, {q12} @ LSR ite eq @ Thumb2 thing, samity check in ARM addeq r6,r6,#0x10 bne Lenc_loop vldmia r6, {q12} @ LSRM0 b Lenc_loop .align 4 Lenc_done: vmov.i8 q8,#0x55 @ compose LBS0 vmov.i8 q9,#0x33 @ compose LBS1 vshr.u64 q10, q2, #1 vshr.u64 q11, q3, #1 veor q10, q10, q5 veor q11, q11, q7 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #1 veor q7, q7, q11 vshl.u64 q11, q11, #1 veor q2, q2, q10 veor q3, q3, q11 vshr.u64 q10, q4, #1 vshr.u64 q11, q0, #1 veor q10, q10, q6 veor q11, q11, q1 vand q10, q10, q8 vand q11, q11, q8 veor q6, q6, q10 vshl.u64 q10, q10, #1 veor q1, q1, q11 vshl.u64 q11, q11, #1 veor q4, q4, q10 veor q0, q0, q11 vmov.i8 q8,#0x0f @ compose LBS2 vshr.u64 q10, q7, #2 vshr.u64 q11, q3, #2 veor q10, q10, q5 veor q11, q11, q2 vand q10, q10, q9 vand q11, q11, q9 veor q5, q5, q10 vshl.u64 q10, q10, #2 veor q2, q2, q11 vshl.u64 q11, q11, #2 veor q7, q7, q10 veor q3, q3, q11 vshr.u64 q10, q1, #2 vshr.u64 q11, q0, #2 veor q10, q10, q6 veor q11, q11, q4 vand q10, q10, q9 vand q11, q11, q9 veor q6, q6, q10 vshl.u64 q10, q10, #2 veor q4, q4, q11 vshl.u64 q11, q11, #2 veor q1, q1, q10 veor q0, q0, q11 vshr.u64 q10, q6, #4 vshr.u64 q11, q4, #4 veor q10, q10, q5 veor q11, q11, q2 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #4 veor q2, q2, q11 vshl.u64 q11, q11, #4 veor q6, q6, q10 veor q4, q4, q11 vshr.u64 q10, q1, #4 vshr.u64 q11, q0, #4 veor q10, q10, q7 veor q11, q11, q3 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #4 veor q3, q3, q11 vshl.u64 q11, q11, #4 veor q1, q1, q10 veor q0, q0, q11 vldmia r4, {q8} @ last round key veor q4, q4, q8 veor q6, q6, q8 veor q3, q3, q8 veor q7, q7, q8 veor q2, q2, q8 veor q5, q5, q8 veor q0, q0, q8 veor q1, q1, q8 bx lr #ifdef __thumb2__ .thumb_func _bsaes_key_convert #endif .align 4 _bsaes_key_convert: adr r6,. vld1.8 {q7}, [r4]! @ load round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr r6,LM0 #else sub r6,r6,#_bsaes_key_convert-LM0 #endif vld1.8 {q15}, [r4]! @ load round 1 key vmov.i8 q8, #0x01 @ bit masks vmov.i8 q9, #0x02 vmov.i8 q10, #0x04 vmov.i8 q11, #0x08 vmov.i8 q12, #0x10 vmov.i8 q13, #0x20 vldmia r6, {q14} @ LM0 #ifdef __ARMEL__ vrev32.8 q7, q7 vrev32.8 q15, q15 #endif sub r5,r5,#1 vstmia r12!, {q7} @ save round 0 key b Lkey_loop .align 4 Lkey_loop: vtbl.8 d14,{q15},d28 vtbl.8 d15,{q15},d29 vmov.i8 q6, #0x40 vmov.i8 q15, #0x80 vtst.8 q0, q7, q8 vtst.8 q1, q7, q9 vtst.8 q2, q7, q10 vtst.8 q3, q7, q11 vtst.8 q4, q7, q12 vtst.8 q5, q7, q13 vtst.8 q6, q7, q6 vtst.8 q7, q7, q15 vld1.8 {q15}, [r4]! @ load next round key vmvn q0, q0 @ "pnot" vmvn q1, q1 vmvn q5, q5 vmvn q6, q6 #ifdef __ARMEL__ vrev32.8 q15, q15 #endif subs r5,r5,#1 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key bne Lkey_loop vmov.i8 q7,#0x63 @ compose L63 @ don't save last round key bx lr .globl _GFp_bsaes_ctr32_encrypt_blocks .private_extern _GFp_bsaes_ctr32_encrypt_blocks #ifdef __thumb2__ .thumb_func _GFp_bsaes_ctr32_encrypt_blocks #endif .align 5 _GFp_bsaes_ctr32_encrypt_blocks: @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this @ out to retain a constant-time implementation. mov ip, sp stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} VFP_ABI_PUSH ldr r8, [ip] @ ctr is 1st arg on the stack sub sp, sp, #0x10 @ scratch space to carry over the ctr mov r9, sp @ save sp ldr r10, [r3, #240] @ get # of rounds #ifndef BSAES_ASM_EXTENDED_KEY @ allocate the key schedule on the stack sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key add r12, #96 @ size of bit-sliced key schedule @ populate the key schedule mov r4, r3 @ pass key mov r5, r10 @ pass # of rounds mov sp, r12 @ sp is sp bl _bsaes_key_convert veor q7,q7,q15 @ fix up last round key vstmia r12, {q7} @ save last round key vld1.8 {q0}, [r8] @ load counter #ifdef __APPLE__ mov r8, #:lower16:(LREVM0SR-LM0) add r8, r6, r8 #else add r8, r6, #LREVM0SR-LM0 @ borrow r8 #endif vldmia sp, {q4} @ load round0 key #else ldr r12, [r3, #244] eors r12, #1 beq 0f @ populate the key schedule str r12, [r3, #244] mov r4, r3 @ pass key mov r5, r10 @ pass # of rounds add r12, r3, #248 @ pass key schedule bl _bsaes_key_convert veor q7,q7,q15 @ fix up last round key vstmia r12, {q7} @ save last round key .align 2 add r12, r3, #248 vld1.8 {q0}, [r8] @ load counter adrl r8, LREVM0SR @ borrow r8 vldmia r12, {q4} @ load round0 key sub sp, #0x10 @ place for adjusted round0 key #endif vmov.i32 q8,#1 @ compose 1<<96 veor q9,q9,q9 vrev32.8 q0,q0 vext.8 q8,q9,q8,#4 vrev32.8 q4,q4 vadd.u32 q9,q8,q8 @ compose 2<<96 vstmia sp, {q4} @ save adjusted round0 key b Lctr_enc_loop .align 4 Lctr_enc_loop: vadd.u32 q10, q8, q9 @ compose 3<<96 vadd.u32 q1, q0, q8 @ +1 vadd.u32 q2, q0, q9 @ +2 vadd.u32 q3, q0, q10 @ +3 vadd.u32 q4, q1, q10 vadd.u32 q5, q2, q10 vadd.u32 q6, q3, q10 vadd.u32 q7, q4, q10 vadd.u32 q10, q5, q10 @ next counter @ Borrow prologue from _bsaes_encrypt8 to use the opportunity @ to flip byte order in 32-bit counter vldmia sp, {q9} @ load round0 key #ifndef BSAES_ASM_EXTENDED_KEY add r4, sp, #0x10 @ pass next round key #else add r4, r3, #264 #endif vldmia r8, {q8} @ LREVM0SR mov r5, r10 @ pass rounds vstmia r9, {q10} @ save next counter #ifdef __APPLE__ mov r6, #:lower16:(LREVM0SR-LSR) sub r6, r8, r6 #else sub r6, r8, #LREVM0SR-LSR @ pass constants #endif bl _bsaes_encrypt8_alt subs r2, r2, #8 blo Lctr_enc_loop_done vld1.8 {q8,q9}, [r0]! @ load input vld1.8 {q10,q11}, [r0]! veor q0, q8 veor q1, q9 vld1.8 {q12,q13}, [r0]! veor q4, q10 veor q6, q11 vld1.8 {q14,q15}, [r0]! veor q3, q12 vst1.8 {q0,q1}, [r1]! @ write output veor q7, q13 veor q2, q14 vst1.8 {q4}, [r1]! veor q5, q15 vst1.8 {q6}, [r1]! vmov.i32 q8, #1 @ compose 1<<96 vst1.8 {q3}, [r1]! veor q9, q9, q9 vst1.8 {q7}, [r1]! vext.8 q8, q9, q8, #4 vst1.8 {q2}, [r1]! vadd.u32 q9,q8,q8 @ compose 2<<96 vst1.8 {q5}, [r1]! vldmia r9, {q0} @ load counter bne Lctr_enc_loop b Lctr_enc_done .align 4 Lctr_enc_loop_done: add r2, r2, #8 vld1.8 {q8}, [r0]! @ load input veor q0, q8 vst1.8 {q0}, [r1]! @ write output cmp r2, #2 blo Lctr_enc_done vld1.8 {q9}, [r0]! veor q1, q9 vst1.8 {q1}, [r1]! beq Lctr_enc_done vld1.8 {q10}, [r0]! veor q4, q10 vst1.8 {q4}, [r1]! cmp r2, #4 blo Lctr_enc_done vld1.8 {q11}, [r0]! veor q6, q11 vst1.8 {q6}, [r1]! beq Lctr_enc_done vld1.8 {q12}, [r0]! veor q3, q12 vst1.8 {q3}, [r1]! cmp r2, #6 blo Lctr_enc_done vld1.8 {q13}, [r0]! veor q7, q13 vst1.8 {q7}, [r1]! beq Lctr_enc_done vld1.8 {q14}, [r0] veor q2, q14 vst1.8 {q2}, [r1]! Lctr_enc_done: vmov.i32 q0, #0 vmov.i32 q1, #0 #ifndef BSAES_ASM_EXTENDED_KEY Lctr_enc_bzero:@ wipe key schedule [if any] vstmia sp!, {q0,q1} cmp sp, r9 bne Lctr_enc_bzero #else vstmia sp, {q0,q1} #endif mov sp, r9 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb VFP_ABI_POP ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return @ OpenSSL contains aes_nohw_* fallback code here. We patch this @ out to retain a constant-time implementation. #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/bsaes-armv7-linux32.S000064400000000000000000000426621353224261200171700ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) @ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel @ of Linaro. Permission to use under GPL terms is granted. @ ==================================================================== @ Bit-sliced AES for ARM NEON @ @ February 2012. @ @ This implementation is direct adaptation of bsaes-x86_64 module for @ ARM NEON. Except that this module is endian-neutral [in sense that @ it can be compiled for either endianness] by courtesy of vld1.8's @ neutrality. Initial version doesn't implement interface to OpenSSL, @ only low-level primitives and unsupported entry points, just enough @ to collect performance results, which for Cortex-A8 core are: @ @ encrypt 19.5 cycles per byte processed with 128-bit key @ decrypt 22.1 cycles per byte processed with 128-bit key @ key conv. 440 cycles per 128-bit key/0.18 of 8x block @ @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, @ which is [much] worse than anticipated (for further details see @ http://www.openssl.org/~appro/Snapdragon-S4.html). @ @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code @ manages in 20.0 cycles]. @ @ When comparing to x86_64 results keep in mind that NEON unit is @ [mostly] single-issue and thus can't [fully] benefit from @ instruction-level parallelism. And when comparing to aes-armv4 @ results keep in mind key schedule conversion overhead (see @ bsaes-x86_64.pl for further details)... @ @ @ April-August 2013 @ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} # define VFP_ABI_FRAME 0x40 #else # define VFP_ABI_PUSH # define VFP_ABI_POP # define VFP_ABI_FRAME 0 # define BSAES_ASM_EXTENDED_KEY # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif #ifdef __thumb__ # define adrl adr #endif #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .text .syntax unified @ ARMv7-capable assembler is expected to handle this #if defined(__thumb2__) && !defined(__APPLE__) .thumb #else .code 32 # undef __thumb2__ #endif .type _bsaes_const,%object .align 6 _bsaes_const: .LM0ISR:@ InvShiftRows constants .quad 0x0a0e0206070b0f03, 0x0004080c0d010509 .LISR: .quad 0x0504070602010003, 0x0f0e0d0c080b0a09 .LISRM0: .quad 0x01040b0e0205080f, 0x0306090c00070a0d .LM0SR:@ ShiftRows constants .quad 0x0a0e02060f03070b, 0x0004080c05090d01 .LSR: .quad 0x0504070600030201, 0x0f0e0d0c0a09080b .LSRM0: .quad 0x0304090e00050a0f, 0x01060b0c0207080d .LM0: .quad 0x02060a0e03070b0f, 0x0004080c0105090d .LREVM0SR: .quad 0x090d01050c000408, 0x03070b0f060a0e02 .byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 6 .size _bsaes_const,.-_bsaes_const .type _bsaes_encrypt8,%function .align 4 _bsaes_encrypt8: adr r6,. vldmia r4!, {q9} @ round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr r6,.LM0SR #else sub r6,r6,#_bsaes_encrypt8-.LM0SR #endif vldmia r6!, {q8} @ .LM0SR _bsaes_encrypt8_alt: veor q10, q0, q9 @ xor with round0 key veor q11, q1, q9 vtbl.8 d0, {q10}, d16 vtbl.8 d1, {q10}, d17 veor q12, q2, q9 vtbl.8 d2, {q11}, d16 vtbl.8 d3, {q11}, d17 veor q13, q3, q9 vtbl.8 d4, {q12}, d16 vtbl.8 d5, {q12}, d17 veor q14, q4, q9 vtbl.8 d6, {q13}, d16 vtbl.8 d7, {q13}, d17 veor q15, q5, q9 vtbl.8 d8, {q14}, d16 vtbl.8 d9, {q14}, d17 veor q10, q6, q9 vtbl.8 d10, {q15}, d16 vtbl.8 d11, {q15}, d17 veor q11, q7, q9 vtbl.8 d12, {q10}, d16 vtbl.8 d13, {q10}, d17 vtbl.8 d14, {q11}, d16 vtbl.8 d15, {q11}, d17 _bsaes_encrypt8_bitslice: vmov.i8 q8,#0x55 @ compose .LBS0 vmov.i8 q9,#0x33 @ compose .LBS1 vshr.u64 q10, q6, #1 vshr.u64 q11, q4, #1 veor q10, q10, q7 veor q11, q11, q5 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #1 veor q5, q5, q11 vshl.u64 q11, q11, #1 veor q6, q6, q10 veor q4, q4, q11 vshr.u64 q10, q2, #1 vshr.u64 q11, q0, #1 veor q10, q10, q3 veor q11, q11, q1 vand q10, q10, q8 vand q11, q11, q8 veor q3, q3, q10 vshl.u64 q10, q10, #1 veor q1, q1, q11 vshl.u64 q11, q11, #1 veor q2, q2, q10 veor q0, q0, q11 vmov.i8 q8,#0x0f @ compose .LBS2 vshr.u64 q10, q5, #2 vshr.u64 q11, q4, #2 veor q10, q10, q7 veor q11, q11, q6 vand q10, q10, q9 vand q11, q11, q9 veor q7, q7, q10 vshl.u64 q10, q10, #2 veor q6, q6, q11 vshl.u64 q11, q11, #2 veor q5, q5, q10 veor q4, q4, q11 vshr.u64 q10, q1, #2 vshr.u64 q11, q0, #2 veor q10, q10, q3 veor q11, q11, q2 vand q10, q10, q9 vand q11, q11, q9 veor q3, q3, q10 vshl.u64 q10, q10, #2 veor q2, q2, q11 vshl.u64 q11, q11, #2 veor q1, q1, q10 veor q0, q0, q11 vshr.u64 q10, q3, #4 vshr.u64 q11, q2, #4 veor q10, q10, q7 veor q11, q11, q6 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #4 veor q6, q6, q11 vshl.u64 q11, q11, #4 veor q3, q3, q10 veor q2, q2, q11 vshr.u64 q10, q1, #4 vshr.u64 q11, q0, #4 veor q10, q10, q5 veor q11, q11, q4 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #4 veor q4, q4, q11 vshl.u64 q11, q11, #4 veor q1, q1, q10 veor q0, q0, q11 sub r5,r5,#1 b .Lenc_sbox .align 4 .Lenc_loop: vldmia r4!, {q8,q9,q10,q11} veor q8, q8, q0 veor q9, q9, q1 vtbl.8 d0, {q8}, d24 vtbl.8 d1, {q8}, d25 vldmia r4!, {q8} veor q10, q10, q2 vtbl.8 d2, {q9}, d24 vtbl.8 d3, {q9}, d25 vldmia r4!, {q9} veor q11, q11, q3 vtbl.8 d4, {q10}, d24 vtbl.8 d5, {q10}, d25 vldmia r4!, {q10} vtbl.8 d6, {q11}, d24 vtbl.8 d7, {q11}, d25 vldmia r4!, {q11} veor q8, q8, q4 veor q9, q9, q5 vtbl.8 d8, {q8}, d24 vtbl.8 d9, {q8}, d25 veor q10, q10, q6 vtbl.8 d10, {q9}, d24 vtbl.8 d11, {q9}, d25 veor q11, q11, q7 vtbl.8 d12, {q10}, d24 vtbl.8 d13, {q10}, d25 vtbl.8 d14, {q11}, d24 vtbl.8 d15, {q11}, d25 .Lenc_sbox: veor q2, q2, q1 veor q5, q5, q6 veor q3, q3, q0 veor q6, q6, q2 veor q5, q5, q0 veor q6, q6, q3 veor q3, q3, q7 veor q7, q7, q5 veor q3, q3, q4 veor q4, q4, q5 veor q2, q2, q7 veor q3, q3, q1 veor q1, q1, q5 veor q11, q7, q4 veor q10, q1, q2 veor q9, q5, q3 veor q13, q2, q4 vmov q8, q10 veor q12, q6, q0 vorr q10, q10, q9 veor q15, q11, q8 vand q14, q11, q12 vorr q11, q11, q12 veor q12, q12, q9 vand q8, q8, q9 veor q9, q3, q0 vand q15, q15, q12 vand q13, q13, q9 veor q9, q7, q1 veor q12, q5, q6 veor q11, q11, q13 veor q10, q10, q13 vand q13, q9, q12 vorr q9, q9, q12 veor q11, q11, q15 veor q8, q8, q13 veor q10, q10, q14 veor q9, q9, q15 veor q8, q8, q14 vand q12, q2, q3 veor q9, q9, q14 vand q13, q4, q0 vand q14, q1, q5 vorr q15, q7, q6 veor q11, q11, q12 veor q9, q9, q14 veor q8, q8, q15 veor q10, q10, q13 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 @ new smaller inversion vand q14, q11, q9 vmov q12, q8 veor q13, q10, q14 veor q15, q8, q14 veor q14, q8, q14 @ q14=q15 vbsl q13, q9, q8 vbsl q15, q11, q10 veor q11, q11, q10 vbsl q12, q13, q14 vbsl q8, q14, q13 vand q14, q12, q15 veor q9, q9, q8 veor q14, q14, q11 veor q12, q6, q0 veor q8, q5, q3 veor q10, q15, q14 vand q10, q10, q6 veor q6, q6, q5 vand q11, q5, q15 vand q6, q6, q14 veor q5, q11, q10 veor q6, q6, q11 veor q15, q15, q13 veor q14, q14, q9 veor q11, q15, q14 veor q10, q13, q9 vand q11, q11, q12 vand q10, q10, q0 veor q12, q12, q8 veor q0, q0, q3 vand q8, q8, q15 vand q3, q3, q13 vand q12, q12, q14 vand q0, q0, q9 veor q8, q8, q12 veor q0, q0, q3 veor q12, q12, q11 veor q3, q3, q10 veor q6, q6, q12 veor q0, q0, q12 veor q5, q5, q8 veor q3, q3, q8 veor q12, q7, q4 veor q8, q1, q2 veor q11, q15, q14 veor q10, q13, q9 vand q11, q11, q12 vand q10, q10, q4 veor q12, q12, q8 veor q4, q4, q2 vand q8, q8, q15 vand q2, q2, q13 vand q12, q12, q14 vand q4, q4, q9 veor q8, q8, q12 veor q4, q4, q2 veor q12, q12, q11 veor q2, q2, q10 veor q15, q15, q13 veor q14, q14, q9 veor q10, q15, q14 vand q10, q10, q7 veor q7, q7, q1 vand q11, q1, q15 vand q7, q7, q14 veor q1, q11, q10 veor q7, q7, q11 veor q7, q7, q12 veor q4, q4, q12 veor q1, q1, q8 veor q2, q2, q8 veor q7, q7, q0 veor q1, q1, q6 veor q6, q6, q0 veor q4, q4, q7 veor q0, q0, q1 veor q1, q1, q5 veor q5, q5, q2 veor q2, q2, q3 veor q3, q3, q5 veor q4, q4, q5 veor q6, q6, q3 subs r5,r5,#1 bcc .Lenc_done vext.8 q8, q0, q0, #12 @ x0 <<< 32 vext.8 q9, q1, q1, #12 veor q0, q0, q8 @ x0 ^ (x0 <<< 32) vext.8 q10, q4, q4, #12 veor q1, q1, q9 vext.8 q11, q6, q6, #12 veor q4, q4, q10 vext.8 q12, q3, q3, #12 veor q6, q6, q11 vext.8 q13, q7, q7, #12 veor q3, q3, q12 vext.8 q14, q2, q2, #12 veor q7, q7, q13 vext.8 q15, q5, q5, #12 veor q2, q2, q14 veor q9, q9, q0 veor q5, q5, q15 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) veor q10, q10, q1 veor q8, q8, q5 veor q9, q9, q5 vext.8 q1, q1, q1, #8 veor q13, q13, q3 veor q0, q0, q8 veor q14, q14, q7 veor q1, q1, q9 vext.8 q8, q3, q3, #8 veor q12, q12, q6 vext.8 q9, q7, q7, #8 veor q15, q15, q2 vext.8 q3, q6, q6, #8 veor q11, q11, q4 vext.8 q7, q5, q5, #8 veor q12, q12, q5 vext.8 q6, q2, q2, #8 veor q11, q11, q5 vext.8 q2, q4, q4, #8 veor q5, q9, q13 veor q4, q8, q12 veor q3, q3, q11 veor q7, q7, q15 veor q6, q6, q14 @ vmov q4, q8 veor q2, q2, q10 @ vmov q5, q9 vldmia r6, {q12} @ .LSR ite eq @ Thumb2 thing, samity check in ARM addeq r6,r6,#0x10 bne .Lenc_loop vldmia r6, {q12} @ .LSRM0 b .Lenc_loop .align 4 .Lenc_done: vmov.i8 q8,#0x55 @ compose .LBS0 vmov.i8 q9,#0x33 @ compose .LBS1 vshr.u64 q10, q2, #1 vshr.u64 q11, q3, #1 veor q10, q10, q5 veor q11, q11, q7 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #1 veor q7, q7, q11 vshl.u64 q11, q11, #1 veor q2, q2, q10 veor q3, q3, q11 vshr.u64 q10, q4, #1 vshr.u64 q11, q0, #1 veor q10, q10, q6 veor q11, q11, q1 vand q10, q10, q8 vand q11, q11, q8 veor q6, q6, q10 vshl.u64 q10, q10, #1 veor q1, q1, q11 vshl.u64 q11, q11, #1 veor q4, q4, q10 veor q0, q0, q11 vmov.i8 q8,#0x0f @ compose .LBS2 vshr.u64 q10, q7, #2 vshr.u64 q11, q3, #2 veor q10, q10, q5 veor q11, q11, q2 vand q10, q10, q9 vand q11, q11, q9 veor q5, q5, q10 vshl.u64 q10, q10, #2 veor q2, q2, q11 vshl.u64 q11, q11, #2 veor q7, q7, q10 veor q3, q3, q11 vshr.u64 q10, q1, #2 vshr.u64 q11, q0, #2 veor q10, q10, q6 veor q11, q11, q4 vand q10, q10, q9 vand q11, q11, q9 veor q6, q6, q10 vshl.u64 q10, q10, #2 veor q4, q4, q11 vshl.u64 q11, q11, #2 veor q1, q1, q10 veor q0, q0, q11 vshr.u64 q10, q6, #4 vshr.u64 q11, q4, #4 veor q10, q10, q5 veor q11, q11, q2 vand q10, q10, q8 vand q11, q11, q8 veor q5, q5, q10 vshl.u64 q10, q10, #4 veor q2, q2, q11 vshl.u64 q11, q11, #4 veor q6, q6, q10 veor q4, q4, q11 vshr.u64 q10, q1, #4 vshr.u64 q11, q0, #4 veor q10, q10, q7 veor q11, q11, q3 vand q10, q10, q8 vand q11, q11, q8 veor q7, q7, q10 vshl.u64 q10, q10, #4 veor q3, q3, q11 vshl.u64 q11, q11, #4 veor q1, q1, q10 veor q0, q0, q11 vldmia r4, {q8} @ last round key veor q4, q4, q8 veor q6, q6, q8 veor q3, q3, q8 veor q7, q7, q8 veor q2, q2, q8 veor q5, q5, q8 veor q0, q0, q8 veor q1, q1, q8 bx lr .size _bsaes_encrypt8,.-_bsaes_encrypt8 .type _bsaes_key_convert,%function .align 4 _bsaes_key_convert: adr r6,. vld1.8 {q7}, [r4]! @ load round 0 key #if defined(__thumb2__) || defined(__APPLE__) adr r6,.LM0 #else sub r6,r6,#_bsaes_key_convert-.LM0 #endif vld1.8 {q15}, [r4]! @ load round 1 key vmov.i8 q8, #0x01 @ bit masks vmov.i8 q9, #0x02 vmov.i8 q10, #0x04 vmov.i8 q11, #0x08 vmov.i8 q12, #0x10 vmov.i8 q13, #0x20 vldmia r6, {q14} @ .LM0 #ifdef __ARMEL__ vrev32.8 q7, q7 vrev32.8 q15, q15 #endif sub r5,r5,#1 vstmia r12!, {q7} @ save round 0 key b .Lkey_loop .align 4 .Lkey_loop: vtbl.8 d14,{q15},d28 vtbl.8 d15,{q15},d29 vmov.i8 q6, #0x40 vmov.i8 q15, #0x80 vtst.8 q0, q7, q8 vtst.8 q1, q7, q9 vtst.8 q2, q7, q10 vtst.8 q3, q7, q11 vtst.8 q4, q7, q12 vtst.8 q5, q7, q13 vtst.8 q6, q7, q6 vtst.8 q7, q7, q15 vld1.8 {q15}, [r4]! @ load next round key vmvn q0, q0 @ "pnot" vmvn q1, q1 vmvn q5, q5 vmvn q6, q6 #ifdef __ARMEL__ vrev32.8 q15, q15 #endif subs r5,r5,#1 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key bne .Lkey_loop vmov.i8 q7,#0x63 @ compose .L63 @ don't save last round key bx lr .size _bsaes_key_convert,.-_bsaes_key_convert .globl GFp_bsaes_ctr32_encrypt_blocks .hidden GFp_bsaes_ctr32_encrypt_blocks .type GFp_bsaes_ctr32_encrypt_blocks,%function .align 5 GFp_bsaes_ctr32_encrypt_blocks: @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this @ out to retain a constant-time implementation. mov ip, sp stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} VFP_ABI_PUSH ldr r8, [ip] @ ctr is 1st arg on the stack sub sp, sp, #0x10 @ scratch space to carry over the ctr mov r9, sp @ save sp ldr r10, [r3, #240] @ get # of rounds #ifndef BSAES_ASM_EXTENDED_KEY @ allocate the key schedule on the stack sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key add r12, #96 @ size of bit-sliced key schedule @ populate the key schedule mov r4, r3 @ pass key mov r5, r10 @ pass # of rounds mov sp, r12 @ sp is sp bl _bsaes_key_convert veor q7,q7,q15 @ fix up last round key vstmia r12, {q7} @ save last round key vld1.8 {q0}, [r8] @ load counter #ifdef __APPLE__ mov r8, #:lower16:(.LREVM0SR-.LM0) add r8, r6, r8 #else add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 #endif vldmia sp, {q4} @ load round0 key #else ldr r12, [r3, #244] eors r12, #1 beq 0f @ populate the key schedule str r12, [r3, #244] mov r4, r3 @ pass key mov r5, r10 @ pass # of rounds add r12, r3, #248 @ pass key schedule bl _bsaes_key_convert veor q7,q7,q15 @ fix up last round key vstmia r12, {q7} @ save last round key .align 2 add r12, r3, #248 vld1.8 {q0}, [r8] @ load counter adrl r8, .LREVM0SR @ borrow r8 vldmia r12, {q4} @ load round0 key sub sp, #0x10 @ place for adjusted round0 key #endif vmov.i32 q8,#1 @ compose 1<<96 veor q9,q9,q9 vrev32.8 q0,q0 vext.8 q8,q9,q8,#4 vrev32.8 q4,q4 vadd.u32 q9,q8,q8 @ compose 2<<96 vstmia sp, {q4} @ save adjusted round0 key b .Lctr_enc_loop .align 4 .Lctr_enc_loop: vadd.u32 q10, q8, q9 @ compose 3<<96 vadd.u32 q1, q0, q8 @ +1 vadd.u32 q2, q0, q9 @ +2 vadd.u32 q3, q0, q10 @ +3 vadd.u32 q4, q1, q10 vadd.u32 q5, q2, q10 vadd.u32 q6, q3, q10 vadd.u32 q7, q4, q10 vadd.u32 q10, q5, q10 @ next counter @ Borrow prologue from _bsaes_encrypt8 to use the opportunity @ to flip byte order in 32-bit counter vldmia sp, {q9} @ load round0 key #ifndef BSAES_ASM_EXTENDED_KEY add r4, sp, #0x10 @ pass next round key #else add r4, r3, #264 #endif vldmia r8, {q8} @ .LREVM0SR mov r5, r10 @ pass rounds vstmia r9, {q10} @ save next counter #ifdef __APPLE__ mov r6, #:lower16:(.LREVM0SR-.LSR) sub r6, r8, r6 #else sub r6, r8, #.LREVM0SR-.LSR @ pass constants #endif bl _bsaes_encrypt8_alt subs r2, r2, #8 blo .Lctr_enc_loop_done vld1.8 {q8,q9}, [r0]! @ load input vld1.8 {q10,q11}, [r0]! veor q0, q8 veor q1, q9 vld1.8 {q12,q13}, [r0]! veor q4, q10 veor q6, q11 vld1.8 {q14,q15}, [r0]! veor q3, q12 vst1.8 {q0,q1}, [r1]! @ write output veor q7, q13 veor q2, q14 vst1.8 {q4}, [r1]! veor q5, q15 vst1.8 {q6}, [r1]! vmov.i32 q8, #1 @ compose 1<<96 vst1.8 {q3}, [r1]! veor q9, q9, q9 vst1.8 {q7}, [r1]! vext.8 q8, q9, q8, #4 vst1.8 {q2}, [r1]! vadd.u32 q9,q8,q8 @ compose 2<<96 vst1.8 {q5}, [r1]! vldmia r9, {q0} @ load counter bne .Lctr_enc_loop b .Lctr_enc_done .align 4 .Lctr_enc_loop_done: add r2, r2, #8 vld1.8 {q8}, [r0]! @ load input veor q0, q8 vst1.8 {q0}, [r1]! @ write output cmp r2, #2 blo .Lctr_enc_done vld1.8 {q9}, [r0]! veor q1, q9 vst1.8 {q1}, [r1]! beq .Lctr_enc_done vld1.8 {q10}, [r0]! veor q4, q10 vst1.8 {q4}, [r1]! cmp r2, #4 blo .Lctr_enc_done vld1.8 {q11}, [r0]! veor q6, q11 vst1.8 {q6}, [r1]! beq .Lctr_enc_done vld1.8 {q12}, [r0]! veor q3, q12 vst1.8 {q3}, [r1]! cmp r2, #6 blo .Lctr_enc_done vld1.8 {q13}, [r0]! veor q7, q13 vst1.8 {q7}, [r1]! beq .Lctr_enc_done vld1.8 {q14}, [r0] veor q2, q14 vst1.8 {q2}, [r1]! .Lctr_enc_done: vmov.i32 q0, #0 vmov.i32 q1, #0 #ifndef BSAES_ASM_EXTENDED_KEY .Lctr_enc_bzero:@ wipe key schedule [if any] vstmia sp!, {q0,q1} cmp sp, r9 bne .Lctr_enc_bzero #else vstmia sp, {q0,q1} #endif mov sp, r9 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb VFP_ABI_POP ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return @ OpenSSL contains aes_nohw_* fallback code here. We patch this @ out to retain a constant-time implementation. .size GFp_bsaes_ctr32_encrypt_blocks,.-GFp_bsaes_ctr32_encrypt_blocks #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/chacha-armv4-ios32.S000064400000000000000000000711431353224261100167250ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #endif #if defined(__thumb2__) .thumb #else .code 32 #endif #if defined(__thumb2__) || defined(__clang__) #define ldrhsb ldrbhs #endif .align 5 Lsigma: .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral Lone: .long 1,0,0,0 #if __ARM_MAX_ARCH__>=7 LOPENSSL_armcap: .word GFp_armcap_P-LChaCha20_ctr32 #else .word -1 #endif .globl _GFp_ChaCha20_ctr32 .private_extern _GFp_ChaCha20_ctr32 #ifdef __thumb2__ .thumb_func _GFp_ChaCha20_ctr32 #endif .align 5 _GFp_ChaCha20_ctr32: LChaCha20_ctr32: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0,r1,r2,r4-r11,lr} #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r14,pc,#16 @ ChaCha20_ctr32 #else adr r14,LChaCha20_ctr32 #endif cmp r2,#0 @ len==0? #ifdef __thumb2__ itt eq #endif addeq sp,sp,#4*3 beq Lno_data #if __ARM_MAX_ARCH__>=7 cmp r2,#192 @ test len bls Lshort ldr r4,[r14,#-32] ldr r4,[r14,r4] # ifdef __APPLE__ ldr r4,[r4] # endif tst r4,#ARMV7_NEON bne LChaCha20_neon Lshort: #endif ldmia r12,{r4,r5,r6,r7} @ load counter and nonce sub sp,sp,#4*(16) @ off-load area sub r14,r14,#64 @ Lsigma stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key ldmia r14,{r0,r1,r2,r3} @ load sigma stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key stmdb sp!,{r0,r1,r2,r3} @ copy sigma str r10,[sp,#4*(16+10)] @ off-load "rx" str r11,[sp,#4*(16+11)] @ off-load "rx" b Loop_outer_enter .align 4 Loop_outer: ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material str r11,[sp,#4*(32+2)] @ save len str r12, [sp,#4*(32+1)] @ save inp str r14, [sp,#4*(32+0)] @ save out Loop_outer_enter: ldr r11, [sp,#4*(15)] ldr r12,[sp,#4*(12)] @ modulo-scheduled load ldr r10, [sp,#4*(13)] ldr r14,[sp,#4*(14)] str r11, [sp,#4*(16+15)] mov r11,#10 b Loop .align 4 Loop: subs r11,r11,#1 add r0,r0,r4 mov r12,r12,ror#16 add r1,r1,r5 mov r10,r10,ror#16 eor r12,r12,r0,ror#16 eor r10,r10,r1,ror#16 add r8,r8,r12 mov r4,r4,ror#20 add r9,r9,r10 mov r5,r5,ror#20 eor r4,r4,r8,ror#20 eor r5,r5,r9,ror#20 add r0,r0,r4 mov r12,r12,ror#24 add r1,r1,r5 mov r10,r10,ror#24 eor r12,r12,r0,ror#24 eor r10,r10,r1,ror#24 add r8,r8,r12 mov r4,r4,ror#25 add r9,r9,r10 mov r5,r5,ror#25 str r10,[sp,#4*(16+13)] ldr r10,[sp,#4*(16+15)] eor r4,r4,r8,ror#25 eor r5,r5,r9,ror#25 str r8,[sp,#4*(16+8)] ldr r8,[sp,#4*(16+10)] add r2,r2,r6 mov r14,r14,ror#16 str r9,[sp,#4*(16+9)] ldr r9,[sp,#4*(16+11)] add r3,r3,r7 mov r10,r10,ror#16 eor r14,r14,r2,ror#16 eor r10,r10,r3,ror#16 add r8,r8,r14 mov r6,r6,ror#20 add r9,r9,r10 mov r7,r7,ror#20 eor r6,r6,r8,ror#20 eor r7,r7,r9,ror#20 add r2,r2,r6 mov r14,r14,ror#24 add r3,r3,r7 mov r10,r10,ror#24 eor r14,r14,r2,ror#24 eor r10,r10,r3,ror#24 add r8,r8,r14 mov r6,r6,ror#25 add r9,r9,r10 mov r7,r7,ror#25 eor r6,r6,r8,ror#25 eor r7,r7,r9,ror#25 add r0,r0,r5 mov r10,r10,ror#16 add r1,r1,r6 mov r12,r12,ror#16 eor r10,r10,r0,ror#16 eor r12,r12,r1,ror#16 add r8,r8,r10 mov r5,r5,ror#20 add r9,r9,r12 mov r6,r6,ror#20 eor r5,r5,r8,ror#20 eor r6,r6,r9,ror#20 add r0,r0,r5 mov r10,r10,ror#24 add r1,r1,r6 mov r12,r12,ror#24 eor r10,r10,r0,ror#24 eor r12,r12,r1,ror#24 add r8,r8,r10 mov r5,r5,ror#25 str r10,[sp,#4*(16+15)] ldr r10,[sp,#4*(16+13)] add r9,r9,r12 mov r6,r6,ror#25 eor r5,r5,r8,ror#25 eor r6,r6,r9,ror#25 str r8,[sp,#4*(16+10)] ldr r8,[sp,#4*(16+8)] add r2,r2,r7 mov r10,r10,ror#16 str r9,[sp,#4*(16+11)] ldr r9,[sp,#4*(16+9)] add r3,r3,r4 mov r14,r14,ror#16 eor r10,r10,r2,ror#16 eor r14,r14,r3,ror#16 add r8,r8,r10 mov r7,r7,ror#20 add r9,r9,r14 mov r4,r4,ror#20 eor r7,r7,r8,ror#20 eor r4,r4,r9,ror#20 add r2,r2,r7 mov r10,r10,ror#24 add r3,r3,r4 mov r14,r14,ror#24 eor r10,r10,r2,ror#24 eor r14,r14,r3,ror#24 add r8,r8,r10 mov r7,r7,ror#25 add r9,r9,r14 mov r4,r4,ror#25 eor r7,r7,r8,ror#25 eor r4,r4,r9,ror#25 bne Loop ldr r11,[sp,#4*(32+2)] @ load len str r8, [sp,#4*(16+8)] @ modulo-scheduled store str r9, [sp,#4*(16+9)] str r12,[sp,#4*(16+12)] str r10, [sp,#4*(16+13)] str r14,[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ rx and second half at sp+4*(16+8) cmp r11,#64 @ done yet? #ifdef __thumb2__ itete lo #endif addlo r12,sp,#4*(0) @ shortcut or ... ldrhs r12,[sp,#4*(32+1)] @ ... load inp addlo r14,sp,#4*(0) @ shortcut or ... ldrhs r14,[sp,#4*(32+0)] @ ... load out ldr r8,[sp,#4*(0)] @ load key material ldr r9,[sp,#4*(1)] #if __ARM_ARCH__>=6 || !defined(__ARMEB__) # if __ARM_ARCH__<7 orr r10,r12,r14 tst r10,#3 @ are input and output aligned? ldr r10,[sp,#4*(2)] bne Lunaligned cmp r11,#64 @ restore flags # else ldr r10,[sp,#4*(2)] # endif ldr r11,[sp,#4*(3)] add r0,r0,r8 @ accumulate key material add r1,r1,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r2,r2,r10 add r3,r3,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif # ifdef __thumb2__ itt hs # endif eorhs r0,r0,r8 @ xor with input eorhs r1,r1,r9 add r8,sp,#4*(4) str r0,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r2,r2,r10 eorhs r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r1,[r14,#-12] str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r5,r5,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r6,r6,r10 add r7,r7,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif # ifdef __thumb2__ itt hs # endif eorhs r4,r4,r8 eorhs r5,r5,r9 add r8,sp,#4*(8) str r4,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r6,r6,r10 eorhs r7,r7,r11 str r5,[r14,#-12] ldmia r8,{r8,r9,r10,r11} @ load key material str r6,[r14,#-8] add r0,sp,#4*(16+8) str r7,[r14,#-4] ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material add r1,r1,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] # ifdef __thumb2__ itt hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it add r2,r2,r10 add r3,r3,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif # ifdef __thumb2__ itt hs # endif eorhs r0,r0,r8 eorhs r1,r1,r9 add r8,sp,#4*(12) str r0,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r2,r2,r10 eorhs r3,r3,r11 str r1,[r14,#-12] ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r5,r5,r9 # ifdef __thumb2__ itt hi # endif addhi r8,r8,#1 @ next counter value strhi r8,[sp,#4*(12)] @ save next counter value # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r6,r6,r10 add r7,r7,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif # ifdef __thumb2__ itt hs # endif eorhs r4,r4,r8 eorhs r5,r5,r9 # ifdef __thumb2__ it ne # endif ldrne r8,[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ itt hs # endif eorhs r6,r6,r10 eorhs r7,r7,r11 str r4,[r14],#16 @ store output str r5,[r14,#-12] # ifdef __thumb2__ it hs # endif subhs r11,r8,#64 @ len-=64 str r6,[r14,#-8] str r7,[r14,#-4] bhi Loop_outer beq Ldone # if __ARM_ARCH__<7 b Ltail .align 4 Lunaligned:@ unaligned endian-neutral path cmp r11,#64 @ restore flags # endif #endif #if __ARM_ARCH__<7 ldr r11,[sp,#4*(3)] add r0,r0,r8 @ accumulate key material add r1,r1,r9 add r2,r2,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r3,r3,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r0,r8,r0 @ xor with input (or zero) eor r1,r9,r1 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r2,r10,r2 strb r0,[r14],#16 @ store output eor r3,r11,r3 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r1,[r14,#-12] eor r0,r8,r0,lsr#8 strb r2,[r14,#-8] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r3,[r14,#-4] eor r2,r10,r2,lsr#8 strb r0,[r14,#-15] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r1,[r14,#-11] eor r0,r8,r0,lsr#8 strb r2,[r14,#-7] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r3,[r14,#-3] eor r2,r10,r2,lsr#8 strb r0,[r14,#-14] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r1,[r14,#-10] strb r2,[r14,#-6] eor r0,r8,r0,lsr#8 strb r3,[r14,#-2] eor r1,r9,r1,lsr#8 strb r0,[r14,#-13] eor r2,r10,r2,lsr#8 strb r1,[r14,#-9] eor r3,r11,r3,lsr#8 strb r2,[r14,#-5] strb r3,[r14,#-1] add r8,sp,#4*(4+0) ldmia r8,{r8,r9,r10,r11} @ load key material add r0,sp,#4*(16+8) add r4,r4,r8 @ accumulate key material add r5,r5,r9 add r6,r6,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r7,r7,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r4,r8,r4 @ xor with input (or zero) eor r5,r9,r5 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r6,r10,r6 strb r4,[r14],#16 @ store output eor r7,r11,r7 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r5,[r14,#-12] eor r4,r8,r4,lsr#8 strb r6,[r14,#-8] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r7,[r14,#-4] eor r6,r10,r6,lsr#8 strb r4,[r14,#-15] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r5,[r14,#-11] eor r4,r8,r4,lsr#8 strb r6,[r14,#-7] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r7,[r14,#-3] eor r6,r10,r6,lsr#8 strb r4,[r14,#-14] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r5,[r14,#-10] strb r6,[r14,#-6] eor r4,r8,r4,lsr#8 strb r7,[r14,#-2] eor r5,r9,r5,lsr#8 strb r4,[r14,#-13] eor r6,r10,r6,lsr#8 strb r5,[r14,#-9] eor r7,r11,r7,lsr#8 strb r6,[r14,#-5] strb r7,[r14,#-1] add r8,sp,#4*(4+4) ldmia r8,{r8,r9,r10,r11} @ load key material ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half # ifdef __thumb2__ itt hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" strhi r11,[sp,#4*(16+11)] @ copy "rx" add r0,r0,r8 @ accumulate key material add r1,r1,r9 add r2,r2,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r3,r3,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r0,r8,r0 @ xor with input (or zero) eor r1,r9,r1 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r2,r10,r2 strb r0,[r14],#16 @ store output eor r3,r11,r3 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r1,[r14,#-12] eor r0,r8,r0,lsr#8 strb r2,[r14,#-8] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r3,[r14,#-4] eor r2,r10,r2,lsr#8 strb r0,[r14,#-15] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r1,[r14,#-11] eor r0,r8,r0,lsr#8 strb r2,[r14,#-7] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r3,[r14,#-3] eor r2,r10,r2,lsr#8 strb r0,[r14,#-14] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r1,[r14,#-10] strb r2,[r14,#-6] eor r0,r8,r0,lsr#8 strb r3,[r14,#-2] eor r1,r9,r1,lsr#8 strb r0,[r14,#-13] eor r2,r10,r2,lsr#8 strb r1,[r14,#-9] eor r3,r11,r3,lsr#8 strb r2,[r14,#-5] strb r3,[r14,#-1] add r8,sp,#4*(4+8) ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material # ifdef __thumb2__ itt hi # endif addhi r8,r8,#1 @ next counter value strhi r8,[sp,#4*(12)] @ save next counter value add r5,r5,r9 add r6,r6,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r7,r7,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r4,r8,r4 @ xor with input (or zero) eor r5,r9,r5 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r6,r10,r6 strb r4,[r14],#16 @ store output eor r7,r11,r7 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r5,[r14,#-12] eor r4,r8,r4,lsr#8 strb r6,[r14,#-8] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r7,[r14,#-4] eor r6,r10,r6,lsr#8 strb r4,[r14,#-15] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r5,[r14,#-11] eor r4,r8,r4,lsr#8 strb r6,[r14,#-7] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r7,[r14,#-3] eor r6,r10,r6,lsr#8 strb r4,[r14,#-14] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r5,[r14,#-10] strb r6,[r14,#-6] eor r4,r8,r4,lsr#8 strb r7,[r14,#-2] eor r5,r9,r5,lsr#8 strb r4,[r14,#-13] eor r6,r10,r6,lsr#8 strb r5,[r14,#-9] eor r7,r11,r7,lsr#8 strb r6,[r14,#-5] strb r7,[r14,#-1] # ifdef __thumb2__ it ne # endif ldrne r8,[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ it hs # endif subhs r11,r8,#64 @ len-=64 bhi Loop_outer beq Ldone #endif Ltail: ldr r12,[sp,#4*(32+1)] @ load inp add r9,sp,#4*(0) ldr r14,[sp,#4*(32+0)] @ load out Loop_tail: ldrb r10,[r9],#1 @ read buffer on stack ldrb r11,[r12],#1 @ read input subs r8,r8,#1 eor r11,r11,r10 strb r11,[r14],#1 @ store output bne Loop_tail Ldone: add sp,sp,#4*(32+3) Lno_data: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} #if __ARM_MAX_ARCH__>=7 #ifdef __thumb2__ .thumb_func ChaCha20_neon #endif .align 5 ChaCha20_neon: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0,r1,r2,r4-r11,lr} LChaCha20_neon: adr r14,Lsigma vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so stmdb sp!,{r0,r1,r2,r3} vld1.32 {q1,q2},[r3] @ load key ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key sub sp,sp,#4*(16+16) vld1.32 {q3},[r12] @ load counter and nonce add r12,sp,#4*8 ldmia r14,{r0,r1,r2,r3} @ load sigma vld1.32 {q0},[r14]! @ load sigma vld1.32 {q12},[r14] @ one vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce vst1.32 {q0,q1},[sp] @ copy sigma|1/2key str r10,[sp,#4*(16+10)] @ off-load "rx" str r11,[sp,#4*(16+11)] @ off-load "rx" vshl.i32 d26,d24,#1 @ two vstr d24,[sp,#4*(16+0)] vshl.i32 d28,d24,#2 @ four vstr d26,[sp,#4*(16+2)] vmov q4,q0 vstr d28,[sp,#4*(16+4)] vmov q8,q0 vmov q5,q1 vmov q9,q1 b Loop_neon_enter .align 4 Loop_neon_outer: ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material cmp r11,#64*2 @ if len<=64*2 bls Lbreak_neon @ switch to integer-only vmov q4,q0 str r11,[sp,#4*(32+2)] @ save len vmov q8,q0 str r12, [sp,#4*(32+1)] @ save inp vmov q5,q1 str r14, [sp,#4*(32+0)] @ save out vmov q9,q1 Loop_neon_enter: ldr r11, [sp,#4*(15)] vadd.i32 q7,q3,q12 @ counter+1 ldr r12,[sp,#4*(12)] @ modulo-scheduled load vmov q6,q2 ldr r10, [sp,#4*(13)] vmov q10,q2 ldr r14,[sp,#4*(14)] vadd.i32 q11,q7,q12 @ counter+2 str r11, [sp,#4*(16+15)] mov r11,#10 add r12,r12,#3 @ counter+3 b Loop_neon .align 4 Loop_neon: subs r11,r11,#1 vadd.i32 q0,q0,q1 add r0,r0,r4 vadd.i32 q4,q4,q5 mov r12,r12,ror#16 vadd.i32 q8,q8,q9 add r1,r1,r5 veor q3,q3,q0 mov r10,r10,ror#16 veor q7,q7,q4 eor r12,r12,r0,ror#16 veor q11,q11,q8 eor r10,r10,r1,ror#16 vrev32.16 q3,q3 add r8,r8,r12 vrev32.16 q7,q7 mov r4,r4,ror#20 vrev32.16 q11,q11 add r9,r9,r10 vadd.i32 q2,q2,q3 mov r5,r5,ror#20 vadd.i32 q6,q6,q7 eor r4,r4,r8,ror#20 vadd.i32 q10,q10,q11 eor r5,r5,r9,ror#20 veor q12,q1,q2 add r0,r0,r4 veor q13,q5,q6 mov r12,r12,ror#24 veor q14,q9,q10 add r1,r1,r5 vshr.u32 q1,q12,#20 mov r10,r10,ror#24 vshr.u32 q5,q13,#20 eor r12,r12,r0,ror#24 vshr.u32 q9,q14,#20 eor r10,r10,r1,ror#24 vsli.32 q1,q12,#12 add r8,r8,r12 vsli.32 q5,q13,#12 mov r4,r4,ror#25 vsli.32 q9,q14,#12 add r9,r9,r10 vadd.i32 q0,q0,q1 mov r5,r5,ror#25 vadd.i32 q4,q4,q5 str r10,[sp,#4*(16+13)] vadd.i32 q8,q8,q9 ldr r10,[sp,#4*(16+15)] veor q12,q3,q0 eor r4,r4,r8,ror#25 veor q13,q7,q4 eor r5,r5,r9,ror#25 veor q14,q11,q8 str r8,[sp,#4*(16+8)] vshr.u32 q3,q12,#24 ldr r8,[sp,#4*(16+10)] vshr.u32 q7,q13,#24 add r2,r2,r6 vshr.u32 q11,q14,#24 mov r14,r14,ror#16 vsli.32 q3,q12,#8 str r9,[sp,#4*(16+9)] vsli.32 q7,q13,#8 ldr r9,[sp,#4*(16+11)] vsli.32 q11,q14,#8 add r3,r3,r7 vadd.i32 q2,q2,q3 mov r10,r10,ror#16 vadd.i32 q6,q6,q7 eor r14,r14,r2,ror#16 vadd.i32 q10,q10,q11 eor r10,r10,r3,ror#16 veor q12,q1,q2 add r8,r8,r14 veor q13,q5,q6 mov r6,r6,ror#20 veor q14,q9,q10 add r9,r9,r10 vshr.u32 q1,q12,#25 mov r7,r7,ror#20 vshr.u32 q5,q13,#25 eor r6,r6,r8,ror#20 vshr.u32 q9,q14,#25 eor r7,r7,r9,ror#20 vsli.32 q1,q12,#7 add r2,r2,r6 vsli.32 q5,q13,#7 mov r14,r14,ror#24 vsli.32 q9,q14,#7 add r3,r3,r7 vext.8 q2,q2,q2,#8 mov r10,r10,ror#24 vext.8 q6,q6,q6,#8 eor r14,r14,r2,ror#24 vext.8 q10,q10,q10,#8 eor r10,r10,r3,ror#24 vext.8 q1,q1,q1,#4 add r8,r8,r14 vext.8 q5,q5,q5,#4 mov r6,r6,ror#25 vext.8 q9,q9,q9,#4 add r9,r9,r10 vext.8 q3,q3,q3,#12 mov r7,r7,ror#25 vext.8 q7,q7,q7,#12 eor r6,r6,r8,ror#25 vext.8 q11,q11,q11,#12 eor r7,r7,r9,ror#25 vadd.i32 q0,q0,q1 add r0,r0,r5 vadd.i32 q4,q4,q5 mov r10,r10,ror#16 vadd.i32 q8,q8,q9 add r1,r1,r6 veor q3,q3,q0 mov r12,r12,ror#16 veor q7,q7,q4 eor r10,r10,r0,ror#16 veor q11,q11,q8 eor r12,r12,r1,ror#16 vrev32.16 q3,q3 add r8,r8,r10 vrev32.16 q7,q7 mov r5,r5,ror#20 vrev32.16 q11,q11 add r9,r9,r12 vadd.i32 q2,q2,q3 mov r6,r6,ror#20 vadd.i32 q6,q6,q7 eor r5,r5,r8,ror#20 vadd.i32 q10,q10,q11 eor r6,r6,r9,ror#20 veor q12,q1,q2 add r0,r0,r5 veor q13,q5,q6 mov r10,r10,ror#24 veor q14,q9,q10 add r1,r1,r6 vshr.u32 q1,q12,#20 mov r12,r12,ror#24 vshr.u32 q5,q13,#20 eor r10,r10,r0,ror#24 vshr.u32 q9,q14,#20 eor r12,r12,r1,ror#24 vsli.32 q1,q12,#12 add r8,r8,r10 vsli.32 q5,q13,#12 mov r5,r5,ror#25 vsli.32 q9,q14,#12 str r10,[sp,#4*(16+15)] vadd.i32 q0,q0,q1 ldr r10,[sp,#4*(16+13)] vadd.i32 q4,q4,q5 add r9,r9,r12 vadd.i32 q8,q8,q9 mov r6,r6,ror#25 veor q12,q3,q0 eor r5,r5,r8,ror#25 veor q13,q7,q4 eor r6,r6,r9,ror#25 veor q14,q11,q8 str r8,[sp,#4*(16+10)] vshr.u32 q3,q12,#24 ldr r8,[sp,#4*(16+8)] vshr.u32 q7,q13,#24 add r2,r2,r7 vshr.u32 q11,q14,#24 mov r10,r10,ror#16 vsli.32 q3,q12,#8 str r9,[sp,#4*(16+11)] vsli.32 q7,q13,#8 ldr r9,[sp,#4*(16+9)] vsli.32 q11,q14,#8 add r3,r3,r4 vadd.i32 q2,q2,q3 mov r14,r14,ror#16 vadd.i32 q6,q6,q7 eor r10,r10,r2,ror#16 vadd.i32 q10,q10,q11 eor r14,r14,r3,ror#16 veor q12,q1,q2 add r8,r8,r10 veor q13,q5,q6 mov r7,r7,ror#20 veor q14,q9,q10 add r9,r9,r14 vshr.u32 q1,q12,#25 mov r4,r4,ror#20 vshr.u32 q5,q13,#25 eor r7,r7,r8,ror#20 vshr.u32 q9,q14,#25 eor r4,r4,r9,ror#20 vsli.32 q1,q12,#7 add r2,r2,r7 vsli.32 q5,q13,#7 mov r10,r10,ror#24 vsli.32 q9,q14,#7 add r3,r3,r4 vext.8 q2,q2,q2,#8 mov r14,r14,ror#24 vext.8 q6,q6,q6,#8 eor r10,r10,r2,ror#24 vext.8 q10,q10,q10,#8 eor r14,r14,r3,ror#24 vext.8 q1,q1,q1,#12 add r8,r8,r10 vext.8 q5,q5,q5,#12 mov r7,r7,ror#25 vext.8 q9,q9,q9,#12 add r9,r9,r14 vext.8 q3,q3,q3,#4 mov r4,r4,ror#25 vext.8 q7,q7,q7,#4 eor r7,r7,r8,ror#25 vext.8 q11,q11,q11,#4 eor r4,r4,r9,ror#25 bne Loop_neon add r11,sp,#32 vld1.32 {q12,q13},[sp] @ load key material vld1.32 {q14,q15},[r11] ldr r11,[sp,#4*(32+2)] @ load len str r8, [sp,#4*(16+8)] @ modulo-scheduled store str r9, [sp,#4*(16+9)] str r12,[sp,#4*(16+12)] str r10, [sp,#4*(16+13)] str r14,[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ rx and second half at sp+4*(16+8) ldr r12,[sp,#4*(32+1)] @ load inp ldr r14,[sp,#4*(32+0)] @ load out vadd.i32 q0,q0,q12 @ accumulate key material vadd.i32 q4,q4,q12 vadd.i32 q8,q8,q12 vldr d24,[sp,#4*(16+0)] @ one vadd.i32 q1,q1,q13 vadd.i32 q5,q5,q13 vadd.i32 q9,q9,q13 vldr d26,[sp,#4*(16+2)] @ two vadd.i32 q2,q2,q14 vadd.i32 q6,q6,q14 vadd.i32 q10,q10,q14 vadd.i32 d14,d14,d24 @ counter+1 vadd.i32 d22,d22,d26 @ counter+2 vadd.i32 q3,q3,q15 vadd.i32 q7,q7,q15 vadd.i32 q11,q11,q15 cmp r11,#64*4 blo Ltail_neon vld1.8 {q12,q13},[r12]! @ load input mov r11,sp vld1.8 {q14,q15},[r12]! veor q0,q0,q12 @ xor with input veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 vst1.8 {q0,q1},[r14]! @ store output veor q5,q5,q13 vld1.8 {q12,q13},[r12]! veor q6,q6,q14 vst1.8 {q2,q3},[r14]! veor q7,q7,q15 vld1.8 {q14,q15},[r12]! veor q8,q8,q12 vld1.32 {q0,q1},[r11]! @ load for next iteration veor d25,d25,d25 vldr d24,[sp,#4*(16+4)] @ four veor q9,q9,q13 vld1.32 {q2,q3},[r11] veor q10,q10,q14 vst1.8 {q4,q5},[r14]! veor q11,q11,q15 vst1.8 {q6,q7},[r14]! vadd.i32 d6,d6,d24 @ next counter value vldr d24,[sp,#4*(16+0)] @ one ldmia sp,{r8,r9,r10,r11} @ load key material add r0,r0,r8 @ accumulate key material ldr r8,[r12],#16 @ load input vst1.8 {q8,q9},[r14]! add r1,r1,r9 ldr r9,[r12,#-12] vst1.8 {q10,q11},[r14]! add r2,r2,r10 ldr r10,[r12,#-8] add r3,r3,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif eor r0,r0,r8 @ xor with input add r8,sp,#4*(4) eor r1,r1,r9 str r0,[r14],#16 @ store output eor r2,r2,r10 str r1,[r14,#-12] eor r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material ldr r8,[r12],#16 @ load input add r5,r5,r9 ldr r9,[r12,#-12] add r6,r6,r10 ldr r10,[r12,#-8] add r7,r7,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif eor r4,r4,r8 add r8,sp,#4*(8) eor r5,r5,r9 str r4,[r14],#16 @ store output eor r6,r6,r10 str r5,[r14,#-12] eor r7,r7,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r6,[r14,#-8] add r0,sp,#4*(16+8) str r7,[r14,#-4] ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material ldr r8,[r12],#16 @ load input add r1,r1,r9 ldr r9,[r12,#-12] # ifdef __thumb2__ it hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it add r2,r2,r10 ldr r10,[r12,#-8] # ifdef __thumb2__ it hi # endif strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it add r3,r3,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif eor r0,r0,r8 add r8,sp,#4*(12) eor r1,r1,r9 str r0,[r14],#16 @ store output eor r2,r2,r10 str r1,[r14,#-12] eor r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r8,r8,#4 @ next counter value add r5,r5,r9 str r8,[sp,#4*(12)] @ save next counter value ldr r8,[r12],#16 @ load input add r6,r6,r10 add r4,r4,#3 @ counter+3 ldr r9,[r12,#-12] add r7,r7,r11 ldr r10,[r12,#-8] ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif eor r4,r4,r8 # ifdef __thumb2__ it hi # endif ldrhi r8,[sp,#4*(32+2)] @ re-load len eor r5,r5,r9 eor r6,r6,r10 str r4,[r14],#16 @ store output eor r7,r7,r11 str r5,[r14,#-12] sub r11,r8,#64*4 @ len-=64*4 str r6,[r14,#-8] str r7,[r14,#-4] bhi Loop_neon_outer b Ldone_neon .align 4 Lbreak_neon: @ harmonize NEON and integer-only stack frames: load data @ from NEON frame, but save to integer-only one; distance @ between the two is 4*(32+4+16-32)=4*(20). str r11, [sp,#4*(20+32+2)] @ save len add r11,sp,#4*(32+4) str r12, [sp,#4*(20+32+1)] @ save inp str r14, [sp,#4*(20+32+0)] @ save out ldr r12,[sp,#4*(16+10)] ldr r14,[sp,#4*(16+11)] vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement str r12,[sp,#4*(20+16+10)] @ copy "rx" str r14,[sp,#4*(20+16+11)] @ copy "rx" ldr r11, [sp,#4*(15)] ldr r12,[sp,#4*(12)] @ modulo-scheduled load ldr r10, [sp,#4*(13)] ldr r14,[sp,#4*(14)] str r11, [sp,#4*(20+16+15)] add r11,sp,#4*(20) vst1.32 {q0,q1},[r11]! @ copy key add sp,sp,#4*(20) @ switch frame vst1.32 {q2,q3},[r11] mov r11,#10 b Loop @ go integer-only .align 4 Ltail_neon: cmp r11,#64*3 bhs L192_or_more_neon cmp r11,#64*2 bhs L128_or_more_neon cmp r11,#64*1 bhs L64_or_more_neon add r8,sp,#4*(8) vst1.8 {q0,q1},[sp] add r10,sp,#4*(0) vst1.8 {q2,q3},[r8] b Loop_tail_neon .align 4 L64_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 veor q2,q2,q14 veor q3,q3,q15 vst1.8 {q0,q1},[r14]! vst1.8 {q2,q3},[r14]! beq Ldone_neon add r8,sp,#4*(8) vst1.8 {q4,q5},[sp] add r10,sp,#4*(0) vst1.8 {q6,q7},[r8] sub r11,r11,#64*1 @ len-=64*1 b Loop_tail_neon .align 4 L128_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 veor q5,q5,q13 vst1.8 {q0,q1},[r14]! veor q6,q6,q14 vst1.8 {q2,q3},[r14]! veor q7,q7,q15 vst1.8 {q4,q5},[r14]! vst1.8 {q6,q7},[r14]! beq Ldone_neon add r8,sp,#4*(8) vst1.8 {q8,q9},[sp] add r10,sp,#4*(0) vst1.8 {q10,q11},[r8] sub r11,r11,#64*2 @ len-=64*2 b Loop_tail_neon .align 4 L192_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 veor q5,q5,q13 vld1.8 {q12,q13},[r12]! veor q6,q6,q14 vst1.8 {q0,q1},[r14]! veor q7,q7,q15 vld1.8 {q14,q15},[r12]! veor q8,q8,q12 vst1.8 {q2,q3},[r14]! veor q9,q9,q13 vst1.8 {q4,q5},[r14]! veor q10,q10,q14 vst1.8 {q6,q7},[r14]! veor q11,q11,q15 vst1.8 {q8,q9},[r14]! vst1.8 {q10,q11},[r14]! beq Ldone_neon ldmia sp,{r8,r9,r10,r11} @ load key material add r0,r0,r8 @ accumulate key material add r8,sp,#4*(4) add r1,r1,r9 add r2,r2,r10 add r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material add r8,sp,#4*(8) add r5,r5,r9 add r6,r6,r10 add r7,r7,r11 ldmia r8,{r8,r9,r10,r11} @ load key material # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7} add r0,sp,#4*(16+8) ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material add r8,sp,#4*(12) add r1,r1,r9 add r2,r2,r10 add r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material add r8,sp,#4*(8) add r5,r5,r9 add r4,r4,#3 @ counter+3 add r6,r6,r10 add r7,r7,r11 ldr r11,[sp,#4*(32+2)] @ re-load len # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7} add r10,sp,#4*(0) sub r11,r11,#64*3 @ len-=64*3 Loop_tail_neon: ldrb r8,[r10],#1 @ read buffer on stack ldrb r9,[r12],#1 @ read input subs r11,r11,#1 eor r8,r8,r9 strb r8,[r14],#1 @ store output bne Loop_tail_neon Ldone_neon: add sp,sp,#4*(32+4) vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15} add sp,sp,#4*(16+3) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} .comm _GFp_armcap_P,4 .non_lazy_symbol_pointer GFp_armcap_P: .indirect_symbol _GFp_armcap_P .long 0 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/chacha-armv4-linux32.S000064400000000000000000000712521353224261200172740ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #endif #if defined(__thumb2__) .thumb #else .code 32 #endif #if defined(__thumb2__) || defined(__clang__) #define ldrhsb ldrbhs #endif .align 5 .Lsigma: .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral .Lone: .long 1,0,0,0 #if __ARM_MAX_ARCH__>=7 .LOPENSSL_armcap: .word GFp_armcap_P-.LChaCha20_ctr32 #else .word -1 #endif .globl GFp_ChaCha20_ctr32 .hidden GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,%function .align 5 GFp_ChaCha20_ctr32: .LChaCha20_ctr32: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0,r1,r2,r4-r11,lr} #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r14,pc,#16 @ ChaCha20_ctr32 #else adr r14,.LChaCha20_ctr32 #endif cmp r2,#0 @ len==0? #ifdef __thumb2__ itt eq #endif addeq sp,sp,#4*3 beq .Lno_data #if __ARM_MAX_ARCH__>=7 cmp r2,#192 @ test len bls .Lshort ldr r4,[r14,#-32] ldr r4,[r14,r4] # ifdef __APPLE__ ldr r4,[r4] # endif tst r4,#ARMV7_NEON bne .LChaCha20_neon .Lshort: #endif ldmia r12,{r4,r5,r6,r7} @ load counter and nonce sub sp,sp,#4*(16) @ off-load area sub r14,r14,#64 @ .Lsigma stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key ldmia r14,{r0,r1,r2,r3} @ load sigma stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key stmdb sp!,{r0,r1,r2,r3} @ copy sigma str r10,[sp,#4*(16+10)] @ off-load "rx" str r11,[sp,#4*(16+11)] @ off-load "rx" b .Loop_outer_enter .align 4 .Loop_outer: ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material str r11,[sp,#4*(32+2)] @ save len str r12, [sp,#4*(32+1)] @ save inp str r14, [sp,#4*(32+0)] @ save out .Loop_outer_enter: ldr r11, [sp,#4*(15)] ldr r12,[sp,#4*(12)] @ modulo-scheduled load ldr r10, [sp,#4*(13)] ldr r14,[sp,#4*(14)] str r11, [sp,#4*(16+15)] mov r11,#10 b .Loop .align 4 .Loop: subs r11,r11,#1 add r0,r0,r4 mov r12,r12,ror#16 add r1,r1,r5 mov r10,r10,ror#16 eor r12,r12,r0,ror#16 eor r10,r10,r1,ror#16 add r8,r8,r12 mov r4,r4,ror#20 add r9,r9,r10 mov r5,r5,ror#20 eor r4,r4,r8,ror#20 eor r5,r5,r9,ror#20 add r0,r0,r4 mov r12,r12,ror#24 add r1,r1,r5 mov r10,r10,ror#24 eor r12,r12,r0,ror#24 eor r10,r10,r1,ror#24 add r8,r8,r12 mov r4,r4,ror#25 add r9,r9,r10 mov r5,r5,ror#25 str r10,[sp,#4*(16+13)] ldr r10,[sp,#4*(16+15)] eor r4,r4,r8,ror#25 eor r5,r5,r9,ror#25 str r8,[sp,#4*(16+8)] ldr r8,[sp,#4*(16+10)] add r2,r2,r6 mov r14,r14,ror#16 str r9,[sp,#4*(16+9)] ldr r9,[sp,#4*(16+11)] add r3,r3,r7 mov r10,r10,ror#16 eor r14,r14,r2,ror#16 eor r10,r10,r3,ror#16 add r8,r8,r14 mov r6,r6,ror#20 add r9,r9,r10 mov r7,r7,ror#20 eor r6,r6,r8,ror#20 eor r7,r7,r9,ror#20 add r2,r2,r6 mov r14,r14,ror#24 add r3,r3,r7 mov r10,r10,ror#24 eor r14,r14,r2,ror#24 eor r10,r10,r3,ror#24 add r8,r8,r14 mov r6,r6,ror#25 add r9,r9,r10 mov r7,r7,ror#25 eor r6,r6,r8,ror#25 eor r7,r7,r9,ror#25 add r0,r0,r5 mov r10,r10,ror#16 add r1,r1,r6 mov r12,r12,ror#16 eor r10,r10,r0,ror#16 eor r12,r12,r1,ror#16 add r8,r8,r10 mov r5,r5,ror#20 add r9,r9,r12 mov r6,r6,ror#20 eor r5,r5,r8,ror#20 eor r6,r6,r9,ror#20 add r0,r0,r5 mov r10,r10,ror#24 add r1,r1,r6 mov r12,r12,ror#24 eor r10,r10,r0,ror#24 eor r12,r12,r1,ror#24 add r8,r8,r10 mov r5,r5,ror#25 str r10,[sp,#4*(16+15)] ldr r10,[sp,#4*(16+13)] add r9,r9,r12 mov r6,r6,ror#25 eor r5,r5,r8,ror#25 eor r6,r6,r9,ror#25 str r8,[sp,#4*(16+10)] ldr r8,[sp,#4*(16+8)] add r2,r2,r7 mov r10,r10,ror#16 str r9,[sp,#4*(16+11)] ldr r9,[sp,#4*(16+9)] add r3,r3,r4 mov r14,r14,ror#16 eor r10,r10,r2,ror#16 eor r14,r14,r3,ror#16 add r8,r8,r10 mov r7,r7,ror#20 add r9,r9,r14 mov r4,r4,ror#20 eor r7,r7,r8,ror#20 eor r4,r4,r9,ror#20 add r2,r2,r7 mov r10,r10,ror#24 add r3,r3,r4 mov r14,r14,ror#24 eor r10,r10,r2,ror#24 eor r14,r14,r3,ror#24 add r8,r8,r10 mov r7,r7,ror#25 add r9,r9,r14 mov r4,r4,ror#25 eor r7,r7,r8,ror#25 eor r4,r4,r9,ror#25 bne .Loop ldr r11,[sp,#4*(32+2)] @ load len str r8, [sp,#4*(16+8)] @ modulo-scheduled store str r9, [sp,#4*(16+9)] str r12,[sp,#4*(16+12)] str r10, [sp,#4*(16+13)] str r14,[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ rx and second half at sp+4*(16+8) cmp r11,#64 @ done yet? #ifdef __thumb2__ itete lo #endif addlo r12,sp,#4*(0) @ shortcut or ... ldrhs r12,[sp,#4*(32+1)] @ ... load inp addlo r14,sp,#4*(0) @ shortcut or ... ldrhs r14,[sp,#4*(32+0)] @ ... load out ldr r8,[sp,#4*(0)] @ load key material ldr r9,[sp,#4*(1)] #if __ARM_ARCH__>=6 || !defined(__ARMEB__) # if __ARM_ARCH__<7 orr r10,r12,r14 tst r10,#3 @ are input and output aligned? ldr r10,[sp,#4*(2)] bne .Lunaligned cmp r11,#64 @ restore flags # else ldr r10,[sp,#4*(2)] # endif ldr r11,[sp,#4*(3)] add r0,r0,r8 @ accumulate key material add r1,r1,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r2,r2,r10 add r3,r3,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif # ifdef __thumb2__ itt hs # endif eorhs r0,r0,r8 @ xor with input eorhs r1,r1,r9 add r8,sp,#4*(4) str r0,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r2,r2,r10 eorhs r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r1,[r14,#-12] str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r5,r5,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r6,r6,r10 add r7,r7,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif # ifdef __thumb2__ itt hs # endif eorhs r4,r4,r8 eorhs r5,r5,r9 add r8,sp,#4*(8) str r4,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r6,r6,r10 eorhs r7,r7,r11 str r5,[r14,#-12] ldmia r8,{r8,r9,r10,r11} @ load key material str r6,[r14,#-8] add r0,sp,#4*(16+8) str r7,[r14,#-4] ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material add r1,r1,r9 # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] # ifdef __thumb2__ itt hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it add r2,r2,r10 add r3,r3,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif # ifdef __thumb2__ itt hs # endif eorhs r0,r0,r8 eorhs r1,r1,r9 add r8,sp,#4*(12) str r0,[r14],#16 @ store output # ifdef __thumb2__ itt hs # endif eorhs r2,r2,r10 eorhs r3,r3,r11 str r1,[r14,#-12] ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r5,r5,r9 # ifdef __thumb2__ itt hi # endif addhi r8,r8,#1 @ next counter value strhi r8,[sp,#4*(12)] @ save next counter value # ifdef __thumb2__ itt hs # endif ldrhs r8,[r12],#16 @ load input ldrhs r9,[r12,#-12] add r6,r6,r10 add r7,r7,r11 # ifdef __thumb2__ itt hs # endif ldrhs r10,[r12,#-8] ldrhs r11,[r12,#-4] # if __ARM_ARCH__>=6 && defined(__ARMEB__) rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif # ifdef __thumb2__ itt hs # endif eorhs r4,r4,r8 eorhs r5,r5,r9 # ifdef __thumb2__ it ne # endif ldrne r8,[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ itt hs # endif eorhs r6,r6,r10 eorhs r7,r7,r11 str r4,[r14],#16 @ store output str r5,[r14,#-12] # ifdef __thumb2__ it hs # endif subhs r11,r8,#64 @ len-=64 str r6,[r14,#-8] str r7,[r14,#-4] bhi .Loop_outer beq .Ldone # if __ARM_ARCH__<7 b .Ltail .align 4 .Lunaligned:@ unaligned endian-neutral path cmp r11,#64 @ restore flags # endif #endif #if __ARM_ARCH__<7 ldr r11,[sp,#4*(3)] add r0,r0,r8 @ accumulate key material add r1,r1,r9 add r2,r2,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r3,r3,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r0,r8,r0 @ xor with input (or zero) eor r1,r9,r1 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r2,r10,r2 strb r0,[r14],#16 @ store output eor r3,r11,r3 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r1,[r14,#-12] eor r0,r8,r0,lsr#8 strb r2,[r14,#-8] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r3,[r14,#-4] eor r2,r10,r2,lsr#8 strb r0,[r14,#-15] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r1,[r14,#-11] eor r0,r8,r0,lsr#8 strb r2,[r14,#-7] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r3,[r14,#-3] eor r2,r10,r2,lsr#8 strb r0,[r14,#-14] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r1,[r14,#-10] strb r2,[r14,#-6] eor r0,r8,r0,lsr#8 strb r3,[r14,#-2] eor r1,r9,r1,lsr#8 strb r0,[r14,#-13] eor r2,r10,r2,lsr#8 strb r1,[r14,#-9] eor r3,r11,r3,lsr#8 strb r2,[r14,#-5] strb r3,[r14,#-1] add r8,sp,#4*(4+0) ldmia r8,{r8,r9,r10,r11} @ load key material add r0,sp,#4*(16+8) add r4,r4,r8 @ accumulate key material add r5,r5,r9 add r6,r6,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r7,r7,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r4,r8,r4 @ xor with input (or zero) eor r5,r9,r5 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r6,r10,r6 strb r4,[r14],#16 @ store output eor r7,r11,r7 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r5,[r14,#-12] eor r4,r8,r4,lsr#8 strb r6,[r14,#-8] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r7,[r14,#-4] eor r6,r10,r6,lsr#8 strb r4,[r14,#-15] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r5,[r14,#-11] eor r4,r8,r4,lsr#8 strb r6,[r14,#-7] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r7,[r14,#-3] eor r6,r10,r6,lsr#8 strb r4,[r14,#-14] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r5,[r14,#-10] strb r6,[r14,#-6] eor r4,r8,r4,lsr#8 strb r7,[r14,#-2] eor r5,r9,r5,lsr#8 strb r4,[r14,#-13] eor r6,r10,r6,lsr#8 strb r5,[r14,#-9] eor r7,r11,r7,lsr#8 strb r6,[r14,#-5] strb r7,[r14,#-1] add r8,sp,#4*(4+4) ldmia r8,{r8,r9,r10,r11} @ load key material ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half # ifdef __thumb2__ itt hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" strhi r11,[sp,#4*(16+11)] @ copy "rx" add r0,r0,r8 @ accumulate key material add r1,r1,r9 add r2,r2,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r3,r3,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r0,r8,r0 @ xor with input (or zero) eor r1,r9,r1 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r2,r10,r2 strb r0,[r14],#16 @ store output eor r3,r11,r3 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r1,[r14,#-12] eor r0,r8,r0,lsr#8 strb r2,[r14,#-8] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r3,[r14,#-4] eor r2,r10,r2,lsr#8 strb r0,[r14,#-15] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r1,[r14,#-11] eor r0,r8,r0,lsr#8 strb r2,[r14,#-7] eor r1,r9,r1,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r3,[r14,#-3] eor r2,r10,r2,lsr#8 strb r0,[r14,#-14] eor r3,r11,r3,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r1,[r14,#-10] strb r2,[r14,#-6] eor r0,r8,r0,lsr#8 strb r3,[r14,#-2] eor r1,r9,r1,lsr#8 strb r0,[r14,#-13] eor r2,r10,r2,lsr#8 strb r1,[r14,#-9] eor r3,r11,r3,lsr#8 strb r2,[r14,#-5] strb r3,[r14,#-1] add r8,sp,#4*(4+8) ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material # ifdef __thumb2__ itt hi # endif addhi r8,r8,#1 @ next counter value strhi r8,[sp,#4*(12)] @ save next counter value add r5,r5,r9 add r6,r6,r10 # ifdef __thumb2__ itete lo # endif eorlo r8,r8,r8 @ zero or ... ldrhsb r8,[r12],#16 @ ... load input eorlo r9,r9,r9 ldrhsb r9,[r12,#-12] add r7,r7,r11 # ifdef __thumb2__ itete lo # endif eorlo r10,r10,r10 ldrhsb r10,[r12,#-8] eorlo r11,r11,r11 ldrhsb r11,[r12,#-4] eor r4,r8,r4 @ xor with input (or zero) eor r5,r9,r5 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-15] @ load more input ldrhsb r9,[r12,#-11] eor r6,r10,r6 strb r4,[r14],#16 @ store output eor r7,r11,r7 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-7] ldrhsb r11,[r12,#-3] strb r5,[r14,#-12] eor r4,r8,r4,lsr#8 strb r6,[r14,#-8] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-14] @ load more input ldrhsb r9,[r12,#-10] strb r7,[r14,#-4] eor r6,r10,r6,lsr#8 strb r4,[r14,#-15] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-6] ldrhsb r11,[r12,#-2] strb r5,[r14,#-11] eor r4,r8,r4,lsr#8 strb r6,[r14,#-7] eor r5,r9,r5,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r8,[r12,#-13] @ load more input ldrhsb r9,[r12,#-9] strb r7,[r14,#-3] eor r6,r10,r6,lsr#8 strb r4,[r14,#-14] eor r7,r11,r7,lsr#8 # ifdef __thumb2__ itt hs # endif ldrhsb r10,[r12,#-5] ldrhsb r11,[r12,#-1] strb r5,[r14,#-10] strb r6,[r14,#-6] eor r4,r8,r4,lsr#8 strb r7,[r14,#-2] eor r5,r9,r5,lsr#8 strb r4,[r14,#-13] eor r6,r10,r6,lsr#8 strb r5,[r14,#-9] eor r7,r11,r7,lsr#8 strb r6,[r14,#-5] strb r7,[r14,#-1] # ifdef __thumb2__ it ne # endif ldrne r8,[sp,#4*(32+2)] @ re-load len # ifdef __thumb2__ it hs # endif subhs r11,r8,#64 @ len-=64 bhi .Loop_outer beq .Ldone #endif .Ltail: ldr r12,[sp,#4*(32+1)] @ load inp add r9,sp,#4*(0) ldr r14,[sp,#4*(32+0)] @ load out .Loop_tail: ldrb r10,[r9],#1 @ read buffer on stack ldrb r11,[r12],#1 @ read input subs r8,r8,#1 eor r11,r11,r10 strb r11,[r14],#1 @ store output bne .Loop_tail .Ldone: add sp,sp,#4*(32+3) .Lno_data: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type ChaCha20_neon,%function .align 5 ChaCha20_neon: ldr r12,[sp,#0] @ pull pointer to counter and nonce stmdb sp!,{r0,r1,r2,r4-r11,lr} .LChaCha20_neon: adr r14,.Lsigma vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so stmdb sp!,{r0,r1,r2,r3} vld1.32 {q1,q2},[r3] @ load key ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key sub sp,sp,#4*(16+16) vld1.32 {q3},[r12] @ load counter and nonce add r12,sp,#4*8 ldmia r14,{r0,r1,r2,r3} @ load sigma vld1.32 {q0},[r14]! @ load sigma vld1.32 {q12},[r14] @ one vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce vst1.32 {q0,q1},[sp] @ copy sigma|1/2key str r10,[sp,#4*(16+10)] @ off-load "rx" str r11,[sp,#4*(16+11)] @ off-load "rx" vshl.i32 d26,d24,#1 @ two vstr d24,[sp,#4*(16+0)] vshl.i32 d28,d24,#2 @ four vstr d26,[sp,#4*(16+2)] vmov q4,q0 vstr d28,[sp,#4*(16+4)] vmov q8,q0 vmov q5,q1 vmov q9,q1 b .Loop_neon_enter .align 4 .Loop_neon_outer: ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material cmp r11,#64*2 @ if len<=64*2 bls .Lbreak_neon @ switch to integer-only vmov q4,q0 str r11,[sp,#4*(32+2)] @ save len vmov q8,q0 str r12, [sp,#4*(32+1)] @ save inp vmov q5,q1 str r14, [sp,#4*(32+0)] @ save out vmov q9,q1 .Loop_neon_enter: ldr r11, [sp,#4*(15)] vadd.i32 q7,q3,q12 @ counter+1 ldr r12,[sp,#4*(12)] @ modulo-scheduled load vmov q6,q2 ldr r10, [sp,#4*(13)] vmov q10,q2 ldr r14,[sp,#4*(14)] vadd.i32 q11,q7,q12 @ counter+2 str r11, [sp,#4*(16+15)] mov r11,#10 add r12,r12,#3 @ counter+3 b .Loop_neon .align 4 .Loop_neon: subs r11,r11,#1 vadd.i32 q0,q0,q1 add r0,r0,r4 vadd.i32 q4,q4,q5 mov r12,r12,ror#16 vadd.i32 q8,q8,q9 add r1,r1,r5 veor q3,q3,q0 mov r10,r10,ror#16 veor q7,q7,q4 eor r12,r12,r0,ror#16 veor q11,q11,q8 eor r10,r10,r1,ror#16 vrev32.16 q3,q3 add r8,r8,r12 vrev32.16 q7,q7 mov r4,r4,ror#20 vrev32.16 q11,q11 add r9,r9,r10 vadd.i32 q2,q2,q3 mov r5,r5,ror#20 vadd.i32 q6,q6,q7 eor r4,r4,r8,ror#20 vadd.i32 q10,q10,q11 eor r5,r5,r9,ror#20 veor q12,q1,q2 add r0,r0,r4 veor q13,q5,q6 mov r12,r12,ror#24 veor q14,q9,q10 add r1,r1,r5 vshr.u32 q1,q12,#20 mov r10,r10,ror#24 vshr.u32 q5,q13,#20 eor r12,r12,r0,ror#24 vshr.u32 q9,q14,#20 eor r10,r10,r1,ror#24 vsli.32 q1,q12,#12 add r8,r8,r12 vsli.32 q5,q13,#12 mov r4,r4,ror#25 vsli.32 q9,q14,#12 add r9,r9,r10 vadd.i32 q0,q0,q1 mov r5,r5,ror#25 vadd.i32 q4,q4,q5 str r10,[sp,#4*(16+13)] vadd.i32 q8,q8,q9 ldr r10,[sp,#4*(16+15)] veor q12,q3,q0 eor r4,r4,r8,ror#25 veor q13,q7,q4 eor r5,r5,r9,ror#25 veor q14,q11,q8 str r8,[sp,#4*(16+8)] vshr.u32 q3,q12,#24 ldr r8,[sp,#4*(16+10)] vshr.u32 q7,q13,#24 add r2,r2,r6 vshr.u32 q11,q14,#24 mov r14,r14,ror#16 vsli.32 q3,q12,#8 str r9,[sp,#4*(16+9)] vsli.32 q7,q13,#8 ldr r9,[sp,#4*(16+11)] vsli.32 q11,q14,#8 add r3,r3,r7 vadd.i32 q2,q2,q3 mov r10,r10,ror#16 vadd.i32 q6,q6,q7 eor r14,r14,r2,ror#16 vadd.i32 q10,q10,q11 eor r10,r10,r3,ror#16 veor q12,q1,q2 add r8,r8,r14 veor q13,q5,q6 mov r6,r6,ror#20 veor q14,q9,q10 add r9,r9,r10 vshr.u32 q1,q12,#25 mov r7,r7,ror#20 vshr.u32 q5,q13,#25 eor r6,r6,r8,ror#20 vshr.u32 q9,q14,#25 eor r7,r7,r9,ror#20 vsli.32 q1,q12,#7 add r2,r2,r6 vsli.32 q5,q13,#7 mov r14,r14,ror#24 vsli.32 q9,q14,#7 add r3,r3,r7 vext.8 q2,q2,q2,#8 mov r10,r10,ror#24 vext.8 q6,q6,q6,#8 eor r14,r14,r2,ror#24 vext.8 q10,q10,q10,#8 eor r10,r10,r3,ror#24 vext.8 q1,q1,q1,#4 add r8,r8,r14 vext.8 q5,q5,q5,#4 mov r6,r6,ror#25 vext.8 q9,q9,q9,#4 add r9,r9,r10 vext.8 q3,q3,q3,#12 mov r7,r7,ror#25 vext.8 q7,q7,q7,#12 eor r6,r6,r8,ror#25 vext.8 q11,q11,q11,#12 eor r7,r7,r9,ror#25 vadd.i32 q0,q0,q1 add r0,r0,r5 vadd.i32 q4,q4,q5 mov r10,r10,ror#16 vadd.i32 q8,q8,q9 add r1,r1,r6 veor q3,q3,q0 mov r12,r12,ror#16 veor q7,q7,q4 eor r10,r10,r0,ror#16 veor q11,q11,q8 eor r12,r12,r1,ror#16 vrev32.16 q3,q3 add r8,r8,r10 vrev32.16 q7,q7 mov r5,r5,ror#20 vrev32.16 q11,q11 add r9,r9,r12 vadd.i32 q2,q2,q3 mov r6,r6,ror#20 vadd.i32 q6,q6,q7 eor r5,r5,r8,ror#20 vadd.i32 q10,q10,q11 eor r6,r6,r9,ror#20 veor q12,q1,q2 add r0,r0,r5 veor q13,q5,q6 mov r10,r10,ror#24 veor q14,q9,q10 add r1,r1,r6 vshr.u32 q1,q12,#20 mov r12,r12,ror#24 vshr.u32 q5,q13,#20 eor r10,r10,r0,ror#24 vshr.u32 q9,q14,#20 eor r12,r12,r1,ror#24 vsli.32 q1,q12,#12 add r8,r8,r10 vsli.32 q5,q13,#12 mov r5,r5,ror#25 vsli.32 q9,q14,#12 str r10,[sp,#4*(16+15)] vadd.i32 q0,q0,q1 ldr r10,[sp,#4*(16+13)] vadd.i32 q4,q4,q5 add r9,r9,r12 vadd.i32 q8,q8,q9 mov r6,r6,ror#25 veor q12,q3,q0 eor r5,r5,r8,ror#25 veor q13,q7,q4 eor r6,r6,r9,ror#25 veor q14,q11,q8 str r8,[sp,#4*(16+10)] vshr.u32 q3,q12,#24 ldr r8,[sp,#4*(16+8)] vshr.u32 q7,q13,#24 add r2,r2,r7 vshr.u32 q11,q14,#24 mov r10,r10,ror#16 vsli.32 q3,q12,#8 str r9,[sp,#4*(16+11)] vsli.32 q7,q13,#8 ldr r9,[sp,#4*(16+9)] vsli.32 q11,q14,#8 add r3,r3,r4 vadd.i32 q2,q2,q3 mov r14,r14,ror#16 vadd.i32 q6,q6,q7 eor r10,r10,r2,ror#16 vadd.i32 q10,q10,q11 eor r14,r14,r3,ror#16 veor q12,q1,q2 add r8,r8,r10 veor q13,q5,q6 mov r7,r7,ror#20 veor q14,q9,q10 add r9,r9,r14 vshr.u32 q1,q12,#25 mov r4,r4,ror#20 vshr.u32 q5,q13,#25 eor r7,r7,r8,ror#20 vshr.u32 q9,q14,#25 eor r4,r4,r9,ror#20 vsli.32 q1,q12,#7 add r2,r2,r7 vsli.32 q5,q13,#7 mov r10,r10,ror#24 vsli.32 q9,q14,#7 add r3,r3,r4 vext.8 q2,q2,q2,#8 mov r14,r14,ror#24 vext.8 q6,q6,q6,#8 eor r10,r10,r2,ror#24 vext.8 q10,q10,q10,#8 eor r14,r14,r3,ror#24 vext.8 q1,q1,q1,#12 add r8,r8,r10 vext.8 q5,q5,q5,#12 mov r7,r7,ror#25 vext.8 q9,q9,q9,#12 add r9,r9,r14 vext.8 q3,q3,q3,#4 mov r4,r4,ror#25 vext.8 q7,q7,q7,#4 eor r7,r7,r8,ror#25 vext.8 q11,q11,q11,#4 eor r4,r4,r9,ror#25 bne .Loop_neon add r11,sp,#32 vld1.32 {q12,q13},[sp] @ load key material vld1.32 {q14,q15},[r11] ldr r11,[sp,#4*(32+2)] @ load len str r8, [sp,#4*(16+8)] @ modulo-scheduled store str r9, [sp,#4*(16+9)] str r12,[sp,#4*(16+12)] str r10, [sp,#4*(16+13)] str r14,[sp,#4*(16+14)] @ at this point we have first half of 512-bit result in @ rx and second half at sp+4*(16+8) ldr r12,[sp,#4*(32+1)] @ load inp ldr r14,[sp,#4*(32+0)] @ load out vadd.i32 q0,q0,q12 @ accumulate key material vadd.i32 q4,q4,q12 vadd.i32 q8,q8,q12 vldr d24,[sp,#4*(16+0)] @ one vadd.i32 q1,q1,q13 vadd.i32 q5,q5,q13 vadd.i32 q9,q9,q13 vldr d26,[sp,#4*(16+2)] @ two vadd.i32 q2,q2,q14 vadd.i32 q6,q6,q14 vadd.i32 q10,q10,q14 vadd.i32 d14,d14,d24 @ counter+1 vadd.i32 d22,d22,d26 @ counter+2 vadd.i32 q3,q3,q15 vadd.i32 q7,q7,q15 vadd.i32 q11,q11,q15 cmp r11,#64*4 blo .Ltail_neon vld1.8 {q12,q13},[r12]! @ load input mov r11,sp vld1.8 {q14,q15},[r12]! veor q0,q0,q12 @ xor with input veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 vst1.8 {q0,q1},[r14]! @ store output veor q5,q5,q13 vld1.8 {q12,q13},[r12]! veor q6,q6,q14 vst1.8 {q2,q3},[r14]! veor q7,q7,q15 vld1.8 {q14,q15},[r12]! veor q8,q8,q12 vld1.32 {q0,q1},[r11]! @ load for next iteration veor d25,d25,d25 vldr d24,[sp,#4*(16+4)] @ four veor q9,q9,q13 vld1.32 {q2,q3},[r11] veor q10,q10,q14 vst1.8 {q4,q5},[r14]! veor q11,q11,q15 vst1.8 {q6,q7},[r14]! vadd.i32 d6,d6,d24 @ next counter value vldr d24,[sp,#4*(16+0)] @ one ldmia sp,{r8,r9,r10,r11} @ load key material add r0,r0,r8 @ accumulate key material ldr r8,[r12],#16 @ load input vst1.8 {q8,q9},[r14]! add r1,r1,r9 ldr r9,[r12,#-12] vst1.8 {q10,q11},[r14]! add r2,r2,r10 ldr r10,[r12,#-8] add r3,r3,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif eor r0,r0,r8 @ xor with input add r8,sp,#4*(4) eor r1,r1,r9 str r0,[r14],#16 @ store output eor r2,r2,r10 str r1,[r14,#-12] eor r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material ldr r8,[r12],#16 @ load input add r5,r5,r9 ldr r9,[r12,#-12] add r6,r6,r10 ldr r10,[r12,#-8] add r7,r7,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif eor r4,r4,r8 add r8,sp,#4*(8) eor r5,r5,r9 str r4,[r14],#16 @ store output eor r6,r6,r10 str r5,[r14,#-12] eor r7,r7,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r6,[r14,#-8] add r0,sp,#4*(16+8) str r7,[r14,#-4] ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material ldr r8,[r12],#16 @ load input add r1,r1,r9 ldr r9,[r12,#-12] # ifdef __thumb2__ it hi # endif strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it add r2,r2,r10 ldr r10,[r12,#-8] # ifdef __thumb2__ it hi # endif strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it add r3,r3,r11 ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif eor r0,r0,r8 add r8,sp,#4*(12) eor r1,r1,r9 str r0,[r14],#16 @ store output eor r2,r2,r10 str r1,[r14,#-12] eor r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material str r2,[r14,#-8] str r3,[r14,#-4] add r4,r4,r8 @ accumulate key material add r8,r8,#4 @ next counter value add r5,r5,r9 str r8,[sp,#4*(12)] @ save next counter value ldr r8,[r12],#16 @ load input add r6,r6,r10 add r4,r4,#3 @ counter+3 ldr r9,[r12,#-12] add r7,r7,r11 ldr r10,[r12,#-8] ldr r11,[r12,#-4] # ifdef __ARMEB__ rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif eor r4,r4,r8 # ifdef __thumb2__ it hi # endif ldrhi r8,[sp,#4*(32+2)] @ re-load len eor r5,r5,r9 eor r6,r6,r10 str r4,[r14],#16 @ store output eor r7,r7,r11 str r5,[r14,#-12] sub r11,r8,#64*4 @ len-=64*4 str r6,[r14,#-8] str r7,[r14,#-4] bhi .Loop_neon_outer b .Ldone_neon .align 4 .Lbreak_neon: @ harmonize NEON and integer-only stack frames: load data @ from NEON frame, but save to integer-only one; distance @ between the two is 4*(32+4+16-32)=4*(20). str r11, [sp,#4*(20+32+2)] @ save len add r11,sp,#4*(32+4) str r12, [sp,#4*(20+32+1)] @ save inp str r14, [sp,#4*(20+32+0)] @ save out ldr r12,[sp,#4*(16+10)] ldr r14,[sp,#4*(16+11)] vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement str r12,[sp,#4*(20+16+10)] @ copy "rx" str r14,[sp,#4*(20+16+11)] @ copy "rx" ldr r11, [sp,#4*(15)] ldr r12,[sp,#4*(12)] @ modulo-scheduled load ldr r10, [sp,#4*(13)] ldr r14,[sp,#4*(14)] str r11, [sp,#4*(20+16+15)] add r11,sp,#4*(20) vst1.32 {q0,q1},[r11]! @ copy key add sp,sp,#4*(20) @ switch frame vst1.32 {q2,q3},[r11] mov r11,#10 b .Loop @ go integer-only .align 4 .Ltail_neon: cmp r11,#64*3 bhs .L192_or_more_neon cmp r11,#64*2 bhs .L128_or_more_neon cmp r11,#64*1 bhs .L64_or_more_neon add r8,sp,#4*(8) vst1.8 {q0,q1},[sp] add r10,sp,#4*(0) vst1.8 {q2,q3},[r8] b .Loop_tail_neon .align 4 .L64_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 veor q2,q2,q14 veor q3,q3,q15 vst1.8 {q0,q1},[r14]! vst1.8 {q2,q3},[r14]! beq .Ldone_neon add r8,sp,#4*(8) vst1.8 {q4,q5},[sp] add r10,sp,#4*(0) vst1.8 {q6,q7},[r8] sub r11,r11,#64*1 @ len-=64*1 b .Loop_tail_neon .align 4 .L128_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 veor q5,q5,q13 vst1.8 {q0,q1},[r14]! veor q6,q6,q14 vst1.8 {q2,q3},[r14]! veor q7,q7,q15 vst1.8 {q4,q5},[r14]! vst1.8 {q6,q7},[r14]! beq .Ldone_neon add r8,sp,#4*(8) vst1.8 {q8,q9},[sp] add r10,sp,#4*(0) vst1.8 {q10,q11},[r8] sub r11,r11,#64*2 @ len-=64*2 b .Loop_tail_neon .align 4 .L192_or_more_neon: vld1.8 {q12,q13},[r12]! vld1.8 {q14,q15},[r12]! veor q0,q0,q12 veor q1,q1,q13 vld1.8 {q12,q13},[r12]! veor q2,q2,q14 veor q3,q3,q15 vld1.8 {q14,q15},[r12]! veor q4,q4,q12 veor q5,q5,q13 vld1.8 {q12,q13},[r12]! veor q6,q6,q14 vst1.8 {q0,q1},[r14]! veor q7,q7,q15 vld1.8 {q14,q15},[r12]! veor q8,q8,q12 vst1.8 {q2,q3},[r14]! veor q9,q9,q13 vst1.8 {q4,q5},[r14]! veor q10,q10,q14 vst1.8 {q6,q7},[r14]! veor q11,q11,q15 vst1.8 {q8,q9},[r14]! vst1.8 {q10,q11},[r14]! beq .Ldone_neon ldmia sp,{r8,r9,r10,r11} @ load key material add r0,r0,r8 @ accumulate key material add r8,sp,#4*(4) add r1,r1,r9 add r2,r2,r10 add r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material add r8,sp,#4*(8) add r5,r5,r9 add r6,r6,r10 add r7,r7,r11 ldmia r8,{r8,r9,r10,r11} @ load key material # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7} add r0,sp,#4*(16+8) ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half add r0,r0,r8 @ accumulate key material add r8,sp,#4*(12) add r1,r1,r9 add r2,r2,r10 add r3,r3,r11 ldmia r8,{r8,r9,r10,r11} @ load key material add r4,r4,r8 @ accumulate key material add r8,sp,#4*(8) add r5,r5,r9 add r4,r4,#3 @ counter+3 add r6,r6,r10 add r7,r7,r11 ldr r11,[sp,#4*(32+2)] @ re-load len # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 rev r7,r7 # endif stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7} add r10,sp,#4*(0) sub r11,r11,#64*3 @ len-=64*3 .Loop_tail_neon: ldrb r8,[r10],#1 @ read buffer on stack ldrb r9,[r12],#1 @ read input subs r11,r11,#1 eor r8,r8,r9 strb r8,[r14],#1 @ store output bne .Loop_tail_neon .Ldone_neon: add sp,sp,#4*(32+4) vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15} add sp,sp,#4*(16+3) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} .size ChaCha20_neon,.-ChaCha20_neon .comm GFp_armcap_P,4,4 #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/chacha-armv8-ios64.S000064400000000000000000001162661353224260500167470ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .section __TEXT,__const .align 5 Lsigma: .quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral Lone: .long 1,0,0,0 LGFp_armcap_P: #ifdef __ILP32__ .long _GFp_armcap_P-. #else .quad _GFp_armcap_P-. #endif .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .text .globl _GFp_ChaCha20_ctr32 .private_extern _GFp_ChaCha20_ctr32 .align 5 _GFp_ChaCha20_ctr32: cbz x2,Labort adrp x5,_GFp_armcap_P@PAGE cmp x2,#192 b.lo Lshort add x5,x5,_GFp_armcap_P@PAGEOFF ldr w17,[x5] tst w17,#ARMV7_NEON b.ne ChaCha20_neon Lshort: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,Lsigma@PAGE add x5,x5,Lsigma@PAGEOFF stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#64 ldp x22,x23,[x5] // load sigma ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ldp x28,x30,[x4] // load counter #ifdef __ARMEB__ ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif Loop_outer: mov w5,w22 // unpack key block lsr x6,x22,#32 mov w7,w23 lsr x8,x23,#32 mov w9,w24 lsr x10,x24,#32 mov w11,w25 lsr x12,x25,#32 mov w13,w26 lsr x14,x26,#32 mov w15,w27 lsr x16,x27,#32 mov w17,w28 lsr x19,x28,#32 mov w20,w30 lsr x21,x30,#32 mov x4,#10 subs x2,x2,#64 Loop: sub x4,x4,#1 add w5,w5,w9 add w6,w6,w10 add w7,w7,w11 add w8,w8,w12 eor w17,w17,w5 eor w19,w19,w6 eor w20,w20,w7 eor w21,w21,w8 ror w17,w17,#16 ror w19,w19,#16 ror w20,w20,#16 ror w21,w21,#16 add w13,w13,w17 add w14,w14,w19 add w15,w15,w20 add w16,w16,w21 eor w9,w9,w13 eor w10,w10,w14 eor w11,w11,w15 eor w12,w12,w16 ror w9,w9,#20 ror w10,w10,#20 ror w11,w11,#20 ror w12,w12,#20 add w5,w5,w9 add w6,w6,w10 add w7,w7,w11 add w8,w8,w12 eor w17,w17,w5 eor w19,w19,w6 eor w20,w20,w7 eor w21,w21,w8 ror w17,w17,#24 ror w19,w19,#24 ror w20,w20,#24 ror w21,w21,#24 add w13,w13,w17 add w14,w14,w19 add w15,w15,w20 add w16,w16,w21 eor w9,w9,w13 eor w10,w10,w14 eor w11,w11,w15 eor w12,w12,w16 ror w9,w9,#25 ror w10,w10,#25 ror w11,w11,#25 ror w12,w12,#25 add w5,w5,w10 add w6,w6,w11 add w7,w7,w12 add w8,w8,w9 eor w21,w21,w5 eor w17,w17,w6 eor w19,w19,w7 eor w20,w20,w8 ror w21,w21,#16 ror w17,w17,#16 ror w19,w19,#16 ror w20,w20,#16 add w15,w15,w21 add w16,w16,w17 add w13,w13,w19 add w14,w14,w20 eor w10,w10,w15 eor w11,w11,w16 eor w12,w12,w13 eor w9,w9,w14 ror w10,w10,#20 ror w11,w11,#20 ror w12,w12,#20 ror w9,w9,#20 add w5,w5,w10 add w6,w6,w11 add w7,w7,w12 add w8,w8,w9 eor w21,w21,w5 eor w17,w17,w6 eor w19,w19,w7 eor w20,w20,w8 ror w21,w21,#24 ror w17,w17,#24 ror w19,w19,#24 ror w20,w20,#24 add w15,w15,w21 add w16,w16,w17 add w13,w13,w19 add w14,w14,w20 eor w10,w10,w15 eor w11,w11,w16 eor w12,w12,w13 eor w9,w9,w14 ror w10,w10,#25 ror w11,w11,#25 ror w12,w12,#25 ror w9,w9,#25 cbnz x4,Loop add w5,w5,w22 // accumulate key block add x6,x6,x22,lsr#32 add w7,w7,w23 add x8,x8,x23,lsr#32 add w9,w9,w24 add x10,x10,x24,lsr#32 add w11,w11,w25 add x12,x12,x25,lsr#32 add w13,w13,w26 add x14,x14,x26,lsr#32 add w15,w15,w27 add x16,x16,x27,lsr#32 add w17,w17,w28 add x19,x19,x28,lsr#32 add w20,w20,w30 add x21,x21,x30,lsr#32 b.lo Ltail add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#1 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 b.hi Loop_outer ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 Labort: ret .align 4 Ltail: add x2,x2,#64 Less_than_64: sub x0,x0,#1 add x1,x1,x2 add x0,x0,x2 add x4,sp,x2 neg x2,x2 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif stp x5,x7,[sp,#0] stp x9,x11,[sp,#16] stp x13,x15,[sp,#32] stp x17,x20,[sp,#48] Loop_tail: ldrb w10,[x1,x2] ldrb w11,[x4,x2] add x2,x2,#1 eor w10,w10,w11 strb w10,[x0,x2] cbnz x2,Loop_tail stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .align 5 ChaCha20_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,Lsigma@PAGE add x5,x5,Lsigma@PAGEOFF stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] cmp x2,#512 b.hs L512_or_more_neon sub sp,sp,#64 ldp x22,x23,[x5] // load sigma ld1 {v24.4s},[x5],#16 ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ld1 {v25.4s,v26.4s},[x3] ldp x28,x30,[x4] // load counter ld1 {v27.4s},[x4] ld1 {v31.4s},[x5] #ifdef __ARMEB__ rev64 v24.4s,v24.4s ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif add v27.4s,v27.4s,v31.4s // += 1 add v28.4s,v27.4s,v31.4s add v29.4s,v28.4s,v31.4s shl v31.4s,v31.4s,#2 // 1 -> 4 Loop_outer_neon: mov w5,w22 // unpack key block lsr x6,x22,#32 mov v0.16b,v24.16b mov w7,w23 lsr x8,x23,#32 mov v4.16b,v24.16b mov w9,w24 lsr x10,x24,#32 mov v16.16b,v24.16b mov w11,w25 mov v1.16b,v25.16b lsr x12,x25,#32 mov v5.16b,v25.16b mov w13,w26 mov v17.16b,v25.16b lsr x14,x26,#32 mov v3.16b,v27.16b mov w15,w27 mov v7.16b,v28.16b lsr x16,x27,#32 mov v19.16b,v29.16b mov w17,w28 mov v2.16b,v26.16b lsr x19,x28,#32 mov v6.16b,v26.16b mov w20,w30 mov v18.16b,v26.16b lsr x21,x30,#32 mov x4,#10 subs x2,x2,#256 Loop_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v16.4s,v16.4s,v17.4s add w7,w7,w11 eor v3.16b,v3.16b,v0.16b add w8,w8,w12 eor v7.16b,v7.16b,v4.16b eor w17,w17,w5 eor v19.16b,v19.16b,v16.16b eor w19,w19,w6 rev32 v3.8h,v3.8h eor w20,w20,w7 rev32 v7.8h,v7.8h eor w21,w21,w8 rev32 v19.8h,v19.8h ror w17,w17,#16 add v2.4s,v2.4s,v3.4s ror w19,w19,#16 add v6.4s,v6.4s,v7.4s ror w20,w20,#16 add v18.4s,v18.4s,v19.4s ror w21,w21,#16 eor v20.16b,v1.16b,v2.16b add w13,w13,w17 eor v21.16b,v5.16b,v6.16b add w14,w14,w19 eor v22.16b,v17.16b,v18.16b add w15,w15,w20 ushr v1.4s,v20.4s,#20 add w16,w16,w21 ushr v5.4s,v21.4s,#20 eor w9,w9,w13 ushr v17.4s,v22.4s,#20 eor w10,w10,w14 sli v1.4s,v20.4s,#12 eor w11,w11,w15 sli v5.4s,v21.4s,#12 eor w12,w12,w16 sli v17.4s,v22.4s,#12 ror w9,w9,#20 add v0.4s,v0.4s,v1.4s ror w10,w10,#20 add v4.4s,v4.4s,v5.4s ror w11,w11,#20 add v16.4s,v16.4s,v17.4s ror w12,w12,#20 eor v20.16b,v3.16b,v0.16b add w5,w5,w9 eor v21.16b,v7.16b,v4.16b add w6,w6,w10 eor v22.16b,v19.16b,v16.16b add w7,w7,w11 ushr v3.4s,v20.4s,#24 add w8,w8,w12 ushr v7.4s,v21.4s,#24 eor w17,w17,w5 ushr v19.4s,v22.4s,#24 eor w19,w19,w6 sli v3.4s,v20.4s,#8 eor w20,w20,w7 sli v7.4s,v21.4s,#8 eor w21,w21,w8 sli v19.4s,v22.4s,#8 ror w17,w17,#24 add v2.4s,v2.4s,v3.4s ror w19,w19,#24 add v6.4s,v6.4s,v7.4s ror w20,w20,#24 add v18.4s,v18.4s,v19.4s ror w21,w21,#24 eor v20.16b,v1.16b,v2.16b add w13,w13,w17 eor v21.16b,v5.16b,v6.16b add w14,w14,w19 eor v22.16b,v17.16b,v18.16b add w15,w15,w20 ushr v1.4s,v20.4s,#25 add w16,w16,w21 ushr v5.4s,v21.4s,#25 eor w9,w9,w13 ushr v17.4s,v22.4s,#25 eor w10,w10,w14 sli v1.4s,v20.4s,#7 eor w11,w11,w15 sli v5.4s,v21.4s,#7 eor w12,w12,w16 sli v17.4s,v22.4s,#7 ror w9,w9,#25 ext v2.16b,v2.16b,v2.16b,#8 ror w10,w10,#25 ext v6.16b,v6.16b,v6.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w10 add v4.4s,v4.4s,v5.4s add w6,w6,w11 add v16.4s,v16.4s,v17.4s add w7,w7,w12 eor v3.16b,v3.16b,v0.16b add w8,w8,w9 eor v7.16b,v7.16b,v4.16b eor w21,w21,w5 eor v19.16b,v19.16b,v16.16b eor w17,w17,w6 rev32 v3.8h,v3.8h eor w19,w19,w7 rev32 v7.8h,v7.8h eor w20,w20,w8 rev32 v19.8h,v19.8h ror w21,w21,#16 add v2.4s,v2.4s,v3.4s ror w17,w17,#16 add v6.4s,v6.4s,v7.4s ror w19,w19,#16 add v18.4s,v18.4s,v19.4s ror w20,w20,#16 eor v20.16b,v1.16b,v2.16b add w15,w15,w21 eor v21.16b,v5.16b,v6.16b add w16,w16,w17 eor v22.16b,v17.16b,v18.16b add w13,w13,w19 ushr v1.4s,v20.4s,#20 add w14,w14,w20 ushr v5.4s,v21.4s,#20 eor w10,w10,w15 ushr v17.4s,v22.4s,#20 eor w11,w11,w16 sli v1.4s,v20.4s,#12 eor w12,w12,w13 sli v5.4s,v21.4s,#12 eor w9,w9,w14 sli v17.4s,v22.4s,#12 ror w10,w10,#20 add v0.4s,v0.4s,v1.4s ror w11,w11,#20 add v4.4s,v4.4s,v5.4s ror w12,w12,#20 add v16.4s,v16.4s,v17.4s ror w9,w9,#20 eor v20.16b,v3.16b,v0.16b add w5,w5,w10 eor v21.16b,v7.16b,v4.16b add w6,w6,w11 eor v22.16b,v19.16b,v16.16b add w7,w7,w12 ushr v3.4s,v20.4s,#24 add w8,w8,w9 ushr v7.4s,v21.4s,#24 eor w21,w21,w5 ushr v19.4s,v22.4s,#24 eor w17,w17,w6 sli v3.4s,v20.4s,#8 eor w19,w19,w7 sli v7.4s,v21.4s,#8 eor w20,w20,w8 sli v19.4s,v22.4s,#8 ror w21,w21,#24 add v2.4s,v2.4s,v3.4s ror w17,w17,#24 add v6.4s,v6.4s,v7.4s ror w19,w19,#24 add v18.4s,v18.4s,v19.4s ror w20,w20,#24 eor v20.16b,v1.16b,v2.16b add w15,w15,w21 eor v21.16b,v5.16b,v6.16b add w16,w16,w17 eor v22.16b,v17.16b,v18.16b add w13,w13,w19 ushr v1.4s,v20.4s,#25 add w14,w14,w20 ushr v5.4s,v21.4s,#25 eor w10,w10,w15 ushr v17.4s,v22.4s,#25 eor w11,w11,w16 sli v1.4s,v20.4s,#7 eor w12,w12,w13 sli v5.4s,v21.4s,#7 eor w9,w9,w14 sli v17.4s,v22.4s,#7 ror w10,w10,#25 ext v2.16b,v2.16b,v2.16b,#8 ror w11,w11,#25 ext v6.16b,v6.16b,v6.16b,#8 ror w12,w12,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 cbnz x4,Loop_neon add w5,w5,w22 // accumulate key block add v0.4s,v0.4s,v24.4s add x6,x6,x22,lsr#32 add v4.4s,v4.4s,v24.4s add w7,w7,w23 add v16.4s,v16.4s,v24.4s add x8,x8,x23,lsr#32 add v2.4s,v2.4s,v26.4s add w9,w9,w24 add v6.4s,v6.4s,v26.4s add x10,x10,x24,lsr#32 add v18.4s,v18.4s,v26.4s add w11,w11,w25 add v3.4s,v3.4s,v27.4s add x12,x12,x25,lsr#32 add w13,w13,w26 add v7.4s,v7.4s,v28.4s add x14,x14,x26,lsr#32 add w15,w15,w27 add v19.4s,v19.4s,v29.4s add x16,x16,x27,lsr#32 add w17,w17,w28 add v1.4s,v1.4s,v25.4s add x19,x19,x28,lsr#32 add w20,w20,w30 add v5.4s,v5.4s,v25.4s add x21,x21,x30,lsr#32 add v17.4s,v17.4s,v25.4s b.lo Ltail_neon add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor v0.16b,v0.16b,v20.16b eor x15,x15,x16 eor v1.16b,v1.16b,v21.16b eor x17,x17,x19 eor v2.16b,v2.16b,v22.16b eor x20,x20,x21 eor v3.16b,v3.16b,v23.16b ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 stp x5,x7,[x0,#0] // store output add x28,x28,#4 // increment counter stp x9,x11,[x0,#16] add v27.4s,v27.4s,v31.4s // += 4 stp x13,x15,[x0,#32] add v28.4s,v28.4s,v31.4s stp x17,x20,[x0,#48] add v29.4s,v29.4s,v31.4s add x0,x0,#64 st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 eor v4.16b,v4.16b,v20.16b eor v5.16b,v5.16b,v21.16b eor v6.16b,v6.16b,v22.16b eor v7.16b,v7.16b,v23.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 eor v16.16b,v16.16b,v0.16b eor v17.16b,v17.16b,v1.16b eor v18.16b,v18.16b,v2.16b eor v19.16b,v19.16b,v3.16b st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 b.hi Loop_outer_neon ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret Ltail_neon: add x2,x2,#256 cmp x2,#64 b.lo Less_than_64 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#4 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 b.eq Ldone_neon sub x2,x2,#64 cmp x2,#64 b.lo Less_than_128 ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor v0.16b,v0.16b,v20.16b eor v1.16b,v1.16b,v21.16b eor v2.16b,v2.16b,v22.16b eor v3.16b,v3.16b,v23.16b st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 b.eq Ldone_neon sub x2,x2,#64 cmp x2,#64 b.lo Less_than_192 ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor v4.16b,v4.16b,v20.16b eor v5.16b,v5.16b,v21.16b eor v6.16b,v6.16b,v22.16b eor v7.16b,v7.16b,v23.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 b.eq Ldone_neon sub x2,x2,#64 st1 {v16.16b,v17.16b,v18.16b,v19.16b},[sp] b Last_neon Less_than_128: st1 {v0.16b,v1.16b,v2.16b,v3.16b},[sp] b Last_neon Less_than_192: st1 {v4.16b,v5.16b,v6.16b,v7.16b},[sp] b Last_neon .align 4 Last_neon: sub x0,x0,#1 add x1,x1,x2 add x0,x0,x2 add x4,sp,x2 neg x2,x2 Loop_tail_neon: ldrb w10,[x1,x2] ldrb w11,[x4,x2] add x2,x2,#1 eor w10,w10,w11 strb w10,[x0,x2] cbnz x2,Loop_tail_neon stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] Ldone_neon: ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .align 5 ChaCha20_512_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,Lsigma@PAGE add x5,x5,Lsigma@PAGEOFF stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] L512_or_more_neon: sub sp,sp,#128+64 ldp x22,x23,[x5] // load sigma ld1 {v24.4s},[x5],#16 ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ld1 {v25.4s,v26.4s},[x3] ldp x28,x30,[x4] // load counter ld1 {v27.4s},[x4] ld1 {v31.4s},[x5] #ifdef __ARMEB__ rev64 v24.4s,v24.4s ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif add v27.4s,v27.4s,v31.4s // += 1 stp q24,q25,[sp,#0] // off-load key block, invariant part add v27.4s,v27.4s,v31.4s // not typo str q26,[sp,#32] add v28.4s,v27.4s,v31.4s add v29.4s,v28.4s,v31.4s add v30.4s,v29.4s,v31.4s shl v31.4s,v31.4s,#2 // 1 -> 4 stp d8,d9,[sp,#128+0] // meet ABI requirements stp d10,d11,[sp,#128+16] stp d12,d13,[sp,#128+32] stp d14,d15,[sp,#128+48] sub x2,x2,#512 // not typo Loop_outer_512_neon: mov v0.16b,v24.16b mov v4.16b,v24.16b mov v8.16b,v24.16b mov v12.16b,v24.16b mov v16.16b,v24.16b mov v20.16b,v24.16b mov v1.16b,v25.16b mov w5,w22 // unpack key block mov v5.16b,v25.16b lsr x6,x22,#32 mov v9.16b,v25.16b mov w7,w23 mov v13.16b,v25.16b lsr x8,x23,#32 mov v17.16b,v25.16b mov w9,w24 mov v21.16b,v25.16b lsr x10,x24,#32 mov v3.16b,v27.16b mov w11,w25 mov v7.16b,v28.16b lsr x12,x25,#32 mov v11.16b,v29.16b mov w13,w26 mov v15.16b,v30.16b lsr x14,x26,#32 mov v2.16b,v26.16b mov w15,w27 mov v6.16b,v26.16b lsr x16,x27,#32 add v19.4s,v3.4s,v31.4s // +4 mov w17,w28 add v23.4s,v7.4s,v31.4s // +4 lsr x19,x28,#32 mov v10.16b,v26.16b mov w20,w30 mov v14.16b,v26.16b lsr x21,x30,#32 mov v18.16b,v26.16b stp q27,q28,[sp,#48] // off-load key block, variable part mov v22.16b,v26.16b str q29,[sp,#80] mov x4,#5 subs x2,x2,#512 Loop_upper_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v11.16b,v11.16b,v11.16b,#12 ext v15.16b,v15.16b,v15.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v23.16b,v23.16b,v23.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v9.16b,v9.16b,v9.16b,#4 ext v13.16b,v13.16b,v13.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 ext v21.16b,v21.16b,v21.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v11.16b,v11.16b,v11.16b,#4 ext v15.16b,v15.16b,v15.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v23.16b,v23.16b,v23.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v9.16b,v9.16b,v9.16b,#12 ext v13.16b,v13.16b,v13.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 ext v21.16b,v21.16b,v21.16b,#12 cbnz x4,Loop_upper_neon add w5,w5,w22 // accumulate key block add x6,x6,x22,lsr#32 add w7,w7,w23 add x8,x8,x23,lsr#32 add w9,w9,w24 add x10,x10,x24,lsr#32 add w11,w11,w25 add x12,x12,x25,lsr#32 add w13,w13,w26 add x14,x14,x26,lsr#32 add w15,w15,w27 add x16,x16,x27,lsr#32 add w17,w17,w28 add x19,x19,x28,lsr#32 add w20,w20,w30 add x21,x21,x30,lsr#32 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#1 // increment counter mov w5,w22 // unpack key block lsr x6,x22,#32 stp x9,x11,[x0,#16] mov w7,w23 lsr x8,x23,#32 stp x13,x15,[x0,#32] mov w9,w24 lsr x10,x24,#32 stp x17,x20,[x0,#48] add x0,x0,#64 mov w11,w25 lsr x12,x25,#32 mov w13,w26 lsr x14,x26,#32 mov w15,w27 lsr x16,x27,#32 mov w17,w28 lsr x19,x28,#32 mov w20,w30 lsr x21,x30,#32 mov x4,#5 Loop_lower_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v11.16b,v11.16b,v11.16b,#12 ext v15.16b,v15.16b,v15.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v23.16b,v23.16b,v23.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v9.16b,v9.16b,v9.16b,#4 ext v13.16b,v13.16b,v13.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 ext v21.16b,v21.16b,v21.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v11.16b,v11.16b,v11.16b,#4 ext v15.16b,v15.16b,v15.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v23.16b,v23.16b,v23.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v9.16b,v9.16b,v9.16b,#12 ext v13.16b,v13.16b,v13.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 ext v21.16b,v21.16b,v21.16b,#12 cbnz x4,Loop_lower_neon add w5,w5,w22 // accumulate key block ldp q24,q25,[sp,#0] add x6,x6,x22,lsr#32 ldp q26,q27,[sp,#32] add w7,w7,w23 ldp q28,q29,[sp,#64] add x8,x8,x23,lsr#32 add v0.4s,v0.4s,v24.4s add w9,w9,w24 add v4.4s,v4.4s,v24.4s add x10,x10,x24,lsr#32 add v8.4s,v8.4s,v24.4s add w11,w11,w25 add v12.4s,v12.4s,v24.4s add x12,x12,x25,lsr#32 add v16.4s,v16.4s,v24.4s add w13,w13,w26 add v20.4s,v20.4s,v24.4s add x14,x14,x26,lsr#32 add v2.4s,v2.4s,v26.4s add w15,w15,w27 add v6.4s,v6.4s,v26.4s add x16,x16,x27,lsr#32 add v10.4s,v10.4s,v26.4s add w17,w17,w28 add v14.4s,v14.4s,v26.4s add x19,x19,x28,lsr#32 add v18.4s,v18.4s,v26.4s add w20,w20,w30 add v22.4s,v22.4s,v26.4s add x21,x21,x30,lsr#32 add v19.4s,v19.4s,v31.4s // +4 add x5,x5,x6,lsl#32 // pack add v23.4s,v23.4s,v31.4s // +4 add x7,x7,x8,lsl#32 add v3.4s,v3.4s,v27.4s ldp x6,x8,[x1,#0] // load input add v7.4s,v7.4s,v28.4s add x9,x9,x10,lsl#32 add v11.4s,v11.4s,v29.4s add x11,x11,x12,lsl#32 add v15.4s,v15.4s,v30.4s ldp x10,x12,[x1,#16] add v19.4s,v19.4s,v27.4s add x13,x13,x14,lsl#32 add v23.4s,v23.4s,v28.4s add x15,x15,x16,lsl#32 add v1.4s,v1.4s,v25.4s ldp x14,x16,[x1,#32] add v5.4s,v5.4s,v25.4s add x17,x17,x19,lsl#32 add v9.4s,v9.4s,v25.4s add x20,x20,x21,lsl#32 add v13.4s,v13.4s,v25.4s ldp x19,x21,[x1,#48] add v17.4s,v17.4s,v25.4s add x1,x1,#64 add v21.4s,v21.4s,v25.4s #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor v0.16b,v0.16b,v24.16b eor x15,x15,x16 eor v1.16b,v1.16b,v25.16b eor x17,x17,x19 eor v2.16b,v2.16b,v26.16b eor x20,x20,x21 eor v3.16b,v3.16b,v27.16b ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 stp x5,x7,[x0,#0] // store output add x28,x28,#7 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 eor v4.16b,v4.16b,v24.16b eor v5.16b,v5.16b,v25.16b eor v6.16b,v6.16b,v26.16b eor v7.16b,v7.16b,v27.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 eor v8.16b,v8.16b,v0.16b ldp q24,q25,[sp,#0] eor v9.16b,v9.16b,v1.16b ldp q26,q27,[sp,#32] eor v10.16b,v10.16b,v2.16b eor v11.16b,v11.16b,v3.16b st1 {v8.16b,v9.16b,v10.16b,v11.16b},[x0],#64 ld1 {v8.16b,v9.16b,v10.16b,v11.16b},[x1],#64 eor v12.16b,v12.16b,v4.16b eor v13.16b,v13.16b,v5.16b eor v14.16b,v14.16b,v6.16b eor v15.16b,v15.16b,v7.16b st1 {v12.16b,v13.16b,v14.16b,v15.16b},[x0],#64 ld1 {v12.16b,v13.16b,v14.16b,v15.16b},[x1],#64 eor v16.16b,v16.16b,v8.16b eor v17.16b,v17.16b,v9.16b eor v18.16b,v18.16b,v10.16b eor v19.16b,v19.16b,v11.16b st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 shl v0.4s,v31.4s,#1 // 4 -> 8 eor v20.16b,v20.16b,v12.16b eor v21.16b,v21.16b,v13.16b eor v22.16b,v22.16b,v14.16b eor v23.16b,v23.16b,v15.16b st1 {v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64 add v27.4s,v27.4s,v0.4s // += 8 add v28.4s,v28.4s,v0.4s add v29.4s,v29.4s,v0.4s add v30.4s,v30.4s,v0.4s b.hs Loop_outer_512_neon adds x2,x2,#512 ushr v0.4s,v31.4s,#2 // 4 -> 1 ldp d8,d9,[sp,#128+0] // meet ABI requirements ldp d10,d11,[sp,#128+16] ldp d12,d13,[sp,#128+32] ldp d14,d15,[sp,#128+48] stp q24,q31,[sp,#0] // wipe off-load area stp q24,q31,[sp,#32] stp q24,q31,[sp,#64] b.eq Ldone_512_neon cmp x2,#192 sub v27.4s,v27.4s,v0.4s // -= 1 sub v28.4s,v28.4s,v0.4s sub v29.4s,v29.4s,v0.4s add sp,sp,#128 b.hs Loop_outer_neon eor v25.16b,v25.16b,v25.16b eor v26.16b,v26.16b,v26.16b eor v27.16b,v27.16b,v27.16b eor v28.16b,v28.16b,v28.16b eor v29.16b,v29.16b,v29.16b eor v30.16b,v30.16b,v30.16b b Loop_outer Ldone_512_neon: ldp x19,x20,[x29,#16] add sp,sp,#128+64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/chacha-armv8-linux64.S000064400000000000000000001166661353224260600173210ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) #include .section .rodata .align 5 .Lsigma: .quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral .Lone: .long 1,0,0,0 .LGFp_armcap_P: #ifdef __ILP32__ .long GFp_armcap_P-. #else .quad GFp_armcap_P-. #endif .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .text .globl GFp_ChaCha20_ctr32 .hidden GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,%function .align 5 GFp_ChaCha20_ctr32: cbz x2,.Labort adrp x5,GFp_armcap_P cmp x2,#192 b.lo .Lshort add x5,x5,:lo12:GFp_armcap_P ldr w17,[x5] tst w17,#ARMV7_NEON b.ne ChaCha20_neon .Lshort: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,.Lsigma add x5,x5,:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#64 ldp x22,x23,[x5] // load sigma ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ldp x28,x30,[x4] // load counter #ifdef __ARMEB__ ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif .Loop_outer: mov w5,w22 // unpack key block lsr x6,x22,#32 mov w7,w23 lsr x8,x23,#32 mov w9,w24 lsr x10,x24,#32 mov w11,w25 lsr x12,x25,#32 mov w13,w26 lsr x14,x26,#32 mov w15,w27 lsr x16,x27,#32 mov w17,w28 lsr x19,x28,#32 mov w20,w30 lsr x21,x30,#32 mov x4,#10 subs x2,x2,#64 .Loop: sub x4,x4,#1 add w5,w5,w9 add w6,w6,w10 add w7,w7,w11 add w8,w8,w12 eor w17,w17,w5 eor w19,w19,w6 eor w20,w20,w7 eor w21,w21,w8 ror w17,w17,#16 ror w19,w19,#16 ror w20,w20,#16 ror w21,w21,#16 add w13,w13,w17 add w14,w14,w19 add w15,w15,w20 add w16,w16,w21 eor w9,w9,w13 eor w10,w10,w14 eor w11,w11,w15 eor w12,w12,w16 ror w9,w9,#20 ror w10,w10,#20 ror w11,w11,#20 ror w12,w12,#20 add w5,w5,w9 add w6,w6,w10 add w7,w7,w11 add w8,w8,w12 eor w17,w17,w5 eor w19,w19,w6 eor w20,w20,w7 eor w21,w21,w8 ror w17,w17,#24 ror w19,w19,#24 ror w20,w20,#24 ror w21,w21,#24 add w13,w13,w17 add w14,w14,w19 add w15,w15,w20 add w16,w16,w21 eor w9,w9,w13 eor w10,w10,w14 eor w11,w11,w15 eor w12,w12,w16 ror w9,w9,#25 ror w10,w10,#25 ror w11,w11,#25 ror w12,w12,#25 add w5,w5,w10 add w6,w6,w11 add w7,w7,w12 add w8,w8,w9 eor w21,w21,w5 eor w17,w17,w6 eor w19,w19,w7 eor w20,w20,w8 ror w21,w21,#16 ror w17,w17,#16 ror w19,w19,#16 ror w20,w20,#16 add w15,w15,w21 add w16,w16,w17 add w13,w13,w19 add w14,w14,w20 eor w10,w10,w15 eor w11,w11,w16 eor w12,w12,w13 eor w9,w9,w14 ror w10,w10,#20 ror w11,w11,#20 ror w12,w12,#20 ror w9,w9,#20 add w5,w5,w10 add w6,w6,w11 add w7,w7,w12 add w8,w8,w9 eor w21,w21,w5 eor w17,w17,w6 eor w19,w19,w7 eor w20,w20,w8 ror w21,w21,#24 ror w17,w17,#24 ror w19,w19,#24 ror w20,w20,#24 add w15,w15,w21 add w16,w16,w17 add w13,w13,w19 add w14,w14,w20 eor w10,w10,w15 eor w11,w11,w16 eor w12,w12,w13 eor w9,w9,w14 ror w10,w10,#25 ror w11,w11,#25 ror w12,w12,#25 ror w9,w9,#25 cbnz x4,.Loop add w5,w5,w22 // accumulate key block add x6,x6,x22,lsr#32 add w7,w7,w23 add x8,x8,x23,lsr#32 add w9,w9,w24 add x10,x10,x24,lsr#32 add w11,w11,w25 add x12,x12,x25,lsr#32 add w13,w13,w26 add x14,x14,x26,lsr#32 add w15,w15,w27 add x16,x16,x27,lsr#32 add w17,w17,w28 add x19,x19,x28,lsr#32 add w20,w20,w30 add x21,x21,x30,lsr#32 b.lo .Ltail add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#1 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 b.hi .Loop_outer ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 .Labort: ret .align 4 .Ltail: add x2,x2,#64 .Less_than_64: sub x0,x0,#1 add x1,x1,x2 add x0,x0,x2 add x4,sp,x2 neg x2,x2 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif stp x5,x7,[sp,#0] stp x9,x11,[sp,#16] stp x13,x15,[sp,#32] stp x17,x20,[sp,#48] .Loop_tail: ldrb w10,[x1,x2] ldrb w11,[x4,x2] add x2,x2,#1 eor w10,w10,w11 strb w10,[x0,x2] cbnz x2,.Loop_tail stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 .type ChaCha20_neon,%function .align 5 ChaCha20_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,.Lsigma add x5,x5,:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] cmp x2,#512 b.hs .L512_or_more_neon sub sp,sp,#64 ldp x22,x23,[x5] // load sigma ld1 {v24.4s},[x5],#16 ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ld1 {v25.4s,v26.4s},[x3] ldp x28,x30,[x4] // load counter ld1 {v27.4s},[x4] ld1 {v31.4s},[x5] #ifdef __ARMEB__ rev64 v24.4s,v24.4s ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif add v27.4s,v27.4s,v31.4s // += 1 add v28.4s,v27.4s,v31.4s add v29.4s,v28.4s,v31.4s shl v31.4s,v31.4s,#2 // 1 -> 4 .Loop_outer_neon: mov w5,w22 // unpack key block lsr x6,x22,#32 mov v0.16b,v24.16b mov w7,w23 lsr x8,x23,#32 mov v4.16b,v24.16b mov w9,w24 lsr x10,x24,#32 mov v16.16b,v24.16b mov w11,w25 mov v1.16b,v25.16b lsr x12,x25,#32 mov v5.16b,v25.16b mov w13,w26 mov v17.16b,v25.16b lsr x14,x26,#32 mov v3.16b,v27.16b mov w15,w27 mov v7.16b,v28.16b lsr x16,x27,#32 mov v19.16b,v29.16b mov w17,w28 mov v2.16b,v26.16b lsr x19,x28,#32 mov v6.16b,v26.16b mov w20,w30 mov v18.16b,v26.16b lsr x21,x30,#32 mov x4,#10 subs x2,x2,#256 .Loop_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v16.4s,v16.4s,v17.4s add w7,w7,w11 eor v3.16b,v3.16b,v0.16b add w8,w8,w12 eor v7.16b,v7.16b,v4.16b eor w17,w17,w5 eor v19.16b,v19.16b,v16.16b eor w19,w19,w6 rev32 v3.8h,v3.8h eor w20,w20,w7 rev32 v7.8h,v7.8h eor w21,w21,w8 rev32 v19.8h,v19.8h ror w17,w17,#16 add v2.4s,v2.4s,v3.4s ror w19,w19,#16 add v6.4s,v6.4s,v7.4s ror w20,w20,#16 add v18.4s,v18.4s,v19.4s ror w21,w21,#16 eor v20.16b,v1.16b,v2.16b add w13,w13,w17 eor v21.16b,v5.16b,v6.16b add w14,w14,w19 eor v22.16b,v17.16b,v18.16b add w15,w15,w20 ushr v1.4s,v20.4s,#20 add w16,w16,w21 ushr v5.4s,v21.4s,#20 eor w9,w9,w13 ushr v17.4s,v22.4s,#20 eor w10,w10,w14 sli v1.4s,v20.4s,#12 eor w11,w11,w15 sli v5.4s,v21.4s,#12 eor w12,w12,w16 sli v17.4s,v22.4s,#12 ror w9,w9,#20 add v0.4s,v0.4s,v1.4s ror w10,w10,#20 add v4.4s,v4.4s,v5.4s ror w11,w11,#20 add v16.4s,v16.4s,v17.4s ror w12,w12,#20 eor v20.16b,v3.16b,v0.16b add w5,w5,w9 eor v21.16b,v7.16b,v4.16b add w6,w6,w10 eor v22.16b,v19.16b,v16.16b add w7,w7,w11 ushr v3.4s,v20.4s,#24 add w8,w8,w12 ushr v7.4s,v21.4s,#24 eor w17,w17,w5 ushr v19.4s,v22.4s,#24 eor w19,w19,w6 sli v3.4s,v20.4s,#8 eor w20,w20,w7 sli v7.4s,v21.4s,#8 eor w21,w21,w8 sli v19.4s,v22.4s,#8 ror w17,w17,#24 add v2.4s,v2.4s,v3.4s ror w19,w19,#24 add v6.4s,v6.4s,v7.4s ror w20,w20,#24 add v18.4s,v18.4s,v19.4s ror w21,w21,#24 eor v20.16b,v1.16b,v2.16b add w13,w13,w17 eor v21.16b,v5.16b,v6.16b add w14,w14,w19 eor v22.16b,v17.16b,v18.16b add w15,w15,w20 ushr v1.4s,v20.4s,#25 add w16,w16,w21 ushr v5.4s,v21.4s,#25 eor w9,w9,w13 ushr v17.4s,v22.4s,#25 eor w10,w10,w14 sli v1.4s,v20.4s,#7 eor w11,w11,w15 sli v5.4s,v21.4s,#7 eor w12,w12,w16 sli v17.4s,v22.4s,#7 ror w9,w9,#25 ext v2.16b,v2.16b,v2.16b,#8 ror w10,w10,#25 ext v6.16b,v6.16b,v6.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w10 add v4.4s,v4.4s,v5.4s add w6,w6,w11 add v16.4s,v16.4s,v17.4s add w7,w7,w12 eor v3.16b,v3.16b,v0.16b add w8,w8,w9 eor v7.16b,v7.16b,v4.16b eor w21,w21,w5 eor v19.16b,v19.16b,v16.16b eor w17,w17,w6 rev32 v3.8h,v3.8h eor w19,w19,w7 rev32 v7.8h,v7.8h eor w20,w20,w8 rev32 v19.8h,v19.8h ror w21,w21,#16 add v2.4s,v2.4s,v3.4s ror w17,w17,#16 add v6.4s,v6.4s,v7.4s ror w19,w19,#16 add v18.4s,v18.4s,v19.4s ror w20,w20,#16 eor v20.16b,v1.16b,v2.16b add w15,w15,w21 eor v21.16b,v5.16b,v6.16b add w16,w16,w17 eor v22.16b,v17.16b,v18.16b add w13,w13,w19 ushr v1.4s,v20.4s,#20 add w14,w14,w20 ushr v5.4s,v21.4s,#20 eor w10,w10,w15 ushr v17.4s,v22.4s,#20 eor w11,w11,w16 sli v1.4s,v20.4s,#12 eor w12,w12,w13 sli v5.4s,v21.4s,#12 eor w9,w9,w14 sli v17.4s,v22.4s,#12 ror w10,w10,#20 add v0.4s,v0.4s,v1.4s ror w11,w11,#20 add v4.4s,v4.4s,v5.4s ror w12,w12,#20 add v16.4s,v16.4s,v17.4s ror w9,w9,#20 eor v20.16b,v3.16b,v0.16b add w5,w5,w10 eor v21.16b,v7.16b,v4.16b add w6,w6,w11 eor v22.16b,v19.16b,v16.16b add w7,w7,w12 ushr v3.4s,v20.4s,#24 add w8,w8,w9 ushr v7.4s,v21.4s,#24 eor w21,w21,w5 ushr v19.4s,v22.4s,#24 eor w17,w17,w6 sli v3.4s,v20.4s,#8 eor w19,w19,w7 sli v7.4s,v21.4s,#8 eor w20,w20,w8 sli v19.4s,v22.4s,#8 ror w21,w21,#24 add v2.4s,v2.4s,v3.4s ror w17,w17,#24 add v6.4s,v6.4s,v7.4s ror w19,w19,#24 add v18.4s,v18.4s,v19.4s ror w20,w20,#24 eor v20.16b,v1.16b,v2.16b add w15,w15,w21 eor v21.16b,v5.16b,v6.16b add w16,w16,w17 eor v22.16b,v17.16b,v18.16b add w13,w13,w19 ushr v1.4s,v20.4s,#25 add w14,w14,w20 ushr v5.4s,v21.4s,#25 eor w10,w10,w15 ushr v17.4s,v22.4s,#25 eor w11,w11,w16 sli v1.4s,v20.4s,#7 eor w12,w12,w13 sli v5.4s,v21.4s,#7 eor w9,w9,w14 sli v17.4s,v22.4s,#7 ror w10,w10,#25 ext v2.16b,v2.16b,v2.16b,#8 ror w11,w11,#25 ext v6.16b,v6.16b,v6.16b,#8 ror w12,w12,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 cbnz x4,.Loop_neon add w5,w5,w22 // accumulate key block add v0.4s,v0.4s,v24.4s add x6,x6,x22,lsr#32 add v4.4s,v4.4s,v24.4s add w7,w7,w23 add v16.4s,v16.4s,v24.4s add x8,x8,x23,lsr#32 add v2.4s,v2.4s,v26.4s add w9,w9,w24 add v6.4s,v6.4s,v26.4s add x10,x10,x24,lsr#32 add v18.4s,v18.4s,v26.4s add w11,w11,w25 add v3.4s,v3.4s,v27.4s add x12,x12,x25,lsr#32 add w13,w13,w26 add v7.4s,v7.4s,v28.4s add x14,x14,x26,lsr#32 add w15,w15,w27 add v19.4s,v19.4s,v29.4s add x16,x16,x27,lsr#32 add w17,w17,w28 add v1.4s,v1.4s,v25.4s add x19,x19,x28,lsr#32 add w20,w20,w30 add v5.4s,v5.4s,v25.4s add x21,x21,x30,lsr#32 add v17.4s,v17.4s,v25.4s b.lo .Ltail_neon add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor v0.16b,v0.16b,v20.16b eor x15,x15,x16 eor v1.16b,v1.16b,v21.16b eor x17,x17,x19 eor v2.16b,v2.16b,v22.16b eor x20,x20,x21 eor v3.16b,v3.16b,v23.16b ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 stp x5,x7,[x0,#0] // store output add x28,x28,#4 // increment counter stp x9,x11,[x0,#16] add v27.4s,v27.4s,v31.4s // += 4 stp x13,x15,[x0,#32] add v28.4s,v28.4s,v31.4s stp x17,x20,[x0,#48] add v29.4s,v29.4s,v31.4s add x0,x0,#64 st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 eor v4.16b,v4.16b,v20.16b eor v5.16b,v5.16b,v21.16b eor v6.16b,v6.16b,v22.16b eor v7.16b,v7.16b,v23.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 eor v16.16b,v16.16b,v0.16b eor v17.16b,v17.16b,v1.16b eor v18.16b,v18.16b,v2.16b eor v19.16b,v19.16b,v3.16b st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 b.hi .Loop_outer_neon ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .Ltail_neon: add x2,x2,#256 cmp x2,#64 b.lo .Less_than_64 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#4 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 b.eq .Ldone_neon sub x2,x2,#64 cmp x2,#64 b.lo .Less_than_128 ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor v0.16b,v0.16b,v20.16b eor v1.16b,v1.16b,v21.16b eor v2.16b,v2.16b,v22.16b eor v3.16b,v3.16b,v23.16b st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 b.eq .Ldone_neon sub x2,x2,#64 cmp x2,#64 b.lo .Less_than_192 ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 eor v4.16b,v4.16b,v20.16b eor v5.16b,v5.16b,v21.16b eor v6.16b,v6.16b,v22.16b eor v7.16b,v7.16b,v23.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 b.eq .Ldone_neon sub x2,x2,#64 st1 {v16.16b,v17.16b,v18.16b,v19.16b},[sp] b .Last_neon .Less_than_128: st1 {v0.16b,v1.16b,v2.16b,v3.16b},[sp] b .Last_neon .Less_than_192: st1 {v4.16b,v5.16b,v6.16b,v7.16b},[sp] b .Last_neon .align 4 .Last_neon: sub x0,x0,#1 add x1,x1,x2 add x0,x0,x2 add x4,sp,x2 neg x2,x2 .Loop_tail_neon: ldrb w10,[x1,x2] ldrb w11,[x4,x2] add x2,x2,#1 eor w10,w10,w11 strb w10,[x0,x2] cbnz x2,.Loop_tail_neon stp xzr,xzr,[sp,#0] stp xzr,xzr,[sp,#16] stp xzr,xzr,[sp,#32] stp xzr,xzr,[sp,#48] .Ldone_neon: ldp x19,x20,[x29,#16] add sp,sp,#64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size ChaCha20_neon,.-ChaCha20_neon .type ChaCha20_512_neon,%function .align 5 ChaCha20_512_neon: stp x29,x30,[sp,#-96]! add x29,sp,#0 adrp x5,.Lsigma add x5,x5,:lo12:.Lsigma stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] .L512_or_more_neon: sub sp,sp,#128+64 ldp x22,x23,[x5] // load sigma ld1 {v24.4s},[x5],#16 ldp x24,x25,[x3] // load key ldp x26,x27,[x3,#16] ld1 {v25.4s,v26.4s},[x3] ldp x28,x30,[x4] // load counter ld1 {v27.4s},[x4] ld1 {v31.4s},[x5] #ifdef __ARMEB__ rev64 v24.4s,v24.4s ror x24,x24,#32 ror x25,x25,#32 ror x26,x26,#32 ror x27,x27,#32 ror x28,x28,#32 ror x30,x30,#32 #endif add v27.4s,v27.4s,v31.4s // += 1 stp q24,q25,[sp,#0] // off-load key block, invariant part add v27.4s,v27.4s,v31.4s // not typo str q26,[sp,#32] add v28.4s,v27.4s,v31.4s add v29.4s,v28.4s,v31.4s add v30.4s,v29.4s,v31.4s shl v31.4s,v31.4s,#2 // 1 -> 4 stp d8,d9,[sp,#128+0] // meet ABI requirements stp d10,d11,[sp,#128+16] stp d12,d13,[sp,#128+32] stp d14,d15,[sp,#128+48] sub x2,x2,#512 // not typo .Loop_outer_512_neon: mov v0.16b,v24.16b mov v4.16b,v24.16b mov v8.16b,v24.16b mov v12.16b,v24.16b mov v16.16b,v24.16b mov v20.16b,v24.16b mov v1.16b,v25.16b mov w5,w22 // unpack key block mov v5.16b,v25.16b lsr x6,x22,#32 mov v9.16b,v25.16b mov w7,w23 mov v13.16b,v25.16b lsr x8,x23,#32 mov v17.16b,v25.16b mov w9,w24 mov v21.16b,v25.16b lsr x10,x24,#32 mov v3.16b,v27.16b mov w11,w25 mov v7.16b,v28.16b lsr x12,x25,#32 mov v11.16b,v29.16b mov w13,w26 mov v15.16b,v30.16b lsr x14,x26,#32 mov v2.16b,v26.16b mov w15,w27 mov v6.16b,v26.16b lsr x16,x27,#32 add v19.4s,v3.4s,v31.4s // +4 mov w17,w28 add v23.4s,v7.4s,v31.4s // +4 lsr x19,x28,#32 mov v10.16b,v26.16b mov w20,w30 mov v14.16b,v26.16b lsr x21,x30,#32 mov v18.16b,v26.16b stp q27,q28,[sp,#48] // off-load key block, variable part mov v22.16b,v26.16b str q29,[sp,#80] mov x4,#5 subs x2,x2,#512 .Loop_upper_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v11.16b,v11.16b,v11.16b,#12 ext v15.16b,v15.16b,v15.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v23.16b,v23.16b,v23.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v9.16b,v9.16b,v9.16b,#4 ext v13.16b,v13.16b,v13.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 ext v21.16b,v21.16b,v21.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v11.16b,v11.16b,v11.16b,#4 ext v15.16b,v15.16b,v15.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v23.16b,v23.16b,v23.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v9.16b,v9.16b,v9.16b,#12 ext v13.16b,v13.16b,v13.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 ext v21.16b,v21.16b,v21.16b,#12 cbnz x4,.Loop_upper_neon add w5,w5,w22 // accumulate key block add x6,x6,x22,lsr#32 add w7,w7,w23 add x8,x8,x23,lsr#32 add w9,w9,w24 add x10,x10,x24,lsr#32 add w11,w11,w25 add x12,x12,x25,lsr#32 add w13,w13,w26 add x14,x14,x26,lsr#32 add w15,w15,w27 add x16,x16,x27,lsr#32 add w17,w17,w28 add x19,x19,x28,lsr#32 add w20,w20,w30 add x21,x21,x30,lsr#32 add x5,x5,x6,lsl#32 // pack add x7,x7,x8,lsl#32 ldp x6,x8,[x1,#0] // load input add x9,x9,x10,lsl#32 add x11,x11,x12,lsl#32 ldp x10,x12,[x1,#16] add x13,x13,x14,lsl#32 add x15,x15,x16,lsl#32 ldp x14,x16,[x1,#32] add x17,x17,x19,lsl#32 add x20,x20,x21,lsl#32 ldp x19,x21,[x1,#48] add x1,x1,#64 #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor x15,x15,x16 eor x17,x17,x19 eor x20,x20,x21 stp x5,x7,[x0,#0] // store output add x28,x28,#1 // increment counter mov w5,w22 // unpack key block lsr x6,x22,#32 stp x9,x11,[x0,#16] mov w7,w23 lsr x8,x23,#32 stp x13,x15,[x0,#32] mov w9,w24 lsr x10,x24,#32 stp x17,x20,[x0,#48] add x0,x0,#64 mov w11,w25 lsr x12,x25,#32 mov w13,w26 lsr x14,x26,#32 mov w15,w27 lsr x16,x27,#32 mov w17,w28 lsr x19,x28,#32 mov w20,w30 lsr x21,x30,#32 mov x4,#5 .Loop_lower_neon: sub x4,x4,#1 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#12 ext v7.16b,v7.16b,v7.16b,#12 ext v11.16b,v11.16b,v11.16b,#12 ext v15.16b,v15.16b,v15.16b,#12 ext v19.16b,v19.16b,v19.16b,#12 ext v23.16b,v23.16b,v23.16b,#12 ext v1.16b,v1.16b,v1.16b,#4 ext v5.16b,v5.16b,v5.16b,#4 ext v9.16b,v9.16b,v9.16b,#4 ext v13.16b,v13.16b,v13.16b,#4 ext v17.16b,v17.16b,v17.16b,#4 ext v21.16b,v21.16b,v21.16b,#4 add v0.4s,v0.4s,v1.4s add w5,w5,w9 add v4.4s,v4.4s,v5.4s add w6,w6,w10 add v8.4s,v8.4s,v9.4s add w7,w7,w11 add v12.4s,v12.4s,v13.4s add w8,w8,w12 add v16.4s,v16.4s,v17.4s eor w17,w17,w5 add v20.4s,v20.4s,v21.4s eor w19,w19,w6 eor v3.16b,v3.16b,v0.16b eor w20,w20,w7 eor v7.16b,v7.16b,v4.16b eor w21,w21,w8 eor v11.16b,v11.16b,v8.16b ror w17,w17,#16 eor v15.16b,v15.16b,v12.16b ror w19,w19,#16 eor v19.16b,v19.16b,v16.16b ror w20,w20,#16 eor v23.16b,v23.16b,v20.16b ror w21,w21,#16 rev32 v3.8h,v3.8h add w13,w13,w17 rev32 v7.8h,v7.8h add w14,w14,w19 rev32 v11.8h,v11.8h add w15,w15,w20 rev32 v15.8h,v15.8h add w16,w16,w21 rev32 v19.8h,v19.8h eor w9,w9,w13 rev32 v23.8h,v23.8h eor w10,w10,w14 add v2.4s,v2.4s,v3.4s eor w11,w11,w15 add v6.4s,v6.4s,v7.4s eor w12,w12,w16 add v10.4s,v10.4s,v11.4s ror w9,w9,#20 add v14.4s,v14.4s,v15.4s ror w10,w10,#20 add v18.4s,v18.4s,v19.4s ror w11,w11,#20 add v22.4s,v22.4s,v23.4s ror w12,w12,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w9 eor v25.16b,v5.16b,v6.16b add w6,w6,w10 eor v26.16b,v9.16b,v10.16b add w7,w7,w11 eor v27.16b,v13.16b,v14.16b add w8,w8,w12 eor v28.16b,v17.16b,v18.16b eor w17,w17,w5 eor v29.16b,v21.16b,v22.16b eor w19,w19,w6 ushr v1.4s,v24.4s,#20 eor w20,w20,w7 ushr v5.4s,v25.4s,#20 eor w21,w21,w8 ushr v9.4s,v26.4s,#20 ror w17,w17,#24 ushr v13.4s,v27.4s,#20 ror w19,w19,#24 ushr v17.4s,v28.4s,#20 ror w20,w20,#24 ushr v21.4s,v29.4s,#20 ror w21,w21,#24 sli v1.4s,v24.4s,#12 add w13,w13,w17 sli v5.4s,v25.4s,#12 add w14,w14,w19 sli v9.4s,v26.4s,#12 add w15,w15,w20 sli v13.4s,v27.4s,#12 add w16,w16,w21 sli v17.4s,v28.4s,#12 eor w9,w9,w13 sli v21.4s,v29.4s,#12 eor w10,w10,w14 add v0.4s,v0.4s,v1.4s eor w11,w11,w15 add v4.4s,v4.4s,v5.4s eor w12,w12,w16 add v8.4s,v8.4s,v9.4s ror w9,w9,#25 add v12.4s,v12.4s,v13.4s ror w10,w10,#25 add v16.4s,v16.4s,v17.4s ror w11,w11,#25 add v20.4s,v20.4s,v21.4s ror w12,w12,#25 eor v24.16b,v3.16b,v0.16b add w5,w5,w10 eor v25.16b,v7.16b,v4.16b add w6,w6,w11 eor v26.16b,v11.16b,v8.16b add w7,w7,w12 eor v27.16b,v15.16b,v12.16b add w8,w8,w9 eor v28.16b,v19.16b,v16.16b eor w21,w21,w5 eor v29.16b,v23.16b,v20.16b eor w17,w17,w6 ushr v3.4s,v24.4s,#24 eor w19,w19,w7 ushr v7.4s,v25.4s,#24 eor w20,w20,w8 ushr v11.4s,v26.4s,#24 ror w21,w21,#16 ushr v15.4s,v27.4s,#24 ror w17,w17,#16 ushr v19.4s,v28.4s,#24 ror w19,w19,#16 ushr v23.4s,v29.4s,#24 ror w20,w20,#16 sli v3.4s,v24.4s,#8 add w15,w15,w21 sli v7.4s,v25.4s,#8 add w16,w16,w17 sli v11.4s,v26.4s,#8 add w13,w13,w19 sli v15.4s,v27.4s,#8 add w14,w14,w20 sli v19.4s,v28.4s,#8 eor w10,w10,w15 sli v23.4s,v29.4s,#8 eor w11,w11,w16 add v2.4s,v2.4s,v3.4s eor w12,w12,w13 add v6.4s,v6.4s,v7.4s eor w9,w9,w14 add v10.4s,v10.4s,v11.4s ror w10,w10,#20 add v14.4s,v14.4s,v15.4s ror w11,w11,#20 add v18.4s,v18.4s,v19.4s ror w12,w12,#20 add v22.4s,v22.4s,v23.4s ror w9,w9,#20 eor v24.16b,v1.16b,v2.16b add w5,w5,w10 eor v25.16b,v5.16b,v6.16b add w6,w6,w11 eor v26.16b,v9.16b,v10.16b add w7,w7,w12 eor v27.16b,v13.16b,v14.16b add w8,w8,w9 eor v28.16b,v17.16b,v18.16b eor w21,w21,w5 eor v29.16b,v21.16b,v22.16b eor w17,w17,w6 ushr v1.4s,v24.4s,#25 eor w19,w19,w7 ushr v5.4s,v25.4s,#25 eor w20,w20,w8 ushr v9.4s,v26.4s,#25 ror w21,w21,#24 ushr v13.4s,v27.4s,#25 ror w17,w17,#24 ushr v17.4s,v28.4s,#25 ror w19,w19,#24 ushr v21.4s,v29.4s,#25 ror w20,w20,#24 sli v1.4s,v24.4s,#7 add w15,w15,w21 sli v5.4s,v25.4s,#7 add w16,w16,w17 sli v9.4s,v26.4s,#7 add w13,w13,w19 sli v13.4s,v27.4s,#7 add w14,w14,w20 sli v17.4s,v28.4s,#7 eor w10,w10,w15 sli v21.4s,v29.4s,#7 eor w11,w11,w16 ext v2.16b,v2.16b,v2.16b,#8 eor w12,w12,w13 ext v6.16b,v6.16b,v6.16b,#8 eor w9,w9,w14 ext v10.16b,v10.16b,v10.16b,#8 ror w10,w10,#25 ext v14.16b,v14.16b,v14.16b,#8 ror w11,w11,#25 ext v18.16b,v18.16b,v18.16b,#8 ror w12,w12,#25 ext v22.16b,v22.16b,v22.16b,#8 ror w9,w9,#25 ext v3.16b,v3.16b,v3.16b,#4 ext v7.16b,v7.16b,v7.16b,#4 ext v11.16b,v11.16b,v11.16b,#4 ext v15.16b,v15.16b,v15.16b,#4 ext v19.16b,v19.16b,v19.16b,#4 ext v23.16b,v23.16b,v23.16b,#4 ext v1.16b,v1.16b,v1.16b,#12 ext v5.16b,v5.16b,v5.16b,#12 ext v9.16b,v9.16b,v9.16b,#12 ext v13.16b,v13.16b,v13.16b,#12 ext v17.16b,v17.16b,v17.16b,#12 ext v21.16b,v21.16b,v21.16b,#12 cbnz x4,.Loop_lower_neon add w5,w5,w22 // accumulate key block ldp q24,q25,[sp,#0] add x6,x6,x22,lsr#32 ldp q26,q27,[sp,#32] add w7,w7,w23 ldp q28,q29,[sp,#64] add x8,x8,x23,lsr#32 add v0.4s,v0.4s,v24.4s add w9,w9,w24 add v4.4s,v4.4s,v24.4s add x10,x10,x24,lsr#32 add v8.4s,v8.4s,v24.4s add w11,w11,w25 add v12.4s,v12.4s,v24.4s add x12,x12,x25,lsr#32 add v16.4s,v16.4s,v24.4s add w13,w13,w26 add v20.4s,v20.4s,v24.4s add x14,x14,x26,lsr#32 add v2.4s,v2.4s,v26.4s add w15,w15,w27 add v6.4s,v6.4s,v26.4s add x16,x16,x27,lsr#32 add v10.4s,v10.4s,v26.4s add w17,w17,w28 add v14.4s,v14.4s,v26.4s add x19,x19,x28,lsr#32 add v18.4s,v18.4s,v26.4s add w20,w20,w30 add v22.4s,v22.4s,v26.4s add x21,x21,x30,lsr#32 add v19.4s,v19.4s,v31.4s // +4 add x5,x5,x6,lsl#32 // pack add v23.4s,v23.4s,v31.4s // +4 add x7,x7,x8,lsl#32 add v3.4s,v3.4s,v27.4s ldp x6,x8,[x1,#0] // load input add v7.4s,v7.4s,v28.4s add x9,x9,x10,lsl#32 add v11.4s,v11.4s,v29.4s add x11,x11,x12,lsl#32 add v15.4s,v15.4s,v30.4s ldp x10,x12,[x1,#16] add v19.4s,v19.4s,v27.4s add x13,x13,x14,lsl#32 add v23.4s,v23.4s,v28.4s add x15,x15,x16,lsl#32 add v1.4s,v1.4s,v25.4s ldp x14,x16,[x1,#32] add v5.4s,v5.4s,v25.4s add x17,x17,x19,lsl#32 add v9.4s,v9.4s,v25.4s add x20,x20,x21,lsl#32 add v13.4s,v13.4s,v25.4s ldp x19,x21,[x1,#48] add v17.4s,v17.4s,v25.4s add x1,x1,#64 add v21.4s,v21.4s,v25.4s #ifdef __ARMEB__ rev x5,x5 rev x7,x7 rev x9,x9 rev x11,x11 rev x13,x13 rev x15,x15 rev x17,x17 rev x20,x20 #endif ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 eor x5,x5,x6 eor x7,x7,x8 eor x9,x9,x10 eor x11,x11,x12 eor x13,x13,x14 eor v0.16b,v0.16b,v24.16b eor x15,x15,x16 eor v1.16b,v1.16b,v25.16b eor x17,x17,x19 eor v2.16b,v2.16b,v26.16b eor x20,x20,x21 eor v3.16b,v3.16b,v27.16b ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 stp x5,x7,[x0,#0] // store output add x28,x28,#7 // increment counter stp x9,x11,[x0,#16] stp x13,x15,[x0,#32] stp x17,x20,[x0,#48] add x0,x0,#64 st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 eor v4.16b,v4.16b,v24.16b eor v5.16b,v5.16b,v25.16b eor v6.16b,v6.16b,v26.16b eor v7.16b,v7.16b,v27.16b st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 eor v8.16b,v8.16b,v0.16b ldp q24,q25,[sp,#0] eor v9.16b,v9.16b,v1.16b ldp q26,q27,[sp,#32] eor v10.16b,v10.16b,v2.16b eor v11.16b,v11.16b,v3.16b st1 {v8.16b,v9.16b,v10.16b,v11.16b},[x0],#64 ld1 {v8.16b,v9.16b,v10.16b,v11.16b},[x1],#64 eor v12.16b,v12.16b,v4.16b eor v13.16b,v13.16b,v5.16b eor v14.16b,v14.16b,v6.16b eor v15.16b,v15.16b,v7.16b st1 {v12.16b,v13.16b,v14.16b,v15.16b},[x0],#64 ld1 {v12.16b,v13.16b,v14.16b,v15.16b},[x1],#64 eor v16.16b,v16.16b,v8.16b eor v17.16b,v17.16b,v9.16b eor v18.16b,v18.16b,v10.16b eor v19.16b,v19.16b,v11.16b st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 shl v0.4s,v31.4s,#1 // 4 -> 8 eor v20.16b,v20.16b,v12.16b eor v21.16b,v21.16b,v13.16b eor v22.16b,v22.16b,v14.16b eor v23.16b,v23.16b,v15.16b st1 {v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64 add v27.4s,v27.4s,v0.4s // += 8 add v28.4s,v28.4s,v0.4s add v29.4s,v29.4s,v0.4s add v30.4s,v30.4s,v0.4s b.hs .Loop_outer_512_neon adds x2,x2,#512 ushr v0.4s,v31.4s,#2 // 4 -> 1 ldp d8,d9,[sp,#128+0] // meet ABI requirements ldp d10,d11,[sp,#128+16] ldp d12,d13,[sp,#128+32] ldp d14,d15,[sp,#128+48] stp q24,q31,[sp,#0] // wipe off-load area stp q24,q31,[sp,#32] stp q24,q31,[sp,#64] b.eq .Ldone_512_neon cmp x2,#192 sub v27.4s,v27.4s,v0.4s // -= 1 sub v28.4s,v28.4s,v0.4s sub v29.4s,v29.4s,v0.4s add sp,sp,#128 b.hs .Loop_outer_neon eor v25.16b,v25.16b,v25.16b eor v26.16b,v26.16b,v26.16b eor v27.16b,v27.16b,v27.16b eor v28.16b,v28.16b,v28.16b eor v29.16b,v29.16b,v29.16b eor v30.16b,v30.16b,v30.16b b .Loop_outer .Ldone_512_neon: ldp x19,x20,[x29,#16] add sp,sp,#128+64 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#96 ret .size ChaCha20_512_neon,.-ChaCha20_512_neon #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/chacha-x86-elf.S000064400000000000000000000455551353224261000161370ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl GFp_ChaCha20_ctr32 .hidden GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,@function .align 16 GFp_ChaCha20_ctr32: .L_GFp_ChaCha20_ctr32_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi xorl %eax,%eax cmpl 28(%esp),%eax je .L000no_data call .Lpic_point .Lpic_point: popl %eax leal GFp_ia32cap_P-.Lpic_point(%eax),%ebp testl $16777216,(%ebp) jz .L001x86 testl $512,4(%ebp) jz .L001x86 jmp .Lssse3_shortcut .L001x86: movl 32(%esp),%esi movl 36(%esp),%edi subl $132,%esp movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,80(%esp) movl %ebx,84(%esp) movl %ecx,88(%esp) movl %edx,92(%esp) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,96(%esp) movl %ebx,100(%esp) movl %ecx,104(%esp) movl %edx,108(%esp) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%edx subl $1,%eax movl %eax,112(%esp) movl %ebx,116(%esp) movl %ecx,120(%esp) movl %edx,124(%esp) jmp .L002entry .align 16 .L003outer_loop: movl %ebx,156(%esp) movl %eax,152(%esp) movl %ecx,160(%esp) .L002entry: movl $1634760805,%eax movl $857760878,4(%esp) movl $2036477234,8(%esp) movl $1797285236,12(%esp) movl 84(%esp),%ebx movl 88(%esp),%ebp movl 104(%esp),%ecx movl 108(%esp),%esi movl 116(%esp),%edx movl 120(%esp),%edi movl %ebx,20(%esp) movl %ebp,24(%esp) movl %ecx,40(%esp) movl %esi,44(%esp) movl %edx,52(%esp) movl %edi,56(%esp) movl 92(%esp),%ebx movl 124(%esp),%edi movl 112(%esp),%edx movl 80(%esp),%ebp movl 96(%esp),%ecx movl 100(%esp),%esi addl $1,%edx movl %ebx,28(%esp) movl %edi,60(%esp) movl %edx,112(%esp) movl $10,%ebx jmp .L004loop .align 16 .L004loop: addl %ebp,%eax movl %ebx,128(%esp) movl %ebp,%ebx xorl %eax,%edx roll $16,%edx addl %edx,%ecx xorl %ecx,%ebx movl 52(%esp),%edi roll $12,%ebx movl 20(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,(%esp) roll $8,%edx movl 4(%esp),%eax addl %edx,%ecx movl %edx,48(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi movl %ecx,32(%esp) roll $16,%edi movl %ebx,16(%esp) addl %edi,%esi movl 40(%esp),%ecx xorl %esi,%ebp movl 56(%esp),%edx roll $12,%ebp movl 24(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,4(%esp) roll $8,%edi movl 8(%esp),%eax addl %edi,%esi movl %edi,52(%esp) xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx movl %esi,36(%esp) roll $16,%edx movl %ebp,20(%esp) addl %edx,%ecx movl 44(%esp),%esi xorl %ecx,%ebx movl 60(%esp),%edi roll $12,%ebx movl 28(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,8(%esp) roll $8,%edx movl 12(%esp),%eax addl %edx,%ecx movl %edx,56(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi roll $16,%edi movl %ebx,24(%esp) addl %edi,%esi xorl %esi,%ebp roll $12,%ebp movl 20(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,12(%esp) roll $8,%edi movl (%esp),%eax addl %edi,%esi movl %edi,%edx xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx roll $16,%edx movl %ebp,28(%esp) addl %edx,%ecx xorl %ecx,%ebx movl 48(%esp),%edi roll $12,%ebx movl 24(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,(%esp) roll $8,%edx movl 4(%esp),%eax addl %edx,%ecx movl %edx,60(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi movl %ecx,40(%esp) roll $16,%edi movl %ebx,20(%esp) addl %edi,%esi movl 32(%esp),%ecx xorl %esi,%ebp movl 52(%esp),%edx roll $12,%ebp movl 28(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,4(%esp) roll $8,%edi movl 8(%esp),%eax addl %edi,%esi movl %edi,48(%esp) xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx movl %esi,44(%esp) roll $16,%edx movl %ebp,24(%esp) addl %edx,%ecx movl 36(%esp),%esi xorl %ecx,%ebx movl 56(%esp),%edi roll $12,%ebx movl 16(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,8(%esp) roll $8,%edx movl 12(%esp),%eax addl %edx,%ecx movl %edx,52(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi roll $16,%edi movl %ebx,28(%esp) addl %edi,%esi xorl %esi,%ebp movl 48(%esp),%edx roll $12,%ebp movl 128(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,12(%esp) roll $8,%edi movl (%esp),%eax addl %edi,%esi movl %edi,56(%esp) xorl %esi,%ebp roll $7,%ebp decl %ebx jnz .L004loop movl 160(%esp),%ebx addl $1634760805,%eax addl 80(%esp),%ebp addl 96(%esp),%ecx addl 100(%esp),%esi cmpl $64,%ebx jb .L005tail movl 156(%esp),%ebx addl 112(%esp),%edx addl 120(%esp),%edi xorl (%ebx),%eax xorl 16(%ebx),%ebp movl %eax,(%esp) movl 152(%esp),%eax xorl 32(%ebx),%ecx xorl 36(%ebx),%esi xorl 48(%ebx),%edx xorl 56(%ebx),%edi movl %ebp,16(%eax) movl %ecx,32(%eax) movl %esi,36(%eax) movl %edx,48(%eax) movl %edi,56(%eax) movl 4(%esp),%ebp movl 8(%esp),%ecx movl 12(%esp),%esi movl 20(%esp),%edx movl 24(%esp),%edi addl $857760878,%ebp addl $2036477234,%ecx addl $1797285236,%esi addl 84(%esp),%edx addl 88(%esp),%edi xorl 4(%ebx),%ebp xorl 8(%ebx),%ecx xorl 12(%ebx),%esi xorl 20(%ebx),%edx xorl 24(%ebx),%edi movl %ebp,4(%eax) movl %ecx,8(%eax) movl %esi,12(%eax) movl %edx,20(%eax) movl %edi,24(%eax) movl 28(%esp),%ebp movl 40(%esp),%ecx movl 44(%esp),%esi movl 52(%esp),%edx movl 60(%esp),%edi addl 92(%esp),%ebp addl 104(%esp),%ecx addl 108(%esp),%esi addl 116(%esp),%edx addl 124(%esp),%edi xorl 28(%ebx),%ebp xorl 40(%ebx),%ecx xorl 44(%ebx),%esi xorl 52(%ebx),%edx xorl 60(%ebx),%edi leal 64(%ebx),%ebx movl %ebp,28(%eax) movl (%esp),%ebp movl %ecx,40(%eax) movl 160(%esp),%ecx movl %esi,44(%eax) movl %edx,52(%eax) movl %edi,60(%eax) movl %ebp,(%eax) leal 64(%eax),%eax subl $64,%ecx jnz .L003outer_loop jmp .L006done .L005tail: addl 112(%esp),%edx addl 120(%esp),%edi movl %eax,(%esp) movl %ebp,16(%esp) movl %ecx,32(%esp) movl %esi,36(%esp) movl %edx,48(%esp) movl %edi,56(%esp) movl 4(%esp),%ebp movl 8(%esp),%ecx movl 12(%esp),%esi movl 20(%esp),%edx movl 24(%esp),%edi addl $857760878,%ebp addl $2036477234,%ecx addl $1797285236,%esi addl 84(%esp),%edx addl 88(%esp),%edi movl %ebp,4(%esp) movl %ecx,8(%esp) movl %esi,12(%esp) movl %edx,20(%esp) movl %edi,24(%esp) movl 28(%esp),%ebp movl 40(%esp),%ecx movl 44(%esp),%esi movl 52(%esp),%edx movl 60(%esp),%edi addl 92(%esp),%ebp addl 104(%esp),%ecx addl 108(%esp),%esi addl 116(%esp),%edx addl 124(%esp),%edi movl %ebp,28(%esp) movl 156(%esp),%ebp movl %ecx,40(%esp) movl 152(%esp),%ecx movl %esi,44(%esp) xorl %esi,%esi movl %edx,52(%esp) movl %edi,60(%esp) xorl %eax,%eax xorl %edx,%edx .L007tail_loop: movb (%esi,%ebp,1),%al movb (%esp,%esi,1),%dl leal 1(%esi),%esi xorb %dl,%al movb %al,-1(%ecx,%esi,1) decl %ebx jnz .L007tail_loop .L006done: addl $132,%esp .L000no_data: popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_ChaCha20_ctr32,.-.L_GFp_ChaCha20_ctr32_begin .hidden _ChaCha20_ssse3 .type _ChaCha20_ssse3,@function .align 16 _ChaCha20_ssse3: pushl %ebp pushl %ebx pushl %esi pushl %edi .Lssse3_shortcut: movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx movl 32(%esp),%edx movl 36(%esp),%ebx movl %esp,%ebp subl $524,%esp andl $-64,%esp movl %ebp,512(%esp) leal .Lssse3_data-.Lpic_point(%eax),%eax movdqu (%ebx),%xmm3 cmpl $256,%ecx jb .L0081x movl %edx,516(%esp) movl %ebx,520(%esp) subl $256,%ecx leal 384(%esp),%ebp movdqu (%edx),%xmm7 pshufd $0,%xmm3,%xmm0 pshufd $85,%xmm3,%xmm1 pshufd $170,%xmm3,%xmm2 pshufd $255,%xmm3,%xmm3 paddd 48(%eax),%xmm0 pshufd $0,%xmm7,%xmm4 pshufd $85,%xmm7,%xmm5 psubd 64(%eax),%xmm0 pshufd $170,%xmm7,%xmm6 pshufd $255,%xmm7,%xmm7 movdqa %xmm0,64(%ebp) movdqa %xmm1,80(%ebp) movdqa %xmm2,96(%ebp) movdqa %xmm3,112(%ebp) movdqu 16(%edx),%xmm3 movdqa %xmm4,-64(%ebp) movdqa %xmm5,-48(%ebp) movdqa %xmm6,-32(%ebp) movdqa %xmm7,-16(%ebp) movdqa 32(%eax),%xmm7 leal 128(%esp),%ebx pshufd $0,%xmm3,%xmm0 pshufd $85,%xmm3,%xmm1 pshufd $170,%xmm3,%xmm2 pshufd $255,%xmm3,%xmm3 pshufd $0,%xmm7,%xmm4 pshufd $85,%xmm7,%xmm5 pshufd $170,%xmm7,%xmm6 pshufd $255,%xmm7,%xmm7 movdqa %xmm0,(%ebp) movdqa %xmm1,16(%ebp) movdqa %xmm2,32(%ebp) movdqa %xmm3,48(%ebp) movdqa %xmm4,-128(%ebp) movdqa %xmm5,-112(%ebp) movdqa %xmm6,-96(%ebp) movdqa %xmm7,-80(%ebp) leal 128(%esi),%esi leal 128(%edi),%edi jmp .L009outer_loop .align 16 .L009outer_loop: movdqa -112(%ebp),%xmm1 movdqa -96(%ebp),%xmm2 movdqa -80(%ebp),%xmm3 movdqa -48(%ebp),%xmm5 movdqa -32(%ebp),%xmm6 movdqa -16(%ebp),%xmm7 movdqa %xmm1,-112(%ebx) movdqa %xmm2,-96(%ebx) movdqa %xmm3,-80(%ebx) movdqa %xmm5,-48(%ebx) movdqa %xmm6,-32(%ebx) movdqa %xmm7,-16(%ebx) movdqa 32(%ebp),%xmm2 movdqa 48(%ebp),%xmm3 movdqa 64(%ebp),%xmm4 movdqa 80(%ebp),%xmm5 movdqa 96(%ebp),%xmm6 movdqa 112(%ebp),%xmm7 paddd 64(%eax),%xmm4 movdqa %xmm2,32(%ebx) movdqa %xmm3,48(%ebx) movdqa %xmm4,64(%ebx) movdqa %xmm5,80(%ebx) movdqa %xmm6,96(%ebx) movdqa %xmm7,112(%ebx) movdqa %xmm4,64(%ebp) movdqa -128(%ebp),%xmm0 movdqa %xmm4,%xmm6 movdqa -64(%ebp),%xmm3 movdqa (%ebp),%xmm4 movdqa 16(%ebp),%xmm5 movl $10,%edx nop .align 16 .L010loop: paddd %xmm3,%xmm0 movdqa %xmm3,%xmm2 pxor %xmm0,%xmm6 pshufb (%eax),%xmm6 paddd %xmm6,%xmm4 pxor %xmm4,%xmm2 movdqa -48(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -112(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 80(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-128(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,64(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 movdqa %xmm4,(%ebx) pshufb (%eax),%xmm7 movdqa %xmm2,-64(%ebx) paddd %xmm7,%xmm5 movdqa 32(%ebx),%xmm4 pxor %xmm5,%xmm3 movdqa -32(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -96(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 96(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-112(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,80(%ebx) pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 movdqa %xmm5,16(%ebx) pshufb (%eax),%xmm6 movdqa %xmm3,-48(%ebx) paddd %xmm6,%xmm4 movdqa 48(%ebx),%xmm5 pxor %xmm4,%xmm2 movdqa -16(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -80(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 112(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-96(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,96(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 pshufb (%eax),%xmm7 movdqa %xmm2,-32(%ebx) paddd %xmm7,%xmm5 pxor %xmm5,%xmm3 movdqa -48(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -128(%ebx),%xmm0 paddd %xmm3,%xmm1 pxor %xmm1,%xmm7 movdqa %xmm1,-80(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,%xmm6 pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 pshufb (%eax),%xmm6 movdqa %xmm3,-16(%ebx) paddd %xmm6,%xmm4 pxor %xmm4,%xmm2 movdqa -32(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -112(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 64(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-128(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,112(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 movdqa %xmm4,32(%ebx) pshufb (%eax),%xmm7 movdqa %xmm2,-48(%ebx) paddd %xmm7,%xmm5 movdqa (%ebx),%xmm4 pxor %xmm5,%xmm3 movdqa -16(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -96(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 80(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-112(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,64(%ebx) pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 movdqa %xmm5,48(%ebx) pshufb (%eax),%xmm6 movdqa %xmm3,-32(%ebx) paddd %xmm6,%xmm4 movdqa 16(%ebx),%xmm5 pxor %xmm4,%xmm2 movdqa -64(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -80(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 96(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-96(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,80(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 pshufb (%eax),%xmm7 movdqa %xmm2,-16(%ebx) paddd %xmm7,%xmm5 pxor %xmm5,%xmm3 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -128(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 64(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-80(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,96(%ebx) pxor %xmm5,%xmm3 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 por %xmm1,%xmm3 decl %edx jnz .L010loop movdqa %xmm3,-64(%ebx) movdqa %xmm4,(%ebx) movdqa %xmm5,16(%ebx) movdqa %xmm6,64(%ebx) movdqa %xmm7,96(%ebx) movdqa -112(%ebx),%xmm1 movdqa -96(%ebx),%xmm2 movdqa -80(%ebx),%xmm3 paddd -128(%ebp),%xmm0 paddd -112(%ebp),%xmm1 paddd -96(%ebp),%xmm2 paddd -80(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa -64(%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa -48(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa -32(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa -16(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd -64(%ebp),%xmm0 paddd -48(%ebp),%xmm1 paddd -32(%ebp),%xmm2 paddd -16(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa (%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa 16(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa 32(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa 48(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd (%ebp),%xmm0 paddd 16(%ebp),%xmm1 paddd 32(%ebp),%xmm2 paddd 48(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa 64(%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa 80(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa 96(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa 112(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd 64(%ebp),%xmm0 paddd 80(%ebp),%xmm1 paddd 96(%ebp),%xmm2 paddd 112(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 208(%esi),%esi pxor %xmm0,%xmm4 pxor %xmm1,%xmm5 pxor %xmm2,%xmm6 pxor %xmm3,%xmm7 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 208(%edi),%edi subl $256,%ecx jnc .L009outer_loop addl $256,%ecx jz .L011done movl 520(%esp),%ebx leal -128(%esi),%esi movl 516(%esp),%edx leal -128(%edi),%edi movd 64(%ebp),%xmm2 movdqu (%ebx),%xmm3 paddd 96(%eax),%xmm2 pand 112(%eax),%xmm3 por %xmm2,%xmm3 .L0081x: movdqa 32(%eax),%xmm0 movdqu (%edx),%xmm1 movdqu 16(%edx),%xmm2 movdqa (%eax),%xmm6 movdqa 16(%eax),%xmm7 movl %ebp,48(%esp) movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movl $10,%edx jmp .L012loop1x .align 16 .L013outer1x: movdqa 80(%eax),%xmm3 movdqa (%esp),%xmm0 movdqa 16(%esp),%xmm1 movdqa 32(%esp),%xmm2 paddd 48(%esp),%xmm3 movl $10,%edx movdqa %xmm3,48(%esp) jmp .L012loop1x .align 16 .L012loop1x: paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $57,%xmm1,%xmm1 pshufd $147,%xmm3,%xmm3 nop paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $147,%xmm1,%xmm1 pshufd $57,%xmm3,%xmm3 decl %edx jnz .L012loop1x paddd (%esp),%xmm0 paddd 16(%esp),%xmm1 paddd 32(%esp),%xmm2 paddd 48(%esp),%xmm3 cmpl $64,%ecx jb .L014tail movdqu (%esi),%xmm4 movdqu 16(%esi),%xmm5 pxor %xmm4,%xmm0 movdqu 32(%esi),%xmm4 pxor %xmm5,%xmm1 movdqu 48(%esi),%xmm5 pxor %xmm4,%xmm2 pxor %xmm5,%xmm3 leal 64(%esi),%esi movdqu %xmm0,(%edi) movdqu %xmm1,16(%edi) movdqu %xmm2,32(%edi) movdqu %xmm3,48(%edi) leal 64(%edi),%edi subl $64,%ecx jnz .L013outer1x jmp .L011done .L014tail: movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) xorl %eax,%eax xorl %edx,%edx xorl %ebp,%ebp .L015tail_loop: movb (%esp,%ebp,1),%al movb (%esi,%ebp,1),%dl leal 1(%ebp),%ebp xorb %dl,%al movb %al,-1(%edi,%ebp,1) decl %ecx jnz .L015tail_loop .L011done: movl 512(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret .size _ChaCha20_ssse3,.-_ChaCha20_ssse3 .align 64 .Lssse3_data: .byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 .byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 .long 1634760805,857760878,2036477234,1797285236 .long 0,1,2,3 .long 4,4,4,4 .long 1,0,0,0 .long 4,0,0,0 .long 0,-1,-1,-1 .align 64 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 .byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 .byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 .byte 114,103,62,0 #endif ring-0.16.9/pregenerated/chacha-x86-macosx.S000064400000000000000000000455321353224261000166560ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl _GFp_ChaCha20_ctr32 .private_extern _GFp_ChaCha20_ctr32 .align 4 _GFp_ChaCha20_ctr32: L_GFp_ChaCha20_ctr32_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi xorl %eax,%eax cmpl 28(%esp),%eax je L000no_data call Lpic_point Lpic_point: popl %eax movl L_GFp_ia32cap_P$non_lazy_ptr-Lpic_point(%eax),%ebp testl $16777216,(%ebp) jz L001x86 testl $512,4(%ebp) jz L001x86 jmp Lssse3_shortcut L001x86: movl 32(%esp),%esi movl 36(%esp),%edi subl $132,%esp movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,80(%esp) movl %ebx,84(%esp) movl %ecx,88(%esp) movl %edx,92(%esp) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,96(%esp) movl %ebx,100(%esp) movl %ecx,104(%esp) movl %edx,108(%esp) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%edx subl $1,%eax movl %eax,112(%esp) movl %ebx,116(%esp) movl %ecx,120(%esp) movl %edx,124(%esp) jmp L002entry .align 4,0x90 L003outer_loop: movl %ebx,156(%esp) movl %eax,152(%esp) movl %ecx,160(%esp) L002entry: movl $1634760805,%eax movl $857760878,4(%esp) movl $2036477234,8(%esp) movl $1797285236,12(%esp) movl 84(%esp),%ebx movl 88(%esp),%ebp movl 104(%esp),%ecx movl 108(%esp),%esi movl 116(%esp),%edx movl 120(%esp),%edi movl %ebx,20(%esp) movl %ebp,24(%esp) movl %ecx,40(%esp) movl %esi,44(%esp) movl %edx,52(%esp) movl %edi,56(%esp) movl 92(%esp),%ebx movl 124(%esp),%edi movl 112(%esp),%edx movl 80(%esp),%ebp movl 96(%esp),%ecx movl 100(%esp),%esi addl $1,%edx movl %ebx,28(%esp) movl %edi,60(%esp) movl %edx,112(%esp) movl $10,%ebx jmp L004loop .align 4,0x90 L004loop: addl %ebp,%eax movl %ebx,128(%esp) movl %ebp,%ebx xorl %eax,%edx roll $16,%edx addl %edx,%ecx xorl %ecx,%ebx movl 52(%esp),%edi roll $12,%ebx movl 20(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,(%esp) roll $8,%edx movl 4(%esp),%eax addl %edx,%ecx movl %edx,48(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi movl %ecx,32(%esp) roll $16,%edi movl %ebx,16(%esp) addl %edi,%esi movl 40(%esp),%ecx xorl %esi,%ebp movl 56(%esp),%edx roll $12,%ebp movl 24(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,4(%esp) roll $8,%edi movl 8(%esp),%eax addl %edi,%esi movl %edi,52(%esp) xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx movl %esi,36(%esp) roll $16,%edx movl %ebp,20(%esp) addl %edx,%ecx movl 44(%esp),%esi xorl %ecx,%ebx movl 60(%esp),%edi roll $12,%ebx movl 28(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,8(%esp) roll $8,%edx movl 12(%esp),%eax addl %edx,%ecx movl %edx,56(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi roll $16,%edi movl %ebx,24(%esp) addl %edi,%esi xorl %esi,%ebp roll $12,%ebp movl 20(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,12(%esp) roll $8,%edi movl (%esp),%eax addl %edi,%esi movl %edi,%edx xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx roll $16,%edx movl %ebp,28(%esp) addl %edx,%ecx xorl %ecx,%ebx movl 48(%esp),%edi roll $12,%ebx movl 24(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,(%esp) roll $8,%edx movl 4(%esp),%eax addl %edx,%ecx movl %edx,60(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi movl %ecx,40(%esp) roll $16,%edi movl %ebx,20(%esp) addl %edi,%esi movl 32(%esp),%ecx xorl %esi,%ebp movl 52(%esp),%edx roll $12,%ebp movl 28(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,4(%esp) roll $8,%edi movl 8(%esp),%eax addl %edi,%esi movl %edi,48(%esp) xorl %esi,%ebp addl %ebx,%eax roll $7,%ebp xorl %eax,%edx movl %esi,44(%esp) roll $16,%edx movl %ebp,24(%esp) addl %edx,%ecx movl 36(%esp),%esi xorl %ecx,%ebx movl 56(%esp),%edi roll $12,%ebx movl 16(%esp),%ebp addl %ebx,%eax xorl %eax,%edx movl %eax,8(%esp) roll $8,%edx movl 12(%esp),%eax addl %edx,%ecx movl %edx,52(%esp) xorl %ecx,%ebx addl %ebp,%eax roll $7,%ebx xorl %eax,%edi roll $16,%edi movl %ebx,28(%esp) addl %edi,%esi xorl %esi,%ebp movl 48(%esp),%edx roll $12,%ebp movl 128(%esp),%ebx addl %ebp,%eax xorl %eax,%edi movl %eax,12(%esp) roll $8,%edi movl (%esp),%eax addl %edi,%esi movl %edi,56(%esp) xorl %esi,%ebp roll $7,%ebp decl %ebx jnz L004loop movl 160(%esp),%ebx addl $1634760805,%eax addl 80(%esp),%ebp addl 96(%esp),%ecx addl 100(%esp),%esi cmpl $64,%ebx jb L005tail movl 156(%esp),%ebx addl 112(%esp),%edx addl 120(%esp),%edi xorl (%ebx),%eax xorl 16(%ebx),%ebp movl %eax,(%esp) movl 152(%esp),%eax xorl 32(%ebx),%ecx xorl 36(%ebx),%esi xorl 48(%ebx),%edx xorl 56(%ebx),%edi movl %ebp,16(%eax) movl %ecx,32(%eax) movl %esi,36(%eax) movl %edx,48(%eax) movl %edi,56(%eax) movl 4(%esp),%ebp movl 8(%esp),%ecx movl 12(%esp),%esi movl 20(%esp),%edx movl 24(%esp),%edi addl $857760878,%ebp addl $2036477234,%ecx addl $1797285236,%esi addl 84(%esp),%edx addl 88(%esp),%edi xorl 4(%ebx),%ebp xorl 8(%ebx),%ecx xorl 12(%ebx),%esi xorl 20(%ebx),%edx xorl 24(%ebx),%edi movl %ebp,4(%eax) movl %ecx,8(%eax) movl %esi,12(%eax) movl %edx,20(%eax) movl %edi,24(%eax) movl 28(%esp),%ebp movl 40(%esp),%ecx movl 44(%esp),%esi movl 52(%esp),%edx movl 60(%esp),%edi addl 92(%esp),%ebp addl 104(%esp),%ecx addl 108(%esp),%esi addl 116(%esp),%edx addl 124(%esp),%edi xorl 28(%ebx),%ebp xorl 40(%ebx),%ecx xorl 44(%ebx),%esi xorl 52(%ebx),%edx xorl 60(%ebx),%edi leal 64(%ebx),%ebx movl %ebp,28(%eax) movl (%esp),%ebp movl %ecx,40(%eax) movl 160(%esp),%ecx movl %esi,44(%eax) movl %edx,52(%eax) movl %edi,60(%eax) movl %ebp,(%eax) leal 64(%eax),%eax subl $64,%ecx jnz L003outer_loop jmp L006done L005tail: addl 112(%esp),%edx addl 120(%esp),%edi movl %eax,(%esp) movl %ebp,16(%esp) movl %ecx,32(%esp) movl %esi,36(%esp) movl %edx,48(%esp) movl %edi,56(%esp) movl 4(%esp),%ebp movl 8(%esp),%ecx movl 12(%esp),%esi movl 20(%esp),%edx movl 24(%esp),%edi addl $857760878,%ebp addl $2036477234,%ecx addl $1797285236,%esi addl 84(%esp),%edx addl 88(%esp),%edi movl %ebp,4(%esp) movl %ecx,8(%esp) movl %esi,12(%esp) movl %edx,20(%esp) movl %edi,24(%esp) movl 28(%esp),%ebp movl 40(%esp),%ecx movl 44(%esp),%esi movl 52(%esp),%edx movl 60(%esp),%edi addl 92(%esp),%ebp addl 104(%esp),%ecx addl 108(%esp),%esi addl 116(%esp),%edx addl 124(%esp),%edi movl %ebp,28(%esp) movl 156(%esp),%ebp movl %ecx,40(%esp) movl 152(%esp),%ecx movl %esi,44(%esp) xorl %esi,%esi movl %edx,52(%esp) movl %edi,60(%esp) xorl %eax,%eax xorl %edx,%edx L007tail_loop: movb (%esi,%ebp,1),%al movb (%esp,%esi,1),%dl leal 1(%esi),%esi xorb %dl,%al movb %al,-1(%ecx,%esi,1) decl %ebx jnz L007tail_loop L006done: addl $132,%esp L000no_data: popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __ChaCha20_ssse3 .align 4 __ChaCha20_ssse3: pushl %ebp pushl %ebx pushl %esi pushl %edi Lssse3_shortcut: movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx movl 32(%esp),%edx movl 36(%esp),%ebx movl %esp,%ebp subl $524,%esp andl $-64,%esp movl %ebp,512(%esp) leal Lssse3_data-Lpic_point(%eax),%eax movdqu (%ebx),%xmm3 cmpl $256,%ecx jb L0081x movl %edx,516(%esp) movl %ebx,520(%esp) subl $256,%ecx leal 384(%esp),%ebp movdqu (%edx),%xmm7 pshufd $0,%xmm3,%xmm0 pshufd $85,%xmm3,%xmm1 pshufd $170,%xmm3,%xmm2 pshufd $255,%xmm3,%xmm3 paddd 48(%eax),%xmm0 pshufd $0,%xmm7,%xmm4 pshufd $85,%xmm7,%xmm5 psubd 64(%eax),%xmm0 pshufd $170,%xmm7,%xmm6 pshufd $255,%xmm7,%xmm7 movdqa %xmm0,64(%ebp) movdqa %xmm1,80(%ebp) movdqa %xmm2,96(%ebp) movdqa %xmm3,112(%ebp) movdqu 16(%edx),%xmm3 movdqa %xmm4,-64(%ebp) movdqa %xmm5,-48(%ebp) movdqa %xmm6,-32(%ebp) movdqa %xmm7,-16(%ebp) movdqa 32(%eax),%xmm7 leal 128(%esp),%ebx pshufd $0,%xmm3,%xmm0 pshufd $85,%xmm3,%xmm1 pshufd $170,%xmm3,%xmm2 pshufd $255,%xmm3,%xmm3 pshufd $0,%xmm7,%xmm4 pshufd $85,%xmm7,%xmm5 pshufd $170,%xmm7,%xmm6 pshufd $255,%xmm7,%xmm7 movdqa %xmm0,(%ebp) movdqa %xmm1,16(%ebp) movdqa %xmm2,32(%ebp) movdqa %xmm3,48(%ebp) movdqa %xmm4,-128(%ebp) movdqa %xmm5,-112(%ebp) movdqa %xmm6,-96(%ebp) movdqa %xmm7,-80(%ebp) leal 128(%esi),%esi leal 128(%edi),%edi jmp L009outer_loop .align 4,0x90 L009outer_loop: movdqa -112(%ebp),%xmm1 movdqa -96(%ebp),%xmm2 movdqa -80(%ebp),%xmm3 movdqa -48(%ebp),%xmm5 movdqa -32(%ebp),%xmm6 movdqa -16(%ebp),%xmm7 movdqa %xmm1,-112(%ebx) movdqa %xmm2,-96(%ebx) movdqa %xmm3,-80(%ebx) movdqa %xmm5,-48(%ebx) movdqa %xmm6,-32(%ebx) movdqa %xmm7,-16(%ebx) movdqa 32(%ebp),%xmm2 movdqa 48(%ebp),%xmm3 movdqa 64(%ebp),%xmm4 movdqa 80(%ebp),%xmm5 movdqa 96(%ebp),%xmm6 movdqa 112(%ebp),%xmm7 paddd 64(%eax),%xmm4 movdqa %xmm2,32(%ebx) movdqa %xmm3,48(%ebx) movdqa %xmm4,64(%ebx) movdqa %xmm5,80(%ebx) movdqa %xmm6,96(%ebx) movdqa %xmm7,112(%ebx) movdqa %xmm4,64(%ebp) movdqa -128(%ebp),%xmm0 movdqa %xmm4,%xmm6 movdqa -64(%ebp),%xmm3 movdqa (%ebp),%xmm4 movdqa 16(%ebp),%xmm5 movl $10,%edx nop .align 4,0x90 L010loop: paddd %xmm3,%xmm0 movdqa %xmm3,%xmm2 pxor %xmm0,%xmm6 pshufb (%eax),%xmm6 paddd %xmm6,%xmm4 pxor %xmm4,%xmm2 movdqa -48(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -112(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 80(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-128(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,64(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 movdqa %xmm4,(%ebx) pshufb (%eax),%xmm7 movdqa %xmm2,-64(%ebx) paddd %xmm7,%xmm5 movdqa 32(%ebx),%xmm4 pxor %xmm5,%xmm3 movdqa -32(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -96(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 96(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-112(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,80(%ebx) pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 movdqa %xmm5,16(%ebx) pshufb (%eax),%xmm6 movdqa %xmm3,-48(%ebx) paddd %xmm6,%xmm4 movdqa 48(%ebx),%xmm5 pxor %xmm4,%xmm2 movdqa -16(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -80(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 112(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-96(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,96(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 pshufb (%eax),%xmm7 movdqa %xmm2,-32(%ebx) paddd %xmm7,%xmm5 pxor %xmm5,%xmm3 movdqa -48(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -128(%ebx),%xmm0 paddd %xmm3,%xmm1 pxor %xmm1,%xmm7 movdqa %xmm1,-80(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,%xmm6 pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 pshufb (%eax),%xmm6 movdqa %xmm3,-16(%ebx) paddd %xmm6,%xmm4 pxor %xmm4,%xmm2 movdqa -32(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -112(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 64(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-128(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,112(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 movdqa %xmm4,32(%ebx) pshufb (%eax),%xmm7 movdqa %xmm2,-48(%ebx) paddd %xmm7,%xmm5 movdqa (%ebx),%xmm4 pxor %xmm5,%xmm3 movdqa -16(%ebx),%xmm2 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -96(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 80(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-112(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,64(%ebx) pxor %xmm5,%xmm3 paddd %xmm2,%xmm0 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 pxor %xmm0,%xmm6 por %xmm1,%xmm3 movdqa %xmm5,48(%ebx) pshufb (%eax),%xmm6 movdqa %xmm3,-32(%ebx) paddd %xmm6,%xmm4 movdqa 16(%ebx),%xmm5 pxor %xmm4,%xmm2 movdqa -64(%ebx),%xmm3 movdqa %xmm2,%xmm1 pslld $12,%xmm2 psrld $20,%xmm1 por %xmm1,%xmm2 movdqa -80(%ebx),%xmm1 paddd %xmm2,%xmm0 movdqa 96(%ebx),%xmm7 pxor %xmm0,%xmm6 movdqa %xmm0,-96(%ebx) pshufb 16(%eax),%xmm6 paddd %xmm6,%xmm4 movdqa %xmm6,80(%ebx) pxor %xmm4,%xmm2 paddd %xmm3,%xmm1 movdqa %xmm2,%xmm0 pslld $7,%xmm2 psrld $25,%xmm0 pxor %xmm1,%xmm7 por %xmm0,%xmm2 pshufb (%eax),%xmm7 movdqa %xmm2,-16(%ebx) paddd %xmm7,%xmm5 pxor %xmm5,%xmm3 movdqa %xmm3,%xmm0 pslld $12,%xmm3 psrld $20,%xmm0 por %xmm0,%xmm3 movdqa -128(%ebx),%xmm0 paddd %xmm3,%xmm1 movdqa 64(%ebx),%xmm6 pxor %xmm1,%xmm7 movdqa %xmm1,-80(%ebx) pshufb 16(%eax),%xmm7 paddd %xmm7,%xmm5 movdqa %xmm7,96(%ebx) pxor %xmm5,%xmm3 movdqa %xmm3,%xmm1 pslld $7,%xmm3 psrld $25,%xmm1 por %xmm1,%xmm3 decl %edx jnz L010loop movdqa %xmm3,-64(%ebx) movdqa %xmm4,(%ebx) movdqa %xmm5,16(%ebx) movdqa %xmm6,64(%ebx) movdqa %xmm7,96(%ebx) movdqa -112(%ebx),%xmm1 movdqa -96(%ebx),%xmm2 movdqa -80(%ebx),%xmm3 paddd -128(%ebp),%xmm0 paddd -112(%ebp),%xmm1 paddd -96(%ebp),%xmm2 paddd -80(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa -64(%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa -48(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa -32(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa -16(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd -64(%ebp),%xmm0 paddd -48(%ebp),%xmm1 paddd -32(%ebp),%xmm2 paddd -16(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa (%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa 16(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa 32(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa 48(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd (%ebp),%xmm0 paddd 16(%ebp),%xmm1 paddd 32(%ebp),%xmm2 paddd 48(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 16(%esi),%esi pxor %xmm0,%xmm4 movdqa 64(%ebx),%xmm0 pxor %xmm1,%xmm5 movdqa 80(%ebx),%xmm1 pxor %xmm2,%xmm6 movdqa 96(%ebx),%xmm2 pxor %xmm3,%xmm7 movdqa 112(%ebx),%xmm3 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 16(%edi),%edi paddd 64(%ebp),%xmm0 paddd 80(%ebp),%xmm1 paddd 96(%ebp),%xmm2 paddd 112(%ebp),%xmm3 movdqa %xmm0,%xmm6 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm6 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm6,%xmm3 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 movdqu -128(%esi),%xmm4 movdqu -64(%esi),%xmm5 movdqu (%esi),%xmm2 movdqu 64(%esi),%xmm7 leal 208(%esi),%esi pxor %xmm0,%xmm4 pxor %xmm1,%xmm5 pxor %xmm2,%xmm6 pxor %xmm3,%xmm7 movdqu %xmm4,-128(%edi) movdqu %xmm5,-64(%edi) movdqu %xmm6,(%edi) movdqu %xmm7,64(%edi) leal 208(%edi),%edi subl $256,%ecx jnc L009outer_loop addl $256,%ecx jz L011done movl 520(%esp),%ebx leal -128(%esi),%esi movl 516(%esp),%edx leal -128(%edi),%edi movd 64(%ebp),%xmm2 movdqu (%ebx),%xmm3 paddd 96(%eax),%xmm2 pand 112(%eax),%xmm3 por %xmm2,%xmm3 L0081x: movdqa 32(%eax),%xmm0 movdqu (%edx),%xmm1 movdqu 16(%edx),%xmm2 movdqa (%eax),%xmm6 movdqa 16(%eax),%xmm7 movl %ebp,48(%esp) movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movl $10,%edx jmp L012loop1x .align 4,0x90 L013outer1x: movdqa 80(%eax),%xmm3 movdqa (%esp),%xmm0 movdqa 16(%esp),%xmm1 movdqa 32(%esp),%xmm2 paddd 48(%esp),%xmm3 movl $10,%edx movdqa %xmm3,48(%esp) jmp L012loop1x .align 4,0x90 L012loop1x: paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $57,%xmm1,%xmm1 pshufd $147,%xmm3,%xmm3 nop paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $147,%xmm1,%xmm1 pshufd $57,%xmm3,%xmm3 decl %edx jnz L012loop1x paddd (%esp),%xmm0 paddd 16(%esp),%xmm1 paddd 32(%esp),%xmm2 paddd 48(%esp),%xmm3 cmpl $64,%ecx jb L014tail movdqu (%esi),%xmm4 movdqu 16(%esi),%xmm5 pxor %xmm4,%xmm0 movdqu 32(%esi),%xmm4 pxor %xmm5,%xmm1 movdqu 48(%esi),%xmm5 pxor %xmm4,%xmm2 pxor %xmm5,%xmm3 leal 64(%esi),%esi movdqu %xmm0,(%edi) movdqu %xmm1,16(%edi) movdqu %xmm2,32(%edi) movdqu %xmm3,48(%edi) leal 64(%edi),%edi subl $64,%ecx jnz L013outer1x jmp L011done L014tail: movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) xorl %eax,%eax xorl %edx,%edx xorl %ebp,%ebp L015tail_loop: movb (%esp,%ebp,1),%al movb (%esi,%ebp,1),%dl leal 1(%ebp),%ebp xorb %dl,%al movb %al,-1(%edi,%ebp,1) decl %ecx jnz L015tail_loop L011done: movl 512(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret .align 6,0x90 Lssse3_data: .byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 .byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 .long 1634760805,857760878,2036477234,1797285236 .long 0,1,2,3 .long 4,4,4,4 .long 1,0,0,0 .long 4,0,0,0 .long 0,-1,-1,-1 .align 6,0x90 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 .byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 .byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 .byte 114,103,62,0 .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/chacha-x86-win32n.obj000064400000000000000000000330021353224260700170470ustar0000000000000000LEi]N2".texth p`.bss0.debug$S rv0.@B.debug$T B2@BUSVW1;D$X-EEt$ |$$^NV D$P\$TL$XT$\F^NVD$`\$dL$hT$l_OW D$p\$tL$xT$|" $$$expaD$nd 3D$2-byD$ te k\$Tl$XL$ht$lT$t|$x\$l$L$(t$,T$4|$8\$\|$|T$pl$PL$`t$d\$|$f$fL$fT$ f\$0@Jo&onfof fon0ffݍv@OW _0@@3f$fL$fT$ f\$0111,.m0ЈD/I$_^[] &      expand 32-byte kChaCha20 for x86, CRYPTOGAMS by  0P:\ring\pregenerated\tmp\chacha-x86-win32n.asm,?#GL‚( !"$%&#')(0)6*;,?-C.I/K0N1Q2T3X4\5`6d7g8j9m:p;t<x=|>?@ABCDEFGHIKLMOPQRSTUVWXYZ[\ ]^_`ab"c&d*e-f1g5h9i>jCkPmRnYo[p]q`rbsdthukvowqxsyvzy{}|}~  !$&(*,/148:<@CGIKNQUW[]_bdhkoquw{~  ! % ) - 0 6=AEGJMTWZ]`cfilosw {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG HIJKLM!O%P)Q,R0S4T8U<V@WDXHYLZP[T\Z]`^f_j`narbvczd~efghijklmnopqrstuvwxy{|}~  #*04:@GNT[_dinsx}  &+05:?DINSX]bglqv{ !&*.27<@ D H M R V[_dhmrv{ !"#$%&'()*+,-./01234 56789:$;)<-=1>6?;@?ACBHCLDQEVFZG_HcIgJlKrLvMzN~OPQRSTUVWXYZ[\]^_`abcdefghijk l m n o p q r s% t) u. v3 w7 x< y@ zE {I |N }T ~X ] a e i n s w {                                     $ ( - 3 7 < @ D I N R S Y ^ b g l q v {                                      # ( , 0 4 8 < @ D H L P T X ] b f k n r v z                                       % !* "/ #3 $8 %; &@ 'E (J )O *S +W ,[ -_ .c /g 0k 1o 2s 3w 4{ 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P R S T U V W X$ Y* Z0 [6 \; ]@ `E aJ bP cV d\ ea fg gl hp jt kx l} m n o p q r s t u v w x y z { | } ~              !&+,27=CILRV[_dhmqux| 0@P`pm1P:\ring\pregenerated\chacha-x86-win32n.objyasm 1.3.0_GFp_ChaCha20_ctr32%L$_GFp_ChaCha20_ctr32_beginL$000no_dataL$pic_point;L$001x86L$ssse3_shortcutL$002entryL$003outer_loopPL$004loop!L$005tailL$006doneL$007tail_loop__ChaCha20_ssse3L$ssse3_data L$0081x0L$009outer_loopL$010loopL$011donep L$012loop1x@ L$013outer1xL$014tailL$015tail_loopd h     2 6 J N a e u y               7 ; O S b f }            .fileg@feat.00.text+?[htL$001x86;P!L$0081x 0 p *@ 7A.bss.debug$S ..debug$T Ppregenerated\tmp\chacha-x86-win32n.asm_GFp_ChaCha20_ctr32L$_GFp_ChaCha20_ctr32_beginL$000no_dataL$pic_point_GFp_ia32cap_PL$ssse3_shortcutL$002entryL$003outer_loopL$004loopL$005tailL$006doneL$007tail_loop__ChaCha20_ssse3L$ssse3_dataL$009outer_loopL$010loopL$011doneL$012loop1xL$013outer1xL$014tailL$015tail_loopring-0.16.9/pregenerated/chacha-x86_64-elf.S000064400000000000000000001016671353224260400164500ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .align 64 .Lzero: .long 0,0,0,0 .Lone: .long 1,0,0,0 .Linc: .long 0,1,2,3 .Lfour: .long 4,4,4,4 .Lincy: .long 0,2,4,6,1,3,5,7 .Leight: .long 8,8,8,8,8,8,8,8 .Lrot16: .byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd .Lrot24: .byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe .Lsigma: .byte 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0 .align 64 .Lzeroz: .long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 .Lfourz: .long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 .Lincz: .long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .Lsixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .globl GFp_ChaCha20_ctr32 .hidden GFp_ChaCha20_ctr32 .type GFp_ChaCha20_ctr32,@function .align 64 GFp_ChaCha20_ctr32: .cfi_startproc cmpq $0,%rdx je .Lno_data movq GFp_ia32cap_P+4(%rip),%r10 testl $512,%r10d jnz .LChaCha20_ssse3 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset rbx,-16 pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset rbp,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset r15,-56 subq $64+24,%rsp .cfi_adjust_cfa_offset 88 .Lctr32_body: movdqu (%rcx),%xmm1 movdqu 16(%rcx),%xmm2 movdqu (%r8),%xmm3 movdqa .Lone(%rip),%xmm4 movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) movq %rdx,%rbp jmp .Loop_outer .align 32 .Loop_outer: movl $0x61707865,%eax movl $0x3320646e,%ebx movl $0x79622d32,%ecx movl $0x6b206574,%edx movl 16(%rsp),%r8d movl 20(%rsp),%r9d movl 24(%rsp),%r10d movl 28(%rsp),%r11d movd %xmm3,%r12d movl 52(%rsp),%r13d movl 56(%rsp),%r14d movl 60(%rsp),%r15d movq %rbp,64+0(%rsp) movl $10,%ebp movq %rsi,64+8(%rsp) .byte 102,72,15,126,214 movq %rdi,64+16(%rsp) movq %rsi,%rdi shrq $32,%rdi jmp .Loop .align 32 .Loop: addl %r8d,%eax xorl %eax,%r12d roll $16,%r12d addl %r9d,%ebx xorl %ebx,%r13d roll $16,%r13d addl %r12d,%esi xorl %esi,%r8d roll $12,%r8d addl %r13d,%edi xorl %edi,%r9d roll $12,%r9d addl %r8d,%eax xorl %eax,%r12d roll $8,%r12d addl %r9d,%ebx xorl %ebx,%r13d roll $8,%r13d addl %r12d,%esi xorl %esi,%r8d roll $7,%r8d addl %r13d,%edi xorl %edi,%r9d roll $7,%r9d movl %esi,32(%rsp) movl %edi,36(%rsp) movl 40(%rsp),%esi movl 44(%rsp),%edi addl %r10d,%ecx xorl %ecx,%r14d roll $16,%r14d addl %r11d,%edx xorl %edx,%r15d roll $16,%r15d addl %r14d,%esi xorl %esi,%r10d roll $12,%r10d addl %r15d,%edi xorl %edi,%r11d roll $12,%r11d addl %r10d,%ecx xorl %ecx,%r14d roll $8,%r14d addl %r11d,%edx xorl %edx,%r15d roll $8,%r15d addl %r14d,%esi xorl %esi,%r10d roll $7,%r10d addl %r15d,%edi xorl %edi,%r11d roll $7,%r11d addl %r9d,%eax xorl %eax,%r15d roll $16,%r15d addl %r10d,%ebx xorl %ebx,%r12d roll $16,%r12d addl %r15d,%esi xorl %esi,%r9d roll $12,%r9d addl %r12d,%edi xorl %edi,%r10d roll $12,%r10d addl %r9d,%eax xorl %eax,%r15d roll $8,%r15d addl %r10d,%ebx xorl %ebx,%r12d roll $8,%r12d addl %r15d,%esi xorl %esi,%r9d roll $7,%r9d addl %r12d,%edi xorl %edi,%r10d roll $7,%r10d movl %esi,40(%rsp) movl %edi,44(%rsp) movl 32(%rsp),%esi movl 36(%rsp),%edi addl %r11d,%ecx xorl %ecx,%r13d roll $16,%r13d addl %r8d,%edx xorl %edx,%r14d roll $16,%r14d addl %r13d,%esi xorl %esi,%r11d roll $12,%r11d addl %r14d,%edi xorl %edi,%r8d roll $12,%r8d addl %r11d,%ecx xorl %ecx,%r13d roll $8,%r13d addl %r8d,%edx xorl %edx,%r14d roll $8,%r14d addl %r13d,%esi xorl %esi,%r11d roll $7,%r11d addl %r14d,%edi xorl %edi,%r8d roll $7,%r8d decl %ebp jnz .Loop movl %edi,36(%rsp) movl %esi,32(%rsp) movq 64(%rsp),%rbp movdqa %xmm2,%xmm1 movq 64+8(%rsp),%rsi paddd %xmm4,%xmm3 movq 64+16(%rsp),%rdi addl $0x61707865,%eax addl $0x3320646e,%ebx addl $0x79622d32,%ecx addl $0x6b206574,%edx addl 16(%rsp),%r8d addl 20(%rsp),%r9d addl 24(%rsp),%r10d addl 28(%rsp),%r11d addl 48(%rsp),%r12d addl 52(%rsp),%r13d addl 56(%rsp),%r14d addl 60(%rsp),%r15d paddd 32(%rsp),%xmm1 cmpq $64,%rbp jb .Ltail xorl 0(%rsi),%eax xorl 4(%rsi),%ebx xorl 8(%rsi),%ecx xorl 12(%rsi),%edx xorl 16(%rsi),%r8d xorl 20(%rsi),%r9d xorl 24(%rsi),%r10d xorl 28(%rsi),%r11d movdqu 32(%rsi),%xmm0 xorl 48(%rsi),%r12d xorl 52(%rsi),%r13d xorl 56(%rsi),%r14d xorl 60(%rsi),%r15d leaq 64(%rsi),%rsi pxor %xmm1,%xmm0 movdqa %xmm2,32(%rsp) movd %xmm3,48(%rsp) movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) movdqu %xmm0,32(%rdi) movl %r12d,48(%rdi) movl %r13d,52(%rdi) movl %r14d,56(%rdi) movl %r15d,60(%rdi) leaq 64(%rdi),%rdi subq $64,%rbp jnz .Loop_outer jmp .Ldone .align 16 .Ltail: movl %eax,0(%rsp) movl %ebx,4(%rsp) xorq %rbx,%rbx movl %ecx,8(%rsp) movl %edx,12(%rsp) movl %r8d,16(%rsp) movl %r9d,20(%rsp) movl %r10d,24(%rsp) movl %r11d,28(%rsp) movdqa %xmm1,32(%rsp) movl %r12d,48(%rsp) movl %r13d,52(%rsp) movl %r14d,56(%rsp) movl %r15d,60(%rsp) .Loop_tail: movzbl (%rsi,%rbx,1),%eax movzbl (%rsp,%rbx,1),%edx leaq 1(%rbx),%rbx xorl %edx,%eax movb %al,-1(%rdi,%rbx,1) decq %rbp jnz .Loop_tail .Ldone: leaq 64+24+48(%rsp),%rsi movq -48(%rsi),%r15 .cfi_restore r15 movq -40(%rsi),%r14 .cfi_restore r14 movq -32(%rsi),%r13 .cfi_restore r13 movq -24(%rsi),%r12 .cfi_restore r12 movq -16(%rsi),%rbp .cfi_restore rbp movq -8(%rsi),%rbx .cfi_restore rbx leaq (%rsi),%rsp .cfi_adjust_cfa_offset -136 .Lno_data: .byte 0xf3,0xc3 .cfi_endproc .size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 .type ChaCha20_ssse3,@function .align 32 ChaCha20_ssse3: .LChaCha20_ssse3: .cfi_startproc movq %rsp,%r9 .cfi_def_cfa_register r9 cmpq $128,%rdx ja .LChaCha20_4x .Ldo_sse3_after_all: subq $64+8,%rsp movdqa .Lsigma(%rip),%xmm0 movdqu (%rcx),%xmm1 movdqu 16(%rcx),%xmm2 movdqu (%r8),%xmm3 movdqa .Lrot16(%rip),%xmm6 movdqa .Lrot24(%rip),%xmm7 movdqa %xmm0,0(%rsp) movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) movq $10,%r8 jmp .Loop_ssse3 .align 32 .Loop_outer_ssse3: movdqa .Lone(%rip),%xmm3 movdqa 0(%rsp),%xmm0 movdqa 16(%rsp),%xmm1 movdqa 32(%rsp),%xmm2 paddd 48(%rsp),%xmm3 movq $10,%r8 movdqa %xmm3,48(%rsp) jmp .Loop_ssse3 .align 32 .Loop_ssse3: paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $57,%xmm1,%xmm1 pshufd $147,%xmm3,%xmm3 nop paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $147,%xmm1,%xmm1 pshufd $57,%xmm3,%xmm3 decq %r8 jnz .Loop_ssse3 paddd 0(%rsp),%xmm0 paddd 16(%rsp),%xmm1 paddd 32(%rsp),%xmm2 paddd 48(%rsp),%xmm3 cmpq $64,%rdx jb .Ltail_ssse3 movdqu 0(%rsi),%xmm4 movdqu 16(%rsi),%xmm5 pxor %xmm4,%xmm0 movdqu 32(%rsi),%xmm4 pxor %xmm5,%xmm1 movdqu 48(%rsi),%xmm5 leaq 64(%rsi),%rsi pxor %xmm4,%xmm2 pxor %xmm5,%xmm3 movdqu %xmm0,0(%rdi) movdqu %xmm1,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 64(%rdi),%rdi subq $64,%rdx jnz .Loop_outer_ssse3 jmp .Ldone_ssse3 .align 16 .Ltail_ssse3: movdqa %xmm0,0(%rsp) movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) xorq %r8,%r8 .Loop_tail_ssse3: movzbl (%rsi,%r8,1),%eax movzbl (%rsp,%r8,1),%ecx leaq 1(%r8),%r8 xorl %ecx,%eax movb %al,-1(%rdi,%r8,1) decq %rdx jnz .Loop_tail_ssse3 .Ldone_ssse3: leaq (%r9),%rsp .cfi_def_cfa_register rsp .Lssse3_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size ChaCha20_ssse3,.-ChaCha20_ssse3 .type ChaCha20_4x,@function .align 32 ChaCha20_4x: .LChaCha20_4x: .cfi_startproc movq %rsp,%r9 .cfi_def_cfa_register r9 movq %r10,%r11 shrq $32,%r10 testq $32,%r10 jnz .LChaCha20_8x cmpq $192,%rdx ja .Lproceed4x andq $71303168,%r11 cmpq $4194304,%r11 je .Ldo_sse3_after_all .Lproceed4x: subq $0x140+8,%rsp movdqa .Lsigma(%rip),%xmm11 movdqu (%rcx),%xmm15 movdqu 16(%rcx),%xmm7 movdqu (%r8),%xmm3 leaq 256(%rsp),%rcx leaq .Lrot16(%rip),%r10 leaq .Lrot24(%rip),%r11 pshufd $0x00,%xmm11,%xmm8 pshufd $0x55,%xmm11,%xmm9 movdqa %xmm8,64(%rsp) pshufd $0xaa,%xmm11,%xmm10 movdqa %xmm9,80(%rsp) pshufd $0xff,%xmm11,%xmm11 movdqa %xmm10,96(%rsp) movdqa %xmm11,112(%rsp) pshufd $0x00,%xmm15,%xmm12 pshufd $0x55,%xmm15,%xmm13 movdqa %xmm12,128-256(%rcx) pshufd $0xaa,%xmm15,%xmm14 movdqa %xmm13,144-256(%rcx) pshufd $0xff,%xmm15,%xmm15 movdqa %xmm14,160-256(%rcx) movdqa %xmm15,176-256(%rcx) pshufd $0x00,%xmm7,%xmm4 pshufd $0x55,%xmm7,%xmm5 movdqa %xmm4,192-256(%rcx) pshufd $0xaa,%xmm7,%xmm6 movdqa %xmm5,208-256(%rcx) pshufd $0xff,%xmm7,%xmm7 movdqa %xmm6,224-256(%rcx) movdqa %xmm7,240-256(%rcx) pshufd $0x00,%xmm3,%xmm0 pshufd $0x55,%xmm3,%xmm1 paddd .Linc(%rip),%xmm0 pshufd $0xaa,%xmm3,%xmm2 movdqa %xmm1,272-256(%rcx) pshufd $0xff,%xmm3,%xmm3 movdqa %xmm2,288-256(%rcx) movdqa %xmm3,304-256(%rcx) jmp .Loop_enter4x .align 32 .Loop_outer4x: movdqa 64(%rsp),%xmm8 movdqa 80(%rsp),%xmm9 movdqa 96(%rsp),%xmm10 movdqa 112(%rsp),%xmm11 movdqa 128-256(%rcx),%xmm12 movdqa 144-256(%rcx),%xmm13 movdqa 160-256(%rcx),%xmm14 movdqa 176-256(%rcx),%xmm15 movdqa 192-256(%rcx),%xmm4 movdqa 208-256(%rcx),%xmm5 movdqa 224-256(%rcx),%xmm6 movdqa 240-256(%rcx),%xmm7 movdqa 256-256(%rcx),%xmm0 movdqa 272-256(%rcx),%xmm1 movdqa 288-256(%rcx),%xmm2 movdqa 304-256(%rcx),%xmm3 paddd .Lfour(%rip),%xmm0 .Loop_enter4x: movdqa %xmm6,32(%rsp) movdqa %xmm7,48(%rsp) movdqa (%r10),%xmm7 movl $10,%eax movdqa %xmm0,256-256(%rcx) jmp .Loop4x .align 32 .Loop4x: paddd %xmm12,%xmm8 paddd %xmm13,%xmm9 pxor %xmm8,%xmm0 pxor %xmm9,%xmm1 .byte 102,15,56,0,199 .byte 102,15,56,0,207 paddd %xmm0,%xmm4 paddd %xmm1,%xmm5 pxor %xmm4,%xmm12 pxor %xmm5,%xmm13 movdqa %xmm12,%xmm6 pslld $12,%xmm12 psrld $20,%xmm6 movdqa %xmm13,%xmm7 pslld $12,%xmm13 por %xmm6,%xmm12 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm13 paddd %xmm12,%xmm8 paddd %xmm13,%xmm9 pxor %xmm8,%xmm0 pxor %xmm9,%xmm1 .byte 102,15,56,0,198 .byte 102,15,56,0,206 paddd %xmm0,%xmm4 paddd %xmm1,%xmm5 pxor %xmm4,%xmm12 pxor %xmm5,%xmm13 movdqa %xmm12,%xmm7 pslld $7,%xmm12 psrld $25,%xmm7 movdqa %xmm13,%xmm6 pslld $7,%xmm13 por %xmm7,%xmm12 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm13 movdqa %xmm4,0(%rsp) movdqa %xmm5,16(%rsp) movdqa 32(%rsp),%xmm4 movdqa 48(%rsp),%xmm5 paddd %xmm14,%xmm10 paddd %xmm15,%xmm11 pxor %xmm10,%xmm2 pxor %xmm11,%xmm3 .byte 102,15,56,0,215 .byte 102,15,56,0,223 paddd %xmm2,%xmm4 paddd %xmm3,%xmm5 pxor %xmm4,%xmm14 pxor %xmm5,%xmm15 movdqa %xmm14,%xmm6 pslld $12,%xmm14 psrld $20,%xmm6 movdqa %xmm15,%xmm7 pslld $12,%xmm15 por %xmm6,%xmm14 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm15 paddd %xmm14,%xmm10 paddd %xmm15,%xmm11 pxor %xmm10,%xmm2 pxor %xmm11,%xmm3 .byte 102,15,56,0,214 .byte 102,15,56,0,222 paddd %xmm2,%xmm4 paddd %xmm3,%xmm5 pxor %xmm4,%xmm14 pxor %xmm5,%xmm15 movdqa %xmm14,%xmm7 pslld $7,%xmm14 psrld $25,%xmm7 movdqa %xmm15,%xmm6 pslld $7,%xmm15 por %xmm7,%xmm14 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm15 paddd %xmm13,%xmm8 paddd %xmm14,%xmm9 pxor %xmm8,%xmm3 pxor %xmm9,%xmm0 .byte 102,15,56,0,223 .byte 102,15,56,0,199 paddd %xmm3,%xmm4 paddd %xmm0,%xmm5 pxor %xmm4,%xmm13 pxor %xmm5,%xmm14 movdqa %xmm13,%xmm6 pslld $12,%xmm13 psrld $20,%xmm6 movdqa %xmm14,%xmm7 pslld $12,%xmm14 por %xmm6,%xmm13 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm14 paddd %xmm13,%xmm8 paddd %xmm14,%xmm9 pxor %xmm8,%xmm3 pxor %xmm9,%xmm0 .byte 102,15,56,0,222 .byte 102,15,56,0,198 paddd %xmm3,%xmm4 paddd %xmm0,%xmm5 pxor %xmm4,%xmm13 pxor %xmm5,%xmm14 movdqa %xmm13,%xmm7 pslld $7,%xmm13 psrld $25,%xmm7 movdqa %xmm14,%xmm6 pslld $7,%xmm14 por %xmm7,%xmm13 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm14 movdqa %xmm4,32(%rsp) movdqa %xmm5,48(%rsp) movdqa 0(%rsp),%xmm4 movdqa 16(%rsp),%xmm5 paddd %xmm15,%xmm10 paddd %xmm12,%xmm11 pxor %xmm10,%xmm1 pxor %xmm11,%xmm2 .byte 102,15,56,0,207 .byte 102,15,56,0,215 paddd %xmm1,%xmm4 paddd %xmm2,%xmm5 pxor %xmm4,%xmm15 pxor %xmm5,%xmm12 movdqa %xmm15,%xmm6 pslld $12,%xmm15 psrld $20,%xmm6 movdqa %xmm12,%xmm7 pslld $12,%xmm12 por %xmm6,%xmm15 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm12 paddd %xmm15,%xmm10 paddd %xmm12,%xmm11 pxor %xmm10,%xmm1 pxor %xmm11,%xmm2 .byte 102,15,56,0,206 .byte 102,15,56,0,214 paddd %xmm1,%xmm4 paddd %xmm2,%xmm5 pxor %xmm4,%xmm15 pxor %xmm5,%xmm12 movdqa %xmm15,%xmm7 pslld $7,%xmm15 psrld $25,%xmm7 movdqa %xmm12,%xmm6 pslld $7,%xmm12 por %xmm7,%xmm15 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm12 decl %eax jnz .Loop4x paddd 64(%rsp),%xmm8 paddd 80(%rsp),%xmm9 paddd 96(%rsp),%xmm10 paddd 112(%rsp),%xmm11 movdqa %xmm8,%xmm6 punpckldq %xmm9,%xmm8 movdqa %xmm10,%xmm7 punpckldq %xmm11,%xmm10 punpckhdq %xmm9,%xmm6 punpckhdq %xmm11,%xmm7 movdqa %xmm8,%xmm9 punpcklqdq %xmm10,%xmm8 movdqa %xmm6,%xmm11 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm10,%xmm9 punpckhqdq %xmm7,%xmm11 paddd 128-256(%rcx),%xmm12 paddd 144-256(%rcx),%xmm13 paddd 160-256(%rcx),%xmm14 paddd 176-256(%rcx),%xmm15 movdqa %xmm8,0(%rsp) movdqa %xmm9,16(%rsp) movdqa 32(%rsp),%xmm8 movdqa 48(%rsp),%xmm9 movdqa %xmm12,%xmm10 punpckldq %xmm13,%xmm12 movdqa %xmm14,%xmm7 punpckldq %xmm15,%xmm14 punpckhdq %xmm13,%xmm10 punpckhdq %xmm15,%xmm7 movdqa %xmm12,%xmm13 punpcklqdq %xmm14,%xmm12 movdqa %xmm10,%xmm15 punpcklqdq %xmm7,%xmm10 punpckhqdq %xmm14,%xmm13 punpckhqdq %xmm7,%xmm15 paddd 192-256(%rcx),%xmm4 paddd 208-256(%rcx),%xmm5 paddd 224-256(%rcx),%xmm8 paddd 240-256(%rcx),%xmm9 movdqa %xmm6,32(%rsp) movdqa %xmm11,48(%rsp) movdqa %xmm4,%xmm14 punpckldq %xmm5,%xmm4 movdqa %xmm8,%xmm7 punpckldq %xmm9,%xmm8 punpckhdq %xmm5,%xmm14 punpckhdq %xmm9,%xmm7 movdqa %xmm4,%xmm5 punpcklqdq %xmm8,%xmm4 movdqa %xmm14,%xmm9 punpcklqdq %xmm7,%xmm14 punpckhqdq %xmm8,%xmm5 punpckhqdq %xmm7,%xmm9 paddd 256-256(%rcx),%xmm0 paddd 272-256(%rcx),%xmm1 paddd 288-256(%rcx),%xmm2 paddd 304-256(%rcx),%xmm3 movdqa %xmm0,%xmm8 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm8 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm8,%xmm3 punpcklqdq %xmm7,%xmm8 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 cmpq $256,%rdx jb .Ltail4x movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu 0(%rsi),%xmm6 movdqu %xmm11,80(%rdi) movdqu 16(%rsi),%xmm11 movdqu %xmm2,96(%rdi) movdqu 32(%rsi),%xmm2 movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi movdqu 48(%rsi),%xmm7 pxor 32(%rsp),%xmm6 pxor %xmm10,%xmm11 pxor %xmm14,%xmm2 pxor %xmm8,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 48(%rsp),%xmm6 pxor %xmm15,%xmm11 pxor %xmm9,%xmm2 pxor %xmm3,%xmm7 movdqu %xmm6,64(%rdi) movdqu %xmm11,80(%rdi) movdqu %xmm2,96(%rdi) movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi subq $256,%rdx jnz .Loop_outer4x jmp .Ldone4x .Ltail4x: cmpq $192,%rdx jae .L192_or_more4x cmpq $128,%rdx jae .L128_or_more4x cmpq $64,%rdx jae .L64_or_more4x xorq %r10,%r10 movdqa %xmm12,16(%rsp) movdqa %xmm4,32(%rsp) movdqa %xmm0,48(%rsp) jmp .Loop_tail4x .align 32 .L64_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu %xmm11,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm7,48(%rdi) je .Ldone4x movdqa 16(%rsp),%xmm6 leaq 64(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm13,16(%rsp) leaq 64(%rdi),%rdi movdqa %xmm5,32(%rsp) subq $64,%rdx movdqa %xmm1,48(%rsp) jmp .Loop_tail4x .align 32 .L128_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu %xmm11,80(%rdi) movdqu %xmm2,96(%rdi) movdqu %xmm7,112(%rdi) je .Ldone4x movdqa 32(%rsp),%xmm6 leaq 128(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm10,16(%rsp) leaq 128(%rdi),%rdi movdqa %xmm14,32(%rsp) subq $128,%rdx movdqa %xmm8,48(%rsp) jmp .Loop_tail4x .align 32 .L192_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu 0(%rsi),%xmm6 movdqu %xmm11,80(%rdi) movdqu 16(%rsi),%xmm11 movdqu %xmm2,96(%rdi) movdqu 32(%rsi),%xmm2 movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi movdqu 48(%rsi),%xmm7 pxor 32(%rsp),%xmm6 pxor %xmm10,%xmm11 pxor %xmm14,%xmm2 pxor %xmm8,%xmm7 movdqu %xmm6,0(%rdi) movdqu %xmm11,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm7,48(%rdi) je .Ldone4x movdqa 48(%rsp),%xmm6 leaq 64(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm15,16(%rsp) leaq 64(%rdi),%rdi movdqa %xmm9,32(%rsp) subq $192,%rdx movdqa %xmm3,48(%rsp) .Loop_tail4x: movzbl (%rsi,%r10,1),%eax movzbl (%rsp,%r10,1),%ecx leaq 1(%r10),%r10 xorl %ecx,%eax movb %al,-1(%rdi,%r10,1) decq %rdx jnz .Loop_tail4x .Ldone4x: leaq (%r9),%rsp .cfi_def_cfa_register rsp .L4x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size ChaCha20_4x,.-ChaCha20_4x .type ChaCha20_8x,@function .align 32 ChaCha20_8x: .LChaCha20_8x: .cfi_startproc movq %rsp,%r9 .cfi_def_cfa_register r9 subq $0x280+8,%rsp andq $-32,%rsp vzeroupper vbroadcasti128 .Lsigma(%rip),%ymm11 vbroadcasti128 (%rcx),%ymm3 vbroadcasti128 16(%rcx),%ymm15 vbroadcasti128 (%r8),%ymm7 leaq 256(%rsp),%rcx leaq 512(%rsp),%rax leaq .Lrot16(%rip),%r10 leaq .Lrot24(%rip),%r11 vpshufd $0x00,%ymm11,%ymm8 vpshufd $0x55,%ymm11,%ymm9 vmovdqa %ymm8,128-256(%rcx) vpshufd $0xaa,%ymm11,%ymm10 vmovdqa %ymm9,160-256(%rcx) vpshufd $0xff,%ymm11,%ymm11 vmovdqa %ymm10,192-256(%rcx) vmovdqa %ymm11,224-256(%rcx) vpshufd $0x00,%ymm3,%ymm0 vpshufd $0x55,%ymm3,%ymm1 vmovdqa %ymm0,256-256(%rcx) vpshufd $0xaa,%ymm3,%ymm2 vmovdqa %ymm1,288-256(%rcx) vpshufd $0xff,%ymm3,%ymm3 vmovdqa %ymm2,320-256(%rcx) vmovdqa %ymm3,352-256(%rcx) vpshufd $0x00,%ymm15,%ymm12 vpshufd $0x55,%ymm15,%ymm13 vmovdqa %ymm12,384-512(%rax) vpshufd $0xaa,%ymm15,%ymm14 vmovdqa %ymm13,416-512(%rax) vpshufd $0xff,%ymm15,%ymm15 vmovdqa %ymm14,448-512(%rax) vmovdqa %ymm15,480-512(%rax) vpshufd $0x00,%ymm7,%ymm4 vpshufd $0x55,%ymm7,%ymm5 vpaddd .Lincy(%rip),%ymm4,%ymm4 vpshufd $0xaa,%ymm7,%ymm6 vmovdqa %ymm5,544-512(%rax) vpshufd $0xff,%ymm7,%ymm7 vmovdqa %ymm6,576-512(%rax) vmovdqa %ymm7,608-512(%rax) jmp .Loop_enter8x .align 32 .Loop_outer8x: vmovdqa 128-256(%rcx),%ymm8 vmovdqa 160-256(%rcx),%ymm9 vmovdqa 192-256(%rcx),%ymm10 vmovdqa 224-256(%rcx),%ymm11 vmovdqa 256-256(%rcx),%ymm0 vmovdqa 288-256(%rcx),%ymm1 vmovdqa 320-256(%rcx),%ymm2 vmovdqa 352-256(%rcx),%ymm3 vmovdqa 384-512(%rax),%ymm12 vmovdqa 416-512(%rax),%ymm13 vmovdqa 448-512(%rax),%ymm14 vmovdqa 480-512(%rax),%ymm15 vmovdqa 512-512(%rax),%ymm4 vmovdqa 544-512(%rax),%ymm5 vmovdqa 576-512(%rax),%ymm6 vmovdqa 608-512(%rax),%ymm7 vpaddd .Leight(%rip),%ymm4,%ymm4 .Loop_enter8x: vmovdqa %ymm14,64(%rsp) vmovdqa %ymm15,96(%rsp) vbroadcasti128 (%r10),%ymm15 vmovdqa %ymm4,512-512(%rax) movl $10,%eax jmp .Loop8x .align 32 .Loop8x: vpaddd %ymm0,%ymm8,%ymm8 vpxor %ymm4,%ymm8,%ymm4 vpshufb %ymm15,%ymm4,%ymm4 vpaddd %ymm1,%ymm9,%ymm9 vpxor %ymm5,%ymm9,%ymm5 vpshufb %ymm15,%ymm5,%ymm5 vpaddd %ymm4,%ymm12,%ymm12 vpxor %ymm0,%ymm12,%ymm0 vpslld $12,%ymm0,%ymm14 vpsrld $20,%ymm0,%ymm0 vpor %ymm0,%ymm14,%ymm0 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm5,%ymm13,%ymm13 vpxor %ymm1,%ymm13,%ymm1 vpslld $12,%ymm1,%ymm15 vpsrld $20,%ymm1,%ymm1 vpor %ymm1,%ymm15,%ymm1 vpaddd %ymm0,%ymm8,%ymm8 vpxor %ymm4,%ymm8,%ymm4 vpshufb %ymm14,%ymm4,%ymm4 vpaddd %ymm1,%ymm9,%ymm9 vpxor %ymm5,%ymm9,%ymm5 vpshufb %ymm14,%ymm5,%ymm5 vpaddd %ymm4,%ymm12,%ymm12 vpxor %ymm0,%ymm12,%ymm0 vpslld $7,%ymm0,%ymm15 vpsrld $25,%ymm0,%ymm0 vpor %ymm0,%ymm15,%ymm0 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm5,%ymm13,%ymm13 vpxor %ymm1,%ymm13,%ymm1 vpslld $7,%ymm1,%ymm14 vpsrld $25,%ymm1,%ymm1 vpor %ymm1,%ymm14,%ymm1 vmovdqa %ymm12,0(%rsp) vmovdqa %ymm13,32(%rsp) vmovdqa 64(%rsp),%ymm12 vmovdqa 96(%rsp),%ymm13 vpaddd %ymm2,%ymm10,%ymm10 vpxor %ymm6,%ymm10,%ymm6 vpshufb %ymm15,%ymm6,%ymm6 vpaddd %ymm3,%ymm11,%ymm11 vpxor %ymm7,%ymm11,%ymm7 vpshufb %ymm15,%ymm7,%ymm7 vpaddd %ymm6,%ymm12,%ymm12 vpxor %ymm2,%ymm12,%ymm2 vpslld $12,%ymm2,%ymm14 vpsrld $20,%ymm2,%ymm2 vpor %ymm2,%ymm14,%ymm2 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm7,%ymm13,%ymm13 vpxor %ymm3,%ymm13,%ymm3 vpslld $12,%ymm3,%ymm15 vpsrld $20,%ymm3,%ymm3 vpor %ymm3,%ymm15,%ymm3 vpaddd %ymm2,%ymm10,%ymm10 vpxor %ymm6,%ymm10,%ymm6 vpshufb %ymm14,%ymm6,%ymm6 vpaddd %ymm3,%ymm11,%ymm11 vpxor %ymm7,%ymm11,%ymm7 vpshufb %ymm14,%ymm7,%ymm7 vpaddd %ymm6,%ymm12,%ymm12 vpxor %ymm2,%ymm12,%ymm2 vpslld $7,%ymm2,%ymm15 vpsrld $25,%ymm2,%ymm2 vpor %ymm2,%ymm15,%ymm2 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm7,%ymm13,%ymm13 vpxor %ymm3,%ymm13,%ymm3 vpslld $7,%ymm3,%ymm14 vpsrld $25,%ymm3,%ymm3 vpor %ymm3,%ymm14,%ymm3 vpaddd %ymm1,%ymm8,%ymm8 vpxor %ymm7,%ymm8,%ymm7 vpshufb %ymm15,%ymm7,%ymm7 vpaddd %ymm2,%ymm9,%ymm9 vpxor %ymm4,%ymm9,%ymm4 vpshufb %ymm15,%ymm4,%ymm4 vpaddd %ymm7,%ymm12,%ymm12 vpxor %ymm1,%ymm12,%ymm1 vpslld $12,%ymm1,%ymm14 vpsrld $20,%ymm1,%ymm1 vpor %ymm1,%ymm14,%ymm1 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm4,%ymm13,%ymm13 vpxor %ymm2,%ymm13,%ymm2 vpslld $12,%ymm2,%ymm15 vpsrld $20,%ymm2,%ymm2 vpor %ymm2,%ymm15,%ymm2 vpaddd %ymm1,%ymm8,%ymm8 vpxor %ymm7,%ymm8,%ymm7 vpshufb %ymm14,%ymm7,%ymm7 vpaddd %ymm2,%ymm9,%ymm9 vpxor %ymm4,%ymm9,%ymm4 vpshufb %ymm14,%ymm4,%ymm4 vpaddd %ymm7,%ymm12,%ymm12 vpxor %ymm1,%ymm12,%ymm1 vpslld $7,%ymm1,%ymm15 vpsrld $25,%ymm1,%ymm1 vpor %ymm1,%ymm15,%ymm1 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm4,%ymm13,%ymm13 vpxor %ymm2,%ymm13,%ymm2 vpslld $7,%ymm2,%ymm14 vpsrld $25,%ymm2,%ymm2 vpor %ymm2,%ymm14,%ymm2 vmovdqa %ymm12,64(%rsp) vmovdqa %ymm13,96(%rsp) vmovdqa 0(%rsp),%ymm12 vmovdqa 32(%rsp),%ymm13 vpaddd %ymm3,%ymm10,%ymm10 vpxor %ymm5,%ymm10,%ymm5 vpshufb %ymm15,%ymm5,%ymm5 vpaddd %ymm0,%ymm11,%ymm11 vpxor %ymm6,%ymm11,%ymm6 vpshufb %ymm15,%ymm6,%ymm6 vpaddd %ymm5,%ymm12,%ymm12 vpxor %ymm3,%ymm12,%ymm3 vpslld $12,%ymm3,%ymm14 vpsrld $20,%ymm3,%ymm3 vpor %ymm3,%ymm14,%ymm3 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm6,%ymm13,%ymm13 vpxor %ymm0,%ymm13,%ymm0 vpslld $12,%ymm0,%ymm15 vpsrld $20,%ymm0,%ymm0 vpor %ymm0,%ymm15,%ymm0 vpaddd %ymm3,%ymm10,%ymm10 vpxor %ymm5,%ymm10,%ymm5 vpshufb %ymm14,%ymm5,%ymm5 vpaddd %ymm0,%ymm11,%ymm11 vpxor %ymm6,%ymm11,%ymm6 vpshufb %ymm14,%ymm6,%ymm6 vpaddd %ymm5,%ymm12,%ymm12 vpxor %ymm3,%ymm12,%ymm3 vpslld $7,%ymm3,%ymm15 vpsrld $25,%ymm3,%ymm3 vpor %ymm3,%ymm15,%ymm3 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm6,%ymm13,%ymm13 vpxor %ymm0,%ymm13,%ymm0 vpslld $7,%ymm0,%ymm14 vpsrld $25,%ymm0,%ymm0 vpor %ymm0,%ymm14,%ymm0 decl %eax jnz .Loop8x leaq 512(%rsp),%rax vpaddd 128-256(%rcx),%ymm8,%ymm8 vpaddd 160-256(%rcx),%ymm9,%ymm9 vpaddd 192-256(%rcx),%ymm10,%ymm10 vpaddd 224-256(%rcx),%ymm11,%ymm11 vpunpckldq %ymm9,%ymm8,%ymm14 vpunpckldq %ymm11,%ymm10,%ymm15 vpunpckhdq %ymm9,%ymm8,%ymm8 vpunpckhdq %ymm11,%ymm10,%ymm10 vpunpcklqdq %ymm15,%ymm14,%ymm9 vpunpckhqdq %ymm15,%ymm14,%ymm14 vpunpcklqdq %ymm10,%ymm8,%ymm11 vpunpckhqdq %ymm10,%ymm8,%ymm8 vpaddd 256-256(%rcx),%ymm0,%ymm0 vpaddd 288-256(%rcx),%ymm1,%ymm1 vpaddd 320-256(%rcx),%ymm2,%ymm2 vpaddd 352-256(%rcx),%ymm3,%ymm3 vpunpckldq %ymm1,%ymm0,%ymm10 vpunpckldq %ymm3,%ymm2,%ymm15 vpunpckhdq %ymm1,%ymm0,%ymm0 vpunpckhdq %ymm3,%ymm2,%ymm2 vpunpcklqdq %ymm15,%ymm10,%ymm1 vpunpckhqdq %ymm15,%ymm10,%ymm10 vpunpcklqdq %ymm2,%ymm0,%ymm3 vpunpckhqdq %ymm2,%ymm0,%ymm0 vperm2i128 $0x20,%ymm1,%ymm9,%ymm15 vperm2i128 $0x31,%ymm1,%ymm9,%ymm1 vperm2i128 $0x20,%ymm10,%ymm14,%ymm9 vperm2i128 $0x31,%ymm10,%ymm14,%ymm10 vperm2i128 $0x20,%ymm3,%ymm11,%ymm14 vperm2i128 $0x31,%ymm3,%ymm11,%ymm3 vperm2i128 $0x20,%ymm0,%ymm8,%ymm11 vperm2i128 $0x31,%ymm0,%ymm8,%ymm0 vmovdqa %ymm15,0(%rsp) vmovdqa %ymm9,32(%rsp) vmovdqa 64(%rsp),%ymm15 vmovdqa 96(%rsp),%ymm9 vpaddd 384-512(%rax),%ymm12,%ymm12 vpaddd 416-512(%rax),%ymm13,%ymm13 vpaddd 448-512(%rax),%ymm15,%ymm15 vpaddd 480-512(%rax),%ymm9,%ymm9 vpunpckldq %ymm13,%ymm12,%ymm2 vpunpckldq %ymm9,%ymm15,%ymm8 vpunpckhdq %ymm13,%ymm12,%ymm12 vpunpckhdq %ymm9,%ymm15,%ymm15 vpunpcklqdq %ymm8,%ymm2,%ymm13 vpunpckhqdq %ymm8,%ymm2,%ymm2 vpunpcklqdq %ymm15,%ymm12,%ymm9 vpunpckhqdq %ymm15,%ymm12,%ymm12 vpaddd 512-512(%rax),%ymm4,%ymm4 vpaddd 544-512(%rax),%ymm5,%ymm5 vpaddd 576-512(%rax),%ymm6,%ymm6 vpaddd 608-512(%rax),%ymm7,%ymm7 vpunpckldq %ymm5,%ymm4,%ymm15 vpunpckldq %ymm7,%ymm6,%ymm8 vpunpckhdq %ymm5,%ymm4,%ymm4 vpunpckhdq %ymm7,%ymm6,%ymm6 vpunpcklqdq %ymm8,%ymm15,%ymm5 vpunpckhqdq %ymm8,%ymm15,%ymm15 vpunpcklqdq %ymm6,%ymm4,%ymm7 vpunpckhqdq %ymm6,%ymm4,%ymm4 vperm2i128 $0x20,%ymm5,%ymm13,%ymm8 vperm2i128 $0x31,%ymm5,%ymm13,%ymm5 vperm2i128 $0x20,%ymm15,%ymm2,%ymm13 vperm2i128 $0x31,%ymm15,%ymm2,%ymm15 vperm2i128 $0x20,%ymm7,%ymm9,%ymm2 vperm2i128 $0x31,%ymm7,%ymm9,%ymm7 vperm2i128 $0x20,%ymm4,%ymm12,%ymm9 vperm2i128 $0x31,%ymm4,%ymm12,%ymm4 vmovdqa 0(%rsp),%ymm6 vmovdqa 32(%rsp),%ymm12 cmpq $512,%rdx jb .Ltail8x vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 leaq 128(%rsi),%rsi vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm12,%ymm12 vpxor 32(%rsi),%ymm13,%ymm13 vpxor 64(%rsi),%ymm10,%ymm10 vpxor 96(%rsi),%ymm15,%ymm15 leaq 128(%rsi),%rsi vmovdqu %ymm12,0(%rdi) vmovdqu %ymm13,32(%rdi) vmovdqu %ymm10,64(%rdi) vmovdqu %ymm15,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm14,%ymm14 vpxor 32(%rsi),%ymm2,%ymm2 vpxor 64(%rsi),%ymm3,%ymm3 vpxor 96(%rsi),%ymm7,%ymm7 leaq 128(%rsi),%rsi vmovdqu %ymm14,0(%rdi) vmovdqu %ymm2,32(%rdi) vmovdqu %ymm3,64(%rdi) vmovdqu %ymm7,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm11,%ymm11 vpxor 32(%rsi),%ymm9,%ymm9 vpxor 64(%rsi),%ymm0,%ymm0 vpxor 96(%rsi),%ymm4,%ymm4 leaq 128(%rsi),%rsi vmovdqu %ymm11,0(%rdi) vmovdqu %ymm9,32(%rdi) vmovdqu %ymm0,64(%rdi) vmovdqu %ymm4,96(%rdi) leaq 128(%rdi),%rdi subq $512,%rdx jnz .Loop_outer8x jmp .Ldone8x .Ltail8x: cmpq $448,%rdx jae .L448_or_more8x cmpq $384,%rdx jae .L384_or_more8x cmpq $320,%rdx jae .L320_or_more8x cmpq $256,%rdx jae .L256_or_more8x cmpq $192,%rdx jae .L192_or_more8x cmpq $128,%rdx jae .L128_or_more8x cmpq $64,%rdx jae .L64_or_more8x xorq %r10,%r10 vmovdqa %ymm6,0(%rsp) vmovdqa %ymm8,32(%rsp) jmp .Loop_tail8x .align 32 .L64_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) je .Ldone8x leaq 64(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm1,0(%rsp) leaq 64(%rdi),%rdi subq $64,%rdx vmovdqa %ymm5,32(%rsp) jmp .Loop_tail8x .align 32 .L128_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) je .Ldone8x leaq 128(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm12,0(%rsp) leaq 128(%rdi),%rdi subq $128,%rdx vmovdqa %ymm13,32(%rsp) jmp .Loop_tail8x .align 32 .L192_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) je .Ldone8x leaq 192(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm10,0(%rsp) leaq 192(%rdi),%rdi subq $192,%rdx vmovdqa %ymm15,32(%rsp) jmp .Loop_tail8x .align 32 .L256_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) je .Ldone8x leaq 256(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm14,0(%rsp) leaq 256(%rdi),%rdi subq $256,%rdx vmovdqa %ymm2,32(%rsp) jmp .Loop_tail8x .align 32 .L320_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) je .Ldone8x leaq 320(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm3,0(%rsp) leaq 320(%rdi),%rdi subq $320,%rdx vmovdqa %ymm7,32(%rsp) jmp .Loop_tail8x .align 32 .L384_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vpxor 320(%rsi),%ymm3,%ymm3 vpxor 352(%rsi),%ymm7,%ymm7 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) vmovdqu %ymm3,320(%rdi) vmovdqu %ymm7,352(%rdi) je .Ldone8x leaq 384(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm11,0(%rsp) leaq 384(%rdi),%rdi subq $384,%rdx vmovdqa %ymm9,32(%rsp) jmp .Loop_tail8x .align 32 .L448_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vpxor 320(%rsi),%ymm3,%ymm3 vpxor 352(%rsi),%ymm7,%ymm7 vpxor 384(%rsi),%ymm11,%ymm11 vpxor 416(%rsi),%ymm9,%ymm9 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) vmovdqu %ymm3,320(%rdi) vmovdqu %ymm7,352(%rdi) vmovdqu %ymm11,384(%rdi) vmovdqu %ymm9,416(%rdi) je .Ldone8x leaq 448(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm0,0(%rsp) leaq 448(%rdi),%rdi subq $448,%rdx vmovdqa %ymm4,32(%rsp) .Loop_tail8x: movzbl (%rsi,%r10,1),%eax movzbl (%rsp,%r10,1),%ecx leaq 1(%r10),%r10 xorl %ecx,%eax movb %al,-1(%rdi,%r10,1) decq %rdx jnz .Loop_tail8x .Ldone8x: vzeroall leaq (%r9),%rsp .cfi_def_cfa_register rsp .L8x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size ChaCha20_8x,.-ChaCha20_8x #endif ring-0.16.9/pregenerated/chacha-x86_64-macosx.S000064400000000000000000001000151353224257700171670ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .p2align 6 L$zero: .long 0,0,0,0 L$one: .long 1,0,0,0 L$inc: .long 0,1,2,3 L$four: .long 4,4,4,4 L$incy: .long 0,2,4,6,1,3,5,7 L$eight: .long 8,8,8,8,8,8,8,8 L$rot16: .byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd L$rot24: .byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe L$sigma: .byte 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0 .p2align 6 L$zeroz: .long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 L$fourz: .long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 L$incz: .long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 L$sixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .globl _GFp_ChaCha20_ctr32 .private_extern _GFp_ChaCha20_ctr32 .p2align 6 _GFp_ChaCha20_ctr32: cmpq $0,%rdx je L$no_data movq _GFp_ia32cap_P+4(%rip),%r10 testl $512,%r10d jnz L$ChaCha20_ssse3 pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $64+24,%rsp L$ctr32_body: movdqu (%rcx),%xmm1 movdqu 16(%rcx),%xmm2 movdqu (%r8),%xmm3 movdqa L$one(%rip),%xmm4 movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) movq %rdx,%rbp jmp L$oop_outer .p2align 5 L$oop_outer: movl $0x61707865,%eax movl $0x3320646e,%ebx movl $0x79622d32,%ecx movl $0x6b206574,%edx movl 16(%rsp),%r8d movl 20(%rsp),%r9d movl 24(%rsp),%r10d movl 28(%rsp),%r11d movd %xmm3,%r12d movl 52(%rsp),%r13d movl 56(%rsp),%r14d movl 60(%rsp),%r15d movq %rbp,64+0(%rsp) movl $10,%ebp movq %rsi,64+8(%rsp) .byte 102,72,15,126,214 movq %rdi,64+16(%rsp) movq %rsi,%rdi shrq $32,%rdi jmp L$oop .p2align 5 L$oop: addl %r8d,%eax xorl %eax,%r12d roll $16,%r12d addl %r9d,%ebx xorl %ebx,%r13d roll $16,%r13d addl %r12d,%esi xorl %esi,%r8d roll $12,%r8d addl %r13d,%edi xorl %edi,%r9d roll $12,%r9d addl %r8d,%eax xorl %eax,%r12d roll $8,%r12d addl %r9d,%ebx xorl %ebx,%r13d roll $8,%r13d addl %r12d,%esi xorl %esi,%r8d roll $7,%r8d addl %r13d,%edi xorl %edi,%r9d roll $7,%r9d movl %esi,32(%rsp) movl %edi,36(%rsp) movl 40(%rsp),%esi movl 44(%rsp),%edi addl %r10d,%ecx xorl %ecx,%r14d roll $16,%r14d addl %r11d,%edx xorl %edx,%r15d roll $16,%r15d addl %r14d,%esi xorl %esi,%r10d roll $12,%r10d addl %r15d,%edi xorl %edi,%r11d roll $12,%r11d addl %r10d,%ecx xorl %ecx,%r14d roll $8,%r14d addl %r11d,%edx xorl %edx,%r15d roll $8,%r15d addl %r14d,%esi xorl %esi,%r10d roll $7,%r10d addl %r15d,%edi xorl %edi,%r11d roll $7,%r11d addl %r9d,%eax xorl %eax,%r15d roll $16,%r15d addl %r10d,%ebx xorl %ebx,%r12d roll $16,%r12d addl %r15d,%esi xorl %esi,%r9d roll $12,%r9d addl %r12d,%edi xorl %edi,%r10d roll $12,%r10d addl %r9d,%eax xorl %eax,%r15d roll $8,%r15d addl %r10d,%ebx xorl %ebx,%r12d roll $8,%r12d addl %r15d,%esi xorl %esi,%r9d roll $7,%r9d addl %r12d,%edi xorl %edi,%r10d roll $7,%r10d movl %esi,40(%rsp) movl %edi,44(%rsp) movl 32(%rsp),%esi movl 36(%rsp),%edi addl %r11d,%ecx xorl %ecx,%r13d roll $16,%r13d addl %r8d,%edx xorl %edx,%r14d roll $16,%r14d addl %r13d,%esi xorl %esi,%r11d roll $12,%r11d addl %r14d,%edi xorl %edi,%r8d roll $12,%r8d addl %r11d,%ecx xorl %ecx,%r13d roll $8,%r13d addl %r8d,%edx xorl %edx,%r14d roll $8,%r14d addl %r13d,%esi xorl %esi,%r11d roll $7,%r11d addl %r14d,%edi xorl %edi,%r8d roll $7,%r8d decl %ebp jnz L$oop movl %edi,36(%rsp) movl %esi,32(%rsp) movq 64(%rsp),%rbp movdqa %xmm2,%xmm1 movq 64+8(%rsp),%rsi paddd %xmm4,%xmm3 movq 64+16(%rsp),%rdi addl $0x61707865,%eax addl $0x3320646e,%ebx addl $0x79622d32,%ecx addl $0x6b206574,%edx addl 16(%rsp),%r8d addl 20(%rsp),%r9d addl 24(%rsp),%r10d addl 28(%rsp),%r11d addl 48(%rsp),%r12d addl 52(%rsp),%r13d addl 56(%rsp),%r14d addl 60(%rsp),%r15d paddd 32(%rsp),%xmm1 cmpq $64,%rbp jb L$tail xorl 0(%rsi),%eax xorl 4(%rsi),%ebx xorl 8(%rsi),%ecx xorl 12(%rsi),%edx xorl 16(%rsi),%r8d xorl 20(%rsi),%r9d xorl 24(%rsi),%r10d xorl 28(%rsi),%r11d movdqu 32(%rsi),%xmm0 xorl 48(%rsi),%r12d xorl 52(%rsi),%r13d xorl 56(%rsi),%r14d xorl 60(%rsi),%r15d leaq 64(%rsi),%rsi pxor %xmm1,%xmm0 movdqa %xmm2,32(%rsp) movd %xmm3,48(%rsp) movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) movdqu %xmm0,32(%rdi) movl %r12d,48(%rdi) movl %r13d,52(%rdi) movl %r14d,56(%rdi) movl %r15d,60(%rdi) leaq 64(%rdi),%rdi subq $64,%rbp jnz L$oop_outer jmp L$done .p2align 4 L$tail: movl %eax,0(%rsp) movl %ebx,4(%rsp) xorq %rbx,%rbx movl %ecx,8(%rsp) movl %edx,12(%rsp) movl %r8d,16(%rsp) movl %r9d,20(%rsp) movl %r10d,24(%rsp) movl %r11d,28(%rsp) movdqa %xmm1,32(%rsp) movl %r12d,48(%rsp) movl %r13d,52(%rsp) movl %r14d,56(%rsp) movl %r15d,60(%rsp) L$oop_tail: movzbl (%rsi,%rbx,1),%eax movzbl (%rsp,%rbx,1),%edx leaq 1(%rbx),%rbx xorl %edx,%eax movb %al,-1(%rdi,%rbx,1) decq %rbp jnz L$oop_tail L$done: leaq 64+24+48(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$no_data: .byte 0xf3,0xc3 .p2align 5 ChaCha20_ssse3: L$ChaCha20_ssse3: movq %rsp,%r9 cmpq $128,%rdx ja L$ChaCha20_4x L$do_sse3_after_all: subq $64+8,%rsp movdqa L$sigma(%rip),%xmm0 movdqu (%rcx),%xmm1 movdqu 16(%rcx),%xmm2 movdqu (%r8),%xmm3 movdqa L$rot16(%rip),%xmm6 movdqa L$rot24(%rip),%xmm7 movdqa %xmm0,0(%rsp) movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) movq $10,%r8 jmp L$oop_ssse3 .p2align 5 L$oop_outer_ssse3: movdqa L$one(%rip),%xmm3 movdqa 0(%rsp),%xmm0 movdqa 16(%rsp),%xmm1 movdqa 32(%rsp),%xmm2 paddd 48(%rsp),%xmm3 movq $10,%r8 movdqa %xmm3,48(%rsp) jmp L$oop_ssse3 .p2align 5 L$oop_ssse3: paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $57,%xmm1,%xmm1 pshufd $147,%xmm3,%xmm3 nop paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,222 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $20,%xmm1 pslld $12,%xmm4 por %xmm4,%xmm1 paddd %xmm1,%xmm0 pxor %xmm0,%xmm3 .byte 102,15,56,0,223 paddd %xmm3,%xmm2 pxor %xmm2,%xmm1 movdqa %xmm1,%xmm4 psrld $25,%xmm1 pslld $7,%xmm4 por %xmm4,%xmm1 pshufd $78,%xmm2,%xmm2 pshufd $147,%xmm1,%xmm1 pshufd $57,%xmm3,%xmm3 decq %r8 jnz L$oop_ssse3 paddd 0(%rsp),%xmm0 paddd 16(%rsp),%xmm1 paddd 32(%rsp),%xmm2 paddd 48(%rsp),%xmm3 cmpq $64,%rdx jb L$tail_ssse3 movdqu 0(%rsi),%xmm4 movdqu 16(%rsi),%xmm5 pxor %xmm4,%xmm0 movdqu 32(%rsi),%xmm4 pxor %xmm5,%xmm1 movdqu 48(%rsi),%xmm5 leaq 64(%rsi),%rsi pxor %xmm4,%xmm2 pxor %xmm5,%xmm3 movdqu %xmm0,0(%rdi) movdqu %xmm1,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 64(%rdi),%rdi subq $64,%rdx jnz L$oop_outer_ssse3 jmp L$done_ssse3 .p2align 4 L$tail_ssse3: movdqa %xmm0,0(%rsp) movdqa %xmm1,16(%rsp) movdqa %xmm2,32(%rsp) movdqa %xmm3,48(%rsp) xorq %r8,%r8 L$oop_tail_ssse3: movzbl (%rsi,%r8,1),%eax movzbl (%rsp,%r8,1),%ecx leaq 1(%r8),%r8 xorl %ecx,%eax movb %al,-1(%rdi,%r8,1) decq %rdx jnz L$oop_tail_ssse3 L$done_ssse3: leaq (%r9),%rsp L$ssse3_epilogue: .byte 0xf3,0xc3 .p2align 5 ChaCha20_4x: L$ChaCha20_4x: movq %rsp,%r9 movq %r10,%r11 shrq $32,%r10 testq $32,%r10 jnz L$ChaCha20_8x cmpq $192,%rdx ja L$proceed4x andq $71303168,%r11 cmpq $4194304,%r11 je L$do_sse3_after_all L$proceed4x: subq $0x140+8,%rsp movdqa L$sigma(%rip),%xmm11 movdqu (%rcx),%xmm15 movdqu 16(%rcx),%xmm7 movdqu (%r8),%xmm3 leaq 256(%rsp),%rcx leaq L$rot16(%rip),%r10 leaq L$rot24(%rip),%r11 pshufd $0x00,%xmm11,%xmm8 pshufd $0x55,%xmm11,%xmm9 movdqa %xmm8,64(%rsp) pshufd $0xaa,%xmm11,%xmm10 movdqa %xmm9,80(%rsp) pshufd $0xff,%xmm11,%xmm11 movdqa %xmm10,96(%rsp) movdqa %xmm11,112(%rsp) pshufd $0x00,%xmm15,%xmm12 pshufd $0x55,%xmm15,%xmm13 movdqa %xmm12,128-256(%rcx) pshufd $0xaa,%xmm15,%xmm14 movdqa %xmm13,144-256(%rcx) pshufd $0xff,%xmm15,%xmm15 movdqa %xmm14,160-256(%rcx) movdqa %xmm15,176-256(%rcx) pshufd $0x00,%xmm7,%xmm4 pshufd $0x55,%xmm7,%xmm5 movdqa %xmm4,192-256(%rcx) pshufd $0xaa,%xmm7,%xmm6 movdqa %xmm5,208-256(%rcx) pshufd $0xff,%xmm7,%xmm7 movdqa %xmm6,224-256(%rcx) movdqa %xmm7,240-256(%rcx) pshufd $0x00,%xmm3,%xmm0 pshufd $0x55,%xmm3,%xmm1 paddd L$inc(%rip),%xmm0 pshufd $0xaa,%xmm3,%xmm2 movdqa %xmm1,272-256(%rcx) pshufd $0xff,%xmm3,%xmm3 movdqa %xmm2,288-256(%rcx) movdqa %xmm3,304-256(%rcx) jmp L$oop_enter4x .p2align 5 L$oop_outer4x: movdqa 64(%rsp),%xmm8 movdqa 80(%rsp),%xmm9 movdqa 96(%rsp),%xmm10 movdqa 112(%rsp),%xmm11 movdqa 128-256(%rcx),%xmm12 movdqa 144-256(%rcx),%xmm13 movdqa 160-256(%rcx),%xmm14 movdqa 176-256(%rcx),%xmm15 movdqa 192-256(%rcx),%xmm4 movdqa 208-256(%rcx),%xmm5 movdqa 224-256(%rcx),%xmm6 movdqa 240-256(%rcx),%xmm7 movdqa 256-256(%rcx),%xmm0 movdqa 272-256(%rcx),%xmm1 movdqa 288-256(%rcx),%xmm2 movdqa 304-256(%rcx),%xmm3 paddd L$four(%rip),%xmm0 L$oop_enter4x: movdqa %xmm6,32(%rsp) movdqa %xmm7,48(%rsp) movdqa (%r10),%xmm7 movl $10,%eax movdqa %xmm0,256-256(%rcx) jmp L$oop4x .p2align 5 L$oop4x: paddd %xmm12,%xmm8 paddd %xmm13,%xmm9 pxor %xmm8,%xmm0 pxor %xmm9,%xmm1 .byte 102,15,56,0,199 .byte 102,15,56,0,207 paddd %xmm0,%xmm4 paddd %xmm1,%xmm5 pxor %xmm4,%xmm12 pxor %xmm5,%xmm13 movdqa %xmm12,%xmm6 pslld $12,%xmm12 psrld $20,%xmm6 movdqa %xmm13,%xmm7 pslld $12,%xmm13 por %xmm6,%xmm12 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm13 paddd %xmm12,%xmm8 paddd %xmm13,%xmm9 pxor %xmm8,%xmm0 pxor %xmm9,%xmm1 .byte 102,15,56,0,198 .byte 102,15,56,0,206 paddd %xmm0,%xmm4 paddd %xmm1,%xmm5 pxor %xmm4,%xmm12 pxor %xmm5,%xmm13 movdqa %xmm12,%xmm7 pslld $7,%xmm12 psrld $25,%xmm7 movdqa %xmm13,%xmm6 pslld $7,%xmm13 por %xmm7,%xmm12 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm13 movdqa %xmm4,0(%rsp) movdqa %xmm5,16(%rsp) movdqa 32(%rsp),%xmm4 movdqa 48(%rsp),%xmm5 paddd %xmm14,%xmm10 paddd %xmm15,%xmm11 pxor %xmm10,%xmm2 pxor %xmm11,%xmm3 .byte 102,15,56,0,215 .byte 102,15,56,0,223 paddd %xmm2,%xmm4 paddd %xmm3,%xmm5 pxor %xmm4,%xmm14 pxor %xmm5,%xmm15 movdqa %xmm14,%xmm6 pslld $12,%xmm14 psrld $20,%xmm6 movdqa %xmm15,%xmm7 pslld $12,%xmm15 por %xmm6,%xmm14 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm15 paddd %xmm14,%xmm10 paddd %xmm15,%xmm11 pxor %xmm10,%xmm2 pxor %xmm11,%xmm3 .byte 102,15,56,0,214 .byte 102,15,56,0,222 paddd %xmm2,%xmm4 paddd %xmm3,%xmm5 pxor %xmm4,%xmm14 pxor %xmm5,%xmm15 movdqa %xmm14,%xmm7 pslld $7,%xmm14 psrld $25,%xmm7 movdqa %xmm15,%xmm6 pslld $7,%xmm15 por %xmm7,%xmm14 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm15 paddd %xmm13,%xmm8 paddd %xmm14,%xmm9 pxor %xmm8,%xmm3 pxor %xmm9,%xmm0 .byte 102,15,56,0,223 .byte 102,15,56,0,199 paddd %xmm3,%xmm4 paddd %xmm0,%xmm5 pxor %xmm4,%xmm13 pxor %xmm5,%xmm14 movdqa %xmm13,%xmm6 pslld $12,%xmm13 psrld $20,%xmm6 movdqa %xmm14,%xmm7 pslld $12,%xmm14 por %xmm6,%xmm13 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm14 paddd %xmm13,%xmm8 paddd %xmm14,%xmm9 pxor %xmm8,%xmm3 pxor %xmm9,%xmm0 .byte 102,15,56,0,222 .byte 102,15,56,0,198 paddd %xmm3,%xmm4 paddd %xmm0,%xmm5 pxor %xmm4,%xmm13 pxor %xmm5,%xmm14 movdqa %xmm13,%xmm7 pslld $7,%xmm13 psrld $25,%xmm7 movdqa %xmm14,%xmm6 pslld $7,%xmm14 por %xmm7,%xmm13 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm14 movdqa %xmm4,32(%rsp) movdqa %xmm5,48(%rsp) movdqa 0(%rsp),%xmm4 movdqa 16(%rsp),%xmm5 paddd %xmm15,%xmm10 paddd %xmm12,%xmm11 pxor %xmm10,%xmm1 pxor %xmm11,%xmm2 .byte 102,15,56,0,207 .byte 102,15,56,0,215 paddd %xmm1,%xmm4 paddd %xmm2,%xmm5 pxor %xmm4,%xmm15 pxor %xmm5,%xmm12 movdqa %xmm15,%xmm6 pslld $12,%xmm15 psrld $20,%xmm6 movdqa %xmm12,%xmm7 pslld $12,%xmm12 por %xmm6,%xmm15 psrld $20,%xmm7 movdqa (%r11),%xmm6 por %xmm7,%xmm12 paddd %xmm15,%xmm10 paddd %xmm12,%xmm11 pxor %xmm10,%xmm1 pxor %xmm11,%xmm2 .byte 102,15,56,0,206 .byte 102,15,56,0,214 paddd %xmm1,%xmm4 paddd %xmm2,%xmm5 pxor %xmm4,%xmm15 pxor %xmm5,%xmm12 movdqa %xmm15,%xmm7 pslld $7,%xmm15 psrld $25,%xmm7 movdqa %xmm12,%xmm6 pslld $7,%xmm12 por %xmm7,%xmm15 psrld $25,%xmm6 movdqa (%r10),%xmm7 por %xmm6,%xmm12 decl %eax jnz L$oop4x paddd 64(%rsp),%xmm8 paddd 80(%rsp),%xmm9 paddd 96(%rsp),%xmm10 paddd 112(%rsp),%xmm11 movdqa %xmm8,%xmm6 punpckldq %xmm9,%xmm8 movdqa %xmm10,%xmm7 punpckldq %xmm11,%xmm10 punpckhdq %xmm9,%xmm6 punpckhdq %xmm11,%xmm7 movdqa %xmm8,%xmm9 punpcklqdq %xmm10,%xmm8 movdqa %xmm6,%xmm11 punpcklqdq %xmm7,%xmm6 punpckhqdq %xmm10,%xmm9 punpckhqdq %xmm7,%xmm11 paddd 128-256(%rcx),%xmm12 paddd 144-256(%rcx),%xmm13 paddd 160-256(%rcx),%xmm14 paddd 176-256(%rcx),%xmm15 movdqa %xmm8,0(%rsp) movdqa %xmm9,16(%rsp) movdqa 32(%rsp),%xmm8 movdqa 48(%rsp),%xmm9 movdqa %xmm12,%xmm10 punpckldq %xmm13,%xmm12 movdqa %xmm14,%xmm7 punpckldq %xmm15,%xmm14 punpckhdq %xmm13,%xmm10 punpckhdq %xmm15,%xmm7 movdqa %xmm12,%xmm13 punpcklqdq %xmm14,%xmm12 movdqa %xmm10,%xmm15 punpcklqdq %xmm7,%xmm10 punpckhqdq %xmm14,%xmm13 punpckhqdq %xmm7,%xmm15 paddd 192-256(%rcx),%xmm4 paddd 208-256(%rcx),%xmm5 paddd 224-256(%rcx),%xmm8 paddd 240-256(%rcx),%xmm9 movdqa %xmm6,32(%rsp) movdqa %xmm11,48(%rsp) movdqa %xmm4,%xmm14 punpckldq %xmm5,%xmm4 movdqa %xmm8,%xmm7 punpckldq %xmm9,%xmm8 punpckhdq %xmm5,%xmm14 punpckhdq %xmm9,%xmm7 movdqa %xmm4,%xmm5 punpcklqdq %xmm8,%xmm4 movdqa %xmm14,%xmm9 punpcklqdq %xmm7,%xmm14 punpckhqdq %xmm8,%xmm5 punpckhqdq %xmm7,%xmm9 paddd 256-256(%rcx),%xmm0 paddd 272-256(%rcx),%xmm1 paddd 288-256(%rcx),%xmm2 paddd 304-256(%rcx),%xmm3 movdqa %xmm0,%xmm8 punpckldq %xmm1,%xmm0 movdqa %xmm2,%xmm7 punpckldq %xmm3,%xmm2 punpckhdq %xmm1,%xmm8 punpckhdq %xmm3,%xmm7 movdqa %xmm0,%xmm1 punpcklqdq %xmm2,%xmm0 movdqa %xmm8,%xmm3 punpcklqdq %xmm7,%xmm8 punpckhqdq %xmm2,%xmm1 punpckhqdq %xmm7,%xmm3 cmpq $256,%rdx jb L$tail4x movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu 0(%rsi),%xmm6 movdqu %xmm11,80(%rdi) movdqu 16(%rsi),%xmm11 movdqu %xmm2,96(%rdi) movdqu 32(%rsi),%xmm2 movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi movdqu 48(%rsi),%xmm7 pxor 32(%rsp),%xmm6 pxor %xmm10,%xmm11 pxor %xmm14,%xmm2 pxor %xmm8,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 48(%rsp),%xmm6 pxor %xmm15,%xmm11 pxor %xmm9,%xmm2 pxor %xmm3,%xmm7 movdqu %xmm6,64(%rdi) movdqu %xmm11,80(%rdi) movdqu %xmm2,96(%rdi) movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi subq $256,%rdx jnz L$oop_outer4x jmp L$done4x L$tail4x: cmpq $192,%rdx jae L$192_or_more4x cmpq $128,%rdx jae L$128_or_more4x cmpq $64,%rdx jae L$64_or_more4x xorq %r10,%r10 movdqa %xmm12,16(%rsp) movdqa %xmm4,32(%rsp) movdqa %xmm0,48(%rsp) jmp L$oop_tail4x .p2align 5 L$64_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu %xmm11,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm7,48(%rdi) je L$done4x movdqa 16(%rsp),%xmm6 leaq 64(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm13,16(%rsp) leaq 64(%rdi),%rdi movdqa %xmm5,32(%rsp) subq $64,%rdx movdqa %xmm1,48(%rsp) jmp L$oop_tail4x .p2align 5 L$128_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu %xmm11,80(%rdi) movdqu %xmm2,96(%rdi) movdqu %xmm7,112(%rdi) je L$done4x movdqa 32(%rsp),%xmm6 leaq 128(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm10,16(%rsp) leaq 128(%rdi),%rdi movdqa %xmm14,32(%rsp) subq $128,%rdx movdqa %xmm8,48(%rsp) jmp L$oop_tail4x .p2align 5 L$192_or_more4x: movdqu 0(%rsi),%xmm6 movdqu 16(%rsi),%xmm11 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm7 pxor 0(%rsp),%xmm6 pxor %xmm12,%xmm11 pxor %xmm4,%xmm2 pxor %xmm0,%xmm7 movdqu %xmm6,0(%rdi) movdqu 64(%rsi),%xmm6 movdqu %xmm11,16(%rdi) movdqu 80(%rsi),%xmm11 movdqu %xmm2,32(%rdi) movdqu 96(%rsi),%xmm2 movdqu %xmm7,48(%rdi) movdqu 112(%rsi),%xmm7 leaq 128(%rsi),%rsi pxor 16(%rsp),%xmm6 pxor %xmm13,%xmm11 pxor %xmm5,%xmm2 pxor %xmm1,%xmm7 movdqu %xmm6,64(%rdi) movdqu 0(%rsi),%xmm6 movdqu %xmm11,80(%rdi) movdqu 16(%rsi),%xmm11 movdqu %xmm2,96(%rdi) movdqu 32(%rsi),%xmm2 movdqu %xmm7,112(%rdi) leaq 128(%rdi),%rdi movdqu 48(%rsi),%xmm7 pxor 32(%rsp),%xmm6 pxor %xmm10,%xmm11 pxor %xmm14,%xmm2 pxor %xmm8,%xmm7 movdqu %xmm6,0(%rdi) movdqu %xmm11,16(%rdi) movdqu %xmm2,32(%rdi) movdqu %xmm7,48(%rdi) je L$done4x movdqa 48(%rsp),%xmm6 leaq 64(%rsi),%rsi xorq %r10,%r10 movdqa %xmm6,0(%rsp) movdqa %xmm15,16(%rsp) leaq 64(%rdi),%rdi movdqa %xmm9,32(%rsp) subq $192,%rdx movdqa %xmm3,48(%rsp) L$oop_tail4x: movzbl (%rsi,%r10,1),%eax movzbl (%rsp,%r10,1),%ecx leaq 1(%r10),%r10 xorl %ecx,%eax movb %al,-1(%rdi,%r10,1) decq %rdx jnz L$oop_tail4x L$done4x: leaq (%r9),%rsp L$4x_epilogue: .byte 0xf3,0xc3 .p2align 5 ChaCha20_8x: L$ChaCha20_8x: movq %rsp,%r9 subq $0x280+8,%rsp andq $-32,%rsp vzeroupper vbroadcasti128 L$sigma(%rip),%ymm11 vbroadcasti128 (%rcx),%ymm3 vbroadcasti128 16(%rcx),%ymm15 vbroadcasti128 (%r8),%ymm7 leaq 256(%rsp),%rcx leaq 512(%rsp),%rax leaq L$rot16(%rip),%r10 leaq L$rot24(%rip),%r11 vpshufd $0x00,%ymm11,%ymm8 vpshufd $0x55,%ymm11,%ymm9 vmovdqa %ymm8,128-256(%rcx) vpshufd $0xaa,%ymm11,%ymm10 vmovdqa %ymm9,160-256(%rcx) vpshufd $0xff,%ymm11,%ymm11 vmovdqa %ymm10,192-256(%rcx) vmovdqa %ymm11,224-256(%rcx) vpshufd $0x00,%ymm3,%ymm0 vpshufd $0x55,%ymm3,%ymm1 vmovdqa %ymm0,256-256(%rcx) vpshufd $0xaa,%ymm3,%ymm2 vmovdqa %ymm1,288-256(%rcx) vpshufd $0xff,%ymm3,%ymm3 vmovdqa %ymm2,320-256(%rcx) vmovdqa %ymm3,352-256(%rcx) vpshufd $0x00,%ymm15,%ymm12 vpshufd $0x55,%ymm15,%ymm13 vmovdqa %ymm12,384-512(%rax) vpshufd $0xaa,%ymm15,%ymm14 vmovdqa %ymm13,416-512(%rax) vpshufd $0xff,%ymm15,%ymm15 vmovdqa %ymm14,448-512(%rax) vmovdqa %ymm15,480-512(%rax) vpshufd $0x00,%ymm7,%ymm4 vpshufd $0x55,%ymm7,%ymm5 vpaddd L$incy(%rip),%ymm4,%ymm4 vpshufd $0xaa,%ymm7,%ymm6 vmovdqa %ymm5,544-512(%rax) vpshufd $0xff,%ymm7,%ymm7 vmovdqa %ymm6,576-512(%rax) vmovdqa %ymm7,608-512(%rax) jmp L$oop_enter8x .p2align 5 L$oop_outer8x: vmovdqa 128-256(%rcx),%ymm8 vmovdqa 160-256(%rcx),%ymm9 vmovdqa 192-256(%rcx),%ymm10 vmovdqa 224-256(%rcx),%ymm11 vmovdqa 256-256(%rcx),%ymm0 vmovdqa 288-256(%rcx),%ymm1 vmovdqa 320-256(%rcx),%ymm2 vmovdqa 352-256(%rcx),%ymm3 vmovdqa 384-512(%rax),%ymm12 vmovdqa 416-512(%rax),%ymm13 vmovdqa 448-512(%rax),%ymm14 vmovdqa 480-512(%rax),%ymm15 vmovdqa 512-512(%rax),%ymm4 vmovdqa 544-512(%rax),%ymm5 vmovdqa 576-512(%rax),%ymm6 vmovdqa 608-512(%rax),%ymm7 vpaddd L$eight(%rip),%ymm4,%ymm4 L$oop_enter8x: vmovdqa %ymm14,64(%rsp) vmovdqa %ymm15,96(%rsp) vbroadcasti128 (%r10),%ymm15 vmovdqa %ymm4,512-512(%rax) movl $10,%eax jmp L$oop8x .p2align 5 L$oop8x: vpaddd %ymm0,%ymm8,%ymm8 vpxor %ymm4,%ymm8,%ymm4 vpshufb %ymm15,%ymm4,%ymm4 vpaddd %ymm1,%ymm9,%ymm9 vpxor %ymm5,%ymm9,%ymm5 vpshufb %ymm15,%ymm5,%ymm5 vpaddd %ymm4,%ymm12,%ymm12 vpxor %ymm0,%ymm12,%ymm0 vpslld $12,%ymm0,%ymm14 vpsrld $20,%ymm0,%ymm0 vpor %ymm0,%ymm14,%ymm0 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm5,%ymm13,%ymm13 vpxor %ymm1,%ymm13,%ymm1 vpslld $12,%ymm1,%ymm15 vpsrld $20,%ymm1,%ymm1 vpor %ymm1,%ymm15,%ymm1 vpaddd %ymm0,%ymm8,%ymm8 vpxor %ymm4,%ymm8,%ymm4 vpshufb %ymm14,%ymm4,%ymm4 vpaddd %ymm1,%ymm9,%ymm9 vpxor %ymm5,%ymm9,%ymm5 vpshufb %ymm14,%ymm5,%ymm5 vpaddd %ymm4,%ymm12,%ymm12 vpxor %ymm0,%ymm12,%ymm0 vpslld $7,%ymm0,%ymm15 vpsrld $25,%ymm0,%ymm0 vpor %ymm0,%ymm15,%ymm0 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm5,%ymm13,%ymm13 vpxor %ymm1,%ymm13,%ymm1 vpslld $7,%ymm1,%ymm14 vpsrld $25,%ymm1,%ymm1 vpor %ymm1,%ymm14,%ymm1 vmovdqa %ymm12,0(%rsp) vmovdqa %ymm13,32(%rsp) vmovdqa 64(%rsp),%ymm12 vmovdqa 96(%rsp),%ymm13 vpaddd %ymm2,%ymm10,%ymm10 vpxor %ymm6,%ymm10,%ymm6 vpshufb %ymm15,%ymm6,%ymm6 vpaddd %ymm3,%ymm11,%ymm11 vpxor %ymm7,%ymm11,%ymm7 vpshufb %ymm15,%ymm7,%ymm7 vpaddd %ymm6,%ymm12,%ymm12 vpxor %ymm2,%ymm12,%ymm2 vpslld $12,%ymm2,%ymm14 vpsrld $20,%ymm2,%ymm2 vpor %ymm2,%ymm14,%ymm2 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm7,%ymm13,%ymm13 vpxor %ymm3,%ymm13,%ymm3 vpslld $12,%ymm3,%ymm15 vpsrld $20,%ymm3,%ymm3 vpor %ymm3,%ymm15,%ymm3 vpaddd %ymm2,%ymm10,%ymm10 vpxor %ymm6,%ymm10,%ymm6 vpshufb %ymm14,%ymm6,%ymm6 vpaddd %ymm3,%ymm11,%ymm11 vpxor %ymm7,%ymm11,%ymm7 vpshufb %ymm14,%ymm7,%ymm7 vpaddd %ymm6,%ymm12,%ymm12 vpxor %ymm2,%ymm12,%ymm2 vpslld $7,%ymm2,%ymm15 vpsrld $25,%ymm2,%ymm2 vpor %ymm2,%ymm15,%ymm2 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm7,%ymm13,%ymm13 vpxor %ymm3,%ymm13,%ymm3 vpslld $7,%ymm3,%ymm14 vpsrld $25,%ymm3,%ymm3 vpor %ymm3,%ymm14,%ymm3 vpaddd %ymm1,%ymm8,%ymm8 vpxor %ymm7,%ymm8,%ymm7 vpshufb %ymm15,%ymm7,%ymm7 vpaddd %ymm2,%ymm9,%ymm9 vpxor %ymm4,%ymm9,%ymm4 vpshufb %ymm15,%ymm4,%ymm4 vpaddd %ymm7,%ymm12,%ymm12 vpxor %ymm1,%ymm12,%ymm1 vpslld $12,%ymm1,%ymm14 vpsrld $20,%ymm1,%ymm1 vpor %ymm1,%ymm14,%ymm1 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm4,%ymm13,%ymm13 vpxor %ymm2,%ymm13,%ymm2 vpslld $12,%ymm2,%ymm15 vpsrld $20,%ymm2,%ymm2 vpor %ymm2,%ymm15,%ymm2 vpaddd %ymm1,%ymm8,%ymm8 vpxor %ymm7,%ymm8,%ymm7 vpshufb %ymm14,%ymm7,%ymm7 vpaddd %ymm2,%ymm9,%ymm9 vpxor %ymm4,%ymm9,%ymm4 vpshufb %ymm14,%ymm4,%ymm4 vpaddd %ymm7,%ymm12,%ymm12 vpxor %ymm1,%ymm12,%ymm1 vpslld $7,%ymm1,%ymm15 vpsrld $25,%ymm1,%ymm1 vpor %ymm1,%ymm15,%ymm1 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm4,%ymm13,%ymm13 vpxor %ymm2,%ymm13,%ymm2 vpslld $7,%ymm2,%ymm14 vpsrld $25,%ymm2,%ymm2 vpor %ymm2,%ymm14,%ymm2 vmovdqa %ymm12,64(%rsp) vmovdqa %ymm13,96(%rsp) vmovdqa 0(%rsp),%ymm12 vmovdqa 32(%rsp),%ymm13 vpaddd %ymm3,%ymm10,%ymm10 vpxor %ymm5,%ymm10,%ymm5 vpshufb %ymm15,%ymm5,%ymm5 vpaddd %ymm0,%ymm11,%ymm11 vpxor %ymm6,%ymm11,%ymm6 vpshufb %ymm15,%ymm6,%ymm6 vpaddd %ymm5,%ymm12,%ymm12 vpxor %ymm3,%ymm12,%ymm3 vpslld $12,%ymm3,%ymm14 vpsrld $20,%ymm3,%ymm3 vpor %ymm3,%ymm14,%ymm3 vbroadcasti128 (%r11),%ymm14 vpaddd %ymm6,%ymm13,%ymm13 vpxor %ymm0,%ymm13,%ymm0 vpslld $12,%ymm0,%ymm15 vpsrld $20,%ymm0,%ymm0 vpor %ymm0,%ymm15,%ymm0 vpaddd %ymm3,%ymm10,%ymm10 vpxor %ymm5,%ymm10,%ymm5 vpshufb %ymm14,%ymm5,%ymm5 vpaddd %ymm0,%ymm11,%ymm11 vpxor %ymm6,%ymm11,%ymm6 vpshufb %ymm14,%ymm6,%ymm6 vpaddd %ymm5,%ymm12,%ymm12 vpxor %ymm3,%ymm12,%ymm3 vpslld $7,%ymm3,%ymm15 vpsrld $25,%ymm3,%ymm3 vpor %ymm3,%ymm15,%ymm3 vbroadcasti128 (%r10),%ymm15 vpaddd %ymm6,%ymm13,%ymm13 vpxor %ymm0,%ymm13,%ymm0 vpslld $7,%ymm0,%ymm14 vpsrld $25,%ymm0,%ymm0 vpor %ymm0,%ymm14,%ymm0 decl %eax jnz L$oop8x leaq 512(%rsp),%rax vpaddd 128-256(%rcx),%ymm8,%ymm8 vpaddd 160-256(%rcx),%ymm9,%ymm9 vpaddd 192-256(%rcx),%ymm10,%ymm10 vpaddd 224-256(%rcx),%ymm11,%ymm11 vpunpckldq %ymm9,%ymm8,%ymm14 vpunpckldq %ymm11,%ymm10,%ymm15 vpunpckhdq %ymm9,%ymm8,%ymm8 vpunpckhdq %ymm11,%ymm10,%ymm10 vpunpcklqdq %ymm15,%ymm14,%ymm9 vpunpckhqdq %ymm15,%ymm14,%ymm14 vpunpcklqdq %ymm10,%ymm8,%ymm11 vpunpckhqdq %ymm10,%ymm8,%ymm8 vpaddd 256-256(%rcx),%ymm0,%ymm0 vpaddd 288-256(%rcx),%ymm1,%ymm1 vpaddd 320-256(%rcx),%ymm2,%ymm2 vpaddd 352-256(%rcx),%ymm3,%ymm3 vpunpckldq %ymm1,%ymm0,%ymm10 vpunpckldq %ymm3,%ymm2,%ymm15 vpunpckhdq %ymm1,%ymm0,%ymm0 vpunpckhdq %ymm3,%ymm2,%ymm2 vpunpcklqdq %ymm15,%ymm10,%ymm1 vpunpckhqdq %ymm15,%ymm10,%ymm10 vpunpcklqdq %ymm2,%ymm0,%ymm3 vpunpckhqdq %ymm2,%ymm0,%ymm0 vperm2i128 $0x20,%ymm1,%ymm9,%ymm15 vperm2i128 $0x31,%ymm1,%ymm9,%ymm1 vperm2i128 $0x20,%ymm10,%ymm14,%ymm9 vperm2i128 $0x31,%ymm10,%ymm14,%ymm10 vperm2i128 $0x20,%ymm3,%ymm11,%ymm14 vperm2i128 $0x31,%ymm3,%ymm11,%ymm3 vperm2i128 $0x20,%ymm0,%ymm8,%ymm11 vperm2i128 $0x31,%ymm0,%ymm8,%ymm0 vmovdqa %ymm15,0(%rsp) vmovdqa %ymm9,32(%rsp) vmovdqa 64(%rsp),%ymm15 vmovdqa 96(%rsp),%ymm9 vpaddd 384-512(%rax),%ymm12,%ymm12 vpaddd 416-512(%rax),%ymm13,%ymm13 vpaddd 448-512(%rax),%ymm15,%ymm15 vpaddd 480-512(%rax),%ymm9,%ymm9 vpunpckldq %ymm13,%ymm12,%ymm2 vpunpckldq %ymm9,%ymm15,%ymm8 vpunpckhdq %ymm13,%ymm12,%ymm12 vpunpckhdq %ymm9,%ymm15,%ymm15 vpunpcklqdq %ymm8,%ymm2,%ymm13 vpunpckhqdq %ymm8,%ymm2,%ymm2 vpunpcklqdq %ymm15,%ymm12,%ymm9 vpunpckhqdq %ymm15,%ymm12,%ymm12 vpaddd 512-512(%rax),%ymm4,%ymm4 vpaddd 544-512(%rax),%ymm5,%ymm5 vpaddd 576-512(%rax),%ymm6,%ymm6 vpaddd 608-512(%rax),%ymm7,%ymm7 vpunpckldq %ymm5,%ymm4,%ymm15 vpunpckldq %ymm7,%ymm6,%ymm8 vpunpckhdq %ymm5,%ymm4,%ymm4 vpunpckhdq %ymm7,%ymm6,%ymm6 vpunpcklqdq %ymm8,%ymm15,%ymm5 vpunpckhqdq %ymm8,%ymm15,%ymm15 vpunpcklqdq %ymm6,%ymm4,%ymm7 vpunpckhqdq %ymm6,%ymm4,%ymm4 vperm2i128 $0x20,%ymm5,%ymm13,%ymm8 vperm2i128 $0x31,%ymm5,%ymm13,%ymm5 vperm2i128 $0x20,%ymm15,%ymm2,%ymm13 vperm2i128 $0x31,%ymm15,%ymm2,%ymm15 vperm2i128 $0x20,%ymm7,%ymm9,%ymm2 vperm2i128 $0x31,%ymm7,%ymm9,%ymm7 vperm2i128 $0x20,%ymm4,%ymm12,%ymm9 vperm2i128 $0x31,%ymm4,%ymm12,%ymm4 vmovdqa 0(%rsp),%ymm6 vmovdqa 32(%rsp),%ymm12 cmpq $512,%rdx jb L$tail8x vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 leaq 128(%rsi),%rsi vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm12,%ymm12 vpxor 32(%rsi),%ymm13,%ymm13 vpxor 64(%rsi),%ymm10,%ymm10 vpxor 96(%rsi),%ymm15,%ymm15 leaq 128(%rsi),%rsi vmovdqu %ymm12,0(%rdi) vmovdqu %ymm13,32(%rdi) vmovdqu %ymm10,64(%rdi) vmovdqu %ymm15,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm14,%ymm14 vpxor 32(%rsi),%ymm2,%ymm2 vpxor 64(%rsi),%ymm3,%ymm3 vpxor 96(%rsi),%ymm7,%ymm7 leaq 128(%rsi),%rsi vmovdqu %ymm14,0(%rdi) vmovdqu %ymm2,32(%rdi) vmovdqu %ymm3,64(%rdi) vmovdqu %ymm7,96(%rdi) leaq 128(%rdi),%rdi vpxor 0(%rsi),%ymm11,%ymm11 vpxor 32(%rsi),%ymm9,%ymm9 vpxor 64(%rsi),%ymm0,%ymm0 vpxor 96(%rsi),%ymm4,%ymm4 leaq 128(%rsi),%rsi vmovdqu %ymm11,0(%rdi) vmovdqu %ymm9,32(%rdi) vmovdqu %ymm0,64(%rdi) vmovdqu %ymm4,96(%rdi) leaq 128(%rdi),%rdi subq $512,%rdx jnz L$oop_outer8x jmp L$done8x L$tail8x: cmpq $448,%rdx jae L$448_or_more8x cmpq $384,%rdx jae L$384_or_more8x cmpq $320,%rdx jae L$320_or_more8x cmpq $256,%rdx jae L$256_or_more8x cmpq $192,%rdx jae L$192_or_more8x cmpq $128,%rdx jae L$128_or_more8x cmpq $64,%rdx jae L$64_or_more8x xorq %r10,%r10 vmovdqa %ymm6,0(%rsp) vmovdqa %ymm8,32(%rsp) jmp L$oop_tail8x .p2align 5 L$64_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) je L$done8x leaq 64(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm1,0(%rsp) leaq 64(%rdi),%rdi subq $64,%rdx vmovdqa %ymm5,32(%rsp) jmp L$oop_tail8x .p2align 5 L$128_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) je L$done8x leaq 128(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm12,0(%rsp) leaq 128(%rdi),%rdi subq $128,%rdx vmovdqa %ymm13,32(%rsp) jmp L$oop_tail8x .p2align 5 L$192_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) je L$done8x leaq 192(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm10,0(%rsp) leaq 192(%rdi),%rdi subq $192,%rdx vmovdqa %ymm15,32(%rsp) jmp L$oop_tail8x .p2align 5 L$256_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) je L$done8x leaq 256(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm14,0(%rsp) leaq 256(%rdi),%rdi subq $256,%rdx vmovdqa %ymm2,32(%rsp) jmp L$oop_tail8x .p2align 5 L$320_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) je L$done8x leaq 320(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm3,0(%rsp) leaq 320(%rdi),%rdi subq $320,%rdx vmovdqa %ymm7,32(%rsp) jmp L$oop_tail8x .p2align 5 L$384_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vpxor 320(%rsi),%ymm3,%ymm3 vpxor 352(%rsi),%ymm7,%ymm7 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) vmovdqu %ymm3,320(%rdi) vmovdqu %ymm7,352(%rdi) je L$done8x leaq 384(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm11,0(%rsp) leaq 384(%rdi),%rdi subq $384,%rdx vmovdqa %ymm9,32(%rsp) jmp L$oop_tail8x .p2align 5 L$448_or_more8x: vpxor 0(%rsi),%ymm6,%ymm6 vpxor 32(%rsi),%ymm8,%ymm8 vpxor 64(%rsi),%ymm1,%ymm1 vpxor 96(%rsi),%ymm5,%ymm5 vpxor 128(%rsi),%ymm12,%ymm12 vpxor 160(%rsi),%ymm13,%ymm13 vpxor 192(%rsi),%ymm10,%ymm10 vpxor 224(%rsi),%ymm15,%ymm15 vpxor 256(%rsi),%ymm14,%ymm14 vpxor 288(%rsi),%ymm2,%ymm2 vpxor 320(%rsi),%ymm3,%ymm3 vpxor 352(%rsi),%ymm7,%ymm7 vpxor 384(%rsi),%ymm11,%ymm11 vpxor 416(%rsi),%ymm9,%ymm9 vmovdqu %ymm6,0(%rdi) vmovdqu %ymm8,32(%rdi) vmovdqu %ymm1,64(%rdi) vmovdqu %ymm5,96(%rdi) vmovdqu %ymm12,128(%rdi) vmovdqu %ymm13,160(%rdi) vmovdqu %ymm10,192(%rdi) vmovdqu %ymm15,224(%rdi) vmovdqu %ymm14,256(%rdi) vmovdqu %ymm2,288(%rdi) vmovdqu %ymm3,320(%rdi) vmovdqu %ymm7,352(%rdi) vmovdqu %ymm11,384(%rdi) vmovdqu %ymm9,416(%rdi) je L$done8x leaq 448(%rsi),%rsi xorq %r10,%r10 vmovdqa %ymm0,0(%rsp) leaq 448(%rdi),%rdi subq $448,%rdx vmovdqa %ymm4,32(%rsp) L$oop_tail8x: movzbl (%rsi,%r10,1),%eax movzbl (%rsp,%r10,1),%ecx leaq 1(%r10),%r10 xorl %ecx,%eax movb %al,-1(%rdi,%r10,1) decq %rdx jnz L$oop_tail8x L$done8x: vzeroall leaq (%r9),%rsp L$8x_epilogue: .byte 0xf3,0xc3 #endif ring-0.16.9/pregenerated/chacha-x86_64-nasm.obj000064400000000000000000000674611353224260300172120ustar0000000000000000dEi]d\.text!d" p`.pdata!0x"" @0@.xdata!8 #X# @@@.debug$S:#^@B.debug$T d@B      expand 32-byte kffffff. ChaCha20 for x86_64, CRYPTOGAMS by fH|$Ht$HHHLLLD$(HLASUATAUAVAWHXo oQAofo%fL$fT$ f\$0HfDexpand 32-byte kDD$DL$DT$D\$fA~Dl$4Dt$8D|$"?(@/A6B<D=F>H@JBLDNFPJUNVSWXX`[f\l]r^u_zacdefghijklmnpqrstuvwy{|} ~ !$(+.258<?BFILPTX\`cfjmptwz~  $'*.148;>BEHLORVY\`bhlpuy~     "%)-15:>BFJN R!X#]%`'c(g)j*n+r,w-|./01234789:;<=@ACEGIKMPQRVXY Z \]^_`e!g(h.k2l7m<oDpHqMrRsZtbvgwmxsyyz{}  %*.38=>BFKOSW\aeimrvz~  %+17:?DHJORX]bejoq        ! & + 0 8 ? F "L #R $Y %_ &f 'l (s )z + , - . / 0 1 2 4 5 6 7 8 9 : ; = > ? @ A B C D F H J' K. L5 M< NB OH PN QT RY S^ Tc Uh Vl Wq Xv Y{ Z ] ^ _ ` a b d f g h i j k l m n o p q r s t u v w x y$ z) {. |3 }8 ~= A E J O T Z _ d j o t y ~                                 $ ) / 4 9 ? D I N S X ] b g l q u y ~                                " ( - 2 7 < A F J N S X ] c h m s x }                            #(-27;@EKQW]c j!q"x$}%&'()*+,-./01235689:;<=>?@AB CDEFG$I)J-K1L5M:N>OBPFQKRPSTTXU_VeXiYoZt[y\~]^_abcdefghijklmopqrstuvwxy z{}~"(-27<CINSW\bglsz  &*-29=CGMR`djoty~ $*/49>BFJOU[`ejov|       #!'")#.$1%7(?)G*O+T,Y-^.c/h0m1r2u5z67;=>?ABCDEJLMNOPQRSTUVWY defg#h+i3j:kAmGnMoRpXq]rcshtmvrwwx{yz{|} "',16;?DINV\bgkpu !'-15:>BGKOTY]bfjotx|      #(,05:>CGKPUY_ejpt x!}"#$%&'()*+,-./0123456789:;<=>?@ABDEF G%H*J/K4L9M>NCOHPMQRRVS[T`UeWiXmYqZu[z\]^_`abcdefghijlmnoqrstuvwx yz{|~!%)-27;?EKQW]ciotz  #',16=AFKPW^dipv}  $).37<AFLSV[biot     #+3 7!<"A#F$N%V&^'f(l*s+v,{-./02456789:;<=>?@ABCDEFG&H,J3K6L;MBNIOOPTR`TdUiVnWsX{YZ[\]^_`abcdefghijkl nopq"r)s/t4v@xDyIzN{S|[}c~ks{ ")/49=?DGMPX`hmrw|      & - 4 8 < C J Q U X ] a d g k n r v z ~                              ! " $ % & ' ) + , - . 0!1!2 !3!5!9 !;!!<"!=#!>$!?&!@(!A*!B,!C-!D1!F5!G 8> 8? 8? 8@ 8@ 8A 8A 8B 8B 8C 8C 9D 9D #9E '9E >9F B9F Y9G ]9G s9H w9H 9I 9I 9J 9J 9L 9L 9M 9M 9N 9N :O :O -:R 1:R Y:S ]:S :T :T :U :U .fileg.text!,L$zeroL$oneL$inc L$four0L$incy@L$eight`L$rot16L$rot24L$sigmaL$zerozL$fourzL$incz@:DW vJL$oopL$tail`L$done  .<+7I VXc:teq   L$oop4x L$tail4xL$done4x7 `"1>uLbnVL$oop8xL$tail8xiL$done8xM@`  /(6Lcn4   !.pdata0 (.xdata8 .debug$S:.debug$T pregenerated\tmp\chacha-x86_64-nasm.asmGFp_ia32cap_PL$sixteenGFp_ChaCha20_ctr32L$SEH_begin_GFp_ChaCha20_ctr32L$no_dataL$ChaCha20_ssse3L$ctr32_bodyL$oop_outerL$oop_tailL$SEH_end_GFp_ChaCha20_ctr32ChaCha20_ssse3L$SEH_begin_ChaCha20_ssse3L$ChaCha20_4xL$do_sse3_after_allL$ssse3_bodyL$oop_ssse3L$oop_outer_ssse3L$tail_ssse3L$done_ssse3L$oop_tail_ssse3L$ssse3_epilogueL$SEH_end_ChaCha20_ssse3ChaCha20_4xL$SEH_begin_ChaCha20_4xL$ChaCha20_8xL$proceed4xL$4x_bodyL$oop_enter4xL$oop_outer4xL$192_or_more4xL$128_or_more4xL$64_or_more4xL$oop_tail4xL$4x_epilogueL$SEH_end_ChaCha20_4xChaCha20_8xL$SEH_begin_ChaCha20_8xL$8x_bodyL$oop_enter8xL$oop_outer8xL$448_or_more8xL$384_or_more8xL$320_or_more8xL$256_or_more8xL$192_or_more8xL$128_or_more8xL$64_or_more8xL$oop_tail8xL$8x_epilogueL$SEH_end_ChaCha20_8x__imp_RtlVirtualUnwindse_handlerL$common_seh_tailssse3_handlerfull_handlerL$SEH_info_GFp_ChaCha20_ctr32L$SEH_info_ChaCha20_ssse3L$SEH_info_ChaCha20_4xL$SEH_info_ChaCha20_8xring-0.16.9/pregenerated/ecp_nistz256-armv4-ios32.S000064400000000000000000000763401353224261100177550ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 6 #ifdef __thumb2__ .thumb_func __ecp_nistz256_mul_by_2 #endif .align 4 __ecp_nistz256_mul_by_2: ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] adds r4,r4,r4 @ a[0:7]+=a[0:7], i.e. add with itself ldr r7,[r1,#12] adcs r5,r5,r5 ldr r8,[r1,#16] adcs r6,r6,r6 ldr r9,[r1,#20] adcs r7,r7,r7 ldr r10,[r1,#24] adcs r8,r8,r8 ldr r11,[r1,#28] adcs r9,r9,r9 adcs r10,r10,r10 mov r3,#0 adcs r11,r11,r11 adc r3,r3,#0 b Lreduce_by_sub @ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl _GFp_nistz256_add .private_extern _GFp_nistz256_add #ifdef __thumb2__ .thumb_func _GFp_nistz256_add #endif .align 4 _GFp_nistz256_add: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_add #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func __ecp_nistz256_add #endif .align 4 __ecp_nistz256_add: str lr,[sp,#-4]! @ push lr ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] ldr r7,[r1,#12] ldr r8,[r1,#16] ldr r3,[r2,#0] ldr r9,[r1,#20] ldr r12,[r2,#4] ldr r10,[r1,#24] ldr r14,[r2,#8] ldr r11,[r1,#28] ldr r1,[r2,#12] adds r4,r4,r3 ldr r3,[r2,#16] adcs r5,r5,r12 ldr r12,[r2,#20] adcs r6,r6,r14 ldr r14,[r2,#24] adcs r7,r7,r1 ldr r1,[r2,#28] adcs r8,r8,r3 adcs r9,r9,r12 adcs r10,r10,r14 mov r3,#0 adcs r11,r11,r1 adc r3,r3,#0 ldr lr,[sp],#4 @ pop lr Lreduce_by_sub: @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs r4,r4,#-1 sbcs r5,r5,#-1 sbcs r6,r6,#-1 sbcs r7,r7,#0 sbcs r8,r8,#0 sbcs r9,r9,#0 sbcs r10,r10,#1 sbcs r11,r11,#-1 sbc r3,r3,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow r3 register... adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 str r4,[r0,#0] adcs r6,r6,r3 str r5,[r0,#4] adcs r7,r7,#0 str r6,[r0,#8] adcs r8,r8,#0 str r7,[r0,#12] adcs r9,r9,#0 str r8,[r0,#16] adcs r10,r10,r3,lsr#31 str r9,[r0,#20] adcs r11,r11,r3 str r10,[r0,#24] str r11,[r0,#28] mov pc,lr #ifdef __thumb2__ .thumb_func __ecp_nistz256_mul_by_3 #endif .align 4 __ecp_nistz256_mul_by_3: str lr,[sp,#-4]! @ push lr @ As multiplication by 3 is performed as 2*n+n, below are inline @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see @ corresponding subroutines for details. ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] adds r4,r4,r4 @ a[0:7]+=a[0:7] ldr r7,[r1,#12] adcs r5,r5,r5 ldr r8,[r1,#16] adcs r6,r6,r6 ldr r9,[r1,#20] adcs r7,r7,r7 ldr r10,[r1,#24] adcs r8,r8,r8 ldr r11,[r1,#28] adcs r9,r9,r9 adcs r10,r10,r10 mov r3,#0 adcs r11,r11,r11 adc r3,r3,#0 subs r4,r4,#-1 @ Lreduce_by_sub but without stores sbcs r5,r5,#-1 sbcs r6,r6,#-1 sbcs r7,r7,#0 sbcs r8,r8,#0 sbcs r9,r9,#0 sbcs r10,r10,#1 sbcs r11,r11,#-1 sbc r3,r3,#0 adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 adcs r6,r6,r3 adcs r7,r7,#0 adcs r8,r8,#0 ldr r2,[r1,#0] adcs r9,r9,#0 ldr r12,[r1,#4] adcs r10,r10,r3,lsr#31 ldr r14,[r1,#8] adc r11,r11,r3 ldr r3,[r1,#12] adds r4,r4,r2 @ 2*a[0:7]+=a[0:7] ldr r2,[r1,#16] adcs r5,r5,r12 ldr r12,[r1,#20] adcs r6,r6,r14 ldr r14,[r1,#24] adcs r7,r7,r3 ldr r1,[r1,#28] adcs r8,r8,r2 adcs r9,r9,r12 adcs r10,r10,r14 mov r3,#0 adcs r11,r11,r1 adc r3,r3,#0 ldr lr,[sp],#4 @ pop lr b Lreduce_by_sub #ifdef __thumb2__ .thumb_func __ecp_nistz256_div_by_2 #endif .align 4 __ecp_nistz256_div_by_2: @ ret = (a is odd ? a+mod : a) >> 1 ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] mov r3,r4,lsl#31 @ place least significant bit to most @ significant position, now arithmetic @ right shift by 31 will produce -1 or @ 0, while logical right shift 1 or 0, @ this is how modulus is conditionally @ synthesized in this case... ldr r7,[r1,#12] adds r4,r4,r3,asr#31 ldr r8,[r1,#16] adcs r5,r5,r3,asr#31 ldr r9,[r1,#20] adcs r6,r6,r3,asr#31 ldr r10,[r1,#24] adcs r7,r7,#0 ldr r11,[r1,#28] adcs r8,r8,#0 mov r4,r4,lsr#1 @ a[0:7]>>=1, we can start early @ because it doesn't affect flags adcs r9,r9,#0 orr r4,r4,r5,lsl#31 adcs r10,r10,r3,lsr#31 mov r2,#0 adcs r11,r11,r3,asr#31 mov r5,r5,lsr#1 adc r2,r2,#0 @ top-most carry bit from addition orr r5,r5,r6,lsl#31 mov r6,r6,lsr#1 str r4,[r0,#0] orr r6,r6,r7,lsl#31 mov r7,r7,lsr#1 str r5,[r0,#4] orr r7,r7,r8,lsl#31 mov r8,r8,lsr#1 str r6,[r0,#8] orr r8,r8,r9,lsl#31 mov r9,r9,lsr#1 str r7,[r0,#12] orr r9,r9,r10,lsl#31 mov r10,r10,lsr#1 str r8,[r0,#16] orr r10,r10,r11,lsl#31 mov r11,r11,lsr#1 str r9,[r0,#20] orr r11,r11,r2,lsl#31 @ don't forget the top-most carry bit str r10,[r0,#24] str r11,[r0,#28] mov pc,lr #ifdef __thumb2__ .thumb_func __ecp_nistz256_sub #endif .align 4 __ecp_nistz256_sub: str lr,[sp,#-4]! @ push lr ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] ldr r7,[r1,#12] ldr r8,[r1,#16] ldr r3,[r2,#0] ldr r9,[r1,#20] ldr r12,[r2,#4] ldr r10,[r1,#24] ldr r14,[r2,#8] ldr r11,[r1,#28] ldr r1,[r2,#12] subs r4,r4,r3 ldr r3,[r2,#16] sbcs r5,r5,r12 ldr r12,[r2,#20] sbcs r6,r6,r14 ldr r14,[r2,#24] sbcs r7,r7,r1 ldr r1,[r2,#28] sbcs r8,r8,r3 sbcs r9,r9,r12 sbcs r10,r10,r14 sbcs r11,r11,r1 sbc r3,r3,r3 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr Lreduce_by_add: @ if a-b borrows, add modulus. @ @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, r3, and using it as @ a whole or extracting single bit. adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 str r4,[r0,#0] adcs r6,r6,r3 str r5,[r0,#4] adcs r7,r7,#0 str r6,[r0,#8] adcs r8,r8,#0 str r7,[r0,#12] adcs r9,r9,#0 str r8,[r0,#16] adcs r10,r10,r3,lsr#31 str r9,[r0,#20] adcs r11,r11,r3 str r10,[r0,#24] str r11,[r0,#28] mov pc,lr @ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); .globl _GFp_nistz256_neg .private_extern _GFp_nistz256_neg #ifdef __thumb2__ .thumb_func _GFp_nistz256_neg #endif .align 4 _GFp_nistz256_neg: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_neg #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func __ecp_nistz256_neg #endif .align 4 __ecp_nistz256_neg: ldr r4,[r1,#0] eor r3,r3,r3 ldr r5,[r1,#4] ldr r6,[r1,#8] subs r4,r3,r4 ldr r7,[r1,#12] sbcs r5,r3,r5 ldr r8,[r1,#16] sbcs r6,r3,r6 ldr r9,[r1,#20] sbcs r7,r3,r7 ldr r10,[r1,#24] sbcs r8,r3,r8 ldr r11,[r1,#28] sbcs r9,r3,r9 sbcs r10,r3,r10 sbcs r11,r3,r11 sbc r3,r3,r3 b Lreduce_by_add @ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl _GFp_nistz256_mul_mont .private_extern _GFp_nistz256_mul_mont #ifdef __thumb2__ .thumb_func _GFp_nistz256_mul_mont #endif .align 4 _GFp_nistz256_mul_mont: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_mul_mont #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func __ecp_nistz256_mul_mont #endif .align 4 __ecp_nistz256_mul_mont: stmdb sp!,{r0,r1,r2,lr} @ make a copy of arguments too ldr r2,[r2,#0] @ b[0] ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} umull r3,r14,r4,r2 @ r[0]=a[0]*b[0] stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy a[0-7] to stack, so @ that it can be addressed @ without spending register @ on address umull r4,r0,r5,r2 @ r[1]=a[1]*b[0] umull r5,r1,r6,r2 adds r4,r4,r14 @ accumulate high part of mult umull r6,r12,r7,r2 adcs r5,r5,r0 umull r7,r14,r8,r2 adcs r6,r6,r1 umull r8,r0,r9,r2 adcs r7,r7,r12 umull r9,r1,r10,r2 adcs r8,r8,r14 umull r10,r12,r11,r2 adcs r9,r9,r0 adcs r10,r10,r1 eor r14,r14,r14 @ first overflow bit is zero adc r11,r12,#0 @ multiplication-less reduction 1 adds r6,r6,r3 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r7,r7,#0 @ r[4]+=0 adcs r8,r8,#0 @ r[5]+=0 adcs r9,r9,r3 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r10,r10,#0 @ r[7]+=0 ldr r2,[r2,#4*1] @ load b[i] adcs r11,r11,r3 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r10,r10,r3 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r11,r11,#0 @ r[8]-=0 umlal r4,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r3,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r5,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r3,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r3,[sp,#12] @ a[3], r3 is alias r3 umlal r6,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r5,r5,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r7,r14,r3,r2 @ "r[3]"+=a[3]*b[i] eor r3,r3,r3 adcs r6,r6,r1 ldr r1,[sp,#20] @ a[5] umlal r8,r3,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r7,r7,r12 ldr r12,[sp,#24] @ a[6] umlal r9,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r8,r8,r14 ldr r14,[sp,#28] @ a[7] umlal r10,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r9,r9,r3 ldr r3,[sp,#36] @ restore overflow bit umlal r11,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r10,r10,r0 adcs r11,r11,r1 adcs r3,r3,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 2 adds r7,r7,r4 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r8,r8,#0 @ r[4]+=0 adcs r9,r9,#0 @ r[5]+=0 adcs r10,r10,r4 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r11,r11,#0 @ r[7]+=0 ldr r2,[r2,#4*2] @ load b[i] adcs r3,r3,r4 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r11,r11,r4 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r3,r3,#0 @ r[8]-=0 umlal r5,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r4,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r6,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r4,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r4,[sp,#12] @ a[3], r4 is alias r4 umlal r7,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r6,r6,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r8,r14,r4,r2 @ "r[3]"+=a[3]*b[i] eor r4,r4,r4 adcs r7,r7,r1 ldr r1,[sp,#20] @ a[5] umlal r9,r4,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r8,r8,r12 ldr r12,[sp,#24] @ a[6] umlal r10,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r9,r9,r14 ldr r14,[sp,#28] @ a[7] umlal r11,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r10,r10,r4 ldr r4,[sp,#36] @ restore overflow bit umlal r3,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r11,r11,r0 adcs r3,r3,r1 adcs r4,r4,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 3 adds r8,r8,r5 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r9,r9,#0 @ r[4]+=0 adcs r10,r10,#0 @ r[5]+=0 adcs r11,r11,r5 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r3,r3,#0 @ r[7]+=0 ldr r2,[r2,#4*3] @ load b[i] adcs r4,r4,r5 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r3,r3,r5 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r4,r4,#0 @ r[8]-=0 umlal r6,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r5,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r7,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r5,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r5,[sp,#12] @ a[3], r5 is alias r5 umlal r8,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r7,r7,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r9,r14,r5,r2 @ "r[3]"+=a[3]*b[i] eor r5,r5,r5 adcs r8,r8,r1 ldr r1,[sp,#20] @ a[5] umlal r10,r5,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r9,r9,r12 ldr r12,[sp,#24] @ a[6] umlal r11,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r10,r10,r14 ldr r14,[sp,#28] @ a[7] umlal r3,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r11,r11,r5 ldr r5,[sp,#36] @ restore overflow bit umlal r4,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r3,r3,r0 adcs r4,r4,r1 adcs r5,r5,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 4 adds r9,r9,r6 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r10,r10,#0 @ r[4]+=0 adcs r11,r11,#0 @ r[5]+=0 adcs r3,r3,r6 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r4,r4,#0 @ r[7]+=0 ldr r2,[r2,#4*4] @ load b[i] adcs r5,r5,r6 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r4,r4,r6 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r5,r5,#0 @ r[8]-=0 umlal r7,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r6,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r8,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r6,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r6,[sp,#12] @ a[3], r6 is alias r6 umlal r9,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r8,r8,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r10,r14,r6,r2 @ "r[3]"+=a[3]*b[i] eor r6,r6,r6 adcs r9,r9,r1 ldr r1,[sp,#20] @ a[5] umlal r11,r6,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r10,r10,r12 ldr r12,[sp,#24] @ a[6] umlal r3,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r11,r11,r14 ldr r14,[sp,#28] @ a[7] umlal r4,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r3,r3,r6 ldr r6,[sp,#36] @ restore overflow bit umlal r5,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r4,r4,r0 adcs r5,r5,r1 adcs r6,r6,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 5 adds r10,r10,r7 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r11,r11,#0 @ r[4]+=0 adcs r3,r3,#0 @ r[5]+=0 adcs r4,r4,r7 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r5,r5,#0 @ r[7]+=0 ldr r2,[r2,#4*5] @ load b[i] adcs r6,r6,r7 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r5,r5,r7 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r6,r6,#0 @ r[8]-=0 umlal r8,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r7,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r9,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r7,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r7,[sp,#12] @ a[3], r7 is alias r7 umlal r10,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r9,r9,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r11,r14,r7,r2 @ "r[3]"+=a[3]*b[i] eor r7,r7,r7 adcs r10,r10,r1 ldr r1,[sp,#20] @ a[5] umlal r3,r7,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r11,r11,r12 ldr r12,[sp,#24] @ a[6] umlal r4,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r3,r3,r14 ldr r14,[sp,#28] @ a[7] umlal r5,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r4,r4,r7 ldr r7,[sp,#36] @ restore overflow bit umlal r6,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r5,r5,r0 adcs r6,r6,r1 adcs r7,r7,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 6 adds r11,r11,r8 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r3,r3,#0 @ r[4]+=0 adcs r4,r4,#0 @ r[5]+=0 adcs r5,r5,r8 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r6,r6,#0 @ r[7]+=0 ldr r2,[r2,#4*6] @ load b[i] adcs r7,r7,r8 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r6,r6,r8 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r7,r7,#0 @ r[8]-=0 umlal r9,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r8,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r10,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r8,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r8,[sp,#12] @ a[3], r8 is alias r8 umlal r11,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r10,r10,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r3,r14,r8,r2 @ "r[3]"+=a[3]*b[i] eor r8,r8,r8 adcs r11,r11,r1 ldr r1,[sp,#20] @ a[5] umlal r4,r8,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r3,r3,r12 ldr r12,[sp,#24] @ a[6] umlal r5,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r4,r4,r14 ldr r14,[sp,#28] @ a[7] umlal r6,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r5,r5,r8 ldr r8,[sp,#36] @ restore overflow bit umlal r7,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r6,r6,r0 adcs r7,r7,r1 adcs r8,r8,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 7 adds r3,r3,r9 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r4,r4,#0 @ r[4]+=0 adcs r5,r5,#0 @ r[5]+=0 adcs r6,r6,r9 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r7,r7,#0 @ r[7]+=0 ldr r2,[r2,#4*7] @ load b[i] adcs r8,r8,r9 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r7,r7,r9 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r8,r8,#0 @ r[8]-=0 umlal r10,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r9,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r11,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r9,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r9,[sp,#12] @ a[3], r9 is alias r9 umlal r3,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r11,r11,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r4,r14,r9,r2 @ "r[3]"+=a[3]*b[i] eor r9,r9,r9 adcs r3,r3,r1 ldr r1,[sp,#20] @ a[5] umlal r5,r9,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r4,r4,r12 ldr r12,[sp,#24] @ a[6] umlal r6,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r5,r5,r14 ldr r14,[sp,#28] @ a[7] umlal r7,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r6,r6,r9 ldr r9,[sp,#36] @ restore overflow bit umlal r8,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r7,r7,r0 adcs r8,r8,r1 adcs r9,r9,r12 adc r14,r14,#0 @ new overflow bit @ last multiplication-less reduction adds r4,r4,r10 ldr r0,[sp,#32] @ restore r_ptr adcs r5,r5,#0 adcs r6,r6,#0 adcs r7,r7,r10 adcs r8,r8,#0 adcs r9,r9,r10 adc r14,r14,#0 subs r8,r8,r10 sbcs r9,r9,#0 sbc r10,r14,#0 @ overflow bit @ Final step is "if result > mod, subtract mod", but we do it @ "other way around", namely subtract modulus from result @ and if it borrowed, add modulus back. adds r11,r11,#1 @ subs r11,r11,#-1 adcs r3,r3,#0 @ sbcs r3,r3,#-1 adcs r4,r4,#0 @ sbcs r4,r4,#-1 sbcs r5,r5,#0 sbcs r6,r6,#0 sbcs r7,r7,#0 sbcs r8,r8,#1 adcs r9,r9,#0 @ sbcs r9,r9,#-1 ldr lr,[sp,#44] @ restore lr sbc r10,r10,#0 @ broadcast borrow bit add sp,sp,#48 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, r10, and using it as @ a whole or extracting single bit. adds r11,r11,r10 @ add modulus or zero adcs r3,r3,r10 str r11,[r0,#0] adcs r4,r4,r10 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r10,lsr#31 str r7,[r0,#20] adc r9,r9,r10 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr #ifdef __thumb2__ .thumb_func __ecp_nistz256_sub_from #endif .align 5 __ecp_nistz256_sub_from: str lr,[sp,#-4]! @ push lr ldr r10,[r2,#0] ldr r12,[r2,#4] ldr r14,[r2,#8] ldr r1,[r2,#12] subs r11,r11,r10 ldr r10,[r2,#16] sbcs r3,r3,r12 ldr r12,[r2,#20] sbcs r4,r4,r14 ldr r14,[r2,#24] sbcs r5,r5,r1 ldr r1,[r2,#28] sbcs r6,r6,r10 sbcs r7,r7,r12 sbcs r8,r8,r14 sbcs r9,r9,r1 sbc r2,r2,r2 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr #ifdef __thumb2__ .thumb_func __ecp_nistz256_sub_morf #endif .align 5 __ecp_nistz256_sub_morf: str lr,[sp,#-4]! @ push lr ldr r10,[r2,#0] ldr r12,[r2,#4] ldr r14,[r2,#8] ldr r1,[r2,#12] subs r11,r10,r11 ldr r10,[r2,#16] sbcs r3,r12,r3 ldr r12,[r2,#20] sbcs r4,r14,r4 ldr r14,[r2,#24] sbcs r5,r1,r5 ldr r1,[r2,#28] sbcs r6,r10,r6 sbcs r7,r12,r7 sbcs r8,r14,r8 sbcs r9,r1,r9 sbc r2,r2,r2 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr #ifdef __thumb2__ .thumb_func __ecp_nistz256_add_self #endif .align 4 __ecp_nistz256_add_self: adds r11,r11,r11 @ a[0:7]+=a[0:7] adcs r3,r3,r3 adcs r4,r4,r4 adcs r5,r5,r5 adcs r6,r6,r6 adcs r7,r7,r7 adcs r8,r8,r8 mov r2,#0 adcs r9,r9,r9 adc r2,r2,#0 @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs r11,r11,#-1 sbcs r3,r3,#-1 sbcs r4,r4,#-1 sbcs r5,r5,#0 sbcs r6,r6,#0 sbcs r7,r7,#0 sbcs r8,r8,#1 sbcs r9,r9,#-1 sbc r2,r2,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow r2 register... adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr .globl _GFp_nistz256_point_double .private_extern _GFp_nistz256_point_double #ifdef __thumb2__ .thumb_func _GFp_nistz256_point_double #endif .align 5 _GFp_nistz256_point_double: stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*5 Lpoint_double_shortcut: add r3,sp,#96 ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in_x stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} add r0,sp,#0 bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); add r2,r1,#32 add r1,r1,#32 add r0,sp,#64 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); add r1,sp,#0 add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); ldr r2,[sp,#32*5+4] add r1,r2,#32 add r2,r2,#64 add r0,sp,#128 bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); ldr r0,[sp,#32*5] add r0,r0,#64 bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); add r1,sp,#96 add r2,sp,#64 add r0,sp,#32 bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); add r1,sp,#96 add r2,sp,#64 add r0,sp,#64 bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); add r1,sp,#0 add r2,sp,#0 add r0,sp,#128 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); add r1,sp,#64 add r2,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); ldr r0,[sp,#32*5] add r1,sp,#128 add r0,r0,#32 bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); add r1,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); add r1,sp,#96 add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); add r0,sp,#128 bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); ldr r0,[sp,#32*5] add r1,sp,#32 add r2,sp,#32 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); add r2,sp,#128 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); add r1,sp,#32 add r2,sp,#0 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); ldr r0,[sp,#32*5] add r2,r0,#32 add r0,r0,#32 bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .globl _GFp_nistz256_point_add_affine .private_extern _GFp_nistz256_point_add_affine #ifdef __thumb2__ .thumb_func _GFp_nistz256_point_add_affine #endif .align 5 _GFp_nistz256_point_add_affine: stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*15 ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_x add r3,sp,#96 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_y stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_z orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} str r12,[sp,#32*15+4] @ !in1infty ldmia r2!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in2_x add r3,sp,#192 orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r2!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in2_y orr r12,r12,r4 orr r12,r12,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 str r12,[sp,#32*15+8] @ !in2infty add r1,sp,#160 add r2,sp,#160 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z1sqr, in1_z); add r1,sp,#288 add r2,sp,#192 add r0,sp,#256 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, Z1sqr, in2_x); add r2,sp,#96 add r0,sp,#320 bl __ecp_nistz256_sub_from @ p256_sub(H, U2, in1_x); add r1,sp,#288 add r2,sp,#160 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, Z1sqr, in1_z); add r1,sp,#320 add r2,sp,#160 add r0,sp,#64 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, H, in1_z); add r1,sp,#224 add r2,sp,#288 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S2, in2_y); add r2,sp,#128 add r0,sp,#352 bl __ecp_nistz256_sub_from @ p256_sub(R, S2, in1_y); add r1,sp,#320 add r2,sp,#320 add r0,sp,#384 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Hsqr, H); add r1,sp,#352 add r2,sp,#352 add r0,sp,#448 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Rsqr, R); add r1,sp,#320 add r2,sp,#384 add r0,sp,#416 bl __ecp_nistz256_mul_mont @ p256_mul_mont(Hcub, Hsqr, H); add r1,sp,#384 add r2,sp,#96 add r0,sp,#256 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, in1_x, Hsqr); add r0,sp,#384 bl __ecp_nistz256_add_self @ p256_mul_by_2(Hsqr, U2); add r2,sp,#448 add r0,sp,#0 bl __ecp_nistz256_sub_morf @ p256_sub(res_x, Rsqr, Hsqr); add r2,sp,#416 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, Hcub); add r2,sp,#256 add r0,sp,#32 bl __ecp_nistz256_sub_morf @ p256_sub(res_y, U2, res_x); add r1,sp,#416 add r2,sp,#128 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, in1_y, Hcub); add r1,sp,#352 add r2,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_y, res_y, R); add r2,sp,#288 bl __ecp_nistz256_sub_from @ p256_sub(res_y, res_y, S2); ldr r11,[sp,#32*15+4] @ !in1intfy ldr r12,[sp,#32*15+8] @ !in2intfy add r1,sp,#0 add r2,sp,#192 and r10,r11,r12 mvn r11,r11 add r3,sp,#96 and r11,r11,r12 mvn r12,r12 ldr r0,[sp,#32*15] ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#1 and r7,r11,#0 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#0 and r7,r11,#-1 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#-1 and r7,r11,#-1 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#-2 and r7,r11,#0 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} add sp,sp,#32*15+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ecp_nistz256-armv4-linux32.S000064400000000000000000000772271353224261200203300ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 6 .type __ecp_nistz256_mul_by_2,%function .align 4 __ecp_nistz256_mul_by_2: ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] adds r4,r4,r4 @ a[0:7]+=a[0:7], i.e. add with itself ldr r7,[r1,#12] adcs r5,r5,r5 ldr r8,[r1,#16] adcs r6,r6,r6 ldr r9,[r1,#20] adcs r7,r7,r7 ldr r10,[r1,#24] adcs r8,r8,r8 ldr r11,[r1,#28] adcs r9,r9,r9 adcs r10,r10,r10 mov r3,#0 adcs r11,r11,r11 adc r3,r3,#0 b .Lreduce_by_sub .size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2 @ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl GFp_nistz256_add .hidden GFp_nistz256_add .type GFp_nistz256_add,%function .align 4 GFp_nistz256_add: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_add #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_add,.-GFp_nistz256_add .type __ecp_nistz256_add,%function .align 4 __ecp_nistz256_add: str lr,[sp,#-4]! @ push lr ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] ldr r7,[r1,#12] ldr r8,[r1,#16] ldr r3,[r2,#0] ldr r9,[r1,#20] ldr r12,[r2,#4] ldr r10,[r1,#24] ldr r14,[r2,#8] ldr r11,[r1,#28] ldr r1,[r2,#12] adds r4,r4,r3 ldr r3,[r2,#16] adcs r5,r5,r12 ldr r12,[r2,#20] adcs r6,r6,r14 ldr r14,[r2,#24] adcs r7,r7,r1 ldr r1,[r2,#28] adcs r8,r8,r3 adcs r9,r9,r12 adcs r10,r10,r14 mov r3,#0 adcs r11,r11,r1 adc r3,r3,#0 ldr lr,[sp],#4 @ pop lr .Lreduce_by_sub: @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs r4,r4,#-1 sbcs r5,r5,#-1 sbcs r6,r6,#-1 sbcs r7,r7,#0 sbcs r8,r8,#0 sbcs r9,r9,#0 sbcs r10,r10,#1 sbcs r11,r11,#-1 sbc r3,r3,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow r3 register... adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 str r4,[r0,#0] adcs r6,r6,r3 str r5,[r0,#4] adcs r7,r7,#0 str r6,[r0,#8] adcs r8,r8,#0 str r7,[r0,#12] adcs r9,r9,#0 str r8,[r0,#16] adcs r10,r10,r3,lsr#31 str r9,[r0,#20] adcs r11,r11,r3 str r10,[r0,#24] str r11,[r0,#28] mov pc,lr .size __ecp_nistz256_add,.-__ecp_nistz256_add .type __ecp_nistz256_mul_by_3,%function .align 4 __ecp_nistz256_mul_by_3: str lr,[sp,#-4]! @ push lr @ As multiplication by 3 is performed as 2*n+n, below are inline @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see @ corresponding subroutines for details. ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] adds r4,r4,r4 @ a[0:7]+=a[0:7] ldr r7,[r1,#12] adcs r5,r5,r5 ldr r8,[r1,#16] adcs r6,r6,r6 ldr r9,[r1,#20] adcs r7,r7,r7 ldr r10,[r1,#24] adcs r8,r8,r8 ldr r11,[r1,#28] adcs r9,r9,r9 adcs r10,r10,r10 mov r3,#0 adcs r11,r11,r11 adc r3,r3,#0 subs r4,r4,#-1 @ .Lreduce_by_sub but without stores sbcs r5,r5,#-1 sbcs r6,r6,#-1 sbcs r7,r7,#0 sbcs r8,r8,#0 sbcs r9,r9,#0 sbcs r10,r10,#1 sbcs r11,r11,#-1 sbc r3,r3,#0 adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 adcs r6,r6,r3 adcs r7,r7,#0 adcs r8,r8,#0 ldr r2,[r1,#0] adcs r9,r9,#0 ldr r12,[r1,#4] adcs r10,r10,r3,lsr#31 ldr r14,[r1,#8] adc r11,r11,r3 ldr r3,[r1,#12] adds r4,r4,r2 @ 2*a[0:7]+=a[0:7] ldr r2,[r1,#16] adcs r5,r5,r12 ldr r12,[r1,#20] adcs r6,r6,r14 ldr r14,[r1,#24] adcs r7,r7,r3 ldr r1,[r1,#28] adcs r8,r8,r2 adcs r9,r9,r12 adcs r10,r10,r14 mov r3,#0 adcs r11,r11,r1 adc r3,r3,#0 ldr lr,[sp],#4 @ pop lr b .Lreduce_by_sub .size __ecp_nistz256_mul_by_3,.-__ecp_nistz256_mul_by_3 .type __ecp_nistz256_div_by_2,%function .align 4 __ecp_nistz256_div_by_2: @ ret = (a is odd ? a+mod : a) >> 1 ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] mov r3,r4,lsl#31 @ place least significant bit to most @ significant position, now arithmetic @ right shift by 31 will produce -1 or @ 0, while logical right shift 1 or 0, @ this is how modulus is conditionally @ synthesized in this case... ldr r7,[r1,#12] adds r4,r4,r3,asr#31 ldr r8,[r1,#16] adcs r5,r5,r3,asr#31 ldr r9,[r1,#20] adcs r6,r6,r3,asr#31 ldr r10,[r1,#24] adcs r7,r7,#0 ldr r11,[r1,#28] adcs r8,r8,#0 mov r4,r4,lsr#1 @ a[0:7]>>=1, we can start early @ because it doesn't affect flags adcs r9,r9,#0 orr r4,r4,r5,lsl#31 adcs r10,r10,r3,lsr#31 mov r2,#0 adcs r11,r11,r3,asr#31 mov r5,r5,lsr#1 adc r2,r2,#0 @ top-most carry bit from addition orr r5,r5,r6,lsl#31 mov r6,r6,lsr#1 str r4,[r0,#0] orr r6,r6,r7,lsl#31 mov r7,r7,lsr#1 str r5,[r0,#4] orr r7,r7,r8,lsl#31 mov r8,r8,lsr#1 str r6,[r0,#8] orr r8,r8,r9,lsl#31 mov r9,r9,lsr#1 str r7,[r0,#12] orr r9,r9,r10,lsl#31 mov r10,r10,lsr#1 str r8,[r0,#16] orr r10,r10,r11,lsl#31 mov r11,r11,lsr#1 str r9,[r0,#20] orr r11,r11,r2,lsl#31 @ don't forget the top-most carry bit str r10,[r0,#24] str r11,[r0,#28] mov pc,lr .size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 .type __ecp_nistz256_sub,%function .align 4 __ecp_nistz256_sub: str lr,[sp,#-4]! @ push lr ldr r4,[r1,#0] ldr r5,[r1,#4] ldr r6,[r1,#8] ldr r7,[r1,#12] ldr r8,[r1,#16] ldr r3,[r2,#0] ldr r9,[r1,#20] ldr r12,[r2,#4] ldr r10,[r1,#24] ldr r14,[r2,#8] ldr r11,[r1,#28] ldr r1,[r2,#12] subs r4,r4,r3 ldr r3,[r2,#16] sbcs r5,r5,r12 ldr r12,[r2,#20] sbcs r6,r6,r14 ldr r14,[r2,#24] sbcs r7,r7,r1 ldr r1,[r2,#28] sbcs r8,r8,r3 sbcs r9,r9,r12 sbcs r10,r10,r14 sbcs r11,r11,r1 sbc r3,r3,r3 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr .Lreduce_by_add: @ if a-b borrows, add modulus. @ @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, r3, and using it as @ a whole or extracting single bit. adds r4,r4,r3 @ add synthesized modulus adcs r5,r5,r3 str r4,[r0,#0] adcs r6,r6,r3 str r5,[r0,#4] adcs r7,r7,#0 str r6,[r0,#8] adcs r8,r8,#0 str r7,[r0,#12] adcs r9,r9,#0 str r8,[r0,#16] adcs r10,r10,r3,lsr#31 str r9,[r0,#20] adcs r11,r11,r3 str r10,[r0,#24] str r11,[r0,#28] mov pc,lr .size __ecp_nistz256_sub,.-__ecp_nistz256_sub @ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); .globl GFp_nistz256_neg .hidden GFp_nistz256_neg .type GFp_nistz256_neg,%function .align 4 GFp_nistz256_neg: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_neg #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_neg,.-GFp_nistz256_neg .type __ecp_nistz256_neg,%function .align 4 __ecp_nistz256_neg: ldr r4,[r1,#0] eor r3,r3,r3 ldr r5,[r1,#4] ldr r6,[r1,#8] subs r4,r3,r4 ldr r7,[r1,#12] sbcs r5,r3,r5 ldr r8,[r1,#16] sbcs r6,r3,r6 ldr r9,[r1,#20] sbcs r7,r3,r7 ldr r10,[r1,#24] sbcs r8,r3,r8 ldr r11,[r1,#28] sbcs r9,r3,r9 sbcs r10,r3,r10 sbcs r11,r3,r11 sbc r3,r3,r3 b .Lreduce_by_add .size __ecp_nistz256_neg,.-__ecp_nistz256_neg @ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], @ const BN_ULONG r2[8]); .globl GFp_nistz256_mul_mont .hidden GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,%function .align 4 GFp_nistz256_mul_mont: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bl __ecp_nistz256_mul_mont #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont .type __ecp_nistz256_mul_mont,%function .align 4 __ecp_nistz256_mul_mont: stmdb sp!,{r0,r1,r2,lr} @ make a copy of arguments too ldr r2,[r2,#0] @ b[0] ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} umull r3,r14,r4,r2 @ r[0]=a[0]*b[0] stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy a[0-7] to stack, so @ that it can be addressed @ without spending register @ on address umull r4,r0,r5,r2 @ r[1]=a[1]*b[0] umull r5,r1,r6,r2 adds r4,r4,r14 @ accumulate high part of mult umull r6,r12,r7,r2 adcs r5,r5,r0 umull r7,r14,r8,r2 adcs r6,r6,r1 umull r8,r0,r9,r2 adcs r7,r7,r12 umull r9,r1,r10,r2 adcs r8,r8,r14 umull r10,r12,r11,r2 adcs r9,r9,r0 adcs r10,r10,r1 eor r14,r14,r14 @ first overflow bit is zero adc r11,r12,#0 @ multiplication-less reduction 1 adds r6,r6,r3 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r7,r7,#0 @ r[4]+=0 adcs r8,r8,#0 @ r[5]+=0 adcs r9,r9,r3 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r10,r10,#0 @ r[7]+=0 ldr r2,[r2,#4*1] @ load b[i] adcs r11,r11,r3 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r10,r10,r3 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r11,r11,#0 @ r[8]-=0 umlal r4,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r3,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r5,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r3,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r3,[sp,#12] @ a[3], r3 is alias r3 umlal r6,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r5,r5,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r7,r14,r3,r2 @ "r[3]"+=a[3]*b[i] eor r3,r3,r3 adcs r6,r6,r1 ldr r1,[sp,#20] @ a[5] umlal r8,r3,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r7,r7,r12 ldr r12,[sp,#24] @ a[6] umlal r9,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r8,r8,r14 ldr r14,[sp,#28] @ a[7] umlal r10,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r9,r9,r3 ldr r3,[sp,#36] @ restore overflow bit umlal r11,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r10,r10,r0 adcs r11,r11,r1 adcs r3,r3,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 2 adds r7,r7,r4 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r8,r8,#0 @ r[4]+=0 adcs r9,r9,#0 @ r[5]+=0 adcs r10,r10,r4 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r11,r11,#0 @ r[7]+=0 ldr r2,[r2,#4*2] @ load b[i] adcs r3,r3,r4 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r11,r11,r4 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r3,r3,#0 @ r[8]-=0 umlal r5,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r4,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r6,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r4,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r4,[sp,#12] @ a[3], r4 is alias r4 umlal r7,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r6,r6,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r8,r14,r4,r2 @ "r[3]"+=a[3]*b[i] eor r4,r4,r4 adcs r7,r7,r1 ldr r1,[sp,#20] @ a[5] umlal r9,r4,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r8,r8,r12 ldr r12,[sp,#24] @ a[6] umlal r10,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r9,r9,r14 ldr r14,[sp,#28] @ a[7] umlal r11,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r10,r10,r4 ldr r4,[sp,#36] @ restore overflow bit umlal r3,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r11,r11,r0 adcs r3,r3,r1 adcs r4,r4,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 3 adds r8,r8,r5 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r9,r9,#0 @ r[4]+=0 adcs r10,r10,#0 @ r[5]+=0 adcs r11,r11,r5 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r3,r3,#0 @ r[7]+=0 ldr r2,[r2,#4*3] @ load b[i] adcs r4,r4,r5 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r3,r3,r5 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r4,r4,#0 @ r[8]-=0 umlal r6,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r5,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r7,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r5,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r5,[sp,#12] @ a[3], r5 is alias r5 umlal r8,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r7,r7,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r9,r14,r5,r2 @ "r[3]"+=a[3]*b[i] eor r5,r5,r5 adcs r8,r8,r1 ldr r1,[sp,#20] @ a[5] umlal r10,r5,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r9,r9,r12 ldr r12,[sp,#24] @ a[6] umlal r11,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r10,r10,r14 ldr r14,[sp,#28] @ a[7] umlal r3,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r11,r11,r5 ldr r5,[sp,#36] @ restore overflow bit umlal r4,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r3,r3,r0 adcs r4,r4,r1 adcs r5,r5,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 4 adds r9,r9,r6 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r10,r10,#0 @ r[4]+=0 adcs r11,r11,#0 @ r[5]+=0 adcs r3,r3,r6 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r4,r4,#0 @ r[7]+=0 ldr r2,[r2,#4*4] @ load b[i] adcs r5,r5,r6 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r4,r4,r6 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r5,r5,#0 @ r[8]-=0 umlal r7,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r6,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r8,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r6,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r6,[sp,#12] @ a[3], r6 is alias r6 umlal r9,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r8,r8,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r10,r14,r6,r2 @ "r[3]"+=a[3]*b[i] eor r6,r6,r6 adcs r9,r9,r1 ldr r1,[sp,#20] @ a[5] umlal r11,r6,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r10,r10,r12 ldr r12,[sp,#24] @ a[6] umlal r3,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r11,r11,r14 ldr r14,[sp,#28] @ a[7] umlal r4,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r3,r3,r6 ldr r6,[sp,#36] @ restore overflow bit umlal r5,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r4,r4,r0 adcs r5,r5,r1 adcs r6,r6,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 5 adds r10,r10,r7 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r11,r11,#0 @ r[4]+=0 adcs r3,r3,#0 @ r[5]+=0 adcs r4,r4,r7 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r5,r5,#0 @ r[7]+=0 ldr r2,[r2,#4*5] @ load b[i] adcs r6,r6,r7 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r5,r5,r7 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r6,r6,#0 @ r[8]-=0 umlal r8,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r7,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r9,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r7,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r7,[sp,#12] @ a[3], r7 is alias r7 umlal r10,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r9,r9,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r11,r14,r7,r2 @ "r[3]"+=a[3]*b[i] eor r7,r7,r7 adcs r10,r10,r1 ldr r1,[sp,#20] @ a[5] umlal r3,r7,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r11,r11,r12 ldr r12,[sp,#24] @ a[6] umlal r4,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r3,r3,r14 ldr r14,[sp,#28] @ a[7] umlal r5,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r4,r4,r7 ldr r7,[sp,#36] @ restore overflow bit umlal r6,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r5,r5,r0 adcs r6,r6,r1 adcs r7,r7,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 6 adds r11,r11,r8 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r3,r3,#0 @ r[4]+=0 adcs r4,r4,#0 @ r[5]+=0 adcs r5,r5,r8 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r6,r6,#0 @ r[7]+=0 ldr r2,[r2,#4*6] @ load b[i] adcs r7,r7,r8 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r6,r6,r8 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r7,r7,#0 @ r[8]-=0 umlal r9,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r8,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r10,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r8,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r8,[sp,#12] @ a[3], r8 is alias r8 umlal r11,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r10,r10,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r3,r14,r8,r2 @ "r[3]"+=a[3]*b[i] eor r8,r8,r8 adcs r11,r11,r1 ldr r1,[sp,#20] @ a[5] umlal r4,r8,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r3,r3,r12 ldr r12,[sp,#24] @ a[6] umlal r5,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r4,r4,r14 ldr r14,[sp,#28] @ a[7] umlal r6,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r5,r5,r8 ldr r8,[sp,#36] @ restore overflow bit umlal r7,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r6,r6,r0 adcs r7,r7,r1 adcs r8,r8,r12 adc r14,r14,#0 @ new overflow bit @ multiplication-less reduction 7 adds r3,r3,r9 @ r[3]+=r[0] ldr r2,[sp,#40] @ restore b_ptr adcs r4,r4,#0 @ r[4]+=0 adcs r5,r5,#0 @ r[5]+=0 adcs r6,r6,r9 @ r[6]+=r[0] ldr r1,[sp,#0] @ load a[0] adcs r7,r7,#0 @ r[7]+=0 ldr r2,[r2,#4*7] @ load b[i] adcs r8,r8,r9 @ r[8]+=r[0] eor r0,r0,r0 adc r14,r14,#0 @ overflow bit subs r7,r7,r9 @ r[7]-=r[0] ldr r12,[sp,#4] @ a[1] sbcs r8,r8,#0 @ r[8]-=0 umlal r10,r0,r1,r2 @ "r[0]"+=a[0]*b[i] eor r1,r1,r1 sbc r9,r14,#0 @ overflow bit, keep in mind @ that netto result is @ addition of a value which @ makes underflow impossible ldr r14,[sp,#8] @ a[2] umlal r11,r1,r12,r2 @ "r[1]"+=a[1]*b[i] str r9,[sp,#36] @ temporarily offload overflow eor r12,r12,r12 ldr r9,[sp,#12] @ a[3], r9 is alias r9 umlal r3,r12,r14,r2 @ "r[2]"+=a[2]*b[i] eor r14,r14,r14 adds r11,r11,r0 @ accumulate high part of mult ldr r0,[sp,#16] @ a[4] umlal r4,r14,r9,r2 @ "r[3]"+=a[3]*b[i] eor r9,r9,r9 adcs r3,r3,r1 ldr r1,[sp,#20] @ a[5] umlal r5,r9,r0,r2 @ "r[4]"+=a[4]*b[i] eor r0,r0,r0 adcs r4,r4,r12 ldr r12,[sp,#24] @ a[6] umlal r6,r0,r1,r2 @ "r[5]"+=a[5]*b[i] eor r1,r1,r1 adcs r5,r5,r14 ldr r14,[sp,#28] @ a[7] umlal r7,r1,r12,r2 @ "r[6]"+=a[6]*b[i] eor r12,r12,r12 adcs r6,r6,r9 ldr r9,[sp,#36] @ restore overflow bit umlal r8,r12,r14,r2 @ "r[7]"+=a[7]*b[i] eor r14,r14,r14 adcs r7,r7,r0 adcs r8,r8,r1 adcs r9,r9,r12 adc r14,r14,#0 @ new overflow bit @ last multiplication-less reduction adds r4,r4,r10 ldr r0,[sp,#32] @ restore r_ptr adcs r5,r5,#0 adcs r6,r6,#0 adcs r7,r7,r10 adcs r8,r8,#0 adcs r9,r9,r10 adc r14,r14,#0 subs r8,r8,r10 sbcs r9,r9,#0 sbc r10,r14,#0 @ overflow bit @ Final step is "if result > mod, subtract mod", but we do it @ "other way around", namely subtract modulus from result @ and if it borrowed, add modulus back. adds r11,r11,#1 @ subs r11,r11,#-1 adcs r3,r3,#0 @ sbcs r3,r3,#-1 adcs r4,r4,#0 @ sbcs r4,r4,#-1 sbcs r5,r5,#0 sbcs r6,r6,#0 sbcs r7,r7,#0 sbcs r8,r8,#1 adcs r9,r9,#0 @ sbcs r9,r9,#-1 ldr lr,[sp,#44] @ restore lr sbc r10,r10,#0 @ broadcast borrow bit add sp,sp,#48 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ broadcasting borrow bit to a register, r10, and using it as @ a whole or extracting single bit. adds r11,r11,r10 @ add modulus or zero adcs r3,r3,r10 str r11,[r0,#0] adcs r4,r4,r10 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r10,lsr#31 str r7,[r0,#20] adc r9,r9,r10 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr .size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont .type __ecp_nistz256_sub_from,%function .align 5 __ecp_nistz256_sub_from: str lr,[sp,#-4]! @ push lr ldr r10,[r2,#0] ldr r12,[r2,#4] ldr r14,[r2,#8] ldr r1,[r2,#12] subs r11,r11,r10 ldr r10,[r2,#16] sbcs r3,r3,r12 ldr r12,[r2,#20] sbcs r4,r4,r14 ldr r14,[r2,#24] sbcs r5,r5,r1 ldr r1,[r2,#28] sbcs r6,r6,r10 sbcs r7,r7,r12 sbcs r8,r8,r14 sbcs r9,r9,r1 sbc r2,r2,r2 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr .size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from .type __ecp_nistz256_sub_morf,%function .align 5 __ecp_nistz256_sub_morf: str lr,[sp,#-4]! @ push lr ldr r10,[r2,#0] ldr r12,[r2,#4] ldr r14,[r2,#8] ldr r1,[r2,#12] subs r11,r10,r11 ldr r10,[r2,#16] sbcs r3,r12,r3 ldr r12,[r2,#20] sbcs r4,r14,r4 ldr r14,[r2,#24] sbcs r5,r1,r5 ldr r1,[r2,#28] sbcs r6,r10,r6 sbcs r7,r12,r7 sbcs r8,r14,r8 sbcs r9,r1,r9 sbc r2,r2,r2 @ broadcast borrow bit ldr lr,[sp],#4 @ pop lr adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr .size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf .type __ecp_nistz256_add_self,%function .align 4 __ecp_nistz256_add_self: adds r11,r11,r11 @ a[0:7]+=a[0:7] adcs r3,r3,r3 adcs r4,r4,r4 adcs r5,r5,r5 adcs r6,r6,r6 adcs r7,r7,r7 adcs r8,r8,r8 mov r2,#0 adcs r9,r9,r9 adc r2,r2,#0 @ if a+b >= modulus, subtract modulus. @ @ But since comparison implies subtraction, we subtract @ modulus and then add it back if subtraction borrowed. subs r11,r11,#-1 sbcs r3,r3,#-1 sbcs r4,r4,#-1 sbcs r5,r5,#0 sbcs r6,r6,#0 sbcs r7,r7,#0 sbcs r8,r8,#1 sbcs r9,r9,#-1 sbc r2,r2,#0 @ Note that because mod has special form, i.e. consists of @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by @ using value of borrow as a whole or extracting single bit. @ Follow r2 register... adds r11,r11,r2 @ add synthesized modulus adcs r3,r3,r2 str r11,[r0,#0] adcs r4,r4,r2 str r3,[r0,#4] adcs r5,r5,#0 str r4,[r0,#8] adcs r6,r6,#0 str r5,[r0,#12] adcs r7,r7,#0 str r6,[r0,#16] adcs r8,r8,r2,lsr#31 str r7,[r0,#20] adcs r9,r9,r2 str r8,[r0,#24] str r9,[r0,#28] mov pc,lr .size __ecp_nistz256_add_self,.-__ecp_nistz256_add_self .globl GFp_nistz256_point_double .hidden GFp_nistz256_point_double .type GFp_nistz256_point_double,%function .align 5 GFp_nistz256_point_double: stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*5 .Lpoint_double_shortcut: add r3,sp,#96 ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in_x stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} add r0,sp,#0 bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); add r2,r1,#32 add r1,r1,#32 add r0,sp,#64 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); add r1,sp,#0 add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); ldr r2,[sp,#32*5+4] add r1,r2,#32 add r2,r2,#64 add r0,sp,#128 bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); ldr r0,[sp,#32*5] add r0,r0,#64 bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); add r1,sp,#96 add r2,sp,#64 add r0,sp,#32 bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); add r1,sp,#96 add r2,sp,#64 add r0,sp,#64 bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); add r1,sp,#0 add r2,sp,#0 add r0,sp,#128 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); add r1,sp,#64 add r2,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); ldr r0,[sp,#32*5] add r1,sp,#128 add r0,r0,#32 bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); add r1,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); add r1,sp,#96 add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); add r0,sp,#128 bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); ldr r0,[sp,#32*5] add r1,sp,#32 add r2,sp,#32 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); add r2,sp,#128 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); add r2,sp,#0 add r0,sp,#0 bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); add r1,sp,#32 add r2,sp,#0 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); ldr r0,[sp,#32*5] add r2,r0,#32 add r0,r0,#32 bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_point_double,.-GFp_nistz256_point_double .globl GFp_nistz256_point_add_affine .hidden GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,%function .align 5 GFp_nistz256_point_add_affine: stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional sub sp,sp,#32*15 ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_x add r3,sp,#96 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_y stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in1_z orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} str r12,[sp,#32*15+4] @ !in1infty ldmia r2!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in2_x add r3,sp,#192 orr r12,r4,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} ldmia r2!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in2_y orr r12,r12,r4 orr r12,r12,r5 orr r12,r12,r6 orr r12,r12,r7 orr r12,r12,r8 orr r12,r12,r9 orr r12,r12,r10 orr r12,r12,r11 stmia r3!,{r4,r5,r6,r7,r8,r9,r10,r11} cmp r12,#0 #ifdef __thumb2__ it ne #endif movne r12,#-1 str r12,[sp,#32*15+8] @ !in2infty add r1,sp,#160 add r2,sp,#160 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Z1sqr, in1_z); add r1,sp,#288 add r2,sp,#192 add r0,sp,#256 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, Z1sqr, in2_x); add r2,sp,#96 add r0,sp,#320 bl __ecp_nistz256_sub_from @ p256_sub(H, U2, in1_x); add r1,sp,#288 add r2,sp,#160 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, Z1sqr, in1_z); add r1,sp,#320 add r2,sp,#160 add r0,sp,#64 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_z, H, in1_z); add r1,sp,#224 add r2,sp,#288 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, S2, in2_y); add r2,sp,#128 add r0,sp,#352 bl __ecp_nistz256_sub_from @ p256_sub(R, S2, in1_y); add r1,sp,#320 add r2,sp,#320 add r0,sp,#384 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Hsqr, H); add r1,sp,#352 add r2,sp,#352 add r0,sp,#448 bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Rsqr, R); add r1,sp,#320 add r2,sp,#384 add r0,sp,#416 bl __ecp_nistz256_mul_mont @ p256_mul_mont(Hcub, Hsqr, H); add r1,sp,#384 add r2,sp,#96 add r0,sp,#256 bl __ecp_nistz256_mul_mont @ p256_mul_mont(U2, in1_x, Hsqr); add r0,sp,#384 bl __ecp_nistz256_add_self @ p256_mul_by_2(Hsqr, U2); add r2,sp,#448 add r0,sp,#0 bl __ecp_nistz256_sub_morf @ p256_sub(res_x, Rsqr, Hsqr); add r2,sp,#416 bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, Hcub); add r2,sp,#256 add r0,sp,#32 bl __ecp_nistz256_sub_morf @ p256_sub(res_y, U2, res_x); add r1,sp,#416 add r2,sp,#128 add r0,sp,#288 bl __ecp_nistz256_mul_mont @ p256_mul_mont(S2, in1_y, Hcub); add r1,sp,#352 add r2,sp,#32 add r0,sp,#32 bl __ecp_nistz256_mul_mont @ p256_mul_mont(res_y, res_y, R); add r2,sp,#288 bl __ecp_nistz256_sub_from @ p256_sub(res_y, res_y, S2); ldr r11,[sp,#32*15+4] @ !in1intfy ldr r12,[sp,#32*15+8] @ !in2intfy add r1,sp,#0 add r2,sp,#192 and r10,r11,r12 mvn r11,r11 add r3,sp,#96 and r11,r11,r12 mvn r12,r12 ldr r0,[sp,#32*15] ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_x ldmia r2!,{r6,r7} @ in2_x ldmia r3!,{r8,r9} @ in1_x and r4,r4,r10 and r5,r5,r10 and r6,r6,r11 and r7,r7,r11 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#1 and r7,r11,#0 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#0 and r7,r11,#-1 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#-1 and r7,r11,#-1 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} ldmia r1!,{r4,r5} @ res_z ldmia r3!,{r8,r9} @ in1_z and r4,r4,r10 and r5,r5,r10 and r6,r11,#-2 and r7,r11,#0 and r8,r8,r12 and r9,r9,r12 orr r4,r4,r6 orr r5,r5,r7 orr r4,r4,r8 orr r5,r5,r9 stmia r0!,{r4,r5} add sp,sp,#32*15+16 @ +16 means "skip even over saved r0-r3" #if __ARM_ARCH__>=5 || !defined(__thumb__) ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} bx lr @ interoperable with Thumb ISA:-) #endif .size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ecp_nistz256-armv8-ios64.S000064400000000000000000000437031353224260600177670ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text .align 5 Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 Lone_mont: .quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe Lone: .quad 1,0,0,0 .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 // void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl _GFp_nistz256_mul_mont .private_extern _GFp_nistz256_mul_mont .align 4 _GFp_nistz256_mul_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] ldr x12,Lpoly+8 ldr x13,Lpoly+24 bl __ecp_nistz256_mul_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret // void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl _GFp_nistz256_sqr_mont .private_extern _GFp_nistz256_sqr_mont .align 4 _GFp_nistz256_sqr_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] ldr x12,Lpoly+8 ldr x13,Lpoly+24 bl __ecp_nistz256_sqr_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret // void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl _GFp_nistz256_add .private_extern _GFp_nistz256_add .align 4 _GFp_nistz256_add: stp x29,x30,[sp,#-16]! add x29,sp,#0 ldp x14,x15,[x1] ldp x8,x9,[x2] ldp x16,x17,[x1,#16] ldp x10,x11,[x2,#16] ldr x12,Lpoly+8 ldr x13,Lpoly+24 bl __ecp_nistz256_add ldp x29,x30,[sp],#16 ret // void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl _GFp_nistz256_neg .private_extern _GFp_nistz256_neg .align 4 _GFp_nistz256_neg: stp x29,x30,[sp,#-16]! add x29,sp,#0 mov x2,x1 mov x14,xzr // a = 0 mov x15,xzr mov x16,xzr mov x17,xzr ldr x12,Lpoly+8 ldr x13,Lpoly+24 bl __ecp_nistz256_sub_from ldp x29,x30,[sp],#16 ret // note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded // to x4-x7 and b[0] - to x3 .align 4 __ecp_nistz256_mul_mont: mul x14,x4,x3 // a[0]*b[0] umulh x8,x4,x3 mul x15,x5,x3 // a[1]*b[0] umulh x9,x5,x3 mul x16,x6,x3 // a[2]*b[0] umulh x10,x6,x3 mul x17,x7,x3 // a[3]*b[0] umulh x11,x7,x3 ldr x3,[x2,#8] // b[1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adc x19,xzr,x11 mov x20,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr ldr x3,[x2,#8*(1+1)] // b[1+1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr ldr x3,[x2,#8*(2+1)] // b[2+1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr // last reduction subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 adcs x16,x17,x10 // +=acc[0]*0xffff0001 adcs x17,x19,x11 adc x19,x20,xzr adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x19,xzr // did it borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret // note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded // to x4-x7 .align 4 __ecp_nistz256_sqr_mont: // | | | | | |a1*a0| | // | | | | |a2*a0| | | // | |a3*a2|a3*a0| | | | // | | | |a2*a1| | | | // | | |a3*a1| | | | | // *| | | | | | | | 2| // +|a3*a3|a2*a2|a1*a1|a0*a0| // |--+--+--+--+--+--+--+--| // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow // // "can't overflow" below mark carrying into high part of // multiplication result, which can't overflow, because it // can never be all ones. mul x15,x5,x4 // a[1]*a[0] umulh x9,x5,x4 mul x16,x6,x4 // a[2]*a[0] umulh x10,x6,x4 mul x17,x7,x4 // a[3]*a[0] umulh x19,x7,x4 adds x16,x16,x9 // accumulate high parts of multiplication mul x8,x6,x5 // a[2]*a[1] umulh x9,x6,x5 adcs x17,x17,x10 mul x10,x7,x5 // a[3]*a[1] umulh x11,x7,x5 adc x19,x19,xzr // can't overflow mul x20,x7,x6 // a[3]*a[2] umulh x1,x7,x6 adds x9,x9,x10 // accumulate high parts of multiplication mul x14,x4,x4 // a[0]*a[0] adc x10,x11,xzr // can't overflow adds x17,x17,x8 // accumulate low parts of multiplication umulh x4,x4,x4 adcs x19,x19,x9 mul x9,x5,x5 // a[1]*a[1] adcs x20,x20,x10 umulh x5,x5,x5 adc x1,x1,xzr // can't overflow adds x15,x15,x15 // acc[1-6]*=2 mul x10,x6,x6 // a[2]*a[2] adcs x16,x16,x16 umulh x6,x6,x6 adcs x17,x17,x17 mul x11,x7,x7 // a[3]*a[3] adcs x19,x19,x19 umulh x7,x7,x7 adcs x20,x20,x20 adcs x1,x1,x1 adc x2,xzr,xzr adds x15,x15,x4 // +a[i]*a[i] adcs x16,x16,x9 adcs x17,x17,x5 adcs x19,x19,x10 adcs x20,x20,x6 lsl x8,x14,#32 adcs x1,x1,x11 lsr x9,x14,#32 adc x2,x2,x7 subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 adcs x16,x17,x10 // +=acc[0]*0xffff0001 adc x17,x11,xzr // can't overflow adds x14,x14,x19 // accumulate upper half adcs x15,x15,x20 adcs x16,x16,x1 adcs x17,x17,x2 adc x19,xzr,xzr adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x19,xzr // did it borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret // Note that __ecp_nistz256_add expects both input vectors pre-loaded to // x4-x7 and x8-x11. This is done because it's used in multiple // contexts, e.g. in multiplication by 2 and 3... .align 4 __ecp_nistz256_add: adds x14,x14,x8 // ret = a+b adcs x15,x15,x9 adcs x16,x16,x10 adcs x17,x17,x11 adc x1,xzr,xzr // zap x1 adds x8,x14,#1 // subs x8,x4,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x1,xzr // did subtraction borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret .align 4 __ecp_nistz256_sub_from: ldp x8,x9,[x2] ldp x10,x11,[x2,#16] subs x14,x14,x8 // ret = a-b sbcs x15,x15,x9 sbcs x16,x16,x10 sbcs x17,x17,x11 sbc x1,xzr,xzr // zap x1 subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus adcs x9,x15,x12 adcs x10,x16,xzr adc x11,x17,x13 cmp x1,xzr // did subtraction borrow? csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret csel x15,x15,x9,eq csel x16,x16,x10,eq stp x14,x15,[x0] csel x17,x17,x11,eq stp x16,x17,[x0,#16] ret .align 4 __ecp_nistz256_sub_morf: ldp x8,x9,[x2] ldp x10,x11,[x2,#16] subs x14,x8,x14 // ret = b-a sbcs x15,x9,x15 sbcs x16,x10,x16 sbcs x17,x11,x17 sbc x1,xzr,xzr // zap x1 subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus adcs x9,x15,x12 adcs x10,x16,xzr adc x11,x17,x13 cmp x1,xzr // did subtraction borrow? csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret csel x15,x15,x9,eq csel x16,x16,x10,eq stp x14,x15,[x0] csel x17,x17,x11,eq stp x16,x17,[x0,#16] ret .align 4 __ecp_nistz256_div_by_2: subs x8,x14,#1 // adds x8,x4,#-1 // tmp = a+modulus adcs x9,x15,x12 adcs x10,x16,xzr adcs x11,x17,x13 adc x1,xzr,xzr // zap x1 tst x14,#1 // is a even? csel x14,x14,x8,eq // ret = even ? a : a+modulus csel x15,x15,x9,eq csel x16,x16,x10,eq csel x17,x17,x11,eq csel x1,xzr,x1,eq lsr x14,x14,#1 // ret >>= 1 orr x14,x14,x15,lsl#63 lsr x15,x15,#1 orr x15,x15,x16,lsl#63 lsr x16,x16,#1 orr x16,x16,x17,lsl#63 lsr x17,x17,#1 stp x14,x15,[x0] orr x17,x17,x1,lsl#63 stp x16,x17,[x0,#16] ret .globl _GFp_nistz256_point_double .private_extern _GFp_nistz256_point_double .align 5 _GFp_nistz256_point_double: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] sub sp,sp,#32*4 Ldouble_shortcut: ldp x14,x15,[x1,#32] mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 ldr x12,Lpoly+8 mov x8,x14 ldr x13,Lpoly+24 mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[x22,#64+16] add x0,sp,#0 bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); add x0,sp,#64 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); ldp x8,x9,[x22] ldp x10,x11,[x22,#16] mov x4,x14 // put Zsqr aside for p256_sub mov x5,x15 mov x6,x16 mov x7,x17 add x0,sp,#32 bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); add x2,x22,#0 mov x14,x4 // restore Zsqr mov x15,x5 ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont mov x16,x6 mov x17,x7 ldp x6,x7,[sp,#0+16] add x0,sp,#64 bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); add x0,sp,#0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); ldr x3,[x22,#32] ldp x4,x5,[x22,#64] ldp x6,x7,[x22,#64+16] add x2,x22,#32 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); mov x8,x14 mov x9,x15 ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[sp,#0+16] add x0,x21,#64 bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); add x0,sp,#96 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); ldr x3,[sp,#64] // forward load for p256_mul_mont ldp x4,x5,[sp,#32] ldp x6,x7,[sp,#32+16] add x0,x21,#32 bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); add x2,sp,#64 add x0,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); mov x8,x14 // duplicate M mov x9,x15 mov x10,x16 mov x11,x17 mov x4,x14 // put M aside mov x5,x15 mov x6,x16 mov x7,x17 add x0,sp,#32 bl __ecp_nistz256_add mov x8,x4 // restore M mov x9,x5 ldr x3,[x22] // forward load for p256_mul_mont mov x10,x6 ldp x4,x5,[sp,#0] mov x11,x7 ldp x6,x7,[sp,#0+16] bl __ecp_nistz256_add // p256_mul_by_3(M, M); add x2,x22,#0 add x0,sp,#0 bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); mov x8,x14 mov x9,x15 ldp x4,x5,[sp,#32] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[sp,#32+16] add x0,sp,#96 bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); add x0,x21,#0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); add x2,sp,#96 bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); add x2,sp,#0 add x0,sp,#0 bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); ldr x3,[sp,#32] mov x4,x14 // copy S mov x5,x15 mov x6,x16 mov x7,x17 add x2,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); add x2,x21,#32 add x0,x21,#32 bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x29,x30,[sp],#80 ret .globl _GFp_nistz256_point_add_affine .private_extern _GFp_nistz256_point_add_affine .align 5 _GFp_nistz256_point_add_affine: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] sub sp,sp,#32*10 mov x21,x0 mov x22,x1 mov x23,x2 ldr x12,Lpoly+8 ldr x13,Lpoly+24 ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] orr x8,x4,x5 orr x10,x6,x7 orr x24,x8,x10 cmp x24,#0 csetm x24,ne // !in1infty ldp x14,x15,[x2] // in2_x ldp x16,x17,[x2,#16] ldp x8,x9,[x2,#32] // in2_y ldp x10,x11,[x2,#48] orr x14,x14,x15 orr x16,x16,x17 orr x8,x8,x9 orr x10,x10,x11 orr x14,x14,x16 orr x8,x8,x10 orr x25,x14,x8 cmp x25,#0 csetm x25,ne // !in2infty add x0,sp,#128 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); mov x4,x14 mov x5,x15 mov x6,x16 mov x7,x17 ldr x3,[x23] add x2,x23,#0 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); add x2,x22,#0 ldr x3,[x22,#64] // forward load for p256_mul_mont ldp x4,x5,[sp,#128] ldp x6,x7,[sp,#128+16] add x0,sp,#160 bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); add x2,x22,#64 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); ldr x3,[x22,#64] ldp x4,x5,[sp,#160] ldp x6,x7,[sp,#160+16] add x2,x22,#64 add x0,sp,#64 bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); ldr x3,[x23,#32] ldp x4,x5,[sp,#128] ldp x6,x7,[sp,#128+16] add x2,x23,#32 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); add x2,x22,#32 ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont ldp x6,x7,[sp,#160+16] add x0,sp,#192 bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); add x0,sp,#224 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); ldp x4,x5,[sp,#192] ldp x6,x7,[sp,#192+16] add x0,sp,#288 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); ldr x3,[sp,#160] ldp x4,x5,[sp,#224] ldp x6,x7,[sp,#224+16] add x2,sp,#160 add x0,sp,#256 bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); ldr x3,[x22] ldp x4,x5,[sp,#224] ldp x6,x7,[sp,#224+16] add x2,x22,#0 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); mov x8,x14 mov x9,x15 mov x10,x16 mov x11,x17 add x0,sp,#224 bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); add x2,sp,#288 add x0,sp,#0 bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); add x2,sp,#256 bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); add x2,sp,#96 ldr x3,[x22,#32] // forward load for p256_mul_mont ldp x4,x5,[sp,#256] ldp x6,x7,[sp,#256+16] add x0,sp,#32 bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); add x2,x22,#32 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); ldr x3,[sp,#192] ldp x4,x5,[sp,#32] ldp x6,x7,[sp,#32+16] add x2,sp,#192 add x0,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); add x2,sp,#128 bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); ldp x4,x5,[sp,#0] // res ldp x6,x7,[sp,#0+16] ldp x8,x9,[x23] // in2 ldp x10,x11,[x23,#16] ldp x14,x15,[x22,#0] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#0+16] csel x8,x4,x8,ne csel x9,x5,x9,ne ldp x4,x5,[sp,#0+0+32] // res csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? ldp x6,x7,[sp,#0+0+48] csel x14,x8,x14,ne csel x15,x9,x15,ne ldp x8,x9,[x23,#0+32] // in2 csel x16,x10,x16,ne csel x17,x11,x17,ne ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] adr x23,Lone_mont-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#32+16] csel x8,x4,x8,ne csel x9,x5,x9,ne ldp x4,x5,[sp,#0+32+32] // res csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? ldp x6,x7,[sp,#0+32+48] csel x14,x8,x14,ne csel x15,x9,x15,ne ldp x8,x9,[x23,#32+32] // in2 csel x16,x10,x16,ne csel x17,x11,x17,ne ldp x10,x11,[x23,#32+48] stp x14,x15,[x21,#32] stp x16,x17,[x21,#32+16] ldp x14,x15,[x22,#64] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#64+16] csel x8,x4,x8,ne csel x9,x5,x9,ne csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? csel x14,x8,x14,ne csel x15,x9,x15,ne csel x16,x10,x16,ne csel x17,x11,x17,ne stp x14,x15,[x21,#64] stp x16,x17,[x21,#64+16] add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x29,x30,[sp],#80 ret #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ecp_nistz256-armv8-linux64.S000064400000000000000000000457551353224260700203460ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) #include .text .align 5 .Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 .Lone_mont: .quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe .Lone: .quad 1,0,0,0 .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 // void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl GFp_nistz256_mul_mont .hidden GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,%function .align 4 GFp_nistz256_mul_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] ldr x12,.Lpoly+8 ldr x13,.Lpoly+24 bl __ecp_nistz256_mul_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont // void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl GFp_nistz256_sqr_mont .hidden GFp_nistz256_sqr_mont .type GFp_nistz256_sqr_mont,%function .align 4 GFp_nistz256_sqr_mont: stp x29,x30,[sp,#-32]! add x29,sp,#0 stp x19,x20,[sp,#16] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] ldr x12,.Lpoly+8 ldr x13,.Lpoly+24 bl __ecp_nistz256_sqr_mont ldp x19,x20,[sp,#16] ldp x29,x30,[sp],#32 ret .size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont // void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); .globl GFp_nistz256_add .hidden GFp_nistz256_add .type GFp_nistz256_add,%function .align 4 GFp_nistz256_add: stp x29,x30,[sp,#-16]! add x29,sp,#0 ldp x14,x15,[x1] ldp x8,x9,[x2] ldp x16,x17,[x1,#16] ldp x10,x11,[x2,#16] ldr x12,.Lpoly+8 ldr x13,.Lpoly+24 bl __ecp_nistz256_add ldp x29,x30,[sp],#16 ret .size GFp_nistz256_add,.-GFp_nistz256_add // void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl GFp_nistz256_neg .hidden GFp_nistz256_neg .type GFp_nistz256_neg,%function .align 4 GFp_nistz256_neg: stp x29,x30,[sp,#-16]! add x29,sp,#0 mov x2,x1 mov x14,xzr // a = 0 mov x15,xzr mov x16,xzr mov x17,xzr ldr x12,.Lpoly+8 ldr x13,.Lpoly+24 bl __ecp_nistz256_sub_from ldp x29,x30,[sp],#16 ret .size GFp_nistz256_neg,.-GFp_nistz256_neg // note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded // to x4-x7 and b[0] - to x3 .type __ecp_nistz256_mul_mont,%function .align 4 __ecp_nistz256_mul_mont: mul x14,x4,x3 // a[0]*b[0] umulh x8,x4,x3 mul x15,x5,x3 // a[1]*b[0] umulh x9,x5,x3 mul x16,x6,x3 // a[2]*b[0] umulh x10,x6,x3 mul x17,x7,x3 // a[3]*b[0] umulh x11,x7,x3 ldr x3,[x2,#8] // b[1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adc x19,xzr,x11 mov x20,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr ldr x3,[x2,#8*(1+1)] // b[1+1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr ldr x3,[x2,#8*(2+1)] // b[2+1] adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] mul x8,x4,x3 // lo(a[0]*b[i]) adcs x15,x16,x9 mul x9,x5,x3 // lo(a[1]*b[i]) adcs x16,x17,x10 // +=acc[0]*0xffff0001 mul x10,x6,x3 // lo(a[2]*b[i]) adcs x17,x19,x11 mul x11,x7,x3 // lo(a[3]*b[i]) adc x19,x20,xzr adds x14,x14,x8 // accumulate low parts of multiplication umulh x8,x4,x3 // hi(a[0]*b[i]) adcs x15,x15,x9 umulh x9,x5,x3 // hi(a[1]*b[i]) adcs x16,x16,x10 umulh x10,x6,x3 // hi(a[2]*b[i]) adcs x17,x17,x11 umulh x11,x7,x3 // hi(a[3]*b[i]) adc x19,x19,xzr adds x15,x15,x8 // accumulate high parts of multiplication lsl x8,x14,#32 adcs x16,x16,x9 lsr x9,x14,#32 adcs x17,x17,x10 adcs x19,x19,x11 adc x20,xzr,xzr // last reduction subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 adcs x16,x17,x10 // +=acc[0]*0xffff0001 adcs x17,x19,x11 adc x19,x20,xzr adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x19,xzr // did it borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret .size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont // note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded // to x4-x7 .type __ecp_nistz256_sqr_mont,%function .align 4 __ecp_nistz256_sqr_mont: // | | | | | |a1*a0| | // | | | | |a2*a0| | | // | |a3*a2|a3*a0| | | | // | | | |a2*a1| | | | // | | |a3*a1| | | | | // *| | | | | | | | 2| // +|a3*a3|a2*a2|a1*a1|a0*a0| // |--+--+--+--+--+--+--+--| // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow // // "can't overflow" below mark carrying into high part of // multiplication result, which can't overflow, because it // can never be all ones. mul x15,x5,x4 // a[1]*a[0] umulh x9,x5,x4 mul x16,x6,x4 // a[2]*a[0] umulh x10,x6,x4 mul x17,x7,x4 // a[3]*a[0] umulh x19,x7,x4 adds x16,x16,x9 // accumulate high parts of multiplication mul x8,x6,x5 // a[2]*a[1] umulh x9,x6,x5 adcs x17,x17,x10 mul x10,x7,x5 // a[3]*a[1] umulh x11,x7,x5 adc x19,x19,xzr // can't overflow mul x20,x7,x6 // a[3]*a[2] umulh x1,x7,x6 adds x9,x9,x10 // accumulate high parts of multiplication mul x14,x4,x4 // a[0]*a[0] adc x10,x11,xzr // can't overflow adds x17,x17,x8 // accumulate low parts of multiplication umulh x4,x4,x4 adcs x19,x19,x9 mul x9,x5,x5 // a[1]*a[1] adcs x20,x20,x10 umulh x5,x5,x5 adc x1,x1,xzr // can't overflow adds x15,x15,x15 // acc[1-6]*=2 mul x10,x6,x6 // a[2]*a[2] adcs x16,x16,x16 umulh x6,x6,x6 adcs x17,x17,x17 mul x11,x7,x7 // a[3]*a[3] adcs x19,x19,x19 umulh x7,x7,x7 adcs x20,x20,x20 adcs x1,x1,x1 adc x2,xzr,xzr adds x15,x15,x4 // +a[i]*a[i] adcs x16,x16,x9 adcs x17,x17,x5 adcs x19,x19,x10 adcs x20,x20,x6 lsl x8,x14,#32 adcs x1,x1,x11 lsr x9,x14,#32 adc x2,x2,x7 subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 lsl x8,x14,#32 adcs x16,x17,x10 // +=acc[0]*0xffff0001 lsr x9,x14,#32 adc x17,x11,xzr // can't overflow subs x10,x14,x8 // "*0xffff0001" sbc x11,x14,x9 adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] adcs x15,x16,x9 adcs x16,x17,x10 // +=acc[0]*0xffff0001 adc x17,x11,xzr // can't overflow adds x14,x14,x19 // accumulate upper half adcs x15,x15,x20 adcs x16,x16,x1 adcs x17,x17,x2 adc x19,xzr,xzr adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x19,xzr // did it borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret .size __ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont // Note that __ecp_nistz256_add expects both input vectors pre-loaded to // x4-x7 and x8-x11. This is done because it's used in multiple // contexts, e.g. in multiplication by 2 and 3... .type __ecp_nistz256_add,%function .align 4 __ecp_nistz256_add: adds x14,x14,x8 // ret = a+b adcs x15,x15,x9 adcs x16,x16,x10 adcs x17,x17,x11 adc x1,xzr,xzr // zap x1 adds x8,x14,#1 // subs x8,x4,#-1 // tmp = ret-modulus sbcs x9,x15,x12 sbcs x10,x16,xzr sbcs x11,x17,x13 sbcs xzr,x1,xzr // did subtraction borrow? csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus csel x15,x15,x9,lo csel x16,x16,x10,lo stp x14,x15,[x0] csel x17,x17,x11,lo stp x16,x17,[x0,#16] ret .size __ecp_nistz256_add,.-__ecp_nistz256_add .type __ecp_nistz256_sub_from,%function .align 4 __ecp_nistz256_sub_from: ldp x8,x9,[x2] ldp x10,x11,[x2,#16] subs x14,x14,x8 // ret = a-b sbcs x15,x15,x9 sbcs x16,x16,x10 sbcs x17,x17,x11 sbc x1,xzr,xzr // zap x1 subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus adcs x9,x15,x12 adcs x10,x16,xzr adc x11,x17,x13 cmp x1,xzr // did subtraction borrow? csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret csel x15,x15,x9,eq csel x16,x16,x10,eq stp x14,x15,[x0] csel x17,x17,x11,eq stp x16,x17,[x0,#16] ret .size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from .type __ecp_nistz256_sub_morf,%function .align 4 __ecp_nistz256_sub_morf: ldp x8,x9,[x2] ldp x10,x11,[x2,#16] subs x14,x8,x14 // ret = b-a sbcs x15,x9,x15 sbcs x16,x10,x16 sbcs x17,x11,x17 sbc x1,xzr,xzr // zap x1 subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus adcs x9,x15,x12 adcs x10,x16,xzr adc x11,x17,x13 cmp x1,xzr // did subtraction borrow? csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret csel x15,x15,x9,eq csel x16,x16,x10,eq stp x14,x15,[x0] csel x17,x17,x11,eq stp x16,x17,[x0,#16] ret .size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf .type __ecp_nistz256_div_by_2,%function .align 4 __ecp_nistz256_div_by_2: subs x8,x14,#1 // adds x8,x4,#-1 // tmp = a+modulus adcs x9,x15,x12 adcs x10,x16,xzr adcs x11,x17,x13 adc x1,xzr,xzr // zap x1 tst x14,#1 // is a even? csel x14,x14,x8,eq // ret = even ? a : a+modulus csel x15,x15,x9,eq csel x16,x16,x10,eq csel x17,x17,x11,eq csel x1,xzr,x1,eq lsr x14,x14,#1 // ret >>= 1 orr x14,x14,x15,lsl#63 lsr x15,x15,#1 orr x15,x15,x16,lsl#63 lsr x16,x16,#1 orr x16,x16,x17,lsl#63 lsr x17,x17,#1 stp x14,x15,[x0] orr x17,x17,x1,lsl#63 stp x16,x17,[x0,#16] ret .size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 .globl GFp_nistz256_point_double .hidden GFp_nistz256_point_double .type GFp_nistz256_point_double,%function .align 5 GFp_nistz256_point_double: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] sub sp,sp,#32*4 .Ldouble_shortcut: ldp x14,x15,[x1,#32] mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 ldr x12,.Lpoly+8 mov x8,x14 ldr x13,.Lpoly+24 mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[x22,#64+16] add x0,sp,#0 bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); add x0,sp,#64 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); ldp x8,x9,[x22] ldp x10,x11,[x22,#16] mov x4,x14 // put Zsqr aside for p256_sub mov x5,x15 mov x6,x16 mov x7,x17 add x0,sp,#32 bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); add x2,x22,#0 mov x14,x4 // restore Zsqr mov x15,x5 ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont mov x16,x6 mov x17,x7 ldp x6,x7,[sp,#0+16] add x0,sp,#64 bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); add x0,sp,#0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); ldr x3,[x22,#32] ldp x4,x5,[x22,#64] ldp x6,x7,[x22,#64+16] add x2,x22,#32 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); mov x8,x14 mov x9,x15 ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[sp,#0+16] add x0,x21,#64 bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); add x0,sp,#96 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); ldr x3,[sp,#64] // forward load for p256_mul_mont ldp x4,x5,[sp,#32] ldp x6,x7,[sp,#32+16] add x0,x21,#32 bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); add x2,sp,#64 add x0,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); mov x8,x14 // duplicate M mov x9,x15 mov x10,x16 mov x11,x17 mov x4,x14 // put M aside mov x5,x15 mov x6,x16 mov x7,x17 add x0,sp,#32 bl __ecp_nistz256_add mov x8,x4 // restore M mov x9,x5 ldr x3,[x22] // forward load for p256_mul_mont mov x10,x6 ldp x4,x5,[sp,#0] mov x11,x7 ldp x6,x7,[sp,#0+16] bl __ecp_nistz256_add // p256_mul_by_3(M, M); add x2,x22,#0 add x0,sp,#0 bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); mov x8,x14 mov x9,x15 ldp x4,x5,[sp,#32] // forward load for p256_sqr_mont mov x10,x16 mov x11,x17 ldp x6,x7,[sp,#32+16] add x0,sp,#96 bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); add x0,x21,#0 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); add x2,sp,#96 bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); add x2,sp,#0 add x0,sp,#0 bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); ldr x3,[sp,#32] mov x4,x14 // copy S mov x5,x15 mov x6,x16 mov x7,x17 add x2,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); add x2,x21,#32 add x0,x21,#32 bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x29,x30,[sp],#80 ret .size GFp_nistz256_point_double,.-GFp_nistz256_point_double .globl GFp_nistz256_point_add_affine .hidden GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,%function .align 5 GFp_nistz256_point_add_affine: stp x29,x30,[sp,#-80]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] sub sp,sp,#32*10 mov x21,x0 mov x22,x1 mov x23,x2 ldr x12,.Lpoly+8 ldr x13,.Lpoly+24 ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] orr x8,x4,x5 orr x10,x6,x7 orr x24,x8,x10 cmp x24,#0 csetm x24,ne // !in1infty ldp x14,x15,[x2] // in2_x ldp x16,x17,[x2,#16] ldp x8,x9,[x2,#32] // in2_y ldp x10,x11,[x2,#48] orr x14,x14,x15 orr x16,x16,x17 orr x8,x8,x9 orr x10,x10,x11 orr x14,x14,x16 orr x8,x8,x10 orr x25,x14,x8 cmp x25,#0 csetm x25,ne // !in2infty add x0,sp,#128 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); mov x4,x14 mov x5,x15 mov x6,x16 mov x7,x17 ldr x3,[x23] add x2,x23,#0 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); add x2,x22,#0 ldr x3,[x22,#64] // forward load for p256_mul_mont ldp x4,x5,[sp,#128] ldp x6,x7,[sp,#128+16] add x0,sp,#160 bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); add x2,x22,#64 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); ldr x3,[x22,#64] ldp x4,x5,[sp,#160] ldp x6,x7,[sp,#160+16] add x2,x22,#64 add x0,sp,#64 bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); ldr x3,[x23,#32] ldp x4,x5,[sp,#128] ldp x6,x7,[sp,#128+16] add x2,x23,#32 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); add x2,x22,#32 ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont ldp x6,x7,[sp,#160+16] add x0,sp,#192 bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); add x0,sp,#224 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); ldp x4,x5,[sp,#192] ldp x6,x7,[sp,#192+16] add x0,sp,#288 bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); ldr x3,[sp,#160] ldp x4,x5,[sp,#224] ldp x6,x7,[sp,#224+16] add x2,sp,#160 add x0,sp,#256 bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); ldr x3,[x22] ldp x4,x5,[sp,#224] ldp x6,x7,[sp,#224+16] add x2,x22,#0 add x0,sp,#96 bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); mov x8,x14 mov x9,x15 mov x10,x16 mov x11,x17 add x0,sp,#224 bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); add x2,sp,#288 add x0,sp,#0 bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); add x2,sp,#256 bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); add x2,sp,#96 ldr x3,[x22,#32] // forward load for p256_mul_mont ldp x4,x5,[sp,#256] ldp x6,x7,[sp,#256+16] add x0,sp,#32 bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); add x2,x22,#32 add x0,sp,#128 bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); ldr x3,[sp,#192] ldp x4,x5,[sp,#32] ldp x6,x7,[sp,#32+16] add x2,sp,#192 add x0,sp,#32 bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); add x2,sp,#128 bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); ldp x4,x5,[sp,#0] // res ldp x6,x7,[sp,#0+16] ldp x8,x9,[x23] // in2 ldp x10,x11,[x23,#16] ldp x14,x15,[x22,#0] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#0+16] csel x8,x4,x8,ne csel x9,x5,x9,ne ldp x4,x5,[sp,#0+0+32] // res csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? ldp x6,x7,[sp,#0+0+48] csel x14,x8,x14,ne csel x15,x9,x15,ne ldp x8,x9,[x23,#0+32] // in2 csel x16,x10,x16,ne csel x17,x11,x17,ne ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] adr x23,.Lone_mont-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#32+16] csel x8,x4,x8,ne csel x9,x5,x9,ne ldp x4,x5,[sp,#0+32+32] // res csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? ldp x6,x7,[sp,#0+32+48] csel x14,x8,x14,ne csel x15,x9,x15,ne ldp x8,x9,[x23,#32+32] // in2 csel x16,x10,x16,ne csel x17,x11,x17,ne ldp x10,x11,[x23,#32+48] stp x14,x15,[x21,#32] stp x16,x17,[x21,#32+16] ldp x14,x15,[x22,#64] // in1 cmp x24,#0 // !, remember? ldp x16,x17,[x22,#64+16] csel x8,x4,x8,ne csel x9,x5,x9,ne csel x10,x6,x10,ne csel x11,x7,x11,ne cmp x25,#0 // !, remember? csel x14,x8,x14,ne csel x15,x9,x15,ne csel x16,x10,x16,ne csel x17,x11,x17,ne stp x14,x15,[x21,#64] stp x16,x17,[x21,#64+16] add sp,x29,#0 // destroy frame ldp x19,x20,[x29,#16] ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x29,x30,[sp],#80 ret .size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ecp_nistz256-x86-elf.S000064400000000000000000000524711353224261000171560ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .LONE_mont: .long 1,0,0,-1,-1,-1,-2,0 .hidden _ecp_nistz256_div_by_2 .type _ecp_nistz256_div_by_2,@function .align 16 _ecp_nistz256_div_by_2: movl (%esi),%ebp xorl %edx,%edx movl 4(%esi),%ebx movl %ebp,%eax andl $1,%ebp movl 8(%esi),%ecx subl %ebp,%edx addl %edx,%eax adcl %edx,%ebx movl %eax,(%edi) adcl %edx,%ecx movl %ebx,4(%edi) movl %ecx,8(%edi) movl 12(%esi),%eax movl 16(%esi),%ebx adcl $0,%eax movl 20(%esi),%ecx adcl $0,%ebx movl %eax,12(%edi) adcl $0,%ecx movl %ebx,16(%edi) movl %ecx,20(%edi) movl 24(%esi),%eax movl 28(%esi),%ebx adcl %ebp,%eax adcl %edx,%ebx movl %eax,24(%edi) sbbl %esi,%esi movl %ebx,28(%edi) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%edx shrl $1,%eax movl %ebx,%ebp shll $31,%ebx orl %ebx,%eax shrl $1,%ebp movl %ecx,%ebx shll $31,%ecx movl %eax,(%edi) orl %ecx,%ebp movl 16(%edi),%eax shrl $1,%ebx movl %edx,%ecx shll $31,%edx movl %ebp,4(%edi) orl %edx,%ebx movl 20(%edi),%ebp shrl $1,%ecx movl %eax,%edx shll $31,%eax movl %ebx,8(%edi) orl %eax,%ecx movl 24(%edi),%ebx shrl $1,%edx movl %ebp,%eax shll $31,%ebp movl %ecx,12(%edi) orl %ebp,%edx movl 28(%edi),%ecx shrl $1,%eax movl %ebx,%ebp shll $31,%ebx movl %edx,16(%edi) orl %ebx,%eax shrl $1,%ebp movl %ecx,%ebx shll $31,%ecx movl %eax,20(%edi) orl %ecx,%ebp shrl $1,%ebx shll $31,%esi movl %ebp,24(%edi) orl %esi,%ebx movl %ebx,28(%edi) ret .size _ecp_nistz256_div_by_2,.-_ecp_nistz256_div_by_2 .globl GFp_nistz256_add .hidden GFp_nistz256_add .type GFp_nistz256_add,@function .align 16 GFp_nistz256_add: .L_GFp_nistz256_add_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 28(%esp),%ebp movl 20(%esp),%edi call _ecp_nistz256_add popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_nistz256_add,.-.L_GFp_nistz256_add_begin .hidden _ecp_nistz256_add .type _ecp_nistz256_add,@function .align 16 _ecp_nistz256_add: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx addl (%ebp),%eax movl 12(%esi),%edx adcl 4(%ebp),%ebx movl %eax,(%edi) adcl 8(%ebp),%ecx movl %ebx,4(%edi) adcl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx adcl 16(%ebp),%eax movl 28(%esi),%edx adcl 20(%ebp),%ebx movl %eax,16(%edi) adcl 24(%ebp),%ecx movl %ebx,20(%edi) movl $0,%esi adcl 28(%ebp),%edx movl %ecx,24(%edi) adcl $0,%esi movl %edx,28(%edi) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx subl $-1,%eax movl 12(%edi),%edx sbbl $-1,%ebx movl 16(%edi),%eax sbbl $-1,%ecx movl 20(%edi),%ebx sbbl $0,%edx movl 24(%edi),%ecx sbbl $0,%eax movl 28(%edi),%edx sbbl $0,%ebx sbbl $1,%ecx sbbl $-1,%edx sbbl $0,%esi notl %esi movl (%edi),%eax movl %esi,%ebp movl 4(%edi),%ebx shrl $31,%ebp movl 8(%edi),%ecx subl %esi,%eax movl 12(%edi),%edx sbbl %esi,%ebx movl %eax,(%edi) sbbl %esi,%ecx movl %ebx,4(%edi) sbbl $0,%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%edi),%eax movl 20(%edi),%ebx movl 24(%edi),%ecx sbbl $0,%eax movl 28(%edi),%edx sbbl $0,%ebx movl %eax,16(%edi) sbbl %ebp,%ecx movl %ebx,20(%edi) sbbl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .size _ecp_nistz256_add,.-_ecp_nistz256_add .hidden _ecp_nistz256_sub .type _ecp_nistz256_sub,@function .align 16 _ecp_nistz256_sub: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx subl (%ebp),%eax movl 12(%esi),%edx sbbl 4(%ebp),%ebx movl %eax,(%edi) sbbl 8(%ebp),%ecx movl %ebx,4(%edi) sbbl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx sbbl 16(%ebp),%eax movl 28(%esi),%edx sbbl 20(%ebp),%ebx sbbl 24(%ebp),%ecx movl %eax,16(%edi) sbbl 28(%ebp),%edx movl %ebx,20(%edi) sbbl %esi,%esi movl %ecx,24(%edi) movl %edx,28(%edi) movl (%edi),%eax movl %esi,%ebp movl 4(%edi),%ebx shrl $31,%ebp movl 8(%edi),%ecx addl %esi,%eax movl 12(%edi),%edx adcl %esi,%ebx movl %eax,(%edi) adcl %esi,%ecx movl %ebx,4(%edi) adcl $0,%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%edi),%eax movl 20(%edi),%ebx movl 24(%edi),%ecx adcl $0,%eax movl 28(%edi),%edx adcl $0,%ebx movl %eax,16(%edi) adcl %ebp,%ecx movl %ebx,20(%edi) adcl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .size _ecp_nistz256_sub,.-_ecp_nistz256_sub .globl GFp_nistz256_neg .hidden GFp_nistz256_neg .type GFp_nistz256_neg,@function .align 16 GFp_nistz256_neg: .L_GFp_nistz256_neg_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%ebp movl 20(%esp),%edi xorl %eax,%eax subl $32,%esp movl %eax,(%esp) movl %esp,%esi movl %eax,4(%esp) movl %eax,8(%esp) movl %eax,12(%esp) movl %eax,16(%esp) movl %eax,20(%esp) movl %eax,24(%esp) movl %eax,28(%esp) call _ecp_nistz256_sub addl $32,%esp popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_nistz256_neg,.-.L_GFp_nistz256_neg_begin .hidden _picup_eax .type _picup_eax,@function .align 16 _picup_eax: movl (%esp),%eax ret .size _picup_eax,.-_picup_eax .globl GFp_nistz256_mul_mont .hidden GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,@function .align 16 GFp_nistz256_mul_mont: .L_GFp_nistz256_mul_mont_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 28(%esp),%ebp call _picup_eax .L000pic: leal GFp_ia32cap_P-.L000pic(%eax),%eax movl (%eax),%eax movl 20(%esp),%edi call _ecp_nistz256_mul_mont popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_nistz256_mul_mont,.-.L_GFp_nistz256_mul_mont_begin .hidden _ecp_nistz256_mul_mont .type _ecp_nistz256_mul_mont,@function .align 16 _ecp_nistz256_mul_mont: movl %esp,%edx subl $256,%esp movd (%ebp),%xmm7 leal 4(%ebp),%ebp pcmpeqd %xmm6,%xmm6 psrlq $48,%xmm6 pshuflw $220,%xmm7,%xmm7 andl $-64,%esp pshufd $220,%xmm7,%xmm7 leal 128(%esp),%ebx movd (%esi),%xmm0 pshufd $204,%xmm0,%xmm0 movd 4(%esi),%xmm1 movdqa %xmm0,(%ebx) pmuludq %xmm7,%xmm0 movd 8(%esi),%xmm2 pshufd $204,%xmm1,%xmm1 movdqa %xmm1,16(%ebx) pmuludq %xmm7,%xmm1 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 pand %xmm6,%xmm5 movd 12(%esi),%xmm3 pshufd $204,%xmm2,%xmm2 movdqa %xmm2,32(%ebx) pmuludq %xmm7,%xmm2 paddq %xmm4,%xmm1 movdqa %xmm1,(%esp) movd 16(%esi),%xmm0 pshufd $204,%xmm3,%xmm3 movdqa %xmm3,48(%ebx) pmuludq %xmm7,%xmm3 movdqa %xmm2,16(%esp) movd 20(%esi),%xmm1 pshufd $204,%xmm0,%xmm0 movdqa %xmm0,64(%ebx) pmuludq %xmm7,%xmm0 paddq %xmm5,%xmm3 movdqa %xmm3,32(%esp) movd 24(%esi),%xmm2 pshufd $204,%xmm1,%xmm1 movdqa %xmm1,80(%ebx) pmuludq %xmm7,%xmm1 movdqa %xmm0,48(%esp) pshufd $177,%xmm5,%xmm4 movd 28(%esi),%xmm3 pshufd $204,%xmm2,%xmm2 movdqa %xmm2,96(%ebx) pmuludq %xmm7,%xmm2 movdqa %xmm1,64(%esp) psubq %xmm5,%xmm4 movd (%ebp),%xmm0 pshufd $204,%xmm3,%xmm3 movdqa %xmm3,112(%ebx) pmuludq %xmm7,%xmm3 pshuflw $220,%xmm0,%xmm7 movdqa (%ebx),%xmm0 pshufd $220,%xmm7,%xmm7 movl $6,%ecx leal 4(%ebp),%ebp jmp .L001madd_sse2 .align 16 .L001madd_sse2: paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa 16(%ebx),%xmm1 pmuludq %xmm7,%xmm0 movdqa %xmm2,80(%esp) movdqa 32(%ebx),%xmm2 pmuludq %xmm7,%xmm1 movdqa %xmm3,96(%esp) paddq (%esp),%xmm0 movdqa 48(%ebx),%xmm3 pmuludq %xmm7,%xmm2 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq 16(%esp),%xmm1 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 movdqa 64(%ebx),%xmm0 pmuludq %xmm7,%xmm3 paddq %xmm4,%xmm1 paddq 32(%esp),%xmm2 movdqa %xmm1,(%esp) movdqa 80(%ebx),%xmm1 pmuludq %xmm7,%xmm0 paddq 48(%esp),%xmm3 movdqa %xmm2,16(%esp) pand %xmm6,%xmm5 movdqa 96(%ebx),%xmm2 pmuludq %xmm7,%xmm1 paddq %xmm5,%xmm3 paddq 64(%esp),%xmm0 movdqa %xmm3,32(%esp) pshufd $177,%xmm5,%xmm4 movdqa %xmm7,%xmm3 pmuludq %xmm7,%xmm2 movd (%ebp),%xmm7 leal 4(%ebp),%ebp paddq 80(%esp),%xmm1 psubq %xmm5,%xmm4 movdqa %xmm0,48(%esp) pshuflw $220,%xmm7,%xmm7 pmuludq 112(%ebx),%xmm3 pshufd $220,%xmm7,%xmm7 movdqa (%ebx),%xmm0 movdqa %xmm1,64(%esp) paddq 96(%esp),%xmm2 decl %ecx jnz .L001madd_sse2 paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa 16(%ebx),%xmm1 pmuludq %xmm7,%xmm0 movdqa %xmm2,80(%esp) movdqa 32(%ebx),%xmm2 pmuludq %xmm7,%xmm1 movdqa %xmm3,96(%esp) paddq (%esp),%xmm0 movdqa 48(%ebx),%xmm3 pmuludq %xmm7,%xmm2 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq 16(%esp),%xmm1 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 movdqa 64(%ebx),%xmm0 pmuludq %xmm7,%xmm3 paddq %xmm4,%xmm1 paddq 32(%esp),%xmm2 movdqa %xmm1,(%esp) movdqa 80(%ebx),%xmm1 pmuludq %xmm7,%xmm0 paddq 48(%esp),%xmm3 movdqa %xmm2,16(%esp) pand %xmm6,%xmm5 movdqa 96(%ebx),%xmm2 pmuludq %xmm7,%xmm1 paddq %xmm5,%xmm3 paddq 64(%esp),%xmm0 movdqa %xmm3,32(%esp) pshufd $177,%xmm5,%xmm4 movdqa 112(%ebx),%xmm3 pmuludq %xmm7,%xmm2 paddq 80(%esp),%xmm1 psubq %xmm5,%xmm4 movdqa %xmm0,48(%esp) pmuludq %xmm7,%xmm3 pcmpeqd %xmm7,%xmm7 movdqa (%esp),%xmm0 pslldq $8,%xmm7 movdqa %xmm1,64(%esp) paddq 96(%esp),%xmm2 paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa %xmm2,80(%esp) movdqa %xmm3,96(%esp) movdqa 16(%esp),%xmm1 movdqa 32(%esp),%xmm2 movdqa 48(%esp),%xmm3 movq %xmm0,%xmm4 pand %xmm7,%xmm0 xorl %ebp,%ebp pslldq $6,%xmm4 movq %xmm1,%xmm5 paddq %xmm4,%xmm0 pand %xmm7,%xmm1 psrldq $6,%xmm0 movd %xmm0,%eax psrldq $4,%xmm0 paddq %xmm0,%xmm5 movdqa 64(%esp),%xmm0 subl $-1,%eax pslldq $6,%xmm5 movq %xmm2,%xmm4 paddq %xmm5,%xmm1 pand %xmm7,%xmm2 psrldq $6,%xmm1 movl %eax,(%edi) movd %xmm1,%eax psrldq $4,%xmm1 paddq %xmm1,%xmm4 movdqa 80(%esp),%xmm1 sbbl $-1,%eax pslldq $6,%xmm4 movq %xmm3,%xmm5 paddq %xmm4,%xmm2 pand %xmm7,%xmm3 psrldq $6,%xmm2 movl %eax,4(%edi) movd %xmm2,%eax psrldq $4,%xmm2 paddq %xmm2,%xmm5 movdqa 96(%esp),%xmm2 sbbl $-1,%eax pslldq $6,%xmm5 movq %xmm0,%xmm4 paddq %xmm5,%xmm3 pand %xmm7,%xmm0 psrldq $6,%xmm3 movl %eax,8(%edi) movd %xmm3,%eax psrldq $4,%xmm3 paddq %xmm3,%xmm4 sbbl $0,%eax pslldq $6,%xmm4 movq %xmm1,%xmm5 paddq %xmm4,%xmm0 pand %xmm7,%xmm1 psrldq $6,%xmm0 movl %eax,12(%edi) movd %xmm0,%eax psrldq $4,%xmm0 paddq %xmm0,%xmm5 sbbl $0,%eax pslldq $6,%xmm5 movq %xmm2,%xmm4 paddq %xmm5,%xmm1 pand %xmm7,%xmm2 psrldq $6,%xmm1 movd %xmm1,%ebx psrldq $4,%xmm1 movl %edx,%esp paddq %xmm1,%xmm4 pslldq $6,%xmm4 paddq %xmm4,%xmm2 psrldq $6,%xmm2 movd %xmm2,%ecx psrldq $4,%xmm2 sbbl $0,%ebx movd %xmm2,%edx pextrw $2,%xmm2,%esi sbbl $1,%ecx sbbl $-1,%edx sbbl $0,%esi subl %esi,%ebp addl %esi,(%edi) adcl %esi,4(%edi) adcl %esi,8(%edi) adcl $0,12(%edi) adcl $0,%eax adcl $0,%ebx movl %eax,16(%edi) adcl %ebp,%ecx movl %ebx,20(%edi) adcl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .size _ecp_nistz256_mul_mont,.-_ecp_nistz256_mul_mont .globl GFp_nistz256_point_double .hidden GFp_nistz256_point_double .type GFp_nistz256_point_double,@function .align 16 GFp_nistz256_point_double: .L_GFp_nistz256_point_double_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi subl $164,%esp call _picup_eax .L002pic: leal GFp_ia32cap_P-.L002pic(%eax),%edx movl (%edx),%ebp .Lpoint_double_shortcut: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,96(%esp) movl %ebx,100(%esp) movl %ecx,104(%esp) movl %edx,108(%esp) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,112(%esp) movl %ebx,116(%esp) movl %ecx,120(%esp) movl %edx,124(%esp) movl %ebp,160(%esp) leal 32(%esi),%ebp leal 32(%esi),%esi leal (%esp),%edi call _ecp_nistz256_add movl 160(%esp),%eax movl $64,%esi addl 188(%esp),%esi leal 64(%esp),%edi movl %esi,%ebp call _ecp_nistz256_mul_mont movl 160(%esp),%eax leal (%esp),%esi leal (%esp),%ebp leal (%esp),%edi call _ecp_nistz256_mul_mont movl 160(%esp),%eax movl 188(%esp),%ebp leal 32(%ebp),%esi leal 64(%ebp),%ebp leal 128(%esp),%edi call _ecp_nistz256_mul_mont leal 96(%esp),%esi leal 64(%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_add movl $64,%edi leal 128(%esp),%esi leal 128(%esp),%ebp addl 184(%esp),%edi call _ecp_nistz256_add leal 96(%esp),%esi leal 64(%esp),%ebp leal 64(%esp),%edi call _ecp_nistz256_sub movl 160(%esp),%eax leal (%esp),%esi leal (%esp),%ebp leal 128(%esp),%edi call _ecp_nistz256_mul_mont movl 160(%esp),%eax leal 32(%esp),%esi leal 64(%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_mul_mont movl $32,%edi leal 128(%esp),%esi addl 184(%esp),%edi call _ecp_nistz256_div_by_2 leal 32(%esp),%esi leal 32(%esp),%ebp leal 128(%esp),%edi call _ecp_nistz256_add movl 160(%esp),%eax leal 96(%esp),%esi leal (%esp),%ebp leal (%esp),%edi call _ecp_nistz256_mul_mont leal 128(%esp),%esi leal 32(%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_add leal (%esp),%esi leal (%esp),%ebp leal 128(%esp),%edi call _ecp_nistz256_add movl 160(%esp),%eax leal 32(%esp),%esi leal 32(%esp),%ebp movl 184(%esp),%edi call _ecp_nistz256_mul_mont movl %edi,%esi leal 128(%esp),%ebp call _ecp_nistz256_sub leal (%esp),%esi movl %edi,%ebp leal (%esp),%edi call _ecp_nistz256_sub movl 160(%esp),%eax movl %edi,%esi leal 32(%esp),%ebp call _ecp_nistz256_mul_mont movl $32,%ebp leal (%esp),%esi addl 184(%esp),%ebp movl %ebp,%edi call _ecp_nistz256_sub addl $164,%esp popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_nistz256_point_double,.-.L_GFp_nistz256_point_double_begin .globl GFp_nistz256_point_add_affine .hidden GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,@function .align 16 GFp_nistz256_point_add_affine: .L_GFp_nistz256_point_add_affine_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi subl $492,%esp call _picup_eax .L003pic: leal GFp_ia32cap_P-.L003pic(%eax),%edx movl (%edx),%ebp leal 96(%esp),%edi movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebp,488(%esp) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) movl %ebx,20(%edi) movl %ecx,24(%edi) movl %edx,28(%edi) movl 32(%esi),%eax movl 36(%esi),%ebx movl 40(%esi),%ecx movl 44(%esi),%edx movl %eax,32(%edi) movl %ebx,36(%edi) movl %ecx,40(%edi) movl %edx,44(%edi) movl 48(%esi),%eax movl 52(%esi),%ebx movl 56(%esi),%ecx movl 60(%esi),%edx movl %eax,48(%edi) movl %ebx,52(%edi) movl %ecx,56(%edi) movl %edx,60(%edi) movl 64(%esi),%eax movl 68(%esi),%ebx movl 72(%esi),%ecx movl 76(%esi),%edx movl %eax,64(%edi) movl %eax,%ebp movl %ebx,68(%edi) orl %ebx,%ebp movl %ecx,72(%edi) orl %ecx,%ebp movl %edx,76(%edi) orl %edx,%ebp movl 80(%esi),%eax movl 84(%esi),%ebx movl 88(%esi),%ecx movl 92(%esi),%edx movl %eax,80(%edi) orl %eax,%ebp movl %ebx,84(%edi) orl %ebx,%ebp movl %ecx,88(%edi) orl %ecx,%ebp movl %edx,92(%edi) orl %edx,%ebp xorl %eax,%eax movl 520(%esp),%esi subl %ebp,%eax orl %eax,%ebp sarl $31,%ebp movl %ebp,480(%esp) leal 192(%esp),%edi movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %eax,%ebp movl %ebx,4(%edi) orl %ebx,%ebp movl %ecx,8(%edi) orl %ecx,%ebp movl %edx,12(%edi) orl %edx,%ebp movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) orl %eax,%ebp movl %ebx,20(%edi) orl %ebx,%ebp movl %ecx,24(%edi) orl %ecx,%ebp movl %edx,28(%edi) orl %edx,%ebp movl 32(%esi),%eax movl 36(%esi),%ebx movl 40(%esi),%ecx movl 44(%esi),%edx movl %eax,32(%edi) orl %eax,%ebp movl %ebx,36(%edi) orl %ebx,%ebp movl %ecx,40(%edi) orl %ecx,%ebp movl %edx,44(%edi) orl %edx,%ebp movl 48(%esi),%eax movl 52(%esi),%ebx movl 56(%esi),%ecx movl 60(%esi),%edx movl %eax,48(%edi) orl %eax,%ebp movl %ebx,52(%edi) orl %ebx,%ebp movl %ecx,56(%edi) orl %ecx,%ebp movl %edx,60(%edi) orl %edx,%ebp xorl %ebx,%ebx movl 488(%esp),%eax subl %ebp,%ebx leal 160(%esp),%esi orl %ebp,%ebx leal 160(%esp),%ebp sarl $31,%ebx leal 288(%esp),%edi movl %ebx,484(%esp) call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 192(%esp),%esi movl %edi,%ebp leal 256(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 160(%esp),%esi leal 288(%esp),%ebp leal 288(%esp),%edi call _ecp_nistz256_mul_mont leal 256(%esp),%esi leal 96(%esp),%ebp leal 320(%esp),%edi call _ecp_nistz256_sub movl 488(%esp),%eax leal 224(%esp),%esi leal 288(%esp),%ebp leal 288(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 160(%esp),%esi leal 320(%esp),%ebp leal 64(%esp),%edi call _ecp_nistz256_mul_mont leal 288(%esp),%esi leal 128(%esp),%ebp leal 352(%esp),%edi call _ecp_nistz256_sub movl 488(%esp),%eax leal 320(%esp),%esi leal 320(%esp),%ebp leal 384(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 352(%esp),%esi leal 352(%esp),%ebp leal 448(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 96(%esp),%esi leal 384(%esp),%ebp leal 256(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 320(%esp),%esi leal 384(%esp),%ebp leal 416(%esp),%edi call _ecp_nistz256_mul_mont leal 256(%esp),%esi leal 256(%esp),%ebp leal 384(%esp),%edi call _ecp_nistz256_add leal 448(%esp),%esi leal 384(%esp),%ebp leal (%esp),%edi call _ecp_nistz256_sub leal (%esp),%esi leal 416(%esp),%ebp leal (%esp),%edi call _ecp_nistz256_sub leal 256(%esp),%esi leal (%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_sub movl 488(%esp),%eax leal 416(%esp),%esi leal 128(%esp),%ebp leal 288(%esp),%edi call _ecp_nistz256_mul_mont movl 488(%esp),%eax leal 352(%esp),%esi leal 32(%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_mul_mont leal 32(%esp),%esi leal 288(%esp),%ebp leal 32(%esp),%edi call _ecp_nistz256_sub movl 480(%esp),%ebp movl 484(%esp),%esi movl 512(%esp),%edi movl %ebp,%edx notl %ebp andl %esi,%edx andl %esi,%ebp notl %esi movl %edx,%eax andl 64(%esp),%eax movl %ebp,%ebx andl $1,%ebx movl %esi,%ecx andl 160(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,64(%edi) movl %edx,%eax andl 68(%esp),%eax movl %esi,%ecx andl 164(%esp),%ecx orl %ecx,%eax movl %eax,68(%edi) movl %edx,%eax andl 72(%esp),%eax movl %esi,%ecx andl 168(%esp),%ecx orl %ecx,%eax movl %eax,72(%edi) movl %edx,%eax andl 76(%esp),%eax movl %esi,%ecx andl 172(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,76(%edi) movl %edx,%eax andl 80(%esp),%eax movl %esi,%ecx andl 176(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,80(%edi) movl %edx,%eax andl 84(%esp),%eax movl %esi,%ecx andl 180(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,84(%edi) movl %edx,%eax andl 88(%esp),%eax movl %ebp,%ebx andl $-2,%ebx movl %esi,%ecx andl 184(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,88(%edi) movl %edx,%eax andl 92(%esp),%eax movl %esi,%ecx andl 188(%esp),%ecx orl %ecx,%eax movl %eax,92(%edi) movl %edx,%eax andl (%esp),%eax movl %ebp,%ebx andl 192(%esp),%ebx movl %esi,%ecx andl 96(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,(%edi) movl %edx,%eax andl 4(%esp),%eax movl %ebp,%ebx andl 196(%esp),%ebx movl %esi,%ecx andl 100(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,4(%edi) movl %edx,%eax andl 8(%esp),%eax movl %ebp,%ebx andl 200(%esp),%ebx movl %esi,%ecx andl 104(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,8(%edi) movl %edx,%eax andl 12(%esp),%eax movl %ebp,%ebx andl 204(%esp),%ebx movl %esi,%ecx andl 108(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,12(%edi) movl %edx,%eax andl 16(%esp),%eax movl %ebp,%ebx andl 208(%esp),%ebx movl %esi,%ecx andl 112(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,16(%edi) movl %edx,%eax andl 20(%esp),%eax movl %ebp,%ebx andl 212(%esp),%ebx movl %esi,%ecx andl 116(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,20(%edi) movl %edx,%eax andl 24(%esp),%eax movl %ebp,%ebx andl 216(%esp),%ebx movl %esi,%ecx andl 120(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,24(%edi) movl %edx,%eax andl 28(%esp),%eax movl %ebp,%ebx andl 220(%esp),%ebx movl %esi,%ecx andl 124(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,28(%edi) movl %edx,%eax andl 32(%esp),%eax movl %ebp,%ebx andl 224(%esp),%ebx movl %esi,%ecx andl 128(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,32(%edi) movl %edx,%eax andl 36(%esp),%eax movl %ebp,%ebx andl 228(%esp),%ebx movl %esi,%ecx andl 132(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,36(%edi) movl %edx,%eax andl 40(%esp),%eax movl %ebp,%ebx andl 232(%esp),%ebx movl %esi,%ecx andl 136(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,40(%edi) movl %edx,%eax andl 44(%esp),%eax movl %ebp,%ebx andl 236(%esp),%ebx movl %esi,%ecx andl 140(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,44(%edi) movl %edx,%eax andl 48(%esp),%eax movl %ebp,%ebx andl 240(%esp),%ebx movl %esi,%ecx andl 144(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,48(%edi) movl %edx,%eax andl 52(%esp),%eax movl %ebp,%ebx andl 244(%esp),%ebx movl %esi,%ecx andl 148(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,52(%edi) movl %edx,%eax andl 56(%esp),%eax movl %ebp,%ebx andl 248(%esp),%ebx movl %esi,%ecx andl 152(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,56(%edi) movl %edx,%eax andl 60(%esp),%eax movl %ebp,%ebx andl 252(%esp),%ebx movl %esi,%ecx andl 156(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,60(%edi) addl $492,%esp popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_nistz256_point_add_affine,.-.L_GFp_nistz256_point_add_affine_begin #endif ring-0.16.9/pregenerated/ecp_nistz256-x86-macosx.S000064400000000000000000000513341353224261000176770ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text LONE_mont: .long 1,0,0,-1,-1,-1,-2,0 .private_extern __ecp_nistz256_div_by_2 .align 4 __ecp_nistz256_div_by_2: movl (%esi),%ebp xorl %edx,%edx movl 4(%esi),%ebx movl %ebp,%eax andl $1,%ebp movl 8(%esi),%ecx subl %ebp,%edx addl %edx,%eax adcl %edx,%ebx movl %eax,(%edi) adcl %edx,%ecx movl %ebx,4(%edi) movl %ecx,8(%edi) movl 12(%esi),%eax movl 16(%esi),%ebx adcl $0,%eax movl 20(%esi),%ecx adcl $0,%ebx movl %eax,12(%edi) adcl $0,%ecx movl %ebx,16(%edi) movl %ecx,20(%edi) movl 24(%esi),%eax movl 28(%esi),%ebx adcl %ebp,%eax adcl %edx,%ebx movl %eax,24(%edi) sbbl %esi,%esi movl %ebx,28(%edi) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%edx shrl $1,%eax movl %ebx,%ebp shll $31,%ebx orl %ebx,%eax shrl $1,%ebp movl %ecx,%ebx shll $31,%ecx movl %eax,(%edi) orl %ecx,%ebp movl 16(%edi),%eax shrl $1,%ebx movl %edx,%ecx shll $31,%edx movl %ebp,4(%edi) orl %edx,%ebx movl 20(%edi),%ebp shrl $1,%ecx movl %eax,%edx shll $31,%eax movl %ebx,8(%edi) orl %eax,%ecx movl 24(%edi),%ebx shrl $1,%edx movl %ebp,%eax shll $31,%ebp movl %ecx,12(%edi) orl %ebp,%edx movl 28(%edi),%ecx shrl $1,%eax movl %ebx,%ebp shll $31,%ebx movl %edx,16(%edi) orl %ebx,%eax shrl $1,%ebp movl %ecx,%ebx shll $31,%ecx movl %eax,20(%edi) orl %ecx,%ebp shrl $1,%ebx shll $31,%esi movl %ebp,24(%edi) orl %esi,%ebx movl %ebx,28(%edi) ret .globl _GFp_nistz256_add .private_extern _GFp_nistz256_add .align 4 _GFp_nistz256_add: L_GFp_nistz256_add_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 28(%esp),%ebp movl 20(%esp),%edi call __ecp_nistz256_add popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __ecp_nistz256_add .align 4 __ecp_nistz256_add: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx addl (%ebp),%eax movl 12(%esi),%edx adcl 4(%ebp),%ebx movl %eax,(%edi) adcl 8(%ebp),%ecx movl %ebx,4(%edi) adcl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx adcl 16(%ebp),%eax movl 28(%esi),%edx adcl 20(%ebp),%ebx movl %eax,16(%edi) adcl 24(%ebp),%ecx movl %ebx,20(%edi) movl $0,%esi adcl 28(%ebp),%edx movl %ecx,24(%edi) adcl $0,%esi movl %edx,28(%edi) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx subl $-1,%eax movl 12(%edi),%edx sbbl $-1,%ebx movl 16(%edi),%eax sbbl $-1,%ecx movl 20(%edi),%ebx sbbl $0,%edx movl 24(%edi),%ecx sbbl $0,%eax movl 28(%edi),%edx sbbl $0,%ebx sbbl $1,%ecx sbbl $-1,%edx sbbl $0,%esi notl %esi movl (%edi),%eax movl %esi,%ebp movl 4(%edi),%ebx shrl $31,%ebp movl 8(%edi),%ecx subl %esi,%eax movl 12(%edi),%edx sbbl %esi,%ebx movl %eax,(%edi) sbbl %esi,%ecx movl %ebx,4(%edi) sbbl $0,%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%edi),%eax movl 20(%edi),%ebx movl 24(%edi),%ecx sbbl $0,%eax movl 28(%edi),%edx sbbl $0,%ebx movl %eax,16(%edi) sbbl %ebp,%ecx movl %ebx,20(%edi) sbbl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .private_extern __ecp_nistz256_sub .align 4 __ecp_nistz256_sub: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx subl (%ebp),%eax movl 12(%esi),%edx sbbl 4(%ebp),%ebx movl %eax,(%edi) sbbl 8(%ebp),%ecx movl %ebx,4(%edi) sbbl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx sbbl 16(%ebp),%eax movl 28(%esi),%edx sbbl 20(%ebp),%ebx sbbl 24(%ebp),%ecx movl %eax,16(%edi) sbbl 28(%ebp),%edx movl %ebx,20(%edi) sbbl %esi,%esi movl %ecx,24(%edi) movl %edx,28(%edi) movl (%edi),%eax movl %esi,%ebp movl 4(%edi),%ebx shrl $31,%ebp movl 8(%edi),%ecx addl %esi,%eax movl 12(%edi),%edx adcl %esi,%ebx movl %eax,(%edi) adcl %esi,%ecx movl %ebx,4(%edi) adcl $0,%edx movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%edi),%eax movl 20(%edi),%ebx movl 24(%edi),%ecx adcl $0,%eax movl 28(%edi),%edx adcl $0,%ebx movl %eax,16(%edi) adcl %ebp,%ecx movl %ebx,20(%edi) adcl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .globl _GFp_nistz256_neg .private_extern _GFp_nistz256_neg .align 4 _GFp_nistz256_neg: L_GFp_nistz256_neg_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%ebp movl 20(%esp),%edi xorl %eax,%eax subl $32,%esp movl %eax,(%esp) movl %esp,%esi movl %eax,4(%esp) movl %eax,8(%esp) movl %eax,12(%esp) movl %eax,16(%esp) movl %eax,20(%esp) movl %eax,24(%esp) movl %eax,28(%esp) call __ecp_nistz256_sub addl $32,%esp popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __picup_eax .align 4 __picup_eax: movl (%esp),%eax ret .globl _GFp_nistz256_mul_mont .private_extern _GFp_nistz256_mul_mont .align 4 _GFp_nistz256_mul_mont: L_GFp_nistz256_mul_mont_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi movl 28(%esp),%ebp call __picup_eax L000pic: movl L_GFp_ia32cap_P$non_lazy_ptr-L000pic(%eax),%eax movl (%eax),%eax movl 20(%esp),%edi call __ecp_nistz256_mul_mont popl %edi popl %esi popl %ebx popl %ebp ret .private_extern __ecp_nistz256_mul_mont .align 4 __ecp_nistz256_mul_mont: movl %esp,%edx subl $256,%esp movd (%ebp),%xmm7 leal 4(%ebp),%ebp pcmpeqd %xmm6,%xmm6 psrlq $48,%xmm6 pshuflw $220,%xmm7,%xmm7 andl $-64,%esp pshufd $220,%xmm7,%xmm7 leal 128(%esp),%ebx movd (%esi),%xmm0 pshufd $204,%xmm0,%xmm0 movd 4(%esi),%xmm1 movdqa %xmm0,(%ebx) pmuludq %xmm7,%xmm0 movd 8(%esi),%xmm2 pshufd $204,%xmm1,%xmm1 movdqa %xmm1,16(%ebx) pmuludq %xmm7,%xmm1 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 pand %xmm6,%xmm5 movd 12(%esi),%xmm3 pshufd $204,%xmm2,%xmm2 movdqa %xmm2,32(%ebx) pmuludq %xmm7,%xmm2 paddq %xmm4,%xmm1 movdqa %xmm1,(%esp) movd 16(%esi),%xmm0 pshufd $204,%xmm3,%xmm3 movdqa %xmm3,48(%ebx) pmuludq %xmm7,%xmm3 movdqa %xmm2,16(%esp) movd 20(%esi),%xmm1 pshufd $204,%xmm0,%xmm0 movdqa %xmm0,64(%ebx) pmuludq %xmm7,%xmm0 paddq %xmm5,%xmm3 movdqa %xmm3,32(%esp) movd 24(%esi),%xmm2 pshufd $204,%xmm1,%xmm1 movdqa %xmm1,80(%ebx) pmuludq %xmm7,%xmm1 movdqa %xmm0,48(%esp) pshufd $177,%xmm5,%xmm4 movd 28(%esi),%xmm3 pshufd $204,%xmm2,%xmm2 movdqa %xmm2,96(%ebx) pmuludq %xmm7,%xmm2 movdqa %xmm1,64(%esp) psubq %xmm5,%xmm4 movd (%ebp),%xmm0 pshufd $204,%xmm3,%xmm3 movdqa %xmm3,112(%ebx) pmuludq %xmm7,%xmm3 pshuflw $220,%xmm0,%xmm7 movdqa (%ebx),%xmm0 pshufd $220,%xmm7,%xmm7 movl $6,%ecx leal 4(%ebp),%ebp jmp L001madd_sse2 .align 4,0x90 L001madd_sse2: paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa 16(%ebx),%xmm1 pmuludq %xmm7,%xmm0 movdqa %xmm2,80(%esp) movdqa 32(%ebx),%xmm2 pmuludq %xmm7,%xmm1 movdqa %xmm3,96(%esp) paddq (%esp),%xmm0 movdqa 48(%ebx),%xmm3 pmuludq %xmm7,%xmm2 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq 16(%esp),%xmm1 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 movdqa 64(%ebx),%xmm0 pmuludq %xmm7,%xmm3 paddq %xmm4,%xmm1 paddq 32(%esp),%xmm2 movdqa %xmm1,(%esp) movdqa 80(%ebx),%xmm1 pmuludq %xmm7,%xmm0 paddq 48(%esp),%xmm3 movdqa %xmm2,16(%esp) pand %xmm6,%xmm5 movdqa 96(%ebx),%xmm2 pmuludq %xmm7,%xmm1 paddq %xmm5,%xmm3 paddq 64(%esp),%xmm0 movdqa %xmm3,32(%esp) pshufd $177,%xmm5,%xmm4 movdqa %xmm7,%xmm3 pmuludq %xmm7,%xmm2 movd (%ebp),%xmm7 leal 4(%ebp),%ebp paddq 80(%esp),%xmm1 psubq %xmm5,%xmm4 movdqa %xmm0,48(%esp) pshuflw $220,%xmm7,%xmm7 pmuludq 112(%ebx),%xmm3 pshufd $220,%xmm7,%xmm7 movdqa (%ebx),%xmm0 movdqa %xmm1,64(%esp) paddq 96(%esp),%xmm2 decl %ecx jnz L001madd_sse2 paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa 16(%ebx),%xmm1 pmuludq %xmm7,%xmm0 movdqa %xmm2,80(%esp) movdqa 32(%ebx),%xmm2 pmuludq %xmm7,%xmm1 movdqa %xmm3,96(%esp) paddq (%esp),%xmm0 movdqa 48(%ebx),%xmm3 pmuludq %xmm7,%xmm2 movq %xmm0,%xmm4 pslldq $6,%xmm4 paddq 16(%esp),%xmm1 paddq %xmm0,%xmm4 movdqa %xmm4,%xmm5 psrldq $10,%xmm4 movdqa 64(%ebx),%xmm0 pmuludq %xmm7,%xmm3 paddq %xmm4,%xmm1 paddq 32(%esp),%xmm2 movdqa %xmm1,(%esp) movdqa 80(%ebx),%xmm1 pmuludq %xmm7,%xmm0 paddq 48(%esp),%xmm3 movdqa %xmm2,16(%esp) pand %xmm6,%xmm5 movdqa 96(%ebx),%xmm2 pmuludq %xmm7,%xmm1 paddq %xmm5,%xmm3 paddq 64(%esp),%xmm0 movdqa %xmm3,32(%esp) pshufd $177,%xmm5,%xmm4 movdqa 112(%ebx),%xmm3 pmuludq %xmm7,%xmm2 paddq 80(%esp),%xmm1 psubq %xmm5,%xmm4 movdqa %xmm0,48(%esp) pmuludq %xmm7,%xmm3 pcmpeqd %xmm7,%xmm7 movdqa (%esp),%xmm0 pslldq $8,%xmm7 movdqa %xmm1,64(%esp) paddq 96(%esp),%xmm2 paddq %xmm5,%xmm2 paddq %xmm4,%xmm3 movdqa %xmm2,80(%esp) movdqa %xmm3,96(%esp) movdqa 16(%esp),%xmm1 movdqa 32(%esp),%xmm2 movdqa 48(%esp),%xmm3 movq %xmm0,%xmm4 pand %xmm7,%xmm0 xorl %ebp,%ebp pslldq $6,%xmm4 movq %xmm1,%xmm5 paddq %xmm4,%xmm0 pand %xmm7,%xmm1 psrldq $6,%xmm0 movd %xmm0,%eax psrldq $4,%xmm0 paddq %xmm0,%xmm5 movdqa 64(%esp),%xmm0 subl $-1,%eax pslldq $6,%xmm5 movq %xmm2,%xmm4 paddq %xmm5,%xmm1 pand %xmm7,%xmm2 psrldq $6,%xmm1 movl %eax,(%edi) movd %xmm1,%eax psrldq $4,%xmm1 paddq %xmm1,%xmm4 movdqa 80(%esp),%xmm1 sbbl $-1,%eax pslldq $6,%xmm4 movq %xmm3,%xmm5 paddq %xmm4,%xmm2 pand %xmm7,%xmm3 psrldq $6,%xmm2 movl %eax,4(%edi) movd %xmm2,%eax psrldq $4,%xmm2 paddq %xmm2,%xmm5 movdqa 96(%esp),%xmm2 sbbl $-1,%eax pslldq $6,%xmm5 movq %xmm0,%xmm4 paddq %xmm5,%xmm3 pand %xmm7,%xmm0 psrldq $6,%xmm3 movl %eax,8(%edi) movd %xmm3,%eax psrldq $4,%xmm3 paddq %xmm3,%xmm4 sbbl $0,%eax pslldq $6,%xmm4 movq %xmm1,%xmm5 paddq %xmm4,%xmm0 pand %xmm7,%xmm1 psrldq $6,%xmm0 movl %eax,12(%edi) movd %xmm0,%eax psrldq $4,%xmm0 paddq %xmm0,%xmm5 sbbl $0,%eax pslldq $6,%xmm5 movq %xmm2,%xmm4 paddq %xmm5,%xmm1 pand %xmm7,%xmm2 psrldq $6,%xmm1 movd %xmm1,%ebx psrldq $4,%xmm1 movl %edx,%esp paddq %xmm1,%xmm4 pslldq $6,%xmm4 paddq %xmm4,%xmm2 psrldq $6,%xmm2 movd %xmm2,%ecx psrldq $4,%xmm2 sbbl $0,%ebx movd %xmm2,%edx pextrw $2,%xmm2,%esi sbbl $1,%ecx sbbl $-1,%edx sbbl $0,%esi subl %esi,%ebp addl %esi,(%edi) adcl %esi,4(%edi) adcl %esi,8(%edi) adcl $0,12(%edi) adcl $0,%eax adcl $0,%ebx movl %eax,16(%edi) adcl %ebp,%ecx movl %ebx,20(%edi) adcl %esi,%edx movl %ecx,24(%edi) movl %edx,28(%edi) ret .globl _GFp_nistz256_point_double .private_extern _GFp_nistz256_point_double .align 4 _GFp_nistz256_point_double: L_GFp_nistz256_point_double_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi subl $164,%esp call __picup_eax L002pic: movl L_GFp_ia32cap_P$non_lazy_ptr-L002pic(%eax),%edx movl (%edx),%ebp Lpoint_double_shortcut: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,96(%esp) movl %ebx,100(%esp) movl %ecx,104(%esp) movl %edx,108(%esp) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,112(%esp) movl %ebx,116(%esp) movl %ecx,120(%esp) movl %edx,124(%esp) movl %ebp,160(%esp) leal 32(%esi),%ebp leal 32(%esi),%esi leal (%esp),%edi call __ecp_nistz256_add movl 160(%esp),%eax movl $64,%esi addl 188(%esp),%esi leal 64(%esp),%edi movl %esi,%ebp call __ecp_nistz256_mul_mont movl 160(%esp),%eax leal (%esp),%esi leal (%esp),%ebp leal (%esp),%edi call __ecp_nistz256_mul_mont movl 160(%esp),%eax movl 188(%esp),%ebp leal 32(%ebp),%esi leal 64(%ebp),%ebp leal 128(%esp),%edi call __ecp_nistz256_mul_mont leal 96(%esp),%esi leal 64(%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_add movl $64,%edi leal 128(%esp),%esi leal 128(%esp),%ebp addl 184(%esp),%edi call __ecp_nistz256_add leal 96(%esp),%esi leal 64(%esp),%ebp leal 64(%esp),%edi call __ecp_nistz256_sub movl 160(%esp),%eax leal (%esp),%esi leal (%esp),%ebp leal 128(%esp),%edi call __ecp_nistz256_mul_mont movl 160(%esp),%eax leal 32(%esp),%esi leal 64(%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_mul_mont movl $32,%edi leal 128(%esp),%esi addl 184(%esp),%edi call __ecp_nistz256_div_by_2 leal 32(%esp),%esi leal 32(%esp),%ebp leal 128(%esp),%edi call __ecp_nistz256_add movl 160(%esp),%eax leal 96(%esp),%esi leal (%esp),%ebp leal (%esp),%edi call __ecp_nistz256_mul_mont leal 128(%esp),%esi leal 32(%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_add leal (%esp),%esi leal (%esp),%ebp leal 128(%esp),%edi call __ecp_nistz256_add movl 160(%esp),%eax leal 32(%esp),%esi leal 32(%esp),%ebp movl 184(%esp),%edi call __ecp_nistz256_mul_mont movl %edi,%esi leal 128(%esp),%ebp call __ecp_nistz256_sub leal (%esp),%esi movl %edi,%ebp leal (%esp),%edi call __ecp_nistz256_sub movl 160(%esp),%eax movl %edi,%esi leal 32(%esp),%ebp call __ecp_nistz256_mul_mont movl $32,%ebp leal (%esp),%esi addl 184(%esp),%ebp movl %ebp,%edi call __ecp_nistz256_sub addl $164,%esp popl %edi popl %esi popl %ebx popl %ebp ret .globl _GFp_nistz256_point_add_affine .private_extern _GFp_nistz256_point_add_affine .align 4 _GFp_nistz256_point_add_affine: L_GFp_nistz256_point_add_affine_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 24(%esp),%esi subl $492,%esp call __picup_eax L003pic: movl L_GFp_ia32cap_P$non_lazy_ptr-L003pic(%eax),%edx movl (%edx),%ebp leal 96(%esp),%edi movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %ebp,488(%esp) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) movl %ebx,20(%edi) movl %ecx,24(%edi) movl %edx,28(%edi) movl 32(%esi),%eax movl 36(%esi),%ebx movl 40(%esi),%ecx movl 44(%esi),%edx movl %eax,32(%edi) movl %ebx,36(%edi) movl %ecx,40(%edi) movl %edx,44(%edi) movl 48(%esi),%eax movl 52(%esi),%ebx movl 56(%esi),%ecx movl 60(%esi),%edx movl %eax,48(%edi) movl %ebx,52(%edi) movl %ecx,56(%edi) movl %edx,60(%edi) movl 64(%esi),%eax movl 68(%esi),%ebx movl 72(%esi),%ecx movl 76(%esi),%edx movl %eax,64(%edi) movl %eax,%ebp movl %ebx,68(%edi) orl %ebx,%ebp movl %ecx,72(%edi) orl %ecx,%ebp movl %edx,76(%edi) orl %edx,%ebp movl 80(%esi),%eax movl 84(%esi),%ebx movl 88(%esi),%ecx movl 92(%esi),%edx movl %eax,80(%edi) orl %eax,%ebp movl %ebx,84(%edi) orl %ebx,%ebp movl %ecx,88(%edi) orl %ecx,%ebp movl %edx,92(%edi) orl %edx,%ebp xorl %eax,%eax movl 520(%esp),%esi subl %ebp,%eax orl %eax,%ebp sarl $31,%ebp movl %ebp,480(%esp) leal 192(%esp),%edi movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx movl %eax,(%edi) movl %eax,%ebp movl %ebx,4(%edi) orl %ebx,%ebp movl %ecx,8(%edi) orl %ecx,%ebp movl %edx,12(%edi) orl %edx,%ebp movl 16(%esi),%eax movl 20(%esi),%ebx movl 24(%esi),%ecx movl 28(%esi),%edx movl %eax,16(%edi) orl %eax,%ebp movl %ebx,20(%edi) orl %ebx,%ebp movl %ecx,24(%edi) orl %ecx,%ebp movl %edx,28(%edi) orl %edx,%ebp movl 32(%esi),%eax movl 36(%esi),%ebx movl 40(%esi),%ecx movl 44(%esi),%edx movl %eax,32(%edi) orl %eax,%ebp movl %ebx,36(%edi) orl %ebx,%ebp movl %ecx,40(%edi) orl %ecx,%ebp movl %edx,44(%edi) orl %edx,%ebp movl 48(%esi),%eax movl 52(%esi),%ebx movl 56(%esi),%ecx movl 60(%esi),%edx movl %eax,48(%edi) orl %eax,%ebp movl %ebx,52(%edi) orl %ebx,%ebp movl %ecx,56(%edi) orl %ecx,%ebp movl %edx,60(%edi) orl %edx,%ebp xorl %ebx,%ebx movl 488(%esp),%eax subl %ebp,%ebx leal 160(%esp),%esi orl %ebp,%ebx leal 160(%esp),%ebp sarl $31,%ebx leal 288(%esp),%edi movl %ebx,484(%esp) call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 192(%esp),%esi movl %edi,%ebp leal 256(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 160(%esp),%esi leal 288(%esp),%ebp leal 288(%esp),%edi call __ecp_nistz256_mul_mont leal 256(%esp),%esi leal 96(%esp),%ebp leal 320(%esp),%edi call __ecp_nistz256_sub movl 488(%esp),%eax leal 224(%esp),%esi leal 288(%esp),%ebp leal 288(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 160(%esp),%esi leal 320(%esp),%ebp leal 64(%esp),%edi call __ecp_nistz256_mul_mont leal 288(%esp),%esi leal 128(%esp),%ebp leal 352(%esp),%edi call __ecp_nistz256_sub movl 488(%esp),%eax leal 320(%esp),%esi leal 320(%esp),%ebp leal 384(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 352(%esp),%esi leal 352(%esp),%ebp leal 448(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 96(%esp),%esi leal 384(%esp),%ebp leal 256(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 320(%esp),%esi leal 384(%esp),%ebp leal 416(%esp),%edi call __ecp_nistz256_mul_mont leal 256(%esp),%esi leal 256(%esp),%ebp leal 384(%esp),%edi call __ecp_nistz256_add leal 448(%esp),%esi leal 384(%esp),%ebp leal (%esp),%edi call __ecp_nistz256_sub leal (%esp),%esi leal 416(%esp),%ebp leal (%esp),%edi call __ecp_nistz256_sub leal 256(%esp),%esi leal (%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_sub movl 488(%esp),%eax leal 416(%esp),%esi leal 128(%esp),%ebp leal 288(%esp),%edi call __ecp_nistz256_mul_mont movl 488(%esp),%eax leal 352(%esp),%esi leal 32(%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_mul_mont leal 32(%esp),%esi leal 288(%esp),%ebp leal 32(%esp),%edi call __ecp_nistz256_sub movl 480(%esp),%ebp movl 484(%esp),%esi movl 512(%esp),%edi movl %ebp,%edx notl %ebp andl %esi,%edx andl %esi,%ebp notl %esi movl %edx,%eax andl 64(%esp),%eax movl %ebp,%ebx andl $1,%ebx movl %esi,%ecx andl 160(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,64(%edi) movl %edx,%eax andl 68(%esp),%eax movl %esi,%ecx andl 164(%esp),%ecx orl %ecx,%eax movl %eax,68(%edi) movl %edx,%eax andl 72(%esp),%eax movl %esi,%ecx andl 168(%esp),%ecx orl %ecx,%eax movl %eax,72(%edi) movl %edx,%eax andl 76(%esp),%eax movl %esi,%ecx andl 172(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,76(%edi) movl %edx,%eax andl 80(%esp),%eax movl %esi,%ecx andl 176(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,80(%edi) movl %edx,%eax andl 84(%esp),%eax movl %esi,%ecx andl 180(%esp),%ecx orl %ebp,%eax orl %ecx,%eax movl %eax,84(%edi) movl %edx,%eax andl 88(%esp),%eax movl %ebp,%ebx andl $-2,%ebx movl %esi,%ecx andl 184(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,88(%edi) movl %edx,%eax andl 92(%esp),%eax movl %esi,%ecx andl 188(%esp),%ecx orl %ecx,%eax movl %eax,92(%edi) movl %edx,%eax andl (%esp),%eax movl %ebp,%ebx andl 192(%esp),%ebx movl %esi,%ecx andl 96(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,(%edi) movl %edx,%eax andl 4(%esp),%eax movl %ebp,%ebx andl 196(%esp),%ebx movl %esi,%ecx andl 100(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,4(%edi) movl %edx,%eax andl 8(%esp),%eax movl %ebp,%ebx andl 200(%esp),%ebx movl %esi,%ecx andl 104(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,8(%edi) movl %edx,%eax andl 12(%esp),%eax movl %ebp,%ebx andl 204(%esp),%ebx movl %esi,%ecx andl 108(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,12(%edi) movl %edx,%eax andl 16(%esp),%eax movl %ebp,%ebx andl 208(%esp),%ebx movl %esi,%ecx andl 112(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,16(%edi) movl %edx,%eax andl 20(%esp),%eax movl %ebp,%ebx andl 212(%esp),%ebx movl %esi,%ecx andl 116(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,20(%edi) movl %edx,%eax andl 24(%esp),%eax movl %ebp,%ebx andl 216(%esp),%ebx movl %esi,%ecx andl 120(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,24(%edi) movl %edx,%eax andl 28(%esp),%eax movl %ebp,%ebx andl 220(%esp),%ebx movl %esi,%ecx andl 124(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,28(%edi) movl %edx,%eax andl 32(%esp),%eax movl %ebp,%ebx andl 224(%esp),%ebx movl %esi,%ecx andl 128(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,32(%edi) movl %edx,%eax andl 36(%esp),%eax movl %ebp,%ebx andl 228(%esp),%ebx movl %esi,%ecx andl 132(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,36(%edi) movl %edx,%eax andl 40(%esp),%eax movl %ebp,%ebx andl 232(%esp),%ebx movl %esi,%ecx andl 136(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,40(%edi) movl %edx,%eax andl 44(%esp),%eax movl %ebp,%ebx andl 236(%esp),%ebx movl %esi,%ecx andl 140(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,44(%edi) movl %edx,%eax andl 48(%esp),%eax movl %ebp,%ebx andl 240(%esp),%ebx movl %esi,%ecx andl 144(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,48(%edi) movl %edx,%eax andl 52(%esp),%eax movl %ebp,%ebx andl 244(%esp),%ebx movl %esi,%ecx andl 148(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,52(%edi) movl %edx,%eax andl 56(%esp),%eax movl %ebp,%ebx andl 248(%esp),%ebx movl %esi,%ecx andl 152(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,56(%edi) movl %edx,%eax andl 60(%esp),%eax movl %ebp,%ebx andl 252(%esp),%ebx movl %esi,%ecx andl 156(%esp),%ecx orl %ebx,%eax orl %ecx,%eax movl %eax,60(%edi) addl $492,%esp popl %edi popl %esi popl %ebx popl %ebp ret .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/ecp_nistz256-x86-win32n.obj000064400000000000000000000353761353224260700201130ustar0000000000000000LEi]6!.textx, p`.bssx0.debug$S$J5,@B.debug$T 6@B.1ҋ^N)Ӊщ_OF ^NG _OF^ӉG__OW   ͋Go Ӌo_ _O OW G o _ USVWt$l$|$ _^[]Í^NEV ]M_U OW F^NEV]GM_UOW_OW G_OW֋_O)W _OW G_OWG_OWÍ&^N+EV ]M_U OW F^NEV]MGU_OW_OW _OW G_OWG_OWÐUSVWl$|$1 $D$D$D$ D$D$D$D$9 _^[]Ð$ USVWt$l$|$_^[]fn}mfvfs0p܃fp܍$fnfpfnNfffnVfpfKf~fsffofs ffn^ fpfS fff $fnFfpf[0ffT$fnNfpfC@fff\$ fnVfpfKPffD$0fpfn^fpfS`ffL$@ffnEfpf[pfpfofpܹmt&fffoKffT$PfoS ff\$`f$fo[0f~fsfL$ffofs foC@fffT$ f $foKPff\$0fT$ffoS`fffD$@f\$ fpfoffn}mfL$PffD$0pf[pfpfofL$@fT$`IfffoKffT$PfoS ff\$`f$fo[0f~fsfL$ffofs foC@fffT$ f $foKPff\$0fT$ffoS`fffD$@f\$ fpfo[pffL$PffD$0ffvfo$fsfL$@fT$`fffT$Pf\$`foL$foT$ fo\$0~f1fs~fffsf~fsffoD$@fs~fffsf~fsffoL$Pfs~fffsGf~fsffoT$`fs~fffsGf~fsffs~fffsG f~fsffs~fffsf~fsffsffsf~fsf~f)7wwW G_OWÍt&USVWt$=*^NV D$`\$dL$hT$lF^NVD$p\$tL$xT$|$n v <$I$@$|$@ $4$,$<$$$u m@$t$`l$@|$ @$$$t$`l$@|$@$4$,$$|$t$ l$@|$ d $$|t$ l$ $X$t$`,$<$"$l$ |$ .4$,$$$t$ l$ $$4$<$$l$ 4$$Ĥ_^[]ÍvUSVWt$=*|$`^NV $_OW F^NVG_OWF ^$N(V,G _$O(W,F0^4N8V{?~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjmnopqrstuvwx y z|}~!#&),/258;>ADGJMRUX[^`cfilorux{~  "%(*,/257:<>@CFILORUX[^acfhknopqrstx|~      !"#%&'()*+,-.012345 6789:!;&<+=/>3?8@=ABBFCJDOESFWG\H`IeJjKoLsMwN|OPQRSTUVWXYZ[\]^_`abcdefghijk lmnop r$s(t-u1v7w<x@yFzK{P|T}X~]cgkpuy}  !%+059=BHLPUZ^bhmrv|  !%*.47<@DHMOSX\bejnrv{~      "%).147 9!;">#A$E%H&K'N(P)S*U+X,[-\/`2a3b4c5d6h7n8s:y;{=}>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcd"e&f+g0h7i>jEkJlNmRnVo[pbqerhsottu{vwxyz{|}~       " % * 1 3 7 < A D K M R X Y Z [ \ ] ` a b c d h n s y {                                                         " $ & - / 1 4 ; B D G J M O Q T V Y [ ^ ` c f i l o q t v y { ~                  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 :" ;) <. =5 >9 ?@ @E AL BS CZ Da Ef Fm Gt H{ I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c& d- e4 f9 g@ hG iJ jO kR lY m\ na oh pk qo rt s{ t u v w x y z { | } ~                             ! # & ( , . 5 7 9 < > B D K M O R T X Z a c e h j n p s u | ~                                            !#')0268:=?CELNRTVY[_ahjnpr u w { }  !"#$%&'()*+,-./0123 4 5 6789:;!<(=*>,?/@1A5B7C>D@EGFIGKHNIPJTKVL]M_NfOhPjQmRsStTuUvVwW7P:\ring\pregenerated\ecp_nistz256-x86-win32n.objyasm 1.3.0L$ONE_mont! __ecp_nistz256_div_by_2_GFp_nistz256_add#L$_GFp_nistz256_add_begin__ecp_nistz256_add__ecp_nistz256_subp_GFp_nistz256_neg#pL$_GFp_nistz256_neg_begin__picup_eax _GFp_nistz256_mul_mont(L$_GFp_nistz256_mul_mont_beginL$000pic!__ecp_nistz256_mul_mont L$001madd_sse2$`_GFp_nistz256_point_double,`L$_GFp_nistz256_point_double_beginsL$002pic!{L$point_double_shortcut(` _GFp_nistz256_point_add_affine0` L$_GFp_nistz256_point_add_affine_begins L$003picl p " " (" ," K" O" h" l" " " " " " " " " # # "# &# D# H# n# r# # # # # # # # # $ $ '$ +$ J$ N$ t$ x$ $ $ .fileg@feat.00.textx1< TfppL$000pic#; J`e`L$002pics{` ` L$003pics .bss.debug$S$,.debug$T pregenerated\tmp\ecp_nistz256-x86-win32n.asmL$ONE_mont__ecp_nistz256_div_by_2_GFp_nistz256_addL$_GFp_nistz256_add_begin__ecp_nistz256_add__ecp_nistz256_sub_GFp_nistz256_negL$_GFp_nistz256_neg_begin__picup_eax_GFp_nistz256_mul_montL$_GFp_nistz256_mul_mont_begin_GFp_ia32cap_P__ecp_nistz256_mul_montL$001madd_sse2_GFp_nistz256_point_doubleL$_GFp_nistz256_point_double_beginL$point_double_shortcut_GFp_nistz256_point_add_affineL$_GFp_nistz256_point_add_affine_beginring-0.16.9/pregenerated/ghash-armv4-ios32.S000064400000000000000000000142401353224261100166030ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL @ instructions are in aesv8-armx.pl.) .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #define ldrplb ldrbpl #define ldrneb ldrbne #endif #if defined(__thumb2__) .thumb #else .code 32 #endif #if __ARM_MAX_ARCH__>=7 .globl _GFp_gcm_init_neon .private_extern _GFp_gcm_init_neon #ifdef __thumb2__ .thumb_func _GFp_gcm_init_neon #endif .align 4 _GFp_gcm_init_neon: vld1.64 d7,[r1]! @ load H vmov.i8 q8,#0xe1 vld1.64 d6,[r1] vshl.i64 d17,#57 vshr.u64 d16,#63 @ t0=0xc2....01 vdup.8 q9,d7[7] vshr.u64 d26,d6,#63 vshr.s8 q9,#7 @ broadcast carry bit vshl.i64 q3,q3,#1 vand q8,q8,q9 vorr d7,d26 @ H<<<=1 veor q3,q3,q8 @ twisted H vstmia r0,{q3} bx lr @ bx lr .globl _GFp_gcm_gmult_neon .private_extern _GFp_gcm_gmult_neon #ifdef __thumb2__ .thumb_func _GFp_gcm_gmult_neon #endif .align 4 _GFp_gcm_gmult_neon: vld1.64 d7,[r0]! @ load Xi vld1.64 d6,[r0]! vmov.i64 d29,#0x0000ffffffffffff vldmia r1,{d26,d27} @ load twisted H vmov.i64 d30,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 q3,q3 #endif vmov.i64 d31,#0x000000000000ffff veor d28,d26,d27 @ Karatsuba pre-processing mov r3,#16 b Lgmult_neon .globl _GFp_gcm_ghash_neon .private_extern _GFp_gcm_ghash_neon #ifdef __thumb2__ .thumb_func _GFp_gcm_ghash_neon #endif .align 4 _GFp_gcm_ghash_neon: vld1.64 d1,[r0]! @ load Xi vld1.64 d0,[r0]! vmov.i64 d29,#0x0000ffffffffffff vldmia r1,{d26,d27} @ load twisted H vmov.i64 d30,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 q0,q0 #endif vmov.i64 d31,#0x000000000000ffff veor d28,d26,d27 @ Karatsuba pre-processing Loop_neon: vld1.64 d7,[r2]! @ load inp vld1.64 d6,[r2]! #ifdef __ARMEL__ vrev64.8 q3,q3 #endif veor q3,q0 @ inp^=Xi Lgmult_neon: vext.8 d16, d26, d26, #1 @ A1 vmull.p8 q8, d16, d6 @ F = A1*B vext.8 d0, d6, d6, #1 @ B1 vmull.p8 q0, d26, d0 @ E = A*B1 vext.8 d18, d26, d26, #2 @ A2 vmull.p8 q9, d18, d6 @ H = A2*B vext.8 d22, d6, d6, #2 @ B2 vmull.p8 q11, d26, d22 @ G = A*B2 vext.8 d20, d26, d26, #3 @ A3 veor q8, q8, q0 @ L = E + F vmull.p8 q10, d20, d6 @ J = A3*B vext.8 d0, d6, d6, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q0, d26, d0 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d6, d6, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d26, d22 @ K = A*B4 veor q10, q10, q0 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q0, d26, d6 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q0, q0, q8 veor q0, q0, q10 veor d6,d6,d7 @ Karatsuba pre-processing vext.8 d16, d28, d28, #1 @ A1 vmull.p8 q8, d16, d6 @ F = A1*B vext.8 d2, d6, d6, #1 @ B1 vmull.p8 q1, d28, d2 @ E = A*B1 vext.8 d18, d28, d28, #2 @ A2 vmull.p8 q9, d18, d6 @ H = A2*B vext.8 d22, d6, d6, #2 @ B2 vmull.p8 q11, d28, d22 @ G = A*B2 vext.8 d20, d28, d28, #3 @ A3 veor q8, q8, q1 @ L = E + F vmull.p8 q10, d20, d6 @ J = A3*B vext.8 d2, d6, d6, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q1, d28, d2 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d6, d6, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d28, d22 @ K = A*B4 veor q10, q10, q1 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q1, d28, d6 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q1, q1, q8 veor q1, q1, q10 vext.8 d16, d27, d27, #1 @ A1 vmull.p8 q8, d16, d7 @ F = A1*B vext.8 d4, d7, d7, #1 @ B1 vmull.p8 q2, d27, d4 @ E = A*B1 vext.8 d18, d27, d27, #2 @ A2 vmull.p8 q9, d18, d7 @ H = A2*B vext.8 d22, d7, d7, #2 @ B2 vmull.p8 q11, d27, d22 @ G = A*B2 vext.8 d20, d27, d27, #3 @ A3 veor q8, q8, q2 @ L = E + F vmull.p8 q10, d20, d7 @ J = A3*B vext.8 d4, d7, d7, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q2, d27, d4 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d7, d7, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d27, d22 @ K = A*B4 veor q10, q10, q2 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q2, d27, d7 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q2, q2, q8 veor q2, q2, q10 veor q1,q1,q0 @ Karatsuba post-processing veor q1,q1,q2 veor d1,d1,d2 veor d4,d4,d3 @ Xh|Xl - 256-bit result @ equivalent of reduction_avx from ghash-x86_64.pl vshl.i64 q9,q0,#57 @ 1st phase vshl.i64 q10,q0,#62 veor q10,q10,q9 @ vshl.i64 q9,q0,#63 veor q10, q10, q9 @ veor d1,d1,d20 @ veor d4,d4,d21 vshr.u64 q10,q0,#1 @ 2nd phase veor q2,q2,q0 veor q0,q0,q10 @ vshr.u64 q10,q10,#6 vshr.u64 q0,q0,#1 @ veor q0,q0,q2 @ veor q0,q0,q10 @ subs r3,#16 bne Loop_neon #ifdef __ARMEL__ vrev64.8 q0,q0 #endif sub r0,#16 vst1.64 d1,[r0]! @ write out Xi vst1.64 d0,[r0] bx lr @ bx lr #endif .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghash-armv4-linux32.S000064400000000000000000000144051353224261200171540ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL @ instructions are in aesv8-armx.pl.) .arch armv7-a .text #if defined(__thumb2__) || defined(__clang__) .syntax unified #define ldrplb ldrbpl #define ldrneb ldrbne #endif #if defined(__thumb2__) .thumb #else .code 32 #endif #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .globl GFp_gcm_init_neon .hidden GFp_gcm_init_neon .type GFp_gcm_init_neon,%function .align 4 GFp_gcm_init_neon: vld1.64 d7,[r1]! @ load H vmov.i8 q8,#0xe1 vld1.64 d6,[r1] vshl.i64 d17,#57 vshr.u64 d16,#63 @ t0=0xc2....01 vdup.8 q9,d7[7] vshr.u64 d26,d6,#63 vshr.s8 q9,#7 @ broadcast carry bit vshl.i64 q3,q3,#1 vand q8,q8,q9 vorr d7,d26 @ H<<<=1 veor q3,q3,q8 @ twisted H vstmia r0,{q3} bx lr @ bx lr .size GFp_gcm_init_neon,.-GFp_gcm_init_neon .globl GFp_gcm_gmult_neon .hidden GFp_gcm_gmult_neon .type GFp_gcm_gmult_neon,%function .align 4 GFp_gcm_gmult_neon: vld1.64 d7,[r0]! @ load Xi vld1.64 d6,[r0]! vmov.i64 d29,#0x0000ffffffffffff vldmia r1,{d26,d27} @ load twisted H vmov.i64 d30,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 q3,q3 #endif vmov.i64 d31,#0x000000000000ffff veor d28,d26,d27 @ Karatsuba pre-processing mov r3,#16 b .Lgmult_neon .size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon .globl GFp_gcm_ghash_neon .hidden GFp_gcm_ghash_neon .type GFp_gcm_ghash_neon,%function .align 4 GFp_gcm_ghash_neon: vld1.64 d1,[r0]! @ load Xi vld1.64 d0,[r0]! vmov.i64 d29,#0x0000ffffffffffff vldmia r1,{d26,d27} @ load twisted H vmov.i64 d30,#0x00000000ffffffff #ifdef __ARMEL__ vrev64.8 q0,q0 #endif vmov.i64 d31,#0x000000000000ffff veor d28,d26,d27 @ Karatsuba pre-processing .Loop_neon: vld1.64 d7,[r2]! @ load inp vld1.64 d6,[r2]! #ifdef __ARMEL__ vrev64.8 q3,q3 #endif veor q3,q0 @ inp^=Xi .Lgmult_neon: vext.8 d16, d26, d26, #1 @ A1 vmull.p8 q8, d16, d6 @ F = A1*B vext.8 d0, d6, d6, #1 @ B1 vmull.p8 q0, d26, d0 @ E = A*B1 vext.8 d18, d26, d26, #2 @ A2 vmull.p8 q9, d18, d6 @ H = A2*B vext.8 d22, d6, d6, #2 @ B2 vmull.p8 q11, d26, d22 @ G = A*B2 vext.8 d20, d26, d26, #3 @ A3 veor q8, q8, q0 @ L = E + F vmull.p8 q10, d20, d6 @ J = A3*B vext.8 d0, d6, d6, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q0, d26, d0 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d6, d6, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d26, d22 @ K = A*B4 veor q10, q10, q0 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q0, d26, d6 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q0, q0, q8 veor q0, q0, q10 veor d6,d6,d7 @ Karatsuba pre-processing vext.8 d16, d28, d28, #1 @ A1 vmull.p8 q8, d16, d6 @ F = A1*B vext.8 d2, d6, d6, #1 @ B1 vmull.p8 q1, d28, d2 @ E = A*B1 vext.8 d18, d28, d28, #2 @ A2 vmull.p8 q9, d18, d6 @ H = A2*B vext.8 d22, d6, d6, #2 @ B2 vmull.p8 q11, d28, d22 @ G = A*B2 vext.8 d20, d28, d28, #3 @ A3 veor q8, q8, q1 @ L = E + F vmull.p8 q10, d20, d6 @ J = A3*B vext.8 d2, d6, d6, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q1, d28, d2 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d6, d6, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d28, d22 @ K = A*B4 veor q10, q10, q1 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q1, d28, d6 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q1, q1, q8 veor q1, q1, q10 vext.8 d16, d27, d27, #1 @ A1 vmull.p8 q8, d16, d7 @ F = A1*B vext.8 d4, d7, d7, #1 @ B1 vmull.p8 q2, d27, d4 @ E = A*B1 vext.8 d18, d27, d27, #2 @ A2 vmull.p8 q9, d18, d7 @ H = A2*B vext.8 d22, d7, d7, #2 @ B2 vmull.p8 q11, d27, d22 @ G = A*B2 vext.8 d20, d27, d27, #3 @ A3 veor q8, q8, q2 @ L = E + F vmull.p8 q10, d20, d7 @ J = A3*B vext.8 d4, d7, d7, #3 @ B3 veor q9, q9, q11 @ M = G + H vmull.p8 q2, d27, d4 @ I = A*B3 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 vand d17, d17, d29 vext.8 d22, d7, d7, #4 @ B4 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 vand d19, d19, d30 vmull.p8 q11, d27, d22 @ K = A*B4 veor q10, q10, q2 @ N = I + J veor d16, d16, d17 veor d18, d18, d19 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 vand d21, d21, d31 vext.8 q8, q8, q8, #15 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 vmov.i64 d23, #0 vext.8 q9, q9, q9, #14 veor d20, d20, d21 vmull.p8 q2, d27, d7 @ D = A*B vext.8 q11, q11, q11, #12 vext.8 q10, q10, q10, #13 veor q8, q8, q9 veor q10, q10, q11 veor q2, q2, q8 veor q2, q2, q10 veor q1,q1,q0 @ Karatsuba post-processing veor q1,q1,q2 veor d1,d1,d2 veor d4,d4,d3 @ Xh|Xl - 256-bit result @ equivalent of reduction_avx from ghash-x86_64.pl vshl.i64 q9,q0,#57 @ 1st phase vshl.i64 q10,q0,#62 veor q10,q10,q9 @ vshl.i64 q9,q0,#63 veor q10, q10, q9 @ veor d1,d1,d20 @ veor d4,d4,d21 vshr.u64 q10,q0,#1 @ 2nd phase veor q2,q2,q0 veor q0,q0,q10 @ vshr.u64 q10,q10,#6 vshr.u64 q0,q0,#1 @ veor q0,q0,q2 @ veor q0,q0,q10 @ subs r3,#16 bne .Loop_neon #ifdef __ARMEL__ vrev64.8 q0,q0 #endif sub r0,#16 vst1.64 d1,[r0]! @ write out Xi vst1.64 d0,[r0] bx lr @ bx lr .size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon #endif .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghash-neon-armv8-ios64.S000064400000000000000000000251121353224260600175550ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) .text .globl _GFp_gcm_init_neon .private_extern _GFp_gcm_init_neon .align 4 _GFp_gcm_init_neon: // This function is adapted from gcm_init_v8. xC2 is t3. ld1 {v17.2d}, [x1] // load H movi v19.16b, #0xe1 shl v19.2d, v19.2d, #57 // 0xc2.0 ext v3.16b, v17.16b, v17.16b, #8 ushr v18.2d, v19.2d, #63 dup v17.4s, v17.s[1] ext v16.16b, v18.16b, v19.16b, #8 // t0=0xc2....01 ushr v18.2d, v3.2d, #63 sshr v17.4s, v17.4s, #31 // broadcast carry bit and v18.16b, v18.16b, v16.16b shl v3.2d, v3.2d, #1 ext v18.16b, v18.16b, v18.16b, #8 and v16.16b, v16.16b, v17.16b orr v3.16b, v3.16b, v18.16b // H<<<=1 eor v5.16b, v3.16b, v16.16b // twisted H st1 {v5.2d}, [x0] // store Htable[0] ret .globl _GFp_gcm_gmult_neon .private_extern _GFp_gcm_gmult_neon .align 4 _GFp_gcm_gmult_neon: ld1 {v3.16b}, [x0] // load Xi ld1 {v5.1d}, [x1], #8 // load twisted H ld1 {v6.1d}, [x1] adrp x9, Lmasks@PAGE // load constants add x9, x9, Lmasks@PAGEOFF ld1 {v24.2d, v25.2d}, [x9] rev64 v3.16b, v3.16b // byteswap Xi ext v3.16b, v3.16b, v3.16b, #8 eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing mov x3, #16 b Lgmult_neon .globl _GFp_gcm_ghash_neon .private_extern _GFp_gcm_ghash_neon .align 4 _GFp_gcm_ghash_neon: ld1 {v0.16b}, [x0] // load Xi ld1 {v5.1d}, [x1], #8 // load twisted H ld1 {v6.1d}, [x1] adrp x9, Lmasks@PAGE // load constants add x9, x9, Lmasks@PAGEOFF ld1 {v24.2d, v25.2d}, [x9] rev64 v0.16b, v0.16b // byteswap Xi ext v0.16b, v0.16b, v0.16b, #8 eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing Loop_neon: ld1 {v3.16b}, [x2], #16 // load inp rev64 v3.16b, v3.16b // byteswap inp ext v3.16b, v3.16b, v3.16b, #8 eor v3.16b, v3.16b, v0.16b // inp ^= Xi Lgmult_neon: // Split the input into v3 and v4. (The upper halves are unused, // so it is okay to leave them alone.) ins v4.d[0], v3.d[1] ext v16.8b, v5.8b, v5.8b, #1 // A1 pmull v16.8h, v16.8b, v3.8b // F = A1*B ext v0.8b, v3.8b, v3.8b, #1 // B1 pmull v0.8h, v5.8b, v0.8b // E = A*B1 ext v17.8b, v5.8b, v5.8b, #2 // A2 pmull v17.8h, v17.8b, v3.8b // H = A2*B ext v19.8b, v3.8b, v3.8b, #2 // B2 pmull v19.8h, v5.8b, v19.8b // G = A*B2 ext v18.8b, v5.8b, v5.8b, #3 // A3 eor v16.16b, v16.16b, v0.16b // L = E + F pmull v18.8h, v18.8b, v3.8b // J = A3*B ext v0.8b, v3.8b, v3.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v0.8h, v5.8b, v0.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v3.8b, v3.8b, #4 // B4 eor v18.16b, v18.16b, v0.16b // N = I + J pmull v19.8h, v5.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v0.8h, v5.8b, v3.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v0.16b, v0.16b, v16.16b eor v0.16b, v0.16b, v18.16b eor v3.8b, v3.8b, v4.8b // Karatsuba pre-processing ext v16.8b, v7.8b, v7.8b, #1 // A1 pmull v16.8h, v16.8b, v3.8b // F = A1*B ext v1.8b, v3.8b, v3.8b, #1 // B1 pmull v1.8h, v7.8b, v1.8b // E = A*B1 ext v17.8b, v7.8b, v7.8b, #2 // A2 pmull v17.8h, v17.8b, v3.8b // H = A2*B ext v19.8b, v3.8b, v3.8b, #2 // B2 pmull v19.8h, v7.8b, v19.8b // G = A*B2 ext v18.8b, v7.8b, v7.8b, #3 // A3 eor v16.16b, v16.16b, v1.16b // L = E + F pmull v18.8h, v18.8b, v3.8b // J = A3*B ext v1.8b, v3.8b, v3.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v1.8h, v7.8b, v1.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v3.8b, v3.8b, #4 // B4 eor v18.16b, v18.16b, v1.16b // N = I + J pmull v19.8h, v7.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v1.8h, v7.8b, v3.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v1.16b, v1.16b, v16.16b eor v1.16b, v1.16b, v18.16b ext v16.8b, v6.8b, v6.8b, #1 // A1 pmull v16.8h, v16.8b, v4.8b // F = A1*B ext v2.8b, v4.8b, v4.8b, #1 // B1 pmull v2.8h, v6.8b, v2.8b // E = A*B1 ext v17.8b, v6.8b, v6.8b, #2 // A2 pmull v17.8h, v17.8b, v4.8b // H = A2*B ext v19.8b, v4.8b, v4.8b, #2 // B2 pmull v19.8h, v6.8b, v19.8b // G = A*B2 ext v18.8b, v6.8b, v6.8b, #3 // A3 eor v16.16b, v16.16b, v2.16b // L = E + F pmull v18.8h, v18.8b, v4.8b // J = A3*B ext v2.8b, v4.8b, v4.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v2.8h, v6.8b, v2.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v4.8b, v4.8b, #4 // B4 eor v18.16b, v18.16b, v2.16b // N = I + J pmull v19.8h, v6.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v2.8h, v6.8b, v4.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v2.16b, v2.16b, v16.16b eor v2.16b, v2.16b, v18.16b ext v16.16b, v0.16b, v2.16b, #8 eor v1.16b, v1.16b, v0.16b // Karatsuba post-processing eor v1.16b, v1.16b, v2.16b eor v1.16b, v1.16b, v16.16b // Xm overlaps Xh.lo and Xl.hi ins v0.d[1], v1.d[0] // Xh|Xl - 256-bit result // This is a no-op due to the ins instruction below. // ins v2.d[0], v1.d[1] // equivalent of reduction_avx from ghash-x86_64.pl shl v17.2d, v0.2d, #57 // 1st phase shl v18.2d, v0.2d, #62 eor v18.16b, v18.16b, v17.16b // shl v17.2d, v0.2d, #63 eor v18.16b, v18.16b, v17.16b // // Note Xm contains {Xl.d[1], Xh.d[0]}. eor v18.16b, v18.16b, v1.16b ins v0.d[1], v18.d[0] // Xl.d[1] ^= t2.d[0] ins v2.d[0], v18.d[1] // Xh.d[0] ^= t2.d[1] ushr v18.2d, v0.2d, #1 // 2nd phase eor v2.16b, v2.16b,v0.16b eor v0.16b, v0.16b,v18.16b // ushr v18.2d, v18.2d, #6 ushr v0.2d, v0.2d, #1 // eor v0.16b, v0.16b, v2.16b // eor v0.16b, v0.16b, v18.16b // subs x3, x3, #16 bne Loop_neon rev64 v0.16b, v0.16b // byteswap Xi and write ext v0.16b, v0.16b, v0.16b, #8 st1 {v0.16b}, [x0] ret .section __TEXT,__const .align 4 Lmasks: .quad 0x0000ffffffffffff // k48 .quad 0x00000000ffffffff // k32 .quad 0x000000000000ffff // k16 .quad 0x0000000000000000 // k0 .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghash-neon-armv8-linux64.S000064400000000000000000000254471353224260700201360ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) .text .globl GFp_gcm_init_neon .hidden GFp_gcm_init_neon .type GFp_gcm_init_neon,%function .align 4 GFp_gcm_init_neon: // This function is adapted from gcm_init_v8. xC2 is t3. ld1 {v17.2d}, [x1] // load H movi v19.16b, #0xe1 shl v19.2d, v19.2d, #57 // 0xc2.0 ext v3.16b, v17.16b, v17.16b, #8 ushr v18.2d, v19.2d, #63 dup v17.4s, v17.s[1] ext v16.16b, v18.16b, v19.16b, #8 // t0=0xc2....01 ushr v18.2d, v3.2d, #63 sshr v17.4s, v17.4s, #31 // broadcast carry bit and v18.16b, v18.16b, v16.16b shl v3.2d, v3.2d, #1 ext v18.16b, v18.16b, v18.16b, #8 and v16.16b, v16.16b, v17.16b orr v3.16b, v3.16b, v18.16b // H<<<=1 eor v5.16b, v3.16b, v16.16b // twisted H st1 {v5.2d}, [x0] // store Htable[0] ret .size GFp_gcm_init_neon,.-GFp_gcm_init_neon .globl GFp_gcm_gmult_neon .hidden GFp_gcm_gmult_neon .type GFp_gcm_gmult_neon,%function .align 4 GFp_gcm_gmult_neon: ld1 {v3.16b}, [x0] // load Xi ld1 {v5.1d}, [x1], #8 // load twisted H ld1 {v6.1d}, [x1] adrp x9, .Lmasks // load constants add x9, x9, :lo12:.Lmasks ld1 {v24.2d, v25.2d}, [x9] rev64 v3.16b, v3.16b // byteswap Xi ext v3.16b, v3.16b, v3.16b, #8 eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing mov x3, #16 b .Lgmult_neon .size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon .globl GFp_gcm_ghash_neon .hidden GFp_gcm_ghash_neon .type GFp_gcm_ghash_neon,%function .align 4 GFp_gcm_ghash_neon: ld1 {v0.16b}, [x0] // load Xi ld1 {v5.1d}, [x1], #8 // load twisted H ld1 {v6.1d}, [x1] adrp x9, .Lmasks // load constants add x9, x9, :lo12:.Lmasks ld1 {v24.2d, v25.2d}, [x9] rev64 v0.16b, v0.16b // byteswap Xi ext v0.16b, v0.16b, v0.16b, #8 eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing .Loop_neon: ld1 {v3.16b}, [x2], #16 // load inp rev64 v3.16b, v3.16b // byteswap inp ext v3.16b, v3.16b, v3.16b, #8 eor v3.16b, v3.16b, v0.16b // inp ^= Xi .Lgmult_neon: // Split the input into v3 and v4. (The upper halves are unused, // so it is okay to leave them alone.) ins v4.d[0], v3.d[1] ext v16.8b, v5.8b, v5.8b, #1 // A1 pmull v16.8h, v16.8b, v3.8b // F = A1*B ext v0.8b, v3.8b, v3.8b, #1 // B1 pmull v0.8h, v5.8b, v0.8b // E = A*B1 ext v17.8b, v5.8b, v5.8b, #2 // A2 pmull v17.8h, v17.8b, v3.8b // H = A2*B ext v19.8b, v3.8b, v3.8b, #2 // B2 pmull v19.8h, v5.8b, v19.8b // G = A*B2 ext v18.8b, v5.8b, v5.8b, #3 // A3 eor v16.16b, v16.16b, v0.16b // L = E + F pmull v18.8h, v18.8b, v3.8b // J = A3*B ext v0.8b, v3.8b, v3.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v0.8h, v5.8b, v0.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v3.8b, v3.8b, #4 // B4 eor v18.16b, v18.16b, v0.16b // N = I + J pmull v19.8h, v5.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v0.8h, v5.8b, v3.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v0.16b, v0.16b, v16.16b eor v0.16b, v0.16b, v18.16b eor v3.8b, v3.8b, v4.8b // Karatsuba pre-processing ext v16.8b, v7.8b, v7.8b, #1 // A1 pmull v16.8h, v16.8b, v3.8b // F = A1*B ext v1.8b, v3.8b, v3.8b, #1 // B1 pmull v1.8h, v7.8b, v1.8b // E = A*B1 ext v17.8b, v7.8b, v7.8b, #2 // A2 pmull v17.8h, v17.8b, v3.8b // H = A2*B ext v19.8b, v3.8b, v3.8b, #2 // B2 pmull v19.8h, v7.8b, v19.8b // G = A*B2 ext v18.8b, v7.8b, v7.8b, #3 // A3 eor v16.16b, v16.16b, v1.16b // L = E + F pmull v18.8h, v18.8b, v3.8b // J = A3*B ext v1.8b, v3.8b, v3.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v1.8h, v7.8b, v1.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v3.8b, v3.8b, #4 // B4 eor v18.16b, v18.16b, v1.16b // N = I + J pmull v19.8h, v7.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v1.8h, v7.8b, v3.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v1.16b, v1.16b, v16.16b eor v1.16b, v1.16b, v18.16b ext v16.8b, v6.8b, v6.8b, #1 // A1 pmull v16.8h, v16.8b, v4.8b // F = A1*B ext v2.8b, v4.8b, v4.8b, #1 // B1 pmull v2.8h, v6.8b, v2.8b // E = A*B1 ext v17.8b, v6.8b, v6.8b, #2 // A2 pmull v17.8h, v17.8b, v4.8b // H = A2*B ext v19.8b, v4.8b, v4.8b, #2 // B2 pmull v19.8h, v6.8b, v19.8b // G = A*B2 ext v18.8b, v6.8b, v6.8b, #3 // A3 eor v16.16b, v16.16b, v2.16b // L = E + F pmull v18.8h, v18.8b, v4.8b // J = A3*B ext v2.8b, v4.8b, v4.8b, #3 // B3 eor v17.16b, v17.16b, v19.16b // M = G + H pmull v2.8h, v6.8b, v2.8b // I = A*B3 // Here we diverge from the 32-bit version. It computes the following // (instructions reordered for clarity): // // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) // vand $t0#hi, $t0#hi, $k48 // veor $t0#lo, $t0#lo, $t0#hi // // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) // vand $t1#hi, $t1#hi, $k32 // veor $t1#lo, $t1#lo, $t1#hi // // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) // vand $t2#hi, $t2#hi, $k16 // veor $t2#lo, $t2#lo, $t2#hi // // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) // vmov.i64 $t3#hi, #0 // // $kN is a mask with the bottom N bits set. AArch64 cannot compute on // upper halves of SIMD registers, so we must split each half into // separate registers. To compensate, we pair computations up and // parallelize. ext v19.8b, v4.8b, v4.8b, #4 // B4 eor v18.16b, v18.16b, v2.16b // N = I + J pmull v19.8h, v6.8b, v19.8b // K = A*B4 // This can probably be scheduled more efficiently. For now, we just // pair up independent instructions. zip1 v20.2d, v16.2d, v17.2d zip1 v22.2d, v18.2d, v19.2d zip2 v21.2d, v16.2d, v17.2d zip2 v23.2d, v18.2d, v19.2d eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b and v21.16b, v21.16b, v24.16b and v23.16b, v23.16b, v25.16b eor v20.16b, v20.16b, v21.16b eor v22.16b, v22.16b, v23.16b zip1 v16.2d, v20.2d, v21.2d zip1 v18.2d, v22.2d, v23.2d zip2 v17.2d, v20.2d, v21.2d zip2 v19.2d, v22.2d, v23.2d ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 pmull v2.8h, v6.8b, v4.8b // D = A*B ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 eor v16.16b, v16.16b, v17.16b eor v18.16b, v18.16b, v19.16b eor v2.16b, v2.16b, v16.16b eor v2.16b, v2.16b, v18.16b ext v16.16b, v0.16b, v2.16b, #8 eor v1.16b, v1.16b, v0.16b // Karatsuba post-processing eor v1.16b, v1.16b, v2.16b eor v1.16b, v1.16b, v16.16b // Xm overlaps Xh.lo and Xl.hi ins v0.d[1], v1.d[0] // Xh|Xl - 256-bit result // This is a no-op due to the ins instruction below. // ins v2.d[0], v1.d[1] // equivalent of reduction_avx from ghash-x86_64.pl shl v17.2d, v0.2d, #57 // 1st phase shl v18.2d, v0.2d, #62 eor v18.16b, v18.16b, v17.16b // shl v17.2d, v0.2d, #63 eor v18.16b, v18.16b, v17.16b // // Note Xm contains {Xl.d[1], Xh.d[0]}. eor v18.16b, v18.16b, v1.16b ins v0.d[1], v18.d[0] // Xl.d[1] ^= t2.d[0] ins v2.d[0], v18.d[1] // Xh.d[0] ^= t2.d[1] ushr v18.2d, v0.2d, #1 // 2nd phase eor v2.16b, v2.16b,v0.16b eor v0.16b, v0.16b,v18.16b // ushr v18.2d, v18.2d, #6 ushr v0.2d, v0.2d, #1 // eor v0.16b, v0.16b, v2.16b // eor v0.16b, v0.16b, v18.16b // subs x3, x3, #16 bne .Loop_neon rev64 v0.16b, v0.16b // byteswap Xi and write ext v0.16b, v0.16b, v0.16b, #8 st1 {v0.16b}, [x0] ret .size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon .section .rodata .align 4 .Lmasks: .quad 0x0000ffffffffffff // k48 .quad 0x00000000ffffffff // k32 .quad 0x000000000000ffff // k16 .quad 0x0000000000000000 // k0 .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghash-x86-elf.S000064400000000000000000000202441353224261000160060ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl GFp_gcm_init_clmul .hidden GFp_gcm_init_clmul .type GFp_gcm_init_clmul,@function .align 16 GFp_gcm_init_clmul: .L_GFp_gcm_init_clmul_begin: movl 4(%esp),%edx movl 8(%esp),%eax call .L000pic .L000pic: popl %ecx leal .Lbswap-.L000pic(%ecx),%ecx movdqu (%eax),%xmm2 pshufd $78,%xmm2,%xmm2 pshufd $255,%xmm2,%xmm4 movdqa %xmm2,%xmm3 psllq $1,%xmm2 pxor %xmm5,%xmm5 psrlq $63,%xmm3 pcmpgtd %xmm4,%xmm5 pslldq $8,%xmm3 por %xmm3,%xmm2 pand 16(%ecx),%xmm5 pxor %xmm5,%xmm2 movdqa %xmm2,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pshufd $78,%xmm2,%xmm4 pxor %xmm0,%xmm3 pxor %xmm2,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm2,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm2,%xmm3 movdqu %xmm2,(%edx) pxor %xmm0,%xmm4 movdqu %xmm0,16(%edx) .byte 102,15,58,15,227,8 movdqu %xmm4,32(%edx) ret .size GFp_gcm_init_clmul,.-.L_GFp_gcm_init_clmul_begin .globl GFp_gcm_gmult_clmul .hidden GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,@function .align 16 GFp_gcm_gmult_clmul: .L_GFp_gcm_gmult_clmul_begin: movl 4(%esp),%eax movl 8(%esp),%edx call .L001pic .L001pic: popl %ecx leal .Lbswap-.L001pic(%ecx),%ecx movdqu (%eax),%xmm0 movdqa (%ecx),%xmm5 movups (%edx),%xmm2 .byte 102,15,56,0,197 movups 32(%edx),%xmm4 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%eax) ret .size GFp_gcm_gmult_clmul,.-.L_GFp_gcm_gmult_clmul_begin .globl GFp_gcm_ghash_clmul .hidden GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,@function .align 16 GFp_gcm_ghash_clmul: .L_GFp_gcm_ghash_clmul_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%eax movl 24(%esp),%edx movl 28(%esp),%esi movl 32(%esp),%ebx call .L002pic .L002pic: popl %ecx leal .Lbswap-.L002pic(%ecx),%ecx movdqu (%eax),%xmm0 movdqa (%ecx),%xmm5 movdqu (%edx),%xmm2 .byte 102,15,56,0,197 subl $16,%ebx jz .L003odd_tail movdqu (%esi),%xmm3 movdqu 16(%esi),%xmm6 .byte 102,15,56,0,221 .byte 102,15,56,0,245 movdqu 32(%edx),%xmm5 pxor %xmm3,%xmm0 pshufd $78,%xmm6,%xmm3 movdqa %xmm6,%xmm7 pxor %xmm6,%xmm3 leal 32(%esi),%esi .byte 102,15,58,68,242,0 .byte 102,15,58,68,250,17 .byte 102,15,58,68,221,0 movups 16(%edx),%xmm2 nop subl $32,%ebx jbe .L004even_tail jmp .L005mod_loop .align 32 .L005mod_loop: pshufd $78,%xmm0,%xmm4 movdqa %xmm0,%xmm1 pxor %xmm0,%xmm4 nop .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,229,16 movups (%edx),%xmm2 xorps %xmm6,%xmm0 movdqa (%ecx),%xmm5 xorps %xmm7,%xmm1 movdqu (%esi),%xmm7 pxor %xmm0,%xmm3 movdqu 16(%esi),%xmm6 pxor %xmm1,%xmm3 .byte 102,15,56,0,253 pxor %xmm3,%xmm4 movdqa %xmm4,%xmm3 psrldq $8,%xmm4 pslldq $8,%xmm3 pxor %xmm4,%xmm1 pxor %xmm3,%xmm0 .byte 102,15,56,0,245 pxor %xmm7,%xmm1 movdqa %xmm6,%xmm7 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 .byte 102,15,58,68,242,0 movups 32(%edx),%xmm5 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 pshufd $78,%xmm7,%xmm3 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm7,%xmm3 pxor %xmm4,%xmm1 .byte 102,15,58,68,250,17 movups 16(%edx),%xmm2 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,58,68,221,0 leal 32(%esi),%esi subl $32,%ebx ja .L005mod_loop .L004even_tail: pshufd $78,%xmm0,%xmm4 movdqa %xmm0,%xmm1 pxor %xmm0,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,229,16 movdqa (%ecx),%xmm5 xorps %xmm6,%xmm0 xorps %xmm7,%xmm1 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 pxor %xmm3,%xmm4 movdqa %xmm4,%xmm3 psrldq $8,%xmm4 pslldq $8,%xmm3 pxor %xmm4,%xmm1 pxor %xmm3,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 testl %ebx,%ebx jnz .L006done movups (%edx),%xmm2 .L003odd_tail: movdqu (%esi),%xmm3 .byte 102,15,56,0,221 pxor %xmm3,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pshufd $78,%xmm2,%xmm4 pxor %xmm0,%xmm3 pxor %xmm2,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .L006done: .byte 102,15,56,0,197 movdqu %xmm0,(%eax) popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_gcm_ghash_clmul,.-.L_GFp_gcm_ghash_clmul_begin .align 64 .Lbswap: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 .align 64 .L007rem_8bit: .value 0,450,900,582,1800,1738,1164,1358 .value 3600,4050,3476,3158,2328,2266,2716,2910 .value 7200,7650,8100,7782,6952,6890,6316,6510 .value 4656,5106,4532,4214,5432,5370,5820,6014 .value 14400,14722,15300,14854,16200,16010,15564,15630 .value 13904,14226,13780,13334,12632,12442,13020,13086 .value 9312,9634,10212,9766,9064,8874,8428,8494 .value 10864,11186,10740,10294,11640,11450,12028,12094 .value 28800,28994,29444,29382,30600,30282,29708,30158 .value 32400,32594,32020,31958,31128,30810,31260,31710 .value 27808,28002,28452,28390,27560,27242,26668,27118 .value 25264,25458,24884,24822,26040,25722,26172,26622 .value 18624,18690,19268,19078,20424,19978,19532,19854 .value 18128,18194,17748,17558,16856,16410,16988,17310 .value 21728,21794,22372,22182,21480,21034,20588,20910 .value 23280,23346,22900,22710,24056,23610,24188,24510 .value 57600,57538,57988,58182,58888,59338,58764,58446 .value 61200,61138,60564,60758,59416,59866,60316,59998 .value 64800,64738,65188,65382,64040,64490,63916,63598 .value 62256,62194,61620,61814,62520,62970,63420,63102 .value 55616,55426,56004,56070,56904,57226,56780,56334 .value 55120,54930,54484,54550,53336,53658,54236,53790 .value 50528,50338,50916,50982,49768,50090,49644,49198 .value 52080,51890,51444,51510,52344,52666,53244,52798 .value 37248,36930,37380,37830,38536,38730,38156,38094 .value 40848,40530,39956,40406,39064,39258,39708,39646 .value 36256,35938,36388,36838,35496,35690,35116,35054 .value 33712,33394,32820,33270,33976,34170,34620,34558 .value 43456,43010,43588,43910,44744,44810,44364,44174 .value 42960,42514,42068,42390,41176,41242,41820,41630 .value 46560,46114,46692,47014,45800,45866,45420,45230 .value 48112,47666,47220,47542,48376,48442,49020,48830 .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 .byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 .byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 .byte 0 #endif ring-0.16.9/pregenerated/ghash-x86-macosx.S000064400000000000000000000176401353224261000165400ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl _GFp_gcm_init_clmul .private_extern _GFp_gcm_init_clmul .align 4 _GFp_gcm_init_clmul: L_GFp_gcm_init_clmul_begin: movl 4(%esp),%edx movl 8(%esp),%eax call L000pic L000pic: popl %ecx leal Lbswap-L000pic(%ecx),%ecx movdqu (%eax),%xmm2 pshufd $78,%xmm2,%xmm2 pshufd $255,%xmm2,%xmm4 movdqa %xmm2,%xmm3 psllq $1,%xmm2 pxor %xmm5,%xmm5 psrlq $63,%xmm3 pcmpgtd %xmm4,%xmm5 pslldq $8,%xmm3 por %xmm3,%xmm2 pand 16(%ecx),%xmm5 pxor %xmm5,%xmm2 movdqa %xmm2,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pshufd $78,%xmm2,%xmm4 pxor %xmm0,%xmm3 pxor %xmm2,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm2,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm2,%xmm3 movdqu %xmm2,(%edx) pxor %xmm0,%xmm4 movdqu %xmm0,16(%edx) .byte 102,15,58,15,227,8 movdqu %xmm4,32(%edx) ret .globl _GFp_gcm_gmult_clmul .private_extern _GFp_gcm_gmult_clmul .align 4 _GFp_gcm_gmult_clmul: L_GFp_gcm_gmult_clmul_begin: movl 4(%esp),%eax movl 8(%esp),%edx call L001pic L001pic: popl %ecx leal Lbswap-L001pic(%ecx),%ecx movdqu (%eax),%xmm0 movdqa (%ecx),%xmm5 movups (%edx),%xmm2 .byte 102,15,56,0,197 movups 32(%edx),%xmm4 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%eax) ret .globl _GFp_gcm_ghash_clmul .private_extern _GFp_gcm_ghash_clmul .align 4 _GFp_gcm_ghash_clmul: L_GFp_gcm_ghash_clmul_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%eax movl 24(%esp),%edx movl 28(%esp),%esi movl 32(%esp),%ebx call L002pic L002pic: popl %ecx leal Lbswap-L002pic(%ecx),%ecx movdqu (%eax),%xmm0 movdqa (%ecx),%xmm5 movdqu (%edx),%xmm2 .byte 102,15,56,0,197 subl $16,%ebx jz L003odd_tail movdqu (%esi),%xmm3 movdqu 16(%esi),%xmm6 .byte 102,15,56,0,221 .byte 102,15,56,0,245 movdqu 32(%edx),%xmm5 pxor %xmm3,%xmm0 pshufd $78,%xmm6,%xmm3 movdqa %xmm6,%xmm7 pxor %xmm6,%xmm3 leal 32(%esi),%esi .byte 102,15,58,68,242,0 .byte 102,15,58,68,250,17 .byte 102,15,58,68,221,0 movups 16(%edx),%xmm2 nop subl $32,%ebx jbe L004even_tail jmp L005mod_loop .align 5,0x90 L005mod_loop: pshufd $78,%xmm0,%xmm4 movdqa %xmm0,%xmm1 pxor %xmm0,%xmm4 nop .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,229,16 movups (%edx),%xmm2 xorps %xmm6,%xmm0 movdqa (%ecx),%xmm5 xorps %xmm7,%xmm1 movdqu (%esi),%xmm7 pxor %xmm0,%xmm3 movdqu 16(%esi),%xmm6 pxor %xmm1,%xmm3 .byte 102,15,56,0,253 pxor %xmm3,%xmm4 movdqa %xmm4,%xmm3 psrldq $8,%xmm4 pslldq $8,%xmm3 pxor %xmm4,%xmm1 pxor %xmm3,%xmm0 .byte 102,15,56,0,245 pxor %xmm7,%xmm1 movdqa %xmm6,%xmm7 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 .byte 102,15,58,68,242,0 movups 32(%edx),%xmm5 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 pshufd $78,%xmm7,%xmm3 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm7,%xmm3 pxor %xmm4,%xmm1 .byte 102,15,58,68,250,17 movups 16(%edx),%xmm2 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,58,68,221,0 leal 32(%esi),%esi subl $32,%ebx ja L005mod_loop L004even_tail: pshufd $78,%xmm0,%xmm4 movdqa %xmm0,%xmm1 pxor %xmm0,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,229,16 movdqa (%ecx),%xmm5 xorps %xmm6,%xmm0 xorps %xmm7,%xmm1 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 pxor %xmm3,%xmm4 movdqa %xmm4,%xmm3 psrldq $8,%xmm4 pslldq $8,%xmm3 pxor %xmm4,%xmm1 pxor %xmm3,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 testl %ebx,%ebx jnz L006done movups (%edx),%xmm2 L003odd_tail: movdqu (%esi),%xmm3 .byte 102,15,56,0,221 pxor %xmm3,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pshufd $78,%xmm2,%xmm4 pxor %xmm0,%xmm3 pxor %xmm2,%xmm4 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 xorps %xmm0,%xmm3 xorps %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 L006done: .byte 102,15,56,0,197 movdqu %xmm0,(%eax) popl %edi popl %esi popl %ebx popl %ebp ret .align 6,0x90 Lbswap: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 .align 6,0x90 L007rem_8bit: .value 0,450,900,582,1800,1738,1164,1358 .value 3600,4050,3476,3158,2328,2266,2716,2910 .value 7200,7650,8100,7782,6952,6890,6316,6510 .value 4656,5106,4532,4214,5432,5370,5820,6014 .value 14400,14722,15300,14854,16200,16010,15564,15630 .value 13904,14226,13780,13334,12632,12442,13020,13086 .value 9312,9634,10212,9766,9064,8874,8428,8494 .value 10864,11186,10740,10294,11640,11450,12028,12094 .value 28800,28994,29444,29382,30600,30282,29708,30158 .value 32400,32594,32020,31958,31128,30810,31260,31710 .value 27808,28002,28452,28390,27560,27242,26668,27118 .value 25264,25458,24884,24822,26040,25722,26172,26622 .value 18624,18690,19268,19078,20424,19978,19532,19854 .value 18128,18194,17748,17558,16856,16410,16988,17310 .value 21728,21794,22372,22182,21480,21034,20588,20910 .value 23280,23346,22900,22710,24056,23610,24188,24510 .value 57600,57538,57988,58182,58888,59338,58764,58446 .value 61200,61138,60564,60758,59416,59866,60316,59998 .value 64800,64738,65188,65382,64040,64490,63916,63598 .value 62256,62194,61620,61814,62520,62970,63420,63102 .value 55616,55426,56004,56070,56904,57226,56780,56334 .value 55120,54930,54484,54550,53336,53658,54236,53790 .value 50528,50338,50916,50982,49768,50090,49644,49198 .value 52080,51890,51444,51510,52344,52666,53244,52798 .value 37248,36930,37380,37830,38536,38730,38156,38094 .value 40848,40530,39956,40406,39064,39258,39708,39646 .value 36256,35938,36388,36838,35496,35690,35116,35054 .value 33712,33394,32820,33270,33976,34170,34620,34558 .value 43456,43010,43588,43910,44744,44810,44364,44174 .value 42960,42514,42068,42390,41176,41242,41820,41630 .value 46560,46114,46692,47014,45800,45866,45420,45230 .value 48112,47666,47220,47542,48376,48442,49020,48830 .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 .byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 .byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 .byte 0 #endif ring-0.16.9/pregenerated/ghash-x86-win32n.obj000064400000000000000000000142421353224260700167370ustar0000000000000000LEi].textq p`.debug$S  @B.debug$T @BT$D$YofpNfpfofsffs?fffsffiffofofpNfpNfff:Df:Df:DWWfofsfsfffofofsffsffs9fofsfsfffofsfffsffsffpNfpNffBf:b D$T$Yofo)f8b fofpNff:Df:Df:DWWfofsfsfffofofsffsffs9fofsfsfffofsfffsffsff8 USVWD$T$t$\$ Yofo)of8Ńoovf8f8oj ffpNfofލv f:Df:Df:DR t&fpNfoff:Df:Df:DWfo)Wo>fovff8ffofsfsfff8ffofofofsffsff:Dj fs9fofsfsfffpNfofsfff:DRffsffsff:Dv fpNfoff:Df:Df:Dfo)WWffffofsfsfffofofsffsffs9fofsfsfffofsfffsffsfof8ffofpNfpNfff:Df:Df:DWWfofsfsfffofofsffsffs9fofsfsfffofsfffsffsff8_^[]   fFN V   ^ f(n0v8~@89;:H?><=P6754X1023`$%'&&h#" .!p*+)6(x-,.>/pBqsrwJv tu~R}|yZxz{lbm$onkjj,hibrc4a`ezd΀BƓJ ΔR֝Zޚb$揨j,r4z<DȮ LЧTؠ\"d*l2t:|GHASH for x86, CRYPTOGAMS by /P:\ring\pregenerated\tmp\ghash-x86-win32n.asm{D؎vH qF<   !"#"$&%+&/'4(8)=*A+F,J-N.R/W0\1`2d3j4p5v6y7|89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW XY[ ^$_(`-b.c4d8e<f?gDhHiLjQkUl[mangojpmqqrvs{tuvwxyz{|}~  !$*.38=BFKOSV\bhlmpv{ !%).27;?EIMRV[_ehkqvz~      #(,05:>B H!N"T#W$Z%^&c'h(l)p*t+x,}-./0123456789:;<=?@ABCDEFHI J@LPM`NpOPQRSTUVWXY Z0[@\P]`^p_`abcdefghi j0k@lPm`npo0P:\ring\pregenerated\ghash-x86-win32n.objyasm 1.3.0_GFp_gcm_init_clmul%L$_GFp_gcm_init_clmul_begin L$000picL$bswap _GFp_gcm_gmult_clmul& L$_GFp_gcm_gmult_clmul_begin-L$001pic_GFp_gcm_ghash_clmul&L$_GFp_gcm_ghash_clmul_begin L$002picL$003odd_tailqL$004even_tailL$005mod_loopL$006done@L$007rem_8bitd h    *  .  Q  U  e  i  x  |             0  4  I  M  c  g  |     .fileg@feat.00.textq*>L$000pic L$bswapZ o L$001pic-L$002pic q@.debug$S .debug$T pregenerated\tmp\ghash-x86-win32n.asm_GFp_gcm_init_clmulL$_GFp_gcm_init_clmul_begin_GFp_gcm_gmult_clmulL$_GFp_gcm_gmult_clmul_begin_GFp_gcm_ghash_clmulL$_GFp_gcm_ghash_clmul_beginL$003odd_tailL$004even_tailL$005mod_loopL$006doneL$007rem_8bitring-0.16.9/pregenerated/ghash-x86_64-elf.S000064400000000000000000000553111353224260400163250ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_gcm_init_clmul .hidden GFp_gcm_init_clmul .type GFp_gcm_init_clmul,@function .align 16 GFp_gcm_init_clmul: .cfi_startproc .L_init_clmul: movdqu (%rsi),%xmm2 pshufd $78,%xmm2,%xmm2 pshufd $255,%xmm2,%xmm4 movdqa %xmm2,%xmm3 psllq $1,%xmm2 pxor %xmm5,%xmm5 psrlq $63,%xmm3 pcmpgtd %xmm4,%xmm5 pslldq $8,%xmm3 por %xmm3,%xmm2 pand .L0x1c2_polynomial(%rip),%xmm5 pxor %xmm5,%xmm2 pshufd $78,%xmm2,%xmm6 movdqa %xmm2,%xmm0 pxor %xmm2,%xmm6 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm2,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm2,%xmm3 movdqu %xmm2,0(%rdi) pxor %xmm0,%xmm4 movdqu %xmm0,16(%rdi) .byte 102,15,58,15,227,8 movdqu %xmm4,32(%rdi) movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 movdqa %xmm0,%xmm5 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm5,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm5,%xmm3 movdqu %xmm5,48(%rdi) pxor %xmm0,%xmm4 movdqu %xmm0,64(%rdi) .byte 102,15,58,15,227,8 movdqu %xmm4,80(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul .globl GFp_gcm_gmult_clmul .hidden GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,@function .align 16 .cfi_startproc GFp_gcm_gmult_clmul: movdqu (%rdi),%xmm0 movdqa .Lbswap_mask(%rip),%xmm5 movdqu (%rsi),%xmm2 movdqu 32(%rsi),%xmm4 .byte 102,15,56,0,197 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul .globl GFp_gcm_ghash_clmul .hidden GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,@function .align 32 GFp_gcm_ghash_clmul: .cfi_startproc .L_ghash_clmul: movdqa .Lbswap_mask(%rip),%xmm10 movdqu (%rdi),%xmm0 movdqu (%rsi),%xmm2 movdqu 32(%rsi),%xmm7 .byte 102,65,15,56,0,194 subq $0x10,%rcx jz .Lodd_tail movdqu 16(%rsi),%xmm6 leaq GFp_ia32cap_P(%rip),%rax movl 4(%rax),%eax cmpq $0x30,%rcx jb .Lskip4x andl $71303168,%eax cmpl $4194304,%eax je .Lskip4x subq $0x30,%rcx movq $0xA040608020C0E000,%rax movdqu 48(%rsi),%xmm14 movdqu 64(%rsi),%xmm15 movdqu 48(%rdx),%xmm3 movdqu 32(%rdx),%xmm11 .byte 102,65,15,56,0,218 .byte 102,69,15,56,0,218 movdqa %xmm3,%xmm5 pshufd $78,%xmm3,%xmm4 pxor %xmm3,%xmm4 .byte 102,15,58,68,218,0 .byte 102,15,58,68,234,17 .byte 102,15,58,68,231,0 movdqa %xmm11,%xmm13 pshufd $78,%xmm11,%xmm12 pxor %xmm11,%xmm12 .byte 102,68,15,58,68,222,0 .byte 102,68,15,58,68,238,17 .byte 102,68,15,58,68,231,16 xorps %xmm11,%xmm3 xorps %xmm13,%xmm5 movups 80(%rsi),%xmm7 xorps %xmm12,%xmm4 movdqu 16(%rdx),%xmm11 movdqu 0(%rdx),%xmm8 .byte 102,69,15,56,0,218 .byte 102,69,15,56,0,194 movdqa %xmm11,%xmm13 pshufd $78,%xmm11,%xmm12 pxor %xmm8,%xmm0 pxor %xmm11,%xmm12 .byte 102,69,15,58,68,222,0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm8 pxor %xmm0,%xmm8 .byte 102,69,15,58,68,238,17 .byte 102,68,15,58,68,231,0 xorps %xmm11,%xmm3 xorps %xmm13,%xmm5 leaq 64(%rdx),%rdx subq $0x40,%rcx jc .Ltail4x jmp .Lmod4_loop .align 32 .Lmod4_loop: .byte 102,65,15,58,68,199,0 xorps %xmm12,%xmm4 movdqu 48(%rdx),%xmm11 .byte 102,69,15,56,0,218 .byte 102,65,15,58,68,207,17 xorps %xmm3,%xmm0 movdqu 32(%rdx),%xmm3 movdqa %xmm11,%xmm13 .byte 102,68,15,58,68,199,16 pshufd $78,%xmm11,%xmm12 xorps %xmm5,%xmm1 pxor %xmm11,%xmm12 .byte 102,65,15,56,0,218 movups 32(%rsi),%xmm7 xorps %xmm4,%xmm8 .byte 102,68,15,58,68,218,0 pshufd $78,%xmm3,%xmm4 pxor %xmm0,%xmm8 movdqa %xmm3,%xmm5 pxor %xmm1,%xmm8 pxor %xmm3,%xmm4 movdqa %xmm8,%xmm9 .byte 102,68,15,58,68,234,17 pslldq $8,%xmm8 psrldq $8,%xmm9 pxor %xmm8,%xmm0 movdqa .L7_mask(%rip),%xmm8 pxor %xmm9,%xmm1 .byte 102,76,15,110,200 pand %xmm0,%xmm8 .byte 102,69,15,56,0,200 pxor %xmm0,%xmm9 .byte 102,68,15,58,68,231,0 psllq $57,%xmm9 movdqa %xmm9,%xmm8 pslldq $8,%xmm9 .byte 102,15,58,68,222,0 psrldq $8,%xmm8 pxor %xmm9,%xmm0 pxor %xmm8,%xmm1 movdqu 0(%rdx),%xmm8 movdqa %xmm0,%xmm9 psrlq $1,%xmm0 .byte 102,15,58,68,238,17 xorps %xmm11,%xmm3 movdqu 16(%rdx),%xmm11 .byte 102,69,15,56,0,218 .byte 102,15,58,68,231,16 xorps %xmm13,%xmm5 movups 80(%rsi),%xmm7 .byte 102,69,15,56,0,194 pxor %xmm9,%xmm1 pxor %xmm0,%xmm9 psrlq $5,%xmm0 movdqa %xmm11,%xmm13 pxor %xmm12,%xmm4 pshufd $78,%xmm11,%xmm12 pxor %xmm9,%xmm0 pxor %xmm8,%xmm1 pxor %xmm11,%xmm12 .byte 102,69,15,58,68,222,0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 movdqa %xmm0,%xmm1 .byte 102,69,15,58,68,238,17 xorps %xmm11,%xmm3 pshufd $78,%xmm0,%xmm8 pxor %xmm0,%xmm8 .byte 102,68,15,58,68,231,0 xorps %xmm13,%xmm5 leaq 64(%rdx),%rdx subq $0x40,%rcx jnc .Lmod4_loop .Ltail4x: .byte 102,65,15,58,68,199,0 .byte 102,65,15,58,68,207,17 .byte 102,68,15,58,68,199,16 xorps %xmm12,%xmm4 xorps %xmm3,%xmm0 xorps %xmm5,%xmm1 pxor %xmm0,%xmm1 pxor %xmm4,%xmm8 pxor %xmm1,%xmm8 pxor %xmm0,%xmm1 movdqa %xmm8,%xmm9 psrldq $8,%xmm8 pslldq $8,%xmm9 pxor %xmm8,%xmm1 pxor %xmm9,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 addq $0x40,%rcx jz .Ldone movdqu 32(%rsi),%xmm7 subq $0x10,%rcx jz .Lodd_tail .Lskip4x: movdqu (%rdx),%xmm8 movdqu 16(%rdx),%xmm3 .byte 102,69,15,56,0,194 .byte 102,65,15,56,0,218 pxor %xmm8,%xmm0 movdqa %xmm3,%xmm5 pshufd $78,%xmm3,%xmm4 pxor %xmm3,%xmm4 .byte 102,15,58,68,218,0 .byte 102,15,58,68,234,17 .byte 102,15,58,68,231,0 leaq 32(%rdx),%rdx nop subq $0x20,%rcx jbe .Leven_tail nop jmp .Lmod_loop .align 32 .Lmod_loop: movdqa %xmm0,%xmm1 movdqa %xmm4,%xmm8 pshufd $78,%xmm0,%xmm4 pxor %xmm0,%xmm4 .byte 102,15,58,68,198,0 .byte 102,15,58,68,206,17 .byte 102,15,58,68,231,16 pxor %xmm3,%xmm0 pxor %xmm5,%xmm1 movdqu (%rdx),%xmm9 pxor %xmm0,%xmm8 .byte 102,69,15,56,0,202 movdqu 16(%rdx),%xmm3 pxor %xmm1,%xmm8 pxor %xmm9,%xmm1 pxor %xmm8,%xmm4 .byte 102,65,15,56,0,218 movdqa %xmm4,%xmm8 psrldq $8,%xmm8 pslldq $8,%xmm4 pxor %xmm8,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm3,%xmm5 movdqa %xmm0,%xmm9 movdqa %xmm0,%xmm8 psllq $5,%xmm0 pxor %xmm0,%xmm8 .byte 102,15,58,68,218,0 psllq $1,%xmm0 pxor %xmm8,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm8 pslldq $8,%xmm0 psrldq $8,%xmm8 pxor %xmm9,%xmm0 pshufd $78,%xmm5,%xmm4 pxor %xmm8,%xmm1 pxor %xmm5,%xmm4 movdqa %xmm0,%xmm9 psrlq $1,%xmm0 .byte 102,15,58,68,234,17 pxor %xmm9,%xmm1 pxor %xmm0,%xmm9 psrlq $5,%xmm0 pxor %xmm9,%xmm0 leaq 32(%rdx),%rdx psrlq $1,%xmm0 .byte 102,15,58,68,231,0 pxor %xmm1,%xmm0 subq $0x20,%rcx ja .Lmod_loop .Leven_tail: movdqa %xmm0,%xmm1 movdqa %xmm4,%xmm8 pshufd $78,%xmm0,%xmm4 pxor %xmm0,%xmm4 .byte 102,15,58,68,198,0 .byte 102,15,58,68,206,17 .byte 102,15,58,68,231,16 pxor %xmm3,%xmm0 pxor %xmm5,%xmm1 pxor %xmm0,%xmm8 pxor %xmm1,%xmm8 pxor %xmm8,%xmm4 movdqa %xmm4,%xmm8 psrldq $8,%xmm8 pslldq $8,%xmm4 pxor %xmm8,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 testq %rcx,%rcx jnz .Ldone .Lodd_tail: movdqu (%rdx),%xmm8 .byte 102,69,15,56,0,194 pxor %xmm8,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,223,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .Ldone: .byte 102,65,15,56,0,194 movdqu %xmm0,(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul .globl GFp_gcm_init_avx .hidden GFp_gcm_init_avx .type GFp_gcm_init_avx,@function .align 32 GFp_gcm_init_avx: .cfi_startproc vzeroupper vmovdqu (%rsi),%xmm2 vpshufd $78,%xmm2,%xmm2 vpshufd $255,%xmm2,%xmm4 vpsrlq $63,%xmm2,%xmm3 vpsllq $1,%xmm2,%xmm2 vpxor %xmm5,%xmm5,%xmm5 vpcmpgtd %xmm4,%xmm5,%xmm5 vpslldq $8,%xmm3,%xmm3 vpor %xmm3,%xmm2,%xmm2 vpand .L0x1c2_polynomial(%rip),%xmm5,%xmm5 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm2,%xmm2,%xmm6 vmovdqa %xmm2,%xmm0 vpxor %xmm2,%xmm6,%xmm6 movq $4,%r10 jmp .Linit_start_avx .align 32 .Linit_loop_avx: vpalignr $8,%xmm3,%xmm4,%xmm5 vmovdqu %xmm5,-16(%rdi) vpunpckhqdq %xmm0,%xmm0,%xmm3 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 vpxor %xmm0,%xmm1,%xmm4 vpxor %xmm4,%xmm3,%xmm3 vpslldq $8,%xmm3,%xmm4 vpsrldq $8,%xmm3,%xmm3 vpxor %xmm4,%xmm0,%xmm0 vpxor %xmm3,%xmm1,%xmm1 vpsllq $57,%xmm0,%xmm3 vpsllq $62,%xmm0,%xmm4 vpxor %xmm3,%xmm4,%xmm4 vpsllq $63,%xmm0,%xmm3 vpxor %xmm3,%xmm4,%xmm4 vpslldq $8,%xmm4,%xmm3 vpsrldq $8,%xmm4,%xmm4 vpxor %xmm3,%xmm0,%xmm0 vpxor %xmm4,%xmm1,%xmm1 vpsrlq $1,%xmm0,%xmm4 vpxor %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $5,%xmm4,%xmm4 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $1,%xmm0,%xmm0 vpxor %xmm1,%xmm0,%xmm0 .Linit_start_avx: vmovdqa %xmm0,%xmm5 vpunpckhqdq %xmm0,%xmm0,%xmm3 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 vpxor %xmm0,%xmm1,%xmm4 vpxor %xmm4,%xmm3,%xmm3 vpslldq $8,%xmm3,%xmm4 vpsrldq $8,%xmm3,%xmm3 vpxor %xmm4,%xmm0,%xmm0 vpxor %xmm3,%xmm1,%xmm1 vpsllq $57,%xmm0,%xmm3 vpsllq $62,%xmm0,%xmm4 vpxor %xmm3,%xmm4,%xmm4 vpsllq $63,%xmm0,%xmm3 vpxor %xmm3,%xmm4,%xmm4 vpslldq $8,%xmm4,%xmm3 vpsrldq $8,%xmm4,%xmm4 vpxor %xmm3,%xmm0,%xmm0 vpxor %xmm4,%xmm1,%xmm1 vpsrlq $1,%xmm0,%xmm4 vpxor %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $5,%xmm4,%xmm4 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $1,%xmm0,%xmm0 vpxor %xmm1,%xmm0,%xmm0 vpshufd $78,%xmm5,%xmm3 vpshufd $78,%xmm0,%xmm4 vpxor %xmm5,%xmm3,%xmm3 vmovdqu %xmm5,0(%rdi) vpxor %xmm0,%xmm4,%xmm4 vmovdqu %xmm0,16(%rdi) leaq 48(%rdi),%rdi subq $1,%r10 jnz .Linit_loop_avx vpalignr $8,%xmm4,%xmm3,%xmm5 vmovdqu %xmm5,-16(%rdi) vzeroupper .byte 0xf3,0xc3 .cfi_endproc .size GFp_gcm_init_avx,.-GFp_gcm_init_avx .globl GFp_gcm_ghash_avx .hidden GFp_gcm_ghash_avx .type GFp_gcm_ghash_avx,@function .align 32 GFp_gcm_ghash_avx: .cfi_startproc vzeroupper vmovdqu (%rdi),%xmm10 leaq .L0x1c2_polynomial(%rip),%r10 leaq 64(%rsi),%rsi vmovdqu .Lbswap_mask(%rip),%xmm13 vpshufb %xmm13,%xmm10,%xmm10 cmpq $0x80,%rcx jb .Lshort_avx subq $0x80,%rcx vmovdqu 112(%rdx),%xmm14 vmovdqu 0-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm14 vmovdqu 32-64(%rsi),%xmm7 vpunpckhqdq %xmm14,%xmm14,%xmm9 vmovdqu 96(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm14,%xmm9,%xmm9 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 16-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vmovdqu 80(%rdx),%xmm14 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 48-64(%rsi),%xmm6 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 64(%rdx),%xmm15 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 80-64(%rsi),%xmm7 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vmovdqu 48(%rdx),%xmm14 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm4,%xmm1,%xmm1 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 96-64(%rsi),%xmm6 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 128-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 32(%rdx),%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vmovdqu 16(%rdx),%xmm14 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm4,%xmm1,%xmm1 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 144-64(%rsi),%xmm6 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 176-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu (%rdx),%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 160-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 leaq 128(%rdx),%rdx cmpq $0x80,%rcx jb .Ltail_avx vpxor %xmm10,%xmm15,%xmm15 subq $0x80,%rcx jmp .Loop8x_avx .align 32 .Loop8x_avx: vpunpckhqdq %xmm15,%xmm15,%xmm8 vmovdqu 112(%rdx),%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpxor %xmm15,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm10 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm11 vmovdqu 0-64(%rsi),%xmm6 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm12 vmovdqu 32-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 96(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm3,%xmm10,%xmm10 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vxorps %xmm4,%xmm11,%xmm11 vmovdqu 16-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm5,%xmm12,%xmm12 vxorps %xmm15,%xmm8,%xmm8 vmovdqu 80(%rdx),%xmm14 vpxor %xmm10,%xmm12,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm11,%xmm12,%xmm12 vpslldq $8,%xmm12,%xmm9 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vpsrldq $8,%xmm12,%xmm12 vpxor %xmm9,%xmm10,%xmm10 vmovdqu 48-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm14 vxorps %xmm12,%xmm11,%xmm11 vpxor %xmm1,%xmm4,%xmm4 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 80-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 64(%rdx),%xmm15 vpalignr $8,%xmm10,%xmm10,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm4,%xmm1,%xmm1 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vxorps %xmm15,%xmm8,%xmm8 vpxor %xmm5,%xmm2,%xmm2 vmovdqu 48(%rdx),%xmm14 vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 96-64(%rsi),%xmm6 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 128-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 32(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm4,%xmm1,%xmm1 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vpxor %xmm5,%xmm2,%xmm2 vxorps %xmm12,%xmm10,%xmm10 vmovdqu 16(%rdx),%xmm14 vpalignr $8,%xmm10,%xmm10,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 144-64(%rsi),%xmm6 vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 vxorps %xmm11,%xmm12,%xmm12 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 176-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu (%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 160-64(%rsi),%xmm6 vpxor %xmm12,%xmm15,%xmm15 vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 vpxor %xmm10,%xmm15,%xmm15 leaq 128(%rdx),%rdx subq $0x80,%rcx jnc .Loop8x_avx addq $0x80,%rcx jmp .Ltail_no_xor_avx .align 32 .Lshort_avx: vmovdqu -16(%rdx,%rcx,1),%xmm14 leaq (%rdx,%rcx,1),%rdx vmovdqu 0-64(%rsi),%xmm6 vmovdqu 32-64(%rsi),%xmm7 vpshufb %xmm13,%xmm14,%xmm15 vmovdqa %xmm0,%xmm3 vmovdqa %xmm1,%xmm4 vmovdqa %xmm2,%xmm5 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -32(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 16-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -48(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 48-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu 80-64(%rsi),%xmm7 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -64(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -80(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 96-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu 128-64(%rsi),%xmm7 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -96(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz .Ltail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -112(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 144-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovq 184-64(%rsi),%xmm7 subq $0x10,%rcx jmp .Ltail_avx .align 32 .Ltail_avx: vpxor %xmm10,%xmm15,%xmm15 .Ltail_no_xor_avx: vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu (%r10),%xmm12 vpxor %xmm0,%xmm3,%xmm10 vpxor %xmm1,%xmm4,%xmm11 vpxor %xmm2,%xmm5,%xmm5 vpxor %xmm10,%xmm5,%xmm5 vpxor %xmm11,%xmm5,%xmm5 vpslldq $8,%xmm5,%xmm9 vpsrldq $8,%xmm5,%xmm5 vpxor %xmm9,%xmm10,%xmm10 vpxor %xmm5,%xmm11,%xmm11 vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 vpalignr $8,%xmm10,%xmm10,%xmm10 vpxor %xmm9,%xmm10,%xmm10 vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 vpalignr $8,%xmm10,%xmm10,%xmm10 vpxor %xmm11,%xmm10,%xmm10 vpxor %xmm9,%xmm10,%xmm10 cmpq $0,%rcx jne .Lshort_avx vpshufb %xmm13,%xmm10,%xmm10 vmovdqu %xmm10,(%rdi) vzeroupper .byte 0xf3,0xc3 .cfi_endproc .size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 .L0x1c2_polynomial: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 .L7_mask: .long 7,0,7,0 .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 #endif ring-0.16.9/pregenerated/ghash-x86_64-macosx.S000064400000000000000000000543171353224257700170670ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_gcm_init_clmul .private_extern _GFp_gcm_init_clmul .p2align 4 _GFp_gcm_init_clmul: L$_init_clmul: movdqu (%rsi),%xmm2 pshufd $78,%xmm2,%xmm2 pshufd $255,%xmm2,%xmm4 movdqa %xmm2,%xmm3 psllq $1,%xmm2 pxor %xmm5,%xmm5 psrlq $63,%xmm3 pcmpgtd %xmm4,%xmm5 pslldq $8,%xmm3 por %xmm3,%xmm2 pand L$0x1c2_polynomial(%rip),%xmm5 pxor %xmm5,%xmm2 pshufd $78,%xmm2,%xmm6 movdqa %xmm2,%xmm0 pxor %xmm2,%xmm6 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm2,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm2,%xmm3 movdqu %xmm2,0(%rdi) pxor %xmm0,%xmm4 movdqu %xmm0,16(%rdi) .byte 102,15,58,15,227,8 movdqu %xmm4,32(%rdi) movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 movdqa %xmm0,%xmm5 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,222,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 pshufd $78,%xmm5,%xmm3 pshufd $78,%xmm0,%xmm4 pxor %xmm5,%xmm3 movdqu %xmm5,48(%rdi) pxor %xmm0,%xmm4 movdqu %xmm0,64(%rdi) .byte 102,15,58,15,227,8 movdqu %xmm4,80(%rdi) .byte 0xf3,0xc3 .globl _GFp_gcm_gmult_clmul .private_extern _GFp_gcm_gmult_clmul .p2align 4 _GFp_gcm_gmult_clmul: movdqu (%rdi),%xmm0 movdqa L$bswap_mask(%rip),%xmm5 movdqu (%rsi),%xmm2 movdqu 32(%rsi),%xmm4 .byte 102,15,56,0,197 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,220,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) .byte 0xf3,0xc3 .globl _GFp_gcm_ghash_clmul .private_extern _GFp_gcm_ghash_clmul .p2align 5 _GFp_gcm_ghash_clmul: L$_ghash_clmul: movdqa L$bswap_mask(%rip),%xmm10 movdqu (%rdi),%xmm0 movdqu (%rsi),%xmm2 movdqu 32(%rsi),%xmm7 .byte 102,65,15,56,0,194 subq $0x10,%rcx jz L$odd_tail movdqu 16(%rsi),%xmm6 leaq _GFp_ia32cap_P(%rip),%rax movl 4(%rax),%eax cmpq $0x30,%rcx jb L$skip4x andl $71303168,%eax cmpl $4194304,%eax je L$skip4x subq $0x30,%rcx movq $0xA040608020C0E000,%rax movdqu 48(%rsi),%xmm14 movdqu 64(%rsi),%xmm15 movdqu 48(%rdx),%xmm3 movdqu 32(%rdx),%xmm11 .byte 102,65,15,56,0,218 .byte 102,69,15,56,0,218 movdqa %xmm3,%xmm5 pshufd $78,%xmm3,%xmm4 pxor %xmm3,%xmm4 .byte 102,15,58,68,218,0 .byte 102,15,58,68,234,17 .byte 102,15,58,68,231,0 movdqa %xmm11,%xmm13 pshufd $78,%xmm11,%xmm12 pxor %xmm11,%xmm12 .byte 102,68,15,58,68,222,0 .byte 102,68,15,58,68,238,17 .byte 102,68,15,58,68,231,16 xorps %xmm11,%xmm3 xorps %xmm13,%xmm5 movups 80(%rsi),%xmm7 xorps %xmm12,%xmm4 movdqu 16(%rdx),%xmm11 movdqu 0(%rdx),%xmm8 .byte 102,69,15,56,0,218 .byte 102,69,15,56,0,194 movdqa %xmm11,%xmm13 pshufd $78,%xmm11,%xmm12 pxor %xmm8,%xmm0 pxor %xmm11,%xmm12 .byte 102,69,15,58,68,222,0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm8 pxor %xmm0,%xmm8 .byte 102,69,15,58,68,238,17 .byte 102,68,15,58,68,231,0 xorps %xmm11,%xmm3 xorps %xmm13,%xmm5 leaq 64(%rdx),%rdx subq $0x40,%rcx jc L$tail4x jmp L$mod4_loop .p2align 5 L$mod4_loop: .byte 102,65,15,58,68,199,0 xorps %xmm12,%xmm4 movdqu 48(%rdx),%xmm11 .byte 102,69,15,56,0,218 .byte 102,65,15,58,68,207,17 xorps %xmm3,%xmm0 movdqu 32(%rdx),%xmm3 movdqa %xmm11,%xmm13 .byte 102,68,15,58,68,199,16 pshufd $78,%xmm11,%xmm12 xorps %xmm5,%xmm1 pxor %xmm11,%xmm12 .byte 102,65,15,56,0,218 movups 32(%rsi),%xmm7 xorps %xmm4,%xmm8 .byte 102,68,15,58,68,218,0 pshufd $78,%xmm3,%xmm4 pxor %xmm0,%xmm8 movdqa %xmm3,%xmm5 pxor %xmm1,%xmm8 pxor %xmm3,%xmm4 movdqa %xmm8,%xmm9 .byte 102,68,15,58,68,234,17 pslldq $8,%xmm8 psrldq $8,%xmm9 pxor %xmm8,%xmm0 movdqa L$7_mask(%rip),%xmm8 pxor %xmm9,%xmm1 .byte 102,76,15,110,200 pand %xmm0,%xmm8 .byte 102,69,15,56,0,200 pxor %xmm0,%xmm9 .byte 102,68,15,58,68,231,0 psllq $57,%xmm9 movdqa %xmm9,%xmm8 pslldq $8,%xmm9 .byte 102,15,58,68,222,0 psrldq $8,%xmm8 pxor %xmm9,%xmm0 pxor %xmm8,%xmm1 movdqu 0(%rdx),%xmm8 movdqa %xmm0,%xmm9 psrlq $1,%xmm0 .byte 102,15,58,68,238,17 xorps %xmm11,%xmm3 movdqu 16(%rdx),%xmm11 .byte 102,69,15,56,0,218 .byte 102,15,58,68,231,16 xorps %xmm13,%xmm5 movups 80(%rsi),%xmm7 .byte 102,69,15,56,0,194 pxor %xmm9,%xmm1 pxor %xmm0,%xmm9 psrlq $5,%xmm0 movdqa %xmm11,%xmm13 pxor %xmm12,%xmm4 pshufd $78,%xmm11,%xmm12 pxor %xmm9,%xmm0 pxor %xmm8,%xmm1 pxor %xmm11,%xmm12 .byte 102,69,15,58,68,222,0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 movdqa %xmm0,%xmm1 .byte 102,69,15,58,68,238,17 xorps %xmm11,%xmm3 pshufd $78,%xmm0,%xmm8 pxor %xmm0,%xmm8 .byte 102,68,15,58,68,231,0 xorps %xmm13,%xmm5 leaq 64(%rdx),%rdx subq $0x40,%rcx jnc L$mod4_loop L$tail4x: .byte 102,65,15,58,68,199,0 .byte 102,65,15,58,68,207,17 .byte 102,68,15,58,68,199,16 xorps %xmm12,%xmm4 xorps %xmm3,%xmm0 xorps %xmm5,%xmm1 pxor %xmm0,%xmm1 pxor %xmm4,%xmm8 pxor %xmm1,%xmm8 pxor %xmm0,%xmm1 movdqa %xmm8,%xmm9 psrldq $8,%xmm8 pslldq $8,%xmm9 pxor %xmm8,%xmm1 pxor %xmm9,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 addq $0x40,%rcx jz L$done movdqu 32(%rsi),%xmm7 subq $0x10,%rcx jz L$odd_tail L$skip4x: movdqu (%rdx),%xmm8 movdqu 16(%rdx),%xmm3 .byte 102,69,15,56,0,194 .byte 102,65,15,56,0,218 pxor %xmm8,%xmm0 movdqa %xmm3,%xmm5 pshufd $78,%xmm3,%xmm4 pxor %xmm3,%xmm4 .byte 102,15,58,68,218,0 .byte 102,15,58,68,234,17 .byte 102,15,58,68,231,0 leaq 32(%rdx),%rdx nop subq $0x20,%rcx jbe L$even_tail nop jmp L$mod_loop .p2align 5 L$mod_loop: movdqa %xmm0,%xmm1 movdqa %xmm4,%xmm8 pshufd $78,%xmm0,%xmm4 pxor %xmm0,%xmm4 .byte 102,15,58,68,198,0 .byte 102,15,58,68,206,17 .byte 102,15,58,68,231,16 pxor %xmm3,%xmm0 pxor %xmm5,%xmm1 movdqu (%rdx),%xmm9 pxor %xmm0,%xmm8 .byte 102,69,15,56,0,202 movdqu 16(%rdx),%xmm3 pxor %xmm1,%xmm8 pxor %xmm9,%xmm1 pxor %xmm8,%xmm4 .byte 102,65,15,56,0,218 movdqa %xmm4,%xmm8 psrldq $8,%xmm8 pslldq $8,%xmm4 pxor %xmm8,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm3,%xmm5 movdqa %xmm0,%xmm9 movdqa %xmm0,%xmm8 psllq $5,%xmm0 pxor %xmm0,%xmm8 .byte 102,15,58,68,218,0 psllq $1,%xmm0 pxor %xmm8,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm8 pslldq $8,%xmm0 psrldq $8,%xmm8 pxor %xmm9,%xmm0 pshufd $78,%xmm5,%xmm4 pxor %xmm8,%xmm1 pxor %xmm5,%xmm4 movdqa %xmm0,%xmm9 psrlq $1,%xmm0 .byte 102,15,58,68,234,17 pxor %xmm9,%xmm1 pxor %xmm0,%xmm9 psrlq $5,%xmm0 pxor %xmm9,%xmm0 leaq 32(%rdx),%rdx psrlq $1,%xmm0 .byte 102,15,58,68,231,0 pxor %xmm1,%xmm0 subq $0x20,%rcx ja L$mod_loop L$even_tail: movdqa %xmm0,%xmm1 movdqa %xmm4,%xmm8 pshufd $78,%xmm0,%xmm4 pxor %xmm0,%xmm4 .byte 102,15,58,68,198,0 .byte 102,15,58,68,206,17 .byte 102,15,58,68,231,16 pxor %xmm3,%xmm0 pxor %xmm5,%xmm1 pxor %xmm0,%xmm8 pxor %xmm1,%xmm8 pxor %xmm8,%xmm4 movdqa %xmm4,%xmm8 psrldq $8,%xmm8 pslldq $8,%xmm4 pxor %xmm8,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 testq %rcx,%rcx jnz L$done L$odd_tail: movdqu (%rdx),%xmm8 .byte 102,69,15,56,0,194 pxor %xmm8,%xmm0 movdqa %xmm0,%xmm1 pshufd $78,%xmm0,%xmm3 pxor %xmm0,%xmm3 .byte 102,15,58,68,194,0 .byte 102,15,58,68,202,17 .byte 102,15,58,68,223,0 pxor %xmm0,%xmm3 pxor %xmm1,%xmm3 movdqa %xmm3,%xmm4 psrldq $8,%xmm3 pslldq $8,%xmm4 pxor %xmm3,%xmm1 pxor %xmm4,%xmm0 movdqa %xmm0,%xmm4 movdqa %xmm0,%xmm3 psllq $5,%xmm0 pxor %xmm0,%xmm3 psllq $1,%xmm0 pxor %xmm3,%xmm0 psllq $57,%xmm0 movdqa %xmm0,%xmm3 pslldq $8,%xmm0 psrldq $8,%xmm3 pxor %xmm4,%xmm0 pxor %xmm3,%xmm1 movdqa %xmm0,%xmm4 psrlq $1,%xmm0 pxor %xmm4,%xmm1 pxor %xmm0,%xmm4 psrlq $5,%xmm0 pxor %xmm4,%xmm0 psrlq $1,%xmm0 pxor %xmm1,%xmm0 L$done: .byte 102,65,15,56,0,194 movdqu %xmm0,(%rdi) .byte 0xf3,0xc3 .globl _GFp_gcm_init_avx .private_extern _GFp_gcm_init_avx .p2align 5 _GFp_gcm_init_avx: vzeroupper vmovdqu (%rsi),%xmm2 vpshufd $78,%xmm2,%xmm2 vpshufd $255,%xmm2,%xmm4 vpsrlq $63,%xmm2,%xmm3 vpsllq $1,%xmm2,%xmm2 vpxor %xmm5,%xmm5,%xmm5 vpcmpgtd %xmm4,%xmm5,%xmm5 vpslldq $8,%xmm3,%xmm3 vpor %xmm3,%xmm2,%xmm2 vpand L$0x1c2_polynomial(%rip),%xmm5,%xmm5 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm2,%xmm2,%xmm6 vmovdqa %xmm2,%xmm0 vpxor %xmm2,%xmm6,%xmm6 movq $4,%r10 jmp L$init_start_avx .p2align 5 L$init_loop_avx: vpalignr $8,%xmm3,%xmm4,%xmm5 vmovdqu %xmm5,-16(%rdi) vpunpckhqdq %xmm0,%xmm0,%xmm3 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 vpxor %xmm0,%xmm1,%xmm4 vpxor %xmm4,%xmm3,%xmm3 vpslldq $8,%xmm3,%xmm4 vpsrldq $8,%xmm3,%xmm3 vpxor %xmm4,%xmm0,%xmm0 vpxor %xmm3,%xmm1,%xmm1 vpsllq $57,%xmm0,%xmm3 vpsllq $62,%xmm0,%xmm4 vpxor %xmm3,%xmm4,%xmm4 vpsllq $63,%xmm0,%xmm3 vpxor %xmm3,%xmm4,%xmm4 vpslldq $8,%xmm4,%xmm3 vpsrldq $8,%xmm4,%xmm4 vpxor %xmm3,%xmm0,%xmm0 vpxor %xmm4,%xmm1,%xmm1 vpsrlq $1,%xmm0,%xmm4 vpxor %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $5,%xmm4,%xmm4 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $1,%xmm0,%xmm0 vpxor %xmm1,%xmm0,%xmm0 L$init_start_avx: vmovdqa %xmm0,%xmm5 vpunpckhqdq %xmm0,%xmm0,%xmm3 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 vpxor %xmm0,%xmm1,%xmm4 vpxor %xmm4,%xmm3,%xmm3 vpslldq $8,%xmm3,%xmm4 vpsrldq $8,%xmm3,%xmm3 vpxor %xmm4,%xmm0,%xmm0 vpxor %xmm3,%xmm1,%xmm1 vpsllq $57,%xmm0,%xmm3 vpsllq $62,%xmm0,%xmm4 vpxor %xmm3,%xmm4,%xmm4 vpsllq $63,%xmm0,%xmm3 vpxor %xmm3,%xmm4,%xmm4 vpslldq $8,%xmm4,%xmm3 vpsrldq $8,%xmm4,%xmm4 vpxor %xmm3,%xmm0,%xmm0 vpxor %xmm4,%xmm1,%xmm1 vpsrlq $1,%xmm0,%xmm4 vpxor %xmm0,%xmm1,%xmm1 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $5,%xmm4,%xmm4 vpxor %xmm4,%xmm0,%xmm0 vpsrlq $1,%xmm0,%xmm0 vpxor %xmm1,%xmm0,%xmm0 vpshufd $78,%xmm5,%xmm3 vpshufd $78,%xmm0,%xmm4 vpxor %xmm5,%xmm3,%xmm3 vmovdqu %xmm5,0(%rdi) vpxor %xmm0,%xmm4,%xmm4 vmovdqu %xmm0,16(%rdi) leaq 48(%rdi),%rdi subq $1,%r10 jnz L$init_loop_avx vpalignr $8,%xmm4,%xmm3,%xmm5 vmovdqu %xmm5,-16(%rdi) vzeroupper .byte 0xf3,0xc3 .globl _GFp_gcm_ghash_avx .private_extern _GFp_gcm_ghash_avx .p2align 5 _GFp_gcm_ghash_avx: vzeroupper vmovdqu (%rdi),%xmm10 leaq L$0x1c2_polynomial(%rip),%r10 leaq 64(%rsi),%rsi vmovdqu L$bswap_mask(%rip),%xmm13 vpshufb %xmm13,%xmm10,%xmm10 cmpq $0x80,%rcx jb L$short_avx subq $0x80,%rcx vmovdqu 112(%rdx),%xmm14 vmovdqu 0-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm14 vmovdqu 32-64(%rsi),%xmm7 vpunpckhqdq %xmm14,%xmm14,%xmm9 vmovdqu 96(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm14,%xmm9,%xmm9 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 16-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vmovdqu 80(%rdx),%xmm14 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 48-64(%rsi),%xmm6 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 64(%rdx),%xmm15 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 80-64(%rsi),%xmm7 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vmovdqu 48(%rdx),%xmm14 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm4,%xmm1,%xmm1 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 96-64(%rsi),%xmm6 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 128-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 32(%rdx),%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vmovdqu 16(%rdx),%xmm14 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm4,%xmm1,%xmm1 vpshufb %xmm13,%xmm14,%xmm14 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 144-64(%rsi),%xmm6 vpxor %xmm5,%xmm2,%xmm2 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 176-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu (%rdx),%xmm15 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm1,%xmm4,%xmm4 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 160-64(%rsi),%xmm6 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 leaq 128(%rdx),%rdx cmpq $0x80,%rcx jb L$tail_avx vpxor %xmm10,%xmm15,%xmm15 subq $0x80,%rcx jmp L$oop8x_avx .p2align 5 L$oop8x_avx: vpunpckhqdq %xmm15,%xmm15,%xmm8 vmovdqu 112(%rdx),%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpxor %xmm15,%xmm8,%xmm8 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm10 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm11 vmovdqu 0-64(%rsi),%xmm6 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm12 vmovdqu 32-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vmovdqu 96(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpxor %xmm3,%xmm10,%xmm10 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vxorps %xmm4,%xmm11,%xmm11 vmovdqu 16-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm5,%xmm12,%xmm12 vxorps %xmm15,%xmm8,%xmm8 vmovdqu 80(%rdx),%xmm14 vpxor %xmm10,%xmm12,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpxor %xmm11,%xmm12,%xmm12 vpslldq $8,%xmm12,%xmm9 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vpsrldq $8,%xmm12,%xmm12 vpxor %xmm9,%xmm10,%xmm10 vmovdqu 48-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm14 vxorps %xmm12,%xmm11,%xmm11 vpxor %xmm1,%xmm4,%xmm4 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 80-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 64(%rdx),%xmm15 vpalignr $8,%xmm10,%xmm10,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm4,%xmm1,%xmm1 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vxorps %xmm15,%xmm8,%xmm8 vpxor %xmm5,%xmm2,%xmm2 vmovdqu 48(%rdx),%xmm14 vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 96-64(%rsi),%xmm6 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 128-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu 32(%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpxor %xmm3,%xmm0,%xmm0 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm4,%xmm1,%xmm1 vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 vpxor %xmm15,%xmm8,%xmm8 vpxor %xmm5,%xmm2,%xmm2 vxorps %xmm12,%xmm10,%xmm10 vmovdqu 16(%rdx),%xmm14 vpalignr $8,%xmm10,%xmm10,%xmm12 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 vpshufb %xmm13,%xmm14,%xmm14 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 vmovdqu 144-64(%rsi),%xmm6 vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 vxorps %xmm11,%xmm12,%xmm12 vpunpckhqdq %xmm14,%xmm14,%xmm9 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 vmovdqu 176-64(%rsi),%xmm7 vpxor %xmm14,%xmm9,%xmm9 vpxor %xmm2,%xmm5,%xmm5 vmovdqu (%rdx),%xmm15 vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 vpshufb %xmm13,%xmm15,%xmm15 vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 vmovdqu 160-64(%rsi),%xmm6 vpxor %xmm12,%xmm15,%xmm15 vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 vpxor %xmm10,%xmm15,%xmm15 leaq 128(%rdx),%rdx subq $0x80,%rcx jnc L$oop8x_avx addq $0x80,%rcx jmp L$tail_no_xor_avx .p2align 5 L$short_avx: vmovdqu -16(%rdx,%rcx,1),%xmm14 leaq (%rdx,%rcx,1),%rdx vmovdqu 0-64(%rsi),%xmm6 vmovdqu 32-64(%rsi),%xmm7 vpshufb %xmm13,%xmm14,%xmm15 vmovdqa %xmm0,%xmm3 vmovdqa %xmm1,%xmm4 vmovdqa %xmm2,%xmm5 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -32(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 16-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -48(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 48-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu 80-64(%rsi),%xmm7 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -64(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 64-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -80(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 96-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu 128-64(%rsi),%xmm7 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -96(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 112-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vpsrldq $8,%xmm7,%xmm7 subq $0x10,%rcx jz L$tail_avx vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vmovdqu -112(%rdx),%xmm14 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vmovdqu 144-64(%rsi),%xmm6 vpshufb %xmm13,%xmm14,%xmm15 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovq 184-64(%rsi),%xmm7 subq $0x10,%rcx jmp L$tail_avx .p2align 5 L$tail_avx: vpxor %xmm10,%xmm15,%xmm15 L$tail_no_xor_avx: vpunpckhqdq %xmm15,%xmm15,%xmm8 vpxor %xmm0,%xmm3,%xmm3 vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 vpxor %xmm15,%xmm8,%xmm8 vpxor %xmm1,%xmm4,%xmm4 vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 vpxor %xmm2,%xmm5,%xmm5 vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 vmovdqu (%r10),%xmm12 vpxor %xmm0,%xmm3,%xmm10 vpxor %xmm1,%xmm4,%xmm11 vpxor %xmm2,%xmm5,%xmm5 vpxor %xmm10,%xmm5,%xmm5 vpxor %xmm11,%xmm5,%xmm5 vpslldq $8,%xmm5,%xmm9 vpsrldq $8,%xmm5,%xmm5 vpxor %xmm9,%xmm10,%xmm10 vpxor %xmm5,%xmm11,%xmm11 vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 vpalignr $8,%xmm10,%xmm10,%xmm10 vpxor %xmm9,%xmm10,%xmm10 vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 vpalignr $8,%xmm10,%xmm10,%xmm10 vpxor %xmm11,%xmm10,%xmm10 vpxor %xmm9,%xmm10,%xmm10 cmpq $0,%rcx jne L$short_avx vpshufb %xmm13,%xmm10,%xmm10 vmovdqu %xmm10,(%rdi) vzeroupper .byte 0xf3,0xc3 .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 L$0x1c2_polynomial: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 L$7_mask: .long 7,0,7,0 .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 #endif ring-0.16.9/pregenerated/ghash-x86_64-nasm.obj000064400000000000000000000425101353224260300170610ustar0000000000000000dEi]%?1.text p`.pdata0 @0@.xdata<i@@@.debug$S%I<H@B.debug$T ?@BH)4$ofpNfpfofsffs?fffsff-ffpNfoffofpNff:Df:Df:Dfffofsfsfffofofsffsffs9fofsfsfffofsfffsffsffpNfpNffAf:a fofpNff:Df:Df:Dfffofsfsfffofofsffsffs9fofsfsfffofsfffsffsffofofpNff:Df:Df:Dfffofsfsfffofofsffsffs9fofsfsfffofsfffsffsffpNfpNfi0fA@f:aP(4$Hd$ofo-oob f8fofpNff:Df:Df:Dfffofsfsfffofofsffsffs9fofsfsfffofsfffsffsff8ffffff.H$xH`)p)xD)D)HD)P D)X0D)`@D)hPD)p`D)xpfDooooz fA8IuorH@I0H%@=@8I0H `@Dor0Doz@AoX0EoX fA8fE8fofpNff:Df:Df:DfEofEpNfEfD:DfD:DfD:DAWAWzPAWEoXEofE8fE8fEofEpNfAfEfE:DfofDpNfDfE:DfD:DAWAWM@@I@DfA:DAWEoX0fE8fA:DWAoX fEofD:DfEpNWfEfA8z DWfD:DfpNfDfofDffEofD:DfAsfAsfAfDo fAfLnfDfE8fDfD:DfAs9fEofAsf:DfAsfAfAEofDofsf:DAWEoXfE8f:DAWzPfE8fAfDfsfEofAfEpNfAfAfEfE:DfsffofE:DAWfDpNfDfD:DAWM@@I@{fA:DfA:DfD:DAWWWffDfDffEofAsfAsfAfAfofofsffsffs9fofsfsfffofsfffsffsfI@oz IEoAoXfE8fA8fAfofpNff:Df:Df:DM@ I fffff.fofDofpNff:Df:Df:DffEofDfE8AoXfDfAfAfA8fDofAsfsfAffofDofDofsfDf:DfsfAfs9fDofsfAsfAfpNfAffDofsf:DfAfDfsfAM@ fsf:DfI fofDofpNff:Df:Df:DfffDfDfAfDofAsfsfAffofofsffsffs9fofsfsfffofsfffsffsfMEofE8fAfofpNff:Df:Df:Dfffofsfsfffofofsffsffs9fofsfsfffofsfffsffsffA8(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($H$ffffff.H)4$wopNps?sfs-moIYimyDyDaDsss9s>s?sssssomyDyDaDsss9s>s?ssssspNpN)AHI0Iaiw(4$Hd$ffffff.H$xH`)p)xD)D)HD)P D)X0D)`@D)hPD)p`D)xpwzoL'HR@zo- B)IIAzopporB ozA mAzox` DA1B DorAmAzopP1DA9B DA mDorA1Azox@9DozB DAm Do21DA9Azop0DB Dor A m9Doz@A1Azox DB Dor0Am1DA9AzopDB DorPA m9DozpA1Azo8 DB Dor`1DMILAIffffff.fff.AmAzoppA9cDB cDorA mc9DozA1Azox` D)B D WorAm1DA8WAzopPADA1sDsA)orB A WA m9DozA1Azox@C) DB Do2Am1DA8WAzop0C)DDB Dor A m9Doz@A1Azox DB Dor0Am1DA9A(WAzopC)DB DorPC)DAWA m9DozpA1Azo8 DB Dor`A1DAMIIfffff.zotOorozB oooIAmDA9AzopDorB 9DsIiAmDA9AzopDorB 9DozI"AmDA9AzopDo2B 9DsIAmDA9AzopDor B 9Doz@IAmDA9AzopDor0B 9DsINAmDA9AzopDorPB 9D~zxIAAmDA9D9DAzo"aYQQűssA)!C)DC)A)C)DC)A)A)IB)zw(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($H$ffffff.ffffff. GHASH for x86_64, CRYPTOGAMS by ffffff.ffff.VWSUATAUAVAWH@I@xIIqMY8ENL9aIESNL9IHHHXHhL`LhLpLxIIMMMMHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^é$ ) * )$(#,*h"33 .)$ xh0P:\ring\pregenerated\tmp\ghash-x86_64-nasm.asm׍`msl@65   #(,1 5#=$A'F(J)N*R+W,[-a.g/m0q1u3y4~5679:;<=>?@ABCDGHIJKLMNOPQRSTUV W XYZ["\(],^0`4a9b>cBdFfJgNhSiWj\k`leminnospwq{tuvwxyz{|}~ !%*.37<AEJNSY^bgipt|  $(*@HLPTX]bglqv{       &!+"2#9$@%D&H'L(P*V+[,a-g.l/r0w1|23456789;<=?@BCDEFGHIJKLMNO PQRT U$V)W-X2Y9Z?[E\J]S^X_]abbhcmdtezfghijklnopqrstuvwxyz|}~ !',37;?ELSZ^adhmrv{ "'+17=ABFLMR`dinrx~  % * 0 5 : ?DHMSW[aejosy!"#$%&'()*,-./01234567:;<=> ? @ A B C F G! H& I* J/ K3 L9 M? NE OI PM RQ SV T[ U_ Vc Xg Yk Zp [t \y ]} ^ _ ` a b c f g h i j k l m o p q r s t u v w x y z { }  $ ( + / 4 9 > C G K P T \ ` d h l s x                                    % ) - 2 7 ; ? D I M R V [ ` d h m q u z ~                                " ) - 5 : A G N T Y ^ c h n t y ~      ! # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6 8 9 : ; < = >% ?) @. A4 B9 C> ED FH GN HR IW J] Kb Lf Mk Nq Ov Q| R S T U V W X Y Z [ \ ^ _ ` a b c d e f h i j l mnp r%s+t/u4v:w?xCyIzN{S|W}]~bgmsw|!&*059?EKPTZ_dhnsx| "'-29@FMR`gkpuz~      #'-28<BFKOUZ ^!d#i$m%s&x'~()*+,-./023456789:;<=>?ABCDE FGHI J$K*L/M3N8P@RETJUNVTWYX]YcZg[m]r_v`za~cdefghjklnopqstvwxyz{|}~!@P`p #'+29@GNUY]dkrvy~^1P:\ring\pregenerated\ghash-x86_64-nasm.objyasm 1.3.0GFp_gcm_init_clmulL$_init_clmul(L$SEH_begin_GFp_gcm_init_clmulL$0x1c2_polynomial&L$SEH_end_GFp_gcm_init_clmulGFp_gcm_gmult_clmulL$bswap_maskGFp_gcm_ghash_clmulL$_ghash_clmul)L$SEH_begin_GFp_gcm_ghash_clmulL$odd_tailL$skip4xL$tail4xL$mod4_loopL$7_maskL$doneL$even_tailL$mod_loop'L$SEH_end_GFp_gcm_ghash_clmulGFp_gcm_init_avx&L$SEH_begin_GFp_gcm_init_avxL$init_start_avxL$init_loop_avx$L$SEH_end_GFp_gcm_init_avxGFp_gcm_ghash_avx'L$SEH_begin_GFp_gcm_ghash_avxL$short_avxL$tail_avxL$oop8x_avxL$tail_no_xor_avx%L$SEH_end_GFp_gcm_ghash_avxse_handlerL$in_prologue*  L$SEH_info_GFp_gcm_init_clmul+  L$SEH_info_GFp_gcm_ghash_clmuld h ! ! ! ! ! ! ! " " " C" G" b" f" z" ~" " " " " " " " " # # # # 3# 7# G# K# Y# ]# p# t# # # # # # # # # $ $ *$ .$ P$ T$ m$ q$ $ $ $ $ $! $! $" $" $# $# %% "%% 4%& 8%& Q%) U%) }%* %* .fileg.text+9LZyPgp@@@H  L$skip4xL$tail4xEL$7_mask`L$done $a0`; Y j      `@  E(D[fU.pdata0 t .xdata<.debug$S%H.debug$T pregenerated\tmp\ghash-x86_64-nasm.asmGFp_ia32cap_PGFp_gcm_init_clmulL$_init_clmulL$SEH_begin_GFp_gcm_init_clmulL$0x1c2_polynomialL$SEH_end_GFp_gcm_init_clmulGFp_gcm_gmult_clmulL$bswap_maskGFp_gcm_ghash_clmulL$_ghash_clmulL$SEH_begin_GFp_gcm_ghash_clmulL$odd_tailL$mod4_loopL$even_tailL$mod_loopL$SEH_end_GFp_gcm_ghash_clmulGFp_gcm_init_avxL$SEH_begin_GFp_gcm_init_avxL$init_start_avxL$init_loop_avxL$SEH_end_GFp_gcm_init_avxGFp_gcm_ghash_avxL$SEH_begin_GFp_gcm_ghash_avxL$short_avxL$tail_avxL$oop8x_avxL$tail_no_xor_avxL$SEH_end_GFp_gcm_ghash_avx__imp_RtlVirtualUnwindse_handlerL$in_prologueL$SEH_info_GFp_gcm_init_clmulL$SEH_info_GFp_gcm_ghash_clmulring-0.16.9/pregenerated/ghashv8-armx-ios32.S000064400000000000000000000152061353224261000170010ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text .code 32 #undef __thumb2__ .globl _GFp_gcm_init_clmul .private_extern _GFp_gcm_init_clmul #ifdef __thumb2__ .thumb_func _GFp_gcm_init_clmul #endif .align 4 _GFp_gcm_init_clmul: vld1.64 {q9},[r1] @ load input H vmov.i8 q11,#0xe1 vshl.i64 q11,q11,#57 @ 0xc2.0 vext.8 q3,q9,q9,#8 vshr.u64 q10,q11,#63 vdup.32 q9,d18[1] vext.8 q8,q10,q11,#8 @ t0=0xc2....01 vshr.u64 q10,q3,#63 vshr.s32 q9,q9,#31 @ broadcast carry bit vand q10,q10,q8 vshl.i64 q3,q3,#1 vext.8 q10,q10,q10,#8 vand q8,q8,q9 vorr q3,q3,q10 @ H<<<=1 veor q12,q3,q8 @ twisted H vst1.64 {q12},[r0]! @ store Htable[0] @ calculate H^2 vext.8 q8,q12,q12,#8 @ Karatsuba pre-processing .byte 0xa8,0x0e,0xa8,0xf2 @ pmull q0,q12,q12 veor q8,q8,q12 .byte 0xa9,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q12 .byte 0xa0,0x2e,0xa0,0xf2 @ pmull q1,q8,q8 vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q14,q0,q10 vext.8 q9,q14,q14,#8 @ Karatsuba pre-processing veor q9,q9,q14 vext.8 q13,q8,q9,#8 @ pack Karatsuba pre-processed vst1.64 {q13,q14},[r0] @ store Htable[1..2] bx lr .globl _GFp_gcm_gmult_clmul .private_extern _GFp_gcm_gmult_clmul #ifdef __thumb2__ .thumb_func _GFp_gcm_gmult_clmul #endif .align 4 _GFp_gcm_gmult_clmul: vld1.64 {q9},[r0] @ load Xi vmov.i8 q11,#0xe1 vld1.64 {q12,q13},[r1] @ load twisted H, ... vshl.u64 q11,q11,#57 #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vext.8 q3,q9,q9,#8 .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo veor q9,q9,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q0,q0,q10 #ifndef __ARMEB__ vrev64.8 q0,q0 #endif vext.8 q0,q0,q0,#8 vst1.64 {q0},[r0] @ write out Xi bx lr .globl _GFp_gcm_ghash_clmul .private_extern _GFp_gcm_ghash_clmul #ifdef __thumb2__ .thumb_func _GFp_gcm_ghash_clmul #endif .align 4 _GFp_gcm_ghash_clmul: vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so vld1.64 {q0},[r0] @ load [rotated] Xi @ "[rotated]" means that @ loaded value would have @ to be rotated in order to @ make it appear as in @ algorithm specification subs r3,r3,#32 @ see if r3 is 32 or larger mov r12,#16 @ r12 is used as post- @ increment for input pointer; @ as loop is modulo-scheduled @ r12 is zeroed just in time @ to preclude overstepping @ inp[len], which means that @ last block[s] are actually @ loaded twice, but last @ copy is not processed vld1.64 {q12,q13},[r1]! @ load twisted H, ..., H^2 vmov.i8 q11,#0xe1 vld1.64 {q14},[r1] moveq r12,#0 @ is it time to zero r12? vext.8 q0,q0,q0,#8 @ rotate Xi vld1.64 {q8},[r2]! @ load [rotated] I[0] vshl.u64 q11,q11,#57 @ compose 0xc2.0 constant #ifndef __ARMEB__ vrev64.8 q8,q8 vrev64.8 q0,q0 #endif vext.8 q3,q8,q8,#8 @ rotate I[0] blo Lodd_tail_v8 @ r3 was less than 32 vld1.64 {q9},[r2],r12 @ load [rotated] I[1] #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vext.8 q7,q9,q9,#8 veor q3,q3,q0 @ I[i]^=Xi .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 veor q9,q9,q7 @ Karatsuba pre-processing .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 b Loop_mod2x_v8 .align 4 Loop_mod2x_v8: vext.8 q10,q3,q3,#8 subs r3,r3,#32 @ is there more data? .byte 0x86,0x0e,0xac,0xf2 @ pmull q0,q14,q3 @ H^2.lo·Xi.lo movlo r12,#0 @ is it time to zero r12? .byte 0xa2,0xae,0xaa,0xf2 @ pmull q5,q13,q9 veor q10,q10,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xad,0xf2 @ pmull2 q2,q14,q3 @ H^2.hi·Xi.hi veor q0,q0,q4 @ accumulate .byte 0xa5,0x2e,0xab,0xf2 @ pmull2 q1,q13,q10 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) vld1.64 {q8},[r2],r12 @ load [rotated] I[i+2] veor q2,q2,q6 moveq r12,#0 @ is it time to zero r12? veor q1,q1,q5 vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 vld1.64 {q9},[r2],r12 @ load [rotated] I[i+3] #ifndef __ARMEB__ vrev64.8 q8,q8 #endif veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl vext.8 q7,q9,q9,#8 vext.8 q3,q8,q8,#8 veor q0,q1,q10 .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 veor q3,q3,q2 @ accumulate q3 early vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q3,q3,q10 veor q9,q9,q7 @ Karatsuba pre-processing veor q3,q3,q0 .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 bhs Loop_mod2x_v8 @ there was at least 32 more bytes veor q2,q2,q10 vext.8 q3,q8,q8,#8 @ re-construct q3 adds r3,r3,#32 @ re-construct r3 veor q0,q0,q2 @ re-construct q0 beq Ldone_v8 @ is r3 zero? Lodd_tail_v8: vext.8 q10,q0,q0,#8 veor q3,q3,q0 @ inp^=Xi veor q9,q8,q10 @ q9 is rotated inp^Xi .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo veor q9,q9,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q0,q0,q10 Ldone_v8: #ifndef __ARMEB__ vrev64.8 q0,q0 #endif vext.8 q0,q0,q0,#8 vst1.64 {q0},[r0] @ write out Xi vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so bx lr .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghashv8-armx-ios64.S000064400000000000000000000151631353224260500170140ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text .globl _GFp_gcm_init_clmul .private_extern _GFp_gcm_init_clmul .align 4 _GFp_gcm_init_clmul: ld1 {v17.2d},[x1] //load input H movi v19.16b,#0xe1 shl v19.2d,v19.2d,#57 //0xc2.0 ext v3.16b,v17.16b,v17.16b,#8 ushr v18.2d,v19.2d,#63 dup v17.4s,v17.s[1] ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 ushr v18.2d,v3.2d,#63 sshr v17.4s,v17.4s,#31 //broadcast carry bit and v18.16b,v18.16b,v16.16b shl v3.2d,v3.2d,#1 ext v18.16b,v18.16b,v18.16b,#8 and v16.16b,v16.16b,v17.16b orr v3.16b,v3.16b,v18.16b //H<<<=1 eor v20.16b,v3.16b,v16.16b //twisted H st1 {v20.2d},[x0],#16 //store Htable[0] //calculate H^2 ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing pmull v0.1q,v20.1d,v20.1d eor v16.16b,v16.16b,v20.16b pmull2 v2.1q,v20.2d,v20.2d pmull v1.1q,v16.1d,v16.1d ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v22.16b,v0.16b,v18.16b ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing eor v17.16b,v17.16b,v22.16b ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed st1 {v21.2d,v22.2d},[x0] //store Htable[1..2] ret .globl _GFp_gcm_gmult_clmul .private_extern _GFp_gcm_gmult_clmul .align 4 _GFp_gcm_gmult_clmul: ld1 {v17.2d},[x0] //load Xi movi v19.16b,#0xe1 ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... shl v19.2d,v19.2d,#57 #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ext v3.16b,v17.16b,v17.16b,#8 pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v0.16b,v0.16b,v18.16b #ifndef __ARMEB__ rev64 v0.16b,v0.16b #endif ext v0.16b,v0.16b,v0.16b,#8 st1 {v0.2d},[x0] //write out Xi ret .globl _GFp_gcm_ghash_clmul .private_extern _GFp_gcm_ghash_clmul .align 4 _GFp_gcm_ghash_clmul: ld1 {v0.2d},[x0] //load [rotated] Xi //"[rotated]" means that //loaded value would have //to be rotated in order to //make it appear as in //algorithm specification subs x3,x3,#32 //see if x3 is 32 or larger mov x12,#16 //x12 is used as post- //increment for input pointer; //as loop is modulo-scheduled //x12 is zeroed just in time //to preclude overstepping //inp[len], which means that //last block[s] are actually //loaded twice, but last //copy is not processed ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 movi v19.16b,#0xe1 ld1 {v22.2d},[x1] csel x12,xzr,x12,eq //is it time to zero x12? ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi ld1 {v16.2d},[x2],#16 //load [rotated] I[0] shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant #ifndef __ARMEB__ rev64 v16.16b,v16.16b rev64 v0.16b,v0.16b #endif ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] b.lo Lodd_tail_v8 //x3 was less than 32 ld1 {v17.2d},[x2],x12 //load [rotated] I[1] #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ext v7.16b,v17.16b,v17.16b,#8 eor v3.16b,v3.16b,v0.16b //I[i]^=Xi pmull v4.1q,v20.1d,v7.1d //H·Ii+1 eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing pmull2 v6.1q,v20.2d,v7.2d b Loop_mod2x_v8 .align 4 Loop_mod2x_v8: ext v18.16b,v3.16b,v3.16b,#8 subs x3,x3,#32 //is there more data? pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo csel x12,xzr,x12,lo //is it time to zero x12? pmull v5.1q,v21.1d,v17.1d eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi eor v0.16b,v0.16b,v4.16b //accumulate pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] eor v2.16b,v2.16b,v6.16b csel x12,xzr,x12,eq //is it time to zero x12? eor v1.16b,v1.16b,v5.16b ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] #ifndef __ARMEB__ rev64 v16.16b,v16.16b #endif eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] ext v7.16b,v17.16b,v17.16b,#8 ext v3.16b,v16.16b,v16.16b,#8 eor v0.16b,v1.16b,v18.16b pmull v4.1q,v20.1d,v7.1d //H·Ii+1 eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v3.16b,v3.16b,v18.16b eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing eor v3.16b,v3.16b,v0.16b pmull2 v6.1q,v20.2d,v7.2d b.hs Loop_mod2x_v8 //there was at least 32 more bytes eor v2.16b,v2.16b,v18.16b ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b adds x3,x3,#32 //re-construct x3 eor v0.16b,v0.16b,v2.16b //re-construct v0.16b b.eq Ldone_v8 //is x3 zero? Lodd_tail_v8: ext v18.16b,v0.16b,v0.16b,#8 eor v3.16b,v3.16b,v0.16b //inp^=Xi eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v0.16b,v0.16b,v18.16b Ldone_v8: #ifndef __ARMEB__ rev64 v0.16b,v0.16b #endif ext v0.16b,v0.16b,v0.16b,#8 st1 {v0.2d},[x0] //write out Xi ret .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghashv8-armx-linux32.S000064400000000000000000000153321353224261100173470ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include .text .fpu neon .code 32 #undef __thumb2__ .globl GFp_gcm_init_clmul .hidden GFp_gcm_init_clmul .type GFp_gcm_init_clmul,%function .align 4 GFp_gcm_init_clmul: vld1.64 {q9},[r1] @ load input H vmov.i8 q11,#0xe1 vshl.i64 q11,q11,#57 @ 0xc2.0 vext.8 q3,q9,q9,#8 vshr.u64 q10,q11,#63 vdup.32 q9,d18[1] vext.8 q8,q10,q11,#8 @ t0=0xc2....01 vshr.u64 q10,q3,#63 vshr.s32 q9,q9,#31 @ broadcast carry bit vand q10,q10,q8 vshl.i64 q3,q3,#1 vext.8 q10,q10,q10,#8 vand q8,q8,q9 vorr q3,q3,q10 @ H<<<=1 veor q12,q3,q8 @ twisted H vst1.64 {q12},[r0]! @ store Htable[0] @ calculate H^2 vext.8 q8,q12,q12,#8 @ Karatsuba pre-processing .byte 0xa8,0x0e,0xa8,0xf2 @ pmull q0,q12,q12 veor q8,q8,q12 .byte 0xa9,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q12 .byte 0xa0,0x2e,0xa0,0xf2 @ pmull q1,q8,q8 vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q14,q0,q10 vext.8 q9,q14,q14,#8 @ Karatsuba pre-processing veor q9,q9,q14 vext.8 q13,q8,q9,#8 @ pack Karatsuba pre-processed vst1.64 {q13,q14},[r0] @ store Htable[1..2] bx lr .size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul .globl GFp_gcm_gmult_clmul .hidden GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,%function .align 4 GFp_gcm_gmult_clmul: vld1.64 {q9},[r0] @ load Xi vmov.i8 q11,#0xe1 vld1.64 {q12,q13},[r1] @ load twisted H, ... vshl.u64 q11,q11,#57 #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vext.8 q3,q9,q9,#8 .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo veor q9,q9,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q0,q0,q10 #ifndef __ARMEB__ vrev64.8 q0,q0 #endif vext.8 q0,q0,q0,#8 vst1.64 {q0},[r0] @ write out Xi bx lr .size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul .globl GFp_gcm_ghash_clmul .hidden GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,%function .align 4 GFp_gcm_ghash_clmul: vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so vld1.64 {q0},[r0] @ load [rotated] Xi @ "[rotated]" means that @ loaded value would have @ to be rotated in order to @ make it appear as in @ algorithm specification subs r3,r3,#32 @ see if r3 is 32 or larger mov r12,#16 @ r12 is used as post- @ increment for input pointer; @ as loop is modulo-scheduled @ r12 is zeroed just in time @ to preclude overstepping @ inp[len], which means that @ last block[s] are actually @ loaded twice, but last @ copy is not processed vld1.64 {q12,q13},[r1]! @ load twisted H, ..., H^2 vmov.i8 q11,#0xe1 vld1.64 {q14},[r1] moveq r12,#0 @ is it time to zero r12? vext.8 q0,q0,q0,#8 @ rotate Xi vld1.64 {q8},[r2]! @ load [rotated] I[0] vshl.u64 q11,q11,#57 @ compose 0xc2.0 constant #ifndef __ARMEB__ vrev64.8 q8,q8 vrev64.8 q0,q0 #endif vext.8 q3,q8,q8,#8 @ rotate I[0] blo .Lodd_tail_v8 @ r3 was less than 32 vld1.64 {q9},[r2],r12 @ load [rotated] I[1] #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vext.8 q7,q9,q9,#8 veor q3,q3,q0 @ I[i]^=Xi .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 veor q9,q9,q7 @ Karatsuba pre-processing .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 b .Loop_mod2x_v8 .align 4 .Loop_mod2x_v8: vext.8 q10,q3,q3,#8 subs r3,r3,#32 @ is there more data? .byte 0x86,0x0e,0xac,0xf2 @ pmull q0,q14,q3 @ H^2.lo·Xi.lo movlo r12,#0 @ is it time to zero r12? .byte 0xa2,0xae,0xaa,0xf2 @ pmull q5,q13,q9 veor q10,q10,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xad,0xf2 @ pmull2 q2,q14,q3 @ H^2.hi·Xi.hi veor q0,q0,q4 @ accumulate .byte 0xa5,0x2e,0xab,0xf2 @ pmull2 q1,q13,q10 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) vld1.64 {q8},[r2],r12 @ load [rotated] I[i+2] veor q2,q2,q6 moveq r12,#0 @ is it time to zero r12? veor q1,q1,q5 vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 vld1.64 {q9},[r2],r12 @ load [rotated] I[i+3] #ifndef __ARMEB__ vrev64.8 q8,q8 #endif veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction #ifndef __ARMEB__ vrev64.8 q9,q9 #endif vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl vext.8 q7,q9,q9,#8 vext.8 q3,q8,q8,#8 veor q0,q1,q10 .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 veor q3,q3,q2 @ accumulate q3 early vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q3,q3,q10 veor q9,q9,q7 @ Karatsuba pre-processing veor q3,q3,q0 .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 bhs .Loop_mod2x_v8 @ there was at least 32 more bytes veor q2,q2,q10 vext.8 q3,q8,q8,#8 @ re-construct q3 adds r3,r3,#32 @ re-construct r3 veor q0,q0,q2 @ re-construct q0 beq .Ldone_v8 @ is r3 zero? .Lodd_tail_v8: vext.8 q10,q0,q0,#8 veor q3,q3,q0 @ inp^=Xi veor q9,q8,q10 @ q9 is rotated inp^Xi .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo veor q9,q9,q3 @ Karatsuba pre-processing .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) vext.8 q9,q0,q2,#8 @ Karatsuba post-processing veor q10,q0,q2 veor q1,q1,q9 veor q1,q1,q10 .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction vmov d4,d3 @ Xh|Xm - 256-bit result vmov d3,d0 @ Xm is rotated Xl veor q0,q1,q10 vext.8 q10,q0,q0,#8 @ 2nd phase of reduction .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 veor q10,q10,q2 veor q0,q0,q10 .Ldone_v8: #ifndef __ARMEB__ vrev64.8 q0,q0 #endif vext.8 q0,q0,q0,#8 vst1.64 {q0},[r0] @ write out Xi vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so bx lr .size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/ghashv8-armx-linux64.S000064400000000000000000000156001353224260600173560ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) #include .text .arch armv8-a+crypto .globl GFp_gcm_init_clmul .hidden GFp_gcm_init_clmul .type GFp_gcm_init_clmul,%function .align 4 GFp_gcm_init_clmul: ld1 {v17.2d},[x1] //load input H movi v19.16b,#0xe1 shl v19.2d,v19.2d,#57 //0xc2.0 ext v3.16b,v17.16b,v17.16b,#8 ushr v18.2d,v19.2d,#63 dup v17.4s,v17.s[1] ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 ushr v18.2d,v3.2d,#63 sshr v17.4s,v17.4s,#31 //broadcast carry bit and v18.16b,v18.16b,v16.16b shl v3.2d,v3.2d,#1 ext v18.16b,v18.16b,v18.16b,#8 and v16.16b,v16.16b,v17.16b orr v3.16b,v3.16b,v18.16b //H<<<=1 eor v20.16b,v3.16b,v16.16b //twisted H st1 {v20.2d},[x0],#16 //store Htable[0] //calculate H^2 ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing pmull v0.1q,v20.1d,v20.1d eor v16.16b,v16.16b,v20.16b pmull2 v2.1q,v20.2d,v20.2d pmull v1.1q,v16.1d,v16.1d ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v22.16b,v0.16b,v18.16b ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing eor v17.16b,v17.16b,v22.16b ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed st1 {v21.2d,v22.2d},[x0] //store Htable[1..2] ret .size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul .globl GFp_gcm_gmult_clmul .hidden GFp_gcm_gmult_clmul .type GFp_gcm_gmult_clmul,%function .align 4 GFp_gcm_gmult_clmul: ld1 {v17.2d},[x0] //load Xi movi v19.16b,#0xe1 ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... shl v19.2d,v19.2d,#57 #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ext v3.16b,v17.16b,v17.16b,#8 pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v0.16b,v0.16b,v18.16b #ifndef __ARMEB__ rev64 v0.16b,v0.16b #endif ext v0.16b,v0.16b,v0.16b,#8 st1 {v0.2d},[x0] //write out Xi ret .size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul .globl GFp_gcm_ghash_clmul .hidden GFp_gcm_ghash_clmul .type GFp_gcm_ghash_clmul,%function .align 4 GFp_gcm_ghash_clmul: ld1 {v0.2d},[x0] //load [rotated] Xi //"[rotated]" means that //loaded value would have //to be rotated in order to //make it appear as in //algorithm specification subs x3,x3,#32 //see if x3 is 32 or larger mov x12,#16 //x12 is used as post- //increment for input pointer; //as loop is modulo-scheduled //x12 is zeroed just in time //to preclude overstepping //inp[len], which means that //last block[s] are actually //loaded twice, but last //copy is not processed ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 movi v19.16b,#0xe1 ld1 {v22.2d},[x1] csel x12,xzr,x12,eq //is it time to zero x12? ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi ld1 {v16.2d},[x2],#16 //load [rotated] I[0] shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant #ifndef __ARMEB__ rev64 v16.16b,v16.16b rev64 v0.16b,v0.16b #endif ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] b.lo .Lodd_tail_v8 //x3 was less than 32 ld1 {v17.2d},[x2],x12 //load [rotated] I[1] #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ext v7.16b,v17.16b,v17.16b,#8 eor v3.16b,v3.16b,v0.16b //I[i]^=Xi pmull v4.1q,v20.1d,v7.1d //H·Ii+1 eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing pmull2 v6.1q,v20.2d,v7.2d b .Loop_mod2x_v8 .align 4 .Loop_mod2x_v8: ext v18.16b,v3.16b,v3.16b,#8 subs x3,x3,#32 //is there more data? pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo csel x12,xzr,x12,lo //is it time to zero x12? pmull v5.1q,v21.1d,v17.1d eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi eor v0.16b,v0.16b,v4.16b //accumulate pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] eor v2.16b,v2.16b,v6.16b csel x12,xzr,x12,eq //is it time to zero x12? eor v1.16b,v1.16b,v5.16b ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] #ifndef __ARMEB__ rev64 v16.16b,v16.16b #endif eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction #ifndef __ARMEB__ rev64 v17.16b,v17.16b #endif ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] ext v7.16b,v17.16b,v17.16b,#8 ext v3.16b,v16.16b,v16.16b,#8 eor v0.16b,v1.16b,v18.16b pmull v4.1q,v20.1d,v7.1d //H·Ii+1 eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v3.16b,v3.16b,v18.16b eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing eor v3.16b,v3.16b,v0.16b pmull2 v6.1q,v20.2d,v7.2d b.hs .Loop_mod2x_v8 //there was at least 32 more bytes eor v2.16b,v2.16b,v18.16b ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b adds x3,x3,#32 //re-construct x3 eor v0.16b,v0.16b,v2.16b //re-construct v0.16b b.eq .Ldone_v8 //is x3 zero? .Lodd_tail_v8: ext v18.16b,v0.16b,v0.16b,#8 eor v3.16b,v3.16b,v0.16b //inp^=Xi eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing eor v18.16b,v0.16b,v2.16b eor v1.16b,v1.16b,v17.16b eor v1.16b,v1.16b,v18.16b pmull v18.1q,v0.1d,v19.1d //1st phase of reduction ins v2.d[0],v1.d[1] ins v1.d[1],v0.d[0] eor v0.16b,v1.16b,v18.16b ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction pmull v0.1q,v0.1d,v19.1d eor v18.16b,v18.16b,v2.16b eor v0.16b,v0.16b,v18.16b .Ldone_v8: #ifndef __ARMEB__ rev64 v0.16b,v0.16b #endif ext v0.16b,v0.16b,v0.16b,#8 st1 {v0.2d},[x0] //write out Xi ret .size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/p256-x86_64-asm-elf.S000064400000000000000000002305421353224260400165060ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .align 64 .Lpoly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 .LOne: .long 1,1,1,1,1,1,1,1 .LTwo: .long 2,2,2,2,2,2,2,2 .LThree: .long 3,3,3,3,3,3,3,3 .LONE_mont: .quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe .Lord: .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 .LordK: .quad 0xccd1c8aaee00bc4f .globl GFp_nistz256_add .hidden GFp_nistz256_add .type GFp_nistz256_add,@function .align 32 GFp_nistz256_add: pushq %r12 pushq %r13 movq 0(%rsi),%r8 xorq %r13,%r13 movq 8(%rsi),%r9 movq 16(%rsi),%r10 movq 24(%rsi),%r11 leaq .Lpoly(%rip),%rsi addq 0(%rdx),%r8 adcq 8(%rdx),%r9 movq %r8,%rax adcq 16(%rdx),%r10 adcq 24(%rdx),%r11 movq %r9,%rdx adcq $0,%r13 subq 0(%rsi),%r8 movq %r10,%rcx sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r12 sbbq 24(%rsi),%r11 sbbq $0,%r13 cmovcq %rax,%r8 cmovcq %rdx,%r9 movq %r8,0(%rdi) cmovcq %rcx,%r10 movq %r9,8(%rdi) cmovcq %r12,%r11 movq %r10,16(%rdi) movq %r11,24(%rdi) popq %r13 popq %r12 .byte 0xf3,0xc3 .size GFp_nistz256_add,.-GFp_nistz256_add .globl GFp_nistz256_neg .hidden GFp_nistz256_neg .type GFp_nistz256_neg,@function .align 32 GFp_nistz256_neg: .cfi_startproc pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-16 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-24 .Lneg_body: xorq %r8,%r8 xorq %r9,%r9 xorq %r10,%r10 xorq %r11,%r11 xorq %r13,%r13 subq 0(%rsi),%r8 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r8,%rax sbbq 24(%rsi),%r11 leaq .Lpoly(%rip),%rsi movq %r9,%rdx sbbq $0,%r13 addq 0(%rsi),%r8 movq %r10,%rcx adcq 8(%rsi),%r9 adcq 16(%rsi),%r10 movq %r11,%r12 adcq 24(%rsi),%r11 testq %r13,%r13 cmovzq %rax,%r8 cmovzq %rdx,%r9 movq %r8,0(%rdi) cmovzq %rcx,%r10 movq %r9,8(%rdi) cmovzq %r12,%r11 movq %r10,16(%rdi) movq %r11,24(%rdi) movq 0(%rsp),%r13 .cfi_restore %r13 movq 8(%rsp),%r12 .cfi_restore %r12 leaq 16(%rsp),%rsp .cfi_adjust_cfa_offset -16 .Lneg_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_neg,.-GFp_nistz256_neg .globl GFp_p256_scalar_mul_mont .hidden GFp_p256_scalar_mul_mont .type GFp_p256_scalar_mul_mont,@function .align 32 GFp_p256_scalar_mul_mont: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je .Lecp_nistz256_ord_mul_montx pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lord_mul_body: movq 0(%rdx),%rax movq %rdx,%rbx leaq .Lord(%rip),%r14 movq .LordK(%rip),%r15 movq %rax,%rcx mulq 0(%rsi) movq %rax,%r8 movq %rcx,%rax movq %rdx,%r9 mulq 8(%rsi) addq %rax,%r9 movq %rcx,%rax adcq $0,%rdx movq %rdx,%r10 mulq 16(%rsi) addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %r8,%r13 imulq %r15,%r8 movq %rdx,%r11 mulq 24(%rsi) addq %rax,%r11 movq %r8,%rax adcq $0,%rdx movq %rdx,%r12 mulq 0(%r14) movq %r8,%rbp addq %rax,%r13 movq %r8,%rax adcq $0,%rdx movq %rdx,%rcx subq %r8,%r10 sbbq $0,%r8 mulq 8(%r14) addq %rcx,%r9 adcq $0,%rdx addq %rax,%r9 movq %rbp,%rax adcq %rdx,%r10 movq %rbp,%rdx adcq $0,%r8 shlq $32,%rax shrq $32,%rdx subq %rax,%r11 movq 8(%rbx),%rax sbbq %rdx,%rbp addq %r8,%r11 adcq %rbp,%r12 adcq $0,%r13 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r9 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r10 adcq $0,%rdx addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r11 adcq $0,%rdx addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %r9,%rcx imulq %r15,%r9 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r12 adcq $0,%rdx xorq %r8,%r8 addq %rax,%r12 movq %r9,%rax adcq %rdx,%r13 adcq $0,%r8 mulq 0(%r14) movq %r9,%rbp addq %rax,%rcx movq %r9,%rax adcq %rdx,%rcx subq %r9,%r11 sbbq $0,%r9 mulq 8(%r14) addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %rbp,%rax adcq %rdx,%r11 movq %rbp,%rdx adcq $0,%r9 shlq $32,%rax shrq $32,%rdx subq %rax,%r12 movq 16(%rbx),%rax sbbq %rdx,%rbp addq %r9,%r12 adcq %rbp,%r13 adcq $0,%r8 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r11 adcq $0,%rdx addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r12 adcq $0,%rdx addq %rax,%r12 movq %rcx,%rax adcq $0,%rdx movq %r10,%rcx imulq %r15,%r10 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r13 adcq $0,%rdx xorq %r9,%r9 addq %rax,%r13 movq %r10,%rax adcq %rdx,%r8 adcq $0,%r9 mulq 0(%r14) movq %r10,%rbp addq %rax,%rcx movq %r10,%rax adcq %rdx,%rcx subq %r10,%r12 sbbq $0,%r10 mulq 8(%r14) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq %rdx,%r12 movq %rbp,%rdx adcq $0,%r10 shlq $32,%rax shrq $32,%rdx subq %rax,%r13 movq 24(%rbx),%rax sbbq %rdx,%rbp addq %r10,%r13 adcq %rbp,%r8 adcq $0,%r9 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r12 adcq $0,%rdx addq %rax,%r12 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r13 adcq $0,%rdx addq %rax,%r13 movq %rcx,%rax adcq $0,%rdx movq %r11,%rcx imulq %r15,%r11 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r8 adcq $0,%rdx xorq %r10,%r10 addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 adcq $0,%r10 mulq 0(%r14) movq %r11,%rbp addq %rax,%rcx movq %r11,%rax adcq %rdx,%rcx subq %r11,%r13 sbbq $0,%r11 mulq 8(%r14) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq %rdx,%r13 movq %rbp,%rdx adcq $0,%r11 shlq $32,%rax shrq $32,%rdx subq %rax,%r8 sbbq %rdx,%rbp addq %r11,%r8 adcq %rbp,%r9 adcq $0,%r10 movq %r12,%rsi subq 0(%r14),%r12 movq %r13,%r11 sbbq 8(%r14),%r13 movq %r8,%rcx sbbq 16(%r14),%r8 movq %r9,%rbp sbbq 24(%r14),%r9 sbbq $0,%r10 cmovcq %rsi,%r12 cmovcq %r11,%r13 cmovcq %rcx,%r8 cmovcq %rbp,%r9 movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_mul_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_p256_scalar_mul_mont,.-GFp_p256_scalar_mul_mont .globl GFp_p256_scalar_sqr_rep_mont .hidden GFp_p256_scalar_sqr_rep_mont .type GFp_p256_scalar_sqr_rep_mont,@function .align 32 GFp_p256_scalar_sqr_rep_mont: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je .Lecp_nistz256_ord_sqr_montx pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lord_sqr_body: movq 0(%rsi),%r8 movq 8(%rsi),%rax movq 16(%rsi),%r14 movq 24(%rsi),%r15 leaq .Lord(%rip),%rsi movq %rdx,%rbx jmp .Loop_ord_sqr .align 32 .Loop_ord_sqr: movq %rax,%rbp mulq %r8 movq %rax,%r9 .byte 102,72,15,110,205 movq %r14,%rax movq %rdx,%r10 mulq %r8 addq %rax,%r10 movq %r15,%rax .byte 102,73,15,110,214 adcq $0,%rdx movq %rdx,%r11 mulq %r8 addq %rax,%r11 movq %r15,%rax .byte 102,73,15,110,223 adcq $0,%rdx movq %rdx,%r12 mulq %r14 movq %rax,%r13 movq %r14,%rax movq %rdx,%r14 mulq %rbp addq %rax,%r11 movq %r15,%rax adcq $0,%rdx movq %rdx,%r15 mulq %rbp addq %rax,%r12 adcq $0,%rdx addq %r15,%r12 adcq %rdx,%r13 adcq $0,%r14 xorq %r15,%r15 movq %r8,%rax addq %r9,%r9 adcq %r10,%r10 adcq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 adcq %r14,%r14 adcq $0,%r15 mulq %rax movq %rax,%r8 .byte 102,72,15,126,200 movq %rdx,%rbp mulq %rax addq %rbp,%r9 adcq %rax,%r10 .byte 102,72,15,126,208 adcq $0,%rdx movq %rdx,%rbp mulq %rax addq %rbp,%r11 adcq %rax,%r12 .byte 102,72,15,126,216 adcq $0,%rdx movq %rdx,%rbp movq %r8,%rcx imulq 32(%rsi),%r8 mulq %rax addq %rbp,%r13 adcq %rax,%r14 movq 0(%rsi),%rax adcq %rdx,%r15 mulq %r8 movq %r8,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r8,%r10 sbbq $0,%rbp mulq %r8 addq %rcx,%r9 adcq $0,%rdx addq %rax,%r9 movq %r8,%rax adcq %rdx,%r10 movq %r8,%rdx adcq $0,%rbp movq %r9,%rcx imulq 32(%rsi),%r9 shlq $32,%rax shrq $32,%rdx subq %rax,%r11 movq 0(%rsi),%rax sbbq %rdx,%r8 addq %rbp,%r11 adcq $0,%r8 mulq %r9 movq %r9,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r9,%r11 sbbq $0,%rbp mulq %r9 addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %r9,%rax adcq %rdx,%r11 movq %r9,%rdx adcq $0,%rbp movq %r10,%rcx imulq 32(%rsi),%r10 shlq $32,%rax shrq $32,%rdx subq %rax,%r8 movq 0(%rsi),%rax sbbq %rdx,%r9 addq %rbp,%r8 adcq $0,%r9 mulq %r10 movq %r10,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r10,%r8 sbbq $0,%rbp mulq %r10 addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %r10,%rax adcq %rdx,%r8 movq %r10,%rdx adcq $0,%rbp movq %r11,%rcx imulq 32(%rsi),%r11 shlq $32,%rax shrq $32,%rdx subq %rax,%r9 movq 0(%rsi),%rax sbbq %rdx,%r10 addq %rbp,%r9 adcq $0,%r10 mulq %r11 movq %r11,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r11,%r9 sbbq $0,%rbp mulq %r11 addq %rcx,%r8 adcq $0,%rdx addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 movq %r11,%rdx adcq $0,%rbp shlq $32,%rax shrq $32,%rdx subq %rax,%r10 sbbq %rdx,%r11 addq %rbp,%r10 adcq $0,%r11 xorq %rdx,%rdx addq %r12,%r8 adcq %r13,%r9 movq %r8,%r12 adcq %r14,%r10 adcq %r15,%r11 movq %r9,%rax adcq $0,%rdx subq 0(%rsi),%r8 movq %r10,%r14 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r15 sbbq 24(%rsi),%r11 sbbq $0,%rdx cmovcq %r12,%r8 cmovncq %r9,%rax cmovncq %r10,%r14 cmovncq %r11,%r15 decq %rbx jnz .Loop_ord_sqr movq %r8,0(%rdi) movq %rax,8(%rdi) pxor %xmm1,%xmm1 movq %r14,16(%rdi) pxor %xmm2,%xmm2 movq %r15,24(%rdi) pxor %xmm3,%xmm3 movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_sqr_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_p256_scalar_sqr_rep_mont,.-GFp_p256_scalar_sqr_rep_mont .type ecp_nistz256_ord_mul_montx,@function .align 32 ecp_nistz256_ord_mul_montx: .cfi_startproc .Lecp_nistz256_ord_mul_montx: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lord_mulx_body: movq %rdx,%rbx movq 0(%rdx),%rdx movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 leaq -128(%rsi),%rsi leaq .Lord-128(%rip),%r14 movq .LordK(%rip),%r15 mulxq %r9,%r8,%r9 mulxq %r10,%rcx,%r10 mulxq %r11,%rbp,%r11 addq %rcx,%r9 mulxq %r12,%rcx,%r12 movq %r8,%rdx mulxq %r15,%rdx,%rax adcq %rbp,%r10 adcq %rcx,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 24+128(%r14),%rcx,%rbp movq 8(%rbx),%rdx adcxq %rcx,%r11 adoxq %rbp,%r12 adcxq %r8,%r12 adoxq %r8,%r13 adcq $0,%r13 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%rsi),%rcx,%rbp movq %r9,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r12 adoxq %rbp,%r13 adcxq %r8,%r13 adoxq %r8,%r8 adcq $0,%r8 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%r14),%rcx,%rbp movq 16(%rbx),%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcxq %r9,%r13 adoxq %r9,%r8 adcq $0,%r8 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%rsi),%rcx,%rbp movq %r10,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r13 adoxq %rbp,%r8 adcxq %r9,%r8 adoxq %r9,%r9 adcq $0,%r9 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%r14),%rcx,%rbp movq 24(%rbx),%rdx adcxq %rcx,%r13 adoxq %rbp,%r8 adcxq %r10,%r8 adoxq %r10,%r9 adcq $0,%r9 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%rsi),%rcx,%rbp movq %r11,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r8 adoxq %rbp,%r9 adcxq %r10,%r9 adoxq %r10,%r10 adcq $0,%r10 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%r14),%rcx,%rbp leaq 128(%r14),%r14 movq %r12,%rbx adcxq %rcx,%r8 adoxq %rbp,%r9 movq %r13,%rdx adcxq %r11,%r9 adoxq %r11,%r10 adcq $0,%r10 movq %r8,%rcx subq 0(%r14),%r12 sbbq 8(%r14),%r13 sbbq 16(%r14),%r8 movq %r9,%rbp sbbq 24(%r14),%r9 sbbq $0,%r10 cmovcq %rbx,%r12 cmovcq %rdx,%r13 cmovcq %rcx,%r8 cmovcq %rbp,%r9 movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_mulx_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size ecp_nistz256_ord_mul_montx,.-ecp_nistz256_ord_mul_montx .type ecp_nistz256_ord_sqr_montx,@function .align 32 ecp_nistz256_ord_sqr_montx: .cfi_startproc .Lecp_nistz256_ord_sqr_montx: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lord_sqrx_body: movq %rdx,%rbx movq 0(%rsi),%rdx movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 leaq .Lord(%rip),%rsi jmp .Loop_ord_sqrx .align 32 .Loop_ord_sqrx: mulxq %r14,%r9,%r10 mulxq %r15,%rcx,%r11 movq %rdx,%rax .byte 102,73,15,110,206 mulxq %r8,%rbp,%r12 movq %r14,%rdx addq %rcx,%r10 .byte 102,73,15,110,215 adcq %rbp,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq %r15,%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq %r8,%rcx,%rbp movq %r15,%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcq $0,%r13 mulxq %r8,%rcx,%r14 movq %rax,%rdx .byte 102,73,15,110,216 xorq %r15,%r15 adcxq %r9,%r9 adoxq %rcx,%r13 adcxq %r10,%r10 adoxq %r15,%r14 mulxq %rdx,%r8,%rbp .byte 102,72,15,126,202 adcxq %r11,%r11 adoxq %rbp,%r9 adcxq %r12,%r12 mulxq %rdx,%rcx,%rax .byte 102,72,15,126,210 adcxq %r13,%r13 adoxq %rcx,%r10 adcxq %r14,%r14 mulxq %rdx,%rcx,%rbp .byte 0x67 .byte 102,72,15,126,218 adoxq %rax,%r11 adcxq %r15,%r15 adoxq %rcx,%r12 adoxq %rbp,%r13 mulxq %rdx,%rcx,%rax adoxq %rcx,%r14 adoxq %rax,%r15 movq %r8,%rdx mulxq 32(%rsi),%rdx,%rcx xorq %rax,%rax mulxq 0(%rsi),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 8(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 16(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 24(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r8 adcxq %rax,%r8 movq %r9,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adoxq %rcx,%r9 adcxq %rbp,%r10 mulxq 8(%rsi),%rcx,%rbp adoxq %rcx,%r10 adcxq %rbp,%r11 mulxq 16(%rsi),%rcx,%rbp adoxq %rcx,%r11 adcxq %rbp,%r8 mulxq 24(%rsi),%rcx,%rbp adoxq %rcx,%r8 adcxq %rbp,%r9 adoxq %rax,%r9 movq %r10,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r8 mulxq 16(%rsi),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 24(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 adcxq %rax,%r10 movq %r11,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adoxq %rcx,%r11 adcxq %rbp,%r8 mulxq 8(%rsi),%rcx,%rbp adoxq %rcx,%r8 adcxq %rbp,%r9 mulxq 16(%rsi),%rcx,%rbp adoxq %rcx,%r9 adcxq %rbp,%r10 mulxq 24(%rsi),%rcx,%rbp adoxq %rcx,%r10 adcxq %rbp,%r11 adoxq %rax,%r11 addq %r8,%r12 adcq %r13,%r9 movq %r12,%rdx adcq %r14,%r10 adcq %r15,%r11 movq %r9,%r14 adcq $0,%rax subq 0(%rsi),%r12 movq %r10,%r15 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r8 sbbq 24(%rsi),%r11 sbbq $0,%rax cmovncq %r12,%rdx cmovncq %r9,%r14 cmovncq %r10,%r15 cmovncq %r11,%r8 decq %rbx jnz .Loop_ord_sqrx movq %rdx,0(%rdi) movq %r14,8(%rdi) pxor %xmm1,%xmm1 movq %r15,16(%rdi) pxor %xmm2,%xmm2 movq %r8,24(%rdi) pxor %xmm3,%xmm3 movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lord_sqrx_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size ecp_nistz256_ord_sqr_montx,.-ecp_nistz256_ord_sqr_montx .globl GFp_nistz256_mul_mont .hidden GFp_nistz256_mul_mont .type GFp_nistz256_mul_mont,@function .align 32 GFp_nistz256_mul_mont: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx .Lmul_mont: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lmul_body: cmpl $0x80100,%ecx je .Lmul_montx movq %rdx,%rbx movq 0(%rdx),%rax movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 call __ecp_nistz256_mul_montq jmp .Lmul_mont_done .align 32 .Lmul_montx: movq %rdx,%rbx movq 0(%rdx),%rdx movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 leaq -128(%rsi),%rsi call __ecp_nistz256_mul_montx .Lmul_mont_done: movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lmul_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont .type __ecp_nistz256_mul_montq,@function .align 32 __ecp_nistz256_mul_montq: .cfi_startproc movq %rax,%rbp mulq %r9 movq .Lpoly+8(%rip),%r14 movq %rax,%r8 movq %rbp,%rax movq %rdx,%r9 mulq %r10 movq .Lpoly+24(%rip),%r15 addq %rax,%r9 movq %rbp,%rax adcq $0,%rdx movq %rdx,%r10 mulq %r11 addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%r11 mulq %r12 addq %rax,%r11 movq %r8,%rax adcq $0,%rdx xorq %r13,%r13 movq %rdx,%r12 movq %r8,%rbp shlq $32,%r8 mulq %r15 shrq $32,%rbp addq %r8,%r9 adcq %rbp,%r10 adcq %rax,%r11 movq 8(%rbx),%rax adcq %rdx,%r12 adcq $0,%r13 xorq %r8,%r8 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r9 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %r9,%rax adcq %rdx,%r13 adcq $0,%r8 movq %r9,%rbp shlq $32,%r9 mulq %r15 shrq $32,%rbp addq %r9,%r10 adcq %rbp,%r11 adcq %rax,%r12 movq 16(%rbx),%rax adcq %rdx,%r13 adcq $0,%r8 xorq %r9,%r9 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r13 adcq $0,%rdx addq %rax,%r13 movq %r10,%rax adcq %rdx,%r8 adcq $0,%r9 movq %r10,%rbp shlq $32,%r10 mulq %r15 shrq $32,%rbp addq %r10,%r11 adcq %rbp,%r12 adcq %rax,%r13 movq 24(%rbx),%rax adcq %rdx,%r8 adcq $0,%r9 xorq %r10,%r10 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r13 adcq $0,%rdx addq %rax,%r13 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r8 adcq $0,%rdx addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 adcq $0,%r10 movq %r11,%rbp shlq $32,%r11 mulq %r15 shrq $32,%rbp addq %r11,%r12 adcq %rbp,%r13 movq %r12,%rcx adcq %rax,%r8 adcq %rdx,%r9 movq %r13,%rbp adcq $0,%r10 subq $-1,%r12 movq %r8,%rbx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%rdx sbbq %r15,%r9 sbbq $0,%r10 cmovcq %rcx,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rbx,%r8 movq %r13,8(%rdi) cmovcq %rdx,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq .globl GFp_nistz256_sqr_mont .hidden GFp_nistz256_sqr_mont .type GFp_nistz256_sqr_mont,@function .align 32 GFp_nistz256_sqr_mont: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 .Lsqr_body: cmpl $0x80100,%ecx je .Lsqr_montx movq 0(%rsi),%rax movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 call __ecp_nistz256_sqr_montq jmp .Lsqr_mont_done .align 32 .Lsqr_montx: movq 0(%rsi),%rdx movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 leaq -128(%rsi),%rsi call __ecp_nistz256_sqr_montx .Lsqr_mont_done: movq 0(%rsp),%r15 .cfi_restore %r15 movq 8(%rsp),%r14 .cfi_restore %r14 movq 16(%rsp),%r13 .cfi_restore %r13 movq 24(%rsp),%r12 .cfi_restore %r12 movq 32(%rsp),%rbx .cfi_restore %rbx movq 40(%rsp),%rbp .cfi_restore %rbp leaq 48(%rsp),%rsp .cfi_adjust_cfa_offset -48 .Lsqr_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont .type __ecp_nistz256_sqr_montq,@function .align 32 __ecp_nistz256_sqr_montq: .cfi_startproc movq %rax,%r13 mulq %r14 movq %rax,%r9 movq %r15,%rax movq %rdx,%r10 mulq %r13 addq %rax,%r10 movq %r8,%rax adcq $0,%rdx movq %rdx,%r11 mulq %r13 addq %rax,%r11 movq %r15,%rax adcq $0,%rdx movq %rdx,%r12 mulq %r14 addq %rax,%r11 movq %r8,%rax adcq $0,%rdx movq %rdx,%rbp mulq %r14 addq %rax,%r12 movq %r8,%rax adcq $0,%rdx addq %rbp,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %r15 xorq %r15,%r15 addq %rax,%r13 movq 0(%rsi),%rax movq %rdx,%r14 adcq $0,%r14 addq %r9,%r9 adcq %r10,%r10 adcq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 adcq %r14,%r14 adcq $0,%r15 mulq %rax movq %rax,%r8 movq 8(%rsi),%rax movq %rdx,%rcx mulq %rax addq %rcx,%r9 adcq %rax,%r10 movq 16(%rsi),%rax adcq $0,%rdx movq %rdx,%rcx mulq %rax addq %rcx,%r11 adcq %rax,%r12 movq 24(%rsi),%rax adcq $0,%rdx movq %rdx,%rcx mulq %rax addq %rcx,%r13 adcq %rax,%r14 movq %r8,%rax adcq %rdx,%r15 movq .Lpoly+8(%rip),%rsi movq .Lpoly+24(%rip),%rbp movq %r8,%rcx shlq $32,%r8 mulq %rbp shrq $32,%rcx addq %r8,%r9 adcq %rcx,%r10 adcq %rax,%r11 movq %r9,%rax adcq $0,%rdx movq %r9,%rcx shlq $32,%r9 movq %rdx,%r8 mulq %rbp shrq $32,%rcx addq %r9,%r10 adcq %rcx,%r11 adcq %rax,%r8 movq %r10,%rax adcq $0,%rdx movq %r10,%rcx shlq $32,%r10 movq %rdx,%r9 mulq %rbp shrq $32,%rcx addq %r10,%r11 adcq %rcx,%r8 adcq %rax,%r9 movq %r11,%rax adcq $0,%rdx movq %r11,%rcx shlq $32,%r11 movq %rdx,%r10 mulq %rbp shrq $32,%rcx addq %r11,%r8 adcq %rcx,%r9 adcq %rax,%r10 adcq $0,%rdx xorq %r11,%r11 addq %r8,%r12 adcq %r9,%r13 movq %r12,%r8 adcq %r10,%r14 adcq %rdx,%r15 movq %r13,%r9 adcq $0,%r11 subq $-1,%r12 movq %r14,%r10 sbbq %rsi,%r13 sbbq $0,%r14 movq %r15,%rcx sbbq %rbp,%r15 sbbq $0,%r11 cmovcq %r8,%r12 cmovcq %r9,%r13 movq %r12,0(%rdi) cmovcq %r10,%r14 movq %r13,8(%rdi) cmovcq %rcx,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq .type __ecp_nistz256_mul_montx,@function .align 32 __ecp_nistz256_mul_montx: .cfi_startproc mulxq %r9,%r8,%r9 mulxq %r10,%rcx,%r10 movq $32,%r14 xorq %r13,%r13 mulxq %r11,%rbp,%r11 movq .Lpoly+24(%rip),%r15 adcq %rcx,%r9 mulxq %r12,%rcx,%r12 movq %r8,%rdx adcq %rbp,%r10 shlxq %r14,%r8,%rbp adcq %rcx,%r11 shrxq %r14,%r8,%rcx adcq $0,%r12 addq %rbp,%r9 adcq %rcx,%r10 mulxq %r15,%rcx,%rbp movq 8(%rbx),%rdx adcq %rcx,%r11 adcq %rbp,%r12 adcq $0,%r13 xorq %r8,%r8 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%rsi),%rcx,%rbp movq %r9,%rdx adcxq %rcx,%r12 shlxq %r14,%r9,%rcx adoxq %rbp,%r13 shrxq %r14,%r9,%rbp adcxq %r8,%r13 adoxq %r8,%r8 adcq $0,%r8 addq %rcx,%r10 adcq %rbp,%r11 mulxq %r15,%rcx,%rbp movq 16(%rbx),%rdx adcq %rcx,%r12 adcq %rbp,%r13 adcq $0,%r8 xorq %r9,%r9 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%rsi),%rcx,%rbp movq %r10,%rdx adcxq %rcx,%r13 shlxq %r14,%r10,%rcx adoxq %rbp,%r8 shrxq %r14,%r10,%rbp adcxq %r9,%r8 adoxq %r9,%r9 adcq $0,%r9 addq %rcx,%r11 adcq %rbp,%r12 mulxq %r15,%rcx,%rbp movq 24(%rbx),%rdx adcq %rcx,%r13 adcq %rbp,%r8 adcq $0,%r9 xorq %r10,%r10 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%rsi),%rcx,%rbp movq %r11,%rdx adcxq %rcx,%r8 shlxq %r14,%r11,%rcx adoxq %rbp,%r9 shrxq %r14,%r11,%rbp adcxq %r10,%r9 adoxq %r10,%r10 adcq $0,%r10 addq %rcx,%r12 adcq %rbp,%r13 mulxq %r15,%rcx,%rbp movq %r12,%rbx movq .Lpoly+8(%rip),%r14 adcq %rcx,%r8 movq %r13,%rdx adcq %rbp,%r9 adcq $0,%r10 xorl %eax,%eax movq %r8,%rcx sbbq $-1,%r12 sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%rbp sbbq %r15,%r9 sbbq $0,%r10 cmovcq %rbx,%r12 cmovcq %rdx,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %rbp,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_mul_montx,.-__ecp_nistz256_mul_montx .type __ecp_nistz256_sqr_montx,@function .align 32 __ecp_nistz256_sqr_montx: .cfi_startproc mulxq %r14,%r9,%r10 mulxq %r15,%rcx,%r11 xorl %eax,%eax adcq %rcx,%r10 mulxq %r8,%rbp,%r12 movq %r14,%rdx adcq %rbp,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq %r15,%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq %r8,%rcx,%rbp movq %r15,%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcq $0,%r13 mulxq %r8,%rcx,%r14 movq 0+128(%rsi),%rdx xorq %r15,%r15 adcxq %r9,%r9 adoxq %rcx,%r13 adcxq %r10,%r10 adoxq %r15,%r14 mulxq %rdx,%r8,%rbp movq 8+128(%rsi),%rdx adcxq %r11,%r11 adoxq %rbp,%r9 adcxq %r12,%r12 mulxq %rdx,%rcx,%rax movq 16+128(%rsi),%rdx adcxq %r13,%r13 adoxq %rcx,%r10 adcxq %r14,%r14 .byte 0x67 mulxq %rdx,%rcx,%rbp movq 24+128(%rsi),%rdx adoxq %rax,%r11 adcxq %r15,%r15 adoxq %rcx,%r12 movq $32,%rsi adoxq %rbp,%r13 .byte 0x67,0x67 mulxq %rdx,%rcx,%rax movq .Lpoly+24(%rip),%rdx adoxq %rcx,%r14 shlxq %rsi,%r8,%rcx adoxq %rax,%r15 shrxq %rsi,%r8,%rax movq %rdx,%rbp addq %rcx,%r9 adcq %rax,%r10 mulxq %r8,%rcx,%r8 adcq %rcx,%r11 shlxq %rsi,%r9,%rcx adcq $0,%r8 shrxq %rsi,%r9,%rax addq %rcx,%r10 adcq %rax,%r11 mulxq %r9,%rcx,%r9 adcq %rcx,%r8 shlxq %rsi,%r10,%rcx adcq $0,%r9 shrxq %rsi,%r10,%rax addq %rcx,%r11 adcq %rax,%r8 mulxq %r10,%rcx,%r10 adcq %rcx,%r9 shlxq %rsi,%r11,%rcx adcq $0,%r10 shrxq %rsi,%r11,%rax addq %rcx,%r8 adcq %rax,%r9 mulxq %r11,%rcx,%r11 adcq %rcx,%r10 adcq $0,%r11 xorq %rdx,%rdx addq %r8,%r12 movq .Lpoly+8(%rip),%rsi adcq %r9,%r13 movq %r12,%r8 adcq %r10,%r14 adcq %r11,%r15 movq %r13,%r9 adcq $0,%rdx subq $-1,%r12 movq %r14,%r10 sbbq %rsi,%r13 sbbq $0,%r14 movq %r15,%r11 sbbq %rbp,%r15 sbbq $0,%rdx cmovcq %r8,%r12 cmovcq %r9,%r13 movq %r12,0(%rdi) cmovcq %r10,%r14 movq %r13,8(%rdi) cmovcq %r11,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_sqr_montx,.-__ecp_nistz256_sqr_montx .globl GFp_nistz256_select_w5 .hidden GFp_nistz256_select_w5 .type GFp_nistz256_select_w5,@function .align 32 GFp_nistz256_select_w5: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rax movq 8(%rax),%rax testl $32,%eax jnz .Lavx2_select_w5 movdqa .LOne(%rip),%xmm0 movd %edx,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 movdqa %xmm0,%xmm8 pshufd $0,%xmm1,%xmm1 movq $16,%rax .Lselect_loop_sse_w5: movdqa %xmm8,%xmm15 paddd %xmm0,%xmm8 pcmpeqd %xmm1,%xmm15 movdqa 0(%rsi),%xmm9 movdqa 16(%rsi),%xmm10 movdqa 32(%rsi),%xmm11 movdqa 48(%rsi),%xmm12 movdqa 64(%rsi),%xmm13 movdqa 80(%rsi),%xmm14 leaq 96(%rsi),%rsi pand %xmm15,%xmm9 pand %xmm15,%xmm10 por %xmm9,%xmm2 pand %xmm15,%xmm11 por %xmm10,%xmm3 pand %xmm15,%xmm12 por %xmm11,%xmm4 pand %xmm15,%xmm13 por %xmm12,%xmm5 pand %xmm15,%xmm14 por %xmm13,%xmm6 por %xmm14,%xmm7 decq %rax jnz .Lselect_loop_sse_w5 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqu %xmm4,32(%rdi) movdqu %xmm5,48(%rdi) movdqu %xmm6,64(%rdi) movdqu %xmm7,80(%rdi) .byte 0xf3,0xc3 .cfi_endproc .LSEH_end_GFp_nistz256_select_w5: .size GFp_nistz256_select_w5,.-GFp_nistz256_select_w5 .globl GFp_nistz256_select_w7 .hidden GFp_nistz256_select_w7 .type GFp_nistz256_select_w7,@function .align 32 GFp_nistz256_select_w7: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rax movq 8(%rax),%rax testl $32,%eax jnz .Lavx2_select_w7 movdqa .LOne(%rip),%xmm8 movd %edx,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa %xmm8,%xmm0 pshufd $0,%xmm1,%xmm1 movq $64,%rax .Lselect_loop_sse_w7: movdqa %xmm8,%xmm15 paddd %xmm0,%xmm8 movdqa 0(%rsi),%xmm9 movdqa 16(%rsi),%xmm10 pcmpeqd %xmm1,%xmm15 movdqa 32(%rsi),%xmm11 movdqa 48(%rsi),%xmm12 leaq 64(%rsi),%rsi pand %xmm15,%xmm9 pand %xmm15,%xmm10 por %xmm9,%xmm2 pand %xmm15,%xmm11 por %xmm10,%xmm3 pand %xmm15,%xmm12 por %xmm11,%xmm4 prefetcht0 255(%rsi) por %xmm12,%xmm5 decq %rax jnz .Lselect_loop_sse_w7 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqu %xmm4,32(%rdi) movdqu %xmm5,48(%rdi) .byte 0xf3,0xc3 .cfi_endproc .LSEH_end_GFp_nistz256_select_w7: .size GFp_nistz256_select_w7,.-GFp_nistz256_select_w7 .type GFp_nistz256_avx2_select_w5,@function .align 32 GFp_nistz256_avx2_select_w5: .cfi_startproc .Lavx2_select_w5: vzeroupper vmovdqa .LTwo(%rip),%ymm0 vpxor %ymm2,%ymm2,%ymm2 vpxor %ymm3,%ymm3,%ymm3 vpxor %ymm4,%ymm4,%ymm4 vmovdqa .LOne(%rip),%ymm5 vmovdqa .LTwo(%rip),%ymm10 vmovd %edx,%xmm1 vpermd %ymm1,%ymm2,%ymm1 movq $8,%rax .Lselect_loop_avx2_w5: vmovdqa 0(%rsi),%ymm6 vmovdqa 32(%rsi),%ymm7 vmovdqa 64(%rsi),%ymm8 vmovdqa 96(%rsi),%ymm11 vmovdqa 128(%rsi),%ymm12 vmovdqa 160(%rsi),%ymm13 vpcmpeqd %ymm1,%ymm5,%ymm9 vpcmpeqd %ymm1,%ymm10,%ymm14 vpaddd %ymm0,%ymm5,%ymm5 vpaddd %ymm0,%ymm10,%ymm10 leaq 192(%rsi),%rsi vpand %ymm9,%ymm6,%ymm6 vpand %ymm9,%ymm7,%ymm7 vpand %ymm9,%ymm8,%ymm8 vpand %ymm14,%ymm11,%ymm11 vpand %ymm14,%ymm12,%ymm12 vpand %ymm14,%ymm13,%ymm13 vpxor %ymm6,%ymm2,%ymm2 vpxor %ymm7,%ymm3,%ymm3 vpxor %ymm8,%ymm4,%ymm4 vpxor %ymm11,%ymm2,%ymm2 vpxor %ymm12,%ymm3,%ymm3 vpxor %ymm13,%ymm4,%ymm4 decq %rax jnz .Lselect_loop_avx2_w5 vmovdqu %ymm2,0(%rdi) vmovdqu %ymm3,32(%rdi) vmovdqu %ymm4,64(%rdi) vzeroupper .byte 0xf3,0xc3 .cfi_endproc .LSEH_end_GFp_nistz256_avx2_select_w5: .size GFp_nistz256_avx2_select_w5,.-GFp_nistz256_avx2_select_w5 .globl GFp_nistz256_avx2_select_w7 .hidden GFp_nistz256_avx2_select_w7 .type GFp_nistz256_avx2_select_w7,@function .align 32 GFp_nistz256_avx2_select_w7: .cfi_startproc .Lavx2_select_w7: vzeroupper vmovdqa .LThree(%rip),%ymm0 vpxor %ymm2,%ymm2,%ymm2 vpxor %ymm3,%ymm3,%ymm3 vmovdqa .LOne(%rip),%ymm4 vmovdqa .LTwo(%rip),%ymm8 vmovdqa .LThree(%rip),%ymm12 vmovd %edx,%xmm1 vpermd %ymm1,%ymm2,%ymm1 movq $21,%rax .Lselect_loop_avx2_w7: vmovdqa 0(%rsi),%ymm5 vmovdqa 32(%rsi),%ymm6 vmovdqa 64(%rsi),%ymm9 vmovdqa 96(%rsi),%ymm10 vmovdqa 128(%rsi),%ymm13 vmovdqa 160(%rsi),%ymm14 vpcmpeqd %ymm1,%ymm4,%ymm7 vpcmpeqd %ymm1,%ymm8,%ymm11 vpcmpeqd %ymm1,%ymm12,%ymm15 vpaddd %ymm0,%ymm4,%ymm4 vpaddd %ymm0,%ymm8,%ymm8 vpaddd %ymm0,%ymm12,%ymm12 leaq 192(%rsi),%rsi vpand %ymm7,%ymm5,%ymm5 vpand %ymm7,%ymm6,%ymm6 vpand %ymm11,%ymm9,%ymm9 vpand %ymm11,%ymm10,%ymm10 vpand %ymm15,%ymm13,%ymm13 vpand %ymm15,%ymm14,%ymm14 vpxor %ymm5,%ymm2,%ymm2 vpxor %ymm6,%ymm3,%ymm3 vpxor %ymm9,%ymm2,%ymm2 vpxor %ymm10,%ymm3,%ymm3 vpxor %ymm13,%ymm2,%ymm2 vpxor %ymm14,%ymm3,%ymm3 decq %rax jnz .Lselect_loop_avx2_w7 vmovdqa 0(%rsi),%ymm5 vmovdqa 32(%rsi),%ymm6 vpcmpeqd %ymm1,%ymm4,%ymm7 vpand %ymm7,%ymm5,%ymm5 vpand %ymm7,%ymm6,%ymm6 vpxor %ymm5,%ymm2,%ymm2 vpxor %ymm6,%ymm3,%ymm3 vmovdqu %ymm2,0(%rdi) vmovdqu %ymm3,32(%rdi) vzeroupper .byte 0xf3,0xc3 .cfi_endproc .LSEH_end_GFp_nistz256_avx2_select_w7: .size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 .type __ecp_nistz256_add_toq,@function .align 32 __ecp_nistz256_add_toq: .cfi_startproc xorq %r11,%r11 addq 0(%rbx),%r12 adcq 8(%rbx),%r13 movq %r12,%rax adcq 16(%rbx),%r8 adcq 24(%rbx),%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq .type __ecp_nistz256_sub_fromq,@function .align 32 __ecp_nistz256_sub_fromq: .cfi_startproc subq 0(%rbx),%r12 sbbq 8(%rbx),%r13 movq %r12,%rax sbbq 16(%rbx),%r8 sbbq 24(%rbx),%r9 movq %r13,%rbp sbbq %r11,%r11 addq $-1,%r12 movq %r8,%rcx adcq %r14,%r13 adcq $0,%r8 movq %r9,%r10 adcq %r15,%r9 testq %r11,%r11 cmovzq %rax,%r12 cmovzq %rbp,%r13 movq %r12,0(%rdi) cmovzq %rcx,%r8 movq %r13,8(%rdi) cmovzq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq .type __ecp_nistz256_subq,@function .align 32 __ecp_nistz256_subq: .cfi_startproc subq %r12,%rax sbbq %r13,%rbp movq %rax,%r12 sbbq %r8,%rcx sbbq %r9,%r10 movq %rbp,%r13 sbbq %r11,%r11 addq $-1,%rax movq %rcx,%r8 adcq %r14,%rbp adcq $0,%rcx movq %r10,%r9 adcq %r15,%r10 testq %r11,%r11 cmovnzq %rax,%r12 cmovnzq %rbp,%r13 cmovnzq %rcx,%r8 cmovnzq %r10,%r9 .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_subq,.-__ecp_nistz256_subq .type __ecp_nistz256_mul_by_2q,@function .align 32 __ecp_nistz256_mul_by_2q: .cfi_startproc xorq %r11,%r11 addq %r12,%r12 adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q .globl GFp_nistz256_point_double .hidden GFp_nistz256_point_double .type GFp_nistz256_point_double,@function .align 32 GFp_nistz256_point_double: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je .Lpoint_doublex pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $160+8,%rsp .cfi_adjust_cfa_offset 32*5+8 .Lpoint_doubleq_body: .Lpoint_double_shortcutq: movdqu 0(%rsi),%xmm0 movq %rsi,%rbx movdqu 16(%rsi),%xmm1 movq 32+0(%rsi),%r12 movq 32+8(%rsi),%r13 movq 32+16(%rsi),%r8 movq 32+24(%rsi),%r9 movq .Lpoly+8(%rip),%r14 movq .Lpoly+24(%rip),%r15 movdqa %xmm0,96(%rsp) movdqa %xmm1,96+16(%rsp) leaq 32(%rdi),%r10 leaq 64(%rdi),%r11 .byte 102,72,15,110,199 .byte 102,73,15,110,202 .byte 102,73,15,110,211 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_by_2q movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 leaq 64-0(%rsi),%rsi leaq 64(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 0(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 32(%rbx),%rax movq 64+0(%rbx),%r9 movq 64+8(%rbx),%r10 movq 64+16(%rbx),%r11 movq 64+24(%rbx),%r12 leaq 64-0(%rbx),%rsi leaq 32(%rbx),%rbx .byte 102,72,15,126,215 call __ecp_nistz256_mul_montq call __ecp_nistz256_mul_by_2q movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 32(%rsp),%rdi call __ecp_nistz256_add_toq movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 .byte 102,72,15,126,207 call __ecp_nistz256_sqr_montq xorq %r9,%r9 movq %r12,%rax addq $-1,%r12 movq %r13,%r10 adcq %rsi,%r13 movq %r14,%rcx adcq $0,%r14 movq %r15,%r8 adcq %rbp,%r15 adcq $0,%r9 xorq %rsi,%rsi testq $1,%rax cmovzq %rax,%r12 cmovzq %r10,%r13 cmovzq %rcx,%r14 cmovzq %r8,%r15 cmovzq %rsi,%r9 movq %r13,%rax shrq $1,%r12 shlq $63,%rax movq %r14,%r10 shrq $1,%r13 orq %rax,%r12 shlq $63,%r10 movq %r15,%rcx shrq $1,%r14 orq %r10,%r13 shlq $63,%rcx movq %r12,0(%rdi) shrq $1,%r15 movq %r13,8(%rdi) shlq $63,%r9 orq %rcx,%r14 orq %r9,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) movq 64(%rsp),%rax leaq 64(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2q leaq 32(%rsp),%rbx leaq 32(%rsp),%rdi call __ecp_nistz256_add_toq movq 96(%rsp),%rax leaq 96(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2q movq 0+32(%rsp),%rax movq 8+32(%rsp),%r14 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r15 movq 24+32(%rsp),%r8 .byte 102,72,15,126,199 call __ecp_nistz256_sqr_montq leaq 128(%rsp),%rbx movq %r14,%r8 movq %r15,%r9 movq %rsi,%r14 movq %rbp,%r15 call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 0(%rsp),%rdi call __ecp_nistz256_subq movq 32(%rsp),%rax leaq 32(%rsp),%rbx movq %r12,%r14 xorl %ecx,%ecx movq %r12,0+0(%rsp) movq %r13,%r10 movq %r13,0+8(%rsp) cmovzq %r8,%r11 movq %r8,0+16(%rsp) leaq 0-0(%rsp),%rsi cmovzq %r9,%r12 movq %r9,0+24(%rsp) movq %r14,%r9 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq .byte 102,72,15,126,203 .byte 102,72,15,126,207 call __ecp_nistz256_sub_fromq leaq 160+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_doubleq_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_double,.-GFp_nistz256_point_double .globl GFp_nistz256_point_add .hidden GFp_nistz256_point_add .type GFp_nistz256_point_add,@function .align 32 GFp_nistz256_point_add: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je .Lpoint_addx pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $576+8,%rsp .cfi_adjust_cfa_offset 32*18+8 .Lpoint_addq_body: movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq %rsi,%rbx movq %rdx,%rsi movdqa %xmm0,384(%rsp) movdqa %xmm1,384+16(%rsp) movdqa %xmm2,416(%rsp) movdqa %xmm3,416+16(%rsp) movdqa %xmm4,448(%rsp) movdqa %xmm5,448+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rsi),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 por %xmm3,%xmm5 movdqu 48(%rsi),%xmm3 movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,480(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,480+16(%rsp) movdqu 64(%rsi),%xmm0 movdqu 80(%rsi),%xmm1 movdqa %xmm2,512(%rsp) movdqa %xmm3,512+16(%rsp) por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm0,%xmm1 .byte 102,72,15,110,199 leaq 64-0(%rsi),%rsi movq %rax,544+0(%rsp) movq %r14,544+8(%rsp) movq %r15,544+16(%rsp) movq %r8,544+24(%rsp) leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montq pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm1,%xmm4 por %xmm1,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 por %xmm3,%xmm4 pxor %xmm3,%xmm3 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 movq 64+0(%rbx),%rax movq 64+8(%rbx),%r14 movq 64+16(%rbx),%r15 movq 64+24(%rbx),%r8 .byte 102,72,15,110,203 leaq 64-0(%rbx),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 544(%rsp),%rax leaq 544(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq movq 416(%rsp),%rax leaq 416(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq 0+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montq movq 512(%rsp),%rax leaq 512(%rsp),%rbx movq 0+256(%rsp),%r9 movq 8+256(%rsp),%r10 leaq 0+256(%rsp),%rsi movq 16+256(%rsp),%r11 movq 24+256(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 224(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq orq %r13,%r12 movdqa %xmm4,%xmm2 orq %r8,%r12 orq %r9,%r12 por %xmm5,%xmm2 .byte 102,73,15,110,220 movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montq movq 480(%rsp),%rax leaq 480(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 160(%rsp),%rbx leaq 0(%rsp),%rdi call __ecp_nistz256_sub_fromq orq %r13,%r12 orq %r8,%r12 orq %r9,%r12 .byte 102,73,15,126,208 .byte 102,73,15,126,217 orq %r8,%r12 .byte 0x3e jnz .Ladd_proceedq testq %r9,%r9 jz .Ladd_doubleq .byte 102,72,15,126,199 pxor %xmm0,%xmm0 movdqu %xmm0,0(%rdi) movdqu %xmm0,16(%rdi) movdqu %xmm0,32(%rdi) movdqu %xmm0,48(%rdi) movdqu %xmm0,64(%rdi) movdqu %xmm0,80(%rdi) jmp .Ladd_doneq .align 32 .Ladd_doubleq: .byte 102,72,15,126,206 .byte 102,72,15,126,199 addq $416,%rsp .cfi_adjust_cfa_offset -416 jmp .Lpoint_double_shortcutq .cfi_adjust_cfa_offset 416 .align 32 .Ladd_proceedq: movq 0+64(%rsp),%rax movq 8+64(%rsp),%r14 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 544(%rsp),%rax leaq 544(%rsp),%rbx movq 0+352(%rsp),%r9 movq 8+352(%rsp),%r10 leaq 0+352(%rsp),%rsi movq 16+352(%rsp),%r11 movq 24+352(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montq movq 0(%rsp),%rax leaq 0(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 128(%rsp),%rdi call __ecp_nistz256_mul_montq movq 160(%rsp),%rax leaq 160(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montq xorq %r11,%r11 addq %r12,%r12 leaq 96(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subq leaq 128(%rsp),%rbx leaq 288(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 192+0(%rsp),%rax movq 192+8(%rsp),%rbp movq 192+16(%rsp),%rcx movq 192+24(%rsp),%r10 leaq 320(%rsp),%rdi call __ecp_nistz256_subq movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 128(%rsp),%rax leaq 128(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq 0+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq movq 320(%rsp),%rax leaq 320(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 320(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 256(%rsp),%rbx leaq 320(%rsp),%rdi call __ecp_nistz256_sub_fromq .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 352(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 352+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 544(%rsp),%xmm2 pand 544+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 480(%rsp),%xmm2 pand 480+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 320(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 320+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 512(%rsp),%xmm2 pand 512+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) .Ladd_doneq: leaq 576+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_addq_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_add,.-GFp_nistz256_point_add .globl GFp_nistz256_point_add_affine .hidden GFp_nistz256_point_add_affine .type GFp_nistz256_point_add_affine,@function .align 32 GFp_nistz256_point_add_affine: .cfi_startproc leaq GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je .Lpoint_add_affinex pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $480+8,%rsp .cfi_adjust_cfa_offset 32*15+8 .Ladd_affineq_body: movdqu 0(%rsi),%xmm0 movq %rdx,%rbx movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,320(%rsp) movdqa %xmm1,320+16(%rsp) movdqa %xmm2,352(%rsp) movdqa %xmm3,352+16(%rsp) movdqa %xmm4,384(%rsp) movdqa %xmm5,384+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rbx),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rbx),%xmm1 movdqu 32(%rbx),%xmm2 por %xmm3,%xmm5 movdqu 48(%rbx),%xmm3 movdqa %xmm0,416(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,416+16(%rsp) por %xmm0,%xmm1 .byte 102,72,15,110,199 movdqa %xmm2,448(%rsp) movdqa %xmm3,448+16(%rsp) por %xmm2,%xmm3 por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm1,%xmm3 leaq 64-0(%rsi),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm3,%xmm4 movq 0(%rbx),%rax movq %r12,%r9 por %xmm3,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 movq %r13,%r10 por %xmm3,%xmm4 pxor %xmm3,%xmm3 movq %r14,%r11 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 leaq 32-0(%rsp),%rsi movq %r15,%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 320(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 288(%rsp),%rdi call __ecp_nistz256_mul_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 352(%rsp),%rbx leaq 96(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+64(%rsp),%rax movq 8+64(%rsp),%r14 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 128(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 0+96(%rsp),%rax movq 8+96(%rsp),%r14 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r15 movq 24+96(%rsp),%r8 leaq 192(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 128(%rsp),%rax leaq 128(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montq movq 320(%rsp),%rax leaq 320(%rsp),%rbx movq 0+128(%rsp),%r9 movq 8+128(%rsp),%r10 leaq 0+128(%rsp),%rsi movq 16+128(%rsp),%r11 movq 24+128(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq xorq %r11,%r11 addq %r12,%r12 leaq 192(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subq leaq 160(%rsp),%rbx leaq 224(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 64(%rsp),%rdi call __ecp_nistz256_subq movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 352(%rsp),%rax leaq 352(%rsp),%rbx movq 0+160(%rsp),%r9 movq 8+160(%rsp),%r10 leaq 0+160(%rsp),%rsi movq 16+160(%rsp),%r11 movq 24+160(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq movq 96(%rsp),%rax leaq 96(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 64(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 32(%rsp),%rbx leaq 256(%rsp),%rdi call __ecp_nistz256_sub_fromq .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand .LONE_mont(%rip),%xmm2 pand .LONE_mont+16(%rip),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 224(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 224+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 320(%rsp),%xmm2 pand 320+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 256(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 256+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 352(%rsp),%xmm2 pand 352+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 480+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Ladd_affineq_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine .type __ecp_nistz256_add_tox,@function .align 32 __ecp_nistz256_add_tox: .cfi_startproc xorq %r11,%r11 adcq 0(%rbx),%r12 adcq 8(%rbx),%r13 movq %r12,%rax adcq 16(%rbx),%r8 adcq 24(%rbx),%r9 movq %r13,%rbp adcq $0,%r11 xorq %r10,%r10 sbbq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_add_tox,.-__ecp_nistz256_add_tox .type __ecp_nistz256_sub_fromx,@function .align 32 __ecp_nistz256_sub_fromx: .cfi_startproc xorq %r11,%r11 sbbq 0(%rbx),%r12 sbbq 8(%rbx),%r13 movq %r12,%rax sbbq 16(%rbx),%r8 sbbq 24(%rbx),%r9 movq %r13,%rbp sbbq $0,%r11 xorq %r10,%r10 adcq $-1,%r12 movq %r8,%rcx adcq %r14,%r13 adcq $0,%r8 movq %r9,%r10 adcq %r15,%r9 btq $0,%r11 cmovncq %rax,%r12 cmovncq %rbp,%r13 movq %r12,0(%rdi) cmovncq %rcx,%r8 movq %r13,8(%rdi) cmovncq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_sub_fromx,.-__ecp_nistz256_sub_fromx .type __ecp_nistz256_subx,@function .align 32 __ecp_nistz256_subx: .cfi_startproc xorq %r11,%r11 sbbq %r12,%rax sbbq %r13,%rbp movq %rax,%r12 sbbq %r8,%rcx sbbq %r9,%r10 movq %rbp,%r13 sbbq $0,%r11 xorq %r9,%r9 adcq $-1,%rax movq %rcx,%r8 adcq %r14,%rbp adcq $0,%rcx movq %r10,%r9 adcq %r15,%r10 btq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 cmovcq %rcx,%r8 cmovcq %r10,%r9 .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_subx,.-__ecp_nistz256_subx .type __ecp_nistz256_mul_by_2x,@function .align 32 __ecp_nistz256_mul_by_2x: .cfi_startproc xorq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 xorq %r10,%r10 sbbq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .cfi_endproc .size __ecp_nistz256_mul_by_2x,.-__ecp_nistz256_mul_by_2x .type GFp_nistz256_point_doublex,@function .align 32 GFp_nistz256_point_doublex: .cfi_startproc .Lpoint_doublex: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $160+8,%rsp .cfi_adjust_cfa_offset 32*5+8 .Lpoint_doublex_body: .Lpoint_double_shortcutx: movdqu 0(%rsi),%xmm0 movq %rsi,%rbx movdqu 16(%rsi),%xmm1 movq 32+0(%rsi),%r12 movq 32+8(%rsi),%r13 movq 32+16(%rsi),%r8 movq 32+24(%rsi),%r9 movq .Lpoly+8(%rip),%r14 movq .Lpoly+24(%rip),%r15 movdqa %xmm0,96(%rsp) movdqa %xmm1,96+16(%rsp) leaq 32(%rdi),%r10 leaq 64(%rdi),%r11 .byte 102,72,15,110,199 .byte 102,73,15,110,202 .byte 102,73,15,110,211 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_by_2x movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 leaq 64-128(%rsi),%rsi leaq 64(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 0(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 32(%rbx),%rdx movq 64+0(%rbx),%r9 movq 64+8(%rbx),%r10 movq 64+16(%rbx),%r11 movq 64+24(%rbx),%r12 leaq 64-128(%rbx),%rsi leaq 32(%rbx),%rbx .byte 102,72,15,126,215 call __ecp_nistz256_mul_montx call __ecp_nistz256_mul_by_2x movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 32(%rsp),%rdi call __ecp_nistz256_add_tox movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 .byte 102,72,15,126,207 call __ecp_nistz256_sqr_montx xorq %r9,%r9 movq %r12,%rax addq $-1,%r12 movq %r13,%r10 adcq %rsi,%r13 movq %r14,%rcx adcq $0,%r14 movq %r15,%r8 adcq %rbp,%r15 adcq $0,%r9 xorq %rsi,%rsi testq $1,%rax cmovzq %rax,%r12 cmovzq %r10,%r13 cmovzq %rcx,%r14 cmovzq %r8,%r15 cmovzq %rsi,%r9 movq %r13,%rax shrq $1,%r12 shlq $63,%rax movq %r14,%r10 shrq $1,%r13 orq %rax,%r12 shlq $63,%r10 movq %r15,%rcx shrq $1,%r14 orq %r10,%r13 shlq $63,%rcx movq %r12,0(%rdi) shrq $1,%r15 movq %r13,8(%rdi) shlq $63,%r9 orq %rcx,%r14 orq %r9,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) movq 64(%rsp),%rdx leaq 64(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2x leaq 32(%rsp),%rbx leaq 32(%rsp),%rdi call __ecp_nistz256_add_tox movq 96(%rsp),%rdx leaq 96(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2x movq 0+32(%rsp),%rdx movq 8+32(%rsp),%r14 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r15 movq 24+32(%rsp),%r8 .byte 102,72,15,126,199 call __ecp_nistz256_sqr_montx leaq 128(%rsp),%rbx movq %r14,%r8 movq %r15,%r9 movq %rsi,%r14 movq %rbp,%r15 call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 0(%rsp),%rdi call __ecp_nistz256_subx movq 32(%rsp),%rdx leaq 32(%rsp),%rbx movq %r12,%r14 xorl %ecx,%ecx movq %r12,0+0(%rsp) movq %r13,%r10 movq %r13,0+8(%rsp) cmovzq %r8,%r11 movq %r8,0+16(%rsp) leaq 0-128(%rsp),%rsi cmovzq %r9,%r12 movq %r9,0+24(%rsp) movq %r14,%r9 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx .byte 102,72,15,126,203 .byte 102,72,15,126,207 call __ecp_nistz256_sub_fromx leaq 160+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_doublex_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_doublex,.-GFp_nistz256_point_doublex .type GFp_nistz256_point_addx,@function .align 32 GFp_nistz256_point_addx: .cfi_startproc .Lpoint_addx: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $576+8,%rsp .cfi_adjust_cfa_offset 32*18+8 .Lpoint_addx_body: movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq %rsi,%rbx movq %rdx,%rsi movdqa %xmm0,384(%rsp) movdqa %xmm1,384+16(%rsp) movdqa %xmm2,416(%rsp) movdqa %xmm3,416+16(%rsp) movdqa %xmm4,448(%rsp) movdqa %xmm5,448+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rsi),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 por %xmm3,%xmm5 movdqu 48(%rsi),%xmm3 movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,480(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,480+16(%rsp) movdqu 64(%rsi),%xmm0 movdqu 80(%rsi),%xmm1 movdqa %xmm2,512(%rsp) movdqa %xmm3,512+16(%rsp) por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm0,%xmm1 .byte 102,72,15,110,199 leaq 64-128(%rsi),%rsi movq %rdx,544+0(%rsp) movq %r14,544+8(%rsp) movq %r15,544+16(%rsp) movq %r8,544+24(%rsp) leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montx pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm1,%xmm4 por %xmm1,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 por %xmm3,%xmm4 pxor %xmm3,%xmm3 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 movq 64+0(%rbx),%rdx movq 64+8(%rbx),%r14 movq 64+16(%rbx),%r15 movq 64+24(%rbx),%r8 .byte 102,72,15,110,203 leaq 64-128(%rbx),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 544(%rsp),%rdx leaq 544(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx movq 416(%rsp),%rdx leaq 416(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq -128+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montx movq 512(%rsp),%rdx leaq 512(%rsp),%rbx movq 0+256(%rsp),%r9 movq 8+256(%rsp),%r10 leaq -128+256(%rsp),%rsi movq 16+256(%rsp),%r11 movq 24+256(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 224(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx orq %r13,%r12 movdqa %xmm4,%xmm2 orq %r8,%r12 orq %r9,%r12 por %xmm5,%xmm2 .byte 102,73,15,110,220 movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montx movq 480(%rsp),%rdx leaq 480(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 160(%rsp),%rbx leaq 0(%rsp),%rdi call __ecp_nistz256_sub_fromx orq %r13,%r12 orq %r8,%r12 orq %r9,%r12 .byte 102,73,15,126,208 .byte 102,73,15,126,217 orq %r8,%r12 .byte 0x3e jnz .Ladd_proceedx testq %r9,%r9 jz .Ladd_doublex .byte 102,72,15,126,199 pxor %xmm0,%xmm0 movdqu %xmm0,0(%rdi) movdqu %xmm0,16(%rdi) movdqu %xmm0,32(%rdi) movdqu %xmm0,48(%rdi) movdqu %xmm0,64(%rdi) movdqu %xmm0,80(%rdi) jmp .Ladd_donex .align 32 .Ladd_doublex: .byte 102,72,15,126,206 .byte 102,72,15,126,199 addq $416,%rsp .cfi_adjust_cfa_offset -416 jmp .Lpoint_double_shortcutx .cfi_adjust_cfa_offset 416 .align 32 .Ladd_proceedx: movq 0+64(%rsp),%rdx movq 8+64(%rsp),%r14 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 544(%rsp),%rdx leaq 544(%rsp),%rbx movq 0+352(%rsp),%r9 movq 8+352(%rsp),%r10 leaq -128+352(%rsp),%rsi movq 16+352(%rsp),%r11 movq 24+352(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montx movq 0(%rsp),%rdx leaq 0(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 128(%rsp),%rdi call __ecp_nistz256_mul_montx movq 160(%rsp),%rdx leaq 160(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montx xorq %r11,%r11 addq %r12,%r12 leaq 96(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subx leaq 128(%rsp),%rbx leaq 288(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 192+0(%rsp),%rax movq 192+8(%rsp),%rbp movq 192+16(%rsp),%rcx movq 192+24(%rsp),%r10 leaq 320(%rsp),%rdi call __ecp_nistz256_subx movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 128(%rsp),%rdx leaq 128(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq -128+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx movq 320(%rsp),%rdx leaq 320(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 320(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 256(%rsp),%rbx leaq 320(%rsp),%rdi call __ecp_nistz256_sub_fromx .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 352(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 352+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 544(%rsp),%xmm2 pand 544+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 480(%rsp),%xmm2 pand 480+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 320(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 320+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 512(%rsp),%xmm2 pand 512+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) .Ladd_donex: leaq 576+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpoint_addx_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_addx,.-GFp_nistz256_point_addx .type GFp_nistz256_point_add_affinex,@function .align 32 GFp_nistz256_point_add_affinex: .cfi_startproc .Lpoint_add_affinex: pushq %rbp .cfi_adjust_cfa_offset 8 .cfi_offset %rbp,-16 pushq %rbx .cfi_adjust_cfa_offset 8 .cfi_offset %rbx,-24 pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-32 pushq %r13 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-40 pushq %r14 .cfi_adjust_cfa_offset 8 .cfi_offset %r14,-48 pushq %r15 .cfi_adjust_cfa_offset 8 .cfi_offset %r15,-56 subq $480+8,%rsp .cfi_adjust_cfa_offset 32*15+8 .Ladd_affinex_body: movdqu 0(%rsi),%xmm0 movq %rdx,%rbx movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,320(%rsp) movdqa %xmm1,320+16(%rsp) movdqa %xmm2,352(%rsp) movdqa %xmm3,352+16(%rsp) movdqa %xmm4,384(%rsp) movdqa %xmm5,384+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rbx),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rbx),%xmm1 movdqu 32(%rbx),%xmm2 por %xmm3,%xmm5 movdqu 48(%rbx),%xmm3 movdqa %xmm0,416(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,416+16(%rsp) por %xmm0,%xmm1 .byte 102,72,15,110,199 movdqa %xmm2,448(%rsp) movdqa %xmm3,448+16(%rsp) por %xmm2,%xmm3 por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm1,%xmm3 leaq 64-128(%rsi),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm3,%xmm4 movq 0(%rbx),%rdx movq %r12,%r9 por %xmm3,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 movq %r13,%r10 por %xmm3,%xmm4 pxor %xmm3,%xmm3 movq %r14,%r11 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 leaq 32-128(%rsp),%rsi movq %r15,%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 320(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 288(%rsp),%rdi call __ecp_nistz256_mul_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 352(%rsp),%rbx leaq 96(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+64(%rsp),%rdx movq 8+64(%rsp),%r14 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 128(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 0+96(%rsp),%rdx movq 8+96(%rsp),%r14 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r15 movq 24+96(%rsp),%r8 leaq 192(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 128(%rsp),%rdx leaq 128(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montx movq 320(%rsp),%rdx leaq 320(%rsp),%rbx movq 0+128(%rsp),%r9 movq 8+128(%rsp),%r10 leaq -128+128(%rsp),%rsi movq 16+128(%rsp),%r11 movq 24+128(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx xorq %r11,%r11 addq %r12,%r12 leaq 192(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subx leaq 160(%rsp),%rbx leaq 224(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 64(%rsp),%rdi call __ecp_nistz256_subx movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 352(%rsp),%rdx leaq 352(%rsp),%rbx movq 0+160(%rsp),%r9 movq 8+160(%rsp),%r10 leaq -128+160(%rsp),%rsi movq 16+160(%rsp),%r11 movq 24+160(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx movq 96(%rsp),%rdx leaq 96(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 64(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 32(%rsp),%rbx leaq 256(%rsp),%rdi call __ecp_nistz256_sub_fromx .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand .LONE_mont(%rip),%xmm2 pand .LONE_mont+16(%rip),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 224(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 224+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 320(%rsp),%xmm2 pand 320+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 256(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 256+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 352(%rsp),%xmm2 pand 352+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 480+56(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbx .cfi_restore %rbx movq -8(%rsi),%rbp .cfi_restore %rbp leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Ladd_affinex_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_nistz256_point_add_affinex,.-GFp_nistz256_point_add_affinex #endif ring-0.16.9/pregenerated/p256-x86_64-asm-macosx.S000064400000000000000000002073021353224257700172410ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .p2align 6 L$poly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 L$One: .long 1,1,1,1,1,1,1,1 L$Two: .long 2,2,2,2,2,2,2,2 L$Three: .long 3,3,3,3,3,3,3,3 L$ONE_mont: .quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe L$ord: .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 L$ordK: .quad 0xccd1c8aaee00bc4f .globl _GFp_nistz256_add .private_extern _GFp_nistz256_add .p2align 5 _GFp_nistz256_add: pushq %r12 pushq %r13 movq 0(%rsi),%r8 xorq %r13,%r13 movq 8(%rsi),%r9 movq 16(%rsi),%r10 movq 24(%rsi),%r11 leaq L$poly(%rip),%rsi addq 0(%rdx),%r8 adcq 8(%rdx),%r9 movq %r8,%rax adcq 16(%rdx),%r10 adcq 24(%rdx),%r11 movq %r9,%rdx adcq $0,%r13 subq 0(%rsi),%r8 movq %r10,%rcx sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r12 sbbq 24(%rsi),%r11 sbbq $0,%r13 cmovcq %rax,%r8 cmovcq %rdx,%r9 movq %r8,0(%rdi) cmovcq %rcx,%r10 movq %r9,8(%rdi) cmovcq %r12,%r11 movq %r10,16(%rdi) movq %r11,24(%rdi) popq %r13 popq %r12 .byte 0xf3,0xc3 .globl _GFp_nistz256_neg .private_extern _GFp_nistz256_neg .p2align 5 _GFp_nistz256_neg: pushq %r12 pushq %r13 L$neg_body: xorq %r8,%r8 xorq %r9,%r9 xorq %r10,%r10 xorq %r11,%r11 xorq %r13,%r13 subq 0(%rsi),%r8 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r8,%rax sbbq 24(%rsi),%r11 leaq L$poly(%rip),%rsi movq %r9,%rdx sbbq $0,%r13 addq 0(%rsi),%r8 movq %r10,%rcx adcq 8(%rsi),%r9 adcq 16(%rsi),%r10 movq %r11,%r12 adcq 24(%rsi),%r11 testq %r13,%r13 cmovzq %rax,%r8 cmovzq %rdx,%r9 movq %r8,0(%rdi) cmovzq %rcx,%r10 movq %r9,8(%rdi) cmovzq %r12,%r11 movq %r10,16(%rdi) movq %r11,24(%rdi) movq 0(%rsp),%r13 movq 8(%rsp),%r12 leaq 16(%rsp),%rsp L$neg_epilogue: .byte 0xf3,0xc3 .globl _GFp_p256_scalar_mul_mont .private_extern _GFp_p256_scalar_mul_mont .p2align 5 _GFp_p256_scalar_mul_mont: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je L$ecp_nistz256_ord_mul_montx pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$ord_mul_body: movq 0(%rdx),%rax movq %rdx,%rbx leaq L$ord(%rip),%r14 movq L$ordK(%rip),%r15 movq %rax,%rcx mulq 0(%rsi) movq %rax,%r8 movq %rcx,%rax movq %rdx,%r9 mulq 8(%rsi) addq %rax,%r9 movq %rcx,%rax adcq $0,%rdx movq %rdx,%r10 mulq 16(%rsi) addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %r8,%r13 imulq %r15,%r8 movq %rdx,%r11 mulq 24(%rsi) addq %rax,%r11 movq %r8,%rax adcq $0,%rdx movq %rdx,%r12 mulq 0(%r14) movq %r8,%rbp addq %rax,%r13 movq %r8,%rax adcq $0,%rdx movq %rdx,%rcx subq %r8,%r10 sbbq $0,%r8 mulq 8(%r14) addq %rcx,%r9 adcq $0,%rdx addq %rax,%r9 movq %rbp,%rax adcq %rdx,%r10 movq %rbp,%rdx adcq $0,%r8 shlq $32,%rax shrq $32,%rdx subq %rax,%r11 movq 8(%rbx),%rax sbbq %rdx,%rbp addq %r8,%r11 adcq %rbp,%r12 adcq $0,%r13 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r9 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r10 adcq $0,%rdx addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r11 adcq $0,%rdx addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %r9,%rcx imulq %r15,%r9 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r12 adcq $0,%rdx xorq %r8,%r8 addq %rax,%r12 movq %r9,%rax adcq %rdx,%r13 adcq $0,%r8 mulq 0(%r14) movq %r9,%rbp addq %rax,%rcx movq %r9,%rax adcq %rdx,%rcx subq %r9,%r11 sbbq $0,%r9 mulq 8(%r14) addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %rbp,%rax adcq %rdx,%r11 movq %rbp,%rdx adcq $0,%r9 shlq $32,%rax shrq $32,%rdx subq %rax,%r12 movq 16(%rbx),%rax sbbq %rdx,%rbp addq %r9,%r12 adcq %rbp,%r13 adcq $0,%r8 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r10 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r11 adcq $0,%rdx addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r12 adcq $0,%rdx addq %rax,%r12 movq %rcx,%rax adcq $0,%rdx movq %r10,%rcx imulq %r15,%r10 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r13 adcq $0,%rdx xorq %r9,%r9 addq %rax,%r13 movq %r10,%rax adcq %rdx,%r8 adcq $0,%r9 mulq 0(%r14) movq %r10,%rbp addq %rax,%rcx movq %r10,%rax adcq %rdx,%rcx subq %r10,%r12 sbbq $0,%r10 mulq 8(%r14) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq %rdx,%r12 movq %rbp,%rdx adcq $0,%r10 shlq $32,%rax shrq $32,%rdx subq %rax,%r13 movq 24(%rbx),%rax sbbq %rdx,%rbp addq %r10,%r13 adcq %rbp,%r8 adcq $0,%r9 movq %rax,%rcx mulq 0(%rsi) addq %rax,%r11 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 8(%rsi) addq %rbp,%r12 adcq $0,%rdx addq %rax,%r12 movq %rcx,%rax adcq $0,%rdx movq %rdx,%rbp mulq 16(%rsi) addq %rbp,%r13 adcq $0,%rdx addq %rax,%r13 movq %rcx,%rax adcq $0,%rdx movq %r11,%rcx imulq %r15,%r11 movq %rdx,%rbp mulq 24(%rsi) addq %rbp,%r8 adcq $0,%rdx xorq %r10,%r10 addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 adcq $0,%r10 mulq 0(%r14) movq %r11,%rbp addq %rax,%rcx movq %r11,%rax adcq %rdx,%rcx subq %r11,%r13 sbbq $0,%r11 mulq 8(%r14) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq %rdx,%r13 movq %rbp,%rdx adcq $0,%r11 shlq $32,%rax shrq $32,%rdx subq %rax,%r8 sbbq %rdx,%rbp addq %r11,%r8 adcq %rbp,%r9 adcq $0,%r10 movq %r12,%rsi subq 0(%r14),%r12 movq %r13,%r11 sbbq 8(%r14),%r13 movq %r8,%rcx sbbq 16(%r14),%r8 movq %r9,%rbp sbbq 24(%r14),%r9 sbbq $0,%r10 cmovcq %rsi,%r12 cmovcq %r11,%r13 cmovcq %rcx,%r8 cmovcq %rbp,%r9 movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$ord_mul_epilogue: .byte 0xf3,0xc3 .globl _GFp_p256_scalar_sqr_rep_mont .private_extern _GFp_p256_scalar_sqr_rep_mont .p2align 5 _GFp_p256_scalar_sqr_rep_mont: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je L$ecp_nistz256_ord_sqr_montx pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$ord_sqr_body: movq 0(%rsi),%r8 movq 8(%rsi),%rax movq 16(%rsi),%r14 movq 24(%rsi),%r15 leaq L$ord(%rip),%rsi movq %rdx,%rbx jmp L$oop_ord_sqr .p2align 5 L$oop_ord_sqr: movq %rax,%rbp mulq %r8 movq %rax,%r9 .byte 102,72,15,110,205 movq %r14,%rax movq %rdx,%r10 mulq %r8 addq %rax,%r10 movq %r15,%rax .byte 102,73,15,110,214 adcq $0,%rdx movq %rdx,%r11 mulq %r8 addq %rax,%r11 movq %r15,%rax .byte 102,73,15,110,223 adcq $0,%rdx movq %rdx,%r12 mulq %r14 movq %rax,%r13 movq %r14,%rax movq %rdx,%r14 mulq %rbp addq %rax,%r11 movq %r15,%rax adcq $0,%rdx movq %rdx,%r15 mulq %rbp addq %rax,%r12 adcq $0,%rdx addq %r15,%r12 adcq %rdx,%r13 adcq $0,%r14 xorq %r15,%r15 movq %r8,%rax addq %r9,%r9 adcq %r10,%r10 adcq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 adcq %r14,%r14 adcq $0,%r15 mulq %rax movq %rax,%r8 .byte 102,72,15,126,200 movq %rdx,%rbp mulq %rax addq %rbp,%r9 adcq %rax,%r10 .byte 102,72,15,126,208 adcq $0,%rdx movq %rdx,%rbp mulq %rax addq %rbp,%r11 adcq %rax,%r12 .byte 102,72,15,126,216 adcq $0,%rdx movq %rdx,%rbp movq %r8,%rcx imulq 32(%rsi),%r8 mulq %rax addq %rbp,%r13 adcq %rax,%r14 movq 0(%rsi),%rax adcq %rdx,%r15 mulq %r8 movq %r8,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r8,%r10 sbbq $0,%rbp mulq %r8 addq %rcx,%r9 adcq $0,%rdx addq %rax,%r9 movq %r8,%rax adcq %rdx,%r10 movq %r8,%rdx adcq $0,%rbp movq %r9,%rcx imulq 32(%rsi),%r9 shlq $32,%rax shrq $32,%rdx subq %rax,%r11 movq 0(%rsi),%rax sbbq %rdx,%r8 addq %rbp,%r11 adcq $0,%r8 mulq %r9 movq %r9,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r9,%r11 sbbq $0,%rbp mulq %r9 addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %r9,%rax adcq %rdx,%r11 movq %r9,%rdx adcq $0,%rbp movq %r10,%rcx imulq 32(%rsi),%r10 shlq $32,%rax shrq $32,%rdx subq %rax,%r8 movq 0(%rsi),%rax sbbq %rdx,%r9 addq %rbp,%r8 adcq $0,%r9 mulq %r10 movq %r10,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r10,%r8 sbbq $0,%rbp mulq %r10 addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %r10,%rax adcq %rdx,%r8 movq %r10,%rdx adcq $0,%rbp movq %r11,%rcx imulq 32(%rsi),%r11 shlq $32,%rax shrq $32,%rdx subq %rax,%r9 movq 0(%rsi),%rax sbbq %rdx,%r10 addq %rbp,%r9 adcq $0,%r10 mulq %r11 movq %r11,%rbp addq %rax,%rcx movq 8(%rsi),%rax adcq %rdx,%rcx subq %r11,%r9 sbbq $0,%rbp mulq %r11 addq %rcx,%r8 adcq $0,%rdx addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 movq %r11,%rdx adcq $0,%rbp shlq $32,%rax shrq $32,%rdx subq %rax,%r10 sbbq %rdx,%r11 addq %rbp,%r10 adcq $0,%r11 xorq %rdx,%rdx addq %r12,%r8 adcq %r13,%r9 movq %r8,%r12 adcq %r14,%r10 adcq %r15,%r11 movq %r9,%rax adcq $0,%rdx subq 0(%rsi),%r8 movq %r10,%r14 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r15 sbbq 24(%rsi),%r11 sbbq $0,%rdx cmovcq %r12,%r8 cmovncq %r9,%rax cmovncq %r10,%r14 cmovncq %r11,%r15 decq %rbx jnz L$oop_ord_sqr movq %r8,0(%rdi) movq %rax,8(%rdi) pxor %xmm1,%xmm1 movq %r14,16(%rdi) pxor %xmm2,%xmm2 movq %r15,24(%rdi) pxor %xmm3,%xmm3 movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$ord_sqr_epilogue: .byte 0xf3,0xc3 .p2align 5 ecp_nistz256_ord_mul_montx: L$ecp_nistz256_ord_mul_montx: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$ord_mulx_body: movq %rdx,%rbx movq 0(%rdx),%rdx movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 leaq -128(%rsi),%rsi leaq L$ord-128(%rip),%r14 movq L$ordK(%rip),%r15 mulxq %r9,%r8,%r9 mulxq %r10,%rcx,%r10 mulxq %r11,%rbp,%r11 addq %rcx,%r9 mulxq %r12,%rcx,%r12 movq %r8,%rdx mulxq %r15,%rdx,%rax adcq %rbp,%r10 adcq %rcx,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 24+128(%r14),%rcx,%rbp movq 8(%rbx),%rdx adcxq %rcx,%r11 adoxq %rbp,%r12 adcxq %r8,%r12 adoxq %r8,%r13 adcq $0,%r13 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%rsi),%rcx,%rbp movq %r9,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r12 adoxq %rbp,%r13 adcxq %r8,%r13 adoxq %r8,%r8 adcq $0,%r8 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%r14),%rcx,%rbp movq 16(%rbx),%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcxq %r9,%r13 adoxq %r9,%r8 adcq $0,%r8 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%rsi),%rcx,%rbp movq %r10,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r13 adoxq %rbp,%r8 adcxq %r9,%r8 adoxq %r9,%r9 adcq $0,%r9 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%r14),%rcx,%rbp movq 24(%rbx),%rdx adcxq %rcx,%r13 adoxq %rbp,%r8 adcxq %r10,%r8 adoxq %r10,%r9 adcq $0,%r9 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%rsi),%rcx,%rbp movq %r11,%rdx mulxq %r15,%rdx,%rax adcxq %rcx,%r8 adoxq %rbp,%r9 adcxq %r10,%r9 adoxq %r10,%r10 adcq $0,%r10 mulxq 0+128(%r14),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%r14),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%r14),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%r14),%rcx,%rbp leaq 128(%r14),%r14 movq %r12,%rbx adcxq %rcx,%r8 adoxq %rbp,%r9 movq %r13,%rdx adcxq %r11,%r9 adoxq %r11,%r10 adcq $0,%r10 movq %r8,%rcx subq 0(%r14),%r12 sbbq 8(%r14),%r13 sbbq 16(%r14),%r8 movq %r9,%rbp sbbq 24(%r14),%r9 sbbq $0,%r10 cmovcq %rbx,%r12 cmovcq %rdx,%r13 cmovcq %rcx,%r8 cmovcq %rbp,%r9 movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$ord_mulx_epilogue: .byte 0xf3,0xc3 .p2align 5 ecp_nistz256_ord_sqr_montx: L$ecp_nistz256_ord_sqr_montx: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$ord_sqrx_body: movq %rdx,%rbx movq 0(%rsi),%rdx movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 leaq L$ord(%rip),%rsi jmp L$oop_ord_sqrx .p2align 5 L$oop_ord_sqrx: mulxq %r14,%r9,%r10 mulxq %r15,%rcx,%r11 movq %rdx,%rax .byte 102,73,15,110,206 mulxq %r8,%rbp,%r12 movq %r14,%rdx addq %rcx,%r10 .byte 102,73,15,110,215 adcq %rbp,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq %r15,%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq %r8,%rcx,%rbp movq %r15,%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcq $0,%r13 mulxq %r8,%rcx,%r14 movq %rax,%rdx .byte 102,73,15,110,216 xorq %r15,%r15 adcxq %r9,%r9 adoxq %rcx,%r13 adcxq %r10,%r10 adoxq %r15,%r14 mulxq %rdx,%r8,%rbp .byte 102,72,15,126,202 adcxq %r11,%r11 adoxq %rbp,%r9 adcxq %r12,%r12 mulxq %rdx,%rcx,%rax .byte 102,72,15,126,210 adcxq %r13,%r13 adoxq %rcx,%r10 adcxq %r14,%r14 mulxq %rdx,%rcx,%rbp .byte 0x67 .byte 102,72,15,126,218 adoxq %rax,%r11 adcxq %r15,%r15 adoxq %rcx,%r12 adoxq %rbp,%r13 mulxq %rdx,%rcx,%rax adoxq %rcx,%r14 adoxq %rax,%r15 movq %r8,%rdx mulxq 32(%rsi),%rdx,%rcx xorq %rax,%rax mulxq 0(%rsi),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 8(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 16(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 24(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r8 adcxq %rax,%r8 movq %r9,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adoxq %rcx,%r9 adcxq %rbp,%r10 mulxq 8(%rsi),%rcx,%rbp adoxq %rcx,%r10 adcxq %rbp,%r11 mulxq 16(%rsi),%rcx,%rbp adoxq %rcx,%r11 adcxq %rbp,%r8 mulxq 24(%rsi),%rcx,%rbp adoxq %rcx,%r8 adcxq %rbp,%r9 adoxq %rax,%r9 movq %r10,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r8 mulxq 16(%rsi),%rcx,%rbp adcxq %rcx,%r8 adoxq %rbp,%r9 mulxq 24(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 adcxq %rax,%r10 movq %r11,%rdx mulxq 32(%rsi),%rdx,%rcx mulxq 0(%rsi),%rcx,%rbp adoxq %rcx,%r11 adcxq %rbp,%r8 mulxq 8(%rsi),%rcx,%rbp adoxq %rcx,%r8 adcxq %rbp,%r9 mulxq 16(%rsi),%rcx,%rbp adoxq %rcx,%r9 adcxq %rbp,%r10 mulxq 24(%rsi),%rcx,%rbp adoxq %rcx,%r10 adcxq %rbp,%r11 adoxq %rax,%r11 addq %r8,%r12 adcq %r13,%r9 movq %r12,%rdx adcq %r14,%r10 adcq %r15,%r11 movq %r9,%r14 adcq $0,%rax subq 0(%rsi),%r12 movq %r10,%r15 sbbq 8(%rsi),%r9 sbbq 16(%rsi),%r10 movq %r11,%r8 sbbq 24(%rsi),%r11 sbbq $0,%rax cmovncq %r12,%rdx cmovncq %r9,%r14 cmovncq %r10,%r15 cmovncq %r11,%r8 decq %rbx jnz L$oop_ord_sqrx movq %rdx,0(%rdi) movq %r14,8(%rdi) pxor %xmm1,%xmm1 movq %r15,16(%rdi) pxor %xmm2,%xmm2 movq %r8,24(%rdi) pxor %xmm3,%xmm3 movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$ord_sqrx_epilogue: .byte 0xf3,0xc3 .globl _GFp_nistz256_mul_mont .private_extern _GFp_nistz256_mul_mont .p2align 5 _GFp_nistz256_mul_mont: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx L$mul_mont: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$mul_body: cmpl $0x80100,%ecx je L$mul_montx movq %rdx,%rbx movq 0(%rdx),%rax movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 call __ecp_nistz256_mul_montq jmp L$mul_mont_done .p2align 5 L$mul_montx: movq %rdx,%rbx movq 0(%rdx),%rdx movq 0(%rsi),%r9 movq 8(%rsi),%r10 movq 16(%rsi),%r11 movq 24(%rsi),%r12 leaq -128(%rsi),%rsi call __ecp_nistz256_mul_montx L$mul_mont_done: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$mul_epilogue: .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_mul_montq: movq %rax,%rbp mulq %r9 movq L$poly+8(%rip),%r14 movq %rax,%r8 movq %rbp,%rax movq %rdx,%r9 mulq %r10 movq L$poly+24(%rip),%r15 addq %rax,%r9 movq %rbp,%rax adcq $0,%rdx movq %rdx,%r10 mulq %r11 addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%r11 mulq %r12 addq %rax,%r11 movq %r8,%rax adcq $0,%rdx xorq %r13,%r13 movq %rdx,%r12 movq %r8,%rbp shlq $32,%r8 mulq %r15 shrq $32,%rbp addq %r8,%r9 adcq %rbp,%r10 adcq %rax,%r11 movq 8(%rbx),%rax adcq %rdx,%r12 adcq $0,%r13 xorq %r8,%r8 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r9 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r10 adcq $0,%rdx addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %r9,%rax adcq %rdx,%r13 adcq $0,%r8 movq %r9,%rbp shlq $32,%r9 mulq %r15 shrq $32,%rbp addq %r9,%r10 adcq %rbp,%r11 adcq %rax,%r12 movq 16(%rbx),%rax adcq %rdx,%r13 adcq $0,%r8 xorq %r9,%r9 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r10 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r11 adcq $0,%rdx addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r13 adcq $0,%rdx addq %rax,%r13 movq %r10,%rax adcq %rdx,%r8 adcq $0,%r9 movq %r10,%rbp shlq $32,%r10 mulq %r15 shrq $32,%rbp addq %r10,%r11 adcq %rbp,%r12 adcq %rax,%r13 movq 24(%rbx),%rax adcq %rdx,%r8 adcq $0,%r9 xorq %r10,%r10 movq %rax,%rbp mulq 0(%rsi) addq %rax,%r11 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 8(%rsi) addq %rcx,%r12 adcq $0,%rdx addq %rax,%r12 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 16(%rsi) addq %rcx,%r13 adcq $0,%rdx addq %rax,%r13 movq %rbp,%rax adcq $0,%rdx movq %rdx,%rcx mulq 24(%rsi) addq %rcx,%r8 adcq $0,%rdx addq %rax,%r8 movq %r11,%rax adcq %rdx,%r9 adcq $0,%r10 movq %r11,%rbp shlq $32,%r11 mulq %r15 shrq $32,%rbp addq %r11,%r12 adcq %rbp,%r13 movq %r12,%rcx adcq %rax,%r8 adcq %rdx,%r9 movq %r13,%rbp adcq $0,%r10 subq $-1,%r12 movq %r8,%rbx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%rdx sbbq %r15,%r9 sbbq $0,%r10 cmovcq %rcx,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rbx,%r8 movq %r13,8(%rdi) cmovcq %rdx,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .globl _GFp_nistz256_sqr_mont .private_extern _GFp_nistz256_sqr_mont .p2align 5 _GFp_nistz256_sqr_mont: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$sqr_body: cmpl $0x80100,%ecx je L$sqr_montx movq 0(%rsi),%rax movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 call __ecp_nistz256_sqr_montq jmp L$sqr_mont_done .p2align 5 L$sqr_montx: movq 0(%rsi),%rdx movq 8(%rsi),%r14 movq 16(%rsi),%r15 movq 24(%rsi),%r8 leaq -128(%rsi),%rsi call __ecp_nistz256_sqr_montx L$sqr_mont_done: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbx movq 40(%rsp),%rbp leaq 48(%rsp),%rsp L$sqr_epilogue: .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_sqr_montq: movq %rax,%r13 mulq %r14 movq %rax,%r9 movq %r15,%rax movq %rdx,%r10 mulq %r13 addq %rax,%r10 movq %r8,%rax adcq $0,%rdx movq %rdx,%r11 mulq %r13 addq %rax,%r11 movq %r15,%rax adcq $0,%rdx movq %rdx,%r12 mulq %r14 addq %rax,%r11 movq %r8,%rax adcq $0,%rdx movq %rdx,%rbp mulq %r14 addq %rax,%r12 movq %r8,%rax adcq $0,%rdx addq %rbp,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %r15 xorq %r15,%r15 addq %rax,%r13 movq 0(%rsi),%rax movq %rdx,%r14 adcq $0,%r14 addq %r9,%r9 adcq %r10,%r10 adcq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 adcq %r14,%r14 adcq $0,%r15 mulq %rax movq %rax,%r8 movq 8(%rsi),%rax movq %rdx,%rcx mulq %rax addq %rcx,%r9 adcq %rax,%r10 movq 16(%rsi),%rax adcq $0,%rdx movq %rdx,%rcx mulq %rax addq %rcx,%r11 adcq %rax,%r12 movq 24(%rsi),%rax adcq $0,%rdx movq %rdx,%rcx mulq %rax addq %rcx,%r13 adcq %rax,%r14 movq %r8,%rax adcq %rdx,%r15 movq L$poly+8(%rip),%rsi movq L$poly+24(%rip),%rbp movq %r8,%rcx shlq $32,%r8 mulq %rbp shrq $32,%rcx addq %r8,%r9 adcq %rcx,%r10 adcq %rax,%r11 movq %r9,%rax adcq $0,%rdx movq %r9,%rcx shlq $32,%r9 movq %rdx,%r8 mulq %rbp shrq $32,%rcx addq %r9,%r10 adcq %rcx,%r11 adcq %rax,%r8 movq %r10,%rax adcq $0,%rdx movq %r10,%rcx shlq $32,%r10 movq %rdx,%r9 mulq %rbp shrq $32,%rcx addq %r10,%r11 adcq %rcx,%r8 adcq %rax,%r9 movq %r11,%rax adcq $0,%rdx movq %r11,%rcx shlq $32,%r11 movq %rdx,%r10 mulq %rbp shrq $32,%rcx addq %r11,%r8 adcq %rcx,%r9 adcq %rax,%r10 adcq $0,%rdx xorq %r11,%r11 addq %r8,%r12 adcq %r9,%r13 movq %r12,%r8 adcq %r10,%r14 adcq %rdx,%r15 movq %r13,%r9 adcq $0,%r11 subq $-1,%r12 movq %r14,%r10 sbbq %rsi,%r13 sbbq $0,%r14 movq %r15,%rcx sbbq %rbp,%r15 sbbq $0,%r11 cmovcq %r8,%r12 cmovcq %r9,%r13 movq %r12,0(%rdi) cmovcq %r10,%r14 movq %r13,8(%rdi) cmovcq %rcx,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_mul_montx: mulxq %r9,%r8,%r9 mulxq %r10,%rcx,%r10 movq $32,%r14 xorq %r13,%r13 mulxq %r11,%rbp,%r11 movq L$poly+24(%rip),%r15 adcq %rcx,%r9 mulxq %r12,%rcx,%r12 movq %r8,%rdx adcq %rbp,%r10 shlxq %r14,%r8,%rbp adcq %rcx,%r11 shrxq %r14,%r8,%rcx adcq $0,%r12 addq %rbp,%r9 adcq %rcx,%r10 mulxq %r15,%rcx,%rbp movq 8(%rbx),%rdx adcq %rcx,%r11 adcq %rbp,%r12 adcq $0,%r13 xorq %r8,%r8 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r9 adoxq %rbp,%r10 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 24+128(%rsi),%rcx,%rbp movq %r9,%rdx adcxq %rcx,%r12 shlxq %r14,%r9,%rcx adoxq %rbp,%r13 shrxq %r14,%r9,%rbp adcxq %r8,%r13 adoxq %r8,%r8 adcq $0,%r8 addq %rcx,%r10 adcq %rbp,%r11 mulxq %r15,%rcx,%rbp movq 16(%rbx),%rdx adcq %rcx,%r12 adcq %rbp,%r13 adcq $0,%r8 xorq %r9,%r9 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r10 adoxq %rbp,%r11 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 24+128(%rsi),%rcx,%rbp movq %r10,%rdx adcxq %rcx,%r13 shlxq %r14,%r10,%rcx adoxq %rbp,%r8 shrxq %r14,%r10,%rbp adcxq %r9,%r8 adoxq %r9,%r9 adcq $0,%r9 addq %rcx,%r11 adcq %rbp,%r12 mulxq %r15,%rcx,%rbp movq 24(%rbx),%rdx adcq %rcx,%r13 adcq %rbp,%r8 adcq $0,%r9 xorq %r10,%r10 mulxq 0+128(%rsi),%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq 8+128(%rsi),%rcx,%rbp adcxq %rcx,%r12 adoxq %rbp,%r13 mulxq 16+128(%rsi),%rcx,%rbp adcxq %rcx,%r13 adoxq %rbp,%r8 mulxq 24+128(%rsi),%rcx,%rbp movq %r11,%rdx adcxq %rcx,%r8 shlxq %r14,%r11,%rcx adoxq %rbp,%r9 shrxq %r14,%r11,%rbp adcxq %r10,%r9 adoxq %r10,%r10 adcq $0,%r10 addq %rcx,%r12 adcq %rbp,%r13 mulxq %r15,%rcx,%rbp movq %r12,%rbx movq L$poly+8(%rip),%r14 adcq %rcx,%r8 movq %r13,%rdx adcq %rbp,%r9 adcq $0,%r10 xorl %eax,%eax movq %r8,%rcx sbbq $-1,%r12 sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%rbp sbbq %r15,%r9 sbbq $0,%r10 cmovcq %rbx,%r12 cmovcq %rdx,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %rbp,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_sqr_montx: mulxq %r14,%r9,%r10 mulxq %r15,%rcx,%r11 xorl %eax,%eax adcq %rcx,%r10 mulxq %r8,%rbp,%r12 movq %r14,%rdx adcq %rbp,%r11 adcq $0,%r12 xorq %r13,%r13 mulxq %r15,%rcx,%rbp adcxq %rcx,%r11 adoxq %rbp,%r12 mulxq %r8,%rcx,%rbp movq %r15,%rdx adcxq %rcx,%r12 adoxq %rbp,%r13 adcq $0,%r13 mulxq %r8,%rcx,%r14 movq 0+128(%rsi),%rdx xorq %r15,%r15 adcxq %r9,%r9 adoxq %rcx,%r13 adcxq %r10,%r10 adoxq %r15,%r14 mulxq %rdx,%r8,%rbp movq 8+128(%rsi),%rdx adcxq %r11,%r11 adoxq %rbp,%r9 adcxq %r12,%r12 mulxq %rdx,%rcx,%rax movq 16+128(%rsi),%rdx adcxq %r13,%r13 adoxq %rcx,%r10 adcxq %r14,%r14 .byte 0x67 mulxq %rdx,%rcx,%rbp movq 24+128(%rsi),%rdx adoxq %rax,%r11 adcxq %r15,%r15 adoxq %rcx,%r12 movq $32,%rsi adoxq %rbp,%r13 .byte 0x67,0x67 mulxq %rdx,%rcx,%rax movq L$poly+24(%rip),%rdx adoxq %rcx,%r14 shlxq %rsi,%r8,%rcx adoxq %rax,%r15 shrxq %rsi,%r8,%rax movq %rdx,%rbp addq %rcx,%r9 adcq %rax,%r10 mulxq %r8,%rcx,%r8 adcq %rcx,%r11 shlxq %rsi,%r9,%rcx adcq $0,%r8 shrxq %rsi,%r9,%rax addq %rcx,%r10 adcq %rax,%r11 mulxq %r9,%rcx,%r9 adcq %rcx,%r8 shlxq %rsi,%r10,%rcx adcq $0,%r9 shrxq %rsi,%r10,%rax addq %rcx,%r11 adcq %rax,%r8 mulxq %r10,%rcx,%r10 adcq %rcx,%r9 shlxq %rsi,%r11,%rcx adcq $0,%r10 shrxq %rsi,%r11,%rax addq %rcx,%r8 adcq %rax,%r9 mulxq %r11,%rcx,%r11 adcq %rcx,%r10 adcq $0,%r11 xorq %rdx,%rdx addq %r8,%r12 movq L$poly+8(%rip),%rsi adcq %r9,%r13 movq %r12,%r8 adcq %r10,%r14 adcq %r11,%r15 movq %r13,%r9 adcq $0,%rdx subq $-1,%r12 movq %r14,%r10 sbbq %rsi,%r13 sbbq $0,%r14 movq %r15,%r11 sbbq %rbp,%r15 sbbq $0,%rdx cmovcq %r8,%r12 cmovcq %r9,%r13 movq %r12,0(%rdi) cmovcq %r10,%r14 movq %r13,8(%rdi) cmovcq %r11,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) .byte 0xf3,0xc3 .globl _GFp_nistz256_select_w5 .private_extern _GFp_nistz256_select_w5 .p2align 5 _GFp_nistz256_select_w5: leaq _GFp_ia32cap_P(%rip),%rax movq 8(%rax),%rax testl $32,%eax jnz L$avx2_select_w5 movdqa L$One(%rip),%xmm0 movd %edx,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 movdqa %xmm0,%xmm8 pshufd $0,%xmm1,%xmm1 movq $16,%rax L$select_loop_sse_w5: movdqa %xmm8,%xmm15 paddd %xmm0,%xmm8 pcmpeqd %xmm1,%xmm15 movdqa 0(%rsi),%xmm9 movdqa 16(%rsi),%xmm10 movdqa 32(%rsi),%xmm11 movdqa 48(%rsi),%xmm12 movdqa 64(%rsi),%xmm13 movdqa 80(%rsi),%xmm14 leaq 96(%rsi),%rsi pand %xmm15,%xmm9 pand %xmm15,%xmm10 por %xmm9,%xmm2 pand %xmm15,%xmm11 por %xmm10,%xmm3 pand %xmm15,%xmm12 por %xmm11,%xmm4 pand %xmm15,%xmm13 por %xmm12,%xmm5 pand %xmm15,%xmm14 por %xmm13,%xmm6 por %xmm14,%xmm7 decq %rax jnz L$select_loop_sse_w5 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqu %xmm4,32(%rdi) movdqu %xmm5,48(%rdi) movdqu %xmm6,64(%rdi) movdqu %xmm7,80(%rdi) .byte 0xf3,0xc3 L$SEH_end_GFp_nistz256_select_w5: .globl _GFp_nistz256_select_w7 .private_extern _GFp_nistz256_select_w7 .p2align 5 _GFp_nistz256_select_w7: leaq _GFp_ia32cap_P(%rip),%rax movq 8(%rax),%rax testl $32,%eax jnz L$avx2_select_w7 movdqa L$One(%rip),%xmm8 movd %edx,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa %xmm8,%xmm0 pshufd $0,%xmm1,%xmm1 movq $64,%rax L$select_loop_sse_w7: movdqa %xmm8,%xmm15 paddd %xmm0,%xmm8 movdqa 0(%rsi),%xmm9 movdqa 16(%rsi),%xmm10 pcmpeqd %xmm1,%xmm15 movdqa 32(%rsi),%xmm11 movdqa 48(%rsi),%xmm12 leaq 64(%rsi),%rsi pand %xmm15,%xmm9 pand %xmm15,%xmm10 por %xmm9,%xmm2 pand %xmm15,%xmm11 por %xmm10,%xmm3 pand %xmm15,%xmm12 por %xmm11,%xmm4 prefetcht0 255(%rsi) por %xmm12,%xmm5 decq %rax jnz L$select_loop_sse_w7 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqu %xmm4,32(%rdi) movdqu %xmm5,48(%rdi) .byte 0xf3,0xc3 L$SEH_end_GFp_nistz256_select_w7: .p2align 5 GFp_nistz256_avx2_select_w5: L$avx2_select_w5: vzeroupper vmovdqa L$Two(%rip),%ymm0 vpxor %ymm2,%ymm2,%ymm2 vpxor %ymm3,%ymm3,%ymm3 vpxor %ymm4,%ymm4,%ymm4 vmovdqa L$One(%rip),%ymm5 vmovdqa L$Two(%rip),%ymm10 vmovd %edx,%xmm1 vpermd %ymm1,%ymm2,%ymm1 movq $8,%rax L$select_loop_avx2_w5: vmovdqa 0(%rsi),%ymm6 vmovdqa 32(%rsi),%ymm7 vmovdqa 64(%rsi),%ymm8 vmovdqa 96(%rsi),%ymm11 vmovdqa 128(%rsi),%ymm12 vmovdqa 160(%rsi),%ymm13 vpcmpeqd %ymm1,%ymm5,%ymm9 vpcmpeqd %ymm1,%ymm10,%ymm14 vpaddd %ymm0,%ymm5,%ymm5 vpaddd %ymm0,%ymm10,%ymm10 leaq 192(%rsi),%rsi vpand %ymm9,%ymm6,%ymm6 vpand %ymm9,%ymm7,%ymm7 vpand %ymm9,%ymm8,%ymm8 vpand %ymm14,%ymm11,%ymm11 vpand %ymm14,%ymm12,%ymm12 vpand %ymm14,%ymm13,%ymm13 vpxor %ymm6,%ymm2,%ymm2 vpxor %ymm7,%ymm3,%ymm3 vpxor %ymm8,%ymm4,%ymm4 vpxor %ymm11,%ymm2,%ymm2 vpxor %ymm12,%ymm3,%ymm3 vpxor %ymm13,%ymm4,%ymm4 decq %rax jnz L$select_loop_avx2_w5 vmovdqu %ymm2,0(%rdi) vmovdqu %ymm3,32(%rdi) vmovdqu %ymm4,64(%rdi) vzeroupper .byte 0xf3,0xc3 L$SEH_end_GFp_nistz256_avx2_select_w5: .globl _GFp_nistz256_avx2_select_w7 .private_extern _GFp_nistz256_avx2_select_w7 .p2align 5 _GFp_nistz256_avx2_select_w7: L$avx2_select_w7: vzeroupper vmovdqa L$Three(%rip),%ymm0 vpxor %ymm2,%ymm2,%ymm2 vpxor %ymm3,%ymm3,%ymm3 vmovdqa L$One(%rip),%ymm4 vmovdqa L$Two(%rip),%ymm8 vmovdqa L$Three(%rip),%ymm12 vmovd %edx,%xmm1 vpermd %ymm1,%ymm2,%ymm1 movq $21,%rax L$select_loop_avx2_w7: vmovdqa 0(%rsi),%ymm5 vmovdqa 32(%rsi),%ymm6 vmovdqa 64(%rsi),%ymm9 vmovdqa 96(%rsi),%ymm10 vmovdqa 128(%rsi),%ymm13 vmovdqa 160(%rsi),%ymm14 vpcmpeqd %ymm1,%ymm4,%ymm7 vpcmpeqd %ymm1,%ymm8,%ymm11 vpcmpeqd %ymm1,%ymm12,%ymm15 vpaddd %ymm0,%ymm4,%ymm4 vpaddd %ymm0,%ymm8,%ymm8 vpaddd %ymm0,%ymm12,%ymm12 leaq 192(%rsi),%rsi vpand %ymm7,%ymm5,%ymm5 vpand %ymm7,%ymm6,%ymm6 vpand %ymm11,%ymm9,%ymm9 vpand %ymm11,%ymm10,%ymm10 vpand %ymm15,%ymm13,%ymm13 vpand %ymm15,%ymm14,%ymm14 vpxor %ymm5,%ymm2,%ymm2 vpxor %ymm6,%ymm3,%ymm3 vpxor %ymm9,%ymm2,%ymm2 vpxor %ymm10,%ymm3,%ymm3 vpxor %ymm13,%ymm2,%ymm2 vpxor %ymm14,%ymm3,%ymm3 decq %rax jnz L$select_loop_avx2_w7 vmovdqa 0(%rsi),%ymm5 vmovdqa 32(%rsi),%ymm6 vpcmpeqd %ymm1,%ymm4,%ymm7 vpand %ymm7,%ymm5,%ymm5 vpand %ymm7,%ymm6,%ymm6 vpxor %ymm5,%ymm2,%ymm2 vpxor %ymm6,%ymm3,%ymm3 vmovdqu %ymm2,0(%rdi) vmovdqu %ymm3,32(%rdi) vzeroupper .byte 0xf3,0xc3 L$SEH_end_GFp_nistz256_avx2_select_w7: .p2align 5 __ecp_nistz256_add_toq: xorq %r11,%r11 addq 0(%rbx),%r12 adcq 8(%rbx),%r13 movq %r12,%rax adcq 16(%rbx),%r8 adcq 24(%rbx),%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_sub_fromq: subq 0(%rbx),%r12 sbbq 8(%rbx),%r13 movq %r12,%rax sbbq 16(%rbx),%r8 sbbq 24(%rbx),%r9 movq %r13,%rbp sbbq %r11,%r11 addq $-1,%r12 movq %r8,%rcx adcq %r14,%r13 adcq $0,%r8 movq %r9,%r10 adcq %r15,%r9 testq %r11,%r11 cmovzq %rax,%r12 cmovzq %rbp,%r13 movq %r12,0(%rdi) cmovzq %rcx,%r8 movq %r13,8(%rdi) cmovzq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_subq: subq %r12,%rax sbbq %r13,%rbp movq %rax,%r12 sbbq %r8,%rcx sbbq %r9,%r10 movq %rbp,%r13 sbbq %r11,%r11 addq $-1,%rax movq %rcx,%r8 adcq %r14,%rbp adcq $0,%rcx movq %r10,%r9 adcq %r15,%r10 testq %r11,%r11 cmovnzq %rax,%r12 cmovnzq %rbp,%r13 cmovnzq %rcx,%r8 cmovnzq %r10,%r9 .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_mul_by_2q: xorq %r11,%r11 addq %r12,%r12 adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .globl _GFp_nistz256_point_double .private_extern _GFp_nistz256_point_double .p2align 5 _GFp_nistz256_point_double: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je L$point_doublex pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $160+8,%rsp L$point_doubleq_body: L$point_double_shortcutq: movdqu 0(%rsi),%xmm0 movq %rsi,%rbx movdqu 16(%rsi),%xmm1 movq 32+0(%rsi),%r12 movq 32+8(%rsi),%r13 movq 32+16(%rsi),%r8 movq 32+24(%rsi),%r9 movq L$poly+8(%rip),%r14 movq L$poly+24(%rip),%r15 movdqa %xmm0,96(%rsp) movdqa %xmm1,96+16(%rsp) leaq 32(%rdi),%r10 leaq 64(%rdi),%r11 .byte 102,72,15,110,199 .byte 102,73,15,110,202 .byte 102,73,15,110,211 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_by_2q movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 leaq 64-0(%rsi),%rsi leaq 64(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 0(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 32(%rbx),%rax movq 64+0(%rbx),%r9 movq 64+8(%rbx),%r10 movq 64+16(%rbx),%r11 movq 64+24(%rbx),%r12 leaq 64-0(%rbx),%rsi leaq 32(%rbx),%rbx .byte 102,72,15,126,215 call __ecp_nistz256_mul_montq call __ecp_nistz256_mul_by_2q movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 32(%rsp),%rdi call __ecp_nistz256_add_toq movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 .byte 102,72,15,126,207 call __ecp_nistz256_sqr_montq xorq %r9,%r9 movq %r12,%rax addq $-1,%r12 movq %r13,%r10 adcq %rsi,%r13 movq %r14,%rcx adcq $0,%r14 movq %r15,%r8 adcq %rbp,%r15 adcq $0,%r9 xorq %rsi,%rsi testq $1,%rax cmovzq %rax,%r12 cmovzq %r10,%r13 cmovzq %rcx,%r14 cmovzq %r8,%r15 cmovzq %rsi,%r9 movq %r13,%rax shrq $1,%r12 shlq $63,%rax movq %r14,%r10 shrq $1,%r13 orq %rax,%r12 shlq $63,%r10 movq %r15,%rcx shrq $1,%r14 orq %r10,%r13 shlq $63,%rcx movq %r12,0(%rdi) shrq $1,%r15 movq %r13,8(%rdi) shlq $63,%r9 orq %rcx,%r14 orq %r9,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) movq 64(%rsp),%rax leaq 64(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2q leaq 32(%rsp),%rbx leaq 32(%rsp),%rdi call __ecp_nistz256_add_toq movq 96(%rsp),%rax leaq 96(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2q movq 0+32(%rsp),%rax movq 8+32(%rsp),%r14 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r15 movq 24+32(%rsp),%r8 .byte 102,72,15,126,199 call __ecp_nistz256_sqr_montq leaq 128(%rsp),%rbx movq %r14,%r8 movq %r15,%r9 movq %rsi,%r14 movq %rbp,%r15 call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 0(%rsp),%rdi call __ecp_nistz256_subq movq 32(%rsp),%rax leaq 32(%rsp),%rbx movq %r12,%r14 xorl %ecx,%ecx movq %r12,0+0(%rsp) movq %r13,%r10 movq %r13,0+8(%rsp) cmovzq %r8,%r11 movq %r8,0+16(%rsp) leaq 0-0(%rsp),%rsi cmovzq %r9,%r12 movq %r9,0+24(%rsp) movq %r14,%r9 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq .byte 102,72,15,126,203 .byte 102,72,15,126,207 call __ecp_nistz256_sub_fromq leaq 160+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$point_doubleq_epilogue: .byte 0xf3,0xc3 .globl _GFp_nistz256_point_add .private_extern _GFp_nistz256_point_add .p2align 5 _GFp_nistz256_point_add: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je L$point_addx pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $576+8,%rsp L$point_addq_body: movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq %rsi,%rbx movq %rdx,%rsi movdqa %xmm0,384(%rsp) movdqa %xmm1,384+16(%rsp) movdqa %xmm2,416(%rsp) movdqa %xmm3,416+16(%rsp) movdqa %xmm4,448(%rsp) movdqa %xmm5,448+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rsi),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 por %xmm3,%xmm5 movdqu 48(%rsi),%xmm3 movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,480(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,480+16(%rsp) movdqu 64(%rsi),%xmm0 movdqu 80(%rsi),%xmm1 movdqa %xmm2,512(%rsp) movdqa %xmm3,512+16(%rsp) por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm0,%xmm1 .byte 102,72,15,110,199 leaq 64-0(%rsi),%rsi movq %rax,544+0(%rsp) movq %r14,544+8(%rsp) movq %r15,544+16(%rsp) movq %r8,544+24(%rsp) leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montq pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm1,%xmm4 por %xmm1,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 por %xmm3,%xmm4 pxor %xmm3,%xmm3 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 movq 64+0(%rbx),%rax movq 64+8(%rbx),%r14 movq 64+16(%rbx),%r15 movq 64+24(%rbx),%r8 .byte 102,72,15,110,203 leaq 64-0(%rbx),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 544(%rsp),%rax leaq 544(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq movq 416(%rsp),%rax leaq 416(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq 0+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montq movq 512(%rsp),%rax leaq 512(%rsp),%rbx movq 0+256(%rsp),%r9 movq 8+256(%rsp),%r10 leaq 0+256(%rsp),%rsi movq 16+256(%rsp),%r11 movq 24+256(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 224(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq orq %r13,%r12 movdqa %xmm4,%xmm2 orq %r8,%r12 orq %r9,%r12 por %xmm5,%xmm2 .byte 102,73,15,110,220 movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montq movq 480(%rsp),%rax leaq 480(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 160(%rsp),%rbx leaq 0(%rsp),%rdi call __ecp_nistz256_sub_fromq orq %r13,%r12 orq %r8,%r12 orq %r9,%r12 .byte 102,73,15,126,208 .byte 102,73,15,126,217 orq %r8,%r12 .byte 0x3e jnz L$add_proceedq testq %r9,%r9 jz L$add_doubleq .byte 102,72,15,126,199 pxor %xmm0,%xmm0 movdqu %xmm0,0(%rdi) movdqu %xmm0,16(%rdi) movdqu %xmm0,32(%rdi) movdqu %xmm0,48(%rdi) movdqu %xmm0,64(%rdi) movdqu %xmm0,80(%rdi) jmp L$add_doneq .p2align 5 L$add_doubleq: .byte 102,72,15,126,206 .byte 102,72,15,126,199 addq $416,%rsp jmp L$point_double_shortcutq .p2align 5 L$add_proceedq: movq 0+64(%rsp),%rax movq 8+64(%rsp),%r14 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montq movq 0+0(%rsp),%rax movq 8+0(%rsp),%r14 leaq 0+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 544(%rsp),%rax leaq 544(%rsp),%rbx movq 0+352(%rsp),%r9 movq 8+352(%rsp),%r10 leaq 0+352(%rsp),%rsi movq 16+352(%rsp),%r11 movq 24+352(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montq movq 0(%rsp),%rax leaq 0(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 128(%rsp),%rdi call __ecp_nistz256_mul_montq movq 160(%rsp),%rax leaq 160(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montq xorq %r11,%r11 addq %r12,%r12 leaq 96(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subq leaq 128(%rsp),%rbx leaq 288(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 192+0(%rsp),%rax movq 192+8(%rsp),%rbp movq 192+16(%rsp),%rcx movq 192+24(%rsp),%r10 leaq 320(%rsp),%rdi call __ecp_nistz256_subq movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 128(%rsp),%rax leaq 128(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq 0+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montq movq 320(%rsp),%rax leaq 320(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 320(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 256(%rsp),%rbx leaq 320(%rsp),%rdi call __ecp_nistz256_sub_fromq .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 352(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 352+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 544(%rsp),%xmm2 pand 544+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 480(%rsp),%xmm2 pand 480+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 320(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 320+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 512(%rsp),%xmm2 pand 512+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) L$add_doneq: leaq 576+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$point_addq_epilogue: .byte 0xf3,0xc3 .globl _GFp_nistz256_point_add_affine .private_extern _GFp_nistz256_point_add_affine .p2align 5 _GFp_nistz256_point_add_affine: leaq _GFp_ia32cap_P(%rip),%rcx movq 8(%rcx),%rcx andl $0x80100,%ecx cmpl $0x80100,%ecx je L$point_add_affinex pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $480+8,%rsp L$add_affineq_body: movdqu 0(%rsi),%xmm0 movq %rdx,%rbx movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq 64+0(%rsi),%rax movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,320(%rsp) movdqa %xmm1,320+16(%rsp) movdqa %xmm2,352(%rsp) movdqa %xmm3,352+16(%rsp) movdqa %xmm4,384(%rsp) movdqa %xmm5,384+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rbx),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rbx),%xmm1 movdqu 32(%rbx),%xmm2 por %xmm3,%xmm5 movdqu 48(%rbx),%xmm3 movdqa %xmm0,416(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,416+16(%rsp) por %xmm0,%xmm1 .byte 102,72,15,110,199 movdqa %xmm2,448(%rsp) movdqa %xmm3,448+16(%rsp) por %xmm2,%xmm3 por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm1,%xmm3 leaq 64-0(%rsi),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montq pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm3,%xmm4 movq 0(%rbx),%rax movq %r12,%r9 por %xmm3,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 movq %r13,%r10 por %xmm3,%xmm4 pxor %xmm3,%xmm3 movq %r14,%r11 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 leaq 32-0(%rsp),%rsi movq %r15,%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 320(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq movq 384(%rsp),%rax leaq 384(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 288(%rsp),%rdi call __ecp_nistz256_mul_montq movq 448(%rsp),%rax leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq 0+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 352(%rsp),%rbx leaq 96(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+64(%rsp),%rax movq 8+64(%rsp),%r14 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 128(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 0+96(%rsp),%rax movq 8+96(%rsp),%r14 leaq 0+96(%rsp),%rsi movq 16+96(%rsp),%r15 movq 24+96(%rsp),%r8 leaq 192(%rsp),%rdi call __ecp_nistz256_sqr_montq movq 128(%rsp),%rax leaq 128(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montq movq 320(%rsp),%rax leaq 320(%rsp),%rbx movq 0+128(%rsp),%r9 movq 8+128(%rsp),%r10 leaq 0+128(%rsp),%rsi movq 16+128(%rsp),%r11 movq 24+128(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montq xorq %r11,%r11 addq %r12,%r12 leaq 192(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subq leaq 160(%rsp),%rbx leaq 224(%rsp),%rdi call __ecp_nistz256_sub_fromq movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 64(%rsp),%rdi call __ecp_nistz256_subq movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 352(%rsp),%rax leaq 352(%rsp),%rbx movq 0+160(%rsp),%r9 movq 8+160(%rsp),%r10 leaq 0+160(%rsp),%rsi movq 16+160(%rsp),%r11 movq 24+160(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montq movq 96(%rsp),%rax leaq 96(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq 0+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 64(%rsp),%rdi call __ecp_nistz256_mul_montq leaq 32(%rsp),%rbx leaq 256(%rsp),%rdi call __ecp_nistz256_sub_fromq .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand L$ONE_mont(%rip),%xmm2 pand L$ONE_mont+16(%rip),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 224(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 224+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 320(%rsp),%xmm2 pand 320+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 256(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 256+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 352(%rsp),%xmm2 pand 352+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 480+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$add_affineq_epilogue: .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_add_tox: xorq %r11,%r11 adcq 0(%rbx),%r12 adcq 8(%rbx),%r13 movq %r12,%rax adcq 16(%rbx),%r8 adcq 24(%rbx),%r9 movq %r13,%rbp adcq $0,%r11 xorq %r10,%r10 sbbq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_sub_fromx: xorq %r11,%r11 sbbq 0(%rbx),%r12 sbbq 8(%rbx),%r13 movq %r12,%rax sbbq 16(%rbx),%r8 sbbq 24(%rbx),%r9 movq %r13,%rbp sbbq $0,%r11 xorq %r10,%r10 adcq $-1,%r12 movq %r8,%rcx adcq %r14,%r13 adcq $0,%r8 movq %r9,%r10 adcq %r15,%r9 btq $0,%r11 cmovncq %rax,%r12 cmovncq %rbp,%r13 movq %r12,0(%rdi) cmovncq %rcx,%r8 movq %r13,8(%rdi) cmovncq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_subx: xorq %r11,%r11 sbbq %r12,%rax sbbq %r13,%rbp movq %rax,%r12 sbbq %r8,%rcx sbbq %r9,%r10 movq %rbp,%r13 sbbq $0,%r11 xorq %r9,%r9 adcq $-1,%rax movq %rcx,%r8 adcq %r14,%rbp adcq $0,%rcx movq %r10,%r9 adcq %r15,%r10 btq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 cmovcq %rcx,%r8 cmovcq %r10,%r9 .byte 0xf3,0xc3 .p2align 5 __ecp_nistz256_mul_by_2x: xorq %r11,%r11 adcq %r12,%r12 adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 xorq %r10,%r10 sbbq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 cmovcq %rbp,%r13 movq %r12,0(%rdi) cmovcq %rcx,%r8 movq %r13,8(%rdi) cmovcq %r10,%r9 movq %r8,16(%rdi) movq %r9,24(%rdi) .byte 0xf3,0xc3 .p2align 5 GFp_nistz256_point_doublex: L$point_doublex: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $160+8,%rsp L$point_doublex_body: L$point_double_shortcutx: movdqu 0(%rsi),%xmm0 movq %rsi,%rbx movdqu 16(%rsi),%xmm1 movq 32+0(%rsi),%r12 movq 32+8(%rsi),%r13 movq 32+16(%rsi),%r8 movq 32+24(%rsi),%r9 movq L$poly+8(%rip),%r14 movq L$poly+24(%rip),%r15 movdqa %xmm0,96(%rsp) movdqa %xmm1,96+16(%rsp) leaq 32(%rdi),%r10 leaq 64(%rdi),%r11 .byte 102,72,15,110,199 .byte 102,73,15,110,202 .byte 102,73,15,110,211 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_by_2x movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 leaq 64-128(%rsi),%rsi leaq 64(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 0(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 32(%rbx),%rdx movq 64+0(%rbx),%r9 movq 64+8(%rbx),%r10 movq 64+16(%rbx),%r11 movq 64+24(%rbx),%r12 leaq 64-128(%rbx),%rsi leaq 32(%rbx),%rbx .byte 102,72,15,126,215 call __ecp_nistz256_mul_montx call __ecp_nistz256_mul_by_2x movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 32(%rsp),%rdi call __ecp_nistz256_add_tox movq 96+0(%rsp),%r12 movq 96+8(%rsp),%r13 leaq 64(%rsp),%rbx movq 96+16(%rsp),%r8 movq 96+24(%rsp),%r9 leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 .byte 102,72,15,126,207 call __ecp_nistz256_sqr_montx xorq %r9,%r9 movq %r12,%rax addq $-1,%r12 movq %r13,%r10 adcq %rsi,%r13 movq %r14,%rcx adcq $0,%r14 movq %r15,%r8 adcq %rbp,%r15 adcq $0,%r9 xorq %rsi,%rsi testq $1,%rax cmovzq %rax,%r12 cmovzq %r10,%r13 cmovzq %rcx,%r14 cmovzq %r8,%r15 cmovzq %rsi,%r9 movq %r13,%rax shrq $1,%r12 shlq $63,%rax movq %r14,%r10 shrq $1,%r13 orq %rax,%r12 shlq $63,%r10 movq %r15,%rcx shrq $1,%r14 orq %r10,%r13 shlq $63,%rcx movq %r12,0(%rdi) shrq $1,%r15 movq %r13,8(%rdi) shlq $63,%r9 orq %rcx,%r14 orq %r9,%r15 movq %r14,16(%rdi) movq %r15,24(%rdi) movq 64(%rsp),%rdx leaq 64(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2x leaq 32(%rsp),%rbx leaq 32(%rsp),%rdi call __ecp_nistz256_add_tox movq 96(%rsp),%rdx leaq 96(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 128(%rsp),%rdi call __ecp_nistz256_mul_by_2x movq 0+32(%rsp),%rdx movq 8+32(%rsp),%r14 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r15 movq 24+32(%rsp),%r8 .byte 102,72,15,126,199 call __ecp_nistz256_sqr_montx leaq 128(%rsp),%rbx movq %r14,%r8 movq %r15,%r9 movq %rsi,%r14 movq %rbp,%r15 call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 0(%rsp),%rdi call __ecp_nistz256_subx movq 32(%rsp),%rdx leaq 32(%rsp),%rbx movq %r12,%r14 xorl %ecx,%ecx movq %r12,0+0(%rsp) movq %r13,%r10 movq %r13,0+8(%rsp) cmovzq %r8,%r11 movq %r8,0+16(%rsp) leaq 0-128(%rsp),%rsi cmovzq %r9,%r12 movq %r9,0+24(%rsp) movq %r14,%r9 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx .byte 102,72,15,126,203 .byte 102,72,15,126,207 call __ecp_nistz256_sub_fromx leaq 160+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$point_doublex_epilogue: .byte 0xf3,0xc3 .p2align 5 GFp_nistz256_point_addx: L$point_addx: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $576+8,%rsp L$point_addx_body: movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq %rsi,%rbx movq %rdx,%rsi movdqa %xmm0,384(%rsp) movdqa %xmm1,384+16(%rsp) movdqa %xmm2,416(%rsp) movdqa %xmm3,416+16(%rsp) movdqa %xmm4,448(%rsp) movdqa %xmm5,448+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rsi),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 por %xmm3,%xmm5 movdqu 48(%rsi),%xmm3 movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,480(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,480+16(%rsp) movdqu 64(%rsi),%xmm0 movdqu 80(%rsi),%xmm1 movdqa %xmm2,512(%rsp) movdqa %xmm3,512+16(%rsp) por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm0,%xmm1 .byte 102,72,15,110,199 leaq 64-128(%rsi),%rsi movq %rdx,544+0(%rsp) movq %r14,544+8(%rsp) movq %r15,544+16(%rsp) movq %r8,544+24(%rsp) leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montx pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm1,%xmm4 por %xmm1,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 por %xmm3,%xmm4 pxor %xmm3,%xmm3 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 movq 64+0(%rbx),%rdx movq 64+8(%rbx),%r14 movq 64+16(%rbx),%r15 movq 64+24(%rbx),%r8 .byte 102,72,15,110,203 leaq 64-128(%rbx),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 544(%rsp),%rdx leaq 544(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx movq 416(%rsp),%rdx leaq 416(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq -128+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 224(%rsp),%rdi call __ecp_nistz256_mul_montx movq 512(%rsp),%rdx leaq 512(%rsp),%rbx movq 0+256(%rsp),%r9 movq 8+256(%rsp),%r10 leaq -128+256(%rsp),%rsi movq 16+256(%rsp),%r11 movq 24+256(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 224(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx orq %r13,%r12 movdqa %xmm4,%xmm2 orq %r8,%r12 orq %r9,%r12 por %xmm5,%xmm2 .byte 102,73,15,110,220 movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+96(%rsp),%r9 movq 8+96(%rsp),%r10 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r11 movq 24+96(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montx movq 480(%rsp),%rdx leaq 480(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 160(%rsp),%rbx leaq 0(%rsp),%rdi call __ecp_nistz256_sub_fromx orq %r13,%r12 orq %r8,%r12 orq %r9,%r12 .byte 102,73,15,126,208 .byte 102,73,15,126,217 orq %r8,%r12 .byte 0x3e jnz L$add_proceedx testq %r9,%r9 jz L$add_doublex .byte 102,72,15,126,199 pxor %xmm0,%xmm0 movdqu %xmm0,0(%rdi) movdqu %xmm0,16(%rdi) movdqu %xmm0,32(%rdi) movdqu %xmm0,48(%rdi) movdqu %xmm0,64(%rdi) movdqu %xmm0,80(%rdi) jmp L$add_donex .p2align 5 L$add_doublex: .byte 102,72,15,126,206 .byte 102,72,15,126,199 addq $416,%rsp jmp L$point_double_shortcutx .p2align 5 L$add_proceedx: movq 0+64(%rsp),%rdx movq 8+64(%rsp),%r14 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 96(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+0(%rsp),%r9 movq 8+0(%rsp),%r10 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r11 movq 24+0(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montx movq 0+0(%rsp),%rdx movq 8+0(%rsp),%r14 leaq -128+0(%rsp),%rsi movq 16+0(%rsp),%r15 movq 24+0(%rsp),%r8 leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 544(%rsp),%rdx leaq 544(%rsp),%rbx movq 0+352(%rsp),%r9 movq 8+352(%rsp),%r10 leaq -128+352(%rsp),%rsi movq 16+352(%rsp),%r11 movq 24+352(%rsp),%r12 leaq 352(%rsp),%rdi call __ecp_nistz256_mul_montx movq 0(%rsp),%rdx leaq 0(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 128(%rsp),%rdi call __ecp_nistz256_mul_montx movq 160(%rsp),%rdx leaq 160(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 192(%rsp),%rdi call __ecp_nistz256_mul_montx xorq %r11,%r11 addq %r12,%r12 leaq 96(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subx leaq 128(%rsp),%rbx leaq 288(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 192+0(%rsp),%rax movq 192+8(%rsp),%rbp movq 192+16(%rsp),%rcx movq 192+24(%rsp),%r10 leaq 320(%rsp),%rdi call __ecp_nistz256_subx movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 128(%rsp),%rdx leaq 128(%rsp),%rbx movq 0+224(%rsp),%r9 movq 8+224(%rsp),%r10 leaq -128+224(%rsp),%rsi movq 16+224(%rsp),%r11 movq 24+224(%rsp),%r12 leaq 256(%rsp),%rdi call __ecp_nistz256_mul_montx movq 320(%rsp),%rdx leaq 320(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 320(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 256(%rsp),%rbx leaq 320(%rsp),%rdi call __ecp_nistz256_sub_fromx .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 352(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 352+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 544(%rsp),%xmm2 pand 544+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 480(%rsp),%xmm2 pand 480+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 320(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 320+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 512(%rsp),%xmm2 pand 512+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) L$add_donex: leaq 576+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$point_addx_epilogue: .byte 0xf3,0xc3 .p2align 5 GFp_nistz256_point_add_affinex: L$point_add_affinex: pushq %rbp pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 subq $480+8,%rsp L$add_affinex_body: movdqu 0(%rsi),%xmm0 movq %rdx,%rbx movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 movdqu 48(%rsi),%xmm3 movdqu 64(%rsi),%xmm4 movdqu 80(%rsi),%xmm5 movq 64+0(%rsi),%rdx movq 64+8(%rsi),%r14 movq 64+16(%rsi),%r15 movq 64+24(%rsi),%r8 movdqa %xmm0,320(%rsp) movdqa %xmm1,320+16(%rsp) movdqa %xmm2,352(%rsp) movdqa %xmm3,352+16(%rsp) movdqa %xmm4,384(%rsp) movdqa %xmm5,384+16(%rsp) por %xmm4,%xmm5 movdqu 0(%rbx),%xmm0 pshufd $0xb1,%xmm5,%xmm3 movdqu 16(%rbx),%xmm1 movdqu 32(%rbx),%xmm2 por %xmm3,%xmm5 movdqu 48(%rbx),%xmm3 movdqa %xmm0,416(%rsp) pshufd $0x1e,%xmm5,%xmm4 movdqa %xmm1,416+16(%rsp) por %xmm0,%xmm1 .byte 102,72,15,110,199 movdqa %xmm2,448(%rsp) movdqa %xmm3,448+16(%rsp) por %xmm2,%xmm3 por %xmm4,%xmm5 pxor %xmm4,%xmm4 por %xmm1,%xmm3 leaq 64-128(%rsi),%rsi leaq 32(%rsp),%rdi call __ecp_nistz256_sqr_montx pcmpeqd %xmm4,%xmm5 pshufd $0xb1,%xmm3,%xmm4 movq 0(%rbx),%rdx movq %r12,%r9 por %xmm3,%xmm4 pshufd $0,%xmm5,%xmm5 pshufd $0x1e,%xmm4,%xmm3 movq %r13,%r10 por %xmm3,%xmm4 pxor %xmm3,%xmm3 movq %r14,%r11 pcmpeqd %xmm3,%xmm4 pshufd $0,%xmm4,%xmm4 leaq 32-128(%rsp),%rsi movq %r15,%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 320(%rsp),%rbx leaq 64(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx movq 384(%rsp),%rdx leaq 384(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 288(%rsp),%rdi call __ecp_nistz256_mul_montx movq 448(%rsp),%rdx leaq 448(%rsp),%rbx movq 0+32(%rsp),%r9 movq 8+32(%rsp),%r10 leaq -128+32(%rsp),%rsi movq 16+32(%rsp),%r11 movq 24+32(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 352(%rsp),%rbx leaq 96(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+64(%rsp),%rdx movq 8+64(%rsp),%r14 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r15 movq 24+64(%rsp),%r8 leaq 128(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 0+96(%rsp),%rdx movq 8+96(%rsp),%r14 leaq -128+96(%rsp),%rsi movq 16+96(%rsp),%r15 movq 24+96(%rsp),%r8 leaq 192(%rsp),%rdi call __ecp_nistz256_sqr_montx movq 128(%rsp),%rdx leaq 128(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 160(%rsp),%rdi call __ecp_nistz256_mul_montx movq 320(%rsp),%rdx leaq 320(%rsp),%rbx movq 0+128(%rsp),%r9 movq 8+128(%rsp),%r10 leaq -128+128(%rsp),%rsi movq 16+128(%rsp),%r11 movq 24+128(%rsp),%r12 leaq 0(%rsp),%rdi call __ecp_nistz256_mul_montx xorq %r11,%r11 addq %r12,%r12 leaq 192(%rsp),%rsi adcq %r13,%r13 movq %r12,%rax adcq %r8,%r8 adcq %r9,%r9 movq %r13,%rbp adcq $0,%r11 subq $-1,%r12 movq %r8,%rcx sbbq %r14,%r13 sbbq $0,%r8 movq %r9,%r10 sbbq %r15,%r9 sbbq $0,%r11 cmovcq %rax,%r12 movq 0(%rsi),%rax cmovcq %rbp,%r13 movq 8(%rsi),%rbp cmovcq %rcx,%r8 movq 16(%rsi),%rcx cmovcq %r10,%r9 movq 24(%rsi),%r10 call __ecp_nistz256_subx leaq 160(%rsp),%rbx leaq 224(%rsp),%rdi call __ecp_nistz256_sub_fromx movq 0+0(%rsp),%rax movq 0+8(%rsp),%rbp movq 0+16(%rsp),%rcx movq 0+24(%rsp),%r10 leaq 64(%rsp),%rdi call __ecp_nistz256_subx movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r8,16(%rdi) movq %r9,24(%rdi) movq 352(%rsp),%rdx leaq 352(%rsp),%rbx movq 0+160(%rsp),%r9 movq 8+160(%rsp),%r10 leaq -128+160(%rsp),%rsi movq 16+160(%rsp),%r11 movq 24+160(%rsp),%r12 leaq 32(%rsp),%rdi call __ecp_nistz256_mul_montx movq 96(%rsp),%rdx leaq 96(%rsp),%rbx movq 0+64(%rsp),%r9 movq 8+64(%rsp),%r10 leaq -128+64(%rsp),%rsi movq 16+64(%rsp),%r11 movq 24+64(%rsp),%r12 leaq 64(%rsp),%rdi call __ecp_nistz256_mul_montx leaq 32(%rsp),%rbx leaq 256(%rsp),%rdi call __ecp_nistz256_sub_fromx .byte 102,72,15,126,199 movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 288(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 288+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand L$ONE_mont(%rip),%xmm2 pand L$ONE_mont+16(%rip),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 384(%rsp),%xmm2 pand 384+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,64(%rdi) movdqu %xmm3,80(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 224(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 224+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 416(%rsp),%xmm2 pand 416+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 320(%rsp),%xmm2 pand 320+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,0(%rdi) movdqu %xmm3,16(%rdi) movdqa %xmm5,%xmm0 movdqa %xmm5,%xmm1 pandn 256(%rsp),%xmm0 movdqa %xmm5,%xmm2 pandn 256+16(%rsp),%xmm1 movdqa %xmm5,%xmm3 pand 448(%rsp),%xmm2 pand 448+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 pandn %xmm2,%xmm0 movdqa %xmm4,%xmm2 pandn %xmm3,%xmm1 movdqa %xmm4,%xmm3 pand 352(%rsp),%xmm2 pand 352+16(%rsp),%xmm3 por %xmm0,%xmm2 por %xmm1,%xmm3 movdqu %xmm2,32(%rdi) movdqu %xmm3,48(%rdi) leaq 480+56(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbx movq -8(%rsi),%rbp leaq (%rsi),%rsp L$add_affinex_epilogue: .byte 0xf3,0xc3 #endif ring-0.16.9/pregenerated/p256-x86_64-asm-nasm.obj000064400000000000000000001742371353224260300172550ustar0000000000000000dEi]Z.textDD p`.pdataDBEF3@0@.xdataD HI'@@@.debug$S*K @B.debug$T N@BQ%cʹOffffff.fH|$Ht$HHHLATAULM1LNLVL^H5LLJLLRLZLIL+LLNLVML^ILBLBLLBLOMBLWL_A]A\H|$Ht$fff.H|$Ht$HHHATAUM1M1M1M1M1L+LNLVLL^H5ALILLLNLVML^MLDLDLLDLOMDLWL_L,$Ld$Hd$H|$Ht$fH|$Ht$HHHLH HIUSATAUAVAWHHL56L=OHH&IHIHfIHHIHfIHHMMIHfILHII&LILHHM)IIfIHIHIHIH H I)HCHMIIHH&IHHHHfIHIHHHHfIHIHHLMHHfIHM1ILIII&LHLHM)IIfIHIHIHIH H I)HCHMIIHH&IHHHHfIHIHHHHfIHIHHLMHHfIHM1ILIII&LHLHM)IIfIHIHIHIH H I)HCHMIIHH&IHHHHfIHIHHHHfIHIHHLMHHfIHM1ILIII&LHLHM)IIfIHIHIHIH H I)HMIILM+&MMnLMFLMNILBMBLBLBL'LoLGLOL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ffffff.H|$Ht$HHHLH HIUSATAUAVAWLHFLvL~H5HDHIIfHnLIIILfInHIIILfInHIIILIHILHIHIHMIIM1LMMMMMMIHIfH~HHIIfH~HHHIIfH~HHLLF HIIHIILHHFHM)HIIHILILHLLN H H I)HIIIILHHFHM)HIIHILILHLLV H H I)HIIIILHHFHM)HIIHILILHLL^ H H I)HIIIILHHFHM)HIIHILILHH H I)IIIH1MMMMMLHL+MLNLVML^HMBICMCMCHLHGfLwfLfL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ffffff.ff.H|$Ht$HHHLUSATAUAVAWHHLLVL^LfHvL5 L=BBBIBLIIIM1fL8L8fL8L8fL8L8HSfL8L8fM8M8IfL8L8fL8L8fL8L8LfL8L8fM8M8IfL8L8fL8L8fL8L8HSfL8L8fM8M8IfL8L8fL8L8fL8L8LfL8L8fM8M8IfL8L8fL8L8fL8L8HSfL8L8fM8M8IfL8L8fL8L8fL8L8LfL8L8fM8M8IfL8L8fL8L8fL8L8MLfL8L8LfM8M8ILM+&MnMFLMNILBLBLBLBL'LoLGLOL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ffffff.ff.H|$Ht$HHHLUSATAUAVAWHHLvL~LFH5fBBHfInBLIfInIIM1fL8L8LfL8L8IBHfInM1fM8L8fM8M8fH~fM8L8fM8fH~fM8L8fM8gfH~L8fM8L8L8L8L8LN H1.fL8L8nfL8L8nfL8L8nfL8L8fL8LN .L8fL8nL8fL8nL8fL8nL8fL8L8LN .fL8L8nfL8L8nfL8L8nfL8L8fL8LN .L8fL8nL8fL8nL8fL8nL8fL8L8MMLMMMHL+&MLNLVML^HICMCMCMCHtHLwfLfLGfL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ff.H|$Ht$HHHLH HIUSATAUAVAW#HHLLVL^Lfi"@HHLLVL^LfHvL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ffffff.DHIL5{IHIIL=xIHHIIIHHIIILHM1ILI IH MIIHCIIM1HH&IHHHHfIHIHHHHfIHIHHHHfIHILIILI IH MIIHCIIM1HH&IHHHHfIHIHHHHfIHIHHHHfIHILIILI IH MIIHCIIM1HH&IHHHHfIHIHHHHfIHIHHHHfIHILIILI IH MILIILIILMILMILBLBL'LBLoLBLGLOffffff.@H|$Ht$HHHH HIUSATAUAVAW&HLvL~LFr%ffff.HLvL~LFHvhL<$Lt$Ll$Ld$H\$ Hl$(Hd$0H|$Ht$ffffff.ff.IIILIIILHIIILHIIILHHIILHIIIIM1IHIIMMMMMMIHIHFHHIIHFHHHIIHFHHHIILIH5H-LI HH MIILHLI IHH MIILHLI IHH MIILHLI IHH MIIHM1MMMMIMIIMIILIIMBMBL'MBLoLBLwLffffff.ffffff.BBI M1BL=IBLI‰I‹IIIHSIIIM1fL8L8fL8L8fL8L8LfL8‰L8‹fM8M8IIIHSIIIM1fL8L8fL8L8fL8L8LfL8‰L8‹fM8M8IIIHSIIIM1fL8L8fL8L8fL8L8LfL8‰L8‹fM8M8IIILL5ILII1LIMILMILBLBL'LBLoLBLGLOffffff.fffff.BB1IBLIIM1fL8L8LfL8L8IBHM1fM8L8fM8M8HfM8L8fM8HfM8L8fM8gHL8fM8L8H L8ggHL8L8HIIBIIIIBIIIIBIIIIBIIH1MH5MMMMMHIMIIMIHMBMBL'MBLoMBLwLÐHH@ H$xH`)p)xD)D)HD)P D)X0D)`@D)hPD)p`D)xpfogfAnfffffffDofpHfEofDfDvfDo fDoRfDoZ fDob0fDoj@fDorPHR`fEfEfAfEfAfEfAfEfAfEfAfAHYa i0q@yP(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($H$ffffff.fHH@ H$xH`)p)xD)D)HD)P D)X0D)`@D)hPD)p`D)xpfDofAnfffffAofpH@fEofDfDo fDoRfDvfDoZ fDob0HR@fEfEfAfEfAfEfAfAHYa i0(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($H$fwH$xIH`)p)xx)@x)Hx)P x)X0x)`@x)hPx)p`x)xpoo-}oynm6Ho2oz }oB@}oZ`}o}oUv-v-HMEA=A%AA]me]HY a@w(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($I#ffffff.fDwIH$xH`)p)xx)@x)Hx)P x)X0x)`@x)hPx)p`x)xpoo%D}o\}o%tynm6Ho*or }oJ@}oR`}o}ov=vv=HA5A-AA memeH}o*or vY w(4$(|$D(D$ D(L$0D(T$@D(\$PD(d$`D(l$pD($D($I#ffffff.@M1L#LkLLCLKLIILMIMMILBLBL'LBLoMBLGLOff.L+#LkLLCLKLMILMIMMMLDLDL'LDLoMDLGLOffffff.L)LILMIMHILHMMMLELELEMEfM1MMLMMLIILMIMMILBLBL'LBLoMBLGLOfffff.H|$Ht$HHHH HIUSATAUAVAWHoHoNLf Ln(LF0LN8L5DL=MfD$`fL$pLW L_@fHnfInfInH<$ HF@LvHL~PLFXHv@H|$@kH$Lt$H4$L|$LD$H<$KHC LK@LSHL[PLcXHs@H[ fH~%Ld$`Ll$hH\$@LD$pLL$xH|$ }Ld$`Ll$hH\$@LD$pLL$xH|$@H$Lt$H4$L|$LD$fH~M1LIMILIMIIH1HLDMDLDMDLDLIH?MII I?LIM H?L'ILoI?I M LwLHD$@H\$@LL$ LT$(Ht$ L\$0Ld$8H|$ H$H\$ H|$ rHD$`H\$`L $LT$H4$L\$Ld$H<$H$;HD$ Lt$(Ht$ L|$0LD$8fH~H$MMII_H$Hl$HL$LT$H<$HD$ H\$ M1L$$MLl$MDLD$H4$MDLL$MH<$&fH~fH~H$L~LvLnLfH^HnH&H|$Ht$H|$Ht$HHHLH HIUSATAUAVAWHHooNoV o^0of@onPHHf$f$f$f$f$f$fofpݱoNoV fo^0HF@LvHL~PLFXf$fpf$oF@oNPf$f$ffffHnHv@H$ L$(L$0L$8H|$`fvfpffpfpfffvfpHC@LsHL{PLCXfHnHs@H|$ VH$ H$ LL$`LT$hHt$`L\$pLd$xH$ H$H$LL$ LT$(Ht$ L\$0Ld$8H$H$H$L$L$H$L$L$H$H$H$L$L$H$L$L$H$`H$H|$@.M foM M ffInH$H$LL$`LT$hHt$`L\$pLd$xH$H$H$LL$ LT$(Ht$ L\$0Ld$8H$H$H<$M M M fI~fI~M >^M5fH~fGG G0G@GPf.fH~fH~HĠkf.HD$@Lt$HHt$@L|$PLD$XH|$`H$H$L $LT$H4$L\$Ld$H$`H$Lt$H4$L|$LD$H|$ H$ H$ L$`L$hH$`L$pL$xH$`H$H$LL$ LT$(Ht$ L\$0Ld$8H$UH$H$LL$ LT$(Ht$ L\$0Ld$8H$M1MHt$`MLMMLIILMIMMILBHLBHnLBHNMBLVH$H$ H$H$H$L$H$@L'LoLGLOH$H$L$L$H$L$L$H$/H$@H$@LL$@LT$HHt$@L\$PLd$XH$@H$H$@fH~fofof߄$`fofߌ$pfof۔$ fۜ$0fffofoffoffof۔$fۜ$ffW@_Pfofof߄$ fofߌ$0fof۔$fۜ$fffofoffoffof۔$fۜ$ff_fofof߄$@fofߌ$Pfof۔$fۜ$fffofoffoffof۔$fۜ$ffW _0H$xL~LvLnLfH^HnH&H|$Ht$fH|$Ht$HHHLH HIUSATAUAVAWHoHoNoV o^0of@onPHF@LvHL~PLFXf$@f$Pf$`f$pf$f$fofpݱoKoS fo[0f$fpf$ffHnf$f$ffffHv@H|$ &fvfpHMffpfpMffMfvfpHt$ MH<$H$@H|$@H$H$LL$ LT$(Ht$ L\$0Ld$8H|$ H$H$LL$@LT$HHt$@L\$PLd$XH$ fH$H$LL$ LT$(Ht$ L\$0Ld$8H|$ 3H$`H|$`HD$@Lt$HHt$@L|$PLD$XH$HD$`Lt$hHt$`L|$pLD$xH$H$H$LL$@LT$HHt$@L\$PLd$XH$H$@H$@L$L$H$L$L$H<$^M1MH$MLMMLIILMIMMILBHLBHnLBHNMBLVAH$H$H$Hl$HL$LT$H|$@L'LoLGLOH$`H$`L$L$H$L$L$H|$ ~HD$`H\$`LL$@LT$HHt$@L\$PLd$XH|$@QH\$ H$fH~fofof߄$ fofߌ$0fofffffofoffoffof۔$fۜ$ffW@_Pfofof߄$fofߌ$fof۔$fۜ$fffofoffoffof۔$@fۜ$Pff_fofof߄$fofߌ$fof۔$fۜ$fffofoffoffof۔$`fۜ$pffW _0H$L~LvLnLfH^HnH&H|$Ht$fDM1L#LkLLCLKLIM1ILMIMMILBLBL'LBLoMBLGLOM1L#LkLLCLKLIM1ILMIMMILCLCL'LCLoMCLGLOM1LLILMIIM1HILHMMILBLBLBMBffffff.f.M1MMLMMLIM1ILMIMMILBLBL'LBLoMBLGLOff.H|$Ht$HHHUSATAUAVAWHoHoNLf Ln(LF0LN8L5aL=jfD$`fL$pLW L_@fHnfInfInH<$&HV@LvHL~PLFXHvH|$@H$Lt$Ht$L|$LD$H<$HS LK@LSHL[PLcXHsH[ fH~Ld$`Ll$hH\$@LD$pLL$xH|$ yLd$`Ll$hH\$@LD$pLL$xH|$@H$Lt$Ht$L|$LD$fH~M1LIMILIMIIH1HLDMDLDMDLDLIH?MII I?LIM H?L'ILoI?I M LwLHT$@H\$@LL$ LT$(Ht$L\$0Ld$8H|$ H$H\$ H|$ mHT$`H\$`L $LT$Ht$L\$Ld$H<$H$UHT$ Lt$(Ht$L|$0LD$8fH~H$MMIIYH$Hl$HL$LT$H<$HT$ H\$ M1L$$MLl$MDLD$Ht$MDLL$MH<$fH~fH~H$L~LvLnLfH^HnH&H|$Ht$ÐH|$Ht$HHHLUSATAUAVAWHHooNoV o^0of@onPHHf$f$f$f$f$f$fofpݱoNoV fo^0HV@LvHL~PLFXf$fpf$oF@oNPf$f$ffffHnHvH$ L$(L$0L$8H|$`fvfpffpfpfffvfpHS@LsHL{PLCXfHnHsH|$ H$ H$ LL$`LT$hHt$L\$pLd$xH$H$H$LL$ LT$(Ht$L\$0Ld$8H$H$H$L$L$Ht$`L$L$H$H$H$L$L$H$L$L$H$`H$H|$@NM foM M ffInH$H$LL$`LT$hHt$L\$pLd$xH$H$H$LL$ LT$(Ht$L\$0Ld$8H$H$H<$M M M fI~fI~M >^M5fH~fGG G0G@GPf.fH~fH~HĠf.HT$@Lt$HHt$L|$PLD$XH|$`}H$H$L $LT$Ht$L\$Ld$H$`H$Lt$Ht$L|$LD$H|$ &H$ H$ L$`L$hH$L$pL$xH$`H$H$LL$ LT$(Ht$L\$0Ld$8H$SH$H$LL$ LT$(Ht$L\$0Ld$8H$M1MHt$`MLMMLIILMIMMILBHLBHnLBHNMBLV#H$H$ H$H$H$L$H$@L'LoLGLOH$H$L$L$Ht$`L$L$H$0H$@H$@LL$@LT$HHt$L\$PLd$XH$@H$H$@fH~fofof߄$`fofߌ$pfof۔$ fۜ$0fffofoffoffof۔$fۜ$ffW@_Pfofof߄$ fofߌ$0fof۔$fۜ$fffofoffoffof۔$fۜ$ff_fofof߄$@fofߌ$Pfof۔$fۜ$fffofoffoffof۔$fۜ$ffW _0H$xL~LvLnLfH^HnH&H|$Ht$f.H|$Ht$HHHLUSATAUAVAWHoHoNoV o^0of@onPHV@LvHL~PLFXf$@f$Pf$`f$pf$f$fofpݱoKoS fo[0f$fpf$ffHnf$f$ffffHvH|$ fvfpHMffpfpMffMfvfpHt$MH<$H$@H|$@H$H$LL$ LT$(Ht$L\$0Ld$8H|$ H$H$LL$@LT$HHt$L\$PLd$XH$ H$H$LL$ LT$(Ht$L\$0Ld$8H|$ PH$`H|$`>HT$@Lt$HHt$L|$PLD$XH$xHT$`Lt$hHt$L|$pLD$xH$RH$H$LL$@LT$HHt$L\$PLd$XH$H$@H$@L$L$H4$L$L$H<$M1MH$MLMMLIILMIMMILBHLBHnLBHNMBLVH$H$ H$Hl$HL$LT$H|$@PL'LoLGLOH$`H$`L$L$Ht$ L$L$H|$ HT$`H\$`LL$@LT$HHt$L\$PLd$XH|$@uH\$ H$cfH~fofof߄$ fofߌ$0foftf|fffofoffoffof۔$fۜ$ffW@_Pfofof߄$fofߌ$fof۔$fۜ$fffofoffoffof۔$@fۜ$Pff_fofof߄$fofߌ$fof۔$fۜ$fffofoffoffof۔$`fۜ$pffW _0H$L~LvLnLfH^HnH&H|$Ht$f.VWSUATAUAVAWH@I@xIIqMY8ENL9IESNL9H@L`LhMMDVWSUATAUAVAWH@I@xIIqMY8ENL9bIESNL9JESJHhHXL`LhLpLxIIMMMMHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^9cv #Y+C   $"(%,0'4+8<-@5DH7L>PTAXC\`FdHhlJpLtxN|PV[]dfjptv|~ 0 0 0 0 0 033 .)$ xh6 6 1,'"x h@ x  x  ,04DH#L$\`(d*tx/|48= XZ$(_,c<@hDiTXq\slpwt{3P:\ring\pregenerated\tmp\p256-x86_64-asm-nasm.asm-0sDts @`$&'(*+,/023456 79:;<!=%>(?,A/B2C6D:E=FAGEIIJMKPLTMXN\O`PdRfShTmUrVt]_`acdhjnopqrtuvwxyz{}~  %*-036=AGMSTUWY[]`cjqtwz} " % ) , / 36:=ADGKNRUY\`cf i!l"p%s&v'y(|)+,./012345789:;=>?BCDEFGIJKLMNOQRSTUVXY[\ ]^_`abc"f%g(h+i.j1l4m8o<p?qCrFsItLuOvSxWy[z^{b|e~hkorux{   #&*-148<@DHLOSW[_dinsx}     !"#%&'(")&*),,-/.2/70;1>4A5D6G7J:M;P<S=W>Z@]A`BdDgEjFnIqJtKwLzM}NOPQTUVWYZ[\]^`abcdeghjklmnqrstuwxz{|}~   #&*-037:=ADGKNQTW[^cgknqtw{~ !$'+.159<@DHLPTW]`dhlpt x | !#$%'().02468<=>?@ABC D G H I J K L! M& N) O, P0 S3 T< UB VH XQ YW Z] \f ]l ^r `{ a b c d e f i j k m n o q r s u v w x y { | }    % + 1 : @ F O S Y _ e k o x ~                         # ' - 3 9 ? C L R X a g m v |                            # & * . 1 5 9 = A E I L P T X \ a f k p u z           % ' ) + - / 3 4 5 6 7 8 9 ; = > ? @ A B C D E F G I J K M" N% O+ P1 Q5 S: T= UB VE WK XQ YW Z] ]b ^g _m `s ay b~ c d e f g h i j k l m n o p s t v w x y z { | } ~ "%+06<BHNTZ`flrx{ $'*-036:=@DHKOSW[_cflosw{     " $#%&&)'-(1)5*9,>.B0G2L4Q6V8[:`=e>j?lDIJKLMNPQRSTUWXYZ[]^_`abmnopqrstuvw{|}~  $'+.158<?CFILPSWZ^adgknrux{~  $'+.158<?CFILPSWZ^adgjmptx { ~   &()*,-123468:<>ABCDEF HIK M#N'O+P/Q3S8U<WAYF[K]P_UaZd_edffknopqrtuvwxz{|}~   #&)-147:=@CJQTX[_behkorvy|  !@EJQTY`chknsv{ $%'()*+,01245689:<=>?@ACDE IJLMNO!P%Q(U1V7W=YFZL[R][^a_gapbscyd~efhijnoqrstuvz{|~ "&),14;>ADHJMQTX[^bfjmquy} #)/4;AGMNSZ`flsy{       "!&#*$-%0&4'7(:)>+B,F-I.M/Q0U1Y2]4_;`>g?k@pAvB~DEFGHIJKLMNOPRSTUVWYZ\_`acdef ghik"l'm,n1o6p;q@rEsJtOuTvYx\yb{f|k}p~uz "',1:?CGKOTY`ejouz  #+.27<AFKPUZ_dlptx                        ! " $ % & $' '( +) 0* 6+ <, B- H. N/ T0 ]1 f2 i3 k< @ A B D E F G H I J K L M N O Q R T U V X Y \ _ ` b c e f h $i (j ,l 0m 4n 8o ?q Cr Gs Lt Qu Vv [x _y cz h{ m| r} w z                                  # & * - 0 4 8 < ? C G K O S U ` c g j n r u x |                                                  #  '  *  -  1  5  9  <  @  D  H  L  P  R # ` % e & j ' m ) p * s . z / ~ 0 1 2 3 5 7 9 ; = ? D E F G H I J K L M N O P Q R S U V X Y Z ![ !\ !] !^ !` !a !b "!c '!d ,!e 0!f 5!h 9!i =!j A!k E!l I!m M!n Q!o V!p [!q `!s e!t j!u o!v t!w y!x ~!y !{ !| !} !~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " " " " " " " " "" %" )" ," /" 3" 7" :" =" A" E" J" O" T" Y" ^" c" h" m" r" z" " " " " " " " " " " " " " " " " " " " " " " " " " " " # # # # # # # "# '# *# ,# 0# 3# 8# <# A# E# I# N# Q# U# Z# _# d# i# q# u# y# }# # # # # # # # # # # # # # # # # # # #! ## #% #' #) #+ #- #1 #2 #3 #4 #5 #6 $7 $8 $9 $: $; "$< +$= 4$> =$? A$A E$B J$C O$D T$E X$F ]$G a$H e$I i$J m$K v$L {$M $N $O $P $Q $R $S $T $U $W $X $Y $Z $[ $\ $] $_ $` $a $b $c $d $e $f %g %h %i %j %k %l %n %o %%p *%r 2%s :%t ?%u D%v I%w N%x S%y [%z `%| h%} p%~ u% z% % % % % % % % % % % % % % % % % % % & & & & & (& -& 2& 5& 9& <& ?& C& H& P& X& ]& b& g& l& q& y& ~& & & & & & & & & & & & & & & & & & & & & & & & & & & ' ' ' ' ' ' %' *' 1' 6' @' E' J' O' T' Y' ^' c' k' s' w' |' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ( ( ( ( ( ( ( &( +( 3( ;( @( E( J( O( T( \( a(! d(" g(# l($ o(% r(& u(' x(( {() (+ (, (- (. (/ (0 (1 (3 (4 (5 (6 (7 (8 (9 (: (< (> (? (@ (B (C (D (E (F (H (J )K )L )M )N )O )P $)Q ,)R 4)S <)T D)U L)V Q)X Y)Y a)Z f)[ k)\ p)] u)^ z)_ )` )b )c )d )f )h )i )j )k )l )m )n )o )p )q )s )t )u )v )w )x )y )z *{ *| *} *~ * * !* ** .* 7* ;* D* M* Q* U* Y* ]* a* e* i* m* v* * * * * * * * * * * * * * * * * * * * * * * * * * + + + + + + + $+ (+ ++ 0+ 5+ 7+ @+ E+ J+ M+ P+ S+ V+ ]+ a+ g+ m+ s+ t+ u+ w+ y+ {+ }+ + + + + + + + + + + + + + + + + + + + + + + , , , , , !, %, *, 3, <, @, D, H, L, P, U, Z, ^, c, f, i, m, r, w, z, ~, , , , ," ,# ,$ ,% ,' ,( ,) ,+ ,, ,- ,. ,/ ,0 ,1 ,2 ,3 ,5 ,6 ,7 ,8 ,9 -: -; -< -= -? "-@ *-A /-B 4-C 9-D >-E C-F H-G M-I U-J Z-K _-M d-N i-O n-P s-Q x-R -S -U -V -W -X -Y -Z -[ -] -^ -_ -` -a -b -c -d -e -g -h -i -j .k .l .m .n .o ".t %.u (.v 0.w 3.x 6.y 9.z <.{ ?.| C.~ G. J. M. Q. T. W. [. _. b. f. j. n. r. v. z. . . . . . . . . . . . . . . . . . . . . . . / / / / / / / %/ */ // 4/ 4.C4/H40M41R42W44_45d47i48n49s4;x4<}4=4>4?4@4A4B4C4E4F4H4I4J4K4L4M4N4P4Q4R4S4T4U4W4X4Y4Z4[4\5^5_ 5`5a5b5c5d5e"5f'5g,5h05i55j85k<5lA5nF5oK5pP5rX5t\5v`5xd5zh5|l5~p5s5x5}55555555555555555555555555555666 6666 6$6(6,60696>6G6L6Q6Z6c6g6k6o6t6x6666666666666666666666666677 7777#7+73787=7B7G7L7T7Y7a7i7q7y7~777777777 7 7 7 7 7777777788888"8'8,8 18!98">8$F8%N8&S8'X8(]8)b8*g8+o8,t8.|8/80828384868788898:8>8?8F8G8H8I8J8K8L8M8N8P8R8S8T8V8Y9[9\ 9]9^9_9`9a#9c+9d39e79f<9gA9hF9iK9jS9kX9m\9na9of9pk9qp9ru9sz9u9v9w9x9y9z9{9|9}999999999999:: ::::#:&:):.:1:4:7:::=:A:E:H:K:O:R:U:Y:]:`:d:h:l:p:t:x:}::::::::::::::::::::; ;;; ;%;*;/;4;9;A;F;N;V;[;`;d;h;q;u;~;;;;;;;;;;;;;;;;;;;;;;;;< <<<<< <$<(<,<5<><B< F< J< O< S<W<`<d<m<q<z<<<<<<<<<<<< <!<"<#<&<(<*<,<.<0<2<4<7<8<9<==?=@ =A =C=D=E=J=L=N=P=R=T =V'=Z+=[.=\3=]8=^==_B=`G=aK=bO=cS=dW=e`=fi=gr=h{=i=j=k=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}====>> > >>>>>!>%>(>,>1>6>9>=>B>J>O>T>\>d>i>n>s>x>}>>>>>>>>>>>>>>>>>>>>>>>?? ????#?(?-?2?7?JA?NA@SAAXAC\AD`AEiAFmAGvAHzAIAJAKALANAOAPAQARASATAUAVAWAXAYA[A\A]A^A_A`AaAbBcBd BfBgBhBiBjBk#Bl,Bm5Bn9Bo=BpBBqGBsOBuSBwWBy[B{_B}cBgBjBoBtBvBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCC CCCCCC$C+C/C3C6C {> {? {? |@ |@ (|A ,|A V|B Z|B v|C z|C |D |D |E |E |F |F }G }G .}H 2}H Z}I ^}I }J }J }K }K }L }L ~M ~M -~N 1~N `~O d~O ~P ~P ~Q ~Q ~R ~R ~S ~S T T ;U ?U `V dV W W X X Y Y Z Z [ [ C\ G\ e] i] ^ ^ _ _ Ȁ` ̀` a a b b c c 3d 7d _e ce f f g g ܁h h i i j j Ok Sk ql ul m m n n ؂o ܂o p p 0q 4q Pr Tr ts xs t t ȃu ̃u v v w w 7x ;x Qy Uy jz nz { { | | τ} ӄ} ~ ~ / 3 M Q o s م ݅  # Q U  " M Q }   L P .fileg.textD .L$polyL$One L$Two@L$Three`<L$ordL$ordKGXut   -1N]]}p &Mhz     * 9Mr >@`l=Su 8Zf` %~H]~` .CYk`/C \` vm s2  ###.#Q5^#p@' '+++7+@+M+ =, +? 0V 0~ 0 @1 1 2 `2 m2 22 2K s5d 5 5 5 5 9 8 < < <8 =W = '= jB vB  B C B.pdata3 5 Y ( @ X p  1 X }  8 P h.xdata'.debug$S .debug$T ;pregenerated\tmp\p256-x86_64-asm-nasm.asmGFp_ia32cap_PL$ONE_montGFp_nistz256_addL$SEH_begin_GFp_nistz256_addL$SEH_end_GFp_nistz256_addGFp_nistz256_negL$SEH_begin_GFp_nistz256_negL$neg_bodyL$neg_epilogueL$SEH_end_GFp_nistz256_negGFp_p256_scalar_mul_montL$SEH_begin_GFp_p256_scalar_mul_montL$ecp_nistz256_ord_mul_montxL$ord_mul_bodyL$ord_mul_epilogueL$SEH_end_GFp_p256_scalar_mul_montGFp_p256_scalar_sqr_rep_montL$SEH_begin_GFp_p256_scalar_sqr_rep_montL$ecp_nistz256_ord_sqr_montxL$ord_sqr_bodyL$oop_ord_sqrL$ord_sqr_epilogueL$SEH_end_GFp_p256_scalar_sqr_rep_montecp_nistz256_ord_mul_montxL$SEH_begin_ecp_nistz256_ord_mul_montxL$ord_mulx_bodyL$ord_mulx_epilogueL$SEH_end_ecp_nistz256_ord_mul_montxecp_nistz256_ord_sqr_montxL$SEH_begin_ecp_nistz256_ord_sqr_montxL$ord_sqrx_bodyL$oop_ord_sqrxL$ord_sqrx_epilogueL$SEH_end_ecp_nistz256_ord_sqr_montxGFp_nistz256_mul_montL$SEH_begin_GFp_nistz256_mul_montL$mul_montL$mul_bodyL$mul_montx__ecp_nistz256_mul_montqL$mul_mont_done__ecp_nistz256_mul_montxL$mul_epilogueL$SEH_end_GFp_nistz256_mul_montGFp_nistz256_sqr_montL$SEH_begin_GFp_nistz256_sqr_montL$sqr_bodyL$sqr_montx__ecp_nistz256_sqr_montqL$sqr_mont_done__ecp_nistz256_sqr_montxL$sqr_epilogueL$SEH_end_GFp_nistz256_sqr_montGFp_nistz256_select_w5L$avx2_select_w5L$SEH_begin_GFp_nistz256_select_w5L$select_loop_sse_w5L$SEH_end_GFp_nistz256_select_w5GFp_nistz256_select_w7L$avx2_select_w7L$SEH_begin_GFp_nistz256_select_w7L$select_loop_sse_w7L$SEH_end_GFp_nistz256_select_w7GFp_nistz256_avx2_select_w5L$SEH_begin_GFp_nistz256_avx2_select_w5L$select_loop_avx2_w5L$SEH_end_GFp_nistz256_avx2_select_w5GFp_nistz256_avx2_select_w7L$SEH_begin_GFp_nistz256_avx2_select_w7L$select_loop_avx2_w7L$SEH_end_GFp_nistz256_avx2_select_w7__ecp_nistz256_add_toq__ecp_nistz256_sub_fromq__ecp_nistz256_subq__ecp_nistz256_mul_by_2qGFp_nistz256_point_doubleL$SEH_begin_GFp_nistz256_point_doubleL$point_doublexL$point_doubleq_bodyL$point_double_shortcutqL$point_doubleq_epilogueL$SEH_end_GFp_nistz256_point_doubleGFp_nistz256_point_addL$SEH_begin_GFp_nistz256_point_addL$point_addxL$point_addq_bodyL$add_proceedqL$add_doubleqL$add_doneqL$point_addq_epilogueL$SEH_end_GFp_nistz256_point_addGFp_nistz256_point_add_affineL$SEH_begin_GFp_nistz256_point_add_affineL$point_add_affinexL$add_affineq_bodyL$add_affineq_epilogueL$SEH_end_GFp_nistz256_point_add_affine__ecp_nistz256_add_tox__ecp_nistz256_sub_fromx__ecp_nistz256_subx__ecp_nistz256_mul_by_2xGFp_nistz256_point_doublexL$SEH_begin_GFp_nistz256_point_doublexL$point_doublex_bodyL$point_double_shortcutxL$point_doublex_epilogueL$SEH_end_GFp_nistz256_point_doublexGFp_nistz256_point_addxL$SEH_begin_GFp_nistz256_point_addxL$point_addx_bodyL$add_proceedxL$add_doublexL$add_donexL$point_addx_epilogueL$SEH_end_GFp_nistz256_point_addxGFp_nistz256_point_add_affinexL$SEH_begin_GFp_nistz256_point_add_affinexL$add_affinex_bodyL$add_affinex_epilogueL$SEH_end_GFp_nistz256_point_add_affinex__imp_RtlVirtualUnwindshort_handlerL$common_seh_tailfull_handlerL$SEH_info_GFp_nistz256_negL$SEH_info_GFp_p256_scalar_mul_montL$SEH_info_GFp_p256_scalar_sqr_rep_montL$SEH_info_ecp_nistz256_ord_mul_montxL$SEH_info_ecp_nistz256_ord_sqr_montxL$SEH_info_GFp_nistz256_mul_montL$SEH_info_GFp_nistz256_sqr_montL$SEH_info_GFp_nistz256_select_wXL$SEH_info_GFp_nistz256_avx2_select_wXL$SEH_info_GFp_nistz256_point_doubleL$SEH_info_GFp_nistz256_point_addL$SEH_info_GFp_nistz256_point_add_affineL$SEH_info_GFp_nistz256_point_doublexL$SEH_info_GFp_nistz256_point_addxL$SEH_info_GFp_nistz256_point_add_affinexring-0.16.9/pregenerated/poly1305-armv4-ios32.S000064400000000000000000000611541353224261100170130ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .globl _GFp_poly1305_emit .private_extern _GFp_poly1305_emit .globl _GFp_poly1305_blocks .private_extern _GFp_poly1305_blocks .globl _GFp_poly1305_init_asm .private_extern _GFp_poly1305_init_asm #ifdef __thumb2__ .thumb_func _GFp_poly1305_init_asm #endif .align 5 _GFp_poly1305_init_asm: Lpoly1305_init: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} eor r3,r3,r3 cmp r1,#0 str r3,[r0,#0] @ zero hash value str r3,[r0,#4] str r3,[r0,#8] str r3,[r0,#12] str r3,[r0,#16] str r3,[r0,#36] @ is_base2_26 add r0,r0,#20 #ifdef __thumb2__ it eq #endif moveq r0,#0 beq Lno_key #if __ARM_MAX_ARCH__>=7 adr r11,Lpoly1305_init ldr r12,LOPENSSL_armcap #endif ldrb r4,[r1,#0] mov r10,#0x0fffffff ldrb r5,[r1,#1] and r3,r10,#-4 @ 0x0ffffffc ldrb r6,[r1,#2] ldrb r7,[r1,#3] orr r4,r4,r5,lsl#8 ldrb r5,[r1,#4] orr r4,r4,r6,lsl#16 ldrb r6,[r1,#5] orr r4,r4,r7,lsl#24 ldrb r7,[r1,#6] and r4,r4,r10 #if __ARM_MAX_ARCH__>=7 ldr r12,[r11,r12] @ GFp_armcap_P # ifdef __APPLE__ ldr r12,[r12] # endif #endif ldrb r8,[r1,#7] orr r5,r5,r6,lsl#8 ldrb r6,[r1,#8] orr r5,r5,r7,lsl#16 ldrb r7,[r1,#9] orr r5,r5,r8,lsl#24 ldrb r8,[r1,#10] and r5,r5,r3 #if __ARM_MAX_ARCH__>=7 tst r12,#ARMV7_NEON @ check for NEON # ifdef __APPLE__ adr r9,poly1305_blocks_neon adr r11,_GFp_poly1305_blocks # ifdef __thumb2__ it ne # endif movne r11,r9 adr r12,_GFp_poly1305_emit adr r10,poly1305_emit_neon # ifdef __thumb2__ it ne # endif movne r12,r10 # else # ifdef __thumb2__ itete eq # endif addeq r12,r11,#(_GFp_poly1305_emit-Lpoly1305_init) addne r12,r11,#(poly1305_emit_neon-Lpoly1305_init) addeq r11,r11,#(_GFp_poly1305_blocks-Lpoly1305_init) addne r11,r11,#(poly1305_blocks_neon-Lpoly1305_init) # endif # ifdef __thumb2__ orr r12,r12,#1 @ thumb-ify address orr r11,r11,#1 # endif #endif ldrb r9,[r1,#11] orr r6,r6,r7,lsl#8 ldrb r7,[r1,#12] orr r6,r6,r8,lsl#16 ldrb r8,[r1,#13] orr r6,r6,r9,lsl#24 ldrb r9,[r1,#14] and r6,r6,r3 ldrb r10,[r1,#15] orr r7,r7,r8,lsl#8 str r4,[r0,#0] orr r7,r7,r9,lsl#16 str r5,[r0,#4] orr r7,r7,r10,lsl#24 str r6,[r0,#8] and r7,r7,r3 str r7,[r0,#12] #if __ARM_MAX_ARCH__>=7 stmia r2,{r11,r12} @ fill functions table mov r0,#1 #else mov r0,#0 #endif Lno_key: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func _GFp_poly1305_blocks #endif .align 5 _GFp_poly1305_blocks: stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} ands r2,r2,#-16 beq Lno_data cmp r3,#0 add r2,r2,r1 @ end pointer sub sp,sp,#32 ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11,r12} @ load context str r0,[sp,#12] @ offload stuff mov lr,r1 str r2,[sp,#16] str r10,[sp,#20] str r11,[sp,#24] str r12,[sp,#28] b Loop Loop: #if __ARM_ARCH__<7 ldrb r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi r8,r8,#1 @ 1<<128 ldrb r1,[lr,#-15] ldrb r2,[lr,#-14] ldrb r3,[lr,#-13] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-12] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-11] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-10] adds r4,r4,r3 @ accumulate input ldrb r3,[lr,#-9] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-8] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-7] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-6] adcs r5,r5,r3 ldrb r3,[lr,#-5] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-4] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-3] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-2] adcs r6,r6,r3 ldrb r3,[lr,#-1] orr r1,r0,r1,lsl#8 str lr,[sp,#8] @ offload input pointer orr r2,r1,r2,lsl#16 add r10,r10,r10,lsr#2 orr r3,r2,r3,lsl#24 #else ldr r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi r8,r8,#1 @ padbit ldr r1,[lr,#-12] ldr r2,[lr,#-8] ldr r3,[lr,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif adds r4,r4,r0 @ accumulate input str lr,[sp,#8] @ offload input pointer adcs r5,r5,r1 add r10,r10,r10,lsr#2 adcs r6,r6,r2 #endif add r11,r11,r11,lsr#2 adcs r7,r7,r3 add r12,r12,r12,lsr#2 umull r2,r3,r5,r9 adc r8,r8,#0 umull r0,r1,r4,r9 umlal r2,r3,r8,r10 umlal r0,r1,r7,r10 ldr r10,[sp,#20] @ reload r10 umlal r2,r3,r6,r12 umlal r0,r1,r5,r12 umlal r2,r3,r7,r11 umlal r0,r1,r6,r11 umlal r2,r3,r4,r10 str r0,[sp,#0] @ future r4 mul r0,r11,r8 ldr r11,[sp,#24] @ reload r11 adds r2,r2,r1 @ d1+=d0>>32 eor r1,r1,r1 adc lr,r3,#0 @ future r6 str r2,[sp,#4] @ future r5 mul r2,r12,r8 eor r3,r3,r3 umlal r0,r1,r7,r12 ldr r12,[sp,#28] @ reload r12 umlal r2,r3,r7,r9 umlal r0,r1,r6,r9 umlal r2,r3,r6,r10 umlal r0,r1,r5,r10 umlal r2,r3,r5,r11 umlal r0,r1,r4,r11 umlal r2,r3,r4,r12 ldr r4,[sp,#0] mul r8,r9,r8 ldr r5,[sp,#4] adds r6,lr,r0 @ d2+=d1>>32 ldr lr,[sp,#8] @ reload input pointer adc r1,r1,#0 adds r7,r2,r1 @ d3+=d2>>32 ldr r0,[sp,#16] @ reload end pointer adc r3,r3,#0 add r8,r8,r3 @ h4+=d3>>32 and r1,r8,#-4 and r8,r8,#3 add r1,r1,r1,lsr#2 @ *=5 adds r4,r4,r1 adcs r5,r5,#0 adcs r6,r6,#0 adcs r7,r7,#0 adc r8,r8,#0 cmp r0,lr @ done yet? bhi Loop ldr r0,[sp,#12] add sp,sp,#32 stmia r0,{r4,r5,r6,r7,r8} @ store the result Lno_data: #if __ARM_ARCH__>=5 ldmia sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,pc} #else ldmia sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #ifdef __thumb2__ .thumb_func _GFp_poly1305_emit #endif .align 5 _GFp_poly1305_emit: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} Lpoly1305_emit_enter: ldmia r0,{r3,r4,r5,r6,r7} adds r8,r3,#5 @ compare to modulus adcs r9,r4,#0 adcs r10,r5,#0 adcs r11,r6,#0 adc r7,r7,#0 tst r7,#4 @ did it carry/borrow? #ifdef __thumb2__ it ne #endif movne r3,r8 ldr r8,[r2,#0] #ifdef __thumb2__ it ne #endif movne r4,r9 ldr r9,[r2,#4] #ifdef __thumb2__ it ne #endif movne r5,r10 ldr r10,[r2,#8] #ifdef __thumb2__ it ne #endif movne r6,r11 ldr r11,[r2,#12] adds r3,r3,r8 adcs r4,r4,r9 adcs r5,r5,r10 adc r6,r6,r11 #if __ARM_ARCH__>=7 # ifdef __ARMEB__ rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 # endif str r3,[r1,#0] str r4,[r1,#4] str r5,[r1,#8] str r6,[r1,#12] #else strb r3,[r1,#0] mov r3,r3,lsr#8 strb r4,[r1,#4] mov r4,r4,lsr#8 strb r5,[r1,#8] mov r5,r5,lsr#8 strb r6,[r1,#12] mov r6,r6,lsr#8 strb r3,[r1,#1] mov r3,r3,lsr#8 strb r4,[r1,#5] mov r4,r4,lsr#8 strb r5,[r1,#9] mov r5,r5,lsr#8 strb r6,[r1,#13] mov r6,r6,lsr#8 strb r3,[r1,#2] mov r3,r3,lsr#8 strb r4,[r1,#6] mov r4,r4,lsr#8 strb r5,[r1,#10] mov r5,r5,lsr#8 strb r6,[r1,#14] mov r6,r6,lsr#8 strb r3,[r1,#3] strb r4,[r1,#7] strb r5,[r1,#11] strb r6,[r1,#15] #endif ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #if __ARM_MAX_ARCH__>=7 #ifdef __thumb2__ .thumb_func poly1305_init_neon #endif .align 5 poly1305_init_neon: ldr r4,[r0,#20] @ load key base 2^32 ldr r5,[r0,#24] ldr r6,[r0,#28] ldr r7,[r0,#32] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 and r3,r3,#0x03ffffff and r4,r4,#0x03ffffff and r5,r5,#0x03ffffff vdup.32 d0,r2 @ r^1 in both lanes add r2,r3,r3,lsl#2 @ *5 vdup.32 d1,r3 add r3,r4,r4,lsl#2 vdup.32 d2,r2 vdup.32 d3,r4 add r4,r5,r5,lsl#2 vdup.32 d4,r3 vdup.32 d5,r5 add r5,r6,r6,lsl#2 vdup.32 d6,r4 vdup.32 d7,r6 vdup.32 d8,r5 mov r5,#2 @ counter Lsquare_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 vmull.u32 q5,d0,d0[1] vmull.u32 q6,d1,d0[1] vmull.u32 q7,d3,d0[1] vmull.u32 q8,d5,d0[1] vmull.u32 q9,d7,d0[1] vmlal.u32 q5,d7,d2[1] vmlal.u32 q6,d0,d1[1] vmlal.u32 q7,d1,d1[1] vmlal.u32 q8,d3,d1[1] vmlal.u32 q9,d5,d1[1] vmlal.u32 q5,d5,d4[1] vmlal.u32 q6,d7,d4[1] vmlal.u32 q8,d1,d3[1] vmlal.u32 q7,d0,d3[1] vmlal.u32 q9,d3,d3[1] vmlal.u32 q5,d3,d6[1] vmlal.u32 q8,d0,d5[1] vmlal.u32 q6,d5,d6[1] vmlal.u32 q7,d7,d6[1] vmlal.u32 q9,d1,d5[1] vmlal.u32 q8,d7,d8[1] vmlal.u32 q5,d1,d8[1] vmlal.u32 q6,d3,d8[1] vmlal.u32 q7,d5,d8[1] vmlal.u32 q9,d0,d7[1] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction as discussed in "NEON crypto" by D.J. Bernstein @ and P. Schwabe @ @ H0>>+H1>>+H2>>+H3>>+H4 @ H3>>+H4>>*5+H0>>+H1 @ @ Trivia. @ @ Result of multiplication of n-bit number by m-bit number is @ n+m bits wide. However! Even though 2^n is a n+1-bit number, @ m-bit number multiplied by 2^n is still n+m bits wide. @ @ Sum of two n-bit numbers is n+1 bits wide, sum of three - n+2, @ and so is sum of four. Sum of 2^m n-m-bit numbers and n-bit @ one is n+1 bits wide. @ @ >>+ denotes Hnext += Hn>>26, Hn &= 0x3ffffff. This means that @ H0, H2, H3 are guaranteed to be 26 bits wide, while H1 and H4 @ can be 27. However! In cases when their width exceeds 26 bits @ they are limited by 2^26+2^6. This in turn means that *sum* @ of the products with these values can still be viewed as sum @ of 52-bit numbers as long as the amount of addends is not a @ power of 2. For example, @ @ H4 = H4*R0 + H3*R1 + H2*R2 + H1*R3 + H0 * R4, @ @ which can't be larger than 5 * (2^26 + 2^6) * (2^26 + 2^6), or @ 5 * (2^52 + 2*2^32 + 2^12), which in turn is smaller than @ 8 * (2^52) or 2^55. However, the value is then multiplied by @ by 5, so we should be looking at 5 * 5 * (2^52 + 2^33 + 2^12), @ which is less than 32 * (2^52) or 2^57. And when processing @ data we are looking at triple as many addends... @ @ In key setup procedure pre-reduced H0 is limited by 5*4+1 and @ 5*H4 - by 5*5 52-bit addends, or 57 bits. But when hashing the @ input H0 is limited by (5*4+1)*3 addends, or 58 bits, while @ 5*H4 by 5*5*3, or 59[!] bits. How is this relevant? vmlal.u32 @ instruction accepts 2x32-bit input and writes 2x64-bit result. @ This means that result of reduction have to be compressed upon @ loop wrap-around. This can be done in the process of reduction @ to minimize amount of instructions [as well as amount of @ 128-bit instructions, which benefits low-end processors], but @ one has to watch for H2 (which is narrower than H0) and 5*H4 @ not being wider than 58 bits, so that result of right shift @ by 26 bits fits in 32 bits. This is also useful on x86, @ because it allows to use paddd in place for paddq, which @ benefits Atom, where paddq is ridiculously slow. vshr.u64 q15,q8,#26 vmovn.i64 d16,q8 vshr.u64 q4,q5,#26 vmovn.i64 d10,q5 vadd.i64 q9,q9,q15 @ h3 -> h4 vbic.i32 d16,#0xfc000000 @ &=0x03ffffff vadd.i64 q6,q6,q4 @ h0 -> h1 vbic.i32 d10,#0xfc000000 vshrn.u64 d30,q9,#26 vmovn.i64 d18,q9 vshr.u64 q4,q6,#26 vmovn.i64 d12,q6 vadd.i64 q7,q7,q4 @ h1 -> h2 vbic.i32 d18,#0xfc000000 vbic.i32 d12,#0xfc000000 vadd.i32 d10,d10,d30 vshl.u32 d30,d30,#2 vshrn.u64 d8,q7,#26 vmovn.i64 d14,q7 vadd.i32 d10,d10,d30 @ h4 -> h0 vadd.i32 d16,d16,d8 @ h2 -> h3 vbic.i32 d14,#0xfc000000 vshr.u32 d30,d10,#26 vbic.i32 d10,#0xfc000000 vshr.u32 d8,d16,#26 vbic.i32 d16,#0xfc000000 vadd.i32 d12,d12,d30 @ h0 -> h1 vadd.i32 d18,d18,d8 @ h3 -> h4 subs r5,r5,#1 beq Lsquare_break_neon add r6,r0,#(48+0*9*4) add r7,r0,#(48+1*9*4) vtrn.32 d0,d10 @ r^2:r^1 vtrn.32 d3,d14 vtrn.32 d5,d16 vtrn.32 d1,d12 vtrn.32 d7,d18 vshl.u32 d4,d3,#2 @ *5 vshl.u32 d6,d5,#2 vshl.u32 d2,d1,#2 vshl.u32 d8,d7,#2 vadd.i32 d4,d4,d3 vadd.i32 d2,d2,d1 vadd.i32 d6,d6,d5 vadd.i32 d8,d8,d7 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vst1.32 {d8[0]},[r6,:32] vst1.32 {d8[1]},[r7,:32] b Lsquare_neon .align 4 Lsquare_break_neon: add r6,r0,#(48+2*4*9) add r7,r0,#(48+3*4*9) vmov d0,d10 @ r^4:r^3 vshl.u32 d2,d12,#2 @ *5 vmov d1,d12 vshl.u32 d4,d14,#2 vmov d3,d14 vshl.u32 d6,d16,#2 vmov d5,d16 vshl.u32 d8,d18,#2 vmov d7,d18 vadd.i32 d2,d2,d12 vadd.i32 d4,d4,d14 vadd.i32 d6,d6,d16 vadd.i32 d8,d8,d18 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vst1.32 {d8[0]},[r6] vst1.32 {d8[1]},[r7] bx lr @ bx lr #ifdef __thumb2__ .thumb_func poly1305_blocks_neon #endif .align 5 poly1305_blocks_neon: ldr ip,[r0,#36] @ is_base2_26 ands r2,r2,#-16 beq Lno_data_neon cmp r2,#64 bhs Lenter_neon tst ip,ip @ is_base2_26? beq _GFp_poly1305_blocks Lenter_neon: stmdb sp!,{r4,r5,r6,r7} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so tst ip,ip @ is_base2_26? bne Lbase2_26_neon stmdb sp!,{r1,r2,r3,lr} bl poly1305_init_neon ldr r4,[r0,#0] @ load hash value base 2^32 ldr r5,[r0,#4] ldr r6,[r0,#8] ldr r7,[r0,#12] ldr ip,[r0,#16] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 veor d10,d10,d10 mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 veor d12,d12,d12 mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 veor d14,d14,d14 mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 veor d16,d16,d16 and r3,r3,#0x03ffffff orr r6,r6,ip,lsl#24 veor d18,d18,d18 and r4,r4,#0x03ffffff mov r1,#1 and r5,r5,#0x03ffffff str r1,[r0,#36] @ is_base2_26 vmov.32 d10[0],r2 vmov.32 d12[0],r3 vmov.32 d14[0],r4 vmov.32 d16[0],r5 vmov.32 d18[0],r6 adr r5,Lzeros ldmia sp!,{r1,r2,r3,lr} b Lbase2_32_neon .align 4 Lbase2_26_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ load hash value veor d10,d10,d10 veor d12,d12,d12 veor d14,d14,d14 veor d16,d16,d16 veor d18,d18,d18 vld4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]! adr r5,Lzeros vld1.32 {d18[0]},[r0] sub r0,r0,#16 @ rewind Lbase2_32_neon: add r4,r1,#32 mov r3,r3,lsl#24 tst r2,#31 beq Leven vld4.32 {d20[0],d22[0],d24[0],d26[0]},[r1]! vmov.32 d28[0],r3 sub r2,r2,#16 add r4,r1,#32 # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q13,q13 vrev32.8 q11,q11 vrev32.8 q12,q12 # endif vsri.u32 d28,d26,#8 @ base 2^32 -> base 2^26 vshl.u32 d26,d26,#18 vsri.u32 d26,d24,#14 vshl.u32 d24,d24,#12 vadd.i32 d29,d28,d18 @ add hash value and move to #hi vbic.i32 d26,#0xfc000000 vsri.u32 d24,d22,#20 vshl.u32 d22,d22,#6 vbic.i32 d24,#0xfc000000 vsri.u32 d22,d20,#26 vadd.i32 d27,d26,d16 vbic.i32 d20,#0xfc000000 vbic.i32 d22,#0xfc000000 vadd.i32 d25,d24,d14 vadd.i32 d21,d20,d10 vadd.i32 d23,d22,d12 mov r7,r5 add r6,r0,#48 cmp r2,r2 b Long_tail .align 4 Leven: subs r2,r2,#64 it lo movlo r4,r5 vmov.i32 q14,#1<<24 @ padbit, yes, always vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1] add r1,r1,#64 vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0) add r4,r4,#64 itt hi addhi r7,r0,#(48+1*9*4) addhi r6,r0,#(48+3*9*4) # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q13,q13 vrev32.8 q11,q11 vrev32.8 q12,q12 # endif vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26 vshl.u32 q13,q13,#18 vsri.u32 q13,q12,#14 vshl.u32 q12,q12,#12 vbic.i32 q13,#0xfc000000 vsri.u32 q12,q11,#20 vshl.u32 q11,q11,#6 vbic.i32 q12,#0xfc000000 vsri.u32 q11,q10,#26 vbic.i32 q10,#0xfc000000 vbic.i32 q11,#0xfc000000 bls Lskip_loop vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^2 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! b Loop_neon .align 5 Loop_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r @ ___________________/ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r @ ___________________/ ____________________/ @ @ Note that we start with inp[2:3]*r^2. This is because it @ doesn't depend on reduction in previous iteration. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ inp[2:3]*r^2 vadd.i32 d24,d24,d14 @ accumulate inp[0:1] vmull.u32 q7,d25,d0[1] vadd.i32 d20,d20,d10 vmull.u32 q5,d21,d0[1] vadd.i32 d26,d26,d16 vmull.u32 q8,d27,d0[1] vmlal.u32 q7,d23,d1[1] vadd.i32 d22,d22,d12 vmull.u32 q6,d23,d0[1] vadd.i32 d28,d28,d18 vmull.u32 q9,d29,d0[1] subs r2,r2,#64 vmlal.u32 q5,d29,d2[1] it lo movlo r4,r5 vmlal.u32 q8,d25,d1[1] vld1.32 d8[1],[r7,:32] vmlal.u32 q6,d21,d1[1] vmlal.u32 q9,d27,d1[1] vmlal.u32 q5,d27,d4[1] vmlal.u32 q8,d23,d3[1] vmlal.u32 q9,d25,d3[1] vmlal.u32 q6,d29,d4[1] vmlal.u32 q7,d21,d3[1] vmlal.u32 q8,d21,d5[1] vmlal.u32 q5,d25,d6[1] vmlal.u32 q9,d23,d5[1] vmlal.u32 q6,d27,d6[1] vmlal.u32 q7,d29,d6[1] vmlal.u32 q8,d29,d8[1] vmlal.u32 q5,d23,d8[1] vmlal.u32 q9,d21,d7[1] vmlal.u32 q6,d25,d8[1] vmlal.u32 q7,d27,d8[1] vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0) add r4,r4,#64 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4 and accumulate vmlal.u32 q8,d26,d0[0] vmlal.u32 q5,d20,d0[0] vmlal.u32 q9,d28,d0[0] vmlal.u32 q6,d22,d0[0] vmlal.u32 q7,d24,d0[0] vld1.32 d8[0],[r6,:32] vmlal.u32 q8,d24,d1[0] vmlal.u32 q5,d28,d2[0] vmlal.u32 q9,d26,d1[0] vmlal.u32 q6,d20,d1[0] vmlal.u32 q7,d22,d1[0] vmlal.u32 q8,d22,d3[0] vmlal.u32 q5,d26,d4[0] vmlal.u32 q9,d24,d3[0] vmlal.u32 q6,d28,d4[0] vmlal.u32 q7,d20,d3[0] vmlal.u32 q8,d20,d5[0] vmlal.u32 q5,d24,d6[0] vmlal.u32 q9,d22,d5[0] vmlal.u32 q6,d26,d6[0] vmlal.u32 q8,d28,d8[0] vmlal.u32 q7,d28,d6[0] vmlal.u32 q5,d22,d8[0] vmlal.u32 q9,d20,d7[0] vmov.i32 q14,#1<<24 @ padbit, yes, always vmlal.u32 q6,d24,d8[0] vmlal.u32 q7,d26,d8[0] vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1] add r1,r1,#64 # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q11,q11 vrev32.8 q12,q12 vrev32.8 q13,q13 # endif @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction interleaved with base 2^32 -> base 2^26 of @ inp[0:3] previously loaded to q10-q13 and smashed to q10-q14. vshr.u64 q15,q8,#26 vmovn.i64 d16,q8 vshr.u64 q4,q5,#26 vmovn.i64 d10,q5 vadd.i64 q9,q9,q15 @ h3 -> h4 vbic.i32 d16,#0xfc000000 vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26 vadd.i64 q6,q6,q4 @ h0 -> h1 vshl.u32 q13,q13,#18 vbic.i32 d10,#0xfc000000 vshrn.u64 d30,q9,#26 vmovn.i64 d18,q9 vshr.u64 q4,q6,#26 vmovn.i64 d12,q6 vadd.i64 q7,q7,q4 @ h1 -> h2 vsri.u32 q13,q12,#14 vbic.i32 d18,#0xfc000000 vshl.u32 q12,q12,#12 vbic.i32 d12,#0xfc000000 vadd.i32 d10,d10,d30 vshl.u32 d30,d30,#2 vbic.i32 q13,#0xfc000000 vshrn.u64 d8,q7,#26 vmovn.i64 d14,q7 vaddl.u32 q5,d10,d30 @ h4 -> h0 [widen for a sec] vsri.u32 q12,q11,#20 vadd.i32 d16,d16,d8 @ h2 -> h3 vshl.u32 q11,q11,#6 vbic.i32 d14,#0xfc000000 vbic.i32 q12,#0xfc000000 vshrn.u64 d30,q5,#26 @ re-narrow vmovn.i64 d10,q5 vsri.u32 q11,q10,#26 vbic.i32 q10,#0xfc000000 vshr.u32 d8,d16,#26 vbic.i32 d16,#0xfc000000 vbic.i32 d10,#0xfc000000 vadd.i32 d12,d12,d30 @ h0 -> h1 vadd.i32 d18,d18,d8 @ h3 -> h4 vbic.i32 q11,#0xfc000000 bhi Loop_neon Lskip_loop: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 add r7,r0,#(48+0*9*4) add r6,r0,#(48+1*9*4) adds r2,r2,#32 it ne movne r2,#0 bne Long_tail vadd.i32 d25,d24,d14 @ add hash value and move to #hi vadd.i32 d21,d20,d10 vadd.i32 d27,d26,d16 vadd.i32 d23,d22,d12 vadd.i32 d29,d28,d18 Long_tail: vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^1 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^2 vadd.i32 d24,d24,d14 @ can be redundant vmull.u32 q7,d25,d0 vadd.i32 d20,d20,d10 vmull.u32 q5,d21,d0 vadd.i32 d26,d26,d16 vmull.u32 q8,d27,d0 vadd.i32 d22,d22,d12 vmull.u32 q6,d23,d0 vadd.i32 d28,d28,d18 vmull.u32 q9,d29,d0 vmlal.u32 q5,d29,d2 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vmlal.u32 q8,d25,d1 vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vmlal.u32 q6,d21,d1 vmlal.u32 q9,d27,d1 vmlal.u32 q7,d23,d1 vmlal.u32 q8,d23,d3 vld1.32 d8[1],[r7,:32] vmlal.u32 q5,d27,d4 vld1.32 d8[0],[r6,:32] vmlal.u32 q9,d25,d3 vmlal.u32 q6,d29,d4 vmlal.u32 q7,d21,d3 vmlal.u32 q8,d21,d5 it ne addne r7,r0,#(48+2*9*4) vmlal.u32 q5,d25,d6 it ne addne r6,r0,#(48+3*9*4) vmlal.u32 q9,d23,d5 vmlal.u32 q6,d27,d6 vmlal.u32 q7,d29,d6 vmlal.u32 q8,d29,d8 vorn q0,q0,q0 @ all-ones, can be redundant vmlal.u32 q5,d23,d8 vshr.u64 q0,q0,#38 vmlal.u32 q9,d21,d7 vmlal.u32 q6,d25,d8 vmlal.u32 q7,d27,d8 beq Lshort_tail @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4:r^3 and accumulate vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^3 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4 vmlal.u32 q7,d24,d0 vmlal.u32 q5,d20,d0 vmlal.u32 q8,d26,d0 vmlal.u32 q6,d22,d0 vmlal.u32 q9,d28,d0 vmlal.u32 q5,d28,d2 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vmlal.u32 q8,d24,d1 vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vmlal.u32 q6,d20,d1 vmlal.u32 q9,d26,d1 vmlal.u32 q7,d22,d1 vmlal.u32 q8,d22,d3 vld1.32 d8[1],[r7,:32] vmlal.u32 q5,d26,d4 vld1.32 d8[0],[r6,:32] vmlal.u32 q9,d24,d3 vmlal.u32 q6,d28,d4 vmlal.u32 q7,d20,d3 vmlal.u32 q8,d20,d5 vmlal.u32 q5,d24,d6 vmlal.u32 q9,d22,d5 vmlal.u32 q6,d26,d6 vmlal.u32 q7,d28,d6 vmlal.u32 q8,d28,d8 vorn q0,q0,q0 @ all-ones vmlal.u32 q5,d22,d8 vshr.u64 q0,q0,#38 vmlal.u32 q9,d20,d7 vmlal.u32 q6,d24,d8 vmlal.u32 q7,d26,d8 Lshort_tail: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ horizontal addition vadd.i64 d16,d16,d17 vadd.i64 d10,d10,d11 vadd.i64 d18,d18,d19 vadd.i64 d12,d12,d13 vadd.i64 d14,d14,d15 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction, but without narrowing vshr.u64 q15,q8,#26 vand.i64 q8,q8,q0 vshr.u64 q4,q5,#26 vand.i64 q5,q5,q0 vadd.i64 q9,q9,q15 @ h3 -> h4 vadd.i64 q6,q6,q4 @ h0 -> h1 vshr.u64 q15,q9,#26 vand.i64 q9,q9,q0 vshr.u64 q4,q6,#26 vand.i64 q6,q6,q0 vadd.i64 q7,q7,q4 @ h1 -> h2 vadd.i64 q5,q5,q15 vshl.u64 q15,q15,#2 vshr.u64 q4,q7,#26 vand.i64 q7,q7,q0 vadd.i64 q5,q5,q15 @ h4 -> h0 vadd.i64 q8,q8,q4 @ h2 -> h3 vshr.u64 q15,q5,#26 vand.i64 q5,q5,q0 vshr.u64 q4,q8,#26 vand.i64 q8,q8,q0 vadd.i64 q6,q6,q15 @ h0 -> h1 vadd.i64 q9,q9,q4 @ h3 -> h4 cmp r2,#0 bne Leven @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ store hash value vst4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]! vst1.32 {d18[0]},[r0] vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ epilogue ldmia sp!,{r4,r5,r6,r7} Lno_data_neon: bx lr @ bx lr #ifdef __thumb2__ .thumb_func poly1305_emit_neon #endif .align 5 poly1305_emit_neon: ldr ip,[r0,#36] @ is_base2_26 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} tst ip,ip beq Lpoly1305_emit_enter ldmia r0,{r3,r4,r5,r6,r7} eor r8,r8,r8 adds r3,r3,r4,lsl#26 @ base 2^26 -> base 2^32 mov r4,r4,lsr#6 adcs r4,r4,r5,lsl#20 mov r5,r5,lsr#12 adcs r5,r5,r6,lsl#14 mov r6,r6,lsr#18 adcs r6,r6,r7,lsl#8 adc r7,r8,r7,lsr#24 @ can be partially reduced ... and r8,r7,#-4 @ ... so reduce and r7,r6,#3 add r8,r8,r8,lsr#2 @ *= 5 adds r3,r3,r8 adcs r4,r4,#0 adcs r5,r5,#0 adcs r6,r6,#0 adc r7,r7,#0 adds r8,r3,#5 @ compare to modulus adcs r9,r4,#0 adcs r10,r5,#0 adcs r11,r6,#0 adc r7,r7,#0 tst r7,#4 @ did it carry/borrow? it ne movne r3,r8 ldr r8,[r2,#0] it ne movne r4,r9 ldr r9,[r2,#4] it ne movne r5,r10 ldr r10,[r2,#8] it ne movne r6,r11 ldr r11,[r2,#12] adds r3,r3,r8 @ accumulate nonce adcs r4,r4,r9 adcs r5,r5,r10 adc r6,r6,r11 # ifdef __ARMEB__ rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 # endif str r3,[r1,#0] @ store the result str r4,[r1,#4] str r5,[r1,#8] str r6,[r1,#12] ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} bx lr @ bx lr .align 5 Lzeros: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 LOPENSSL_armcap: .word GFp_armcap_P-Lpoly1305_init #endif .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 .comm _GFp_armcap_P,4 .non_lazy_symbol_pointer GFp_armcap_P: .indirect_symbol _GFp_armcap_P .long 0 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/poly1305-armv4-linux32.S000064400000000000000000000613431353224261200173610ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) #include .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .globl GFp_poly1305_emit .hidden GFp_poly1305_emit .globl GFp_poly1305_blocks .hidden GFp_poly1305_blocks .globl GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .type GFp_poly1305_init_asm,%function .align 5 GFp_poly1305_init_asm: .Lpoly1305_init: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} eor r3,r3,r3 cmp r1,#0 str r3,[r0,#0] @ zero hash value str r3,[r0,#4] str r3,[r0,#8] str r3,[r0,#12] str r3,[r0,#16] str r3,[r0,#36] @ is_base2_26 add r0,r0,#20 #ifdef __thumb2__ it eq #endif moveq r0,#0 beq .Lno_key #if __ARM_MAX_ARCH__>=7 adr r11,.Lpoly1305_init ldr r12,.LOPENSSL_armcap #endif ldrb r4,[r1,#0] mov r10,#0x0fffffff ldrb r5,[r1,#1] and r3,r10,#-4 @ 0x0ffffffc ldrb r6,[r1,#2] ldrb r7,[r1,#3] orr r4,r4,r5,lsl#8 ldrb r5,[r1,#4] orr r4,r4,r6,lsl#16 ldrb r6,[r1,#5] orr r4,r4,r7,lsl#24 ldrb r7,[r1,#6] and r4,r4,r10 #if __ARM_MAX_ARCH__>=7 ldr r12,[r11,r12] @ GFp_armcap_P # ifdef __APPLE__ ldr r12,[r12] # endif #endif ldrb r8,[r1,#7] orr r5,r5,r6,lsl#8 ldrb r6,[r1,#8] orr r5,r5,r7,lsl#16 ldrb r7,[r1,#9] orr r5,r5,r8,lsl#24 ldrb r8,[r1,#10] and r5,r5,r3 #if __ARM_MAX_ARCH__>=7 tst r12,#ARMV7_NEON @ check for NEON # ifdef __APPLE__ adr r9,poly1305_blocks_neon adr r11,GFp_poly1305_blocks # ifdef __thumb2__ it ne # endif movne r11,r9 adr r12,GFp_poly1305_emit adr r10,poly1305_emit_neon # ifdef __thumb2__ it ne # endif movne r12,r10 # else # ifdef __thumb2__ itete eq # endif addeq r12,r11,#(GFp_poly1305_emit-.Lpoly1305_init) addne r12,r11,#(poly1305_emit_neon-.Lpoly1305_init) addeq r11,r11,#(GFp_poly1305_blocks-.Lpoly1305_init) addne r11,r11,#(poly1305_blocks_neon-.Lpoly1305_init) # endif # ifdef __thumb2__ orr r12,r12,#1 @ thumb-ify address orr r11,r11,#1 # endif #endif ldrb r9,[r1,#11] orr r6,r6,r7,lsl#8 ldrb r7,[r1,#12] orr r6,r6,r8,lsl#16 ldrb r8,[r1,#13] orr r6,r6,r9,lsl#24 ldrb r9,[r1,#14] and r6,r6,r3 ldrb r10,[r1,#15] orr r7,r7,r8,lsl#8 str r4,[r0,#0] orr r7,r7,r9,lsl#16 str r5,[r0,#4] orr r7,r7,r10,lsl#24 str r6,[r0,#8] and r7,r7,r3 str r7,[r0,#12] #if __ARM_MAX_ARCH__>=7 stmia r2,{r11,r12} @ fill functions table mov r0,#1 #else mov r0,#0 #endif .Lno_key: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm .type GFp_poly1305_blocks,%function .align 5 GFp_poly1305_blocks: stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} ands r2,r2,#-16 beq .Lno_data cmp r3,#0 add r2,r2,r1 @ end pointer sub sp,sp,#32 ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11,r12} @ load context str r0,[sp,#12] @ offload stuff mov lr,r1 str r2,[sp,#16] str r10,[sp,#20] str r11,[sp,#24] str r12,[sp,#28] b .Loop .Loop: #if __ARM_ARCH__<7 ldrb r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi r8,r8,#1 @ 1<<128 ldrb r1,[lr,#-15] ldrb r2,[lr,#-14] ldrb r3,[lr,#-13] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-12] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-11] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-10] adds r4,r4,r3 @ accumulate input ldrb r3,[lr,#-9] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-8] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-7] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-6] adcs r5,r5,r3 ldrb r3,[lr,#-5] orr r1,r0,r1,lsl#8 ldrb r0,[lr,#-4] orr r2,r1,r2,lsl#16 ldrb r1,[lr,#-3] orr r3,r2,r3,lsl#24 ldrb r2,[lr,#-2] adcs r6,r6,r3 ldrb r3,[lr,#-1] orr r1,r0,r1,lsl#8 str lr,[sp,#8] @ offload input pointer orr r2,r1,r2,lsl#16 add r10,r10,r10,lsr#2 orr r3,r2,r3,lsl#24 #else ldr r0,[lr],#16 @ load input # ifdef __thumb2__ it hi # endif addhi r8,r8,#1 @ padbit ldr r1,[lr,#-12] ldr r2,[lr,#-8] ldr r3,[lr,#-4] # ifdef __ARMEB__ rev r0,r0 rev r1,r1 rev r2,r2 rev r3,r3 # endif adds r4,r4,r0 @ accumulate input str lr,[sp,#8] @ offload input pointer adcs r5,r5,r1 add r10,r10,r10,lsr#2 adcs r6,r6,r2 #endif add r11,r11,r11,lsr#2 adcs r7,r7,r3 add r12,r12,r12,lsr#2 umull r2,r3,r5,r9 adc r8,r8,#0 umull r0,r1,r4,r9 umlal r2,r3,r8,r10 umlal r0,r1,r7,r10 ldr r10,[sp,#20] @ reload r10 umlal r2,r3,r6,r12 umlal r0,r1,r5,r12 umlal r2,r3,r7,r11 umlal r0,r1,r6,r11 umlal r2,r3,r4,r10 str r0,[sp,#0] @ future r4 mul r0,r11,r8 ldr r11,[sp,#24] @ reload r11 adds r2,r2,r1 @ d1+=d0>>32 eor r1,r1,r1 adc lr,r3,#0 @ future r6 str r2,[sp,#4] @ future r5 mul r2,r12,r8 eor r3,r3,r3 umlal r0,r1,r7,r12 ldr r12,[sp,#28] @ reload r12 umlal r2,r3,r7,r9 umlal r0,r1,r6,r9 umlal r2,r3,r6,r10 umlal r0,r1,r5,r10 umlal r2,r3,r5,r11 umlal r0,r1,r4,r11 umlal r2,r3,r4,r12 ldr r4,[sp,#0] mul r8,r9,r8 ldr r5,[sp,#4] adds r6,lr,r0 @ d2+=d1>>32 ldr lr,[sp,#8] @ reload input pointer adc r1,r1,#0 adds r7,r2,r1 @ d3+=d2>>32 ldr r0,[sp,#16] @ reload end pointer adc r3,r3,#0 add r8,r8,r3 @ h4+=d3>>32 and r1,r8,#-4 and r8,r8,#3 add r1,r1,r1,lsr#2 @ *=5 adds r4,r4,r1 adcs r5,r5,#0 adcs r6,r6,#0 adcs r7,r7,#0 adc r8,r8,#0 cmp r0,lr @ done yet? bhi .Loop ldr r0,[sp,#12] add sp,sp,#32 stmia r0,{r4,r5,r6,r7,r8} @ store the result .Lno_data: #if __ARM_ARCH__>=5 ldmia sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,pc} #else ldmia sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_blocks,.-GFp_poly1305_blocks .type GFp_poly1305_emit,%function .align 5 GFp_poly1305_emit: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} .Lpoly1305_emit_enter: ldmia r0,{r3,r4,r5,r6,r7} adds r8,r3,#5 @ compare to modulus adcs r9,r4,#0 adcs r10,r5,#0 adcs r11,r6,#0 adc r7,r7,#0 tst r7,#4 @ did it carry/borrow? #ifdef __thumb2__ it ne #endif movne r3,r8 ldr r8,[r2,#0] #ifdef __thumb2__ it ne #endif movne r4,r9 ldr r9,[r2,#4] #ifdef __thumb2__ it ne #endif movne r5,r10 ldr r10,[r2,#8] #ifdef __thumb2__ it ne #endif movne r6,r11 ldr r11,[r2,#12] adds r3,r3,r8 adcs r4,r4,r9 adcs r5,r5,r10 adc r6,r6,r11 #if __ARM_ARCH__>=7 # ifdef __ARMEB__ rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 # endif str r3,[r1,#0] str r4,[r1,#4] str r5,[r1,#8] str r6,[r1,#12] #else strb r3,[r1,#0] mov r3,r3,lsr#8 strb r4,[r1,#4] mov r4,r4,lsr#8 strb r5,[r1,#8] mov r5,r5,lsr#8 strb r6,[r1,#12] mov r6,r6,lsr#8 strb r3,[r1,#1] mov r3,r3,lsr#8 strb r4,[r1,#5] mov r4,r4,lsr#8 strb r5,[r1,#9] mov r5,r5,lsr#8 strb r6,[r1,#13] mov r6,r6,lsr#8 strb r3,[r1,#2] mov r3,r3,lsr#8 strb r4,[r1,#6] mov r4,r4,lsr#8 strb r5,[r1,#10] mov r5,r5,lsr#8 strb r6,[r1,#14] mov r6,r6,lsr#8 strb r3,[r1,#3] strb r4,[r1,#7] strb r5,[r1,#11] strb r6,[r1,#15] #endif ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} #if __ARM_ARCH__>=5 bx lr @ bx lr #else tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_poly1305_emit,.-GFp_poly1305_emit #if __ARM_MAX_ARCH__>=7 .fpu neon .type poly1305_init_neon,%function .align 5 poly1305_init_neon: ldr r4,[r0,#20] @ load key base 2^32 ldr r5,[r0,#24] ldr r6,[r0,#28] ldr r7,[r0,#32] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 and r3,r3,#0x03ffffff and r4,r4,#0x03ffffff and r5,r5,#0x03ffffff vdup.32 d0,r2 @ r^1 in both lanes add r2,r3,r3,lsl#2 @ *5 vdup.32 d1,r3 add r3,r4,r4,lsl#2 vdup.32 d2,r2 vdup.32 d3,r4 add r4,r5,r5,lsl#2 vdup.32 d4,r3 vdup.32 d5,r5 add r5,r6,r6,lsl#2 vdup.32 d6,r4 vdup.32 d7,r6 vdup.32 d8,r5 mov r5,#2 @ counter .Lsquare_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 vmull.u32 q5,d0,d0[1] vmull.u32 q6,d1,d0[1] vmull.u32 q7,d3,d0[1] vmull.u32 q8,d5,d0[1] vmull.u32 q9,d7,d0[1] vmlal.u32 q5,d7,d2[1] vmlal.u32 q6,d0,d1[1] vmlal.u32 q7,d1,d1[1] vmlal.u32 q8,d3,d1[1] vmlal.u32 q9,d5,d1[1] vmlal.u32 q5,d5,d4[1] vmlal.u32 q6,d7,d4[1] vmlal.u32 q8,d1,d3[1] vmlal.u32 q7,d0,d3[1] vmlal.u32 q9,d3,d3[1] vmlal.u32 q5,d3,d6[1] vmlal.u32 q8,d0,d5[1] vmlal.u32 q6,d5,d6[1] vmlal.u32 q7,d7,d6[1] vmlal.u32 q9,d1,d5[1] vmlal.u32 q8,d7,d8[1] vmlal.u32 q5,d1,d8[1] vmlal.u32 q6,d3,d8[1] vmlal.u32 q7,d5,d8[1] vmlal.u32 q9,d0,d7[1] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction as discussed in "NEON crypto" by D.J. Bernstein @ and P. Schwabe @ @ H0>>+H1>>+H2>>+H3>>+H4 @ H3>>+H4>>*5+H0>>+H1 @ @ Trivia. @ @ Result of multiplication of n-bit number by m-bit number is @ n+m bits wide. However! Even though 2^n is a n+1-bit number, @ m-bit number multiplied by 2^n is still n+m bits wide. @ @ Sum of two n-bit numbers is n+1 bits wide, sum of three - n+2, @ and so is sum of four. Sum of 2^m n-m-bit numbers and n-bit @ one is n+1 bits wide. @ @ >>+ denotes Hnext += Hn>>26, Hn &= 0x3ffffff. This means that @ H0, H2, H3 are guaranteed to be 26 bits wide, while H1 and H4 @ can be 27. However! In cases when their width exceeds 26 bits @ they are limited by 2^26+2^6. This in turn means that *sum* @ of the products with these values can still be viewed as sum @ of 52-bit numbers as long as the amount of addends is not a @ power of 2. For example, @ @ H4 = H4*R0 + H3*R1 + H2*R2 + H1*R3 + H0 * R4, @ @ which can't be larger than 5 * (2^26 + 2^6) * (2^26 + 2^6), or @ 5 * (2^52 + 2*2^32 + 2^12), which in turn is smaller than @ 8 * (2^52) or 2^55. However, the value is then multiplied by @ by 5, so we should be looking at 5 * 5 * (2^52 + 2^33 + 2^12), @ which is less than 32 * (2^52) or 2^57. And when processing @ data we are looking at triple as many addends... @ @ In key setup procedure pre-reduced H0 is limited by 5*4+1 and @ 5*H4 - by 5*5 52-bit addends, or 57 bits. But when hashing the @ input H0 is limited by (5*4+1)*3 addends, or 58 bits, while @ 5*H4 by 5*5*3, or 59[!] bits. How is this relevant? vmlal.u32 @ instruction accepts 2x32-bit input and writes 2x64-bit result. @ This means that result of reduction have to be compressed upon @ loop wrap-around. This can be done in the process of reduction @ to minimize amount of instructions [as well as amount of @ 128-bit instructions, which benefits low-end processors], but @ one has to watch for H2 (which is narrower than H0) and 5*H4 @ not being wider than 58 bits, so that result of right shift @ by 26 bits fits in 32 bits. This is also useful on x86, @ because it allows to use paddd in place for paddq, which @ benefits Atom, where paddq is ridiculously slow. vshr.u64 q15,q8,#26 vmovn.i64 d16,q8 vshr.u64 q4,q5,#26 vmovn.i64 d10,q5 vadd.i64 q9,q9,q15 @ h3 -> h4 vbic.i32 d16,#0xfc000000 @ &=0x03ffffff vadd.i64 q6,q6,q4 @ h0 -> h1 vbic.i32 d10,#0xfc000000 vshrn.u64 d30,q9,#26 vmovn.i64 d18,q9 vshr.u64 q4,q6,#26 vmovn.i64 d12,q6 vadd.i64 q7,q7,q4 @ h1 -> h2 vbic.i32 d18,#0xfc000000 vbic.i32 d12,#0xfc000000 vadd.i32 d10,d10,d30 vshl.u32 d30,d30,#2 vshrn.u64 d8,q7,#26 vmovn.i64 d14,q7 vadd.i32 d10,d10,d30 @ h4 -> h0 vadd.i32 d16,d16,d8 @ h2 -> h3 vbic.i32 d14,#0xfc000000 vshr.u32 d30,d10,#26 vbic.i32 d10,#0xfc000000 vshr.u32 d8,d16,#26 vbic.i32 d16,#0xfc000000 vadd.i32 d12,d12,d30 @ h0 -> h1 vadd.i32 d18,d18,d8 @ h3 -> h4 subs r5,r5,#1 beq .Lsquare_break_neon add r6,r0,#(48+0*9*4) add r7,r0,#(48+1*9*4) vtrn.32 d0,d10 @ r^2:r^1 vtrn.32 d3,d14 vtrn.32 d5,d16 vtrn.32 d1,d12 vtrn.32 d7,d18 vshl.u32 d4,d3,#2 @ *5 vshl.u32 d6,d5,#2 vshl.u32 d2,d1,#2 vshl.u32 d8,d7,#2 vadd.i32 d4,d4,d3 vadd.i32 d2,d2,d1 vadd.i32 d6,d6,d5 vadd.i32 d8,d8,d7 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vst1.32 {d8[0]},[r6,:32] vst1.32 {d8[1]},[r7,:32] b .Lsquare_neon .align 4 .Lsquare_break_neon: add r6,r0,#(48+2*4*9) add r7,r0,#(48+3*4*9) vmov d0,d10 @ r^4:r^3 vshl.u32 d2,d12,#2 @ *5 vmov d1,d12 vshl.u32 d4,d14,#2 vmov d3,d14 vshl.u32 d6,d16,#2 vmov d5,d16 vshl.u32 d8,d18,#2 vmov d7,d18 vadd.i32 d2,d2,d12 vadd.i32 d4,d4,d14 vadd.i32 d6,d6,d16 vadd.i32 d8,d8,d18 vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vst1.32 {d8[0]},[r6] vst1.32 {d8[1]},[r7] bx lr @ bx lr .size poly1305_init_neon,.-poly1305_init_neon .type poly1305_blocks_neon,%function .align 5 poly1305_blocks_neon: ldr ip,[r0,#36] @ is_base2_26 ands r2,r2,#-16 beq .Lno_data_neon cmp r2,#64 bhs .Lenter_neon tst ip,ip @ is_base2_26? beq GFp_poly1305_blocks .Lenter_neon: stmdb sp!,{r4,r5,r6,r7} vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so tst ip,ip @ is_base2_26? bne .Lbase2_26_neon stmdb sp!,{r1,r2,r3,lr} bl poly1305_init_neon ldr r4,[r0,#0] @ load hash value base 2^32 ldr r5,[r0,#4] ldr r6,[r0,#8] ldr r7,[r0,#12] ldr ip,[r0,#16] and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26 mov r3,r4,lsr#26 veor d10,d10,d10 mov r4,r5,lsr#20 orr r3,r3,r5,lsl#6 veor d12,d12,d12 mov r5,r6,lsr#14 orr r4,r4,r6,lsl#12 veor d14,d14,d14 mov r6,r7,lsr#8 orr r5,r5,r7,lsl#18 veor d16,d16,d16 and r3,r3,#0x03ffffff orr r6,r6,ip,lsl#24 veor d18,d18,d18 and r4,r4,#0x03ffffff mov r1,#1 and r5,r5,#0x03ffffff str r1,[r0,#36] @ is_base2_26 vmov.32 d10[0],r2 vmov.32 d12[0],r3 vmov.32 d14[0],r4 vmov.32 d16[0],r5 vmov.32 d18[0],r6 adr r5,.Lzeros ldmia sp!,{r1,r2,r3,lr} b .Lbase2_32_neon .align 4 .Lbase2_26_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ load hash value veor d10,d10,d10 veor d12,d12,d12 veor d14,d14,d14 veor d16,d16,d16 veor d18,d18,d18 vld4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]! adr r5,.Lzeros vld1.32 {d18[0]},[r0] sub r0,r0,#16 @ rewind .Lbase2_32_neon: add r4,r1,#32 mov r3,r3,lsl#24 tst r2,#31 beq .Leven vld4.32 {d20[0],d22[0],d24[0],d26[0]},[r1]! vmov.32 d28[0],r3 sub r2,r2,#16 add r4,r1,#32 # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q13,q13 vrev32.8 q11,q11 vrev32.8 q12,q12 # endif vsri.u32 d28,d26,#8 @ base 2^32 -> base 2^26 vshl.u32 d26,d26,#18 vsri.u32 d26,d24,#14 vshl.u32 d24,d24,#12 vadd.i32 d29,d28,d18 @ add hash value and move to #hi vbic.i32 d26,#0xfc000000 vsri.u32 d24,d22,#20 vshl.u32 d22,d22,#6 vbic.i32 d24,#0xfc000000 vsri.u32 d22,d20,#26 vadd.i32 d27,d26,d16 vbic.i32 d20,#0xfc000000 vbic.i32 d22,#0xfc000000 vadd.i32 d25,d24,d14 vadd.i32 d21,d20,d10 vadd.i32 d23,d22,d12 mov r7,r5 add r6,r0,#48 cmp r2,r2 b .Long_tail .align 4 .Leven: subs r2,r2,#64 it lo movlo r4,r5 vmov.i32 q14,#1<<24 @ padbit, yes, always vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1] add r1,r1,#64 vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0) add r4,r4,#64 itt hi addhi r7,r0,#(48+1*9*4) addhi r6,r0,#(48+3*9*4) # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q13,q13 vrev32.8 q11,q11 vrev32.8 q12,q12 # endif vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26 vshl.u32 q13,q13,#18 vsri.u32 q13,q12,#14 vshl.u32 q12,q12,#12 vbic.i32 q13,#0xfc000000 vsri.u32 q12,q11,#20 vshl.u32 q11,q11,#6 vbic.i32 q12,#0xfc000000 vsri.u32 q11,q10,#26 vbic.i32 q10,#0xfc000000 vbic.i32 q11,#0xfc000000 bls .Lskip_loop vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^2 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! b .Loop_neon .align 5 .Loop_neon: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r @ ___________________/ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r @ ___________________/ ____________________/ @ @ Note that we start with inp[2:3]*r^2. This is because it @ doesn't depend on reduction in previous iteration. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4 @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4 @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4 @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4 @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ inp[2:3]*r^2 vadd.i32 d24,d24,d14 @ accumulate inp[0:1] vmull.u32 q7,d25,d0[1] vadd.i32 d20,d20,d10 vmull.u32 q5,d21,d0[1] vadd.i32 d26,d26,d16 vmull.u32 q8,d27,d0[1] vmlal.u32 q7,d23,d1[1] vadd.i32 d22,d22,d12 vmull.u32 q6,d23,d0[1] vadd.i32 d28,d28,d18 vmull.u32 q9,d29,d0[1] subs r2,r2,#64 vmlal.u32 q5,d29,d2[1] it lo movlo r4,r5 vmlal.u32 q8,d25,d1[1] vld1.32 d8[1],[r7,:32] vmlal.u32 q6,d21,d1[1] vmlal.u32 q9,d27,d1[1] vmlal.u32 q5,d27,d4[1] vmlal.u32 q8,d23,d3[1] vmlal.u32 q9,d25,d3[1] vmlal.u32 q6,d29,d4[1] vmlal.u32 q7,d21,d3[1] vmlal.u32 q8,d21,d5[1] vmlal.u32 q5,d25,d6[1] vmlal.u32 q9,d23,d5[1] vmlal.u32 q6,d27,d6[1] vmlal.u32 q7,d29,d6[1] vmlal.u32 q8,d29,d8[1] vmlal.u32 q5,d23,d8[1] vmlal.u32 q9,d21,d7[1] vmlal.u32 q6,d25,d8[1] vmlal.u32 q7,d27,d8[1] vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0) add r4,r4,#64 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4 and accumulate vmlal.u32 q8,d26,d0[0] vmlal.u32 q5,d20,d0[0] vmlal.u32 q9,d28,d0[0] vmlal.u32 q6,d22,d0[0] vmlal.u32 q7,d24,d0[0] vld1.32 d8[0],[r6,:32] vmlal.u32 q8,d24,d1[0] vmlal.u32 q5,d28,d2[0] vmlal.u32 q9,d26,d1[0] vmlal.u32 q6,d20,d1[0] vmlal.u32 q7,d22,d1[0] vmlal.u32 q8,d22,d3[0] vmlal.u32 q5,d26,d4[0] vmlal.u32 q9,d24,d3[0] vmlal.u32 q6,d28,d4[0] vmlal.u32 q7,d20,d3[0] vmlal.u32 q8,d20,d5[0] vmlal.u32 q5,d24,d6[0] vmlal.u32 q9,d22,d5[0] vmlal.u32 q6,d26,d6[0] vmlal.u32 q8,d28,d8[0] vmlal.u32 q7,d28,d6[0] vmlal.u32 q5,d22,d8[0] vmlal.u32 q9,d20,d7[0] vmov.i32 q14,#1<<24 @ padbit, yes, always vmlal.u32 q6,d24,d8[0] vmlal.u32 q7,d26,d8[0] vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1] add r1,r1,#64 # ifdef __ARMEB__ vrev32.8 q10,q10 vrev32.8 q11,q11 vrev32.8 q12,q12 vrev32.8 q13,q13 # endif @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction interleaved with base 2^32 -> base 2^26 of @ inp[0:3] previously loaded to q10-q13 and smashed to q10-q14. vshr.u64 q15,q8,#26 vmovn.i64 d16,q8 vshr.u64 q4,q5,#26 vmovn.i64 d10,q5 vadd.i64 q9,q9,q15 @ h3 -> h4 vbic.i32 d16,#0xfc000000 vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26 vadd.i64 q6,q6,q4 @ h0 -> h1 vshl.u32 q13,q13,#18 vbic.i32 d10,#0xfc000000 vshrn.u64 d30,q9,#26 vmovn.i64 d18,q9 vshr.u64 q4,q6,#26 vmovn.i64 d12,q6 vadd.i64 q7,q7,q4 @ h1 -> h2 vsri.u32 q13,q12,#14 vbic.i32 d18,#0xfc000000 vshl.u32 q12,q12,#12 vbic.i32 d12,#0xfc000000 vadd.i32 d10,d10,d30 vshl.u32 d30,d30,#2 vbic.i32 q13,#0xfc000000 vshrn.u64 d8,q7,#26 vmovn.i64 d14,q7 vaddl.u32 q5,d10,d30 @ h4 -> h0 [widen for a sec] vsri.u32 q12,q11,#20 vadd.i32 d16,d16,d8 @ h2 -> h3 vshl.u32 q11,q11,#6 vbic.i32 d14,#0xfc000000 vbic.i32 q12,#0xfc000000 vshrn.u64 d30,q5,#26 @ re-narrow vmovn.i64 d10,q5 vsri.u32 q11,q10,#26 vbic.i32 q10,#0xfc000000 vshr.u32 d8,d16,#26 vbic.i32 d16,#0xfc000000 vbic.i32 d10,#0xfc000000 vadd.i32 d12,d12,d30 @ h0 -> h1 vadd.i32 d18,d18,d8 @ h3 -> h4 vbic.i32 q11,#0xfc000000 bhi .Loop_neon .Lskip_loop: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 add r7,r0,#(48+0*9*4) add r6,r0,#(48+1*9*4) adds r2,r2,#32 it ne movne r2,#0 bne .Long_tail vadd.i32 d25,d24,d14 @ add hash value and move to #hi vadd.i32 d21,d20,d10 vadd.i32 d27,d26,d16 vadd.i32 d23,d22,d12 vadd.i32 d29,d28,d18 .Long_tail: vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^1 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^2 vadd.i32 d24,d24,d14 @ can be redundant vmull.u32 q7,d25,d0 vadd.i32 d20,d20,d10 vmull.u32 q5,d21,d0 vadd.i32 d26,d26,d16 vmull.u32 q8,d27,d0 vadd.i32 d22,d22,d12 vmull.u32 q6,d23,d0 vadd.i32 d28,d28,d18 vmull.u32 q9,d29,d0 vmlal.u32 q5,d29,d2 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vmlal.u32 q8,d25,d1 vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vmlal.u32 q6,d21,d1 vmlal.u32 q9,d27,d1 vmlal.u32 q7,d23,d1 vmlal.u32 q8,d23,d3 vld1.32 d8[1],[r7,:32] vmlal.u32 q5,d27,d4 vld1.32 d8[0],[r6,:32] vmlal.u32 q9,d25,d3 vmlal.u32 q6,d29,d4 vmlal.u32 q7,d21,d3 vmlal.u32 q8,d21,d5 it ne addne r7,r0,#(48+2*9*4) vmlal.u32 q5,d25,d6 it ne addne r6,r0,#(48+3*9*4) vmlal.u32 q9,d23,d5 vmlal.u32 q6,d27,d6 vmlal.u32 q7,d29,d6 vmlal.u32 q8,d29,d8 vorn q0,q0,q0 @ all-ones, can be redundant vmlal.u32 q5,d23,d8 vshr.u64 q0,q0,#38 vmlal.u32 q9,d21,d7 vmlal.u32 q6,d25,d8 vmlal.u32 q7,d27,d8 beq .Lshort_tail @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ (hash+inp[0:1])*r^4:r^3 and accumulate vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^3 vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4 vmlal.u32 q7,d24,d0 vmlal.u32 q5,d20,d0 vmlal.u32 q8,d26,d0 vmlal.u32 q6,d22,d0 vmlal.u32 q9,d28,d0 vmlal.u32 q5,d28,d2 vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]! vmlal.u32 q8,d24,d1 vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]! vmlal.u32 q6,d20,d1 vmlal.u32 q9,d26,d1 vmlal.u32 q7,d22,d1 vmlal.u32 q8,d22,d3 vld1.32 d8[1],[r7,:32] vmlal.u32 q5,d26,d4 vld1.32 d8[0],[r6,:32] vmlal.u32 q9,d24,d3 vmlal.u32 q6,d28,d4 vmlal.u32 q7,d20,d3 vmlal.u32 q8,d20,d5 vmlal.u32 q5,d24,d6 vmlal.u32 q9,d22,d5 vmlal.u32 q6,d26,d6 vmlal.u32 q7,d28,d6 vmlal.u32 q8,d28,d8 vorn q0,q0,q0 @ all-ones vmlal.u32 q5,d22,d8 vshr.u64 q0,q0,#38 vmlal.u32 q9,d20,d7 vmlal.u32 q6,d24,d8 vmlal.u32 q7,d26,d8 .Lshort_tail: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ horizontal addition vadd.i64 d16,d16,d17 vadd.i64 d10,d10,d11 vadd.i64 d18,d18,d19 vadd.i64 d12,d12,d13 vadd.i64 d14,d14,d15 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ lazy reduction, but without narrowing vshr.u64 q15,q8,#26 vand.i64 q8,q8,q0 vshr.u64 q4,q5,#26 vand.i64 q5,q5,q0 vadd.i64 q9,q9,q15 @ h3 -> h4 vadd.i64 q6,q6,q4 @ h0 -> h1 vshr.u64 q15,q9,#26 vand.i64 q9,q9,q0 vshr.u64 q4,q6,#26 vand.i64 q6,q6,q0 vadd.i64 q7,q7,q4 @ h1 -> h2 vadd.i64 q5,q5,q15 vshl.u64 q15,q15,#2 vshr.u64 q4,q7,#26 vand.i64 q7,q7,q0 vadd.i64 q5,q5,q15 @ h4 -> h0 vadd.i64 q8,q8,q4 @ h2 -> h3 vshr.u64 q15,q5,#26 vand.i64 q5,q5,q0 vshr.u64 q4,q8,#26 vand.i64 q8,q8,q0 vadd.i64 q6,q6,q15 @ h0 -> h1 vadd.i64 q9,q9,q4 @ h3 -> h4 cmp r2,#0 bne .Leven @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ store hash value vst4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]! vst1.32 {d18[0]},[r0] vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ epilogue ldmia sp!,{r4,r5,r6,r7} .Lno_data_neon: bx lr @ bx lr .size poly1305_blocks_neon,.-poly1305_blocks_neon .type poly1305_emit_neon,%function .align 5 poly1305_emit_neon: ldr ip,[r0,#36] @ is_base2_26 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} tst ip,ip beq .Lpoly1305_emit_enter ldmia r0,{r3,r4,r5,r6,r7} eor r8,r8,r8 adds r3,r3,r4,lsl#26 @ base 2^26 -> base 2^32 mov r4,r4,lsr#6 adcs r4,r4,r5,lsl#20 mov r5,r5,lsr#12 adcs r5,r5,r6,lsl#14 mov r6,r6,lsr#18 adcs r6,r6,r7,lsl#8 adc r7,r8,r7,lsr#24 @ can be partially reduced ... and r8,r7,#-4 @ ... so reduce and r7,r6,#3 add r8,r8,r8,lsr#2 @ *= 5 adds r3,r3,r8 adcs r4,r4,#0 adcs r5,r5,#0 adcs r6,r6,#0 adc r7,r7,#0 adds r8,r3,#5 @ compare to modulus adcs r9,r4,#0 adcs r10,r5,#0 adcs r11,r6,#0 adc r7,r7,#0 tst r7,#4 @ did it carry/borrow? it ne movne r3,r8 ldr r8,[r2,#0] it ne movne r4,r9 ldr r9,[r2,#4] it ne movne r5,r10 ldr r10,[r2,#8] it ne movne r6,r11 ldr r11,[r2,#12] adds r3,r3,r8 @ accumulate nonce adcs r4,r4,r9 adcs r5,r5,r10 adc r6,r6,r11 # ifdef __ARMEB__ rev r3,r3 rev r4,r4 rev r5,r5 rev r6,r6 # endif str r3,[r1,#0] @ store the result str r4,[r1,#4] str r5,[r1,#8] str r6,[r1,#12] ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} bx lr @ bx lr .size poly1305_emit_neon,.-poly1305_emit_neon .align 5 .Lzeros: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .LOPENSSL_armcap: .word GFp_armcap_P-.Lpoly1305_init #endif .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 .comm GFp_armcap_P,4,4 #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/poly1305-armv8-ios64.S000064400000000000000000000434621353224260600170320ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #include .text // forward "declarations" are required for Apple .globl _GFp_poly1305_blocks .private_extern _GFp_poly1305_blocks .globl _GFp_poly1305_emit .private_extern _GFp_poly1305_emit .globl _GFp_poly1305_init_asm .private_extern _GFp_poly1305_init_asm .align 5 _GFp_poly1305_init_asm: cmp x1,xzr stp xzr,xzr,[x0] // zero hash value stp xzr,xzr,[x0,#16] // [along with is_base2_26] csel x0,xzr,x0,eq b.eq Lno_key #ifdef __ILP32__ ldrsw x11,LGFp_armcap_P #else ldr x11,LGFp_armcap_P #endif adr x10,LGFp_armcap_P ldp x7,x8,[x1] // load key mov x9,#0xfffffffc0fffffff movk x9,#0x0fff,lsl#48 ldr w17,[x10,x11] #ifdef __ARMEB__ rev x7,x7 // flip bytes rev x8,x8 #endif and x7,x7,x9 // &=0ffffffc0fffffff and x9,x9,#-4 and x8,x8,x9 // &=0ffffffc0ffffffc stp x7,x8,[x0,#32] // save key value tst w17,#ARMV7_NEON adr x12,_GFp_poly1305_blocks adr x7,poly1305_blocks_neon adr x13,_GFp_poly1305_emit adr x8,poly1305_emit_neon csel x12,x12,x7,eq csel x13,x13,x8,eq stp x12,x13,[x2] mov x0,#1 Lno_key: ret .align 5 _GFp_poly1305_blocks: ands x2,x2,#-16 b.eq Lno_data ldp x4,x5,[x0] // load hash value ldp x7,x8,[x0,#32] // load key value ldr x6,[x0,#16] add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) b Loop .align 5 Loop: ldp x10,x11,[x1],#16 // load input sub x2,x2,#16 #ifdef __ARMEB__ rev x10,x10 rev x11,x11 #endif adds x4,x4,x10 // accumulate input adcs x5,x5,x11 mul x12,x4,x7 // h0*r0 adc x6,x6,x3 umulh x13,x4,x7 mul x10,x5,x9 // h1*5*r1 umulh x11,x5,x9 adds x12,x12,x10 mul x10,x4,x8 // h0*r1 adc x13,x13,x11 umulh x14,x4,x8 adds x13,x13,x10 mul x10,x5,x7 // h1*r0 adc x14,x14,xzr umulh x11,x5,x7 adds x13,x13,x10 mul x10,x6,x9 // h2*5*r1 adc x14,x14,x11 mul x11,x6,x7 // h2*r0 adds x13,x13,x10 adc x14,x14,x11 and x10,x14,#-4 // final reduction and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x12,x10 adcs x5,x13,xzr adc x6,x6,xzr cbnz x2,Loop stp x4,x5,[x0] // store hash value str x6,[x0,#16] Lno_data: ret .align 5 _GFp_poly1305_emit: ldp x4,x5,[x0] // load hash base 2^64 ldr x6,[x0,#16] ldp x10,x11,[x2] // load nonce adds x12,x4,#5 // compare to modulus adcs x13,x5,xzr adc x14,x6,xzr tst x14,#-4 // see if it's carried/borrowed csel x4,x4,x12,eq csel x5,x5,x13,eq #ifdef __ARMEB__ ror x10,x10,#32 // flip nonce words ror x11,x11,#32 #endif adds x4,x4,x10 // accumulate nonce adc x5,x5,x11 #ifdef __ARMEB__ rev x4,x4 // flip output bytes rev x5,x5 #endif stp x4,x5,[x1] // write result ret .align 5 poly1305_mult: mul x12,x4,x7 // h0*r0 umulh x13,x4,x7 mul x10,x5,x9 // h1*5*r1 umulh x11,x5,x9 adds x12,x12,x10 mul x10,x4,x8 // h0*r1 adc x13,x13,x11 umulh x14,x4,x8 adds x13,x13,x10 mul x10,x5,x7 // h1*r0 adc x14,x14,xzr umulh x11,x5,x7 adds x13,x13,x10 mul x10,x6,x9 // h2*5*r1 adc x14,x14,x11 mul x11,x6,x7 // h2*r0 adds x13,x13,x10 adc x14,x14,x11 and x10,x14,#-4 // final reduction and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x12,x10 adcs x5,x13,xzr adc x6,x6,xzr ret .align 5 poly1305_splat: and x12,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x13,x4,#26,#26 extr x14,x5,x4,#52 and x14,x14,#0x03ffffff ubfx x15,x5,#14,#26 extr x16,x6,x5,#40 str w12,[x0,#16*0] // r0 add w12,w13,w13,lsl#2 // r1*5 str w13,[x0,#16*1] // r1 add w13,w14,w14,lsl#2 // r2*5 str w12,[x0,#16*2] // s1 str w14,[x0,#16*3] // r2 add w14,w15,w15,lsl#2 // r3*5 str w13,[x0,#16*4] // s2 str w15,[x0,#16*5] // r3 add w15,w16,w16,lsl#2 // r4*5 str w14,[x0,#16*6] // s3 str w16,[x0,#16*7] // r4 str w15,[x0,#16*8] // s4 ret .align 5 poly1305_blocks_neon: ldr x17,[x0,#24] cmp x2,#128 b.hs Lblocks_neon cbz x17,_GFp_poly1305_blocks Lblocks_neon: stp x29,x30,[sp,#-80]! add x29,sp,#0 ands x2,x2,#-16 b.eq Lno_data_neon cbz x17,Lbase2_64_neon ldp w10,w11,[x0] // load hash value base 2^26 ldp w12,w13,[x0,#8] ldr w14,[x0,#16] tst x2,#31 b.eq Leven_neon ldp x7,x8,[x0,#32] // load key value add x4,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr x5,x12,#12 adds x4,x4,x12,lsl#52 add x5,x5,x13,lsl#14 adc x5,x5,xzr lsr x6,x14,#24 adds x5,x5,x14,lsl#40 adc x14,x6,xzr // can be partially reduced... ldp x12,x13,[x1],#16 // load input sub x2,x2,#16 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) and x10,x14,#-4 // ... so reduce and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x4,x10 adcs x5,x5,xzr adc x6,x6,xzr #ifdef __ARMEB__ rev x12,x12 rev x13,x13 #endif adds x4,x4,x12 // accumulate input adcs x5,x5,x13 adc x6,x6,x3 bl poly1305_mult ldr x30,[sp,#8] cbz x3,Lstore_base2_64_neon and x10,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,x4,#26,#26 extr x12,x5,x4,#52 and x12,x12,#0x03ffffff ubfx x13,x5,#14,#26 extr x14,x6,x5,#40 cbnz x2,Leven_neon stp w10,w11,[x0] // store hash value base 2^26 stp w12,w13,[x0,#8] str w14,[x0,#16] b Lno_data_neon .align 4 Lstore_base2_64_neon: stp x4,x5,[x0] // store hash value base 2^64 stp x6,xzr,[x0,#16] // note that is_base2_26 is zeroed b Lno_data_neon .align 4 Lbase2_64_neon: ldp x7,x8,[x0,#32] // load key value ldp x4,x5,[x0] // load hash value base 2^64 ldr x6,[x0,#16] tst x2,#31 b.eq Linit_neon ldp x12,x13,[x1],#16 // load input sub x2,x2,#16 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) #ifdef __ARMEB__ rev x12,x12 rev x13,x13 #endif adds x4,x4,x12 // accumulate input adcs x5,x5,x13 adc x6,x6,x3 bl poly1305_mult Linit_neon: and x10,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,x4,#26,#26 extr x12,x5,x4,#52 and x12,x12,#0x03ffffff ubfx x13,x5,#14,#26 extr x14,x6,x5,#40 stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov d24,x10 fmov d25,x11 fmov d26,x12 fmov d27,x13 fmov d28,x14 ////////////////////////////////// initialize r^n table mov x4,x7 // r^1 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) mov x5,x8 mov x6,xzr add x0,x0,#48+12 bl poly1305_splat bl poly1305_mult // r^2 sub x0,x0,#4 bl poly1305_splat bl poly1305_mult // r^3 sub x0,x0,#4 bl poly1305_splat bl poly1305_mult // r^4 sub x0,x0,#4 bl poly1305_splat ldr x30,[sp,#8] add x16,x1,#32 adr x17,Lzeros subs x2,x2,#64 csel x16,x17,x16,lo mov x4,#1 str x4,[x0,#-24] // set is_base2_26 sub x0,x0,#48 // restore original x0 b Ldo_neon .align 4 Leven_neon: add x16,x1,#32 adr x17,Lzeros subs x2,x2,#64 csel x16,x17,x16,lo stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov d24,x10 fmov d25,x11 fmov d26,x12 fmov d27,x13 fmov d28,x14 Ldo_neon: ldp x8,x12,[x16],#16 // inp[2:3] (or zero) ldp x9,x13,[x16],#48 lsl x3,x3,#24 add x15,x0,#48 #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov d14,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,x3,x12,lsr#40 add x13,x3,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov d15,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 fmov d16,x8 fmov d17,x10 fmov d18,x12 ldp x8,x12,[x1],#16 // inp[0:1] ldp x9,x13,[x1],#48 ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x15],#64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64 ld1 {v8.4s},[x15] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov d9,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,x3,x12,lsr#40 add x13,x3,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov d10,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 movi v31.2d,#-1 fmov d11,x8 fmov d12,x10 fmov d13,x12 ushr v31.2d,v31.2d,#38 b.ls Lskip_loop .align 4 Loop_neon: //////////////////////////////////////////////////////////////// // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r // ___________________/ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r // ___________________/ ____________________/ // // Note that we start with inp[2:3]*r^2. This is because it // doesn't depend on reduction in previous iteration. //////////////////////////////////////////////////////////////// // d4 = h0*r4 + h1*r3 + h2*r2 + h3*r1 + h4*r0 // d3 = h0*r3 + h1*r2 + h2*r1 + h3*r0 + h4*5*r4 // d2 = h0*r2 + h1*r1 + h2*r0 + h3*5*r4 + h4*5*r3 // d1 = h0*r1 + h1*r0 + h2*5*r4 + h3*5*r3 + h4*5*r2 // d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1 subs x2,x2,#64 umull v23.2d,v14.2s,v7.s[2] csel x16,x17,x16,lo umull v22.2d,v14.2s,v5.s[2] umull v21.2d,v14.2s,v3.s[2] ldp x8,x12,[x16],#16 // inp[2:3] (or zero) umull v20.2d,v14.2s,v1.s[2] ldp x9,x13,[x16],#48 umull v19.2d,v14.2s,v0.s[2] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif umlal v23.2d,v15.2s,v5.s[2] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal v22.2d,v15.2s,v3.s[2] and x5,x9,#0x03ffffff umlal v21.2d,v15.2s,v1.s[2] ubfx x6,x8,#26,#26 umlal v20.2d,v15.2s,v0.s[2] ubfx x7,x9,#26,#26 umlal v19.2d,v15.2s,v8.s[2] add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal v23.2d,v16.2s,v3.s[2] extr x8,x12,x8,#52 umlal v22.2d,v16.2s,v1.s[2] extr x9,x13,x9,#52 umlal v21.2d,v16.2s,v0.s[2] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal v20.2d,v16.2s,v8.s[2] fmov d14,x4 umlal v19.2d,v16.2s,v6.s[2] and x8,x8,#0x03ffffff umlal v23.2d,v17.2s,v1.s[2] and x9,x9,#0x03ffffff umlal v22.2d,v17.2s,v0.s[2] ubfx x10,x12,#14,#26 umlal v21.2d,v17.2s,v8.s[2] ubfx x11,x13,#14,#26 umlal v20.2d,v17.2s,v6.s[2] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal v19.2d,v17.2s,v4.s[2] fmov d15,x6 add v11.2s,v11.2s,v26.2s add x12,x3,x12,lsr#40 umlal v23.2d,v18.2s,v0.s[2] add x13,x3,x13,lsr#40 umlal v22.2d,v18.2s,v8.s[2] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal v21.2d,v18.2s,v6.s[2] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal v20.2d,v18.2s,v4.s[2] fmov d16,x8 umlal v19.2d,v18.2s,v2.s[2] fmov d17,x10 //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4 and accumulate add v9.2s,v9.2s,v24.2s fmov d18,x12 umlal v22.2d,v11.2s,v1.s[0] ldp x8,x12,[x1],#16 // inp[0:1] umlal v19.2d,v11.2s,v6.s[0] ldp x9,x13,[x1],#48 umlal v23.2d,v11.2s,v3.s[0] umlal v20.2d,v11.2s,v8.s[0] umlal v21.2d,v11.2s,v0.s[0] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif add v10.2s,v10.2s,v25.2s umlal v22.2d,v9.2s,v5.s[0] umlal v23.2d,v9.2s,v7.s[0] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal v21.2d,v9.2s,v3.s[0] and x5,x9,#0x03ffffff umlal v19.2d,v9.2s,v0.s[0] ubfx x6,x8,#26,#26 umlal v20.2d,v9.2s,v1.s[0] ubfx x7,x9,#26,#26 add v12.2s,v12.2s,v27.2s add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal v22.2d,v10.2s,v3.s[0] extr x8,x12,x8,#52 umlal v23.2d,v10.2s,v5.s[0] extr x9,x13,x9,#52 umlal v19.2d,v10.2s,v8.s[0] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal v21.2d,v10.2s,v1.s[0] fmov d9,x4 umlal v20.2d,v10.2s,v0.s[0] and x8,x8,#0x03ffffff add v13.2s,v13.2s,v28.2s and x9,x9,#0x03ffffff umlal v22.2d,v12.2s,v0.s[0] ubfx x10,x12,#14,#26 umlal v19.2d,v12.2s,v4.s[0] ubfx x11,x13,#14,#26 umlal v23.2d,v12.2s,v1.s[0] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal v20.2d,v12.2s,v6.s[0] fmov d10,x6 umlal v21.2d,v12.2s,v8.s[0] add x12,x3,x12,lsr#40 umlal v22.2d,v13.2s,v8.s[0] add x13,x3,x13,lsr#40 umlal v19.2d,v13.2s,v2.s[0] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal v23.2d,v13.2s,v0.s[0] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal v20.2d,v13.2s,v4.s[0] fmov d11,x8 umlal v21.2d,v13.2s,v6.s[0] fmov d12,x10 fmov d13,x12 ///////////////////////////////////////////////////////////////// // lazy reduction as discussed in "NEON crypto" by D.J. Bernstein // and P. Schwabe // // [see discussion in poly1305-armv4 module] ushr v29.2d,v22.2d,#26 xtn v27.2s,v22.2d ushr v30.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b add v23.2d,v23.2d,v29.2d // h3 -> h4 bic v27.2s,#0xfc,lsl#24 // &=0x03ffffff add v20.2d,v20.2d,v30.2d // h0 -> h1 ushr v29.2d,v23.2d,#26 xtn v28.2s,v23.2d ushr v30.2d,v20.2d,#26 xtn v25.2s,v20.2d bic v28.2s,#0xfc,lsl#24 add v21.2d,v21.2d,v30.2d // h1 -> h2 add v19.2d,v19.2d,v29.2d shl v29.2d,v29.2d,#2 shrn v30.2s,v21.2d,#26 xtn v26.2s,v21.2d add v19.2d,v19.2d,v29.2d // h4 -> h0 bic v25.2s,#0xfc,lsl#24 add v27.2s,v27.2s,v30.2s // h2 -> h3 bic v26.2s,#0xfc,lsl#24 shrn v29.2s,v19.2d,#26 xtn v24.2s,v19.2d ushr v30.2s,v27.2s,#26 bic v27.2s,#0xfc,lsl#24 bic v24.2s,#0xfc,lsl#24 add v25.2s,v25.2s,v29.2s // h0 -> h1 add v28.2s,v28.2s,v30.2s // h3 -> h4 b.hi Loop_neon Lskip_loop: dup v16.2d,v16.d[0] add v11.2s,v11.2s,v26.2s //////////////////////////////////////////////////////////////// // multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 adds x2,x2,#32 b.ne Long_tail dup v16.2d,v11.d[0] add v14.2s,v9.2s,v24.2s add v17.2s,v12.2s,v27.2s add v15.2s,v10.2s,v25.2s add v18.2s,v13.2s,v28.2s Long_tail: dup v14.2d,v14.d[0] umull2 v19.2d,v16.4s,v6.4s umull2 v22.2d,v16.4s,v1.4s umull2 v23.2d,v16.4s,v3.4s umull2 v21.2d,v16.4s,v0.4s umull2 v20.2d,v16.4s,v8.4s dup v15.2d,v15.d[0] umlal2 v19.2d,v14.4s,v0.4s umlal2 v21.2d,v14.4s,v3.4s umlal2 v22.2d,v14.4s,v5.4s umlal2 v23.2d,v14.4s,v7.4s umlal2 v20.2d,v14.4s,v1.4s dup v17.2d,v17.d[0] umlal2 v19.2d,v15.4s,v8.4s umlal2 v22.2d,v15.4s,v3.4s umlal2 v21.2d,v15.4s,v1.4s umlal2 v23.2d,v15.4s,v5.4s umlal2 v20.2d,v15.4s,v0.4s dup v18.2d,v18.d[0] umlal2 v22.2d,v17.4s,v0.4s umlal2 v23.2d,v17.4s,v1.4s umlal2 v19.2d,v17.4s,v4.4s umlal2 v20.2d,v17.4s,v6.4s umlal2 v21.2d,v17.4s,v8.4s umlal2 v22.2d,v18.4s,v8.4s umlal2 v19.2d,v18.4s,v2.4s umlal2 v23.2d,v18.4s,v0.4s umlal2 v20.2d,v18.4s,v4.4s umlal2 v21.2d,v18.4s,v6.4s b.eq Lshort_tail //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4:r^3 and accumulate add v9.2s,v9.2s,v24.2s umlal v22.2d,v11.2s,v1.2s umlal v19.2d,v11.2s,v6.2s umlal v23.2d,v11.2s,v3.2s umlal v20.2d,v11.2s,v8.2s umlal v21.2d,v11.2s,v0.2s add v10.2s,v10.2s,v25.2s umlal v22.2d,v9.2s,v5.2s umlal v19.2d,v9.2s,v0.2s umlal v23.2d,v9.2s,v7.2s umlal v20.2d,v9.2s,v1.2s umlal v21.2d,v9.2s,v3.2s add v12.2s,v12.2s,v27.2s umlal v22.2d,v10.2s,v3.2s umlal v19.2d,v10.2s,v8.2s umlal v23.2d,v10.2s,v5.2s umlal v20.2d,v10.2s,v0.2s umlal v21.2d,v10.2s,v1.2s add v13.2s,v13.2s,v28.2s umlal v22.2d,v12.2s,v0.2s umlal v19.2d,v12.2s,v4.2s umlal v23.2d,v12.2s,v1.2s umlal v20.2d,v12.2s,v6.2s umlal v21.2d,v12.2s,v8.2s umlal v22.2d,v13.2s,v8.2s umlal v19.2d,v13.2s,v2.2s umlal v23.2d,v13.2s,v0.2s umlal v20.2d,v13.2s,v4.2s umlal v21.2d,v13.2s,v6.2s Lshort_tail: //////////////////////////////////////////////////////////////// // horizontal add addp v22.2d,v22.2d,v22.2d ldp d8,d9,[sp,#16] // meet ABI requirements addp v19.2d,v19.2d,v19.2d ldp d10,d11,[sp,#32] addp v23.2d,v23.2d,v23.2d ldp d12,d13,[sp,#48] addp v20.2d,v20.2d,v20.2d ldp d14,d15,[sp,#64] addp v21.2d,v21.2d,v21.2d //////////////////////////////////////////////////////////////// // lazy reduction, but without narrowing ushr v29.2d,v22.2d,#26 and v22.16b,v22.16b,v31.16b ushr v30.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b add v23.2d,v23.2d,v29.2d // h3 -> h4 add v20.2d,v20.2d,v30.2d // h0 -> h1 ushr v29.2d,v23.2d,#26 and v23.16b,v23.16b,v31.16b ushr v30.2d,v20.2d,#26 and v20.16b,v20.16b,v31.16b add v21.2d,v21.2d,v30.2d // h1 -> h2 add v19.2d,v19.2d,v29.2d shl v29.2d,v29.2d,#2 ushr v30.2d,v21.2d,#26 and v21.16b,v21.16b,v31.16b add v19.2d,v19.2d,v29.2d // h4 -> h0 add v22.2d,v22.2d,v30.2d // h2 -> h3 ushr v29.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b ushr v30.2d,v22.2d,#26 and v22.16b,v22.16b,v31.16b add v20.2d,v20.2d,v29.2d // h0 -> h1 add v23.2d,v23.2d,v30.2d // h3 -> h4 //////////////////////////////////////////////////////////////// // write the result, can be partially reduced st4 {v19.s,v20.s,v21.s,v22.s}[0],[x0],#16 st1 {v23.s}[0],[x0] Lno_data_neon: ldr x29,[sp],#80 ret .align 5 poly1305_emit_neon: ldr x17,[x0,#24] cbz x17,_GFp_poly1305_emit ldp w10,w11,[x0] // load hash value base 2^26 ldp w12,w13,[x0,#8] ldr w14,[x0,#16] add x4,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr x5,x12,#12 adds x4,x4,x12,lsl#52 add x5,x5,x13,lsl#14 adc x5,x5,xzr lsr x6,x14,#24 adds x5,x5,x14,lsl#40 adc x6,x6,xzr // can be partially reduced... ldp x10,x11,[x2] // load nonce and x12,x6,#-4 // ... so reduce add x12,x12,x6,lsr#2 and x6,x6,#3 adds x4,x4,x12 adcs x5,x5,xzr adc x6,x6,xzr adds x12,x4,#5 // compare to modulus adcs x13,x5,xzr adc x14,x6,xzr tst x14,#-4 // see if it's carried/borrowed csel x4,x4,x12,eq csel x5,x5,x13,eq #ifdef __ARMEB__ ror x10,x10,#32 // flip nonce words ror x11,x11,#32 #endif adds x4,x4,x10 // accumulate nonce adc x5,x5,x11 #ifdef __ARMEB__ rev x4,x4 // flip output bytes rev x5,x5 #endif stp x4,x5,[x1] // write result ret .align 5 Lzeros: .long 0,0,0,0,0,0,0,0 LGFp_armcap_P: #ifdef __ILP32__ .long _GFp_armcap_P-. #else .quad _GFp_armcap_P-. #endif .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/poly1305-armv8-linux64.S000064400000000000000000000445571353224260700174060ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) #include .text // forward "declarations" are required for Apple .globl GFp_poly1305_blocks .hidden GFp_poly1305_blocks .globl GFp_poly1305_emit .hidden GFp_poly1305_emit .globl GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .type GFp_poly1305_init_asm,%function .align 5 GFp_poly1305_init_asm: cmp x1,xzr stp xzr,xzr,[x0] // zero hash value stp xzr,xzr,[x0,#16] // [along with is_base2_26] csel x0,xzr,x0,eq b.eq .Lno_key #ifdef __ILP32__ ldrsw x11,.LGFp_armcap_P #else ldr x11,.LGFp_armcap_P #endif adr x10,.LGFp_armcap_P ldp x7,x8,[x1] // load key mov x9,#0xfffffffc0fffffff movk x9,#0x0fff,lsl#48 ldr w17,[x10,x11] #ifdef __ARMEB__ rev x7,x7 // flip bytes rev x8,x8 #endif and x7,x7,x9 // &=0ffffffc0fffffff and x9,x9,#-4 and x8,x8,x9 // &=0ffffffc0ffffffc stp x7,x8,[x0,#32] // save key value tst w17,#ARMV7_NEON adr x12,GFp_poly1305_blocks adr x7,poly1305_blocks_neon adr x13,GFp_poly1305_emit adr x8,poly1305_emit_neon csel x12,x12,x7,eq csel x13,x13,x8,eq stp x12,x13,[x2] mov x0,#1 .Lno_key: ret .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm .type GFp_poly1305_blocks,%function .align 5 GFp_poly1305_blocks: ands x2,x2,#-16 b.eq .Lno_data ldp x4,x5,[x0] // load hash value ldp x7,x8,[x0,#32] // load key value ldr x6,[x0,#16] add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) b .Loop .align 5 .Loop: ldp x10,x11,[x1],#16 // load input sub x2,x2,#16 #ifdef __ARMEB__ rev x10,x10 rev x11,x11 #endif adds x4,x4,x10 // accumulate input adcs x5,x5,x11 mul x12,x4,x7 // h0*r0 adc x6,x6,x3 umulh x13,x4,x7 mul x10,x5,x9 // h1*5*r1 umulh x11,x5,x9 adds x12,x12,x10 mul x10,x4,x8 // h0*r1 adc x13,x13,x11 umulh x14,x4,x8 adds x13,x13,x10 mul x10,x5,x7 // h1*r0 adc x14,x14,xzr umulh x11,x5,x7 adds x13,x13,x10 mul x10,x6,x9 // h2*5*r1 adc x14,x14,x11 mul x11,x6,x7 // h2*r0 adds x13,x13,x10 adc x14,x14,x11 and x10,x14,#-4 // final reduction and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x12,x10 adcs x5,x13,xzr adc x6,x6,xzr cbnz x2,.Loop stp x4,x5,[x0] // store hash value str x6,[x0,#16] .Lno_data: ret .size GFp_poly1305_blocks,.-GFp_poly1305_blocks .type GFp_poly1305_emit,%function .align 5 GFp_poly1305_emit: ldp x4,x5,[x0] // load hash base 2^64 ldr x6,[x0,#16] ldp x10,x11,[x2] // load nonce adds x12,x4,#5 // compare to modulus adcs x13,x5,xzr adc x14,x6,xzr tst x14,#-4 // see if it's carried/borrowed csel x4,x4,x12,eq csel x5,x5,x13,eq #ifdef __ARMEB__ ror x10,x10,#32 // flip nonce words ror x11,x11,#32 #endif adds x4,x4,x10 // accumulate nonce adc x5,x5,x11 #ifdef __ARMEB__ rev x4,x4 // flip output bytes rev x5,x5 #endif stp x4,x5,[x1] // write result ret .size GFp_poly1305_emit,.-GFp_poly1305_emit .type poly1305_mult,%function .align 5 poly1305_mult: mul x12,x4,x7 // h0*r0 umulh x13,x4,x7 mul x10,x5,x9 // h1*5*r1 umulh x11,x5,x9 adds x12,x12,x10 mul x10,x4,x8 // h0*r1 adc x13,x13,x11 umulh x14,x4,x8 adds x13,x13,x10 mul x10,x5,x7 // h1*r0 adc x14,x14,xzr umulh x11,x5,x7 adds x13,x13,x10 mul x10,x6,x9 // h2*5*r1 adc x14,x14,x11 mul x11,x6,x7 // h2*r0 adds x13,x13,x10 adc x14,x14,x11 and x10,x14,#-4 // final reduction and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x12,x10 adcs x5,x13,xzr adc x6,x6,xzr ret .size poly1305_mult,.-poly1305_mult .type poly1305_splat,%function .align 5 poly1305_splat: and x12,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x13,x4,#26,#26 extr x14,x5,x4,#52 and x14,x14,#0x03ffffff ubfx x15,x5,#14,#26 extr x16,x6,x5,#40 str w12,[x0,#16*0] // r0 add w12,w13,w13,lsl#2 // r1*5 str w13,[x0,#16*1] // r1 add w13,w14,w14,lsl#2 // r2*5 str w12,[x0,#16*2] // s1 str w14,[x0,#16*3] // r2 add w14,w15,w15,lsl#2 // r3*5 str w13,[x0,#16*4] // s2 str w15,[x0,#16*5] // r3 add w15,w16,w16,lsl#2 // r4*5 str w14,[x0,#16*6] // s3 str w16,[x0,#16*7] // r4 str w15,[x0,#16*8] // s4 ret .size poly1305_splat,.-poly1305_splat .type poly1305_blocks_neon,%function .align 5 poly1305_blocks_neon: ldr x17,[x0,#24] cmp x2,#128 b.hs .Lblocks_neon cbz x17,GFp_poly1305_blocks .Lblocks_neon: stp x29,x30,[sp,#-80]! add x29,sp,#0 ands x2,x2,#-16 b.eq .Lno_data_neon cbz x17,.Lbase2_64_neon ldp w10,w11,[x0] // load hash value base 2^26 ldp w12,w13,[x0,#8] ldr w14,[x0,#16] tst x2,#31 b.eq .Leven_neon ldp x7,x8,[x0,#32] // load key value add x4,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr x5,x12,#12 adds x4,x4,x12,lsl#52 add x5,x5,x13,lsl#14 adc x5,x5,xzr lsr x6,x14,#24 adds x5,x5,x14,lsl#40 adc x14,x6,xzr // can be partially reduced... ldp x12,x13,[x1],#16 // load input sub x2,x2,#16 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) and x10,x14,#-4 // ... so reduce and x6,x14,#3 add x10,x10,x14,lsr#2 adds x4,x4,x10 adcs x5,x5,xzr adc x6,x6,xzr #ifdef __ARMEB__ rev x12,x12 rev x13,x13 #endif adds x4,x4,x12 // accumulate input adcs x5,x5,x13 adc x6,x6,x3 bl poly1305_mult ldr x30,[sp,#8] cbz x3,.Lstore_base2_64_neon and x10,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,x4,#26,#26 extr x12,x5,x4,#52 and x12,x12,#0x03ffffff ubfx x13,x5,#14,#26 extr x14,x6,x5,#40 cbnz x2,.Leven_neon stp w10,w11,[x0] // store hash value base 2^26 stp w12,w13,[x0,#8] str w14,[x0,#16] b .Lno_data_neon .align 4 .Lstore_base2_64_neon: stp x4,x5,[x0] // store hash value base 2^64 stp x6,xzr,[x0,#16] // note that is_base2_26 is zeroed b .Lno_data_neon .align 4 .Lbase2_64_neon: ldp x7,x8,[x0,#32] // load key value ldp x4,x5,[x0] // load hash value base 2^64 ldr x6,[x0,#16] tst x2,#31 b.eq .Linit_neon ldp x12,x13,[x1],#16 // load input sub x2,x2,#16 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) #ifdef __ARMEB__ rev x12,x12 rev x13,x13 #endif adds x4,x4,x12 // accumulate input adcs x5,x5,x13 adc x6,x6,x3 bl poly1305_mult .Linit_neon: and x10,x4,#0x03ffffff // base 2^64 -> base 2^26 ubfx x11,x4,#26,#26 extr x12,x5,x4,#52 and x12,x12,#0x03ffffff ubfx x13,x5,#14,#26 extr x14,x6,x5,#40 stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov d24,x10 fmov d25,x11 fmov d26,x12 fmov d27,x13 fmov d28,x14 ////////////////////////////////// initialize r^n table mov x4,x7 // r^1 add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2) mov x5,x8 mov x6,xzr add x0,x0,#48+12 bl poly1305_splat bl poly1305_mult // r^2 sub x0,x0,#4 bl poly1305_splat bl poly1305_mult // r^3 sub x0,x0,#4 bl poly1305_splat bl poly1305_mult // r^4 sub x0,x0,#4 bl poly1305_splat ldr x30,[sp,#8] add x16,x1,#32 adr x17,.Lzeros subs x2,x2,#64 csel x16,x17,x16,lo mov x4,#1 str x4,[x0,#-24] // set is_base2_26 sub x0,x0,#48 // restore original x0 b .Ldo_neon .align 4 .Leven_neon: add x16,x1,#32 adr x17,.Lzeros subs x2,x2,#64 csel x16,x17,x16,lo stp d8,d9,[sp,#16] // meet ABI requirements stp d10,d11,[sp,#32] stp d12,d13,[sp,#48] stp d14,d15,[sp,#64] fmov d24,x10 fmov d25,x11 fmov d26,x12 fmov d27,x13 fmov d28,x14 .Ldo_neon: ldp x8,x12,[x16],#16 // inp[2:3] (or zero) ldp x9,x13,[x16],#48 lsl x3,x3,#24 add x15,x0,#48 #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov d14,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,x3,x12,lsr#40 add x13,x3,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov d15,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 fmov d16,x8 fmov d17,x10 fmov d18,x12 ldp x8,x12,[x1],#16 // inp[0:1] ldp x9,x13,[x1],#48 ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x15],#64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64 ld1 {v8.4s},[x15] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 and x5,x9,#0x03ffffff ubfx x6,x8,#26,#26 ubfx x7,x9,#26,#26 add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 extr x8,x12,x8,#52 extr x9,x13,x9,#52 add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 fmov d9,x4 and x8,x8,#0x03ffffff and x9,x9,#0x03ffffff ubfx x10,x12,#14,#26 ubfx x11,x13,#14,#26 add x12,x3,x12,lsr#40 add x13,x3,x13,lsr#40 add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 fmov d10,x6 add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 movi v31.2d,#-1 fmov d11,x8 fmov d12,x10 fmov d13,x12 ushr v31.2d,v31.2d,#38 b.ls .Lskip_loop .align 4 .Loop_neon: //////////////////////////////////////////////////////////////// // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r // ___________________/ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2 // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r // ___________________/ ____________________/ // // Note that we start with inp[2:3]*r^2. This is because it // doesn't depend on reduction in previous iteration. //////////////////////////////////////////////////////////////// // d4 = h0*r4 + h1*r3 + h2*r2 + h3*r1 + h4*r0 // d3 = h0*r3 + h1*r2 + h2*r1 + h3*r0 + h4*5*r4 // d2 = h0*r2 + h1*r1 + h2*r0 + h3*5*r4 + h4*5*r3 // d1 = h0*r1 + h1*r0 + h2*5*r4 + h3*5*r3 + h4*5*r2 // d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1 subs x2,x2,#64 umull v23.2d,v14.2s,v7.s[2] csel x16,x17,x16,lo umull v22.2d,v14.2s,v5.s[2] umull v21.2d,v14.2s,v3.s[2] ldp x8,x12,[x16],#16 // inp[2:3] (or zero) umull v20.2d,v14.2s,v1.s[2] ldp x9,x13,[x16],#48 umull v19.2d,v14.2s,v0.s[2] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif umlal v23.2d,v15.2s,v5.s[2] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal v22.2d,v15.2s,v3.s[2] and x5,x9,#0x03ffffff umlal v21.2d,v15.2s,v1.s[2] ubfx x6,x8,#26,#26 umlal v20.2d,v15.2s,v0.s[2] ubfx x7,x9,#26,#26 umlal v19.2d,v15.2s,v8.s[2] add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal v23.2d,v16.2s,v3.s[2] extr x8,x12,x8,#52 umlal v22.2d,v16.2s,v1.s[2] extr x9,x13,x9,#52 umlal v21.2d,v16.2s,v0.s[2] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal v20.2d,v16.2s,v8.s[2] fmov d14,x4 umlal v19.2d,v16.2s,v6.s[2] and x8,x8,#0x03ffffff umlal v23.2d,v17.2s,v1.s[2] and x9,x9,#0x03ffffff umlal v22.2d,v17.2s,v0.s[2] ubfx x10,x12,#14,#26 umlal v21.2d,v17.2s,v8.s[2] ubfx x11,x13,#14,#26 umlal v20.2d,v17.2s,v6.s[2] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal v19.2d,v17.2s,v4.s[2] fmov d15,x6 add v11.2s,v11.2s,v26.2s add x12,x3,x12,lsr#40 umlal v23.2d,v18.2s,v0.s[2] add x13,x3,x13,lsr#40 umlal v22.2d,v18.2s,v8.s[2] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal v21.2d,v18.2s,v6.s[2] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal v20.2d,v18.2s,v4.s[2] fmov d16,x8 umlal v19.2d,v18.2s,v2.s[2] fmov d17,x10 //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4 and accumulate add v9.2s,v9.2s,v24.2s fmov d18,x12 umlal v22.2d,v11.2s,v1.s[0] ldp x8,x12,[x1],#16 // inp[0:1] umlal v19.2d,v11.2s,v6.s[0] ldp x9,x13,[x1],#48 umlal v23.2d,v11.2s,v3.s[0] umlal v20.2d,v11.2s,v8.s[0] umlal v21.2d,v11.2s,v0.s[0] #ifdef __ARMEB__ rev x8,x8 rev x12,x12 rev x9,x9 rev x13,x13 #endif add v10.2s,v10.2s,v25.2s umlal v22.2d,v9.2s,v5.s[0] umlal v23.2d,v9.2s,v7.s[0] and x4,x8,#0x03ffffff // base 2^64 -> base 2^26 umlal v21.2d,v9.2s,v3.s[0] and x5,x9,#0x03ffffff umlal v19.2d,v9.2s,v0.s[0] ubfx x6,x8,#26,#26 umlal v20.2d,v9.2s,v1.s[0] ubfx x7,x9,#26,#26 add v12.2s,v12.2s,v27.2s add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32 umlal v22.2d,v10.2s,v3.s[0] extr x8,x12,x8,#52 umlal v23.2d,v10.2s,v5.s[0] extr x9,x13,x9,#52 umlal v19.2d,v10.2s,v8.s[0] add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32 umlal v21.2d,v10.2s,v1.s[0] fmov d9,x4 umlal v20.2d,v10.2s,v0.s[0] and x8,x8,#0x03ffffff add v13.2s,v13.2s,v28.2s and x9,x9,#0x03ffffff umlal v22.2d,v12.2s,v0.s[0] ubfx x10,x12,#14,#26 umlal v19.2d,v12.2s,v4.s[0] ubfx x11,x13,#14,#26 umlal v23.2d,v12.2s,v1.s[0] add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32 umlal v20.2d,v12.2s,v6.s[0] fmov d10,x6 umlal v21.2d,v12.2s,v8.s[0] add x12,x3,x12,lsr#40 umlal v22.2d,v13.2s,v8.s[0] add x13,x3,x13,lsr#40 umlal v19.2d,v13.2s,v2.s[0] add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32 umlal v23.2d,v13.2s,v0.s[0] add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32 umlal v20.2d,v13.2s,v4.s[0] fmov d11,x8 umlal v21.2d,v13.2s,v6.s[0] fmov d12,x10 fmov d13,x12 ///////////////////////////////////////////////////////////////// // lazy reduction as discussed in "NEON crypto" by D.J. Bernstein // and P. Schwabe // // [see discussion in poly1305-armv4 module] ushr v29.2d,v22.2d,#26 xtn v27.2s,v22.2d ushr v30.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b add v23.2d,v23.2d,v29.2d // h3 -> h4 bic v27.2s,#0xfc,lsl#24 // &=0x03ffffff add v20.2d,v20.2d,v30.2d // h0 -> h1 ushr v29.2d,v23.2d,#26 xtn v28.2s,v23.2d ushr v30.2d,v20.2d,#26 xtn v25.2s,v20.2d bic v28.2s,#0xfc,lsl#24 add v21.2d,v21.2d,v30.2d // h1 -> h2 add v19.2d,v19.2d,v29.2d shl v29.2d,v29.2d,#2 shrn v30.2s,v21.2d,#26 xtn v26.2s,v21.2d add v19.2d,v19.2d,v29.2d // h4 -> h0 bic v25.2s,#0xfc,lsl#24 add v27.2s,v27.2s,v30.2s // h2 -> h3 bic v26.2s,#0xfc,lsl#24 shrn v29.2s,v19.2d,#26 xtn v24.2s,v19.2d ushr v30.2s,v27.2s,#26 bic v27.2s,#0xfc,lsl#24 bic v24.2s,#0xfc,lsl#24 add v25.2s,v25.2s,v29.2s // h0 -> h1 add v28.2s,v28.2s,v30.2s // h3 -> h4 b.hi .Loop_neon .Lskip_loop: dup v16.2d,v16.d[0] add v11.2s,v11.2s,v26.2s //////////////////////////////////////////////////////////////// // multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1 adds x2,x2,#32 b.ne .Long_tail dup v16.2d,v11.d[0] add v14.2s,v9.2s,v24.2s add v17.2s,v12.2s,v27.2s add v15.2s,v10.2s,v25.2s add v18.2s,v13.2s,v28.2s .Long_tail: dup v14.2d,v14.d[0] umull2 v19.2d,v16.4s,v6.4s umull2 v22.2d,v16.4s,v1.4s umull2 v23.2d,v16.4s,v3.4s umull2 v21.2d,v16.4s,v0.4s umull2 v20.2d,v16.4s,v8.4s dup v15.2d,v15.d[0] umlal2 v19.2d,v14.4s,v0.4s umlal2 v21.2d,v14.4s,v3.4s umlal2 v22.2d,v14.4s,v5.4s umlal2 v23.2d,v14.4s,v7.4s umlal2 v20.2d,v14.4s,v1.4s dup v17.2d,v17.d[0] umlal2 v19.2d,v15.4s,v8.4s umlal2 v22.2d,v15.4s,v3.4s umlal2 v21.2d,v15.4s,v1.4s umlal2 v23.2d,v15.4s,v5.4s umlal2 v20.2d,v15.4s,v0.4s dup v18.2d,v18.d[0] umlal2 v22.2d,v17.4s,v0.4s umlal2 v23.2d,v17.4s,v1.4s umlal2 v19.2d,v17.4s,v4.4s umlal2 v20.2d,v17.4s,v6.4s umlal2 v21.2d,v17.4s,v8.4s umlal2 v22.2d,v18.4s,v8.4s umlal2 v19.2d,v18.4s,v2.4s umlal2 v23.2d,v18.4s,v0.4s umlal2 v20.2d,v18.4s,v4.4s umlal2 v21.2d,v18.4s,v6.4s b.eq .Lshort_tail //////////////////////////////////////////////////////////////// // (hash+inp[0:1])*r^4:r^3 and accumulate add v9.2s,v9.2s,v24.2s umlal v22.2d,v11.2s,v1.2s umlal v19.2d,v11.2s,v6.2s umlal v23.2d,v11.2s,v3.2s umlal v20.2d,v11.2s,v8.2s umlal v21.2d,v11.2s,v0.2s add v10.2s,v10.2s,v25.2s umlal v22.2d,v9.2s,v5.2s umlal v19.2d,v9.2s,v0.2s umlal v23.2d,v9.2s,v7.2s umlal v20.2d,v9.2s,v1.2s umlal v21.2d,v9.2s,v3.2s add v12.2s,v12.2s,v27.2s umlal v22.2d,v10.2s,v3.2s umlal v19.2d,v10.2s,v8.2s umlal v23.2d,v10.2s,v5.2s umlal v20.2d,v10.2s,v0.2s umlal v21.2d,v10.2s,v1.2s add v13.2s,v13.2s,v28.2s umlal v22.2d,v12.2s,v0.2s umlal v19.2d,v12.2s,v4.2s umlal v23.2d,v12.2s,v1.2s umlal v20.2d,v12.2s,v6.2s umlal v21.2d,v12.2s,v8.2s umlal v22.2d,v13.2s,v8.2s umlal v19.2d,v13.2s,v2.2s umlal v23.2d,v13.2s,v0.2s umlal v20.2d,v13.2s,v4.2s umlal v21.2d,v13.2s,v6.2s .Lshort_tail: //////////////////////////////////////////////////////////////// // horizontal add addp v22.2d,v22.2d,v22.2d ldp d8,d9,[sp,#16] // meet ABI requirements addp v19.2d,v19.2d,v19.2d ldp d10,d11,[sp,#32] addp v23.2d,v23.2d,v23.2d ldp d12,d13,[sp,#48] addp v20.2d,v20.2d,v20.2d ldp d14,d15,[sp,#64] addp v21.2d,v21.2d,v21.2d //////////////////////////////////////////////////////////////// // lazy reduction, but without narrowing ushr v29.2d,v22.2d,#26 and v22.16b,v22.16b,v31.16b ushr v30.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b add v23.2d,v23.2d,v29.2d // h3 -> h4 add v20.2d,v20.2d,v30.2d // h0 -> h1 ushr v29.2d,v23.2d,#26 and v23.16b,v23.16b,v31.16b ushr v30.2d,v20.2d,#26 and v20.16b,v20.16b,v31.16b add v21.2d,v21.2d,v30.2d // h1 -> h2 add v19.2d,v19.2d,v29.2d shl v29.2d,v29.2d,#2 ushr v30.2d,v21.2d,#26 and v21.16b,v21.16b,v31.16b add v19.2d,v19.2d,v29.2d // h4 -> h0 add v22.2d,v22.2d,v30.2d // h2 -> h3 ushr v29.2d,v19.2d,#26 and v19.16b,v19.16b,v31.16b ushr v30.2d,v22.2d,#26 and v22.16b,v22.16b,v31.16b add v20.2d,v20.2d,v29.2d // h0 -> h1 add v23.2d,v23.2d,v30.2d // h3 -> h4 //////////////////////////////////////////////////////////////// // write the result, can be partially reduced st4 {v19.s,v20.s,v21.s,v22.s}[0],[x0],#16 st1 {v23.s}[0],[x0] .Lno_data_neon: ldr x29,[sp],#80 ret .size poly1305_blocks_neon,.-poly1305_blocks_neon .type poly1305_emit_neon,%function .align 5 poly1305_emit_neon: ldr x17,[x0,#24] cbz x17,GFp_poly1305_emit ldp w10,w11,[x0] // load hash value base 2^26 ldp w12,w13,[x0,#8] ldr w14,[x0,#16] add x4,x10,x11,lsl#26 // base 2^26 -> base 2^64 lsr x5,x12,#12 adds x4,x4,x12,lsl#52 add x5,x5,x13,lsl#14 adc x5,x5,xzr lsr x6,x14,#24 adds x5,x5,x14,lsl#40 adc x6,x6,xzr // can be partially reduced... ldp x10,x11,[x2] // load nonce and x12,x6,#-4 // ... so reduce add x12,x12,x6,lsr#2 and x6,x6,#3 adds x4,x4,x12 adcs x5,x5,xzr adc x6,x6,xzr adds x12,x4,#5 // compare to modulus adcs x13,x5,xzr adc x14,x6,xzr tst x14,#-4 // see if it's carried/borrowed csel x4,x4,x12,eq csel x5,x5,x13,eq #ifdef __ARMEB__ ror x10,x10,#32 // flip nonce words ror x11,x11,#32 #endif adds x4,x4,x10 // accumulate nonce adc x5,x5,x11 #ifdef __ARMEB__ rev x4,x4 // flip output bytes rev x5,x5 #endif stp x4,x5,[x1] // write result ret .size poly1305_emit_neon,.-poly1305_emit_neon .align 5 .Lzeros: .long 0,0,0,0,0,0,0,0 .LGFp_armcap_P: #ifdef __ILP32__ .long GFp_armcap_P-. #else .quad GFp_armcap_P-. #endif .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/poly1305-x86-elf.S000064400000000000000000000651651353224261000162230ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .align 64 .globl GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .type GFp_poly1305_init_asm,@function .align 16 GFp_poly1305_init_asm: .L_GFp_poly1305_init_asm_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ebp xorl %eax,%eax movl %eax,(%edi) movl %eax,4(%edi) movl %eax,8(%edi) movl %eax,12(%edi) movl %eax,16(%edi) movl %eax,20(%edi) cmpl $0,%esi je .L000nokey call .L001pic_point .L001pic_point: popl %ebx leal GFp_poly1305_blocks-.L001pic_point(%ebx),%eax leal GFp_poly1305_emit-.L001pic_point(%ebx),%edx leal GFp_ia32cap_P-.L001pic_point(%ebx),%edi movl (%edi),%ecx andl $83886080,%ecx cmpl $83886080,%ecx leal _poly1305_blocks_sse2-.L001pic_point(%ebx),%eax leal _poly1305_emit_sse2-.L001pic_point(%ebx),%edx movl 20(%esp),%edi movl %eax,(%ebp) movl %edx,4(%ebp) movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx andl $268435455,%eax andl $268435452,%ebx andl $268435452,%ecx andl $268435452,%edx movl %eax,24(%edi) movl %ebx,28(%edi) movl %ecx,32(%edi) movl %edx,36(%edi) movl $1,%eax .L000nokey: popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_poly1305_init_asm,.-.L_GFp_poly1305_init_asm_begin .globl GFp_poly1305_blocks .hidden GFp_poly1305_blocks .type GFp_poly1305_blocks,@function .align 16 GFp_poly1305_blocks: .L_GFp_poly1305_blocks_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx .Lenter_blocks: andl $-15,%ecx jz .L002nodata subl $64,%esp movl 24(%edi),%eax movl 28(%edi),%ebx leal (%esi,%ecx,1),%ebp movl 32(%edi),%ecx movl 36(%edi),%edx movl %ebp,92(%esp) movl %esi,%ebp movl %eax,36(%esp) movl %ebx,%eax shrl $2,%eax movl %ebx,40(%esp) addl %ebx,%eax movl %ecx,%ebx shrl $2,%ebx movl %ecx,44(%esp) addl %ecx,%ebx movl %edx,%ecx shrl $2,%ecx movl %edx,48(%esp) addl %edx,%ecx movl %eax,52(%esp) movl %ebx,56(%esp) movl %ecx,60(%esp) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%esi movl 16(%edi),%edi jmp .L003loop .align 32 .L003loop: addl (%ebp),%eax adcl 4(%ebp),%ebx adcl 8(%ebp),%ecx adcl 12(%ebp),%esi leal 16(%ebp),%ebp adcl 96(%esp),%edi movl %eax,(%esp) movl %esi,12(%esp) mull 36(%esp) movl %edi,16(%esp) movl %eax,%edi movl %ebx,%eax movl %edx,%esi mull 60(%esp) addl %eax,%edi movl %ecx,%eax adcl %edx,%esi mull 56(%esp) addl %eax,%edi movl 12(%esp),%eax adcl %edx,%esi mull 52(%esp) addl %eax,%edi movl (%esp),%eax adcl %edx,%esi mull 40(%esp) movl %edi,20(%esp) xorl %edi,%edi addl %eax,%esi movl %ebx,%eax adcl %edx,%edi mull 36(%esp) addl %eax,%esi movl %ecx,%eax adcl %edx,%edi mull 60(%esp) addl %eax,%esi movl 12(%esp),%eax adcl %edx,%edi mull 56(%esp) addl %eax,%esi movl 16(%esp),%eax adcl %edx,%edi imull 52(%esp),%eax addl %eax,%esi movl (%esp),%eax adcl $0,%edi mull 44(%esp) movl %esi,24(%esp) xorl %esi,%esi addl %eax,%edi movl %ebx,%eax adcl %edx,%esi mull 40(%esp) addl %eax,%edi movl %ecx,%eax adcl %edx,%esi mull 36(%esp) addl %eax,%edi movl 12(%esp),%eax adcl %edx,%esi mull 60(%esp) addl %eax,%edi movl 16(%esp),%eax adcl %edx,%esi imull 56(%esp),%eax addl %eax,%edi movl (%esp),%eax adcl $0,%esi mull 48(%esp) movl %edi,28(%esp) xorl %edi,%edi addl %eax,%esi movl %ebx,%eax adcl %edx,%edi mull 44(%esp) addl %eax,%esi movl %ecx,%eax adcl %edx,%edi mull 40(%esp) addl %eax,%esi movl 12(%esp),%eax adcl %edx,%edi mull 36(%esp) addl %eax,%esi movl 16(%esp),%ecx adcl %edx,%edi movl %ecx,%edx imull 60(%esp),%ecx addl %ecx,%esi movl 20(%esp),%eax adcl $0,%edi imull 36(%esp),%edx addl %edi,%edx movl 24(%esp),%ebx movl 28(%esp),%ecx movl %edx,%edi shrl $2,%edx andl $3,%edi leal (%edx,%edx,4),%edx addl %edx,%eax adcl $0,%ebx adcl $0,%ecx adcl $0,%esi adcl $0,%edi cmpl 92(%esp),%ebp jne .L003loop movl 84(%esp),%edx addl $64,%esp movl %eax,(%edx) movl %ebx,4(%edx) movl %ecx,8(%edx) movl %esi,12(%edx) movl %edi,16(%edx) .L002nodata: popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_poly1305_blocks,.-.L_GFp_poly1305_blocks_begin .globl GFp_poly1305_emit .hidden GFp_poly1305_emit .type GFp_poly1305_emit,@function .align 16 GFp_poly1305_emit: .L_GFp_poly1305_emit_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%ebp .Lenter_emit: movl 24(%esp),%edi movl (%ebp),%eax movl 4(%ebp),%ebx movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 16(%ebp),%esi addl $5,%eax adcl $0,%ebx adcl $0,%ecx adcl $0,%edx adcl $0,%esi shrl $2,%esi negl %esi andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) notl %esi movl (%ebp),%eax movl 4(%ebp),%ebx movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 28(%esp),%ebp andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx orl (%edi),%eax orl 4(%edi),%ebx orl 8(%edi),%ecx orl 12(%edi),%edx addl (%ebp),%eax adcl 4(%ebp),%ebx adcl 8(%ebp),%ecx adcl 12(%ebp),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_poly1305_emit,.-.L_GFp_poly1305_emit_begin .align 32 .hidden _poly1305_init_sse2 .type _poly1305_init_sse2,@function .align 16 _poly1305_init_sse2: movdqu 24(%edi),%xmm4 leal 48(%edi),%edi movl %esp,%ebp subl $224,%esp andl $-16,%esp movq 64(%ebx),%xmm7 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 movdqa %xmm4,%xmm2 pand %xmm7,%xmm0 psrlq $26,%xmm1 psrldq $6,%xmm2 pand %xmm7,%xmm1 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 pand %xmm7,%xmm2 pand %xmm7,%xmm3 psrldq $13,%xmm4 leal 144(%esp),%edx movl $2,%ecx .L004square: movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm1,%xmm6 movdqa %xmm2,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm1,%xmm6 paddd %xmm2,%xmm5 movdqa %xmm6,80(%esp) movdqa %xmm5,96(%esp) movdqa %xmm3,%xmm6 movdqa %xmm4,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm3,%xmm6 paddd %xmm4,%xmm5 movdqa %xmm6,112(%esp) movdqa %xmm5,128(%esp) pshufd $68,%xmm0,%xmm6 movdqa %xmm1,%xmm5 pshufd $68,%xmm1,%xmm1 pshufd $68,%xmm2,%xmm2 pshufd $68,%xmm3,%xmm3 pshufd $68,%xmm4,%xmm4 movdqa %xmm6,(%edx) movdqa %xmm1,16(%edx) movdqa %xmm2,32(%edx) movdqa %xmm3,48(%edx) movdqa %xmm4,64(%edx) pmuludq %xmm0,%xmm4 pmuludq %xmm0,%xmm3 pmuludq %xmm0,%xmm2 pmuludq %xmm0,%xmm1 pmuludq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 48(%edx),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa 80(%esp),%xmm6 pmuludq (%edx),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%edx),%xmm6 movdqa 32(%esp),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa 96(%esp),%xmm7 pmuludq (%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%edx),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%edx),%xmm5 movdqa 48(%esp),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa 112(%esp),%xmm5 pmuludq (%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%edx),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%edx),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%edx),%xmm7 movdqa 64(%esp),%xmm5 paddq %xmm6,%xmm1 movdqa 128(%esp),%xmm6 pmuludq (%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%edx),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%edx),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 decl %ecx jz .L005square_break punpcklqdq (%esp),%xmm0 punpcklqdq 16(%esp),%xmm1 punpcklqdq 32(%esp),%xmm2 punpcklqdq 48(%esp),%xmm3 punpcklqdq 64(%esp),%xmm4 jmp .L004square .L005square_break: psllq $32,%xmm0 psllq $32,%xmm1 psllq $32,%xmm2 psllq $32,%xmm3 psllq $32,%xmm4 por (%esp),%xmm0 por 16(%esp),%xmm1 por 32(%esp),%xmm2 por 48(%esp),%xmm3 por 64(%esp),%xmm4 pshufd $141,%xmm0,%xmm0 pshufd $141,%xmm1,%xmm1 pshufd $141,%xmm2,%xmm2 pshufd $141,%xmm3,%xmm3 pshufd $141,%xmm4,%xmm4 movdqu %xmm0,(%edi) movdqu %xmm1,16(%edi) movdqu %xmm2,32(%edi) movdqu %xmm3,48(%edi) movdqu %xmm4,64(%edi) movdqa %xmm1,%xmm6 movdqa %xmm2,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm1,%xmm6 paddd %xmm2,%xmm5 movdqu %xmm6,80(%edi) movdqu %xmm5,96(%edi) movdqa %xmm3,%xmm6 movdqa %xmm4,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm3,%xmm6 paddd %xmm4,%xmm5 movdqu %xmm6,112(%edi) movdqu %xmm5,128(%edi) movl %ebp,%esp leal -48(%edi),%edi ret .size _poly1305_init_sse2,.-_poly1305_init_sse2 .align 32 .hidden _poly1305_blocks_sse2 .type _poly1305_blocks_sse2,@function .align 16 _poly1305_blocks_sse2: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx movl 20(%edi),%eax andl $-16,%ecx jz .L006nodata cmpl $64,%ecx jae .L007enter_sse2 testl %eax,%eax jz .Lenter_blocks .align 16 .L007enter_sse2: call .L008pic_point .L008pic_point: popl %ebx leal .Lconst_sse2-.L008pic_point(%ebx),%ebx testl %eax,%eax jnz .L009base2_26 call _poly1305_init_sse2 movl (%edi),%eax movl 3(%edi),%ecx movl 6(%edi),%edx movl 9(%edi),%esi movl 13(%edi),%ebp movl $1,20(%edi) shrl $2,%ecx andl $67108863,%eax shrl $4,%edx andl $67108863,%ecx shrl $6,%esi andl $67108863,%edx movd %eax,%xmm0 movd %ecx,%xmm1 movd %edx,%xmm2 movd %esi,%xmm3 movd %ebp,%xmm4 movl 24(%esp),%esi movl 28(%esp),%ecx jmp .L010base2_32 .align 16 .L009base2_26: movd (%edi),%xmm0 movd 4(%edi),%xmm1 movd 8(%edi),%xmm2 movd 12(%edi),%xmm3 movd 16(%edi),%xmm4 movdqa 64(%ebx),%xmm7 .L010base2_32: movl 32(%esp),%eax movl %esp,%ebp subl $528,%esp andl $-16,%esp leal 48(%edi),%edi shll $24,%eax testl $31,%ecx jz .L011even movdqu (%esi),%xmm6 leal 16(%esi),%esi movdqa %xmm6,%xmm5 pand %xmm7,%xmm6 paddd %xmm6,%xmm0 movdqa %xmm5,%xmm6 psrlq $26,%xmm5 psrldq $6,%xmm6 pand %xmm7,%xmm5 paddd %xmm5,%xmm1 movdqa %xmm6,%xmm5 psrlq $4,%xmm6 pand %xmm7,%xmm6 paddd %xmm6,%xmm2 movdqa %xmm5,%xmm6 psrlq $30,%xmm5 pand %xmm7,%xmm5 psrldq $7,%xmm6 paddd %xmm5,%xmm3 movd %eax,%xmm5 paddd %xmm6,%xmm4 movd 12(%edi),%xmm6 paddd %xmm5,%xmm4 movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) pmuludq %xmm6,%xmm0 pmuludq %xmm6,%xmm1 pmuludq %xmm6,%xmm2 movd 28(%edi),%xmm5 pmuludq %xmm6,%xmm3 pmuludq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 48(%esp),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movd 92(%edi),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%esp),%xmm6 movd 44(%edi),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%esp),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%esp),%xmm5 paddq %xmm7,%xmm4 movd 108(%edi),%xmm7 pmuludq (%esp),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%esp),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%esp),%xmm5 movd 60(%edi),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%esp),%xmm6 paddq %xmm5,%xmm0 movd 124(%edi),%xmm5 pmuludq (%esp),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%esp),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%esp),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%esp),%xmm7 movd 76(%edi),%xmm5 paddq %xmm6,%xmm1 movd 140(%edi),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%esp),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%esp),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 subl $16,%ecx jz .L012done .L011even: leal 384(%esp),%edx leal -32(%esi),%eax subl $64,%ecx movdqu (%edi),%xmm5 pshufd $68,%xmm5,%xmm6 cmovbl %eax,%esi pshufd $238,%xmm5,%xmm5 movdqa %xmm6,(%edx) leal 160(%esp),%eax movdqu 16(%edi),%xmm6 movdqa %xmm5,-144(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,16(%edx) movdqu 32(%edi),%xmm5 movdqa %xmm6,-128(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,32(%edx) movdqu 48(%edi),%xmm6 movdqa %xmm5,-112(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,48(%edx) movdqu 64(%edi),%xmm5 movdqa %xmm6,-96(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,64(%edx) movdqu 80(%edi),%xmm6 movdqa %xmm5,-80(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,80(%edx) movdqu 96(%edi),%xmm5 movdqa %xmm6,-64(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,96(%edx) movdqu 112(%edi),%xmm6 movdqa %xmm5,-48(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,112(%edx) movdqu 128(%edi),%xmm5 movdqa %xmm6,-32(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,128(%edx) movdqa %xmm5,-16(%edx) movdqu 32(%esi),%xmm5 movdqu 48(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,112(%esp) movdqa %xmm3,128(%esp) movdqa %xmm4,144(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 movdqa %xmm0,80(%esp) movdqa %xmm1,96(%esp) jbe .L013skip_loop jmp .L014loop .align 32 .L014loop: movdqa -144(%edx),%xmm7 movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) movdqa %xmm5,%xmm1 pmuludq %xmm7,%xmm5 movdqa %xmm6,%xmm0 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 pmuludq %xmm7,%xmm3 pmuludq %xmm7,%xmm4 pmuludq -16(%edx),%xmm0 movdqa %xmm1,%xmm7 pmuludq -128(%edx),%xmm1 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq -112(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa %xmm5,%xmm6 pmuludq -96(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 16(%eax),%xmm7 pmuludq -80(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq -128(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq -112(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 32(%eax),%xmm7 pmuludq -96(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq -32(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq -16(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq -128(%edx),%xmm6 paddq %xmm5,%xmm1 movdqa 48(%eax),%xmm5 pmuludq -112(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq -48(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa %xmm6,%xmm7 pmuludq -32(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq -16(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa 64(%eax),%xmm6 pmuludq -128(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa %xmm6,%xmm7 pmuludq -16(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq -64(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq -48(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa 64(%ebx),%xmm7 pmuludq -32(%edx),%xmm6 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqu -32(%esi),%xmm5 movdqu -16(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 leal -32(%esi),%eax subl $64,%ecx paddd 80(%esp),%xmm5 paddd 96(%esp),%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 cmovbl %eax,%esi leal 160(%esp),%eax movdqa (%edx),%xmm7 movdqa %xmm1,16(%esp) movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) movdqa %xmm5,%xmm1 pmuludq %xmm7,%xmm5 paddq %xmm0,%xmm5 movdqa %xmm6,%xmm0 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 pmuludq %xmm7,%xmm3 pmuludq %xmm7,%xmm4 paddq 16(%esp),%xmm6 paddq 32(%esp),%xmm2 paddq 48(%esp),%xmm3 paddq 64(%esp),%xmm4 pmuludq 128(%edx),%xmm0 movdqa %xmm1,%xmm7 pmuludq 16(%edx),%xmm1 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa %xmm5,%xmm6 pmuludq 48(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 16(%eax),%xmm7 pmuludq 64(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 32(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 32(%eax),%xmm7 pmuludq 48(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 112(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 128(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 16(%edx),%xmm6 paddq %xmm5,%xmm1 movdqa 48(%eax),%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 96(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa %xmm6,%xmm7 pmuludq 112(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq 128(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa 64(%eax),%xmm6 pmuludq 16(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa %xmm6,%xmm7 pmuludq 128(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 80(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 96(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa 64(%ebx),%xmm7 pmuludq 112(%edx),%xmm6 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 movdqu 32(%esi),%xmm5 movdqu 48(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,112(%esp) movdqa %xmm3,128(%esp) movdqa %xmm4,144(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 movdqa %xmm0,80(%esp) movdqa %xmm1,96(%esp) ja .L014loop .L013skip_loop: pshufd $16,-144(%edx),%xmm7 addl $32,%ecx jnz .L015long_tail paddd %xmm0,%xmm5 paddd %xmm1,%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 .L015long_tail: movdqa %xmm5,(%eax) movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) pmuludq %xmm7,%xmm5 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 movdqa %xmm5,%xmm0 pshufd $16,-128(%edx),%xmm5 pmuludq %xmm7,%xmm3 movdqa %xmm6,%xmm1 pmuludq %xmm7,%xmm4 movdqa %xmm5,%xmm6 pmuludq 48(%eax),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%eax),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%eax),%xmm7 paddq %xmm6,%xmm3 pshufd $16,-64(%edx),%xmm6 pmuludq (%eax),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%eax),%xmm6 pshufd $16,-112(%edx),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%eax),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%eax),%xmm5 paddq %xmm7,%xmm4 pshufd $16,-48(%edx),%xmm7 pmuludq (%eax),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%eax),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%eax),%xmm5 pshufd $16,-96(%edx),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%eax),%xmm6 paddq %xmm5,%xmm0 pshufd $16,-32(%edx),%xmm5 pmuludq (%eax),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%eax),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%eax),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%eax),%xmm7 pshufd $16,-80(%edx),%xmm5 paddq %xmm6,%xmm1 pshufd $16,-16(%edx),%xmm6 pmuludq (%eax),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%eax),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%eax),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%eax),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%eax),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 jz .L016short_tail movdqu -32(%esi),%xmm5 movdqu -16(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 pshufd $16,(%edx),%xmm7 paddd 80(%esp),%xmm5 paddd 96(%esp),%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 movdqa %xmm5,(%esp) pmuludq %xmm7,%xmm5 movdqa %xmm6,16(%esp) pmuludq %xmm7,%xmm6 paddq %xmm5,%xmm0 movdqa %xmm2,%xmm5 pmuludq %xmm7,%xmm2 paddq %xmm6,%xmm1 movdqa %xmm3,%xmm6 pmuludq %xmm7,%xmm3 paddq 32(%esp),%xmm2 movdqa %xmm5,32(%esp) pshufd $16,16(%edx),%xmm5 paddq 48(%esp),%xmm3 movdqa %xmm6,48(%esp) movdqa %xmm4,%xmm6 pmuludq %xmm7,%xmm4 paddq 64(%esp),%xmm4 movdqa %xmm6,64(%esp) movdqa %xmm5,%xmm6 pmuludq 48(%esp),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 pshufd $16,80(%edx),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%esp),%xmm6 pshufd $16,32(%edx),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%esp),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%esp),%xmm5 paddq %xmm7,%xmm4 pshufd $16,96(%edx),%xmm7 pmuludq (%esp),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%esp),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%esp),%xmm5 pshufd $16,48(%edx),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%esp),%xmm6 paddq %xmm5,%xmm0 pshufd $16,112(%edx),%xmm5 pmuludq (%esp),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%esp),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%esp),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%esp),%xmm7 pshufd $16,64(%edx),%xmm5 paddq %xmm6,%xmm1 pshufd $16,128(%edx),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%esp),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%esp),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 .L016short_tail: pshufd $78,%xmm4,%xmm6 pshufd $78,%xmm3,%xmm5 paddq %xmm6,%xmm4 paddq %xmm5,%xmm3 pshufd $78,%xmm0,%xmm6 pshufd $78,%xmm1,%xmm5 paddq %xmm6,%xmm0 paddq %xmm5,%xmm1 pshufd $78,%xmm2,%xmm6 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm6,%xmm2 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 .L012done: movd %xmm0,-48(%edi) movd %xmm1,-44(%edi) movd %xmm2,-40(%edi) movd %xmm3,-36(%edi) movd %xmm4,-32(%edi) movl %ebp,%esp .L006nodata: popl %edi popl %esi popl %ebx popl %ebp ret .size _poly1305_blocks_sse2,.-_poly1305_blocks_sse2 .align 32 .hidden _poly1305_emit_sse2 .type _poly1305_emit_sse2,@function .align 16 _poly1305_emit_sse2: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%ebp cmpl $0,20(%ebp) je .Lenter_emit movl (%ebp),%eax movl 4(%ebp),%edi movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 16(%ebp),%esi movl %edi,%ebx shll $26,%edi shrl $6,%ebx addl %edi,%eax movl %ecx,%edi adcl $0,%ebx shll $20,%edi shrl $12,%ecx addl %edi,%ebx movl %edx,%edi adcl $0,%ecx shll $14,%edi shrl $18,%edx addl %edi,%ecx movl %esi,%edi adcl $0,%edx shll $8,%edi shrl $24,%esi addl %edi,%edx adcl $0,%esi movl %esi,%edi andl $3,%esi shrl $2,%edi leal (%edi,%edi,4),%ebp movl 24(%esp),%edi addl %ebp,%eax movl 28(%esp),%ebp adcl $0,%ebx adcl $0,%ecx adcl $0,%edx adcl $0,%esi movd %eax,%xmm0 addl $5,%eax movd %ebx,%xmm1 adcl $0,%ebx movd %ecx,%xmm2 adcl $0,%ecx movd %edx,%xmm3 adcl $0,%edx adcl $0,%esi shrl $2,%esi negl %esi andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx movl %eax,(%edi) movd %xmm0,%eax movl %ebx,4(%edi) movd %xmm1,%ebx movl %ecx,8(%edi) movd %xmm2,%ecx movl %edx,12(%edi) movd %xmm3,%edx notl %esi andl %esi,%eax andl %esi,%ebx orl (%edi),%eax andl %esi,%ecx orl 4(%edi),%ebx andl %esi,%edx orl 8(%edi),%ecx orl 12(%edi),%edx addl (%ebp),%eax adcl 4(%ebp),%ebx movl %eax,(%edi) adcl 8(%ebp),%ecx movl %ebx,4(%edi) adcl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) popl %edi popl %esi popl %ebx popl %ebp ret .size _poly1305_emit_sse2,.-_poly1305_emit_sse2 .align 64 .Lconst_sse2: .long 16777216,0,16777216,0,16777216,0,16777216,0 .long 0,0,0,0,0,0,0,0 .long 67108863,0,67108863,0,67108863,0,67108863,0 .long 268435455,268435452,268435452,268435452 .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54 .byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 .byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 .byte 114,103,62,0 .align 4 #endif ring-0.16.9/pregenerated/poly1305-x86-macosx.S000064400000000000000000000644331353224261000167440ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .align 6,0x90 .globl _GFp_poly1305_init_asm .private_extern _GFp_poly1305_init_asm .align 4 _GFp_poly1305_init_asm: L_GFp_poly1305_init_asm_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ebp xorl %eax,%eax movl %eax,(%edi) movl %eax,4(%edi) movl %eax,8(%edi) movl %eax,12(%edi) movl %eax,16(%edi) movl %eax,20(%edi) cmpl $0,%esi je L000nokey call L001pic_point L001pic_point: popl %ebx leal _GFp_poly1305_blocks-L001pic_point(%ebx),%eax leal _GFp_poly1305_emit-L001pic_point(%ebx),%edx movl L_GFp_ia32cap_P$non_lazy_ptr-L001pic_point(%ebx),%edi movl (%edi),%ecx andl $83886080,%ecx cmpl $83886080,%ecx leal __poly1305_blocks_sse2-L001pic_point(%ebx),%eax leal __poly1305_emit_sse2-L001pic_point(%ebx),%edx movl 20(%esp),%edi movl %eax,(%ebp) movl %edx,4(%ebp) movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%edx andl $268435455,%eax andl $268435452,%ebx andl $268435452,%ecx andl $268435452,%edx movl %eax,24(%edi) movl %ebx,28(%edi) movl %ecx,32(%edi) movl %edx,36(%edi) movl $1,%eax L000nokey: popl %edi popl %esi popl %ebx popl %ebp ret .globl _GFp_poly1305_blocks .private_extern _GFp_poly1305_blocks .align 4 _GFp_poly1305_blocks: L_GFp_poly1305_blocks_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx Lenter_blocks: andl $-15,%ecx jz L002nodata subl $64,%esp movl 24(%edi),%eax movl 28(%edi),%ebx leal (%esi,%ecx,1),%ebp movl 32(%edi),%ecx movl 36(%edi),%edx movl %ebp,92(%esp) movl %esi,%ebp movl %eax,36(%esp) movl %ebx,%eax shrl $2,%eax movl %ebx,40(%esp) addl %ebx,%eax movl %ecx,%ebx shrl $2,%ebx movl %ecx,44(%esp) addl %ecx,%ebx movl %edx,%ecx shrl $2,%ecx movl %edx,48(%esp) addl %edx,%ecx movl %eax,52(%esp) movl %ebx,56(%esp) movl %ecx,60(%esp) movl (%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%esi movl 16(%edi),%edi jmp L003loop .align 5,0x90 L003loop: addl (%ebp),%eax adcl 4(%ebp),%ebx adcl 8(%ebp),%ecx adcl 12(%ebp),%esi leal 16(%ebp),%ebp adcl 96(%esp),%edi movl %eax,(%esp) movl %esi,12(%esp) mull 36(%esp) movl %edi,16(%esp) movl %eax,%edi movl %ebx,%eax movl %edx,%esi mull 60(%esp) addl %eax,%edi movl %ecx,%eax adcl %edx,%esi mull 56(%esp) addl %eax,%edi movl 12(%esp),%eax adcl %edx,%esi mull 52(%esp) addl %eax,%edi movl (%esp),%eax adcl %edx,%esi mull 40(%esp) movl %edi,20(%esp) xorl %edi,%edi addl %eax,%esi movl %ebx,%eax adcl %edx,%edi mull 36(%esp) addl %eax,%esi movl %ecx,%eax adcl %edx,%edi mull 60(%esp) addl %eax,%esi movl 12(%esp),%eax adcl %edx,%edi mull 56(%esp) addl %eax,%esi movl 16(%esp),%eax adcl %edx,%edi imull 52(%esp),%eax addl %eax,%esi movl (%esp),%eax adcl $0,%edi mull 44(%esp) movl %esi,24(%esp) xorl %esi,%esi addl %eax,%edi movl %ebx,%eax adcl %edx,%esi mull 40(%esp) addl %eax,%edi movl %ecx,%eax adcl %edx,%esi mull 36(%esp) addl %eax,%edi movl 12(%esp),%eax adcl %edx,%esi mull 60(%esp) addl %eax,%edi movl 16(%esp),%eax adcl %edx,%esi imull 56(%esp),%eax addl %eax,%edi movl (%esp),%eax adcl $0,%esi mull 48(%esp) movl %edi,28(%esp) xorl %edi,%edi addl %eax,%esi movl %ebx,%eax adcl %edx,%edi mull 44(%esp) addl %eax,%esi movl %ecx,%eax adcl %edx,%edi mull 40(%esp) addl %eax,%esi movl 12(%esp),%eax adcl %edx,%edi mull 36(%esp) addl %eax,%esi movl 16(%esp),%ecx adcl %edx,%edi movl %ecx,%edx imull 60(%esp),%ecx addl %ecx,%esi movl 20(%esp),%eax adcl $0,%edi imull 36(%esp),%edx addl %edi,%edx movl 24(%esp),%ebx movl 28(%esp),%ecx movl %edx,%edi shrl $2,%edx andl $3,%edi leal (%edx,%edx,4),%edx addl %edx,%eax adcl $0,%ebx adcl $0,%ecx adcl $0,%esi adcl $0,%edi cmpl 92(%esp),%ebp jne L003loop movl 84(%esp),%edx addl $64,%esp movl %eax,(%edx) movl %ebx,4(%edx) movl %ecx,8(%edx) movl %esi,12(%edx) movl %edi,16(%edx) L002nodata: popl %edi popl %esi popl %ebx popl %ebp ret .globl _GFp_poly1305_emit .private_extern _GFp_poly1305_emit .align 4 _GFp_poly1305_emit: L_GFp_poly1305_emit_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%ebp Lenter_emit: movl 24(%esp),%edi movl (%ebp),%eax movl 4(%ebp),%ebx movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 16(%ebp),%esi addl $5,%eax adcl $0,%ebx adcl $0,%ecx adcl $0,%edx adcl $0,%esi shrl $2,%esi negl %esi andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) notl %esi movl (%ebp),%eax movl 4(%ebp),%ebx movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 28(%esp),%ebp andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx orl (%edi),%eax orl 4(%edi),%ebx orl 8(%edi),%ecx orl 12(%edi),%edx addl (%ebp),%eax adcl 4(%ebp),%ebx adcl 8(%ebp),%ecx adcl 12(%ebp),%edx movl %eax,(%edi) movl %ebx,4(%edi) movl %ecx,8(%edi) movl %edx,12(%edi) popl %edi popl %esi popl %ebx popl %ebp ret .align 5,0x90 .private_extern __poly1305_init_sse2 .align 4 __poly1305_init_sse2: movdqu 24(%edi),%xmm4 leal 48(%edi),%edi movl %esp,%ebp subl $224,%esp andl $-16,%esp movq 64(%ebx),%xmm7 movdqa %xmm4,%xmm0 movdqa %xmm4,%xmm1 movdqa %xmm4,%xmm2 pand %xmm7,%xmm0 psrlq $26,%xmm1 psrldq $6,%xmm2 pand %xmm7,%xmm1 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 pand %xmm7,%xmm2 pand %xmm7,%xmm3 psrldq $13,%xmm4 leal 144(%esp),%edx movl $2,%ecx L004square: movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm1,%xmm6 movdqa %xmm2,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm1,%xmm6 paddd %xmm2,%xmm5 movdqa %xmm6,80(%esp) movdqa %xmm5,96(%esp) movdqa %xmm3,%xmm6 movdqa %xmm4,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm3,%xmm6 paddd %xmm4,%xmm5 movdqa %xmm6,112(%esp) movdqa %xmm5,128(%esp) pshufd $68,%xmm0,%xmm6 movdqa %xmm1,%xmm5 pshufd $68,%xmm1,%xmm1 pshufd $68,%xmm2,%xmm2 pshufd $68,%xmm3,%xmm3 pshufd $68,%xmm4,%xmm4 movdqa %xmm6,(%edx) movdqa %xmm1,16(%edx) movdqa %xmm2,32(%edx) movdqa %xmm3,48(%edx) movdqa %xmm4,64(%edx) pmuludq %xmm0,%xmm4 pmuludq %xmm0,%xmm3 pmuludq %xmm0,%xmm2 pmuludq %xmm0,%xmm1 pmuludq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 48(%edx),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa 80(%esp),%xmm6 pmuludq (%edx),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%edx),%xmm6 movdqa 32(%esp),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa 96(%esp),%xmm7 pmuludq (%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%edx),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%edx),%xmm5 movdqa 48(%esp),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa 112(%esp),%xmm5 pmuludq (%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%edx),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%edx),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%edx),%xmm7 movdqa 64(%esp),%xmm5 paddq %xmm6,%xmm1 movdqa 128(%esp),%xmm6 pmuludq (%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%edx),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%edx),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 decl %ecx jz L005square_break punpcklqdq (%esp),%xmm0 punpcklqdq 16(%esp),%xmm1 punpcklqdq 32(%esp),%xmm2 punpcklqdq 48(%esp),%xmm3 punpcklqdq 64(%esp),%xmm4 jmp L004square L005square_break: psllq $32,%xmm0 psllq $32,%xmm1 psllq $32,%xmm2 psllq $32,%xmm3 psllq $32,%xmm4 por (%esp),%xmm0 por 16(%esp),%xmm1 por 32(%esp),%xmm2 por 48(%esp),%xmm3 por 64(%esp),%xmm4 pshufd $141,%xmm0,%xmm0 pshufd $141,%xmm1,%xmm1 pshufd $141,%xmm2,%xmm2 pshufd $141,%xmm3,%xmm3 pshufd $141,%xmm4,%xmm4 movdqu %xmm0,(%edi) movdqu %xmm1,16(%edi) movdqu %xmm2,32(%edi) movdqu %xmm3,48(%edi) movdqu %xmm4,64(%edi) movdqa %xmm1,%xmm6 movdqa %xmm2,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm1,%xmm6 paddd %xmm2,%xmm5 movdqu %xmm6,80(%edi) movdqu %xmm5,96(%edi) movdqa %xmm3,%xmm6 movdqa %xmm4,%xmm5 pslld $2,%xmm6 pslld $2,%xmm5 paddd %xmm3,%xmm6 paddd %xmm4,%xmm5 movdqu %xmm6,112(%edi) movdqu %xmm5,128(%edi) movl %ebp,%esp leal -48(%edi),%edi ret .align 5,0x90 .private_extern __poly1305_blocks_sse2 .align 4 __poly1305_blocks_sse2: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%edi movl 24(%esp),%esi movl 28(%esp),%ecx movl 20(%edi),%eax andl $-16,%ecx jz L006nodata cmpl $64,%ecx jae L007enter_sse2 testl %eax,%eax jz Lenter_blocks .align 4,0x90 L007enter_sse2: call L008pic_point L008pic_point: popl %ebx leal Lconst_sse2-L008pic_point(%ebx),%ebx testl %eax,%eax jnz L009base2_26 call __poly1305_init_sse2 movl (%edi),%eax movl 3(%edi),%ecx movl 6(%edi),%edx movl 9(%edi),%esi movl 13(%edi),%ebp movl $1,20(%edi) shrl $2,%ecx andl $67108863,%eax shrl $4,%edx andl $67108863,%ecx shrl $6,%esi andl $67108863,%edx movd %eax,%xmm0 movd %ecx,%xmm1 movd %edx,%xmm2 movd %esi,%xmm3 movd %ebp,%xmm4 movl 24(%esp),%esi movl 28(%esp),%ecx jmp L010base2_32 .align 4,0x90 L009base2_26: movd (%edi),%xmm0 movd 4(%edi),%xmm1 movd 8(%edi),%xmm2 movd 12(%edi),%xmm3 movd 16(%edi),%xmm4 movdqa 64(%ebx),%xmm7 L010base2_32: movl 32(%esp),%eax movl %esp,%ebp subl $528,%esp andl $-16,%esp leal 48(%edi),%edi shll $24,%eax testl $31,%ecx jz L011even movdqu (%esi),%xmm6 leal 16(%esi),%esi movdqa %xmm6,%xmm5 pand %xmm7,%xmm6 paddd %xmm6,%xmm0 movdqa %xmm5,%xmm6 psrlq $26,%xmm5 psrldq $6,%xmm6 pand %xmm7,%xmm5 paddd %xmm5,%xmm1 movdqa %xmm6,%xmm5 psrlq $4,%xmm6 pand %xmm7,%xmm6 paddd %xmm6,%xmm2 movdqa %xmm5,%xmm6 psrlq $30,%xmm5 pand %xmm7,%xmm5 psrldq $7,%xmm6 paddd %xmm5,%xmm3 movd %eax,%xmm5 paddd %xmm6,%xmm4 movd 12(%edi),%xmm6 paddd %xmm5,%xmm4 movdqa %xmm0,(%esp) movdqa %xmm1,16(%esp) movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) pmuludq %xmm6,%xmm0 pmuludq %xmm6,%xmm1 pmuludq %xmm6,%xmm2 movd 28(%edi),%xmm5 pmuludq %xmm6,%xmm3 pmuludq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 48(%esp),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movd 92(%edi),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%esp),%xmm6 movd 44(%edi),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%esp),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%esp),%xmm5 paddq %xmm7,%xmm4 movd 108(%edi),%xmm7 pmuludq (%esp),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%esp),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%esp),%xmm5 movd 60(%edi),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%esp),%xmm6 paddq %xmm5,%xmm0 movd 124(%edi),%xmm5 pmuludq (%esp),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%esp),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%esp),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%esp),%xmm7 movd 76(%edi),%xmm5 paddq %xmm6,%xmm1 movd 140(%edi),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%esp),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%esp),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 subl $16,%ecx jz L012done L011even: leal 384(%esp),%edx leal -32(%esi),%eax subl $64,%ecx movdqu (%edi),%xmm5 pshufd $68,%xmm5,%xmm6 cmovbl %eax,%esi pshufd $238,%xmm5,%xmm5 movdqa %xmm6,(%edx) leal 160(%esp),%eax movdqu 16(%edi),%xmm6 movdqa %xmm5,-144(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,16(%edx) movdqu 32(%edi),%xmm5 movdqa %xmm6,-128(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,32(%edx) movdqu 48(%edi),%xmm6 movdqa %xmm5,-112(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,48(%edx) movdqu 64(%edi),%xmm5 movdqa %xmm6,-96(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,64(%edx) movdqu 80(%edi),%xmm6 movdqa %xmm5,-80(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,80(%edx) movdqu 96(%edi),%xmm5 movdqa %xmm6,-64(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,96(%edx) movdqu 112(%edi),%xmm6 movdqa %xmm5,-48(%edx) pshufd $68,%xmm6,%xmm5 pshufd $238,%xmm6,%xmm6 movdqa %xmm5,112(%edx) movdqu 128(%edi),%xmm5 movdqa %xmm6,-32(%edx) pshufd $68,%xmm5,%xmm6 pshufd $238,%xmm5,%xmm5 movdqa %xmm6,128(%edx) movdqa %xmm5,-16(%edx) movdqu 32(%esi),%xmm5 movdqu 48(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,112(%esp) movdqa %xmm3,128(%esp) movdqa %xmm4,144(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 movdqa %xmm0,80(%esp) movdqa %xmm1,96(%esp) jbe L013skip_loop jmp L014loop .align 5,0x90 L014loop: movdqa -144(%edx),%xmm7 movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) movdqa %xmm5,%xmm1 pmuludq %xmm7,%xmm5 movdqa %xmm6,%xmm0 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 pmuludq %xmm7,%xmm3 pmuludq %xmm7,%xmm4 pmuludq -16(%edx),%xmm0 movdqa %xmm1,%xmm7 pmuludq -128(%edx),%xmm1 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq -112(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa %xmm5,%xmm6 pmuludq -96(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 16(%eax),%xmm7 pmuludq -80(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq -128(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq -112(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 32(%eax),%xmm7 pmuludq -96(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq -32(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq -16(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq -128(%edx),%xmm6 paddq %xmm5,%xmm1 movdqa 48(%eax),%xmm5 pmuludq -112(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq -48(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa %xmm6,%xmm7 pmuludq -32(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq -16(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa 64(%eax),%xmm6 pmuludq -128(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa %xmm6,%xmm7 pmuludq -16(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq -64(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq -48(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa 64(%ebx),%xmm7 pmuludq -32(%edx),%xmm6 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqu -32(%esi),%xmm5 movdqu -16(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 leal -32(%esi),%eax subl $64,%ecx paddd 80(%esp),%xmm5 paddd 96(%esp),%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 cmovbl %eax,%esi leal 160(%esp),%eax movdqa (%edx),%xmm7 movdqa %xmm1,16(%esp) movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) movdqa %xmm5,%xmm1 pmuludq %xmm7,%xmm5 paddq %xmm0,%xmm5 movdqa %xmm6,%xmm0 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 pmuludq %xmm7,%xmm3 pmuludq %xmm7,%xmm4 paddq 16(%esp),%xmm6 paddq 32(%esp),%xmm2 paddq 48(%esp),%xmm3 paddq 64(%esp),%xmm4 pmuludq 128(%edx),%xmm0 movdqa %xmm1,%xmm7 pmuludq 16(%edx),%xmm1 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa %xmm5,%xmm6 pmuludq 48(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 16(%eax),%xmm7 pmuludq 64(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 16(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 32(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa 32(%eax),%xmm7 pmuludq 48(%edx),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 112(%edx),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 128(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 16(%edx),%xmm6 paddq %xmm5,%xmm1 movdqa 48(%eax),%xmm5 pmuludq 32(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 96(%edx),%xmm5 paddq %xmm7,%xmm4 movdqa %xmm6,%xmm7 pmuludq 112(%edx),%xmm6 paddq %xmm5,%xmm0 movdqa %xmm7,%xmm5 pmuludq 128(%edx),%xmm7 paddq %xmm6,%xmm1 movdqa 64(%eax),%xmm6 pmuludq 16(%edx),%xmm5 paddq %xmm7,%xmm2 movdqa %xmm6,%xmm7 pmuludq 128(%edx),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 80(%edx),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 96(%edx),%xmm5 paddq %xmm7,%xmm0 movdqa 64(%ebx),%xmm7 pmuludq 112(%edx),%xmm6 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 movdqu 32(%esi),%xmm5 movdqu 48(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,112(%esp) movdqa %xmm3,128(%esp) movdqa %xmm4,144(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 movdqa %xmm0,80(%esp) movdqa %xmm1,96(%esp) ja L014loop L013skip_loop: pshufd $16,-144(%edx),%xmm7 addl $32,%ecx jnz L015long_tail paddd %xmm0,%xmm5 paddd %xmm1,%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 L015long_tail: movdqa %xmm5,(%eax) movdqa %xmm6,16(%eax) movdqa %xmm2,32(%eax) movdqa %xmm3,48(%eax) movdqa %xmm4,64(%eax) pmuludq %xmm7,%xmm5 pmuludq %xmm7,%xmm6 pmuludq %xmm7,%xmm2 movdqa %xmm5,%xmm0 pshufd $16,-128(%edx),%xmm5 pmuludq %xmm7,%xmm3 movdqa %xmm6,%xmm1 pmuludq %xmm7,%xmm4 movdqa %xmm5,%xmm6 pmuludq 48(%eax),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%eax),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%eax),%xmm7 paddq %xmm6,%xmm3 pshufd $16,-64(%edx),%xmm6 pmuludq (%eax),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%eax),%xmm6 pshufd $16,-112(%edx),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%eax),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%eax),%xmm5 paddq %xmm7,%xmm4 pshufd $16,-48(%edx),%xmm7 pmuludq (%eax),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%eax),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%eax),%xmm5 pshufd $16,-96(%edx),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%eax),%xmm6 paddq %xmm5,%xmm0 pshufd $16,-32(%edx),%xmm5 pmuludq (%eax),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%eax),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%eax),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%eax),%xmm7 pshufd $16,-80(%edx),%xmm5 paddq %xmm6,%xmm1 pshufd $16,-16(%edx),%xmm6 pmuludq (%eax),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%eax),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%eax),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%eax),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%eax),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 jz L016short_tail movdqu -32(%esi),%xmm5 movdqu -16(%esi),%xmm6 leal 32(%esi),%esi movdqa %xmm2,32(%esp) movdqa %xmm3,48(%esp) movdqa %xmm4,64(%esp) movdqa %xmm5,%xmm2 movdqa %xmm6,%xmm3 psrldq $6,%xmm2 psrldq $6,%xmm3 movdqa %xmm5,%xmm4 punpcklqdq %xmm3,%xmm2 punpckhqdq %xmm6,%xmm4 punpcklqdq %xmm6,%xmm5 movdqa %xmm2,%xmm3 psrlq $4,%xmm2 psrlq $30,%xmm3 movdqa %xmm5,%xmm6 psrlq $40,%xmm4 psrlq $26,%xmm6 pand %xmm7,%xmm5 pand %xmm7,%xmm6 pand %xmm7,%xmm2 pand %xmm7,%xmm3 por (%ebx),%xmm4 pshufd $16,(%edx),%xmm7 paddd 80(%esp),%xmm5 paddd 96(%esp),%xmm6 paddd 112(%esp),%xmm2 paddd 128(%esp),%xmm3 paddd 144(%esp),%xmm4 movdqa %xmm5,(%esp) pmuludq %xmm7,%xmm5 movdqa %xmm6,16(%esp) pmuludq %xmm7,%xmm6 paddq %xmm5,%xmm0 movdqa %xmm2,%xmm5 pmuludq %xmm7,%xmm2 paddq %xmm6,%xmm1 movdqa %xmm3,%xmm6 pmuludq %xmm7,%xmm3 paddq 32(%esp),%xmm2 movdqa %xmm5,32(%esp) pshufd $16,16(%edx),%xmm5 paddq 48(%esp),%xmm3 movdqa %xmm6,48(%esp) movdqa %xmm4,%xmm6 pmuludq %xmm7,%xmm4 paddq 64(%esp),%xmm4 movdqa %xmm6,64(%esp) movdqa %xmm5,%xmm6 pmuludq 48(%esp),%xmm5 movdqa %xmm6,%xmm7 pmuludq 32(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 pshufd $16,80(%edx),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm2 pmuludq 64(%esp),%xmm6 pshufd $16,32(%edx),%xmm7 paddq %xmm5,%xmm1 movdqa %xmm7,%xmm5 pmuludq 32(%esp),%xmm7 paddq %xmm6,%xmm0 movdqa %xmm5,%xmm6 pmuludq 16(%esp),%xmm5 paddq %xmm7,%xmm4 pshufd $16,96(%edx),%xmm7 pmuludq (%esp),%xmm6 paddq %xmm5,%xmm3 movdqa %xmm7,%xmm5 pmuludq 64(%esp),%xmm7 paddq %xmm6,%xmm2 pmuludq 48(%esp),%xmm5 pshufd $16,48(%edx),%xmm6 paddq %xmm7,%xmm1 movdqa %xmm6,%xmm7 pmuludq 16(%esp),%xmm6 paddq %xmm5,%xmm0 pshufd $16,112(%edx),%xmm5 pmuludq (%esp),%xmm7 paddq %xmm6,%xmm4 movdqa %xmm5,%xmm6 pmuludq 64(%esp),%xmm5 paddq %xmm7,%xmm3 movdqa %xmm6,%xmm7 pmuludq 48(%esp),%xmm6 paddq %xmm5,%xmm2 pmuludq 32(%esp),%xmm7 pshufd $16,64(%edx),%xmm5 paddq %xmm6,%xmm1 pshufd $16,128(%edx),%xmm6 pmuludq (%esp),%xmm5 paddq %xmm7,%xmm0 movdqa %xmm6,%xmm7 pmuludq 64(%esp),%xmm6 paddq %xmm5,%xmm4 movdqa %xmm7,%xmm5 pmuludq 16(%esp),%xmm7 paddq %xmm6,%xmm3 movdqa %xmm5,%xmm6 pmuludq 32(%esp),%xmm5 paddq %xmm7,%xmm0 pmuludq 48(%esp),%xmm6 movdqa 64(%ebx),%xmm7 paddq %xmm5,%xmm1 paddq %xmm6,%xmm2 L016short_tail: pshufd $78,%xmm4,%xmm6 pshufd $78,%xmm3,%xmm5 paddq %xmm6,%xmm4 paddq %xmm5,%xmm3 pshufd $78,%xmm0,%xmm6 pshufd $78,%xmm1,%xmm5 paddq %xmm6,%xmm0 paddq %xmm5,%xmm1 pshufd $78,%xmm2,%xmm6 movdqa %xmm3,%xmm5 pand %xmm7,%xmm3 psrlq $26,%xmm5 paddq %xmm6,%xmm2 paddq %xmm4,%xmm5 movdqa %xmm0,%xmm6 pand %xmm7,%xmm0 psrlq $26,%xmm6 movdqa %xmm5,%xmm4 paddq %xmm1,%xmm6 psrlq $26,%xmm5 pand %xmm7,%xmm4 movdqa %xmm6,%xmm1 psrlq $26,%xmm6 paddd %xmm5,%xmm0 psllq $2,%xmm5 paddq %xmm2,%xmm6 paddq %xmm0,%xmm5 pand %xmm7,%xmm1 movdqa %xmm6,%xmm2 psrlq $26,%xmm6 pand %xmm7,%xmm2 paddd %xmm3,%xmm6 movdqa %xmm5,%xmm0 psrlq $26,%xmm5 movdqa %xmm6,%xmm3 psrlq $26,%xmm6 pand %xmm7,%xmm0 paddd %xmm5,%xmm1 pand %xmm7,%xmm3 paddd %xmm6,%xmm4 L012done: movd %xmm0,-48(%edi) movd %xmm1,-44(%edi) movd %xmm2,-40(%edi) movd %xmm3,-36(%edi) movd %xmm4,-32(%edi) movl %ebp,%esp L006nodata: popl %edi popl %esi popl %ebx popl %ebp ret .align 5,0x90 .private_extern __poly1305_emit_sse2 .align 4 __poly1305_emit_sse2: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%ebp cmpl $0,20(%ebp) je Lenter_emit movl (%ebp),%eax movl 4(%ebp),%edi movl 8(%ebp),%ecx movl 12(%ebp),%edx movl 16(%ebp),%esi movl %edi,%ebx shll $26,%edi shrl $6,%ebx addl %edi,%eax movl %ecx,%edi adcl $0,%ebx shll $20,%edi shrl $12,%ecx addl %edi,%ebx movl %edx,%edi adcl $0,%ecx shll $14,%edi shrl $18,%edx addl %edi,%ecx movl %esi,%edi adcl $0,%edx shll $8,%edi shrl $24,%esi addl %edi,%edx adcl $0,%esi movl %esi,%edi andl $3,%esi shrl $2,%edi leal (%edi,%edi,4),%ebp movl 24(%esp),%edi addl %ebp,%eax movl 28(%esp),%ebp adcl $0,%ebx adcl $0,%ecx adcl $0,%edx adcl $0,%esi movd %eax,%xmm0 addl $5,%eax movd %ebx,%xmm1 adcl $0,%ebx movd %ecx,%xmm2 adcl $0,%ecx movd %edx,%xmm3 adcl $0,%edx adcl $0,%esi shrl $2,%esi negl %esi andl %esi,%eax andl %esi,%ebx andl %esi,%ecx andl %esi,%edx movl %eax,(%edi) movd %xmm0,%eax movl %ebx,4(%edi) movd %xmm1,%ebx movl %ecx,8(%edi) movd %xmm2,%ecx movl %edx,12(%edi) movd %xmm3,%edx notl %esi andl %esi,%eax andl %esi,%ebx orl (%edi),%eax andl %esi,%ecx orl 4(%edi),%ebx andl %esi,%edx orl 8(%edi),%ecx orl 12(%edi),%edx addl (%ebp),%eax adcl 4(%ebp),%ebx movl %eax,(%edi) adcl 8(%ebp),%ecx movl %ebx,4(%edi) adcl 12(%ebp),%edx movl %ecx,8(%edi) movl %edx,12(%edi) popl %edi popl %esi popl %ebx popl %ebp ret .align 6,0x90 Lconst_sse2: .long 16777216,0,16777216,0,16777216,0,16777216,0 .long 0,0,0,0,0,0,0,0 .long 67108863,0,67108863,0,67108863,0,67108863,0 .long 268435455,268435452,268435452,268435452 .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54 .byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 .byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 .byte 114,103,62,0 .align 2,0x90 .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/poly1305-x86-win32n.obj000064400000000000000000000452651353224260700171520ustar0000000000000000LEi]E).text p`.bss0.debug$S,RC<@B.debug$T E@BUSVW|$t$l$1GGG GGl[CoO=|$EU^NV %G_O W$_^[]ÍvUSVW|$t$L$@G_,O W$l$\D$$\$(؉L$,ˉT$0щD$4\$8L$<_Ow  E]Mu m|$`$t$ d$$|$lj؉d$<ljd$8NjD$ d$4Nj$d$(|$1Ɖd$$Ɖd$<ƋD$ d$8ƋD$D$4Ƌ$d$,t$1ljd$(ljd$$NjD$ d$<NjD$D$8Nj$d$0|$1Ɖd$,Ɖd$(ƋD$ d$$ƋL$׉L$<΋D$T$$\$L$Ѓ;l$\T$T@ZJr z_^[] USVWl$|$E]MU u!!!!_OW ֋E]MU l$!!!!  _ O W E]MU _OW _^[] og0~{@fofofoffsfsffofsfsfffs $f$fL$fT$ f\$0fd$@fofofrfrffft$Pfl$`fofofrfrffft$pf$fpDfofpDfpDfpDfpDf2fJfR fZ0fb@ffffffofj0fofr ffofzffot$Pf*ffr@fo|$ ffofz ffofjffo|$`f2ffofz@ffj0fot$0ffofrffol$pf:ffofj@ffofr0ffz fol$@ffo$f*ffofr@ffofzffofj ffr0fo{@fffoffsffoffsfoffsffofsffsffffofsfffofsfofsffffI"fl$flL$flT$ fl\$0fld$@fs fs fs fs fs f$fL$fT$ f\$0fd$@fpfpɍfpҍfpۍfpOW _0g@fofofrfrffwPo`fofofrfrffwp USVW|$t$L$G\ @ v[K\OWw o G%fnfnfnfnfnt$L$$&fnfnOfnWfn_ fngfo{@D$ 0?o6vfofffofsfsfffofsfffofsffsffnffnw ff$fL$fT$ f\$0fd$@ffffnofffofl$0foft$ ffof|$ffnw\f,$fft$@fn,ffof|$ ffofl$ffnlf4$ffof|$@ffl$0fnw= 2P:\ring\pregenerated\tmp\poly1305-x86-win32n.asm0cbZ?~$(( !" #$%&'() *#+&,,-1/2051;2A3C4I5O6U7[8_9b:e;g<j=m>p?u@{ABCDEFGIJKLMORSTUVWXZ[\]^_`abcdefghijklmnopqrstuv w xyz |#}&~),/36:>BDFHLNPRVX\^bdgimqsuwy}   "&).048:=@CEHKNQU[_bdgjmpqrstu      !"#$%&'()*+,-. 1%2(3*4053687<8@9D:H;M<R=V>Z?_@dAhBlCqDxE}GHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefg"h&i*j.k2l6m;n?oDpHqLrQsUt[u_vcwhxnyrzv{{|}~ !%).27<@DHLQUY]bfjosw| #(-27<@EJOTX\afjnsx|      !&)/28<@DH L!P"T#Y$`&d'i(n)s*x+}-./0123456789:;<=>?@ABCDEFGHIJKLM NOPQ R$S(T-U1V5W9X?YCZI[M\Q]W^[_``eaiboctdxe|fghijklmnopqrstuvwxyz{|}~      ! % ) / 3 7 = A G L P T X \ a e i m r v z                                     " ' , 1 6 ; @ E J O T Y ^ c h m r w |                                # ' , 1 5 : ? C G K O S Y _ e j                              ! " # $ % & ' (# )' *+ +0 ,4 -8 .= /A 0F 1K 2O 3S 4X 5\ 6` 7e 8i 9m :r ;v <{ = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a" b& c* d. e1 f4 g: h@ iF jO kX l[ mb nf ol pq qv r{ s t u v w x y z { | } ~                  !&*.6:>CGLQUY^bfkos{ #'+049=AEINSV\enrv{  $(,2 6 : > B GKPTX]agkotz~ !"#$%&'()*+,-./012345678 9:;<=!>%?*@.A2B7C;D@EEFIGMHSIXJ]K`LfMlNrOvPzQRSTUVWXYZ[\]^_`abcdefghijklmn opqrs$t*u0v6w:x>yDzJ{N|T}X~^bflpv{ !*/37=AEKOSY]chlpuz~ "',1689:;<=@ABCDHLRUX[^acfikmpsvxz}      !"#$%&'()*+,-./01234567 8 9:;<=>? @#A&B)C*D+E,F-G.H@J`KLMNOPQRv3P:\ring\pregenerated\poly1305-x86-win32n.objyasm 1.3.0 _GFp_poly1305_init_asm(L$_GFp_poly1305_init_asm_beginL$000nokey1L$001pic_point_GFp_poly1305_blocks_GFp_poly1305_emit __poly1305_blocks_sse2@__poly1305_emit_sse2&L$_GFp_poly1305_blocks_beginL$enter_blockspL$002nodata L$003loop$L$_GFp_poly1305_emit_beginL$enter_emit __poly1305_init_sse2}L$004squareL$005square_break8L$006nodataL$007enter_sse2L$008pic_point@L$const_sse2`L$009base2_26}L$010base2_32 L$011evenL$012doneL$013skip_loop L$014loopL$015long_tailpL$016short_tailh l ) ) ) ) ) ) ) ) * * .* 2* L* P* n* r* * * * * * * * * * + "+ &+ :+ >+ Z+ ^+ q+ u+ + + + + + + + + + + , , $, (, 9, =, N, R, h, l, }, , , , .fileg@feat.00.text-Dcn1}@ p "=J _}k}8@`}   p.bss.debug$S,<.debug$T pregenerated\tmp\poly1305-x86-win32n.asm_GFp_poly1305_init_asmL$_GFp_poly1305_init_asm_beginL$000nokeyL$001pic_point_GFp_poly1305_blocks_GFp_poly1305_emit_GFp_ia32cap_P__poly1305_blocks_sse2__poly1305_emit_sse2L$_GFp_poly1305_blocks_beginL$enter_blocksL$002nodataL$003loopL$_GFp_poly1305_emit_beginL$enter_emit__poly1305_init_sse2L$004squareL$005square_breakL$006nodataL$007enter_sse2L$008pic_pointL$const_sse2L$009base2_26L$010base2_32L$011evenL$012doneL$013skip_loopL$014loopL$015long_tailL$016short_tailring-0.16.9/pregenerated/poly1305-x86_64-elf.S000064400000000000000000001016331353224260400165260ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .hidden GFp_poly1305_init_asm .globl GFp_poly1305_blocks .hidden GFp_poly1305_blocks .hidden GFp_poly1305_blocks .globl GFp_poly1305_emit .hidden GFp_poly1305_emit .hidden GFp_poly1305_emit .type GFp_poly1305_init_asm,@function .align 32 GFp_poly1305_init_asm: xorq %rax,%rax movq %rax,0(%rdi) movq %rax,8(%rdi) movq %rax,16(%rdi) cmpq $0,%rsi je .Lno_key leaq GFp_poly1305_blocks(%rip),%r10 leaq GFp_poly1305_emit(%rip),%r11 movq GFp_ia32cap_P+4(%rip),%r9 leaq poly1305_blocks_avx(%rip),%rax leaq poly1305_emit_avx(%rip),%rcx btq $28,%r9 cmovcq %rax,%r10 cmovcq %rcx,%r11 leaq poly1305_blocks_avx2(%rip),%rax btq $37,%r9 cmovcq %rax,%r10 movq $0x0ffffffc0fffffff,%rax movq $0x0ffffffc0ffffffc,%rcx andq 0(%rsi),%rax andq 8(%rsi),%rcx movq %rax,24(%rdi) movq %rcx,32(%rdi) movq %r10,0(%rdx) movq %r11,8(%rdx) movl $1,%eax .Lno_key: .byte 0xf3,0xc3 .size GFp_poly1305_init_asm,.-GFp_poly1305_init_asm .type GFp_poly1305_blocks,@function .align 32 GFp_poly1305_blocks: .Lblocks: shrq $4,%rdx jz .Lno_data pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 .Lblocks_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movq 16(%rdi),%rbp movq %r13,%r12 shrq $2,%r13 movq %r12,%rax addq %r12,%r13 jmp .Loop .align 32 .Loop: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp mulq %r14 movq %rax,%r9 movq %r11,%rax movq %rdx,%r10 mulq %r14 movq %rax,%r14 movq %r11,%rax movq %rdx,%r8 mulq %rbx addq %rax,%r9 movq %r13,%rax adcq %rdx,%r10 mulq %rbx movq %rbp,%rbx addq %rax,%r14 adcq %rdx,%r8 imulq %r13,%rbx addq %rbx,%r9 movq %r8,%rbx adcq $0,%r10 imulq %r11,%rbp addq %r9,%rbx movq $-4,%rax adcq %rbp,%r10 andq %r10,%rax movq %r10,%rbp shrq $2,%r10 andq $3,%rbp addq %r10,%rax addq %rax,%r14 adcq $0,%rbx adcq $0,%rbp movq %r12,%rax decq %r15 jnz .Loop movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp .Lno_data: .Lblocks_epilogue: .byte 0xf3,0xc3 .size GFp_poly1305_blocks,.-GFp_poly1305_blocks .type GFp_poly1305_emit,@function .align 32 GFp_poly1305_emit: .Lemit: movq 0(%rdi),%r8 movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq %r8,%rax addq $5,%r8 movq %r9,%rcx adcq $0,%r9 adcq $0,%r10 shrq $2,%r10 cmovnzq %r8,%rax cmovnzq %r9,%rcx addq 0(%rdx),%rax adcq 8(%rdx),%rcx movq %rax,0(%rsi) movq %rcx,8(%rsi) .byte 0xf3,0xc3 .size GFp_poly1305_emit,.-GFp_poly1305_emit .type __poly1305_block,@function .align 32 __poly1305_block: mulq %r14 movq %rax,%r9 movq %r11,%rax movq %rdx,%r10 mulq %r14 movq %rax,%r14 movq %r11,%rax movq %rdx,%r8 mulq %rbx addq %rax,%r9 movq %r13,%rax adcq %rdx,%r10 mulq %rbx movq %rbp,%rbx addq %rax,%r14 adcq %rdx,%r8 imulq %r13,%rbx addq %rbx,%r9 movq %r8,%rbx adcq $0,%r10 imulq %r11,%rbp addq %r9,%rbx movq $-4,%rax adcq %rbp,%r10 andq %r10,%rax movq %r10,%rbp shrq $2,%r10 andq $3,%rbp addq %r10,%rax addq %rax,%r14 adcq $0,%rbx adcq $0,%rbp .byte 0xf3,0xc3 .size __poly1305_block,.-__poly1305_block .type __poly1305_init_avx,@function .align 32 __poly1305_init_avx: movq %r11,%r14 movq %r12,%rbx xorq %rbp,%rbp leaq 48+64(%rdi),%rdi movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movl $0x3ffffff,%edx movq %r14,%r8 andl %r14d,%eax movq %r11,%r9 andl %r11d,%edx movl %eax,-64(%rdi) shrq $26,%r8 movl %edx,-60(%rdi) shrq $26,%r9 movl $0x3ffffff,%eax movl $0x3ffffff,%edx andl %r8d,%eax andl %r9d,%edx movl %eax,-48(%rdi) leal (%rax,%rax,4),%eax movl %edx,-44(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,-32(%rdi) shrq $26,%r8 movl %edx,-28(%rdi) shrq $26,%r9 movq %rbx,%rax movq %r12,%rdx shlq $12,%rax shlq $12,%rdx orq %r8,%rax orq %r9,%rdx andl $0x3ffffff,%eax andl $0x3ffffff,%edx movl %eax,-16(%rdi) leal (%rax,%rax,4),%eax movl %edx,-12(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,0(%rdi) movq %rbx,%r8 movl %edx,4(%rdi) movq %r12,%r9 movl $0x3ffffff,%eax movl $0x3ffffff,%edx shrq $14,%r8 shrq $14,%r9 andl %r8d,%eax andl %r9d,%edx movl %eax,16(%rdi) leal (%rax,%rax,4),%eax movl %edx,20(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,32(%rdi) shrq $26,%r8 movl %edx,36(%rdi) shrq $26,%r9 movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,48(%rdi) leaq (%r8,%r8,4),%r8 movl %r9d,52(%rdi) leaq (%r9,%r9,4),%r9 movl %r8d,64(%rdi) movl %r9d,68(%rdi) movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movq %r14,%r8 andl %r14d,%eax shrq $26,%r8 movl %eax,-52(%rdi) movl $0x3ffffff,%edx andl %r8d,%edx movl %edx,-36(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,-20(%rdi) movq %rbx,%rax shlq $12,%rax orq %r8,%rax andl $0x3ffffff,%eax movl %eax,-4(%rdi) leal (%rax,%rax,4),%eax movq %rbx,%r8 movl %eax,12(%rdi) movl $0x3ffffff,%edx shrq $14,%r8 andl %r8d,%edx movl %edx,28(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,44(%rdi) movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,60(%rdi) leaq (%r8,%r8,4),%r8 movl %r8d,76(%rdi) movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movq %r14,%r8 andl %r14d,%eax shrq $26,%r8 movl %eax,-56(%rdi) movl $0x3ffffff,%edx andl %r8d,%edx movl %edx,-40(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,-24(%rdi) movq %rbx,%rax shlq $12,%rax orq %r8,%rax andl $0x3ffffff,%eax movl %eax,-8(%rdi) leal (%rax,%rax,4),%eax movq %rbx,%r8 movl %eax,8(%rdi) movl $0x3ffffff,%edx shrq $14,%r8 andl %r8d,%edx movl %edx,24(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,40(%rdi) movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,56(%rdi) leaq (%r8,%r8,4),%r8 movl %r8d,72(%rdi) leaq -48-64(%rdi),%rdi .byte 0xf3,0xc3 .size __poly1305_init_avx,.-__poly1305_init_avx .type poly1305_blocks_avx,@function .align 32 poly1305_blocks_avx: movl 20(%rdi),%r8d cmpq $128,%rdx jae .Lblocks_avx testl %r8d,%r8d jz .Lblocks .Lblocks_avx: andq $-16,%rdx jz .Lno_data_avx vzeroupper testl %r8d,%r8d jz .Lbase2_64_avx testq $31,%rdx jz .Leven_avx pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 .Lblocks_avx_body: movq %rdx,%r15 movq 0(%rdi),%r8 movq 8(%rdi),%r9 movl 16(%rdi),%ebp movq 24(%rdi),%r11 movq 32(%rdi),%r13 movl %r8d,%r14d andq $-2147483648,%r8 movq %r9,%r12 movl %r9d,%ebx andq $-2147483648,%r9 shrq $6,%r8 shlq $52,%r12 addq %r8,%r14 shrq $12,%rbx shrq $18,%r9 addq %r12,%r14 adcq %r9,%rbx movq %rbp,%r8 shlq $40,%r8 shrq $24,%rbp addq %r8,%rbx adcq $0,%rbp movq $-4,%r9 movq %rbp,%r8 andq %rbp,%r9 shrq $2,%r8 andq $3,%rbp addq %r9,%r8 addq %r8,%r14 adcq $0,%rbx adcq $0,%rbp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp call __poly1305_block testq %rcx,%rcx jz .Lstore_base2_64_avx movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r11 movq %rbx,%r12 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r11 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r11,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r12 andq $0x3ffffff,%rbx orq %r12,%rbp subq $16,%r15 jz .Lstore_base2_26_avx vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 jmp .Lproceed_avx .align 32 .Lstore_base2_64_avx: movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) jmp .Ldone_avx .align 16 .Lstore_base2_26_avx: movl %eax,0(%rdi) movl %edx,4(%rdi) movl %r14d,8(%rdi) movl %ebx,12(%rdi) movl %ebp,16(%rdi) .align 16 .Ldone_avx: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp .Lno_data_avx: .Lblocks_avx_epilogue: .byte 0xf3,0xc3 .align 32 .Lbase2_64_avx: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 .Lbase2_64_avx_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movl 16(%rdi),%ebp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 testq $31,%rdx jz .Linit_avx addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block .Linit_avx: movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r8 movq %rbx,%r9 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r8 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r8,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r9 andq $0x3ffffff,%rbx orq %r9,%rbp vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 movl $1,20(%rdi) call __poly1305_init_avx .Lproceed_avx: movq %r15,%rdx movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rax leaq 48(%rsp),%rsp .Lbase2_64_avx_epilogue: jmp .Ldo_avx .align 32 .Leven_avx: vmovd 0(%rdi),%xmm0 vmovd 4(%rdi),%xmm1 vmovd 8(%rdi),%xmm2 vmovd 12(%rdi),%xmm3 vmovd 16(%rdi),%xmm4 .Ldo_avx: leaq -88(%rsp),%r11 subq $0x178,%rsp subq $64,%rdx leaq -32(%rsi),%rax cmovcq %rax,%rsi vmovdqu 48(%rdi),%xmm14 leaq 112(%rdi),%rdi leaq .Lconst(%rip),%rcx vmovdqu 32(%rsi),%xmm5 vmovdqu 48(%rsi),%xmm6 vmovdqa 64(%rcx),%xmm15 vpsrldq $6,%xmm5,%xmm7 vpsrldq $6,%xmm6,%xmm8 vpunpckhqdq %xmm6,%xmm5,%xmm9 vpunpcklqdq %xmm6,%xmm5,%xmm5 vpunpcklqdq %xmm8,%xmm7,%xmm8 vpsrlq $40,%xmm9,%xmm9 vpsrlq $26,%xmm5,%xmm6 vpand %xmm15,%xmm5,%xmm5 vpsrlq $4,%xmm8,%xmm7 vpand %xmm15,%xmm6,%xmm6 vpsrlq $30,%xmm8,%xmm8 vpand %xmm15,%xmm7,%xmm7 vpand %xmm15,%xmm8,%xmm8 vpor 32(%rcx),%xmm9,%xmm9 jbe .Lskip_loop_avx vmovdqu -48(%rdi),%xmm11 vmovdqu -32(%rdi),%xmm12 vpshufd $0xEE,%xmm14,%xmm13 vpshufd $0x44,%xmm14,%xmm10 vmovdqa %xmm13,-144(%r11) vmovdqa %xmm10,0(%rsp) vpshufd $0xEE,%xmm11,%xmm14 vmovdqu -16(%rdi),%xmm10 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm14,-128(%r11) vmovdqa %xmm11,16(%rsp) vpshufd $0xEE,%xmm12,%xmm13 vmovdqu 0(%rdi),%xmm11 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm13,-112(%r11) vmovdqa %xmm12,32(%rsp) vpshufd $0xEE,%xmm10,%xmm14 vmovdqu 16(%rdi),%xmm12 vpshufd $0x44,%xmm10,%xmm10 vmovdqa %xmm14,-96(%r11) vmovdqa %xmm10,48(%rsp) vpshufd $0xEE,%xmm11,%xmm13 vmovdqu 32(%rdi),%xmm10 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm13,-80(%r11) vmovdqa %xmm11,64(%rsp) vpshufd $0xEE,%xmm12,%xmm14 vmovdqu 48(%rdi),%xmm11 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm14,-64(%r11) vmovdqa %xmm12,80(%rsp) vpshufd $0xEE,%xmm10,%xmm13 vmovdqu 64(%rdi),%xmm12 vpshufd $0x44,%xmm10,%xmm10 vmovdqa %xmm13,-48(%r11) vmovdqa %xmm10,96(%rsp) vpshufd $0xEE,%xmm11,%xmm14 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm14,-32(%r11) vmovdqa %xmm11,112(%rsp) vpshufd $0xEE,%xmm12,%xmm13 vmovdqa 0(%rsp),%xmm14 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm13,-16(%r11) vmovdqa %xmm12,128(%rsp) jmp .Loop_avx .align 32 .Loop_avx: vpmuludq %xmm5,%xmm14,%xmm10 vpmuludq %xmm6,%xmm14,%xmm11 vmovdqa %xmm2,32(%r11) vpmuludq %xmm7,%xmm14,%xmm12 vmovdqa 16(%rsp),%xmm2 vpmuludq %xmm8,%xmm14,%xmm13 vpmuludq %xmm9,%xmm14,%xmm14 vmovdqa %xmm0,0(%r11) vpmuludq 32(%rsp),%xmm9,%xmm0 vmovdqa %xmm1,16(%r11) vpmuludq %xmm8,%xmm2,%xmm1 vpaddq %xmm0,%xmm10,%xmm10 vpaddq %xmm1,%xmm14,%xmm14 vmovdqa %xmm3,48(%r11) vpmuludq %xmm7,%xmm2,%xmm0 vpmuludq %xmm6,%xmm2,%xmm1 vpaddq %xmm0,%xmm13,%xmm13 vmovdqa 48(%rsp),%xmm3 vpaddq %xmm1,%xmm12,%xmm12 vmovdqa %xmm4,64(%r11) vpmuludq %xmm5,%xmm2,%xmm2 vpmuludq %xmm7,%xmm3,%xmm0 vpaddq %xmm2,%xmm11,%xmm11 vmovdqa 64(%rsp),%xmm4 vpaddq %xmm0,%xmm14,%xmm14 vpmuludq %xmm6,%xmm3,%xmm1 vpmuludq %xmm5,%xmm3,%xmm3 vpaddq %xmm1,%xmm13,%xmm13 vmovdqa 80(%rsp),%xmm2 vpaddq %xmm3,%xmm12,%xmm12 vpmuludq %xmm9,%xmm4,%xmm0 vpmuludq %xmm8,%xmm4,%xmm4 vpaddq %xmm0,%xmm11,%xmm11 vmovdqa 96(%rsp),%xmm3 vpaddq %xmm4,%xmm10,%xmm10 vmovdqa 128(%rsp),%xmm4 vpmuludq %xmm6,%xmm2,%xmm1 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm1,%xmm14,%xmm14 vpaddq %xmm2,%xmm13,%xmm13 vpmuludq %xmm9,%xmm3,%xmm0 vpmuludq %xmm8,%xmm3,%xmm1 vpaddq %xmm0,%xmm12,%xmm12 vmovdqu 0(%rsi),%xmm0 vpaddq %xmm1,%xmm11,%xmm11 vpmuludq %xmm7,%xmm3,%xmm3 vpmuludq %xmm7,%xmm4,%xmm7 vpaddq %xmm3,%xmm10,%xmm10 vmovdqu 16(%rsi),%xmm1 vpaddq %xmm7,%xmm11,%xmm11 vpmuludq %xmm8,%xmm4,%xmm8 vpmuludq %xmm9,%xmm4,%xmm9 vpsrldq $6,%xmm0,%xmm2 vpaddq %xmm8,%xmm12,%xmm12 vpaddq %xmm9,%xmm13,%xmm13 vpsrldq $6,%xmm1,%xmm3 vpmuludq 112(%rsp),%xmm5,%xmm9 vpmuludq %xmm6,%xmm4,%xmm5 vpunpckhqdq %xmm1,%xmm0,%xmm4 vpaddq %xmm9,%xmm14,%xmm14 vmovdqa -144(%r11),%xmm9 vpaddq %xmm5,%xmm10,%xmm10 vpunpcklqdq %xmm1,%xmm0,%xmm0 vpunpcklqdq %xmm3,%xmm2,%xmm3 vpsrldq $5,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm1 vpand %xmm15,%xmm0,%xmm0 vpsrlq $4,%xmm3,%xmm2 vpand %xmm15,%xmm1,%xmm1 vpand 0(%rcx),%xmm4,%xmm4 vpsrlq $30,%xmm3,%xmm3 vpand %xmm15,%xmm2,%xmm2 vpand %xmm15,%xmm3,%xmm3 vpor 32(%rcx),%xmm4,%xmm4 vpaddq 0(%r11),%xmm0,%xmm0 vpaddq 16(%r11),%xmm1,%xmm1 vpaddq 32(%r11),%xmm2,%xmm2 vpaddq 48(%r11),%xmm3,%xmm3 vpaddq 64(%r11),%xmm4,%xmm4 leaq 32(%rsi),%rax leaq 64(%rsi),%rsi subq $64,%rdx cmovcq %rax,%rsi vpmuludq %xmm0,%xmm9,%xmm5 vpmuludq %xmm1,%xmm9,%xmm6 vpaddq %xmm5,%xmm10,%xmm10 vpaddq %xmm6,%xmm11,%xmm11 vmovdqa -128(%r11),%xmm7 vpmuludq %xmm2,%xmm9,%xmm5 vpmuludq %xmm3,%xmm9,%xmm6 vpaddq %xmm5,%xmm12,%xmm12 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm4,%xmm9,%xmm9 vpmuludq -112(%r11),%xmm4,%xmm5 vpaddq %xmm9,%xmm14,%xmm14 vpaddq %xmm5,%xmm10,%xmm10 vpmuludq %xmm2,%xmm7,%xmm6 vpmuludq %xmm3,%xmm7,%xmm5 vpaddq %xmm6,%xmm13,%xmm13 vmovdqa -96(%r11),%xmm8 vpaddq %xmm5,%xmm14,%xmm14 vpmuludq %xmm1,%xmm7,%xmm6 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm6,%xmm12,%xmm12 vpaddq %xmm7,%xmm11,%xmm11 vmovdqa -80(%r11),%xmm9 vpmuludq %xmm2,%xmm8,%xmm5 vpmuludq %xmm1,%xmm8,%xmm6 vpaddq %xmm5,%xmm14,%xmm14 vpaddq %xmm6,%xmm13,%xmm13 vmovdqa -64(%r11),%xmm7 vpmuludq %xmm0,%xmm8,%xmm8 vpmuludq %xmm4,%xmm9,%xmm5 vpaddq %xmm8,%xmm12,%xmm12 vpaddq %xmm5,%xmm11,%xmm11 vmovdqa -48(%r11),%xmm8 vpmuludq %xmm3,%xmm9,%xmm9 vpmuludq %xmm1,%xmm7,%xmm6 vpaddq %xmm9,%xmm10,%xmm10 vmovdqa -16(%r11),%xmm9 vpaddq %xmm6,%xmm14,%xmm14 vpmuludq %xmm0,%xmm7,%xmm7 vpmuludq %xmm4,%xmm8,%xmm5 vpaddq %xmm7,%xmm13,%xmm13 vpaddq %xmm5,%xmm12,%xmm12 vmovdqu 32(%rsi),%xmm5 vpmuludq %xmm3,%xmm8,%xmm7 vpmuludq %xmm2,%xmm8,%xmm8 vpaddq %xmm7,%xmm11,%xmm11 vmovdqu 48(%rsi),%xmm6 vpaddq %xmm8,%xmm10,%xmm10 vpmuludq %xmm2,%xmm9,%xmm2 vpmuludq %xmm3,%xmm9,%xmm3 vpsrldq $6,%xmm5,%xmm7 vpaddq %xmm2,%xmm11,%xmm11 vpmuludq %xmm4,%xmm9,%xmm4 vpsrldq $6,%xmm6,%xmm8 vpaddq %xmm3,%xmm12,%xmm2 vpaddq %xmm4,%xmm13,%xmm3 vpmuludq -32(%r11),%xmm0,%xmm4 vpmuludq %xmm1,%xmm9,%xmm0 vpunpckhqdq %xmm6,%xmm5,%xmm9 vpaddq %xmm4,%xmm14,%xmm4 vpaddq %xmm0,%xmm10,%xmm0 vpunpcklqdq %xmm6,%xmm5,%xmm5 vpunpcklqdq %xmm8,%xmm7,%xmm8 vpsrldq $5,%xmm9,%xmm9 vpsrlq $26,%xmm5,%xmm6 vmovdqa 0(%rsp),%xmm14 vpand %xmm15,%xmm5,%xmm5 vpsrlq $4,%xmm8,%xmm7 vpand %xmm15,%xmm6,%xmm6 vpand 0(%rcx),%xmm9,%xmm9 vpsrlq $30,%xmm8,%xmm8 vpand %xmm15,%xmm7,%xmm7 vpand %xmm15,%xmm8,%xmm8 vpor 32(%rcx),%xmm9,%xmm9 vpsrlq $26,%xmm3,%xmm13 vpand %xmm15,%xmm3,%xmm3 vpaddq %xmm13,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm10 vpand %xmm15,%xmm0,%xmm0 vpaddq %xmm10,%xmm11,%xmm1 vpsrlq $26,%xmm4,%xmm10 vpand %xmm15,%xmm4,%xmm4 vpsrlq $26,%xmm1,%xmm11 vpand %xmm15,%xmm1,%xmm1 vpaddq %xmm11,%xmm2,%xmm2 vpaddq %xmm10,%xmm0,%xmm0 vpsllq $2,%xmm10,%xmm10 vpaddq %xmm10,%xmm0,%xmm0 vpsrlq $26,%xmm2,%xmm12 vpand %xmm15,%xmm2,%xmm2 vpaddq %xmm12,%xmm3,%xmm3 vpsrlq $26,%xmm0,%xmm10 vpand %xmm15,%xmm0,%xmm0 vpaddq %xmm10,%xmm1,%xmm1 vpsrlq $26,%xmm3,%xmm13 vpand %xmm15,%xmm3,%xmm3 vpaddq %xmm13,%xmm4,%xmm4 ja .Loop_avx .Lskip_loop_avx: vpshufd $0x10,%xmm14,%xmm14 addq $32,%rdx jnz .Long_tail_avx vpaddq %xmm2,%xmm7,%xmm7 vpaddq %xmm0,%xmm5,%xmm5 vpaddq %xmm1,%xmm6,%xmm6 vpaddq %xmm3,%xmm8,%xmm8 vpaddq %xmm4,%xmm9,%xmm9 .Long_tail_avx: vmovdqa %xmm2,32(%r11) vmovdqa %xmm0,0(%r11) vmovdqa %xmm1,16(%r11) vmovdqa %xmm3,48(%r11) vmovdqa %xmm4,64(%r11) vpmuludq %xmm7,%xmm14,%xmm12 vpmuludq %xmm5,%xmm14,%xmm10 vpshufd $0x10,-48(%rdi),%xmm2 vpmuludq %xmm6,%xmm14,%xmm11 vpmuludq %xmm8,%xmm14,%xmm13 vpmuludq %xmm9,%xmm14,%xmm14 vpmuludq %xmm8,%xmm2,%xmm0 vpaddq %xmm0,%xmm14,%xmm14 vpshufd $0x10,-32(%rdi),%xmm3 vpmuludq %xmm7,%xmm2,%xmm1 vpaddq %xmm1,%xmm13,%xmm13 vpshufd $0x10,-16(%rdi),%xmm4 vpmuludq %xmm6,%xmm2,%xmm0 vpaddq %xmm0,%xmm12,%xmm12 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm2,%xmm11,%xmm11 vpmuludq %xmm9,%xmm3,%xmm3 vpaddq %xmm3,%xmm10,%xmm10 vpshufd $0x10,0(%rdi),%xmm2 vpmuludq %xmm7,%xmm4,%xmm1 vpaddq %xmm1,%xmm14,%xmm14 vpmuludq %xmm6,%xmm4,%xmm0 vpaddq %xmm0,%xmm13,%xmm13 vpshufd $0x10,16(%rdi),%xmm3 vpmuludq %xmm5,%xmm4,%xmm4 vpaddq %xmm4,%xmm12,%xmm12 vpmuludq %xmm9,%xmm2,%xmm1 vpaddq %xmm1,%xmm11,%xmm11 vpshufd $0x10,32(%rdi),%xmm4 vpmuludq %xmm8,%xmm2,%xmm2 vpaddq %xmm2,%xmm10,%xmm10 vpmuludq %xmm6,%xmm3,%xmm0 vpaddq %xmm0,%xmm14,%xmm14 vpmuludq %xmm5,%xmm3,%xmm3 vpaddq %xmm3,%xmm13,%xmm13 vpshufd $0x10,48(%rdi),%xmm2 vpmuludq %xmm9,%xmm4,%xmm1 vpaddq %xmm1,%xmm12,%xmm12 vpshufd $0x10,64(%rdi),%xmm3 vpmuludq %xmm8,%xmm4,%xmm0 vpaddq %xmm0,%xmm11,%xmm11 vpmuludq %xmm7,%xmm4,%xmm4 vpaddq %xmm4,%xmm10,%xmm10 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm2,%xmm14,%xmm14 vpmuludq %xmm9,%xmm3,%xmm1 vpaddq %xmm1,%xmm13,%xmm13 vpmuludq %xmm8,%xmm3,%xmm0 vpaddq %xmm0,%xmm12,%xmm12 vpmuludq %xmm7,%xmm3,%xmm1 vpaddq %xmm1,%xmm11,%xmm11 vpmuludq %xmm6,%xmm3,%xmm3 vpaddq %xmm3,%xmm10,%xmm10 jz .Lshort_tail_avx vmovdqu 0(%rsi),%xmm0 vmovdqu 16(%rsi),%xmm1 vpsrldq $6,%xmm0,%xmm2 vpsrldq $6,%xmm1,%xmm3 vpunpckhqdq %xmm1,%xmm0,%xmm4 vpunpcklqdq %xmm1,%xmm0,%xmm0 vpunpcklqdq %xmm3,%xmm2,%xmm3 vpsrlq $40,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm1 vpand %xmm15,%xmm0,%xmm0 vpsrlq $4,%xmm3,%xmm2 vpand %xmm15,%xmm1,%xmm1 vpsrlq $30,%xmm3,%xmm3 vpand %xmm15,%xmm2,%xmm2 vpand %xmm15,%xmm3,%xmm3 vpor 32(%rcx),%xmm4,%xmm4 vpshufd $0x32,-64(%rdi),%xmm9 vpaddq 0(%r11),%xmm0,%xmm0 vpaddq 16(%r11),%xmm1,%xmm1 vpaddq 32(%r11),%xmm2,%xmm2 vpaddq 48(%r11),%xmm3,%xmm3 vpaddq 64(%r11),%xmm4,%xmm4 vpmuludq %xmm0,%xmm9,%xmm5 vpaddq %xmm5,%xmm10,%xmm10 vpmuludq %xmm1,%xmm9,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpmuludq %xmm2,%xmm9,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpshufd $0x32,-48(%rdi),%xmm7 vpmuludq %xmm3,%xmm9,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm4,%xmm9,%xmm9 vpaddq %xmm9,%xmm14,%xmm14 vpmuludq %xmm3,%xmm7,%xmm5 vpaddq %xmm5,%xmm14,%xmm14 vpshufd $0x32,-32(%rdi),%xmm8 vpmuludq %xmm2,%xmm7,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpshufd $0x32,-16(%rdi),%xmm9 vpmuludq %xmm1,%xmm7,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm7,%xmm11,%xmm11 vpmuludq %xmm4,%xmm8,%xmm8 vpaddq %xmm8,%xmm10,%xmm10 vpshufd $0x32,0(%rdi),%xmm7 vpmuludq %xmm2,%xmm9,%xmm6 vpaddq %xmm6,%xmm14,%xmm14 vpmuludq %xmm1,%xmm9,%xmm5 vpaddq %xmm5,%xmm13,%xmm13 vpshufd $0x32,16(%rdi),%xmm8 vpmuludq %xmm0,%xmm9,%xmm9 vpaddq %xmm9,%xmm12,%xmm12 vpmuludq %xmm4,%xmm7,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpshufd $0x32,32(%rdi),%xmm9 vpmuludq %xmm3,%xmm7,%xmm7 vpaddq %xmm7,%xmm10,%xmm10 vpmuludq %xmm1,%xmm8,%xmm5 vpaddq %xmm5,%xmm14,%xmm14 vpmuludq %xmm0,%xmm8,%xmm8 vpaddq %xmm8,%xmm13,%xmm13 vpshufd $0x32,48(%rdi),%xmm7 vpmuludq %xmm4,%xmm9,%xmm6 vpaddq %xmm6,%xmm12,%xmm12 vpshufd $0x32,64(%rdi),%xmm8 vpmuludq %xmm3,%xmm9,%xmm5 vpaddq %xmm5,%xmm11,%xmm11 vpmuludq %xmm2,%xmm9,%xmm9 vpaddq %xmm9,%xmm10,%xmm10 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm7,%xmm14,%xmm14 vpmuludq %xmm4,%xmm8,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm3,%xmm8,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpmuludq %xmm2,%xmm8,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpmuludq %xmm1,%xmm8,%xmm8 vpaddq %xmm8,%xmm10,%xmm10 .Lshort_tail_avx: vpsrldq $8,%xmm14,%xmm9 vpsrldq $8,%xmm13,%xmm8 vpsrldq $8,%xmm11,%xmm6 vpsrldq $8,%xmm10,%xmm5 vpsrldq $8,%xmm12,%xmm7 vpaddq %xmm8,%xmm13,%xmm13 vpaddq %xmm9,%xmm14,%xmm14 vpaddq %xmm5,%xmm10,%xmm10 vpaddq %xmm6,%xmm11,%xmm11 vpaddq %xmm7,%xmm12,%xmm12 vpsrlq $26,%xmm13,%xmm3 vpand %xmm15,%xmm13,%xmm13 vpaddq %xmm3,%xmm14,%xmm14 vpsrlq $26,%xmm10,%xmm0 vpand %xmm15,%xmm10,%xmm10 vpaddq %xmm0,%xmm11,%xmm11 vpsrlq $26,%xmm14,%xmm4 vpand %xmm15,%xmm14,%xmm14 vpsrlq $26,%xmm11,%xmm1 vpand %xmm15,%xmm11,%xmm11 vpaddq %xmm1,%xmm12,%xmm12 vpaddq %xmm4,%xmm10,%xmm10 vpsllq $2,%xmm4,%xmm4 vpaddq %xmm4,%xmm10,%xmm10 vpsrlq $26,%xmm12,%xmm2 vpand %xmm15,%xmm12,%xmm12 vpaddq %xmm2,%xmm13,%xmm13 vpsrlq $26,%xmm10,%xmm0 vpand %xmm15,%xmm10,%xmm10 vpaddq %xmm0,%xmm11,%xmm11 vpsrlq $26,%xmm13,%xmm3 vpand %xmm15,%xmm13,%xmm13 vpaddq %xmm3,%xmm14,%xmm14 vmovd %xmm10,-112(%rdi) vmovd %xmm11,-108(%rdi) vmovd %xmm12,-104(%rdi) vmovd %xmm13,-100(%rdi) vmovd %xmm14,-96(%rdi) leaq 88(%r11),%rsp vzeroupper .byte 0xf3,0xc3 .size poly1305_blocks_avx,.-poly1305_blocks_avx .type poly1305_emit_avx,@function .align 32 poly1305_emit_avx: cmpl $0,20(%rdi) je .Lemit movl 0(%rdi),%eax movl 4(%rdi),%ecx movl 8(%rdi),%r8d movl 12(%rdi),%r11d movl 16(%rdi),%r10d shlq $26,%rcx movq %r8,%r9 shlq $52,%r8 addq %rcx,%rax shrq $12,%r9 addq %rax,%r8 adcq $0,%r9 shlq $14,%r11 movq %r10,%rax shrq $24,%r10 addq %r11,%r9 shlq $40,%rax addq %rax,%r9 adcq $0,%r10 movq %r10,%rax movq %r10,%rcx andq $3,%r10 shrq $2,%rax andq $-4,%rcx addq %rcx,%rax addq %rax,%r8 adcq $0,%r9 adcq $0,%r10 movq %r8,%rax addq $5,%r8 movq %r9,%rcx adcq $0,%r9 adcq $0,%r10 shrq $2,%r10 cmovnzq %r8,%rax cmovnzq %r9,%rcx addq 0(%rdx),%rax adcq 8(%rdx),%rcx movq %rax,0(%rsi) movq %rcx,8(%rsi) .byte 0xf3,0xc3 .size poly1305_emit_avx,.-poly1305_emit_avx .type poly1305_blocks_avx2,@function .align 32 poly1305_blocks_avx2: movl 20(%rdi),%r8d cmpq $128,%rdx jae .Lblocks_avx2 testl %r8d,%r8d jz .Lblocks .Lblocks_avx2: andq $-16,%rdx jz .Lno_data_avx2 vzeroupper testl %r8d,%r8d jz .Lbase2_64_avx2 testq $63,%rdx jz .Leven_avx2 pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 .Lblocks_avx2_body: movq %rdx,%r15 movq 0(%rdi),%r8 movq 8(%rdi),%r9 movl 16(%rdi),%ebp movq 24(%rdi),%r11 movq 32(%rdi),%r13 movl %r8d,%r14d andq $-2147483648,%r8 movq %r9,%r12 movl %r9d,%ebx andq $-2147483648,%r9 shrq $6,%r8 shlq $52,%r12 addq %r8,%r14 shrq $12,%rbx shrq $18,%r9 addq %r12,%r14 adcq %r9,%rbx movq %rbp,%r8 shlq $40,%r8 shrq $24,%rbp addq %r8,%rbx adcq $0,%rbp movq $-4,%r9 movq %rbp,%r8 andq %rbp,%r9 shrq $2,%r8 andq $3,%rbp addq %r9,%r8 addq %r8,%r14 adcq $0,%rbx adcq $0,%rbp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 .Lbase2_26_pre_avx2: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block movq %r12,%rax testq $63,%r15 jnz .Lbase2_26_pre_avx2 testq %rcx,%rcx jz .Lstore_base2_64_avx2 movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r11 movq %rbx,%r12 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r11 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r11,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r12 andq $0x3ffffff,%rbx orq %r12,%rbp testq %r15,%r15 jz .Lstore_base2_26_avx2 vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 jmp .Lproceed_avx2 .align 32 .Lstore_base2_64_avx2: movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) jmp .Ldone_avx2 .align 16 .Lstore_base2_26_avx2: movl %eax,0(%rdi) movl %edx,4(%rdi) movl %r14d,8(%rdi) movl %ebx,12(%rdi) movl %ebp,16(%rdi) .align 16 .Ldone_avx2: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp .Lno_data_avx2: .Lblocks_avx2_epilogue: .byte 0xf3,0xc3 .align 32 .Lbase2_64_avx2: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 .Lbase2_64_avx2_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movl 16(%rdi),%ebp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 testq $63,%rdx jz .Linit_avx2 .Lbase2_64_pre_avx2: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block movq %r12,%rax testq $63,%r15 jnz .Lbase2_64_pre_avx2 .Linit_avx2: movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r8 movq %rbx,%r9 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r8 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r8,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r9 andq $0x3ffffff,%rbx orq %r9,%rbp vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 movl $1,20(%rdi) call __poly1305_init_avx .Lproceed_avx2: movq %r15,%rdx movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rax leaq 48(%rsp),%rsp .Lbase2_64_avx2_epilogue: jmp .Ldo_avx2 .align 32 .Leven_avx2: vmovd 0(%rdi),%xmm0 vmovd 4(%rdi),%xmm1 vmovd 8(%rdi),%xmm2 vmovd 12(%rdi),%xmm3 vmovd 16(%rdi),%xmm4 .Ldo_avx2: leaq -8(%rsp),%r11 subq $0x128,%rsp leaq 48+64(%rdi),%rdi leaq .Lconst(%rip),%rcx vmovdqu -64(%rdi),%xmm9 andq $-512,%rsp vmovdqu -48(%rdi),%xmm10 vmovdqu -32(%rdi),%xmm6 vmovdqu -16(%rdi),%xmm11 vmovdqu 0(%rdi),%xmm12 vmovdqu 16(%rdi),%xmm13 vmovdqu 32(%rdi),%xmm14 vpermq $0x15,%ymm9,%ymm9 vmovdqu 48(%rdi),%xmm15 vpermq $0x15,%ymm10,%ymm10 vpshufd $0xc8,%ymm9,%ymm9 vmovdqu 64(%rdi),%xmm5 vpermq $0x15,%ymm6,%ymm6 vpshufd $0xc8,%ymm10,%ymm10 vmovdqa %ymm9,0(%rsp) vpermq $0x15,%ymm11,%ymm11 vpshufd $0xc8,%ymm6,%ymm6 vmovdqa %ymm10,32(%rsp) vpermq $0x15,%ymm12,%ymm12 vpshufd $0xc8,%ymm11,%ymm11 vmovdqa %ymm6,64(%rsp) vpermq $0x15,%ymm13,%ymm13 vpshufd $0xc8,%ymm12,%ymm12 vmovdqa %ymm11,96(%rsp) vpermq $0x15,%ymm14,%ymm14 vpshufd $0xc8,%ymm13,%ymm13 vmovdqa %ymm12,128(%rsp) vpermq $0x15,%ymm15,%ymm15 vpshufd $0xc8,%ymm14,%ymm14 vmovdqa %ymm13,160(%rsp) vpermq $0x15,%ymm5,%ymm5 vpshufd $0xc8,%ymm15,%ymm15 vmovdqa %ymm14,192(%rsp) vpshufd $0xc8,%ymm5,%ymm5 vmovdqa %ymm15,224(%rsp) vmovdqa %ymm5,256(%rsp) vmovdqa 64(%rcx),%ymm5 vmovdqu 0(%rsi),%xmm7 vmovdqu 16(%rsi),%xmm8 vinserti128 $1,32(%rsi),%ymm7,%ymm7 vinserti128 $1,48(%rsi),%ymm8,%ymm8 leaq 64(%rsi),%rsi vpsrldq $6,%ymm7,%ymm9 vpsrldq $6,%ymm8,%ymm10 vpunpckhqdq %ymm8,%ymm7,%ymm6 vpunpcklqdq %ymm10,%ymm9,%ymm9 vpunpcklqdq %ymm8,%ymm7,%ymm7 vpsrlq $30,%ymm9,%ymm10 vpsrlq $4,%ymm9,%ymm9 vpsrlq $26,%ymm7,%ymm8 vpsrlq $40,%ymm6,%ymm6 vpand %ymm5,%ymm9,%ymm9 vpand %ymm5,%ymm7,%ymm7 vpand %ymm5,%ymm8,%ymm8 vpand %ymm5,%ymm10,%ymm10 vpor 32(%rcx),%ymm6,%ymm6 leaq 144(%rsp),%rax vpaddq %ymm2,%ymm9,%ymm2 subq $64,%rdx jz .Ltail_avx2 jmp .Loop_avx2 .align 32 .Loop_avx2: vpaddq %ymm0,%ymm7,%ymm0 vmovdqa 0(%rsp),%ymm7 vpaddq %ymm1,%ymm8,%ymm1 vmovdqa 32(%rsp),%ymm8 vpaddq %ymm3,%ymm10,%ymm3 vmovdqa 96(%rsp),%ymm9 vpaddq %ymm4,%ymm6,%ymm4 vmovdqa 48(%rax),%ymm10 vmovdqa 112(%rax),%ymm5 vpmuludq %ymm2,%ymm7,%ymm13 vpmuludq %ymm2,%ymm8,%ymm14 vpmuludq %ymm2,%ymm9,%ymm15 vpmuludq %ymm2,%ymm10,%ymm11 vpmuludq %ymm2,%ymm5,%ymm12 vpmuludq %ymm0,%ymm8,%ymm6 vpmuludq %ymm1,%ymm8,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq 64(%rsp),%ymm4,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm11,%ymm11 vmovdqa -16(%rax),%ymm8 vpmuludq %ymm0,%ymm7,%ymm6 vpmuludq %ymm1,%ymm7,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vpmuludq %ymm3,%ymm7,%ymm6 vpmuludq %ymm4,%ymm7,%ymm2 vmovdqu 0(%rsi),%xmm7 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm2,%ymm15,%ymm15 vinserti128 $1,32(%rsi),%ymm7,%ymm7 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq %ymm4,%ymm8,%ymm2 vmovdqu 16(%rsi),%xmm8 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vmovdqa 16(%rax),%ymm2 vpmuludq %ymm1,%ymm9,%ymm6 vpmuludq %ymm0,%ymm9,%ymm9 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm9,%ymm13,%ymm13 vinserti128 $1,48(%rsi),%ymm8,%ymm8 leaq 64(%rsi),%rsi vpmuludq %ymm1,%ymm2,%ymm6 vpmuludq %ymm0,%ymm2,%ymm2 vpsrldq $6,%ymm7,%ymm9 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm14,%ymm14 vpmuludq %ymm3,%ymm10,%ymm6 vpmuludq %ymm4,%ymm10,%ymm2 vpsrldq $6,%ymm8,%ymm10 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpunpckhqdq %ymm8,%ymm7,%ymm6 vpmuludq %ymm3,%ymm5,%ymm3 vpmuludq %ymm4,%ymm5,%ymm4 vpunpcklqdq %ymm8,%ymm7,%ymm7 vpaddq %ymm3,%ymm13,%ymm2 vpaddq %ymm4,%ymm14,%ymm3 vpunpcklqdq %ymm10,%ymm9,%ymm10 vpmuludq 80(%rax),%ymm0,%ymm4 vpmuludq %ymm1,%ymm5,%ymm0 vmovdqa 64(%rcx),%ymm5 vpaddq %ymm4,%ymm15,%ymm4 vpaddq %ymm0,%ymm11,%ymm0 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm12,%ymm1 vpsrlq $26,%ymm4,%ymm15 vpand %ymm5,%ymm4,%ymm4 vpsrlq $4,%ymm10,%ymm9 vpsrlq $26,%ymm1,%ymm12 vpand %ymm5,%ymm1,%ymm1 vpaddq %ymm12,%ymm2,%ymm2 vpaddq %ymm15,%ymm0,%ymm0 vpsllq $2,%ymm15,%ymm15 vpaddq %ymm15,%ymm0,%ymm0 vpand %ymm5,%ymm9,%ymm9 vpsrlq $26,%ymm7,%ymm8 vpsrlq $26,%ymm2,%ymm13 vpand %ymm5,%ymm2,%ymm2 vpaddq %ymm13,%ymm3,%ymm3 vpaddq %ymm9,%ymm2,%ymm2 vpsrlq $30,%ymm10,%ymm10 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm1,%ymm1 vpsrlq $40,%ymm6,%ymm6 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpand %ymm5,%ymm7,%ymm7 vpand %ymm5,%ymm8,%ymm8 vpand %ymm5,%ymm10,%ymm10 vpor 32(%rcx),%ymm6,%ymm6 subq $64,%rdx jnz .Loop_avx2 .byte 0x66,0x90 .Ltail_avx2: vpaddq %ymm0,%ymm7,%ymm0 vmovdqu 4(%rsp),%ymm7 vpaddq %ymm1,%ymm8,%ymm1 vmovdqu 36(%rsp),%ymm8 vpaddq %ymm3,%ymm10,%ymm3 vmovdqu 100(%rsp),%ymm9 vpaddq %ymm4,%ymm6,%ymm4 vmovdqu 52(%rax),%ymm10 vmovdqu 116(%rax),%ymm5 vpmuludq %ymm2,%ymm7,%ymm13 vpmuludq %ymm2,%ymm8,%ymm14 vpmuludq %ymm2,%ymm9,%ymm15 vpmuludq %ymm2,%ymm10,%ymm11 vpmuludq %ymm2,%ymm5,%ymm12 vpmuludq %ymm0,%ymm8,%ymm6 vpmuludq %ymm1,%ymm8,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq 68(%rsp),%ymm4,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm11,%ymm11 vpmuludq %ymm0,%ymm7,%ymm6 vpmuludq %ymm1,%ymm7,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vmovdqu -12(%rax),%ymm8 vpaddq %ymm2,%ymm12,%ymm12 vpmuludq %ymm3,%ymm7,%ymm6 vpmuludq %ymm4,%ymm7,%ymm2 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm2,%ymm15,%ymm15 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq %ymm4,%ymm8,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vmovdqu 20(%rax),%ymm2 vpmuludq %ymm1,%ymm9,%ymm6 vpmuludq %ymm0,%ymm9,%ymm9 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm9,%ymm13,%ymm13 vpmuludq %ymm1,%ymm2,%ymm6 vpmuludq %ymm0,%ymm2,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm14,%ymm14 vpmuludq %ymm3,%ymm10,%ymm6 vpmuludq %ymm4,%ymm10,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm5,%ymm3 vpmuludq %ymm4,%ymm5,%ymm4 vpaddq %ymm3,%ymm13,%ymm2 vpaddq %ymm4,%ymm14,%ymm3 vpmuludq 84(%rax),%ymm0,%ymm4 vpmuludq %ymm1,%ymm5,%ymm0 vmovdqa 64(%rcx),%ymm5 vpaddq %ymm4,%ymm15,%ymm4 vpaddq %ymm0,%ymm11,%ymm0 vpsrldq $8,%ymm12,%ymm8 vpsrldq $8,%ymm2,%ymm9 vpsrldq $8,%ymm3,%ymm10 vpsrldq $8,%ymm4,%ymm6 vpsrldq $8,%ymm0,%ymm7 vpaddq %ymm8,%ymm12,%ymm12 vpaddq %ymm9,%ymm2,%ymm2 vpaddq %ymm10,%ymm3,%ymm3 vpaddq %ymm6,%ymm4,%ymm4 vpaddq %ymm7,%ymm0,%ymm0 vpermq $0x2,%ymm3,%ymm10 vpermq $0x2,%ymm4,%ymm6 vpermq $0x2,%ymm0,%ymm7 vpermq $0x2,%ymm12,%ymm8 vpermq $0x2,%ymm2,%ymm9 vpaddq %ymm10,%ymm3,%ymm3 vpaddq %ymm6,%ymm4,%ymm4 vpaddq %ymm7,%ymm0,%ymm0 vpaddq %ymm8,%ymm12,%ymm12 vpaddq %ymm9,%ymm2,%ymm2 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm12,%ymm1 vpsrlq $26,%ymm4,%ymm15 vpand %ymm5,%ymm4,%ymm4 vpsrlq $26,%ymm1,%ymm12 vpand %ymm5,%ymm1,%ymm1 vpaddq %ymm12,%ymm2,%ymm2 vpaddq %ymm15,%ymm0,%ymm0 vpsllq $2,%ymm15,%ymm15 vpaddq %ymm15,%ymm0,%ymm0 vpsrlq $26,%ymm2,%ymm13 vpand %ymm5,%ymm2,%ymm2 vpaddq %ymm13,%ymm3,%ymm3 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm1,%ymm1 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vmovd %xmm0,-112(%rdi) vmovd %xmm1,-108(%rdi) vmovd %xmm2,-104(%rdi) vmovd %xmm3,-100(%rdi) vmovd %xmm4,-96(%rdi) leaq 8(%r11),%rsp vzeroupper .byte 0xf3,0xc3 .size poly1305_blocks_avx2,.-poly1305_blocks_avx2 .align 64 .Lconst: .Lmask24: .long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0 .L129: .long 16777216,0,16777216,0,16777216,0,16777216,0 .Lmask26: .long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0 .Lfive: .long 5,0,5,0,5,0,5,0 .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 16 #endif ring-0.16.9/pregenerated/poly1305-x86_64-macosx.S000064400000000000000000001005021353224257700172550ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_poly1305_init_asm .private_extern _GFp_poly1305_init_asm .private_extern _GFp_poly1305_init_asm .globl _GFp_poly1305_blocks .private_extern _GFp_poly1305_blocks .private_extern _GFp_poly1305_blocks .globl _GFp_poly1305_emit .private_extern _GFp_poly1305_emit .private_extern _GFp_poly1305_emit .p2align 5 _GFp_poly1305_init_asm: xorq %rax,%rax movq %rax,0(%rdi) movq %rax,8(%rdi) movq %rax,16(%rdi) cmpq $0,%rsi je L$no_key leaq _GFp_poly1305_blocks(%rip),%r10 leaq _GFp_poly1305_emit(%rip),%r11 movq _GFp_ia32cap_P+4(%rip),%r9 leaq poly1305_blocks_avx(%rip),%rax leaq poly1305_emit_avx(%rip),%rcx btq $28,%r9 cmovcq %rax,%r10 cmovcq %rcx,%r11 leaq poly1305_blocks_avx2(%rip),%rax btq $37,%r9 cmovcq %rax,%r10 movq $0x0ffffffc0fffffff,%rax movq $0x0ffffffc0ffffffc,%rcx andq 0(%rsi),%rax andq 8(%rsi),%rcx movq %rax,24(%rdi) movq %rcx,32(%rdi) movq %r10,0(%rdx) movq %r11,8(%rdx) movl $1,%eax L$no_key: .byte 0xf3,0xc3 .p2align 5 _GFp_poly1305_blocks: L$blocks: shrq $4,%rdx jz L$no_data pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$blocks_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movq 16(%rdi),%rbp movq %r13,%r12 shrq $2,%r13 movq %r12,%rax addq %r12,%r13 jmp L$oop .p2align 5 L$oop: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp mulq %r14 movq %rax,%r9 movq %r11,%rax movq %rdx,%r10 mulq %r14 movq %rax,%r14 movq %r11,%rax movq %rdx,%r8 mulq %rbx addq %rax,%r9 movq %r13,%rax adcq %rdx,%r10 mulq %rbx movq %rbp,%rbx addq %rax,%r14 adcq %rdx,%r8 imulq %r13,%rbx addq %rbx,%r9 movq %r8,%rbx adcq $0,%r10 imulq %r11,%rbp addq %r9,%rbx movq $-4,%rax adcq %rbp,%r10 andq %r10,%rax movq %r10,%rbp shrq $2,%r10 andq $3,%rbp addq %r10,%rax addq %rax,%r14 adcq $0,%rbx adcq $0,%rbp movq %r12,%rax decq %r15 jnz L$oop movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp L$no_data: L$blocks_epilogue: .byte 0xf3,0xc3 .p2align 5 _GFp_poly1305_emit: L$emit: movq 0(%rdi),%r8 movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq %r8,%rax addq $5,%r8 movq %r9,%rcx adcq $0,%r9 adcq $0,%r10 shrq $2,%r10 cmovnzq %r8,%rax cmovnzq %r9,%rcx addq 0(%rdx),%rax adcq 8(%rdx),%rcx movq %rax,0(%rsi) movq %rcx,8(%rsi) .byte 0xf3,0xc3 .p2align 5 __poly1305_block: mulq %r14 movq %rax,%r9 movq %r11,%rax movq %rdx,%r10 mulq %r14 movq %rax,%r14 movq %r11,%rax movq %rdx,%r8 mulq %rbx addq %rax,%r9 movq %r13,%rax adcq %rdx,%r10 mulq %rbx movq %rbp,%rbx addq %rax,%r14 adcq %rdx,%r8 imulq %r13,%rbx addq %rbx,%r9 movq %r8,%rbx adcq $0,%r10 imulq %r11,%rbp addq %r9,%rbx movq $-4,%rax adcq %rbp,%r10 andq %r10,%rax movq %r10,%rbp shrq $2,%r10 andq $3,%rbp addq %r10,%rax addq %rax,%r14 adcq $0,%rbx adcq $0,%rbp .byte 0xf3,0xc3 .p2align 5 __poly1305_init_avx: movq %r11,%r14 movq %r12,%rbx xorq %rbp,%rbp leaq 48+64(%rdi),%rdi movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movl $0x3ffffff,%edx movq %r14,%r8 andl %r14d,%eax movq %r11,%r9 andl %r11d,%edx movl %eax,-64(%rdi) shrq $26,%r8 movl %edx,-60(%rdi) shrq $26,%r9 movl $0x3ffffff,%eax movl $0x3ffffff,%edx andl %r8d,%eax andl %r9d,%edx movl %eax,-48(%rdi) leal (%rax,%rax,4),%eax movl %edx,-44(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,-32(%rdi) shrq $26,%r8 movl %edx,-28(%rdi) shrq $26,%r9 movq %rbx,%rax movq %r12,%rdx shlq $12,%rax shlq $12,%rdx orq %r8,%rax orq %r9,%rdx andl $0x3ffffff,%eax andl $0x3ffffff,%edx movl %eax,-16(%rdi) leal (%rax,%rax,4),%eax movl %edx,-12(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,0(%rdi) movq %rbx,%r8 movl %edx,4(%rdi) movq %r12,%r9 movl $0x3ffffff,%eax movl $0x3ffffff,%edx shrq $14,%r8 shrq $14,%r9 andl %r8d,%eax andl %r9d,%edx movl %eax,16(%rdi) leal (%rax,%rax,4),%eax movl %edx,20(%rdi) leal (%rdx,%rdx,4),%edx movl %eax,32(%rdi) shrq $26,%r8 movl %edx,36(%rdi) shrq $26,%r9 movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,48(%rdi) leaq (%r8,%r8,4),%r8 movl %r9d,52(%rdi) leaq (%r9,%r9,4),%r9 movl %r8d,64(%rdi) movl %r9d,68(%rdi) movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movq %r14,%r8 andl %r14d,%eax shrq $26,%r8 movl %eax,-52(%rdi) movl $0x3ffffff,%edx andl %r8d,%edx movl %edx,-36(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,-20(%rdi) movq %rbx,%rax shlq $12,%rax orq %r8,%rax andl $0x3ffffff,%eax movl %eax,-4(%rdi) leal (%rax,%rax,4),%eax movq %rbx,%r8 movl %eax,12(%rdi) movl $0x3ffffff,%edx shrq $14,%r8 andl %r8d,%edx movl %edx,28(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,44(%rdi) movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,60(%rdi) leaq (%r8,%r8,4),%r8 movl %r8d,76(%rdi) movq %r12,%rax call __poly1305_block movl $0x3ffffff,%eax movq %r14,%r8 andl %r14d,%eax shrq $26,%r8 movl %eax,-56(%rdi) movl $0x3ffffff,%edx andl %r8d,%edx movl %edx,-40(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,-24(%rdi) movq %rbx,%rax shlq $12,%rax orq %r8,%rax andl $0x3ffffff,%eax movl %eax,-8(%rdi) leal (%rax,%rax,4),%eax movq %rbx,%r8 movl %eax,8(%rdi) movl $0x3ffffff,%edx shrq $14,%r8 andl %r8d,%edx movl %edx,24(%rdi) leal (%rdx,%rdx,4),%edx shrq $26,%r8 movl %edx,40(%rdi) movq %rbp,%rax shlq $24,%rax orq %rax,%r8 movl %r8d,56(%rdi) leaq (%r8,%r8,4),%r8 movl %r8d,72(%rdi) leaq -48-64(%rdi),%rdi .byte 0xf3,0xc3 .p2align 5 poly1305_blocks_avx: movl 20(%rdi),%r8d cmpq $128,%rdx jae L$blocks_avx testl %r8d,%r8d jz L$blocks L$blocks_avx: andq $-16,%rdx jz L$no_data_avx vzeroupper testl %r8d,%r8d jz L$base2_64_avx testq $31,%rdx jz L$even_avx pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$blocks_avx_body: movq %rdx,%r15 movq 0(%rdi),%r8 movq 8(%rdi),%r9 movl 16(%rdi),%ebp movq 24(%rdi),%r11 movq 32(%rdi),%r13 movl %r8d,%r14d andq $-2147483648,%r8 movq %r9,%r12 movl %r9d,%ebx andq $-2147483648,%r9 shrq $6,%r8 shlq $52,%r12 addq %r8,%r14 shrq $12,%rbx shrq $18,%r9 addq %r12,%r14 adcq %r9,%rbx movq %rbp,%r8 shlq $40,%r8 shrq $24,%rbp addq %r8,%rbx adcq $0,%rbp movq $-4,%r9 movq %rbp,%r8 andq %rbp,%r9 shrq $2,%r8 andq $3,%rbp addq %r9,%r8 addq %r8,%r14 adcq $0,%rbx adcq $0,%rbp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp call __poly1305_block testq %rcx,%rcx jz L$store_base2_64_avx movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r11 movq %rbx,%r12 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r11 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r11,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r12 andq $0x3ffffff,%rbx orq %r12,%rbp subq $16,%r15 jz L$store_base2_26_avx vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 jmp L$proceed_avx .p2align 5 L$store_base2_64_avx: movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) jmp L$done_avx .p2align 4 L$store_base2_26_avx: movl %eax,0(%rdi) movl %edx,4(%rdi) movl %r14d,8(%rdi) movl %ebx,12(%rdi) movl %ebp,16(%rdi) .p2align 4 L$done_avx: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp L$no_data_avx: L$blocks_avx_epilogue: .byte 0xf3,0xc3 .p2align 5 L$base2_64_avx: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$base2_64_avx_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movl 16(%rdi),%ebp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 testq $31,%rdx jz L$init_avx addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block L$init_avx: movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r8 movq %rbx,%r9 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r8 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r8,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r9 andq $0x3ffffff,%rbx orq %r9,%rbp vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 movl $1,20(%rdi) call __poly1305_init_avx L$proceed_avx: movq %r15,%rdx movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rax leaq 48(%rsp),%rsp L$base2_64_avx_epilogue: jmp L$do_avx .p2align 5 L$even_avx: vmovd 0(%rdi),%xmm0 vmovd 4(%rdi),%xmm1 vmovd 8(%rdi),%xmm2 vmovd 12(%rdi),%xmm3 vmovd 16(%rdi),%xmm4 L$do_avx: leaq -88(%rsp),%r11 subq $0x178,%rsp subq $64,%rdx leaq -32(%rsi),%rax cmovcq %rax,%rsi vmovdqu 48(%rdi),%xmm14 leaq 112(%rdi),%rdi leaq L$const(%rip),%rcx vmovdqu 32(%rsi),%xmm5 vmovdqu 48(%rsi),%xmm6 vmovdqa 64(%rcx),%xmm15 vpsrldq $6,%xmm5,%xmm7 vpsrldq $6,%xmm6,%xmm8 vpunpckhqdq %xmm6,%xmm5,%xmm9 vpunpcklqdq %xmm6,%xmm5,%xmm5 vpunpcklqdq %xmm8,%xmm7,%xmm8 vpsrlq $40,%xmm9,%xmm9 vpsrlq $26,%xmm5,%xmm6 vpand %xmm15,%xmm5,%xmm5 vpsrlq $4,%xmm8,%xmm7 vpand %xmm15,%xmm6,%xmm6 vpsrlq $30,%xmm8,%xmm8 vpand %xmm15,%xmm7,%xmm7 vpand %xmm15,%xmm8,%xmm8 vpor 32(%rcx),%xmm9,%xmm9 jbe L$skip_loop_avx vmovdqu -48(%rdi),%xmm11 vmovdqu -32(%rdi),%xmm12 vpshufd $0xEE,%xmm14,%xmm13 vpshufd $0x44,%xmm14,%xmm10 vmovdqa %xmm13,-144(%r11) vmovdqa %xmm10,0(%rsp) vpshufd $0xEE,%xmm11,%xmm14 vmovdqu -16(%rdi),%xmm10 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm14,-128(%r11) vmovdqa %xmm11,16(%rsp) vpshufd $0xEE,%xmm12,%xmm13 vmovdqu 0(%rdi),%xmm11 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm13,-112(%r11) vmovdqa %xmm12,32(%rsp) vpshufd $0xEE,%xmm10,%xmm14 vmovdqu 16(%rdi),%xmm12 vpshufd $0x44,%xmm10,%xmm10 vmovdqa %xmm14,-96(%r11) vmovdqa %xmm10,48(%rsp) vpshufd $0xEE,%xmm11,%xmm13 vmovdqu 32(%rdi),%xmm10 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm13,-80(%r11) vmovdqa %xmm11,64(%rsp) vpshufd $0xEE,%xmm12,%xmm14 vmovdqu 48(%rdi),%xmm11 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm14,-64(%r11) vmovdqa %xmm12,80(%rsp) vpshufd $0xEE,%xmm10,%xmm13 vmovdqu 64(%rdi),%xmm12 vpshufd $0x44,%xmm10,%xmm10 vmovdqa %xmm13,-48(%r11) vmovdqa %xmm10,96(%rsp) vpshufd $0xEE,%xmm11,%xmm14 vpshufd $0x44,%xmm11,%xmm11 vmovdqa %xmm14,-32(%r11) vmovdqa %xmm11,112(%rsp) vpshufd $0xEE,%xmm12,%xmm13 vmovdqa 0(%rsp),%xmm14 vpshufd $0x44,%xmm12,%xmm12 vmovdqa %xmm13,-16(%r11) vmovdqa %xmm12,128(%rsp) jmp L$oop_avx .p2align 5 L$oop_avx: vpmuludq %xmm5,%xmm14,%xmm10 vpmuludq %xmm6,%xmm14,%xmm11 vmovdqa %xmm2,32(%r11) vpmuludq %xmm7,%xmm14,%xmm12 vmovdqa 16(%rsp),%xmm2 vpmuludq %xmm8,%xmm14,%xmm13 vpmuludq %xmm9,%xmm14,%xmm14 vmovdqa %xmm0,0(%r11) vpmuludq 32(%rsp),%xmm9,%xmm0 vmovdqa %xmm1,16(%r11) vpmuludq %xmm8,%xmm2,%xmm1 vpaddq %xmm0,%xmm10,%xmm10 vpaddq %xmm1,%xmm14,%xmm14 vmovdqa %xmm3,48(%r11) vpmuludq %xmm7,%xmm2,%xmm0 vpmuludq %xmm6,%xmm2,%xmm1 vpaddq %xmm0,%xmm13,%xmm13 vmovdqa 48(%rsp),%xmm3 vpaddq %xmm1,%xmm12,%xmm12 vmovdqa %xmm4,64(%r11) vpmuludq %xmm5,%xmm2,%xmm2 vpmuludq %xmm7,%xmm3,%xmm0 vpaddq %xmm2,%xmm11,%xmm11 vmovdqa 64(%rsp),%xmm4 vpaddq %xmm0,%xmm14,%xmm14 vpmuludq %xmm6,%xmm3,%xmm1 vpmuludq %xmm5,%xmm3,%xmm3 vpaddq %xmm1,%xmm13,%xmm13 vmovdqa 80(%rsp),%xmm2 vpaddq %xmm3,%xmm12,%xmm12 vpmuludq %xmm9,%xmm4,%xmm0 vpmuludq %xmm8,%xmm4,%xmm4 vpaddq %xmm0,%xmm11,%xmm11 vmovdqa 96(%rsp),%xmm3 vpaddq %xmm4,%xmm10,%xmm10 vmovdqa 128(%rsp),%xmm4 vpmuludq %xmm6,%xmm2,%xmm1 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm1,%xmm14,%xmm14 vpaddq %xmm2,%xmm13,%xmm13 vpmuludq %xmm9,%xmm3,%xmm0 vpmuludq %xmm8,%xmm3,%xmm1 vpaddq %xmm0,%xmm12,%xmm12 vmovdqu 0(%rsi),%xmm0 vpaddq %xmm1,%xmm11,%xmm11 vpmuludq %xmm7,%xmm3,%xmm3 vpmuludq %xmm7,%xmm4,%xmm7 vpaddq %xmm3,%xmm10,%xmm10 vmovdqu 16(%rsi),%xmm1 vpaddq %xmm7,%xmm11,%xmm11 vpmuludq %xmm8,%xmm4,%xmm8 vpmuludq %xmm9,%xmm4,%xmm9 vpsrldq $6,%xmm0,%xmm2 vpaddq %xmm8,%xmm12,%xmm12 vpaddq %xmm9,%xmm13,%xmm13 vpsrldq $6,%xmm1,%xmm3 vpmuludq 112(%rsp),%xmm5,%xmm9 vpmuludq %xmm6,%xmm4,%xmm5 vpunpckhqdq %xmm1,%xmm0,%xmm4 vpaddq %xmm9,%xmm14,%xmm14 vmovdqa -144(%r11),%xmm9 vpaddq %xmm5,%xmm10,%xmm10 vpunpcklqdq %xmm1,%xmm0,%xmm0 vpunpcklqdq %xmm3,%xmm2,%xmm3 vpsrldq $5,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm1 vpand %xmm15,%xmm0,%xmm0 vpsrlq $4,%xmm3,%xmm2 vpand %xmm15,%xmm1,%xmm1 vpand 0(%rcx),%xmm4,%xmm4 vpsrlq $30,%xmm3,%xmm3 vpand %xmm15,%xmm2,%xmm2 vpand %xmm15,%xmm3,%xmm3 vpor 32(%rcx),%xmm4,%xmm4 vpaddq 0(%r11),%xmm0,%xmm0 vpaddq 16(%r11),%xmm1,%xmm1 vpaddq 32(%r11),%xmm2,%xmm2 vpaddq 48(%r11),%xmm3,%xmm3 vpaddq 64(%r11),%xmm4,%xmm4 leaq 32(%rsi),%rax leaq 64(%rsi),%rsi subq $64,%rdx cmovcq %rax,%rsi vpmuludq %xmm0,%xmm9,%xmm5 vpmuludq %xmm1,%xmm9,%xmm6 vpaddq %xmm5,%xmm10,%xmm10 vpaddq %xmm6,%xmm11,%xmm11 vmovdqa -128(%r11),%xmm7 vpmuludq %xmm2,%xmm9,%xmm5 vpmuludq %xmm3,%xmm9,%xmm6 vpaddq %xmm5,%xmm12,%xmm12 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm4,%xmm9,%xmm9 vpmuludq -112(%r11),%xmm4,%xmm5 vpaddq %xmm9,%xmm14,%xmm14 vpaddq %xmm5,%xmm10,%xmm10 vpmuludq %xmm2,%xmm7,%xmm6 vpmuludq %xmm3,%xmm7,%xmm5 vpaddq %xmm6,%xmm13,%xmm13 vmovdqa -96(%r11),%xmm8 vpaddq %xmm5,%xmm14,%xmm14 vpmuludq %xmm1,%xmm7,%xmm6 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm6,%xmm12,%xmm12 vpaddq %xmm7,%xmm11,%xmm11 vmovdqa -80(%r11),%xmm9 vpmuludq %xmm2,%xmm8,%xmm5 vpmuludq %xmm1,%xmm8,%xmm6 vpaddq %xmm5,%xmm14,%xmm14 vpaddq %xmm6,%xmm13,%xmm13 vmovdqa -64(%r11),%xmm7 vpmuludq %xmm0,%xmm8,%xmm8 vpmuludq %xmm4,%xmm9,%xmm5 vpaddq %xmm8,%xmm12,%xmm12 vpaddq %xmm5,%xmm11,%xmm11 vmovdqa -48(%r11),%xmm8 vpmuludq %xmm3,%xmm9,%xmm9 vpmuludq %xmm1,%xmm7,%xmm6 vpaddq %xmm9,%xmm10,%xmm10 vmovdqa -16(%r11),%xmm9 vpaddq %xmm6,%xmm14,%xmm14 vpmuludq %xmm0,%xmm7,%xmm7 vpmuludq %xmm4,%xmm8,%xmm5 vpaddq %xmm7,%xmm13,%xmm13 vpaddq %xmm5,%xmm12,%xmm12 vmovdqu 32(%rsi),%xmm5 vpmuludq %xmm3,%xmm8,%xmm7 vpmuludq %xmm2,%xmm8,%xmm8 vpaddq %xmm7,%xmm11,%xmm11 vmovdqu 48(%rsi),%xmm6 vpaddq %xmm8,%xmm10,%xmm10 vpmuludq %xmm2,%xmm9,%xmm2 vpmuludq %xmm3,%xmm9,%xmm3 vpsrldq $6,%xmm5,%xmm7 vpaddq %xmm2,%xmm11,%xmm11 vpmuludq %xmm4,%xmm9,%xmm4 vpsrldq $6,%xmm6,%xmm8 vpaddq %xmm3,%xmm12,%xmm2 vpaddq %xmm4,%xmm13,%xmm3 vpmuludq -32(%r11),%xmm0,%xmm4 vpmuludq %xmm1,%xmm9,%xmm0 vpunpckhqdq %xmm6,%xmm5,%xmm9 vpaddq %xmm4,%xmm14,%xmm4 vpaddq %xmm0,%xmm10,%xmm0 vpunpcklqdq %xmm6,%xmm5,%xmm5 vpunpcklqdq %xmm8,%xmm7,%xmm8 vpsrldq $5,%xmm9,%xmm9 vpsrlq $26,%xmm5,%xmm6 vmovdqa 0(%rsp),%xmm14 vpand %xmm15,%xmm5,%xmm5 vpsrlq $4,%xmm8,%xmm7 vpand %xmm15,%xmm6,%xmm6 vpand 0(%rcx),%xmm9,%xmm9 vpsrlq $30,%xmm8,%xmm8 vpand %xmm15,%xmm7,%xmm7 vpand %xmm15,%xmm8,%xmm8 vpor 32(%rcx),%xmm9,%xmm9 vpsrlq $26,%xmm3,%xmm13 vpand %xmm15,%xmm3,%xmm3 vpaddq %xmm13,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm10 vpand %xmm15,%xmm0,%xmm0 vpaddq %xmm10,%xmm11,%xmm1 vpsrlq $26,%xmm4,%xmm10 vpand %xmm15,%xmm4,%xmm4 vpsrlq $26,%xmm1,%xmm11 vpand %xmm15,%xmm1,%xmm1 vpaddq %xmm11,%xmm2,%xmm2 vpaddq %xmm10,%xmm0,%xmm0 vpsllq $2,%xmm10,%xmm10 vpaddq %xmm10,%xmm0,%xmm0 vpsrlq $26,%xmm2,%xmm12 vpand %xmm15,%xmm2,%xmm2 vpaddq %xmm12,%xmm3,%xmm3 vpsrlq $26,%xmm0,%xmm10 vpand %xmm15,%xmm0,%xmm0 vpaddq %xmm10,%xmm1,%xmm1 vpsrlq $26,%xmm3,%xmm13 vpand %xmm15,%xmm3,%xmm3 vpaddq %xmm13,%xmm4,%xmm4 ja L$oop_avx L$skip_loop_avx: vpshufd $0x10,%xmm14,%xmm14 addq $32,%rdx jnz L$ong_tail_avx vpaddq %xmm2,%xmm7,%xmm7 vpaddq %xmm0,%xmm5,%xmm5 vpaddq %xmm1,%xmm6,%xmm6 vpaddq %xmm3,%xmm8,%xmm8 vpaddq %xmm4,%xmm9,%xmm9 L$ong_tail_avx: vmovdqa %xmm2,32(%r11) vmovdqa %xmm0,0(%r11) vmovdqa %xmm1,16(%r11) vmovdqa %xmm3,48(%r11) vmovdqa %xmm4,64(%r11) vpmuludq %xmm7,%xmm14,%xmm12 vpmuludq %xmm5,%xmm14,%xmm10 vpshufd $0x10,-48(%rdi),%xmm2 vpmuludq %xmm6,%xmm14,%xmm11 vpmuludq %xmm8,%xmm14,%xmm13 vpmuludq %xmm9,%xmm14,%xmm14 vpmuludq %xmm8,%xmm2,%xmm0 vpaddq %xmm0,%xmm14,%xmm14 vpshufd $0x10,-32(%rdi),%xmm3 vpmuludq %xmm7,%xmm2,%xmm1 vpaddq %xmm1,%xmm13,%xmm13 vpshufd $0x10,-16(%rdi),%xmm4 vpmuludq %xmm6,%xmm2,%xmm0 vpaddq %xmm0,%xmm12,%xmm12 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm2,%xmm11,%xmm11 vpmuludq %xmm9,%xmm3,%xmm3 vpaddq %xmm3,%xmm10,%xmm10 vpshufd $0x10,0(%rdi),%xmm2 vpmuludq %xmm7,%xmm4,%xmm1 vpaddq %xmm1,%xmm14,%xmm14 vpmuludq %xmm6,%xmm4,%xmm0 vpaddq %xmm0,%xmm13,%xmm13 vpshufd $0x10,16(%rdi),%xmm3 vpmuludq %xmm5,%xmm4,%xmm4 vpaddq %xmm4,%xmm12,%xmm12 vpmuludq %xmm9,%xmm2,%xmm1 vpaddq %xmm1,%xmm11,%xmm11 vpshufd $0x10,32(%rdi),%xmm4 vpmuludq %xmm8,%xmm2,%xmm2 vpaddq %xmm2,%xmm10,%xmm10 vpmuludq %xmm6,%xmm3,%xmm0 vpaddq %xmm0,%xmm14,%xmm14 vpmuludq %xmm5,%xmm3,%xmm3 vpaddq %xmm3,%xmm13,%xmm13 vpshufd $0x10,48(%rdi),%xmm2 vpmuludq %xmm9,%xmm4,%xmm1 vpaddq %xmm1,%xmm12,%xmm12 vpshufd $0x10,64(%rdi),%xmm3 vpmuludq %xmm8,%xmm4,%xmm0 vpaddq %xmm0,%xmm11,%xmm11 vpmuludq %xmm7,%xmm4,%xmm4 vpaddq %xmm4,%xmm10,%xmm10 vpmuludq %xmm5,%xmm2,%xmm2 vpaddq %xmm2,%xmm14,%xmm14 vpmuludq %xmm9,%xmm3,%xmm1 vpaddq %xmm1,%xmm13,%xmm13 vpmuludq %xmm8,%xmm3,%xmm0 vpaddq %xmm0,%xmm12,%xmm12 vpmuludq %xmm7,%xmm3,%xmm1 vpaddq %xmm1,%xmm11,%xmm11 vpmuludq %xmm6,%xmm3,%xmm3 vpaddq %xmm3,%xmm10,%xmm10 jz L$short_tail_avx vmovdqu 0(%rsi),%xmm0 vmovdqu 16(%rsi),%xmm1 vpsrldq $6,%xmm0,%xmm2 vpsrldq $6,%xmm1,%xmm3 vpunpckhqdq %xmm1,%xmm0,%xmm4 vpunpcklqdq %xmm1,%xmm0,%xmm0 vpunpcklqdq %xmm3,%xmm2,%xmm3 vpsrlq $40,%xmm4,%xmm4 vpsrlq $26,%xmm0,%xmm1 vpand %xmm15,%xmm0,%xmm0 vpsrlq $4,%xmm3,%xmm2 vpand %xmm15,%xmm1,%xmm1 vpsrlq $30,%xmm3,%xmm3 vpand %xmm15,%xmm2,%xmm2 vpand %xmm15,%xmm3,%xmm3 vpor 32(%rcx),%xmm4,%xmm4 vpshufd $0x32,-64(%rdi),%xmm9 vpaddq 0(%r11),%xmm0,%xmm0 vpaddq 16(%r11),%xmm1,%xmm1 vpaddq 32(%r11),%xmm2,%xmm2 vpaddq 48(%r11),%xmm3,%xmm3 vpaddq 64(%r11),%xmm4,%xmm4 vpmuludq %xmm0,%xmm9,%xmm5 vpaddq %xmm5,%xmm10,%xmm10 vpmuludq %xmm1,%xmm9,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpmuludq %xmm2,%xmm9,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpshufd $0x32,-48(%rdi),%xmm7 vpmuludq %xmm3,%xmm9,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm4,%xmm9,%xmm9 vpaddq %xmm9,%xmm14,%xmm14 vpmuludq %xmm3,%xmm7,%xmm5 vpaddq %xmm5,%xmm14,%xmm14 vpshufd $0x32,-32(%rdi),%xmm8 vpmuludq %xmm2,%xmm7,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpshufd $0x32,-16(%rdi),%xmm9 vpmuludq %xmm1,%xmm7,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm7,%xmm11,%xmm11 vpmuludq %xmm4,%xmm8,%xmm8 vpaddq %xmm8,%xmm10,%xmm10 vpshufd $0x32,0(%rdi),%xmm7 vpmuludq %xmm2,%xmm9,%xmm6 vpaddq %xmm6,%xmm14,%xmm14 vpmuludq %xmm1,%xmm9,%xmm5 vpaddq %xmm5,%xmm13,%xmm13 vpshufd $0x32,16(%rdi),%xmm8 vpmuludq %xmm0,%xmm9,%xmm9 vpaddq %xmm9,%xmm12,%xmm12 vpmuludq %xmm4,%xmm7,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpshufd $0x32,32(%rdi),%xmm9 vpmuludq %xmm3,%xmm7,%xmm7 vpaddq %xmm7,%xmm10,%xmm10 vpmuludq %xmm1,%xmm8,%xmm5 vpaddq %xmm5,%xmm14,%xmm14 vpmuludq %xmm0,%xmm8,%xmm8 vpaddq %xmm8,%xmm13,%xmm13 vpshufd $0x32,48(%rdi),%xmm7 vpmuludq %xmm4,%xmm9,%xmm6 vpaddq %xmm6,%xmm12,%xmm12 vpshufd $0x32,64(%rdi),%xmm8 vpmuludq %xmm3,%xmm9,%xmm5 vpaddq %xmm5,%xmm11,%xmm11 vpmuludq %xmm2,%xmm9,%xmm9 vpaddq %xmm9,%xmm10,%xmm10 vpmuludq %xmm0,%xmm7,%xmm7 vpaddq %xmm7,%xmm14,%xmm14 vpmuludq %xmm4,%xmm8,%xmm6 vpaddq %xmm6,%xmm13,%xmm13 vpmuludq %xmm3,%xmm8,%xmm5 vpaddq %xmm5,%xmm12,%xmm12 vpmuludq %xmm2,%xmm8,%xmm6 vpaddq %xmm6,%xmm11,%xmm11 vpmuludq %xmm1,%xmm8,%xmm8 vpaddq %xmm8,%xmm10,%xmm10 L$short_tail_avx: vpsrldq $8,%xmm14,%xmm9 vpsrldq $8,%xmm13,%xmm8 vpsrldq $8,%xmm11,%xmm6 vpsrldq $8,%xmm10,%xmm5 vpsrldq $8,%xmm12,%xmm7 vpaddq %xmm8,%xmm13,%xmm13 vpaddq %xmm9,%xmm14,%xmm14 vpaddq %xmm5,%xmm10,%xmm10 vpaddq %xmm6,%xmm11,%xmm11 vpaddq %xmm7,%xmm12,%xmm12 vpsrlq $26,%xmm13,%xmm3 vpand %xmm15,%xmm13,%xmm13 vpaddq %xmm3,%xmm14,%xmm14 vpsrlq $26,%xmm10,%xmm0 vpand %xmm15,%xmm10,%xmm10 vpaddq %xmm0,%xmm11,%xmm11 vpsrlq $26,%xmm14,%xmm4 vpand %xmm15,%xmm14,%xmm14 vpsrlq $26,%xmm11,%xmm1 vpand %xmm15,%xmm11,%xmm11 vpaddq %xmm1,%xmm12,%xmm12 vpaddq %xmm4,%xmm10,%xmm10 vpsllq $2,%xmm4,%xmm4 vpaddq %xmm4,%xmm10,%xmm10 vpsrlq $26,%xmm12,%xmm2 vpand %xmm15,%xmm12,%xmm12 vpaddq %xmm2,%xmm13,%xmm13 vpsrlq $26,%xmm10,%xmm0 vpand %xmm15,%xmm10,%xmm10 vpaddq %xmm0,%xmm11,%xmm11 vpsrlq $26,%xmm13,%xmm3 vpand %xmm15,%xmm13,%xmm13 vpaddq %xmm3,%xmm14,%xmm14 vmovd %xmm10,-112(%rdi) vmovd %xmm11,-108(%rdi) vmovd %xmm12,-104(%rdi) vmovd %xmm13,-100(%rdi) vmovd %xmm14,-96(%rdi) leaq 88(%r11),%rsp vzeroupper .byte 0xf3,0xc3 .p2align 5 poly1305_emit_avx: cmpl $0,20(%rdi) je L$emit movl 0(%rdi),%eax movl 4(%rdi),%ecx movl 8(%rdi),%r8d movl 12(%rdi),%r11d movl 16(%rdi),%r10d shlq $26,%rcx movq %r8,%r9 shlq $52,%r8 addq %rcx,%rax shrq $12,%r9 addq %rax,%r8 adcq $0,%r9 shlq $14,%r11 movq %r10,%rax shrq $24,%r10 addq %r11,%r9 shlq $40,%rax addq %rax,%r9 adcq $0,%r10 movq %r10,%rax movq %r10,%rcx andq $3,%r10 shrq $2,%rax andq $-4,%rcx addq %rcx,%rax addq %rax,%r8 adcq $0,%r9 adcq $0,%r10 movq %r8,%rax addq $5,%r8 movq %r9,%rcx adcq $0,%r9 adcq $0,%r10 shrq $2,%r10 cmovnzq %r8,%rax cmovnzq %r9,%rcx addq 0(%rdx),%rax adcq 8(%rdx),%rcx movq %rax,0(%rsi) movq %rcx,8(%rsi) .byte 0xf3,0xc3 .p2align 5 poly1305_blocks_avx2: movl 20(%rdi),%r8d cmpq $128,%rdx jae L$blocks_avx2 testl %r8d,%r8d jz L$blocks L$blocks_avx2: andq $-16,%rdx jz L$no_data_avx2 vzeroupper testl %r8d,%r8d jz L$base2_64_avx2 testq $63,%rdx jz L$even_avx2 pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$blocks_avx2_body: movq %rdx,%r15 movq 0(%rdi),%r8 movq 8(%rdi),%r9 movl 16(%rdi),%ebp movq 24(%rdi),%r11 movq 32(%rdi),%r13 movl %r8d,%r14d andq $-2147483648,%r8 movq %r9,%r12 movl %r9d,%ebx andq $-2147483648,%r9 shrq $6,%r8 shlq $52,%r12 addq %r8,%r14 shrq $12,%rbx shrq $18,%r9 addq %r12,%r14 adcq %r9,%rbx movq %rbp,%r8 shlq $40,%r8 shrq $24,%rbp addq %r8,%rbx adcq $0,%rbp movq $-4,%r9 movq %rbp,%r8 andq %rbp,%r9 shrq $2,%r8 andq $3,%rbp addq %r9,%r8 addq %r8,%r14 adcq $0,%rbx adcq $0,%rbp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 L$base2_26_pre_avx2: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block movq %r12,%rax testq $63,%r15 jnz L$base2_26_pre_avx2 testq %rcx,%rcx jz L$store_base2_64_avx2 movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r11 movq %rbx,%r12 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r11 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r11,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r12 andq $0x3ffffff,%rbx orq %r12,%rbp testq %r15,%r15 jz L$store_base2_26_avx2 vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 jmp L$proceed_avx2 .p2align 5 L$store_base2_64_avx2: movq %r14,0(%rdi) movq %rbx,8(%rdi) movq %rbp,16(%rdi) jmp L$done_avx2 .p2align 4 L$store_base2_26_avx2: movl %eax,0(%rdi) movl %edx,4(%rdi) movl %r14d,8(%rdi) movl %ebx,12(%rdi) movl %ebp,16(%rdi) .p2align 4 L$done_avx2: movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rsp L$no_data_avx2: L$blocks_avx2_epilogue: .byte 0xf3,0xc3 .p2align 5 L$base2_64_avx2: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$base2_64_avx2_body: movq %rdx,%r15 movq 24(%rdi),%r11 movq 32(%rdi),%r13 movq 0(%rdi),%r14 movq 8(%rdi),%rbx movl 16(%rdi),%ebp movq %r13,%r12 movq %r13,%rax shrq $2,%r13 addq %r12,%r13 testq $63,%rdx jz L$init_avx2 L$base2_64_pre_avx2: addq 0(%rsi),%r14 adcq 8(%rsi),%rbx leaq 16(%rsi),%rsi adcq %rcx,%rbp subq $16,%r15 call __poly1305_block movq %r12,%rax testq $63,%r15 jnz L$base2_64_pre_avx2 L$init_avx2: movq %r14,%rax movq %r14,%rdx shrq $52,%r14 movq %rbx,%r8 movq %rbx,%r9 shrq $26,%rdx andq $0x3ffffff,%rax shlq $12,%r8 andq $0x3ffffff,%rdx shrq $14,%rbx orq %r8,%r14 shlq $24,%rbp andq $0x3ffffff,%r14 shrq $40,%r9 andq $0x3ffffff,%rbx orq %r9,%rbp vmovd %eax,%xmm0 vmovd %edx,%xmm1 vmovd %r14d,%xmm2 vmovd %ebx,%xmm3 vmovd %ebp,%xmm4 movl $1,20(%rdi) call __poly1305_init_avx L$proceed_avx2: movq %r15,%rdx movq 0(%rsp),%r15 movq 8(%rsp),%r14 movq 16(%rsp),%r13 movq 24(%rsp),%r12 movq 32(%rsp),%rbp movq 40(%rsp),%rbx leaq 48(%rsp),%rax leaq 48(%rsp),%rsp L$base2_64_avx2_epilogue: jmp L$do_avx2 .p2align 5 L$even_avx2: vmovd 0(%rdi),%xmm0 vmovd 4(%rdi),%xmm1 vmovd 8(%rdi),%xmm2 vmovd 12(%rdi),%xmm3 vmovd 16(%rdi),%xmm4 L$do_avx2: leaq -8(%rsp),%r11 subq $0x128,%rsp leaq 48+64(%rdi),%rdi leaq L$const(%rip),%rcx vmovdqu -64(%rdi),%xmm9 andq $-512,%rsp vmovdqu -48(%rdi),%xmm10 vmovdqu -32(%rdi),%xmm6 vmovdqu -16(%rdi),%xmm11 vmovdqu 0(%rdi),%xmm12 vmovdqu 16(%rdi),%xmm13 vmovdqu 32(%rdi),%xmm14 vpermq $0x15,%ymm9,%ymm9 vmovdqu 48(%rdi),%xmm15 vpermq $0x15,%ymm10,%ymm10 vpshufd $0xc8,%ymm9,%ymm9 vmovdqu 64(%rdi),%xmm5 vpermq $0x15,%ymm6,%ymm6 vpshufd $0xc8,%ymm10,%ymm10 vmovdqa %ymm9,0(%rsp) vpermq $0x15,%ymm11,%ymm11 vpshufd $0xc8,%ymm6,%ymm6 vmovdqa %ymm10,32(%rsp) vpermq $0x15,%ymm12,%ymm12 vpshufd $0xc8,%ymm11,%ymm11 vmovdqa %ymm6,64(%rsp) vpermq $0x15,%ymm13,%ymm13 vpshufd $0xc8,%ymm12,%ymm12 vmovdqa %ymm11,96(%rsp) vpermq $0x15,%ymm14,%ymm14 vpshufd $0xc8,%ymm13,%ymm13 vmovdqa %ymm12,128(%rsp) vpermq $0x15,%ymm15,%ymm15 vpshufd $0xc8,%ymm14,%ymm14 vmovdqa %ymm13,160(%rsp) vpermq $0x15,%ymm5,%ymm5 vpshufd $0xc8,%ymm15,%ymm15 vmovdqa %ymm14,192(%rsp) vpshufd $0xc8,%ymm5,%ymm5 vmovdqa %ymm15,224(%rsp) vmovdqa %ymm5,256(%rsp) vmovdqa 64(%rcx),%ymm5 vmovdqu 0(%rsi),%xmm7 vmovdqu 16(%rsi),%xmm8 vinserti128 $1,32(%rsi),%ymm7,%ymm7 vinserti128 $1,48(%rsi),%ymm8,%ymm8 leaq 64(%rsi),%rsi vpsrldq $6,%ymm7,%ymm9 vpsrldq $6,%ymm8,%ymm10 vpunpckhqdq %ymm8,%ymm7,%ymm6 vpunpcklqdq %ymm10,%ymm9,%ymm9 vpunpcklqdq %ymm8,%ymm7,%ymm7 vpsrlq $30,%ymm9,%ymm10 vpsrlq $4,%ymm9,%ymm9 vpsrlq $26,%ymm7,%ymm8 vpsrlq $40,%ymm6,%ymm6 vpand %ymm5,%ymm9,%ymm9 vpand %ymm5,%ymm7,%ymm7 vpand %ymm5,%ymm8,%ymm8 vpand %ymm5,%ymm10,%ymm10 vpor 32(%rcx),%ymm6,%ymm6 leaq 144(%rsp),%rax vpaddq %ymm2,%ymm9,%ymm2 subq $64,%rdx jz L$tail_avx2 jmp L$oop_avx2 .p2align 5 L$oop_avx2: vpaddq %ymm0,%ymm7,%ymm0 vmovdqa 0(%rsp),%ymm7 vpaddq %ymm1,%ymm8,%ymm1 vmovdqa 32(%rsp),%ymm8 vpaddq %ymm3,%ymm10,%ymm3 vmovdqa 96(%rsp),%ymm9 vpaddq %ymm4,%ymm6,%ymm4 vmovdqa 48(%rax),%ymm10 vmovdqa 112(%rax),%ymm5 vpmuludq %ymm2,%ymm7,%ymm13 vpmuludq %ymm2,%ymm8,%ymm14 vpmuludq %ymm2,%ymm9,%ymm15 vpmuludq %ymm2,%ymm10,%ymm11 vpmuludq %ymm2,%ymm5,%ymm12 vpmuludq %ymm0,%ymm8,%ymm6 vpmuludq %ymm1,%ymm8,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq 64(%rsp),%ymm4,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm11,%ymm11 vmovdqa -16(%rax),%ymm8 vpmuludq %ymm0,%ymm7,%ymm6 vpmuludq %ymm1,%ymm7,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vpmuludq %ymm3,%ymm7,%ymm6 vpmuludq %ymm4,%ymm7,%ymm2 vmovdqu 0(%rsi),%xmm7 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm2,%ymm15,%ymm15 vinserti128 $1,32(%rsi),%ymm7,%ymm7 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq %ymm4,%ymm8,%ymm2 vmovdqu 16(%rsi),%xmm8 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vmovdqa 16(%rax),%ymm2 vpmuludq %ymm1,%ymm9,%ymm6 vpmuludq %ymm0,%ymm9,%ymm9 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm9,%ymm13,%ymm13 vinserti128 $1,48(%rsi),%ymm8,%ymm8 leaq 64(%rsi),%rsi vpmuludq %ymm1,%ymm2,%ymm6 vpmuludq %ymm0,%ymm2,%ymm2 vpsrldq $6,%ymm7,%ymm9 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm14,%ymm14 vpmuludq %ymm3,%ymm10,%ymm6 vpmuludq %ymm4,%ymm10,%ymm2 vpsrldq $6,%ymm8,%ymm10 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpunpckhqdq %ymm8,%ymm7,%ymm6 vpmuludq %ymm3,%ymm5,%ymm3 vpmuludq %ymm4,%ymm5,%ymm4 vpunpcklqdq %ymm8,%ymm7,%ymm7 vpaddq %ymm3,%ymm13,%ymm2 vpaddq %ymm4,%ymm14,%ymm3 vpunpcklqdq %ymm10,%ymm9,%ymm10 vpmuludq 80(%rax),%ymm0,%ymm4 vpmuludq %ymm1,%ymm5,%ymm0 vmovdqa 64(%rcx),%ymm5 vpaddq %ymm4,%ymm15,%ymm4 vpaddq %ymm0,%ymm11,%ymm0 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm12,%ymm1 vpsrlq $26,%ymm4,%ymm15 vpand %ymm5,%ymm4,%ymm4 vpsrlq $4,%ymm10,%ymm9 vpsrlq $26,%ymm1,%ymm12 vpand %ymm5,%ymm1,%ymm1 vpaddq %ymm12,%ymm2,%ymm2 vpaddq %ymm15,%ymm0,%ymm0 vpsllq $2,%ymm15,%ymm15 vpaddq %ymm15,%ymm0,%ymm0 vpand %ymm5,%ymm9,%ymm9 vpsrlq $26,%ymm7,%ymm8 vpsrlq $26,%ymm2,%ymm13 vpand %ymm5,%ymm2,%ymm2 vpaddq %ymm13,%ymm3,%ymm3 vpaddq %ymm9,%ymm2,%ymm2 vpsrlq $30,%ymm10,%ymm10 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm1,%ymm1 vpsrlq $40,%ymm6,%ymm6 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpand %ymm5,%ymm7,%ymm7 vpand %ymm5,%ymm8,%ymm8 vpand %ymm5,%ymm10,%ymm10 vpor 32(%rcx),%ymm6,%ymm6 subq $64,%rdx jnz L$oop_avx2 .byte 0x66,0x90 L$tail_avx2: vpaddq %ymm0,%ymm7,%ymm0 vmovdqu 4(%rsp),%ymm7 vpaddq %ymm1,%ymm8,%ymm1 vmovdqu 36(%rsp),%ymm8 vpaddq %ymm3,%ymm10,%ymm3 vmovdqu 100(%rsp),%ymm9 vpaddq %ymm4,%ymm6,%ymm4 vmovdqu 52(%rax),%ymm10 vmovdqu 116(%rax),%ymm5 vpmuludq %ymm2,%ymm7,%ymm13 vpmuludq %ymm2,%ymm8,%ymm14 vpmuludq %ymm2,%ymm9,%ymm15 vpmuludq %ymm2,%ymm10,%ymm11 vpmuludq %ymm2,%ymm5,%ymm12 vpmuludq %ymm0,%ymm8,%ymm6 vpmuludq %ymm1,%ymm8,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq 68(%rsp),%ymm4,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm11,%ymm11 vpmuludq %ymm0,%ymm7,%ymm6 vpmuludq %ymm1,%ymm7,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vmovdqu -12(%rax),%ymm8 vpaddq %ymm2,%ymm12,%ymm12 vpmuludq %ymm3,%ymm7,%ymm6 vpmuludq %ymm4,%ymm7,%ymm2 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm2,%ymm15,%ymm15 vpmuludq %ymm3,%ymm8,%ymm6 vpmuludq %ymm4,%ymm8,%ymm2 vpaddq %ymm6,%ymm11,%ymm11 vpaddq %ymm2,%ymm12,%ymm12 vmovdqu 20(%rax),%ymm2 vpmuludq %ymm1,%ymm9,%ymm6 vpmuludq %ymm0,%ymm9,%ymm9 vpaddq %ymm6,%ymm14,%ymm14 vpaddq %ymm9,%ymm13,%ymm13 vpmuludq %ymm1,%ymm2,%ymm6 vpmuludq %ymm0,%ymm2,%ymm2 vpaddq %ymm6,%ymm15,%ymm15 vpaddq %ymm2,%ymm14,%ymm14 vpmuludq %ymm3,%ymm10,%ymm6 vpmuludq %ymm4,%ymm10,%ymm2 vpaddq %ymm6,%ymm12,%ymm12 vpaddq %ymm2,%ymm13,%ymm13 vpmuludq %ymm3,%ymm5,%ymm3 vpmuludq %ymm4,%ymm5,%ymm4 vpaddq %ymm3,%ymm13,%ymm2 vpaddq %ymm4,%ymm14,%ymm3 vpmuludq 84(%rax),%ymm0,%ymm4 vpmuludq %ymm1,%ymm5,%ymm0 vmovdqa 64(%rcx),%ymm5 vpaddq %ymm4,%ymm15,%ymm4 vpaddq %ymm0,%ymm11,%ymm0 vpsrldq $8,%ymm12,%ymm8 vpsrldq $8,%ymm2,%ymm9 vpsrldq $8,%ymm3,%ymm10 vpsrldq $8,%ymm4,%ymm6 vpsrldq $8,%ymm0,%ymm7 vpaddq %ymm8,%ymm12,%ymm12 vpaddq %ymm9,%ymm2,%ymm2 vpaddq %ymm10,%ymm3,%ymm3 vpaddq %ymm6,%ymm4,%ymm4 vpaddq %ymm7,%ymm0,%ymm0 vpermq $0x2,%ymm3,%ymm10 vpermq $0x2,%ymm4,%ymm6 vpermq $0x2,%ymm0,%ymm7 vpermq $0x2,%ymm12,%ymm8 vpermq $0x2,%ymm2,%ymm9 vpaddq %ymm10,%ymm3,%ymm3 vpaddq %ymm6,%ymm4,%ymm4 vpaddq %ymm7,%ymm0,%ymm0 vpaddq %ymm8,%ymm12,%ymm12 vpaddq %ymm9,%ymm2,%ymm2 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm12,%ymm1 vpsrlq $26,%ymm4,%ymm15 vpand %ymm5,%ymm4,%ymm4 vpsrlq $26,%ymm1,%ymm12 vpand %ymm5,%ymm1,%ymm1 vpaddq %ymm12,%ymm2,%ymm2 vpaddq %ymm15,%ymm0,%ymm0 vpsllq $2,%ymm15,%ymm15 vpaddq %ymm15,%ymm0,%ymm0 vpsrlq $26,%ymm2,%ymm13 vpand %ymm5,%ymm2,%ymm2 vpaddq %ymm13,%ymm3,%ymm3 vpsrlq $26,%ymm0,%ymm11 vpand %ymm5,%ymm0,%ymm0 vpaddq %ymm11,%ymm1,%ymm1 vpsrlq $26,%ymm3,%ymm14 vpand %ymm5,%ymm3,%ymm3 vpaddq %ymm14,%ymm4,%ymm4 vmovd %xmm0,-112(%rdi) vmovd %xmm1,-108(%rdi) vmovd %xmm2,-104(%rdi) vmovd %xmm3,-100(%rdi) vmovd %xmm4,-96(%rdi) leaq 8(%r11),%rsp vzeroupper .byte 0xf3,0xc3 .p2align 6 L$const: L$mask24: .long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0 L$129: .long 16777216,0,16777216,0,16777216,0,16777216,0 L$mask26: .long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0 L$five: .long 5,0,5,0,5,0,5,0 .byte 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 4 #endif ring-0.16.9/pregenerated/poly1305-x86_64-nasm.obj000064400000000000000000000712031353224260300172640ustar0000000000000000dEi]ec.text p`.pdatax2@0@.xdataB^@@@.debug$S(=*!R^@B.debug$T e@BH|$Ht$HHHLH1HHGHGHoLLL HvH oILBLBHI%LBHHH#H#NHGHO LLZH|$Ht$ffffff.H|$Ht$HHHLLHSUATAUAVAWIL_Lo L7H_HoMILM ff.L6H^HvHIILIIILIHILIHHIIIILIILHIL!LIHLIHHLI{L7H_HoL<$Lt$Ll$Ld$Hl$ H\$(Hd$0H|$Ht$fH|$Ht$HHHLLLOLWLILIIIIEIEHHJHHNH|$Ht$IILIIILIHILIHHIIIILIILHIL!LIHLIHHffffff.@MLH1HpLkMD!MD!ډGIWID!D!ʉGЍWԍGIWIHLH H L L %GWI؉WMIID!D!ʉGWG IW$IHHI DG0ODO4O DG@DODLMD!IG̺D!‰W܍IWHH L %GI؉G ID!‰WIW,HHI DGnnynnn*ffffff.DL7H_HoWDw_ oL<$Lt$Ll$Ld$Hl$ H\$(Hd$0H|$Ht$ffffff.SUATAUAVAWIL_Lo L7H_oMLIMHL6H^HvHIPLLI4IIHH%I HHM HII(HL nnynnnGjLL<$Lt$Ll$Ld$Hl$ H\$(HD$0Hd$03ffffff.fff.nnOnWn_ ngL$HysPy{`AyCpAyAyAyAyAyAyAyH@HFHBzow0HpH Lon ov0yoy@sŹsQmlAAl1s(sQAsI9sAA91I fzo_zogAypAypDAypy$AypzoWAypDAysy\$AypzoAypDAykyd$ AypzogAypDAysyT$0AypzoW AypDAyky\$@Aypzo_0AypDAysyd$PAypzog@AypDAykyT$`AypAypDAysy\$pAypyo4$AypDAyky$f yS oT$A A yűD$ yKi) y[0o\$0yc@!od$@ oT$PYY!o\$`)o$ aao!)oN!AYAYsAAsQL$pmA Ayop)llssysq!siaa yqKiS a[0Yc@HF Hv@H@HBűű)!yo{űű1YkA )AyoC !AyoKŹŹ yo{9űA!AyoC1A)AyoK Źon Ź9!ov0A)űűs!űŹsřőycűQmʼnũlAAl1ssyo4$QAsI1 9sAA91I ősaYũsy!ũsYšsqiy)syřsiaũsyqősaYAypH 91yS yyKy[0yc@ pW A A i p_pg!a)p p_i!pg i) pW0Yp_@Y!) aa!)looNssmlls(sysqsiaa ypO2yqKiS a[0Yc@ű)ű!űp2ű1A ypG2ypO2!9A)p?2ű űypG21A!ypO 2)Ź 9Ap02űypG@2ű!1A) ŹŹŹ!9A)1s9sIsQsAsAA )!asA ysA)!YsA qsA!)s)isAysA)!asA y~Wy~_y~gy~oy~wyosPyo{`AyoCpAyoAyoAyoAyoAyoAyoAyoIwH|$Ht$@H|$Ht$HHHLƒODGD_ DWHMI4HI IIILIMH(IILLIHHHIIILILIIIIEIEHHJHHNH|$Ht$DH|$Ht$HHHLLDGH E&HwEH?SUATAUAVAWILLOoL_Lo EIMDIII4MH IMLII(HLHIII!IHMMHHMLIML6H^HvHILI?HiLLI4IIHH%I HHM HII(HL M+nnynnn'L7H_HoWDw_ oL<$Lt$Ll$Ld$Hl$ H\$(Hd$0H|$Ht$ffffff.SUATAUAVAWIL_Lo L7H_oMLIMH?'L6H^HvHILI?LLI4IIHH%I HHM HII(HL nnynnnGLL<$Lt$Ll$Ld$Hl$ H\$(HD$0Hd$0#ff.nnOnWn_ ngL$HysPy{`AyCpAyAyAyAyAyAyAyHpH zoOHzoWowzo_zo'zoozow Czo0CA}poo@A}p} $Cp}T$ CA}pt$@CA}p}\$`CA}p}$CA}p}$A}p}$p}$$oi@o>zoFE8~ c=8F0Hv@ŵs-sEmA5lEl-s5sŽss(5=-q H$ŵH@ffffff.ffff.o<$Ž}oD$ ŭ}oL$`}oP0ohpE=5-UŽŽŽT$@%}o@%o> E8~ ŽŽzoF%oPŵ5 Ac=8F0Hv@ŵs ŭŭ-sEmElŕōA5l`Poi@Ņťōs]ťsŅs5sŝsm}s}5Žsŕsem-sťsus(ōs]=-q H@2fo|$Ž~oD$$ŭ~oL$d~oP4ohtE=5-UŽŽŽT$D%%~o@ ŽŽ%oPŵ5 A ŭŭŕō`Toi@Ņť=sŵsŭsssAmecCceAmōs]ťsŅsŝsm}s}ŕseťsuōs]~G~O~W~_~gyosPyo{`AyoCpAyoAyoAyoAyoAyoAyoAyoIwH|$Ht$f.Poly1305 for x86_64, CRYPTOGAMS by fVWSUATAUAVAWH@I@xIIqMY8ENL9IESNL9H@0HXHhL`LhLpLxIIMMMMwfVWSUATAUAVAWH@I@xIIqMY8ENL9:IESNL9"IHpPHIHHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^?M S T U$(,V048W<@0DXH1L2PYT3X6\Z`6d7h[l7pHt\ N N$N(,4N8<$DNH%L'TPX)\/dNh1l1tNx8|>N?BPDG3P:\ring\pregenerated\tmp\poly1305-x86_64-nasm.asm7?CEFGIJKLPQSTUVWX[]^`abde f ghj l#m'n+o.p1q4r7s:u=v@wCxFzI{L|O}RUX[^behlpsz} "&)-279@CFILORUX[^adgjmptwz~       #& )!-"1#4$7%<&B'E(H)K*N+P,S-V.Y0^1c2g3k4n5q6t7w8z9}:;<=?@ABCDEFGIJLMNOPRSTUVWYZ[\]^_`bcdef g hjklmn"o&q)r.t3u6v9w=x@zE{H|K}N~RUX\_dgjmpuy|  #&*-158?BELPTW[_behlpsw~     #',@CGKP R!U"Y#\$_%`'d(i)n*s+x,}-01246789:;>@ACDEGHIJLMOPQRSUYZ[\]^_ `abcd e'f+g2h5j9k=lBmFnJoQqVtYv]wbxgylzq{v|{} $)-49>CHMQUZ`ejpu{     ! ' - 2 8 > D J O U [ a g m s y                                   $ * . 3 8 < !B "F $O %S &W '[ (_ )d *i +m ,q -u .y /} 0 2 3 4 5 6 7 8 9 : ; < = > ? A B E F G H I J K L M N P Q R S T V" W& X* Y. d2 e6 f: g> hD iH jL kP lT mX n^ oc qg rk so ts uy v} w x y z | } ~                               $ * . 2 6 : > C I N S X ^ c g m r w |                                  % + 1 7 ; ? E I N S X \ b f j p t x |                          ! " # % &'( )*+,- .$0*2.33586=7A8E9I;N<S=X>]?b@gAlBqCvE|FGHIJOPQRSTUVWXY[\]^_`abcdefhij klmno!p%q)r/s3t7v;w?xCyHzN{R|V}\~`dhmquy} $)-38<AFKPU[agpy #&)-158;?CFJMQ U Y ] adhkoty{ !$%&'(+,.01346789:;>@ABDEHIJKL NOPQRS"T%V(W,X0Y3Z7\>]A^D_H`LaObRcVdZf]g`hdigljmnnroupyr~suvxy|}~  $).38=BGLN`abdfhjmqux|  !&)-27<AFKPU`d i n s x !"#$%&' ()*+#,(-..4/90?1D2J3P4V5\6b7h8n9t:z;<=>?@ABCDEIJKLMOPQRSUV WXYZ[ \$])_1`5a9b?cDe`odpiqmrsswt}uvw #'+/48<@DJNRW[_dhlqvz $(.04:>D H N R W \`dhlptx| !"#$%&()*+,-./023456789;<= > ?@ABC#H)I.J3K8L=MBNGOLPPQTSZT`UfVlWrXwY{Z[\abcefgijlmnpqrtuvxyz|}~ !*3<ENW`gjotv 07@ABCDFHJLMQU\`dgknt{ #&,37>EJNRV]dkor w { ~  !"#$% 4P:\ring\pregenerated\poly1305-x86_64-nasm.objyasm 1.3.0GFp_poly1305_init_asmGFp_poly1305_blocksGFp_poly1305_emit+L$SEH_begin_GFp_poly1305_init_asmL$no_keypoly1305_blocks_avxpoly1305_emit_avxpoly1305_blocks_avx2)L$SEH_end_GFp_poly1305_init_asm)L$SEH_begin_GFp_poly1305_blocksL$blocksL$no_dataL$blocks_bodyL$oopL$blocks_epilogue'L$SEH_end_GFp_poly1305_blocks'L$SEH_begin_GFp_poly1305_emitL$emit%L$SEH_end_GFp_poly1305_emit__poly1305_block__poly1305_init_avx)L$SEH_begin_poly1305_blocks_avxL$blocks_avxL$no_data_avxL$base2_64_avxL$even_avxL$blocks_avx_bodyL$store_base2_64_avxL$store_base2_26_avxL$proceed_avxL$done_avxL$blocks_avx_epilogueL$base2_64_avx_bodyL$init_avx!L$base2_64_avx_epilogueL$do_avxL$do_avx_bodyL$constL$skip_loop_avxL$oop_avxL$ong_tail_avxL$short_tail_avxL$do_avx_epilogue'L$SEH_end_poly1305_blocks_avx'L$SEH_begin_poly1305_emit_avx%L$SEH_end_poly1305_emit_avx*L$SEH_begin_poly1305_blocks_avx2L$blocks_avx2L$no_data_avx2L$base2_64_avx2L$even_avx2L$blocks_avx2_bodyL$base2_26_pre_avx2L$store_base2_64_avx2L$store_base2_26_avx2L$proceed_avx2L$done_avx2 L$blocks_avx2_epilogueL$base2_64_avx2_bodyL$init_avx2L$base2_64_pre_avx2"L$base2_64_avx2_epilogueL$do_avx2L$do_avx2_bodyL$tail_avx2L$oop_avx2L$do_avx2_epilogue(L$SEH_end_poly1305_blocks_avx2L$mask24L$129L$mask26L$fivese_handlerL$common_seh_tailavx_handler-  L$SEH_info_GFp_poly1305_init_asm+  L$SEH_info_GFp_poly1305_blocks)  L$SEH_info_GFp_poly1305_emit-  L$SEH_info_poly1305_blocks_avx_1-  L$SEH_info_poly1305_blocks_avx_2-  L$SEH_info_poly1305_blocks_avx_3)  L$SEH_info_poly1305_emit_avx.  L$SEH_info_poly1305_blocks_avx2_1.  L$SEH_info_poly1305_blocks_avx2_2.  L$SEH_info_poly1305_blocks_avx2_3h l 2 2 3 3 33 73 P3 T3 }3 3 3 3 3 3 3 3 3 3 4 4 C4 G4 W4 [4 l4 p4 4 4 4 4 4 4 4 4 5 5 5 5 >5 B5 Z5 ^5 y5 }5 5 5 5 5 5 5 5 5 6 6 "6 &6 B6! F6! b6" f6" {6# 6# 6$ 6$ 6% 6% 6& 6& 6' 6' 7( 7( 7) "7) 77* ;7* J7+ N7+ e7, i7, z7- ~7- 7. 7. 7/ 7/ 70 70 71 71 82 #82 F83 J83 r84 v84 85 85 86 86 87 87 88 88 89 89 9: 9: 59; 99; V9< Z9< p9= t9= 9> 9> 9? 9? 9@ 9@ 9A 9A 9B :B #:C ':C 8:D <:D R:E V:E i:F m:F :G :G :H :H :I :I :J :J :K :K ;L ;L ;N ;N (;O ,;O E;P I;P `;S d;S ;T ;T ;U ;U ;V ;V <W <W E<X I<X t<Y x<Y <Z <Z <[ <[ <\ =\ .fileg.text.<Rfx L$no_keyL$blocksL$oop -?]L$emit{9@ #@8PMV[`f|L$do_avxL$const    +I{eB``g&! -BDjYeyPx0`gvL$mask24L$129L$mask26L$five @N(.pdatax4Ut 0@P`p3U.xdata.debug$S(=.debug$T wpregenerated\tmp\poly1305-x86_64-nasm.asmGFp_ia32cap_PGFp_poly1305_init_asmGFp_poly1305_blocksGFp_poly1305_emitL$SEH_begin_GFp_poly1305_init_asmpoly1305_blocks_avxpoly1305_emit_avxpoly1305_blocks_avx2L$SEH_end_GFp_poly1305_init_asmL$SEH_begin_GFp_poly1305_blocksL$no_dataL$blocks_bodyL$blocks_epilogueL$SEH_end_GFp_poly1305_blocksL$SEH_begin_GFp_poly1305_emitL$SEH_end_GFp_poly1305_emit__poly1305_block__poly1305_init_avxL$SEH_begin_poly1305_blocks_avxL$blocks_avxL$no_data_avxL$base2_64_avxL$even_avxL$blocks_avx_bodyL$store_base2_64_avxL$store_base2_26_avxL$proceed_avxL$done_avxL$blocks_avx_epilogueL$base2_64_avx_bodyL$init_avxL$base2_64_avx_epilogueL$do_avx_bodyL$skip_loop_avxL$oop_avxL$ong_tail_avxL$short_tail_avxL$do_avx_epilogueL$SEH_end_poly1305_blocks_avxL$SEH_begin_poly1305_emit_avxL$SEH_end_poly1305_emit_avxL$SEH_begin_poly1305_blocks_avx2L$blocks_avx2L$no_data_avx2L$base2_64_avx2L$even_avx2L$blocks_avx2_bodyL$base2_26_pre_avx2L$store_base2_64_avx2L$store_base2_26_avx2L$proceed_avx2L$done_avx2L$blocks_avx2_epilogueL$base2_64_avx2_bodyL$init_avx2L$base2_64_pre_avx2L$base2_64_avx2_epilogueL$do_avx2L$do_avx2_bodyL$tail_avx2L$oop_avx2L$do_avx2_epilogueL$SEH_end_poly1305_blocks_avx2__imp_RtlVirtualUnwindse_handlerL$common_seh_tailavx_handlerL$SEH_info_GFp_poly1305_init_asmL$SEH_info_GFp_poly1305_blocksL$SEH_info_GFp_poly1305_emitL$SEH_info_poly1305_blocks_avx_1L$SEH_info_poly1305_blocks_avx_2L$SEH_info_poly1305_blocks_avx_3L$SEH_info_poly1305_emit_avxL$SEH_info_poly1305_blocks_avx2_1L$SEH_info_poly1305_blocks_avx2_2L$SEH_info_poly1305_blocks_avx2_3ring-0.16.9/pregenerated/sha256-armv4-ios32.S000064400000000000000000001752551353224261100165370ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Permission to use under GPL terms is granted. @ ==================================================================== @ SHA256 block procedure for ARMv4. May 2007. @ Performance is ~2x better than gcc 3.4 generated code and in "abso- @ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per @ byte [on single-issue Xscale PXA250 core]. @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 22% improvement on @ Cortex A8 core and ~20 cycles per processed byte. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 16% @ improvement on Cortex A8 core and ~15.4 cycles per processed byte. @ September 2013. @ @ Add NEON implementation. On Cortex A8 it was measured to process one @ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon @ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only @ code (meaning that latter performs sub-optimally, nothing was done @ about it). @ May 2014. @ @ Add ARMv8 code path performing at 2.0 cpb on Apple A7. #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those @ instructions are manually-encoded. (See unsha256.) .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .align 5 K256: .word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .word 0 @ terminator #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) LOPENSSL_armcap: .word GFp_armcap_P-Lsha256_block_data_order #endif .align 5 .globl _GFp_sha256_block_data_order .private_extern _GFp_sha256_block_data_order #ifdef __thumb2__ .thumb_func _GFp_sha256_block_data_order #endif _GFp_sha256_block_data_order: Lsha256_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ _GFp_sha256_block_data_order #else adr r3,Lsha256_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV8_SHA256 bne LARMv8 tst r12,#ARMV7_NEON bne LNEON #endif add r2,r1,r2,lsl#6 @ len to point at the end of inp stmdb sp!,{r0,r1,r2,r4-r11,lr} ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} sub r14,r3,#256+32 @ K256 sub sp,sp,#16*4 @ alloca(X[16]) Loop: # if __ARM_ARCH__>=7 ldr r2,[r1],#4 # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ magic eor r12,r12,r12 #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 0 # if 0==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 add r4,r4,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r8,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 0 add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 0==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r8,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#0*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 0==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 0<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#2*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#15*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 1 # if 1==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 add r11,r11,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r7,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 1 add r11,r11,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 1==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r7,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#1*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 1==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 1<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#3*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#0*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 2 # if 2==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 add r10,r10,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r6,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 2 add r10,r10,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 2==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r6,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#2*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 2==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 2<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#4*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#1*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 3 # if 3==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 add r9,r9,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r5,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 3 add r9,r9,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 3==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r5,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#3*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 3==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 3<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#5*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#2*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 4 # if 4==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 add r8,r8,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r4,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 4 add r8,r8,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 4==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r4,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#4*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 4==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 4<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#6*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#3*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 5 # if 5==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r11,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 5==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r11,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#5*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 5==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 5<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#7*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#4*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 6 # if 6==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 add r6,r6,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r10,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 6 add r6,r6,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 6==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r10,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#6*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 6==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 6<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#8*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#5*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 7 # if 7==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 add r5,r5,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r9,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 7==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r9,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#7*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 7==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 7<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#9*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#6*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 8 # if 8==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 add r4,r4,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r8,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 8 add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 8==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r8,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#8*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 8==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 8<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#10*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#7*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 9 # if 9==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 add r11,r11,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r7,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 9 add r11,r11,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 9==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r7,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#9*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 9==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 9<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#11*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#8*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 10 # if 10==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 add r10,r10,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r6,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 10 add r10,r10,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 10==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r6,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#10*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 10==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 10<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#12*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#9*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 11 # if 11==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 add r9,r9,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r5,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 11 add r9,r9,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 11==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r5,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#11*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 11==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 11<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#13*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#10*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 12 # if 12==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 add r8,r8,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r4,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 12 add r8,r8,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 12==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r4,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#12*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 12==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 12<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#14*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#11*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 13 # if 13==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r11,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 13 add r7,r7,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 13==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r11,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#13*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 13==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 13<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#15*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#12*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 14 # if 14==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 add r6,r6,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r10,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 14 add r6,r6,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 14==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r10,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#14*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 14==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 14<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#0*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#13*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 15 # if 15==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 add r5,r5,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r9,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 15 add r5,r5,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 15==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r9,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#15*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 15==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 15<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#1*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#14*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) Lrounds_16_xx: @ ldr r2,[sp,#1*4] @ 16 @ ldr r1,[sp,#14*4] mov r0,r2,ror#7 add r4,r4,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#0*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#9*4] add r12,r12,r0 eor r0,r8,r8,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r8,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#0*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 16==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 16<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#2*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#15*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#2*4] @ 17 @ ldr r1,[sp,#15*4] mov r0,r2,ror#7 add r11,r11,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#1*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#10*4] add r3,r3,r0 eor r0,r7,r7,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r7,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#1*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 17==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 17<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#3*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#0*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#3*4] @ 18 @ ldr r1,[sp,#0*4] mov r0,r2,ror#7 add r10,r10,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#2*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#11*4] add r12,r12,r0 eor r0,r6,r6,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r6,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#2*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 18==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 18<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#4*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#1*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#4*4] @ 19 @ ldr r1,[sp,#1*4] mov r0,r2,ror#7 add r9,r9,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#3*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#12*4] add r3,r3,r0 eor r0,r5,r5,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r5,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#3*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 19==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 19<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#5*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#2*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#5*4] @ 20 @ ldr r1,[sp,#2*4] mov r0,r2,ror#7 add r8,r8,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#4*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#13*4] add r12,r12,r0 eor r0,r4,r4,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r4,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#4*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 20==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 20<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#6*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#3*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#6*4] @ 21 @ ldr r1,[sp,#3*4] mov r0,r2,ror#7 add r7,r7,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#5*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#14*4] add r3,r3,r0 eor r0,r11,r11,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r11,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#5*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 21==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 21<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#7*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#4*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#7*4] @ 22 @ ldr r1,[sp,#4*4] mov r0,r2,ror#7 add r6,r6,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#6*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#15*4] add r12,r12,r0 eor r0,r10,r10,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r10,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#6*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 22==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 22<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#8*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#5*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#8*4] @ 23 @ ldr r1,[sp,#5*4] mov r0,r2,ror#7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#7*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#0*4] add r3,r3,r0 eor r0,r9,r9,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r9,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#7*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 23==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 23<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#9*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#6*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#9*4] @ 24 @ ldr r1,[sp,#6*4] mov r0,r2,ror#7 add r4,r4,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#8*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#1*4] add r12,r12,r0 eor r0,r8,r8,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r8,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#8*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 24==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 24<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#10*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#7*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#10*4] @ 25 @ ldr r1,[sp,#7*4] mov r0,r2,ror#7 add r11,r11,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#9*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#2*4] add r3,r3,r0 eor r0,r7,r7,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r7,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#9*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 25==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 25<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#11*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#8*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#11*4] @ 26 @ ldr r1,[sp,#8*4] mov r0,r2,ror#7 add r10,r10,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#10*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#3*4] add r12,r12,r0 eor r0,r6,r6,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r6,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#10*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 26==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 26<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#12*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#9*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#12*4] @ 27 @ ldr r1,[sp,#9*4] mov r0,r2,ror#7 add r9,r9,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#11*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#4*4] add r3,r3,r0 eor r0,r5,r5,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r5,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#11*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 27==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 27<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#13*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#10*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#13*4] @ 28 @ ldr r1,[sp,#10*4] mov r0,r2,ror#7 add r8,r8,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#12*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#5*4] add r12,r12,r0 eor r0,r4,r4,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r4,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#12*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 28==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 28<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#14*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#11*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#14*4] @ 29 @ ldr r1,[sp,#11*4] mov r0,r2,ror#7 add r7,r7,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#13*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#6*4] add r3,r3,r0 eor r0,r11,r11,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r11,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#13*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 29==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 29<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#15*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#12*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#15*4] @ 30 @ ldr r1,[sp,#12*4] mov r0,r2,ror#7 add r6,r6,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#14*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#7*4] add r12,r12,r0 eor r0,r10,r10,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r10,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#14*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 30==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 30<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#0*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#13*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#0*4] @ 31 @ ldr r1,[sp,#13*4] mov r0,r2,ror#7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#15*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#8*4] add r3,r3,r0 eor r0,r9,r9,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r9,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#15*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 31==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 31<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#1*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#14*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 ite eq @ Thumb2 thing, sanity check in ARM #endif ldreq r3,[sp,#16*4] @ pull ctx bne Lrounds_16_xx add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldr r0,[r3,#0] ldr r2,[r3,#4] ldr r12,[r3,#8] add r4,r4,r0 ldr r0,[r3,#12] add r5,r5,r2 ldr r2,[r3,#16] add r6,r6,r12 ldr r12,[r3,#20] add r7,r7,r0 ldr r0,[r3,#24] add r8,r8,r2 ldr r2,[r3,#28] add r9,r9,r12 ldr r1,[sp,#17*4] @ pull inp ldr r12,[sp,#18*4] @ pull inp+len add r10,r10,r0 add r11,r11,r2 stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} cmp r1,r12 sub r14,r14,#256 @ rewind Ktbl bne Loop add sp,sp,#19*4 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #if __ARM_MAX_ARCH__>=7 #ifdef __thumb2__ .thumb_func sha256_block_data_order_neon #endif .align 5 .skip 16 sha256_block_data_order_neon: LNEON: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} sub r11,sp,#16*4+16 adr r14,K256 bic r11,r11,#15 @ align for 128-bit stores mov r12,sp mov sp,r11 @ alloca add r2,r1,r2,lsl#6 @ len to point at the end of inp vld1.8 {q0},[r1]! vld1.8 {q1},[r1]! vld1.8 {q2},[r1]! vld1.8 {q3},[r1]! vld1.32 {q8},[r14,:128]! vld1.32 {q9},[r14,:128]! vld1.32 {q10},[r14,:128]! vld1.32 {q11},[r14,:128]! vrev32.8 q0,q0 @ yes, even on str r0,[sp,#64] vrev32.8 q1,q1 @ big-endian str r1,[sp,#68] mov r1,sp vrev32.8 q2,q2 str r2,[sp,#72] vrev32.8 q3,q3 str r12,[sp,#76] @ save original sp vadd.i32 q8,q8,q0 vadd.i32 q9,q9,q1 vst1.32 {q8},[r1,:128]! vadd.i32 q10,q10,q2 vst1.32 {q9},[r1,:128]! vadd.i32 q11,q11,q3 vst1.32 {q10},[r1,:128]! vst1.32 {q11},[r1,:128]! ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} sub r1,r1,#64 ldr r2,[sp,#0] eor r12,r12,r12 eor r3,r5,r6 b L_00_48 .align 4 L_00_48: vext.8 q8,q0,q1,#4 add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 vext.8 q9,q2,q3,#4 add r4,r4,r12 and r2,r2,r8 eor r12,r0,r8,ror#19 vshr.u32 q10,q8,#7 eor r0,r4,r4,ror#11 eor r2,r2,r10 vadd.i32 q0,q0,q9 add r11,r11,r12,ror#6 eor r12,r4,r5 vshr.u32 q9,q8,#3 eor r0,r0,r4,ror#20 add r11,r11,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#4] and r3,r3,r12 vshr.u32 q11,q8,#18 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 veor q9,q9,q10 add r10,r10,r2 vsli.32 q11,q8,#14 eor r2,r8,r9 eor r0,r7,r7,ror#5 vshr.u32 d24,d7,#17 add r11,r11,r3 and r2,r2,r7 veor q9,q9,q11 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 vsli.32 d24,d7,#15 eor r2,r2,r9 add r10,r10,r3,ror#6 vshr.u32 d25,d7,#10 eor r3,r11,r4 eor r0,r0,r11,ror#20 vadd.i32 q0,q0,q9 add r10,r10,r2 ldr r2,[sp,#8] veor d25,d25,d24 and r12,r12,r3 add r6,r6,r10 vshr.u32 d24,d7,#19 add r10,r10,r0,ror#2 eor r12,r12,r4 vsli.32 d24,d7,#13 add r9,r9,r2 eor r2,r7,r8 veor d25,d25,d24 eor r0,r6,r6,ror#5 add r10,r10,r12 vadd.i32 d0,d0,d25 and r2,r2,r6 eor r12,r0,r6,ror#19 vshr.u32 d24,d0,#17 eor r0,r10,r10,ror#11 eor r2,r2,r8 vsli.32 d24,d0,#15 add r9,r9,r12,ror#6 eor r12,r10,r11 vshr.u32 d25,d0,#10 eor r0,r0,r10,ror#20 add r9,r9,r2 veor d25,d25,d24 ldr r2,[sp,#12] and r3,r3,r12 vshr.u32 d24,d0,#19 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 vld1.32 {q8},[r14,:128]! add r8,r8,r2 vsli.32 d24,d0,#13 eor r2,r6,r7 eor r0,r5,r5,ror#5 veor d25,d25,d24 add r9,r9,r3 and r2,r2,r5 vadd.i32 d1,d1,d25 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 vadd.i32 q8,q8,q0 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#16] and r12,r12,r3 add r4,r4,r8 vst1.32 {q8},[r1,:128]! add r8,r8,r0,ror#2 eor r12,r12,r10 vext.8 q8,q1,q2,#4 add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 vext.8 q9,q3,q0,#4 add r8,r8,r12 and r2,r2,r4 eor r12,r0,r4,ror#19 vshr.u32 q10,q8,#7 eor r0,r8,r8,ror#11 eor r2,r2,r6 vadd.i32 q1,q1,q9 add r7,r7,r12,ror#6 eor r12,r8,r9 vshr.u32 q9,q8,#3 eor r0,r0,r8,ror#20 add r7,r7,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#20] and r3,r3,r12 vshr.u32 q11,q8,#18 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 veor q9,q9,q10 add r6,r6,r2 vsli.32 q11,q8,#14 eor r2,r4,r5 eor r0,r11,r11,ror#5 vshr.u32 d24,d1,#17 add r7,r7,r3 and r2,r2,r11 veor q9,q9,q11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 vsli.32 d24,d1,#15 eor r2,r2,r5 add r6,r6,r3,ror#6 vshr.u32 d25,d1,#10 eor r3,r7,r8 eor r0,r0,r7,ror#20 vadd.i32 q1,q1,q9 add r6,r6,r2 ldr r2,[sp,#24] veor d25,d25,d24 and r12,r12,r3 add r10,r10,r6 vshr.u32 d24,d1,#19 add r6,r6,r0,ror#2 eor r12,r12,r8 vsli.32 d24,d1,#13 add r5,r5,r2 eor r2,r11,r4 veor d25,d25,d24 eor r0,r10,r10,ror#5 add r6,r6,r12 vadd.i32 d2,d2,d25 and r2,r2,r10 eor r12,r0,r10,ror#19 vshr.u32 d24,d2,#17 eor r0,r6,r6,ror#11 eor r2,r2,r4 vsli.32 d24,d2,#15 add r5,r5,r12,ror#6 eor r12,r6,r7 vshr.u32 d25,d2,#10 eor r0,r0,r6,ror#20 add r5,r5,r2 veor d25,d25,d24 ldr r2,[sp,#28] and r3,r3,r12 vshr.u32 d24,d2,#19 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 vld1.32 {q8},[r14,:128]! add r4,r4,r2 vsli.32 d24,d2,#13 eor r2,r10,r11 eor r0,r9,r9,ror#5 veor d25,d25,d24 add r5,r5,r3 and r2,r2,r9 vadd.i32 d3,d3,d25 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 vadd.i32 q8,q8,q1 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#32] and r12,r12,r3 add r8,r8,r4 vst1.32 {q8},[r1,:128]! add r4,r4,r0,ror#2 eor r12,r12,r6 vext.8 q8,q2,q3,#4 add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 vext.8 q9,q0,q1,#4 add r4,r4,r12 and r2,r2,r8 eor r12,r0,r8,ror#19 vshr.u32 q10,q8,#7 eor r0,r4,r4,ror#11 eor r2,r2,r10 vadd.i32 q2,q2,q9 add r11,r11,r12,ror#6 eor r12,r4,r5 vshr.u32 q9,q8,#3 eor r0,r0,r4,ror#20 add r11,r11,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#36] and r3,r3,r12 vshr.u32 q11,q8,#18 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 veor q9,q9,q10 add r10,r10,r2 vsli.32 q11,q8,#14 eor r2,r8,r9 eor r0,r7,r7,ror#5 vshr.u32 d24,d3,#17 add r11,r11,r3 and r2,r2,r7 veor q9,q9,q11 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 vsli.32 d24,d3,#15 eor r2,r2,r9 add r10,r10,r3,ror#6 vshr.u32 d25,d3,#10 eor r3,r11,r4 eor r0,r0,r11,ror#20 vadd.i32 q2,q2,q9 add r10,r10,r2 ldr r2,[sp,#40] veor d25,d25,d24 and r12,r12,r3 add r6,r6,r10 vshr.u32 d24,d3,#19 add r10,r10,r0,ror#2 eor r12,r12,r4 vsli.32 d24,d3,#13 add r9,r9,r2 eor r2,r7,r8 veor d25,d25,d24 eor r0,r6,r6,ror#5 add r10,r10,r12 vadd.i32 d4,d4,d25 and r2,r2,r6 eor r12,r0,r6,ror#19 vshr.u32 d24,d4,#17 eor r0,r10,r10,ror#11 eor r2,r2,r8 vsli.32 d24,d4,#15 add r9,r9,r12,ror#6 eor r12,r10,r11 vshr.u32 d25,d4,#10 eor r0,r0,r10,ror#20 add r9,r9,r2 veor d25,d25,d24 ldr r2,[sp,#44] and r3,r3,r12 vshr.u32 d24,d4,#19 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 vld1.32 {q8},[r14,:128]! add r8,r8,r2 vsli.32 d24,d4,#13 eor r2,r6,r7 eor r0,r5,r5,ror#5 veor d25,d25,d24 add r9,r9,r3 and r2,r2,r5 vadd.i32 d5,d5,d25 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 vadd.i32 q8,q8,q2 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#48] and r12,r12,r3 add r4,r4,r8 vst1.32 {q8},[r1,:128]! add r8,r8,r0,ror#2 eor r12,r12,r10 vext.8 q8,q3,q0,#4 add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 vext.8 q9,q1,q2,#4 add r8,r8,r12 and r2,r2,r4 eor r12,r0,r4,ror#19 vshr.u32 q10,q8,#7 eor r0,r8,r8,ror#11 eor r2,r2,r6 vadd.i32 q3,q3,q9 add r7,r7,r12,ror#6 eor r12,r8,r9 vshr.u32 q9,q8,#3 eor r0,r0,r8,ror#20 add r7,r7,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#52] and r3,r3,r12 vshr.u32 q11,q8,#18 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 veor q9,q9,q10 add r6,r6,r2 vsli.32 q11,q8,#14 eor r2,r4,r5 eor r0,r11,r11,ror#5 vshr.u32 d24,d5,#17 add r7,r7,r3 and r2,r2,r11 veor q9,q9,q11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 vsli.32 d24,d5,#15 eor r2,r2,r5 add r6,r6,r3,ror#6 vshr.u32 d25,d5,#10 eor r3,r7,r8 eor r0,r0,r7,ror#20 vadd.i32 q3,q3,q9 add r6,r6,r2 ldr r2,[sp,#56] veor d25,d25,d24 and r12,r12,r3 add r10,r10,r6 vshr.u32 d24,d5,#19 add r6,r6,r0,ror#2 eor r12,r12,r8 vsli.32 d24,d5,#13 add r5,r5,r2 eor r2,r11,r4 veor d25,d25,d24 eor r0,r10,r10,ror#5 add r6,r6,r12 vadd.i32 d6,d6,d25 and r2,r2,r10 eor r12,r0,r10,ror#19 vshr.u32 d24,d6,#17 eor r0,r6,r6,ror#11 eor r2,r2,r4 vsli.32 d24,d6,#15 add r5,r5,r12,ror#6 eor r12,r6,r7 vshr.u32 d25,d6,#10 eor r0,r0,r6,ror#20 add r5,r5,r2 veor d25,d25,d24 ldr r2,[sp,#60] and r3,r3,r12 vshr.u32 d24,d6,#19 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 vld1.32 {q8},[r14,:128]! add r4,r4,r2 vsli.32 d24,d6,#13 eor r2,r10,r11 eor r0,r9,r9,ror#5 veor d25,d25,d24 add r5,r5,r3 and r2,r2,r9 vadd.i32 d7,d7,d25 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 vadd.i32 q8,q8,q3 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[r14] and r12,r12,r3 add r8,r8,r4 vst1.32 {q8},[r1,:128]! add r4,r4,r0,ror#2 eor r12,r12,r6 teq r2,#0 @ check for K256 terminator ldr r2,[sp,#0] sub r1,r1,#64 bne L_00_48 ldr r1,[sp,#68] ldr r0,[sp,#72] sub r14,r14,#256 @ rewind r14 teq r1,r0 it eq subeq r1,r1,#64 @ avoid SEGV vld1.8 {q0},[r1]! @ load next input block vld1.8 {q1},[r1]! vld1.8 {q2},[r1]! vld1.8 {q3},[r1]! it ne strne r1,[sp,#68] mov r1,sp add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 add r4,r4,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r8 eor r12,r0,r8,ror#19 eor r0,r4,r4,ror#11 eor r2,r2,r10 vrev32.8 q0,q0 add r11,r11,r12,ror#6 eor r12,r4,r5 eor r0,r0,r4,ror#20 add r11,r11,r2 vadd.i32 q8,q8,q0 ldr r2,[sp,#4] and r3,r3,r12 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 add r10,r10,r2 eor r2,r8,r9 eor r0,r7,r7,ror#5 add r11,r11,r3 and r2,r2,r7 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 eor r2,r2,r9 add r10,r10,r3,ror#6 eor r3,r11,r4 eor r0,r0,r11,ror#20 add r10,r10,r2 ldr r2,[sp,#8] and r12,r12,r3 add r6,r6,r10 add r10,r10,r0,ror#2 eor r12,r12,r4 add r9,r9,r2 eor r2,r7,r8 eor r0,r6,r6,ror#5 add r10,r10,r12 and r2,r2,r6 eor r12,r0,r6,ror#19 eor r0,r10,r10,ror#11 eor r2,r2,r8 add r9,r9,r12,ror#6 eor r12,r10,r11 eor r0,r0,r10,ror#20 add r9,r9,r2 ldr r2,[sp,#12] and r3,r3,r12 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 add r8,r8,r2 eor r2,r6,r7 eor r0,r5,r5,ror#5 add r9,r9,r3 and r2,r2,r5 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#16] and r12,r12,r3 add r4,r4,r8 add r8,r8,r0,ror#2 eor r12,r12,r10 vst1.32 {q8},[r1,:128]! add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 add r8,r8,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r4 eor r12,r0,r4,ror#19 eor r0,r8,r8,ror#11 eor r2,r2,r6 vrev32.8 q1,q1 add r7,r7,r12,ror#6 eor r12,r8,r9 eor r0,r0,r8,ror#20 add r7,r7,r2 vadd.i32 q8,q8,q1 ldr r2,[sp,#20] and r3,r3,r12 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 add r6,r6,r2 eor r2,r4,r5 eor r0,r11,r11,ror#5 add r7,r7,r3 and r2,r2,r11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 eor r2,r2,r5 add r6,r6,r3,ror#6 eor r3,r7,r8 eor r0,r0,r7,ror#20 add r6,r6,r2 ldr r2,[sp,#24] and r12,r12,r3 add r10,r10,r6 add r6,r6,r0,ror#2 eor r12,r12,r8 add r5,r5,r2 eor r2,r11,r4 eor r0,r10,r10,ror#5 add r6,r6,r12 and r2,r2,r10 eor r12,r0,r10,ror#19 eor r0,r6,r6,ror#11 eor r2,r2,r4 add r5,r5,r12,ror#6 eor r12,r6,r7 eor r0,r0,r6,ror#20 add r5,r5,r2 ldr r2,[sp,#28] and r3,r3,r12 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 add r4,r4,r2 eor r2,r10,r11 eor r0,r9,r9,ror#5 add r5,r5,r3 and r2,r2,r9 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#32] and r12,r12,r3 add r8,r8,r4 add r4,r4,r0,ror#2 eor r12,r12,r6 vst1.32 {q8},[r1,:128]! add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 add r4,r4,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r8 eor r12,r0,r8,ror#19 eor r0,r4,r4,ror#11 eor r2,r2,r10 vrev32.8 q2,q2 add r11,r11,r12,ror#6 eor r12,r4,r5 eor r0,r0,r4,ror#20 add r11,r11,r2 vadd.i32 q8,q8,q2 ldr r2,[sp,#36] and r3,r3,r12 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 add r10,r10,r2 eor r2,r8,r9 eor r0,r7,r7,ror#5 add r11,r11,r3 and r2,r2,r7 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 eor r2,r2,r9 add r10,r10,r3,ror#6 eor r3,r11,r4 eor r0,r0,r11,ror#20 add r10,r10,r2 ldr r2,[sp,#40] and r12,r12,r3 add r6,r6,r10 add r10,r10,r0,ror#2 eor r12,r12,r4 add r9,r9,r2 eor r2,r7,r8 eor r0,r6,r6,ror#5 add r10,r10,r12 and r2,r2,r6 eor r12,r0,r6,ror#19 eor r0,r10,r10,ror#11 eor r2,r2,r8 add r9,r9,r12,ror#6 eor r12,r10,r11 eor r0,r0,r10,ror#20 add r9,r9,r2 ldr r2,[sp,#44] and r3,r3,r12 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 add r8,r8,r2 eor r2,r6,r7 eor r0,r5,r5,ror#5 add r9,r9,r3 and r2,r2,r5 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#48] and r12,r12,r3 add r4,r4,r8 add r8,r8,r0,ror#2 eor r12,r12,r10 vst1.32 {q8},[r1,:128]! add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 add r8,r8,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r4 eor r12,r0,r4,ror#19 eor r0,r8,r8,ror#11 eor r2,r2,r6 vrev32.8 q3,q3 add r7,r7,r12,ror#6 eor r12,r8,r9 eor r0,r0,r8,ror#20 add r7,r7,r2 vadd.i32 q8,q8,q3 ldr r2,[sp,#52] and r3,r3,r12 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 add r6,r6,r2 eor r2,r4,r5 eor r0,r11,r11,ror#5 add r7,r7,r3 and r2,r2,r11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 eor r2,r2,r5 add r6,r6,r3,ror#6 eor r3,r7,r8 eor r0,r0,r7,ror#20 add r6,r6,r2 ldr r2,[sp,#56] and r12,r12,r3 add r10,r10,r6 add r6,r6,r0,ror#2 eor r12,r12,r8 add r5,r5,r2 eor r2,r11,r4 eor r0,r10,r10,ror#5 add r6,r6,r12 and r2,r2,r10 eor r12,r0,r10,ror#19 eor r0,r6,r6,ror#11 eor r2,r2,r4 add r5,r5,r12,ror#6 eor r12,r6,r7 eor r0,r0,r6,ror#20 add r5,r5,r2 ldr r2,[sp,#60] and r3,r3,r12 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 add r4,r4,r2 eor r2,r10,r11 eor r0,r9,r9,ror#5 add r5,r5,r3 and r2,r2,r9 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#64] and r12,r12,r3 add r8,r8,r4 add r4,r4,r0,ror#2 eor r12,r12,r6 vst1.32 {q8},[r1,:128]! ldr r0,[r2,#0] add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldr r12,[r2,#4] ldr r3,[r2,#8] ldr r1,[r2,#12] add r4,r4,r0 @ accumulate ldr r0,[r2,#16] add r5,r5,r12 ldr r12,[r2,#20] add r6,r6,r3 ldr r3,[r2,#24] add r7,r7,r1 ldr r1,[r2,#28] add r8,r8,r0 str r4,[r2],#4 add r9,r9,r12 str r5,[r2],#4 add r10,r10,r3 str r6,[r2],#4 add r11,r11,r1 str r7,[r2],#4 stmia r2,{r8,r9,r10,r11} ittte ne movne r1,sp ldrne r2,[sp,#0] eorne r12,r12,r12 ldreq sp,[sp,#76] @ restore original sp itt ne eorne r3,r5,r6 bne L_00_48 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) # if defined(__thumb2__) # define INST(a,b,c,d) .byte c,d|0xc,a,b # else # define INST(a,b,c,d) .byte a,b,c,d # endif #ifdef __thumb2__ .thumb_func sha256_block_data_order_armv8 #endif .align 5 sha256_block_data_order_armv8: LARMv8: vld1.32 {q0,q1},[r0] sub r3,r3,#256+32 add r2,r1,r2,lsl#6 @ len to point at the end of inp b Loop_v8 .align 4 Loop_v8: vld1.8 {q8,q9},[r1]! vld1.8 {q10,q11},[r1]! vld1.32 {q12},[r3]! vrev32.8 q8,q8 vrev32.8 q9,q9 vrev32.8 q10,q10 vrev32.8 q11,q11 vmov q14,q0 @ offload vmov q15,q1 teq r1,r2 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 vld1.32 {q13},[r3] vadd.i32 q12,q12,q10 sub r3,r3,#256-16 @ rewind vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 vadd.i32 q13,q13,q11 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 vadd.i32 q0,q0,q14 vadd.i32 q1,q1,q15 it ne bne Loop_v8 vst1.32 {q0,q1},[r0] bx lr @ bx lr #endif .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm _GFp_armcap_P,4 .non_lazy_symbol_pointer GFp_armcap_P: .indirect_symbol _GFp_armcap_P .long 0 .private_extern _GFp_armcap_P #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha256-armv4-linux32.S000064400000000000000000001755041353224261200171020ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Permission to use under GPL terms is granted. @ ==================================================================== @ SHA256 block procedure for ARMv4. May 2007. @ Performance is ~2x better than gcc 3.4 generated code and in "abso- @ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per @ byte [on single-issue Xscale PXA250 core]. @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 22% improvement on @ Cortex A8 core and ~20 cycles per processed byte. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 16% @ improvement on Cortex A8 core and ~15.4 cycles per processed byte. @ September 2013. @ @ Add NEON implementation. On Cortex A8 it was measured to process one @ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon @ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only @ code (meaning that latter performs sub-optimally, nothing was done @ about it). @ May 2014. @ @ Add ARMv8 code path performing at 2.0 cpb on Apple A7. #ifndef __KERNEL__ # include #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those @ instructions are manually-encoded. (See unsha256.) .arch armv7-a .text #if defined(__thumb2__) .syntax unified .thumb #else .code 32 #endif .type K256,%object .align 5 K256: .word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .size K256,.-K256 .word 0 @ terminator #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .LOPENSSL_armcap: .word GFp_armcap_P-.Lsha256_block_data_order #endif .align 5 .globl GFp_sha256_block_data_order .hidden GFp_sha256_block_data_order .type GFp_sha256_block_data_order,%function GFp_sha256_block_data_order: .Lsha256_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ GFp_sha256_block_data_order #else adr r3,.Lsha256_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,.LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV8_SHA256 bne .LARMv8 tst r12,#ARMV7_NEON bne .LNEON #endif add r2,r1,r2,lsl#6 @ len to point at the end of inp stmdb sp!,{r0,r1,r2,r4-r11,lr} ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} sub r14,r3,#256+32 @ K256 sub sp,sp,#16*4 @ alloca(X[16]) .Loop: # if __ARM_ARCH__>=7 ldr r2,[r1],#4 # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ magic eor r12,r12,r12 #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 0 # if 0==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 add r4,r4,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r8,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 0 add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 0==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r8,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#0*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 0==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 0<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#2*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#15*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 1 # if 1==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 add r11,r11,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r7,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 1 add r11,r11,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 1==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r7,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#1*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 1==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 1<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#3*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#0*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 2 # if 2==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 add r10,r10,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r6,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 2 add r10,r10,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 2==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r6,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#2*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 2==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 2<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#4*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#1*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 3 # if 3==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 add r9,r9,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r5,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 3 add r9,r9,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 3==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r5,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#3*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 3==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 3<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#5*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#2*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 4 # if 4==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 add r8,r8,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r4,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 4 add r8,r8,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 4==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r4,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#4*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 4==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 4<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#6*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#3*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 5 # if 5==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r11,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 5==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r11,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#5*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 5==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 5<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#7*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#4*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 6 # if 6==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 add r6,r6,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r10,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 6 add r6,r6,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 6==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r10,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#6*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 6==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 6<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#8*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#5*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 7 # if 7==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 add r5,r5,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r9,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 7==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r9,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#7*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 7==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 7<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#9*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#6*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 8 # if 8==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 add r4,r4,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r8,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 8 add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 8==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r8,r8,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r8,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#8*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 8==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 8<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#10*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#7*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 9 # if 9==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 add r11,r11,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r7,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 9 add r11,r11,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 9==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r7,r7,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r7,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#9*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 9==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 9<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#11*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#8*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 10 # if 10==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 add r10,r10,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r6,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 10 add r10,r10,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 10==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r6,r6,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r6,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#10*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 10==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 10<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#12*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#9*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 11 # if 11==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 add r9,r9,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r5,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 11 add r9,r9,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 11==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r5,r5,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r5,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#11*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 11==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 11<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#13*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#10*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 12 # if 12==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 add r8,r8,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r4,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 12 add r8,r8,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 12==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r4,r4,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r4,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#12*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 12==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 12<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#14*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#11*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 13 # if 13==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 add r7,r7,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r11,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 13 add r7,r7,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 13==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r11,r11,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r11,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#13*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 13==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 13<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#15*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#12*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 14 # if 14==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 add r6,r6,r12 @ h+=Maj(a,b,c) from the past eor r0,r0,r10,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 14 add r6,r6,r12 @ h+=Maj(a,b,c) from the past ldrb r12,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r12,lsl#8 ldrb r12,[r1],#4 orr r2,r2,r0,lsl#16 # if 14==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r10,r10,ror#5 orr r2,r2,r12,lsl#24 eor r0,r0,r10,ror#19 @ Sigma1(e) #endif ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#14*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 14==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 14<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#0*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#13*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 @ ldr r2,[r1],#4 @ 15 # if 15==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 add r5,r5,r3 @ h+=Maj(a,b,c) from the past eor r0,r0,r9,ror#19 @ Sigma1(e) # ifndef __ARMEB__ rev r2,r2 # endif #else @ ldrb r2,[r1,#3] @ 15 add r5,r5,r3 @ h+=Maj(a,b,c) from the past ldrb r3,[r1,#2] ldrb r0,[r1,#1] orr r2,r2,r3,lsl#8 ldrb r3,[r1],#4 orr r2,r2,r0,lsl#16 # if 15==15 str r1,[sp,#17*4] @ make room for r1 # endif eor r0,r9,r9,ror#5 orr r2,r2,r3,lsl#24 eor r0,r0,r9,ror#19 @ Sigma1(e) #endif ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#15*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 15==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 15<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#1*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#14*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) .Lrounds_16_xx: @ ldr r2,[sp,#1*4] @ 16 @ ldr r1,[sp,#14*4] mov r0,r2,ror#7 add r4,r4,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#0*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#9*4] add r12,r12,r0 eor r0,r8,r8,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r8,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#0*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 16==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 16<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#2*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#15*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#2*4] @ 17 @ ldr r1,[sp,#15*4] mov r0,r2,ror#7 add r11,r11,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#1*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#10*4] add r3,r3,r0 eor r0,r7,r7,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r7,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#1*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 17==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 17<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#3*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#0*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#3*4] @ 18 @ ldr r1,[sp,#0*4] mov r0,r2,ror#7 add r10,r10,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#2*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#11*4] add r12,r12,r0 eor r0,r6,r6,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r6,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#2*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 18==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 18<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#4*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#1*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#4*4] @ 19 @ ldr r1,[sp,#1*4] mov r0,r2,ror#7 add r9,r9,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#3*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#12*4] add r3,r3,r0 eor r0,r5,r5,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r5,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#3*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 19==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 19<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#5*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#2*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#5*4] @ 20 @ ldr r1,[sp,#2*4] mov r0,r2,ror#7 add r8,r8,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#4*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#13*4] add r12,r12,r0 eor r0,r4,r4,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r4,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#4*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 20==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 20<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#6*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#3*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#6*4] @ 21 @ ldr r1,[sp,#3*4] mov r0,r2,ror#7 add r7,r7,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#5*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#14*4] add r3,r3,r0 eor r0,r11,r11,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r11,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#5*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 21==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 21<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#7*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#4*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#7*4] @ 22 @ ldr r1,[sp,#4*4] mov r0,r2,ror#7 add r6,r6,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#6*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#15*4] add r12,r12,r0 eor r0,r10,r10,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r10,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#6*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 22==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 22<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#8*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#5*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#8*4] @ 23 @ ldr r1,[sp,#5*4] mov r0,r2,ror#7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#7*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#0*4] add r3,r3,r0 eor r0,r9,r9,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r9,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#7*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 23==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 23<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#9*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#6*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#9*4] @ 24 @ ldr r1,[sp,#6*4] mov r0,r2,ror#7 add r4,r4,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#8*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#1*4] add r12,r12,r0 eor r0,r8,r8,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r8,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r11,r11,r2 @ h+=X[i] str r2,[sp,#8*4] eor r2,r9,r10 add r11,r11,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r8 add r11,r11,r12 @ h+=K256[i] eor r2,r2,r10 @ Ch(e,f,g) eor r0,r4,r4,ror#11 add r11,r11,r2 @ h+=Ch(e,f,g) #if 24==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 24<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r4,r5 @ a^b, b^c in next round #else ldr r2,[sp,#10*4] @ from future BODY_16_xx eor r12,r4,r5 @ a^b, b^c in next round ldr r1,[sp,#7*4] @ from future BODY_16_xx #endif eor r0,r0,r4,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r7,r7,r11 @ d+=h eor r3,r3,r5 @ Maj(a,b,c) add r11,r11,r0,ror#2 @ h+=Sigma0(a) @ add r11,r11,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#10*4] @ 25 @ ldr r1,[sp,#7*4] mov r0,r2,ror#7 add r11,r11,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#9*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#2*4] add r3,r3,r0 eor r0,r7,r7,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r7,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r10,r10,r2 @ h+=X[i] str r2,[sp,#9*4] eor r2,r8,r9 add r10,r10,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r7 add r10,r10,r3 @ h+=K256[i] eor r2,r2,r9 @ Ch(e,f,g) eor r0,r11,r11,ror#11 add r10,r10,r2 @ h+=Ch(e,f,g) #if 25==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 25<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r11,r4 @ a^b, b^c in next round #else ldr r2,[sp,#11*4] @ from future BODY_16_xx eor r3,r11,r4 @ a^b, b^c in next round ldr r1,[sp,#8*4] @ from future BODY_16_xx #endif eor r0,r0,r11,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r6,r6,r10 @ d+=h eor r12,r12,r4 @ Maj(a,b,c) add r10,r10,r0,ror#2 @ h+=Sigma0(a) @ add r10,r10,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#11*4] @ 26 @ ldr r1,[sp,#8*4] mov r0,r2,ror#7 add r10,r10,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#10*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#3*4] add r12,r12,r0 eor r0,r6,r6,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r6,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r9,r9,r2 @ h+=X[i] str r2,[sp,#10*4] eor r2,r7,r8 add r9,r9,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r6 add r9,r9,r12 @ h+=K256[i] eor r2,r2,r8 @ Ch(e,f,g) eor r0,r10,r10,ror#11 add r9,r9,r2 @ h+=Ch(e,f,g) #if 26==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 26<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r10,r11 @ a^b, b^c in next round #else ldr r2,[sp,#12*4] @ from future BODY_16_xx eor r12,r10,r11 @ a^b, b^c in next round ldr r1,[sp,#9*4] @ from future BODY_16_xx #endif eor r0,r0,r10,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r5,r5,r9 @ d+=h eor r3,r3,r11 @ Maj(a,b,c) add r9,r9,r0,ror#2 @ h+=Sigma0(a) @ add r9,r9,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#12*4] @ 27 @ ldr r1,[sp,#9*4] mov r0,r2,ror#7 add r9,r9,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#11*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#4*4] add r3,r3,r0 eor r0,r5,r5,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r5,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r8,r8,r2 @ h+=X[i] str r2,[sp,#11*4] eor r2,r6,r7 add r8,r8,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r5 add r8,r8,r3 @ h+=K256[i] eor r2,r2,r7 @ Ch(e,f,g) eor r0,r9,r9,ror#11 add r8,r8,r2 @ h+=Ch(e,f,g) #if 27==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 27<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r9,r10 @ a^b, b^c in next round #else ldr r2,[sp,#13*4] @ from future BODY_16_xx eor r3,r9,r10 @ a^b, b^c in next round ldr r1,[sp,#10*4] @ from future BODY_16_xx #endif eor r0,r0,r9,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r4,r4,r8 @ d+=h eor r12,r12,r10 @ Maj(a,b,c) add r8,r8,r0,ror#2 @ h+=Sigma0(a) @ add r8,r8,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#13*4] @ 28 @ ldr r1,[sp,#10*4] mov r0,r2,ror#7 add r8,r8,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#12*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#5*4] add r12,r12,r0 eor r0,r4,r4,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r4,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r7,r7,r2 @ h+=X[i] str r2,[sp,#12*4] eor r2,r5,r6 add r7,r7,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r4 add r7,r7,r12 @ h+=K256[i] eor r2,r2,r6 @ Ch(e,f,g) eor r0,r8,r8,ror#11 add r7,r7,r2 @ h+=Ch(e,f,g) #if 28==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 28<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r8,r9 @ a^b, b^c in next round #else ldr r2,[sp,#14*4] @ from future BODY_16_xx eor r12,r8,r9 @ a^b, b^c in next round ldr r1,[sp,#11*4] @ from future BODY_16_xx #endif eor r0,r0,r8,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r11,r11,r7 @ d+=h eor r3,r3,r9 @ Maj(a,b,c) add r7,r7,r0,ror#2 @ h+=Sigma0(a) @ add r7,r7,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#14*4] @ 29 @ ldr r1,[sp,#11*4] mov r0,r2,ror#7 add r7,r7,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#13*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#6*4] add r3,r3,r0 eor r0,r11,r11,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r11,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r6,r6,r2 @ h+=X[i] str r2,[sp,#13*4] eor r2,r4,r5 add r6,r6,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r11 add r6,r6,r3 @ h+=K256[i] eor r2,r2,r5 @ Ch(e,f,g) eor r0,r7,r7,ror#11 add r6,r6,r2 @ h+=Ch(e,f,g) #if 29==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 29<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r7,r8 @ a^b, b^c in next round #else ldr r2,[sp,#15*4] @ from future BODY_16_xx eor r3,r7,r8 @ a^b, b^c in next round ldr r1,[sp,#12*4] @ from future BODY_16_xx #endif eor r0,r0,r7,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r10,r10,r6 @ d+=h eor r12,r12,r8 @ Maj(a,b,c) add r6,r6,r0,ror#2 @ h+=Sigma0(a) @ add r6,r6,r12 @ h+=Maj(a,b,c) @ ldr r2,[sp,#15*4] @ 30 @ ldr r1,[sp,#12*4] mov r0,r2,ror#7 add r6,r6,r12 @ h+=Maj(a,b,c) from the past mov r12,r1,ror#17 eor r0,r0,r2,ror#18 eor r12,r12,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#14*4] eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#7*4] add r12,r12,r0 eor r0,r10,r10,ror#5 @ from BODY_00_15 add r2,r2,r12 eor r0,r0,r10,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r12,[r14],#4 @ *K256++ add r5,r5,r2 @ h+=X[i] str r2,[sp,#14*4] eor r2,r11,r4 add r5,r5,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r10 add r5,r5,r12 @ h+=K256[i] eor r2,r2,r4 @ Ch(e,f,g) eor r0,r6,r6,ror#11 add r5,r5,r2 @ h+=Ch(e,f,g) #if 30==31 and r12,r12,#0xff cmp r12,#0xf2 @ done? #endif #if 30<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r12,r6,r7 @ a^b, b^c in next round #else ldr r2,[sp,#0*4] @ from future BODY_16_xx eor r12,r6,r7 @ a^b, b^c in next round ldr r1,[sp,#13*4] @ from future BODY_16_xx #endif eor r0,r0,r6,ror#20 @ Sigma0(a) and r3,r3,r12 @ (b^c)&=(a^b) add r9,r9,r5 @ d+=h eor r3,r3,r7 @ Maj(a,b,c) add r5,r5,r0,ror#2 @ h+=Sigma0(a) @ add r5,r5,r3 @ h+=Maj(a,b,c) @ ldr r2,[sp,#0*4] @ 31 @ ldr r1,[sp,#13*4] mov r0,r2,ror#7 add r5,r5,r3 @ h+=Maj(a,b,c) from the past mov r3,r1,ror#17 eor r0,r0,r2,ror#18 eor r3,r3,r1,ror#19 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) ldr r2,[sp,#15*4] eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) ldr r1,[sp,#8*4] add r3,r3,r0 eor r0,r9,r9,ror#5 @ from BODY_00_15 add r2,r2,r3 eor r0,r0,r9,ror#19 @ Sigma1(e) add r2,r2,r1 @ X[i] ldr r3,[r14],#4 @ *K256++ add r4,r4,r2 @ h+=X[i] str r2,[sp,#15*4] eor r2,r10,r11 add r4,r4,r0,ror#6 @ h+=Sigma1(e) and r2,r2,r9 add r4,r4,r3 @ h+=K256[i] eor r2,r2,r11 @ Ch(e,f,g) eor r0,r5,r5,ror#11 add r4,r4,r2 @ h+=Ch(e,f,g) #if 31==31 and r3,r3,#0xff cmp r3,#0xf2 @ done? #endif #if 31<15 # if __ARM_ARCH__>=7 ldr r2,[r1],#4 @ prefetch # else ldrb r2,[r1,#3] # endif eor r3,r5,r6 @ a^b, b^c in next round #else ldr r2,[sp,#1*4] @ from future BODY_16_xx eor r3,r5,r6 @ a^b, b^c in next round ldr r1,[sp,#14*4] @ from future BODY_16_xx #endif eor r0,r0,r5,ror#20 @ Sigma0(a) and r12,r12,r3 @ (b^c)&=(a^b) add r8,r8,r4 @ d+=h eor r12,r12,r6 @ Maj(a,b,c) add r4,r4,r0,ror#2 @ h+=Sigma0(a) @ add r4,r4,r12 @ h+=Maj(a,b,c) #if __ARM_ARCH__>=7 ite eq @ Thumb2 thing, sanity check in ARM #endif ldreq r3,[sp,#16*4] @ pull ctx bne .Lrounds_16_xx add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldr r0,[r3,#0] ldr r2,[r3,#4] ldr r12,[r3,#8] add r4,r4,r0 ldr r0,[r3,#12] add r5,r5,r2 ldr r2,[r3,#16] add r6,r6,r12 ldr r12,[r3,#20] add r7,r7,r0 ldr r0,[r3,#24] add r8,r8,r2 ldr r2,[r3,#28] add r9,r9,r12 ldr r1,[sp,#17*4] @ pull inp ldr r12,[sp,#18*4] @ pull inp+len add r10,r10,r0 add r11,r11,r2 stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} cmp r1,r12 sub r14,r14,#256 @ rewind Ktbl bne .Loop add sp,sp,#19*4 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type sha256_block_data_order_neon,%function .align 5 .skip 16 sha256_block_data_order_neon: .LNEON: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} sub r11,sp,#16*4+16 adr r14,K256 bic r11,r11,#15 @ align for 128-bit stores mov r12,sp mov sp,r11 @ alloca add r2,r1,r2,lsl#6 @ len to point at the end of inp vld1.8 {q0},[r1]! vld1.8 {q1},[r1]! vld1.8 {q2},[r1]! vld1.8 {q3},[r1]! vld1.32 {q8},[r14,:128]! vld1.32 {q9},[r14,:128]! vld1.32 {q10},[r14,:128]! vld1.32 {q11},[r14,:128]! vrev32.8 q0,q0 @ yes, even on str r0,[sp,#64] vrev32.8 q1,q1 @ big-endian str r1,[sp,#68] mov r1,sp vrev32.8 q2,q2 str r2,[sp,#72] vrev32.8 q3,q3 str r12,[sp,#76] @ save original sp vadd.i32 q8,q8,q0 vadd.i32 q9,q9,q1 vst1.32 {q8},[r1,:128]! vadd.i32 q10,q10,q2 vst1.32 {q9},[r1,:128]! vadd.i32 q11,q11,q3 vst1.32 {q10},[r1,:128]! vst1.32 {q11},[r1,:128]! ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} sub r1,r1,#64 ldr r2,[sp,#0] eor r12,r12,r12 eor r3,r5,r6 b .L_00_48 .align 4 .L_00_48: vext.8 q8,q0,q1,#4 add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 vext.8 q9,q2,q3,#4 add r4,r4,r12 and r2,r2,r8 eor r12,r0,r8,ror#19 vshr.u32 q10,q8,#7 eor r0,r4,r4,ror#11 eor r2,r2,r10 vadd.i32 q0,q0,q9 add r11,r11,r12,ror#6 eor r12,r4,r5 vshr.u32 q9,q8,#3 eor r0,r0,r4,ror#20 add r11,r11,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#4] and r3,r3,r12 vshr.u32 q11,q8,#18 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 veor q9,q9,q10 add r10,r10,r2 vsli.32 q11,q8,#14 eor r2,r8,r9 eor r0,r7,r7,ror#5 vshr.u32 d24,d7,#17 add r11,r11,r3 and r2,r2,r7 veor q9,q9,q11 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 vsli.32 d24,d7,#15 eor r2,r2,r9 add r10,r10,r3,ror#6 vshr.u32 d25,d7,#10 eor r3,r11,r4 eor r0,r0,r11,ror#20 vadd.i32 q0,q0,q9 add r10,r10,r2 ldr r2,[sp,#8] veor d25,d25,d24 and r12,r12,r3 add r6,r6,r10 vshr.u32 d24,d7,#19 add r10,r10,r0,ror#2 eor r12,r12,r4 vsli.32 d24,d7,#13 add r9,r9,r2 eor r2,r7,r8 veor d25,d25,d24 eor r0,r6,r6,ror#5 add r10,r10,r12 vadd.i32 d0,d0,d25 and r2,r2,r6 eor r12,r0,r6,ror#19 vshr.u32 d24,d0,#17 eor r0,r10,r10,ror#11 eor r2,r2,r8 vsli.32 d24,d0,#15 add r9,r9,r12,ror#6 eor r12,r10,r11 vshr.u32 d25,d0,#10 eor r0,r0,r10,ror#20 add r9,r9,r2 veor d25,d25,d24 ldr r2,[sp,#12] and r3,r3,r12 vshr.u32 d24,d0,#19 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 vld1.32 {q8},[r14,:128]! add r8,r8,r2 vsli.32 d24,d0,#13 eor r2,r6,r7 eor r0,r5,r5,ror#5 veor d25,d25,d24 add r9,r9,r3 and r2,r2,r5 vadd.i32 d1,d1,d25 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 vadd.i32 q8,q8,q0 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#16] and r12,r12,r3 add r4,r4,r8 vst1.32 {q8},[r1,:128]! add r8,r8,r0,ror#2 eor r12,r12,r10 vext.8 q8,q1,q2,#4 add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 vext.8 q9,q3,q0,#4 add r8,r8,r12 and r2,r2,r4 eor r12,r0,r4,ror#19 vshr.u32 q10,q8,#7 eor r0,r8,r8,ror#11 eor r2,r2,r6 vadd.i32 q1,q1,q9 add r7,r7,r12,ror#6 eor r12,r8,r9 vshr.u32 q9,q8,#3 eor r0,r0,r8,ror#20 add r7,r7,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#20] and r3,r3,r12 vshr.u32 q11,q8,#18 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 veor q9,q9,q10 add r6,r6,r2 vsli.32 q11,q8,#14 eor r2,r4,r5 eor r0,r11,r11,ror#5 vshr.u32 d24,d1,#17 add r7,r7,r3 and r2,r2,r11 veor q9,q9,q11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 vsli.32 d24,d1,#15 eor r2,r2,r5 add r6,r6,r3,ror#6 vshr.u32 d25,d1,#10 eor r3,r7,r8 eor r0,r0,r7,ror#20 vadd.i32 q1,q1,q9 add r6,r6,r2 ldr r2,[sp,#24] veor d25,d25,d24 and r12,r12,r3 add r10,r10,r6 vshr.u32 d24,d1,#19 add r6,r6,r0,ror#2 eor r12,r12,r8 vsli.32 d24,d1,#13 add r5,r5,r2 eor r2,r11,r4 veor d25,d25,d24 eor r0,r10,r10,ror#5 add r6,r6,r12 vadd.i32 d2,d2,d25 and r2,r2,r10 eor r12,r0,r10,ror#19 vshr.u32 d24,d2,#17 eor r0,r6,r6,ror#11 eor r2,r2,r4 vsli.32 d24,d2,#15 add r5,r5,r12,ror#6 eor r12,r6,r7 vshr.u32 d25,d2,#10 eor r0,r0,r6,ror#20 add r5,r5,r2 veor d25,d25,d24 ldr r2,[sp,#28] and r3,r3,r12 vshr.u32 d24,d2,#19 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 vld1.32 {q8},[r14,:128]! add r4,r4,r2 vsli.32 d24,d2,#13 eor r2,r10,r11 eor r0,r9,r9,ror#5 veor d25,d25,d24 add r5,r5,r3 and r2,r2,r9 vadd.i32 d3,d3,d25 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 vadd.i32 q8,q8,q1 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#32] and r12,r12,r3 add r8,r8,r4 vst1.32 {q8},[r1,:128]! add r4,r4,r0,ror#2 eor r12,r12,r6 vext.8 q8,q2,q3,#4 add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 vext.8 q9,q0,q1,#4 add r4,r4,r12 and r2,r2,r8 eor r12,r0,r8,ror#19 vshr.u32 q10,q8,#7 eor r0,r4,r4,ror#11 eor r2,r2,r10 vadd.i32 q2,q2,q9 add r11,r11,r12,ror#6 eor r12,r4,r5 vshr.u32 q9,q8,#3 eor r0,r0,r4,ror#20 add r11,r11,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#36] and r3,r3,r12 vshr.u32 q11,q8,#18 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 veor q9,q9,q10 add r10,r10,r2 vsli.32 q11,q8,#14 eor r2,r8,r9 eor r0,r7,r7,ror#5 vshr.u32 d24,d3,#17 add r11,r11,r3 and r2,r2,r7 veor q9,q9,q11 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 vsli.32 d24,d3,#15 eor r2,r2,r9 add r10,r10,r3,ror#6 vshr.u32 d25,d3,#10 eor r3,r11,r4 eor r0,r0,r11,ror#20 vadd.i32 q2,q2,q9 add r10,r10,r2 ldr r2,[sp,#40] veor d25,d25,d24 and r12,r12,r3 add r6,r6,r10 vshr.u32 d24,d3,#19 add r10,r10,r0,ror#2 eor r12,r12,r4 vsli.32 d24,d3,#13 add r9,r9,r2 eor r2,r7,r8 veor d25,d25,d24 eor r0,r6,r6,ror#5 add r10,r10,r12 vadd.i32 d4,d4,d25 and r2,r2,r6 eor r12,r0,r6,ror#19 vshr.u32 d24,d4,#17 eor r0,r10,r10,ror#11 eor r2,r2,r8 vsli.32 d24,d4,#15 add r9,r9,r12,ror#6 eor r12,r10,r11 vshr.u32 d25,d4,#10 eor r0,r0,r10,ror#20 add r9,r9,r2 veor d25,d25,d24 ldr r2,[sp,#44] and r3,r3,r12 vshr.u32 d24,d4,#19 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 vld1.32 {q8},[r14,:128]! add r8,r8,r2 vsli.32 d24,d4,#13 eor r2,r6,r7 eor r0,r5,r5,ror#5 veor d25,d25,d24 add r9,r9,r3 and r2,r2,r5 vadd.i32 d5,d5,d25 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 vadd.i32 q8,q8,q2 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#48] and r12,r12,r3 add r4,r4,r8 vst1.32 {q8},[r1,:128]! add r8,r8,r0,ror#2 eor r12,r12,r10 vext.8 q8,q3,q0,#4 add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 vext.8 q9,q1,q2,#4 add r8,r8,r12 and r2,r2,r4 eor r12,r0,r4,ror#19 vshr.u32 q10,q8,#7 eor r0,r8,r8,ror#11 eor r2,r2,r6 vadd.i32 q3,q3,q9 add r7,r7,r12,ror#6 eor r12,r8,r9 vshr.u32 q9,q8,#3 eor r0,r0,r8,ror#20 add r7,r7,r2 vsli.32 q10,q8,#25 ldr r2,[sp,#52] and r3,r3,r12 vshr.u32 q11,q8,#18 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 veor q9,q9,q10 add r6,r6,r2 vsli.32 q11,q8,#14 eor r2,r4,r5 eor r0,r11,r11,ror#5 vshr.u32 d24,d5,#17 add r7,r7,r3 and r2,r2,r11 veor q9,q9,q11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 vsli.32 d24,d5,#15 eor r2,r2,r5 add r6,r6,r3,ror#6 vshr.u32 d25,d5,#10 eor r3,r7,r8 eor r0,r0,r7,ror#20 vadd.i32 q3,q3,q9 add r6,r6,r2 ldr r2,[sp,#56] veor d25,d25,d24 and r12,r12,r3 add r10,r10,r6 vshr.u32 d24,d5,#19 add r6,r6,r0,ror#2 eor r12,r12,r8 vsli.32 d24,d5,#13 add r5,r5,r2 eor r2,r11,r4 veor d25,d25,d24 eor r0,r10,r10,ror#5 add r6,r6,r12 vadd.i32 d6,d6,d25 and r2,r2,r10 eor r12,r0,r10,ror#19 vshr.u32 d24,d6,#17 eor r0,r6,r6,ror#11 eor r2,r2,r4 vsli.32 d24,d6,#15 add r5,r5,r12,ror#6 eor r12,r6,r7 vshr.u32 d25,d6,#10 eor r0,r0,r6,ror#20 add r5,r5,r2 veor d25,d25,d24 ldr r2,[sp,#60] and r3,r3,r12 vshr.u32 d24,d6,#19 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 vld1.32 {q8},[r14,:128]! add r4,r4,r2 vsli.32 d24,d6,#13 eor r2,r10,r11 eor r0,r9,r9,ror#5 veor d25,d25,d24 add r5,r5,r3 and r2,r2,r9 vadd.i32 d7,d7,d25 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 vadd.i32 q8,q8,q3 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[r14] and r12,r12,r3 add r8,r8,r4 vst1.32 {q8},[r1,:128]! add r4,r4,r0,ror#2 eor r12,r12,r6 teq r2,#0 @ check for K256 terminator ldr r2,[sp,#0] sub r1,r1,#64 bne .L_00_48 ldr r1,[sp,#68] ldr r0,[sp,#72] sub r14,r14,#256 @ rewind r14 teq r1,r0 it eq subeq r1,r1,#64 @ avoid SEGV vld1.8 {q0},[r1]! @ load next input block vld1.8 {q1},[r1]! vld1.8 {q2},[r1]! vld1.8 {q3},[r1]! it ne strne r1,[sp,#68] mov r1,sp add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 add r4,r4,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r8 eor r12,r0,r8,ror#19 eor r0,r4,r4,ror#11 eor r2,r2,r10 vrev32.8 q0,q0 add r11,r11,r12,ror#6 eor r12,r4,r5 eor r0,r0,r4,ror#20 add r11,r11,r2 vadd.i32 q8,q8,q0 ldr r2,[sp,#4] and r3,r3,r12 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 add r10,r10,r2 eor r2,r8,r9 eor r0,r7,r7,ror#5 add r11,r11,r3 and r2,r2,r7 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 eor r2,r2,r9 add r10,r10,r3,ror#6 eor r3,r11,r4 eor r0,r0,r11,ror#20 add r10,r10,r2 ldr r2,[sp,#8] and r12,r12,r3 add r6,r6,r10 add r10,r10,r0,ror#2 eor r12,r12,r4 add r9,r9,r2 eor r2,r7,r8 eor r0,r6,r6,ror#5 add r10,r10,r12 and r2,r2,r6 eor r12,r0,r6,ror#19 eor r0,r10,r10,ror#11 eor r2,r2,r8 add r9,r9,r12,ror#6 eor r12,r10,r11 eor r0,r0,r10,ror#20 add r9,r9,r2 ldr r2,[sp,#12] and r3,r3,r12 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 add r8,r8,r2 eor r2,r6,r7 eor r0,r5,r5,ror#5 add r9,r9,r3 and r2,r2,r5 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#16] and r12,r12,r3 add r4,r4,r8 add r8,r8,r0,ror#2 eor r12,r12,r10 vst1.32 {q8},[r1,:128]! add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 add r8,r8,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r4 eor r12,r0,r4,ror#19 eor r0,r8,r8,ror#11 eor r2,r2,r6 vrev32.8 q1,q1 add r7,r7,r12,ror#6 eor r12,r8,r9 eor r0,r0,r8,ror#20 add r7,r7,r2 vadd.i32 q8,q8,q1 ldr r2,[sp,#20] and r3,r3,r12 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 add r6,r6,r2 eor r2,r4,r5 eor r0,r11,r11,ror#5 add r7,r7,r3 and r2,r2,r11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 eor r2,r2,r5 add r6,r6,r3,ror#6 eor r3,r7,r8 eor r0,r0,r7,ror#20 add r6,r6,r2 ldr r2,[sp,#24] and r12,r12,r3 add r10,r10,r6 add r6,r6,r0,ror#2 eor r12,r12,r8 add r5,r5,r2 eor r2,r11,r4 eor r0,r10,r10,ror#5 add r6,r6,r12 and r2,r2,r10 eor r12,r0,r10,ror#19 eor r0,r6,r6,ror#11 eor r2,r2,r4 add r5,r5,r12,ror#6 eor r12,r6,r7 eor r0,r0,r6,ror#20 add r5,r5,r2 ldr r2,[sp,#28] and r3,r3,r12 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 add r4,r4,r2 eor r2,r10,r11 eor r0,r9,r9,ror#5 add r5,r5,r3 and r2,r2,r9 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#32] and r12,r12,r3 add r8,r8,r4 add r4,r4,r0,ror#2 eor r12,r12,r6 vst1.32 {q8},[r1,:128]! add r11,r11,r2 eor r2,r9,r10 eor r0,r8,r8,ror#5 add r4,r4,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r8 eor r12,r0,r8,ror#19 eor r0,r4,r4,ror#11 eor r2,r2,r10 vrev32.8 q2,q2 add r11,r11,r12,ror#6 eor r12,r4,r5 eor r0,r0,r4,ror#20 add r11,r11,r2 vadd.i32 q8,q8,q2 ldr r2,[sp,#36] and r3,r3,r12 add r7,r7,r11 add r11,r11,r0,ror#2 eor r3,r3,r5 add r10,r10,r2 eor r2,r8,r9 eor r0,r7,r7,ror#5 add r11,r11,r3 and r2,r2,r7 eor r3,r0,r7,ror#19 eor r0,r11,r11,ror#11 eor r2,r2,r9 add r10,r10,r3,ror#6 eor r3,r11,r4 eor r0,r0,r11,ror#20 add r10,r10,r2 ldr r2,[sp,#40] and r12,r12,r3 add r6,r6,r10 add r10,r10,r0,ror#2 eor r12,r12,r4 add r9,r9,r2 eor r2,r7,r8 eor r0,r6,r6,ror#5 add r10,r10,r12 and r2,r2,r6 eor r12,r0,r6,ror#19 eor r0,r10,r10,ror#11 eor r2,r2,r8 add r9,r9,r12,ror#6 eor r12,r10,r11 eor r0,r0,r10,ror#20 add r9,r9,r2 ldr r2,[sp,#44] and r3,r3,r12 add r5,r5,r9 add r9,r9,r0,ror#2 eor r3,r3,r11 add r8,r8,r2 eor r2,r6,r7 eor r0,r5,r5,ror#5 add r9,r9,r3 and r2,r2,r5 eor r3,r0,r5,ror#19 eor r0,r9,r9,ror#11 eor r2,r2,r7 add r8,r8,r3,ror#6 eor r3,r9,r10 eor r0,r0,r9,ror#20 add r8,r8,r2 ldr r2,[sp,#48] and r12,r12,r3 add r4,r4,r8 add r8,r8,r0,ror#2 eor r12,r12,r10 vst1.32 {q8},[r1,:128]! add r7,r7,r2 eor r2,r5,r6 eor r0,r4,r4,ror#5 add r8,r8,r12 vld1.32 {q8},[r14,:128]! and r2,r2,r4 eor r12,r0,r4,ror#19 eor r0,r8,r8,ror#11 eor r2,r2,r6 vrev32.8 q3,q3 add r7,r7,r12,ror#6 eor r12,r8,r9 eor r0,r0,r8,ror#20 add r7,r7,r2 vadd.i32 q8,q8,q3 ldr r2,[sp,#52] and r3,r3,r12 add r11,r11,r7 add r7,r7,r0,ror#2 eor r3,r3,r9 add r6,r6,r2 eor r2,r4,r5 eor r0,r11,r11,ror#5 add r7,r7,r3 and r2,r2,r11 eor r3,r0,r11,ror#19 eor r0,r7,r7,ror#11 eor r2,r2,r5 add r6,r6,r3,ror#6 eor r3,r7,r8 eor r0,r0,r7,ror#20 add r6,r6,r2 ldr r2,[sp,#56] and r12,r12,r3 add r10,r10,r6 add r6,r6,r0,ror#2 eor r12,r12,r8 add r5,r5,r2 eor r2,r11,r4 eor r0,r10,r10,ror#5 add r6,r6,r12 and r2,r2,r10 eor r12,r0,r10,ror#19 eor r0,r6,r6,ror#11 eor r2,r2,r4 add r5,r5,r12,ror#6 eor r12,r6,r7 eor r0,r0,r6,ror#20 add r5,r5,r2 ldr r2,[sp,#60] and r3,r3,r12 add r9,r9,r5 add r5,r5,r0,ror#2 eor r3,r3,r7 add r4,r4,r2 eor r2,r10,r11 eor r0,r9,r9,ror#5 add r5,r5,r3 and r2,r2,r9 eor r3,r0,r9,ror#19 eor r0,r5,r5,ror#11 eor r2,r2,r11 add r4,r4,r3,ror#6 eor r3,r5,r6 eor r0,r0,r5,ror#20 add r4,r4,r2 ldr r2,[sp,#64] and r12,r12,r3 add r8,r8,r4 add r4,r4,r0,ror#2 eor r12,r12,r6 vst1.32 {q8},[r1,:128]! ldr r0,[r2,#0] add r4,r4,r12 @ h+=Maj(a,b,c) from the past ldr r12,[r2,#4] ldr r3,[r2,#8] ldr r1,[r2,#12] add r4,r4,r0 @ accumulate ldr r0,[r2,#16] add r5,r5,r12 ldr r12,[r2,#20] add r6,r6,r3 ldr r3,[r2,#24] add r7,r7,r1 ldr r1,[r2,#28] add r8,r8,r0 str r4,[r2],#4 add r9,r9,r12 str r5,[r2],#4 add r10,r10,r3 str r6,[r2],#4 add r11,r11,r1 str r7,[r2],#4 stmia r2,{r8,r9,r10,r11} ittte ne movne r1,sp ldrne r2,[sp,#0] eorne r12,r12,r12 ldreq sp,[sp,#76] @ restore original sp itt ne eorne r3,r5,r6 bne .L_00_48 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} .size sha256_block_data_order_neon,.-sha256_block_data_order_neon #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) # if defined(__thumb2__) # define INST(a,b,c,d) .byte c,d|0xc,a,b # else # define INST(a,b,c,d) .byte a,b,c,d # endif .type sha256_block_data_order_armv8,%function .align 5 sha256_block_data_order_armv8: .LARMv8: vld1.32 {q0,q1},[r0] sub r3,r3,#256+32 add r2,r1,r2,lsl#6 @ len to point at the end of inp b .Loop_v8 .align 4 .Loop_v8: vld1.8 {q8,q9},[r1]! vld1.8 {q10,q11},[r1]! vld1.32 {q12},[r3]! vrev32.8 q8,q8 vrev32.8 q9,q9 vrev32.8 q10,q10 vrev32.8 q11,q11 vmov q14,q0 @ offload vmov q15,q1 teq r1,r2 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q10 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q11 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 vld1.32 {q13},[r3]! vadd.i32 q12,q12,q8 vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 vld1.32 {q12},[r3]! vadd.i32 q13,q13,q9 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 vld1.32 {q13},[r3] vadd.i32 q12,q12,q10 sub r3,r3,#256-16 @ rewind vmov q2,q0 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 vadd.i32 q13,q13,q11 vmov q2,q0 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 vadd.i32 q0,q0,q14 vadd.i32 q1,q1,q15 it ne bne .Loop_v8 vst1.32 {q0,q1},[r0] bx lr @ bx lr .size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8 #endif .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha256-armv8-ios64.S000064400000000000000000001020731353224260600165400ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the OpenSSL license (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy // in the file LICENSE in the source distribution or at // https://www.openssl.org/source/license.html // ==================================================================== // Written by Andy Polyakov for the OpenSSL // project. The module is, however, dual licensed under OpenSSL and // CRYPTOGAMS licenses depending on where you obtain it. For further // details see http://www.openssl.org/~appro/cryptogams/. // // Permission to use under GPLv2 terms is granted. // ==================================================================== // // SHA256/512 for ARMv8. // // Performance in cycles per processed byte and improvement coefficient // over code generated with "default" compiler: // // SHA256-hw SHA256(*) SHA512 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) // Denver 2.01 10.5 (+26%) 6.70 (+8%) // X-Gene 20.0 (+100%) 12.8 (+300%(***)) // Mongoose 2.36 13.0 (+50%) 8.36 (+33%) // // (*) Software SHA256 results are of lesser relevance, presented // mostly for informational purposes. // (**) The result is a trade-off: it's possible to improve it by // 10% (or by 1 cycle per round), but at the cost of 20% loss // on Cortex-A53 (or by 4 cycles per round). // (***) Super-impressive coefficients over gcc-generated code are // indication of some compiler "pathology", most notably code // generated with -mgeneral-regs-only is significanty faster // and the gap is only 40-90%. #ifndef __KERNEL__ # include #endif .text .globl _GFp_sha256_block_data_order .private_extern _GFp_sha256_block_data_order .align 6 _GFp_sha256_block_data_order: #ifndef __KERNEL__ adrp x16,_GFp_armcap_P@PAGE add x16,x16,_GFp_armcap_P@PAGEOFF ldr w16,[x16] tst w16,#ARMV8_SHA256 b.ne Lv8_entry #endif stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#4*4 ldp w20,w21,[x0] // load context ldp w22,w23,[x0,#2*4] ldp w24,w25,[x0,#4*4] add x2,x1,x2,lsl#6 // end of input ldp w26,w27,[x0,#6*4] adrp x30,LK256@PAGE add x30,x30,LK256@PAGEOFF stp x0,x2,[x29,#96] Loop: ldp w3,w4,[x1],#2*4 ldr w19,[x30],#4 // *K++ eor w28,w21,w22 // magic seed str x1,[x29,#112] #ifndef __ARMEB__ rev w3,w3 // 0 #endif ror w16,w24,#6 add w27,w27,w19 // h+=K[i] eor w6,w24,w24,ror#14 and w17,w25,w24 bic w19,w26,w24 add w27,w27,w3 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w6,ror#11 // Sigma1(e) ror w6,w20,#2 add w27,w27,w17 // h+=Ch(e,f,g) eor w17,w20,w20,ror#9 add w27,w27,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w23,w23,w27 // d+=h eor w28,w28,w21 // Maj(a,b,c) eor w17,w6,w17,ror#13 // Sigma0(a) add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w27,w27,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w4,w4 // 1 #endif ldp w5,w6,[x1],#2*4 add w27,w27,w17 // h+=Sigma0(a) ror w16,w23,#6 add w26,w26,w28 // h+=K[i] eor w7,w23,w23,ror#14 and w17,w24,w23 bic w28,w25,w23 add w26,w26,w4 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w7,ror#11 // Sigma1(e) ror w7,w27,#2 add w26,w26,w17 // h+=Ch(e,f,g) eor w17,w27,w27,ror#9 add w26,w26,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w22,w22,w26 // d+=h eor w19,w19,w20 // Maj(a,b,c) eor w17,w7,w17,ror#13 // Sigma0(a) add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w26,w26,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w5,w5 // 2 #endif add w26,w26,w17 // h+=Sigma0(a) ror w16,w22,#6 add w25,w25,w19 // h+=K[i] eor w8,w22,w22,ror#14 and w17,w23,w22 bic w19,w24,w22 add w25,w25,w5 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w8,ror#11 // Sigma1(e) ror w8,w26,#2 add w25,w25,w17 // h+=Ch(e,f,g) eor w17,w26,w26,ror#9 add w25,w25,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w21,w21,w25 // d+=h eor w28,w28,w27 // Maj(a,b,c) eor w17,w8,w17,ror#13 // Sigma0(a) add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w25,w25,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w6,w6 // 3 #endif ldp w7,w8,[x1],#2*4 add w25,w25,w17 // h+=Sigma0(a) ror w16,w21,#6 add w24,w24,w28 // h+=K[i] eor w9,w21,w21,ror#14 and w17,w22,w21 bic w28,w23,w21 add w24,w24,w6 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w9,ror#11 // Sigma1(e) ror w9,w25,#2 add w24,w24,w17 // h+=Ch(e,f,g) eor w17,w25,w25,ror#9 add w24,w24,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w20,w20,w24 // d+=h eor w19,w19,w26 // Maj(a,b,c) eor w17,w9,w17,ror#13 // Sigma0(a) add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w24,w24,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w7,w7 // 4 #endif add w24,w24,w17 // h+=Sigma0(a) ror w16,w20,#6 add w23,w23,w19 // h+=K[i] eor w10,w20,w20,ror#14 and w17,w21,w20 bic w19,w22,w20 add w23,w23,w7 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w10,ror#11 // Sigma1(e) ror w10,w24,#2 add w23,w23,w17 // h+=Ch(e,f,g) eor w17,w24,w24,ror#9 add w23,w23,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w27,w27,w23 // d+=h eor w28,w28,w25 // Maj(a,b,c) eor w17,w10,w17,ror#13 // Sigma0(a) add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w23,w23,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w8,w8 // 5 #endif ldp w9,w10,[x1],#2*4 add w23,w23,w17 // h+=Sigma0(a) ror w16,w27,#6 add w22,w22,w28 // h+=K[i] eor w11,w27,w27,ror#14 and w17,w20,w27 bic w28,w21,w27 add w22,w22,w8 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w11,ror#11 // Sigma1(e) ror w11,w23,#2 add w22,w22,w17 // h+=Ch(e,f,g) eor w17,w23,w23,ror#9 add w22,w22,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w26,w26,w22 // d+=h eor w19,w19,w24 // Maj(a,b,c) eor w17,w11,w17,ror#13 // Sigma0(a) add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w22,w22,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w9,w9 // 6 #endif add w22,w22,w17 // h+=Sigma0(a) ror w16,w26,#6 add w21,w21,w19 // h+=K[i] eor w12,w26,w26,ror#14 and w17,w27,w26 bic w19,w20,w26 add w21,w21,w9 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w12,ror#11 // Sigma1(e) ror w12,w22,#2 add w21,w21,w17 // h+=Ch(e,f,g) eor w17,w22,w22,ror#9 add w21,w21,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w25,w25,w21 // d+=h eor w28,w28,w23 // Maj(a,b,c) eor w17,w12,w17,ror#13 // Sigma0(a) add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w21,w21,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w10,w10 // 7 #endif ldp w11,w12,[x1],#2*4 add w21,w21,w17 // h+=Sigma0(a) ror w16,w25,#6 add w20,w20,w28 // h+=K[i] eor w13,w25,w25,ror#14 and w17,w26,w25 bic w28,w27,w25 add w20,w20,w10 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w13,ror#11 // Sigma1(e) ror w13,w21,#2 add w20,w20,w17 // h+=Ch(e,f,g) eor w17,w21,w21,ror#9 add w20,w20,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w24,w24,w20 // d+=h eor w19,w19,w22 // Maj(a,b,c) eor w17,w13,w17,ror#13 // Sigma0(a) add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w20,w20,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w11,w11 // 8 #endif add w20,w20,w17 // h+=Sigma0(a) ror w16,w24,#6 add w27,w27,w19 // h+=K[i] eor w14,w24,w24,ror#14 and w17,w25,w24 bic w19,w26,w24 add w27,w27,w11 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w14,ror#11 // Sigma1(e) ror w14,w20,#2 add w27,w27,w17 // h+=Ch(e,f,g) eor w17,w20,w20,ror#9 add w27,w27,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w23,w23,w27 // d+=h eor w28,w28,w21 // Maj(a,b,c) eor w17,w14,w17,ror#13 // Sigma0(a) add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w27,w27,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w12,w12 // 9 #endif ldp w13,w14,[x1],#2*4 add w27,w27,w17 // h+=Sigma0(a) ror w16,w23,#6 add w26,w26,w28 // h+=K[i] eor w15,w23,w23,ror#14 and w17,w24,w23 bic w28,w25,w23 add w26,w26,w12 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w15,ror#11 // Sigma1(e) ror w15,w27,#2 add w26,w26,w17 // h+=Ch(e,f,g) eor w17,w27,w27,ror#9 add w26,w26,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w22,w22,w26 // d+=h eor w19,w19,w20 // Maj(a,b,c) eor w17,w15,w17,ror#13 // Sigma0(a) add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w26,w26,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w13,w13 // 10 #endif add w26,w26,w17 // h+=Sigma0(a) ror w16,w22,#6 add w25,w25,w19 // h+=K[i] eor w0,w22,w22,ror#14 and w17,w23,w22 bic w19,w24,w22 add w25,w25,w13 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w0,ror#11 // Sigma1(e) ror w0,w26,#2 add w25,w25,w17 // h+=Ch(e,f,g) eor w17,w26,w26,ror#9 add w25,w25,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w21,w21,w25 // d+=h eor w28,w28,w27 // Maj(a,b,c) eor w17,w0,w17,ror#13 // Sigma0(a) add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w25,w25,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w14,w14 // 11 #endif ldp w15,w0,[x1],#2*4 add w25,w25,w17 // h+=Sigma0(a) str w6,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] eor w6,w21,w21,ror#14 and w17,w22,w21 bic w28,w23,w21 add w24,w24,w14 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w6,ror#11 // Sigma1(e) ror w6,w25,#2 add w24,w24,w17 // h+=Ch(e,f,g) eor w17,w25,w25,ror#9 add w24,w24,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w20,w20,w24 // d+=h eor w19,w19,w26 // Maj(a,b,c) eor w17,w6,w17,ror#13 // Sigma0(a) add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w24,w24,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w15,w15 // 12 #endif add w24,w24,w17 // h+=Sigma0(a) str w7,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] eor w7,w20,w20,ror#14 and w17,w21,w20 bic w19,w22,w20 add w23,w23,w15 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w7,ror#11 // Sigma1(e) ror w7,w24,#2 add w23,w23,w17 // h+=Ch(e,f,g) eor w17,w24,w24,ror#9 add w23,w23,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w27,w27,w23 // d+=h eor w28,w28,w25 // Maj(a,b,c) eor w17,w7,w17,ror#13 // Sigma0(a) add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w23,w23,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w0,w0 // 13 #endif ldp w1,w2,[x1] add w23,w23,w17 // h+=Sigma0(a) str w8,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] eor w8,w27,w27,ror#14 and w17,w20,w27 bic w28,w21,w27 add w22,w22,w0 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w8,ror#11 // Sigma1(e) ror w8,w23,#2 add w22,w22,w17 // h+=Ch(e,f,g) eor w17,w23,w23,ror#9 add w22,w22,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w26,w26,w22 // d+=h eor w19,w19,w24 // Maj(a,b,c) eor w17,w8,w17,ror#13 // Sigma0(a) add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w22,w22,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w1,w1 // 14 #endif ldr w6,[sp,#12] add w22,w22,w17 // h+=Sigma0(a) str w9,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] eor w9,w26,w26,ror#14 and w17,w27,w26 bic w19,w20,w26 add w21,w21,w1 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w9,ror#11 // Sigma1(e) ror w9,w22,#2 add w21,w21,w17 // h+=Ch(e,f,g) eor w17,w22,w22,ror#9 add w21,w21,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w25,w25,w21 // d+=h eor w28,w28,w23 // Maj(a,b,c) eor w17,w9,w17,ror#13 // Sigma0(a) add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w21,w21,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w2,w2 // 15 #endif ldr w7,[sp,#0] add w21,w21,w17 // h+=Sigma0(a) str w10,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w9,w4,#7 and w17,w26,w25 ror w8,w1,#17 bic w28,w27,w25 ror w10,w21,#2 add w20,w20,w2 // h+=X[i] eor w16,w16,w25,ror#11 eor w9,w9,w4,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w10,w10,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w8,w8,w1,ror#19 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w10,w21,ror#22 // Sigma0(a) eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) add w3,w3,w12 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w3,w3,w9 add w20,w20,w17 // h+=Sigma0(a) add w3,w3,w8 Loop_16_xx: ldr w8,[sp,#4] str w11,[sp,#0] ror w16,w24,#6 add w27,w27,w19 // h+=K[i] ror w10,w5,#7 and w17,w25,w24 ror w9,w2,#17 bic w19,w26,w24 ror w11,w20,#2 add w27,w27,w3 // h+=X[i] eor w16,w16,w24,ror#11 eor w10,w10,w5,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w24,ror#25 // Sigma1(e) eor w11,w11,w20,ror#13 add w27,w27,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w9,w9,w2,ror#19 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) add w27,w27,w16 // h+=Sigma1(e) eor w28,w28,w21 // Maj(a,b,c) eor w17,w11,w20,ror#22 // Sigma0(a) eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) add w4,w4,w13 add w23,w23,w27 // d+=h add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w4,w4,w10 add w27,w27,w17 // h+=Sigma0(a) add w4,w4,w9 ldr w9,[sp,#8] str w12,[sp,#4] ror w16,w23,#6 add w26,w26,w28 // h+=K[i] ror w11,w6,#7 and w17,w24,w23 ror w10,w3,#17 bic w28,w25,w23 ror w12,w27,#2 add w26,w26,w4 // h+=X[i] eor w16,w16,w23,ror#11 eor w11,w11,w6,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w23,ror#25 // Sigma1(e) eor w12,w12,w27,ror#13 add w26,w26,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w10,w10,w3,ror#19 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) add w26,w26,w16 // h+=Sigma1(e) eor w19,w19,w20 // Maj(a,b,c) eor w17,w12,w27,ror#22 // Sigma0(a) eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) add w5,w5,w14 add w22,w22,w26 // d+=h add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w5,w5,w11 add w26,w26,w17 // h+=Sigma0(a) add w5,w5,w10 ldr w10,[sp,#12] str w13,[sp,#8] ror w16,w22,#6 add w25,w25,w19 // h+=K[i] ror w12,w7,#7 and w17,w23,w22 ror w11,w4,#17 bic w19,w24,w22 ror w13,w26,#2 add w25,w25,w5 // h+=X[i] eor w16,w16,w22,ror#11 eor w12,w12,w7,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w22,ror#25 // Sigma1(e) eor w13,w13,w26,ror#13 add w25,w25,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w11,w11,w4,ror#19 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) add w25,w25,w16 // h+=Sigma1(e) eor w28,w28,w27 // Maj(a,b,c) eor w17,w13,w26,ror#22 // Sigma0(a) eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) add w6,w6,w15 add w21,w21,w25 // d+=h add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w6,w6,w12 add w25,w25,w17 // h+=Sigma0(a) add w6,w6,w11 ldr w11,[sp,#0] str w14,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] ror w13,w8,#7 and w17,w22,w21 ror w12,w5,#17 bic w28,w23,w21 ror w14,w25,#2 add w24,w24,w6 // h+=X[i] eor w16,w16,w21,ror#11 eor w13,w13,w8,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w21,ror#25 // Sigma1(e) eor w14,w14,w25,ror#13 add w24,w24,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w12,w12,w5,ror#19 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) add w24,w24,w16 // h+=Sigma1(e) eor w19,w19,w26 // Maj(a,b,c) eor w17,w14,w25,ror#22 // Sigma0(a) eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) add w7,w7,w0 add w20,w20,w24 // d+=h add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w7,w7,w13 add w24,w24,w17 // h+=Sigma0(a) add w7,w7,w12 ldr w12,[sp,#4] str w15,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] ror w14,w9,#7 and w17,w21,w20 ror w13,w6,#17 bic w19,w22,w20 ror w15,w24,#2 add w23,w23,w7 // h+=X[i] eor w16,w16,w20,ror#11 eor w14,w14,w9,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w20,ror#25 // Sigma1(e) eor w15,w15,w24,ror#13 add w23,w23,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w13,w13,w6,ror#19 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) add w23,w23,w16 // h+=Sigma1(e) eor w28,w28,w25 // Maj(a,b,c) eor w17,w15,w24,ror#22 // Sigma0(a) eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) add w8,w8,w1 add w27,w27,w23 // d+=h add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w8,w8,w14 add w23,w23,w17 // h+=Sigma0(a) add w8,w8,w13 ldr w13,[sp,#8] str w0,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] ror w15,w10,#7 and w17,w20,w27 ror w14,w7,#17 bic w28,w21,w27 ror w0,w23,#2 add w22,w22,w8 // h+=X[i] eor w16,w16,w27,ror#11 eor w15,w15,w10,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w27,ror#25 // Sigma1(e) eor w0,w0,w23,ror#13 add w22,w22,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w14,w14,w7,ror#19 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) add w22,w22,w16 // h+=Sigma1(e) eor w19,w19,w24 // Maj(a,b,c) eor w17,w0,w23,ror#22 // Sigma0(a) eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) add w9,w9,w2 add w26,w26,w22 // d+=h add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w9,w9,w15 add w22,w22,w17 // h+=Sigma0(a) add w9,w9,w14 ldr w14,[sp,#12] str w1,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] ror w0,w11,#7 and w17,w27,w26 ror w15,w8,#17 bic w19,w20,w26 ror w1,w22,#2 add w21,w21,w9 // h+=X[i] eor w16,w16,w26,ror#11 eor w0,w0,w11,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w26,ror#25 // Sigma1(e) eor w1,w1,w22,ror#13 add w21,w21,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w15,w15,w8,ror#19 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) add w21,w21,w16 // h+=Sigma1(e) eor w28,w28,w23 // Maj(a,b,c) eor w17,w1,w22,ror#22 // Sigma0(a) eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) add w10,w10,w3 add w25,w25,w21 // d+=h add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w10,w10,w0 add w21,w21,w17 // h+=Sigma0(a) add w10,w10,w15 ldr w15,[sp,#0] str w2,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w1,w12,#7 and w17,w26,w25 ror w0,w9,#17 bic w28,w27,w25 ror w2,w21,#2 add w20,w20,w10 // h+=X[i] eor w16,w16,w25,ror#11 eor w1,w1,w12,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w2,w2,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w0,w0,w9,ror#19 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w2,w21,ror#22 // Sigma0(a) eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) add w11,w11,w4 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w11,w11,w1 add w20,w20,w17 // h+=Sigma0(a) add w11,w11,w0 ldr w0,[sp,#4] str w3,[sp,#0] ror w16,w24,#6 add w27,w27,w19 // h+=K[i] ror w2,w13,#7 and w17,w25,w24 ror w1,w10,#17 bic w19,w26,w24 ror w3,w20,#2 add w27,w27,w11 // h+=X[i] eor w16,w16,w24,ror#11 eor w2,w2,w13,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w24,ror#25 // Sigma1(e) eor w3,w3,w20,ror#13 add w27,w27,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w1,w1,w10,ror#19 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) add w27,w27,w16 // h+=Sigma1(e) eor w28,w28,w21 // Maj(a,b,c) eor w17,w3,w20,ror#22 // Sigma0(a) eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) add w12,w12,w5 add w23,w23,w27 // d+=h add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w12,w12,w2 add w27,w27,w17 // h+=Sigma0(a) add w12,w12,w1 ldr w1,[sp,#8] str w4,[sp,#4] ror w16,w23,#6 add w26,w26,w28 // h+=K[i] ror w3,w14,#7 and w17,w24,w23 ror w2,w11,#17 bic w28,w25,w23 ror w4,w27,#2 add w26,w26,w12 // h+=X[i] eor w16,w16,w23,ror#11 eor w3,w3,w14,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w23,ror#25 // Sigma1(e) eor w4,w4,w27,ror#13 add w26,w26,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w2,w2,w11,ror#19 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) add w26,w26,w16 // h+=Sigma1(e) eor w19,w19,w20 // Maj(a,b,c) eor w17,w4,w27,ror#22 // Sigma0(a) eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) add w13,w13,w6 add w22,w22,w26 // d+=h add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w13,w13,w3 add w26,w26,w17 // h+=Sigma0(a) add w13,w13,w2 ldr w2,[sp,#12] str w5,[sp,#8] ror w16,w22,#6 add w25,w25,w19 // h+=K[i] ror w4,w15,#7 and w17,w23,w22 ror w3,w12,#17 bic w19,w24,w22 ror w5,w26,#2 add w25,w25,w13 // h+=X[i] eor w16,w16,w22,ror#11 eor w4,w4,w15,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w22,ror#25 // Sigma1(e) eor w5,w5,w26,ror#13 add w25,w25,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w3,w3,w12,ror#19 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) add w25,w25,w16 // h+=Sigma1(e) eor w28,w28,w27 // Maj(a,b,c) eor w17,w5,w26,ror#22 // Sigma0(a) eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) add w14,w14,w7 add w21,w21,w25 // d+=h add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w14,w14,w4 add w25,w25,w17 // h+=Sigma0(a) add w14,w14,w3 ldr w3,[sp,#0] str w6,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] ror w5,w0,#7 and w17,w22,w21 ror w4,w13,#17 bic w28,w23,w21 ror w6,w25,#2 add w24,w24,w14 // h+=X[i] eor w16,w16,w21,ror#11 eor w5,w5,w0,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w21,ror#25 // Sigma1(e) eor w6,w6,w25,ror#13 add w24,w24,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w4,w4,w13,ror#19 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) add w24,w24,w16 // h+=Sigma1(e) eor w19,w19,w26 // Maj(a,b,c) eor w17,w6,w25,ror#22 // Sigma0(a) eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) add w15,w15,w8 add w20,w20,w24 // d+=h add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w15,w15,w5 add w24,w24,w17 // h+=Sigma0(a) add w15,w15,w4 ldr w4,[sp,#4] str w7,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] ror w6,w1,#7 and w17,w21,w20 ror w5,w14,#17 bic w19,w22,w20 ror w7,w24,#2 add w23,w23,w15 // h+=X[i] eor w16,w16,w20,ror#11 eor w6,w6,w1,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w20,ror#25 // Sigma1(e) eor w7,w7,w24,ror#13 add w23,w23,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w5,w5,w14,ror#19 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) add w23,w23,w16 // h+=Sigma1(e) eor w28,w28,w25 // Maj(a,b,c) eor w17,w7,w24,ror#22 // Sigma0(a) eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) add w0,w0,w9 add w27,w27,w23 // d+=h add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w0,w0,w6 add w23,w23,w17 // h+=Sigma0(a) add w0,w0,w5 ldr w5,[sp,#8] str w8,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] ror w7,w2,#7 and w17,w20,w27 ror w6,w15,#17 bic w28,w21,w27 ror w8,w23,#2 add w22,w22,w0 // h+=X[i] eor w16,w16,w27,ror#11 eor w7,w7,w2,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w27,ror#25 // Sigma1(e) eor w8,w8,w23,ror#13 add w22,w22,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w6,w6,w15,ror#19 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) add w22,w22,w16 // h+=Sigma1(e) eor w19,w19,w24 // Maj(a,b,c) eor w17,w8,w23,ror#22 // Sigma0(a) eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) add w1,w1,w10 add w26,w26,w22 // d+=h add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w1,w1,w7 add w22,w22,w17 // h+=Sigma0(a) add w1,w1,w6 ldr w6,[sp,#12] str w9,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] ror w8,w3,#7 and w17,w27,w26 ror w7,w0,#17 bic w19,w20,w26 ror w9,w22,#2 add w21,w21,w1 // h+=X[i] eor w16,w16,w26,ror#11 eor w8,w8,w3,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w26,ror#25 // Sigma1(e) eor w9,w9,w22,ror#13 add w21,w21,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w7,w7,w0,ror#19 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) add w21,w21,w16 // h+=Sigma1(e) eor w28,w28,w23 // Maj(a,b,c) eor w17,w9,w22,ror#22 // Sigma0(a) eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) add w2,w2,w11 add w25,w25,w21 // d+=h add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w2,w2,w8 add w21,w21,w17 // h+=Sigma0(a) add w2,w2,w7 ldr w7,[sp,#0] str w10,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w9,w4,#7 and w17,w26,w25 ror w8,w1,#17 bic w28,w27,w25 ror w10,w21,#2 add w20,w20,w2 // h+=X[i] eor w16,w16,w25,ror#11 eor w9,w9,w4,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w10,w10,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w8,w8,w1,ror#19 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w10,w21,ror#22 // Sigma0(a) eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) add w3,w3,w12 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w3,w3,w9 add w20,w20,w17 // h+=Sigma0(a) add w3,w3,w8 cbnz w19,Loop_16_xx ldp x0,x2,[x29,#96] ldr x1,[x29,#112] sub x30,x30,#260 // rewind ldp w3,w4,[x0] ldp w5,w6,[x0,#2*4] add x1,x1,#14*4 // advance input pointer ldp w7,w8,[x0,#4*4] add w20,w20,w3 ldp w9,w10,[x0,#6*4] add w21,w21,w4 add w22,w22,w5 add w23,w23,w6 stp w20,w21,[x0] add w24,w24,w7 add w25,w25,w8 stp w22,w23,[x0,#2*4] add w26,w26,w9 add w27,w27,w10 cmp x1,x2 stp w24,w25,[x0,#4*4] stp w26,w27,[x0,#6*4] b.ne Loop ldp x19,x20,[x29,#16] add sp,sp,#4*4 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#128 ret .section __TEXT,__const .align 6 LK256: .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0 //terminator .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 .text #ifndef __KERNEL__ .align 6 sha256_block_armv8: Lv8_entry: stp x29,x30,[sp,#-16]! add x29,sp,#0 ld1 {v0.4s,v1.4s},[x0] adrp x3,LK256@PAGE add x3,x3,LK256@PAGEOFF Loop_hw: ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 sub x2,x2,#1 ld1 {v16.4s},[x3],#16 rev32 v4.16b,v4.16b rev32 v5.16b,v5.16b rev32 v6.16b,v6.16b rev32 v7.16b,v7.16b orr v18.16b,v0.16b,v0.16b // offload orr v19.16b,v1.16b,v1.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .long 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .long 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .long 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s ld1 {v17.4s},[x3] add v16.4s,v16.4s,v6.4s sub x3,x3,#64*4-16 // rewind orr v2.16b,v0.16b,v0.16b .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s add v17.4s,v17.4s,v7.4s orr v2.16b,v0.16b,v0.16b .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s add v0.4s,v0.4s,v18.4s add v1.4s,v1.4s,v19.4s cbnz x2,Loop_hw st1 {v0.4s,v1.4s},[x0] ldr x29,[sp],#16 ret #endif #ifndef __KERNEL__ .comm _GFp_armcap_P,4,4 .private_extern _GFp_armcap_P #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha256-armv8-linux64.S000064400000000000000000001024271353224260700171110ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the OpenSSL license (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy // in the file LICENSE in the source distribution or at // https://www.openssl.org/source/license.html // ==================================================================== // Written by Andy Polyakov for the OpenSSL // project. The module is, however, dual licensed under OpenSSL and // CRYPTOGAMS licenses depending on where you obtain it. For further // details see http://www.openssl.org/~appro/cryptogams/. // // Permission to use under GPLv2 terms is granted. // ==================================================================== // // SHA256/512 for ARMv8. // // Performance in cycles per processed byte and improvement coefficient // over code generated with "default" compiler: // // SHA256-hw SHA256(*) SHA512 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) // Denver 2.01 10.5 (+26%) 6.70 (+8%) // X-Gene 20.0 (+100%) 12.8 (+300%(***)) // Mongoose 2.36 13.0 (+50%) 8.36 (+33%) // // (*) Software SHA256 results are of lesser relevance, presented // mostly for informational purposes. // (**) The result is a trade-off: it's possible to improve it by // 10% (or by 1 cycle per round), but at the cost of 20% loss // on Cortex-A53 (or by 4 cycles per round). // (***) Super-impressive coefficients over gcc-generated code are // indication of some compiler "pathology", most notably code // generated with -mgeneral-regs-only is significanty faster // and the gap is only 40-90%. #ifndef __KERNEL__ # include #endif .text .globl GFp_sha256_block_data_order .hidden GFp_sha256_block_data_order .type GFp_sha256_block_data_order,%function .align 6 GFp_sha256_block_data_order: #ifndef __KERNEL__ adrp x16,GFp_armcap_P add x16,x16,:lo12:GFp_armcap_P ldr w16,[x16] tst w16,#ARMV8_SHA256 b.ne .Lv8_entry #endif stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#4*4 ldp w20,w21,[x0] // load context ldp w22,w23,[x0,#2*4] ldp w24,w25,[x0,#4*4] add x2,x1,x2,lsl#6 // end of input ldp w26,w27,[x0,#6*4] adrp x30,.LK256 add x30,x30,:lo12:.LK256 stp x0,x2,[x29,#96] .Loop: ldp w3,w4,[x1],#2*4 ldr w19,[x30],#4 // *K++ eor w28,w21,w22 // magic seed str x1,[x29,#112] #ifndef __ARMEB__ rev w3,w3 // 0 #endif ror w16,w24,#6 add w27,w27,w19 // h+=K[i] eor w6,w24,w24,ror#14 and w17,w25,w24 bic w19,w26,w24 add w27,w27,w3 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w6,ror#11 // Sigma1(e) ror w6,w20,#2 add w27,w27,w17 // h+=Ch(e,f,g) eor w17,w20,w20,ror#9 add w27,w27,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w23,w23,w27 // d+=h eor w28,w28,w21 // Maj(a,b,c) eor w17,w6,w17,ror#13 // Sigma0(a) add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w27,w27,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w4,w4 // 1 #endif ldp w5,w6,[x1],#2*4 add w27,w27,w17 // h+=Sigma0(a) ror w16,w23,#6 add w26,w26,w28 // h+=K[i] eor w7,w23,w23,ror#14 and w17,w24,w23 bic w28,w25,w23 add w26,w26,w4 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w7,ror#11 // Sigma1(e) ror w7,w27,#2 add w26,w26,w17 // h+=Ch(e,f,g) eor w17,w27,w27,ror#9 add w26,w26,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w22,w22,w26 // d+=h eor w19,w19,w20 // Maj(a,b,c) eor w17,w7,w17,ror#13 // Sigma0(a) add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w26,w26,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w5,w5 // 2 #endif add w26,w26,w17 // h+=Sigma0(a) ror w16,w22,#6 add w25,w25,w19 // h+=K[i] eor w8,w22,w22,ror#14 and w17,w23,w22 bic w19,w24,w22 add w25,w25,w5 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w8,ror#11 // Sigma1(e) ror w8,w26,#2 add w25,w25,w17 // h+=Ch(e,f,g) eor w17,w26,w26,ror#9 add w25,w25,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w21,w21,w25 // d+=h eor w28,w28,w27 // Maj(a,b,c) eor w17,w8,w17,ror#13 // Sigma0(a) add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w25,w25,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w6,w6 // 3 #endif ldp w7,w8,[x1],#2*4 add w25,w25,w17 // h+=Sigma0(a) ror w16,w21,#6 add w24,w24,w28 // h+=K[i] eor w9,w21,w21,ror#14 and w17,w22,w21 bic w28,w23,w21 add w24,w24,w6 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w9,ror#11 // Sigma1(e) ror w9,w25,#2 add w24,w24,w17 // h+=Ch(e,f,g) eor w17,w25,w25,ror#9 add w24,w24,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w20,w20,w24 // d+=h eor w19,w19,w26 // Maj(a,b,c) eor w17,w9,w17,ror#13 // Sigma0(a) add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w24,w24,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w7,w7 // 4 #endif add w24,w24,w17 // h+=Sigma0(a) ror w16,w20,#6 add w23,w23,w19 // h+=K[i] eor w10,w20,w20,ror#14 and w17,w21,w20 bic w19,w22,w20 add w23,w23,w7 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w10,ror#11 // Sigma1(e) ror w10,w24,#2 add w23,w23,w17 // h+=Ch(e,f,g) eor w17,w24,w24,ror#9 add w23,w23,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w27,w27,w23 // d+=h eor w28,w28,w25 // Maj(a,b,c) eor w17,w10,w17,ror#13 // Sigma0(a) add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w23,w23,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w8,w8 // 5 #endif ldp w9,w10,[x1],#2*4 add w23,w23,w17 // h+=Sigma0(a) ror w16,w27,#6 add w22,w22,w28 // h+=K[i] eor w11,w27,w27,ror#14 and w17,w20,w27 bic w28,w21,w27 add w22,w22,w8 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w11,ror#11 // Sigma1(e) ror w11,w23,#2 add w22,w22,w17 // h+=Ch(e,f,g) eor w17,w23,w23,ror#9 add w22,w22,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w26,w26,w22 // d+=h eor w19,w19,w24 // Maj(a,b,c) eor w17,w11,w17,ror#13 // Sigma0(a) add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w22,w22,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w9,w9 // 6 #endif add w22,w22,w17 // h+=Sigma0(a) ror w16,w26,#6 add w21,w21,w19 // h+=K[i] eor w12,w26,w26,ror#14 and w17,w27,w26 bic w19,w20,w26 add w21,w21,w9 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w12,ror#11 // Sigma1(e) ror w12,w22,#2 add w21,w21,w17 // h+=Ch(e,f,g) eor w17,w22,w22,ror#9 add w21,w21,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w25,w25,w21 // d+=h eor w28,w28,w23 // Maj(a,b,c) eor w17,w12,w17,ror#13 // Sigma0(a) add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w21,w21,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w10,w10 // 7 #endif ldp w11,w12,[x1],#2*4 add w21,w21,w17 // h+=Sigma0(a) ror w16,w25,#6 add w20,w20,w28 // h+=K[i] eor w13,w25,w25,ror#14 and w17,w26,w25 bic w28,w27,w25 add w20,w20,w10 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w13,ror#11 // Sigma1(e) ror w13,w21,#2 add w20,w20,w17 // h+=Ch(e,f,g) eor w17,w21,w21,ror#9 add w20,w20,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w24,w24,w20 // d+=h eor w19,w19,w22 // Maj(a,b,c) eor w17,w13,w17,ror#13 // Sigma0(a) add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w20,w20,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w11,w11 // 8 #endif add w20,w20,w17 // h+=Sigma0(a) ror w16,w24,#6 add w27,w27,w19 // h+=K[i] eor w14,w24,w24,ror#14 and w17,w25,w24 bic w19,w26,w24 add w27,w27,w11 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w14,ror#11 // Sigma1(e) ror w14,w20,#2 add w27,w27,w17 // h+=Ch(e,f,g) eor w17,w20,w20,ror#9 add w27,w27,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w23,w23,w27 // d+=h eor w28,w28,w21 // Maj(a,b,c) eor w17,w14,w17,ror#13 // Sigma0(a) add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w27,w27,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w12,w12 // 9 #endif ldp w13,w14,[x1],#2*4 add w27,w27,w17 // h+=Sigma0(a) ror w16,w23,#6 add w26,w26,w28 // h+=K[i] eor w15,w23,w23,ror#14 and w17,w24,w23 bic w28,w25,w23 add w26,w26,w12 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w15,ror#11 // Sigma1(e) ror w15,w27,#2 add w26,w26,w17 // h+=Ch(e,f,g) eor w17,w27,w27,ror#9 add w26,w26,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w22,w22,w26 // d+=h eor w19,w19,w20 // Maj(a,b,c) eor w17,w15,w17,ror#13 // Sigma0(a) add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w26,w26,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w13,w13 // 10 #endif add w26,w26,w17 // h+=Sigma0(a) ror w16,w22,#6 add w25,w25,w19 // h+=K[i] eor w0,w22,w22,ror#14 and w17,w23,w22 bic w19,w24,w22 add w25,w25,w13 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w0,ror#11 // Sigma1(e) ror w0,w26,#2 add w25,w25,w17 // h+=Ch(e,f,g) eor w17,w26,w26,ror#9 add w25,w25,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w21,w21,w25 // d+=h eor w28,w28,w27 // Maj(a,b,c) eor w17,w0,w17,ror#13 // Sigma0(a) add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w25,w25,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w14,w14 // 11 #endif ldp w15,w0,[x1],#2*4 add w25,w25,w17 // h+=Sigma0(a) str w6,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] eor w6,w21,w21,ror#14 and w17,w22,w21 bic w28,w23,w21 add w24,w24,w14 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w6,ror#11 // Sigma1(e) ror w6,w25,#2 add w24,w24,w17 // h+=Ch(e,f,g) eor w17,w25,w25,ror#9 add w24,w24,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w20,w20,w24 // d+=h eor w19,w19,w26 // Maj(a,b,c) eor w17,w6,w17,ror#13 // Sigma0(a) add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w24,w24,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w15,w15 // 12 #endif add w24,w24,w17 // h+=Sigma0(a) str w7,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] eor w7,w20,w20,ror#14 and w17,w21,w20 bic w19,w22,w20 add w23,w23,w15 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w7,ror#11 // Sigma1(e) ror w7,w24,#2 add w23,w23,w17 // h+=Ch(e,f,g) eor w17,w24,w24,ror#9 add w23,w23,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w27,w27,w23 // d+=h eor w28,w28,w25 // Maj(a,b,c) eor w17,w7,w17,ror#13 // Sigma0(a) add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w23,w23,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w0,w0 // 13 #endif ldp w1,w2,[x1] add w23,w23,w17 // h+=Sigma0(a) str w8,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] eor w8,w27,w27,ror#14 and w17,w20,w27 bic w28,w21,w27 add w22,w22,w0 // h+=X[i] orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w8,ror#11 // Sigma1(e) ror w8,w23,#2 add w22,w22,w17 // h+=Ch(e,f,g) eor w17,w23,w23,ror#9 add w22,w22,w16 // h+=Sigma1(e) and w19,w19,w28 // (b^c)&=(a^b) add w26,w26,w22 // d+=h eor w19,w19,w24 // Maj(a,b,c) eor w17,w8,w17,ror#13 // Sigma0(a) add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round //add w22,w22,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w1,w1 // 14 #endif ldr w6,[sp,#12] add w22,w22,w17 // h+=Sigma0(a) str w9,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] eor w9,w26,w26,ror#14 and w17,w27,w26 bic w19,w20,w26 add w21,w21,w1 // h+=X[i] orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w9,ror#11 // Sigma1(e) ror w9,w22,#2 add w21,w21,w17 // h+=Ch(e,f,g) eor w17,w22,w22,ror#9 add w21,w21,w16 // h+=Sigma1(e) and w28,w28,w19 // (b^c)&=(a^b) add w25,w25,w21 // d+=h eor w28,w28,w23 // Maj(a,b,c) eor w17,w9,w17,ror#13 // Sigma0(a) add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round //add w21,w21,w17 // h+=Sigma0(a) #ifndef __ARMEB__ rev w2,w2 // 15 #endif ldr w7,[sp,#0] add w21,w21,w17 // h+=Sigma0(a) str w10,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w9,w4,#7 and w17,w26,w25 ror w8,w1,#17 bic w28,w27,w25 ror w10,w21,#2 add w20,w20,w2 // h+=X[i] eor w16,w16,w25,ror#11 eor w9,w9,w4,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w10,w10,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w8,w8,w1,ror#19 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w10,w21,ror#22 // Sigma0(a) eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) add w3,w3,w12 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w3,w3,w9 add w20,w20,w17 // h+=Sigma0(a) add w3,w3,w8 .Loop_16_xx: ldr w8,[sp,#4] str w11,[sp,#0] ror w16,w24,#6 add w27,w27,w19 // h+=K[i] ror w10,w5,#7 and w17,w25,w24 ror w9,w2,#17 bic w19,w26,w24 ror w11,w20,#2 add w27,w27,w3 // h+=X[i] eor w16,w16,w24,ror#11 eor w10,w10,w5,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w24,ror#25 // Sigma1(e) eor w11,w11,w20,ror#13 add w27,w27,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w9,w9,w2,ror#19 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) add w27,w27,w16 // h+=Sigma1(e) eor w28,w28,w21 // Maj(a,b,c) eor w17,w11,w20,ror#22 // Sigma0(a) eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) add w4,w4,w13 add w23,w23,w27 // d+=h add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w4,w4,w10 add w27,w27,w17 // h+=Sigma0(a) add w4,w4,w9 ldr w9,[sp,#8] str w12,[sp,#4] ror w16,w23,#6 add w26,w26,w28 // h+=K[i] ror w11,w6,#7 and w17,w24,w23 ror w10,w3,#17 bic w28,w25,w23 ror w12,w27,#2 add w26,w26,w4 // h+=X[i] eor w16,w16,w23,ror#11 eor w11,w11,w6,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w23,ror#25 // Sigma1(e) eor w12,w12,w27,ror#13 add w26,w26,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w10,w10,w3,ror#19 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) add w26,w26,w16 // h+=Sigma1(e) eor w19,w19,w20 // Maj(a,b,c) eor w17,w12,w27,ror#22 // Sigma0(a) eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) add w5,w5,w14 add w22,w22,w26 // d+=h add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w5,w5,w11 add w26,w26,w17 // h+=Sigma0(a) add w5,w5,w10 ldr w10,[sp,#12] str w13,[sp,#8] ror w16,w22,#6 add w25,w25,w19 // h+=K[i] ror w12,w7,#7 and w17,w23,w22 ror w11,w4,#17 bic w19,w24,w22 ror w13,w26,#2 add w25,w25,w5 // h+=X[i] eor w16,w16,w22,ror#11 eor w12,w12,w7,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w22,ror#25 // Sigma1(e) eor w13,w13,w26,ror#13 add w25,w25,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w11,w11,w4,ror#19 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) add w25,w25,w16 // h+=Sigma1(e) eor w28,w28,w27 // Maj(a,b,c) eor w17,w13,w26,ror#22 // Sigma0(a) eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) add w6,w6,w15 add w21,w21,w25 // d+=h add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w6,w6,w12 add w25,w25,w17 // h+=Sigma0(a) add w6,w6,w11 ldr w11,[sp,#0] str w14,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] ror w13,w8,#7 and w17,w22,w21 ror w12,w5,#17 bic w28,w23,w21 ror w14,w25,#2 add w24,w24,w6 // h+=X[i] eor w16,w16,w21,ror#11 eor w13,w13,w8,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w21,ror#25 // Sigma1(e) eor w14,w14,w25,ror#13 add w24,w24,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w12,w12,w5,ror#19 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) add w24,w24,w16 // h+=Sigma1(e) eor w19,w19,w26 // Maj(a,b,c) eor w17,w14,w25,ror#22 // Sigma0(a) eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) add w7,w7,w0 add w20,w20,w24 // d+=h add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w7,w7,w13 add w24,w24,w17 // h+=Sigma0(a) add w7,w7,w12 ldr w12,[sp,#4] str w15,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] ror w14,w9,#7 and w17,w21,w20 ror w13,w6,#17 bic w19,w22,w20 ror w15,w24,#2 add w23,w23,w7 // h+=X[i] eor w16,w16,w20,ror#11 eor w14,w14,w9,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w20,ror#25 // Sigma1(e) eor w15,w15,w24,ror#13 add w23,w23,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w13,w13,w6,ror#19 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) add w23,w23,w16 // h+=Sigma1(e) eor w28,w28,w25 // Maj(a,b,c) eor w17,w15,w24,ror#22 // Sigma0(a) eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) add w8,w8,w1 add w27,w27,w23 // d+=h add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w8,w8,w14 add w23,w23,w17 // h+=Sigma0(a) add w8,w8,w13 ldr w13,[sp,#8] str w0,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] ror w15,w10,#7 and w17,w20,w27 ror w14,w7,#17 bic w28,w21,w27 ror w0,w23,#2 add w22,w22,w8 // h+=X[i] eor w16,w16,w27,ror#11 eor w15,w15,w10,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w27,ror#25 // Sigma1(e) eor w0,w0,w23,ror#13 add w22,w22,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w14,w14,w7,ror#19 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) add w22,w22,w16 // h+=Sigma1(e) eor w19,w19,w24 // Maj(a,b,c) eor w17,w0,w23,ror#22 // Sigma0(a) eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) add w9,w9,w2 add w26,w26,w22 // d+=h add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w9,w9,w15 add w22,w22,w17 // h+=Sigma0(a) add w9,w9,w14 ldr w14,[sp,#12] str w1,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] ror w0,w11,#7 and w17,w27,w26 ror w15,w8,#17 bic w19,w20,w26 ror w1,w22,#2 add w21,w21,w9 // h+=X[i] eor w16,w16,w26,ror#11 eor w0,w0,w11,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w26,ror#25 // Sigma1(e) eor w1,w1,w22,ror#13 add w21,w21,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w15,w15,w8,ror#19 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) add w21,w21,w16 // h+=Sigma1(e) eor w28,w28,w23 // Maj(a,b,c) eor w17,w1,w22,ror#22 // Sigma0(a) eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) add w10,w10,w3 add w25,w25,w21 // d+=h add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w10,w10,w0 add w21,w21,w17 // h+=Sigma0(a) add w10,w10,w15 ldr w15,[sp,#0] str w2,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w1,w12,#7 and w17,w26,w25 ror w0,w9,#17 bic w28,w27,w25 ror w2,w21,#2 add w20,w20,w10 // h+=X[i] eor w16,w16,w25,ror#11 eor w1,w1,w12,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w2,w2,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w0,w0,w9,ror#19 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w2,w21,ror#22 // Sigma0(a) eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) add w11,w11,w4 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w11,w11,w1 add w20,w20,w17 // h+=Sigma0(a) add w11,w11,w0 ldr w0,[sp,#4] str w3,[sp,#0] ror w16,w24,#6 add w27,w27,w19 // h+=K[i] ror w2,w13,#7 and w17,w25,w24 ror w1,w10,#17 bic w19,w26,w24 ror w3,w20,#2 add w27,w27,w11 // h+=X[i] eor w16,w16,w24,ror#11 eor w2,w2,w13,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w20,w21 // a^b, b^c in next round eor w16,w16,w24,ror#25 // Sigma1(e) eor w3,w3,w20,ror#13 add w27,w27,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w1,w1,w10,ror#19 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) add w27,w27,w16 // h+=Sigma1(e) eor w28,w28,w21 // Maj(a,b,c) eor w17,w3,w20,ror#22 // Sigma0(a) eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) add w12,w12,w5 add w23,w23,w27 // d+=h add w27,w27,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w12,w12,w2 add w27,w27,w17 // h+=Sigma0(a) add w12,w12,w1 ldr w1,[sp,#8] str w4,[sp,#4] ror w16,w23,#6 add w26,w26,w28 // h+=K[i] ror w3,w14,#7 and w17,w24,w23 ror w2,w11,#17 bic w28,w25,w23 ror w4,w27,#2 add w26,w26,w12 // h+=X[i] eor w16,w16,w23,ror#11 eor w3,w3,w14,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w27,w20 // a^b, b^c in next round eor w16,w16,w23,ror#25 // Sigma1(e) eor w4,w4,w27,ror#13 add w26,w26,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w2,w2,w11,ror#19 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) add w26,w26,w16 // h+=Sigma1(e) eor w19,w19,w20 // Maj(a,b,c) eor w17,w4,w27,ror#22 // Sigma0(a) eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) add w13,w13,w6 add w22,w22,w26 // d+=h add w26,w26,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w13,w13,w3 add w26,w26,w17 // h+=Sigma0(a) add w13,w13,w2 ldr w2,[sp,#12] str w5,[sp,#8] ror w16,w22,#6 add w25,w25,w19 // h+=K[i] ror w4,w15,#7 and w17,w23,w22 ror w3,w12,#17 bic w19,w24,w22 ror w5,w26,#2 add w25,w25,w13 // h+=X[i] eor w16,w16,w22,ror#11 eor w4,w4,w15,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w26,w27 // a^b, b^c in next round eor w16,w16,w22,ror#25 // Sigma1(e) eor w5,w5,w26,ror#13 add w25,w25,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w3,w3,w12,ror#19 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) add w25,w25,w16 // h+=Sigma1(e) eor w28,w28,w27 // Maj(a,b,c) eor w17,w5,w26,ror#22 // Sigma0(a) eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) add w14,w14,w7 add w21,w21,w25 // d+=h add w25,w25,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w14,w14,w4 add w25,w25,w17 // h+=Sigma0(a) add w14,w14,w3 ldr w3,[sp,#0] str w6,[sp,#12] ror w16,w21,#6 add w24,w24,w28 // h+=K[i] ror w5,w0,#7 and w17,w22,w21 ror w4,w13,#17 bic w28,w23,w21 ror w6,w25,#2 add w24,w24,w14 // h+=X[i] eor w16,w16,w21,ror#11 eor w5,w5,w0,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w25,w26 // a^b, b^c in next round eor w16,w16,w21,ror#25 // Sigma1(e) eor w6,w6,w25,ror#13 add w24,w24,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w4,w4,w13,ror#19 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) add w24,w24,w16 // h+=Sigma1(e) eor w19,w19,w26 // Maj(a,b,c) eor w17,w6,w25,ror#22 // Sigma0(a) eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) add w15,w15,w8 add w20,w20,w24 // d+=h add w24,w24,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w15,w15,w5 add w24,w24,w17 // h+=Sigma0(a) add w15,w15,w4 ldr w4,[sp,#4] str w7,[sp,#0] ror w16,w20,#6 add w23,w23,w19 // h+=K[i] ror w6,w1,#7 and w17,w21,w20 ror w5,w14,#17 bic w19,w22,w20 ror w7,w24,#2 add w23,w23,w15 // h+=X[i] eor w16,w16,w20,ror#11 eor w6,w6,w1,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w24,w25 // a^b, b^c in next round eor w16,w16,w20,ror#25 // Sigma1(e) eor w7,w7,w24,ror#13 add w23,w23,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w5,w5,w14,ror#19 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) add w23,w23,w16 // h+=Sigma1(e) eor w28,w28,w25 // Maj(a,b,c) eor w17,w7,w24,ror#22 // Sigma0(a) eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) add w0,w0,w9 add w27,w27,w23 // d+=h add w23,w23,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w0,w0,w6 add w23,w23,w17 // h+=Sigma0(a) add w0,w0,w5 ldr w5,[sp,#8] str w8,[sp,#4] ror w16,w27,#6 add w22,w22,w28 // h+=K[i] ror w7,w2,#7 and w17,w20,w27 ror w6,w15,#17 bic w28,w21,w27 ror w8,w23,#2 add w22,w22,w0 // h+=X[i] eor w16,w16,w27,ror#11 eor w7,w7,w2,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w23,w24 // a^b, b^c in next round eor w16,w16,w27,ror#25 // Sigma1(e) eor w8,w8,w23,ror#13 add w22,w22,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w6,w6,w15,ror#19 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) add w22,w22,w16 // h+=Sigma1(e) eor w19,w19,w24 // Maj(a,b,c) eor w17,w8,w23,ror#22 // Sigma0(a) eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) add w1,w1,w10 add w26,w26,w22 // d+=h add w22,w22,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w1,w1,w7 add w22,w22,w17 // h+=Sigma0(a) add w1,w1,w6 ldr w6,[sp,#12] str w9,[sp,#8] ror w16,w26,#6 add w21,w21,w19 // h+=K[i] ror w8,w3,#7 and w17,w27,w26 ror w7,w0,#17 bic w19,w20,w26 ror w9,w22,#2 add w21,w21,w1 // h+=X[i] eor w16,w16,w26,ror#11 eor w8,w8,w3,ror#18 orr w17,w17,w19 // Ch(e,f,g) eor w19,w22,w23 // a^b, b^c in next round eor w16,w16,w26,ror#25 // Sigma1(e) eor w9,w9,w22,ror#13 add w21,w21,w17 // h+=Ch(e,f,g) and w28,w28,w19 // (b^c)&=(a^b) eor w7,w7,w0,ror#19 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) add w21,w21,w16 // h+=Sigma1(e) eor w28,w28,w23 // Maj(a,b,c) eor w17,w9,w22,ror#22 // Sigma0(a) eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) add w2,w2,w11 add w25,w25,w21 // d+=h add w21,w21,w28 // h+=Maj(a,b,c) ldr w28,[x30],#4 // *K++, w19 in next round add w2,w2,w8 add w21,w21,w17 // h+=Sigma0(a) add w2,w2,w7 ldr w7,[sp,#0] str w10,[sp,#12] ror w16,w25,#6 add w20,w20,w28 // h+=K[i] ror w9,w4,#7 and w17,w26,w25 ror w8,w1,#17 bic w28,w27,w25 ror w10,w21,#2 add w20,w20,w2 // h+=X[i] eor w16,w16,w25,ror#11 eor w9,w9,w4,ror#18 orr w17,w17,w28 // Ch(e,f,g) eor w28,w21,w22 // a^b, b^c in next round eor w16,w16,w25,ror#25 // Sigma1(e) eor w10,w10,w21,ror#13 add w20,w20,w17 // h+=Ch(e,f,g) and w19,w19,w28 // (b^c)&=(a^b) eor w8,w8,w1,ror#19 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) add w20,w20,w16 // h+=Sigma1(e) eor w19,w19,w22 // Maj(a,b,c) eor w17,w10,w21,ror#22 // Sigma0(a) eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) add w3,w3,w12 add w24,w24,w20 // d+=h add w20,w20,w19 // h+=Maj(a,b,c) ldr w19,[x30],#4 // *K++, w28 in next round add w3,w3,w9 add w20,w20,w17 // h+=Sigma0(a) add w3,w3,w8 cbnz w19,.Loop_16_xx ldp x0,x2,[x29,#96] ldr x1,[x29,#112] sub x30,x30,#260 // rewind ldp w3,w4,[x0] ldp w5,w6,[x0,#2*4] add x1,x1,#14*4 // advance input pointer ldp w7,w8,[x0,#4*4] add w20,w20,w3 ldp w9,w10,[x0,#6*4] add w21,w21,w4 add w22,w22,w5 add w23,w23,w6 stp w20,w21,[x0] add w24,w24,w7 add w25,w25,w8 stp w22,w23,[x0,#2*4] add w26,w26,w9 add w27,w27,w10 cmp x1,x2 stp w24,w25,[x0,#4*4] stp w26,w27,[x0,#6*4] b.ne .Loop ldp x19,x20,[x29,#16] add sp,sp,#4*4 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#128 ret .size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order .section .rodata .align 6 .type .LK256,%object .LK256: .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0 //terminator .size .LK256,.-.LK256 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 .text #ifndef __KERNEL__ .type sha256_block_armv8,%function .align 6 sha256_block_armv8: .Lv8_entry: stp x29,x30,[sp,#-16]! add x29,sp,#0 ld1 {v0.4s,v1.4s},[x0] adrp x3,.LK256 add x3,x3,:lo12:.LK256 .Loop_hw: ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 sub x2,x2,#1 ld1 {v16.4s},[x3],#16 rev32 v4.16b,v4.16b rev32 v5.16b,v5.16b rev32 v6.16b,v6.16b rev32 v7.16b,v7.16b orr v18.16b,v0.16b,v0.16b // offload orr v19.16b,v1.16b,v1.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .inst 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .inst 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v6.4s .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v7.4s .inst 0x5e282887 //sha256su0 v7.16b,v4.16b orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b ld1 {v17.4s},[x3],#16 add v16.4s,v16.4s,v4.4s orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s ld1 {v16.4s},[x3],#16 add v17.4s,v17.4s,v5.4s orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s ld1 {v17.4s},[x3] add v16.4s,v16.4s,v6.4s sub x3,x3,#64*4-16 // rewind orr v2.16b,v0.16b,v0.16b .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s add v17.4s,v17.4s,v7.4s orr v2.16b,v0.16b,v0.16b .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s add v0.4s,v0.4s,v18.4s add v1.4s,v1.4s,v19.4s cbnz x2,.Loop_hw st1 {v0.4s,v1.4s},[x0] ldr x29,[sp],#16 ret .size sha256_block_armv8,.-sha256_block_armv8 #endif #ifndef __KERNEL__ .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha256-x86_64-elf.S000064400000000000000000002022661353224260500162470ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_sha256_block_data_order .hidden GFp_sha256_block_data_order .type GFp_sha256_block_data_order,@function .align 16 GFp_sha256_block_data_order: .cfi_startproc leaq GFp_ia32cap_P(%rip),%r11 movl 0(%r11),%r9d movl 4(%r11),%r10d movl 8(%r11),%r11d andl $1073741824,%r9d andl $268435968,%r10d orl %r9d,%r10d cmpl $1342177792,%r10d je .Lavx_shortcut testl $512,%r10d jnz .Lssse3_shortcut movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 shlq $4,%rdx subq $64+32,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) .cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 .Lprologue: movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d jmp .Lloop .align 16 .Lloop: movl %ebx,%edi leaq K256(%rip),%rbp xorl %ecx,%edi movl 0(%rsi),%r12d movl %r8d,%r13d movl %eax,%r14d bswapl %r12d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,0(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp addl %r14d,%r11d movl 4(%rsi),%r12d movl %edx,%r13d movl %r11d,%r14d bswapl %r12d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,4(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp addl %r14d,%r10d movl 8(%rsi),%r12d movl %ecx,%r13d movl %r10d,%r14d bswapl %r12d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,8(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp addl %r14d,%r9d movl 12(%rsi),%r12d movl %ebx,%r13d movl %r9d,%r14d bswapl %r12d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,12(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp addl %r14d,%r8d movl 16(%rsi),%r12d movl %eax,%r13d movl %r8d,%r14d bswapl %r12d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,16(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp addl %r14d,%edx movl 20(%rsi),%r12d movl %r11d,%r13d movl %edx,%r14d bswapl %r12d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,20(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp addl %r14d,%ecx movl 24(%rsi),%r12d movl %r10d,%r13d movl %ecx,%r14d bswapl %r12d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,24(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp addl %r14d,%ebx movl 28(%rsi),%r12d movl %r9d,%r13d movl %ebx,%r14d bswapl %r12d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,28(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp addl %r14d,%eax movl 32(%rsi),%r12d movl %r8d,%r13d movl %eax,%r14d bswapl %r12d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,32(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp addl %r14d,%r11d movl 36(%rsi),%r12d movl %edx,%r13d movl %r11d,%r14d bswapl %r12d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,36(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp addl %r14d,%r10d movl 40(%rsi),%r12d movl %ecx,%r13d movl %r10d,%r14d bswapl %r12d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,40(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp addl %r14d,%r9d movl 44(%rsi),%r12d movl %ebx,%r13d movl %r9d,%r14d bswapl %r12d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,44(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp addl %r14d,%r8d movl 48(%rsi),%r12d movl %eax,%r13d movl %r8d,%r14d bswapl %r12d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,48(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp addl %r14d,%edx movl 52(%rsi),%r12d movl %r11d,%r13d movl %edx,%r14d bswapl %r12d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,52(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp addl %r14d,%ecx movl 56(%rsi),%r12d movl %r10d,%r13d movl %ecx,%r14d bswapl %r12d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,56(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp addl %r14d,%ebx movl 60(%rsi),%r12d movl %r9d,%r13d movl %ebx,%r14d bswapl %r12d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,60(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp jmp .Lrounds_16_xx .align 16 .Lrounds_16_xx: movl 4(%rsp),%r13d movl 56(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%eax movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 36(%rsp),%r12d addl 0(%rsp),%r12d movl %r8d,%r13d addl %r15d,%r12d movl %eax,%r14d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,0(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp movl 8(%rsp),%r13d movl 60(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r11d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 40(%rsp),%r12d addl 4(%rsp),%r12d movl %edx,%r13d addl %edi,%r12d movl %r11d,%r14d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,4(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp movl 12(%rsp),%r13d movl 0(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r10d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 44(%rsp),%r12d addl 8(%rsp),%r12d movl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r14d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,8(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp movl 16(%rsp),%r13d movl 4(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r9d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 48(%rsp),%r12d addl 12(%rsp),%r12d movl %ebx,%r13d addl %edi,%r12d movl %r9d,%r14d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,12(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp movl 20(%rsp),%r13d movl 8(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r8d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 52(%rsp),%r12d addl 16(%rsp),%r12d movl %eax,%r13d addl %r15d,%r12d movl %r8d,%r14d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,16(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp movl 24(%rsp),%r13d movl 12(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%edx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 56(%rsp),%r12d addl 20(%rsp),%r12d movl %r11d,%r13d addl %edi,%r12d movl %edx,%r14d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,20(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp movl 28(%rsp),%r13d movl 16(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ecx movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 60(%rsp),%r12d addl 24(%rsp),%r12d movl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r14d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,24(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp movl 32(%rsp),%r13d movl 20(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ebx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 0(%rsp),%r12d addl 28(%rsp),%r12d movl %r9d,%r13d addl %edi,%r12d movl %ebx,%r14d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,28(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp movl 36(%rsp),%r13d movl 24(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%eax movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 4(%rsp),%r12d addl 32(%rsp),%r12d movl %r8d,%r13d addl %r15d,%r12d movl %eax,%r14d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,32(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp movl 40(%rsp),%r13d movl 28(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r11d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 8(%rsp),%r12d addl 36(%rsp),%r12d movl %edx,%r13d addl %edi,%r12d movl %r11d,%r14d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,36(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp movl 44(%rsp),%r13d movl 32(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r10d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 12(%rsp),%r12d addl 40(%rsp),%r12d movl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r14d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,40(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp movl 48(%rsp),%r13d movl 36(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r9d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 16(%rsp),%r12d addl 44(%rsp),%r12d movl %ebx,%r13d addl %edi,%r12d movl %r9d,%r14d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,44(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp movl 52(%rsp),%r13d movl 40(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r8d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 20(%rsp),%r12d addl 48(%rsp),%r12d movl %eax,%r13d addl %r15d,%r12d movl %r8d,%r14d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,48(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp movl 56(%rsp),%r13d movl 44(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%edx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 24(%rsp),%r12d addl 52(%rsp),%r12d movl %r11d,%r13d addl %edi,%r12d movl %edx,%r14d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,52(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp movl 60(%rsp),%r13d movl 48(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ecx movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 28(%rsp),%r12d addl 56(%rsp),%r12d movl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r14d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,56(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp movl 0(%rsp),%r13d movl 52(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ebx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 32(%rsp),%r12d addl 60(%rsp),%r12d movl %r9d,%r13d addl %edi,%r12d movl %ebx,%r14d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,60(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp cmpb $0,3(%rbp) jnz .Lrounds_16_xx movq 64+0(%rsp),%rdi addl %r14d,%eax leaq 64(%rsi),%rsi addl 0(%rdi),%eax addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb .Lloop movq 88(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order .align 64 .type K256,@object K256: .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .type GFp_sha256_block_data_order_ssse3,@function .align 64 GFp_sha256_block_data_order_ssse3: .cfi_startproc .Lssse3_shortcut: movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 shlq $4,%rdx subq $96,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) .cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 .Lprologue_ssse3: movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d jmp .Lloop_ssse3 .align 16 .Lloop_ssse3: movdqa K256+512(%rip),%xmm7 movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 .byte 102,15,56,0,199 movdqu 48(%rsi),%xmm3 leaq K256(%rip),%rbp .byte 102,15,56,0,207 movdqa 0(%rbp),%xmm4 movdqa 32(%rbp),%xmm5 .byte 102,15,56,0,215 paddd %xmm0,%xmm4 movdqa 64(%rbp),%xmm6 .byte 102,15,56,0,223 movdqa 96(%rbp),%xmm7 paddd %xmm1,%xmm5 paddd %xmm2,%xmm6 paddd %xmm3,%xmm7 movdqa %xmm4,0(%rsp) movl %eax,%r14d movdqa %xmm5,16(%rsp) movl %ebx,%edi movdqa %xmm6,32(%rsp) xorl %ecx,%edi movdqa %xmm7,48(%rsp) movl %r8d,%r13d jmp .Lssse3_00_47 .align 16 .Lssse3_00_47: subq $-128,%rbp rorl $14,%r13d movdqa %xmm1,%xmm4 movl %r14d,%eax movl %r9d,%r12d movdqa %xmm3,%xmm7 rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d .byte 102,15,58,15,224,4 andl %r8d,%r12d xorl %r8d,%r13d .byte 102,15,58,15,250,4 addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %ebx,%r15d addl %r12d,%r11d movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi paddd %xmm7,%xmm0 rorl $2,%r14d addl %r11d,%edx psrld $7,%xmm6 addl %edi,%r11d movl %edx,%r13d pshufd $250,%xmm3,%xmm7 addl %r11d,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%r11d movl %r8d,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %r11d,%r14d pxor %xmm5,%xmm4 andl %edx,%r12d xorl %edx,%r13d pslld $11,%xmm5 addl 4(%rsp),%r10d movl %r11d,%edi pxor %xmm6,%xmm4 xorl %r9d,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %eax,%edi addl %r12d,%r10d pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d psrld $10,%xmm7 addl %r13d,%r10d xorl %eax,%r15d paddd %xmm4,%xmm0 rorl $2,%r14d addl %r10d,%ecx psrlq $17,%xmm6 addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %ecx,%r13d xorl %r8d,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d pshufd $128,%xmm7,%xmm7 xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d psrldq $8,%xmm7 xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d paddd %xmm7,%xmm0 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d pshufd $80,%xmm0,%xmm7 xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx movdqa %xmm7,%xmm6 addl %edi,%r9d movl %ebx,%r13d psrld $10,%xmm7 addl %r9d,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%r9d movl %ecx,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d psrlq $2,%xmm6 andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d pxor %xmm6,%xmm7 movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %r10d,%edi addl %r12d,%r8d movdqa 0(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d paddd %xmm7,%xmm0 rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d paddd %xmm0,%xmm6 movl %eax,%r13d addl %r8d,%r14d movdqa %xmm6,0(%rsp) rorl $14,%r13d movdqa %xmm2,%xmm4 movl %r14d,%r8d movl %ebx,%r12d movdqa %xmm0,%xmm7 rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d .byte 102,15,58,15,225,4 andl %eax,%r12d xorl %eax,%r13d .byte 102,15,58,15,251,4 addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %r9d,%r15d addl %r12d,%edx movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi paddd %xmm7,%xmm1 rorl $2,%r14d addl %edx,%r11d psrld $7,%xmm6 addl %edi,%edx movl %r11d,%r13d pshufd $250,%xmm0,%xmm7 addl %edx,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%edx movl %eax,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %edx,%r14d pxor %xmm5,%xmm4 andl %r11d,%r12d xorl %r11d,%r13d pslld $11,%xmm5 addl 20(%rsp),%ecx movl %edx,%edi pxor %xmm6,%xmm4 xorl %ebx,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %r8d,%edi addl %r12d,%ecx pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d psrld $10,%xmm7 addl %r13d,%ecx xorl %r8d,%r15d paddd %xmm4,%xmm1 rorl $2,%r14d addl %ecx,%r10d psrlq $17,%xmm6 addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %r10d,%r13d xorl %eax,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d pshufd $128,%xmm7,%xmm7 xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d psrldq $8,%xmm7 xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d paddd %xmm7,%xmm1 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx pshufd $80,%xmm1,%xmm7 xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d movdqa %xmm7,%xmm6 addl %edi,%ebx movl %r9d,%r13d psrld $10,%xmm7 addl %ebx,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%ebx movl %r10d,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d psrlq $2,%xmm6 andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax pxor %xmm6,%xmm7 movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %ecx,%edi addl %r12d,%eax movdqa 32(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d paddd %xmm7,%xmm1 rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax paddd %xmm1,%xmm6 movl %r8d,%r13d addl %eax,%r14d movdqa %xmm6,16(%rsp) rorl $14,%r13d movdqa %xmm3,%xmm4 movl %r14d,%eax movl %r9d,%r12d movdqa %xmm1,%xmm7 rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d .byte 102,15,58,15,226,4 andl %r8d,%r12d xorl %r8d,%r13d .byte 102,15,58,15,248,4 addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %ebx,%r15d addl %r12d,%r11d movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi paddd %xmm7,%xmm2 rorl $2,%r14d addl %r11d,%edx psrld $7,%xmm6 addl %edi,%r11d movl %edx,%r13d pshufd $250,%xmm1,%xmm7 addl %r11d,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%r11d movl %r8d,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %r11d,%r14d pxor %xmm5,%xmm4 andl %edx,%r12d xorl %edx,%r13d pslld $11,%xmm5 addl 36(%rsp),%r10d movl %r11d,%edi pxor %xmm6,%xmm4 xorl %r9d,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %eax,%edi addl %r12d,%r10d pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d psrld $10,%xmm7 addl %r13d,%r10d xorl %eax,%r15d paddd %xmm4,%xmm2 rorl $2,%r14d addl %r10d,%ecx psrlq $17,%xmm6 addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %ecx,%r13d xorl %r8d,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d pshufd $128,%xmm7,%xmm7 xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d psrldq $8,%xmm7 xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d paddd %xmm7,%xmm2 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d pshufd $80,%xmm2,%xmm7 xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx movdqa %xmm7,%xmm6 addl %edi,%r9d movl %ebx,%r13d psrld $10,%xmm7 addl %r9d,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%r9d movl %ecx,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d psrlq $2,%xmm6 andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d pxor %xmm6,%xmm7 movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %r10d,%edi addl %r12d,%r8d movdqa 64(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d paddd %xmm7,%xmm2 rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d paddd %xmm2,%xmm6 movl %eax,%r13d addl %r8d,%r14d movdqa %xmm6,32(%rsp) rorl $14,%r13d movdqa %xmm0,%xmm4 movl %r14d,%r8d movl %ebx,%r12d movdqa %xmm2,%xmm7 rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d .byte 102,15,58,15,227,4 andl %eax,%r12d xorl %eax,%r13d .byte 102,15,58,15,249,4 addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %r9d,%r15d addl %r12d,%edx movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi paddd %xmm7,%xmm3 rorl $2,%r14d addl %edx,%r11d psrld $7,%xmm6 addl %edi,%edx movl %r11d,%r13d pshufd $250,%xmm2,%xmm7 addl %edx,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%edx movl %eax,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %edx,%r14d pxor %xmm5,%xmm4 andl %r11d,%r12d xorl %r11d,%r13d pslld $11,%xmm5 addl 52(%rsp),%ecx movl %edx,%edi pxor %xmm6,%xmm4 xorl %ebx,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %r8d,%edi addl %r12d,%ecx pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d psrld $10,%xmm7 addl %r13d,%ecx xorl %r8d,%r15d paddd %xmm4,%xmm3 rorl $2,%r14d addl %ecx,%r10d psrlq $17,%xmm6 addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %r10d,%r13d xorl %eax,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d pshufd $128,%xmm7,%xmm7 xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d psrldq $8,%xmm7 xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d paddd %xmm7,%xmm3 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx pshufd $80,%xmm3,%xmm7 xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d movdqa %xmm7,%xmm6 addl %edi,%ebx movl %r9d,%r13d psrld $10,%xmm7 addl %ebx,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%ebx movl %r10d,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d psrlq $2,%xmm6 andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax pxor %xmm6,%xmm7 movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %ecx,%edi addl %r12d,%eax movdqa 96(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d paddd %xmm7,%xmm3 rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax paddd %xmm3,%xmm6 movl %r8d,%r13d addl %eax,%r14d movdqa %xmm6,48(%rsp) cmpb $0,131(%rbp) jne .Lssse3_00_47 rorl $14,%r13d movl %r14d,%eax movl %r9d,%r12d rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d xorl %ebx,%r15d addl %r12d,%r11d rorl $6,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi rorl $2,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d rorl $14,%r13d movl %r14d,%r11d movl %r8d,%r12d rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d rorl $11,%r14d xorl %eax,%edi addl %r12d,%r10d rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d rorl $2,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d xorl %ecx,%r13d xorl %r8d,%r12d rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d rorl $14,%r13d movl %r14d,%r9d movl %ecx,%r12d rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d xorl %r10d,%edi addl %r12d,%r8d rorl $6,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d rorl $14,%r13d movl %r14d,%r8d movl %ebx,%r12d rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d xorl %r9d,%r15d addl %r12d,%edx rorl $6,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi rorl $2,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d rorl $14,%r13d movl %r14d,%edx movl %eax,%r12d rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d rorl $11,%r14d xorl %r8d,%edi addl %r12d,%ecx rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d rorl $2,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d xorl %r10d,%r13d xorl %eax,%r12d rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d rorl $14,%r13d movl %r14d,%ebx movl %r10d,%r12d rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d xorl %ecx,%edi addl %r12d,%eax rorl $6,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d rorl $14,%r13d movl %r14d,%eax movl %r9d,%r12d rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d xorl %ebx,%r15d addl %r12d,%r11d rorl $6,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi rorl $2,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d rorl $14,%r13d movl %r14d,%r11d movl %r8d,%r12d rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d rorl $11,%r14d xorl %eax,%edi addl %r12d,%r10d rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d rorl $2,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d xorl %ecx,%r13d xorl %r8d,%r12d rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d rorl $14,%r13d movl %r14d,%r9d movl %ecx,%r12d rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d xorl %r10d,%edi addl %r12d,%r8d rorl $6,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d rorl $14,%r13d movl %r14d,%r8d movl %ebx,%r12d rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d xorl %r9d,%r15d addl %r12d,%edx rorl $6,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi rorl $2,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d rorl $14,%r13d movl %r14d,%edx movl %eax,%r12d rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d rorl $11,%r14d xorl %r8d,%edi addl %r12d,%ecx rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d rorl $2,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d xorl %r10d,%r13d xorl %eax,%r12d rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d rorl $14,%r13d movl %r14d,%ebx movl %r10d,%r12d rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d xorl %ecx,%edi addl %r12d,%eax rorl $6,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d movq 64+0(%rsp),%rdi movl %r14d,%eax addl 0(%rdi),%eax leaq 64(%rsi),%rsi addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb .Lloop_ssse3 movq 88(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_ssse3: .byte 0xf3,0xc3 .cfi_endproc .size GFp_sha256_block_data_order_ssse3,.-GFp_sha256_block_data_order_ssse3 .type GFp_sha256_block_data_order_avx,@function .align 64 GFp_sha256_block_data_order_avx: .cfi_startproc .Lavx_shortcut: movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 shlq $4,%rdx subq $96,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) .cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 .Lprologue_avx: vzeroupper movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d vmovdqa K256+512+32(%rip),%xmm8 vmovdqa K256+512+64(%rip),%xmm9 jmp .Lloop_avx .align 16 .Lloop_avx: vmovdqa K256+512(%rip),%xmm7 vmovdqu 0(%rsi),%xmm0 vmovdqu 16(%rsi),%xmm1 vmovdqu 32(%rsi),%xmm2 vmovdqu 48(%rsi),%xmm3 vpshufb %xmm7,%xmm0,%xmm0 leaq K256(%rip),%rbp vpshufb %xmm7,%xmm1,%xmm1 vpshufb %xmm7,%xmm2,%xmm2 vpaddd 0(%rbp),%xmm0,%xmm4 vpshufb %xmm7,%xmm3,%xmm3 vpaddd 32(%rbp),%xmm1,%xmm5 vpaddd 64(%rbp),%xmm2,%xmm6 vpaddd 96(%rbp),%xmm3,%xmm7 vmovdqa %xmm4,0(%rsp) movl %eax,%r14d vmovdqa %xmm5,16(%rsp) movl %ebx,%edi vmovdqa %xmm6,32(%rsp) xorl %ecx,%edi vmovdqa %xmm7,48(%rsp) movl %r8d,%r13d jmp .Lavx_00_47 .align 16 .Lavx_00_47: subq $-128,%rbp vpalignr $4,%xmm0,%xmm1,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d vpalignr $4,%xmm2,%xmm3,%xmm7 shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d vpaddd %xmm7,%xmm0,%xmm0 xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d vpsrld $3,%xmm4,%xmm7 xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi vpshufd $250,%xmm3,%xmm7 shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d vpsrld $11,%xmm6,%xmm6 movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d vpsrld $10,%xmm7,%xmm6 addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d vpaddd %xmm4,%xmm0,%xmm0 addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d vpsrlq $2,%xmm7,%xmm7 addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d vpxor %xmm7,%xmm6,%xmm6 movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d vpaddd %xmm6,%xmm0,%xmm0 andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d vpshufd $80,%xmm0,%xmm7 movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d vpxor %xmm7,%xmm6,%xmm6 xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx vpsrlq $2,%xmm7,%xmm7 addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d vpaddd %xmm6,%xmm0,%xmm0 shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d vpaddd 0(%rbp),%xmm0,%xmm6 xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d vmovdqa %xmm6,0(%rsp) vpalignr $4,%xmm1,%xmm2,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d vpalignr $4,%xmm3,%xmm0,%xmm7 shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d vpaddd %xmm7,%xmm1,%xmm1 xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d vpsrld $3,%xmm4,%xmm7 xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi vpshufd $250,%xmm0,%xmm7 shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx vpsrld $11,%xmm6,%xmm6 movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d vpsrld $10,%xmm7,%xmm6 addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d vpaddd %xmm4,%xmm1,%xmm1 addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d vpsrlq $2,%xmm7,%xmm7 addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx vpxor %xmm7,%xmm6,%xmm6 movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d vpaddd %xmm6,%xmm1,%xmm1 andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx vpshufd $80,%xmm1,%xmm7 movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx vpxor %xmm7,%xmm6,%xmm6 xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d vpsrlq $2,%xmm7,%xmm7 addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d vpaddd %xmm6,%xmm1,%xmm1 shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d vpaddd 32(%rbp),%xmm1,%xmm6 xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d vmovdqa %xmm6,16(%rsp) vpalignr $4,%xmm2,%xmm3,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d vpalignr $4,%xmm0,%xmm1,%xmm7 shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d vpaddd %xmm7,%xmm2,%xmm2 xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d vpsrld $3,%xmm4,%xmm7 xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi vpshufd $250,%xmm1,%xmm7 shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d vpsrld $11,%xmm6,%xmm6 movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d vpsrld $10,%xmm7,%xmm6 addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d vpaddd %xmm4,%xmm2,%xmm2 addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d vpsrlq $2,%xmm7,%xmm7 addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d vpxor %xmm7,%xmm6,%xmm6 movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d vpaddd %xmm6,%xmm2,%xmm2 andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d vpshufd $80,%xmm2,%xmm7 movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d vpxor %xmm7,%xmm6,%xmm6 xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx vpsrlq $2,%xmm7,%xmm7 addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d vpaddd %xmm6,%xmm2,%xmm2 shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d vpaddd 64(%rbp),%xmm2,%xmm6 xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d vmovdqa %xmm6,32(%rsp) vpalignr $4,%xmm3,%xmm0,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d vpalignr $4,%xmm1,%xmm2,%xmm7 shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d vpaddd %xmm7,%xmm3,%xmm3 xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d vpsrld $3,%xmm4,%xmm7 xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi vpshufd $250,%xmm2,%xmm7 shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx vpsrld $11,%xmm6,%xmm6 movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d vpsrld $10,%xmm7,%xmm6 addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d vpaddd %xmm4,%xmm3,%xmm3 addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d vpsrlq $2,%xmm7,%xmm7 addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx vpxor %xmm7,%xmm6,%xmm6 movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d vpaddd %xmm6,%xmm3,%xmm3 andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx vpshufd $80,%xmm3,%xmm7 movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx vpxor %xmm7,%xmm6,%xmm6 xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d vpsrlq $2,%xmm7,%xmm7 addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d vpaddd %xmm6,%xmm3,%xmm3 shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d vpaddd 96(%rbp),%xmm3,%xmm6 xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d vmovdqa %xmm6,48(%rsp) cmpb $0,131(%rbp) jne .Lavx_00_47 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d movq 64+0(%rsp),%rdi movl %r14d,%eax addl 0(%rdi),%eax leaq 64(%rsi),%rsi addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb .Lloop_avx movq 88(%rsp),%rsi .cfi_def_cfa %rsi,8 vzeroupper movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_avx: .byte 0xf3,0xc3 .cfi_endproc .size GFp_sha256_block_data_order_avx,.-GFp_sha256_block_data_order_avx #endif ring-0.16.9/pregenerated/sha256-x86_64-macosx.S000064400000000000000000001773271353224260000167770ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_sha256_block_data_order .private_extern _GFp_sha256_block_data_order .p2align 4 _GFp_sha256_block_data_order: leaq _GFp_ia32cap_P(%rip),%r11 movl 0(%r11),%r9d movl 4(%r11),%r10d movl 8(%r11),%r11d andl $1073741824,%r9d andl $268435968,%r10d orl %r9d,%r10d cmpl $1342177792,%r10d je L$avx_shortcut testl $512,%r10d jnz L$ssse3_shortcut movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 shlq $4,%rdx subq $64+32,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) L$prologue: movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d jmp L$loop .p2align 4 L$loop: movl %ebx,%edi leaq K256(%rip),%rbp xorl %ecx,%edi movl 0(%rsi),%r12d movl %r8d,%r13d movl %eax,%r14d bswapl %r12d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,0(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp addl %r14d,%r11d movl 4(%rsi),%r12d movl %edx,%r13d movl %r11d,%r14d bswapl %r12d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,4(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp addl %r14d,%r10d movl 8(%rsi),%r12d movl %ecx,%r13d movl %r10d,%r14d bswapl %r12d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,8(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp addl %r14d,%r9d movl 12(%rsi),%r12d movl %ebx,%r13d movl %r9d,%r14d bswapl %r12d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,12(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp addl %r14d,%r8d movl 16(%rsi),%r12d movl %eax,%r13d movl %r8d,%r14d bswapl %r12d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,16(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp addl %r14d,%edx movl 20(%rsi),%r12d movl %r11d,%r13d movl %edx,%r14d bswapl %r12d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,20(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp addl %r14d,%ecx movl 24(%rsi),%r12d movl %r10d,%r13d movl %ecx,%r14d bswapl %r12d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,24(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp addl %r14d,%ebx movl 28(%rsi),%r12d movl %r9d,%r13d movl %ebx,%r14d bswapl %r12d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,28(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp addl %r14d,%eax movl 32(%rsi),%r12d movl %r8d,%r13d movl %eax,%r14d bswapl %r12d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,32(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp addl %r14d,%r11d movl 36(%rsi),%r12d movl %edx,%r13d movl %r11d,%r14d bswapl %r12d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,36(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp addl %r14d,%r10d movl 40(%rsi),%r12d movl %ecx,%r13d movl %r10d,%r14d bswapl %r12d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,40(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp addl %r14d,%r9d movl 44(%rsi),%r12d movl %ebx,%r13d movl %r9d,%r14d bswapl %r12d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,44(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp addl %r14d,%r8d movl 48(%rsi),%r12d movl %eax,%r13d movl %r8d,%r14d bswapl %r12d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,48(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp addl %r14d,%edx movl 52(%rsi),%r12d movl %r11d,%r13d movl %edx,%r14d bswapl %r12d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,52(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp addl %r14d,%ecx movl 56(%rsi),%r12d movl %r10d,%r13d movl %ecx,%r14d bswapl %r12d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,56(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp addl %r14d,%ebx movl 60(%rsi),%r12d movl %r9d,%r13d movl %ebx,%r14d bswapl %r12d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,60(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp jmp L$rounds_16_xx .p2align 4 L$rounds_16_xx: movl 4(%rsp),%r13d movl 56(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%eax movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 36(%rsp),%r12d addl 0(%rsp),%r12d movl %r8d,%r13d addl %r15d,%r12d movl %eax,%r14d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,0(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp movl 8(%rsp),%r13d movl 60(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r11d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 40(%rsp),%r12d addl 4(%rsp),%r12d movl %edx,%r13d addl %edi,%r12d movl %r11d,%r14d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,4(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp movl 12(%rsp),%r13d movl 0(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r10d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 44(%rsp),%r12d addl 8(%rsp),%r12d movl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r14d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,8(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp movl 16(%rsp),%r13d movl 4(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r9d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 48(%rsp),%r12d addl 12(%rsp),%r12d movl %ebx,%r13d addl %edi,%r12d movl %r9d,%r14d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,12(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp movl 20(%rsp),%r13d movl 8(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r8d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 52(%rsp),%r12d addl 16(%rsp),%r12d movl %eax,%r13d addl %r15d,%r12d movl %r8d,%r14d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,16(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp movl 24(%rsp),%r13d movl 12(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%edx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 56(%rsp),%r12d addl 20(%rsp),%r12d movl %r11d,%r13d addl %edi,%r12d movl %edx,%r14d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,20(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp movl 28(%rsp),%r13d movl 16(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ecx movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 60(%rsp),%r12d addl 24(%rsp),%r12d movl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r14d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,24(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp movl 32(%rsp),%r13d movl 20(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ebx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 0(%rsp),%r12d addl 28(%rsp),%r12d movl %r9d,%r13d addl %edi,%r12d movl %ebx,%r14d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,28(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp movl 36(%rsp),%r13d movl 24(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%eax movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 4(%rsp),%r12d addl 32(%rsp),%r12d movl %r8d,%r13d addl %r15d,%r12d movl %eax,%r14d rorl $14,%r13d movl %r9d,%r15d xorl %r8d,%r13d rorl $9,%r14d xorl %r10d,%r15d movl %r12d,32(%rsp) xorl %eax,%r14d andl %r8d,%r15d rorl $5,%r13d addl %r11d,%r12d xorl %r10d,%r15d rorl $11,%r14d xorl %r8d,%r13d addl %r15d,%r12d movl %eax,%r15d addl (%rbp),%r12d xorl %eax,%r14d xorl %ebx,%r15d rorl $6,%r13d movl %ebx,%r11d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r11d addl %r12d,%edx addl %r12d,%r11d leaq 4(%rbp),%rbp movl 40(%rsp),%r13d movl 28(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r11d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 8(%rsp),%r12d addl 36(%rsp),%r12d movl %edx,%r13d addl %edi,%r12d movl %r11d,%r14d rorl $14,%r13d movl %r8d,%edi xorl %edx,%r13d rorl $9,%r14d xorl %r9d,%edi movl %r12d,36(%rsp) xorl %r11d,%r14d andl %edx,%edi rorl $5,%r13d addl %r10d,%r12d xorl %r9d,%edi rorl $11,%r14d xorl %edx,%r13d addl %edi,%r12d movl %r11d,%edi addl (%rbp),%r12d xorl %r11d,%r14d xorl %eax,%edi rorl $6,%r13d movl %eax,%r10d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r10d addl %r12d,%ecx addl %r12d,%r10d leaq 4(%rbp),%rbp movl 44(%rsp),%r13d movl 32(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r10d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 12(%rsp),%r12d addl 40(%rsp),%r12d movl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r14d rorl $14,%r13d movl %edx,%r15d xorl %ecx,%r13d rorl $9,%r14d xorl %r8d,%r15d movl %r12d,40(%rsp) xorl %r10d,%r14d andl %ecx,%r15d rorl $5,%r13d addl %r9d,%r12d xorl %r8d,%r15d rorl $11,%r14d xorl %ecx,%r13d addl %r15d,%r12d movl %r10d,%r15d addl (%rbp),%r12d xorl %r10d,%r14d xorl %r11d,%r15d rorl $6,%r13d movl %r11d,%r9d andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%r9d addl %r12d,%ebx addl %r12d,%r9d leaq 4(%rbp),%rbp movl 48(%rsp),%r13d movl 36(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r9d movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 16(%rsp),%r12d addl 44(%rsp),%r12d movl %ebx,%r13d addl %edi,%r12d movl %r9d,%r14d rorl $14,%r13d movl %ecx,%edi xorl %ebx,%r13d rorl $9,%r14d xorl %edx,%edi movl %r12d,44(%rsp) xorl %r9d,%r14d andl %ebx,%edi rorl $5,%r13d addl %r8d,%r12d xorl %edx,%edi rorl $11,%r14d xorl %ebx,%r13d addl %edi,%r12d movl %r9d,%edi addl (%rbp),%r12d xorl %r9d,%r14d xorl %r10d,%edi rorl $6,%r13d movl %r10d,%r8d andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%r8d addl %r12d,%eax addl %r12d,%r8d leaq 20(%rbp),%rbp movl 52(%rsp),%r13d movl 40(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%r8d movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 20(%rsp),%r12d addl 48(%rsp),%r12d movl %eax,%r13d addl %r15d,%r12d movl %r8d,%r14d rorl $14,%r13d movl %ebx,%r15d xorl %eax,%r13d rorl $9,%r14d xorl %ecx,%r15d movl %r12d,48(%rsp) xorl %r8d,%r14d andl %eax,%r15d rorl $5,%r13d addl %edx,%r12d xorl %ecx,%r15d rorl $11,%r14d xorl %eax,%r13d addl %r15d,%r12d movl %r8d,%r15d addl (%rbp),%r12d xorl %r8d,%r14d xorl %r9d,%r15d rorl $6,%r13d movl %r9d,%edx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%edx addl %r12d,%r11d addl %r12d,%edx leaq 4(%rbp),%rbp movl 56(%rsp),%r13d movl 44(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%edx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 24(%rsp),%r12d addl 52(%rsp),%r12d movl %r11d,%r13d addl %edi,%r12d movl %edx,%r14d rorl $14,%r13d movl %eax,%edi xorl %r11d,%r13d rorl $9,%r14d xorl %ebx,%edi movl %r12d,52(%rsp) xorl %edx,%r14d andl %r11d,%edi rorl $5,%r13d addl %ecx,%r12d xorl %ebx,%edi rorl $11,%r14d xorl %r11d,%r13d addl %edi,%r12d movl %edx,%edi addl (%rbp),%r12d xorl %edx,%r14d xorl %r8d,%edi rorl $6,%r13d movl %r8d,%ecx andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%ecx addl %r12d,%r10d addl %r12d,%ecx leaq 4(%rbp),%rbp movl 60(%rsp),%r13d movl 48(%rsp),%r15d movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ecx movl %r15d,%r14d rorl $2,%r15d xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%r15d shrl $10,%r14d rorl $17,%r15d xorl %r13d,%r12d xorl %r14d,%r15d addl 28(%rsp),%r12d addl 56(%rsp),%r12d movl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r14d rorl $14,%r13d movl %r11d,%r15d xorl %r10d,%r13d rorl $9,%r14d xorl %eax,%r15d movl %r12d,56(%rsp) xorl %ecx,%r14d andl %r10d,%r15d rorl $5,%r13d addl %ebx,%r12d xorl %eax,%r15d rorl $11,%r14d xorl %r10d,%r13d addl %r15d,%r12d movl %ecx,%r15d addl (%rbp),%r12d xorl %ecx,%r14d xorl %edx,%r15d rorl $6,%r13d movl %edx,%ebx andl %r15d,%edi rorl $2,%r14d addl %r13d,%r12d xorl %edi,%ebx addl %r12d,%r9d addl %r12d,%ebx leaq 4(%rbp),%rbp movl 0(%rsp),%r13d movl 52(%rsp),%edi movl %r13d,%r12d rorl $11,%r13d addl %r14d,%ebx movl %edi,%r14d rorl $2,%edi xorl %r12d,%r13d shrl $3,%r12d rorl $7,%r13d xorl %r14d,%edi shrl $10,%r14d rorl $17,%edi xorl %r13d,%r12d xorl %r14d,%edi addl 32(%rsp),%r12d addl 60(%rsp),%r12d movl %r9d,%r13d addl %edi,%r12d movl %ebx,%r14d rorl $14,%r13d movl %r10d,%edi xorl %r9d,%r13d rorl $9,%r14d xorl %r11d,%edi movl %r12d,60(%rsp) xorl %ebx,%r14d andl %r9d,%edi rorl $5,%r13d addl %eax,%r12d xorl %r11d,%edi rorl $11,%r14d xorl %r9d,%r13d addl %edi,%r12d movl %ebx,%edi addl (%rbp),%r12d xorl %ebx,%r14d xorl %ecx,%edi rorl $6,%r13d movl %ecx,%eax andl %edi,%r15d rorl $2,%r14d addl %r13d,%r12d xorl %r15d,%eax addl %r12d,%r8d addl %r12d,%eax leaq 20(%rbp),%rbp cmpb $0,3(%rbp) jnz L$rounds_16_xx movq 64+0(%rsp),%rdi addl %r14d,%eax leaq 64(%rsi),%rsi addl 0(%rdi),%eax addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb L$loop movq 88(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$epilogue: .byte 0xf3,0xc3 .p2align 6 K256: .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 GFp_sha256_block_data_order_ssse3: L$ssse3_shortcut: movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 shlq $4,%rdx subq $96,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) L$prologue_ssse3: movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d jmp L$loop_ssse3 .p2align 4 L$loop_ssse3: movdqa K256+512(%rip),%xmm7 movdqu 0(%rsi),%xmm0 movdqu 16(%rsi),%xmm1 movdqu 32(%rsi),%xmm2 .byte 102,15,56,0,199 movdqu 48(%rsi),%xmm3 leaq K256(%rip),%rbp .byte 102,15,56,0,207 movdqa 0(%rbp),%xmm4 movdqa 32(%rbp),%xmm5 .byte 102,15,56,0,215 paddd %xmm0,%xmm4 movdqa 64(%rbp),%xmm6 .byte 102,15,56,0,223 movdqa 96(%rbp),%xmm7 paddd %xmm1,%xmm5 paddd %xmm2,%xmm6 paddd %xmm3,%xmm7 movdqa %xmm4,0(%rsp) movl %eax,%r14d movdqa %xmm5,16(%rsp) movl %ebx,%edi movdqa %xmm6,32(%rsp) xorl %ecx,%edi movdqa %xmm7,48(%rsp) movl %r8d,%r13d jmp L$ssse3_00_47 .p2align 4 L$ssse3_00_47: subq $-128,%rbp rorl $14,%r13d movdqa %xmm1,%xmm4 movl %r14d,%eax movl %r9d,%r12d movdqa %xmm3,%xmm7 rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d .byte 102,15,58,15,224,4 andl %r8d,%r12d xorl %r8d,%r13d .byte 102,15,58,15,250,4 addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %ebx,%r15d addl %r12d,%r11d movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi paddd %xmm7,%xmm0 rorl $2,%r14d addl %r11d,%edx psrld $7,%xmm6 addl %edi,%r11d movl %edx,%r13d pshufd $250,%xmm3,%xmm7 addl %r11d,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%r11d movl %r8d,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %r11d,%r14d pxor %xmm5,%xmm4 andl %edx,%r12d xorl %edx,%r13d pslld $11,%xmm5 addl 4(%rsp),%r10d movl %r11d,%edi pxor %xmm6,%xmm4 xorl %r9d,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %eax,%edi addl %r12d,%r10d pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d psrld $10,%xmm7 addl %r13d,%r10d xorl %eax,%r15d paddd %xmm4,%xmm0 rorl $2,%r14d addl %r10d,%ecx psrlq $17,%xmm6 addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %ecx,%r13d xorl %r8d,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d pshufd $128,%xmm7,%xmm7 xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d psrldq $8,%xmm7 xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d paddd %xmm7,%xmm0 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d pshufd $80,%xmm0,%xmm7 xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx movdqa %xmm7,%xmm6 addl %edi,%r9d movl %ebx,%r13d psrld $10,%xmm7 addl %r9d,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%r9d movl %ecx,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d psrlq $2,%xmm6 andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d pxor %xmm6,%xmm7 movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %r10d,%edi addl %r12d,%r8d movdqa 0(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d paddd %xmm7,%xmm0 rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d paddd %xmm0,%xmm6 movl %eax,%r13d addl %r8d,%r14d movdqa %xmm6,0(%rsp) rorl $14,%r13d movdqa %xmm2,%xmm4 movl %r14d,%r8d movl %ebx,%r12d movdqa %xmm0,%xmm7 rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d .byte 102,15,58,15,225,4 andl %eax,%r12d xorl %eax,%r13d .byte 102,15,58,15,251,4 addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %r9d,%r15d addl %r12d,%edx movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi paddd %xmm7,%xmm1 rorl $2,%r14d addl %edx,%r11d psrld $7,%xmm6 addl %edi,%edx movl %r11d,%r13d pshufd $250,%xmm0,%xmm7 addl %edx,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%edx movl %eax,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %edx,%r14d pxor %xmm5,%xmm4 andl %r11d,%r12d xorl %r11d,%r13d pslld $11,%xmm5 addl 20(%rsp),%ecx movl %edx,%edi pxor %xmm6,%xmm4 xorl %ebx,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %r8d,%edi addl %r12d,%ecx pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d psrld $10,%xmm7 addl %r13d,%ecx xorl %r8d,%r15d paddd %xmm4,%xmm1 rorl $2,%r14d addl %ecx,%r10d psrlq $17,%xmm6 addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %r10d,%r13d xorl %eax,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d pshufd $128,%xmm7,%xmm7 xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d psrldq $8,%xmm7 xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d paddd %xmm7,%xmm1 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx pshufd $80,%xmm1,%xmm7 xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d movdqa %xmm7,%xmm6 addl %edi,%ebx movl %r9d,%r13d psrld $10,%xmm7 addl %ebx,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%ebx movl %r10d,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d psrlq $2,%xmm6 andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax pxor %xmm6,%xmm7 movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %ecx,%edi addl %r12d,%eax movdqa 32(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d paddd %xmm7,%xmm1 rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax paddd %xmm1,%xmm6 movl %r8d,%r13d addl %eax,%r14d movdqa %xmm6,16(%rsp) rorl $14,%r13d movdqa %xmm3,%xmm4 movl %r14d,%eax movl %r9d,%r12d movdqa %xmm1,%xmm7 rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d .byte 102,15,58,15,226,4 andl %r8d,%r12d xorl %r8d,%r13d .byte 102,15,58,15,248,4 addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %ebx,%r15d addl %r12d,%r11d movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi paddd %xmm7,%xmm2 rorl $2,%r14d addl %r11d,%edx psrld $7,%xmm6 addl %edi,%r11d movl %edx,%r13d pshufd $250,%xmm1,%xmm7 addl %r11d,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%r11d movl %r8d,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %r11d,%r14d pxor %xmm5,%xmm4 andl %edx,%r12d xorl %edx,%r13d pslld $11,%xmm5 addl 36(%rsp),%r10d movl %r11d,%edi pxor %xmm6,%xmm4 xorl %r9d,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %eax,%edi addl %r12d,%r10d pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d psrld $10,%xmm7 addl %r13d,%r10d xorl %eax,%r15d paddd %xmm4,%xmm2 rorl $2,%r14d addl %r10d,%ecx psrlq $17,%xmm6 addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %ecx,%r13d xorl %r8d,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d pshufd $128,%xmm7,%xmm7 xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d psrldq $8,%xmm7 xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d paddd %xmm7,%xmm2 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d pshufd $80,%xmm2,%xmm7 xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx movdqa %xmm7,%xmm6 addl %edi,%r9d movl %ebx,%r13d psrld $10,%xmm7 addl %r9d,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%r9d movl %ecx,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d psrlq $2,%xmm6 andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d pxor %xmm6,%xmm7 movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %r10d,%edi addl %r12d,%r8d movdqa 64(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d paddd %xmm7,%xmm2 rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d paddd %xmm2,%xmm6 movl %eax,%r13d addl %r8d,%r14d movdqa %xmm6,32(%rsp) rorl $14,%r13d movdqa %xmm0,%xmm4 movl %r14d,%r8d movl %ebx,%r12d movdqa %xmm2,%xmm7 rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d .byte 102,15,58,15,227,4 andl %eax,%r12d xorl %eax,%r13d .byte 102,15,58,15,249,4 addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d movdqa %xmm4,%xmm5 xorl %r9d,%r15d addl %r12d,%edx movdqa %xmm4,%xmm6 rorl $6,%r13d andl %r15d,%edi psrld $3,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi paddd %xmm7,%xmm3 rorl $2,%r14d addl %edx,%r11d psrld $7,%xmm6 addl %edi,%edx movl %r11d,%r13d pshufd $250,%xmm2,%xmm7 addl %edx,%r14d rorl $14,%r13d pslld $14,%xmm5 movl %r14d,%edx movl %eax,%r12d pxor %xmm6,%xmm4 rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d psrld $11,%xmm6 xorl %edx,%r14d pxor %xmm5,%xmm4 andl %r11d,%r12d xorl %r11d,%r13d pslld $11,%xmm5 addl 52(%rsp),%ecx movl %edx,%edi pxor %xmm6,%xmm4 xorl %ebx,%r12d rorl $11,%r14d movdqa %xmm7,%xmm6 xorl %r8d,%edi addl %r12d,%ecx pxor %xmm5,%xmm4 rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d psrld $10,%xmm7 addl %r13d,%ecx xorl %r8d,%r15d paddd %xmm4,%xmm3 rorl $2,%r14d addl %ecx,%r10d psrlq $17,%xmm6 addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d pxor %xmm6,%xmm7 rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d psrlq $2,%xmm6 xorl %r10d,%r13d xorl %eax,%r12d pxor %xmm6,%xmm7 rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d pshufd $128,%xmm7,%xmm7 xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d psrldq $8,%xmm7 xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d paddd %xmm7,%xmm3 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx pshufd $80,%xmm3,%xmm7 xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d movdqa %xmm7,%xmm6 addl %edi,%ebx movl %r9d,%r13d psrld $10,%xmm7 addl %ebx,%r14d rorl $14,%r13d psrlq $17,%xmm6 movl %r14d,%ebx movl %r10d,%r12d pxor %xmm6,%xmm7 rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d psrlq $2,%xmm6 andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax pxor %xmm6,%xmm7 movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d pshufd $8,%xmm7,%xmm7 xorl %ecx,%edi addl %r12d,%eax movdqa 96(%rbp),%xmm6 rorl $6,%r13d andl %edi,%r15d pslldq $8,%xmm7 xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d paddd %xmm7,%xmm3 rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax paddd %xmm3,%xmm6 movl %r8d,%r13d addl %eax,%r14d movdqa %xmm6,48(%rsp) cmpb $0,131(%rbp) jne L$ssse3_00_47 rorl $14,%r13d movl %r14d,%eax movl %r9d,%r12d rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d xorl %ebx,%r15d addl %r12d,%r11d rorl $6,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi rorl $2,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d rorl $14,%r13d movl %r14d,%r11d movl %r8d,%r12d rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d rorl $11,%r14d xorl %eax,%edi addl %r12d,%r10d rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d rorl $2,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d xorl %ecx,%r13d xorl %r8d,%r12d rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d rorl $14,%r13d movl %r14d,%r9d movl %ecx,%r12d rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d xorl %r10d,%edi addl %r12d,%r8d rorl $6,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d rorl $14,%r13d movl %r14d,%r8d movl %ebx,%r12d rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d xorl %r9d,%r15d addl %r12d,%edx rorl $6,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi rorl $2,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d rorl $14,%r13d movl %r14d,%edx movl %eax,%r12d rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d rorl $11,%r14d xorl %r8d,%edi addl %r12d,%ecx rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d rorl $2,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d xorl %r10d,%r13d xorl %eax,%r12d rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d rorl $14,%r13d movl %r14d,%ebx movl %r10d,%r12d rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d xorl %ecx,%edi addl %r12d,%eax rorl $6,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d rorl $14,%r13d movl %r14d,%eax movl %r9d,%r12d rorl $9,%r14d xorl %r8d,%r13d xorl %r10d,%r12d rorl $5,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d rorl $11,%r14d xorl %ebx,%r15d addl %r12d,%r11d rorl $6,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi rorl $2,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d rorl $14,%r13d movl %r14d,%r11d movl %r8d,%r12d rorl $9,%r14d xorl %edx,%r13d xorl %r9d,%r12d rorl $5,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d rorl $11,%r14d xorl %eax,%edi addl %r12d,%r10d rorl $6,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d rorl $2,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d rorl $14,%r13d movl %r14d,%r10d movl %edx,%r12d rorl $9,%r14d xorl %ecx,%r13d xorl %r8d,%r12d rorl $5,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d rorl $11,%r14d xorl %r11d,%r15d addl %r12d,%r9d rorl $6,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi rorl $2,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d rorl $14,%r13d movl %r14d,%r9d movl %ecx,%r12d rorl $9,%r14d xorl %ebx,%r13d xorl %edx,%r12d rorl $5,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d rorl $11,%r14d xorl %r10d,%edi addl %r12d,%r8d rorl $6,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d rorl $2,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d rorl $14,%r13d movl %r14d,%r8d movl %ebx,%r12d rorl $9,%r14d xorl %eax,%r13d xorl %ecx,%r12d rorl $5,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d rorl $11,%r14d xorl %r9d,%r15d addl %r12d,%edx rorl $6,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi rorl $2,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d rorl $14,%r13d movl %r14d,%edx movl %eax,%r12d rorl $9,%r14d xorl %r11d,%r13d xorl %ebx,%r12d rorl $5,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d rorl $11,%r14d xorl %r8d,%edi addl %r12d,%ecx rorl $6,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d rorl $2,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d rorl $14,%r13d movl %r14d,%ecx movl %r11d,%r12d rorl $9,%r14d xorl %r10d,%r13d xorl %eax,%r12d rorl $5,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d rorl $11,%r14d xorl %edx,%r15d addl %r12d,%ebx rorl $6,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi rorl $2,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d rorl $14,%r13d movl %r14d,%ebx movl %r10d,%r12d rorl $9,%r14d xorl %r9d,%r13d xorl %r11d,%r12d rorl $5,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d rorl $11,%r14d xorl %ecx,%edi addl %r12d,%eax rorl $6,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d rorl $2,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d movq 64+0(%rsp),%rdi movl %r14d,%eax addl 0(%rdi),%eax leaq 64(%rsi),%rsi addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb L$loop_ssse3 movq 88(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$epilogue_ssse3: .byte 0xf3,0xc3 .p2align 6 GFp_sha256_block_data_order_avx: L$avx_shortcut: movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 shlq $4,%rdx subq $96,%rsp leaq (%rsi,%rdx,4),%rdx andq $-64,%rsp movq %rdi,64+0(%rsp) movq %rsi,64+8(%rsp) movq %rdx,64+16(%rsp) movq %rax,88(%rsp) L$prologue_avx: vzeroupper movl 0(%rdi),%eax movl 4(%rdi),%ebx movl 8(%rdi),%ecx movl 12(%rdi),%edx movl 16(%rdi),%r8d movl 20(%rdi),%r9d movl 24(%rdi),%r10d movl 28(%rdi),%r11d vmovdqa K256+512+32(%rip),%xmm8 vmovdqa K256+512+64(%rip),%xmm9 jmp L$loop_avx .p2align 4 L$loop_avx: vmovdqa K256+512(%rip),%xmm7 vmovdqu 0(%rsi),%xmm0 vmovdqu 16(%rsi),%xmm1 vmovdqu 32(%rsi),%xmm2 vmovdqu 48(%rsi),%xmm3 vpshufb %xmm7,%xmm0,%xmm0 leaq K256(%rip),%rbp vpshufb %xmm7,%xmm1,%xmm1 vpshufb %xmm7,%xmm2,%xmm2 vpaddd 0(%rbp),%xmm0,%xmm4 vpshufb %xmm7,%xmm3,%xmm3 vpaddd 32(%rbp),%xmm1,%xmm5 vpaddd 64(%rbp),%xmm2,%xmm6 vpaddd 96(%rbp),%xmm3,%xmm7 vmovdqa %xmm4,0(%rsp) movl %eax,%r14d vmovdqa %xmm5,16(%rsp) movl %ebx,%edi vmovdqa %xmm6,32(%rsp) xorl %ecx,%edi vmovdqa %xmm7,48(%rsp) movl %r8d,%r13d jmp L$avx_00_47 .p2align 4 L$avx_00_47: subq $-128,%rbp vpalignr $4,%xmm0,%xmm1,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d vpalignr $4,%xmm2,%xmm3,%xmm7 shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d vpaddd %xmm7,%xmm0,%xmm0 xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d vpsrld $3,%xmm4,%xmm7 xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi vpshufd $250,%xmm3,%xmm7 shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d vpsrld $11,%xmm6,%xmm6 movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d vpsrld $10,%xmm7,%xmm6 addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d vpaddd %xmm4,%xmm0,%xmm0 addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d vpsrlq $2,%xmm7,%xmm7 addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d vpxor %xmm7,%xmm6,%xmm6 movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d vpaddd %xmm6,%xmm0,%xmm0 andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d vpshufd $80,%xmm0,%xmm7 movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d vpxor %xmm7,%xmm6,%xmm6 xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx vpsrlq $2,%xmm7,%xmm7 addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d vpaddd %xmm6,%xmm0,%xmm0 shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d vpaddd 0(%rbp),%xmm0,%xmm6 xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d vmovdqa %xmm6,0(%rsp) vpalignr $4,%xmm1,%xmm2,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d vpalignr $4,%xmm3,%xmm0,%xmm7 shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d vpaddd %xmm7,%xmm1,%xmm1 xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d vpsrld $3,%xmm4,%xmm7 xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi vpshufd $250,%xmm0,%xmm7 shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx vpsrld $11,%xmm6,%xmm6 movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d vpsrld $10,%xmm7,%xmm6 addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d vpaddd %xmm4,%xmm1,%xmm1 addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d vpsrlq $2,%xmm7,%xmm7 addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx vpxor %xmm7,%xmm6,%xmm6 movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d vpaddd %xmm6,%xmm1,%xmm1 andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx vpshufd $80,%xmm1,%xmm7 movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx vpxor %xmm7,%xmm6,%xmm6 xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d vpsrlq $2,%xmm7,%xmm7 addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d vpaddd %xmm6,%xmm1,%xmm1 shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d vpaddd 32(%rbp),%xmm1,%xmm6 xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d vmovdqa %xmm6,16(%rsp) vpalignr $4,%xmm2,%xmm3,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d vpalignr $4,%xmm0,%xmm1,%xmm7 shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d vpaddd %xmm7,%xmm2,%xmm2 xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d vpsrld $3,%xmm4,%xmm7 xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi vpshufd $250,%xmm1,%xmm7 shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d vpsrld $11,%xmm6,%xmm6 movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d vpsrld $10,%xmm7,%xmm6 addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d vpaddd %xmm4,%xmm2,%xmm2 addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d vpsrlq $2,%xmm7,%xmm7 addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d vpxor %xmm7,%xmm6,%xmm6 movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d vpaddd %xmm6,%xmm2,%xmm2 andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d vpshufd $80,%xmm2,%xmm7 movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d vpxor %xmm7,%xmm6,%xmm6 xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx vpsrlq $2,%xmm7,%xmm7 addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d vpaddd %xmm6,%xmm2,%xmm2 shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d vpaddd 64(%rbp),%xmm2,%xmm6 xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d vmovdqa %xmm6,32(%rsp) vpalignr $4,%xmm3,%xmm0,%xmm4 shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d vpalignr $4,%xmm1,%xmm2,%xmm7 shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d vpsrld $7,%xmm4,%xmm6 shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d vpaddd %xmm7,%xmm3,%xmm3 xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d vpsrld $3,%xmm4,%xmm7 xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d vpslld $14,%xmm4,%xmm5 addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi vpxor %xmm6,%xmm7,%xmm4 xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi vpshufd $250,%xmm2,%xmm7 shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx vpsrld $11,%xmm6,%xmm6 movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d vpxor %xmm5,%xmm4,%xmm4 movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d vpslld $11,%xmm5,%xmm5 xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d vpxor %xmm6,%xmm4,%xmm4 xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d vpsrld $10,%xmm7,%xmm6 addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d vpxor %xmm5,%xmm4,%xmm4 shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx vpsrlq $17,%xmm7,%xmm7 shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d vpaddd %xmm4,%xmm3,%xmm3 addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d vpxor %xmm7,%xmm6,%xmm6 addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d vpsrlq $2,%xmm7,%xmm7 addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx vpxor %xmm7,%xmm6,%xmm6 movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d vpshufb %xmm8,%xmm6,%xmm6 xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d vpaddd %xmm6,%xmm3,%xmm3 andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx vpshufd $80,%xmm3,%xmm7 movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d vpsrld $10,%xmm7,%xmm6 xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d vpsrlq $17,%xmm7,%xmm7 andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx vpxor %xmm7,%xmm6,%xmm6 xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d vpsrlq $2,%xmm7,%xmm7 addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d vpxor %xmm7,%xmm6,%xmm6 shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d vpshufb %xmm9,%xmm6,%xmm6 shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d vpaddd %xmm6,%xmm3,%xmm3 shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d vpaddd 96(%rbp),%xmm3,%xmm6 xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d vmovdqa %xmm6,48(%rsp) cmpb $0,131(%rbp) jne L$avx_00_47 shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 0(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 4(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 8(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 12(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 16(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 20(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 24(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 28(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d shrdl $14,%r13d,%r13d movl %r14d,%eax movl %r9d,%r12d shrdl $9,%r14d,%r14d xorl %r8d,%r13d xorl %r10d,%r12d shrdl $5,%r13d,%r13d xorl %eax,%r14d andl %r8d,%r12d xorl %r8d,%r13d addl 32(%rsp),%r11d movl %eax,%r15d xorl %r10d,%r12d shrdl $11,%r14d,%r14d xorl %ebx,%r15d addl %r12d,%r11d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %eax,%r14d addl %r13d,%r11d xorl %ebx,%edi shrdl $2,%r14d,%r14d addl %r11d,%edx addl %edi,%r11d movl %edx,%r13d addl %r11d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r11d movl %r8d,%r12d shrdl $9,%r14d,%r14d xorl %edx,%r13d xorl %r9d,%r12d shrdl $5,%r13d,%r13d xorl %r11d,%r14d andl %edx,%r12d xorl %edx,%r13d addl 36(%rsp),%r10d movl %r11d,%edi xorl %r9d,%r12d shrdl $11,%r14d,%r14d xorl %eax,%edi addl %r12d,%r10d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r11d,%r14d addl %r13d,%r10d xorl %eax,%r15d shrdl $2,%r14d,%r14d addl %r10d,%ecx addl %r15d,%r10d movl %ecx,%r13d addl %r10d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r10d movl %edx,%r12d shrdl $9,%r14d,%r14d xorl %ecx,%r13d xorl %r8d,%r12d shrdl $5,%r13d,%r13d xorl %r10d,%r14d andl %ecx,%r12d xorl %ecx,%r13d addl 40(%rsp),%r9d movl %r10d,%r15d xorl %r8d,%r12d shrdl $11,%r14d,%r14d xorl %r11d,%r15d addl %r12d,%r9d shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r10d,%r14d addl %r13d,%r9d xorl %r11d,%edi shrdl $2,%r14d,%r14d addl %r9d,%ebx addl %edi,%r9d movl %ebx,%r13d addl %r9d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r9d movl %ecx,%r12d shrdl $9,%r14d,%r14d xorl %ebx,%r13d xorl %edx,%r12d shrdl $5,%r13d,%r13d xorl %r9d,%r14d andl %ebx,%r12d xorl %ebx,%r13d addl 44(%rsp),%r8d movl %r9d,%edi xorl %edx,%r12d shrdl $11,%r14d,%r14d xorl %r10d,%edi addl %r12d,%r8d shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %r9d,%r14d addl %r13d,%r8d xorl %r10d,%r15d shrdl $2,%r14d,%r14d addl %r8d,%eax addl %r15d,%r8d movl %eax,%r13d addl %r8d,%r14d shrdl $14,%r13d,%r13d movl %r14d,%r8d movl %ebx,%r12d shrdl $9,%r14d,%r14d xorl %eax,%r13d xorl %ecx,%r12d shrdl $5,%r13d,%r13d xorl %r8d,%r14d andl %eax,%r12d xorl %eax,%r13d addl 48(%rsp),%edx movl %r8d,%r15d xorl %ecx,%r12d shrdl $11,%r14d,%r14d xorl %r9d,%r15d addl %r12d,%edx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %r8d,%r14d addl %r13d,%edx xorl %r9d,%edi shrdl $2,%r14d,%r14d addl %edx,%r11d addl %edi,%edx movl %r11d,%r13d addl %edx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%edx movl %eax,%r12d shrdl $9,%r14d,%r14d xorl %r11d,%r13d xorl %ebx,%r12d shrdl $5,%r13d,%r13d xorl %edx,%r14d andl %r11d,%r12d xorl %r11d,%r13d addl 52(%rsp),%ecx movl %edx,%edi xorl %ebx,%r12d shrdl $11,%r14d,%r14d xorl %r8d,%edi addl %r12d,%ecx shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %edx,%r14d addl %r13d,%ecx xorl %r8d,%r15d shrdl $2,%r14d,%r14d addl %ecx,%r10d addl %r15d,%ecx movl %r10d,%r13d addl %ecx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ecx movl %r11d,%r12d shrdl $9,%r14d,%r14d xorl %r10d,%r13d xorl %eax,%r12d shrdl $5,%r13d,%r13d xorl %ecx,%r14d andl %r10d,%r12d xorl %r10d,%r13d addl 56(%rsp),%ebx movl %ecx,%r15d xorl %eax,%r12d shrdl $11,%r14d,%r14d xorl %edx,%r15d addl %r12d,%ebx shrdl $6,%r13d,%r13d andl %r15d,%edi xorl %ecx,%r14d addl %r13d,%ebx xorl %edx,%edi shrdl $2,%r14d,%r14d addl %ebx,%r9d addl %edi,%ebx movl %r9d,%r13d addl %ebx,%r14d shrdl $14,%r13d,%r13d movl %r14d,%ebx movl %r10d,%r12d shrdl $9,%r14d,%r14d xorl %r9d,%r13d xorl %r11d,%r12d shrdl $5,%r13d,%r13d xorl %ebx,%r14d andl %r9d,%r12d xorl %r9d,%r13d addl 60(%rsp),%eax movl %ebx,%edi xorl %r11d,%r12d shrdl $11,%r14d,%r14d xorl %ecx,%edi addl %r12d,%eax shrdl $6,%r13d,%r13d andl %edi,%r15d xorl %ebx,%r14d addl %r13d,%eax xorl %ecx,%r15d shrdl $2,%r14d,%r14d addl %eax,%r8d addl %r15d,%eax movl %r8d,%r13d addl %eax,%r14d movq 64+0(%rsp),%rdi movl %r14d,%eax addl 0(%rdi),%eax leaq 64(%rsi),%rsi addl 4(%rdi),%ebx addl 8(%rdi),%ecx addl 12(%rdi),%edx addl 16(%rdi),%r8d addl 20(%rdi),%r9d addl 24(%rdi),%r10d addl 28(%rdi),%r11d cmpq 64+16(%rsp),%rsi movl %eax,0(%rdi) movl %ebx,4(%rdi) movl %ecx,8(%rdi) movl %edx,12(%rdi) movl %r8d,16(%rdi) movl %r9d,20(%rdi) movl %r10d,24(%rdi) movl %r11d,28(%rdi) jb L$loop_avx movq 88(%rsp),%rsi vzeroupper movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$epilogue_avx: .byte 0xf3,0xc3 #endif ring-0.16.9/pregenerated/sha256-x86_64-nasm.obj000064400000000000000000001323271353224260300170050ustar0000000000000000dEi]ծ+.text4a5 p`.pdata4$u55 @0@.xdata405#6 @@@.debug$Su}6q<@B.debug$T ɮ@BH|$Ht$HHHLLE ESE[A@AE AP#AHSUATAUAVAWHH`HHH|$@Ht$HHT$PHD$X_OW DGDODWD_ fff.H-G1D&EAAAEE1A E1D$$A1E!AEE1A E1EADeA1A1AAD!AEA1DEHmEDfAEAADA1A D1Dd$E1!AED1A A1ADDeE11AAA!AEE1DEHmEDfAEAAAA1A E1Dd$E1A!AEE1A A1EEDeE1E1AED!AEA1DEHmEDf AEAAA1A 1Dd$ E1!AE1A A1ADDeE1D1AEA!AEE1DEHmEDfAEAAAA1A A1Dd$E1A!AAA1A A1EEDeE1E1ADD!AE1EDHmDDfEAAAE1A 1Dd$A1D!AA1A E1ADeA1D1ADA!AED1EDHmDDfEAAAEE1A A1Dd$A1E!AAA1A E1EADeA1A1AD!AE1EDHmDDfEAAADE1A D1Dd$A1D!AAD1A E1ADeA11AA!AED1EDHmDDf EAAAEE1A E1Dd$ A1E!AEE1A E1EADeA1A1AAD!AEA1DEHmEDf$AEAADA1A D1Dd$$E1!AED1A A1ADDeE11AAA!AEE1DEHmEDf(AEAAAA1A E1Dd$(E1A!AEE1A A1EEDeE1E1AED!AEA1DEHmEDf,AEAAA1A 1Dd$,E1!AE1A A1ADDeE1D1AEA!AEE1DEHmEDf0AEAAAA1A A1Dd$0E1A!AAA1A A1EEDeE1E1ADD!AE1EDHmDDf4EAAAE1A 1Dd$4A1D!AA1A E1ADeA1D1ADA!AED1EDHmDDf8EAAAEE1A A1Dd$8A1E!AAA1A E1EADeA1A1AD!AE1EDHmDDfm1'YRQ>m1'Y GQcg)) GQcg)) '8!.m,M 8S '8!.m,M 8STs e jv.,rTs e jv.,r迢KfpK£Qlǡ迢KfpK£Ql$օ5pj$օ5pjl7LwH'4l7LwH'4 9JNOʜ[o.h 9JNOʜ[o.htocxxȄnjtocxxȄnjlPxqlPxq        SHA256 block transform for x86_64, CRYPTOGAMS by ffffff.fff.H|$Ht$HHHLHSUATAUAVAWHHHHH|$@Ht$HHT$PHD$X)t$`)|$pD)$D)$_OW DGDODWD_ f.fo=ooNoV f8o^0H-f8foefom f8ffou@f8fo}`ffff$$Afl$ft$ 1f|$0EHAfoDEfoA E1E1AA1f:E!E1f:D$AE1A foA1EfoAD!frA1E1fADfrAAfpEAfrEEfA A1E1Afr E1fA!A1fr DT$DfE1A fo1EfAA!E1fr EA1fADfsEAEfAEAA fsA1E1fAE1A!fpA1DL$EfsE1A E1EAfD!E1EfpPD1ADfoAAfr EAfsEAfA A1A1AE1fsA!A1DD$ fDA1A fpD1EfouAA!fsE1EE1fADEfAEf4$AfoEAfoA A1A1AE1f:A!A1f:T$EA1A foE1DfoAD!frE1DD1fAAfrEfpAAfrDAfA E1A1Afr A1fE!E1fr L$fA1A foD1DfAA!A1fr DE1fAAfsDEAfADEA fsE1A1fAA1E!fpE1\$AfsA1A A1DAfD!A1DfpP1AAfoEfr AAfsDEfA E1E1AA1fsE!E1D$fE1A fp1Dfou AA!fsA1DA1fAADfEAft$AfoDEfoA E1E1AA1f:E!E1f:D\$ AE1A foA1EfoAD!frA1E1fADfrAAfpEAfrEEfA A1E1Afr E1fA!A1fr DT$$DfE1A fo1EfAA!E1fr EA1fADfsEAEfAEAA fsA1E1fAE1A!fpA1DL$(EfsE1A E1EAfD!E1EfpPD1ADfoAAfr EAfsEAfA A1A1AE1fsA!A1DD$,fDA1A fpD1Efou@AA!fsE1EE1fADEfAEft$ AfoEAfoA A1A1AE1f:A!A1f:T$0EA1A foE1DfoAD!frE1DD1fAAfrEfpAAfrDAfA E1A1Afr A1fE!E1fr L$4fA1A foD1DfAA!A1fr DE1fAAfsDEAfADEA fsE1A1fAA1E!fpE1\$8AfsA1A A1DAfD!A1DfpP1AAfoEfr AAfsDEfA E1E1AA1fsE!E1D$?@ABCDEFHJKLMNOPQRTUVXYZ\]^`abdefhij l mnpqrt!u$v(w+x.y1z5{8};~?BGJLPSVZ]`cgjlpsvz}  "%'+.148;>BEHLORUX\_cfilpsvz}    !"#%&')*+-./12 3 5679:; =#>&?)A-B0C4D7E:F=GAHDJGKKLNNSOVPYR]S`TcVgWjXmZp[t\w^z_~`bcdfghjklmnopqstuwxy{|} $'*.148;>AEHKORUY\_beilpsvy} #&)-0 3 6 9=@DGJMQSVZ\adfj m!o#s$v%y'|()+,-/01345789:;<=>@ABDEFHIJLMNPQRTUVXYZ\]^ `abcdef"g$i'j+k-m2n5o8q<r?sAuEvHwKyMzQ{T}W~[^aehknqux|  $')-/269<?BFKPUZ]adgknrvy}    ! " $%&'(*!+$,'-,/104172:3>4A6D7H8K:P;S<U>Y?\@_BcCfDiFlGpHsJuKyL|NOPRSTVWXZ[\]^`abcdfghiklmnoprstvwxz{| ~         # ' * - 0 3 7 < @ C G J M P S W [ ^ b e h k p u x { ~                                                # & ) - 0 5 8 ; ? B E I L O R V Y \ ` c f j m o r u y ~                  ! " # $ & ' ( * + , . / 0 2 3 4 6 7 8 : ; < > ? @ B C D F G H! J$ K( L+ M. N2 P5 Q9 R= S@ TD VH WK XN YS [X \[ ]^ ^a _e `h bk co dr fw gz h} j k l n o p r s t v w x z { | ~                                 # & * - 0 2 6 9 ; ? A D H K N Q T X ] b e i l o s v z ~                                               ! $ ( + . 1 6 ; > A D H K N R U Z ] _ c f i "m #p $s &v 'z (} * + , . / 0 2 3 4 6 7 8 : ; < = > @ A B C D F G H I K L M N O P R S T V WXZ[ \ ^_`bcd!f$g(h+j.k2l5n8o;p>rBsGtKvNwRxUyXz[|^}b~fimpsv{  !$'*.148;@CFJMPTWZ]adgknquxz}     "#$&"''(,*/+3,6-9.=0@1D2H3K4O6S7V8Y9^;c<f=i>l?p@sBvCzD}FGHJKLNOPRSTVWXZ[\^_`bcdfghijlmnoprstuwxyz {|~!$'+.158;=ADFJLOSVY\_cgmruy{~ 0@P`p 0@P`p 0@P`p  !"# %&'(&+(,+-..1/5091=2A5F6P8X9\:a;f<k=p>w?|@ABCDEFGHIJKLMNOPQRVWXYZ[\]^_`abcd e fghijk!l%m)n,o1p4q7r9s=tAuDvIwLxOyTzW{[|`}c~fjnqtx}  $'*.258;@CGJNQTY\`ehkosvy}  #'*-158=@CFJNQVX[ ` c g l orvz} !"#$%&'()*+,-./012345678 9 :;<=>?"@'A*B.C1D4E8F<G?HBIEJJKLLPMSNWOYP\QaRdShTmUpVsWwX{Y~Z[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  #&*.148<?DGJLPTW\_bgjnsvy}   #(+037:=AEHKNSVZ]adglosx{~                    # ) - 0 3 7 ; > A E I L Q T! W" Z# ^$ b% e& j' l( o) t* w+ {, - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y !Z $[ '\ ,] /^ 3_ 6` ;a >b Bc Ed He Lf Pg Sh Vi Yj ^k `l dm gn ko mp pq ur xs |t u v w x y z { | } ~                                   " % ( , / 2 6 9 < @ C F I K O R U X [ _ b e i l o s v y |                                                  ! $ ' , / 2 6 9 < @ C F I L P S V Y \ ` c f j m p t w z }                      ! " # $ % & ' ( ) * + , - . / 0 1 2 3  4  5  6 7  8  9  :  ;  <  = " > % ? ) @ , A / B 3 C 6 D 9 E = F @ G C H F I H J L K O L Q M T N W O [ P ^ Q a R e S h T k U o V r W u X x Y | Z ~ [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  ! ! ! ! ! ! ! ! ! ! %! (! +! /! 1! 4! 8! ;! >! A! D! H! K! N! Q! T! X! [! ^! b! e! h! l! o! r! u! z! }! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " " " " " " " " !" %" (" +" /" 2" 5" 9" <" ?" B" E" I" L" N" Q" T" X" [" ^" b" e" h" l" o" r" u" y" {" ~" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #! #" ## #$ #% #& #' #( #) #* "#+ %#, )#- +#. .#/ 2#0 5#1 8#2 ;#3 >#4 B#5 E#6 H#7 K#8 N#9 S#: V#< X#= \#> _#? b#@ e#A i#B m#C q#D u#F z#H |#I #J #K #L #M #N #O #P #R #T #U #V #W #X #Z #\ #^ #` #b #d #g #h #i #m $o $p $q $s $t $u $z $| $~ $ $ $ !$ #$ '$ .$ 2$ 6$ ;$ @$ E$ J$ O$ T$ ]$ f$ i$ k$ n$ q$ t$ x$ |$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % % % % % % % % "% %% +% 0% 3% 6% ;% @% C% F% J% M% Q% T% Y% \% a% d% i% l% q% t% x% {% ~% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % & & & & & & & & & #& && *& -& 2& 5& :& =& B& E& I& L& O& T& Y& \& _& d& i& l& o& t& y& |& & & &! &" &# &$ &% && &' &( &) &* &+ &, &- &. &/ &0 &1 &2 &3 &4 &5 &6 &7 &8 &9 &: &; &< &= &> &? &@ &A 'B 'C 'D 'E 'F 'G 'H 'I 'J #'K )'L .'M 1'N 4'O 9'P >'Q A'R D'S H'T K'U O'V R'W W'X Z'Y _'Z b'[ g'\ j'] o'^ r'_ v'` y'a |'b 'c 'd 'e 'f 'g 'h 'i 'j 'k 'l 'm 'n 'o 'p 'q 'r 's 't 'u 'v 'w 'x 'y 'z '{ '| '} '~ ' ' ' ' ' ' ' ( ( ( ( ( ( ( ( ( #( '( *( /( 2( 7( :( ?( B( F( I( L( P( U( X( [( `( e( h( k( p( u( x( {( ~( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ) ) ) ) !) &) )) ,) 1) 6) 9) <) @) C) H) K) P) S) X) [) `) c) h) k) o) r) u) w) |) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * * * * * * * * * !* $* )* ,* 1* 4* 9* <* @* C* F*! K*" P*# S*$ V*% [*& `*' c*( f*) k** p*+ s*, v*- y*. }*/ *0 *1 *2 *3 *4 *5 *6 *7 *8 *9 *: *; *< *= *> *? *@ *A *B *C *D *E *F *G *H *I *J *K *L *M *N *O *P *Q *R +S +T +U +V +W +X +Y !+Z &+[ )+\ ,+] 1+^ 6+_ 9+` <+a @+b C+c G+d J+e O+f R+g W+h Z+i _+j b+k g+l j+m n+n q+o t+p w+q |+r +s +t +u +v +w +x +y +z +{ +| +} +~ + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , , ", ', *, /, 2, 7, :, >, A, D, H, M, P, S, X, ], `, c, h, m, p, s, v, z, |, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , - - - - - - - "- %- *- -- 0- 3- 7- :- =- B- E- H- M- P- S- V- X- ]- `- c- f- i- n- q- t- y- |- - - ---------- - - - - ------------------- -!-".#.$ .% .&.'.(.).*.+ .,%.-(..+./0.03.16.2;.3>.4A.5D.6I.7L.8O.9T.:W.;Z.<_.=b.>e.?h.@k.Ap.Bs.Cv.Dy.E|.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].^._.`.a.b.c.d.e.f.g.h.i.j.k/l/m/n /o/p/q/r/s/t/u$/v'/w*/x-/y0/z5/{8/|;/}@/~C/F/K/N/Q/T/X/[/^/c/f/i/n/q/t/w/y/~//////////////////////////////////////000 000000!0$0'0*0,0104070:0=0B0E0H0M0P0S0X0[0^0a0f0i0l0q0s0v0{0~0000000000000000000000000000000000000011 111111 1#1 (1 +1 .1 31 6191<1?1D1G1J1M1P1U1X1[1`1c1f1k1n1q1t1 x1!{1"~1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H2I2J 2K 2L2M2N2O2P2Q"2R%2S(2T,2U/2V22W72X:2Y=2ZB2[E2\H2]K2^M2_R2`U2aW2bZ2c]2db2ee2fh2gm2hp2is2jx2k{2l~2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~2222222222222222222233 3333'3+3/33373;3?3B3G3L3N3P3Q3R3S3T3V3X3Z3\3]3a3e3l3p3t3w3{3~333333333333333333333333344 4 4444&4*4-4246494<4@4C4G4K4O4S4X4]4b4g4m4r4v4w4y4 {4 }4 4 4 444T2P:\ring\pregenerated\sha256-x86_64-nasm.objyasm 1.3.0%GFp_sha256_block_data_order1L$SEH_begin_GFp_sha256_block_data_orderL$avx_shortcutL$ssse3_shortcutL$prologueL$loopK256L$rounds_16_xxL$epilogue/L$SEH_end_GFp_sha256_block_data_order+GFp_sha256_block_data_order_ssse37L$SEH_begin_GFp_sha256_block_data_order_ssse3L$prologue_ssse3L$loop_ssse3L$ssse3_00_47L$epilogue_ssse35L$SEH_end_GFp_sha256_block_data_order_ssse3)GFp_sha256_block_data_order_avx5L$SEH_begin_GFp_sha256_block_data_order_avxL$prologue_avxL$loop_avxL$avx_00_47L$epilogue_avx3L$SEH_end_GFp_sha256_block_data_order_avxse_handlerL$in_prologue3  L$SEH_info_GFp_sha256_block_data_order9  L$SEH_info_GFp_sha256_block_data_order_ssse37  L$SEH_info_GFp_sha256_block_data_order_avxh l q q r $r Sr Wr mr qr r r r r r r r r r r r r "s &s Os Ss s s s s s s s s s s (t ,t St Wt t t t t t t t t t t u $u 6u :u Su" Wu" u# u# u$ u$ .fileg.text4,:V ~$L$loopK256P 9&JPWe#v#$ $f$$%B3#N3MdP3o 4.pdata$ } .xdata0 .debug$Su<.debug$T pregenerated\tmp\sha256-x86_64-nasm.asmGFp_ia32cap_PGFp_sha256_block_data_orderL$SEH_begin_GFp_sha256_block_data_orderL$avx_shortcutL$ssse3_shortcutL$prologueL$rounds_16_xxL$epilogueL$SEH_end_GFp_sha256_block_data_orderGFp_sha256_block_data_order_ssse3L$SEH_begin_GFp_sha256_block_data_order_ssse3L$prologue_ssse3L$loop_ssse3L$ssse3_00_47L$epilogue_ssse3L$SEH_end_GFp_sha256_block_data_order_ssse3GFp_sha256_block_data_order_avxL$SEH_begin_GFp_sha256_block_data_order_avxL$prologue_avxL$loop_avxL$avx_00_47L$epilogue_avxL$SEH_end_GFp_sha256_block_data_order_avx__imp_RtlVirtualUnwindse_handlerL$in_prologueL$SEH_info_GFp_sha256_block_data_orderL$SEH_info_GFp_sha256_block_data_order_ssse3L$SEH_info_GFp_sha256_block_data_order_avxring-0.16.9/pregenerated/sha512-armv4-ios32.S000064400000000000000000001245041353224261100165210ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Permission to use under GPL terms is granted. @ ==================================================================== @ SHA512 block procedure for ARMv4. September 2007. @ This code is ~4.5 (four and a half) times faster than code generated @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue @ Xscale PXA250 core]. @ @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 6% improvement on @ Cortex A8 core and ~40 cycles per processed byte. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 7% @ improvement on Coxtex A8 core and ~38 cycles per byte. @ March 2011. @ @ Add NEON implementation. On Cortex A8 it was measured to process @ one byte in 23.3 cycles or ~60% faster than integer-only code. @ August 2012. @ @ Improve NEON performance by 12% on Snapdragon S4. In absolute @ terms it's 22.6 cycles per byte, which is disappointing result. @ Technical writers asserted that 3-way S4 pipeline can sustain @ multiple NEON instructions per cycle, but dual NEON issue could @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html @ for further details. On side note Cortex-A15 processes one byte in @ 16 cycles. @ Byte order [in]dependence. ========================================= @ @ Originally caller was expected to maintain specific *dword* order in @ h[0-7], namely with most significant dword at *lower* address, which @ was reflected in below two parameters as 0 and 4. Now caller is @ expected to maintain native byte order for whole 64-bit values. #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 # define VFP_ABI_PUSH # define VFP_ABI_POP #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. #ifdef __ARMEL__ # define LO 0 # define HI 4 # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 #else # define HI 0 # define LO 4 # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 #endif .text #if defined(__thumb2__) .syntax unified .thumb # define adrl adr #else .code 32 #endif .align 5 K512: WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) LOPENSSL_armcap: .word GFp_armcap_P-Lsha512_block_data_order .skip 32-4 #else .skip 32 #endif .globl _GFp_sha512_block_data_order .private_extern _GFp_sha512_block_data_order #ifdef __thumb2__ .thumb_func _GFp_sha512_block_data_order #endif _GFp_sha512_block_data_order: Lsha512_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ _GFp_sha512_block_data_order #else adr r3,Lsha512_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV7_NEON bne LNEON #endif add r2,r1,r2,lsl#7 @ len to point at the end of inp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} sub r14,r3,#672 @ K512 sub sp,sp,#9*8 ldr r7,[r0,#32+LO] ldr r8,[r0,#32+HI] ldr r9, [r0,#48+LO] ldr r10, [r0,#48+HI] ldr r11, [r0,#56+LO] ldr r12, [r0,#56+HI] Loop: str r9, [sp,#48+0] str r10, [sp,#48+4] str r11, [sp,#56+0] str r12, [sp,#56+4] ldr r5,[r0,#0+LO] ldr r6,[r0,#0+HI] ldr r3,[r0,#8+LO] ldr r4,[r0,#8+HI] ldr r9, [r0,#16+LO] ldr r10, [r0,#16+HI] ldr r11, [r0,#24+LO] ldr r12, [r0,#24+HI] str r3,[sp,#8+0] str r4,[sp,#8+4] str r9, [sp,#16+0] str r10, [sp,#16+4] str r11, [sp,#24+0] str r12, [sp,#24+4] ldr r3,[r0,#40+LO] ldr r4,[r0,#40+HI] str r3,[sp,#40+0] str r4,[sp,#40+4] L00_15: #if __ARM_ARCH__<7 ldrb r3,[r1,#7] ldrb r9, [r1,#6] ldrb r10, [r1,#5] ldrb r11, [r1,#4] ldrb r4,[r1,#3] ldrb r12, [r1,#2] orr r3,r3,r9,lsl#8 ldrb r9, [r1,#1] orr r3,r3,r10,lsl#16 ldrb r10, [r1],#8 orr r3,r3,r11,lsl#24 orr r4,r4,r12,lsl#8 orr r4,r4,r9,lsl#16 orr r4,r4,r10,lsl#24 #else ldr r3,[r1,#4] ldr r4,[r1],#8 #ifdef __ARMEL__ rev r3,r3 rev r4,r4 #endif #endif @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 mov r9,r7,lsr#14 str r3,[sp,#64+0] mov r10,r8,lsr#14 str r4,[sp,#64+4] eor r9,r9,r8,lsl#18 ldr r11,[sp,#56+0] @ h.lo eor r10,r10,r7,lsl#18 ldr r12,[sp,#56+4] @ h.hi eor r9,r9,r7,lsr#18 eor r10,r10,r8,lsr#18 eor r9,r9,r8,lsl#14 eor r10,r10,r7,lsl#14 eor r9,r9,r8,lsr#9 eor r10,r10,r7,lsr#9 eor r9,r9,r7,lsl#23 eor r10,r10,r8,lsl#23 @ Sigma1(e) adds r3,r3,r9 ldr r9,[sp,#40+0] @ f.lo adc r4,r4,r10 @ T += Sigma1(e) ldr r10,[sp,#40+4] @ f.hi adds r3,r3,r11 ldr r11,[sp,#48+0] @ g.lo adc r4,r4,r12 @ T += h ldr r12,[sp,#48+4] @ g.hi eor r9,r9,r11 str r7,[sp,#32+0] eor r10,r10,r12 str r8,[sp,#32+4] and r9,r9,r7 str r5,[sp,#0+0] and r10,r10,r8 str r6,[sp,#0+4] eor r9,r9,r11 ldr r11,[r14,#LO] @ K[i].lo eor r10,r10,r12 @ Ch(e,f,g) ldr r12,[r14,#HI] @ K[i].hi adds r3,r3,r9 ldr r7,[sp,#24+0] @ d.lo adc r4,r4,r10 @ T += Ch(e,f,g) ldr r8,[sp,#24+4] @ d.hi adds r3,r3,r11 and r9,r11,#0xff adc r4,r4,r12 @ T += K[i] adds r7,r7,r3 ldr r11,[sp,#8+0] @ b.lo adc r8,r8,r4 @ d += T teq r9,#148 ldr r12,[sp,#16+0] @ c.lo #if __ARM_ARCH__>=7 it eq @ Thumb2 thing, sanity check in ARM #endif orreq r14,r14,#1 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 mov r9,r5,lsr#28 mov r10,r6,lsr#28 eor r9,r9,r6,lsl#4 eor r10,r10,r5,lsl#4 eor r9,r9,r6,lsr#2 eor r10,r10,r5,lsr#2 eor r9,r9,r5,lsl#30 eor r10,r10,r6,lsl#30 eor r9,r9,r6,lsr#7 eor r10,r10,r5,lsr#7 eor r9,r9,r5,lsl#25 eor r10,r10,r6,lsl#25 @ Sigma0(a) adds r3,r3,r9 and r9,r5,r11 adc r4,r4,r10 @ T += Sigma0(a) ldr r10,[sp,#8+4] @ b.hi orr r5,r5,r11 ldr r11,[sp,#16+4] @ c.hi and r5,r5,r12 and r12,r6,r10 orr r6,r6,r10 orr r5,r5,r9 @ Maj(a,b,c).lo and r6,r6,r11 adds r5,r5,r3 orr r6,r6,r12 @ Maj(a,b,c).hi sub sp,sp,#8 adc r6,r6,r4 @ h += T tst r14,#1 add r14,r14,#8 tst r14,#1 beq L00_15 ldr r9,[sp,#184+0] ldr r10,[sp,#184+4] bic r14,r14,#1 L16_79: @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 mov r3,r9,lsr#1 ldr r11,[sp,#80+0] mov r4,r10,lsr#1 ldr r12,[sp,#80+4] eor r3,r3,r10,lsl#31 eor r4,r4,r9,lsl#31 eor r3,r3,r9,lsr#8 eor r4,r4,r10,lsr#8 eor r3,r3,r10,lsl#24 eor r4,r4,r9,lsl#24 eor r3,r3,r9,lsr#7 eor r4,r4,r10,lsr#7 eor r3,r3,r10,lsl#25 @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 mov r9,r11,lsr#19 mov r10,r12,lsr#19 eor r9,r9,r12,lsl#13 eor r10,r10,r11,lsl#13 eor r9,r9,r12,lsr#29 eor r10,r10,r11,lsr#29 eor r9,r9,r11,lsl#3 eor r10,r10,r12,lsl#3 eor r9,r9,r11,lsr#6 eor r10,r10,r12,lsr#6 ldr r11,[sp,#120+0] eor r9,r9,r12,lsl#26 ldr r12,[sp,#120+4] adds r3,r3,r9 ldr r9,[sp,#192+0] adc r4,r4,r10 ldr r10,[sp,#192+4] adds r3,r3,r11 adc r4,r4,r12 adds r3,r3,r9 adc r4,r4,r10 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 mov r9,r7,lsr#14 str r3,[sp,#64+0] mov r10,r8,lsr#14 str r4,[sp,#64+4] eor r9,r9,r8,lsl#18 ldr r11,[sp,#56+0] @ h.lo eor r10,r10,r7,lsl#18 ldr r12,[sp,#56+4] @ h.hi eor r9,r9,r7,lsr#18 eor r10,r10,r8,lsr#18 eor r9,r9,r8,lsl#14 eor r10,r10,r7,lsl#14 eor r9,r9,r8,lsr#9 eor r10,r10,r7,lsr#9 eor r9,r9,r7,lsl#23 eor r10,r10,r8,lsl#23 @ Sigma1(e) adds r3,r3,r9 ldr r9,[sp,#40+0] @ f.lo adc r4,r4,r10 @ T += Sigma1(e) ldr r10,[sp,#40+4] @ f.hi adds r3,r3,r11 ldr r11,[sp,#48+0] @ g.lo adc r4,r4,r12 @ T += h ldr r12,[sp,#48+4] @ g.hi eor r9,r9,r11 str r7,[sp,#32+0] eor r10,r10,r12 str r8,[sp,#32+4] and r9,r9,r7 str r5,[sp,#0+0] and r10,r10,r8 str r6,[sp,#0+4] eor r9,r9,r11 ldr r11,[r14,#LO] @ K[i].lo eor r10,r10,r12 @ Ch(e,f,g) ldr r12,[r14,#HI] @ K[i].hi adds r3,r3,r9 ldr r7,[sp,#24+0] @ d.lo adc r4,r4,r10 @ T += Ch(e,f,g) ldr r8,[sp,#24+4] @ d.hi adds r3,r3,r11 and r9,r11,#0xff adc r4,r4,r12 @ T += K[i] adds r7,r7,r3 ldr r11,[sp,#8+0] @ b.lo adc r8,r8,r4 @ d += T teq r9,#23 ldr r12,[sp,#16+0] @ c.lo #if __ARM_ARCH__>=7 it eq @ Thumb2 thing, sanity check in ARM #endif orreq r14,r14,#1 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 mov r9,r5,lsr#28 mov r10,r6,lsr#28 eor r9,r9,r6,lsl#4 eor r10,r10,r5,lsl#4 eor r9,r9,r6,lsr#2 eor r10,r10,r5,lsr#2 eor r9,r9,r5,lsl#30 eor r10,r10,r6,lsl#30 eor r9,r9,r6,lsr#7 eor r10,r10,r5,lsr#7 eor r9,r9,r5,lsl#25 eor r10,r10,r6,lsl#25 @ Sigma0(a) adds r3,r3,r9 and r9,r5,r11 adc r4,r4,r10 @ T += Sigma0(a) ldr r10,[sp,#8+4] @ b.hi orr r5,r5,r11 ldr r11,[sp,#16+4] @ c.hi and r5,r5,r12 and r12,r6,r10 orr r6,r6,r10 orr r5,r5,r9 @ Maj(a,b,c).lo and r6,r6,r11 adds r5,r5,r3 orr r6,r6,r12 @ Maj(a,b,c).hi sub sp,sp,#8 adc r6,r6,r4 @ h += T tst r14,#1 add r14,r14,#8 #if __ARM_ARCH__>=7 ittt eq @ Thumb2 thing, sanity check in ARM #endif ldreq r9,[sp,#184+0] ldreq r10,[sp,#184+4] beq L16_79 bic r14,r14,#1 ldr r3,[sp,#8+0] ldr r4,[sp,#8+4] ldr r9, [r0,#0+LO] ldr r10, [r0,#0+HI] ldr r11, [r0,#8+LO] ldr r12, [r0,#8+HI] adds r9,r5,r9 str r9, [r0,#0+LO] adc r10,r6,r10 str r10, [r0,#0+HI] adds r11,r3,r11 str r11, [r0,#8+LO] adc r12,r4,r12 str r12, [r0,#8+HI] ldr r5,[sp,#16+0] ldr r6,[sp,#16+4] ldr r3,[sp,#24+0] ldr r4,[sp,#24+4] ldr r9, [r0,#16+LO] ldr r10, [r0,#16+HI] ldr r11, [r0,#24+LO] ldr r12, [r0,#24+HI] adds r9,r5,r9 str r9, [r0,#16+LO] adc r10,r6,r10 str r10, [r0,#16+HI] adds r11,r3,r11 str r11, [r0,#24+LO] adc r12,r4,r12 str r12, [r0,#24+HI] ldr r3,[sp,#40+0] ldr r4,[sp,#40+4] ldr r9, [r0,#32+LO] ldr r10, [r0,#32+HI] ldr r11, [r0,#40+LO] ldr r12, [r0,#40+HI] adds r7,r7,r9 str r7,[r0,#32+LO] adc r8,r8,r10 str r8,[r0,#32+HI] adds r11,r3,r11 str r11, [r0,#40+LO] adc r12,r4,r12 str r12, [r0,#40+HI] ldr r5,[sp,#48+0] ldr r6,[sp,#48+4] ldr r3,[sp,#56+0] ldr r4,[sp,#56+4] ldr r9, [r0,#48+LO] ldr r10, [r0,#48+HI] ldr r11, [r0,#56+LO] ldr r12, [r0,#56+HI] adds r9,r5,r9 str r9, [r0,#48+LO] adc r10,r6,r10 str r10, [r0,#48+HI] adds r11,r3,r11 str r11, [r0,#56+LO] adc r12,r4,r12 str r12, [r0,#56+HI] add sp,sp,#640 sub r14,r14,#640 teq r1,r2 bne Loop add sp,sp,#8*9 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif #if __ARM_MAX_ARCH__>=7 #ifdef __thumb2__ .thumb_func sha512_block_data_order_neon #endif .align 4 sha512_block_data_order_neon: LNEON: dmb @ errata #451034 on early Cortex A8 add r2,r1,r2,lsl#7 @ len to point at the end of inp adr r3,K512 VFP_ABI_PUSH vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context Loop_neon: vshr.u64 d24,d20,#14 @ 0 #if 0<16 vld1.64 {d0},[r1]! @ handles unaligned #endif vshr.u64 d25,d20,#18 #if 0>0 vadd.i64 d16,d30 @ h+=Maj from the past #endif vshr.u64 d26,d20,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 0<16 && defined(__ARMEL__) vrev64.8 d0,d0 #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d0 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 1 #if 1<16 vld1.64 {d1},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 1>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 1<16 && defined(__ARMEL__) vrev64.8 d1,d1 #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d1 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 d24,d18,#14 @ 2 #if 2<16 vld1.64 {d2},[r1]! @ handles unaligned #endif vshr.u64 d25,d18,#18 #if 2>0 vadd.i64 d22,d30 @ h+=Maj from the past #endif vshr.u64 d26,d18,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 2<16 && defined(__ARMEL__) vrev64.8 d2,d2 #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d2 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 3 #if 3<16 vld1.64 {d3},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 3>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 3<16 && defined(__ARMEL__) vrev64.8 d3,d3 #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d3 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 d24,d16,#14 @ 4 #if 4<16 vld1.64 {d4},[r1]! @ handles unaligned #endif vshr.u64 d25,d16,#18 #if 4>0 vadd.i64 d20,d30 @ h+=Maj from the past #endif vshr.u64 d26,d16,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 4<16 && defined(__ARMEL__) vrev64.8 d4,d4 #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d4 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 5 #if 5<16 vld1.64 {d5},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 5>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 5<16 && defined(__ARMEL__) vrev64.8 d5,d5 #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d5 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 d24,d22,#14 @ 6 #if 6<16 vld1.64 {d6},[r1]! @ handles unaligned #endif vshr.u64 d25,d22,#18 #if 6>0 vadd.i64 d18,d30 @ h+=Maj from the past #endif vshr.u64 d26,d22,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 6<16 && defined(__ARMEL__) vrev64.8 d6,d6 #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d6 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 7 #if 7<16 vld1.64 {d7},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 7>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 7<16 && defined(__ARMEL__) vrev64.8 d7,d7 #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d7 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 vshr.u64 d24,d20,#14 @ 8 #if 8<16 vld1.64 {d8},[r1]! @ handles unaligned #endif vshr.u64 d25,d20,#18 #if 8>0 vadd.i64 d16,d30 @ h+=Maj from the past #endif vshr.u64 d26,d20,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 8<16 && defined(__ARMEL__) vrev64.8 d8,d8 #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d8 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 9 #if 9<16 vld1.64 {d9},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 9>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 9<16 && defined(__ARMEL__) vrev64.8 d9,d9 #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d9 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 d24,d18,#14 @ 10 #if 10<16 vld1.64 {d10},[r1]! @ handles unaligned #endif vshr.u64 d25,d18,#18 #if 10>0 vadd.i64 d22,d30 @ h+=Maj from the past #endif vshr.u64 d26,d18,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 10<16 && defined(__ARMEL__) vrev64.8 d10,d10 #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d10 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 11 #if 11<16 vld1.64 {d11},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 11>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 11<16 && defined(__ARMEL__) vrev64.8 d11,d11 #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d11 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 d24,d16,#14 @ 12 #if 12<16 vld1.64 {d12},[r1]! @ handles unaligned #endif vshr.u64 d25,d16,#18 #if 12>0 vadd.i64 d20,d30 @ h+=Maj from the past #endif vshr.u64 d26,d16,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 12<16 && defined(__ARMEL__) vrev64.8 d12,d12 #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d12 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 13 #if 13<16 vld1.64 {d13},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 13>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 13<16 && defined(__ARMEL__) vrev64.8 d13,d13 #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d13 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 d24,d22,#14 @ 14 #if 14<16 vld1.64 {d14},[r1]! @ handles unaligned #endif vshr.u64 d25,d22,#18 #if 14>0 vadd.i64 d18,d30 @ h+=Maj from the past #endif vshr.u64 d26,d22,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 14<16 && defined(__ARMEL__) vrev64.8 d14,d14 #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d14 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 15 #if 15<16 vld1.64 {d15},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 15>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 15<16 && defined(__ARMEL__) vrev64.8 d15,d15 #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d15 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 mov r12,#4 L16_79_neon: subs r12,#1 vshr.u64 q12,q7,#19 vshr.u64 q13,q7,#61 vadd.i64 d16,d30 @ h+=Maj from the past vshr.u64 q15,q7,#6 vsli.64 q12,q7,#45 vext.8 q14,q0,q1,#8 @ X[i+1] vsli.64 q13,q7,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q0,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q4,q5,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d20,#14 @ from NEON_00_15 vadd.i64 q0,q14 vshr.u64 d25,d20,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d20,#41 @ from NEON_00_15 vadd.i64 q0,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 16<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d0 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 17 #if 17<16 vld1.64 {d1},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 17>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 17<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d1 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 q12,q0,#19 vshr.u64 q13,q0,#61 vadd.i64 d22,d30 @ h+=Maj from the past vshr.u64 q15,q0,#6 vsli.64 q12,q0,#45 vext.8 q14,q1,q2,#8 @ X[i+1] vsli.64 q13,q0,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q1,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q5,q6,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d18,#14 @ from NEON_00_15 vadd.i64 q1,q14 vshr.u64 d25,d18,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d18,#41 @ from NEON_00_15 vadd.i64 q1,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 18<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d2 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 19 #if 19<16 vld1.64 {d3},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 19>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 19<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d3 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 q12,q1,#19 vshr.u64 q13,q1,#61 vadd.i64 d20,d30 @ h+=Maj from the past vshr.u64 q15,q1,#6 vsli.64 q12,q1,#45 vext.8 q14,q2,q3,#8 @ X[i+1] vsli.64 q13,q1,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q2,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q6,q7,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d16,#14 @ from NEON_00_15 vadd.i64 q2,q14 vshr.u64 d25,d16,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d16,#41 @ from NEON_00_15 vadd.i64 q2,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 20<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d4 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 21 #if 21<16 vld1.64 {d5},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 21>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 21<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d5 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 q12,q2,#19 vshr.u64 q13,q2,#61 vadd.i64 d18,d30 @ h+=Maj from the past vshr.u64 q15,q2,#6 vsli.64 q12,q2,#45 vext.8 q14,q3,q4,#8 @ X[i+1] vsli.64 q13,q2,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q3,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q7,q0,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d22,#14 @ from NEON_00_15 vadd.i64 q3,q14 vshr.u64 d25,d22,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d22,#41 @ from NEON_00_15 vadd.i64 q3,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 22<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d6 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 23 #if 23<16 vld1.64 {d7},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 23>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 23<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d7 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 vshr.u64 q12,q3,#19 vshr.u64 q13,q3,#61 vadd.i64 d16,d30 @ h+=Maj from the past vshr.u64 q15,q3,#6 vsli.64 q12,q3,#45 vext.8 q14,q4,q5,#8 @ X[i+1] vsli.64 q13,q3,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q4,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q0,q1,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d20,#14 @ from NEON_00_15 vadd.i64 q4,q14 vshr.u64 d25,d20,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d20,#41 @ from NEON_00_15 vadd.i64 q4,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 24<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d8 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 25 #if 25<16 vld1.64 {d9},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 25>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 25<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d9 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 q12,q4,#19 vshr.u64 q13,q4,#61 vadd.i64 d22,d30 @ h+=Maj from the past vshr.u64 q15,q4,#6 vsli.64 q12,q4,#45 vext.8 q14,q5,q6,#8 @ X[i+1] vsli.64 q13,q4,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q5,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q1,q2,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d18,#14 @ from NEON_00_15 vadd.i64 q5,q14 vshr.u64 d25,d18,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d18,#41 @ from NEON_00_15 vadd.i64 q5,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 26<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d10 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 27 #if 27<16 vld1.64 {d11},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 27>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 27<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d11 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 q12,q5,#19 vshr.u64 q13,q5,#61 vadd.i64 d20,d30 @ h+=Maj from the past vshr.u64 q15,q5,#6 vsli.64 q12,q5,#45 vext.8 q14,q6,q7,#8 @ X[i+1] vsli.64 q13,q5,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q6,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q2,q3,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d16,#14 @ from NEON_00_15 vadd.i64 q6,q14 vshr.u64 d25,d16,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d16,#41 @ from NEON_00_15 vadd.i64 q6,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 28<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d12 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 29 #if 29<16 vld1.64 {d13},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 29>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 29<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d13 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 q12,q6,#19 vshr.u64 q13,q6,#61 vadd.i64 d18,d30 @ h+=Maj from the past vshr.u64 q15,q6,#6 vsli.64 q12,q6,#45 vext.8 q14,q7,q0,#8 @ X[i+1] vsli.64 q13,q6,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q7,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q3,q4,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d22,#14 @ from NEON_00_15 vadd.i64 q7,q14 vshr.u64 d25,d22,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d22,#41 @ from NEON_00_15 vadd.i64 q7,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 30<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d14 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 31 #if 31<16 vld1.64 {d15},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 31>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 31<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d15 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 bne L16_79_neon vadd.i64 d16,d30 @ h+=Maj from the past vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp vadd.i64 q8,q12 @ vectorized accumulate vadd.i64 q9,q13 vadd.i64 q10,q14 vadd.i64 q11,q15 vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context teq r1,r2 sub r3,#640 @ rewind K512 bne Loop_neon VFP_ABI_POP bx lr @ .word 0xe12fff1e #endif .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm _GFp_armcap_P,4 .non_lazy_symbol_pointer GFp_armcap_P: .indirect_symbol _GFp_armcap_P .long 0 .private_extern _GFp_armcap_P #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha512-armv4-linux32.S000064400000000000000000001246521353224261200170730ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. @ @ Licensed under the OpenSSL license (the "License"). You may not use @ this file except in compliance with the License. You can obtain a copy @ in the file LICENSE in the source distribution or at @ https://www.openssl.org/source/license.html @ ==================================================================== @ Written by Andy Polyakov for the OpenSSL @ project. The module is, however, dual licensed under OpenSSL and @ CRYPTOGAMS licenses depending on where you obtain it. For further @ details see http://www.openssl.org/~appro/cryptogams/. @ @ Permission to use under GPL terms is granted. @ ==================================================================== @ SHA512 block procedure for ARMv4. September 2007. @ This code is ~4.5 (four and a half) times faster than code generated @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue @ Xscale PXA250 core]. @ @ July 2010. @ @ Rescheduling for dual-issue pipeline resulted in 6% improvement on @ Cortex A8 core and ~40 cycles per processed byte. @ February 2011. @ @ Profiler-assisted and platform-specific optimization resulted in 7% @ improvement on Coxtex A8 core and ~38 cycles per byte. @ March 2011. @ @ Add NEON implementation. On Cortex A8 it was measured to process @ one byte in 23.3 cycles or ~60% faster than integer-only code. @ August 2012. @ @ Improve NEON performance by 12% on Snapdragon S4. In absolute @ terms it's 22.6 cycles per byte, which is disappointing result. @ Technical writers asserted that 3-way S4 pipeline can sustain @ multiple NEON instructions per cycle, but dual NEON issue could @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html @ for further details. On side note Cortex-A15 processes one byte in @ 16 cycles. @ Byte order [in]dependence. ========================================= @ @ Originally caller was expected to maintain specific *dword* order in @ h[0-7], namely with most significant dword at *lower* address, which @ was reflected in below two parameters as 0 and 4. Now caller is @ expected to maintain native byte order for whole 64-bit values. #ifndef __KERNEL__ # include # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} # define VFP_ABI_POP vldmia sp!,{d8-d15} #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ 7 # define VFP_ABI_PUSH # define VFP_ABI_POP #endif @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. .arch armv7-a #ifdef __ARMEL__ # define LO 0 # define HI 4 # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 #else # define HI 0 # define LO 4 # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 #endif .text #if defined(__thumb2__) .syntax unified .thumb # define adrl adr #else .code 32 #endif .type K512,%object .align 5 K512: WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) .size K512,.-K512 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .LOPENSSL_armcap: .word GFp_armcap_P-.Lsha512_block_data_order .skip 32-4 #else .skip 32 #endif .globl GFp_sha512_block_data_order .hidden GFp_sha512_block_data_order .type GFp_sha512_block_data_order,%function GFp_sha512_block_data_order: .Lsha512_block_data_order: #if __ARM_ARCH__<7 && !defined(__thumb2__) sub r3,pc,#8 @ GFp_sha512_block_data_order #else adr r3,.Lsha512_block_data_order #endif #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) ldr r12,.LOPENSSL_armcap ldr r12,[r3,r12] @ GFp_armcap_P #ifdef __APPLE__ ldr r12,[r12] #endif tst r12,#ARMV7_NEON bne .LNEON #endif add r2,r1,r2,lsl#7 @ len to point at the end of inp stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} sub r14,r3,#672 @ K512 sub sp,sp,#9*8 ldr r7,[r0,#32+LO] ldr r8,[r0,#32+HI] ldr r9, [r0,#48+LO] ldr r10, [r0,#48+HI] ldr r11, [r0,#56+LO] ldr r12, [r0,#56+HI] .Loop: str r9, [sp,#48+0] str r10, [sp,#48+4] str r11, [sp,#56+0] str r12, [sp,#56+4] ldr r5,[r0,#0+LO] ldr r6,[r0,#0+HI] ldr r3,[r0,#8+LO] ldr r4,[r0,#8+HI] ldr r9, [r0,#16+LO] ldr r10, [r0,#16+HI] ldr r11, [r0,#24+LO] ldr r12, [r0,#24+HI] str r3,[sp,#8+0] str r4,[sp,#8+4] str r9, [sp,#16+0] str r10, [sp,#16+4] str r11, [sp,#24+0] str r12, [sp,#24+4] ldr r3,[r0,#40+LO] ldr r4,[r0,#40+HI] str r3,[sp,#40+0] str r4,[sp,#40+4] .L00_15: #if __ARM_ARCH__<7 ldrb r3,[r1,#7] ldrb r9, [r1,#6] ldrb r10, [r1,#5] ldrb r11, [r1,#4] ldrb r4,[r1,#3] ldrb r12, [r1,#2] orr r3,r3,r9,lsl#8 ldrb r9, [r1,#1] orr r3,r3,r10,lsl#16 ldrb r10, [r1],#8 orr r3,r3,r11,lsl#24 orr r4,r4,r12,lsl#8 orr r4,r4,r9,lsl#16 orr r4,r4,r10,lsl#24 #else ldr r3,[r1,#4] ldr r4,[r1],#8 #ifdef __ARMEL__ rev r3,r3 rev r4,r4 #endif #endif @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 mov r9,r7,lsr#14 str r3,[sp,#64+0] mov r10,r8,lsr#14 str r4,[sp,#64+4] eor r9,r9,r8,lsl#18 ldr r11,[sp,#56+0] @ h.lo eor r10,r10,r7,lsl#18 ldr r12,[sp,#56+4] @ h.hi eor r9,r9,r7,lsr#18 eor r10,r10,r8,lsr#18 eor r9,r9,r8,lsl#14 eor r10,r10,r7,lsl#14 eor r9,r9,r8,lsr#9 eor r10,r10,r7,lsr#9 eor r9,r9,r7,lsl#23 eor r10,r10,r8,lsl#23 @ Sigma1(e) adds r3,r3,r9 ldr r9,[sp,#40+0] @ f.lo adc r4,r4,r10 @ T += Sigma1(e) ldr r10,[sp,#40+4] @ f.hi adds r3,r3,r11 ldr r11,[sp,#48+0] @ g.lo adc r4,r4,r12 @ T += h ldr r12,[sp,#48+4] @ g.hi eor r9,r9,r11 str r7,[sp,#32+0] eor r10,r10,r12 str r8,[sp,#32+4] and r9,r9,r7 str r5,[sp,#0+0] and r10,r10,r8 str r6,[sp,#0+4] eor r9,r9,r11 ldr r11,[r14,#LO] @ K[i].lo eor r10,r10,r12 @ Ch(e,f,g) ldr r12,[r14,#HI] @ K[i].hi adds r3,r3,r9 ldr r7,[sp,#24+0] @ d.lo adc r4,r4,r10 @ T += Ch(e,f,g) ldr r8,[sp,#24+4] @ d.hi adds r3,r3,r11 and r9,r11,#0xff adc r4,r4,r12 @ T += K[i] adds r7,r7,r3 ldr r11,[sp,#8+0] @ b.lo adc r8,r8,r4 @ d += T teq r9,#148 ldr r12,[sp,#16+0] @ c.lo #if __ARM_ARCH__>=7 it eq @ Thumb2 thing, sanity check in ARM #endif orreq r14,r14,#1 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 mov r9,r5,lsr#28 mov r10,r6,lsr#28 eor r9,r9,r6,lsl#4 eor r10,r10,r5,lsl#4 eor r9,r9,r6,lsr#2 eor r10,r10,r5,lsr#2 eor r9,r9,r5,lsl#30 eor r10,r10,r6,lsl#30 eor r9,r9,r6,lsr#7 eor r10,r10,r5,lsr#7 eor r9,r9,r5,lsl#25 eor r10,r10,r6,lsl#25 @ Sigma0(a) adds r3,r3,r9 and r9,r5,r11 adc r4,r4,r10 @ T += Sigma0(a) ldr r10,[sp,#8+4] @ b.hi orr r5,r5,r11 ldr r11,[sp,#16+4] @ c.hi and r5,r5,r12 and r12,r6,r10 orr r6,r6,r10 orr r5,r5,r9 @ Maj(a,b,c).lo and r6,r6,r11 adds r5,r5,r3 orr r6,r6,r12 @ Maj(a,b,c).hi sub sp,sp,#8 adc r6,r6,r4 @ h += T tst r14,#1 add r14,r14,#8 tst r14,#1 beq .L00_15 ldr r9,[sp,#184+0] ldr r10,[sp,#184+4] bic r14,r14,#1 .L16_79: @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 mov r3,r9,lsr#1 ldr r11,[sp,#80+0] mov r4,r10,lsr#1 ldr r12,[sp,#80+4] eor r3,r3,r10,lsl#31 eor r4,r4,r9,lsl#31 eor r3,r3,r9,lsr#8 eor r4,r4,r10,lsr#8 eor r3,r3,r10,lsl#24 eor r4,r4,r9,lsl#24 eor r3,r3,r9,lsr#7 eor r4,r4,r10,lsr#7 eor r3,r3,r10,lsl#25 @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 mov r9,r11,lsr#19 mov r10,r12,lsr#19 eor r9,r9,r12,lsl#13 eor r10,r10,r11,lsl#13 eor r9,r9,r12,lsr#29 eor r10,r10,r11,lsr#29 eor r9,r9,r11,lsl#3 eor r10,r10,r12,lsl#3 eor r9,r9,r11,lsr#6 eor r10,r10,r12,lsr#6 ldr r11,[sp,#120+0] eor r9,r9,r12,lsl#26 ldr r12,[sp,#120+4] adds r3,r3,r9 ldr r9,[sp,#192+0] adc r4,r4,r10 ldr r10,[sp,#192+4] adds r3,r3,r11 adc r4,r4,r12 adds r3,r3,r9 adc r4,r4,r10 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 mov r9,r7,lsr#14 str r3,[sp,#64+0] mov r10,r8,lsr#14 str r4,[sp,#64+4] eor r9,r9,r8,lsl#18 ldr r11,[sp,#56+0] @ h.lo eor r10,r10,r7,lsl#18 ldr r12,[sp,#56+4] @ h.hi eor r9,r9,r7,lsr#18 eor r10,r10,r8,lsr#18 eor r9,r9,r8,lsl#14 eor r10,r10,r7,lsl#14 eor r9,r9,r8,lsr#9 eor r10,r10,r7,lsr#9 eor r9,r9,r7,lsl#23 eor r10,r10,r8,lsl#23 @ Sigma1(e) adds r3,r3,r9 ldr r9,[sp,#40+0] @ f.lo adc r4,r4,r10 @ T += Sigma1(e) ldr r10,[sp,#40+4] @ f.hi adds r3,r3,r11 ldr r11,[sp,#48+0] @ g.lo adc r4,r4,r12 @ T += h ldr r12,[sp,#48+4] @ g.hi eor r9,r9,r11 str r7,[sp,#32+0] eor r10,r10,r12 str r8,[sp,#32+4] and r9,r9,r7 str r5,[sp,#0+0] and r10,r10,r8 str r6,[sp,#0+4] eor r9,r9,r11 ldr r11,[r14,#LO] @ K[i].lo eor r10,r10,r12 @ Ch(e,f,g) ldr r12,[r14,#HI] @ K[i].hi adds r3,r3,r9 ldr r7,[sp,#24+0] @ d.lo adc r4,r4,r10 @ T += Ch(e,f,g) ldr r8,[sp,#24+4] @ d.hi adds r3,r3,r11 and r9,r11,#0xff adc r4,r4,r12 @ T += K[i] adds r7,r7,r3 ldr r11,[sp,#8+0] @ b.lo adc r8,r8,r4 @ d += T teq r9,#23 ldr r12,[sp,#16+0] @ c.lo #if __ARM_ARCH__>=7 it eq @ Thumb2 thing, sanity check in ARM #endif orreq r14,r14,#1 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 mov r9,r5,lsr#28 mov r10,r6,lsr#28 eor r9,r9,r6,lsl#4 eor r10,r10,r5,lsl#4 eor r9,r9,r6,lsr#2 eor r10,r10,r5,lsr#2 eor r9,r9,r5,lsl#30 eor r10,r10,r6,lsl#30 eor r9,r9,r6,lsr#7 eor r10,r10,r5,lsr#7 eor r9,r9,r5,lsl#25 eor r10,r10,r6,lsl#25 @ Sigma0(a) adds r3,r3,r9 and r9,r5,r11 adc r4,r4,r10 @ T += Sigma0(a) ldr r10,[sp,#8+4] @ b.hi orr r5,r5,r11 ldr r11,[sp,#16+4] @ c.hi and r5,r5,r12 and r12,r6,r10 orr r6,r6,r10 orr r5,r5,r9 @ Maj(a,b,c).lo and r6,r6,r11 adds r5,r5,r3 orr r6,r6,r12 @ Maj(a,b,c).hi sub sp,sp,#8 adc r6,r6,r4 @ h += T tst r14,#1 add r14,r14,#8 #if __ARM_ARCH__>=7 ittt eq @ Thumb2 thing, sanity check in ARM #endif ldreq r9,[sp,#184+0] ldreq r10,[sp,#184+4] beq .L16_79 bic r14,r14,#1 ldr r3,[sp,#8+0] ldr r4,[sp,#8+4] ldr r9, [r0,#0+LO] ldr r10, [r0,#0+HI] ldr r11, [r0,#8+LO] ldr r12, [r0,#8+HI] adds r9,r5,r9 str r9, [r0,#0+LO] adc r10,r6,r10 str r10, [r0,#0+HI] adds r11,r3,r11 str r11, [r0,#8+LO] adc r12,r4,r12 str r12, [r0,#8+HI] ldr r5,[sp,#16+0] ldr r6,[sp,#16+4] ldr r3,[sp,#24+0] ldr r4,[sp,#24+4] ldr r9, [r0,#16+LO] ldr r10, [r0,#16+HI] ldr r11, [r0,#24+LO] ldr r12, [r0,#24+HI] adds r9,r5,r9 str r9, [r0,#16+LO] adc r10,r6,r10 str r10, [r0,#16+HI] adds r11,r3,r11 str r11, [r0,#24+LO] adc r12,r4,r12 str r12, [r0,#24+HI] ldr r3,[sp,#40+0] ldr r4,[sp,#40+4] ldr r9, [r0,#32+LO] ldr r10, [r0,#32+HI] ldr r11, [r0,#40+LO] ldr r12, [r0,#40+HI] adds r7,r7,r9 str r7,[r0,#32+LO] adc r8,r8,r10 str r8,[r0,#32+HI] adds r11,r3,r11 str r11, [r0,#40+LO] adc r12,r4,r12 str r12, [r0,#40+HI] ldr r5,[sp,#48+0] ldr r6,[sp,#48+4] ldr r3,[sp,#56+0] ldr r4,[sp,#56+4] ldr r9, [r0,#48+LO] ldr r10, [r0,#48+HI] ldr r11, [r0,#56+LO] ldr r12, [r0,#56+HI] adds r9,r5,r9 str r9, [r0,#48+LO] adc r10,r6,r10 str r10, [r0,#48+HI] adds r11,r3,r11 str r11, [r0,#56+LO] adc r12,r4,r12 str r12, [r0,#56+HI] add sp,sp,#640 sub r14,r14,#640 teq r1,r2 bne .Loop add sp,sp,#8*9 @ destroy frame #if __ARM_ARCH__>=5 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} #else ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} tst lr,#1 moveq pc,lr @ be binary compatible with V4, yet .word 0xe12fff1e @ interoperable with Thumb ISA:-) #endif .size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order #if __ARM_MAX_ARCH__>=7 .arch armv7-a .fpu neon .type sha512_block_data_order_neon,%function .align 4 sha512_block_data_order_neon: .LNEON: dmb @ errata #451034 on early Cortex A8 add r2,r1,r2,lsl#7 @ len to point at the end of inp adr r3,K512 VFP_ABI_PUSH vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context .Loop_neon: vshr.u64 d24,d20,#14 @ 0 #if 0<16 vld1.64 {d0},[r1]! @ handles unaligned #endif vshr.u64 d25,d20,#18 #if 0>0 vadd.i64 d16,d30 @ h+=Maj from the past #endif vshr.u64 d26,d20,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 0<16 && defined(__ARMEL__) vrev64.8 d0,d0 #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d0 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 1 #if 1<16 vld1.64 {d1},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 1>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 1<16 && defined(__ARMEL__) vrev64.8 d1,d1 #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d1 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 d24,d18,#14 @ 2 #if 2<16 vld1.64 {d2},[r1]! @ handles unaligned #endif vshr.u64 d25,d18,#18 #if 2>0 vadd.i64 d22,d30 @ h+=Maj from the past #endif vshr.u64 d26,d18,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 2<16 && defined(__ARMEL__) vrev64.8 d2,d2 #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d2 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 3 #if 3<16 vld1.64 {d3},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 3>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 3<16 && defined(__ARMEL__) vrev64.8 d3,d3 #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d3 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 d24,d16,#14 @ 4 #if 4<16 vld1.64 {d4},[r1]! @ handles unaligned #endif vshr.u64 d25,d16,#18 #if 4>0 vadd.i64 d20,d30 @ h+=Maj from the past #endif vshr.u64 d26,d16,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 4<16 && defined(__ARMEL__) vrev64.8 d4,d4 #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d4 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 5 #if 5<16 vld1.64 {d5},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 5>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 5<16 && defined(__ARMEL__) vrev64.8 d5,d5 #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d5 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 d24,d22,#14 @ 6 #if 6<16 vld1.64 {d6},[r1]! @ handles unaligned #endif vshr.u64 d25,d22,#18 #if 6>0 vadd.i64 d18,d30 @ h+=Maj from the past #endif vshr.u64 d26,d22,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 6<16 && defined(__ARMEL__) vrev64.8 d6,d6 #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d6 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 7 #if 7<16 vld1.64 {d7},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 7>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 7<16 && defined(__ARMEL__) vrev64.8 d7,d7 #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d7 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 vshr.u64 d24,d20,#14 @ 8 #if 8<16 vld1.64 {d8},[r1]! @ handles unaligned #endif vshr.u64 d25,d20,#18 #if 8>0 vadd.i64 d16,d30 @ h+=Maj from the past #endif vshr.u64 d26,d20,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 8<16 && defined(__ARMEL__) vrev64.8 d8,d8 #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d8 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 9 #if 9<16 vld1.64 {d9},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 9>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 9<16 && defined(__ARMEL__) vrev64.8 d9,d9 #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d9 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 d24,d18,#14 @ 10 #if 10<16 vld1.64 {d10},[r1]! @ handles unaligned #endif vshr.u64 d25,d18,#18 #if 10>0 vadd.i64 d22,d30 @ h+=Maj from the past #endif vshr.u64 d26,d18,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 10<16 && defined(__ARMEL__) vrev64.8 d10,d10 #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d10 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 11 #if 11<16 vld1.64 {d11},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 11>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 11<16 && defined(__ARMEL__) vrev64.8 d11,d11 #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d11 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 d24,d16,#14 @ 12 #if 12<16 vld1.64 {d12},[r1]! @ handles unaligned #endif vshr.u64 d25,d16,#18 #if 12>0 vadd.i64 d20,d30 @ h+=Maj from the past #endif vshr.u64 d26,d16,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 12<16 && defined(__ARMEL__) vrev64.8 d12,d12 #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d12 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 13 #if 13<16 vld1.64 {d13},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 13>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 13<16 && defined(__ARMEL__) vrev64.8 d13,d13 #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d13 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 d24,d22,#14 @ 14 #if 14<16 vld1.64 {d14},[r1]! @ handles unaligned #endif vshr.u64 d25,d22,#18 #if 14>0 vadd.i64 d18,d30 @ h+=Maj from the past #endif vshr.u64 d26,d22,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 14<16 && defined(__ARMEL__) vrev64.8 d14,d14 #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d14 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 15 #if 15<16 vld1.64 {d15},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 15>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 15<16 && defined(__ARMEL__) vrev64.8 d15,d15 #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d15 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 mov r12,#4 .L16_79_neon: subs r12,#1 vshr.u64 q12,q7,#19 vshr.u64 q13,q7,#61 vadd.i64 d16,d30 @ h+=Maj from the past vshr.u64 q15,q7,#6 vsli.64 q12,q7,#45 vext.8 q14,q0,q1,#8 @ X[i+1] vsli.64 q13,q7,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q0,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q4,q5,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d20,#14 @ from NEON_00_15 vadd.i64 q0,q14 vshr.u64 d25,d20,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d20,#41 @ from NEON_00_15 vadd.i64 q0,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 16<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d0 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 17 #if 17<16 vld1.64 {d1},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 17>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 17<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d1 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 q12,q0,#19 vshr.u64 q13,q0,#61 vadd.i64 d22,d30 @ h+=Maj from the past vshr.u64 q15,q0,#6 vsli.64 q12,q0,#45 vext.8 q14,q1,q2,#8 @ X[i+1] vsli.64 q13,q0,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q1,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q5,q6,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d18,#14 @ from NEON_00_15 vadd.i64 q1,q14 vshr.u64 d25,d18,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d18,#41 @ from NEON_00_15 vadd.i64 q1,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 18<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d2 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 19 #if 19<16 vld1.64 {d3},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 19>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 19<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d3 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 q12,q1,#19 vshr.u64 q13,q1,#61 vadd.i64 d20,d30 @ h+=Maj from the past vshr.u64 q15,q1,#6 vsli.64 q12,q1,#45 vext.8 q14,q2,q3,#8 @ X[i+1] vsli.64 q13,q1,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q2,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q6,q7,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d16,#14 @ from NEON_00_15 vadd.i64 q2,q14 vshr.u64 d25,d16,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d16,#41 @ from NEON_00_15 vadd.i64 q2,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 20<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d4 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 21 #if 21<16 vld1.64 {d5},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 21>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 21<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d5 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 q12,q2,#19 vshr.u64 q13,q2,#61 vadd.i64 d18,d30 @ h+=Maj from the past vshr.u64 q15,q2,#6 vsli.64 q12,q2,#45 vext.8 q14,q3,q4,#8 @ X[i+1] vsli.64 q13,q2,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q3,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q7,q0,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d22,#14 @ from NEON_00_15 vadd.i64 q3,q14 vshr.u64 d25,d22,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d22,#41 @ from NEON_00_15 vadd.i64 q3,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 22<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d6 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 23 #if 23<16 vld1.64 {d7},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 23>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 23<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d7 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 vshr.u64 q12,q3,#19 vshr.u64 q13,q3,#61 vadd.i64 d16,d30 @ h+=Maj from the past vshr.u64 q15,q3,#6 vsli.64 q12,q3,#45 vext.8 q14,q4,q5,#8 @ X[i+1] vsli.64 q13,q3,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q4,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q0,q1,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d20,#14 @ from NEON_00_15 vadd.i64 q4,q14 vshr.u64 d25,d20,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d20,#41 @ from NEON_00_15 vadd.i64 q4,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d20,#50 vsli.64 d25,d20,#46 vmov d29,d20 vsli.64 d26,d20,#23 #if 24<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d21,d22 @ Ch(e,f,g) vshr.u64 d24,d16,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d23 vshr.u64 d25,d16,#34 vsli.64 d24,d16,#36 vadd.i64 d27,d26 vshr.u64 d26,d16,#39 vadd.i64 d28,d8 vsli.64 d25,d16,#30 veor d30,d16,d17 vsli.64 d26,d16,#25 veor d23,d24,d25 vadd.i64 d27,d28 vbsl d30,d18,d17 @ Maj(a,b,c) veor d23,d26 @ Sigma0(a) vadd.i64 d19,d27 vadd.i64 d30,d27 @ vadd.i64 d23,d30 vshr.u64 d24,d19,#14 @ 25 #if 25<16 vld1.64 {d9},[r1]! @ handles unaligned #endif vshr.u64 d25,d19,#18 #if 25>0 vadd.i64 d23,d30 @ h+=Maj from the past #endif vshr.u64 d26,d19,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d19,#50 vsli.64 d25,d19,#46 vmov d29,d19 vsli.64 d26,d19,#23 #if 25<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d20,d21 @ Ch(e,f,g) vshr.u64 d24,d23,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d22 vshr.u64 d25,d23,#34 vsli.64 d24,d23,#36 vadd.i64 d27,d26 vshr.u64 d26,d23,#39 vadd.i64 d28,d9 vsli.64 d25,d23,#30 veor d30,d23,d16 vsli.64 d26,d23,#25 veor d22,d24,d25 vadd.i64 d27,d28 vbsl d30,d17,d16 @ Maj(a,b,c) veor d22,d26 @ Sigma0(a) vadd.i64 d18,d27 vadd.i64 d30,d27 @ vadd.i64 d22,d30 vshr.u64 q12,q4,#19 vshr.u64 q13,q4,#61 vadd.i64 d22,d30 @ h+=Maj from the past vshr.u64 q15,q4,#6 vsli.64 q12,q4,#45 vext.8 q14,q5,q6,#8 @ X[i+1] vsli.64 q13,q4,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q5,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q1,q2,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d18,#14 @ from NEON_00_15 vadd.i64 q5,q14 vshr.u64 d25,d18,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d18,#41 @ from NEON_00_15 vadd.i64 q5,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d18,#50 vsli.64 d25,d18,#46 vmov d29,d18 vsli.64 d26,d18,#23 #if 26<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d19,d20 @ Ch(e,f,g) vshr.u64 d24,d22,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d21 vshr.u64 d25,d22,#34 vsli.64 d24,d22,#36 vadd.i64 d27,d26 vshr.u64 d26,d22,#39 vadd.i64 d28,d10 vsli.64 d25,d22,#30 veor d30,d22,d23 vsli.64 d26,d22,#25 veor d21,d24,d25 vadd.i64 d27,d28 vbsl d30,d16,d23 @ Maj(a,b,c) veor d21,d26 @ Sigma0(a) vadd.i64 d17,d27 vadd.i64 d30,d27 @ vadd.i64 d21,d30 vshr.u64 d24,d17,#14 @ 27 #if 27<16 vld1.64 {d11},[r1]! @ handles unaligned #endif vshr.u64 d25,d17,#18 #if 27>0 vadd.i64 d21,d30 @ h+=Maj from the past #endif vshr.u64 d26,d17,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d17,#50 vsli.64 d25,d17,#46 vmov d29,d17 vsli.64 d26,d17,#23 #if 27<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d18,d19 @ Ch(e,f,g) vshr.u64 d24,d21,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d20 vshr.u64 d25,d21,#34 vsli.64 d24,d21,#36 vadd.i64 d27,d26 vshr.u64 d26,d21,#39 vadd.i64 d28,d11 vsli.64 d25,d21,#30 veor d30,d21,d22 vsli.64 d26,d21,#25 veor d20,d24,d25 vadd.i64 d27,d28 vbsl d30,d23,d22 @ Maj(a,b,c) veor d20,d26 @ Sigma0(a) vadd.i64 d16,d27 vadd.i64 d30,d27 @ vadd.i64 d20,d30 vshr.u64 q12,q5,#19 vshr.u64 q13,q5,#61 vadd.i64 d20,d30 @ h+=Maj from the past vshr.u64 q15,q5,#6 vsli.64 q12,q5,#45 vext.8 q14,q6,q7,#8 @ X[i+1] vsli.64 q13,q5,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q6,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q2,q3,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d16,#14 @ from NEON_00_15 vadd.i64 q6,q14 vshr.u64 d25,d16,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d16,#41 @ from NEON_00_15 vadd.i64 q6,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d16,#50 vsli.64 d25,d16,#46 vmov d29,d16 vsli.64 d26,d16,#23 #if 28<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d17,d18 @ Ch(e,f,g) vshr.u64 d24,d20,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d19 vshr.u64 d25,d20,#34 vsli.64 d24,d20,#36 vadd.i64 d27,d26 vshr.u64 d26,d20,#39 vadd.i64 d28,d12 vsli.64 d25,d20,#30 veor d30,d20,d21 vsli.64 d26,d20,#25 veor d19,d24,d25 vadd.i64 d27,d28 vbsl d30,d22,d21 @ Maj(a,b,c) veor d19,d26 @ Sigma0(a) vadd.i64 d23,d27 vadd.i64 d30,d27 @ vadd.i64 d19,d30 vshr.u64 d24,d23,#14 @ 29 #if 29<16 vld1.64 {d13},[r1]! @ handles unaligned #endif vshr.u64 d25,d23,#18 #if 29>0 vadd.i64 d19,d30 @ h+=Maj from the past #endif vshr.u64 d26,d23,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d23,#50 vsli.64 d25,d23,#46 vmov d29,d23 vsli.64 d26,d23,#23 #if 29<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d16,d17 @ Ch(e,f,g) vshr.u64 d24,d19,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d18 vshr.u64 d25,d19,#34 vsli.64 d24,d19,#36 vadd.i64 d27,d26 vshr.u64 d26,d19,#39 vadd.i64 d28,d13 vsli.64 d25,d19,#30 veor d30,d19,d20 vsli.64 d26,d19,#25 veor d18,d24,d25 vadd.i64 d27,d28 vbsl d30,d21,d20 @ Maj(a,b,c) veor d18,d26 @ Sigma0(a) vadd.i64 d22,d27 vadd.i64 d30,d27 @ vadd.i64 d18,d30 vshr.u64 q12,q6,#19 vshr.u64 q13,q6,#61 vadd.i64 d18,d30 @ h+=Maj from the past vshr.u64 q15,q6,#6 vsli.64 q12,q6,#45 vext.8 q14,q7,q0,#8 @ X[i+1] vsli.64 q13,q6,#3 veor q15,q12 vshr.u64 q12,q14,#1 veor q15,q13 @ sigma1(X[i+14]) vshr.u64 q13,q14,#8 vadd.i64 q7,q15 vshr.u64 q15,q14,#7 vsli.64 q12,q14,#63 vsli.64 q13,q14,#56 vext.8 q14,q3,q4,#8 @ X[i+9] veor q15,q12 vshr.u64 d24,d22,#14 @ from NEON_00_15 vadd.i64 q7,q14 vshr.u64 d25,d22,#18 @ from NEON_00_15 veor q15,q13 @ sigma0(X[i+1]) vshr.u64 d26,d22,#41 @ from NEON_00_15 vadd.i64 q7,q15 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d22,#50 vsli.64 d25,d22,#46 vmov d29,d22 vsli.64 d26,d22,#23 #if 30<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d23,d16 @ Ch(e,f,g) vshr.u64 d24,d18,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d17 vshr.u64 d25,d18,#34 vsli.64 d24,d18,#36 vadd.i64 d27,d26 vshr.u64 d26,d18,#39 vadd.i64 d28,d14 vsli.64 d25,d18,#30 veor d30,d18,d19 vsli.64 d26,d18,#25 veor d17,d24,d25 vadd.i64 d27,d28 vbsl d30,d20,d19 @ Maj(a,b,c) veor d17,d26 @ Sigma0(a) vadd.i64 d21,d27 vadd.i64 d30,d27 @ vadd.i64 d17,d30 vshr.u64 d24,d21,#14 @ 31 #if 31<16 vld1.64 {d15},[r1]! @ handles unaligned #endif vshr.u64 d25,d21,#18 #if 31>0 vadd.i64 d17,d30 @ h+=Maj from the past #endif vshr.u64 d26,d21,#41 vld1.64 {d28},[r3,:64]! @ K[i++] vsli.64 d24,d21,#50 vsli.64 d25,d21,#46 vmov d29,d21 vsli.64 d26,d21,#23 #if 31<16 && defined(__ARMEL__) vrev64.8 , #endif veor d25,d24 vbsl d29,d22,d23 @ Ch(e,f,g) vshr.u64 d24,d17,#28 veor d26,d25 @ Sigma1(e) vadd.i64 d27,d29,d16 vshr.u64 d25,d17,#34 vsli.64 d24,d17,#36 vadd.i64 d27,d26 vshr.u64 d26,d17,#39 vadd.i64 d28,d15 vsli.64 d25,d17,#30 veor d30,d17,d18 vsli.64 d26,d17,#25 veor d16,d24,d25 vadd.i64 d27,d28 vbsl d30,d19,d18 @ Maj(a,b,c) veor d16,d26 @ Sigma0(a) vadd.i64 d20,d27 vadd.i64 d30,d27 @ vadd.i64 d16,d30 bne .L16_79_neon vadd.i64 d16,d30 @ h+=Maj from the past vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp vadd.i64 q8,q12 @ vectorized accumulate vadd.i64 q9,q13 vadd.i64 q10,q14 vadd.i64 q11,q15 vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context teq r1,r2 sub r3,#640 @ rewind K512 bne .Loop_neon VFP_ABI_POP bx lr @ .word 0xe12fff1e .size sha512_block_data_order_neon,.-sha512_block_data_order_neon #endif .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha512-armv8-ios64.S000064400000000000000000000731451353224260600165420ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the OpenSSL license (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy // in the file LICENSE in the source distribution or at // https://www.openssl.org/source/license.html // ==================================================================== // Written by Andy Polyakov for the OpenSSL // project. The module is, however, dual licensed under OpenSSL and // CRYPTOGAMS licenses depending on where you obtain it. For further // details see http://www.openssl.org/~appro/cryptogams/. // // Permission to use under GPLv2 terms is granted. // ==================================================================== // // SHA256/512 for ARMv8. // // Performance in cycles per processed byte and improvement coefficient // over code generated with "default" compiler: // // SHA256-hw SHA256(*) SHA512 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) // Denver 2.01 10.5 (+26%) 6.70 (+8%) // X-Gene 20.0 (+100%) 12.8 (+300%(***)) // Mongoose 2.36 13.0 (+50%) 8.36 (+33%) // // (*) Software SHA256 results are of lesser relevance, presented // mostly for informational purposes. // (**) The result is a trade-off: it's possible to improve it by // 10% (or by 1 cycle per round), but at the cost of 20% loss // on Cortex-A53 (or by 4 cycles per round). // (***) Super-impressive coefficients over gcc-generated code are // indication of some compiler "pathology", most notably code // generated with -mgeneral-regs-only is significanty faster // and the gap is only 40-90%. #ifndef __KERNEL__ # include #endif .text .globl _GFp_sha512_block_data_order .private_extern _GFp_sha512_block_data_order .align 6 _GFp_sha512_block_data_order: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#4*8 ldp x20,x21,[x0] // load context ldp x22,x23,[x0,#2*8] ldp x24,x25,[x0,#4*8] add x2,x1,x2,lsl#7 // end of input ldp x26,x27,[x0,#6*8] adrp x30,LK512@PAGE add x30,x30,LK512@PAGEOFF stp x0,x2,[x29,#96] Loop: ldp x3,x4,[x1],#2*8 ldr x19,[x30],#8 // *K++ eor x28,x21,x22 // magic seed str x1,[x29,#112] #ifndef __ARMEB__ rev x3,x3 // 0 #endif ror x16,x24,#14 add x27,x27,x19 // h+=K[i] eor x6,x24,x24,ror#23 and x17,x25,x24 bic x19,x26,x24 add x27,x27,x3 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x6,ror#18 // Sigma1(e) ror x6,x20,#28 add x27,x27,x17 // h+=Ch(e,f,g) eor x17,x20,x20,ror#5 add x27,x27,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x23,x23,x27 // d+=h eor x28,x28,x21 // Maj(a,b,c) eor x17,x6,x17,ror#34 // Sigma0(a) add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x27,x27,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x4,x4 // 1 #endif ldp x5,x6,[x1],#2*8 add x27,x27,x17 // h+=Sigma0(a) ror x16,x23,#14 add x26,x26,x28 // h+=K[i] eor x7,x23,x23,ror#23 and x17,x24,x23 bic x28,x25,x23 add x26,x26,x4 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x7,ror#18 // Sigma1(e) ror x7,x27,#28 add x26,x26,x17 // h+=Ch(e,f,g) eor x17,x27,x27,ror#5 add x26,x26,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x22,x22,x26 // d+=h eor x19,x19,x20 // Maj(a,b,c) eor x17,x7,x17,ror#34 // Sigma0(a) add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x26,x26,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x5,x5 // 2 #endif add x26,x26,x17 // h+=Sigma0(a) ror x16,x22,#14 add x25,x25,x19 // h+=K[i] eor x8,x22,x22,ror#23 and x17,x23,x22 bic x19,x24,x22 add x25,x25,x5 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x8,ror#18 // Sigma1(e) ror x8,x26,#28 add x25,x25,x17 // h+=Ch(e,f,g) eor x17,x26,x26,ror#5 add x25,x25,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x21,x21,x25 // d+=h eor x28,x28,x27 // Maj(a,b,c) eor x17,x8,x17,ror#34 // Sigma0(a) add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x25,x25,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x6,x6 // 3 #endif ldp x7,x8,[x1],#2*8 add x25,x25,x17 // h+=Sigma0(a) ror x16,x21,#14 add x24,x24,x28 // h+=K[i] eor x9,x21,x21,ror#23 and x17,x22,x21 bic x28,x23,x21 add x24,x24,x6 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x9,ror#18 // Sigma1(e) ror x9,x25,#28 add x24,x24,x17 // h+=Ch(e,f,g) eor x17,x25,x25,ror#5 add x24,x24,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x20,x20,x24 // d+=h eor x19,x19,x26 // Maj(a,b,c) eor x17,x9,x17,ror#34 // Sigma0(a) add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x24,x24,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x7,x7 // 4 #endif add x24,x24,x17 // h+=Sigma0(a) ror x16,x20,#14 add x23,x23,x19 // h+=K[i] eor x10,x20,x20,ror#23 and x17,x21,x20 bic x19,x22,x20 add x23,x23,x7 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x10,ror#18 // Sigma1(e) ror x10,x24,#28 add x23,x23,x17 // h+=Ch(e,f,g) eor x17,x24,x24,ror#5 add x23,x23,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x27,x27,x23 // d+=h eor x28,x28,x25 // Maj(a,b,c) eor x17,x10,x17,ror#34 // Sigma0(a) add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x23,x23,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x8,x8 // 5 #endif ldp x9,x10,[x1],#2*8 add x23,x23,x17 // h+=Sigma0(a) ror x16,x27,#14 add x22,x22,x28 // h+=K[i] eor x11,x27,x27,ror#23 and x17,x20,x27 bic x28,x21,x27 add x22,x22,x8 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x11,ror#18 // Sigma1(e) ror x11,x23,#28 add x22,x22,x17 // h+=Ch(e,f,g) eor x17,x23,x23,ror#5 add x22,x22,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x26,x26,x22 // d+=h eor x19,x19,x24 // Maj(a,b,c) eor x17,x11,x17,ror#34 // Sigma0(a) add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x22,x22,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x9,x9 // 6 #endif add x22,x22,x17 // h+=Sigma0(a) ror x16,x26,#14 add x21,x21,x19 // h+=K[i] eor x12,x26,x26,ror#23 and x17,x27,x26 bic x19,x20,x26 add x21,x21,x9 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x12,ror#18 // Sigma1(e) ror x12,x22,#28 add x21,x21,x17 // h+=Ch(e,f,g) eor x17,x22,x22,ror#5 add x21,x21,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x25,x25,x21 // d+=h eor x28,x28,x23 // Maj(a,b,c) eor x17,x12,x17,ror#34 // Sigma0(a) add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x21,x21,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x10,x10 // 7 #endif ldp x11,x12,[x1],#2*8 add x21,x21,x17 // h+=Sigma0(a) ror x16,x25,#14 add x20,x20,x28 // h+=K[i] eor x13,x25,x25,ror#23 and x17,x26,x25 bic x28,x27,x25 add x20,x20,x10 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x13,ror#18 // Sigma1(e) ror x13,x21,#28 add x20,x20,x17 // h+=Ch(e,f,g) eor x17,x21,x21,ror#5 add x20,x20,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x24,x24,x20 // d+=h eor x19,x19,x22 // Maj(a,b,c) eor x17,x13,x17,ror#34 // Sigma0(a) add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x20,x20,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x11,x11 // 8 #endif add x20,x20,x17 // h+=Sigma0(a) ror x16,x24,#14 add x27,x27,x19 // h+=K[i] eor x14,x24,x24,ror#23 and x17,x25,x24 bic x19,x26,x24 add x27,x27,x11 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x14,ror#18 // Sigma1(e) ror x14,x20,#28 add x27,x27,x17 // h+=Ch(e,f,g) eor x17,x20,x20,ror#5 add x27,x27,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x23,x23,x27 // d+=h eor x28,x28,x21 // Maj(a,b,c) eor x17,x14,x17,ror#34 // Sigma0(a) add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x27,x27,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x12,x12 // 9 #endif ldp x13,x14,[x1],#2*8 add x27,x27,x17 // h+=Sigma0(a) ror x16,x23,#14 add x26,x26,x28 // h+=K[i] eor x15,x23,x23,ror#23 and x17,x24,x23 bic x28,x25,x23 add x26,x26,x12 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x15,ror#18 // Sigma1(e) ror x15,x27,#28 add x26,x26,x17 // h+=Ch(e,f,g) eor x17,x27,x27,ror#5 add x26,x26,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x22,x22,x26 // d+=h eor x19,x19,x20 // Maj(a,b,c) eor x17,x15,x17,ror#34 // Sigma0(a) add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x26,x26,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x13,x13 // 10 #endif add x26,x26,x17 // h+=Sigma0(a) ror x16,x22,#14 add x25,x25,x19 // h+=K[i] eor x0,x22,x22,ror#23 and x17,x23,x22 bic x19,x24,x22 add x25,x25,x13 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x0,ror#18 // Sigma1(e) ror x0,x26,#28 add x25,x25,x17 // h+=Ch(e,f,g) eor x17,x26,x26,ror#5 add x25,x25,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x21,x21,x25 // d+=h eor x28,x28,x27 // Maj(a,b,c) eor x17,x0,x17,ror#34 // Sigma0(a) add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x25,x25,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x14,x14 // 11 #endif ldp x15,x0,[x1],#2*8 add x25,x25,x17 // h+=Sigma0(a) str x6,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] eor x6,x21,x21,ror#23 and x17,x22,x21 bic x28,x23,x21 add x24,x24,x14 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x6,ror#18 // Sigma1(e) ror x6,x25,#28 add x24,x24,x17 // h+=Ch(e,f,g) eor x17,x25,x25,ror#5 add x24,x24,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x20,x20,x24 // d+=h eor x19,x19,x26 // Maj(a,b,c) eor x17,x6,x17,ror#34 // Sigma0(a) add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x24,x24,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x15,x15 // 12 #endif add x24,x24,x17 // h+=Sigma0(a) str x7,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] eor x7,x20,x20,ror#23 and x17,x21,x20 bic x19,x22,x20 add x23,x23,x15 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x7,ror#18 // Sigma1(e) ror x7,x24,#28 add x23,x23,x17 // h+=Ch(e,f,g) eor x17,x24,x24,ror#5 add x23,x23,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x27,x27,x23 // d+=h eor x28,x28,x25 // Maj(a,b,c) eor x17,x7,x17,ror#34 // Sigma0(a) add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x23,x23,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x0,x0 // 13 #endif ldp x1,x2,[x1] add x23,x23,x17 // h+=Sigma0(a) str x8,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] eor x8,x27,x27,ror#23 and x17,x20,x27 bic x28,x21,x27 add x22,x22,x0 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x8,ror#18 // Sigma1(e) ror x8,x23,#28 add x22,x22,x17 // h+=Ch(e,f,g) eor x17,x23,x23,ror#5 add x22,x22,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x26,x26,x22 // d+=h eor x19,x19,x24 // Maj(a,b,c) eor x17,x8,x17,ror#34 // Sigma0(a) add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x22,x22,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x1,x1 // 14 #endif ldr x6,[sp,#24] add x22,x22,x17 // h+=Sigma0(a) str x9,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] eor x9,x26,x26,ror#23 and x17,x27,x26 bic x19,x20,x26 add x21,x21,x1 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x9,ror#18 // Sigma1(e) ror x9,x22,#28 add x21,x21,x17 // h+=Ch(e,f,g) eor x17,x22,x22,ror#5 add x21,x21,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x25,x25,x21 // d+=h eor x28,x28,x23 // Maj(a,b,c) eor x17,x9,x17,ror#34 // Sigma0(a) add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x21,x21,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x2,x2 // 15 #endif ldr x7,[sp,#0] add x21,x21,x17 // h+=Sigma0(a) str x10,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x9,x4,#1 and x17,x26,x25 ror x8,x1,#19 bic x28,x27,x25 ror x10,x21,#28 add x20,x20,x2 // h+=X[i] eor x16,x16,x25,ror#18 eor x9,x9,x4,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x10,x10,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x8,x8,x1,ror#61 eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x10,x21,ror#39 // Sigma0(a) eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) add x3,x3,x12 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x3,x3,x9 add x20,x20,x17 // h+=Sigma0(a) add x3,x3,x8 Loop_16_xx: ldr x8,[sp,#8] str x11,[sp,#0] ror x16,x24,#14 add x27,x27,x19 // h+=K[i] ror x10,x5,#1 and x17,x25,x24 ror x9,x2,#19 bic x19,x26,x24 ror x11,x20,#28 add x27,x27,x3 // h+=X[i] eor x16,x16,x24,ror#18 eor x10,x10,x5,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x24,ror#41 // Sigma1(e) eor x11,x11,x20,ror#34 add x27,x27,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x9,x9,x2,ror#61 eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) add x27,x27,x16 // h+=Sigma1(e) eor x28,x28,x21 // Maj(a,b,c) eor x17,x11,x20,ror#39 // Sigma0(a) eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) add x4,x4,x13 add x23,x23,x27 // d+=h add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x4,x4,x10 add x27,x27,x17 // h+=Sigma0(a) add x4,x4,x9 ldr x9,[sp,#16] str x12,[sp,#8] ror x16,x23,#14 add x26,x26,x28 // h+=K[i] ror x11,x6,#1 and x17,x24,x23 ror x10,x3,#19 bic x28,x25,x23 ror x12,x27,#28 add x26,x26,x4 // h+=X[i] eor x16,x16,x23,ror#18 eor x11,x11,x6,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x23,ror#41 // Sigma1(e) eor x12,x12,x27,ror#34 add x26,x26,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x10,x10,x3,ror#61 eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) add x26,x26,x16 // h+=Sigma1(e) eor x19,x19,x20 // Maj(a,b,c) eor x17,x12,x27,ror#39 // Sigma0(a) eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) add x5,x5,x14 add x22,x22,x26 // d+=h add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x5,x5,x11 add x26,x26,x17 // h+=Sigma0(a) add x5,x5,x10 ldr x10,[sp,#24] str x13,[sp,#16] ror x16,x22,#14 add x25,x25,x19 // h+=K[i] ror x12,x7,#1 and x17,x23,x22 ror x11,x4,#19 bic x19,x24,x22 ror x13,x26,#28 add x25,x25,x5 // h+=X[i] eor x16,x16,x22,ror#18 eor x12,x12,x7,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x22,ror#41 // Sigma1(e) eor x13,x13,x26,ror#34 add x25,x25,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x11,x11,x4,ror#61 eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) add x25,x25,x16 // h+=Sigma1(e) eor x28,x28,x27 // Maj(a,b,c) eor x17,x13,x26,ror#39 // Sigma0(a) eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) add x6,x6,x15 add x21,x21,x25 // d+=h add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x6,x6,x12 add x25,x25,x17 // h+=Sigma0(a) add x6,x6,x11 ldr x11,[sp,#0] str x14,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] ror x13,x8,#1 and x17,x22,x21 ror x12,x5,#19 bic x28,x23,x21 ror x14,x25,#28 add x24,x24,x6 // h+=X[i] eor x16,x16,x21,ror#18 eor x13,x13,x8,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x21,ror#41 // Sigma1(e) eor x14,x14,x25,ror#34 add x24,x24,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x12,x12,x5,ror#61 eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) add x24,x24,x16 // h+=Sigma1(e) eor x19,x19,x26 // Maj(a,b,c) eor x17,x14,x25,ror#39 // Sigma0(a) eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) add x7,x7,x0 add x20,x20,x24 // d+=h add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x7,x7,x13 add x24,x24,x17 // h+=Sigma0(a) add x7,x7,x12 ldr x12,[sp,#8] str x15,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] ror x14,x9,#1 and x17,x21,x20 ror x13,x6,#19 bic x19,x22,x20 ror x15,x24,#28 add x23,x23,x7 // h+=X[i] eor x16,x16,x20,ror#18 eor x14,x14,x9,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x20,ror#41 // Sigma1(e) eor x15,x15,x24,ror#34 add x23,x23,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x13,x13,x6,ror#61 eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) add x23,x23,x16 // h+=Sigma1(e) eor x28,x28,x25 // Maj(a,b,c) eor x17,x15,x24,ror#39 // Sigma0(a) eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) add x8,x8,x1 add x27,x27,x23 // d+=h add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x8,x8,x14 add x23,x23,x17 // h+=Sigma0(a) add x8,x8,x13 ldr x13,[sp,#16] str x0,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] ror x15,x10,#1 and x17,x20,x27 ror x14,x7,#19 bic x28,x21,x27 ror x0,x23,#28 add x22,x22,x8 // h+=X[i] eor x16,x16,x27,ror#18 eor x15,x15,x10,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x27,ror#41 // Sigma1(e) eor x0,x0,x23,ror#34 add x22,x22,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x14,x14,x7,ror#61 eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) add x22,x22,x16 // h+=Sigma1(e) eor x19,x19,x24 // Maj(a,b,c) eor x17,x0,x23,ror#39 // Sigma0(a) eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) add x9,x9,x2 add x26,x26,x22 // d+=h add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x9,x9,x15 add x22,x22,x17 // h+=Sigma0(a) add x9,x9,x14 ldr x14,[sp,#24] str x1,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] ror x0,x11,#1 and x17,x27,x26 ror x15,x8,#19 bic x19,x20,x26 ror x1,x22,#28 add x21,x21,x9 // h+=X[i] eor x16,x16,x26,ror#18 eor x0,x0,x11,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x26,ror#41 // Sigma1(e) eor x1,x1,x22,ror#34 add x21,x21,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x15,x15,x8,ror#61 eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) add x21,x21,x16 // h+=Sigma1(e) eor x28,x28,x23 // Maj(a,b,c) eor x17,x1,x22,ror#39 // Sigma0(a) eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) add x10,x10,x3 add x25,x25,x21 // d+=h add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x10,x10,x0 add x21,x21,x17 // h+=Sigma0(a) add x10,x10,x15 ldr x15,[sp,#0] str x2,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x1,x12,#1 and x17,x26,x25 ror x0,x9,#19 bic x28,x27,x25 ror x2,x21,#28 add x20,x20,x10 // h+=X[i] eor x16,x16,x25,ror#18 eor x1,x1,x12,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x2,x2,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x0,x0,x9,ror#61 eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x2,x21,ror#39 // Sigma0(a) eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) add x11,x11,x4 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x11,x11,x1 add x20,x20,x17 // h+=Sigma0(a) add x11,x11,x0 ldr x0,[sp,#8] str x3,[sp,#0] ror x16,x24,#14 add x27,x27,x19 // h+=K[i] ror x2,x13,#1 and x17,x25,x24 ror x1,x10,#19 bic x19,x26,x24 ror x3,x20,#28 add x27,x27,x11 // h+=X[i] eor x16,x16,x24,ror#18 eor x2,x2,x13,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x24,ror#41 // Sigma1(e) eor x3,x3,x20,ror#34 add x27,x27,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x1,x1,x10,ror#61 eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) add x27,x27,x16 // h+=Sigma1(e) eor x28,x28,x21 // Maj(a,b,c) eor x17,x3,x20,ror#39 // Sigma0(a) eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) add x12,x12,x5 add x23,x23,x27 // d+=h add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x12,x12,x2 add x27,x27,x17 // h+=Sigma0(a) add x12,x12,x1 ldr x1,[sp,#16] str x4,[sp,#8] ror x16,x23,#14 add x26,x26,x28 // h+=K[i] ror x3,x14,#1 and x17,x24,x23 ror x2,x11,#19 bic x28,x25,x23 ror x4,x27,#28 add x26,x26,x12 // h+=X[i] eor x16,x16,x23,ror#18 eor x3,x3,x14,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x23,ror#41 // Sigma1(e) eor x4,x4,x27,ror#34 add x26,x26,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x2,x2,x11,ror#61 eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) add x26,x26,x16 // h+=Sigma1(e) eor x19,x19,x20 // Maj(a,b,c) eor x17,x4,x27,ror#39 // Sigma0(a) eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) add x13,x13,x6 add x22,x22,x26 // d+=h add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x13,x13,x3 add x26,x26,x17 // h+=Sigma0(a) add x13,x13,x2 ldr x2,[sp,#24] str x5,[sp,#16] ror x16,x22,#14 add x25,x25,x19 // h+=K[i] ror x4,x15,#1 and x17,x23,x22 ror x3,x12,#19 bic x19,x24,x22 ror x5,x26,#28 add x25,x25,x13 // h+=X[i] eor x16,x16,x22,ror#18 eor x4,x4,x15,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x22,ror#41 // Sigma1(e) eor x5,x5,x26,ror#34 add x25,x25,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x3,x3,x12,ror#61 eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) add x25,x25,x16 // h+=Sigma1(e) eor x28,x28,x27 // Maj(a,b,c) eor x17,x5,x26,ror#39 // Sigma0(a) eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) add x14,x14,x7 add x21,x21,x25 // d+=h add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x14,x14,x4 add x25,x25,x17 // h+=Sigma0(a) add x14,x14,x3 ldr x3,[sp,#0] str x6,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] ror x5,x0,#1 and x17,x22,x21 ror x4,x13,#19 bic x28,x23,x21 ror x6,x25,#28 add x24,x24,x14 // h+=X[i] eor x16,x16,x21,ror#18 eor x5,x5,x0,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x21,ror#41 // Sigma1(e) eor x6,x6,x25,ror#34 add x24,x24,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x4,x4,x13,ror#61 eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) add x24,x24,x16 // h+=Sigma1(e) eor x19,x19,x26 // Maj(a,b,c) eor x17,x6,x25,ror#39 // Sigma0(a) eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) add x15,x15,x8 add x20,x20,x24 // d+=h add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x15,x15,x5 add x24,x24,x17 // h+=Sigma0(a) add x15,x15,x4 ldr x4,[sp,#8] str x7,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] ror x6,x1,#1 and x17,x21,x20 ror x5,x14,#19 bic x19,x22,x20 ror x7,x24,#28 add x23,x23,x15 // h+=X[i] eor x16,x16,x20,ror#18 eor x6,x6,x1,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x20,ror#41 // Sigma1(e) eor x7,x7,x24,ror#34 add x23,x23,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x5,x5,x14,ror#61 eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) add x23,x23,x16 // h+=Sigma1(e) eor x28,x28,x25 // Maj(a,b,c) eor x17,x7,x24,ror#39 // Sigma0(a) eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) add x0,x0,x9 add x27,x27,x23 // d+=h add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x0,x0,x6 add x23,x23,x17 // h+=Sigma0(a) add x0,x0,x5 ldr x5,[sp,#16] str x8,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] ror x7,x2,#1 and x17,x20,x27 ror x6,x15,#19 bic x28,x21,x27 ror x8,x23,#28 add x22,x22,x0 // h+=X[i] eor x16,x16,x27,ror#18 eor x7,x7,x2,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x27,ror#41 // Sigma1(e) eor x8,x8,x23,ror#34 add x22,x22,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x6,x6,x15,ror#61 eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) add x22,x22,x16 // h+=Sigma1(e) eor x19,x19,x24 // Maj(a,b,c) eor x17,x8,x23,ror#39 // Sigma0(a) eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) add x1,x1,x10 add x26,x26,x22 // d+=h add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x1,x1,x7 add x22,x22,x17 // h+=Sigma0(a) add x1,x1,x6 ldr x6,[sp,#24] str x9,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] ror x8,x3,#1 and x17,x27,x26 ror x7,x0,#19 bic x19,x20,x26 ror x9,x22,#28 add x21,x21,x1 // h+=X[i] eor x16,x16,x26,ror#18 eor x8,x8,x3,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x26,ror#41 // Sigma1(e) eor x9,x9,x22,ror#34 add x21,x21,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x7,x7,x0,ror#61 eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) add x21,x21,x16 // h+=Sigma1(e) eor x28,x28,x23 // Maj(a,b,c) eor x17,x9,x22,ror#39 // Sigma0(a) eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) add x2,x2,x11 add x25,x25,x21 // d+=h add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x2,x2,x8 add x21,x21,x17 // h+=Sigma0(a) add x2,x2,x7 ldr x7,[sp,#0] str x10,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x9,x4,#1 and x17,x26,x25 ror x8,x1,#19 bic x28,x27,x25 ror x10,x21,#28 add x20,x20,x2 // h+=X[i] eor x16,x16,x25,ror#18 eor x9,x9,x4,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x10,x10,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x8,x8,x1,ror#61 eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x10,x21,ror#39 // Sigma0(a) eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) add x3,x3,x12 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x3,x3,x9 add x20,x20,x17 // h+=Sigma0(a) add x3,x3,x8 cbnz x19,Loop_16_xx ldp x0,x2,[x29,#96] ldr x1,[x29,#112] sub x30,x30,#648 // rewind ldp x3,x4,[x0] ldp x5,x6,[x0,#2*8] add x1,x1,#14*8 // advance input pointer ldp x7,x8,[x0,#4*8] add x20,x20,x3 ldp x9,x10,[x0,#6*8] add x21,x21,x4 add x22,x22,x5 add x23,x23,x6 stp x20,x21,[x0] add x24,x24,x7 add x25,x25,x8 stp x22,x23,[x0,#2*8] add x26,x26,x9 add x27,x27,x10 cmp x1,x2 stp x24,x25,[x0,#4*8] stp x26,x27,[x0,#6*8] b.ne Loop ldp x19,x20,[x29,#16] add sp,sp,#4*8 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#128 ret .section __TEXT,__const .align 6 LK512: .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0 // terminator .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #ifndef __KERNEL__ .comm _GFp_armcap_P,4,4 .private_extern _GFp_armcap_P #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha512-armv8-linux64.S000064400000000000000000000733741353224260700171140ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the OpenSSL license (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy // in the file LICENSE in the source distribution or at // https://www.openssl.org/source/license.html // ==================================================================== // Written by Andy Polyakov for the OpenSSL // project. The module is, however, dual licensed under OpenSSL and // CRYPTOGAMS licenses depending on where you obtain it. For further // details see http://www.openssl.org/~appro/cryptogams/. // // Permission to use under GPLv2 terms is granted. // ==================================================================== // // SHA256/512 for ARMv8. // // Performance in cycles per processed byte and improvement coefficient // over code generated with "default" compiler: // // SHA256-hw SHA256(*) SHA512 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) // Denver 2.01 10.5 (+26%) 6.70 (+8%) // X-Gene 20.0 (+100%) 12.8 (+300%(***)) // Mongoose 2.36 13.0 (+50%) 8.36 (+33%) // // (*) Software SHA256 results are of lesser relevance, presented // mostly for informational purposes. // (**) The result is a trade-off: it's possible to improve it by // 10% (or by 1 cycle per round), but at the cost of 20% loss // on Cortex-A53 (or by 4 cycles per round). // (***) Super-impressive coefficients over gcc-generated code are // indication of some compiler "pathology", most notably code // generated with -mgeneral-regs-only is significanty faster // and the gap is only 40-90%. #ifndef __KERNEL__ # include #endif .text .globl GFp_sha512_block_data_order .hidden GFp_sha512_block_data_order .type GFp_sha512_block_data_order,%function .align 6 GFp_sha512_block_data_order: stp x29,x30,[sp,#-128]! add x29,sp,#0 stp x19,x20,[sp,#16] stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] stp x25,x26,[sp,#64] stp x27,x28,[sp,#80] sub sp,sp,#4*8 ldp x20,x21,[x0] // load context ldp x22,x23,[x0,#2*8] ldp x24,x25,[x0,#4*8] add x2,x1,x2,lsl#7 // end of input ldp x26,x27,[x0,#6*8] adrp x30,.LK512 add x30,x30,:lo12:.LK512 stp x0,x2,[x29,#96] .Loop: ldp x3,x4,[x1],#2*8 ldr x19,[x30],#8 // *K++ eor x28,x21,x22 // magic seed str x1,[x29,#112] #ifndef __ARMEB__ rev x3,x3 // 0 #endif ror x16,x24,#14 add x27,x27,x19 // h+=K[i] eor x6,x24,x24,ror#23 and x17,x25,x24 bic x19,x26,x24 add x27,x27,x3 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x6,ror#18 // Sigma1(e) ror x6,x20,#28 add x27,x27,x17 // h+=Ch(e,f,g) eor x17,x20,x20,ror#5 add x27,x27,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x23,x23,x27 // d+=h eor x28,x28,x21 // Maj(a,b,c) eor x17,x6,x17,ror#34 // Sigma0(a) add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x27,x27,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x4,x4 // 1 #endif ldp x5,x6,[x1],#2*8 add x27,x27,x17 // h+=Sigma0(a) ror x16,x23,#14 add x26,x26,x28 // h+=K[i] eor x7,x23,x23,ror#23 and x17,x24,x23 bic x28,x25,x23 add x26,x26,x4 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x7,ror#18 // Sigma1(e) ror x7,x27,#28 add x26,x26,x17 // h+=Ch(e,f,g) eor x17,x27,x27,ror#5 add x26,x26,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x22,x22,x26 // d+=h eor x19,x19,x20 // Maj(a,b,c) eor x17,x7,x17,ror#34 // Sigma0(a) add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x26,x26,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x5,x5 // 2 #endif add x26,x26,x17 // h+=Sigma0(a) ror x16,x22,#14 add x25,x25,x19 // h+=K[i] eor x8,x22,x22,ror#23 and x17,x23,x22 bic x19,x24,x22 add x25,x25,x5 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x8,ror#18 // Sigma1(e) ror x8,x26,#28 add x25,x25,x17 // h+=Ch(e,f,g) eor x17,x26,x26,ror#5 add x25,x25,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x21,x21,x25 // d+=h eor x28,x28,x27 // Maj(a,b,c) eor x17,x8,x17,ror#34 // Sigma0(a) add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x25,x25,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x6,x6 // 3 #endif ldp x7,x8,[x1],#2*8 add x25,x25,x17 // h+=Sigma0(a) ror x16,x21,#14 add x24,x24,x28 // h+=K[i] eor x9,x21,x21,ror#23 and x17,x22,x21 bic x28,x23,x21 add x24,x24,x6 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x9,ror#18 // Sigma1(e) ror x9,x25,#28 add x24,x24,x17 // h+=Ch(e,f,g) eor x17,x25,x25,ror#5 add x24,x24,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x20,x20,x24 // d+=h eor x19,x19,x26 // Maj(a,b,c) eor x17,x9,x17,ror#34 // Sigma0(a) add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x24,x24,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x7,x7 // 4 #endif add x24,x24,x17 // h+=Sigma0(a) ror x16,x20,#14 add x23,x23,x19 // h+=K[i] eor x10,x20,x20,ror#23 and x17,x21,x20 bic x19,x22,x20 add x23,x23,x7 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x10,ror#18 // Sigma1(e) ror x10,x24,#28 add x23,x23,x17 // h+=Ch(e,f,g) eor x17,x24,x24,ror#5 add x23,x23,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x27,x27,x23 // d+=h eor x28,x28,x25 // Maj(a,b,c) eor x17,x10,x17,ror#34 // Sigma0(a) add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x23,x23,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x8,x8 // 5 #endif ldp x9,x10,[x1],#2*8 add x23,x23,x17 // h+=Sigma0(a) ror x16,x27,#14 add x22,x22,x28 // h+=K[i] eor x11,x27,x27,ror#23 and x17,x20,x27 bic x28,x21,x27 add x22,x22,x8 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x11,ror#18 // Sigma1(e) ror x11,x23,#28 add x22,x22,x17 // h+=Ch(e,f,g) eor x17,x23,x23,ror#5 add x22,x22,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x26,x26,x22 // d+=h eor x19,x19,x24 // Maj(a,b,c) eor x17,x11,x17,ror#34 // Sigma0(a) add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x22,x22,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x9,x9 // 6 #endif add x22,x22,x17 // h+=Sigma0(a) ror x16,x26,#14 add x21,x21,x19 // h+=K[i] eor x12,x26,x26,ror#23 and x17,x27,x26 bic x19,x20,x26 add x21,x21,x9 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x12,ror#18 // Sigma1(e) ror x12,x22,#28 add x21,x21,x17 // h+=Ch(e,f,g) eor x17,x22,x22,ror#5 add x21,x21,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x25,x25,x21 // d+=h eor x28,x28,x23 // Maj(a,b,c) eor x17,x12,x17,ror#34 // Sigma0(a) add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x21,x21,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x10,x10 // 7 #endif ldp x11,x12,[x1],#2*8 add x21,x21,x17 // h+=Sigma0(a) ror x16,x25,#14 add x20,x20,x28 // h+=K[i] eor x13,x25,x25,ror#23 and x17,x26,x25 bic x28,x27,x25 add x20,x20,x10 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x13,ror#18 // Sigma1(e) ror x13,x21,#28 add x20,x20,x17 // h+=Ch(e,f,g) eor x17,x21,x21,ror#5 add x20,x20,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x24,x24,x20 // d+=h eor x19,x19,x22 // Maj(a,b,c) eor x17,x13,x17,ror#34 // Sigma0(a) add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x20,x20,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x11,x11 // 8 #endif add x20,x20,x17 // h+=Sigma0(a) ror x16,x24,#14 add x27,x27,x19 // h+=K[i] eor x14,x24,x24,ror#23 and x17,x25,x24 bic x19,x26,x24 add x27,x27,x11 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x14,ror#18 // Sigma1(e) ror x14,x20,#28 add x27,x27,x17 // h+=Ch(e,f,g) eor x17,x20,x20,ror#5 add x27,x27,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x23,x23,x27 // d+=h eor x28,x28,x21 // Maj(a,b,c) eor x17,x14,x17,ror#34 // Sigma0(a) add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x27,x27,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x12,x12 // 9 #endif ldp x13,x14,[x1],#2*8 add x27,x27,x17 // h+=Sigma0(a) ror x16,x23,#14 add x26,x26,x28 // h+=K[i] eor x15,x23,x23,ror#23 and x17,x24,x23 bic x28,x25,x23 add x26,x26,x12 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x15,ror#18 // Sigma1(e) ror x15,x27,#28 add x26,x26,x17 // h+=Ch(e,f,g) eor x17,x27,x27,ror#5 add x26,x26,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x22,x22,x26 // d+=h eor x19,x19,x20 // Maj(a,b,c) eor x17,x15,x17,ror#34 // Sigma0(a) add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x26,x26,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x13,x13 // 10 #endif add x26,x26,x17 // h+=Sigma0(a) ror x16,x22,#14 add x25,x25,x19 // h+=K[i] eor x0,x22,x22,ror#23 and x17,x23,x22 bic x19,x24,x22 add x25,x25,x13 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x0,ror#18 // Sigma1(e) ror x0,x26,#28 add x25,x25,x17 // h+=Ch(e,f,g) eor x17,x26,x26,ror#5 add x25,x25,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x21,x21,x25 // d+=h eor x28,x28,x27 // Maj(a,b,c) eor x17,x0,x17,ror#34 // Sigma0(a) add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x25,x25,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x14,x14 // 11 #endif ldp x15,x0,[x1],#2*8 add x25,x25,x17 // h+=Sigma0(a) str x6,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] eor x6,x21,x21,ror#23 and x17,x22,x21 bic x28,x23,x21 add x24,x24,x14 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x6,ror#18 // Sigma1(e) ror x6,x25,#28 add x24,x24,x17 // h+=Ch(e,f,g) eor x17,x25,x25,ror#5 add x24,x24,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x20,x20,x24 // d+=h eor x19,x19,x26 // Maj(a,b,c) eor x17,x6,x17,ror#34 // Sigma0(a) add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x24,x24,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x15,x15 // 12 #endif add x24,x24,x17 // h+=Sigma0(a) str x7,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] eor x7,x20,x20,ror#23 and x17,x21,x20 bic x19,x22,x20 add x23,x23,x15 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x7,ror#18 // Sigma1(e) ror x7,x24,#28 add x23,x23,x17 // h+=Ch(e,f,g) eor x17,x24,x24,ror#5 add x23,x23,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x27,x27,x23 // d+=h eor x28,x28,x25 // Maj(a,b,c) eor x17,x7,x17,ror#34 // Sigma0(a) add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x23,x23,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x0,x0 // 13 #endif ldp x1,x2,[x1] add x23,x23,x17 // h+=Sigma0(a) str x8,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] eor x8,x27,x27,ror#23 and x17,x20,x27 bic x28,x21,x27 add x22,x22,x0 // h+=X[i] orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x8,ror#18 // Sigma1(e) ror x8,x23,#28 add x22,x22,x17 // h+=Ch(e,f,g) eor x17,x23,x23,ror#5 add x22,x22,x16 // h+=Sigma1(e) and x19,x19,x28 // (b^c)&=(a^b) add x26,x26,x22 // d+=h eor x19,x19,x24 // Maj(a,b,c) eor x17,x8,x17,ror#34 // Sigma0(a) add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round //add x22,x22,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x1,x1 // 14 #endif ldr x6,[sp,#24] add x22,x22,x17 // h+=Sigma0(a) str x9,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] eor x9,x26,x26,ror#23 and x17,x27,x26 bic x19,x20,x26 add x21,x21,x1 // h+=X[i] orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x9,ror#18 // Sigma1(e) ror x9,x22,#28 add x21,x21,x17 // h+=Ch(e,f,g) eor x17,x22,x22,ror#5 add x21,x21,x16 // h+=Sigma1(e) and x28,x28,x19 // (b^c)&=(a^b) add x25,x25,x21 // d+=h eor x28,x28,x23 // Maj(a,b,c) eor x17,x9,x17,ror#34 // Sigma0(a) add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round //add x21,x21,x17 // h+=Sigma0(a) #ifndef __ARMEB__ rev x2,x2 // 15 #endif ldr x7,[sp,#0] add x21,x21,x17 // h+=Sigma0(a) str x10,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x9,x4,#1 and x17,x26,x25 ror x8,x1,#19 bic x28,x27,x25 ror x10,x21,#28 add x20,x20,x2 // h+=X[i] eor x16,x16,x25,ror#18 eor x9,x9,x4,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x10,x10,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x8,x8,x1,ror#61 eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x10,x21,ror#39 // Sigma0(a) eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) add x3,x3,x12 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x3,x3,x9 add x20,x20,x17 // h+=Sigma0(a) add x3,x3,x8 .Loop_16_xx: ldr x8,[sp,#8] str x11,[sp,#0] ror x16,x24,#14 add x27,x27,x19 // h+=K[i] ror x10,x5,#1 and x17,x25,x24 ror x9,x2,#19 bic x19,x26,x24 ror x11,x20,#28 add x27,x27,x3 // h+=X[i] eor x16,x16,x24,ror#18 eor x10,x10,x5,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x24,ror#41 // Sigma1(e) eor x11,x11,x20,ror#34 add x27,x27,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x9,x9,x2,ror#61 eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) add x27,x27,x16 // h+=Sigma1(e) eor x28,x28,x21 // Maj(a,b,c) eor x17,x11,x20,ror#39 // Sigma0(a) eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) add x4,x4,x13 add x23,x23,x27 // d+=h add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x4,x4,x10 add x27,x27,x17 // h+=Sigma0(a) add x4,x4,x9 ldr x9,[sp,#16] str x12,[sp,#8] ror x16,x23,#14 add x26,x26,x28 // h+=K[i] ror x11,x6,#1 and x17,x24,x23 ror x10,x3,#19 bic x28,x25,x23 ror x12,x27,#28 add x26,x26,x4 // h+=X[i] eor x16,x16,x23,ror#18 eor x11,x11,x6,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x23,ror#41 // Sigma1(e) eor x12,x12,x27,ror#34 add x26,x26,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x10,x10,x3,ror#61 eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) add x26,x26,x16 // h+=Sigma1(e) eor x19,x19,x20 // Maj(a,b,c) eor x17,x12,x27,ror#39 // Sigma0(a) eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) add x5,x5,x14 add x22,x22,x26 // d+=h add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x5,x5,x11 add x26,x26,x17 // h+=Sigma0(a) add x5,x5,x10 ldr x10,[sp,#24] str x13,[sp,#16] ror x16,x22,#14 add x25,x25,x19 // h+=K[i] ror x12,x7,#1 and x17,x23,x22 ror x11,x4,#19 bic x19,x24,x22 ror x13,x26,#28 add x25,x25,x5 // h+=X[i] eor x16,x16,x22,ror#18 eor x12,x12,x7,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x22,ror#41 // Sigma1(e) eor x13,x13,x26,ror#34 add x25,x25,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x11,x11,x4,ror#61 eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) add x25,x25,x16 // h+=Sigma1(e) eor x28,x28,x27 // Maj(a,b,c) eor x17,x13,x26,ror#39 // Sigma0(a) eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) add x6,x6,x15 add x21,x21,x25 // d+=h add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x6,x6,x12 add x25,x25,x17 // h+=Sigma0(a) add x6,x6,x11 ldr x11,[sp,#0] str x14,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] ror x13,x8,#1 and x17,x22,x21 ror x12,x5,#19 bic x28,x23,x21 ror x14,x25,#28 add x24,x24,x6 // h+=X[i] eor x16,x16,x21,ror#18 eor x13,x13,x8,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x21,ror#41 // Sigma1(e) eor x14,x14,x25,ror#34 add x24,x24,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x12,x12,x5,ror#61 eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) add x24,x24,x16 // h+=Sigma1(e) eor x19,x19,x26 // Maj(a,b,c) eor x17,x14,x25,ror#39 // Sigma0(a) eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) add x7,x7,x0 add x20,x20,x24 // d+=h add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x7,x7,x13 add x24,x24,x17 // h+=Sigma0(a) add x7,x7,x12 ldr x12,[sp,#8] str x15,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] ror x14,x9,#1 and x17,x21,x20 ror x13,x6,#19 bic x19,x22,x20 ror x15,x24,#28 add x23,x23,x7 // h+=X[i] eor x16,x16,x20,ror#18 eor x14,x14,x9,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x20,ror#41 // Sigma1(e) eor x15,x15,x24,ror#34 add x23,x23,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x13,x13,x6,ror#61 eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) add x23,x23,x16 // h+=Sigma1(e) eor x28,x28,x25 // Maj(a,b,c) eor x17,x15,x24,ror#39 // Sigma0(a) eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) add x8,x8,x1 add x27,x27,x23 // d+=h add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x8,x8,x14 add x23,x23,x17 // h+=Sigma0(a) add x8,x8,x13 ldr x13,[sp,#16] str x0,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] ror x15,x10,#1 and x17,x20,x27 ror x14,x7,#19 bic x28,x21,x27 ror x0,x23,#28 add x22,x22,x8 // h+=X[i] eor x16,x16,x27,ror#18 eor x15,x15,x10,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x27,ror#41 // Sigma1(e) eor x0,x0,x23,ror#34 add x22,x22,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x14,x14,x7,ror#61 eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) add x22,x22,x16 // h+=Sigma1(e) eor x19,x19,x24 // Maj(a,b,c) eor x17,x0,x23,ror#39 // Sigma0(a) eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) add x9,x9,x2 add x26,x26,x22 // d+=h add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x9,x9,x15 add x22,x22,x17 // h+=Sigma0(a) add x9,x9,x14 ldr x14,[sp,#24] str x1,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] ror x0,x11,#1 and x17,x27,x26 ror x15,x8,#19 bic x19,x20,x26 ror x1,x22,#28 add x21,x21,x9 // h+=X[i] eor x16,x16,x26,ror#18 eor x0,x0,x11,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x26,ror#41 // Sigma1(e) eor x1,x1,x22,ror#34 add x21,x21,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x15,x15,x8,ror#61 eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) add x21,x21,x16 // h+=Sigma1(e) eor x28,x28,x23 // Maj(a,b,c) eor x17,x1,x22,ror#39 // Sigma0(a) eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) add x10,x10,x3 add x25,x25,x21 // d+=h add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x10,x10,x0 add x21,x21,x17 // h+=Sigma0(a) add x10,x10,x15 ldr x15,[sp,#0] str x2,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x1,x12,#1 and x17,x26,x25 ror x0,x9,#19 bic x28,x27,x25 ror x2,x21,#28 add x20,x20,x10 // h+=X[i] eor x16,x16,x25,ror#18 eor x1,x1,x12,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x2,x2,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x0,x0,x9,ror#61 eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x2,x21,ror#39 // Sigma0(a) eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) add x11,x11,x4 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x11,x11,x1 add x20,x20,x17 // h+=Sigma0(a) add x11,x11,x0 ldr x0,[sp,#8] str x3,[sp,#0] ror x16,x24,#14 add x27,x27,x19 // h+=K[i] ror x2,x13,#1 and x17,x25,x24 ror x1,x10,#19 bic x19,x26,x24 ror x3,x20,#28 add x27,x27,x11 // h+=X[i] eor x16,x16,x24,ror#18 eor x2,x2,x13,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x20,x21 // a^b, b^c in next round eor x16,x16,x24,ror#41 // Sigma1(e) eor x3,x3,x20,ror#34 add x27,x27,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x1,x1,x10,ror#61 eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) add x27,x27,x16 // h+=Sigma1(e) eor x28,x28,x21 // Maj(a,b,c) eor x17,x3,x20,ror#39 // Sigma0(a) eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) add x12,x12,x5 add x23,x23,x27 // d+=h add x27,x27,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x12,x12,x2 add x27,x27,x17 // h+=Sigma0(a) add x12,x12,x1 ldr x1,[sp,#16] str x4,[sp,#8] ror x16,x23,#14 add x26,x26,x28 // h+=K[i] ror x3,x14,#1 and x17,x24,x23 ror x2,x11,#19 bic x28,x25,x23 ror x4,x27,#28 add x26,x26,x12 // h+=X[i] eor x16,x16,x23,ror#18 eor x3,x3,x14,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x27,x20 // a^b, b^c in next round eor x16,x16,x23,ror#41 // Sigma1(e) eor x4,x4,x27,ror#34 add x26,x26,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x2,x2,x11,ror#61 eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) add x26,x26,x16 // h+=Sigma1(e) eor x19,x19,x20 // Maj(a,b,c) eor x17,x4,x27,ror#39 // Sigma0(a) eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) add x13,x13,x6 add x22,x22,x26 // d+=h add x26,x26,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x13,x13,x3 add x26,x26,x17 // h+=Sigma0(a) add x13,x13,x2 ldr x2,[sp,#24] str x5,[sp,#16] ror x16,x22,#14 add x25,x25,x19 // h+=K[i] ror x4,x15,#1 and x17,x23,x22 ror x3,x12,#19 bic x19,x24,x22 ror x5,x26,#28 add x25,x25,x13 // h+=X[i] eor x16,x16,x22,ror#18 eor x4,x4,x15,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x26,x27 // a^b, b^c in next round eor x16,x16,x22,ror#41 // Sigma1(e) eor x5,x5,x26,ror#34 add x25,x25,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x3,x3,x12,ror#61 eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) add x25,x25,x16 // h+=Sigma1(e) eor x28,x28,x27 // Maj(a,b,c) eor x17,x5,x26,ror#39 // Sigma0(a) eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) add x14,x14,x7 add x21,x21,x25 // d+=h add x25,x25,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x14,x14,x4 add x25,x25,x17 // h+=Sigma0(a) add x14,x14,x3 ldr x3,[sp,#0] str x6,[sp,#24] ror x16,x21,#14 add x24,x24,x28 // h+=K[i] ror x5,x0,#1 and x17,x22,x21 ror x4,x13,#19 bic x28,x23,x21 ror x6,x25,#28 add x24,x24,x14 // h+=X[i] eor x16,x16,x21,ror#18 eor x5,x5,x0,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x25,x26 // a^b, b^c in next round eor x16,x16,x21,ror#41 // Sigma1(e) eor x6,x6,x25,ror#34 add x24,x24,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x4,x4,x13,ror#61 eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) add x24,x24,x16 // h+=Sigma1(e) eor x19,x19,x26 // Maj(a,b,c) eor x17,x6,x25,ror#39 // Sigma0(a) eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) add x15,x15,x8 add x20,x20,x24 // d+=h add x24,x24,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x15,x15,x5 add x24,x24,x17 // h+=Sigma0(a) add x15,x15,x4 ldr x4,[sp,#8] str x7,[sp,#0] ror x16,x20,#14 add x23,x23,x19 // h+=K[i] ror x6,x1,#1 and x17,x21,x20 ror x5,x14,#19 bic x19,x22,x20 ror x7,x24,#28 add x23,x23,x15 // h+=X[i] eor x16,x16,x20,ror#18 eor x6,x6,x1,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x24,x25 // a^b, b^c in next round eor x16,x16,x20,ror#41 // Sigma1(e) eor x7,x7,x24,ror#34 add x23,x23,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x5,x5,x14,ror#61 eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) add x23,x23,x16 // h+=Sigma1(e) eor x28,x28,x25 // Maj(a,b,c) eor x17,x7,x24,ror#39 // Sigma0(a) eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) add x0,x0,x9 add x27,x27,x23 // d+=h add x23,x23,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x0,x0,x6 add x23,x23,x17 // h+=Sigma0(a) add x0,x0,x5 ldr x5,[sp,#16] str x8,[sp,#8] ror x16,x27,#14 add x22,x22,x28 // h+=K[i] ror x7,x2,#1 and x17,x20,x27 ror x6,x15,#19 bic x28,x21,x27 ror x8,x23,#28 add x22,x22,x0 // h+=X[i] eor x16,x16,x27,ror#18 eor x7,x7,x2,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x23,x24 // a^b, b^c in next round eor x16,x16,x27,ror#41 // Sigma1(e) eor x8,x8,x23,ror#34 add x22,x22,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x6,x6,x15,ror#61 eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) add x22,x22,x16 // h+=Sigma1(e) eor x19,x19,x24 // Maj(a,b,c) eor x17,x8,x23,ror#39 // Sigma0(a) eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) add x1,x1,x10 add x26,x26,x22 // d+=h add x22,x22,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x1,x1,x7 add x22,x22,x17 // h+=Sigma0(a) add x1,x1,x6 ldr x6,[sp,#24] str x9,[sp,#16] ror x16,x26,#14 add x21,x21,x19 // h+=K[i] ror x8,x3,#1 and x17,x27,x26 ror x7,x0,#19 bic x19,x20,x26 ror x9,x22,#28 add x21,x21,x1 // h+=X[i] eor x16,x16,x26,ror#18 eor x8,x8,x3,ror#8 orr x17,x17,x19 // Ch(e,f,g) eor x19,x22,x23 // a^b, b^c in next round eor x16,x16,x26,ror#41 // Sigma1(e) eor x9,x9,x22,ror#34 add x21,x21,x17 // h+=Ch(e,f,g) and x28,x28,x19 // (b^c)&=(a^b) eor x7,x7,x0,ror#61 eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) add x21,x21,x16 // h+=Sigma1(e) eor x28,x28,x23 // Maj(a,b,c) eor x17,x9,x22,ror#39 // Sigma0(a) eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) add x2,x2,x11 add x25,x25,x21 // d+=h add x21,x21,x28 // h+=Maj(a,b,c) ldr x28,[x30],#8 // *K++, x19 in next round add x2,x2,x8 add x21,x21,x17 // h+=Sigma0(a) add x2,x2,x7 ldr x7,[sp,#0] str x10,[sp,#24] ror x16,x25,#14 add x20,x20,x28 // h+=K[i] ror x9,x4,#1 and x17,x26,x25 ror x8,x1,#19 bic x28,x27,x25 ror x10,x21,#28 add x20,x20,x2 // h+=X[i] eor x16,x16,x25,ror#18 eor x9,x9,x4,ror#8 orr x17,x17,x28 // Ch(e,f,g) eor x28,x21,x22 // a^b, b^c in next round eor x16,x16,x25,ror#41 // Sigma1(e) eor x10,x10,x21,ror#34 add x20,x20,x17 // h+=Ch(e,f,g) and x19,x19,x28 // (b^c)&=(a^b) eor x8,x8,x1,ror#61 eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) add x20,x20,x16 // h+=Sigma1(e) eor x19,x19,x22 // Maj(a,b,c) eor x17,x10,x21,ror#39 // Sigma0(a) eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) add x3,x3,x12 add x24,x24,x20 // d+=h add x20,x20,x19 // h+=Maj(a,b,c) ldr x19,[x30],#8 // *K++, x28 in next round add x3,x3,x9 add x20,x20,x17 // h+=Sigma0(a) add x3,x3,x8 cbnz x19,.Loop_16_xx ldp x0,x2,[x29,#96] ldr x1,[x29,#112] sub x30,x30,#648 // rewind ldp x3,x4,[x0] ldp x5,x6,[x0,#2*8] add x1,x1,#14*8 // advance input pointer ldp x7,x8,[x0,#4*8] add x20,x20,x3 ldp x9,x10,[x0,#6*8] add x21,x21,x4 add x22,x22,x5 add x23,x23,x6 stp x20,x21,[x0] add x24,x24,x7 add x25,x25,x8 stp x22,x23,[x0,#2*8] add x26,x26,x9 add x27,x27,x10 cmp x1,x2 stp x24,x25,[x0,#4*8] stp x26,x27,[x0,#6*8] b.ne .Loop ldp x19,x20,[x29,#16] add sp,sp,#4*8 ldp x21,x22,[x29,#32] ldp x23,x24,[x29,#48] ldp x25,x26,[x29,#64] ldp x27,x28,[x29,#80] ldp x29,x30,[sp],#128 ret .size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order .section .rodata .align 6 .type .LK512,%object .LK512: .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0 // terminator .size .LK512,.-.LK512 .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 #ifndef __KERNEL__ .comm GFp_armcap_P,4,4 .hidden GFp_armcap_P #endif #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/sha512-x86_64-elf.S000064400000000000000000001373671353224260500162530ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_sha512_block_data_order .hidden GFp_sha512_block_data_order .type GFp_sha512_block_data_order,@function .align 16 GFp_sha512_block_data_order: .cfi_startproc leaq GFp_ia32cap_P(%rip),%r11 movl 0(%r11),%r9d movl 4(%r11),%r10d movl 8(%r11),%r11d andl $1073741824,%r9d andl $268435968,%r10d orl %r9d,%r10d cmpl $1342177792,%r10d je .Lavx_shortcut movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 shlq $4,%rdx subq $128+32,%rsp leaq (%rsi,%rdx,8),%rdx andq $-64,%rsp movq %rdi,128+0(%rsp) movq %rsi,128+8(%rsp) movq %rdx,128+16(%rsp) movq %rax,152(%rsp) .cfi_escape 0x0f,0x06,0x77,0x98,0x01,0x06,0x23,0x08 .Lprologue: movq 0(%rdi),%rax movq 8(%rdi),%rbx movq 16(%rdi),%rcx movq 24(%rdi),%rdx movq 32(%rdi),%r8 movq 40(%rdi),%r9 movq 48(%rdi),%r10 movq 56(%rdi),%r11 jmp .Lloop .align 16 .Lloop: movq %rbx,%rdi leaq K512(%rip),%rbp xorq %rcx,%rdi movq 0(%rsi),%r12 movq %r8,%r13 movq %rax,%r14 bswapq %r12 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,0(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp addq %r14,%r11 movq 8(%rsi),%r12 movq %rdx,%r13 movq %r11,%r14 bswapq %r12 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,8(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp addq %r14,%r10 movq 16(%rsi),%r12 movq %rcx,%r13 movq %r10,%r14 bswapq %r12 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,16(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp addq %r14,%r9 movq 24(%rsi),%r12 movq %rbx,%r13 movq %r9,%r14 bswapq %r12 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,24(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp addq %r14,%r8 movq 32(%rsi),%r12 movq %rax,%r13 movq %r8,%r14 bswapq %r12 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,32(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp addq %r14,%rdx movq 40(%rsi),%r12 movq %r11,%r13 movq %rdx,%r14 bswapq %r12 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,40(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp addq %r14,%rcx movq 48(%rsi),%r12 movq %r10,%r13 movq %rcx,%r14 bswapq %r12 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,48(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp addq %r14,%rbx movq 56(%rsi),%r12 movq %r9,%r13 movq %rbx,%r14 bswapq %r12 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,56(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp addq %r14,%rax movq 64(%rsi),%r12 movq %r8,%r13 movq %rax,%r14 bswapq %r12 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,64(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp addq %r14,%r11 movq 72(%rsi),%r12 movq %rdx,%r13 movq %r11,%r14 bswapq %r12 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,72(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp addq %r14,%r10 movq 80(%rsi),%r12 movq %rcx,%r13 movq %r10,%r14 bswapq %r12 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,80(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp addq %r14,%r9 movq 88(%rsi),%r12 movq %rbx,%r13 movq %r9,%r14 bswapq %r12 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,88(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp addq %r14,%r8 movq 96(%rsi),%r12 movq %rax,%r13 movq %r8,%r14 bswapq %r12 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,96(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp addq %r14,%rdx movq 104(%rsi),%r12 movq %r11,%r13 movq %rdx,%r14 bswapq %r12 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,104(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp addq %r14,%rcx movq 112(%rsi),%r12 movq %r10,%r13 movq %rcx,%r14 bswapq %r12 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,112(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp addq %r14,%rbx movq 120(%rsi),%r12 movq %r9,%r13 movq %rbx,%r14 bswapq %r12 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,120(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp jmp .Lrounds_16_xx .align 16 .Lrounds_16_xx: movq 8(%rsp),%r13 movq 112(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rax movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 72(%rsp),%r12 addq 0(%rsp),%r12 movq %r8,%r13 addq %r15,%r12 movq %rax,%r14 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,0(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp movq 16(%rsp),%r13 movq 120(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r11 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 80(%rsp),%r12 addq 8(%rsp),%r12 movq %rdx,%r13 addq %rdi,%r12 movq %r11,%r14 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,8(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp movq 24(%rsp),%r13 movq 0(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r10 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 88(%rsp),%r12 addq 16(%rsp),%r12 movq %rcx,%r13 addq %r15,%r12 movq %r10,%r14 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,16(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp movq 32(%rsp),%r13 movq 8(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r9 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 96(%rsp),%r12 addq 24(%rsp),%r12 movq %rbx,%r13 addq %rdi,%r12 movq %r9,%r14 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,24(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp movq 40(%rsp),%r13 movq 16(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r8 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 104(%rsp),%r12 addq 32(%rsp),%r12 movq %rax,%r13 addq %r15,%r12 movq %r8,%r14 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,32(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp movq 48(%rsp),%r13 movq 24(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rdx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 112(%rsp),%r12 addq 40(%rsp),%r12 movq %r11,%r13 addq %rdi,%r12 movq %rdx,%r14 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,40(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp movq 56(%rsp),%r13 movq 32(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rcx movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 120(%rsp),%r12 addq 48(%rsp),%r12 movq %r10,%r13 addq %r15,%r12 movq %rcx,%r14 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,48(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp movq 64(%rsp),%r13 movq 40(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rbx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 0(%rsp),%r12 addq 56(%rsp),%r12 movq %r9,%r13 addq %rdi,%r12 movq %rbx,%r14 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,56(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp movq 72(%rsp),%r13 movq 48(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rax movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 8(%rsp),%r12 addq 64(%rsp),%r12 movq %r8,%r13 addq %r15,%r12 movq %rax,%r14 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,64(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp movq 80(%rsp),%r13 movq 56(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r11 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 16(%rsp),%r12 addq 72(%rsp),%r12 movq %rdx,%r13 addq %rdi,%r12 movq %r11,%r14 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,72(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp movq 88(%rsp),%r13 movq 64(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r10 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 24(%rsp),%r12 addq 80(%rsp),%r12 movq %rcx,%r13 addq %r15,%r12 movq %r10,%r14 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,80(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp movq 96(%rsp),%r13 movq 72(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r9 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 32(%rsp),%r12 addq 88(%rsp),%r12 movq %rbx,%r13 addq %rdi,%r12 movq %r9,%r14 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,88(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp movq 104(%rsp),%r13 movq 80(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r8 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 40(%rsp),%r12 addq 96(%rsp),%r12 movq %rax,%r13 addq %r15,%r12 movq %r8,%r14 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,96(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp movq 112(%rsp),%r13 movq 88(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rdx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 48(%rsp),%r12 addq 104(%rsp),%r12 movq %r11,%r13 addq %rdi,%r12 movq %rdx,%r14 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,104(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp movq 120(%rsp),%r13 movq 96(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rcx movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 56(%rsp),%r12 addq 112(%rsp),%r12 movq %r10,%r13 addq %r15,%r12 movq %rcx,%r14 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,112(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp movq 0(%rsp),%r13 movq 104(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rbx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 64(%rsp),%r12 addq 120(%rsp),%r12 movq %r9,%r13 addq %rdi,%r12 movq %rbx,%r14 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,120(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp cmpb $0,7(%rbp) jnz .Lrounds_16_xx movq 128+0(%rsp),%rdi addq %r14,%rax leaq 128(%rsi),%rsi addq 0(%rdi),%rax addq 8(%rdi),%rbx addq 16(%rdi),%rcx addq 24(%rdi),%rdx addq 32(%rdi),%r8 addq 40(%rdi),%r9 addq 48(%rdi),%r10 addq 56(%rdi),%r11 cmpq 128+16(%rsp),%rsi movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) movq %r8,32(%rdi) movq %r9,40(%rdi) movq %r10,48(%rdi) movq %r11,56(%rdi) jb .Lloop movq 152(%rsp),%rsi .cfi_def_cfa %rsi,8 movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order .align 64 .type K512,@object K512: .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .type GFp_sha512_block_data_order_avx,@function .align 64 GFp_sha512_block_data_order_avx: .cfi_startproc .Lavx_shortcut: movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 shlq $4,%rdx subq $160,%rsp leaq (%rsi,%rdx,8),%rdx andq $-64,%rsp movq %rdi,128+0(%rsp) movq %rsi,128+8(%rsp) movq %rdx,128+16(%rsp) movq %rax,152(%rsp) .cfi_escape 0x0f,0x06,0x77,0x98,0x01,0x06,0x23,0x08 .Lprologue_avx: vzeroupper movq 0(%rdi),%rax movq 8(%rdi),%rbx movq 16(%rdi),%rcx movq 24(%rdi),%rdx movq 32(%rdi),%r8 movq 40(%rdi),%r9 movq 48(%rdi),%r10 movq 56(%rdi),%r11 jmp .Lloop_avx .align 16 .Lloop_avx: vmovdqa K512+1280(%rip),%xmm11 vmovdqu 0(%rsi),%xmm0 leaq K512+128(%rip),%rbp vmovdqu 16(%rsi),%xmm1 vmovdqu 32(%rsi),%xmm2 vpshufb %xmm11,%xmm0,%xmm0 vmovdqu 48(%rsi),%xmm3 vpshufb %xmm11,%xmm1,%xmm1 vmovdqu 64(%rsi),%xmm4 vpshufb %xmm11,%xmm2,%xmm2 vmovdqu 80(%rsi),%xmm5 vpshufb %xmm11,%xmm3,%xmm3 vmovdqu 96(%rsi),%xmm6 vpshufb %xmm11,%xmm4,%xmm4 vmovdqu 112(%rsi),%xmm7 vpshufb %xmm11,%xmm5,%xmm5 vpaddq -128(%rbp),%xmm0,%xmm8 vpshufb %xmm11,%xmm6,%xmm6 vpaddq -96(%rbp),%xmm1,%xmm9 vpshufb %xmm11,%xmm7,%xmm7 vpaddq -64(%rbp),%xmm2,%xmm10 vpaddq -32(%rbp),%xmm3,%xmm11 vmovdqa %xmm8,0(%rsp) vpaddq 0(%rbp),%xmm4,%xmm8 vmovdqa %xmm9,16(%rsp) vpaddq 32(%rbp),%xmm5,%xmm9 vmovdqa %xmm10,32(%rsp) vpaddq 64(%rbp),%xmm6,%xmm10 vmovdqa %xmm11,48(%rsp) vpaddq 96(%rbp),%xmm7,%xmm11 vmovdqa %xmm8,64(%rsp) movq %rax,%r14 vmovdqa %xmm9,80(%rsp) movq %rbx,%rdi vmovdqa %xmm10,96(%rsp) xorq %rcx,%rdi vmovdqa %xmm11,112(%rsp) movq %r8,%r13 jmp .Lavx_00_47 .align 16 .Lavx_00_47: addq $256,%rbp vpalignr $8,%xmm0,%xmm1,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rax vpalignr $8,%xmm4,%xmm5,%xmm11 movq %r9,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r8,%r13 xorq %r10,%r12 vpaddq %xmm11,%xmm0,%xmm0 shrdq $4,%r13,%r13 xorq %rax,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r8,%r12 xorq %r8,%r13 vpsllq $56,%xmm8,%xmm9 addq 0(%rsp),%r11 movq %rax,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r10,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rbx,%r15 addq %r12,%r11 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rax,%r14 addq %r13,%r11 vpxor %xmm10,%xmm8,%xmm8 xorq %rbx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm7,%xmm11 addq %r11,%rdx addq %rdi,%r11 vpxor %xmm9,%xmm8,%xmm8 movq %rdx,%r13 addq %r11,%r14 vpsllq $3,%xmm7,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r11 vpaddq %xmm8,%xmm0,%xmm0 movq %r8,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm7,%xmm9 xorq %rdx,%r13 xorq %r9,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r11,%r14 vpsllq $42,%xmm10,%xmm10 andq %rdx,%r12 xorq %rdx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 8(%rsp),%r10 movq %r11,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r9,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rax,%rdi addq %r12,%r10 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm0,%xmm0 xorq %r11,%r14 addq %r13,%r10 vpaddq -128(%rbp),%xmm0,%xmm10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 vmovdqa %xmm10,0(%rsp) vpalignr $8,%xmm1,%xmm2,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r10 vpalignr $8,%xmm5,%xmm6,%xmm11 movq %rdx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rcx,%r13 xorq %r8,%r12 vpaddq %xmm11,%xmm1,%xmm1 shrdq $4,%r13,%r13 xorq %r10,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rcx,%r12 xorq %rcx,%r13 vpsllq $56,%xmm8,%xmm9 addq 16(%rsp),%r9 movq %r10,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r8,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r11,%r15 addq %r12,%r9 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r10,%r14 addq %r13,%r9 vpxor %xmm10,%xmm8,%xmm8 xorq %r11,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm0,%xmm11 addq %r9,%rbx addq %rdi,%r9 vpxor %xmm9,%xmm8,%xmm8 movq %rbx,%r13 addq %r9,%r14 vpsllq $3,%xmm0,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r9 vpaddq %xmm8,%xmm1,%xmm1 movq %rcx,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm0,%xmm9 xorq %rbx,%r13 xorq %rdx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r9,%r14 vpsllq $42,%xmm10,%xmm10 andq %rbx,%r12 xorq %rbx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 24(%rsp),%r8 movq %r9,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rdx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r10,%rdi addq %r12,%r8 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm1,%xmm1 xorq %r9,%r14 addq %r13,%r8 vpaddq -96(%rbp),%xmm1,%xmm10 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 vmovdqa %xmm10,16(%rsp) vpalignr $8,%xmm2,%xmm3,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r8 vpalignr $8,%xmm6,%xmm7,%xmm11 movq %rbx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rax,%r13 xorq %rcx,%r12 vpaddq %xmm11,%xmm2,%xmm2 shrdq $4,%r13,%r13 xorq %r8,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rax,%r12 xorq %rax,%r13 vpsllq $56,%xmm8,%xmm9 addq 32(%rsp),%rdx movq %r8,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rcx,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r9,%r15 addq %r12,%rdx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r8,%r14 addq %r13,%rdx vpxor %xmm10,%xmm8,%xmm8 xorq %r9,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm1,%xmm11 addq %rdx,%r11 addq %rdi,%rdx vpxor %xmm9,%xmm8,%xmm8 movq %r11,%r13 addq %rdx,%r14 vpsllq $3,%xmm1,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rdx vpaddq %xmm8,%xmm2,%xmm2 movq %rax,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm1,%xmm9 xorq %r11,%r13 xorq %rbx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rdx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r11,%r12 xorq %r11,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 40(%rsp),%rcx movq %rdx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rbx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r8,%rdi addq %r12,%rcx vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm2,%xmm2 xorq %rdx,%r14 addq %r13,%rcx vpaddq -64(%rbp),%xmm2,%xmm10 xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 vmovdqa %xmm10,32(%rsp) vpalignr $8,%xmm3,%xmm4,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rcx vpalignr $8,%xmm7,%xmm0,%xmm11 movq %r11,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r10,%r13 xorq %rax,%r12 vpaddq %xmm11,%xmm3,%xmm3 shrdq $4,%r13,%r13 xorq %rcx,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r10,%r12 xorq %r10,%r13 vpsllq $56,%xmm8,%xmm9 addq 48(%rsp),%rbx movq %rcx,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rax,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rdx,%r15 addq %r12,%rbx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rcx,%r14 addq %r13,%rbx vpxor %xmm10,%xmm8,%xmm8 xorq %rdx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm2,%xmm11 addq %rbx,%r9 addq %rdi,%rbx vpxor %xmm9,%xmm8,%xmm8 movq %r9,%r13 addq %rbx,%r14 vpsllq $3,%xmm2,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rbx vpaddq %xmm8,%xmm3,%xmm3 movq %r10,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm2,%xmm9 xorq %r9,%r13 xorq %r11,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rbx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r9,%r12 xorq %r9,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 56(%rsp),%rax movq %rbx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r11,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rcx,%rdi addq %r12,%rax vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm3,%xmm3 xorq %rbx,%r14 addq %r13,%rax vpaddq -32(%rbp),%xmm3,%xmm10 xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 vmovdqa %xmm10,48(%rsp) vpalignr $8,%xmm4,%xmm5,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rax vpalignr $8,%xmm0,%xmm1,%xmm11 movq %r9,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r8,%r13 xorq %r10,%r12 vpaddq %xmm11,%xmm4,%xmm4 shrdq $4,%r13,%r13 xorq %rax,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r8,%r12 xorq %r8,%r13 vpsllq $56,%xmm8,%xmm9 addq 64(%rsp),%r11 movq %rax,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r10,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rbx,%r15 addq %r12,%r11 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rax,%r14 addq %r13,%r11 vpxor %xmm10,%xmm8,%xmm8 xorq %rbx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm3,%xmm11 addq %r11,%rdx addq %rdi,%r11 vpxor %xmm9,%xmm8,%xmm8 movq %rdx,%r13 addq %r11,%r14 vpsllq $3,%xmm3,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r11 vpaddq %xmm8,%xmm4,%xmm4 movq %r8,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm3,%xmm9 xorq %rdx,%r13 xorq %r9,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r11,%r14 vpsllq $42,%xmm10,%xmm10 andq %rdx,%r12 xorq %rdx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 72(%rsp),%r10 movq %r11,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r9,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rax,%rdi addq %r12,%r10 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm4,%xmm4 xorq %r11,%r14 addq %r13,%r10 vpaddq 0(%rbp),%xmm4,%xmm10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 vmovdqa %xmm10,64(%rsp) vpalignr $8,%xmm5,%xmm6,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r10 vpalignr $8,%xmm1,%xmm2,%xmm11 movq %rdx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rcx,%r13 xorq %r8,%r12 vpaddq %xmm11,%xmm5,%xmm5 shrdq $4,%r13,%r13 xorq %r10,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rcx,%r12 xorq %rcx,%r13 vpsllq $56,%xmm8,%xmm9 addq 80(%rsp),%r9 movq %r10,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r8,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r11,%r15 addq %r12,%r9 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r10,%r14 addq %r13,%r9 vpxor %xmm10,%xmm8,%xmm8 xorq %r11,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm4,%xmm11 addq %r9,%rbx addq %rdi,%r9 vpxor %xmm9,%xmm8,%xmm8 movq %rbx,%r13 addq %r9,%r14 vpsllq $3,%xmm4,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r9 vpaddq %xmm8,%xmm5,%xmm5 movq %rcx,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm4,%xmm9 xorq %rbx,%r13 xorq %rdx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r9,%r14 vpsllq $42,%xmm10,%xmm10 andq %rbx,%r12 xorq %rbx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 88(%rsp),%r8 movq %r9,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rdx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r10,%rdi addq %r12,%r8 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm5,%xmm5 xorq %r9,%r14 addq %r13,%r8 vpaddq 32(%rbp),%xmm5,%xmm10 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 vmovdqa %xmm10,80(%rsp) vpalignr $8,%xmm6,%xmm7,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r8 vpalignr $8,%xmm2,%xmm3,%xmm11 movq %rbx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rax,%r13 xorq %rcx,%r12 vpaddq %xmm11,%xmm6,%xmm6 shrdq $4,%r13,%r13 xorq %r8,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rax,%r12 xorq %rax,%r13 vpsllq $56,%xmm8,%xmm9 addq 96(%rsp),%rdx movq %r8,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rcx,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r9,%r15 addq %r12,%rdx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r8,%r14 addq %r13,%rdx vpxor %xmm10,%xmm8,%xmm8 xorq %r9,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm5,%xmm11 addq %rdx,%r11 addq %rdi,%rdx vpxor %xmm9,%xmm8,%xmm8 movq %r11,%r13 addq %rdx,%r14 vpsllq $3,%xmm5,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rdx vpaddq %xmm8,%xmm6,%xmm6 movq %rax,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm5,%xmm9 xorq %r11,%r13 xorq %rbx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rdx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r11,%r12 xorq %r11,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 104(%rsp),%rcx movq %rdx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rbx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r8,%rdi addq %r12,%rcx vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm6,%xmm6 xorq %rdx,%r14 addq %r13,%rcx vpaddq 64(%rbp),%xmm6,%xmm10 xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 vmovdqa %xmm10,96(%rsp) vpalignr $8,%xmm7,%xmm0,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rcx vpalignr $8,%xmm3,%xmm4,%xmm11 movq %r11,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r10,%r13 xorq %rax,%r12 vpaddq %xmm11,%xmm7,%xmm7 shrdq $4,%r13,%r13 xorq %rcx,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r10,%r12 xorq %r10,%r13 vpsllq $56,%xmm8,%xmm9 addq 112(%rsp),%rbx movq %rcx,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rax,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rdx,%r15 addq %r12,%rbx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rcx,%r14 addq %r13,%rbx vpxor %xmm10,%xmm8,%xmm8 xorq %rdx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm6,%xmm11 addq %rbx,%r9 addq %rdi,%rbx vpxor %xmm9,%xmm8,%xmm8 movq %r9,%r13 addq %rbx,%r14 vpsllq $3,%xmm6,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rbx vpaddq %xmm8,%xmm7,%xmm7 movq %r10,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm6,%xmm9 xorq %r9,%r13 xorq %r11,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rbx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r9,%r12 xorq %r9,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 120(%rsp),%rax movq %rbx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r11,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rcx,%rdi addq %r12,%rax vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm7,%xmm7 xorq %rbx,%r14 addq %r13,%rax vpaddq 96(%rbp),%xmm7,%xmm10 xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 vmovdqa %xmm10,112(%rsp) cmpb $0,135(%rbp) jne .Lavx_00_47 shrdq $23,%r13,%r13 movq %r14,%rax movq %r9,%r12 shrdq $5,%r14,%r14 xorq %r8,%r13 xorq %r10,%r12 shrdq $4,%r13,%r13 xorq %rax,%r14 andq %r8,%r12 xorq %r8,%r13 addq 0(%rsp),%r11 movq %rax,%r15 xorq %r10,%r12 shrdq $6,%r14,%r14 xorq %rbx,%r15 addq %r12,%r11 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rax,%r14 addq %r13,%r11 xorq %rbx,%rdi shrdq $28,%r14,%r14 addq %r11,%rdx addq %rdi,%r11 movq %rdx,%r13 addq %r11,%r14 shrdq $23,%r13,%r13 movq %r14,%r11 movq %r8,%r12 shrdq $5,%r14,%r14 xorq %rdx,%r13 xorq %r9,%r12 shrdq $4,%r13,%r13 xorq %r11,%r14 andq %rdx,%r12 xorq %rdx,%r13 addq 8(%rsp),%r10 movq %r11,%rdi xorq %r9,%r12 shrdq $6,%r14,%r14 xorq %rax,%rdi addq %r12,%r10 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r11,%r14 addq %r13,%r10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 shrdq $23,%r13,%r13 movq %r14,%r10 movq %rdx,%r12 shrdq $5,%r14,%r14 xorq %rcx,%r13 xorq %r8,%r12 shrdq $4,%r13,%r13 xorq %r10,%r14 andq %rcx,%r12 xorq %rcx,%r13 addq 16(%rsp),%r9 movq %r10,%r15 xorq %r8,%r12 shrdq $6,%r14,%r14 xorq %r11,%r15 addq %r12,%r9 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r10,%r14 addq %r13,%r9 xorq %r11,%rdi shrdq $28,%r14,%r14 addq %r9,%rbx addq %rdi,%r9 movq %rbx,%r13 addq %r9,%r14 shrdq $23,%r13,%r13 movq %r14,%r9 movq %rcx,%r12 shrdq $5,%r14,%r14 xorq %rbx,%r13 xorq %rdx,%r12 shrdq $4,%r13,%r13 xorq %r9,%r14 andq %rbx,%r12 xorq %rbx,%r13 addq 24(%rsp),%r8 movq %r9,%rdi xorq %rdx,%r12 shrdq $6,%r14,%r14 xorq %r10,%rdi addq %r12,%r8 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r9,%r14 addq %r13,%r8 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 shrdq $23,%r13,%r13 movq %r14,%r8 movq %rbx,%r12 shrdq $5,%r14,%r14 xorq %rax,%r13 xorq %rcx,%r12 shrdq $4,%r13,%r13 xorq %r8,%r14 andq %rax,%r12 xorq %rax,%r13 addq 32(%rsp),%rdx movq %r8,%r15 xorq %rcx,%r12 shrdq $6,%r14,%r14 xorq %r9,%r15 addq %r12,%rdx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r8,%r14 addq %r13,%rdx xorq %r9,%rdi shrdq $28,%r14,%r14 addq %rdx,%r11 addq %rdi,%rdx movq %r11,%r13 addq %rdx,%r14 shrdq $23,%r13,%r13 movq %r14,%rdx movq %rax,%r12 shrdq $5,%r14,%r14 xorq %r11,%r13 xorq %rbx,%r12 shrdq $4,%r13,%r13 xorq %rdx,%r14 andq %r11,%r12 xorq %r11,%r13 addq 40(%rsp),%rcx movq %rdx,%rdi xorq %rbx,%r12 shrdq $6,%r14,%r14 xorq %r8,%rdi addq %r12,%rcx shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rdx,%r14 addq %r13,%rcx xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 shrdq $23,%r13,%r13 movq %r14,%rcx movq %r11,%r12 shrdq $5,%r14,%r14 xorq %r10,%r13 xorq %rax,%r12 shrdq $4,%r13,%r13 xorq %rcx,%r14 andq %r10,%r12 xorq %r10,%r13 addq 48(%rsp),%rbx movq %rcx,%r15 xorq %rax,%r12 shrdq $6,%r14,%r14 xorq %rdx,%r15 addq %r12,%rbx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rcx,%r14 addq %r13,%rbx xorq %rdx,%rdi shrdq $28,%r14,%r14 addq %rbx,%r9 addq %rdi,%rbx movq %r9,%r13 addq %rbx,%r14 shrdq $23,%r13,%r13 movq %r14,%rbx movq %r10,%r12 shrdq $5,%r14,%r14 xorq %r9,%r13 xorq %r11,%r12 shrdq $4,%r13,%r13 xorq %rbx,%r14 andq %r9,%r12 xorq %r9,%r13 addq 56(%rsp),%rax movq %rbx,%rdi xorq %r11,%r12 shrdq $6,%r14,%r14 xorq %rcx,%rdi addq %r12,%rax shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rbx,%r14 addq %r13,%rax xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 shrdq $23,%r13,%r13 movq %r14,%rax movq %r9,%r12 shrdq $5,%r14,%r14 xorq %r8,%r13 xorq %r10,%r12 shrdq $4,%r13,%r13 xorq %rax,%r14 andq %r8,%r12 xorq %r8,%r13 addq 64(%rsp),%r11 movq %rax,%r15 xorq %r10,%r12 shrdq $6,%r14,%r14 xorq %rbx,%r15 addq %r12,%r11 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rax,%r14 addq %r13,%r11 xorq %rbx,%rdi shrdq $28,%r14,%r14 addq %r11,%rdx addq %rdi,%r11 movq %rdx,%r13 addq %r11,%r14 shrdq $23,%r13,%r13 movq %r14,%r11 movq %r8,%r12 shrdq $5,%r14,%r14 xorq %rdx,%r13 xorq %r9,%r12 shrdq $4,%r13,%r13 xorq %r11,%r14 andq %rdx,%r12 xorq %rdx,%r13 addq 72(%rsp),%r10 movq %r11,%rdi xorq %r9,%r12 shrdq $6,%r14,%r14 xorq %rax,%rdi addq %r12,%r10 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r11,%r14 addq %r13,%r10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 shrdq $23,%r13,%r13 movq %r14,%r10 movq %rdx,%r12 shrdq $5,%r14,%r14 xorq %rcx,%r13 xorq %r8,%r12 shrdq $4,%r13,%r13 xorq %r10,%r14 andq %rcx,%r12 xorq %rcx,%r13 addq 80(%rsp),%r9 movq %r10,%r15 xorq %r8,%r12 shrdq $6,%r14,%r14 xorq %r11,%r15 addq %r12,%r9 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r10,%r14 addq %r13,%r9 xorq %r11,%rdi shrdq $28,%r14,%r14 addq %r9,%rbx addq %rdi,%r9 movq %rbx,%r13 addq %r9,%r14 shrdq $23,%r13,%r13 movq %r14,%r9 movq %rcx,%r12 shrdq $5,%r14,%r14 xorq %rbx,%r13 xorq %rdx,%r12 shrdq $4,%r13,%r13 xorq %r9,%r14 andq %rbx,%r12 xorq %rbx,%r13 addq 88(%rsp),%r8 movq %r9,%rdi xorq %rdx,%r12 shrdq $6,%r14,%r14 xorq %r10,%rdi addq %r12,%r8 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r9,%r14 addq %r13,%r8 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 shrdq $23,%r13,%r13 movq %r14,%r8 movq %rbx,%r12 shrdq $5,%r14,%r14 xorq %rax,%r13 xorq %rcx,%r12 shrdq $4,%r13,%r13 xorq %r8,%r14 andq %rax,%r12 xorq %rax,%r13 addq 96(%rsp),%rdx movq %r8,%r15 xorq %rcx,%r12 shrdq $6,%r14,%r14 xorq %r9,%r15 addq %r12,%rdx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r8,%r14 addq %r13,%rdx xorq %r9,%rdi shrdq $28,%r14,%r14 addq %rdx,%r11 addq %rdi,%rdx movq %r11,%r13 addq %rdx,%r14 shrdq $23,%r13,%r13 movq %r14,%rdx movq %rax,%r12 shrdq $5,%r14,%r14 xorq %r11,%r13 xorq %rbx,%r12 shrdq $4,%r13,%r13 xorq %rdx,%r14 andq %r11,%r12 xorq %r11,%r13 addq 104(%rsp),%rcx movq %rdx,%rdi xorq %rbx,%r12 shrdq $6,%r14,%r14 xorq %r8,%rdi addq %r12,%rcx shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rdx,%r14 addq %r13,%rcx xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 shrdq $23,%r13,%r13 movq %r14,%rcx movq %r11,%r12 shrdq $5,%r14,%r14 xorq %r10,%r13 xorq %rax,%r12 shrdq $4,%r13,%r13 xorq %rcx,%r14 andq %r10,%r12 xorq %r10,%r13 addq 112(%rsp),%rbx movq %rcx,%r15 xorq %rax,%r12 shrdq $6,%r14,%r14 xorq %rdx,%r15 addq %r12,%rbx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rcx,%r14 addq %r13,%rbx xorq %rdx,%rdi shrdq $28,%r14,%r14 addq %rbx,%r9 addq %rdi,%rbx movq %r9,%r13 addq %rbx,%r14 shrdq $23,%r13,%r13 movq %r14,%rbx movq %r10,%r12 shrdq $5,%r14,%r14 xorq %r9,%r13 xorq %r11,%r12 shrdq $4,%r13,%r13 xorq %rbx,%r14 andq %r9,%r12 xorq %r9,%r13 addq 120(%rsp),%rax movq %rbx,%rdi xorq %r11,%r12 shrdq $6,%r14,%r14 xorq %rcx,%rdi addq %r12,%rax shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rbx,%r14 addq %r13,%rax xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 movq 128+0(%rsp),%rdi movq %r14,%rax addq 0(%rdi),%rax leaq 128(%rsi),%rsi addq 8(%rdi),%rbx addq 16(%rdi),%rcx addq 24(%rdi),%rdx addq 32(%rdi),%r8 addq 40(%rdi),%r9 addq 48(%rdi),%r10 addq 56(%rdi),%r11 cmpq 128+16(%rsp),%rsi movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) movq %r8,32(%rdi) movq %r9,40(%rdi) movq %r10,48(%rdi) movq %r11,56(%rdi) jb .Lloop_avx movq 152(%rsp),%rsi .cfi_def_cfa %rsi,8 vzeroupper movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lepilogue_avx: .byte 0xf3,0xc3 .cfi_endproc .size GFp_sha512_block_data_order_avx,.-GFp_sha512_block_data_order_avx #endif ring-0.16.9/pregenerated/sha512-x86_64-macosx.S000064400000000000000000001354051353224260000167610ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_sha512_block_data_order .private_extern _GFp_sha512_block_data_order .p2align 4 _GFp_sha512_block_data_order: leaq _GFp_ia32cap_P(%rip),%r11 movl 0(%r11),%r9d movl 4(%r11),%r10d movl 8(%r11),%r11d andl $1073741824,%r9d andl $268435968,%r10d orl %r9d,%r10d cmpl $1342177792,%r10d je L$avx_shortcut movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 shlq $4,%rdx subq $128+32,%rsp leaq (%rsi,%rdx,8),%rdx andq $-64,%rsp movq %rdi,128+0(%rsp) movq %rsi,128+8(%rsp) movq %rdx,128+16(%rsp) movq %rax,152(%rsp) L$prologue: movq 0(%rdi),%rax movq 8(%rdi),%rbx movq 16(%rdi),%rcx movq 24(%rdi),%rdx movq 32(%rdi),%r8 movq 40(%rdi),%r9 movq 48(%rdi),%r10 movq 56(%rdi),%r11 jmp L$loop .p2align 4 L$loop: movq %rbx,%rdi leaq K512(%rip),%rbp xorq %rcx,%rdi movq 0(%rsi),%r12 movq %r8,%r13 movq %rax,%r14 bswapq %r12 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,0(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp addq %r14,%r11 movq 8(%rsi),%r12 movq %rdx,%r13 movq %r11,%r14 bswapq %r12 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,8(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp addq %r14,%r10 movq 16(%rsi),%r12 movq %rcx,%r13 movq %r10,%r14 bswapq %r12 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,16(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp addq %r14,%r9 movq 24(%rsi),%r12 movq %rbx,%r13 movq %r9,%r14 bswapq %r12 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,24(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp addq %r14,%r8 movq 32(%rsi),%r12 movq %rax,%r13 movq %r8,%r14 bswapq %r12 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,32(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp addq %r14,%rdx movq 40(%rsi),%r12 movq %r11,%r13 movq %rdx,%r14 bswapq %r12 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,40(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp addq %r14,%rcx movq 48(%rsi),%r12 movq %r10,%r13 movq %rcx,%r14 bswapq %r12 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,48(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp addq %r14,%rbx movq 56(%rsi),%r12 movq %r9,%r13 movq %rbx,%r14 bswapq %r12 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,56(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp addq %r14,%rax movq 64(%rsi),%r12 movq %r8,%r13 movq %rax,%r14 bswapq %r12 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,64(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp addq %r14,%r11 movq 72(%rsi),%r12 movq %rdx,%r13 movq %r11,%r14 bswapq %r12 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,72(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp addq %r14,%r10 movq 80(%rsi),%r12 movq %rcx,%r13 movq %r10,%r14 bswapq %r12 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,80(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp addq %r14,%r9 movq 88(%rsi),%r12 movq %rbx,%r13 movq %r9,%r14 bswapq %r12 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,88(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp addq %r14,%r8 movq 96(%rsi),%r12 movq %rax,%r13 movq %r8,%r14 bswapq %r12 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,96(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp addq %r14,%rdx movq 104(%rsi),%r12 movq %r11,%r13 movq %rdx,%r14 bswapq %r12 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,104(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp addq %r14,%rcx movq 112(%rsi),%r12 movq %r10,%r13 movq %rcx,%r14 bswapq %r12 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,112(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp addq %r14,%rbx movq 120(%rsi),%r12 movq %r9,%r13 movq %rbx,%r14 bswapq %r12 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,120(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp jmp L$rounds_16_xx .p2align 4 L$rounds_16_xx: movq 8(%rsp),%r13 movq 112(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rax movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 72(%rsp),%r12 addq 0(%rsp),%r12 movq %r8,%r13 addq %r15,%r12 movq %rax,%r14 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,0(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp movq 16(%rsp),%r13 movq 120(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r11 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 80(%rsp),%r12 addq 8(%rsp),%r12 movq %rdx,%r13 addq %rdi,%r12 movq %r11,%r14 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,8(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp movq 24(%rsp),%r13 movq 0(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r10 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 88(%rsp),%r12 addq 16(%rsp),%r12 movq %rcx,%r13 addq %r15,%r12 movq %r10,%r14 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,16(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp movq 32(%rsp),%r13 movq 8(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r9 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 96(%rsp),%r12 addq 24(%rsp),%r12 movq %rbx,%r13 addq %rdi,%r12 movq %r9,%r14 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,24(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp movq 40(%rsp),%r13 movq 16(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r8 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 104(%rsp),%r12 addq 32(%rsp),%r12 movq %rax,%r13 addq %r15,%r12 movq %r8,%r14 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,32(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp movq 48(%rsp),%r13 movq 24(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rdx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 112(%rsp),%r12 addq 40(%rsp),%r12 movq %r11,%r13 addq %rdi,%r12 movq %rdx,%r14 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,40(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp movq 56(%rsp),%r13 movq 32(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rcx movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 120(%rsp),%r12 addq 48(%rsp),%r12 movq %r10,%r13 addq %r15,%r12 movq %rcx,%r14 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,48(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp movq 64(%rsp),%r13 movq 40(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rbx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 0(%rsp),%r12 addq 56(%rsp),%r12 movq %r9,%r13 addq %rdi,%r12 movq %rbx,%r14 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,56(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp movq 72(%rsp),%r13 movq 48(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rax movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 8(%rsp),%r12 addq 64(%rsp),%r12 movq %r8,%r13 addq %r15,%r12 movq %rax,%r14 rorq $23,%r13 movq %r9,%r15 xorq %r8,%r13 rorq $5,%r14 xorq %r10,%r15 movq %r12,64(%rsp) xorq %rax,%r14 andq %r8,%r15 rorq $4,%r13 addq %r11,%r12 xorq %r10,%r15 rorq $6,%r14 xorq %r8,%r13 addq %r15,%r12 movq %rax,%r15 addq (%rbp),%r12 xorq %rax,%r14 xorq %rbx,%r15 rorq $14,%r13 movq %rbx,%r11 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r11 addq %r12,%rdx addq %r12,%r11 leaq 8(%rbp),%rbp movq 80(%rsp),%r13 movq 56(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r11 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 16(%rsp),%r12 addq 72(%rsp),%r12 movq %rdx,%r13 addq %rdi,%r12 movq %r11,%r14 rorq $23,%r13 movq %r8,%rdi xorq %rdx,%r13 rorq $5,%r14 xorq %r9,%rdi movq %r12,72(%rsp) xorq %r11,%r14 andq %rdx,%rdi rorq $4,%r13 addq %r10,%r12 xorq %r9,%rdi rorq $6,%r14 xorq %rdx,%r13 addq %rdi,%r12 movq %r11,%rdi addq (%rbp),%r12 xorq %r11,%r14 xorq %rax,%rdi rorq $14,%r13 movq %rax,%r10 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r10 addq %r12,%rcx addq %r12,%r10 leaq 24(%rbp),%rbp movq 88(%rsp),%r13 movq 64(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r10 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 24(%rsp),%r12 addq 80(%rsp),%r12 movq %rcx,%r13 addq %r15,%r12 movq %r10,%r14 rorq $23,%r13 movq %rdx,%r15 xorq %rcx,%r13 rorq $5,%r14 xorq %r8,%r15 movq %r12,80(%rsp) xorq %r10,%r14 andq %rcx,%r15 rorq $4,%r13 addq %r9,%r12 xorq %r8,%r15 rorq $6,%r14 xorq %rcx,%r13 addq %r15,%r12 movq %r10,%r15 addq (%rbp),%r12 xorq %r10,%r14 xorq %r11,%r15 rorq $14,%r13 movq %r11,%r9 andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%r9 addq %r12,%rbx addq %r12,%r9 leaq 8(%rbp),%rbp movq 96(%rsp),%r13 movq 72(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%r9 movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 32(%rsp),%r12 addq 88(%rsp),%r12 movq %rbx,%r13 addq %rdi,%r12 movq %r9,%r14 rorq $23,%r13 movq %rcx,%rdi xorq %rbx,%r13 rorq $5,%r14 xorq %rdx,%rdi movq %r12,88(%rsp) xorq %r9,%r14 andq %rbx,%rdi rorq $4,%r13 addq %r8,%r12 xorq %rdx,%rdi rorq $6,%r14 xorq %rbx,%r13 addq %rdi,%r12 movq %r9,%rdi addq (%rbp),%r12 xorq %r9,%r14 xorq %r10,%rdi rorq $14,%r13 movq %r10,%r8 andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%r8 addq %r12,%rax addq %r12,%r8 leaq 24(%rbp),%rbp movq 104(%rsp),%r13 movq 80(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%r8 movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 40(%rsp),%r12 addq 96(%rsp),%r12 movq %rax,%r13 addq %r15,%r12 movq %r8,%r14 rorq $23,%r13 movq %rbx,%r15 xorq %rax,%r13 rorq $5,%r14 xorq %rcx,%r15 movq %r12,96(%rsp) xorq %r8,%r14 andq %rax,%r15 rorq $4,%r13 addq %rdx,%r12 xorq %rcx,%r15 rorq $6,%r14 xorq %rax,%r13 addq %r15,%r12 movq %r8,%r15 addq (%rbp),%r12 xorq %r8,%r14 xorq %r9,%r15 rorq $14,%r13 movq %r9,%rdx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rdx addq %r12,%r11 addq %r12,%rdx leaq 8(%rbp),%rbp movq 112(%rsp),%r13 movq 88(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rdx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 48(%rsp),%r12 addq 104(%rsp),%r12 movq %r11,%r13 addq %rdi,%r12 movq %rdx,%r14 rorq $23,%r13 movq %rax,%rdi xorq %r11,%r13 rorq $5,%r14 xorq %rbx,%rdi movq %r12,104(%rsp) xorq %rdx,%r14 andq %r11,%rdi rorq $4,%r13 addq %rcx,%r12 xorq %rbx,%rdi rorq $6,%r14 xorq %r11,%r13 addq %rdi,%r12 movq %rdx,%rdi addq (%rbp),%r12 xorq %rdx,%r14 xorq %r8,%rdi rorq $14,%r13 movq %r8,%rcx andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rcx addq %r12,%r10 addq %r12,%rcx leaq 24(%rbp),%rbp movq 120(%rsp),%r13 movq 96(%rsp),%r15 movq %r13,%r12 rorq $7,%r13 addq %r14,%rcx movq %r15,%r14 rorq $42,%r15 xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%r15 shrq $6,%r14 rorq $19,%r15 xorq %r13,%r12 xorq %r14,%r15 addq 56(%rsp),%r12 addq 112(%rsp),%r12 movq %r10,%r13 addq %r15,%r12 movq %rcx,%r14 rorq $23,%r13 movq %r11,%r15 xorq %r10,%r13 rorq $5,%r14 xorq %rax,%r15 movq %r12,112(%rsp) xorq %rcx,%r14 andq %r10,%r15 rorq $4,%r13 addq %rbx,%r12 xorq %rax,%r15 rorq $6,%r14 xorq %r10,%r13 addq %r15,%r12 movq %rcx,%r15 addq (%rbp),%r12 xorq %rcx,%r14 xorq %rdx,%r15 rorq $14,%r13 movq %rdx,%rbx andq %r15,%rdi rorq $28,%r14 addq %r13,%r12 xorq %rdi,%rbx addq %r12,%r9 addq %r12,%rbx leaq 8(%rbp),%rbp movq 0(%rsp),%r13 movq 104(%rsp),%rdi movq %r13,%r12 rorq $7,%r13 addq %r14,%rbx movq %rdi,%r14 rorq $42,%rdi xorq %r12,%r13 shrq $7,%r12 rorq $1,%r13 xorq %r14,%rdi shrq $6,%r14 rorq $19,%rdi xorq %r13,%r12 xorq %r14,%rdi addq 64(%rsp),%r12 addq 120(%rsp),%r12 movq %r9,%r13 addq %rdi,%r12 movq %rbx,%r14 rorq $23,%r13 movq %r10,%rdi xorq %r9,%r13 rorq $5,%r14 xorq %r11,%rdi movq %r12,120(%rsp) xorq %rbx,%r14 andq %r9,%rdi rorq $4,%r13 addq %rax,%r12 xorq %r11,%rdi rorq $6,%r14 xorq %r9,%r13 addq %rdi,%r12 movq %rbx,%rdi addq (%rbp),%r12 xorq %rbx,%r14 xorq %rcx,%rdi rorq $14,%r13 movq %rcx,%rax andq %rdi,%r15 rorq $28,%r14 addq %r13,%r12 xorq %r15,%rax addq %r12,%r8 addq %r12,%rax leaq 24(%rbp),%rbp cmpb $0,7(%rbp) jnz L$rounds_16_xx movq 128+0(%rsp),%rdi addq %r14,%rax leaq 128(%rsi),%rsi addq 0(%rdi),%rax addq 8(%rdi),%rbx addq 16(%rdi),%rcx addq 24(%rdi),%rdx addq 32(%rdi),%r8 addq 40(%rdi),%r9 addq 48(%rdi),%r10 addq 56(%rdi),%r11 cmpq 128+16(%rsp),%rsi movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) movq %r8,32(%rdi) movq %r9,40(%rdi) movq %r10,48(%rdi) movq %r11,56(%rdi) jb L$loop movq 152(%rsp),%rsi movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$epilogue: .byte 0xf3,0xc3 .p2align 6 K512: .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0x428a2f98d728ae22,0x7137449123ef65cd .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x3956c25bf348b538,0x59f111f1b605d019 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0xd807aa98a3030242,0x12835b0145706fbe .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0x9bdc06a725c71235,0xc19bf174cf692694 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0x983e5152ee66dfab,0xa831c66d2db43210 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x06ca6351e003826f,0x142929670a0e6e70 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0x81c2c92e47edaee6,0x92722c851482353b .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xd192e819d6ef5218,0xd69906245565a910 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0xf40e35855771202a,0x106aa07032bbd1b8 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0x90befffa23631e28,0xa4506cebde82bde9 .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xca273eceea26619c,0xd186b8c721c0c207 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x113f9804bef90dae,0x1b710b35131c471b .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x28db77f523047d84,0x32caab7b40c72493 .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 GFp_sha512_block_data_order_avx: L$avx_shortcut: movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 shlq $4,%rdx subq $160,%rsp leaq (%rsi,%rdx,8),%rdx andq $-64,%rsp movq %rdi,128+0(%rsp) movq %rsi,128+8(%rsp) movq %rdx,128+16(%rsp) movq %rax,152(%rsp) L$prologue_avx: vzeroupper movq 0(%rdi),%rax movq 8(%rdi),%rbx movq 16(%rdi),%rcx movq 24(%rdi),%rdx movq 32(%rdi),%r8 movq 40(%rdi),%r9 movq 48(%rdi),%r10 movq 56(%rdi),%r11 jmp L$loop_avx .p2align 4 L$loop_avx: vmovdqa K512+1280(%rip),%xmm11 vmovdqu 0(%rsi),%xmm0 leaq K512+128(%rip),%rbp vmovdqu 16(%rsi),%xmm1 vmovdqu 32(%rsi),%xmm2 vpshufb %xmm11,%xmm0,%xmm0 vmovdqu 48(%rsi),%xmm3 vpshufb %xmm11,%xmm1,%xmm1 vmovdqu 64(%rsi),%xmm4 vpshufb %xmm11,%xmm2,%xmm2 vmovdqu 80(%rsi),%xmm5 vpshufb %xmm11,%xmm3,%xmm3 vmovdqu 96(%rsi),%xmm6 vpshufb %xmm11,%xmm4,%xmm4 vmovdqu 112(%rsi),%xmm7 vpshufb %xmm11,%xmm5,%xmm5 vpaddq -128(%rbp),%xmm0,%xmm8 vpshufb %xmm11,%xmm6,%xmm6 vpaddq -96(%rbp),%xmm1,%xmm9 vpshufb %xmm11,%xmm7,%xmm7 vpaddq -64(%rbp),%xmm2,%xmm10 vpaddq -32(%rbp),%xmm3,%xmm11 vmovdqa %xmm8,0(%rsp) vpaddq 0(%rbp),%xmm4,%xmm8 vmovdqa %xmm9,16(%rsp) vpaddq 32(%rbp),%xmm5,%xmm9 vmovdqa %xmm10,32(%rsp) vpaddq 64(%rbp),%xmm6,%xmm10 vmovdqa %xmm11,48(%rsp) vpaddq 96(%rbp),%xmm7,%xmm11 vmovdqa %xmm8,64(%rsp) movq %rax,%r14 vmovdqa %xmm9,80(%rsp) movq %rbx,%rdi vmovdqa %xmm10,96(%rsp) xorq %rcx,%rdi vmovdqa %xmm11,112(%rsp) movq %r8,%r13 jmp L$avx_00_47 .p2align 4 L$avx_00_47: addq $256,%rbp vpalignr $8,%xmm0,%xmm1,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rax vpalignr $8,%xmm4,%xmm5,%xmm11 movq %r9,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r8,%r13 xorq %r10,%r12 vpaddq %xmm11,%xmm0,%xmm0 shrdq $4,%r13,%r13 xorq %rax,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r8,%r12 xorq %r8,%r13 vpsllq $56,%xmm8,%xmm9 addq 0(%rsp),%r11 movq %rax,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r10,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rbx,%r15 addq %r12,%r11 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rax,%r14 addq %r13,%r11 vpxor %xmm10,%xmm8,%xmm8 xorq %rbx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm7,%xmm11 addq %r11,%rdx addq %rdi,%r11 vpxor %xmm9,%xmm8,%xmm8 movq %rdx,%r13 addq %r11,%r14 vpsllq $3,%xmm7,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r11 vpaddq %xmm8,%xmm0,%xmm0 movq %r8,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm7,%xmm9 xorq %rdx,%r13 xorq %r9,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r11,%r14 vpsllq $42,%xmm10,%xmm10 andq %rdx,%r12 xorq %rdx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 8(%rsp),%r10 movq %r11,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r9,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rax,%rdi addq %r12,%r10 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm0,%xmm0 xorq %r11,%r14 addq %r13,%r10 vpaddq -128(%rbp),%xmm0,%xmm10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 vmovdqa %xmm10,0(%rsp) vpalignr $8,%xmm1,%xmm2,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r10 vpalignr $8,%xmm5,%xmm6,%xmm11 movq %rdx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rcx,%r13 xorq %r8,%r12 vpaddq %xmm11,%xmm1,%xmm1 shrdq $4,%r13,%r13 xorq %r10,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rcx,%r12 xorq %rcx,%r13 vpsllq $56,%xmm8,%xmm9 addq 16(%rsp),%r9 movq %r10,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r8,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r11,%r15 addq %r12,%r9 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r10,%r14 addq %r13,%r9 vpxor %xmm10,%xmm8,%xmm8 xorq %r11,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm0,%xmm11 addq %r9,%rbx addq %rdi,%r9 vpxor %xmm9,%xmm8,%xmm8 movq %rbx,%r13 addq %r9,%r14 vpsllq $3,%xmm0,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r9 vpaddq %xmm8,%xmm1,%xmm1 movq %rcx,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm0,%xmm9 xorq %rbx,%r13 xorq %rdx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r9,%r14 vpsllq $42,%xmm10,%xmm10 andq %rbx,%r12 xorq %rbx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 24(%rsp),%r8 movq %r9,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rdx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r10,%rdi addq %r12,%r8 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm1,%xmm1 xorq %r9,%r14 addq %r13,%r8 vpaddq -96(%rbp),%xmm1,%xmm10 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 vmovdqa %xmm10,16(%rsp) vpalignr $8,%xmm2,%xmm3,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r8 vpalignr $8,%xmm6,%xmm7,%xmm11 movq %rbx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rax,%r13 xorq %rcx,%r12 vpaddq %xmm11,%xmm2,%xmm2 shrdq $4,%r13,%r13 xorq %r8,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rax,%r12 xorq %rax,%r13 vpsllq $56,%xmm8,%xmm9 addq 32(%rsp),%rdx movq %r8,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rcx,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r9,%r15 addq %r12,%rdx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r8,%r14 addq %r13,%rdx vpxor %xmm10,%xmm8,%xmm8 xorq %r9,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm1,%xmm11 addq %rdx,%r11 addq %rdi,%rdx vpxor %xmm9,%xmm8,%xmm8 movq %r11,%r13 addq %rdx,%r14 vpsllq $3,%xmm1,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rdx vpaddq %xmm8,%xmm2,%xmm2 movq %rax,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm1,%xmm9 xorq %r11,%r13 xorq %rbx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rdx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r11,%r12 xorq %r11,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 40(%rsp),%rcx movq %rdx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rbx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r8,%rdi addq %r12,%rcx vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm2,%xmm2 xorq %rdx,%r14 addq %r13,%rcx vpaddq -64(%rbp),%xmm2,%xmm10 xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 vmovdqa %xmm10,32(%rsp) vpalignr $8,%xmm3,%xmm4,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rcx vpalignr $8,%xmm7,%xmm0,%xmm11 movq %r11,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r10,%r13 xorq %rax,%r12 vpaddq %xmm11,%xmm3,%xmm3 shrdq $4,%r13,%r13 xorq %rcx,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r10,%r12 xorq %r10,%r13 vpsllq $56,%xmm8,%xmm9 addq 48(%rsp),%rbx movq %rcx,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rax,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rdx,%r15 addq %r12,%rbx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rcx,%r14 addq %r13,%rbx vpxor %xmm10,%xmm8,%xmm8 xorq %rdx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm2,%xmm11 addq %rbx,%r9 addq %rdi,%rbx vpxor %xmm9,%xmm8,%xmm8 movq %r9,%r13 addq %rbx,%r14 vpsllq $3,%xmm2,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rbx vpaddq %xmm8,%xmm3,%xmm3 movq %r10,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm2,%xmm9 xorq %r9,%r13 xorq %r11,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rbx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r9,%r12 xorq %r9,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 56(%rsp),%rax movq %rbx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r11,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rcx,%rdi addq %r12,%rax vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm3,%xmm3 xorq %rbx,%r14 addq %r13,%rax vpaddq -32(%rbp),%xmm3,%xmm10 xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 vmovdqa %xmm10,48(%rsp) vpalignr $8,%xmm4,%xmm5,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rax vpalignr $8,%xmm0,%xmm1,%xmm11 movq %r9,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r8,%r13 xorq %r10,%r12 vpaddq %xmm11,%xmm4,%xmm4 shrdq $4,%r13,%r13 xorq %rax,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r8,%r12 xorq %r8,%r13 vpsllq $56,%xmm8,%xmm9 addq 64(%rsp),%r11 movq %rax,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r10,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rbx,%r15 addq %r12,%r11 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rax,%r14 addq %r13,%r11 vpxor %xmm10,%xmm8,%xmm8 xorq %rbx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm3,%xmm11 addq %r11,%rdx addq %rdi,%r11 vpxor %xmm9,%xmm8,%xmm8 movq %rdx,%r13 addq %r11,%r14 vpsllq $3,%xmm3,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r11 vpaddq %xmm8,%xmm4,%xmm4 movq %r8,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm3,%xmm9 xorq %rdx,%r13 xorq %r9,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r11,%r14 vpsllq $42,%xmm10,%xmm10 andq %rdx,%r12 xorq %rdx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 72(%rsp),%r10 movq %r11,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r9,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rax,%rdi addq %r12,%r10 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm4,%xmm4 xorq %r11,%r14 addq %r13,%r10 vpaddq 0(%rbp),%xmm4,%xmm10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 vmovdqa %xmm10,64(%rsp) vpalignr $8,%xmm5,%xmm6,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r10 vpalignr $8,%xmm1,%xmm2,%xmm11 movq %rdx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rcx,%r13 xorq %r8,%r12 vpaddq %xmm11,%xmm5,%xmm5 shrdq $4,%r13,%r13 xorq %r10,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rcx,%r12 xorq %rcx,%r13 vpsllq $56,%xmm8,%xmm9 addq 80(%rsp),%r9 movq %r10,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %r8,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r11,%r15 addq %r12,%r9 vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r10,%r14 addq %r13,%r9 vpxor %xmm10,%xmm8,%xmm8 xorq %r11,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm4,%xmm11 addq %r9,%rbx addq %rdi,%r9 vpxor %xmm9,%xmm8,%xmm8 movq %rbx,%r13 addq %r9,%r14 vpsllq $3,%xmm4,%xmm10 shrdq $23,%r13,%r13 movq %r14,%r9 vpaddq %xmm8,%xmm5,%xmm5 movq %rcx,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm4,%xmm9 xorq %rbx,%r13 xorq %rdx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %r9,%r14 vpsllq $42,%xmm10,%xmm10 andq %rbx,%r12 xorq %rbx,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 88(%rsp),%r8 movq %r9,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rdx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r10,%rdi addq %r12,%r8 vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm5,%xmm5 xorq %r9,%r14 addq %r13,%r8 vpaddq 32(%rbp),%xmm5,%xmm10 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 vmovdqa %xmm10,80(%rsp) vpalignr $8,%xmm6,%xmm7,%xmm8 shrdq $23,%r13,%r13 movq %r14,%r8 vpalignr $8,%xmm2,%xmm3,%xmm11 movq %rbx,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %rax,%r13 xorq %rcx,%r12 vpaddq %xmm11,%xmm6,%xmm6 shrdq $4,%r13,%r13 xorq %r8,%r14 vpsrlq $7,%xmm8,%xmm11 andq %rax,%r12 xorq %rax,%r13 vpsllq $56,%xmm8,%xmm9 addq 96(%rsp),%rdx movq %r8,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rcx,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %r9,%r15 addq %r12,%rdx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %r8,%r14 addq %r13,%rdx vpxor %xmm10,%xmm8,%xmm8 xorq %r9,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm5,%xmm11 addq %rdx,%r11 addq %rdi,%rdx vpxor %xmm9,%xmm8,%xmm8 movq %r11,%r13 addq %rdx,%r14 vpsllq $3,%xmm5,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rdx vpaddq %xmm8,%xmm6,%xmm6 movq %rax,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm5,%xmm9 xorq %r11,%r13 xorq %rbx,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rdx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r11,%r12 xorq %r11,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 104(%rsp),%rcx movq %rdx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %rbx,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %r8,%rdi addq %r12,%rcx vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm6,%xmm6 xorq %rdx,%r14 addq %r13,%rcx vpaddq 64(%rbp),%xmm6,%xmm10 xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 vmovdqa %xmm10,96(%rsp) vpalignr $8,%xmm7,%xmm0,%xmm8 shrdq $23,%r13,%r13 movq %r14,%rcx vpalignr $8,%xmm3,%xmm4,%xmm11 movq %r11,%r12 shrdq $5,%r14,%r14 vpsrlq $1,%xmm8,%xmm10 xorq %r10,%r13 xorq %rax,%r12 vpaddq %xmm11,%xmm7,%xmm7 shrdq $4,%r13,%r13 xorq %rcx,%r14 vpsrlq $7,%xmm8,%xmm11 andq %r10,%r12 xorq %r10,%r13 vpsllq $56,%xmm8,%xmm9 addq 112(%rsp),%rbx movq %rcx,%r15 vpxor %xmm10,%xmm11,%xmm8 xorq %rax,%r12 shrdq $6,%r14,%r14 vpsrlq $7,%xmm10,%xmm10 xorq %rdx,%r15 addq %r12,%rbx vpxor %xmm9,%xmm8,%xmm8 shrdq $14,%r13,%r13 andq %r15,%rdi vpsllq $7,%xmm9,%xmm9 xorq %rcx,%r14 addq %r13,%rbx vpxor %xmm10,%xmm8,%xmm8 xorq %rdx,%rdi shrdq $28,%r14,%r14 vpsrlq $6,%xmm6,%xmm11 addq %rbx,%r9 addq %rdi,%rbx vpxor %xmm9,%xmm8,%xmm8 movq %r9,%r13 addq %rbx,%r14 vpsllq $3,%xmm6,%xmm10 shrdq $23,%r13,%r13 movq %r14,%rbx vpaddq %xmm8,%xmm7,%xmm7 movq %r10,%r12 shrdq $5,%r14,%r14 vpsrlq $19,%xmm6,%xmm9 xorq %r9,%r13 xorq %r11,%r12 vpxor %xmm10,%xmm11,%xmm11 shrdq $4,%r13,%r13 xorq %rbx,%r14 vpsllq $42,%xmm10,%xmm10 andq %r9,%r12 xorq %r9,%r13 vpxor %xmm9,%xmm11,%xmm11 addq 120(%rsp),%rax movq %rbx,%rdi vpsrlq $42,%xmm9,%xmm9 xorq %r11,%r12 shrdq $6,%r14,%r14 vpxor %xmm10,%xmm11,%xmm11 xorq %rcx,%rdi addq %r12,%rax vpxor %xmm9,%xmm11,%xmm11 shrdq $14,%r13,%r13 andq %rdi,%r15 vpaddq %xmm11,%xmm7,%xmm7 xorq %rbx,%r14 addq %r13,%rax vpaddq 96(%rbp),%xmm7,%xmm10 xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 vmovdqa %xmm10,112(%rsp) cmpb $0,135(%rbp) jne L$avx_00_47 shrdq $23,%r13,%r13 movq %r14,%rax movq %r9,%r12 shrdq $5,%r14,%r14 xorq %r8,%r13 xorq %r10,%r12 shrdq $4,%r13,%r13 xorq %rax,%r14 andq %r8,%r12 xorq %r8,%r13 addq 0(%rsp),%r11 movq %rax,%r15 xorq %r10,%r12 shrdq $6,%r14,%r14 xorq %rbx,%r15 addq %r12,%r11 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rax,%r14 addq %r13,%r11 xorq %rbx,%rdi shrdq $28,%r14,%r14 addq %r11,%rdx addq %rdi,%r11 movq %rdx,%r13 addq %r11,%r14 shrdq $23,%r13,%r13 movq %r14,%r11 movq %r8,%r12 shrdq $5,%r14,%r14 xorq %rdx,%r13 xorq %r9,%r12 shrdq $4,%r13,%r13 xorq %r11,%r14 andq %rdx,%r12 xorq %rdx,%r13 addq 8(%rsp),%r10 movq %r11,%rdi xorq %r9,%r12 shrdq $6,%r14,%r14 xorq %rax,%rdi addq %r12,%r10 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r11,%r14 addq %r13,%r10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 shrdq $23,%r13,%r13 movq %r14,%r10 movq %rdx,%r12 shrdq $5,%r14,%r14 xorq %rcx,%r13 xorq %r8,%r12 shrdq $4,%r13,%r13 xorq %r10,%r14 andq %rcx,%r12 xorq %rcx,%r13 addq 16(%rsp),%r9 movq %r10,%r15 xorq %r8,%r12 shrdq $6,%r14,%r14 xorq %r11,%r15 addq %r12,%r9 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r10,%r14 addq %r13,%r9 xorq %r11,%rdi shrdq $28,%r14,%r14 addq %r9,%rbx addq %rdi,%r9 movq %rbx,%r13 addq %r9,%r14 shrdq $23,%r13,%r13 movq %r14,%r9 movq %rcx,%r12 shrdq $5,%r14,%r14 xorq %rbx,%r13 xorq %rdx,%r12 shrdq $4,%r13,%r13 xorq %r9,%r14 andq %rbx,%r12 xorq %rbx,%r13 addq 24(%rsp),%r8 movq %r9,%rdi xorq %rdx,%r12 shrdq $6,%r14,%r14 xorq %r10,%rdi addq %r12,%r8 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r9,%r14 addq %r13,%r8 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 shrdq $23,%r13,%r13 movq %r14,%r8 movq %rbx,%r12 shrdq $5,%r14,%r14 xorq %rax,%r13 xorq %rcx,%r12 shrdq $4,%r13,%r13 xorq %r8,%r14 andq %rax,%r12 xorq %rax,%r13 addq 32(%rsp),%rdx movq %r8,%r15 xorq %rcx,%r12 shrdq $6,%r14,%r14 xorq %r9,%r15 addq %r12,%rdx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r8,%r14 addq %r13,%rdx xorq %r9,%rdi shrdq $28,%r14,%r14 addq %rdx,%r11 addq %rdi,%rdx movq %r11,%r13 addq %rdx,%r14 shrdq $23,%r13,%r13 movq %r14,%rdx movq %rax,%r12 shrdq $5,%r14,%r14 xorq %r11,%r13 xorq %rbx,%r12 shrdq $4,%r13,%r13 xorq %rdx,%r14 andq %r11,%r12 xorq %r11,%r13 addq 40(%rsp),%rcx movq %rdx,%rdi xorq %rbx,%r12 shrdq $6,%r14,%r14 xorq %r8,%rdi addq %r12,%rcx shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rdx,%r14 addq %r13,%rcx xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 shrdq $23,%r13,%r13 movq %r14,%rcx movq %r11,%r12 shrdq $5,%r14,%r14 xorq %r10,%r13 xorq %rax,%r12 shrdq $4,%r13,%r13 xorq %rcx,%r14 andq %r10,%r12 xorq %r10,%r13 addq 48(%rsp),%rbx movq %rcx,%r15 xorq %rax,%r12 shrdq $6,%r14,%r14 xorq %rdx,%r15 addq %r12,%rbx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rcx,%r14 addq %r13,%rbx xorq %rdx,%rdi shrdq $28,%r14,%r14 addq %rbx,%r9 addq %rdi,%rbx movq %r9,%r13 addq %rbx,%r14 shrdq $23,%r13,%r13 movq %r14,%rbx movq %r10,%r12 shrdq $5,%r14,%r14 xorq %r9,%r13 xorq %r11,%r12 shrdq $4,%r13,%r13 xorq %rbx,%r14 andq %r9,%r12 xorq %r9,%r13 addq 56(%rsp),%rax movq %rbx,%rdi xorq %r11,%r12 shrdq $6,%r14,%r14 xorq %rcx,%rdi addq %r12,%rax shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rbx,%r14 addq %r13,%rax xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 shrdq $23,%r13,%r13 movq %r14,%rax movq %r9,%r12 shrdq $5,%r14,%r14 xorq %r8,%r13 xorq %r10,%r12 shrdq $4,%r13,%r13 xorq %rax,%r14 andq %r8,%r12 xorq %r8,%r13 addq 64(%rsp),%r11 movq %rax,%r15 xorq %r10,%r12 shrdq $6,%r14,%r14 xorq %rbx,%r15 addq %r12,%r11 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rax,%r14 addq %r13,%r11 xorq %rbx,%rdi shrdq $28,%r14,%r14 addq %r11,%rdx addq %rdi,%r11 movq %rdx,%r13 addq %r11,%r14 shrdq $23,%r13,%r13 movq %r14,%r11 movq %r8,%r12 shrdq $5,%r14,%r14 xorq %rdx,%r13 xorq %r9,%r12 shrdq $4,%r13,%r13 xorq %r11,%r14 andq %rdx,%r12 xorq %rdx,%r13 addq 72(%rsp),%r10 movq %r11,%rdi xorq %r9,%r12 shrdq $6,%r14,%r14 xorq %rax,%rdi addq %r12,%r10 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r11,%r14 addq %r13,%r10 xorq %rax,%r15 shrdq $28,%r14,%r14 addq %r10,%rcx addq %r15,%r10 movq %rcx,%r13 addq %r10,%r14 shrdq $23,%r13,%r13 movq %r14,%r10 movq %rdx,%r12 shrdq $5,%r14,%r14 xorq %rcx,%r13 xorq %r8,%r12 shrdq $4,%r13,%r13 xorq %r10,%r14 andq %rcx,%r12 xorq %rcx,%r13 addq 80(%rsp),%r9 movq %r10,%r15 xorq %r8,%r12 shrdq $6,%r14,%r14 xorq %r11,%r15 addq %r12,%r9 shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r10,%r14 addq %r13,%r9 xorq %r11,%rdi shrdq $28,%r14,%r14 addq %r9,%rbx addq %rdi,%r9 movq %rbx,%r13 addq %r9,%r14 shrdq $23,%r13,%r13 movq %r14,%r9 movq %rcx,%r12 shrdq $5,%r14,%r14 xorq %rbx,%r13 xorq %rdx,%r12 shrdq $4,%r13,%r13 xorq %r9,%r14 andq %rbx,%r12 xorq %rbx,%r13 addq 88(%rsp),%r8 movq %r9,%rdi xorq %rdx,%r12 shrdq $6,%r14,%r14 xorq %r10,%rdi addq %r12,%r8 shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %r9,%r14 addq %r13,%r8 xorq %r10,%r15 shrdq $28,%r14,%r14 addq %r8,%rax addq %r15,%r8 movq %rax,%r13 addq %r8,%r14 shrdq $23,%r13,%r13 movq %r14,%r8 movq %rbx,%r12 shrdq $5,%r14,%r14 xorq %rax,%r13 xorq %rcx,%r12 shrdq $4,%r13,%r13 xorq %r8,%r14 andq %rax,%r12 xorq %rax,%r13 addq 96(%rsp),%rdx movq %r8,%r15 xorq %rcx,%r12 shrdq $6,%r14,%r14 xorq %r9,%r15 addq %r12,%rdx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %r8,%r14 addq %r13,%rdx xorq %r9,%rdi shrdq $28,%r14,%r14 addq %rdx,%r11 addq %rdi,%rdx movq %r11,%r13 addq %rdx,%r14 shrdq $23,%r13,%r13 movq %r14,%rdx movq %rax,%r12 shrdq $5,%r14,%r14 xorq %r11,%r13 xorq %rbx,%r12 shrdq $4,%r13,%r13 xorq %rdx,%r14 andq %r11,%r12 xorq %r11,%r13 addq 104(%rsp),%rcx movq %rdx,%rdi xorq %rbx,%r12 shrdq $6,%r14,%r14 xorq %r8,%rdi addq %r12,%rcx shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rdx,%r14 addq %r13,%rcx xorq %r8,%r15 shrdq $28,%r14,%r14 addq %rcx,%r10 addq %r15,%rcx movq %r10,%r13 addq %rcx,%r14 shrdq $23,%r13,%r13 movq %r14,%rcx movq %r11,%r12 shrdq $5,%r14,%r14 xorq %r10,%r13 xorq %rax,%r12 shrdq $4,%r13,%r13 xorq %rcx,%r14 andq %r10,%r12 xorq %r10,%r13 addq 112(%rsp),%rbx movq %rcx,%r15 xorq %rax,%r12 shrdq $6,%r14,%r14 xorq %rdx,%r15 addq %r12,%rbx shrdq $14,%r13,%r13 andq %r15,%rdi xorq %rcx,%r14 addq %r13,%rbx xorq %rdx,%rdi shrdq $28,%r14,%r14 addq %rbx,%r9 addq %rdi,%rbx movq %r9,%r13 addq %rbx,%r14 shrdq $23,%r13,%r13 movq %r14,%rbx movq %r10,%r12 shrdq $5,%r14,%r14 xorq %r9,%r13 xorq %r11,%r12 shrdq $4,%r13,%r13 xorq %rbx,%r14 andq %r9,%r12 xorq %r9,%r13 addq 120(%rsp),%rax movq %rbx,%rdi xorq %r11,%r12 shrdq $6,%r14,%r14 xorq %rcx,%rdi addq %r12,%rax shrdq $14,%r13,%r13 andq %rdi,%r15 xorq %rbx,%r14 addq %r13,%rax xorq %rcx,%r15 shrdq $28,%r14,%r14 addq %rax,%r8 addq %r15,%rax movq %r8,%r13 addq %rax,%r14 movq 128+0(%rsp),%rdi movq %r14,%rax addq 0(%rdi),%rax leaq 128(%rsi),%rsi addq 8(%rdi),%rbx addq 16(%rdi),%rcx addq 24(%rdi),%rdx addq 32(%rdi),%r8 addq 40(%rdi),%r9 addq 48(%rdi),%r10 addq 56(%rdi),%r11 cmpq 128+16(%rsp),%rsi movq %rax,0(%rdi) movq %rbx,8(%rdi) movq %rcx,16(%rdi) movq %rdx,24(%rdi) movq %r8,32(%rdi) movq %r9,40(%rdi) movq %r10,48(%rdi) movq %r11,56(%rdi) jb L$loop_avx movq 152(%rsp),%rsi vzeroupper movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$epilogue_avx: .byte 0xf3,0xc3 #endif ring-0.16.9/pregenerated/sha512-x86_64-nasm.obj000064400000000000000000001047041353224260300167760ustar0000000000000000dEi][".text[+7, p`.pdata[+K,c,@0@.xdatas+ ,,@@@.debug$SV,*@B.debug$T O@BH|$Ht$HHHLLE ESE[A@AE APHSUATAUAVAWHHHHH$H$H$H$HH_HOHWLG LO(LW0L_8fDHH-H1L&MIIIMM1IM1L$$I1M!IMM1IM1MILeI1I1IIL!IMI1LMHmMLfIMIILI1IL1Ld$M1H!IML1II1ILLeM1H1III!IMM1LMHmMLfIMIIII1IM1Ld$M1I!IMM1II1MMLeM1M1IML!IMI1LMHmMLfIMIIHI1IH1Ld$M1H!IMH1II1ILLeM1L1IMI!IMM1LMHmMLf IMIIII1II1Ld$ M1I!III1II1MMLeM1M1ILL!IMH1MLHmLLf(MIIIHM1IH1Ld$(I1L!IIH1IM1IHLeI1L1ILI!IML1MLHmLLf0MIIIMM1II1Ld$0I1M!III1IM1MILeI1I1IHL!IMH1MLHmLLf8MIIILM1IL1Ld$8I1L!IIL1IM1IHLeI1H1IHI!IML1MLHmLLf@MIIIMM1IM1Ld$@I1M!IMM1IM1MILeI1I1IIL!IMI1LMHmMLfHIMIILI1IL1Ld$HM1H!IML1II1ILLeM1H1III!IMM1LMHmMLfPIMIIII1IM1Ld$PM1I!IMM1II1MMLeM1M1IML!IMI1LMHmMLfXIMIIHI1IH1Ld$XM1H!IMH1II1ILLeM1L1IMI!IMM1LMHmMLf`IMIIII1II1Ld$`M1I!III1II1MMLeM1M1ILL!IMH1MLHmLLfhMIIIHM1IH1Ld$hI1L!IIH1IM1IHLeI1L1ILI!IML1MLHmLLfpMIIIMM1II1Ld$pI1M!III1IM1MILeI1I1IHL!IMH1MLHmLLfxMIIILM1IL1Ld$xI1L!IIL1IM1IHLeI1H1IHI!IML1MLHmLl$L|$pMILMI*M1IIM1IIM1M1Ld$HL$$MMIIMM1IM1L$$I1M!IMM1IM1MILeI1I1IIL!IMI1LMHmLl$H|$xMIMIH*M1IIL1IHM1L1Ld$PLd$IIMILI1IL1Ld$M1H!IML1II1ILLeM1H1III!IMM1LMHmLl$L<$MIMMI*M1IIM1IIM1M1Ld$XLd$IMMIII1IM1Ld$M1I!IMM1II1MMLeM1M1IML!IMI1LMHmLl$ H|$MIMIH*M1IIL1IHM1L1Ld$`Ld$IIMIHI1IH1Ld$M1H!IMH1II1ILLeM1L1IMI!IMM1LMHmLl$(L|$MIMMI*M1IIM1IIM1M1Ld$hLd$ IMMIII1II1Ld$ M1I!III1II1MMLeM1M1ILL!IMH1MLHmLl$0H|$MILIH*M1IIL1IHM1L1Ld$pLd$(MIIIHM1IH1Ld$(I1L!IIH1IM1IHLeI1L1ILI!IML1MLHmLl$8L|$ MILMI*M1IIM1IIM1M1Ld$xLd$0MMIIMM1II1Ld$0I1M!III1IM1MILeI1I1IHL!IMH1MLHmLl$@H|$(MILIH*M1IIL1IHM1L1L$$Ld$8MIIILM1IL1Ld$8I1L!IIL1IM1IHLeI1H1IHI!IML1MLHmLl$HL|$0MILMI*M1IIM1IIM1M1Ld$Ld$@MMIIMM1IM1Ld$@I1M!IMM1IM1MILeI1I1IIL!IMI1LMHmLl$PH|$8MIMIH*M1IIL1IHM1L1Ld$Ld$HIIMILI1IL1Ld$HM1H!IML1II1ILLeM1H1III!IMM1LMHmLl$XL|$@MIMMI*M1IIM1IIM1M1Ld$Ld$PIMMIII1IM1Ld$PM1I!IMM1II1MMLeM1M1IML!IMI1LMHmLl$`H|$HMIMIH*M1IIL1IHM1L1Ld$ Ld$XIIMIHI1IH1Ld$XM1H!IMH1II1ILLeM1L1IMI!IMM1LMHmLl$hL|$PMIMMI*M1IIM1IIM1M1Ld$(Ld$`IMMIII1II1Ld$`M1I!III1II1MMLeM1M1ILL!IMH1MLHmLl$pH|$XMILIH*M1IIL1IHM1L1Ld$0Ld$hMIIIHM1IH1Ld$hI1L!IIH1IM1IHLeI1L1ILI!IML1MLHmLl$xL|$`MILMI*M1IIM1IIM1M1Ld$8Ld$pMMIIMM1II1Ld$pI1M!III1IM1MILeI1I1IHL!IMH1MLHmL,$H|$hMILIH*M1IIL1IHM1L1Ld$@Ld$xMIIILM1IL1Ld$xI1L!IIL1IM1IHLeI1H1IHI!IML1MLHm}H$LHHH_HOHWLG LO(LW0L_8H;$HH_HOHWLG LO(LW0L_8H$L~LvLnLfHnH^H&H|$Ht$ffffff.ffffff.ffffff.ffffff.f"(ט/Be#D7q"(ט/Be#D7q/;Mۉ۵/;Mۉ۵8H[V9Y8H[V9YO?m^O?m^BؾopE[BؾopE[N1$} UN1$} Uo{t]r;ހo{t]r;ހ5%ܛ&it5%ܛ&itJi%O8GJi%O8GՌƝew̡ $ՌƝew̡ $u+Yo,-ntJu+Yo,-ntJAܩ\SڈvAܩ\SڈvfRQ>2-m1fRQ>2-m1?!'Y?!'Y= % G= % GoQcpn g))oQcpn g))/F '&&\8!./F '&&\8!.*Zm,M߳ 8S*Zm,M߳ 8ScTs ew< jvcTs ew< jvG.;5,rG.;5,rdL迢0BKfdL迢0BKfpK0TQlǑpK0TQlReU$ReU$* qW5ѻ2pj* qW5ѻ2pjҸSAQl7ҸSAQl7LwH'Hᵼ4LwH'Hᵼ4cZų 9ˊAJNcZų 9ˊAJNscwOʜ[o.hscwOʜ[o.h]t`/Cocx]t`/CocxrxȄ9dnjrxȄ9dnj(c#齂lP(c#齂lPyƲ+SrxqyƲ+SrxqƜa&>'!Ǹќa&>'!Ǹ}xnO}}xnO}orgȢ}c orgȢ}c ?G5 q ?G5 q}#w($@{2}#w($@{2 ˾L*~e)YB>˾L*~e)Y:o_XGJDl:o_XGJDl  SHA512 block transform for x86_64, CRYPTOGAMS by ffffff.fff.H|$Ht$HHHLHSUATAUAVAWHHHHH$H$H$H$)$)$D)$D)$D)$D)$wHH_HOHWLG LO(LW0L_8ffffff.yooH--oNoV yo^0qof@ionPaov`Yo~pQyEIqMAiUa]y$YEyL$QM yT$ IU@y\$0A]`yD$@IyL$PHyT$`H1y\$pM f.HcqMLcQMM)sM1M1yMI1!sM!M11s8L$IA!M1M)sI1MA9ML!1sI1MA9H1MšsLIA9IMũsMMyMMűsI1M1A!MM1)s*I!I1A!LT$L1s*M1MA!H1MA!MI!yM1MyUI1MLMIMy$ciMMcIIM)sI1M1qMM1!sI!I11s8LL$MA!M1M)sM1MA9ML!1sM1MA9L1MšsLIA9IMũsMMqIMűsI1I1A!MM1)s*I!I1A!LD$L1s*I1MA!L1MA!MI!qM1MqUM1MLMIMyT$caMMcAIM)sI1I1iMM1!sI!I11s8HT$ MA!I1M)sM1LA9ML!1sM1LA9L1MšsIHA9MIũsMLiIMűsM1I1A!MI1)s*M!M1A!HL$(H1s*I1MA!L1LA!MI!iI1LiUM1MILMIyT$ cYMLcyMM)sM1I1aMI1!sM!M11s8H\$0IA!I1M)sI1LA9ML!1sI1LA9H1MšsIHA9MIũsMLaMMűsM1M1A!MI1)s*M!M1A!HD$8H1s*M1MA!H1LA!MI!aI1LaUI1MILMIyT$0cQMLcqMM)sM1M1YMI1!sM!M11s8L\$@IA!M1M)sI1MA9ML!1sI1MA9H1MšsLIA9IMũsMMYMMűsI1M1A!MM1)s*I!I1A!LT$HL1s*M1MA!H1MA!MI!YM1MYUI1MLMIMyT$@cIMMciIM)sI1M1QMM1!sI!I11s8LL$PMA!M1M)sM1MA9ML!1sM1MA9L1MšsLIA9IMũsMMQIMűsI1I1A!MM1)s*I!I1A!LD$XL1s*I1MA!L1MA!MI!QM1MQU M1MLMIMyT$PcAMMcaIM)sI1I1IMM1!sI!I11s8HT$`MA!I1M)sM1LA9ML!1sM1LA9L1MšsIHA9MIũsMLIIMűsM1I1A!MI1)s*M!M1A!HL$hH1s*I1MA!L1LA!MI!II1LIU@M1MILMIyT$`cyMLcYMM)sM1I1AMI1!sM!M11s8H\$pIA!I1M)sI1LA9ML!1sI1LA9H1MšsIHA9MIũsMLAMMűsM1M1A!MI1)s*M!M1A!HD$xH1s*M1MA!H1LA!MI!AI1LAU`I1MILMIyT$pMLMMM1M1MI1M!M1L$IM1MI1MML!I1MH1MLIIMMMMMI1M1MM1I!I1LT$LM1MH1MMI!M1MI1MLMIMMMIMI1M1MM1I!I1LL$MM1MM1MML!M1ML1MLIIMMMIMI1I1MM1I!I1LD$LI1ML1MMI!M1MM1MLMIMMMIMI1I1MM1I!I1HT$ MI1MM1LML!M1LL1MIHMIMLIMM1I1MI1M!M1HL$(HI1ML1LMI!I1LM1MILMIMLMMM1I1MI1M!M1H\$0II1MI1LML!I1LH1MIHMIMLMMM1M1MI1M!M1HD$8HM1MH1LMI!I1LI1MILMIMLMMM1M1MI1M!M1L\$@IM1MI1MML!I1MH1MLIIMMMMMI1M1MM1I!I1LT$HLM1MH1MMI!M1MI1MLMIMMMIMI1M1MM1I!I1LL$PMM1MM1MML!M1ML1MLIIMMMIMI1I1MM1I!I1LD$XLI1ML1MMI!M1MM1MLMIMMMIMI1I1MM1I!I1HT$`MI1MM1LML!M1LL1MIHMIMLIMM1I1MI1M!M1HL$hHI1ML1LMI!I1LM1MILMIMLMMM1I1MI1M!M1H\$pII1MI1LML!I1LH1MIHMIMLMMM1M1MI1M!M1HD$xHM1MH1LMI!I1LI1MILMIH$LHHH_HOHWLG LO(LW0L_8H;$HH_HOHWLG LO(LW0L_8 H$w($($D($D($D($D($L~LvLnLfHnH^H&H|$Ht$VWSUATAUAVAWH@I@xIIqMY8ENL9IESNL9sHHHXHhL`LhLpLxIIMMMMLwL9HI HHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^?+    1P:\ring\pregenerated\tmp\sha512-x86_64-nasm.asm4>Mݼ^3*HS[+f ?@ABCDFHIJKLMNOPRSTVWXZ[\^_`bcdfg h jklnopr#s&t*u-v0w3x7y:{=|A}DILOSVY]`cfjmptwz~  "%),/369<@CFJMPTWZ]`dgknqtx{~    !#$%'()+ , -/0134 5#7&8*9-;0<3=6?:@=AABDCGDJENFQHTIXJ[L`McNfPjQmRpTtUwVzX}YZ\]^`abdefhijklmnoqrsuvwyz{}~   $'*.169<@CFJMPSWZ]adgknqtw{~  #&)-037:=ADG J M Q TX[^aehkorwz}!"#%&')*+-./12356789:;<>?@BCDFGHJKLNOPR S TVWXZ[ \#^'_*`.a1b4c7d;e>gAhEiHkMlPmSoWpZq]satdugwjxnyq{t|x}{~  #&)-037:=@DGJNQTX[^adhmpuz}     #&) -"0#4$7%:&>(B)E*H+M-R.U/X0[1_2b4e5i6l8q9t:w<{=~>@ABDEFHIJLMNPQRTUVXYZ[\^_`abdefgijklm n p q r t u v x y! z$ |( }+ ~. 1 5 8 ; ? B E I L O R U Y ^ c f j m p t w { ~                                               " % ) - 0 3 8 = @ C F J M P T W \ _ b f i l p s v y }                                ! " $ % & ( ) * , - . 0 1 2 4 5! 6$ 8' 9+ :. <1 =5 >8 @; A> BA DE EJ FO HR IV JY K\ L` Nc Og Pj Qm Rq Tu Ux V{ W Y Z [ \ ] ^ ` a b d e f h i j l m n p q r t u v x y z | } ~                 # ( + . 1 5 8 ; ? B G J M Q T W [ ^ a d h k n r u x |                                                # & ) , 0 5 : = A D G K N R U X \ ` c f k p s v y }            ! " $ % & ( ) * , - . 0 1 2 4 5 6 8 9 : ; < > ? @ A BDEF GIJKLM!N$P'Q+R.T3U6V9X=Y@ZC\G]J^M`PaTbWdZe^fahdihjklnmqntpxq}rtuvwxz{|}~ !&)-037:>ADHLORW\_beilosv{~   " % ) ,/369<@CFJMPTW Z!]"`$d%i&n(q)u*x+{,./01245679:;<=>@ABDEFHIJLMNPQRTUVXYZ\]^`a bdefgh"j%k)l,m/n3p7q:r=sBuGvJwMxPyTzW|Z}^~afilpsvz}  #'+/36;@B 0@P`p 0@P`p 0@P`p     0 @P`p 0@P` p!#$%&'()+-. / 1238:<>@B!D#F'G.H2I6J>KFLNMVO^PfQoRxSTWXYZ[\]^_`acdefghijklmnop qrstu#v(w-x2y7z<{B|G}M~RX]cfloux~ $),/47:?DGLOTY\_dilrux}  #(+069<AFIORUZ]bgjmrux}      !"#$% & '()*!+',*-/.5/80;1@2E3H4N5Q6T7Z8_9b:g;j<o=u>x?{@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefg h%i(j-k0l3m8n;o@pCqFrIsLtRuXv]w`xfyizn{t|w}z~  %(.149>AGJOTWZ_dglorwz $'*/25:?BGJOTWZ_dgmpsx}                                       ! $ " ' # , $ 2 % 5 & 8 ' = ( B ) E * K + N , Q - V . Y / ^ 0 c 1 f 2 i 3 n 4 q 5 t 6 y 7 ~ 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W !X !Y !Z ![ !\ !] !^ !_ #!` &!a +!b 1!c 4!d 7!e $? $@ $A $B $C $D $E $F $G $H $I $J $K $L $M $N $O $P $Q $R $S $T $U $V $W $X $Y $Z $[ $\ %] %^ %_ %` %a %b %c %d %e %f $%g '%h *%i -%j 2%k 5%l 8%m =%n @%o C%p H%q K%r N%s Q%t T%u Y%v \%w _%x b%y e%z j%{ m%| p%} u%~ x% {% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % & & & & & & & & & & "& %& (& -& 0& 3& 8& ;& >& A& F& I& L& Q& T& W& \& _& b& e& h& m& p& s& v& y& ~& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ' ' ' ' ' ' ' ' ' ' %' (' +' .' 1' 6' 9' <' A' D' G' L' O' R' U' Z' ]' `' e' h' k' p' s' v' y' |' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '! '" '# '$ '% '& '' '( ') '* '+ ', '- '. '/ '0 '1 '2 '3 '4 '5 '6 (7 (8 (9 (: (; (< (= (> (? #(@ ((A +(B .(C 1(D 4(E 9(F <(G ?(H B(I E(J J(K M(L P(M U(N X(O [(P `(Q c(R f(S i(T n(U q(V t(W y(X |(Y (Z ([ (\ (] (^ (_ (` (a (b (c (d (e (f (g (h (i (j (k (l (m (n (o (p (q (r (s (t (u (v (w (x (y (z ({ (| (} (~ ) ) ) ) ) ) ) ) ) !) &) )) ,) 1) 4) 7) <) ?) B) E) H) M) P) S) V) Y) a) d) g) n) r) v) z) ~) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * * * * * * * * * !* "* #* $* &* (* ** ,* -* 1* 5* <* @* D* G* K* N* T* [* _* c* f* l* o* v* z* ~* * * * * * * * * * * * * * * * * * * * * * * + + + + + + + + + !+ %+ )+ .+ 3+ 8+ =+ C+! H+" L+# M+$ O+% Q+& S+' U+( V+) W+* X++ Y+, 2P:\ring\pregenerated\sha512-x86_64-nasm.objyasm 1.3.0%GFp_sha512_block_data_order1L$SEH_begin_GFp_sha512_block_data_orderL$avx_shortcutL$prologueL$loopK512L$rounds_16_xxL$epilogue/L$SEH_end_GFp_sha512_block_data_order)GFp_sha512_block_data_order_avx5L$SEH_begin_GFp_sha512_block_data_order_avxL$prologue_avxL$loop_avxL$avx_00_47L$epilogue_avx3L$SEH_end_GFp_sha512_block_data_order_avxse_handlerL$in_prologue3  L$SEH_info_GFp_sha512_block_data_order7  L$SEH_info_GFp_sha512_block_data_order_avxh l T T 8T J*Y* **.pdata.xdata .debug$SV*.debug$T pregenerated\tmp\sha512-x86_64-nasm.asmGFp_ia32cap_PGFp_sha512_block_data_orderL$SEH_begin_GFp_sha512_block_data_orderL$avx_shortcutL$prologueL$rounds_16_xxL$epilogueL$SEH_end_GFp_sha512_block_data_orderGFp_sha512_block_data_order_avxL$SEH_begin_GFp_sha512_block_data_order_avxL$prologue_avxL$loop_avxL$avx_00_47L$epilogue_avxL$SEH_end_GFp_sha512_block_data_order_avx__imp_RtlVirtualUnwindse_handlerL$in_prologueL$SEH_info_GFp_sha512_block_data_orderL$SEH_info_GFp_sha512_block_data_order_avxring-0.16.9/pregenerated/tmp/aes-586-win32n.asm000064400000000000000000000543501353224260700171240ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif align 16 __x86_AES_encrypt_compact: mov DWORD [20+esp],edi xor eax,DWORD [edi] xor ebx,DWORD [4+edi] xor ecx,DWORD [8+edi] xor edx,DWORD [12+edi] mov esi,DWORD [240+edi] lea esi,[esi*1+esi-2] lea esi,[esi*8+edi] mov DWORD [24+esp],esi mov edi,DWORD [ebp-128] mov esi,DWORD [ebp-96] mov edi,DWORD [ebp-64] mov esi,DWORD [ebp-32] mov edi,DWORD [ebp] mov esi,DWORD [32+ebp] mov edi,DWORD [64+ebp] mov esi,DWORD [96+ebp] align 16 L$000loop: mov esi,eax and esi,255 movzx esi,BYTE [esi*1+ebp-128] movzx edi,bh movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,ecx shr edi,16 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi mov edi,edx shr edi,24 movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi mov DWORD [4+esp],esi mov esi,ebx and esi,255 shr ebx,16 movzx esi,BYTE [esi*1+ebp-128] movzx edi,ch movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,edx shr edi,16 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi mov edi,eax shr edi,24 movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi mov DWORD [8+esp],esi mov esi,ecx and esi,255 shr ecx,24 movzx esi,BYTE [esi*1+ebp-128] movzx edi,dh movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,eax shr edi,16 and edx,255 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi movzx edi,bh movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi and edx,255 movzx edx,BYTE [edx*1+ebp-128] movzx eax,ah movzx eax,BYTE [eax*1+ebp-128] shl eax,8 xor edx,eax mov eax,DWORD [4+esp] and ebx,255 movzx ebx,BYTE [ebx*1+ebp-128] shl ebx,16 xor edx,ebx mov ebx,DWORD [8+esp] movzx ecx,BYTE [ecx*1+ebp-128] shl ecx,24 xor edx,ecx mov ecx,esi mov ebp,2155905152 and ebp,ecx lea edi,[ecx*1+ecx] mov esi,ebp shr ebp,7 and edi,4278124286 sub esi,ebp mov ebp,ecx and esi,454761243 ror ebp,16 xor esi,edi mov edi,ecx xor ecx,esi ror edi,24 xor esi,ebp rol ecx,24 xor esi,edi mov ebp,2155905152 xor ecx,esi and ebp,edx lea edi,[edx*1+edx] mov esi,ebp shr ebp,7 and edi,4278124286 sub esi,ebp mov ebp,edx and esi,454761243 ror ebp,16 xor esi,edi mov edi,edx xor edx,esi ror edi,24 xor esi,ebp rol edx,24 xor esi,edi mov ebp,2155905152 xor edx,esi and ebp,eax lea edi,[eax*1+eax] mov esi,ebp shr ebp,7 and edi,4278124286 sub esi,ebp mov ebp,eax and esi,454761243 ror ebp,16 xor esi,edi mov edi,eax xor eax,esi ror edi,24 xor esi,ebp rol eax,24 xor esi,edi mov ebp,2155905152 xor eax,esi and ebp,ebx lea edi,[ebx*1+ebx] mov esi,ebp shr ebp,7 and edi,4278124286 sub esi,ebp mov ebp,ebx and esi,454761243 ror ebp,16 xor esi,edi mov edi,ebx xor ebx,esi ror edi,24 xor esi,ebp rol ebx,24 xor esi,edi xor ebx,esi mov edi,DWORD [20+esp] mov ebp,DWORD [28+esp] add edi,16 xor eax,DWORD [edi] xor ebx,DWORD [4+edi] xor ecx,DWORD [8+edi] xor edx,DWORD [12+edi] cmp edi,DWORD [24+esp] mov DWORD [20+esp],edi jb NEAR L$000loop mov esi,eax and esi,255 movzx esi,BYTE [esi*1+ebp-128] movzx edi,bh movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,ecx shr edi,16 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi mov edi,edx shr edi,24 movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi mov DWORD [4+esp],esi mov esi,ebx and esi,255 shr ebx,16 movzx esi,BYTE [esi*1+ebp-128] movzx edi,ch movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,edx shr edi,16 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi mov edi,eax shr edi,24 movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi mov DWORD [8+esp],esi mov esi,ecx and esi,255 shr ecx,24 movzx esi,BYTE [esi*1+ebp-128] movzx edi,dh movzx edi,BYTE [edi*1+ebp-128] shl edi,8 xor esi,edi mov edi,eax shr edi,16 and edx,255 and edi,255 movzx edi,BYTE [edi*1+ebp-128] shl edi,16 xor esi,edi movzx edi,bh movzx edi,BYTE [edi*1+ebp-128] shl edi,24 xor esi,edi mov edi,DWORD [20+esp] and edx,255 movzx edx,BYTE [edx*1+ebp-128] movzx eax,ah movzx eax,BYTE [eax*1+ebp-128] shl eax,8 xor edx,eax mov eax,DWORD [4+esp] and ebx,255 movzx ebx,BYTE [ebx*1+ebp-128] shl ebx,16 xor edx,ebx mov ebx,DWORD [8+esp] movzx ecx,BYTE [ecx*1+ebp-128] shl ecx,24 xor edx,ecx mov ecx,esi xor eax,DWORD [16+edi] xor ebx,DWORD [20+edi] xor ecx,DWORD [24+edi] xor edx,DWORD [28+edi] ret align 16 __sse_AES_encrypt_compact: pxor mm0,[edi] pxor mm4,[8+edi] mov esi,DWORD [240+edi] lea esi,[esi*1+esi-2] lea esi,[esi*8+edi] mov DWORD [24+esp],esi mov eax,454761243 mov DWORD [8+esp],eax mov DWORD [12+esp],eax mov eax,DWORD [ebp-128] mov ebx,DWORD [ebp-96] mov ecx,DWORD [ebp-64] mov edx,DWORD [ebp-32] mov eax,DWORD [ebp] mov ebx,DWORD [32+ebp] mov ecx,DWORD [64+ebp] mov edx,DWORD [96+ebp] align 16 L$001loop: pshufw mm1,mm0,8 pshufw mm5,mm4,13 movd eax,mm1 movd ebx,mm5 mov DWORD [20+esp],edi movzx esi,al movzx edx,ah pshufw mm2,mm0,13 movzx ecx,BYTE [esi*1+ebp-128] movzx edi,bl movzx edx,BYTE [edx*1+ebp-128] shr eax,16 shl edx,8 movzx esi,BYTE [edi*1+ebp-128] movzx edi,bh shl esi,16 pshufw mm6,mm4,8 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,ah shl esi,24 shr ebx,16 or edx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,bh shl esi,8 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,al shl esi,24 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,bl movd eax,mm2 movd mm0,ecx movzx ecx,BYTE [edi*1+ebp-128] movzx edi,ah shl ecx,16 movd ebx,mm6 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,bh shl esi,24 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,bl shl esi,8 shr ebx,16 or ecx,esi movzx esi,BYTE [edi*1+ebp-128] movzx edi,al shr eax,16 movd mm1,ecx movzx ecx,BYTE [edi*1+ebp-128] movzx edi,ah shl ecx,16 and eax,255 or ecx,esi punpckldq mm0,mm1 movzx esi,BYTE [edi*1+ebp-128] movzx edi,bh shl esi,24 and ebx,255 movzx eax,BYTE [eax*1+ebp-128] or ecx,esi shl eax,16 movzx esi,BYTE [edi*1+ebp-128] or edx,eax shl esi,8 movzx ebx,BYTE [ebx*1+ebp-128] or ecx,esi or edx,ebx mov edi,DWORD [20+esp] movd mm4,ecx movd mm5,edx punpckldq mm4,mm5 add edi,16 cmp edi,DWORD [24+esp] ja NEAR L$002out movq mm2,[8+esp] pxor mm3,mm3 pxor mm7,mm7 movq mm1,mm0 movq mm5,mm4 pcmpgtb mm3,mm0 pcmpgtb mm7,mm4 pand mm3,mm2 pand mm7,mm2 pshufw mm2,mm0,177 pshufw mm6,mm4,177 paddb mm0,mm0 paddb mm4,mm4 pxor mm0,mm3 pxor mm4,mm7 pshufw mm3,mm2,177 pshufw mm7,mm6,177 pxor mm1,mm0 pxor mm5,mm4 pxor mm0,mm2 pxor mm4,mm6 movq mm2,mm3 movq mm6,mm7 pslld mm3,8 pslld mm7,8 psrld mm2,24 psrld mm6,24 pxor mm0,mm3 pxor mm4,mm7 pxor mm0,mm2 pxor mm4,mm6 movq mm3,mm1 movq mm7,mm5 movq mm2,[edi] movq mm6,[8+edi] psrld mm1,8 psrld mm5,8 mov eax,DWORD [ebp-128] pslld mm3,24 pslld mm7,24 mov ebx,DWORD [ebp-64] pxor mm0,mm1 pxor mm4,mm5 mov ecx,DWORD [ebp] pxor mm0,mm3 pxor mm4,mm7 mov edx,DWORD [64+ebp] pxor mm0,mm2 pxor mm4,mm6 jmp NEAR L$001loop align 16 L$002out: pxor mm0,[edi] pxor mm4,[8+edi] ret align 64 L$AES_Te: dd 2774754246,2774754246 dd 2222750968,2222750968 dd 2574743534,2574743534 dd 2373680118,2373680118 dd 234025727,234025727 dd 3177933782,3177933782 dd 2976870366,2976870366 dd 1422247313,1422247313 dd 1345335392,1345335392 dd 50397442,50397442 dd 2842126286,2842126286 dd 2099981142,2099981142 dd 436141799,436141799 dd 1658312629,1658312629 dd 3870010189,3870010189 dd 2591454956,2591454956 dd 1170918031,1170918031 dd 2642575903,2642575903 dd 1086966153,1086966153 dd 2273148410,2273148410 dd 368769775,368769775 dd 3948501426,3948501426 dd 3376891790,3376891790 dd 200339707,200339707 dd 3970805057,3970805057 dd 1742001331,1742001331 dd 4255294047,4255294047 dd 3937382213,3937382213 dd 3214711843,3214711843 dd 4154762323,4154762323 dd 2524082916,2524082916 dd 1539358875,1539358875 dd 3266819957,3266819957 dd 486407649,486407649 dd 2928907069,2928907069 dd 1780885068,1780885068 dd 1513502316,1513502316 dd 1094664062,1094664062 dd 49805301,49805301 dd 1338821763,1338821763 dd 1546925160,1546925160 dd 4104496465,4104496465 dd 887481809,887481809 dd 150073849,150073849 dd 2473685474,2473685474 dd 1943591083,1943591083 dd 1395732834,1395732834 dd 1058346282,1058346282 dd 201589768,201589768 dd 1388824469,1388824469 dd 1696801606,1696801606 dd 1589887901,1589887901 dd 672667696,672667696 dd 2711000631,2711000631 dd 251987210,251987210 dd 3046808111,3046808111 dd 151455502,151455502 dd 907153956,907153956 dd 2608889883,2608889883 dd 1038279391,1038279391 dd 652995533,652995533 dd 1764173646,1764173646 dd 3451040383,3451040383 dd 2675275242,2675275242 dd 453576978,453576978 dd 2659418909,2659418909 dd 1949051992,1949051992 dd 773462580,773462580 dd 756751158,756751158 dd 2993581788,2993581788 dd 3998898868,3998898868 dd 4221608027,4221608027 dd 4132590244,4132590244 dd 1295727478,1295727478 dd 1641469623,1641469623 dd 3467883389,3467883389 dd 2066295122,2066295122 dd 1055122397,1055122397 dd 1898917726,1898917726 dd 2542044179,2542044179 dd 4115878822,4115878822 dd 1758581177,1758581177 dd 0,0 dd 753790401,753790401 dd 1612718144,1612718144 dd 536673507,536673507 dd 3367088505,3367088505 dd 3982187446,3982187446 dd 3194645204,3194645204 dd 1187761037,1187761037 dd 3653156455,3653156455 dd 1262041458,1262041458 dd 3729410708,3729410708 dd 3561770136,3561770136 dd 3898103984,3898103984 dd 1255133061,1255133061 dd 1808847035,1808847035 dd 720367557,720367557 dd 3853167183,3853167183 dd 385612781,385612781 dd 3309519750,3309519750 dd 3612167578,3612167578 dd 1429418854,1429418854 dd 2491778321,2491778321 dd 3477423498,3477423498 dd 284817897,284817897 dd 100794884,100794884 dd 2172616702,2172616702 dd 4031795360,4031795360 dd 1144798328,1144798328 dd 3131023141,3131023141 dd 3819481163,3819481163 dd 4082192802,4082192802 dd 4272137053,4272137053 dd 3225436288,3225436288 dd 2324664069,2324664069 dd 2912064063,2912064063 dd 3164445985,3164445985 dd 1211644016,1211644016 dd 83228145,83228145 dd 3753688163,3753688163 dd 3249976951,3249976951 dd 1977277103,1977277103 dd 1663115586,1663115586 dd 806359072,806359072 dd 452984805,452984805 dd 250868733,250868733 dd 1842533055,1842533055 dd 1288555905,1288555905 dd 336333848,336333848 dd 890442534,890442534 dd 804056259,804056259 dd 3781124030,3781124030 dd 2727843637,2727843637 dd 3427026056,3427026056 dd 957814574,957814574 dd 1472513171,1472513171 dd 4071073621,4071073621 dd 2189328124,2189328124 dd 1195195770,1195195770 dd 2892260552,2892260552 dd 3881655738,3881655738 dd 723065138,723065138 dd 2507371494,2507371494 dd 2690670784,2690670784 dd 2558624025,2558624025 dd 3511635870,3511635870 dd 2145180835,2145180835 dd 1713513028,1713513028 dd 2116692564,2116692564 dd 2878378043,2878378043 dd 2206763019,2206763019 dd 3393603212,3393603212 dd 703524551,703524551 dd 3552098411,3552098411 dd 1007948840,1007948840 dd 2044649127,2044649127 dd 3797835452,3797835452 dd 487262998,487262998 dd 1994120109,1994120109 dd 1004593371,1004593371 dd 1446130276,1446130276 dd 1312438900,1312438900 dd 503974420,503974420 dd 3679013266,3679013266 dd 168166924,168166924 dd 1814307912,1814307912 dd 3831258296,3831258296 dd 1573044895,1573044895 dd 1859376061,1859376061 dd 4021070915,4021070915 dd 2791465668,2791465668 dd 2828112185,2828112185 dd 2761266481,2761266481 dd 937747667,937747667 dd 2339994098,2339994098 dd 854058965,854058965 dd 1137232011,1137232011 dd 1496790894,1496790894 dd 3077402074,3077402074 dd 2358086913,2358086913 dd 1691735473,1691735473 dd 3528347292,3528347292 dd 3769215305,3769215305 dd 3027004632,3027004632 dd 4199962284,4199962284 dd 133494003,133494003 dd 636152527,636152527 dd 2942657994,2942657994 dd 2390391540,2390391540 dd 3920539207,3920539207 dd 403179536,403179536 dd 3585784431,3585784431 dd 2289596656,2289596656 dd 1864705354,1864705354 dd 1915629148,1915629148 dd 605822008,605822008 dd 4054230615,4054230615 dd 3350508659,3350508659 dd 1371981463,1371981463 dd 602466507,602466507 dd 2094914977,2094914977 dd 2624877800,2624877800 dd 555687742,555687742 dd 3712699286,3712699286 dd 3703422305,3703422305 dd 2257292045,2257292045 dd 2240449039,2240449039 dd 2423288032,2423288032 dd 1111375484,1111375484 dd 3300242801,3300242801 dd 2858837708,2858837708 dd 3628615824,3628615824 dd 84083462,84083462 dd 32962295,32962295 dd 302911004,302911004 dd 2741068226,2741068226 dd 1597322602,1597322602 dd 4183250862,4183250862 dd 3501832553,3501832553 dd 2441512471,2441512471 dd 1489093017,1489093017 dd 656219450,656219450 dd 3114180135,3114180135 dd 954327513,954327513 dd 335083755,335083755 dd 3013122091,3013122091 dd 856756514,856756514 dd 3144247762,3144247762 dd 1893325225,1893325225 dd 2307821063,2307821063 dd 2811532339,2811532339 dd 3063651117,3063651117 dd 572399164,572399164 dd 2458355477,2458355477 dd 552200649,552200649 dd 1238290055,1238290055 dd 4283782570,4283782570 dd 2015897680,2015897680 dd 2061492133,2061492133 dd 2408352771,2408352771 dd 4171342169,4171342169 dd 2156497161,2156497161 dd 386731290,386731290 dd 3669999461,3669999461 dd 837215959,837215959 dd 3326231172,3326231172 dd 3093850320,3093850320 dd 3275833730,3275833730 dd 2962856233,2962856233 dd 1999449434,1999449434 dd 286199582,286199582 dd 3417354363,3417354363 dd 4233385128,4233385128 dd 3602627437,3602627437 dd 974525996,974525996 db 99,124,119,123,242,107,111,197 db 48,1,103,43,254,215,171,118 db 202,130,201,125,250,89,71,240 db 173,212,162,175,156,164,114,192 db 183,253,147,38,54,63,247,204 db 52,165,229,241,113,216,49,21 db 4,199,35,195,24,150,5,154 db 7,18,128,226,235,39,178,117 db 9,131,44,26,27,110,90,160 db 82,59,214,179,41,227,47,132 db 83,209,0,237,32,252,177,91 db 106,203,190,57,74,76,88,207 db 208,239,170,251,67,77,51,133 db 69,249,2,127,80,60,159,168 db 81,163,64,143,146,157,56,245 db 188,182,218,33,16,255,243,210 db 205,12,19,236,95,151,68,23 db 196,167,126,61,100,93,25,115 db 96,129,79,220,34,42,144,136 db 70,238,184,20,222,94,11,219 db 224,50,58,10,73,6,36,92 db 194,211,172,98,145,149,228,121 db 231,200,55,109,141,213,78,169 db 108,86,244,234,101,122,174,8 db 186,120,37,46,28,166,180,198 db 232,221,116,31,75,189,139,138 db 112,62,181,102,72,3,246,14 db 97,53,87,185,134,193,29,158 db 225,248,152,17,105,217,142,148 db 155,30,135,233,206,85,40,223 db 140,161,137,13,191,230,66,104 db 65,153,45,15,176,84,187,22 db 99,124,119,123,242,107,111,197 db 48,1,103,43,254,215,171,118 db 202,130,201,125,250,89,71,240 db 173,212,162,175,156,164,114,192 db 183,253,147,38,54,63,247,204 db 52,165,229,241,113,216,49,21 db 4,199,35,195,24,150,5,154 db 7,18,128,226,235,39,178,117 db 9,131,44,26,27,110,90,160 db 82,59,214,179,41,227,47,132 db 83,209,0,237,32,252,177,91 db 106,203,190,57,74,76,88,207 db 208,239,170,251,67,77,51,133 db 69,249,2,127,80,60,159,168 db 81,163,64,143,146,157,56,245 db 188,182,218,33,16,255,243,210 db 205,12,19,236,95,151,68,23 db 196,167,126,61,100,93,25,115 db 96,129,79,220,34,42,144,136 db 70,238,184,20,222,94,11,219 db 224,50,58,10,73,6,36,92 db 194,211,172,98,145,149,228,121 db 231,200,55,109,141,213,78,169 db 108,86,244,234,101,122,174,8 db 186,120,37,46,28,166,180,198 db 232,221,116,31,75,189,139,138 db 112,62,181,102,72,3,246,14 db 97,53,87,185,134,193,29,158 db 225,248,152,17,105,217,142,148 db 155,30,135,233,206,85,40,223 db 140,161,137,13,191,230,66,104 db 65,153,45,15,176,84,187,22 db 99,124,119,123,242,107,111,197 db 48,1,103,43,254,215,171,118 db 202,130,201,125,250,89,71,240 db 173,212,162,175,156,164,114,192 db 183,253,147,38,54,63,247,204 db 52,165,229,241,113,216,49,21 db 4,199,35,195,24,150,5,154 db 7,18,128,226,235,39,178,117 db 9,131,44,26,27,110,90,160 db 82,59,214,179,41,227,47,132 db 83,209,0,237,32,252,177,91 db 106,203,190,57,74,76,88,207 db 208,239,170,251,67,77,51,133 db 69,249,2,127,80,60,159,168 db 81,163,64,143,146,157,56,245 db 188,182,218,33,16,255,243,210 db 205,12,19,236,95,151,68,23 db 196,167,126,61,100,93,25,115 db 96,129,79,220,34,42,144,136 db 70,238,184,20,222,94,11,219 db 224,50,58,10,73,6,36,92 db 194,211,172,98,145,149,228,121 db 231,200,55,109,141,213,78,169 db 108,86,244,234,101,122,174,8 db 186,120,37,46,28,166,180,198 db 232,221,116,31,75,189,139,138 db 112,62,181,102,72,3,246,14 db 97,53,87,185,134,193,29,158 db 225,248,152,17,105,217,142,148 db 155,30,135,233,206,85,40,223 db 140,161,137,13,191,230,66,104 db 65,153,45,15,176,84,187,22 db 99,124,119,123,242,107,111,197 db 48,1,103,43,254,215,171,118 db 202,130,201,125,250,89,71,240 db 173,212,162,175,156,164,114,192 db 183,253,147,38,54,63,247,204 db 52,165,229,241,113,216,49,21 db 4,199,35,195,24,150,5,154 db 7,18,128,226,235,39,178,117 db 9,131,44,26,27,110,90,160 db 82,59,214,179,41,227,47,132 db 83,209,0,237,32,252,177,91 db 106,203,190,57,74,76,88,207 db 208,239,170,251,67,77,51,133 db 69,249,2,127,80,60,159,168 db 81,163,64,143,146,157,56,245 db 188,182,218,33,16,255,243,210 db 205,12,19,236,95,151,68,23 db 196,167,126,61,100,93,25,115 db 96,129,79,220,34,42,144,136 db 70,238,184,20,222,94,11,219 db 224,50,58,10,73,6,36,92 db 194,211,172,98,145,149,228,121 db 231,200,55,109,141,213,78,169 db 108,86,244,234,101,122,174,8 db 186,120,37,46,28,166,180,198 db 232,221,116,31,75,189,139,138 db 112,62,181,102,72,3,246,14 db 97,53,87,185,134,193,29,158 db 225,248,152,17,105,217,142,148 db 155,30,135,233,206,85,40,223 db 140,161,137,13,191,230,66,104 db 65,153,45,15,176,84,187,22 dd 1,2,4,8 dd 16,32,64,128 dd 27,54,0,0 dd 0,0,0,0 global _GFp_aes_nohw_encrypt align 16 _GFp_aes_nohw_encrypt: L$_GFp_aes_nohw_encrypt_begin: push ebp push ebx push esi push edi mov esi,DWORD [20+esp] mov edi,DWORD [28+esp] mov eax,esp sub esp,36 and esp,-64 lea ebx,[edi-127] sub ebx,esp neg ebx and ebx,960 sub esp,ebx add esp,4 mov DWORD [28+esp],eax call L$003pic_point L$003pic_point: pop ebp lea eax,[_GFp_ia32cap_P] lea ebp,[(L$AES_Te-L$003pic_point)+ebp] lea ebx,[764+esp] sub ebx,ebp and ebx,768 lea ebp,[2176+ebx*1+ebp] bt DWORD [eax],25 jnc NEAR L$004x86 movq mm0,[esi] movq mm4,[8+esi] call __sse_AES_encrypt_compact mov esp,DWORD [28+esp] mov esi,DWORD [24+esp] movq [esi],mm0 movq [8+esi],mm4 emms pop edi pop esi pop ebx pop ebp ret align 16 L$004x86: mov DWORD [24+esp],ebp mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] call __x86_AES_encrypt_compact mov esp,DWORD [28+esp] mov esi,DWORD [24+esp] mov DWORD [esi],eax mov DWORD [4+esi],ebx mov DWORD [8+esi],ecx mov DWORD [12+esi],edx pop edi pop esi pop ebx pop ebp ret align 16 __x86_AES_set_encrypt_key: push ebp push ebx push esi push edi mov esi,DWORD [24+esp] mov edi,DWORD [32+esp] test esi,-1 jz NEAR L$005badpointer test edi,-1 jz NEAR L$005badpointer call L$006pic_point L$006pic_point: pop ebp lea ebp,[(L$AES_Te-L$006pic_point)+ebp] lea ebp,[2176+ebp] mov eax,DWORD [ebp-128] mov ebx,DWORD [ebp-96] mov ecx,DWORD [ebp-64] mov edx,DWORD [ebp-32] mov eax,DWORD [ebp] mov ebx,DWORD [32+ebp] mov ecx,DWORD [64+ebp] mov edx,DWORD [96+ebp] mov ecx,DWORD [28+esp] cmp ecx,128 je NEAR L$00710rounds cmp ecx,256 je NEAR L$00814rounds mov eax,-2 jmp NEAR L$009exit L$00710rounds: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [edi],eax mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov DWORD [12+edi],edx xor ecx,ecx jmp NEAR L$01010shortcut align 4 L$01110loop: mov eax,DWORD [edi] mov edx,DWORD [12+edi] L$01010shortcut: movzx esi,dl movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh shl ebx,24 xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shr edx,16 movzx esi,dl xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh shl ebx,8 xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shl ebx,16 xor eax,ebx xor eax,DWORD [896+ecx*4+ebp] mov DWORD [16+edi],eax xor eax,DWORD [4+edi] mov DWORD [20+edi],eax xor eax,DWORD [8+edi] mov DWORD [24+edi],eax xor eax,DWORD [12+edi] mov DWORD [28+edi],eax inc ecx add edi,16 cmp ecx,10 jl NEAR L$01110loop mov DWORD [80+edi],10 xor eax,eax jmp NEAR L$009exit L$00814rounds: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [edi],eax mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] mov edx,DWORD [28+esi] mov DWORD [16+edi],eax mov DWORD [20+edi],ebx mov DWORD [24+edi],ecx mov DWORD [28+edi],edx xor ecx,ecx jmp NEAR L$01214shortcut align 4 L$01314loop: mov edx,DWORD [28+edi] L$01214shortcut: mov eax,DWORD [edi] movzx esi,dl movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh shl ebx,24 xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shr edx,16 movzx esi,dl xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh shl ebx,8 xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shl ebx,16 xor eax,ebx xor eax,DWORD [896+ecx*4+ebp] mov DWORD [32+edi],eax xor eax,DWORD [4+edi] mov DWORD [36+edi],eax xor eax,DWORD [8+edi] mov DWORD [40+edi],eax xor eax,DWORD [12+edi] mov DWORD [44+edi],eax cmp ecx,6 je NEAR L$01414break inc ecx mov edx,eax mov eax,DWORD [16+edi] movzx esi,dl movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shr edx,16 shl ebx,8 movzx esi,dl xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] movzx esi,dh shl ebx,16 xor eax,ebx movzx ebx,BYTE [esi*1+ebp-128] shl ebx,24 xor eax,ebx mov DWORD [48+edi],eax xor eax,DWORD [20+edi] mov DWORD [52+edi],eax xor eax,DWORD [24+edi] mov DWORD [56+edi],eax xor eax,DWORD [28+edi] mov DWORD [60+edi],eax add edi,32 jmp NEAR L$01314loop L$01414break: mov DWORD [48+edi],14 xor eax,eax jmp NEAR L$009exit L$005badpointer: mov eax,-1 L$009exit: pop edi pop esi pop ebx pop ebp ret global _GFp_aes_nohw_set_encrypt_key align 16 _GFp_aes_nohw_set_encrypt_key: L$_GFp_aes_nohw_set_encrypt_key_begin: call __x86_AES_set_encrypt_key ret db 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89 db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/aes-x86_64-nasm.asm000064400000000000000000000555141353224260000173520ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 ALIGN 16 _x86_64_AES_encrypt_compact: lea r8,[128+r14] mov edi,DWORD[((0-128))+r8] mov ebp,DWORD[((32-128))+r8] mov r10d,DWORD[((64-128))+r8] mov r11d,DWORD[((96-128))+r8] mov edi,DWORD[((128-128))+r8] mov ebp,DWORD[((160-128))+r8] mov r10d,DWORD[((192-128))+r8] mov r11d,DWORD[((224-128))+r8] jmp NEAR $L$enc_loop_compact ALIGN 16 $L$enc_loop_compact: xor eax,DWORD[r15] xor ebx,DWORD[4+r15] xor ecx,DWORD[8+r15] xor edx,DWORD[12+r15] lea r15,[16+r15] movzx r10d,al movzx r11d,bl movzx r12d,cl movzx r8d,dl movzx esi,bh movzx edi,ch shr ecx,16 movzx ebp,dh movzx r10d,BYTE[r10*1+r14] movzx r11d,BYTE[r11*1+r14] movzx r12d,BYTE[r12*1+r14] movzx r8d,BYTE[r8*1+r14] movzx r9d,BYTE[rsi*1+r14] movzx esi,ah movzx r13d,BYTE[rdi*1+r14] movzx edi,cl movzx ebp,BYTE[rbp*1+r14] movzx esi,BYTE[rsi*1+r14] shl r9d,8 shr edx,16 shl r13d,8 xor r10d,r9d shr eax,16 movzx r9d,dl shr ebx,16 xor r11d,r13d shl ebp,8 movzx r13d,al movzx edi,BYTE[rdi*1+r14] xor r12d,ebp shl esi,8 movzx ebp,bl shl edi,16 xor r8d,esi movzx r9d,BYTE[r9*1+r14] movzx esi,dh movzx r13d,BYTE[r13*1+r14] xor r10d,edi shr ecx,8 movzx edi,ah shl r9d,16 shr ebx,8 shl r13d,16 xor r11d,r9d movzx ebp,BYTE[rbp*1+r14] movzx esi,BYTE[rsi*1+r14] movzx edi,BYTE[rdi*1+r14] movzx edx,BYTE[rcx*1+r14] movzx ecx,BYTE[rbx*1+r14] shl ebp,16 xor r12d,r13d shl esi,24 xor r8d,ebp shl edi,24 xor r10d,esi shl edx,24 xor r11d,edi shl ecx,24 mov eax,r10d mov ebx,r11d xor ecx,r12d xor edx,r8d cmp r15,QWORD[16+rsp] je NEAR $L$enc_compact_done mov r10d,0x80808080 mov r11d,0x80808080 and r10d,eax and r11d,ebx mov esi,r10d mov edi,r11d shr r10d,7 lea r8d,[rax*1+rax] shr r11d,7 lea r9d,[rbx*1+rbx] sub esi,r10d sub edi,r11d and r8d,0xfefefefe and r9d,0xfefefefe and esi,0x1b1b1b1b and edi,0x1b1b1b1b mov r10d,eax mov r11d,ebx xor r8d,esi xor r9d,edi xor eax,r8d xor ebx,r9d mov r12d,0x80808080 rol eax,24 mov ebp,0x80808080 rol ebx,24 and r12d,ecx and ebp,edx xor eax,r8d xor ebx,r9d mov esi,r12d ror r10d,16 mov edi,ebp ror r11d,16 lea r8d,[rcx*1+rcx] shr r12d,7 xor eax,r10d shr ebp,7 xor ebx,r11d ror r10d,8 lea r9d,[rdx*1+rdx] ror r11d,8 sub esi,r12d sub edi,ebp xor eax,r10d xor ebx,r11d and r8d,0xfefefefe and r9d,0xfefefefe and esi,0x1b1b1b1b and edi,0x1b1b1b1b mov r12d,ecx mov ebp,edx xor r8d,esi xor r9d,edi ror r12d,16 xor ecx,r8d ror ebp,16 xor edx,r9d rol ecx,24 mov esi,DWORD[r14] rol edx,24 xor ecx,r8d mov edi,DWORD[64+r14] xor edx,r9d mov r8d,DWORD[128+r14] xor ecx,r12d ror r12d,8 xor edx,ebp ror ebp,8 xor ecx,r12d mov r9d,DWORD[192+r14] xor edx,ebp jmp NEAR $L$enc_loop_compact ALIGN 16 $L$enc_compact_done: xor eax,DWORD[r15] xor ebx,DWORD[4+r15] xor ecx,DWORD[8+r15] xor edx,DWORD[12+r15] DB 0xf3,0xc3 ALIGN 16 global GFp_aes_nohw_encrypt GFp_aes_nohw_encrypt: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_aes_nohw_encrypt: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 lea rcx,[((-63))+rdx] and rsp,-64 sub rcx,rsp neg rcx and rcx,0x3c0 sub rsp,rcx sub rsp,32 mov QWORD[16+rsp],rsi mov QWORD[24+rsp],rax $L$enc_prologue: mov r15,rdx mov r13d,DWORD[240+r15] mov eax,DWORD[rdi] mov ebx,DWORD[4+rdi] mov ecx,DWORD[8+rdi] mov edx,DWORD[12+rdi] shl r13d,4 lea rbp,[r13*1+r15] mov QWORD[rsp],r15 mov QWORD[8+rsp],rbp lea r14,[(($L$AES_Te+2048))] lea rbp,[768+rsp] sub rbp,r14 and rbp,0x300 lea r14,[rbp*1+r14] call _x86_64_AES_encrypt_compact mov r9,QWORD[16+rsp] mov rsi,QWORD[24+rsp] mov DWORD[r9],eax mov DWORD[4+r9],ebx mov DWORD[8+r9],ecx mov DWORD[12+r9],edx mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$enc_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_aes_nohw_encrypt: ALIGN 16 global GFp_aes_nohw_set_encrypt_key GFp_aes_nohw_set_encrypt_key: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_aes_nohw_set_encrypt_key: mov rdi,rcx mov rsi,rdx mov rdx,r8 push rbx push rbp push r12 push r13 push r14 push r15 sub rsp,8 $L$enc_key_prologue: call _x86_64_AES_set_encrypt_key mov rbp,QWORD[40+rsp] mov rbx,QWORD[48+rsp] add rsp,56 $L$enc_key_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_aes_nohw_set_encrypt_key: ALIGN 16 _x86_64_AES_set_encrypt_key: mov ecx,esi mov rsi,rdi mov rdi,rdx test rsi,-1 jz NEAR $L$badpointer test rdi,-1 jz NEAR $L$badpointer lea rbp,[$L$AES_Te] lea rbp,[((2048+128))+rbp] mov eax,DWORD[((0-128))+rbp] mov ebx,DWORD[((32-128))+rbp] mov r8d,DWORD[((64-128))+rbp] mov edx,DWORD[((96-128))+rbp] mov eax,DWORD[((128-128))+rbp] mov ebx,DWORD[((160-128))+rbp] mov r8d,DWORD[((192-128))+rbp] mov edx,DWORD[((224-128))+rbp] cmp ecx,128 je NEAR $L$10rounds cmp ecx,256 je NEAR $L$14rounds mov rax,-2 jmp NEAR $L$exit $L$10rounds: mov rax,QWORD[rsi] mov rdx,QWORD[8+rsi] mov QWORD[rdi],rax mov QWORD[8+rdi],rdx shr rdx,32 xor ecx,ecx jmp NEAR $L$10shortcut ALIGN 4 $L$10loop: mov eax,DWORD[rdi] mov edx,DWORD[12+rdi] $L$10shortcut: movzx esi,dl movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh shl ebx,24 xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shr edx,16 movzx esi,dl xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh shl ebx,8 xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shl ebx,16 xor eax,ebx xor eax,DWORD[((1024-128))+rcx*4+rbp] mov DWORD[16+rdi],eax xor eax,DWORD[4+rdi] mov DWORD[20+rdi],eax xor eax,DWORD[8+rdi] mov DWORD[24+rdi],eax xor eax,DWORD[12+rdi] mov DWORD[28+rdi],eax add ecx,1 lea rdi,[16+rdi] cmp ecx,10 jl NEAR $L$10loop mov DWORD[80+rdi],10 xor rax,rax jmp NEAR $L$exit $L$14rounds: mov rax,QWORD[rsi] mov rbx,QWORD[8+rsi] mov rcx,QWORD[16+rsi] mov rdx,QWORD[24+rsi] mov QWORD[rdi],rax mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rcx mov QWORD[24+rdi],rdx shr rdx,32 xor ecx,ecx jmp NEAR $L$14shortcut ALIGN 4 $L$14loop: mov eax,DWORD[rdi] mov edx,DWORD[28+rdi] $L$14shortcut: movzx esi,dl movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh shl ebx,24 xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shr edx,16 movzx esi,dl xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh shl ebx,8 xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shl ebx,16 xor eax,ebx xor eax,DWORD[((1024-128))+rcx*4+rbp] mov DWORD[32+rdi],eax xor eax,DWORD[4+rdi] mov DWORD[36+rdi],eax xor eax,DWORD[8+rdi] mov DWORD[40+rdi],eax xor eax,DWORD[12+rdi] mov DWORD[44+rdi],eax cmp ecx,6 je NEAR $L$14break add ecx,1 mov edx,eax mov eax,DWORD[16+rdi] movzx esi,dl movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shr edx,16 shl ebx,8 movzx esi,dl xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] movzx esi,dh shl ebx,16 xor eax,ebx movzx ebx,BYTE[((-128))+rsi*1+rbp] shl ebx,24 xor eax,ebx mov DWORD[48+rdi],eax xor eax,DWORD[20+rdi] mov DWORD[52+rdi],eax xor eax,DWORD[24+rdi] mov DWORD[56+rdi],eax xor eax,DWORD[28+rdi] mov DWORD[60+rdi],eax lea rdi,[32+rdi] jmp NEAR $L$14loop $L$14break: mov DWORD[48+rdi],14 xor rax,rax jmp NEAR $L$exit $L$badpointer: mov rax,-1 $L$exit: DB 0xf3,0xc3 ALIGN 64 $L$AES_Te: DD 0xa56363c6,0xa56363c6 DD 0x847c7cf8,0x847c7cf8 DD 0x997777ee,0x997777ee DD 0x8d7b7bf6,0x8d7b7bf6 DD 0x0df2f2ff,0x0df2f2ff DD 0xbd6b6bd6,0xbd6b6bd6 DD 0xb16f6fde,0xb16f6fde DD 0x54c5c591,0x54c5c591 DD 0x50303060,0x50303060 DD 0x03010102,0x03010102 DD 0xa96767ce,0xa96767ce DD 0x7d2b2b56,0x7d2b2b56 DD 0x19fefee7,0x19fefee7 DD 0x62d7d7b5,0x62d7d7b5 DD 0xe6abab4d,0xe6abab4d DD 0x9a7676ec,0x9a7676ec DD 0x45caca8f,0x45caca8f DD 0x9d82821f,0x9d82821f DD 0x40c9c989,0x40c9c989 DD 0x877d7dfa,0x877d7dfa DD 0x15fafaef,0x15fafaef DD 0xeb5959b2,0xeb5959b2 DD 0xc947478e,0xc947478e DD 0x0bf0f0fb,0x0bf0f0fb DD 0xecadad41,0xecadad41 DD 0x67d4d4b3,0x67d4d4b3 DD 0xfda2a25f,0xfda2a25f DD 0xeaafaf45,0xeaafaf45 DD 0xbf9c9c23,0xbf9c9c23 DD 0xf7a4a453,0xf7a4a453 DD 0x967272e4,0x967272e4 DD 0x5bc0c09b,0x5bc0c09b DD 0xc2b7b775,0xc2b7b775 DD 0x1cfdfde1,0x1cfdfde1 DD 0xae93933d,0xae93933d DD 0x6a26264c,0x6a26264c DD 0x5a36366c,0x5a36366c DD 0x413f3f7e,0x413f3f7e DD 0x02f7f7f5,0x02f7f7f5 DD 0x4fcccc83,0x4fcccc83 DD 0x5c343468,0x5c343468 DD 0xf4a5a551,0xf4a5a551 DD 0x34e5e5d1,0x34e5e5d1 DD 0x08f1f1f9,0x08f1f1f9 DD 0x937171e2,0x937171e2 DD 0x73d8d8ab,0x73d8d8ab DD 0x53313162,0x53313162 DD 0x3f15152a,0x3f15152a DD 0x0c040408,0x0c040408 DD 0x52c7c795,0x52c7c795 DD 0x65232346,0x65232346 DD 0x5ec3c39d,0x5ec3c39d DD 0x28181830,0x28181830 DD 0xa1969637,0xa1969637 DD 0x0f05050a,0x0f05050a DD 0xb59a9a2f,0xb59a9a2f DD 0x0907070e,0x0907070e DD 0x36121224,0x36121224 DD 0x9b80801b,0x9b80801b DD 0x3de2e2df,0x3de2e2df DD 0x26ebebcd,0x26ebebcd DD 0x6927274e,0x6927274e DD 0xcdb2b27f,0xcdb2b27f DD 0x9f7575ea,0x9f7575ea DD 0x1b090912,0x1b090912 DD 0x9e83831d,0x9e83831d DD 0x742c2c58,0x742c2c58 DD 0x2e1a1a34,0x2e1a1a34 DD 0x2d1b1b36,0x2d1b1b36 DD 0xb26e6edc,0xb26e6edc DD 0xee5a5ab4,0xee5a5ab4 DD 0xfba0a05b,0xfba0a05b DD 0xf65252a4,0xf65252a4 DD 0x4d3b3b76,0x4d3b3b76 DD 0x61d6d6b7,0x61d6d6b7 DD 0xceb3b37d,0xceb3b37d DD 0x7b292952,0x7b292952 DD 0x3ee3e3dd,0x3ee3e3dd DD 0x712f2f5e,0x712f2f5e DD 0x97848413,0x97848413 DD 0xf55353a6,0xf55353a6 DD 0x68d1d1b9,0x68d1d1b9 DD 0x00000000,0x00000000 DD 0x2cededc1,0x2cededc1 DD 0x60202040,0x60202040 DD 0x1ffcfce3,0x1ffcfce3 DD 0xc8b1b179,0xc8b1b179 DD 0xed5b5bb6,0xed5b5bb6 DD 0xbe6a6ad4,0xbe6a6ad4 DD 0x46cbcb8d,0x46cbcb8d DD 0xd9bebe67,0xd9bebe67 DD 0x4b393972,0x4b393972 DD 0xde4a4a94,0xde4a4a94 DD 0xd44c4c98,0xd44c4c98 DD 0xe85858b0,0xe85858b0 DD 0x4acfcf85,0x4acfcf85 DD 0x6bd0d0bb,0x6bd0d0bb DD 0x2aefefc5,0x2aefefc5 DD 0xe5aaaa4f,0xe5aaaa4f DD 0x16fbfbed,0x16fbfbed DD 0xc5434386,0xc5434386 DD 0xd74d4d9a,0xd74d4d9a DD 0x55333366,0x55333366 DD 0x94858511,0x94858511 DD 0xcf45458a,0xcf45458a DD 0x10f9f9e9,0x10f9f9e9 DD 0x06020204,0x06020204 DD 0x817f7ffe,0x817f7ffe DD 0xf05050a0,0xf05050a0 DD 0x443c3c78,0x443c3c78 DD 0xba9f9f25,0xba9f9f25 DD 0xe3a8a84b,0xe3a8a84b DD 0xf35151a2,0xf35151a2 DD 0xfea3a35d,0xfea3a35d DD 0xc0404080,0xc0404080 DD 0x8a8f8f05,0x8a8f8f05 DD 0xad92923f,0xad92923f DD 0xbc9d9d21,0xbc9d9d21 DD 0x48383870,0x48383870 DD 0x04f5f5f1,0x04f5f5f1 DD 0xdfbcbc63,0xdfbcbc63 DD 0xc1b6b677,0xc1b6b677 DD 0x75dadaaf,0x75dadaaf DD 0x63212142,0x63212142 DD 0x30101020,0x30101020 DD 0x1affffe5,0x1affffe5 DD 0x0ef3f3fd,0x0ef3f3fd DD 0x6dd2d2bf,0x6dd2d2bf DD 0x4ccdcd81,0x4ccdcd81 DD 0x140c0c18,0x140c0c18 DD 0x35131326,0x35131326 DD 0x2fececc3,0x2fececc3 DD 0xe15f5fbe,0xe15f5fbe DD 0xa2979735,0xa2979735 DD 0xcc444488,0xcc444488 DD 0x3917172e,0x3917172e DD 0x57c4c493,0x57c4c493 DD 0xf2a7a755,0xf2a7a755 DD 0x827e7efc,0x827e7efc DD 0x473d3d7a,0x473d3d7a DD 0xac6464c8,0xac6464c8 DD 0xe75d5dba,0xe75d5dba DD 0x2b191932,0x2b191932 DD 0x957373e6,0x957373e6 DD 0xa06060c0,0xa06060c0 DD 0x98818119,0x98818119 DD 0xd14f4f9e,0xd14f4f9e DD 0x7fdcdca3,0x7fdcdca3 DD 0x66222244,0x66222244 DD 0x7e2a2a54,0x7e2a2a54 DD 0xab90903b,0xab90903b DD 0x8388880b,0x8388880b DD 0xca46468c,0xca46468c DD 0x29eeeec7,0x29eeeec7 DD 0xd3b8b86b,0xd3b8b86b DD 0x3c141428,0x3c141428 DD 0x79dedea7,0x79dedea7 DD 0xe25e5ebc,0xe25e5ebc DD 0x1d0b0b16,0x1d0b0b16 DD 0x76dbdbad,0x76dbdbad DD 0x3be0e0db,0x3be0e0db DD 0x56323264,0x56323264 DD 0x4e3a3a74,0x4e3a3a74 DD 0x1e0a0a14,0x1e0a0a14 DD 0xdb494992,0xdb494992 DD 0x0a06060c,0x0a06060c DD 0x6c242448,0x6c242448 DD 0xe45c5cb8,0xe45c5cb8 DD 0x5dc2c29f,0x5dc2c29f DD 0x6ed3d3bd,0x6ed3d3bd DD 0xefacac43,0xefacac43 DD 0xa66262c4,0xa66262c4 DD 0xa8919139,0xa8919139 DD 0xa4959531,0xa4959531 DD 0x37e4e4d3,0x37e4e4d3 DD 0x8b7979f2,0x8b7979f2 DD 0x32e7e7d5,0x32e7e7d5 DD 0x43c8c88b,0x43c8c88b DD 0x5937376e,0x5937376e DD 0xb76d6dda,0xb76d6dda DD 0x8c8d8d01,0x8c8d8d01 DD 0x64d5d5b1,0x64d5d5b1 DD 0xd24e4e9c,0xd24e4e9c DD 0xe0a9a949,0xe0a9a949 DD 0xb46c6cd8,0xb46c6cd8 DD 0xfa5656ac,0xfa5656ac DD 0x07f4f4f3,0x07f4f4f3 DD 0x25eaeacf,0x25eaeacf DD 0xaf6565ca,0xaf6565ca DD 0x8e7a7af4,0x8e7a7af4 DD 0xe9aeae47,0xe9aeae47 DD 0x18080810,0x18080810 DD 0xd5baba6f,0xd5baba6f DD 0x887878f0,0x887878f0 DD 0x6f25254a,0x6f25254a DD 0x722e2e5c,0x722e2e5c DD 0x241c1c38,0x241c1c38 DD 0xf1a6a657,0xf1a6a657 DD 0xc7b4b473,0xc7b4b473 DD 0x51c6c697,0x51c6c697 DD 0x23e8e8cb,0x23e8e8cb DD 0x7cdddda1,0x7cdddda1 DD 0x9c7474e8,0x9c7474e8 DD 0x211f1f3e,0x211f1f3e DD 0xdd4b4b96,0xdd4b4b96 DD 0xdcbdbd61,0xdcbdbd61 DD 0x868b8b0d,0x868b8b0d DD 0x858a8a0f,0x858a8a0f DD 0x907070e0,0x907070e0 DD 0x423e3e7c,0x423e3e7c DD 0xc4b5b571,0xc4b5b571 DD 0xaa6666cc,0xaa6666cc DD 0xd8484890,0xd8484890 DD 0x05030306,0x05030306 DD 0x01f6f6f7,0x01f6f6f7 DD 0x120e0e1c,0x120e0e1c DD 0xa36161c2,0xa36161c2 DD 0x5f35356a,0x5f35356a DD 0xf95757ae,0xf95757ae DD 0xd0b9b969,0xd0b9b969 DD 0x91868617,0x91868617 DD 0x58c1c199,0x58c1c199 DD 0x271d1d3a,0x271d1d3a DD 0xb99e9e27,0xb99e9e27 DD 0x38e1e1d9,0x38e1e1d9 DD 0x13f8f8eb,0x13f8f8eb DD 0xb398982b,0xb398982b DD 0x33111122,0x33111122 DD 0xbb6969d2,0xbb6969d2 DD 0x70d9d9a9,0x70d9d9a9 DD 0x898e8e07,0x898e8e07 DD 0xa7949433,0xa7949433 DD 0xb69b9b2d,0xb69b9b2d DD 0x221e1e3c,0x221e1e3c DD 0x92878715,0x92878715 DD 0x20e9e9c9,0x20e9e9c9 DD 0x49cece87,0x49cece87 DD 0xff5555aa,0xff5555aa DD 0x78282850,0x78282850 DD 0x7adfdfa5,0x7adfdfa5 DD 0x8f8c8c03,0x8f8c8c03 DD 0xf8a1a159,0xf8a1a159 DD 0x80898909,0x80898909 DD 0x170d0d1a,0x170d0d1a DD 0xdabfbf65,0xdabfbf65 DD 0x31e6e6d7,0x31e6e6d7 DD 0xc6424284,0xc6424284 DD 0xb86868d0,0xb86868d0 DD 0xc3414182,0xc3414182 DD 0xb0999929,0xb0999929 DD 0x772d2d5a,0x772d2d5a DD 0x110f0f1e,0x110f0f1e DD 0xcbb0b07b,0xcbb0b07b DD 0xfc5454a8,0xfc5454a8 DD 0xd6bbbb6d,0xd6bbbb6d DD 0x3a16162c,0x3a16162c DB 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 DB 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 DB 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 DB 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 DB 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc DB 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 DB 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a DB 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 DB 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 DB 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 DB 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b DB 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf DB 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 DB 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 DB 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 DB 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 DB 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 DB 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 DB 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 DB 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb DB 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c DB 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 DB 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 DB 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 DB 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 DB 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a DB 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e DB 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e DB 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 DB 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf DB 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 DB 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 DB 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 DB 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 DB 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 DB 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 DB 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc DB 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 DB 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a DB 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 DB 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 DB 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 DB 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b DB 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf DB 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 DB 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 DB 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 DB 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 DB 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 DB 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 DB 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 DB 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb DB 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c DB 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 DB 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 DB 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 DB 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 DB 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a DB 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e DB 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e DB 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 DB 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf DB 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 DB 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 DB 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 DB 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 DB 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 DB 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 DB 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc DB 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 DB 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a DB 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 DB 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 DB 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 DB 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b DB 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf DB 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 DB 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 DB 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 DB 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 DB 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 DB 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 DB 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 DB 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb DB 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c DB 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 DB 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 DB 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 DB 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 DB 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a DB 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e DB 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e DB 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 DB 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf DB 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 DB 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 DB 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5 DB 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76 DB 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0 DB 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0 DB 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc DB 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15 DB 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a DB 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75 DB 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0 DB 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84 DB 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b DB 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf DB 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85 DB 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8 DB 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5 DB 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2 DB 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17 DB 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73 DB 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88 DB 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb DB 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c DB 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79 DB 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9 DB 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08 DB 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6 DB 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a DB 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e DB 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e DB 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94 DB 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf DB 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68 DB 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 DD 0x00000001,0x00000002,0x00000004,0x00000008 DD 0x00000010,0x00000020,0x00000040,0x00000080 DD 0x0000001b,0x00000036,0x80808080,0x80808080 DD 0xfefefefe,0xfefefefe,0x1b1b1b1b,0x1b1b1b1b DB 65,69,83,32,102,111,114,32,120,56,54,95,54,52,44,32 DB 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 DB 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 DB 62,0 ALIGN 64 EXTERN __imp_RtlVirtualUnwind ALIGN 16 block_se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_block_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_block_prologue mov rax,QWORD[24+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$in_block_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi jmp NEAR $L$common_seh_exit ALIGN 16 key_se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_key_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_key_prologue lea rax,[56+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$in_key_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi $L$common_seh_exit: mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_aes_nohw_encrypt wrt ..imagebase DD $L$SEH_end_GFp_aes_nohw_encrypt wrt ..imagebase DD $L$SEH_info_GFp_aes_nohw_encrypt wrt ..imagebase DD $L$SEH_begin_GFp_aes_nohw_set_encrypt_key wrt ..imagebase DD $L$SEH_end_GFp_aes_nohw_set_encrypt_key wrt ..imagebase DD $L$SEH_info_GFp_aes_nohw_set_encrypt_key wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_aes_nohw_encrypt: DB 9,0,0,0 DD block_se_handler wrt ..imagebase DD $L$enc_prologue wrt ..imagebase,$L$enc_epilogue wrt ..imagebase $L$SEH_info_GFp_aes_nohw_set_encrypt_key: DB 9,0,0,0 DD key_se_handler wrt ..imagebase DD $L$enc_key_prologue wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase ring-0.16.9/pregenerated/tmp/aesni-gcm-x86_64-nasm.asm000064400000000000000000000535461353224260200204520ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 ALIGN 32 _aesni_ctr32_ghash_6x: vmovdqu xmm2,XMMWORD[32+r11] sub rdx,6 vpxor xmm4,xmm4,xmm4 vmovdqu xmm15,XMMWORD[((0-128))+rcx] vpaddb xmm10,xmm1,xmm2 vpaddb xmm11,xmm10,xmm2 vpaddb xmm12,xmm11,xmm2 vpaddb xmm13,xmm12,xmm2 vpaddb xmm14,xmm13,xmm2 vpxor xmm9,xmm1,xmm15 vmovdqu XMMWORD[(16+8)+rsp],xmm4 jmp NEAR $L$oop6x ALIGN 32 $L$oop6x: add ebx,100663296 jc NEAR $L$handle_ctr32 vmovdqu xmm3,XMMWORD[((0-32))+r9] vpaddb xmm1,xmm14,xmm2 vpxor xmm10,xmm10,xmm15 vpxor xmm11,xmm11,xmm15 $L$resume_ctr32: vmovdqu XMMWORD[r8],xmm1 vpclmulqdq xmm5,xmm7,xmm3,0x10 vpxor xmm12,xmm12,xmm15 vmovups xmm2,XMMWORD[((16-128))+rcx] vpclmulqdq xmm6,xmm7,xmm3,0x01 xor r12,r12 cmp r15,r14 vaesenc xmm9,xmm9,xmm2 vmovdqu xmm0,XMMWORD[((48+8))+rsp] vpxor xmm13,xmm13,xmm15 vpclmulqdq xmm1,xmm7,xmm3,0x00 vaesenc xmm10,xmm10,xmm2 vpxor xmm14,xmm14,xmm15 setnc r12b vpclmulqdq xmm7,xmm7,xmm3,0x11 vaesenc xmm11,xmm11,xmm2 vmovdqu xmm3,XMMWORD[((16-32))+r9] neg r12 vaesenc xmm12,xmm12,xmm2 vpxor xmm6,xmm6,xmm5 vpclmulqdq xmm5,xmm0,xmm3,0x00 vpxor xmm8,xmm8,xmm4 vaesenc xmm13,xmm13,xmm2 vpxor xmm4,xmm1,xmm5 and r12,0x60 vmovups xmm15,XMMWORD[((32-128))+rcx] vpclmulqdq xmm1,xmm0,xmm3,0x10 vaesenc xmm14,xmm14,xmm2 vpclmulqdq xmm2,xmm0,xmm3,0x01 lea r14,[r12*1+r14] vaesenc xmm9,xmm9,xmm15 vpxor xmm8,xmm8,XMMWORD[((16+8))+rsp] vpclmulqdq xmm3,xmm0,xmm3,0x11 vmovdqu xmm0,XMMWORD[((64+8))+rsp] vaesenc xmm10,xmm10,xmm15 movbe r13,QWORD[88+r14] vaesenc xmm11,xmm11,xmm15 movbe r12,QWORD[80+r14] vaesenc xmm12,xmm12,xmm15 mov QWORD[((32+8))+rsp],r13 vaesenc xmm13,xmm13,xmm15 mov QWORD[((40+8))+rsp],r12 vmovdqu xmm5,XMMWORD[((48-32))+r9] vaesenc xmm14,xmm14,xmm15 vmovups xmm15,XMMWORD[((48-128))+rcx] vpxor xmm6,xmm6,xmm1 vpclmulqdq xmm1,xmm0,xmm5,0x00 vaesenc xmm9,xmm9,xmm15 vpxor xmm6,xmm6,xmm2 vpclmulqdq xmm2,xmm0,xmm5,0x10 vaesenc xmm10,xmm10,xmm15 vpxor xmm7,xmm7,xmm3 vpclmulqdq xmm3,xmm0,xmm5,0x01 vaesenc xmm11,xmm11,xmm15 vpclmulqdq xmm5,xmm0,xmm5,0x11 vmovdqu xmm0,XMMWORD[((80+8))+rsp] vaesenc xmm12,xmm12,xmm15 vaesenc xmm13,xmm13,xmm15 vpxor xmm4,xmm4,xmm1 vmovdqu xmm1,XMMWORD[((64-32))+r9] vaesenc xmm14,xmm14,xmm15 vmovups xmm15,XMMWORD[((64-128))+rcx] vpxor xmm6,xmm6,xmm2 vpclmulqdq xmm2,xmm0,xmm1,0x00 vaesenc xmm9,xmm9,xmm15 vpxor xmm6,xmm6,xmm3 vpclmulqdq xmm3,xmm0,xmm1,0x10 vaesenc xmm10,xmm10,xmm15 movbe r13,QWORD[72+r14] vpxor xmm7,xmm7,xmm5 vpclmulqdq xmm5,xmm0,xmm1,0x01 vaesenc xmm11,xmm11,xmm15 movbe r12,QWORD[64+r14] vpclmulqdq xmm1,xmm0,xmm1,0x11 vmovdqu xmm0,XMMWORD[((96+8))+rsp] vaesenc xmm12,xmm12,xmm15 mov QWORD[((48+8))+rsp],r13 vaesenc xmm13,xmm13,xmm15 mov QWORD[((56+8))+rsp],r12 vpxor xmm4,xmm4,xmm2 vmovdqu xmm2,XMMWORD[((96-32))+r9] vaesenc xmm14,xmm14,xmm15 vmovups xmm15,XMMWORD[((80-128))+rcx] vpxor xmm6,xmm6,xmm3 vpclmulqdq xmm3,xmm0,xmm2,0x00 vaesenc xmm9,xmm9,xmm15 vpxor xmm6,xmm6,xmm5 vpclmulqdq xmm5,xmm0,xmm2,0x10 vaesenc xmm10,xmm10,xmm15 movbe r13,QWORD[56+r14] vpxor xmm7,xmm7,xmm1 vpclmulqdq xmm1,xmm0,xmm2,0x01 vpxor xmm8,xmm8,XMMWORD[((112+8))+rsp] vaesenc xmm11,xmm11,xmm15 movbe r12,QWORD[48+r14] vpclmulqdq xmm2,xmm0,xmm2,0x11 vaesenc xmm12,xmm12,xmm15 mov QWORD[((64+8))+rsp],r13 vaesenc xmm13,xmm13,xmm15 mov QWORD[((72+8))+rsp],r12 vpxor xmm4,xmm4,xmm3 vmovdqu xmm3,XMMWORD[((112-32))+r9] vaesenc xmm14,xmm14,xmm15 vmovups xmm15,XMMWORD[((96-128))+rcx] vpxor xmm6,xmm6,xmm5 vpclmulqdq xmm5,xmm8,xmm3,0x10 vaesenc xmm9,xmm9,xmm15 vpxor xmm6,xmm6,xmm1 vpclmulqdq xmm1,xmm8,xmm3,0x01 vaesenc xmm10,xmm10,xmm15 movbe r13,QWORD[40+r14] vpxor xmm7,xmm7,xmm2 vpclmulqdq xmm2,xmm8,xmm3,0x00 vaesenc xmm11,xmm11,xmm15 movbe r12,QWORD[32+r14] vpclmulqdq xmm8,xmm8,xmm3,0x11 vaesenc xmm12,xmm12,xmm15 mov QWORD[((80+8))+rsp],r13 vaesenc xmm13,xmm13,xmm15 mov QWORD[((88+8))+rsp],r12 vpxor xmm6,xmm6,xmm5 vaesenc xmm14,xmm14,xmm15 vpxor xmm6,xmm6,xmm1 vmovups xmm15,XMMWORD[((112-128))+rcx] vpslldq xmm5,xmm6,8 vpxor xmm4,xmm4,xmm2 vmovdqu xmm3,XMMWORD[16+r11] vaesenc xmm9,xmm9,xmm15 vpxor xmm7,xmm7,xmm8 vaesenc xmm10,xmm10,xmm15 vpxor xmm4,xmm4,xmm5 movbe r13,QWORD[24+r14] vaesenc xmm11,xmm11,xmm15 movbe r12,QWORD[16+r14] vpalignr xmm0,xmm4,xmm4,8 vpclmulqdq xmm4,xmm4,xmm3,0x10 mov QWORD[((96+8))+rsp],r13 vaesenc xmm12,xmm12,xmm15 mov QWORD[((104+8))+rsp],r12 vaesenc xmm13,xmm13,xmm15 vmovups xmm1,XMMWORD[((128-128))+rcx] vaesenc xmm14,xmm14,xmm15 vaesenc xmm9,xmm9,xmm1 vmovups xmm15,XMMWORD[((144-128))+rcx] vaesenc xmm10,xmm10,xmm1 vpsrldq xmm6,xmm6,8 vaesenc xmm11,xmm11,xmm1 vpxor xmm7,xmm7,xmm6 vaesenc xmm12,xmm12,xmm1 vpxor xmm4,xmm4,xmm0 movbe r13,QWORD[8+r14] vaesenc xmm13,xmm13,xmm1 movbe r12,QWORD[r14] vaesenc xmm14,xmm14,xmm1 vmovups xmm1,XMMWORD[((160-128))+rcx] cmp ebp,11 jb NEAR $L$enc_tail vaesenc xmm9,xmm9,xmm15 vaesenc xmm10,xmm10,xmm15 vaesenc xmm11,xmm11,xmm15 vaesenc xmm12,xmm12,xmm15 vaesenc xmm13,xmm13,xmm15 vaesenc xmm14,xmm14,xmm15 vaesenc xmm9,xmm9,xmm1 vaesenc xmm10,xmm10,xmm1 vaesenc xmm11,xmm11,xmm1 vaesenc xmm12,xmm12,xmm1 vaesenc xmm13,xmm13,xmm1 vmovups xmm15,XMMWORD[((176-128))+rcx] vaesenc xmm14,xmm14,xmm1 vmovups xmm1,XMMWORD[((192-128))+rcx] vaesenc xmm9,xmm9,xmm15 vaesenc xmm10,xmm10,xmm15 vaesenc xmm11,xmm11,xmm15 vaesenc xmm12,xmm12,xmm15 vaesenc xmm13,xmm13,xmm15 vaesenc xmm14,xmm14,xmm15 vaesenc xmm9,xmm9,xmm1 vaesenc xmm10,xmm10,xmm1 vaesenc xmm11,xmm11,xmm1 vaesenc xmm12,xmm12,xmm1 vaesenc xmm13,xmm13,xmm1 vmovups xmm15,XMMWORD[((208-128))+rcx] vaesenc xmm14,xmm14,xmm1 vmovups xmm1,XMMWORD[((224-128))+rcx] jmp NEAR $L$enc_tail ALIGN 32 $L$handle_ctr32: vmovdqu xmm0,XMMWORD[r11] vpshufb xmm6,xmm1,xmm0 vmovdqu xmm5,XMMWORD[48+r11] vpaddd xmm10,xmm6,XMMWORD[64+r11] vpaddd xmm11,xmm6,xmm5 vmovdqu xmm3,XMMWORD[((0-32))+r9] vpaddd xmm12,xmm10,xmm5 vpshufb xmm10,xmm10,xmm0 vpaddd xmm13,xmm11,xmm5 vpshufb xmm11,xmm11,xmm0 vpxor xmm10,xmm10,xmm15 vpaddd xmm14,xmm12,xmm5 vpshufb xmm12,xmm12,xmm0 vpxor xmm11,xmm11,xmm15 vpaddd xmm1,xmm13,xmm5 vpshufb xmm13,xmm13,xmm0 vpshufb xmm14,xmm14,xmm0 vpshufb xmm1,xmm1,xmm0 jmp NEAR $L$resume_ctr32 ALIGN 32 $L$enc_tail: vaesenc xmm9,xmm9,xmm15 vmovdqu XMMWORD[(16+8)+rsp],xmm7 vpalignr xmm8,xmm4,xmm4,8 vaesenc xmm10,xmm10,xmm15 vpclmulqdq xmm4,xmm4,xmm3,0x10 vpxor xmm2,xmm1,XMMWORD[rdi] vaesenc xmm11,xmm11,xmm15 vpxor xmm0,xmm1,XMMWORD[16+rdi] vaesenc xmm12,xmm12,xmm15 vpxor xmm5,xmm1,XMMWORD[32+rdi] vaesenc xmm13,xmm13,xmm15 vpxor xmm6,xmm1,XMMWORD[48+rdi] vaesenc xmm14,xmm14,xmm15 vpxor xmm7,xmm1,XMMWORD[64+rdi] vpxor xmm3,xmm1,XMMWORD[80+rdi] vmovdqu xmm1,XMMWORD[r8] vaesenclast xmm9,xmm9,xmm2 vmovdqu xmm2,XMMWORD[32+r11] vaesenclast xmm10,xmm10,xmm0 vpaddb xmm0,xmm1,xmm2 mov QWORD[((112+8))+rsp],r13 lea rdi,[96+rdi] vaesenclast xmm11,xmm11,xmm5 vpaddb xmm5,xmm0,xmm2 mov QWORD[((120+8))+rsp],r12 lea rsi,[96+rsi] vmovdqu xmm15,XMMWORD[((0-128))+rcx] vaesenclast xmm12,xmm12,xmm6 vpaddb xmm6,xmm5,xmm2 vaesenclast xmm13,xmm13,xmm7 vpaddb xmm7,xmm6,xmm2 vaesenclast xmm14,xmm14,xmm3 vpaddb xmm3,xmm7,xmm2 add r10,0x60 sub rdx,0x6 jc NEAR $L$6x_done vmovups XMMWORD[(-96)+rsi],xmm9 vpxor xmm9,xmm1,xmm15 vmovups XMMWORD[(-80)+rsi],xmm10 vmovdqa xmm10,xmm0 vmovups XMMWORD[(-64)+rsi],xmm11 vmovdqa xmm11,xmm5 vmovups XMMWORD[(-48)+rsi],xmm12 vmovdqa xmm12,xmm6 vmovups XMMWORD[(-32)+rsi],xmm13 vmovdqa xmm13,xmm7 vmovups XMMWORD[(-16)+rsi],xmm14 vmovdqa xmm14,xmm3 vmovdqu xmm7,XMMWORD[((32+8))+rsp] jmp NEAR $L$oop6x $L$6x_done: vpxor xmm8,xmm8,XMMWORD[((16+8))+rsp] vpxor xmm8,xmm8,xmm4 DB 0F3h,0C3h ;repret global GFp_aesni_gcm_decrypt ALIGN 32 GFp_aesni_gcm_decrypt: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_aesni_gcm_decrypt: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] xor r10,r10 cmp rdx,0x60 jb NEAR $L$gcm_dec_abort lea rax,[rsp] push rbx push rbp push r12 push r13 push r14 push r15 lea rsp,[((-168))+rsp] movaps XMMWORD[(-216)+rax],xmm6 movaps XMMWORD[(-200)+rax],xmm7 movaps XMMWORD[(-184)+rax],xmm8 movaps XMMWORD[(-168)+rax],xmm9 movaps XMMWORD[(-152)+rax],xmm10 movaps XMMWORD[(-136)+rax],xmm11 movaps XMMWORD[(-120)+rax],xmm12 movaps XMMWORD[(-104)+rax],xmm13 movaps XMMWORD[(-88)+rax],xmm14 movaps XMMWORD[(-72)+rax],xmm15 $L$gcm_dec_body: vzeroupper vmovdqu xmm1,XMMWORD[r8] add rsp,-128 mov ebx,DWORD[12+r8] lea r11,[$L$bswap_mask] lea r14,[((-128))+rcx] mov r15,0xf80 vmovdqu xmm8,XMMWORD[r9] and rsp,-128 vmovdqu xmm0,XMMWORD[r11] lea rcx,[128+rcx] lea r9,[((32+32))+r9] mov ebp,DWORD[((240-128))+rcx] vpshufb xmm8,xmm8,xmm0 and r14,r15 and r15,rsp sub r15,r14 jc NEAR $L$dec_no_key_aliasing cmp r15,768 jnc NEAR $L$dec_no_key_aliasing sub rsp,r15 $L$dec_no_key_aliasing: vmovdqu xmm7,XMMWORD[80+rdi] lea r14,[rdi] vmovdqu xmm4,XMMWORD[64+rdi] lea r15,[((-192))+rdx*1+rdi] vmovdqu xmm5,XMMWORD[48+rdi] shr rdx,4 xor r10,r10 vmovdqu xmm6,XMMWORD[32+rdi] vpshufb xmm7,xmm7,xmm0 vmovdqu xmm2,XMMWORD[16+rdi] vpshufb xmm4,xmm4,xmm0 vmovdqu xmm3,XMMWORD[rdi] vpshufb xmm5,xmm5,xmm0 vmovdqu XMMWORD[48+rsp],xmm4 vpshufb xmm6,xmm6,xmm0 vmovdqu XMMWORD[64+rsp],xmm5 vpshufb xmm2,xmm2,xmm0 vmovdqu XMMWORD[80+rsp],xmm6 vpshufb xmm3,xmm3,xmm0 vmovdqu XMMWORD[96+rsp],xmm2 vmovdqu XMMWORD[112+rsp],xmm3 call _aesni_ctr32_ghash_6x vmovups XMMWORD[(-96)+rsi],xmm9 vmovups XMMWORD[(-80)+rsi],xmm10 vmovups XMMWORD[(-64)+rsi],xmm11 vmovups XMMWORD[(-48)+rsi],xmm12 vmovups XMMWORD[(-32)+rsi],xmm13 vmovups XMMWORD[(-16)+rsi],xmm14 vpshufb xmm8,xmm8,XMMWORD[r11] vmovdqu XMMWORD[(-64)+r9],xmm8 vzeroupper movaps xmm6,XMMWORD[((-216))+rax] movaps xmm7,XMMWORD[((-200))+rax] movaps xmm8,XMMWORD[((-184))+rax] movaps xmm9,XMMWORD[((-168))+rax] movaps xmm10,XMMWORD[((-152))+rax] movaps xmm11,XMMWORD[((-136))+rax] movaps xmm12,XMMWORD[((-120))+rax] movaps xmm13,XMMWORD[((-104))+rax] movaps xmm14,XMMWORD[((-88))+rax] movaps xmm15,XMMWORD[((-72))+rax] mov r15,QWORD[((-48))+rax] mov r14,QWORD[((-40))+rax] mov r13,QWORD[((-32))+rax] mov r12,QWORD[((-24))+rax] mov rbp,QWORD[((-16))+rax] mov rbx,QWORD[((-8))+rax] lea rsp,[rax] $L$gcm_dec_abort: mov rax,r10 mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_aesni_gcm_decrypt: ALIGN 32 _aesni_ctr32_6x: vmovdqu xmm4,XMMWORD[((0-128))+rcx] vmovdqu xmm2,XMMWORD[32+r11] lea r13,[((-1))+rbp] vmovups xmm15,XMMWORD[((16-128))+rcx] lea r12,[((32-128))+rcx] vpxor xmm9,xmm1,xmm4 add ebx,100663296 jc NEAR $L$handle_ctr32_2 vpaddb xmm10,xmm1,xmm2 vpaddb xmm11,xmm10,xmm2 vpxor xmm10,xmm10,xmm4 vpaddb xmm12,xmm11,xmm2 vpxor xmm11,xmm11,xmm4 vpaddb xmm13,xmm12,xmm2 vpxor xmm12,xmm12,xmm4 vpaddb xmm14,xmm13,xmm2 vpxor xmm13,xmm13,xmm4 vpaddb xmm1,xmm14,xmm2 vpxor xmm14,xmm14,xmm4 jmp NEAR $L$oop_ctr32 ALIGN 16 $L$oop_ctr32: vaesenc xmm9,xmm9,xmm15 vaesenc xmm10,xmm10,xmm15 vaesenc xmm11,xmm11,xmm15 vaesenc xmm12,xmm12,xmm15 vaesenc xmm13,xmm13,xmm15 vaesenc xmm14,xmm14,xmm15 vmovups xmm15,XMMWORD[r12] lea r12,[16+r12] dec r13d jnz NEAR $L$oop_ctr32 vmovdqu xmm3,XMMWORD[r12] vaesenc xmm9,xmm9,xmm15 vpxor xmm4,xmm3,XMMWORD[rdi] vaesenc xmm10,xmm10,xmm15 vpxor xmm5,xmm3,XMMWORD[16+rdi] vaesenc xmm11,xmm11,xmm15 vpxor xmm6,xmm3,XMMWORD[32+rdi] vaesenc xmm12,xmm12,xmm15 vpxor xmm8,xmm3,XMMWORD[48+rdi] vaesenc xmm13,xmm13,xmm15 vpxor xmm2,xmm3,XMMWORD[64+rdi] vaesenc xmm14,xmm14,xmm15 vpxor xmm3,xmm3,XMMWORD[80+rdi] lea rdi,[96+rdi] vaesenclast xmm9,xmm9,xmm4 vaesenclast xmm10,xmm10,xmm5 vaesenclast xmm11,xmm11,xmm6 vaesenclast xmm12,xmm12,xmm8 vaesenclast xmm13,xmm13,xmm2 vaesenclast xmm14,xmm14,xmm3 vmovups XMMWORD[rsi],xmm9 vmovups XMMWORD[16+rsi],xmm10 vmovups XMMWORD[32+rsi],xmm11 vmovups XMMWORD[48+rsi],xmm12 vmovups XMMWORD[64+rsi],xmm13 vmovups XMMWORD[80+rsi],xmm14 lea rsi,[96+rsi] DB 0F3h,0C3h ;repret ALIGN 32 $L$handle_ctr32_2: vpshufb xmm6,xmm1,xmm0 vmovdqu xmm5,XMMWORD[48+r11] vpaddd xmm10,xmm6,XMMWORD[64+r11] vpaddd xmm11,xmm6,xmm5 vpaddd xmm12,xmm10,xmm5 vpshufb xmm10,xmm10,xmm0 vpaddd xmm13,xmm11,xmm5 vpshufb xmm11,xmm11,xmm0 vpxor xmm10,xmm10,xmm4 vpaddd xmm14,xmm12,xmm5 vpshufb xmm12,xmm12,xmm0 vpxor xmm11,xmm11,xmm4 vpaddd xmm1,xmm13,xmm5 vpshufb xmm13,xmm13,xmm0 vpxor xmm12,xmm12,xmm4 vpshufb xmm14,xmm14,xmm0 vpxor xmm13,xmm13,xmm4 vpshufb xmm1,xmm1,xmm0 vpxor xmm14,xmm14,xmm4 jmp NEAR $L$oop_ctr32 global GFp_aesni_gcm_encrypt ALIGN 32 GFp_aesni_gcm_encrypt: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_aesni_gcm_encrypt: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] xor r10,r10 cmp rdx,0x60*3 jb NEAR $L$gcm_enc_abort lea rax,[rsp] push rbx push rbp push r12 push r13 push r14 push r15 lea rsp,[((-168))+rsp] movaps XMMWORD[(-216)+rax],xmm6 movaps XMMWORD[(-200)+rax],xmm7 movaps XMMWORD[(-184)+rax],xmm8 movaps XMMWORD[(-168)+rax],xmm9 movaps XMMWORD[(-152)+rax],xmm10 movaps XMMWORD[(-136)+rax],xmm11 movaps XMMWORD[(-120)+rax],xmm12 movaps XMMWORD[(-104)+rax],xmm13 movaps XMMWORD[(-88)+rax],xmm14 movaps XMMWORD[(-72)+rax],xmm15 $L$gcm_enc_body: vzeroupper vmovdqu xmm1,XMMWORD[r8] add rsp,-128 mov ebx,DWORD[12+r8] lea r11,[$L$bswap_mask] lea r14,[((-128))+rcx] mov r15,0xf80 lea rcx,[128+rcx] vmovdqu xmm0,XMMWORD[r11] and rsp,-128 mov ebp,DWORD[((240-128))+rcx] and r14,r15 and r15,rsp sub r15,r14 jc NEAR $L$enc_no_key_aliasing cmp r15,768 jnc NEAR $L$enc_no_key_aliasing sub rsp,r15 $L$enc_no_key_aliasing: lea r14,[rsi] lea r15,[((-192))+rdx*1+rsi] shr rdx,4 call _aesni_ctr32_6x vpshufb xmm8,xmm9,xmm0 vpshufb xmm2,xmm10,xmm0 vmovdqu XMMWORD[112+rsp],xmm8 vpshufb xmm4,xmm11,xmm0 vmovdqu XMMWORD[96+rsp],xmm2 vpshufb xmm5,xmm12,xmm0 vmovdqu XMMWORD[80+rsp],xmm4 vpshufb xmm6,xmm13,xmm0 vmovdqu XMMWORD[64+rsp],xmm5 vpshufb xmm7,xmm14,xmm0 vmovdqu XMMWORD[48+rsp],xmm6 call _aesni_ctr32_6x vmovdqu xmm8,XMMWORD[r9] lea r9,[((32+32))+r9] sub rdx,12 mov r10,0x60*2 vpshufb xmm8,xmm8,xmm0 call _aesni_ctr32_ghash_6x vmovdqu xmm7,XMMWORD[32+rsp] vmovdqu xmm0,XMMWORD[r11] vmovdqu xmm3,XMMWORD[((0-32))+r9] vpunpckhqdq xmm1,xmm7,xmm7 vmovdqu xmm15,XMMWORD[((32-32))+r9] vmovups XMMWORD[(-96)+rsi],xmm9 vpshufb xmm9,xmm9,xmm0 vpxor xmm1,xmm1,xmm7 vmovups XMMWORD[(-80)+rsi],xmm10 vpshufb xmm10,xmm10,xmm0 vmovups XMMWORD[(-64)+rsi],xmm11 vpshufb xmm11,xmm11,xmm0 vmovups XMMWORD[(-48)+rsi],xmm12 vpshufb xmm12,xmm12,xmm0 vmovups XMMWORD[(-32)+rsi],xmm13 vpshufb xmm13,xmm13,xmm0 vmovups XMMWORD[(-16)+rsi],xmm14 vpshufb xmm14,xmm14,xmm0 vmovdqu XMMWORD[16+rsp],xmm9 vmovdqu xmm6,XMMWORD[48+rsp] vmovdqu xmm0,XMMWORD[((16-32))+r9] vpunpckhqdq xmm2,xmm6,xmm6 vpclmulqdq xmm5,xmm7,xmm3,0x00 vpxor xmm2,xmm2,xmm6 vpclmulqdq xmm7,xmm7,xmm3,0x11 vpclmulqdq xmm1,xmm1,xmm15,0x00 vmovdqu xmm9,XMMWORD[64+rsp] vpclmulqdq xmm4,xmm6,xmm0,0x00 vmovdqu xmm3,XMMWORD[((48-32))+r9] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm5,xmm9,xmm9 vpclmulqdq xmm6,xmm6,xmm0,0x11 vpxor xmm5,xmm5,xmm9 vpxor xmm6,xmm6,xmm7 vpclmulqdq xmm2,xmm2,xmm15,0x10 vmovdqu xmm15,XMMWORD[((80-32))+r9] vpxor xmm2,xmm2,xmm1 vmovdqu xmm1,XMMWORD[80+rsp] vpclmulqdq xmm7,xmm9,xmm3,0x00 vmovdqu xmm0,XMMWORD[((64-32))+r9] vpxor xmm7,xmm7,xmm4 vpunpckhqdq xmm4,xmm1,xmm1 vpclmulqdq xmm9,xmm9,xmm3,0x11 vpxor xmm4,xmm4,xmm1 vpxor xmm9,xmm9,xmm6 vpclmulqdq xmm5,xmm5,xmm15,0x00 vpxor xmm5,xmm5,xmm2 vmovdqu xmm2,XMMWORD[96+rsp] vpclmulqdq xmm6,xmm1,xmm0,0x00 vmovdqu xmm3,XMMWORD[((96-32))+r9] vpxor xmm6,xmm6,xmm7 vpunpckhqdq xmm7,xmm2,xmm2 vpclmulqdq xmm1,xmm1,xmm0,0x11 vpxor xmm7,xmm7,xmm2 vpxor xmm1,xmm1,xmm9 vpclmulqdq xmm4,xmm4,xmm15,0x10 vmovdqu xmm15,XMMWORD[((128-32))+r9] vpxor xmm4,xmm4,xmm5 vpxor xmm8,xmm8,XMMWORD[112+rsp] vpclmulqdq xmm5,xmm2,xmm3,0x00 vmovdqu xmm0,XMMWORD[((112-32))+r9] vpunpckhqdq xmm9,xmm8,xmm8 vpxor xmm5,xmm5,xmm6 vpclmulqdq xmm2,xmm2,xmm3,0x11 vpxor xmm9,xmm9,xmm8 vpxor xmm2,xmm2,xmm1 vpclmulqdq xmm7,xmm7,xmm15,0x00 vpxor xmm4,xmm7,xmm4 vpclmulqdq xmm6,xmm8,xmm0,0x00 vmovdqu xmm3,XMMWORD[((0-32))+r9] vpunpckhqdq xmm1,xmm14,xmm14 vpclmulqdq xmm8,xmm8,xmm0,0x11 vpxor xmm1,xmm1,xmm14 vpxor xmm5,xmm6,xmm5 vpclmulqdq xmm9,xmm9,xmm15,0x10 vmovdqu xmm15,XMMWORD[((32-32))+r9] vpxor xmm7,xmm8,xmm2 vpxor xmm6,xmm9,xmm4 vmovdqu xmm0,XMMWORD[((16-32))+r9] vpxor xmm9,xmm7,xmm5 vpclmulqdq xmm4,xmm14,xmm3,0x00 vpxor xmm6,xmm6,xmm9 vpunpckhqdq xmm2,xmm13,xmm13 vpclmulqdq xmm14,xmm14,xmm3,0x11 vpxor xmm2,xmm2,xmm13 vpslldq xmm9,xmm6,8 vpclmulqdq xmm1,xmm1,xmm15,0x00 vpxor xmm8,xmm5,xmm9 vpsrldq xmm6,xmm6,8 vpxor xmm7,xmm7,xmm6 vpclmulqdq xmm5,xmm13,xmm0,0x00 vmovdqu xmm3,XMMWORD[((48-32))+r9] vpxor xmm5,xmm5,xmm4 vpunpckhqdq xmm9,xmm12,xmm12 vpclmulqdq xmm13,xmm13,xmm0,0x11 vpxor xmm9,xmm9,xmm12 vpxor xmm13,xmm13,xmm14 vpalignr xmm14,xmm8,xmm8,8 vpclmulqdq xmm2,xmm2,xmm15,0x10 vmovdqu xmm15,XMMWORD[((80-32))+r9] vpxor xmm2,xmm2,xmm1 vpclmulqdq xmm4,xmm12,xmm3,0x00 vmovdqu xmm0,XMMWORD[((64-32))+r9] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm1,xmm11,xmm11 vpclmulqdq xmm12,xmm12,xmm3,0x11 vpxor xmm1,xmm1,xmm11 vpxor xmm12,xmm12,xmm13 vxorps xmm7,xmm7,XMMWORD[16+rsp] vpclmulqdq xmm9,xmm9,xmm15,0x00 vpxor xmm9,xmm9,xmm2 vpclmulqdq xmm8,xmm8,XMMWORD[16+r11],0x10 vxorps xmm8,xmm8,xmm14 vpclmulqdq xmm5,xmm11,xmm0,0x00 vmovdqu xmm3,XMMWORD[((96-32))+r9] vpxor xmm5,xmm5,xmm4 vpunpckhqdq xmm2,xmm10,xmm10 vpclmulqdq xmm11,xmm11,xmm0,0x11 vpxor xmm2,xmm2,xmm10 vpalignr xmm14,xmm8,xmm8,8 vpxor xmm11,xmm11,xmm12 vpclmulqdq xmm1,xmm1,xmm15,0x10 vmovdqu xmm15,XMMWORD[((128-32))+r9] vpxor xmm1,xmm1,xmm9 vxorps xmm14,xmm14,xmm7 vpclmulqdq xmm8,xmm8,XMMWORD[16+r11],0x10 vxorps xmm8,xmm8,xmm14 vpclmulqdq xmm4,xmm10,xmm3,0x00 vmovdqu xmm0,XMMWORD[((112-32))+r9] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm9,xmm8,xmm8 vpclmulqdq xmm10,xmm10,xmm3,0x11 vpxor xmm9,xmm9,xmm8 vpxor xmm10,xmm10,xmm11 vpclmulqdq xmm2,xmm2,xmm15,0x00 vpxor xmm2,xmm2,xmm1 vpclmulqdq xmm5,xmm8,xmm0,0x00 vpclmulqdq xmm7,xmm8,xmm0,0x11 vpxor xmm5,xmm5,xmm4 vpclmulqdq xmm6,xmm9,xmm15,0x10 vpxor xmm7,xmm7,xmm10 vpxor xmm6,xmm6,xmm2 vpxor xmm4,xmm7,xmm5 vpxor xmm6,xmm6,xmm4 vpslldq xmm1,xmm6,8 vmovdqu xmm3,XMMWORD[16+r11] vpsrldq xmm6,xmm6,8 vpxor xmm8,xmm5,xmm1 vpxor xmm7,xmm7,xmm6 vpalignr xmm2,xmm8,xmm8,8 vpclmulqdq xmm8,xmm8,xmm3,0x10 vpxor xmm8,xmm8,xmm2 vpalignr xmm2,xmm8,xmm8,8 vpclmulqdq xmm8,xmm8,xmm3,0x10 vpxor xmm2,xmm2,xmm7 vpxor xmm8,xmm8,xmm2 vpshufb xmm8,xmm8,XMMWORD[r11] vmovdqu XMMWORD[(-64)+r9],xmm8 vzeroupper movaps xmm6,XMMWORD[((-216))+rax] movaps xmm7,XMMWORD[((-200))+rax] movaps xmm8,XMMWORD[((-184))+rax] movaps xmm9,XMMWORD[((-168))+rax] movaps xmm10,XMMWORD[((-152))+rax] movaps xmm11,XMMWORD[((-136))+rax] movaps xmm12,XMMWORD[((-120))+rax] movaps xmm13,XMMWORD[((-104))+rax] movaps xmm14,XMMWORD[((-88))+rax] movaps xmm15,XMMWORD[((-72))+rax] mov r15,QWORD[((-48))+rax] mov r14,QWORD[((-40))+rax] mov r13,QWORD[((-32))+rax] mov r12,QWORD[((-24))+rax] mov rbp,QWORD[((-16))+rax] mov rbx,QWORD[((-8))+rax] lea rsp,[rax] $L$gcm_enc_abort: mov rax,r10 mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_aesni_gcm_encrypt: ALIGN 64 $L$bswap_mask: DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$poly: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 $L$one_msb: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 $L$two_lsb: DB 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 $L$one_lsb: DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108 DB 101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82 DB 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 DB 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 ALIGN 64 EXTERN __imp_RtlVirtualUnwind ALIGN 16 gcm_se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov rax,QWORD[120+r8] mov r15,QWORD[((-48))+rax] mov r14,QWORD[((-40))+rax] mov r13,QWORD[((-32))+rax] mov r12,QWORD[((-24))+rax] mov rbp,QWORD[((-16))+rax] mov rbx,QWORD[((-8))+rax] mov QWORD[240+r8],r15 mov QWORD[232+r8],r14 mov QWORD[224+r8],r13 mov QWORD[216+r8],r12 mov QWORD[160+r8],rbp mov QWORD[144+r8],rbx lea rsi,[((-216))+rax] lea rdi,[512+r8] mov ecx,20 DD 0xa548f3fc $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_aesni_gcm_decrypt wrt ..imagebase DD $L$SEH_end_GFp_aesni_gcm_decrypt wrt ..imagebase DD $L$SEH_gcm_dec_info wrt ..imagebase DD $L$SEH_begin_GFp_aesni_gcm_encrypt wrt ..imagebase DD $L$SEH_end_GFp_aesni_gcm_encrypt wrt ..imagebase DD $L$SEH_GFp_gcm_enc_info wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_gcm_dec_info: DB 9,0,0,0 DD gcm_se_handler wrt ..imagebase DD $L$gcm_dec_body wrt ..imagebase,$L$gcm_dec_abort wrt ..imagebase $L$SEH_GFp_gcm_enc_info: DB 9,0,0,0 DD gcm_se_handler wrt ..imagebase DD $L$gcm_enc_body wrt ..imagebase,$L$gcm_enc_abort wrt ..imagebase ring-0.16.9/pregenerated/tmp/aesni-x86-win32n.asm000064400000000000000000000317201353224260700175520ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ;extern _GFp_ia32cap_P global _GFp_aes_hw_encrypt align 16 _GFp_aes_hw_encrypt: L$_GFp_aes_hw_encrypt_begin: mov eax,DWORD [4+esp] mov edx,DWORD [12+esp] movups xmm2,[eax] mov ecx,DWORD [240+edx] mov eax,DWORD [8+esp] movups xmm0,[edx] movups xmm1,[16+edx] lea edx,[32+edx] xorps xmm2,xmm0 L$000enc1_loop_1: db 102,15,56,220,209 dec ecx movups xmm1,[edx] lea edx,[16+edx] jnz NEAR L$000enc1_loop_1 db 102,15,56,221,209 pxor xmm0,xmm0 pxor xmm1,xmm1 movups [eax],xmm2 pxor xmm2,xmm2 ret align 16 __aesni_encrypt2: movups xmm0,[edx] shl ecx,4 movups xmm1,[16+edx] xorps xmm2,xmm0 pxor xmm3,xmm0 movups xmm0,[32+edx] lea edx,[32+ecx*1+edx] neg ecx add ecx,16 L$001enc2_loop: db 102,15,56,220,209 db 102,15,56,220,217 movups xmm1,[ecx*1+edx] add ecx,32 db 102,15,56,220,208 db 102,15,56,220,216 movups xmm0,[ecx*1+edx-16] jnz NEAR L$001enc2_loop db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,221,208 db 102,15,56,221,216 ret align 16 __aesni_encrypt3: movups xmm0,[edx] shl ecx,4 movups xmm1,[16+edx] xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 movups xmm0,[32+edx] lea edx,[32+ecx*1+edx] neg ecx add ecx,16 L$002enc3_loop: db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 movups xmm1,[ecx*1+edx] add ecx,32 db 102,15,56,220,208 db 102,15,56,220,216 db 102,15,56,220,224 movups xmm0,[ecx*1+edx-16] jnz NEAR L$002enc3_loop db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 db 102,15,56,221,208 db 102,15,56,221,216 db 102,15,56,221,224 ret align 16 __aesni_encrypt4: movups xmm0,[edx] movups xmm1,[16+edx] shl ecx,4 xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 pxor xmm5,xmm0 movups xmm0,[32+edx] lea edx,[32+ecx*1+edx] neg ecx db 15,31,64,0 add ecx,16 L$003enc4_loop: db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 db 102,15,56,220,233 movups xmm1,[ecx*1+edx] add ecx,32 db 102,15,56,220,208 db 102,15,56,220,216 db 102,15,56,220,224 db 102,15,56,220,232 movups xmm0,[ecx*1+edx-16] jnz NEAR L$003enc4_loop db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 db 102,15,56,220,233 db 102,15,56,221,208 db 102,15,56,221,216 db 102,15,56,221,224 db 102,15,56,221,232 ret align 16 __aesni_encrypt6: movups xmm0,[edx] shl ecx,4 movups xmm1,[16+edx] xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 db 102,15,56,220,209 pxor xmm5,xmm0 pxor xmm6,xmm0 db 102,15,56,220,217 lea edx,[32+ecx*1+edx] neg ecx db 102,15,56,220,225 pxor xmm7,xmm0 movups xmm0,[ecx*1+edx] add ecx,16 jmp NEAR L$004_aesni_encrypt6_inner align 16 L$005enc6_loop: db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 L$004_aesni_encrypt6_inner: db 102,15,56,220,233 db 102,15,56,220,241 db 102,15,56,220,249 L$_aesni_encrypt6_enter: movups xmm1,[ecx*1+edx] add ecx,32 db 102,15,56,220,208 db 102,15,56,220,216 db 102,15,56,220,224 db 102,15,56,220,232 db 102,15,56,220,240 db 102,15,56,220,248 movups xmm0,[ecx*1+edx-16] jnz NEAR L$005enc6_loop db 102,15,56,220,209 db 102,15,56,220,217 db 102,15,56,220,225 db 102,15,56,220,233 db 102,15,56,220,241 db 102,15,56,220,249 db 102,15,56,221,208 db 102,15,56,221,216 db 102,15,56,221,224 db 102,15,56,221,232 db 102,15,56,221,240 db 102,15,56,221,248 ret global _GFp_aes_hw_ctr32_encrypt_blocks align 16 _GFp_aes_hw_ctr32_encrypt_blocks: L$_GFp_aes_hw_ctr32_encrypt_blocks_begin: push ebp push ebx push esi push edi mov esi,DWORD [20+esp] mov edi,DWORD [24+esp] mov eax,DWORD [28+esp] mov edx,DWORD [32+esp] mov ebx,DWORD [36+esp] mov ebp,esp sub esp,88 and esp,-16 mov DWORD [80+esp],ebp cmp eax,1 je NEAR L$006ctr32_one_shortcut movdqu xmm7,[ebx] mov DWORD [esp],202182159 mov DWORD [4+esp],134810123 mov DWORD [8+esp],67438087 mov DWORD [12+esp],66051 mov ecx,6 xor ebp,ebp mov DWORD [16+esp],ecx mov DWORD [20+esp],ecx mov DWORD [24+esp],ecx mov DWORD [28+esp],ebp db 102,15,58,22,251,3 db 102,15,58,34,253,3 mov ecx,DWORD [240+edx] bswap ebx pxor xmm0,xmm0 pxor xmm1,xmm1 movdqa xmm2,[esp] db 102,15,58,34,195,0 lea ebp,[3+ebx] db 102,15,58,34,205,0 inc ebx db 102,15,58,34,195,1 inc ebp db 102,15,58,34,205,1 inc ebx db 102,15,58,34,195,2 inc ebp db 102,15,58,34,205,2 movdqa [48+esp],xmm0 db 102,15,56,0,194 movdqu xmm6,[edx] movdqa [64+esp],xmm1 db 102,15,56,0,202 pshufd xmm2,xmm0,192 pshufd xmm3,xmm0,128 cmp eax,6 jb NEAR L$007ctr32_tail pxor xmm7,xmm6 shl ecx,4 mov ebx,16 movdqa [32+esp],xmm7 mov ebp,edx sub ebx,ecx lea edx,[32+ecx*1+edx] sub eax,6 jmp NEAR L$008ctr32_loop6 align 16 L$008ctr32_loop6: pshufd xmm4,xmm0,64 movdqa xmm0,[32+esp] pshufd xmm5,xmm1,192 pxor xmm2,xmm0 pshufd xmm6,xmm1,128 pxor xmm3,xmm0 pshufd xmm7,xmm1,64 movups xmm1,[16+ebp] pxor xmm4,xmm0 pxor xmm5,xmm0 db 102,15,56,220,209 pxor xmm6,xmm0 pxor xmm7,xmm0 db 102,15,56,220,217 movups xmm0,[32+ebp] mov ecx,ebx db 102,15,56,220,225 db 102,15,56,220,233 db 102,15,56,220,241 db 102,15,56,220,249 call L$_aesni_encrypt6_enter movups xmm1,[esi] movups xmm0,[16+esi] xorps xmm2,xmm1 movups xmm1,[32+esi] xorps xmm3,xmm0 movups [edi],xmm2 movdqa xmm0,[16+esp] xorps xmm4,xmm1 movdqa xmm1,[64+esp] movups [16+edi],xmm3 movups [32+edi],xmm4 paddd xmm1,xmm0 paddd xmm0,[48+esp] movdqa xmm2,[esp] movups xmm3,[48+esi] movups xmm4,[64+esi] xorps xmm5,xmm3 movups xmm3,[80+esi] lea esi,[96+esi] movdqa [48+esp],xmm0 db 102,15,56,0,194 xorps xmm6,xmm4 movups [48+edi],xmm5 xorps xmm7,xmm3 movdqa [64+esp],xmm1 db 102,15,56,0,202 movups [64+edi],xmm6 pshufd xmm2,xmm0,192 movups [80+edi],xmm7 lea edi,[96+edi] pshufd xmm3,xmm0,128 sub eax,6 jnc NEAR L$008ctr32_loop6 add eax,6 jz NEAR L$009ctr32_ret movdqu xmm7,[ebp] mov edx,ebp pxor xmm7,[32+esp] mov ecx,DWORD [240+ebp] L$007ctr32_tail: por xmm2,xmm7 cmp eax,2 jb NEAR L$010ctr32_one pshufd xmm4,xmm0,64 por xmm3,xmm7 je NEAR L$011ctr32_two pshufd xmm5,xmm1,192 por xmm4,xmm7 cmp eax,4 jb NEAR L$012ctr32_three pshufd xmm6,xmm1,128 por xmm5,xmm7 je NEAR L$013ctr32_four por xmm6,xmm7 call __aesni_encrypt6 movups xmm1,[esi] movups xmm0,[16+esi] xorps xmm2,xmm1 movups xmm1,[32+esi] xorps xmm3,xmm0 movups xmm0,[48+esi] xorps xmm4,xmm1 movups xmm1,[64+esi] xorps xmm5,xmm0 movups [edi],xmm2 xorps xmm6,xmm1 movups [16+edi],xmm3 movups [32+edi],xmm4 movups [48+edi],xmm5 movups [64+edi],xmm6 jmp NEAR L$009ctr32_ret align 16 L$006ctr32_one_shortcut: movups xmm2,[ebx] mov ecx,DWORD [240+edx] L$010ctr32_one: movups xmm0,[edx] movups xmm1,[16+edx] lea edx,[32+edx] xorps xmm2,xmm0 L$014enc1_loop_2: db 102,15,56,220,209 dec ecx movups xmm1,[edx] lea edx,[16+edx] jnz NEAR L$014enc1_loop_2 db 102,15,56,221,209 movups xmm6,[esi] xorps xmm6,xmm2 movups [edi],xmm6 jmp NEAR L$009ctr32_ret align 16 L$011ctr32_two: call __aesni_encrypt2 movups xmm5,[esi] movups xmm6,[16+esi] xorps xmm2,xmm5 xorps xmm3,xmm6 movups [edi],xmm2 movups [16+edi],xmm3 jmp NEAR L$009ctr32_ret align 16 L$012ctr32_three: call __aesni_encrypt3 movups xmm5,[esi] movups xmm6,[16+esi] xorps xmm2,xmm5 movups xmm7,[32+esi] xorps xmm3,xmm6 movups [edi],xmm2 xorps xmm4,xmm7 movups [16+edi],xmm3 movups [32+edi],xmm4 jmp NEAR L$009ctr32_ret align 16 L$013ctr32_four: call __aesni_encrypt4 movups xmm6,[esi] movups xmm7,[16+esi] movups xmm1,[32+esi] xorps xmm2,xmm6 movups xmm0,[48+esi] xorps xmm3,xmm7 movups [edi],xmm2 xorps xmm4,xmm1 movups [16+edi],xmm3 xorps xmm5,xmm0 movups [32+edi],xmm4 movups [48+edi],xmm5 L$009ctr32_ret: pxor xmm0,xmm0 pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 movdqa [32+esp],xmm0 pxor xmm5,xmm5 movdqa [48+esp],xmm0 pxor xmm6,xmm6 movdqa [64+esp],xmm0 pxor xmm7,xmm7 mov esp,DWORD [80+esp] pop edi pop esi pop ebx pop ebp ret align 16 __aesni_set_encrypt_key: push ebp push ebx test eax,eax jz NEAR L$015bad_pointer test edx,edx jz NEAR L$015bad_pointer call L$016pic L$016pic: pop ebx lea ebx,[(L$key_const-L$016pic)+ebx] lea ebp,[_GFp_ia32cap_P] movups xmm0,[eax] xorps xmm4,xmm4 mov ebp,DWORD [4+ebp] lea edx,[16+edx] and ebp,268437504 cmp ecx,256 je NEAR L$01714rounds cmp ecx,128 jne NEAR L$018bad_keybits align 16 L$01910rounds: cmp ebp,268435456 je NEAR L$02010rounds_alt mov ecx,9 movups [edx-16],xmm0 db 102,15,58,223,200,1 call L$021key_128_cold db 102,15,58,223,200,2 call L$022key_128 db 102,15,58,223,200,4 call L$022key_128 db 102,15,58,223,200,8 call L$022key_128 db 102,15,58,223,200,16 call L$022key_128 db 102,15,58,223,200,32 call L$022key_128 db 102,15,58,223,200,64 call L$022key_128 db 102,15,58,223,200,128 call L$022key_128 db 102,15,58,223,200,27 call L$022key_128 db 102,15,58,223,200,54 call L$022key_128 movups [edx],xmm0 mov DWORD [80+edx],ecx jmp NEAR L$023good_key align 16 L$022key_128: movups [edx],xmm0 lea edx,[16+edx] L$021key_128_cold: shufps xmm4,xmm0,16 xorps xmm0,xmm4 shufps xmm4,xmm0,140 xorps xmm0,xmm4 shufps xmm1,xmm1,255 xorps xmm0,xmm1 ret align 16 L$02010rounds_alt: movdqa xmm5,[ebx] mov ecx,8 movdqa xmm4,[32+ebx] movdqa xmm2,xmm0 movdqu [edx-16],xmm0 L$024loop_key128: db 102,15,56,0,197 db 102,15,56,221,196 pslld xmm4,1 lea edx,[16+edx] movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu [edx-16],xmm0 movdqa xmm2,xmm0 dec ecx jnz NEAR L$024loop_key128 movdqa xmm4,[48+ebx] db 102,15,56,0,197 db 102,15,56,221,196 pslld xmm4,1 movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu [edx],xmm0 movdqa xmm2,xmm0 db 102,15,56,0,197 db 102,15,56,221,196 movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu [16+edx],xmm0 mov ecx,9 mov DWORD [96+edx],ecx jmp NEAR L$023good_key align 16 L$01714rounds: movups xmm2,[16+eax] lea edx,[16+edx] cmp ebp,268435456 je NEAR L$02514rounds_alt mov ecx,13 movups [edx-32],xmm0 movups [edx-16],xmm2 db 102,15,58,223,202,1 call L$026key_256a_cold db 102,15,58,223,200,1 call L$027key_256b db 102,15,58,223,202,2 call L$028key_256a db 102,15,58,223,200,2 call L$027key_256b db 102,15,58,223,202,4 call L$028key_256a db 102,15,58,223,200,4 call L$027key_256b db 102,15,58,223,202,8 call L$028key_256a db 102,15,58,223,200,8 call L$027key_256b db 102,15,58,223,202,16 call L$028key_256a db 102,15,58,223,200,16 call L$027key_256b db 102,15,58,223,202,32 call L$028key_256a db 102,15,58,223,200,32 call L$027key_256b db 102,15,58,223,202,64 call L$028key_256a movups [edx],xmm0 mov DWORD [16+edx],ecx xor eax,eax jmp NEAR L$023good_key align 16 L$028key_256a: movups [edx],xmm2 lea edx,[16+edx] L$026key_256a_cold: shufps xmm4,xmm0,16 xorps xmm0,xmm4 shufps xmm4,xmm0,140 xorps xmm0,xmm4 shufps xmm1,xmm1,255 xorps xmm0,xmm1 ret align 16 L$027key_256b: movups [edx],xmm0 lea edx,[16+edx] shufps xmm4,xmm2,16 xorps xmm2,xmm4 shufps xmm4,xmm2,140 xorps xmm2,xmm4 shufps xmm1,xmm1,170 xorps xmm2,xmm1 ret align 16 L$02514rounds_alt: movdqa xmm5,[ebx] movdqa xmm4,[32+ebx] mov ecx,7 movdqu [edx-32],xmm0 movdqa xmm1,xmm2 movdqu [edx-16],xmm2 L$029loop_key256: db 102,15,56,0,213 db 102,15,56,221,212 movdqa xmm3,xmm0 pslldq xmm0,4 pxor xmm3,xmm0 pslldq xmm0,4 pxor xmm3,xmm0 pslldq xmm0,4 pxor xmm0,xmm3 pslld xmm4,1 pxor xmm0,xmm2 movdqu [edx],xmm0 dec ecx jz NEAR L$030done_key256 pshufd xmm2,xmm0,255 pxor xmm3,xmm3 db 102,15,56,221,211 movdqa xmm3,xmm1 pslldq xmm1,4 pxor xmm3,xmm1 pslldq xmm1,4 pxor xmm3,xmm1 pslldq xmm1,4 pxor xmm1,xmm3 pxor xmm2,xmm1 movdqu [16+edx],xmm2 lea edx,[32+edx] movdqa xmm1,xmm2 jmp NEAR L$029loop_key256 L$030done_key256: mov ecx,13 mov DWORD [16+edx],ecx L$023good_key: pxor xmm0,xmm0 pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 xor eax,eax pop ebx pop ebp ret align 4 L$015bad_pointer: mov eax,-1 pop ebx pop ebp ret align 4 L$018bad_keybits: pxor xmm0,xmm0 mov eax,-2 pop ebx pop ebp ret global _GFp_aes_hw_set_encrypt_key align 16 _GFp_aes_hw_set_encrypt_key: L$_GFp_aes_hw_set_encrypt_key_begin: mov eax,DWORD [4+esp] mov ecx,DWORD [8+esp] mov edx,DWORD [12+esp] call __aesni_set_encrypt_key ret align 64 L$key_const: dd 202313229,202313229,202313229,202313229 dd 67569157,67569157,67569157,67569157 dd 1,1,1,1 dd 27,27,27,27 db 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 db 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 db 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 db 115,108,46,111,114,103,62,0 segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/aesni-x86_64-nasm.asm000064400000000000000000000606221353224260000176750ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_aes_hw_encrypt ALIGN 16 GFp_aes_hw_encrypt: movups xmm2,XMMWORD[rcx] mov eax,DWORD[240+r8] movups xmm0,XMMWORD[r8] movups xmm1,XMMWORD[16+r8] lea r8,[32+r8] xorps xmm2,xmm0 $L$oop_enc1_1: DB 102,15,56,220,209 dec eax movups xmm1,XMMWORD[r8] lea r8,[16+r8] jnz NEAR $L$oop_enc1_1 DB 102,15,56,221,209 pxor xmm0,xmm0 pxor xmm1,xmm1 movups XMMWORD[rdx],xmm2 pxor xmm2,xmm2 DB 0F3h,0C3h ;repret ALIGN 16 _aesni_encrypt2: movups xmm0,XMMWORD[rcx] shl eax,4 movups xmm1,XMMWORD[16+rcx] xorps xmm2,xmm0 xorps xmm3,xmm0 movups xmm0,XMMWORD[32+rcx] lea rcx,[32+rax*1+rcx] neg rax add rax,16 $L$enc_loop2: DB 102,15,56,220,209 DB 102,15,56,220,217 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 DB 102,15,56,220,208 DB 102,15,56,220,216 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop2 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,221,208 DB 102,15,56,221,216 DB 0F3h,0C3h ;repret ALIGN 16 _aesni_encrypt3: movups xmm0,XMMWORD[rcx] shl eax,4 movups xmm1,XMMWORD[16+rcx] xorps xmm2,xmm0 xorps xmm3,xmm0 xorps xmm4,xmm0 movups xmm0,XMMWORD[32+rcx] lea rcx,[32+rax*1+rcx] neg rax add rax,16 $L$enc_loop3: DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop3 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,221,208 DB 102,15,56,221,216 DB 102,15,56,221,224 DB 0F3h,0C3h ;repret ALIGN 16 _aesni_encrypt4: movups xmm0,XMMWORD[rcx] shl eax,4 movups xmm1,XMMWORD[16+rcx] xorps xmm2,xmm0 xorps xmm3,xmm0 xorps xmm4,xmm0 xorps xmm5,xmm0 movups xmm0,XMMWORD[32+rcx] lea rcx,[32+rax*1+rcx] neg rax DB 0x0f,0x1f,0x00 add rax,16 $L$enc_loop4: DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 DB 102,15,56,220,232 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop4 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,221,208 DB 102,15,56,221,216 DB 102,15,56,221,224 DB 102,15,56,221,232 DB 0F3h,0C3h ;repret ALIGN 16 _aesni_encrypt6: movups xmm0,XMMWORD[rcx] shl eax,4 movups xmm1,XMMWORD[16+rcx] xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 DB 102,15,56,220,209 lea rcx,[32+rax*1+rcx] neg rax DB 102,15,56,220,217 pxor xmm5,xmm0 pxor xmm6,xmm0 DB 102,15,56,220,225 pxor xmm7,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$enc_loop6_enter ALIGN 16 $L$enc_loop6: DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 $L$enc_loop6_enter: DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 DB 102,15,56,220,232 DB 102,15,56,220,240 DB 102,15,56,220,248 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop6 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,15,56,221,208 DB 102,15,56,221,216 DB 102,15,56,221,224 DB 102,15,56,221,232 DB 102,15,56,221,240 DB 102,15,56,221,248 DB 0F3h,0C3h ;repret ALIGN 16 _aesni_encrypt8: movups xmm0,XMMWORD[rcx] shl eax,4 movups xmm1,XMMWORD[16+rcx] xorps xmm2,xmm0 xorps xmm3,xmm0 pxor xmm4,xmm0 pxor xmm5,xmm0 pxor xmm6,xmm0 lea rcx,[32+rax*1+rcx] neg rax DB 102,15,56,220,209 pxor xmm7,xmm0 pxor xmm8,xmm0 DB 102,15,56,220,217 pxor xmm9,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$enc_loop8_inner ALIGN 16 $L$enc_loop8: DB 102,15,56,220,209 DB 102,15,56,220,217 $L$enc_loop8_inner: DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 $L$enc_loop8_enter: movups xmm1,XMMWORD[rax*1+rcx] add rax,32 DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 DB 102,15,56,220,232 DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop8 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 DB 102,15,56,221,208 DB 102,15,56,221,216 DB 102,15,56,221,224 DB 102,15,56,221,232 DB 102,15,56,221,240 DB 102,15,56,221,248 DB 102,68,15,56,221,192 DB 102,68,15,56,221,200 DB 0F3h,0C3h ;repret global GFp_aes_hw_ctr32_encrypt_blocks ALIGN 16 GFp_aes_hw_ctr32_encrypt_blocks: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocks: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] cmp rdx,1 jne NEAR $L$ctr32_bulk movups xmm2,XMMWORD[r8] movups xmm3,XMMWORD[rdi] mov edx,DWORD[240+rcx] movups xmm0,XMMWORD[rcx] movups xmm1,XMMWORD[16+rcx] lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_enc1_2: DB 102,15,56,220,209 dec edx movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_enc1_2 DB 102,15,56,221,209 pxor xmm0,xmm0 pxor xmm1,xmm1 xorps xmm2,xmm3 pxor xmm3,xmm3 movups XMMWORD[rsi],xmm2 xorps xmm2,xmm2 jmp NEAR $L$ctr32_epilogue ALIGN 16 $L$ctr32_bulk: lea r11,[rsp] push rbp sub rsp,288 and rsp,-16 movaps XMMWORD[(-168)+r11],xmm6 movaps XMMWORD[(-152)+r11],xmm7 movaps XMMWORD[(-136)+r11],xmm8 movaps XMMWORD[(-120)+r11],xmm9 movaps XMMWORD[(-104)+r11],xmm10 movaps XMMWORD[(-88)+r11],xmm11 movaps XMMWORD[(-72)+r11],xmm12 movaps XMMWORD[(-56)+r11],xmm13 movaps XMMWORD[(-40)+r11],xmm14 movaps XMMWORD[(-24)+r11],xmm15 $L$ctr32_body: movdqu xmm2,XMMWORD[r8] movdqu xmm0,XMMWORD[rcx] mov r8d,DWORD[12+r8] pxor xmm2,xmm0 mov ebp,DWORD[12+rcx] movdqa XMMWORD[rsp],xmm2 bswap r8d movdqa xmm3,xmm2 movdqa xmm4,xmm2 movdqa xmm5,xmm2 movdqa XMMWORD[64+rsp],xmm2 movdqa XMMWORD[80+rsp],xmm2 movdqa XMMWORD[96+rsp],xmm2 mov r10,rdx movdqa XMMWORD[112+rsp],xmm2 lea rax,[1+r8] lea rdx,[2+r8] bswap eax bswap edx xor eax,ebp xor edx,ebp DB 102,15,58,34,216,3 lea rax,[3+r8] movdqa XMMWORD[16+rsp],xmm3 DB 102,15,58,34,226,3 bswap eax mov rdx,r10 lea r10,[4+r8] movdqa XMMWORD[32+rsp],xmm4 xor eax,ebp bswap r10d DB 102,15,58,34,232,3 xor r10d,ebp movdqa XMMWORD[48+rsp],xmm5 lea r9,[5+r8] mov DWORD[((64+12))+rsp],r10d bswap r9d lea r10,[6+r8] mov eax,DWORD[240+rcx] xor r9d,ebp bswap r10d mov DWORD[((80+12))+rsp],r9d xor r10d,ebp lea r9,[7+r8] mov DWORD[((96+12))+rsp],r10d bswap r9d lea r10,[GFp_ia32cap_P] mov r10d,DWORD[4+r10] xor r9d,ebp and r10d,71303168 mov DWORD[((112+12))+rsp],r9d movups xmm1,XMMWORD[16+rcx] movdqa xmm6,XMMWORD[64+rsp] movdqa xmm7,XMMWORD[80+rsp] cmp rdx,8 jb NEAR $L$ctr32_tail sub rdx,6 cmp r10d,4194304 je NEAR $L$ctr32_6x lea rcx,[128+rcx] sub rdx,2 jmp NEAR $L$ctr32_loop8 ALIGN 16 $L$ctr32_6x: shl eax,4 mov r10d,48 bswap ebp lea rcx,[32+rax*1+rcx] sub r10,rax jmp NEAR $L$ctr32_loop6 ALIGN 16 $L$ctr32_loop6: add r8d,6 movups xmm0,XMMWORD[((-48))+r10*1+rcx] DB 102,15,56,220,209 mov eax,r8d xor eax,ebp DB 102,15,56,220,217 DB 0x0f,0x38,0xf1,0x44,0x24,12 lea eax,[1+r8] DB 102,15,56,220,225 xor eax,ebp DB 0x0f,0x38,0xf1,0x44,0x24,28 DB 102,15,56,220,233 lea eax,[2+r8] xor eax,ebp DB 102,15,56,220,241 DB 0x0f,0x38,0xf1,0x44,0x24,44 lea eax,[3+r8] DB 102,15,56,220,249 movups xmm1,XMMWORD[((-32))+r10*1+rcx] xor eax,ebp DB 102,15,56,220,208 DB 0x0f,0x38,0xf1,0x44,0x24,60 lea eax,[4+r8] DB 102,15,56,220,216 xor eax,ebp DB 0x0f,0x38,0xf1,0x44,0x24,76 DB 102,15,56,220,224 lea eax,[5+r8] xor eax,ebp DB 102,15,56,220,232 DB 0x0f,0x38,0xf1,0x44,0x24,92 mov rax,r10 DB 102,15,56,220,240 DB 102,15,56,220,248 movups xmm0,XMMWORD[((-16))+r10*1+rcx] call $L$enc_loop6 movdqu xmm8,XMMWORD[rdi] movdqu xmm9,XMMWORD[16+rdi] movdqu xmm10,XMMWORD[32+rdi] movdqu xmm11,XMMWORD[48+rdi] movdqu xmm12,XMMWORD[64+rdi] movdqu xmm13,XMMWORD[80+rdi] lea rdi,[96+rdi] movups xmm1,XMMWORD[((-64))+r10*1+rcx] pxor xmm8,xmm2 movaps xmm2,XMMWORD[rsp] pxor xmm9,xmm3 movaps xmm3,XMMWORD[16+rsp] pxor xmm10,xmm4 movaps xmm4,XMMWORD[32+rsp] pxor xmm11,xmm5 movaps xmm5,XMMWORD[48+rsp] pxor xmm12,xmm6 movaps xmm6,XMMWORD[64+rsp] pxor xmm13,xmm7 movaps xmm7,XMMWORD[80+rsp] movdqu XMMWORD[rsi],xmm8 movdqu XMMWORD[16+rsi],xmm9 movdqu XMMWORD[32+rsi],xmm10 movdqu XMMWORD[48+rsi],xmm11 movdqu XMMWORD[64+rsi],xmm12 movdqu XMMWORD[80+rsi],xmm13 lea rsi,[96+rsi] sub rdx,6 jnc NEAR $L$ctr32_loop6 add rdx,6 jz NEAR $L$ctr32_done lea eax,[((-48))+r10] lea rcx,[((-80))+r10*1+rcx] neg eax shr eax,4 jmp NEAR $L$ctr32_tail ALIGN 32 $L$ctr32_loop8: add r8d,8 movdqa xmm8,XMMWORD[96+rsp] DB 102,15,56,220,209 mov r9d,r8d movdqa xmm9,XMMWORD[112+rsp] DB 102,15,56,220,217 bswap r9d movups xmm0,XMMWORD[((32-128))+rcx] DB 102,15,56,220,225 xor r9d,ebp nop DB 102,15,56,220,233 mov DWORD[((0+12))+rsp],r9d lea r9,[1+r8] DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((48-128))+rcx] bswap r9d DB 102,15,56,220,208 DB 102,15,56,220,216 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,224 DB 102,15,56,220,232 mov DWORD[((16+12))+rsp],r9d lea r9,[2+r8] DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((64-128))+rcx] bswap r9d DB 102,15,56,220,209 DB 102,15,56,220,217 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,225 DB 102,15,56,220,233 mov DWORD[((32+12))+rsp],r9d lea r9,[3+r8] DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((80-128))+rcx] bswap r9d DB 102,15,56,220,208 DB 102,15,56,220,216 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,224 DB 102,15,56,220,232 mov DWORD[((48+12))+rsp],r9d lea r9,[4+r8] DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((96-128))+rcx] bswap r9d DB 102,15,56,220,209 DB 102,15,56,220,217 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,225 DB 102,15,56,220,233 mov DWORD[((64+12))+rsp],r9d lea r9,[5+r8] DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((112-128))+rcx] bswap r9d DB 102,15,56,220,208 DB 102,15,56,220,216 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,224 DB 102,15,56,220,232 mov DWORD[((80+12))+rsp],r9d lea r9,[6+r8] DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((128-128))+rcx] bswap r9d DB 102,15,56,220,209 DB 102,15,56,220,217 xor r9d,ebp DB 0x66,0x90 DB 102,15,56,220,225 DB 102,15,56,220,233 mov DWORD[((96+12))+rsp],r9d lea r9,[7+r8] DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((144-128))+rcx] bswap r9d DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 xor r9d,ebp movdqu xmm10,XMMWORD[rdi] DB 102,15,56,220,232 mov DWORD[((112+12))+rsp],r9d cmp eax,11 DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((160-128))+rcx] jb NEAR $L$ctr32_enc_done DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((176-128))+rcx] DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 DB 102,15,56,220,232 DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((192-128))+rcx] DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((208-128))+rcx] DB 102,15,56,220,208 DB 102,15,56,220,216 DB 102,15,56,220,224 DB 102,15,56,220,232 DB 102,15,56,220,240 DB 102,15,56,220,248 DB 102,68,15,56,220,192 DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((224-128))+rcx] jmp NEAR $L$ctr32_enc_done ALIGN 16 $L$ctr32_enc_done: movdqu xmm11,XMMWORD[16+rdi] pxor xmm10,xmm0 movdqu xmm12,XMMWORD[32+rdi] pxor xmm11,xmm0 movdqu xmm13,XMMWORD[48+rdi] pxor xmm12,xmm0 movdqu xmm14,XMMWORD[64+rdi] pxor xmm13,xmm0 movdqu xmm15,XMMWORD[80+rdi] pxor xmm14,xmm0 pxor xmm15,xmm0 DB 102,15,56,220,209 DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 DB 102,15,56,220,241 DB 102,15,56,220,249 DB 102,68,15,56,220,193 DB 102,68,15,56,220,201 movdqu xmm1,XMMWORD[96+rdi] lea rdi,[128+rdi] DB 102,65,15,56,221,210 pxor xmm1,xmm0 movdqu xmm10,XMMWORD[((112-128))+rdi] DB 102,65,15,56,221,219 pxor xmm10,xmm0 movdqa xmm11,XMMWORD[rsp] DB 102,65,15,56,221,228 DB 102,65,15,56,221,237 movdqa xmm12,XMMWORD[16+rsp] movdqa xmm13,XMMWORD[32+rsp] DB 102,65,15,56,221,246 DB 102,65,15,56,221,255 movdqa xmm14,XMMWORD[48+rsp] movdqa xmm15,XMMWORD[64+rsp] DB 102,68,15,56,221,193 movdqa xmm0,XMMWORD[80+rsp] movups xmm1,XMMWORD[((16-128))+rcx] DB 102,69,15,56,221,202 movups XMMWORD[rsi],xmm2 movdqa xmm2,xmm11 movups XMMWORD[16+rsi],xmm3 movdqa xmm3,xmm12 movups XMMWORD[32+rsi],xmm4 movdqa xmm4,xmm13 movups XMMWORD[48+rsi],xmm5 movdqa xmm5,xmm14 movups XMMWORD[64+rsi],xmm6 movdqa xmm6,xmm15 movups XMMWORD[80+rsi],xmm7 movdqa xmm7,xmm0 movups XMMWORD[96+rsi],xmm8 movups XMMWORD[112+rsi],xmm9 lea rsi,[128+rsi] sub rdx,8 jnc NEAR $L$ctr32_loop8 add rdx,8 jz NEAR $L$ctr32_done lea rcx,[((-128))+rcx] $L$ctr32_tail: lea rcx,[16+rcx] cmp rdx,4 jb NEAR $L$ctr32_loop3 je NEAR $L$ctr32_loop4 shl eax,4 movdqa xmm8,XMMWORD[96+rsp] pxor xmm9,xmm9 movups xmm0,XMMWORD[16+rcx] DB 102,15,56,220,209 DB 102,15,56,220,217 lea rcx,[((32-16))+rax*1+rcx] neg rax DB 102,15,56,220,225 add rax,16 movups xmm10,XMMWORD[rdi] DB 102,15,56,220,233 DB 102,15,56,220,241 movups xmm11,XMMWORD[16+rdi] movups xmm12,XMMWORD[32+rdi] DB 102,15,56,220,249 DB 102,68,15,56,220,193 call $L$enc_loop8_enter movdqu xmm13,XMMWORD[48+rdi] pxor xmm2,xmm10 movdqu xmm10,XMMWORD[64+rdi] pxor xmm3,xmm11 movdqu XMMWORD[rsi],xmm2 pxor xmm4,xmm12 movdqu XMMWORD[16+rsi],xmm3 pxor xmm5,xmm13 movdqu XMMWORD[32+rsi],xmm4 pxor xmm6,xmm10 movdqu XMMWORD[48+rsi],xmm5 movdqu XMMWORD[64+rsi],xmm6 cmp rdx,6 jb NEAR $L$ctr32_done movups xmm11,XMMWORD[80+rdi] xorps xmm7,xmm11 movups XMMWORD[80+rsi],xmm7 je NEAR $L$ctr32_done movups xmm12,XMMWORD[96+rdi] xorps xmm8,xmm12 movups XMMWORD[96+rsi],xmm8 jmp NEAR $L$ctr32_done ALIGN 32 $L$ctr32_loop4: DB 102,15,56,220,209 lea rcx,[16+rcx] dec eax DB 102,15,56,220,217 DB 102,15,56,220,225 DB 102,15,56,220,233 movups xmm1,XMMWORD[rcx] jnz NEAR $L$ctr32_loop4 DB 102,15,56,221,209 DB 102,15,56,221,217 movups xmm10,XMMWORD[rdi] movups xmm11,XMMWORD[16+rdi] DB 102,15,56,221,225 DB 102,15,56,221,233 movups xmm12,XMMWORD[32+rdi] movups xmm13,XMMWORD[48+rdi] xorps xmm2,xmm10 movups XMMWORD[rsi],xmm2 xorps xmm3,xmm11 movups XMMWORD[16+rsi],xmm3 pxor xmm4,xmm12 movdqu XMMWORD[32+rsi],xmm4 pxor xmm5,xmm13 movdqu XMMWORD[48+rsi],xmm5 jmp NEAR $L$ctr32_done ALIGN 32 $L$ctr32_loop3: DB 102,15,56,220,209 lea rcx,[16+rcx] dec eax DB 102,15,56,220,217 DB 102,15,56,220,225 movups xmm1,XMMWORD[rcx] jnz NEAR $L$ctr32_loop3 DB 102,15,56,221,209 DB 102,15,56,221,217 DB 102,15,56,221,225 movups xmm10,XMMWORD[rdi] xorps xmm2,xmm10 movups XMMWORD[rsi],xmm2 cmp rdx,2 jb NEAR $L$ctr32_done movups xmm11,XMMWORD[16+rdi] xorps xmm3,xmm11 movups XMMWORD[16+rsi],xmm3 je NEAR $L$ctr32_done movups xmm12,XMMWORD[32+rdi] xorps xmm4,xmm12 movups XMMWORD[32+rsi],xmm4 $L$ctr32_done: xorps xmm0,xmm0 xor ebp,ebp pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 movaps xmm6,XMMWORD[((-168))+r11] movaps XMMWORD[(-168)+r11],xmm0 movaps xmm7,XMMWORD[((-152))+r11] movaps XMMWORD[(-152)+r11],xmm0 movaps xmm8,XMMWORD[((-136))+r11] movaps XMMWORD[(-136)+r11],xmm0 movaps xmm9,XMMWORD[((-120))+r11] movaps XMMWORD[(-120)+r11],xmm0 movaps xmm10,XMMWORD[((-104))+r11] movaps XMMWORD[(-104)+r11],xmm0 movaps xmm11,XMMWORD[((-88))+r11] movaps XMMWORD[(-88)+r11],xmm0 movaps xmm12,XMMWORD[((-72))+r11] movaps XMMWORD[(-72)+r11],xmm0 movaps xmm13,XMMWORD[((-56))+r11] movaps XMMWORD[(-56)+r11],xmm0 movaps xmm14,XMMWORD[((-40))+r11] movaps XMMWORD[(-40)+r11],xmm0 movaps xmm15,XMMWORD[((-24))+r11] movaps XMMWORD[(-24)+r11],xmm0 movaps XMMWORD[rsp],xmm0 movaps XMMWORD[16+rsp],xmm0 movaps XMMWORD[32+rsp],xmm0 movaps XMMWORD[48+rsp],xmm0 movaps XMMWORD[64+rsp],xmm0 movaps XMMWORD[80+rsp],xmm0 movaps XMMWORD[96+rsp],xmm0 movaps XMMWORD[112+rsp],xmm0 mov rbp,QWORD[((-8))+r11] lea rsp,[r11] $L$ctr32_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocks: global GFp_aes_hw_set_encrypt_key ALIGN 16 GFp_aes_hw_set_encrypt_key: __aesni_set_encrypt_key: DB 0x48,0x83,0xEC,0x08 mov rax,-1 test rcx,rcx jz NEAR $L$enc_key_ret test r8,r8 jz NEAR $L$enc_key_ret movups xmm0,XMMWORD[rcx] xorps xmm4,xmm4 lea r10,[GFp_ia32cap_P] mov r10d,DWORD[4+r10] and r10d,268437504 lea rax,[16+r8] cmp edx,256 je NEAR $L$14rounds cmp edx,128 jne NEAR $L$bad_keybits $L$10rounds: mov edx,9 cmp r10d,268435456 je NEAR $L$10rounds_alt movups XMMWORD[r8],xmm0 DB 102,15,58,223,200,1 call $L$key_expansion_128_cold DB 102,15,58,223,200,2 call $L$key_expansion_128 DB 102,15,58,223,200,4 call $L$key_expansion_128 DB 102,15,58,223,200,8 call $L$key_expansion_128 DB 102,15,58,223,200,16 call $L$key_expansion_128 DB 102,15,58,223,200,32 call $L$key_expansion_128 DB 102,15,58,223,200,64 call $L$key_expansion_128 DB 102,15,58,223,200,128 call $L$key_expansion_128 DB 102,15,58,223,200,27 call $L$key_expansion_128 DB 102,15,58,223,200,54 call $L$key_expansion_128 movups XMMWORD[rax],xmm0 mov DWORD[80+rax],edx xor eax,eax jmp NEAR $L$enc_key_ret ALIGN 16 $L$10rounds_alt: movdqa xmm5,XMMWORD[$L$key_rotate] mov r10d,8 movdqa xmm4,XMMWORD[$L$key_rcon1] movdqa xmm2,xmm0 movdqu XMMWORD[r8],xmm0 jmp NEAR $L$oop_key128 ALIGN 16 $L$oop_key128: DB 102,15,56,0,197 DB 102,15,56,221,196 pslld xmm4,1 lea rax,[16+rax] movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu XMMWORD[(-16)+rax],xmm0 movdqa xmm2,xmm0 dec r10d jnz NEAR $L$oop_key128 movdqa xmm4,XMMWORD[$L$key_rcon1b] DB 102,15,56,0,197 DB 102,15,56,221,196 pslld xmm4,1 movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu XMMWORD[rax],xmm0 movdqa xmm2,xmm0 DB 102,15,56,0,197 DB 102,15,56,221,196 movdqa xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm3,xmm2 pslldq xmm2,4 pxor xmm2,xmm3 pxor xmm0,xmm2 movdqu XMMWORD[16+rax],xmm0 mov DWORD[96+rax],edx xor eax,eax jmp NEAR $L$enc_key_ret ALIGN 16 $L$14rounds: movups xmm2,XMMWORD[16+rcx] mov edx,13 lea rax,[16+rax] cmp r10d,268435456 je NEAR $L$14rounds_alt movups XMMWORD[r8],xmm0 movups XMMWORD[16+r8],xmm2 DB 102,15,58,223,202,1 call $L$key_expansion_256a_cold DB 102,15,58,223,200,1 call $L$key_expansion_256b DB 102,15,58,223,202,2 call $L$key_expansion_256a DB 102,15,58,223,200,2 call $L$key_expansion_256b DB 102,15,58,223,202,4 call $L$key_expansion_256a DB 102,15,58,223,200,4 call $L$key_expansion_256b DB 102,15,58,223,202,8 call $L$key_expansion_256a DB 102,15,58,223,200,8 call $L$key_expansion_256b DB 102,15,58,223,202,16 call $L$key_expansion_256a DB 102,15,58,223,200,16 call $L$key_expansion_256b DB 102,15,58,223,202,32 call $L$key_expansion_256a DB 102,15,58,223,200,32 call $L$key_expansion_256b DB 102,15,58,223,202,64 call $L$key_expansion_256a movups XMMWORD[rax],xmm0 mov DWORD[16+rax],edx xor rax,rax jmp NEAR $L$enc_key_ret ALIGN 16 $L$14rounds_alt: movdqa xmm5,XMMWORD[$L$key_rotate] movdqa xmm4,XMMWORD[$L$key_rcon1] mov r10d,7 movdqu XMMWORD[r8],xmm0 movdqa xmm1,xmm2 movdqu XMMWORD[16+r8],xmm2 jmp NEAR $L$oop_key256 ALIGN 16 $L$oop_key256: DB 102,15,56,0,213 DB 102,15,56,221,212 movdqa xmm3,xmm0 pslldq xmm0,4 pxor xmm3,xmm0 pslldq xmm0,4 pxor xmm3,xmm0 pslldq xmm0,4 pxor xmm0,xmm3 pslld xmm4,1 pxor xmm0,xmm2 movdqu XMMWORD[rax],xmm0 dec r10d jz NEAR $L$done_key256 pshufd xmm2,xmm0,0xff pxor xmm3,xmm3 DB 102,15,56,221,211 movdqa xmm3,xmm1 pslldq xmm1,4 pxor xmm3,xmm1 pslldq xmm1,4 pxor xmm3,xmm1 pslldq xmm1,4 pxor xmm1,xmm3 pxor xmm2,xmm1 movdqu XMMWORD[16+rax],xmm2 lea rax,[32+rax] movdqa xmm1,xmm2 jmp NEAR $L$oop_key256 $L$done_key256: mov DWORD[16+rax],edx xor eax,eax jmp NEAR $L$enc_key_ret ALIGN 16 $L$bad_keybits: mov rax,-2 $L$enc_key_ret: pxor xmm0,xmm0 pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 add rsp,8 DB 0F3h,0C3h ;repret $L$SEH_end_GFp_set_encrypt_key: ALIGN 16 $L$key_expansion_128: movups XMMWORD[rax],xmm0 lea rax,[16+rax] $L$key_expansion_128_cold: shufps xmm4,xmm0,16 xorps xmm0,xmm4 shufps xmm4,xmm0,140 xorps xmm0,xmm4 shufps xmm1,xmm1,255 xorps xmm0,xmm1 DB 0F3h,0C3h ;repret ALIGN 16 $L$key_expansion_192a: movups XMMWORD[rax],xmm0 lea rax,[16+rax] $L$key_expansion_192a_cold: movaps xmm5,xmm2 $L$key_expansion_192b_warm: shufps xmm4,xmm0,16 movdqa xmm3,xmm2 xorps xmm0,xmm4 shufps xmm4,xmm0,140 pslldq xmm3,4 xorps xmm0,xmm4 pshufd xmm1,xmm1,85 pxor xmm2,xmm3 pxor xmm0,xmm1 pshufd xmm3,xmm0,255 pxor xmm2,xmm3 DB 0F3h,0C3h ;repret ALIGN 16 $L$key_expansion_192b: movaps xmm3,xmm0 shufps xmm5,xmm0,68 movups XMMWORD[rax],xmm5 shufps xmm3,xmm2,78 movups XMMWORD[16+rax],xmm3 lea rax,[32+rax] jmp NEAR $L$key_expansion_192b_warm ALIGN 16 $L$key_expansion_256a: movups XMMWORD[rax],xmm2 lea rax,[16+rax] $L$key_expansion_256a_cold: shufps xmm4,xmm0,16 xorps xmm0,xmm4 shufps xmm4,xmm0,140 xorps xmm0,xmm4 shufps xmm1,xmm1,255 xorps xmm0,xmm1 DB 0F3h,0C3h ;repret ALIGN 16 $L$key_expansion_256b: movups XMMWORD[rax],xmm0 lea rax,[16+rax] shufps xmm4,xmm2,16 xorps xmm2,xmm4 shufps xmm4,xmm2,140 xorps xmm2,xmm4 shufps xmm1,xmm1,170 xorps xmm2,xmm1 DB 0F3h,0C3h ;repret ALIGN 64 $L$bswap_mask: DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$increment32: DD 6,6,6,0 $L$increment64: DD 1,0,0,0 $L$increment1: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 $L$key_rotate: DD 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d $L$key_rotate192: DD 0x04070605,0x04070605,0x04070605,0x04070605 $L$key_rcon1: DD 1,1,1,1 $L$key_rcon1b: DD 0x1b,0x1b,0x1b,0x1b DB 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 DB 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 DB 115,108,46,111,114,103,62,0 ALIGN 64 EXTERN __imp_RtlVirtualUnwind ALIGN 16 ctr_xts_se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov rax,QWORD[208+r8] lea rsi,[((-168))+rax] lea rdi,[512+r8] mov ecx,20 DD 0xa548f3fc mov rbp,QWORD[((-8))+rax] mov QWORD[160+r8],rbp $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocks wrt ..imagebase DD $L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocks wrt ..imagebase DD $L$SEH_info_GFp_ctr32 wrt ..imagebase DD GFp_aes_hw_set_encrypt_key wrt ..imagebase DD $L$SEH_end_GFp_set_encrypt_key wrt ..imagebase DD $L$SEH_info_GFp_key wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_ctr32: DB 9,0,0,0 DD ctr_xts_se_handler wrt ..imagebase DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase $L$SEH_info_GFp_key: DB 0x01,0x04,0x01,0x00 DB 0x04,0x02,0x00,0x00 ring-0.16.9/pregenerated/tmp/chacha-x86-win32n.asm000064400000000000000000000452421353224260700176660ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif global _GFp_ChaCha20_ctr32 align 16 _GFp_ChaCha20_ctr32: L$_GFp_ChaCha20_ctr32_begin: push ebp push ebx push esi push edi xor eax,eax cmp eax,DWORD [28+esp] je NEAR L$000no_data call L$pic_point L$pic_point: pop eax lea ebp,[_GFp_ia32cap_P] test DWORD [ebp],16777216 jz NEAR L$001x86 test DWORD [4+ebp],512 jz NEAR L$001x86 jmp NEAR L$ssse3_shortcut L$001x86: mov esi,DWORD [32+esp] mov edi,DWORD [36+esp] sub esp,132 mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [80+esp],eax mov DWORD [84+esp],ebx mov DWORD [88+esp],ecx mov DWORD [92+esp],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] mov edx,DWORD [28+esi] mov DWORD [96+esp],eax mov DWORD [100+esp],ebx mov DWORD [104+esp],ecx mov DWORD [108+esp],edx mov eax,DWORD [edi] mov ebx,DWORD [4+edi] mov ecx,DWORD [8+edi] mov edx,DWORD [12+edi] sub eax,1 mov DWORD [112+esp],eax mov DWORD [116+esp],ebx mov DWORD [120+esp],ecx mov DWORD [124+esp],edx jmp NEAR L$002entry align 16 L$003outer_loop: mov DWORD [156+esp],ebx mov DWORD [152+esp],eax mov DWORD [160+esp],ecx L$002entry: mov eax,1634760805 mov DWORD [4+esp],857760878 mov DWORD [8+esp],2036477234 mov DWORD [12+esp],1797285236 mov ebx,DWORD [84+esp] mov ebp,DWORD [88+esp] mov ecx,DWORD [104+esp] mov esi,DWORD [108+esp] mov edx,DWORD [116+esp] mov edi,DWORD [120+esp] mov DWORD [20+esp],ebx mov DWORD [24+esp],ebp mov DWORD [40+esp],ecx mov DWORD [44+esp],esi mov DWORD [52+esp],edx mov DWORD [56+esp],edi mov ebx,DWORD [92+esp] mov edi,DWORD [124+esp] mov edx,DWORD [112+esp] mov ebp,DWORD [80+esp] mov ecx,DWORD [96+esp] mov esi,DWORD [100+esp] add edx,1 mov DWORD [28+esp],ebx mov DWORD [60+esp],edi mov DWORD [112+esp],edx mov ebx,10 jmp NEAR L$004loop align 16 L$004loop: add eax,ebp mov DWORD [128+esp],ebx mov ebx,ebp xor edx,eax rol edx,16 add ecx,edx xor ebx,ecx mov edi,DWORD [52+esp] rol ebx,12 mov ebp,DWORD [20+esp] add eax,ebx xor edx,eax mov DWORD [esp],eax rol edx,8 mov eax,DWORD [4+esp] add ecx,edx mov DWORD [48+esp],edx xor ebx,ecx add eax,ebp rol ebx,7 xor edi,eax mov DWORD [32+esp],ecx rol edi,16 mov DWORD [16+esp],ebx add esi,edi mov ecx,DWORD [40+esp] xor ebp,esi mov edx,DWORD [56+esp] rol ebp,12 mov ebx,DWORD [24+esp] add eax,ebp xor edi,eax mov DWORD [4+esp],eax rol edi,8 mov eax,DWORD [8+esp] add esi,edi mov DWORD [52+esp],edi xor ebp,esi add eax,ebx rol ebp,7 xor edx,eax mov DWORD [36+esp],esi rol edx,16 mov DWORD [20+esp],ebp add ecx,edx mov esi,DWORD [44+esp] xor ebx,ecx mov edi,DWORD [60+esp] rol ebx,12 mov ebp,DWORD [28+esp] add eax,ebx xor edx,eax mov DWORD [8+esp],eax rol edx,8 mov eax,DWORD [12+esp] add ecx,edx mov DWORD [56+esp],edx xor ebx,ecx add eax,ebp rol ebx,7 xor edi,eax rol edi,16 mov DWORD [24+esp],ebx add esi,edi xor ebp,esi rol ebp,12 mov ebx,DWORD [20+esp] add eax,ebp xor edi,eax mov DWORD [12+esp],eax rol edi,8 mov eax,DWORD [esp] add esi,edi mov edx,edi xor ebp,esi add eax,ebx rol ebp,7 xor edx,eax rol edx,16 mov DWORD [28+esp],ebp add ecx,edx xor ebx,ecx mov edi,DWORD [48+esp] rol ebx,12 mov ebp,DWORD [24+esp] add eax,ebx xor edx,eax mov DWORD [esp],eax rol edx,8 mov eax,DWORD [4+esp] add ecx,edx mov DWORD [60+esp],edx xor ebx,ecx add eax,ebp rol ebx,7 xor edi,eax mov DWORD [40+esp],ecx rol edi,16 mov DWORD [20+esp],ebx add esi,edi mov ecx,DWORD [32+esp] xor ebp,esi mov edx,DWORD [52+esp] rol ebp,12 mov ebx,DWORD [28+esp] add eax,ebp xor edi,eax mov DWORD [4+esp],eax rol edi,8 mov eax,DWORD [8+esp] add esi,edi mov DWORD [48+esp],edi xor ebp,esi add eax,ebx rol ebp,7 xor edx,eax mov DWORD [44+esp],esi rol edx,16 mov DWORD [24+esp],ebp add ecx,edx mov esi,DWORD [36+esp] xor ebx,ecx mov edi,DWORD [56+esp] rol ebx,12 mov ebp,DWORD [16+esp] add eax,ebx xor edx,eax mov DWORD [8+esp],eax rol edx,8 mov eax,DWORD [12+esp] add ecx,edx mov DWORD [52+esp],edx xor ebx,ecx add eax,ebp rol ebx,7 xor edi,eax rol edi,16 mov DWORD [28+esp],ebx add esi,edi xor ebp,esi mov edx,DWORD [48+esp] rol ebp,12 mov ebx,DWORD [128+esp] add eax,ebp xor edi,eax mov DWORD [12+esp],eax rol edi,8 mov eax,DWORD [esp] add esi,edi mov DWORD [56+esp],edi xor ebp,esi rol ebp,7 dec ebx jnz NEAR L$004loop mov ebx,DWORD [160+esp] add eax,1634760805 add ebp,DWORD [80+esp] add ecx,DWORD [96+esp] add esi,DWORD [100+esp] cmp ebx,64 jb NEAR L$005tail mov ebx,DWORD [156+esp] add edx,DWORD [112+esp] add edi,DWORD [120+esp] xor eax,DWORD [ebx] xor ebp,DWORD [16+ebx] mov DWORD [esp],eax mov eax,DWORD [152+esp] xor ecx,DWORD [32+ebx] xor esi,DWORD [36+ebx] xor edx,DWORD [48+ebx] xor edi,DWORD [56+ebx] mov DWORD [16+eax],ebp mov DWORD [32+eax],ecx mov DWORD [36+eax],esi mov DWORD [48+eax],edx mov DWORD [56+eax],edi mov ebp,DWORD [4+esp] mov ecx,DWORD [8+esp] mov esi,DWORD [12+esp] mov edx,DWORD [20+esp] mov edi,DWORD [24+esp] add ebp,857760878 add ecx,2036477234 add esi,1797285236 add edx,DWORD [84+esp] add edi,DWORD [88+esp] xor ebp,DWORD [4+ebx] xor ecx,DWORD [8+ebx] xor esi,DWORD [12+ebx] xor edx,DWORD [20+ebx] xor edi,DWORD [24+ebx] mov DWORD [4+eax],ebp mov DWORD [8+eax],ecx mov DWORD [12+eax],esi mov DWORD [20+eax],edx mov DWORD [24+eax],edi mov ebp,DWORD [28+esp] mov ecx,DWORD [40+esp] mov esi,DWORD [44+esp] mov edx,DWORD [52+esp] mov edi,DWORD [60+esp] add ebp,DWORD [92+esp] add ecx,DWORD [104+esp] add esi,DWORD [108+esp] add edx,DWORD [116+esp] add edi,DWORD [124+esp] xor ebp,DWORD [28+ebx] xor ecx,DWORD [40+ebx] xor esi,DWORD [44+ebx] xor edx,DWORD [52+ebx] xor edi,DWORD [60+ebx] lea ebx,[64+ebx] mov DWORD [28+eax],ebp mov ebp,DWORD [esp] mov DWORD [40+eax],ecx mov ecx,DWORD [160+esp] mov DWORD [44+eax],esi mov DWORD [52+eax],edx mov DWORD [60+eax],edi mov DWORD [eax],ebp lea eax,[64+eax] sub ecx,64 jnz NEAR L$003outer_loop jmp NEAR L$006done L$005tail: add edx,DWORD [112+esp] add edi,DWORD [120+esp] mov DWORD [esp],eax mov DWORD [16+esp],ebp mov DWORD [32+esp],ecx mov DWORD [36+esp],esi mov DWORD [48+esp],edx mov DWORD [56+esp],edi mov ebp,DWORD [4+esp] mov ecx,DWORD [8+esp] mov esi,DWORD [12+esp] mov edx,DWORD [20+esp] mov edi,DWORD [24+esp] add ebp,857760878 add ecx,2036477234 add esi,1797285236 add edx,DWORD [84+esp] add edi,DWORD [88+esp] mov DWORD [4+esp],ebp mov DWORD [8+esp],ecx mov DWORD [12+esp],esi mov DWORD [20+esp],edx mov DWORD [24+esp],edi mov ebp,DWORD [28+esp] mov ecx,DWORD [40+esp] mov esi,DWORD [44+esp] mov edx,DWORD [52+esp] mov edi,DWORD [60+esp] add ebp,DWORD [92+esp] add ecx,DWORD [104+esp] add esi,DWORD [108+esp] add edx,DWORD [116+esp] add edi,DWORD [124+esp] mov DWORD [28+esp],ebp mov ebp,DWORD [156+esp] mov DWORD [40+esp],ecx mov ecx,DWORD [152+esp] mov DWORD [44+esp],esi xor esi,esi mov DWORD [52+esp],edx mov DWORD [60+esp],edi xor eax,eax xor edx,edx L$007tail_loop: mov al,BYTE [ebp*1+esi] mov dl,BYTE [esi*1+esp] lea esi,[1+esi] xor al,dl mov BYTE [esi*1+ecx-1],al dec ebx jnz NEAR L$007tail_loop L$006done: add esp,132 L$000no_data: pop edi pop esi pop ebx pop ebp ret align 16 __ChaCha20_ssse3: push ebp push ebx push esi push edi L$ssse3_shortcut: mov edi,DWORD [20+esp] mov esi,DWORD [24+esp] mov ecx,DWORD [28+esp] mov edx,DWORD [32+esp] mov ebx,DWORD [36+esp] mov ebp,esp sub esp,524 and esp,-64 mov DWORD [512+esp],ebp lea eax,[(L$ssse3_data-L$pic_point)+eax] movdqu xmm3,[ebx] cmp ecx,256 jb NEAR L$0081x mov DWORD [516+esp],edx mov DWORD [520+esp],ebx sub ecx,256 lea ebp,[384+esp] movdqu xmm7,[edx] pshufd xmm0,xmm3,0 pshufd xmm1,xmm3,85 pshufd xmm2,xmm3,170 pshufd xmm3,xmm3,255 paddd xmm0,[48+eax] pshufd xmm4,xmm7,0 pshufd xmm5,xmm7,85 psubd xmm0,[64+eax] pshufd xmm6,xmm7,170 pshufd xmm7,xmm7,255 movdqa [64+ebp],xmm0 movdqa [80+ebp],xmm1 movdqa [96+ebp],xmm2 movdqa [112+ebp],xmm3 movdqu xmm3,[16+edx] movdqa [ebp-64],xmm4 movdqa [ebp-48],xmm5 movdqa [ebp-32],xmm6 movdqa [ebp-16],xmm7 movdqa xmm7,[32+eax] lea ebx,[128+esp] pshufd xmm0,xmm3,0 pshufd xmm1,xmm3,85 pshufd xmm2,xmm3,170 pshufd xmm3,xmm3,255 pshufd xmm4,xmm7,0 pshufd xmm5,xmm7,85 pshufd xmm6,xmm7,170 pshufd xmm7,xmm7,255 movdqa [ebp],xmm0 movdqa [16+ebp],xmm1 movdqa [32+ebp],xmm2 movdqa [48+ebp],xmm3 movdqa [ebp-128],xmm4 movdqa [ebp-112],xmm5 movdqa [ebp-96],xmm6 movdqa [ebp-80],xmm7 lea esi,[128+esi] lea edi,[128+edi] jmp NEAR L$009outer_loop align 16 L$009outer_loop: movdqa xmm1,[ebp-112] movdqa xmm2,[ebp-96] movdqa xmm3,[ebp-80] movdqa xmm5,[ebp-48] movdqa xmm6,[ebp-32] movdqa xmm7,[ebp-16] movdqa [ebx-112],xmm1 movdqa [ebx-96],xmm2 movdqa [ebx-80],xmm3 movdqa [ebx-48],xmm5 movdqa [ebx-32],xmm6 movdqa [ebx-16],xmm7 movdqa xmm2,[32+ebp] movdqa xmm3,[48+ebp] movdqa xmm4,[64+ebp] movdqa xmm5,[80+ebp] movdqa xmm6,[96+ebp] movdqa xmm7,[112+ebp] paddd xmm4,[64+eax] movdqa [32+ebx],xmm2 movdqa [48+ebx],xmm3 movdqa [64+ebx],xmm4 movdqa [80+ebx],xmm5 movdqa [96+ebx],xmm6 movdqa [112+ebx],xmm7 movdqa [64+ebp],xmm4 movdqa xmm0,[ebp-128] movdqa xmm6,xmm4 movdqa xmm3,[ebp-64] movdqa xmm4,[ebp] movdqa xmm5,[16+ebp] mov edx,10 nop align 16 L$010loop: paddd xmm0,xmm3 movdqa xmm2,xmm3 pxor xmm6,xmm0 pshufb xmm6,[eax] paddd xmm4,xmm6 pxor xmm2,xmm4 movdqa xmm3,[ebx-48] movdqa xmm1,xmm2 pslld xmm2,12 psrld xmm1,20 por xmm2,xmm1 movdqa xmm1,[ebx-112] paddd xmm0,xmm2 movdqa xmm7,[80+ebx] pxor xmm6,xmm0 movdqa [ebx-128],xmm0 pshufb xmm6,[16+eax] paddd xmm4,xmm6 movdqa [64+ebx],xmm6 pxor xmm2,xmm4 paddd xmm1,xmm3 movdqa xmm0,xmm2 pslld xmm2,7 psrld xmm0,25 pxor xmm7,xmm1 por xmm2,xmm0 movdqa [ebx],xmm4 pshufb xmm7,[eax] movdqa [ebx-64],xmm2 paddd xmm5,xmm7 movdqa xmm4,[32+ebx] pxor xmm3,xmm5 movdqa xmm2,[ebx-32] movdqa xmm0,xmm3 pslld xmm3,12 psrld xmm0,20 por xmm3,xmm0 movdqa xmm0,[ebx-96] paddd xmm1,xmm3 movdqa xmm6,[96+ebx] pxor xmm7,xmm1 movdqa [ebx-112],xmm1 pshufb xmm7,[16+eax] paddd xmm5,xmm7 movdqa [80+ebx],xmm7 pxor xmm3,xmm5 paddd xmm0,xmm2 movdqa xmm1,xmm3 pslld xmm3,7 psrld xmm1,25 pxor xmm6,xmm0 por xmm3,xmm1 movdqa [16+ebx],xmm5 pshufb xmm6,[eax] movdqa [ebx-48],xmm3 paddd xmm4,xmm6 movdqa xmm5,[48+ebx] pxor xmm2,xmm4 movdqa xmm3,[ebx-16] movdqa xmm1,xmm2 pslld xmm2,12 psrld xmm1,20 por xmm2,xmm1 movdqa xmm1,[ebx-80] paddd xmm0,xmm2 movdqa xmm7,[112+ebx] pxor xmm6,xmm0 movdqa [ebx-96],xmm0 pshufb xmm6,[16+eax] paddd xmm4,xmm6 movdqa [96+ebx],xmm6 pxor xmm2,xmm4 paddd xmm1,xmm3 movdqa xmm0,xmm2 pslld xmm2,7 psrld xmm0,25 pxor xmm7,xmm1 por xmm2,xmm0 pshufb xmm7,[eax] movdqa [ebx-32],xmm2 paddd xmm5,xmm7 pxor xmm3,xmm5 movdqa xmm2,[ebx-48] movdqa xmm0,xmm3 pslld xmm3,12 psrld xmm0,20 por xmm3,xmm0 movdqa xmm0,[ebx-128] paddd xmm1,xmm3 pxor xmm7,xmm1 movdqa [ebx-80],xmm1 pshufb xmm7,[16+eax] paddd xmm5,xmm7 movdqa xmm6,xmm7 pxor xmm3,xmm5 paddd xmm0,xmm2 movdqa xmm1,xmm3 pslld xmm3,7 psrld xmm1,25 pxor xmm6,xmm0 por xmm3,xmm1 pshufb xmm6,[eax] movdqa [ebx-16],xmm3 paddd xmm4,xmm6 pxor xmm2,xmm4 movdqa xmm3,[ebx-32] movdqa xmm1,xmm2 pslld xmm2,12 psrld xmm1,20 por xmm2,xmm1 movdqa xmm1,[ebx-112] paddd xmm0,xmm2 movdqa xmm7,[64+ebx] pxor xmm6,xmm0 movdqa [ebx-128],xmm0 pshufb xmm6,[16+eax] paddd xmm4,xmm6 movdqa [112+ebx],xmm6 pxor xmm2,xmm4 paddd xmm1,xmm3 movdqa xmm0,xmm2 pslld xmm2,7 psrld xmm0,25 pxor xmm7,xmm1 por xmm2,xmm0 movdqa [32+ebx],xmm4 pshufb xmm7,[eax] movdqa [ebx-48],xmm2 paddd xmm5,xmm7 movdqa xmm4,[ebx] pxor xmm3,xmm5 movdqa xmm2,[ebx-16] movdqa xmm0,xmm3 pslld xmm3,12 psrld xmm0,20 por xmm3,xmm0 movdqa xmm0,[ebx-96] paddd xmm1,xmm3 movdqa xmm6,[80+ebx] pxor xmm7,xmm1 movdqa [ebx-112],xmm1 pshufb xmm7,[16+eax] paddd xmm5,xmm7 movdqa [64+ebx],xmm7 pxor xmm3,xmm5 paddd xmm0,xmm2 movdqa xmm1,xmm3 pslld xmm3,7 psrld xmm1,25 pxor xmm6,xmm0 por xmm3,xmm1 movdqa [48+ebx],xmm5 pshufb xmm6,[eax] movdqa [ebx-32],xmm3 paddd xmm4,xmm6 movdqa xmm5,[16+ebx] pxor xmm2,xmm4 movdqa xmm3,[ebx-64] movdqa xmm1,xmm2 pslld xmm2,12 psrld xmm1,20 por xmm2,xmm1 movdqa xmm1,[ebx-80] paddd xmm0,xmm2 movdqa xmm7,[96+ebx] pxor xmm6,xmm0 movdqa [ebx-96],xmm0 pshufb xmm6,[16+eax] paddd xmm4,xmm6 movdqa [80+ebx],xmm6 pxor xmm2,xmm4 paddd xmm1,xmm3 movdqa xmm0,xmm2 pslld xmm2,7 psrld xmm0,25 pxor xmm7,xmm1 por xmm2,xmm0 pshufb xmm7,[eax] movdqa [ebx-16],xmm2 paddd xmm5,xmm7 pxor xmm3,xmm5 movdqa xmm0,xmm3 pslld xmm3,12 psrld xmm0,20 por xmm3,xmm0 movdqa xmm0,[ebx-128] paddd xmm1,xmm3 movdqa xmm6,[64+ebx] pxor xmm7,xmm1 movdqa [ebx-80],xmm1 pshufb xmm7,[16+eax] paddd xmm5,xmm7 movdqa [96+ebx],xmm7 pxor xmm3,xmm5 movdqa xmm1,xmm3 pslld xmm3,7 psrld xmm1,25 por xmm3,xmm1 dec edx jnz NEAR L$010loop movdqa [ebx-64],xmm3 movdqa [ebx],xmm4 movdqa [16+ebx],xmm5 movdqa [64+ebx],xmm6 movdqa [96+ebx],xmm7 movdqa xmm1,[ebx-112] movdqa xmm2,[ebx-96] movdqa xmm3,[ebx-80] paddd xmm0,[ebp-128] paddd xmm1,[ebp-112] paddd xmm2,[ebp-96] paddd xmm3,[ebp-80] movdqa xmm6,xmm0 punpckldq xmm0,xmm1 movdqa xmm7,xmm2 punpckldq xmm2,xmm3 punpckhdq xmm6,xmm1 punpckhdq xmm7,xmm3 movdqa xmm1,xmm0 punpcklqdq xmm0,xmm2 movdqa xmm3,xmm6 punpcklqdq xmm6,xmm7 punpckhqdq xmm1,xmm2 punpckhqdq xmm3,xmm7 movdqu xmm4,[esi-128] movdqu xmm5,[esi-64] movdqu xmm2,[esi] movdqu xmm7,[64+esi] lea esi,[16+esi] pxor xmm4,xmm0 movdqa xmm0,[ebx-64] pxor xmm5,xmm1 movdqa xmm1,[ebx-48] pxor xmm6,xmm2 movdqa xmm2,[ebx-32] pxor xmm7,xmm3 movdqa xmm3,[ebx-16] movdqu [edi-128],xmm4 movdqu [edi-64],xmm5 movdqu [edi],xmm6 movdqu [64+edi],xmm7 lea edi,[16+edi] paddd xmm0,[ebp-64] paddd xmm1,[ebp-48] paddd xmm2,[ebp-32] paddd xmm3,[ebp-16] movdqa xmm6,xmm0 punpckldq xmm0,xmm1 movdqa xmm7,xmm2 punpckldq xmm2,xmm3 punpckhdq xmm6,xmm1 punpckhdq xmm7,xmm3 movdqa xmm1,xmm0 punpcklqdq xmm0,xmm2 movdqa xmm3,xmm6 punpcklqdq xmm6,xmm7 punpckhqdq xmm1,xmm2 punpckhqdq xmm3,xmm7 movdqu xmm4,[esi-128] movdqu xmm5,[esi-64] movdqu xmm2,[esi] movdqu xmm7,[64+esi] lea esi,[16+esi] pxor xmm4,xmm0 movdqa xmm0,[ebx] pxor xmm5,xmm1 movdqa xmm1,[16+ebx] pxor xmm6,xmm2 movdqa xmm2,[32+ebx] pxor xmm7,xmm3 movdqa xmm3,[48+ebx] movdqu [edi-128],xmm4 movdqu [edi-64],xmm5 movdqu [edi],xmm6 movdqu [64+edi],xmm7 lea edi,[16+edi] paddd xmm0,[ebp] paddd xmm1,[16+ebp] paddd xmm2,[32+ebp] paddd xmm3,[48+ebp] movdqa xmm6,xmm0 punpckldq xmm0,xmm1 movdqa xmm7,xmm2 punpckldq xmm2,xmm3 punpckhdq xmm6,xmm1 punpckhdq xmm7,xmm3 movdqa xmm1,xmm0 punpcklqdq xmm0,xmm2 movdqa xmm3,xmm6 punpcklqdq xmm6,xmm7 punpckhqdq xmm1,xmm2 punpckhqdq xmm3,xmm7 movdqu xmm4,[esi-128] movdqu xmm5,[esi-64] movdqu xmm2,[esi] movdqu xmm7,[64+esi] lea esi,[16+esi] pxor xmm4,xmm0 movdqa xmm0,[64+ebx] pxor xmm5,xmm1 movdqa xmm1,[80+ebx] pxor xmm6,xmm2 movdqa xmm2,[96+ebx] pxor xmm7,xmm3 movdqa xmm3,[112+ebx] movdqu [edi-128],xmm4 movdqu [edi-64],xmm5 movdqu [edi],xmm6 movdqu [64+edi],xmm7 lea edi,[16+edi] paddd xmm0,[64+ebp] paddd xmm1,[80+ebp] paddd xmm2,[96+ebp] paddd xmm3,[112+ebp] movdqa xmm6,xmm0 punpckldq xmm0,xmm1 movdqa xmm7,xmm2 punpckldq xmm2,xmm3 punpckhdq xmm6,xmm1 punpckhdq xmm7,xmm3 movdqa xmm1,xmm0 punpcklqdq xmm0,xmm2 movdqa xmm3,xmm6 punpcklqdq xmm6,xmm7 punpckhqdq xmm1,xmm2 punpckhqdq xmm3,xmm7 movdqu xmm4,[esi-128] movdqu xmm5,[esi-64] movdqu xmm2,[esi] movdqu xmm7,[64+esi] lea esi,[208+esi] pxor xmm4,xmm0 pxor xmm5,xmm1 pxor xmm6,xmm2 pxor xmm7,xmm3 movdqu [edi-128],xmm4 movdqu [edi-64],xmm5 movdqu [edi],xmm6 movdqu [64+edi],xmm7 lea edi,[208+edi] sub ecx,256 jnc NEAR L$009outer_loop add ecx,256 jz NEAR L$011done mov ebx,DWORD [520+esp] lea esi,[esi-128] mov edx,DWORD [516+esp] lea edi,[edi-128] movd xmm2,DWORD [64+ebp] movdqu xmm3,[ebx] paddd xmm2,[96+eax] pand xmm3,[112+eax] por xmm3,xmm2 L$0081x: movdqa xmm0,[32+eax] movdqu xmm1,[edx] movdqu xmm2,[16+edx] movdqa xmm6,[eax] movdqa xmm7,[16+eax] mov DWORD [48+esp],ebp movdqa [esp],xmm0 movdqa [16+esp],xmm1 movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 mov edx,10 jmp NEAR L$012loop1x align 16 L$013outer1x: movdqa xmm3,[80+eax] movdqa xmm0,[esp] movdqa xmm1,[16+esp] movdqa xmm2,[32+esp] paddd xmm3,[48+esp] mov edx,10 movdqa [48+esp],xmm3 jmp NEAR L$012loop1x align 16 L$012loop1x: paddd xmm0,xmm1 pxor xmm3,xmm0 db 102,15,56,0,222 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,20 pslld xmm4,12 por xmm1,xmm4 paddd xmm0,xmm1 pxor xmm3,xmm0 db 102,15,56,0,223 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,25 pslld xmm4,7 por xmm1,xmm4 pshufd xmm2,xmm2,78 pshufd xmm1,xmm1,57 pshufd xmm3,xmm3,147 nop paddd xmm0,xmm1 pxor xmm3,xmm0 db 102,15,56,0,222 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,20 pslld xmm4,12 por xmm1,xmm4 paddd xmm0,xmm1 pxor xmm3,xmm0 db 102,15,56,0,223 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,25 pslld xmm4,7 por xmm1,xmm4 pshufd xmm2,xmm2,78 pshufd xmm1,xmm1,147 pshufd xmm3,xmm3,57 dec edx jnz NEAR L$012loop1x paddd xmm0,[esp] paddd xmm1,[16+esp] paddd xmm2,[32+esp] paddd xmm3,[48+esp] cmp ecx,64 jb NEAR L$014tail movdqu xmm4,[esi] movdqu xmm5,[16+esi] pxor xmm0,xmm4 movdqu xmm4,[32+esi] pxor xmm1,xmm5 movdqu xmm5,[48+esi] pxor xmm2,xmm4 pxor xmm3,xmm5 lea esi,[64+esi] movdqu [edi],xmm0 movdqu [16+edi],xmm1 movdqu [32+edi],xmm2 movdqu [48+edi],xmm3 lea edi,[64+edi] sub ecx,64 jnz NEAR L$013outer1x jmp NEAR L$011done L$014tail: movdqa [esp],xmm0 movdqa [16+esp],xmm1 movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 xor eax,eax xor edx,edx xor ebp,ebp L$015tail_loop: mov al,BYTE [ebp*1+esp] mov dl,BYTE [ebp*1+esi] lea ebp,[1+ebp] xor al,dl mov BYTE [ebp*1+edi-1],al dec ecx jnz NEAR L$015tail_loop L$011done: mov esp,DWORD [512+esp] pop edi pop esi pop ebx pop ebp ret align 64 L$ssse3_data: db 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 db 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 dd 1634760805,857760878,2036477234,1797285236 dd 0,1,2,3 dd 4,4,4,4 dd 1,0,0,0 dd 4,0,0,0 dd 0,-1,-1,-1 align 64 db 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 db 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 db 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 db 114,103,62,0 segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/chacha-x86_64-nasm.asm000064400000000000000000001165321353224260100200100ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P ALIGN 64 $L$zero: DD 0,0,0,0 $L$one: DD 1,0,0,0 $L$inc: DD 0,1,2,3 $L$four: DD 4,4,4,4 $L$incy: DD 0,2,4,6,1,3,5,7 $L$eight: DD 8,8,8,8,8,8,8,8 $L$rot16: DB 0x2,0x3,0x0,0x1,0x6,0x7,0x4,0x5,0xa,0xb,0x8,0x9,0xe,0xf,0xc,0xd $L$rot24: DB 0x3,0x0,0x1,0x2,0x7,0x4,0x5,0x6,0xb,0x8,0x9,0xa,0xf,0xc,0xd,0xe $L$sigma: DB 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107 DB 0 ALIGN 64 $L$zeroz: DD 0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0 $L$fourz: DD 4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0 $L$incz: DD 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 $L$sixteen: DD 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 DB 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 DB 95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32 DB 98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115 DB 108,46,111,114,103,62,0 global GFp_ChaCha20_ctr32 ALIGN 64 GFp_ChaCha20_ctr32: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_ChaCha20_ctr32: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] cmp rdx,0 je NEAR $L$no_data mov r10,QWORD[((GFp_ia32cap_P+4))] test r10d,512 jnz NEAR $L$ChaCha20_ssse3 push rbx push rbp push r12 push r13 push r14 push r15 sub rsp,64+24 $L$ctr32_body: movdqu xmm1,XMMWORD[rcx] movdqu xmm2,XMMWORD[16+rcx] movdqu xmm3,XMMWORD[r8] movdqa xmm4,XMMWORD[$L$one] movdqa XMMWORD[16+rsp],xmm1 movdqa XMMWORD[32+rsp],xmm2 movdqa XMMWORD[48+rsp],xmm3 mov rbp,rdx jmp NEAR $L$oop_outer ALIGN 32 $L$oop_outer: mov eax,0x61707865 mov ebx,0x3320646e mov ecx,0x79622d32 mov edx,0x6b206574 mov r8d,DWORD[16+rsp] mov r9d,DWORD[20+rsp] mov r10d,DWORD[24+rsp] mov r11d,DWORD[28+rsp] movd r12d,xmm3 mov r13d,DWORD[52+rsp] mov r14d,DWORD[56+rsp] mov r15d,DWORD[60+rsp] mov QWORD[((64+0))+rsp],rbp mov ebp,10 mov QWORD[((64+8))+rsp],rsi DB 102,72,15,126,214 mov QWORD[((64+16))+rsp],rdi mov rdi,rsi shr rdi,32 jmp NEAR $L$oop ALIGN 32 $L$oop: add eax,r8d xor r12d,eax rol r12d,16 add ebx,r9d xor r13d,ebx rol r13d,16 add esi,r12d xor r8d,esi rol r8d,12 add edi,r13d xor r9d,edi rol r9d,12 add eax,r8d xor r12d,eax rol r12d,8 add ebx,r9d xor r13d,ebx rol r13d,8 add esi,r12d xor r8d,esi rol r8d,7 add edi,r13d xor r9d,edi rol r9d,7 mov DWORD[32+rsp],esi mov DWORD[36+rsp],edi mov esi,DWORD[40+rsp] mov edi,DWORD[44+rsp] add ecx,r10d xor r14d,ecx rol r14d,16 add edx,r11d xor r15d,edx rol r15d,16 add esi,r14d xor r10d,esi rol r10d,12 add edi,r15d xor r11d,edi rol r11d,12 add ecx,r10d xor r14d,ecx rol r14d,8 add edx,r11d xor r15d,edx rol r15d,8 add esi,r14d xor r10d,esi rol r10d,7 add edi,r15d xor r11d,edi rol r11d,7 add eax,r9d xor r15d,eax rol r15d,16 add ebx,r10d xor r12d,ebx rol r12d,16 add esi,r15d xor r9d,esi rol r9d,12 add edi,r12d xor r10d,edi rol r10d,12 add eax,r9d xor r15d,eax rol r15d,8 add ebx,r10d xor r12d,ebx rol r12d,8 add esi,r15d xor r9d,esi rol r9d,7 add edi,r12d xor r10d,edi rol r10d,7 mov DWORD[40+rsp],esi mov DWORD[44+rsp],edi mov esi,DWORD[32+rsp] mov edi,DWORD[36+rsp] add ecx,r11d xor r13d,ecx rol r13d,16 add edx,r8d xor r14d,edx rol r14d,16 add esi,r13d xor r11d,esi rol r11d,12 add edi,r14d xor r8d,edi rol r8d,12 add ecx,r11d xor r13d,ecx rol r13d,8 add edx,r8d xor r14d,edx rol r14d,8 add esi,r13d xor r11d,esi rol r11d,7 add edi,r14d xor r8d,edi rol r8d,7 dec ebp jnz NEAR $L$oop mov DWORD[36+rsp],edi mov DWORD[32+rsp],esi mov rbp,QWORD[64+rsp] movdqa xmm1,xmm2 mov rsi,QWORD[((64+8))+rsp] paddd xmm3,xmm4 mov rdi,QWORD[((64+16))+rsp] add eax,0x61707865 add ebx,0x3320646e add ecx,0x79622d32 add edx,0x6b206574 add r8d,DWORD[16+rsp] add r9d,DWORD[20+rsp] add r10d,DWORD[24+rsp] add r11d,DWORD[28+rsp] add r12d,DWORD[48+rsp] add r13d,DWORD[52+rsp] add r14d,DWORD[56+rsp] add r15d,DWORD[60+rsp] paddd xmm1,XMMWORD[32+rsp] cmp rbp,64 jb NEAR $L$tail xor eax,DWORD[rsi] xor ebx,DWORD[4+rsi] xor ecx,DWORD[8+rsi] xor edx,DWORD[12+rsi] xor r8d,DWORD[16+rsi] xor r9d,DWORD[20+rsi] xor r10d,DWORD[24+rsi] xor r11d,DWORD[28+rsi] movdqu xmm0,XMMWORD[32+rsi] xor r12d,DWORD[48+rsi] xor r13d,DWORD[52+rsi] xor r14d,DWORD[56+rsi] xor r15d,DWORD[60+rsi] lea rsi,[64+rsi] pxor xmm0,xmm1 movdqa XMMWORD[32+rsp],xmm2 movd DWORD[48+rsp],xmm3 mov DWORD[rdi],eax mov DWORD[4+rdi],ebx mov DWORD[8+rdi],ecx mov DWORD[12+rdi],edx mov DWORD[16+rdi],r8d mov DWORD[20+rdi],r9d mov DWORD[24+rdi],r10d mov DWORD[28+rdi],r11d movdqu XMMWORD[32+rdi],xmm0 mov DWORD[48+rdi],r12d mov DWORD[52+rdi],r13d mov DWORD[56+rdi],r14d mov DWORD[60+rdi],r15d lea rdi,[64+rdi] sub rbp,64 jnz NEAR $L$oop_outer jmp NEAR $L$done ALIGN 16 $L$tail: mov DWORD[rsp],eax mov DWORD[4+rsp],ebx xor rbx,rbx mov DWORD[8+rsp],ecx mov DWORD[12+rsp],edx mov DWORD[16+rsp],r8d mov DWORD[20+rsp],r9d mov DWORD[24+rsp],r10d mov DWORD[28+rsp],r11d movdqa XMMWORD[32+rsp],xmm1 mov DWORD[48+rsp],r12d mov DWORD[52+rsp],r13d mov DWORD[56+rsp],r14d mov DWORD[60+rsp],r15d $L$oop_tail: movzx eax,BYTE[rbx*1+rsi] movzx edx,BYTE[rbx*1+rsp] lea rbx,[1+rbx] xor eax,edx mov BYTE[((-1))+rbx*1+rdi],al dec rbp jnz NEAR $L$oop_tail $L$done: lea rsi,[((64+24+48))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$no_data: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_ChaCha20_ctr32: ALIGN 32 ChaCha20_ssse3: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_ChaCha20_ssse3: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] $L$ChaCha20_ssse3: mov r9,rsp cmp rdx,128 ja NEAR $L$ChaCha20_4x $L$do_sse3_after_all: sub rsp,64+40 movaps XMMWORD[(-40)+r9],xmm6 movaps XMMWORD[(-24)+r9],xmm7 $L$ssse3_body: movdqa xmm0,XMMWORD[$L$sigma] movdqu xmm1,XMMWORD[rcx] movdqu xmm2,XMMWORD[16+rcx] movdqu xmm3,XMMWORD[r8] movdqa xmm6,XMMWORD[$L$rot16] movdqa xmm7,XMMWORD[$L$rot24] movdqa XMMWORD[rsp],xmm0 movdqa XMMWORD[16+rsp],xmm1 movdqa XMMWORD[32+rsp],xmm2 movdqa XMMWORD[48+rsp],xmm3 mov r8,10 jmp NEAR $L$oop_ssse3 ALIGN 32 $L$oop_outer_ssse3: movdqa xmm3,XMMWORD[$L$one] movdqa xmm0,XMMWORD[rsp] movdqa xmm1,XMMWORD[16+rsp] movdqa xmm2,XMMWORD[32+rsp] paddd xmm3,XMMWORD[48+rsp] mov r8,10 movdqa XMMWORD[48+rsp],xmm3 jmp NEAR $L$oop_ssse3 ALIGN 32 $L$oop_ssse3: paddd xmm0,xmm1 pxor xmm3,xmm0 DB 102,15,56,0,222 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,20 pslld xmm4,12 por xmm1,xmm4 paddd xmm0,xmm1 pxor xmm3,xmm0 DB 102,15,56,0,223 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,25 pslld xmm4,7 por xmm1,xmm4 pshufd xmm2,xmm2,78 pshufd xmm1,xmm1,57 pshufd xmm3,xmm3,147 nop paddd xmm0,xmm1 pxor xmm3,xmm0 DB 102,15,56,0,222 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,20 pslld xmm4,12 por xmm1,xmm4 paddd xmm0,xmm1 pxor xmm3,xmm0 DB 102,15,56,0,223 paddd xmm2,xmm3 pxor xmm1,xmm2 movdqa xmm4,xmm1 psrld xmm1,25 pslld xmm4,7 por xmm1,xmm4 pshufd xmm2,xmm2,78 pshufd xmm1,xmm1,147 pshufd xmm3,xmm3,57 dec r8 jnz NEAR $L$oop_ssse3 paddd xmm0,XMMWORD[rsp] paddd xmm1,XMMWORD[16+rsp] paddd xmm2,XMMWORD[32+rsp] paddd xmm3,XMMWORD[48+rsp] cmp rdx,64 jb NEAR $L$tail_ssse3 movdqu xmm4,XMMWORD[rsi] movdqu xmm5,XMMWORD[16+rsi] pxor xmm0,xmm4 movdqu xmm4,XMMWORD[32+rsi] pxor xmm1,xmm5 movdqu xmm5,XMMWORD[48+rsi] lea rsi,[64+rsi] pxor xmm2,xmm4 pxor xmm3,xmm5 movdqu XMMWORD[rdi],xmm0 movdqu XMMWORD[16+rdi],xmm1 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm3 lea rdi,[64+rdi] sub rdx,64 jnz NEAR $L$oop_outer_ssse3 jmp NEAR $L$done_ssse3 ALIGN 16 $L$tail_ssse3: movdqa XMMWORD[rsp],xmm0 movdqa XMMWORD[16+rsp],xmm1 movdqa XMMWORD[32+rsp],xmm2 movdqa XMMWORD[48+rsp],xmm3 xor r8,r8 $L$oop_tail_ssse3: movzx eax,BYTE[r8*1+rsi] movzx ecx,BYTE[r8*1+rsp] lea r8,[1+r8] xor eax,ecx mov BYTE[((-1))+r8*1+rdi],al dec rdx jnz NEAR $L$oop_tail_ssse3 $L$done_ssse3: movaps xmm6,XMMWORD[((-40))+r9] movaps xmm7,XMMWORD[((-24))+r9] lea rsp,[r9] $L$ssse3_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_ChaCha20_ssse3: ALIGN 32 ChaCha20_4x: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_ChaCha20_4x: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] $L$ChaCha20_4x: mov r9,rsp mov r11,r10 shr r10,32 test r10,32 jnz NEAR $L$ChaCha20_8x cmp rdx,192 ja NEAR $L$proceed4x and r11,71303168 cmp r11,4194304 je NEAR $L$do_sse3_after_all $L$proceed4x: sub rsp,0x140+168 movaps XMMWORD[(-168)+r9],xmm6 movaps XMMWORD[(-152)+r9],xmm7 movaps XMMWORD[(-136)+r9],xmm8 movaps XMMWORD[(-120)+r9],xmm9 movaps XMMWORD[(-104)+r9],xmm10 movaps XMMWORD[(-88)+r9],xmm11 movaps XMMWORD[(-72)+r9],xmm12 movaps XMMWORD[(-56)+r9],xmm13 movaps XMMWORD[(-40)+r9],xmm14 movaps XMMWORD[(-24)+r9],xmm15 $L$4x_body: movdqa xmm11,XMMWORD[$L$sigma] movdqu xmm15,XMMWORD[rcx] movdqu xmm7,XMMWORD[16+rcx] movdqu xmm3,XMMWORD[r8] lea rcx,[256+rsp] lea r10,[$L$rot16] lea r11,[$L$rot24] pshufd xmm8,xmm11,0x00 pshufd xmm9,xmm11,0x55 movdqa XMMWORD[64+rsp],xmm8 pshufd xmm10,xmm11,0xaa movdqa XMMWORD[80+rsp],xmm9 pshufd xmm11,xmm11,0xff movdqa XMMWORD[96+rsp],xmm10 movdqa XMMWORD[112+rsp],xmm11 pshufd xmm12,xmm15,0x00 pshufd xmm13,xmm15,0x55 movdqa XMMWORD[(128-256)+rcx],xmm12 pshufd xmm14,xmm15,0xaa movdqa XMMWORD[(144-256)+rcx],xmm13 pshufd xmm15,xmm15,0xff movdqa XMMWORD[(160-256)+rcx],xmm14 movdqa XMMWORD[(176-256)+rcx],xmm15 pshufd xmm4,xmm7,0x00 pshufd xmm5,xmm7,0x55 movdqa XMMWORD[(192-256)+rcx],xmm4 pshufd xmm6,xmm7,0xaa movdqa XMMWORD[(208-256)+rcx],xmm5 pshufd xmm7,xmm7,0xff movdqa XMMWORD[(224-256)+rcx],xmm6 movdqa XMMWORD[(240-256)+rcx],xmm7 pshufd xmm0,xmm3,0x00 pshufd xmm1,xmm3,0x55 paddd xmm0,XMMWORD[$L$inc] pshufd xmm2,xmm3,0xaa movdqa XMMWORD[(272-256)+rcx],xmm1 pshufd xmm3,xmm3,0xff movdqa XMMWORD[(288-256)+rcx],xmm2 movdqa XMMWORD[(304-256)+rcx],xmm3 jmp NEAR $L$oop_enter4x ALIGN 32 $L$oop_outer4x: movdqa xmm8,XMMWORD[64+rsp] movdqa xmm9,XMMWORD[80+rsp] movdqa xmm10,XMMWORD[96+rsp] movdqa xmm11,XMMWORD[112+rsp] movdqa xmm12,XMMWORD[((128-256))+rcx] movdqa xmm13,XMMWORD[((144-256))+rcx] movdqa xmm14,XMMWORD[((160-256))+rcx] movdqa xmm15,XMMWORD[((176-256))+rcx] movdqa xmm4,XMMWORD[((192-256))+rcx] movdqa xmm5,XMMWORD[((208-256))+rcx] movdqa xmm6,XMMWORD[((224-256))+rcx] movdqa xmm7,XMMWORD[((240-256))+rcx] movdqa xmm0,XMMWORD[((256-256))+rcx] movdqa xmm1,XMMWORD[((272-256))+rcx] movdqa xmm2,XMMWORD[((288-256))+rcx] movdqa xmm3,XMMWORD[((304-256))+rcx] paddd xmm0,XMMWORD[$L$four] $L$oop_enter4x: movdqa XMMWORD[32+rsp],xmm6 movdqa XMMWORD[48+rsp],xmm7 movdqa xmm7,XMMWORD[r10] mov eax,10 movdqa XMMWORD[(256-256)+rcx],xmm0 jmp NEAR $L$oop4x ALIGN 32 $L$oop4x: paddd xmm8,xmm12 paddd xmm9,xmm13 pxor xmm0,xmm8 pxor xmm1,xmm9 DB 102,15,56,0,199 DB 102,15,56,0,207 paddd xmm4,xmm0 paddd xmm5,xmm1 pxor xmm12,xmm4 pxor xmm13,xmm5 movdqa xmm6,xmm12 pslld xmm12,12 psrld xmm6,20 movdqa xmm7,xmm13 pslld xmm13,12 por xmm12,xmm6 psrld xmm7,20 movdqa xmm6,XMMWORD[r11] por xmm13,xmm7 paddd xmm8,xmm12 paddd xmm9,xmm13 pxor xmm0,xmm8 pxor xmm1,xmm9 DB 102,15,56,0,198 DB 102,15,56,0,206 paddd xmm4,xmm0 paddd xmm5,xmm1 pxor xmm12,xmm4 pxor xmm13,xmm5 movdqa xmm7,xmm12 pslld xmm12,7 psrld xmm7,25 movdqa xmm6,xmm13 pslld xmm13,7 por xmm12,xmm7 psrld xmm6,25 movdqa xmm7,XMMWORD[r10] por xmm13,xmm6 movdqa XMMWORD[rsp],xmm4 movdqa XMMWORD[16+rsp],xmm5 movdqa xmm4,XMMWORD[32+rsp] movdqa xmm5,XMMWORD[48+rsp] paddd xmm10,xmm14 paddd xmm11,xmm15 pxor xmm2,xmm10 pxor xmm3,xmm11 DB 102,15,56,0,215 DB 102,15,56,0,223 paddd xmm4,xmm2 paddd xmm5,xmm3 pxor xmm14,xmm4 pxor xmm15,xmm5 movdqa xmm6,xmm14 pslld xmm14,12 psrld xmm6,20 movdqa xmm7,xmm15 pslld xmm15,12 por xmm14,xmm6 psrld xmm7,20 movdqa xmm6,XMMWORD[r11] por xmm15,xmm7 paddd xmm10,xmm14 paddd xmm11,xmm15 pxor xmm2,xmm10 pxor xmm3,xmm11 DB 102,15,56,0,214 DB 102,15,56,0,222 paddd xmm4,xmm2 paddd xmm5,xmm3 pxor xmm14,xmm4 pxor xmm15,xmm5 movdqa xmm7,xmm14 pslld xmm14,7 psrld xmm7,25 movdqa xmm6,xmm15 pslld xmm15,7 por xmm14,xmm7 psrld xmm6,25 movdqa xmm7,XMMWORD[r10] por xmm15,xmm6 paddd xmm8,xmm13 paddd xmm9,xmm14 pxor xmm3,xmm8 pxor xmm0,xmm9 DB 102,15,56,0,223 DB 102,15,56,0,199 paddd xmm4,xmm3 paddd xmm5,xmm0 pxor xmm13,xmm4 pxor xmm14,xmm5 movdqa xmm6,xmm13 pslld xmm13,12 psrld xmm6,20 movdqa xmm7,xmm14 pslld xmm14,12 por xmm13,xmm6 psrld xmm7,20 movdqa xmm6,XMMWORD[r11] por xmm14,xmm7 paddd xmm8,xmm13 paddd xmm9,xmm14 pxor xmm3,xmm8 pxor xmm0,xmm9 DB 102,15,56,0,222 DB 102,15,56,0,198 paddd xmm4,xmm3 paddd xmm5,xmm0 pxor xmm13,xmm4 pxor xmm14,xmm5 movdqa xmm7,xmm13 pslld xmm13,7 psrld xmm7,25 movdqa xmm6,xmm14 pslld xmm14,7 por xmm13,xmm7 psrld xmm6,25 movdqa xmm7,XMMWORD[r10] por xmm14,xmm6 movdqa XMMWORD[32+rsp],xmm4 movdqa XMMWORD[48+rsp],xmm5 movdqa xmm4,XMMWORD[rsp] movdqa xmm5,XMMWORD[16+rsp] paddd xmm10,xmm15 paddd xmm11,xmm12 pxor xmm1,xmm10 pxor xmm2,xmm11 DB 102,15,56,0,207 DB 102,15,56,0,215 paddd xmm4,xmm1 paddd xmm5,xmm2 pxor xmm15,xmm4 pxor xmm12,xmm5 movdqa xmm6,xmm15 pslld xmm15,12 psrld xmm6,20 movdqa xmm7,xmm12 pslld xmm12,12 por xmm15,xmm6 psrld xmm7,20 movdqa xmm6,XMMWORD[r11] por xmm12,xmm7 paddd xmm10,xmm15 paddd xmm11,xmm12 pxor xmm1,xmm10 pxor xmm2,xmm11 DB 102,15,56,0,206 DB 102,15,56,0,214 paddd xmm4,xmm1 paddd xmm5,xmm2 pxor xmm15,xmm4 pxor xmm12,xmm5 movdqa xmm7,xmm15 pslld xmm15,7 psrld xmm7,25 movdqa xmm6,xmm12 pslld xmm12,7 por xmm15,xmm7 psrld xmm6,25 movdqa xmm7,XMMWORD[r10] por xmm12,xmm6 dec eax jnz NEAR $L$oop4x paddd xmm8,XMMWORD[64+rsp] paddd xmm9,XMMWORD[80+rsp] paddd xmm10,XMMWORD[96+rsp] paddd xmm11,XMMWORD[112+rsp] movdqa xmm6,xmm8 punpckldq xmm8,xmm9 movdqa xmm7,xmm10 punpckldq xmm10,xmm11 punpckhdq xmm6,xmm9 punpckhdq xmm7,xmm11 movdqa xmm9,xmm8 punpcklqdq xmm8,xmm10 movdqa xmm11,xmm6 punpcklqdq xmm6,xmm7 punpckhqdq xmm9,xmm10 punpckhqdq xmm11,xmm7 paddd xmm12,XMMWORD[((128-256))+rcx] paddd xmm13,XMMWORD[((144-256))+rcx] paddd xmm14,XMMWORD[((160-256))+rcx] paddd xmm15,XMMWORD[((176-256))+rcx] movdqa XMMWORD[rsp],xmm8 movdqa XMMWORD[16+rsp],xmm9 movdqa xmm8,XMMWORD[32+rsp] movdqa xmm9,XMMWORD[48+rsp] movdqa xmm10,xmm12 punpckldq xmm12,xmm13 movdqa xmm7,xmm14 punpckldq xmm14,xmm15 punpckhdq xmm10,xmm13 punpckhdq xmm7,xmm15 movdqa xmm13,xmm12 punpcklqdq xmm12,xmm14 movdqa xmm15,xmm10 punpcklqdq xmm10,xmm7 punpckhqdq xmm13,xmm14 punpckhqdq xmm15,xmm7 paddd xmm4,XMMWORD[((192-256))+rcx] paddd xmm5,XMMWORD[((208-256))+rcx] paddd xmm8,XMMWORD[((224-256))+rcx] paddd xmm9,XMMWORD[((240-256))+rcx] movdqa XMMWORD[32+rsp],xmm6 movdqa XMMWORD[48+rsp],xmm11 movdqa xmm14,xmm4 punpckldq xmm4,xmm5 movdqa xmm7,xmm8 punpckldq xmm8,xmm9 punpckhdq xmm14,xmm5 punpckhdq xmm7,xmm9 movdqa xmm5,xmm4 punpcklqdq xmm4,xmm8 movdqa xmm9,xmm14 punpcklqdq xmm14,xmm7 punpckhqdq xmm5,xmm8 punpckhqdq xmm9,xmm7 paddd xmm0,XMMWORD[((256-256))+rcx] paddd xmm1,XMMWORD[((272-256))+rcx] paddd xmm2,XMMWORD[((288-256))+rcx] paddd xmm3,XMMWORD[((304-256))+rcx] movdqa xmm8,xmm0 punpckldq xmm0,xmm1 movdqa xmm7,xmm2 punpckldq xmm2,xmm3 punpckhdq xmm8,xmm1 punpckhdq xmm7,xmm3 movdqa xmm1,xmm0 punpcklqdq xmm0,xmm2 movdqa xmm3,xmm8 punpcklqdq xmm8,xmm7 punpckhqdq xmm1,xmm2 punpckhqdq xmm3,xmm7 cmp rdx,64*4 jb NEAR $L$tail4x movdqu xmm6,XMMWORD[rsi] movdqu xmm11,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[rsp] pxor xmm11,xmm12 pxor xmm2,xmm4 pxor xmm7,xmm0 movdqu XMMWORD[rdi],xmm6 movdqu xmm6,XMMWORD[64+rsi] movdqu XMMWORD[16+rdi],xmm11 movdqu xmm11,XMMWORD[80+rsi] movdqu XMMWORD[32+rdi],xmm2 movdqu xmm2,XMMWORD[96+rsi] movdqu XMMWORD[48+rdi],xmm7 movdqu xmm7,XMMWORD[112+rsi] lea rsi,[128+rsi] pxor xmm6,XMMWORD[16+rsp] pxor xmm11,xmm13 pxor xmm2,xmm5 pxor xmm7,xmm1 movdqu XMMWORD[64+rdi],xmm6 movdqu xmm6,XMMWORD[rsi] movdqu XMMWORD[80+rdi],xmm11 movdqu xmm11,XMMWORD[16+rsi] movdqu XMMWORD[96+rdi],xmm2 movdqu xmm2,XMMWORD[32+rsi] movdqu XMMWORD[112+rdi],xmm7 lea rdi,[128+rdi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[32+rsp] pxor xmm11,xmm10 pxor xmm2,xmm14 pxor xmm7,xmm8 movdqu XMMWORD[rdi],xmm6 movdqu xmm6,XMMWORD[64+rsi] movdqu XMMWORD[16+rdi],xmm11 movdqu xmm11,XMMWORD[80+rsi] movdqu XMMWORD[32+rdi],xmm2 movdqu xmm2,XMMWORD[96+rsi] movdqu XMMWORD[48+rdi],xmm7 movdqu xmm7,XMMWORD[112+rsi] lea rsi,[128+rsi] pxor xmm6,XMMWORD[48+rsp] pxor xmm11,xmm15 pxor xmm2,xmm9 pxor xmm7,xmm3 movdqu XMMWORD[64+rdi],xmm6 movdqu XMMWORD[80+rdi],xmm11 movdqu XMMWORD[96+rdi],xmm2 movdqu XMMWORD[112+rdi],xmm7 lea rdi,[128+rdi] sub rdx,64*4 jnz NEAR $L$oop_outer4x jmp NEAR $L$done4x $L$tail4x: cmp rdx,192 jae NEAR $L$192_or_more4x cmp rdx,128 jae NEAR $L$128_or_more4x cmp rdx,64 jae NEAR $L$64_or_more4x xor r10,r10 movdqa XMMWORD[16+rsp],xmm12 movdqa XMMWORD[32+rsp],xmm4 movdqa XMMWORD[48+rsp],xmm0 jmp NEAR $L$oop_tail4x ALIGN 32 $L$64_or_more4x: movdqu xmm6,XMMWORD[rsi] movdqu xmm11,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[rsp] pxor xmm11,xmm12 pxor xmm2,xmm4 pxor xmm7,xmm0 movdqu XMMWORD[rdi],xmm6 movdqu XMMWORD[16+rdi],xmm11 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm7 je NEAR $L$done4x movdqa xmm6,XMMWORD[16+rsp] lea rsi,[64+rsi] xor r10,r10 movdqa XMMWORD[rsp],xmm6 movdqa XMMWORD[16+rsp],xmm13 lea rdi,[64+rdi] movdqa XMMWORD[32+rsp],xmm5 sub rdx,64 movdqa XMMWORD[48+rsp],xmm1 jmp NEAR $L$oop_tail4x ALIGN 32 $L$128_or_more4x: movdqu xmm6,XMMWORD[rsi] movdqu xmm11,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[rsp] pxor xmm11,xmm12 pxor xmm2,xmm4 pxor xmm7,xmm0 movdqu XMMWORD[rdi],xmm6 movdqu xmm6,XMMWORD[64+rsi] movdqu XMMWORD[16+rdi],xmm11 movdqu xmm11,XMMWORD[80+rsi] movdqu XMMWORD[32+rdi],xmm2 movdqu xmm2,XMMWORD[96+rsi] movdqu XMMWORD[48+rdi],xmm7 movdqu xmm7,XMMWORD[112+rsi] pxor xmm6,XMMWORD[16+rsp] pxor xmm11,xmm13 pxor xmm2,xmm5 pxor xmm7,xmm1 movdqu XMMWORD[64+rdi],xmm6 movdqu XMMWORD[80+rdi],xmm11 movdqu XMMWORD[96+rdi],xmm2 movdqu XMMWORD[112+rdi],xmm7 je NEAR $L$done4x movdqa xmm6,XMMWORD[32+rsp] lea rsi,[128+rsi] xor r10,r10 movdqa XMMWORD[rsp],xmm6 movdqa XMMWORD[16+rsp],xmm10 lea rdi,[128+rdi] movdqa XMMWORD[32+rsp],xmm14 sub rdx,128 movdqa XMMWORD[48+rsp],xmm8 jmp NEAR $L$oop_tail4x ALIGN 32 $L$192_or_more4x: movdqu xmm6,XMMWORD[rsi] movdqu xmm11,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[rsp] pxor xmm11,xmm12 pxor xmm2,xmm4 pxor xmm7,xmm0 movdqu XMMWORD[rdi],xmm6 movdqu xmm6,XMMWORD[64+rsi] movdqu XMMWORD[16+rdi],xmm11 movdqu xmm11,XMMWORD[80+rsi] movdqu XMMWORD[32+rdi],xmm2 movdqu xmm2,XMMWORD[96+rsi] movdqu XMMWORD[48+rdi],xmm7 movdqu xmm7,XMMWORD[112+rsi] lea rsi,[128+rsi] pxor xmm6,XMMWORD[16+rsp] pxor xmm11,xmm13 pxor xmm2,xmm5 pxor xmm7,xmm1 movdqu XMMWORD[64+rdi],xmm6 movdqu xmm6,XMMWORD[rsi] movdqu XMMWORD[80+rdi],xmm11 movdqu xmm11,XMMWORD[16+rsi] movdqu XMMWORD[96+rdi],xmm2 movdqu xmm2,XMMWORD[32+rsi] movdqu XMMWORD[112+rdi],xmm7 lea rdi,[128+rdi] movdqu xmm7,XMMWORD[48+rsi] pxor xmm6,XMMWORD[32+rsp] pxor xmm11,xmm10 pxor xmm2,xmm14 pxor xmm7,xmm8 movdqu XMMWORD[rdi],xmm6 movdqu XMMWORD[16+rdi],xmm11 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm7 je NEAR $L$done4x movdqa xmm6,XMMWORD[48+rsp] lea rsi,[64+rsi] xor r10,r10 movdqa XMMWORD[rsp],xmm6 movdqa XMMWORD[16+rsp],xmm15 lea rdi,[64+rdi] movdqa XMMWORD[32+rsp],xmm9 sub rdx,192 movdqa XMMWORD[48+rsp],xmm3 $L$oop_tail4x: movzx eax,BYTE[r10*1+rsi] movzx ecx,BYTE[r10*1+rsp] lea r10,[1+r10] xor eax,ecx mov BYTE[((-1))+r10*1+rdi],al dec rdx jnz NEAR $L$oop_tail4x $L$done4x: movaps xmm6,XMMWORD[((-168))+r9] movaps xmm7,XMMWORD[((-152))+r9] movaps xmm8,XMMWORD[((-136))+r9] movaps xmm9,XMMWORD[((-120))+r9] movaps xmm10,XMMWORD[((-104))+r9] movaps xmm11,XMMWORD[((-88))+r9] movaps xmm12,XMMWORD[((-72))+r9] movaps xmm13,XMMWORD[((-56))+r9] movaps xmm14,XMMWORD[((-40))+r9] movaps xmm15,XMMWORD[((-24))+r9] lea rsp,[r9] $L$4x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_ChaCha20_4x: ALIGN 32 ChaCha20_8x: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_ChaCha20_8x: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] $L$ChaCha20_8x: mov r9,rsp sub rsp,0x280+168 and rsp,-32 movaps XMMWORD[(-168)+r9],xmm6 movaps XMMWORD[(-152)+r9],xmm7 movaps XMMWORD[(-136)+r9],xmm8 movaps XMMWORD[(-120)+r9],xmm9 movaps XMMWORD[(-104)+r9],xmm10 movaps XMMWORD[(-88)+r9],xmm11 movaps XMMWORD[(-72)+r9],xmm12 movaps XMMWORD[(-56)+r9],xmm13 movaps XMMWORD[(-40)+r9],xmm14 movaps XMMWORD[(-24)+r9],xmm15 $L$8x_body: vzeroupper vbroadcasti128 ymm11,XMMWORD[$L$sigma] vbroadcasti128 ymm3,XMMWORD[rcx] vbroadcasti128 ymm15,XMMWORD[16+rcx] vbroadcasti128 ymm7,XMMWORD[r8] lea rcx,[256+rsp] lea rax,[512+rsp] lea r10,[$L$rot16] lea r11,[$L$rot24] vpshufd ymm8,ymm11,0x00 vpshufd ymm9,ymm11,0x55 vmovdqa YMMWORD[(128-256)+rcx],ymm8 vpshufd ymm10,ymm11,0xaa vmovdqa YMMWORD[(160-256)+rcx],ymm9 vpshufd ymm11,ymm11,0xff vmovdqa YMMWORD[(192-256)+rcx],ymm10 vmovdqa YMMWORD[(224-256)+rcx],ymm11 vpshufd ymm0,ymm3,0x00 vpshufd ymm1,ymm3,0x55 vmovdqa YMMWORD[(256-256)+rcx],ymm0 vpshufd ymm2,ymm3,0xaa vmovdqa YMMWORD[(288-256)+rcx],ymm1 vpshufd ymm3,ymm3,0xff vmovdqa YMMWORD[(320-256)+rcx],ymm2 vmovdqa YMMWORD[(352-256)+rcx],ymm3 vpshufd ymm12,ymm15,0x00 vpshufd ymm13,ymm15,0x55 vmovdqa YMMWORD[(384-512)+rax],ymm12 vpshufd ymm14,ymm15,0xaa vmovdqa YMMWORD[(416-512)+rax],ymm13 vpshufd ymm15,ymm15,0xff vmovdqa YMMWORD[(448-512)+rax],ymm14 vmovdqa YMMWORD[(480-512)+rax],ymm15 vpshufd ymm4,ymm7,0x00 vpshufd ymm5,ymm7,0x55 vpaddd ymm4,ymm4,YMMWORD[$L$incy] vpshufd ymm6,ymm7,0xaa vmovdqa YMMWORD[(544-512)+rax],ymm5 vpshufd ymm7,ymm7,0xff vmovdqa YMMWORD[(576-512)+rax],ymm6 vmovdqa YMMWORD[(608-512)+rax],ymm7 jmp NEAR $L$oop_enter8x ALIGN 32 $L$oop_outer8x: vmovdqa ymm8,YMMWORD[((128-256))+rcx] vmovdqa ymm9,YMMWORD[((160-256))+rcx] vmovdqa ymm10,YMMWORD[((192-256))+rcx] vmovdqa ymm11,YMMWORD[((224-256))+rcx] vmovdqa ymm0,YMMWORD[((256-256))+rcx] vmovdqa ymm1,YMMWORD[((288-256))+rcx] vmovdqa ymm2,YMMWORD[((320-256))+rcx] vmovdqa ymm3,YMMWORD[((352-256))+rcx] vmovdqa ymm12,YMMWORD[((384-512))+rax] vmovdqa ymm13,YMMWORD[((416-512))+rax] vmovdqa ymm14,YMMWORD[((448-512))+rax] vmovdqa ymm15,YMMWORD[((480-512))+rax] vmovdqa ymm4,YMMWORD[((512-512))+rax] vmovdqa ymm5,YMMWORD[((544-512))+rax] vmovdqa ymm6,YMMWORD[((576-512))+rax] vmovdqa ymm7,YMMWORD[((608-512))+rax] vpaddd ymm4,ymm4,YMMWORD[$L$eight] $L$oop_enter8x: vmovdqa YMMWORD[64+rsp],ymm14 vmovdqa YMMWORD[96+rsp],ymm15 vbroadcasti128 ymm15,XMMWORD[r10] vmovdqa YMMWORD[(512-512)+rax],ymm4 mov eax,10 jmp NEAR $L$oop8x ALIGN 32 $L$oop8x: vpaddd ymm8,ymm8,ymm0 vpxor ymm4,ymm8,ymm4 vpshufb ymm4,ymm4,ymm15 vpaddd ymm9,ymm9,ymm1 vpxor ymm5,ymm9,ymm5 vpshufb ymm5,ymm5,ymm15 vpaddd ymm12,ymm12,ymm4 vpxor ymm0,ymm12,ymm0 vpslld ymm14,ymm0,12 vpsrld ymm0,ymm0,20 vpor ymm0,ymm14,ymm0 vbroadcasti128 ymm14,XMMWORD[r11] vpaddd ymm13,ymm13,ymm5 vpxor ymm1,ymm13,ymm1 vpslld ymm15,ymm1,12 vpsrld ymm1,ymm1,20 vpor ymm1,ymm15,ymm1 vpaddd ymm8,ymm8,ymm0 vpxor ymm4,ymm8,ymm4 vpshufb ymm4,ymm4,ymm14 vpaddd ymm9,ymm9,ymm1 vpxor ymm5,ymm9,ymm5 vpshufb ymm5,ymm5,ymm14 vpaddd ymm12,ymm12,ymm4 vpxor ymm0,ymm12,ymm0 vpslld ymm15,ymm0,7 vpsrld ymm0,ymm0,25 vpor ymm0,ymm15,ymm0 vbroadcasti128 ymm15,XMMWORD[r10] vpaddd ymm13,ymm13,ymm5 vpxor ymm1,ymm13,ymm1 vpslld ymm14,ymm1,7 vpsrld ymm1,ymm1,25 vpor ymm1,ymm14,ymm1 vmovdqa YMMWORD[rsp],ymm12 vmovdqa YMMWORD[32+rsp],ymm13 vmovdqa ymm12,YMMWORD[64+rsp] vmovdqa ymm13,YMMWORD[96+rsp] vpaddd ymm10,ymm10,ymm2 vpxor ymm6,ymm10,ymm6 vpshufb ymm6,ymm6,ymm15 vpaddd ymm11,ymm11,ymm3 vpxor ymm7,ymm11,ymm7 vpshufb ymm7,ymm7,ymm15 vpaddd ymm12,ymm12,ymm6 vpxor ymm2,ymm12,ymm2 vpslld ymm14,ymm2,12 vpsrld ymm2,ymm2,20 vpor ymm2,ymm14,ymm2 vbroadcasti128 ymm14,XMMWORD[r11] vpaddd ymm13,ymm13,ymm7 vpxor ymm3,ymm13,ymm3 vpslld ymm15,ymm3,12 vpsrld ymm3,ymm3,20 vpor ymm3,ymm15,ymm3 vpaddd ymm10,ymm10,ymm2 vpxor ymm6,ymm10,ymm6 vpshufb ymm6,ymm6,ymm14 vpaddd ymm11,ymm11,ymm3 vpxor ymm7,ymm11,ymm7 vpshufb ymm7,ymm7,ymm14 vpaddd ymm12,ymm12,ymm6 vpxor ymm2,ymm12,ymm2 vpslld ymm15,ymm2,7 vpsrld ymm2,ymm2,25 vpor ymm2,ymm15,ymm2 vbroadcasti128 ymm15,XMMWORD[r10] vpaddd ymm13,ymm13,ymm7 vpxor ymm3,ymm13,ymm3 vpslld ymm14,ymm3,7 vpsrld ymm3,ymm3,25 vpor ymm3,ymm14,ymm3 vpaddd ymm8,ymm8,ymm1 vpxor ymm7,ymm8,ymm7 vpshufb ymm7,ymm7,ymm15 vpaddd ymm9,ymm9,ymm2 vpxor ymm4,ymm9,ymm4 vpshufb ymm4,ymm4,ymm15 vpaddd ymm12,ymm12,ymm7 vpxor ymm1,ymm12,ymm1 vpslld ymm14,ymm1,12 vpsrld ymm1,ymm1,20 vpor ymm1,ymm14,ymm1 vbroadcasti128 ymm14,XMMWORD[r11] vpaddd ymm13,ymm13,ymm4 vpxor ymm2,ymm13,ymm2 vpslld ymm15,ymm2,12 vpsrld ymm2,ymm2,20 vpor ymm2,ymm15,ymm2 vpaddd ymm8,ymm8,ymm1 vpxor ymm7,ymm8,ymm7 vpshufb ymm7,ymm7,ymm14 vpaddd ymm9,ymm9,ymm2 vpxor ymm4,ymm9,ymm4 vpshufb ymm4,ymm4,ymm14 vpaddd ymm12,ymm12,ymm7 vpxor ymm1,ymm12,ymm1 vpslld ymm15,ymm1,7 vpsrld ymm1,ymm1,25 vpor ymm1,ymm15,ymm1 vbroadcasti128 ymm15,XMMWORD[r10] vpaddd ymm13,ymm13,ymm4 vpxor ymm2,ymm13,ymm2 vpslld ymm14,ymm2,7 vpsrld ymm2,ymm2,25 vpor ymm2,ymm14,ymm2 vmovdqa YMMWORD[64+rsp],ymm12 vmovdqa YMMWORD[96+rsp],ymm13 vmovdqa ymm12,YMMWORD[rsp] vmovdqa ymm13,YMMWORD[32+rsp] vpaddd ymm10,ymm10,ymm3 vpxor ymm5,ymm10,ymm5 vpshufb ymm5,ymm5,ymm15 vpaddd ymm11,ymm11,ymm0 vpxor ymm6,ymm11,ymm6 vpshufb ymm6,ymm6,ymm15 vpaddd ymm12,ymm12,ymm5 vpxor ymm3,ymm12,ymm3 vpslld ymm14,ymm3,12 vpsrld ymm3,ymm3,20 vpor ymm3,ymm14,ymm3 vbroadcasti128 ymm14,XMMWORD[r11] vpaddd ymm13,ymm13,ymm6 vpxor ymm0,ymm13,ymm0 vpslld ymm15,ymm0,12 vpsrld ymm0,ymm0,20 vpor ymm0,ymm15,ymm0 vpaddd ymm10,ymm10,ymm3 vpxor ymm5,ymm10,ymm5 vpshufb ymm5,ymm5,ymm14 vpaddd ymm11,ymm11,ymm0 vpxor ymm6,ymm11,ymm6 vpshufb ymm6,ymm6,ymm14 vpaddd ymm12,ymm12,ymm5 vpxor ymm3,ymm12,ymm3 vpslld ymm15,ymm3,7 vpsrld ymm3,ymm3,25 vpor ymm3,ymm15,ymm3 vbroadcasti128 ymm15,XMMWORD[r10] vpaddd ymm13,ymm13,ymm6 vpxor ymm0,ymm13,ymm0 vpslld ymm14,ymm0,7 vpsrld ymm0,ymm0,25 vpor ymm0,ymm14,ymm0 dec eax jnz NEAR $L$oop8x lea rax,[512+rsp] vpaddd ymm8,ymm8,YMMWORD[((128-256))+rcx] vpaddd ymm9,ymm9,YMMWORD[((160-256))+rcx] vpaddd ymm10,ymm10,YMMWORD[((192-256))+rcx] vpaddd ymm11,ymm11,YMMWORD[((224-256))+rcx] vpunpckldq ymm14,ymm8,ymm9 vpunpckldq ymm15,ymm10,ymm11 vpunpckhdq ymm8,ymm8,ymm9 vpunpckhdq ymm10,ymm10,ymm11 vpunpcklqdq ymm9,ymm14,ymm15 vpunpckhqdq ymm14,ymm14,ymm15 vpunpcklqdq ymm11,ymm8,ymm10 vpunpckhqdq ymm8,ymm8,ymm10 vpaddd ymm0,ymm0,YMMWORD[((256-256))+rcx] vpaddd ymm1,ymm1,YMMWORD[((288-256))+rcx] vpaddd ymm2,ymm2,YMMWORD[((320-256))+rcx] vpaddd ymm3,ymm3,YMMWORD[((352-256))+rcx] vpunpckldq ymm10,ymm0,ymm1 vpunpckldq ymm15,ymm2,ymm3 vpunpckhdq ymm0,ymm0,ymm1 vpunpckhdq ymm2,ymm2,ymm3 vpunpcklqdq ymm1,ymm10,ymm15 vpunpckhqdq ymm10,ymm10,ymm15 vpunpcklqdq ymm3,ymm0,ymm2 vpunpckhqdq ymm0,ymm0,ymm2 vperm2i128 ymm15,ymm9,ymm1,0x20 vperm2i128 ymm1,ymm9,ymm1,0x31 vperm2i128 ymm9,ymm14,ymm10,0x20 vperm2i128 ymm10,ymm14,ymm10,0x31 vperm2i128 ymm14,ymm11,ymm3,0x20 vperm2i128 ymm3,ymm11,ymm3,0x31 vperm2i128 ymm11,ymm8,ymm0,0x20 vperm2i128 ymm0,ymm8,ymm0,0x31 vmovdqa YMMWORD[rsp],ymm15 vmovdqa YMMWORD[32+rsp],ymm9 vmovdqa ymm15,YMMWORD[64+rsp] vmovdqa ymm9,YMMWORD[96+rsp] vpaddd ymm12,ymm12,YMMWORD[((384-512))+rax] vpaddd ymm13,ymm13,YMMWORD[((416-512))+rax] vpaddd ymm15,ymm15,YMMWORD[((448-512))+rax] vpaddd ymm9,ymm9,YMMWORD[((480-512))+rax] vpunpckldq ymm2,ymm12,ymm13 vpunpckldq ymm8,ymm15,ymm9 vpunpckhdq ymm12,ymm12,ymm13 vpunpckhdq ymm15,ymm15,ymm9 vpunpcklqdq ymm13,ymm2,ymm8 vpunpckhqdq ymm2,ymm2,ymm8 vpunpcklqdq ymm9,ymm12,ymm15 vpunpckhqdq ymm12,ymm12,ymm15 vpaddd ymm4,ymm4,YMMWORD[((512-512))+rax] vpaddd ymm5,ymm5,YMMWORD[((544-512))+rax] vpaddd ymm6,ymm6,YMMWORD[((576-512))+rax] vpaddd ymm7,ymm7,YMMWORD[((608-512))+rax] vpunpckldq ymm15,ymm4,ymm5 vpunpckldq ymm8,ymm6,ymm7 vpunpckhdq ymm4,ymm4,ymm5 vpunpckhdq ymm6,ymm6,ymm7 vpunpcklqdq ymm5,ymm15,ymm8 vpunpckhqdq ymm15,ymm15,ymm8 vpunpcklqdq ymm7,ymm4,ymm6 vpunpckhqdq ymm4,ymm4,ymm6 vperm2i128 ymm8,ymm13,ymm5,0x20 vperm2i128 ymm5,ymm13,ymm5,0x31 vperm2i128 ymm13,ymm2,ymm15,0x20 vperm2i128 ymm15,ymm2,ymm15,0x31 vperm2i128 ymm2,ymm9,ymm7,0x20 vperm2i128 ymm7,ymm9,ymm7,0x31 vperm2i128 ymm9,ymm12,ymm4,0x20 vperm2i128 ymm4,ymm12,ymm4,0x31 vmovdqa ymm6,YMMWORD[rsp] vmovdqa ymm12,YMMWORD[32+rsp] cmp rdx,64*8 jb NEAR $L$tail8x vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] lea rsi,[128+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 lea rdi,[128+rdi] vpxor ymm12,ymm12,YMMWORD[rsi] vpxor ymm13,ymm13,YMMWORD[32+rsi] vpxor ymm10,ymm10,YMMWORD[64+rsi] vpxor ymm15,ymm15,YMMWORD[96+rsi] lea rsi,[128+rsi] vmovdqu YMMWORD[rdi],ymm12 vmovdqu YMMWORD[32+rdi],ymm13 vmovdqu YMMWORD[64+rdi],ymm10 vmovdqu YMMWORD[96+rdi],ymm15 lea rdi,[128+rdi] vpxor ymm14,ymm14,YMMWORD[rsi] vpxor ymm2,ymm2,YMMWORD[32+rsi] vpxor ymm3,ymm3,YMMWORD[64+rsi] vpxor ymm7,ymm7,YMMWORD[96+rsi] lea rsi,[128+rsi] vmovdqu YMMWORD[rdi],ymm14 vmovdqu YMMWORD[32+rdi],ymm2 vmovdqu YMMWORD[64+rdi],ymm3 vmovdqu YMMWORD[96+rdi],ymm7 lea rdi,[128+rdi] vpxor ymm11,ymm11,YMMWORD[rsi] vpxor ymm9,ymm9,YMMWORD[32+rsi] vpxor ymm0,ymm0,YMMWORD[64+rsi] vpxor ymm4,ymm4,YMMWORD[96+rsi] lea rsi,[128+rsi] vmovdqu YMMWORD[rdi],ymm11 vmovdqu YMMWORD[32+rdi],ymm9 vmovdqu YMMWORD[64+rdi],ymm0 vmovdqu YMMWORD[96+rdi],ymm4 lea rdi,[128+rdi] sub rdx,64*8 jnz NEAR $L$oop_outer8x jmp NEAR $L$done8x $L$tail8x: cmp rdx,448 jae NEAR $L$448_or_more8x cmp rdx,384 jae NEAR $L$384_or_more8x cmp rdx,320 jae NEAR $L$320_or_more8x cmp rdx,256 jae NEAR $L$256_or_more8x cmp rdx,192 jae NEAR $L$192_or_more8x cmp rdx,128 jae NEAR $L$128_or_more8x cmp rdx,64 jae NEAR $L$64_or_more8x xor r10,r10 vmovdqa YMMWORD[rsp],ymm6 vmovdqa YMMWORD[32+rsp],ymm8 jmp NEAR $L$oop_tail8x ALIGN 32 $L$64_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 je NEAR $L$done8x lea rsi,[64+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm1 lea rdi,[64+rdi] sub rdx,64 vmovdqa YMMWORD[32+rsp],ymm5 jmp NEAR $L$oop_tail8x ALIGN 32 $L$128_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 je NEAR $L$done8x lea rsi,[128+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm12 lea rdi,[128+rdi] sub rdx,128 vmovdqa YMMWORD[32+rsp],ymm13 jmp NEAR $L$oop_tail8x ALIGN 32 $L$192_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vpxor ymm12,ymm12,YMMWORD[128+rsi] vpxor ymm13,ymm13,YMMWORD[160+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 vmovdqu YMMWORD[128+rdi],ymm12 vmovdqu YMMWORD[160+rdi],ymm13 je NEAR $L$done8x lea rsi,[192+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm10 lea rdi,[192+rdi] sub rdx,192 vmovdqa YMMWORD[32+rsp],ymm15 jmp NEAR $L$oop_tail8x ALIGN 32 $L$256_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vpxor ymm12,ymm12,YMMWORD[128+rsi] vpxor ymm13,ymm13,YMMWORD[160+rsi] vpxor ymm10,ymm10,YMMWORD[192+rsi] vpxor ymm15,ymm15,YMMWORD[224+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 vmovdqu YMMWORD[128+rdi],ymm12 vmovdqu YMMWORD[160+rdi],ymm13 vmovdqu YMMWORD[192+rdi],ymm10 vmovdqu YMMWORD[224+rdi],ymm15 je NEAR $L$done8x lea rsi,[256+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm14 lea rdi,[256+rdi] sub rdx,256 vmovdqa YMMWORD[32+rsp],ymm2 jmp NEAR $L$oop_tail8x ALIGN 32 $L$320_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vpxor ymm12,ymm12,YMMWORD[128+rsi] vpxor ymm13,ymm13,YMMWORD[160+rsi] vpxor ymm10,ymm10,YMMWORD[192+rsi] vpxor ymm15,ymm15,YMMWORD[224+rsi] vpxor ymm14,ymm14,YMMWORD[256+rsi] vpxor ymm2,ymm2,YMMWORD[288+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 vmovdqu YMMWORD[128+rdi],ymm12 vmovdqu YMMWORD[160+rdi],ymm13 vmovdqu YMMWORD[192+rdi],ymm10 vmovdqu YMMWORD[224+rdi],ymm15 vmovdqu YMMWORD[256+rdi],ymm14 vmovdqu YMMWORD[288+rdi],ymm2 je NEAR $L$done8x lea rsi,[320+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm3 lea rdi,[320+rdi] sub rdx,320 vmovdqa YMMWORD[32+rsp],ymm7 jmp NEAR $L$oop_tail8x ALIGN 32 $L$384_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vpxor ymm12,ymm12,YMMWORD[128+rsi] vpxor ymm13,ymm13,YMMWORD[160+rsi] vpxor ymm10,ymm10,YMMWORD[192+rsi] vpxor ymm15,ymm15,YMMWORD[224+rsi] vpxor ymm14,ymm14,YMMWORD[256+rsi] vpxor ymm2,ymm2,YMMWORD[288+rsi] vpxor ymm3,ymm3,YMMWORD[320+rsi] vpxor ymm7,ymm7,YMMWORD[352+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 vmovdqu YMMWORD[128+rdi],ymm12 vmovdqu YMMWORD[160+rdi],ymm13 vmovdqu YMMWORD[192+rdi],ymm10 vmovdqu YMMWORD[224+rdi],ymm15 vmovdqu YMMWORD[256+rdi],ymm14 vmovdqu YMMWORD[288+rdi],ymm2 vmovdqu YMMWORD[320+rdi],ymm3 vmovdqu YMMWORD[352+rdi],ymm7 je NEAR $L$done8x lea rsi,[384+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm11 lea rdi,[384+rdi] sub rdx,384 vmovdqa YMMWORD[32+rsp],ymm9 jmp NEAR $L$oop_tail8x ALIGN 32 $L$448_or_more8x: vpxor ymm6,ymm6,YMMWORD[rsi] vpxor ymm8,ymm8,YMMWORD[32+rsi] vpxor ymm1,ymm1,YMMWORD[64+rsi] vpxor ymm5,ymm5,YMMWORD[96+rsi] vpxor ymm12,ymm12,YMMWORD[128+rsi] vpxor ymm13,ymm13,YMMWORD[160+rsi] vpxor ymm10,ymm10,YMMWORD[192+rsi] vpxor ymm15,ymm15,YMMWORD[224+rsi] vpxor ymm14,ymm14,YMMWORD[256+rsi] vpxor ymm2,ymm2,YMMWORD[288+rsi] vpxor ymm3,ymm3,YMMWORD[320+rsi] vpxor ymm7,ymm7,YMMWORD[352+rsi] vpxor ymm11,ymm11,YMMWORD[384+rsi] vpxor ymm9,ymm9,YMMWORD[416+rsi] vmovdqu YMMWORD[rdi],ymm6 vmovdqu YMMWORD[32+rdi],ymm8 vmovdqu YMMWORD[64+rdi],ymm1 vmovdqu YMMWORD[96+rdi],ymm5 vmovdqu YMMWORD[128+rdi],ymm12 vmovdqu YMMWORD[160+rdi],ymm13 vmovdqu YMMWORD[192+rdi],ymm10 vmovdqu YMMWORD[224+rdi],ymm15 vmovdqu YMMWORD[256+rdi],ymm14 vmovdqu YMMWORD[288+rdi],ymm2 vmovdqu YMMWORD[320+rdi],ymm3 vmovdqu YMMWORD[352+rdi],ymm7 vmovdqu YMMWORD[384+rdi],ymm11 vmovdqu YMMWORD[416+rdi],ymm9 je NEAR $L$done8x lea rsi,[448+rsi] xor r10,r10 vmovdqa YMMWORD[rsp],ymm0 lea rdi,[448+rdi] sub rdx,448 vmovdqa YMMWORD[32+rsp],ymm4 $L$oop_tail8x: movzx eax,BYTE[r10*1+rsi] movzx ecx,BYTE[r10*1+rsp] lea r10,[1+r10] xor eax,ecx mov BYTE[((-1))+r10*1+rdi],al dec rdx jnz NEAR $L$oop_tail8x $L$done8x: vzeroall movaps xmm6,XMMWORD[((-168))+r9] movaps xmm7,XMMWORD[((-152))+r9] movaps xmm8,XMMWORD[((-136))+r9] movaps xmm9,XMMWORD[((-120))+r9] movaps xmm10,XMMWORD[((-104))+r9] movaps xmm11,XMMWORD[((-88))+r9] movaps xmm12,XMMWORD[((-72))+r9] movaps xmm13,XMMWORD[((-56))+r9] movaps xmm14,XMMWORD[((-40))+r9] movaps xmm15,XMMWORD[((-24))+r9] lea rsp,[r9] $L$8x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_ChaCha20_8x: EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] lea r10,[$L$ctr32_body] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] lea r10,[$L$no_data] cmp rbx,r10 jae NEAR $L$common_seh_tail lea rax,[((64+24+48))+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret ALIGN 16 ssse3_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[192+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail lea rsi,[((-40))+rax] lea rdi,[512+r8] mov ecx,4 DD 0xa548f3fc jmp NEAR $L$common_seh_tail ALIGN 16 full_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[192+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail lea rsi,[((-168))+rax] lea rdi,[512+r8] mov ecx,20 DD 0xa548f3fc jmp NEAR $L$common_seh_tail section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_ChaCha20_ctr32 wrt ..imagebase DD $L$SEH_end_GFp_ChaCha20_ctr32 wrt ..imagebase DD $L$SEH_info_GFp_ChaCha20_ctr32 wrt ..imagebase DD $L$SEH_begin_ChaCha20_ssse3 wrt ..imagebase DD $L$SEH_end_ChaCha20_ssse3 wrt ..imagebase DD $L$SEH_info_ChaCha20_ssse3 wrt ..imagebase DD $L$SEH_begin_ChaCha20_4x wrt ..imagebase DD $L$SEH_end_ChaCha20_4x wrt ..imagebase DD $L$SEH_info_ChaCha20_4x wrt ..imagebase DD $L$SEH_begin_ChaCha20_8x wrt ..imagebase DD $L$SEH_end_ChaCha20_8x wrt ..imagebase DD $L$SEH_info_ChaCha20_8x wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_ChaCha20_ctr32: DB 9,0,0,0 DD se_handler wrt ..imagebase $L$SEH_info_ChaCha20_ssse3: DB 9,0,0,0 DD ssse3_handler wrt ..imagebase DD $L$ssse3_body wrt ..imagebase,$L$ssse3_epilogue wrt ..imagebase $L$SEH_info_ChaCha20_4x: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$4x_body wrt ..imagebase,$L$4x_epilogue wrt ..imagebase $L$SEH_info_ChaCha20_8x: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$8x_body wrt ..imagebase,$L$8x_epilogue wrt ..imagebase ring-0.16.9/pregenerated/tmp/ecp_nistz256-x86-win32n.asm000064400000000000000000000512531353224260700207110ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ;extern _GFp_ia32cap_P L$ONE_mont: dd 1,0,0,-1,-1,-1,-2,0 align 16 __ecp_nistz256_div_by_2: mov ebp,DWORD [esi] xor edx,edx mov ebx,DWORD [4+esi] mov eax,ebp and ebp,1 mov ecx,DWORD [8+esi] sub edx,ebp add eax,edx adc ebx,edx mov DWORD [edi],eax adc ecx,edx mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov eax,DWORD [12+esi] mov ebx,DWORD [16+esi] adc eax,0 mov ecx,DWORD [20+esi] adc ebx,0 mov DWORD [12+edi],eax adc ecx,0 mov DWORD [16+edi],ebx mov DWORD [20+edi],ecx mov eax,DWORD [24+esi] mov ebx,DWORD [28+esi] adc eax,ebp adc ebx,edx mov DWORD [24+edi],eax sbb esi,esi mov DWORD [28+edi],ebx mov eax,DWORD [edi] mov ebx,DWORD [4+edi] mov ecx,DWORD [8+edi] mov edx,DWORD [12+edi] shr eax,1 mov ebp,ebx shl ebx,31 or eax,ebx shr ebp,1 mov ebx,ecx shl ecx,31 mov DWORD [edi],eax or ebp,ecx mov eax,DWORD [16+edi] shr ebx,1 mov ecx,edx shl edx,31 mov DWORD [4+edi],ebp or ebx,edx mov ebp,DWORD [20+edi] shr ecx,1 mov edx,eax shl eax,31 mov DWORD [8+edi],ebx or ecx,eax mov ebx,DWORD [24+edi] shr edx,1 mov eax,ebp shl ebp,31 mov DWORD [12+edi],ecx or edx,ebp mov ecx,DWORD [28+edi] shr eax,1 mov ebp,ebx shl ebx,31 mov DWORD [16+edi],edx or eax,ebx shr ebp,1 mov ebx,ecx shl ecx,31 mov DWORD [20+edi],eax or ebp,ecx shr ebx,1 shl esi,31 mov DWORD [24+edi],ebp or ebx,esi mov DWORD [28+edi],ebx ret global _GFp_nistz256_add align 16 _GFp_nistz256_add: L$_GFp_nistz256_add_begin: push ebp push ebx push esi push edi mov esi,DWORD [24+esp] mov ebp,DWORD [28+esp] mov edi,DWORD [20+esp] call __ecp_nistz256_add pop edi pop esi pop ebx pop ebp ret align 16 __ecp_nistz256_add: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] add eax,DWORD [ebp] mov edx,DWORD [12+esi] adc ebx,DWORD [4+ebp] mov DWORD [edi],eax adc ecx,DWORD [8+ebp] mov DWORD [4+edi],ebx adc edx,DWORD [12+ebp] mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] adc eax,DWORD [16+ebp] mov edx,DWORD [28+esi] adc ebx,DWORD [20+ebp] mov DWORD [16+edi],eax adc ecx,DWORD [24+ebp] mov DWORD [20+edi],ebx mov esi,0 adc edx,DWORD [28+ebp] mov DWORD [24+edi],ecx adc esi,0 mov DWORD [28+edi],edx mov eax,DWORD [edi] mov ebx,DWORD [4+edi] mov ecx,DWORD [8+edi] sub eax,-1 mov edx,DWORD [12+edi] sbb ebx,-1 mov eax,DWORD [16+edi] sbb ecx,-1 mov ebx,DWORD [20+edi] sbb edx,0 mov ecx,DWORD [24+edi] sbb eax,0 mov edx,DWORD [28+edi] sbb ebx,0 sbb ecx,1 sbb edx,-1 sbb esi,0 not esi mov eax,DWORD [edi] mov ebp,esi mov ebx,DWORD [4+edi] shr ebp,31 mov ecx,DWORD [8+edi] sub eax,esi mov edx,DWORD [12+edi] sbb ebx,esi mov DWORD [edi],eax sbb ecx,esi mov DWORD [4+edi],ebx sbb edx,0 mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+edi] mov ebx,DWORD [20+edi] mov ecx,DWORD [24+edi] sbb eax,0 mov edx,DWORD [28+edi] sbb ebx,0 mov DWORD [16+edi],eax sbb ecx,ebp mov DWORD [20+edi],ebx sbb edx,esi mov DWORD [24+edi],ecx mov DWORD [28+edi],edx ret align 16 __ecp_nistz256_sub: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] sub eax,DWORD [ebp] mov edx,DWORD [12+esi] sbb ebx,DWORD [4+ebp] mov DWORD [edi],eax sbb ecx,DWORD [8+ebp] mov DWORD [4+edi],ebx sbb edx,DWORD [12+ebp] mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] sbb eax,DWORD [16+ebp] mov edx,DWORD [28+esi] sbb ebx,DWORD [20+ebp] sbb ecx,DWORD [24+ebp] mov DWORD [16+edi],eax sbb edx,DWORD [28+ebp] mov DWORD [20+edi],ebx sbb esi,esi mov DWORD [24+edi],ecx mov DWORD [28+edi],edx mov eax,DWORD [edi] mov ebp,esi mov ebx,DWORD [4+edi] shr ebp,31 mov ecx,DWORD [8+edi] add eax,esi mov edx,DWORD [12+edi] adc ebx,esi mov DWORD [edi],eax adc ecx,esi mov DWORD [4+edi],ebx adc edx,0 mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+edi] mov ebx,DWORD [20+edi] mov ecx,DWORD [24+edi] adc eax,0 mov edx,DWORD [28+edi] adc ebx,0 mov DWORD [16+edi],eax adc ecx,ebp mov DWORD [20+edi],ebx adc edx,esi mov DWORD [24+edi],ecx mov DWORD [28+edi],edx ret global _GFp_nistz256_neg align 16 _GFp_nistz256_neg: L$_GFp_nistz256_neg_begin: push ebp push ebx push esi push edi mov ebp,DWORD [24+esp] mov edi,DWORD [20+esp] xor eax,eax sub esp,32 mov DWORD [esp],eax mov esi,esp mov DWORD [4+esp],eax mov DWORD [8+esp],eax mov DWORD [12+esp],eax mov DWORD [16+esp],eax mov DWORD [20+esp],eax mov DWORD [24+esp],eax mov DWORD [28+esp],eax call __ecp_nistz256_sub add esp,32 pop edi pop esi pop ebx pop ebp ret align 16 __picup_eax: mov eax,DWORD [esp] ret global _GFp_nistz256_mul_mont align 16 _GFp_nistz256_mul_mont: L$_GFp_nistz256_mul_mont_begin: push ebp push ebx push esi push edi mov esi,DWORD [24+esp] mov ebp,DWORD [28+esp] call __picup_eax L$000pic: lea eax,[_GFp_ia32cap_P] mov eax,DWORD [eax] mov edi,DWORD [20+esp] call __ecp_nistz256_mul_mont pop edi pop esi pop ebx pop ebp ret align 16 __ecp_nistz256_mul_mont: mov edx,esp sub esp,256 movd xmm7,DWORD [ebp] lea ebp,[4+ebp] pcmpeqd xmm6,xmm6 psrlq xmm6,48 pshuflw xmm7,xmm7,220 and esp,-64 pshufd xmm7,xmm7,220 lea ebx,[128+esp] movd xmm0,DWORD [esi] pshufd xmm0,xmm0,204 movd xmm1,DWORD [4+esi] movdqa [ebx],xmm0 pmuludq xmm0,xmm7 movd xmm2,DWORD [8+esi] pshufd xmm1,xmm1,204 movdqa [16+ebx],xmm1 pmuludq xmm1,xmm7 movq xmm4,xmm0 pslldq xmm4,6 paddq xmm4,xmm0 movdqa xmm5,xmm4 psrldq xmm4,10 pand xmm5,xmm6 movd xmm3,DWORD [12+esi] pshufd xmm2,xmm2,204 movdqa [32+ebx],xmm2 pmuludq xmm2,xmm7 paddq xmm1,xmm4 movdqa [esp],xmm1 movd xmm0,DWORD [16+esi] pshufd xmm3,xmm3,204 movdqa [48+ebx],xmm3 pmuludq xmm3,xmm7 movdqa [16+esp],xmm2 movd xmm1,DWORD [20+esi] pshufd xmm0,xmm0,204 movdqa [64+ebx],xmm0 pmuludq xmm0,xmm7 paddq xmm3,xmm5 movdqa [32+esp],xmm3 movd xmm2,DWORD [24+esi] pshufd xmm1,xmm1,204 movdqa [80+ebx],xmm1 pmuludq xmm1,xmm7 movdqa [48+esp],xmm0 pshufd xmm4,xmm5,177 movd xmm3,DWORD [28+esi] pshufd xmm2,xmm2,204 movdqa [96+ebx],xmm2 pmuludq xmm2,xmm7 movdqa [64+esp],xmm1 psubq xmm4,xmm5 movd xmm0,DWORD [ebp] pshufd xmm3,xmm3,204 movdqa [112+ebx],xmm3 pmuludq xmm3,xmm7 pshuflw xmm7,xmm0,220 movdqa xmm0,[ebx] pshufd xmm7,xmm7,220 mov ecx,6 lea ebp,[4+ebp] jmp NEAR L$001madd_sse2 align 16 L$001madd_sse2: paddq xmm2,xmm5 paddq xmm3,xmm4 movdqa xmm1,[16+ebx] pmuludq xmm0,xmm7 movdqa [80+esp],xmm2 movdqa xmm2,[32+ebx] pmuludq xmm1,xmm7 movdqa [96+esp],xmm3 paddq xmm0,[esp] movdqa xmm3,[48+ebx] pmuludq xmm2,xmm7 movq xmm4,xmm0 pslldq xmm4,6 paddq xmm1,[16+esp] paddq xmm4,xmm0 movdqa xmm5,xmm4 psrldq xmm4,10 movdqa xmm0,[64+ebx] pmuludq xmm3,xmm7 paddq xmm1,xmm4 paddq xmm2,[32+esp] movdqa [esp],xmm1 movdqa xmm1,[80+ebx] pmuludq xmm0,xmm7 paddq xmm3,[48+esp] movdqa [16+esp],xmm2 pand xmm5,xmm6 movdqa xmm2,[96+ebx] pmuludq xmm1,xmm7 paddq xmm3,xmm5 paddq xmm0,[64+esp] movdqa [32+esp],xmm3 pshufd xmm4,xmm5,177 movdqa xmm3,xmm7 pmuludq xmm2,xmm7 movd xmm7,DWORD [ebp] lea ebp,[4+ebp] paddq xmm1,[80+esp] psubq xmm4,xmm5 movdqa [48+esp],xmm0 pshuflw xmm7,xmm7,220 pmuludq xmm3,[112+ebx] pshufd xmm7,xmm7,220 movdqa xmm0,[ebx] movdqa [64+esp],xmm1 paddq xmm2,[96+esp] dec ecx jnz NEAR L$001madd_sse2 paddq xmm2,xmm5 paddq xmm3,xmm4 movdqa xmm1,[16+ebx] pmuludq xmm0,xmm7 movdqa [80+esp],xmm2 movdqa xmm2,[32+ebx] pmuludq xmm1,xmm7 movdqa [96+esp],xmm3 paddq xmm0,[esp] movdqa xmm3,[48+ebx] pmuludq xmm2,xmm7 movq xmm4,xmm0 pslldq xmm4,6 paddq xmm1,[16+esp] paddq xmm4,xmm0 movdqa xmm5,xmm4 psrldq xmm4,10 movdqa xmm0,[64+ebx] pmuludq xmm3,xmm7 paddq xmm1,xmm4 paddq xmm2,[32+esp] movdqa [esp],xmm1 movdqa xmm1,[80+ebx] pmuludq xmm0,xmm7 paddq xmm3,[48+esp] movdqa [16+esp],xmm2 pand xmm5,xmm6 movdqa xmm2,[96+ebx] pmuludq xmm1,xmm7 paddq xmm3,xmm5 paddq xmm0,[64+esp] movdqa [32+esp],xmm3 pshufd xmm4,xmm5,177 movdqa xmm3,[112+ebx] pmuludq xmm2,xmm7 paddq xmm1,[80+esp] psubq xmm4,xmm5 movdqa [48+esp],xmm0 pmuludq xmm3,xmm7 pcmpeqd xmm7,xmm7 movdqa xmm0,[esp] pslldq xmm7,8 movdqa [64+esp],xmm1 paddq xmm2,[96+esp] paddq xmm2,xmm5 paddq xmm3,xmm4 movdqa [80+esp],xmm2 movdqa [96+esp],xmm3 movdqa xmm1,[16+esp] movdqa xmm2,[32+esp] movdqa xmm3,[48+esp] movq xmm4,xmm0 pand xmm0,xmm7 xor ebp,ebp pslldq xmm4,6 movq xmm5,xmm1 paddq xmm0,xmm4 pand xmm1,xmm7 psrldq xmm0,6 movd eax,xmm0 psrldq xmm0,4 paddq xmm5,xmm0 movdqa xmm0,[64+esp] sub eax,-1 pslldq xmm5,6 movq xmm4,xmm2 paddq xmm1,xmm5 pand xmm2,xmm7 psrldq xmm1,6 mov DWORD [edi],eax movd eax,xmm1 psrldq xmm1,4 paddq xmm4,xmm1 movdqa xmm1,[80+esp] sbb eax,-1 pslldq xmm4,6 movq xmm5,xmm3 paddq xmm2,xmm4 pand xmm3,xmm7 psrldq xmm2,6 mov DWORD [4+edi],eax movd eax,xmm2 psrldq xmm2,4 paddq xmm5,xmm2 movdqa xmm2,[96+esp] sbb eax,-1 pslldq xmm5,6 movq xmm4,xmm0 paddq xmm3,xmm5 pand xmm0,xmm7 psrldq xmm3,6 mov DWORD [8+edi],eax movd eax,xmm3 psrldq xmm3,4 paddq xmm4,xmm3 sbb eax,0 pslldq xmm4,6 movq xmm5,xmm1 paddq xmm0,xmm4 pand xmm1,xmm7 psrldq xmm0,6 mov DWORD [12+edi],eax movd eax,xmm0 psrldq xmm0,4 paddq xmm5,xmm0 sbb eax,0 pslldq xmm5,6 movq xmm4,xmm2 paddq xmm1,xmm5 pand xmm2,xmm7 psrldq xmm1,6 movd ebx,xmm1 psrldq xmm1,4 mov esp,edx paddq xmm4,xmm1 pslldq xmm4,6 paddq xmm2,xmm4 psrldq xmm2,6 movd ecx,xmm2 psrldq xmm2,4 sbb ebx,0 movd edx,xmm2 pextrw esi,xmm2,2 sbb ecx,1 sbb edx,-1 sbb esi,0 sub ebp,esi add DWORD [edi],esi adc DWORD [4+edi],esi adc DWORD [8+edi],esi adc DWORD [12+edi],0 adc eax,0 adc ebx,0 mov DWORD [16+edi],eax adc ecx,ebp mov DWORD [20+edi],ebx adc edx,esi mov DWORD [24+edi],ecx mov DWORD [28+edi],edx ret global _GFp_nistz256_point_double align 16 _GFp_nistz256_point_double: L$_GFp_nistz256_point_double_begin: push ebp push ebx push esi push edi mov esi,DWORD [24+esp] sub esp,164 call __picup_eax L$002pic: lea edx,[_GFp_ia32cap_P] mov ebp,DWORD [edx] L$point_double_shortcut: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [96+esp],eax mov DWORD [100+esp],ebx mov DWORD [104+esp],ecx mov DWORD [108+esp],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] mov edx,DWORD [28+esi] mov DWORD [112+esp],eax mov DWORD [116+esp],ebx mov DWORD [120+esp],ecx mov DWORD [124+esp],edx mov DWORD [160+esp],ebp lea ebp,[32+esi] lea esi,[32+esi] lea edi,[esp] call __ecp_nistz256_add mov eax,DWORD [160+esp] mov esi,64 add esi,DWORD [188+esp] lea edi,[64+esp] mov ebp,esi call __ecp_nistz256_mul_mont mov eax,DWORD [160+esp] lea esi,[esp] lea ebp,[esp] lea edi,[esp] call __ecp_nistz256_mul_mont mov eax,DWORD [160+esp] mov ebp,DWORD [188+esp] lea esi,[32+ebp] lea ebp,[64+ebp] lea edi,[128+esp] call __ecp_nistz256_mul_mont lea esi,[96+esp] lea ebp,[64+esp] lea edi,[32+esp] call __ecp_nistz256_add mov edi,64 lea esi,[128+esp] lea ebp,[128+esp] add edi,DWORD [184+esp] call __ecp_nistz256_add lea esi,[96+esp] lea ebp,[64+esp] lea edi,[64+esp] call __ecp_nistz256_sub mov eax,DWORD [160+esp] lea esi,[esp] lea ebp,[esp] lea edi,[128+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [160+esp] lea esi,[32+esp] lea ebp,[64+esp] lea edi,[32+esp] call __ecp_nistz256_mul_mont mov edi,32 lea esi,[128+esp] add edi,DWORD [184+esp] call __ecp_nistz256_div_by_2 lea esi,[32+esp] lea ebp,[32+esp] lea edi,[128+esp] call __ecp_nistz256_add mov eax,DWORD [160+esp] lea esi,[96+esp] lea ebp,[esp] lea edi,[esp] call __ecp_nistz256_mul_mont lea esi,[128+esp] lea ebp,[32+esp] lea edi,[32+esp] call __ecp_nistz256_add lea esi,[esp] lea ebp,[esp] lea edi,[128+esp] call __ecp_nistz256_add mov eax,DWORD [160+esp] lea esi,[32+esp] lea ebp,[32+esp] mov edi,DWORD [184+esp] call __ecp_nistz256_mul_mont mov esi,edi lea ebp,[128+esp] call __ecp_nistz256_sub lea esi,[esp] mov ebp,edi lea edi,[esp] call __ecp_nistz256_sub mov eax,DWORD [160+esp] mov esi,edi lea ebp,[32+esp] call __ecp_nistz256_mul_mont mov ebp,32 lea esi,[esp] add ebp,DWORD [184+esp] mov edi,ebp call __ecp_nistz256_sub add esp,164 pop edi pop esi pop ebx pop ebp ret global _GFp_nistz256_point_add_affine align 16 _GFp_nistz256_point_add_affine: L$_GFp_nistz256_point_add_affine_begin: push ebp push ebx push esi push edi mov esi,DWORD [24+esp] sub esp,492 call __picup_eax L$003pic: lea edx,[_GFp_ia32cap_P] mov ebp,DWORD [edx] lea edi,[96+esp] mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [edi],eax mov DWORD [488+esp],ebp mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov DWORD [12+edi],edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] mov edx,DWORD [28+esi] mov DWORD [16+edi],eax mov DWORD [20+edi],ebx mov DWORD [24+edi],ecx mov DWORD [28+edi],edx mov eax,DWORD [32+esi] mov ebx,DWORD [36+esi] mov ecx,DWORD [40+esi] mov edx,DWORD [44+esi] mov DWORD [32+edi],eax mov DWORD [36+edi],ebx mov DWORD [40+edi],ecx mov DWORD [44+edi],edx mov eax,DWORD [48+esi] mov ebx,DWORD [52+esi] mov ecx,DWORD [56+esi] mov edx,DWORD [60+esi] mov DWORD [48+edi],eax mov DWORD [52+edi],ebx mov DWORD [56+edi],ecx mov DWORD [60+edi],edx mov eax,DWORD [64+esi] mov ebx,DWORD [68+esi] mov ecx,DWORD [72+esi] mov edx,DWORD [76+esi] mov DWORD [64+edi],eax mov ebp,eax mov DWORD [68+edi],ebx or ebp,ebx mov DWORD [72+edi],ecx or ebp,ecx mov DWORD [76+edi],edx or ebp,edx mov eax,DWORD [80+esi] mov ebx,DWORD [84+esi] mov ecx,DWORD [88+esi] mov edx,DWORD [92+esi] mov DWORD [80+edi],eax or ebp,eax mov DWORD [84+edi],ebx or ebp,ebx mov DWORD [88+edi],ecx or ebp,ecx mov DWORD [92+edi],edx or ebp,edx xor eax,eax mov esi,DWORD [520+esp] sub eax,ebp or ebp,eax sar ebp,31 mov DWORD [480+esp],ebp lea edi,[192+esp] mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] mov DWORD [edi],eax mov ebp,eax mov DWORD [4+edi],ebx or ebp,ebx mov DWORD [8+edi],ecx or ebp,ecx mov DWORD [12+edi],edx or ebp,edx mov eax,DWORD [16+esi] mov ebx,DWORD [20+esi] mov ecx,DWORD [24+esi] mov edx,DWORD [28+esi] mov DWORD [16+edi],eax or ebp,eax mov DWORD [20+edi],ebx or ebp,ebx mov DWORD [24+edi],ecx or ebp,ecx mov DWORD [28+edi],edx or ebp,edx mov eax,DWORD [32+esi] mov ebx,DWORD [36+esi] mov ecx,DWORD [40+esi] mov edx,DWORD [44+esi] mov DWORD [32+edi],eax or ebp,eax mov DWORD [36+edi],ebx or ebp,ebx mov DWORD [40+edi],ecx or ebp,ecx mov DWORD [44+edi],edx or ebp,edx mov eax,DWORD [48+esi] mov ebx,DWORD [52+esi] mov ecx,DWORD [56+esi] mov edx,DWORD [60+esi] mov DWORD [48+edi],eax or ebp,eax mov DWORD [52+edi],ebx or ebp,ebx mov DWORD [56+edi],ecx or ebp,ecx mov DWORD [60+edi],edx or ebp,edx xor ebx,ebx mov eax,DWORD [488+esp] sub ebx,ebp lea esi,[160+esp] or ebx,ebp lea ebp,[160+esp] sar ebx,31 lea edi,[288+esp] mov DWORD [484+esp],ebx call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[192+esp] mov ebp,edi lea edi,[256+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[160+esp] lea ebp,[288+esp] lea edi,[288+esp] call __ecp_nistz256_mul_mont lea esi,[256+esp] lea ebp,[96+esp] lea edi,[320+esp] call __ecp_nistz256_sub mov eax,DWORD [488+esp] lea esi,[224+esp] lea ebp,[288+esp] lea edi,[288+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[160+esp] lea ebp,[320+esp] lea edi,[64+esp] call __ecp_nistz256_mul_mont lea esi,[288+esp] lea ebp,[128+esp] lea edi,[352+esp] call __ecp_nistz256_sub mov eax,DWORD [488+esp] lea esi,[320+esp] lea ebp,[320+esp] lea edi,[384+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[352+esp] lea ebp,[352+esp] lea edi,[448+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[96+esp] lea ebp,[384+esp] lea edi,[256+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[320+esp] lea ebp,[384+esp] lea edi,[416+esp] call __ecp_nistz256_mul_mont lea esi,[256+esp] lea ebp,[256+esp] lea edi,[384+esp] call __ecp_nistz256_add lea esi,[448+esp] lea ebp,[384+esp] lea edi,[esp] call __ecp_nistz256_sub lea esi,[esp] lea ebp,[416+esp] lea edi,[esp] call __ecp_nistz256_sub lea esi,[256+esp] lea ebp,[esp] lea edi,[32+esp] call __ecp_nistz256_sub mov eax,DWORD [488+esp] lea esi,[416+esp] lea ebp,[128+esp] lea edi,[288+esp] call __ecp_nistz256_mul_mont mov eax,DWORD [488+esp] lea esi,[352+esp] lea ebp,[32+esp] lea edi,[32+esp] call __ecp_nistz256_mul_mont lea esi,[32+esp] lea ebp,[288+esp] lea edi,[32+esp] call __ecp_nistz256_sub mov ebp,DWORD [480+esp] mov esi,DWORD [484+esp] mov edi,DWORD [512+esp] mov edx,ebp not ebp and edx,esi and ebp,esi not esi mov eax,edx and eax,DWORD [64+esp] mov ebx,ebp and ebx,1 mov ecx,esi and ecx,DWORD [160+esp] or eax,ebx or eax,ecx mov DWORD [64+edi],eax mov eax,edx and eax,DWORD [68+esp] mov ecx,esi and ecx,DWORD [164+esp] or eax,ecx mov DWORD [68+edi],eax mov eax,edx and eax,DWORD [72+esp] mov ecx,esi and ecx,DWORD [168+esp] or eax,ecx mov DWORD [72+edi],eax mov eax,edx and eax,DWORD [76+esp] mov ecx,esi and ecx,DWORD [172+esp] or eax,ebp or eax,ecx mov DWORD [76+edi],eax mov eax,edx and eax,DWORD [80+esp] mov ecx,esi and ecx,DWORD [176+esp] or eax,ebp or eax,ecx mov DWORD [80+edi],eax mov eax,edx and eax,DWORD [84+esp] mov ecx,esi and ecx,DWORD [180+esp] or eax,ebp or eax,ecx mov DWORD [84+edi],eax mov eax,edx and eax,DWORD [88+esp] mov ebx,ebp and ebx,-2 mov ecx,esi and ecx,DWORD [184+esp] or eax,ebx or eax,ecx mov DWORD [88+edi],eax mov eax,edx and eax,DWORD [92+esp] mov ecx,esi and ecx,DWORD [188+esp] or eax,ecx mov DWORD [92+edi],eax mov eax,edx and eax,DWORD [esp] mov ebx,ebp and ebx,DWORD [192+esp] mov ecx,esi and ecx,DWORD [96+esp] or eax,ebx or eax,ecx mov DWORD [edi],eax mov eax,edx and eax,DWORD [4+esp] mov ebx,ebp and ebx,DWORD [196+esp] mov ecx,esi and ecx,DWORD [100+esp] or eax,ebx or eax,ecx mov DWORD [4+edi],eax mov eax,edx and eax,DWORD [8+esp] mov ebx,ebp and ebx,DWORD [200+esp] mov ecx,esi and ecx,DWORD [104+esp] or eax,ebx or eax,ecx mov DWORD [8+edi],eax mov eax,edx and eax,DWORD [12+esp] mov ebx,ebp and ebx,DWORD [204+esp] mov ecx,esi and ecx,DWORD [108+esp] or eax,ebx or eax,ecx mov DWORD [12+edi],eax mov eax,edx and eax,DWORD [16+esp] mov ebx,ebp and ebx,DWORD [208+esp] mov ecx,esi and ecx,DWORD [112+esp] or eax,ebx or eax,ecx mov DWORD [16+edi],eax mov eax,edx and eax,DWORD [20+esp] mov ebx,ebp and ebx,DWORD [212+esp] mov ecx,esi and ecx,DWORD [116+esp] or eax,ebx or eax,ecx mov DWORD [20+edi],eax mov eax,edx and eax,DWORD [24+esp] mov ebx,ebp and ebx,DWORD [216+esp] mov ecx,esi and ecx,DWORD [120+esp] or eax,ebx or eax,ecx mov DWORD [24+edi],eax mov eax,edx and eax,DWORD [28+esp] mov ebx,ebp and ebx,DWORD [220+esp] mov ecx,esi and ecx,DWORD [124+esp] or eax,ebx or eax,ecx mov DWORD [28+edi],eax mov eax,edx and eax,DWORD [32+esp] mov ebx,ebp and ebx,DWORD [224+esp] mov ecx,esi and ecx,DWORD [128+esp] or eax,ebx or eax,ecx mov DWORD [32+edi],eax mov eax,edx and eax,DWORD [36+esp] mov ebx,ebp and ebx,DWORD [228+esp] mov ecx,esi and ecx,DWORD [132+esp] or eax,ebx or eax,ecx mov DWORD [36+edi],eax mov eax,edx and eax,DWORD [40+esp] mov ebx,ebp and ebx,DWORD [232+esp] mov ecx,esi and ecx,DWORD [136+esp] or eax,ebx or eax,ecx mov DWORD [40+edi],eax mov eax,edx and eax,DWORD [44+esp] mov ebx,ebp and ebx,DWORD [236+esp] mov ecx,esi and ecx,DWORD [140+esp] or eax,ebx or eax,ecx mov DWORD [44+edi],eax mov eax,edx and eax,DWORD [48+esp] mov ebx,ebp and ebx,DWORD [240+esp] mov ecx,esi and ecx,DWORD [144+esp] or eax,ebx or eax,ecx mov DWORD [48+edi],eax mov eax,edx and eax,DWORD [52+esp] mov ebx,ebp and ebx,DWORD [244+esp] mov ecx,esi and ecx,DWORD [148+esp] or eax,ebx or eax,ecx mov DWORD [52+edi],eax mov eax,edx and eax,DWORD [56+esp] mov ebx,ebp and ebx,DWORD [248+esp] mov ecx,esi and ecx,DWORD [152+esp] or eax,ebx or eax,ecx mov DWORD [56+edi],eax mov eax,edx and eax,DWORD [60+esp] mov ebx,ebp and ebx,DWORD [252+esp] mov ecx,esi and ecx,DWORD [156+esp] or eax,ebx or eax,ecx mov DWORD [60+edi],eax add esp,492 pop edi pop esi pop ebx pop ebp ret segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/ghash-x86-win32n.asm000064400000000000000000000171241353224260700175470ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif global _GFp_gcm_init_clmul align 16 _GFp_gcm_init_clmul: L$_GFp_gcm_init_clmul_begin: mov edx,DWORD [4+esp] mov eax,DWORD [8+esp] call L$000pic L$000pic: pop ecx lea ecx,[(L$bswap-L$000pic)+ecx] movdqu xmm2,[eax] pshufd xmm2,xmm2,78 pshufd xmm4,xmm2,255 movdqa xmm3,xmm2 psllq xmm2,1 pxor xmm5,xmm5 psrlq xmm3,63 pcmpgtd xmm5,xmm4 pslldq xmm3,8 por xmm2,xmm3 pand xmm5,[16+ecx] pxor xmm2,xmm5 movdqa xmm0,xmm2 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pshufd xmm4,xmm2,78 pxor xmm3,xmm0 pxor xmm4,xmm2 db 102,15,58,68,194,0 db 102,15,58,68,202,17 db 102,15,58,68,220,0 xorps xmm3,xmm0 xorps xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 pshufd xmm3,xmm2,78 pshufd xmm4,xmm0,78 pxor xmm3,xmm2 movdqu [edx],xmm2 pxor xmm4,xmm0 movdqu [16+edx],xmm0 db 102,15,58,15,227,8 movdqu [32+edx],xmm4 ret global _GFp_gcm_gmult_clmul align 16 _GFp_gcm_gmult_clmul: L$_GFp_gcm_gmult_clmul_begin: mov eax,DWORD [4+esp] mov edx,DWORD [8+esp] call L$001pic L$001pic: pop ecx lea ecx,[(L$bswap-L$001pic)+ecx] movdqu xmm0,[eax] movdqa xmm5,[ecx] movups xmm2,[edx] db 102,15,56,0,197 movups xmm4,[32+edx] movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 db 102,15,58,68,194,0 db 102,15,58,68,202,17 db 102,15,58,68,220,0 xorps xmm3,xmm0 xorps xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 db 102,15,56,0,197 movdqu [eax],xmm0 ret global _GFp_gcm_ghash_clmul align 16 _GFp_gcm_ghash_clmul: L$_GFp_gcm_ghash_clmul_begin: push ebp push ebx push esi push edi mov eax,DWORD [20+esp] mov edx,DWORD [24+esp] mov esi,DWORD [28+esp] mov ebx,DWORD [32+esp] call L$002pic L$002pic: pop ecx lea ecx,[(L$bswap-L$002pic)+ecx] movdqu xmm0,[eax] movdqa xmm5,[ecx] movdqu xmm2,[edx] db 102,15,56,0,197 sub ebx,16 jz NEAR L$003odd_tail movdqu xmm3,[esi] movdqu xmm6,[16+esi] db 102,15,56,0,221 db 102,15,56,0,245 movdqu xmm5,[32+edx] pxor xmm0,xmm3 pshufd xmm3,xmm6,78 movdqa xmm7,xmm6 pxor xmm3,xmm6 lea esi,[32+esi] db 102,15,58,68,242,0 db 102,15,58,68,250,17 db 102,15,58,68,221,0 movups xmm2,[16+edx] nop sub ebx,32 jbe NEAR L$004even_tail jmp NEAR L$005mod_loop align 32 L$005mod_loop: pshufd xmm4,xmm0,78 movdqa xmm1,xmm0 pxor xmm4,xmm0 nop db 102,15,58,68,194,0 db 102,15,58,68,202,17 db 102,15,58,68,229,16 movups xmm2,[edx] xorps xmm0,xmm6 movdqa xmm5,[ecx] xorps xmm1,xmm7 movdqu xmm7,[esi] pxor xmm3,xmm0 movdqu xmm6,[16+esi] pxor xmm3,xmm1 db 102,15,56,0,253 pxor xmm4,xmm3 movdqa xmm3,xmm4 psrldq xmm4,8 pslldq xmm3,8 pxor xmm1,xmm4 pxor xmm0,xmm3 db 102,15,56,0,245 pxor xmm1,xmm7 movdqa xmm7,xmm6 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 db 102,15,58,68,242,0 movups xmm5,[32+edx] psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 pshufd xmm3,xmm7,78 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm3,xmm7 pxor xmm1,xmm4 db 102,15,58,68,250,17 movups xmm2,[16+edx] pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 db 102,15,58,68,221,0 lea esi,[32+esi] sub ebx,32 ja NEAR L$005mod_loop L$004even_tail: pshufd xmm4,xmm0,78 movdqa xmm1,xmm0 pxor xmm4,xmm0 db 102,15,58,68,194,0 db 102,15,58,68,202,17 db 102,15,58,68,229,16 movdqa xmm5,[ecx] xorps xmm0,xmm6 xorps xmm1,xmm7 pxor xmm3,xmm0 pxor xmm3,xmm1 pxor xmm4,xmm3 movdqa xmm3,xmm4 psrldq xmm4,8 pslldq xmm3,8 pxor xmm1,xmm4 pxor xmm0,xmm3 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 test ebx,ebx jnz NEAR L$006done movups xmm2,[edx] L$003odd_tail: movdqu xmm3,[esi] db 102,15,56,0,221 pxor xmm0,xmm3 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pshufd xmm4,xmm2,78 pxor xmm3,xmm0 pxor xmm4,xmm2 db 102,15,58,68,194,0 db 102,15,58,68,202,17 db 102,15,58,68,220,0 xorps xmm3,xmm0 xorps xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 L$006done: db 102,15,56,0,197 movdqu [eax],xmm0 pop edi pop esi pop ebx pop ebp ret align 64 L$bswap: db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 align 64 L$007rem_8bit: dw 0,450,900,582,1800,1738,1164,1358 dw 3600,4050,3476,3158,2328,2266,2716,2910 dw 7200,7650,8100,7782,6952,6890,6316,6510 dw 4656,5106,4532,4214,5432,5370,5820,6014 dw 14400,14722,15300,14854,16200,16010,15564,15630 dw 13904,14226,13780,13334,12632,12442,13020,13086 dw 9312,9634,10212,9766,9064,8874,8428,8494 dw 10864,11186,10740,10294,11640,11450,12028,12094 dw 28800,28994,29444,29382,30600,30282,29708,30158 dw 32400,32594,32020,31958,31128,30810,31260,31710 dw 27808,28002,28452,28390,27560,27242,26668,27118 dw 25264,25458,24884,24822,26040,25722,26172,26622 dw 18624,18690,19268,19078,20424,19978,19532,19854 dw 18128,18194,17748,17558,16856,16410,16988,17310 dw 21728,21794,22372,22182,21480,21034,20588,20910 dw 23280,23346,22900,22710,24056,23610,24188,24510 dw 57600,57538,57988,58182,58888,59338,58764,58446 dw 61200,61138,60564,60758,59416,59866,60316,59998 dw 64800,64738,65188,65382,64040,64490,63916,63598 dw 62256,62194,61620,61814,62520,62970,63420,63102 dw 55616,55426,56004,56070,56904,57226,56780,56334 dw 55120,54930,54484,54550,53336,53658,54236,53790 dw 50528,50338,50916,50982,49768,50090,49644,49198 dw 52080,51890,51444,51510,52344,52666,53244,52798 dw 37248,36930,37380,37830,38536,38730,38156,38094 dw 40848,40530,39956,40406,39064,39258,39708,39646 dw 36256,35938,36388,36838,35496,35690,35116,35054 dw 33712,33394,32820,33270,33976,34170,34620,34558 dw 43456,43010,43588,43910,44744,44810,44364,44174 dw 42960,42514,42068,42390,41176,41242,41820,41630 dw 46560,46114,46692,47014,45800,45866,45420,45230 dw 48112,47666,47220,47542,48376,48442,49020,48830 db 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 db 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 db 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 db 0 ring-0.16.9/pregenerated/tmp/ghash-x86_64-nasm.asm000064400000000000000000000615701353224260200176750ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_gcm_init_clmul ALIGN 16 GFp_gcm_init_clmul: $L$_init_clmul: $L$SEH_begin_GFp_gcm_init_clmul: DB 0x48,0x83,0xec,0x18 DB 0x0f,0x29,0x34,0x24 movdqu xmm2,XMMWORD[rdx] pshufd xmm2,xmm2,78 pshufd xmm4,xmm2,255 movdqa xmm3,xmm2 psllq xmm2,1 pxor xmm5,xmm5 psrlq xmm3,63 pcmpgtd xmm5,xmm4 pslldq xmm3,8 por xmm2,xmm3 pand xmm5,XMMWORD[$L$0x1c2_polynomial] pxor xmm2,xmm5 pshufd xmm6,xmm2,78 movdqa xmm0,xmm2 pxor xmm6,xmm2 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 DB 102,15,58,68,194,0 DB 102,15,58,68,202,17 DB 102,15,58,68,222,0 pxor xmm3,xmm0 pxor xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 pshufd xmm3,xmm2,78 pshufd xmm4,xmm0,78 pxor xmm3,xmm2 movdqu XMMWORD[rcx],xmm2 pxor xmm4,xmm0 movdqu XMMWORD[16+rcx],xmm0 DB 102,15,58,15,227,8 movdqu XMMWORD[32+rcx],xmm4 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 DB 102,15,58,68,194,0 DB 102,15,58,68,202,17 DB 102,15,58,68,222,0 pxor xmm3,xmm0 pxor xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 movdqa xmm5,xmm0 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 DB 102,15,58,68,194,0 DB 102,15,58,68,202,17 DB 102,15,58,68,222,0 pxor xmm3,xmm0 pxor xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 pshufd xmm3,xmm5,78 pshufd xmm4,xmm0,78 pxor xmm3,xmm5 movdqu XMMWORD[48+rcx],xmm5 pxor xmm4,xmm0 movdqu XMMWORD[64+rcx],xmm0 DB 102,15,58,15,227,8 movdqu XMMWORD[80+rcx],xmm4 movaps xmm6,XMMWORD[rsp] lea rsp,[24+rsp] $L$SEH_end_GFp_gcm_init_clmul: DB 0F3h,0C3h ;repret global GFp_gcm_gmult_clmul ALIGN 16 GFp_gcm_gmult_clmul: movdqu xmm0,XMMWORD[rcx] movdqa xmm5,XMMWORD[$L$bswap_mask] movdqu xmm2,XMMWORD[rdx] movdqu xmm4,XMMWORD[32+rdx] DB 102,15,56,0,197 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 DB 102,15,58,68,194,0 DB 102,15,58,68,202,17 DB 102,15,58,68,220,0 pxor xmm3,xmm0 pxor xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 DB 102,15,56,0,197 movdqu XMMWORD[rcx],xmm0 DB 0F3h,0C3h ;repret global GFp_gcm_ghash_clmul ALIGN 32 GFp_gcm_ghash_clmul: $L$_ghash_clmul: lea rax,[((-136))+rsp] $L$SEH_begin_GFp_gcm_ghash_clmul: DB 0x48,0x8d,0x60,0xe0 DB 0x0f,0x29,0x70,0xe0 DB 0x0f,0x29,0x78,0xf0 DB 0x44,0x0f,0x29,0x00 DB 0x44,0x0f,0x29,0x48,0x10 DB 0x44,0x0f,0x29,0x50,0x20 DB 0x44,0x0f,0x29,0x58,0x30 DB 0x44,0x0f,0x29,0x60,0x40 DB 0x44,0x0f,0x29,0x68,0x50 DB 0x44,0x0f,0x29,0x70,0x60 DB 0x44,0x0f,0x29,0x78,0x70 movdqa xmm10,XMMWORD[$L$bswap_mask] movdqu xmm0,XMMWORD[rcx] movdqu xmm2,XMMWORD[rdx] movdqu xmm7,XMMWORD[32+rdx] DB 102,65,15,56,0,194 sub r9,0x10 jz NEAR $L$odd_tail movdqu xmm6,XMMWORD[16+rdx] lea rax,[GFp_ia32cap_P] mov eax,DWORD[4+rax] cmp r9,0x30 jb NEAR $L$skip4x and eax,71303168 cmp eax,4194304 je NEAR $L$skip4x sub r9,0x30 mov rax,0xA040608020C0E000 movdqu xmm14,XMMWORD[48+rdx] movdqu xmm15,XMMWORD[64+rdx] movdqu xmm3,XMMWORD[48+r8] movdqu xmm11,XMMWORD[32+r8] DB 102,65,15,56,0,218 DB 102,69,15,56,0,218 movdqa xmm5,xmm3 pshufd xmm4,xmm3,78 pxor xmm4,xmm3 DB 102,15,58,68,218,0 DB 102,15,58,68,234,17 DB 102,15,58,68,231,0 movdqa xmm13,xmm11 pshufd xmm12,xmm11,78 pxor xmm12,xmm11 DB 102,68,15,58,68,222,0 DB 102,68,15,58,68,238,17 DB 102,68,15,58,68,231,16 xorps xmm3,xmm11 xorps xmm5,xmm13 movups xmm7,XMMWORD[80+rdx] xorps xmm4,xmm12 movdqu xmm11,XMMWORD[16+r8] movdqu xmm8,XMMWORD[r8] DB 102,69,15,56,0,218 DB 102,69,15,56,0,194 movdqa xmm13,xmm11 pshufd xmm12,xmm11,78 pxor xmm0,xmm8 pxor xmm12,xmm11 DB 102,69,15,58,68,222,0 movdqa xmm1,xmm0 pshufd xmm8,xmm0,78 pxor xmm8,xmm0 DB 102,69,15,58,68,238,17 DB 102,68,15,58,68,231,0 xorps xmm3,xmm11 xorps xmm5,xmm13 lea r8,[64+r8] sub r9,0x40 jc NEAR $L$tail4x jmp NEAR $L$mod4_loop ALIGN 32 $L$mod4_loop: DB 102,65,15,58,68,199,0 xorps xmm4,xmm12 movdqu xmm11,XMMWORD[48+r8] DB 102,69,15,56,0,218 DB 102,65,15,58,68,207,17 xorps xmm0,xmm3 movdqu xmm3,XMMWORD[32+r8] movdqa xmm13,xmm11 DB 102,68,15,58,68,199,16 pshufd xmm12,xmm11,78 xorps xmm1,xmm5 pxor xmm12,xmm11 DB 102,65,15,56,0,218 movups xmm7,XMMWORD[32+rdx] xorps xmm8,xmm4 DB 102,68,15,58,68,218,0 pshufd xmm4,xmm3,78 pxor xmm8,xmm0 movdqa xmm5,xmm3 pxor xmm8,xmm1 pxor xmm4,xmm3 movdqa xmm9,xmm8 DB 102,68,15,58,68,234,17 pslldq xmm8,8 psrldq xmm9,8 pxor xmm0,xmm8 movdqa xmm8,XMMWORD[$L$7_mask] pxor xmm1,xmm9 DB 102,76,15,110,200 pand xmm8,xmm0 DB 102,69,15,56,0,200 pxor xmm9,xmm0 DB 102,68,15,58,68,231,0 psllq xmm9,57 movdqa xmm8,xmm9 pslldq xmm9,8 DB 102,15,58,68,222,0 psrldq xmm8,8 pxor xmm0,xmm9 pxor xmm1,xmm8 movdqu xmm8,XMMWORD[r8] movdqa xmm9,xmm0 psrlq xmm0,1 DB 102,15,58,68,238,17 xorps xmm3,xmm11 movdqu xmm11,XMMWORD[16+r8] DB 102,69,15,56,0,218 DB 102,15,58,68,231,16 xorps xmm5,xmm13 movups xmm7,XMMWORD[80+rdx] DB 102,69,15,56,0,194 pxor xmm1,xmm9 pxor xmm9,xmm0 psrlq xmm0,5 movdqa xmm13,xmm11 pxor xmm4,xmm12 pshufd xmm12,xmm11,78 pxor xmm0,xmm9 pxor xmm1,xmm8 pxor xmm12,xmm11 DB 102,69,15,58,68,222,0 psrlq xmm0,1 pxor xmm0,xmm1 movdqa xmm1,xmm0 DB 102,69,15,58,68,238,17 xorps xmm3,xmm11 pshufd xmm8,xmm0,78 pxor xmm8,xmm0 DB 102,68,15,58,68,231,0 xorps xmm5,xmm13 lea r8,[64+r8] sub r9,0x40 jnc NEAR $L$mod4_loop $L$tail4x: DB 102,65,15,58,68,199,0 DB 102,65,15,58,68,207,17 DB 102,68,15,58,68,199,16 xorps xmm4,xmm12 xorps xmm0,xmm3 xorps xmm1,xmm5 pxor xmm1,xmm0 pxor xmm8,xmm4 pxor xmm8,xmm1 pxor xmm1,xmm0 movdqa xmm9,xmm8 psrldq xmm8,8 pslldq xmm9,8 pxor xmm1,xmm8 pxor xmm0,xmm9 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 add r9,0x40 jz NEAR $L$done movdqu xmm7,XMMWORD[32+rdx] sub r9,0x10 jz NEAR $L$odd_tail $L$skip4x: movdqu xmm8,XMMWORD[r8] movdqu xmm3,XMMWORD[16+r8] DB 102,69,15,56,0,194 DB 102,65,15,56,0,218 pxor xmm0,xmm8 movdqa xmm5,xmm3 pshufd xmm4,xmm3,78 pxor xmm4,xmm3 DB 102,15,58,68,218,0 DB 102,15,58,68,234,17 DB 102,15,58,68,231,0 lea r8,[32+r8] nop sub r9,0x20 jbe NEAR $L$even_tail nop jmp NEAR $L$mod_loop ALIGN 32 $L$mod_loop: movdqa xmm1,xmm0 movdqa xmm8,xmm4 pshufd xmm4,xmm0,78 pxor xmm4,xmm0 DB 102,15,58,68,198,0 DB 102,15,58,68,206,17 DB 102,15,58,68,231,16 pxor xmm0,xmm3 pxor xmm1,xmm5 movdqu xmm9,XMMWORD[r8] pxor xmm8,xmm0 DB 102,69,15,56,0,202 movdqu xmm3,XMMWORD[16+r8] pxor xmm8,xmm1 pxor xmm1,xmm9 pxor xmm4,xmm8 DB 102,65,15,56,0,218 movdqa xmm8,xmm4 psrldq xmm8,8 pslldq xmm4,8 pxor xmm1,xmm8 pxor xmm0,xmm4 movdqa xmm5,xmm3 movdqa xmm9,xmm0 movdqa xmm8,xmm0 psllq xmm0,5 pxor xmm8,xmm0 DB 102,15,58,68,218,0 psllq xmm0,1 pxor xmm0,xmm8 psllq xmm0,57 movdqa xmm8,xmm0 pslldq xmm0,8 psrldq xmm8,8 pxor xmm0,xmm9 pshufd xmm4,xmm5,78 pxor xmm1,xmm8 pxor xmm4,xmm5 movdqa xmm9,xmm0 psrlq xmm0,1 DB 102,15,58,68,234,17 pxor xmm1,xmm9 pxor xmm9,xmm0 psrlq xmm0,5 pxor xmm0,xmm9 lea r8,[32+r8] psrlq xmm0,1 DB 102,15,58,68,231,0 pxor xmm0,xmm1 sub r9,0x20 ja NEAR $L$mod_loop $L$even_tail: movdqa xmm1,xmm0 movdqa xmm8,xmm4 pshufd xmm4,xmm0,78 pxor xmm4,xmm0 DB 102,15,58,68,198,0 DB 102,15,58,68,206,17 DB 102,15,58,68,231,16 pxor xmm0,xmm3 pxor xmm1,xmm5 pxor xmm8,xmm0 pxor xmm8,xmm1 pxor xmm4,xmm8 movdqa xmm8,xmm4 psrldq xmm8,8 pslldq xmm4,8 pxor xmm1,xmm8 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 test r9,r9 jnz NEAR $L$done $L$odd_tail: movdqu xmm8,XMMWORD[r8] DB 102,69,15,56,0,194 pxor xmm0,xmm8 movdqa xmm1,xmm0 pshufd xmm3,xmm0,78 pxor xmm3,xmm0 DB 102,15,58,68,194,0 DB 102,15,58,68,202,17 DB 102,15,58,68,223,0 pxor xmm3,xmm0 pxor xmm3,xmm1 movdqa xmm4,xmm3 psrldq xmm3,8 pslldq xmm4,8 pxor xmm1,xmm3 pxor xmm0,xmm4 movdqa xmm4,xmm0 movdqa xmm3,xmm0 psllq xmm0,5 pxor xmm3,xmm0 psllq xmm0,1 pxor xmm0,xmm3 psllq xmm0,57 movdqa xmm3,xmm0 pslldq xmm0,8 psrldq xmm3,8 pxor xmm0,xmm4 pxor xmm1,xmm3 movdqa xmm4,xmm0 psrlq xmm0,1 pxor xmm1,xmm4 pxor xmm4,xmm0 psrlq xmm0,5 pxor xmm0,xmm4 psrlq xmm0,1 pxor xmm0,xmm1 $L$done: DB 102,65,15,56,0,194 movdqu XMMWORD[rcx],xmm0 movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] $L$SEH_end_GFp_gcm_ghash_clmul: DB 0F3h,0C3h ;repret global GFp_gcm_init_avx ALIGN 32 GFp_gcm_init_avx: $L$SEH_begin_GFp_gcm_init_avx: DB 0x48,0x83,0xec,0x18 DB 0x0f,0x29,0x34,0x24 vzeroupper vmovdqu xmm2,XMMWORD[rdx] vpshufd xmm2,xmm2,78 vpshufd xmm4,xmm2,255 vpsrlq xmm3,xmm2,63 vpsllq xmm2,xmm2,1 vpxor xmm5,xmm5,xmm5 vpcmpgtd xmm5,xmm5,xmm4 vpslldq xmm3,xmm3,8 vpor xmm2,xmm2,xmm3 vpand xmm5,xmm5,XMMWORD[$L$0x1c2_polynomial] vpxor xmm2,xmm2,xmm5 vpunpckhqdq xmm6,xmm2,xmm2 vmovdqa xmm0,xmm2 vpxor xmm6,xmm6,xmm2 mov r10,4 jmp NEAR $L$init_start_avx ALIGN 32 $L$init_loop_avx: vpalignr xmm5,xmm4,xmm3,8 vmovdqu XMMWORD[(-16)+rcx],xmm5 vpunpckhqdq xmm3,xmm0,xmm0 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm1,xmm0,xmm2,0x11 vpclmulqdq xmm0,xmm0,xmm2,0x00 vpclmulqdq xmm3,xmm3,xmm6,0x00 vpxor xmm4,xmm1,xmm0 vpxor xmm3,xmm3,xmm4 vpslldq xmm4,xmm3,8 vpsrldq xmm3,xmm3,8 vpxor xmm0,xmm0,xmm4 vpxor xmm1,xmm1,xmm3 vpsllq xmm3,xmm0,57 vpsllq xmm4,xmm0,62 vpxor xmm4,xmm4,xmm3 vpsllq xmm3,xmm0,63 vpxor xmm4,xmm4,xmm3 vpslldq xmm3,xmm4,8 vpsrldq xmm4,xmm4,8 vpxor xmm0,xmm0,xmm3 vpxor xmm1,xmm1,xmm4 vpsrlq xmm4,xmm0,1 vpxor xmm1,xmm1,xmm0 vpxor xmm0,xmm0,xmm4 vpsrlq xmm4,xmm4,5 vpxor xmm0,xmm0,xmm4 vpsrlq xmm0,xmm0,1 vpxor xmm0,xmm0,xmm1 $L$init_start_avx: vmovdqa xmm5,xmm0 vpunpckhqdq xmm3,xmm0,xmm0 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm1,xmm0,xmm2,0x11 vpclmulqdq xmm0,xmm0,xmm2,0x00 vpclmulqdq xmm3,xmm3,xmm6,0x00 vpxor xmm4,xmm1,xmm0 vpxor xmm3,xmm3,xmm4 vpslldq xmm4,xmm3,8 vpsrldq xmm3,xmm3,8 vpxor xmm0,xmm0,xmm4 vpxor xmm1,xmm1,xmm3 vpsllq xmm3,xmm0,57 vpsllq xmm4,xmm0,62 vpxor xmm4,xmm4,xmm3 vpsllq xmm3,xmm0,63 vpxor xmm4,xmm4,xmm3 vpslldq xmm3,xmm4,8 vpsrldq xmm4,xmm4,8 vpxor xmm0,xmm0,xmm3 vpxor xmm1,xmm1,xmm4 vpsrlq xmm4,xmm0,1 vpxor xmm1,xmm1,xmm0 vpxor xmm0,xmm0,xmm4 vpsrlq xmm4,xmm4,5 vpxor xmm0,xmm0,xmm4 vpsrlq xmm0,xmm0,1 vpxor xmm0,xmm0,xmm1 vpshufd xmm3,xmm5,78 vpshufd xmm4,xmm0,78 vpxor xmm3,xmm3,xmm5 vmovdqu XMMWORD[rcx],xmm5 vpxor xmm4,xmm4,xmm0 vmovdqu XMMWORD[16+rcx],xmm0 lea rcx,[48+rcx] sub r10,1 jnz NEAR $L$init_loop_avx vpalignr xmm5,xmm3,xmm4,8 vmovdqu XMMWORD[(-16)+rcx],xmm5 vzeroupper movaps xmm6,XMMWORD[rsp] lea rsp,[24+rsp] $L$SEH_end_GFp_gcm_init_avx: DB 0F3h,0C3h ;repret global GFp_gcm_ghash_avx ALIGN 32 GFp_gcm_ghash_avx: lea rax,[((-136))+rsp] $L$SEH_begin_GFp_gcm_ghash_avx: DB 0x48,0x8d,0x60,0xe0 DB 0x0f,0x29,0x70,0xe0 DB 0x0f,0x29,0x78,0xf0 DB 0x44,0x0f,0x29,0x00 DB 0x44,0x0f,0x29,0x48,0x10 DB 0x44,0x0f,0x29,0x50,0x20 DB 0x44,0x0f,0x29,0x58,0x30 DB 0x44,0x0f,0x29,0x60,0x40 DB 0x44,0x0f,0x29,0x68,0x50 DB 0x44,0x0f,0x29,0x70,0x60 DB 0x44,0x0f,0x29,0x78,0x70 vzeroupper vmovdqu xmm10,XMMWORD[rcx] lea r10,[$L$0x1c2_polynomial] lea rdx,[64+rdx] vmovdqu xmm13,XMMWORD[$L$bswap_mask] vpshufb xmm10,xmm10,xmm13 cmp r9,0x80 jb NEAR $L$short_avx sub r9,0x80 vmovdqu xmm14,XMMWORD[112+r8] vmovdqu xmm6,XMMWORD[((0-64))+rdx] vpshufb xmm14,xmm14,xmm13 vmovdqu xmm7,XMMWORD[((32-64))+rdx] vpunpckhqdq xmm9,xmm14,xmm14 vmovdqu xmm15,XMMWORD[96+r8] vpclmulqdq xmm0,xmm14,xmm6,0x00 vpxor xmm9,xmm9,xmm14 vpshufb xmm15,xmm15,xmm13 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((16-64))+rdx] vpunpckhqdq xmm8,xmm15,xmm15 vmovdqu xmm14,XMMWORD[80+r8] vpclmulqdq xmm2,xmm9,xmm7,0x00 vpxor xmm8,xmm8,xmm15 vpshufb xmm14,xmm14,xmm13 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpunpckhqdq xmm9,xmm14,xmm14 vpclmulqdq xmm4,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((48-64))+rdx] vpxor xmm9,xmm9,xmm14 vmovdqu xmm15,XMMWORD[64+r8] vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((80-64))+rdx] vpshufb xmm15,xmm15,xmm13 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm14,xmm6,0x00 vpxor xmm4,xmm4,xmm1 vpunpckhqdq xmm8,xmm15,xmm15 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((64-64))+rdx] vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm9,xmm7,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[48+r8] vpxor xmm0,xmm0,xmm3 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpxor xmm1,xmm1,xmm4 vpshufb xmm14,xmm14,xmm13 vpclmulqdq xmm4,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((96-64))+rdx] vpxor xmm2,xmm2,xmm5 vpunpckhqdq xmm9,xmm14,xmm14 vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((128-64))+rdx] vpxor xmm9,xmm9,xmm14 vmovdqu xmm15,XMMWORD[32+r8] vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm14,xmm6,0x00 vpxor xmm4,xmm4,xmm1 vpshufb xmm15,xmm15,xmm13 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((112-64))+rdx] vpxor xmm5,xmm5,xmm2 vpunpckhqdq xmm8,xmm15,xmm15 vpclmulqdq xmm2,xmm9,xmm7,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[16+r8] vpxor xmm0,xmm0,xmm3 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpxor xmm1,xmm1,xmm4 vpshufb xmm14,xmm14,xmm13 vpclmulqdq xmm4,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((144-64))+rdx] vpxor xmm2,xmm2,xmm5 vpunpckhqdq xmm9,xmm14,xmm14 vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((176-64))+rdx] vpxor xmm9,xmm9,xmm14 vmovdqu xmm15,XMMWORD[r8] vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm14,xmm6,0x00 vpxor xmm4,xmm4,xmm1 vpshufb xmm15,xmm15,xmm13 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((160-64))+rdx] vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm9,xmm7,0x10 lea r8,[128+r8] cmp r9,0x80 jb NEAR $L$tail_avx vpxor xmm15,xmm15,xmm10 sub r9,0x80 jmp NEAR $L$oop8x_avx ALIGN 32 $L$oop8x_avx: vpunpckhqdq xmm8,xmm15,xmm15 vmovdqu xmm14,XMMWORD[112+r8] vpxor xmm3,xmm3,xmm0 vpxor xmm8,xmm8,xmm15 vpclmulqdq xmm10,xmm15,xmm6,0x00 vpshufb xmm14,xmm14,xmm13 vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm11,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((0-64))+rdx] vpunpckhqdq xmm9,xmm14,xmm14 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm12,xmm8,xmm7,0x00 vmovdqu xmm7,XMMWORD[((32-64))+rdx] vpxor xmm9,xmm9,xmm14 vmovdqu xmm15,XMMWORD[96+r8] vpclmulqdq xmm0,xmm14,xmm6,0x00 vpxor xmm10,xmm10,xmm3 vpshufb xmm15,xmm15,xmm13 vpclmulqdq xmm1,xmm14,xmm6,0x11 vxorps xmm11,xmm11,xmm4 vmovdqu xmm6,XMMWORD[((16-64))+rdx] vpunpckhqdq xmm8,xmm15,xmm15 vpclmulqdq xmm2,xmm9,xmm7,0x00 vpxor xmm12,xmm12,xmm5 vxorps xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[80+r8] vpxor xmm12,xmm12,xmm10 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpxor xmm12,xmm12,xmm11 vpslldq xmm9,xmm12,8 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm4,xmm15,xmm6,0x11 vpsrldq xmm12,xmm12,8 vpxor xmm10,xmm10,xmm9 vmovdqu xmm6,XMMWORD[((48-64))+rdx] vpshufb xmm14,xmm14,xmm13 vxorps xmm11,xmm11,xmm12 vpxor xmm4,xmm4,xmm1 vpunpckhqdq xmm9,xmm14,xmm14 vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((80-64))+rdx] vpxor xmm9,xmm9,xmm14 vpxor xmm5,xmm5,xmm2 vmovdqu xmm15,XMMWORD[64+r8] vpalignr xmm12,xmm10,xmm10,8 vpclmulqdq xmm0,xmm14,xmm6,0x00 vpshufb xmm15,xmm15,xmm13 vpxor xmm0,xmm0,xmm3 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((64-64))+rdx] vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm1,xmm1,xmm4 vpclmulqdq xmm2,xmm9,xmm7,0x00 vxorps xmm8,xmm8,xmm15 vpxor xmm2,xmm2,xmm5 vmovdqu xmm14,XMMWORD[48+r8] vpclmulqdq xmm10,xmm10,XMMWORD[r10],0x10 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpshufb xmm14,xmm14,xmm13 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm4,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((96-64))+rdx] vpunpckhqdq xmm9,xmm14,xmm14 vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((128-64))+rdx] vpxor xmm9,xmm9,xmm14 vpxor xmm5,xmm5,xmm2 vmovdqu xmm15,XMMWORD[32+r8] vpclmulqdq xmm0,xmm14,xmm6,0x00 vpshufb xmm15,xmm15,xmm13 vpxor xmm0,xmm0,xmm3 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((112-64))+rdx] vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm1,xmm1,xmm4 vpclmulqdq xmm2,xmm9,xmm7,0x00 vpxor xmm8,xmm8,xmm15 vpxor xmm2,xmm2,xmm5 vxorps xmm10,xmm10,xmm12 vmovdqu xmm14,XMMWORD[16+r8] vpalignr xmm12,xmm10,xmm10,8 vpclmulqdq xmm3,xmm15,xmm6,0x00 vpshufb xmm14,xmm14,xmm13 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm4,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((144-64))+rdx] vpclmulqdq xmm10,xmm10,XMMWORD[r10],0x10 vxorps xmm12,xmm12,xmm11 vpunpckhqdq xmm9,xmm14,xmm14 vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm5,xmm8,xmm7,0x10 vmovdqu xmm7,XMMWORD[((176-64))+rdx] vpxor xmm9,xmm9,xmm14 vpxor xmm5,xmm5,xmm2 vmovdqu xmm15,XMMWORD[r8] vpclmulqdq xmm0,xmm14,xmm6,0x00 vpshufb xmm15,xmm15,xmm13 vpclmulqdq xmm1,xmm14,xmm6,0x11 vmovdqu xmm6,XMMWORD[((160-64))+rdx] vpxor xmm15,xmm15,xmm12 vpclmulqdq xmm2,xmm9,xmm7,0x10 vpxor xmm15,xmm15,xmm10 lea r8,[128+r8] sub r9,0x80 jnc NEAR $L$oop8x_avx add r9,0x80 jmp NEAR $L$tail_no_xor_avx ALIGN 32 $L$short_avx: vmovdqu xmm14,XMMWORD[((-16))+r9*1+r8] lea r8,[r9*1+r8] vmovdqu xmm6,XMMWORD[((0-64))+rdx] vmovdqu xmm7,XMMWORD[((32-64))+rdx] vpshufb xmm15,xmm14,xmm13 vmovdqa xmm3,xmm0 vmovdqa xmm4,xmm1 vmovdqa xmm5,xmm2 sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-32))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((16-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vpsrldq xmm7,xmm7,8 sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-48))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((48-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vmovdqu xmm7,XMMWORD[((80-64))+rdx] sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-64))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((64-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vpsrldq xmm7,xmm7,8 sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-80))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((96-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vmovdqu xmm7,XMMWORD[((128-64))+rdx] sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-96))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((112-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vpsrldq xmm7,xmm7,8 sub r9,0x10 jz NEAR $L$tail_avx vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vmovdqu xmm14,XMMWORD[((-112))+r8] vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vmovdqu xmm6,XMMWORD[((144-64))+rdx] vpshufb xmm15,xmm14,xmm13 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vmovq xmm7,QWORD[((184-64))+rdx] sub r9,0x10 jmp NEAR $L$tail_avx ALIGN 32 $L$tail_avx: vpxor xmm15,xmm15,xmm10 $L$tail_no_xor_avx: vpunpckhqdq xmm8,xmm15,xmm15 vpxor xmm3,xmm3,xmm0 vpclmulqdq xmm0,xmm15,xmm6,0x00 vpxor xmm8,xmm8,xmm15 vpxor xmm4,xmm4,xmm1 vpclmulqdq xmm1,xmm15,xmm6,0x11 vpxor xmm5,xmm5,xmm2 vpclmulqdq xmm2,xmm8,xmm7,0x00 vmovdqu xmm12,XMMWORD[r10] vpxor xmm10,xmm3,xmm0 vpxor xmm11,xmm4,xmm1 vpxor xmm5,xmm5,xmm2 vpxor xmm5,xmm5,xmm10 vpxor xmm5,xmm5,xmm11 vpslldq xmm9,xmm5,8 vpsrldq xmm5,xmm5,8 vpxor xmm10,xmm10,xmm9 vpxor xmm11,xmm11,xmm5 vpclmulqdq xmm9,xmm10,xmm12,0x10 vpalignr xmm10,xmm10,xmm10,8 vpxor xmm10,xmm10,xmm9 vpclmulqdq xmm9,xmm10,xmm12,0x10 vpalignr xmm10,xmm10,xmm10,8 vpxor xmm10,xmm10,xmm11 vpxor xmm10,xmm10,xmm9 cmp r9,0 jne NEAR $L$short_avx vpshufb xmm10,xmm10,xmm13 vmovdqu XMMWORD[rcx],xmm10 vzeroupper movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] $L$SEH_end_GFp_gcm_ghash_avx: DB 0F3h,0C3h ;repret ALIGN 64 $L$bswap_mask: DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$0x1c2_polynomial: DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 $L$7_mask: DD 7,0,7,0 DB 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52 DB 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 DB 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 DB 114,103,62,0 ALIGN 64 EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_prologue lea rax,[((48+280))+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$in_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_gcm_init_clmul wrt ..imagebase DD $L$SEH_end_GFp_gcm_init_clmul wrt ..imagebase DD $L$SEH_info_GFp_gcm_init_clmul wrt ..imagebase DD $L$SEH_begin_GFp_gcm_ghash_clmul wrt ..imagebase DD $L$SEH_end_GFp_gcm_ghash_clmul wrt ..imagebase DD $L$SEH_info_GFp_gcm_ghash_clmul wrt ..imagebase DD $L$SEH_begin_GFp_gcm_init_avx wrt ..imagebase DD $L$SEH_end_GFp_gcm_init_avx wrt ..imagebase DD $L$SEH_info_GFp_gcm_init_clmul wrt ..imagebase DD $L$SEH_begin_GFp_gcm_ghash_avx wrt ..imagebase DD $L$SEH_end_GFp_gcm_ghash_avx wrt ..imagebase DD $L$SEH_info_GFp_gcm_ghash_clmul wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_gcm_init_clmul: DB 0x01,0x08,0x03,0x00 DB 0x08,0x68,0x00,0x00 DB 0x04,0x22,0x00,0x00 $L$SEH_info_GFp_gcm_ghash_clmul: DB 0x01,0x33,0x16,0x00 DB 0x33,0xf8,0x09,0x00 DB 0x2e,0xe8,0x08,0x00 DB 0x29,0xd8,0x07,0x00 DB 0x24,0xc8,0x06,0x00 DB 0x1f,0xb8,0x05,0x00 DB 0x1a,0xa8,0x04,0x00 DB 0x15,0x98,0x03,0x00 DB 0x10,0x88,0x02,0x00 DB 0x0c,0x78,0x01,0x00 DB 0x08,0x68,0x00,0x00 DB 0x04,0x01,0x15,0x00 ring-0.16.9/pregenerated/tmp/p256-x86_64-asm-nasm.asm000064400000000000000000002416541353224260100200570ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P ALIGN 64 $L$poly: DQ 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 $L$One: DD 1,1,1,1,1,1,1,1 $L$Two: DD 2,2,2,2,2,2,2,2 $L$Three: DD 3,3,3,3,3,3,3,3 $L$ONE_mont: DQ 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe $L$ord: DQ 0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000 $L$ordK: DQ 0xccd1c8aaee00bc4f global GFp_nistz256_add ALIGN 32 GFp_nistz256_add: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_add: mov rdi,rcx mov rsi,rdx mov rdx,r8 push r12 push r13 mov r8,QWORD[rsi] xor r13,r13 mov r9,QWORD[8+rsi] mov r10,QWORD[16+rsi] mov r11,QWORD[24+rsi] lea rsi,[$L$poly] add r8,QWORD[rdx] adc r9,QWORD[8+rdx] mov rax,r8 adc r10,QWORD[16+rdx] adc r11,QWORD[24+rdx] mov rdx,r9 adc r13,0 sub r8,QWORD[rsi] mov rcx,r10 sbb r9,QWORD[8+rsi] sbb r10,QWORD[16+rsi] mov r12,r11 sbb r11,QWORD[24+rsi] sbb r13,0 cmovc r8,rax cmovc r9,rdx mov QWORD[rdi],r8 cmovc r10,rcx mov QWORD[8+rdi],r9 cmovc r11,r12 mov QWORD[16+rdi],r10 mov QWORD[24+rdi],r11 pop r13 pop r12 mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_add: global GFp_nistz256_neg ALIGN 32 GFp_nistz256_neg: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_neg: mov rdi,rcx mov rsi,rdx push r12 push r13 $L$neg_body: xor r8,r8 xor r9,r9 xor r10,r10 xor r11,r11 xor r13,r13 sub r8,QWORD[rsi] sbb r9,QWORD[8+rsi] sbb r10,QWORD[16+rsi] mov rax,r8 sbb r11,QWORD[24+rsi] lea rsi,[$L$poly] mov rdx,r9 sbb r13,0 add r8,QWORD[rsi] mov rcx,r10 adc r9,QWORD[8+rsi] adc r10,QWORD[16+rsi] mov r12,r11 adc r11,QWORD[24+rsi] test r13,r13 cmovz r8,rax cmovz r9,rdx mov QWORD[rdi],r8 cmovz r10,rcx mov QWORD[8+rdi],r9 cmovz r11,r12 mov QWORD[16+rdi],r10 mov QWORD[24+rdi],r11 mov r13,QWORD[rsp] mov r12,QWORD[8+rsp] lea rsp,[16+rsp] $L$neg_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_neg: global GFp_p256_scalar_mul_mont ALIGN 32 GFp_p256_scalar_mul_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_p256_scalar_mul_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 cmp ecx,0x80100 je NEAR $L$ecp_nistz256_ord_mul_montx push rbp push rbx push r12 push r13 push r14 push r15 $L$ord_mul_body: mov rax,QWORD[rdx] mov rbx,rdx lea r14,[$L$ord] mov r15,QWORD[$L$ordK] mov rcx,rax mul QWORD[rsi] mov r8,rax mov rax,rcx mov r9,rdx mul QWORD[8+rsi] add r9,rax mov rax,rcx adc rdx,0 mov r10,rdx mul QWORD[16+rsi] add r10,rax mov rax,rcx adc rdx,0 mov r13,r8 imul r8,r15 mov r11,rdx mul QWORD[24+rsi] add r11,rax mov rax,r8 adc rdx,0 mov r12,rdx mul QWORD[r14] mov rbp,r8 add r13,rax mov rax,r8 adc rdx,0 mov rcx,rdx sub r10,r8 sbb r8,0 mul QWORD[8+r14] add r9,rcx adc rdx,0 add r9,rax mov rax,rbp adc r10,rdx mov rdx,rbp adc r8,0 shl rax,32 shr rdx,32 sub r11,rax mov rax,QWORD[8+rbx] sbb rbp,rdx add r11,r8 adc r12,rbp adc r13,0 mov rcx,rax mul QWORD[rsi] add r9,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[8+rsi] add r10,rbp adc rdx,0 add r10,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[16+rsi] add r11,rbp adc rdx,0 add r11,rax mov rax,rcx adc rdx,0 mov rcx,r9 imul r9,r15 mov rbp,rdx mul QWORD[24+rsi] add r12,rbp adc rdx,0 xor r8,r8 add r12,rax mov rax,r9 adc r13,rdx adc r8,0 mul QWORD[r14] mov rbp,r9 add rcx,rax mov rax,r9 adc rcx,rdx sub r11,r9 sbb r9,0 mul QWORD[8+r14] add r10,rcx adc rdx,0 add r10,rax mov rax,rbp adc r11,rdx mov rdx,rbp adc r9,0 shl rax,32 shr rdx,32 sub r12,rax mov rax,QWORD[16+rbx] sbb rbp,rdx add r12,r9 adc r13,rbp adc r8,0 mov rcx,rax mul QWORD[rsi] add r10,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[8+rsi] add r11,rbp adc rdx,0 add r11,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[16+rsi] add r12,rbp adc rdx,0 add r12,rax mov rax,rcx adc rdx,0 mov rcx,r10 imul r10,r15 mov rbp,rdx mul QWORD[24+rsi] add r13,rbp adc rdx,0 xor r9,r9 add r13,rax mov rax,r10 adc r8,rdx adc r9,0 mul QWORD[r14] mov rbp,r10 add rcx,rax mov rax,r10 adc rcx,rdx sub r12,r10 sbb r10,0 mul QWORD[8+r14] add r11,rcx adc rdx,0 add r11,rax mov rax,rbp adc r12,rdx mov rdx,rbp adc r10,0 shl rax,32 shr rdx,32 sub r13,rax mov rax,QWORD[24+rbx] sbb rbp,rdx add r13,r10 adc r8,rbp adc r9,0 mov rcx,rax mul QWORD[rsi] add r11,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[8+rsi] add r12,rbp adc rdx,0 add r12,rax mov rax,rcx adc rdx,0 mov rbp,rdx mul QWORD[16+rsi] add r13,rbp adc rdx,0 add r13,rax mov rax,rcx adc rdx,0 mov rcx,r11 imul r11,r15 mov rbp,rdx mul QWORD[24+rsi] add r8,rbp adc rdx,0 xor r10,r10 add r8,rax mov rax,r11 adc r9,rdx adc r10,0 mul QWORD[r14] mov rbp,r11 add rcx,rax mov rax,r11 adc rcx,rdx sub r13,r11 sbb r11,0 mul QWORD[8+r14] add r12,rcx adc rdx,0 add r12,rax mov rax,rbp adc r13,rdx mov rdx,rbp adc r11,0 shl rax,32 shr rdx,32 sub r8,rax sbb rbp,rdx add r8,r11 adc r9,rbp adc r10,0 mov rsi,r12 sub r12,QWORD[r14] mov r11,r13 sbb r13,QWORD[8+r14] mov rcx,r8 sbb r8,QWORD[16+r14] mov rbp,r9 sbb r9,QWORD[24+r14] sbb r10,0 cmovc r12,rsi cmovc r13,r11 cmovc r8,rcx cmovc r9,rbp mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$ord_mul_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_p256_scalar_mul_mont: global GFp_p256_scalar_sqr_rep_mont ALIGN 32 GFp_p256_scalar_sqr_rep_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_p256_scalar_sqr_rep_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 cmp ecx,0x80100 je NEAR $L$ecp_nistz256_ord_sqr_montx push rbp push rbx push r12 push r13 push r14 push r15 $L$ord_sqr_body: mov r8,QWORD[rsi] mov rax,QWORD[8+rsi] mov r14,QWORD[16+rsi] mov r15,QWORD[24+rsi] lea rsi,[$L$ord] mov rbx,rdx jmp NEAR $L$oop_ord_sqr ALIGN 32 $L$oop_ord_sqr: mov rbp,rax mul r8 mov r9,rax DB 102,72,15,110,205 mov rax,r14 mov r10,rdx mul r8 add r10,rax mov rax,r15 DB 102,73,15,110,214 adc rdx,0 mov r11,rdx mul r8 add r11,rax mov rax,r15 DB 102,73,15,110,223 adc rdx,0 mov r12,rdx mul r14 mov r13,rax mov rax,r14 mov r14,rdx mul rbp add r11,rax mov rax,r15 adc rdx,0 mov r15,rdx mul rbp add r12,rax adc rdx,0 add r12,r15 adc r13,rdx adc r14,0 xor r15,r15 mov rax,r8 add r9,r9 adc r10,r10 adc r11,r11 adc r12,r12 adc r13,r13 adc r14,r14 adc r15,0 mul rax mov r8,rax DB 102,72,15,126,200 mov rbp,rdx mul rax add r9,rbp adc r10,rax DB 102,72,15,126,208 adc rdx,0 mov rbp,rdx mul rax add r11,rbp adc r12,rax DB 102,72,15,126,216 adc rdx,0 mov rbp,rdx mov rcx,r8 imul r8,QWORD[32+rsi] mul rax add r13,rbp adc r14,rax mov rax,QWORD[rsi] adc r15,rdx mul r8 mov rbp,r8 add rcx,rax mov rax,QWORD[8+rsi] adc rcx,rdx sub r10,r8 sbb rbp,0 mul r8 add r9,rcx adc rdx,0 add r9,rax mov rax,r8 adc r10,rdx mov rdx,r8 adc rbp,0 mov rcx,r9 imul r9,QWORD[32+rsi] shl rax,32 shr rdx,32 sub r11,rax mov rax,QWORD[rsi] sbb r8,rdx add r11,rbp adc r8,0 mul r9 mov rbp,r9 add rcx,rax mov rax,QWORD[8+rsi] adc rcx,rdx sub r11,r9 sbb rbp,0 mul r9 add r10,rcx adc rdx,0 add r10,rax mov rax,r9 adc r11,rdx mov rdx,r9 adc rbp,0 mov rcx,r10 imul r10,QWORD[32+rsi] shl rax,32 shr rdx,32 sub r8,rax mov rax,QWORD[rsi] sbb r9,rdx add r8,rbp adc r9,0 mul r10 mov rbp,r10 add rcx,rax mov rax,QWORD[8+rsi] adc rcx,rdx sub r8,r10 sbb rbp,0 mul r10 add r11,rcx adc rdx,0 add r11,rax mov rax,r10 adc r8,rdx mov rdx,r10 adc rbp,0 mov rcx,r11 imul r11,QWORD[32+rsi] shl rax,32 shr rdx,32 sub r9,rax mov rax,QWORD[rsi] sbb r10,rdx add r9,rbp adc r10,0 mul r11 mov rbp,r11 add rcx,rax mov rax,QWORD[8+rsi] adc rcx,rdx sub r9,r11 sbb rbp,0 mul r11 add r8,rcx adc rdx,0 add r8,rax mov rax,r11 adc r9,rdx mov rdx,r11 adc rbp,0 shl rax,32 shr rdx,32 sub r10,rax sbb r11,rdx add r10,rbp adc r11,0 xor rdx,rdx add r8,r12 adc r9,r13 mov r12,r8 adc r10,r14 adc r11,r15 mov rax,r9 adc rdx,0 sub r8,QWORD[rsi] mov r14,r10 sbb r9,QWORD[8+rsi] sbb r10,QWORD[16+rsi] mov r15,r11 sbb r11,QWORD[24+rsi] sbb rdx,0 cmovc r8,r12 cmovnc rax,r9 cmovnc r14,r10 cmovnc r15,r11 dec rbx jnz NEAR $L$oop_ord_sqr mov QWORD[rdi],r8 mov QWORD[8+rdi],rax pxor xmm1,xmm1 mov QWORD[16+rdi],r14 pxor xmm2,xmm2 mov QWORD[24+rdi],r15 pxor xmm3,xmm3 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$ord_sqr_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_p256_scalar_sqr_rep_mont: ALIGN 32 ecp_nistz256_ord_mul_montx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_ecp_nistz256_ord_mul_montx: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$ecp_nistz256_ord_mul_montx: push rbp push rbx push r12 push r13 push r14 push r15 $L$ord_mulx_body: mov rbx,rdx mov rdx,QWORD[rdx] mov r9,QWORD[rsi] mov r10,QWORD[8+rsi] mov r11,QWORD[16+rsi] mov r12,QWORD[24+rsi] lea rsi,[((-128))+rsi] lea r14,[(($L$ord-128))] mov r15,QWORD[$L$ordK] mulx r9,r8,r9 mulx r10,rcx,r10 mulx r11,rbp,r11 add r9,rcx mulx r12,rcx,r12 mov rdx,r8 mulx rax,rdx,r15 adc r10,rbp adc r11,rcx adc r12,0 xor r13,r13 mulx rbp,rcx,QWORD[((0+128))+r14] adcx r8,rcx adox r9,rbp mulx rbp,rcx,QWORD[((8+128))+r14] adcx r9,rcx adox r10,rbp mulx rbp,rcx,QWORD[((16+128))+r14] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((24+128))+r14] mov rdx,QWORD[8+rbx] adcx r11,rcx adox r12,rbp adcx r12,r8 adox r13,r8 adc r13,0 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r9,rcx adox r10,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r9 mulx rax,rdx,r15 adcx r12,rcx adox r13,rbp adcx r13,r8 adox r8,r8 adc r8,0 mulx rbp,rcx,QWORD[((0+128))+r14] adcx r9,rcx adox r10,rbp mulx rbp,rcx,QWORD[((8+128))+r14] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((16+128))+r14] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((24+128))+r14] mov rdx,QWORD[16+rbx] adcx r12,rcx adox r13,rbp adcx r13,r9 adox r8,r9 adc r8,0 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r10 mulx rax,rdx,r15 adcx r13,rcx adox r8,rbp adcx r8,r9 adox r9,r9 adc r9,0 mulx rbp,rcx,QWORD[((0+128))+r14] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((8+128))+r14] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((16+128))+r14] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((24+128))+r14] mov rdx,QWORD[24+rbx] adcx r13,rcx adox r8,rbp adcx r8,r10 adox r9,r10 adc r9,0 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r13,rcx adox r8,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r11 mulx rax,rdx,r15 adcx r8,rcx adox r9,rbp adcx r9,r10 adox r10,r10 adc r10,0 mulx rbp,rcx,QWORD[((0+128))+r14] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((8+128))+r14] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((16+128))+r14] adcx r13,rcx adox r8,rbp mulx rbp,rcx,QWORD[((24+128))+r14] lea r14,[128+r14] mov rbx,r12 adcx r8,rcx adox r9,rbp mov rdx,r13 adcx r9,r11 adox r10,r11 adc r10,0 mov rcx,r8 sub r12,QWORD[r14] sbb r13,QWORD[8+r14] sbb r8,QWORD[16+r14] mov rbp,r9 sbb r9,QWORD[24+r14] sbb r10,0 cmovc r12,rbx cmovc r13,rdx cmovc r8,rcx cmovc r9,rbp mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$ord_mulx_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_ecp_nistz256_ord_mul_montx: ALIGN 32 ecp_nistz256_ord_sqr_montx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_ecp_nistz256_ord_sqr_montx: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$ecp_nistz256_ord_sqr_montx: push rbp push rbx push r12 push r13 push r14 push r15 $L$ord_sqrx_body: mov rbx,rdx mov rdx,QWORD[rsi] mov r14,QWORD[8+rsi] mov r15,QWORD[16+rsi] mov r8,QWORD[24+rsi] lea rsi,[$L$ord] jmp NEAR $L$oop_ord_sqrx ALIGN 32 $L$oop_ord_sqrx: mulx r10,r9,r14 mulx r11,rcx,r15 mov rax,rdx DB 102,73,15,110,206 mulx r12,rbp,r8 mov rdx,r14 add r10,rcx DB 102,73,15,110,215 adc r11,rbp adc r12,0 xor r13,r13 mulx rbp,rcx,r15 adcx r11,rcx adox r12,rbp mulx rbp,rcx,r8 mov rdx,r15 adcx r12,rcx adox r13,rbp adc r13,0 mulx r14,rcx,r8 mov rdx,rax DB 102,73,15,110,216 xor r15,r15 adcx r9,r9 adox r13,rcx adcx r10,r10 adox r14,r15 mulx rbp,r8,rdx DB 102,72,15,126,202 adcx r11,r11 adox r9,rbp adcx r12,r12 mulx rax,rcx,rdx DB 102,72,15,126,210 adcx r13,r13 adox r10,rcx adcx r14,r14 mulx rbp,rcx,rdx DB 0x67 DB 102,72,15,126,218 adox r11,rax adcx r15,r15 adox r12,rcx adox r13,rbp mulx rax,rcx,rdx adox r14,rcx adox r15,rax mov rdx,r8 mulx rcx,rdx,QWORD[32+rsi] xor rax,rax mulx rbp,rcx,QWORD[rsi] adcx r8,rcx adox r9,rbp mulx rbp,rcx,QWORD[8+rsi] adcx r9,rcx adox r10,rbp mulx rbp,rcx,QWORD[16+rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[24+rsi] adcx r11,rcx adox r8,rbp adcx r8,rax mov rdx,r9 mulx rcx,rdx,QWORD[32+rsi] mulx rbp,rcx,QWORD[rsi] adox r9,rcx adcx r10,rbp mulx rbp,rcx,QWORD[8+rsi] adox r10,rcx adcx r11,rbp mulx rbp,rcx,QWORD[16+rsi] adox r11,rcx adcx r8,rbp mulx rbp,rcx,QWORD[24+rsi] adox r8,rcx adcx r9,rbp adox r9,rax mov rdx,r10 mulx rcx,rdx,QWORD[32+rsi] mulx rbp,rcx,QWORD[rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[8+rsi] adcx r11,rcx adox r8,rbp mulx rbp,rcx,QWORD[16+rsi] adcx r8,rcx adox r9,rbp mulx rbp,rcx,QWORD[24+rsi] adcx r9,rcx adox r10,rbp adcx r10,rax mov rdx,r11 mulx rcx,rdx,QWORD[32+rsi] mulx rbp,rcx,QWORD[rsi] adox r11,rcx adcx r8,rbp mulx rbp,rcx,QWORD[8+rsi] adox r8,rcx adcx r9,rbp mulx rbp,rcx,QWORD[16+rsi] adox r9,rcx adcx r10,rbp mulx rbp,rcx,QWORD[24+rsi] adox r10,rcx adcx r11,rbp adox r11,rax add r12,r8 adc r9,r13 mov rdx,r12 adc r10,r14 adc r11,r15 mov r14,r9 adc rax,0 sub r12,QWORD[rsi] mov r15,r10 sbb r9,QWORD[8+rsi] sbb r10,QWORD[16+rsi] mov r8,r11 sbb r11,QWORD[24+rsi] sbb rax,0 cmovnc rdx,r12 cmovnc r14,r9 cmovnc r15,r10 cmovnc r8,r11 dec rbx jnz NEAR $L$oop_ord_sqrx mov QWORD[rdi],rdx mov QWORD[8+rdi],r14 pxor xmm1,xmm1 mov QWORD[16+rdi],r15 pxor xmm2,xmm2 mov QWORD[24+rdi],r8 pxor xmm3,xmm3 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$ord_sqrx_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_ecp_nistz256_ord_sqr_montx: global GFp_nistz256_mul_mont ALIGN 32 GFp_nistz256_mul_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_mul_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 $L$mul_mont: push rbp push rbx push r12 push r13 push r14 push r15 $L$mul_body: cmp ecx,0x80100 je NEAR $L$mul_montx mov rbx,rdx mov rax,QWORD[rdx] mov r9,QWORD[rsi] mov r10,QWORD[8+rsi] mov r11,QWORD[16+rsi] mov r12,QWORD[24+rsi] call __ecp_nistz256_mul_montq jmp NEAR $L$mul_mont_done ALIGN 32 $L$mul_montx: mov rbx,rdx mov rdx,QWORD[rdx] mov r9,QWORD[rsi] mov r10,QWORD[8+rsi] mov r11,QWORD[16+rsi] mov r12,QWORD[24+rsi] lea rsi,[((-128))+rsi] call __ecp_nistz256_mul_montx $L$mul_mont_done: mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$mul_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_mul_mont: ALIGN 32 __ecp_nistz256_mul_montq: mov rbp,rax mul r9 mov r14,QWORD[(($L$poly+8))] mov r8,rax mov rax,rbp mov r9,rdx mul r10 mov r15,QWORD[(($L$poly+24))] add r9,rax mov rax,rbp adc rdx,0 mov r10,rdx mul r11 add r10,rax mov rax,rbp adc rdx,0 mov r11,rdx mul r12 add r11,rax mov rax,r8 adc rdx,0 xor r13,r13 mov r12,rdx mov rbp,r8 shl r8,32 mul r15 shr rbp,32 add r9,r8 adc r10,rbp adc r11,rax mov rax,QWORD[8+rbx] adc r12,rdx adc r13,0 xor r8,r8 mov rbp,rax mul QWORD[rsi] add r9,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[8+rsi] add r10,rcx adc rdx,0 add r10,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[16+rsi] add r11,rcx adc rdx,0 add r11,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[24+rsi] add r12,rcx adc rdx,0 add r12,rax mov rax,r9 adc r13,rdx adc r8,0 mov rbp,r9 shl r9,32 mul r15 shr rbp,32 add r10,r9 adc r11,rbp adc r12,rax mov rax,QWORD[16+rbx] adc r13,rdx adc r8,0 xor r9,r9 mov rbp,rax mul QWORD[rsi] add r10,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[8+rsi] add r11,rcx adc rdx,0 add r11,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[16+rsi] add r12,rcx adc rdx,0 add r12,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[24+rsi] add r13,rcx adc rdx,0 add r13,rax mov rax,r10 adc r8,rdx adc r9,0 mov rbp,r10 shl r10,32 mul r15 shr rbp,32 add r11,r10 adc r12,rbp adc r13,rax mov rax,QWORD[24+rbx] adc r8,rdx adc r9,0 xor r10,r10 mov rbp,rax mul QWORD[rsi] add r11,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[8+rsi] add r12,rcx adc rdx,0 add r12,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[16+rsi] add r13,rcx adc rdx,0 add r13,rax mov rax,rbp adc rdx,0 mov rcx,rdx mul QWORD[24+rsi] add r8,rcx adc rdx,0 add r8,rax mov rax,r11 adc r9,rdx adc r10,0 mov rbp,r11 shl r11,32 mul r15 shr rbp,32 add r12,r11 adc r13,rbp mov rcx,r12 adc r8,rax adc r9,rdx mov rbp,r13 adc r10,0 sub r12,-1 mov rbx,r8 sbb r13,r14 sbb r8,0 mov rdx,r9 sbb r9,r15 sbb r10,0 cmovc r12,rcx cmovc r13,rbp mov QWORD[rdi],r12 cmovc r8,rbx mov QWORD[8+rdi],r13 cmovc r9,rdx mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret global GFp_nistz256_sqr_mont ALIGN 32 GFp_nistz256_sqr_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_sqr_mont: mov rdi,rcx mov rsi,rdx lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 push rbp push rbx push r12 push r13 push r14 push r15 $L$sqr_body: cmp ecx,0x80100 je NEAR $L$sqr_montx mov rax,QWORD[rsi] mov r14,QWORD[8+rsi] mov r15,QWORD[16+rsi] mov r8,QWORD[24+rsi] call __ecp_nistz256_sqr_montq jmp NEAR $L$sqr_mont_done ALIGN 32 $L$sqr_montx: mov rdx,QWORD[rsi] mov r14,QWORD[8+rsi] mov r15,QWORD[16+rsi] mov r8,QWORD[24+rsi] lea rsi,[((-128))+rsi] call __ecp_nistz256_sqr_montx $L$sqr_mont_done: mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbx,QWORD[32+rsp] mov rbp,QWORD[40+rsp] lea rsp,[48+rsp] $L$sqr_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_sqr_mont: ALIGN 32 __ecp_nistz256_sqr_montq: mov r13,rax mul r14 mov r9,rax mov rax,r15 mov r10,rdx mul r13 add r10,rax mov rax,r8 adc rdx,0 mov r11,rdx mul r13 add r11,rax mov rax,r15 adc rdx,0 mov r12,rdx mul r14 add r11,rax mov rax,r8 adc rdx,0 mov rbp,rdx mul r14 add r12,rax mov rax,r8 adc rdx,0 add r12,rbp mov r13,rdx adc r13,0 mul r15 xor r15,r15 add r13,rax mov rax,QWORD[rsi] mov r14,rdx adc r14,0 add r9,r9 adc r10,r10 adc r11,r11 adc r12,r12 adc r13,r13 adc r14,r14 adc r15,0 mul rax mov r8,rax mov rax,QWORD[8+rsi] mov rcx,rdx mul rax add r9,rcx adc r10,rax mov rax,QWORD[16+rsi] adc rdx,0 mov rcx,rdx mul rax add r11,rcx adc r12,rax mov rax,QWORD[24+rsi] adc rdx,0 mov rcx,rdx mul rax add r13,rcx adc r14,rax mov rax,r8 adc r15,rdx mov rsi,QWORD[(($L$poly+8))] mov rbp,QWORD[(($L$poly+24))] mov rcx,r8 shl r8,32 mul rbp shr rcx,32 add r9,r8 adc r10,rcx adc r11,rax mov rax,r9 adc rdx,0 mov rcx,r9 shl r9,32 mov r8,rdx mul rbp shr rcx,32 add r10,r9 adc r11,rcx adc r8,rax mov rax,r10 adc rdx,0 mov rcx,r10 shl r10,32 mov r9,rdx mul rbp shr rcx,32 add r11,r10 adc r8,rcx adc r9,rax mov rax,r11 adc rdx,0 mov rcx,r11 shl r11,32 mov r10,rdx mul rbp shr rcx,32 add r8,r11 adc r9,rcx adc r10,rax adc rdx,0 xor r11,r11 add r12,r8 adc r13,r9 mov r8,r12 adc r14,r10 adc r15,rdx mov r9,r13 adc r11,0 sub r12,-1 mov r10,r14 sbb r13,rsi sbb r14,0 mov rcx,r15 sbb r15,rbp sbb r11,0 cmovc r12,r8 cmovc r13,r9 mov QWORD[rdi],r12 cmovc r14,r10 mov QWORD[8+rdi],r13 cmovc r15,rcx mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_mul_montx: mulx r9,r8,r9 mulx r10,rcx,r10 mov r14,32 xor r13,r13 mulx r11,rbp,r11 mov r15,QWORD[(($L$poly+24))] adc r9,rcx mulx r12,rcx,r12 mov rdx,r8 adc r10,rbp shlx rbp,r8,r14 adc r11,rcx shrx rcx,r8,r14 adc r12,0 add r9,rbp adc r10,rcx mulx rbp,rcx,r15 mov rdx,QWORD[8+rbx] adc r11,rcx adc r12,rbp adc r13,0 xor r8,r8 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r9,rcx adox r10,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r9 adcx r12,rcx shlx rcx,r9,r14 adox r13,rbp shrx rbp,r9,r14 adcx r13,r8 adox r8,r8 adc r8,0 add r10,rcx adc r11,rbp mulx rbp,rcx,r15 mov rdx,QWORD[16+rbx] adc r12,rcx adc r13,rbp adc r8,0 xor r9,r9 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r10,rcx adox r11,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r10 adcx r13,rcx shlx rcx,r10,r14 adox r8,rbp shrx rbp,r10,r14 adcx r8,r9 adox r9,r9 adc r9,0 add r11,rcx adc r12,rbp mulx rbp,rcx,r15 mov rdx,QWORD[24+rbx] adc r13,rcx adc r8,rbp adc r9,0 xor r10,r10 mulx rbp,rcx,QWORD[((0+128))+rsi] adcx r11,rcx adox r12,rbp mulx rbp,rcx,QWORD[((8+128))+rsi] adcx r12,rcx adox r13,rbp mulx rbp,rcx,QWORD[((16+128))+rsi] adcx r13,rcx adox r8,rbp mulx rbp,rcx,QWORD[((24+128))+rsi] mov rdx,r11 adcx r8,rcx shlx rcx,r11,r14 adox r9,rbp shrx rbp,r11,r14 adcx r9,r10 adox r10,r10 adc r10,0 add r12,rcx adc r13,rbp mulx rbp,rcx,r15 mov rbx,r12 mov r14,QWORD[(($L$poly+8))] adc r8,rcx mov rdx,r13 adc r9,rbp adc r10,0 xor eax,eax mov rcx,r8 sbb r12,-1 sbb r13,r14 sbb r8,0 mov rbp,r9 sbb r9,r15 sbb r10,0 cmovc r12,rbx cmovc r13,rdx mov QWORD[rdi],r12 cmovc r8,rcx mov QWORD[8+rdi],r13 cmovc r9,rbp mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_sqr_montx: mulx r10,r9,r14 mulx r11,rcx,r15 xor eax,eax adc r10,rcx mulx r12,rbp,r8 mov rdx,r14 adc r11,rbp adc r12,0 xor r13,r13 mulx rbp,rcx,r15 adcx r11,rcx adox r12,rbp mulx rbp,rcx,r8 mov rdx,r15 adcx r12,rcx adox r13,rbp adc r13,0 mulx r14,rcx,r8 mov rdx,QWORD[((0+128))+rsi] xor r15,r15 adcx r9,r9 adox r13,rcx adcx r10,r10 adox r14,r15 mulx rbp,r8,rdx mov rdx,QWORD[((8+128))+rsi] adcx r11,r11 adox r9,rbp adcx r12,r12 mulx rax,rcx,rdx mov rdx,QWORD[((16+128))+rsi] adcx r13,r13 adox r10,rcx adcx r14,r14 DB 0x67 mulx rbp,rcx,rdx mov rdx,QWORD[((24+128))+rsi] adox r11,rax adcx r15,r15 adox r12,rcx mov rsi,32 adox r13,rbp DB 0x67,0x67 mulx rax,rcx,rdx mov rdx,QWORD[(($L$poly+24))] adox r14,rcx shlx rcx,r8,rsi adox r15,rax shrx rax,r8,rsi mov rbp,rdx add r9,rcx adc r10,rax mulx r8,rcx,r8 adc r11,rcx shlx rcx,r9,rsi adc r8,0 shrx rax,r9,rsi add r10,rcx adc r11,rax mulx r9,rcx,r9 adc r8,rcx shlx rcx,r10,rsi adc r9,0 shrx rax,r10,rsi add r11,rcx adc r8,rax mulx r10,rcx,r10 adc r9,rcx shlx rcx,r11,rsi adc r10,0 shrx rax,r11,rsi add r8,rcx adc r9,rax mulx r11,rcx,r11 adc r10,rcx adc r11,0 xor rdx,rdx add r12,r8 mov rsi,QWORD[(($L$poly+8))] adc r13,r9 mov r8,r12 adc r14,r10 adc r15,r11 mov r9,r13 adc rdx,0 sub r12,-1 mov r10,r14 sbb r13,rsi sbb r14,0 mov r11,r15 sbb r15,rbp sbb rdx,0 cmovc r12,r8 cmovc r13,r9 mov QWORD[rdi],r12 cmovc r14,r10 mov QWORD[8+rdi],r13 cmovc r15,r11 mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 DB 0F3h,0C3h ;repret global GFp_nistz256_select_w5 ALIGN 32 GFp_nistz256_select_w5: lea rax,[GFp_ia32cap_P] mov rax,QWORD[8+rax] test eax,32 jnz NEAR $L$avx2_select_w5 lea rax,[((-136))+rsp] $L$SEH_begin_GFp_nistz256_select_w5: DB 0x48,0x8d,0x60,0xe0 DB 0x0f,0x29,0x70,0xe0 DB 0x0f,0x29,0x78,0xf0 DB 0x44,0x0f,0x29,0x00 DB 0x44,0x0f,0x29,0x48,0x10 DB 0x44,0x0f,0x29,0x50,0x20 DB 0x44,0x0f,0x29,0x58,0x30 DB 0x44,0x0f,0x29,0x60,0x40 DB 0x44,0x0f,0x29,0x68,0x50 DB 0x44,0x0f,0x29,0x70,0x60 DB 0x44,0x0f,0x29,0x78,0x70 movdqa xmm0,XMMWORD[$L$One] movd xmm1,r8d pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 pxor xmm6,xmm6 pxor xmm7,xmm7 movdqa xmm8,xmm0 pshufd xmm1,xmm1,0 mov rax,16 $L$select_loop_sse_w5: movdqa xmm15,xmm8 paddd xmm8,xmm0 pcmpeqd xmm15,xmm1 movdqa xmm9,XMMWORD[rdx] movdqa xmm10,XMMWORD[16+rdx] movdqa xmm11,XMMWORD[32+rdx] movdqa xmm12,XMMWORD[48+rdx] movdqa xmm13,XMMWORD[64+rdx] movdqa xmm14,XMMWORD[80+rdx] lea rdx,[96+rdx] pand xmm9,xmm15 pand xmm10,xmm15 por xmm2,xmm9 pand xmm11,xmm15 por xmm3,xmm10 pand xmm12,xmm15 por xmm4,xmm11 pand xmm13,xmm15 por xmm5,xmm12 pand xmm14,xmm15 por xmm6,xmm13 por xmm7,xmm14 dec rax jnz NEAR $L$select_loop_sse_w5 movdqu XMMWORD[rcx],xmm2 movdqu XMMWORD[16+rcx],xmm3 movdqu XMMWORD[32+rcx],xmm4 movdqu XMMWORD[48+rcx],xmm5 movdqu XMMWORD[64+rcx],xmm6 movdqu XMMWORD[80+rcx],xmm7 movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_select_w5: global GFp_nistz256_select_w7 ALIGN 32 GFp_nistz256_select_w7: lea rax,[GFp_ia32cap_P] mov rax,QWORD[8+rax] test eax,32 jnz NEAR $L$avx2_select_w7 lea rax,[((-136))+rsp] $L$SEH_begin_GFp_nistz256_select_w7: DB 0x48,0x8d,0x60,0xe0 DB 0x0f,0x29,0x70,0xe0 DB 0x0f,0x29,0x78,0xf0 DB 0x44,0x0f,0x29,0x00 DB 0x44,0x0f,0x29,0x48,0x10 DB 0x44,0x0f,0x29,0x50,0x20 DB 0x44,0x0f,0x29,0x58,0x30 DB 0x44,0x0f,0x29,0x60,0x40 DB 0x44,0x0f,0x29,0x68,0x50 DB 0x44,0x0f,0x29,0x70,0x60 DB 0x44,0x0f,0x29,0x78,0x70 movdqa xmm8,XMMWORD[$L$One] movd xmm1,r8d pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 movdqa xmm0,xmm8 pshufd xmm1,xmm1,0 mov rax,64 $L$select_loop_sse_w7: movdqa xmm15,xmm8 paddd xmm8,xmm0 movdqa xmm9,XMMWORD[rdx] movdqa xmm10,XMMWORD[16+rdx] pcmpeqd xmm15,xmm1 movdqa xmm11,XMMWORD[32+rdx] movdqa xmm12,XMMWORD[48+rdx] lea rdx,[64+rdx] pand xmm9,xmm15 pand xmm10,xmm15 por xmm2,xmm9 pand xmm11,xmm15 por xmm3,xmm10 pand xmm12,xmm15 por xmm4,xmm11 prefetcht0 [255+rdx] por xmm5,xmm12 dec rax jnz NEAR $L$select_loop_sse_w7 movdqu XMMWORD[rcx],xmm2 movdqu XMMWORD[16+rcx],xmm3 movdqu XMMWORD[32+rcx],xmm4 movdqu XMMWORD[48+rcx],xmm5 movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_select_w7: ALIGN 32 GFp_nistz256_avx2_select_w5: $L$avx2_select_w5: vzeroupper lea rax,[((-136))+rsp] mov r11,rsp $L$SEH_begin_GFp_nistz256_avx2_select_w5: DB 0x48,0x8d,0x60,0xe0 DB 0xc5,0xf8,0x29,0x70,0xe0 DB 0xc5,0xf8,0x29,0x78,0xf0 DB 0xc5,0x78,0x29,0x40,0x00 DB 0xc5,0x78,0x29,0x48,0x10 DB 0xc5,0x78,0x29,0x50,0x20 DB 0xc5,0x78,0x29,0x58,0x30 DB 0xc5,0x78,0x29,0x60,0x40 DB 0xc5,0x78,0x29,0x68,0x50 DB 0xc5,0x78,0x29,0x70,0x60 DB 0xc5,0x78,0x29,0x78,0x70 vmovdqa ymm0,YMMWORD[$L$Two] vpxor ymm2,ymm2,ymm2 vpxor ymm3,ymm3,ymm3 vpxor ymm4,ymm4,ymm4 vmovdqa ymm5,YMMWORD[$L$One] vmovdqa ymm10,YMMWORD[$L$Two] vmovd xmm1,r8d vpermd ymm1,ymm2,ymm1 mov rax,8 $L$select_loop_avx2_w5: vmovdqa ymm6,YMMWORD[rdx] vmovdqa ymm7,YMMWORD[32+rdx] vmovdqa ymm8,YMMWORD[64+rdx] vmovdqa ymm11,YMMWORD[96+rdx] vmovdqa ymm12,YMMWORD[128+rdx] vmovdqa ymm13,YMMWORD[160+rdx] vpcmpeqd ymm9,ymm5,ymm1 vpcmpeqd ymm14,ymm10,ymm1 vpaddd ymm5,ymm5,ymm0 vpaddd ymm10,ymm10,ymm0 lea rdx,[192+rdx] vpand ymm6,ymm6,ymm9 vpand ymm7,ymm7,ymm9 vpand ymm8,ymm8,ymm9 vpand ymm11,ymm11,ymm14 vpand ymm12,ymm12,ymm14 vpand ymm13,ymm13,ymm14 vpxor ymm2,ymm2,ymm6 vpxor ymm3,ymm3,ymm7 vpxor ymm4,ymm4,ymm8 vpxor ymm2,ymm2,ymm11 vpxor ymm3,ymm3,ymm12 vpxor ymm4,ymm4,ymm13 dec rax jnz NEAR $L$select_loop_avx2_w5 vmovdqu YMMWORD[rcx],ymm2 vmovdqu YMMWORD[32+rcx],ymm3 vmovdqu YMMWORD[64+rcx],ymm4 vzeroupper movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[r11] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_avx2_select_w5: global GFp_nistz256_avx2_select_w7 ALIGN 32 GFp_nistz256_avx2_select_w7: $L$avx2_select_w7: vzeroupper mov r11,rsp lea rax,[((-136))+rsp] $L$SEH_begin_GFp_nistz256_avx2_select_w7: DB 0x48,0x8d,0x60,0xe0 DB 0xc5,0xf8,0x29,0x70,0xe0 DB 0xc5,0xf8,0x29,0x78,0xf0 DB 0xc5,0x78,0x29,0x40,0x00 DB 0xc5,0x78,0x29,0x48,0x10 DB 0xc5,0x78,0x29,0x50,0x20 DB 0xc5,0x78,0x29,0x58,0x30 DB 0xc5,0x78,0x29,0x60,0x40 DB 0xc5,0x78,0x29,0x68,0x50 DB 0xc5,0x78,0x29,0x70,0x60 DB 0xc5,0x78,0x29,0x78,0x70 vmovdqa ymm0,YMMWORD[$L$Three] vpxor ymm2,ymm2,ymm2 vpxor ymm3,ymm3,ymm3 vmovdqa ymm4,YMMWORD[$L$One] vmovdqa ymm8,YMMWORD[$L$Two] vmovdqa ymm12,YMMWORD[$L$Three] vmovd xmm1,r8d vpermd ymm1,ymm2,ymm1 mov rax,21 $L$select_loop_avx2_w7: vmovdqa ymm5,YMMWORD[rdx] vmovdqa ymm6,YMMWORD[32+rdx] vmovdqa ymm9,YMMWORD[64+rdx] vmovdqa ymm10,YMMWORD[96+rdx] vmovdqa ymm13,YMMWORD[128+rdx] vmovdqa ymm14,YMMWORD[160+rdx] vpcmpeqd ymm7,ymm4,ymm1 vpcmpeqd ymm11,ymm8,ymm1 vpcmpeqd ymm15,ymm12,ymm1 vpaddd ymm4,ymm4,ymm0 vpaddd ymm8,ymm8,ymm0 vpaddd ymm12,ymm12,ymm0 lea rdx,[192+rdx] vpand ymm5,ymm5,ymm7 vpand ymm6,ymm6,ymm7 vpand ymm9,ymm9,ymm11 vpand ymm10,ymm10,ymm11 vpand ymm13,ymm13,ymm15 vpand ymm14,ymm14,ymm15 vpxor ymm2,ymm2,ymm5 vpxor ymm3,ymm3,ymm6 vpxor ymm2,ymm2,ymm9 vpxor ymm3,ymm3,ymm10 vpxor ymm2,ymm2,ymm13 vpxor ymm3,ymm3,ymm14 dec rax jnz NEAR $L$select_loop_avx2_w7 vmovdqa ymm5,YMMWORD[rdx] vmovdqa ymm6,YMMWORD[32+rdx] vpcmpeqd ymm7,ymm4,ymm1 vpand ymm5,ymm5,ymm7 vpand ymm6,ymm6,ymm7 vpxor ymm2,ymm2,ymm5 vpxor ymm3,ymm3,ymm6 vmovdqu YMMWORD[rcx],ymm2 vmovdqu YMMWORD[32+rcx],ymm3 vzeroupper movaps xmm6,XMMWORD[rsp] movaps xmm7,XMMWORD[16+rsp] movaps xmm8,XMMWORD[32+rsp] movaps xmm9,XMMWORD[48+rsp] movaps xmm10,XMMWORD[64+rsp] movaps xmm11,XMMWORD[80+rsp] movaps xmm12,XMMWORD[96+rsp] movaps xmm13,XMMWORD[112+rsp] movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[r11] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_avx2_select_w7: ALIGN 32 __ecp_nistz256_add_toq: xor r11,r11 add r12,QWORD[rbx] adc r13,QWORD[8+rbx] mov rax,r12 adc r8,QWORD[16+rbx] adc r9,QWORD[24+rbx] mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax cmovc r13,rbp mov QWORD[rdi],r12 cmovc r8,rcx mov QWORD[8+rdi],r13 cmovc r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_sub_fromq: sub r12,QWORD[rbx] sbb r13,QWORD[8+rbx] mov rax,r12 sbb r8,QWORD[16+rbx] sbb r9,QWORD[24+rbx] mov rbp,r13 sbb r11,r11 add r12,-1 mov rcx,r8 adc r13,r14 adc r8,0 mov r10,r9 adc r9,r15 test r11,r11 cmovz r12,rax cmovz r13,rbp mov QWORD[rdi],r12 cmovz r8,rcx mov QWORD[8+rdi],r13 cmovz r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_subq: sub rax,r12 sbb rbp,r13 mov r12,rax sbb rcx,r8 sbb r10,r9 mov r13,rbp sbb r11,r11 add rax,-1 mov r8,rcx adc rbp,r14 adc rcx,0 mov r9,r10 adc r10,r15 test r11,r11 cmovnz r12,rax cmovnz r13,rbp cmovnz r8,rcx cmovnz r9,r10 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_mul_by_2q: xor r11,r11 add r12,r12 adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax cmovc r13,rbp mov QWORD[rdi],r12 cmovc r8,rcx mov QWORD[8+rdi],r13 cmovc r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret global GFp_nistz256_point_double ALIGN 32 GFp_nistz256_point_double: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_double: mov rdi,rcx mov rsi,rdx lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 cmp ecx,0x80100 je NEAR $L$point_doublex push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*5+8 $L$point_doubleq_body: $L$point_double_shortcutq: movdqu xmm0,XMMWORD[rsi] mov rbx,rsi movdqu xmm1,XMMWORD[16+rsi] mov r12,QWORD[((32+0))+rsi] mov r13,QWORD[((32+8))+rsi] mov r8,QWORD[((32+16))+rsi] mov r9,QWORD[((32+24))+rsi] mov r14,QWORD[(($L$poly+8))] mov r15,QWORD[(($L$poly+24))] movdqa XMMWORD[96+rsp],xmm0 movdqa XMMWORD[(96+16)+rsp],xmm1 lea r10,[32+rdi] lea r11,[64+rdi] DB 102,72,15,110,199 DB 102,73,15,110,202 DB 102,73,15,110,211 lea rdi,[rsp] call __ecp_nistz256_mul_by_2q mov rax,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] lea rsi,[((64-0))+rsi] lea rdi,[64+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((0+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] lea rdi,[rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[32+rbx] mov r9,QWORD[((64+0))+rbx] mov r10,QWORD[((64+8))+rbx] mov r11,QWORD[((64+16))+rbx] mov r12,QWORD[((64+24))+rbx] lea rsi,[((64-0))+rbx] lea rbx,[32+rbx] DB 102,72,15,126,215 call __ecp_nistz256_mul_montq call __ecp_nistz256_mul_by_2q mov r12,QWORD[((96+0))+rsp] mov r13,QWORD[((96+8))+rsp] lea rbx,[64+rsp] mov r8,QWORD[((96+16))+rsp] mov r9,QWORD[((96+24))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_add_toq mov r12,QWORD[((96+0))+rsp] mov r13,QWORD[((96+8))+rsp] lea rbx,[64+rsp] mov r8,QWORD[((96+16))+rsp] mov r9,QWORD[((96+24))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromq mov rax,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((0+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] DB 102,72,15,126,207 call __ecp_nistz256_sqr_montq xor r9,r9 mov rax,r12 add r12,-1 mov r10,r13 adc r13,rsi mov rcx,r14 adc r14,0 mov r8,r15 adc r15,rbp adc r9,0 xor rsi,rsi test rax,1 cmovz r12,rax cmovz r13,r10 cmovz r14,rcx cmovz r15,r8 cmovz r9,rsi mov rax,r13 shr r12,1 shl rax,63 mov r10,r14 shr r13,1 or r12,rax shl r10,63 mov rcx,r15 shr r14,1 or r13,r10 shl rcx,63 mov QWORD[rdi],r12 shr r15,1 mov QWORD[8+rdi],r13 shl r9,63 or r14,rcx or r15,r9 mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 mov rax,QWORD[64+rsp] lea rbx,[64+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montq lea rdi,[128+rsp] call __ecp_nistz256_mul_by_2q lea rbx,[32+rsp] lea rdi,[32+rsp] call __ecp_nistz256_add_toq mov rax,QWORD[96+rsp] lea rbx,[96+rsp] mov r9,QWORD[((0+0))+rsp] mov r10,QWORD[((8+0))+rsp] lea rsi,[((0+0))+rsp] mov r11,QWORD[((16+0))+rsp] mov r12,QWORD[((24+0))+rsp] lea rdi,[rsp] call __ecp_nistz256_mul_montq lea rdi,[128+rsp] call __ecp_nistz256_mul_by_2q mov rax,QWORD[((0+32))+rsp] mov r14,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r15,QWORD[((16+32))+rsp] mov r8,QWORD[((24+32))+rsp] DB 102,72,15,126,199 call __ecp_nistz256_sqr_montq lea rbx,[128+rsp] mov r8,r14 mov r9,r15 mov r14,rsi mov r15,rbp call __ecp_nistz256_sub_fromq mov rax,QWORD[((0+0))+rsp] mov rbp,QWORD[((0+8))+rsp] mov rcx,QWORD[((0+16))+rsp] mov r10,QWORD[((0+24))+rsp] lea rdi,[rsp] call __ecp_nistz256_subq mov rax,QWORD[32+rsp] lea rbx,[32+rsp] mov r14,r12 xor ecx,ecx mov QWORD[((0+0))+rsp],r12 mov r10,r13 mov QWORD[((0+8))+rsp],r13 cmovz r11,r8 mov QWORD[((0+16))+rsp],r8 lea rsi,[((0-0))+rsp] cmovz r12,r9 mov QWORD[((0+24))+rsp],r9 mov r9,r14 lea rdi,[rsp] call __ecp_nistz256_mul_montq DB 102,72,15,126,203 DB 102,72,15,126,207 call __ecp_nistz256_sub_fromq lea rsi,[((160+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$point_doubleq_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_double: global GFp_nistz256_point_add ALIGN 32 GFp_nistz256_point_add: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_add: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 cmp ecx,0x80100 je NEAR $L$point_addx push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*18+8 $L$point_addq_body: movdqu xmm0,XMMWORD[rsi] movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm3,XMMWORD[48+rsi] movdqu xmm4,XMMWORD[64+rsi] movdqu xmm5,XMMWORD[80+rsi] mov rbx,rsi mov rsi,rdx movdqa XMMWORD[384+rsp],xmm0 movdqa XMMWORD[(384+16)+rsp],xmm1 movdqa XMMWORD[416+rsp],xmm2 movdqa XMMWORD[(416+16)+rsp],xmm3 movdqa XMMWORD[448+rsp],xmm4 movdqa XMMWORD[(448+16)+rsp],xmm5 por xmm5,xmm4 movdqu xmm0,XMMWORD[rsi] pshufd xmm3,xmm5,0xb1 movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] por xmm5,xmm3 movdqu xmm3,XMMWORD[48+rsi] mov rax,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] movdqa XMMWORD[480+rsp],xmm0 pshufd xmm4,xmm5,0x1e movdqa XMMWORD[(480+16)+rsp],xmm1 movdqu xmm0,XMMWORD[64+rsi] movdqu xmm1,XMMWORD[80+rsi] movdqa XMMWORD[512+rsp],xmm2 movdqa XMMWORD[(512+16)+rsp],xmm3 por xmm5,xmm4 pxor xmm4,xmm4 por xmm1,xmm0 DB 102,72,15,110,199 lea rsi,[((64-0))+rsi] mov QWORD[((544+0))+rsp],rax mov QWORD[((544+8))+rsp],r14 mov QWORD[((544+16))+rsp],r15 mov QWORD[((544+24))+rsp],r8 lea rdi,[96+rsp] call __ecp_nistz256_sqr_montq pcmpeqd xmm5,xmm4 pshufd xmm4,xmm1,0xb1 por xmm4,xmm1 pshufd xmm5,xmm5,0 pshufd xmm3,xmm4,0x1e por xmm4,xmm3 pxor xmm3,xmm3 pcmpeqd xmm4,xmm3 pshufd xmm4,xmm4,0 mov rax,QWORD[((64+0))+rbx] mov r14,QWORD[((64+8))+rbx] mov r15,QWORD[((64+16))+rbx] mov r8,QWORD[((64+24))+rbx] DB 102,72,15,110,203 lea rsi,[((64-0))+rbx] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[544+rsp] lea rbx,[544+rsp] mov r9,QWORD[((0+96))+rsp] mov r10,QWORD[((8+96))+rsp] lea rsi,[((0+96))+rsp] mov r11,QWORD[((16+96))+rsp] mov r12,QWORD[((24+96))+rsp] lea rdi,[224+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[416+rsp] lea rbx,[416+rsp] mov r9,QWORD[((0+224))+rsp] mov r10,QWORD[((8+224))+rsp] lea rsi,[((0+224))+rsp] mov r11,QWORD[((16+224))+rsp] mov r12,QWORD[((24+224))+rsp] lea rdi,[224+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[512+rsp] lea rbx,[512+rsp] mov r9,QWORD[((0+256))+rsp] mov r10,QWORD[((8+256))+rsp] lea rsi,[((0+256))+rsp] mov r11,QWORD[((16+256))+rsp] mov r12,QWORD[((24+256))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montq lea rbx,[224+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromq or r12,r13 movdqa xmm2,xmm4 or r12,r8 or r12,r9 por xmm2,xmm5 DB 102,73,15,110,220 mov rax,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+96))+rsp] mov r10,QWORD[((8+96))+rsp] lea rsi,[((0+96))+rsp] mov r11,QWORD[((16+96))+rsp] mov r12,QWORD[((24+96))+rsp] lea rdi,[160+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[480+rsp] lea rbx,[480+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_mul_montq lea rbx,[160+rsp] lea rdi,[rsp] call __ecp_nistz256_sub_fromq or r12,r13 or r12,r8 or r12,r9 DB 102,73,15,126,208 DB 102,73,15,126,217 or r12,r8 DB 0x3e jnz NEAR $L$add_proceedq test r9,r9 jz NEAR $L$add_doubleq DB 102,72,15,126,199 pxor xmm0,xmm0 movdqu XMMWORD[rdi],xmm0 movdqu XMMWORD[16+rdi],xmm0 movdqu XMMWORD[32+rdi],xmm0 movdqu XMMWORD[48+rdi],xmm0 movdqu XMMWORD[64+rdi],xmm0 movdqu XMMWORD[80+rdi],xmm0 jmp NEAR $L$add_doneq ALIGN 32 $L$add_doubleq: DB 102,72,15,126,206 DB 102,72,15,126,199 add rsp,416 jmp NEAR $L$point_double_shortcutq ALIGN 32 $L$add_proceedq: mov rax,QWORD[((0+64))+rsp] mov r14,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r15,QWORD[((16+64))+rsp] mov r8,QWORD[((24+64))+rsp] lea rdi,[96+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+0))+rsp] mov r10,QWORD[((8+0))+rsp] lea rsi,[((0+0))+rsp] mov r11,QWORD[((16+0))+rsp] mov r12,QWORD[((24+0))+rsp] lea rdi,[352+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((0+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[544+rsp] lea rbx,[544+rsp] mov r9,QWORD[((0+352))+rsp] mov r10,QWORD[((8+352))+rsp] lea rsi,[((0+352))+rsp] mov r11,QWORD[((16+352))+rsp] mov r12,QWORD[((24+352))+rsp] lea rdi,[352+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[rsp] lea rbx,[rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[128+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[160+rsp] lea rbx,[160+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_mul_montq xor r11,r11 add r12,r12 lea rsi,[96+rsp] adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax mov rax,QWORD[rsi] cmovc r13,rbp mov rbp,QWORD[8+rsi] cmovc r8,rcx mov rcx,QWORD[16+rsi] cmovc r9,r10 mov r10,QWORD[24+rsi] call __ecp_nistz256_subq lea rbx,[128+rsp] lea rdi,[288+rsp] call __ecp_nistz256_sub_fromq mov rax,QWORD[((192+0))+rsp] mov rbp,QWORD[((192+8))+rsp] mov rcx,QWORD[((192+16))+rsp] mov r10,QWORD[((192+24))+rsp] lea rdi,[320+rsp] call __ecp_nistz256_subq mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov rax,QWORD[128+rsp] lea rbx,[128+rsp] mov r9,QWORD[((0+224))+rsp] mov r10,QWORD[((8+224))+rsp] lea rsi,[((0+224))+rsp] mov r11,QWORD[((16+224))+rsp] mov r12,QWORD[((24+224))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[320+rsp] lea rbx,[320+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[320+rsp] call __ecp_nistz256_mul_montq lea rbx,[256+rsp] lea rdi,[320+rsp] call __ecp_nistz256_sub_fromq DB 102,72,15,126,199 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[352+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((352+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[544+rsp] pand xmm3,XMMWORD[((544+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[448+rsp] pand xmm3,XMMWORD[((448+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[64+rdi],xmm2 movdqu XMMWORD[80+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[288+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((288+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[480+rsp] pand xmm3,XMMWORD[((480+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[384+rsp] pand xmm3,XMMWORD[((384+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[rdi],xmm2 movdqu XMMWORD[16+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[320+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((320+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[512+rsp] pand xmm3,XMMWORD[((512+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[416+rsp] pand xmm3,XMMWORD[((416+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm3 $L$add_doneq: lea rsi,[((576+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$point_addq_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_add: global GFp_nistz256_point_add_affine ALIGN 32 GFp_nistz256_point_add_affine: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_add_affine: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rcx,[GFp_ia32cap_P] mov rcx,QWORD[8+rcx] and ecx,0x80100 cmp ecx,0x80100 je NEAR $L$point_add_affinex push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*15+8 $L$add_affineq_body: movdqu xmm0,XMMWORD[rsi] mov rbx,rdx movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm3,XMMWORD[48+rsi] movdqu xmm4,XMMWORD[64+rsi] movdqu xmm5,XMMWORD[80+rsi] mov rax,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] movdqa XMMWORD[320+rsp],xmm0 movdqa XMMWORD[(320+16)+rsp],xmm1 movdqa XMMWORD[352+rsp],xmm2 movdqa XMMWORD[(352+16)+rsp],xmm3 movdqa XMMWORD[384+rsp],xmm4 movdqa XMMWORD[(384+16)+rsp],xmm5 por xmm5,xmm4 movdqu xmm0,XMMWORD[rbx] pshufd xmm3,xmm5,0xb1 movdqu xmm1,XMMWORD[16+rbx] movdqu xmm2,XMMWORD[32+rbx] por xmm5,xmm3 movdqu xmm3,XMMWORD[48+rbx] movdqa XMMWORD[416+rsp],xmm0 pshufd xmm4,xmm5,0x1e movdqa XMMWORD[(416+16)+rsp],xmm1 por xmm1,xmm0 DB 102,72,15,110,199 movdqa XMMWORD[448+rsp],xmm2 movdqa XMMWORD[(448+16)+rsp],xmm3 por xmm3,xmm2 por xmm5,xmm4 pxor xmm4,xmm4 por xmm3,xmm1 lea rsi,[((64-0))+rsi] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montq pcmpeqd xmm5,xmm4 pshufd xmm4,xmm3,0xb1 mov rax,QWORD[rbx] mov r9,r12 por xmm4,xmm3 pshufd xmm5,xmm5,0 pshufd xmm3,xmm4,0x1e mov r10,r13 por xmm4,xmm3 pxor xmm3,xmm3 mov r11,r14 pcmpeqd xmm4,xmm3 pshufd xmm4,xmm4,0 lea rsi,[((32-0))+rsp] mov r12,r15 lea rdi,[rsp] call __ecp_nistz256_mul_montq lea rbx,[320+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromq mov rax,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[288+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((0+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montq lea rbx,[352+rsp] lea rdi,[96+rsp] call __ecp_nistz256_sub_fromq mov rax,QWORD[((0+64))+rsp] mov r14,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r15,QWORD[((16+64))+rsp] mov r8,QWORD[((24+64))+rsp] lea rdi,[128+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[((0+96))+rsp] mov r14,QWORD[((8+96))+rsp] lea rsi,[((0+96))+rsp] mov r15,QWORD[((16+96))+rsp] mov r8,QWORD[((24+96))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_sqr_montq mov rax,QWORD[128+rsp] lea rbx,[128+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[160+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[320+rsp] lea rbx,[320+rsp] mov r9,QWORD[((0+128))+rsp] mov r10,QWORD[((8+128))+rsp] lea rsi,[((0+128))+rsp] mov r11,QWORD[((16+128))+rsp] mov r12,QWORD[((24+128))+rsp] lea rdi,[rsp] call __ecp_nistz256_mul_montq xor r11,r11 add r12,r12 lea rsi,[192+rsp] adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax mov rax,QWORD[rsi] cmovc r13,rbp mov rbp,QWORD[8+rsi] cmovc r8,rcx mov rcx,QWORD[16+rsi] cmovc r9,r10 mov r10,QWORD[24+rsi] call __ecp_nistz256_subq lea rbx,[160+rsp] lea rdi,[224+rsp] call __ecp_nistz256_sub_fromq mov rax,QWORD[((0+0))+rsp] mov rbp,QWORD[((0+8))+rsp] mov rcx,QWORD[((0+16))+rsp] mov r10,QWORD[((0+24))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_subq mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov rax,QWORD[352+rsp] lea rbx,[352+rsp] mov r9,QWORD[((0+160))+rsp] mov r10,QWORD[((8+160))+rsp] lea rsi,[((0+160))+rsp] mov r11,QWORD[((16+160))+rsp] mov r12,QWORD[((24+160))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montq mov rax,QWORD[96+rsp] lea rbx,[96+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((0+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_mul_montq lea rbx,[32+rsp] lea rdi,[256+rsp] call __ecp_nistz256_sub_fromq DB 102,72,15,126,199 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[288+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((288+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[$L$ONE_mont] pand xmm3,XMMWORD[(($L$ONE_mont+16))] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[384+rsp] pand xmm3,XMMWORD[((384+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[64+rdi],xmm2 movdqu XMMWORD[80+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[224+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((224+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[416+rsp] pand xmm3,XMMWORD[((416+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[320+rsp] pand xmm3,XMMWORD[((320+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[rdi],xmm2 movdqu XMMWORD[16+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[256+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((256+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[448+rsp] pand xmm3,XMMWORD[((448+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[352+rsp] pand xmm3,XMMWORD[((352+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm3 lea rsi,[((480+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$add_affineq_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_add_affine: ALIGN 32 __ecp_nistz256_add_tox: xor r11,r11 adc r12,QWORD[rbx] adc r13,QWORD[8+rbx] mov rax,r12 adc r8,QWORD[16+rbx] adc r9,QWORD[24+rbx] mov rbp,r13 adc r11,0 xor r10,r10 sbb r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax cmovc r13,rbp mov QWORD[rdi],r12 cmovc r8,rcx mov QWORD[8+rdi],r13 cmovc r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_sub_fromx: xor r11,r11 sbb r12,QWORD[rbx] sbb r13,QWORD[8+rbx] mov rax,r12 sbb r8,QWORD[16+rbx] sbb r9,QWORD[24+rbx] mov rbp,r13 sbb r11,0 xor r10,r10 adc r12,-1 mov rcx,r8 adc r13,r14 adc r8,0 mov r10,r9 adc r9,r15 bt r11,0 cmovnc r12,rax cmovnc r13,rbp mov QWORD[rdi],r12 cmovnc r8,rcx mov QWORD[8+rdi],r13 cmovnc r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_subx: xor r11,r11 sbb rax,r12 sbb rbp,r13 mov r12,rax sbb rcx,r8 sbb r10,r9 mov r13,rbp sbb r11,0 xor r9,r9 adc rax,-1 mov r8,rcx adc rbp,r14 adc rcx,0 mov r9,r10 adc r10,r15 bt r11,0 cmovc r12,rax cmovc r13,rbp cmovc r8,rcx cmovc r9,r10 DB 0F3h,0C3h ;repret ALIGN 32 __ecp_nistz256_mul_by_2x: xor r11,r11 adc r12,r12 adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 xor r10,r10 sbb r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax cmovc r13,rbp mov QWORD[rdi],r12 cmovc r8,rcx mov QWORD[8+rdi],r13 cmovc r9,r10 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 DB 0F3h,0C3h ;repret ALIGN 32 GFp_nistz256_point_doublex: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_doublex: mov rdi,rcx mov rsi,rdx $L$point_doublex: push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*5+8 $L$point_doublex_body: $L$point_double_shortcutx: movdqu xmm0,XMMWORD[rsi] mov rbx,rsi movdqu xmm1,XMMWORD[16+rsi] mov r12,QWORD[((32+0))+rsi] mov r13,QWORD[((32+8))+rsi] mov r8,QWORD[((32+16))+rsi] mov r9,QWORD[((32+24))+rsi] mov r14,QWORD[(($L$poly+8))] mov r15,QWORD[(($L$poly+24))] movdqa XMMWORD[96+rsp],xmm0 movdqa XMMWORD[(96+16)+rsp],xmm1 lea r10,[32+rdi] lea r11,[64+rdi] DB 102,72,15,110,199 DB 102,73,15,110,202 DB 102,73,15,110,211 lea rdi,[rsp] call __ecp_nistz256_mul_by_2x mov rdx,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] lea rsi,[((64-128))+rsi] lea rdi,[64+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((-128+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] lea rdi,[rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[32+rbx] mov r9,QWORD[((64+0))+rbx] mov r10,QWORD[((64+8))+rbx] mov r11,QWORD[((64+16))+rbx] mov r12,QWORD[((64+24))+rbx] lea rsi,[((64-128))+rbx] lea rbx,[32+rbx] DB 102,72,15,126,215 call __ecp_nistz256_mul_montx call __ecp_nistz256_mul_by_2x mov r12,QWORD[((96+0))+rsp] mov r13,QWORD[((96+8))+rsp] lea rbx,[64+rsp] mov r8,QWORD[((96+16))+rsp] mov r9,QWORD[((96+24))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_add_tox mov r12,QWORD[((96+0))+rsp] mov r13,QWORD[((96+8))+rsp] lea rbx,[64+rsp] mov r8,QWORD[((96+16))+rsp] mov r9,QWORD[((96+24))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromx mov rdx,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((-128+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] DB 102,72,15,126,207 call __ecp_nistz256_sqr_montx xor r9,r9 mov rax,r12 add r12,-1 mov r10,r13 adc r13,rsi mov rcx,r14 adc r14,0 mov r8,r15 adc r15,rbp adc r9,0 xor rsi,rsi test rax,1 cmovz r12,rax cmovz r13,r10 cmovz r14,rcx cmovz r15,r8 cmovz r9,rsi mov rax,r13 shr r12,1 shl rax,63 mov r10,r14 shr r13,1 or r12,rax shl r10,63 mov rcx,r15 shr r14,1 or r13,r10 shl rcx,63 mov QWORD[rdi],r12 shr r15,1 mov QWORD[8+rdi],r13 shl r9,63 or r14,rcx or r15,r9 mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 mov rdx,QWORD[64+rsp] lea rbx,[64+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montx lea rdi,[128+rsp] call __ecp_nistz256_mul_by_2x lea rbx,[32+rsp] lea rdi,[32+rsp] call __ecp_nistz256_add_tox mov rdx,QWORD[96+rsp] lea rbx,[96+rsp] mov r9,QWORD[((0+0))+rsp] mov r10,QWORD[((8+0))+rsp] lea rsi,[((-128+0))+rsp] mov r11,QWORD[((16+0))+rsp] mov r12,QWORD[((24+0))+rsp] lea rdi,[rsp] call __ecp_nistz256_mul_montx lea rdi,[128+rsp] call __ecp_nistz256_mul_by_2x mov rdx,QWORD[((0+32))+rsp] mov r14,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r15,QWORD[((16+32))+rsp] mov r8,QWORD[((24+32))+rsp] DB 102,72,15,126,199 call __ecp_nistz256_sqr_montx lea rbx,[128+rsp] mov r8,r14 mov r9,r15 mov r14,rsi mov r15,rbp call __ecp_nistz256_sub_fromx mov rax,QWORD[((0+0))+rsp] mov rbp,QWORD[((0+8))+rsp] mov rcx,QWORD[((0+16))+rsp] mov r10,QWORD[((0+24))+rsp] lea rdi,[rsp] call __ecp_nistz256_subx mov rdx,QWORD[32+rsp] lea rbx,[32+rsp] mov r14,r12 xor ecx,ecx mov QWORD[((0+0))+rsp],r12 mov r10,r13 mov QWORD[((0+8))+rsp],r13 cmovz r11,r8 mov QWORD[((0+16))+rsp],r8 lea rsi,[((0-128))+rsp] cmovz r12,r9 mov QWORD[((0+24))+rsp],r9 mov r9,r14 lea rdi,[rsp] call __ecp_nistz256_mul_montx DB 102,72,15,126,203 DB 102,72,15,126,207 call __ecp_nistz256_sub_fromx lea rsi,[((160+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$point_doublex_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_doublex: ALIGN 32 GFp_nistz256_point_addx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_addx: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$point_addx: push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*18+8 $L$point_addx_body: movdqu xmm0,XMMWORD[rsi] movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm3,XMMWORD[48+rsi] movdqu xmm4,XMMWORD[64+rsi] movdqu xmm5,XMMWORD[80+rsi] mov rbx,rsi mov rsi,rdx movdqa XMMWORD[384+rsp],xmm0 movdqa XMMWORD[(384+16)+rsp],xmm1 movdqa XMMWORD[416+rsp],xmm2 movdqa XMMWORD[(416+16)+rsp],xmm3 movdqa XMMWORD[448+rsp],xmm4 movdqa XMMWORD[(448+16)+rsp],xmm5 por xmm5,xmm4 movdqu xmm0,XMMWORD[rsi] pshufd xmm3,xmm5,0xb1 movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] por xmm5,xmm3 movdqu xmm3,XMMWORD[48+rsi] mov rdx,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] movdqa XMMWORD[480+rsp],xmm0 pshufd xmm4,xmm5,0x1e movdqa XMMWORD[(480+16)+rsp],xmm1 movdqu xmm0,XMMWORD[64+rsi] movdqu xmm1,XMMWORD[80+rsi] movdqa XMMWORD[512+rsp],xmm2 movdqa XMMWORD[(512+16)+rsp],xmm3 por xmm5,xmm4 pxor xmm4,xmm4 por xmm1,xmm0 DB 102,72,15,110,199 lea rsi,[((64-128))+rsi] mov QWORD[((544+0))+rsp],rdx mov QWORD[((544+8))+rsp],r14 mov QWORD[((544+16))+rsp],r15 mov QWORD[((544+24))+rsp],r8 lea rdi,[96+rsp] call __ecp_nistz256_sqr_montx pcmpeqd xmm5,xmm4 pshufd xmm4,xmm1,0xb1 por xmm4,xmm1 pshufd xmm5,xmm5,0 pshufd xmm3,xmm4,0x1e por xmm4,xmm3 pxor xmm3,xmm3 pcmpeqd xmm4,xmm3 pshufd xmm4,xmm4,0 mov rdx,QWORD[((64+0))+rbx] mov r14,QWORD[((64+8))+rbx] mov r15,QWORD[((64+16))+rbx] mov r8,QWORD[((64+24))+rbx] DB 102,72,15,110,203 lea rsi,[((64-128))+rbx] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[544+rsp] lea rbx,[544+rsp] mov r9,QWORD[((0+96))+rsp] mov r10,QWORD[((8+96))+rsp] lea rsi,[((-128+96))+rsp] mov r11,QWORD[((16+96))+rsp] mov r12,QWORD[((24+96))+rsp] lea rdi,[224+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[416+rsp] lea rbx,[416+rsp] mov r9,QWORD[((0+224))+rsp] mov r10,QWORD[((8+224))+rsp] lea rsi,[((-128+224))+rsp] mov r11,QWORD[((16+224))+rsp] mov r12,QWORD[((24+224))+rsp] lea rdi,[224+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[512+rsp] lea rbx,[512+rsp] mov r9,QWORD[((0+256))+rsp] mov r10,QWORD[((8+256))+rsp] lea rsi,[((-128+256))+rsp] mov r11,QWORD[((16+256))+rsp] mov r12,QWORD[((24+256))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montx lea rbx,[224+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromx or r12,r13 movdqa xmm2,xmm4 or r12,r8 or r12,r9 por xmm2,xmm5 DB 102,73,15,110,220 mov rdx,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+96))+rsp] mov r10,QWORD[((8+96))+rsp] lea rsi,[((-128+96))+rsp] mov r11,QWORD[((16+96))+rsp] mov r12,QWORD[((24+96))+rsp] lea rdi,[160+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[480+rsp] lea rbx,[480+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_mul_montx lea rbx,[160+rsp] lea rdi,[rsp] call __ecp_nistz256_sub_fromx or r12,r13 or r12,r8 or r12,r9 DB 102,73,15,126,208 DB 102,73,15,126,217 or r12,r8 DB 0x3e jnz NEAR $L$add_proceedx test r9,r9 jz NEAR $L$add_doublex DB 102,72,15,126,199 pxor xmm0,xmm0 movdqu XMMWORD[rdi],xmm0 movdqu XMMWORD[16+rdi],xmm0 movdqu XMMWORD[32+rdi],xmm0 movdqu XMMWORD[48+rdi],xmm0 movdqu XMMWORD[64+rdi],xmm0 movdqu XMMWORD[80+rdi],xmm0 jmp NEAR $L$add_donex ALIGN 32 $L$add_doublex: DB 102,72,15,126,206 DB 102,72,15,126,199 add rsp,416 jmp NEAR $L$point_double_shortcutx ALIGN 32 $L$add_proceedx: mov rdx,QWORD[((0+64))+rsp] mov r14,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r15,QWORD[((16+64))+rsp] mov r8,QWORD[((24+64))+rsp] lea rdi,[96+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+0))+rsp] mov r10,QWORD[((8+0))+rsp] lea rsi,[((-128+0))+rsp] mov r11,QWORD[((16+0))+rsp] mov r12,QWORD[((24+0))+rsp] lea rdi,[352+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[((0+0))+rsp] mov r14,QWORD[((8+0))+rsp] lea rsi,[((-128+0))+rsp] mov r15,QWORD[((16+0))+rsp] mov r8,QWORD[((24+0))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[544+rsp] lea rbx,[544+rsp] mov r9,QWORD[((0+352))+rsp] mov r10,QWORD[((8+352))+rsp] lea rsi,[((-128+352))+rsp] mov r11,QWORD[((16+352))+rsp] mov r12,QWORD[((24+352))+rsp] lea rdi,[352+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[rsp] lea rbx,[rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[128+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[160+rsp] lea rbx,[160+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_mul_montx xor r11,r11 add r12,r12 lea rsi,[96+rsp] adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax mov rax,QWORD[rsi] cmovc r13,rbp mov rbp,QWORD[8+rsi] cmovc r8,rcx mov rcx,QWORD[16+rsi] cmovc r9,r10 mov r10,QWORD[24+rsi] call __ecp_nistz256_subx lea rbx,[128+rsp] lea rdi,[288+rsp] call __ecp_nistz256_sub_fromx mov rax,QWORD[((192+0))+rsp] mov rbp,QWORD[((192+8))+rsp] mov rcx,QWORD[((192+16))+rsp] mov r10,QWORD[((192+24))+rsp] lea rdi,[320+rsp] call __ecp_nistz256_subx mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov rdx,QWORD[128+rsp] lea rbx,[128+rsp] mov r9,QWORD[((0+224))+rsp] mov r10,QWORD[((8+224))+rsp] lea rsi,[((-128+224))+rsp] mov r11,QWORD[((16+224))+rsp] mov r12,QWORD[((24+224))+rsp] lea rdi,[256+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[320+rsp] lea rbx,[320+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[320+rsp] call __ecp_nistz256_mul_montx lea rbx,[256+rsp] lea rdi,[320+rsp] call __ecp_nistz256_sub_fromx DB 102,72,15,126,199 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[352+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((352+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[544+rsp] pand xmm3,XMMWORD[((544+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[448+rsp] pand xmm3,XMMWORD[((448+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[64+rdi],xmm2 movdqu XMMWORD[80+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[288+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((288+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[480+rsp] pand xmm3,XMMWORD[((480+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[384+rsp] pand xmm3,XMMWORD[((384+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[rdi],xmm2 movdqu XMMWORD[16+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[320+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((320+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[512+rsp] pand xmm3,XMMWORD[((512+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[416+rsp] pand xmm3,XMMWORD[((416+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm3 $L$add_donex: lea rsi,[((576+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$point_addx_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_addx: ALIGN 32 GFp_nistz256_point_add_affinex: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_nistz256_point_add_affinex: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$point_add_affinex: push rbp push rbx push r12 push r13 push r14 push r15 sub rsp,32*15+8 $L$add_affinex_body: movdqu xmm0,XMMWORD[rsi] mov rbx,rdx movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] movdqu xmm3,XMMWORD[48+rsi] movdqu xmm4,XMMWORD[64+rsi] movdqu xmm5,XMMWORD[80+rsi] mov rdx,QWORD[((64+0))+rsi] mov r14,QWORD[((64+8))+rsi] mov r15,QWORD[((64+16))+rsi] mov r8,QWORD[((64+24))+rsi] movdqa XMMWORD[320+rsp],xmm0 movdqa XMMWORD[(320+16)+rsp],xmm1 movdqa XMMWORD[352+rsp],xmm2 movdqa XMMWORD[(352+16)+rsp],xmm3 movdqa XMMWORD[384+rsp],xmm4 movdqa XMMWORD[(384+16)+rsp],xmm5 por xmm5,xmm4 movdqu xmm0,XMMWORD[rbx] pshufd xmm3,xmm5,0xb1 movdqu xmm1,XMMWORD[16+rbx] movdqu xmm2,XMMWORD[32+rbx] por xmm5,xmm3 movdqu xmm3,XMMWORD[48+rbx] movdqa XMMWORD[416+rsp],xmm0 pshufd xmm4,xmm5,0x1e movdqa XMMWORD[(416+16)+rsp],xmm1 por xmm1,xmm0 DB 102,72,15,110,199 movdqa XMMWORD[448+rsp],xmm2 movdqa XMMWORD[(448+16)+rsp],xmm3 por xmm3,xmm2 por xmm5,xmm4 pxor xmm4,xmm4 por xmm3,xmm1 lea rsi,[((64-128))+rsi] lea rdi,[32+rsp] call __ecp_nistz256_sqr_montx pcmpeqd xmm5,xmm4 pshufd xmm4,xmm3,0xb1 mov rdx,QWORD[rbx] mov r9,r12 por xmm4,xmm3 pshufd xmm5,xmm5,0 pshufd xmm3,xmm4,0x1e mov r10,r13 por xmm4,xmm3 pxor xmm3,xmm3 mov r11,r14 pcmpeqd xmm4,xmm3 pshufd xmm4,xmm4,0 lea rsi,[((32-128))+rsp] mov r12,r15 lea rdi,[rsp] call __ecp_nistz256_mul_montx lea rbx,[320+rsp] lea rdi,[64+rsp] call __ecp_nistz256_sub_fromx mov rdx,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[384+rsp] lea rbx,[384+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[288+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[448+rsp] lea rbx,[448+rsp] mov r9,QWORD[((0+32))+rsp] mov r10,QWORD[((8+32))+rsp] lea rsi,[((-128+32))+rsp] mov r11,QWORD[((16+32))+rsp] mov r12,QWORD[((24+32))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montx lea rbx,[352+rsp] lea rdi,[96+rsp] call __ecp_nistz256_sub_fromx mov rdx,QWORD[((0+64))+rsp] mov r14,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r15,QWORD[((16+64))+rsp] mov r8,QWORD[((24+64))+rsp] lea rdi,[128+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[((0+96))+rsp] mov r14,QWORD[((8+96))+rsp] lea rsi,[((-128+96))+rsp] mov r15,QWORD[((16+96))+rsp] mov r8,QWORD[((24+96))+rsp] lea rdi,[192+rsp] call __ecp_nistz256_sqr_montx mov rdx,QWORD[128+rsp] lea rbx,[128+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[160+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[320+rsp] lea rbx,[320+rsp] mov r9,QWORD[((0+128))+rsp] mov r10,QWORD[((8+128))+rsp] lea rsi,[((-128+128))+rsp] mov r11,QWORD[((16+128))+rsp] mov r12,QWORD[((24+128))+rsp] lea rdi,[rsp] call __ecp_nistz256_mul_montx xor r11,r11 add r12,r12 lea rsi,[192+rsp] adc r13,r13 mov rax,r12 adc r8,r8 adc r9,r9 mov rbp,r13 adc r11,0 sub r12,-1 mov rcx,r8 sbb r13,r14 sbb r8,0 mov r10,r9 sbb r9,r15 sbb r11,0 cmovc r12,rax mov rax,QWORD[rsi] cmovc r13,rbp mov rbp,QWORD[8+rsi] cmovc r8,rcx mov rcx,QWORD[16+rsi] cmovc r9,r10 mov r10,QWORD[24+rsi] call __ecp_nistz256_subx lea rbx,[160+rsp] lea rdi,[224+rsp] call __ecp_nistz256_sub_fromx mov rax,QWORD[((0+0))+rsp] mov rbp,QWORD[((0+8))+rsp] mov rcx,QWORD[((0+16))+rsp] mov r10,QWORD[((0+24))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_subx mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r8 mov QWORD[24+rdi],r9 mov rdx,QWORD[352+rsp] lea rbx,[352+rsp] mov r9,QWORD[((0+160))+rsp] mov r10,QWORD[((8+160))+rsp] lea rsi,[((-128+160))+rsp] mov r11,QWORD[((16+160))+rsp] mov r12,QWORD[((24+160))+rsp] lea rdi,[32+rsp] call __ecp_nistz256_mul_montx mov rdx,QWORD[96+rsp] lea rbx,[96+rsp] mov r9,QWORD[((0+64))+rsp] mov r10,QWORD[((8+64))+rsp] lea rsi,[((-128+64))+rsp] mov r11,QWORD[((16+64))+rsp] mov r12,QWORD[((24+64))+rsp] lea rdi,[64+rsp] call __ecp_nistz256_mul_montx lea rbx,[32+rsp] lea rdi,[256+rsp] call __ecp_nistz256_sub_fromx DB 102,72,15,126,199 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[288+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((288+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[$L$ONE_mont] pand xmm3,XMMWORD[(($L$ONE_mont+16))] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[384+rsp] pand xmm3,XMMWORD[((384+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[64+rdi],xmm2 movdqu XMMWORD[80+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[224+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((224+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[416+rsp] pand xmm3,XMMWORD[((416+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[320+rsp] pand xmm3,XMMWORD[((320+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[rdi],xmm2 movdqu XMMWORD[16+rdi],xmm3 movdqa xmm0,xmm5 movdqa xmm1,xmm5 pandn xmm0,XMMWORD[256+rsp] movdqa xmm2,xmm5 pandn xmm1,XMMWORD[((256+16))+rsp] movdqa xmm3,xmm5 pand xmm2,XMMWORD[448+rsp] pand xmm3,XMMWORD[((448+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqa xmm0,xmm4 movdqa xmm1,xmm4 pandn xmm0,xmm2 movdqa xmm2,xmm4 pandn xmm1,xmm3 movdqa xmm3,xmm4 pand xmm2,XMMWORD[352+rsp] pand xmm3,XMMWORD[((352+16))+rsp] por xmm2,xmm0 por xmm3,xmm1 movdqu XMMWORD[32+rdi],xmm2 movdqu XMMWORD[48+rdi],xmm3 lea rsi,[((480+56))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbx,QWORD[((-16))+rsi] mov rbp,QWORD[((-8))+rsi] lea rsp,[rsi] $L$add_affinex_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_nistz256_point_add_affinex: EXTERN __imp_RtlVirtualUnwind ALIGN 16 short_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail lea rax,[16+rax] mov r12,QWORD[((-8))+rax] mov r13,QWORD[((-16))+rax] mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 jmp NEAR $L$common_seh_tail ALIGN 16 full_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov r10d,DWORD[8+r11] lea rax,[r10*1+rax] mov rbp,QWORD[((-8))+rax] mov rbx,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_nistz256_neg wrt ..imagebase DD $L$SEH_end_GFp_nistz256_neg wrt ..imagebase DD $L$SEH_info_GFp_nistz256_neg wrt ..imagebase DD $L$SEH_begin_GFp_p256_scalar_mul_mont wrt ..imagebase DD $L$SEH_end_GFp_p256_scalar_mul_mont wrt ..imagebase DD $L$SEH_info_GFp_p256_scalar_mul_mont wrt ..imagebase DD $L$SEH_begin_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase DD $L$SEH_end_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase DD $L$SEH_info_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase DD $L$SEH_begin_ecp_nistz256_ord_mul_montx wrt ..imagebase DD $L$SEH_end_ecp_nistz256_ord_mul_montx wrt ..imagebase DD $L$SEH_info_ecp_nistz256_ord_mul_montx wrt ..imagebase DD $L$SEH_begin_ecp_nistz256_ord_sqr_montx wrt ..imagebase DD $L$SEH_end_ecp_nistz256_ord_sqr_montx wrt ..imagebase DD $L$SEH_info_ecp_nistz256_ord_sqr_montx wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_mul_mont wrt ..imagebase DD $L$SEH_end_GFp_nistz256_mul_mont wrt ..imagebase DD $L$SEH_info_GFp_nistz256_mul_mont wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_sqr_mont wrt ..imagebase DD $L$SEH_end_GFp_nistz256_sqr_mont wrt ..imagebase DD $L$SEH_info_GFp_nistz256_sqr_mont wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_select_w5 wrt ..imagebase DD $L$SEH_end_GFp_nistz256_select_w5 wrt ..imagebase DD $L$SEH_info_GFp_nistz256_select_wX wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_select_w7 wrt ..imagebase DD $L$SEH_end_GFp_nistz256_select_w7 wrt ..imagebase DD $L$SEH_info_GFp_nistz256_select_wX wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_avx2_select_w5 wrt ..imagebase DD $L$SEH_end_GFp_nistz256_avx2_select_w5 wrt ..imagebase DD $L$SEH_info_GFp_nistz256_avx2_select_wX wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_avx2_select_w7 wrt ..imagebase DD $L$SEH_end_GFp_nistz256_avx2_select_w7 wrt ..imagebase DD $L$SEH_info_GFp_nistz256_avx2_select_wX wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_double wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_double wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_double wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_add wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_add wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_add wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_add_affine wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_add_affine wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_add_affine wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_doublex wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_doublex wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_doublex wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_addx wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_addx wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_addx wrt ..imagebase DD $L$SEH_begin_GFp_nistz256_point_add_affinex wrt ..imagebase DD $L$SEH_end_GFp_nistz256_point_add_affinex wrt ..imagebase DD $L$SEH_info_GFp_nistz256_point_add_affinex wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_nistz256_neg: DB 9,0,0,0 DD short_handler wrt ..imagebase DD $L$neg_body wrt ..imagebase,$L$neg_epilogue wrt ..imagebase $L$SEH_info_GFp_p256_scalar_mul_mont: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_mul_body wrt ..imagebase,$L$ord_mul_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_GFp_p256_scalar_sqr_rep_mont: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_sqr_body wrt ..imagebase,$L$ord_sqr_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_ord_mul_montx: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_mulx_body wrt ..imagebase,$L$ord_mulx_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_ord_sqr_montx: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_sqrx_body wrt ..imagebase,$L$ord_sqrx_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_GFp_nistz256_mul_mont: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_GFp_nistz256_sqr_mont: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$sqr_body wrt ..imagebase,$L$sqr_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_GFp_nistz256_select_wX: DB 0x01,0x33,0x16,0x00 DB 0x33,0xf8,0x09,0x00 DB 0x2e,0xe8,0x08,0x00 DB 0x29,0xd8,0x07,0x00 DB 0x24,0xc8,0x06,0x00 DB 0x1f,0xb8,0x05,0x00 DB 0x1a,0xa8,0x04,0x00 DB 0x15,0x98,0x03,0x00 DB 0x10,0x88,0x02,0x00 DB 0x0c,0x78,0x01,0x00 DB 0x08,0x68,0x00,0x00 DB 0x04,0x01,0x15,0x00 ALIGN 8 $L$SEH_info_GFp_nistz256_avx2_select_wX: DB 0x01,0x36,0x17,0x0b DB 0x36,0xf8,0x09,0x00 DB 0x31,0xe8,0x08,0x00 DB 0x2c,0xd8,0x07,0x00 DB 0x27,0xc8,0x06,0x00 DB 0x22,0xb8,0x05,0x00 DB 0x1d,0xa8,0x04,0x00 DB 0x18,0x98,0x03,0x00 DB 0x13,0x88,0x02,0x00 DB 0x0e,0x78,0x01,0x00 DB 0x09,0x68,0x00,0x00 DB 0x04,0x01,0x15,0x00 DB 0x00,0xb3,0x00,0x00 ALIGN 8 $L$SEH_info_GFp_nistz256_point_double: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_doubleq_body wrt ..imagebase,$L$point_doubleq_epilogue wrt ..imagebase DD 32*5+56,0 $L$SEH_info_GFp_nistz256_point_add: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_addq_body wrt ..imagebase,$L$point_addq_epilogue wrt ..imagebase DD 32*18+56,0 $L$SEH_info_GFp_nistz256_point_add_affine: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$add_affineq_body wrt ..imagebase,$L$add_affineq_epilogue wrt ..imagebase DD 32*15+56,0 ALIGN 8 $L$SEH_info_GFp_nistz256_point_doublex: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_doublex_body wrt ..imagebase,$L$point_doublex_epilogue wrt ..imagebase DD 32*5+56,0 $L$SEH_info_GFp_nistz256_point_addx: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_addx_body wrt ..imagebase,$L$point_addx_epilogue wrt ..imagebase DD 32*18+56,0 $L$SEH_info_GFp_nistz256_point_add_affinex: DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$add_affinex_body wrt ..imagebase,$L$add_affinex_epilogue wrt ..imagebase DD 32*15+56,0 ring-0.16.9/pregenerated/tmp/poly1305-x86-win32n.asm000064400000000000000000000620431353224260700177510ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ;extern _GFp_ia32cap_P align 64 global _GFp_poly1305_init_asm align 16 _GFp_poly1305_init_asm: L$_GFp_poly1305_init_asm_begin: push ebp push ebx push esi push edi mov edi,DWORD [20+esp] mov esi,DWORD [24+esp] mov ebp,DWORD [28+esp] xor eax,eax mov DWORD [edi],eax mov DWORD [4+edi],eax mov DWORD [8+edi],eax mov DWORD [12+edi],eax mov DWORD [16+edi],eax mov DWORD [20+edi],eax cmp esi,0 je NEAR L$000nokey call L$001pic_point L$001pic_point: pop ebx lea eax,[(_GFp_poly1305_blocks-L$001pic_point)+ebx] lea edx,[(_GFp_poly1305_emit-L$001pic_point)+ebx] lea edi,[_GFp_ia32cap_P] mov ecx,DWORD [edi] and ecx,83886080 cmp ecx,83886080 lea eax,[(__poly1305_blocks_sse2-L$001pic_point)+ebx] lea edx,[(__poly1305_emit_sse2-L$001pic_point)+ebx] mov edi,DWORD [20+esp] mov DWORD [ebp],eax mov DWORD [4+ebp],edx mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov edx,DWORD [12+esi] and eax,268435455 and ebx,268435452 and ecx,268435452 and edx,268435452 mov DWORD [24+edi],eax mov DWORD [28+edi],ebx mov DWORD [32+edi],ecx mov DWORD [36+edi],edx mov eax,1 L$000nokey: pop edi pop esi pop ebx pop ebp ret global _GFp_poly1305_blocks align 16 _GFp_poly1305_blocks: L$_GFp_poly1305_blocks_begin: push ebp push ebx push esi push edi mov edi,DWORD [20+esp] mov esi,DWORD [24+esp] mov ecx,DWORD [28+esp] L$enter_blocks: and ecx,-15 jz NEAR L$002nodata sub esp,64 mov eax,DWORD [24+edi] mov ebx,DWORD [28+edi] lea ebp,[ecx*1+esi] mov ecx,DWORD [32+edi] mov edx,DWORD [36+edi] mov DWORD [92+esp],ebp mov ebp,esi mov DWORD [36+esp],eax mov eax,ebx shr eax,2 mov DWORD [40+esp],ebx add eax,ebx mov ebx,ecx shr ebx,2 mov DWORD [44+esp],ecx add ebx,ecx mov ecx,edx shr ecx,2 mov DWORD [48+esp],edx add ecx,edx mov DWORD [52+esp],eax mov DWORD [56+esp],ebx mov DWORD [60+esp],ecx mov eax,DWORD [edi] mov ebx,DWORD [4+edi] mov ecx,DWORD [8+edi] mov esi,DWORD [12+edi] mov edi,DWORD [16+edi] jmp NEAR L$003loop align 32 L$003loop: add eax,DWORD [ebp] adc ebx,DWORD [4+ebp] adc ecx,DWORD [8+ebp] adc esi,DWORD [12+ebp] lea ebp,[16+ebp] adc edi,DWORD [96+esp] mov DWORD [esp],eax mov DWORD [12+esp],esi mul DWORD [36+esp] mov DWORD [16+esp],edi mov edi,eax mov eax,ebx mov esi,edx mul DWORD [60+esp] add edi,eax mov eax,ecx adc esi,edx mul DWORD [56+esp] add edi,eax mov eax,DWORD [12+esp] adc esi,edx mul DWORD [52+esp] add edi,eax mov eax,DWORD [esp] adc esi,edx mul DWORD [40+esp] mov DWORD [20+esp],edi xor edi,edi add esi,eax mov eax,ebx adc edi,edx mul DWORD [36+esp] add esi,eax mov eax,ecx adc edi,edx mul DWORD [60+esp] add esi,eax mov eax,DWORD [12+esp] adc edi,edx mul DWORD [56+esp] add esi,eax mov eax,DWORD [16+esp] adc edi,edx imul eax,DWORD [52+esp] add esi,eax mov eax,DWORD [esp] adc edi,0 mul DWORD [44+esp] mov DWORD [24+esp],esi xor esi,esi add edi,eax mov eax,ebx adc esi,edx mul DWORD [40+esp] add edi,eax mov eax,ecx adc esi,edx mul DWORD [36+esp] add edi,eax mov eax,DWORD [12+esp] adc esi,edx mul DWORD [60+esp] add edi,eax mov eax,DWORD [16+esp] adc esi,edx imul eax,DWORD [56+esp] add edi,eax mov eax,DWORD [esp] adc esi,0 mul DWORD [48+esp] mov DWORD [28+esp],edi xor edi,edi add esi,eax mov eax,ebx adc edi,edx mul DWORD [44+esp] add esi,eax mov eax,ecx adc edi,edx mul DWORD [40+esp] add esi,eax mov eax,DWORD [12+esp] adc edi,edx mul DWORD [36+esp] add esi,eax mov ecx,DWORD [16+esp] adc edi,edx mov edx,ecx imul ecx,DWORD [60+esp] add esi,ecx mov eax,DWORD [20+esp] adc edi,0 imul edx,DWORD [36+esp] add edx,edi mov ebx,DWORD [24+esp] mov ecx,DWORD [28+esp] mov edi,edx shr edx,2 and edi,3 lea edx,[edx*4+edx] add eax,edx adc ebx,0 adc ecx,0 adc esi,0 adc edi,0 cmp ebp,DWORD [92+esp] jne NEAR L$003loop mov edx,DWORD [84+esp] add esp,64 mov DWORD [edx],eax mov DWORD [4+edx],ebx mov DWORD [8+edx],ecx mov DWORD [12+edx],esi mov DWORD [16+edx],edi L$002nodata: pop edi pop esi pop ebx pop ebp ret global _GFp_poly1305_emit align 16 _GFp_poly1305_emit: L$_GFp_poly1305_emit_begin: push ebp push ebx push esi push edi mov ebp,DWORD [20+esp] L$enter_emit: mov edi,DWORD [24+esp] mov eax,DWORD [ebp] mov ebx,DWORD [4+ebp] mov ecx,DWORD [8+ebp] mov edx,DWORD [12+ebp] mov esi,DWORD [16+ebp] add eax,5 adc ebx,0 adc ecx,0 adc edx,0 adc esi,0 shr esi,2 neg esi and eax,esi and ebx,esi and ecx,esi and edx,esi mov DWORD [edi],eax mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov DWORD [12+edi],edx not esi mov eax,DWORD [ebp] mov ebx,DWORD [4+ebp] mov ecx,DWORD [8+ebp] mov edx,DWORD [12+ebp] mov ebp,DWORD [28+esp] and eax,esi and ebx,esi and ecx,esi and edx,esi or eax,DWORD [edi] or ebx,DWORD [4+edi] or ecx,DWORD [8+edi] or edx,DWORD [12+edi] add eax,DWORD [ebp] adc ebx,DWORD [4+ebp] adc ecx,DWORD [8+ebp] adc edx,DWORD [12+ebp] mov DWORD [edi],eax mov DWORD [4+edi],ebx mov DWORD [8+edi],ecx mov DWORD [12+edi],edx pop edi pop esi pop ebx pop ebp ret align 32 align 16 __poly1305_init_sse2: movdqu xmm4,[24+edi] lea edi,[48+edi] mov ebp,esp sub esp,224 and esp,-16 movq xmm7,[64+ebx] movdqa xmm0,xmm4 movdqa xmm1,xmm4 movdqa xmm2,xmm4 pand xmm0,xmm7 psrlq xmm1,26 psrldq xmm2,6 pand xmm1,xmm7 movdqa xmm3,xmm2 psrlq xmm2,4 psrlq xmm3,30 pand xmm2,xmm7 pand xmm3,xmm7 psrldq xmm4,13 lea edx,[144+esp] mov ecx,2 L$004square: movdqa [esp],xmm0 movdqa [16+esp],xmm1 movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 movdqa [64+esp],xmm4 movdqa xmm6,xmm1 movdqa xmm5,xmm2 pslld xmm6,2 pslld xmm5,2 paddd xmm6,xmm1 paddd xmm5,xmm2 movdqa [80+esp],xmm6 movdqa [96+esp],xmm5 movdqa xmm6,xmm3 movdqa xmm5,xmm4 pslld xmm6,2 pslld xmm5,2 paddd xmm6,xmm3 paddd xmm5,xmm4 movdqa [112+esp],xmm6 movdqa [128+esp],xmm5 pshufd xmm6,xmm0,68 movdqa xmm5,xmm1 pshufd xmm1,xmm1,68 pshufd xmm2,xmm2,68 pshufd xmm3,xmm3,68 pshufd xmm4,xmm4,68 movdqa [edx],xmm6 movdqa [16+edx],xmm1 movdqa [32+edx],xmm2 movdqa [48+edx],xmm3 movdqa [64+edx],xmm4 pmuludq xmm4,xmm0 pmuludq xmm3,xmm0 pmuludq xmm2,xmm0 pmuludq xmm1,xmm0 pmuludq xmm0,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[48+edx] movdqa xmm7,xmm6 pmuludq xmm6,[32+edx] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+edx] paddq xmm3,xmm6 movdqa xmm6,[80+esp] pmuludq xmm5,[edx] paddq xmm2,xmm7 pmuludq xmm6,[64+edx] movdqa xmm7,[32+esp] paddq xmm1,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[32+edx] paddq xmm0,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[16+edx] paddq xmm4,xmm7 movdqa xmm7,[96+esp] pmuludq xmm6,[edx] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[64+edx] paddq xmm2,xmm6 pmuludq xmm5,[48+edx] movdqa xmm6,[48+esp] paddq xmm1,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[16+edx] paddq xmm0,xmm5 movdqa xmm5,[112+esp] pmuludq xmm7,[edx] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[64+edx] paddq xmm3,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[48+edx] paddq xmm2,xmm5 pmuludq xmm7,[32+edx] movdqa xmm5,[64+esp] paddq xmm1,xmm6 movdqa xmm6,[128+esp] pmuludq xmm5,[edx] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[64+edx] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+edx] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[32+edx] paddq xmm0,xmm7 pmuludq xmm6,[48+edx] movdqa xmm7,[64+ebx] paddq xmm1,xmm5 paddq xmm2,xmm6 movdqa xmm5,xmm3 pand xmm3,xmm7 psrlq xmm5,26 paddq xmm5,xmm4 movdqa xmm6,xmm0 pand xmm0,xmm7 psrlq xmm6,26 movdqa xmm4,xmm5 paddq xmm6,xmm1 psrlq xmm5,26 pand xmm4,xmm7 movdqa xmm1,xmm6 psrlq xmm6,26 paddd xmm0,xmm5 psllq xmm5,2 paddq xmm6,xmm2 paddq xmm5,xmm0 pand xmm1,xmm7 movdqa xmm2,xmm6 psrlq xmm6,26 pand xmm2,xmm7 paddd xmm6,xmm3 movdqa xmm0,xmm5 psrlq xmm5,26 movdqa xmm3,xmm6 psrlq xmm6,26 pand xmm0,xmm7 paddd xmm1,xmm5 pand xmm3,xmm7 paddd xmm4,xmm6 dec ecx jz NEAR L$005square_break punpcklqdq xmm0,[esp] punpcklqdq xmm1,[16+esp] punpcklqdq xmm2,[32+esp] punpcklqdq xmm3,[48+esp] punpcklqdq xmm4,[64+esp] jmp NEAR L$004square L$005square_break: psllq xmm0,32 psllq xmm1,32 psllq xmm2,32 psllq xmm3,32 psllq xmm4,32 por xmm0,[esp] por xmm1,[16+esp] por xmm2,[32+esp] por xmm3,[48+esp] por xmm4,[64+esp] pshufd xmm0,xmm0,141 pshufd xmm1,xmm1,141 pshufd xmm2,xmm2,141 pshufd xmm3,xmm3,141 pshufd xmm4,xmm4,141 movdqu [edi],xmm0 movdqu [16+edi],xmm1 movdqu [32+edi],xmm2 movdqu [48+edi],xmm3 movdqu [64+edi],xmm4 movdqa xmm6,xmm1 movdqa xmm5,xmm2 pslld xmm6,2 pslld xmm5,2 paddd xmm6,xmm1 paddd xmm5,xmm2 movdqu [80+edi],xmm6 movdqu [96+edi],xmm5 movdqa xmm6,xmm3 movdqa xmm5,xmm4 pslld xmm6,2 pslld xmm5,2 paddd xmm6,xmm3 paddd xmm5,xmm4 movdqu [112+edi],xmm6 movdqu [128+edi],xmm5 mov esp,ebp lea edi,[edi-48] ret align 32 align 16 __poly1305_blocks_sse2: push ebp push ebx push esi push edi mov edi,DWORD [20+esp] mov esi,DWORD [24+esp] mov ecx,DWORD [28+esp] mov eax,DWORD [20+edi] and ecx,-16 jz NEAR L$006nodata cmp ecx,64 jae NEAR L$007enter_sse2 test eax,eax jz NEAR L$enter_blocks align 16 L$007enter_sse2: call L$008pic_point L$008pic_point: pop ebx lea ebx,[(L$const_sse2-L$008pic_point)+ebx] test eax,eax jnz NEAR L$009base2_26 call __poly1305_init_sse2 mov eax,DWORD [edi] mov ecx,DWORD [3+edi] mov edx,DWORD [6+edi] mov esi,DWORD [9+edi] mov ebp,DWORD [13+edi] mov DWORD [20+edi],1 shr ecx,2 and eax,67108863 shr edx,4 and ecx,67108863 shr esi,6 and edx,67108863 movd xmm0,eax movd xmm1,ecx movd xmm2,edx movd xmm3,esi movd xmm4,ebp mov esi,DWORD [24+esp] mov ecx,DWORD [28+esp] jmp NEAR L$010base2_32 align 16 L$009base2_26: movd xmm0,DWORD [edi] movd xmm1,DWORD [4+edi] movd xmm2,DWORD [8+edi] movd xmm3,DWORD [12+edi] movd xmm4,DWORD [16+edi] movdqa xmm7,[64+ebx] L$010base2_32: mov eax,DWORD [32+esp] mov ebp,esp sub esp,528 and esp,-16 lea edi,[48+edi] shl eax,24 test ecx,31 jz NEAR L$011even movdqu xmm6,[esi] lea esi,[16+esi] movdqa xmm5,xmm6 pand xmm6,xmm7 paddd xmm0,xmm6 movdqa xmm6,xmm5 psrlq xmm5,26 psrldq xmm6,6 pand xmm5,xmm7 paddd xmm1,xmm5 movdqa xmm5,xmm6 psrlq xmm6,4 pand xmm6,xmm7 paddd xmm2,xmm6 movdqa xmm6,xmm5 psrlq xmm5,30 pand xmm5,xmm7 psrldq xmm6,7 paddd xmm3,xmm5 movd xmm5,eax paddd xmm4,xmm6 movd xmm6,DWORD [12+edi] paddd xmm4,xmm5 movdqa [esp],xmm0 movdqa [16+esp],xmm1 movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 movdqa [64+esp],xmm4 pmuludq xmm0,xmm6 pmuludq xmm1,xmm6 pmuludq xmm2,xmm6 movd xmm5,DWORD [28+edi] pmuludq xmm3,xmm6 pmuludq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[48+esp] movdqa xmm7,xmm6 pmuludq xmm6,[32+esp] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+esp] paddq xmm3,xmm6 movd xmm6,DWORD [92+edi] pmuludq xmm5,[esp] paddq xmm2,xmm7 pmuludq xmm6,[64+esp] movd xmm7,DWORD [44+edi] paddq xmm1,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[32+esp] paddq xmm0,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[16+esp] paddq xmm4,xmm7 movd xmm7,DWORD [108+edi] pmuludq xmm6,[esp] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[64+esp] paddq xmm2,xmm6 pmuludq xmm5,[48+esp] movd xmm6,DWORD [60+edi] paddq xmm1,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[16+esp] paddq xmm0,xmm5 movd xmm5,DWORD [124+edi] pmuludq xmm7,[esp] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[64+esp] paddq xmm3,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[48+esp] paddq xmm2,xmm5 pmuludq xmm7,[32+esp] movd xmm5,DWORD [76+edi] paddq xmm1,xmm6 movd xmm6,DWORD [140+edi] pmuludq xmm5,[esp] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[64+esp] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+esp] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[32+esp] paddq xmm0,xmm7 pmuludq xmm6,[48+esp] movdqa xmm7,[64+ebx] paddq xmm1,xmm5 paddq xmm2,xmm6 movdqa xmm5,xmm3 pand xmm3,xmm7 psrlq xmm5,26 paddq xmm5,xmm4 movdqa xmm6,xmm0 pand xmm0,xmm7 psrlq xmm6,26 movdqa xmm4,xmm5 paddq xmm6,xmm1 psrlq xmm5,26 pand xmm4,xmm7 movdqa xmm1,xmm6 psrlq xmm6,26 paddd xmm0,xmm5 psllq xmm5,2 paddq xmm6,xmm2 paddq xmm5,xmm0 pand xmm1,xmm7 movdqa xmm2,xmm6 psrlq xmm6,26 pand xmm2,xmm7 paddd xmm6,xmm3 movdqa xmm0,xmm5 psrlq xmm5,26 movdqa xmm3,xmm6 psrlq xmm6,26 pand xmm0,xmm7 paddd xmm1,xmm5 pand xmm3,xmm7 paddd xmm4,xmm6 sub ecx,16 jz NEAR L$012done L$011even: lea edx,[384+esp] lea eax,[esi-32] sub ecx,64 movdqu xmm5,[edi] pshufd xmm6,xmm5,68 cmovb esi,eax pshufd xmm5,xmm5,238 movdqa [edx],xmm6 lea eax,[160+esp] movdqu xmm6,[16+edi] movdqa [edx-144],xmm5 pshufd xmm5,xmm6,68 pshufd xmm6,xmm6,238 movdqa [16+edx],xmm5 movdqu xmm5,[32+edi] movdqa [edx-128],xmm6 pshufd xmm6,xmm5,68 pshufd xmm5,xmm5,238 movdqa [32+edx],xmm6 movdqu xmm6,[48+edi] movdqa [edx-112],xmm5 pshufd xmm5,xmm6,68 pshufd xmm6,xmm6,238 movdqa [48+edx],xmm5 movdqu xmm5,[64+edi] movdqa [edx-96],xmm6 pshufd xmm6,xmm5,68 pshufd xmm5,xmm5,238 movdqa [64+edx],xmm6 movdqu xmm6,[80+edi] movdqa [edx-80],xmm5 pshufd xmm5,xmm6,68 pshufd xmm6,xmm6,238 movdqa [80+edx],xmm5 movdqu xmm5,[96+edi] movdqa [edx-64],xmm6 pshufd xmm6,xmm5,68 pshufd xmm5,xmm5,238 movdqa [96+edx],xmm6 movdqu xmm6,[112+edi] movdqa [edx-48],xmm5 pshufd xmm5,xmm6,68 pshufd xmm6,xmm6,238 movdqa [112+edx],xmm5 movdqu xmm5,[128+edi] movdqa [edx-32],xmm6 pshufd xmm6,xmm5,68 pshufd xmm5,xmm5,238 movdqa [128+edx],xmm6 movdqa [edx-16],xmm5 movdqu xmm5,[32+esi] movdqu xmm6,[48+esi] lea esi,[32+esi] movdqa [112+esp],xmm2 movdqa [128+esp],xmm3 movdqa [144+esp],xmm4 movdqa xmm2,xmm5 movdqa xmm3,xmm6 psrldq xmm2,6 psrldq xmm3,6 movdqa xmm4,xmm5 punpcklqdq xmm2,xmm3 punpckhqdq xmm4,xmm6 punpcklqdq xmm5,xmm6 movdqa xmm3,xmm2 psrlq xmm2,4 psrlq xmm3,30 movdqa xmm6,xmm5 psrlq xmm4,40 psrlq xmm6,26 pand xmm5,xmm7 pand xmm6,xmm7 pand xmm2,xmm7 pand xmm3,xmm7 por xmm4,[ebx] movdqa [80+esp],xmm0 movdqa [96+esp],xmm1 jbe NEAR L$013skip_loop jmp NEAR L$014loop align 32 L$014loop: movdqa xmm7,[edx-144] movdqa [16+eax],xmm6 movdqa [32+eax],xmm2 movdqa [48+eax],xmm3 movdqa [64+eax],xmm4 movdqa xmm1,xmm5 pmuludq xmm5,xmm7 movdqa xmm0,xmm6 pmuludq xmm6,xmm7 pmuludq xmm2,xmm7 pmuludq xmm3,xmm7 pmuludq xmm4,xmm7 pmuludq xmm0,[edx-16] movdqa xmm7,xmm1 pmuludq xmm1,[edx-128] paddq xmm0,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[edx-112] paddq xmm1,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[edx-96] paddq xmm2,xmm7 movdqa xmm7,[16+eax] pmuludq xmm6,[edx-80] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[edx-128] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[edx-112] paddq xmm2,xmm7 movdqa xmm7,[32+eax] pmuludq xmm6,[edx-96] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[edx-32] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[edx-16] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[edx-128] paddq xmm1,xmm5 movdqa xmm5,[48+eax] pmuludq xmm7,[edx-112] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[edx-48] paddq xmm4,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[edx-32] paddq xmm0,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[edx-16] paddq xmm1,xmm6 movdqa xmm6,[64+eax] pmuludq xmm5,[edx-128] paddq xmm2,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[edx-16] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[edx-64] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[edx-48] paddq xmm0,xmm7 movdqa xmm7,[64+ebx] pmuludq xmm6,[edx-32] paddq xmm1,xmm5 paddq xmm2,xmm6 movdqu xmm5,[esi-32] movdqu xmm6,[esi-16] lea esi,[32+esi] movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 movdqa [64+esp],xmm4 movdqa xmm2,xmm5 movdqa xmm3,xmm6 psrldq xmm2,6 psrldq xmm3,6 movdqa xmm4,xmm5 punpcklqdq xmm2,xmm3 punpckhqdq xmm4,xmm6 punpcklqdq xmm5,xmm6 movdqa xmm3,xmm2 psrlq xmm2,4 psrlq xmm3,30 movdqa xmm6,xmm5 psrlq xmm4,40 psrlq xmm6,26 pand xmm5,xmm7 pand xmm6,xmm7 pand xmm2,xmm7 pand xmm3,xmm7 por xmm4,[ebx] lea eax,[esi-32] sub ecx,64 paddd xmm5,[80+esp] paddd xmm6,[96+esp] paddd xmm2,[112+esp] paddd xmm3,[128+esp] paddd xmm4,[144+esp] cmovb esi,eax lea eax,[160+esp] movdqa xmm7,[edx] movdqa [16+esp],xmm1 movdqa [16+eax],xmm6 movdqa [32+eax],xmm2 movdqa [48+eax],xmm3 movdqa [64+eax],xmm4 movdqa xmm1,xmm5 pmuludq xmm5,xmm7 paddq xmm5,xmm0 movdqa xmm0,xmm6 pmuludq xmm6,xmm7 pmuludq xmm2,xmm7 pmuludq xmm3,xmm7 pmuludq xmm4,xmm7 paddq xmm6,[16+esp] paddq xmm2,[32+esp] paddq xmm3,[48+esp] paddq xmm4,[64+esp] pmuludq xmm0,[128+edx] movdqa xmm7,xmm1 pmuludq xmm1,[16+edx] paddq xmm0,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[32+edx] paddq xmm1,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[48+edx] paddq xmm2,xmm7 movdqa xmm7,[16+eax] pmuludq xmm6,[64+edx] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+edx] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[32+edx] paddq xmm2,xmm7 movdqa xmm7,[32+eax] pmuludq xmm6,[48+edx] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[112+edx] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[128+edx] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[16+edx] paddq xmm1,xmm5 movdqa xmm5,[48+eax] pmuludq xmm7,[32+edx] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[96+edx] paddq xmm4,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[112+edx] paddq xmm0,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[128+edx] paddq xmm1,xmm6 movdqa xmm6,[64+eax] pmuludq xmm5,[16+edx] paddq xmm2,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[128+edx] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[80+edx] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[96+edx] paddq xmm0,xmm7 movdqa xmm7,[64+ebx] pmuludq xmm6,[112+edx] paddq xmm1,xmm5 paddq xmm2,xmm6 movdqa xmm5,xmm3 pand xmm3,xmm7 psrlq xmm5,26 paddq xmm5,xmm4 movdqa xmm6,xmm0 pand xmm0,xmm7 psrlq xmm6,26 movdqa xmm4,xmm5 paddq xmm6,xmm1 psrlq xmm5,26 pand xmm4,xmm7 movdqa xmm1,xmm6 psrlq xmm6,26 paddd xmm0,xmm5 psllq xmm5,2 paddq xmm6,xmm2 paddq xmm5,xmm0 pand xmm1,xmm7 movdqa xmm2,xmm6 psrlq xmm6,26 pand xmm2,xmm7 paddd xmm6,xmm3 movdqa xmm0,xmm5 psrlq xmm5,26 movdqa xmm3,xmm6 psrlq xmm6,26 pand xmm0,xmm7 paddd xmm1,xmm5 pand xmm3,xmm7 paddd xmm4,xmm6 movdqu xmm5,[32+esi] movdqu xmm6,[48+esi] lea esi,[32+esi] movdqa [112+esp],xmm2 movdqa [128+esp],xmm3 movdqa [144+esp],xmm4 movdqa xmm2,xmm5 movdqa xmm3,xmm6 psrldq xmm2,6 psrldq xmm3,6 movdqa xmm4,xmm5 punpcklqdq xmm2,xmm3 punpckhqdq xmm4,xmm6 punpcklqdq xmm5,xmm6 movdqa xmm3,xmm2 psrlq xmm2,4 psrlq xmm3,30 movdqa xmm6,xmm5 psrlq xmm4,40 psrlq xmm6,26 pand xmm5,xmm7 pand xmm6,xmm7 pand xmm2,xmm7 pand xmm3,xmm7 por xmm4,[ebx] movdqa [80+esp],xmm0 movdqa [96+esp],xmm1 ja NEAR L$014loop L$013skip_loop: pshufd xmm7,[edx-144],16 add ecx,32 jnz NEAR L$015long_tail paddd xmm5,xmm0 paddd xmm6,xmm1 paddd xmm2,[112+esp] paddd xmm3,[128+esp] paddd xmm4,[144+esp] L$015long_tail: movdqa [eax],xmm5 movdqa [16+eax],xmm6 movdqa [32+eax],xmm2 movdqa [48+eax],xmm3 movdqa [64+eax],xmm4 pmuludq xmm5,xmm7 pmuludq xmm6,xmm7 pmuludq xmm2,xmm7 movdqa xmm0,xmm5 pshufd xmm5,[edx-128],16 pmuludq xmm3,xmm7 movdqa xmm1,xmm6 pmuludq xmm4,xmm7 movdqa xmm6,xmm5 pmuludq xmm5,[48+eax] movdqa xmm7,xmm6 pmuludq xmm6,[32+eax] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+eax] paddq xmm3,xmm6 pshufd xmm6,[edx-64],16 pmuludq xmm5,[eax] paddq xmm2,xmm7 pmuludq xmm6,[64+eax] pshufd xmm7,[edx-112],16 paddq xmm1,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[32+eax] paddq xmm0,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[16+eax] paddq xmm4,xmm7 pshufd xmm7,[edx-48],16 pmuludq xmm6,[eax] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[64+eax] paddq xmm2,xmm6 pmuludq xmm5,[48+eax] pshufd xmm6,[edx-96],16 paddq xmm1,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[16+eax] paddq xmm0,xmm5 pshufd xmm5,[edx-32],16 pmuludq xmm7,[eax] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[64+eax] paddq xmm3,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[48+eax] paddq xmm2,xmm5 pmuludq xmm7,[32+eax] pshufd xmm5,[edx-80],16 paddq xmm1,xmm6 pshufd xmm6,[edx-16],16 pmuludq xmm5,[eax] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[64+eax] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+eax] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[32+eax] paddq xmm0,xmm7 pmuludq xmm6,[48+eax] movdqa xmm7,[64+ebx] paddq xmm1,xmm5 paddq xmm2,xmm6 jz NEAR L$016short_tail movdqu xmm5,[esi-32] movdqu xmm6,[esi-16] lea esi,[32+esi] movdqa [32+esp],xmm2 movdqa [48+esp],xmm3 movdqa [64+esp],xmm4 movdqa xmm2,xmm5 movdqa xmm3,xmm6 psrldq xmm2,6 psrldq xmm3,6 movdqa xmm4,xmm5 punpcklqdq xmm2,xmm3 punpckhqdq xmm4,xmm6 punpcklqdq xmm5,xmm6 movdqa xmm3,xmm2 psrlq xmm2,4 psrlq xmm3,30 movdqa xmm6,xmm5 psrlq xmm4,40 psrlq xmm6,26 pand xmm5,xmm7 pand xmm6,xmm7 pand xmm2,xmm7 pand xmm3,xmm7 por xmm4,[ebx] pshufd xmm7,[edx],16 paddd xmm5,[80+esp] paddd xmm6,[96+esp] paddd xmm2,[112+esp] paddd xmm3,[128+esp] paddd xmm4,[144+esp] movdqa [esp],xmm5 pmuludq xmm5,xmm7 movdqa [16+esp],xmm6 pmuludq xmm6,xmm7 paddq xmm0,xmm5 movdqa xmm5,xmm2 pmuludq xmm2,xmm7 paddq xmm1,xmm6 movdqa xmm6,xmm3 pmuludq xmm3,xmm7 paddq xmm2,[32+esp] movdqa [32+esp],xmm5 pshufd xmm5,[16+edx],16 paddq xmm3,[48+esp] movdqa [48+esp],xmm6 movdqa xmm6,xmm4 pmuludq xmm4,xmm7 paddq xmm4,[64+esp] movdqa [64+esp],xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[48+esp] movdqa xmm7,xmm6 pmuludq xmm6,[32+esp] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+esp] paddq xmm3,xmm6 pshufd xmm6,[80+edx],16 pmuludq xmm5,[esp] paddq xmm2,xmm7 pmuludq xmm6,[64+esp] pshufd xmm7,[32+edx],16 paddq xmm1,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[32+esp] paddq xmm0,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[16+esp] paddq xmm4,xmm7 pshufd xmm7,[96+edx],16 pmuludq xmm6,[esp] paddq xmm3,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[64+esp] paddq xmm2,xmm6 pmuludq xmm5,[48+esp] pshufd xmm6,[48+edx],16 paddq xmm1,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[16+esp] paddq xmm0,xmm5 pshufd xmm5,[112+edx],16 pmuludq xmm7,[esp] paddq xmm4,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[64+esp] paddq xmm3,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[48+esp] paddq xmm2,xmm5 pmuludq xmm7,[32+esp] pshufd xmm5,[64+edx],16 paddq xmm1,xmm6 pshufd xmm6,[128+edx],16 pmuludq xmm5,[esp] paddq xmm0,xmm7 movdqa xmm7,xmm6 pmuludq xmm6,[64+esp] paddq xmm4,xmm5 movdqa xmm5,xmm7 pmuludq xmm7,[16+esp] paddq xmm3,xmm6 movdqa xmm6,xmm5 pmuludq xmm5,[32+esp] paddq xmm0,xmm7 pmuludq xmm6,[48+esp] movdqa xmm7,[64+ebx] paddq xmm1,xmm5 paddq xmm2,xmm6 L$016short_tail: pshufd xmm6,xmm4,78 pshufd xmm5,xmm3,78 paddq xmm4,xmm6 paddq xmm3,xmm5 pshufd xmm6,xmm0,78 pshufd xmm5,xmm1,78 paddq xmm0,xmm6 paddq xmm1,xmm5 pshufd xmm6,xmm2,78 movdqa xmm5,xmm3 pand xmm3,xmm7 psrlq xmm5,26 paddq xmm2,xmm6 paddq xmm5,xmm4 movdqa xmm6,xmm0 pand xmm0,xmm7 psrlq xmm6,26 movdqa xmm4,xmm5 paddq xmm6,xmm1 psrlq xmm5,26 pand xmm4,xmm7 movdqa xmm1,xmm6 psrlq xmm6,26 paddd xmm0,xmm5 psllq xmm5,2 paddq xmm6,xmm2 paddq xmm5,xmm0 pand xmm1,xmm7 movdqa xmm2,xmm6 psrlq xmm6,26 pand xmm2,xmm7 paddd xmm6,xmm3 movdqa xmm0,xmm5 psrlq xmm5,26 movdqa xmm3,xmm6 psrlq xmm6,26 pand xmm0,xmm7 paddd xmm1,xmm5 pand xmm3,xmm7 paddd xmm4,xmm6 L$012done: movd DWORD [edi-48],xmm0 movd DWORD [edi-44],xmm1 movd DWORD [edi-40],xmm2 movd DWORD [edi-36],xmm3 movd DWORD [edi-32],xmm4 mov esp,ebp L$006nodata: pop edi pop esi pop ebx pop ebp ret align 32 align 16 __poly1305_emit_sse2: push ebp push ebx push esi push edi mov ebp,DWORD [20+esp] cmp DWORD [20+ebp],0 je NEAR L$enter_emit mov eax,DWORD [ebp] mov edi,DWORD [4+ebp] mov ecx,DWORD [8+ebp] mov edx,DWORD [12+ebp] mov esi,DWORD [16+ebp] mov ebx,edi shl edi,26 shr ebx,6 add eax,edi mov edi,ecx adc ebx,0 shl edi,20 shr ecx,12 add ebx,edi mov edi,edx adc ecx,0 shl edi,14 shr edx,18 add ecx,edi mov edi,esi adc edx,0 shl edi,8 shr esi,24 add edx,edi adc esi,0 mov edi,esi and esi,3 shr edi,2 lea ebp,[edi*4+edi] mov edi,DWORD [24+esp] add eax,ebp mov ebp,DWORD [28+esp] adc ebx,0 adc ecx,0 adc edx,0 adc esi,0 movd xmm0,eax add eax,5 movd xmm1,ebx adc ebx,0 movd xmm2,ecx adc ecx,0 movd xmm3,edx adc edx,0 adc esi,0 shr esi,2 neg esi and eax,esi and ebx,esi and ecx,esi and edx,esi mov DWORD [edi],eax movd eax,xmm0 mov DWORD [4+edi],ebx movd ebx,xmm1 mov DWORD [8+edi],ecx movd ecx,xmm2 mov DWORD [12+edi],edx movd edx,xmm3 not esi and eax,esi and ebx,esi or eax,DWORD [edi] and ecx,esi or ebx,DWORD [4+edi] and edx,esi or ecx,DWORD [8+edi] or edx,DWORD [12+edi] add eax,DWORD [ebp] adc ebx,DWORD [4+ebp] mov DWORD [edi],eax adc ecx,DWORD [8+ebp] mov DWORD [4+edi],ebx adc edx,DWORD [12+ebp] mov DWORD [8+edi],ecx mov DWORD [12+edi],edx pop edi pop esi pop ebx pop ebp ret align 64 L$const_sse2: dd 16777216,0,16777216,0,16777216,0,16777216,0 dd 0,0,0,0,0,0,0,0 dd 67108863,0,67108863,0,67108863,0,67108863,0 dd 268435455,268435452,268435452,268435452 db 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54 db 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 db 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 db 114,103,62,0 align 4 segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/poly1305-x86_64-nasm.asm000064400000000000000000001152131353224260200200710ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_poly1305_init_asm global GFp_poly1305_blocks global GFp_poly1305_emit ALIGN 32 GFp_poly1305_init_asm: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_poly1305_init_asm: mov rdi,rcx mov rsi,rdx mov rdx,r8 xor rax,rax mov QWORD[rdi],rax mov QWORD[8+rdi],rax mov QWORD[16+rdi],rax cmp rsi,0 je NEAR $L$no_key lea r10,[GFp_poly1305_blocks] lea r11,[GFp_poly1305_emit] mov r9,QWORD[((GFp_ia32cap_P+4))] lea rax,[poly1305_blocks_avx] lea rcx,[poly1305_emit_avx] bt r9,28 cmovc r10,rax cmovc r11,rcx lea rax,[poly1305_blocks_avx2] bt r9,37 cmovc r10,rax mov rax,0x0ffffffc0fffffff mov rcx,0x0ffffffc0ffffffc and rax,QWORD[rsi] and rcx,QWORD[8+rsi] mov QWORD[24+rdi],rax mov QWORD[32+rdi],rcx mov QWORD[rdx],r10 mov QWORD[8+rdx],r11 mov eax,1 $L$no_key: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_poly1305_init_asm: ALIGN 32 GFp_poly1305_blocks: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_poly1305_blocks: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 $L$blocks: shr rdx,4 jz NEAR $L$no_data push rbx push rbp push r12 push r13 push r14 push r15 $L$blocks_body: mov r15,rdx mov r11,QWORD[24+rdi] mov r13,QWORD[32+rdi] mov r14,QWORD[rdi] mov rbx,QWORD[8+rdi] mov rbp,QWORD[16+rdi] mov r12,r13 shr r13,2 mov rax,r12 add r13,r12 jmp NEAR $L$oop ALIGN 32 $L$oop: add r14,QWORD[rsi] adc rbx,QWORD[8+rsi] lea rsi,[16+rsi] adc rbp,rcx mul r14 mov r9,rax mov rax,r11 mov r10,rdx mul r14 mov r14,rax mov rax,r11 mov r8,rdx mul rbx add r9,rax mov rax,r13 adc r10,rdx mul rbx mov rbx,rbp add r14,rax adc r8,rdx imul rbx,r13 add r9,rbx mov rbx,r8 adc r10,0 imul rbp,r11 add rbx,r9 mov rax,-4 adc r10,rbp and rax,r10 mov rbp,r10 shr r10,2 and rbp,3 add rax,r10 add r14,rax adc rbx,0 adc rbp,0 mov rax,r12 dec r15 jnz NEAR $L$oop mov QWORD[rdi],r14 mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rbp mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbp,QWORD[32+rsp] mov rbx,QWORD[40+rsp] lea rsp,[48+rsp] $L$no_data: $L$blocks_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_poly1305_blocks: ALIGN 32 GFp_poly1305_emit: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_poly1305_emit: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$emit: mov r8,QWORD[rdi] mov r9,QWORD[8+rdi] mov r10,QWORD[16+rdi] mov rax,r8 add r8,5 mov rcx,r9 adc r9,0 adc r10,0 shr r10,2 cmovnz rax,r8 cmovnz rcx,r9 add rax,QWORD[rdx] adc rcx,QWORD[8+rdx] mov QWORD[rsi],rax mov QWORD[8+rsi],rcx mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_poly1305_emit: ALIGN 32 __poly1305_block: mul r14 mov r9,rax mov rax,r11 mov r10,rdx mul r14 mov r14,rax mov rax,r11 mov r8,rdx mul rbx add r9,rax mov rax,r13 adc r10,rdx mul rbx mov rbx,rbp add r14,rax adc r8,rdx imul rbx,r13 add r9,rbx mov rbx,r8 adc r10,0 imul rbp,r11 add rbx,r9 mov rax,-4 adc r10,rbp and rax,r10 mov rbp,r10 shr r10,2 and rbp,3 add rax,r10 add r14,rax adc rbx,0 adc rbp,0 DB 0F3h,0C3h ;repret ALIGN 32 __poly1305_init_avx: mov r14,r11 mov rbx,r12 xor rbp,rbp lea rdi,[((48+64))+rdi] mov rax,r12 call __poly1305_block mov eax,0x3ffffff mov edx,0x3ffffff mov r8,r14 and eax,r14d mov r9,r11 and edx,r11d mov DWORD[((-64))+rdi],eax shr r8,26 mov DWORD[((-60))+rdi],edx shr r9,26 mov eax,0x3ffffff mov edx,0x3ffffff and eax,r8d and edx,r9d mov DWORD[((-48))+rdi],eax lea eax,[rax*4+rax] mov DWORD[((-44))+rdi],edx lea edx,[rdx*4+rdx] mov DWORD[((-32))+rdi],eax shr r8,26 mov DWORD[((-28))+rdi],edx shr r9,26 mov rax,rbx mov rdx,r12 shl rax,12 shl rdx,12 or rax,r8 or rdx,r9 and eax,0x3ffffff and edx,0x3ffffff mov DWORD[((-16))+rdi],eax lea eax,[rax*4+rax] mov DWORD[((-12))+rdi],edx lea edx,[rdx*4+rdx] mov DWORD[rdi],eax mov r8,rbx mov DWORD[4+rdi],edx mov r9,r12 mov eax,0x3ffffff mov edx,0x3ffffff shr r8,14 shr r9,14 and eax,r8d and edx,r9d mov DWORD[16+rdi],eax lea eax,[rax*4+rax] mov DWORD[20+rdi],edx lea edx,[rdx*4+rdx] mov DWORD[32+rdi],eax shr r8,26 mov DWORD[36+rdi],edx shr r9,26 mov rax,rbp shl rax,24 or r8,rax mov DWORD[48+rdi],r8d lea r8,[r8*4+r8] mov DWORD[52+rdi],r9d lea r9,[r9*4+r9] mov DWORD[64+rdi],r8d mov DWORD[68+rdi],r9d mov rax,r12 call __poly1305_block mov eax,0x3ffffff mov r8,r14 and eax,r14d shr r8,26 mov DWORD[((-52))+rdi],eax mov edx,0x3ffffff and edx,r8d mov DWORD[((-36))+rdi],edx lea edx,[rdx*4+rdx] shr r8,26 mov DWORD[((-20))+rdi],edx mov rax,rbx shl rax,12 or rax,r8 and eax,0x3ffffff mov DWORD[((-4))+rdi],eax lea eax,[rax*4+rax] mov r8,rbx mov DWORD[12+rdi],eax mov edx,0x3ffffff shr r8,14 and edx,r8d mov DWORD[28+rdi],edx lea edx,[rdx*4+rdx] shr r8,26 mov DWORD[44+rdi],edx mov rax,rbp shl rax,24 or r8,rax mov DWORD[60+rdi],r8d lea r8,[r8*4+r8] mov DWORD[76+rdi],r8d mov rax,r12 call __poly1305_block mov eax,0x3ffffff mov r8,r14 and eax,r14d shr r8,26 mov DWORD[((-56))+rdi],eax mov edx,0x3ffffff and edx,r8d mov DWORD[((-40))+rdi],edx lea edx,[rdx*4+rdx] shr r8,26 mov DWORD[((-24))+rdi],edx mov rax,rbx shl rax,12 or rax,r8 and eax,0x3ffffff mov DWORD[((-8))+rdi],eax lea eax,[rax*4+rax] mov r8,rbx mov DWORD[8+rdi],eax mov edx,0x3ffffff shr r8,14 and edx,r8d mov DWORD[24+rdi],edx lea edx,[rdx*4+rdx] shr r8,26 mov DWORD[40+rdi],edx mov rax,rbp shl rax,24 or r8,rax mov DWORD[56+rdi],r8d lea r8,[r8*4+r8] mov DWORD[72+rdi],r8d lea rdi,[((-48-64))+rdi] DB 0F3h,0C3h ;repret ALIGN 32 poly1305_blocks_avx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_poly1305_blocks_avx: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8d,DWORD[20+rdi] cmp rdx,128 jae NEAR $L$blocks_avx test r8d,r8d jz NEAR $L$blocks $L$blocks_avx: and rdx,-16 jz NEAR $L$no_data_avx vzeroupper test r8d,r8d jz NEAR $L$base2_64_avx test rdx,31 jz NEAR $L$even_avx push rbx push rbp push r12 push r13 push r14 push r15 $L$blocks_avx_body: mov r15,rdx mov r8,QWORD[rdi] mov r9,QWORD[8+rdi] mov ebp,DWORD[16+rdi] mov r11,QWORD[24+rdi] mov r13,QWORD[32+rdi] mov r14d,r8d and r8,-2147483648 mov r12,r9 mov ebx,r9d and r9,-2147483648 shr r8,6 shl r12,52 add r14,r8 shr rbx,12 shr r9,18 add r14,r12 adc rbx,r9 mov r8,rbp shl r8,40 shr rbp,24 add rbx,r8 adc rbp,0 mov r9,-4 mov r8,rbp and r9,rbp shr r8,2 and rbp,3 add r8,r9 add r14,r8 adc rbx,0 adc rbp,0 mov r12,r13 mov rax,r13 shr r13,2 add r13,r12 add r14,QWORD[rsi] adc rbx,QWORD[8+rsi] lea rsi,[16+rsi] adc rbp,rcx call __poly1305_block test rcx,rcx jz NEAR $L$store_base2_64_avx mov rax,r14 mov rdx,r14 shr r14,52 mov r11,rbx mov r12,rbx shr rdx,26 and rax,0x3ffffff shl r11,12 and rdx,0x3ffffff shr rbx,14 or r14,r11 shl rbp,24 and r14,0x3ffffff shr r12,40 and rbx,0x3ffffff or rbp,r12 sub r15,16 jz NEAR $L$store_base2_26_avx vmovd xmm0,eax vmovd xmm1,edx vmovd xmm2,r14d vmovd xmm3,ebx vmovd xmm4,ebp jmp NEAR $L$proceed_avx ALIGN 32 $L$store_base2_64_avx: mov QWORD[rdi],r14 mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rbp jmp NEAR $L$done_avx ALIGN 16 $L$store_base2_26_avx: mov DWORD[rdi],eax mov DWORD[4+rdi],edx mov DWORD[8+rdi],r14d mov DWORD[12+rdi],ebx mov DWORD[16+rdi],ebp ALIGN 16 $L$done_avx: mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbp,QWORD[32+rsp] mov rbx,QWORD[40+rsp] lea rsp,[48+rsp] $L$no_data_avx: $L$blocks_avx_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret ALIGN 32 $L$base2_64_avx: push rbx push rbp push r12 push r13 push r14 push r15 $L$base2_64_avx_body: mov r15,rdx mov r11,QWORD[24+rdi] mov r13,QWORD[32+rdi] mov r14,QWORD[rdi] mov rbx,QWORD[8+rdi] mov ebp,DWORD[16+rdi] mov r12,r13 mov rax,r13 shr r13,2 add r13,r12 test rdx,31 jz NEAR $L$init_avx add r14,QWORD[rsi] adc rbx,QWORD[8+rsi] lea rsi,[16+rsi] adc rbp,rcx sub r15,16 call __poly1305_block $L$init_avx: mov rax,r14 mov rdx,r14 shr r14,52 mov r8,rbx mov r9,rbx shr rdx,26 and rax,0x3ffffff shl r8,12 and rdx,0x3ffffff shr rbx,14 or r14,r8 shl rbp,24 and r14,0x3ffffff shr r9,40 and rbx,0x3ffffff or rbp,r9 vmovd xmm0,eax vmovd xmm1,edx vmovd xmm2,r14d vmovd xmm3,ebx vmovd xmm4,ebp mov DWORD[20+rdi],1 call __poly1305_init_avx $L$proceed_avx: mov rdx,r15 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbp,QWORD[32+rsp] mov rbx,QWORD[40+rsp] lea rax,[48+rsp] lea rsp,[48+rsp] $L$base2_64_avx_epilogue: jmp NEAR $L$do_avx ALIGN 32 $L$even_avx: vmovd xmm0,DWORD[rdi] vmovd xmm1,DWORD[4+rdi] vmovd xmm2,DWORD[8+rdi] vmovd xmm3,DWORD[12+rdi] vmovd xmm4,DWORD[16+rdi] $L$do_avx: lea r11,[((-248))+rsp] sub rsp,0x218 vmovdqa XMMWORD[80+r11],xmm6 vmovdqa XMMWORD[96+r11],xmm7 vmovdqa XMMWORD[112+r11],xmm8 vmovdqa XMMWORD[128+r11],xmm9 vmovdqa XMMWORD[144+r11],xmm10 vmovdqa XMMWORD[160+r11],xmm11 vmovdqa XMMWORD[176+r11],xmm12 vmovdqa XMMWORD[192+r11],xmm13 vmovdqa XMMWORD[208+r11],xmm14 vmovdqa XMMWORD[224+r11],xmm15 $L$do_avx_body: sub rdx,64 lea rax,[((-32))+rsi] cmovc rsi,rax vmovdqu xmm14,XMMWORD[48+rdi] lea rdi,[112+rdi] lea rcx,[$L$const] vmovdqu xmm5,XMMWORD[32+rsi] vmovdqu xmm6,XMMWORD[48+rsi] vmovdqa xmm15,XMMWORD[64+rcx] vpsrldq xmm7,xmm5,6 vpsrldq xmm8,xmm6,6 vpunpckhqdq xmm9,xmm5,xmm6 vpunpcklqdq xmm5,xmm5,xmm6 vpunpcklqdq xmm8,xmm7,xmm8 vpsrlq xmm9,xmm9,40 vpsrlq xmm6,xmm5,26 vpand xmm5,xmm5,xmm15 vpsrlq xmm7,xmm8,4 vpand xmm6,xmm6,xmm15 vpsrlq xmm8,xmm8,30 vpand xmm7,xmm7,xmm15 vpand xmm8,xmm8,xmm15 vpor xmm9,xmm9,XMMWORD[32+rcx] jbe NEAR $L$skip_loop_avx vmovdqu xmm11,XMMWORD[((-48))+rdi] vmovdqu xmm12,XMMWORD[((-32))+rdi] vpshufd xmm13,xmm14,0xEE vpshufd xmm10,xmm14,0x44 vmovdqa XMMWORD[(-144)+r11],xmm13 vmovdqa XMMWORD[rsp],xmm10 vpshufd xmm14,xmm11,0xEE vmovdqu xmm10,XMMWORD[((-16))+rdi] vpshufd xmm11,xmm11,0x44 vmovdqa XMMWORD[(-128)+r11],xmm14 vmovdqa XMMWORD[16+rsp],xmm11 vpshufd xmm13,xmm12,0xEE vmovdqu xmm11,XMMWORD[rdi] vpshufd xmm12,xmm12,0x44 vmovdqa XMMWORD[(-112)+r11],xmm13 vmovdqa XMMWORD[32+rsp],xmm12 vpshufd xmm14,xmm10,0xEE vmovdqu xmm12,XMMWORD[16+rdi] vpshufd xmm10,xmm10,0x44 vmovdqa XMMWORD[(-96)+r11],xmm14 vmovdqa XMMWORD[48+rsp],xmm10 vpshufd xmm13,xmm11,0xEE vmovdqu xmm10,XMMWORD[32+rdi] vpshufd xmm11,xmm11,0x44 vmovdqa XMMWORD[(-80)+r11],xmm13 vmovdqa XMMWORD[64+rsp],xmm11 vpshufd xmm14,xmm12,0xEE vmovdqu xmm11,XMMWORD[48+rdi] vpshufd xmm12,xmm12,0x44 vmovdqa XMMWORD[(-64)+r11],xmm14 vmovdqa XMMWORD[80+rsp],xmm12 vpshufd xmm13,xmm10,0xEE vmovdqu xmm12,XMMWORD[64+rdi] vpshufd xmm10,xmm10,0x44 vmovdqa XMMWORD[(-48)+r11],xmm13 vmovdqa XMMWORD[96+rsp],xmm10 vpshufd xmm14,xmm11,0xEE vpshufd xmm11,xmm11,0x44 vmovdqa XMMWORD[(-32)+r11],xmm14 vmovdqa XMMWORD[112+rsp],xmm11 vpshufd xmm13,xmm12,0xEE vmovdqa xmm14,XMMWORD[rsp] vpshufd xmm12,xmm12,0x44 vmovdqa XMMWORD[(-16)+r11],xmm13 vmovdqa XMMWORD[128+rsp],xmm12 jmp NEAR $L$oop_avx ALIGN 32 $L$oop_avx: vpmuludq xmm10,xmm14,xmm5 vpmuludq xmm11,xmm14,xmm6 vmovdqa XMMWORD[32+r11],xmm2 vpmuludq xmm12,xmm14,xmm7 vmovdqa xmm2,XMMWORD[16+rsp] vpmuludq xmm13,xmm14,xmm8 vpmuludq xmm14,xmm14,xmm9 vmovdqa XMMWORD[r11],xmm0 vpmuludq xmm0,xmm9,XMMWORD[32+rsp] vmovdqa XMMWORD[16+r11],xmm1 vpmuludq xmm1,xmm2,xmm8 vpaddq xmm10,xmm10,xmm0 vpaddq xmm14,xmm14,xmm1 vmovdqa XMMWORD[48+r11],xmm3 vpmuludq xmm0,xmm2,xmm7 vpmuludq xmm1,xmm2,xmm6 vpaddq xmm13,xmm13,xmm0 vmovdqa xmm3,XMMWORD[48+rsp] vpaddq xmm12,xmm12,xmm1 vmovdqa XMMWORD[64+r11],xmm4 vpmuludq xmm2,xmm2,xmm5 vpmuludq xmm0,xmm3,xmm7 vpaddq xmm11,xmm11,xmm2 vmovdqa xmm4,XMMWORD[64+rsp] vpaddq xmm14,xmm14,xmm0 vpmuludq xmm1,xmm3,xmm6 vpmuludq xmm3,xmm3,xmm5 vpaddq xmm13,xmm13,xmm1 vmovdqa xmm2,XMMWORD[80+rsp] vpaddq xmm12,xmm12,xmm3 vpmuludq xmm0,xmm4,xmm9 vpmuludq xmm4,xmm4,xmm8 vpaddq xmm11,xmm11,xmm0 vmovdqa xmm3,XMMWORD[96+rsp] vpaddq xmm10,xmm10,xmm4 vmovdqa xmm4,XMMWORD[128+rsp] vpmuludq xmm1,xmm2,xmm6 vpmuludq xmm2,xmm2,xmm5 vpaddq xmm14,xmm14,xmm1 vpaddq xmm13,xmm13,xmm2 vpmuludq xmm0,xmm3,xmm9 vpmuludq xmm1,xmm3,xmm8 vpaddq xmm12,xmm12,xmm0 vmovdqu xmm0,XMMWORD[rsi] vpaddq xmm11,xmm11,xmm1 vpmuludq xmm3,xmm3,xmm7 vpmuludq xmm7,xmm4,xmm7 vpaddq xmm10,xmm10,xmm3 vmovdqu xmm1,XMMWORD[16+rsi] vpaddq xmm11,xmm11,xmm7 vpmuludq xmm8,xmm4,xmm8 vpmuludq xmm9,xmm4,xmm9 vpsrldq xmm2,xmm0,6 vpaddq xmm12,xmm12,xmm8 vpaddq xmm13,xmm13,xmm9 vpsrldq xmm3,xmm1,6 vpmuludq xmm9,xmm5,XMMWORD[112+rsp] vpmuludq xmm5,xmm4,xmm6 vpunpckhqdq xmm4,xmm0,xmm1 vpaddq xmm14,xmm14,xmm9 vmovdqa xmm9,XMMWORD[((-144))+r11] vpaddq xmm10,xmm10,xmm5 vpunpcklqdq xmm0,xmm0,xmm1 vpunpcklqdq xmm3,xmm2,xmm3 vpsrldq xmm4,xmm4,5 vpsrlq xmm1,xmm0,26 vpand xmm0,xmm0,xmm15 vpsrlq xmm2,xmm3,4 vpand xmm1,xmm1,xmm15 vpand xmm4,xmm4,XMMWORD[rcx] vpsrlq xmm3,xmm3,30 vpand xmm2,xmm2,xmm15 vpand xmm3,xmm3,xmm15 vpor xmm4,xmm4,XMMWORD[32+rcx] vpaddq xmm0,xmm0,XMMWORD[r11] vpaddq xmm1,xmm1,XMMWORD[16+r11] vpaddq xmm2,xmm2,XMMWORD[32+r11] vpaddq xmm3,xmm3,XMMWORD[48+r11] vpaddq xmm4,xmm4,XMMWORD[64+r11] lea rax,[32+rsi] lea rsi,[64+rsi] sub rdx,64 cmovc rsi,rax vpmuludq xmm5,xmm9,xmm0 vpmuludq xmm6,xmm9,xmm1 vpaddq xmm10,xmm10,xmm5 vpaddq xmm11,xmm11,xmm6 vmovdqa xmm7,XMMWORD[((-128))+r11] vpmuludq xmm5,xmm9,xmm2 vpmuludq xmm6,xmm9,xmm3 vpaddq xmm12,xmm12,xmm5 vpaddq xmm13,xmm13,xmm6 vpmuludq xmm9,xmm9,xmm4 vpmuludq xmm5,xmm4,XMMWORD[((-112))+r11] vpaddq xmm14,xmm14,xmm9 vpaddq xmm10,xmm10,xmm5 vpmuludq xmm6,xmm7,xmm2 vpmuludq xmm5,xmm7,xmm3 vpaddq xmm13,xmm13,xmm6 vmovdqa xmm8,XMMWORD[((-96))+r11] vpaddq xmm14,xmm14,xmm5 vpmuludq xmm6,xmm7,xmm1 vpmuludq xmm7,xmm7,xmm0 vpaddq xmm12,xmm12,xmm6 vpaddq xmm11,xmm11,xmm7 vmovdqa xmm9,XMMWORD[((-80))+r11] vpmuludq xmm5,xmm8,xmm2 vpmuludq xmm6,xmm8,xmm1 vpaddq xmm14,xmm14,xmm5 vpaddq xmm13,xmm13,xmm6 vmovdqa xmm7,XMMWORD[((-64))+r11] vpmuludq xmm8,xmm8,xmm0 vpmuludq xmm5,xmm9,xmm4 vpaddq xmm12,xmm12,xmm8 vpaddq xmm11,xmm11,xmm5 vmovdqa xmm8,XMMWORD[((-48))+r11] vpmuludq xmm9,xmm9,xmm3 vpmuludq xmm6,xmm7,xmm1 vpaddq xmm10,xmm10,xmm9 vmovdqa xmm9,XMMWORD[((-16))+r11] vpaddq xmm14,xmm14,xmm6 vpmuludq xmm7,xmm7,xmm0 vpmuludq xmm5,xmm8,xmm4 vpaddq xmm13,xmm13,xmm7 vpaddq xmm12,xmm12,xmm5 vmovdqu xmm5,XMMWORD[32+rsi] vpmuludq xmm7,xmm8,xmm3 vpmuludq xmm8,xmm8,xmm2 vpaddq xmm11,xmm11,xmm7 vmovdqu xmm6,XMMWORD[48+rsi] vpaddq xmm10,xmm10,xmm8 vpmuludq xmm2,xmm9,xmm2 vpmuludq xmm3,xmm9,xmm3 vpsrldq xmm7,xmm5,6 vpaddq xmm11,xmm11,xmm2 vpmuludq xmm4,xmm9,xmm4 vpsrldq xmm8,xmm6,6 vpaddq xmm2,xmm12,xmm3 vpaddq xmm3,xmm13,xmm4 vpmuludq xmm4,xmm0,XMMWORD[((-32))+r11] vpmuludq xmm0,xmm9,xmm1 vpunpckhqdq xmm9,xmm5,xmm6 vpaddq xmm4,xmm14,xmm4 vpaddq xmm0,xmm10,xmm0 vpunpcklqdq xmm5,xmm5,xmm6 vpunpcklqdq xmm8,xmm7,xmm8 vpsrldq xmm9,xmm9,5 vpsrlq xmm6,xmm5,26 vmovdqa xmm14,XMMWORD[rsp] vpand xmm5,xmm5,xmm15 vpsrlq xmm7,xmm8,4 vpand xmm6,xmm6,xmm15 vpand xmm9,xmm9,XMMWORD[rcx] vpsrlq xmm8,xmm8,30 vpand xmm7,xmm7,xmm15 vpand xmm8,xmm8,xmm15 vpor xmm9,xmm9,XMMWORD[32+rcx] vpsrlq xmm13,xmm3,26 vpand xmm3,xmm3,xmm15 vpaddq xmm4,xmm4,xmm13 vpsrlq xmm10,xmm0,26 vpand xmm0,xmm0,xmm15 vpaddq xmm1,xmm11,xmm10 vpsrlq xmm10,xmm4,26 vpand xmm4,xmm4,xmm15 vpsrlq xmm11,xmm1,26 vpand xmm1,xmm1,xmm15 vpaddq xmm2,xmm2,xmm11 vpaddq xmm0,xmm0,xmm10 vpsllq xmm10,xmm10,2 vpaddq xmm0,xmm0,xmm10 vpsrlq xmm12,xmm2,26 vpand xmm2,xmm2,xmm15 vpaddq xmm3,xmm3,xmm12 vpsrlq xmm10,xmm0,26 vpand xmm0,xmm0,xmm15 vpaddq xmm1,xmm1,xmm10 vpsrlq xmm13,xmm3,26 vpand xmm3,xmm3,xmm15 vpaddq xmm4,xmm4,xmm13 ja NEAR $L$oop_avx $L$skip_loop_avx: vpshufd xmm14,xmm14,0x10 add rdx,32 jnz NEAR $L$ong_tail_avx vpaddq xmm7,xmm7,xmm2 vpaddq xmm5,xmm5,xmm0 vpaddq xmm6,xmm6,xmm1 vpaddq xmm8,xmm8,xmm3 vpaddq xmm9,xmm9,xmm4 $L$ong_tail_avx: vmovdqa XMMWORD[32+r11],xmm2 vmovdqa XMMWORD[r11],xmm0 vmovdqa XMMWORD[16+r11],xmm1 vmovdqa XMMWORD[48+r11],xmm3 vmovdqa XMMWORD[64+r11],xmm4 vpmuludq xmm12,xmm14,xmm7 vpmuludq xmm10,xmm14,xmm5 vpshufd xmm2,XMMWORD[((-48))+rdi],0x10 vpmuludq xmm11,xmm14,xmm6 vpmuludq xmm13,xmm14,xmm8 vpmuludq xmm14,xmm14,xmm9 vpmuludq xmm0,xmm2,xmm8 vpaddq xmm14,xmm14,xmm0 vpshufd xmm3,XMMWORD[((-32))+rdi],0x10 vpmuludq xmm1,xmm2,xmm7 vpaddq xmm13,xmm13,xmm1 vpshufd xmm4,XMMWORD[((-16))+rdi],0x10 vpmuludq xmm0,xmm2,xmm6 vpaddq xmm12,xmm12,xmm0 vpmuludq xmm2,xmm2,xmm5 vpaddq xmm11,xmm11,xmm2 vpmuludq xmm3,xmm3,xmm9 vpaddq xmm10,xmm10,xmm3 vpshufd xmm2,XMMWORD[rdi],0x10 vpmuludq xmm1,xmm4,xmm7 vpaddq xmm14,xmm14,xmm1 vpmuludq xmm0,xmm4,xmm6 vpaddq xmm13,xmm13,xmm0 vpshufd xmm3,XMMWORD[16+rdi],0x10 vpmuludq xmm4,xmm4,xmm5 vpaddq xmm12,xmm12,xmm4 vpmuludq xmm1,xmm2,xmm9 vpaddq xmm11,xmm11,xmm1 vpshufd xmm4,XMMWORD[32+rdi],0x10 vpmuludq xmm2,xmm2,xmm8 vpaddq xmm10,xmm10,xmm2 vpmuludq xmm0,xmm3,xmm6 vpaddq xmm14,xmm14,xmm0 vpmuludq xmm3,xmm3,xmm5 vpaddq xmm13,xmm13,xmm3 vpshufd xmm2,XMMWORD[48+rdi],0x10 vpmuludq xmm1,xmm4,xmm9 vpaddq xmm12,xmm12,xmm1 vpshufd xmm3,XMMWORD[64+rdi],0x10 vpmuludq xmm0,xmm4,xmm8 vpaddq xmm11,xmm11,xmm0 vpmuludq xmm4,xmm4,xmm7 vpaddq xmm10,xmm10,xmm4 vpmuludq xmm2,xmm2,xmm5 vpaddq xmm14,xmm14,xmm2 vpmuludq xmm1,xmm3,xmm9 vpaddq xmm13,xmm13,xmm1 vpmuludq xmm0,xmm3,xmm8 vpaddq xmm12,xmm12,xmm0 vpmuludq xmm1,xmm3,xmm7 vpaddq xmm11,xmm11,xmm1 vpmuludq xmm3,xmm3,xmm6 vpaddq xmm10,xmm10,xmm3 jz NEAR $L$short_tail_avx vmovdqu xmm0,XMMWORD[rsi] vmovdqu xmm1,XMMWORD[16+rsi] vpsrldq xmm2,xmm0,6 vpsrldq xmm3,xmm1,6 vpunpckhqdq xmm4,xmm0,xmm1 vpunpcklqdq xmm0,xmm0,xmm1 vpunpcklqdq xmm3,xmm2,xmm3 vpsrlq xmm4,xmm4,40 vpsrlq xmm1,xmm0,26 vpand xmm0,xmm0,xmm15 vpsrlq xmm2,xmm3,4 vpand xmm1,xmm1,xmm15 vpsrlq xmm3,xmm3,30 vpand xmm2,xmm2,xmm15 vpand xmm3,xmm3,xmm15 vpor xmm4,xmm4,XMMWORD[32+rcx] vpshufd xmm9,XMMWORD[((-64))+rdi],0x32 vpaddq xmm0,xmm0,XMMWORD[r11] vpaddq xmm1,xmm1,XMMWORD[16+r11] vpaddq xmm2,xmm2,XMMWORD[32+r11] vpaddq xmm3,xmm3,XMMWORD[48+r11] vpaddq xmm4,xmm4,XMMWORD[64+r11] vpmuludq xmm5,xmm9,xmm0 vpaddq xmm10,xmm10,xmm5 vpmuludq xmm6,xmm9,xmm1 vpaddq xmm11,xmm11,xmm6 vpmuludq xmm5,xmm9,xmm2 vpaddq xmm12,xmm12,xmm5 vpshufd xmm7,XMMWORD[((-48))+rdi],0x32 vpmuludq xmm6,xmm9,xmm3 vpaddq xmm13,xmm13,xmm6 vpmuludq xmm9,xmm9,xmm4 vpaddq xmm14,xmm14,xmm9 vpmuludq xmm5,xmm7,xmm3 vpaddq xmm14,xmm14,xmm5 vpshufd xmm8,XMMWORD[((-32))+rdi],0x32 vpmuludq xmm6,xmm7,xmm2 vpaddq xmm13,xmm13,xmm6 vpshufd xmm9,XMMWORD[((-16))+rdi],0x32 vpmuludq xmm5,xmm7,xmm1 vpaddq xmm12,xmm12,xmm5 vpmuludq xmm7,xmm7,xmm0 vpaddq xmm11,xmm11,xmm7 vpmuludq xmm8,xmm8,xmm4 vpaddq xmm10,xmm10,xmm8 vpshufd xmm7,XMMWORD[rdi],0x32 vpmuludq xmm6,xmm9,xmm2 vpaddq xmm14,xmm14,xmm6 vpmuludq xmm5,xmm9,xmm1 vpaddq xmm13,xmm13,xmm5 vpshufd xmm8,XMMWORD[16+rdi],0x32 vpmuludq xmm9,xmm9,xmm0 vpaddq xmm12,xmm12,xmm9 vpmuludq xmm6,xmm7,xmm4 vpaddq xmm11,xmm11,xmm6 vpshufd xmm9,XMMWORD[32+rdi],0x32 vpmuludq xmm7,xmm7,xmm3 vpaddq xmm10,xmm10,xmm7 vpmuludq xmm5,xmm8,xmm1 vpaddq xmm14,xmm14,xmm5 vpmuludq xmm8,xmm8,xmm0 vpaddq xmm13,xmm13,xmm8 vpshufd xmm7,XMMWORD[48+rdi],0x32 vpmuludq xmm6,xmm9,xmm4 vpaddq xmm12,xmm12,xmm6 vpshufd xmm8,XMMWORD[64+rdi],0x32 vpmuludq xmm5,xmm9,xmm3 vpaddq xmm11,xmm11,xmm5 vpmuludq xmm9,xmm9,xmm2 vpaddq xmm10,xmm10,xmm9 vpmuludq xmm7,xmm7,xmm0 vpaddq xmm14,xmm14,xmm7 vpmuludq xmm6,xmm8,xmm4 vpaddq xmm13,xmm13,xmm6 vpmuludq xmm5,xmm8,xmm3 vpaddq xmm12,xmm12,xmm5 vpmuludq xmm6,xmm8,xmm2 vpaddq xmm11,xmm11,xmm6 vpmuludq xmm8,xmm8,xmm1 vpaddq xmm10,xmm10,xmm8 $L$short_tail_avx: vpsrldq xmm9,xmm14,8 vpsrldq xmm8,xmm13,8 vpsrldq xmm6,xmm11,8 vpsrldq xmm5,xmm10,8 vpsrldq xmm7,xmm12,8 vpaddq xmm13,xmm13,xmm8 vpaddq xmm14,xmm14,xmm9 vpaddq xmm10,xmm10,xmm5 vpaddq xmm11,xmm11,xmm6 vpaddq xmm12,xmm12,xmm7 vpsrlq xmm3,xmm13,26 vpand xmm13,xmm13,xmm15 vpaddq xmm14,xmm14,xmm3 vpsrlq xmm0,xmm10,26 vpand xmm10,xmm10,xmm15 vpaddq xmm11,xmm11,xmm0 vpsrlq xmm4,xmm14,26 vpand xmm14,xmm14,xmm15 vpsrlq xmm1,xmm11,26 vpand xmm11,xmm11,xmm15 vpaddq xmm12,xmm12,xmm1 vpaddq xmm10,xmm10,xmm4 vpsllq xmm4,xmm4,2 vpaddq xmm10,xmm10,xmm4 vpsrlq xmm2,xmm12,26 vpand xmm12,xmm12,xmm15 vpaddq xmm13,xmm13,xmm2 vpsrlq xmm0,xmm10,26 vpand xmm10,xmm10,xmm15 vpaddq xmm11,xmm11,xmm0 vpsrlq xmm3,xmm13,26 vpand xmm13,xmm13,xmm15 vpaddq xmm14,xmm14,xmm3 vmovd DWORD[(-112)+rdi],xmm10 vmovd DWORD[(-108)+rdi],xmm11 vmovd DWORD[(-104)+rdi],xmm12 vmovd DWORD[(-100)+rdi],xmm13 vmovd DWORD[(-96)+rdi],xmm14 vmovdqa xmm6,XMMWORD[80+r11] vmovdqa xmm7,XMMWORD[96+r11] vmovdqa xmm8,XMMWORD[112+r11] vmovdqa xmm9,XMMWORD[128+r11] vmovdqa xmm10,XMMWORD[144+r11] vmovdqa xmm11,XMMWORD[160+r11] vmovdqa xmm12,XMMWORD[176+r11] vmovdqa xmm13,XMMWORD[192+r11] vmovdqa xmm14,XMMWORD[208+r11] vmovdqa xmm15,XMMWORD[224+r11] lea rsp,[248+r11] $L$do_avx_epilogue: vzeroupper mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_poly1305_blocks_avx: ALIGN 32 poly1305_emit_avx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_poly1305_emit_avx: mov rdi,rcx mov rsi,rdx mov rdx,r8 cmp DWORD[20+rdi],0 je NEAR $L$emit mov eax,DWORD[rdi] mov ecx,DWORD[4+rdi] mov r8d,DWORD[8+rdi] mov r11d,DWORD[12+rdi] mov r10d,DWORD[16+rdi] shl rcx,26 mov r9,r8 shl r8,52 add rax,rcx shr r9,12 add r8,rax adc r9,0 shl r11,14 mov rax,r10 shr r10,24 add r9,r11 shl rax,40 add r9,rax adc r10,0 mov rax,r10 mov rcx,r10 and r10,3 shr rax,2 and rcx,-4 add rax,rcx add r8,rax adc r9,0 adc r10,0 mov rax,r8 add r8,5 mov rcx,r9 adc r9,0 adc r10,0 shr r10,2 cmovnz rax,r8 cmovnz rcx,r9 add rax,QWORD[rdx] adc rcx,QWORD[8+rdx] mov QWORD[rsi],rax mov QWORD[8+rsi],rcx mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_poly1305_emit_avx: ALIGN 32 poly1305_blocks_avx2: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_poly1305_blocks_avx2: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8d,DWORD[20+rdi] cmp rdx,128 jae NEAR $L$blocks_avx2 test r8d,r8d jz NEAR $L$blocks $L$blocks_avx2: and rdx,-16 jz NEAR $L$no_data_avx2 vzeroupper test r8d,r8d jz NEAR $L$base2_64_avx2 test rdx,63 jz NEAR $L$even_avx2 push rbx push rbp push r12 push r13 push r14 push r15 $L$blocks_avx2_body: mov r15,rdx mov r8,QWORD[rdi] mov r9,QWORD[8+rdi] mov ebp,DWORD[16+rdi] mov r11,QWORD[24+rdi] mov r13,QWORD[32+rdi] mov r14d,r8d and r8,-2147483648 mov r12,r9 mov ebx,r9d and r9,-2147483648 shr r8,6 shl r12,52 add r14,r8 shr rbx,12 shr r9,18 add r14,r12 adc rbx,r9 mov r8,rbp shl r8,40 shr rbp,24 add rbx,r8 adc rbp,0 mov r9,-4 mov r8,rbp and r9,rbp shr r8,2 and rbp,3 add r8,r9 add r14,r8 adc rbx,0 adc rbp,0 mov r12,r13 mov rax,r13 shr r13,2 add r13,r12 $L$base2_26_pre_avx2: add r14,QWORD[rsi] adc rbx,QWORD[8+rsi] lea rsi,[16+rsi] adc rbp,rcx sub r15,16 call __poly1305_block mov rax,r12 test r15,63 jnz NEAR $L$base2_26_pre_avx2 test rcx,rcx jz NEAR $L$store_base2_64_avx2 mov rax,r14 mov rdx,r14 shr r14,52 mov r11,rbx mov r12,rbx shr rdx,26 and rax,0x3ffffff shl r11,12 and rdx,0x3ffffff shr rbx,14 or r14,r11 shl rbp,24 and r14,0x3ffffff shr r12,40 and rbx,0x3ffffff or rbp,r12 test r15,r15 jz NEAR $L$store_base2_26_avx2 vmovd xmm0,eax vmovd xmm1,edx vmovd xmm2,r14d vmovd xmm3,ebx vmovd xmm4,ebp jmp NEAR $L$proceed_avx2 ALIGN 32 $L$store_base2_64_avx2: mov QWORD[rdi],r14 mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rbp jmp NEAR $L$done_avx2 ALIGN 16 $L$store_base2_26_avx2: mov DWORD[rdi],eax mov DWORD[4+rdi],edx mov DWORD[8+rdi],r14d mov DWORD[12+rdi],ebx mov DWORD[16+rdi],ebp ALIGN 16 $L$done_avx2: mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbp,QWORD[32+rsp] mov rbx,QWORD[40+rsp] lea rsp,[48+rsp] $L$no_data_avx2: $L$blocks_avx2_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret ALIGN 32 $L$base2_64_avx2: push rbx push rbp push r12 push r13 push r14 push r15 $L$base2_64_avx2_body: mov r15,rdx mov r11,QWORD[24+rdi] mov r13,QWORD[32+rdi] mov r14,QWORD[rdi] mov rbx,QWORD[8+rdi] mov ebp,DWORD[16+rdi] mov r12,r13 mov rax,r13 shr r13,2 add r13,r12 test rdx,63 jz NEAR $L$init_avx2 $L$base2_64_pre_avx2: add r14,QWORD[rsi] adc rbx,QWORD[8+rsi] lea rsi,[16+rsi] adc rbp,rcx sub r15,16 call __poly1305_block mov rax,r12 test r15,63 jnz NEAR $L$base2_64_pre_avx2 $L$init_avx2: mov rax,r14 mov rdx,r14 shr r14,52 mov r8,rbx mov r9,rbx shr rdx,26 and rax,0x3ffffff shl r8,12 and rdx,0x3ffffff shr rbx,14 or r14,r8 shl rbp,24 and r14,0x3ffffff shr r9,40 and rbx,0x3ffffff or rbp,r9 vmovd xmm0,eax vmovd xmm1,edx vmovd xmm2,r14d vmovd xmm3,ebx vmovd xmm4,ebp mov DWORD[20+rdi],1 call __poly1305_init_avx $L$proceed_avx2: mov rdx,r15 mov r15,QWORD[rsp] mov r14,QWORD[8+rsp] mov r13,QWORD[16+rsp] mov r12,QWORD[24+rsp] mov rbp,QWORD[32+rsp] mov rbx,QWORD[40+rsp] lea rax,[48+rsp] lea rsp,[48+rsp] $L$base2_64_avx2_epilogue: jmp NEAR $L$do_avx2 ALIGN 32 $L$even_avx2: vmovd xmm0,DWORD[rdi] vmovd xmm1,DWORD[4+rdi] vmovd xmm2,DWORD[8+rdi] vmovd xmm3,DWORD[12+rdi] vmovd xmm4,DWORD[16+rdi] $L$do_avx2: lea r11,[((-248))+rsp] sub rsp,0x1c8 vmovdqa XMMWORD[80+r11],xmm6 vmovdqa XMMWORD[96+r11],xmm7 vmovdqa XMMWORD[112+r11],xmm8 vmovdqa XMMWORD[128+r11],xmm9 vmovdqa XMMWORD[144+r11],xmm10 vmovdqa XMMWORD[160+r11],xmm11 vmovdqa XMMWORD[176+r11],xmm12 vmovdqa XMMWORD[192+r11],xmm13 vmovdqa XMMWORD[208+r11],xmm14 vmovdqa XMMWORD[224+r11],xmm15 $L$do_avx2_body: lea rdi,[((48+64))+rdi] lea rcx,[$L$const] vmovdqu xmm9,XMMWORD[((-64))+rdi] and rsp,-512 vmovdqu xmm10,XMMWORD[((-48))+rdi] vmovdqu xmm6,XMMWORD[((-32))+rdi] vmovdqu xmm11,XMMWORD[((-16))+rdi] vmovdqu xmm12,XMMWORD[rdi] vmovdqu xmm13,XMMWORD[16+rdi] vmovdqu xmm14,XMMWORD[32+rdi] vpermq ymm9,ymm9,0x15 vmovdqu xmm15,XMMWORD[48+rdi] vpermq ymm10,ymm10,0x15 vpshufd ymm9,ymm9,0xc8 vmovdqu xmm5,XMMWORD[64+rdi] vpermq ymm6,ymm6,0x15 vpshufd ymm10,ymm10,0xc8 vmovdqa YMMWORD[rsp],ymm9 vpermq ymm11,ymm11,0x15 vpshufd ymm6,ymm6,0xc8 vmovdqa YMMWORD[32+rsp],ymm10 vpermq ymm12,ymm12,0x15 vpshufd ymm11,ymm11,0xc8 vmovdqa YMMWORD[64+rsp],ymm6 vpermq ymm13,ymm13,0x15 vpshufd ymm12,ymm12,0xc8 vmovdqa YMMWORD[96+rsp],ymm11 vpermq ymm14,ymm14,0x15 vpshufd ymm13,ymm13,0xc8 vmovdqa YMMWORD[128+rsp],ymm12 vpermq ymm15,ymm15,0x15 vpshufd ymm14,ymm14,0xc8 vmovdqa YMMWORD[160+rsp],ymm13 vpermq ymm5,ymm5,0x15 vpshufd ymm15,ymm15,0xc8 vmovdqa YMMWORD[192+rsp],ymm14 vpshufd ymm5,ymm5,0xc8 vmovdqa YMMWORD[224+rsp],ymm15 vmovdqa YMMWORD[256+rsp],ymm5 vmovdqa ymm5,YMMWORD[64+rcx] vmovdqu xmm7,XMMWORD[rsi] vmovdqu xmm8,XMMWORD[16+rsi] vinserti128 ymm7,ymm7,XMMWORD[32+rsi],1 vinserti128 ymm8,ymm8,XMMWORD[48+rsi],1 lea rsi,[64+rsi] vpsrldq ymm9,ymm7,6 vpsrldq ymm10,ymm8,6 vpunpckhqdq ymm6,ymm7,ymm8 vpunpcklqdq ymm9,ymm9,ymm10 vpunpcklqdq ymm7,ymm7,ymm8 vpsrlq ymm10,ymm9,30 vpsrlq ymm9,ymm9,4 vpsrlq ymm8,ymm7,26 vpsrlq ymm6,ymm6,40 vpand ymm9,ymm9,ymm5 vpand ymm7,ymm7,ymm5 vpand ymm8,ymm8,ymm5 vpand ymm10,ymm10,ymm5 vpor ymm6,ymm6,YMMWORD[32+rcx] lea rax,[144+rsp] vpaddq ymm2,ymm9,ymm2 sub rdx,64 jz NEAR $L$tail_avx2 jmp NEAR $L$oop_avx2 ALIGN 32 $L$oop_avx2: vpaddq ymm0,ymm7,ymm0 vmovdqa ymm7,YMMWORD[rsp] vpaddq ymm1,ymm8,ymm1 vmovdqa ymm8,YMMWORD[32+rsp] vpaddq ymm3,ymm10,ymm3 vmovdqa ymm9,YMMWORD[96+rsp] vpaddq ymm4,ymm6,ymm4 vmovdqa ymm10,YMMWORD[48+rax] vmovdqa ymm5,YMMWORD[112+rax] vpmuludq ymm13,ymm7,ymm2 vpmuludq ymm14,ymm8,ymm2 vpmuludq ymm15,ymm9,ymm2 vpmuludq ymm11,ymm10,ymm2 vpmuludq ymm12,ymm5,ymm2 vpmuludq ymm6,ymm8,ymm0 vpmuludq ymm2,ymm8,ymm1 vpaddq ymm12,ymm12,ymm6 vpaddq ymm13,ymm13,ymm2 vpmuludq ymm6,ymm8,ymm3 vpmuludq ymm2,ymm4,YMMWORD[64+rsp] vpaddq ymm15,ymm15,ymm6 vpaddq ymm11,ymm11,ymm2 vmovdqa ymm8,YMMWORD[((-16))+rax] vpmuludq ymm6,ymm7,ymm0 vpmuludq ymm2,ymm7,ymm1 vpaddq ymm11,ymm11,ymm6 vpaddq ymm12,ymm12,ymm2 vpmuludq ymm6,ymm7,ymm3 vpmuludq ymm2,ymm7,ymm4 vmovdqu xmm7,XMMWORD[rsi] vpaddq ymm14,ymm14,ymm6 vpaddq ymm15,ymm15,ymm2 vinserti128 ymm7,ymm7,XMMWORD[32+rsi],1 vpmuludq ymm6,ymm8,ymm3 vpmuludq ymm2,ymm8,ymm4 vmovdqu xmm8,XMMWORD[16+rsi] vpaddq ymm11,ymm11,ymm6 vpaddq ymm12,ymm12,ymm2 vmovdqa ymm2,YMMWORD[16+rax] vpmuludq ymm6,ymm9,ymm1 vpmuludq ymm9,ymm9,ymm0 vpaddq ymm14,ymm14,ymm6 vpaddq ymm13,ymm13,ymm9 vinserti128 ymm8,ymm8,XMMWORD[48+rsi],1 lea rsi,[64+rsi] vpmuludq ymm6,ymm2,ymm1 vpmuludq ymm2,ymm2,ymm0 vpsrldq ymm9,ymm7,6 vpaddq ymm15,ymm15,ymm6 vpaddq ymm14,ymm14,ymm2 vpmuludq ymm6,ymm10,ymm3 vpmuludq ymm2,ymm10,ymm4 vpsrldq ymm10,ymm8,6 vpaddq ymm12,ymm12,ymm6 vpaddq ymm13,ymm13,ymm2 vpunpckhqdq ymm6,ymm7,ymm8 vpmuludq ymm3,ymm5,ymm3 vpmuludq ymm4,ymm5,ymm4 vpunpcklqdq ymm7,ymm7,ymm8 vpaddq ymm2,ymm13,ymm3 vpaddq ymm3,ymm14,ymm4 vpunpcklqdq ymm10,ymm9,ymm10 vpmuludq ymm4,ymm0,YMMWORD[80+rax] vpmuludq ymm0,ymm5,ymm1 vmovdqa ymm5,YMMWORD[64+rcx] vpaddq ymm4,ymm15,ymm4 vpaddq ymm0,ymm11,ymm0 vpsrlq ymm14,ymm3,26 vpand ymm3,ymm3,ymm5 vpaddq ymm4,ymm4,ymm14 vpsrlq ymm11,ymm0,26 vpand ymm0,ymm0,ymm5 vpaddq ymm1,ymm12,ymm11 vpsrlq ymm15,ymm4,26 vpand ymm4,ymm4,ymm5 vpsrlq ymm9,ymm10,4 vpsrlq ymm12,ymm1,26 vpand ymm1,ymm1,ymm5 vpaddq ymm2,ymm2,ymm12 vpaddq ymm0,ymm0,ymm15 vpsllq ymm15,ymm15,2 vpaddq ymm0,ymm0,ymm15 vpand ymm9,ymm9,ymm5 vpsrlq ymm8,ymm7,26 vpsrlq ymm13,ymm2,26 vpand ymm2,ymm2,ymm5 vpaddq ymm3,ymm3,ymm13 vpaddq ymm2,ymm2,ymm9 vpsrlq ymm10,ymm10,30 vpsrlq ymm11,ymm0,26 vpand ymm0,ymm0,ymm5 vpaddq ymm1,ymm1,ymm11 vpsrlq ymm6,ymm6,40 vpsrlq ymm14,ymm3,26 vpand ymm3,ymm3,ymm5 vpaddq ymm4,ymm4,ymm14 vpand ymm7,ymm7,ymm5 vpand ymm8,ymm8,ymm5 vpand ymm10,ymm10,ymm5 vpor ymm6,ymm6,YMMWORD[32+rcx] sub rdx,64 jnz NEAR $L$oop_avx2 DB 0x66,0x90 $L$tail_avx2: vpaddq ymm0,ymm7,ymm0 vmovdqu ymm7,YMMWORD[4+rsp] vpaddq ymm1,ymm8,ymm1 vmovdqu ymm8,YMMWORD[36+rsp] vpaddq ymm3,ymm10,ymm3 vmovdqu ymm9,YMMWORD[100+rsp] vpaddq ymm4,ymm6,ymm4 vmovdqu ymm10,YMMWORD[52+rax] vmovdqu ymm5,YMMWORD[116+rax] vpmuludq ymm13,ymm7,ymm2 vpmuludq ymm14,ymm8,ymm2 vpmuludq ymm15,ymm9,ymm2 vpmuludq ymm11,ymm10,ymm2 vpmuludq ymm12,ymm5,ymm2 vpmuludq ymm6,ymm8,ymm0 vpmuludq ymm2,ymm8,ymm1 vpaddq ymm12,ymm12,ymm6 vpaddq ymm13,ymm13,ymm2 vpmuludq ymm6,ymm8,ymm3 vpmuludq ymm2,ymm4,YMMWORD[68+rsp] vpaddq ymm15,ymm15,ymm6 vpaddq ymm11,ymm11,ymm2 vpmuludq ymm6,ymm7,ymm0 vpmuludq ymm2,ymm7,ymm1 vpaddq ymm11,ymm11,ymm6 vmovdqu ymm8,YMMWORD[((-12))+rax] vpaddq ymm12,ymm12,ymm2 vpmuludq ymm6,ymm7,ymm3 vpmuludq ymm2,ymm7,ymm4 vpaddq ymm14,ymm14,ymm6 vpaddq ymm15,ymm15,ymm2 vpmuludq ymm6,ymm8,ymm3 vpmuludq ymm2,ymm8,ymm4 vpaddq ymm11,ymm11,ymm6 vpaddq ymm12,ymm12,ymm2 vmovdqu ymm2,YMMWORD[20+rax] vpmuludq ymm6,ymm9,ymm1 vpmuludq ymm9,ymm9,ymm0 vpaddq ymm14,ymm14,ymm6 vpaddq ymm13,ymm13,ymm9 vpmuludq ymm6,ymm2,ymm1 vpmuludq ymm2,ymm2,ymm0 vpaddq ymm15,ymm15,ymm6 vpaddq ymm14,ymm14,ymm2 vpmuludq ymm6,ymm10,ymm3 vpmuludq ymm2,ymm10,ymm4 vpaddq ymm12,ymm12,ymm6 vpaddq ymm13,ymm13,ymm2 vpmuludq ymm3,ymm5,ymm3 vpmuludq ymm4,ymm5,ymm4 vpaddq ymm2,ymm13,ymm3 vpaddq ymm3,ymm14,ymm4 vpmuludq ymm4,ymm0,YMMWORD[84+rax] vpmuludq ymm0,ymm5,ymm1 vmovdqa ymm5,YMMWORD[64+rcx] vpaddq ymm4,ymm15,ymm4 vpaddq ymm0,ymm11,ymm0 vpsrldq ymm8,ymm12,8 vpsrldq ymm9,ymm2,8 vpsrldq ymm10,ymm3,8 vpsrldq ymm6,ymm4,8 vpsrldq ymm7,ymm0,8 vpaddq ymm12,ymm12,ymm8 vpaddq ymm2,ymm2,ymm9 vpaddq ymm3,ymm3,ymm10 vpaddq ymm4,ymm4,ymm6 vpaddq ymm0,ymm0,ymm7 vpermq ymm10,ymm3,0x2 vpermq ymm6,ymm4,0x2 vpermq ymm7,ymm0,0x2 vpermq ymm8,ymm12,0x2 vpermq ymm9,ymm2,0x2 vpaddq ymm3,ymm3,ymm10 vpaddq ymm4,ymm4,ymm6 vpaddq ymm0,ymm0,ymm7 vpaddq ymm12,ymm12,ymm8 vpaddq ymm2,ymm2,ymm9 vpsrlq ymm14,ymm3,26 vpand ymm3,ymm3,ymm5 vpaddq ymm4,ymm4,ymm14 vpsrlq ymm11,ymm0,26 vpand ymm0,ymm0,ymm5 vpaddq ymm1,ymm12,ymm11 vpsrlq ymm15,ymm4,26 vpand ymm4,ymm4,ymm5 vpsrlq ymm12,ymm1,26 vpand ymm1,ymm1,ymm5 vpaddq ymm2,ymm2,ymm12 vpaddq ymm0,ymm0,ymm15 vpsllq ymm15,ymm15,2 vpaddq ymm0,ymm0,ymm15 vpsrlq ymm13,ymm2,26 vpand ymm2,ymm2,ymm5 vpaddq ymm3,ymm3,ymm13 vpsrlq ymm11,ymm0,26 vpand ymm0,ymm0,ymm5 vpaddq ymm1,ymm1,ymm11 vpsrlq ymm14,ymm3,26 vpand ymm3,ymm3,ymm5 vpaddq ymm4,ymm4,ymm14 vmovd DWORD[(-112)+rdi],xmm0 vmovd DWORD[(-108)+rdi],xmm1 vmovd DWORD[(-104)+rdi],xmm2 vmovd DWORD[(-100)+rdi],xmm3 vmovd DWORD[(-96)+rdi],xmm4 vmovdqa xmm6,XMMWORD[80+r11] vmovdqa xmm7,XMMWORD[96+r11] vmovdqa xmm8,XMMWORD[112+r11] vmovdqa xmm9,XMMWORD[128+r11] vmovdqa xmm10,XMMWORD[144+r11] vmovdqa xmm11,XMMWORD[160+r11] vmovdqa xmm12,XMMWORD[176+r11] vmovdqa xmm13,XMMWORD[192+r11] vmovdqa xmm14,XMMWORD[208+r11] vmovdqa xmm15,XMMWORD[224+r11] lea rsp,[248+r11] $L$do_avx2_epilogue: vzeroupper mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_poly1305_blocks_avx2: ALIGN 64 $L$const: $L$mask24: DD 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0 $L$129: DD 16777216,0,16777216,0,16777216,0,16777216,0 $L$mask26: DD 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0 $L$five: DD 5,0,5,0,5,0,5,0 DB 80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54 DB 95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32 DB 98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115 DB 108,46,111,114,103,62,0 ALIGN 16 EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail lea rax,[48+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 jmp NEAR $L$common_seh_tail ALIGN 16 avx_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov rax,QWORD[208+r8] lea rsi,[80+rax] lea rax,[248+rax] lea rdi,[512+r8] mov ecx,20 DD 0xa548f3fc $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_poly1305_init_asm wrt ..imagebase DD $L$SEH_end_GFp_poly1305_init_asm wrt ..imagebase DD $L$SEH_info_GFp_poly1305_init_asm wrt ..imagebase DD $L$SEH_begin_GFp_poly1305_blocks wrt ..imagebase DD $L$SEH_end_GFp_poly1305_blocks wrt ..imagebase DD $L$SEH_info_GFp_poly1305_blocks wrt ..imagebase DD $L$SEH_begin_GFp_poly1305_emit wrt ..imagebase DD $L$SEH_end_GFp_poly1305_emit wrt ..imagebase DD $L$SEH_info_GFp_poly1305_emit wrt ..imagebase DD $L$SEH_begin_poly1305_blocks_avx wrt ..imagebase DD $L$base2_64_avx wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx_1 wrt ..imagebase DD $L$base2_64_avx wrt ..imagebase DD $L$even_avx wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx_2 wrt ..imagebase DD $L$even_avx wrt ..imagebase DD $L$SEH_end_poly1305_blocks_avx wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx_3 wrt ..imagebase DD $L$SEH_begin_poly1305_emit_avx wrt ..imagebase DD $L$SEH_end_poly1305_emit_avx wrt ..imagebase DD $L$SEH_info_poly1305_emit_avx wrt ..imagebase DD $L$SEH_begin_poly1305_blocks_avx2 wrt ..imagebase DD $L$base2_64_avx2 wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx2_1 wrt ..imagebase DD $L$base2_64_avx2 wrt ..imagebase DD $L$even_avx2 wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx2_2 wrt ..imagebase DD $L$even_avx2 wrt ..imagebase DD $L$SEH_end_poly1305_blocks_avx2 wrt ..imagebase DD $L$SEH_info_poly1305_blocks_avx2_3 wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_poly1305_init_asm: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$SEH_begin_GFp_poly1305_init_asm wrt ..imagebase,$L$SEH_begin_GFp_poly1305_init_asm wrt ..imagebase $L$SEH_info_GFp_poly1305_blocks: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$blocks_body wrt ..imagebase,$L$blocks_epilogue wrt ..imagebase $L$SEH_info_GFp_poly1305_emit: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$SEH_begin_GFp_poly1305_emit wrt ..imagebase,$L$SEH_begin_GFp_poly1305_emit wrt ..imagebase $L$SEH_info_poly1305_blocks_avx_1: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$blocks_avx_body wrt ..imagebase,$L$blocks_avx_epilogue wrt ..imagebase $L$SEH_info_poly1305_blocks_avx_2: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$base2_64_avx_body wrt ..imagebase,$L$base2_64_avx_epilogue wrt ..imagebase $L$SEH_info_poly1305_blocks_avx_3: DB 9,0,0,0 DD avx_handler wrt ..imagebase DD $L$do_avx_body wrt ..imagebase,$L$do_avx_epilogue wrt ..imagebase $L$SEH_info_poly1305_emit_avx: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$SEH_begin_poly1305_emit_avx wrt ..imagebase,$L$SEH_begin_poly1305_emit_avx wrt ..imagebase $L$SEH_info_poly1305_blocks_avx2_1: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$blocks_avx2_body wrt ..imagebase,$L$blocks_avx2_epilogue wrt ..imagebase $L$SEH_info_poly1305_blocks_avx2_2: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$base2_64_avx2_body wrt ..imagebase,$L$base2_64_avx2_epilogue wrt ..imagebase $L$SEH_info_poly1305_blocks_avx2_3: DB 9,0,0,0 DD avx_handler wrt ..imagebase DD $L$do_avx2_body wrt ..imagebase,$L$do_avx2_epilogue wrt ..imagebase ring-0.16.9/pregenerated/tmp/sha256-x86_64-nasm.asm000064400000000000000000001673531353224260200176210ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_sha256_block_data_order ALIGN 16 GFp_sha256_block_data_order: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_sha256_block_data_order: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea r11,[GFp_ia32cap_P] mov r9d,DWORD[r11] mov r10d,DWORD[4+r11] mov r11d,DWORD[8+r11] and r9d,1073741824 and r10d,268435968 or r10d,r9d cmp r10d,1342177792 je NEAR $L$avx_shortcut test r10d,512 jnz NEAR $L$ssse3_shortcut mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 shl rdx,4 sub rsp,16*4+4*8 lea rdx,[rdx*4+rsi] and rsp,-64 mov QWORD[((64+0))+rsp],rdi mov QWORD[((64+8))+rsp],rsi mov QWORD[((64+16))+rsp],rdx mov QWORD[88+rsp],rax $L$prologue: mov eax,DWORD[rdi] mov ebx,DWORD[4+rdi] mov ecx,DWORD[8+rdi] mov edx,DWORD[12+rdi] mov r8d,DWORD[16+rdi] mov r9d,DWORD[20+rdi] mov r10d,DWORD[24+rdi] mov r11d,DWORD[28+rdi] jmp NEAR $L$loop ALIGN 16 $L$loop: mov edi,ebx lea rbp,[K256] xor edi,ecx mov r12d,DWORD[rsi] mov r13d,r8d mov r14d,eax bswap r12d ror r13d,14 mov r15d,r9d xor r13d,r8d ror r14d,9 xor r15d,r10d mov DWORD[rsp],r12d xor r14d,eax and r15d,r8d ror r13d,5 add r12d,r11d xor r15d,r10d ror r14d,11 xor r13d,r8d add r12d,r15d mov r15d,eax add r12d,DWORD[rbp] xor r14d,eax xor r15d,ebx ror r13d,6 mov r11d,ebx and edi,r15d ror r14d,2 add r12d,r13d xor r11d,edi add edx,r12d add r11d,r12d lea rbp,[4+rbp] add r11d,r14d mov r12d,DWORD[4+rsi] mov r13d,edx mov r14d,r11d bswap r12d ror r13d,14 mov edi,r8d xor r13d,edx ror r14d,9 xor edi,r9d mov DWORD[4+rsp],r12d xor r14d,r11d and edi,edx ror r13d,5 add r12d,r10d xor edi,r9d ror r14d,11 xor r13d,edx add r12d,edi mov edi,r11d add r12d,DWORD[rbp] xor r14d,r11d xor edi,eax ror r13d,6 mov r10d,eax and r15d,edi ror r14d,2 add r12d,r13d xor r10d,r15d add ecx,r12d add r10d,r12d lea rbp,[4+rbp] add r10d,r14d mov r12d,DWORD[8+rsi] mov r13d,ecx mov r14d,r10d bswap r12d ror r13d,14 mov r15d,edx xor r13d,ecx ror r14d,9 xor r15d,r8d mov DWORD[8+rsp],r12d xor r14d,r10d and r15d,ecx ror r13d,5 add r12d,r9d xor r15d,r8d ror r14d,11 xor r13d,ecx add r12d,r15d mov r15d,r10d add r12d,DWORD[rbp] xor r14d,r10d xor r15d,r11d ror r13d,6 mov r9d,r11d and edi,r15d ror r14d,2 add r12d,r13d xor r9d,edi add ebx,r12d add r9d,r12d lea rbp,[4+rbp] add r9d,r14d mov r12d,DWORD[12+rsi] mov r13d,ebx mov r14d,r9d bswap r12d ror r13d,14 mov edi,ecx xor r13d,ebx ror r14d,9 xor edi,edx mov DWORD[12+rsp],r12d xor r14d,r9d and edi,ebx ror r13d,5 add r12d,r8d xor edi,edx ror r14d,11 xor r13d,ebx add r12d,edi mov edi,r9d add r12d,DWORD[rbp] xor r14d,r9d xor edi,r10d ror r13d,6 mov r8d,r10d and r15d,edi ror r14d,2 add r12d,r13d xor r8d,r15d add eax,r12d add r8d,r12d lea rbp,[20+rbp] add r8d,r14d mov r12d,DWORD[16+rsi] mov r13d,eax mov r14d,r8d bswap r12d ror r13d,14 mov r15d,ebx xor r13d,eax ror r14d,9 xor r15d,ecx mov DWORD[16+rsp],r12d xor r14d,r8d and r15d,eax ror r13d,5 add r12d,edx xor r15d,ecx ror r14d,11 xor r13d,eax add r12d,r15d mov r15d,r8d add r12d,DWORD[rbp] xor r14d,r8d xor r15d,r9d ror r13d,6 mov edx,r9d and edi,r15d ror r14d,2 add r12d,r13d xor edx,edi add r11d,r12d add edx,r12d lea rbp,[4+rbp] add edx,r14d mov r12d,DWORD[20+rsi] mov r13d,r11d mov r14d,edx bswap r12d ror r13d,14 mov edi,eax xor r13d,r11d ror r14d,9 xor edi,ebx mov DWORD[20+rsp],r12d xor r14d,edx and edi,r11d ror r13d,5 add r12d,ecx xor edi,ebx ror r14d,11 xor r13d,r11d add r12d,edi mov edi,edx add r12d,DWORD[rbp] xor r14d,edx xor edi,r8d ror r13d,6 mov ecx,r8d and r15d,edi ror r14d,2 add r12d,r13d xor ecx,r15d add r10d,r12d add ecx,r12d lea rbp,[4+rbp] add ecx,r14d mov r12d,DWORD[24+rsi] mov r13d,r10d mov r14d,ecx bswap r12d ror r13d,14 mov r15d,r11d xor r13d,r10d ror r14d,9 xor r15d,eax mov DWORD[24+rsp],r12d xor r14d,ecx and r15d,r10d ror r13d,5 add r12d,ebx xor r15d,eax ror r14d,11 xor r13d,r10d add r12d,r15d mov r15d,ecx add r12d,DWORD[rbp] xor r14d,ecx xor r15d,edx ror r13d,6 mov ebx,edx and edi,r15d ror r14d,2 add r12d,r13d xor ebx,edi add r9d,r12d add ebx,r12d lea rbp,[4+rbp] add ebx,r14d mov r12d,DWORD[28+rsi] mov r13d,r9d mov r14d,ebx bswap r12d ror r13d,14 mov edi,r10d xor r13d,r9d ror r14d,9 xor edi,r11d mov DWORD[28+rsp],r12d xor r14d,ebx and edi,r9d ror r13d,5 add r12d,eax xor edi,r11d ror r14d,11 xor r13d,r9d add r12d,edi mov edi,ebx add r12d,DWORD[rbp] xor r14d,ebx xor edi,ecx ror r13d,6 mov eax,ecx and r15d,edi ror r14d,2 add r12d,r13d xor eax,r15d add r8d,r12d add eax,r12d lea rbp,[20+rbp] add eax,r14d mov r12d,DWORD[32+rsi] mov r13d,r8d mov r14d,eax bswap r12d ror r13d,14 mov r15d,r9d xor r13d,r8d ror r14d,9 xor r15d,r10d mov DWORD[32+rsp],r12d xor r14d,eax and r15d,r8d ror r13d,5 add r12d,r11d xor r15d,r10d ror r14d,11 xor r13d,r8d add r12d,r15d mov r15d,eax add r12d,DWORD[rbp] xor r14d,eax xor r15d,ebx ror r13d,6 mov r11d,ebx and edi,r15d ror r14d,2 add r12d,r13d xor r11d,edi add edx,r12d add r11d,r12d lea rbp,[4+rbp] add r11d,r14d mov r12d,DWORD[36+rsi] mov r13d,edx mov r14d,r11d bswap r12d ror r13d,14 mov edi,r8d xor r13d,edx ror r14d,9 xor edi,r9d mov DWORD[36+rsp],r12d xor r14d,r11d and edi,edx ror r13d,5 add r12d,r10d xor edi,r9d ror r14d,11 xor r13d,edx add r12d,edi mov edi,r11d add r12d,DWORD[rbp] xor r14d,r11d xor edi,eax ror r13d,6 mov r10d,eax and r15d,edi ror r14d,2 add r12d,r13d xor r10d,r15d add ecx,r12d add r10d,r12d lea rbp,[4+rbp] add r10d,r14d mov r12d,DWORD[40+rsi] mov r13d,ecx mov r14d,r10d bswap r12d ror r13d,14 mov r15d,edx xor r13d,ecx ror r14d,9 xor r15d,r8d mov DWORD[40+rsp],r12d xor r14d,r10d and r15d,ecx ror r13d,5 add r12d,r9d xor r15d,r8d ror r14d,11 xor r13d,ecx add r12d,r15d mov r15d,r10d add r12d,DWORD[rbp] xor r14d,r10d xor r15d,r11d ror r13d,6 mov r9d,r11d and edi,r15d ror r14d,2 add r12d,r13d xor r9d,edi add ebx,r12d add r9d,r12d lea rbp,[4+rbp] add r9d,r14d mov r12d,DWORD[44+rsi] mov r13d,ebx mov r14d,r9d bswap r12d ror r13d,14 mov edi,ecx xor r13d,ebx ror r14d,9 xor edi,edx mov DWORD[44+rsp],r12d xor r14d,r9d and edi,ebx ror r13d,5 add r12d,r8d xor edi,edx ror r14d,11 xor r13d,ebx add r12d,edi mov edi,r9d add r12d,DWORD[rbp] xor r14d,r9d xor edi,r10d ror r13d,6 mov r8d,r10d and r15d,edi ror r14d,2 add r12d,r13d xor r8d,r15d add eax,r12d add r8d,r12d lea rbp,[20+rbp] add r8d,r14d mov r12d,DWORD[48+rsi] mov r13d,eax mov r14d,r8d bswap r12d ror r13d,14 mov r15d,ebx xor r13d,eax ror r14d,9 xor r15d,ecx mov DWORD[48+rsp],r12d xor r14d,r8d and r15d,eax ror r13d,5 add r12d,edx xor r15d,ecx ror r14d,11 xor r13d,eax add r12d,r15d mov r15d,r8d add r12d,DWORD[rbp] xor r14d,r8d xor r15d,r9d ror r13d,6 mov edx,r9d and edi,r15d ror r14d,2 add r12d,r13d xor edx,edi add r11d,r12d add edx,r12d lea rbp,[4+rbp] add edx,r14d mov r12d,DWORD[52+rsi] mov r13d,r11d mov r14d,edx bswap r12d ror r13d,14 mov edi,eax xor r13d,r11d ror r14d,9 xor edi,ebx mov DWORD[52+rsp],r12d xor r14d,edx and edi,r11d ror r13d,5 add r12d,ecx xor edi,ebx ror r14d,11 xor r13d,r11d add r12d,edi mov edi,edx add r12d,DWORD[rbp] xor r14d,edx xor edi,r8d ror r13d,6 mov ecx,r8d and r15d,edi ror r14d,2 add r12d,r13d xor ecx,r15d add r10d,r12d add ecx,r12d lea rbp,[4+rbp] add ecx,r14d mov r12d,DWORD[56+rsi] mov r13d,r10d mov r14d,ecx bswap r12d ror r13d,14 mov r15d,r11d xor r13d,r10d ror r14d,9 xor r15d,eax mov DWORD[56+rsp],r12d xor r14d,ecx and r15d,r10d ror r13d,5 add r12d,ebx xor r15d,eax ror r14d,11 xor r13d,r10d add r12d,r15d mov r15d,ecx add r12d,DWORD[rbp] xor r14d,ecx xor r15d,edx ror r13d,6 mov ebx,edx and edi,r15d ror r14d,2 add r12d,r13d xor ebx,edi add r9d,r12d add ebx,r12d lea rbp,[4+rbp] add ebx,r14d mov r12d,DWORD[60+rsi] mov r13d,r9d mov r14d,ebx bswap r12d ror r13d,14 mov edi,r10d xor r13d,r9d ror r14d,9 xor edi,r11d mov DWORD[60+rsp],r12d xor r14d,ebx and edi,r9d ror r13d,5 add r12d,eax xor edi,r11d ror r14d,11 xor r13d,r9d add r12d,edi mov edi,ebx add r12d,DWORD[rbp] xor r14d,ebx xor edi,ecx ror r13d,6 mov eax,ecx and r15d,edi ror r14d,2 add r12d,r13d xor eax,r15d add r8d,r12d add eax,r12d lea rbp,[20+rbp] jmp NEAR $L$rounds_16_xx ALIGN 16 $L$rounds_16_xx: mov r13d,DWORD[4+rsp] mov r15d,DWORD[56+rsp] mov r12d,r13d ror r13d,11 add eax,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[36+rsp] add r12d,DWORD[rsp] mov r13d,r8d add r12d,r15d mov r14d,eax ror r13d,14 mov r15d,r9d xor r13d,r8d ror r14d,9 xor r15d,r10d mov DWORD[rsp],r12d xor r14d,eax and r15d,r8d ror r13d,5 add r12d,r11d xor r15d,r10d ror r14d,11 xor r13d,r8d add r12d,r15d mov r15d,eax add r12d,DWORD[rbp] xor r14d,eax xor r15d,ebx ror r13d,6 mov r11d,ebx and edi,r15d ror r14d,2 add r12d,r13d xor r11d,edi add edx,r12d add r11d,r12d lea rbp,[4+rbp] mov r13d,DWORD[8+rsp] mov edi,DWORD[60+rsp] mov r12d,r13d ror r13d,11 add r11d,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[40+rsp] add r12d,DWORD[4+rsp] mov r13d,edx add r12d,edi mov r14d,r11d ror r13d,14 mov edi,r8d xor r13d,edx ror r14d,9 xor edi,r9d mov DWORD[4+rsp],r12d xor r14d,r11d and edi,edx ror r13d,5 add r12d,r10d xor edi,r9d ror r14d,11 xor r13d,edx add r12d,edi mov edi,r11d add r12d,DWORD[rbp] xor r14d,r11d xor edi,eax ror r13d,6 mov r10d,eax and r15d,edi ror r14d,2 add r12d,r13d xor r10d,r15d add ecx,r12d add r10d,r12d lea rbp,[4+rbp] mov r13d,DWORD[12+rsp] mov r15d,DWORD[rsp] mov r12d,r13d ror r13d,11 add r10d,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[44+rsp] add r12d,DWORD[8+rsp] mov r13d,ecx add r12d,r15d mov r14d,r10d ror r13d,14 mov r15d,edx xor r13d,ecx ror r14d,9 xor r15d,r8d mov DWORD[8+rsp],r12d xor r14d,r10d and r15d,ecx ror r13d,5 add r12d,r9d xor r15d,r8d ror r14d,11 xor r13d,ecx add r12d,r15d mov r15d,r10d add r12d,DWORD[rbp] xor r14d,r10d xor r15d,r11d ror r13d,6 mov r9d,r11d and edi,r15d ror r14d,2 add r12d,r13d xor r9d,edi add ebx,r12d add r9d,r12d lea rbp,[4+rbp] mov r13d,DWORD[16+rsp] mov edi,DWORD[4+rsp] mov r12d,r13d ror r13d,11 add r9d,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[48+rsp] add r12d,DWORD[12+rsp] mov r13d,ebx add r12d,edi mov r14d,r9d ror r13d,14 mov edi,ecx xor r13d,ebx ror r14d,9 xor edi,edx mov DWORD[12+rsp],r12d xor r14d,r9d and edi,ebx ror r13d,5 add r12d,r8d xor edi,edx ror r14d,11 xor r13d,ebx add r12d,edi mov edi,r9d add r12d,DWORD[rbp] xor r14d,r9d xor edi,r10d ror r13d,6 mov r8d,r10d and r15d,edi ror r14d,2 add r12d,r13d xor r8d,r15d add eax,r12d add r8d,r12d lea rbp,[20+rbp] mov r13d,DWORD[20+rsp] mov r15d,DWORD[8+rsp] mov r12d,r13d ror r13d,11 add r8d,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[52+rsp] add r12d,DWORD[16+rsp] mov r13d,eax add r12d,r15d mov r14d,r8d ror r13d,14 mov r15d,ebx xor r13d,eax ror r14d,9 xor r15d,ecx mov DWORD[16+rsp],r12d xor r14d,r8d and r15d,eax ror r13d,5 add r12d,edx xor r15d,ecx ror r14d,11 xor r13d,eax add r12d,r15d mov r15d,r8d add r12d,DWORD[rbp] xor r14d,r8d xor r15d,r9d ror r13d,6 mov edx,r9d and edi,r15d ror r14d,2 add r12d,r13d xor edx,edi add r11d,r12d add edx,r12d lea rbp,[4+rbp] mov r13d,DWORD[24+rsp] mov edi,DWORD[12+rsp] mov r12d,r13d ror r13d,11 add edx,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[56+rsp] add r12d,DWORD[20+rsp] mov r13d,r11d add r12d,edi mov r14d,edx ror r13d,14 mov edi,eax xor r13d,r11d ror r14d,9 xor edi,ebx mov DWORD[20+rsp],r12d xor r14d,edx and edi,r11d ror r13d,5 add r12d,ecx xor edi,ebx ror r14d,11 xor r13d,r11d add r12d,edi mov edi,edx add r12d,DWORD[rbp] xor r14d,edx xor edi,r8d ror r13d,6 mov ecx,r8d and r15d,edi ror r14d,2 add r12d,r13d xor ecx,r15d add r10d,r12d add ecx,r12d lea rbp,[4+rbp] mov r13d,DWORD[28+rsp] mov r15d,DWORD[16+rsp] mov r12d,r13d ror r13d,11 add ecx,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[60+rsp] add r12d,DWORD[24+rsp] mov r13d,r10d add r12d,r15d mov r14d,ecx ror r13d,14 mov r15d,r11d xor r13d,r10d ror r14d,9 xor r15d,eax mov DWORD[24+rsp],r12d xor r14d,ecx and r15d,r10d ror r13d,5 add r12d,ebx xor r15d,eax ror r14d,11 xor r13d,r10d add r12d,r15d mov r15d,ecx add r12d,DWORD[rbp] xor r14d,ecx xor r15d,edx ror r13d,6 mov ebx,edx and edi,r15d ror r14d,2 add r12d,r13d xor ebx,edi add r9d,r12d add ebx,r12d lea rbp,[4+rbp] mov r13d,DWORD[32+rsp] mov edi,DWORD[20+rsp] mov r12d,r13d ror r13d,11 add ebx,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[rsp] add r12d,DWORD[28+rsp] mov r13d,r9d add r12d,edi mov r14d,ebx ror r13d,14 mov edi,r10d xor r13d,r9d ror r14d,9 xor edi,r11d mov DWORD[28+rsp],r12d xor r14d,ebx and edi,r9d ror r13d,5 add r12d,eax xor edi,r11d ror r14d,11 xor r13d,r9d add r12d,edi mov edi,ebx add r12d,DWORD[rbp] xor r14d,ebx xor edi,ecx ror r13d,6 mov eax,ecx and r15d,edi ror r14d,2 add r12d,r13d xor eax,r15d add r8d,r12d add eax,r12d lea rbp,[20+rbp] mov r13d,DWORD[36+rsp] mov r15d,DWORD[24+rsp] mov r12d,r13d ror r13d,11 add eax,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[4+rsp] add r12d,DWORD[32+rsp] mov r13d,r8d add r12d,r15d mov r14d,eax ror r13d,14 mov r15d,r9d xor r13d,r8d ror r14d,9 xor r15d,r10d mov DWORD[32+rsp],r12d xor r14d,eax and r15d,r8d ror r13d,5 add r12d,r11d xor r15d,r10d ror r14d,11 xor r13d,r8d add r12d,r15d mov r15d,eax add r12d,DWORD[rbp] xor r14d,eax xor r15d,ebx ror r13d,6 mov r11d,ebx and edi,r15d ror r14d,2 add r12d,r13d xor r11d,edi add edx,r12d add r11d,r12d lea rbp,[4+rbp] mov r13d,DWORD[40+rsp] mov edi,DWORD[28+rsp] mov r12d,r13d ror r13d,11 add r11d,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[8+rsp] add r12d,DWORD[36+rsp] mov r13d,edx add r12d,edi mov r14d,r11d ror r13d,14 mov edi,r8d xor r13d,edx ror r14d,9 xor edi,r9d mov DWORD[36+rsp],r12d xor r14d,r11d and edi,edx ror r13d,5 add r12d,r10d xor edi,r9d ror r14d,11 xor r13d,edx add r12d,edi mov edi,r11d add r12d,DWORD[rbp] xor r14d,r11d xor edi,eax ror r13d,6 mov r10d,eax and r15d,edi ror r14d,2 add r12d,r13d xor r10d,r15d add ecx,r12d add r10d,r12d lea rbp,[4+rbp] mov r13d,DWORD[44+rsp] mov r15d,DWORD[32+rsp] mov r12d,r13d ror r13d,11 add r10d,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[12+rsp] add r12d,DWORD[40+rsp] mov r13d,ecx add r12d,r15d mov r14d,r10d ror r13d,14 mov r15d,edx xor r13d,ecx ror r14d,9 xor r15d,r8d mov DWORD[40+rsp],r12d xor r14d,r10d and r15d,ecx ror r13d,5 add r12d,r9d xor r15d,r8d ror r14d,11 xor r13d,ecx add r12d,r15d mov r15d,r10d add r12d,DWORD[rbp] xor r14d,r10d xor r15d,r11d ror r13d,6 mov r9d,r11d and edi,r15d ror r14d,2 add r12d,r13d xor r9d,edi add ebx,r12d add r9d,r12d lea rbp,[4+rbp] mov r13d,DWORD[48+rsp] mov edi,DWORD[36+rsp] mov r12d,r13d ror r13d,11 add r9d,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[16+rsp] add r12d,DWORD[44+rsp] mov r13d,ebx add r12d,edi mov r14d,r9d ror r13d,14 mov edi,ecx xor r13d,ebx ror r14d,9 xor edi,edx mov DWORD[44+rsp],r12d xor r14d,r9d and edi,ebx ror r13d,5 add r12d,r8d xor edi,edx ror r14d,11 xor r13d,ebx add r12d,edi mov edi,r9d add r12d,DWORD[rbp] xor r14d,r9d xor edi,r10d ror r13d,6 mov r8d,r10d and r15d,edi ror r14d,2 add r12d,r13d xor r8d,r15d add eax,r12d add r8d,r12d lea rbp,[20+rbp] mov r13d,DWORD[52+rsp] mov r15d,DWORD[40+rsp] mov r12d,r13d ror r13d,11 add r8d,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[20+rsp] add r12d,DWORD[48+rsp] mov r13d,eax add r12d,r15d mov r14d,r8d ror r13d,14 mov r15d,ebx xor r13d,eax ror r14d,9 xor r15d,ecx mov DWORD[48+rsp],r12d xor r14d,r8d and r15d,eax ror r13d,5 add r12d,edx xor r15d,ecx ror r14d,11 xor r13d,eax add r12d,r15d mov r15d,r8d add r12d,DWORD[rbp] xor r14d,r8d xor r15d,r9d ror r13d,6 mov edx,r9d and edi,r15d ror r14d,2 add r12d,r13d xor edx,edi add r11d,r12d add edx,r12d lea rbp,[4+rbp] mov r13d,DWORD[56+rsp] mov edi,DWORD[44+rsp] mov r12d,r13d ror r13d,11 add edx,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[24+rsp] add r12d,DWORD[52+rsp] mov r13d,r11d add r12d,edi mov r14d,edx ror r13d,14 mov edi,eax xor r13d,r11d ror r14d,9 xor edi,ebx mov DWORD[52+rsp],r12d xor r14d,edx and edi,r11d ror r13d,5 add r12d,ecx xor edi,ebx ror r14d,11 xor r13d,r11d add r12d,edi mov edi,edx add r12d,DWORD[rbp] xor r14d,edx xor edi,r8d ror r13d,6 mov ecx,r8d and r15d,edi ror r14d,2 add r12d,r13d xor ecx,r15d add r10d,r12d add ecx,r12d lea rbp,[4+rbp] mov r13d,DWORD[60+rsp] mov r15d,DWORD[48+rsp] mov r12d,r13d ror r13d,11 add ecx,r14d mov r14d,r15d ror r15d,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor r15d,r14d shr r14d,10 ror r15d,17 xor r12d,r13d xor r15d,r14d add r12d,DWORD[28+rsp] add r12d,DWORD[56+rsp] mov r13d,r10d add r12d,r15d mov r14d,ecx ror r13d,14 mov r15d,r11d xor r13d,r10d ror r14d,9 xor r15d,eax mov DWORD[56+rsp],r12d xor r14d,ecx and r15d,r10d ror r13d,5 add r12d,ebx xor r15d,eax ror r14d,11 xor r13d,r10d add r12d,r15d mov r15d,ecx add r12d,DWORD[rbp] xor r14d,ecx xor r15d,edx ror r13d,6 mov ebx,edx and edi,r15d ror r14d,2 add r12d,r13d xor ebx,edi add r9d,r12d add ebx,r12d lea rbp,[4+rbp] mov r13d,DWORD[rsp] mov edi,DWORD[52+rsp] mov r12d,r13d ror r13d,11 add ebx,r14d mov r14d,edi ror edi,2 xor r13d,r12d shr r12d,3 ror r13d,7 xor edi,r14d shr r14d,10 ror edi,17 xor r12d,r13d xor edi,r14d add r12d,DWORD[32+rsp] add r12d,DWORD[60+rsp] mov r13d,r9d add r12d,edi mov r14d,ebx ror r13d,14 mov edi,r10d xor r13d,r9d ror r14d,9 xor edi,r11d mov DWORD[60+rsp],r12d xor r14d,ebx and edi,r9d ror r13d,5 add r12d,eax xor edi,r11d ror r14d,11 xor r13d,r9d add r12d,edi mov edi,ebx add r12d,DWORD[rbp] xor r14d,ebx xor edi,ecx ror r13d,6 mov eax,ecx and r15d,edi ror r14d,2 add r12d,r13d xor eax,r15d add r8d,r12d add eax,r12d lea rbp,[20+rbp] cmp BYTE[3+rbp],0 jnz NEAR $L$rounds_16_xx mov rdi,QWORD[((64+0))+rsp] add eax,r14d lea rsi,[64+rsi] add eax,DWORD[rdi] add ebx,DWORD[4+rdi] add ecx,DWORD[8+rdi] add edx,DWORD[12+rdi] add r8d,DWORD[16+rdi] add r9d,DWORD[20+rdi] add r10d,DWORD[24+rdi] add r11d,DWORD[28+rdi] cmp rsi,QWORD[((64+16))+rsp] mov DWORD[rdi],eax mov DWORD[4+rdi],ebx mov DWORD[8+rdi],ecx mov DWORD[12+rdi],edx mov DWORD[16+rdi],r8d mov DWORD[20+rdi],r9d mov DWORD[24+rdi],r10d mov DWORD[28+rdi],r11d jb NEAR $L$loop mov rsi,QWORD[88+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_sha256_block_data_order: ALIGN 64 K256: DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f DD 0x03020100,0x0b0a0908,0xffffffff,0xffffffff DD 0x03020100,0x0b0a0908,0xffffffff,0xffffffff DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 DB 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97 DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 DB 111,114,103,62,0 ALIGN 64 GFp_sha256_block_data_order_ssse3: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_sha256_block_data_order_ssse3: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$ssse3_shortcut: mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 shl rdx,4 sub rsp,160 lea rdx,[rdx*4+rsi] and rsp,-64 mov QWORD[((64+0))+rsp],rdi mov QWORD[((64+8))+rsp],rsi mov QWORD[((64+16))+rsp],rdx mov QWORD[88+rsp],rax movaps XMMWORD[(64+32)+rsp],xmm6 movaps XMMWORD[(64+48)+rsp],xmm7 movaps XMMWORD[(64+64)+rsp],xmm8 movaps XMMWORD[(64+80)+rsp],xmm9 $L$prologue_ssse3: mov eax,DWORD[rdi] mov ebx,DWORD[4+rdi] mov ecx,DWORD[8+rdi] mov edx,DWORD[12+rdi] mov r8d,DWORD[16+rdi] mov r9d,DWORD[20+rdi] mov r10d,DWORD[24+rdi] mov r11d,DWORD[28+rdi] jmp NEAR $L$loop_ssse3 ALIGN 16 $L$loop_ssse3: movdqa xmm7,XMMWORD[((K256+512))] movdqu xmm0,XMMWORD[rsi] movdqu xmm1,XMMWORD[16+rsi] movdqu xmm2,XMMWORD[32+rsi] DB 102,15,56,0,199 movdqu xmm3,XMMWORD[48+rsi] lea rbp,[K256] DB 102,15,56,0,207 movdqa xmm4,XMMWORD[rbp] movdqa xmm5,XMMWORD[32+rbp] DB 102,15,56,0,215 paddd xmm4,xmm0 movdqa xmm6,XMMWORD[64+rbp] DB 102,15,56,0,223 movdqa xmm7,XMMWORD[96+rbp] paddd xmm5,xmm1 paddd xmm6,xmm2 paddd xmm7,xmm3 movdqa XMMWORD[rsp],xmm4 mov r14d,eax movdqa XMMWORD[16+rsp],xmm5 mov edi,ebx movdqa XMMWORD[32+rsp],xmm6 xor edi,ecx movdqa XMMWORD[48+rsp],xmm7 mov r13d,r8d jmp NEAR $L$ssse3_00_47 ALIGN 16 $L$ssse3_00_47: sub rbp,-128 ror r13d,14 movdqa xmm4,xmm1 mov eax,r14d mov r12d,r9d movdqa xmm7,xmm3 ror r14d,9 xor r13d,r8d xor r12d,r10d ror r13d,5 xor r14d,eax DB 102,15,58,15,224,4 and r12d,r8d xor r13d,r8d DB 102,15,58,15,250,4 add r11d,DWORD[rsp] mov r15d,eax xor r12d,r10d ror r14d,11 movdqa xmm5,xmm4 xor r15d,ebx add r11d,r12d movdqa xmm6,xmm4 ror r13d,6 and edi,r15d psrld xmm4,3 xor r14d,eax add r11d,r13d xor edi,ebx paddd xmm0,xmm7 ror r14d,2 add edx,r11d psrld xmm6,7 add r11d,edi mov r13d,edx pshufd xmm7,xmm3,250 add r14d,r11d ror r13d,14 pslld xmm5,14 mov r11d,r14d mov r12d,r8d pxor xmm4,xmm6 ror r14d,9 xor r13d,edx xor r12d,r9d ror r13d,5 psrld xmm6,11 xor r14d,r11d pxor xmm4,xmm5 and r12d,edx xor r13d,edx pslld xmm5,11 add r10d,DWORD[4+rsp] mov edi,r11d pxor xmm4,xmm6 xor r12d,r9d ror r14d,11 movdqa xmm6,xmm7 xor edi,eax add r10d,r12d pxor xmm4,xmm5 ror r13d,6 and r15d,edi xor r14d,r11d psrld xmm7,10 add r10d,r13d xor r15d,eax paddd xmm0,xmm4 ror r14d,2 add ecx,r10d psrlq xmm6,17 add r10d,r15d mov r13d,ecx add r14d,r10d pxor xmm7,xmm6 ror r13d,14 mov r10d,r14d mov r12d,edx ror r14d,9 psrlq xmm6,2 xor r13d,ecx xor r12d,r8d pxor xmm7,xmm6 ror r13d,5 xor r14d,r10d and r12d,ecx pshufd xmm7,xmm7,128 xor r13d,ecx add r9d,DWORD[8+rsp] mov r15d,r10d psrldq xmm7,8 xor r12d,r8d ror r14d,11 xor r15d,r11d add r9d,r12d ror r13d,6 paddd xmm0,xmm7 and edi,r15d xor r14d,r10d add r9d,r13d pshufd xmm7,xmm0,80 xor edi,r11d ror r14d,2 add ebx,r9d movdqa xmm6,xmm7 add r9d,edi mov r13d,ebx psrld xmm7,10 add r14d,r9d ror r13d,14 psrlq xmm6,17 mov r9d,r14d mov r12d,ecx pxor xmm7,xmm6 ror r14d,9 xor r13d,ebx xor r12d,edx ror r13d,5 xor r14d,r9d psrlq xmm6,2 and r12d,ebx xor r13d,ebx add r8d,DWORD[12+rsp] pxor xmm7,xmm6 mov edi,r9d xor r12d,edx ror r14d,11 pshufd xmm7,xmm7,8 xor edi,r10d add r8d,r12d movdqa xmm6,XMMWORD[rbp] ror r13d,6 and r15d,edi pslldq xmm7,8 xor r14d,r9d add r8d,r13d xor r15d,r10d paddd xmm0,xmm7 ror r14d,2 add eax,r8d add r8d,r15d paddd xmm6,xmm0 mov r13d,eax add r14d,r8d movdqa XMMWORD[rsp],xmm6 ror r13d,14 movdqa xmm4,xmm2 mov r8d,r14d mov r12d,ebx movdqa xmm7,xmm0 ror r14d,9 xor r13d,eax xor r12d,ecx ror r13d,5 xor r14d,r8d DB 102,15,58,15,225,4 and r12d,eax xor r13d,eax DB 102,15,58,15,251,4 add edx,DWORD[16+rsp] mov r15d,r8d xor r12d,ecx ror r14d,11 movdqa xmm5,xmm4 xor r15d,r9d add edx,r12d movdqa xmm6,xmm4 ror r13d,6 and edi,r15d psrld xmm4,3 xor r14d,r8d add edx,r13d xor edi,r9d paddd xmm1,xmm7 ror r14d,2 add r11d,edx psrld xmm6,7 add edx,edi mov r13d,r11d pshufd xmm7,xmm0,250 add r14d,edx ror r13d,14 pslld xmm5,14 mov edx,r14d mov r12d,eax pxor xmm4,xmm6 ror r14d,9 xor r13d,r11d xor r12d,ebx ror r13d,5 psrld xmm6,11 xor r14d,edx pxor xmm4,xmm5 and r12d,r11d xor r13d,r11d pslld xmm5,11 add ecx,DWORD[20+rsp] mov edi,edx pxor xmm4,xmm6 xor r12d,ebx ror r14d,11 movdqa xmm6,xmm7 xor edi,r8d add ecx,r12d pxor xmm4,xmm5 ror r13d,6 and r15d,edi xor r14d,edx psrld xmm7,10 add ecx,r13d xor r15d,r8d paddd xmm1,xmm4 ror r14d,2 add r10d,ecx psrlq xmm6,17 add ecx,r15d mov r13d,r10d add r14d,ecx pxor xmm7,xmm6 ror r13d,14 mov ecx,r14d mov r12d,r11d ror r14d,9 psrlq xmm6,2 xor r13d,r10d xor r12d,eax pxor xmm7,xmm6 ror r13d,5 xor r14d,ecx and r12d,r10d pshufd xmm7,xmm7,128 xor r13d,r10d add ebx,DWORD[24+rsp] mov r15d,ecx psrldq xmm7,8 xor r12d,eax ror r14d,11 xor r15d,edx add ebx,r12d ror r13d,6 paddd xmm1,xmm7 and edi,r15d xor r14d,ecx add ebx,r13d pshufd xmm7,xmm1,80 xor edi,edx ror r14d,2 add r9d,ebx movdqa xmm6,xmm7 add ebx,edi mov r13d,r9d psrld xmm7,10 add r14d,ebx ror r13d,14 psrlq xmm6,17 mov ebx,r14d mov r12d,r10d pxor xmm7,xmm6 ror r14d,9 xor r13d,r9d xor r12d,r11d ror r13d,5 xor r14d,ebx psrlq xmm6,2 and r12d,r9d xor r13d,r9d add eax,DWORD[28+rsp] pxor xmm7,xmm6 mov edi,ebx xor r12d,r11d ror r14d,11 pshufd xmm7,xmm7,8 xor edi,ecx add eax,r12d movdqa xmm6,XMMWORD[32+rbp] ror r13d,6 and r15d,edi pslldq xmm7,8 xor r14d,ebx add eax,r13d xor r15d,ecx paddd xmm1,xmm7 ror r14d,2 add r8d,eax add eax,r15d paddd xmm6,xmm1 mov r13d,r8d add r14d,eax movdqa XMMWORD[16+rsp],xmm6 ror r13d,14 movdqa xmm4,xmm3 mov eax,r14d mov r12d,r9d movdqa xmm7,xmm1 ror r14d,9 xor r13d,r8d xor r12d,r10d ror r13d,5 xor r14d,eax DB 102,15,58,15,226,4 and r12d,r8d xor r13d,r8d DB 102,15,58,15,248,4 add r11d,DWORD[32+rsp] mov r15d,eax xor r12d,r10d ror r14d,11 movdqa xmm5,xmm4 xor r15d,ebx add r11d,r12d movdqa xmm6,xmm4 ror r13d,6 and edi,r15d psrld xmm4,3 xor r14d,eax add r11d,r13d xor edi,ebx paddd xmm2,xmm7 ror r14d,2 add edx,r11d psrld xmm6,7 add r11d,edi mov r13d,edx pshufd xmm7,xmm1,250 add r14d,r11d ror r13d,14 pslld xmm5,14 mov r11d,r14d mov r12d,r8d pxor xmm4,xmm6 ror r14d,9 xor r13d,edx xor r12d,r9d ror r13d,5 psrld xmm6,11 xor r14d,r11d pxor xmm4,xmm5 and r12d,edx xor r13d,edx pslld xmm5,11 add r10d,DWORD[36+rsp] mov edi,r11d pxor xmm4,xmm6 xor r12d,r9d ror r14d,11 movdqa xmm6,xmm7 xor edi,eax add r10d,r12d pxor xmm4,xmm5 ror r13d,6 and r15d,edi xor r14d,r11d psrld xmm7,10 add r10d,r13d xor r15d,eax paddd xmm2,xmm4 ror r14d,2 add ecx,r10d psrlq xmm6,17 add r10d,r15d mov r13d,ecx add r14d,r10d pxor xmm7,xmm6 ror r13d,14 mov r10d,r14d mov r12d,edx ror r14d,9 psrlq xmm6,2 xor r13d,ecx xor r12d,r8d pxor xmm7,xmm6 ror r13d,5 xor r14d,r10d and r12d,ecx pshufd xmm7,xmm7,128 xor r13d,ecx add r9d,DWORD[40+rsp] mov r15d,r10d psrldq xmm7,8 xor r12d,r8d ror r14d,11 xor r15d,r11d add r9d,r12d ror r13d,6 paddd xmm2,xmm7 and edi,r15d xor r14d,r10d add r9d,r13d pshufd xmm7,xmm2,80 xor edi,r11d ror r14d,2 add ebx,r9d movdqa xmm6,xmm7 add r9d,edi mov r13d,ebx psrld xmm7,10 add r14d,r9d ror r13d,14 psrlq xmm6,17 mov r9d,r14d mov r12d,ecx pxor xmm7,xmm6 ror r14d,9 xor r13d,ebx xor r12d,edx ror r13d,5 xor r14d,r9d psrlq xmm6,2 and r12d,ebx xor r13d,ebx add r8d,DWORD[44+rsp] pxor xmm7,xmm6 mov edi,r9d xor r12d,edx ror r14d,11 pshufd xmm7,xmm7,8 xor edi,r10d add r8d,r12d movdqa xmm6,XMMWORD[64+rbp] ror r13d,6 and r15d,edi pslldq xmm7,8 xor r14d,r9d add r8d,r13d xor r15d,r10d paddd xmm2,xmm7 ror r14d,2 add eax,r8d add r8d,r15d paddd xmm6,xmm2 mov r13d,eax add r14d,r8d movdqa XMMWORD[32+rsp],xmm6 ror r13d,14 movdqa xmm4,xmm0 mov r8d,r14d mov r12d,ebx movdqa xmm7,xmm2 ror r14d,9 xor r13d,eax xor r12d,ecx ror r13d,5 xor r14d,r8d DB 102,15,58,15,227,4 and r12d,eax xor r13d,eax DB 102,15,58,15,249,4 add edx,DWORD[48+rsp] mov r15d,r8d xor r12d,ecx ror r14d,11 movdqa xmm5,xmm4 xor r15d,r9d add edx,r12d movdqa xmm6,xmm4 ror r13d,6 and edi,r15d psrld xmm4,3 xor r14d,r8d add edx,r13d xor edi,r9d paddd xmm3,xmm7 ror r14d,2 add r11d,edx psrld xmm6,7 add edx,edi mov r13d,r11d pshufd xmm7,xmm2,250 add r14d,edx ror r13d,14 pslld xmm5,14 mov edx,r14d mov r12d,eax pxor xmm4,xmm6 ror r14d,9 xor r13d,r11d xor r12d,ebx ror r13d,5 psrld xmm6,11 xor r14d,edx pxor xmm4,xmm5 and r12d,r11d xor r13d,r11d pslld xmm5,11 add ecx,DWORD[52+rsp] mov edi,edx pxor xmm4,xmm6 xor r12d,ebx ror r14d,11 movdqa xmm6,xmm7 xor edi,r8d add ecx,r12d pxor xmm4,xmm5 ror r13d,6 and r15d,edi xor r14d,edx psrld xmm7,10 add ecx,r13d xor r15d,r8d paddd xmm3,xmm4 ror r14d,2 add r10d,ecx psrlq xmm6,17 add ecx,r15d mov r13d,r10d add r14d,ecx pxor xmm7,xmm6 ror r13d,14 mov ecx,r14d mov r12d,r11d ror r14d,9 psrlq xmm6,2 xor r13d,r10d xor r12d,eax pxor xmm7,xmm6 ror r13d,5 xor r14d,ecx and r12d,r10d pshufd xmm7,xmm7,128 xor r13d,r10d add ebx,DWORD[56+rsp] mov r15d,ecx psrldq xmm7,8 xor r12d,eax ror r14d,11 xor r15d,edx add ebx,r12d ror r13d,6 paddd xmm3,xmm7 and edi,r15d xor r14d,ecx add ebx,r13d pshufd xmm7,xmm3,80 xor edi,edx ror r14d,2 add r9d,ebx movdqa xmm6,xmm7 add ebx,edi mov r13d,r9d psrld xmm7,10 add r14d,ebx ror r13d,14 psrlq xmm6,17 mov ebx,r14d mov r12d,r10d pxor xmm7,xmm6 ror r14d,9 xor r13d,r9d xor r12d,r11d ror r13d,5 xor r14d,ebx psrlq xmm6,2 and r12d,r9d xor r13d,r9d add eax,DWORD[60+rsp] pxor xmm7,xmm6 mov edi,ebx xor r12d,r11d ror r14d,11 pshufd xmm7,xmm7,8 xor edi,ecx add eax,r12d movdqa xmm6,XMMWORD[96+rbp] ror r13d,6 and r15d,edi pslldq xmm7,8 xor r14d,ebx add eax,r13d xor r15d,ecx paddd xmm3,xmm7 ror r14d,2 add r8d,eax add eax,r15d paddd xmm6,xmm3 mov r13d,r8d add r14d,eax movdqa XMMWORD[48+rsp],xmm6 cmp BYTE[131+rbp],0 jne NEAR $L$ssse3_00_47 ror r13d,14 mov eax,r14d mov r12d,r9d ror r14d,9 xor r13d,r8d xor r12d,r10d ror r13d,5 xor r14d,eax and r12d,r8d xor r13d,r8d add r11d,DWORD[rsp] mov r15d,eax xor r12d,r10d ror r14d,11 xor r15d,ebx add r11d,r12d ror r13d,6 and edi,r15d xor r14d,eax add r11d,r13d xor edi,ebx ror r14d,2 add edx,r11d add r11d,edi mov r13d,edx add r14d,r11d ror r13d,14 mov r11d,r14d mov r12d,r8d ror r14d,9 xor r13d,edx xor r12d,r9d ror r13d,5 xor r14d,r11d and r12d,edx xor r13d,edx add r10d,DWORD[4+rsp] mov edi,r11d xor r12d,r9d ror r14d,11 xor edi,eax add r10d,r12d ror r13d,6 and r15d,edi xor r14d,r11d add r10d,r13d xor r15d,eax ror r14d,2 add ecx,r10d add r10d,r15d mov r13d,ecx add r14d,r10d ror r13d,14 mov r10d,r14d mov r12d,edx ror r14d,9 xor r13d,ecx xor r12d,r8d ror r13d,5 xor r14d,r10d and r12d,ecx xor r13d,ecx add r9d,DWORD[8+rsp] mov r15d,r10d xor r12d,r8d ror r14d,11 xor r15d,r11d add r9d,r12d ror r13d,6 and edi,r15d xor r14d,r10d add r9d,r13d xor edi,r11d ror r14d,2 add ebx,r9d add r9d,edi mov r13d,ebx add r14d,r9d ror r13d,14 mov r9d,r14d mov r12d,ecx ror r14d,9 xor r13d,ebx xor r12d,edx ror r13d,5 xor r14d,r9d and r12d,ebx xor r13d,ebx add r8d,DWORD[12+rsp] mov edi,r9d xor r12d,edx ror r14d,11 xor edi,r10d add r8d,r12d ror r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d ror r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d ror r13d,14 mov r8d,r14d mov r12d,ebx ror r14d,9 xor r13d,eax xor r12d,ecx ror r13d,5 xor r14d,r8d and r12d,eax xor r13d,eax add edx,DWORD[16+rsp] mov r15d,r8d xor r12d,ecx ror r14d,11 xor r15d,r9d add edx,r12d ror r13d,6 and edi,r15d xor r14d,r8d add edx,r13d xor edi,r9d ror r14d,2 add r11d,edx add edx,edi mov r13d,r11d add r14d,edx ror r13d,14 mov edx,r14d mov r12d,eax ror r14d,9 xor r13d,r11d xor r12d,ebx ror r13d,5 xor r14d,edx and r12d,r11d xor r13d,r11d add ecx,DWORD[20+rsp] mov edi,edx xor r12d,ebx ror r14d,11 xor edi,r8d add ecx,r12d ror r13d,6 and r15d,edi xor r14d,edx add ecx,r13d xor r15d,r8d ror r14d,2 add r10d,ecx add ecx,r15d mov r13d,r10d add r14d,ecx ror r13d,14 mov ecx,r14d mov r12d,r11d ror r14d,9 xor r13d,r10d xor r12d,eax ror r13d,5 xor r14d,ecx and r12d,r10d xor r13d,r10d add ebx,DWORD[24+rsp] mov r15d,ecx xor r12d,eax ror r14d,11 xor r15d,edx add ebx,r12d ror r13d,6 and edi,r15d xor r14d,ecx add ebx,r13d xor edi,edx ror r14d,2 add r9d,ebx add ebx,edi mov r13d,r9d add r14d,ebx ror r13d,14 mov ebx,r14d mov r12d,r10d ror r14d,9 xor r13d,r9d xor r12d,r11d ror r13d,5 xor r14d,ebx and r12d,r9d xor r13d,r9d add eax,DWORD[28+rsp] mov edi,ebx xor r12d,r11d ror r14d,11 xor edi,ecx add eax,r12d ror r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx ror r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax ror r13d,14 mov eax,r14d mov r12d,r9d ror r14d,9 xor r13d,r8d xor r12d,r10d ror r13d,5 xor r14d,eax and r12d,r8d xor r13d,r8d add r11d,DWORD[32+rsp] mov r15d,eax xor r12d,r10d ror r14d,11 xor r15d,ebx add r11d,r12d ror r13d,6 and edi,r15d xor r14d,eax add r11d,r13d xor edi,ebx ror r14d,2 add edx,r11d add r11d,edi mov r13d,edx add r14d,r11d ror r13d,14 mov r11d,r14d mov r12d,r8d ror r14d,9 xor r13d,edx xor r12d,r9d ror r13d,5 xor r14d,r11d and r12d,edx xor r13d,edx add r10d,DWORD[36+rsp] mov edi,r11d xor r12d,r9d ror r14d,11 xor edi,eax add r10d,r12d ror r13d,6 and r15d,edi xor r14d,r11d add r10d,r13d xor r15d,eax ror r14d,2 add ecx,r10d add r10d,r15d mov r13d,ecx add r14d,r10d ror r13d,14 mov r10d,r14d mov r12d,edx ror r14d,9 xor r13d,ecx xor r12d,r8d ror r13d,5 xor r14d,r10d and r12d,ecx xor r13d,ecx add r9d,DWORD[40+rsp] mov r15d,r10d xor r12d,r8d ror r14d,11 xor r15d,r11d add r9d,r12d ror r13d,6 and edi,r15d xor r14d,r10d add r9d,r13d xor edi,r11d ror r14d,2 add ebx,r9d add r9d,edi mov r13d,ebx add r14d,r9d ror r13d,14 mov r9d,r14d mov r12d,ecx ror r14d,9 xor r13d,ebx xor r12d,edx ror r13d,5 xor r14d,r9d and r12d,ebx xor r13d,ebx add r8d,DWORD[44+rsp] mov edi,r9d xor r12d,edx ror r14d,11 xor edi,r10d add r8d,r12d ror r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d ror r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d ror r13d,14 mov r8d,r14d mov r12d,ebx ror r14d,9 xor r13d,eax xor r12d,ecx ror r13d,5 xor r14d,r8d and r12d,eax xor r13d,eax add edx,DWORD[48+rsp] mov r15d,r8d xor r12d,ecx ror r14d,11 xor r15d,r9d add edx,r12d ror r13d,6 and edi,r15d xor r14d,r8d add edx,r13d xor edi,r9d ror r14d,2 add r11d,edx add edx,edi mov r13d,r11d add r14d,edx ror r13d,14 mov edx,r14d mov r12d,eax ror r14d,9 xor r13d,r11d xor r12d,ebx ror r13d,5 xor r14d,edx and r12d,r11d xor r13d,r11d add ecx,DWORD[52+rsp] mov edi,edx xor r12d,ebx ror r14d,11 xor edi,r8d add ecx,r12d ror r13d,6 and r15d,edi xor r14d,edx add ecx,r13d xor r15d,r8d ror r14d,2 add r10d,ecx add ecx,r15d mov r13d,r10d add r14d,ecx ror r13d,14 mov ecx,r14d mov r12d,r11d ror r14d,9 xor r13d,r10d xor r12d,eax ror r13d,5 xor r14d,ecx and r12d,r10d xor r13d,r10d add ebx,DWORD[56+rsp] mov r15d,ecx xor r12d,eax ror r14d,11 xor r15d,edx add ebx,r12d ror r13d,6 and edi,r15d xor r14d,ecx add ebx,r13d xor edi,edx ror r14d,2 add r9d,ebx add ebx,edi mov r13d,r9d add r14d,ebx ror r13d,14 mov ebx,r14d mov r12d,r10d ror r14d,9 xor r13d,r9d xor r12d,r11d ror r13d,5 xor r14d,ebx and r12d,r9d xor r13d,r9d add eax,DWORD[60+rsp] mov edi,ebx xor r12d,r11d ror r14d,11 xor edi,ecx add eax,r12d ror r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx ror r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax mov rdi,QWORD[((64+0))+rsp] mov eax,r14d add eax,DWORD[rdi] lea rsi,[64+rsi] add ebx,DWORD[4+rdi] add ecx,DWORD[8+rdi] add edx,DWORD[12+rdi] add r8d,DWORD[16+rdi] add r9d,DWORD[20+rdi] add r10d,DWORD[24+rdi] add r11d,DWORD[28+rdi] cmp rsi,QWORD[((64+16))+rsp] mov DWORD[rdi],eax mov DWORD[4+rdi],ebx mov DWORD[8+rdi],ecx mov DWORD[12+rdi],edx mov DWORD[16+rdi],r8d mov DWORD[20+rdi],r9d mov DWORD[24+rdi],r10d mov DWORD[28+rdi],r11d jb NEAR $L$loop_ssse3 mov rsi,QWORD[88+rsp] movaps xmm6,XMMWORD[((64+32))+rsp] movaps xmm7,XMMWORD[((64+48))+rsp] movaps xmm8,XMMWORD[((64+64))+rsp] movaps xmm9,XMMWORD[((64+80))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$epilogue_ssse3: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_sha256_block_data_order_ssse3: ALIGN 64 GFp_sha256_block_data_order_avx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_sha256_block_data_order_avx: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$avx_shortcut: mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 shl rdx,4 sub rsp,160 lea rdx,[rdx*4+rsi] and rsp,-64 mov QWORD[((64+0))+rsp],rdi mov QWORD[((64+8))+rsp],rsi mov QWORD[((64+16))+rsp],rdx mov QWORD[88+rsp],rax movaps XMMWORD[(64+32)+rsp],xmm6 movaps XMMWORD[(64+48)+rsp],xmm7 movaps XMMWORD[(64+64)+rsp],xmm8 movaps XMMWORD[(64+80)+rsp],xmm9 $L$prologue_avx: vzeroupper mov eax,DWORD[rdi] mov ebx,DWORD[4+rdi] mov ecx,DWORD[8+rdi] mov edx,DWORD[12+rdi] mov r8d,DWORD[16+rdi] mov r9d,DWORD[20+rdi] mov r10d,DWORD[24+rdi] mov r11d,DWORD[28+rdi] vmovdqa xmm8,XMMWORD[((K256+512+32))] vmovdqa xmm9,XMMWORD[((K256+512+64))] jmp NEAR $L$loop_avx ALIGN 16 $L$loop_avx: vmovdqa xmm7,XMMWORD[((K256+512))] vmovdqu xmm0,XMMWORD[rsi] vmovdqu xmm1,XMMWORD[16+rsi] vmovdqu xmm2,XMMWORD[32+rsi] vmovdqu xmm3,XMMWORD[48+rsi] vpshufb xmm0,xmm0,xmm7 lea rbp,[K256] vpshufb xmm1,xmm1,xmm7 vpshufb xmm2,xmm2,xmm7 vpaddd xmm4,xmm0,XMMWORD[rbp] vpshufb xmm3,xmm3,xmm7 vpaddd xmm5,xmm1,XMMWORD[32+rbp] vpaddd xmm6,xmm2,XMMWORD[64+rbp] vpaddd xmm7,xmm3,XMMWORD[96+rbp] vmovdqa XMMWORD[rsp],xmm4 mov r14d,eax vmovdqa XMMWORD[16+rsp],xmm5 mov edi,ebx vmovdqa XMMWORD[32+rsp],xmm6 xor edi,ecx vmovdqa XMMWORD[48+rsp],xmm7 mov r13d,r8d jmp NEAR $L$avx_00_47 ALIGN 16 $L$avx_00_47: sub rbp,-128 vpalignr xmm4,xmm1,xmm0,4 shrd r13d,r13d,14 mov eax,r14d mov r12d,r9d vpalignr xmm7,xmm3,xmm2,4 shrd r14d,r14d,9 xor r13d,r8d xor r12d,r10d vpsrld xmm6,xmm4,7 shrd r13d,r13d,5 xor r14d,eax and r12d,r8d vpaddd xmm0,xmm0,xmm7 xor r13d,r8d add r11d,DWORD[rsp] mov r15d,eax vpsrld xmm7,xmm4,3 xor r12d,r10d shrd r14d,r14d,11 xor r15d,ebx vpslld xmm5,xmm4,14 add r11d,r12d shrd r13d,r13d,6 and edi,r15d vpxor xmm4,xmm7,xmm6 xor r14d,eax add r11d,r13d xor edi,ebx vpshufd xmm7,xmm3,250 shrd r14d,r14d,2 add edx,r11d add r11d,edi vpsrld xmm6,xmm6,11 mov r13d,edx add r14d,r11d shrd r13d,r13d,14 vpxor xmm4,xmm4,xmm5 mov r11d,r14d mov r12d,r8d shrd r14d,r14d,9 vpslld xmm5,xmm5,11 xor r13d,edx xor r12d,r9d shrd r13d,r13d,5 vpxor xmm4,xmm4,xmm6 xor r14d,r11d and r12d,edx xor r13d,edx vpsrld xmm6,xmm7,10 add r10d,DWORD[4+rsp] mov edi,r11d xor r12d,r9d vpxor xmm4,xmm4,xmm5 shrd r14d,r14d,11 xor edi,eax add r10d,r12d vpsrlq xmm7,xmm7,17 shrd r13d,r13d,6 and r15d,edi xor r14d,r11d vpaddd xmm0,xmm0,xmm4 add r10d,r13d xor r15d,eax shrd r14d,r14d,2 vpxor xmm6,xmm6,xmm7 add ecx,r10d add r10d,r15d mov r13d,ecx vpsrlq xmm7,xmm7,2 add r14d,r10d shrd r13d,r13d,14 mov r10d,r14d vpxor xmm6,xmm6,xmm7 mov r12d,edx shrd r14d,r14d,9 xor r13d,ecx vpshufb xmm6,xmm6,xmm8 xor r12d,r8d shrd r13d,r13d,5 xor r14d,r10d vpaddd xmm0,xmm0,xmm6 and r12d,ecx xor r13d,ecx add r9d,DWORD[8+rsp] vpshufd xmm7,xmm0,80 mov r15d,r10d xor r12d,r8d shrd r14d,r14d,11 vpsrld xmm6,xmm7,10 xor r15d,r11d add r9d,r12d shrd r13d,r13d,6 vpsrlq xmm7,xmm7,17 and edi,r15d xor r14d,r10d add r9d,r13d vpxor xmm6,xmm6,xmm7 xor edi,r11d shrd r14d,r14d,2 add ebx,r9d vpsrlq xmm7,xmm7,2 add r9d,edi mov r13d,ebx add r14d,r9d vpxor xmm6,xmm6,xmm7 shrd r13d,r13d,14 mov r9d,r14d mov r12d,ecx vpshufb xmm6,xmm6,xmm9 shrd r14d,r14d,9 xor r13d,ebx xor r12d,edx vpaddd xmm0,xmm0,xmm6 shrd r13d,r13d,5 xor r14d,r9d and r12d,ebx vpaddd xmm6,xmm0,XMMWORD[rbp] xor r13d,ebx add r8d,DWORD[12+rsp] mov edi,r9d xor r12d,edx shrd r14d,r14d,11 xor edi,r10d add r8d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d shrd r14d,r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d vmovdqa XMMWORD[rsp],xmm6 vpalignr xmm4,xmm2,xmm1,4 shrd r13d,r13d,14 mov r8d,r14d mov r12d,ebx vpalignr xmm7,xmm0,xmm3,4 shrd r14d,r14d,9 xor r13d,eax xor r12d,ecx vpsrld xmm6,xmm4,7 shrd r13d,r13d,5 xor r14d,r8d and r12d,eax vpaddd xmm1,xmm1,xmm7 xor r13d,eax add edx,DWORD[16+rsp] mov r15d,r8d vpsrld xmm7,xmm4,3 xor r12d,ecx shrd r14d,r14d,11 xor r15d,r9d vpslld xmm5,xmm4,14 add edx,r12d shrd r13d,r13d,6 and edi,r15d vpxor xmm4,xmm7,xmm6 xor r14d,r8d add edx,r13d xor edi,r9d vpshufd xmm7,xmm0,250 shrd r14d,r14d,2 add r11d,edx add edx,edi vpsrld xmm6,xmm6,11 mov r13d,r11d add r14d,edx shrd r13d,r13d,14 vpxor xmm4,xmm4,xmm5 mov edx,r14d mov r12d,eax shrd r14d,r14d,9 vpslld xmm5,xmm5,11 xor r13d,r11d xor r12d,ebx shrd r13d,r13d,5 vpxor xmm4,xmm4,xmm6 xor r14d,edx and r12d,r11d xor r13d,r11d vpsrld xmm6,xmm7,10 add ecx,DWORD[20+rsp] mov edi,edx xor r12d,ebx vpxor xmm4,xmm4,xmm5 shrd r14d,r14d,11 xor edi,r8d add ecx,r12d vpsrlq xmm7,xmm7,17 shrd r13d,r13d,6 and r15d,edi xor r14d,edx vpaddd xmm1,xmm1,xmm4 add ecx,r13d xor r15d,r8d shrd r14d,r14d,2 vpxor xmm6,xmm6,xmm7 add r10d,ecx add ecx,r15d mov r13d,r10d vpsrlq xmm7,xmm7,2 add r14d,ecx shrd r13d,r13d,14 mov ecx,r14d vpxor xmm6,xmm6,xmm7 mov r12d,r11d shrd r14d,r14d,9 xor r13d,r10d vpshufb xmm6,xmm6,xmm8 xor r12d,eax shrd r13d,r13d,5 xor r14d,ecx vpaddd xmm1,xmm1,xmm6 and r12d,r10d xor r13d,r10d add ebx,DWORD[24+rsp] vpshufd xmm7,xmm1,80 mov r15d,ecx xor r12d,eax shrd r14d,r14d,11 vpsrld xmm6,xmm7,10 xor r15d,edx add ebx,r12d shrd r13d,r13d,6 vpsrlq xmm7,xmm7,17 and edi,r15d xor r14d,ecx add ebx,r13d vpxor xmm6,xmm6,xmm7 xor edi,edx shrd r14d,r14d,2 add r9d,ebx vpsrlq xmm7,xmm7,2 add ebx,edi mov r13d,r9d add r14d,ebx vpxor xmm6,xmm6,xmm7 shrd r13d,r13d,14 mov ebx,r14d mov r12d,r10d vpshufb xmm6,xmm6,xmm9 shrd r14d,r14d,9 xor r13d,r9d xor r12d,r11d vpaddd xmm1,xmm1,xmm6 shrd r13d,r13d,5 xor r14d,ebx and r12d,r9d vpaddd xmm6,xmm1,XMMWORD[32+rbp] xor r13d,r9d add eax,DWORD[28+rsp] mov edi,ebx xor r12d,r11d shrd r14d,r14d,11 xor edi,ecx add eax,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx shrd r14d,r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax vmovdqa XMMWORD[16+rsp],xmm6 vpalignr xmm4,xmm3,xmm2,4 shrd r13d,r13d,14 mov eax,r14d mov r12d,r9d vpalignr xmm7,xmm1,xmm0,4 shrd r14d,r14d,9 xor r13d,r8d xor r12d,r10d vpsrld xmm6,xmm4,7 shrd r13d,r13d,5 xor r14d,eax and r12d,r8d vpaddd xmm2,xmm2,xmm7 xor r13d,r8d add r11d,DWORD[32+rsp] mov r15d,eax vpsrld xmm7,xmm4,3 xor r12d,r10d shrd r14d,r14d,11 xor r15d,ebx vpslld xmm5,xmm4,14 add r11d,r12d shrd r13d,r13d,6 and edi,r15d vpxor xmm4,xmm7,xmm6 xor r14d,eax add r11d,r13d xor edi,ebx vpshufd xmm7,xmm1,250 shrd r14d,r14d,2 add edx,r11d add r11d,edi vpsrld xmm6,xmm6,11 mov r13d,edx add r14d,r11d shrd r13d,r13d,14 vpxor xmm4,xmm4,xmm5 mov r11d,r14d mov r12d,r8d shrd r14d,r14d,9 vpslld xmm5,xmm5,11 xor r13d,edx xor r12d,r9d shrd r13d,r13d,5 vpxor xmm4,xmm4,xmm6 xor r14d,r11d and r12d,edx xor r13d,edx vpsrld xmm6,xmm7,10 add r10d,DWORD[36+rsp] mov edi,r11d xor r12d,r9d vpxor xmm4,xmm4,xmm5 shrd r14d,r14d,11 xor edi,eax add r10d,r12d vpsrlq xmm7,xmm7,17 shrd r13d,r13d,6 and r15d,edi xor r14d,r11d vpaddd xmm2,xmm2,xmm4 add r10d,r13d xor r15d,eax shrd r14d,r14d,2 vpxor xmm6,xmm6,xmm7 add ecx,r10d add r10d,r15d mov r13d,ecx vpsrlq xmm7,xmm7,2 add r14d,r10d shrd r13d,r13d,14 mov r10d,r14d vpxor xmm6,xmm6,xmm7 mov r12d,edx shrd r14d,r14d,9 xor r13d,ecx vpshufb xmm6,xmm6,xmm8 xor r12d,r8d shrd r13d,r13d,5 xor r14d,r10d vpaddd xmm2,xmm2,xmm6 and r12d,ecx xor r13d,ecx add r9d,DWORD[40+rsp] vpshufd xmm7,xmm2,80 mov r15d,r10d xor r12d,r8d shrd r14d,r14d,11 vpsrld xmm6,xmm7,10 xor r15d,r11d add r9d,r12d shrd r13d,r13d,6 vpsrlq xmm7,xmm7,17 and edi,r15d xor r14d,r10d add r9d,r13d vpxor xmm6,xmm6,xmm7 xor edi,r11d shrd r14d,r14d,2 add ebx,r9d vpsrlq xmm7,xmm7,2 add r9d,edi mov r13d,ebx add r14d,r9d vpxor xmm6,xmm6,xmm7 shrd r13d,r13d,14 mov r9d,r14d mov r12d,ecx vpshufb xmm6,xmm6,xmm9 shrd r14d,r14d,9 xor r13d,ebx xor r12d,edx vpaddd xmm2,xmm2,xmm6 shrd r13d,r13d,5 xor r14d,r9d and r12d,ebx vpaddd xmm6,xmm2,XMMWORD[64+rbp] xor r13d,ebx add r8d,DWORD[44+rsp] mov edi,r9d xor r12d,edx shrd r14d,r14d,11 xor edi,r10d add r8d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d shrd r14d,r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d vmovdqa XMMWORD[32+rsp],xmm6 vpalignr xmm4,xmm0,xmm3,4 shrd r13d,r13d,14 mov r8d,r14d mov r12d,ebx vpalignr xmm7,xmm2,xmm1,4 shrd r14d,r14d,9 xor r13d,eax xor r12d,ecx vpsrld xmm6,xmm4,7 shrd r13d,r13d,5 xor r14d,r8d and r12d,eax vpaddd xmm3,xmm3,xmm7 xor r13d,eax add edx,DWORD[48+rsp] mov r15d,r8d vpsrld xmm7,xmm4,3 xor r12d,ecx shrd r14d,r14d,11 xor r15d,r9d vpslld xmm5,xmm4,14 add edx,r12d shrd r13d,r13d,6 and edi,r15d vpxor xmm4,xmm7,xmm6 xor r14d,r8d add edx,r13d xor edi,r9d vpshufd xmm7,xmm2,250 shrd r14d,r14d,2 add r11d,edx add edx,edi vpsrld xmm6,xmm6,11 mov r13d,r11d add r14d,edx shrd r13d,r13d,14 vpxor xmm4,xmm4,xmm5 mov edx,r14d mov r12d,eax shrd r14d,r14d,9 vpslld xmm5,xmm5,11 xor r13d,r11d xor r12d,ebx shrd r13d,r13d,5 vpxor xmm4,xmm4,xmm6 xor r14d,edx and r12d,r11d xor r13d,r11d vpsrld xmm6,xmm7,10 add ecx,DWORD[52+rsp] mov edi,edx xor r12d,ebx vpxor xmm4,xmm4,xmm5 shrd r14d,r14d,11 xor edi,r8d add ecx,r12d vpsrlq xmm7,xmm7,17 shrd r13d,r13d,6 and r15d,edi xor r14d,edx vpaddd xmm3,xmm3,xmm4 add ecx,r13d xor r15d,r8d shrd r14d,r14d,2 vpxor xmm6,xmm6,xmm7 add r10d,ecx add ecx,r15d mov r13d,r10d vpsrlq xmm7,xmm7,2 add r14d,ecx shrd r13d,r13d,14 mov ecx,r14d vpxor xmm6,xmm6,xmm7 mov r12d,r11d shrd r14d,r14d,9 xor r13d,r10d vpshufb xmm6,xmm6,xmm8 xor r12d,eax shrd r13d,r13d,5 xor r14d,ecx vpaddd xmm3,xmm3,xmm6 and r12d,r10d xor r13d,r10d add ebx,DWORD[56+rsp] vpshufd xmm7,xmm3,80 mov r15d,ecx xor r12d,eax shrd r14d,r14d,11 vpsrld xmm6,xmm7,10 xor r15d,edx add ebx,r12d shrd r13d,r13d,6 vpsrlq xmm7,xmm7,17 and edi,r15d xor r14d,ecx add ebx,r13d vpxor xmm6,xmm6,xmm7 xor edi,edx shrd r14d,r14d,2 add r9d,ebx vpsrlq xmm7,xmm7,2 add ebx,edi mov r13d,r9d add r14d,ebx vpxor xmm6,xmm6,xmm7 shrd r13d,r13d,14 mov ebx,r14d mov r12d,r10d vpshufb xmm6,xmm6,xmm9 shrd r14d,r14d,9 xor r13d,r9d xor r12d,r11d vpaddd xmm3,xmm3,xmm6 shrd r13d,r13d,5 xor r14d,ebx and r12d,r9d vpaddd xmm6,xmm3,XMMWORD[96+rbp] xor r13d,r9d add eax,DWORD[60+rsp] mov edi,ebx xor r12d,r11d shrd r14d,r14d,11 xor edi,ecx add eax,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx shrd r14d,r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax vmovdqa XMMWORD[48+rsp],xmm6 cmp BYTE[131+rbp],0 jne NEAR $L$avx_00_47 shrd r13d,r13d,14 mov eax,r14d mov r12d,r9d shrd r14d,r14d,9 xor r13d,r8d xor r12d,r10d shrd r13d,r13d,5 xor r14d,eax and r12d,r8d xor r13d,r8d add r11d,DWORD[rsp] mov r15d,eax xor r12d,r10d shrd r14d,r14d,11 xor r15d,ebx add r11d,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,eax add r11d,r13d xor edi,ebx shrd r14d,r14d,2 add edx,r11d add r11d,edi mov r13d,edx add r14d,r11d shrd r13d,r13d,14 mov r11d,r14d mov r12d,r8d shrd r14d,r14d,9 xor r13d,edx xor r12d,r9d shrd r13d,r13d,5 xor r14d,r11d and r12d,edx xor r13d,edx add r10d,DWORD[4+rsp] mov edi,r11d xor r12d,r9d shrd r14d,r14d,11 xor edi,eax add r10d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r11d add r10d,r13d xor r15d,eax shrd r14d,r14d,2 add ecx,r10d add r10d,r15d mov r13d,ecx add r14d,r10d shrd r13d,r13d,14 mov r10d,r14d mov r12d,edx shrd r14d,r14d,9 xor r13d,ecx xor r12d,r8d shrd r13d,r13d,5 xor r14d,r10d and r12d,ecx xor r13d,ecx add r9d,DWORD[8+rsp] mov r15d,r10d xor r12d,r8d shrd r14d,r14d,11 xor r15d,r11d add r9d,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,r10d add r9d,r13d xor edi,r11d shrd r14d,r14d,2 add ebx,r9d add r9d,edi mov r13d,ebx add r14d,r9d shrd r13d,r13d,14 mov r9d,r14d mov r12d,ecx shrd r14d,r14d,9 xor r13d,ebx xor r12d,edx shrd r13d,r13d,5 xor r14d,r9d and r12d,ebx xor r13d,ebx add r8d,DWORD[12+rsp] mov edi,r9d xor r12d,edx shrd r14d,r14d,11 xor edi,r10d add r8d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d shrd r14d,r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d shrd r13d,r13d,14 mov r8d,r14d mov r12d,ebx shrd r14d,r14d,9 xor r13d,eax xor r12d,ecx shrd r13d,r13d,5 xor r14d,r8d and r12d,eax xor r13d,eax add edx,DWORD[16+rsp] mov r15d,r8d xor r12d,ecx shrd r14d,r14d,11 xor r15d,r9d add edx,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,r8d add edx,r13d xor edi,r9d shrd r14d,r14d,2 add r11d,edx add edx,edi mov r13d,r11d add r14d,edx shrd r13d,r13d,14 mov edx,r14d mov r12d,eax shrd r14d,r14d,9 xor r13d,r11d xor r12d,ebx shrd r13d,r13d,5 xor r14d,edx and r12d,r11d xor r13d,r11d add ecx,DWORD[20+rsp] mov edi,edx xor r12d,ebx shrd r14d,r14d,11 xor edi,r8d add ecx,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,edx add ecx,r13d xor r15d,r8d shrd r14d,r14d,2 add r10d,ecx add ecx,r15d mov r13d,r10d add r14d,ecx shrd r13d,r13d,14 mov ecx,r14d mov r12d,r11d shrd r14d,r14d,9 xor r13d,r10d xor r12d,eax shrd r13d,r13d,5 xor r14d,ecx and r12d,r10d xor r13d,r10d add ebx,DWORD[24+rsp] mov r15d,ecx xor r12d,eax shrd r14d,r14d,11 xor r15d,edx add ebx,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,ecx add ebx,r13d xor edi,edx shrd r14d,r14d,2 add r9d,ebx add ebx,edi mov r13d,r9d add r14d,ebx shrd r13d,r13d,14 mov ebx,r14d mov r12d,r10d shrd r14d,r14d,9 xor r13d,r9d xor r12d,r11d shrd r13d,r13d,5 xor r14d,ebx and r12d,r9d xor r13d,r9d add eax,DWORD[28+rsp] mov edi,ebx xor r12d,r11d shrd r14d,r14d,11 xor edi,ecx add eax,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx shrd r14d,r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax shrd r13d,r13d,14 mov eax,r14d mov r12d,r9d shrd r14d,r14d,9 xor r13d,r8d xor r12d,r10d shrd r13d,r13d,5 xor r14d,eax and r12d,r8d xor r13d,r8d add r11d,DWORD[32+rsp] mov r15d,eax xor r12d,r10d shrd r14d,r14d,11 xor r15d,ebx add r11d,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,eax add r11d,r13d xor edi,ebx shrd r14d,r14d,2 add edx,r11d add r11d,edi mov r13d,edx add r14d,r11d shrd r13d,r13d,14 mov r11d,r14d mov r12d,r8d shrd r14d,r14d,9 xor r13d,edx xor r12d,r9d shrd r13d,r13d,5 xor r14d,r11d and r12d,edx xor r13d,edx add r10d,DWORD[36+rsp] mov edi,r11d xor r12d,r9d shrd r14d,r14d,11 xor edi,eax add r10d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r11d add r10d,r13d xor r15d,eax shrd r14d,r14d,2 add ecx,r10d add r10d,r15d mov r13d,ecx add r14d,r10d shrd r13d,r13d,14 mov r10d,r14d mov r12d,edx shrd r14d,r14d,9 xor r13d,ecx xor r12d,r8d shrd r13d,r13d,5 xor r14d,r10d and r12d,ecx xor r13d,ecx add r9d,DWORD[40+rsp] mov r15d,r10d xor r12d,r8d shrd r14d,r14d,11 xor r15d,r11d add r9d,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,r10d add r9d,r13d xor edi,r11d shrd r14d,r14d,2 add ebx,r9d add r9d,edi mov r13d,ebx add r14d,r9d shrd r13d,r13d,14 mov r9d,r14d mov r12d,ecx shrd r14d,r14d,9 xor r13d,ebx xor r12d,edx shrd r13d,r13d,5 xor r14d,r9d and r12d,ebx xor r13d,ebx add r8d,DWORD[44+rsp] mov edi,r9d xor r12d,edx shrd r14d,r14d,11 xor edi,r10d add r8d,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,r9d add r8d,r13d xor r15d,r10d shrd r14d,r14d,2 add eax,r8d add r8d,r15d mov r13d,eax add r14d,r8d shrd r13d,r13d,14 mov r8d,r14d mov r12d,ebx shrd r14d,r14d,9 xor r13d,eax xor r12d,ecx shrd r13d,r13d,5 xor r14d,r8d and r12d,eax xor r13d,eax add edx,DWORD[48+rsp] mov r15d,r8d xor r12d,ecx shrd r14d,r14d,11 xor r15d,r9d add edx,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,r8d add edx,r13d xor edi,r9d shrd r14d,r14d,2 add r11d,edx add edx,edi mov r13d,r11d add r14d,edx shrd r13d,r13d,14 mov edx,r14d mov r12d,eax shrd r14d,r14d,9 xor r13d,r11d xor r12d,ebx shrd r13d,r13d,5 xor r14d,edx and r12d,r11d xor r13d,r11d add ecx,DWORD[52+rsp] mov edi,edx xor r12d,ebx shrd r14d,r14d,11 xor edi,r8d add ecx,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,edx add ecx,r13d xor r15d,r8d shrd r14d,r14d,2 add r10d,ecx add ecx,r15d mov r13d,r10d add r14d,ecx shrd r13d,r13d,14 mov ecx,r14d mov r12d,r11d shrd r14d,r14d,9 xor r13d,r10d xor r12d,eax shrd r13d,r13d,5 xor r14d,ecx and r12d,r10d xor r13d,r10d add ebx,DWORD[56+rsp] mov r15d,ecx xor r12d,eax shrd r14d,r14d,11 xor r15d,edx add ebx,r12d shrd r13d,r13d,6 and edi,r15d xor r14d,ecx add ebx,r13d xor edi,edx shrd r14d,r14d,2 add r9d,ebx add ebx,edi mov r13d,r9d add r14d,ebx shrd r13d,r13d,14 mov ebx,r14d mov r12d,r10d shrd r14d,r14d,9 xor r13d,r9d xor r12d,r11d shrd r13d,r13d,5 xor r14d,ebx and r12d,r9d xor r13d,r9d add eax,DWORD[60+rsp] mov edi,ebx xor r12d,r11d shrd r14d,r14d,11 xor edi,ecx add eax,r12d shrd r13d,r13d,6 and r15d,edi xor r14d,ebx add eax,r13d xor r15d,ecx shrd r14d,r14d,2 add r8d,eax add eax,r15d mov r13d,r8d add r14d,eax mov rdi,QWORD[((64+0))+rsp] mov eax,r14d add eax,DWORD[rdi] lea rsi,[64+rsi] add ebx,DWORD[4+rdi] add ecx,DWORD[8+rdi] add edx,DWORD[12+rdi] add r8d,DWORD[16+rdi] add r9d,DWORD[20+rdi] add r10d,DWORD[24+rdi] add r11d,DWORD[28+rdi] cmp rsi,QWORD[((64+16))+rsp] mov DWORD[rdi],eax mov DWORD[4+rdi],ebx mov DWORD[8+rdi],ecx mov DWORD[12+rdi],edx mov DWORD[16+rdi],r8d mov DWORD[20+rdi],r9d mov DWORD[24+rdi],r10d mov DWORD[28+rdi],r11d jb NEAR $L$loop_avx mov rsi,QWORD[88+rsp] vzeroupper movaps xmm6,XMMWORD[((64+32))+rsp] movaps xmm7,XMMWORD[((64+48))+rsp] movaps xmm8,XMMWORD[((64+64))+rsp] movaps xmm9,XMMWORD[((64+80))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$epilogue_avx: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_sha256_block_data_order_avx: EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_prologue mov rsi,rax mov rax,QWORD[((64+24))+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 lea r10,[$L$epilogue] cmp rbx,r10 jb NEAR $L$in_prologue lea rsi,[((64+32))+rsi] lea rdi,[512+r8] mov ecx,8 DD 0xa548f3fc $L$in_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_sha256_block_data_order wrt ..imagebase DD $L$SEH_end_GFp_sha256_block_data_order wrt ..imagebase DD $L$SEH_info_GFp_sha256_block_data_order wrt ..imagebase DD $L$SEH_begin_GFp_sha256_block_data_order_ssse3 wrt ..imagebase DD $L$SEH_end_GFp_sha256_block_data_order_ssse3 wrt ..imagebase DD $L$SEH_info_GFp_sha256_block_data_order_ssse3 wrt ..imagebase DD $L$SEH_begin_GFp_sha256_block_data_order_avx wrt ..imagebase DD $L$SEH_end_GFp_sha256_block_data_order_avx wrt ..imagebase DD $L$SEH_info_GFp_sha256_block_data_order_avx wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_sha256_block_data_order: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase $L$SEH_info_GFp_sha256_block_data_order_ssse3: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase $L$SEH_info_GFp_sha256_block_data_order_avx: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase ring-0.16.9/pregenerated/tmp/sha512-x86_64-nasm.asm000064400000000000000000001303521353224260200176010ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_sha512_block_data_order ALIGN 16 GFp_sha512_block_data_order: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_sha512_block_data_order: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea r11,[GFp_ia32cap_P] mov r9d,DWORD[r11] mov r10d,DWORD[4+r11] mov r11d,DWORD[8+r11] and r9d,1073741824 and r10d,268435968 or r10d,r9d cmp r10d,1342177792 je NEAR $L$avx_shortcut mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 shl rdx,4 sub rsp,16*8+4*8 lea rdx,[rdx*8+rsi] and rsp,-64 mov QWORD[((128+0))+rsp],rdi mov QWORD[((128+8))+rsp],rsi mov QWORD[((128+16))+rsp],rdx mov QWORD[152+rsp],rax $L$prologue: mov rax,QWORD[rdi] mov rbx,QWORD[8+rdi] mov rcx,QWORD[16+rdi] mov rdx,QWORD[24+rdi] mov r8,QWORD[32+rdi] mov r9,QWORD[40+rdi] mov r10,QWORD[48+rdi] mov r11,QWORD[56+rdi] jmp NEAR $L$loop ALIGN 16 $L$loop: mov rdi,rbx lea rbp,[K512] xor rdi,rcx mov r12,QWORD[rsi] mov r13,r8 mov r14,rax bswap r12 ror r13,23 mov r15,r9 xor r13,r8 ror r14,5 xor r15,r10 mov QWORD[rsp],r12 xor r14,rax and r15,r8 ror r13,4 add r12,r11 xor r15,r10 ror r14,6 xor r13,r8 add r12,r15 mov r15,rax add r12,QWORD[rbp] xor r14,rax xor r15,rbx ror r13,14 mov r11,rbx and rdi,r15 ror r14,28 add r12,r13 xor r11,rdi add rdx,r12 add r11,r12 lea rbp,[8+rbp] add r11,r14 mov r12,QWORD[8+rsi] mov r13,rdx mov r14,r11 bswap r12 ror r13,23 mov rdi,r8 xor r13,rdx ror r14,5 xor rdi,r9 mov QWORD[8+rsp],r12 xor r14,r11 and rdi,rdx ror r13,4 add r12,r10 xor rdi,r9 ror r14,6 xor r13,rdx add r12,rdi mov rdi,r11 add r12,QWORD[rbp] xor r14,r11 xor rdi,rax ror r13,14 mov r10,rax and r15,rdi ror r14,28 add r12,r13 xor r10,r15 add rcx,r12 add r10,r12 lea rbp,[24+rbp] add r10,r14 mov r12,QWORD[16+rsi] mov r13,rcx mov r14,r10 bswap r12 ror r13,23 mov r15,rdx xor r13,rcx ror r14,5 xor r15,r8 mov QWORD[16+rsp],r12 xor r14,r10 and r15,rcx ror r13,4 add r12,r9 xor r15,r8 ror r14,6 xor r13,rcx add r12,r15 mov r15,r10 add r12,QWORD[rbp] xor r14,r10 xor r15,r11 ror r13,14 mov r9,r11 and rdi,r15 ror r14,28 add r12,r13 xor r9,rdi add rbx,r12 add r9,r12 lea rbp,[8+rbp] add r9,r14 mov r12,QWORD[24+rsi] mov r13,rbx mov r14,r9 bswap r12 ror r13,23 mov rdi,rcx xor r13,rbx ror r14,5 xor rdi,rdx mov QWORD[24+rsp],r12 xor r14,r9 and rdi,rbx ror r13,4 add r12,r8 xor rdi,rdx ror r14,6 xor r13,rbx add r12,rdi mov rdi,r9 add r12,QWORD[rbp] xor r14,r9 xor rdi,r10 ror r13,14 mov r8,r10 and r15,rdi ror r14,28 add r12,r13 xor r8,r15 add rax,r12 add r8,r12 lea rbp,[24+rbp] add r8,r14 mov r12,QWORD[32+rsi] mov r13,rax mov r14,r8 bswap r12 ror r13,23 mov r15,rbx xor r13,rax ror r14,5 xor r15,rcx mov QWORD[32+rsp],r12 xor r14,r8 and r15,rax ror r13,4 add r12,rdx xor r15,rcx ror r14,6 xor r13,rax add r12,r15 mov r15,r8 add r12,QWORD[rbp] xor r14,r8 xor r15,r9 ror r13,14 mov rdx,r9 and rdi,r15 ror r14,28 add r12,r13 xor rdx,rdi add r11,r12 add rdx,r12 lea rbp,[8+rbp] add rdx,r14 mov r12,QWORD[40+rsi] mov r13,r11 mov r14,rdx bswap r12 ror r13,23 mov rdi,rax xor r13,r11 ror r14,5 xor rdi,rbx mov QWORD[40+rsp],r12 xor r14,rdx and rdi,r11 ror r13,4 add r12,rcx xor rdi,rbx ror r14,6 xor r13,r11 add r12,rdi mov rdi,rdx add r12,QWORD[rbp] xor r14,rdx xor rdi,r8 ror r13,14 mov rcx,r8 and r15,rdi ror r14,28 add r12,r13 xor rcx,r15 add r10,r12 add rcx,r12 lea rbp,[24+rbp] add rcx,r14 mov r12,QWORD[48+rsi] mov r13,r10 mov r14,rcx bswap r12 ror r13,23 mov r15,r11 xor r13,r10 ror r14,5 xor r15,rax mov QWORD[48+rsp],r12 xor r14,rcx and r15,r10 ror r13,4 add r12,rbx xor r15,rax ror r14,6 xor r13,r10 add r12,r15 mov r15,rcx add r12,QWORD[rbp] xor r14,rcx xor r15,rdx ror r13,14 mov rbx,rdx and rdi,r15 ror r14,28 add r12,r13 xor rbx,rdi add r9,r12 add rbx,r12 lea rbp,[8+rbp] add rbx,r14 mov r12,QWORD[56+rsi] mov r13,r9 mov r14,rbx bswap r12 ror r13,23 mov rdi,r10 xor r13,r9 ror r14,5 xor rdi,r11 mov QWORD[56+rsp],r12 xor r14,rbx and rdi,r9 ror r13,4 add r12,rax xor rdi,r11 ror r14,6 xor r13,r9 add r12,rdi mov rdi,rbx add r12,QWORD[rbp] xor r14,rbx xor rdi,rcx ror r13,14 mov rax,rcx and r15,rdi ror r14,28 add r12,r13 xor rax,r15 add r8,r12 add rax,r12 lea rbp,[24+rbp] add rax,r14 mov r12,QWORD[64+rsi] mov r13,r8 mov r14,rax bswap r12 ror r13,23 mov r15,r9 xor r13,r8 ror r14,5 xor r15,r10 mov QWORD[64+rsp],r12 xor r14,rax and r15,r8 ror r13,4 add r12,r11 xor r15,r10 ror r14,6 xor r13,r8 add r12,r15 mov r15,rax add r12,QWORD[rbp] xor r14,rax xor r15,rbx ror r13,14 mov r11,rbx and rdi,r15 ror r14,28 add r12,r13 xor r11,rdi add rdx,r12 add r11,r12 lea rbp,[8+rbp] add r11,r14 mov r12,QWORD[72+rsi] mov r13,rdx mov r14,r11 bswap r12 ror r13,23 mov rdi,r8 xor r13,rdx ror r14,5 xor rdi,r9 mov QWORD[72+rsp],r12 xor r14,r11 and rdi,rdx ror r13,4 add r12,r10 xor rdi,r9 ror r14,6 xor r13,rdx add r12,rdi mov rdi,r11 add r12,QWORD[rbp] xor r14,r11 xor rdi,rax ror r13,14 mov r10,rax and r15,rdi ror r14,28 add r12,r13 xor r10,r15 add rcx,r12 add r10,r12 lea rbp,[24+rbp] add r10,r14 mov r12,QWORD[80+rsi] mov r13,rcx mov r14,r10 bswap r12 ror r13,23 mov r15,rdx xor r13,rcx ror r14,5 xor r15,r8 mov QWORD[80+rsp],r12 xor r14,r10 and r15,rcx ror r13,4 add r12,r9 xor r15,r8 ror r14,6 xor r13,rcx add r12,r15 mov r15,r10 add r12,QWORD[rbp] xor r14,r10 xor r15,r11 ror r13,14 mov r9,r11 and rdi,r15 ror r14,28 add r12,r13 xor r9,rdi add rbx,r12 add r9,r12 lea rbp,[8+rbp] add r9,r14 mov r12,QWORD[88+rsi] mov r13,rbx mov r14,r9 bswap r12 ror r13,23 mov rdi,rcx xor r13,rbx ror r14,5 xor rdi,rdx mov QWORD[88+rsp],r12 xor r14,r9 and rdi,rbx ror r13,4 add r12,r8 xor rdi,rdx ror r14,6 xor r13,rbx add r12,rdi mov rdi,r9 add r12,QWORD[rbp] xor r14,r9 xor rdi,r10 ror r13,14 mov r8,r10 and r15,rdi ror r14,28 add r12,r13 xor r8,r15 add rax,r12 add r8,r12 lea rbp,[24+rbp] add r8,r14 mov r12,QWORD[96+rsi] mov r13,rax mov r14,r8 bswap r12 ror r13,23 mov r15,rbx xor r13,rax ror r14,5 xor r15,rcx mov QWORD[96+rsp],r12 xor r14,r8 and r15,rax ror r13,4 add r12,rdx xor r15,rcx ror r14,6 xor r13,rax add r12,r15 mov r15,r8 add r12,QWORD[rbp] xor r14,r8 xor r15,r9 ror r13,14 mov rdx,r9 and rdi,r15 ror r14,28 add r12,r13 xor rdx,rdi add r11,r12 add rdx,r12 lea rbp,[8+rbp] add rdx,r14 mov r12,QWORD[104+rsi] mov r13,r11 mov r14,rdx bswap r12 ror r13,23 mov rdi,rax xor r13,r11 ror r14,5 xor rdi,rbx mov QWORD[104+rsp],r12 xor r14,rdx and rdi,r11 ror r13,4 add r12,rcx xor rdi,rbx ror r14,6 xor r13,r11 add r12,rdi mov rdi,rdx add r12,QWORD[rbp] xor r14,rdx xor rdi,r8 ror r13,14 mov rcx,r8 and r15,rdi ror r14,28 add r12,r13 xor rcx,r15 add r10,r12 add rcx,r12 lea rbp,[24+rbp] add rcx,r14 mov r12,QWORD[112+rsi] mov r13,r10 mov r14,rcx bswap r12 ror r13,23 mov r15,r11 xor r13,r10 ror r14,5 xor r15,rax mov QWORD[112+rsp],r12 xor r14,rcx and r15,r10 ror r13,4 add r12,rbx xor r15,rax ror r14,6 xor r13,r10 add r12,r15 mov r15,rcx add r12,QWORD[rbp] xor r14,rcx xor r15,rdx ror r13,14 mov rbx,rdx and rdi,r15 ror r14,28 add r12,r13 xor rbx,rdi add r9,r12 add rbx,r12 lea rbp,[8+rbp] add rbx,r14 mov r12,QWORD[120+rsi] mov r13,r9 mov r14,rbx bswap r12 ror r13,23 mov rdi,r10 xor r13,r9 ror r14,5 xor rdi,r11 mov QWORD[120+rsp],r12 xor r14,rbx and rdi,r9 ror r13,4 add r12,rax xor rdi,r11 ror r14,6 xor r13,r9 add r12,rdi mov rdi,rbx add r12,QWORD[rbp] xor r14,rbx xor rdi,rcx ror r13,14 mov rax,rcx and r15,rdi ror r14,28 add r12,r13 xor rax,r15 add r8,r12 add rax,r12 lea rbp,[24+rbp] jmp NEAR $L$rounds_16_xx ALIGN 16 $L$rounds_16_xx: mov r13,QWORD[8+rsp] mov r15,QWORD[112+rsp] mov r12,r13 ror r13,7 add rax,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[72+rsp] add r12,QWORD[rsp] mov r13,r8 add r12,r15 mov r14,rax ror r13,23 mov r15,r9 xor r13,r8 ror r14,5 xor r15,r10 mov QWORD[rsp],r12 xor r14,rax and r15,r8 ror r13,4 add r12,r11 xor r15,r10 ror r14,6 xor r13,r8 add r12,r15 mov r15,rax add r12,QWORD[rbp] xor r14,rax xor r15,rbx ror r13,14 mov r11,rbx and rdi,r15 ror r14,28 add r12,r13 xor r11,rdi add rdx,r12 add r11,r12 lea rbp,[8+rbp] mov r13,QWORD[16+rsp] mov rdi,QWORD[120+rsp] mov r12,r13 ror r13,7 add r11,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[80+rsp] add r12,QWORD[8+rsp] mov r13,rdx add r12,rdi mov r14,r11 ror r13,23 mov rdi,r8 xor r13,rdx ror r14,5 xor rdi,r9 mov QWORD[8+rsp],r12 xor r14,r11 and rdi,rdx ror r13,4 add r12,r10 xor rdi,r9 ror r14,6 xor r13,rdx add r12,rdi mov rdi,r11 add r12,QWORD[rbp] xor r14,r11 xor rdi,rax ror r13,14 mov r10,rax and r15,rdi ror r14,28 add r12,r13 xor r10,r15 add rcx,r12 add r10,r12 lea rbp,[24+rbp] mov r13,QWORD[24+rsp] mov r15,QWORD[rsp] mov r12,r13 ror r13,7 add r10,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[88+rsp] add r12,QWORD[16+rsp] mov r13,rcx add r12,r15 mov r14,r10 ror r13,23 mov r15,rdx xor r13,rcx ror r14,5 xor r15,r8 mov QWORD[16+rsp],r12 xor r14,r10 and r15,rcx ror r13,4 add r12,r9 xor r15,r8 ror r14,6 xor r13,rcx add r12,r15 mov r15,r10 add r12,QWORD[rbp] xor r14,r10 xor r15,r11 ror r13,14 mov r9,r11 and rdi,r15 ror r14,28 add r12,r13 xor r9,rdi add rbx,r12 add r9,r12 lea rbp,[8+rbp] mov r13,QWORD[32+rsp] mov rdi,QWORD[8+rsp] mov r12,r13 ror r13,7 add r9,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[96+rsp] add r12,QWORD[24+rsp] mov r13,rbx add r12,rdi mov r14,r9 ror r13,23 mov rdi,rcx xor r13,rbx ror r14,5 xor rdi,rdx mov QWORD[24+rsp],r12 xor r14,r9 and rdi,rbx ror r13,4 add r12,r8 xor rdi,rdx ror r14,6 xor r13,rbx add r12,rdi mov rdi,r9 add r12,QWORD[rbp] xor r14,r9 xor rdi,r10 ror r13,14 mov r8,r10 and r15,rdi ror r14,28 add r12,r13 xor r8,r15 add rax,r12 add r8,r12 lea rbp,[24+rbp] mov r13,QWORD[40+rsp] mov r15,QWORD[16+rsp] mov r12,r13 ror r13,7 add r8,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[104+rsp] add r12,QWORD[32+rsp] mov r13,rax add r12,r15 mov r14,r8 ror r13,23 mov r15,rbx xor r13,rax ror r14,5 xor r15,rcx mov QWORD[32+rsp],r12 xor r14,r8 and r15,rax ror r13,4 add r12,rdx xor r15,rcx ror r14,6 xor r13,rax add r12,r15 mov r15,r8 add r12,QWORD[rbp] xor r14,r8 xor r15,r9 ror r13,14 mov rdx,r9 and rdi,r15 ror r14,28 add r12,r13 xor rdx,rdi add r11,r12 add rdx,r12 lea rbp,[8+rbp] mov r13,QWORD[48+rsp] mov rdi,QWORD[24+rsp] mov r12,r13 ror r13,7 add rdx,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[112+rsp] add r12,QWORD[40+rsp] mov r13,r11 add r12,rdi mov r14,rdx ror r13,23 mov rdi,rax xor r13,r11 ror r14,5 xor rdi,rbx mov QWORD[40+rsp],r12 xor r14,rdx and rdi,r11 ror r13,4 add r12,rcx xor rdi,rbx ror r14,6 xor r13,r11 add r12,rdi mov rdi,rdx add r12,QWORD[rbp] xor r14,rdx xor rdi,r8 ror r13,14 mov rcx,r8 and r15,rdi ror r14,28 add r12,r13 xor rcx,r15 add r10,r12 add rcx,r12 lea rbp,[24+rbp] mov r13,QWORD[56+rsp] mov r15,QWORD[32+rsp] mov r12,r13 ror r13,7 add rcx,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[120+rsp] add r12,QWORD[48+rsp] mov r13,r10 add r12,r15 mov r14,rcx ror r13,23 mov r15,r11 xor r13,r10 ror r14,5 xor r15,rax mov QWORD[48+rsp],r12 xor r14,rcx and r15,r10 ror r13,4 add r12,rbx xor r15,rax ror r14,6 xor r13,r10 add r12,r15 mov r15,rcx add r12,QWORD[rbp] xor r14,rcx xor r15,rdx ror r13,14 mov rbx,rdx and rdi,r15 ror r14,28 add r12,r13 xor rbx,rdi add r9,r12 add rbx,r12 lea rbp,[8+rbp] mov r13,QWORD[64+rsp] mov rdi,QWORD[40+rsp] mov r12,r13 ror r13,7 add rbx,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[rsp] add r12,QWORD[56+rsp] mov r13,r9 add r12,rdi mov r14,rbx ror r13,23 mov rdi,r10 xor r13,r9 ror r14,5 xor rdi,r11 mov QWORD[56+rsp],r12 xor r14,rbx and rdi,r9 ror r13,4 add r12,rax xor rdi,r11 ror r14,6 xor r13,r9 add r12,rdi mov rdi,rbx add r12,QWORD[rbp] xor r14,rbx xor rdi,rcx ror r13,14 mov rax,rcx and r15,rdi ror r14,28 add r12,r13 xor rax,r15 add r8,r12 add rax,r12 lea rbp,[24+rbp] mov r13,QWORD[72+rsp] mov r15,QWORD[48+rsp] mov r12,r13 ror r13,7 add rax,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[8+rsp] add r12,QWORD[64+rsp] mov r13,r8 add r12,r15 mov r14,rax ror r13,23 mov r15,r9 xor r13,r8 ror r14,5 xor r15,r10 mov QWORD[64+rsp],r12 xor r14,rax and r15,r8 ror r13,4 add r12,r11 xor r15,r10 ror r14,6 xor r13,r8 add r12,r15 mov r15,rax add r12,QWORD[rbp] xor r14,rax xor r15,rbx ror r13,14 mov r11,rbx and rdi,r15 ror r14,28 add r12,r13 xor r11,rdi add rdx,r12 add r11,r12 lea rbp,[8+rbp] mov r13,QWORD[80+rsp] mov rdi,QWORD[56+rsp] mov r12,r13 ror r13,7 add r11,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[16+rsp] add r12,QWORD[72+rsp] mov r13,rdx add r12,rdi mov r14,r11 ror r13,23 mov rdi,r8 xor r13,rdx ror r14,5 xor rdi,r9 mov QWORD[72+rsp],r12 xor r14,r11 and rdi,rdx ror r13,4 add r12,r10 xor rdi,r9 ror r14,6 xor r13,rdx add r12,rdi mov rdi,r11 add r12,QWORD[rbp] xor r14,r11 xor rdi,rax ror r13,14 mov r10,rax and r15,rdi ror r14,28 add r12,r13 xor r10,r15 add rcx,r12 add r10,r12 lea rbp,[24+rbp] mov r13,QWORD[88+rsp] mov r15,QWORD[64+rsp] mov r12,r13 ror r13,7 add r10,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[24+rsp] add r12,QWORD[80+rsp] mov r13,rcx add r12,r15 mov r14,r10 ror r13,23 mov r15,rdx xor r13,rcx ror r14,5 xor r15,r8 mov QWORD[80+rsp],r12 xor r14,r10 and r15,rcx ror r13,4 add r12,r9 xor r15,r8 ror r14,6 xor r13,rcx add r12,r15 mov r15,r10 add r12,QWORD[rbp] xor r14,r10 xor r15,r11 ror r13,14 mov r9,r11 and rdi,r15 ror r14,28 add r12,r13 xor r9,rdi add rbx,r12 add r9,r12 lea rbp,[8+rbp] mov r13,QWORD[96+rsp] mov rdi,QWORD[72+rsp] mov r12,r13 ror r13,7 add r9,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[32+rsp] add r12,QWORD[88+rsp] mov r13,rbx add r12,rdi mov r14,r9 ror r13,23 mov rdi,rcx xor r13,rbx ror r14,5 xor rdi,rdx mov QWORD[88+rsp],r12 xor r14,r9 and rdi,rbx ror r13,4 add r12,r8 xor rdi,rdx ror r14,6 xor r13,rbx add r12,rdi mov rdi,r9 add r12,QWORD[rbp] xor r14,r9 xor rdi,r10 ror r13,14 mov r8,r10 and r15,rdi ror r14,28 add r12,r13 xor r8,r15 add rax,r12 add r8,r12 lea rbp,[24+rbp] mov r13,QWORD[104+rsp] mov r15,QWORD[80+rsp] mov r12,r13 ror r13,7 add r8,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[40+rsp] add r12,QWORD[96+rsp] mov r13,rax add r12,r15 mov r14,r8 ror r13,23 mov r15,rbx xor r13,rax ror r14,5 xor r15,rcx mov QWORD[96+rsp],r12 xor r14,r8 and r15,rax ror r13,4 add r12,rdx xor r15,rcx ror r14,6 xor r13,rax add r12,r15 mov r15,r8 add r12,QWORD[rbp] xor r14,r8 xor r15,r9 ror r13,14 mov rdx,r9 and rdi,r15 ror r14,28 add r12,r13 xor rdx,rdi add r11,r12 add rdx,r12 lea rbp,[8+rbp] mov r13,QWORD[112+rsp] mov rdi,QWORD[88+rsp] mov r12,r13 ror r13,7 add rdx,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[48+rsp] add r12,QWORD[104+rsp] mov r13,r11 add r12,rdi mov r14,rdx ror r13,23 mov rdi,rax xor r13,r11 ror r14,5 xor rdi,rbx mov QWORD[104+rsp],r12 xor r14,rdx and rdi,r11 ror r13,4 add r12,rcx xor rdi,rbx ror r14,6 xor r13,r11 add r12,rdi mov rdi,rdx add r12,QWORD[rbp] xor r14,rdx xor rdi,r8 ror r13,14 mov rcx,r8 and r15,rdi ror r14,28 add r12,r13 xor rcx,r15 add r10,r12 add rcx,r12 lea rbp,[24+rbp] mov r13,QWORD[120+rsp] mov r15,QWORD[96+rsp] mov r12,r13 ror r13,7 add rcx,r14 mov r14,r15 ror r15,42 xor r13,r12 shr r12,7 ror r13,1 xor r15,r14 shr r14,6 ror r15,19 xor r12,r13 xor r15,r14 add r12,QWORD[56+rsp] add r12,QWORD[112+rsp] mov r13,r10 add r12,r15 mov r14,rcx ror r13,23 mov r15,r11 xor r13,r10 ror r14,5 xor r15,rax mov QWORD[112+rsp],r12 xor r14,rcx and r15,r10 ror r13,4 add r12,rbx xor r15,rax ror r14,6 xor r13,r10 add r12,r15 mov r15,rcx add r12,QWORD[rbp] xor r14,rcx xor r15,rdx ror r13,14 mov rbx,rdx and rdi,r15 ror r14,28 add r12,r13 xor rbx,rdi add r9,r12 add rbx,r12 lea rbp,[8+rbp] mov r13,QWORD[rsp] mov rdi,QWORD[104+rsp] mov r12,r13 ror r13,7 add rbx,r14 mov r14,rdi ror rdi,42 xor r13,r12 shr r12,7 ror r13,1 xor rdi,r14 shr r14,6 ror rdi,19 xor r12,r13 xor rdi,r14 add r12,QWORD[64+rsp] add r12,QWORD[120+rsp] mov r13,r9 add r12,rdi mov r14,rbx ror r13,23 mov rdi,r10 xor r13,r9 ror r14,5 xor rdi,r11 mov QWORD[120+rsp],r12 xor r14,rbx and rdi,r9 ror r13,4 add r12,rax xor rdi,r11 ror r14,6 xor r13,r9 add r12,rdi mov rdi,rbx add r12,QWORD[rbp] xor r14,rbx xor rdi,rcx ror r13,14 mov rax,rcx and r15,rdi ror r14,28 add r12,r13 xor rax,r15 add r8,r12 add rax,r12 lea rbp,[24+rbp] cmp BYTE[7+rbp],0 jnz NEAR $L$rounds_16_xx mov rdi,QWORD[((128+0))+rsp] add rax,r14 lea rsi,[128+rsi] add rax,QWORD[rdi] add rbx,QWORD[8+rdi] add rcx,QWORD[16+rdi] add rdx,QWORD[24+rdi] add r8,QWORD[32+rdi] add r9,QWORD[40+rdi] add r10,QWORD[48+rdi] add r11,QWORD[56+rdi] cmp rsi,QWORD[((128+16))+rsp] mov QWORD[rdi],rax mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rcx mov QWORD[24+rdi],rdx mov QWORD[32+rdi],r8 mov QWORD[40+rdi],r9 mov QWORD[48+rdi],r10 mov QWORD[56+rdi],r11 jb NEAR $L$loop mov rsi,QWORD[152+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_sha512_block_data_order: ALIGN 64 K512: DQ 0x428a2f98d728ae22,0x7137449123ef65cd DQ 0x428a2f98d728ae22,0x7137449123ef65cd DQ 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc DQ 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc DQ 0x3956c25bf348b538,0x59f111f1b605d019 DQ 0x3956c25bf348b538,0x59f111f1b605d019 DQ 0x923f82a4af194f9b,0xab1c5ed5da6d8118 DQ 0x923f82a4af194f9b,0xab1c5ed5da6d8118 DQ 0xd807aa98a3030242,0x12835b0145706fbe DQ 0xd807aa98a3030242,0x12835b0145706fbe DQ 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 DQ 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 DQ 0x72be5d74f27b896f,0x80deb1fe3b1696b1 DQ 0x72be5d74f27b896f,0x80deb1fe3b1696b1 DQ 0x9bdc06a725c71235,0xc19bf174cf692694 DQ 0x9bdc06a725c71235,0xc19bf174cf692694 DQ 0xe49b69c19ef14ad2,0xefbe4786384f25e3 DQ 0xe49b69c19ef14ad2,0xefbe4786384f25e3 DQ 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 DQ 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 DQ 0x2de92c6f592b0275,0x4a7484aa6ea6e483 DQ 0x2de92c6f592b0275,0x4a7484aa6ea6e483 DQ 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 DQ 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 DQ 0x983e5152ee66dfab,0xa831c66d2db43210 DQ 0x983e5152ee66dfab,0xa831c66d2db43210 DQ 0xb00327c898fb213f,0xbf597fc7beef0ee4 DQ 0xb00327c898fb213f,0xbf597fc7beef0ee4 DQ 0xc6e00bf33da88fc2,0xd5a79147930aa725 DQ 0xc6e00bf33da88fc2,0xd5a79147930aa725 DQ 0x06ca6351e003826f,0x142929670a0e6e70 DQ 0x06ca6351e003826f,0x142929670a0e6e70 DQ 0x27b70a8546d22ffc,0x2e1b21385c26c926 DQ 0x27b70a8546d22ffc,0x2e1b21385c26c926 DQ 0x4d2c6dfc5ac42aed,0x53380d139d95b3df DQ 0x4d2c6dfc5ac42aed,0x53380d139d95b3df DQ 0x650a73548baf63de,0x766a0abb3c77b2a8 DQ 0x650a73548baf63de,0x766a0abb3c77b2a8 DQ 0x81c2c92e47edaee6,0x92722c851482353b DQ 0x81c2c92e47edaee6,0x92722c851482353b DQ 0xa2bfe8a14cf10364,0xa81a664bbc423001 DQ 0xa2bfe8a14cf10364,0xa81a664bbc423001 DQ 0xc24b8b70d0f89791,0xc76c51a30654be30 DQ 0xc24b8b70d0f89791,0xc76c51a30654be30 DQ 0xd192e819d6ef5218,0xd69906245565a910 DQ 0xd192e819d6ef5218,0xd69906245565a910 DQ 0xf40e35855771202a,0x106aa07032bbd1b8 DQ 0xf40e35855771202a,0x106aa07032bbd1b8 DQ 0x19a4c116b8d2d0c8,0x1e376c085141ab53 DQ 0x19a4c116b8d2d0c8,0x1e376c085141ab53 DQ 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 DQ 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 DQ 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb DQ 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb DQ 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 DQ 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 DQ 0x748f82ee5defb2fc,0x78a5636f43172f60 DQ 0x748f82ee5defb2fc,0x78a5636f43172f60 DQ 0x84c87814a1f0ab72,0x8cc702081a6439ec DQ 0x84c87814a1f0ab72,0x8cc702081a6439ec DQ 0x90befffa23631e28,0xa4506cebde82bde9 DQ 0x90befffa23631e28,0xa4506cebde82bde9 DQ 0xbef9a3f7b2c67915,0xc67178f2e372532b DQ 0xbef9a3f7b2c67915,0xc67178f2e372532b DQ 0xca273eceea26619c,0xd186b8c721c0c207 DQ 0xca273eceea26619c,0xd186b8c721c0c207 DQ 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 DQ 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 DQ 0x06f067aa72176fba,0x0a637dc5a2c898a6 DQ 0x06f067aa72176fba,0x0a637dc5a2c898a6 DQ 0x113f9804bef90dae,0x1b710b35131c471b DQ 0x113f9804bef90dae,0x1b710b35131c471b DQ 0x28db77f523047d84,0x32caab7b40c72493 DQ 0x28db77f523047d84,0x32caab7b40c72493 DQ 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c DQ 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c DQ 0x4cc5d4becb3e42b6,0x597f299cfc657e2a DQ 0x4cc5d4becb3e42b6,0x597f299cfc657e2a DQ 0x5fcb6fab3ad6faec,0x6c44198c4a475817 DQ 0x5fcb6fab3ad6faec,0x6c44198c4a475817 DQ 0x0001020304050607,0x08090a0b0c0d0e0f DQ 0x0001020304050607,0x08090a0b0c0d0e0f DB 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97 DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 DB 111,114,103,62,0 ALIGN 64 GFp_sha512_block_data_order_avx: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_sha512_block_data_order_avx: mov rdi,rcx mov rsi,rdx mov rdx,r8 $L$avx_shortcut: mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 shl rdx,4 sub rsp,256 lea rdx,[rdx*8+rsi] and rsp,-64 mov QWORD[((128+0))+rsp],rdi mov QWORD[((128+8))+rsp],rsi mov QWORD[((128+16))+rsp],rdx mov QWORD[152+rsp],rax movaps XMMWORD[(128+32)+rsp],xmm6 movaps XMMWORD[(128+48)+rsp],xmm7 movaps XMMWORD[(128+64)+rsp],xmm8 movaps XMMWORD[(128+80)+rsp],xmm9 movaps XMMWORD[(128+96)+rsp],xmm10 movaps XMMWORD[(128+112)+rsp],xmm11 $L$prologue_avx: vzeroupper mov rax,QWORD[rdi] mov rbx,QWORD[8+rdi] mov rcx,QWORD[16+rdi] mov rdx,QWORD[24+rdi] mov r8,QWORD[32+rdi] mov r9,QWORD[40+rdi] mov r10,QWORD[48+rdi] mov r11,QWORD[56+rdi] jmp NEAR $L$loop_avx ALIGN 16 $L$loop_avx: vmovdqa xmm11,XMMWORD[((K512+1280))] vmovdqu xmm0,XMMWORD[rsi] lea rbp,[((K512+128))] vmovdqu xmm1,XMMWORD[16+rsi] vmovdqu xmm2,XMMWORD[32+rsi] vpshufb xmm0,xmm0,xmm11 vmovdqu xmm3,XMMWORD[48+rsi] vpshufb xmm1,xmm1,xmm11 vmovdqu xmm4,XMMWORD[64+rsi] vpshufb xmm2,xmm2,xmm11 vmovdqu xmm5,XMMWORD[80+rsi] vpshufb xmm3,xmm3,xmm11 vmovdqu xmm6,XMMWORD[96+rsi] vpshufb xmm4,xmm4,xmm11 vmovdqu xmm7,XMMWORD[112+rsi] vpshufb xmm5,xmm5,xmm11 vpaddq xmm8,xmm0,XMMWORD[((-128))+rbp] vpshufb xmm6,xmm6,xmm11 vpaddq xmm9,xmm1,XMMWORD[((-96))+rbp] vpshufb xmm7,xmm7,xmm11 vpaddq xmm10,xmm2,XMMWORD[((-64))+rbp] vpaddq xmm11,xmm3,XMMWORD[((-32))+rbp] vmovdqa XMMWORD[rsp],xmm8 vpaddq xmm8,xmm4,XMMWORD[rbp] vmovdqa XMMWORD[16+rsp],xmm9 vpaddq xmm9,xmm5,XMMWORD[32+rbp] vmovdqa XMMWORD[32+rsp],xmm10 vpaddq xmm10,xmm6,XMMWORD[64+rbp] vmovdqa XMMWORD[48+rsp],xmm11 vpaddq xmm11,xmm7,XMMWORD[96+rbp] vmovdqa XMMWORD[64+rsp],xmm8 mov r14,rax vmovdqa XMMWORD[80+rsp],xmm9 mov rdi,rbx vmovdqa XMMWORD[96+rsp],xmm10 xor rdi,rcx vmovdqa XMMWORD[112+rsp],xmm11 mov r13,r8 jmp NEAR $L$avx_00_47 ALIGN 16 $L$avx_00_47: add rbp,256 vpalignr xmm8,xmm1,xmm0,8 shrd r13,r13,23 mov rax,r14 vpalignr xmm11,xmm5,xmm4,8 mov r12,r9 shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,r8 xor r12,r10 vpaddq xmm0,xmm0,xmm11 shrd r13,r13,4 xor r14,rax vpsrlq xmm11,xmm8,7 and r12,r8 xor r13,r8 vpsllq xmm9,xmm8,56 add r11,QWORD[rsp] mov r15,rax vpxor xmm8,xmm11,xmm10 xor r12,r10 shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,rbx add r11,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,rax add r11,r13 vpxor xmm8,xmm8,xmm10 xor rdi,rbx shrd r14,r14,28 vpsrlq xmm11,xmm7,6 add rdx,r11 add r11,rdi vpxor xmm8,xmm8,xmm9 mov r13,rdx add r14,r11 vpsllq xmm10,xmm7,3 shrd r13,r13,23 mov r11,r14 vpaddq xmm0,xmm0,xmm8 mov r12,r8 shrd r14,r14,5 vpsrlq xmm9,xmm7,19 xor r13,rdx xor r12,r9 vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,r11 vpsllq xmm10,xmm10,42 and r12,rdx xor r13,rdx vpxor xmm11,xmm11,xmm9 add r10,QWORD[8+rsp] mov rdi,r11 vpsrlq xmm9,xmm9,42 xor r12,r9 shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,rax add r10,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm0,xmm0,xmm11 xor r14,r11 add r10,r13 vpaddq xmm10,xmm0,XMMWORD[((-128))+rbp] xor r15,rax shrd r14,r14,28 add rcx,r10 add r10,r15 mov r13,rcx add r14,r10 vmovdqa XMMWORD[rsp],xmm10 vpalignr xmm8,xmm2,xmm1,8 shrd r13,r13,23 mov r10,r14 vpalignr xmm11,xmm6,xmm5,8 mov r12,rdx shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,rcx xor r12,r8 vpaddq xmm1,xmm1,xmm11 shrd r13,r13,4 xor r14,r10 vpsrlq xmm11,xmm8,7 and r12,rcx xor r13,rcx vpsllq xmm9,xmm8,56 add r9,QWORD[16+rsp] mov r15,r10 vpxor xmm8,xmm11,xmm10 xor r12,r8 shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,r11 add r9,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,r10 add r9,r13 vpxor xmm8,xmm8,xmm10 xor rdi,r11 shrd r14,r14,28 vpsrlq xmm11,xmm0,6 add rbx,r9 add r9,rdi vpxor xmm8,xmm8,xmm9 mov r13,rbx add r14,r9 vpsllq xmm10,xmm0,3 shrd r13,r13,23 mov r9,r14 vpaddq xmm1,xmm1,xmm8 mov r12,rcx shrd r14,r14,5 vpsrlq xmm9,xmm0,19 xor r13,rbx xor r12,rdx vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,r9 vpsllq xmm10,xmm10,42 and r12,rbx xor r13,rbx vpxor xmm11,xmm11,xmm9 add r8,QWORD[24+rsp] mov rdi,r9 vpsrlq xmm9,xmm9,42 xor r12,rdx shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,r10 add r8,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm1,xmm1,xmm11 xor r14,r9 add r8,r13 vpaddq xmm10,xmm1,XMMWORD[((-96))+rbp] xor r15,r10 shrd r14,r14,28 add rax,r8 add r8,r15 mov r13,rax add r14,r8 vmovdqa XMMWORD[16+rsp],xmm10 vpalignr xmm8,xmm3,xmm2,8 shrd r13,r13,23 mov r8,r14 vpalignr xmm11,xmm7,xmm6,8 mov r12,rbx shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,rax xor r12,rcx vpaddq xmm2,xmm2,xmm11 shrd r13,r13,4 xor r14,r8 vpsrlq xmm11,xmm8,7 and r12,rax xor r13,rax vpsllq xmm9,xmm8,56 add rdx,QWORD[32+rsp] mov r15,r8 vpxor xmm8,xmm11,xmm10 xor r12,rcx shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,r9 add rdx,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,r8 add rdx,r13 vpxor xmm8,xmm8,xmm10 xor rdi,r9 shrd r14,r14,28 vpsrlq xmm11,xmm1,6 add r11,rdx add rdx,rdi vpxor xmm8,xmm8,xmm9 mov r13,r11 add r14,rdx vpsllq xmm10,xmm1,3 shrd r13,r13,23 mov rdx,r14 vpaddq xmm2,xmm2,xmm8 mov r12,rax shrd r14,r14,5 vpsrlq xmm9,xmm1,19 xor r13,r11 xor r12,rbx vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,rdx vpsllq xmm10,xmm10,42 and r12,r11 xor r13,r11 vpxor xmm11,xmm11,xmm9 add rcx,QWORD[40+rsp] mov rdi,rdx vpsrlq xmm9,xmm9,42 xor r12,rbx shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,r8 add rcx,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm2,xmm2,xmm11 xor r14,rdx add rcx,r13 vpaddq xmm10,xmm2,XMMWORD[((-64))+rbp] xor r15,r8 shrd r14,r14,28 add r10,rcx add rcx,r15 mov r13,r10 add r14,rcx vmovdqa XMMWORD[32+rsp],xmm10 vpalignr xmm8,xmm4,xmm3,8 shrd r13,r13,23 mov rcx,r14 vpalignr xmm11,xmm0,xmm7,8 mov r12,r11 shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,r10 xor r12,rax vpaddq xmm3,xmm3,xmm11 shrd r13,r13,4 xor r14,rcx vpsrlq xmm11,xmm8,7 and r12,r10 xor r13,r10 vpsllq xmm9,xmm8,56 add rbx,QWORD[48+rsp] mov r15,rcx vpxor xmm8,xmm11,xmm10 xor r12,rax shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,rdx add rbx,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,rcx add rbx,r13 vpxor xmm8,xmm8,xmm10 xor rdi,rdx shrd r14,r14,28 vpsrlq xmm11,xmm2,6 add r9,rbx add rbx,rdi vpxor xmm8,xmm8,xmm9 mov r13,r9 add r14,rbx vpsllq xmm10,xmm2,3 shrd r13,r13,23 mov rbx,r14 vpaddq xmm3,xmm3,xmm8 mov r12,r10 shrd r14,r14,5 vpsrlq xmm9,xmm2,19 xor r13,r9 xor r12,r11 vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,rbx vpsllq xmm10,xmm10,42 and r12,r9 xor r13,r9 vpxor xmm11,xmm11,xmm9 add rax,QWORD[56+rsp] mov rdi,rbx vpsrlq xmm9,xmm9,42 xor r12,r11 shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,rcx add rax,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm3,xmm3,xmm11 xor r14,rbx add rax,r13 vpaddq xmm10,xmm3,XMMWORD[((-32))+rbp] xor r15,rcx shrd r14,r14,28 add r8,rax add rax,r15 mov r13,r8 add r14,rax vmovdqa XMMWORD[48+rsp],xmm10 vpalignr xmm8,xmm5,xmm4,8 shrd r13,r13,23 mov rax,r14 vpalignr xmm11,xmm1,xmm0,8 mov r12,r9 shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,r8 xor r12,r10 vpaddq xmm4,xmm4,xmm11 shrd r13,r13,4 xor r14,rax vpsrlq xmm11,xmm8,7 and r12,r8 xor r13,r8 vpsllq xmm9,xmm8,56 add r11,QWORD[64+rsp] mov r15,rax vpxor xmm8,xmm11,xmm10 xor r12,r10 shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,rbx add r11,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,rax add r11,r13 vpxor xmm8,xmm8,xmm10 xor rdi,rbx shrd r14,r14,28 vpsrlq xmm11,xmm3,6 add rdx,r11 add r11,rdi vpxor xmm8,xmm8,xmm9 mov r13,rdx add r14,r11 vpsllq xmm10,xmm3,3 shrd r13,r13,23 mov r11,r14 vpaddq xmm4,xmm4,xmm8 mov r12,r8 shrd r14,r14,5 vpsrlq xmm9,xmm3,19 xor r13,rdx xor r12,r9 vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,r11 vpsllq xmm10,xmm10,42 and r12,rdx xor r13,rdx vpxor xmm11,xmm11,xmm9 add r10,QWORD[72+rsp] mov rdi,r11 vpsrlq xmm9,xmm9,42 xor r12,r9 shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,rax add r10,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm4,xmm4,xmm11 xor r14,r11 add r10,r13 vpaddq xmm10,xmm4,XMMWORD[rbp] xor r15,rax shrd r14,r14,28 add rcx,r10 add r10,r15 mov r13,rcx add r14,r10 vmovdqa XMMWORD[64+rsp],xmm10 vpalignr xmm8,xmm6,xmm5,8 shrd r13,r13,23 mov r10,r14 vpalignr xmm11,xmm2,xmm1,8 mov r12,rdx shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,rcx xor r12,r8 vpaddq xmm5,xmm5,xmm11 shrd r13,r13,4 xor r14,r10 vpsrlq xmm11,xmm8,7 and r12,rcx xor r13,rcx vpsllq xmm9,xmm8,56 add r9,QWORD[80+rsp] mov r15,r10 vpxor xmm8,xmm11,xmm10 xor r12,r8 shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,r11 add r9,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,r10 add r9,r13 vpxor xmm8,xmm8,xmm10 xor rdi,r11 shrd r14,r14,28 vpsrlq xmm11,xmm4,6 add rbx,r9 add r9,rdi vpxor xmm8,xmm8,xmm9 mov r13,rbx add r14,r9 vpsllq xmm10,xmm4,3 shrd r13,r13,23 mov r9,r14 vpaddq xmm5,xmm5,xmm8 mov r12,rcx shrd r14,r14,5 vpsrlq xmm9,xmm4,19 xor r13,rbx xor r12,rdx vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,r9 vpsllq xmm10,xmm10,42 and r12,rbx xor r13,rbx vpxor xmm11,xmm11,xmm9 add r8,QWORD[88+rsp] mov rdi,r9 vpsrlq xmm9,xmm9,42 xor r12,rdx shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,r10 add r8,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm5,xmm5,xmm11 xor r14,r9 add r8,r13 vpaddq xmm10,xmm5,XMMWORD[32+rbp] xor r15,r10 shrd r14,r14,28 add rax,r8 add r8,r15 mov r13,rax add r14,r8 vmovdqa XMMWORD[80+rsp],xmm10 vpalignr xmm8,xmm7,xmm6,8 shrd r13,r13,23 mov r8,r14 vpalignr xmm11,xmm3,xmm2,8 mov r12,rbx shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,rax xor r12,rcx vpaddq xmm6,xmm6,xmm11 shrd r13,r13,4 xor r14,r8 vpsrlq xmm11,xmm8,7 and r12,rax xor r13,rax vpsllq xmm9,xmm8,56 add rdx,QWORD[96+rsp] mov r15,r8 vpxor xmm8,xmm11,xmm10 xor r12,rcx shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,r9 add rdx,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,r8 add rdx,r13 vpxor xmm8,xmm8,xmm10 xor rdi,r9 shrd r14,r14,28 vpsrlq xmm11,xmm5,6 add r11,rdx add rdx,rdi vpxor xmm8,xmm8,xmm9 mov r13,r11 add r14,rdx vpsllq xmm10,xmm5,3 shrd r13,r13,23 mov rdx,r14 vpaddq xmm6,xmm6,xmm8 mov r12,rax shrd r14,r14,5 vpsrlq xmm9,xmm5,19 xor r13,r11 xor r12,rbx vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,rdx vpsllq xmm10,xmm10,42 and r12,r11 xor r13,r11 vpxor xmm11,xmm11,xmm9 add rcx,QWORD[104+rsp] mov rdi,rdx vpsrlq xmm9,xmm9,42 xor r12,rbx shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,r8 add rcx,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm6,xmm6,xmm11 xor r14,rdx add rcx,r13 vpaddq xmm10,xmm6,XMMWORD[64+rbp] xor r15,r8 shrd r14,r14,28 add r10,rcx add rcx,r15 mov r13,r10 add r14,rcx vmovdqa XMMWORD[96+rsp],xmm10 vpalignr xmm8,xmm0,xmm7,8 shrd r13,r13,23 mov rcx,r14 vpalignr xmm11,xmm4,xmm3,8 mov r12,r11 shrd r14,r14,5 vpsrlq xmm10,xmm8,1 xor r13,r10 xor r12,rax vpaddq xmm7,xmm7,xmm11 shrd r13,r13,4 xor r14,rcx vpsrlq xmm11,xmm8,7 and r12,r10 xor r13,r10 vpsllq xmm9,xmm8,56 add rbx,QWORD[112+rsp] mov r15,rcx vpxor xmm8,xmm11,xmm10 xor r12,rax shrd r14,r14,6 vpsrlq xmm10,xmm10,7 xor r15,rdx add rbx,r12 vpxor xmm8,xmm8,xmm9 shrd r13,r13,14 and rdi,r15 vpsllq xmm9,xmm9,7 xor r14,rcx add rbx,r13 vpxor xmm8,xmm8,xmm10 xor rdi,rdx shrd r14,r14,28 vpsrlq xmm11,xmm6,6 add r9,rbx add rbx,rdi vpxor xmm8,xmm8,xmm9 mov r13,r9 add r14,rbx vpsllq xmm10,xmm6,3 shrd r13,r13,23 mov rbx,r14 vpaddq xmm7,xmm7,xmm8 mov r12,r10 shrd r14,r14,5 vpsrlq xmm9,xmm6,19 xor r13,r9 xor r12,r11 vpxor xmm11,xmm11,xmm10 shrd r13,r13,4 xor r14,rbx vpsllq xmm10,xmm10,42 and r12,r9 xor r13,r9 vpxor xmm11,xmm11,xmm9 add rax,QWORD[120+rsp] mov rdi,rbx vpsrlq xmm9,xmm9,42 xor r12,r11 shrd r14,r14,6 vpxor xmm11,xmm11,xmm10 xor rdi,rcx add rax,r12 vpxor xmm11,xmm11,xmm9 shrd r13,r13,14 and r15,rdi vpaddq xmm7,xmm7,xmm11 xor r14,rbx add rax,r13 vpaddq xmm10,xmm7,XMMWORD[96+rbp] xor r15,rcx shrd r14,r14,28 add r8,rax add rax,r15 mov r13,r8 add r14,rax vmovdqa XMMWORD[112+rsp],xmm10 cmp BYTE[135+rbp],0 jne NEAR $L$avx_00_47 shrd r13,r13,23 mov rax,r14 mov r12,r9 shrd r14,r14,5 xor r13,r8 xor r12,r10 shrd r13,r13,4 xor r14,rax and r12,r8 xor r13,r8 add r11,QWORD[rsp] mov r15,rax xor r12,r10 shrd r14,r14,6 xor r15,rbx add r11,r12 shrd r13,r13,14 and rdi,r15 xor r14,rax add r11,r13 xor rdi,rbx shrd r14,r14,28 add rdx,r11 add r11,rdi mov r13,rdx add r14,r11 shrd r13,r13,23 mov r11,r14 mov r12,r8 shrd r14,r14,5 xor r13,rdx xor r12,r9 shrd r13,r13,4 xor r14,r11 and r12,rdx xor r13,rdx add r10,QWORD[8+rsp] mov rdi,r11 xor r12,r9 shrd r14,r14,6 xor rdi,rax add r10,r12 shrd r13,r13,14 and r15,rdi xor r14,r11 add r10,r13 xor r15,rax shrd r14,r14,28 add rcx,r10 add r10,r15 mov r13,rcx add r14,r10 shrd r13,r13,23 mov r10,r14 mov r12,rdx shrd r14,r14,5 xor r13,rcx xor r12,r8 shrd r13,r13,4 xor r14,r10 and r12,rcx xor r13,rcx add r9,QWORD[16+rsp] mov r15,r10 xor r12,r8 shrd r14,r14,6 xor r15,r11 add r9,r12 shrd r13,r13,14 and rdi,r15 xor r14,r10 add r9,r13 xor rdi,r11 shrd r14,r14,28 add rbx,r9 add r9,rdi mov r13,rbx add r14,r9 shrd r13,r13,23 mov r9,r14 mov r12,rcx shrd r14,r14,5 xor r13,rbx xor r12,rdx shrd r13,r13,4 xor r14,r9 and r12,rbx xor r13,rbx add r8,QWORD[24+rsp] mov rdi,r9 xor r12,rdx shrd r14,r14,6 xor rdi,r10 add r8,r12 shrd r13,r13,14 and r15,rdi xor r14,r9 add r8,r13 xor r15,r10 shrd r14,r14,28 add rax,r8 add r8,r15 mov r13,rax add r14,r8 shrd r13,r13,23 mov r8,r14 mov r12,rbx shrd r14,r14,5 xor r13,rax xor r12,rcx shrd r13,r13,4 xor r14,r8 and r12,rax xor r13,rax add rdx,QWORD[32+rsp] mov r15,r8 xor r12,rcx shrd r14,r14,6 xor r15,r9 add rdx,r12 shrd r13,r13,14 and rdi,r15 xor r14,r8 add rdx,r13 xor rdi,r9 shrd r14,r14,28 add r11,rdx add rdx,rdi mov r13,r11 add r14,rdx shrd r13,r13,23 mov rdx,r14 mov r12,rax shrd r14,r14,5 xor r13,r11 xor r12,rbx shrd r13,r13,4 xor r14,rdx and r12,r11 xor r13,r11 add rcx,QWORD[40+rsp] mov rdi,rdx xor r12,rbx shrd r14,r14,6 xor rdi,r8 add rcx,r12 shrd r13,r13,14 and r15,rdi xor r14,rdx add rcx,r13 xor r15,r8 shrd r14,r14,28 add r10,rcx add rcx,r15 mov r13,r10 add r14,rcx shrd r13,r13,23 mov rcx,r14 mov r12,r11 shrd r14,r14,5 xor r13,r10 xor r12,rax shrd r13,r13,4 xor r14,rcx and r12,r10 xor r13,r10 add rbx,QWORD[48+rsp] mov r15,rcx xor r12,rax shrd r14,r14,6 xor r15,rdx add rbx,r12 shrd r13,r13,14 and rdi,r15 xor r14,rcx add rbx,r13 xor rdi,rdx shrd r14,r14,28 add r9,rbx add rbx,rdi mov r13,r9 add r14,rbx shrd r13,r13,23 mov rbx,r14 mov r12,r10 shrd r14,r14,5 xor r13,r9 xor r12,r11 shrd r13,r13,4 xor r14,rbx and r12,r9 xor r13,r9 add rax,QWORD[56+rsp] mov rdi,rbx xor r12,r11 shrd r14,r14,6 xor rdi,rcx add rax,r12 shrd r13,r13,14 and r15,rdi xor r14,rbx add rax,r13 xor r15,rcx shrd r14,r14,28 add r8,rax add rax,r15 mov r13,r8 add r14,rax shrd r13,r13,23 mov rax,r14 mov r12,r9 shrd r14,r14,5 xor r13,r8 xor r12,r10 shrd r13,r13,4 xor r14,rax and r12,r8 xor r13,r8 add r11,QWORD[64+rsp] mov r15,rax xor r12,r10 shrd r14,r14,6 xor r15,rbx add r11,r12 shrd r13,r13,14 and rdi,r15 xor r14,rax add r11,r13 xor rdi,rbx shrd r14,r14,28 add rdx,r11 add r11,rdi mov r13,rdx add r14,r11 shrd r13,r13,23 mov r11,r14 mov r12,r8 shrd r14,r14,5 xor r13,rdx xor r12,r9 shrd r13,r13,4 xor r14,r11 and r12,rdx xor r13,rdx add r10,QWORD[72+rsp] mov rdi,r11 xor r12,r9 shrd r14,r14,6 xor rdi,rax add r10,r12 shrd r13,r13,14 and r15,rdi xor r14,r11 add r10,r13 xor r15,rax shrd r14,r14,28 add rcx,r10 add r10,r15 mov r13,rcx add r14,r10 shrd r13,r13,23 mov r10,r14 mov r12,rdx shrd r14,r14,5 xor r13,rcx xor r12,r8 shrd r13,r13,4 xor r14,r10 and r12,rcx xor r13,rcx add r9,QWORD[80+rsp] mov r15,r10 xor r12,r8 shrd r14,r14,6 xor r15,r11 add r9,r12 shrd r13,r13,14 and rdi,r15 xor r14,r10 add r9,r13 xor rdi,r11 shrd r14,r14,28 add rbx,r9 add r9,rdi mov r13,rbx add r14,r9 shrd r13,r13,23 mov r9,r14 mov r12,rcx shrd r14,r14,5 xor r13,rbx xor r12,rdx shrd r13,r13,4 xor r14,r9 and r12,rbx xor r13,rbx add r8,QWORD[88+rsp] mov rdi,r9 xor r12,rdx shrd r14,r14,6 xor rdi,r10 add r8,r12 shrd r13,r13,14 and r15,rdi xor r14,r9 add r8,r13 xor r15,r10 shrd r14,r14,28 add rax,r8 add r8,r15 mov r13,rax add r14,r8 shrd r13,r13,23 mov r8,r14 mov r12,rbx shrd r14,r14,5 xor r13,rax xor r12,rcx shrd r13,r13,4 xor r14,r8 and r12,rax xor r13,rax add rdx,QWORD[96+rsp] mov r15,r8 xor r12,rcx shrd r14,r14,6 xor r15,r9 add rdx,r12 shrd r13,r13,14 and rdi,r15 xor r14,r8 add rdx,r13 xor rdi,r9 shrd r14,r14,28 add r11,rdx add rdx,rdi mov r13,r11 add r14,rdx shrd r13,r13,23 mov rdx,r14 mov r12,rax shrd r14,r14,5 xor r13,r11 xor r12,rbx shrd r13,r13,4 xor r14,rdx and r12,r11 xor r13,r11 add rcx,QWORD[104+rsp] mov rdi,rdx xor r12,rbx shrd r14,r14,6 xor rdi,r8 add rcx,r12 shrd r13,r13,14 and r15,rdi xor r14,rdx add rcx,r13 xor r15,r8 shrd r14,r14,28 add r10,rcx add rcx,r15 mov r13,r10 add r14,rcx shrd r13,r13,23 mov rcx,r14 mov r12,r11 shrd r14,r14,5 xor r13,r10 xor r12,rax shrd r13,r13,4 xor r14,rcx and r12,r10 xor r13,r10 add rbx,QWORD[112+rsp] mov r15,rcx xor r12,rax shrd r14,r14,6 xor r15,rdx add rbx,r12 shrd r13,r13,14 and rdi,r15 xor r14,rcx add rbx,r13 xor rdi,rdx shrd r14,r14,28 add r9,rbx add rbx,rdi mov r13,r9 add r14,rbx shrd r13,r13,23 mov rbx,r14 mov r12,r10 shrd r14,r14,5 xor r13,r9 xor r12,r11 shrd r13,r13,4 xor r14,rbx and r12,r9 xor r13,r9 add rax,QWORD[120+rsp] mov rdi,rbx xor r12,r11 shrd r14,r14,6 xor rdi,rcx add rax,r12 shrd r13,r13,14 and r15,rdi xor r14,rbx add rax,r13 xor r15,rcx shrd r14,r14,28 add r8,rax add rax,r15 mov r13,r8 add r14,rax mov rdi,QWORD[((128+0))+rsp] mov rax,r14 add rax,QWORD[rdi] lea rsi,[128+rsi] add rbx,QWORD[8+rdi] add rcx,QWORD[16+rdi] add rdx,QWORD[24+rdi] add r8,QWORD[32+rdi] add r9,QWORD[40+rdi] add r10,QWORD[48+rdi] add r11,QWORD[56+rdi] cmp rsi,QWORD[((128+16))+rsp] mov QWORD[rdi],rax mov QWORD[8+rdi],rbx mov QWORD[16+rdi],rcx mov QWORD[24+rdi],rdx mov QWORD[32+rdi],r8 mov QWORD[40+rdi],r9 mov QWORD[48+rdi],r10 mov QWORD[56+rdi],r11 jb NEAR $L$loop_avx mov rsi,QWORD[152+rsp] vzeroupper movaps xmm6,XMMWORD[((128+32))+rsp] movaps xmm7,XMMWORD[((128+48))+rsp] movaps xmm8,XMMWORD[((128+64))+rsp] movaps xmm9,XMMWORD[((128+80))+rsp] movaps xmm10,XMMWORD[((128+96))+rsp] movaps xmm11,XMMWORD[((128+112))+rsp] mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$epilogue_avx: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_sha512_block_data_order_avx: EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_prologue mov rsi,rax mov rax,QWORD[((128+24))+rax] mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 lea r10,[$L$epilogue] cmp rbx,r10 jb NEAR $L$in_prologue lea rsi,[((128+32))+rsi] lea rdi,[512+r8] mov ecx,12 DD 0xa548f3fc $L$in_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_sha512_block_data_order wrt ..imagebase DD $L$SEH_end_GFp_sha512_block_data_order wrt ..imagebase DD $L$SEH_info_GFp_sha512_block_data_order wrt ..imagebase DD $L$SEH_begin_GFp_sha512_block_data_order_avx wrt ..imagebase DD $L$SEH_end_GFp_sha512_block_data_order_avx wrt ..imagebase DD $L$SEH_info_GFp_sha512_block_data_order_avx wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_sha512_block_data_order: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase $L$SEH_info_GFp_sha512_block_data_order_avx: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase ring-0.16.9/pregenerated/tmp/vpaes-x86-win32n.asm000064400000000000000000000202141353224260700175650ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif align 64 L$_vpaes_consts: dd 218628480,235210255,168496130,67568393 dd 252381056,17041926,33884169,51187212 dd 252645135,252645135,252645135,252645135 dd 1512730624,3266504856,1377990664,3401244816 dd 830229760,1275146365,2969422977,3447763452 dd 3411033600,2979783055,338359620,2782886510 dd 4209124096,907596821,221174255,1006095553 dd 191964160,3799684038,3164090317,1589111125 dd 182528256,1777043520,2877432650,3265356744 dd 1874708224,3503451415,3305285752,363511674 dd 1606117888,3487855781,1093350906,2384367825 dd 197121,67569157,134941193,202313229 dd 67569157,134941193,202313229,197121 dd 134941193,202313229,197121,67569157 dd 202313229,197121,67569157,134941193 dd 33619971,100992007,168364043,235736079 dd 235736079,33619971,100992007,168364043 dd 168364043,235736079,33619971,100992007 dd 100992007,168364043,235736079,33619971 dd 50462976,117835012,185207048,252579084 dd 252314880,51251460,117574920,184942860 dd 184682752,252054788,50987272,118359308 dd 118099200,185467140,251790600,50727180 dd 2946363062,528716217,1300004225,1881839624 dd 1532713819,1532713819,1532713819,1532713819 dd 3602276352,4288629033,3737020424,4153884961 dd 1354558464,32357713,2958822624,3775749553 dd 1201988352,132424512,1572796698,503232858 dd 2213177600,1597421020,4103937655,675398315 db 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 db 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 db 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 db 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 db 118,101,114,115,105,116,121,41,0 align 64 align 16 __vpaes_preheat: add ebp,DWORD [esp] movdqa xmm7,[ebp-48] movdqa xmm6,[ebp-16] ret align 16 __vpaes_encrypt_core: mov ecx,16 mov eax,DWORD [240+edx] movdqa xmm1,xmm6 movdqa xmm2,[ebp] pandn xmm1,xmm0 pand xmm0,xmm6 movdqu xmm5,[edx] db 102,15,56,0,208 movdqa xmm0,[16+ebp] pxor xmm2,xmm5 psrld xmm1,4 add edx,16 db 102,15,56,0,193 lea ebx,[192+ebp] pxor xmm0,xmm2 jmp NEAR L$000enc_entry align 16 L$001enc_loop: movdqa xmm4,[32+ebp] movdqa xmm0,[48+ebp] db 102,15,56,0,226 db 102,15,56,0,195 pxor xmm4,xmm5 movdqa xmm5,[64+ebp] pxor xmm0,xmm4 movdqa xmm1,[ecx*1+ebx-64] db 102,15,56,0,234 movdqa xmm2,[80+ebp] movdqa xmm4,[ecx*1+ebx] db 102,15,56,0,211 movdqa xmm3,xmm0 pxor xmm2,xmm5 db 102,15,56,0,193 add edx,16 pxor xmm0,xmm2 db 102,15,56,0,220 add ecx,16 pxor xmm3,xmm0 db 102,15,56,0,193 and ecx,48 sub eax,1 pxor xmm0,xmm3 L$000enc_entry: movdqa xmm1,xmm6 movdqa xmm5,[ebp-32] pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm6 db 102,15,56,0,232 movdqa xmm3,xmm7 pxor xmm0,xmm1 db 102,15,56,0,217 movdqa xmm4,xmm7 pxor xmm3,xmm5 db 102,15,56,0,224 movdqa xmm2,xmm7 pxor xmm4,xmm5 db 102,15,56,0,211 movdqa xmm3,xmm7 pxor xmm2,xmm0 db 102,15,56,0,220 movdqu xmm5,[edx] pxor xmm3,xmm1 jnz NEAR L$001enc_loop movdqa xmm4,[96+ebp] movdqa xmm0,[112+ebp] db 102,15,56,0,226 pxor xmm4,xmm5 db 102,15,56,0,195 movdqa xmm1,[64+ecx*1+ebx] pxor xmm0,xmm4 db 102,15,56,0,193 ret align 16 __vpaes_schedule_core: add ebp,DWORD [esp] movdqu xmm0,[esi] movdqa xmm2,[320+ebp] movdqa xmm3,xmm0 lea ebx,[ebp] movdqa [4+esp],xmm2 call __vpaes_schedule_transform movdqa xmm7,xmm0 test edi,edi jnz NEAR L$002schedule_am_decrypting movdqu [edx],xmm0 jmp NEAR L$003schedule_go L$002schedule_am_decrypting: movdqa xmm1,[256+ecx*1+ebp] db 102,15,56,0,217 movdqu [edx],xmm3 xor ecx,48 L$003schedule_go: cmp eax,192 ja NEAR L$004schedule_256 L$005schedule_128: mov eax,10 L$006loop_schedule_128: call __vpaes_schedule_round dec eax jz NEAR L$007schedule_mangle_last call __vpaes_schedule_mangle jmp NEAR L$006loop_schedule_128 align 16 L$004schedule_256: movdqu xmm0,[16+esi] call __vpaes_schedule_transform mov eax,7 L$008loop_schedule_256: call __vpaes_schedule_mangle movdqa xmm6,xmm0 call __vpaes_schedule_round dec eax jz NEAR L$007schedule_mangle_last call __vpaes_schedule_mangle pshufd xmm0,xmm0,255 movdqa [20+esp],xmm7 movdqa xmm7,xmm6 call L$_vpaes_schedule_low_round movdqa xmm7,[20+esp] jmp NEAR L$008loop_schedule_256 align 16 L$007schedule_mangle_last: lea ebx,[384+ebp] test edi,edi jnz NEAR L$009schedule_mangle_last_dec movdqa xmm1,[256+ecx*1+ebp] db 102,15,56,0,193 lea ebx,[352+ebp] add edx,32 L$009schedule_mangle_last_dec: add edx,-16 pxor xmm0,[336+ebp] call __vpaes_schedule_transform movdqu [edx],xmm0 pxor xmm0,xmm0 pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 pxor xmm6,xmm6 pxor xmm7,xmm7 ret align 16 __vpaes_schedule_round: movdqa xmm2,[8+esp] pxor xmm1,xmm1 db 102,15,58,15,202,15 db 102,15,58,15,210,15 pxor xmm7,xmm1 pshufd xmm0,xmm0,255 db 102,15,58,15,192,1 movdqa [8+esp],xmm2 L$_vpaes_schedule_low_round: movdqa xmm1,xmm7 pslldq xmm7,4 pxor xmm7,xmm1 movdqa xmm1,xmm7 pslldq xmm7,8 pxor xmm7,xmm1 pxor xmm7,[336+ebp] movdqa xmm4,[ebp-16] movdqa xmm5,[ebp-48] movdqa xmm1,xmm4 pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm4 movdqa xmm2,[ebp-32] db 102,15,56,0,208 pxor xmm0,xmm1 movdqa xmm3,xmm5 db 102,15,56,0,217 pxor xmm3,xmm2 movdqa xmm4,xmm5 db 102,15,56,0,224 pxor xmm4,xmm2 movdqa xmm2,xmm5 db 102,15,56,0,211 pxor xmm2,xmm0 movdqa xmm3,xmm5 db 102,15,56,0,220 pxor xmm3,xmm1 movdqa xmm4,[32+ebp] db 102,15,56,0,226 movdqa xmm0,[48+ebp] db 102,15,56,0,195 pxor xmm0,xmm4 pxor xmm0,xmm7 movdqa xmm7,xmm0 ret align 16 __vpaes_schedule_transform: movdqa xmm2,[ebp-16] movdqa xmm1,xmm2 pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm2 movdqa xmm2,[ebx] db 102,15,56,0,208 movdqa xmm0,[16+ebx] db 102,15,56,0,193 pxor xmm0,xmm2 ret align 16 __vpaes_schedule_mangle: movdqa xmm4,xmm0 movdqa xmm5,[128+ebp] test edi,edi jnz NEAR L$010schedule_mangle_dec add edx,16 pxor xmm4,[336+ebp] db 102,15,56,0,229 movdqa xmm3,xmm4 db 102,15,56,0,229 pxor xmm3,xmm4 db 102,15,56,0,229 pxor xmm3,xmm4 jmp NEAR L$011schedule_mangle_both align 16 L$010schedule_mangle_dec: movdqa xmm2,[ebp-16] lea esi,[ebp] movdqa xmm1,xmm2 pandn xmm1,xmm4 psrld xmm1,4 pand xmm4,xmm2 movdqa xmm2,[esi] db 102,15,56,0,212 movdqa xmm3,[16+esi] db 102,15,56,0,217 pxor xmm3,xmm2 db 102,15,56,0,221 movdqa xmm2,[32+esi] db 102,15,56,0,212 pxor xmm2,xmm3 movdqa xmm3,[48+esi] db 102,15,56,0,217 pxor xmm3,xmm2 db 102,15,56,0,221 movdqa xmm2,[64+esi] db 102,15,56,0,212 pxor xmm2,xmm3 movdqa xmm3,[80+esi] db 102,15,56,0,217 pxor xmm3,xmm2 db 102,15,56,0,221 movdqa xmm2,[96+esi] db 102,15,56,0,212 pxor xmm2,xmm3 movdqa xmm3,[112+esi] db 102,15,56,0,217 pxor xmm3,xmm2 add edx,-16 L$011schedule_mangle_both: movdqa xmm1,[256+ecx*1+ebp] db 102,15,56,0,217 add ecx,-16 and ecx,48 movdqu [edx],xmm3 ret global _GFp_vpaes_set_encrypt_key align 16 _GFp_vpaes_set_encrypt_key: L$_GFp_vpaes_set_encrypt_key_begin: push ebp push ebx push esi push edi mov esi,DWORD [20+esp] lea ebx,[esp-56] mov eax,DWORD [24+esp] and ebx,-16 mov edx,DWORD [28+esp] xchg ebx,esp mov DWORD [48+esp],ebx mov ebx,eax shr ebx,5 add ebx,5 mov DWORD [240+edx],ebx mov ecx,48 mov edi,0 lea ebp,[(L$_vpaes_consts+0x30-L$012pic_point)] call __vpaes_schedule_core L$012pic_point: mov esp,DWORD [48+esp] xor eax,eax pop edi pop esi pop ebx pop ebp ret global _GFp_vpaes_encrypt align 16 _GFp_vpaes_encrypt: L$_GFp_vpaes_encrypt_begin: push ebp push ebx push esi push edi lea ebp,[(L$_vpaes_consts+0x30-L$013pic_point)] call __vpaes_preheat L$013pic_point: mov esi,DWORD [20+esp] lea ebx,[esp-56] mov edi,DWORD [24+esp] and ebx,-16 mov edx,DWORD [28+esp] xchg ebx,esp mov DWORD [48+esp],ebx movdqu xmm0,[esi] call __vpaes_encrypt_core movdqu [edi],xmm0 mov esp,DWORD [48+esp] pop edi pop esi pop ebx pop ebp ret ring-0.16.9/pregenerated/tmp/vpaes-x86_64-nasm.asm000064400000000000000000000240601353224260000177100ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 ALIGN 16 _vpaes_encrypt_core: mov r9,rdx mov r11,16 mov eax,DWORD[240+rdx] movdqa xmm1,xmm9 movdqa xmm2,XMMWORD[$L$k_ipt] pandn xmm1,xmm0 movdqu xmm5,XMMWORD[r9] psrld xmm1,4 pand xmm0,xmm9 DB 102,15,56,0,208 movdqa xmm0,XMMWORD[(($L$k_ipt+16))] DB 102,15,56,0,193 pxor xmm2,xmm5 add r9,16 pxor xmm0,xmm2 lea r10,[$L$k_mc_backward] jmp NEAR $L$enc_entry ALIGN 16 $L$enc_loop: movdqa xmm4,xmm13 movdqa xmm0,xmm12 DB 102,15,56,0,226 DB 102,15,56,0,195 pxor xmm4,xmm5 movdqa xmm5,xmm15 pxor xmm0,xmm4 movdqa xmm1,XMMWORD[((-64))+r10*1+r11] DB 102,15,56,0,234 movdqa xmm4,XMMWORD[r10*1+r11] movdqa xmm2,xmm14 DB 102,15,56,0,211 movdqa xmm3,xmm0 pxor xmm2,xmm5 DB 102,15,56,0,193 add r9,16 pxor xmm0,xmm2 DB 102,15,56,0,220 add r11,16 pxor xmm3,xmm0 DB 102,15,56,0,193 and r11,0x30 sub rax,1 pxor xmm0,xmm3 $L$enc_entry: movdqa xmm1,xmm9 movdqa xmm5,xmm11 pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm9 DB 102,15,56,0,232 movdqa xmm3,xmm10 pxor xmm0,xmm1 DB 102,15,56,0,217 movdqa xmm4,xmm10 pxor xmm3,xmm5 DB 102,15,56,0,224 movdqa xmm2,xmm10 pxor xmm4,xmm5 DB 102,15,56,0,211 movdqa xmm3,xmm10 pxor xmm2,xmm0 DB 102,15,56,0,220 movdqu xmm5,XMMWORD[r9] pxor xmm3,xmm1 jnz NEAR $L$enc_loop movdqa xmm4,XMMWORD[((-96))+r10] movdqa xmm0,XMMWORD[((-80))+r10] DB 102,15,56,0,226 pxor xmm4,xmm5 DB 102,15,56,0,195 movdqa xmm1,XMMWORD[64+r10*1+r11] pxor xmm0,xmm4 DB 102,15,56,0,193 DB 0F3h,0C3h ;repret ALIGN 16 _vpaes_schedule_core: call _vpaes_preheat movdqa xmm8,XMMWORD[$L$k_rcon] movdqu xmm0,XMMWORD[rdi] movdqa xmm3,xmm0 lea r11,[$L$k_ipt] call _vpaes_schedule_transform movdqa xmm7,xmm0 lea r10,[$L$k_sr] movdqu XMMWORD[rdx],xmm0 $L$schedule_go: cmp esi,192 ja NEAR $L$schedule_256 $L$schedule_128: mov esi,10 $L$oop_schedule_128: call _vpaes_schedule_round dec rsi jz NEAR $L$schedule_mangle_last call _vpaes_schedule_mangle jmp NEAR $L$oop_schedule_128 ALIGN 16 $L$schedule_256: movdqu xmm0,XMMWORD[16+rdi] call _vpaes_schedule_transform mov esi,7 $L$oop_schedule_256: call _vpaes_schedule_mangle movdqa xmm6,xmm0 call _vpaes_schedule_round dec rsi jz NEAR $L$schedule_mangle_last call _vpaes_schedule_mangle pshufd xmm0,xmm0,0xFF movdqa xmm5,xmm7 movdqa xmm7,xmm6 call _vpaes_schedule_low_round movdqa xmm7,xmm5 jmp NEAR $L$oop_schedule_256 ALIGN 16 $L$schedule_mangle_last: lea r11,[$L$k_deskew] movdqa xmm1,XMMWORD[r10*1+r8] DB 102,15,56,0,193 lea r11,[$L$k_opt] add rdx,32 $L$schedule_mangle_last_dec: add rdx,-16 pxor xmm0,XMMWORD[$L$k_s63] call _vpaes_schedule_transform movdqu XMMWORD[rdx],xmm0 pxor xmm0,xmm0 pxor xmm1,xmm1 pxor xmm2,xmm2 pxor xmm3,xmm3 pxor xmm4,xmm4 pxor xmm5,xmm5 pxor xmm6,xmm6 pxor xmm7,xmm7 DB 0F3h,0C3h ;repret ALIGN 16 _vpaes_schedule_round: pxor xmm1,xmm1 DB 102,65,15,58,15,200,15 DB 102,69,15,58,15,192,15 pxor xmm7,xmm1 pshufd xmm0,xmm0,0xFF DB 102,15,58,15,192,1 _vpaes_schedule_low_round: movdqa xmm1,xmm7 pslldq xmm7,4 pxor xmm7,xmm1 movdqa xmm1,xmm7 pslldq xmm7,8 pxor xmm7,xmm1 pxor xmm7,XMMWORD[$L$k_s63] movdqa xmm1,xmm9 pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm9 movdqa xmm2,xmm11 DB 102,15,56,0,208 pxor xmm0,xmm1 movdqa xmm3,xmm10 DB 102,15,56,0,217 pxor xmm3,xmm2 movdqa xmm4,xmm10 DB 102,15,56,0,224 pxor xmm4,xmm2 movdqa xmm2,xmm10 DB 102,15,56,0,211 pxor xmm2,xmm0 movdqa xmm3,xmm10 DB 102,15,56,0,220 pxor xmm3,xmm1 movdqa xmm4,xmm13 DB 102,15,56,0,226 movdqa xmm0,xmm12 DB 102,15,56,0,195 pxor xmm0,xmm4 pxor xmm0,xmm7 movdqa xmm7,xmm0 DB 0F3h,0C3h ;repret ALIGN 16 _vpaes_schedule_transform: movdqa xmm1,xmm9 pandn xmm1,xmm0 psrld xmm1,4 pand xmm0,xmm9 movdqa xmm2,XMMWORD[r11] DB 102,15,56,0,208 movdqa xmm0,XMMWORD[16+r11] DB 102,15,56,0,193 pxor xmm0,xmm2 DB 0F3h,0C3h ;repret ALIGN 16 _vpaes_schedule_mangle: movdqa xmm4,xmm0 movdqa xmm5,XMMWORD[$L$k_mc_forward] add rdx,16 pxor xmm4,XMMWORD[$L$k_s63] DB 102,15,56,0,229 movdqa xmm3,xmm4 DB 102,15,56,0,229 pxor xmm3,xmm4 DB 102,15,56,0,229 pxor xmm3,xmm4 $L$schedule_mangle_both: movdqa xmm1,XMMWORD[r10*1+r8] DB 102,15,56,0,217 add r8,-16 and r8,0x30 movdqu XMMWORD[rdx],xmm3 DB 0F3h,0C3h ;repret global GFp_vpaes_set_encrypt_key ALIGN 16 GFp_vpaes_set_encrypt_key: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_vpaes_set_encrypt_key: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rsp,[((-184))+rsp] movaps XMMWORD[16+rsp],xmm6 movaps XMMWORD[32+rsp],xmm7 movaps XMMWORD[48+rsp],xmm8 movaps XMMWORD[64+rsp],xmm9 movaps XMMWORD[80+rsp],xmm10 movaps XMMWORD[96+rsp],xmm11 movaps XMMWORD[112+rsp],xmm12 movaps XMMWORD[128+rsp],xmm13 movaps XMMWORD[144+rsp],xmm14 movaps XMMWORD[160+rsp],xmm15 $L$enc_key_body: mov eax,esi shr eax,5 add eax,5 mov DWORD[240+rdx],eax mov ecx,0 mov r8d,0x30 call _vpaes_schedule_core movaps xmm6,XMMWORD[16+rsp] movaps xmm7,XMMWORD[32+rsp] movaps xmm8,XMMWORD[48+rsp] movaps xmm9,XMMWORD[64+rsp] movaps xmm10,XMMWORD[80+rsp] movaps xmm11,XMMWORD[96+rsp] movaps xmm12,XMMWORD[112+rsp] movaps xmm13,XMMWORD[128+rsp] movaps xmm14,XMMWORD[144+rsp] movaps xmm15,XMMWORD[160+rsp] lea rsp,[184+rsp] $L$enc_key_epilogue: xor eax,eax mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_vpaes_set_encrypt_key: global GFp_vpaes_encrypt ALIGN 16 GFp_vpaes_encrypt: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_vpaes_encrypt: mov rdi,rcx mov rsi,rdx mov rdx,r8 lea rsp,[((-184))+rsp] movaps XMMWORD[16+rsp],xmm6 movaps XMMWORD[32+rsp],xmm7 movaps XMMWORD[48+rsp],xmm8 movaps XMMWORD[64+rsp],xmm9 movaps XMMWORD[80+rsp],xmm10 movaps XMMWORD[96+rsp],xmm11 movaps XMMWORD[112+rsp],xmm12 movaps XMMWORD[128+rsp],xmm13 movaps XMMWORD[144+rsp],xmm14 movaps XMMWORD[160+rsp],xmm15 $L$enc_body: movdqu xmm0,XMMWORD[rdi] call _vpaes_preheat call _vpaes_encrypt_core movdqu XMMWORD[rsi],xmm0 movaps xmm6,XMMWORD[16+rsp] movaps xmm7,XMMWORD[32+rsp] movaps xmm8,XMMWORD[48+rsp] movaps xmm9,XMMWORD[64+rsp] movaps xmm10,XMMWORD[80+rsp] movaps xmm11,XMMWORD[96+rsp] movaps xmm12,XMMWORD[112+rsp] movaps xmm13,XMMWORD[128+rsp] movaps xmm14,XMMWORD[144+rsp] movaps xmm15,XMMWORD[160+rsp] lea rsp,[184+rsp] $L$enc_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_vpaes_encrypt: ALIGN 16 _vpaes_preheat: lea r10,[$L$k_s0F] movdqa xmm10,XMMWORD[((-32))+r10] movdqa xmm11,XMMWORD[((-16))+r10] movdqa xmm9,XMMWORD[r10] movdqa xmm13,XMMWORD[48+r10] movdqa xmm12,XMMWORD[64+r10] movdqa xmm15,XMMWORD[80+r10] movdqa xmm14,XMMWORD[96+r10] DB 0F3h,0C3h ;repret ALIGN 64 _vpaes_consts: $L$k_inv: DQ 0x0E05060F0D080180,0x040703090A0B0C02 DQ 0x01040A060F0B0780,0x030D0E0C02050809 $L$k_s0F: DQ 0x0F0F0F0F0F0F0F0F,0x0F0F0F0F0F0F0F0F $L$k_ipt: DQ 0xC2B2E8985A2A7000,0xCABAE09052227808 DQ 0x4C01307D317C4D00,0xCD80B1FCB0FDCC81 $L$k_sb1: DQ 0xB19BE18FCB503E00,0xA5DF7A6E142AF544 DQ 0x3618D415FAE22300,0x3BF7CCC10D2ED9EF $L$k_sb2: DQ 0xE27A93C60B712400,0x5EB7E955BC982FCD DQ 0x69EB88400AE12900,0xC2A163C8AB82234A $L$k_sbo: DQ 0xD0D26D176FBDC700,0x15AABF7AC502A878 DQ 0xCFE474A55FBB6A00,0x8E1E90D1412B35FA $L$k_mc_forward: DQ 0x0407060500030201,0x0C0F0E0D080B0A09 DQ 0x080B0A0904070605,0x000302010C0F0E0D DQ 0x0C0F0E0D080B0A09,0x0407060500030201 DQ 0x000302010C0F0E0D,0x080B0A0904070605 $L$k_mc_backward: DQ 0x0605040702010003,0x0E0D0C0F0A09080B DQ 0x020100030E0D0C0F,0x0A09080B06050407 DQ 0x0E0D0C0F0A09080B,0x0605040702010003 DQ 0x0A09080B06050407,0x020100030E0D0C0F $L$k_sr: DQ 0x0706050403020100,0x0F0E0D0C0B0A0908 DQ 0x030E09040F0A0500,0x0B06010C07020D08 DQ 0x0F060D040B020900,0x070E050C030A0108 DQ 0x0B0E0104070A0D00,0x0306090C0F020508 $L$k_rcon: DQ 0x1F8391B9AF9DEEB6,0x702A98084D7C7D81 $L$k_s63: DQ 0x5B5B5B5B5B5B5B5B,0x5B5B5B5B5B5B5B5B $L$k_opt: DQ 0xFF9F4929D6B66000,0xF7974121DEBE6808 DQ 0x01EDBD5150BCEC00,0xE10D5DB1B05C0CE0 $L$k_deskew: DQ 0x07E4A34047A4E300,0x1DFEB95A5DBEF91A DQ 0x5F36B5DC83EA6900,0x2841C2ABF49D1E77 EXTERN __imp_RtlVirtualUnwind ALIGN 16 se_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$in_prologue mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$in_prologue lea rsi,[16+rax] lea rdi,[512+r8] mov ecx,20 DD 0xa548f3fc lea rax,[184+rax] $L$in_prologue: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_vpaes_set_encrypt_key wrt ..imagebase DD $L$SEH_end_GFp_vpaes_set_encrypt_key wrt ..imagebase DD $L$SEH_info_GFp_vpaes_set_encrypt_key wrt ..imagebase DD $L$SEH_begin_GFp_vpaes_encrypt wrt ..imagebase DD $L$SEH_end_GFp_vpaes_encrypt wrt ..imagebase DD $L$SEH_info_GFp_vpaes_encrypt wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_vpaes_set_encrypt_key: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$enc_key_body wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase $L$SEH_info_GFp_vpaes_encrypt: DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$enc_body wrt ..imagebase,$L$enc_epilogue wrt ..imagebase ring-0.16.9/pregenerated/tmp/x86-mont-win32n.asm000064400000000000000000000106261353224260700174320ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ;extern _GFp_ia32cap_P global _GFp_bn_mul_mont align 16 _GFp_bn_mul_mont: L$_GFp_bn_mul_mont_begin: push ebp push ebx push esi push edi xor eax,eax mov edi,DWORD [40+esp] lea esi,[20+esp] lea edx,[24+esp] add edi,2 neg edi lea ebp,[edi*4+esp-32] neg edi mov eax,ebp sub eax,edx and eax,2047 sub ebp,eax xor edx,ebp and edx,2048 xor edx,2048 sub ebp,edx and ebp,-64 mov eax,esp sub eax,ebp and eax,-4096 mov edx,esp lea esp,[eax*1+ebp] mov eax,DWORD [esp] cmp esp,ebp ja NEAR L$000page_walk jmp NEAR L$001page_walk_done align 16 L$000page_walk: lea esp,[esp-4096] mov eax,DWORD [esp] cmp esp,ebp ja NEAR L$000page_walk L$001page_walk_done: mov eax,DWORD [esi] mov ebx,DWORD [4+esi] mov ecx,DWORD [8+esi] mov ebp,DWORD [12+esi] mov esi,DWORD [16+esi] mov esi,DWORD [esi] mov DWORD [4+esp],eax mov DWORD [8+esp],ebx mov DWORD [12+esp],ecx mov DWORD [16+esp],ebp mov DWORD [20+esp],esi lea ebx,[edi-3] mov DWORD [24+esp],edx lea eax,[_GFp_ia32cap_P] bt DWORD [eax],26 mov eax,-1 movd mm7,eax mov esi,DWORD [8+esp] mov edi,DWORD [12+esp] mov ebp,DWORD [16+esp] xor edx,edx xor ecx,ecx movd mm4,DWORD [edi] movd mm5,DWORD [esi] movd mm3,DWORD [ebp] pmuludq mm5,mm4 movq mm2,mm5 movq mm0,mm5 pand mm0,mm7 pmuludq mm5,[20+esp] pmuludq mm3,mm5 paddq mm3,mm0 movd mm1,DWORD [4+ebp] movd mm0,DWORD [4+esi] psrlq mm2,32 psrlq mm3,32 inc ecx align 16 L$0021st: pmuludq mm0,mm4 pmuludq mm1,mm5 paddq mm2,mm0 paddq mm3,mm1 movq mm0,mm2 pand mm0,mm7 movd mm1,DWORD [4+ecx*4+ebp] paddq mm3,mm0 movd mm0,DWORD [4+ecx*4+esi] psrlq mm2,32 movd DWORD [28+ecx*4+esp],mm3 psrlq mm3,32 lea ecx,[1+ecx] cmp ecx,ebx jl NEAR L$0021st pmuludq mm0,mm4 pmuludq mm1,mm5 paddq mm2,mm0 paddq mm3,mm1 movq mm0,mm2 pand mm0,mm7 paddq mm3,mm0 movd DWORD [28+ecx*4+esp],mm3 psrlq mm2,32 psrlq mm3,32 paddq mm3,mm2 movq [32+ebx*4+esp],mm3 inc edx L$003outer: xor ecx,ecx movd mm4,DWORD [edx*4+edi] movd mm5,DWORD [esi] movd mm6,DWORD [32+esp] movd mm3,DWORD [ebp] pmuludq mm5,mm4 paddq mm5,mm6 movq mm0,mm5 movq mm2,mm5 pand mm0,mm7 pmuludq mm5,[20+esp] pmuludq mm3,mm5 paddq mm3,mm0 movd mm6,DWORD [36+esp] movd mm1,DWORD [4+ebp] movd mm0,DWORD [4+esi] psrlq mm2,32 psrlq mm3,32 paddq mm2,mm6 inc ecx dec ebx L$004inner: pmuludq mm0,mm4 pmuludq mm1,mm5 paddq mm2,mm0 paddq mm3,mm1 movq mm0,mm2 movd mm6,DWORD [36+ecx*4+esp] pand mm0,mm7 movd mm1,DWORD [4+ecx*4+ebp] paddq mm3,mm0 movd mm0,DWORD [4+ecx*4+esi] psrlq mm2,32 movd DWORD [28+ecx*4+esp],mm3 psrlq mm3,32 paddq mm2,mm6 dec ebx lea ecx,[1+ecx] jnz NEAR L$004inner mov ebx,ecx pmuludq mm0,mm4 pmuludq mm1,mm5 paddq mm2,mm0 paddq mm3,mm1 movq mm0,mm2 pand mm0,mm7 paddq mm3,mm0 movd DWORD [28+ecx*4+esp],mm3 psrlq mm2,32 psrlq mm3,32 movd mm6,DWORD [36+ebx*4+esp] paddq mm3,mm2 paddq mm3,mm6 movq [32+ebx*4+esp],mm3 lea edx,[1+edx] cmp edx,ebx jle NEAR L$003outer emms align 16 L$005common_tail: mov ebp,DWORD [16+esp] mov edi,DWORD [4+esp] lea esi,[32+esp] mov eax,DWORD [esi] mov ecx,ebx xor edx,edx align 16 L$006sub: sbb eax,DWORD [edx*4+ebp] mov DWORD [edx*4+edi],eax dec ecx mov eax,DWORD [4+edx*4+esi] lea edx,[1+edx] jge NEAR L$006sub sbb eax,0 mov edx,-1 xor edx,eax jmp NEAR L$007copy align 16 L$007copy: mov esi,DWORD [32+ebx*4+esp] mov ebp,DWORD [ebx*4+edi] mov DWORD [32+ebx*4+esp],ecx and esi,eax and ebp,edx or ebp,esi mov DWORD [ebx*4+edi],ebp dec ebx jge NEAR L$007copy mov esp,DWORD [24+esp] mov eax,1 pop edi pop esi pop ebx pop ebp ret db 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 db 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 db 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 db 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 db 111,114,103,62,0 segment .bss common _GFp_ia32cap_P 16 ring-0.16.9/pregenerated/tmp/x86_64-mont-nasm.asm000064400000000000000000000551441353224260100175570ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_bn_mul_mont ALIGN 16 GFp_bn_mul_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_bn_mul_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov r9d,r9d mov rax,rsp test r9d,3 jnz NEAR $L$mul_enter cmp r9d,8 jb NEAR $L$mul_enter mov r11d,DWORD[((GFp_ia32cap_P+8))] cmp rdx,rsi jne NEAR $L$mul4x_enter test r9d,7 jz NEAR $L$sqr8x_enter jmp NEAR $L$mul4x_enter ALIGN 16 $L$mul_enter: push rbx push rbp push r12 push r13 push r14 push r15 neg r9 mov r11,rsp lea r10,[((-16))+r9*8+rsp] neg r9 and r10,-1024 sub r11,r10 and r11,-4096 lea rsp,[r11*1+r10] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul_page_walk jmp NEAR $L$mul_page_walk_done ALIGN 16 $L$mul_page_walk: lea rsp,[((-4096))+rsp] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul_page_walk $L$mul_page_walk_done: mov QWORD[8+r9*8+rsp],rax $L$mul_body: mov r12,rdx mov r8,QWORD[r8] mov rbx,QWORD[r12] mov rax,QWORD[rsi] xor r14,r14 xor r15,r15 mov rbp,r8 mul rbx mov r10,rax mov rax,QWORD[rcx] imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov r13,rdx lea r15,[1+r15] jmp NEAR $L$1st_enter ALIGN 16 $L$1st: add r13,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add r13,r11 mov r11,r10 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx $L$1st_enter: mul rbx add r11,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 lea r15,[1+r15] mov r10,rdx mul rbp cmp r15,r9 jne NEAR $L$1st add r13,rax mov rax,QWORD[rsi] adc rdx,0 add r13,r11 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx mov r11,r10 xor rdx,rdx add r13,r11 adc rdx,0 mov QWORD[((-8))+r9*8+rsp],r13 mov QWORD[r9*8+rsp],rdx lea r14,[1+r14] jmp NEAR $L$outer ALIGN 16 $L$outer: mov rbx,QWORD[r14*8+r12] xor r15,r15 mov rbp,r8 mov r10,QWORD[rsp] mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov r10,QWORD[8+rsp] mov r13,rdx lea r15,[1+r15] jmp NEAR $L$inner_enter ALIGN 16 $L$inner: add r13,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add r13,r10 mov r10,QWORD[r15*8+rsp] adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx $L$inner_enter: mul rbx add r11,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 add r10,r11 mov r11,rdx adc r11,0 lea r15,[1+r15] mul rbp cmp r15,r9 jne NEAR $L$inner add r13,rax mov rax,QWORD[rsi] adc rdx,0 add r13,r10 mov r10,QWORD[r15*8+rsp] adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx xor rdx,rdx add r13,r11 adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-8))+r9*8+rsp],r13 mov QWORD[r9*8+rsp],rdx lea r14,[1+r14] cmp r14,r9 jb NEAR $L$outer xor r14,r14 mov rax,QWORD[rsp] mov r15,r9 ALIGN 16 $L$sub: sbb rax,QWORD[r14*8+rcx] mov QWORD[r14*8+rdi],rax mov rax,QWORD[8+r14*8+rsp] lea r14,[1+r14] dec r15 jnz NEAR $L$sub sbb rax,0 mov rbx,-1 xor rbx,rax xor r14,r14 mov r15,r9 $L$copy: mov rcx,QWORD[r14*8+rdi] mov rdx,QWORD[r14*8+rsp] and rcx,rbx and rdx,rax mov QWORD[r14*8+rsp],r9 or rdx,rcx mov QWORD[r14*8+rdi],rdx lea r14,[1+r14] sub r15,1 jnz NEAR $L$copy mov rsi,QWORD[8+r9*8+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mul_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_bn_mul_mont: ALIGN 16 bn_mul4x_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_mul4x_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov r9d,r9d mov rax,rsp $L$mul4x_enter: and r11d,0x80100 cmp r11d,0x80100 je NEAR $L$mulx4x_enter push rbx push rbp push r12 push r13 push r14 push r15 neg r9 mov r11,rsp lea r10,[((-32))+r9*8+rsp] neg r9 and r10,-1024 sub r11,r10 and r11,-4096 lea rsp,[r11*1+r10] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul4x_page_walk jmp NEAR $L$mul4x_page_walk_done $L$mul4x_page_walk: lea rsp,[((-4096))+rsp] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul4x_page_walk $L$mul4x_page_walk_done: mov QWORD[8+r9*8+rsp],rax $L$mul4x_body: mov QWORD[16+r9*8+rsp],rdi mov r12,rdx mov r8,QWORD[r8] mov rbx,QWORD[r12] mov rax,QWORD[rsi] xor r14,r14 xor r15,r15 mov rbp,r8 mul rbx mov r10,rax mov rax,QWORD[rcx] imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+rsi] adc rdx,0 add rdi,r11 lea r15,[4+r15] adc rdx,0 mov QWORD[rsp],rdi mov r13,rdx jmp NEAR $L$1st4x ALIGN 16 $L$1st4x: mul rbx add r10,rax mov rax,QWORD[((-16))+r15*8+rcx] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+r15*8+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],rdi mov r13,rdx mul rbx add r10,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[8+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-8))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+r15*8+rcx] adc rdx,0 lea r15,[4+r15] mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[((-16))+r15*8+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-32))+r15*8+rsp],rdi mov r13,rdx cmp r15,r9 jb NEAR $L$1st4x mul rbx add r10,rax mov rax,QWORD[((-16))+r15*8+rcx] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+r15*8+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],rdi mov r13,rdx xor rdi,rdi add r13,r10 adc rdi,0 mov QWORD[((-8))+r15*8+rsp],r13 mov QWORD[r15*8+rsp],rdi lea r14,[1+r14] ALIGN 4 $L$outer4x: mov rbx,QWORD[r14*8+r12] xor r15,r15 mov r10,QWORD[rsp] mov rbp,r8 mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 add r11,QWORD[8+rsp] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+rsi] adc rdx,0 add rdi,r11 lea r15,[4+r15] adc rdx,0 mov QWORD[rsp],rdi mov r13,rdx jmp NEAR $L$inner4x ALIGN 16 $L$inner4x: mul rbx add r10,rax mov rax,QWORD[((-16))+r15*8+rcx] adc rdx,0 add r10,QWORD[((-16))+r15*8+rsp] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+r15*8+rcx] adc rdx,0 add r11,QWORD[((-8))+r15*8+rsp] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],rdi mov r13,rdx mul rbx add r10,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 add r10,QWORD[r15*8+rsp] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[8+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-8))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+r15*8+rcx] adc rdx,0 add r11,QWORD[8+r15*8+rsp] adc rdx,0 lea r15,[4+r15] mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[((-16))+r15*8+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-32))+r15*8+rsp],rdi mov r13,rdx cmp r15,r9 jb NEAR $L$inner4x mul rbx add r10,rax mov rax,QWORD[((-16))+r15*8+rcx] adc rdx,0 add r10,QWORD[((-16))+r15*8+rsp] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*8+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r15*8+rsp],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+r15*8+rcx] adc rdx,0 add r11,QWORD[((-8))+r15*8+rsp] adc rdx,0 lea r14,[1+r14] mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],rdi mov r13,rdx xor rdi,rdi add r13,r10 adc rdi,0 add r13,QWORD[r9*8+rsp] adc rdi,0 mov QWORD[((-8))+r15*8+rsp],r13 mov QWORD[r15*8+rsp],rdi cmp r14,r9 jb NEAR $L$outer4x mov rdi,QWORD[16+r9*8+rsp] lea r15,[((-4))+r9] mov rax,QWORD[rsp] mov rdx,QWORD[8+rsp] shr r15,2 lea rsi,[rsp] xor r14,r14 sub rax,QWORD[rcx] mov rbx,QWORD[16+rsi] mov rbp,QWORD[24+rsi] sbb rdx,QWORD[8+rcx] $L$sub4x: mov QWORD[r14*8+rdi],rax mov QWORD[8+r14*8+rdi],rdx sbb rbx,QWORD[16+r14*8+rcx] mov rax,QWORD[32+r14*8+rsi] mov rdx,QWORD[40+r14*8+rsi] sbb rbp,QWORD[24+r14*8+rcx] mov QWORD[16+r14*8+rdi],rbx mov QWORD[24+r14*8+rdi],rbp sbb rax,QWORD[32+r14*8+rcx] mov rbx,QWORD[48+r14*8+rsi] mov rbp,QWORD[56+r14*8+rsi] sbb rdx,QWORD[40+r14*8+rcx] lea r14,[4+r14] dec r15 jnz NEAR $L$sub4x mov QWORD[r14*8+rdi],rax mov rax,QWORD[32+r14*8+rsi] sbb rbx,QWORD[16+r14*8+rcx] mov QWORD[8+r14*8+rdi],rdx sbb rbp,QWORD[24+r14*8+rcx] mov QWORD[16+r14*8+rdi],rbx sbb rax,0 mov QWORD[24+r14*8+rdi],rbp pxor xmm0,xmm0 DB 102,72,15,110,224 pcmpeqd xmm5,xmm5 pshufd xmm4,xmm4,0 mov r15,r9 pxor xmm5,xmm4 shr r15,2 xor eax,eax jmp NEAR $L$copy4x ALIGN 16 $L$copy4x: movdqa xmm1,XMMWORD[rax*1+rsp] movdqu xmm2,XMMWORD[rax*1+rdi] pand xmm1,xmm4 pand xmm2,xmm5 movdqa xmm3,XMMWORD[16+rax*1+rsp] movdqa XMMWORD[rax*1+rsp],xmm0 por xmm1,xmm2 movdqu xmm2,XMMWORD[16+rax*1+rdi] movdqu XMMWORD[rax*1+rdi],xmm1 pand xmm3,xmm4 pand xmm2,xmm5 movdqa XMMWORD[16+rax*1+rsp],xmm0 por xmm3,xmm2 movdqu XMMWORD[16+rax*1+rdi],xmm3 lea rax,[32+rax] dec r15 jnz NEAR $L$copy4x mov rsi,QWORD[8+r9*8+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mul4x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_mul4x_mont: EXTERN GFp_bn_sqrx8x_internal EXTERN GFp_bn_sqr8x_internal ALIGN 32 bn_sqr8x_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_sqr8x_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov rax,rsp $L$sqr8x_enter: push rbx push rbp push r12 push r13 push r14 push r15 $L$sqr8x_prologue: mov r10d,r9d shl r9d,3 shl r10,3+2 neg r9 lea r11,[((-64))+r9*2+rsp] mov rbp,rsp mov r8,QWORD[r8] sub r11,rsi and r11,4095 cmp r10,r11 jb NEAR $L$sqr8x_sp_alt sub rbp,r11 lea rbp,[((-64))+r9*2+rbp] jmp NEAR $L$sqr8x_sp_done ALIGN 32 $L$sqr8x_sp_alt: lea r10,[((4096-64))+r9*2] lea rbp,[((-64))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$sqr8x_sp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$sqr8x_page_walk jmp NEAR $L$sqr8x_page_walk_done ALIGN 16 $L$sqr8x_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$sqr8x_page_walk $L$sqr8x_page_walk_done: mov r10,r9 neg r9 mov QWORD[32+rsp],r8 mov QWORD[40+rsp],rax $L$sqr8x_body: DB 102,72,15,110,209 pxor xmm0,xmm0 DB 102,72,15,110,207 DB 102,73,15,110,218 mov eax,DWORD[((GFp_ia32cap_P+8))] and eax,0x80100 cmp eax,0x80100 jne NEAR $L$sqr8x_nox call GFp_bn_sqrx8x_internal lea rbx,[rcx*1+r8] mov r9,rcx mov rdx,rcx DB 102,72,15,126,207 sar rcx,3+2 jmp NEAR $L$sqr8x_sub ALIGN 32 $L$sqr8x_nox: call GFp_bn_sqr8x_internal lea rbx,[r9*1+rdi] mov rcx,r9 mov rdx,r9 DB 102,72,15,126,207 sar rcx,3+2 jmp NEAR $L$sqr8x_sub ALIGN 32 $L$sqr8x_sub: mov r12,QWORD[rbx] mov r13,QWORD[8+rbx] mov r14,QWORD[16+rbx] mov r15,QWORD[24+rbx] lea rbx,[32+rbx] sbb r12,QWORD[rbp] sbb r13,QWORD[8+rbp] sbb r14,QWORD[16+rbp] sbb r15,QWORD[24+rbp] lea rbp,[32+rbp] mov QWORD[rdi],r12 mov QWORD[8+rdi],r13 mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 lea rdi,[32+rdi] inc rcx jnz NEAR $L$sqr8x_sub sbb rax,0 lea rbx,[r9*1+rbx] lea rdi,[r9*1+rdi] DB 102,72,15,110,200 pxor xmm0,xmm0 pshufd xmm1,xmm1,0 mov rsi,QWORD[40+rsp] jmp NEAR $L$sqr8x_cond_copy ALIGN 32 $L$sqr8x_cond_copy: movdqa xmm2,XMMWORD[rbx] movdqa xmm3,XMMWORD[16+rbx] lea rbx,[32+rbx] movdqu xmm4,XMMWORD[rdi] movdqu xmm5,XMMWORD[16+rdi] lea rdi,[32+rdi] movdqa XMMWORD[(-32)+rbx],xmm0 movdqa XMMWORD[(-16)+rbx],xmm0 movdqa XMMWORD[(-32)+rdx*1+rbx],xmm0 movdqa XMMWORD[(-16)+rdx*1+rbx],xmm0 pcmpeqd xmm0,xmm1 pand xmm2,xmm1 pand xmm3,xmm1 pand xmm4,xmm0 pand xmm5,xmm0 pxor xmm0,xmm0 por xmm4,xmm2 por xmm5,xmm3 movdqu XMMWORD[(-32)+rdi],xmm4 movdqu XMMWORD[(-16)+rdi],xmm5 add r9,32 jnz NEAR $L$sqr8x_cond_copy mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$sqr8x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_sqr8x_mont: ALIGN 32 bn_mulx4x_mont: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_mulx4x_mont: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov rax,rsp $L$mulx4x_enter: push rbx push rbp push r12 push r13 push r14 push r15 $L$mulx4x_prologue: shl r9d,3 xor r10,r10 sub r10,r9 mov r8,QWORD[r8] lea rbp,[((-72))+r10*1+rsp] and rbp,-128 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mulx4x_page_walk jmp NEAR $L$mulx4x_page_walk_done ALIGN 16 $L$mulx4x_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mulx4x_page_walk $L$mulx4x_page_walk_done: lea r10,[r9*1+rdx] mov QWORD[rsp],r9 shr r9,5 mov QWORD[16+rsp],r10 sub r9,1 mov QWORD[24+rsp],r8 mov QWORD[32+rsp],rdi mov QWORD[40+rsp],rax mov QWORD[48+rsp],r9 jmp NEAR $L$mulx4x_body ALIGN 32 $L$mulx4x_body: lea rdi,[8+rdx] mov rdx,QWORD[rdx] lea rbx,[((64+32))+rsp] mov r9,rdx mulx rax,r8,QWORD[rsi] mulx r14,r11,QWORD[8+rsi] add r11,rax mov QWORD[8+rsp],rdi mulx r13,r12,QWORD[16+rsi] adc r12,r14 adc r13,0 mov rdi,r8 imul r8,QWORD[24+rsp] xor rbp,rbp mulx r14,rax,QWORD[24+rsi] mov rdx,r8 lea rsi,[32+rsi] adcx r13,rax adcx r14,rbp mulx r10,rax,QWORD[rcx] adcx rdi,rax adox r10,r11 mulx r11,rax,QWORD[8+rcx] adcx r10,rax adox r11,r12 DB 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 mov rdi,QWORD[48+rsp] mov QWORD[((-32))+rbx],r10 adcx r11,rax adox r12,r13 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-24))+rbx],r11 adcx r12,rax adox r15,rbp lea rcx,[32+rcx] mov QWORD[((-16))+rbx],r12 jmp NEAR $L$mulx4x_1st ALIGN 32 $L$mulx4x_1st: adcx r15,rbp mulx rax,r10,QWORD[rsi] adcx r10,r14 mulx r14,r11,QWORD[8+rsi] adcx r11,rax mulx rax,r12,QWORD[16+rsi] adcx r12,r14 mulx r14,r13,QWORD[24+rsi] DB 0x67,0x67 mov rdx,r8 adcx r13,rax adcx r14,rbp lea rsi,[32+rsi] lea rbx,[32+rbx] adox r10,r15 mulx r15,rax,QWORD[rcx] adcx r10,rax adox r11,r15 mulx r15,rax,QWORD[8+rcx] adcx r11,rax adox r12,r15 mulx r15,rax,QWORD[16+rcx] mov QWORD[((-40))+rbx],r10 adcx r12,rax mov QWORD[((-32))+rbx],r11 adox r13,r15 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-24))+rbx],r12 adcx r13,rax adox r15,rbp lea rcx,[32+rcx] mov QWORD[((-16))+rbx],r13 dec rdi jnz NEAR $L$mulx4x_1st mov rax,QWORD[rsp] mov rdi,QWORD[8+rsp] adc r15,rbp add r14,r15 sbb r15,r15 mov QWORD[((-8))+rbx],r14 jmp NEAR $L$mulx4x_outer ALIGN 32 $L$mulx4x_outer: mov rdx,QWORD[rdi] lea rdi,[8+rdi] sub rsi,rax mov QWORD[rbx],r15 lea rbx,[((64+32))+rsp] sub rcx,rax mulx r11,r8,QWORD[rsi] xor ebp,ebp mov r9,rdx mulx r12,r14,QWORD[8+rsi] adox r8,QWORD[((-32))+rbx] adcx r11,r14 mulx r13,r15,QWORD[16+rsi] adox r11,QWORD[((-24))+rbx] adcx r12,r15 adox r12,QWORD[((-16))+rbx] adcx r13,rbp adox r13,rbp mov QWORD[8+rsp],rdi mov r15,r8 imul r8,QWORD[24+rsp] xor ebp,ebp mulx r14,rax,QWORD[24+rsi] mov rdx,r8 adcx r13,rax adox r13,QWORD[((-8))+rbx] adcx r14,rbp lea rsi,[32+rsi] adox r14,rbp mulx r10,rax,QWORD[rcx] adcx r15,rax adox r10,r11 mulx r11,rax,QWORD[8+rcx] adcx r10,rax adox r11,r12 mulx r12,rax,QWORD[16+rcx] mov QWORD[((-32))+rbx],r10 adcx r11,rax adox r12,r13 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-24))+rbx],r11 lea rcx,[32+rcx] adcx r12,rax adox r15,rbp mov rdi,QWORD[48+rsp] mov QWORD[((-16))+rbx],r12 jmp NEAR $L$mulx4x_inner ALIGN 32 $L$mulx4x_inner: mulx rax,r10,QWORD[rsi] adcx r15,rbp adox r10,r14 mulx r14,r11,QWORD[8+rsi] adcx r10,QWORD[rbx] adox r11,rax mulx rax,r12,QWORD[16+rsi] adcx r11,QWORD[8+rbx] adox r12,r14 mulx r14,r13,QWORD[24+rsi] mov rdx,r8 adcx r12,QWORD[16+rbx] adox r13,rax adcx r13,QWORD[24+rbx] adox r14,rbp lea rsi,[32+rsi] lea rbx,[32+rbx] adcx r14,rbp adox r10,r15 mulx r15,rax,QWORD[rcx] adcx r10,rax adox r11,r15 mulx r15,rax,QWORD[8+rcx] adcx r11,rax adox r12,r15 mulx r15,rax,QWORD[16+rcx] mov QWORD[((-40))+rbx],r10 adcx r12,rax adox r13,r15 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-32))+rbx],r11 mov QWORD[((-24))+rbx],r12 adcx r13,rax adox r15,rbp lea rcx,[32+rcx] mov QWORD[((-16))+rbx],r13 dec rdi jnz NEAR $L$mulx4x_inner mov rax,QWORD[rsp] mov rdi,QWORD[8+rsp] adc r15,rbp sub rbp,QWORD[rbx] adc r14,r15 sbb r15,r15 mov QWORD[((-8))+rbx],r14 cmp rdi,QWORD[16+rsp] jne NEAR $L$mulx4x_outer lea rbx,[64+rsp] sub rcx,rax neg r15 mov rdx,rax shr rax,3+2 mov rdi,QWORD[32+rsp] jmp NEAR $L$mulx4x_sub ALIGN 32 $L$mulx4x_sub: mov r11,QWORD[rbx] mov r12,QWORD[8+rbx] mov r13,QWORD[16+rbx] mov r14,QWORD[24+rbx] lea rbx,[32+rbx] sbb r11,QWORD[rcx] sbb r12,QWORD[8+rcx] sbb r13,QWORD[16+rcx] sbb r14,QWORD[24+rcx] lea rcx,[32+rcx] mov QWORD[rdi],r11 mov QWORD[8+rdi],r12 mov QWORD[16+rdi],r13 mov QWORD[24+rdi],r14 lea rdi,[32+rdi] dec rax jnz NEAR $L$mulx4x_sub sbb r15,0 lea rbx,[64+rsp] sub rdi,rdx DB 102,73,15,110,207 pxor xmm0,xmm0 pshufd xmm1,xmm1,0 mov rsi,QWORD[40+rsp] jmp NEAR $L$mulx4x_cond_copy ALIGN 32 $L$mulx4x_cond_copy: movdqa xmm2,XMMWORD[rbx] movdqa xmm3,XMMWORD[16+rbx] lea rbx,[32+rbx] movdqu xmm4,XMMWORD[rdi] movdqu xmm5,XMMWORD[16+rdi] lea rdi,[32+rdi] movdqa XMMWORD[(-32)+rbx],xmm0 movdqa XMMWORD[(-16)+rbx],xmm0 pcmpeqd xmm0,xmm1 pand xmm2,xmm1 pand xmm3,xmm1 pand xmm4,xmm0 pand xmm5,xmm0 pxor xmm0,xmm0 por xmm4,xmm2 por xmm5,xmm3 movdqu XMMWORD[(-32)+rdi],xmm4 movdqu XMMWORD[(-16)+rdi],xmm5 sub rdx,32 jnz NEAR $L$mulx4x_cond_copy mov QWORD[rbx],rdx mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mulx4x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_mulx4x_mont: DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 DB 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 DB 54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83 DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 DB 115,108,46,111,114,103,62,0 ALIGN 16 EXTERN __imp_RtlVirtualUnwind ALIGN 16 mul_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov rax,QWORD[152+r8] mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov r10,QWORD[192+r8] mov rax,QWORD[8+r10*8+rax] jmp NEAR $L$common_pop_regs ALIGN 16 sqr_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_pop_regs mov rax,QWORD[152+r8] mov r10d,DWORD[8+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail mov rax,QWORD[40+rax] $L$common_pop_regs: mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_bn_mul_mont wrt ..imagebase DD $L$SEH_end_GFp_bn_mul_mont wrt ..imagebase DD $L$SEH_info_GFp_bn_mul_mont wrt ..imagebase DD $L$SEH_begin_bn_mul4x_mont wrt ..imagebase DD $L$SEH_end_bn_mul4x_mont wrt ..imagebase DD $L$SEH_info_bn_mul4x_mont wrt ..imagebase DD $L$SEH_begin_bn_sqr8x_mont wrt ..imagebase DD $L$SEH_end_bn_sqr8x_mont wrt ..imagebase DD $L$SEH_info_bn_sqr8x_mont wrt ..imagebase DD $L$SEH_begin_bn_mulx4x_mont wrt ..imagebase DD $L$SEH_end_bn_mulx4x_mont wrt ..imagebase DD $L$SEH_info_bn_mulx4x_mont wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_bn_mul_mont: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase $L$SEH_info_bn_mul4x_mont: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase $L$SEH_info_bn_sqr8x_mont: DB 9,0,0,0 DD sqr_handler wrt ..imagebase DD $L$sqr8x_prologue wrt ..imagebase,$L$sqr8x_body wrt ..imagebase,$L$sqr8x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mulx4x_mont: DB 9,0,0,0 DD sqr_handler wrt ..imagebase DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase ALIGN 8 ring-0.16.9/pregenerated/tmp/x86_64-mont5-nasm.asm000064400000000000000000001753621353224260100176510ustar0000000000000000; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 EXTERN GFp_ia32cap_P global GFp_bn_mul_mont_gather5 ALIGN 64 GFp_bn_mul_mont_gather5: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_bn_mul_mont_gather5: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov r9d,r9d mov rax,rsp test r9d,7 jnz NEAR $L$mul_enter lea r11,[GFp_ia32cap_P] mov r11d,DWORD[8+r11] jmp NEAR $L$mul4x_enter ALIGN 16 $L$mul_enter: movd xmm5,DWORD[56+rsp] push rbx push rbp push r12 push r13 push r14 push r15 neg r9 mov r11,rsp lea r10,[((-280))+r9*8+rsp] neg r9 and r10,-1024 sub r11,r10 and r11,-4096 lea rsp,[r11*1+r10] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul_page_walk jmp NEAR $L$mul_page_walk_done $L$mul_page_walk: lea rsp,[((-4096))+rsp] mov r11,QWORD[rsp] cmp rsp,r10 ja NEAR $L$mul_page_walk $L$mul_page_walk_done: lea r10,[$L$inc] mov QWORD[8+r9*8+rsp],rax $L$mul_body: lea r12,[128+rdx] movdqa xmm0,XMMWORD[r10] movdqa xmm1,XMMWORD[16+r10] lea r10,[((24-112))+r9*8+rsp] and r10,-16 pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 movdqa xmm2,xmm1 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 DB 0x67 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[112+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[128+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[144+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[160+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[176+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[192+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[208+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[224+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[240+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[256+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[272+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[288+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[304+r10],xmm0 paddd xmm3,xmm2 DB 0x67 pcmpeqd xmm2,xmm5 movdqa XMMWORD[320+r10],xmm1 pcmpeqd xmm3,xmm5 movdqa XMMWORD[336+r10],xmm2 pand xmm0,XMMWORD[64+r12] pand xmm1,XMMWORD[80+r12] pand xmm2,XMMWORD[96+r12] movdqa XMMWORD[352+r10],xmm3 pand xmm3,XMMWORD[112+r12] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-128))+r12] movdqa xmm5,XMMWORD[((-112))+r12] movdqa xmm2,XMMWORD[((-96))+r12] pand xmm4,XMMWORD[112+r10] movdqa xmm3,XMMWORD[((-80))+r12] pand xmm5,XMMWORD[128+r10] por xmm0,xmm4 pand xmm2,XMMWORD[144+r10] por xmm1,xmm5 pand xmm3,XMMWORD[160+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-64))+r12] movdqa xmm5,XMMWORD[((-48))+r12] movdqa xmm2,XMMWORD[((-32))+r12] pand xmm4,XMMWORD[176+r10] movdqa xmm3,XMMWORD[((-16))+r12] pand xmm5,XMMWORD[192+r10] por xmm0,xmm4 pand xmm2,XMMWORD[208+r10] por xmm1,xmm5 pand xmm3,XMMWORD[224+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[r12] movdqa xmm5,XMMWORD[16+r12] movdqa xmm2,XMMWORD[32+r12] pand xmm4,XMMWORD[240+r10] movdqa xmm3,XMMWORD[48+r12] pand xmm5,XMMWORD[256+r10] por xmm0,xmm4 pand xmm2,XMMWORD[272+r10] por xmm1,xmm5 pand xmm3,XMMWORD[288+r10] por xmm0,xmm2 por xmm1,xmm3 por xmm0,xmm1 pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea r12,[256+r12] DB 102,72,15,126,195 mov r8,QWORD[r8] mov rax,QWORD[rsi] xor r14,r14 xor r15,r15 mov rbp,r8 mul rbx mov r10,rax mov rax,QWORD[rcx] imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov r13,rdx lea r15,[1+r15] jmp NEAR $L$1st_enter ALIGN 16 $L$1st: add r13,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add r13,r11 mov r11,r10 adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx $L$1st_enter: mul rbx add r11,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 lea r15,[1+r15] mov r10,rdx mul rbp cmp r15,r9 jne NEAR $L$1st add r13,rax adc rdx,0 add r13,r11 adc rdx,0 mov QWORD[((-16))+r9*8+rsp],r13 mov r13,rdx mov r11,r10 xor rdx,rdx add r13,r11 adc rdx,0 mov QWORD[((-8))+r9*8+rsp],r13 mov QWORD[r9*8+rsp],rdx lea r14,[1+r14] jmp NEAR $L$outer ALIGN 16 $L$outer: lea rdx,[((24+128))+r9*8+rsp] and rdx,-16 pxor xmm4,xmm4 pxor xmm5,xmm5 movdqa xmm0,XMMWORD[((-128))+r12] movdqa xmm1,XMMWORD[((-112))+r12] movdqa xmm2,XMMWORD[((-96))+r12] movdqa xmm3,XMMWORD[((-80))+r12] pand xmm0,XMMWORD[((-128))+rdx] pand xmm1,XMMWORD[((-112))+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[((-96))+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[((-80))+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[((-64))+r12] movdqa xmm1,XMMWORD[((-48))+r12] movdqa xmm2,XMMWORD[((-32))+r12] movdqa xmm3,XMMWORD[((-16))+r12] pand xmm0,XMMWORD[((-64))+rdx] pand xmm1,XMMWORD[((-48))+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[((-32))+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[((-16))+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[r12] movdqa xmm1,XMMWORD[16+r12] movdqa xmm2,XMMWORD[32+r12] movdqa xmm3,XMMWORD[48+r12] pand xmm0,XMMWORD[rdx] pand xmm1,XMMWORD[16+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[32+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[48+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[64+r12] movdqa xmm1,XMMWORD[80+r12] movdqa xmm2,XMMWORD[96+r12] movdqa xmm3,XMMWORD[112+r12] pand xmm0,XMMWORD[64+rdx] pand xmm1,XMMWORD[80+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[96+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[112+rdx] por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea r12,[256+r12] mov rax,QWORD[rsi] DB 102,72,15,126,195 xor r15,r15 mov rbp,r8 mov r10,QWORD[rsp] mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 imul rbp,r10 mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+rsi] adc rdx,0 mov r10,QWORD[8+rsp] mov r13,rdx lea r15,[1+r15] jmp NEAR $L$inner_enter ALIGN 16 $L$inner: add r13,rax mov rax,QWORD[r15*8+rsi] adc rdx,0 add r13,r10 mov r10,QWORD[r15*8+rsp] adc rdx,0 mov QWORD[((-16))+r15*8+rsp],r13 mov r13,rdx $L$inner_enter: mul rbx add r11,rax mov rax,QWORD[r15*8+rcx] adc rdx,0 add r10,r11 mov r11,rdx adc r11,0 lea r15,[1+r15] mul rbp cmp r15,r9 jne NEAR $L$inner add r13,rax adc rdx,0 add r13,r10 mov r10,QWORD[r9*8+rsp] adc rdx,0 mov QWORD[((-16))+r9*8+rsp],r13 mov r13,rdx xor rdx,rdx add r13,r11 adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-8))+r9*8+rsp],r13 mov QWORD[r9*8+rsp],rdx lea r14,[1+r14] cmp r14,r9 jb NEAR $L$outer xor r14,r14 mov rax,QWORD[rsp] lea rsi,[rsp] mov r15,r9 jmp NEAR $L$sub ALIGN 16 $L$sub: sbb rax,QWORD[r14*8+rcx] mov QWORD[r14*8+rdi],rax mov rax,QWORD[8+r14*8+rsi] lea r14,[1+r14] dec r15 jnz NEAR $L$sub sbb rax,0 mov rbx,-1 xor rbx,rax xor r14,r14 mov r15,r9 $L$copy: mov rcx,QWORD[r14*8+rdi] mov rdx,QWORD[r14*8+rsp] and rcx,rbx and rdx,rax mov QWORD[r14*8+rsp],r14 or rdx,rcx mov QWORD[r14*8+rdi],rdx lea r14,[1+r14] sub r15,1 jnz NEAR $L$copy mov rsi,QWORD[8+r9*8+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mul_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_bn_mul_mont_gather5: ALIGN 32 bn_mul4x_mont_gather5: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_mul4x_mont_gather5: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] DB 0x67 mov rax,rsp $L$mul4x_enter: and r11d,0x80108 cmp r11d,0x80108 je NEAR $L$mulx4x_enter push rbx push rbp push r12 push r13 push r14 push r15 $L$mul4x_prologue: DB 0x67 shl r9d,3 lea r10,[r9*2+r9] neg r9 lea r11,[((-320))+r9*2+rsp] mov rbp,rsp sub r11,rdi and r11,4095 cmp r10,r11 jb NEAR $L$mul4xsp_alt sub rbp,r11 lea rbp,[((-320))+r9*2+rbp] jmp NEAR $L$mul4xsp_done ALIGN 32 $L$mul4xsp_alt: lea r10,[((4096-320))+r9*2] lea rbp,[((-320))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$mul4xsp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mul4x_page_walk jmp NEAR $L$mul4x_page_walk_done $L$mul4x_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mul4x_page_walk $L$mul4x_page_walk_done: neg r9 mov QWORD[40+rsp],rax $L$mul4x_body: call mul4x_internal mov rsi,QWORD[40+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mul4x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_mul4x_mont_gather5: ALIGN 32 mul4x_internal: shl r9,5 movd xmm5,DWORD[56+rax] lea rax,[$L$inc] lea r13,[128+r9*1+rdx] shr r9,5 movdqa xmm0,XMMWORD[rax] movdqa xmm1,XMMWORD[16+rax] lea r10,[((88-112))+r9*1+rsp] lea r12,[128+rdx] pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 DB 0x67,0x67 movdqa xmm2,xmm1 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 DB 0x67 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[112+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[128+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[144+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[160+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[176+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[192+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[208+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[224+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[240+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[256+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[272+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[288+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[304+r10],xmm0 paddd xmm3,xmm2 DB 0x67 pcmpeqd xmm2,xmm5 movdqa XMMWORD[320+r10],xmm1 pcmpeqd xmm3,xmm5 movdqa XMMWORD[336+r10],xmm2 pand xmm0,XMMWORD[64+r12] pand xmm1,XMMWORD[80+r12] pand xmm2,XMMWORD[96+r12] movdqa XMMWORD[352+r10],xmm3 pand xmm3,XMMWORD[112+r12] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-128))+r12] movdqa xmm5,XMMWORD[((-112))+r12] movdqa xmm2,XMMWORD[((-96))+r12] pand xmm4,XMMWORD[112+r10] movdqa xmm3,XMMWORD[((-80))+r12] pand xmm5,XMMWORD[128+r10] por xmm0,xmm4 pand xmm2,XMMWORD[144+r10] por xmm1,xmm5 pand xmm3,XMMWORD[160+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-64))+r12] movdqa xmm5,XMMWORD[((-48))+r12] movdqa xmm2,XMMWORD[((-32))+r12] pand xmm4,XMMWORD[176+r10] movdqa xmm3,XMMWORD[((-16))+r12] pand xmm5,XMMWORD[192+r10] por xmm0,xmm4 pand xmm2,XMMWORD[208+r10] por xmm1,xmm5 pand xmm3,XMMWORD[224+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[r12] movdqa xmm5,XMMWORD[16+r12] movdqa xmm2,XMMWORD[32+r12] pand xmm4,XMMWORD[240+r10] movdqa xmm3,XMMWORD[48+r12] pand xmm5,XMMWORD[256+r10] por xmm0,xmm4 pand xmm2,XMMWORD[272+r10] por xmm1,xmm5 pand xmm3,XMMWORD[288+r10] por xmm0,xmm2 por xmm1,xmm3 por xmm0,xmm1 pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea r12,[256+r12] DB 102,72,15,126,195 mov QWORD[((16+8))+rsp],r13 mov QWORD[((56+8))+rsp],rdi mov r8,QWORD[r8] mov rax,QWORD[rsi] lea rsi,[r9*1+rsi] neg r9 mov rbp,r8 mul rbx mov r10,rax mov rax,QWORD[rcx] imul rbp,r10 lea r14,[((64+8))+rsp] mov r11,rdx mul rbp add r10,rax mov rax,QWORD[8+r9*1+rsi] adc rdx,0 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+r9*1+rsi] adc rdx,0 add rdi,r11 lea r15,[32+r9] lea rcx,[32+rcx] adc rdx,0 mov QWORD[r14],rdi mov r13,rdx jmp NEAR $L$1st4x ALIGN 32 $L$1st4x: mul rbx add r10,rax mov rax,QWORD[((-16))+rcx] lea r14,[32+r14] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*1+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r14],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r15*1+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r14],rdi mov r13,rdx mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[8+r15*1+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-8))+r14],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+r15*1+rsi] adc rdx,0 add rdi,r11 lea rcx,[32+rcx] adc rdx,0 mov QWORD[r14],rdi mov r13,rdx add r15,32 jnz NEAR $L$1st4x mul rbx add r10,rax mov rax,QWORD[((-16))+rcx] lea r14,[32+r14] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-24))+r14],r13 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+rcx] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r9*1+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-16))+r14],rdi mov r13,rdx lea rcx,[r9*1+rcx] xor rdi,rdi add r13,r10 adc rdi,0 mov QWORD[((-8))+r14],r13 jmp NEAR $L$outer4x ALIGN 32 $L$outer4x: lea rdx,[((16+128))+r14] pxor xmm4,xmm4 pxor xmm5,xmm5 movdqa xmm0,XMMWORD[((-128))+r12] movdqa xmm1,XMMWORD[((-112))+r12] movdqa xmm2,XMMWORD[((-96))+r12] movdqa xmm3,XMMWORD[((-80))+r12] pand xmm0,XMMWORD[((-128))+rdx] pand xmm1,XMMWORD[((-112))+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[((-96))+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[((-80))+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[((-64))+r12] movdqa xmm1,XMMWORD[((-48))+r12] movdqa xmm2,XMMWORD[((-32))+r12] movdqa xmm3,XMMWORD[((-16))+r12] pand xmm0,XMMWORD[((-64))+rdx] pand xmm1,XMMWORD[((-48))+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[((-32))+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[((-16))+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[r12] movdqa xmm1,XMMWORD[16+r12] movdqa xmm2,XMMWORD[32+r12] movdqa xmm3,XMMWORD[48+r12] pand xmm0,XMMWORD[rdx] pand xmm1,XMMWORD[16+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[32+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[48+rdx] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[64+r12] movdqa xmm1,XMMWORD[80+r12] movdqa xmm2,XMMWORD[96+r12] movdqa xmm3,XMMWORD[112+r12] pand xmm0,XMMWORD[64+rdx] pand xmm1,XMMWORD[80+rdx] por xmm4,xmm0 pand xmm2,XMMWORD[96+rdx] por xmm5,xmm1 pand xmm3,XMMWORD[112+rdx] por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea r12,[256+r12] DB 102,72,15,126,195 mov r10,QWORD[r9*1+r14] mov rbp,r8 mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 imul rbp,r10 mov r11,rdx mov QWORD[r14],rdi lea r14,[r9*1+r14] mul rbp add r10,rax mov rax,QWORD[8+r9*1+rsi] adc rdx,0 mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 add r11,QWORD[8+r14] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+r9*1+rsi] adc rdx,0 add rdi,r11 lea r15,[32+r9] lea rcx,[32+rcx] adc rdx,0 mov r13,rdx jmp NEAR $L$inner4x ALIGN 32 $L$inner4x: mul rbx add r10,rax mov rax,QWORD[((-16))+rcx] adc rdx,0 add r10,QWORD[16+r14] lea r14,[32+r14] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+r15*1+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-32))+r14],rdi mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[((-8))+rcx] adc rdx,0 add r11,QWORD[((-8))+r14] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r15*1+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-24))+r14],r13 mov r13,rdx mul rbx add r10,rax mov rax,QWORD[rcx] adc rdx,0 add r10,QWORD[r14] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[8+r15*1+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-16))+r14],rdi mov rdi,rdx mul rbx add r11,rax mov rax,QWORD[8+rcx] adc rdx,0 add r11,QWORD[8+r14] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[16+r15*1+rsi] adc rdx,0 add rdi,r11 lea rcx,[32+rcx] adc rdx,0 mov QWORD[((-8))+r14],r13 mov r13,rdx add r15,32 jnz NEAR $L$inner4x mul rbx add r10,rax mov rax,QWORD[((-16))+rcx] adc rdx,0 add r10,QWORD[16+r14] lea r14,[32+r14] adc rdx,0 mov r11,rdx mul rbp add r13,rax mov rax,QWORD[((-8))+rsi] adc rdx,0 add r13,r10 adc rdx,0 mov QWORD[((-32))+r14],rdi mov rdi,rdx mul rbx add r11,rax mov rax,rbp mov rbp,QWORD[((-8))+rcx] adc rdx,0 add r11,QWORD[((-8))+r14] adc rdx,0 mov r10,rdx mul rbp add rdi,rax mov rax,QWORD[r9*1+rsi] adc rdx,0 add rdi,r11 adc rdx,0 mov QWORD[((-24))+r14],r13 mov r13,rdx mov QWORD[((-16))+r14],rdi lea rcx,[r9*1+rcx] xor rdi,rdi add r13,r10 adc rdi,0 add r13,QWORD[r14] adc rdi,0 mov QWORD[((-8))+r14],r13 cmp r12,QWORD[((16+8))+rsp] jb NEAR $L$outer4x xor rax,rax sub rbp,r13 adc r15,r15 or rdi,r15 sub rax,rdi lea rbx,[r9*1+r14] mov r12,QWORD[rcx] lea rbp,[rcx] mov rcx,r9 sar rcx,3+2 mov rdi,QWORD[((56+8))+rsp] dec r12 xor r10,r10 mov r13,QWORD[8+rbp] mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] jmp NEAR $L$sqr4x_sub_entry global GFp_bn_power5 ALIGN 32 GFp_bn_power5: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_GFp_bn_power5: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov rax,rsp lea r11,[GFp_ia32cap_P] mov r11d,DWORD[8+r11] and r11d,0x80108 cmp r11d,0x80108 je NEAR $L$powerx5_enter push rbx push rbp push r12 push r13 push r14 push r15 $L$power5_prologue: shl r9d,3 lea r10d,[r9*2+r9] neg r9 mov r8,QWORD[r8] lea r11,[((-320))+r9*2+rsp] mov rbp,rsp sub r11,rdi and r11,4095 cmp r10,r11 jb NEAR $L$pwr_sp_alt sub rbp,r11 lea rbp,[((-320))+r9*2+rbp] jmp NEAR $L$pwr_sp_done ALIGN 32 $L$pwr_sp_alt: lea r10,[((4096-320))+r9*2] lea rbp,[((-320))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$pwr_sp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$pwr_page_walk jmp NEAR $L$pwr_page_walk_done $L$pwr_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$pwr_page_walk $L$pwr_page_walk_done: mov r10,r9 neg r9 mov QWORD[32+rsp],r8 mov QWORD[40+rsp],rax $L$power5_body: DB 102,72,15,110,207 DB 102,72,15,110,209 DB 102,73,15,110,218 DB 102,72,15,110,226 call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal DB 102,72,15,126,209 DB 102,72,15,126,226 mov rdi,rsi mov rax,QWORD[40+rsp] lea r8,[32+rsp] call mul4x_internal mov rsi,QWORD[40+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$power5_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_bn_power5: global GFp_bn_sqr8x_internal ALIGN 32 GFp_bn_sqr8x_internal: __bn_sqr8x_internal: lea rbp,[32+r10] lea rsi,[r9*1+rsi] mov rcx,r9 mov r14,QWORD[((-32))+rbp*1+rsi] lea rdi,[((48+8))+r9*2+rsp] mov rax,QWORD[((-24))+rbp*1+rsi] lea rdi,[((-32))+rbp*1+rdi] mov rbx,QWORD[((-16))+rbp*1+rsi] mov r15,rax mul r14 mov r10,rax mov rax,rbx mov r11,rdx mov QWORD[((-24))+rbp*1+rdi],r10 mul r14 add r11,rax mov rax,rbx adc rdx,0 mov QWORD[((-16))+rbp*1+rdi],r11 mov r10,rdx mov rbx,QWORD[((-8))+rbp*1+rsi] mul r15 mov r12,rax mov rax,rbx mov r13,rdx lea rcx,[rbp] mul r14 add r10,rax mov rax,rbx mov r11,rdx adc r11,0 add r10,r12 adc r11,0 mov QWORD[((-8))+rcx*1+rdi],r10 jmp NEAR $L$sqr4x_1st ALIGN 32 $L$sqr4x_1st: mov rbx,QWORD[rcx*1+rsi] mul r15 add r13,rax mov rax,rbx mov r12,rdx adc r12,0 mul r14 add r11,rax mov rax,rbx mov rbx,QWORD[8+rcx*1+rsi] mov r10,rdx adc r10,0 add r11,r13 adc r10,0 mul r15 add r12,rax mov rax,rbx mov QWORD[rcx*1+rdi],r11 mov r13,rdx adc r13,0 mul r14 add r10,rax mov rax,rbx mov rbx,QWORD[16+rcx*1+rsi] mov r11,rdx adc r11,0 add r10,r12 adc r11,0 mul r15 add r13,rax mov rax,rbx mov QWORD[8+rcx*1+rdi],r10 mov r12,rdx adc r12,0 mul r14 add r11,rax mov rax,rbx mov rbx,QWORD[24+rcx*1+rsi] mov r10,rdx adc r10,0 add r11,r13 adc r10,0 mul r15 add r12,rax mov rax,rbx mov QWORD[16+rcx*1+rdi],r11 mov r13,rdx adc r13,0 lea rcx,[32+rcx] mul r14 add r10,rax mov rax,rbx mov r11,rdx adc r11,0 add r10,r12 adc r11,0 mov QWORD[((-8))+rcx*1+rdi],r10 cmp rcx,0 jne NEAR $L$sqr4x_1st mul r15 add r13,rax lea rbp,[16+rbp] adc rdx,0 add r13,r11 adc rdx,0 mov QWORD[rdi],r13 mov r12,rdx mov QWORD[8+rdi],rdx jmp NEAR $L$sqr4x_outer ALIGN 32 $L$sqr4x_outer: mov r14,QWORD[((-32))+rbp*1+rsi] lea rdi,[((48+8))+r9*2+rsp] mov rax,QWORD[((-24))+rbp*1+rsi] lea rdi,[((-32))+rbp*1+rdi] mov rbx,QWORD[((-16))+rbp*1+rsi] mov r15,rax mul r14 mov r10,QWORD[((-24))+rbp*1+rdi] add r10,rax mov rax,rbx adc rdx,0 mov QWORD[((-24))+rbp*1+rdi],r10 mov r11,rdx mul r14 add r11,rax mov rax,rbx adc rdx,0 add r11,QWORD[((-16))+rbp*1+rdi] mov r10,rdx adc r10,0 mov QWORD[((-16))+rbp*1+rdi],r11 xor r12,r12 mov rbx,QWORD[((-8))+rbp*1+rsi] mul r15 add r12,rax mov rax,rbx adc rdx,0 add r12,QWORD[((-8))+rbp*1+rdi] mov r13,rdx adc r13,0 mul r14 add r10,rax mov rax,rbx adc rdx,0 add r10,r12 mov r11,rdx adc r11,0 mov QWORD[((-8))+rbp*1+rdi],r10 lea rcx,[rbp] jmp NEAR $L$sqr4x_inner ALIGN 32 $L$sqr4x_inner: mov rbx,QWORD[rcx*1+rsi] mul r15 add r13,rax mov rax,rbx mov r12,rdx adc r12,0 add r13,QWORD[rcx*1+rdi] adc r12,0 DB 0x67 mul r14 add r11,rax mov rax,rbx mov rbx,QWORD[8+rcx*1+rsi] mov r10,rdx adc r10,0 add r11,r13 adc r10,0 mul r15 add r12,rax mov QWORD[rcx*1+rdi],r11 mov rax,rbx mov r13,rdx adc r13,0 add r12,QWORD[8+rcx*1+rdi] lea rcx,[16+rcx] adc r13,0 mul r14 add r10,rax mov rax,rbx adc rdx,0 add r10,r12 mov r11,rdx adc r11,0 mov QWORD[((-8))+rcx*1+rdi],r10 cmp rcx,0 jne NEAR $L$sqr4x_inner DB 0x67 mul r15 add r13,rax adc rdx,0 add r13,r11 adc rdx,0 mov QWORD[rdi],r13 mov r12,rdx mov QWORD[8+rdi],rdx add rbp,16 jnz NEAR $L$sqr4x_outer mov r14,QWORD[((-32))+rsi] lea rdi,[((48+8))+r9*2+rsp] mov rax,QWORD[((-24))+rsi] lea rdi,[((-32))+rbp*1+rdi] mov rbx,QWORD[((-16))+rsi] mov r15,rax mul r14 add r10,rax mov rax,rbx mov r11,rdx adc r11,0 mul r14 add r11,rax mov rax,rbx mov QWORD[((-24))+rdi],r10 mov r10,rdx adc r10,0 add r11,r13 mov rbx,QWORD[((-8))+rsi] adc r10,0 mul r15 add r12,rax mov rax,rbx mov QWORD[((-16))+rdi],r11 mov r13,rdx adc r13,0 mul r14 add r10,rax mov rax,rbx mov r11,rdx adc r11,0 add r10,r12 adc r11,0 mov QWORD[((-8))+rdi],r10 mul r15 add r13,rax mov rax,QWORD[((-16))+rsi] adc rdx,0 add r13,r11 adc rdx,0 mov QWORD[rdi],r13 mov r12,rdx mov QWORD[8+rdi],rdx mul rbx add rbp,16 xor r14,r14 sub rbp,r9 xor r15,r15 add rax,r12 adc rdx,0 mov QWORD[8+rdi],rax mov QWORD[16+rdi],rdx mov QWORD[24+rdi],r15 mov rax,QWORD[((-16))+rbp*1+rsi] lea rdi,[((48+8))+rsp] xor r10,r10 mov r11,QWORD[8+rdi] lea r12,[r10*2+r14] shr r10,63 lea r13,[r11*2+rcx] shr r11,63 or r13,r10 mov r10,QWORD[16+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[24+rdi] adc r12,rax mov rax,QWORD[((-8))+rbp*1+rsi] mov QWORD[rdi],r12 adc r13,rdx lea rbx,[r10*2+r14] mov QWORD[8+rdi],r13 sbb r15,r15 shr r10,63 lea r8,[r11*2+rcx] shr r11,63 or r8,r10 mov r10,QWORD[32+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[40+rdi] adc rbx,rax mov rax,QWORD[rbp*1+rsi] mov QWORD[16+rdi],rbx adc r8,rdx lea rbp,[16+rbp] mov QWORD[24+rdi],r8 sbb r15,r15 lea rdi,[64+rdi] jmp NEAR $L$sqr4x_shift_n_add ALIGN 32 $L$sqr4x_shift_n_add: lea r12,[r10*2+r14] shr r10,63 lea r13,[r11*2+rcx] shr r11,63 or r13,r10 mov r10,QWORD[((-16))+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[((-8))+rdi] adc r12,rax mov rax,QWORD[((-8))+rbp*1+rsi] mov QWORD[((-32))+rdi],r12 adc r13,rdx lea rbx,[r10*2+r14] mov QWORD[((-24))+rdi],r13 sbb r15,r15 shr r10,63 lea r8,[r11*2+rcx] shr r11,63 or r8,r10 mov r10,QWORD[rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[8+rdi] adc rbx,rax mov rax,QWORD[rbp*1+rsi] mov QWORD[((-16))+rdi],rbx adc r8,rdx lea r12,[r10*2+r14] mov QWORD[((-8))+rdi],r8 sbb r15,r15 shr r10,63 lea r13,[r11*2+rcx] shr r11,63 or r13,r10 mov r10,QWORD[16+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[24+rdi] adc r12,rax mov rax,QWORD[8+rbp*1+rsi] mov QWORD[rdi],r12 adc r13,rdx lea rbx,[r10*2+r14] mov QWORD[8+rdi],r13 sbb r15,r15 shr r10,63 lea r8,[r11*2+rcx] shr r11,63 or r8,r10 mov r10,QWORD[32+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[40+rdi] adc rbx,rax mov rax,QWORD[16+rbp*1+rsi] mov QWORD[16+rdi],rbx adc r8,rdx mov QWORD[24+rdi],r8 sbb r15,r15 lea rdi,[64+rdi] add rbp,32 jnz NEAR $L$sqr4x_shift_n_add lea r12,[r10*2+r14] DB 0x67 shr r10,63 lea r13,[r11*2+rcx] shr r11,63 or r13,r10 mov r10,QWORD[((-16))+rdi] mov r14,r11 mul rax neg r15 mov r11,QWORD[((-8))+rdi] adc r12,rax mov rax,QWORD[((-8))+rsi] mov QWORD[((-32))+rdi],r12 adc r13,rdx lea rbx,[r10*2+r14] mov QWORD[((-24))+rdi],r13 sbb r15,r15 shr r10,63 lea r8,[r11*2+rcx] shr r11,63 or r8,r10 mul rax neg r15 adc rbx,rax adc r8,rdx mov QWORD[((-16))+rdi],rbx mov QWORD[((-8))+rdi],r8 DB 102,72,15,126,213 __bn_sqr8x_reduction: xor rax,rax lea rcx,[rbp*1+r9] lea rdx,[((48+8))+r9*2+rsp] mov QWORD[((0+8))+rsp],rcx lea rdi,[((48+8))+r9*1+rsp] mov QWORD[((8+8))+rsp],rdx neg r9 jmp NEAR $L$8x_reduction_loop ALIGN 32 $L$8x_reduction_loop: lea rdi,[r9*1+rdi] DB 0x66 mov rbx,QWORD[rdi] mov r9,QWORD[8+rdi] mov r10,QWORD[16+rdi] mov r11,QWORD[24+rdi] mov r12,QWORD[32+rdi] mov r13,QWORD[40+rdi] mov r14,QWORD[48+rdi] mov r15,QWORD[56+rdi] mov QWORD[rdx],rax lea rdi,[64+rdi] DB 0x67 mov r8,rbx imul rbx,QWORD[((32+8))+rsp] mov rax,QWORD[rbp] mov ecx,8 jmp NEAR $L$8x_reduce ALIGN 32 $L$8x_reduce: mul rbx mov rax,QWORD[8+rbp] neg r8 mov r8,rdx adc r8,0 mul rbx add r9,rax mov rax,QWORD[16+rbp] adc rdx,0 add r8,r9 mov QWORD[((48-8+8))+rcx*8+rsp],rbx mov r9,rdx adc r9,0 mul rbx add r10,rax mov rax,QWORD[24+rbp] adc rdx,0 add r9,r10 mov rsi,QWORD[((32+8))+rsp] mov r10,rdx adc r10,0 mul rbx add r11,rax mov rax,QWORD[32+rbp] adc rdx,0 imul rsi,r8 add r10,r11 mov r11,rdx adc r11,0 mul rbx add r12,rax mov rax,QWORD[40+rbp] adc rdx,0 add r11,r12 mov r12,rdx adc r12,0 mul rbx add r13,rax mov rax,QWORD[48+rbp] adc rdx,0 add r12,r13 mov r13,rdx adc r13,0 mul rbx add r14,rax mov rax,QWORD[56+rbp] adc rdx,0 add r13,r14 mov r14,rdx adc r14,0 mul rbx mov rbx,rsi add r15,rax mov rax,QWORD[rbp] adc rdx,0 add r14,r15 mov r15,rdx adc r15,0 dec ecx jnz NEAR $L$8x_reduce lea rbp,[64+rbp] xor rax,rax mov rdx,QWORD[((8+8))+rsp] cmp rbp,QWORD[((0+8))+rsp] jae NEAR $L$8x_no_tail DB 0x66 add r8,QWORD[rdi] adc r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] sbb rsi,rsi mov rbx,QWORD[((48+56+8))+rsp] mov ecx,8 mov rax,QWORD[rbp] jmp NEAR $L$8x_tail ALIGN 32 $L$8x_tail: mul rbx add r8,rax mov rax,QWORD[8+rbp] mov QWORD[rdi],r8 mov r8,rdx adc r8,0 mul rbx add r9,rax mov rax,QWORD[16+rbp] adc rdx,0 add r8,r9 lea rdi,[8+rdi] mov r9,rdx adc r9,0 mul rbx add r10,rax mov rax,QWORD[24+rbp] adc rdx,0 add r9,r10 mov r10,rdx adc r10,0 mul rbx add r11,rax mov rax,QWORD[32+rbp] adc rdx,0 add r10,r11 mov r11,rdx adc r11,0 mul rbx add r12,rax mov rax,QWORD[40+rbp] adc rdx,0 add r11,r12 mov r12,rdx adc r12,0 mul rbx add r13,rax mov rax,QWORD[48+rbp] adc rdx,0 add r12,r13 mov r13,rdx adc r13,0 mul rbx add r14,rax mov rax,QWORD[56+rbp] adc rdx,0 add r13,r14 mov r14,rdx adc r14,0 mul rbx mov rbx,QWORD[((48-16+8))+rcx*8+rsp] add r15,rax adc rdx,0 add r14,r15 mov rax,QWORD[rbp] mov r15,rdx adc r15,0 dec ecx jnz NEAR $L$8x_tail lea rbp,[64+rbp] mov rdx,QWORD[((8+8))+rsp] cmp rbp,QWORD[((0+8))+rsp] jae NEAR $L$8x_tail_done mov rbx,QWORD[((48+56+8))+rsp] neg rsi mov rax,QWORD[rbp] adc r8,QWORD[rdi] adc r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] sbb rsi,rsi mov ecx,8 jmp NEAR $L$8x_tail ALIGN 32 $L$8x_tail_done: xor rax,rax add r8,QWORD[rdx] adc r9,0 adc r10,0 adc r11,0 adc r12,0 adc r13,0 adc r14,0 adc r15,0 adc rax,0 neg rsi $L$8x_no_tail: adc r8,QWORD[rdi] adc r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] adc rax,0 mov rcx,QWORD[((-8))+rbp] xor rsi,rsi DB 102,72,15,126,213 mov QWORD[rdi],r8 mov QWORD[8+rdi],r9 DB 102,73,15,126,217 mov QWORD[16+rdi],r10 mov QWORD[24+rdi],r11 mov QWORD[32+rdi],r12 mov QWORD[40+rdi],r13 mov QWORD[48+rdi],r14 mov QWORD[56+rdi],r15 lea rdi,[64+rdi] cmp rdi,rdx jb NEAR $L$8x_reduction_loop DB 0F3h,0C3h ;repret ALIGN 32 __bn_post4x_internal: mov r12,QWORD[rbp] lea rbx,[r9*1+rdi] mov rcx,r9 DB 102,72,15,126,207 neg rax DB 102,72,15,126,206 sar rcx,3+2 dec r12 xor r10,r10 mov r13,QWORD[8+rbp] mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] jmp NEAR $L$sqr4x_sub_entry ALIGN 16 $L$sqr4x_sub: mov r12,QWORD[rbp] mov r13,QWORD[8+rbp] mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] $L$sqr4x_sub_entry: lea rbp,[32+rbp] not r12 not r13 not r14 not r15 and r12,rax and r13,rax and r14,rax and r15,rax neg r10 adc r12,QWORD[rbx] adc r13,QWORD[8+rbx] adc r14,QWORD[16+rbx] adc r15,QWORD[24+rbx] mov QWORD[rdi],r12 lea rbx,[32+rbx] mov QWORD[8+rdi],r13 sbb r10,r10 mov QWORD[16+rdi],r14 mov QWORD[24+rdi],r15 lea rdi,[32+rdi] inc rcx jnz NEAR $L$sqr4x_sub mov r10,r9 neg r9 DB 0F3h,0C3h ;repret global GFp_bn_from_montgomery ALIGN 32 GFp_bn_from_montgomery: test DWORD[48+rsp],7 jz NEAR bn_from_mont8x xor eax,eax DB 0F3h,0C3h ;repret ALIGN 32 bn_from_mont8x: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_from_mont8x: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] DB 0x67 mov rax,rsp push rbx push rbp push r12 push r13 push r14 push r15 $L$from_prologue: shl r9d,3 lea r10,[r9*2+r9] neg r9 mov r8,QWORD[r8] lea r11,[((-320))+r9*2+rsp] mov rbp,rsp sub r11,rdi and r11,4095 cmp r10,r11 jb NEAR $L$from_sp_alt sub rbp,r11 lea rbp,[((-320))+r9*2+rbp] jmp NEAR $L$from_sp_done ALIGN 32 $L$from_sp_alt: lea r10,[((4096-320))+r9*2] lea rbp,[((-320))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$from_sp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$from_page_walk jmp NEAR $L$from_page_walk_done $L$from_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$from_page_walk $L$from_page_walk_done: mov r10,r9 neg r9 mov QWORD[32+rsp],r8 mov QWORD[40+rsp],rax $L$from_body: mov r11,r9 lea rax,[48+rsp] pxor xmm0,xmm0 jmp NEAR $L$mul_by_1 ALIGN 32 $L$mul_by_1: movdqu xmm1,XMMWORD[rsi] movdqu xmm2,XMMWORD[16+rsi] movdqu xmm3,XMMWORD[32+rsi] movdqa XMMWORD[r9*1+rax],xmm0 movdqu xmm4,XMMWORD[48+rsi] movdqa XMMWORD[16+r9*1+rax],xmm0 DB 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 movdqa XMMWORD[rax],xmm1 movdqa XMMWORD[32+r9*1+rax],xmm0 movdqa XMMWORD[16+rax],xmm2 movdqa XMMWORD[48+r9*1+rax],xmm0 movdqa XMMWORD[32+rax],xmm3 movdqa XMMWORD[48+rax],xmm4 lea rax,[64+rax] sub r11,64 jnz NEAR $L$mul_by_1 DB 102,72,15,110,207 DB 102,72,15,110,209 DB 0x67 mov rbp,rcx DB 102,73,15,110,218 lea r11,[GFp_ia32cap_P] mov r11d,DWORD[8+r11] and r11d,0x80108 cmp r11d,0x80108 jne NEAR $L$from_mont_nox lea rdi,[r9*1+rax] call __bn_sqrx8x_reduction call __bn_postx4x_internal pxor xmm0,xmm0 lea rax,[48+rsp] jmp NEAR $L$from_mont_zero ALIGN 32 $L$from_mont_nox: call __bn_sqr8x_reduction call __bn_post4x_internal pxor xmm0,xmm0 lea rax,[48+rsp] jmp NEAR $L$from_mont_zero ALIGN 32 $L$from_mont_zero: mov rsi,QWORD[40+rsp] movdqa XMMWORD[rax],xmm0 movdqa XMMWORD[16+rax],xmm0 movdqa XMMWORD[32+rax],xmm0 movdqa XMMWORD[48+rax],xmm0 lea rax,[64+rax] sub r9,32 jnz NEAR $L$from_mont_zero mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$from_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_from_mont8x: ALIGN 32 bn_mulx4x_mont_gather5: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_mulx4x_mont_gather5: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov rax,rsp $L$mulx4x_enter: push rbx push rbp push r12 push r13 push r14 push r15 $L$mulx4x_prologue: shl r9d,3 lea r10,[r9*2+r9] neg r9 mov r8,QWORD[r8] lea r11,[((-320))+r9*2+rsp] mov rbp,rsp sub r11,rdi and r11,4095 cmp r10,r11 jb NEAR $L$mulx4xsp_alt sub rbp,r11 lea rbp,[((-320))+r9*2+rbp] jmp NEAR $L$mulx4xsp_done $L$mulx4xsp_alt: lea r10,[((4096-320))+r9*2] lea rbp,[((-320))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$mulx4xsp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mulx4x_page_walk jmp NEAR $L$mulx4x_page_walk_done $L$mulx4x_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$mulx4x_page_walk $L$mulx4x_page_walk_done: mov QWORD[32+rsp],r8 mov QWORD[40+rsp],rax $L$mulx4x_body: call mulx4x_internal mov rsi,QWORD[40+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$mulx4x_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_mulx4x_mont_gather5: ALIGN 32 mulx4x_internal: mov QWORD[8+rsp],r9 mov r10,r9 neg r9 shl r9,5 neg r10 lea r13,[128+r9*1+rdx] shr r9,5+5 movd xmm5,DWORD[56+rax] sub r9,1 lea rax,[$L$inc] mov QWORD[((16+8))+rsp],r13 mov QWORD[((24+8))+rsp],r9 mov QWORD[((56+8))+rsp],rdi movdqa xmm0,XMMWORD[rax] movdqa xmm1,XMMWORD[16+rax] lea r10,[((88-112))+r10*1+rsp] lea rdi,[128+rdx] pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 DB 0x67 movdqa xmm2,xmm1 DB 0x67 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[112+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[128+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[144+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[160+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[176+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[192+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[208+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[224+r10],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[240+r10],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[256+r10],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[272+r10],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[288+r10],xmm3 movdqa xmm3,xmm4 DB 0x67 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[304+r10],xmm0 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[320+r10],xmm1 pcmpeqd xmm3,xmm5 movdqa XMMWORD[336+r10],xmm2 pand xmm0,XMMWORD[64+rdi] pand xmm1,XMMWORD[80+rdi] pand xmm2,XMMWORD[96+rdi] movdqa XMMWORD[352+r10],xmm3 pand xmm3,XMMWORD[112+rdi] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-128))+rdi] movdqa xmm5,XMMWORD[((-112))+rdi] movdqa xmm2,XMMWORD[((-96))+rdi] pand xmm4,XMMWORD[112+r10] movdqa xmm3,XMMWORD[((-80))+rdi] pand xmm5,XMMWORD[128+r10] por xmm0,xmm4 pand xmm2,XMMWORD[144+r10] por xmm1,xmm5 pand xmm3,XMMWORD[160+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[((-64))+rdi] movdqa xmm5,XMMWORD[((-48))+rdi] movdqa xmm2,XMMWORD[((-32))+rdi] pand xmm4,XMMWORD[176+r10] movdqa xmm3,XMMWORD[((-16))+rdi] pand xmm5,XMMWORD[192+r10] por xmm0,xmm4 pand xmm2,XMMWORD[208+r10] por xmm1,xmm5 pand xmm3,XMMWORD[224+r10] por xmm0,xmm2 por xmm1,xmm3 movdqa xmm4,XMMWORD[rdi] movdqa xmm5,XMMWORD[16+rdi] movdqa xmm2,XMMWORD[32+rdi] pand xmm4,XMMWORD[240+r10] movdqa xmm3,XMMWORD[48+rdi] pand xmm5,XMMWORD[256+r10] por xmm0,xmm4 pand xmm2,XMMWORD[272+r10] por xmm1,xmm5 pand xmm3,XMMWORD[288+r10] por xmm0,xmm2 por xmm1,xmm3 pxor xmm0,xmm1 pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea rdi,[256+rdi] DB 102,72,15,126,194 lea rbx,[((64+32+8))+rsp] mov r9,rdx mulx rax,r8,QWORD[rsi] mulx r12,r11,QWORD[8+rsi] add r11,rax mulx r13,rax,QWORD[16+rsi] adc r12,rax adc r13,0 mulx r14,rax,QWORD[24+rsi] mov r15,r8 imul r8,QWORD[((32+8))+rsp] xor rbp,rbp mov rdx,r8 mov QWORD[((8+8))+rsp],rdi lea rsi,[32+rsi] adcx r13,rax adcx r14,rbp mulx r10,rax,QWORD[rcx] adcx r15,rax adox r10,r11 mulx r11,rax,QWORD[8+rcx] adcx r10,rax adox r11,r12 mulx r12,rax,QWORD[16+rcx] mov rdi,QWORD[((24+8))+rsp] mov QWORD[((-32))+rbx],r10 adcx r11,rax adox r12,r13 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-24))+rbx],r11 adcx r12,rax adox r15,rbp lea rcx,[32+rcx] mov QWORD[((-16))+rbx],r12 jmp NEAR $L$mulx4x_1st ALIGN 32 $L$mulx4x_1st: adcx r15,rbp mulx rax,r10,QWORD[rsi] adcx r10,r14 mulx r14,r11,QWORD[8+rsi] adcx r11,rax mulx rax,r12,QWORD[16+rsi] adcx r12,r14 mulx r14,r13,QWORD[24+rsi] DB 0x67,0x67 mov rdx,r8 adcx r13,rax adcx r14,rbp lea rsi,[32+rsi] lea rbx,[32+rbx] adox r10,r15 mulx r15,rax,QWORD[rcx] adcx r10,rax adox r11,r15 mulx r15,rax,QWORD[8+rcx] adcx r11,rax adox r12,r15 mulx r15,rax,QWORD[16+rcx] mov QWORD[((-40))+rbx],r10 adcx r12,rax mov QWORD[((-32))+rbx],r11 adox r13,r15 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov QWORD[((-24))+rbx],r12 adcx r13,rax adox r15,rbp lea rcx,[32+rcx] mov QWORD[((-16))+rbx],r13 dec rdi jnz NEAR $L$mulx4x_1st mov rax,QWORD[8+rsp] adc r15,rbp lea rsi,[rax*1+rsi] add r14,r15 mov rdi,QWORD[((8+8))+rsp] adc rbp,rbp mov QWORD[((-8))+rbx],r14 jmp NEAR $L$mulx4x_outer ALIGN 32 $L$mulx4x_outer: lea r10,[((16-256))+rbx] pxor xmm4,xmm4 DB 0x67,0x67 pxor xmm5,xmm5 movdqa xmm0,XMMWORD[((-128))+rdi] movdqa xmm1,XMMWORD[((-112))+rdi] movdqa xmm2,XMMWORD[((-96))+rdi] pand xmm0,XMMWORD[256+r10] movdqa xmm3,XMMWORD[((-80))+rdi] pand xmm1,XMMWORD[272+r10] por xmm4,xmm0 pand xmm2,XMMWORD[288+r10] por xmm5,xmm1 pand xmm3,XMMWORD[304+r10] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[((-64))+rdi] movdqa xmm1,XMMWORD[((-48))+rdi] movdqa xmm2,XMMWORD[((-32))+rdi] pand xmm0,XMMWORD[320+r10] movdqa xmm3,XMMWORD[((-16))+rdi] pand xmm1,XMMWORD[336+r10] por xmm4,xmm0 pand xmm2,XMMWORD[352+r10] por xmm5,xmm1 pand xmm3,XMMWORD[368+r10] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[rdi] movdqa xmm1,XMMWORD[16+rdi] movdqa xmm2,XMMWORD[32+rdi] pand xmm0,XMMWORD[384+r10] movdqa xmm3,XMMWORD[48+rdi] pand xmm1,XMMWORD[400+r10] por xmm4,xmm0 pand xmm2,XMMWORD[416+r10] por xmm5,xmm1 pand xmm3,XMMWORD[432+r10] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[64+rdi] movdqa xmm1,XMMWORD[80+rdi] movdqa xmm2,XMMWORD[96+rdi] pand xmm0,XMMWORD[448+r10] movdqa xmm3,XMMWORD[112+rdi] pand xmm1,XMMWORD[464+r10] por xmm4,xmm0 pand xmm2,XMMWORD[480+r10] por xmm5,xmm1 pand xmm3,XMMWORD[496+r10] por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea rdi,[256+rdi] DB 102,72,15,126,194 mov QWORD[rbx],rbp lea rbx,[32+rax*1+rbx] mulx r11,r8,QWORD[rsi] xor rbp,rbp mov r9,rdx mulx r12,r14,QWORD[8+rsi] adox r8,QWORD[((-32))+rbx] adcx r11,r14 mulx r13,r15,QWORD[16+rsi] adox r11,QWORD[((-24))+rbx] adcx r12,r15 mulx r14,rdx,QWORD[24+rsi] adox r12,QWORD[((-16))+rbx] adcx r13,rdx lea rcx,[rax*1+rcx] lea rsi,[32+rsi] adox r13,QWORD[((-8))+rbx] adcx r14,rbp adox r14,rbp mov r15,r8 imul r8,QWORD[((32+8))+rsp] mov rdx,r8 xor rbp,rbp mov QWORD[((8+8))+rsp],rdi mulx r10,rax,QWORD[rcx] adcx r15,rax adox r10,r11 mulx r11,rax,QWORD[8+rcx] adcx r10,rax adox r11,r12 mulx r12,rax,QWORD[16+rcx] adcx r11,rax adox r12,r13 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 mov rdi,QWORD[((24+8))+rsp] mov QWORD[((-32))+rbx],r10 adcx r12,rax mov QWORD[((-24))+rbx],r11 adox r15,rbp mov QWORD[((-16))+rbx],r12 lea rcx,[32+rcx] jmp NEAR $L$mulx4x_inner ALIGN 32 $L$mulx4x_inner: mulx rax,r10,QWORD[rsi] adcx r15,rbp adox r10,r14 mulx r14,r11,QWORD[8+rsi] adcx r10,QWORD[rbx] adox r11,rax mulx rax,r12,QWORD[16+rsi] adcx r11,QWORD[8+rbx] adox r12,r14 mulx r14,r13,QWORD[24+rsi] mov rdx,r8 adcx r12,QWORD[16+rbx] adox r13,rax adcx r13,QWORD[24+rbx] adox r14,rbp lea rsi,[32+rsi] lea rbx,[32+rbx] adcx r14,rbp adox r10,r15 mulx r15,rax,QWORD[rcx] adcx r10,rax adox r11,r15 mulx r15,rax,QWORD[8+rcx] adcx r11,rax adox r12,r15 mulx r15,rax,QWORD[16+rcx] mov QWORD[((-40))+rbx],r10 adcx r12,rax adox r13,r15 mov QWORD[((-32))+rbx],r11 mulx r15,rax,QWORD[24+rcx] mov rdx,r9 lea rcx,[32+rcx] mov QWORD[((-24))+rbx],r12 adcx r13,rax adox r15,rbp mov QWORD[((-16))+rbx],r13 dec rdi jnz NEAR $L$mulx4x_inner mov rax,QWORD[((0+8))+rsp] adc r15,rbp sub rdi,QWORD[rbx] mov rdi,QWORD[((8+8))+rsp] mov r10,QWORD[((16+8))+rsp] adc r14,r15 lea rsi,[rax*1+rsi] adc rbp,rbp mov QWORD[((-8))+rbx],r14 cmp rdi,r10 jb NEAR $L$mulx4x_outer mov r10,QWORD[((-8))+rcx] mov r8,rbp mov r12,QWORD[rax*1+rcx] lea rbp,[rax*1+rcx] mov rcx,rax lea rdi,[rax*1+rbx] xor eax,eax xor r15,r15 sub r10,r14 adc r15,r15 or r8,r15 sar rcx,3+2 sub rax,r8 mov rdx,QWORD[((56+8))+rsp] dec r12 mov r13,QWORD[8+rbp] xor r8,r8 mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] jmp NEAR $L$sqrx4x_sub_entry ALIGN 32 bn_powerx5: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_bn_powerx5: mov rdi,rcx mov rsi,rdx mov rdx,r8 mov rcx,r9 mov r8,QWORD[40+rsp] mov r9,QWORD[48+rsp] mov rax,rsp $L$powerx5_enter: push rbx push rbp push r12 push r13 push r14 push r15 $L$powerx5_prologue: shl r9d,3 lea r10,[r9*2+r9] neg r9 mov r8,QWORD[r8] lea r11,[((-320))+r9*2+rsp] mov rbp,rsp sub r11,rdi and r11,4095 cmp r10,r11 jb NEAR $L$pwrx_sp_alt sub rbp,r11 lea rbp,[((-320))+r9*2+rbp] jmp NEAR $L$pwrx_sp_done ALIGN 32 $L$pwrx_sp_alt: lea r10,[((4096-320))+r9*2] lea rbp,[((-320))+r9*2+rbp] sub r11,r10 mov r10,0 cmovc r11,r10 sub rbp,r11 $L$pwrx_sp_done: and rbp,-64 mov r11,rsp sub r11,rbp and r11,-4096 lea rsp,[rbp*1+r11] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$pwrx_page_walk jmp NEAR $L$pwrx_page_walk_done $L$pwrx_page_walk: lea rsp,[((-4096))+rsp] mov r10,QWORD[rsp] cmp rsp,rbp ja NEAR $L$pwrx_page_walk $L$pwrx_page_walk_done: mov r10,r9 neg r9 pxor xmm0,xmm0 DB 102,72,15,110,207 DB 102,72,15,110,209 DB 102,73,15,110,218 DB 102,72,15,110,226 mov QWORD[32+rsp],r8 mov QWORD[40+rsp],rax $L$powerx5_body: call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal mov r9,r10 mov rdi,rsi DB 102,72,15,126,209 DB 102,72,15,126,226 mov rax,QWORD[40+rsp] call mulx4x_internal mov rsi,QWORD[40+rsp] mov rax,1 mov r15,QWORD[((-48))+rsi] mov r14,QWORD[((-40))+rsi] mov r13,QWORD[((-32))+rsi] mov r12,QWORD[((-24))+rsi] mov rbp,QWORD[((-16))+rsi] mov rbx,QWORD[((-8))+rsi] lea rsp,[rsi] $L$powerx5_epilogue: mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_bn_powerx5: global GFp_bn_sqrx8x_internal ALIGN 32 GFp_bn_sqrx8x_internal: __bn_sqrx8x_internal: lea rdi,[((48+8))+rsp] lea rbp,[r9*1+rsi] mov QWORD[((0+8))+rsp],r9 mov QWORD[((8+8))+rsp],rbp jmp NEAR $L$sqr8x_zero_start ALIGN 32 DB 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 $L$sqrx8x_zero: DB 0x3e movdqa XMMWORD[rdi],xmm0 movdqa XMMWORD[16+rdi],xmm0 movdqa XMMWORD[32+rdi],xmm0 movdqa XMMWORD[48+rdi],xmm0 $L$sqr8x_zero_start: movdqa XMMWORD[64+rdi],xmm0 movdqa XMMWORD[80+rdi],xmm0 movdqa XMMWORD[96+rdi],xmm0 movdqa XMMWORD[112+rdi],xmm0 lea rdi,[128+rdi] sub r9,64 jnz NEAR $L$sqrx8x_zero mov rdx,QWORD[rsi] xor r10,r10 xor r11,r11 xor r12,r12 xor r13,r13 xor r14,r14 xor r15,r15 lea rdi,[((48+8))+rsp] xor rbp,rbp jmp NEAR $L$sqrx8x_outer_loop ALIGN 32 $L$sqrx8x_outer_loop: mulx rax,r8,QWORD[8+rsi] adcx r8,r9 adox r10,rax mulx rax,r9,QWORD[16+rsi] adcx r9,r10 adox r11,rax DB 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 adcx r10,r11 adox r12,rax DB 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 adcx r11,r12 adox r13,rax mulx rax,r12,QWORD[40+rsi] adcx r12,r13 adox r14,rax mulx rax,r13,QWORD[48+rsi] adcx r13,r14 adox rax,r15 mulx r15,r14,QWORD[56+rsi] mov rdx,QWORD[8+rsi] adcx r14,rax adox r15,rbp adc r15,QWORD[64+rdi] mov QWORD[8+rdi],r8 mov QWORD[16+rdi],r9 sbb rcx,rcx xor rbp,rbp mulx rbx,r8,QWORD[16+rsi] mulx rax,r9,QWORD[24+rsi] adcx r8,r10 adox r9,rbx mulx rbx,r10,QWORD[32+rsi] adcx r9,r11 adox r10,rax DB 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 adcx r10,r12 adox r11,rbx DB 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 adcx r11,r13 adox r12,r14 DB 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 mov rdx,QWORD[16+rsi] adcx r12,rax adox r13,rbx adcx r13,r15 adox r14,rbp adcx r14,rbp mov QWORD[24+rdi],r8 mov QWORD[32+rdi],r9 mulx rbx,r8,QWORD[24+rsi] mulx rax,r9,QWORD[32+rsi] adcx r8,r10 adox r9,rbx mulx rbx,r10,QWORD[40+rsi] adcx r9,r11 adox r10,rax DB 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 adcx r10,r12 adox r11,r13 DB 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 DB 0x3e mov rdx,QWORD[24+rsi] adcx r11,rbx adox r12,rax adcx r12,r14 mov QWORD[40+rdi],r8 mov QWORD[48+rdi],r9 mulx rax,r8,QWORD[32+rsi] adox r13,rbp adcx r13,rbp mulx rbx,r9,QWORD[40+rsi] adcx r8,r10 adox r9,rax mulx rax,r10,QWORD[48+rsi] adcx r9,r11 adox r10,r12 mulx r12,r11,QWORD[56+rsi] mov rdx,QWORD[32+rsi] mov r14,QWORD[40+rsi] adcx r10,rbx adox r11,rax mov r15,QWORD[48+rsi] adcx r11,r13 adox r12,rbp adcx r12,rbp mov QWORD[56+rdi],r8 mov QWORD[64+rdi],r9 mulx rax,r9,r14 mov r8,QWORD[56+rsi] adcx r9,r10 mulx rbx,r10,r15 adox r10,rax adcx r10,r11 mulx rax,r11,r8 mov rdx,r14 adox r11,rbx adcx r11,r12 adcx rax,rbp mulx rbx,r14,r15 mulx r13,r12,r8 mov rdx,r15 lea rsi,[64+rsi] adcx r11,r14 adox r12,rbx adcx r12,rax adox r13,rbp DB 0x67,0x67 mulx r14,r8,r8 adcx r13,r8 adcx r14,rbp cmp rsi,QWORD[((8+8))+rsp] je NEAR $L$sqrx8x_outer_break neg rcx mov rcx,-8 mov r15,rbp mov r8,QWORD[64+rdi] adcx r9,QWORD[72+rdi] adcx r10,QWORD[80+rdi] adcx r11,QWORD[88+rdi] adc r12,QWORD[96+rdi] adc r13,QWORD[104+rdi] adc r14,QWORD[112+rdi] adc r15,QWORD[120+rdi] lea rbp,[rsi] lea rdi,[128+rdi] sbb rax,rax mov rdx,QWORD[((-64))+rsi] mov QWORD[((16+8))+rsp],rax mov QWORD[((24+8))+rsp],rdi xor eax,eax jmp NEAR $L$sqrx8x_loop ALIGN 32 $L$sqrx8x_loop: mov rbx,r8 mulx r8,rax,QWORD[rbp] adcx rbx,rax adox r8,r9 mulx r9,rax,QWORD[8+rbp] adcx r8,rax adox r9,r10 mulx r10,rax,QWORD[16+rbp] adcx r9,rax adox r10,r11 mulx r11,rax,QWORD[24+rbp] adcx r10,rax adox r11,r12 DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcx r11,rax adox r12,r13 mulx r13,rax,QWORD[40+rbp] adcx r12,rax adox r13,r14 mulx r14,rax,QWORD[48+rbp] mov QWORD[rcx*8+rdi],rbx mov ebx,0 adcx r13,rax adox r14,r15 DB 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 mov rdx,QWORD[8+rcx*8+rsi] adcx r14,rax adox r15,rbx adcx r15,rbx DB 0x67 inc rcx jnz NEAR $L$sqrx8x_loop lea rbp,[64+rbp] mov rcx,-8 cmp rbp,QWORD[((8+8))+rsp] je NEAR $L$sqrx8x_break sub rbx,QWORD[((16+8))+rsp] DB 0x66 mov rdx,QWORD[((-64))+rsi] adcx r8,QWORD[rdi] adcx r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] lea rdi,[64+rdi] DB 0x67 sbb rax,rax xor ebx,ebx mov QWORD[((16+8))+rsp],rax jmp NEAR $L$sqrx8x_loop ALIGN 32 $L$sqrx8x_break: xor rbp,rbp sub rbx,QWORD[((16+8))+rsp] adcx r8,rbp mov rcx,QWORD[((24+8))+rsp] adcx r9,rbp mov rdx,QWORD[rsi] adc r10,0 mov QWORD[rdi],r8 adc r11,0 adc r12,0 adc r13,0 adc r14,0 adc r15,0 cmp rdi,rcx je NEAR $L$sqrx8x_outer_loop mov QWORD[8+rdi],r9 mov r9,QWORD[8+rcx] mov QWORD[16+rdi],r10 mov r10,QWORD[16+rcx] mov QWORD[24+rdi],r11 mov r11,QWORD[24+rcx] mov QWORD[32+rdi],r12 mov r12,QWORD[32+rcx] mov QWORD[40+rdi],r13 mov r13,QWORD[40+rcx] mov QWORD[48+rdi],r14 mov r14,QWORD[48+rcx] mov QWORD[56+rdi],r15 mov r15,QWORD[56+rcx] mov rdi,rcx jmp NEAR $L$sqrx8x_outer_loop ALIGN 32 $L$sqrx8x_outer_break: mov QWORD[72+rdi],r9 DB 102,72,15,126,217 mov QWORD[80+rdi],r10 mov QWORD[88+rdi],r11 mov QWORD[96+rdi],r12 mov QWORD[104+rdi],r13 mov QWORD[112+rdi],r14 lea rdi,[((48+8))+rsp] mov rdx,QWORD[rcx*1+rsi] mov r11,QWORD[8+rdi] xor r10,r10 mov r9,QWORD[((0+8))+rsp] adox r11,r11 mov r12,QWORD[16+rdi] mov r13,QWORD[24+rdi] ALIGN 32 $L$sqrx4x_shift_n_add: mulx rbx,rax,rdx adox r12,r12 adcx rax,r10 DB 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 DB 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 adox r13,r13 adcx rbx,r11 mov r11,QWORD[40+rdi] mov QWORD[rdi],rax mov QWORD[8+rdi],rbx mulx rbx,rax,rdx adox r10,r10 adcx rax,r12 mov rdx,QWORD[16+rcx*1+rsi] mov r12,QWORD[48+rdi] adox r11,r11 adcx rbx,r13 mov r13,QWORD[56+rdi] mov QWORD[16+rdi],rax mov QWORD[24+rdi],rbx mulx rbx,rax,rdx adox r12,r12 adcx rax,r10 mov rdx,QWORD[24+rcx*1+rsi] lea rcx,[32+rcx] mov r10,QWORD[64+rdi] adox r13,r13 adcx rbx,r11 mov r11,QWORD[72+rdi] mov QWORD[32+rdi],rax mov QWORD[40+rdi],rbx mulx rbx,rax,rdx adox r10,r10 adcx rax,r12 jrcxz $L$sqrx4x_shift_n_add_break DB 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 adox r11,r11 adcx rbx,r13 mov r12,QWORD[80+rdi] mov r13,QWORD[88+rdi] mov QWORD[48+rdi],rax mov QWORD[56+rdi],rbx lea rdi,[64+rdi] nop jmp NEAR $L$sqrx4x_shift_n_add ALIGN 32 $L$sqrx4x_shift_n_add_break: adcx rbx,r13 mov QWORD[48+rdi],rax mov QWORD[56+rdi],rbx lea rdi,[64+rdi] DB 102,72,15,126,213 __bn_sqrx8x_reduction: xor eax,eax mov rbx,QWORD[((32+8))+rsp] mov rdx,QWORD[((48+8))+rsp] lea rcx,[((-64))+r9*1+rbp] mov QWORD[((0+8))+rsp],rcx mov QWORD[((8+8))+rsp],rdi lea rdi,[((48+8))+rsp] jmp NEAR $L$sqrx8x_reduction_loop ALIGN 32 $L$sqrx8x_reduction_loop: mov r9,QWORD[8+rdi] mov r10,QWORD[16+rdi] mov r11,QWORD[24+rdi] mov r12,QWORD[32+rdi] mov r8,rdx imul rdx,rbx mov r13,QWORD[40+rdi] mov r14,QWORD[48+rdi] mov r15,QWORD[56+rdi] mov QWORD[((24+8))+rsp],rax lea rdi,[64+rdi] xor rsi,rsi mov rcx,-8 jmp NEAR $L$sqrx8x_reduce ALIGN 32 $L$sqrx8x_reduce: mov rbx,r8 mulx r8,rax,QWORD[rbp] adcx rax,rbx adox r8,r9 mulx r9,rbx,QWORD[8+rbp] adcx r8,rbx adox r9,r10 mulx r10,rbx,QWORD[16+rbp] adcx r9,rbx adox r10,r11 mulx r11,rbx,QWORD[24+rbp] adcx r10,rbx adox r11,r12 DB 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 mov rax,rdx mov rdx,r8 adcx r11,rbx adox r12,r13 mulx rdx,rbx,QWORD[((32+8))+rsp] mov rdx,rax mov QWORD[((64+48+8))+rcx*8+rsp],rax mulx r13,rax,QWORD[40+rbp] adcx r12,rax adox r13,r14 mulx r14,rax,QWORD[48+rbp] adcx r13,rax adox r14,r15 mulx r15,rax,QWORD[56+rbp] mov rdx,rbx adcx r14,rax adox r15,rsi adcx r15,rsi DB 0x67,0x67,0x67 inc rcx jnz NEAR $L$sqrx8x_reduce mov rax,rsi cmp rbp,QWORD[((0+8))+rsp] jae NEAR $L$sqrx8x_no_tail mov rdx,QWORD[((48+8))+rsp] add r8,QWORD[rdi] lea rbp,[64+rbp] mov rcx,-8 adcx r9,QWORD[8+rdi] adcx r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] lea rdi,[64+rdi] sbb rax,rax xor rsi,rsi mov QWORD[((16+8))+rsp],rax jmp NEAR $L$sqrx8x_tail ALIGN 32 $L$sqrx8x_tail: mov rbx,r8 mulx r8,rax,QWORD[rbp] adcx rbx,rax adox r8,r9 mulx r9,rax,QWORD[8+rbp] adcx r8,rax adox r9,r10 mulx r10,rax,QWORD[16+rbp] adcx r9,rax adox r10,r11 mulx r11,rax,QWORD[24+rbp] adcx r10,rax adox r11,r12 DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcx r11,rax adox r12,r13 mulx r13,rax,QWORD[40+rbp] adcx r12,rax adox r13,r14 mulx r14,rax,QWORD[48+rbp] adcx r13,rax adox r14,r15 mulx r15,rax,QWORD[56+rbp] mov rdx,QWORD[((72+48+8))+rcx*8+rsp] adcx r14,rax adox r15,rsi mov QWORD[rcx*8+rdi],rbx mov rbx,r8 adcx r15,rsi inc rcx jnz NEAR $L$sqrx8x_tail cmp rbp,QWORD[((0+8))+rsp] jae NEAR $L$sqrx8x_tail_done sub rsi,QWORD[((16+8))+rsp] mov rdx,QWORD[((48+8))+rsp] lea rbp,[64+rbp] adc r8,QWORD[rdi] adc r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] lea rdi,[64+rdi] sbb rax,rax sub rcx,8 xor rsi,rsi mov QWORD[((16+8))+rsp],rax jmp NEAR $L$sqrx8x_tail ALIGN 32 $L$sqrx8x_tail_done: xor rax,rax add r8,QWORD[((24+8))+rsp] adc r9,0 adc r10,0 adc r11,0 adc r12,0 adc r13,0 adc r14,0 adc r15,0 adc rax,0 sub rsi,QWORD[((16+8))+rsp] $L$sqrx8x_no_tail: adc r8,QWORD[rdi] DB 102,72,15,126,217 adc r9,QWORD[8+rdi] mov rsi,QWORD[56+rbp] DB 102,72,15,126,213 adc r10,QWORD[16+rdi] adc r11,QWORD[24+rdi] adc r12,QWORD[32+rdi] adc r13,QWORD[40+rdi] adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] adc rax,0 mov rbx,QWORD[((32+8))+rsp] mov rdx,QWORD[64+rcx*1+rdi] mov QWORD[rdi],r8 lea r8,[64+rdi] mov QWORD[8+rdi],r9 mov QWORD[16+rdi],r10 mov QWORD[24+rdi],r11 mov QWORD[32+rdi],r12 mov QWORD[40+rdi],r13 mov QWORD[48+rdi],r14 mov QWORD[56+rdi],r15 lea rdi,[64+rcx*1+rdi] cmp r8,QWORD[((8+8))+rsp] jb NEAR $L$sqrx8x_reduction_loop DB 0F3h,0C3h ;repret ALIGN 32 __bn_postx4x_internal: mov r12,QWORD[rbp] mov r10,rcx mov r9,rcx neg rax sar rcx,3+2 DB 102,72,15,126,202 DB 102,72,15,126,206 dec r12 mov r13,QWORD[8+rbp] xor r8,r8 mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] jmp NEAR $L$sqrx4x_sub_entry ALIGN 16 $L$sqrx4x_sub: mov r12,QWORD[rbp] mov r13,QWORD[8+rbp] mov r14,QWORD[16+rbp] mov r15,QWORD[24+rbp] $L$sqrx4x_sub_entry: andn r12,r12,rax lea rbp,[32+rbp] andn r13,r13,rax andn r14,r14,rax andn r15,r15,rax neg r8 adc r12,QWORD[rdi] adc r13,QWORD[8+rdi] adc r14,QWORD[16+rdi] adc r15,QWORD[24+rdi] mov QWORD[rdx],r12 lea rdi,[32+rdi] mov QWORD[8+rdx],r13 sbb r8,r8 mov QWORD[16+rdx],r14 mov QWORD[24+rdx],r15 lea rdx,[32+rdx] inc rcx jnz NEAR $L$sqrx4x_sub neg r9 DB 0F3h,0C3h ;repret global GFp_bn_scatter5 ALIGN 16 GFp_bn_scatter5: cmp edx,0 jz NEAR $L$scatter_epilogue lea r8,[r9*8+r8] $L$scatter: mov rax,QWORD[rcx] lea rcx,[8+rcx] mov QWORD[r8],rax lea r8,[256+r8] sub edx,1 jnz NEAR $L$scatter $L$scatter_epilogue: DB 0F3h,0C3h ;repret global GFp_bn_gather5 ALIGN 32 GFp_bn_gather5: $L$SEH_begin_GFp_bn_gather5: DB 0x4c,0x8d,0x14,0x24 DB 0x48,0x81,0xec,0x08,0x01,0x00,0x00 lea rax,[$L$inc] and rsp,-16 movd xmm5,r9d movdqa xmm0,XMMWORD[rax] movdqa xmm1,XMMWORD[16+rax] lea r11,[128+r8] lea rax,[128+rsp] pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 movdqa xmm2,xmm1 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[(-128)+rax],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[(-112)+rax],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[(-96)+rax],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[(-80)+rax],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[(-64)+rax],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[(-48)+rax],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[(-32)+rax],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[(-16)+rax],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[rax],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[16+rax],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[32+rax],xmm2 movdqa xmm2,xmm4 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa XMMWORD[48+rax],xmm3 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[64+rax],xmm0 movdqa xmm0,xmm4 paddd xmm3,xmm2 pcmpeqd xmm2,xmm5 movdqa XMMWORD[80+rax],xmm1 movdqa xmm1,xmm4 paddd xmm0,xmm3 pcmpeqd xmm3,xmm5 movdqa XMMWORD[96+rax],xmm2 movdqa xmm2,xmm4 movdqa XMMWORD[112+rax],xmm3 jmp NEAR $L$gather ALIGN 32 $L$gather: pxor xmm4,xmm4 pxor xmm5,xmm5 movdqa xmm0,XMMWORD[((-128))+r11] movdqa xmm1,XMMWORD[((-112))+r11] movdqa xmm2,XMMWORD[((-96))+r11] pand xmm0,XMMWORD[((-128))+rax] movdqa xmm3,XMMWORD[((-80))+r11] pand xmm1,XMMWORD[((-112))+rax] por xmm4,xmm0 pand xmm2,XMMWORD[((-96))+rax] por xmm5,xmm1 pand xmm3,XMMWORD[((-80))+rax] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[((-64))+r11] movdqa xmm1,XMMWORD[((-48))+r11] movdqa xmm2,XMMWORD[((-32))+r11] pand xmm0,XMMWORD[((-64))+rax] movdqa xmm3,XMMWORD[((-16))+r11] pand xmm1,XMMWORD[((-48))+rax] por xmm4,xmm0 pand xmm2,XMMWORD[((-32))+rax] por xmm5,xmm1 pand xmm3,XMMWORD[((-16))+rax] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[r11] movdqa xmm1,XMMWORD[16+r11] movdqa xmm2,XMMWORD[32+r11] pand xmm0,XMMWORD[rax] movdqa xmm3,XMMWORD[48+r11] pand xmm1,XMMWORD[16+rax] por xmm4,xmm0 pand xmm2,XMMWORD[32+rax] por xmm5,xmm1 pand xmm3,XMMWORD[48+rax] por xmm4,xmm2 por xmm5,xmm3 movdqa xmm0,XMMWORD[64+r11] movdqa xmm1,XMMWORD[80+r11] movdqa xmm2,XMMWORD[96+r11] pand xmm0,XMMWORD[64+rax] movdqa xmm3,XMMWORD[112+r11] pand xmm1,XMMWORD[80+rax] por xmm4,xmm0 pand xmm2,XMMWORD[96+rax] por xmm5,xmm1 pand xmm3,XMMWORD[112+rax] por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 lea r11,[256+r11] pshufd xmm0,xmm4,0x4e por xmm0,xmm4 movq QWORD[rcx],xmm0 lea rcx,[8+rcx] sub edx,1 jnz NEAR $L$gather lea rsp,[r10] DB 0F3h,0C3h ;repret $L$SEH_end_GFp_bn_gather5: ALIGN 64 $L$inc: DD 0,0,1,1 DD 2,2,2,2 DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 DB 112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115 DB 99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111 DB 114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79 DB 71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111 DB 112,101,110,115,115,108,46,111,114,103,62,0 EXTERN __imp_RtlVirtualUnwind ALIGN 16 mul_handler: push rsi push rdi push rbx push rbp push r12 push r13 push r14 push r15 pushfq sub rsp,64 mov rax,QWORD[120+r8] mov rbx,QWORD[248+r8] mov rsi,QWORD[8+r9] mov r11,QWORD[56+r9] mov r10d,DWORD[r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_seh_tail mov r10d,DWORD[4+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jb NEAR $L$common_pop_regs mov rax,QWORD[152+r8] mov r10d,DWORD[8+r11] lea r10,[r10*1+rsi] cmp rbx,r10 jae NEAR $L$common_seh_tail lea r10,[$L$mul_epilogue] cmp rbx,r10 ja NEAR $L$body_40 mov r10,QWORD[192+r8] mov rax,QWORD[8+r10*8+rax] jmp NEAR $L$common_pop_regs $L$body_40: mov rax,QWORD[40+rax] $L$common_pop_regs: mov rbx,QWORD[((-8))+rax] mov rbp,QWORD[((-16))+rax] mov r12,QWORD[((-24))+rax] mov r13,QWORD[((-32))+rax] mov r14,QWORD[((-40))+rax] mov r15,QWORD[((-48))+rax] mov QWORD[144+r8],rbx mov QWORD[160+r8],rbp mov QWORD[216+r8],r12 mov QWORD[224+r8],r13 mov QWORD[232+r8],r14 mov QWORD[240+r8],r15 $L$common_seh_tail: mov rdi,QWORD[8+rax] mov rsi,QWORD[16+rax] mov QWORD[152+r8],rax mov QWORD[168+r8],rsi mov QWORD[176+r8],rdi mov rdi,QWORD[40+r9] mov rsi,r8 mov ecx,154 DD 0xa548f3fc mov rsi,r9 xor rcx,rcx mov rdx,QWORD[8+rsi] mov r8,QWORD[rsi] mov r9,QWORD[16+rsi] mov r10,QWORD[40+rsi] lea r11,[56+rsi] lea r12,[24+rsi] mov QWORD[32+rsp],r10 mov QWORD[40+rsp],r11 mov QWORD[48+rsp],r12 mov QWORD[56+rsp],rcx call QWORD[__imp_RtlVirtualUnwind] mov eax,1 add rsp,64 popfq pop r15 pop r14 pop r13 pop r12 pop rbp pop rbx pop rdi pop rsi DB 0F3h,0C3h ;repret section .pdata rdata align=4 ALIGN 4 DD $L$SEH_begin_GFp_bn_mul_mont_gather5 wrt ..imagebase DD $L$SEH_end_GFp_bn_mul_mont_gather5 wrt ..imagebase DD $L$SEH_info_GFp_bn_mul_mont_gather5 wrt ..imagebase DD $L$SEH_begin_bn_mul4x_mont_gather5 wrt ..imagebase DD $L$SEH_end_bn_mul4x_mont_gather5 wrt ..imagebase DD $L$SEH_info_bn_mul4x_mont_gather5 wrt ..imagebase DD $L$SEH_begin_GFp_bn_power5 wrt ..imagebase DD $L$SEH_end_GFp_bn_power5 wrt ..imagebase DD $L$SEH_info_GFp_bn_power5 wrt ..imagebase DD $L$SEH_begin_bn_from_mont8x wrt ..imagebase DD $L$SEH_end_bn_from_mont8x wrt ..imagebase DD $L$SEH_info_bn_from_mont8x wrt ..imagebase DD $L$SEH_begin_bn_mulx4x_mont_gather5 wrt ..imagebase DD $L$SEH_end_bn_mulx4x_mont_gather5 wrt ..imagebase DD $L$SEH_info_bn_mulx4x_mont_gather5 wrt ..imagebase DD $L$SEH_begin_bn_powerx5 wrt ..imagebase DD $L$SEH_end_bn_powerx5 wrt ..imagebase DD $L$SEH_info_GFp_bn_powerx5 wrt ..imagebase DD $L$SEH_begin_GFp_bn_gather5 wrt ..imagebase DD $L$SEH_end_GFp_bn_gather5 wrt ..imagebase DD $L$SEH_info_GFp_bn_gather5 wrt ..imagebase section .xdata rdata align=8 ALIGN 8 $L$SEH_info_GFp_bn_mul_mont_gather5: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mul4x_mont_gather5: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul4x_prologue wrt ..imagebase,$L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_GFp_bn_power5: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$power5_prologue wrt ..imagebase,$L$power5_body wrt ..imagebase,$L$power5_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_from_mont8x: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$from_prologue wrt ..imagebase,$L$from_body wrt ..imagebase,$L$from_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mulx4x_mont_gather5: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_GFp_bn_powerx5: DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$powerx5_prologue wrt ..imagebase,$L$powerx5_body wrt ..imagebase,$L$powerx5_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_GFp_bn_gather5: DB 0x01,0x0b,0x03,0x0a DB 0x0b,0x01,0x21,0x00 DB 0x04,0xa3,0x00,0x00 ALIGN 8 ring-0.16.9/pregenerated/vpaes-armv8-ios64.S000064400000000000000000000612551353224260500166530ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) .section __TEXT,__const .align 7 // totally strategic alignment _vpaes_consts: Lk_mc_forward: // mc_forward .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 .quad 0x080B0A0904070605, 0x000302010C0F0E0D .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 .quad 0x000302010C0F0E0D, 0x080B0A0904070605 Lk_mc_backward: // mc_backward .quad 0x0605040702010003, 0x0E0D0C0F0A09080B .quad 0x020100030E0D0C0F, 0x0A09080B06050407 .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 .quad 0x0A09080B06050407, 0x020100030E0D0C0F Lk_sr: // sr .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 .quad 0x030E09040F0A0500, 0x0B06010C07020D08 .quad 0x0F060D040B020900, 0x070E050C030A0108 .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 // // "Hot" constants // Lk_inv: // inv, inva .quad 0x0E05060F0D080180, 0x040703090A0B0C02 .quad 0x01040A060F0B0780, 0x030D0E0C02050809 Lk_ipt: // input transform (lo, hi) .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 Lk_sbo: // sbou, sbot .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA Lk_sb1: // sb1u, sb1t .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 Lk_sb2: // sb2u, sb2t .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD // // Key schedule constants // Lk_dksd: // decryption key schedule: invskew x*D .quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 .quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E Lk_dksb: // decryption key schedule: invskew x*B .quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 .quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 Lk_dkse: // decryption key schedule: invskew x*E + 0x63 .quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 .quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 Lk_dks9: // decryption key schedule: invskew x*9 .quad 0xB6116FC87ED9A700, 0x4AED933482255BFC .quad 0x4576516227143300, 0x8BB89FACE9DAFDCE Lk_rcon: // rcon .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 Lk_opt: // output transform .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 Lk_deskew: // deskew tables: inverts the sbox's "skew" .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,56,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 .align 2 .align 6 .text ## ## _aes_preheat ## ## Fills register %r10 -> .aes_consts (so you can -fPIC) ## and %xmm9-%xmm15 as specified below. ## .align 4 _vpaes_encrypt_preheat: adrp x10, Lk_inv@PAGE add x10, x10, Lk_inv@PAGEOFF movi v17.16b, #0x0f ld1 {v18.2d,v19.2d}, [x10],#32 // Lk_inv ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // Lk_ipt, Lk_sbo ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10] // Lk_sb1, Lk_sb2 ret ## ## _aes_encrypt_core ## ## AES-encrypt %xmm0. ## ## Inputs: ## %xmm0 = input ## %xmm9-%xmm15 as in _vpaes_preheat ## (%rdx) = scheduled keys ## ## Output in %xmm0 ## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax ## Preserves %xmm6 - %xmm8 so you get some local vectors ## ## .align 4 _vpaes_encrypt_core: mov x9, x2 ldr w8, [x2,#240] // pull rounds adrp x11, Lk_mc_forward@PAGE+16 add x11, x11, Lk_mc_forward@PAGEOFF+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 b Lenc_entry .align 4 Lenc_loop: // middle of middle round add x10, x11, #0x40 tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D sub w8, w8, #1 // nr-- Lenc_entry: // top of round and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i tbl v5.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 cbnz w8, Lenc_loop // middle of last round add x10, x11, #0x80 // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 ret .globl _GFp_vpaes_encrypt .private_extern _GFp_vpaes_encrypt .align 4 _GFp_vpaes_encrypt: stp x29,x30,[sp,#-16]! add x29,sp,#0 ld1 {v7.16b}, [x0] bl _vpaes_encrypt_preheat bl _vpaes_encrypt_core st1 {v0.16b}, [x1] ldp x29,x30,[sp],#16 ret .align 4 _vpaes_encrypt_2x: mov x9, x2 ldr w8, [x2,#240] // pull rounds adrp x11, Lk_mc_forward@PAGE+16 add x11, x11, Lk_mc_forward@PAGEOFF+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 and v9.16b, v15.16b, v17.16b ushr v8.16b, v15.16b, #4 tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 tbl v9.16b, {v20.16b}, v9.16b // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 tbl v10.16b, {v21.16b}, v8.16b eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 eor v8.16b, v9.16b, v16.16b eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 eor v8.16b, v8.16b, v10.16b b Lenc_2x_entry .align 4 Lenc_2x_loop: // middle of middle round add x10, x11, #0x40 tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u tbl v12.16b, {v25.16b}, v10.16b ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t tbl v8.16b, {v24.16b}, v11.16b eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v12.16b, v12.16b, v16.16b tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u tbl v13.16b, {v27.16b}, v10.16b eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A eor v8.16b, v8.16b, v12.16b tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t tbl v10.16b, {v26.16b}, v11.16b ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B tbl v11.16b, {v8.16b}, v1.16b eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A eor v10.16b, v10.16b, v13.16b tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D tbl v8.16b, {v8.16b}, v4.16b eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B eor v11.16b, v11.16b, v10.16b tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C tbl v12.16b, {v11.16b},v1.16b eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D eor v8.16b, v8.16b, v11.16b and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D eor v8.16b, v8.16b, v12.16b sub w8, w8, #1 // nr-- Lenc_2x_entry: // top of round and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i and v9.16b, v8.16b, v17.16b ushr v8.16b, v8.16b, #4 tbl v5.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k tbl v13.16b, {v19.16b},v9.16b eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j eor v9.16b, v9.16b, v8.16b tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i tbl v11.16b, {v18.16b},v8.16b tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j tbl v12.16b, {v18.16b},v9.16b eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k eor v11.16b, v11.16b, v13.16b eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k eor v12.16b, v12.16b, v13.16b tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak tbl v10.16b, {v18.16b},v11.16b tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak tbl v11.16b, {v18.16b},v12.16b eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io eor v10.16b, v10.16b, v9.16b eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo eor v11.16b, v11.16b, v8.16b ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 cbnz w8, Lenc_2x_loop // middle of last round add x10, x11, #0x80 // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou tbl v12.16b, {v22.16b}, v10.16b ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t tbl v8.16b, {v23.16b}, v11.16b eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v12.16b, v12.16b, v16.16b eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A eor v8.16b, v8.16b, v12.16b tbl v0.16b, {v0.16b},v1.16b // vpshufb %xmm1, %xmm0, %xmm0 tbl v1.16b, {v8.16b},v1.16b ret ######################################################## ## ## ## AES key schedule ## ## ## ######################################################## .align 4 _vpaes_key_preheat: adrp x10, Lk_inv@PAGE add x10, x10, Lk_inv@PAGEOFF movi v16.16b, #0x5b // Lk_s63 adrp x11, Lk_sb1@PAGE add x11, x11, Lk_sb1@PAGEOFF movi v17.16b, #0x0f // Lk_s0F ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // Lk_inv, Lk_ipt adrp x10, Lk_dksd@PAGE add x10, x10, Lk_dksd@PAGEOFF ld1 {v22.2d,v23.2d}, [x11] // Lk_sb1 adrp x11, Lk_mc_forward@PAGE add x11, x11, Lk_mc_forward@PAGEOFF ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // Lk_dksd, Lk_dksb ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // Lk_dkse, Lk_dks9 ld1 {v8.2d}, [x10] // Lk_rcon ld1 {v9.2d}, [x11] // Lk_mc_forward[0] ret .align 4 _vpaes_schedule_core: stp x29, x30, [sp,#-16]! add x29,sp,#0 bl _vpaes_key_preheat // load the tables ld1 {v0.16b}, [x0],#16 // vmovdqu (%rdi), %xmm0 # load key (unaligned) // input transform mov v3.16b, v0.16b // vmovdqa %xmm0, %xmm3 bl _vpaes_schedule_transform mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 adrp x10, Lk_sr@PAGE // lea Lk_sr(%rip),%r10 add x10, x10, Lk_sr@PAGEOFF add x8, x8, x10 // encrypting, output zeroth round key after transform st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) cmp w1, #192 // cmp $192, %esi b.hi Lschedule_256 b.eq Lschedule_192 // 128: fall though ## ## .schedule_128 ## ## 128-bit specific part of key schedule. ## ## This schedule is really simple, because all its parts ## are accomplished by the subroutines. ## Lschedule_128: mov x0, #10 // mov $10, %esi Loop_schedule_128: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_round cbz x0, Lschedule_mangle_last bl _vpaes_schedule_mangle // write output b Loop_schedule_128 ## ## .aes_schedule_192 ## ## 192-bit specific part of key schedule. ## ## The main body of this schedule is the same as the 128-bit ## schedule, but with more smearing. The long, high side is ## stored in %xmm7 as before, and the short, low side is in ## the high bits of %xmm6. ## ## This schedule is somewhat nastier, however, because each ## round produces 192 bits of key material, or 1.5 round keys. ## Therefore, on each cycle we do 2 rounds and produce 3 round ## keys. ## .align 4 Lschedule_192: sub x0, x0, #8 ld1 {v0.16b}, [x0] // vmovdqu 8(%rdi),%xmm0 # load key part 2 (very unaligned) bl _vpaes_schedule_transform // input transform mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save short part eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 # clear 4 ins v6.d[0], v4.d[0] // vmovhlps %xmm4, %xmm6, %xmm6 # clobber low side with zeros mov x0, #4 // mov $4, %esi Loop_schedule_192: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_round ext v0.16b, v6.16b, v0.16b, #8 // vpalignr $8,%xmm6,%xmm0,%xmm0 bl _vpaes_schedule_mangle // save key n bl _vpaes_schedule_192_smear bl _vpaes_schedule_mangle // save key n+1 bl _vpaes_schedule_round cbz x0, Lschedule_mangle_last bl _vpaes_schedule_mangle // save key n+2 bl _vpaes_schedule_192_smear b Loop_schedule_192 ## ## .aes_schedule_256 ## ## 256-bit specific part of key schedule. ## ## The structure here is very similar to the 128-bit ## schedule, but with an additional "low side" in ## %xmm6. The low side's rounds are the same as the ## high side's, except no rcon and no rotation. ## .align 4 Lschedule_256: ld1 {v0.16b}, [x0] // vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) bl _vpaes_schedule_transform // input transform mov x0, #7 // mov $7, %esi Loop_schedule_256: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_mangle // output low result mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 // high round bl _vpaes_schedule_round cbz x0, Lschedule_mangle_last bl _vpaes_schedule_mangle // low round. swap xmm7 and xmm6 dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 movi v4.16b, #0 mov v5.16b, v7.16b // vmovdqa %xmm7, %xmm5 mov v7.16b, v6.16b // vmovdqa %xmm6, %xmm7 bl _vpaes_schedule_low_round mov v7.16b, v5.16b // vmovdqa %xmm5, %xmm7 b Loop_schedule_256 ## ## .aes_schedule_mangle_last ## ## Mangler for last round of key schedule ## Mangles %xmm0 ## when encrypting, outputs out(%xmm0) ^ 63 ## when decrypting, outputs unskew(%xmm0) ## ## Always called right before return... jumps to cleanup and exits ## .align 4 Lschedule_mangle_last: // schedule last round key from xmm0 adrp x11, Lk_deskew@PAGE // lea Lk_deskew(%rip),%r11 # prepare to deskew add x11, x11, Lk_deskew@PAGEOFF cbnz w3, Lschedule_mangle_last_dec // encrypting ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 adrp x11, Lk_opt@PAGE // lea Lk_opt(%rip), %r11 # prepare to output transform add x11, x11, Lk_opt@PAGEOFF add x2, x2, #32 // add $32, %rdx tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute Lschedule_mangle_last_dec: ld1 {v20.2d,v21.2d}, [x11] // reload constants sub x2, x2, #16 // add $-16, %rdx eor v0.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm0 bl _vpaes_schedule_transform // output transform st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) # save last key // cleanup eor v0.16b, v0.16b, v0.16b // vpxor %xmm0, %xmm0, %xmm0 eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 eor v2.16b, v2.16b, v2.16b // vpxor %xmm2, %xmm2, %xmm2 eor v3.16b, v3.16b, v3.16b // vpxor %xmm3, %xmm3, %xmm3 eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 eor v5.16b, v5.16b, v5.16b // vpxor %xmm5, %xmm5, %xmm5 eor v6.16b, v6.16b, v6.16b // vpxor %xmm6, %xmm6, %xmm6 eor v7.16b, v7.16b, v7.16b // vpxor %xmm7, %xmm7, %xmm7 ldp x29, x30, [sp],#16 ret ## ## .aes_schedule_192_smear ## ## Smear the short, low side in the 192-bit key schedule. ## ## Inputs: ## %xmm7: high side, b a x y ## %xmm6: low side, d c 0 0 ## %xmm13: 0 ## ## Outputs: ## %xmm6: b+c+d b+c 0 0 ## %xmm0: b+c+d b+c b a ## .align 4 _vpaes_schedule_192_smear: movi v1.16b, #0 dup v0.4s, v7.s[3] ins v1.s[3], v6.s[2] // vpshufd $0x80, %xmm6, %xmm1 # d c 0 0 -> c 0 0 0 ins v0.s[0], v7.s[2] // vpshufd $0xFE, %xmm7, %xmm0 # b a _ _ -> b b b a eor v6.16b, v6.16b, v1.16b // vpxor %xmm1, %xmm6, %xmm6 # -> c+d c 0 0 eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 eor v6.16b, v6.16b, v0.16b // vpxor %xmm0, %xmm6, %xmm6 # -> b+c+d b+c b a mov v0.16b, v6.16b // vmovdqa %xmm6, %xmm0 ins v6.d[0], v1.d[0] // vmovhlps %xmm1, %xmm6, %xmm6 # clobber low side with zeros ret ## ## .aes_schedule_round ## ## Runs one main round of the key schedule on %xmm0, %xmm7 ## ## Specifically, runs subbytes on the high dword of %xmm0 ## then rotates it by one byte and xors into the low dword of ## %xmm7. ## ## Adds rcon from low byte of %xmm8, then rotates %xmm8 for ## next rcon. ## ## Smears the dwords of %xmm7 by xoring the low into the ## second low, result into third, result into highest. ## ## Returns results in %xmm7 = %xmm0. ## Clobbers %xmm1-%xmm4, %r11. ## .align 4 _vpaes_schedule_round: // extract rcon from xmm8 movi v4.16b, #0 // vpxor %xmm4, %xmm4, %xmm4 ext v1.16b, v8.16b, v4.16b, #15 // vpalignr $15, %xmm8, %xmm4, %xmm1 ext v8.16b, v8.16b, v8.16b, #15 // vpalignr $15, %xmm8, %xmm8, %xmm8 eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 // rotate dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 ext v0.16b, v0.16b, v0.16b, #1 // vpalignr $1, %xmm0, %xmm0, %xmm0 // fall through... // low round: same as high round, but no rotation and no rcon. _vpaes_schedule_low_round: // smear xmm7 ext v1.16b, v4.16b, v7.16b, #12 // vpslldq $4, %xmm7, %xmm1 eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 ext v4.16b, v4.16b, v7.16b, #8 // vpslldq $8, %xmm7, %xmm4 // subbytes and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i eor v7.16b, v7.16b, v4.16b // vpxor %xmm4, %xmm7, %xmm7 tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j eor v7.16b, v7.16b, v16.16b // vpxor Lk_s63(%rip), %xmm7, %xmm7 tbl v3.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k tbl v2.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak eor v3.16b, v3.16b, v1.16b // vpxor %xmm1, %xmm3, %xmm3 # 2 = io eor v2.16b, v2.16b, v0.16b // vpxor %xmm0, %xmm2, %xmm2 # 3 = jo tbl v4.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou tbl v1.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t eor v1.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output // add in smeared stuff eor v0.16b, v1.16b, v7.16b // vpxor %xmm7, %xmm1, %xmm0 eor v7.16b, v1.16b, v7.16b // vmovdqa %xmm0, %xmm7 ret ## ## .aes_schedule_transform ## ## Linear-transform %xmm0 according to tables at (%r11) ## ## Requires that %xmm9 = 0x0F0F... as in preheat ## Output in %xmm0 ## Clobbers %xmm1, %xmm2 ## .align 4 _vpaes_schedule_transform: and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 // vmovdqa (%r11), %xmm2 # lo tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 // vmovdqa 16(%r11), %xmm1 # hi tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 ret ## ## .aes_schedule_mangle ## ## Mangle xmm0 from (basis-transformed) standard version ## to our version. ## ## On encrypt, ## xor with 0x63 ## multiply by circulant 0,1,1,1 ## apply shiftrows transform ## ## On decrypt, ## xor with 0x63 ## multiply by "inverse mixcolumns" circulant E,B,D,9 ## deskew ## apply shiftrows transform ## ## ## Writes out to (%rdx), and increments or decrements it ## Keeps track of round number mod 4 in %r8 ## Preserves xmm0 ## Clobbers xmm1-xmm5 ## .align 4 _vpaes_schedule_mangle: mov v4.16b, v0.16b // vmovdqa %xmm0, %xmm4 # save xmm0 for later // vmovdqa .Lk_mc_forward(%rip),%xmm5 // encrypting eor v4.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm4 add x2, x2, #16 // add $16, %rdx tbl v4.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm4 tbl v1.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm1 tbl v3.16b, {v1.16b}, v9.16b // vpshufb %xmm5, %xmm1, %xmm3 eor v4.16b, v4.16b, v1.16b // vpxor %xmm1, %xmm4, %xmm4 ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 eor v3.16b, v3.16b, v4.16b // vpxor %xmm4, %xmm3, %xmm3 Lschedule_mangle_both: tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 add x8, x8, #64-16 // add $-16, %r8 and x8, x8, #~(1<<6) // and $0x30, %r8 st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) ret .globl _GFp_vpaes_set_encrypt_key .private_extern _GFp_vpaes_set_encrypt_key .align 4 _GFp_vpaes_set_encrypt_key: stp x29,x30,[sp,#-16]! add x29,sp,#0 stp d8,d9,[sp,#-16]! // ABI spec says so lsr w9, w1, #5 // shr $5,%eax add w9, w9, #5 // $5,%eax str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; mov w3, #0 // mov $0,%ecx mov x8, #0x30 // mov $0x30,%r8d bl _vpaes_schedule_core eor x0, x0, x0 ldp d8,d9,[sp],#16 ldp x29,x30,[sp],#16 ret .globl _GFp_vpaes_ctr32_encrypt_blocks .private_extern _GFp_vpaes_ctr32_encrypt_blocks .align 4 _GFp_vpaes_ctr32_encrypt_blocks: stp x29,x30,[sp,#-16]! add x29,sp,#0 stp d8,d9,[sp,#-16]! // ABI spec says so stp d10,d11,[sp,#-16]! stp d12,d13,[sp,#-16]! stp d14,d15,[sp,#-16]! cbz x2, Lctr32_done // Note, unlike the other functions, x2 here is measured in blocks, // not bytes. mov x17, x2 mov x2, x3 // Load the IV and counter portion. ldr w6, [x4, #12] ld1 {v7.16b}, [x4] bl _vpaes_encrypt_preheat tst x17, #1 rev w6, w6 // The counter is big-endian. b.eq Lctr32_prep_loop // Handle one block so the remaining block count is even for // _vpaes_encrypt_2x. ld1 {v6.16b}, [x0], #16 // Load input ahead of time bl _vpaes_encrypt_core eor v0.16b, v0.16b, v6.16b // XOR input and result st1 {v0.16b}, [x1], #16 subs x17, x17, #1 // Update the counter. add w6, w6, #1 rev w7, w6 mov v7.s[3], w7 b.ls Lctr32_done Lctr32_prep_loop: // _vpaes_encrypt_core takes its input from v7, while _vpaes_encrypt_2x // uses v14 and v15. mov v15.16b, v7.16b mov v14.16b, v7.16b add w6, w6, #1 rev w7, w6 mov v15.s[3], w7 Lctr32_loop: ld1 {v6.16b,v7.16b}, [x0], #32 // Load input ahead of time bl _vpaes_encrypt_2x eor v0.16b, v0.16b, v6.16b // XOR input and result eor v1.16b, v1.16b, v7.16b // XOR input and result (#2) st1 {v0.16b,v1.16b}, [x1], #32 subs x17, x17, #2 // Update the counter. add w7, w6, #1 add w6, w6, #2 rev w7, w7 mov v14.s[3], w7 rev w7, w6 mov v15.s[3], w7 b.hi Lctr32_loop Lctr32_done: ldp d14,d15,[sp],#16 ldp d12,d13,[sp],#16 ldp d10,d11,[sp],#16 ldp d8,d9,[sp],#16 ldp x29,x30,[sp],#16 ret #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/vpaes-armv8-linux64.S000064400000000000000000000634721353224260600172240ustar0000000000000000// This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if !defined(OPENSSL_NO_ASM) #if defined(__aarch64__) .section .rodata .type _vpaes_consts,%object .align 7 // totally strategic alignment _vpaes_consts: .Lk_mc_forward: // mc_forward .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 .quad 0x080B0A0904070605, 0x000302010C0F0E0D .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 .quad 0x000302010C0F0E0D, 0x080B0A0904070605 .Lk_mc_backward: // mc_backward .quad 0x0605040702010003, 0x0E0D0C0F0A09080B .quad 0x020100030E0D0C0F, 0x0A09080B06050407 .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 .quad 0x0A09080B06050407, 0x020100030E0D0C0F .Lk_sr: // sr .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 .quad 0x030E09040F0A0500, 0x0B06010C07020D08 .quad 0x0F060D040B020900, 0x070E050C030A0108 .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 // // "Hot" constants // .Lk_inv: // inv, inva .quad 0x0E05060F0D080180, 0x040703090A0B0C02 .quad 0x01040A060F0B0780, 0x030D0E0C02050809 .Lk_ipt: // input transform (lo, hi) .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 .Lk_sbo: // sbou, sbot .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA .Lk_sb1: // sb1u, sb1t .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 .Lk_sb2: // sb2u, sb2t .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD // // Key schedule constants // .Lk_dksd: // decryption key schedule: invskew x*D .quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 .quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E .Lk_dksb: // decryption key schedule: invskew x*B .quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 .quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 .Lk_dkse: // decryption key schedule: invskew x*E + 0x63 .quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 .quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 .Lk_dks9: // decryption key schedule: invskew x*9 .quad 0xB6116FC87ED9A700, 0x4AED933482255BFC .quad 0x4576516227143300, 0x8BB89FACE9DAFDCE .Lk_rcon: // rcon .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 .Lk_opt: // output transform .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 .Lk_deskew: // deskew tables: inverts the sbox's "skew" .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,56,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 .align 2 .size _vpaes_consts,.-_vpaes_consts .align 6 .text ## ## _aes_preheat ## ## Fills register %r10 -> .aes_consts (so you can -fPIC) ## and %xmm9-%xmm15 as specified below. ## .type _vpaes_encrypt_preheat,%function .align 4 _vpaes_encrypt_preheat: adrp x10, .Lk_inv add x10, x10, :lo12:.Lk_inv movi v17.16b, #0x0f ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // .Lk_ipt, .Lk_sbo ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10] // .Lk_sb1, .Lk_sb2 ret .size _vpaes_encrypt_preheat,.-_vpaes_encrypt_preheat ## ## _aes_encrypt_core ## ## AES-encrypt %xmm0. ## ## Inputs: ## %xmm0 = input ## %xmm9-%xmm15 as in _vpaes_preheat ## (%rdx) = scheduled keys ## ## Output in %xmm0 ## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax ## Preserves %xmm6 - %xmm8 so you get some local vectors ## ## .type _vpaes_encrypt_core,%function .align 4 _vpaes_encrypt_core: mov x9, x2 ldr w8, [x2,#240] // pull rounds adrp x11, .Lk_mc_forward+16 add x11, x11, :lo12:.Lk_mc_forward+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 b .Lenc_entry .align 4 .Lenc_loop: // middle of middle round add x10, x11, #0x40 tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D sub w8, w8, #1 // nr-- .Lenc_entry: // top of round and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i tbl v5.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 cbnz w8, .Lenc_loop // middle of last round add x10, x11, #0x80 // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 ret .size _vpaes_encrypt_core,.-_vpaes_encrypt_core .globl GFp_vpaes_encrypt .hidden GFp_vpaes_encrypt .type GFp_vpaes_encrypt,%function .align 4 GFp_vpaes_encrypt: stp x29,x30,[sp,#-16]! add x29,sp,#0 ld1 {v7.16b}, [x0] bl _vpaes_encrypt_preheat bl _vpaes_encrypt_core st1 {v0.16b}, [x1] ldp x29,x30,[sp],#16 ret .size GFp_vpaes_encrypt,.-GFp_vpaes_encrypt .type _vpaes_encrypt_2x,%function .align 4 _vpaes_encrypt_2x: mov x9, x2 ldr w8, [x2,#240] // pull rounds adrp x11, .Lk_mc_forward+16 add x11, x11, :lo12:.Lk_mc_forward+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 and v9.16b, v15.16b, v17.16b ushr v8.16b, v15.16b, #4 tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 tbl v9.16b, {v20.16b}, v9.16b // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 tbl v10.16b, {v21.16b}, v8.16b eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 eor v8.16b, v9.16b, v16.16b eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 eor v8.16b, v8.16b, v10.16b b .Lenc_2x_entry .align 4 .Lenc_2x_loop: // middle of middle round add x10, x11, #0x40 tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u tbl v12.16b, {v25.16b}, v10.16b ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t tbl v8.16b, {v24.16b}, v11.16b eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v12.16b, v12.16b, v16.16b tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u tbl v13.16b, {v27.16b}, v10.16b eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A eor v8.16b, v8.16b, v12.16b tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t tbl v10.16b, {v26.16b}, v11.16b ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B tbl v11.16b, {v8.16b}, v1.16b eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A eor v10.16b, v10.16b, v13.16b tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D tbl v8.16b, {v8.16b}, v4.16b eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B eor v11.16b, v11.16b, v10.16b tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C tbl v12.16b, {v11.16b},v1.16b eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D eor v8.16b, v8.16b, v11.16b and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D eor v8.16b, v8.16b, v12.16b sub w8, w8, #1 // nr-- .Lenc_2x_entry: // top of round and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i and v9.16b, v8.16b, v17.16b ushr v8.16b, v8.16b, #4 tbl v5.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k tbl v13.16b, {v19.16b},v9.16b eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j eor v9.16b, v9.16b, v8.16b tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i tbl v11.16b, {v18.16b},v8.16b tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j tbl v12.16b, {v18.16b},v9.16b eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k eor v11.16b, v11.16b, v13.16b eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k eor v12.16b, v12.16b, v13.16b tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak tbl v10.16b, {v18.16b},v11.16b tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak tbl v11.16b, {v18.16b},v12.16b eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io eor v10.16b, v10.16b, v9.16b eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo eor v11.16b, v11.16b, v8.16b ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 cbnz w8, .Lenc_2x_loop // middle of last round add x10, x11, #0x80 // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou tbl v12.16b, {v22.16b}, v10.16b ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t tbl v8.16b, {v23.16b}, v11.16b eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k eor v12.16b, v12.16b, v16.16b eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A eor v8.16b, v8.16b, v12.16b tbl v0.16b, {v0.16b},v1.16b // vpshufb %xmm1, %xmm0, %xmm0 tbl v1.16b, {v8.16b},v1.16b ret .size _vpaes_encrypt_2x,.-_vpaes_encrypt_2x ######################################################## ## ## ## AES key schedule ## ## ## ######################################################## .type _vpaes_key_preheat,%function .align 4 _vpaes_key_preheat: adrp x10, .Lk_inv add x10, x10, :lo12:.Lk_inv movi v16.16b, #0x5b // .Lk_s63 adrp x11, .Lk_sb1 add x11, x11, :lo12:.Lk_sb1 movi v17.16b, #0x0f // .Lk_s0F ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // .Lk_inv, .Lk_ipt adrp x10, .Lk_dksd add x10, x10, :lo12:.Lk_dksd ld1 {v22.2d,v23.2d}, [x11] // .Lk_sb1 adrp x11, .Lk_mc_forward add x11, x11, :lo12:.Lk_mc_forward ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // .Lk_dksd, .Lk_dksb ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // .Lk_dkse, .Lk_dks9 ld1 {v8.2d}, [x10] // .Lk_rcon ld1 {v9.2d}, [x11] // .Lk_mc_forward[0] ret .size _vpaes_key_preheat,.-_vpaes_key_preheat .type _vpaes_schedule_core,%function .align 4 _vpaes_schedule_core: stp x29, x30, [sp,#-16]! add x29,sp,#0 bl _vpaes_key_preheat // load the tables ld1 {v0.16b}, [x0],#16 // vmovdqu (%rdi), %xmm0 # load key (unaligned) // input transform mov v3.16b, v0.16b // vmovdqa %xmm0, %xmm3 bl _vpaes_schedule_transform mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 adrp x10, .Lk_sr // lea .Lk_sr(%rip),%r10 add x10, x10, :lo12:.Lk_sr add x8, x8, x10 // encrypting, output zeroth round key after transform st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) cmp w1, #192 // cmp $192, %esi b.hi .Lschedule_256 b.eq .Lschedule_192 // 128: fall though ## ## .schedule_128 ## ## 128-bit specific part of key schedule. ## ## This schedule is really simple, because all its parts ## are accomplished by the subroutines. ## .Lschedule_128: mov x0, #10 // mov $10, %esi .Loop_schedule_128: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_round cbz x0, .Lschedule_mangle_last bl _vpaes_schedule_mangle // write output b .Loop_schedule_128 ## ## .aes_schedule_192 ## ## 192-bit specific part of key schedule. ## ## The main body of this schedule is the same as the 128-bit ## schedule, but with more smearing. The long, high side is ## stored in %xmm7 as before, and the short, low side is in ## the high bits of %xmm6. ## ## This schedule is somewhat nastier, however, because each ## round produces 192 bits of key material, or 1.5 round keys. ## Therefore, on each cycle we do 2 rounds and produce 3 round ## keys. ## .align 4 .Lschedule_192: sub x0, x0, #8 ld1 {v0.16b}, [x0] // vmovdqu 8(%rdi),%xmm0 # load key part 2 (very unaligned) bl _vpaes_schedule_transform // input transform mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save short part eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 # clear 4 ins v6.d[0], v4.d[0] // vmovhlps %xmm4, %xmm6, %xmm6 # clobber low side with zeros mov x0, #4 // mov $4, %esi .Loop_schedule_192: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_round ext v0.16b, v6.16b, v0.16b, #8 // vpalignr $8,%xmm6,%xmm0,%xmm0 bl _vpaes_schedule_mangle // save key n bl _vpaes_schedule_192_smear bl _vpaes_schedule_mangle // save key n+1 bl _vpaes_schedule_round cbz x0, .Lschedule_mangle_last bl _vpaes_schedule_mangle // save key n+2 bl _vpaes_schedule_192_smear b .Loop_schedule_192 ## ## .aes_schedule_256 ## ## 256-bit specific part of key schedule. ## ## The structure here is very similar to the 128-bit ## schedule, but with an additional "low side" in ## %xmm6. The low side's rounds are the same as the ## high side's, except no rcon and no rotation. ## .align 4 .Lschedule_256: ld1 {v0.16b}, [x0] // vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) bl _vpaes_schedule_transform // input transform mov x0, #7 // mov $7, %esi .Loop_schedule_256: sub x0, x0, #1 // dec %esi bl _vpaes_schedule_mangle // output low result mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 // high round bl _vpaes_schedule_round cbz x0, .Lschedule_mangle_last bl _vpaes_schedule_mangle // low round. swap xmm7 and xmm6 dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 movi v4.16b, #0 mov v5.16b, v7.16b // vmovdqa %xmm7, %xmm5 mov v7.16b, v6.16b // vmovdqa %xmm6, %xmm7 bl _vpaes_schedule_low_round mov v7.16b, v5.16b // vmovdqa %xmm5, %xmm7 b .Loop_schedule_256 ## ## .aes_schedule_mangle_last ## ## Mangler for last round of key schedule ## Mangles %xmm0 ## when encrypting, outputs out(%xmm0) ^ 63 ## when decrypting, outputs unskew(%xmm0) ## ## Always called right before return... jumps to cleanup and exits ## .align 4 .Lschedule_mangle_last: // schedule last round key from xmm0 adrp x11, .Lk_deskew // lea .Lk_deskew(%rip),%r11 # prepare to deskew add x11, x11, :lo12:.Lk_deskew cbnz w3, .Lschedule_mangle_last_dec // encrypting ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 adrp x11, .Lk_opt // lea .Lk_opt(%rip), %r11 # prepare to output transform add x11, x11, :lo12:.Lk_opt add x2, x2, #32 // add $32, %rdx tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute .Lschedule_mangle_last_dec: ld1 {v20.2d,v21.2d}, [x11] // reload constants sub x2, x2, #16 // add $-16, %rdx eor v0.16b, v0.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm0, %xmm0 bl _vpaes_schedule_transform // output transform st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) # save last key // cleanup eor v0.16b, v0.16b, v0.16b // vpxor %xmm0, %xmm0, %xmm0 eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 eor v2.16b, v2.16b, v2.16b // vpxor %xmm2, %xmm2, %xmm2 eor v3.16b, v3.16b, v3.16b // vpxor %xmm3, %xmm3, %xmm3 eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 eor v5.16b, v5.16b, v5.16b // vpxor %xmm5, %xmm5, %xmm5 eor v6.16b, v6.16b, v6.16b // vpxor %xmm6, %xmm6, %xmm6 eor v7.16b, v7.16b, v7.16b // vpxor %xmm7, %xmm7, %xmm7 ldp x29, x30, [sp],#16 ret .size _vpaes_schedule_core,.-_vpaes_schedule_core ## ## .aes_schedule_192_smear ## ## Smear the short, low side in the 192-bit key schedule. ## ## Inputs: ## %xmm7: high side, b a x y ## %xmm6: low side, d c 0 0 ## %xmm13: 0 ## ## Outputs: ## %xmm6: b+c+d b+c 0 0 ## %xmm0: b+c+d b+c b a ## .type _vpaes_schedule_192_smear,%function .align 4 _vpaes_schedule_192_smear: movi v1.16b, #0 dup v0.4s, v7.s[3] ins v1.s[3], v6.s[2] // vpshufd $0x80, %xmm6, %xmm1 # d c 0 0 -> c 0 0 0 ins v0.s[0], v7.s[2] // vpshufd $0xFE, %xmm7, %xmm0 # b a _ _ -> b b b a eor v6.16b, v6.16b, v1.16b // vpxor %xmm1, %xmm6, %xmm6 # -> c+d c 0 0 eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 eor v6.16b, v6.16b, v0.16b // vpxor %xmm0, %xmm6, %xmm6 # -> b+c+d b+c b a mov v0.16b, v6.16b // vmovdqa %xmm6, %xmm0 ins v6.d[0], v1.d[0] // vmovhlps %xmm1, %xmm6, %xmm6 # clobber low side with zeros ret .size _vpaes_schedule_192_smear,.-_vpaes_schedule_192_smear ## ## .aes_schedule_round ## ## Runs one main round of the key schedule on %xmm0, %xmm7 ## ## Specifically, runs subbytes on the high dword of %xmm0 ## then rotates it by one byte and xors into the low dword of ## %xmm7. ## ## Adds rcon from low byte of %xmm8, then rotates %xmm8 for ## next rcon. ## ## Smears the dwords of %xmm7 by xoring the low into the ## second low, result into third, result into highest. ## ## Returns results in %xmm7 = %xmm0. ## Clobbers %xmm1-%xmm4, %r11. ## .type _vpaes_schedule_round,%function .align 4 _vpaes_schedule_round: // extract rcon from xmm8 movi v4.16b, #0 // vpxor %xmm4, %xmm4, %xmm4 ext v1.16b, v8.16b, v4.16b, #15 // vpalignr $15, %xmm8, %xmm4, %xmm1 ext v8.16b, v8.16b, v8.16b, #15 // vpalignr $15, %xmm8, %xmm8, %xmm8 eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 // rotate dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 ext v0.16b, v0.16b, v0.16b, #1 // vpalignr $1, %xmm0, %xmm0, %xmm0 // fall through... // low round: same as high round, but no rotation and no rcon. _vpaes_schedule_low_round: // smear xmm7 ext v1.16b, v4.16b, v7.16b, #12 // vpslldq $4, %xmm7, %xmm1 eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 ext v4.16b, v4.16b, v7.16b, #8 // vpslldq $8, %xmm7, %xmm4 // subbytes and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i eor v7.16b, v7.16b, v4.16b // vpxor %xmm4, %xmm7, %xmm7 tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j eor v7.16b, v7.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm7, %xmm7 tbl v3.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k tbl v2.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak eor v3.16b, v3.16b, v1.16b // vpxor %xmm1, %xmm3, %xmm3 # 2 = io eor v2.16b, v2.16b, v0.16b // vpxor %xmm0, %xmm2, %xmm2 # 3 = jo tbl v4.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou tbl v1.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t eor v1.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output // add in smeared stuff eor v0.16b, v1.16b, v7.16b // vpxor %xmm7, %xmm1, %xmm0 eor v7.16b, v1.16b, v7.16b // vmovdqa %xmm0, %xmm7 ret .size _vpaes_schedule_round,.-_vpaes_schedule_round ## ## .aes_schedule_transform ## ## Linear-transform %xmm0 according to tables at (%r11) ## ## Requires that %xmm9 = 0x0F0F... as in preheat ## Output in %xmm0 ## Clobbers %xmm1, %xmm2 ## .type _vpaes_schedule_transform,%function .align 4 _vpaes_schedule_transform: and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 // vmovdqa (%r11), %xmm2 # lo tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 // vmovdqa 16(%r11), %xmm1 # hi tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 ret .size _vpaes_schedule_transform,.-_vpaes_schedule_transform ## ## .aes_schedule_mangle ## ## Mangle xmm0 from (basis-transformed) standard version ## to our version. ## ## On encrypt, ## xor with 0x63 ## multiply by circulant 0,1,1,1 ## apply shiftrows transform ## ## On decrypt, ## xor with 0x63 ## multiply by "inverse mixcolumns" circulant E,B,D,9 ## deskew ## apply shiftrows transform ## ## ## Writes out to (%rdx), and increments or decrements it ## Keeps track of round number mod 4 in %r8 ## Preserves xmm0 ## Clobbers xmm1-xmm5 ## .type _vpaes_schedule_mangle,%function .align 4 _vpaes_schedule_mangle: mov v4.16b, v0.16b // vmovdqa %xmm0, %xmm4 # save xmm0 for later // vmovdqa .Lk_mc_forward(%rip),%xmm5 // encrypting eor v4.16b, v0.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm0, %xmm4 add x2, x2, #16 // add $16, %rdx tbl v4.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm4 tbl v1.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm1 tbl v3.16b, {v1.16b}, v9.16b // vpshufb %xmm5, %xmm1, %xmm3 eor v4.16b, v4.16b, v1.16b // vpxor %xmm1, %xmm4, %xmm4 ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 eor v3.16b, v3.16b, v4.16b // vpxor %xmm4, %xmm3, %xmm3 .Lschedule_mangle_both: tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 add x8, x8, #64-16 // add $-16, %r8 and x8, x8, #~(1<<6) // and $0x30, %r8 st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) ret .size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle .globl GFp_vpaes_set_encrypt_key .hidden GFp_vpaes_set_encrypt_key .type GFp_vpaes_set_encrypt_key,%function .align 4 GFp_vpaes_set_encrypt_key: stp x29,x30,[sp,#-16]! add x29,sp,#0 stp d8,d9,[sp,#-16]! // ABI spec says so lsr w9, w1, #5 // shr $5,%eax add w9, w9, #5 // $5,%eax str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; mov w3, #0 // mov $0,%ecx mov x8, #0x30 // mov $0x30,%r8d bl _vpaes_schedule_core eor x0, x0, x0 ldp d8,d9,[sp],#16 ldp x29,x30,[sp],#16 ret .size GFp_vpaes_set_encrypt_key,.-GFp_vpaes_set_encrypt_key .globl GFp_vpaes_ctr32_encrypt_blocks .hidden GFp_vpaes_ctr32_encrypt_blocks .type GFp_vpaes_ctr32_encrypt_blocks,%function .align 4 GFp_vpaes_ctr32_encrypt_blocks: stp x29,x30,[sp,#-16]! add x29,sp,#0 stp d8,d9,[sp,#-16]! // ABI spec says so stp d10,d11,[sp,#-16]! stp d12,d13,[sp,#-16]! stp d14,d15,[sp,#-16]! cbz x2, .Lctr32_done // Note, unlike the other functions, x2 here is measured in blocks, // not bytes. mov x17, x2 mov x2, x3 // Load the IV and counter portion. ldr w6, [x4, #12] ld1 {v7.16b}, [x4] bl _vpaes_encrypt_preheat tst x17, #1 rev w6, w6 // The counter is big-endian. b.eq .Lctr32_prep_loop // Handle one block so the remaining block count is even for // _vpaes_encrypt_2x. ld1 {v6.16b}, [x0], #16 // .Load input ahead of time bl _vpaes_encrypt_core eor v0.16b, v0.16b, v6.16b // XOR input and result st1 {v0.16b}, [x1], #16 subs x17, x17, #1 // Update the counter. add w6, w6, #1 rev w7, w6 mov v7.s[3], w7 b.ls .Lctr32_done .Lctr32_prep_loop: // _vpaes_encrypt_core takes its input from v7, while _vpaes_encrypt_2x // uses v14 and v15. mov v15.16b, v7.16b mov v14.16b, v7.16b add w6, w6, #1 rev w7, w6 mov v15.s[3], w7 .Lctr32_loop: ld1 {v6.16b,v7.16b}, [x0], #32 // .Load input ahead of time bl _vpaes_encrypt_2x eor v0.16b, v0.16b, v6.16b // XOR input and result eor v1.16b, v1.16b, v7.16b // XOR input and result (#2) st1 {v0.16b,v1.16b}, [x1], #32 subs x17, x17, #2 // Update the counter. add w7, w6, #1 add w6, w6, #2 rev w7, w7 mov v14.s[3], w7 rev w7, w6 mov v15.s[3], w7 b.hi .Lctr32_loop .Lctr32_done: ldp d14,d15,[sp],#16 ldp d12,d13,[sp],#16 ldp d10,d11,[sp],#16 ldp d8,d9,[sp],#16 ldp x29,x30,[sp],#16 ret .size GFp_vpaes_ctr32_encrypt_blocks,.-GFp_vpaes_ctr32_encrypt_blocks #endif #endif // !OPENSSL_NO_ASM ring-0.16.9/pregenerated/vpaes-x86-elf.S000064400000000000000000000222561353224261000160370ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .align 64 .L_vpaes_consts: .long 218628480,235210255,168496130,67568393 .long 252381056,17041926,33884169,51187212 .long 252645135,252645135,252645135,252645135 .long 1512730624,3266504856,1377990664,3401244816 .long 830229760,1275146365,2969422977,3447763452 .long 3411033600,2979783055,338359620,2782886510 .long 4209124096,907596821,221174255,1006095553 .long 191964160,3799684038,3164090317,1589111125 .long 182528256,1777043520,2877432650,3265356744 .long 1874708224,3503451415,3305285752,363511674 .long 1606117888,3487855781,1093350906,2384367825 .long 197121,67569157,134941193,202313229 .long 67569157,134941193,202313229,197121 .long 134941193,202313229,197121,67569157 .long 202313229,197121,67569157,134941193 .long 33619971,100992007,168364043,235736079 .long 235736079,33619971,100992007,168364043 .long 168364043,235736079,33619971,100992007 .long 100992007,168364043,235736079,33619971 .long 50462976,117835012,185207048,252579084 .long 252314880,51251460,117574920,184942860 .long 184682752,252054788,50987272,118359308 .long 118099200,185467140,251790600,50727180 .long 2946363062,528716217,1300004225,1881839624 .long 1532713819,1532713819,1532713819,1532713819 .long 3602276352,4288629033,3737020424,4153884961 .long 1354558464,32357713,2958822624,3775749553 .long 1201988352,132424512,1572796698,503232858 .long 2213177600,1597421020,4103937655,675398315 .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 .byte 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 .byte 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 .byte 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 .byte 118,101,114,115,105,116,121,41,0 .align 64 .hidden _vpaes_preheat .type _vpaes_preheat,@function .align 16 _vpaes_preheat: addl (%esp),%ebp movdqa -48(%ebp),%xmm7 movdqa -16(%ebp),%xmm6 ret .size _vpaes_preheat,.-_vpaes_preheat .hidden _vpaes_encrypt_core .type _vpaes_encrypt_core,@function .align 16 _vpaes_encrypt_core: movl $16,%ecx movl 240(%edx),%eax movdqa %xmm6,%xmm1 movdqa (%ebp),%xmm2 pandn %xmm0,%xmm1 pand %xmm6,%xmm0 movdqu (%edx),%xmm5 .byte 102,15,56,0,208 movdqa 16(%ebp),%xmm0 pxor %xmm5,%xmm2 psrld $4,%xmm1 addl $16,%edx .byte 102,15,56,0,193 leal 192(%ebp),%ebx pxor %xmm2,%xmm0 jmp .L000enc_entry .align 16 .L001enc_loop: movdqa 32(%ebp),%xmm4 movdqa 48(%ebp),%xmm0 .byte 102,15,56,0,226 .byte 102,15,56,0,195 pxor %xmm5,%xmm4 movdqa 64(%ebp),%xmm5 pxor %xmm4,%xmm0 movdqa -64(%ebx,%ecx,1),%xmm1 .byte 102,15,56,0,234 movdqa 80(%ebp),%xmm2 movdqa (%ebx,%ecx,1),%xmm4 .byte 102,15,56,0,211 movdqa %xmm0,%xmm3 pxor %xmm5,%xmm2 .byte 102,15,56,0,193 addl $16,%edx pxor %xmm2,%xmm0 .byte 102,15,56,0,220 addl $16,%ecx pxor %xmm0,%xmm3 .byte 102,15,56,0,193 andl $48,%ecx subl $1,%eax pxor %xmm3,%xmm0 .L000enc_entry: movdqa %xmm6,%xmm1 movdqa -32(%ebp),%xmm5 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm6,%xmm0 .byte 102,15,56,0,232 movdqa %xmm7,%xmm3 pxor %xmm1,%xmm0 .byte 102,15,56,0,217 movdqa %xmm7,%xmm4 pxor %xmm5,%xmm3 .byte 102,15,56,0,224 movdqa %xmm7,%xmm2 pxor %xmm5,%xmm4 .byte 102,15,56,0,211 movdqa %xmm7,%xmm3 pxor %xmm0,%xmm2 .byte 102,15,56,0,220 movdqu (%edx),%xmm5 pxor %xmm1,%xmm3 jnz .L001enc_loop movdqa 96(%ebp),%xmm4 movdqa 112(%ebp),%xmm0 .byte 102,15,56,0,226 pxor %xmm5,%xmm4 .byte 102,15,56,0,195 movdqa 64(%ebx,%ecx,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 ret .size _vpaes_encrypt_core,.-_vpaes_encrypt_core .hidden _vpaes_schedule_core .type _vpaes_schedule_core,@function .align 16 _vpaes_schedule_core: addl (%esp),%ebp movdqu (%esi),%xmm0 movdqa 320(%ebp),%xmm2 movdqa %xmm0,%xmm3 leal (%ebp),%ebx movdqa %xmm2,4(%esp) call _vpaes_schedule_transform movdqa %xmm0,%xmm7 testl %edi,%edi jnz .L002schedule_am_decrypting movdqu %xmm0,(%edx) jmp .L003schedule_go .L002schedule_am_decrypting: movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,217 movdqu %xmm3,(%edx) xorl $48,%ecx .L003schedule_go: cmpl $192,%eax ja .L004schedule_256 .L005schedule_128: movl $10,%eax .L006loop_schedule_128: call _vpaes_schedule_round decl %eax jz .L007schedule_mangle_last call _vpaes_schedule_mangle jmp .L006loop_schedule_128 .align 16 .L004schedule_256: movdqu 16(%esi),%xmm0 call _vpaes_schedule_transform movl $7,%eax .L008loop_schedule_256: call _vpaes_schedule_mangle movdqa %xmm0,%xmm6 call _vpaes_schedule_round decl %eax jz .L007schedule_mangle_last call _vpaes_schedule_mangle pshufd $255,%xmm0,%xmm0 movdqa %xmm7,20(%esp) movdqa %xmm6,%xmm7 call .L_vpaes_schedule_low_round movdqa 20(%esp),%xmm7 jmp .L008loop_schedule_256 .align 16 .L007schedule_mangle_last: leal 384(%ebp),%ebx testl %edi,%edi jnz .L009schedule_mangle_last_dec movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,193 leal 352(%ebp),%ebx addl $32,%edx .L009schedule_mangle_last_dec: addl $-16,%edx pxor 336(%ebp),%xmm0 call _vpaes_schedule_transform movdqu %xmm0,(%edx) pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 ret .size _vpaes_schedule_core,.-_vpaes_schedule_core .hidden _vpaes_schedule_round .type _vpaes_schedule_round,@function .align 16 _vpaes_schedule_round: movdqa 8(%esp),%xmm2 pxor %xmm1,%xmm1 .byte 102,15,58,15,202,15 .byte 102,15,58,15,210,15 pxor %xmm1,%xmm7 pshufd $255,%xmm0,%xmm0 .byte 102,15,58,15,192,1 movdqa %xmm2,8(%esp) .L_vpaes_schedule_low_round: movdqa %xmm7,%xmm1 pslldq $4,%xmm7 pxor %xmm1,%xmm7 movdqa %xmm7,%xmm1 pslldq $8,%xmm7 pxor %xmm1,%xmm7 pxor 336(%ebp),%xmm7 movdqa -16(%ebp),%xmm4 movdqa -48(%ebp),%xmm5 movdqa %xmm4,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm4,%xmm0 movdqa -32(%ebp),%xmm2 .byte 102,15,56,0,208 pxor %xmm1,%xmm0 movdqa %xmm5,%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 movdqa %xmm5,%xmm4 .byte 102,15,56,0,224 pxor %xmm2,%xmm4 movdqa %xmm5,%xmm2 .byte 102,15,56,0,211 pxor %xmm0,%xmm2 movdqa %xmm5,%xmm3 .byte 102,15,56,0,220 pxor %xmm1,%xmm3 movdqa 32(%ebp),%xmm4 .byte 102,15,56,0,226 movdqa 48(%ebp),%xmm0 .byte 102,15,56,0,195 pxor %xmm4,%xmm0 pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 ret .size _vpaes_schedule_round,.-_vpaes_schedule_round .hidden _vpaes_schedule_transform .type _vpaes_schedule_transform,@function .align 16 _vpaes_schedule_transform: movdqa -16(%ebp),%xmm2 movdqa %xmm2,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm2,%xmm0 movdqa (%ebx),%xmm2 .byte 102,15,56,0,208 movdqa 16(%ebx),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 ret .size _vpaes_schedule_transform,.-_vpaes_schedule_transform .hidden _vpaes_schedule_mangle .type _vpaes_schedule_mangle,@function .align 16 _vpaes_schedule_mangle: movdqa %xmm0,%xmm4 movdqa 128(%ebp),%xmm5 testl %edi,%edi jnz .L010schedule_mangle_dec addl $16,%edx pxor 336(%ebp),%xmm4 .byte 102,15,56,0,229 movdqa %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 jmp .L011schedule_mangle_both .align 16 .L010schedule_mangle_dec: movdqa -16(%ebp),%xmm2 leal (%ebp),%esi movdqa %xmm2,%xmm1 pandn %xmm4,%xmm1 psrld $4,%xmm1 pand %xmm2,%xmm4 movdqa (%esi),%xmm2 .byte 102,15,56,0,212 movdqa 16(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 32(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 48(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 64(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 80(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 96(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 112(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 addl $-16,%edx .L011schedule_mangle_both: movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,217 addl $-16,%ecx andl $48,%ecx movdqu %xmm3,(%edx) ret .size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle .globl GFp_vpaes_set_encrypt_key .hidden GFp_vpaes_set_encrypt_key .type GFp_vpaes_set_encrypt_key,@function .align 16 GFp_vpaes_set_encrypt_key: .L_GFp_vpaes_set_encrypt_key_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi leal -56(%esp),%ebx movl 24(%esp),%eax andl $-16,%ebx movl 28(%esp),%edx xchgl %esp,%ebx movl %ebx,48(%esp) movl %eax,%ebx shrl $5,%ebx addl $5,%ebx movl %ebx,240(%edx) movl $48,%ecx movl $0,%edi leal .L_vpaes_consts+0x30-.L012pic_point,%ebp call _vpaes_schedule_core .L012pic_point: movl 48(%esp),%esp xorl %eax,%eax popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_vpaes_set_encrypt_key,.-.L_GFp_vpaes_set_encrypt_key_begin .globl GFp_vpaes_encrypt .hidden GFp_vpaes_encrypt .type GFp_vpaes_encrypt,@function .align 16 GFp_vpaes_encrypt: .L_GFp_vpaes_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi leal .L_vpaes_consts+0x30-.L013pic_point,%ebp call _vpaes_preheat .L013pic_point: movl 20(%esp),%esi leal -56(%esp),%ebx movl 24(%esp),%edi andl $-16,%ebx movl 28(%esp),%edx xchgl %esp,%ebx movl %ebx,48(%esp) movdqu (%esi),%xmm0 call _vpaes_encrypt_core movdqu %xmm0,(%edi) movl 48(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_vpaes_encrypt,.-.L_GFp_vpaes_encrypt_begin #endif ring-0.16.9/pregenerated/vpaes-x86-macosx.S000064400000000000000000000210451353224260700165640ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .align 6,0x90 L_vpaes_consts: .long 218628480,235210255,168496130,67568393 .long 252381056,17041926,33884169,51187212 .long 252645135,252645135,252645135,252645135 .long 1512730624,3266504856,1377990664,3401244816 .long 830229760,1275146365,2969422977,3447763452 .long 3411033600,2979783055,338359620,2782886510 .long 4209124096,907596821,221174255,1006095553 .long 191964160,3799684038,3164090317,1589111125 .long 182528256,1777043520,2877432650,3265356744 .long 1874708224,3503451415,3305285752,363511674 .long 1606117888,3487855781,1093350906,2384367825 .long 197121,67569157,134941193,202313229 .long 67569157,134941193,202313229,197121 .long 134941193,202313229,197121,67569157 .long 202313229,197121,67569157,134941193 .long 33619971,100992007,168364043,235736079 .long 235736079,33619971,100992007,168364043 .long 168364043,235736079,33619971,100992007 .long 100992007,168364043,235736079,33619971 .long 50462976,117835012,185207048,252579084 .long 252314880,51251460,117574920,184942860 .long 184682752,252054788,50987272,118359308 .long 118099200,185467140,251790600,50727180 .long 2946363062,528716217,1300004225,1881839624 .long 1532713819,1532713819,1532713819,1532713819 .long 3602276352,4288629033,3737020424,4153884961 .long 1354558464,32357713,2958822624,3775749553 .long 1201988352,132424512,1572796698,503232858 .long 2213177600,1597421020,4103937655,675398315 .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 .byte 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 .byte 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 .byte 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 .byte 118,101,114,115,105,116,121,41,0 .align 6,0x90 .private_extern __vpaes_preheat .align 4 __vpaes_preheat: addl (%esp),%ebp movdqa -48(%ebp),%xmm7 movdqa -16(%ebp),%xmm6 ret .private_extern __vpaes_encrypt_core .align 4 __vpaes_encrypt_core: movl $16,%ecx movl 240(%edx),%eax movdqa %xmm6,%xmm1 movdqa (%ebp),%xmm2 pandn %xmm0,%xmm1 pand %xmm6,%xmm0 movdqu (%edx),%xmm5 .byte 102,15,56,0,208 movdqa 16(%ebp),%xmm0 pxor %xmm5,%xmm2 psrld $4,%xmm1 addl $16,%edx .byte 102,15,56,0,193 leal 192(%ebp),%ebx pxor %xmm2,%xmm0 jmp L000enc_entry .align 4,0x90 L001enc_loop: movdqa 32(%ebp),%xmm4 movdqa 48(%ebp),%xmm0 .byte 102,15,56,0,226 .byte 102,15,56,0,195 pxor %xmm5,%xmm4 movdqa 64(%ebp),%xmm5 pxor %xmm4,%xmm0 movdqa -64(%ebx,%ecx,1),%xmm1 .byte 102,15,56,0,234 movdqa 80(%ebp),%xmm2 movdqa (%ebx,%ecx,1),%xmm4 .byte 102,15,56,0,211 movdqa %xmm0,%xmm3 pxor %xmm5,%xmm2 .byte 102,15,56,0,193 addl $16,%edx pxor %xmm2,%xmm0 .byte 102,15,56,0,220 addl $16,%ecx pxor %xmm0,%xmm3 .byte 102,15,56,0,193 andl $48,%ecx subl $1,%eax pxor %xmm3,%xmm0 L000enc_entry: movdqa %xmm6,%xmm1 movdqa -32(%ebp),%xmm5 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm6,%xmm0 .byte 102,15,56,0,232 movdqa %xmm7,%xmm3 pxor %xmm1,%xmm0 .byte 102,15,56,0,217 movdqa %xmm7,%xmm4 pxor %xmm5,%xmm3 .byte 102,15,56,0,224 movdqa %xmm7,%xmm2 pxor %xmm5,%xmm4 .byte 102,15,56,0,211 movdqa %xmm7,%xmm3 pxor %xmm0,%xmm2 .byte 102,15,56,0,220 movdqu (%edx),%xmm5 pxor %xmm1,%xmm3 jnz L001enc_loop movdqa 96(%ebp),%xmm4 movdqa 112(%ebp),%xmm0 .byte 102,15,56,0,226 pxor %xmm5,%xmm4 .byte 102,15,56,0,195 movdqa 64(%ebx,%ecx,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 ret .private_extern __vpaes_schedule_core .align 4 __vpaes_schedule_core: addl (%esp),%ebp movdqu (%esi),%xmm0 movdqa 320(%ebp),%xmm2 movdqa %xmm0,%xmm3 leal (%ebp),%ebx movdqa %xmm2,4(%esp) call __vpaes_schedule_transform movdqa %xmm0,%xmm7 testl %edi,%edi jnz L002schedule_am_decrypting movdqu %xmm0,(%edx) jmp L003schedule_go L002schedule_am_decrypting: movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,217 movdqu %xmm3,(%edx) xorl $48,%ecx L003schedule_go: cmpl $192,%eax ja L004schedule_256 L005schedule_128: movl $10,%eax L006loop_schedule_128: call __vpaes_schedule_round decl %eax jz L007schedule_mangle_last call __vpaes_schedule_mangle jmp L006loop_schedule_128 .align 4,0x90 L004schedule_256: movdqu 16(%esi),%xmm0 call __vpaes_schedule_transform movl $7,%eax L008loop_schedule_256: call __vpaes_schedule_mangle movdqa %xmm0,%xmm6 call __vpaes_schedule_round decl %eax jz L007schedule_mangle_last call __vpaes_schedule_mangle pshufd $255,%xmm0,%xmm0 movdqa %xmm7,20(%esp) movdqa %xmm6,%xmm7 call L_vpaes_schedule_low_round movdqa 20(%esp),%xmm7 jmp L008loop_schedule_256 .align 4,0x90 L007schedule_mangle_last: leal 384(%ebp),%ebx testl %edi,%edi jnz L009schedule_mangle_last_dec movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,193 leal 352(%ebp),%ebx addl $32,%edx L009schedule_mangle_last_dec: addl $-16,%edx pxor 336(%ebp),%xmm0 call __vpaes_schedule_transform movdqu %xmm0,(%edx) pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 ret .private_extern __vpaes_schedule_round .align 4 __vpaes_schedule_round: movdqa 8(%esp),%xmm2 pxor %xmm1,%xmm1 .byte 102,15,58,15,202,15 .byte 102,15,58,15,210,15 pxor %xmm1,%xmm7 pshufd $255,%xmm0,%xmm0 .byte 102,15,58,15,192,1 movdqa %xmm2,8(%esp) L_vpaes_schedule_low_round: movdqa %xmm7,%xmm1 pslldq $4,%xmm7 pxor %xmm1,%xmm7 movdqa %xmm7,%xmm1 pslldq $8,%xmm7 pxor %xmm1,%xmm7 pxor 336(%ebp),%xmm7 movdqa -16(%ebp),%xmm4 movdqa -48(%ebp),%xmm5 movdqa %xmm4,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm4,%xmm0 movdqa -32(%ebp),%xmm2 .byte 102,15,56,0,208 pxor %xmm1,%xmm0 movdqa %xmm5,%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 movdqa %xmm5,%xmm4 .byte 102,15,56,0,224 pxor %xmm2,%xmm4 movdqa %xmm5,%xmm2 .byte 102,15,56,0,211 pxor %xmm0,%xmm2 movdqa %xmm5,%xmm3 .byte 102,15,56,0,220 pxor %xmm1,%xmm3 movdqa 32(%ebp),%xmm4 .byte 102,15,56,0,226 movdqa 48(%ebp),%xmm0 .byte 102,15,56,0,195 pxor %xmm4,%xmm0 pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 ret .private_extern __vpaes_schedule_transform .align 4 __vpaes_schedule_transform: movdqa -16(%ebp),%xmm2 movdqa %xmm2,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm2,%xmm0 movdqa (%ebx),%xmm2 .byte 102,15,56,0,208 movdqa 16(%ebx),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 ret .private_extern __vpaes_schedule_mangle .align 4 __vpaes_schedule_mangle: movdqa %xmm0,%xmm4 movdqa 128(%ebp),%xmm5 testl %edi,%edi jnz L010schedule_mangle_dec addl $16,%edx pxor 336(%ebp),%xmm4 .byte 102,15,56,0,229 movdqa %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 jmp L011schedule_mangle_both .align 4,0x90 L010schedule_mangle_dec: movdqa -16(%ebp),%xmm2 leal (%ebp),%esi movdqa %xmm2,%xmm1 pandn %xmm4,%xmm1 psrld $4,%xmm1 pand %xmm2,%xmm4 movdqa (%esi),%xmm2 .byte 102,15,56,0,212 movdqa 16(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 32(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 48(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 64(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 80(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 .byte 102,15,56,0,221 movdqa 96(%esi),%xmm2 .byte 102,15,56,0,212 pxor %xmm3,%xmm2 movdqa 112(%esi),%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 addl $-16,%edx L011schedule_mangle_both: movdqa 256(%ebp,%ecx,1),%xmm1 .byte 102,15,56,0,217 addl $-16,%ecx andl $48,%ecx movdqu %xmm3,(%edx) ret .globl _GFp_vpaes_set_encrypt_key .private_extern _GFp_vpaes_set_encrypt_key .align 4 _GFp_vpaes_set_encrypt_key: L_GFp_vpaes_set_encrypt_key_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 20(%esp),%esi leal -56(%esp),%ebx movl 24(%esp),%eax andl $-16,%ebx movl 28(%esp),%edx xchgl %esp,%ebx movl %ebx,48(%esp) movl %eax,%ebx shrl $5,%ebx addl $5,%ebx movl %ebx,240(%edx) movl $48,%ecx movl $0,%edi leal L_vpaes_consts+0x30-L012pic_point,%ebp call __vpaes_schedule_core L012pic_point: movl 48(%esp),%esp xorl %eax,%eax popl %edi popl %esi popl %ebx popl %ebp ret .globl _GFp_vpaes_encrypt .private_extern _GFp_vpaes_encrypt .align 4 _GFp_vpaes_encrypt: L_GFp_vpaes_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi leal L_vpaes_consts+0x30-L013pic_point,%ebp call __vpaes_preheat L013pic_point: movl 20(%esp),%esi leal -56(%esp),%ebx movl 24(%esp),%edi andl $-16,%ebx movl 28(%esp),%edx xchgl %esp,%ebx movl %ebx,48(%esp) movdqu (%esi),%xmm0 call __vpaes_encrypt_core movdqu %xmm0,(%edi) movl 48(%esp),%esp popl %edi popl %esi popl %ebx popl %ebp ret #endif ring-0.16.9/pregenerated/vpaes-x86-win32n.obj000064400000000000000000000165741353224260700167750ustar0000000000000000LEi]#.text> p`.debug$Sr6@B.debug$T @B       p*Zx"RM|1}0L>PˏᛱD*nzߥ#6. ;$q Ɠz/U^) @iJ#cǽomxzj_t5+Aѐ                                    }|M*p[[[[[[[[[[[[[[[[`)Ih!APQ \] G@]Ziܵ6_wA(Vector Permutation AES for x86/SSSE3, Mike Hamburg (Stanford University) ,$fo}fouffofoUffo*f8foEffrf8fpfoe foE0f8f8ffom@ffoL f8foUPfo$ f8foff8ff8܃ff80ffofomffrff8foff8foff8foff8foff8o*f9foe`foEpf8ff8foL @ff8Ð,$ofo@fo؍]fT$fo fo f80=* Hi oFvfoH,fpf|$fofo|$&fo f8` fPffffffffÍfoT$ff:f:ffpf:fT$fofsffofsffPfoefomfoffrffoUf8ffof8ffof8ffof8ffof8ffoe f8foE0f8fffoÐt&foUfoffrffof8foCf8fffofo,fPf8fof8ff8ffoUufoffrffof8fo^f8ff8foV f8ffo^0f8ff8foV@f8ffo^Pf8ff8foV`f8ffo^pf8fڃfo f8ك0ÐUSVWt$\$ȋD$T$\$00-@d$01_^[]Ðt&USVW-!1t$\$ȋ|$T$\$0od$0_^[]/P:\ring\pregenerated\tmp\vpaes-x86-win32n.asmLJs#a, >N|  0@P`p !"#$%&'()* +0,@-P.`/p0123456789:;@>C?H@MANBPDUE[F_GdHhIlJpKuLzM~NOPQRSTVWXYZ[\]^_`abcdefghijklm opqrs t%u)v-w2x6y:z?{C|G}L~PTY]aglqvz$(-.49>DHMSX`fhnw| $(-26:?CGLPTY]afjoty~     !"# $%&'(")'*,+0,5-:.?/C0H1M2Q3V4[5`6d7i8n9r:w;|<=>?@ACDEFGHJMNOPQRSTUVWXYZ[\]^_abcdefgilmnop qstuvw"x$y(z,{1|5}9~:;<=0P:\ring\pregenerated\vpaes-x86-win32n.objyasm 1.3.0L$_vpaes_consts@__vpaes_preheatP__vpaes_encrypt_core L$000enc_entryL$001enc_loop__vpaes_schedule_core$__vpaes_schedule_transform%L$002schedule_am_decryptingL$003schedule_goL$004schedule_256L$005schedule_128 L$006loop_schedule_128 __vpaes_schedule_round#`L$007schedule_mangle_last!__vpaes_schedule_mangle L$008loop_schedule_256%L$_vpaes_schedule_low_round'L$009schedule_mangle_last_dec"L$010schedule_mangle_dec#L$011schedule_mangle_both$_GFp_vpaes_set_encrypt_key,L$_GFp_vpaes_set_encrypt_key_beginL$012pic_point_GFp_vpaes_encrypt$L$_GFp_vpaes_encrypt_beginL$013pic_pointd h K  O  f  j                B  F  ^  b  {              $  (  F  J  m  q          3 7 M Q k o   .fileg@feat.00.text>*:@JP_ n|,`F^u /B].debug$S6.debug$T lpregenerated\tmp\vpaes-x86-win32n.asmL$_vpaes_consts__vpaes_preheat__vpaes_encrypt_coreL$000enc_entryL$001enc_loop__vpaes_schedule_core__vpaes_schedule_transformL$002schedule_am_decryptingL$003schedule_goL$004schedule_256L$005schedule_128L$006loop_schedule_128__vpaes_schedule_roundL$007schedule_mangle_last__vpaes_schedule_mangleL$008loop_schedule_256L$_vpaes_schedule_low_roundL$009schedule_mangle_last_decL$010schedule_mangle_decL$011schedule_mangle_both_GFp_vpaes_set_encrypt_keyL$_GFp_vpaes_set_encrypt_key_beginL$012pic_point_GFp_vpaes_encryptL$_GFp_vpaes_encrypt_beginL$013pic_pointring-0.16.9/pregenerated/vpaes-x86_64-elf.S000064400000000000000000000173661353224260300163600ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .type _vpaes_encrypt_core,@function .align 16 _vpaes_encrypt_core: .cfi_startproc movq %rdx,%r9 movq $16,%r11 movl 240(%rdx),%eax movdqa %xmm9,%xmm1 movdqa .Lk_ipt(%rip),%xmm2 pandn %xmm0,%xmm1 movdqu (%r9),%xmm5 psrld $4,%xmm1 pand %xmm9,%xmm0 .byte 102,15,56,0,208 movdqa .Lk_ipt+16(%rip),%xmm0 .byte 102,15,56,0,193 pxor %xmm5,%xmm2 addq $16,%r9 pxor %xmm2,%xmm0 leaq .Lk_mc_backward(%rip),%r10 jmp .Lenc_entry .align 16 .Lenc_loop: movdqa %xmm13,%xmm4 movdqa %xmm12,%xmm0 .byte 102,15,56,0,226 .byte 102,15,56,0,195 pxor %xmm5,%xmm4 movdqa %xmm15,%xmm5 pxor %xmm4,%xmm0 movdqa -64(%r11,%r10,1),%xmm1 .byte 102,15,56,0,234 movdqa (%r11,%r10,1),%xmm4 movdqa %xmm14,%xmm2 .byte 102,15,56,0,211 movdqa %xmm0,%xmm3 pxor %xmm5,%xmm2 .byte 102,15,56,0,193 addq $16,%r9 pxor %xmm2,%xmm0 .byte 102,15,56,0,220 addq $16,%r11 pxor %xmm0,%xmm3 .byte 102,15,56,0,193 andq $0x30,%r11 subq $1,%rax pxor %xmm3,%xmm0 .Lenc_entry: movdqa %xmm9,%xmm1 movdqa %xmm11,%xmm5 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 .byte 102,15,56,0,232 movdqa %xmm10,%xmm3 pxor %xmm1,%xmm0 .byte 102,15,56,0,217 movdqa %xmm10,%xmm4 pxor %xmm5,%xmm3 .byte 102,15,56,0,224 movdqa %xmm10,%xmm2 pxor %xmm5,%xmm4 .byte 102,15,56,0,211 movdqa %xmm10,%xmm3 pxor %xmm0,%xmm2 .byte 102,15,56,0,220 movdqu (%r9),%xmm5 pxor %xmm1,%xmm3 jnz .Lenc_loop movdqa -96(%r10),%xmm4 movdqa -80(%r10),%xmm0 .byte 102,15,56,0,226 pxor %xmm5,%xmm4 .byte 102,15,56,0,195 movdqa 64(%r11,%r10,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_encrypt_core,.-_vpaes_encrypt_core .type _vpaes_schedule_core,@function .align 16 _vpaes_schedule_core: .cfi_startproc call _vpaes_preheat movdqa .Lk_rcon(%rip),%xmm8 movdqu (%rdi),%xmm0 movdqa %xmm0,%xmm3 leaq .Lk_ipt(%rip),%r11 call _vpaes_schedule_transform movdqa %xmm0,%xmm7 leaq .Lk_sr(%rip),%r10 movdqu %xmm0,(%rdx) .Lschedule_go: cmpl $192,%esi ja .Lschedule_256 .Lschedule_128: movl $10,%esi .Loop_schedule_128: call _vpaes_schedule_round decq %rsi jz .Lschedule_mangle_last call _vpaes_schedule_mangle jmp .Loop_schedule_128 .align 16 .Lschedule_256: movdqu 16(%rdi),%xmm0 call _vpaes_schedule_transform movl $7,%esi .Loop_schedule_256: call _vpaes_schedule_mangle movdqa %xmm0,%xmm6 call _vpaes_schedule_round decq %rsi jz .Lschedule_mangle_last call _vpaes_schedule_mangle pshufd $0xFF,%xmm0,%xmm0 movdqa %xmm7,%xmm5 movdqa %xmm6,%xmm7 call _vpaes_schedule_low_round movdqa %xmm5,%xmm7 jmp .Loop_schedule_256 .align 16 .Lschedule_mangle_last: leaq .Lk_deskew(%rip),%r11 movdqa (%r8,%r10,1),%xmm1 .byte 102,15,56,0,193 leaq .Lk_opt(%rip),%r11 addq $32,%rdx .Lschedule_mangle_last_dec: addq $-16,%rdx pxor .Lk_s63(%rip),%xmm0 call _vpaes_schedule_transform movdqu %xmm0,(%rdx) pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_schedule_core,.-_vpaes_schedule_core .type _vpaes_schedule_round,@function .align 16 _vpaes_schedule_round: .cfi_startproc pxor %xmm1,%xmm1 .byte 102,65,15,58,15,200,15 .byte 102,69,15,58,15,192,15 pxor %xmm1,%xmm7 pshufd $0xFF,%xmm0,%xmm0 .byte 102,15,58,15,192,1 _vpaes_schedule_low_round: movdqa %xmm7,%xmm1 pslldq $4,%xmm7 pxor %xmm1,%xmm7 movdqa %xmm7,%xmm1 pslldq $8,%xmm7 pxor %xmm1,%xmm7 pxor .Lk_s63(%rip),%xmm7 movdqa %xmm9,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 movdqa %xmm11,%xmm2 .byte 102,15,56,0,208 pxor %xmm1,%xmm0 movdqa %xmm10,%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 movdqa %xmm10,%xmm4 .byte 102,15,56,0,224 pxor %xmm2,%xmm4 movdqa %xmm10,%xmm2 .byte 102,15,56,0,211 pxor %xmm0,%xmm2 movdqa %xmm10,%xmm3 .byte 102,15,56,0,220 pxor %xmm1,%xmm3 movdqa %xmm13,%xmm4 .byte 102,15,56,0,226 movdqa %xmm12,%xmm0 .byte 102,15,56,0,195 pxor %xmm4,%xmm0 pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_schedule_round,.-_vpaes_schedule_round .type _vpaes_schedule_transform,@function .align 16 _vpaes_schedule_transform: .cfi_startproc movdqa %xmm9,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 movdqa (%r11),%xmm2 .byte 102,15,56,0,208 movdqa 16(%r11),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_schedule_transform,.-_vpaes_schedule_transform .type _vpaes_schedule_mangle,@function .align 16 _vpaes_schedule_mangle: .cfi_startproc movdqa %xmm0,%xmm4 movdqa .Lk_mc_forward(%rip),%xmm5 addq $16,%rdx pxor .Lk_s63(%rip),%xmm4 .byte 102,15,56,0,229 movdqa %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 .Lschedule_mangle_both: movdqa (%r8,%r10,1),%xmm1 .byte 102,15,56,0,217 addq $-16,%r8 andq $0x30,%r8 movdqu %xmm3,(%rdx) .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle .globl GFp_vpaes_set_encrypt_key .hidden GFp_vpaes_set_encrypt_key .type GFp_vpaes_set_encrypt_key,@function .align 16 GFp_vpaes_set_encrypt_key: .cfi_startproc movl %esi,%eax shrl $5,%eax addl $5,%eax movl %eax,240(%rdx) movl $0,%ecx movl $0x30,%r8d call _vpaes_schedule_core xorl %eax,%eax .byte 0xf3,0xc3 .cfi_endproc .size GFp_vpaes_set_encrypt_key,.-GFp_vpaes_set_encrypt_key .globl GFp_vpaes_encrypt .hidden GFp_vpaes_encrypt .type GFp_vpaes_encrypt,@function .align 16 GFp_vpaes_encrypt: .cfi_startproc movdqu (%rdi),%xmm0 call _vpaes_preheat call _vpaes_encrypt_core movdqu %xmm0,(%rsi) .byte 0xf3,0xc3 .cfi_endproc .size GFp_vpaes_encrypt,.-GFp_vpaes_encrypt .type _vpaes_preheat,@function .align 16 _vpaes_preheat: .cfi_startproc leaq .Lk_s0F(%rip),%r10 movdqa -32(%r10),%xmm10 movdqa -16(%r10),%xmm11 movdqa 0(%r10),%xmm9 movdqa 48(%r10),%xmm13 movdqa 64(%r10),%xmm12 movdqa 80(%r10),%xmm15 movdqa 96(%r10),%xmm14 .byte 0xf3,0xc3 .cfi_endproc .size _vpaes_preheat,.-_vpaes_preheat .type _vpaes_consts,@object .align 64 _vpaes_consts: .Lk_inv: .quad 0x0E05060F0D080180, 0x040703090A0B0C02 .quad 0x01040A060F0B0780, 0x030D0E0C02050809 .Lk_s0F: .quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F .Lk_ipt: .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 .Lk_sb1: .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF .Lk_sb2: .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A .Lk_sbo: .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA .Lk_mc_forward: .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 .quad 0x080B0A0904070605, 0x000302010C0F0E0D .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 .quad 0x000302010C0F0E0D, 0x080B0A0904070605 .Lk_mc_backward: .quad 0x0605040702010003, 0x0E0D0C0F0A09080B .quad 0x020100030E0D0C0F, 0x0A09080B06050407 .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 .quad 0x0A09080B06050407, 0x020100030E0D0C0F .Lk_sr: .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 .quad 0x030E09040F0A0500, 0x0B06010C07020D08 .quad 0x0F060D040B020900, 0x070E050C030A0108 .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 .Lk_rcon: .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 .Lk_s63: .quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B .Lk_opt: .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 .Lk_deskew: .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 #endif ring-0.16.9/pregenerated/vpaes-x86_64-macosx.S000064400000000000000000000155541353224257600171120ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .p2align 4 _vpaes_encrypt_core: movq %rdx,%r9 movq $16,%r11 movl 240(%rdx),%eax movdqa %xmm9,%xmm1 movdqa L$k_ipt(%rip),%xmm2 pandn %xmm0,%xmm1 movdqu (%r9),%xmm5 psrld $4,%xmm1 pand %xmm9,%xmm0 .byte 102,15,56,0,208 movdqa L$k_ipt+16(%rip),%xmm0 .byte 102,15,56,0,193 pxor %xmm5,%xmm2 addq $16,%r9 pxor %xmm2,%xmm0 leaq L$k_mc_backward(%rip),%r10 jmp L$enc_entry .p2align 4 L$enc_loop: movdqa %xmm13,%xmm4 movdqa %xmm12,%xmm0 .byte 102,15,56,0,226 .byte 102,15,56,0,195 pxor %xmm5,%xmm4 movdqa %xmm15,%xmm5 pxor %xmm4,%xmm0 movdqa -64(%r11,%r10,1),%xmm1 .byte 102,15,56,0,234 movdqa (%r11,%r10,1),%xmm4 movdqa %xmm14,%xmm2 .byte 102,15,56,0,211 movdqa %xmm0,%xmm3 pxor %xmm5,%xmm2 .byte 102,15,56,0,193 addq $16,%r9 pxor %xmm2,%xmm0 .byte 102,15,56,0,220 addq $16,%r11 pxor %xmm0,%xmm3 .byte 102,15,56,0,193 andq $0x30,%r11 subq $1,%rax pxor %xmm3,%xmm0 L$enc_entry: movdqa %xmm9,%xmm1 movdqa %xmm11,%xmm5 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 .byte 102,15,56,0,232 movdqa %xmm10,%xmm3 pxor %xmm1,%xmm0 .byte 102,15,56,0,217 movdqa %xmm10,%xmm4 pxor %xmm5,%xmm3 .byte 102,15,56,0,224 movdqa %xmm10,%xmm2 pxor %xmm5,%xmm4 .byte 102,15,56,0,211 movdqa %xmm10,%xmm3 pxor %xmm0,%xmm2 .byte 102,15,56,0,220 movdqu (%r9),%xmm5 pxor %xmm1,%xmm3 jnz L$enc_loop movdqa -96(%r10),%xmm4 movdqa -80(%r10),%xmm0 .byte 102,15,56,0,226 pxor %xmm5,%xmm4 .byte 102,15,56,0,195 movdqa 64(%r11,%r10,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 .byte 0xf3,0xc3 .p2align 4 _vpaes_schedule_core: call _vpaes_preheat movdqa L$k_rcon(%rip),%xmm8 movdqu (%rdi),%xmm0 movdqa %xmm0,%xmm3 leaq L$k_ipt(%rip),%r11 call _vpaes_schedule_transform movdqa %xmm0,%xmm7 leaq L$k_sr(%rip),%r10 movdqu %xmm0,(%rdx) L$schedule_go: cmpl $192,%esi ja L$schedule_256 L$schedule_128: movl $10,%esi L$oop_schedule_128: call _vpaes_schedule_round decq %rsi jz L$schedule_mangle_last call _vpaes_schedule_mangle jmp L$oop_schedule_128 .p2align 4 L$schedule_256: movdqu 16(%rdi),%xmm0 call _vpaes_schedule_transform movl $7,%esi L$oop_schedule_256: call _vpaes_schedule_mangle movdqa %xmm0,%xmm6 call _vpaes_schedule_round decq %rsi jz L$schedule_mangle_last call _vpaes_schedule_mangle pshufd $0xFF,%xmm0,%xmm0 movdqa %xmm7,%xmm5 movdqa %xmm6,%xmm7 call _vpaes_schedule_low_round movdqa %xmm5,%xmm7 jmp L$oop_schedule_256 .p2align 4 L$schedule_mangle_last: leaq L$k_deskew(%rip),%r11 movdqa (%r8,%r10,1),%xmm1 .byte 102,15,56,0,193 leaq L$k_opt(%rip),%r11 addq $32,%rdx L$schedule_mangle_last_dec: addq $-16,%rdx pxor L$k_s63(%rip),%xmm0 call _vpaes_schedule_transform movdqu %xmm0,(%rdx) pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 .byte 0xf3,0xc3 .p2align 4 _vpaes_schedule_round: pxor %xmm1,%xmm1 .byte 102,65,15,58,15,200,15 .byte 102,69,15,58,15,192,15 pxor %xmm1,%xmm7 pshufd $0xFF,%xmm0,%xmm0 .byte 102,15,58,15,192,1 _vpaes_schedule_low_round: movdqa %xmm7,%xmm1 pslldq $4,%xmm7 pxor %xmm1,%xmm7 movdqa %xmm7,%xmm1 pslldq $8,%xmm7 pxor %xmm1,%xmm7 pxor L$k_s63(%rip),%xmm7 movdqa %xmm9,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 movdqa %xmm11,%xmm2 .byte 102,15,56,0,208 pxor %xmm1,%xmm0 movdqa %xmm10,%xmm3 .byte 102,15,56,0,217 pxor %xmm2,%xmm3 movdqa %xmm10,%xmm4 .byte 102,15,56,0,224 pxor %xmm2,%xmm4 movdqa %xmm10,%xmm2 .byte 102,15,56,0,211 pxor %xmm0,%xmm2 movdqa %xmm10,%xmm3 .byte 102,15,56,0,220 pxor %xmm1,%xmm3 movdqa %xmm13,%xmm4 .byte 102,15,56,0,226 movdqa %xmm12,%xmm0 .byte 102,15,56,0,195 pxor %xmm4,%xmm0 pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 .byte 0xf3,0xc3 .p2align 4 _vpaes_schedule_transform: movdqa %xmm9,%xmm1 pandn %xmm0,%xmm1 psrld $4,%xmm1 pand %xmm9,%xmm0 movdqa (%r11),%xmm2 .byte 102,15,56,0,208 movdqa 16(%r11),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 .byte 0xf3,0xc3 .p2align 4 _vpaes_schedule_mangle: movdqa %xmm0,%xmm4 movdqa L$k_mc_forward(%rip),%xmm5 addq $16,%rdx pxor L$k_s63(%rip),%xmm4 .byte 102,15,56,0,229 movdqa %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 .byte 102,15,56,0,229 pxor %xmm4,%xmm3 L$schedule_mangle_both: movdqa (%r8,%r10,1),%xmm1 .byte 102,15,56,0,217 addq $-16,%r8 andq $0x30,%r8 movdqu %xmm3,(%rdx) .byte 0xf3,0xc3 .globl _GFp_vpaes_set_encrypt_key .private_extern _GFp_vpaes_set_encrypt_key .p2align 4 _GFp_vpaes_set_encrypt_key: movl %esi,%eax shrl $5,%eax addl $5,%eax movl %eax,240(%rdx) movl $0,%ecx movl $0x30,%r8d call _vpaes_schedule_core xorl %eax,%eax .byte 0xf3,0xc3 .globl _GFp_vpaes_encrypt .private_extern _GFp_vpaes_encrypt .p2align 4 _GFp_vpaes_encrypt: movdqu (%rdi),%xmm0 call _vpaes_preheat call _vpaes_encrypt_core movdqu %xmm0,(%rsi) .byte 0xf3,0xc3 .p2align 4 _vpaes_preheat: leaq L$k_s0F(%rip),%r10 movdqa -32(%r10),%xmm10 movdqa -16(%r10),%xmm11 movdqa 0(%r10),%xmm9 movdqa 48(%r10),%xmm13 movdqa 64(%r10),%xmm12 movdqa 80(%r10),%xmm15 movdqa 96(%r10),%xmm14 .byte 0xf3,0xc3 .p2align 6 _vpaes_consts: L$k_inv: .quad 0x0E05060F0D080180, 0x040703090A0B0C02 .quad 0x01040A060F0B0780, 0x030D0E0C02050809 L$k_s0F: .quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F L$k_ipt: .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 L$k_sb1: .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF L$k_sb2: .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A L$k_sbo: .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA L$k_mc_forward: .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 .quad 0x080B0A0904070605, 0x000302010C0F0E0D .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 .quad 0x000302010C0F0E0D, 0x080B0A0904070605 L$k_mc_backward: .quad 0x0605040702010003, 0x0E0D0C0F0A09080B .quad 0x020100030E0D0C0F, 0x0A09080B06050407 .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 .quad 0x0A09080B06050407, 0x020100030E0D0C0F L$k_sr: .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 .quad 0x030E09040F0A0500, 0x0B06010C07020D08 .quad 0x0F060D040B020900, 0x070E050C030A0108 .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 L$k_rcon: .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 L$k_s63: .quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B L$k_opt: .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 L$k_deskew: .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 #endif ring-0.16.9/pregenerated/vpaes-x86_64-nasm.obj000064400000000000000000000231151353224260300171050ustar0000000000000000dEi]-:.textsO  p`.pdatasY q @0@.xdata @@@.debug$S \@B.debug$T !@BIIfAofofAo)frfAf8fof8fIfL[vfDfAofAof8f8ffAoffCoLf8fCo$fAof8foff8Iff8Iff8I0HffAofAoffrfAf8fAoff8fAoff8fAoff8fAoff8Ao)f,fAobfAoBf8ff8fCoL@ff8fDoofoLsfoLc# H`fDoGffoH*ufpfofofof.LYfCo f8L'H Hffffffffffff.ffA:fE:ffpf:fofsffofsff=fAoffrfAfAof8ffAof8ffAof8ffAof8ffAof8ffAof8fAof8fffoffAoffrfAfAof8fAoCf8fffofo-Hf%f8fof8ff8ffCo f8II0@H|$Ht$HHHLH$H)t$)|$ D)D$0D)L$@D)T$PD)\$`D)d$pD)$D)$D)$A01(t$(|$ D(D$0D(L$@D(T$PD(\$`D(d$pD($D($D($H$1H|$Ht$H|$Ht$HHHLH$H)t$)|$ D)D$0D)L$@D)T$PD)\$`D)d$pD)$D)$D)$of(t$(|$ D(D$0D(L$@D(T$PD(\$`D(d$pD($D($D($H$H|$Ht$fDLyfEoRfEoZfEo fEoj0fEob@fEozPfEor`ffffff.ffffff.ffffff.       p*Zx"RM|1}0L>PˏᛱD*nzߥ#6. ;$q Ɠz/U^) @iJ#cǽomxzj_t5+Aѐ                                    }|M*p[[[[[[[[[[[[[[[[`)Ih!APQ \] G@]Ziܵ6_wA(VWSUATAUAVAWH@I@xIIqMY8ENL93IESNL9HpIHHHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^W-!2 #&3 . .$%0P:\ring\pregenerated\tmp\vpaes-x86_64-nasm.asmӍئgm ss  !"#!$&%+&0'5(=)B*F+J,N-U.Z0`3e4j5o6t7x8}9:;<=>?@ABCDEFGHIJNOPQRSTUVWXY Z[\]^ _%`*a.b4e:f@gEhIiNjUkYl^m`enrv}")-19>BFJNRVZ^bdp t {   !"#$%&'()*+,-./012 3456 7$:(;,<.J0M5N9O>PCQHRMSSTXU\V^r`udvlypzx{}|}~$*/49?EKQW`irz| %+4=FNSXZ`gmsx~ 0 @!P#`$p'()*-./0345 609@<P?`@pCDIJKLMNOPQRTUWXZ[\]_abcdfghijmnop qstu v$x'y*z.{1|5}9~=AFKPU[`degikmnopqc1P:\ring\pregenerated\vpaes-x86_64-nasm.objyasm 1.3.0_vpaes_encrypt_coreL$k_iptL$k_mc_backwardL$enc_entryL$enc_loop_vpaes_schedule_core_vpaes_preheatL$k_rcon#_vpaes_schedule_transformL$k_srL$schedule_goL$schedule_256L$schedule_128L$oop_schedule_128_vpaes_schedule_round L$schedule_mangle_last _vpaes_schedule_mangleL$oop_schedule_256#_vpaes_schedule_low_roundL$k_deskewL$k_opt$L$schedule_mangle_last_decL$k_s63L$k_mc_forward L$schedule_mangle_both#GFp_vpaes_set_encrypt_key/L$SEH_begin_GFp_vpaes_set_encrypt_keyL$enc_key_bodyL$enc_key_epilogue-L$SEH_end_GFp_vpaes_set_encrypt_keyGFp_vpaes_encrypt'L$SEH_begin_GFp_vpaes_encryptL$enc_bodyL$enc_epilogue%L$SEH_end_GFp_vpaes_encryptL$k_s0F_vpaes_constsL$k_invL$k_sb1L$k_sb2L$k_sbose_handlerL$in_prologue1  L$SEH_info_GFp_vpaes_set_encrypt_key)  L$SEH_info_GFp_vpaes_encryptd h t  x            ( , < @ a e s  w            ! % C G a e             $ ( I M z ~   ! ! " " # # '$ +$ =% A% W& [& ~' ' ( ( ) ) * * + + , , . . / / )2 -2 \3 `3 .fileg.texts+L$k_ipt?O[`f`{`L$k_rcon00L$k_srp`':TpL$k_optP_-L$k_s63@zpz&8VaNpZL$k_s0FL$k_invL$k_sb1L$k_sb20L$k_sboP.pdata.xdata .debug$S\.debug$T pregenerated\tmp\vpaes-x86_64-nasm.asm_vpaes_encrypt_coreL$k_mc_backwardL$enc_entryL$enc_loop_vpaes_schedule_core_vpaes_preheat_vpaes_schedule_transformL$schedule_goL$schedule_256L$schedule_128L$oop_schedule_128_vpaes_schedule_roundL$schedule_mangle_last_vpaes_schedule_mangleL$oop_schedule_256_vpaes_schedule_low_roundL$k_deskewL$schedule_mangle_last_decL$k_mc_forwardL$schedule_mangle_bothGFp_vpaes_set_encrypt_keyL$SEH_begin_GFp_vpaes_set_encrypt_keyL$enc_key_bodyL$enc_key_epilogueL$SEH_end_GFp_vpaes_set_encrypt_keyGFp_vpaes_encryptL$SEH_begin_GFp_vpaes_encryptL$enc_bodyL$enc_epilogueL$SEH_end_GFp_vpaes_encrypt_vpaes_consts__imp_RtlVirtualUnwindse_handlerL$in_prologueL$SEH_info_GFp_vpaes_set_encrypt_keyL$SEH_info_GFp_vpaes_encryptring-0.16.9/pregenerated/x86-mont-elf.S000064400000000000000000000102511353224261000156660ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl GFp_bn_mul_mont .hidden GFp_bn_mul_mont .type GFp_bn_mul_mont,@function .align 16 GFp_bn_mul_mont: .L_GFp_bn_mul_mont_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi xorl %eax,%eax movl 40(%esp),%edi leal 20(%esp),%esi leal 24(%esp),%edx addl $2,%edi negl %edi leal -32(%esp,%edi,4),%ebp negl %edi movl %ebp,%eax subl %edx,%eax andl $2047,%eax subl %eax,%ebp xorl %ebp,%edx andl $2048,%edx xorl $2048,%edx subl %edx,%ebp andl $-64,%ebp movl %esp,%eax subl %ebp,%eax andl $-4096,%eax movl %esp,%edx leal (%ebp,%eax,1),%esp movl (%esp),%eax cmpl %ebp,%esp ja .L000page_walk jmp .L001page_walk_done .align 16 .L000page_walk: leal -4096(%esp),%esp movl (%esp),%eax cmpl %ebp,%esp ja .L000page_walk .L001page_walk_done: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%ebp movl 16(%esi),%esi movl (%esi),%esi movl %eax,4(%esp) movl %ebx,8(%esp) movl %ecx,12(%esp) movl %ebp,16(%esp) movl %esi,20(%esp) leal -3(%edi),%ebx movl %edx,24(%esp) call .L002PIC_me_up .L002PIC_me_up: popl %eax leal GFp_ia32cap_P-.L002PIC_me_up(%eax),%eax btl $26,(%eax) movl $-1,%eax movd %eax,%mm7 movl 8(%esp),%esi movl 12(%esp),%edi movl 16(%esp),%ebp xorl %edx,%edx xorl %ecx,%ecx movd (%edi),%mm4 movd (%esi),%mm5 movd (%ebp),%mm3 pmuludq %mm4,%mm5 movq %mm5,%mm2 movq %mm5,%mm0 pand %mm7,%mm0 pmuludq 20(%esp),%mm5 pmuludq %mm5,%mm3 paddq %mm0,%mm3 movd 4(%ebp),%mm1 movd 4(%esi),%mm0 psrlq $32,%mm2 psrlq $32,%mm3 incl %ecx .align 16 .L0031st: pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 movd 4(%ebp,%ecx,4),%mm1 paddq %mm0,%mm3 movd 4(%esi,%ecx,4),%mm0 psrlq $32,%mm2 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm3 leal 1(%ecx),%ecx cmpl %ebx,%ecx jl .L0031st pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 paddq %mm0,%mm3 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm2 psrlq $32,%mm3 paddq %mm2,%mm3 movq %mm3,32(%esp,%ebx,4) incl %edx .L004outer: xorl %ecx,%ecx movd (%edi,%edx,4),%mm4 movd (%esi),%mm5 movd 32(%esp),%mm6 movd (%ebp),%mm3 pmuludq %mm4,%mm5 paddq %mm6,%mm5 movq %mm5,%mm0 movq %mm5,%mm2 pand %mm7,%mm0 pmuludq 20(%esp),%mm5 pmuludq %mm5,%mm3 paddq %mm0,%mm3 movd 36(%esp),%mm6 movd 4(%ebp),%mm1 movd 4(%esi),%mm0 psrlq $32,%mm2 psrlq $32,%mm3 paddq %mm6,%mm2 incl %ecx decl %ebx .L005inner: pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 movd 36(%esp,%ecx,4),%mm6 pand %mm7,%mm0 movd 4(%ebp,%ecx,4),%mm1 paddq %mm0,%mm3 movd 4(%esi,%ecx,4),%mm0 psrlq $32,%mm2 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm3 paddq %mm6,%mm2 decl %ebx leal 1(%ecx),%ecx jnz .L005inner movl %ecx,%ebx pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 paddq %mm0,%mm3 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm2 psrlq $32,%mm3 movd 36(%esp,%ebx,4),%mm6 paddq %mm2,%mm3 paddq %mm6,%mm3 movq %mm3,32(%esp,%ebx,4) leal 1(%edx),%edx cmpl %ebx,%edx jle .L004outer emms .align 16 .L006common_tail: movl 16(%esp),%ebp movl 4(%esp),%edi leal 32(%esp),%esi movl (%esi),%eax movl %ebx,%ecx xorl %edx,%edx .align 16 .L007sub: sbbl (%ebp,%edx,4),%eax movl %eax,(%edi,%edx,4) decl %ecx movl 4(%esi,%edx,4),%eax leal 1(%edx),%edx jge .L007sub sbbl $0,%eax movl $-1,%edx xorl %eax,%edx jmp .L008copy .align 16 .L008copy: movl 32(%esp,%ebx,4),%esi movl (%edi,%ebx,4),%ebp movl %ecx,32(%esp,%ebx,4) andl %eax,%esi andl %edx,%ebp orl %esi,%ebp movl %ebp,(%edi,%ebx,4) decl %ebx jge .L008copy movl 24(%esp),%esp movl $1,%eax popl %edi popl %esi popl %ebx popl %ebp ret .size GFp_bn_mul_mont,.-.L_GFp_bn_mul_mont_begin .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 .byte 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 .byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 .byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 .byte 111,114,103,62,0 #endif ring-0.16.9/pregenerated/x86-mont-macosx.S000064400000000000000000000103541353224261000164160ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__i386__) #if defined(BORINGSSL_PREFIX) #include #endif .text .globl _GFp_bn_mul_mont .private_extern _GFp_bn_mul_mont .align 4 _GFp_bn_mul_mont: L_GFp_bn_mul_mont_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi xorl %eax,%eax movl 40(%esp),%edi leal 20(%esp),%esi leal 24(%esp),%edx addl $2,%edi negl %edi leal -32(%esp,%edi,4),%ebp negl %edi movl %ebp,%eax subl %edx,%eax andl $2047,%eax subl %eax,%ebp xorl %ebp,%edx andl $2048,%edx xorl $2048,%edx subl %edx,%ebp andl $-64,%ebp movl %esp,%eax subl %ebp,%eax andl $-4096,%eax movl %esp,%edx leal (%ebp,%eax,1),%esp movl (%esp),%eax cmpl %ebp,%esp ja L000page_walk jmp L001page_walk_done .align 4,0x90 L000page_walk: leal -4096(%esp),%esp movl (%esp),%eax cmpl %ebp,%esp ja L000page_walk L001page_walk_done: movl (%esi),%eax movl 4(%esi),%ebx movl 8(%esi),%ecx movl 12(%esi),%ebp movl 16(%esi),%esi movl (%esi),%esi movl %eax,4(%esp) movl %ebx,8(%esp) movl %ecx,12(%esp) movl %ebp,16(%esp) movl %esi,20(%esp) leal -3(%edi),%ebx movl %edx,24(%esp) call L002PIC_me_up L002PIC_me_up: popl %eax movl L_GFp_ia32cap_P$non_lazy_ptr-L002PIC_me_up(%eax),%eax btl $26,(%eax) movl $-1,%eax movd %eax,%mm7 movl 8(%esp),%esi movl 12(%esp),%edi movl 16(%esp),%ebp xorl %edx,%edx xorl %ecx,%ecx movd (%edi),%mm4 movd (%esi),%mm5 movd (%ebp),%mm3 pmuludq %mm4,%mm5 movq %mm5,%mm2 movq %mm5,%mm0 pand %mm7,%mm0 pmuludq 20(%esp),%mm5 pmuludq %mm5,%mm3 paddq %mm0,%mm3 movd 4(%ebp),%mm1 movd 4(%esi),%mm0 psrlq $32,%mm2 psrlq $32,%mm3 incl %ecx .align 4,0x90 L0031st: pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 movd 4(%ebp,%ecx,4),%mm1 paddq %mm0,%mm3 movd 4(%esi,%ecx,4),%mm0 psrlq $32,%mm2 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm3 leal 1(%ecx),%ecx cmpl %ebx,%ecx jl L0031st pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 paddq %mm0,%mm3 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm2 psrlq $32,%mm3 paddq %mm2,%mm3 movq %mm3,32(%esp,%ebx,4) incl %edx L004outer: xorl %ecx,%ecx movd (%edi,%edx,4),%mm4 movd (%esi),%mm5 movd 32(%esp),%mm6 movd (%ebp),%mm3 pmuludq %mm4,%mm5 paddq %mm6,%mm5 movq %mm5,%mm0 movq %mm5,%mm2 pand %mm7,%mm0 pmuludq 20(%esp),%mm5 pmuludq %mm5,%mm3 paddq %mm0,%mm3 movd 36(%esp),%mm6 movd 4(%ebp),%mm1 movd 4(%esi),%mm0 psrlq $32,%mm2 psrlq $32,%mm3 paddq %mm6,%mm2 incl %ecx decl %ebx L005inner: pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 movd 36(%esp,%ecx,4),%mm6 pand %mm7,%mm0 movd 4(%ebp,%ecx,4),%mm1 paddq %mm0,%mm3 movd 4(%esi,%ecx,4),%mm0 psrlq $32,%mm2 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm3 paddq %mm6,%mm2 decl %ebx leal 1(%ecx),%ecx jnz L005inner movl %ecx,%ebx pmuludq %mm4,%mm0 pmuludq %mm5,%mm1 paddq %mm0,%mm2 paddq %mm1,%mm3 movq %mm2,%mm0 pand %mm7,%mm0 paddq %mm0,%mm3 movd %mm3,28(%esp,%ecx,4) psrlq $32,%mm2 psrlq $32,%mm3 movd 36(%esp,%ebx,4),%mm6 paddq %mm2,%mm3 paddq %mm6,%mm3 movq %mm3,32(%esp,%ebx,4) leal 1(%edx),%edx cmpl %ebx,%edx jle L004outer emms .align 4,0x90 L006common_tail: movl 16(%esp),%ebp movl 4(%esp),%edi leal 32(%esp),%esi movl (%esi),%eax movl %ebx,%ecx xorl %edx,%edx .align 4,0x90 L007sub: sbbl (%ebp,%edx,4),%eax movl %eax,(%edi,%edx,4) decl %ecx movl 4(%esi,%edx,4),%eax leal 1(%edx),%edx jge L007sub sbbl $0,%eax movl $-1,%edx xorl %eax,%edx jmp L008copy .align 4,0x90 L008copy: movl 32(%esp,%ebx,4),%esi movl (%edi,%ebx,4),%ebp movl %ecx,32(%esp,%ebx,4) andl %eax,%esi andl %edx,%ebp orl %esi,%ebp movl %ebp,(%edi,%ebx,4) decl %ebx jge L008copy movl 24(%esp),%esp movl $1,%eax popl %edi popl %esi popl %ebx popl %ebp ret .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 .byte 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 .byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 .byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 .byte 111,114,103,62,0 .section __IMPORT,__pointers,non_lazy_symbol_pointers L_GFp_ia32cap_P$non_lazy_ptr: .indirect_symbol _GFp_ia32cap_P .long 0 #endif ring-0.16.9/pregenerated/x86-mont-win32n.obj000064400000000000000000000073321353224260700166240ustar0000000000000000LEi] .text p`.bss0.debug$S @B.debug$T @BUSVW1|$(t$T$ߍl߉)%)1)Ճ)%d$9 $$9^Nn v6D$\$L$ l$t$_T$ nt$|$ l$11n'n.n]ool$nMnFs s A onLnDs ~\s I9o~\s s \ B1n$n.nt$ n]ool$nt$$nMnFs s AKont$nLnDs ~\s KIo~\s s nt$\ R9=wl$|$t$ 1 DIDR1 t ,L !! ,Kd$_^[]Montgomery Multiplication for x86, CRYPTOGAMS by .P:\ring\pregenerated\tmp\x86-mont-win32n.asm23 nZH< ! "#$%&'()!*&+(,*-0.6/80;1=2?3D4F5J6M7O8U9Z:`<g=j>l?rAtBwCzD}EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefhij k lmnopq#r(s,t/u1v7w:x=y@zC{F|I}L~QUY\abdhkptwz} %'048<>@BPTWX\_ehmotP/P:\ring\pregenerated\x86-mont-win32n.objyasm 1.3.0_GFp_bn_mul_mont"L$_GFp_bn_mul_mont_begin`L$000page_walkrL$001page_walk_doneL$0021stbL$003outerL$004inner0L$005common_tailPL$006subL$007copyd h   & * J N d h             .fileg@feat.00.text):S`brvL$0021stb0L$006subP.bss.debug$S.debug$T pregenerated\tmp\x86-mont-win32n.asm_GFp_bn_mul_montL$_GFp_bn_mul_mont_beginL$000page_walkL$001page_walk_done_GFp_ia32cap_PL$003outerL$004innerL$005common_tailL$007copyring-0.16.9/pregenerated/x86_64-mont-elf.S000064400000000000000000000505301353224260300162050ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_bn_mul_mont .hidden GFp_bn_mul_mont .type GFp_bn_mul_mont,@function .align 16 GFp_bn_mul_mont: .cfi_startproc movl %r9d,%r9d movq %rsp,%rax .cfi_def_cfa_register %rax testl $3,%r9d jnz .Lmul_enter cmpl $8,%r9d jb .Lmul_enter movl GFp_ia32cap_P+8(%rip),%r11d cmpq %rsi,%rdx jne .Lmul4x_enter testl $7,%r9d jz .Lsqr8x_enter jmp .Lmul4x_enter .align 16 .Lmul_enter: pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 negq %r9 movq %rsp,%r11 leaq -16(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul_page_walk jmp .Lmul_page_walk_done .align 16 .Lmul_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul_page_walk .Lmul_page_walk_done: movq %rax,8(%rsp,%r9,8) .cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 .Lmul_body: movq %rdx,%r12 movq (%r8),%r8 movq (%r12),%rbx movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%r13 leaq 1(%r15),%r15 jmp .L1st_enter .align 16 .L1st: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%r13 movq %r10,%r11 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 .L1st_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx leaq 1(%r15),%r15 movq %rdx,%r10 mulq %rbp cmpq %r9,%r15 jne .L1st addq %rax,%r13 movq (%rsi),%rax adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 movq %r10,%r11 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 jmp .Louter .align 16 .Louter: movq (%r12,%r14,8),%rbx xorq %r15,%r15 movq %r8,%rbp movq (%rsp),%r10 mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq 8(%rsp),%r10 movq %rdx,%r13 leaq 1(%r15),%r15 jmp .Linner_enter .align 16 .Linner: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 .Linner_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 leaq 1(%r15),%r15 mulq %rbp cmpq %r9,%r15 jne .Linner addq %rax,%r13 movq (%rsi),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 cmpq %r9,%r14 jb .Louter xorq %r14,%r14 movq (%rsp),%rax movq %r9,%r15 .align 16 .Lsub: sbbq (%rcx,%r14,8),%rax movq %rax,(%rdi,%r14,8) movq 8(%rsp,%r14,8),%rax leaq 1(%r14),%r14 decq %r15 jnz .Lsub sbbq $0,%rax movq $-1,%rbx xorq %rax,%rbx xorq %r14,%r14 movq %r9,%r15 .Lcopy: movq (%rdi,%r14,8),%rcx movq (%rsp,%r14,8),%rdx andq %rbx,%rcx andq %rax,%rdx movq %r9,(%rsp,%r14,8) orq %rcx,%rdx movq %rdx,(%rdi,%r14,8) leaq 1(%r14),%r14 subq $1,%r15 jnz .Lcopy movq 8(%rsp,%r9,8),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_mul_mont,.-GFp_bn_mul_mont .type bn_mul4x_mont,@function .align 16 bn_mul4x_mont: .cfi_startproc movl %r9d,%r9d movq %rsp,%rax .cfi_def_cfa_register %rax .Lmul4x_enter: andl $0x80100,%r11d cmpl $0x80100,%r11d je .Lmulx4x_enter pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 negq %r9 movq %rsp,%r11 leaq -32(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul4x_page_walk jmp .Lmul4x_page_walk_done .Lmul4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul4x_page_walk .Lmul4x_page_walk_done: movq %rax,8(%rsp,%r9,8) .cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 .Lmul4x_body: movq %rdi,16(%rsp,%r9,8) movq %rdx,%r12 movq (%r8),%r8 movq (%r12),%rbx movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi),%rax adcq $0,%rdx addq %r11,%rdi leaq 4(%r15),%r15 adcq $0,%rdx movq %rdi,(%rsp) movq %rdx,%r13 jmp .L1st4x .align 16 .L1st4x: mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq (%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx,%r15,8),%rax adcq $0,%rdx leaq 4(%r15),%r15 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq -16(%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-32(%rsp,%r15,8) movq %rdx,%r13 cmpq %r9,%r15 jb .L1st4x mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi movq %r13,-8(%rsp,%r15,8) movq %rdi,(%rsp,%r15,8) leaq 1(%r14),%r14 .align 4 .Louter4x: movq (%r12,%r14,8),%rbx xorq %r15,%r15 movq (%rsp),%r10 movq %r8,%rbp mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%rsp),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi),%rax adcq $0,%rdx addq %r11,%rdi leaq 4(%r15),%r15 adcq $0,%rdx movq %rdi,(%rsp) movq %rdx,%r13 jmp .Linner4x .align 16 .Linner4x: mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx addq -16(%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx addq -8(%rsp,%r15,8),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx,%r15,8),%rax adcq $0,%rdx addq 8(%rsp,%r15,8),%r11 adcq $0,%rdx leaq 4(%r15),%r15 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq -16(%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-32(%rsp,%r15,8) movq %rdx,%r13 cmpq %r9,%r15 jb .Linner4x mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx addq -16(%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx addq -8(%rsp,%r15,8),%r11 adcq $0,%rdx leaq 1(%r14),%r14 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi addq (%rsp,%r9,8),%r13 adcq $0,%rdi movq %r13,-8(%rsp,%r15,8) movq %rdi,(%rsp,%r15,8) cmpq %r9,%r14 jb .Louter4x movq 16(%rsp,%r9,8),%rdi leaq -4(%r9),%r15 movq 0(%rsp),%rax movq 8(%rsp),%rdx shrq $2,%r15 leaq (%rsp),%rsi xorq %r14,%r14 subq 0(%rcx),%rax movq 16(%rsi),%rbx movq 24(%rsi),%rbp sbbq 8(%rcx),%rdx .Lsub4x: movq %rax,0(%rdi,%r14,8) movq %rdx,8(%rdi,%r14,8) sbbq 16(%rcx,%r14,8),%rbx movq 32(%rsi,%r14,8),%rax movq 40(%rsi,%r14,8),%rdx sbbq 24(%rcx,%r14,8),%rbp movq %rbx,16(%rdi,%r14,8) movq %rbp,24(%rdi,%r14,8) sbbq 32(%rcx,%r14,8),%rax movq 48(%rsi,%r14,8),%rbx movq 56(%rsi,%r14,8),%rbp sbbq 40(%rcx,%r14,8),%rdx leaq 4(%r14),%r14 decq %r15 jnz .Lsub4x movq %rax,0(%rdi,%r14,8) movq 32(%rsi,%r14,8),%rax sbbq 16(%rcx,%r14,8),%rbx movq %rdx,8(%rdi,%r14,8) sbbq 24(%rcx,%r14,8),%rbp movq %rbx,16(%rdi,%r14,8) sbbq $0,%rax movq %rbp,24(%rdi,%r14,8) pxor %xmm0,%xmm0 .byte 102,72,15,110,224 pcmpeqd %xmm5,%xmm5 pshufd $0,%xmm4,%xmm4 movq %r9,%r15 pxor %xmm4,%xmm5 shrq $2,%r15 xorl %eax,%eax jmp .Lcopy4x .align 16 .Lcopy4x: movdqa (%rsp,%rax,1),%xmm1 movdqu (%rdi,%rax,1),%xmm2 pand %xmm4,%xmm1 pand %xmm5,%xmm2 movdqa 16(%rsp,%rax,1),%xmm3 movdqa %xmm0,(%rsp,%rax,1) por %xmm2,%xmm1 movdqu 16(%rdi,%rax,1),%xmm2 movdqu %xmm1,(%rdi,%rax,1) pand %xmm4,%xmm3 pand %xmm5,%xmm2 movdqa %xmm0,16(%rsp,%rax,1) por %xmm2,%xmm3 movdqu %xmm3,16(%rdi,%rax,1) leaq 32(%rax),%rax decq %r15 jnz .Lcopy4x movq 8(%rsp,%r9,8),%rsi .cfi_def_cfa %rsi, 8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul4x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_mul4x_mont,.-bn_mul4x_mont .extern GFp_bn_sqrx8x_internal .hidden GFp_bn_sqrx8x_internal .extern GFp_bn_sqr8x_internal .hidden GFp_bn_sqr8x_internal .type bn_sqr8x_mont,@function .align 32 bn_sqr8x_mont: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax .Lsqr8x_enter: pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lsqr8x_prologue: movl %r9d,%r10d shll $3,%r9d shlq $3+2,%r10 negq %r9 leaq -64(%rsp,%r9,2),%r11 movq %rsp,%rbp movq (%r8),%r8 subq %rsi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lsqr8x_sp_alt subq %r11,%rbp leaq -64(%rbp,%r9,2),%rbp jmp .Lsqr8x_sp_done .align 32 .Lsqr8x_sp_alt: leaq 4096-64(,%r9,2),%r10 leaq -64(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lsqr8x_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lsqr8x_page_walk jmp .Lsqr8x_page_walk_done .align 16 .Lsqr8x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lsqr8x_page_walk .Lsqr8x_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lsqr8x_body: .byte 102,72,15,110,209 pxor %xmm0,%xmm0 .byte 102,72,15,110,207 .byte 102,73,15,110,218 movl GFp_ia32cap_P+8(%rip),%eax andl $0x80100,%eax cmpl $0x80100,%eax jne .Lsqr8x_nox call GFp_bn_sqrx8x_internal leaq (%r8,%rcx,1),%rbx movq %rcx,%r9 movq %rcx,%rdx .byte 102,72,15,126,207 sarq $3+2,%rcx jmp .Lsqr8x_sub .align 32 .Lsqr8x_nox: call GFp_bn_sqr8x_internal leaq (%rdi,%r9,1),%rbx movq %r9,%rcx movq %r9,%rdx .byte 102,72,15,126,207 sarq $3+2,%rcx jmp .Lsqr8x_sub .align 32 .Lsqr8x_sub: movq 0(%rbx),%r12 movq 8(%rbx),%r13 movq 16(%rbx),%r14 movq 24(%rbx),%r15 leaq 32(%rbx),%rbx sbbq 0(%rbp),%r12 sbbq 8(%rbp),%r13 sbbq 16(%rbp),%r14 sbbq 24(%rbp),%r15 leaq 32(%rbp),%rbp movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r14,16(%rdi) movq %r15,24(%rdi) leaq 32(%rdi),%rdi incq %rcx jnz .Lsqr8x_sub sbbq $0,%rax leaq (%rbx,%r9,1),%rbx leaq (%rdi,%r9,1),%rdi .byte 102,72,15,110,200 pxor %xmm0,%xmm0 pshufd $0,%xmm1,%xmm1 movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 jmp .Lsqr8x_cond_copy .align 32 .Lsqr8x_cond_copy: movdqa 0(%rbx),%xmm2 movdqa 16(%rbx),%xmm3 leaq 32(%rbx),%rbx movdqu 0(%rdi),%xmm4 movdqu 16(%rdi),%xmm5 leaq 32(%rdi),%rdi movdqa %xmm0,-32(%rbx) movdqa %xmm0,-16(%rbx) movdqa %xmm0,-32(%rbx,%rdx,1) movdqa %xmm0,-16(%rbx,%rdx,1) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-32(%rdi) movdqu %xmm5,-16(%rdi) addq $32,%r9 jnz .Lsqr8x_cond_copy movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lsqr8x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_sqr8x_mont,.-bn_sqr8x_mont .type bn_mulx4x_mont,@function .align 32 bn_mulx4x_mont: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax .Lmulx4x_enter: pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lmulx4x_prologue: shll $3,%r9d xorq %r10,%r10 subq %r9,%r10 movq (%r8),%r8 leaq -72(%rsp,%r10,1),%rbp andq $-128,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmulx4x_page_walk jmp .Lmulx4x_page_walk_done .align 16 .Lmulx4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmulx4x_page_walk .Lmulx4x_page_walk_done: leaq (%rdx,%r9,1),%r10 movq %r9,0(%rsp) shrq $5,%r9 movq %r10,16(%rsp) subq $1,%r9 movq %r8,24(%rsp) movq %rdi,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 movq %r9,48(%rsp) jmp .Lmulx4x_body .align 32 .Lmulx4x_body: leaq 8(%rdx),%rdi movq (%rdx),%rdx leaq 64+32(%rsp),%rbx movq %rdx,%r9 mulxq 0(%rsi),%r8,%rax mulxq 8(%rsi),%r11,%r14 addq %rax,%r11 movq %rdi,8(%rsp) mulxq 16(%rsi),%r12,%r13 adcq %r14,%r12 adcq $0,%r13 movq %r8,%rdi imulq 24(%rsp),%r8 xorq %rbp,%rbp mulxq 24(%rsi),%rax,%r14 movq %r8,%rdx leaq 32(%rsi),%rsi adcxq %rax,%r13 adcxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%rdi adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 movq 48(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) adcxq %rax,%r12 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r12,-16(%rbx) jmp .Lmulx4x_1st .align 32 .Lmulx4x_1st: adcxq %rbp,%r15 mulxq 0(%rsi),%r10,%rax adcxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 .byte 0x67,0x67 movq %r8,%rdx adcxq %rax,%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 movq %r11,-32(%rbx) adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz .Lmulx4x_1st movq 0(%rsp),%rax movq 8(%rsp),%rdi adcq %rbp,%r15 addq %r15,%r14 sbbq %r15,%r15 movq %r14,-8(%rbx) jmp .Lmulx4x_outer .align 32 .Lmulx4x_outer: movq (%rdi),%rdx leaq 8(%rdi),%rdi subq %rax,%rsi movq %r15,(%rbx) leaq 64+32(%rsp),%rbx subq %rax,%rcx mulxq 0(%rsi),%r8,%r11 xorl %ebp,%ebp movq %rdx,%r9 mulxq 8(%rsi),%r14,%r12 adoxq -32(%rbx),%r8 adcxq %r14,%r11 mulxq 16(%rsi),%r15,%r13 adoxq -24(%rbx),%r11 adcxq %r15,%r12 adoxq -16(%rbx),%r12 adcxq %rbp,%r13 adoxq %rbp,%r13 movq %rdi,8(%rsp) movq %r8,%r15 imulq 24(%rsp),%r8 xorl %ebp,%ebp mulxq 24(%rsi),%rax,%r14 movq %r8,%rdx adcxq %rax,%r13 adoxq -8(%rbx),%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi adoxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) leaq 32(%rcx),%rcx adcxq %rax,%r12 adoxq %rbp,%r15 movq 48(%rsp),%rdi movq %r12,-16(%rbx) jmp .Lmulx4x_inner .align 32 .Lmulx4x_inner: mulxq 0(%rsi),%r10,%rax adcxq %rbp,%r15 adoxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq 0(%rbx),%r10 adoxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq 8(%rbx),%r11 adoxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 movq %r8,%rdx adcxq 16(%rbx),%r12 adoxq %rax,%r13 adcxq 24(%rbx),%r13 adoxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adcxq %rbp,%r14 adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-32(%rbx) movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz .Lmulx4x_inner movq 0(%rsp),%rax movq 8(%rsp),%rdi adcq %rbp,%r15 subq 0(%rbx),%rbp adcq %r15,%r14 sbbq %r15,%r15 movq %r14,-8(%rbx) cmpq 16(%rsp),%rdi jne .Lmulx4x_outer leaq 64(%rsp),%rbx subq %rax,%rcx negq %r15 movq %rax,%rdx shrq $3+2,%rax movq 32(%rsp),%rdi jmp .Lmulx4x_sub .align 32 .Lmulx4x_sub: movq 0(%rbx),%r11 movq 8(%rbx),%r12 movq 16(%rbx),%r13 movq 24(%rbx),%r14 leaq 32(%rbx),%rbx sbbq 0(%rcx),%r11 sbbq 8(%rcx),%r12 sbbq 16(%rcx),%r13 sbbq 24(%rcx),%r14 leaq 32(%rcx),%rcx movq %r11,0(%rdi) movq %r12,8(%rdi) movq %r13,16(%rdi) movq %r14,24(%rdi) leaq 32(%rdi),%rdi decq %rax jnz .Lmulx4x_sub sbbq $0,%r15 leaq 64(%rsp),%rbx subq %rdx,%rdi .byte 102,73,15,110,207 pxor %xmm0,%xmm0 pshufd $0,%xmm1,%xmm1 movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 jmp .Lmulx4x_cond_copy .align 32 .Lmulx4x_cond_copy: movdqa 0(%rbx),%xmm2 movdqa 16(%rbx),%xmm3 leaq 32(%rbx),%rbx movdqu 0(%rdi),%xmm4 movdqu 16(%rdi),%xmm5 leaq 32(%rdi),%rdi movdqa %xmm0,-32(%rbx) movdqa %xmm0,-16(%rbx) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-32(%rdi) movdqu %xmm5,-16(%rdi) subq $32,%rdx jnz .Lmulx4x_cond_copy movq %rdx,(%rbx) movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmulx4x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_mulx4x_mont,.-bn_mulx4x_mont .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 16 #endif ring-0.16.9/pregenerated/x86_64-mont-macosx.S000064400000000000000000000447501353224257600167510ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_bn_mul_mont .private_extern _GFp_bn_mul_mont .p2align 4 _GFp_bn_mul_mont: movl %r9d,%r9d movq %rsp,%rax testl $3,%r9d jnz L$mul_enter cmpl $8,%r9d jb L$mul_enter movl _GFp_ia32cap_P+8(%rip),%r11d cmpq %rsi,%rdx jne L$mul4x_enter testl $7,%r9d jz L$sqr8x_enter jmp L$mul4x_enter .p2align 4 L$mul_enter: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 negq %r9 movq %rsp,%r11 leaq -16(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul_page_walk jmp L$mul_page_walk_done .p2align 4 L$mul_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul_page_walk L$mul_page_walk_done: movq %rax,8(%rsp,%r9,8) L$mul_body: movq %rdx,%r12 movq (%r8),%r8 movq (%r12),%rbx movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%r13 leaq 1(%r15),%r15 jmp L$1st_enter .p2align 4 L$1st: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%r13 movq %r10,%r11 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 L$1st_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx leaq 1(%r15),%r15 movq %rdx,%r10 mulq %rbp cmpq %r9,%r15 jne L$1st addq %rax,%r13 movq (%rsi),%rax adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 movq %r10,%r11 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 jmp L$outer .p2align 4 L$outer: movq (%r12,%r14,8),%rbx xorq %r15,%r15 movq %r8,%rbp movq (%rsp),%r10 mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq 8(%rsp),%r10 movq %rdx,%r13 leaq 1(%r15),%r15 jmp L$inner_enter .p2align 4 L$inner: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 L$inner_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 leaq 1(%r15),%r15 mulq %rbp cmpq %r9,%r15 jne L$inner addq %rax,%r13 movq (%rsi),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 cmpq %r9,%r14 jb L$outer xorq %r14,%r14 movq (%rsp),%rax movq %r9,%r15 .p2align 4 L$sub: sbbq (%rcx,%r14,8),%rax movq %rax,(%rdi,%r14,8) movq 8(%rsp,%r14,8),%rax leaq 1(%r14),%r14 decq %r15 jnz L$sub sbbq $0,%rax movq $-1,%rbx xorq %rax,%rbx xorq %r14,%r14 movq %r9,%r15 L$copy: movq (%rdi,%r14,8),%rcx movq (%rsp,%r14,8),%rdx andq %rbx,%rcx andq %rax,%rdx movq %r9,(%rsp,%r14,8) orq %rcx,%rdx movq %rdx,(%rdi,%r14,8) leaq 1(%r14),%r14 subq $1,%r15 jnz L$copy movq 8(%rsp,%r9,8),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mul_epilogue: .byte 0xf3,0xc3 .p2align 4 bn_mul4x_mont: movl %r9d,%r9d movq %rsp,%rax L$mul4x_enter: andl $0x80100,%r11d cmpl $0x80100,%r11d je L$mulx4x_enter pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 negq %r9 movq %rsp,%r11 leaq -32(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul4x_page_walk jmp L$mul4x_page_walk_done L$mul4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul4x_page_walk L$mul4x_page_walk_done: movq %rax,8(%rsp,%r9,8) L$mul4x_body: movq %rdi,16(%rsp,%r9,8) movq %rdx,%r12 movq (%r8),%r8 movq (%r12),%rbx movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi),%rax adcq $0,%rdx addq %r11,%rdi leaq 4(%r15),%r15 adcq $0,%rdx movq %rdi,(%rsp) movq %rdx,%r13 jmp L$1st4x .p2align 4 L$1st4x: mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq (%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx,%r15,8),%rax adcq $0,%rdx leaq 4(%r15),%r15 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq -16(%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-32(%rsp,%r15,8) movq %rdx,%r13 cmpq %r9,%r15 jb L$1st4x mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi movq %r13,-8(%rsp,%r15,8) movq %rdi,(%rsp,%r15,8) leaq 1(%r14),%r14 .p2align 2 L$outer4x: movq (%r12,%r14,8),%rbx xorq %r15,%r15 movq (%rsp),%r10 movq %r8,%rbp mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%rsp),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi),%rax adcq $0,%rdx addq %r11,%rdi leaq 4(%r15),%r15 adcq $0,%rdx movq %rdi,(%rsp) movq %rdx,%r13 jmp L$inner4x .p2align 4 L$inner4x: mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx addq -16(%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx addq -8(%rsp,%r15,8),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx,%r15,8),%rax adcq $0,%rdx addq 8(%rsp,%r15,8),%r11 adcq $0,%rdx leaq 4(%r15),%r15 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq -16(%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-32(%rsp,%r15,8) movq %rdx,%r13 cmpq %r9,%r15 jb L$inner4x mulq %rbx addq %rax,%r10 movq -16(%rcx,%r15,8),%rax adcq $0,%rdx addq -16(%rsp,%r15,8),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%rsp,%r15,8) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx,%r15,8),%rax adcq $0,%rdx addq -8(%rsp,%r15,8),%r11 adcq $0,%rdx leaq 1(%r14),%r14 movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%rsp,%r15,8) movq %rdx,%r13 xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi addq (%rsp,%r9,8),%r13 adcq $0,%rdi movq %r13,-8(%rsp,%r15,8) movq %rdi,(%rsp,%r15,8) cmpq %r9,%r14 jb L$outer4x movq 16(%rsp,%r9,8),%rdi leaq -4(%r9),%r15 movq 0(%rsp),%rax movq 8(%rsp),%rdx shrq $2,%r15 leaq (%rsp),%rsi xorq %r14,%r14 subq 0(%rcx),%rax movq 16(%rsi),%rbx movq 24(%rsi),%rbp sbbq 8(%rcx),%rdx L$sub4x: movq %rax,0(%rdi,%r14,8) movq %rdx,8(%rdi,%r14,8) sbbq 16(%rcx,%r14,8),%rbx movq 32(%rsi,%r14,8),%rax movq 40(%rsi,%r14,8),%rdx sbbq 24(%rcx,%r14,8),%rbp movq %rbx,16(%rdi,%r14,8) movq %rbp,24(%rdi,%r14,8) sbbq 32(%rcx,%r14,8),%rax movq 48(%rsi,%r14,8),%rbx movq 56(%rsi,%r14,8),%rbp sbbq 40(%rcx,%r14,8),%rdx leaq 4(%r14),%r14 decq %r15 jnz L$sub4x movq %rax,0(%rdi,%r14,8) movq 32(%rsi,%r14,8),%rax sbbq 16(%rcx,%r14,8),%rbx movq %rdx,8(%rdi,%r14,8) sbbq 24(%rcx,%r14,8),%rbp movq %rbx,16(%rdi,%r14,8) sbbq $0,%rax movq %rbp,24(%rdi,%r14,8) pxor %xmm0,%xmm0 .byte 102,72,15,110,224 pcmpeqd %xmm5,%xmm5 pshufd $0,%xmm4,%xmm4 movq %r9,%r15 pxor %xmm4,%xmm5 shrq $2,%r15 xorl %eax,%eax jmp L$copy4x .p2align 4 L$copy4x: movdqa (%rsp,%rax,1),%xmm1 movdqu (%rdi,%rax,1),%xmm2 pand %xmm4,%xmm1 pand %xmm5,%xmm2 movdqa 16(%rsp,%rax,1),%xmm3 movdqa %xmm0,(%rsp,%rax,1) por %xmm2,%xmm1 movdqu 16(%rdi,%rax,1),%xmm2 movdqu %xmm1,(%rdi,%rax,1) pand %xmm4,%xmm3 pand %xmm5,%xmm2 movdqa %xmm0,16(%rsp,%rax,1) por %xmm2,%xmm3 movdqu %xmm3,16(%rdi,%rax,1) leaq 32(%rax),%rax decq %r15 jnz L$copy4x movq 8(%rsp,%r9,8),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mul4x_epilogue: .byte 0xf3,0xc3 .p2align 5 bn_sqr8x_mont: movq %rsp,%rax L$sqr8x_enter: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$sqr8x_prologue: movl %r9d,%r10d shll $3,%r9d shlq $3+2,%r10 negq %r9 leaq -64(%rsp,%r9,2),%r11 movq %rsp,%rbp movq (%r8),%r8 subq %rsi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$sqr8x_sp_alt subq %r11,%rbp leaq -64(%rbp,%r9,2),%rbp jmp L$sqr8x_sp_done .p2align 5 L$sqr8x_sp_alt: leaq 4096-64(,%r9,2),%r10 leaq -64(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$sqr8x_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$sqr8x_page_walk jmp L$sqr8x_page_walk_done .p2align 4 L$sqr8x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$sqr8x_page_walk L$sqr8x_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) L$sqr8x_body: .byte 102,72,15,110,209 pxor %xmm0,%xmm0 .byte 102,72,15,110,207 .byte 102,73,15,110,218 movl _GFp_ia32cap_P+8(%rip),%eax andl $0x80100,%eax cmpl $0x80100,%eax jne L$sqr8x_nox call _GFp_bn_sqrx8x_internal leaq (%r8,%rcx,1),%rbx movq %rcx,%r9 movq %rcx,%rdx .byte 102,72,15,126,207 sarq $3+2,%rcx jmp L$sqr8x_sub .p2align 5 L$sqr8x_nox: call _GFp_bn_sqr8x_internal leaq (%rdi,%r9,1),%rbx movq %r9,%rcx movq %r9,%rdx .byte 102,72,15,126,207 sarq $3+2,%rcx jmp L$sqr8x_sub .p2align 5 L$sqr8x_sub: movq 0(%rbx),%r12 movq 8(%rbx),%r13 movq 16(%rbx),%r14 movq 24(%rbx),%r15 leaq 32(%rbx),%rbx sbbq 0(%rbp),%r12 sbbq 8(%rbp),%r13 sbbq 16(%rbp),%r14 sbbq 24(%rbp),%r15 leaq 32(%rbp),%rbp movq %r12,0(%rdi) movq %r13,8(%rdi) movq %r14,16(%rdi) movq %r15,24(%rdi) leaq 32(%rdi),%rdi incq %rcx jnz L$sqr8x_sub sbbq $0,%rax leaq (%rbx,%r9,1),%rbx leaq (%rdi,%r9,1),%rdi .byte 102,72,15,110,200 pxor %xmm0,%xmm0 pshufd $0,%xmm1,%xmm1 movq 40(%rsp),%rsi jmp L$sqr8x_cond_copy .p2align 5 L$sqr8x_cond_copy: movdqa 0(%rbx),%xmm2 movdqa 16(%rbx),%xmm3 leaq 32(%rbx),%rbx movdqu 0(%rdi),%xmm4 movdqu 16(%rdi),%xmm5 leaq 32(%rdi),%rdi movdqa %xmm0,-32(%rbx) movdqa %xmm0,-16(%rbx) movdqa %xmm0,-32(%rbx,%rdx,1) movdqa %xmm0,-16(%rbx,%rdx,1) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-32(%rdi) movdqu %xmm5,-16(%rdi) addq $32,%r9 jnz L$sqr8x_cond_copy movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$sqr8x_epilogue: .byte 0xf3,0xc3 .p2align 5 bn_mulx4x_mont: movq %rsp,%rax L$mulx4x_enter: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$mulx4x_prologue: shll $3,%r9d xorq %r10,%r10 subq %r9,%r10 movq (%r8),%r8 leaq -72(%rsp,%r10,1),%rbp andq $-128,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mulx4x_page_walk jmp L$mulx4x_page_walk_done .p2align 4 L$mulx4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mulx4x_page_walk L$mulx4x_page_walk_done: leaq (%rdx,%r9,1),%r10 movq %r9,0(%rsp) shrq $5,%r9 movq %r10,16(%rsp) subq $1,%r9 movq %r8,24(%rsp) movq %rdi,32(%rsp) movq %rax,40(%rsp) movq %r9,48(%rsp) jmp L$mulx4x_body .p2align 5 L$mulx4x_body: leaq 8(%rdx),%rdi movq (%rdx),%rdx leaq 64+32(%rsp),%rbx movq %rdx,%r9 mulxq 0(%rsi),%r8,%rax mulxq 8(%rsi),%r11,%r14 addq %rax,%r11 movq %rdi,8(%rsp) mulxq 16(%rsi),%r12,%r13 adcq %r14,%r12 adcq $0,%r13 movq %r8,%rdi imulq 24(%rsp),%r8 xorq %rbp,%rbp mulxq 24(%rsi),%rax,%r14 movq %r8,%rdx leaq 32(%rsi),%rsi adcxq %rax,%r13 adcxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%rdi adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 movq 48(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) adcxq %rax,%r12 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r12,-16(%rbx) jmp L$mulx4x_1st .p2align 5 L$mulx4x_1st: adcxq %rbp,%r15 mulxq 0(%rsi),%r10,%rax adcxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 .byte 0x67,0x67 movq %r8,%rdx adcxq %rax,%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 movq %r11,-32(%rbx) adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz L$mulx4x_1st movq 0(%rsp),%rax movq 8(%rsp),%rdi adcq %rbp,%r15 addq %r15,%r14 sbbq %r15,%r15 movq %r14,-8(%rbx) jmp L$mulx4x_outer .p2align 5 L$mulx4x_outer: movq (%rdi),%rdx leaq 8(%rdi),%rdi subq %rax,%rsi movq %r15,(%rbx) leaq 64+32(%rsp),%rbx subq %rax,%rcx mulxq 0(%rsi),%r8,%r11 xorl %ebp,%ebp movq %rdx,%r9 mulxq 8(%rsi),%r14,%r12 adoxq -32(%rbx),%r8 adcxq %r14,%r11 mulxq 16(%rsi),%r15,%r13 adoxq -24(%rbx),%r11 adcxq %r15,%r12 adoxq -16(%rbx),%r12 adcxq %rbp,%r13 adoxq %rbp,%r13 movq %rdi,8(%rsp) movq %r8,%r15 imulq 24(%rsp),%r8 xorl %ebp,%ebp mulxq 24(%rsi),%rax,%r14 movq %r8,%rdx adcxq %rax,%r13 adoxq -8(%rbx),%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi adoxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) leaq 32(%rcx),%rcx adcxq %rax,%r12 adoxq %rbp,%r15 movq 48(%rsp),%rdi movq %r12,-16(%rbx) jmp L$mulx4x_inner .p2align 5 L$mulx4x_inner: mulxq 0(%rsi),%r10,%rax adcxq %rbp,%r15 adoxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq 0(%rbx),%r10 adoxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq 8(%rbx),%r11 adoxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 movq %r8,%rdx adcxq 16(%rbx),%r12 adoxq %rax,%r13 adcxq 24(%rbx),%r13 adoxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adcxq %rbp,%r14 adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-32(%rbx) movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz L$mulx4x_inner movq 0(%rsp),%rax movq 8(%rsp),%rdi adcq %rbp,%r15 subq 0(%rbx),%rbp adcq %r15,%r14 sbbq %r15,%r15 movq %r14,-8(%rbx) cmpq 16(%rsp),%rdi jne L$mulx4x_outer leaq 64(%rsp),%rbx subq %rax,%rcx negq %r15 movq %rax,%rdx shrq $3+2,%rax movq 32(%rsp),%rdi jmp L$mulx4x_sub .p2align 5 L$mulx4x_sub: movq 0(%rbx),%r11 movq 8(%rbx),%r12 movq 16(%rbx),%r13 movq 24(%rbx),%r14 leaq 32(%rbx),%rbx sbbq 0(%rcx),%r11 sbbq 8(%rcx),%r12 sbbq 16(%rcx),%r13 sbbq 24(%rcx),%r14 leaq 32(%rcx),%rcx movq %r11,0(%rdi) movq %r12,8(%rdi) movq %r13,16(%rdi) movq %r14,24(%rdi) leaq 32(%rdi),%rdi decq %rax jnz L$mulx4x_sub sbbq $0,%r15 leaq 64(%rsp),%rbx subq %rdx,%rdi .byte 102,73,15,110,207 pxor %xmm0,%xmm0 pshufd $0,%xmm1,%xmm1 movq 40(%rsp),%rsi jmp L$mulx4x_cond_copy .p2align 5 L$mulx4x_cond_copy: movdqa 0(%rbx),%xmm2 movdqa 16(%rbx),%xmm3 leaq 32(%rbx),%rbx movdqu 0(%rdi),%xmm4 movdqu 16(%rdi),%xmm5 leaq 32(%rdi),%rdi movdqa %xmm0,-32(%rbx) movdqa %xmm0,-16(%rbx) pcmpeqd %xmm1,%xmm0 pand %xmm1,%xmm2 pand %xmm1,%xmm3 pand %xmm0,%xmm4 pand %xmm0,%xmm5 pxor %xmm0,%xmm0 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqu %xmm4,-32(%rdi) movdqu %xmm5,-16(%rdi) subq $32,%rdx jnz L$mulx4x_cond_copy movq %rdx,(%rbx) movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mulx4x_epilogue: .byte 0xf3,0xc3 .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 4 #endif ring-0.16.9/pregenerated/x86_64-mont-nasm.obj000064400000000000000000000471351353224260300167540ustar0000000000000000dEi]aDP.text{ p`.pdata0 @0@.xdataPU@@@.debug$S*1A?@B.debug$T UD@BH|$Ht$HHHLLLD$(LL$0EHA:A0DH9Afffff.SUATAUAVAWIINTIIM)IK$L$L9H$L$L9JDIMI$HM1M1LHIHIIHIHFHIM#fDIJHMMHNlIHIJHMIHM9IHHMHNlIMH1MHNlJMv f.KM1LL$HIHHIIHIHFHLT$IM-ffffff.IJHMNHNlIHIJHMIIMHM9IHHMNHNlIH1MHMHNlJMvM9&M1H$Mfff.JJJDMvIHHH1M1MJ JH!H!N H JMvIJtHL~LvLnLfHnH^H&H|$Ht$H|$Ht$HHHLLLD$(LL$0EHAASUATAUAVAWIINTIIM)IK$L$L9H$L$L9JDJ|IMI$HM1M1LHIHIIHIHFHHHIHAHIHHHFHLMHH<$IHIJDHIHIJDHMHNlHHIJDHIHHJHLHJ|IHIJHIHIJDHMHNlHHIJDHMIHHJDHLHJ|IM95HIJDHIHIJDHMHNlHHIJDHIHHHHLHJ|IH1MHNlJffffff.VWSUATAUAVAWH@I@xIIqMY8ENL9IESNL9MJDdVWSUATAUAVAWH@I@xIIqMY8ENL9oESNL9IESNL9FH@(HXHhL`LhLpLxIIMMMMHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^C  # $?F "G&1 H$3(>,I @ @@  @!$C(',,00<C@4D7H=/P:\ring\pregenerated\tmp\x86_64-mont-nasm.asm]ҋnf}@h"J\"  #&)!0"6#:$@%G&J'P(W)]*b,p.q0r2t4v6x8z;}<=>?IJKLMNOQSTUVY\]^_abdefgijlmnoprs uwxyz{!|%}*~-037;?BEHNQTX[_dgjmpty}  &),037;@CFIMPTY]adjmqt    #!&")#.$3(6)9,@-G.M/N1O3Q5S7U9W<Z=]>b?e@lBoCvDzE~FGHKLMNQTUVWXZ[]^_`bcefghiklmnoqrstuvw xyz{ }#~&+/258=ADHMPSV[_behlpsw| !&*-036:=AFILOSX\`dgknqtw{       $(-1 4"7#:$>%B&E'I(N)Q+T,W-[._/c0g1j3m4p5u6y7|89:<=>?@ABCEFGHIJKLMNPQRSTUVXYZ[\]^_a b cdefg#h&j)k,l/m3n6o:p?qBsEtHuLvPwTxYy]{`|f}k~osx|  $05:>BHMQW\`djntx{        $ ) @ H M P W [ ^ b e h o s w z ! " $ & ' ( ) , - / 0 4 5 6 7 8 9 : ; = B C D E F G I K P Q R S T U W Y# Z' [+ \/ ]3 ^7 _; `? aC bG cJ dN eR fV gZ h] ic kg lk mo ot px q} r t v x y z { | } ~                      # & + 0 2 @ E J M P S V Y ^ c f g h j l n p t w z }                                  " ( + / 2 8 ; A D H N T Y _ e k q w              " $ % & ' ( ) * + , - . / 0 1 3 4 5 6 7% 8+ 91 :7 ;; <A =E >K ?Q @T AX B^ Cd Dh El Go Hu Jy K~ L M N O P R T U V W X Y [ \ ] ^ _ ` a b c d e f h ijkmnopq$r(s.u3v9w?xEyKzQ{W|[}a~gmptx~ $*06:@FLOSW]cgkntx} !&@DIMQVZ_dhlptx|     !!""##$$&%(&*',(-)1+5,<.@/D1G2K3N4T6[8_9c:f;l=s>x@}DFGHIJKLMNOQRTUWXYZ\]^_acdefhklmnopqrstuv#y'z+{2|9}@DGLPSVZ]aeimrw|;0P:\ring\pregenerated\x86_64-mont-nasm.objyasm 1.3.0GFp_bn_mul_mont%L$SEH_begin_GFp_bn_mul_montL$mul_enterL$mul4x_enterL$sqr8x_enterL$mul_page_walkL$mul_page_walk_doneL$mul_bodyL$1st_enterL$1stL$outerL$inner_enterL$innerL$subL$copyL$mul_epilogue#L$SEH_end_GFp_bn_mul_montbn_mul4x_mont#L$SEH_begin_bn_mul4x_montL$mulx4x_enterL$mul4x_page_walk L$mul4x_page_walk_doneL$mul4x_bodyL$1st4xL$outer4xL$inner4xL$sub4xL$copy4xL$mul4x_epilogue!L$SEH_end_bn_mul4x_montbn_sqr8x_mont#L$SEH_begin_bn_sqr8x_montL$sqr8x_prologueL$sqr8x_sp_altL$sqr8x_sp_doneL$sqr8x_page_walk L$sqr8x_page_walk_doneL$sqr8x_bodyL$sqr8x_noxL$sqr8x_subL$sqr8x_cond_copyL$sqr8x_epilogue!L$SEH_end_bn_sqr8x_montbn_mulx4x_mont$L$SEH_begin_bn_mulx4x_montL$mulx4x_prologueL$mulx4x_page_walk!L$mulx4x_page_walk_doneL$mulx4x_bodyL$mulx4x_1stL$mulx4x_outerL$mulx4x_innerL$mulx4x_subL$mulx4x_cond_copyL$mulx4x_epilogue"L$SEH_end_bn_mulx4x_montmul_handlerL$common_seh_tailL$common_pop_regssqr_handler'  L$SEH_info_GFp_bn_mul_mont%  L$SEH_info_bn_mul4x_mont%  L$SEH_info_bn_sqr8x_mont&  L$SEH_info_bn_mulx4x_montd h +# /# F# J# m# q# # # # # # # # # # # $ $ $ "$ /$ 3$ B$ F$ [$ _$ n$ r$ $ $ $ $ $ $ $ $ $ $ % % (% ,% E% I% g% k% % % % % % % % % % % %! %! %" &" "&% &&% ;&& ?&& `&' d&' |&( &( &) &) &* &* &+ &+ &, &, '- '- '. #'. 6'/ :'/ S'0 W'0 o'1 s'1 '2 '2 '3 '3 '4 '4 '5 '5 (6 (6 0(7 4(7 I(8 M(8 a(9 e(9 {(: (: (; (; (< (< (= (= (> (> )@ )@ #)A ')A @)B D)B ])C a)C x)F |)F )G )G )H )H )I )I .fileg.text*8H dpp9~-L$1stL$outerL$innerL$subL$copy 'f 6H_L$1st4x l`vL$sub4xL$copy4x0@ ^ . @ W d p | & 2 @ M p    , 9 HWd@w #.pdata0 ) B8.xdataP.debug$S*.debug$T \pregenerated\tmp\x86_64-mont-nasm.asmGFp_ia32cap_PGFp_bn_mul_montL$SEH_begin_GFp_bn_mul_montL$mul_enterL$mul4x_enterL$sqr8x_enterL$mul_page_walkL$mul_page_walk_doneL$mul_bodyL$1st_enterL$inner_enterL$mul_epilogueL$SEH_end_GFp_bn_mul_montbn_mul4x_montL$SEH_begin_bn_mul4x_montL$mulx4x_enterL$mul4x_page_walkL$mul4x_page_walk_doneL$mul4x_bodyL$outer4xL$inner4xL$mul4x_epilogueL$SEH_end_bn_mul4x_montGFp_bn_sqrx8x_internalGFp_bn_sqr8x_internalbn_sqr8x_montL$SEH_begin_bn_sqr8x_montL$sqr8x_prologueL$sqr8x_sp_altL$sqr8x_sp_doneL$sqr8x_page_walkL$sqr8x_page_walk_doneL$sqr8x_bodyL$sqr8x_noxL$sqr8x_subL$sqr8x_cond_copyL$sqr8x_epilogueL$SEH_end_bn_sqr8x_montbn_mulx4x_montL$SEH_begin_bn_mulx4x_montL$mulx4x_prologueL$mulx4x_page_walkL$mulx4x_page_walk_doneL$mulx4x_bodyL$mulx4x_1stL$mulx4x_outerL$mulx4x_innerL$mulx4x_subL$mulx4x_cond_copyL$mulx4x_epilogueL$SEH_end_bn_mulx4x_mont__imp_RtlVirtualUnwindmul_handlerL$common_seh_tailL$common_pop_regssqr_handlerL$SEH_info_GFp_bn_mul_montL$SEH_info_bn_mul4x_montL$SEH_info_bn_sqr8x_montL$SEH_info_bn_mulx4x_montring-0.16.9/pregenerated/x86_64-mont5-elf.S000064400000000000000000001705341353224260400163020ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .extern GFp_ia32cap_P .hidden GFp_ia32cap_P .globl GFp_bn_mul_mont_gather5 .hidden GFp_bn_mul_mont_gather5 .type GFp_bn_mul_mont_gather5,@function .align 64 GFp_bn_mul_mont_gather5: .cfi_startproc movl %r9d,%r9d movq %rsp,%rax .cfi_def_cfa_register %rax testl $7,%r9d jnz .Lmul_enter leaq GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d jmp .Lmul4x_enter .align 16 .Lmul_enter: movd 8(%rsp),%xmm5 pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 negq %r9 movq %rsp,%r11 leaq -280(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul_page_walk jmp .Lmul_page_walk_done .Lmul_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja .Lmul_page_walk .Lmul_page_walk_done: leaq .Linc(%rip),%r10 movq %rax,8(%rsp,%r9,8) .cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 .Lmul_body: leaq 128(%rdx),%r12 movdqa 0(%r10),%xmm0 movdqa 16(%r10),%xmm1 leaq 24-112(%rsp,%r9,8),%r10 andq $-16,%r10 pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 .byte 0x67 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%r12),%xmm0 pand 80(%r12),%xmm1 pand 96(%r12),%xmm2 movdqa %xmm3,352(%r10) pand 112(%r12),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%r12),%xmm4 movdqa -112(%r12),%xmm5 movdqa -96(%r12),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%r12),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%r12),%xmm4 movdqa -48(%r12),%xmm5 movdqa -32(%r12),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%r12),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%r12),%xmm4 movdqa 16(%r12),%xmm5 movdqa 32(%r12),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%r12),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq (%r8),%r8 movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%r13 leaq 1(%r15),%r15 jmp .L1st_enter .align 16 .L1st: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%r13 movq %r10,%r11 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 .L1st_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx leaq 1(%r15),%r15 movq %rdx,%r10 mulq %rbp cmpq %r9,%r15 jne .L1st addq %rax,%r13 adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-16(%rsp,%r9,8) movq %rdx,%r13 movq %r10,%r11 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 jmp .Louter .align 16 .Louter: leaq 24+128(%rsp,%r9,8),%rdx andq $-16,%rdx pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r12),%xmm0 movdqa -112(%r12),%xmm1 movdqa -96(%r12),%xmm2 movdqa -80(%r12),%xmm3 pand -128(%rdx),%xmm0 pand -112(%rdx),%xmm1 por %xmm0,%xmm4 pand -96(%rdx),%xmm2 por %xmm1,%xmm5 pand -80(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r12),%xmm0 movdqa -48(%r12),%xmm1 movdqa -32(%r12),%xmm2 movdqa -16(%r12),%xmm3 pand -64(%rdx),%xmm0 pand -48(%rdx),%xmm1 por %xmm0,%xmm4 pand -32(%rdx),%xmm2 por %xmm1,%xmm5 pand -16(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r12),%xmm0 movdqa 16(%r12),%xmm1 movdqa 32(%r12),%xmm2 movdqa 48(%r12),%xmm3 pand 0(%rdx),%xmm0 pand 16(%rdx),%xmm1 por %xmm0,%xmm4 pand 32(%rdx),%xmm2 por %xmm1,%xmm5 pand 48(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r12),%xmm0 movdqa 80(%r12),%xmm1 movdqa 96(%r12),%xmm2 movdqa 112(%r12),%xmm3 pand 64(%rdx),%xmm0 pand 80(%rdx),%xmm1 por %xmm0,%xmm4 pand 96(%rdx),%xmm2 por %xmm1,%xmm5 pand 112(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 movq (%rsi),%rax .byte 102,72,15,126,195 xorq %r15,%r15 movq %r8,%rbp movq (%rsp),%r10 mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq 8(%rsp),%r10 movq %rdx,%r13 leaq 1(%r15),%r15 jmp .Linner_enter .align 16 .Linner: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 .Linner_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 leaq 1(%r15),%r15 mulq %rbp cmpq %r9,%r15 jne .Linner addq %rax,%r13 adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r9,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r9,8) movq %rdx,%r13 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 cmpq %r9,%r14 jb .Louter xorq %r14,%r14 movq (%rsp),%rax leaq (%rsp),%rsi movq %r9,%r15 jmp .Lsub .align 16 .Lsub: sbbq (%rcx,%r14,8),%rax movq %rax,(%rdi,%r14,8) movq 8(%rsi,%r14,8),%rax leaq 1(%r14),%r14 decq %r15 jnz .Lsub sbbq $0,%rax movq $-1,%rbx xorq %rax,%rbx xorq %r14,%r14 movq %r9,%r15 .Lcopy: movq (%rdi,%r14,8),%rcx movq (%rsp,%r14,8),%rdx andq %rbx,%rcx andq %rax,%rdx movq %r14,(%rsp,%r14,8) orq %rcx,%rdx movq %rdx,(%rdi,%r14,8) leaq 1(%r14),%r14 subq $1,%r15 jnz .Lcopy movq 8(%rsp,%r9,8),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_mul_mont_gather5,.-GFp_bn_mul_mont_gather5 .type bn_mul4x_mont_gather5,@function .align 32 bn_mul4x_mont_gather5: .cfi_startproc .byte 0x67 movq %rsp,%rax .cfi_def_cfa_register %rax .Lmul4x_enter: andl $0x80108,%r11d cmpl $0x80108,%r11d je .Lmulx4x_enter pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lmul4x_prologue: .byte 0x67 shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lmul4xsp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp .Lmul4xsp_done .align 32 .Lmul4xsp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lmul4xsp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmul4x_page_walk jmp .Lmul4x_page_walk_done .Lmul4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmul4x_page_walk .Lmul4x_page_walk_done: negq %r9 movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lmul4x_body: call mul4x_internal movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmul4x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5 .type mul4x_internal,@function .align 32 mul4x_internal: .cfi_startproc shlq $5,%r9 movd 8(%rax),%xmm5 leaq .Linc(%rip),%rax leaq 128(%rdx,%r9,1),%r13 shrq $5,%r9 movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 88-112(%rsp,%r9,1),%r10 leaq 128(%rdx),%r12 pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 .byte 0x67,0x67 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 .byte 0x67 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%r12),%xmm0 pand 80(%r12),%xmm1 pand 96(%r12),%xmm2 movdqa %xmm3,352(%r10) pand 112(%r12),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%r12),%xmm4 movdqa -112(%r12),%xmm5 movdqa -96(%r12),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%r12),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%r12),%xmm4 movdqa -48(%r12),%xmm5 movdqa -32(%r12),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%r12),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%r12),%xmm4 movdqa 16(%r12),%xmm5 movdqa 32(%r12),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%r12),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq %r13,16+8(%rsp) movq %rdi,56+8(%rsp) movq (%r8),%r8 movq (%rsi),%rax leaq (%rsi,%r9,1),%rsi negq %r9 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp leaq 64+8(%rsp),%r14 movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi,%r9,1),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%r9),%r15 leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdi,(%r14) movq %rdx,%r13 jmp .L1st4x .align 32 .L1st4x: mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq 0(%rcx),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdi,(%r14) movq %rdx,%r13 addq $32,%r15 jnz .L1st4x mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%r13 leaq (%rcx,%r9,1),%rcx xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi movq %r13,-8(%r14) jmp .Louter4x .align 32 .Louter4x: leaq 16+128(%r14),%rdx pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r12),%xmm0 movdqa -112(%r12),%xmm1 movdqa -96(%r12),%xmm2 movdqa -80(%r12),%xmm3 pand -128(%rdx),%xmm0 pand -112(%rdx),%xmm1 por %xmm0,%xmm4 pand -96(%rdx),%xmm2 por %xmm1,%xmm5 pand -80(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r12),%xmm0 movdqa -48(%r12),%xmm1 movdqa -32(%r12),%xmm2 movdqa -16(%r12),%xmm3 pand -64(%rdx),%xmm0 pand -48(%rdx),%xmm1 por %xmm0,%xmm4 pand -32(%rdx),%xmm2 por %xmm1,%xmm5 pand -16(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r12),%xmm0 movdqa 16(%r12),%xmm1 movdqa 32(%r12),%xmm2 movdqa 48(%r12),%xmm3 pand 0(%rdx),%xmm0 pand 16(%rdx),%xmm1 por %xmm0,%xmm4 pand 32(%rdx),%xmm2 por %xmm1,%xmm5 pand 48(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r12),%xmm0 movdqa 80(%r12),%xmm1 movdqa 96(%r12),%xmm2 movdqa 112(%r12),%xmm3 pand 64(%rdx),%xmm0 pand 80(%rdx),%xmm1 por %xmm0,%xmm4 pand 96(%rdx),%xmm2 por %xmm1,%xmm5 pand 112(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq (%r14,%r9,1),%r10 movq %r8,%rbp mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 movq %rdi,(%r14) leaq (%r14,%r9,1),%r14 mulq %rbp addq %rax,%r10 movq 8(%rsi,%r9,1),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%r9),%r15 leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdx,%r13 jmp .Linner4x .align 32 .Linner4x: mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax adcq $0,%rdx addq 16(%r14),%r10 leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-32(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx addq -8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq 0(%rcx),%rax adcq $0,%rdx addq (%r14),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%rcx),%rcx adcq $0,%rdx movq %r13,-8(%r14) movq %rdx,%r13 addq $32,%r15 jnz .Linner4x mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax adcq $0,%rdx addq 16(%r14),%r10 leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-32(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq %rbp,%rax movq -8(%rcx),%rbp adcq $0,%rdx addq -8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%r13 movq %rdi,-16(%r14) leaq (%rcx,%r9,1),%rcx xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi addq (%r14),%r13 adcq $0,%rdi movq %r13,-8(%r14) cmpq 16+8(%rsp),%r12 jb .Louter4x xorq %rax,%rax subq %r13,%rbp adcq %r15,%r15 orq %r15,%rdi subq %rdi,%rax leaq (%r14,%r9,1),%rbx movq (%rcx),%r12 leaq (%rcx),%rbp movq %r9,%rcx sarq $3+2,%rcx movq 56+8(%rsp),%rdi decq %r12 xorq %r10,%r10 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp .Lsqr4x_sub_entry .cfi_endproc .size mul4x_internal,.-mul4x_internal .globl GFp_bn_power5 .hidden GFp_bn_power5 .type GFp_bn_power5,@function .align 32 GFp_bn_power5: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax leaq GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d andl $0x80108,%r11d cmpl $0x80108,%r11d je .Lpowerx5_enter pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lpower5_prologue: shll $3,%r9d leal (%r9,%r9,2),%r10d negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lpwr_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp .Lpwr_sp_done .align 32 .Lpwr_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lpwr_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lpwr_page_walk jmp .Lpwr_page_walk_done .Lpwr_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lpwr_page_walk .Lpwr_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lpower5_body: .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 102,73,15,110,218 .byte 102,72,15,110,226 call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal .byte 102,72,15,126,209 .byte 102,72,15,126,226 movq %rsi,%rdi movq 40(%rsp),%rax leaq 32(%rsp),%r8 call mul4x_internal movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpower5_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_power5,.-GFp_bn_power5 .globl GFp_bn_sqr8x_internal .hidden GFp_bn_sqr8x_internal .hidden GFp_bn_sqr8x_internal .type GFp_bn_sqr8x_internal,@function .align 32 GFp_bn_sqr8x_internal: __bn_sqr8x_internal: .cfi_startproc leaq 32(%r10),%rbp leaq (%rsi,%r9,1),%rsi movq %r9,%rcx movq -32(%rsi,%rbp,1),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi,%rbp,1),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi,%rbp,1),%rbx movq %rax,%r15 mulq %r14 movq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 movq %r10,-24(%rdi,%rbp,1) mulq %r14 addq %rax,%r11 movq %rbx,%rax adcq $0,%rdx movq %r11,-16(%rdi,%rbp,1) movq %rdx,%r10 movq -8(%rsi,%rbp,1),%rbx mulq %r15 movq %rax,%r12 movq %rbx,%rax movq %rdx,%r13 leaq (%rbp),%rcx mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) jmp .Lsqr4x_1st .align 32 .Lsqr4x_1st: movq (%rsi,%rcx,1),%rbx mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %rdx,%r12 adcq $0,%r12 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 8(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,(%rdi,%rcx,1) movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq 16(%rsi,%rcx,1),%rbx movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %r10,8(%rdi,%rcx,1) movq %rdx,%r12 adcq $0,%r12 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 24(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,16(%rdi,%rcx,1) movq %rdx,%r13 adcq $0,%r13 leaq 32(%rcx),%rcx mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) cmpq $0,%rcx jne .Lsqr4x_1st mulq %r15 addq %rax,%r13 leaq 16(%rbp),%rbp adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) jmp .Lsqr4x_outer .align 32 .Lsqr4x_outer: movq -32(%rsi,%rbp,1),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi,%rbp,1),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi,%rbp,1),%rbx movq %rax,%r15 mulq %r14 movq -24(%rdi,%rbp,1),%r10 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx movq %r10,-24(%rdi,%rbp,1) movq %rdx,%r11 mulq %r14 addq %rax,%r11 movq %rbx,%rax adcq $0,%rdx addq -16(%rdi,%rbp,1),%r11 movq %rdx,%r10 adcq $0,%r10 movq %r11,-16(%rdi,%rbp,1) xorq %r12,%r12 movq -8(%rsi,%rbp,1),%rbx mulq %r15 addq %rax,%r12 movq %rbx,%rax adcq $0,%rdx addq -8(%rdi,%rbp,1),%r12 movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx addq %r12,%r10 movq %rdx,%r11 adcq $0,%r11 movq %r10,-8(%rdi,%rbp,1) leaq (%rbp),%rcx jmp .Lsqr4x_inner .align 32 .Lsqr4x_inner: movq (%rsi,%rcx,1),%rbx mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %rdx,%r12 adcq $0,%r12 addq (%rdi,%rcx,1),%r13 adcq $0,%r12 .byte 0x67 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 8(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %r11,(%rdi,%rcx,1) movq %rbx,%rax movq %rdx,%r13 adcq $0,%r13 addq 8(%rdi,%rcx,1),%r12 leaq 16(%rcx),%rcx adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx addq %r12,%r10 movq %rdx,%r11 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) cmpq $0,%rcx jne .Lsqr4x_inner .byte 0x67 mulq %r15 addq %rax,%r13 adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) addq $16,%rbp jnz .Lsqr4x_outer movq -32(%rsi),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi),%rbx movq %rax,%r15 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq %r10,-24(%rdi) movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 movq -8(%rsi),%rbx adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,-16(%rdi) movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi) mulq %r15 addq %rax,%r13 movq -16(%rsi),%rax adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) mulq %rbx addq $16,%rbp xorq %r14,%r14 subq %r9,%rbp xorq %r15,%r15 addq %r12,%rax adcq $0,%rdx movq %rax,8(%rdi) movq %rdx,16(%rdi) movq %r15,24(%rdi) movq -16(%rsi,%rbp,1),%rax leaq 48+8(%rsp),%rdi xorq %r10,%r10 movq 8(%rdi),%r11 leaq (%r14,%r10,2),%r12 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq 16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 24(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi,%rbp,1),%rax movq %r12,(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 32(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 40(%rdi),%r11 adcq %rax,%rbx movq 0(%rsi,%rbp,1),%rax movq %rbx,16(%rdi) adcq %rdx,%r8 leaq 16(%rbp),%rbp movq %r8,24(%rdi) sbbq %r15,%r15 leaq 64(%rdi),%rdi jmp .Lsqr4x_shift_n_add .align 32 .Lsqr4x_shift_n_add: leaq (%r14,%r10,2),%r12 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq -16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq -8(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi,%rbp,1),%rax movq %r12,-32(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,-24(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 0(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 8(%rdi),%r11 adcq %rax,%rbx movq 0(%rsi,%rbp,1),%rax movq %rbx,-16(%rdi) adcq %rdx,%r8 leaq (%r14,%r10,2),%r12 movq %r8,-8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq 16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 24(%rdi),%r11 adcq %rax,%r12 movq 8(%rsi,%rbp,1),%rax movq %r12,0(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 32(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 40(%rdi),%r11 adcq %rax,%rbx movq 16(%rsi,%rbp,1),%rax movq %rbx,16(%rdi) adcq %rdx,%r8 movq %r8,24(%rdi) sbbq %r15,%r15 leaq 64(%rdi),%rdi addq $32,%rbp jnz .Lsqr4x_shift_n_add leaq (%r14,%r10,2),%r12 .byte 0x67 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq -16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq -8(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi),%rax movq %r12,-32(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,-24(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 mulq %rax negq %r15 adcq %rax,%rbx adcq %rdx,%r8 movq %rbx,-16(%rdi) movq %r8,-8(%rdi) .byte 102,72,15,126,213 __bn_sqr8x_reduction: xorq %rax,%rax leaq (%r9,%rbp,1),%rcx leaq 48+8(%rsp,%r9,2),%rdx movq %rcx,0+8(%rsp) leaq 48+8(%rsp,%r9,1),%rdi movq %rdx,8+8(%rsp) negq %r9 jmp .L8x_reduction_loop .align 32 .L8x_reduction_loop: leaq (%rdi,%r9,1),%rdi .byte 0x66 movq 0(%rdi),%rbx movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq 24(%rdi),%r11 movq 32(%rdi),%r12 movq 40(%rdi),%r13 movq 48(%rdi),%r14 movq 56(%rdi),%r15 movq %rax,(%rdx) leaq 64(%rdi),%rdi .byte 0x67 movq %rbx,%r8 imulq 32+8(%rsp),%rbx movq 0(%rbp),%rax movl $8,%ecx jmp .L8x_reduce .align 32 .L8x_reduce: mulq %rbx movq 8(%rbp),%rax negq %r8 movq %rdx,%r8 adcq $0,%r8 mulq %rbx addq %rax,%r9 movq 16(%rbp),%rax adcq $0,%rdx addq %r9,%r8 movq %rbx,48-8+8(%rsp,%rcx,8) movq %rdx,%r9 adcq $0,%r9 mulq %rbx addq %rax,%r10 movq 24(%rbp),%rax adcq $0,%rdx addq %r10,%r9 movq 32+8(%rsp),%rsi movq %rdx,%r10 adcq $0,%r10 mulq %rbx addq %rax,%r11 movq 32(%rbp),%rax adcq $0,%rdx imulq %r8,%rsi addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 mulq %rbx addq %rax,%r12 movq 40(%rbp),%rax adcq $0,%rdx addq %r12,%r11 movq %rdx,%r12 adcq $0,%r12 mulq %rbx addq %rax,%r13 movq 48(%rbp),%rax adcq $0,%rdx addq %r13,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %rbx addq %rax,%r14 movq 56(%rbp),%rax adcq $0,%rdx addq %r14,%r13 movq %rdx,%r14 adcq $0,%r14 mulq %rbx movq %rsi,%rbx addq %rax,%r15 movq 0(%rbp),%rax adcq $0,%rdx addq %r15,%r14 movq %rdx,%r15 adcq $0,%r15 decl %ecx jnz .L8x_reduce leaq 64(%rbp),%rbp xorq %rax,%rax movq 8+8(%rsp),%rdx cmpq 0+8(%rsp),%rbp jae .L8x_no_tail .byte 0x66 addq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 sbbq %rsi,%rsi movq 48+56+8(%rsp),%rbx movl $8,%ecx movq 0(%rbp),%rax jmp .L8x_tail .align 32 .L8x_tail: mulq %rbx addq %rax,%r8 movq 8(%rbp),%rax movq %r8,(%rdi) movq %rdx,%r8 adcq $0,%r8 mulq %rbx addq %rax,%r9 movq 16(%rbp),%rax adcq $0,%rdx addq %r9,%r8 leaq 8(%rdi),%rdi movq %rdx,%r9 adcq $0,%r9 mulq %rbx addq %rax,%r10 movq 24(%rbp),%rax adcq $0,%rdx addq %r10,%r9 movq %rdx,%r10 adcq $0,%r10 mulq %rbx addq %rax,%r11 movq 32(%rbp),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 mulq %rbx addq %rax,%r12 movq 40(%rbp),%rax adcq $0,%rdx addq %r12,%r11 movq %rdx,%r12 adcq $0,%r12 mulq %rbx addq %rax,%r13 movq 48(%rbp),%rax adcq $0,%rdx addq %r13,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %rbx addq %rax,%r14 movq 56(%rbp),%rax adcq $0,%rdx addq %r14,%r13 movq %rdx,%r14 adcq $0,%r14 mulq %rbx movq 48-16+8(%rsp,%rcx,8),%rbx addq %rax,%r15 adcq $0,%rdx addq %r15,%r14 movq 0(%rbp),%rax movq %rdx,%r15 adcq $0,%r15 decl %ecx jnz .L8x_tail leaq 64(%rbp),%rbp movq 8+8(%rsp),%rdx cmpq 0+8(%rsp),%rbp jae .L8x_tail_done movq 48+56+8(%rsp),%rbx negq %rsi movq 0(%rbp),%rax adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 sbbq %rsi,%rsi movl $8,%ecx jmp .L8x_tail .align 32 .L8x_tail_done: xorq %rax,%rax addq (%rdx),%r8 adcq $0,%r9 adcq $0,%r10 adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 adcq $0,%rax negq %rsi .L8x_no_tail: adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 adcq $0,%rax movq -8(%rbp),%rcx xorq %rsi,%rsi .byte 102,72,15,126,213 movq %r8,0(%rdi) movq %r9,8(%rdi) .byte 102,73,15,126,217 movq %r10,16(%rdi) movq %r11,24(%rdi) movq %r12,32(%rdi) movq %r13,40(%rdi) movq %r14,48(%rdi) movq %r15,56(%rdi) leaq 64(%rdi),%rdi cmpq %rdx,%rdi jb .L8x_reduction_loop .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_sqr8x_internal,.-GFp_bn_sqr8x_internal .type __bn_post4x_internal,@function .align 32 __bn_post4x_internal: .cfi_startproc movq 0(%rbp),%r12 leaq (%rdi,%r9,1),%rbx movq %r9,%rcx .byte 102,72,15,126,207 negq %rax .byte 102,72,15,126,206 sarq $3+2,%rcx decq %r12 xorq %r10,%r10 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp .Lsqr4x_sub_entry .align 16 .Lsqr4x_sub: movq 0(%rbp),%r12 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 .Lsqr4x_sub_entry: leaq 32(%rbp),%rbp notq %r12 notq %r13 notq %r14 notq %r15 andq %rax,%r12 andq %rax,%r13 andq %rax,%r14 andq %rax,%r15 negq %r10 adcq 0(%rbx),%r12 adcq 8(%rbx),%r13 adcq 16(%rbx),%r14 adcq 24(%rbx),%r15 movq %r12,0(%rdi) leaq 32(%rbx),%rbx movq %r13,8(%rdi) sbbq %r10,%r10 movq %r14,16(%rdi) movq %r15,24(%rdi) leaq 32(%rdi),%rdi incq %rcx jnz .Lsqr4x_sub movq %r9,%r10 negq %r9 .byte 0xf3,0xc3 .cfi_endproc .size __bn_post4x_internal,.-__bn_post4x_internal .globl GFp_bn_from_montgomery .hidden GFp_bn_from_montgomery .type GFp_bn_from_montgomery,@function .align 32 GFp_bn_from_montgomery: .cfi_startproc testl $7,%r9d jz bn_from_mont8x xorl %eax,%eax .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_from_montgomery,.-GFp_bn_from_montgomery .type bn_from_mont8x,@function .align 32 bn_from_mont8x: .cfi_startproc .byte 0x67 movq %rsp,%rax .cfi_def_cfa_register %rax pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lfrom_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lfrom_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp .Lfrom_sp_done .align 32 .Lfrom_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lfrom_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lfrom_page_walk jmp .Lfrom_page_walk_done .Lfrom_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lfrom_page_walk .Lfrom_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lfrom_body: movq %r9,%r11 leaq 48(%rsp),%rax pxor %xmm0,%xmm0 jmp .Lmul_by_1 .align 32 .Lmul_by_1: movdqu (%rsi),%xmm1 movdqu 16(%rsi),%xmm2 movdqu 32(%rsi),%xmm3 movdqa %xmm0,(%rax,%r9,1) movdqu 48(%rsi),%xmm4 movdqa %xmm0,16(%rax,%r9,1) .byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 movdqa %xmm1,(%rax) movdqa %xmm0,32(%rax,%r9,1) movdqa %xmm2,16(%rax) movdqa %xmm0,48(%rax,%r9,1) movdqa %xmm3,32(%rax) movdqa %xmm4,48(%rax) leaq 64(%rax),%rax subq $64,%r11 jnz .Lmul_by_1 .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 0x67 movq %rcx,%rbp .byte 102,73,15,110,218 leaq GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d andl $0x80108,%r11d cmpl $0x80108,%r11d jne .Lfrom_mont_nox leaq (%rax,%r9,1),%rdi call __bn_sqrx8x_reduction call __bn_postx4x_internal pxor %xmm0,%xmm0 leaq 48(%rsp),%rax jmp .Lfrom_mont_zero .align 32 .Lfrom_mont_nox: call __bn_sqr8x_reduction call __bn_post4x_internal pxor %xmm0,%xmm0 leaq 48(%rsp),%rax jmp .Lfrom_mont_zero .align 32 .Lfrom_mont_zero: movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 movdqa %xmm0,0(%rax) movdqa %xmm0,16(%rax) movdqa %xmm0,32(%rax) movdqa %xmm0,48(%rax) leaq 64(%rax),%rax subq $32,%r9 jnz .Lfrom_mont_zero movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lfrom_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_from_mont8x,.-bn_from_mont8x .type bn_mulx4x_mont_gather5,@function .align 32 bn_mulx4x_mont_gather5: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax .Lmulx4x_enter: pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lmulx4x_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lmulx4xsp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp .Lmulx4xsp_done .Lmulx4xsp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lmulx4xsp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmulx4x_page_walk jmp .Lmulx4x_page_walk_done .Lmulx4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lmulx4x_page_walk .Lmulx4x_page_walk_done: movq %r8,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lmulx4x_body: call mulx4x_internal movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lmulx4x_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5 .type mulx4x_internal,@function .align 32 mulx4x_internal: .cfi_startproc movq %r9,8(%rsp) movq %r9,%r10 negq %r9 shlq $5,%r9 negq %r10 leaq 128(%rdx,%r9,1),%r13 shrq $5+5,%r9 movd 8(%rax),%xmm5 subq $1,%r9 leaq .Linc(%rip),%rax movq %r13,16+8(%rsp) movq %r9,24+8(%rsp) movq %rdi,56+8(%rsp) movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 88-112(%rsp,%r10,1),%r10 leaq 128(%rdx),%rdi pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 .byte 0x67 movdqa %xmm1,%xmm2 .byte 0x67 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 .byte 0x67 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%rdi),%xmm0 pand 80(%rdi),%xmm1 pand 96(%rdi),%xmm2 movdqa %xmm3,352(%r10) pand 112(%rdi),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%rdi),%xmm4 movdqa -112(%rdi),%xmm5 movdqa -96(%rdi),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%rdi),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%rdi),%xmm4 movdqa -48(%rdi),%xmm5 movdqa -32(%rdi),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%rdi),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%rdi),%xmm4 movdqa 16(%rdi),%xmm5 movdqa 32(%rdi),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%rdi),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 pxor %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%rdi),%rdi .byte 102,72,15,126,194 leaq 64+32+8(%rsp),%rbx movq %rdx,%r9 mulxq 0(%rsi),%r8,%rax mulxq 8(%rsi),%r11,%r12 addq %rax,%r11 mulxq 16(%rsi),%rax,%r13 adcq %rax,%r12 adcq $0,%r13 mulxq 24(%rsi),%rax,%r14 movq %r8,%r15 imulq 32+8(%rsp),%r8 xorq %rbp,%rbp movq %r8,%rdx movq %rdi,8+8(%rsp) leaq 32(%rsi),%rsi adcxq %rax,%r13 adcxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 movq 24+8(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) adcxq %rax,%r12 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r12,-16(%rbx) jmp .Lmulx4x_1st .align 32 .Lmulx4x_1st: adcxq %rbp,%r15 mulxq 0(%rsi),%r10,%rax adcxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 .byte 0x67,0x67 movq %r8,%rdx adcxq %rax,%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 movq %r11,-32(%rbx) adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz .Lmulx4x_1st movq 8(%rsp),%rax adcq %rbp,%r15 leaq (%rsi,%rax,1),%rsi addq %r15,%r14 movq 8+8(%rsp),%rdi adcq %rbp,%rbp movq %r14,-8(%rbx) jmp .Lmulx4x_outer .align 32 .Lmulx4x_outer: leaq 16-256(%rbx),%r10 pxor %xmm4,%xmm4 .byte 0x67,0x67 pxor %xmm5,%xmm5 movdqa -128(%rdi),%xmm0 movdqa -112(%rdi),%xmm1 movdqa -96(%rdi),%xmm2 pand 256(%r10),%xmm0 movdqa -80(%rdi),%xmm3 pand 272(%r10),%xmm1 por %xmm0,%xmm4 pand 288(%r10),%xmm2 por %xmm1,%xmm5 pand 304(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%rdi),%xmm0 movdqa -48(%rdi),%xmm1 movdqa -32(%rdi),%xmm2 pand 320(%r10),%xmm0 movdqa -16(%rdi),%xmm3 pand 336(%r10),%xmm1 por %xmm0,%xmm4 pand 352(%r10),%xmm2 por %xmm1,%xmm5 pand 368(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%rdi),%xmm0 movdqa 16(%rdi),%xmm1 movdqa 32(%rdi),%xmm2 pand 384(%r10),%xmm0 movdqa 48(%rdi),%xmm3 pand 400(%r10),%xmm1 por %xmm0,%xmm4 pand 416(%r10),%xmm2 por %xmm1,%xmm5 pand 432(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%rdi),%xmm0 movdqa 80(%rdi),%xmm1 movdqa 96(%rdi),%xmm2 pand 448(%r10),%xmm0 movdqa 112(%rdi),%xmm3 pand 464(%r10),%xmm1 por %xmm0,%xmm4 pand 480(%r10),%xmm2 por %xmm1,%xmm5 pand 496(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%rdi),%rdi .byte 102,72,15,126,194 movq %rbp,(%rbx) leaq 32(%rbx,%rax,1),%rbx mulxq 0(%rsi),%r8,%r11 xorq %rbp,%rbp movq %rdx,%r9 mulxq 8(%rsi),%r14,%r12 adoxq -32(%rbx),%r8 adcxq %r14,%r11 mulxq 16(%rsi),%r15,%r13 adoxq -24(%rbx),%r11 adcxq %r15,%r12 mulxq 24(%rsi),%rdx,%r14 adoxq -16(%rbx),%r12 adcxq %rdx,%r13 leaq (%rcx,%rax,1),%rcx leaq 32(%rsi),%rsi adoxq -8(%rbx),%r13 adcxq %rbp,%r14 adoxq %rbp,%r14 movq %r8,%r15 imulq 32+8(%rsp),%r8 movq %r8,%rdx xorq %rbp,%rbp movq %rdi,8+8(%rsp) mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq 24+8(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r12 movq %r11,-24(%rbx) adoxq %rbp,%r15 movq %r12,-16(%rbx) leaq 32(%rcx),%rcx jmp .Lmulx4x_inner .align 32 .Lmulx4x_inner: mulxq 0(%rsi),%r10,%rax adcxq %rbp,%r15 adoxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq 0(%rbx),%r10 adoxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq 8(%rbx),%r11 adoxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 movq %r8,%rdx adcxq 16(%rbx),%r12 adoxq %rax,%r13 adcxq 24(%rbx),%r13 adoxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adcxq %rbp,%r14 adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 adoxq %r15,%r13 movq %r11,-32(%rbx) mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx leaq 32(%rcx),%rcx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 movq %r13,-16(%rbx) decq %rdi jnz .Lmulx4x_inner movq 0+8(%rsp),%rax adcq %rbp,%r15 subq 0(%rbx),%rdi movq 8+8(%rsp),%rdi movq 16+8(%rsp),%r10 adcq %r15,%r14 leaq (%rsi,%rax,1),%rsi adcq %rbp,%rbp movq %r14,-8(%rbx) cmpq %r10,%rdi jb .Lmulx4x_outer movq -8(%rcx),%r10 movq %rbp,%r8 movq (%rcx,%rax,1),%r12 leaq (%rcx,%rax,1),%rbp movq %rax,%rcx leaq (%rbx,%rax,1),%rdi xorl %eax,%eax xorq %r15,%r15 subq %r14,%r10 adcq %r15,%r15 orq %r15,%r8 sarq $3+2,%rcx subq %r8,%rax movq 56+8(%rsp),%rdx decq %r12 movq 8(%rbp),%r13 xorq %r8,%r8 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp .Lsqrx4x_sub_entry .cfi_endproc .size mulx4x_internal,.-mulx4x_internal .type bn_powerx5,@function .align 32 bn_powerx5: .cfi_startproc movq %rsp,%rax .cfi_def_cfa_register %rax .Lpowerx5_enter: pushq %rbx .cfi_offset %rbx,-16 pushq %rbp .cfi_offset %rbp,-24 pushq %r12 .cfi_offset %r12,-32 pushq %r13 .cfi_offset %r13,-40 pushq %r14 .cfi_offset %r14,-48 pushq %r15 .cfi_offset %r15,-56 .Lpowerx5_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb .Lpwrx_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp .Lpwrx_sp_done .align 32 .Lpwrx_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp .Lpwrx_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lpwrx_page_walk jmp .Lpwrx_page_walk_done .Lpwrx_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja .Lpwrx_page_walk .Lpwrx_page_walk_done: movq %r9,%r10 negq %r9 pxor %xmm0,%xmm0 .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 102,73,15,110,218 .byte 102,72,15,110,226 movq %r8,32(%rsp) movq %rax,40(%rsp) .cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 .Lpowerx5_body: call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal movq %r10,%r9 movq %rsi,%rdi .byte 102,72,15,126,209 .byte 102,72,15,126,226 movq 40(%rsp),%rax call mulx4x_internal movq 40(%rsp),%rsi .cfi_def_cfa %rsi,8 movq $1,%rax movq -48(%rsi),%r15 .cfi_restore %r15 movq -40(%rsi),%r14 .cfi_restore %r14 movq -32(%rsi),%r13 .cfi_restore %r13 movq -24(%rsi),%r12 .cfi_restore %r12 movq -16(%rsi),%rbp .cfi_restore %rbp movq -8(%rsi),%rbx .cfi_restore %rbx leaq (%rsi),%rsp .cfi_def_cfa_register %rsp .Lpowerx5_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size bn_powerx5,.-bn_powerx5 .globl GFp_bn_sqrx8x_internal .hidden GFp_bn_sqrx8x_internal .type GFp_bn_sqrx8x_internal,@function .align 32 GFp_bn_sqrx8x_internal: __bn_sqrx8x_internal: .cfi_startproc leaq 48+8(%rsp),%rdi leaq (%rsi,%r9,1),%rbp movq %r9,0+8(%rsp) movq %rbp,8+8(%rsp) jmp .Lsqr8x_zero_start .align 32 .byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 .Lsqrx8x_zero: .byte 0x3e movdqa %xmm0,0(%rdi) movdqa %xmm0,16(%rdi) movdqa %xmm0,32(%rdi) movdqa %xmm0,48(%rdi) .Lsqr8x_zero_start: movdqa %xmm0,64(%rdi) movdqa %xmm0,80(%rdi) movdqa %xmm0,96(%rdi) movdqa %xmm0,112(%rdi) leaq 128(%rdi),%rdi subq $64,%r9 jnz .Lsqrx8x_zero movq 0(%rsi),%rdx xorq %r10,%r10 xorq %r11,%r11 xorq %r12,%r12 xorq %r13,%r13 xorq %r14,%r14 xorq %r15,%r15 leaq 48+8(%rsp),%rdi xorq %rbp,%rbp jmp .Lsqrx8x_outer_loop .align 32 .Lsqrx8x_outer_loop: mulxq 8(%rsi),%r8,%rax adcxq %r9,%r8 adoxq %rax,%r10 mulxq 16(%rsi),%r9,%rax adcxq %r10,%r9 adoxq %rax,%r11 .byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 adcxq %r11,%r10 adoxq %rax,%r12 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 adcxq %r12,%r11 adoxq %rax,%r13 mulxq 40(%rsi),%r12,%rax adcxq %r13,%r12 adoxq %rax,%r14 mulxq 48(%rsi),%r13,%rax adcxq %r14,%r13 adoxq %r15,%rax mulxq 56(%rsi),%r14,%r15 movq 8(%rsi),%rdx adcxq %rax,%r14 adoxq %rbp,%r15 adcq 64(%rdi),%r15 movq %r8,8(%rdi) movq %r9,16(%rdi) sbbq %rcx,%rcx xorq %rbp,%rbp mulxq 16(%rsi),%r8,%rbx mulxq 24(%rsi),%r9,%rax adcxq %r10,%r8 adoxq %rbx,%r9 mulxq 32(%rsi),%r10,%rbx adcxq %r11,%r9 adoxq %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 adcxq %r12,%r10 adoxq %rbx,%r11 .byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 adcxq %r13,%r11 adoxq %r14,%r12 .byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 movq 16(%rsi),%rdx adcxq %rax,%r12 adoxq %rbx,%r13 adcxq %r15,%r13 adoxq %rbp,%r14 adcxq %rbp,%r14 movq %r8,24(%rdi) movq %r9,32(%rdi) mulxq 24(%rsi),%r8,%rbx mulxq 32(%rsi),%r9,%rax adcxq %r10,%r8 adoxq %rbx,%r9 mulxq 40(%rsi),%r10,%rbx adcxq %r11,%r9 adoxq %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 adcxq %r12,%r10 adoxq %r13,%r11 .byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 .byte 0x3e movq 24(%rsi),%rdx adcxq %rbx,%r11 adoxq %rax,%r12 adcxq %r14,%r12 movq %r8,40(%rdi) movq %r9,48(%rdi) mulxq 32(%rsi),%r8,%rax adoxq %rbp,%r13 adcxq %rbp,%r13 mulxq 40(%rsi),%r9,%rbx adcxq %r10,%r8 adoxq %rax,%r9 mulxq 48(%rsi),%r10,%rax adcxq %r11,%r9 adoxq %r12,%r10 mulxq 56(%rsi),%r11,%r12 movq 32(%rsi),%rdx movq 40(%rsi),%r14 adcxq %rbx,%r10 adoxq %rax,%r11 movq 48(%rsi),%r15 adcxq %r13,%r11 adoxq %rbp,%r12 adcxq %rbp,%r12 movq %r8,56(%rdi) movq %r9,64(%rdi) mulxq %r14,%r9,%rax movq 56(%rsi),%r8 adcxq %r10,%r9 mulxq %r15,%r10,%rbx adoxq %rax,%r10 adcxq %r11,%r10 mulxq %r8,%r11,%rax movq %r14,%rdx adoxq %rbx,%r11 adcxq %r12,%r11 adcxq %rbp,%rax mulxq %r15,%r14,%rbx mulxq %r8,%r12,%r13 movq %r15,%rdx leaq 64(%rsi),%rsi adcxq %r14,%r11 adoxq %rbx,%r12 adcxq %rax,%r12 adoxq %rbp,%r13 .byte 0x67,0x67 mulxq %r8,%r8,%r14 adcxq %r8,%r13 adcxq %rbp,%r14 cmpq 8+8(%rsp),%rsi je .Lsqrx8x_outer_break negq %rcx movq $-8,%rcx movq %rbp,%r15 movq 64(%rdi),%r8 adcxq 72(%rdi),%r9 adcxq 80(%rdi),%r10 adcxq 88(%rdi),%r11 adcq 96(%rdi),%r12 adcq 104(%rdi),%r13 adcq 112(%rdi),%r14 adcq 120(%rdi),%r15 leaq (%rsi),%rbp leaq 128(%rdi),%rdi sbbq %rax,%rax movq -64(%rsi),%rdx movq %rax,16+8(%rsp) movq %rdi,24+8(%rsp) xorl %eax,%eax jmp .Lsqrx8x_loop .align 32 .Lsqrx8x_loop: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rax,%rbx adoxq %r9,%r8 mulxq 8(%rbp),%rax,%r9 adcxq %rax,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rax,%r10 adcxq %rax,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 movq %rbx,(%rdi,%rcx,8) movl $0,%ebx adcxq %rax,%r13 adoxq %r15,%r14 .byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 movq 8(%rsi,%rcx,8),%rdx adcxq %rax,%r14 adoxq %rbx,%r15 adcxq %rbx,%r15 .byte 0x67 incq %rcx jnz .Lsqrx8x_loop leaq 64(%rbp),%rbp movq $-8,%rcx cmpq 8+8(%rsp),%rbp je .Lsqrx8x_break subq 16+8(%rsp),%rbx .byte 0x66 movq -64(%rsi),%rdx adcxq 0(%rdi),%r8 adcxq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi .byte 0x67 sbbq %rax,%rax xorl %ebx,%ebx movq %rax,16+8(%rsp) jmp .Lsqrx8x_loop .align 32 .Lsqrx8x_break: xorq %rbp,%rbp subq 16+8(%rsp),%rbx adcxq %rbp,%r8 movq 24+8(%rsp),%rcx adcxq %rbp,%r9 movq 0(%rsi),%rdx adcq $0,%r10 movq %r8,0(%rdi) adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 cmpq %rcx,%rdi je .Lsqrx8x_outer_loop movq %r9,8(%rdi) movq 8(%rcx),%r9 movq %r10,16(%rdi) movq 16(%rcx),%r10 movq %r11,24(%rdi) movq 24(%rcx),%r11 movq %r12,32(%rdi) movq 32(%rcx),%r12 movq %r13,40(%rdi) movq 40(%rcx),%r13 movq %r14,48(%rdi) movq 48(%rcx),%r14 movq %r15,56(%rdi) movq 56(%rcx),%r15 movq %rcx,%rdi jmp .Lsqrx8x_outer_loop .align 32 .Lsqrx8x_outer_break: movq %r9,72(%rdi) .byte 102,72,15,126,217 movq %r10,80(%rdi) movq %r11,88(%rdi) movq %r12,96(%rdi) movq %r13,104(%rdi) movq %r14,112(%rdi) leaq 48+8(%rsp),%rdi movq (%rsi,%rcx,1),%rdx movq 8(%rdi),%r11 xorq %r10,%r10 movq 0+8(%rsp),%r9 adoxq %r11,%r11 movq 16(%rdi),%r12 movq 24(%rdi),%r13 .align 32 .Lsqrx4x_shift_n_add: mulxq %rdx,%rax,%rbx adoxq %r12,%r12 adcxq %r10,%rax .byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 .byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 adoxq %r13,%r13 adcxq %r11,%rbx movq 40(%rdi),%r11 movq %rax,0(%rdi) movq %rbx,8(%rdi) mulxq %rdx,%rax,%rbx adoxq %r10,%r10 adcxq %r12,%rax movq 16(%rsi,%rcx,1),%rdx movq 48(%rdi),%r12 adoxq %r11,%r11 adcxq %r13,%rbx movq 56(%rdi),%r13 movq %rax,16(%rdi) movq %rbx,24(%rdi) mulxq %rdx,%rax,%rbx adoxq %r12,%r12 adcxq %r10,%rax movq 24(%rsi,%rcx,1),%rdx leaq 32(%rcx),%rcx movq 64(%rdi),%r10 adoxq %r13,%r13 adcxq %r11,%rbx movq 72(%rdi),%r11 movq %rax,32(%rdi) movq %rbx,40(%rdi) mulxq %rdx,%rax,%rbx adoxq %r10,%r10 adcxq %r12,%rax jrcxz .Lsqrx4x_shift_n_add_break .byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 adoxq %r11,%r11 adcxq %r13,%rbx movq 80(%rdi),%r12 movq 88(%rdi),%r13 movq %rax,48(%rdi) movq %rbx,56(%rdi) leaq 64(%rdi),%rdi nop jmp .Lsqrx4x_shift_n_add .align 32 .Lsqrx4x_shift_n_add_break: adcxq %r13,%rbx movq %rax,48(%rdi) movq %rbx,56(%rdi) leaq 64(%rdi),%rdi .byte 102,72,15,126,213 __bn_sqrx8x_reduction: xorl %eax,%eax movq 32+8(%rsp),%rbx movq 48+8(%rsp),%rdx leaq -64(%rbp,%r9,1),%rcx movq %rcx,0+8(%rsp) movq %rdi,8+8(%rsp) leaq 48+8(%rsp),%rdi jmp .Lsqrx8x_reduction_loop .align 32 .Lsqrx8x_reduction_loop: movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq 24(%rdi),%r11 movq 32(%rdi),%r12 movq %rdx,%r8 imulq %rbx,%rdx movq 40(%rdi),%r13 movq 48(%rdi),%r14 movq 56(%rdi),%r15 movq %rax,24+8(%rsp) leaq 64(%rdi),%rdi xorq %rsi,%rsi movq $-8,%rcx jmp .Lsqrx8x_reduce .align 32 .Lsqrx8x_reduce: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rbx,%rax adoxq %r9,%r8 mulxq 8(%rbp),%rbx,%r9 adcxq %rbx,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rbx,%r10 adcxq %rbx,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rbx,%r11 adcxq %rbx,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 movq %rdx,%rax movq %r8,%rdx adcxq %rbx,%r11 adoxq %r13,%r12 mulxq 32+8(%rsp),%rbx,%rdx movq %rax,%rdx movq %rax,64+48+8(%rsp,%rcx,8) mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 adcxq %rax,%r13 adoxq %r15,%r14 mulxq 56(%rbp),%rax,%r15 movq %rbx,%rdx adcxq %rax,%r14 adoxq %rsi,%r15 adcxq %rsi,%r15 .byte 0x67,0x67,0x67 incq %rcx jnz .Lsqrx8x_reduce movq %rsi,%rax cmpq 0+8(%rsp),%rbp jae .Lsqrx8x_no_tail movq 48+8(%rsp),%rdx addq 0(%rdi),%r8 leaq 64(%rbp),%rbp movq $-8,%rcx adcxq 8(%rdi),%r9 adcxq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi sbbq %rax,%rax xorq %rsi,%rsi movq %rax,16+8(%rsp) jmp .Lsqrx8x_tail .align 32 .Lsqrx8x_tail: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rax,%rbx adoxq %r9,%r8 mulxq 8(%rbp),%rax,%r9 adcxq %rax,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rax,%r10 adcxq %rax,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 adcxq %rax,%r13 adoxq %r15,%r14 mulxq 56(%rbp),%rax,%r15 movq 72+48+8(%rsp,%rcx,8),%rdx adcxq %rax,%r14 adoxq %rsi,%r15 movq %rbx,(%rdi,%rcx,8) movq %r8,%rbx adcxq %rsi,%r15 incq %rcx jnz .Lsqrx8x_tail cmpq 0+8(%rsp),%rbp jae .Lsqrx8x_tail_done subq 16+8(%rsp),%rsi movq 48+8(%rsp),%rdx leaq 64(%rbp),%rbp adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi sbbq %rax,%rax subq $8,%rcx xorq %rsi,%rsi movq %rax,16+8(%rsp) jmp .Lsqrx8x_tail .align 32 .Lsqrx8x_tail_done: xorq %rax,%rax addq 24+8(%rsp),%r8 adcq $0,%r9 adcq $0,%r10 adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 adcq $0,%rax subq 16+8(%rsp),%rsi .Lsqrx8x_no_tail: adcq 0(%rdi),%r8 .byte 102,72,15,126,217 adcq 8(%rdi),%r9 movq 56(%rbp),%rsi .byte 102,72,15,126,213 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 adcq $0,%rax movq 32+8(%rsp),%rbx movq 64(%rdi,%rcx,1),%rdx movq %r8,0(%rdi) leaq 64(%rdi),%r8 movq %r9,8(%rdi) movq %r10,16(%rdi) movq %r11,24(%rdi) movq %r12,32(%rdi) movq %r13,40(%rdi) movq %r14,48(%rdi) movq %r15,56(%rdi) leaq 64(%rdi,%rcx,1),%rdi cmpq 8+8(%rsp),%r8 jb .Lsqrx8x_reduction_loop .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_sqrx8x_internal,.-GFp_bn_sqrx8x_internal .align 32 .type __bn_postx4x_internal,@function __bn_postx4x_internal: .cfi_startproc movq 0(%rbp),%r12 movq %rcx,%r10 movq %rcx,%r9 negq %rax sarq $3+2,%rcx .byte 102,72,15,126,202 .byte 102,72,15,126,206 decq %r12 movq 8(%rbp),%r13 xorq %r8,%r8 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp .Lsqrx4x_sub_entry .align 16 .Lsqrx4x_sub: movq 0(%rbp),%r12 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 .Lsqrx4x_sub_entry: andnq %rax,%r12,%r12 leaq 32(%rbp),%rbp andnq %rax,%r13,%r13 andnq %rax,%r14,%r14 andnq %rax,%r15,%r15 negq %r8 adcq 0(%rdi),%r12 adcq 8(%rdi),%r13 adcq 16(%rdi),%r14 adcq 24(%rdi),%r15 movq %r12,0(%rdx) leaq 32(%rdi),%rdi movq %r13,8(%rdx) sbbq %r8,%r8 movq %r14,16(%rdx) movq %r15,24(%rdx) leaq 32(%rdx),%rdx incq %rcx jnz .Lsqrx4x_sub negq %r9 .byte 0xf3,0xc3 .cfi_endproc .size __bn_postx4x_internal,.-__bn_postx4x_internal .globl GFp_bn_scatter5 .hidden GFp_bn_scatter5 .type GFp_bn_scatter5,@function .align 16 GFp_bn_scatter5: .cfi_startproc cmpl $0,%esi jz .Lscatter_epilogue leaq (%rdx,%rcx,8),%rdx .Lscatter: movq (%rdi),%rax leaq 8(%rdi),%rdi movq %rax,(%rdx) leaq 256(%rdx),%rdx subl $1,%esi jnz .Lscatter .Lscatter_epilogue: .byte 0xf3,0xc3 .cfi_endproc .size GFp_bn_scatter5,.-GFp_bn_scatter5 .globl GFp_bn_gather5 .hidden GFp_bn_gather5 .type GFp_bn_gather5,@function .align 32 GFp_bn_gather5: .cfi_startproc .LSEH_begin_GFp_bn_gather5: .byte 0x4c,0x8d,0x14,0x24 .cfi_def_cfa_register %r10 .byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 leaq .Linc(%rip),%rax andq $-16,%rsp movd %ecx,%xmm5 movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 128(%rdx),%r11 leaq 128(%rsp),%rax pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,-128(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,-112(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,-96(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,-80(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,-64(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,-48(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,-32(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,-16(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,0(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,16(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,32(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,48(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,64(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,80(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,96(%rax) movdqa %xmm4,%xmm2 movdqa %xmm3,112(%rax) jmp .Lgather .align 32 .Lgather: pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r11),%xmm0 movdqa -112(%r11),%xmm1 movdqa -96(%r11),%xmm2 pand -128(%rax),%xmm0 movdqa -80(%r11),%xmm3 pand -112(%rax),%xmm1 por %xmm0,%xmm4 pand -96(%rax),%xmm2 por %xmm1,%xmm5 pand -80(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r11),%xmm0 movdqa -48(%r11),%xmm1 movdqa -32(%r11),%xmm2 pand -64(%rax),%xmm0 movdqa -16(%r11),%xmm3 pand -48(%rax),%xmm1 por %xmm0,%xmm4 pand -32(%rax),%xmm2 por %xmm1,%xmm5 pand -16(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r11),%xmm0 movdqa 16(%r11),%xmm1 movdqa 32(%r11),%xmm2 pand 0(%rax),%xmm0 movdqa 48(%r11),%xmm3 pand 16(%rax),%xmm1 por %xmm0,%xmm4 pand 32(%rax),%xmm2 por %xmm1,%xmm5 pand 48(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r11),%xmm0 movdqa 80(%r11),%xmm1 movdqa 96(%r11),%xmm2 pand 64(%rax),%xmm0 movdqa 112(%r11),%xmm3 pand 80(%rax),%xmm1 por %xmm0,%xmm4 pand 96(%rax),%xmm2 por %xmm1,%xmm5 pand 112(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 leaq 256(%r11),%r11 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 movq %xmm0,(%rdi) leaq 8(%rdi),%rdi subl $1,%esi jnz .Lgather leaq (%r10),%rsp .cfi_def_cfa_register %rsp .byte 0xf3,0xc3 .LSEH_end_GFp_bn_gather5: .cfi_endproc .size GFp_bn_gather5,.-GFp_bn_gather5 .align 64 .Linc: .long 0,0, 1,1 .long 2,2, 2,2 .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 #endif ring-0.16.9/pregenerated/x86_64-mont5-macosx.S000064400000000000000000001615071353224257600170360ustar0000000000000000# This file is generated from a similarly-named Perl script in the BoringSSL # source tree. Do not edit by hand. #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) .text .globl _GFp_bn_mul_mont_gather5 .private_extern _GFp_bn_mul_mont_gather5 .p2align 6 _GFp_bn_mul_mont_gather5: movl %r9d,%r9d movq %rsp,%rax testl $7,%r9d jnz L$mul_enter leaq _GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d jmp L$mul4x_enter .p2align 4 L$mul_enter: movd 8(%rsp),%xmm5 pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 negq %r9 movq %rsp,%r11 leaq -280(%rsp,%r9,8),%r10 negq %r9 andq $-1024,%r10 subq %r10,%r11 andq $-4096,%r11 leaq (%r10,%r11,1),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul_page_walk jmp L$mul_page_walk_done L$mul_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r11 cmpq %r10,%rsp ja L$mul_page_walk L$mul_page_walk_done: leaq L$inc(%rip),%r10 movq %rax,8(%rsp,%r9,8) L$mul_body: leaq 128(%rdx),%r12 movdqa 0(%r10),%xmm0 movdqa 16(%r10),%xmm1 leaq 24-112(%rsp,%r9,8),%r10 andq $-16,%r10 pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 .byte 0x67 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%r12),%xmm0 pand 80(%r12),%xmm1 pand 96(%r12),%xmm2 movdqa %xmm3,352(%r10) pand 112(%r12),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%r12),%xmm4 movdqa -112(%r12),%xmm5 movdqa -96(%r12),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%r12),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%r12),%xmm4 movdqa -48(%r12),%xmm5 movdqa -32(%r12),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%r12),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%r12),%xmm4 movdqa 16(%r12),%xmm5 movdqa 32(%r12),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%r12),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq (%r8),%r8 movq (%rsi),%rax xorq %r14,%r14 xorq %r15,%r15 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq %rdx,%r13 leaq 1(%r15),%r15 jmp L$1st_enter .p2align 4 L$1st: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r11,%r13 movq %r10,%r11 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 L$1st_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx leaq 1(%r15),%r15 movq %rdx,%r10 mulq %rbp cmpq %r9,%r15 jne L$1st addq %rax,%r13 adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-16(%rsp,%r9,8) movq %rdx,%r13 movq %r10,%r11 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 jmp L$outer .p2align 4 L$outer: leaq 24+128(%rsp,%r9,8),%rdx andq $-16,%rdx pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r12),%xmm0 movdqa -112(%r12),%xmm1 movdqa -96(%r12),%xmm2 movdqa -80(%r12),%xmm3 pand -128(%rdx),%xmm0 pand -112(%rdx),%xmm1 por %xmm0,%xmm4 pand -96(%rdx),%xmm2 por %xmm1,%xmm5 pand -80(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r12),%xmm0 movdqa -48(%r12),%xmm1 movdqa -32(%r12),%xmm2 movdqa -16(%r12),%xmm3 pand -64(%rdx),%xmm0 pand -48(%rdx),%xmm1 por %xmm0,%xmm4 pand -32(%rdx),%xmm2 por %xmm1,%xmm5 pand -16(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r12),%xmm0 movdqa 16(%r12),%xmm1 movdqa 32(%r12),%xmm2 movdqa 48(%r12),%xmm3 pand 0(%rdx),%xmm0 pand 16(%rdx),%xmm1 por %xmm0,%xmm4 pand 32(%rdx),%xmm2 por %xmm1,%xmm5 pand 48(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r12),%xmm0 movdqa 80(%r12),%xmm1 movdqa 96(%r12),%xmm2 movdqa 112(%r12),%xmm3 pand 64(%rdx),%xmm0 pand 80(%rdx),%xmm1 por %xmm0,%xmm4 pand 96(%rdx),%xmm2 por %xmm1,%xmm5 pand 112(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 movq (%rsi),%rax .byte 102,72,15,126,195 xorq %r15,%r15 movq %r8,%rbp movq (%rsp),%r10 mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi),%rax adcq $0,%rdx movq 8(%rsp),%r10 movq %rdx,%r13 leaq 1(%r15),%r15 jmp L$inner_enter .p2align 4 L$inner: addq %rax,%r13 movq (%rsi,%r15,8),%rax adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r15,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r15,8) movq %rdx,%r13 L$inner_enter: mulq %rbx addq %rax,%r11 movq (%rcx,%r15,8),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 leaq 1(%r15),%r15 mulq %rbp cmpq %r9,%r15 jne L$inner addq %rax,%r13 adcq $0,%rdx addq %r10,%r13 movq (%rsp,%r9,8),%r10 adcq $0,%rdx movq %r13,-16(%rsp,%r9,8) movq %rdx,%r13 xorq %rdx,%rdx addq %r11,%r13 adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%rsp,%r9,8) movq %rdx,(%rsp,%r9,8) leaq 1(%r14),%r14 cmpq %r9,%r14 jb L$outer xorq %r14,%r14 movq (%rsp),%rax leaq (%rsp),%rsi movq %r9,%r15 jmp L$sub .p2align 4 L$sub: sbbq (%rcx,%r14,8),%rax movq %rax,(%rdi,%r14,8) movq 8(%rsi,%r14,8),%rax leaq 1(%r14),%r14 decq %r15 jnz L$sub sbbq $0,%rax movq $-1,%rbx xorq %rax,%rbx xorq %r14,%r14 movq %r9,%r15 L$copy: movq (%rdi,%r14,8),%rcx movq (%rsp,%r14,8),%rdx andq %rbx,%rcx andq %rax,%rdx movq %r14,(%rsp,%r14,8) orq %rcx,%rdx movq %rdx,(%rdi,%r14,8) leaq 1(%r14),%r14 subq $1,%r15 jnz L$copy movq 8(%rsp,%r9,8),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mul_epilogue: .byte 0xf3,0xc3 .p2align 5 bn_mul4x_mont_gather5: .byte 0x67 movq %rsp,%rax L$mul4x_enter: andl $0x80108,%r11d cmpl $0x80108,%r11d je L$mulx4x_enter pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$mul4x_prologue: .byte 0x67 shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$mul4xsp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp L$mul4xsp_done .p2align 5 L$mul4xsp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$mul4xsp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mul4x_page_walk jmp L$mul4x_page_walk_done L$mul4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mul4x_page_walk L$mul4x_page_walk_done: negq %r9 movq %rax,40(%rsp) L$mul4x_body: call mul4x_internal movq 40(%rsp),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mul4x_epilogue: .byte 0xf3,0xc3 .p2align 5 mul4x_internal: shlq $5,%r9 movd 8(%rax),%xmm5 leaq L$inc(%rip),%rax leaq 128(%rdx,%r9,1),%r13 shrq $5,%r9 movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 88-112(%rsp,%r9,1),%r10 leaq 128(%rdx),%r12 pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 .byte 0x67,0x67 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 .byte 0x67 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 .byte 0x67 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%r12),%xmm0 pand 80(%r12),%xmm1 pand 96(%r12),%xmm2 movdqa %xmm3,352(%r10) pand 112(%r12),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%r12),%xmm4 movdqa -112(%r12),%xmm5 movdqa -96(%r12),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%r12),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%r12),%xmm4 movdqa -48(%r12),%xmm5 movdqa -32(%r12),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%r12),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%r12),%xmm4 movdqa 16(%r12),%xmm5 movdqa 32(%r12),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%r12),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq %r13,16+8(%rsp) movq %rdi,56+8(%rsp) movq (%r8),%r8 movq (%rsi),%rax leaq (%rsi,%r9,1),%rsi negq %r9 movq %r8,%rbp mulq %rbx movq %rax,%r10 movq (%rcx),%rax imulq %r10,%rbp leaq 64+8(%rsp),%r14 movq %rdx,%r11 mulq %rbp addq %rax,%r10 movq 8(%rsi,%r9,1),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%r9),%r15 leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdi,(%r14) movq %rdx,%r13 jmp L$1st4x .p2align 5 L$1st4x: mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq 0(%rcx),%rax adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-8(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdi,(%r14) movq %rdx,%r13 addq $32,%r15 jnz L$1st4x mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%r13 leaq (%rcx,%r9,1),%rcx xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi movq %r13,-8(%r14) jmp L$outer4x .p2align 5 L$outer4x: leaq 16+128(%r14),%rdx pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r12),%xmm0 movdqa -112(%r12),%xmm1 movdqa -96(%r12),%xmm2 movdqa -80(%r12),%xmm3 pand -128(%rdx),%xmm0 pand -112(%rdx),%xmm1 por %xmm0,%xmm4 pand -96(%rdx),%xmm2 por %xmm1,%xmm5 pand -80(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r12),%xmm0 movdqa -48(%r12),%xmm1 movdqa -32(%r12),%xmm2 movdqa -16(%r12),%xmm3 pand -64(%rdx),%xmm0 pand -48(%rdx),%xmm1 por %xmm0,%xmm4 pand -32(%rdx),%xmm2 por %xmm1,%xmm5 pand -16(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r12),%xmm0 movdqa 16(%r12),%xmm1 movdqa 32(%r12),%xmm2 movdqa 48(%r12),%xmm3 pand 0(%rdx),%xmm0 pand 16(%rdx),%xmm1 por %xmm0,%xmm4 pand 32(%rdx),%xmm2 por %xmm1,%xmm5 pand 48(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r12),%xmm0 movdqa 80(%r12),%xmm1 movdqa 96(%r12),%xmm2 movdqa 112(%r12),%xmm3 pand 64(%rdx),%xmm0 pand 80(%rdx),%xmm1 por %xmm0,%xmm4 pand 96(%rdx),%xmm2 por %xmm1,%xmm5 pand 112(%rdx),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 .byte 102,72,15,126,195 movq (%r14,%r9,1),%r10 movq %r8,%rbp mulq %rbx addq %rax,%r10 movq (%rcx),%rax adcq $0,%rdx imulq %r10,%rbp movq %rdx,%r11 movq %rdi,(%r14) leaq (%r14,%r9,1),%r14 mulq %rbp addq %rax,%r10 movq 8(%rsi,%r9,1),%rax adcq $0,%rdx movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%r9),%r15 leaq 32(%rcx),%rcx adcq $0,%rdx movq %rdx,%r13 jmp L$inner4x .p2align 5 L$inner4x: mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax adcq $0,%rdx addq 16(%r14),%r10 leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-32(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq -8(%rcx),%rax adcq $0,%rdx addq -8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%r13 mulq %rbx addq %rax,%r10 movq 0(%rcx),%rax adcq $0,%rdx addq (%r14),%r10 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq 8(%rsi,%r15,1),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-16(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq 8(%rcx),%rax adcq $0,%rdx addq 8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq 16(%rsi,%r15,1),%rax adcq $0,%rdx addq %r11,%rdi leaq 32(%rcx),%rcx adcq $0,%rdx movq %r13,-8(%r14) movq %rdx,%r13 addq $32,%r15 jnz L$inner4x mulq %rbx addq %rax,%r10 movq -16(%rcx),%rax adcq $0,%rdx addq 16(%r14),%r10 leaq 32(%r14),%r14 adcq $0,%rdx movq %rdx,%r11 mulq %rbp addq %rax,%r13 movq -8(%rsi),%rax adcq $0,%rdx addq %r10,%r13 adcq $0,%rdx movq %rdi,-32(%r14) movq %rdx,%rdi mulq %rbx addq %rax,%r11 movq %rbp,%rax movq -8(%rcx),%rbp adcq $0,%rdx addq -8(%r14),%r11 adcq $0,%rdx movq %rdx,%r10 mulq %rbp addq %rax,%rdi movq (%rsi,%r9,1),%rax adcq $0,%rdx addq %r11,%rdi adcq $0,%rdx movq %r13,-24(%r14) movq %rdx,%r13 movq %rdi,-16(%r14) leaq (%rcx,%r9,1),%rcx xorq %rdi,%rdi addq %r10,%r13 adcq $0,%rdi addq (%r14),%r13 adcq $0,%rdi movq %r13,-8(%r14) cmpq 16+8(%rsp),%r12 jb L$outer4x xorq %rax,%rax subq %r13,%rbp adcq %r15,%r15 orq %r15,%rdi subq %rdi,%rax leaq (%r14,%r9,1),%rbx movq (%rcx),%r12 leaq (%rcx),%rbp movq %r9,%rcx sarq $3+2,%rcx movq 56+8(%rsp),%rdi decq %r12 xorq %r10,%r10 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp L$sqr4x_sub_entry .globl _GFp_bn_power5 .private_extern _GFp_bn_power5 .p2align 5 _GFp_bn_power5: movq %rsp,%rax leaq _GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d andl $0x80108,%r11d cmpl $0x80108,%r11d je L$powerx5_enter pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$power5_prologue: shll $3,%r9d leal (%r9,%r9,2),%r10d negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$pwr_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp L$pwr_sp_done .p2align 5 L$pwr_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$pwr_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$pwr_page_walk jmp L$pwr_page_walk_done L$pwr_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$pwr_page_walk L$pwr_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) L$power5_body: .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 102,73,15,110,218 .byte 102,72,15,110,226 call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal call __bn_sqr8x_internal call __bn_post4x_internal .byte 102,72,15,126,209 .byte 102,72,15,126,226 movq %rsi,%rdi movq 40(%rsp),%rax leaq 32(%rsp),%r8 call mul4x_internal movq 40(%rsp),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$power5_epilogue: .byte 0xf3,0xc3 .globl _GFp_bn_sqr8x_internal .private_extern _GFp_bn_sqr8x_internal .private_extern _GFp_bn_sqr8x_internal .p2align 5 _GFp_bn_sqr8x_internal: __bn_sqr8x_internal: leaq 32(%r10),%rbp leaq (%rsi,%r9,1),%rsi movq %r9,%rcx movq -32(%rsi,%rbp,1),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi,%rbp,1),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi,%rbp,1),%rbx movq %rax,%r15 mulq %r14 movq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 movq %r10,-24(%rdi,%rbp,1) mulq %r14 addq %rax,%r11 movq %rbx,%rax adcq $0,%rdx movq %r11,-16(%rdi,%rbp,1) movq %rdx,%r10 movq -8(%rsi,%rbp,1),%rbx mulq %r15 movq %rax,%r12 movq %rbx,%rax movq %rdx,%r13 leaq (%rbp),%rcx mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) jmp L$sqr4x_1st .p2align 5 L$sqr4x_1st: movq (%rsi,%rcx,1),%rbx mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %rdx,%r12 adcq $0,%r12 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 8(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,(%rdi,%rcx,1) movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq 16(%rsi,%rcx,1),%rbx movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %r10,8(%rdi,%rcx,1) movq %rdx,%r12 adcq $0,%r12 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 24(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,16(%rdi,%rcx,1) movq %rdx,%r13 adcq $0,%r13 leaq 32(%rcx),%rcx mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) cmpq $0,%rcx jne L$sqr4x_1st mulq %r15 addq %rax,%r13 leaq 16(%rbp),%rbp adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) jmp L$sqr4x_outer .p2align 5 L$sqr4x_outer: movq -32(%rsi,%rbp,1),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi,%rbp,1),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi,%rbp,1),%rbx movq %rax,%r15 mulq %r14 movq -24(%rdi,%rbp,1),%r10 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx movq %r10,-24(%rdi,%rbp,1) movq %rdx,%r11 mulq %r14 addq %rax,%r11 movq %rbx,%rax adcq $0,%rdx addq -16(%rdi,%rbp,1),%r11 movq %rdx,%r10 adcq $0,%r10 movq %r11,-16(%rdi,%rbp,1) xorq %r12,%r12 movq -8(%rsi,%rbp,1),%rbx mulq %r15 addq %rax,%r12 movq %rbx,%rax adcq $0,%rdx addq -8(%rdi,%rbp,1),%r12 movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx addq %r12,%r10 movq %rdx,%r11 adcq $0,%r11 movq %r10,-8(%rdi,%rbp,1) leaq (%rbp),%rcx jmp L$sqr4x_inner .p2align 5 L$sqr4x_inner: movq (%rsi,%rcx,1),%rbx mulq %r15 addq %rax,%r13 movq %rbx,%rax movq %rdx,%r12 adcq $0,%r12 addq (%rdi,%rcx,1),%r13 adcq $0,%r12 .byte 0x67 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq 8(%rsi,%rcx,1),%rbx movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %r11,(%rdi,%rcx,1) movq %rbx,%rax movq %rdx,%r13 adcq $0,%r13 addq 8(%rdi,%rcx,1),%r12 leaq 16(%rcx),%rcx adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax adcq $0,%rdx addq %r12,%r10 movq %rdx,%r11 adcq $0,%r11 movq %r10,-8(%rdi,%rcx,1) cmpq $0,%rcx jne L$sqr4x_inner .byte 0x67 mulq %r15 addq %rax,%r13 adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) addq $16,%rbp jnz L$sqr4x_outer movq -32(%rsi),%r14 leaq 48+8(%rsp,%r9,2),%rdi movq -24(%rsi),%rax leaq -32(%rdi,%rbp,1),%rdi movq -16(%rsi),%rbx movq %rax,%r15 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 mulq %r14 addq %rax,%r11 movq %rbx,%rax movq %r10,-24(%rdi) movq %rdx,%r10 adcq $0,%r10 addq %r13,%r11 movq -8(%rsi),%rbx adcq $0,%r10 mulq %r15 addq %rax,%r12 movq %rbx,%rax movq %r11,-16(%rdi) movq %rdx,%r13 adcq $0,%r13 mulq %r14 addq %rax,%r10 movq %rbx,%rax movq %rdx,%r11 adcq $0,%r11 addq %r12,%r10 adcq $0,%r11 movq %r10,-8(%rdi) mulq %r15 addq %rax,%r13 movq -16(%rsi),%rax adcq $0,%rdx addq %r11,%r13 adcq $0,%rdx movq %r13,(%rdi) movq %rdx,%r12 movq %rdx,8(%rdi) mulq %rbx addq $16,%rbp xorq %r14,%r14 subq %r9,%rbp xorq %r15,%r15 addq %r12,%rax adcq $0,%rdx movq %rax,8(%rdi) movq %rdx,16(%rdi) movq %r15,24(%rdi) movq -16(%rsi,%rbp,1),%rax leaq 48+8(%rsp),%rdi xorq %r10,%r10 movq 8(%rdi),%r11 leaq (%r14,%r10,2),%r12 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq 16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 24(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi,%rbp,1),%rax movq %r12,(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 32(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 40(%rdi),%r11 adcq %rax,%rbx movq 0(%rsi,%rbp,1),%rax movq %rbx,16(%rdi) adcq %rdx,%r8 leaq 16(%rbp),%rbp movq %r8,24(%rdi) sbbq %r15,%r15 leaq 64(%rdi),%rdi jmp L$sqr4x_shift_n_add .p2align 5 L$sqr4x_shift_n_add: leaq (%r14,%r10,2),%r12 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq -16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq -8(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi,%rbp,1),%rax movq %r12,-32(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,-24(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 0(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 8(%rdi),%r11 adcq %rax,%rbx movq 0(%rsi,%rbp,1),%rax movq %rbx,-16(%rdi) adcq %rdx,%r8 leaq (%r14,%r10,2),%r12 movq %r8,-8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq 16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 24(%rdi),%r11 adcq %rax,%r12 movq 8(%rsi,%rbp,1),%rax movq %r12,0(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,8(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 movq 32(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq 40(%rdi),%r11 adcq %rax,%rbx movq 16(%rsi,%rbp,1),%rax movq %rbx,16(%rdi) adcq %rdx,%r8 movq %r8,24(%rdi) sbbq %r15,%r15 leaq 64(%rdi),%rdi addq $32,%rbp jnz L$sqr4x_shift_n_add leaq (%r14,%r10,2),%r12 .byte 0x67 shrq $63,%r10 leaq (%rcx,%r11,2),%r13 shrq $63,%r11 orq %r10,%r13 movq -16(%rdi),%r10 movq %r11,%r14 mulq %rax negq %r15 movq -8(%rdi),%r11 adcq %rax,%r12 movq -8(%rsi),%rax movq %r12,-32(%rdi) adcq %rdx,%r13 leaq (%r14,%r10,2),%rbx movq %r13,-24(%rdi) sbbq %r15,%r15 shrq $63,%r10 leaq (%rcx,%r11,2),%r8 shrq $63,%r11 orq %r10,%r8 mulq %rax negq %r15 adcq %rax,%rbx adcq %rdx,%r8 movq %rbx,-16(%rdi) movq %r8,-8(%rdi) .byte 102,72,15,126,213 __bn_sqr8x_reduction: xorq %rax,%rax leaq (%r9,%rbp,1),%rcx leaq 48+8(%rsp,%r9,2),%rdx movq %rcx,0+8(%rsp) leaq 48+8(%rsp,%r9,1),%rdi movq %rdx,8+8(%rsp) negq %r9 jmp L$8x_reduction_loop .p2align 5 L$8x_reduction_loop: leaq (%rdi,%r9,1),%rdi .byte 0x66 movq 0(%rdi),%rbx movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq 24(%rdi),%r11 movq 32(%rdi),%r12 movq 40(%rdi),%r13 movq 48(%rdi),%r14 movq 56(%rdi),%r15 movq %rax,(%rdx) leaq 64(%rdi),%rdi .byte 0x67 movq %rbx,%r8 imulq 32+8(%rsp),%rbx movq 0(%rbp),%rax movl $8,%ecx jmp L$8x_reduce .p2align 5 L$8x_reduce: mulq %rbx movq 8(%rbp),%rax negq %r8 movq %rdx,%r8 adcq $0,%r8 mulq %rbx addq %rax,%r9 movq 16(%rbp),%rax adcq $0,%rdx addq %r9,%r8 movq %rbx,48-8+8(%rsp,%rcx,8) movq %rdx,%r9 adcq $0,%r9 mulq %rbx addq %rax,%r10 movq 24(%rbp),%rax adcq $0,%rdx addq %r10,%r9 movq 32+8(%rsp),%rsi movq %rdx,%r10 adcq $0,%r10 mulq %rbx addq %rax,%r11 movq 32(%rbp),%rax adcq $0,%rdx imulq %r8,%rsi addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 mulq %rbx addq %rax,%r12 movq 40(%rbp),%rax adcq $0,%rdx addq %r12,%r11 movq %rdx,%r12 adcq $0,%r12 mulq %rbx addq %rax,%r13 movq 48(%rbp),%rax adcq $0,%rdx addq %r13,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %rbx addq %rax,%r14 movq 56(%rbp),%rax adcq $0,%rdx addq %r14,%r13 movq %rdx,%r14 adcq $0,%r14 mulq %rbx movq %rsi,%rbx addq %rax,%r15 movq 0(%rbp),%rax adcq $0,%rdx addq %r15,%r14 movq %rdx,%r15 adcq $0,%r15 decl %ecx jnz L$8x_reduce leaq 64(%rbp),%rbp xorq %rax,%rax movq 8+8(%rsp),%rdx cmpq 0+8(%rsp),%rbp jae L$8x_no_tail .byte 0x66 addq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 sbbq %rsi,%rsi movq 48+56+8(%rsp),%rbx movl $8,%ecx movq 0(%rbp),%rax jmp L$8x_tail .p2align 5 L$8x_tail: mulq %rbx addq %rax,%r8 movq 8(%rbp),%rax movq %r8,(%rdi) movq %rdx,%r8 adcq $0,%r8 mulq %rbx addq %rax,%r9 movq 16(%rbp),%rax adcq $0,%rdx addq %r9,%r8 leaq 8(%rdi),%rdi movq %rdx,%r9 adcq $0,%r9 mulq %rbx addq %rax,%r10 movq 24(%rbp),%rax adcq $0,%rdx addq %r10,%r9 movq %rdx,%r10 adcq $0,%r10 mulq %rbx addq %rax,%r11 movq 32(%rbp),%rax adcq $0,%rdx addq %r11,%r10 movq %rdx,%r11 adcq $0,%r11 mulq %rbx addq %rax,%r12 movq 40(%rbp),%rax adcq $0,%rdx addq %r12,%r11 movq %rdx,%r12 adcq $0,%r12 mulq %rbx addq %rax,%r13 movq 48(%rbp),%rax adcq $0,%rdx addq %r13,%r12 movq %rdx,%r13 adcq $0,%r13 mulq %rbx addq %rax,%r14 movq 56(%rbp),%rax adcq $0,%rdx addq %r14,%r13 movq %rdx,%r14 adcq $0,%r14 mulq %rbx movq 48-16+8(%rsp,%rcx,8),%rbx addq %rax,%r15 adcq $0,%rdx addq %r15,%r14 movq 0(%rbp),%rax movq %rdx,%r15 adcq $0,%r15 decl %ecx jnz L$8x_tail leaq 64(%rbp),%rbp movq 8+8(%rsp),%rdx cmpq 0+8(%rsp),%rbp jae L$8x_tail_done movq 48+56+8(%rsp),%rbx negq %rsi movq 0(%rbp),%rax adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 sbbq %rsi,%rsi movl $8,%ecx jmp L$8x_tail .p2align 5 L$8x_tail_done: xorq %rax,%rax addq (%rdx),%r8 adcq $0,%r9 adcq $0,%r10 adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 adcq $0,%rax negq %rsi L$8x_no_tail: adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 adcq $0,%rax movq -8(%rbp),%rcx xorq %rsi,%rsi .byte 102,72,15,126,213 movq %r8,0(%rdi) movq %r9,8(%rdi) .byte 102,73,15,126,217 movq %r10,16(%rdi) movq %r11,24(%rdi) movq %r12,32(%rdi) movq %r13,40(%rdi) movq %r14,48(%rdi) movq %r15,56(%rdi) leaq 64(%rdi),%rdi cmpq %rdx,%rdi jb L$8x_reduction_loop .byte 0xf3,0xc3 .p2align 5 __bn_post4x_internal: movq 0(%rbp),%r12 leaq (%rdi,%r9,1),%rbx movq %r9,%rcx .byte 102,72,15,126,207 negq %rax .byte 102,72,15,126,206 sarq $3+2,%rcx decq %r12 xorq %r10,%r10 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp L$sqr4x_sub_entry .p2align 4 L$sqr4x_sub: movq 0(%rbp),%r12 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 L$sqr4x_sub_entry: leaq 32(%rbp),%rbp notq %r12 notq %r13 notq %r14 notq %r15 andq %rax,%r12 andq %rax,%r13 andq %rax,%r14 andq %rax,%r15 negq %r10 adcq 0(%rbx),%r12 adcq 8(%rbx),%r13 adcq 16(%rbx),%r14 adcq 24(%rbx),%r15 movq %r12,0(%rdi) leaq 32(%rbx),%rbx movq %r13,8(%rdi) sbbq %r10,%r10 movq %r14,16(%rdi) movq %r15,24(%rdi) leaq 32(%rdi),%rdi incq %rcx jnz L$sqr4x_sub movq %r9,%r10 negq %r9 .byte 0xf3,0xc3 .globl _GFp_bn_from_montgomery .private_extern _GFp_bn_from_montgomery .p2align 5 _GFp_bn_from_montgomery: testl $7,%r9d jz bn_from_mont8x xorl %eax,%eax .byte 0xf3,0xc3 .p2align 5 bn_from_mont8x: .byte 0x67 movq %rsp,%rax pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$from_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$from_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp L$from_sp_done .p2align 5 L$from_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$from_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$from_page_walk jmp L$from_page_walk_done L$from_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$from_page_walk L$from_page_walk_done: movq %r9,%r10 negq %r9 movq %r8,32(%rsp) movq %rax,40(%rsp) L$from_body: movq %r9,%r11 leaq 48(%rsp),%rax pxor %xmm0,%xmm0 jmp L$mul_by_1 .p2align 5 L$mul_by_1: movdqu (%rsi),%xmm1 movdqu 16(%rsi),%xmm2 movdqu 32(%rsi),%xmm3 movdqa %xmm0,(%rax,%r9,1) movdqu 48(%rsi),%xmm4 movdqa %xmm0,16(%rax,%r9,1) .byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 movdqa %xmm1,(%rax) movdqa %xmm0,32(%rax,%r9,1) movdqa %xmm2,16(%rax) movdqa %xmm0,48(%rax,%r9,1) movdqa %xmm3,32(%rax) movdqa %xmm4,48(%rax) leaq 64(%rax),%rax subq $64,%r11 jnz L$mul_by_1 .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 0x67 movq %rcx,%rbp .byte 102,73,15,110,218 leaq _GFp_ia32cap_P(%rip),%r11 movl 8(%r11),%r11d andl $0x80108,%r11d cmpl $0x80108,%r11d jne L$from_mont_nox leaq (%rax,%r9,1),%rdi call __bn_sqrx8x_reduction call __bn_postx4x_internal pxor %xmm0,%xmm0 leaq 48(%rsp),%rax jmp L$from_mont_zero .p2align 5 L$from_mont_nox: call __bn_sqr8x_reduction call __bn_post4x_internal pxor %xmm0,%xmm0 leaq 48(%rsp),%rax jmp L$from_mont_zero .p2align 5 L$from_mont_zero: movq 40(%rsp),%rsi movdqa %xmm0,0(%rax) movdqa %xmm0,16(%rax) movdqa %xmm0,32(%rax) movdqa %xmm0,48(%rax) leaq 64(%rax),%rax subq $32,%r9 jnz L$from_mont_zero movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$from_epilogue: .byte 0xf3,0xc3 .p2align 5 bn_mulx4x_mont_gather5: movq %rsp,%rax L$mulx4x_enter: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$mulx4x_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$mulx4xsp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp L$mulx4xsp_done L$mulx4xsp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$mulx4xsp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mulx4x_page_walk jmp L$mulx4x_page_walk_done L$mulx4x_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$mulx4x_page_walk L$mulx4x_page_walk_done: movq %r8,32(%rsp) movq %rax,40(%rsp) L$mulx4x_body: call mulx4x_internal movq 40(%rsp),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$mulx4x_epilogue: .byte 0xf3,0xc3 .p2align 5 mulx4x_internal: movq %r9,8(%rsp) movq %r9,%r10 negq %r9 shlq $5,%r9 negq %r10 leaq 128(%rdx,%r9,1),%r13 shrq $5+5,%r9 movd 8(%rax),%xmm5 subq $1,%r9 leaq L$inc(%rip),%rax movq %r13,16+8(%rsp) movq %r9,24+8(%rsp) movq %rdi,56+8(%rsp) movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 88-112(%rsp,%r10,1),%r10 leaq 128(%rdx),%rdi pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 .byte 0x67 movdqa %xmm1,%xmm2 .byte 0x67 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,112(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,128(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,144(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,160(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,176(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,192(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,208(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,224(%r10) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,240(%r10) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,256(%r10) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,272(%r10) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,288(%r10) movdqa %xmm4,%xmm3 .byte 0x67 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,304(%r10) paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,320(%r10) pcmpeqd %xmm5,%xmm3 movdqa %xmm2,336(%r10) pand 64(%rdi),%xmm0 pand 80(%rdi),%xmm1 pand 96(%rdi),%xmm2 movdqa %xmm3,352(%r10) pand 112(%rdi),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -128(%rdi),%xmm4 movdqa -112(%rdi),%xmm5 movdqa -96(%rdi),%xmm2 pand 112(%r10),%xmm4 movdqa -80(%rdi),%xmm3 pand 128(%r10),%xmm5 por %xmm4,%xmm0 pand 144(%r10),%xmm2 por %xmm5,%xmm1 pand 160(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa -64(%rdi),%xmm4 movdqa -48(%rdi),%xmm5 movdqa -32(%rdi),%xmm2 pand 176(%r10),%xmm4 movdqa -16(%rdi),%xmm3 pand 192(%r10),%xmm5 por %xmm4,%xmm0 pand 208(%r10),%xmm2 por %xmm5,%xmm1 pand 224(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 movdqa 0(%rdi),%xmm4 movdqa 16(%rdi),%xmm5 movdqa 32(%rdi),%xmm2 pand 240(%r10),%xmm4 movdqa 48(%rdi),%xmm3 pand 256(%r10),%xmm5 por %xmm4,%xmm0 pand 272(%r10),%xmm2 por %xmm5,%xmm1 pand 288(%r10),%xmm3 por %xmm2,%xmm0 por %xmm3,%xmm1 pxor %xmm1,%xmm0 pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%rdi),%rdi .byte 102,72,15,126,194 leaq 64+32+8(%rsp),%rbx movq %rdx,%r9 mulxq 0(%rsi),%r8,%rax mulxq 8(%rsi),%r11,%r12 addq %rax,%r11 mulxq 16(%rsi),%rax,%r13 adcq %rax,%r12 adcq $0,%r13 mulxq 24(%rsi),%rax,%r14 movq %r8,%r15 imulq 32+8(%rsp),%r8 xorq %rbp,%rbp movq %r8,%rdx movq %rdi,8+8(%rsp) leaq 32(%rsi),%rsi adcxq %rax,%r13 adcxq %rbp,%r14 mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 movq 24+8(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r11,-24(%rbx) adcxq %rax,%r12 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r12,-16(%rbx) jmp L$mulx4x_1st .p2align 5 L$mulx4x_1st: adcxq %rbp,%r15 mulxq 0(%rsi),%r10,%rax adcxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 .byte 0x67,0x67 movq %r8,%rdx adcxq %rax,%r13 adcxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 movq %r11,-32(%rbx) adoxq %r15,%r13 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 leaq 32(%rcx),%rcx movq %r13,-16(%rbx) decq %rdi jnz L$mulx4x_1st movq 8(%rsp),%rax adcq %rbp,%r15 leaq (%rsi,%rax,1),%rsi addq %r15,%r14 movq 8+8(%rsp),%rdi adcq %rbp,%rbp movq %r14,-8(%rbx) jmp L$mulx4x_outer .p2align 5 L$mulx4x_outer: leaq 16-256(%rbx),%r10 pxor %xmm4,%xmm4 .byte 0x67,0x67 pxor %xmm5,%xmm5 movdqa -128(%rdi),%xmm0 movdqa -112(%rdi),%xmm1 movdqa -96(%rdi),%xmm2 pand 256(%r10),%xmm0 movdqa -80(%rdi),%xmm3 pand 272(%r10),%xmm1 por %xmm0,%xmm4 pand 288(%r10),%xmm2 por %xmm1,%xmm5 pand 304(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%rdi),%xmm0 movdqa -48(%rdi),%xmm1 movdqa -32(%rdi),%xmm2 pand 320(%r10),%xmm0 movdqa -16(%rdi),%xmm3 pand 336(%r10),%xmm1 por %xmm0,%xmm4 pand 352(%r10),%xmm2 por %xmm1,%xmm5 pand 368(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%rdi),%xmm0 movdqa 16(%rdi),%xmm1 movdqa 32(%rdi),%xmm2 pand 384(%r10),%xmm0 movdqa 48(%rdi),%xmm3 pand 400(%r10),%xmm1 por %xmm0,%xmm4 pand 416(%r10),%xmm2 por %xmm1,%xmm5 pand 432(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%rdi),%xmm0 movdqa 80(%rdi),%xmm1 movdqa 96(%rdi),%xmm2 pand 448(%r10),%xmm0 movdqa 112(%rdi),%xmm3 pand 464(%r10),%xmm1 por %xmm0,%xmm4 pand 480(%r10),%xmm2 por %xmm1,%xmm5 pand 496(%r10),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%rdi),%rdi .byte 102,72,15,126,194 movq %rbp,(%rbx) leaq 32(%rbx,%rax,1),%rbx mulxq 0(%rsi),%r8,%r11 xorq %rbp,%rbp movq %rdx,%r9 mulxq 8(%rsi),%r14,%r12 adoxq -32(%rbx),%r8 adcxq %r14,%r11 mulxq 16(%rsi),%r15,%r13 adoxq -24(%rbx),%r11 adcxq %r15,%r12 mulxq 24(%rsi),%rdx,%r14 adoxq -16(%rbx),%r12 adcxq %rdx,%r13 leaq (%rcx,%rax,1),%rcx leaq 32(%rsi),%rsi adoxq -8(%rbx),%r13 adcxq %rbp,%r14 adoxq %rbp,%r14 movq %r8,%r15 imulq 32+8(%rsp),%r8 movq %r8,%rdx xorq %rbp,%rbp movq %rdi,8+8(%rsp) mulxq 0(%rcx),%rax,%r10 adcxq %rax,%r15 adoxq %r11,%r10 mulxq 8(%rcx),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 mulxq 16(%rcx),%rax,%r12 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx movq 24+8(%rsp),%rdi movq %r10,-32(%rbx) adcxq %rax,%r12 movq %r11,-24(%rbx) adoxq %rbp,%r15 movq %r12,-16(%rbx) leaq 32(%rcx),%rcx jmp L$mulx4x_inner .p2align 5 L$mulx4x_inner: mulxq 0(%rsi),%r10,%rax adcxq %rbp,%r15 adoxq %r14,%r10 mulxq 8(%rsi),%r11,%r14 adcxq 0(%rbx),%r10 adoxq %rax,%r11 mulxq 16(%rsi),%r12,%rax adcxq 8(%rbx),%r11 adoxq %r14,%r12 mulxq 24(%rsi),%r13,%r14 movq %r8,%rdx adcxq 16(%rbx),%r12 adoxq %rax,%r13 adcxq 24(%rbx),%r13 adoxq %rbp,%r14 leaq 32(%rsi),%rsi leaq 32(%rbx),%rbx adcxq %rbp,%r14 adoxq %r15,%r10 mulxq 0(%rcx),%rax,%r15 adcxq %rax,%r10 adoxq %r15,%r11 mulxq 8(%rcx),%rax,%r15 adcxq %rax,%r11 adoxq %r15,%r12 mulxq 16(%rcx),%rax,%r15 movq %r10,-40(%rbx) adcxq %rax,%r12 adoxq %r15,%r13 movq %r11,-32(%rbx) mulxq 24(%rcx),%rax,%r15 movq %r9,%rdx leaq 32(%rcx),%rcx movq %r12,-24(%rbx) adcxq %rax,%r13 adoxq %rbp,%r15 movq %r13,-16(%rbx) decq %rdi jnz L$mulx4x_inner movq 0+8(%rsp),%rax adcq %rbp,%r15 subq 0(%rbx),%rdi movq 8+8(%rsp),%rdi movq 16+8(%rsp),%r10 adcq %r15,%r14 leaq (%rsi,%rax,1),%rsi adcq %rbp,%rbp movq %r14,-8(%rbx) cmpq %r10,%rdi jb L$mulx4x_outer movq -8(%rcx),%r10 movq %rbp,%r8 movq (%rcx,%rax,1),%r12 leaq (%rcx,%rax,1),%rbp movq %rax,%rcx leaq (%rbx,%rax,1),%rdi xorl %eax,%eax xorq %r15,%r15 subq %r14,%r10 adcq %r15,%r15 orq %r15,%r8 sarq $3+2,%rcx subq %r8,%rax movq 56+8(%rsp),%rdx decq %r12 movq 8(%rbp),%r13 xorq %r8,%r8 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp L$sqrx4x_sub_entry .p2align 5 bn_powerx5: movq %rsp,%rax L$powerx5_enter: pushq %rbx pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 L$powerx5_prologue: shll $3,%r9d leaq (%r9,%r9,2),%r10 negq %r9 movq (%r8),%r8 leaq -320(%rsp,%r9,2),%r11 movq %rsp,%rbp subq %rdi,%r11 andq $4095,%r11 cmpq %r11,%r10 jb L$pwrx_sp_alt subq %r11,%rbp leaq -320(%rbp,%r9,2),%rbp jmp L$pwrx_sp_done .p2align 5 L$pwrx_sp_alt: leaq 4096-320(,%r9,2),%r10 leaq -320(%rbp,%r9,2),%rbp subq %r10,%r11 movq $0,%r10 cmovcq %r10,%r11 subq %r11,%rbp L$pwrx_sp_done: andq $-64,%rbp movq %rsp,%r11 subq %rbp,%r11 andq $-4096,%r11 leaq (%r11,%rbp,1),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$pwrx_page_walk jmp L$pwrx_page_walk_done L$pwrx_page_walk: leaq -4096(%rsp),%rsp movq (%rsp),%r10 cmpq %rbp,%rsp ja L$pwrx_page_walk L$pwrx_page_walk_done: movq %r9,%r10 negq %r9 pxor %xmm0,%xmm0 .byte 102,72,15,110,207 .byte 102,72,15,110,209 .byte 102,73,15,110,218 .byte 102,72,15,110,226 movq %r8,32(%rsp) movq %rax,40(%rsp) L$powerx5_body: call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal call __bn_sqrx8x_internal call __bn_postx4x_internal movq %r10,%r9 movq %rsi,%rdi .byte 102,72,15,126,209 .byte 102,72,15,126,226 movq 40(%rsp),%rax call mulx4x_internal movq 40(%rsp),%rsi movq $1,%rax movq -48(%rsi),%r15 movq -40(%rsi),%r14 movq -32(%rsi),%r13 movq -24(%rsi),%r12 movq -16(%rsi),%rbp movq -8(%rsi),%rbx leaq (%rsi),%rsp L$powerx5_epilogue: .byte 0xf3,0xc3 .globl _GFp_bn_sqrx8x_internal .private_extern _GFp_bn_sqrx8x_internal .p2align 5 _GFp_bn_sqrx8x_internal: __bn_sqrx8x_internal: leaq 48+8(%rsp),%rdi leaq (%rsi,%r9,1),%rbp movq %r9,0+8(%rsp) movq %rbp,8+8(%rsp) jmp L$sqr8x_zero_start .p2align 5 .byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 L$sqrx8x_zero: .byte 0x3e movdqa %xmm0,0(%rdi) movdqa %xmm0,16(%rdi) movdqa %xmm0,32(%rdi) movdqa %xmm0,48(%rdi) L$sqr8x_zero_start: movdqa %xmm0,64(%rdi) movdqa %xmm0,80(%rdi) movdqa %xmm0,96(%rdi) movdqa %xmm0,112(%rdi) leaq 128(%rdi),%rdi subq $64,%r9 jnz L$sqrx8x_zero movq 0(%rsi),%rdx xorq %r10,%r10 xorq %r11,%r11 xorq %r12,%r12 xorq %r13,%r13 xorq %r14,%r14 xorq %r15,%r15 leaq 48+8(%rsp),%rdi xorq %rbp,%rbp jmp L$sqrx8x_outer_loop .p2align 5 L$sqrx8x_outer_loop: mulxq 8(%rsi),%r8,%rax adcxq %r9,%r8 adoxq %rax,%r10 mulxq 16(%rsi),%r9,%rax adcxq %r10,%r9 adoxq %rax,%r11 .byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 adcxq %r11,%r10 adoxq %rax,%r12 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 adcxq %r12,%r11 adoxq %rax,%r13 mulxq 40(%rsi),%r12,%rax adcxq %r13,%r12 adoxq %rax,%r14 mulxq 48(%rsi),%r13,%rax adcxq %r14,%r13 adoxq %r15,%rax mulxq 56(%rsi),%r14,%r15 movq 8(%rsi),%rdx adcxq %rax,%r14 adoxq %rbp,%r15 adcq 64(%rdi),%r15 movq %r8,8(%rdi) movq %r9,16(%rdi) sbbq %rcx,%rcx xorq %rbp,%rbp mulxq 16(%rsi),%r8,%rbx mulxq 24(%rsi),%r9,%rax adcxq %r10,%r8 adoxq %rbx,%r9 mulxq 32(%rsi),%r10,%rbx adcxq %r11,%r9 adoxq %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 adcxq %r12,%r10 adoxq %rbx,%r11 .byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 adcxq %r13,%r11 adoxq %r14,%r12 .byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 movq 16(%rsi),%rdx adcxq %rax,%r12 adoxq %rbx,%r13 adcxq %r15,%r13 adoxq %rbp,%r14 adcxq %rbp,%r14 movq %r8,24(%rdi) movq %r9,32(%rdi) mulxq 24(%rsi),%r8,%rbx mulxq 32(%rsi),%r9,%rax adcxq %r10,%r8 adoxq %rbx,%r9 mulxq 40(%rsi),%r10,%rbx adcxq %r11,%r9 adoxq %rax,%r10 .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 adcxq %r12,%r10 adoxq %r13,%r11 .byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 .byte 0x3e movq 24(%rsi),%rdx adcxq %rbx,%r11 adoxq %rax,%r12 adcxq %r14,%r12 movq %r8,40(%rdi) movq %r9,48(%rdi) mulxq 32(%rsi),%r8,%rax adoxq %rbp,%r13 adcxq %rbp,%r13 mulxq 40(%rsi),%r9,%rbx adcxq %r10,%r8 adoxq %rax,%r9 mulxq 48(%rsi),%r10,%rax adcxq %r11,%r9 adoxq %r12,%r10 mulxq 56(%rsi),%r11,%r12 movq 32(%rsi),%rdx movq 40(%rsi),%r14 adcxq %rbx,%r10 adoxq %rax,%r11 movq 48(%rsi),%r15 adcxq %r13,%r11 adoxq %rbp,%r12 adcxq %rbp,%r12 movq %r8,56(%rdi) movq %r9,64(%rdi) mulxq %r14,%r9,%rax movq 56(%rsi),%r8 adcxq %r10,%r9 mulxq %r15,%r10,%rbx adoxq %rax,%r10 adcxq %r11,%r10 mulxq %r8,%r11,%rax movq %r14,%rdx adoxq %rbx,%r11 adcxq %r12,%r11 adcxq %rbp,%rax mulxq %r15,%r14,%rbx mulxq %r8,%r12,%r13 movq %r15,%rdx leaq 64(%rsi),%rsi adcxq %r14,%r11 adoxq %rbx,%r12 adcxq %rax,%r12 adoxq %rbp,%r13 .byte 0x67,0x67 mulxq %r8,%r8,%r14 adcxq %r8,%r13 adcxq %rbp,%r14 cmpq 8+8(%rsp),%rsi je L$sqrx8x_outer_break negq %rcx movq $-8,%rcx movq %rbp,%r15 movq 64(%rdi),%r8 adcxq 72(%rdi),%r9 adcxq 80(%rdi),%r10 adcxq 88(%rdi),%r11 adcq 96(%rdi),%r12 adcq 104(%rdi),%r13 adcq 112(%rdi),%r14 adcq 120(%rdi),%r15 leaq (%rsi),%rbp leaq 128(%rdi),%rdi sbbq %rax,%rax movq -64(%rsi),%rdx movq %rax,16+8(%rsp) movq %rdi,24+8(%rsp) xorl %eax,%eax jmp L$sqrx8x_loop .p2align 5 L$sqrx8x_loop: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rax,%rbx adoxq %r9,%r8 mulxq 8(%rbp),%rax,%r9 adcxq %rax,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rax,%r10 adcxq %rax,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 movq %rbx,(%rdi,%rcx,8) movl $0,%ebx adcxq %rax,%r13 adoxq %r15,%r14 .byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 movq 8(%rsi,%rcx,8),%rdx adcxq %rax,%r14 adoxq %rbx,%r15 adcxq %rbx,%r15 .byte 0x67 incq %rcx jnz L$sqrx8x_loop leaq 64(%rbp),%rbp movq $-8,%rcx cmpq 8+8(%rsp),%rbp je L$sqrx8x_break subq 16+8(%rsp),%rbx .byte 0x66 movq -64(%rsi),%rdx adcxq 0(%rdi),%r8 adcxq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi .byte 0x67 sbbq %rax,%rax xorl %ebx,%ebx movq %rax,16+8(%rsp) jmp L$sqrx8x_loop .p2align 5 L$sqrx8x_break: xorq %rbp,%rbp subq 16+8(%rsp),%rbx adcxq %rbp,%r8 movq 24+8(%rsp),%rcx adcxq %rbp,%r9 movq 0(%rsi),%rdx adcq $0,%r10 movq %r8,0(%rdi) adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 cmpq %rcx,%rdi je L$sqrx8x_outer_loop movq %r9,8(%rdi) movq 8(%rcx),%r9 movq %r10,16(%rdi) movq 16(%rcx),%r10 movq %r11,24(%rdi) movq 24(%rcx),%r11 movq %r12,32(%rdi) movq 32(%rcx),%r12 movq %r13,40(%rdi) movq 40(%rcx),%r13 movq %r14,48(%rdi) movq 48(%rcx),%r14 movq %r15,56(%rdi) movq 56(%rcx),%r15 movq %rcx,%rdi jmp L$sqrx8x_outer_loop .p2align 5 L$sqrx8x_outer_break: movq %r9,72(%rdi) .byte 102,72,15,126,217 movq %r10,80(%rdi) movq %r11,88(%rdi) movq %r12,96(%rdi) movq %r13,104(%rdi) movq %r14,112(%rdi) leaq 48+8(%rsp),%rdi movq (%rsi,%rcx,1),%rdx movq 8(%rdi),%r11 xorq %r10,%r10 movq 0+8(%rsp),%r9 adoxq %r11,%r11 movq 16(%rdi),%r12 movq 24(%rdi),%r13 .p2align 5 L$sqrx4x_shift_n_add: mulxq %rdx,%rax,%rbx adoxq %r12,%r12 adcxq %r10,%rax .byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 .byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 adoxq %r13,%r13 adcxq %r11,%rbx movq 40(%rdi),%r11 movq %rax,0(%rdi) movq %rbx,8(%rdi) mulxq %rdx,%rax,%rbx adoxq %r10,%r10 adcxq %r12,%rax movq 16(%rsi,%rcx,1),%rdx movq 48(%rdi),%r12 adoxq %r11,%r11 adcxq %r13,%rbx movq 56(%rdi),%r13 movq %rax,16(%rdi) movq %rbx,24(%rdi) mulxq %rdx,%rax,%rbx adoxq %r12,%r12 adcxq %r10,%rax movq 24(%rsi,%rcx,1),%rdx leaq 32(%rcx),%rcx movq 64(%rdi),%r10 adoxq %r13,%r13 adcxq %r11,%rbx movq 72(%rdi),%r11 movq %rax,32(%rdi) movq %rbx,40(%rdi) mulxq %rdx,%rax,%rbx adoxq %r10,%r10 adcxq %r12,%rax jrcxz L$sqrx4x_shift_n_add_break .byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 adoxq %r11,%r11 adcxq %r13,%rbx movq 80(%rdi),%r12 movq 88(%rdi),%r13 movq %rax,48(%rdi) movq %rbx,56(%rdi) leaq 64(%rdi),%rdi nop jmp L$sqrx4x_shift_n_add .p2align 5 L$sqrx4x_shift_n_add_break: adcxq %r13,%rbx movq %rax,48(%rdi) movq %rbx,56(%rdi) leaq 64(%rdi),%rdi .byte 102,72,15,126,213 __bn_sqrx8x_reduction: xorl %eax,%eax movq 32+8(%rsp),%rbx movq 48+8(%rsp),%rdx leaq -64(%rbp,%r9,1),%rcx movq %rcx,0+8(%rsp) movq %rdi,8+8(%rsp) leaq 48+8(%rsp),%rdi jmp L$sqrx8x_reduction_loop .p2align 5 L$sqrx8x_reduction_loop: movq 8(%rdi),%r9 movq 16(%rdi),%r10 movq 24(%rdi),%r11 movq 32(%rdi),%r12 movq %rdx,%r8 imulq %rbx,%rdx movq 40(%rdi),%r13 movq 48(%rdi),%r14 movq 56(%rdi),%r15 movq %rax,24+8(%rsp) leaq 64(%rdi),%rdi xorq %rsi,%rsi movq $-8,%rcx jmp L$sqrx8x_reduce .p2align 5 L$sqrx8x_reduce: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rbx,%rax adoxq %r9,%r8 mulxq 8(%rbp),%rbx,%r9 adcxq %rbx,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rbx,%r10 adcxq %rbx,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rbx,%r11 adcxq %rbx,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 movq %rdx,%rax movq %r8,%rdx adcxq %rbx,%r11 adoxq %r13,%r12 mulxq 32+8(%rsp),%rbx,%rdx movq %rax,%rdx movq %rax,64+48+8(%rsp,%rcx,8) mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 adcxq %rax,%r13 adoxq %r15,%r14 mulxq 56(%rbp),%rax,%r15 movq %rbx,%rdx adcxq %rax,%r14 adoxq %rsi,%r15 adcxq %rsi,%r15 .byte 0x67,0x67,0x67 incq %rcx jnz L$sqrx8x_reduce movq %rsi,%rax cmpq 0+8(%rsp),%rbp jae L$sqrx8x_no_tail movq 48+8(%rsp),%rdx addq 0(%rdi),%r8 leaq 64(%rbp),%rbp movq $-8,%rcx adcxq 8(%rdi),%r9 adcxq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi sbbq %rax,%rax xorq %rsi,%rsi movq %rax,16+8(%rsp) jmp L$sqrx8x_tail .p2align 5 L$sqrx8x_tail: movq %r8,%rbx mulxq 0(%rbp),%rax,%r8 adcxq %rax,%rbx adoxq %r9,%r8 mulxq 8(%rbp),%rax,%r9 adcxq %rax,%r8 adoxq %r10,%r9 mulxq 16(%rbp),%rax,%r10 adcxq %rax,%r9 adoxq %r11,%r10 mulxq 24(%rbp),%rax,%r11 adcxq %rax,%r10 adoxq %r12,%r11 .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcxq %rax,%r11 adoxq %r13,%r12 mulxq 40(%rbp),%rax,%r13 adcxq %rax,%r12 adoxq %r14,%r13 mulxq 48(%rbp),%rax,%r14 adcxq %rax,%r13 adoxq %r15,%r14 mulxq 56(%rbp),%rax,%r15 movq 72+48+8(%rsp,%rcx,8),%rdx adcxq %rax,%r14 adoxq %rsi,%r15 movq %rbx,(%rdi,%rcx,8) movq %r8,%rbx adcxq %rsi,%r15 incq %rcx jnz L$sqrx8x_tail cmpq 0+8(%rsp),%rbp jae L$sqrx8x_tail_done subq 16+8(%rsp),%rsi movq 48+8(%rsp),%rdx leaq 64(%rbp),%rbp adcq 0(%rdi),%r8 adcq 8(%rdi),%r9 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 leaq 64(%rdi),%rdi sbbq %rax,%rax subq $8,%rcx xorq %rsi,%rsi movq %rax,16+8(%rsp) jmp L$sqrx8x_tail .p2align 5 L$sqrx8x_tail_done: xorq %rax,%rax addq 24+8(%rsp),%r8 adcq $0,%r9 adcq $0,%r10 adcq $0,%r11 adcq $0,%r12 adcq $0,%r13 adcq $0,%r14 adcq $0,%r15 adcq $0,%rax subq 16+8(%rsp),%rsi L$sqrx8x_no_tail: adcq 0(%rdi),%r8 .byte 102,72,15,126,217 adcq 8(%rdi),%r9 movq 56(%rbp),%rsi .byte 102,72,15,126,213 adcq 16(%rdi),%r10 adcq 24(%rdi),%r11 adcq 32(%rdi),%r12 adcq 40(%rdi),%r13 adcq 48(%rdi),%r14 adcq 56(%rdi),%r15 adcq $0,%rax movq 32+8(%rsp),%rbx movq 64(%rdi,%rcx,1),%rdx movq %r8,0(%rdi) leaq 64(%rdi),%r8 movq %r9,8(%rdi) movq %r10,16(%rdi) movq %r11,24(%rdi) movq %r12,32(%rdi) movq %r13,40(%rdi) movq %r14,48(%rdi) movq %r15,56(%rdi) leaq 64(%rdi,%rcx,1),%rdi cmpq 8+8(%rsp),%r8 jb L$sqrx8x_reduction_loop .byte 0xf3,0xc3 .p2align 5 __bn_postx4x_internal: movq 0(%rbp),%r12 movq %rcx,%r10 movq %rcx,%r9 negq %rax sarq $3+2,%rcx .byte 102,72,15,126,202 .byte 102,72,15,126,206 decq %r12 movq 8(%rbp),%r13 xorq %r8,%r8 movq 16(%rbp),%r14 movq 24(%rbp),%r15 jmp L$sqrx4x_sub_entry .p2align 4 L$sqrx4x_sub: movq 0(%rbp),%r12 movq 8(%rbp),%r13 movq 16(%rbp),%r14 movq 24(%rbp),%r15 L$sqrx4x_sub_entry: andnq %rax,%r12,%r12 leaq 32(%rbp),%rbp andnq %rax,%r13,%r13 andnq %rax,%r14,%r14 andnq %rax,%r15,%r15 negq %r8 adcq 0(%rdi),%r12 adcq 8(%rdi),%r13 adcq 16(%rdi),%r14 adcq 24(%rdi),%r15 movq %r12,0(%rdx) leaq 32(%rdi),%rdi movq %r13,8(%rdx) sbbq %r8,%r8 movq %r14,16(%rdx) movq %r15,24(%rdx) leaq 32(%rdx),%rdx incq %rcx jnz L$sqrx4x_sub negq %r9 .byte 0xf3,0xc3 .globl _GFp_bn_scatter5 .private_extern _GFp_bn_scatter5 .p2align 4 _GFp_bn_scatter5: cmpl $0,%esi jz L$scatter_epilogue leaq (%rdx,%rcx,8),%rdx L$scatter: movq (%rdi),%rax leaq 8(%rdi),%rdi movq %rax,(%rdx) leaq 256(%rdx),%rdx subl $1,%esi jnz L$scatter L$scatter_epilogue: .byte 0xf3,0xc3 .globl _GFp_bn_gather5 .private_extern _GFp_bn_gather5 .p2align 5 _GFp_bn_gather5: L$SEH_begin_GFp_bn_gather5: .byte 0x4c,0x8d,0x14,0x24 .byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 leaq L$inc(%rip),%rax andq $-16,%rsp movd %ecx,%xmm5 movdqa 0(%rax),%xmm0 movdqa 16(%rax),%xmm1 leaq 128(%rdx),%r11 leaq 128(%rsp),%rax pshufd $0,%xmm5,%xmm5 movdqa %xmm1,%xmm4 movdqa %xmm1,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,-128(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,-112(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,-96(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,-80(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,-64(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,-48(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,-32(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,-16(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,0(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,16(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,32(%rax) movdqa %xmm4,%xmm2 paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 movdqa %xmm3,48(%rax) movdqa %xmm4,%xmm3 paddd %xmm1,%xmm2 pcmpeqd %xmm5,%xmm1 movdqa %xmm0,64(%rax) movdqa %xmm4,%xmm0 paddd %xmm2,%xmm3 pcmpeqd %xmm5,%xmm2 movdqa %xmm1,80(%rax) movdqa %xmm4,%xmm1 paddd %xmm3,%xmm0 pcmpeqd %xmm5,%xmm3 movdqa %xmm2,96(%rax) movdqa %xmm4,%xmm2 movdqa %xmm3,112(%rax) jmp L$gather .p2align 5 L$gather: pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 movdqa -128(%r11),%xmm0 movdqa -112(%r11),%xmm1 movdqa -96(%r11),%xmm2 pand -128(%rax),%xmm0 movdqa -80(%r11),%xmm3 pand -112(%rax),%xmm1 por %xmm0,%xmm4 pand -96(%rax),%xmm2 por %xmm1,%xmm5 pand -80(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa -64(%r11),%xmm0 movdqa -48(%r11),%xmm1 movdqa -32(%r11),%xmm2 pand -64(%rax),%xmm0 movdqa -16(%r11),%xmm3 pand -48(%rax),%xmm1 por %xmm0,%xmm4 pand -32(%rax),%xmm2 por %xmm1,%xmm5 pand -16(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 0(%r11),%xmm0 movdqa 16(%r11),%xmm1 movdqa 32(%r11),%xmm2 pand 0(%rax),%xmm0 movdqa 48(%r11),%xmm3 pand 16(%rax),%xmm1 por %xmm0,%xmm4 pand 32(%rax),%xmm2 por %xmm1,%xmm5 pand 48(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 movdqa 64(%r11),%xmm0 movdqa 80(%r11),%xmm1 movdqa 96(%r11),%xmm2 pand 64(%rax),%xmm0 movdqa 112(%r11),%xmm3 pand 80(%rax),%xmm1 por %xmm0,%xmm4 pand 96(%rax),%xmm2 por %xmm1,%xmm5 pand 112(%rax),%xmm3 por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 leaq 256(%r11),%r11 pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 movq %xmm0,(%rdi) leaq 8(%rdi),%rdi subl $1,%esi jnz L$gather leaq (%r10),%rsp .byte 0xf3,0xc3 L$SEH_end_GFp_bn_gather5: .p2align 6 L$inc: .long 0,0, 1,1 .long 2,2, 2,2 .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 #endif ring-0.16.9/pregenerated/x86_64-mont5-nasm.obj000064400000000000000000001440761353224260300170430ustar0000000000000000dEi]z.text77 p`.pdata7T8X8@0@.xdataT7*99@@@.debug$SIffffff.ffff.HIHAMv HIHIJD>HMHMnHHIHAHIHHJ>HLHI~IHIHHIHIJD>HMHMnHHIHAHIHHJD>HLHI HI>II 9HIHAMv HIHIHFHMHMnHHIHAHIHHJHLHI~IJ H1MHMn@IfffAoD$fAoL$fAoT$fAo\$fBfJffRffZfffAoD$fAoL$fAoT$fAo\$fBfJffRffZfffAo$fAoL$fAoT$ fAo\$0ffJffR ffZ0fffAoD$@fAoL$PfAoT$`fAo\$pfB@fJPffR`ffZpffffpNfM$fH~OLHIHHIII>O4HIJDHHHIHAHM^HIHHJDHLMy HI HIfDHIHAHMVMv HIHIJD>HMHI~HHIHAHM^HIHHJ>HLHMnIHIHHMHIHIJD>HMHI~HHIHAHM^HIHHJD>HLHI HMnII HIHAHMVMv HIHIHFHMHI~HHIHHiHM^HIHHJHLHMnII~J H1MHM.HMnL;d$H1L)ML H)KL!H)LHH|$@IM1LmLuL} @H|$Ht$HHHLLLD$(LL$0HLE[AASUATAUAVAWAGIIMNLHI)IM9%L)JM6ffffff.fDO JMM)IMBL)HII)II$+L$H9H$L$H9MILD$ HD$(fHnfHnfInfHn |w rm fH~fH~HHD$(LD$ Ht$(HL~LvLnLfHnH^H&H|$Ht$ffffff.ffffff.Ij J4LLt.J|L8HD.H|/H\.IIIHILT/IIHHL\/IH\.IIHIHMIIHIIMILTffffff.fffff.HIIHIIIIHH\IIMIIIHLIIIIHH\IIMIIIHLTIIIIHH\IIMIIIHL\IIHI IIHIIMILTH0IIHmHMHL/IHW fff.Lt.J|L8HD.H|/H\.IILT/IHHLT/IIIHHL\/IIL\/M1H\.IIHHLd/IIIIHHMIILT/HMfDHIIHIIL,IgIIHH\IIMIIILHIILdHIIIIHHMIILTHgIIHMHL/IHWHLvJ|L8HFH|/H^IIIHIIIIHLWIIMH^IIIHL_IIIIHIIMILWIIHFHMHL/IHWHHM1L)M1LHHGHWLHD.H|$8M1L_O$VI?N,YI?M LWMHIL_IHD.L'IKVLoMI?NYI?M LW MHIL_(HH.H_IHmLGMH@ffffff.fO$VI?N,YI?M LWMHIL_IHD.LgIKVLoMI?NYI?M LMHIL_HH.H_IO$VLGMI?N,YI?M LWMHIL_IHD.L'IKVLoMI?NYI?M LW MHIL_(HHD.H_ILGMH@H  O$VgI?N,YI?M LWMHIL_IHFLgIKVLoMI?NYI?M HIHIH_LGfH~H1I )JTL8HL$J| 8HT$I@J<fHLOLWL_Lg Lo(Lw0L8HH@gIH\$(HEffffff.fffff.HHEIIIHIHEHMH\0IIHIHEHMHt$(IIHIHE HIMIIHIHE(HMIIHIHE0HMIIHIHE8HMIIHHIHEHMII.Hm@H1HT$H;l$fLLOLWL_Lg Lo(Lw0L8HH\$pHEHIHELIIHIHEHMHIIHIHEHMIIHIHE HMIIHIHE(HMIIHIHE0HMIIHIHE8HMIIHH\(IHMHEII3Hm@HT$H;l$?H\$pHHELLOLWL_Lg Lo(Lw0L8HH1LIIIIIIIHHLLOLWL_Lg Lo(Lw0L8HHMH1fH~LLOfI~LWL_Lg Lo(Lw0L8H@H9ffffff.fDLeJLfH~HfH~HIM1LmLuL}ffff.LeLmLuL}Hm IIIII!I!I!I!IL#LkLsL{L'H[ LoMLwLH HMIffffff.D$01fffff.H|$Ht$HHHLLLD$(LL$0gHSUATAUAVAWAOIIMNLHI)IM9#L)JM4ffffff.@O JMM)IMBL)HII)II$+L$H9H$L$H9MILD$ HD$(MHD$0ffooVo^ fBof0fBDH@ffBD fPfBD0fX f`0H@@I@fHnfHngHfInLE[AA8J<fHD$0<ffffff.ffff.VfHD$0Ht$(ff@f@ f@0H@@I HL~LvLnLfHnH^H&H|$Ht$fff.H|$Ht$HHHLLLD$(LL$0HSUATAUAVAWAOIIMNLHI)IM9L)JM!O JMM)IMBL)HII)II$+L$H9H$L$H9LD$ HD$(HHt$(HL~LvLnLfHnH^H&H|$Ht$ffffff.fDLL$MIIIN I fnh8IHRLl$LL$ H|$@fofoHNTHfpfogfogffvfoffvfABpfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfAfoffvfA fogffvfA0ffvfA@fvfAPfG@fOPfW`fA`f_pfffogfoofoWfAbpfo_fA۪ffAےffAۚfffogfoofoWfAۢfo_fA۪ffAےffAۚfffo'foofoW fAۢfo_0fA۪ffAےffAۚ ffffpNfHfH~H\$hIbfIbnIIbvMLD$(H1LH|$Hv fL8fL8bfL8M8bYfL8M8baH|$ LSfL8M8byLL[fL8L8HI LcfL8fM8bvfL8FfM8bvggLfL8fL8Hv H[ M8b9fL8M8byfL8M8byLSfL8L[M8byLLcfL8L8HI LkHKHD$IH4MH|$HLs ff.LfggffoGfoOfoWfAۂfo_fAۊffAے ffAۚ0fffoGfoOfoWfAۂ@fo_fAۊPffAے`ffAۚpfffofoOfoW fAۂfo_0fAۊffAےffAۚfffoG@foOPfoW`fAۂfo_pfAۊffAےffAۚffffpNfHfH~H+H\ bH1IbfL8CfM8bnL8[fM8bvL8cfL8H Hv L8kfL8L8MLD$(LH1H|$bfL8M8bYfL8M8bafL8M8byLH|$ LSfL8L[L8LcHI ffffff.ffL8M8bvfL8L8FfL8[M8bvLfL8cL8fL8kL8Hv H[ fL8M8b9fL8M8byfL8M8byLSfL8M8L[byLHI LcfL8L8LkH,HD$IH+;H|$LT$MH4HLsL9LQIL$H,HH<1M1M)MM HL)HT$@ILmM1LuL} ffffff.f.H|$Ht$HHHLLLD$(LL$0HSUATAUAVAWAOIIMNLHI)IM9$L)JM5ffffff.DO JMM)IMBL)HII)II$+L$H9H$L$H9MIffHnfHnfInfHnLD$ HD$(1 '  x n MHfH~fH~HD$(Ht$(HL~LvLnLfHnH^H&H|$Ht$ffffff.ffff.H|$8J,LL$Hl$(fff.>ffGfG fG0fG@fGPfG`fGpHI@HM1M1M1M1M1M1H|$8H1ffffff.f.FfM8L8FfM8L8fM8L8 fM8L8F(fM8L8F0fM8I8b~8HVfL8L8L@LGLOHH1^FfM8L8^ fM8L8(fM8L80fM8M8b8HVfL8L8fM8L8fL8LGLO ^F fM8L8^(fM8L80fM8M8b8>HVfL8L8fM8LG(LO0F L8fL8^(fM8L8F0fM8M8bf8HV Lv(fL8L8L~0fM8L8fL8LG8LO@³LF8fM8«L8fM8£LL8fM8fH8‹BLHv@fM8L8fL8L8ggBfM8fL8H;t$ HHILG@fL8OHfL8WPfL8_XLg`LohLwpLxH.HHHVHD$H|$ 1ffffff.fLbEfH8M8bMfL8M8bUfL8M8b]fL8M8b fL8M8bm(fL8M8bu0HϻfL8M8b8HTfL8L8fL8gHIHm@HH;l$SH+\$fHVfL8fL8OLWL_Lg Lo(Lw0L8H@gH1HD$ffffff.H1H+\$fL8HL$ fL8HILIIIIIH9LOLILWLQL_LYLg La Lo(Li(Lw0Lq0L8Ly8HLOHfH~LWPL_XLg`LohLwpH|$8HL_M1LL$M8LgLoM8fI8HL M8fI8L_(HH_M8fI8HTLg0M8fI8Lo8HGH_M8fI8HTHI LW@M8fI8L_HHG H_(M8fI8.HM8fI8LgPLoXHG0H_8H@ fI8HG0H_8H@fH~1H\$(HT$8JL HL$H|$H|$8@LOLWL_Lg IHLo(Lw0L8HD$ H@H1HDLbEfH8M8bMfL8M8bUfL8M8b]fL8M8b HLfL8M8T$(HHDxbm(fL8M8bu0fL8M8b}8HfL8L8fL8gggH@HH;l$HT$8LHm@HfL8OfL8WL_Lg Lo(Lw0L8H@HH1HD$ fLbEfH8M8bMfL8M8bUfL8M8b]fL8M8b fL8M8bm(fL8M8bu0fL8M8b}8H̀fL8L8HLfL8HLH;l$aH+t$HT$8Hm@LLOLWL_Lg Lo(Lw0L8H@HHH1HD$ffffff.ffff.H1LD$ IIIIIIIHH+t$LfH~LOHu8fH~LWL_Lg Lo(Lw0L8HH\$(HT@LLG@LOLWL_Lg Lo(Lw0L8H|@L;D$LeIIHHfH~fH~ILmM1LuL}fffff.LeLmLuL}bHm bbbIL'LoLwLL"H LjMLrLzHR HIfffff.OHHIIML$HHnHfAnfofoHMH$fpfofoffvfoffvf@foffvfHfoffvfPfoffvfXfoffvf@foffvfHfoffvfPfoffvfXfoffvffoffvfHfoffvfP foffvfX0foffvf@@foffvfHPfoffvfP`fofXp fff.fffAoCfAoKfAoSf@fAo[fHffPffXfffAoCfAoKfAoSf@fAo[fHffPffXfffAofAoKfAoS ffAo[0fHffP ffX0fffAoC@fAoKPfAoS`f@@fAo[pfHPffP`ffXpfffMfpNffHII"Montgomery Multiplication with scatter/gather for x86_64, CRYPTOGAMS by @VWSUATAUAVAWH@I@xIIqMY8ENL9ESNL9=IESNL9gLxL9MJDH@(HXHhL`LhLpLxIIMMMMHxHpIIIIy(LƹHLH1HVLLNLV(L^8LfLT$ L\$(Ld$0HL$8H@A_A^A]A\][_^96 !'2 $A(N,0P4Y8<_@hDH|L~P @ @ @ @ @ @  !@   $( 48)<.@1LPBTGXMdhQlVpX|`eg0P:\ring\pregenerated\tmp\x86_64-mont5-nasm.asm-uة|RϰX_7 L_  #&)!0"6#=$A%F'P)V*W,X.Z0\2^4`7c8f9n:q;xE{FGHIJKNOPQTUYZ[\]_`abcdefghiklmnpqr&s*u.v2w;x?yCzG{P|T~X\eimqz~ %,5<@DKRY_fos|(,049=EJMPSVY\_bfiloswz~     $!+"2#9$@%E&J'N(S)W*\+`,d-k.r/y0123456789:;<=>?@ABCDEFGHIJK LMNOP"Q&R+S/T7V:W?YBZE[I]L^O_R`VbZc]e`fcgghkipjslwm|oqrstuvwx{|}~  $(-14:>EHKNRVY\`cgkouz  & ) / 2 :?@HPSZ^aehkrvz} !$%&'*,02468:<>@BEFGLOPQRSTUV WYZ[\ ]$^(_)`-a1b5c;d?fCgGhPiTkXl\menipmqqrzs~tuvwyz{|~      " & * . 7 ; < @ I M V ] d k t {                           & - 4 = D M Q Z ^ g k o s x |                                      # & * . 2 5 8 ; @ D G K O R U X \ ` c f i m q t x |  ! " # $ % ' ( ) * + , - . 0 1 2 3 4 6 7 8 9 : ; < = > @ A C D E F G H J K L M N O P Q S T U" V& W) Y, Z/ [3 \7 ]: ^> _B `E bI dL eO fS gW i\ k` mg nk oo pv q} r s t u v w x y z { | } ~                   % ) - 4 ; B I N S W \ ` e i m q v z                                     #(,/37:=@DHLPSVY]adhlorux|     ! "#$%&' )#*&+),--1.5/90<2?3B4F5J6M7Q8U9X;\<`>c?f@jAmBqCuEzFGHIJKLMNOPQRSTUVW\^_`bcdefgkmnopqrtv x z |%(+25;>FK`hpsz~  %*/4;?CGKOSV[`b@ACFGHIJKMNOPQSTUVWX[\]^_abcdefghijl n$o'p*q-r0s4u7v:w=xByEzI{L|PSVY]`dgjmruy|  %*/49<?DGJNSVY\_chkotw|        #'*-16:@ADGK N!R#U$X%\'`(f+j,o-s.x/|02345689:;<=>?@BCDEFGIJKLMNOPRSTUVWYZ[]^_` a cdefgi$j)k,l0n4o8p<q@rCsGtJuMvPwTxWy\z_{b}f~jmquy|   $(+/36:>BEILORVY^adhlosw{~   %*/47<@DEH L P T X \`dgklouy~ "#$%&'()+,-./012456789:;= > ?@ABCE"F%G)H-I0J3K7M:N=OAPEQHRKSOURVUWXX\Y`Zc[f\j^l_ravbyc~deghijklmnoprstuwyz{|}~  #&*.148;>BFILPSVZ^adhkpswz~   $(,038;?DHLPTX\`cik      "#$%&'() * +,-/0!2$3'4)9@<H=N>P?RD`FeGjHmJpKsLvMyN~OSTVXZ\^`defgpqrstuvwxz|}~ #(047=@CHMPUY^`dinty %*.38@EINSX\`fmquy}                 ( ) * + , - . / 0 3 4 5 6 &7 *8 -: 1; 4< 7= >> B? F@ IA OB TE \F `G cH iW nX s[ x] }_ a c e g i k m p q r w z { | } ~                  ! % ) - 1 5 ; ? C G P T X \ e i m q z ~                             " & ' + / 8 < @ I M V [ ` e n s w { ! ! ! ! ! ! ! $! -! 1! :! >! G! K! O! S! X! \! c! h! m! p! u! {! ~! ! ! ! ! ! ! ! ! ! ! ! ! ! !! !" !# !$ !% !& !' !( !) !* !+ !, "- ". "/ "0 "1 "3 "5 &"6 +"7 1"8 7"9 =": C"; I"< O"= Q"> T"? Z"@ `"A d"B h"D n"E s"F y"G "H "I "J "K "L "M "N "O "P "Q "R "S "T "U "V "X "Y "[ "\ "] "^ "_ "` "a "b "d #f #g #h #i #j #k #l #m )#n .#o 7#p ;#q D#r H#s Q#t U#u Y#v ^#w c#x h#y q#z v#{ #| #} #~ # # # # # # # # # # # # # # # # # # # $ $ $ $ $ $ ($ ,$ 0$ 4$ 9$ =$ D$ I$ L$ Q$ V$ Y$ \$ b$ i$ o$ u$ |$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % % % % % % % #% (% @% E% K% Q% W% ]% c% i% p% v% |% % % % % % % % % % % % % % % % % % % % % % % % % & & & & & & & & $& )& ,& 0& 3& 7& :& @& D& G& K& O& R& V& X& [& ^& a& d& h& k& p& s& w& z& ~& & & &! &" &# &% && &' &( &) &* &. &1 &3 &5 &7 &9 &; &? &@ &A &B &K &L &M &N &O &P &Q &R 'S 'U 'W ('X 0'Y 3'Z :'[ >'\ A'^ E'_ H'` K'a R'b V'c Z'd ]'e c'f h'i p'j t'k w'l }'o 'p '} '~ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ( ( ( ( ( ( ( ( "( $( @( E( I( N( S( X( `( l( m( q( v( {( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ) ") () .) 4) :) @) F) L) R) X) \) b) h) l) p) t) w) z)# )$ )% )& )' )( )) )* )+ ), )- ). )/ )0 )1 )2 )3 )4 )5 )6 )8 )9 *; *< *= *> *? *@ %*A +*B 4*C :*D @*E I*F J*G N*H T*I Z*J `*K d*L h*M n*N t*O z*Q *R *S *T *U *V *W *X *Y *Z *[ *\ *] *^ *_ *a *b *d *e *f *g *h *i *j *k *l +m +o +q +r +s +t !+u '+v -+w 3+x 9+z ;+{ @+| F+} L+ Q+ W+ Z+ a+ d+ h+ o+ v+ }+ + + + + + + + + + + + + + + + + + + + + + + + + , , , , , &, ,, 2, 8, <, A, G, M, V, [, a, g, m, n, q, w, {, , , , , , , , , , , , , , , , , , , , , , , , , , , , - - - - - - - - - $- (- ,- 0- 4- 8- <- @- D- H- L- P- T- X- [- `- d- i- m- q- u- y- }- - - - - - - - - - - - - - - - - - - - -! -" -# -$ -% -& .' .( .* .+ ., .- .. #./ '.0 -.1 3.2 7.3 ;.4 ?.6 D.7 J.8 P.9 R.: Z.; `.< f.= j.> n.? r.@ v.A z.B {.C .G .H .I .J .K .M .N .O .P .R .S .U .V .X .Z .[ .\ .] .^ ._ .` .a .b .c .e .f .g .h .j /l /m /n /o /q /r !/s '/u -/v 3/w 9/y ?/z E/{ K/} T/~ W/ Z/ `/ f/ m/ p/ u/ {/ / / / / / / / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0 0 0 #0 )0 /0 50 ;0 A0 G0 M0 S0 Y0 _0 e0 k0 t0 z0 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 1 1 1 1 1 1 1 1 1 $1 @1 C1 H1 L1 P1 T1 X1 \1 `1 d1 h1 m1 p1 u1y1}11111111 1 1 111111111111111"1#1$1%1&1(1)1*1+2,2- 2. 2/21 23$24(25,2602852992:>2;C2<H2>K2?N2@R2AV2BZ2C]2Da2Ee2Fh2Gl2Hp2It2Kw2L}2N2P2U2X2Y2Z2\2]2^2_2`2a2c2i2n2p2q2r2t2u2v2w2x2z2{2|3}3~3 33333!3%3*3.32363;3?3C3G3L3P3T3X3]3a3e3i3n3r3v3z3333333333333333333333333333333344 444 4$4(4.444:4?4E4J4N4S4W4\4`4d4j4p4v4{44444444444444444444444444455 55555!5&5*5.52555;5>5 @5P5`5p55555555555 5!5"5#5$5%5'5(5*5+5-5.5/505253545567 696:6;6<6>$6?'6@-6B46C96E>6HB6JF6KJ6LN6MR6NV6OZ6Pa6Qh6Ro6Sv6T}6U6X6Y6Z6[6\6^6_6`6a6c6d6e6f6g6h6i6j6k6l6m6n6o6q6r6s6t6u6v6w6x6y6z6{6|x1P:\ring\pregenerated\x86_64-mont5-nasm.objyasm 1.3.0!GFp_bn_mul_mont_gather5-L$SEH_begin_GFp_bn_mul_mont_gather5L$mul_enterL$mul4x_enterL$mul_page_walkL$mul_page_walk_doneL$incL$mul_bodyL$1st_enterL$1stL$outerL$inner_enterL$innerL$subL$copyL$mul_epilogue+L$SEH_end_GFp_bn_mul_mont_gather5bn_mul4x_mont_gather5+L$SEH_begin_bn_mul4x_mont_gather5L$mulx4x_enterL$mul4x_prologueL$mul4xsp_altL$mul4xsp_doneL$mul4x_page_walk L$mul4x_page_walk_doneL$mul4x_bodymul4x_internalL$mul4x_epilogue)L$SEH_end_bn_mul4x_mont_gather5L$1st4xL$outer4xL$inner4xL$sqr4x_sub_entryGFp_bn_power5#L$SEH_begin_GFp_bn_power5L$powerx5_enterL$power5_prologueL$pwr_sp_altL$pwr_sp_doneL$pwr_page_walkL$pwr_page_walk_doneL$power5_body__bn_sqr8x_internal__bn_post4x_internalL$power5_epilogue!L$SEH_end_GFp_bn_power5GFp_bn_sqr8x_internalL$sqr4x_1stL$sqr4x_outerL$sqr4x_innerL$sqr4x_shift_n_add__bn_sqr8x_reductionL$8x_reduction_loopL$8x_reduceL$8x_no_tailL$8x_tailL$8x_tail_doneL$sqr4x_sub GFp_bn_from_montgomerybn_from_mont8x$L$SEH_begin_bn_from_mont8xL$from_prologueL$from_sp_altL$from_sp_doneL$from_page_walkL$from_page_walk_doneL$from_bodyL$mul_by_1L$from_mont_nox__bn_sqrx8x_reduction__bn_postx4x_internalL$from_mont_zeroL$from_epilogue"L$SEH_end_bn_from_mont8x bn_mulx4x_mont_gather5,L$SEH_begin_bn_mulx4x_mont_gather5L$mulx4x_prologueL$mulx4xsp_altL$mulx4xsp_doneL$mulx4x_page_walk!L$mulx4x_page_walk_doneL$mulx4x_bodymulx4x_internalL$mulx4x_epilogue*L$SEH_end_bn_mulx4x_mont_gather5L$mulx4x_1stL$mulx4x_outerL$mulx4x_innerL$sqrx4x_sub_entrybn_powerx5 L$SEH_begin_bn_powerx5L$powerx5_prologueL$pwrx_sp_altL$pwrx_sp_doneL$pwrx_page_walkL$pwrx_page_walk_doneL$powerx5_body__bn_sqrx8x_internalL$powerx5_epilogueL$SEH_end_bn_powerx5 GFp_bn_sqrx8x_internalL$sqr8x_zero_startL$sqrx8x_zeroL$sqrx8x_outer_loopL$sqrx8x_outer_breakL$sqrx8x_loopL$sqrx8x_breakL$sqrx4x_shift_n_add$L$sqrx4x_shift_n_add_break!L$sqrx8x_reduction_loopL$sqrx8x_reduceL$sqrx8x_no_tailL$sqrx8x_tailL$sqrx8x_tail_doneL$sqrx4x_subGFp_bn_scatter5L$scatter_epilogueL$scatterGFp_bn_gather5$L$SEH_begin_GFp_bn_gather5L$gather"L$SEH_end_GFp_bn_gather5mul_handlerL$common_seh_tailL$common_pop_regsL$body_40/  L$SEH_info_GFp_bn_mul_mont_gather5-  L$SEH_info_bn_mul4x_mont_gather5%  L$SEH_info_GFp_bn_power5&  L$SEH_info_bn_from_mont8x.  L$SEH_info_bn_mulx4x_mont_gather5&  L$SEH_info_GFp_bn_powerx5&  L$SEH_info_GFp_bn_gather5d h ` ` ?` C` n` r` ` ` ` ` ` ` ` ` ` ` a a a a (a ,a ;a ?a Ta Xa ga ka xa |a a a a a a a a a b #b 9b =b Ub Yb nb rb b b b b b b b b b b c! c! @c" Dc" Sc# Wc# hc$ lc$ }c% c% c& c& c' c' c( c( c) c) d* d* (d+ ,d+ Ad, Ed, \d- `d- |d. d. d/ d/ d0 d0 d1 d1 d2 d2 e3 e3 5e4 9e4 Le5 Pe5 ee6 ie6 ~e7 e7 e8 e8 e9 e9 e: e: e; e; f< f< f= $f= :f> >f> Qf? Uf? sf@ wf@ fA fA fB fB fC fC fD fD gE gE gF !gF >gG BgG UgH YgH kgI ogI gJ gJ gK gK gL gL gM gM gN hN #hO 'hO EhP IhP shQ whQ hR hR hS hS hT hT hU hU iV iV iW #iW :iX >iX WiY [iY iZ iZ i[ i[ i\ i\ i] i] i^ i^ j_ j_ %j` )j` Cja Gja \jb `jb vjc zjc jd jd je je jf jf jg jg kh kh +ki /ki Mkj Qkj kkk okk kl kl km km kn kn ko ko kp kp lq lq =TM``k {.1@- <-LT_iws "#@%02&&(&; 'IA'Xh'i}''@(($(@((l((`-,+:,I-^.y./m1 0@1 2222 22L$gather 47@5Pg5s6B6>6.pdataT0H `: xT .xdata.debug$S Result { let key_bits = match variant { Variant::AES_128 => BitLength::from_usize_bits(128), Variant::AES_256 => BitLength::from_usize_bits(256), }; if BitLength::from_usize_bytes(bytes.len())? != key_bits { return Err(error::Unspecified); } let mut key = AES_KEY { rd_key: [0u32; 4 * (MAX_ROUNDS + 1)], rounds: 0, }; match detect_implementation(cpu_features) { Implementation::HWAES => { extern "C" { fn GFp_aes_hw_set_encrypt_key( user_key: *const u8, bits: c::uint, key: &mut AES_KEY, ) -> ZeroMeansSuccess; } Result::from(unsafe { GFp_aes_hw_set_encrypt_key( bytes.as_ptr(), key_bits.as_usize_bits() as c::uint, &mut key, ) })?; } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86"))] Implementation::VPAES => { extern "C" { fn GFp_vpaes_set_encrypt_key( user_key: *const u8, bits: c::uint, key: &mut AES_KEY, ) -> ZeroMeansSuccess; } Result::from(unsafe { GFp_vpaes_set_encrypt_key( bytes.as_ptr(), key_bits.as_usize_bits() as c::uint, &mut key, ) })?; } #[cfg(not(target_arch = "aarch64"))] _ => { extern "C" { fn GFp_aes_nohw_set_encrypt_key( user_key: *const u8, bits: c::uint, key: &mut AES_KEY, ) -> ZeroMeansSuccess; } Result::from(unsafe { GFp_aes_nohw_set_encrypt_key( bytes.as_ptr(), key_bits.as_usize_bits() as c::uint, &mut key, ) })?; } }; Ok(Self { inner: key, cpu_features, }) } #[inline] pub fn encrypt_block(&self, mut a: Block) -> Block { let aliasing_const: *const Block = &a; let aliasing_mut: *mut Block = &mut a; match detect_implementation(self.cpu_features) { Implementation::HWAES => { extern "C" { fn GFp_aes_hw_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY); } unsafe { GFp_aes_hw_encrypt(aliasing_const, aliasing_mut, &self.inner); } } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86"))] Implementation::VPAES => { extern "C" { fn GFp_vpaes_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY); } unsafe { GFp_vpaes_encrypt(aliasing_const, aliasing_mut, &self.inner); } } #[cfg(not(target_arch = "aarch64"))] _ => { extern "C" { fn GFp_aes_nohw_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY); } unsafe { GFp_aes_nohw_encrypt(aliasing_const, aliasing_mut, &self.inner); } } } a } #[inline] pub fn encrypt_iv_xor_block(&self, iv: Iv, input: Block) -> Block { let mut output = self.encrypt_block(iv.into_block_less_safe()); output.bitxor_assign(input); output } #[inline] pub(super) fn ctr32_encrypt_blocks( &self, in_out: &mut [u8], direction: Direction, ctr: &mut Counter, ) { let output: *mut u8 = in_out.as_mut_ptr(); let in_prefix_len = match direction { Direction::Opening { in_prefix_len } => in_prefix_len, Direction::Sealing => 0, }; let input: *const u8 = in_out[in_prefix_len..].as_ptr(); let in_out_len = in_out.len().checked_sub(in_prefix_len).unwrap(); assert_eq!(in_out_len % BLOCK_LEN, 0); let blocks = in_out_len / BLOCK_LEN; let blocks_u32 = blocks as u32; assert_eq!(blocks, polyfill::usize_from_u32(blocks_u32)); match detect_implementation(self.cpu_features) { Implementation::HWAES => { extern "C" { fn GFp_aes_hw_ctr32_encrypt_blocks( input: *const u8, output: *mut u8, blocks: c::size_t, key: &AES_KEY, ivec: &Counter, ); } unsafe { GFp_aes_hw_ctr32_encrypt_blocks(input, output, blocks, &self.inner, ctr); } ctr.increment_by_less_safe(blocks_u32); } #[cfg(target_arch = "aarch64")] Implementation::VPAES => { extern "C" { fn GFp_vpaes_ctr32_encrypt_blocks( input: *const u8, output: *mut u8, blocks: c::size_t, key: &AES_KEY, ivec: &Counter, ); } unsafe { GFp_vpaes_ctr32_encrypt_blocks(input, output, blocks, &self.inner, ctr); } ctr.increment_by_less_safe(blocks_u32); } #[cfg(target_arch = "arm")] Implementation::BSAES => { extern "C" { fn GFp_bsaes_ctr32_encrypt_blocks( input: *const u8, output: *mut u8, blocks: c::size_t, key: &AES_KEY, ivec: &Counter, ); } unsafe { GFp_bsaes_ctr32_encrypt_blocks(input, output, blocks, &self.inner, ctr); } ctr.increment_by_less_safe(blocks_u32); } #[cfg(not(target_arch = "aarch64"))] _ => { shift::shift_full_blocks(in_out, in_prefix_len, |input| { self.encrypt_iv_xor_block(ctr.increment(), Block::from(input)) }); } } } pub fn new_mask(&self, sample: Block) -> [u8; 5] { let block = self.encrypt_block(sample); let mut out: [u8; 5] = [0; 5]; out.copy_from_slice(&block.as_ref()[..5]); out } #[cfg(target_arch = "x86_64")] #[must_use] pub fn is_aes_hw(&self) -> bool { match detect_implementation(self.cpu_features) { Implementation::HWAES => true, _ => false, } } #[cfg(target_arch = "x86_64")] #[must_use] pub(super) fn inner_less_safe(&self) -> &AES_KEY { &self.inner } } // Keep this in sync with AES_KEY in aes.h. #[repr(C)] pub(super) struct AES_KEY { pub rd_key: [u32; 4 * (MAX_ROUNDS + 1)], pub rounds: c::uint, } // Keep this in sync with `AES_MAXNR` in aes.h. const MAX_ROUNDS: usize = 14; pub enum Variant { AES_128, AES_256, } pub type Counter = nonce::Counter>; #[repr(C)] // Only so `Key` can be `#[repr(C)]` #[derive(Clone, Copy)] pub enum Implementation { HWAES = 1, #[cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86"))] VPAES = 2, #[cfg(target_arch = "arm")] BSAES = 3, #[cfg(not(target_arch = "aarch64"))] Fallback = 4, } fn detect_implementation(cpu_features: cpu::Features) -> Implementation { if cpu::intel::AES.available(cpu_features) || cpu::arm::AES.available(cpu_features) { return Implementation::HWAES; } #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] { if cpu::intel::SSSE3.available(cpu_features) { return Implementation::VPAES; } } #[cfg(target_arch = "arm")] { if cpu::arm::NEON.available(cpu_features) { return Implementation::BSAES; } } #[cfg(target_arch = "aarch64")] { Implementation::VPAES } #[cfg(not(target_arch = "aarch64"))] { Implementation::Fallback } } #[must_use] #[repr(transparent)] pub struct ZeroMeansSuccess(c::int); impl From for Result<(), error::Unspecified> { fn from(ZeroMeansSuccess(value): ZeroMeansSuccess) -> Self { if value == 0 { Ok(()) } else { Err(error::Unspecified) } } } #[cfg(test)] mod tests { use super::{super::BLOCK_LEN, *}; use crate::test; use core::convert::TryInto; #[test] pub fn test_aes() { test::run(test_file!("aes_tests.txt"), |section, test_case| { assert_eq!(section, ""); let key = consume_key(test_case, "Key"); let input = test_case.consume_bytes("Input"); let input: &[u8; BLOCK_LEN] = input.as_slice().try_into()?; let expected_output = test_case.consume_bytes("Output"); let block = Block::from(input); let output = key.encrypt_block(block); assert_eq!(output.as_ref(), &expected_output[..]); Ok(()) }) } fn consume_key(test_case: &mut test::TestCase, name: &str) -> Key { let key = test_case.consume_bytes(name); let variant = match key.len() { 16 => Variant::AES_128, 32 => Variant::AES_256, _ => unreachable!(), }; Key::new(&key[..], variant, cpu::features()).unwrap() } } ring-0.16.9/src/aead/aes_gcm.rs000064400000000000000000000217551353036607100143770ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ aes::{self, Counter}, gcm, shift, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN, }; use crate::{aead, cpu, endian::*, error, polyfill}; /// AES-128 in GCM mode with 128-bit tags and 96 bit nonces. pub static AES_128_GCM: aead::Algorithm = aead::Algorithm { key_len: 16, init: init_128, seal: aes_gcm_seal, open: aes_gcm_open, id: aead::AlgorithmID::AES_128_GCM, max_input_len: AES_GCM_MAX_INPUT_LEN, }; /// AES-256 in GCM mode with 128-bit tags and 96 bit nonces. pub static AES_256_GCM: aead::Algorithm = aead::Algorithm { key_len: 32, init: init_256, seal: aes_gcm_seal, open: aes_gcm_open, id: aead::AlgorithmID::AES_256_GCM, max_input_len: AES_GCM_MAX_INPUT_LEN, }; pub struct Key { gcm_key: gcm::Key, // First because it has a large alignment requirement. aes_key: aes::Key, } fn init_128(key: &[u8], cpu_features: cpu::Features) -> Result { init(key, aes::Variant::AES_128, cpu_features) } fn init_256(key: &[u8], cpu_features: cpu::Features) -> Result { init(key, aes::Variant::AES_256, cpu_features) } fn init( key: &[u8], variant: aes::Variant, cpu_features: cpu::Features, ) -> Result { let aes_key = aes::Key::new(key, variant, cpu_features)?; let gcm_key = gcm::Key::new(aes_key.encrypt_block(Block::zero()), cpu_features); Ok(aead::KeyInner::AesGcm(Key { aes_key, gcm_key })) } const CHUNK_BLOCKS: usize = 3 * 1024 / 16; fn aes_gcm_seal( key: &aead::KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag { aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features) } fn aes_gcm_open( key: &aead::KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_prefix_len: usize, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag { aead( key, nonce, aad, in_out, Direction::Opening { in_prefix_len }, cpu_features, ) } #[inline(always)] // Avoid branching on `direction`. fn aead( key: &aead::KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_out: &mut [u8], direction: Direction, cpu_features: cpu::Features, ) -> Tag { let Key { aes_key, gcm_key } = match key { aead::KeyInner::AesGcm(key) => key, _ => unreachable!(), }; let mut ctr = Counter::one(nonce); let tag_iv = ctr.increment(); let aad_len = aad.0.len(); let mut gcm_ctx = gcm::Context::new(gcm_key, aad, cpu_features); let in_prefix_len = match direction { Direction::Opening { in_prefix_len } => in_prefix_len, Direction::Sealing => 0, }; let total_in_out_len = in_out.len() - in_prefix_len; let in_out = integrated_aes_gcm( aes_key, &mut gcm_ctx, in_out, &mut ctr, direction, cpu_features, ); let in_out_len = in_out.len() - in_prefix_len; // Process any (remaining) whole blocks. let whole_len = in_out_len - (in_out_len % BLOCK_LEN); { let mut chunk_len = CHUNK_BLOCKS * BLOCK_LEN; let mut output = 0; let mut input = in_prefix_len; loop { if whole_len - output < chunk_len { chunk_len = whole_len - output; } if chunk_len == 0 { break; } if let Direction::Opening { .. } = direction { gcm_ctx.update_blocks(&in_out[input..][..chunk_len]); } aes_key.ctr32_encrypt_blocks( &mut in_out[output..][..(chunk_len + in_prefix_len)], direction, &mut ctr, ); if let Direction::Sealing = direction { gcm_ctx.update_blocks(&in_out[output..][..chunk_len]); } output += chunk_len; input += chunk_len; } } // Process any remaining partial block. let remainder = &mut in_out[whole_len..]; shift::shift_partial((in_prefix_len, remainder), |remainder| { let mut input = Block::zero(); input.partial_copy_from(remainder); if let Direction::Opening { .. } = direction { gcm_ctx.update_block(input); } let mut output = aes_key.encrypt_iv_xor_block(ctr.into(), input); if let Direction::Sealing = direction { polyfill::slice::fill(&mut output.as_mut()[remainder.len()..], 0); gcm_ctx.update_block(output); } output }); // Authenticate the final block containing the input lengths. let aad_bits = polyfill::u64_from_usize(aad_len) << 3; let ciphertext_bits = polyfill::u64_from_usize(total_in_out_len) << 3; gcm_ctx.update_block(Block::from_u64_be( BigEndian::from(aad_bits), BigEndian::from(ciphertext_bits), )); // Finalize the tag and return it. gcm_ctx.pre_finish(|pre_tag| { let block = tag_iv.into_block_less_safe(); let mut tag = aes_key.encrypt_block(block); tag.bitxor_assign(pre_tag); Tag(tag) }) } // Returns the data that wasn't processed. #[cfg(target_arch = "x86_64")] #[inline] // Optimize out the match on `direction`. fn integrated_aes_gcm<'a>( aes_key: &aes::Key, gcm_ctx: &mut gcm::Context, in_out: &'a mut [u8], ctr: &mut Counter, direction: Direction, cpu_features: cpu::Features, ) -> &'a mut [u8] { use crate::c; if !aes_key.is_aes_hw() || !gcm_ctx.is_avx2(cpu_features) { return in_out; } let processed = match direction { Direction::Opening { in_prefix_len } => { extern "C" { fn GFp_aesni_gcm_decrypt( input: *const u8, output: *mut u8, len: c::size_t, key: &aes::AES_KEY, ivec: &mut Counter, gcm: &mut gcm::Context, ) -> c::size_t; } unsafe { GFp_aesni_gcm_decrypt( in_out[in_prefix_len..].as_ptr(), in_out.as_mut_ptr(), in_out.len() - in_prefix_len, aes_key.inner_less_safe(), ctr, gcm_ctx, ) } } Direction::Sealing => { extern "C" { fn GFp_aesni_gcm_encrypt( input: *const u8, output: *mut u8, len: c::size_t, key: &aes::AES_KEY, ivec: &mut Counter, gcm: &mut gcm::Context, ) -> c::size_t; } unsafe { GFp_aesni_gcm_encrypt( in_out.as_ptr(), in_out.as_mut_ptr(), in_out.len(), aes_key.inner_less_safe(), ctr, gcm_ctx, ) } } }; &mut in_out[processed..] } #[cfg(not(target_arch = "x86_64"))] #[inline] fn integrated_aes_gcm<'a>( _: &aes::Key, _: &mut gcm::Context, in_out: &'a mut [u8], _: &mut Counter, _: Direction, _: cpu::Features, ) -> &'a mut [u8] { in_out // This doesn't process any of the input so it all remains. } const AES_GCM_MAX_INPUT_LEN: u64 = super::max_input_len(BLOCK_LEN, 2); #[cfg(test)] mod tests { #[test] fn max_input_len_test() { // [NIST SP800-38D] Section 5.2.1.1. Note that [RFC 5116 Section 5.1] and // [RFC 5116 Section 5.2] have an off-by-one error in `P_MAX`. // // [NIST SP800-38D]: // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // [RFC 5116 Section 5.1]: https://tools.ietf.org/html/rfc5116#section-5.1 // [RFC 5116 Section 5.2]: https://tools.ietf.org/html/rfc5116#section-5.2 const NIST_SP800_38D_MAX_BITS: u64 = (1u64 << 39) - 256; assert_eq!(NIST_SP800_38D_MAX_BITS, 549_755_813_632u64); assert_eq!( super::AES_128_GCM.max_input_len * 8, NIST_SP800_38D_MAX_BITS ); assert_eq!( super::AES_256_GCM.max_input_len * 8, NIST_SP800_38D_MAX_BITS ); } } ring-0.16.9/src/aead/aes_tests.txt000064400000000000000000000004251352331573000151530ustar0000000000000000Key = 000102030405060708090a0b0c0d0e0f Input = 00112233445566778899aabbccddeeff Output = 69c4e0d86a7b0430d8cdb78070b4c55a Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 00112233445566778899aabbccddeeff Output = 8ea2b7ca516745bfeafc49904b496089 ring-0.16.9/src/aead/block.rs000064400000000000000000000100751352416253600140670ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{endian::*, polyfill::convert::*}; /// An array of 16 bytes that can (in the x86_64 and AAarch64 ABIs, at least) /// be efficiently passed by value and returned by value (i.e. in registers), /// and which meets the alignment requirements of `u32` and `u64` (at least) /// for the target. #[repr(C)] #[derive(Copy, Clone)] pub struct Block { subblocks: [u64; 2], } pub const BLOCK_LEN: usize = 16; impl Block { #[inline] pub fn zero() -> Self { Self { subblocks: [0, 0] } } #[inline] pub fn from_u64_le(first: LittleEndian, second: LittleEndian) -> Self { Self { subblocks: [first.into_raw_value(), second.into_raw_value()], } } #[inline] pub fn from_u64_be(first: BigEndian, second: BigEndian) -> Self { Self { subblocks: [first.into_raw_value(), second.into_raw_value()], } } pub fn u64s_be_to_native(&mut self) -> [u64; 2] { [ u64::from_be(self.subblocks[0]), u64::from_be(self.subblocks[1]), ] } /// Replaces the first `a.len()` bytes of the block's value with `a`, /// leaving the rest of the block unchanged. Panics if `a` is larger /// than a block. #[inline] pub fn partial_copy_from(&mut self, a: &[u8]) { self.as_mut()[..a.len()].copy_from_slice(a); } #[inline] pub fn bitxor_assign(&mut self, a: Block) { for (r, a) in self.subblocks.iter_mut().zip(a.subblocks.iter()) { *r ^= *a; } } } impl From<&'_ [u8; BLOCK_LEN]> for Block { #[inline] fn from(bytes: &[u8; BLOCK_LEN]) -> Self { unsafe { core::mem::transmute_copy(bytes) } } } impl From_<&'_ [u8; 2 * BLOCK_LEN]> for [Block; 2] { #[inline] fn from_(bytes: &[u8; 2 * BLOCK_LEN]) -> Self { unsafe { core::mem::transmute_copy(bytes) } } } impl AsRef<[u8; BLOCK_LEN]> for Block { #[inline] fn as_ref(&self) -> &[u8; BLOCK_LEN] { unsafe { core::mem::transmute(self) } } } impl AsMut<[u8; BLOCK_LEN]> for Block { #[inline] fn as_mut(&mut self) -> &mut [u8; BLOCK_LEN] { unsafe { core::mem::transmute(self) } } } /// Like `AsMut`. impl<'a> From_<&'a mut [Block; 2]> for &'a mut [u8; 2 * BLOCK_LEN] { #[inline] fn from_(bytes: &'a mut [Block; 2]) -> &'a mut [u8; 2 * BLOCK_LEN] { unsafe { core::mem::transmute(bytes) } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_bitxor_assign() { const ONES: u64 = -1i64 as u64; const TEST_CASES: &[([u64; 2], [u64; 2], [u64; 2])] = &[ ([0, 0], [0, 0], [0, 0]), ([0, 0], [ONES, ONES], [ONES, ONES]), ([0, ONES], [ONES, 0], [ONES, ONES]), ([ONES, 0], [0, ONES], [ONES, ONES]), ([ONES, ONES], [ONES, ONES], [0, 0]), ]; for (expected_result, a, b) in TEST_CASES { let mut r = Block::from_u64_le(a[0].into(), a[1].into()); r.bitxor_assign(Block::from_u64_le(b[0].into(), b[1].into())); assert_eq!(*expected_result, r.subblocks); // XOR is symmetric. let mut r = Block::from_u64_le(b[0].into(), b[1].into()); r.bitxor_assign(Block::from_u64_le(a[0].into(), a[1].into())); assert_eq!(*expected_result, r.subblocks); } } } ring-0.16.9/src/aead/chacha.rs000064400000000000000000000173741353036607100142120ustar0000000000000000// Copyright 2016 Brian Smith. // Portions Copyright (c) 2016, Google Inc. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ nonce::{self, Iv}, Block, BLOCK_LEN, }; use crate::{c, endian::*, polyfill::convert::*}; #[repr(C)] pub struct Key([Block; KEY_BLOCKS]); impl Key { #[inline] pub fn from(value: &[u8; KEY_LEN]) -> Self { Self(<[Block; KEY_BLOCKS]>::from_(value)) } #[inline] // Optimize away match on `counter`. pub fn encrypt_in_place(&self, counter: Counter, in_out: &mut [u8]) { unsafe { self.encrypt( CounterOrIv::Counter(counter), in_out.as_ptr(), in_out.len(), in_out.as_mut_ptr(), ); } } #[inline] // Optimize away match on `iv` and length check. pub fn encrypt_iv_xor_blocks_in_place(&self, iv: Iv, in_out: &mut [u8; 2 * BLOCK_LEN]) { unsafe { self.encrypt( CounterOrIv::Iv(iv), in_out.as_ptr(), in_out.len(), in_out.as_mut_ptr(), ); } } #[inline] pub fn new_mask(&self, sample: Block) -> [u8; 5] { let mut out: [u8; 5] = [0; 5]; let iv = Iv::assume_unique_for_key(sample); unsafe { self.encrypt( CounterOrIv::Iv(iv), out.as_ptr(), out.len(), out.as_mut_ptr(), ); } out } pub fn encrypt_overlapping(&self, counter: Counter, in_out: &mut [u8], in_prefix_len: usize) { // XXX: The x86 and at least one branch of the ARM assembly language // code doesn't allow overlapping input and output unless they are // exactly overlapping. TODO: Figure out which branch of the ARM code // has this limitation and come up with a better solution. // // https://rt.openssl.org/Ticket/Display.html?id=4362 let len = in_out.len() - in_prefix_len; if cfg!(any(target_arch = "arm", target_arch = "x86")) && in_prefix_len != 0 { // TODO: replace with `in_out.copy_within(in_prefix_len.., 0)` // See https://github.com/rust-lang/rust/issues/54236. unsafe { core::ptr::copy(in_out[in_prefix_len..].as_ptr(), in_out.as_mut_ptr(), len); } self.encrypt_in_place(counter, &mut in_out[..len]); } else { unsafe { self.encrypt( CounterOrIv::Counter(counter), in_out[in_prefix_len..].as_ptr(), len, in_out.as_mut_ptr(), ); } } } #[inline] // Optimize away match on `counter.` unsafe fn encrypt( &self, counter: CounterOrIv, input: *const u8, in_out_len: usize, output: *mut u8, ) { let iv = match counter { CounterOrIv::Counter(counter) => counter.into(), CounterOrIv::Iv(iv) => { assert!(in_out_len <= 32); iv } }; /// XXX: Although this takes an `Iv`, this actually uses it like a /// `Counter`. extern "C" { fn GFp_ChaCha20_ctr32( out: *mut u8, in_: *const u8, in_len: c::size_t, key: &Key, first_iv: &Iv, ); } GFp_ChaCha20_ctr32(output, input, in_out_len, self, &iv); } } pub type Counter = nonce::Counter>; enum CounterOrIv { Counter(Counter), Iv(Iv), } const KEY_BLOCKS: usize = 2; pub const KEY_LEN: usize = KEY_BLOCKS * BLOCK_LEN; #[cfg(test)] mod tests { use super::*; use crate::test; use alloc::vec; use core::convert::TryInto; // This verifies the encryption functionality provided by ChaCha20_ctr32 // is successful when either computed on disjoint input/output buffers, // or on overlapping input/output buffers. On some branches of the 32-bit // x86 and ARM code the in-place operation fails in some situations where // the input/output buffers are not exactly overlapping. Such failures are // dependent not only on the degree of overlapping but also the length of // the data. `open()` works around that by moving the input data to the // output location so that the buffers exactly overlap, for those targets. // This test exists largely as a canary for detecting if/when that type of // problem spreads to other platforms. #[test] pub fn chacha20_tests() { test::run(test_file!("chacha_tests.txt"), |section, test_case| { assert_eq!(section, ""); let key = test_case.consume_bytes("Key"); let key: &[u8; KEY_LEN] = key.as_slice().try_into()?; let key = Key::from(key); let ctr = test_case.consume_usize("Ctr"); let nonce = test_case.consume_bytes("Nonce"); let input = test_case.consume_bytes("Input"); let output = test_case.consume_bytes("Output"); // Pre-allocate buffer for use in test_cases. let mut in_out_buf = vec![0u8; input.len() + 276]; // Run the test case over all prefixes of the input because the // behavior of ChaCha20 implementation changes dependent on the // length of the input. for len in 0..(input.len() + 1) { chacha20_test_case_inner( &key, &nonce, ctr as u32, &input[..len], &output[..len], len, &mut in_out_buf, ); } Ok(()) }); } fn chacha20_test_case_inner( key: &Key, nonce: &[u8], ctr: u32, input: &[u8], expected: &[u8], len: usize, in_out_buf: &mut [u8], ) { // Straightforward encryption into disjoint buffers is computed // correctly. unsafe { key.encrypt( CounterOrIv::Counter(Counter::from_test_vector(nonce, ctr)), input[..len].as_ptr(), len, in_out_buf.as_mut_ptr(), ); } assert_eq!(&in_out_buf[..len], expected); // Do not test offset buffers for x86 and ARM architectures (see above // for rationale). let max_offset = if cfg!(any(target_arch = "x86", target_arch = "arm")) { 0 } else { 259 }; // Check that in-place encryption works successfully when the pointers // to the input/output buffers are (partially) overlapping. for alignment in 0..16 { for offset in 0..(max_offset + 1) { in_out_buf[alignment + offset..][..len].copy_from_slice(input); let ctr = Counter::from_test_vector(nonce, ctr); key.encrypt_overlapping(ctr, &mut in_out_buf[alignment..], offset); assert_eq!(&in_out_buf[alignment..][..len], expected); } } } } ring-0.16.9/src/aead/chacha20_poly1305.rs000064400000000000000000000111551352416253600157220ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ chacha::{self, Counter}, nonce::Iv, poly1305, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN, }; use crate::{ aead, cpu, endian::*, error, polyfill::{self, convert::*}, }; use core::convert::TryInto; /// ChaCha20-Poly1305 as described in [RFC 7539]. /// /// The keys are 256 bits long and the nonces are 96 bits long. /// /// [RFC 7539]: https://tools.ietf.org/html/rfc7539 pub static CHACHA20_POLY1305: aead::Algorithm = aead::Algorithm { key_len: chacha::KEY_LEN, init: chacha20_poly1305_init, seal: chacha20_poly1305_seal, open: chacha20_poly1305_open, id: aead::AlgorithmID::CHACHA20_POLY1305, max_input_len: super::max_input_len(64, 1), }; /// Copies |key| into |ctx_buf|. fn chacha20_poly1305_init( key: &[u8], _todo: cpu::Features, ) -> Result { let key: &[u8; chacha::KEY_LEN] = key.try_into()?; Ok(aead::KeyInner::ChaCha20Poly1305(chacha::Key::from(key))) } fn chacha20_poly1305_seal( key: &aead::KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag { aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features) } fn chacha20_poly1305_open( key: &aead::KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_prefix_len: usize, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag { aead( key, nonce, aad, in_out, Direction::Opening { in_prefix_len }, cpu_features, ) } pub type Key = chacha::Key; #[inline(always)] // Statically eliminate branches on `direction`. fn aead( key: &aead::KeyInner, nonce: Nonce, Aad(aad): Aad<&[u8]>, in_out: &mut [u8], direction: Direction, _todo: cpu::Features, ) -> Tag { let chacha20_key = match key { aead::KeyInner::ChaCha20Poly1305(key) => key, _ => unreachable!(), }; let mut counter = Counter::zero(nonce); let mut ctx = { let key = derive_poly1305_key(chacha20_key, counter.increment()); poly1305::Context::from_key(key) }; poly1305_update_padded_16(&mut ctx, aad); let in_out_len = match direction { Direction::Opening { in_prefix_len } => { poly1305_update_padded_16(&mut ctx, &in_out[in_prefix_len..]); chacha20_key.encrypt_overlapping(counter, in_out, in_prefix_len); in_out.len() - in_prefix_len } Direction::Sealing => { chacha20_key.encrypt_in_place(counter, in_out); poly1305_update_padded_16(&mut ctx, in_out); in_out.len() } }; ctx.update_block( Block::from_u64_le( LittleEndian::from(polyfill::u64_from_usize(aad.len())), LittleEndian::from(polyfill::u64_from_usize(in_out_len)), ), poly1305::Pad::Pad, ); ctx.finish() } #[inline] fn poly1305_update_padded_16(ctx: &mut poly1305::Context, input: &[u8]) { let remainder_len = input.len() % BLOCK_LEN; let whole_len = input.len() - remainder_len; if whole_len > 0 { ctx.update_blocks(&input[..whole_len]); } if remainder_len > 0 { let mut block = Block::zero(); block.partial_copy_from(&input[whole_len..]); ctx.update_block(block, poly1305::Pad::Pad) } } // Also used by chacha20_poly1305_openssh. pub(super) fn derive_poly1305_key(chacha_key: &chacha::Key, iv: Iv) -> poly1305::Key { let mut blocks = [Block::zero(); poly1305::KEY_BLOCKS]; chacha_key.encrypt_iv_xor_blocks_in_place( iv, <&mut [u8; poly1305::KEY_BLOCKS * BLOCK_LEN]>::from_(&mut blocks), ); poly1305::Key::from(blocks) } #[cfg(test)] mod tests { #[test] fn max_input_len_test() { // Errata 4858 at https://www.rfc-editor.org/errata_search.php?rfc=7539. assert_eq!(super::CHACHA20_POLY1305.max_input_len, 274_877_906_880u64); } } ring-0.16.9/src/aead/chacha20_poly1305_openssh.rs000064400000000000000000000150231352416253600174570ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! The [chacha20-poly1305@openssh.com] AEAD-ish construct. //! //! This should only be used by SSH implementations. It has a similar, but //! different API from `ring::aead` because the construct cannot use the same //! API as `ring::aead` due to the way the construct handles the encrypted //! packet length. //! //! The concatenation of a and b is denoted `a||b`. `K_1` and `K_2` are defined //! in the [chacha20-poly1305@openssh.com] specification. `packet_length`, //! `padding_length`, `payload`, and `random padding` are defined in //! [RFC 4253]. The term `plaintext` is used as a shorthand for //! `padding_length||payload||random padding`. //! //! [chacha20-poly1305@openssh.com]: //! http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.chacha20poly1305?annotate=HEAD //! [RFC 4253]: https://tools.ietf.org/html/rfc4253 use super::{ chacha::{self, *}, chacha20_poly1305::derive_poly1305_key, poly1305, Nonce, Tag, }; use crate::{constant_time, endian::*, error}; use core::convert::TryInto; /// A key for sealing packets. pub struct SealingKey { key: Key, } impl SealingKey { /// Constructs a new `SealingKey`. pub fn new(key_material: &[u8; KEY_LEN]) -> SealingKey { SealingKey { key: Key::new(key_material), } } /// Seals (encrypts and signs) a packet. /// /// On input, `plaintext_in_ciphertext_out` must contain the unencrypted /// `packet_length||plaintext` where `plaintext` is the /// `padding_length||payload||random padding`. It will be overwritten by /// `encrypted_packet_length||ciphertext`, where `encrypted_packet_length` /// is encrypted with `K_1` and `ciphertext` is encrypted by `K_2`. pub fn seal_in_place( &self, sequence_number: u32, plaintext_in_ciphertext_out: &mut [u8], tag_out: &mut [u8; TAG_LEN], ) { let mut counter = make_counter(sequence_number); let poly_key = derive_poly1305_key(&self.key.k_2, counter.increment()); { let (len_in_out, data_and_padding_in_out) = plaintext_in_ciphertext_out.split_at_mut(PACKET_LENGTH_LEN); self.key .k_1 .encrypt_in_place(make_counter(sequence_number), len_in_out); self.key .k_2 .encrypt_in_place(counter, data_and_padding_in_out); } let Tag(tag) = poly1305::sign(poly_key, plaintext_in_ciphertext_out); tag_out.copy_from_slice(tag.as_ref()); } } /// A key for opening packets. pub struct OpeningKey { key: Key, } impl OpeningKey { /// Constructs a new `OpeningKey`. pub fn new(key_material: &[u8; KEY_LEN]) -> OpeningKey { OpeningKey { key: Key::new(key_material), } } /// Returns the decrypted, but unauthenticated, packet length. /// /// Importantly, the result won't be authenticated until `open_in_place` is /// called. pub fn decrypt_packet_length( &self, sequence_number: u32, encrypted_packet_length: [u8; PACKET_LENGTH_LEN], ) -> [u8; PACKET_LENGTH_LEN] { let mut packet_length = encrypted_packet_length; let counter = make_counter(sequence_number); self.key.k_1.encrypt_in_place(counter, &mut packet_length); packet_length } /// Opens (authenticates and decrypts) a packet. /// /// `ciphertext_in_plaintext_out` must be of the form /// `encrypted_packet_length||ciphertext` where `ciphertext` is the /// encrypted `plaintext`. When the function succeeds the ciphertext is /// replaced by the plaintext and the result is `Ok(plaintext)`, where /// `plaintext` is `&ciphertext_in_plaintext_out[PACKET_LENGTH_LEN..]`; /// otherwise the contents of `ciphertext_in_plaintext_out` are unspecified /// and must not be used. pub fn open_in_place<'a>( &self, sequence_number: u32, ciphertext_in_plaintext_out: &'a mut [u8], tag: &[u8; TAG_LEN], ) -> Result<&'a [u8], error::Unspecified> { let mut counter = make_counter(sequence_number); // We must verify the tag before decrypting so that // `ciphertext_in_plaintext_out` is unmodified if verification fails. // This is beyond what we guarantee. let poly_key = derive_poly1305_key(&self.key.k_2, counter.increment()); verify(poly_key, ciphertext_in_plaintext_out, tag)?; let plaintext_in_ciphertext_out = &mut ciphertext_in_plaintext_out[PACKET_LENGTH_LEN..]; self.key .k_2 .encrypt_in_place(counter, plaintext_in_ciphertext_out); Ok(plaintext_in_ciphertext_out) } } struct Key { k_1: chacha::Key, k_2: chacha::Key, } impl Key { pub fn new(key_material: &[u8; KEY_LEN]) -> Key { // The first half becomes K_2 and the second half becomes K_1. let (k_2, k_1) = key_material.split_at(chacha::KEY_LEN); Key { k_1: chacha::Key::from(k_1.try_into().unwrap()), k_2: chacha::Key::from(k_2.try_into().unwrap()), } } } fn make_counter(sequence_number: u32) -> Counter { let nonce = [ BigEndian::ZERO, BigEndian::ZERO, BigEndian::from(sequence_number), ]; Counter::zero(Nonce::try_assume_unique_for_key(as_bytes(&nonce)).unwrap()) } /// The length of key. pub const KEY_LEN: usize = chacha::KEY_LEN * 2; /// The length in bytes of the `packet_length` field in a SSH packet. pub const PACKET_LENGTH_LEN: usize = 4; // 32 bits /// The length in bytes of an authentication tag. pub const TAG_LEN: usize = super::BLOCK_LEN; fn verify(key: poly1305::Key, msg: &[u8], tag: &[u8; TAG_LEN]) -> Result<(), error::Unspecified> { let Tag(calculated_tag) = poly1305::sign(key, msg); constant_time::verify_slices_are_equal(calculated_tag.as_ref(), tag) } ring-0.16.9/src/aead/chacha_tests.txt000064400000000000000000000102041352416253600156130ustar0000000000000000Key = 98bef1469be7269837a45bfbc92a5a6ac762507cf96443bf33b96b1bd4c6f8f6 Ctr = 42 Nonce = 44e792d63335abb1582e9253 Input = 5828d530362c605529f8e18cae151526f23a73a0f312a3885f2b74233dc90523c654491e448814d9da3715dcb7e423b39d7e166835fc026dcc8ae5dd5fe4d2566f129c9c7d6a3848bddfd9ac1ba24dc543043cd799e1a7139c51c26df9cf073be4bf93a3a9b4c5f01ae48d5fc6c47c697ade1ac1c9cfc24e7a252c32e917ba68f1375d628446f5807f1a71f7be724bb81cfe3ebdae0d730d874a31c33d466fb3d76be3b870178e7a6a0ebfa8bc2bdbfa4fb62620ee63f06d26ac6a18376e5981d160e640d56d68ba8b654af9f1ae56248fe38ee77e6fcf92dfa9753ad62e1caff2d68b39add25dfbd7df05570df7f68f2d14b04e1a3c7704cd3c5c5852106fcf5c03c85f852b058260dacccdd688bfc010b36f545442bc4b77214dee8745064c6038d27e1d306c55f038801cde3dea683ef63e59cf0d08ae8c020bc1726ab46df3f7b3ef3ab106f2f4d6697b3ea216313179b633a9ca8aa8bef3e93828d1e13b4e2e4735a461141e422c4955eae3b3ce39d3b3ef4a4d7849bdf67c0a2cd326cbd96aad6393a72992dc1faf61828074b29c4a867350d8d1ffee1ae2dda261bd10c35f679f29e4d370e5673ad22000cc251596544585ed82883b9f3bc304d423b10ddcc8269d28b3254d52e533f3ed2cb81acfc352b42fc77996147d72277285ea6d41a022136d0683a4dd0f69d201cdc6b8645c2c79d1c7d331db2cffdad06931ad835fed6a97e40043b02e97ae005f5cb9e8398010ca0cfaf0b5cdaa271160d9218693919f2d1a8ede0bb5cb052430454d1175fde5a0a94e3a8c3b525a3718054a7a096ae6d5a9a671474c50e13e8a212b4f0ee3cb72c5283e5a33ec48922ea12457090f01853b34397ec79062e2dc5d0a2c5126953a9592a5398f0c830b9d38ab982ac401c40d7713cbcaf128315275272cf00486c8f33df29d8f5552403faa227fe7693bee4409deffb0693aae74e99d33ae8b6d6004ff533f88e9639bb16d2c22155a15d9e5cb03783cca598cc8c286ffd279d6c6ec5bbba0ae0120092e385dda5de0594ee58b848fb6e0569f21a1cfb20f2c93f8cf37c19f3298216552666ed3719855b9469f1a35c4476962704b779ee421e6325a2605ba5753d79b553cbb5379609cc84df7f51d540291680eaaca5a780c289ac3ac49c0f485ee59767e284ef15c63f7ce0e2c21a058e901fdebd1afe6ef93b3955160a2744015e5f40aca6d9a37424d5a58490fe902fc77d859deddad4b992e6473ad422ff32c0d49e42e6ca47375181485bb64b4a1b06e01c0cf179cc528c32d6c172a3d065cf3b44975ad1769d4ca65ae4471a5f60d0f8e37c743ce6b08e9d134488fc9fcf35d2dec62d3f0b3fe2e40557654c7b46116cc7c1c1924e64dd4c377671f3c7479a1f885881d6fa47e2c219f49f5aa4ef34afa9dbef6cedab5ab39bd1641a94aac0901ca Output = 54306a13da596b6d5949c8c5ab26d48aadc03daf14b915b8cadf17a703d3c50601ef21dda30b9e48b85e0b879f9523688569d25daf57e927113d49faf108cc15ec1d1916129bc8661ffa2c93f4991127310ed8464740117001cae85bc591c83adcaaf34b80e5bc03d08972bcce2a760cf5da4c10063541b1e6b4aa7aeff0624ac59f2cafb82fd9d1017a362f3e83a5eb8170a0571746ea9ecb0e74d344571d4006f8b7cb5ff479bd1119d6eef8b0aadd0062ad3b889a885b1b07c9ae9ea694e555db4523b92ccd29d354c3881e5f52f2090026261aedf5c2a97df9215aaf6dab8e168496b54fcf1ea3af089f7986c3be0c70cb8ff3c5f8e84b217d18a9ed8bfb6b5a6f260b56047cfe0e1ec13f82c573bd530cf0e2c9f33d1b6dba70c16db60028e1c4786204da2386c3da743d7cd67629b2272eb235426082cf302c59e4e3d0741f58e8da4745731c0593ae75be1f81d8b7b3fffc8b529eed8b379fe0b8a266e16ac51f1df0de3f3db028f3aa4e4d31b026792b080fe92f79b3c8dda789a8a81d590e4f1e931f707f4e7efeb8ca63e0a605ccd7de2a4931785c5f44b29b91991429630912dd02d97be9f51207d0e7e6e8dddaa473c48ebd7bb7bbcb832f43f61c50ae9b2e52801885a823527a6af74236ca915a3d2aa0357d70fc4c187c5772cf9b29d6d0b4d7e6897069225e45094d4987845f8a5fe415d3e372afb2309cc1ff8e6d2a769e08037ee0c3c297066b332b08e3d50bd832676110ed6bed50efd71c1be06da16419342fe4e854bf840edf0e8bd8dd7796b854abf295590d0d0a156e01f224aba0d8df38ea97587688beaf45e3564f68e84be72b22189682892534d1dd08ea7e21ef575543f7faca1cde992e8bd8c3cf894dfc3b7d4ac999c431b67aaef849b246c1600575f33df2c984a4b98a872a875c0abc517d9af5c9242d5ee6c6e3cd7ee4af8a6c0004c8d7a5adfab2084a269b7cd0c613b1b9653f7030f9989d879957713eb1c324f0a6a2609d66d25faee39487ead1ea0d2a77ef31ccebf90cdc9c1280bbb08eab9a04cd4b954f7a0b537c16cc0eb17310ddaa769490d98b664131ed8c7d74c433fac3438d10bc844d0e9532df17436dd25e12b9ed33d9976f4acdc3cd8134be7ea2d0a7915d90f65e4a250fcc24ebe1e4626c8f4536975dda202b86008c94a96a69b2e9bb828e4195b4b7f15552303948b32582a9102789b5e51fab723c7008cee661bf19c8902b29303eb84c33f0f0152eb725ca994b6f4b4150ee5699cf2ba4c47c5ca6d467045c5d5f269e0fe258684c30cdef46db376fbbc480ca8a545d719d0ce8b82c109044a4883fbc153cd2ca0ec3e46eefb0cbfd617c27f225ea716df7499c8127f06133cf5568d373a4ed35652af23ecf9098546d956a0c9c240eb4b79b8d6e1cbceb171086da916d894cebf5508f40cf4a ring-0.16.9/src/aead/gcm.rs000064400000000000000000000204251353036607100135400ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{Aad, Block, BLOCK_LEN}; use crate::{c, cpu}; #[repr(transparent)] pub struct Key(GCM128_KEY); impl Key { pub(super) fn new(mut h_be: Block, cpu_features: cpu::Features) -> Self { let h = h_be.u64s_be_to_native(); let mut key = Self(GCM128_KEY { Htable: [u128 { hi: 0, lo: 0 }; GCM128_HTABLE_LEN], }); match detect_implementation(cpu_features) { #[cfg(target_arch = "x86_64")] Implementation::CLMUL if has_avx_movbe(cpu_features) => { extern "C" { fn GFp_gcm_init_avx(key: &mut Key, h: &[u64; 2]); } unsafe { GFp_gcm_init_avx(&mut key, &h); } } Implementation::CLMUL => { extern "C" { fn GFp_gcm_init_clmul(key: &mut Key, h: &[u64; 2]); } unsafe { GFp_gcm_init_clmul(&mut key, &h); } } #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] Implementation::NEON => { extern "C" { fn GFp_gcm_init_neon(key: &mut Key, h: &[u64; 2]); } unsafe { GFp_gcm_init_neon(&mut key, &h); } } #[cfg(not(target_arch = "aarch64"))] Implementation::Fallback => { extern "C" { fn GFp_gcm_init_4bit(key: &mut Key, h: &[u64; 2]); } unsafe { GFp_gcm_init_4bit(&mut key, &h); } } } key } } #[repr(transparent)] pub struct Context { inner: GCM128_CONTEXT, cpu_features: cpu::Features, } impl Context { pub(crate) fn new(key: &Key, aad: Aad<&[u8]>, cpu_features: cpu::Features) -> Self { let mut ctx = Context { inner: GCM128_CONTEXT { Xi: Block::zero(), H_unused: Block::zero(), key: key.0.clone(), }, cpu_features, }; for ad in aad.0.chunks(BLOCK_LEN) { let mut block = Block::zero(); block.partial_copy_from(ad); ctx.update_block(block); } ctx } pub fn update_blocks(&mut self, input: &[u8]) { debug_assert!(input.len() > 0); debug_assert_eq!(input.len() % BLOCK_LEN, 0); let key_aliasing: *const GCM128_KEY = &self.inner.key; match detect_implementation(self.cpu_features) { #[cfg(target_arch = "x86_64")] Implementation::CLMUL if has_avx_movbe(self.cpu_features) => { extern "C" { fn GFp_gcm_ghash_avx( ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8, len: c::size_t, ); } unsafe { GFp_gcm_ghash_avx(self, key_aliasing, input.as_ptr(), input.len()); } } Implementation::CLMUL => { extern "C" { fn GFp_gcm_ghash_clmul( ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8, len: c::size_t, ); } unsafe { GFp_gcm_ghash_clmul(self, key_aliasing, input.as_ptr(), input.len()); } } #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] Implementation::NEON => { extern "C" { fn GFp_gcm_ghash_neon( ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8, len: c::size_t, ); } unsafe { GFp_gcm_ghash_neon(self, key_aliasing, input.as_ptr(), input.len()); } } #[cfg(not(target_arch = "aarch64"))] Implementation::Fallback => { extern "C" { fn GFp_gcm_ghash_4bit( ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8, len: c::size_t, ); } unsafe { GFp_gcm_ghash_4bit(self, key_aliasing, input.as_ptr(), input.len()); } } } } pub fn update_block(&mut self, a: Block) { self.inner.Xi.bitxor_assign(a); let key_aliasing: *const GCM128_KEY = &self.inner.key; match detect_implementation(self.cpu_features) { Implementation::CLMUL => { extern "C" { fn GFp_gcm_gmult_clmul(ctx: &mut Context, Htable: *const GCM128_KEY); } unsafe { GFp_gcm_gmult_clmul(self, key_aliasing); } } #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] Implementation::NEON => { extern "C" { fn GFp_gcm_gmult_neon(ctx: &mut Context, Htable: *const GCM128_KEY); } unsafe { GFp_gcm_gmult_neon(self, key_aliasing); } } #[cfg(not(target_arch = "aarch64"))] Implementation::Fallback => { extern "C" { fn GFp_gcm_gmult_4bit(ctx: &mut Context, Htable: *const GCM128_KEY); } unsafe { GFp_gcm_gmult_4bit(self, key_aliasing); } } } } pub(super) fn pre_finish(self, f: F) -> super::Tag where F: FnOnce(Block) -> super::Tag, { f(self.inner.Xi) } #[cfg(target_arch = "x86_64")] pub(super) fn is_avx2(&self, cpu_features: cpu::Features) -> bool { match detect_implementation(cpu_features) { Implementation::CLMUL => has_avx_movbe(self.cpu_features), _ => false, } } } // Keep in sync with `GCM128_KEY` in modes/internal.h. #[derive(Clone)] #[repr(C, align(16))] struct GCM128_KEY { Htable: [u128; GCM128_HTABLE_LEN], } #[derive(Clone, Copy)] #[repr(C)] struct u128 { hi: u64, lo: u64, } const GCM128_HTABLE_LEN: usize = 16; // Keep in sync with `GCM128_CONTEXT` in modes/internal.h. #[repr(C, align(16))] struct GCM128_CONTEXT { Xi: Block, H_unused: Block, key: GCM128_KEY, } enum Implementation { CLMUL, #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] NEON, #[cfg(not(target_arch = "aarch64"))] Fallback, } #[inline] fn detect_implementation(cpu: cpu::Features) -> Implementation { if (cpu::intel::FXSR.available(cpu) && cpu::intel::PCLMULQDQ.available(cpu)) || cpu::arm::PMULL.available(cpu) { return Implementation::CLMUL; } #[cfg(target_arch = "arm")] { if cpu::arm::NEON.available(cpu) { return Implementation::NEON; } } #[cfg(target_arch = "aarch64")] { return Implementation::NEON; } #[cfg(not(target_arch = "aarch64"))] Implementation::Fallback } #[cfg(target_arch = "x86_64")] fn has_avx_movbe(cpu_features: cpu::Features) -> bool { return cpu::intel::AVX.available(cpu_features) && cpu::intel::MOVBE.available(cpu_features); } ring-0.16.9/src/aead/nonce.rs000064400000000000000000000116541352416253600141030ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Encapsulates the progression from (key, nonce) -> counter -> IV, ensuring //! unique IVs for a given (key, nonce). Currently the caller is required to //! ensure that each nonce is unique and that counters don't overlap. //! //! To use: //! //! 1. Construct a `Nonce`. //! 2. Construct a `Counter` from the `Nonce`. //! 3. For each block encrypted, increment the counter. Each time the counter //! is incremented, the current value is returned. use super::Block; use crate::{endian::*, error}; use core::convert::TryInto; use core::marker::PhantomData; /// A nonce for a single AEAD opening or sealing operation. /// /// The user must ensure, for a particular key, that each nonce is unique. /// /// `Nonce` intentionally doesn't implement `Clone` to ensure that each one is /// consumed at most once. pub struct Nonce([u8; NONCE_LEN]); impl Nonce { /// Constructs a `Nonce` with the given value, assuming that the value is /// unique for the lifetime of the key it is being used with. /// /// Fails if `value` isn't `NONCE_LEN` bytes long. #[inline] pub fn try_assume_unique_for_key(value: &[u8]) -> Result { let value: &[u8; NONCE_LEN] = value.try_into()?; Ok(Self::assume_unique_for_key(*value)) } /// Constructs a `Nonce` with the given value, assuming that the value is /// unique for the lifetime of the key it is being used with. #[inline] pub fn assume_unique_for_key(value: [u8; NONCE_LEN]) -> Self { Self(value) } } impl AsRef<[u8; NONCE_LEN]> for Nonce { fn as_ref(&self) -> &[u8; NONCE_LEN] { &self.0 } } /// All the AEADs we support use 96-bit nonces. pub const NONCE_LEN: usize = 96 / 8; /// A generator of a monotonically increasing series of `Iv`s. /// /// Intentionally not `Clone` to ensure counters aren't forked. #[repr(C)] pub union Counter> where u32: From, { block: Block, u32s: [U32; 4], encoding: PhantomData, } impl> Counter where u32: From, { pub fn zero(nonce: Nonce) -> Self { Self::new(nonce, 0) } pub fn one(nonce: Nonce) -> Self { Self::new(nonce, 1) } // Used by `zero()` and by the tests. #[cfg(test)] pub fn from_test_vector(nonce: &[u8], initial_counter: u32) -> Self { Self::new( Nonce::try_assume_unique_for_key(nonce).unwrap(), initial_counter, ) } fn new(Nonce(nonce): Nonce, initial_counter: u32) -> Self { let mut r = Self { block: Block::zero(), }; let block = unsafe { &mut r.block }; block.as_mut()[U32::NONCE_BYTE_INDEX..][..NONCE_LEN].copy_from_slice(nonce.as_ref()); r.increment_by_less_safe(initial_counter); r } #[inline] pub fn increment(&mut self) -> Iv { let block = unsafe { &self.block }; let r = Iv(block.clone()); self.increment_by_less_safe(1); r } #[inline] pub fn increment_by_less_safe(&mut self, increment_by: u32) { let u32s = unsafe { &mut self.u32s }; let value = &mut u32s[U32::COUNTER_U32_INDEX]; *value = (u32::from(*value) + increment_by).into(); } } /// The IV for a single block encryption. /// /// Intentionally not `Clone` to ensure each is used only once. #[repr(C)] pub struct Iv(Block); impl> From> for Iv where u32: From, { fn from(counter: Counter) -> Self { Self(unsafe { counter.block }) } } impl Iv { #[inline] pub fn assume_unique_for_key(a: Block) -> Self { Self(a) } #[inline] pub fn into_block_less_safe(self) -> Block { self.0 } } pub trait Layout: Encoding where T: From, { const COUNTER_U32_INDEX: usize; const NONCE_BYTE_INDEX: usize; } impl Layout for BigEndian where BigEndian: Encoding, T: Copy + From, { const COUNTER_U32_INDEX: usize = 3; const NONCE_BYTE_INDEX: usize = 0; } impl Layout for LittleEndian where LittleEndian: Encoding, T: Copy + From, { const COUNTER_U32_INDEX: usize = 0; const NONCE_BYTE_INDEX: usize = 4; } ring-0.16.9/src/aead/poly1305.rs000064400000000000000000000145461353036607100142750ustar0000000000000000// Copyright 2015-2016 Brian Smith. // Portions Copyright (c) 2014, 2015, Google Inc. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // TODO: enforce maximum input length. use super::{ block::{Block, BLOCK_LEN}, Tag, }; use crate::{bssl, c, error}; /// A Poly1305 key. pub struct Key([Block; KEY_BLOCKS]); impl From<[Block; KEY_BLOCKS]> for Key { fn from(value: [Block; KEY_BLOCKS]) -> Self { Self(value) } } pub const KEY_BLOCKS: usize = 2; pub struct Context { opaque: Opaque, nonce: Nonce, func: Funcs, } /// The memory manipulated by the assembly. #[repr(C, align(8))] struct Opaque([u8; OPAQUE_LEN]); const OPAQUE_LEN: usize = 192; impl Context { #[inline] pub fn from_key(Key(key_and_nonce): Key) -> Self { extern "C" { fn GFp_poly1305_blocks( state: &mut Opaque, input: *const u8, len: c::size_t, should_pad: Pad, ); fn GFp_poly1305_emit(state: &mut Opaque, tag: &mut Tag, nonce: &Nonce); } let key = DerivedKey(key_and_nonce[0].clone()); let nonce = Nonce(key_and_nonce[1].clone()); let mut ctx = Self { opaque: Opaque([0u8; OPAQUE_LEN]), nonce, func: Funcs { blocks_fn: GFp_poly1305_blocks, emit_fn: GFp_poly1305_emit, }, }; // On some platforms `init()` doesn't initialize `funcs`. The // return value of `init()` indicates whether it did or not. Since // we already gave `func` a default value above, we can ignore the // return value assuming `init()` doesn't change `func` if it chose // not to initialize it. Note that this is different than what // BoringSSL does. let _ = init(&mut ctx.opaque, key, &mut ctx.func); ctx } pub fn update_block(&mut self, block: Block, pad: Pad) { self.func.blocks(&mut self.opaque, block.as_ref(), pad); } pub fn update_blocks(&mut self, input: &[u8]) { debug_assert_eq!(input.len() % BLOCK_LEN, 0); self.func.blocks(&mut self.opaque, input, Pad::Pad); } pub(super) fn finish(mut self) -> Tag { self.func.emit(&mut self.opaque, &self.nonce) } } #[cfg(test)] pub fn check_state_layout() { let required_state_size = if cfg!(target_arch = "x86") { // See comment above `_poly1305_init_sse2` in poly1305-x86.pl. Some(4 * (5 + 1 + 4 + 2 + 4 * 9)) } else if cfg!(target_arch = "x86_64") { // See comment above `__poly1305_block` in poly1305-x86_64.pl. Some(4 * (5 + 1 + 2 * 2 + 2 + 4 * 9)) } else { // TODO(davidben): Figure out the layout of the struct. For now, // `OPAQUE_LEN` is taken from OpenSSL. None }; if let Some(required_state_size) = required_state_size { assert!(core::mem::size_of::() >= required_state_size); } } #[repr(C)] struct DerivedKey(Block); /// This is *not* an "AEAD nonce"; it's a Poly1305-specific nonce. #[repr(C)] struct Nonce(Block); #[repr(C)] struct Funcs { blocks_fn: unsafe extern "C" fn(&mut Opaque, input: *const u8, input_len: c::size_t, should_pad: Pad), emit_fn: unsafe extern "C" fn(&mut Opaque, &mut Tag, nonce: &Nonce), } #[inline] fn init(state: &mut Opaque, key: DerivedKey, func: &mut Funcs) -> Result<(), error::Unspecified> { extern "C" { fn GFp_poly1305_init_asm( state: &mut Opaque, key: &DerivedKey, out_func: &mut Funcs, ) -> bssl::Result; } Result::from(unsafe { GFp_poly1305_init_asm(state, &key, func) }) } #[repr(u32)] pub enum Pad { AlreadyPadded = 0, Pad = 1, } impl Funcs { #[inline] fn blocks(&self, state: &mut Opaque, data: &[u8], should_pad: Pad) { unsafe { (self.blocks_fn)(state, data.as_ptr(), data.len(), should_pad); } } #[inline] fn emit(&self, state: &mut Opaque, nonce: &Nonce) -> Tag { let mut tag = Tag(Block::zero()); unsafe { (self.emit_fn)(state, &mut tag, nonce); } tag } } /// Implements the original, non-IETF padding semantics. /// /// This is used by chacha20_poly1305_openssh and the standalone /// poly1305 test vectors. pub(super) fn sign(key: Key, input: &[u8]) -> Tag { let mut ctx = Context::from_key(key); let remainder_len = input.len() % BLOCK_LEN; let full_blocks_len = input.len() - remainder_len; let (full_blocks, remainder) = input.split_at(full_blocks_len); ctx.update_blocks(full_blocks); if remainder_len > 0 { let mut bytes = [0; BLOCK_LEN]; bytes[..remainder_len].copy_from_slice(remainder); bytes[remainder_len] = 1; ctx.update_block(Block::from(&bytes), Pad::AlreadyPadded); } ctx.finish() } #[cfg(test)] mod tests { use super::*; use crate::{polyfill::convert::Into_, test}; use core::convert::TryInto; #[test] pub fn test_state_layout() { check_state_layout(); } // Adapted from BoringSSL's crypto/poly1305/poly1305_test.cc. #[test] pub fn test_poly1305() { test::run(test_file!("poly1305_test.txt"), |section, test_case| { assert_eq!(section, ""); let key = test_case.consume_bytes("Key"); let key: &[u8; BLOCK_LEN * 2] = key.as_slice().try_into().unwrap(); let key: [Block; 2] = key.into_(); let input = test_case.consume_bytes("Input"); let expected_mac = test_case.consume_bytes("MAC"); let key = Key::from(key); let Tag(actual_mac) = sign(key, &input); assert_eq!(expected_mac, actual_mac.as_ref()); Ok(()) }) } } ring-0.16.9/src/aead/poly1305_test.txt000064400000000000000000002243671352416253600155360ustar0000000000000000# Test Vectors from OpenSSL commit bbe9769ba66ab2512678a87b0d9b266ba970db05. Key = 2d773be37adb1e4d683bf0075e79c4ee037918535a7f99ccb7040fb5f5f43aea Input = 89dab80b7717c1db5db437860a3f70218e93e1b8f461fb677f16f35f6f87e2a91c99bc3a47ace47640cc95c345be5ecca5a3523c35cc01893af0b64a620334270372ec12482d1b1e363561698a578b359803495bb4e2ef1930b17a5190b580f141300df30adbeca28f6427a8bc1a999fd51c554a017d095d8c3e3127daf9f595 MAC = c85d15ed44c378d6b00e23064c7bcd51 Key = 99e5822dd4173c995e3dae0ddefb97743fde3b080134b39f76e9bf8d0e88d546 Input = 000000000000000b170303020000000006db1f1f368d696a810a349c0c714c9a5e7850c2407d721acded95e018d7a85266a6e1289cdb4aeb18da5ac8a2b0026d24a59ad485227f3eaedbb2e7e35e1c66cd60f9abf716dcc9ac42682dd7dab287a7024c4eefc321cc0574e16793e37cec03c5bda42b54c114a80b57af26416c7be742005e20855c73e21dc8e2edc9d435cb6f6059280011c270b71570051c1c9b3052126620bc1e2730fa066c7a509d53c60e5ae1b40aa6e39e49669228c90eecb4a50db32a50bc49e90b4f4b359a1dfd11749cd3867fcf2fb7bb6cd4738f6a4ad6f7ca5058f7618845af9f020f6c3b967b8f4cd4a91e2813b507ae66f2d35c18284f7292186062e10fd5510d18775351ef334e7634ab4743f5b68f49adcab384d3fd75f7390f4006ef2a295c8c7a076ad54546cd25d2107fbe1436c840924aaebe5b370893cd63d1325b8616fc4810886bc152c53221b6df373119393255ee72bcaa880174f1717f9184fa91646f17a24ac55d16bfddca9581a92eda479201f0edbf633600d6066d1ab36d5d2415d71351bbcd608a25108d25641992c1f26c531cf9f90203bc4cc19f5927d834b0a47116d3884bbb164b8ec883d1ac832e56b3918a98601a08d171881541d594db399c6ae6151221745aec814c45b0b05b565436fd6f137aa10a0c0b643761dbd6f9a9dcb99b1a6e690854ce0769cde39761d82fcdec15f0d92d7d8e94ade8eb83fbe0 MAC = 2637408fe13086ea73f971e3425e2820 # RFC 7539, section 2.5.2. Key = 85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b Input = "Cryptographic Forum Research Group" MAC = a8061dc1305136c6c22b8baf0c0127a9 # RFC 7539, section A.3. Key = 0000000000000000000000000000000000000000000000000000000000000000 Input = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 MAC = 00000000000000000000000000000000 Key = 0000000000000000000000000000000036e5f6b5c5e06070f0efca96227a863e Input = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f MAC = 36e5f6b5c5e06070f0efca96227a863e Key = 36e5f6b5c5e06070f0efca96227a863e00000000000000000000000000000000 Input = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f MAC = f3477e7cd95417af89a6b8794c310cf0 Key = 1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0 Input = 2754776173206272696c6c69672c20616e642074686520736c6974687920746f7665730a446964206779726520616e642067696d626c6520696e2074686520776162653a0a416c6c206d696d737920776572652074686520626f726f676f7665732c0a416e6420746865206d6f6d65207261746873206f757467726162652e MAC = 4541669a7eaaee61e708dc7cbcc5eb62 Key = 0200000000000000000000000000000000000000000000000000000000000000 Input = ffffffffffffffffffffffffffffffff MAC = 03000000000000000000000000000000 Key = 02000000000000000000000000000000ffffffffffffffffffffffffffffffff Input = 02000000000000000000000000000000 MAC = 03000000000000000000000000000000 Key = 0100000000000000000000000000000000000000000000000000000000000000 Input = fffffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffff11000000000000000000000000000000 MAC = 05000000000000000000000000000000 Key = 0100000000000000000000000000000000000000000000000000000000000000 Input = fffffffffffffffffffffffffffffffffbfefefefefefefefefefefefefefefe01010101010101010101010101010101 MAC = 00000000000000000000000000000000 Key = 0200000000000000000000000000000000000000000000000000000000000000 Input = fdffffffffffffffffffffffffffffff MAC = faffffffffffffffffffffffffffffff Key = 0100000000000000040000000000000000000000000000000000000000000000 Input = e33594d7505e43b900000000000000003394d7505e4379cd01000000000000000000000000000000000000000000000001000000000000000000000000000000 MAC = 14000000000000005500000000000000 Key = 0100000000000000040000000000000000000000000000000000000000000000 Input = e33594d7505e43b900000000000000003394d7505e4379cd010000000000000000000000000000000000000000000000 MAC = 13000000000000000000000000000000 # Additional test vectors that are long enough to ensure OpenSSL's SIMD # assembly is fully tested. # Length 2048. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfed MAC = 69d28f73dd09d39a92aa179da354b7ea # Length 2049. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc8 MAC = d6a26654b88572e875d9661c83471c1b # Length 2050. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852 MAC = 9fbbb7f7adcd0cd5b46a4a520b22499a # Length 2051. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f5 MAC = eb7cdceb97ade2a07622f8f5a4b1ce15 # Length 2052. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f590 MAC = d41c310927cd92e14784ea78b85503db # Length 2053. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073 MAC = 16af133c423f783a14c49d9f526384cf # Length 2054. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4 MAC = 00c75db8f0636b22f195645b03091f5f # Length 2055. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f434 MAC = 4a532bc740f581555831345f3b75bf33 # Length 2056. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a MAC = 698c7d32c5923871d124a2479e521706 # Length 2057. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c MAC = a677187dbf3c927aeeafb9ebce0f61dc # Length 2058. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a MAC = 201fed7eee981b31d2cc42ff6c38141a # Length 2059. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28 MAC = 0c3d3d01a37f347c4f7c5826bcafb3e1 # Length 2060. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c9 MAC = 33a4e0e0bed7c84c5cc5dd4784410f07 # Length 2061. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e MAC = 8e41c40a2f8ec58fe594f3a3a2de4ae1 # Length 2062. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21 MAC = c6e5d1810fd878ac6b844c66cef36a22 # Length 2063. Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21df MAC = f6eaae369c3cb5c05748e8d919178e00 # Regression test for https://rt.openssl.org/Ticket/Display.html?id=4439 Key = 2d773be37adb1e4d683bf0075e79c4ee037918535a7f99ccb7040fb5f5f43aea Input = 89dab80b7717c1db5db437860a3f70218e93e1b8f461fb677f16f35f6f87e2a91c99bc3a47ace47640cc95c345be5ecca5a3523c35cc01893af0b64a620334270372ec12482d1b1e363561698a578b359803495bb4e2ef1930b17a5190b580f141300df30adbeca28f6427a8bc1a999fd51c554a017d095d8c3e3127daf9f595 MAC = c85d15ed44c378d6b00e23064c7bcd51 # Regression tests for https://rt.openssl.org/Ticket/Display.html?id=4483 Key = 7f1b02640000000000000000000000000000000000000000cccccccccccccccc Input = cccccccccccccccccccccccccccccccccccccccccccccccccc80ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccceccccccccccccccccccccccccccccccccccccc5cccccccccccccccccccccccccccccccccccccccccce3ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaccccccccccccccccccccce6cccccccccc000000afccccccccccccccccccfffffff5000000000000000000000000000000000000000000000000000000ffffffe70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719205a8521dfc MAC = 8559b876eceed66eb37798c0457baff9 Key = e00016000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaa Input = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000800264 MAC = 00bd1258978e205444c9aaaa82006fed Key = 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c Input = 02fc MAC = 06120c0c0c0c0c0c0c0c0c0c0c0c0c0c Key = 00ff000000000000000000000000000000000000001e00000000000000007b7b Input = 7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b007b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff0009000000000000000000000000100000000009000000640000000000000000000000001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff00090000000000000000007a000010000000000900000064000000000000000000000000000000000000000000000000fc MAC = 33205bbf9e9f8f7212ab9e2ab9b7e4a5 ring-0.16.9/src/aead/quic.rs000064400000000000000000000116221353036607100137320ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! QUIC Header Protection. //! //! See draft-ietf-quic-tls. use crate::{ aead::{aes, block::Block, chacha}, cpu, error, hkdf, }; use core::convert::{TryFrom, TryInto}; /// A key for generating QUIC Header Protection masks. pub struct HeaderProtectionKey { inner: KeyInner, algorithm: &'static Algorithm, } #[allow(variant_size_differences)] enum KeyInner { Aes(aes::Key), ChaCha20(chacha::Key), } impl From> for HeaderProtectionKey { fn from(okm: hkdf::Okm<&'static Algorithm>) -> Self { let mut key_bytes = [0; super::MAX_KEY_LEN]; let algorithm = *okm.len(); let key_bytes = &mut key_bytes[..algorithm.key_len()]; okm.fill(key_bytes).unwrap(); Self::new(algorithm, key_bytes).unwrap() } } impl HeaderProtectionKey { /// Create a new header protection key. /// /// `key_bytes` must be exactly `algorithm.key_len` bytes long. pub fn new( algorithm: &'static Algorithm, key_bytes: &[u8], ) -> Result { Ok(Self { inner: (algorithm.init)(key_bytes, cpu::features())?, algorithm, }) } /// Generate a new QUIC Header Protection mask. /// /// `sample` must be exactly `self.algorithm().sample_len()` bytes long. pub fn new_mask(&self, sample: &[u8]) -> Result<[u8; 5], error::Unspecified> { let sample = <&[u8; SAMPLE_LEN]>::try_from(sample)?; let sample = Block::from(sample); let out = (self.algorithm.new_mask)(&self.inner, sample); Ok(out) } /// The key's algorithm. #[inline(always)] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } } const SAMPLE_LEN: usize = super::TAG_LEN; /// A QUIC Header Protection Algorithm. pub struct Algorithm { init: fn(key: &[u8], cpu_features: cpu::Features) -> Result, new_mask: fn(key: &KeyInner, sample: Block) -> [u8; 5], key_len: usize, id: AlgorithmID, } impl hkdf::KeyType for &'static Algorithm { #[inline] fn len(&self) -> usize { self.key_len() } } impl Algorithm { /// The length of the key. #[inline(always)] pub fn key_len(&self) -> usize { self.key_len } /// The required sample length. #[inline(always)] pub fn sample_len(&self) -> usize { SAMPLE_LEN } } derive_debug_via_id!(Algorithm); #[derive(Debug, Eq, PartialEq)] enum AlgorithmID { AES_128, AES_256, CHACHA20, } impl PartialEq for Algorithm { fn eq(&self, other: &Self) -> bool { self.id == other.id } } impl Eq for Algorithm {} /// AES-128. pub static AES_128: Algorithm = Algorithm { key_len: 16, init: aes_init_128, new_mask: aes_new_mask, id: AlgorithmID::AES_128, }; /// AES-256. pub static AES_256: Algorithm = Algorithm { key_len: 32, init: aes_init_256, new_mask: aes_new_mask, id: AlgorithmID::AES_256, }; fn aes_init_128(key: &[u8], cpu_features: cpu::Features) -> Result { let aes_key = aes::Key::new(key, aes::Variant::AES_128, cpu_features)?; Ok(KeyInner::Aes(aes_key)) } fn aes_init_256(key: &[u8], cpu_features: cpu::Features) -> Result { let aes_key = aes::Key::new(key, aes::Variant::AES_256, cpu_features)?; Ok(KeyInner::Aes(aes_key)) } fn aes_new_mask(key: &KeyInner, sample: Block) -> [u8; 5] { let aes_key = match key { KeyInner::Aes(key) => key, _ => unreachable!(), }; aes_key.new_mask(sample) } /// ChaCha20. pub static CHACHA20: Algorithm = Algorithm { key_len: chacha::KEY_LEN, init: chacha20_init, new_mask: chacha20_new_mask, id: AlgorithmID::CHACHA20, }; fn chacha20_init(key: &[u8], _todo: cpu::Features) -> Result { let chacha20_key: &[u8; chacha::KEY_LEN] = key.try_into()?; Ok(KeyInner::ChaCha20(chacha::Key::from(chacha20_key))) } fn chacha20_new_mask(key: &KeyInner, sample: Block) -> [u8; 5] { let chacha20_key = match key { KeyInner::ChaCha20(key) => key, _ => unreachable!(), }; chacha20_key.new_mask(sample) } ring-0.16.9/src/aead/shift.rs000064400000000000000000000036021352416253600141100ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::block::{Block, BLOCK_LEN}; #[cfg(not(target_arch = "aarch64"))] pub fn shift_full_blocks(in_out: &mut [u8], in_prefix_len: usize, mut transform: F) where F: FnMut(&[u8; BLOCK_LEN]) -> Block, { use core::convert::TryFrom; let in_out_len = in_out.len().checked_sub(in_prefix_len).unwrap(); for i in (0..in_out_len).step_by(BLOCK_LEN) { let block = { let input = <&[u8; BLOCK_LEN]>::try_from(&in_out[(in_prefix_len + i)..][..BLOCK_LEN]).unwrap(); transform(input) }; let output = <&mut [u8; BLOCK_LEN]>::try_from(&mut in_out[i..][..BLOCK_LEN]).unwrap(); *output = *block.as_ref(); } } pub fn shift_partial((in_prefix_len, in_out): (usize, &mut [u8]), transform: F) where F: FnOnce(&[u8]) -> Block, { let (block, in_out_len) = { let input = &in_out[in_prefix_len..]; let in_out_len = input.len(); if in_out_len == 0 { return; } debug_assert!(in_out_len < BLOCK_LEN); (transform(input), in_out_len) }; in_out[..in_out_len].copy_from_slice(&block.as_ref()[..in_out_len]); } ring-0.16.9/src/aead.rs000064400000000000000000000474211353224230700127740ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Authenticated Encryption with Associated Data (AEAD). //! //! See [Authenticated encryption: relations among notions and analysis of the //! generic composition paradigm][AEAD] for an introduction to the concept of //! AEADs. //! //! [AEAD]: http://www-cse.ucsd.edu/~mihir/papers/oem.html //! [`crypto.cipher.AEAD`]: https://golang.org/pkg/crypto/cipher/#AEAD use self::block::{Block, BLOCK_LEN}; use crate::{constant_time, cpu, error, hkdf, polyfill}; use core::ops::RangeFrom; pub use self::{ aes_gcm::{AES_128_GCM, AES_256_GCM}, chacha20_poly1305::CHACHA20_POLY1305, nonce::{Nonce, NONCE_LEN}, }; /// A sequences of unique nonces. /// /// A given `NonceSequence` must never return the same `Nonce` twice from /// `advance()`. /// /// A simple counter is a reasonable (but probably not ideal) `NonceSequence`. /// /// Intentionally not `Clone` or `Copy` since cloning would allow duplication /// of the sequence. pub trait NonceSequence { /// Returns the next nonce in the sequence. /// /// This may fail if "too many" nonces have been requested, where how many /// is too many is up to the implementation of `NonceSequence`. An /// implementation may that enforce a maximum number of records are /// sent/received under a key this way. Once `advance()` fails, it must /// fail for all subsequent calls. fn advance(&mut self) -> Result; } /// An AEAD key bound to a nonce sequence. pub trait BoundKey: core::fmt::Debug { /// Constructs a new key from the given `UnboundKey` and `NonceSequence`. fn new(key: UnboundKey, nonce_sequence: N) -> Self; /// The key's AEAD algorithm. #[inline] fn algorithm(&self) -> &'static Algorithm; } /// An AEAD key for authenticating and decrypting ("opening"), bound to a nonce /// sequence. /// /// Intentionally not `Clone` or `Copy` since cloning would allow duplication /// of the nonce sequence. pub struct OpeningKey { key: UnboundKey, nonce_sequence: N, } impl BoundKey for OpeningKey { fn new(key: UnboundKey, nonce_sequence: N) -> Self { Self { key, nonce_sequence, } } #[inline] fn algorithm(&self) -> &'static Algorithm { self.key.algorithm } } impl core::fmt::Debug for OpeningKey { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("OpeningKey") .field("algorithm", &self.algorithm()) .finish() } } impl OpeningKey { /// Authenticates and decrypts (“opens”) data in place. /// /// `aad` is the additional authenticated data (AAD), if any. /// /// On input, `in_out` must be the ciphertext followed by the tag. When /// `open_in_place()` returns `Ok(plaintext)`, the input ciphertext /// has been overwritten by the plaintext; `plaintext` will refer to the /// plaintext without the tag. /// /// When `open_in_place()` returns `Err(..)`, `in_out` may have been /// overwritten in an unspecified way. #[inline] pub fn open_in_place<'in_out, A>( &mut self, aad: Aad, in_out: &'in_out mut [u8], ) -> Result<&'in_out mut [u8], error::Unspecified> where A: AsRef<[u8]>, { self.open_within(aad, in_out, 0..) } /// Authenticates and decrypts (“opens”) data in place, with a shift. /// /// `aad` is the additional authenticated data (AAD), if any. /// /// On input, `in_out[ciphertext_and_tag]` must be the ciphertext followed /// by the tag. When `open_within()` returns `Ok(plaintext)`, the plaintext /// will be at `in_out[0..plaintext.len()]`. In other words, the following /// two code fragments are equivalent for valid values of /// `ciphertext_and_tag`, except `open_within` will often be more efficient: /// /// /// ```skip /// let plaintext = key.open_within(aad, in_out, cipertext_and_tag)?; /// ``` /// /// ```skip /// let ciphertext_and_tag_len = in_out[ciphertext_and_tag].len(); /// in_out.copy_within(ciphertext_and_tag, 0); /// let plaintext = key.open_in_place(aad, &mut in_out[..ciphertext_and_tag_len])?; /// ``` /// /// Similarly, `key.open_within(aad, in_out, 0..)` is equivalent to /// `key.open_in_place(aad, in_out)`. /// /// When `open_in_place()` returns `Err(..)`, `in_out` may have been /// overwritten in an unspecified way. /// /// The shifting feature is useful in the case where multiple packets are /// being reassembled in place. Consider this example where the peer has /// sent the message “Split stream reassembled in place” split into /// three sealed packets: /// /// ```ascii-art /// Packet 1 Packet 2 Packet 3 /// Input: [Header][Ciphertext][Tag][Header][Ciphertext][Tag][Header][Ciphertext][Tag] /// | +--------------+ | /// +------+ +-----+ +----------------------------------+ /// v v v /// Output: [Plaintext][Plaintext][Plaintext] /// “Split stream reassembled in place” /// ``` /// /// This reassembly be accomplished with three calls to `open_within()`. #[inline] pub fn open_within<'in_out, A>( &mut self, aad: Aad, in_out: &'in_out mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'in_out mut [u8], error::Unspecified> where A: AsRef<[u8]>, { open_within_( &self.key, self.nonce_sequence.advance()?, aad, in_out, ciphertext_and_tag, ) } } #[inline] fn open_within_<'in_out, A: AsRef<[u8]>>( key: &UnboundKey, nonce: Nonce, Aad(aad): Aad, in_out: &'in_out mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'in_out mut [u8], error::Unspecified> { fn open_within<'in_out>( key: &UnboundKey, nonce: Nonce, aad: Aad<&[u8]>, in_out: &'in_out mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'in_out mut [u8], error::Unspecified> { let in_prefix_len = ciphertext_and_tag.start; let ciphertext_and_tag_len = in_out .len() .checked_sub(in_prefix_len) .ok_or(error::Unspecified)?; let ciphertext_len = ciphertext_and_tag_len .checked_sub(TAG_LEN) .ok_or(error::Unspecified)?; check_per_nonce_max_bytes(key.algorithm, ciphertext_len)?; let (in_out, received_tag) = in_out.split_at_mut(in_prefix_len + ciphertext_len); let Tag(calculated_tag) = (key.algorithm.open)( &key.inner, nonce, aad, in_prefix_len, in_out, key.cpu_features, ); if constant_time::verify_slices_are_equal(calculated_tag.as_ref(), received_tag).is_err() { // Zero out the plaintext so that it isn't accidentally leaked or used // after verification fails. It would be safest if we could check the // tag before decrypting, but some `open` implementations interleave // authentication with decryption for performance. for b in &mut in_out[..ciphertext_len] { *b = 0; } return Err(error::Unspecified); } // `ciphertext_len` is also the plaintext length. Ok(&mut in_out[..ciphertext_len]) } open_within( key, nonce, Aad::from(aad.as_ref()), in_out, ciphertext_and_tag, ) } /// An AEAD key for encrypting and signing ("sealing"), bound to a nonce /// sequence. /// /// Intentionally not `Clone` or `Copy` since cloning would allow duplication /// of the nonce sequence. pub struct SealingKey { key: UnboundKey, nonce_sequence: N, } impl BoundKey for SealingKey { fn new(key: UnboundKey, nonce_sequence: N) -> Self { Self { key, nonce_sequence, } } #[inline] fn algorithm(&self) -> &'static Algorithm { self.key.algorithm } } impl core::fmt::Debug for SealingKey { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("SealingKey") .field("algorithm", &self.algorithm()) .finish() } } impl SealingKey { /// Deprecated. Renamed to [`seal_in_place_append_tag()`]. #[deprecated(note = "Renamed to `seal_in_place_append_tag`.")] #[inline] pub fn seal_in_place( &mut self, aad: Aad, in_out: &mut InOut, ) -> Result<(), error::Unspecified> where A: AsRef<[u8]>, InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, { self.seal_in_place_append_tag(aad, in_out) } /// Encrypts and signs (“seals”) data in place, appending the tag to the /// resulting ciphertext. /// /// `key.seal_in_place_append_tag(aad, in_out)` is equivalent to: /// /// ```skip /// key.seal_in_place_separate_tag(aad, in_out.as_mut()) /// .map(|tag| in_out.extend(tag.as_ref())) /// ``` #[inline] pub fn seal_in_place_append_tag( &mut self, aad: Aad, in_out: &mut InOut, ) -> Result<(), error::Unspecified> where A: AsRef<[u8]>, InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, { self.seal_in_place_separate_tag(aad, in_out.as_mut()) .map(|tag| in_out.extend(tag.as_ref())) } /// Encrypts and signs (“seals”) data in place. /// /// `aad` is the additional authenticated data (AAD), if any. This is /// authenticated but not encrypted. The type `A` could be a byte slice /// `&[u8]`, a byte array `[u8; N]` for some constant `N`, `Vec`, etc. /// If there is no AAD then use `Aad::empty()`. /// /// The plaintext is given as the input value of `in_out`. `seal_in_place()` /// will overwrite the plaintext with the ciphertext and return the tag. /// For most protocols, the caller must append the tag to the ciphertext. /// The tag will be `self.algorithm.tag_len()` bytes long. #[inline] pub fn seal_in_place_separate_tag( &mut self, aad: Aad, in_out: &mut [u8], ) -> Result where A: AsRef<[u8]>, { seal_in_place_separate_tag_( &self.key, self.nonce_sequence.advance()?, Aad::from(aad.as_ref()), in_out, ) } } #[inline] fn seal_in_place_separate_tag_( key: &UnboundKey, nonce: Nonce, aad: Aad<&[u8]>, in_out: &mut [u8], ) -> Result { check_per_nonce_max_bytes(key.algorithm, in_out.len())?; Ok((key.algorithm.seal)( &key.inner, nonce, aad, in_out, key.cpu_features, )) } /// The additionally authenticated data (AAD) for an opening or sealing /// operation. This data is authenticated but is **not** encrypted. /// /// The type `A` could be a byte slice `&[u8]`, a byte array `[u8; N]` /// for some constant `N`, `Vec`, etc. pub struct Aad>(A); impl> Aad { /// Construct the `Aad` from the given bytes. #[inline] pub fn from(aad: A) -> Self { Aad(aad) } } impl AsRef<[u8]> for Aad where A: AsRef<[u8]>, { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } impl Aad<[u8; 0]> { /// Construct an empty `Aad`. pub fn empty() -> Self { Self::from([]) } } /// An AEAD key without a designated role or nonce sequence. pub struct UnboundKey { inner: KeyInner, algorithm: &'static Algorithm, cpu_features: cpu::Features, } impl core::fmt::Debug for UnboundKey { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("UnboundKey") .field("algorithm", &self.algorithm) .finish() } } #[allow(variant_size_differences)] enum KeyInner { AesGcm(aes_gcm::Key), ChaCha20Poly1305(chacha20_poly1305::Key), } impl UnboundKey { /// Constructs an `UnboundKey`. /// /// Fails if `key_bytes.len() != ` algorithm.key_len()`. pub fn new( algorithm: &'static Algorithm, key_bytes: &[u8], ) -> Result { let cpu_features = cpu::features(); Ok(Self { inner: (algorithm.init)(key_bytes, cpu_features)?, algorithm, cpu_features, }) } /// The key's AEAD algorithm. #[inline] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } } impl From> for UnboundKey { fn from(okm: hkdf::Okm<&'static Algorithm>) -> Self { let mut key_bytes = [0; MAX_KEY_LEN]; let key_bytes = &mut key_bytes[..okm.len().key_len]; let algorithm = *okm.len(); okm.fill(key_bytes).unwrap(); Self::new(algorithm, key_bytes).unwrap() } } impl hkdf::KeyType for &'static Algorithm { #[inline] fn len(&self) -> usize { self.key_len() } } /// Immutable keys for use in situations where `OpeningKey`/`SealingKey` and /// `NonceSequence` cannot reasonably be used. /// /// Prefer to use `OpeningKey`/`SealingKey` and `NonceSequence` when practical. pub struct LessSafeKey { key: UnboundKey, } impl LessSafeKey { /// Constructs a `LessSafeKey` from an `UnboundKey`. pub fn new(key: UnboundKey) -> Self { Self { key } } /// Like [`OpeningKey::open_in_place()`], except it accepts an arbitrary nonce. /// /// `nonce` must be unique for every use of the key to open data. #[inline] pub fn open_in_place<'in_out, A>( &self, nonce: Nonce, aad: Aad, in_out: &'in_out mut [u8], ) -> Result<&'in_out mut [u8], error::Unspecified> where A: AsRef<[u8]>, { self.open_within(nonce, aad, in_out, 0..) } /// Like [`OpeningKey::open_within()`], except it accepts an arbitrary nonce. /// /// `nonce` must be unique for every use of the key to open data. #[inline] pub fn open_within<'in_out, A>( &self, nonce: Nonce, aad: Aad, in_out: &'in_out mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'in_out mut [u8], error::Unspecified> where A: AsRef<[u8]>, { open_within_(&self.key, nonce, aad, in_out, ciphertext_and_tag) } /// Deprecated. Renamed to [`seal_in_place_append_tag()`]. #[deprecated(note = "Renamed to `seal_in_place_append_tag`.")] #[inline] pub fn seal_in_place( &self, nonce: Nonce, aad: Aad, in_out: &mut InOut, ) -> Result<(), error::Unspecified> where A: AsRef<[u8]>, InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, { self.seal_in_place_append_tag(nonce, aad, in_out) } /// Like [`SealingKey::seal_in_place_append_tag()`], except it accepts an /// arbitrary nonce. /// /// `nonce` must be unique for every use of the key to seal data. #[inline] pub fn seal_in_place_append_tag( &self, nonce: Nonce, aad: Aad, in_out: &mut InOut, ) -> Result<(), error::Unspecified> where A: AsRef<[u8]>, InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, { self.seal_in_place_separate_tag(nonce, aad, in_out.as_mut()) .map(|tag| in_out.extend(tag.as_ref())) } /// Like `SealingKey::seal_in_place_separate_tag()`, except it accepts an /// arbitrary nonce. /// /// `nonce` must be unique for every use of the key to seal data. #[inline] pub fn seal_in_place_separate_tag( &self, nonce: Nonce, aad: Aad, in_out: &mut [u8], ) -> Result where A: AsRef<[u8]>, { seal_in_place_separate_tag_(&self.key, nonce, Aad::from(aad.as_ref()), in_out) } /// The key's AEAD algorithm. #[inline] pub fn algorithm(&self) -> &'static Algorithm { &self.key.algorithm } } impl core::fmt::Debug for LessSafeKey { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("LessSafeKey") .field("algorithm", self.algorithm()) .finish() } } /// An AEAD Algorithm. pub struct Algorithm { init: fn(key: &[u8], cpu_features: cpu::Features) -> Result, seal: fn( key: &KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag, open: fn( key: &KeyInner, nonce: Nonce, aad: Aad<&[u8]>, in_prefix_len: usize, in_out: &mut [u8], cpu_features: cpu::Features, ) -> Tag, key_len: usize, id: AlgorithmID, /// Use `max_input_len!()` to initialize this. // TODO: Make this `usize`. max_input_len: u64, } const fn max_input_len(block_len: usize, overhead_blocks_per_nonce: usize) -> u64 { // Each of our AEADs use a 32-bit block counter so the maximum is the // largest input that will not overflow the counter. ((1u64 << 32) - polyfill::u64_from_usize(overhead_blocks_per_nonce)) * polyfill::u64_from_usize(block_len) } impl Algorithm { /// The length of the key. #[inline(always)] pub fn key_len(&self) -> usize { self.key_len } /// The length of a tag. /// /// See also `MAX_TAG_LEN`. #[inline(always)] pub fn tag_len(&self) -> usize { TAG_LEN } /// The length of the nonces. #[inline(always)] pub fn nonce_len(&self) -> usize { NONCE_LEN } } derive_debug_via_id!(Algorithm); #[derive(Debug, Eq, PartialEq)] enum AlgorithmID { AES_128_GCM, AES_256_GCM, CHACHA20_POLY1305, } impl PartialEq for Algorithm { fn eq(&self, other: &Self) -> bool { self.id == other.id } } impl Eq for Algorithm {} /// An authentication tag. #[must_use] #[repr(C)] pub struct Tag(Block); impl AsRef<[u8]> for Tag { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } const MAX_KEY_LEN: usize = 32; // All the AEADs we support use 128-bit tags. const TAG_LEN: usize = BLOCK_LEN; /// The maximum length of a tag for the algorithms in this module. pub const MAX_TAG_LEN: usize = TAG_LEN; fn check_per_nonce_max_bytes(alg: &Algorithm, in_out_len: usize) -> Result<(), error::Unspecified> { if polyfill::u64_from_usize(in_out_len) > alg.max_input_len { return Err(error::Unspecified); } Ok(()) } #[derive(Clone, Copy)] enum Direction { Opening { in_prefix_len: usize }, Sealing, } mod aes; mod aes_gcm; mod block; mod chacha; mod chacha20_poly1305; pub mod chacha20_poly1305_openssh; mod gcm; mod nonce; mod poly1305; pub mod quic; mod shift; ring-0.16.9/src/agreement.rs000064400000000000000000000236171353037436100140560ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Key Agreement: ECDH, including X25519. //! //! # Example //! //! Note that this example uses X25519, but ECDH using NIST P-256/P-384 is done //! exactly the same way, just substituting //! `agreement::ECDH_P256`/`agreement::ECDH_P384` for `agreement::X25519`. //! //! ``` //! use ring::{agreement, rand}; //! //! let rng = rand::SystemRandom::new(); //! //! let my_private_key = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; //! //! // Make `my_public_key` a byte slice containing my public key. In a real //! // application, this would be sent to the peer in an encoded protocol //! // message. //! let my_public_key = my_private_key.compute_public_key()?; //! //! let peer_public_key = { //! // In a real application, the peer public key would be parsed out of a //! // protocol message. Here we just generate one. //! let peer_public_key = { //! let peer_private_key = //! agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; //! peer_private_key.compute_public_key()? //! }; //! //! agreement::UnparsedPublicKey::new(&agreement::X25519, peer_public_key) //! }; //! //! agreement::agree_ephemeral( //! my_private_key, //! &peer_public_key, //! ring::error::Unspecified, //! |_key_material| { //! // In a real application, we'd apply a KDF to the key material and the //! // public keys (as recommended in RFC 7748) and then derive session //! // keys from the result. We omit all that here. //! Ok(()) //! }, //! )?; //! //! # Ok::<(), ring::error::Unspecified>(()) //! ``` // The "NSA Guide" steps here are from from section 3.1, "Ephemeral Unified // Model." use crate::{cpu, debug, ec, error, rand}; use untrusted; pub use crate::ec::{ curve25519::x25519::X25519, suite_b::ecdh::{ECDH_P256, ECDH_P384}, }; /// A key agreement algorithm. pub struct Algorithm { pub(crate) curve: &'static ec::Curve, pub(crate) ecdh: fn( out: &mut [u8], private_key: &ec::Seed, peer_public_key: untrusted::Input, ) -> Result<(), error::Unspecified>, } derive_debug_via_field!(Algorithm, curve); impl Eq for Algorithm {} impl PartialEq for Algorithm { fn eq(&self, other: &Algorithm) -> bool { self.curve.id == other.curve.id } } /// An ephemeral private key for use (only) with `agree_ephemeral`. The /// signature of `agree_ephemeral` ensures that an `EphemeralPrivateKey` can be /// used for at most one key agreement. pub struct EphemeralPrivateKey { private_key: ec::Seed, algorithm: &'static Algorithm, } derive_debug_via_field!( EphemeralPrivateKey, stringify!(EphemeralPrivateKey), algorithm ); impl EphemeralPrivateKey { /// Generate a new ephemeral private key for the given algorithm. pub fn generate( alg: &'static Algorithm, rng: &dyn rand::SecureRandom, ) -> Result { let cpu_features = cpu::features(); // NSA Guide Step 1. // // This only handles the key generation part of step 1. The rest of // step one is done by `compute_public_key()`. let private_key = ec::Seed::generate(&alg.curve, rng, cpu_features)?; Ok(Self { private_key, algorithm: alg, }) } /// Computes the public key from the private key. #[inline(always)] pub fn compute_public_key(&self) -> Result { // NSA Guide Step 1. // // Obviously, this only handles the part of Step 1 between the private // key generation and the sending of the public key to the peer. `out` // is what should be sent to the peer. self.private_key .compute_public_key() .map(|public_key| PublicKey { algorithm: self.algorithm, bytes: public_key, }) } /// The algorithm for the private key. #[inline] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } #[cfg(test)] pub fn bytes(&self) -> &[u8] { self.private_key.bytes_less_safe() } } /// A public key for key agreement. #[derive(Clone)] pub struct PublicKey { algorithm: &'static Algorithm, bytes: ec::PublicKey, } impl AsRef<[u8]> for PublicKey { fn as_ref(&self) -> &[u8] { self.bytes.as_ref() } } impl core::fmt::Debug for PublicKey { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("PublicKey") .field("algorithm", &self.algorithm) .field("bytes", &debug::HexStr(self.as_ref())) .finish() } } impl PublicKey { /// The algorithm for the public key. #[inline] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } } /// An unparsed, possibly malformed, public key for key agreement. pub struct UnparsedPublicKey> { algorithm: &'static Algorithm, bytes: B, } impl Copy for UnparsedPublicKey where B: AsRef<[u8]> {} impl Clone for UnparsedPublicKey where B: AsRef<[u8]>, { fn clone(&self) -> Self { Self { algorithm: self.algorithm, bytes: self.bytes.clone(), } } } impl core::fmt::Debug for UnparsedPublicKey where B: AsRef<[u8]>, { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("UnparsedPublicKey") .field("algorithm", &self.algorithm) .field("bytes", &debug::HexStr(self.bytes.as_ref())) .finish() } } impl> UnparsedPublicKey { /// Constructs a new `UnparsedPublicKey`. pub fn new(algorithm: &'static Algorithm, bytes: B) -> Self { Self { algorithm, bytes } } /// TODO: doc #[inline] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } /// TODO: doc #[inline] pub fn bytes(&self) -> &B { &self.bytes } } /// Performs a key agreement with an ephemeral private key and the given public /// key. /// /// `my_private_key` is the ephemeral private key to use. Since it is moved, it /// will not be usable after calling `agree_ephemeral`, thus guaranteeing that /// the key is used for only one key agreement. /// /// `peer_public_key` is the peer's public key. `agree_ephemeral` will return /// `Err(error_value)` if it does not match `my_private_key's` algorithm/curve. /// `agree_ephemeral` verifies that it is encoded in the standard form for the /// algorithm and that the key is *valid*; see the algorithm's documentation for /// details on how keys are to be encoded and what constitutes a valid key for /// that algorithm. /// /// `error_value` is the value to return if an error occurs before `kdf` is /// called, e.g. when decoding of the peer's public key fails or when the public /// key is otherwise invalid. /// /// After the key agreement is done, `agree_ephemeral` calls `kdf` with the raw /// key material from the key agreement operation and then returns what `kdf` /// returns. #[inline] pub fn agree_ephemeral, F, R, E>( my_private_key: EphemeralPrivateKey, peer_public_key: &UnparsedPublicKey, error_value: E, kdf: F, ) -> Result where F: FnOnce(&[u8]) -> Result, { let peer_public_key = UnparsedPublicKey { algorithm: peer_public_key.algorithm, bytes: peer_public_key.bytes.as_ref(), }; agree_ephemeral_(my_private_key, peer_public_key, error_value, kdf) } fn agree_ephemeral_( my_private_key: EphemeralPrivateKey, peer_public_key: UnparsedPublicKey<&[u8]>, error_value: E, kdf: F, ) -> Result where F: FnOnce(&[u8]) -> Result, { // NSA Guide Prerequisite 1. // // The domain parameters are hard-coded. This check verifies that the // peer's public key's domain parameters match the domain parameters of // this private key. if peer_public_key.algorithm != my_private_key.algorithm { return Err(error_value); } let alg = &my_private_key.algorithm; // NSA Guide Prerequisite 2, regarding which KDFs are allowed, is delegated // to the caller. // NSA Guide Prerequisite 3, "Prior to or during the key-agreement process, // each party shall obtain the identifier associated with the other party // during the key-agreement scheme," is delegated to the caller. // NSA Guide Step 1 is handled by `EphemeralPrivateKey::generate()` and // `EphemeralPrivateKey::compute_public_key()`. let mut shared_key = [0u8; ec::ELEM_MAX_BYTES]; let shared_key = &mut shared_key[..alg.curve.elem_scalar_seed_len]; // NSA Guide Steps 2, 3, and 4. // // We have a pretty liberal interpretation of the NIST's spec's "Destroy" // that doesn't meet the NSA requirement to "zeroize." (alg.ecdh)( shared_key, &my_private_key.private_key, untrusted::Input::from(peer_public_key.bytes), ) .map_err(|_| error_value)?; // NSA Guide Steps 5 and 6. // // Again, we have a pretty liberal interpretation of the NIST's spec's // "Destroy" that doesn't meet the NSA requirement to "zeroize." kdf(shared_key) } ring-0.16.9/src/arithmetic/bigint.rs000064400000000000000000001345601353036607100155130ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Multi-precision integers. //! //! # Modular Arithmetic. //! //! Modular arithmetic is done in finite commutative rings ℤ/mℤ for some //! modulus *m*. We work in finite commutative rings instead of finite fields //! because the RSA public modulus *n* is not prime, which means ℤ/nℤ contains //! nonzero elements that have no multiplicative inverse, so ℤ/nℤ is not a //! finite field. //! //! In some calculations we need to deal with multiple rings at once. For //! example, RSA private key operations operate in the rings ℤ/nℤ, ℤ/pℤ, and //! ℤ/qℤ. Types and functions dealing with such rings are all parameterized //! over a type `M` to ensure that we don't wrongly mix up the math, e.g. by //! multiplying an element of ℤ/pℤ by an element of ℤ/qℤ modulo q. This follows //! the "unit" pattern described in [Static checking of units in Servo]. //! //! `Elem` also uses the static unit checking pattern to statically track the //! Montgomery factors that need to be canceled out in each value using it's //! `E` parameter. //! //! [Static checking of units in Servo]: //! https://blog.mozilla.org/research/2014/06/23/static-checking-of-units-in-servo/ use crate::{ arithmetic::montgomery::*, bits, bssl, c, error, limb::{self, Limb, LimbMask, LIMB_BITS, LIMB_BYTES}, }; use alloc::{borrow::ToOwned as _, boxed::Box, vec, vec::Vec}; use core::{ marker::PhantomData, ops::{Deref, DerefMut}, }; use untrusted; pub unsafe trait Prime {} struct Width { num_limbs: usize, /// The modulus *m* that the width originated from. m: PhantomData, } /// All `BoxedLimbs` are stored in the same number of limbs. struct BoxedLimbs { limbs: Box<[Limb]>, /// The modulus *m* that determines the size of `limbx`. m: PhantomData, } impl Deref for BoxedLimbs { type Target = [Limb]; #[inline] fn deref(&self) -> &Self::Target { &self.limbs } } impl DerefMut for BoxedLimbs { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { &mut self.limbs } } // TODO: `derive(Clone)` after https://github.com/rust-lang/rust/issues/26925 // is resolved or restrict `M: Clone`. impl Clone for BoxedLimbs { fn clone(&self) -> Self { Self { limbs: self.limbs.clone(), m: self.m.clone(), } } } impl BoxedLimbs { fn positive_minimal_width_from_be_bytes( input: untrusted::Input, ) -> Result { // Reject leading zeros. Also reject the value zero ([0]) because zero // isn't positive. if untrusted::Reader::new(input).peek(0) { return Err(error::KeyRejected::invalid_encoding()); } let num_limbs = (input.len() + LIMB_BYTES - 1) / LIMB_BYTES; let mut r = Self::zero(Width { num_limbs, m: PhantomData, }); limb::parse_big_endian_and_pad_consttime(input, &mut r) .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; Ok(r) } fn minimal_width_from_unpadded(limbs: &[Limb]) -> Self { debug_assert_ne!(limbs.last(), Some(&0)); Self { limbs: limbs.to_owned().into_boxed_slice(), m: PhantomData, } } fn from_be_bytes_padded_less_than( input: untrusted::Input, m: &Modulus, ) -> Result { let mut r = Self::zero(m.width()); limb::parse_big_endian_and_pad_consttime(input, &mut r)?; if limb::limbs_less_than_limbs_consttime(&r, &m.limbs) != LimbMask::True { return Err(error::Unspecified); } Ok(r) } #[inline] fn is_zero(&self) -> bool { limb::limbs_are_zero_constant_time(&self.limbs) == LimbMask::True } fn zero(width: Width) -> Self { Self { limbs: vec![0; width.num_limbs].to_owned().into_boxed_slice(), m: PhantomData, } } fn width(&self) -> Width { Width { num_limbs: self.limbs.len(), m: PhantomData, } } } /// A modulus *s* that is smaller than another modulus *l* so every element of /// ℤ/sℤ is also an element of ℤ/lℤ. pub unsafe trait SmallerModulus {} /// A modulus *s* where s < l < 2*s for the given larger modulus *l*. This is /// the precondition for reduction by conditional subtraction, /// `elem_reduce_once()`. pub unsafe trait SlightlySmallerModulus: SmallerModulus {} /// A modulus *s* where √l <= s < l for the given larger modulus *l*. This is /// the precondition for the more general Montgomery reduction from ℤ/lℤ to /// ℤ/sℤ. pub unsafe trait NotMuchSmallerModulus: SmallerModulus {} pub unsafe trait PublicModulus {} /// The x86 implementation of `GFp_bn_mul_mont`, at least, requires at least 4 /// limbs. For a long time we have required 4 limbs for all targets, though /// this may be unnecessary. TODO: Replace this with /// `n.len() < 256 / LIMB_BITS` so that 32-bit and 64-bit platforms behave the /// same. pub const MODULUS_MIN_LIMBS: usize = 4; pub const MODULUS_MAX_LIMBS: usize = 8192 / LIMB_BITS; /// The modulus *m* for a ring ℤ/mℤ, along with the precomputed values needed /// for efficient Montgomery multiplication modulo *m*. The value must be odd /// and larger than 2. The larger-than-1 requirement is imposed, at least, by /// the modular inversion code. pub struct Modulus { limbs: BoxedLimbs, // Also `value >= 3`. // n0 * N == -1 (mod r). // // r == 2**(N0_LIMBS_USED * LIMB_BITS) and LG_LITTLE_R == lg(r). This // ensures that we can do integer division by |r| by simply ignoring // `N0_LIMBS_USED` limbs. Similarly, we can calculate values modulo `r` by // just looking at the lowest `N0_LIMBS_USED` limbs. This is what makes // Montgomery multiplication efficient. // // As shown in Algorithm 1 of "Fast Prime Field Elliptic Curve Cryptography // with 256 Bit Primes" by Shay Gueron and Vlad Krasnov, in the loop of a // multi-limb Montgomery multiplication of a * b (mod n), given the // unreduced product t == a * b, we repeatedly calculate: // // t1 := t % r |t1| is |t|'s lowest limb (see previous paragraph). // t2 := t1*n0*n // t3 := t + t2 // t := t3 / r copy all limbs of |t3| except the lowest to |t|. // // In the last step, it would only make sense to ignore the lowest limb of // |t3| if it were zero. The middle steps ensure that this is the case: // // t3 == 0 (mod r) // t + t2 == 0 (mod r) // t + t1*n0*n == 0 (mod r) // t1*n0*n == -t (mod r) // t*n0*n == -t (mod r) // n0*n == -1 (mod r) // n0 == -1/n (mod r) // // Thus, in each iteration of the loop, we multiply by the constant factor // n0, the negative inverse of n (mod r). // // TODO(perf): Not all 32-bit platforms actually make use of n0[1]. For the // ones that don't, we could use a shorter `R` value and use faster `Limb` // calculations instead of double-precision `u64` calculations. n0: N0, oneRR: One, } impl core::fmt::Debug for Modulus { fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { fmt.debug_struct("Modulus") // TODO: Print modulus value. .finish() } } impl Modulus { pub fn from_be_bytes_with_bit_length( input: untrusted::Input, ) -> Result<(Self, bits::BitLength), error::KeyRejected> { let limbs = BoxedLimbs::positive_minimal_width_from_be_bytes(input)?; Self::from_boxed_limbs(limbs) } pub fn from_nonnegative_with_bit_length( n: Nonnegative, ) -> Result<(Self, bits::BitLength), error::KeyRejected> { let limbs = BoxedLimbs { limbs: n.limbs.into_boxed_slice(), m: PhantomData, }; Self::from_boxed_limbs(limbs) } fn from_boxed_limbs(n: BoxedLimbs) -> Result<(Self, bits::BitLength), error::KeyRejected> { if n.len() > MODULUS_MAX_LIMBS { return Err(error::KeyRejected::too_large()); } if n.len() < MODULUS_MIN_LIMBS { return Err(error::KeyRejected::unexpected_error()); } if limb::limbs_are_even_constant_time(&n) != LimbMask::False { return Err(error::KeyRejected::invalid_component()); } if limb::limbs_less_than_limb_constant_time(&n, 3) != LimbMask::False { return Err(error::KeyRejected::unexpected_error()); } // n_mod_r = n % r. As explained in the documentation for `n0`, this is // done by taking the lowest `N0_LIMBS_USED` limbs of `n`. let n0 = { extern "C" { fn GFp_bn_neg_inv_mod_r_u64(n: u64) -> u64; } // XXX: u64::from isn't guaranteed to be constant time. let mut n_mod_r: u64 = u64::from(n[0]); if N0_LIMBS_USED == 2 { // XXX: If we use `<< LIMB_BITS` here then 64-bit builds // fail to compile because of `deny(exceeding_bitshifts)`. debug_assert_eq!(LIMB_BITS, 32); n_mod_r |= u64::from(n[1]) << 32; } N0::from(unsafe { GFp_bn_neg_inv_mod_r_u64(n_mod_r) }) }; let bits = limb::limbs_minimal_bits(&n.limbs); let oneRR = { let partial = PartialModulus { limbs: &n.limbs, n0: n0.clone(), m: PhantomData, }; One::newRR(&partial, bits) }; Ok(( Self { limbs: n, n0, oneRR, }, bits, )) } #[inline] fn width(&self) -> Width { self.limbs.width() } fn zero(&self) -> Elem { Elem { limbs: BoxedLimbs::zero(self.width()), encoding: PhantomData, } } // TODO: Get rid of this fn one(&self) -> Elem { let mut r = self.zero(); r.limbs[0] = 1; r } pub fn oneRR(&self) -> &One { &self.oneRR } pub fn to_elem(&self, l: &Modulus) -> Elem where M: SmallerModulus, { // TODO: Encode this assertion into the `where` above. assert_eq!(self.width().num_limbs, l.width().num_limbs); let limbs = self.limbs.clone(); Elem { limbs: BoxedLimbs { limbs: limbs.limbs, m: PhantomData, }, encoding: PhantomData, } } fn as_partial(&self) -> PartialModulus { PartialModulus { limbs: &self.limbs, n0: self.n0.clone(), m: PhantomData, } } } struct PartialModulus<'a, M> { limbs: &'a [Limb], n0: N0, m: PhantomData, } impl PartialModulus<'_, M> { // TODO: XXX Avoid duplication with `Modulus`. fn zero(&self) -> Elem { let width = Width { num_limbs: self.limbs.len(), m: PhantomData, }; Elem { limbs: BoxedLimbs::zero(width), encoding: PhantomData, } } } /// Elements of ℤ/mℤ for some modulus *m*. // // Defaulting `E` to `Unencoded` is a convenience for callers from outside this // submodule. However, for maximum clarity, we always explicitly use // `Unencoded` within the `bigint` submodule. pub struct Elem { limbs: BoxedLimbs, /// The number of Montgomery factors that need to be canceled out from /// `value` to get the actual value. encoding: PhantomData, } // TODO: `derive(Clone)` after https://github.com/rust-lang/rust/issues/26925 // is resolved or restrict `M: Clone` and `E: Clone`. impl Clone for Elem { fn clone(&self) -> Self { Self { limbs: self.limbs.clone(), encoding: self.encoding.clone(), } } } impl Elem { #[inline] pub fn is_zero(&self) -> bool { self.limbs.is_zero() } } impl Elem { fn decode_once(self, m: &Modulus) -> Elem::Output> { // A multiplication isn't required since we're multiplying by the // unencoded value one (1); only a Montgomery reduction is needed. // However the only non-multiplication Montgomery reduction function we // have requires the input to be large, so we avoid using it here. let mut limbs = self.limbs; let num_limbs = m.width().num_limbs; let mut one = [0; MODULUS_MAX_LIMBS]; one[0] = 1; let one = &one[..num_limbs]; // assert!(num_limbs <= MODULUS_MAX_LIMBS); limbs_mont_mul(&mut limbs, &one, &m.limbs, &m.n0); Elem { limbs, encoding: PhantomData, } } } impl Elem { #[inline] pub fn into_unencoded(self, m: &Modulus) -> Elem { self.decode_once(m) } } impl Elem { pub fn from_be_bytes_padded( input: untrusted::Input, m: &Modulus, ) -> Result { Ok(Elem { limbs: BoxedLimbs::from_be_bytes_padded_less_than(input, m)?, encoding: PhantomData, }) } #[inline] pub fn fill_be_bytes(&self, out: &mut [u8]) { // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010. limb::big_endian_from_limbs(&self.limbs, out) } pub fn into_modulus(self) -> Result, error::KeyRejected> { let (m, _bits) = Modulus::from_boxed_limbs(BoxedLimbs::minimal_width_from_unpadded(&self.limbs))?; Ok(m) } fn is_one(&self) -> bool { limb::limbs_equal_limb_constant_time(&self.limbs, 1) == LimbMask::True } } pub fn elem_mul( a: &Elem, b: Elem, m: &Modulus, ) -> Elem::Output> where (AF, BF): ProductEncoding, { elem_mul_(a, b, &m.as_partial()) } fn elem_mul_( a: &Elem, mut b: Elem, m: &PartialModulus, ) -> Elem::Output> where (AF, BF): ProductEncoding, { limbs_mont_mul(&mut b.limbs, &a.limbs, &m.limbs, &m.n0); Elem { limbs: b.limbs, encoding: PhantomData, } } fn elem_mul_by_2(a: &mut Elem, m: &PartialModulus) { extern "C" { fn LIMBS_shl_mod(r: *mut Limb, a: *const Limb, m: *const Limb, num_limbs: c::size_t); } unsafe { LIMBS_shl_mod( a.limbs.as_mut_ptr(), a.limbs.as_ptr(), m.limbs.as_ptr(), m.limbs.len(), ); } } pub fn elem_reduced_once>( a: &Elem, m: &Modulus, ) -> Elem { let mut r = a.limbs.clone(); assert!(r.len() <= m.limbs.len()); limb::limbs_reduce_once_constant_time(&mut r, &m.limbs); Elem { limbs: BoxedLimbs { limbs: r.limbs, m: PhantomData, }, encoding: PhantomData, } } #[inline] pub fn elem_reduced>( a: &Elem, m: &Modulus, ) -> Result, error::Unspecified> { extern "C" { fn GFp_bn_from_montgomery_in_place( r: *mut Limb, num_r: c::size_t, a: *mut Limb, num_a: c::size_t, n: *const Limb, num_n: c::size_t, n0: &N0, ) -> bssl::Result; } let mut tmp = [0; MODULUS_MAX_LIMBS]; let tmp = &mut tmp[..a.limbs.len()]; tmp.copy_from_slice(&a.limbs); let mut r = m.zero(); Result::from(unsafe { GFp_bn_from_montgomery_in_place( r.limbs.as_mut_ptr(), r.limbs.len(), tmp.as_mut_ptr(), tmp.len(), m.limbs.as_ptr(), m.limbs.len(), &m.n0, ) })?; Ok(r) } fn elem_squared( mut a: Elem, m: &PartialModulus, ) -> Elem::Output> where (E, E): ProductEncoding, { limbs_mont_square(&mut a.limbs, &m.limbs, &m.n0); Elem { limbs: a.limbs, encoding: PhantomData, } } pub fn elem_widen>( a: Elem, m: &Modulus, ) -> Elem { let mut r = m.zero(); r.limbs[..a.limbs.len()].copy_from_slice(&a.limbs); r } // TODO: Document why this works for all Montgomery factors. pub fn elem_add(mut a: Elem, b: Elem, m: &Modulus) -> Elem { extern "C" { // `r` and `a` may alias. fn LIMBS_add_mod( r: *mut Limb, a: *const Limb, b: *const Limb, m: *const Limb, num_limbs: c::size_t, ); } unsafe { LIMBS_add_mod( a.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr(), m.limbs.as_ptr(), m.limbs.len(), ) } a } // TODO: Document why this works for all Montgomery factors. pub fn elem_sub(mut a: Elem, b: &Elem, m: &Modulus) -> Elem { extern "C" { // `r` and `a` may alias. fn LIMBS_sub_mod( r: *mut Limb, a: *const Limb, b: *const Limb, m: *const Limb, num_limbs: c::size_t, ); } unsafe { LIMBS_sub_mod( a.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr(), m.limbs.as_ptr(), m.limbs.len(), ); } a } // The value 1, Montgomery-encoded some number of times. pub struct One(Elem); impl One { // Returns RR = = R**2 (mod n) where R = 2**r is the smallest power of // 2**LIMB_BITS such that R > m. // // Even though the assembly on some 32-bit platforms works with 64-bit // values, using `LIMB_BITS` here, rather than `N0_LIMBS_USED * LIMB_BITS`, // is correct because R**2 will still be a multiple of the latter as // `N0_LIMBS_USED` is either one or two. fn newRR(m: &PartialModulus, m_bits: bits::BitLength) -> Self { let m_bits = m_bits.as_usize_bits(); let r = (m_bits + (LIMB_BITS - 1)) / LIMB_BITS * LIMB_BITS; // base = 2**(lg m - 1). let bit = m_bits - 1; let mut base = m.zero(); base.limbs[bit / LIMB_BITS] = 1 << (bit % LIMB_BITS); // Double `base` so that base == R == 2**r (mod m). For normal moduli // that have the high bit of the highest limb set, this requires one // doubling. Unusual moduli require more doublings but we are less // concerned about the performance of those. // // Then double `base` again so that base == 2*R (mod n), i.e. `2` in // Montgomery form (`elem_exp_vartime_()` requires the base to be in // Montgomery form). Then compute // RR = R**2 == base**r == R**r == (2**r)**r (mod n). // // Take advantage of the fact that `elem_mul_by_2` is faster than // `elem_squared` by replacing some of the early squarings with shifts. // TODO: Benchmark shift vs. squaring performance to determine the // optimal value of `lg_base`. let lg_base = 2usize; // Shifts vs. squaring trade-off. debug_assert_eq!(lg_base.count_ones(), 1); // Must 2**n for n >= 0. let shifts = r - bit + lg_base; let exponent = (r / lg_base) as u64; for _ in 0..shifts { elem_mul_by_2(&mut base, m) } let RR = elem_exp_vartime_(base, exponent, m); Self(Elem { limbs: RR.limbs, encoding: PhantomData, // PhantomData }) } } impl AsRef> for One { fn as_ref(&self) -> &Elem { &self.0 } } /// A non-secret odd positive value in the range /// [3, PUBLIC_EXPONENT_MAX_VALUE]. #[derive(Clone, Copy, Debug)] pub struct PublicExponent(u64); impl PublicExponent { pub fn from_be_bytes( input: untrusted::Input, min_value: u64, ) -> Result { if input.len() > 5 { return Err(error::KeyRejected::too_large()); } let value = input.read_all(error::KeyRejected::invalid_encoding(), |input| { // The exponent can't be zero and it can't be prefixed with // zero-valued bytes. if input.peek(0) { return Err(error::KeyRejected::invalid_encoding()); } let mut value = 0u64; loop { let byte = input .read_byte() .map_err(|untrusted::EndOfInput| error::KeyRejected::invalid_encoding())?; value = (value << 8) | u64::from(byte); if input.at_end() { return Ok(value); } } })?; // Step 2 / Step b. NIST SP800-89 defers to FIPS 186-3, which requires // `e >= 65537`. We enforce this when signing, but are more flexible in // verification, for compatibility. Only small public exponents are // supported. if value & 1 != 1 { return Err(error::KeyRejected::invalid_component()); } debug_assert!(min_value & 1 == 1); debug_assert!(min_value <= PUBLIC_EXPONENT_MAX_VALUE); if min_value < 3 { return Err(error::KeyRejected::invalid_component()); } if value < min_value { return Err(error::KeyRejected::too_small()); } if value > PUBLIC_EXPONENT_MAX_VALUE { return Err(error::KeyRejected::too_large()); } Ok(Self(value)) } } // This limit was chosen to bound the performance of the simple // exponentiation-by-squaring implementation in `elem_exp_vartime`. In // particular, it helps mitigate theoretical resource exhaustion attacks. 33 // bits was chosen as the limit based on the recommendations in [1] and // [2]. Windows CryptoAPI (at least older versions) doesn't support values // larger than 32 bits [3], so it is unlikely that exponents larger than 32 // bits are being used for anything Windows commonly does. // // [1] https://www.imperialviolet.org/2012/03/16/rsae.html // [2] https://www.imperialviolet.org/2012/03/17/rsados.html // [3] https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx const PUBLIC_EXPONENT_MAX_VALUE: u64 = (1u64 << 33) - 1; /// Calculates base**exponent (mod m). // TODO: The test coverage needs to be expanded, e.g. test with the largest // accepted exponent and with the most common values of 65537 and 3. pub fn elem_exp_vartime( base: Elem, PublicExponent(exponent): PublicExponent, m: &Modulus, ) -> Elem { let base = elem_mul(m.oneRR().as_ref(), base, &m); elem_exp_vartime_(base, exponent, &m.as_partial()) } /// Calculates base**exponent (mod m). fn elem_exp_vartime_(base: Elem, exponent: u64, m: &PartialModulus) -> Elem { // Use what [Knuth] calls the "S-and-X binary method", i.e. variable-time // square-and-multiply that scans the exponent from the most significant // bit to the least significant bit (left-to-right). Left-to-right requires // less storage compared to right-to-left scanning, at the cost of needing // to compute `exponent.leading_zeros()`, which we assume to be cheap. // // During RSA public key operations the exponent is almost always either 65537 // (0b10000000000000001) or 3 (0b11), both of which have a Hamming weight // of 2. During Montgomery setup the exponent is almost always a power of two, // with Hamming weight 1. As explained in [Knuth], exponentiation by squaring // is the most efficient algorithm when the Hamming weight is 2 or less. It // isn't the most efficient for all other, uncommon, exponent values but any // suboptimality is bounded by `PUBLIC_EXPONENT_MAX_VALUE`. // // This implementation is slightly simplified by taking advantage of the // fact that we require the exponent to be a positive integer. // // [Knuth]: The Art of Computer Programming, Volume 2: Seminumerical // Algorithms (3rd Edition), Section 4.6.3. assert!(exponent >= 1); assert!(exponent <= PUBLIC_EXPONENT_MAX_VALUE); let mut acc = base.clone(); let mut bit = 1 << (64 - 1 - exponent.leading_zeros()); debug_assert!((exponent & bit) != 0); while bit > 1 { bit >>= 1; acc = elem_squared(acc, m); if (exponent & bit) != 0 { acc = elem_mul_(&base, acc, m); } } acc } // `M` represents the prime modulus for which the exponent is in the interval // [1, `m` - 1). pub struct PrivateExponent { limbs: BoxedLimbs, } impl PrivateExponent { pub fn from_be_bytes_padded( input: untrusted::Input, p: &Modulus, ) -> Result { let dP = BoxedLimbs::from_be_bytes_padded_less_than(input, p)?; // Proof that `dP < p - 1`: // // If `dP < p` then either `dP == p - 1` or `dP < p - 1`. Since `p` is // odd, `p - 1` is even. `d` is odd, and an odd number modulo an even // number is odd. Therefore `dP` must be odd. But then it cannot be // `p - 1` and so we know `dP < p - 1`. // // Further we know `dP != 0` because `dP` is not even. if limb::limbs_are_even_constant_time(&dP) != LimbMask::False { return Err(error::Unspecified); } Ok(Self { limbs: dP }) } } impl PrivateExponent { // Returns `p - 2`. fn for_flt(p: &Modulus) -> Self { let two = elem_add(p.one(), p.one(), p); let p_minus_2 = elem_sub(p.zero(), &two, p); Self { limbs: p_minus_2.limbs, } } } #[cfg(not(target_arch = "x86_64"))] pub fn elem_exp_consttime( base: Elem, exponent: &PrivateExponent, m: &Modulus, ) -> Result, error::Unspecified> { use crate::limb::Window; const WINDOW_BITS: usize = 5; const TABLE_ENTRIES: usize = 1 << WINDOW_BITS; let num_limbs = m.limbs.len(); let mut table = vec![0; TABLE_ENTRIES * num_limbs]; fn gather(table: &[Limb], i: Window, r: &mut Elem) { extern "C" { fn LIMBS_select_512_32( r: *mut Limb, table: *const Limb, num_limbs: c::size_t, i: Window, ) -> bssl::Result; } Result::from(unsafe { LIMBS_select_512_32(r.limbs.as_mut_ptr(), table.as_ptr(), r.limbs.len(), i) }) .unwrap(); } fn power( table: &[Limb], i: Window, mut acc: Elem, mut tmp: Elem, m: &Modulus, ) -> (Elem, Elem) { for _ in 0..WINDOW_BITS { acc = elem_squared(acc, &m.as_partial()); } gather(table, i, &mut tmp); let acc = elem_mul(&tmp, acc, m); (acc, tmp) } let tmp = m.one(); let tmp = elem_mul(m.oneRR().as_ref(), tmp, m); fn entry(table: &[Limb], i: usize, num_limbs: usize) -> &[Limb] { &table[(i * num_limbs)..][..num_limbs] } fn entry_mut(table: &mut [Limb], i: usize, num_limbs: usize) -> &mut [Limb] { &mut table[(i * num_limbs)..][..num_limbs] } let num_limbs = m.limbs.len(); entry_mut(&mut table, 0, num_limbs).copy_from_slice(&tmp.limbs); entry_mut(&mut table, 1, num_limbs).copy_from_slice(&base.limbs); for i in 2..TABLE_ENTRIES { let (src1, src2) = if i % 2 == 0 { (i / 2, i / 2) } else { (i - 1, 1) }; let (previous, rest) = table.split_at_mut(num_limbs * i); let src1 = entry(previous, src1, num_limbs); let src2 = entry(previous, src2, num_limbs); let dst = entry_mut(rest, 0, num_limbs); limbs_mont_product(dst, src1, src2, &m.limbs, &m.n0); } let (r, _) = limb::fold_5_bit_windows( &exponent.limbs, |initial_window| { let mut r = Elem { limbs: base.limbs, encoding: PhantomData, }; gather(&table, initial_window, &mut r); (r, tmp) }, |(acc, tmp), window| power(&table, window, acc, tmp, m), ); let r = r.into_unencoded(m); Ok(r) } /// Uses Fermat's Little Theorem to calculate modular inverse in constant time. pub fn elem_inverse_consttime( a: Elem, m: &Modulus, ) -> Result, error::Unspecified> { elem_exp_consttime(a, &PrivateExponent::for_flt(&m), m) } #[cfg(target_arch = "x86_64")] pub fn elem_exp_consttime( base: Elem, exponent: &PrivateExponent, m: &Modulus, ) -> Result, error::Unspecified> { // The x86_64 assembly was written under the assumption that the input data // is aligned to `MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH` bytes, which was/is // 64 in OpenSSL. Similarly, OpenSSL uses the x86_64 assembly functions by // giving it only inputs `tmp`, `am`, and `np` that immediately follow the // table. The code seems to "work" even when the inputs aren't exactly // like that but the side channel defenses might not be as effective. All // the awkwardness here stems from trying to use the assembly code like // OpenSSL does. use crate::limb::Window; const WINDOW_BITS: usize = 5; const TABLE_ENTRIES: usize = 1 << WINDOW_BITS; let num_limbs = m.limbs.len(); const ALIGNMENT: usize = 64; assert_eq!(ALIGNMENT % LIMB_BYTES, 0); let mut table = vec![0; ((TABLE_ENTRIES + 3) * num_limbs) + ALIGNMENT]; let (table, state) = { let misalignment = (table.as_ptr() as usize) % ALIGNMENT; let table = &mut table[((ALIGNMENT - misalignment) / LIMB_BYTES)..]; assert_eq!((table.as_ptr() as usize) % ALIGNMENT, 0); table.split_at_mut(TABLE_ENTRIES * num_limbs) }; fn entry(table: &[Limb], i: usize, num_limbs: usize) -> &[Limb] { &table[(i * num_limbs)..][..num_limbs] } fn entry_mut(table: &mut [Limb], i: usize, num_limbs: usize) -> &mut [Limb] { &mut table[(i * num_limbs)..][..num_limbs] } const ACC: usize = 0; // `tmp` in OpenSSL const BASE: usize = ACC + 1; // `am` in OpenSSL const M: usize = BASE + 1; // `np` in OpenSSL entry_mut(state, BASE, num_limbs).copy_from_slice(&base.limbs); entry_mut(state, M, num_limbs).copy_from_slice(&m.limbs); fn scatter(table: &mut [Limb], state: &[Limb], i: Window, num_limbs: usize) { extern "C" { fn GFp_bn_scatter5(a: *const Limb, a_len: c::size_t, table: *mut Limb, i: Window); } unsafe { GFp_bn_scatter5( entry(state, ACC, num_limbs).as_ptr(), num_limbs, table.as_mut_ptr(), i, ) } } fn gather(table: &[Limb], state: &mut [Limb], i: Window, num_limbs: usize) { extern "C" { fn GFp_bn_gather5(r: *mut Limb, a_len: c::size_t, table: *const Limb, i: Window); } unsafe { GFp_bn_gather5( entry_mut(state, ACC, num_limbs).as_mut_ptr(), num_limbs, table.as_ptr(), i, ) } } fn gather_square(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { gather(table, state, i, num_limbs); assert_eq!(ACC, 0); let (acc, rest) = state.split_at_mut(num_limbs); let m = entry(rest, M - 1, num_limbs); limbs_mont_square(acc, m, n0); } fn gather_mul_base(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { extern "C" { fn GFp_bn_mul_mont_gather5( rp: *mut Limb, ap: *const Limb, table: *const Limb, np: *const Limb, n0: &N0, num: c::size_t, power: Window, ); } unsafe { GFp_bn_mul_mont_gather5( entry_mut(state, ACC, num_limbs).as_mut_ptr(), entry(state, BASE, num_limbs).as_ptr(), table.as_ptr(), entry(state, M, num_limbs).as_ptr(), n0, num_limbs, i, ); } } fn power(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { extern "C" { fn GFp_bn_power5( r: *mut Limb, a: *const Limb, table: *const Limb, n: *const Limb, n0: &N0, num: c::size_t, i: Window, ); } unsafe { GFp_bn_power5( entry_mut(state, ACC, num_limbs).as_mut_ptr(), entry_mut(state, ACC, num_limbs).as_mut_ptr(), table.as_ptr(), entry(state, M, num_limbs).as_ptr(), n0, num_limbs, i, ); } } // table[0] = base**0. { let acc = entry_mut(state, ACC, num_limbs); acc[0] = 1; limbs_mont_mul(acc, &m.oneRR.0.limbs, &m.limbs, &m.n0); } scatter(table, state, 0, num_limbs); // table[1] = base**1. entry_mut(state, ACC, num_limbs).copy_from_slice(&base.limbs); scatter(table, state, 1, num_limbs); for i in 2..(TABLE_ENTRIES as Window) { if i % 2 == 0 { // TODO: Optimize this to avoid gathering gather_square(table, state, &m.n0, i / 2, num_limbs); } else { gather_mul_base(table, state, &m.n0, i - 1, num_limbs) }; scatter(table, state, i, num_limbs); } let state = limb::fold_5_bit_windows( &exponent.limbs, |initial_window| { gather(table, state, initial_window, num_limbs); state }, |state, window| { power(table, state, &m.n0, window, num_limbs); state }, ); extern "C" { fn GFp_bn_from_montgomery( r: *mut Limb, a: *const Limb, not_used: *const Limb, n: *const Limb, n0: &N0, num: c::size_t, ) -> bssl::Result; } Result::from(unsafe { GFp_bn_from_montgomery( entry_mut(state, ACC, num_limbs).as_mut_ptr(), entry(state, ACC, num_limbs).as_ptr(), core::ptr::null(), entry(state, M, num_limbs).as_ptr(), &m.n0, num_limbs, ) })?; let mut r = Elem { limbs: base.limbs, encoding: PhantomData, }; r.limbs.copy_from_slice(entry(state, ACC, num_limbs)); Ok(r) } /// Verified a == b**-1 (mod m), i.e. a**-1 == b (mod m). pub fn verify_inverses_consttime( a: &Elem, b: Elem, m: &Modulus, ) -> Result<(), error::Unspecified> { if elem_mul(a, b, m).is_one() { Ok(()) } else { Err(error::Unspecified) } } #[inline] pub fn elem_verify_equal_consttime( a: &Elem, b: &Elem, ) -> Result<(), error::Unspecified> { if limb::limbs_equal_limbs_consttime(&a.limbs, &b.limbs) == LimbMask::True { Ok(()) } else { Err(error::Unspecified) } } /// Nonnegative integers. pub struct Nonnegative { limbs: Vec, } impl Nonnegative { pub fn from_be_bytes_with_bit_length( input: untrusted::Input, ) -> Result<(Self, bits::BitLength), error::Unspecified> { let mut limbs = vec![0; (input.len() + LIMB_BYTES - 1) / LIMB_BYTES]; // Rejects empty inputs. limb::parse_big_endian_and_pad_consttime(input, &mut limbs)?; while limbs.last() == Some(&0) { let _ = limbs.pop(); } let r_bits = limb::limbs_minimal_bits(&limbs); Ok((Self { limbs }, r_bits)) } #[inline] pub fn is_odd(&self) -> bool { limb::limbs_are_even_constant_time(&self.limbs) != LimbMask::True } pub fn verify_less_than(&self, other: &Self) -> Result<(), error::Unspecified> { if !greater_than(other, self) { return Err(error::Unspecified); } Ok(()) } pub fn to_elem(&self, m: &Modulus) -> Result, error::Unspecified> { self.verify_less_than_modulus(&m)?; let mut r = m.zero(); r.limbs[0..self.limbs.len()].copy_from_slice(&self.limbs); Ok(r) } pub fn verify_less_than_modulus(&self, m: &Modulus) -> Result<(), error::Unspecified> { if self.limbs.len() > m.limbs.len() { return Err(error::Unspecified); } if self.limbs.len() == m.limbs.len() { if limb::limbs_less_than_limbs_consttime(&self.limbs, &m.limbs) != LimbMask::True { return Err(error::Unspecified); } } return Ok(()); } } // Returns a > b. fn greater_than(a: &Nonnegative, b: &Nonnegative) -> bool { if a.limbs.len() == b.limbs.len() { limb::limbs_less_than_limbs_vartime(&b.limbs, &a.limbs) } else { a.limbs.len() > b.limbs.len() } } #[derive(Clone)] #[repr(transparent)] struct N0([Limb; 2]); const N0_LIMBS_USED: usize = 64 / LIMB_BITS; impl From for N0 { #[inline] fn from(n0: u64) -> Self { #[cfg(target_pointer_width = "64")] { Self([n0, 0]) } #[cfg(target_pointer_width = "32")] { Self([n0 as Limb, (n0 >> LIMB_BITS) as Limb]) } } } /// r *= a fn limbs_mont_mul(r: &mut [Limb], a: &[Limb], m: &[Limb], n0: &N0) { debug_assert_eq!(r.len(), m.len()); debug_assert_eq!(a.len(), m.len()); unsafe { GFp_bn_mul_mont( r.as_mut_ptr(), r.as_ptr(), a.as_ptr(), m.as_ptr(), n0, r.len(), ) } } /// r = a * b #[cfg(not(target_arch = "x86_64"))] fn limbs_mont_product(r: &mut [Limb], a: &[Limb], b: &[Limb], m: &[Limb], n0: &N0) { debug_assert_eq!(r.len(), m.len()); debug_assert_eq!(a.len(), m.len()); debug_assert_eq!(b.len(), m.len()); unsafe { GFp_bn_mul_mont( r.as_mut_ptr(), a.as_ptr(), b.as_ptr(), m.as_ptr(), n0, r.len(), ) } } /// r = r**2 fn limbs_mont_square(r: &mut [Limb], m: &[Limb], n0: &N0) { debug_assert_eq!(r.len(), m.len()); unsafe { GFp_bn_mul_mont( r.as_mut_ptr(), r.as_ptr(), r.as_ptr(), m.as_ptr(), n0, r.len(), ) } } extern "C" { // `r` and/or 'a' and/or 'b' may alias. fn GFp_bn_mul_mont( r: *mut Limb, a: *const Limb, b: *const Limb, n: *const Limb, n0: &N0, num_limbs: c::size_t, ); } #[cfg(test)] mod tests { use super::*; use crate::test; use alloc::format; use untrusted; // Type-level representation of an arbitrary modulus. struct M {} unsafe impl PublicModulus for M {} #[test] fn test_elem_exp_consttime() { test::run( test_file!("bigint_elem_exp_consttime_tests.txt"), |section, test_case| { assert_eq!(section, ""); let m = consume_modulus::(test_case, "M"); let expected_result = consume_elem(test_case, "ModExp", &m); let base = consume_elem(test_case, "A", &m); let e = { let bytes = test_case.consume_bytes("E"); PrivateExponent::from_be_bytes_padded(untrusted::Input::from(&bytes), &m) .expect("valid exponent") }; let base = into_encoded(base, &m); let actual_result = elem_exp_consttime(base, &e, &m).unwrap(); assert_elem_eq(&actual_result, &expected_result); Ok(()) }, ) } #[test] // TODO: fn test_elem_exp_vartime() using // "src/rsa/bigint_elem_exp_vartime_tests.txt". See that file for details. // In the meantime, the function is tested indirectly via the RSA // verification and signing tests. #[test] fn test_elem_mul() { test::run( test_file!("bigint_elem_mul_tests.txt"), |section, test_case| { assert_eq!(section, ""); let m = consume_modulus::(test_case, "M"); let expected_result = consume_elem(test_case, "ModMul", &m); let a = consume_elem(test_case, "A", &m); let b = consume_elem(test_case, "B", &m); let b = into_encoded(b, &m); let a = into_encoded(a, &m); let actual_result = elem_mul(&a, b, &m); let actual_result = actual_result.into_unencoded(&m); assert_elem_eq(&actual_result, &expected_result); Ok(()) }, ) } #[test] fn test_elem_squared() { test::run( test_file!("bigint_elem_squared_tests.txt"), |section, test_case| { assert_eq!(section, ""); let m = consume_modulus::(test_case, "M"); let expected_result = consume_elem(test_case, "ModSquare", &m); let a = consume_elem(test_case, "A", &m); let a = into_encoded(a, &m); let actual_result = elem_squared(a, &m.as_partial()); let actual_result = actual_result.into_unencoded(&m); assert_elem_eq(&actual_result, &expected_result); Ok(()) }, ) } #[test] fn test_elem_reduced() { test::run( test_file!("bigint_elem_reduced_tests.txt"), |section, test_case| { assert_eq!(section, ""); struct MM {} unsafe impl SmallerModulus for M {} unsafe impl NotMuchSmallerModulus for M {} let m = consume_modulus::(test_case, "M"); let expected_result = consume_elem(test_case, "R", &m); let a = consume_elem_unchecked::(test_case, "A", expected_result.limbs.len() * 2); let actual_result = elem_reduced(&a, &m).unwrap(); let oneRR = m.oneRR(); let actual_result = elem_mul(oneRR.as_ref(), actual_result, &m); assert_elem_eq(&actual_result, &expected_result); Ok(()) }, ) } #[test] fn test_elem_reduced_once() { test::run( test_file!("bigint_elem_reduced_once_tests.txt"), |section, test_case| { assert_eq!(section, ""); struct N {} struct QQ {} unsafe impl SmallerModulus for QQ {} unsafe impl SlightlySmallerModulus for QQ {} let qq = consume_modulus::(test_case, "QQ"); let expected_result = consume_elem::(test_case, "R", &qq); let n = consume_modulus::(test_case, "N"); let a = consume_elem::(test_case, "A", &n); let actual_result = elem_reduced_once(&a, &qq); assert_elem_eq(&actual_result, &expected_result); Ok(()) }, ) } #[test] fn test_modulus_debug() { let (modulus, _) = Modulus::::from_be_bytes_with_bit_length(untrusted::Input::from( &vec![0xff; LIMB_BYTES * MODULUS_MIN_LIMBS], )) .unwrap(); assert_eq!("Modulus", format!("{:?}", modulus)); } #[test] fn test_public_exponent_debug() { let exponent = PublicExponent::from_be_bytes(untrusted::Input::from(&[0x1, 0x00, 0x01]), 65537) .unwrap(); assert_eq!("PublicExponent(65537)", format!("{:?}", exponent)); } fn consume_elem( test_case: &mut test::TestCase, name: &str, m: &Modulus, ) -> Elem { let value = test_case.consume_bytes(name); Elem::from_be_bytes_padded(untrusted::Input::from(&value), m).unwrap() } fn consume_elem_unchecked( test_case: &mut test::TestCase, name: &str, num_limbs: usize, ) -> Elem { let value = consume_nonnegative(test_case, name); let mut limbs = BoxedLimbs::zero(Width { num_limbs, m: PhantomData, }); limbs[0..value.limbs.len()].copy_from_slice(&value.limbs); Elem { limbs, encoding: PhantomData, } } fn consume_modulus(test_case: &mut test::TestCase, name: &str) -> Modulus { let value = test_case.consume_bytes(name); let (value, _) = Modulus::from_be_bytes_with_bit_length(untrusted::Input::from(&value)).unwrap(); value } fn consume_nonnegative(test_case: &mut test::TestCase, name: &str) -> Nonnegative { let bytes = test_case.consume_bytes(name); let (r, _r_bits) = Nonnegative::from_be_bytes_with_bit_length(untrusted::Input::from(&bytes)).unwrap(); r } fn assert_elem_eq(a: &Elem, b: &Elem) { elem_verify_equal_consttime(&a, b).unwrap() } fn into_encoded(a: Elem, m: &Modulus) -> Elem { elem_mul(m.oneRR().as_ref(), a, m) } } ring-0.16.9/src/arithmetic/bigint_elem_exp_consttime_tests.txt000064400000000000000000000314351352416253600230730ustar0000000000000000# ModExp tests. # # # These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. # Additionally, and unlike BoringSSL, these test vectors satisify: # # * A != 0. Test vectors where A == 0 (mod M) were removed. # * 0 < A < M. Values of A that were negative or larger than M were reduced # (mod M) to be in range. # * M requires at least 4 (64-bit) words to represent. ModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0 A = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 ModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff A = a31618b4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839 E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b # Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in # order to test the const time precomputation scattering/gathering. ModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b A = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898 E = a2c56ea1362511cac0301918e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f M = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d ModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510 A = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83 E = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693 M = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11 # RSAZ 512-bit. # # These are regression tests for code which historically reached the RSAZ-512 # code. That has since been removed, but the test vectors remain. Note that the # lengths of the inputs, especially the *bit* length of |M|, matter a lot. # Control: No relationship between A and M except that A < M and they're the # same number of limbs. ModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4 A = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 # Same as above except A was negative. ModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd A = 62e0c43f7e263ec85c95ee853688c77bd746cef64ed606994a5d5b611551d1d1712aa93052ba50d7e0ece5a6f4be9dd45321d9f65ef0637f3ef7b186b460a12d E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 # A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. ModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 # Same inputs as above except A was negative. Note that A mod M with a "correct # top" isn't the right length for RSAZ. ModExp = 01 A = 01 E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 # A was negative, and A (mod M) is the right length for RSAZ. ModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25 A = 712f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 # RSAZ 1024-bit. # Note that the lengths of the inputs, especially the *bit* length of |M|, # matter a lot. # Control: No relationship between A and M except that A < M and they're the # same number of limbs. ModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7 A = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 # Same as above except A was negative. ModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10 A = de24b05c3f93864103e3239f8827f4e59b05414153ac79443b9baefcc35cc12da8de4eb3cdc2f1cf991fcae8cbcb6378f817b6105e09058d2bf6f48b82906f4dc68e08bb05610ab803d6fa806d3a174f8f697afe2223c7ced64a92af0ec9a4ec0aa6c3e7a5fc8d32d52715251d5022aea853e74f95cc44a777f858a1b8a939bf E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 # A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. ModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 # Same inputs as above except A was negative. Note that A mod M with a "correct # top" isn't the right length for RSAZ. ModExp = 01 A = 01 E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 # A was negative, and A (mod M) is the right length for RSAZ. ModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d A = 35d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 ring-0.16.9/src/arithmetic/bigint_elem_exp_vartime_tests.txt000064400000000000000000000010421352416253600225240ustar0000000000000000# ModExp tests. # # These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. # Additionally, These test vectors satisfy the following constraints: # # * 0 <= A < M. # * E is odd, and the number of bits in E is in [2, 33]. # * M requires at least 4 (64-bit) words to represent. # # XXX: Unfortunately, the above criteria exclude all BoringSSL test vectors; # i.e. none of the BoringSSL test vectors were suitable for testing the # variable-time exponentiation used in RSA verification in *ring*. TODO: Make # new test vectors. ring-0.16.9/src/arithmetic/bigint_elem_mul_tests.txt000064400000000000000000003425451352416253600210160ustar0000000000000000# ModMul tests. # # These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. These # are the subset of test vectors from BoringSSL where the modulus is at least # 4 64-bit words long. # These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. # Further, unlike in BoringSSL's set, these vectors satisfy 0 <= A, B < M. Any # A and B values not in range (negative and/or too large) in BoringSSL's set # were reduced mod M. ModMul = 09fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c A = 071b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905 B = 0167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d A = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9907b5bac6168216cc456c082ec793bafddf883bebc38372fc842b01cc47fa9cc16a8f07069b1314f77f20f33130cee31ca9b4cfddd79c45 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f4253911356f785368d3bb46a073963c8beeb9739df5b75cd3ecd3b6b228a6757a7444b7e06442c1cdb66aa4c900722e807ae756e1c21c172947c289ee5a295 B = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 043c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4d5c014b0eb5d5b5c839a5d5b7572ac8329de6665a5a87fd00e438d2441d47dcf1b19b535b18d53296dcac91075597851013912155313915e06865901ce22d68 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c623c36607369964fb48dd46fe84d9dacfae837c588fe9a6bab47cdb7d1219fc57a5f62d44da48f835937d1a60c9d7f1ff5b4e909c4fef5dcf7c00 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a A = 06bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152 B = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d A = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf557465589a08cecc3c6c45f7d537ddde56f33de3ac83426348c53cdb3f78d4dfbf23f8902b8839ee1bcc5ff6faa180a5dba95522a4ffd354f07491cbc2 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6dcf2f4d4e43e42756582fc51bafaafa1032ec1edeaa1ef606bb49906b5053a72b7a1e379587d75eec2c84cdaab7a419d60ec6b4fbb0bc45fc4ef8dcdfb5771cddbe1c8f B = 049ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3e06321ee2696a19ec7b419af70b234534841284d8b2775789ca6e8ebfd01171ae8a064df04a074fe1003967eba4f81c805fcdd2d665a0fb1f6d58c20411cb5fd820f0aec9 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f20c758c506fa6efeb577db1da2f76a34fdc71c83882bd63ab72e7727590a1135337032b5b2538d79f6894be4a4561f8056c95410047b7b2b5b68ebad20159e M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761 A = 0413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a B = 01b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327 A = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e20210fd8419b49f890a1a7ceb4118b85670e3ab9a5410a9c26f852de0edfefb003e303e4d06c2398d730641a5849ac5cf7984febf3a6465387c6cdcc348d237dbaea13 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7ae0e0f17d667641f443e6a865e9d2597d7f2ae957fdc4c1f68bf280d032bbb325a2fcc156b9c3063546008180884fdfb712ae15feeb185252500fc928116539fdb8e9a0b24ae6b39a B = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763ad7e109313b9830bbdadbec27cbbc9b3d25b0f0882bed6846d14770e56874eb5068533b8ff5988dff7d9748d2ed04b670390ead5ad7a060e77c29f040969a229308a27f5e2e33ee9f90a B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3b821bb5db6fee060cb22e5bbc7d2f950d181f1f39642acbebca9b295a63272bc3d7dd2f560ae637ca4db44b323e303d3fe20f2c71091e71aa64ec4c3980ffdebd83192136 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af196f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14 A = 0572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f B = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe A = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2f60af132627de89a4bda1ecb8d38fb8f26e5501e4d7d4b7f98a7af2c8ef53ed37ecf8ff31150e4bb9be0e520ee1a212a1e3a81dba46e4f469fa8f2cd9754beb63f7c1af6cabd001 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d1b500bcc03a4bb2951f3738cf8019af41f326f1cb11a4b994a0d6bc78d8f901434b6ff1a30e498a2a826f80c91608b12b6de650dbfff61ebae61265ae25da83e67ac5bbba6c95e9e70b9370d81c B = 04920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd3033f8e55637ffe56fdfc4cb8360a8733ad2dffe3369c98477e6277e7b303093df796dd63be8d650acc21b259787097a4ffaa8c997da01f2fadd78535cefe9bf6aa9684dc36d05722f4a080f9cad2899b B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da76389a6557af54b3487afde915c649b73b87e3c33d79883c54f73b623fbde12516b52fa84bc2fb0361c09580a1fb7482db75d5718afd8918522ea0f83d62f95527e4154ba016856c10c2ed8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a A = 0402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207 B = 01648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd A = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22555c011f02ef45c8d3f764b2426d4782881936d561ea99fc32451431712a0abfa195b32546c1a749b14ec8f78bbde852f3a1da097fbdf1bc6dec05a2cdc3e020c6b960a3ad6cbcba146103aab M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac7127ebd9ddfbcf524d3b79f6b9a32ff89b0df3a496eb286f4f2e2497a75ef26f04c3d9e8a1f461e1c9be3a8d16b8b75617e60104c4970761de1d6a56a5a4281f14c74e7eef2371b8da83767388108f5c0da0ca7 B = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac5a2037055e9c8e076e6cdc81847fbbd11f10059d46cc9521b1684f848f706002520ebdd60a8fc545f51a08eaa60872d6afed2226a6f182d9ee7d4314232de1382fa77f5b4ff7a72483cc039c26891df60ca5ae6 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd2ff66f81a2fbb2016b210df612743b1dbdd8ddb2a931bc785a7a6b7d723e9de746f31c260467bd955616176b327bae3aedae613a1827713a2397325259fdfae0947fcee980a13902653a818ba43f1f2d4 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a A = 04f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013 B = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9 A = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac7123b1c800e638fc5c56e2bcabb6f12b962b37367d8ab77e87894395ba23a6a525b72f2a4d6f12efd8f24298377e640b5158443241dbad589ef8dfb1f6d36a934e020b303920f2f2eb662429df171f4e3a2ac50 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed40c31b8fb13cde21f2e86870cdda0b4542efd681542a3c38343f5e00d14c174f5ea06b1d018edd9c82d587144eecefca6db5b6e70cadca1ad5ffee9f4a993270e5caa9ca71ed39146901611688a79aff0293477bd6f9ed5 B = 04a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05db1f0b382d2e76a22a2788439b6a2d571b49836383c68b45393ae5d6e6f2d73babda499420de469ac6bab7222ce957adeab7aebd3ddafb75189705d73cba31a54d9e2b46391bf9cd23e5258d9ee1730d577d5b789dc9997b1 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d0e72f8ec8f5d254a7147b2241390bcdf201835e1e89d2963112fcdde1902faa8b45232feb7d9c88d8879b234b61429c7ad79b1b60b254287d38d8ed174257621220bd8c1f3d2387721c5f735a7edc8c0f03a207fb60 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 02104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0 A = 07b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e B = 0156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23 A = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ec64a99eaffabe42c22517c8492c63f6fdfb82bffd693a451d62fece2f56a5606fccd9f3e86e2718417bad2c1df9502f2f0214e12261a060a6934c0ea8483894224e4367246b4727606274037b4f05d5767177f9d4e5e00a8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a18674c977d9484d2fbefd9b54d9b955d05a6965f522ec56a647bef486f85f59e7cb3bee2a3af6100fdb6e2c17ab1526267db3004084c78770682f4be127263141867fb04692e6feecc8d342b0fee5b9a6eea64f58276ae6ef809c1cc748 B = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a011d0eb96be3284170951a6faaa10836f1196f53ee084d42a0c9d92dbb378d080c9f7c0ca8e015f323e3e64859a2f9fecc27a3f4ae87fecb8568c0ac2f5380ddb984bc23f574d8b56cf1250a0f06b90af2914e55a68cbdb7084ababad0b B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fc35df5e7c50ffc2283069f8a00ce91e5d561b5d6b06c81dc66e6c50ee1af260eda95de46017effa03234ebd6204e18a009ed2a53c76f76ed621aa6606abd91c0805f324d628b90e4c2c44a0a505911c7b0c097e001fac29efeba5 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65 A = 058e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807 B = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308 A = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a0ff4ae3c00601161a9d435c2a6850c89867009c3dbd9b10fb1f640dd698880aebba08c2220358050e51a3a667184b29d8e76c8855527aef2dd86698f91d4b6595db25644529f9cd8daca93fdd773a001a9022c7f825e7e9e54ac770b9f9 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f654d28e889079e28a54bbe330be57c70d6af97c5000e019a3c3e29bef35379584ce4e39dcf53f81f1dae04e2b97e815f4b6be7d2261c1fafe17113651e9a107ac7704a505c55194196e5220178c3d3337bb072a3b53ecf0dabf4fba203df9c29154 B = 072dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff28887b65a61118c8bc013ad24480a8f95b4e695fe5ddc014ff85bda86629d4b36c066383f76f18d5962474674a62646e7d30bce6b05edd6d8dd389eef93648a230615fa9459bfa8f3f9637b2629900e7b73feb6fa7b51eda0445f348f3658897b6997489 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a38c040ae26eb02ce1dbac7096bf004a4b48fb3ca9a1c117535f261d0aecb063712caade24be40e2605a8e204d0da58bd95d36c86669b917a483330b812af4528dc0a070aebed4a9d2aa09d10d5b3c3c171b5acebd87a3bbbfaa2c16cd7245f411 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173 A = 07906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df B = 01479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848 A = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff287d316f18074f0628caf7e230c5ecc2200108b30485917287ed9cc704afd58fa98a44ef04e39c6760fccfb16d9da1b5e6101a38fb24e6970b65e1546cd6f8c87d8233be4dba90ac05725252ec7b8d407c5fb05ce7e18561281019054935f1439dd3142a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f12c2038c450fc51fab9029d91eed64b9ed4ce05fa1c99da1acf103668541efcafe7bc7d6afb392b2471d699203a7feffe5471d883f8b1939b6cb3b80fb5ab8f8f51d382237a7954578d2caf5728678ad3b3011392f2d1e4f95d3e40826e5e3c45763ef941b01 B = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d1d0e8176011cf118575177fee3174fa27b8a90e74bb861627460da83e4d7d6099a9c6f89cabc953ccf0e86b78834b1e60571722abb4185bc42fbe61ec2112cf4d1be7c82d73d3b97c6902712c48b3fc3af8b5cb033435ae832d1d34f91191d4db0d84afef943dcf B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6bad22ea470bfe7098ec697270333ca4e149fdf57e32c9ea8a35849d394b41c3d2d62feffec5a9ea8543927d475bf5f2e9093879de6d599f6be17e67916a60f05711f2655bd8555881a01e0d230c8e11b9a6f157d72f826f4a6f66697eeac3e5dc6d53f117cf M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c A = 065e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7 B = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343 A = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c88023b951080528d09f2da8c2fb8ed7cc736044d8e086f55c89dabd2d1a0ad2221e9ed664636e0c285375266486981175410951c1690ead03896dff707b60b41f3d9d7588379c93a6e602e3b56f15c017eabb3e12ff4942901cd927fe6b1bb93280fff775cb0f18292a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35 A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651052030b76e95256709f642442e56d07be9c4f098ba79856b80eb6de39868758869ffd34925ab6a807b64fca9cca893aa44538585a76a35bbdd7fe09df9c553d8c17be4764662316e3dbf0f401d31418c4340fd3414fe4c599b8536b71d51d430d94430ea2e555860a69495e B = 05bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687633a0deaa80fa8b7717e7f26dd7834679d52e58de4905c032e7fbc427b4ec183e2287b2131071fd68a043c279e7cf1cc047723c6ecdf1bec72c54926c3cd6229b4bc15afebb90530b5008a8ba858f98c247bbcec545dd495b72768107cc98672f7d04fd8f0a7142d47b38462ab B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651064f6675d36585a5f9d7264f3b9f9dcc09c4911928783af66bfaabfa2bc7f530dd03ae6da1cea24776877c409f550267d02e13105880a4dd9ba76fd026d0d5de495d4c74b8021bc08d9014d6fe01589c7f757513090dac2d8eaee630381a912ecf9bab775fc740f1905ed68 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff A = 0773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a B = 013d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7 A = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967 B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab67df3f23e8f1b6e4395bca9102e09a76464a81036886a8f33e4f75af3adb74cc993cfdb32c84315ddb22bc1f52a8c04f728dca7f207ef3ba232cbd06b2c1bb63f0f89f2d72d59bb287bd5b164e2ce1bc18466876f9ce944d3be34706158f037d3b63b40546d720406da0401b9615c M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453 A = 8e2ba940fc5165c6c5f7f4cb56a6fde285936891917bce3c4bc572858192433a88a5d77e63bbf31cdcbea067e71dae417109d3ec4a96c9ea4e22a0b88cb25404e003c22ca6ab49083b8bba437c6cd501c5f268fb4a1defc685eb8fcd5d23385501056eb8d77afa5c628989bc33e9d7743d69125f1e77c40854aa72e58ea6f313 B = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c A = 8e2ba940fc5165c6c5f7f4cb56a6fc26f72d0c623eac124cf0cf551b1c6934cb1882967f9ebdb5b36cfd6d1fde5559f584db39a0ce8461dffbc0d35ceecba29e71605a6024f2049603bec70181c2af20b27e308910747b11efeec8a65d2ca886df718062fbec60bc322c6829801e3c3b5b62d50a2dde0c0075eb335097a9d9b6 B = 8e2ba940fc5165c6c5f7f4cb56a6fddf2592e9a694e5eb8353684eb05b940d5f643ace64314e1b29324f2f4a06bde7f6e4e84680eed276f8eeb02fe242dc47be6bf5eaec2edf36d4320db0cd22e95cfa5ee71c86d3f78d43d9a865c3a6a7a007afb98052c033d7eb32a0650810b3deeb9a07f2413df201b4741ae0fe1019f3cf M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149 A = 04a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261 B = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656 A = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228 B = 8e2ba940fc5165c6c5f7f4cb55ff32279073391a0e6c975206452902a8c522f8e8a014bcc239720c346bbf7df93506eb95ef2f322138dba8b5df6db51c3a381fb2c2ef9875f5cbefba72732dff4da6144c8f3564e5385f277be7a637252a880bfea80ce2230b88491c40db00f1138a8b08f830a673ce4a7cc1d9f38d35b283b7 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e A = 8e2ba940fc5165c6c5f7f47d631d62a2259a038a455598cf900c13317339e33a90c42906c2f9cab8056b5137a3a5220062c0c6b3bb88ffee3b4ab453b8134e976a8e7c3785bd223c31c96f46ff59705e688a427b8bc6e985c755963ab731d779bdd1aa54ea223b62f5b707c12efde079d98187f7d7edb00bbfc0010f889709ce B = 0450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e A = 8e2ba940fc5165c6c5f6b1005d11466abfa370afbb80500e54891dcf47754289eb6dee4eb33b8f37749ad543fc8a178a3f580832b977d8aaab2ad01c57e937fbe73efe0aa2ed20c938766a5571eeff14415d1a954d3f26d7ed1063eb01ddc0ee2e29e6dba9ce9c9d4df20eb92b0535857020cbf05c56113ad072c3a167c34056 B = 8e2ba940fc5165c6c5f7c4a55ca1388ad3f286db5f7286c8ff8877b65dca8d7802812c6d30da7b2d743eaae7570493cc8d40c8ea51f418261e84880dac7ccf0fd1b338a61c576eb456cd47b4ec89a3ad6c689f58db3b3668938c66f850754ec3bbdcf95346dbb440bc08d1b98ea6e4e4f7dc2a9ee93a836587d6973c4121d326 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb A = 0499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99 B = 017a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd9330a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a A = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8 B = 8e2ba940fc5165b8e2a1bba60f58a9da18716f19b8a69f9e6dd8a39c39ad4afba8caaf2ee532d61955674e56751994d9c656debfd5b8fbf448362f09feee6bb9df2c31983cdf1907dd8340ecd309ac805b9beff1d5d9755e2b07d1a21c7dd093691b9b2b52ddbfcae977b04b6842c6d8770bb890183b60e33cb1c9425f43c312 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 01aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc A = 8e2ba940fc511613e1fa122a9053ed96f339c11f7407938866cc974c11575b3b8a0b7ab2ef456a6d2db6e40073d145c52ad2b706836eeab58d595a0e0c39c6c91de40d0c1bcd6a9e6a630b510ccc1b2ca0f1bf1b3ebb3934140ca50f92d522a253af48272d89b40e2111e88b0f69a848871c0ddb492c3d7ed919d5dab8f6c777 B = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc A = 8e2ba940fa9f1c57ccce38642664647812a75f9e54c688d91189eedb1990fafa2cd1fb7554906bf54ac082e5d490e800b2af5c5d3025d5e17214f3dc85905f9625c9fdb98e666b19ff940f1f8c892274c026a99c3b2e86878d459a40a706f3865eaccba6f04fe78d91dc407b8481873487c42f8fbd4a97a1c6fadb821ed06e86 B = 8e2ba940f9cdcca65b1572be300153d71cf1f72d9a38ab77d742bbb505e138e1110501f9f7459e46e10c2913bcd189d9795ef2790a669f78c892ff4e8dbda75e86c90a2153b2963338d8575a8c64859ffdadb7069eec250a126f1eff83c0f89283ee408330f5acfbc6e1e0b9f90abb37d11e5d0b07d27670848846bbed6f7851 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472 A = 0796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6 B = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d A = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1 B = 8e2b0626a5045573c013757b969a2f422cbe330fa813135c43734c1834d45c61214a6edbb164530131b81a0db29ff27f8a670a93331bde04c9fc884d805e49456b2b03f111696d5a310c588a0c9b51f2fbf4b248bf1bda761fd061a7a234eb33ca90aced1f6fa567dbcb7f5a7a3b3df1546b0bd5e15a0bb1a051884523853ad8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd A = 8dcbf983b2c404b826ce3140fa3ad7b7894f577b26d17971cc741a6b9854b853e293878136828beecc7053214fb1596000fb4314712a5e38619ee38ed88068a14baea580080050f16e32c65a5cde87f7a14ce58403385055c3b4837853a77aa23793c8fe14140ba5c424f9707080752a01e4acc1ee916c950afb505015311b4a B = 0552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f A = 03d2b4ec637124206318b20e6ebe82bbb0b3b90e6fa82a13e95dfa1150f0c42b9d8bbe49a674b18dafa71477336a03f4084338fe670df97f25eff08b4299926c4081e112e5a95f48663108d02906730d5cd798c1055b0c3ddbb001cad8b4e56792d526b6b18d6460a8fd4c52a3f541650332afa575ab73ad0209feb67c071763 B = 57e1c76664d6bc3df10a85c7e0ebc9e0f8a40a4a8c2954e648fd657a2caef53233e8375ed863819bfcbc08dc36e72f88af3835c70cc983dd82958aebe3cc85ffa40391e312e6302da870ae0d862f0554df2d4cd18004d983b38f2b5a1235776a35fb1ada3483b406efe006b448a7ccc51af9ac2646d6fd9781e07313b2415242 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad A = 5cd8b7c0da2092108c3717a3fd14da2ffceb9f40a1bf944c4016ae338fb17d932d7ba3347c3dd4be4ba1ae79620e68d20a59efe1ff1a2843544109d9a189809ea872a69d31708d2ae9955e8719257dcc293fe9ab3f57cb7329cd26ae5e87c93fa0fdb1a3436d24b547afc66caf029a88cd020344b3210077af84a044548864fa B = 5d99d7a7c2500c33b40676365607fa94efd8edee4bf352346c7269791271acef3edbd04aa15fb909ff20381c49b8c3fc2b56bb57f5066dc4dee5482abf50e57e31ffbc09f7fa837d6c45ab1829710aa0827d8ad38186cd12d4ae931c5367ead9830dbd5a8765963ec0464d6aa6c392ba54d1c3448feda0a5af10e33a9abdcd07 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d A = 832633b728946b3d84faf290c00d9472a8d190fcdab924afaad5e17f6362ba6791e9c1ccdb06d611d3bcf91deab8a59610ecf0c128393ad7d85c01de485fadcb249b7144c628976c7218f5ac4065392ea01da1d68c5ebf91a49bdfc32530b969c4350f76ed7880766ac67dd864da6b6358c1bdd67844b5bc61eb72d38212ac61 B = 415e6e6744df0741a8806c80f13bc66fa2dbb15e4df697cb199ca122cfa1b3654bb16db15fe56a750352c41b58e25dd7870cd2f90eed089fe62babb8e39e8448010d861ae606b7d595970dd52a526183a2f8b7bfe761ffb3a32a026c5647e09e83dce75dfe5b697a1d92102f5679b8f337d95b3a69c8305a1fad61dad2737c26 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca A = 08c4b48ed89e8e8dd9cedaea845bc8fe09ab8391134a7300224a9b127e8dd620e0a83600f2d15c449fb64c1f07da51e12521f726caecdff70e928664ea6d2c40f8771d45448479764c12efd179a39def63b887738b2b282cdf8f2cc2845d2d4726abce29d7034ffcdf40cc632386c476cba9ef65b1d8de1711070b9af78271ce B = 23261f6f36e21c2512fbe4e2512e4da39665f8f4060f085a2a86a580f46b4997c961e11919b6e7505d0da61128d86b99c37486c4919de5e2040c845b829b913eeb022ab0170367392a9598b51138ef0c00af91948e4bf08e64a1532278b99877f23c750b7fe6741ac2b48300d7d0234474314fadeb740e1e04a00676fa2922f7 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f A = 67026f46f89b5ffb44960e3229a4e81e2c5884028ecfb34a329c113b1125a35717740d5fdeaafac5967c4a9928e6497017b0c0b29429d3fb71301eed8b3cafccedddacfd428d4be8910d5b694ebd14c506f1631b45341f2729cbbb2b7caf02b28573be48fc6bf3c8a5835a424ab79a3bf2e62c7c2dd8d9601635bf7a28786c6b B = 6144c9c7a2bdc1d882ca1bcfed3e1ca1e4f89e6678cc04940433d415ca74784cf57b465d1288b18e5ca5924ca769bda3aaa1dd6bfee13f46c985786d2405378f400ab65425267856e54ef4bdb2e91507cdd023517f87a94e349c625ca79e57f6bf025a770a5654039834b96814af80a47d4deae220afc9ae7be470e8986c62ca M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d A = 38e10202997872f9eafd13a4382f579a6abd4394e69a7fe34f2e17dc3d855fca8cea470ef550b6c2005b141665f7d054b052f82c7a66b40680e1f0264eaa9f6735847f654b948fdd127d9f3b91fb33aaf7271723af0b51932596e6dda8ff0c5dc45b8a283d3682c6cb554ebe283512b3e086879dae357fcb8364baf75af712e7 B = 355a943b90003754968202c6a98a983ced7f66da5a89175e95b6b5ce57d87a8ab31b33d52a1c54dbe7a52ea2ae6ddc91ffee1f498d1e210f243d5336c7f0453553971b962e94a94f1d4358106908c736d929f3c139a26098fe14522427c615a206f4c223d809a93c310387a438d439ecb0b9abf38a32d5246dbd0d6700144144 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233 A = 62c18b51ed61c3850fe76d89266e5a947cca047796f29967a6eca0ec23c8b9813709df26c896c6e8defad39527ace9c5efe319d0ac98fc796ce3ef0ee12aaeb13f9bf75490f7a4630332105589ab646aa05c18537820a1806cd5e4fc8abe18fd612fc22f22e0eb1af386d011595fc27529b5c4136c15c1aa5732fa93259742d7 B = 89f6646504ad95294658ae769e1a79f7de32ababdf36d0ab67469d0c1a69ffeb3eb251558226153bcbb436a5c1358e9b3e6eb7ee540ccff6ad186b20a2f0ef2c730ef19727f1d33f9ad17353a71d7d46faa385a3bae2c44f7ad6db3ab43ba3ae9c10e9f2f2d911466d823ebd4317328c904dc464864fdf563a8445409d53ecee M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e A = 179be517743dcd4e06e8f7a217f2a4726c8b3461c0c1da9fc0f2c96b924c1d588d3e54b1b0c970b3851b1dceeee6089247a28f029eedc3959b4b1aefa44e2c3fe370ffb4542523e65629cbd07190dbde3c5a8ed4e45c07143d06ce880fb15d0b1439714ea48271a8cfdddefcba01eb9f1cb4fb825577363c19be4a0c6cb1c2d0 B = 1c46d2fc55b249973d2dc30d0385423f987999980e528b1918c8d080a59f2790a59e21cc855a76ba6438071c9f6204836666aec5888cd32ceb765263b37919a6b34bc3b1da853ab8955468aecc5c09997777f34ff82453538488523a420824e3835d87b2cd631d07262f436e808ddc64579dc452afbaead9e5b068363c1d9d72 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135 A = 452129b508a60de52c82622985b9bfa12b5a4a91604017b675fde339a1527389dea5c126ce6d8a18a84bef68e10d9944ca9fab4f7e305ec20fe70397539c3f0b75048d4ec45445fd081341d6e7483a4993e0a20a74f10727f89f326edb3884544a87e6d4860ef23b3f9619f0fc24a6f2aebd0aef503aeda46faaedd5d847d703 B = 39cea0a78df8bdc3413fc2cff3d15d81e33ce494fa2ae94ece6969bd9a0658fcc687b1e5c31d10ac484791152fc012a59b954eaca0ce6da84b69475753308864299350f52bd65f8e50f2076794163e01195b94daba7f6a2a8f0a60ae49e46ae2c949f62a1cb78d49a1006f0efcc51ae81b0f1566b50b5363025ffa795af9d1b3 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c A = 0f4eea56b810bd1a0869d3cad0bb3dc823f9ae47d81a1cfb8e872bab2c1cdc49cfcc5f6b970ef7762c1f8803e469b1cd772909f5c3f0c1f342cef54b47cd7bcaa19c0d15d98cbde8f596a0c5e27c04136b581b351dd855f1c8e04216027a454933d0f5de0f43a1a758e696856d2929eaf02c281617e05fb3f41e1da33fb54a7b B = 785a1e5aedc264203f899ff52bf6a1ccda3b9ac6ea29ab867bf2af9605ea088f5de20e172f3b5b2a3d1de676ab203ffaf07c45f32dd82df33b080647b3d7c0fed9b66d24f4a5af1369d63718e896443749f55f9fdd2f5d9008185b086022f5cc65150f2e9d8462234c5ef57118c2b92cec80efb2a853123c157a34ec2363a188 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb A = 4493bb04deffc492cf31f39878767cc29e3b7421904a730e1345a6280d600c2f90e298fa5ca14da726579413b520c26a1b98eafb05f7c9cbf0191254837cee14f1d28d8f16d099792430e4a89636006cee4b26e5bcebaed25bb7f12f3e409218775dd7b91b5f4f18f6173035cdf8c040115af4f1a539f684c33e6491e331c1c6 B = 0f31d7128ca48d0ccfb0b44d8dcb492b26278863797bec9d705e90274a01fceeeb94f2d87ebd1be1e27766d50d3ccdb489bd7ff37209bbe8a553aefc6ee6064439d56ae12b0b3309c29216aa5620f81482d452a42175b466e123dd33b8f0e6c287fb4a05c346f261598c2d1a596ec2b6b6d6868a8803ba311f91fda60577cc47 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511 A = 07aa39d8bbbecb27551eedfc95fcb4d2e16a546b9370714638a57d0a0aae7b828ee7f406c53719c1aceb08f24420fff3c48c5c3ad55ac58b8d771b26d46208f0f2ca4b9a529592e77e72a79d245c0df66b4eb98db345719104b1bb402171a76c31ec6c1fb4a89a1ddbdc0cdfdf63ec1668a6aa67d4f059ebbfffd34d81733955 B = 3fb86ebc3d9871c0ee555c8b58171f5b902890cddfd56af10363ab6501f905ff71b956a8fe05a5aab30e754985cf89e0b57b584b19baaf13de6033b90de7e981a5c0481e5395c722574ad38710a09467c78a4af758314ace4b916b66b77254d5cf3651c604e2db74d52a7f7d6a0d6330521130a7d3d3f4abf1188ca05a94c625 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79 A = 4f61db5497413668948f9dca639fa0b8c309827d09ba1bee51c9b9cb6e2505e1080e9f37b7ced0429108d2865be341d28a8dc113d2fb0c54701ba26b447537fc4ae4e9b663e431c21114edb04bfe80ca5ac6c8ae544db2a03cb886a47cc3d02895c12e358501e4bc0b78f11dd0a9e0b5cbeb93ca26af464a4f941a04d96caa43 B = 07012f2a22b4feed36e3c42564d8e522d636854fd67d0cee672752a49d7d662d3a402c462b44e55d4cc9f528e8ecf5192d823606ea064ecb07cbeff7f3f8981f0c98d6936f78b856e55087fdc349c41f178732c63c86441a9e50f7540a200ac5ef0bc456818ea6bce8449493f78376247a6ac5ceeb987ca6d593b042970500cb M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e A = 7d77c556f07bf2a064615d8fb92797ef10a47ee09b6a0570bab9c0a75f6c974af941c0616a3dfde8207b2e5e521b1ce0d3df0d472b2fc2525afc382ead0fbbc93b4b3e94ee5092fc803ce3044a4177023c44f1ad593610f6738471543d9038915786abf1e80b3f88245f1fbd28c7c9831a99a286f63feccbd4cea9cd35998be9 B = 0edf46c2f7d7ca2c0104347292bb7c2593b3e2fa771407925d2390564d3002b11092b735c0df368eed29b09c0b173d1d438a0f80c53311751c0c0e8fb489dcf6ec9113ec9598027fba1d7512d00d3c6819095e654f530e58f7e290b6fc6d08e383a6d6eb72c9e1bfc7da13cc9329568357207f127db545de6283682a81aef02f M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b A = 559a8425772b6bae495d89502ec0b0f612ce05901a75f5b123b9b739e83ba7288bf50d9f1d60a35e0231bd55415eb627547811f9e1d116fd42fbe05b55ecc65580df3274f04216e5b8112fe355c616eedab5b884df886f8a68268665779d317e8106a91965df837fa7cd8e243d86ea8735250ff6e52e9dbca9eb4fc081367218 B = 27d368393d97aa7053f13fd6d289c8dc75e95ed80902023fd4bc5d451dc9f6f80a1c9c9093764c7fa8712834bc57ee79146332ffec2f99b4f53ac916c4fc42cd19c6bde275bb6a1086ae30ea83782728383dcab31727182fb6e3f080309b5e2b64681c57b0b94d9b22f6f6f7de7f1c0f6a41d15506ee0a180d4ffff0a41b3d80 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 0be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d A = 2c8d9eb4e2a58670184fb9c00ffa47029868b84ac0142f439a79e45f81440d56961f9a141d7c93ec675cc8f919ea78c94a811521c96275e3c37ea3b0802464243f6ef8ad4bc80592d260ed1db89d1943148eb3fc7af6b8637502a39bd1a0f96abfb0b8bdf190a4219b316df401fd89b6cd62a005168e9bbbe4ee212aaf6d6597 B = 0b62c2b93aa90eaf11bdec69c71db10c98634b260bc38ba8b99f5196163eaab0ebe5f5d8a8b270ff0da4ff4d1455230db7b10a3c91b4112d7cbd9d7e9a11978764524769956e869d4c74085ad7db55b519cabc90d3b8ceebe16b6f79ca4cff4372eb4785075f850fa0b39d187bf78470bebab071130ee81b84a4b2d428cd09d6 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec A = 80f8ccda42d67c71e2b300cf66dd8004796910249f21b2dae58fe8a2dd397c2e097eeb590095b7441fd99c2f8be6782dd31d1278bf2dc04cdee056591084ce99750b1c00f8adb53790cedc30304243bc6f745df5063fae339b17d47ddfb5acc84371e1788e589627c30c90d03f1cb83ed6c2b318f14ae7ea362531e19ff73834 B = 2949c6fee310778299a7239f3972d7901a434328400440bf455c59ac1befb910af7e66460467880b85566e6645b284c0ff489f81c93fc4bb09384c294fe0a5bc9dca8d471aa5e3af2d59895fe80471171c294fa3033789bb171b7e9c5d6f4d402babce5a598b516c64669cb66440b5757022b40a27a1aa5ece6c3e496287c8ec M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc A = 5cbde68abeff0a10330ffd04371c3dfc3027a2388812cb2b5586927d200ef3a4571960ba68b4fd8afdaee122424dc12f411d3d199537692e4cbccfb87fda40a50fcc2928e5bae460f10752119f46041e3377ca072f28a994826e459a5081fb923011ca94dbc635e4d16c144731ab0a90be090d3425ce59fd48f2bc73e3d56b45 B = 3d680b0583f51341126fc355c7f65186b77e9a239eee80ea88e397612d1bf8e8f50ad7175b27fb7dceb6d93ac46efb41154b2fea43118261fa7ded03e72e48a6f20610cf7adeaa308cbb987576de3d7f0bf7f8d6836d62eaa36c59fc7defdbe23cf9687038c3f2108581ed86c0071fd67d36082a7d50de10ba891830cee92171 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158 A = 0cd89a84f0db9a32187b94818f89a93f19ce1f85181b88b2d657fed5e4fa85403a59f05a2e8fdbf4db8147c5d4a2b8ac33558a1195b51bc7460cdc6f393c4136235a1d4bd14edf4fdc74f4224ae57334e28c45cd7fa5abfee294a4b9d3d86c2b1cf1ce6211447e15d15102fbb95d16c812f583af13b7244da2a72147e0f7b3b1 B = 2739adb776f387626bf0e1534d5f0ca0947d633d357af4238c906cb097acd033a224f12bad014827985a976dc93ec8ce625e62ed3e035295e0f50f757f52e1f00f240c3f422d319495921c590902e9f15a57731d3810b7e319d57b18d99be2750af6b475e1b8ed2d788a2dcae1736dbbb66c97f61502b8721a38c4e0c0081151 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745 A = 3c01ac611a38dd8753dc7f9412d7cfaafc28e0f8f3259c692570d9340e443bde62045ce708f12931c365df1a63100c51279ffaf5eb9cd5fbe4a0d5e9d361978590541c4136aa0102d83eb3fba92c6b4b7b56fbd7161628aeebbbb6317a99f4752f13ab189b944f4423706ec58dbc4f3b601905f5125fdb82e8d5ab32c01cca44 B = 87dd023be26dfda2cf0f97f7643feb6e066afb10e143e4497ecd813a4403cef4f00dab4c4fb45d6e2f7d11e43159b2791598acacd3accf342603409ca0a8a5b6a9d7e95e08d6af4e08fc438ce60ad022ca042e49940141f83db841b6f9386fd4aae6139e921d45f11f8b0e55fad6736d77f6d0805d4b77bd7eff96121f489d0c M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950 A = 1905086d5baeb48978c09bef95673d3164a6593338c921cb80436fb6cf623a7692de245ecaf0b77621441a81478c08b833110c2e8ed60d2e386977e14815a79c78d6238f952c26cede7d30601411b23e337f12e9dcb38754072bc2780dc083ef234e3e41efd91e77e9467d901b1818d718dfaf29ee1ef758a41d74fcd96f1382 B = 6e52f31eb94cd75b1a5985454f87b07d2449479299c9767d0b2e8e91b183027d2eaff0039b60de6be980a2556197a1e5e268f3149041690d47e93ad82ee48802ee045f455cf35b265e0268e905defc63df179a11d6d28e0451eccf24a478b2a696e17d5ee2cc194b2805d3ef25318a0401dc6662ecf43822f31916947e0a1da8 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a A = 39f9d6a8602f69d9caa78a6680e86232afb933f8087bfee6197706aaad1b5d986e01a23ab0e68a5d48615f3e95d1cdf3bedea4a36e9404b55061b11c7595e550e871dabeeb2f77aec6db0c62d1d1f4b1541c65d5fdf54d309e1f1b419f98ad657a9bf12de0204243887de1efbb3283c3db069ad3288be1c31b6bd8261f1f7f90 B = 3bb5fef79b7f3c7a1abc9854fa661a55418659771168f02ce505255619658517385147e32abdbd4b1570320041deb73fd3756c46bacb4ce19eef7d6620fa20947e5d7e4fb97a90d1d9ada857b55a1775fe1a51a8744ba504f562930f116623b0e01bc264a292c0215cb6e4f1709e952e9e37bd2c22243eb218fef8ad1e277dfd M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82 A = 7d8a8c8f86383c51df46aae55a1b2125db3fd05a10113b977bf8c6c217d558501a50cbdd66a7faa6d3869f760d39f5f83eca0d2b550843819c716c69b9ba5c80c171d8a5e2f6445d53d1dfc0775d28b26b78175e27571af7643d45495806a890a8ac24a7749b6c2869ccf2641d2dc51d3a2a2400b4b94870c8b34934c8f0260d B = 151f9170ef6b8731f80be191eeef40887a11a9614a370aaec248e37dd1e281662d2f36b6fb9980feb42f7946079b6255134033be7e5a63737c0c2f035aefab18af0ae0f00f597c1ba60d2c1a77dcc33cd660934c3640b0bbd31239fbb9f3a7ec0fb3385c70582bf75bce7ce4f35c3f59429b5ac8759cbbc091d7e17aa10cc905 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3 A = 063815fc3637712e3dbccc140f837a689488bc3585f8df9b5f6dddc6379f65b9029b5e5fe228c257575001b257e4612bb3c3884ac0ec5e9b40b1ff9024022e55f49c9ee2519681d4d9969e97f78418555bdad61db7d99784227774d06769a906584bbaa02d8c4adde53c37cb2c9c63a4390f39f87e76606a5f889446586b5214 B = 61a95ac8d7450c1e84c4f878cf578a36a75f9eacbb2fa19ffb6452bfa8b326a703f48e09cf56f95f67cce9d5df6813be4d29c9021111a3c30d8454494a3d4e89302bc1912ad9de486066059bd0374e55edbb5ef90f380d799b4ab5ed0d57bcbbda3741aad1b3bb7702891ba4deb2ef2c76f2e9603331565a96b085f2aefc05ff M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861 A = 8cd0fd6e7d3c80dd431bcaea37c32a7f49af6fe2b5cb40b3b7b137971e321b7fed8c83a9e3288882509f0c862389c5d8af892b799613f621fc03470d8a0505156933f7dc3b2b813a813892067371499a316e63bd9f94681b18ef35ec046c2f430e54d239fb4ae3daf110c1654da8142e9ddc0f9f3a6c98a1d46cef2f259e8ccb B = 73123b70cf137a3c0d3bbff4d81547dd884bbe6309234be5d7185a8a3de97172b7e302237d0b8300cfde75957ec4225b2cc3264cbd73125c172cad54bd0f99b327a98761ae4d15521323f14a3727bdcce3da113ea2f26089bb4c775eb540c4527da96531330db60fe72db6a4a43f7d4ceb21a06d2f73652c5a23bcdc89056029 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c A = 167c0966a64416255c97f30185c67f3b1c39b4e1cec80da6fcecbd56639590ef0916121df9d8b872be7365d78db36b7d995d7a422340355c03c5b8e8c735422bc5fac038434c56ab278995fb206b8b01e95580d95de6ae87b4fa885eca58f86dddef351aacc9832b87daea0d29ea8f75c414980c354516302b64030ceb2a58c0 B = 75a596c8c1d90226fdbdd0872ab3f6f68dd2614465790bd318141844000fb78d01c4de3edde912256298aa806bf076bae134d2bb46954aa7b11ecba23ee42adf0c49b19eccd4a37c919d5424b7ab7148a8d5a16d429d409903e399ae078b4c6854c872caa949d2118e5aac44c58dddf88da3e613b92d1a93f92ce658f9eb5aca M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce A = 1dba6d3450c6aeaf768b5f22560d53808be49609dd7909e3291a684326ab94108d019735883d7b2e2746a1349376084d362d9fcd233eae998c4c4e1298e040e7195e4eb18c0e8235482e9df34fb7ead4d97e07ed298cbb6dc1f6cd9b43ac0a3c4bb5602f72d1cf4ec969200e541da69f29055959afbf09568b5f058eb00f5b71 B = 1256752129bc0749fbf301a7515b7da2b3b02e4867ea38ffb8d182102a0560de5afd088820faa5fabfa891ebf81646476e914faeb94ffc0f1b8857ba737b03004c49726f098adf08fdc079926ad127b04f9cfd108b85dce48985491668a8fdcff33e73c09ed7ead2b10e3ffd7e3018771f48f5dfaab6cd613eeeb00db9e2c5fd M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68 A = 1fe3344276193338b148d24a283da1232a79e3c4511c515cbc656d51765639791d33149435ddd0203b022ad6792da6db6d747fbab3b8f621e396f270a8cea2ceae20d2fe35075f26899665a530aa885120dee3ad0ceae78fc90a4ab8b24768bad013a3583cabf5f887d32eb9d7b653869e8f1d02e64d007fd2bb3a1ddf1dc0ab B = 771b74a9409159b2390b2e2356fa4d234e010703634c41a0aaa3c0bf1f86aeaddb225f6f1c00ef02022ef365e6893060927502aacc1764c742939e52bd0713708c9f537b9377fe6fdedba1c7b6932fd5d9554d4e4728cde31311fe4a597f6855a134c805a1a61491e9413ef6aa639e0943a8d03a6f4a04ba23ca83133322d581 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866 A = 7a2d6098d57699d749c4586436bc7f4a2a1813c5584e315cfd268ed87e1798f5e86297e0c35e5ec7e2923613325831d10a8f38c64a48d9a21c15736ec3b32dbd9a2dd6c6e8aeba8280ce7d13d0ec83335ac6e4b7949973f711dff25d8a206db602368fdea2fa68d5b29f8bcd923462bff0bad141ebea067d64168b81586efb27 B = 44b1244138b185fe57267e68dc127801b7772d9c98cb9edad0103a7f9278407b8a6278a72084eb0df065019678e53e55a47591ef4871272b5a55eb643a300ae080bedec742dc8fca1cce92b54113c19cb5feab2801f26f87694de2351e056260716671771f843c67bc60398ae66631e0658a892fd408b955aa9467e89255fd7e M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069 A = 7d3ffacbc5b44ef4e8b876bda0aaf996ce8468a2bc9c90eea56ad07b459667b226c7f4913e8a26c76d7897e8416728255bedca9d3699342e542424b6ab31247015b87aa73caf13762ff7f4982e9d5ec47a731aeb5237bd0007ccdec785ab3d36893b3fe95222bdc80027ac067d92e1e0c2528e29856287704a767a83e9e8a10b B = 2db682f1ed91a8f6aab4711a43374f7ddce626e2203844943923327a75560b9358caf635a6a0367a871adb52cf1d69d2ac16e029f1386eb24e69662a3211498c13134007f53b24e8cc19dc8579187a44f71c39692ddb63c97db6b495f2a477874556f598de1654addf4d2acc640925e8d6dcb0cf8aa505ea94bc6d32c68b6ffe M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901 A = 7c2990afcd18e3caa1fd69d3d34012df8f224b31834c6caa18fe955c9358aa1e5baa5d5e55fd8575e8b4842d0ebe1d085f5d0b265d85e1c410fb56250e5bbb53ea1c877a01508199960da3baeccbd789bc18cec6f5e11468429131d4ce6ba21ed1d3282acc79f1c712c9e100701649076c6619ce63687a584999be1fc36c637a B = 2da8f89ea6ed4852352fa7134218a60afe222a13350865dcc5386fa0dbddb31104447d85e747d4e03c14249b914ee0e33810c26a0c9642412cfc87b7bca63cc5474ce3a080a9944a9ecb01687d47c2007e3304ceec2d2c3fb62288d707f12c36a2a3a4d7d4788d5e02e7e6933484fcd0a13ea34ddbbbc23c43c987b29e6a6566 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b A = 7acf033f16023d08fd1ce59bf509b356780e3a3f67d8e51d113acd842a2e631f78939c7ccfb759c2c23d1f6551df12a37152d310ea3c87944000d693b80a8348d4e2d8deb20afa2b680d60d175885793a356909e9f30c0fbb86416387b6fccd5c283ab24c2f25975d03f4f63ead50677d4f36d4abc6a587e24f4f84f5a479d40 B = 8d9fed484222a3b0feae346149e97d6d426484a23109dedf713f796f2ac4869c48052619a0c6dd93f83a2000ad2e17ba5d07b03499f780795777b60e8a6e029b4192cd951aeb96110c2e7f9b222e222ea1b3b0f6915ce082cf89bc9eda3b093a6d6e6073558d639e36b338d39ee1071aea397af849776ddfd3b0fbae1bd22c7e M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3 A = 5fa80de456bbca574fa714911b9ca94af1173eb72b070c02ef2d9d309bc9a2280da161737520d188f7773713b49609d0f464b7f9ee4e6f543d7b4afe587f5528e48dfc5d0f57e2f80854d19b1a79014d7810307738f8ee9c95ebd7a14f57dabd1a65306ad9490402cd5197b4b875edb11c7a8c8a2d84ff18c90374986736ae30 B = 2b8d6d657673207af8dc9736ae4403cbe18cf5a7342db3a642cd64cfee3c7169626d964a11f0d729f50bf4f1d168ddd25925122513f212b22d469246a5d29139dca4b672c05f5f0fbba8f3ebb155b50827222509fac81a29569d3afb54637a23521297424b038c7d494cd17f034cb3f4391618f9be7b83ef9eb0b9291204cd8f M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf A = 0b173f5024117f01e232da94030550f07a8238d9bf01f724556b8c9f2b9844eca40739099b26dd07d8e7f987cc990c4219fd6b85928caa5ad34ceb345768a3edce117ae13f8c24a0fb1bdc7a447f17a545801518e4672699461b90b49fd063d1e9a9282b92a145df17abfab8984a08b12cf99fc89669b84672f2541860fdce26 B = 63ccb7ff8fb3f8b0b81d40ca99315bfd75a59b7094b349bab7964707e13d45c5adaca7384f9528e327bd7e581ee626e99afb854ca310bc712f63cd54071d22944a20d722bfa2dee0b1df774b36fcb22e383120122e34d1cf03d89e61ce08d1a2b3429926a6485450c810edfa32e93b798d1d21b2837de2dda41ce43ea92b9f6b M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0 A = 0a1b0cde1403c856bf5060fb62659d4d77168dbdd0555e143f913e4e3e59a85c2f5acb33183efe10451011bf55b5349b580cc4c77b0c2e4e43c3701a47ed77861bdd1cfc72815648f9e4cebd0ff5de14569c9e2fb4f28fe5353b6c02c29e5d59cdd85ffb4d7b00cc838fe94efddbb0add5961eec10a305d8717c746640779cd0 B = 4adb59a7382dd54a507e5c43540edf84b787096c678eebcbd518b92bd18201bbe08bee538061036df61e7b776d719bded24abb5d9da435d9c5a6d65a8adf98298ac1940e92f92ce8c998858860efeb80e094ab12cbb762d1c08ab67dc417d52cf875f111bd296a5c116fa622a8d55c46791022f3e6c232b351be54509c472450 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d A = 842b8a197700ac4ae9ced798cae3568d338559d8d3f26f413efe95ebc71217d5d2d5a7a8bfc9cfda8f9df82aec12dd16b8ea1ec87f32445e4e69965399894c5c3eedbbf5125fc105f43987d88a9635047918cdd8fcaa66cce9b8feacbdb378894f80eebd9854cd0f8fee40977b0a460cd3d6de2913d3cd5c4b18f9b0d20fcf35 B = 76c704cc65ddbe15e475a9d2010cb4830ebdfbe0db44e2b1c8238c1e01c3dde1f7efeb872b1d3b248c1c60d2be99f998b07d4fa31766764e020f02582c6740163d1d4f65351415cd0d5f51b4777c9c3e7c53691043e4fce0f70347940723ea5ed38a0ba978dc6c9010c0c16a64175346b619fa523927bf5b0a3a96e489f1322d M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493 A = 4d424d97df47db6bdf0f0ce58e0fc09db1455b7aeed444c9e099a344a8622cba9f20efd478bd1f542ba7a33bb7da8460f0b6b0489b410865e879a490df70bb417db6f0646761dfa1898a032372e06c15cbe34d176567f2e4f921733a8190603dbd6d3dab47de0b14031d98ce53679c390231197553971d0d315b2fed8f6506bb B = 0f6d57ed815e0238a33f7028e552e40172546b96996dca7fe407f297164b5047d57c0b927db499abd6617199b62c3b307c9300ce4a1c8f03160d41004d2ad54a94402d6fc17521f1f4ceb3eda248d58de6d1660f803c45d210ea11f56c07c6bd975e533834c80f535e2d5afefa54857b3aea1381674c94d7484c7955459e8aaf M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280 A = 20d5bd41685173e10f25a46f4f276cb6b99e5cc361b4ea50e119c872ea538585d3255a005b4263fd86c5e51e75d83a7b923fbfc631d2b1759517e7983e6fec7035620839de347e43a814da4895c515c23b3dcb8829ee4920a6ffd2d7f8b3cc08b1390867c9de0d03f1adb06bb22b18c956026377f79322f78b28edac65823bf9 B = c24e1143b337bb49c2a51d4546d45b24a754d2df0ef7b1c424a2224377c0bc560742ae8c9101ddf0ade3a0f5bc74f6c2354f9918baf48ec5c5395cf7368a0c933730742687e82f71da221f72dd7a8136d4bf38a608d266fe663aebac855ea7ec7f61c5546cef55d629b5a60744ef06feb1e8d29643c3f7792bec897915d88e M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8 A = 7a7a8caa1ca12e3eab5b6c974852f45f53b697db1ecdd17b04c5de36a4b4c90984e68a3c331c363a2b0c7d8e2c5886a49fc8f433c0e641801da54c4f40cc6f2cebe9bdd531524c8d3a19d232b40793e7b568c30b07488f939a8a2893b8bfdfa63f26cde242466b82d8d5567387c836b2c402255adbbacc23914ba234078d3531 B = 8193b601cddaedefee05758ef0a550142eaa2b1fda6ad1e20a5a0e0d546315e8562781faddfe3c8271187a0d363673f817b3b3eff03a78064bd1c038297cb0cd749531c5acbafb87fa7a251e45291473d2709392a0dd29cc881a7d352bd93fe8272898ff57789aff3152f101afb73cc93047471cf52cd4f66f30d0d3015ecb47 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297 A = 2ecd5ffd075fc75b53d8e43a57b0d3a4846ecad5ec51cd3648aa734ce2ac560ac098efeb6d29ead3d58d8d90ad3051a800dde6637b2cebee2aa2d35b659c1f8952546baf3519a860b6cddfa17a0cdab71f80239b749fbc904a1422f0253453f63edf45ef4416b7f90dc07054afca84b3766716fe32f4747fecb1a290fcd4b5ac B = 565ce4bdc7eca8d5bd99cd99ff6fb8ee8d47f717a0d2a58c30bed1b4faa46a4071a7aab50095af5fddf9fdbdbf2bdcdcfdc01b5300c07c078800d9ad2dcffaff29b762eafd00851fa6f7b4bac7dcac547f4d7a11ee5a4bf3de51f2cfc55cd592cca37c67d43f2f12a691b8aaff2ccb90fa34d17cacecdf27f132bca026ce6d83 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d A = 2e930c17984ed30e28ffab9684c369fa37ca2f39f6d03e2f7f7714c9a7d8afd41c64277fc5777f5be047e78b06c294e6f13cc25651be8f02b49cff58091de0b6137b7c5fcb9045be33a250895db9bbf1436f8fdfbe5721f281f0d1bc689c07fbd6199ae567c35587b51561d9ee3e0fb650d85c825f63ec11c1ef043588abfd0a B = 4e5a846cbd6e04d987c003d84d4c62db6c3130fc019b76d8798d1d0f0f01b104e91e86a4c71ff86f059a49b5c4fdebddb77bc3f79a584e94939414481def37ec40f04f5ddc425044f4b13b5eba12f670da79663d89877e35e3f501e496a412ba99316bbfbfab65339acaaa85c01563792abeddb8a3262bb6589cdef770a775ce M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 02c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2 A = 34a806fb93c97f5a660926cdb21d66f8fb65f3585980c9157929226a48a9cf933f4dbfc8d5642f3a1cdb71f3e0f3d34a886093d1550e7a834797cf0a2765ec71bc40c0f6d1180e09c21d91be88057232fa9d0d321d6029eb65e8220963dc497edcd2688ec3350cb8d205000aa0ef0c7f03e5b9e310693f0f1e0c114ef3ceebc2 B = 5dbdd8f9e6a63c183f3307d1678402953e333b19b5de0f637c4a5cec2e087b00eb389b2be8807332843f62696f9cdd1393777bcfa98edbad0a6cb677044e0e3733c15742d7561ea119f0f7a387341cfe1b7e4cf54616f27a487a34fb761f741c588c60f9d3a4e28ecb7b1cdbc0292bbfbf00baa44bc7c06da9a00ae0318400c3 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17 A = 737962a54816deb28edbe9f7b92ced834b5ae03e65b7af3c70e218f9343f8a0a6a67bfbb163d8af18d40012111a5eaf873f48bacb730bdfa12991939ae0171a0758e101393fc65d3f58c636f900f6d68b7d3f45d05e21fe7271f477bc0551995018da1010dc74d548cdc576eda728492386086ccb225e80561b3217354d696ce B = 2f01dfad0b016691167e2db9392554cbb502d8e6018c8d95e5c9d830368ed80358387529df98b420423c08122852ef7969a5ca11c73b24910685c683fa3f0a08efdd4da6a06ef89336d32c0704851d361bbabd0163bff2b8680b5e86157a2ffa94c559291852520c1c94e65a59e2e3c26ac9c4deddf9029780d702e96e9129da M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8 A = 7c780aaaeaa1c54e74efb2e896b3ea0fb8be1dc263c73d0934024b28c932d5abf960a3a2bcf5d6befb8ad1f7a8c0a463b08638cf04dc2a65d8c69772299f7210445aad11a31dac561dfdad8fbd608567c9e872e07074ad13a47e2d153332b12074f4165a013134a79c6ba6020999c3c5efb7d01354db50bae7a4e4270d17a133 B = 302f31190e24f25cf3bd902c25fb1ce7463da9239df24e9da7c362d977bc5932aa39455417328185394301d5510a404707bc70304fe357c090eec66202b42dd871e1d37b3b75d563dc54395af212dacfbbac501bcaf5b0f3dc83ba88b362950400f977790346a9f7f27277272731693960eefefcc82f507077b5b63d48016d94 M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b A = 518a4f172c7dede92821376b9da08aef36716b3d4744b1583ef82a18bb2429b22620b27b7470a3a038c588019f6c4ebc6010f2c18441a0f2f50f4172b7c4b8ab3f178e6e4a60e38b5c928817f62a4561fbe517c705622f4c48e4ba788ceb1077d1e0c9c13c90ad34c113056fff45f8b1fbaf3c3bd7c1e3c543848e75f8116a73 B = 41de4428d0ee5534e1c77590dbddc8b86460561d2d9834a50a32cda9d5d210fa0ec5dd0cf0c4c3013b7eca2ffd48196c24a5fe08dbfe2694ee391bb950745ee67b32194688ff41af5886b616f8f109050bec544737d5ed8c00149b90cb8dda4f708d8e3f67141dc9ae34cddec5531e1090441114ba5b8e6af3338071c03e856a M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb ModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0 A = 0c3255cb24a813e27c3dc410f0 B = 0b144f39e7c2d33605ba7bee16 M = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077 ModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34 A = 0b36249e259b303e453757721c B = 0f0c1db50670d92abd93bdc84b M = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9 ModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478 A = 0997c4a7b537d9500d73a205a4 B = 0c679ce666af284a459ae5a26e M = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9 ModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14 A = 09a2b56a54bd0727ab4be57ff2 B = 0edf1781b4296567990773005a M = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1 ModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0 A = 0f67636b03821c8f13f21217a5 B = 08473a29f4ae33f36a0d2c6dc0 M = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5 ModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28 A = 0bd162c90bed25e84dd5b6b77c B = 0d887ee03020c5df356f091db6 M = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f ModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a A = 08019266c548982a520ab48eff B = 0d33c3e3b13576dcdb3ffaa796 M = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1 ModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044 A = 0a38eceb9c551f0e69a544072c B = 0d5f8e7c2d534b2b8985bfd213 M = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7 ModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c A = 0c170eaddca5295d6ec6272dc2 B = 0f94a5685ced7661df2efbd34e M = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd ModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438 A = 0930b04224bc097ac1d8bae8be B = 0b79496a80e45212c4663e5b64 M = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1 ModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650 A = 090e5d18b017118177ffb080da B = 0f8e7e09032574f6c66e623ec8 M = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11 ModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0 A = 08e57680f213d088ff1a1e7db3 B = 0afebecc9943b0093f87022940 M = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb ModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac A = 0fc41a9ce06e882942f751be7a B = 0881c05a51d1ba8134d126a48e M = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f ModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf A = 0c3b33f391e78bee97ceddf313 B = 0a9136f3af450fdeb245eff425 M = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35 ModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a A = 0acff8da571e1c96810bf95707 B = 0cdd23e5504cc26d0c34a62b06 M = f38902a99190ae0b5ef26849a6e943d651925666fea271fee7 ModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf A = 0e6f48c027284856aaf3b96425 B = 0b4c326f72a6a22fd4b93ba5b3 M = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab ModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd A = 0855f941d085305725da617f5d B = 08f09b7d2c36e0340523da5421 M = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b ModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58 A = 0c237eb242c40960861c938c08 B = 0ab2f481f0d768eebd90d2574b M = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f ModMul = 0761438baf5b02dc095b7040e082da7b167c2b9ace956284ed A = 0fd91701ed2151f8e994bf4ee1 B = 088b66e735b76972bccd9db182 M = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55 ModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466 A = 0ca6c51ba2f410d09bf71d60fe B = 08bdfa8fe5ef3b2ad02bc63c4d M = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb ModMul = 0536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d A = 0161d774df9a787bb5861d45ff4933ced42254532e799233793c81fad319c566 B = 047c09252d9efed9086fb2fb1fed44d7157a48e642a056824790d6e81b4c1f2e M = 05efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb ModMul = 06161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634 A = 05f37c973d1aadc7e8a15a6cc3d2c7b20d2c1e30fbeb7554dfb4cb93334edbb2 B = 06d98b39fc484fadc8eecd32c5d1652c3dca69343f07337e9d25618b3fe1b36b M = 07c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59 ModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76 A = 17ef930743334d382bf1f66d37add6e8ee819545997ea6a5c58e833acf159045 B = 28af21f28b148683ad053aa552db604236f03d61d398f29995b9e091460b7888 M = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb ModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540 A = 9231bd46ae8543102fb06042e019c9411c5a3b67f540d730f359e9e77f1f4645 B = 1c46a398183f9a162b211d4487ede53d4ddfe0a35661fa87c9b5884cd67f5df8 M = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7 ModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db A = 0aa2149ea0f02dfd92841cc2c44164bfa6d4c06f2bc8df7b2e027a2b82a60336 B = 16b9ed5257ac10c4727e467b3bd012f6ab3cb59b666e6f287bbe49e3c4a0f92a M = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401 ModMul = 0145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4 A = 10bf9cf97ae92b444afb3f94b355175560f9edc033f9635f29d97ae10e434427 B = 29509e418f2dd8a84ebb52ef1112df765987f1036149f6baf7be82c96a11bfe9 M = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1 ModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658 A = 8f82b047f3e2a9bce8699d4ca12ce4662b04239cb817bb36ca4ab5ed460bac59 B = 3caa56f9c57ec4862263e6cc2b422b3d8e98517771f8f7b95c87b44a7a202818 M = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227 ModMul = 0dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764 A = 1abd1fbaac8fc366dc669f2abf2b5cf4c710823f6c57d0fce95f34079c9fa291 B = 1fb2f5fc58e3802dd9cf0a72a99d0f9641acc9f1815f0face7cae83ef1a81792 M = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab ModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2 A = 6e30e65129c92bf2b24a6ce45592045db370f9411153de793e2af9cc0fcc0f78 B = 9fcd13fb2e81666f168bb764bca62894aeb6a1630bb07940708e6b1f374e8b57 M = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93 ModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764 A = 04a4f1814509cb369bc9f20d641848fa4358217818381d0f8aa4debd43d0ec4e B = 9b6ec67a72b0868053f926be4177def0e8bef7915ab48d239e6ca9aea4207147 M = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735 ModMul = 0985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233 A = bc1795a68aa5236a8c1d93aa4720717d4d77e19bffa34d5126a0c3d97f5ccd68 B = 60aac3751c58eef00fa2ee3fe096bd7060d05974175bfeb6a3f444010d789514 M = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793 ModMul = 0133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4 A = 037f8b1280f927ea374c105b87489355be4f9bd26cda85c1d76af4c6fe38eb14 B = 03ce98c25f69f6301590b3d163b462239f42e0202af1f692663b40d59bfd0982 M = 03eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47 ModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41dee9 A = 281bebabe6be0c8dbc84f47725180a673c6bc3c8f49159665f5749d6ac1efcd8 B = 48affb05091c691dc0c6ae2f0fe497be1824d2a33a87bed6b29cef431555f5c1 M = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3 ModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9 A = 6080c661828ae2be3bc23874b6f6b23a125ba03db461382bbb79a8619e8c0845 B = 39e1fcfd15db0040413690d12683bbd68ed496c5d51769fd3a6ad78016de0677 M = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479 ModMul = 040b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d A = 3a9479beb52316aa872fa1d97646419987d7ebc3b1f5009a58afb4d0126cbd04 B = 3538929797e8f26ff071e734a3f61aa99d36150b8feac5eb605fbd6c03fd9823 M = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1 ModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113 A = 21dea2aee0302de380cd990954b4a18e1d52b5f30a0cb70f06c40290c9d3c6c9 B = 6e1afa44d3135a7dcb416031297c91b1d4193490573b4050f9c77613579f73d7 M = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817 ModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855 A = 51f5a2f115ff6fbb007c54a677dc2049f9bd99e1fa1b88989962106cc3d2f53d B = 7e120151b055335cecbe78f2d5f129e034fc6b30ee463feb50cf95d016b1db99 M = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7 ModMul = 04452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6 A = 136aaaec4b34d7878effa8057d78012c897d1757a5ff2fa251cf673b793afa81 B = 19447559b08dced853b2359d15e098d70a3d04328a0177f471617d5231925088 M = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b ModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2 A = 0aa566b24fd87925fe8f9690f62586e4afb979c65419d7b11dac582fa0ba050c B = 2e0b85b7f590a1a8e8d0e3575ffd5fe12196b7fd066d430944181720e5134096 M = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955 ModMul = 036fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df A = 09a8939689b47fb66ac3ad543034302046a47c8ac325ee4d18155e2cafcb8de8 B = 09b568319788264cfc18d36fd50c1375a43f2e524fa44fbc65fe12c96e2d7990 M = 09d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9 ModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad A = a29e606ad0e4926a3458b5853ce04196edf42dcd88f49936a90655019b633ed4 B = b119f89e0b3ef234456b0421778e42f086498a2ec67bb32ab43bc8e0012f3141 M = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937 ModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6 A = 9e1693d9e37c1135acef80e49ae1a74e9b244a36179a2984f5c4fce69b1dde2b B = 5adb9fc6429f638912159f876356ff09157e7bff1073ef8318a1397cc81f89c1 M = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025 ModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d A = 514599c8c352c6fc850809c6dddebcdd61c6a66edde608e5b88661120c54a44b B = 059dbf4bea3fb19fbe0ded8c4b0c97fe7b2009fad54775c46d4ceb5f674e11a2 M = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335 ModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66 A = 15dbf10ef83b811d7ef146856243b071f11b25ccca14e62e4b7b4894d91a44ec B = 556803f5718085a69926a0b4216f6d17b78e1da6db3ff343b34a338a5ffebf0b M = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1 ModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995 A = 57ffc478a3080928ed66505778554e38b40c0f47904fde89191c9c6a3453e82e B = 4b11a10e8160e6e4dbc4ccf3075daa86943f90322dcbc0ad63f6a9afc9d94772 M = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9 ModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c A = 74ecd7b4f7e0425b4934e0f15949af3ee0f1205227874fb536df33ba6b16a955 B = 958ad144e29c894d6346d514d1e52eb0c561473615c61377f0f2c8f7cdd7cf9a M = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09 ModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688 A = 0c518f9c8afea0eefaf1c57283e5034b2b32fd5f64dc69f4baaf3c38bd337de0 B = 2e8cd7003baae3fc40353d2e9abacaaf4482a85014363393850e0593fd538ea1 M = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9 ModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15 A = 1c685e64660dec256a9e80822e029bfd90c556453a0b80311d6c1895adc6916b B = 34674001cd0977d54e600640c4d07510bcc0b69f6bf7c991e8a49351880348f6 M = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9 ModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244 A = 94d84fbeb43247cceed9743c5bb60afa789c674ef02423b0c21da2c4a059cb B = 176be45cf53003f3885361d9f4a1146acbf11926e7640dc79abc0f1c84918a7e M = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897 ModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6 A = 1d135f8832d2730000bb6489e74bf27990b464f2a0df66daee2b80445b3aeab0 B = 27792d4be70d7f7f3e6900ef689a474edd84a2eacea94ce6384289ced66ddf12 M = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923 ModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385 A = e769a7536b8df131ace032cd184a2e40812d83276635a5592e97a201d8770e59 B = 87adc45fe2433e78d6ac5d6f1678186a1daf336bed3c03ed6c993349e40f7d8e M = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5 ModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f A = 2e8b2ffb36d54495286df23d1a5c8d230c23da069106830c829c7e3170ddcddb B = 71105099df4e2dbe198631aef3475c60ac10828c7beec4cd8d027324ec531fe9 M = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed # Regression tests for CVE-2016-7055. ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 A = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 B = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 A = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 B = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf ring-0.16.9/src/arithmetic/bigint_elem_reduced_once_tests.txt000064400000000000000000000131101352416253600226170ustar0000000000000000# 2**1024 - 105 is the largest 1024-bit prime. # Q == 2**1023 + 1155 is the smallest 1024-bit prime. # # import Math.NumberTheory.Prime; # # main = mapM_ (putStrLn . show) [prevPrime (2^1024), nextPrime (2^1023)] # # cabal install HaskellForMaths # ghc -O2 prime.hs # N = P * Q # P == 2**1024 - 105 # Q == 2**1023 + 1155 # QQ = Q**2 # A == N - 1 > QQ R = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9cb3b A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2644 QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 # N = P * Q # P == 2**1024 - 105 # Q == 2**1023 + 1155 # QQ = Q**2 # A == QQ + 1 > QQ R = 01 A = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b0a QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 # N = P * Q # P == 2**1024 - 105 # Q == 2**1023 + 1155 # QQ = Q**2 # A == QQ R = 00 A = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 ring-0.16.9/src/arithmetic/bigint_elem_reduced_tests.txt000064400000000000000000000423251352416253600216250ustar0000000000000000# R = A % M where 0 <= A < M**2. # A == 0 R = 00 A = 00 M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b # A == M R = 00 A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b # A == M - 1 R = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033a A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033a M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b # A == M**2 - 1. R = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000 M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff # Test vector adapted from the regression test for CVE-2015-3193, A is the # square of the original test vector's A. R = 19324b647d967d644b3219 A = 19324b647d967d644b3219 M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 # Test vector adapted from the regression test for CVE-2017-3732. A is the # square of the original test vector's A. R = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000001fffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe00000002000000fffffffe00000200fffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000003fffffffdfffffe00000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe000000000000010000000000000000 M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff # These vectors were adapted from BoringSSL's "Quotient" BIGNUM tests in the # following ways: # # * The quotient in each vector was removed (*ring* only calculates # remainders, never quotients). # * B was renamed to M and Remainder was renamed to R. # * Only the test vectors with positive inputs were imported. # * Only the test vectors with odd moduli were imported. # * A < M**2; any larger values of A were split up into multiple reduction # steps. The first step uses the initial A and the smallest power of the # original M that makes A < M**2 true, the subsequent steps have smaller # powers of M using the result R from the previous step as A, and where the # last step has the initial value of M. # * Only test vectors with moduli that require at least 4 64-bit words to # represent are included (*ring*'s modular multiplication has this lower # bound, and modular multiplication is used as part of reduction). # Step 1 R = 04 A = 0813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4 M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b # Step 1 R = 18 A = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018 M = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd # Step 1 R = 20 A = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020 M = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d # Step 1 R = 24 A = 0877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024 M = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719 # Step 1 R = 2c A = 087bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c M = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1 # Step 1 R = 30 A = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030 M = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7 # Step 1 R = 458f5c63c063b09790a28c6cbd9afc98ded6d6c1d12c8e4e081e4f6a5638a5319a548fe711b3142d6d32827f415a41d457048783c3 A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 4e5d7ec324e42afb2d8b381c6d07869985cd3b3de3cbc06853a387c076e6525fd93c3b6de887f31a7580bafb0546f45b785c4e5199 # Step 2 R = 029abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e A = 458f5c63c063b09790a28c6cbd9afc98ded6d6c1d12c8e4e081e4f6a5638a5319a548fe711b3142d6d32827f415a41d457048783c3 M = 08da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b # Step 1 R = 2000f9c8569d20abce69ced0d66a44ae47a9516205732183408c6ab6c135cd172880f0c0d160862d49a0003656276f3884e88a3c9664d45f A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 8406162ef2dd175cc81e309b0e1460dc5a007e3fd5937813e6ddb894a208a249c8448a782379e757d3533a0ef008d597579ebae1b4cd95e9 # Step 2 R = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067 A = 2000f9c8569d20abce69ced0d66a44ae47a9516205732183408c6ab6c135cd172880f0c0d160862d49a0003656276f3884e88a3c9664d45f M = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d # Step 1 R = 0bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff # Step 1 R = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342 A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f # Step 1 R = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3 A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413 # Step 1 R = 02c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445 A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 M = 0d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79 # Step 1 R = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52 A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d # Step 1 R = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781 A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5 # Step 1 R = 0d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9 # Step 1 R = 0a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5 A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5 # Step 1 R = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71 A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7 # Step 1 R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d # Step 1 R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd # Step 1 R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069 # Step 1 R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f # Step 1 R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b M = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5 ring-0.16.9/src/arithmetic/bigint_elem_squared_tests.txt000064400000000000000000000145531352416253600216600ustar0000000000000000# ModSquare tests. # # These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M. # Regression test for CVE-2015-3193 (carry propagation bug in sqr8x_reduction). # XXX: It's pretty unclear if this is actually exercising the code that had the # bug. In fact it seems like it almost definitely isn't. This is here mostly # because it is convenient to add the test, and also to track the issue of the # lack of a real regression test. TODO: Fix this. ModSquare = 19324b647d967d644b3219 A = 050505050505 M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 # Regression test for CVE-2017-3732. ModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000 M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff ModSquare = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000483 M = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 # Regression test for CVE-2017-3736 ModSquare = fe06fe0b06160c09 A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc M = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff ring-0.16.9/src/arithmetic/constant.rs000064400000000000000000000004351352416253600160640ustar0000000000000000#[cfg(target_pointer_width = "32")] macro_rules! limbs { ( $($limb:expr),+ ) => { [ $($limb),+ ] }; } #[cfg(target_pointer_width = "64")] macro_rules! limbs { ( $($limb_lo:expr, $limb_hi:expr),+) => { [ $((($limb_hi | 0u64) << 32) | $limb_lo),+ ] }; } ring-0.16.9/src/arithmetic/montgomery.rs000064400000000000000000000052011352416253600164270ustar0000000000000000// Copyright 2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // Indicates that the element is not encoded; there is no *R* factor // that needs to be canceled out. #[derive(Copy, Clone)] pub enum Unencoded {} // Indicates that the element is encoded; the value has one *R* // factor that needs to be canceled out. #[derive(Copy, Clone)] pub enum R {} // Indicates the element is encoded twice; the value has two *R* // factors that need to be canceled out. #[derive(Copy, Clone)] pub enum RR {} // Indicates the element is inversely encoded; the value has one // 1/*R* factor that needs to be canceled out. #[derive(Copy, Clone)] pub enum RInverse {} pub trait Encoding {} impl Encoding for RR {} impl Encoding for R {} impl Encoding for Unencoded {} impl Encoding for RInverse {} /// The encoding of the result of a reduction. pub trait ReductionEncoding { type Output: Encoding; } impl ReductionEncoding for RR { type Output = R; } impl ReductionEncoding for R { type Output = Unencoded; } impl ReductionEncoding for Unencoded { type Output = RInverse; } /// The encoding of the result of a multiplication. pub trait ProductEncoding { type Output: Encoding; } impl ProductEncoding for (Unencoded, E) { type Output = E::Output; } impl ProductEncoding for (R, E) { type Output = E; } impl ProductEncoding for (RInverse, E) where E::Output: ReductionEncoding, { type Output = <::Output as ReductionEncoding>::Output; } // XXX: Rust doesn't allow overlapping impls, // TODO (if/when Rust allows it): // impl ProductEncoding for // (E1, E2) { // type Output = <(E2, E1) as ProductEncoding>::Output; // } impl ProductEncoding for (RR, Unencoded) { type Output = <(Unencoded, RR) as ProductEncoding>::Output; } impl ProductEncoding for (RR, RInverse) { type Output = <(RInverse, RR) as ProductEncoding>::Output; } ring-0.16.9/src/arithmetic.rs000064400000000000000000000015341352416253600142340ustar0000000000000000// Copyright 2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #[macro_use] pub mod constant; #[cfg(feature = "alloc")] pub mod bigint; pub mod montgomery; ring-0.16.9/src/bits.rs000064400000000000000000000041321352416253600130410ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::error; #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd)] pub struct BitLength(usize); // Lengths measured in bits, where all arithmetic is guaranteed not to // overflow. impl BitLength { #[inline] pub const fn from_usize_bits(bits: usize) -> Self { Self(bits) } #[inline] pub fn from_usize_bytes(bytes: usize) -> Result { let bits = bytes.checked_mul(8).ok_or(error::Unspecified)?; Ok(Self::from_usize_bits(bits)) } #[cfg(feature = "alloc")] #[inline] pub fn half_rounded_up(&self) -> Self { let round_up = self.0 & 1; Self((self.0 / 2) + round_up) } #[inline] pub fn as_usize_bits(&self) -> usize { self.0 } #[cfg(feature = "alloc")] #[inline] pub fn as_usize_bytes_rounded_up(&self) -> usize { // Equivalent to (self.0 + 7) / 8, except with no potential for // overflow and without branches. // Branchless round_up = if self.0 & 0b111 != 0 { 1 } else { 0 }; let round_up = ((self.0 >> 2) | (self.0 >> 1) | self.0) & 1; (self.0 / 8) + round_up } #[cfg(feature = "alloc")] #[inline] pub fn try_sub_1(self) -> Result { let sum = self.0.checked_sub(1).ok_or(error::Unspecified)?; Ok(BitLength(sum)) } } ring-0.16.9/src/bssl.rs000064400000000000000000000036731352416253600130540ustar0000000000000000// Copyright 2015 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{c, error}; /// An `int` returned from a foreign function containing **1** if the function /// was successful or **0** if an error occurred. This is the convention used by /// C code in `ring`. #[derive(Clone, Copy, Debug)] #[must_use] #[repr(transparent)] pub struct Result(c::int); impl From for core::result::Result<(), error::Unspecified> { fn from(ret: Result) -> Self { match ret.0 { 1 => Ok(()), c => { debug_assert_eq!(c, 0, "`bssl::Result` value must be 0 or 1"); Err(error::Unspecified) } } } } #[cfg(test)] mod tests { mod result { use crate::{bssl, c}; use core::mem; #[test] fn size_and_alignment() { type Underlying = c::int; assert_eq!(mem::size_of::(), mem::size_of::()); assert_eq!( mem::align_of::(), mem::align_of::() ); } #[test] fn semantics() { assert!(Result::from(bssl::Result(0)).is_err()); assert!(Result::from(bssl::Result(1)).is_ok()); } } } ring-0.16.9/src/c.rs000064400000000000000000000032771353036607100123300ustar0000000000000000// Copyright 2016-2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! C types. //! //! Avoid using the `libc` crate to get C types since `libc` doesn't support //! all the targets we need to support. It turns out that the few types we need //! are all uniformly defined on the platforms we care about. This will //! probably change if/when we support 16-bit platforms or platforms where //! `usize` and `uintptr_t` are different sizes. // Keep in sync with the checks in base.h that verify these assumptions. pub(crate) type int = i32; pub(crate) type uint = u32; pub(crate) type size_t = usize; #[cfg(all(test, any(unix, windows)))] mod tests { use crate::c; #[test] fn test_libc_compatible() { { let x: c::int = 1; let _x: libc::c_int = x; } { let x: c::uint = 1; let _x: libc::c_uint = x; } { let x: c::size_t = 1; let _x: libc::size_t = x; let _x: usize = x; } } } ring-0.16.9/src/constant_time.rs000064400000000000000000000033651353036607100147530ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Constant-time operations. use crate::{c, error}; /// Returns `Ok(())` if `a == b` and `Err(error::Unspecified)` otherwise. /// The comparison of `a` and `b` is done in constant time with respect to the /// contents of each, but NOT in constant time with respect to the lengths of /// `a` and `b`. pub fn verify_slices_are_equal(a: &[u8], b: &[u8]) -> Result<(), error::Unspecified> { if a.len() != b.len() { return Err(error::Unspecified); } let result = unsafe { GFp_memcmp(a.as_ptr(), b.as_ptr(), a.len()) }; match result { 0 => Ok(()), _ => Err(error::Unspecified), } } extern "C" { fn GFp_memcmp(a: *const u8, b: *const u8, len: c::size_t) -> c::int; } #[cfg(test)] mod tests { use crate::{bssl, error}; #[test] fn test_constant_time() -> Result<(), error::Unspecified> { extern "C" { fn bssl_constant_time_test_main() -> bssl::Result; } Result::from(unsafe { bssl_constant_time_test_main() }) } } ring-0.16.9/src/cpu.rs000064400000000000000000000216441353036607100126730ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /// A witness indicating that CPU features have been detected and cached. /// /// TODO: Eventually all feature detection logic should be done through /// functions that accept a `Features` parameter, to guarantee that nothing /// tries to read the cached values before they are written. /// /// This is a zero-sized type so that it can be "stored" wherever convenient. #[derive(Copy, Clone)] pub(crate) struct Features(()); #[inline(always)] pub(crate) fn features() -> Features { // We don't do runtime feature detection on iOS. instead some features are // assumed to be present; see `arm::Feature`. #[cfg(all( any( target_arch = "aarch64", target_arch = "arm", target_arch = "x86", target_arch = "x86_64" ), not(target_os = "ios") ))] { static INIT: spin::Once<()> = spin::Once::new(); let () = INIT.call_once(|| { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { extern "C" { fn GFp_cpuid_setup(); } unsafe { GFp_cpuid_setup(); } } #[cfg(all( any(target_os = "android", target_os = "linux"), any(target_arch = "aarch64", target_arch = "arm") ))] { arm::linux_setup(); } #[cfg(all(target_os = "fuchsia", any(target_arch = "aarch64")))] { arm::fuchsia_setup(); } }); } Features(()) } pub(crate) mod arm { #[cfg(all( any(target_os = "android", target_os = "linux"), any(target_arch = "aarch64", target_arch = "arm") ))] pub fn linux_setup() { use libc::c_ulong; // XXX: The `libc` crate doesn't provide `libc::getauxval` consistently // across all Android/Linux targets, e.g. musl. extern "C" { fn getauxval(type_: c_ulong) -> c_ulong; } const AT_HWCAP: c_ulong = 16; #[cfg(target_arch = "aarch64")] const HWCAP_NEON: c_ulong = 1 << 1; #[cfg(target_arch = "arm")] const HWCAP_NEON: c_ulong = 1 << 12; let caps = unsafe { getauxval(AT_HWCAP) }; // We assume NEON is available on AARCH64 because it is a required // feature. #[cfg(target_arch = "aarch64")] debug_assert!(caps & HWCAP_NEON == HWCAP_NEON); // OpenSSL and BoringSSL don't enable any other features if NEON isn't // available. if caps & HWCAP_NEON == HWCAP_NEON { let mut features = NEON.mask; #[cfg(target_arch = "aarch64")] const OFFSET: c_ulong = 3; #[cfg(target_arch = "arm")] const OFFSET: c_ulong = 0; #[cfg(target_arch = "arm")] let caps = { const AT_HWCAP2: c_ulong = 26; unsafe { getauxval(AT_HWCAP2) } }; const HWCAP_AES: c_ulong = 1 << 0 + OFFSET; const HWCAP_PMULL: c_ulong = 1 << 1 + OFFSET; const HWCAP_SHA2: c_ulong = 1 << 3 + OFFSET; if caps & HWCAP_AES == HWCAP_AES { features |= AES.mask; } if caps & HWCAP_PMULL == HWCAP_PMULL { features |= PMULL.mask; } if caps & HWCAP_SHA2 == HWCAP_SHA2 { features |= 1 << 4; } unsafe { GFp_armcap_P = features }; } } #[cfg(all(target_os = "fuchsia", any(target_arch = "aarch64")))] pub fn fuchsia_setup() { type zx_status_t = i32; #[link(name = "zircon")] extern "C" { fn zx_system_get_features(kind: u32, features: *mut u32) -> zx_status_t; } const ZX_OK: i32 = 0; const ZX_FEATURE_KIND_CPU: u32 = 0; const ZX_ARM64_FEATURE_ISA_ASIMD: u32 = 1 << 2; const ZX_ARM64_FEATURE_ISA_AES: u32 = 1 << 3; const ZX_ARM64_FEATURE_ISA_PMULL: u32 = 1 << 4; const ZX_ARM64_FEATURE_ISA_SHA2: u32 = 1 << 6; let mut caps = 0; let rc = unsafe { zx_system_get_features(ZX_FEATURE_KIND_CPU, &mut caps) }; // OpenSSL and BoringSSL don't enable any other features if NEON isn't // available. if rc == ZX_OK && (caps & ZX_ARM64_FEATURE_ISA_ASIMD == ZX_ARM64_FEATURE_ISA_ASIMD) { let mut features = NEON.mask; if caps & ZX_ARM64_FEATURE_ISA_AES == ZX_ARM64_FEATURE_ISA_AES { features |= AES.mask; } if caps & ZX_ARM64_FEATURE_ISA_PMULL == ZX_ARM64_FEATURE_ISA_PMULL { features |= PMULL.mask; } if caps & ZX_ARM64_FEATURE_ISA_SHA2 == ZX_ARM64_FEATURE_ISA_SHA2 { features |= 1 << 4; } unsafe { GFp_armcap_P = features }; } } pub(crate) struct Feature { #[cfg_attr( any( target_os = "ios", not(any(target_arch = "arm", target_arch = "aarch64")) ), allow(dead_code) )] mask: u32, #[cfg_attr(not(target_os = "ios"), allow(dead_code))] ios: bool, } impl Feature { #[inline(always)] pub fn available(&self, _: super::Features) -> bool { #[cfg(all(target_os = "ios", any(target_arch = "arm", target_arch = "aarch64")))] { return self.ios; } #[cfg(all( any(target_os = "android", target_os = "linux", target_os = "fuchsia"), any(target_arch = "arm", target_arch = "aarch64") ))] { return self.mask == self.mask & unsafe { GFp_armcap_P }; } #[cfg(not(any(target_arch = "arm", target_arch = "aarch64")))] { return false; } } } // Keep in sync with `ARMV7_NEON`. #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] pub(crate) const NEON: Feature = Feature { mask: 1 << 0, ios: true, }; // Keep in sync with `ARMV8_AES`. pub(crate) const AES: Feature = Feature { mask: 1 << 2, ios: true, }; // Keep in sync with `ARMV8_PMULL`. pub(crate) const PMULL: Feature = Feature { mask: 1 << 5, ios: true, }; #[cfg(all( any(target_os = "android", target_os = "linux", target_os = "fuchsia"), any(target_arch = "arm", target_arch = "aarch64") ))] extern "C" { static mut GFp_armcap_P: u32; } } #[cfg_attr( not(any(target_arch = "x86", target_arch = "x86_64")), allow(dead_code) )] pub(crate) mod intel { pub(crate) struct Feature { word: usize, mask: u32, } impl Feature { #[inline(always)] pub fn available(&self, _: super::Features) -> bool { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { extern "C" { static mut GFp_ia32cap_P: [u32; 4]; } return self.mask == self.mask & unsafe { GFp_ia32cap_P[self.word] }; } #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] { return false; } } } pub(crate) const FXSR: Feature = Feature { word: 0, mask: 1 << 24, }; pub(crate) const PCLMULQDQ: Feature = Feature { word: 1, mask: 1 << 1, }; pub(crate) const SSSE3: Feature = Feature { word: 1, mask: 1 << 9, }; #[cfg(target_arch = "x86_64")] pub(crate) const MOVBE: Feature = Feature { word: 1, mask: 1 << 22, }; pub(crate) const AES: Feature = Feature { word: 1, mask: 1 << 25, }; #[cfg(target_arch = "x86_64")] pub(crate) const AVX: Feature = Feature { word: 1, mask: 1 << 28, }; #[cfg(all(target_arch = "x86_64", test))] mod x86_64_tests { use super::*; #[test] fn test_avx_movbe_mask() { // This is the OpenSSL style of testing these bits. assert_eq!((AVX.mask | MOVBE.mask) >> 22, 0x41); } } } ring-0.16.9/src/data/alg-rsa-encryption.der000064400000000000000000000000151352331573000166440ustar0000000000000000 *H ring-0.16.9/src/debug.rs000064400000000000000000000055111353037436100131660ustar0000000000000000// Copyright 2018 Trent Clarke. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // Generates an implementation of the Debug trait for a type that defers to the // Debug implementation for a given field. macro_rules! derive_debug_via_id { ($typename:ident) => { impl ::core::fmt::Debug for $typename { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { ::core::fmt::Debug::fmt(&self.id, f) } } }; } macro_rules! derive_debug_via_field { ($type:ty, $field:ident) => { derive_debug_via_field!($type, stringify!($type), $field); }; ($type:ty, $typename:expr, $field:ident) => { impl ::core::fmt::Debug for $type { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { f.debug_struct($typename) .field(stringify!($field), &self.$field) .finish() } } }; } // Generates an implementation of the Debug trait for a type that outputs the // hex encoding of the byte slice representation of the value. macro_rules! derive_debug_self_as_ref_hex_bytes { ($typename:ident) => { impl ::core::fmt::Debug for $typename { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { crate::debug::write_hex_tuple(f, stringify!($typename), self) } } }; } pub(crate) fn write_hex_tuple( fmt: &mut core::fmt::Formatter, type_name: &str, value: &dyn AsRef<[u8]>, ) -> Result<(), ::core::fmt::Error> { fmt.debug_tuple(type_name) .field(&HexStr(value.as_ref())) .finish() } pub struct HexStr<'a>(pub &'a [u8]); impl core::fmt::Debug for HexStr<'_> { fn fmt(&self, fmt: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { fmt.write_str("\"")?; write_hex_bytes(fmt, self.0)?; fmt.write_str("\"")?; Ok(()) } } pub(crate) fn write_hex_bytes( fmt: &mut core::fmt::Formatter, bytes: &[u8], ) -> Result<(), ::core::fmt::Error> { for byte in bytes { write!(fmt, "{:02x}", byte)?; } Ok(()) } ring-0.16.9/src/digest/sha1.rs000064400000000000000000000060451353036607100142150ustar0000000000000000// Copyright 2015-2016 Brian Smith. // Copyright 2016 Simon Sapin. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::sha2::{ch, maj, Word}; use crate::c; use core::{convert::TryInto, num::Wrapping}; pub const BLOCK_LEN: usize = 512 / 8; pub const CHAINING_LEN: usize = 160 / 8; pub const OUTPUT_LEN: usize = 160 / 8; const CHAINING_WORDS: usize = CHAINING_LEN / 4; type W32 = Wrapping; // FIPS 180-4 4.1.1 #[inline] fn parity(x: W32, y: W32, z: W32) -> W32 { x ^ y ^ z } type State = [W32; CHAINING_WORDS]; const ROUNDS: usize = 80; pub(super) extern "C" fn block_data_order( state: &mut super::State, data: *const u8, num: c::size_t, ) { let state = unsafe { &mut state.as32 }; let state: &mut State = (&mut state[..CHAINING_WORDS]).try_into().unwrap(); let data = data as *const [::InputBytes; 16]; let blocks = unsafe { core::slice::from_raw_parts(data, num) }; *state = block_data_order_(*state, blocks) } #[inline] fn block_data_order_(mut H: State, M: &[[::InputBytes; 16]]) -> State { for M in M { // FIPS 180-4 6.1.2 Step 1 let mut W: [W32; ROUNDS] = [W32::ZERO; ROUNDS]; for t in 0..16 { W[t] = W32::from_be_bytes(M[t]); } for t in 16..ROUNDS { let wt = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]; W[t] = rotl(wt, 1); } // FIPS 180-4 6.1.2 Step 2 let mut a = H[0]; let mut b = H[1]; let mut c = H[2]; let mut d = H[3]; let mut e = H[4]; // FIPS 180-4 6.1.2 Step 3 for t in 0..ROUNDS { // FIPS 180-4 {4.1.1, 4.2.1} let (k, f) = match t { 0..=19 => (Wrapping(0x5a827999), ch(b, c, d)), 20..=39 => (Wrapping(0x6ed9eba1), parity(b, c, d)), 40..=59 => (Wrapping(0x8f1bbcdc), maj(b, c, d)), 60..=79 => (Wrapping(0xca62c1d6), parity(b, c, d)), _ => unreachable!(), }; let T = rotl(a, 5) + f + e + k + W[t]; e = d; d = c; c = rotl(b, 30); b = a; a = T; } // FIPS 180-4 6.1.2 Step 4 H[1] += b; H[2] += c; H[3] += d; H[0] += a; H[4] += e; } H } #[inline(always)] fn rotl(x: W32, n: u32) -> W32 { Wrapping(x.0.rotate_left(n)) } ring-0.16.9/src/digest/sha2.rs000064400000000000000000000257661353036607100142310ustar0000000000000000// Copyright 2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::c; use core::{ num::Wrapping, ops::{Add, AddAssign, BitAnd, BitOr, BitXor, Not, Shr}, }; #[cfg(not(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64")))] pub(super) extern "C" fn GFp_sha256_block_data_order( state: &mut super::State, data: *const u8, num: c::size_t, ) { let state = unsafe { &mut state.as32 }; *state = block_data_order(*state, data, num) } #[cfg(not(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64")))] pub(super) extern "C" fn GFp_sha512_block_data_order( state: &mut super::State, data: *const u8, num: c::size_t, ) { let state = unsafe { &mut state.as64 }; *state = block_data_order(*state, data, num) } #[cfg_attr( any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"), allow(dead_code) )] #[inline] fn block_data_order( mut H: [S; CHAINING_WORDS], M: *const u8, num: c::size_t, ) -> [S; CHAINING_WORDS] { let M = M as *const [S::InputBytes; 16]; let M: &[[S::InputBytes; 16]] = unsafe { core::slice::from_raw_parts(M, num) }; for M in M { // FIPS 180-4 {6.2.2, 6.4.2} Step 1 // // TODO: Use `let W: [S::ZERO; S::ROUNDS]` instead of allocating // `MAX_ROUNDS` items and then slicing to `K.len()`; depends on // https://github.com/rust-lang/rust/issues/43408. let mut W = [S::ZERO; MAX_ROUNDS]; let W: &[S] = { let W = &mut W[..S::K.len()]; for (W, M) in W.iter_mut().zip(M) { *W = S::from_be_bytes(*M); } for t in M.len()..S::K.len() { W[t] = sigma_1(W[t - 2]) + W[t - 7] + sigma_0(W[t - 15]) + W[t - 16] } W }; // FIPS 180-4 {6.2.2, 6.4.2} Step 2 let mut a = H[0]; let mut b = H[1]; let mut c = H[2]; let mut d = H[3]; let mut e = H[4]; let mut f = H[5]; let mut g = H[6]; let mut h = H[7]; // FIPS 180-4 {6.2.2, 6.4.2} Step 3 for (Kt, Wt) in S::K.iter().zip(W.iter()) { let T1 = h + SIGMA_1(e) + ch(e, f, g) + *Kt + *Wt; let T2 = SIGMA_0(a) + maj(a, b, c); h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2; } // FIPS 180-4 {6.2.2, 6.4.2} Step 4 H[0] += a; H[1] += b; H[2] += c; H[3] += d; H[4] += e; H[5] += f; H[6] += g; H[7] += h; } H } // FIPS 180-4 {4.1.1, 4.1.2, 4.1.3} #[inline(always)] pub(super) fn ch(x: W, y: W, z: W) -> W { (x & y) | (!x & z) } // FIPS 180-4 {4.1.1, 4.1.2, 4.1.3} #[inline(always)] pub(super) fn maj(x: W, y: W, z: W) -> W { (x & y) | (x & z) | (y & z) } // FIPS 180-4 {4.1.2, 4.1.3} #[inline(always)] fn SIGMA_0(x: S) -> S { x.rotr(S::BIG_SIGMA_0.0) ^ x.rotr(S::BIG_SIGMA_0.1) ^ x.rotr(S::BIG_SIGMA_0.2) } // FIPS 180-4 {4.1.2, 4.1.3} #[inline(always)] fn SIGMA_1(x: S) -> S { x.rotr(S::BIG_SIGMA_1.0) ^ x.rotr(S::BIG_SIGMA_1.1) ^ x.rotr(S::BIG_SIGMA_1.2) } // FIPS 180-4 {4.1.2, 4.1.3} #[inline(always)] fn sigma_0(x: S) -> S { x.rotr(S::SMALL_SIGMA_0.0) ^ x.rotr(S::SMALL_SIGMA_0.1) ^ (x >> S::SMALL_SIGMA_0.2) } // FIPS 180-4 {4.1.2, 4.1.3} #[inline(always)] fn sigma_1(x: S) -> S { x.rotr(S::SMALL_SIGMA_1.0) ^ x.rotr(S::SMALL_SIGMA_1.1) ^ (x >> S::SMALL_SIGMA_1.2) } // Commonality between SHA-1 and SHA-2 words. pub(super) trait Word: 'static + Sized + Copy + Add + AddAssign + BitAnd + BitOr + Not { const ZERO: Self; type InputBytes: Copy; #[inline(always)] fn from_be_bytes(input: Self::InputBytes) -> Self; #[inline] fn rotr(self, count: u32) -> Self; } /// A SHA-2 input word. trait Sha2: Word + BitXor + Shr { const BIG_SIGMA_0: (u32, u32, u32); const BIG_SIGMA_1: (u32, u32, u32); const SMALL_SIGMA_0: (u32, u32, usize); const SMALL_SIGMA_1: (u32, u32, usize); const K: &'static [Self]; } const MAX_ROUNDS: usize = 80; pub(super) const CHAINING_WORDS: usize = 8; impl Word for Wrapping { const ZERO: Self = Wrapping(0); type InputBytes = [u8; 4]; #[inline(always)] fn from_be_bytes(input: Self::InputBytes) -> Self { Wrapping(u32::from_be_bytes(input)) } #[inline(always)] fn rotr(self, count: u32) -> Self { Wrapping(self.0.rotate_right(count)) } } // SHA-256 impl Sha2 for Wrapping { // FIPS 180-4 4.1.2 const BIG_SIGMA_0: (u32, u32, u32) = (2, 13, 22); const BIG_SIGMA_1: (u32, u32, u32) = (6, 11, 25); const SMALL_SIGMA_0: (u32, u32, usize) = (7, 18, 3); const SMALL_SIGMA_1: (u32, u32, usize) = (17, 19, 10); // FIPS 180-4 4.2.2 const K: &'static [Self] = &[ Self(0x428a2f98), Self(0x71374491), Self(0xb5c0fbcf), Self(0xe9b5dba5), Self(0x3956c25b), Self(0x59f111f1), Self(0x923f82a4), Self(0xab1c5ed5), Self(0xd807aa98), Self(0x12835b01), Self(0x243185be), Self(0x550c7dc3), Self(0x72be5d74), Self(0x80deb1fe), Self(0x9bdc06a7), Self(0xc19bf174), Self(0xe49b69c1), Self(0xefbe4786), Self(0x0fc19dc6), Self(0x240ca1cc), Self(0x2de92c6f), Self(0x4a7484aa), Self(0x5cb0a9dc), Self(0x76f988da), Self(0x983e5152), Self(0xa831c66d), Self(0xb00327c8), Self(0xbf597fc7), Self(0xc6e00bf3), Self(0xd5a79147), Self(0x06ca6351), Self(0x14292967), Self(0x27b70a85), Self(0x2e1b2138), Self(0x4d2c6dfc), Self(0x53380d13), Self(0x650a7354), Self(0x766a0abb), Self(0x81c2c92e), Self(0x92722c85), Self(0xa2bfe8a1), Self(0xa81a664b), Self(0xc24b8b70), Self(0xc76c51a3), Self(0xd192e819), Self(0xd6990624), Self(0xf40e3585), Self(0x106aa070), Self(0x19a4c116), Self(0x1e376c08), Self(0x2748774c), Self(0x34b0bcb5), Self(0x391c0cb3), Self(0x4ed8aa4a), Self(0x5b9cca4f), Self(0x682e6ff3), Self(0x748f82ee), Self(0x78a5636f), Self(0x84c87814), Self(0x8cc70208), Self(0x90befffa), Self(0xa4506ceb), Self(0xbef9a3f7), Self(0xc67178f2), ]; } impl Word for Wrapping { const ZERO: Self = Wrapping(0); type InputBytes = [u8; 8]; fn from_be_bytes(input: Self::InputBytes) -> Self { Wrapping(u64::from_be_bytes(input)) } #[inline] fn rotr(self, count: u32) -> Self { Wrapping(self.0.rotate_right(count)) } } // SHA-384 and SHA-512 impl Sha2 for Wrapping { // FIPS 180-4 4.1.3 const BIG_SIGMA_0: (u32, u32, u32) = (28, 34, 39); const BIG_SIGMA_1: (u32, u32, u32) = (14, 18, 41); const SMALL_SIGMA_0: (u32, u32, usize) = (1, 8, 7); const SMALL_SIGMA_1: (u32, u32, usize) = (19, 61, 6); // FIPS 180-4 4.2.3 const K: &'static [Self] = &[ Self(0x428a2f98d728ae22), Self(0x7137449123ef65cd), Self(0xb5c0fbcfec4d3b2f), Self(0xe9b5dba58189dbbc), Self(0x3956c25bf348b538), Self(0x59f111f1b605d019), Self(0x923f82a4af194f9b), Self(0xab1c5ed5da6d8118), Self(0xd807aa98a3030242), Self(0x12835b0145706fbe), Self(0x243185be4ee4b28c), Self(0x550c7dc3d5ffb4e2), Self(0x72be5d74f27b896f), Self(0x80deb1fe3b1696b1), Self(0x9bdc06a725c71235), Self(0xc19bf174cf692694), Self(0xe49b69c19ef14ad2), Self(0xefbe4786384f25e3), Self(0x0fc19dc68b8cd5b5), Self(0x240ca1cc77ac9c65), Self(0x2de92c6f592b0275), Self(0x4a7484aa6ea6e483), Self(0x5cb0a9dcbd41fbd4), Self(0x76f988da831153b5), Self(0x983e5152ee66dfab), Self(0xa831c66d2db43210), Self(0xb00327c898fb213f), Self(0xbf597fc7beef0ee4), Self(0xc6e00bf33da88fc2), Self(0xd5a79147930aa725), Self(0x06ca6351e003826f), Self(0x142929670a0e6e70), Self(0x27b70a8546d22ffc), Self(0x2e1b21385c26c926), Self(0x4d2c6dfc5ac42aed), Self(0x53380d139d95b3df), Self(0x650a73548baf63de), Self(0x766a0abb3c77b2a8), Self(0x81c2c92e47edaee6), Self(0x92722c851482353b), Self(0xa2bfe8a14cf10364), Self(0xa81a664bbc423001), Self(0xc24b8b70d0f89791), Self(0xc76c51a30654be30), Self(0xd192e819d6ef5218), Self(0xd69906245565a910), Self(0xf40e35855771202a), Self(0x106aa07032bbd1b8), Self(0x19a4c116b8d2d0c8), Self(0x1e376c085141ab53), Self(0x2748774cdf8eeb99), Self(0x34b0bcb5e19b48a8), Self(0x391c0cb3c5c95a63), Self(0x4ed8aa4ae3418acb), Self(0x5b9cca4f7763e373), Self(0x682e6ff3d6b2b8a3), Self(0x748f82ee5defb2fc), Self(0x78a5636f43172f60), Self(0x84c87814a1f0ab72), Self(0x8cc702081a6439ec), Self(0x90befffa23631e28), Self(0xa4506cebde82bde9), Self(0xbef9a3f7b2c67915), Self(0xc67178f2e372532b), Self(0xca273eceea26619c), Self(0xd186b8c721c0c207), Self(0xeada7dd6cde0eb1e), Self(0xf57d4f7fee6ed178), Self(0x06f067aa72176fba), Self(0x0a637dc5a2c898a6), Self(0x113f9804bef90dae), Self(0x1b710b35131c471b), Self(0x28db77f523047d84), Self(0x32caab7b40c72493), Self(0x3c9ebe0a15c9bebc), Self(0x431d67c49c100d4c), Self(0x4cc5d4becb3e42b6), Self(0x597f299cfc657e2a), Self(0x5fcb6fab3ad6faec), Self(0x6c44198c4a475817), ]; } #[cfg(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"))] extern "C" { pub(super) fn GFp_sha256_block_data_order( state: &mut super::State, data: *const u8, num: c::size_t, ); pub(super) fn GFp_sha512_block_data_order( state: &mut super::State, data: *const u8, num: c::size_t, ); } ring-0.16.9/src/digest.rs000064400000000000000000000454551352416253600133740ustar0000000000000000// Copyright 2015-2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! SHA-2 and the legacy SHA-1 digest algorithm. //! //! If all the data is available in a single contiguous slice then the `digest` //! function should be used. Otherwise, the digest can be calculated in //! multiple steps using `Context`. // Note on why are we doing things the hard way: It would be easy to implement // this using the C `EVP_MD`/`EVP_MD_CTX` interface. However, if we were to do // things that way, we'd have a hard dependency on `malloc` and other overhead. // The goal for this implementation is to drive the overhead as close to zero // as possible. use crate::{c, cpu, debug, endian::*, polyfill}; use core::num::Wrapping; mod sha1; mod sha2; #[derive(Clone)] pub(crate) struct BlockContext { state: State, // Note that SHA-512 has a 128-bit input bit counter, but this // implementation only supports up to 2^64-1 input bits for all algorithms, // so a 64-bit counter is more than sufficient. completed_data_blocks: u64, /// The context's algorithm. pub algorithm: &'static Algorithm, cpu_features: cpu::Features, } impl BlockContext { pub(crate) fn new(algorithm: &'static Algorithm) -> Self { Self { state: algorithm.initial_state, completed_data_blocks: 0, algorithm, cpu_features: cpu::features(), } } #[inline] pub(crate) fn update(&mut self, input: &[u8]) { let num_blocks = input.len() / self.algorithm.block_len; assert_eq!(num_blocks * self.algorithm.block_len, input.len()); if num_blocks > 0 { unsafe { (self.algorithm.block_data_order)(&mut self.state, input.as_ptr(), num_blocks); } self.completed_data_blocks = self .completed_data_blocks .checked_add(polyfill::u64_from_usize(num_blocks)) .unwrap(); } } pub(crate) fn finish(mut self, pending: &mut [u8], num_pending: usize) -> Digest { let block_len = self.algorithm.block_len; assert_eq!(pending.len(), block_len); assert!(num_pending <= pending.len()); let mut padding_pos = num_pending; pending[padding_pos] = 0x80; padding_pos += 1; if padding_pos > block_len - self.algorithm.len_len { polyfill::slice::fill(&mut pending[padding_pos..block_len], 0); unsafe { (self.algorithm.block_data_order)(&mut self.state, pending.as_ptr(), 1); } // We don't increase |self.completed_data_blocks| because the // padding isn't data, and so it isn't included in the data length. padding_pos = 0; } polyfill::slice::fill(&mut pending[padding_pos..(block_len - 8)], 0); // Output the length, in bits, in big endian order. let completed_data_bits = self .completed_data_blocks .checked_mul(polyfill::u64_from_usize(block_len)) .unwrap() .checked_add(polyfill::u64_from_usize(num_pending)) .unwrap() .checked_mul(8) .unwrap(); pending[(block_len - 8)..block_len].copy_from_slice(&u64::to_be_bytes(completed_data_bits)); unsafe { (self.algorithm.block_data_order)(&mut self.state, pending.as_ptr(), 1); } Digest { algorithm: self.algorithm, value: (self.algorithm.format_output)(self.state), } } } /// A context for multi-step (Init-Update-Finish) digest calculations. /// /// # Examples /// /// ``` /// use ring::digest; /// /// let one_shot = digest::digest(&digest::SHA384, b"hello, world"); /// /// let mut ctx = digest::Context::new(&digest::SHA384); /// ctx.update(b"hello"); /// ctx.update(b", "); /// ctx.update(b"world"); /// let multi_part = ctx.finish(); /// /// assert_eq!(&one_shot.as_ref(), &multi_part.as_ref()); /// ``` #[derive(Clone)] pub struct Context { block: BlockContext, // TODO: More explicitly force 64-bit alignment for |pending|. pending: [u8; MAX_BLOCK_LEN], num_pending: usize, } impl Context { /// Constructs a new context. pub fn new(algorithm: &'static Algorithm) -> Self { Self { block: BlockContext::new(algorithm), pending: [0u8; MAX_BLOCK_LEN], num_pending: 0, } } pub(crate) fn clone_from(block: &BlockContext) -> Self { Self { block: block.clone(), pending: [0u8; MAX_BLOCK_LEN], num_pending: 0, } } /// Updates the digest with all the data in `data`. `update` may be called /// zero or more times until `finish` is called. It must not be called /// after `finish` has been called. pub fn update(&mut self, data: &[u8]) { let block_len = self.block.algorithm.block_len; if data.len() < block_len - self.num_pending { self.pending[self.num_pending..(self.num_pending + data.len())].copy_from_slice(data); self.num_pending += data.len(); return; } let mut remaining = data; if self.num_pending > 0 { let to_copy = block_len - self.num_pending; self.pending[self.num_pending..block_len].copy_from_slice(&data[..to_copy]); self.block.update(&self.pending[..block_len]); remaining = &remaining[to_copy..]; self.num_pending = 0; } let num_blocks = remaining.len() / block_len; let num_to_save_for_later = remaining.len() % block_len; self.block.update(&remaining[..(num_blocks * block_len)]); if num_to_save_for_later > 0 { self.pending[..num_to_save_for_later] .copy_from_slice(&remaining[(remaining.len() - num_to_save_for_later)..]); self.num_pending = num_to_save_for_later; } } /// Finalizes the digest calculation and returns the digest value. `finish` /// consumes the context so it cannot be (mis-)used after `finish` has been /// called. pub fn finish(mut self) -> Digest { let block_len = self.block.algorithm.block_len; self.block .finish(&mut self.pending[..block_len], self.num_pending) } /// The algorithm that this context is using. #[inline(always)] pub fn algorithm(&self) -> &'static Algorithm { self.block.algorithm } } /// Returns the digest of `data` using the given digest algorithm. /// /// # Examples: /// /// ``` /// # #[cfg(feature = "alloc")] /// # { /// use ring::{digest, test}; /// let expected_hex = "09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b"; /// let expected: Vec = test::from_hex(expected_hex).unwrap(); /// let actual = digest::digest(&digest::SHA256, b"hello, world"); /// /// assert_eq!(&expected, &actual.as_ref()); /// # } /// ``` pub fn digest(algorithm: &'static Algorithm, data: &[u8]) -> Digest { let mut ctx = Context::new(algorithm); ctx.update(data); ctx.finish() } /// A calculated digest value. /// /// Use `as_ref` to get the value as a `&[u8]`. #[derive(Clone, Copy)] pub struct Digest { value: Output, algorithm: &'static Algorithm, } impl Digest { /// The algorithm that was used to calculate the digest value. #[inline(always)] pub fn algorithm(&self) -> &'static Algorithm { self.algorithm } } impl AsRef<[u8]> for Digest { #[inline(always)] fn as_ref(&self) -> &[u8] { &as_bytes(unsafe { &self.value.as64 })[..self.algorithm.output_len] } } impl core::fmt::Debug for Digest { fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { write!(fmt, "{:?}:", self.algorithm)?; debug::write_hex_bytes(fmt, self.as_ref()) } } /// A digest algorithm. pub struct Algorithm { /// The length of a finalized digest. pub output_len: usize, /// The size of the chaining value of the digest function, in bytes. For /// non-truncated algorithms (SHA-1, SHA-256, SHA-512), this is equal to /// `output_len`. For truncated algorithms (e.g. SHA-384, SHA-512/256), /// this is equal to the length before truncation. This is mostly helpful /// for determining the size of an HMAC key that is appropriate for the /// digest algorithm. pub chaining_len: usize, /// The internal block length. pub block_len: usize, /// The length of the length in the padding. len_len: usize, block_data_order: unsafe extern "C" fn(state: &mut State, data: *const u8, num: c::size_t), format_output: fn(input: State) -> Output, initial_state: State, id: AlgorithmID, } #[derive(Debug, Eq, PartialEq)] enum AlgorithmID { SHA1, SHA256, SHA384, SHA512, SHA512_256, } impl PartialEq for Algorithm { fn eq(&self, other: &Self) -> bool { self.id == other.id } } impl Eq for Algorithm {} derive_debug_via_id!(Algorithm); /// SHA-1 as specified in [FIPS 180-4]. Deprecated. /// /// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf pub static SHA1_FOR_LEGACY_USE_ONLY: Algorithm = Algorithm { output_len: sha1::OUTPUT_LEN, chaining_len: sha1::CHAINING_LEN, block_len: sha1::BLOCK_LEN, len_len: 64 / 8, block_data_order: sha1::block_data_order, format_output: sha256_format_output, initial_state: State { as32: [ Wrapping(0x67452301u32), Wrapping(0xefcdab89u32), Wrapping(0x98badcfeu32), Wrapping(0x10325476u32), Wrapping(0xc3d2e1f0u32), Wrapping(0), Wrapping(0), Wrapping(0), ], }, id: AlgorithmID::SHA1, }; /// SHA-256 as specified in [FIPS 180-4]. /// /// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf pub static SHA256: Algorithm = Algorithm { output_len: SHA256_OUTPUT_LEN, chaining_len: SHA256_OUTPUT_LEN, block_len: 512 / 8, len_len: 64 / 8, block_data_order: sha2::GFp_sha256_block_data_order, format_output: sha256_format_output, initial_state: State { as32: [ Wrapping(0x6a09e667u32), Wrapping(0xbb67ae85u32), Wrapping(0x3c6ef372u32), Wrapping(0xa54ff53au32), Wrapping(0x510e527fu32), Wrapping(0x9b05688cu32), Wrapping(0x1f83d9abu32), Wrapping(0x5be0cd19u32), ], }, id: AlgorithmID::SHA256, }; /// SHA-384 as specified in [FIPS 180-4]. /// /// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf pub static SHA384: Algorithm = Algorithm { output_len: SHA384_OUTPUT_LEN, chaining_len: SHA512_OUTPUT_LEN, block_len: SHA512_BLOCK_LEN, len_len: SHA512_LEN_LEN, block_data_order: sha2::GFp_sha512_block_data_order, format_output: sha512_format_output, initial_state: State { as64: [ Wrapping(0xcbbb9d5dc1059ed8), Wrapping(0x629a292a367cd507), Wrapping(0x9159015a3070dd17), Wrapping(0x152fecd8f70e5939), Wrapping(0x67332667ffc00b31), Wrapping(0x8eb44a8768581511), Wrapping(0xdb0c2e0d64f98fa7), Wrapping(0x47b5481dbefa4fa4), ], }, id: AlgorithmID::SHA384, }; /// SHA-512 as specified in [FIPS 180-4]. /// /// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf pub static SHA512: Algorithm = Algorithm { output_len: SHA512_OUTPUT_LEN, chaining_len: SHA512_OUTPUT_LEN, block_len: SHA512_BLOCK_LEN, len_len: SHA512_LEN_LEN, block_data_order: sha2::GFp_sha512_block_data_order, format_output: sha512_format_output, initial_state: State { as64: [ Wrapping(0x6a09e667f3bcc908), Wrapping(0xbb67ae8584caa73b), Wrapping(0x3c6ef372fe94f82b), Wrapping(0xa54ff53a5f1d36f1), Wrapping(0x510e527fade682d1), Wrapping(0x9b05688c2b3e6c1f), Wrapping(0x1f83d9abfb41bd6b), Wrapping(0x5be0cd19137e2179), ], }, id: AlgorithmID::SHA512, }; /// SHA-512/256 as specified in [FIPS 180-4]. /// /// This is *not* the same as just truncating the output of SHA-512, as /// SHA-512/256 has its own initial state distinct from SHA-512's initial /// state. /// /// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf pub static SHA512_256: Algorithm = Algorithm { output_len: SHA512_256_OUTPUT_LEN, chaining_len: SHA512_OUTPUT_LEN, block_len: SHA512_BLOCK_LEN, len_len: SHA512_LEN_LEN, block_data_order: sha2::GFp_sha512_block_data_order, format_output: sha512_format_output, initial_state: State { as64: [ Wrapping(0x22312194fc2bf72c), Wrapping(0x9f555fa3c84c64c2), Wrapping(0x2393b86b6f53b151), Wrapping(0x963877195940eabd), Wrapping(0x96283ee2a88effe3), Wrapping(0xbe5e1e2553863992), Wrapping(0x2b0199fc2c85b8aa), Wrapping(0x0eb72ddc81c52ca2), ], }, id: AlgorithmID::SHA512_256, }; #[derive(Clone, Copy)] // XXX: Why do we need to be `Copy`? #[repr(C)] union State { as64: [Wrapping; sha2::CHAINING_WORDS], as32: [Wrapping; sha2::CHAINING_WORDS], } #[derive(Clone, Copy)] #[repr(C)] union Output { as64: [BigEndian; 512 / 8 / core::mem::size_of::>()], as32: [BigEndian; 256 / 8 / core::mem::size_of::>()], } /// The maximum block length (`Algorithm::block_len`) of all the algorithms in /// this module. pub const MAX_BLOCK_LEN: usize = 1024 / 8; /// The maximum output length (`Algorithm::output_len`) of all the algorithms /// in this module. pub const MAX_OUTPUT_LEN: usize = 512 / 8; /// The maximum chaining length (`Algorithm::chaining_len`) of all the /// algorithms in this module. pub const MAX_CHAINING_LEN: usize = MAX_OUTPUT_LEN; fn sha256_format_output(input: State) -> Output { let input = unsafe { &input.as32 }; Output { as32: [ BigEndian::from(input[0]), BigEndian::from(input[1]), BigEndian::from(input[2]), BigEndian::from(input[3]), BigEndian::from(input[4]), BigEndian::from(input[5]), BigEndian::from(input[6]), BigEndian::from(input[7]), ], } } fn sha512_format_output(input: State) -> Output { let input = unsafe { &input.as64 }; Output { as64: [ BigEndian::from(input[0]), BigEndian::from(input[1]), BigEndian::from(input[2]), BigEndian::from(input[3]), BigEndian::from(input[4]), BigEndian::from(input[5]), BigEndian::from(input[6]), BigEndian::from(input[7]), ], } } /// The length of the output of SHA-1, in bytes. pub const SHA1_OUTPUT_LEN: usize = sha1::OUTPUT_LEN; /// The length of the output of SHA-256, in bytes. pub const SHA256_OUTPUT_LEN: usize = 256 / 8; /// The length of the output of SHA-384, in bytes. pub const SHA384_OUTPUT_LEN: usize = 384 / 8; /// The length of the output of SHA-512, in bytes. pub const SHA512_OUTPUT_LEN: usize = 512 / 8; /// The length of the output of SHA-512/256, in bytes. pub const SHA512_256_OUTPUT_LEN: usize = 256 / 8; /// The length of a block for SHA-512-based algorithms, in bytes. const SHA512_BLOCK_LEN: usize = 1024 / 8; /// The length of the length field for SHA-512-based algorithms, in bytes. const SHA512_LEN_LEN: usize = 128 / 8; #[cfg(test)] mod tests { mod max_input { use super::super::super::digest; use crate::polyfill; use alloc::vec; macro_rules! max_input_tests { ( $algorithm_name:ident ) => { mod $algorithm_name { use super::super::super::super::digest; #[test] fn max_input_test() { super::max_input_test(&digest::$algorithm_name); } #[test] #[should_panic] fn too_long_input_test_block() { super::too_long_input_test_block(&digest::$algorithm_name); } #[test] #[should_panic] fn too_long_input_test_byte() { super::too_long_input_test_byte(&digest::$algorithm_name); } } }; } fn max_input_test(alg: &'static digest::Algorithm) { let mut context = nearly_full_context(alg); let next_input = vec![0u8; alg.block_len - 1]; context.update(&next_input); let _ = context.finish(); // no panic } fn too_long_input_test_block(alg: &'static digest::Algorithm) { let mut context = nearly_full_context(alg); let next_input = vec![0u8; alg.block_len]; context.update(&next_input); let _ = context.finish(); // should panic } fn too_long_input_test_byte(alg: &'static digest::Algorithm) { let mut context = nearly_full_context(alg); let next_input = vec![0u8; alg.block_len - 1]; context.update(&next_input); // no panic context.update(&[0]); let _ = context.finish(); // should panic } fn nearly_full_context(alg: &'static digest::Algorithm) -> digest::Context { // All implementations currently support up to 2^64-1 bits // of input; according to the spec, SHA-384 and SHA-512 // support up to 2^128-1, but that's not implemented yet. let max_bytes = 1u64 << (64 - 3); let max_blocks = max_bytes / polyfill::u64_from_usize(alg.block_len); digest::Context { block: digest::BlockContext { state: alg.initial_state, completed_data_blocks: max_blocks - 1, algorithm: alg, cpu_features: crate::cpu::features(), }, pending: [0u8; digest::MAX_BLOCK_LEN], num_pending: 0, } } max_input_tests!(SHA1_FOR_LEGACY_USE_ONLY); max_input_tests!(SHA256); max_input_tests!(SHA384); max_input_tests!(SHA512); } } ring-0.16.9/src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der000064400000000000000000000000251352416253600217520ustar00000000000000000S0+ep" #!ring-0.16.9/src/ec/curve25519/ed25519/signing.rs000064400000000000000000000236461353036607100166650ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! EdDSA Signatures. use super::{super::ops::*, eddsa_digest, ED25519_PUBLIC_KEY_LEN}; use crate::{ digest, error, io::der, pkcs8, rand, signature::{self, KeyPair as SigningKeyPair}, }; use core::convert::TryInto; use untrusted; /// An Ed25519 key pair, for signing. pub struct Ed25519KeyPair { // RFC 8032 Section 5.1.6 calls this *s*. private_scalar: Scalar, // RFC 8032 Section 5.1.6 calls this *prefix*. private_prefix: Prefix, // RFC 8032 Section 5.1.5 calls this *A*. public_key: PublicKey, } derive_debug_via_field!(Ed25519KeyPair, stringify!(Ed25519KeyPair), public_key); impl Ed25519KeyPair { /// Generates a new key pair and returns the key pair serialized as a /// PKCS#8 document. /// /// The PKCS#8 document will be a v2 `OneAsymmetricKey` with the public key, /// as described in [RFC 5958 Section 2]. See also /// https://tools.ietf.org/html/draft-ietf-curdle-pkix-04. /// /// [RFC 5958 Section 2]: https://tools.ietf.org/html/rfc5958#section-2 pub fn generate_pkcs8( rng: &dyn rand::SecureRandom, ) -> Result { let seed: [u8; SEED_LEN] = rand::generate(rng)?.expose(); let key_pair = Self::from_seed_(&seed); Ok(pkcs8::wrap_key( &PKCS8_TEMPLATE, &seed[..], key_pair.public_key().as_ref(), )) } /// Constructs an Ed25519 key pair by parsing an unencrypted PKCS#8 v2 /// Ed25519 private key. /// /// `openssl genpkey -algorithm ED25519` generates PKCS# v1 keys, which /// require the use of `Ed25519KeyPair::from_pkcs8_maybe_unchecked()` /// instead of `Ed25519KeyPair::from_pkcs8()`. /// /// The input must be in PKCS#8 v2 format, and in particular it must contain /// the public key in addition to the private key. `from_pkcs8()` will /// verify that the public key and the private key are consistent with each /// other. /// /// If you need to parse PKCS#8 v1 files (without the public key) then use /// `Ed25519KeyPair::from_pkcs8_maybe_unchecked()` instead. pub fn from_pkcs8(pkcs8: &[u8]) -> Result { let (seed, public_key) = unwrap_pkcs8(pkcs8::Version::V2Only, untrusted::Input::from(pkcs8))?; Self::from_seed_and_public_key( seed.as_slice_less_safe(), public_key.unwrap().as_slice_less_safe(), ) } /// Constructs an Ed25519 key pair by parsing an unencrypted PKCS#8 v1 or v2 /// Ed25519 private key. /// /// `openssl genpkey -algorithm ED25519` generates PKCS# v1 keys. /// /// It is recommended to use `Ed25519KeyPair::from_pkcs8()`, which accepts /// only PKCS#8 v2 files that contain the public key. /// `from_pkcs8_maybe_unchecked()` parses PKCS#2 files exactly like /// `from_pkcs8()`. It also accepts v1 files. PKCS#8 v1 files do not contain /// the public key, so when a v1 file is parsed the public key will be /// computed from the private key, and there will be no consistency check /// between the public key and the private key. /// /// PKCS#8 v2 files are parsed exactly like `Ed25519KeyPair::from_pkcs8()`. pub fn from_pkcs8_maybe_unchecked(pkcs8: &[u8]) -> Result { let (seed, public_key) = unwrap_pkcs8(pkcs8::Version::V1OrV2, untrusted::Input::from(pkcs8))?; if let Some(public_key) = public_key { Self::from_seed_and_public_key( seed.as_slice_less_safe(), public_key.as_slice_less_safe(), ) } else { Self::from_seed_unchecked(seed.as_slice_less_safe()) } } /// Constructs an Ed25519 key pair from the private key seed `seed` and its /// public key `public_key`. /// /// It is recommended to use `Ed25519KeyPair::from_pkcs8()` instead. /// /// The private and public keys will be verified to be consistent with each /// other. This helps avoid misuse of the key (e.g. accidentally swapping /// the private key and public key, or using the wrong private key for the /// public key). This also detects any corruption of the public or private /// key. pub fn from_seed_and_public_key( seed: &[u8], public_key: &[u8], ) -> Result { let pair = Self::from_seed_unchecked(seed)?; // This implicitly verifies that `public_key` is the right length. // XXX: This rejects ~18 keys when they are partially reduced, though // those keys are virtually impossible to find. if public_key != pair.public_key.as_ref() { let err = if public_key.len() != pair.public_key.as_ref().len() { error::KeyRejected::invalid_encoding() } else { error::KeyRejected::inconsistent_components() }; return Err(err); } Ok(pair) } /// Constructs a Ed25519 key pair from the private key seed `seed`. /// /// It is recommended to use `Ed25519KeyPair::from_pkcs8()` instead. When /// that is not practical, it is recommended to use /// `Ed25519KeyPair::from_seed_and_public_key()` instead. /// /// Since the public key is not given, the public key will be computed from /// the private key. It is not possible to detect misuse or corruption of /// the private key since the public key isn't given as input. pub fn from_seed_unchecked(seed: &[u8]) -> Result { let seed = seed .try_into() .map_err(|_| error::KeyRejected::invalid_encoding())?; Ok(Self::from_seed_(seed)) } fn from_seed_(seed: &Seed) -> Self { let h = digest::digest(&digest::SHA512, seed); let (private_scalar, private_prefix) = h.as_ref().split_at(SCALAR_LEN); let private_scalar = MaskedScalar::from_bytes_masked(private_scalar.try_into().unwrap()).into(); let mut a = ExtPoint::new_at_infinity(); unsafe { GFp_x25519_ge_scalarmult_base(&mut a, &private_scalar); } Self { private_scalar, private_prefix: private_prefix.try_into().unwrap(), public_key: PublicKey(a.into_encoded_point()), } } /// Returns the signature of the message `msg`. pub fn sign(&self, msg: &[u8]) -> signature::Signature { signature::Signature::new(|signature_bytes| { extern "C" { fn GFp_x25519_sc_muladd( s: &mut [u8; SCALAR_LEN], a: &Scalar, b: &Scalar, c: &Scalar, ); } let (signature_bytes, _unused) = signature_bytes.split_at_mut(ELEM_LEN + SCALAR_LEN); let (signature_r, signature_s) = signature_bytes.split_at_mut(ELEM_LEN); let nonce = { let mut ctx = digest::Context::new(&digest::SHA512); ctx.update(&self.private_prefix); ctx.update(msg); ctx.finish() }; let nonce = Scalar::from_sha512_digest_reduced(nonce); let mut r = ExtPoint::new_at_infinity(); unsafe { GFp_x25519_ge_scalarmult_base(&mut r, &nonce); } signature_r.copy_from_slice(&r.into_encoded_point()); let hram_digest = eddsa_digest(signature_r, &self.public_key.as_ref(), msg); let hram = Scalar::from_sha512_digest_reduced(hram_digest); unsafe { GFp_x25519_sc_muladd( signature_s.try_into().unwrap(), &hram, &self.private_scalar, &nonce, ); } SIGNATURE_LEN }) } } impl signature::KeyPair for Ed25519KeyPair { type PublicKey = PublicKey; fn public_key(&self) -> &Self::PublicKey { &self.public_key } } #[derive(Clone, Copy)] pub struct PublicKey([u8; ED25519_PUBLIC_KEY_LEN]); impl AsRef<[u8]> for PublicKey { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } derive_debug_self_as_ref_hex_bytes!(PublicKey); fn unwrap_pkcs8( version: pkcs8::Version, input: untrusted::Input, ) -> Result<(untrusted::Input, Option), error::KeyRejected> { let (private_key, public_key) = pkcs8::unwrap_key(&PKCS8_TEMPLATE, version, input)?; let private_key = private_key .read_all(error::Unspecified, |input| { der::expect_tag_and_get_value(input, der::Tag::OctetString) }) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; Ok((private_key, public_key)) } extern "C" { fn GFp_x25519_ge_scalarmult_base(h: &mut ExtPoint, a: &Scalar); } type Prefix = [u8; PREFIX_LEN]; const PREFIX_LEN: usize = digest::SHA512_OUTPUT_LEN - SCALAR_LEN; const SIGNATURE_LEN: usize = ELEM_LEN + SCALAR_LEN; type Seed = [u8; SEED_LEN]; const SEED_LEN: usize = 32; static PKCS8_TEMPLATE: pkcs8::Template = pkcs8::Template { bytes: include_bytes!("ed25519_pkcs8_v2_template.der"), alg_id_range: core::ops::Range { start: 7, end: 12 }, curve_id_index: 0, private_key_index: 0x10, }; ring-0.16.9/src/ec/curve25519/ed25519/verification.rs000064400000000000000000000056741353036607100177120ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! EdDSA Signatures. use super::{super::ops::*, eddsa_digest}; use crate::{error, sealed, signature}; use core::convert::TryInto; use untrusted; /// Parameters for EdDSA signing and verification. pub struct EdDSAParameters; impl core::fmt::Debug for EdDSAParameters { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { write!(f, "ring::signature::ED25519") } } /// Verification of [Ed25519] signatures. /// /// Ed25519 uses SHA-512 as the digest algorithm. /// /// [Ed25519]: https://ed25519.cr.yp.to/ pub static ED25519: EdDSAParameters = EdDSAParameters {}; impl signature::VerificationAlgorithm for EdDSAParameters { fn verify( &self, public_key: untrusted::Input, msg: untrusted::Input, signature: untrusted::Input, ) -> Result<(), error::Unspecified> { let public_key: &[u8; ELEM_LEN] = public_key.as_slice_less_safe().try_into()?; let (signature_r, signature_s) = signature.read_all(error::Unspecified, |input| { let signature_r: &[u8; ELEM_LEN] = input .read_bytes(ELEM_LEN)? .as_slice_less_safe() .try_into()?; let signature_s: &[u8; SCALAR_LEN] = input .read_bytes(SCALAR_LEN)? .as_slice_less_safe() .try_into()?; Ok((signature_r, signature_s)) })?; let signature_s = Scalar::from_bytes_checked(*signature_s)?; let mut a = ExtPoint::from_encoded_point_vartime(public_key)?; a.invert_vartime(); let h_digest = eddsa_digest(signature_r, public_key, msg.as_slice_less_safe()); let h = Scalar::from_sha512_digest_reduced(h_digest); let mut r = Point::new_at_infinity(); unsafe { GFp_x25519_ge_double_scalarmult_vartime(&mut r, &h, &a, &signature_s) }; let r_check = r.into_encoded_point(); if *signature_r != r_check { return Err(error::Unspecified); } Ok(()) } } impl sealed::Sealed for EdDSAParameters {} extern "C" { fn GFp_x25519_ge_double_scalarmult_vartime( r: &mut Point, a_coeff: &Scalar, a: &ExtPoint, b_coeff: &Scalar, ); } ring-0.16.9/src/ec/curve25519/ed25519.rs000064400000000000000000000023021352416253600152140ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! EdDSA Signatures. use super::ops::ELEM_LEN; use crate::digest; pub mod signing; pub mod verification; /// The length of an Ed25519 public key. pub const ED25519_PUBLIC_KEY_LEN: usize = ELEM_LEN; pub fn eddsa_digest(signature_r: &[u8], public_key: &[u8], msg: &[u8]) -> digest::Digest { let mut ctx = digest::Context::new(&digest::SHA512); ctx.update(signature_r); ctx.update(public_key); ctx.update(msg); ctx.finish() } ring-0.16.9/src/ec/curve25519/ops.rs000064400000000000000000000105461353036607100150250ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Elliptic curve operations on the birationally equivalent curves Curve25519 //! and Edwards25519. pub use super::scalar::{MaskedScalar, Scalar, SCALAR_LEN}; use crate::{ bssl, error, limb::{Limb, LIMB_BITS}, }; use core::marker::PhantomData; // Elem` is `fe` in curve25519/internal.h. // Elem is `fe_loose` in curve25519/internal.h. // Keep this in sync with curve25519/internal.h. #[repr(C)] pub struct Elem { limbs: [Limb; ELEM_LIMBS], // This is called `v` in the C code. encoding: PhantomData, } pub trait Encoding {} pub struct T; impl Encoding for T {} const ELEM_LIMBS: usize = 5 * 64 / LIMB_BITS; impl Elem { fn zero() -> Self { Self { limbs: Default::default(), encoding: PhantomData, } } } impl Elem { fn negate(&mut self) { unsafe { GFp_x25519_fe_neg(self); } } } // An encoding of a curve point. If on Curve25519, it should be encoded as // described in Section 5 of [RFC 7748]. If on Edwards25519, it should be // encoded as described in section 5.1.2 of [RFC 8032]. // // [RFC 7748] https://tools.ietf.org/html/rfc7748#section-5 // [RFC 8032] https://tools.ietf.org/html/rfc8032#section-5.1.2 pub type EncodedPoint = [u8; ELEM_LEN]; pub const ELEM_LEN: usize = 32; // Keep this in sync with `ge_p3` in curve25519/internal.h. #[repr(C)] pub struct ExtPoint { x: Elem, y: Elem, z: Elem, t: Elem, } impl ExtPoint { pub fn new_at_infinity() -> Self { Self { x: Elem::zero(), y: Elem::zero(), z: Elem::zero(), t: Elem::zero(), } } pub fn from_encoded_point_vartime(encoded: &EncodedPoint) -> Result { let mut point = Self::new_at_infinity(); Result::from(unsafe { GFp_x25519_ge_frombytes_vartime(&mut point, encoded) }) .map(|()| point) } pub fn into_encoded_point(self) -> EncodedPoint { encode_point(self.x, self.y, self.z) } pub fn invert_vartime(&mut self) { self.x.negate(); self.t.negate(); } } // Keep this in sync with `ge_p2` in curve25519/internal.h. #[repr(C)] pub struct Point { x: Elem, y: Elem, z: Elem, } impl Point { pub fn new_at_infinity() -> Self { Self { x: Elem::zero(), y: Elem::zero(), z: Elem::zero(), } } pub fn into_encoded_point(self) -> EncodedPoint { encode_point(self.x, self.y, self.z) } } fn encode_point(x: Elem, y: Elem, z: Elem) -> EncodedPoint { let mut bytes = [0; ELEM_LEN]; let sign_bit: u8 = unsafe { let mut recip = Elem::zero(); GFp_x25519_fe_invert(&mut recip, &z); let mut x_over_z = Elem::zero(); GFp_x25519_fe_mul_ttt(&mut x_over_z, &x, &recip); let mut y_over_z = Elem::zero(); GFp_x25519_fe_mul_ttt(&mut y_over_z, &y, &recip); GFp_x25519_fe_tobytes(&mut bytes, &y_over_z); GFp_x25519_fe_isnegative(&x_over_z) }; // The preceding computations must execute in constant time, but this // doesn't need to. bytes[ELEM_LEN - 1] ^= sign_bit << 7; bytes } extern "C" { fn GFp_x25519_fe_invert(out: &mut Elem, z: &Elem); fn GFp_x25519_fe_isnegative(elem: &Elem) -> u8; fn GFp_x25519_fe_mul_ttt(h: &mut Elem, f: &Elem, g: &Elem); fn GFp_x25519_fe_neg(f: &mut Elem); fn GFp_x25519_fe_tobytes(bytes: &mut EncodedPoint, elem: &Elem); fn GFp_x25519_ge_frombytes_vartime(h: &mut ExtPoint, s: &EncodedPoint) -> bssl::Result; } ring-0.16.9/src/ec/curve25519/scalar.rs000064400000000000000000000052651353036607100154730ustar0000000000000000// Copyright 2015-2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{digest, error, limb}; use core::convert::TryInto; #[repr(transparent)] pub struct Scalar([u8; SCALAR_LEN]); pub const SCALAR_LEN: usize = 32; impl Scalar { // Constructs a `Scalar` from `bytes`, failing if `bytes` encodes a scalar // that not in the range [0, n). pub fn from_bytes_checked(bytes: [u8; SCALAR_LEN]) -> Result { const ORDER: [limb::Limb; SCALAR_LEN / limb::LIMB_BYTES] = limbs![0x5cf5d3ed, 0x5812631a, 0xa2f79cd6, 0x14def9de, 0, 0, 0, 0x10000000]; // `bytes` is in little-endian order. let mut reversed = bytes; reversed.reverse(); let mut limbs = [0; SCALAR_LEN / limb::LIMB_BYTES]; limb::parse_big_endian_in_range_and_pad_consttime( untrusted::Input::from(&reversed), limb::AllowZero::Yes, &ORDER, &mut limbs, )?; Ok(Self(bytes)) } // Constructs a `Scalar` from `digest` reduced modulo n. pub fn from_sha512_digest_reduced(digest: digest::Digest) -> Self { extern "C" { fn GFp_x25519_sc_reduce(s: &mut UnreducedScalar); } let mut unreduced = [0u8; digest::SHA512_OUTPUT_LEN]; unreduced.copy_from_slice(digest.as_ref()); unsafe { GFp_x25519_sc_reduce(&mut unreduced) }; Self((&unreduced[..SCALAR_LEN]).try_into().unwrap()) } } #[repr(transparent)] pub struct MaskedScalar([u8; SCALAR_LEN]); impl MaskedScalar { pub fn from_bytes_masked(bytes: [u8; SCALAR_LEN]) -> Self { extern "C" { fn GFp_x25519_sc_mask(a: &mut [u8; SCALAR_LEN]); } let mut r = Self(bytes); unsafe { GFp_x25519_sc_mask(&mut r.0) }; r } } impl From for Scalar { fn from(MaskedScalar(scalar): MaskedScalar) -> Self { Self(scalar) } } type UnreducedScalar = [u8; UNREDUCED_SCALAR_LEN]; const UNREDUCED_SCALAR_LEN: usize = SCALAR_LEN * 2; ring-0.16.9/src/ec/curve25519/x25519.rs000064400000000000000000000131471353036607100151010ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! X25519 Key agreement. use super::{ops, scalar::SCALAR_LEN}; use crate::{agreement, constant_time, cpu, ec, error, rand}; use core::convert::TryInto; use untrusted; static CURVE25519: ec::Curve = ec::Curve { public_key_len: PUBLIC_KEY_LEN, elem_scalar_seed_len: ELEM_AND_SCALAR_LEN, id: ec::CurveID::Curve25519, check_private_key_bytes: x25519_check_private_key_bytes, generate_private_key: x25519_generate_private_key, public_from_private: x25519_public_from_private, }; /// X25519 (ECDH using Curve25519) as described in [RFC 7748]. /// /// Everything is as described in RFC 7748. Key agreement will fail if the /// result of the X25519 operation is zero; see the notes on the /// "all-zero value" in [RFC 7748 section 6.1]. /// /// [RFC 7748]: https://tools.ietf.org/html/rfc7748 /// [RFC 7748 section 6.1]: https://tools.ietf.org/html/rfc7748#section-6.1 pub static X25519: agreement::Algorithm = agreement::Algorithm { curve: &CURVE25519, ecdh: x25519_ecdh, }; fn x25519_check_private_key_bytes(bytes: &[u8]) -> Result<(), error::Unspecified> { debug_assert_eq!(bytes.len(), PRIVATE_KEY_LEN); Ok(()) } fn x25519_generate_private_key( rng: &dyn rand::SecureRandom, out: &mut [u8], ) -> Result<(), error::Unspecified> { rng.fill(out) } fn x25519_public_from_private( public_out: &mut [u8], private_key: &ec::Seed, ) -> Result<(), error::Unspecified> { let public_out = public_out.try_into()?; #[cfg(target_arch = "arm")] let cpu_features = private_key.cpu_features; let private_key: &[u8; SCALAR_LEN] = private_key.bytes_less_safe().try_into()?; let private_key = ops::MaskedScalar::from_bytes_masked(*private_key); #[cfg(all(not(target_os = "ios"), target_arch = "arm"))] { if cpu::arm::NEON.available(cpu_features) { static MONTGOMERY_BASE_POINT: [u8; 32] = [ 9, 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, 0, 0, ]; x25519_neon(public_out, &private_key, &MONTGOMERY_BASE_POINT); return Ok(()); } } extern "C" { fn GFp_x25519_public_from_private_generic_masked( public_key_out: &mut PublicKey, private_key: &PrivateKey, ); } unsafe { GFp_x25519_public_from_private_generic_masked(public_out, &private_key); } Ok(()) } fn x25519_ecdh( out: &mut [u8], my_private_key: &ec::Seed, peer_public_key: untrusted::Input, ) -> Result<(), error::Unspecified> { let cpu_features = my_private_key.cpu_features; let my_private_key: &[u8; SCALAR_LEN] = my_private_key.bytes_less_safe().try_into()?; let my_private_key = ops::MaskedScalar::from_bytes_masked(*my_private_key); let peer_public_key: &[u8; PUBLIC_KEY_LEN] = peer_public_key.as_slice_less_safe().try_into()?; #[cfg_attr( not(all(not(target_os = "ios"), target_arch = "arm")), allow(unused_variables) )] fn scalar_mult( out: &mut ops::EncodedPoint, scalar: &ops::MaskedScalar, point: &ops::EncodedPoint, cpu_features: cpu::Features, ) { #[cfg(all(not(target_os = "ios"), target_arch = "arm"))] { if cpu::arm::NEON.available(cpu_features) { return x25519_neon(out, scalar, point); } } extern "C" { fn GFp_x25519_scalar_mult_generic_masked( out: &mut ops::EncodedPoint, scalar: &ops::MaskedScalar, point: &ops::EncodedPoint, ); } unsafe { GFp_x25519_scalar_mult_generic_masked(out, scalar, point); } } scalar_mult( out.try_into()?, &my_private_key, peer_public_key, cpu_features, ); let zeros: SharedSecret = [0; SHARED_SECRET_LEN]; if constant_time::verify_slices_are_equal(out, &zeros).is_ok() { // All-zero output results when the input is a point of small order. return Err(error::Unspecified); } Ok(()) } #[cfg(all(not(target_os = "ios"), target_arch = "arm"))] fn x25519_neon(out: &mut ops::EncodedPoint, scalar: &ops::MaskedScalar, point: &ops::EncodedPoint) { extern "C" { fn GFp_x25519_NEON( out: &mut ops::EncodedPoint, scalar: &ops::MaskedScalar, point: &ops::EncodedPoint, ); } unsafe { GFp_x25519_NEON(out, scalar, point) } } const ELEM_AND_SCALAR_LEN: usize = ops::ELEM_LEN; type PrivateKey = ops::MaskedScalar; const PRIVATE_KEY_LEN: usize = ELEM_AND_SCALAR_LEN; // An X25519 public key as an encoded Curve25519 point. type PublicKey = [u8; PUBLIC_KEY_LEN]; const PUBLIC_KEY_LEN: usize = ELEM_AND_SCALAR_LEN; // An X25519 shared secret as an encoded Curve25519 point. type SharedSecret = [u8; SHARED_SECRET_LEN]; const SHARED_SECRET_LEN: usize = ELEM_AND_SCALAR_LEN; ring-0.16.9/src/ec/curve25519.rs000064400000000000000000000015611352416253600142240ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Elliptic curve operations and schemes using Curve25519. pub mod ed25519; pub mod x25519; mod ops; mod scalar; ring-0.16.9/src/ec/keys.rs000064400000000000000000000045731352416253600134530ustar0000000000000000use super::{Curve, ELEM_MAX_BYTES, SEED_MAX_BYTES}; use crate::{cpu, error, rand}; pub struct KeyPair { seed: Seed, public_key: PublicKey, } impl KeyPair { pub fn derive(seed: Seed) -> Result { let public_key = seed.compute_public_key()?; Ok(Self { seed, public_key }) } pub fn public_key(&self) -> &PublicKey { &self.public_key } pub fn split(self) -> (Seed, PublicKey) { (self.seed, self.public_key) } } pub struct Seed { bytes: [u8; SEED_MAX_BYTES], curve: &'static Curve, pub(crate) cpu_features: cpu::Features, } impl Seed { pub(crate) fn generate( curve: &'static Curve, rng: &dyn rand::SecureRandom, cpu_features: cpu::Features, ) -> Result { let mut r = Self { bytes: [0u8; SEED_MAX_BYTES], curve, cpu_features, }; (curve.generate_private_key)(rng, &mut r.bytes[..curve.elem_scalar_seed_len])?; Ok(r) } pub(crate) fn from_bytes( curve: &'static Curve, bytes: untrusted::Input, cpu_features: cpu::Features, ) -> Result { let bytes = bytes.as_slice_less_safe(); if curve.elem_scalar_seed_len != bytes.len() { return Err(error::Unspecified); } (curve.check_private_key_bytes)(bytes)?; let mut r = Self { bytes: [0; SEED_MAX_BYTES], curve, cpu_features, }; r.bytes[..curve.elem_scalar_seed_len].copy_from_slice(bytes); Ok(r) } pub fn bytes_less_safe(&self) -> &[u8] { &self.bytes[..self.curve.elem_scalar_seed_len] } pub fn compute_public_key(&self) -> Result { let mut public_key = PublicKey { bytes: [0u8; PUBLIC_KEY_MAX_LEN], len: self.curve.public_key_len, }; (self.curve.public_from_private)(&mut public_key.bytes[..public_key.len], self)?; Ok(public_key) } } #[derive(Copy, Clone)] pub struct PublicKey { bytes: [u8; PUBLIC_KEY_MAX_LEN], len: usize, } impl AsRef<[u8]> for PublicKey { fn as_ref(&self) -> &[u8] { &self.bytes[..self.len] } } /// The maximum length, in bytes, of an encoded public key. pub const PUBLIC_KEY_MAX_LEN: usize = 1 + (2 * ELEM_MAX_BYTES); ring-0.16.9/src/ec/suite_b/curve.rs000064400000000000000000000065101352416253600152470ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{ec, error, rand}; /// A key agreement algorithm. macro_rules! suite_b_curve { ( $NAME:ident, $bits:expr, $private_key_ops:expr, $id:expr, $check_private_key_bytes:ident, $generate_private_key:ident, $public_from_private:ident) => { /// Public keys are encoding in uncompressed form using the /// Octet-String-to-Elliptic-Curve-Point algorithm in /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]. Public keys are /// validated during key agreement according to /// [NIST Special Publication 800-56A, revision 2] and Appendix B.3 of /// the NSA's [Suite B Implementer's Guide to NIST SP 800-56A]. /// /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]: /// http://www.secg.org/sec1-v2.pdf /// [NIST Special Publication 800-56A, revision 2]: /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf /// [Suite B Implementer's Guide to NIST SP 800-56A]: /// https://github.com/briansmith/ring/blob/master/doc/ecdh.pdf pub static $NAME: ec::Curve = ec::Curve { public_key_len: 1 + (2 * (($bits + 7) / 8)), elem_scalar_seed_len: ($bits + 7) / 8, id: $id, check_private_key_bytes: $check_private_key_bytes, generate_private_key: $generate_private_key, public_from_private: $public_from_private, }; fn $check_private_key_bytes(bytes: &[u8]) -> Result<(), error::Unspecified> { debug_assert_eq!(bytes.len(), $bits / 8); ec::suite_b::private_key::check_scalar_big_endian_bytes($private_key_ops, bytes) } fn $generate_private_key( rng: &dyn rand::SecureRandom, out: &mut [u8], ) -> Result<(), error::Unspecified> { ec::suite_b::private_key::generate_private_scalar_bytes($private_key_ops, rng, out) } fn $public_from_private( public_out: &mut [u8], private_key: &ec::Seed, ) -> Result<(), error::Unspecified> { ec::suite_b::private_key::public_from_private($private_key_ops, public_out, private_key) } }; } suite_b_curve!( P256, 256, &ec::suite_b::ops::p256::PRIVATE_KEY_OPS, ec::CurveID::P256, p256_check_private_key_bytes, p256_generate_private_key, p256_public_from_private ); suite_b_curve!( P384, 384, &ec::suite_b::ops::p384::PRIVATE_KEY_OPS, ec::CurveID::P384, p384_check_private_key_bytes, p384_generate_private_key, p384_public_from_private ); ring-0.16.9/src/ec/suite_b/ecdh.rs000064400000000000000000000231711352416253600150300ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! ECDH key agreement using the P-256 and P-384 curves. use super::{ops::*, private_key::*, public_key::*}; use crate::{agreement, ec, error}; use untrusted; /// A key agreement algorithm. macro_rules! ecdh { ( $NAME:ident, $curve:expr, $name_str:expr, $private_key_ops:expr, $public_key_ops:expr, $ecdh:ident ) => { #[doc = "ECDH using the NSA Suite B"] #[doc=$name_str] #[doc = "curve."] /// /// Public keys are encoding in uncompressed form using the /// Octet-String-to-Elliptic-Curve-Point algorithm in /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]. Public keys are /// validated during key agreement according to /// [NIST Special Publication 800-56A, revision 2] and Appendix B.3 of /// the NSA's [Suite B Implementer's Guide to NIST SP 800-56A]. /// /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]: /// http://www.secg.org/sec1-v2.pdf /// [NIST Special Publication 800-56A, revision 2]: /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf /// [Suite B Implementer's Guide to NIST SP 800-56A]: /// https://github.com/briansmith/ring/blob/master/doc/ecdh.pdf pub static $NAME: agreement::Algorithm = agreement::Algorithm { curve: $curve, ecdh: $ecdh, }; fn $ecdh( out: &mut [u8], my_private_key: &ec::Seed, peer_public_key: untrusted::Input, ) -> Result<(), error::Unspecified> { ecdh( $private_key_ops, $public_key_ops, out, my_private_key, peer_public_key, ) } }; } ecdh!( ECDH_P256, &ec::suite_b::curve::P256, "P-256 (secp256r1)", &p256::PRIVATE_KEY_OPS, &p256::PUBLIC_KEY_OPS, p256_ecdh ); ecdh!( ECDH_P384, &ec::suite_b::curve::P384, "P-384 (secp384r1)", &p384::PRIVATE_KEY_OPS, &p384::PUBLIC_KEY_OPS, p384_ecdh ); fn ecdh( private_key_ops: &PrivateKeyOps, public_key_ops: &PublicKeyOps, out: &mut [u8], my_private_key: &ec::Seed, peer_public_key: untrusted::Input, ) -> Result<(), error::Unspecified> { // The NIST SP 800-56Ar2 steps are from section 5.7.1.2 Elliptic Curve // Cryptography Cofactor Diffie-Hellman (ECC CDH) Primitive. // // The "NSA Guide" steps are from section 3.1 of the NSA guide, "Ephemeral // Unified Model." // NSA Guide Step 1 is handled separately. // NIST SP 800-56Ar2 5.6.2.2.2. // NSA Guide Step 2. // // `parse_uncompressed_point` verifies that the point is not at infinity // and that it is on the curve, using the Partial Public-Key Validation // Routine. let peer_public_key = parse_uncompressed_point(public_key_ops, peer_public_key)?; // NIST SP 800-56Ar2 Step 1. // NSA Guide Step 3 (except point at infinity check). // // Note that the cofactor (h) is one since we only support prime-order // curves, so we can safely ignore the cofactor. // // It is impossible for the result to be the point at infinity because our // private key is in the range [1, n) and the curve has prime order and // `parse_uncompressed_point` verified that the peer public key is on the // curve and not at infinity. However, since the standards require the // check, we do it using `assert!`. // // NIST SP 800-56Ar2 defines "Destroy" thusly: "In this Recommendation, to // destroy is an action applied to a key or a piece of secret data. After // a key or a piece of secret data is destroyed, no information about its // value can be recovered." We interpret "destroy" somewhat liberally: we // assume that since we throw away the values to be destroyed, no // information about their values can be recovered. This doesn't meet the // NSA guide's explicit requirement to "zeroize" them though. // TODO: this only needs common scalar ops let my_private_key = private_key_as_scalar(private_key_ops, my_private_key); let product = private_key_ops.point_mul(&my_private_key, &peer_public_key); // NIST SP 800-56Ar2 Steps 2, 3, 4, and 5. // NSA Guide Steps 3 (point at infinity check) and 4. // // Again, we have a pretty liberal interpretation of the NIST's spec's // "Destroy" that doesn't meet the NSA requirement to "zeroize." // `big_endian_affine_from_jacobian` verifies that the result is not at // infinity and also does an extra check to verify that the point is on // the curve. big_endian_affine_from_jacobian(private_key_ops, Some(out), None, &product) // NSA Guide Step 5 & 6 are deferred to the caller. Again, we have a // pretty liberal interpretation of the NIST's spec's "Destroy" that // doesn't meet the NSA requirement to "zeroize." } #[cfg(test)] mod tests { use super::super::ops; use crate::{agreement, ec, limb, test}; static SUPPORTED_SUITE_B_ALGS: [(&str, &agreement::Algorithm, &ec::Curve, &ops::CommonOps); 2] = [ ( "P-256", &agreement::ECDH_P256, &super::super::curve::P256, &super::super::ops::p256::COMMON_OPS, ), ( "P-384", &agreement::ECDH_P384, &super::super::curve::P384, &super::super::ops::p384::COMMON_OPS, ), ]; #[test] fn test_agreement_suite_b_ecdh_generate() { // Generates a string of bytes 0x00...00, which will always result in // a scalar value of zero. let random_00 = test::rand::FixedByteRandom { byte: 0x00 }; // Generates a string of bytes 0xFF...FF, which will be larger than the // group order of any curve that is supported. let random_ff = test::rand::FixedByteRandom { byte: 0xff }; for &(_, alg, curve, ops) in SUPPORTED_SUITE_B_ALGS.iter() { // Test that the private key value zero is rejected and that // `generate` gives up after a while of only getting zeros. assert!(agreement::EphemeralPrivateKey::generate(alg, &random_00).is_err()); // Test that the private key value larger than the group order is // rejected and that `generate` gives up after a while of only // getting values larger than the group order. assert!(agreement::EphemeralPrivateKey::generate(alg, &random_ff).is_err()); // Test that a private key value exactly equal to the group order // is rejected and that `generate` gives up after a while of only // getting that value from the PRNG. let mut n_bytes = [0u8; ec::SCALAR_MAX_BYTES]; let num_bytes = curve.elem_scalar_seed_len; limb::big_endian_from_limbs(&ops.n.limbs[..ops.num_limbs], &mut n_bytes[..num_bytes]); { let n_bytes = &mut n_bytes[..num_bytes]; let rng = test::rand::FixedSliceRandom { bytes: n_bytes }; assert!(agreement::EphemeralPrivateKey::generate(alg, &rng).is_err()); } // Test that a private key value exactly equal to the group order // minus 1 is accepted. let mut n_minus_1_bytes = n_bytes; { let n_minus_1_bytes = &mut n_minus_1_bytes[..num_bytes]; n_minus_1_bytes[num_bytes - 1] -= 1; let rng = test::rand::FixedSliceRandom { bytes: n_minus_1_bytes, }; let key = agreement::EphemeralPrivateKey::generate(alg, &rng).unwrap(); assert_eq!(&n_minus_1_bytes[..], key.bytes()); } // Test that n + 1 also fails. let mut n_plus_1_bytes = n_bytes; { let n_plus_1_bytes = &mut n_plus_1_bytes[..num_bytes]; n_plus_1_bytes[num_bytes - 1] += 1; let rng = test::rand::FixedSliceRandom { bytes: n_plus_1_bytes, }; assert!(agreement::EphemeralPrivateKey::generate(alg, &rng).is_err()); } // Test recovery from initial RNG failure. The first value will be // n, then n + 1, then zero, the next value will be n - 1, which // will be accepted. { let bytes = [ &n_bytes[..num_bytes], &n_plus_1_bytes[..num_bytes], &[0u8; ec::SCALAR_MAX_BYTES][..num_bytes], &n_minus_1_bytes[..num_bytes], ]; let rng = test::rand::FixedSliceSequenceRandom { bytes: &bytes, current: core::cell::UnsafeCell::new(0), }; let key = agreement::EphemeralPrivateKey::generate(alg, &rng).unwrap(); assert_eq!(&n_minus_1_bytes[..num_bytes], key.bytes()); } } } } ring-0.16.9/src/ec/suite_b/ecdsa/digest_scalar.rs000064400000000000000000000122561352416253600200120ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! ECDSA Signatures using the P-256 and P-384 curves. use crate::{ digest, ec::suite_b::ops::*, limb::{self, LIMB_BYTES}, }; use untrusted; /// Calculate the digest of `msg` using the digest algorithm `digest_alg`. Then /// convert the digest to a scalar in the range [0, n) as described in /// NIST's FIPS 186-4 Section 4.2. Note that this is one of the few cases where /// a `Scalar` is allowed to have the value zero. /// /// NIST's FIPS 186-4 4.2 says "When the length of the output of the hash /// function is greater than N (i.e., the bit length of q), then the leftmost N /// bits of the hash function output block shall be used in any calculation /// using the hash function output during the generation or verification of a /// digital signature." /// /// "Leftmost N bits" means "N most significant bits" because we interpret the /// digest as a bit-endian encoded integer. /// /// The NSA guide instead vaguely suggests that we should convert the digest /// value to an integer and then reduce it mod `n`. However, real-world /// implementations (e.g. `digest_to_bn` in OpenSSL and `hashToInt` in Go) do /// what FIPS 186-4 says to do, not what the NSA guide suggests. /// /// Why shifting the value right by at most one bit is sufficient: P-256's `n` /// has its 256th bit set; i.e. 2**255 < n < 2**256. Once we've truncated the /// digest to 256 bits and converted it to an integer, it will have a value /// less than 2**256. If the value is larger than `n` then shifting it one bit /// right will give a value less than 2**255, which is less than `n`. The /// analogous argument applies for P-384. However, it does *not* apply in /// general; for example, it doesn't apply to P-521. pub fn digest_scalar(ops: &ScalarOps, msg: digest::Digest) -> Scalar { digest_scalar_(ops, msg.as_ref()) } #[cfg(test)] pub(crate) fn digest_bytes_scalar(ops: &ScalarOps, digest: &[u8]) -> Scalar { digest_scalar_(ops, digest) } // This is a separate function solely so that we can test specific digest // values like all-zero values and values larger than `n`. fn digest_scalar_(ops: &ScalarOps, digest: &[u8]) -> Scalar { let cops = ops.common; let num_limbs = cops.num_limbs; let digest = if digest.len() > num_limbs * LIMB_BYTES { &digest[..(num_limbs * LIMB_BYTES)] } else { digest }; scalar_parse_big_endian_partially_reduced_variable_consttime( cops, limb::AllowZero::Yes, untrusted::Input::from(digest), ) .unwrap() } #[cfg(test)] mod tests { use super::digest_bytes_scalar; use crate::{ digest, ec::suite_b::ops::*, limb::{self, LIMB_BYTES}, test, }; use untrusted; #[test] fn test() { test::run( test_file!("ecdsa_digest_scalar_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); let input = test_case.consume_bytes("Input"); let output = test_case.consume_bytes("Output"); let (ops, digest_alg) = match (curve_name.as_str(), digest_name.as_str()) { ("P-256", "SHA256") => (&p256::PUBLIC_SCALAR_OPS, &digest::SHA256), ("P-256", "SHA384") => (&p256::PUBLIC_SCALAR_OPS, &digest::SHA384), ("P-384", "SHA256") => (&p384::PUBLIC_SCALAR_OPS, &digest::SHA256), ("P-384", "SHA384") => (&p384::PUBLIC_SCALAR_OPS, &digest::SHA384), _ => { panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); } }; let num_limbs = ops.public_key_ops.common.num_limbs; assert_eq!(input.len(), digest_alg.output_len); assert_eq!( output.len(), ops.public_key_ops.common.num_limbs * LIMB_BYTES ); let expected = scalar_parse_big_endian_variable( ops.public_key_ops.common, limb::AllowZero::Yes, untrusted::Input::from(&output), ) .unwrap(); let actual = digest_bytes_scalar(ops.scalar_ops, &input); assert_eq!(actual.limbs[..num_limbs], expected.limbs[..num_limbs]); Ok(()) }, ); } } ring-0.16.9/src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der000064400000000000000000000000511352416253600237060ustar000000000000000000*H=*H=m0k DBring-0.16.9/src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der000064400000000000000000000000501352416253600237070ustar000000000000000000*H=+"00dbring-0.16.9/src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt000064400000000000000000000063201352416253600225610ustar0000000000000000# Test vectors for the conversion of digest values to scalars. # Minimum Digest Values. Curve = P-256 Digest = SHA256 Input = 0000000000000000000000000000000000000000000000000000000000000000 Output = 0000000000000000000000000000000000000000000000000000000000000000 Curve = P-256 Digest = SHA384 Input = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Output = 0000000000000000000000000000000000000000000000000000000000000000 Curve = P-384 Digest = SHA256 Input = 0000000000000000000000000000000000000000000000000000000000000000 Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Curve = P-384 Digest = SHA384 Input = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # The truncated digest value is equal to n - 1 (not possible when digest is # shorter than the curve's scalars). Curve = P-256 Digest = SHA256 Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 Output = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 Curve = P-256 Digest = SHA384 Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63255000000000000000000000000000000000 Output = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 Curve = P-384 Digest = SHA384 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52972 Output = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52972 # The truncated digest value is equal to n (not possible when digest is shorter # than the curve's scalars). Curve = P-256 Digest = SHA256 Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551 Output = 0000000000000000000000000000000000000000000000000000000000000000 Curve = P-256 Digest = SHA384 Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63255100000000000000000000000000000000 Output = 0000000000000000000000000000000000000000000000000000000000000000 Curve = P-384 Digest = SHA384 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973 Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 # Maximum digest values. Curve = P-256 Digest = SHA256 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 00000000FFFFFFFF00000000000000004319055258E8617B0C46353D039CDAAE Curve = P-256 Digest = SHA384 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 00000000FFFFFFFF00000000000000004319055258E8617B0C46353D039CDAAE Curve = P-384 Digest = SHA256 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Curve = P-384 Digest = SHA384 Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 000000000000000000000000000000000000000000000000389CB27E0BC8D220A7E5F24DB74F58851313E695333AD68C ring-0.16.9/src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt000064400000000000000000000032341352416253600216400ustar0000000000000000# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Generation Test # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # # CAVS 11.2 # "SigVer" information for "ecdsa_values" # Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 # Generated on Tue Aug 16 15:27:42 2011 # [P-256,SHA-256] Curve = P-256 Digest = SHA256 Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 Q = 041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de Sig = 3046022100f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac0221008bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 ring-0.16.9/src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt000064400000000000000000000605441352416253600221040ustar0000000000000000# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Generation Test # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # # CAVS 11.2 # "SigVer" information for "ecdsa_values" # Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 # Generated on Tue Aug 16 15:27:42 2011 # [P-256,SHA-256] Curve = P-256 Digest = SHA256 Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 Q = 041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de Sig = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 Curve = P-256 Digest = SHA256 Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1 d = 0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813 Q = 04e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8abfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39 k = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6 Sig = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932 Curve = P-256 Digest = SHA256 Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee d = e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef Q = 0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614 k = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2 Sig = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96 Curve = P-256 Digest = SHA256 Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30 d = a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07 Q = 04322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e13c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999 k = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18 Sig = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884cab46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89 Curve = P-256 Digest = SHA256 Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7 d = 53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d Q = 041bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba829630572448af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1 k = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4 Sig = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c38718260477c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c Curve = P-256 Digest = SHA256 Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71 d = 4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d Q = 04a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9 k = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab Sig = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb Curve = P-256 Digest = SHA256 Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b d = 78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab Q = 048bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c974790f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96 k = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77 Sig = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b25484a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30 Curve = P-256 Digest = SHA256 Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b d = 80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a Q = 04a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e7672d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185 k = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22 Sig = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f Curve = P-256 Digest = SHA256 Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8 d = 5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881 Q = 041bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3aec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f k = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9 Sig = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199 Curve = P-256 Digest = SHA256 Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e d = f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308 Q = 04b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a k = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615 Sig = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430 Curve = P-256 Digest = SHA256 Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a d = b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906 Q = 0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1 k = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f Sig = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c Curve = P-256 Digest = SHA256 Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4 d = d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7 Q = 048fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb71f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573 k = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778 Sig = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7 Curve = P-256 Digest = SHA256 Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7 d = b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c Q = 0468229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c k = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071 Sig = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333 Curve = P-256 Digest = SHA256 Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01 d = 54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1 Q = 040a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bbf26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae k = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a Sig = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64bd7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851 Curve = P-256 Digest = SHA256 Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34 d = 34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1 Q = 04105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d737376c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4 k = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4 Sig = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d9626634f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f # [P-384,SHA-384] Curve = P-384 Digest = SHA384 Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe d = 201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97 Q = 04c2b47944fb5de342d03285880177ca5f7d0f2fcad7678cce4229d6e1932fcac11bfc3c3e97d942a3c56bf34123013dbf37257906a8223866eda0743c519616a76a758ae58aee81c5fd35fbf3a855b7754a36d4a0672df95d6c44a81cf7620c2d k = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771 Sig = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e320475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721 Curve = P-384 Digest = SHA384 Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4 d = 23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528 Q = 045d42d6301c54a438f65970bae2a098cbc567e98840006e356221966c86d82e8eca515bca850eaa3cd41f175f03a0cbfd4aef5a0ceece95d382bd70ab5ce1cb77408bae42b51a08816d5e5e1d3da8c18fcc95564a752730b0aabea983ccea4e2e k = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890 Sig = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca Curve = P-384 Digest = SHA384 Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf d = b5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6 Q = 0444ffb2a3a95e12d87c72b5ea0a8a7cb89f56b3bd46342b2303608d7216301c21b5d2921d80b6628dc512ccb84e2fc278e4c1002f1828abaec768cadcb7cf42fbf93b1709ccae6df5b134c41fae2b9a188bfbe1eccff0bd348517d7227f2071a6 k = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4 Sig = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d494eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc Curve = P-384 Digest = SHA384 Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a d = de5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976 Q = 04f1fabafc01fec7e96d982528d9ef3a2a18b7fe8ae0fa0673977341c7ae4ae8d8d3d67420343d013a984f5f61da29ae381a31cf902c46343d01b2ebb614bc789c313b5f91f9302ad9418e9c797563e2fa3d44500f47b4e26ad8fdec1a816d1dcf k = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d Sig = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f Curve = P-384 Digest = SHA384 Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc d = 11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc Q = 041950166989164cbfd97968c7e8adb6fbca1873ebef811ea259eb48b7d584627f0e6d6c64defe23cbc95236505a252aa141ef424b5cb076d4e32accd9250ea75fcf4ffd81814040c050d58c0a29b06be11edf67c911b403e418b7277417e52906 k = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5 Sig = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe Curve = P-384 Digest = SHA384 Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d d = 5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2 Q = 042e01c5b59e619e00b79060a1e8ef695472e23bf9a511fc3d5ed77a334a242557098e40972713732c5291c97adf9cf2cf563e3fe4ad807e803b9e961b08da4dde4cea8925649da0d93221ce4cdceabc6a1db7612180a8c6bef3579c65539b97e9 k = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77 Sig = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb Curve = P-384 Digest = SHA384 Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416 d = ffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1 Q = 0451c78c979452edd53b563f63eb3e854a5b23e87f1b2103942b65f77d024471f75c8ce1cc0dfef83292b368112aa5126e313e6aaf09caa3ba30f13072b2134878f14a4a01ee86326cccbff3d079b4df097dc57985e8c8c834a10cb9d766169366 k = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a Sig = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf5657c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f Curve = P-384 Digest = SHA384 Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2 d = adca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6 Q = 04ef948daae68242330a7358ef73f23b56c07e37126266db3fa6eea233a04a9b3e4915233dd6754427cd4b71b75854077d009453ef1828eaff9e17c856d4fc1895ab60051312c3e1db1e3766566438b2990cbf9945c2545619e3e0145bc6a79004 k = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e Sig = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bfa0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b Curve = P-384 Digest = SHA384 Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed d = 39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d Q = 045709ec4305a9c3271c304face6c148142490b827a73a4c17affcfd01fffd7eaa65d2fdedfa2419fc64ed910823513fafb083cda1cf3be6371b6c06e729ea6299213428db57119347247ec1fcd44204386cc0bca3f452d9d864b39efbfc89d6b2 k = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f Sig = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea64a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa Curve = P-384 Digest = SHA384 Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26 d = e849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7 Q = 0406c037a0cbf43fdf335dff33de06d34348405353f9fdf2ce1361efba30fb204aea9dbd2e30da0a10fd2d876188371be6360d38f3940e34679204b98fbf70b8a4d97f25443e46d0807ab634ed5891ad864dd7703557aa933cd380e26eea662a43 k = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d Sig = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b52cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa Curve = P-384 Digest = SHA384 Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271 d = d89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca Q = 0449a1c631f31cf5c45b2676b1f130cbf9be683d0a50dffae0d147c1e9913ab1090c6529a84f47ddc7cf025921b771355a1e207eece62f2bcc6bdabc1113158145170be97469a2904eaaa93aad85b86a19719207f3e423051f5b9cbbe2754eefcb k = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08 Sig = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074bae5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad Curve = P-384 Digest = SHA384 Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0 d = 083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d Q = 0470a0f16b6c61172659b027ed19b18fd8f57bd28dc0501f207bd6b0bb065b5671cf3dd1ed13d388dcf6ccc766597aa6044f845bf01c3c3f6126a7368c3454f51425801ee0b72e63fb6799b4420bfdebe3e37c7246db627cc82c09654979c700bb k = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552 Sig = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a Curve = P-384 Digest = SHA384 Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663 d = 63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368 Q = 04cadbacef4406099316db2ce3206adc636c2bb0a835847ed7941efb02862472f3150338f13f4860d47f39b7e098f0a390752ad0f22c9c264336cde11bbc95d1816ed4d1b1500db6b8dce259a42832e613c31178c2c7995206a62e201ba108f570 k = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a Sig = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97afcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27 Curve = P-384 Digest = SHA384 Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b d = ed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283 Q = 0433093a0568757e8b58df5b72ea5fe5bf26e6f7aeb541b4c6a8c189c93721749bcaceccf2982a2f0702586a9f812fc66febe320d09e1f0662189d50b85a20403b821ac0d000afdbf66a0a33f304726c69e354d81c50b94ba3a5250efc31319cd1 k = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5 Sig = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb Curve = P-384 Digest = SHA384 Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9 d = e9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb Q = 04a39ac353ca787982c577aff1e8601ce192aa90fd0de4c0ed627f66a8b6f02ae51315543f72ffc1c48a7269b25e7c289a9064a507b66b340b6e0e0d5ffaa67dd20e6dafc0ea6a6faee1635177af256f9108a22e9edf736ab4ae8e96dc207b1fa9 k = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763 Sig = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735caf10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138 ring-0.16.9/src/ec/suite_b/ecdsa/signing.rs000064400000000000000000000413631352416253600166450ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! ECDSA Signatures using the P-256 and P-384 curves. use super::digest_scalar::digest_scalar; use crate::{ arithmetic::montgomery::*, cpu, digest, ec::{ self, suite_b::{ops::*, private_key}, }, error, io::der, limb, pkcs8, rand, sealed, signature, }; use untrusted; /// An ECDSA signing algorithm. pub struct EcdsaSigningAlgorithm { curve: &'static ec::Curve, private_scalar_ops: &'static PrivateScalarOps, private_key_ops: &'static PrivateKeyOps, digest_alg: &'static digest::Algorithm, pkcs8_template: &'static pkcs8::Template, format_rs: fn(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize, id: AlgorithmID, } #[derive(Debug, Eq, PartialEq)] enum AlgorithmID { ECDSA_P256_SHA256_FIXED_SIGNING, ECDSA_P384_SHA384_FIXED_SIGNING, ECDSA_P256_SHA256_ASN1_SIGNING, ECDSA_P384_SHA384_ASN1_SIGNING, } derive_debug_via_id!(EcdsaSigningAlgorithm); impl PartialEq for EcdsaSigningAlgorithm { fn eq(&self, other: &Self) -> bool { self.id == other.id } } impl Eq for EcdsaSigningAlgorithm {} impl sealed::Sealed for EcdsaSigningAlgorithm {} /// An ECDSA key pair, used for signing. pub struct EcdsaKeyPair { d: Scalar, alg: &'static EcdsaSigningAlgorithm, public_key: PublicKey, } derive_debug_via_field!(EcdsaKeyPair, stringify!(EcdsaKeyPair), public_key); impl EcdsaKeyPair { /// Generates a new key pair and returns the key pair serialized as a /// PKCS#8 document. /// /// The PKCS#8 document will be a v1 `OneAsymmetricKey` with the public key /// included in the `ECPrivateKey` structure, as described in /// [RFC 5958 Section 2] and [RFC 5915]. The `ECPrivateKey` structure will /// not have a `parameters` field so the generated key is compatible with /// PKCS#11. /// /// [RFC 5915]: https://tools.ietf.org/html/rfc5915 /// [RFC 5958 Section 2]: https://tools.ietf.org/html/rfc5958#section-2 pub fn generate_pkcs8( alg: &'static EcdsaSigningAlgorithm, rng: &dyn rand::SecureRandom, ) -> Result { let private_key = ec::Seed::generate(alg.curve, rng, cpu::features())?; let public_key = private_key.compute_public_key()?; Ok(pkcs8::wrap_key( &alg.pkcs8_template, private_key.bytes_less_safe(), public_key.as_ref(), )) } /// Constructs an ECDSA key pair by parsing an unencrypted PKCS#8 v1 /// id-ecPublicKey `ECPrivateKey` key. /// /// The input must be in PKCS#8 v1 format. It must contain the public key in /// the `ECPrivateKey` structure; `from_pkcs8()` will verify that the public /// key and the private key are consistent with each other. The algorithm /// identifier must identify the curve by name; it must not use an /// "explicit" encoding of the curve. The `parameters` field of the /// `ECPrivateKey`, if present, must be the same named curve that is in the /// algorithm identifier in the PKCS#8 header. pub fn from_pkcs8( alg: &'static EcdsaSigningAlgorithm, pkcs8: &[u8], ) -> Result { let key_pair = ec::suite_b::key_pair_from_pkcs8( alg.curve, alg.pkcs8_template, untrusted::Input::from(pkcs8), cpu::features(), )?; Ok(Self::new(alg, key_pair)) } /// Constructs an ECDSA key pair directly from the big-endian-encoded /// private key and public key bytes. /// /// This is intended for use by code that deserializes key pairs. It is /// recommended to use `RsaPubeyPair::from_pkcs8()` (with a PKCS#8-encoded /// key) instead. pub fn from_private_key_and_public_key( alg: &'static EcdsaSigningAlgorithm, private_key: &[u8], public_key: &[u8], ) -> Result { let key_pair = ec::suite_b::key_pair_from_bytes( alg.curve, untrusted::Input::from(private_key), untrusted::Input::from(public_key), cpu::features(), )?; Ok(Self::new(alg, key_pair)) } fn new(alg: &'static EcdsaSigningAlgorithm, key_pair: ec::KeyPair) -> Self { let (seed, public_key) = key_pair.split(); let d = private_key::private_key_as_scalar(alg.private_key_ops, &seed); let d = alg .private_scalar_ops .scalar_ops .scalar_product(&d, &alg.private_scalar_ops.oneRR_mod_n); Self { d, alg, public_key: PublicKey(public_key), } } /// Returns the signature of the `message` using a random nonce /// generated by `rng`. pub fn sign( &self, rng: &dyn rand::SecureRandom, message: &[u8], ) -> Result { // Step 4 (out of order). let h = digest::digest(self.alg.digest_alg, message); self.sign_(rng, h) } /// Returns the signature of message digest `h` using a "random" nonce /// generated by `rng`. fn sign_( &self, rng: &dyn rand::SecureRandom, h: digest::Digest, ) -> Result { // NSA Suite B Implementer's Guide to ECDSA Section 3.4.1: ECDSA // Signature Generation. // NSA Guide Prerequisites: // // Prior to generating an ECDSA signature, the signatory shall // obtain: // // 1. an authentic copy of the domain parameters, // 2. a digital signature key pair (d,Q), either generated by a // method from Appendix A.1, or obtained from a trusted third // party, // 3. assurance of the validity of the public key Q (see Appendix // A.3), and // 4. assurance that he/she/it actually possesses the associated // private key d (see [SP800-89] Section 6). // // The domain parameters are hard-coded into the source code. // `EcdsaKeyPair::generate_pkcs8()` can be used to meet the second // requirement; otherwise, it is up to the user to ensure the key pair // was obtained from a trusted private key. The constructors for // `EcdsaKeyPair` ensure that #3 and #4 are met subject to the caveats // in SP800-89 Section 6. let ops = self.alg.private_scalar_ops; let scalar_ops = ops.scalar_ops; let cops = scalar_ops.common; let private_key_ops = self.alg.private_key_ops; for _ in 0..100 { // XXX: iteration conut? // Step 1. let k = private_key::random_scalar(self.alg.private_key_ops, rng)?; let k_inv = scalar_ops.scalar_inv_to_mont(&k); // Step 2. let r = private_key_ops.point_mul_base(&k); // Step 3. let r = { let (x, _) = private_key::affine_from_jacobian(private_key_ops, &r)?; let x = cops.elem_unencoded(&x); elem_reduced_to_scalar(cops, &x) }; if cops.is_zero(&r) { continue; } // Step 4 is done by the caller. // Step 5. let e = digest_scalar(scalar_ops, h); // Step 6. let s = { let dr = scalar_ops.scalar_product(&self.d, &r); let e_plus_dr = scalar_sum(cops, &e, &dr); scalar_ops.scalar_product(&k_inv, &e_plus_dr) }; if cops.is_zero(&s) { continue; } // Step 7 with encoding. return Ok(signature::Signature::new(|sig_bytes| { (self.alg.format_rs)(scalar_ops, &r, &s, sig_bytes) })); } Err(error::Unspecified) } } impl signature::KeyPair for EcdsaKeyPair { type PublicKey = PublicKey; fn public_key(&self) -> &Self::PublicKey { &self.public_key } } #[derive(Clone, Copy)] pub struct PublicKey(ec::PublicKey); derive_debug_self_as_ref_hex_bytes!(PublicKey); impl AsRef<[u8]> for PublicKey { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } fn format_rs_fixed(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize { let scalar_len = ops.scalar_bytes_len(); let (r_out, rest) = out.split_at_mut(scalar_len); limb::big_endian_from_limbs(&r.limbs[..ops.common.num_limbs], r_out); let (s_out, _) = rest.split_at_mut(scalar_len); limb::big_endian_from_limbs(&s.limbs[..ops.common.num_limbs], s_out); 2 * scalar_len } fn format_rs_asn1(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize { // This assumes `a` is not zero since neither `r` or `s` is allowed to be // zero. fn format_integer_tlv(ops: &ScalarOps, a: &Scalar, out: &mut [u8]) -> usize { let mut fixed = [0u8; ec::SCALAR_MAX_BYTES + 1]; let fixed = &mut fixed[..(ops.scalar_bytes_len() + 1)]; limb::big_endian_from_limbs(&a.limbs[..ops.common.num_limbs], &mut fixed[1..]); // Since `a_fixed_out` is an extra byte long, it is guaranteed to start // with a zero. debug_assert_eq!(fixed[0], 0); // There must be at least one non-zero byte since `a` isn't zero. let first_index = fixed.iter().position(|b| *b != 0).unwrap(); // If the first byte has its high bit set, it needs to be prefixed with 0x00. let first_index = if fixed[first_index] & 0x80 != 0 { first_index - 1 } else { first_index }; let value = &fixed[first_index..]; out[0] = der::Tag::Integer as u8; // Lengths less than 128 are encoded in one byte. assert!(value.len() < 128); out[1] = value.len() as u8; out[2..][..value.len()].copy_from_slice(&value); 2 + value.len() } out[0] = der::Tag::Sequence as u8; let r_tlv_len = format_integer_tlv(ops, r, &mut out[2..]); let s_tlv_len = format_integer_tlv(ops, s, &mut out[2..][r_tlv_len..]); // Lengths less than 128 are encoded in one byte. let value_len = r_tlv_len + s_tlv_len; assert!(value_len < 128); out[1] = value_len as u8; 2 + value_len } /// Signing of fixed-length (PKCS#11 style) ECDSA signatures using the /// P-256 curve and SHA-256. /// /// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P256_SHA256_FIXED_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { curve: &ec::suite_b::curve::P256, private_scalar_ops: &p256::PRIVATE_SCALAR_OPS, private_key_ops: &p256::PRIVATE_KEY_OPS, digest_alg: &digest::SHA256, pkcs8_template: &EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE, format_rs: format_rs_fixed, id: AlgorithmID::ECDSA_P256_SHA256_FIXED_SIGNING, }; /// Signing of fixed-length (PKCS#11 style) ECDSA signatures using the /// P-384 curve and SHA-384. /// /// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P384_SHA384_FIXED_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { curve: &ec::suite_b::curve::P384, private_scalar_ops: &p384::PRIVATE_SCALAR_OPS, private_key_ops: &p384::PRIVATE_KEY_OPS, digest_alg: &digest::SHA384, pkcs8_template: &EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE, format_rs: format_rs_fixed, id: AlgorithmID::ECDSA_P384_SHA384_FIXED_SIGNING, }; /// Signing of ASN.1 DER-encoded ECDSA signatures using the P-256 curve and /// SHA-256. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P256_SHA256_ASN1_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { curve: &ec::suite_b::curve::P256, private_scalar_ops: &p256::PRIVATE_SCALAR_OPS, private_key_ops: &p256::PRIVATE_KEY_OPS, digest_alg: &digest::SHA256, pkcs8_template: &EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE, format_rs: format_rs_asn1, id: AlgorithmID::ECDSA_P256_SHA256_ASN1_SIGNING, }; /// Signing of ASN.1 DER-encoded ECDSA signatures using the P-384 curve and /// SHA-384. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P384_SHA384_ASN1_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { curve: &ec::suite_b::curve::P384, private_scalar_ops: &p384::PRIVATE_SCALAR_OPS, private_key_ops: &p384::PRIVATE_KEY_OPS, digest_alg: &digest::SHA384, pkcs8_template: &EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE, format_rs: format_rs_asn1, id: AlgorithmID::ECDSA_P384_SHA384_ASN1_SIGNING, }; static EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE: pkcs8::Template = pkcs8::Template { bytes: include_bytes!("ecPublicKey_p256_pkcs8_v1_template.der"), alg_id_range: core::ops::Range { start: 8, end: 27 }, curve_id_index: 9, private_key_index: 0x24, }; static EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE: pkcs8::Template = pkcs8::Template { bytes: include_bytes!("ecPublicKey_p384_pkcs8_v1_template.der"), alg_id_range: core::ops::Range { start: 8, end: 24 }, curve_id_index: 9, private_key_index: 0x23, }; #[cfg(test)] mod tests { use crate::{signature, test}; #[test] fn signature_ecdsa_sign_fixed_test() { test::run( test_file!("ecdsa_sign_fixed_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); let msg = test_case.consume_bytes("Msg"); let d = test_case.consume_bytes("d"); let q = test_case.consume_bytes("Q"); let k = test_case.consume_bytes("k"); let expected_result = test_case.consume_bytes("Sig"); let alg = match (curve_name.as_str(), digest_name.as_str()) { ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_FIXED_SIGNING, ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_FIXED_SIGNING, _ => { panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); } }; let private_key = signature::EcdsaKeyPair::from_private_key_and_public_key(alg, &d, &q).unwrap(); let rng = test::rand::FixedSliceRandom { bytes: &k }; let actual_result = private_key.sign(&rng, &msg).unwrap(); assert_eq!(actual_result.as_ref(), &expected_result[..]); Ok(()) }, ); } #[test] fn signature_ecdsa_sign_asn1_test() { test::run( test_file!("ecdsa_sign_asn1_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); let msg = test_case.consume_bytes("Msg"); let d = test_case.consume_bytes("d"); let q = test_case.consume_bytes("Q"); let k = test_case.consume_bytes("k"); let expected_result = test_case.consume_bytes("Sig"); let alg = match (curve_name.as_str(), digest_name.as_str()) { ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1_SIGNING, ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1_SIGNING, _ => { panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); } }; let private_key = signature::EcdsaKeyPair::from_private_key_and_public_key(alg, &d, &q).unwrap(); let rng = test::rand::FixedSliceRandom { bytes: &k }; let actual_result = private_key.sign(&rng, &msg).unwrap(); assert_eq!(actual_result.as_ref(), &expected_result[..]); Ok(()) }, ); } } ring-0.16.9/src/ec/suite_b/ecdsa/verification.rs000064400000000000000000000316131352416253600176660ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! ECDSA Signatures using the P-256 and P-384 curves. use super::digest_scalar::digest_scalar; use crate::{ arithmetic::montgomery::*, digest, ec::suite_b::{ops::*, public_key::*, verify_jacobian_point_is_on_the_curve}, error, io::der, limb, sealed, signature, }; use untrusted; /// An ECDSA verification algorithm. pub struct EcdsaVerificationAlgorithm { ops: &'static PublicScalarOps, digest_alg: &'static digest::Algorithm, split_rs: for<'a> fn( ops: &'static ScalarOps, input: &mut untrusted::Reader<'a>, ) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified>, id: AlgorithmID, } #[derive(Debug)] enum AlgorithmID { ECDSA_P256_SHA256_ASN1, ECDSA_P256_SHA256_FIXED, ECDSA_P256_SHA384_ASN1, ECDSA_P384_SHA256_ASN1, ECDSA_P384_SHA384_ASN1, ECDSA_P384_SHA384_FIXED, } derive_debug_via_id!(EcdsaVerificationAlgorithm); impl signature::VerificationAlgorithm for EcdsaVerificationAlgorithm { fn verify( &self, public_key: untrusted::Input, msg: untrusted::Input, signature: untrusted::Input, ) -> Result<(), error::Unspecified> { let e = { // NSA Guide Step 2: "Use the selected hash function to compute H = // Hash(M)." let h = digest::digest(self.digest_alg, msg.as_slice_less_safe()); // NSA Guide Step 3: "Convert the bit string H to an integer e as // described in Appendix B.2." digest_scalar(self.ops.scalar_ops, h) }; self.verify_digest(public_key, e, signature) } } impl EcdsaVerificationAlgorithm { /// This is intentionally not public. fn verify_digest( &self, public_key: untrusted::Input, e: Scalar, signature: untrusted::Input, ) -> Result<(), error::Unspecified> { // NSA Suite B Implementer's Guide to ECDSA Section 3.4.2. let public_key_ops = self.ops.public_key_ops; let scalar_ops = self.ops.scalar_ops; // NSA Guide Prerequisites: // // Prior to accepting a verified digital signature as valid the // verifier shall have: // // 1. assurance of the signatory’s claimed identity, // 2. an authentic copy of the domain parameters, (q, FR, a, b, SEED, // G, n, h), // 3. assurance of the validity of the public key, and // 4. assurance that the claimed signatory actually possessed the // private key that was used to generate the digital signature at // the time that the signature was generated. // // Prerequisites #1 and #4 are outside the scope of what this function // can do. Prerequisite #2 is handled implicitly as the domain // parameters are hard-coded into the source. Prerequisite #3 is // handled by `parse_uncompressed_point`. let peer_pub_key = parse_uncompressed_point(public_key_ops, public_key)?; let (r, s) = signature.read_all(error::Unspecified, |input| { (self.split_rs)(scalar_ops, input) })?; // NSA Guide Step 1: "If r and s are not both integers in the interval // [1, n − 1], output INVALID." let r = scalar_parse_big_endian_variable(public_key_ops.common, limb::AllowZero::No, r)?; let s = scalar_parse_big_endian_variable(public_key_ops.common, limb::AllowZero::No, s)?; // NSA Guide Step 4: "Compute w = s**−1 mod n, using the routine in // Appendix B.1." let w = scalar_ops.scalar_inv_to_mont(&s); // NSA Guide Step 5: "Compute u1 = (e * w) mod n, and compute // u2 = (r * w) mod n." let u1 = scalar_ops.scalar_product(&e, &w); let u2 = scalar_ops.scalar_product(&r, &w); // NSA Guide Step 6: "Compute the elliptic curve point // R = (xR, yR) = u1*G + u2*Q, using EC scalar multiplication and EC // addition. If R is equal to the point at infinity, output INVALID." let product = twin_mul(self.ops.private_key_ops, &u1, &u2, &peer_pub_key); // Verify that the point we computed is on the curve; see // `verify_affine_point_is_on_the_curve_scaled` for details on why. It // would be more secure to do the check on the affine coordinates if we // were going to convert to affine form (again, see // `verify_affine_point_is_on_the_curve_scaled` for details on why). // But, we're going to avoid converting to affine for performance // reasons, so we do the verification using the Jacobian coordinates. let z2 = verify_jacobian_point_is_on_the_curve(public_key_ops.common, &product)?; // NSA Guide Step 7: "Compute v = xR mod n." // NSA Guide Step 8: "Compare v and r0. If v = r0, output VALID; // otherwise, output INVALID." // // Instead, we use Greg Maxwell's trick to avoid the inversion mod `q` // that would be necessary to compute the affine X coordinate. let x = public_key_ops.common.point_x(&product); fn sig_r_equals_x( ops: &PublicScalarOps, r: &Elem, x: &Elem, z2: &Elem, ) -> bool { let cops = ops.public_key_ops.common; let r_jacobian = cops.elem_product(z2, r); let x = cops.elem_unencoded(x); ops.elem_equals(&r_jacobian, &x) } let r = self.ops.scalar_as_elem(&r); if sig_r_equals_x(self.ops, &r, &x, &z2) { return Ok(()); } if self.ops.elem_less_than(&r, &self.ops.q_minus_n) { let r_plus_n = self.ops.elem_sum(&r, &public_key_ops.common.n); if sig_r_equals_x(self.ops, &r_plus_n, &x, &z2) { return Ok(()); } } Err(error::Unspecified) } } impl sealed::Sealed for EcdsaVerificationAlgorithm {} fn split_rs_fixed<'a>( ops: &'static ScalarOps, input: &mut untrusted::Reader<'a>, ) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified> { let scalar_len = ops.scalar_bytes_len(); let r = input.read_bytes(scalar_len)?; let s = input.read_bytes(scalar_len)?; Ok((r, s)) } fn split_rs_asn1<'a>( _ops: &'static ScalarOps, input: &mut untrusted::Reader<'a>, ) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified> { der::nested(input, der::Tag::Sequence, error::Unspecified, |input| { let r = der::positive_integer(input)?.big_endian_without_leading_zero_as_input(); let s = der::positive_integer(input)?.big_endian_without_leading_zero_as_input(); Ok((r, s)) }) } fn twin_mul( ops: &PrivateKeyOps, g_scalar: &Scalar, p_scalar: &Scalar, p_xy: &(Elem, Elem), ) -> Point { // XXX: Inefficient. TODO: implement interleaved wNAF multiplication. let scaled_g = ops.point_mul_base(g_scalar); let scaled_p = ops.point_mul(p_scalar, p_xy); ops.common.point_sum(&scaled_g, &scaled_p) } /// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the /// P-256 curve and SHA-256. /// /// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P256_SHA256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p256::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA256, split_rs: split_rs_fixed, id: AlgorithmID::ECDSA_P256_SHA256_FIXED, }; /// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the /// P-384 curve and SHA-384. /// /// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P384_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p384::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA384, split_rs: split_rs_fixed, id: AlgorithmID::ECDSA_P384_SHA384_FIXED, }; /// Verification of ASN.1 DER-encoded ECDSA signatures using the P-256 curve /// and SHA-256. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P256_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p256::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA256, split_rs: split_rs_asn1, id: AlgorithmID::ECDSA_P256_SHA256_ASN1, }; /// *Not recommended*. Verification of ASN.1 DER-encoded ECDSA signatures using /// the P-256 curve and SHA-384. /// /// In most situations, P-256 should be used only with SHA-256 and P-384 /// should be used only with SHA-384. However, in some cases, particularly TLS /// on the web, it is necessary to support P-256 with SHA-384 for compatibility /// with widely-deployed implementations that do not follow these guidelines. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P256_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p256::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA384, split_rs: split_rs_asn1, id: AlgorithmID::ECDSA_P256_SHA384_ASN1, }; /// *Not recommended*. Verification of ASN.1 DER-encoded ECDSA signatures using /// the P-384 curve and SHA-256. /// /// In most situations, P-256 should be used only with SHA-256 and P-384 /// should be used only with SHA-384. However, in some cases, particularly TLS /// on the web, it is necessary to support P-256 with SHA-384 for compatibility /// with widely-deployed implementations that do not follow these guidelines. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P384_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p384::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA256, split_rs: split_rs_asn1, id: AlgorithmID::ECDSA_P384_SHA256_ASN1, }; /// Verification of ASN.1 DER-encoded ECDSA signatures using the P-384 curve /// and SHA-384. /// /// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level /// documentation for more details. pub static ECDSA_P384_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { ops: &p384::PUBLIC_SCALAR_OPS, digest_alg: &digest::SHA384, split_rs: split_rs_asn1, id: AlgorithmID::ECDSA_P384_SHA384_ASN1, }; #[cfg(test)] mod tests { use super::*; use crate::test; use alloc::vec::Vec; #[test] fn test_digest_based_test_vectors() { test::run( test_file!("../../../../crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let public_key = { let mut public_key = Vec::new(); public_key.push(0x04); public_key.extend(&test_case.consume_bytes("X")); public_key.extend(&test_case.consume_bytes("Y")); public_key }; let digest = test_case.consume_bytes("Digest"); let sig = { let mut sig = Vec::new(); sig.extend(&test_case.consume_bytes("R")); sig.extend(&test_case.consume_bytes("S")); sig }; let invalid = test_case.consume_optional_string("Invalid"); let alg = match curve_name.as_str() { "P-256" => &ECDSA_P256_SHA256_FIXED, "P-384" => &ECDSA_P384_SHA384_FIXED, _ => { panic!("Unsupported curve: {}", curve_name); } }; let digest = super::super::digest_scalar::digest_bytes_scalar( &alg.ops.scalar_ops, &digest[..], ); let actual_result = alg.verify_digest( untrusted::Input::from(&public_key[..]), digest, untrusted::Input::from(&sig[..]), ); assert_eq!(actual_result.is_ok(), invalid.is_none()); Ok(()) }, ); } } ring-0.16.9/src/ec/suite_b/ecdsa.rs000064400000000000000000000000721352416253600151770ustar0000000000000000mod digest_scalar; pub mod signing; pub mod verification; ring-0.16.9/src/ec/suite_b/ops/elem.rs000064400000000000000000000072151352416253600156510ustar0000000000000000// Copyright 2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{ arithmetic::montgomery::{Encoding, ProductEncoding}, limb::{Limb, LIMB_BITS}, }; use core::marker::PhantomData; /// Elements of ℤ/mℤ for some modulus *m*. Elements are always fully reduced /// with respect to *m*; i.e. the 0 <= x < m for every value x. #[derive(Clone, Copy)] pub struct Elem { // XXX: pub pub limbs: [Limb; MAX_LIMBS], /// The modulus *m* for the ring ℤ/mℤ for which this element is a value. pub m: PhantomData, /// The number of Montgomery factors that need to be canceled out from /// `value` to get the actual value. pub encoding: PhantomData, } impl Elem { // There's no need to convert `value` to the Montgomery domain since // 0 * R**2 (mod m) == 0, so neither the modulus nor the encoding are needed // as inputs for constructing a zero-valued element. pub fn zero() -> Self { Self { limbs: [0; MAX_LIMBS], m: PhantomData, encoding: PhantomData, } } } #[inline] pub fn mul_mont( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), a: &Elem, b: &Elem, ) -> Elem::Output> where (EA, EB): ProductEncoding, { binary_op(f, a, b) } // let r = f(a, b); return r; #[inline] pub fn binary_op( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), a: &Elem, b: &Elem, ) -> Elem { let mut r = Elem { limbs: [0; MAX_LIMBS], m: PhantomData, encoding: PhantomData, }; unsafe { f(r.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr()) } r } // a := f(a, b); #[inline] pub fn binary_op_assign( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), a: &mut Elem, b: &Elem, ) { unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr()) } } // let r = f(a); return r; #[inline] pub fn unary_op( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), a: &Elem, ) -> Elem { let mut r = Elem { limbs: [0; MAX_LIMBS], m: PhantomData, encoding: PhantomData, }; unsafe { f(r.limbs.as_mut_ptr(), a.limbs.as_ptr()) } r } // a := f(a); #[inline] pub fn unary_op_assign( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), a: &mut Elem, ) { unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr()) } } // a := f(a, a); #[inline] pub fn unary_op_from_binary_op_assign( f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), a: &mut Elem, ) { unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr(), a.limbs.as_ptr()) } } pub const MAX_LIMBS: usize = (384 + (LIMB_BITS - 1)) / LIMB_BITS; ring-0.16.9/src/ec/suite_b/ops/p256.rs000064400000000000000000000263541353036607100154250ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ elem::{binary_op, binary_op_assign}, elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, }; use core::marker::PhantomData; macro_rules! p256_limbs { [ $($limb:expr),+ ] => { limbs![$($limb),+, 0, 0, 0, 0] }; } pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 256 / LIMB_BITS, q: Modulus { p: p256_limbs![ 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xffffffff ], rr: p256_limbs![ 0x00000003, 0x00000000, 0xffffffff, 0xfffffffb, 0xfffffffe, 0xffffffff, 0xfffffffd, 0x00000004 ], }, n: Elem { limbs: p256_limbs![ 0xfc632551, 0xf3b9cac2, 0xa7179e84, 0xbce6faad, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff ], m: PhantomData, encoding: PhantomData, // Unencoded }, a: Elem { limbs: p256_limbs![ 0xfffffffc, 0xffffffff, 0xffffffff, 0x00000003, 0x00000000, 0x00000000, 0x00000004, 0xfffffffc ], m: PhantomData, encoding: PhantomData, // R }, b: Elem { limbs: p256_limbs![ 0x29c4bddf, 0xd89cdf62, 0x78843090, 0xacf005cd, 0xf7212ed6, 0xe5a220ab, 0x04874834, 0xdc30061d ], m: PhantomData, encoding: PhantomData, // R }, elem_add_impl: GFp_nistz256_add, elem_mul_mont: GFp_nistz256_mul_mont, elem_sqr_mont: GFp_nistz256_sqr_mont, point_add_jacobian_impl: GFp_nistz256_point_add, }; pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { common: &COMMON_OPS, elem_inv_squared: p256_elem_inv_squared, point_mul_base_impl: p256_point_mul_base_impl, point_mul_impl: GFp_nistz256_point_mul, }; fn p256_elem_inv_squared(a: &Elem) -> Elem { // Calculate a**-2 (mod q) == a**(q - 3) (mod q) // // The exponent (q - 3) is: // // 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc #[inline] fn sqr_mul(a: &Elem, squarings: usize, b: &Elem) -> Elem { elem_sqr_mul(&COMMON_OPS, a, squarings, b) } #[inline] fn sqr_mul_acc(a: &mut Elem, squarings: usize, b: &Elem) { elem_sqr_mul_acc(&COMMON_OPS, a, squarings, b) } let b_1 = &a; let b_11 = sqr_mul(b_1, 1, b_1); let b_111 = sqr_mul(&b_11, 1, b_1); let f_11 = sqr_mul(&b_111, 3, &b_111); let fff = sqr_mul(&f_11, 6, &f_11); let fff_111 = sqr_mul(&fff, 3, &b_111); let fffffff_11 = sqr_mul(&fff_111, 15, &fff_111); let ffffffff = sqr_mul(&fffffff_11, 2, &b_11); // ffffffff00000001 let mut acc = sqr_mul(&ffffffff, 31 + 1, b_1); // ffffffff00000001000000000000000000000000ffffffff sqr_mul_acc(&mut acc, 96 + 32, &ffffffff); // ffffffff00000001000000000000000000000000ffffffffffffffff sqr_mul_acc(&mut acc, 32, &ffffffff); // ffffffff00000001000000000000000000000000fffffffffffffffffffffff_11 sqr_mul_acc(&mut acc, 30, &fffffff_11); // ffffffff00000001000000000000000000000000fffffffffffffffffffffffc COMMON_OPS.elem_square(&mut acc); COMMON_OPS.elem_square(&mut acc); acc } fn p256_point_mul_base_impl(g_scalar: &Scalar) -> Point { let mut r = Point::new_at_infinity(); unsafe { GFp_nistz256_point_mul_base(r.xyz.as_mut_ptr(), g_scalar.limbs.as_ptr()); } r } pub static PUBLIC_KEY_OPS: PublicKeyOps = PublicKeyOps { common: &COMMON_OPS, }; pub static SCALAR_OPS: ScalarOps = ScalarOps { common: &COMMON_OPS, scalar_inv_to_mont_impl: p256_scalar_inv_to_mont, scalar_mul_mont: GFp_p256_scalar_mul_mont, }; pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { scalar_ops: &SCALAR_OPS, public_key_ops: &PUBLIC_KEY_OPS, private_key_ops: &PRIVATE_KEY_OPS, q_minus_n: Elem { limbs: p256_limbs![0x039cdaae, 0x0c46353d, 0x58e8617b, 0x43190553, 0, 0, 0, 0], m: PhantomData, encoding: PhantomData, // Unencoded }, }; pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { scalar_ops: &SCALAR_OPS, oneRR_mod_n: Scalar { limbs: p256_limbs![ 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, 0x66e12d94 ], m: PhantomData, encoding: PhantomData, // R }, }; fn p256_scalar_inv_to_mont(a: &Scalar) -> Scalar { // Calculate the modular inverse of scalar |a| using Fermat's Little // Theorem: // // a**-1 (mod n) == a**(n - 2) (mod n) // // The exponent (n - 2) is: // // 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f #[inline] fn mul(a: &Scalar, b: &Scalar) -> Scalar { binary_op(GFp_p256_scalar_mul_mont, a, b) } #[inline] fn sqr(a: &Scalar) -> Scalar { unary_op(GFp_p256_scalar_sqr_mont, a) } // Returns (`a` squared `squarings` times) * `b`. fn sqr_mul(a: &Scalar, squarings: Limb, b: &Scalar) -> Scalar { debug_assert!(squarings >= 1); let mut tmp = Scalar::zero(); unsafe { GFp_p256_scalar_sqr_rep_mont(tmp.limbs.as_mut_ptr(), a.limbs.as_ptr(), squarings) } mul(&tmp, b) } // Sets `acc` = (`acc` squared `squarings` times) * `b`. fn sqr_mul_acc(acc: &mut Scalar, squarings: Limb, b: &Scalar) { debug_assert!(squarings >= 1); unsafe { GFp_p256_scalar_sqr_rep_mont(acc.limbs.as_mut_ptr(), acc.limbs.as_ptr(), squarings) } binary_op_assign(GFp_p256_scalar_mul_mont, acc, b); } fn to_mont(a: &Scalar) -> Scalar { static N_RR: Scalar = Scalar { limbs: p256_limbs![ 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, 0x66e12d94 ], m: PhantomData, encoding: PhantomData, }; binary_op(GFp_p256_scalar_mul_mont, a, &N_RR) } // Indexes into `d`. const B_1: usize = 0; const B_10: usize = 1; const B_11: usize = 2; const B_101: usize = 3; const B_111: usize = 4; const B_1111: usize = 5; const B_10101: usize = 6; const B_101111: usize = 7; const DIGIT_COUNT: usize = 8; let mut d = [Scalar::zero(); DIGIT_COUNT]; d[B_1] = to_mont(a); d[B_10] = sqr(&d[B_1]); d[B_11] = mul(&d[B_10], &d[B_1]); d[B_101] = mul(&d[B_10], &d[B_11]); d[B_111] = mul(&d[B_101], &d[B_10]); let b_1010 = sqr(&d[B_101]); d[B_1111] = mul(&b_1010, &d[B_101]); d[B_10101] = sqr_mul(&b_1010, 0 + 1, &d[B_1]); let b_101010 = sqr(&d[B_10101]); d[B_101111] = mul(&b_101010, &d[B_101]); let b_111111 = mul(&b_101010, &d[B_10101]); let ff = sqr_mul(&b_111111, 0 + 2, &d[B_11]); let ffff = sqr_mul(&ff, 0 + 8, &ff); let ffffffff = sqr_mul(&ffff, 0 + 16, &ffff); // ffffffff00000000ffffffff let mut acc = sqr_mul(&ffffffff, 32 + 32, &ffffffff); // ffffffff00000000ffffffffffffffff sqr_mul_acc(&mut acc, 0 + 32, &ffffffff); // The rest of the exponent, in binary, is: // // 1011110011100110111110101010110110100111000101111001111010000100 // 1111001110111001110010101100001011111100011000110010010101001111 static REMAINING_WINDOWS: [(u8, u8); 26] = [ (6, B_101111 as u8), (2 + 3, B_111 as u8), (2 + 2, B_11 as u8), (1 + 4, B_1111 as u8), (5, B_10101 as u8), (1 + 3, B_101 as u8), (3, B_101 as u8), (3, B_101 as u8), (2 + 3, B_111 as u8), (3 + 6, B_101111 as u8), (2 + 4, B_1111 as u8), (1 + 1, B_1 as u8), (4 + 1, B_1 as u8), (2 + 4, B_1111 as u8), (2 + 3, B_111 as u8), (1 + 3, B_111 as u8), (2 + 3, B_111 as u8), (2 + 3, B_101 as u8), (1 + 2, B_11 as u8), (4 + 6, B_101111 as u8), (2, B_11 as u8), (3 + 2, B_11 as u8), (3 + 2, B_11 as u8), (2 + 1, B_1 as u8), (2 + 5, B_10101 as u8), (2 + 4, B_1111 as u8), ]; for &(squarings, digit) in &REMAINING_WINDOWS { sqr_mul_acc(&mut acc, Limb::from(squarings), &d[usize::from(digit)]); } acc } extern "C" { fn GFp_nistz256_add( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_nistz256_mul_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_nistz256_sqr_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_nistz256_point_add( r: *mut Limb, // [3][COMMON_OPS.num_limbs] a: *const Limb, // [3][COMMON_OPS.num_limbs] b: *const Limb, // [3][COMMON_OPS.num_limbs] ); fn GFp_nistz256_point_mul( r: *mut Limb, // [3][COMMON_OPS.num_limbs] p_scalar: *const Limb, // [COMMON_OPS.num_limbs] p_x: *const Limb, // [COMMON_OPS.num_limbs] p_y: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_nistz256_point_mul_base( r: *mut Limb, // [3][COMMON_OPS.num_limbs] g_scalar: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_p256_scalar_mul_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_p256_scalar_sqr_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_p256_scalar_sqr_rep_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] rep: Limb, ); } #[cfg(feature = "internal_benches")] mod internal_benches { use super::{super::internal_benches::*, *}; bench_curve!(&[ Scalar { limbs: LIMBS_1, m: PhantomData, encoding: PhantomData, }, Scalar { limbs: LIMBS_ALTERNATING_10, m: PhantomData, encoding: PhantomData, }, Scalar { // n - 1 limbs: p256_limbs![ 0xfc632551 - 1, 0xf3b9cac2, 0xa7179e84, 0xbce6faad, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff ], m: PhantomData, encoding: PhantomData, }, ]); } ring-0.16.9/src/ec/suite_b/ops/p256_elem_mul_tests.txt000064400000000000000000000015741352331573000207140ustar0000000000000000 a = 00 b = 00 r = 00 a = 00 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 00 a = 01 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = fffffffd00000002fffffffdffffffff00000001fffffffcffffffff a = 02 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 01fffffffa00000005fffffffbfffffffe00000003fffffff9fffffffe a = 03 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 02fffffff700000008fffffff9fffffffd00000005fffffff6fffffffd a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff b = 02 r = fffffffd00000002fffffffdffffffff00000001fffffffcffffffff a = 7fffffff80000000800000000000000000000000800000000000000000000000 b = 02 r = fffffffe00000003fffffffd0000000200000001fffffffe0000000300000000 a = 8000000000000000000000000000000000000000000000000000000000000000 b = 02 r = 01 ring-0.16.9/src/ec/suite_b/ops/p256_elem_neg_tests.txt000064400000000000000000000013441352331573000206630ustar0000000000000000 a = 00 b = 00 a = 01 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe a = 02 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffd a = 03 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffc a = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe b = 01 a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff b = 7fffffff80000000800000000000000000000000800000000000000000000000 a = 7fffffff80000000800000000000000000000000800000000000000000000000 b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff a = 8000000000000000000000000000000000000000000000000000000000000000 b = 7fffffff00000001000000000000000000000000ffffffffffffffffffffffff ring-0.16.9/src/ec/suite_b/ops/p256_elem_sum_tests.txt000064400000000000000000000550501352331573000207210ustar0000000000000000# Montgomery Arithmetic; values are in the range [0, q). a = 00 b = 00 r = 00 a = 00 b = 01 r = 01 a = 00 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe a = 01 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 00 a = 02 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 01 a = 03 b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe r = 02 a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff b = 7fffffff80000000800000000000000000000000800000000000000000000000 r = 00 a = 7fffffff80000000800000000000000000000000800000000000000000000000 b = 7fffffff80000000800000000000000000000000800000000000000000000000 r = 01 a = 8000000000000000000000000000000000000000000000000000000000000000 b = 8000000000000000000000000000000000000000000000000000000000000000 r = fffffffeffffffffffffffffffffffff000000000000000000000001 a = 8000000000000000000000000000000000000000000000000000000000000000 b = 8000000000000000000000000000000000000000000000000000000000000000 r = fffffffeffffffffffffffffffffffff000000000000000000000001 a = 800000007fffffff7fffffffffffffffffffffff800000000000000000000001 b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff r = fffffffeffffffffffffffffffffffff000000000000000000000001 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 8000000000000000000000000000000000000000000000000000000000000000 r = fffffffeffffffffffffffffffffffff000000000000000000000000 a = 800000007fffffff7fffffffffffffffffffffff800000000000000000000000 b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff r = fffffffeffffffffffffffffffffffff000000000000000000000000 # Carry Propagation. a = ff b = 01 r = 0100 a = 01ff b = 01 r = 0200 a = 03ff b = 01 r = 0400 a = 07ff b = 01 r = 0800 a = 0fff b = 01 r = 1000 a = 1fff b = 01 r = 2000 a = 3fff b = 01 r = 4000 a = 7fff b = 01 r = 8000 a = ffff b = 01 r = 010000 a = 01ffff b = 01 r = 020000 a = 03ffff b = 01 r = 040000 a = 07ffff b = 01 r = 080000 a = 0fffff b = 01 r = 100000 a = 1fffff b = 01 r = 200000 a = 3fffff b = 01 r = 400000 a = 7fffff b = 01 r = 800000 a = ffffff b = 01 r = 01000000 a = 01ffffff b = 01 r = 02000000 a = 03ffffff b = 01 r = 04000000 a = 07ffffff b = 01 r = 08000000 a = 0fffffff b = 01 r = 10000000 a = 1fffffff b = 01 r = 20000000 a = 3fffffff b = 01 r = 40000000 a = 7fffffff b = 01 r = 80000000 a = ffffffff b = 01 r = 0100000000 a = 01ffffffff b = 01 r = 0200000000 a = 03ffffffff b = 01 r = 0400000000 a = 07ffffffff b = 01 r = 0800000000 a = 0fffffffff b = 01 r = 1000000000 a = 1fffffffff b = 01 r = 2000000000 a = 3fffffffff b = 01 r = 4000000000 a = 7fffffffff b = 01 r = 8000000000 a = ffffffffff b = 01 r = 010000000000 a = 01ffffffffff b = 01 r = 020000000000 a = 03ffffffffff b = 01 r = 040000000000 a = 07ffffffffff b = 01 r = 080000000000 a = 0fffffffffff b = 01 r = 100000000000 a = 1fffffffffff b = 01 r = 200000000000 a = 3fffffffffff b = 01 r = 400000000000 a = 7fffffffffff b = 01 r = 800000000000 a = ffffffffffff b = 01 r = 01000000000000 a = 01ffffffffffff b = 01 r = 02000000000000 a = 03ffffffffffff b = 01 r = 04000000000000 a = 07ffffffffffff b = 01 r = 08000000000000 a = 0fffffffffffff b = 01 r = 10000000000000 a = 1fffffffffffff b = 01 r = 20000000000000 a = 3fffffffffffff b = 01 r = 40000000000000 a = 7fffffffffffff b = 01 r = 80000000000000 a = ffffffffffffff b = 01 r = 0100000000000000 a = 01ffffffffffffff b = 01 r = 0200000000000000 a = 03ffffffffffffff b = 01 r = 0400000000000000 a = 07ffffffffffffff b = 01 r = 0800000000000000 a = 0fffffffffffffff b = 01 r = 1000000000000000 a = 1fffffffffffffff b = 01 r = 2000000000000000 a = 3fffffffffffffff b = 01 r = 4000000000000000 a = 7fffffffffffffff b = 01 r = 8000000000000000 a = ffffffffffffffff b = 01 r = 010000000000000000 a = 01ffffffffffffffff b = 01 r = 020000000000000000 a = 03ffffffffffffffff b = 01 r = 040000000000000000 a = 07ffffffffffffffff b = 01 r = 080000000000000000 a = 0fffffffffffffffff b = 01 r = 100000000000000000 a = 1fffffffffffffffff b = 01 r = 200000000000000000 a = 3fffffffffffffffff b = 01 r = 400000000000000000 a = 7fffffffffffffffff b = 01 r = 800000000000000000 a = ffffffffffffffffff b = 01 r = 01000000000000000000 a = 01ffffffffffffffffff b = 01 r = 02000000000000000000 a = 03ffffffffffffffffff b = 01 r = 04000000000000000000 a = 07ffffffffffffffffff b = 01 r = 08000000000000000000 a = 0fffffffffffffffffff b = 01 r = 10000000000000000000 a = 1fffffffffffffffffff b = 01 r = 20000000000000000000 a = 3fffffffffffffffffff b = 01 r = 40000000000000000000 a = 7fffffffffffffffffff b = 01 r = 80000000000000000000 a = ffffffffffffffffffff b = 01 r = 0100000000000000000000 a = 01ffffffffffffffffffff b = 01 r = 0200000000000000000000 a = 03ffffffffffffffffffff b = 01 r = 0400000000000000000000 a = 07ffffffffffffffffffff b = 01 r = 0800000000000000000000 a = 0fffffffffffffffffffff b = 01 r = 1000000000000000000000 a = 1fffffffffffffffffffff b = 01 r = 2000000000000000000000 a = 3fffffffffffffffffffff b = 01 r = 4000000000000000000000 a = 7fffffffffffffffffffff b = 01 r = 8000000000000000000000 a = ffffffffffffffffffffff b = 01 r = 010000000000000000000000 a = 01ffffffffffffffffffffff b = 01 r = 020000000000000000000000 a = 03ffffffffffffffffffffff b = 01 r = 040000000000000000000000 a = 07ffffffffffffffffffffff b = 01 r = 080000000000000000000000 a = 0fffffffffffffffffffffff b = 01 r = 100000000000000000000000 a = 1fffffffffffffffffffffff b = 01 r = 200000000000000000000000 a = 3fffffffffffffffffffffff b = 01 r = 400000000000000000000000 a = 7fffffffffffffffffffffff b = 01 r = 800000000000000000000000 a = ffffffffffffffffffffffff b = 01 r = 01000000000000000000000000 a = 01ffffffffffffffffffffffff b = 01 r = 02000000000000000000000000 a = 03ffffffffffffffffffffffff b = 01 r = 04000000000000000000000000 a = 07ffffffffffffffffffffffff b = 01 r = 08000000000000000000000000 a = 0fffffffffffffffffffffffff b = 01 r = 10000000000000000000000000 a = 1fffffffffffffffffffffffff b = 01 r = 20000000000000000000000000 a = 3fffffffffffffffffffffffff b = 01 r = 40000000000000000000000000 a = 7fffffffffffffffffffffffff b = 01 r = 80000000000000000000000000 a = ffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000 a = 01ffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000 a = 03ffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000 a = 07ffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000 a = 0fffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000 a = 1fffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000 a = 3fffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000 a = 7fffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000 a = ffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000 a = 01ffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000 a = 03ffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000 a = 07ffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000 a = 0fffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000 a = 1fffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000 a = 3fffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000 a = 7fffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000 a = ffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000 a = ffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000 ring-0.16.9/src/ec/suite_b/ops/p256_point_double_tests.txt000064400000000000000000000026561352331573000216020ustar0000000000000000 # G doubled once. a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 # Point at infinity doubled. This uses the (0, 0, 0) representation of # the point at infinity instead of the classic (1, 1, 0) # representation. a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # Point at infinity doubled. This form is the result of multiplying # n * G (affine), which is more interesting than the above case # because only the Z coordinate is zero. a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # (n - 1) * G doubled. a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a ring-0.16.9/src/ec/suite_b/ops/p256_point_mul_base_tests.txt000064400000000000000000002241271352331573000221160ustar0000000000000000 g_scalar = 00 r = inf g_scalar = 01 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a g_scalar = 02 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 g_scalar = 03 r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, d5f06a29e587cc07788208311a2ee98e583e47ad0861fe1ab04c5c1fc983a7eb g_scalar = 04 r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 84b14c394c5ab8636b6c36dee5ddd22e17628471fad6f4472d96f24ce4cbaba6 g_scalar = 05 r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 73a076bb2dd1e9163540a9877e7a1f6873c568efe5eb882beb309b4ae7ba4f10 g_scalar = 06 r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, a4c9916d4a07f75ff424d44cef639f11299c2b53adff14b593d36220d377e44b g_scalar = 07 r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, eaedd9156e240867ef933bdc77c941956742f2f25da67bdd2847d0303f5b9d4d g_scalar = 08 r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, 56ec12f27706df76123c7b84be60bbf021e3327dcf9eba15f59da3a9532d4977 g_scalar = 09 r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, 086659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f3314 g_scalar = 0a r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 78719a54eb3b4ab55f7d2d65779be5d2c43a8991383fbe080c2b407880dd9e76 g_scalar = 0b r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 68930023e125b88e0c0daa891ead643d250f939ee57f61c81a7685612b944e88 g_scalar = 0c r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 7ff57c9553238aca28228cfa8ade6d66170ed2f6ca8956370cac12d91cbb5b43 g_scalar = 0d r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, fbc08769c9e7b7977cd06422bd1f5bc168748390742ed2e335752b90c00ee17f g_scalar = 0e r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, 152706dc2eaa1bbbe8e4193e2a65e7dbbe29569e832237c227b52db7995d586b g_scalar = 0f r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, 2042170a7079adf464efa6de778a4797d766355442a41b2540b8524f6383c45d g_scalar = 10 r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 64edf7b201efe22055c4623bb1580e9e3670c3194b0b6587f2f11bd652a23f9b g_scalar = 11 r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, ebd512263274c3d02f4e247f0d1883bb0575bf30e89cb80e227d314693e79987 g_scalar = 12 r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 6c6fc7d90502394d2626927f1b847bba4b2a5caf8f4f0b3c66a2bd725e485a1d g_scalar = 13 r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, f720ee256d12597b85665e9be39508c15806244afba977c52d36e9e7dc4c696b g_scalar = 14 r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, 5ee104e1c5fee0d09161c53f8aa95e66a2d4ec17ffffcbae82ef1c417884005d g_scalar = 15 r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, c086d5f1c9477fa37a75023e7fac29a41b0fadc083bb3c61f29dd4b2e286e5b9 g_scalar = 16 r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 793e8d075d5cd0749de917da153a35b5640c2d6a4d23fea494a787bb35415f04 g_scalar = 17 r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 83d0687b9077666f48068e1371ac2f71e5fda49c27299f4a0360a4fb9e4785a9 g_scalar = 18 r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, 595dc55eca737b8a7669f03193cb750111ea494988a1e356a551d750b24bcbc7 g_scalar = 19 r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 7b948dc356f7996812068859c9b731ee96cc631243f439504b8dc9feb4966228 g_scalar = 1a r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, ed178030d12e5ac714fde97b5fa944f55a39898b628ac50884cf14e11d248018 g_scalar = 1b r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, 2d431068d84bde312d97d10878eb4cbb3bd0c66fddb7fb589200b7ba09895e70 g_scalar = 1c r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, a9b4cc5f405852784a688b482d0cb71ea6a7f9c7804b2a681d3d393ed1a83da1 g_scalar = 1d r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, 3798142a2a3be21b8a966939777c619f90472447a2fb18a398db66735c208899 g_scalar = 1e r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, 460d45ce51601f72d667da379b3aa441b675511e06bf9b4ad5cc8c2f1c040abc g_scalar = 1f r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, f38ae8914d7b4745faecedfd0c9803fc2d921ca298eb6028d9e9fe814ea53299 g_scalar = 20 r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 6231d7929591c2a47b969c1aad9a2e407e449b64480a990809e23e6ddbef42f5 g_scalar = 21 r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, b16c4303c32f63c4f909604f763f15745509d1285847d5ef6ac4832b3a8ec1f1 g_scalar = 22 r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, a159100c570d74f8c77332a33c569426bba2cb1f6f876f92fd7b000b5db6f971 g_scalar = 23 r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, 2ba901628bb47af824e4ab126b237af7313c300c547852d5653a01908ceb6aa9 g_scalar = 24 r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, 480b9e11dd6da526450ac0bae251a0c6934e82d3162bfe13e5ebaebd94cda03a g_scalar = 25 r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, 58b36143620088a8f63ebce51558462ce7adda3e6f20d850a12b448a7d3cebb6 g_scalar = 26 r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, d9a4c2809c80c34dbdaa84d68e59319cccaab359bf3804090ec32d3bfe7765e5 g_scalar = 27 r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, 0c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f98 g_scalar = 28 r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, 03466612d1aa702fab256ea35ef5435974c6e18c36ab1c34d90ba188f2651798 g_scalar = 29 r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, f70bfeec03884a7bc67732591d57d9ceb6f94d2ec87e9a47b6b0daa2a35c628f g_scalar = 2a r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, f3a8cfe389bc7d3d4b00b20b906014cf9b359611f32c50aed158667de9ff257a g_scalar = 2b r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, 47795f4f95b2dda09e91cd3ba5e6a3184d82d052eadce5a8ba41b06261a6966c g_scalar = 2c r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, eb629f90387ba42a397a247dd69d34170423446c4b083b7fbfa06687730d50da g_scalar = 2d r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, d73acbfe2cd9e6b5772ef6dec7f80c81c5254469f72b33a5c747cb96782ba21a g_scalar = 2e r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, 033da338c1b7f86557c8b2c055f7835d45431d665ab43f2b42ab62c9c1586e63 g_scalar = 2f r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 9bbff86e6dddfd2704819d515ded93d49b944e107baeca13220755ccd921d60e g_scalar = 30 r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 85efc7e941325cc2a875f5ce529d75e30b26d7fbb7d8c5b739f59f66175adff1 g_scalar = 31 r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, d394077ef247fa364d78f592f7818ed826147d27f4645b5a837c92285e1109e8 g_scalar = 32 r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, d7d34194c3628c1343b7716bcc143a46efde7ae6a4449c96bf9e80899ae2b710 g_scalar = 33 r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, d731e383a2f54c2d99a5e23d82681c6261f1511c5e1a5f65370b4ea773241ea3 g_scalar = 34 r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 7ef2f2269c0f0f8d5c27014b9bbec39e23b92eae22df3562f67a8d295864687c g_scalar = 35 r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, fba1da5943465283b155bcd2dcafe1973db82f6f522113f280167f41c31cb264 g_scalar = 36 r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, 1a556e3fea9595eb3df277a41d1936b17ee0c444e76265aac28f70d2e7d6107e g_scalar = 37 r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, 25e8013ff14cf3f4c2cf6a6880e518caee759f879e27a6b4eab495c5a0182bde g_scalar = 38 r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 83927681026c2c084e9a5bc2a4b596ac01e0db86b1f2214bdfcac25b1f9af32a g_scalar = 39 r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, da44c6c600017626c5ab2632c79b7a015748060db661782ab909f2db2aac9e59 g_scalar = 3a r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, 063749945667474117ab562dbe5ffb3efa70533e7a6319ad33ed1bc4623fb21b g_scalar = 3b r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, a062499846fb7a8b6651f7017ce477f8778afcd3a837ebeaa084e90c15426704 g_scalar = 3c r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, 04820109bbe4e832c40a04bd4f51ad9612c651a022adff2cafa135bbf80e75ca g_scalar = 3d r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, 0d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b69 g_scalar = 3e r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 6b60cfff35ace009dd47ff98814be9ee6472e5ef6806701ee3dc424ebb32e38e g_scalar = 3f r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 90876a0140959b7092bf7c8f91230de0ac98b930824e8197707c04d5383e76ba g_scalar = 40 r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, 296720440e8449708010a4a078424bf88f726bb98faeaf829a3c651280edfe2f g_scalar = 41 r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 7d096ac42f1747502c90d98cf3e055d633cb7691ba659f4666eb62f1b957b4a1 g_scalar = 42 r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, b12347993e909dfb9c03344b75554fad55912064d0f5bb2aa9231c8ce9e571ca g_scalar = 43 r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, fd59d7eb9a8f62d9de3ec728c30a96a005af456a06620ae82c735ac12f33af7a g_scalar = 44 r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, f66904b1400c9463440dec9ece0f8c32bb7047347b57df81baa37f5d08a660c8 g_scalar = 45 r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 6d37b1fa546fbecc2126ac553a8dd1269bea0d0f2655d14f987b0687f4eb5cf6 g_scalar = 46 r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, c6793ad2e6e2f3b19cc6e22a27c9a2ead11ae42dad0182e407e5e8e85bef953a g_scalar = 47 r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, 574cc7b29378679111f947e696cd0572030a119fdd4af1ec56cd001e39df3672 g_scalar = 48 r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 6fcd0cbb809a06f20368eb1f2e4283e11ba0cb8c9c5d2e6a33ad53540dc40604 g_scalar = 49 r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, c39725521af82878a66d92525e82d5b3b871ba63e405ca09db8dcc81f42911ee g_scalar = 4a r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, 0a48558f2fa1bd2f77c52d75519978d10c45e52db3bfffc85ce885392bb80ef9 g_scalar = 4b r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, 24a1bde1d0c2302de79807a770456a7e7be19f0ded4437a85072758b78f3d040 g_scalar = 4c r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 9b3b040493b83e45ee4826a9937e1ba33fc6e661d47fa3cb19c6602050eaed5f g_scalar = 4d r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 854dc9d595105f9e2b4f0c7877eb94ea4788522b2e9fdbb283c3139be0d37321 g_scalar = 4e r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, f8bdf2ea8474d0c8ea2240ccef96b473407bffa1b201137148b4389c464423d3 g_scalar = 4f r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, b75df5ec191a421fd07370c450128375097a54ff99227b16c2b1870af8321bb8 g_scalar = 50 r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, 2995919ca4cd266052b6a1739220f4281b037d75b320ebfb2429c22a1d49c605 g_scalar = 51 r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 7acf4419e85bc145cbdbfdb9cf290d1fa02dbc426fe5b29dfe657f130801937b g_scalar = 52 r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, 18f61f3cdef3f99d4976126318fb05ae41a471e4e93046f2ad5cb247cd789d17 g_scalar = 53 r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 97f0013247b64be50536a39db19c61265e9b16125625aad75c52b051c64e09dd g_scalar = 54 r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, 4cb3c135b6f36034df4741a71b99ec5f67f9ba802e45cbb12563c590f683e890 g_scalar = 55 r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, 159751e2e1cbaebebb0066ae1f282369ce91ee270142811b998dfac18f1192b6 g_scalar = 56 r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, e6c93b31cefdb61d9a9f04f0e8aeaf7d4a2b5ed57defe51b559759f6edca6f38 g_scalar = 57 r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, af490825d5cff157a8f439ab06e58e3ecd07bc34c235d56c010e522661ddbcb1 g_scalar = 58 r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, d8d37d942785971ded5cf82dc911847cbdf176108c7f9dba005a1dffeabd468e g_scalar = 59 r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 7150f87e7211e4457ab49dd209f98f9a640388f83b9fffefb7b284be14fb691a g_scalar = 5a r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, e485b90d49c0b6a1ad3294fb1c309a59abff56b525d3fdee5376b018e277280a g_scalar = 5b r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, 4a70abf75c554ed3fa8a5b9b0b46a59f2354719f6237fc68d587138c63c92f69 g_scalar = 5c r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, d15428592faab2944a72075d7f73442a9929ad4e8f48bb12d4b127399359250d g_scalar = 5d r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, 435ac466954ffbb3ff6c1a78f9a2852f20b021c3df219dc582290e253d61f6d2 g_scalar = 5e r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, 1001f8d7dd85aa7bf8ea79eadfa99607c00286d964135771c5825a638719aea8 g_scalar = 5f r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, 3f293fda2cd6f439ee1b1cb5344455a165499c990c5dbba0c802049b68aa19e4 g_scalar = 60 r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, 3f2a78b3241a2b7103b48cc47c29bca2fd2f4f8cfd0258131e208328d87fd1d8 g_scalar = 61 r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, 1fbd470f53cf3e6984577f1f3260b76785f4d9c45b68b7e72dc7b8e69c70c77c g_scalar = 62 r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, e9f04cd324c2e3116b5df55fe390da5ba3f98377daa4c864a05a7aa8dd0ce3b4 g_scalar = 63 r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, 4a673fe054fcd65a03a3c2c7b98ff4b37ab58a3f75503e4631b57ea284693c04 g_scalar = 64 r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 63be9e64a17154226aa068c230548cf4adb9e9b685bac6b7a5db852c23fd068f g_scalar = 65 r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 94ce9e0adba8bfc75a8a14644be77793731251826f21687cb5f6f0feadc19a99 g_scalar = 66 r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, a2776d9f8417c98ff3d348f820fe78e36445fbcd5bc92aa3ca1ce130a54edfc4 g_scalar = 67 r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, 1429b1f8ae1d3ed8a6fae60930a4f9245df79360286166f300aec19ee8bf7d17 g_scalar = 68 r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 6ba92bcade5a0cc175aef88a77b9d084ffccf5e161217dee946ac3bfcff75858 g_scalar = 69 r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, d3d6d111ee9e512f4e346db071cbfc97c87057ca3bce7fe5d5ec7bbbf5327839 g_scalar = 6a r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, 262f03eb0757aaea5cbb069b03fe8fac137218257bc27ef73c3d861d83aae16f g_scalar = 6b r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, ccd7e9418ea700c1e008039e02de2ff12754e4260a7f687cb2159e08b76369dc g_scalar = 6c r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, 0d66cfc94b5d416d08e545f1b13e2b493633966c70094e6a3a7f4ad5e01ffe00 g_scalar = 6d r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, 5fdaee391cab12c70cd622baeb879899e7229d8956cd660daf419847ebf3df78 g_scalar = 6e r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 798ca99e4ef37e3c270c706c6e4840f15761490f7f000956b9a8fc5f8c0531e8 g_scalar = 6f r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, f9af0acd904d4731270adcc57148b1351cc0d4cea23afa674b9c5438a67e2173 g_scalar = 70 r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 65000c24c7973a41e70352687d367d8056feb92ec00eb207db97ab0ef88b8b70 g_scalar = 71 r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 61d8209d49f3a53dd13cca90747f19ecfa6bcdb1786076b9e0d92e9a51933360 g_scalar = 72 r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, bc0eec86924dd15496b984140a9f867197b596a14d7bf8475e5ddf821d6cc33e g_scalar = 73 r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, e95dd9d8889821b2dc8df855fe2f493756b76c57baa43b27b9dd2bf2d5f5b5bf g_scalar = 74 r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, a9c8a4b42b9157daf06c2c8c70549a5753c30bbe65b80f1686357f9eb412595e g_scalar = 75 r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, 2cdf7f854480ffe39dc33392fa67285c50cf6d11ad91a35092750de73e51e1bc g_scalar = 76 r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, c9c4d63998e59b626cf96715c527a656741bf80a03bc88e604f357d1f061cede g_scalar = 77 r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, fedf1014fe6ee703d7e814380f67b51417d29c64877b74978162cf502d653fd9 g_scalar = 78 r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, d007ec78a47a715248cd158b2c1eb5419a278a9daaa03497ca76e7549488d036 g_scalar = 79 r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, ae839cd80e99505caaf4d4e193394872ff318484da0a4996a4941a1e76a0ead7 g_scalar = 7a r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 7aa3b3ccb2a104b24c6b9954bd51f9056ea945bdb1901d3d001da1b77e9176b3 g_scalar = 7b r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, aeb9041c69e788c55870726c16e3e02ada04cc898e17ff543f69b4d49b4d4324 g_scalar = 7c r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 8448ecae901289fe9b94c4ad4c99e43958d85051e4dd905a43dfabf3cd768437 g_scalar = 7d r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, b16d6af8c3febbc151dc5fac145ff0d52292393b579f3ce2128b0d24bf2219f0 g_scalar = 7e r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 91a4ea6d215215f65f153f56aa36de2d8459f5705276171860ffbe2e70da613f g_scalar = 7f r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 76759223abe3c14bd0a8879244f403f2fd1c4a970ad602d09ab6968bf6005965 g_scalar = 80 r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, fa38d320ec008188f8aa266d75d6b138b46feaf3367834ffb77a8087c2ff3b6d g_scalar = 0200000000000000000000000000000000000000000000000000000000000000 r = 135dc5395b54827dd161d2cacf780900bcef72873566cc63b2330fef4e4ca463, 8b0c573826152c8fe973586d6d3321da10a224f007dfa06c638f052e27bf1bc6 g_scalar = 0400000000000000000000000000000000000000000000000000000000000000 r = 15b4488b29fd9fd06e1da8c39a33c6771fe19e357fe4364e9910ba6b23a5d896, f2c4f79cb6ec839b3fd1b24907e5658e920a8a70ab8163e81f4392541a1f22bf g_scalar = 0600000000000000000000000000000000000000000000000000000000000000 r = e78c2ec0fc61206741311f8a38038a5d8f860c7943ef881c84cea0691416a6a5, 35beef7a9e36c39eff558aecf3612cbab4cc9e0059604097494d2e815ad73581 g_scalar = 0800000000000000000000000000000000000000000000000000000000000000 r = 0bdec21162bc679298204cb64fcf68e15d2b0ac6c717370e8b5c619c76497ee8, 037248e9d2d4fcb45efb693e3d0e0c8bf9e3fa97e0de1ac56973ccefa63b1011 g_scalar = 0a00000000000000000000000000000000000000000000000000000000000000 r = fe2bc235e52800a089fa443d07d3e75e96e9793ed510053ccf57fca29849e95b, ee52747dc960b0e1217e4005e541e592b5852a49e72222631c208b8c0ac7e740 g_scalar = 0c00000000000000000000000000000000000000000000000000000000000000 r = 69aada7f6d6180a56183291b6ed77d1c62699718e770b20dd3694e2ab20364e4, d53e48d228dc87eed6a2308a7fb96d8dfd7e84567870107751f9054bf185509b g_scalar = 0e00000000000000000000000000000000000000000000000000000000000000 r = 1280aafbed23f0d182293299cdf809af94589aac6656bbe13e858c2ffceac518, 9bfafcccca58cca2d5cb00b340f02322e010a39acfaec17fdeab0c677306e2a4 g_scalar = 1000000000000000000000000000000000000000000000000000000000000000 r = 7be5ed0dc475c1293f06d66c530cb4f3d8772d353381060380802dc91ec34f9e, 0aec44147285bbcab92118c692a1b45ec63d2857c9ff6b4ccb9e3c1931e82b10 g_scalar = 1200000000000000000000000000000000000000000000000000000000000000 r = f82412db37333f2074feaff5e72c2666cb98c3ea2233117dba89095174f9fd77, 4aee7f5ee5034187ca7413a653e62c9f81a497847abb71aacdc3f3af9d271ca0 g_scalar = 1400000000000000000000000000000000000000000000000000000000000000 r = 5ec40582c9a82fa78d5d177c64ff8578982be4fd46700b8b37071afbe8316c45, ad4b4f6fc0c14de6312f39604bbbb74c24e809f49f0312845518e37bcfa86678 g_scalar = 1600000000000000000000000000000000000000000000000000000000000000 r = 2a1ef7d7822e8cc963aa5cca4fd924a2b44de63e08ae4169cf62c250869027b8, 80a30ac6ffd127228c82e7333a87f1ef82842bc04b8636ebe41b37c66eb35f3c g_scalar = 1800000000000000000000000000000000000000000000000000000000000000 r = f3b4962f5f3e6c3e028a81514f3cf2dc6415834bac4ab3aba3d6f4868eb6e843, 1b77791d06871332c31cdd6b9b149ed6437a6d8ae10bce559119ae90987dd2f2 g_scalar = 1a00000000000000000000000000000000000000000000000000000000000000 r = d9025fff8a8af1c635761c8ee1f6176d54c439b0391fa36e2f41e643356317fd, 6babe94f55e3b77f7aedb7c7f54a2ba4bb48dd1395a4745b8c826f3cf7cc4474 g_scalar = 1c00000000000000000000000000000000000000000000000000000000000000 r = 1eb6a9688f95277ca3fd22fbcea3f029965a774094e746409c34b650e16e05e9, 12109c4aacef5cbdea92c1669b840d48ad917201f58f2fee2520a63d7bad84f6 g_scalar = 1e00000000000000000000000000000000000000000000000000000000000000 r = 870ae6bdc2754097035ebe4addc4f080ed400a2232cdc71aee20415c2245134a, 4f6d77b2755de5a2e959fe3e5cfa8ca6f57f1956e4f55982a192e684c048d72d g_scalar = 2000000000000000000000000000000000000000000000000000000000000000 r = b7a23f34b68e19f8d0107914ceaae10ecbe906f04c93302efc189ae71e29a3ef, 3cf0bbf83d44303865591bf64da1711303198c6efcadc9c8e9d875c2efd2119d g_scalar = 2200000000000000000000000000000000000000000000000000000000000000 r = 68a9969c8e2256288644ef1cdfceb8ab862ae25e2ece8f72d32d7cec0094e84c, 79f2826cc85b9705cbd09a659bf0cdb6308a6e1882ba242bdf209e27b3117876 g_scalar = 2400000000000000000000000000000000000000000000000000000000000000 r = ada4cfdd7ecfa8408c94a21ab972da90598d0bf8849be4b7ab293027aad991c1, af9346e9eb8562e0900424eb6a652a557ca617a203219a3493d4b9c0fbcec63a g_scalar = 2600000000000000000000000000000000000000000000000000000000000000 r = f6e29e442433b4c681d700b2c6fa654a9edd11a6b7a82bb80ef6a240c793c0cd, d5dde3b07207c7a0154da1d18488497a8863e0e1ac1d5f51aadd3d5899f01b1d g_scalar = 2800000000000000000000000000000000000000000000000000000000000000 r = 54476778acd2f1b6c92becfa390b3ef2b1643ab5911bc478c3e04d7902381461, bb04730090b0790aee182910b5a13ac32bc1287b2c21c65a8daa0c4d66bf3aaf g_scalar = 2a00000000000000000000000000000000000000000000000000000000000000 r = 574fc2b081704bde30651575aab5306d953939f44ead0fd9d6d8bbd2f2338d2a, f2d45a7b49c99a13ed542a652c51e949e72b8a05eb63f38f3402081f4132f2f0 g_scalar = 2c00000000000000000000000000000000000000000000000000000000000000 r = 17f904ba45b0995e765a50db1a6fd0ffc5772beefdc3a47b83766947d17d4e0b, c8fa426a142fd4d56738d94f46cb1fd9f56db7f3c270aaedcee643832883487e g_scalar = 2e00000000000000000000000000000000000000000000000000000000000000 r = 5090d91f0b80bcb946d480d77119c60ed7799b31b313c052bfe48a8ff43daf9d, 3fdaf62162e1d85a769be02bb1d5928c16e69b4f9915aa0ac94c4c1e873bd7bf g_scalar = 3000000000000000000000000000000000000000000000000000000000000000 r = 389caef34ec5b10982159d07de7d6f2c945353e1b2d4c63aae485bb72b724759, 73429bb9c14208a3816fa3ed83f2405f2dc2cb7edd99de434a8ebb53db65ef14 g_scalar = 3200000000000000000000000000000000000000000000000000000000000000 r = f5aa74e43a64439e577793fce12c68ab07de7ab35133e5a2768978afed08d68c, a2577185ed42cc08a611d41c8ef20f302003ddd41d4459026457d90c4505e9f4 g_scalar = 3400000000000000000000000000000000000000000000000000000000000000 r = 58c8a77ac0d58abd9947c636a9b6e05a8d98277b4a837f6908ed8febd56daf06, fbe185ec38e1eb47ecbd1958e3fb0c5d16cd67c71076d3d3f45496a45f121e4f g_scalar = 3600000000000000000000000000000000000000000000000000000000000000 r = 9bc6c2af18eaf22cf81a4b3e0fd97269d8f158f5d6df29e581ea0bc89b6956e1, 63b4b278d7075e1c4339549d8f2f593c03bbfa0f9251ed45c1d3ce5e6d62552b g_scalar = 3800000000000000000000000000000000000000000000000000000000000000 r = 98fe1c61f5b61d31fd025001b905b499dd4d06aff39e7832b7ef9760ff79d2ee, 08e213122c3832dfa322b09f514eb16d376e3b783009cd9aa9f83980c5f12805 g_scalar = 3a00000000000000000000000000000000000000000000000000000000000000 r = d7d80165dd6861d485715b2edb2589d37b0b8307280d1be142c772b68b61c205, 458ae65ccb0f3654205e28984256ddbb1095adfa3b8abd756235746580870184 g_scalar = 3c00000000000000000000000000000000000000000000000000000000000000 r = beeb3ea58c37888ea76697bd602e90655dc516824ddbc0b6aea68626dc4ad4f4, 6ca1346292cc09fd9fb560949ae44df2e48b820ca35f44841ec4a2f214569113 g_scalar = 3e00000000000000000000000000000000000000000000000000000000000000 r = 782b816e9f5238b55631049161a549b25d485fac31ca379550e1b82c5de1691e, 1b102a8b5984701daecf22dedfce0da0a9ffada33f2952a013f2b973463d034f g_scalar = 4000000000000000000000000000000000000000000000000000000000000000 r = 412c9e1e9fa403a4d1b299b504aea4a9047e2ccde180b2dcb618d590b01e6e27, 178851bc75122b973a1b6fcce668de1949c50136f332b8e388d28a3679407552 g_scalar = 4200000000000000000000000000000000000000000000000000000000000000 r = 4b782ecabc2251e29f1ee33c0910e35e65854fd78777a63d723ee82acb8c9fb4, 838a3cf0c1e978c538fefe60d32301bcf5f641d622da95345a06824d45f07856 g_scalar = 4400000000000000000000000000000000000000000000000000000000000000 r = 720d5901fc5cb4c4f2876026ea269465bee5f33e85425bfe3d16740409d9735d, 59af953a94d4d6172b30b9649be40d5479e30056938b9bc5410357864dac8c11 g_scalar = 4600000000000000000000000000000000000000000000000000000000000000 r = a4fe196b936adcd72b999e56f814d996687afcc16c6ac81b2bba2fcb7bd03b00, e547a7310d5e981fd5dd716dc07c21d2111d82a22d9ab330d7165c2a897d9f1b g_scalar = 4800000000000000000000000000000000000000000000000000000000000000 r = 47f93e8f0d2f339d2df4486ef3b4e2e0fca35bdae5182b8d7f4b55864f6dcecb, 203de9a1f28da96eca2b45f4462b7cf03e07e2bb1c09ae9c471dbd283e36c4f7 g_scalar = 4a00000000000000000000000000000000000000000000000000000000000000 r = 4b5a7b2307c5f1098b5c3d0371c68991750aa51875c77f94fb78df45414657c3, b30352343b2825bbdfd9248609e5e644ff564852517f1beb482484863e7fbdee g_scalar = 4c00000000000000000000000000000000000000000000000000000000000000 r = ffab5705044464f22bac283b351571b3b88e7c47d8d42a028b002254c72340d5, 6616e62a9c8552a942e384cb8242f342e40ef31b1a8c8ca89700dd41addda21f g_scalar = 4e00000000000000000000000000000000000000000000000000000000000000 r = 5ea74c730418d46d3da600eade1864dfc4ae8bbb8b383d060471cf0dac517b4b, bbddf0fe206581d430920bec53ccf2f3729794bcde6e83aed2935c8dbdd0739f g_scalar = 5000000000000000000000000000000000000000000000000000000000000000 r = a35aa23fbf846bbbd43da670d2f74daed61257ce383c8ce9b1e13752fb85fa4c, 50d05aab9bc6d22e34d7f52a3c4aa158f6df8ee0c363473b5e74235d4421fc83 g_scalar = 5200000000000000000000000000000000000000000000000000000000000000 r = 4644b8fb9aa64d9150c9f363b5117831ef6feacd1584fb54adb84fb6c1127e87, a50d957e7a2eedd563de80073a74db77bf746812f4dbe25c7520cb714df7be07 g_scalar = 5400000000000000000000000000000000000000000000000000000000000000 r = 91c3a88a5b6e8c279d0a1f05fd8884e9f1539d9e4c076aa9d334b37c4b8e12cb, 43c450343061cf41d5e6b70871e075d933836e740b98d179b92ea188ba7aa4a1 g_scalar = 5600000000000000000000000000000000000000000000000000000000000000 r = 5e76ec2fd83f56287099228335b50df42b516dd73422c5c118d919e2ba9fa405, 215b92835941e6391d53cef079e691830ee524a532dd167c1b779bf89d2c8ce5 g_scalar = 5800000000000000000000000000000000000000000000000000000000000000 r = 3ff4444fd2ad3a96e5d755618de929cdad07e3c765ba422be4db7c0067eb93d4, 3c1172ef4a9b38d8590a7aa07ef7fa514ebb46fca5534cb835d53ebc71f14e5d g_scalar = 5a00000000000000000000000000000000000000000000000000000000000000 r = abe32380275a9ef53b7cd6098dc0954228abf7b7a9c7d8a5ec69d5a37aed7fc2, 2760436fe662ce524908b1c152c98e5cb143e958be997ffec824b1faa68f9d75 g_scalar = 5c00000000000000000000000000000000000000000000000000000000000000 r = deb035fcce7723a22ca3e0a1d449c1004ff211619adcd4bb4fc56a1be50edb52, e3b01067868e00e93da1a02a95b3c970d15d3b601d9c35c606a90a818855d505 g_scalar = 5e00000000000000000000000000000000000000000000000000000000000000 r = 7c0fd64417a177b5010b2e0df05981da66d63eab9af46f4588f0367ae686a10d, 9cc89067fc5544e084859663ef2c83e10670c8e054a309b866ce10045a78b655 g_scalar = 6000000000000000000000000000000000000000000000000000000000000000 r = 50235a0fdc91927053b2bb803ee35067bc56637b5f29cd078c56e735a64785f4, 8881065b5ec0f80f80400ba5f0f805bac34758318396023b191ab6d8f2c4aa65 g_scalar = 6200000000000000000000000000000000000000000000000000000000000000 r = 2dc1b8bb6885309fb1e70bcfd44571115df7fee1116cd289c547a21465944d7c, a5b5defe5200f553f4e9d93004744d802eb3d19473d8a4193827dfec742dc4f7 g_scalar = 6400000000000000000000000000000000000000000000000000000000000000 r = f1445d07414974411c75d37565dfd734bddc1fd9d5a52b5d45ab2440e4c3c19f, a3ff3123e96dfbb148d9cbd09098f9e90ef785a5b32643dc3fb416769d45f137 g_scalar = 6600000000000000000000000000000000000000000000000000000000000000 r = d1609bf2cd28c8fdc8b4a3a98a9fed30e6959e40b4a07fa19ffe9f1de32e3a6c, b5e1f94bc9fbe1d5d2b32c22031428bbeceec1c7af4b3cb2d046e723b9329392 g_scalar = 6800000000000000000000000000000000000000000000000000000000000000 r = 237c88057388378848d61dc507b6f556b2c6a5f201dbed52cb4f805a3e4e7d6c, daf7d5011bb307bfeb90b445e5c9c0d939feab8df098fe30cdf1b1838fa60a0b g_scalar = 6a00000000000000000000000000000000000000000000000000000000000000 r = 845a882c8859bbc2e883d25ff51993083258a70ad731721eddbead4a788e09c4, 6ab31c3ff968c9f8f6655a5e3471a59f7a47d44bc5145873ff614cc9b13bd412 g_scalar = 6c00000000000000000000000000000000000000000000000000000000000000 r = 4d6eec323a1f89e99267af0a5dee21c6d56850cf6466696a53c474abad6c4e7b, 3d620c8a7f89f8d167d3a4762229b54cc7d35c308d9c659e56dbf513573b08ba g_scalar = 6e00000000000000000000000000000000000000000000000000000000000000 r = d28527c6a3824aa9d34030745566465654a149071f100d40b1b006aebc0d6863, 30a82b3f8ae892685b221411648e40d3abe5a927d3815d8acea8ea167d1daa26 g_scalar = 7000000000000000000000000000000000000000000000000000000000000000 r = 8f12502ee0138997ad364df067b256dfde2d4ad1860b8bfbc370e522cc1b5e83, 03511dcdcba5dba53f89b744d3064ba6e80014adc0bc866a503fa0dc7783920a g_scalar = 7200000000000000000000000000000000000000000000000000000000000000 r = 88a0df625c0cd66e4523b7dcd2c772806d46968e6a3bd9ad34f365ff3405157d, 65ff8cd309c966cc43c7fda55ba4408f83a5028dceda14e831f390f0c4591506 g_scalar = 7400000000000000000000000000000000000000000000000000000000000000 r = 350fed185a914c72b1ead64104f9670908dcf2b70004539e0f58cec54e27d357, aacc0f0d9e66d9a362c306869a449d5145f8b46f46d04ac744f43523c5147854 g_scalar = 7600000000000000000000000000000000000000000000000000000000000000 r = 721595eece728342af86c88034fb313add3f191127a10139823002854cd4d5e2, 60c44e259fe4b513848a5b75cda0ac98bbc4b1385076ae4c561a4d050d3f67ba g_scalar = 7800000000000000000000000000000000000000000000000000000000000000 r = 394c3ca1652f359aa37951abff9f5089563ed687c3db1e5fec79a10fae256721, 4efb24bea05c73001333ccc2feb45e46102c640f0a492130b6ae4cdc253f146d g_scalar = 7a00000000000000000000000000000000000000000000000000000000000000 r = 829bec8ffbbc8adbcaa9b2f496d71f842e0d323fc98fb2ed918ad277a25ed969, d7e993dd450011b77fd50ed4dcc2db1d573f92160504d1ccc5b2d540b0a840c2 g_scalar = 7c00000000000000000000000000000000000000000000000000000000000000 r = 114608474b9883e7e6183976a85cf4eaabd1eb6c8fbb831a86d4cd28294b04f8, 686c24f9f2e55be24ce0258ea8f8753a0cfb6c61aa4f3ea4a3185fe73caef54d g_scalar = 7e00000000000000000000000000000000000000000000000000000000000000 r = 8ccebd9296f0b3dbe251932fabb53deb5f020d8cd37bc364b63fd5141593f8c0, cb327c1a879a9b22e65a7ae03cb0f93933358298acb501e46d0790bb64930db2 g_scalar = 8000000000000000000000000000000000000000000000000000000000000000 r = 9211e489de7f4f8a426eca29484c2ece9c4e7ad63c6341fb197dd46d95a7b1a2, 25f92e470f60e01817286a6e1c3eede82b2c09100657458614997f6ec78ef1f4 g_scalar = 8200000000000000000000000000000000000000000000000000000000000000 r = 0695d25fcba9327ba26e5822d699d95b7a6c1acdf37b2836203a31d5a56c98ef, 0aa018cb90f6f3a69438e11059ada186448060e1e6b21a4055ddc74148431893 g_scalar = 8400000000000000000000000000000000000000000000000000000000000000 r = 95e360666c4165c8b8e2959954327c6554009f1e6d947506e4cf728185967fad, 587c76421d9ba792e3221ff31f0e5f79505f09934933a10d39bf3074a3b3f527 g_scalar = 8600000000000000000000000000000000000000000000000000000000000000 r = 3805f4e7a74465b996976624e2d6122797e8092e1a7c6add2ab55f653e360df9, efa55067d6b676840d99ae5a033531efc006b014a204ed4161223dea0a456eb9 g_scalar = 8800000000000000000000000000000000000000000000000000000000000000 r = c48d07aad919b53f72bfcbbf25a2f91f7112f4122205eb70be6dd7fc6b7733ae, 4e873d9c7d35199d38f52714422d39da24504c146efec5713ea468c126a1f691 g_scalar = 8a00000000000000000000000000000000000000000000000000000000000000 r = ef1117f3334d256570ec0990a1bb0900c512ae94e04e361fbd7055ffbd4132b6, e1ea4cb9efc6827777c9f2d8e753987a771143afc0313b2a53d94be882a88c45 g_scalar = 8c00000000000000000000000000000000000000000000000000000000000000 r = b36ddb5a551266fc72a174550b384fab97c8f9d8b94fdd362441c4c0ca8f86c8, f4d28e65ef714ddc20760054070a8a1f3c306bd0f975bd668ce8a71234127c81 g_scalar = 8e00000000000000000000000000000000000000000000000000000000000000 r = 1f07fd1a9ee01d68891d265bb9f79dc8d31da5b74b957a08455930bfd7425424, eef295c42eee7336a82c0ca3bdc0a6fd2cc99c24d290dccab10911c75da30291 g_scalar = 9000000000000000000000000000000000000000000000000000000000000000 r = e0e5daeb54dd3739389f747caf3c3030703ef60057feea5b805c564631890a36, 4a1bd7b5f95a8c3b37183de2af20bf297e4bf176b5393962fe24a4c3c9c9f155 g_scalar = 9200000000000000000000000000000000000000000000000000000000000000 r = 11a4ff0222e558e644144f890e8ff816669d7b57254db82633e0f086aef314c5, 5abafbd19e0e870c6e29235b0555dacdf757c2592e540c0bc8e5326f243efbe6 g_scalar = 9400000000000000000000000000000000000000000000000000000000000000 r = ac45249aec82d6d8a5e1d3c6e19adb253f01996cbb97d0320130abf38cb5ab31, dacb1586f624faf0efb81538eba8bf94fd211c65b681d483c276ef2e5cfbfdf6 g_scalar = 9600000000000000000000000000000000000000000000000000000000000000 r = c738cbcb5a8e43bad9f6002307a003ad81351ce14ffa84fabe1b922b396fae20, c9d2de063135f1936737fe3e62b46bfbf10047a165d1817db5465ec8c9defa53 g_scalar = 9800000000000000000000000000000000000000000000000000000000000000 r = d723ad15da12d3f14aa86124ac83299759198011fda9f625e8ffb637410eaba3, e8d872c4801b2b3a921c79f249602f98ad3084c9edba98ac55ddc53f2da6810c g_scalar = 9a00000000000000000000000000000000000000000000000000000000000000 r = 5bddf84d01fb6ab7717df9c3adcedc68fbe6587456a7fbaf7cc7479be15036a4, 159078eac888fcc8901b2bf9c90c29bb7b7efae9324861aac330a36e5c6c7f9e g_scalar = 9c00000000000000000000000000000000000000000000000000000000000000 r = 0617a8dfe008a218c2700de3e39cfdf9d6b37e5eadb39a5c5e6afed1778930bb, 4b39280254b5248bbf2813099a8fa83410bffb7b65fe50a73e994417ebf1e6ae g_scalar = 9e00000000000000000000000000000000000000000000000000000000000000 r = e19854ec7a29e8cf8765ed78b03c224b072454d8cf4f0b1b746bf4ffcd5eb860, 6869db2586f038ea0c2bf32a39d92c4f42598a6fd2621444499a1924aae5d08d g_scalar = a000000000000000000000000000000000000000000000000000000000000000 r = 6372def79b2bafe8b18e2c1354107588281fc8dd7b87f257a83b969946191d3d, e3bcefafe42700aa1eace32d84310cf43f2dd4b756167a3fdaf4bb480d8972ca g_scalar = a200000000000000000000000000000000000000000000000000000000000000 r = 9e15ebed69c53ab58cb605eda605ea2cb0766c76159bb5814ecfd1490d4d367e, f704a6321f2c0b3344ed22ea847dcbed8da47d36c3dd99d1f5b16de3f0516372 g_scalar = a400000000000000000000000000000000000000000000000000000000000000 r = 3b082784ac9daa213e9231dde959e9257f81bfeceb104d11989cd51d81ffd706, d3bb418ca5f9a35c8e72fb72f2813e703d3f6638c14faed9e28e02ff027f1a57 g_scalar = a600000000000000000000000000000000000000000000000000000000000000 r = ed37bac889c8cd093feb1494b52fe95b30df23d4bf8ad1baab45ff2f3b264155, 1d59a9bc917e7b53af4db00969712c98aa54ea60a5eb3223d4cc02f4e78aebca g_scalar = a800000000000000000000000000000000000000000000000000000000000000 r = 3eb44ebaa26cfda9ec294f9bd82e3b0c7adcdc636cfec330698970dcc1c88910, 6702ce3ff233fd7ae6b382ff1868400da4d780cd8c7d34ed2f488c9ca79ee104 g_scalar = aa00000000000000000000000000000000000000000000000000000000000000 r = 6fd044f86e7c58d93fc322e9763408262abc70bfac2a8c9eacd17f62a70bedca, e351f3762a24e6bf71049b174d8d3a774afa5a849cb3f817584c4855c17a97d3 g_scalar = ac00000000000000000000000000000000000000000000000000000000000000 r = 03e6e884142b953fcf6e45c2f0b7938f042782b6c788822f7caff2a8dd7f4788, 63fc02447f948e02f548a883d347cc7b1e5b425236cb6b7ac6b32c2f748f7fbc g_scalar = ae00000000000000000000000000000000000000000000000000000000000000 r = 541f1c670f8d83510a4f0dce10075d18a773c212de55a51ab85d636205e61d13, e7d652a370ffcdc3de32e541a473b58679b8353f2d2041f627ce3096f0c12a9a g_scalar = b000000000000000000000000000000000000000000000000000000000000000 r = 35e8048ee03c366502e23d41dfc6514aa5db5ab62ea604675fe5691ed785e73d, 1343d185dbd0e40fe8cacc6e2c6646b828ec3b4584ce1a5a3f8b118f1adaa0f8 g_scalar = b200000000000000000000000000000000000000000000000000000000000000 r = d8e96623f2e1ed0f96c490c17b199bba4831540870192a511fd78414f227c4a5, ce0bae6ef7736b606a626da351e5f48aa91730a91e569bed63cc47ecde7e0cf3 g_scalar = b400000000000000000000000000000000000000000000000000000000000000 r = ed1b755f2815d3cf2138d71106187ec35898b1930650dd7ce81907220b4ebbfe, 4c7fa9337d3ab5d5aa78724c853652b08a7c8ab93a11682f54155e144f394514 g_scalar = b600000000000000000000000000000000000000000000000000000000000000 r = fb909a74cc54235e35059c6f94d6bfbf9aa5d2c1bd5a35267217348749af1daf, b0be2db59a9947bcf853ecbfbae332d526883fe01b998b9831bfe5d7f389e929 g_scalar = b800000000000000000000000000000000000000000000000000000000000000 r = 12128b2fd412db03d45acfecc1c397c7110ef147732ebbe02e605d97ce76aebb, d05746ae395ac2650a9295d2a0cb6962eba2732db2236813027ef0992a4d35e4 g_scalar = ba00000000000000000000000000000000000000000000000000000000000000 r = df8df34707ba78f463d2778a91308c54034c07d0eaef09eb0d13b0393524a32e, c7de1146399c30471b4eaa5f7343cb8bb17f477a56f9244daadb189f64900000 g_scalar = bc00000000000000000000000000000000000000000000000000000000000000 r = 570f50b9ade5e185d379afd6bbac1e92f1ca3c3639b1290c6b3eda297e866baa, 3f62e47b7d386fb0a919e766cfad95ba9a8729d3a8c1ab808daf3d6fff88f997 g_scalar = be00000000000000000000000000000000000000000000000000000000000000 r = d9b588174709218a1980177d765796027ca43bcb2bc83e9c14dd8c3678ffb696, f904a4e4e73a0a3b5964a6a9a7f6f77a5becb8a8987c8bc5829b009167c19b38 g_scalar = c000000000000000000000000000000000000000000000000000000000000000 r = b37b515f042eeec8d64cd42d9c875d9a1a1db7e49924182ae5d7f844caaa358c, 55a481c08236ca007dee410259b7e17efc322ed9e206eff34d4dd4097b165fbe g_scalar = c200000000000000000000000000000000000000000000000000000000000000 r = 1e6f624584d42c5a9fd11c23e1b2374586dd7cdb056b372c9a7bfb76f3086c58, 0c3468b965d25df2d1f1563829563068d8d156ab799b8fa8b0efc8b0f47a92b2 g_scalar = c400000000000000000000000000000000000000000000000000000000000000 r = def3204ff622e0f51e7dfc2f11b5036e56aceaa0609c4809389ca9c3b1d2d491, 9eb080e2c4003d74e3667bbc9d705924eaa2dc67b712a88a4e2efa93d2feb754 g_scalar = c600000000000000000000000000000000000000000000000000000000000000 r = ac2244a68510d43ed03eb697c84cbed4e8e7b7e5495fac838defc208af8cb7e5, 748620b2ee30108ffaa231090d98ee944ae45533797fe8e4bf2d0c017b291e8a g_scalar = c800000000000000000000000000000000000000000000000000000000000000 r = 3b2b115548841c4bac23208fd26485e9f65a3640454ef41ff86d13f9e149e73f, 55867cb65a7240c065e50b02fd8a798096500e3972b44b056e922c0653e1fa12 g_scalar = ca00000000000000000000000000000000000000000000000000000000000000 r = fbede0865908334ae1e330f9c70cbc1a87382d6f40abd3c3eb3a10b1e94b9d1f, 3dd4bd39d7699c15f1271203bb2ddcdeae155b4e9f004328e4550b34ddfd4514 g_scalar = cc00000000000000000000000000000000000000000000000000000000000000 r = db88c71bbeaf13bc07a69a30ef6276ed02b0c293cb37d658dc2d1be24becfdb6, 7802d95d4f739cddb7061f336fcffe88c2e36dce9c8cd8d7d4386ef5c97ffe33 g_scalar = ce00000000000000000000000000000000000000000000000000000000000000 r = af06ff2bd95601e3e6b95f2fdee3d5596a0d1bea32ab6a5c6b768e347d563eb6, 89fc97a1a530cf2eb04215b861ba7a5be0c5018bd089f8f22cef2c735f8a91b2 g_scalar = d000000000000000000000000000000000000000000000000000000000000000 r = 956b31e003c45e52a078868ef78edd391571580605d6297b8c885312c23fc975, 8b37b6344c14a975419227b47e2f2598c8d5dc3a0c7e673f470275d5ff7b33a6 g_scalar = d200000000000000000000000000000000000000000000000000000000000000 r = f7ae11128858d4bd081e8fb419b8ae87f8b465db160c6066244bf1db2540eb02, 622f8ffb2a8430a2b4db4ec54ae887dda6c90d66a15f5e44945a36fa107b1802 g_scalar = d400000000000000000000000000000000000000000000000000000000000000 r = 7e8caa24bbb577974f1bfe0fde5e42def5eae8c7f89acdaff3022fb6e646703a, 1c51897148de3dd703c995b69226c8fd51e066afd52bf3e445eb9c742c570f45 g_scalar = d600000000000000000000000000000000000000000000000000000000000000 r = 726cd1b8f826237f899ae92398f41b6f681817c7c9c515ff302c3cfad169508a, 9bef669a5f57c92a2fca18c156cdf1c5f848d43a7aceee1628cc5ca8b512b56a g_scalar = d800000000000000000000000000000000000000000000000000000000000000 r = 2cd615404fa3c57214f08f32b806bbb3c97bf51d0ffac3078f75eab499646d05, 474c7d9f869b581877f70bfb6411ef40835934552e3fdb09f80d50762a913b60 g_scalar = da00000000000000000000000000000000000000000000000000000000000000 r = 44e6235a685fa8c247bd7309a9de5fa66db2fee880a40b64c0b8debf4aa4d144, f7cc4793a3e6270753724b3609098e94764b9d140c4f3dcb35155aa0affeb7d9 g_scalar = dc00000000000000000000000000000000000000000000000000000000000000 r = 3027a162030cd7c2ba74f8354822722008faee4e603bb73e4565f9a834ddc625, ef1b14b212342d60ebf809f9d37f37579b8ee17af351af8448c6c7ecf72ca3a3 g_scalar = de00000000000000000000000000000000000000000000000000000000000000 r = fe35f5c66e9d40a301eee42e3d4f9f3ec28f13ad81f4f013096bb45b738230f3, e46ffbebbabc0d7430ec627d406e1bbdb1843e7fae23b141e72c7d734e0177a1 g_scalar = e000000000000000000000000000000000000000000000000000000000000000 r = 9f40ac3bae92032334e5d0dcb987a24a5e0e8c3e803e25dcd0667ed68b11888c, 7ef1ec27c47bde35491ccd7cda64f1b7a128bf926b6328f95463de9534e0f63a g_scalar = e200000000000000000000000000000000000000000000000000000000000000 r = b9c9c244af407478c96adb0c950359af1d0243f09da21539499d4934d78d5664, 9a9f02b9c6f6ac05800b3daa30d0ea90d96d68a41e822ee4d77655971b5fe2fa g_scalar = e400000000000000000000000000000000000000000000000000000000000000 r = bca14b180256394e833badcb026fbed49d4cac5be7b7f4d976fdb4d8d72905a3, ec67af7ed909d15e2699e6ab07111f87b3ebaeeb6de16ae709eb7554d2dfa217 g_scalar = e600000000000000000000000000000000000000000000000000000000000000 r = 9e84b1429d952dea1a5702fde822c43a6440a71137d7a6d5b1a124a2e982371a, 40f7881d6809e7a532e57be2f72c9bb32b9547bdf3b8c6b3f9a25a6e707ef853 g_scalar = e800000000000000000000000000000000000000000000000000000000000000 r = 5774d975adf3dd428b24580ccbb8bfc2082ec7feeac69a05a84eadc3c6f859bb, a4f85e5d69dddf30f442b4315724f6090a8b1fdeb62b2057f302f1c1fb18545c g_scalar = ea00000000000000000000000000000000000000000000000000000000000000 r = 18b7629228d8a479ef8c3fc19f7258a24084cd681c0bfed585b4a7b6c5b52828, aedaaaf8428b0efa574f47076250e4f54fae49a87cab5893d7a01feafbe6fc5f g_scalar = ec00000000000000000000000000000000000000000000000000000000000000 r = a9269757ad6c71aecd89a9d614befaa9c670d56c86853eddeff93c2d3edf7a05, a4f07fcdd7acca82ab3fd51b72ae50a26d356b17b15f40fa3be313ca58770e90 g_scalar = ee00000000000000000000000000000000000000000000000000000000000000 r = b5ed7a9125881c7719ff07a13ee17b6081df350185faadc70c267dd0ae0c2b14, d40ec72633c833eacaede52ecf0b134aa9c47e6a2dc783cc117d3230ba9c4cab g_scalar = f000000000000000000000000000000000000000000000000000000000000000 r = 80f1a439c929319d7a3a6453d4fb689735dc136663621bc1a857240fa36a2737, 50d7c67d372ab09cfb0d49241e01d0efb0b537668078c5ebfc18274bf8cb0ba0 g_scalar = f200000000000000000000000000000000000000000000000000000000000000 r = 728fc5136ff083f3eb5c80bd85a5f16d33075ddccce277ec4182e4aa4bf75924, 20458e590c1c99290a8dffd60ac0fea619539bd3c1195aeca3c78e8fbf7992ab g_scalar = f400000000000000000000000000000000000000000000000000000000000000 r = c02fe1c417b27af67e00049f9ab0deefd6ef61aff90e37bb06c9f96c6e75e767, e3d3f45da588df43db9829701886b5db90f3e6f2dad02337c82cf700840ef4dc g_scalar = f600000000000000000000000000000000000000000000000000000000000000 r = a883f42917abdea70042d1b7833a576b51a3fb710ce3673f85d05386724c3c80, 5e930c0875653ecc219a96afb9fae1b9eeed99c9b88a535b4b07e8b02f551714 g_scalar = f800000000000000000000000000000000000000000000000000000000000000 r = 5f2f286449c33aa7ac7d0e1c1fb049783f46e326ce433bc6dfffa17e057a3df0, e52d864891f945f1ac7e4c217bc5dc88eb665d859a96d81e40b2e8e311715d42 g_scalar = fa00000000000000000000000000000000000000000000000000000000000000 r = a8b7e8a7068a16707ae69dc317ec34c204b86de7b0a0125589502abd170b0b8e, b5ab8a1239d9ffbb7093e3672489a8e4ccf0516c9ea9316ef31c6e9512a2b866 g_scalar = fc00000000000000000000000000000000000000000000000000000000000000 r = 7d6dbe6556c0f8f08208e6ce3c650c05791a0732e423b40f16ff861277c713f8, c8f21b5d95a05c5219d877e66d0740e53df5baaec2d1bdfb50fdc2c38cd2bcf1 g_scalar = fe00000000000000000000000000000000000000000000000000000000000000 r = 8ec353c2064ebf7c5df16fb0f8867456296c7b9e57af9e532eabd53494b13f3e, 849f2f20957c715f0b11793fbb0250eabf97c7146277a093361518688f5b87db # g_scalar = n - 128 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d1 r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, 05c72cde13ff7e780755d9928a294ec74b90150dc987cb0048857f783d00c492 # g_scalar = n - 127 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d2 r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 898a6ddb541c3eb52f57786dbb0bfc0d02e3b569f529fd2f6549697409ffa69a # g_scalar = n - 126 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d3 r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 6e5b1591deadea0aa0eac0a955c921d27ba60a90ad89e8e79f0041d18f259ec0 # g_scalar = n - 125 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d4 r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, 4e9295063c01443fae23a053eba00f2add6dc6c5a860c31ded74f2db40dde60f # g_scalar = n - 124 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d5 r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 7bb713506fed7602646b3b52b3661bc6a727afaf1b226fa5bc20540c32897bc8 # g_scalar = n - 123 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d6 r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, 5146fbe29618773ba78f8d93e91c1fd525fb337771e800abc0964b2b64b2bcdb # g_scalar = n - 122 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d7 r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 855c4c324d5efb4eb39466ab42ae06fa9156ba434e6fe2c2ffe25e48816e894c # g_scalar = n - 121 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d8 r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, 517c6326f166afa4550b2b1e6cc6b78d00ce7b7c25f5b6695b6be5e1895f1528 # g_scalar = n - 120 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d9 r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, 2ff813865b858eaeb732ea74d3e14abe65d87563555fcb68358918ab6b772fc9 # g_scalar = n - 119 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324da r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, 0120efea019118fd2817ebc7f0984aebe82d639c78848b687e9d30afd29ac026 # g_scalar = n - 118 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324db r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, 363b29c5671a649e930698ea3ad859a98be407f6fc437719fb0ca82e0f9e3121 # g_scalar = n - 117 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dc r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, d3208079bb7f001d623ccc6d0598d7a3af3092ef526e5caf6d8af218c1ae1e43 # g_scalar = n - 116 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dd r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, 56375b4ad46ea8260f93d3738fab65a8ac3cf4429a47f0e979ca80614beda6a1 # g_scalar = n - 115 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324de r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, 16a226267767de4e237207aa01d0b6c8a94893a9455bc4d84622d40d2a0a4a40 # g_scalar = n - 114 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324df r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, 43f113786db22eac69467bebf560798e684a695fb28407b8a1a2207de2933cc1 # g_scalar = n - 113 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e0 r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 9e27df61b60c5ac32ec3356f8b80e6130594324f879f89461f26d165ae6ccc9f # g_scalar = n - 112 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e1 r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 9afff3da3868c5bf18fcad9782c9827fa90146d23ff14df8246854f10774748f # g_scalar = n - 111 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e2 r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, 0650f5316fb2b8cfd8f5233a8eb74ecae33f2b325dc50598b463abc75981de8c # g_scalar = n - 110 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e3 r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 86735660b10c81c4d8f38f9391b7bf0ea89eb6f180fff6a9465703a073face17 # g_scalar = n - 109 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e4 r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, a02511c5e354ed39f329dd451478676618dd6277a93299f250be67b8140c2087 # g_scalar = n - 108 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e5 r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, f2993035b4a2be93f71aba0e4ec1d4b6c9cc69948ff6b195c580b52a1fe001ff # g_scalar = n - 107 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e6 r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, 332816bd7158ff3f1ff7fc61fd21d00ed8ab1bdaf58097834dea61f7489c9623 # g_scalar = n - 106 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e7 r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, d9d0fc13f8a85516a344f964fc017053ec8de7db843d8108c3c279e27c551e90 # g_scalar = n - 105 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e8 r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, 2c292eed1161aed1b1cb924f8e340368378fa836c431801a2a1384440acd87c6 # g_scalar = n - 104 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e9 r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 9456d43421a5f33f8a51077588462f7b00330a1f9ede82116b953c403008a7a7 # g_scalar = n - 103 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ea r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, ebd64e0651e2c128590519f6cf5b06dba2086ca0d79e990cff513e61174082e8 # g_scalar = n - 102 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324eb r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, 5d88925f7be836710c2cb707df01871c9bba0433a436d55c35e31ecf5ab1203b # g_scalar = n - 101 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ec r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 6b3161f424574039a575eb9bb418886c8cedae7e90de97834a090f01523e6566 # g_scalar = n - 100 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ed r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 9c41619a5e8eabde955f973dcfab730b5246164a7a4539485a247ad3dc02f970 # g_scalar = n - 99 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ee r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, b598c01eab0329a6fc5c3d3846700b4c854a75c18aafc1b9ce4a815d7b96c3fb # g_scalar = n - 98 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ef r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, 160fb32bdb3d1cef94a20aa01c6f25a45c067c89255b379b5fa5855722f31c4b # g_scalar = n - 97 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f0 r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, e042b8efac30c1977ba880e0cd9f48987a0b263ca4974818d2384719638f3883 # g_scalar = n - 96 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f1 r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, c0d5874bdbe5d48ffc4b733b83d6435d02d0b07402fda7ece1df7cd727802e27 # g_scalar = n - 95 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f2 r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, c0d6c024d3290bc711e4e34acbbbaa5e9ab66367f3a2445f37fdfb649755e61b # g_scalar = n - 94 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3 r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, effe0727227a558507158615205669f83ffd79279beca88e3a7da59c78e65157 # g_scalar = n - 93 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f4 r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, bca53b986ab0044d0093e587065d7ad0df4fde3d20de623a7dd6f1dac29e092d # g_scalar = n - 92 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f5 r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, 2eabd7a5d0554d6cb58df8a2808cbbd566d652b270b744ed2b4ed8c66ca6daf2 # g_scalar = n - 91 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f6 r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, b58f5407a3aab12d0575a464f4b95a60dcab8e619dc803972a78ec739c36d096 # g_scalar = n - 90 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f7 r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, 1b7a46f1b63f495f52cd6b04e3cf65a65400a94bda2c0211ac894fe71d88d7f5 # g_scalar = n - 89 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f8 r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 8eaf07808dee1bbb854b622df60670659bfc7708c4600010484d7b41eb0496e5 # g_scalar = n - 88 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f9 r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, 272c826ad87a68e312a307d236ee7b83420e89f073806245ffa5e2001542b971 # g_scalar = n - 87 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fa r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, 50b6f7d92a300ea9570bc654f91a71c132f843cc3dca2a93fef1add99e22434e # g_scalar = n - 86 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fb r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, 1936c4cd310249e36560fb0f17515082b5d4a12b82101ae4aa68a609123590c7 # g_scalar = n - 85 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fc r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, ea68ae1c1e34514244ff9951e0d7dc96316e11d9febd7ee46672053e70ee6d49 # g_scalar = n - 84 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fd r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, b34c3ec9490c9fcc20b8be58e46613a098064580d1ba344eda9c3a6f097c176f # g_scalar = n - 83 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fe r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 680ffeccb849b41bfac95c624e639ed9a164e9eea9da5528a3ad4fae39b1f622 # g_scalar = n - 82 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ff r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, e709e0c2210c0663b689ed9ce704fa51be5b8e1c16cfb90d52a34db8328762e8 # g_scalar = n - 81 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632500 r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 8530bbe517a43ebb3424024630d6f2e05fd243be901a4d62019a80ecf7fe6c84 # g_scalar = n - 80 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632501 r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, d66a6e625b32d9a0ad495e8c6ddf0bd7e4fc828b4cdf1404dbd63dd5e2b639fa # g_scalar = n - 79 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632502 r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, 48a20a12e6e5bde12f8c8f3bafed7c8af685ab0166dd84e93d4e78f507cde447 # g_scalar = n - 78 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632503 r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, 07420d147b8b2f3815ddbf3310694b8cbf84005f4dfeec8eb74bc763b9bbdc2c # g_scalar = n - 77 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632504 r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 7ab236296aefa062d4b0f38788146b15b877add5d160244d7c3cec641f2c8cde # g_scalar = n - 76 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632505 r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 64c4fbfa6c47c1bb11b7d9566c81e45cc039199f2b805c34e6399fdfaf1512a0 # g_scalar = n - 75 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632506 r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, db5e421d2f3dcfd31867f8588fba9581841e60f312bbc857af8d8a74870c2fbf # g_scalar = n - 74 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632507 r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, f5b7aa6fd05e42d1883ad28aae66872ef3ba1ad34c400037a3177ac6d447f106 # g_scalar = n - 73 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632508 r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, 3c68daace507d78859926dada17d2a4c478e459d1bfa35f62472337e0bd6ee11 # g_scalar = n - 72 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632509 r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 9032f3437f65f90efc9714e0d1bd7c1ee45f347463a2d195cc52acabf23bf9fb # g_scalar = n - 71 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250a r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, a8b3384c6c87986fee06b8196932fa8dfcf5ee6122b50e13a932ffe1c620c98d # g_scalar = n - 70 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250b r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, 3986c52c191d0c4f63391dd5d8365d152ee51bd352fe7d1bf81a1717a4106ac5 # g_scalar = n - 69 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250c r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 92c84e04ab904134ded953aac5722ed96415f2f1d9aa2eb06784f9780b14a309 # g_scalar = n - 68 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250d r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, 0996fb4dbff36b9dbbf2136131f073cd448fb8cc84a8207e455c80a2f7599f37 # g_scalar = n - 67 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250e r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, 02a6281365709d2721c138d73cf5695ffa50ba96f99df517d38ca53ed0cc5085 # g_scalar = n - 66 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250f r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, 4edcb865c16f620563fccbb48aaab052aa6edf9c2f0a44d556dce373161a8e35 # g_scalar = n - 65 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632510 r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 82f6953ad0e8b8b0d36f26730c1faa29cc34896f459a60b999149d0e46a84b5e # g_scalar = n - 64 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632511 r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, d698dfbaf17bb6907fef5b5f87bdb407708d94477051507d65c39aed7f1201d0 # g_scalar = n - 63 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632512 r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 6f7895fdbf6a64906d4083706edcf21f536746d07db17e688f83fb2ac7c18945 # g_scalar = n - 62 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632513 r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 949f2fffca531ff722b800677eb416119b8d1a1197f98fe11c23bdb144cd1c71 # g_scalar = n - 61 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632514 r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, f2e4387e78d4240d499a7b9925bb445db8c3a980112bcaf2280507e624146496 # g_scalar = n - 60 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632515 r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, fb7dfef5441b17ce3bf5fb42b0ae5269ed39ae60dd5200d3505eca4407f18a35 # g_scalar = n - 59 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632516 r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, 5f9db666b904857599ae08fe831b88078875032d57c814155f7b16f3eabd98fb # g_scalar = n - 58 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632517 r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, f9c8b66aa998b8bfe854a9d241a004c1058facc2859ce652cc12e43b9dc04de4 # g_scalar = n - 57 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632518 r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, 25bb3938fffe89da3a54d9cd386485fea8b7f9f3499e87d546f60d24d55361a6 # g_scalar = n - 56 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632519 r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 7c6d897dfd93d3f8b165a43d5b4a6953fe1f247a4e0ddeb420353da4e0650cd5 # g_scalar = n - 55 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251a r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, da17febf0eb30c0c3d3095977f1ae735118a607961d8594b154b6a3a5fe7d421 # g_scalar = n - 54 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251b r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, e5aa91bf156a6a15c20d885be2e6c94e811f3bbc189d9a553d708f2d1829ef81 # g_scalar = n - 53 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251c r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, 045e25a5bcb9ad7d4eaa432d23501e68c247d091addeec0d7fe980be3ce34d9b # g_scalar = n - 52 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251d r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 810d0dd863f0f073a3d8feb464413c61dc46d152dd20ca9d098572d6a79b9783 # g_scalar = n - 51 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251e r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, 28ce1c7b5d0ab3d3665a1dc27d97e39d9e0eaee4a1e5a09ac8f4b1588cdbe15c # g_scalar = n - 50 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251f r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, 282cbe6a3c9d73edbc488e9433ebc5b91021851a5bbb636940617f76651d48ef # g_scalar = n - 49 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632520 r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, 2c6bf8800db805cab2870a6d087e7127d9eb82d90b9ba4a57c836dd7a1eef617 # g_scalar = n - 48 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632521 r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 7a103815becda33e578a0a31ad628a1cf4d9280548273a48c60a6099e8a5200e # g_scalar = n - 47 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632522 r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 64400790922202d9fb7e62aea2126c2b646bb1f0845135ecddf8aa3326de29f1 # g_scalar = n - 46 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632523 r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, fcc25cc63e48079ba8374d3faa087ca2babce29aa54bc0d4bd549d363ea7919c # g_scalar = n - 45 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632524 r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, 28c53400d326194b88d109213807f37e3adabb9708d4cc5a38b8346987d45de5 # g_scalar = n - 44 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632525 r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, 149d606ec7845bd6c685db822962cbe8fbdcbb94b4f7c480405f99788cf2af25 # g_scalar = n - 43 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632526 r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, b886a0af6a4d2260616e32c45a195ce7b27d2fae15231a5745be4f9d9e596993 # g_scalar = n - 42 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632527 r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, 0c57301b764382c3b4ff4df46f9feb3064ca69ef0cd3af512ea799821600da85 # g_scalar = n - 41 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632528 r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, 08f40112fc77b5853988cda6e2a826314906b2d2378165b8494f255d5ca39d70 # g_scalar = n - 40 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632529 r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, fcb999ec2e558fd154da915ca10abca68b391e74c954e3cb26f45e770d9ae867 # g_scalar = n - 39 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252a r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, f3f43f1996e6dbf8b8479b051eb184e3d13b589a7e7d77891d2782dc9c3ad067 # g_scalar = n - 38 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252b r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, 265b3d7e637f3cb342557b2971a6ce6333554ca740c7fbf6f13cd2c401889a1a # g_scalar = n - 37 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252c r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, a74c9ebb9dff775809c1431aeaa7b9d3185225c290df27af5ed4bb7582c31449 # g_scalar = n - 36 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252d r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, b7f461ed22925adabaf53f451dae5f396cb17d2de9d401ec1a1451426b325fc5 # g_scalar = n - 35 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252e r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, d456fe9c744b8508db1b54ed94dc8508cec3cff4ab87ad2a9ac5fe6f73149556 # g_scalar = n - 34 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252f r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, 5ea6eff2a8f28b08388ccd5cc3a96bd9445d34e19078906d0284fff4a249068e # g_scalar = n - 33 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632530 r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, 4e93bcfb3cd09c3c06f69fb089c0ea8baaf62ed8a7b82a10953b7cd4c5713e0e # g_scalar = n - 32 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632531 r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 9dce286c6a6e3d5c846963e55265d1bf81bb649cb7f566f7f61dc1922410bd0a # g_scalar = n - 31 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632532 r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, 0c75176db284b8bb05131202f367fc03d26de35e67149fd72616017eb15acd66 # g_scalar = n - 30 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533 r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, b9f2ba30ae9fe08e299825c864c55bbe498aaee2f94064b52a3373d0e3fbf543 # g_scalar = n - 29 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632534 r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, c867ebd4d5c41de5756996c688839e606fb8dbb95d04e75c6724998ca3df7766 # g_scalar = n - 28 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632535 r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, 564b339fbfa7ad88b59774b7d2f348e1595806397fb4d597e2c2c6c12e57c25e # g_scalar = n - 27 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632536 r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, d2bcef9627b421cfd2682ef78714b344c42f3991224804a76dff4845f676a18f # g_scalar = n - 26 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632537 r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, 12e87fce2ed1a539eb021684a056bb0aa5c676759d753af77b30eb1ee2db7fe7 # g_scalar = n - 25 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632538 r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 846b723ba9086698edf977a63648ce1169339ceebc0bc6afb47236014b699dd7 # g_scalar = n - 24 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632539 r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, a6a23aa0358c847689960fce6c348afeee15b6b7775e1ca95aae28af4db43438 # g_scalar = n - 23 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253a r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 7c2f97836f889991b7f971ec8e53d08e1a025b64d8d660b5fc9f5b0461b87a56 # g_scalar = n - 22 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253b r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 86c172f7a2a32f8c6216e825eac5ca4a9bf3d296b2dc015b6b587844cabea0fb # g_scalar = n - 21 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253c r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, 3f792a0d36b8805d858afdc18053d65be4f052407c44c39e0d622b4d1d791a46 # g_scalar = n - 20 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253d r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, a11efb1d3a011f306e9e3ac07556a1995d2b13e9000034517d10e3be877bffa2 # g_scalar = n - 19 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253e r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, 08df11d992eda6857a99a1641c6af73ea7f9dbb60456883ad2c9161823b39694 # g_scalar = n - 18 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253f r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 93903825fafdc6b3d9d96d80e47b8445b4d5a35170b0f4c3995d428da1b7a5e2 # g_scalar = n - 17 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, 142aedd8cd8b3c30d0b1db80f2e77c44fa8a40d0176347f1dd82ceb96c186678 # g_scalar = n - 16 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632541 r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 9b12084cfe101de0aa3b9dc44ea7f161c98f3ce7b4f49a780d0ee429ad5dc064 # g_scalar = n - 15 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632542 r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, dfbde8f48f86520c9b1059218875b8682899caacbd5be4dabf47adb09c7c3ba2 # g_scalar = n - 14 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543 r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, ead8f922d155e445171be6c1d59a182441d6a9627cddc83dd84ad24866a2a794 # g_scalar = n - 13 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632544 r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, 043f789536184869832f9bdd42e0a43e978b7c708bd12d1cca8ad46f3ff11e80 # g_scalar = n - 12 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632545 r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 800a8369acdc7536d7dd730575219299e8f12d0a3576a9c8f353ed26e344a4bc # g_scalar = n - 11 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632546 r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 976cffdb1eda4772f3f25576e1529bc2daf06c621a809e37e5897a9ed46bb177 # g_scalar = n - 10 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632547 r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 878e65aa14c4b54ba082d29a88641a2d3bc5766fc7c041f7f3d4bf877f226189 # g_scalar = n - 9 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632548 r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, f799a631027ca065d491fe65774ed0e5a950841331a2ba1ce14888855ba0cceb # g_scalar = n - 8 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632549 r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, a913ed0c88f9208aedc3847b419f440fde1ccd83306145ea0a625c56acd2b688 # g_scalar = n - 7 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254a r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, 151226e991dbf799106cc4238836be6a98bd0d0ea2598422d7b82fcfc0a462b2 # g_scalar = n - 6 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, 5b366e91b5f808a10bdb2bb3109c60eed663d4ad5200eb4a6c2c9ddf2c881bb4 # g_scalar = n - 5 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254c r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 8c5f8943d22e16eacabf56788185e0978c3a97111a1477d414cf64b51845b0ef # g_scalar = n - 4 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254d r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 7b4eb3c5b3a5479d9493c9211a222dd1e89d7b8f05290bb8d2690db31b345459 # g_scalar = n - 3 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, 2a0f95d51a7833f9877df7cee5d11671a7c1b853f79e01e54fb3a3e0367c5814 # g_scalar = n - 2 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # g_scalar = n - 1 g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 ring-0.16.9/src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt000064400000000000000000000017131352331573000233310ustar0000000000000000# Similar to p256_point_mul_tests.txt, but tests point decoding and point # encoding too. In particular, the inputs coordinates here are not Montgomery # encoded, but the inputs in p256_point_mul_tests.txt are. # Regression Test from https://github.com/golang/go/issues/20040 p_scalar = 2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737 p = 04023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad r = 044d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3a22d2b7f7818a3563e0f7a76c9bf0921ac55e06e2e4d11795b233824b1db8cc0 p_scalar = 313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd p = 04cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031 r = 04831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f1799193f90934cd0ef2c698cc471c60a93524e87ab31ca2412252337f364513e43684 ring-0.16.9/src/ec/suite_b/ops/p256_point_mul_tests.txt000064400000000000000000003713731352331573000211320ustar0000000000000000# Scalar Bit Pattern Coverage tests p_scalar = 00 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf p_scalar = 01 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 p_scalar = 02 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a p_scalar = 03 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, 2a0f95d51a7833f9877df7cee5d11671a7c1b853f79e01e54fb3a3e0367c5814 p_scalar = 04 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 7b4eb3c5b3a5479d9493c9211a222dd1e89d7b8f05290bb8d2690db31b345459 p_scalar = 05 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 8c5f8943d22e16eacabf56788185e0978c3a97111a1477d414cf64b51845b0ef p_scalar = 06 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, 5b366e91b5f808a10bdb2bb3109c60eed663d4ad5200eb4a6c2c9ddf2c881bb4 p_scalar = 07 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, 151226e991dbf799106cc4238836be6a98bd0d0ea2598422d7b82fcfc0a462b2 p_scalar = 08 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, a913ed0c88f9208aedc3847b419f440fde1ccd83306145ea0a625c56acd2b688 p_scalar = 09 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, f799a631027ca065d491fe65774ed0e5a950841331a2ba1ce14888855ba0cceb p_scalar = 0a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 878e65aa14c4b54ba082d29a88641a2d3bc5766fc7c041f7f3d4bf877f226189 p_scalar = 0b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 976cffdb1eda4772f3f25576e1529bc2daf06c621a809e37e5897a9ed46bb177 p_scalar = 0c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 800a8369acdc7536d7dd730575219299e8f12d0a3576a9c8f353ed26e344a4bc p_scalar = 0d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, 043f789536184869832f9bdd42e0a43e978b7c708bd12d1cca8ad46f3ff11e80 p_scalar = 0e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, ead8f922d155e445171be6c1d59a182441d6a9627cddc83dd84ad24866a2a794 p_scalar = 0f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, dfbde8f48f86520c9b1059218875b8682899caacbd5be4dabf47adb09c7c3ba2 p_scalar = 10 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 9b12084cfe101de0aa3b9dc44ea7f161c98f3ce7b4f49a780d0ee429ad5dc064 p_scalar = 11 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, 142aedd8cd8b3c30d0b1db80f2e77c44fa8a40d0176347f1dd82ceb96c186678 p_scalar = 12 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 93903825fafdc6b3d9d96d80e47b8445b4d5a35170b0f4c3995d428da1b7a5e2 p_scalar = 13 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, 08df11d992eda6857a99a1641c6af73ea7f9dbb60456883ad2c9161823b39694 p_scalar = 14 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, a11efb1d3a011f306e9e3ac07556a1995d2b13e9000034517d10e3be877bffa2 p_scalar = 15 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, 3f792a0d36b8805d858afdc18053d65be4f052407c44c39e0d622b4d1d791a46 p_scalar = 16 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 86c172f7a2a32f8c6216e825eac5ca4a9bf3d296b2dc015b6b587844cabea0fb p_scalar = 17 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 7c2f97836f889991b7f971ec8e53d08e1a025b64d8d660b5fc9f5b0461b87a56 p_scalar = 18 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, a6a23aa0358c847689960fce6c348afeee15b6b7775e1ca95aae28af4db43438 p_scalar = 19 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 846b723ba9086698edf977a63648ce1169339ceebc0bc6afb47236014b699dd7 p_scalar = 1a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, 12e87fce2ed1a539eb021684a056bb0aa5c676759d753af77b30eb1ee2db7fe7 p_scalar = 1b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, d2bcef9627b421cfd2682ef78714b344c42f3991224804a76dff4845f676a18f p_scalar = 1c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, 564b339fbfa7ad88b59774b7d2f348e1595806397fb4d597e2c2c6c12e57c25e p_scalar = 1d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, c867ebd4d5c41de5756996c688839e606fb8dbb95d04e75c6724998ca3df7766 p_scalar = 1e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, b9f2ba30ae9fe08e299825c864c55bbe498aaee2f94064b52a3373d0e3fbf543 p_scalar = 1f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, 0c75176db284b8bb05131202f367fc03d26de35e67149fd72616017eb15acd66 p_scalar = 20 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 9dce286c6a6e3d5c846963e55265d1bf81bb649cb7f566f7f61dc1922410bd0a p_scalar = 21 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, 4e93bcfb3cd09c3c06f69fb089c0ea8baaf62ed8a7b82a10953b7cd4c5713e0e p_scalar = 22 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, 5ea6eff2a8f28b08388ccd5cc3a96bd9445d34e19078906d0284fff4a249068e p_scalar = 23 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, d456fe9c744b8508db1b54ed94dc8508cec3cff4ab87ad2a9ac5fe6f73149556 p_scalar = 24 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, b7f461ed22925adabaf53f451dae5f396cb17d2de9d401ec1a1451426b325fc5 p_scalar = 25 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, a74c9ebb9dff775809c1431aeaa7b9d3185225c290df27af5ed4bb7582c31449 p_scalar = 26 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, 265b3d7e637f3cb342557b2971a6ce6333554ca740c7fbf6f13cd2c401889a1a p_scalar = 27 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, f3f43f1996e6dbf8b8479b051eb184e3d13b589a7e7d77891d2782dc9c3ad067 p_scalar = 28 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, fcb999ec2e558fd154da915ca10abca68b391e74c954e3cb26f45e770d9ae867 p_scalar = 29 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, 08f40112fc77b5853988cda6e2a826314906b2d2378165b8494f255d5ca39d70 p_scalar = 2a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, 0c57301b764382c3b4ff4df46f9feb3064ca69ef0cd3af512ea799821600da85 p_scalar = 2b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, b886a0af6a4d2260616e32c45a195ce7b27d2fae15231a5745be4f9d9e596993 p_scalar = 2c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, 149d606ec7845bd6c685db822962cbe8fbdcbb94b4f7c480405f99788cf2af25 p_scalar = 2d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, 28c53400d326194b88d109213807f37e3adabb9708d4cc5a38b8346987d45de5 p_scalar = 2e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, fcc25cc63e48079ba8374d3faa087ca2babce29aa54bc0d4bd549d363ea7919c p_scalar = 2f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 64400790922202d9fb7e62aea2126c2b646bb1f0845135ecddf8aa3326de29f1 p_scalar = 30 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 7a103815becda33e578a0a31ad628a1cf4d9280548273a48c60a6099e8a5200e p_scalar = 31 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, 2c6bf8800db805cab2870a6d087e7127d9eb82d90b9ba4a57c836dd7a1eef617 p_scalar = 32 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, 282cbe6a3c9d73edbc488e9433ebc5b91021851a5bbb636940617f76651d48ef p_scalar = 33 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, 28ce1c7b5d0ab3d3665a1dc27d97e39d9e0eaee4a1e5a09ac8f4b1588cdbe15c p_scalar = 34 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 810d0dd863f0f073a3d8feb464413c61dc46d152dd20ca9d098572d6a79b9783 p_scalar = 35 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, 045e25a5bcb9ad7d4eaa432d23501e68c247d091addeec0d7fe980be3ce34d9b p_scalar = 36 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, e5aa91bf156a6a15c20d885be2e6c94e811f3bbc189d9a553d708f2d1829ef81 p_scalar = 37 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, da17febf0eb30c0c3d3095977f1ae735118a607961d8594b154b6a3a5fe7d421 p_scalar = 38 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 7c6d897dfd93d3f8b165a43d5b4a6953fe1f247a4e0ddeb420353da4e0650cd5 p_scalar = 39 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, 25bb3938fffe89da3a54d9cd386485fea8b7f9f3499e87d546f60d24d55361a6 p_scalar = 3a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, f9c8b66aa998b8bfe854a9d241a004c1058facc2859ce652cc12e43b9dc04de4 p_scalar = 3b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, 5f9db666b904857599ae08fe831b88078875032d57c814155f7b16f3eabd98fb p_scalar = 3c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, fb7dfef5441b17ce3bf5fb42b0ae5269ed39ae60dd5200d3505eca4407f18a35 p_scalar = 3d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, f2e4387e78d4240d499a7b9925bb445db8c3a980112bcaf2280507e624146496 p_scalar = 3e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 949f2fffca531ff722b800677eb416119b8d1a1197f98fe11c23bdb144cd1c71 p_scalar = 3f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 6f7895fdbf6a64906d4083706edcf21f536746d07db17e688f83fb2ac7c18945 p_scalar = 40 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, d698dfbaf17bb6907fef5b5f87bdb407708d94477051507d65c39aed7f1201d0 p_scalar = 41 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 82f6953ad0e8b8b0d36f26730c1faa29cc34896f459a60b999149d0e46a84b5e p_scalar = 42 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, 4edcb865c16f620563fccbb48aaab052aa6edf9c2f0a44d556dce373161a8e35 p_scalar = 43 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, 02a6281365709d2721c138d73cf5695ffa50ba96f99df517d38ca53ed0cc5085 p_scalar = 44 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, 0996fb4dbff36b9dbbf2136131f073cd448fb8cc84a8207e455c80a2f7599f37 p_scalar = 45 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 92c84e04ab904134ded953aac5722ed96415f2f1d9aa2eb06784f9780b14a309 p_scalar = 46 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, 3986c52c191d0c4f63391dd5d8365d152ee51bd352fe7d1bf81a1717a4106ac5 p_scalar = 47 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, a8b3384c6c87986fee06b8196932fa8dfcf5ee6122b50e13a932ffe1c620c98d p_scalar = 48 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 9032f3437f65f90efc9714e0d1bd7c1ee45f347463a2d195cc52acabf23bf9fb p_scalar = 49 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, 3c68daace507d78859926dada17d2a4c478e459d1bfa35f62472337e0bd6ee11 p_scalar = 4a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, f5b7aa6fd05e42d1883ad28aae66872ef3ba1ad34c400037a3177ac6d447f106 p_scalar = 4b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, db5e421d2f3dcfd31867f8588fba9581841e60f312bbc857af8d8a74870c2fbf p_scalar = 4c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 64c4fbfa6c47c1bb11b7d9566c81e45cc039199f2b805c34e6399fdfaf1512a0 p_scalar = 4d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 7ab236296aefa062d4b0f38788146b15b877add5d160244d7c3cec641f2c8cde p_scalar = 4e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, 07420d147b8b2f3815ddbf3310694b8cbf84005f4dfeec8eb74bc763b9bbdc2c p_scalar = 4f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, 48a20a12e6e5bde12f8c8f3bafed7c8af685ab0166dd84e93d4e78f507cde447 p_scalar = 50 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, d66a6e625b32d9a0ad495e8c6ddf0bd7e4fc828b4cdf1404dbd63dd5e2b639fa p_scalar = 51 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 8530bbe517a43ebb3424024630d6f2e05fd243be901a4d62019a80ecf7fe6c84 p_scalar = 52 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, e709e0c2210c0663b689ed9ce704fa51be5b8e1c16cfb90d52a34db8328762e8 p_scalar = 53 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 680ffeccb849b41bfac95c624e639ed9a164e9eea9da5528a3ad4fae39b1f622 p_scalar = 54 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, b34c3ec9490c9fcc20b8be58e46613a098064580d1ba344eda9c3a6f097c176f p_scalar = 55 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, ea68ae1c1e34514244ff9951e0d7dc96316e11d9febd7ee46672053e70ee6d49 p_scalar = 56 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, 1936c4cd310249e36560fb0f17515082b5d4a12b82101ae4aa68a609123590c7 p_scalar = 57 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, 50b6f7d92a300ea9570bc654f91a71c132f843cc3dca2a93fef1add99e22434e p_scalar = 58 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, 272c826ad87a68e312a307d236ee7b83420e89f073806245ffa5e2001542b971 p_scalar = 59 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 8eaf07808dee1bbb854b622df60670659bfc7708c4600010484d7b41eb0496e5 p_scalar = 5a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, 1b7a46f1b63f495f52cd6b04e3cf65a65400a94bda2c0211ac894fe71d88d7f5 p_scalar = 5b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, b58f5407a3aab12d0575a464f4b95a60dcab8e619dc803972a78ec739c36d096 p_scalar = 5c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, 2eabd7a5d0554d6cb58df8a2808cbbd566d652b270b744ed2b4ed8c66ca6daf2 p_scalar = 5d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, bca53b986ab0044d0093e587065d7ad0df4fde3d20de623a7dd6f1dac29e092d p_scalar = 5e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, effe0727227a558507158615205669f83ffd79279beca88e3a7da59c78e65157 p_scalar = 5f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, c0d6c024d3290bc711e4e34acbbbaa5e9ab66367f3a2445f37fdfb649755e61b p_scalar = 60 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, c0d5874bdbe5d48ffc4b733b83d6435d02d0b07402fda7ece1df7cd727802e27 p_scalar = 61 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, e042b8efac30c1977ba880e0cd9f48987a0b263ca4974818d2384719638f3883 p_scalar = 62 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, 160fb32bdb3d1cef94a20aa01c6f25a45c067c89255b379b5fa5855722f31c4b p_scalar = 63 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, b598c01eab0329a6fc5c3d3846700b4c854a75c18aafc1b9ce4a815d7b96c3fb p_scalar = 64 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 9c41619a5e8eabde955f973dcfab730b5246164a7a4539485a247ad3dc02f970 p_scalar = 65 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 6b3161f424574039a575eb9bb418886c8cedae7e90de97834a090f01523e6566 p_scalar = 66 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, 5d88925f7be836710c2cb707df01871c9bba0433a436d55c35e31ecf5ab1203b p_scalar = 67 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, ebd64e0651e2c128590519f6cf5b06dba2086ca0d79e990cff513e61174082e8 p_scalar = 68 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 9456d43421a5f33f8a51077588462f7b00330a1f9ede82116b953c403008a7a7 p_scalar = 69 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, 2c292eed1161aed1b1cb924f8e340368378fa836c431801a2a1384440acd87c6 p_scalar = 6a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, d9d0fc13f8a85516a344f964fc017053ec8de7db843d8108c3c279e27c551e90 p_scalar = 6b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, 332816bd7158ff3f1ff7fc61fd21d00ed8ab1bdaf58097834dea61f7489c9623 p_scalar = 6c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, f2993035b4a2be93f71aba0e4ec1d4b6c9cc69948ff6b195c580b52a1fe001ff p_scalar = 6d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, a02511c5e354ed39f329dd451478676618dd6277a93299f250be67b8140c2087 p_scalar = 6e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 86735660b10c81c4d8f38f9391b7bf0ea89eb6f180fff6a9465703a073face17 p_scalar = 6f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, 0650f5316fb2b8cfd8f5233a8eb74ecae33f2b325dc50598b463abc75981de8c p_scalar = 70 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 9afff3da3868c5bf18fcad9782c9827fa90146d23ff14df8246854f10774748f p_scalar = 71 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 9e27df61b60c5ac32ec3356f8b80e6130594324f879f89461f26d165ae6ccc9f p_scalar = 72 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, 43f113786db22eac69467bebf560798e684a695fb28407b8a1a2207de2933cc1 p_scalar = 73 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, 16a226267767de4e237207aa01d0b6c8a94893a9455bc4d84622d40d2a0a4a40 p_scalar = 74 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, 56375b4ad46ea8260f93d3738fab65a8ac3cf4429a47f0e979ca80614beda6a1 p_scalar = 75 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, d3208079bb7f001d623ccc6d0598d7a3af3092ef526e5caf6d8af218c1ae1e43 p_scalar = 76 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, 363b29c5671a649e930698ea3ad859a98be407f6fc437719fb0ca82e0f9e3121 p_scalar = 77 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, 0120efea019118fd2817ebc7f0984aebe82d639c78848b687e9d30afd29ac026 p_scalar = 78 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, 2ff813865b858eaeb732ea74d3e14abe65d87563555fcb68358918ab6b772fc9 p_scalar = 79 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, 517c6326f166afa4550b2b1e6cc6b78d00ce7b7c25f5b6695b6be5e1895f1528 p_scalar = 7a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 855c4c324d5efb4eb39466ab42ae06fa9156ba434e6fe2c2ffe25e48816e894c p_scalar = 7b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, 5146fbe29618773ba78f8d93e91c1fd525fb337771e800abc0964b2b64b2bcdb p_scalar = 7c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 7bb713506fed7602646b3b52b3661bc6a727afaf1b226fa5bc20540c32897bc8 p_scalar = 7d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, 4e9295063c01443fae23a053eba00f2add6dc6c5a860c31ded74f2db40dde60f p_scalar = 7e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 6e5b1591deadea0aa0eac0a955c921d27ba60a90ad89e8e79f0041d18f259ec0 p_scalar = 7f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 898a6ddb541c3eb52f57786dbb0bfc0d02e3b569f529fd2f6549697409ffa69a p_scalar = 80 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, 05c72cde13ff7e780755d9928a294ec74b90150dc987cb0048857f783d00c492 p_scalar = 0200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 135dc5395b54827dd161d2cacf780900bcef72873566cc63b2330fef4e4ca463, 74f3a8c6d9ead371168ca79292ccde25ef5ddb10f8205f939c70fad1d840e439 p_scalar = 0400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 15b4488b29fd9fd06e1da8c39a33c6771fe19e357fe4364e9910ba6b23a5d896, 0d3b086249137c65c02e4db6f81a9a716df57590547e9c17e0bc6dabe5e0dd40 p_scalar = 0600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e78c2ec0fc61206741311f8a38038a5d8f860c7943ef881c84cea0691416a6a5, ca41108461c93c6200aa75130c9ed3454b336200a69fbf68b6b2d17ea528ca7e p_scalar = 0800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0bdec21162bc679298204cb64fcf68e15d2b0ac6c717370e8b5c619c76497ee8, fc8db7152d2b034ca10496c1c2f1f374061c05691f21e53a968c331059c4efee p_scalar = 0a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fe2bc235e52800a089fa443d07d3e75e96e9793ed510053ccf57fca29849e95b, 11ad8b81369f4f1fde81bffa1abe1a6d4a7ad5b718dddd9ce3df7473f53818bf p_scalar = 0c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 69aada7f6d6180a56183291b6ed77d1c62699718e770b20dd3694e2ab20364e4, 2ac1b72cd7237812295dcf758046927202817baa878fef88ae06fab40e7aaf64 p_scalar = 0e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1280aafbed23f0d182293299cdf809af94589aac6656bbe13e858c2ffceac518, 6405033235a7335e2a34ff4cbf0fdcdd1fef5c6630513e802154f3988cf91d5b p_scalar = 1000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7be5ed0dc475c1293f06d66c530cb4f3d8772d353381060380802dc91ec34f9e, f513bbea8d7a443646dee7396d5e4ba139c2d7a9360094b33461c3e6ce17d4ef p_scalar = 1200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f82412db37333f2074feaff5e72c2666cb98c3ea2233117dba89095174f9fd77, b51180a01afcbe79358bec59ac19d3607e5b687c85448e55323c0c5062d8e35f p_scalar = 1400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5ec40582c9a82fa78d5d177c64ff8578982be4fd46700b8b37071afbe8316c45, 52b4b08f3f3eb21aced0c69fb44448b3db17f60c60fced7baae71c8430579987 p_scalar = 1600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2a1ef7d7822e8cc963aa5cca4fd924a2b44de63e08ae4169cf62c250869027b8, 7f5cf538002ed8de737d18ccc5780e107d7bd440b479c9141be4c839914ca0c3 p_scalar = 1800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f3b4962f5f3e6c3e028a81514f3cf2dc6415834bac4ab3aba3d6f4868eb6e843, e48886e1f978ecce3ce3229464eb6129bc8592761ef431aa6ee6516f67822d0d p_scalar = 1a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d9025fff8a8af1c635761c8ee1f6176d54c439b0391fa36e2f41e643356317fd, 945416afaa1c4881851248380ab5d45b44b722ed6a5b8ba4737d90c30833bb8b p_scalar = 1c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1eb6a9688f95277ca3fd22fbcea3f029965a774094e746409c34b650e16e05e9, edef63b45310a343156d3e99647bf2b7526e8dff0a70d011dadf59c284527b09 p_scalar = 1e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 870ae6bdc2754097035ebe4addc4f080ed400a2232cdc71aee20415c2245134a, b092884c8aa21a5e16a601c1a30573590a80e6aa1b0aa67d5e6d197b3fb728d2 p_scalar = 2000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b7a23f34b68e19f8d0107914ceaae10ecbe906f04c93302efc189ae71e29a3ef, c30f4406c2bbcfc89aa6e409b25e8eecfce673920352363716278a3d102dee62 p_scalar = 2200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 68a9969c8e2256288644ef1cdfceb8ab862ae25e2ece8f72d32d7cec0094e84c, 860d7d9237a468fb342f659a640f3249cf7591e87d45dbd420df61d84cee8789 p_scalar = 2400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ada4cfdd7ecfa8408c94a21ab972da90598d0bf8849be4b7ab293027aad991c1, 506cb915147a9d206ffbdb14959ad5aa8359e85efcde65cb6c2b463f043139c5 p_scalar = 2600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f6e29e442433b4c681d700b2c6fa654a9edd11a6b7a82bb80ef6a240c793c0cd, 2a221c4e8df83860eab25e2e7b77b685779c1f1f53e2a0ae5522c2a7660fe4e2 p_scalar = 2800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 54476778acd2f1b6c92becfa390b3ef2b1643ab5911bc478c3e04d7902381461, 44fb8cfe6f4f86f611e7d6ef4a5ec53cd43ed785d3de39a57255f3b29940c550 p_scalar = 2a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 574fc2b081704bde30651575aab5306d953939f44ead0fd9d6d8bbd2f2338d2a, 0d2ba583b63665ed12abd59ad3ae16b618d475fb149c0c70cbfdf7e0becd0d0f p_scalar = 2c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 17f904ba45b0995e765a50db1a6fd0ffc5772beefdc3a47b83766947d17d4e0b, 3705bd94ebd02b2b98c726b0b934e0260a92480d3d8f55123119bc7cd77cb781 p_scalar = 2e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5090d91f0b80bcb946d480d77119c60ed7799b31b313c052bfe48a8ff43daf9d, c02509dd9d1e27a689641fd44e2a6d73e91964b166ea55f536b3b3e178c42840 p_scalar = 3000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 389caef34ec5b10982159d07de7d6f2c945353e1b2d4c63aae485bb72b724759, 8cbd64453ebdf75d7e905c127c0dbfa0d23d3482226621bcb57144ac249a10eb p_scalar = 3200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f5aa74e43a64439e577793fce12c68ab07de7ab35133e5a2768978afed08d68c, 5da88e7912bd33f859ee2be3710df0cfdffc222ce2bba6fd9ba826f3bafa160b p_scalar = 3400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 58c8a77ac0d58abd9947c636a9b6e05a8d98277b4a837f6908ed8febd56daf06, 041e7a12c71e14b91342e6a71c04f3a2e9329839ef892c2c0bab695ba0ede1b0 p_scalar = 3600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9bc6c2af18eaf22cf81a4b3e0fd97269d8f158f5d6df29e581ea0bc89b6956e1, 9c4b4d8628f8a1e4bcc6ab6270d0a6c3fc4405f16dae12ba3e2c31a1929daad4 p_scalar = 3800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 98fe1c61f5b61d31fd025001b905b499dd4d06aff39e7832b7ef9760ff79d2ee, f71dececd3c7cd215cdd4f60aeb14e92c891c488cff632655607c67f3a0ed7fa p_scalar = 3a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d7d80165dd6861d485715b2edb2589d37b0b8307280d1be142c772b68b61c205, ba7519a234f0c9acdfa1d767bda92244ef6a5206c475428a9dca8b9a7f78fe7b p_scalar = 3c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = beeb3ea58c37888ea76697bd602e90655dc516824ddbc0b6aea68626dc4ad4f4, 935ecb9c6d33f603604a9f6b651bb20d1b747df45ca0bb7be13b5d0deba96eec p_scalar = 3e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 782b816e9f5238b55631049161a549b25d485fac31ca379550e1b82c5de1691e, e4efd573a67b8fe35130dd212031f25f5600525dc0d6ad5fec0d468cb9c2fcb0 p_scalar = 4000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 412c9e1e9fa403a4d1b299b504aea4a9047e2ccde180b2dcb618d590b01e6e27, e877ae428aedd469c5e49033199721e6b63afeca0ccd471c772d75c986bf8aad p_scalar = 4200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4b782ecabc2251e29f1ee33c0910e35e65854fd78777a63d723ee82acb8c9fb4, 7c75c30e3e16873bc701019f2cdcfe430a09be2add256acba5f97db2ba0f87a9 p_scalar = 4400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 720d5901fc5cb4c4f2876026ea269465bee5f33e85425bfe3d16740409d9735d, a6506ac46b2b29e9d4cf469b641bf2ab861cffaa6c74643abefca879b25373ee p_scalar = 4600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a4fe196b936adcd72b999e56f814d996687afcc16c6ac81b2bba2fcb7bd03b00, 1ab858cdf2a167e12a228e923f83de2deee27d5ed2654ccf28e9a3d5768260e4 p_scalar = 4800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 47f93e8f0d2f339d2df4486ef3b4e2e0fca35bdae5182b8d7f4b55864f6dcecb, dfc2165d0d72569235d4ba0bb9d4830fc1f81d45e3f65163b8e242d7c1c93b08 p_scalar = 4a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4b5a7b2307c5f1098b5c3d0371c68991750aa51875c77f94fb78df45414657c3, 4cfcadcac4d7da452026db79f61a19bb00a9b7aeae80e414b7db7b79c1804211 p_scalar = 4c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ffab5705044464f22bac283b351571b3b88e7c47d8d42a028b002254c72340d5, 99e919d4637aad57bd1c7b347dbd0cbd1bf10ce5e573735768ff22be52225de0 p_scalar = 4e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5ea74c730418d46d3da600eade1864dfc4ae8bbb8b383d060471cf0dac517b4b, 44220f00df9a7e2ccf6df413ac330d0c8d686b4421917c512d6ca372422f8c60 p_scalar = 5000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a35aa23fbf846bbbd43da670d2f74daed61257ce383c8ce9b1e13752fb85fa4c, af2fa55364392dd2cb280ad5c3b55ea7092071203c9cb8c4a18bdca2bbde037c p_scalar = 5200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4644b8fb9aa64d9150c9f363b5117831ef6feacd1584fb54adb84fb6c1127e87, 5af26a8085d1122b9c217ff8c58b2488408b97ee0b241da38adf348eb20841f8 p_scalar = 5400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 91c3a88a5b6e8c279d0a1f05fd8884e9f1539d9e4c076aa9d334b37c4b8e12cb, bc3bafcacf9e30bf2a1948f78e1f8a26cc7c918cf4672e8646d15e7745855b5e p_scalar = 5600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5e76ec2fd83f56287099228335b50df42b516dd73422c5c118d919e2ba9fa405, dea46d7ba6be19c7e2ac310f86196e7cf11adb5bcd22e983e488640762d3731a p_scalar = 5800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3ff4444fd2ad3a96e5d755618de929cdad07e3c765ba422be4db7c0067eb93d4, c3ee8d0fb564c728a6f5855f810805aeb144b9045aacb347ca2ac1438e0eb1a2 p_scalar = 5a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = abe32380275a9ef53b7cd6098dc0954228abf7b7a9c7d8a5ec69d5a37aed7fc2, d89fbc8f199d31aeb6f74e3ead3671a34ebc16a84166800137db4e055970628a p_scalar = 5c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = deb035fcce7723a22ca3e0a1d449c1004ff211619adcd4bb4fc56a1be50edb52, 1c4fef977971ff17c25e5fd56a4c368f2ea2c4a0e263ca39f956f57e77aa2afa p_scalar = 5e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7c0fd64417a177b5010b2e0df05981da66d63eab9af46f4588f0367ae686a10d, 63376f9703aabb207b7a699c10d37c1ef98f3720ab5cf6479931effba58749aa p_scalar = 6000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 50235a0fdc91927053b2bb803ee35067bc56637b5f29cd078c56e735a64785f4, 777ef9a3a13f07f17fbff45a0f07fa453cb8a7cf7c69fdc4e6e549270d3b559a p_scalar = 6200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2dc1b8bb6885309fb1e70bcfd44571115df7fee1116cd289c547a21465944d7c, 5a4a2100adff0aad0b1626cffb8bb27fd14c2e6c8c275be6c7d820138bd23b08 p_scalar = 6400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f1445d07414974411c75d37565dfd734bddc1fd9d5a52b5d45ab2440e4c3c19f, 5c00cedb1692044fb726342f6f670616f1087a5b4cd9bc23c04be98962ba0ec8 p_scalar = 6600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d1609bf2cd28c8fdc8b4a3a98a9fed30e6959e40b4a07fa19ffe9f1de32e3a6c, 4a1e06b336041e2b2d4cd3ddfcebd74413113e3950b4c34d2fb918dc46cd6c6d p_scalar = 6800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 237c88057388378848d61dc507b6f556b2c6a5f201dbed52cb4f805a3e4e7d6c, 25082afde44cf841146f4bba1a363f26c60154730f6701cf320e4e7c7059f5f4 p_scalar = 6a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 845a882c8859bbc2e883d25ff51993083258a70ad731721eddbead4a788e09c4, 954ce3bf06973608099aa5a1cb8e5a6085b82bb53aeba78c009eb3364ec42bed p_scalar = 6c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4d6eec323a1f89e99267af0a5dee21c6d56850cf6466696a53c474abad6c4e7b, c29df3748076072f982c5b89ddd64ab3382ca3d072639a61a9240aeca8c4f745 p_scalar = 6e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d28527c6a3824aa9d34030745566465654a149071f100d40b1b006aebc0d6863, cf57d4bf75176d98a4ddebee9b71bf2c541a56d92c7ea275315715e982e255d9 p_scalar = 7000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8f12502ee0138997ad364df067b256dfde2d4ad1860b8bfbc370e522cc1b5e83, fcaee231345a245bc07648bb2cf9b45917ffeb533f437995afc05f23887c6df5 p_scalar = 7200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 88a0df625c0cd66e4523b7dcd2c772806d46968e6a3bd9ad34f365ff3405157d, 9a00732bf6369934bc38025aa45bbf707c5afd733125eb17ce0c6f0f3ba6eaf9 p_scalar = 7400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 350fed185a914c72b1ead64104f9670908dcf2b70004539e0f58cec54e27d357, 5533f0f16199265d9d3cf97965bb62aeba074b91b92fb538bb0bcadc3aeb87ab p_scalar = 7600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 721595eece728342af86c88034fb313add3f191127a10139823002854cd4d5e2, 9f3bb1d9601b4aed7b75a48a325f5367443b4ec8af8951b3a9e5b2faf2c09845 p_scalar = 7800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 394c3ca1652f359aa37951abff9f5089563ed687c3db1e5fec79a10fae256721, b104db405fa38d00eccc333d014ba1b9efd39bf1f5b6decf4951b323dac0eb92 p_scalar = 7a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 829bec8ffbbc8adbcaa9b2f496d71f842e0d323fc98fb2ed918ad277a25ed969, 28166c21baffee49802af12b233d24e2a8c06deafafb2e333a4d2abf4f57bf3d p_scalar = 7c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 114608474b9883e7e6183976a85cf4eaabd1eb6c8fbb831a86d4cd28294b04f8, 9793db050d1aa41eb31fda7157078ac5f304939f55b0c15b5ce7a018c3510ab2 p_scalar = 7e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8ccebd9296f0b3dbe251932fabb53deb5f020d8cd37bc364b63fd5141593f8c0, 34cd83e4786564de19a5851fc34f06c6ccca7d68534afe1b92f86f449b6cf24d p_scalar = 8000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9211e489de7f4f8a426eca29484c2ece9c4e7ad63c6341fb197dd46d95a7b1a2, da06d1b7f09f1fe8e8d79591e3c11217d4d3f6f0f9a8ba79eb66809138710e0b p_scalar = 8200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0695d25fcba9327ba26e5822d699d95b7a6c1acdf37b2836203a31d5a56c98ef, f55fe7336f090c5a6bc71eefa6525e79bb7f9f1f194de5bfaa2238beb7bce76c p_scalar = 8400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 95e360666c4165c8b8e2959954327c6554009f1e6d947506e4cf728185967fad, a78389bce264586e1cdde00ce0f1a086afa0f66db6cc5ef2c640cf8b5c4c0ad8 p_scalar = 8600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3805f4e7a74465b996976624e2d6122797e8092e1a7c6add2ab55f653e360df9, 105aaf972949897cf26651a5fccace103ff94fec5dfb12be9eddc215f5ba9146 p_scalar = 8800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c48d07aad919b53f72bfcbbf25a2f91f7112f4122205eb70be6dd7fc6b7733ae, b178c26282cae663c70ad8ebbdd2c625dbafb3ec91013a8ec15b973ed95e096e p_scalar = 8a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ef1117f3334d256570ec0990a1bb0900c512ae94e04e361fbd7055ffbd4132b6, 1e15b34510397d8988360d2718ac678588eebc513fcec4d5ac26b4177d5773ba p_scalar = 8c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b36ddb5a551266fc72a174550b384fab97c8f9d8b94fdd362441c4c0ca8f86c8, 0b2d7199108eb224df89ffabf8f575e0c3cf9430068a4299731758edcbed837e p_scalar = 8e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1f07fd1a9ee01d68891d265bb9f79dc8d31da5b74b957a08455930bfd7425424, 110d6a3ad1118cca57d3f35c423f5902d33663dc2d6f23354ef6ee38a25cfd6e p_scalar = 9000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e0e5daeb54dd3739389f747caf3c3030703ef60057feea5b805c564631890a36, b5e4284906a573c5c8e7c21d50df40d681b40e8a4ac6c69d01db5b3c36360eaa p_scalar = 9200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 11a4ff0222e558e644144f890e8ff816669d7b57254db82633e0f086aef314c5, a545042d61f178f491d6dca4faaa253208a83da7d1abf3f4371acd90dbc10419 p_scalar = 9400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ac45249aec82d6d8a5e1d3c6e19adb253f01996cbb97d0320130abf38cb5ab31, 2534ea7809db05101047eac71457406b02dee39b497e2b7c3d8910d1a3040209 p_scalar = 9600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c738cbcb5a8e43bad9f6002307a003ad81351ce14ffa84fabe1b922b396fae20, 362d21f8ceca0e6d98c801c19d4b94040effb85f9a2e7e824ab9a137362105ac p_scalar = 9800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d723ad15da12d3f14aa86124ac83299759198011fda9f625e8ffb637410eaba3, 17278d3a7fe4d4c66de3860db69fd06752cf7b3712456753aa223ac0d2597ef3 p_scalar = 9a00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5bddf84d01fb6ab7717df9c3adcedc68fbe6587456a7fbaf7cc7479be15036a4, ea6f8714377703386fe4d40636f3d64484810517cdb79e553ccf5c91a3938061 p_scalar = 9c00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0617a8dfe008a218c2700de3e39cfdf9d6b37e5eadb39a5c5e6afed1778930bb, b4c6d7fcab4adb7540d7ecf6657057cbef4004859a01af58c166bbe8140e1951 p_scalar = 9e00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e19854ec7a29e8cf8765ed78b03c224b072454d8cf4f0b1b746bf4ffcd5eb860, 979624d9790fc716f3d40cd5c626d3b0bda675912d9debbbb665e6db551a2f72 p_scalar = a000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6372def79b2bafe8b18e2c1354107588281fc8dd7b87f257a83b969946191d3d, 1c43104f1bd8ff56e1531cd27bcef30bc0d22b49a9e985c0250b44b7f2768d35 p_scalar = a200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9e15ebed69c53ab58cb605eda605ea2cb0766c76159bb5814ecfd1490d4d367e, 08fb59cce0d3f4cdbb12dd157b823412725b82ca3c22662e0a4e921c0fae9c8d p_scalar = a400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3b082784ac9daa213e9231dde959e9257f81bfeceb104d11989cd51d81ffd706, 2c44be725a065ca4718d048d0d7ec18fc2c099c83eb051261d71fd00fd80e5a8 p_scalar = a600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ed37bac889c8cd093feb1494b52fe95b30df23d4bf8ad1baab45ff2f3b264155, e2a656426e8184ad50b24ff6968ed36755ab15a05a14cddc2b33fd0b18751435 p_scalar = a800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3eb44ebaa26cfda9ec294f9bd82e3b0c7adcdc636cfec330698970dcc1c88910, 98fd31bf0dcc0286194c7d00e797bff25b287f337382cb12d0b7736358611efb p_scalar = aa00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6fd044f86e7c58d93fc322e9763408262abc70bfac2a8c9eacd17f62a70bedca, 1cae0c88d5db19418efb64e8b272c588b505a57c634c07e8a7b3b7aa3e85682c p_scalar = ac00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 03e6e884142b953fcf6e45c2f0b7938f042782b6c788822f7caff2a8dd7f4788, 9c03fdba806b71fe0ab7577c2cb83384e1a4bdaec9349485394cd3d08b708043 p_scalar = ae00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 541f1c670f8d83510a4f0dce10075d18a773c212de55a51ab85d636205e61d13, 1829ad5b8f00323d21cd1abe5b8c4a798647cac1d2dfbe09d831cf690f3ed565 p_scalar = b000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 35e8048ee03c366502e23d41dfc6514aa5db5ab62ea604675fe5691ed785e73d, ecbc2e79242f1bf117353391d399b947d713c4bb7b31e5a5c074ee70e5255f07 p_scalar = b200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d8e96623f2e1ed0f96c490c17b199bba4831540870192a511fd78414f227c4a5, 31f45190088c94a0959d925cae1a0b7556e8cf57e1a964129c33b8132181f30c p_scalar = b400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ed1b755f2815d3cf2138d71106187ec35898b1930650dd7ce81907220b4ebbfe, b38056cb82c54a2b55878db37ac9ad4f75837547c5ee97d0abeaa1ebb0c6baeb p_scalar = b600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fb909a74cc54235e35059c6f94d6bfbf9aa5d2c1bd5a35267217348749af1daf, 4f41d2496566b84407ac1340451ccd2ad977c020e4667467ce401a280c7616d6 p_scalar = b800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 12128b2fd412db03d45acfecc1c397c7110ef147732ebbe02e605d97ce76aebb, 2fa8b950c6a53d9bf56d6a2d5f34969d145d8cd34ddc97ecfd810f66d5b2ca1b p_scalar = ba00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = df8df34707ba78f463d2778a91308c54034c07d0eaef09eb0d13b0393524a32e, 3821eeb8c663cfb9e4b155a08cbc34744e80b886a906dbb25524e7609b6fffff p_scalar = bc00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 570f50b9ade5e185d379afd6bbac1e92f1ca3c3639b1290c6b3eda297e866baa, c09d1b8382c7905056e6189930526a456578d62d573e547f7250c29000770668 p_scalar = be00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d9b588174709218a1980177d765796027ca43bcb2bc83e9c14dd8c3678ffb696, 06fb5b1a18c5f5c5a69b595658090885a41347586783743a7d64ff6e983e64c7 p_scalar = c000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b37b515f042eeec8d64cd42d9c875d9a1a1db7e49924182ae5d7f844caaa358c, aa5b7e3e7dc936008211befda6481e8103cdd1271df9100cb2b22bf684e9a041 p_scalar = c200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1e6f624584d42c5a9fd11c23e1b2374586dd7cdb056b372c9a7bfb76f3086c58, f3cb97459a2da20e2e0ea9c7d6a9cf97272ea955866470574f10374f0b856d4d p_scalar = c400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = def3204ff622e0f51e7dfc2f11b5036e56aceaa0609c4809389ca9c3b1d2d491, 614f7f1c3bffc28c1c998443628fa6db155d239948ed5775b1d1056c2d0148ab p_scalar = c600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ac2244a68510d43ed03eb697c84cbed4e8e7b7e5495fac838defc208af8cb7e5, 8b79df4c11cfef71055dcef6f267116bb51baacd8680171b40d2f3fe84d6e175 p_scalar = c800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3b2b115548841c4bac23208fd26485e9f65a3640454ef41ff86d13f9e149e73f, aa798348a58dbf409a1af4fd0275867f69aff1c78d4bb4fa916dd3f9ac1e05ed p_scalar = ca00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fbede0865908334ae1e330f9c70cbc1a87382d6f40abd3c3eb3a10b1e94b9d1f, c22b42c5289663eb0ed8edfc44d2232151eaa4b260ffbcd71baaf4cb2202baeb p_scalar = cc00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = db88c71bbeaf13bc07a69a30ef6276ed02b0c293cb37d658dc2d1be24becfdb6, 87fd26a1b08c632348f9e0cc903001773d1c9232637327282bc7910a368001cc p_scalar = ce00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = af06ff2bd95601e3e6b95f2fdee3d5596a0d1bea32ab6a5c6b768e347d563eb6, 7603685d5acf30d24fbdea479e4585a41f3afe752f76070dd310d38ca0756e4d p_scalar = d000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 956b31e003c45e52a078868ef78edd391571580605d6297b8c885312c23fc975, 74c849cab3eb568bbe6dd84b81d0da67372a23c6f38198c0b8fd8a2a0084cc59 p_scalar = d200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f7ae11128858d4bd081e8fb419b8ae87f8b465db160c6066244bf1db2540eb02, 9dd07003d57bcf5e4b24b13ab51778225936f29a5ea0a1bb6ba5c905ef84e7fd p_scalar = d400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7e8caa24bbb577974f1bfe0fde5e42def5eae8c7f89acdaff3022fb6e646703a, e3ae768db721c229fc366a496dd93702ae1f99512ad40c1bba14638bd3a8f0ba p_scalar = d600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 726cd1b8f826237f899ae92398f41b6f681817c7c9c515ff302c3cfad169508a, 64109964a0a836d6d035e73ea9320e3a07b72bc6853111e9d733a3574aed4a95 p_scalar = d800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2cd615404fa3c57214f08f32b806bbb3c97bf51d0ffac3078f75eab499646d05, b8b3825f7964a7e88808f4049bee10bf7ca6cbabd1c024f607f2af89d56ec49f p_scalar = da00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 44e6235a685fa8c247bd7309a9de5fa66db2fee880a40b64c0b8debf4aa4d144, 0833b86b5c19d8f9ac8db4c9f6f6716b89b462ecf3b0c234caeaa55f50014826 p_scalar = dc00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3027a162030cd7c2ba74f8354822722008faee4e603bb73e4565f9a834ddc625, 10e4eb4cedcbd2a01407f6062c80c8a864711e860cae507bb739381308d35c5c p_scalar = de00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fe35f5c66e9d40a301eee42e3d4f9f3ec28f13ad81f4f013096bb45b738230f3, 1b9004134543f28ccf139d82bf91e4424e7bc18151dc4ebe18d3828cb1fe885e p_scalar = e000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9f40ac3bae92032334e5d0dcb987a24a5e0e8c3e803e25dcd0667ed68b11888c, 810e13d73b8421cbb6e33283259b0e485ed7406e949cd706ab9c216acb1f09c5 p_scalar = e200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b9c9c244af407478c96adb0c950359af1d0243f09da21539499d4934d78d5664, 6560fd45390953fb7ff4c255cf2f156f2692975ce17dd11b2889aa68e4a01d05 p_scalar = e400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bca14b180256394e833badcb026fbed49d4cac5be7b7f4d976fdb4d8d72905a3, 1398508026f62ea2d9661954f8eee0784c145115921e9518f6148aab2d205de8 p_scalar = e600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9e84b1429d952dea1a5702fde822c43a6440a71137d7a6d5b1a124a2e982371a, bf0877e197f6185bcd1a841d08d3644cd46ab8430c47394c065da5918f8107ac p_scalar = e800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5774d975adf3dd428b24580ccbb8bfc2082ec7feeac69a05a84eadc3c6f859bb, 5b07a1a1962220d00bbd4bcea8db09f6f574e02249d4dfa80cfd0e3e04e7aba3 p_scalar = ea00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 18b7629228d8a479ef8c3fc19f7258a24084cd681c0bfed585b4a7b6c5b52828, 51255506bd74f106a8b0b8f89daf1b0ab051b6588354a76c285fe015041903a0 p_scalar = ec00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a9269757ad6c71aecd89a9d614befaa9c670d56c86853eddeff93c2d3edf7a05, 5b0f80312853357e54c02ae48d51af5d92ca94e94ea0bf05c41cec35a788f16f p_scalar = ee00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b5ed7a9125881c7719ff07a13ee17b6081df350185faadc70c267dd0ae0c2b14, 2bf138d8cc37cc1635121ad130f4ecb5563b8196d2387c33ee82cdcf4563b354 p_scalar = f000000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 80f1a439c929319d7a3a6453d4fb689735dc136663621bc1a857240fa36a2737, af283981c8d54f6404f2b6dbe1fe2f104f4ac89a7f873a1403e7d8b40734f45f p_scalar = f200000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 728fc5136ff083f3eb5c80bd85a5f16d33075ddccce277ec4182e4aa4bf75924, dfba71a5f3e366d7f5720029f53f0159e6ac642d3ee6a5135c38717040866d54 p_scalar = f400000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c02fe1c417b27af67e00049f9ab0deefd6ef61aff90e37bb06c9f96c6e75e767, 1c2c0ba15a7720bd2467d68fe7794a246f0c190e252fdcc837d308ff7bf10b23 p_scalar = f600000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a883f42917abdea70042d1b7833a576b51a3fb710ce3673f85d05386724c3c80, a16cf3f68a9ac134de65695046051e46111266374775aca4b4f8174fd0aae8eb p_scalar = f800000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5f2f286449c33aa7ac7d0e1c1fb049783f46e326ce433bc6dfffa17e057a3df0, 1ad279b66e06ba0f5381b3de843a23771499a27b656927e1bf4d171cee8ea2bd p_scalar = fa00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a8b7e8a7068a16707ae69dc317ec34c204b86de7b0a0125589502abd170b0b8e, 4a5475ecc62600458f6c1c98db76571b330fae946156ce910ce3916aed5d4799 p_scalar = fc00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7d6dbe6556c0f8f08208e6ce3c650c05791a0732e423b40f16ff861277c713f8, 370de4a16a5fa3aee627881992f8bf1ac20a45523d2e4204af023d3c732d430e p_scalar = fe00000000000000000000000000000000000000000000000000000000000000 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8ec353c2064ebf7c5df16fb0f8867456296c7b9e57af9e532eabd53494b13f3e, 7b60d0de6a838ea1f4ee86c044fdaf15406838ec9d885f6cc9eae79770a47824 # p_scalar = n - 128 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d1 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, fa38d320ec008188f8aa266d75d6b138b46feaf3367834ffb77a8087c2ff3b6d # p_scalar = n - 127 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d2 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 76759223abe3c14bd0a8879244f403f2fd1c4a970ad602d09ab6968bf6005965 # p_scalar = n - 126 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d3 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 91a4ea6d215215f65f153f56aa36de2d8459f5705276171860ffbe2e70da613f # p_scalar = n - 125 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d4 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, b16d6af8c3febbc151dc5fac145ff0d52292393b579f3ce2128b0d24bf2219f0 # p_scalar = n - 124 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d5 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 8448ecae901289fe9b94c4ad4c99e43958d85051e4dd905a43dfabf3cd768437 # p_scalar = n - 123 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d6 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, aeb9041c69e788c55870726c16e3e02ada04cc898e17ff543f69b4d49b4d4324 # p_scalar = n - 122 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d7 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 7aa3b3ccb2a104b24c6b9954bd51f9056ea945bdb1901d3d001da1b77e9176b3 # p_scalar = n - 121 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d8 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, ae839cd80e99505caaf4d4e193394872ff318484da0a4996a4941a1e76a0ead7 # p_scalar = n - 120 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d9 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, d007ec78a47a715248cd158b2c1eb5419a278a9daaa03497ca76e7549488d036 # p_scalar = n - 119 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324da p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, fedf1014fe6ee703d7e814380f67b51417d29c64877b74978162cf502d653fd9 # p_scalar = n - 118 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324db p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, c9c4d63998e59b626cf96715c527a656741bf80a03bc88e604f357d1f061cede # p_scalar = n - 117 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dc p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, 2cdf7f854480ffe39dc33392fa67285c50cf6d11ad91a35092750de73e51e1bc # p_scalar = n - 116 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dd p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, a9c8a4b42b9157daf06c2c8c70549a5753c30bbe65b80f1686357f9eb412595e # p_scalar = n - 115 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324de p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, e95dd9d8889821b2dc8df855fe2f493756b76c57baa43b27b9dd2bf2d5f5b5bf # p_scalar = n - 114 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324df p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, bc0eec86924dd15496b984140a9f867197b596a14d7bf8475e5ddf821d6cc33e # p_scalar = n - 113 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e0 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 61d8209d49f3a53dd13cca90747f19ecfa6bcdb1786076b9e0d92e9a51933360 # p_scalar = n - 112 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e1 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 65000c24c7973a41e70352687d367d8056feb92ec00eb207db97ab0ef88b8b70 # p_scalar = n - 111 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e2 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, f9af0acd904d4731270adcc57148b1351cc0d4cea23afa674b9c5438a67e2173 # p_scalar = n - 110 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e3 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 798ca99e4ef37e3c270c706c6e4840f15761490f7f000956b9a8fc5f8c0531e8 # p_scalar = n - 109 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e4 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, 5fdaee391cab12c70cd622baeb879899e7229d8956cd660daf419847ebf3df78 # p_scalar = n - 108 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e5 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, 0d66cfc94b5d416d08e545f1b13e2b493633966c70094e6a3a7f4ad5e01ffe00 # p_scalar = n - 107 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e6 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, ccd7e9418ea700c1e008039e02de2ff12754e4260a7f687cb2159e08b76369dc # p_scalar = n - 106 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e7 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, 262f03eb0757aaea5cbb069b03fe8fac137218257bc27ef73c3d861d83aae16f # p_scalar = n - 105 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e8 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, d3d6d111ee9e512f4e346db071cbfc97c87057ca3bce7fe5d5ec7bbbf5327839 # p_scalar = n - 104 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e9 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 6ba92bcade5a0cc175aef88a77b9d084ffccf5e161217dee946ac3bfcff75858 # p_scalar = n - 103 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ea p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, 1429b1f8ae1d3ed8a6fae60930a4f9245df79360286166f300aec19ee8bf7d17 # p_scalar = n - 102 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324eb p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, a2776d9f8417c98ff3d348f820fe78e36445fbcd5bc92aa3ca1ce130a54edfc4 # p_scalar = n - 101 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ec p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 94ce9e0adba8bfc75a8a14644be77793731251826f21687cb5f6f0feadc19a99 # p_scalar = n - 100 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ed p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 63be9e64a17154226aa068c230548cf4adb9e9b685bac6b7a5db852c23fd068f # p_scalar = n - 99 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ee p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, 4a673fe054fcd65a03a3c2c7b98ff4b37ab58a3f75503e4631b57ea284693c04 # p_scalar = n - 98 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ef p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, e9f04cd324c2e3116b5df55fe390da5ba3f98377daa4c864a05a7aa8dd0ce3b4 # p_scalar = n - 97 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f0 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, 1fbd470f53cf3e6984577f1f3260b76785f4d9c45b68b7e72dc7b8e69c70c77c # p_scalar = n - 96 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f1 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, 3f2a78b3241a2b7103b48cc47c29bca2fd2f4f8cfd0258131e208328d87fd1d8 # p_scalar = n - 95 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f2 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, 3f293fda2cd6f439ee1b1cb5344455a165499c990c5dbba0c802049b68aa19e4 # p_scalar = n - 94 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, 1001f8d7dd85aa7bf8ea79eadfa99607c00286d964135771c5825a638719aea8 # p_scalar = n - 93 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f4 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, 435ac466954ffbb3ff6c1a78f9a2852f20b021c3df219dc582290e253d61f6d2 # p_scalar = n - 92 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f5 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, d15428592faab2944a72075d7f73442a9929ad4e8f48bb12d4b127399359250d # p_scalar = n - 91 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f6 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, 4a70abf75c554ed3fa8a5b9b0b46a59f2354719f6237fc68d587138c63c92f69 # p_scalar = n - 90 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f7 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, e485b90d49c0b6a1ad3294fb1c309a59abff56b525d3fdee5376b018e277280a # p_scalar = n - 89 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f8 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 7150f87e7211e4457ab49dd209f98f9a640388f83b9fffefb7b284be14fb691a # p_scalar = n - 88 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f9 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, d8d37d942785971ded5cf82dc911847cbdf176108c7f9dba005a1dffeabd468e # p_scalar = n - 87 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fa p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, af490825d5cff157a8f439ab06e58e3ecd07bc34c235d56c010e522661ddbcb1 # p_scalar = n - 86 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fb p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, e6c93b31cefdb61d9a9f04f0e8aeaf7d4a2b5ed57defe51b559759f6edca6f38 # p_scalar = n - 85 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fc p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, 159751e2e1cbaebebb0066ae1f282369ce91ee270142811b998dfac18f1192b6 # p_scalar = n - 84 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fd p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, 4cb3c135b6f36034df4741a71b99ec5f67f9ba802e45cbb12563c590f683e890 # p_scalar = n - 83 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fe p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 97f0013247b64be50536a39db19c61265e9b16125625aad75c52b051c64e09dd # p_scalar = n - 82 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ff p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, 18f61f3cdef3f99d4976126318fb05ae41a471e4e93046f2ad5cb247cd789d17 # p_scalar = n - 81 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632500 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 7acf4419e85bc145cbdbfdb9cf290d1fa02dbc426fe5b29dfe657f130801937b # p_scalar = n - 80 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632501 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, 2995919ca4cd266052b6a1739220f4281b037d75b320ebfb2429c22a1d49c605 # p_scalar = n - 79 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632502 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, b75df5ec191a421fd07370c450128375097a54ff99227b16c2b1870af8321bb8 # p_scalar = n - 78 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632503 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, f8bdf2ea8474d0c8ea2240ccef96b473407bffa1b201137148b4389c464423d3 # p_scalar = n - 77 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632504 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 854dc9d595105f9e2b4f0c7877eb94ea4788522b2e9fdbb283c3139be0d37321 # p_scalar = n - 76 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632505 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 9b3b040493b83e45ee4826a9937e1ba33fc6e661d47fa3cb19c6602050eaed5f # p_scalar = n - 75 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632506 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, 24a1bde1d0c2302de79807a770456a7e7be19f0ded4437a85072758b78f3d040 # p_scalar = n - 74 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632507 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, 0a48558f2fa1bd2f77c52d75519978d10c45e52db3bfffc85ce885392bb80ef9 # p_scalar = n - 73 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632508 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, c39725521af82878a66d92525e82d5b3b871ba63e405ca09db8dcc81f42911ee # p_scalar = n - 72 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632509 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 6fcd0cbb809a06f20368eb1f2e4283e11ba0cb8c9c5d2e6a33ad53540dc40604 # p_scalar = n - 71 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, 574cc7b29378679111f947e696cd0572030a119fdd4af1ec56cd001e39df3672 # p_scalar = n - 70 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, c6793ad2e6e2f3b19cc6e22a27c9a2ead11ae42dad0182e407e5e8e85bef953a # p_scalar = n - 69 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 6d37b1fa546fbecc2126ac553a8dd1269bea0d0f2655d14f987b0687f4eb5cf6 # p_scalar = n - 68 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, f66904b1400c9463440dec9ece0f8c32bb7047347b57df81baa37f5d08a660c8 # p_scalar = n - 67 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, fd59d7eb9a8f62d9de3ec728c30a96a005af456a06620ae82c735ac12f33af7a # p_scalar = n - 66 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, b12347993e909dfb9c03344b75554fad55912064d0f5bb2aa9231c8ce9e571ca # p_scalar = n - 65 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632510 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 7d096ac42f1747502c90d98cf3e055d633cb7691ba659f4666eb62f1b957b4a1 # p_scalar = n - 64 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632511 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, 296720440e8449708010a4a078424bf88f726bb98faeaf829a3c651280edfe2f # p_scalar = n - 63 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632512 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 90876a0140959b7092bf7c8f91230de0ac98b930824e8197707c04d5383e76ba # p_scalar = n - 62 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632513 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 6b60cfff35ace009dd47ff98814be9ee6472e5ef6806701ee3dc424ebb32e38e # p_scalar = n - 61 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632514 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, 0d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b69 # p_scalar = n - 60 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632515 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, 04820109bbe4e832c40a04bd4f51ad9612c651a022adff2cafa135bbf80e75ca # p_scalar = n - 59 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632516 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, a062499846fb7a8b6651f7017ce477f8778afcd3a837ebeaa084e90c15426704 # p_scalar = n - 58 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632517 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, 063749945667474117ab562dbe5ffb3efa70533e7a6319ad33ed1bc4623fb21b # p_scalar = n - 57 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632518 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, da44c6c600017626c5ab2632c79b7a015748060db661782ab909f2db2aac9e59 # p_scalar = n - 56 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632519 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 83927681026c2c084e9a5bc2a4b596ac01e0db86b1f2214bdfcac25b1f9af32a # p_scalar = n - 55 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, 25e8013ff14cf3f4c2cf6a6880e518caee759f879e27a6b4eab495c5a0182bde # p_scalar = n - 54 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, 1a556e3fea9595eb3df277a41d1936b17ee0c444e76265aac28f70d2e7d6107e # p_scalar = n - 53 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, fba1da5943465283b155bcd2dcafe1973db82f6f522113f280167f41c31cb264 # p_scalar = n - 52 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 7ef2f2269c0f0f8d5c27014b9bbec39e23b92eae22df3562f67a8d295864687c # p_scalar = n - 51 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, d731e383a2f54c2d99a5e23d82681c6261f1511c5e1a5f65370b4ea773241ea3 # p_scalar = n - 50 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, d7d34194c3628c1343b7716bcc143a46efde7ae6a4449c96bf9e80899ae2b710 # p_scalar = n - 49 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632520 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, d394077ef247fa364d78f592f7818ed826147d27f4645b5a837c92285e1109e8 # p_scalar = n - 48 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632521 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 85efc7e941325cc2a875f5ce529d75e30b26d7fbb7d8c5b739f59f66175adff1 # p_scalar = n - 47 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632522 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 9bbff86e6dddfd2704819d515ded93d49b944e107baeca13220755ccd921d60e # p_scalar = n - 46 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632523 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, 033da338c1b7f86557c8b2c055f7835d45431d665ab43f2b42ab62c9c1586e63 # p_scalar = n - 45 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632524 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, d73acbfe2cd9e6b5772ef6dec7f80c81c5254469f72b33a5c747cb96782ba21a # p_scalar = n - 44 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632525 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, eb629f90387ba42a397a247dd69d34170423446c4b083b7fbfa06687730d50da # p_scalar = n - 43 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632526 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, 47795f4f95b2dda09e91cd3ba5e6a3184d82d052eadce5a8ba41b06261a6966c # p_scalar = n - 42 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632527 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, f3a8cfe389bc7d3d4b00b20b906014cf9b359611f32c50aed158667de9ff257a # p_scalar = n - 41 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632528 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, f70bfeec03884a7bc67732591d57d9ceb6f94d2ec87e9a47b6b0daa2a35c628f # p_scalar = n - 40 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632529 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, 03466612d1aa702fab256ea35ef5435974c6e18c36ab1c34d90ba188f2651798 # p_scalar = n - 39 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, 0c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f98 # p_scalar = n - 38 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, d9a4c2809c80c34dbdaa84d68e59319cccaab359bf3804090ec32d3bfe7765e5 # p_scalar = n - 37 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, 58b36143620088a8f63ebce51558462ce7adda3e6f20d850a12b448a7d3cebb6 # p_scalar = n - 36 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, 480b9e11dd6da526450ac0bae251a0c6934e82d3162bfe13e5ebaebd94cda03a # p_scalar = n - 35 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, 2ba901628bb47af824e4ab126b237af7313c300c547852d5653a01908ceb6aa9 # p_scalar = n - 34 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, a159100c570d74f8c77332a33c569426bba2cb1f6f876f92fd7b000b5db6f971 # p_scalar = n - 33 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632530 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, b16c4303c32f63c4f909604f763f15745509d1285847d5ef6ac4832b3a8ec1f1 # p_scalar = n - 32 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632531 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 6231d7929591c2a47b969c1aad9a2e407e449b64480a990809e23e6ddbef42f5 # p_scalar = n - 31 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632532 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, f38ae8914d7b4745faecedfd0c9803fc2d921ca298eb6028d9e9fe814ea53299 # p_scalar = n - 30 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, 460d45ce51601f72d667da379b3aa441b675511e06bf9b4ad5cc8c2f1c040abc # p_scalar = n - 29 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632534 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, 3798142a2a3be21b8a966939777c619f90472447a2fb18a398db66735c208899 # p_scalar = n - 28 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632535 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, a9b4cc5f405852784a688b482d0cb71ea6a7f9c7804b2a681d3d393ed1a83da1 # p_scalar = n - 27 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632536 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, 2d431068d84bde312d97d10878eb4cbb3bd0c66fddb7fb589200b7ba09895e70 # p_scalar = n - 26 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632537 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, ed178030d12e5ac714fde97b5fa944f55a39898b628ac50884cf14e11d248018 # p_scalar = n - 25 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632538 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 7b948dc356f7996812068859c9b731ee96cc631243f439504b8dc9feb4966228 # p_scalar = n - 24 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632539 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, 595dc55eca737b8a7669f03193cb750111ea494988a1e356a551d750b24bcbc7 # p_scalar = n - 23 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 83d0687b9077666f48068e1371ac2f71e5fda49c27299f4a0360a4fb9e4785a9 # p_scalar = n - 22 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 793e8d075d5cd0749de917da153a35b5640c2d6a4d23fea494a787bb35415f04 # p_scalar = n - 21 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, c086d5f1c9477fa37a75023e7fac29a41b0fadc083bb3c61f29dd4b2e286e5b9 # p_scalar = n - 20 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, 5ee104e1c5fee0d09161c53f8aa95e66a2d4ec17ffffcbae82ef1c417884005d # p_scalar = n - 19 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, f720ee256d12597b85665e9be39508c15806244afba977c52d36e9e7dc4c696b # p_scalar = n - 18 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 6c6fc7d90502394d2626927f1b847bba4b2a5caf8f4f0b3c66a2bd725e485a1d # p_scalar = n - 17 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, ebd512263274c3d02f4e247f0d1883bb0575bf30e89cb80e227d314693e79987 # p_scalar = n - 16 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632541 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 64edf7b201efe22055c4623bb1580e9e3670c3194b0b6587f2f11bd652a23f9b # p_scalar = n - 15 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632542 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, 2042170a7079adf464efa6de778a4797d766355442a41b2540b8524f6383c45d # p_scalar = n - 14 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, 152706dc2eaa1bbbe8e4193e2a65e7dbbe29569e832237c227b52db7995d586b # p_scalar = n - 13 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632544 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, fbc08769c9e7b7977cd06422bd1f5bc168748390742ed2e335752b90c00ee17f # p_scalar = n - 12 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632545 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 7ff57c9553238aca28228cfa8ade6d66170ed2f6ca8956370cac12d91cbb5b43 # p_scalar = n - 11 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632546 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 68930023e125b88e0c0daa891ead643d250f939ee57f61c81a7685612b944e88 # p_scalar = n - 10 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632547 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 78719a54eb3b4ab55f7d2d65779be5d2c43a8991383fbe080c2b407880dd9e76 # p_scalar = n - 9 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632548 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, 086659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f3314 # p_scalar = n - 8 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632549 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, 56ec12f27706df76123c7b84be60bbf021e3327dcf9eba15f59da3a9532d4977 # p_scalar = n - 7 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254a p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, eaedd9156e240867ef933bdc77c941956742f2f25da67bdd2847d0303f5b9d4d # p_scalar = n - 6 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, a4c9916d4a07f75ff424d44cef639f11299c2b53adff14b593d36220d377e44b # p_scalar = n - 5 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254c p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 73a076bb2dd1e9163540a9877e7a1f6873c568efe5eb882beb309b4ae7ba4f10 # p_scalar = n - 4 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254d p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 84b14c394c5ab8636b6c36dee5ddd22e17628471fad6f4472d96f24ce4cbaba6 # p_scalar = n - 3 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, d5f06a29e587cc07788208311a2ee98e583e47ad0861fe1ab04c5c1fc983a7eb # p_scalar = n - 2 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 # p_scalar = n - 1 p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a ring-0.16.9/src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt000064400000000000000000000147051352331573000223200ustar0000000000000000 # inf + inf == 2 * inf == inf a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf (n*G) == 2 * inf == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf == 2 * inf == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf + inf (n*G) == 2 * inf == inf a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # G + inf == G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # G + inf (n*G) == G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # inf + G == G a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # inf (n*G) + G == G a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # G + (n-1)*G == inf; note that -G is (n-1)*G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf # (n-1)*G + -(n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a r = inf # -(n-1)*G + (n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf # -(n-1)*G (affine) + (n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf # -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf # -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a r = inf # -G + G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a r = inf # G + -G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 r = inf ring-0.16.9/src/ec/suite_b/ops/p256_point_sum_tests.txt000064400000000000000000000276311352331573000211340ustar0000000000000000 # inf + inf == 2 * inf == inf a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf (n*G) == 2 * inf == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf == 2 * inf == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # inf + inf (n*G) == 2 * inf == inf a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 r = inf # G + inf == G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # G + inf (n*G) == G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # inf + G == G a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # inf (n*G) + G == G a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a # G + G == 2*G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 # (n-1)*G + G == inf; note that -G is (n-1)*G a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = inf # G + (n-1)*G == inf; note that -G is (n-1)*G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = inf # (n-1)*G + (n-1)*G == 2*(n-1)*G a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # (n-1)*G (affine) + (n-1)*G == 2*(n-1)*G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # (n-1)*G + -(n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = inf # -(n-1)*G + (n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = inf # -(n-1)*G (affine) + (n-1)*G == inf a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = inf # -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = inf # -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = inf # (n-1)*G + -G; == -2*G; note that -G == (n-1)*G (affine) a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # -G + (n-1)*G == -2*G; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # (n-1)*G + -G == -2*G; note that -G is (n-1)*G (affine) a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # -G + (n-1)*G == -2*G; note that -G = (n-1)*G a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a # -G + G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = inf # G + -G == inf; note that -G is (n-1)*G (affine) a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 r = inf ring-0.16.9/src/ec/suite_b/ops/p256_scalar_mul_tests.txt000064400000000000000000000070721352416253600212430ustar0000000000000000 a = 00 b = 00 r = 00 a = 00 b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 00 a = 01 b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 9f2f99cbb6fa3e17f80749fbe19f88da020806cb63c12ed5259e01cb6049a8d8 a = 02 b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 3e5f33986df47c2ef00e93f7c33f11b4472912e9206abf25578238d3c4302c5f a = 03 b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = dd8ecd6424eeba46e815ddf3a4de9a8e493119b4842bedfa7d203a9f2479d537 a = 7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8 b = 02 r = 9f2f99cbb6fa3e17f80749fbe19f88da020806cb63c12ed5259e01cb6049a8d8 a = 7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9 b = 02 r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 a = 8000000000000000000000000000000000000000000000000000000000000000 b = 02 r = 01 # From BoringSSL a = 0000000000000000000000000000000000000000000000000000000000000000 b = b4e9b0aea84aa5ed86964a22881a4d0e58f88e9225f30990c18751e7d4b9ec95 r = 0000000000000000000000000000000000000000000000000000000000000000 a = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf b = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323 r = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323 a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 b = abafdc695e4c2c850f8fc60f1efdbf7406a3cd2c6c59bb7e608985723896c187 r = 917b1214c7b31a7ee7e53be0b41a139e435ff576b51ec6af1e1a944412bea38b a = cf0f01b83670a1c79154ea16f3574ca2d4c688a3c3b6017795cbe54854418904 b = c5ec4d3b00fb2e11fb3b1aa09e60f7d187f7c515977d1343dab9745961fcbb43 r = 7aaddcee32e3b340af5ad06f854284cbbce5a1ab919e9b7771c3b0e937093438 a = 50023f9913879ac4020bc45a89a0ea89082db6265b96b851af29969dd8a9661c b = 7c165b1cba80808db114441563aa0fbfba41b9e8acff77312a2dd2138b74ef89 r = 3d2ca1705d8d38cbc76a5409c6535044733cafcb95d12654af1d14de177978b5 a = 4d5341ea735e53d2e4f2934755642adee209bd0e5a1506206513227f3c48b270 b = 6e48f2b60eb8fb86760134abaf3d61692557862924069c599ceb31309ea18704 r = 37cde3e35c814d4287bd345b910d687983929907b7a08afa2acd8596832ea86c a = 33d06c3f5a595a41a6f9c4356f8ab2b8c550d4c64b806eab5560af247c5fa9ed b = 0e52f34adf5754343bcf3529d652620da3c05b5dd9cdcddfb08b674a1ad21a09 r = 9dc64d7b4c1bc33b930e0daee2a24fc41f770378659ee71b846d2239b0fea8ea a = 8f211780cce4f93b7193b9378e6f83e1147fb3602b052eef782de8cc833e54ab b = e1e4f7f1feb15be64292cff86b47cd9730bcb15b133340022b824d591a660cdf r = dfa2b683b1ae23027c7c109e0abb40a1366eda027ad2cad1a09061a57bee391f a = 803c279c7e4c11a5568290c0a5789ceab6860f51a942bf646501a45e1ec0a6bf b = c0a1145a12037129c571f5f939bf16ea0b8b480f08ec774c045d059841f7d5ed r = ab48fa3b4aa692a7c077cc55ee3c3fff895118a23728c2fa5f361b30730d955a a = 0e5c95158297d75dbf0b02c3090730f65bf14704495b14837dd907af569407f1 b = 5a03e3787c8772b2fb7ab07d7fe7fe653a58bdae7fde3174c6ed305e524f5728 r = 71296d305dcf9ce39010ea4f4bbf9f7c1064a413597bdc7574c13dea3fa514dc a = 366299be07886f7846fc74231db624b169360e3c8f60196a1afc9f2101e03922 b = d6d7c830a6edb6861868b964519a6b68f6f24f7c09d66003f3f88eadd1e00158 r = 0b89596bf5054ebe95a39dab6e975b58190160610b09b2a4f93331ecc0e79fd3 a = 8f36f0ef275a72192c3b7388e84df2b8acf66fc53aaf556e3be05c76b3f782c0 b = 704e519363d44e8df8d91f5f347eb61e8d3e85c8fc1b82980c370a379b2bc81c r = b70a392e3ce5e85b5efbbded9b8c16a3068ba9b93b4cbed9a9a71dffaad6b58a a = bf4466ef4dea9f06f0f3b4f14e01140a774262c7e0706584f4d7dac19be46d58 b = 4af12d528b2cef0f6714961bca2ab682f8abaa97600ea8181f71563d56f8a9f5 r = 7b6827c0881b9846e32499e13277efb07917cf4b8c8c72bfb3daa8c1786a8e15 ring-0.16.9/src/ec/suite_b/ops/p256_scalar_square_tests.txt000064400000000000000000000047051352416253600217460ustar0000000000000000 a = 00 r = 00 a = 00 r = 00 a = 01 r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 a = 02 r = 834198ce241707a31fe2d8107981dc972e94d4db6642203a44b5591b7402cc93 a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 a = ffffffff80000000600000002fffffff r = 965f4779ac1ddbac28a14bd1e0c28dcb091d48820b4116d22afbc3f00f90f476 a = ffffffff800000006000000030000000 r = 9e07cb5cdf45939f41541805d2c24625e1cb1719e37a89efc755b5e58e585515 a = 8000000000000000000000000000000000000000000000000000000000000000 r = 4000000000000000000000000000000000000000000000000000000000000000 # From BoringSSL a = 0000000000000000000000000000000000000000000000000000000000000000 r = 0000000000000000000000000000000000000000000000000000000000000000 a = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf r = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 a = da43b8dd7fe8830a4fe8980ec585ccbe903a2965a695cdff398200b74b2ede41 r = 5ec68604412205b380e26ee4e4081eccc10ac7d1417b09cd534f8517b0de81ec a = a82a2b8bdbf8a37dc7cb5799691494a8c9fbf649686a4d250dc30697feb0fa47 r = 552c094a8841621d6cc26b3b54ce5da5664283888445196a6433d3cfdcad3aee a = d785006e250410d9dcc6d7740795a7374c25b00b9c9a37b8285694a07307eacd r = 971aaa9e70ad082cf43725f2e65bc73f4bf762459cee13167545072ec7bdcaf8 a = 69d6d9f5417e87d603a3fb6acafa0d1f974abf94ca57ce58d718a0ad5d02a496 r = eb3284e5799fbe93171f08e6de9f792cd17f036b3a17671b0310e49b48e589b3 a = 1c28f742c3e26e74901d0425f2eb4d5272524668d2405875b32cf6433f212900 r = 74f70a95399b7ad061a2200fa50528d68eee4654341c8158101e1e3f8f16e642 a = 026b2f69f0259d221920b2f358b378a79826f0332ee36afa257765043e3d6732 r = e1e9cfa4724995bb50971ca22f3c028cd31cb51fbef8a37c31f10fd1d468f13b a = 376ed4fadcc1c6c4160a0c9c2ab7c62260367968b08d304d47c65f25625d7d60 r = b9ccb67f377e1278f1d2eeda26e5eed76f32406c9deed9764fc0aa346d91e02b a = 50f66867d0a4ef389678d760d2a4db886583b4c068d0e240f7ddf3472c871304 r = 82c3467bc5f7ca8b45f4ee61546745e2f53755a02e87f65f572418d60e471c8b a = 5b8bd82b37206d2b727f19ad2d02f63773470074dde7d43d2a77c448ddf2f978 r = dbf3c2fc67a0688c3b5ff12cab1739d50b6093c5d98943d388652b1207e4a0f2 a = bed7b3a4dada0e16984eb59ee239005ab212e5b1772cdd5d240c8ee268f65c81 r = 9232aa2759ca9c5efbaefb0cf45cc6bc9c89def8c25e5c169fe623f30787df36 ring-0.16.9/src/ec/suite_b/ops/p384.rs000064400000000000000000000307541353036607100154260ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ elem::{binary_op, binary_op_assign}, elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, }; use core::marker::PhantomData; macro_rules! p384_limbs { [$($limb:expr),+] => { limbs![$($limb),+] }; } pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 384 / LIMB_BITS, q: Modulus { p: p384_limbs![ 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ], rr: p384_limbs![1, 0xfffffffe, 0, 2, 0, 0xfffffffe, 0, 2, 1, 0, 0, 0], }, n: Elem { limbs: p384_limbs![ 0xccc52973, 0xecec196a, 0x48b0a77a, 0x581a0db2, 0xf4372ddf, 0xc7634d81, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ], m: PhantomData, encoding: PhantomData, // Unencoded }, a: Elem { limbs: p384_limbs![ 0xfffffffc, 0x00000003, 0x00000000, 0xfffffffc, 0xfffffffb, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ], m: PhantomData, encoding: PhantomData, // Unreduced }, b: Elem { limbs: p384_limbs![ 0x9d412dcc, 0x08118871, 0x7a4c32ec, 0xf729add8, 0x1920022e, 0x77f2209b, 0x94938ae2, 0xe3374bee, 0x1f022094, 0xb62b21f4, 0x604fbff9, 0xcd08114b ], m: PhantomData, encoding: PhantomData, // Unreduced }, elem_add_impl: GFp_p384_elem_add, elem_mul_mont: GFp_p384_elem_mul_mont, elem_sqr_mont: GFp_p384_elem_sqr_mont, point_add_jacobian_impl: GFp_nistz384_point_add, }; pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { common: &COMMON_OPS, elem_inv_squared: p384_elem_inv_squared, point_mul_base_impl: p384_point_mul_base_impl, point_mul_impl: GFp_nistz384_point_mul, }; fn p384_elem_inv_squared(a: &Elem) -> Elem { // Calculate a**-2 (mod q) == a**(q - 3) (mod q) // // The exponent (q - 3) is: // // 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\ // ffffffff0000000000000000fffffffc #[inline] fn sqr_mul(a: &Elem, squarings: usize, b: &Elem) -> Elem { elem_sqr_mul(&COMMON_OPS, a, squarings, b) } #[inline] fn sqr_mul_acc(a: &mut Elem, squarings: usize, b: &Elem) { elem_sqr_mul_acc(&COMMON_OPS, a, squarings, b) } let b_1 = &a; let b_11 = sqr_mul(b_1, 1, b_1); let b_111 = sqr_mul(&b_11, 1, b_1); let f_11 = sqr_mul(&b_111, 3, &b_111); let fff = sqr_mul(&f_11, 6, &f_11); let fff_111 = sqr_mul(&fff, 3, &b_111); let fffffff_11 = sqr_mul(&fff_111, 15, &fff_111); let fffffffffffffff = sqr_mul(&fffffff_11, 30, &fffffff_11); let ffffffffffffffffffffffffffffff = sqr_mul(&fffffffffffffff, 60, &fffffffffffffff); // ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff let mut acc = sqr_mul( &ffffffffffffffffffffffffffffff, 120, &ffffffffffffffffffffffffffffff, ); // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_111 sqr_mul_acc(&mut acc, 15, &fff_111); // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff sqr_mul_acc(&mut acc, 1 + 30, &fffffff_11); sqr_mul_acc(&mut acc, 2, &b_11); // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff // 0000000000000000fffffff_11 sqr_mul_acc(&mut acc, 64 + 30, &fffffff_11); // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff // 0000000000000000fffffffc COMMON_OPS.elem_square(&mut acc); COMMON_OPS.elem_square(&mut acc); acc } fn p384_point_mul_base_impl(a: &Scalar) -> Point { // XXX: Not efficient. TODO: Precompute multiples of the generator. static P384_GENERATOR: (Elem, Elem) = ( Elem { limbs: p384_limbs![ 0x49c0b528, 0x3dd07566, 0xa0d6ce38, 0x20e378e2, 0x541b4d6e, 0x879c3afc, 0x59a30eff, 0x64548684, 0x614ede2b, 0x812ff723, 0x299e1513, 0x4d3aadc2 ], m: PhantomData, encoding: PhantomData, }, Elem { limbs: p384_limbs![ 0x4b03a4fe, 0x23043dad, 0x7bb4a9ac, 0xa1bfa8bf, 0x2e83b050, 0x8bade756, 0x68f4ffd9, 0xc6c35219, 0x3969a840, 0xdd800226, 0x5a15c5e9, 0x2b78abc2 ], m: PhantomData, encoding: PhantomData, }, ); PRIVATE_KEY_OPS.point_mul(a, &P384_GENERATOR) } pub static PUBLIC_KEY_OPS: PublicKeyOps = PublicKeyOps { common: &COMMON_OPS, }; pub static SCALAR_OPS: ScalarOps = ScalarOps { common: &COMMON_OPS, scalar_inv_to_mont_impl: p384_scalar_inv_to_mont, scalar_mul_mont: GFp_p384_scalar_mul_mont, }; pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { scalar_ops: &SCALAR_OPS, public_key_ops: &PUBLIC_KEY_OPS, private_key_ops: &PRIVATE_KEY_OPS, q_minus_n: Elem { limbs: p384_limbs![ 0x333ad68c, 0x1313e696, 0xb74f5885, 0xa7e5f24c, 0x0bc8d21f, 0x389cb27e, 0, 0, 0, 0, 0, 0 ], m: PhantomData, encoding: PhantomData, // Unencoded }, }; pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { scalar_ops: &SCALAR_OPS, oneRR_mod_n: Scalar { limbs: N_RR_LIMBS, m: PhantomData, encoding: PhantomData, // R }, }; fn p384_scalar_inv_to_mont(a: &Scalar) -> Scalar { // Calculate the modular inverse of scalar |a| using Fermat's Little // Theorem: // // a**-1 (mod n) == a**(n - 2) (mod n) // // The exponent (n - 2) is: // // 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf\ // 581a0db248b0a77aecec196accc52971. fn mul(a: &Scalar, b: &Scalar) -> Scalar { binary_op(GFp_p384_scalar_mul_mont, a, b) } fn sqr(a: &Scalar) -> Scalar { binary_op(GFp_p384_scalar_mul_mont, a, a) } fn sqr_mut(a: &mut Scalar) { unary_op_from_binary_op_assign(GFp_p384_scalar_mul_mont, a); } // Returns (`a` squared `squarings` times) * `b`. fn sqr_mul(a: &Scalar, squarings: usize, b: &Scalar) -> Scalar { debug_assert!(squarings >= 1); let mut tmp = sqr(a); for _ in 1..squarings { sqr_mut(&mut tmp); } mul(&tmp, b) } // Sets `acc` = (`acc` squared `squarings` times) * `b`. fn sqr_mul_acc(acc: &mut Scalar, squarings: usize, b: &Scalar) { debug_assert!(squarings >= 1); for _ in 0..squarings { sqr_mut(acc); } binary_op_assign(GFp_p384_scalar_mul_mont, acc, b) } fn to_mont(a: &Scalar) -> Scalar { static N_RR: Scalar = Scalar { limbs: N_RR_LIMBS, m: PhantomData, encoding: PhantomData, }; binary_op(GFp_p384_scalar_mul_mont, a, &N_RR) } // Indexes into `d`. const B_1: usize = 0; const B_11: usize = 1; const B_101: usize = 2; const B_111: usize = 3; const B_1001: usize = 4; const B_1011: usize = 5; const B_1101: usize = 6; const B_1111: usize = 7; const DIGIT_COUNT: usize = 8; let mut d = [Scalar::zero(); DIGIT_COUNT]; d[B_1] = to_mont(a); let b_10 = sqr(&d[B_1]); for i in B_11..DIGIT_COUNT { d[i] = mul(&d[i - 1], &b_10); } let ff = sqr_mul(&d[B_1111], 0 + 4, &d[B_1111]); let ffff = sqr_mul(&ff, 0 + 8, &ff); let ffffffff = sqr_mul(&ffff, 0 + 16, &ffff); let ffffffffffffffff = sqr_mul(&ffffffff, 0 + 32, &ffffffff); let ffffffffffffffffffffffff = sqr_mul(&ffffffffffffffff, 0 + 32, &ffffffff); // ffffffffffffffffffffffffffffffffffffffffffffffff let mut acc = sqr_mul(&ffffffffffffffffffffffff, 0 + 96, &ffffffffffffffffffffffff); // The rest of the exponent, in binary, is: // // 1100011101100011010011011000000111110100001101110010110111011111 // 0101100000011010000011011011001001001000101100001010011101111010 // 1110110011101100000110010110101011001100110001010010100101110001 static REMAINING_WINDOWS: [(u8, u8); 39] = [ (2, B_11 as u8), (3 + 3, B_111 as u8), (1 + 2, B_11 as u8), (3 + 2, B_11 as u8), (1 + 4, B_1001 as u8), (4, B_1011 as u8), (6 + 4, B_1111 as u8), (3, B_101 as u8), (4 + 1, B_1 as u8), (4, B_1011 as u8), (4, B_1001 as u8), (1 + 4, B_1101 as u8), (4, B_1101 as u8), (4, B_1111 as u8), (1 + 4, B_1011 as u8), (6 + 4, B_1101 as u8), (5 + 4, B_1101 as u8), (4, B_1011 as u8), (2 + 4, B_1001 as u8), (2 + 1, B_1 as u8), (3 + 4, B_1011 as u8), (4 + 3, B_101 as u8), (2 + 3, B_111 as u8), (1 + 4, B_1111 as u8), (1 + 4, B_1011 as u8), (4, B_1011 as u8), (2 + 3, B_111 as u8), (1 + 2, B_11 as u8), (5 + 2, B_11 as u8), (2 + 4, B_1011 as u8), (1 + 3, B_101 as u8), (1 + 2, B_11 as u8), (2 + 2, B_11 as u8), (2 + 2, B_11 as u8), (3 + 3, B_101 as u8), (2 + 3, B_101 as u8), (2 + 3, B_101 as u8), (2, B_11 as u8), (3 + 1, B_1 as u8), ]; for &(squarings, digit) in &REMAINING_WINDOWS[..] { sqr_mul_acc(&mut acc, usize::from(squarings), &d[usize::from(digit)]); } acc } unsafe extern "C" fn GFp_p384_elem_sqr_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] ) { // XXX: Inefficient. TODO: Make a dedicated squaring routine. GFp_p384_elem_mul_mont(r, a, a); } const N_RR_LIMBS: [Limb; MAX_LIMBS] = p384_limbs![ 0x19b409a9, 0x2d319b24, 0xdf1aa419, 0xff3d81e5, 0xfcb82947, 0xbc3e483a, 0x4aab1cc5, 0xd40d4917, 0x28266895, 0x3fb05b7a, 0x2b39bf21, 0x0c84ee01 ]; extern "C" { fn GFp_p384_elem_add( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_p384_elem_mul_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_nistz384_point_add( r: *mut Limb, // [3][COMMON_OPS.num_limbs] a: *const Limb, // [3][COMMON_OPS.num_limbs] b: *const Limb, // [3][COMMON_OPS.num_limbs] ); fn GFp_nistz384_point_mul( r: *mut Limb, // [3][COMMON_OPS.num_limbs] p_scalar: *const Limb, // [COMMON_OPS.num_limbs] p_x: *const Limb, // [COMMON_OPS.num_limbs] p_y: *const Limb, // [COMMON_OPS.num_limbs] ); fn GFp_p384_scalar_mul_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] a: *const Limb, // [COMMON_OPS.num_limbs] b: *const Limb, // [COMMON_OPS.num_limbs] ); } #[cfg(feature = "internal_benches")] mod internal_benches { use super::{super::internal_benches::*, *}; bench_curve!(&[ Scalar { limbs: LIMBS_1, encoding: PhantomData, m: PhantomData }, Scalar { limbs: LIMBS_ALTERNATING_10, encoding: PhantomData, m: PhantomData }, Scalar { // n - 1 limbs: p384_limbs![ 0xccc52973 - 1, 0xecec196a, 0x48b0a77a, 0x581a0db2, 0xf4372ddf, 0xc7634d81, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ], encoding: PhantomData, m: PhantomData, }, ]); } ring-0.16.9/src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt000064400000000000000000000020631352331573000216100ustar0000000000000000 a = 00 r = 00 a = 00 r = 00 a = 01 r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 a = 02 r = 01 a = 03 r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000001 a = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff r = bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffff4000000000000000bfffffff a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 r = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ring-0.16.9/src/ec/suite_b/ops/p384_elem_mul_tests.txt000064400000000000000000000024221352331573000207070ustar0000000000000000 a = 00 b = 00 r = 00 a = 00 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = 00 a = 01 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = ffffffebffffffebfffffff3fffffffd0000000300000005000000040000000100000013000000270000001ffffffff9 a = 02 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = ffffffd7ffffffd7ffffffe7fffffffa000000060000000a0000000800000003000000270000004e0000003efffffff3 a = 03 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = ffffffc3ffffffc3ffffffdbfffffff7000000090000000f0000000c000000050000003b000000750000005dffffffed a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff b = 02 r = ffffffebffffffebfffffff3fffffffd0000000300000005000000040000000100000013000000270000001ffffffff9 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 b = 02 r = 14000000140000000c00000002fffffffcfffffffafffffffbfffffffdffffffebffffffd8ffffffe100000006 a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 02 r = 01 ring-0.16.9/src/ec/suite_b/ops/p384_elem_neg_tests.txt000064400000000000000000000020441352331573000206630ustar0000000000000000 a = 00 b = 00 a = 01 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe a = 02 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd a = 03 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc a = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe b = 01 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff ring-0.16.9/src/ec/suite_b/ops/p384_elem_sum_tests.txt000064400000000000000000001327711352331573000207310ustar0000000000000000# Montgomery Arithmetic; values are in the range [0, q). a = 00 b = 00 r = 00 a = 00 b = 01 r = 01 a = 00 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe a = 01 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = 00 a = 02 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = 01 a = 03 b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe r = 02 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 r = 00 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 r = 01 a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0100000000ffffffffffffffff00000001 a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0100000000ffffffffffffffff00000001 a = 8000000000000000000000000000000000000000000000000000000000000000800000007fffffffffffffff80000001 b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff r = 0100000000ffffffffffffffff00000001 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0100000000ffffffffffffffff00000000 a = 8000000000000000000000000000000000000000000000000000000000000000800000007fffffffffffffff80000000 b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff r = 0100000000ffffffffffffffff00000000 # Carry Propagation. a = ff b = 01 r = 0100 a = 01ff b = 01 r = 0200 a = 03ff b = 01 r = 0400 a = 07ff b = 01 r = 0800 a = 0fff b = 01 r = 1000 a = 1fff b = 01 r = 2000 a = 3fff b = 01 r = 4000 a = 7fff b = 01 r = 8000 a = ffff b = 01 r = 010000 a = 01ffff b = 01 r = 020000 a = 03ffff b = 01 r = 040000 a = 07ffff b = 01 r = 080000 a = 0fffff b = 01 r = 100000 a = 1fffff b = 01 r = 200000 a = 3fffff b = 01 r = 400000 a = 7fffff b = 01 r = 800000 a = ffffff b = 01 r = 01000000 a = 01ffffff b = 01 r = 02000000 a = 03ffffff b = 01 r = 04000000 a = 07ffffff b = 01 r = 08000000 a = 0fffffff b = 01 r = 10000000 a = 1fffffff b = 01 r = 20000000 a = 3fffffff b = 01 r = 40000000 a = 7fffffff b = 01 r = 80000000 a = ffffffff b = 01 r = 0100000000 a = 01ffffffff b = 01 r = 0200000000 a = 03ffffffff b = 01 r = 0400000000 a = 07ffffffff b = 01 r = 0800000000 a = 0fffffffff b = 01 r = 1000000000 a = 1fffffffff b = 01 r = 2000000000 a = 3fffffffff b = 01 r = 4000000000 a = 7fffffffff b = 01 r = 8000000000 a = ffffffffff b = 01 r = 010000000000 a = 01ffffffffff b = 01 r = 020000000000 a = 03ffffffffff b = 01 r = 040000000000 a = 07ffffffffff b = 01 r = 080000000000 a = 0fffffffffff b = 01 r = 100000000000 a = 1fffffffffff b = 01 r = 200000000000 a = 3fffffffffff b = 01 r = 400000000000 a = 7fffffffffff b = 01 r = 800000000000 a = ffffffffffff b = 01 r = 01000000000000 a = 01ffffffffffff b = 01 r = 02000000000000 a = 03ffffffffffff b = 01 r = 04000000000000 a = 07ffffffffffff b = 01 r = 08000000000000 a = 0fffffffffffff b = 01 r = 10000000000000 a = 1fffffffffffff b = 01 r = 20000000000000 a = 3fffffffffffff b = 01 r = 40000000000000 a = 7fffffffffffff b = 01 r = 80000000000000 a = ffffffffffffff b = 01 r = 0100000000000000 a = 01ffffffffffffff b = 01 r = 0200000000000000 a = 03ffffffffffffff b = 01 r = 0400000000000000 a = 07ffffffffffffff b = 01 r = 0800000000000000 a = 0fffffffffffffff b = 01 r = 1000000000000000 a = 1fffffffffffffff b = 01 r = 2000000000000000 a = 3fffffffffffffff b = 01 r = 4000000000000000 a = 7fffffffffffffff b = 01 r = 8000000000000000 a = ffffffffffffffff b = 01 r = 010000000000000000 a = 01ffffffffffffffff b = 01 r = 020000000000000000 a = 03ffffffffffffffff b = 01 r = 040000000000000000 a = 07ffffffffffffffff b = 01 r = 080000000000000000 a = 0fffffffffffffffff b = 01 r = 100000000000000000 a = 1fffffffffffffffff b = 01 r = 200000000000000000 a = 3fffffffffffffffff b = 01 r = 400000000000000000 a = 7fffffffffffffffff b = 01 r = 800000000000000000 a = ffffffffffffffffff b = 01 r = 01000000000000000000 a = 01ffffffffffffffffff b = 01 r = 02000000000000000000 a = 03ffffffffffffffffff b = 01 r = 04000000000000000000 a = 07ffffffffffffffffff b = 01 r = 08000000000000000000 a = 0fffffffffffffffffff b = 01 r = 10000000000000000000 a = 1fffffffffffffffffff b = 01 r = 20000000000000000000 a = 3fffffffffffffffffff b = 01 r = 40000000000000000000 a = 7fffffffffffffffffff b = 01 r = 80000000000000000000 a = ffffffffffffffffffff b = 01 r = 0100000000000000000000 a = 01ffffffffffffffffffff b = 01 r = 0200000000000000000000 a = 03ffffffffffffffffffff b = 01 r = 0400000000000000000000 a = 07ffffffffffffffffffff b = 01 r = 0800000000000000000000 a = 0fffffffffffffffffffff b = 01 r = 1000000000000000000000 a = 1fffffffffffffffffffff b = 01 r = 2000000000000000000000 a = 3fffffffffffffffffffff b = 01 r = 4000000000000000000000 a = 7fffffffffffffffffffff b = 01 r = 8000000000000000000000 a = ffffffffffffffffffffff b = 01 r = 010000000000000000000000 a = 01ffffffffffffffffffffff b = 01 r = 020000000000000000000000 a = 03ffffffffffffffffffffff b = 01 r = 040000000000000000000000 a = 07ffffffffffffffffffffff b = 01 r = 080000000000000000000000 a = 0fffffffffffffffffffffff b = 01 r = 100000000000000000000000 a = 1fffffffffffffffffffffff b = 01 r = 200000000000000000000000 a = 3fffffffffffffffffffffff b = 01 r = 400000000000000000000000 a = 7fffffffffffffffffffffff b = 01 r = 800000000000000000000000 a = ffffffffffffffffffffffff b = 01 r = 01000000000000000000000000 a = 01ffffffffffffffffffffffff b = 01 r = 02000000000000000000000000 a = 03ffffffffffffffffffffffff b = 01 r = 04000000000000000000000000 a = 07ffffffffffffffffffffffff b = 01 r = 08000000000000000000000000 a = 0fffffffffffffffffffffffff b = 01 r = 10000000000000000000000000 a = 1fffffffffffffffffffffffff b = 01 r = 20000000000000000000000000 a = 3fffffffffffffffffffffffff b = 01 r = 40000000000000000000000000 a = 7fffffffffffffffffffffffff b = 01 r = 80000000000000000000000000 a = ffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000 a = 01ffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000 a = 03ffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000 a = 07ffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000 a = 0fffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000 a = 1fffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000 a = 3fffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000 a = 7fffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000 a = ffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000 a = 01ffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000 a = 03ffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000 a = 07ffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000 a = 0fffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000 a = 1fffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000 a = 3fffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000 a = 7fffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000 a = ffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000 a = ffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b = 01 r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ring-0.16.9/src/ec/suite_b/ops/p384_point_double_tests.txt000064400000000000000000000036561352331573000216050ustar0000000000000000 # G doubled once. a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda # Point at infinity doubled. This uses the (0, 0, 0) representation of # the point at infinity instead of the classic (1, 1, 0) # representation. a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # Point at infinity doubled. This form is the result of multiplying # n * G (affine), which is more interesting than the above case # because only the Z coordinate is zero. a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # (n - 1) * G doubled. a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 ring-0.16.9/src/ec/suite_b/ops/p384_point_mul_base_tests.txt000064400000000000000000003237671352331573000221320ustar0000000000000000 g_scalar = 00 r = inf g_scalar = 01 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe g_scalar = 02 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda g_scalar = 03 r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, 465465fc983292aff6db68b15102b33968012d5ad2e1d0b4132663c04ef6744692d789a77ae0e36d7e284821c04ee157 g_scalar = 04 r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, 50946875303df319e607b9e33820017d147162d30418c6938e3e61a34c542ad1e74bb7f17bfec97e54f3e8e79b3a03b2 g_scalar = 05 r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, 4db1c9d6e209e4a3e6c5944024de236d4b237faf982c041180b61b3101c35b9922c16e2e72f345662b694ba07073fa21 g_scalar = 06 r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, c9962152af2a9eba586d8ededf21559a93c9e5f61b546f058bd4bffcb79e33b0739ac69d5b3d4dce3f62b16ea7b08203 g_scalar = 07 r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, d90a16b6af6c9b3ef57f238e693b07060ff37c0401fff78065aad76f50130844135349d5a8641c790996b2207706a61e g_scalar = 08 r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, 3c0c6dd70d27ef617008d943c48ecf0ee9923263a42dbba2701754bf7d8686e4836dbb36b7e55e870d2cfe83e6655a44 g_scalar = 09 r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, e770633431e8f5c67d9429f4ee69a754a6ecaccc68ead0d827f061c7033ca7c23777e270d742aa2ff2813072b18ec0b0 g_scalar = 0a r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 6eb995bec80174e83e03370a47a9b8aa81961b8ccfd7fd1d592ac0ba794eabfd03a530eb13b9e85cbb971f78e67b5fce g_scalar = 0b r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 9aa62f9f3533f91841821d0c3a53287a2e070f36fe9e682e3ce813298a77e780604fe46bac144b83764eb146bdc4ba25 g_scalar = 0c r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, 0c6e430ef9c4af3d0329eab1f7942f0e40c64a4e66bed5af8c79848fd0e102ac80d60af627aa651afacc45e48be55ed8 g_scalar = 0d r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, 4617adb7cc6979e181fdbd1c3b490ec3b7feac2dfec38d60789a2a48cf4d0fe3d8e88f1a87cae0c2f4d394596c3d812d g_scalar = 0e r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, 4429839ddefbadf5647d24db13690a7472445345d9c3b6911ecc8585e11dbbbf540b8b82730a99d1be4b4a9003cb68e5 g_scalar = 0f r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, 5a68c6fed0bc27168733fc41400c5797dddc2866d898f4704b23d3a0de06610c61609cbd144bd5862309cc9d6fe989bb g_scalar = 10 r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 659db48181ef251351c305c6a72d1967b333bdfbc88ee148914871dc154d410feb07ddea230cf00d9b21615fefabca26 g_scalar = 11 r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, ac37986f55b164c925eb5df1b3c2677af87d6d854a54504a49ce6993336bf1834e23b6ffd5b9c0da3fcc69cd6c12f055 g_scalar = 12 r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 91700b247eb1be639bdd6a092945a7576ffcfc7ca4cfd9bbc266eb844112985854b867b7f78aa7de8a60717f75c64513 g_scalar = 13 r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, a1d47b23e957776415d1dc778264b6723f5a799bb67f30c39170b3786ff2f643a8c72d3cc3da2eac46b78e5db0dc21d0 g_scalar = 14 r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, ab9dd81052ebfb015e01b72b4718bbc7422da643ffe6132b9933fb25dccd4df325f546ab321828ffe27a189460d4db60 g_scalar = 15 r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, 21824f411353ccba266ad15aacea5817b454111e8527cd59262ebb498a149098aa740a9e38f17bea8014214b008c5de7 g_scalar = 16 r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 671d69c98fcd841850fc847215809cddc764edf840d0fcf77b1ab489cbf837b7f9d62fd9c9576c694d1c3049faa71fdc g_scalar = 17 r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 9dfccb0de2212559282d2437566718c1f0138950eaf22c7e7ad8a132a527cebe0bcca3f0a65e48137fc33a6bec52abad g_scalar = 18 r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, 150808e625a302c91395a87966a4e904e8277439a0f9ad3adf5579fa4bea82dd98d82ad1da247ec8890932d7bd3d10c3 g_scalar = 19 r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, 1fe6fb42e97809dcda3e1a3d4cebc96ed6a2f51dea8e434401628f059424a3cc83ccbc4e9009e3919944fd2e61124f05 g_scalar = 1a r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, 47d98a9df092241cbf2c0862697c08fd5d512df99d42a72725c7b9146f5f24c7db3f422d95e16d6eedda4ae48a8f5dcb g_scalar = 1b r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, 17820a0bc5134ed767e67195d44d3cdf7d26540638c85a85d779adfe31da1bea58a6d7f569e2f8f442aad1d61b68e9f8 g_scalar = 1c r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, 05cdca3fe7988176792377fbf8eb8319c48ee6f3b033c112184bd4733ad6983a9ff769c4875fee0ff1bc89b628e77f9e g_scalar = 1d r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, 1d2a1c015977f16cf6f57e7190c820338e6db10b404505fbab178d26cce851b3293c164920c83de21a5284a0865dded3 g_scalar = 1e r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 941292e500f88cb2f569446a2755569296c21b29f6a167f23117dd04d47a41dc1846eefcdd3eb156dc6c5d1dc12748a1 g_scalar = 1f r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, 475a3e756398a19d5b3d0d6d36beecc4d7dd464f045a7a1c402a9bab42eb20ddbc0a699b374c4b08dab83288127fc1da g_scalar = 20 r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, c510ad93aabca99f73b42725b35b4ff04bcb06f00a2377b677315f9e9448fd08a372dfc2f2a52bfd1148bc72687c20bb g_scalar = 21 r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, a7fd2b619057dad76fcc93a1b8c310728a416eb9bb6f0aba08467cea48b90b9113bf6124c209e55e7fd73e8e3a625e76 g_scalar = 22 r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, a964eefbfdadd24e03c050a06152072602d00cfb8a76b2d69e1418a4554557c3470ddc68f8a57f48ebcbda0786da3943 g_scalar = 23 r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, b13a8ad830e23f26ac8a877f52ccd35c22f19fab28f35eee50018998988092a20ce18088a55e0956feb026e93deeb52a g_scalar = 24 r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, f699887b806085b7df33eed7b73401b16a3258ec33f5567510209418c167fd201d11bc5ed6e28138597edf370fb077bc g_scalar = 25 r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, fa0e07b7fe85bf85284fcbb5638ca337b50649a894047d1f2ea912435d2ca0342f1643d514594bee6c91c0c98be5589e g_scalar = 26 r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, 1f466694520618f2129be314974320a4f300e1c648347f9adae2479844956b9387c183c3e1a0e06c91af26eaabc13488 g_scalar = 27 r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, 2d7bc128074968fb1a95355f1cd60340b646e453436d9fe2345c553ab53153b87b2b0ab3e82947474c0638476a71ae7a g_scalar = 28 r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, dfd92b6da914bb01dbb22c9ddeb46e6c63a00a0a60e0aa2a98ff87f7370eb7441df8cc84a69ea3a354b9cd8db593d816 g_scalar = 29 r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 82ea702eeb18f1c5679952c7d193272ebdc9d6c34f9f589a57860ce121646f315ac762e00f3c9d6ea2fe2c4782eb23e2 g_scalar = 2a r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, db6829c2f002bb6e50029568472a7175e739fb61eaa6776325d0caaeda1eadf40d959ba9796d9129863a23a3a553e8e3 g_scalar = 2b r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 8f3f1f63c9632b78a974b09415cbf948aaf8e0f6bd0628dfbce78aa9ede314bb1b7ee42d749e5498cf79fc1b36baf1a7 g_scalar = 2c r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, 5fb28e322a1dd73bade6096d02e543ae47678afb27dda8e5c680176505c7ad6c7cc82a4df1698fb2c3336331bbad8346 g_scalar = 2d r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, 42eb2979db83a48517477722bd2af19e16f96676b7234e93eb3b44a9e5b5691862b2f54351fcca3f8f8878d76eeed85d g_scalar = 2e r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, fc539eb3e259c7dbc82d5998ec090d0619ab802314eb4ab9d7a198a4185a849ca1590c30ecf5864360efb1147fdc2d7a g_scalar = 2f r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, ac9dfec7dfa72a8beef006912e20fc23dfeea1a265e0fc91f86562a898fb34ff9c701758249cf9b7487ae8bd22437ed1 g_scalar = 30 r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, 271e42a12624a58348eab00eb5c9462c2605ca009da2a2ca5c3ca10d04bab9854580609da766ddf13d30625e5ffef312 g_scalar = 31 r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, 2d1cc518e28b2bdb771e64415b57be2f2487edd57f82bdd3fc4486ee49c9ebe88d6c174ed2497d483113c74313b25712 g_scalar = 32 r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 6f58fa8b7181c2a16f7bfa7e13a4f7d6c1b444139333e4056124642f0f32b151df7dc7053048461a83a9f17e308c4545 g_scalar = 33 r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, 518b047dcbaa0d97c69489e2373f1a0d0b2240003c887d36daeac0c3570543f0324d067e7359dd35adc18bf9b16ec84f g_scalar = 34 r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, c5cc339dcba1fd4b222465866e5ede7690e2aead7f78aaf86d0a166ced3c3b7a0a8930fc1208b9faa9e5af3ccae07f15 g_scalar = 35 r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, edf2e3eb7ecc9485adc93d9a481765e2d2c71ad1390699635786a19a4e2fa83eebec6442089efa8b2a2054b495618501 g_scalar = 36 r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, 420eb673906a29496e9e86bb7b1eb77a1ae1dd97d13444bb0bf879d693b44ea68dbb571c77fcd1f4340a767034adeda3 g_scalar = 37 r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 7460257314ceeed46a91e73997d0fa0617c6b5cbbe2334f88de3107c3d079f6182af23aa180a63a74ebdee7d281f7884 g_scalar = 38 r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, 31ff648e0f88b82d56fefff326f349ce05826192490bb572b623a1aeeb8cc21c28179e6cc852f64bd141235c553fb41d g_scalar = 39 r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, 0a823b9a4b26df63d2e130552952c1fc8f427bc473c81d5b0d60bab7e809a13c7788c258a1737b65a101a483ab74b05d g_scalar = 3a r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, 2b51995f794da901c08595e35548fbeae11699e909fa58a1b5f157aa569b57d8b8b4ac9ffa80380a9f3f7baa1929e675 g_scalar = 3b r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, ff336f12504655c196d9ba0bd9e3ca196fb34b3028463cceaccf2edd7b05970341bdb741b335eff0df0c2aae3a522fbe g_scalar = 3c r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 8dd21bf0b4ea4f5129fc3b284892e676bb45a51f948a8375acd70b86ad2a20fcf0e0f4f7e682aa2909f92adc16eb7b95 g_scalar = 3d r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, c4cc11451fc69829b0a6c77201466d230dda19ffe5275767e6a7885370d303eb394d32cd6ae9f4ac6640f1177d381266 g_scalar = 3e r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, 0902cc23149446b8cac324ec82c4faa73d2508922ba9239b65609e59d9ff0aba5f5e9b1fd630c145af623d3f21da4d42 g_scalar = 3f r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, 52bb3712a0a689e8f5af7b8e3735df22dc89bd4997d4048d3bb034e888d17f198d3a5f621ecd7b1a3bb6c1f518202c80 g_scalar = 40 r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 888b708b9404ca513ee127895ecd3fe86d97cabc301fe259fe51bbbf1090fede0fd1c52df091bc01b213c6a030a9325b g_scalar = 41 r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, ea6f2528a55bb1c9a2866c24c8f9f08719763d6d889d66ddab784b2cde2bc266b6a487833ad995d30e16d83d30fc79f9 g_scalar = 42 r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, b287be9507f55d0492b480eed70d6c3a6fd331a3b0d5aea54ed3fd192a684508a580d040c2c889076cf203a6209b336d g_scalar = 43 r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 8322cb8aac794994096a6bf01362c5f95990b746c6ebc0031a7e35ed3f59e4bc104ab1a642785d0652763b7b0a109ed1 g_scalar = 44 r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, d467b0e82fc4663ed9c5d61f09f68f4c29b049577e0fca014277e8927030cc9a59a9e6886b1e723fc02ed662797cc7d4 g_scalar = 45 r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, fbcd0100271dbd7a6f2c9e8b73167a320aceee4882ed66bcd13ae4892bd423a457769d6245d3994d035ade287c0c55ce g_scalar = 46 r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, 443df50ac7469f4a5c599917d3a76debc4077657cfcdb6b7cc8ad6658c725a7ce2a2b0996761e5389f0415bd9bff2a34 g_scalar = 47 r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, f9a7ea28732ad01cbdb924ee071395662144daf1ce64373a154f285025b3e31986793c4d0801523d6a44d084ddec83c6 g_scalar = 48 r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, 312c1d2f36824d3ab010acdc097afa217854f8bcc3f0ad3ac7b43619ab96774699cd9dc9d77437097555cc79e7693b1e g_scalar = 49 r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 6f65af3b7c98a1620b15740387b8637304e21e0392265a59af9fc87b4f1d216e9f89b6d6e1e8d616a8fd39bfe1f24424 g_scalar = 4a r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, ac30d6dc35b9ab9eb9dd7248bd7085c75aa7e563ca19ed0f2458c9ef13cf22bc35dd6dcf7125d169f074bee9efdd2b40 g_scalar = 4b r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, fd42d862417d6562d7870042957fe44564e239e3f0402e1d6762ab69430aed71a531c2c450fab9012a655ee1139fa27c g_scalar = 4c r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, e7871c313937b80f64172dc31901ee2241bba1911ba3dd06a7a69a24e4f855bf96eb8cb3603263f9bfeae6f2f71abc74 g_scalar = 4d r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, d44b1075302cfd2ece61c3e5572941a6dd03950030c9cfb21500850e49fd3c3d34cd7e2ef34d1d23774dcba4ec1f91dc g_scalar = 4e r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, 3e795421ae8fbd6cd47a03074e3c8f2c84238e64c4a7a4fbc4870c9dbce600336c62bff32c45eaac993a302d23dce536 g_scalar = 4f r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, 4b9728f81d7ab255941c66c9f30281f9617b301b08632eb3403243e9eeb95ec1a052eb3e3277555230f7838ba6b0b163 g_scalar = 50 r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, 530abb420614a6f9b960b5efeecd8ae42413063a1378e68fbc7a903c6484641d98e97f1cd923637700c213bbfcce7e6a g_scalar = 51 r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 9dd7b7609745b87e5de38d63ae2706a701047a5ee5dd278d56add2f018f2637d959a14d4736fa240e1083c17c382584f g_scalar = 52 r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 6009a59ebcd30d2869eb7bd2feee7fe5ed736fffa734994fe40d04ef6068512884fa39d54bb007bb6469e146b7a3a2d2 g_scalar = 53 r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 773dfeda69ce1cf9b72a7cd0563c78e40aa262ba2251bcdacf21a95749e604294e3c13706009643ec357a48a13d970c3 g_scalar = 54 r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, 3e5c6ffb3adfb941dc98abd94341fd4987e3e34d8d8145a014e572f21cce9e0d9ffcb850d7c9b5b080c0d8914ddc8276 g_scalar = 55 r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 6c218d92c993f213a231839fe2895195c3d455d22caf52f27422a72a0bebe314392aae0271fbe969e7cfbad800dbc157 g_scalar = 56 r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, 43d6196f8de4857a143c6e832c92df61a32f70e6a0c3e1a57a9910d501c47967a4fe5f5fab20b37f0d7e44f289b66806 g_scalar = 57 r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 9f046faee996fe68bdac81880e7b4db731944175e7559f09dedf2454f984a88f18246d74a7909681690ee6c7bf3266f2 g_scalar = 58 r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, c41a6fd431583d521af2a631ee1859834284651c3e6724b407f97c1df8ba4302a6f5384c2f5ccd104b40ccb8e384778c g_scalar = 59 r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, 01c7e939b8df37f31d28243540b962d9147701090b4de4c065ccf0512daa253c7861b71b2093cf7ee5865c4e0217188e g_scalar = 5a r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 9fce477feb7d3671effe5f50722fecaedeeb339129c4724952f2cabe13d6dbeb23ceae28feaced8d2f161a085e5496e5 g_scalar = 5b r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, 47cac703f116c6e20b09b3bd9ab88478cb78e0c863a2cba009d0b3319236343dd012811a3fde2c6d991c51670fc75158 g_scalar = 5c r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, 3e080b351a206fe25e43c16b90f38d1d3deda082a8a691f9a4d6871d472ad231cee9644726ca94dcaaead60f2dcb2306 g_scalar = 5d r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, c071f38f66bf9d09c71b395490a268e5572a425b71670dcbfe7ca8103cb06698d9e303f7e03abb7916dce2c985f2ca7e g_scalar = 5e r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 843c41be9c6cecdf6010c639db73da1103f4f9dcebcddc087d15f243cdcbcaf878632b48408989ef585b6d18c19f9213 g_scalar = 5f r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, bb6d4ba542df286e65364ded55ab93f98c0f64e83bc7b59145cc3f14dd99f9fb505fe7ebfd79617dde78e4315f93b592 g_scalar = 60 r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, b257fb6c5a4434a4cee0842f5d5680b8f9d19ea0c831254b8545396f305ee4f0507e24057dd87c3966e1d5dad872984e g_scalar = 61 r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 83c6b78ec4f030064c3e2491c4f56964cb47e4ed7889a39ed7d24ef430e05dd3e4eb5512d6865bf4005051ea1c73b598 g_scalar = 62 r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, a77104bcffe021f349c17dbc262820737b96a6edffb612df003c91f554ee9d59d70204dd7088d2da5fd094ff848ae412 g_scalar = 63 r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, 03e1698b322d63bd1f7493b176190d98d6f759d8d1a0ea086675138f708247e1fe3096dd81a0a38d04f485765d8cc4a5 g_scalar = 64 r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, edc690c903e2fcb28a8aecc74afdb92910fe926075034f722a4dd35433dac6b48a14723f4922997f4a7e5936f6075163 g_scalar = 65 r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 73872d361702e1de909b656f420ec104a73e1d9af53e80541fef41850ad68693ffeddc211d67c04d914193c06c8f74e8 g_scalar = 66 r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 60a4d22a26f6a5df4c6c8fc838175105a47fbda3bed5e5259e8d5e0bba3a023a5464baea1b373ba72a89af6579ae9e06 g_scalar = 67 r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, 0c9e71377273dbedd6e2d5a62de40552601bd1c358fad1c397ebbb4ed86f4dfd1a52e4e7e62e6e0bf4a58282925bf0da g_scalar = 68 r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, ed306706377f04cfb06434324e2c7f76f5f40731eb8fedc1f3513c3b9c9e5f9ca3b9dd6e230c2f53e206f13b96d88ae7 g_scalar = 69 r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, cc3ae72c6d8973a5cebaf145152f1923d3d57a9547202560372c23a9a91fff8ca5cf364fa9ad136b7d67ef60d99028b8 g_scalar = 6a r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, f1c69141971d1d5bb5a31d6abf10c960069f47e10aed184b1e0b982b4632f0a407c34b8181b17d37af66ced6d590155d g_scalar = 6b r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, 5182a7172afcedf2e1d99f78c7438e3995d6ad45b8659463488374d1a27f3f9f844fc79ae4193d79f4c955e2f647ed02 g_scalar = 6c r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 629a90bf9aee303f7499b3191ed0dde33c58b5e63c40024984d81e8e66d45390a985daa26e4abce9276d170f40383ceb g_scalar = 6d r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, f4c46c56198c770587e19a4e7f7c756875ad33caf5a1411d2db57fb4f560daf435cdd90b54294c055b391712ea533ae6 g_scalar = 6e r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, c59ff978106e08bfb775af8769e4422061d7272e75c0564abf9c791c76e941515426eb05ff14810bfac270f270cae3a5 g_scalar = 6f r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, 09ca776808279da9c64b47b82300d9feccf8e1f94aeb2685a2ff54bc93c326191095bee4e305fb96aaddfa03f49cc56f g_scalar = 70 r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, f82bb94445ed204db9a19eb57c182141473e6877caa846883e7ee43a2ec76a1716a71ccc0b6c4c64a818b9bea15c6a6c g_scalar = 71 r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, a10b3df255f7944b3d0ed17c31b87757bf7fded9fc31bb676998722ae7b12029b9c007f1d6664d043278521791daf6be g_scalar = 72 r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, 0cc71a320bc4646e499467386204acd06ca075224dc4a5e8da508de78539d530f4a727682b1c4f45390696a8d488cc7a g_scalar = 73 r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, c0c5bdf6cf5a11db75029e32cf121f03df9a343af6312ec600dc39b8848a5b863ebf1db1ec7ae2413106b7fb95dc9eaa g_scalar = 74 r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, c0ad2701581c66c57d04f5b9c910c402fe084c3f269a8382819b165ec127165cb49514f0e988e2f90a1c7cbe9cb66303 g_scalar = 75 r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 70509ab082b097737a546582bff1585ba6729b8db27984816d99c05f06aef600c6cb3a4beb8c057b940767a1ae53114d g_scalar = 76 r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, ab9386aa4a3ef7e79966399f963aee20f35524d0b44501ccac13b8149df3fd7307819492dd5cde2308c7d5a296b0684f g_scalar = 77 r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, b16536288a40a5cd9a1bb1ac9221b7a3eb9ecabc9109b7e5d677a64899dc8f46b2db96f206cf9ceb761360c15ff51b6f g_scalar = 78 r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, 539875879a1da4c861bf593f532e0ecc3c967a464c37dda4ccbe6fba3778c83889e73d9a54d7c388f37166f8c08a1237 g_scalar = 79 r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, 11aeeda1c64d0916473d0df9f8265b7e9c1d39a8b716f21b95507a54ae4d8985f5404f6be9028e62caaa8f0bd784019b g_scalar = 7a r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, 14411c67bfb77d57f6b8dd99613a733b02b77ffc1077afc76ce67450eb4d4ce0f0ef6939293f99667744095c728d3ee1 g_scalar = 7b r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 74c462ed1a798add03babcecc25ccf338a86ab0f498f447b5a82af3e9f30f7e883c6ba0470788c9f1be4d7f7a178b9d9 g_scalar = 7c r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, 49a89c9cf7a12be9b9e99d533cfb098b9544dbb2d4eb6e31045ce25c5e93210c55a4951bc8a66567bf4d13ab4f115bfc g_scalar = 7d r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 8933bff572f35ccb7cd5a74bb0095802551f41bc219187aaecf53641e119ab8edf3fb730ed4f55a421953d2a4117061e g_scalar = 7e r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, 07b33602c5e1ecacbdf3a4d1afba7f8cf99d6754e04af855f9732cbb4f41b9c31525eb38bfca96d3aa1136b6b0c47624 g_scalar = 7f r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, c7e92a61e3948069f3d6832e367b2f949e29e339ad180b0e88d22a44a467c5195698bdbe018ad5aaaa6e59ddbf943cf9 g_scalar = 80 r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, 239dcab2a277ac5b2657eedda5791ce3b01f1e0434a02a6b5d85a0e4a022c7a4228968656461e382678db970a7efacd0 g_scalar = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4ee443f91860144e0b7f54eb7e4cf44aa177ad14077777efcdc4753ba05068eacfc4718769f60e03c84f917203bdf6d6, ecff7dd78d65f38ac5bd6cde7b2c6d8ebc4f93f4a0c7614aebc958fab8cdb6ce511137d7436c1b541279ed4d42bb6a93 g_scalar = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = bab3aa8c60a8a7a71cd9c342e31644be358bbd6e8948b6e231811365ee61bc954043079cd23ad193ffec6674f65de0f5, 813054feed0991144eb2e364b2aee6d7c96a040173750d6e8957c03b8517ae8af7d0b0414439990ce065519fa375beb6 g_scalar = 060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 304eaea00e786d5f4d6a091dfab87b368618aa02c421c69415aaed42cca2f15037ba0db6f0f49278ffe3104b684456b1, 57580c615f46086e7f7fca496dcf60205928791809de860f6094823b7a70d421f57e3a19ad387a8d0be977472c114074 g_scalar = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = bd6066681a87cd4a06737e54f91d813ef972804fbd39a2bc6be6abe3b91f14827be330a822fbbe61bb39a17a7c34f095, 5d0bc923f9671d8a9d7f416d067e2c198853cdf6ac0511b07a93aedfa58af042b8206a8134afd68fbf88b2e5f538d56e g_scalar = 0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f20e5b8a6c7e9f94c3bf31d408595dea5caacb6256583c442822598ac5d6878a19eda013c543171e9468777a2b389b27, d0afdf5b9d883c58b8c0d1352cbdaf23481a5a2f7cdc0d7c2bd47584bd688e0173ae5d0d2939aa75254897370ba8a1c8 g_scalar = 0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = dc74d638c785f1439114cdd012def474f016adf1c094b38cbf75bb57da4d6ac4f60262b5dbbb9e4cf3b6fd79dd3532a7, 5b843830271041ee8c601615cb08f34f381dfc0c636ea6b6552685b79ddee1f51f141878cbcd0d4cdea060d6a8d90bbb g_scalar = 0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7b81ecddcfc2ca46b9e0718a467f042b49a6481891dc89ff535ee486e03c0851ae3ecda2761b94ba2d268da9b28bdac2, 89104b6e85bbff54b98c3dc02b382474382e3fee338270c7e4dbf739c7625e9bd44a2420aebbab8f3ae95ed0c166648d g_scalar = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = a24c76d1da73b71a2ce33c2eee858bc3f02750715adf71d715f1ddc63eb317f94f1d082ed0e418512e7d0a16204be028, 6cad67cc0a4582e182cfaac2a2ea7b24d11122a1a47019739f5bf5a67502de64efcf170505cf96129ef6a70a6c70c483 g_scalar = 120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = d061fcb5f69a732f7c30fc84cca23e9d1671eeea9772efc6276d435bd2141b0ade8b59ae0034465b3055ed97444bde46, 3fb7d83ca8bb65857e9a06f182c8cf961078a2a0431e5293f3053a22002f5f90cec08d256e800eda8fc734fb6f5b4f20 g_scalar = 140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 3ec851d706c4d48507b3e8b9191a320efce43e873cbb2b3faa299008a84ace074399615939ffcb3b139d9fef6bfc08e4, 4c71b7aa4df8a1b2ccb178a0b29be48cdd6f8b5134f6613758b79d01c439ab23b6a5dcb213c31d5c03d8a672a4bb8477 g_scalar = 160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0c80134604501d21436c61161861628a33b080bbc3350983e151f53b35fce45855b20bc8b9ca1f6d3d7718adaf4b5201, ec4885df66cf4d6d8a2448a43cd92f7582229794b6cc154c6976b0bcfb7c8e36d3962457332d7fc38597180f63cefa64 g_scalar = 180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = b82c99d2e7c3018092587306f37f0bed46d4729f1771c5d3f05086ec827e6cf877253434ae2c30f292bf8c4508359896, a7a413318961204ecfed795f2736bce61a1ad3eea5d782045c583347165c238c7fa984be994ddaf5ee0141dcb1684841 g_scalar = 1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = e9ba9558a68b98f9bd1e67afadc744e38aa99096770fda49bc4bcd77827b62965a01e68261e78db2d859799609f11ae9, 008e70995c29ccb22189ee16407df414d5b2734288f2a5c00483e97c5cecb4b5689baec35f0d88b25c9d3225ca4c3082 g_scalar = 1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 2f6fb08031e6e76933cf684789a9d8aee4b51dd0c9f579443a5902cee85717c53aace28e3573ecf687451ca71400851d, 5ef2562d0c8012a4b8c457c3bc17d1fca2c932c9a2098f4684d76151965109ab2d73fef4e78096384bf3da323b78dad1 g_scalar = 1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 79512b8991d197c27b814ed800fe704761c1b06eee7c1e8878b310ee8b5624461fad39ee9819618481657860b1637988, 5a3de830cc8f5386617e5957c5ed0a036f1e2e87d76bc70004873d713a22660b174b640c477bb5af60433526dae6f367 g_scalar = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4ebd334b35f68229c85eb23d57d002931fad8b304521d7e612449c4fbe35109c72913696e37f500696a1e74f51e4de5e, aed4dbde0ef567dc72a6af75bbba88c0eaab81be3a1c866b067b0456757cd570c2b4da6e5463de2e7c5b86682df5acf1 g_scalar = 220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = c51c0559814f7d9f39d71b35a50c71074a2d6ca29d6b6d55e462100285a8942994ee3cc9bc3e8cc1ef3a7281fad592da, 7bbce68c1760111324e69af34577cf0c4a034b36f131cc26ee5a08fa45c69c446885625d46719d58a883c21a5339bcde g_scalar = 240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 381e5b521d3f2ddd9386a35d4868dbb2031febb3374661eaaed46bbc35052bd18fb9294a8cf4e306085e33cd9273818a, 8dc0511f267d5c14042707ffa7443354bae262ae490c1969f446dfa92b9dacbcb0fc99f49dc95af1a938a3a5179617ed g_scalar = 260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0dc856f4656e00edffe544b3f3263dfa315acfccee43b8b5e10e7ed2dae76c71a9f177e1273679c8fc9aea79a04464ab, 8c225452496c1d6d54cbbd4056a4924725cfc139b1fe79ec5554a1ebe10252a4f0c735fb63a36ab88cd1ac907cfad555 g_scalar = 280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = b4315ab11afe8540cf6ba7db0f63dc797ad61b8ca57dbcbc1f719f7036fb5a4ed86e85a483e43c268f0e1908fac2674d, c158a2710b6dbd459b70bc8c60d2a62455867b5645149689ce98589b9eab87def51969ef8838a51d0448e852425c4df3 g_scalar = 2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7c18a7a8fa5753e85b6fd841f76a7b01cf6220d49d0216138213e04ad04e93359c03aa457c714b9ac4645ddfc70e9172, 30528343eb43d78d4a8b8cbf5174f2929c3cf0cac7402d75b75ebc0c35720ce2f197059e22168ffdd8747f67b6e9d715 g_scalar = 2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0005bca678d1c0ec1a7c4af600d31e7ff4a4f3afab047cdb8ce2db1f4645152c64ba3bc73d501e010b262f808f1915f2, f7468e8a92d281c71494c6050dc3c22c105b9dd2fc657b724fa387e5fccb58f5a299b1002ea9abdff5ed135f6fe5ebb0 g_scalar = 2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 8f21250473e722c5d76624e1c9fe92200eb5e4ff0b57513b30bb969b7a4289a53dc876ac1ac8a2fc9d420780b42108d0, d07bda4ec5c1a49a8ee95aaec496d9c8e643e936e9ef5a002a6ab465048c03d103c089de722b382dece006c9e640a463 g_scalar = 300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = af51c5bbf42e0e7c92f031be99275c32ce5ab665d8d544e60b06aff65c27f5f6264a09f3f9288555597a26ffb4dc8600, 5adb28dd9a2acc9bb8c8a6df334d4f57fcd999a86e2ccad9e73fd299f93fb7dc583fba6a8473543a5bb28b061e37b36d g_scalar = 320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f2038e9fe8e9ad7b08d7d0b167b00a8b732a3b217f4e0b07fa70e3732c9139e3c6dcbc31b570e7e381eedabc8f38b7cb, 17f1e19d8f8d4f1ae3a56e099e87e8a5a3933d71e9581abf1cc21ab87f56595e01b54b247251e090c30dd7d38fcbe329 g_scalar = 340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 308b37a8d48b9574d1ef46340be2d8415267ded09aa9a5c005037f26de2f444ac6d97d37e7a97f33c760823646dd14f3, f99e952f24f8bd3b126505999bff252f71bfb8bc0b80f3bb2d8adde62c39c75a1d5169d938b7c1ef102f7878487bad5b g_scalar = 360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4ab1773e6c85c123d67aed02d15b1f9de20b10f1f1021adf76cbc49717204f9387590cedf4db6d03c3db1f37120b62d4, 3255a34b29d1067d2cc2f92027d52c47d442a634f9ac58d3dd42c53bc0459adfe2d7f9695073039a5c4e64b578618661 g_scalar = 380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = e9ecf6ce198c99f00f6c5993c82e2013e2f87d5e2973be1d4200e00670744f159fc75c0aec6afe4324496a8b7a8a6d47, 8f02df83bcfcb9304f24ba23f3d93d73e4273a124bcffc618e962ffbd0fbb134bef4b8c8325d1d93cbdf72058b37d828 g_scalar = 3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4a7788de2d65774a2c8a2246a3e93b3391e674f5503557f209fd4dea45f979bba7f9f7519579f6d40c595629484cba20, 892fb605ef305ffae4751a325d1088af129a351bedd41f381d7f2c58f5f882beae702203863b049a9594c59414690f4a g_scalar = 3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 30568303868326be1f28862ef23931d5623d44b9e4a0bb425bdd4382a7b62effca4ca7cd5a03c014985c8f4b0614348a, 6d990c16f6f5c9a42f50395d155eae927b32249baf3f0dbb62b74879b1e70a9af4dc02330ac4a153850d2a0d82e76f04 g_scalar = 3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 37eea04d226c0de31df6b241f5ad41bb711e5b378c68c6d120f84bcbc82761b390c700aaa28b9162a408aa1b48819870, 09145c9f5e82ee78456f2ff137a46fe0c8f8bb0822ed1ddc6b1c960e7130079f628ad18ef2cd3f99c2b06d8b44c41c2b g_scalar = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7fcf0ecc91251b6e64f27976d5d7412b1a6ea51a2a883b7f340c8ee3ba4a3301ecf10abc47bb619e3afdee277d221ab6, 89325d7a7f96e023d373931e8e7d712bf08398d5d542676dde3b73d6ad61b2cb38e48b96e2e13e585f3f8f41365b18b7 g_scalar = 420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7e3e4b94ddaca7970a21251f7cc002a4391e974f262a7c900fa492995a642da315257c37b24074d0000d342aee928391, 53b272171804202c5c1d316ad8ab1a429fdffc17c7f4d0572b214816ad88cd68bbdeef04e8c08e47c80c4510743e1114 g_scalar = 440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 63102e93ff029787e2a938890afc827f951f92186359cf06536c999ce295c45100614bf206b7e166eb2e48c10bf4e94d, e6aa9eabae2ae9e3487ce890e10ee83736b7e9711cc2f3b4c0934ca6c86043047354df74928742bfab297c7d2ac89645 g_scalar = 460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 5508188555d35077eab1751b07c4cf3c9cd6be7b2601743ac8eeeb6ad5b89ac7e6a752c4783e3da875218ff22509a1df, 807893527f1ce4ef7f53fe8406c6a5ce4cb21d96e11e734910ca143b1285e27ff265d0abf1e40048e315baa104764080 g_scalar = 480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 3838356a53264b8a5239b5c4109797d6ae7b59c5fbe10a477fd7fd8eb3c2eff77db868f3a950dfa26e7a578340517347, 25ca45046cdbe5fede6af0ff83282fbd3df64ef5a06f3cf3fe1aad846241a50a67c86ef46958fa2c8df8454c320a8c5a g_scalar = 4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f27d64f3900000b28c140f1444bee3bf74ae1bb86f57ac995957f390ab2f9f38b6c4ad7e6725e6bcf7d0024dbbf692e0, 36c1f5a7f9f706f442cdc68447ffa0369a7b2a986150dfa43b5de0af2e50ca8f1c6441f777dcc42105df256b72fdc686 g_scalar = 4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1969eca437dd1341ca98c4364aaf2f73c0c88af6aec23cd24bea31ad623e7e55101f055acb1b1cd5a319340d6e6c0deb, c0213ec56844da05a7e5670079911cf9c3d1069474f262e9199ec0e93d6ea9c4afdc99532eaf5b086b03989f97866dc3 g_scalar = 4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 2117cae94f663d08e5bd0119ed5225f74fed82fbb2d8dbdf78482d89dae531a4ad937387f2e050ade0732f6de3a1e252, 72b9ff99a67a5bac399ae62b881be3145d5e71b8e9b5b6a3296b1335bf341f2c589e22809e86c55a99b47ee3ea1f9b78 g_scalar = 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = b942add81ef8465b860578cf416ccf69f307823e718c8aa3f9fbce33a82d37361c77a3054f1e0d095adf3d9a111792b9, cc7a9ceb854fe9da6bf6694891a626321f521c2dcbf3ccb8f99b9a8dc09da90be6792eefb01528a89ee0cf97cd9472e1 g_scalar = 520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 5f3fe3e3209d9fc047f02c4abc4c0e4ed15761fea5957703efaa521a05781b37a23f342d40f5ab43c72957c2b56c62ad, 8ea834b98cbc794316670382932d4183c743947400bf71245577e542aeac3cb5fcab0ca1117138ab1c1598df561b137b g_scalar = 540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 84422ba89c2d7eb037b11137f15f0cd229b0341dafb73ad113fe0588ba057fe284c5d6a71a50c560fc9660a3c8808373, c88f0cf685c54d31535e8540116e2db870cdeb0c9f242a42908895a9e02d77fcd7a8303f08b37a840b595ac52554ef7f g_scalar = 560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = d2fcedcd2a1986bab43adf697bfedda152ae359080ec87ec825104bc4ec82e0f6dbc484f2356b6a44dbfa5831af13e99, ad9e025b3e6da3e05f33f11ebbe4c690f088dfdeac7b2f9ce25dcfaec32d5809f74d9267c6fe4f5734951159045ad785 g_scalar = 580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0c5be4a1ab204fb0ab8802bab8da8e68be6bd7b92c078aa8716574c5e9ae3da03d081c0d7f15c9e3f534f145e2290eba, ab2bc89575ba5c996b532891e6550d3c855367c4924ec2d29c6e2ce0bb5cd2fd3929d0d78fc9b7a5ad25c5ee0d3f12b3 g_scalar = 5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 58ec20b5fa1aa22b08285f05e94af0d0e9245a047205187c5d74a59ee05637183b0b3ca6276cf8c41cecc6cd72c1dbda, b0e13fd36ad9560fb749ceaad9da4802cc74af38ff812ae36757a5c06d40592d0bfefe8d9b5c84757d367150c1220085 g_scalar = 5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 71d663c80482a61b9e9c222607f4b670c77375da47644b079d86bcac8b5c43fccfa41da6f89ce836b56b035e2a0349ad, 46115292ae0c97d38a2bd7fed4dd03de9b463559631b985009e0cb2a7ca7548bf1cedf7e48832b5bb423e739ef237431 g_scalar = 5e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1ddaad3e57a8a6ce086cf9d3c08d007d4980b91eae21ee2813a6eab45a5f233af7bd1613d7e0ea774be55e045320c643, c16aaed957e5a62c33587da0f82147cb54941191f098f87980dda6bc17c4e9dc4da655da00cc3d4107d0c19db8c6b532 g_scalar = 600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 5016c8533573235fb1fae2fbf363100ac12df68cce52defb1004254501c4e17190cab0eb9d74e3f6e44e3f864b3759cf, c1da40d31f5867b241c7611ff54e48765abfa961308772e9324985835a4e118e8a20d42317f84ef28d4deb661d922e9b g_scalar = 620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 976a426e7e387e5c86346adfc17b570aa537fb6be3a14ebf219a097cca4d32e7607683d6d30481954490d42249f884ab, 622cc08030b6aefc8bf4b8321496b6541a6d9ccb5e20adea3407694184546e81f870516b4b009441cdd13f0664fa241b g_scalar = 640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 972877d5c351148008e952e365e5ebabea435fa0e9ceaf442a773270df98069e7dea27ea124874854df02a7d3088aebc, 7d5f05a3faa1be224b72a1e6193547517d9878e811c89153bbb792e2c3225f20e50abe68b8c7c796ef5685f859a04cd0 g_scalar = 660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 9c3eb2bcc338e60ca5e4a81611e943ceea32131487917fb3ff4d80e7182e7578122d7b16cd1909a4a9c5286d78c8e4f7, 3a8745f4519dcddaf346b75a9538fb01980f87c8f605c9584c9ef41d9b15d60be1c92fb8b5217ea220e58adc72476919 g_scalar = 680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 762b3406c6577d810accb4a7922d3b253a998cdcc8995cace659cbd6ace07e138540213ea7a3f2f761dd7692f27eed54, c27d13df98b867b536815de2c724284ab6d72f7ce6490808080a522673b98cd37f78e02d8cc9bc5fa09db4f57e043740 g_scalar = 6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 8df49d947bc531c51cc8fa418508b201bd7dd40b7a34781499b5020891035d21e8d66a73fbc1180d5f29d3aaa7d9e25d, 8db14a1dba6f378f3cebe7e079393df73fb41991aebc0e3b56c448174ae09d13854dba16f2f6917f572cc562f0c8665e g_scalar = 6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 490753350b7e4afcb041ec67cf575de55f49ef880115b9a54771281390833f18b5e8876c499a1455bfeffd5356adb6e4, 868d06baff60e943fdf76899c1e4f8b433ee16e27993eed6a84431a6e6ed51989dbb181edafad9a5ad4dc4a15f0b9f24 g_scalar = 6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = d93bd14b4b11ac38c8de9fdf7506b004184b98d7ebbb8c4dc3c2cba3492a416a313c0cbcbb713c2501b7f6985f7f481b, e8ffeec6163e34a582b65a57276cefd26331de3919b3882df3a5bacc08ece1b892bdd75b9f6e7821471119db51bb7d4b g_scalar = 700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = ada548c3b46f1e376b9fd3f7f19df4bc7f7009d735b193cfd8e497fff172c7cfa80a8c0d2771235b46303171491ccb92, fedd3a7011a6a30f33803a10b77840dc29a6d5d779b8f5cc2a121042539eab95ef2245d6ae78ef9987c6eaa9c7a20270 g_scalar = 720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 2d56966a409303d605de72b7f70a3994bbaeed33041120a96122ec75d132b62c870346945bf287ec264b3d9d11eeb9e1, 42b1ee108ec7069ffcc4a5271566115518cceb0e66f4debfa90f02531e45559aaa2c0e009a84256bb5d2a629e73a0b47 g_scalar = 740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 24ad6b0ca28c80673f16d1ed3b5fe8d68ec00d9fc04d8cd5937a15f52a67b12bc1413da46682c7795d782a0778664144, dcd9e4e8120b38813770e54d16bd75b2d686eb7239384e157d863f5b2ac0c23862c4c2beab2fa785dd1eecc532732b19 g_scalar = 760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 326448a0597de5b3e6361a339e0e1c54fc3e322c7496d0809030804ef95021bcd40b4963d24a2b6eb9f1b4ae3e29ef63, 0252a9b99e9793e560cbc4f2287857e213731c2735ba183196af3f106cc7ef543613bcad0c6218776b95c41a2c74527e g_scalar = 780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 20b358444182aa555d43a4a6191cc808919081881990c13c49b13eb95acc557287bc4d75b1baaa7ce3052838df5147e1, 14101ec7326c4d3885b6c505470fbe135db7d06920f68ec58d130b3900c5ae9ec6e6e061722e91e770d49a4a670b1fd1 g_scalar = 7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f04df323cee02f61cd5a7a956b1f77beee55d9e0594c44ac013ec26cee34c1dc43011b315c10da9bcbd0f599c8e64d24, c4409631dc14adb19dfe638a11b9f3e7cf019abdd3531546a029482b423ca901b3c436c152ec76c9cd4026d1d96e851a g_scalar = 7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 010865380377ba8f43a195425fed884fd7323e01a856ae6b6c8e22676e97f5af75921e487576c3ddeef03450e10e8018, 210d6016e25a2073ddf723ec0a11fb830c8d328bdd918524ae098b7f9e67bed0c6fce58bf0fd42817cdbd06ac82a8f67 g_scalar = 7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = eebb047e6d7c9413a7235359a60a123952d9264a3ba048ebbfb45e7b89486d643ee8c19f0b66d8180150d085890f1e7a, 7ae63ab9d214faedcd833fa6420136d7dda482d4320786f171e24d58264265e0cc43f5763d6f21692afe72ea99eff33e g_scalar = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 60ad991e4e4eac458e5c12139ee4718f77b9b6dd6816b0099aca885c1a0d58e235414174e52691403c90a59f85adde98, 5e9bfc5c290405122e7b49c76f7a882f5f99092d42a87e32cba1ffc75eaf3eaaacbf4eb25bc5fd2ac00c35694d71f624 g_scalar = 820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1f1b6cc936184c1f444217e60b4b3953db3e9066d9772914d5968b29ac900f4c39dd0be4c1125a63782903630deecb3f, 95f412236ee17cb99ca45b884179b279df74bc7c4b15781d9c94aca42b2ad238d4d435352c5b300f016170c37e873b7a g_scalar = 840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 9db0ee0b907f2cfdf5b944c9040b7ad4d4447c1b20eefa54e8804ab3329a0b9a9713a5e04894f486a31d3524b295958d, 1e7a7fca9b447bd44f952109f1172bcd2b47ca0622d4deefe0663b5ab29c3cff3137241ea83517640b1a1f3a5384a999 g_scalar = 860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 2f6bdb104cbbe283f9c8e74d26b173fb5cd20671daeb6361192707699fd1661b8ad7721233e84ecf88f2de40a7b3fe4a, 247805475c8c8aa5a9c90bdfa1886bae3417f527a3ff3a510c10b90efbd02188b3df0b25e67e3852f8c33386d8796519 g_scalar = 880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 6847c20de211c90eed3a6508ea56be90d9b625dcf9ce0cde6459720f8eeefff520d0c4740dcd66f6c9898355ecf2a473, 6c7c065add370f7749cedc634470e754cac8f277d145b8313155874750209b4d9222eab23023d16e36d86bed71a73cee g_scalar = 8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = b1516b4697bf25d1c1c0468307a8949bdf7187596ece704b26adc1564300df17ec96212c96174bf6bb114c0747f74319, dcb074825d92d8f2c13d11c350c7aed054be86810945e3b8c23ea6101f426a499d93d21a6664d9609d83fa5148b60820 g_scalar = 8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 02a37213fac8a477162aaad842f412c5aff5505f1070737afb8a08285bb5202d1ff2549ec4c9347646a95735f8171804, d7aa1d2378d82f9aa2006f207e6ee867e657e8c782d04913373a9039db1e5a409be6a0b29fc6678705ff9238932f08e2 g_scalar = 8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 80e70362a61f6b8e5b9d91d31e8f6424ebba130bb3663e1b6a9f149f55dcae398360743ca827378dfa8cd197722395eb, 0e1d6bd572a38c9c5f50d1af56f0674602d7f0008e445809a7e00178e83b6101d09f7ae147cd387c0f569fe2df0d96c1 g_scalar = 900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 3a34819d7eceec8835d9fafccf45b75b22bbd01853e14183e09f04e6223a0ce868ff316015c6f7f5fa070e22142403d1, 335c8d36b7784e7c19e12d0565e800aa8e77d9f05f7edc6a0c8005659eb2a79a431036d5841d1505d9cf7568d33262d2 g_scalar = 920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = e70634860b99a9811d923a955e2994097a0a8df4a85fab6ec4a354244dc0e8bcd1b7191b3cfdbab92ca47e98ac1b85fd, 41cf4463651dd58c61df35a2872fb3389054ff7cf92744f7ce7b2c34274700c5382c5952a9ddc0372d6a573bc4066501 g_scalar = 940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = a6e5585e996d20338e857069e462cfa8f60ce5d991f1d4875c240cefa3ef520288322d8bc225ce6edcac39d87c1d9f4d, 1bb28be140089be5f8cb9c26a5325b8c74b14432148922915343a0a2a3231eeccd90c140f907ebf0709675a556281e6a g_scalar = 960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0a14f23eb0470188da64bf1e5628f2863ba37c232de1294438d28dcfa9312a5e224f404933c384e47b7bd39f39e00e98, c42dc328091678ee839334b1f7b077cd7f81c9f49d1206a69ce1716ab4aaec2b9c8dbe79044c3f2b2546b252c1e279ef g_scalar = 980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 6189f5e41a991ea2da296dacfe7d778f186d3d934f810d8fbac785aeac0939e3c7c9e5f1d27d1f312bb6e7ec3092d0b2, 6f670479e22efa03720cd3908d1363fda447a31ed83044a609d718487196dfa804aaf59a88a4dcca098f794e9634363e g_scalar = 9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1dcb9da2e49ff45c55a12128a50853d180f745e27f7209ce78b59db06f2c572163a394e1404b5b23cbb76478b52110e1, 2fb48e2c66241e371d10aeb29d2f0d8c854417e329d324feb5951f413db491f31c2d9362850112c8ca76464c896fba5f g_scalar = 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 9bace7adf8a7c0bacccb784f77921ca4d56ec8f223a1656e16ddefa50589fd01f3dc472a8e2c58e9aa452e81cdf60f9a, 5a446de871ba27a5c828fcc77a21add6033647c392a209513599817883ce8674a70c0579c34e7cb5c94ef3ef51f052e2 g_scalar = 9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7a51381b1772fc22ca98304759d16a8b665870899d73fb3bfb3339ee5b1cd14117a70200b441bfd0f943b61f038af8d1, 69177896bbe85f1969ae68d02e13af263f388dd5b8607a50b75759eb4663d9a45d1ad5200cc384a85231f7e02c6dd801 g_scalar = a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 282358aa2ff95cfe76ed6fe718bd01b79f67567fe0a7ad0b990e3425ca7b8369b69e308bf8ae956575cba9d530a3ada1, 54d845b93d962c14b89f3ae81dcd916454f8664c26330782969bb272b6a7b8f989d1533fccd67c8128d2ea41410f8841 g_scalar = a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 6d7604cffe8d69d781c5409e908e92f8e7dd1034ac8f1eb78fee1bd6e78c1828a32243ccb026239500cce541ad148e09, 904505603fc9a558c5f565033265f4f50922057669559f2d83dc4cd6bb887bd193403956a36123ec210830de2eb271bc g_scalar = a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 30369ea0ee12356a6aed101a5295e728e964dc9c9aabc3fc885253779336b2b939b1a9c697b17ee608ba5b61fde4ca03, aca079354468e4199e528623e854d7cfd16c7a85a1a5e5043b2f7aab5590750c3a769ef0df9f47c0e081e022c8e80e5e g_scalar = a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 6f261a720ebf3f5d30519b089ab91b5eea5b069985bbf511bd196739a548a22078cf85c78720ea377868bbc67f777fd8, f6f0e6c179d0e8c66d82e4b6a56ba80bdc94cf7759426145238dd0a4ee913d94d5c64a5e614695e2776b7343033e612e g_scalar = a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 33a95de702001e8cafbf32372a69ad0d093c3dc2769de89117779f5e7bbc58fef517c925b79aa0ebee521c0af93098bf, f259795816fa1b16e5cd9c39cab3387104f0bb334fca052ff1c069251604a646b379a3f425bc7d9a3b30afc73410a2b0 g_scalar = aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 35edc49ca54239bd0adc36938b9046147f82050a305601877ee84419f5dfa296664ca68b46f5d9044033ece91c1f582e, ee2fe77309f54b6071c9dd5cb2a538e9b04cb2d370c923cfb180f8055004fd5934513baccad673e88e0ca3ac10854021 g_scalar = ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = a1cae78c7b491c4d752d98f6018d7c6455d40c1b2eb7f0fd55f7680599440d4bb16ca18bd8e94e49291d65c801189d9a, 7f87b4412a9a02720deaa373e92656f4583b336aa5683ef8b8f9498dfaa9451fbb48956a3ceecd27898fc8c78f66b8d3 g_scalar = ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 3c9e1bb5534739e879ab7a5bc5b76b4fbe21ff8d02a855fc4fd1fd2cde268c8c809a6b6cc5a362e31ee1b6033b28bcbd, 9f8101706c09daffbc05ccc588e874af045f5abf2690cf6c3ac1c2d3f29402a2c2a2b45d85a211d06ba4d9a7a58bbd09 g_scalar = b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f1d5b458dc7dd67fd6f1b8df647cad2f805b4048e097047f15b28ac7b871c3f3ee702764a35d24ea8b2fc4e96484fd40, 5f6ec65d882935e193ad20e74cbebf1a283ed89d28f284f4af14751e95148b55f6185ebe21274faf324c529c25148803 g_scalar = b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = fce39cd1e1a9d1708bc1da4093b5b983b727f6a0f7728c1ae7f34f712b796613950ef6a86c660602cc862ba801631411, bf09816bd0a0afef4270cd9a7eec7bbb142fefb1e4319697c10e9f0a2c74217759ba530e18d34abbf19e723e9493357a g_scalar = b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f08cbfe771c4d06186628102bdf579e6675f12cca4fa74a94ebfbda7cf3dab12907e4f38199c51764b0c7d0c69c284cb, 83c09192eb103fe01c071597924baeb18d978a8110d1e8817cad28c370c0b7bfb6d0d48b4c7279159dde390e03bc1cb9 g_scalar = b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0e1f061a92f572f08000fb5849e023a3884a0bfdef058b6faa278acb01a177dc1c919775c21b9dde3169bc090cc65977, 189092064329b28b4e5917c682138a439f26e75ef93913dc44f8c04af09a402421e6a59d820d7e6d2cc96f2fdbe0247f g_scalar = b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = e4c35c2244ab2fcc5bd45adcdc6938b91588c4712a3f012d38a1ec5ce16b874de239b1d404b6fc45494dbd2665925506, 56eb022838caa90104616318263ea256caf679765bb0fddf3a0e55c7982a492892a9c3b2144fd3ee87cbd9ff887108a2 g_scalar = ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 2d2542568fd9f423f6d41b65310fafd4a5591868498f151f764ab40ace8713c9023872c88f2d14ff40fd181041ad343d, aa4016646be126ec39dbfed5502f7fcf94945e512d32ca7a20bda998e6d6f6e5538bb2f6e19b255d35a163172fa4ee80 g_scalar = bc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = fd96bd168940c7665927968beb0f6ca5717c302a766b69dad2d9da967e155bd5323bd638835a4edf2f7de141a48da000, d35a825190e43169a836a6ad53b7e6e988f31e162314c0ce7e639523a3d57aa84ba9cd8bd870954ff89f7539a334fd71 g_scalar = be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = eb7c7b187673dfc835238e9ac5d8b3ccc2493d3db86726814381646777c6b7eab211af35bed7aea0a101c2f02838469f, 8a072506b9ede54cf5d581b34cfff8097502808145cd4df20fa690f0143b29885304cd1869ee2b769a08446474ea8788 g_scalar = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 024cdcfd74a513932dcc51180f94f4d767ef024eb3dbe034f4ac2b677dec20d2f9fa4483d8b4d6bcb3984b176c0f3509, 053113221defbe00a0c0fe6040411c15eccb0521817bc8d1b00ce5567062cb0bffc18f81d3a7414ff1c0fead20e7abcb g_scalar = c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 217e60f334f621e52a4d3ec6d979444c99758103696866db3ee3d96da9de154c65382a2312055ff2a6730cb7311cc98a, 2acf783576e3dd6ef3d9c0864cd087f3366b49a4ac4b2b6c5e9c62063177abd6d7856a5d5d3a2fbfe62886616bc56f0c g_scalar = c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = ab3ae700d1a378c565bd03584590bf03605e7a32d2e2bcf1d69b7c83177305ff6f206002d878a97a74faca8a6af7e742, 7708617f1989244e1e704c3bd7924df112c6d168e67756b182a18f03492b01d483625ae0a7c451c6037e79028a929b0d g_scalar = c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = ed111a7a3bd0c935557d173489ac563e8476e71696aae3352dbb2f572373797325d250419c736f9a583dccc1918722ca, 58d3857219e15bd18b377061a65f4b1c2dc9e0349fb5102e473a13397c60ed02ea17b3b814dd3ec3a47ccef10b0615f1 g_scalar = c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = d363e435d58d42d2d9f3982e3ec5f7ff162cf27f36ba3ceb1ceee947c3f392126a55edf1c354f4334c98c61d097bde48, 0a4f9c10525dbccf89d23e8b6de529945010582e923c1acd61d94ed8d7c27fe7d916df56ebfbf51c2ee90d7bad36681d g_scalar = ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = bc61bbaba368819180d7ec75226d534da72e9ae08144a60f51e4475e9f97151bc404defedbaf8b42178b590f1c477d9d, 730cd43523c6c257e43c1ebdaefc387258eaff8bc9a218f7f088ec4816bdea361c74b961c5a091ddd01aa30fea2aea81 g_scalar = cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 218e7fb1b71a25a46888444f98a9add79be8a33f67d61b2ed78ecebfec57d967a4af7a2d749862107778fad7e65573e2, 68fefc83f624665a29c25cc3fe3bdeee3a37965f71fe847b23692f85fc6837ca2f8610ad11a52cd9f75a6b795f46323b g_scalar = ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = bba8c7b11cc64bb5a6581582454dc4f3d92b8ac4d708451051375d6af7acf0bcdad4e4b8dd0ee7526c79a60950a78a78, 9497fb38430bdab3d55200ec8918e0d0587a6ce79d8b271c6459e58b6aad83062af531adaa50ba8b6b8c42c89a52527b g_scalar = d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = ced5e4cf2b4313900490c970f5aa2fc4547bd050b48bdd872e0bf749e05b18e763ad235fec1ceb74e222eba4a4dcefe9, 925a8e7c11b85640d8ee724f8d890a9855f7905e50510da6a4ada2305037fce844b72442083b57d407d8270451d2898e g_scalar = d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 5526e694909f969fbc6d93d12b1ecf5da54322ea0b5c08c1d151433074d7b4608b7e7552cfc6aa6e17f7e937cdf7bd50, e8d38ff491dff6592d1f6672746949222745021fbc62869644b0df3d2132566a477480ecaec1966d7195a9a4726c431a g_scalar = d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f79e2d39b2e8fac1bf3cd96c034d021b15245ac616c11ef494035a1f0c82ab81c749a6a77709a52b8357d8bb460e77b2, 6cfe44c63f488c2e89d0c4c5da7830b316f34bdd553a8e68b2584aabdda9acf2341f9b53b3143bf7387015194b6cf1bd g_scalar = d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7bd84d4848a7403bb88ee110d4c2aca40e7ca13cdcc93ab719e453d26360d0b1160eeaa784e7e36db3ca02e33c34e954, 77eafee6b4388e98009e51eb2912e1776d2a36102ea95493d118e90b7413e79a631998ddb8d0fdfc2e8d3d031ca838f8 g_scalar = d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 058ff1904c89c9a87b6e3e4d1f54ef38a901f2551406ec90b28f476b59a7eb995ea6a57c699397bfee536a26d4bcaa59, b33ea619b01958523e1957812ce0f9693ebe84466964b9ae6181fa1675362f5dfe98793145e142685690fa10fca546cc g_scalar = da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = b5f1a6c4605f84ccade63185d292887e6000e8b97de5f75dacdf3c75960857e5a56359b898797f27f6666dbd1e720925, c44f3da9c30ac7611159b5ed472b66acfe60d8144ec4fa790f0977b76c70738cc26cfc824b2f4be14c77f69461c7e0e4 g_scalar = dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 13db3201919c187099c2ff0b948ac53b031fc087255e8c5eab4bb08268cc66781f72c1f8911316f6eef402410ec537ac, 2221798b9f4337d5e08e4213817ea56033a9fe40bd21effe748d2e93d97167e2bdffa226ff7a44cbdec81fd312057a3c g_scalar = de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = cfc013b68f5c17418ca6fcc4789fbee8efe3a068daa3ed3a85ce557932132eca1c048aa58f30fb6a7912ca4e168fecd6, 68c1cbe20070491721f97889d9a0fb29499a28ed6765f23262c2ddb7115a89d837d96dd573be5978d1986f75e6ce6f9b g_scalar = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = f58b321ed1f9bce830bf1ee34f114abc72483dc5b3e1d84f0eed233cc25c696a5e9abf67d640c2a1da828fe556467257, f0d0ced355035432d8afda341fa2f06decf5649dfeef88629da43ceb72a982dddc2f105e1e453229cb26564c97524f33 g_scalar = e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = aaf3726a32ec147e505f5eb8a58e699214f3ee55fc5144da5629e0626bc5035c0a3de8f6666dcfb1695089a73532e60d, 1732ab634996103eea5a145d3af12f79b86e5b4bc6884f242e81ff821a1d8e28f49ce51b7ea1eec7496fef2e71eb7799 g_scalar = e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 7f517c9c01f3f401b21e275d8b991b2903c6831675f0f13991217a6be34fe2e0e4d168e75b0b727bec22bb32205a5301, 8f1fd1bd5716ed9b08647a158d2ab0ba242cb06bbfd24bacb88be15c7cc1367dc5470808504514b1bbe95d19e55e49fa g_scalar = e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 8aed67b865bac360c6dce3bb1fd8ee17442ae6052b0dbd5d807d8c25d5126552b050787598a85112aad13b2f80f89c8f, 5762947321262e1fdcfdd945855bd37a8b89bba354066b5b6859bc5ad6787215a698c82256f8a4889641c91279038efe g_scalar = e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1690687e164c44ba8b5101310dd4e1d4b120589021649255e7d94f4697b97d7c243622f9e8a47507e787054518ba5236, 9d3eaa58c5b0f8e74d2cda1c81cca7deccaddeaf391ad03d2aa11707c463a975fffffee70a684c3d65bb4d8cf100fef5 g_scalar = ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 152fe43844ecf2464c549c0e5375bafd29a9b8a5787c26f8979564774ff41b268a370b2f4897efbcaf2c49c193eeaaeb, 90ef55d72e7302ed5e5b65408484a45a931392d01e03117874a6973313129d1a10a3f1f5b62aa404b45da2103332ff90 g_scalar = ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = d4b25ed3883ebf03e1ee7508c3ff73564f4576a12c9c77446bdf53fc46c1f31b3024ce311a7194613d92ecc18f8802df, c7edb5db6c742e1b6960312ff19fa66aeb82b33740ed314336e175265e9693f5376ebbfa11ecefa91dc46052420c3ac9 g_scalar = ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 1a0ab3fe3e1aa3b2da05dfc0faf576dcb6743901254cca1a54fe2ed1821745a31e6d2cc15044f8e3aed505fefec299b5, 5c070feddbad43935b066cdebe027cd079d50a1f256ddbe05e3587f3fa6333404dca34fadee620c74dfdf356b6434dc7 g_scalar = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = edcff8331d6dc79d7cfa71e1cf1cb8b3c11c95a22527c1ade6f0ad9bc0579c3e593f085a6dcf56bf5bfa10cd1ca459ed, 79d53dad0091bc903fb148b8d721d034ed555e37e2606ec054c38b71be3a107bbf620096144e11a0581c4bbe432521c9 g_scalar = f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 91d26e18089b6194c58fed0143bfa89695f4f8a7c76e93579b34ffa032e7bad15a5e1b61f59698d9f12d87d33dad94a4, 8e5cfd1643f60ce9edc913822c32d8d857d63f10b73137d07b6bc3fafff00c4321b9d7a0a897a35ac218da26d62bdedf g_scalar = f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4a95f7f3ad4777a41ee7797f6590d0ecbc2c3b8d7a81382003d42e96afc190c3887071bbcac96dab4b98cb69c5c8a182, df206f19be8f2e7e1b00fb28a2171c8b759fee1c8b53025af9874bf6974c0a8e7f8c6751ad78dab67a36de4e2a8d2736 g_scalar = f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 92fc21e8098c5b74dcce4b866dcc347a56485fc5055a1e76d2413d03360766ac3a0699eb49cb60f46fe114183c5d5268, c600f4375b6eb0c0b53e970c73c2308a8a45d99a9028c820b1cafe29b04194d9960ea3a5924cf515e18ee91f68707ae9 g_scalar = f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 0b2d3d2ee01df4e90f17d421a6542ac0bbf2d5477007f2e9840210ee61ff9d1e7734dc91f8fe7a42e6bbcf0bf8ed6302, 633a2ac888531d81eef1c6710b09ffe22dfa176cc44153bbdcfc96ae6e50d8368362f7b1431106b7520e4fbb84f3703f g_scalar = fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 051860f8db9d37b374ddf359c387adeacbea730d7b0b1b3dc9ef099a6d40b18658ec13e188173f1b430f3082d997bb97, 0879ac02fd3f45cb6abb20c30a400fcb8be482395c7d44222798b7f0a1acb1c52dd2fd248977979ad65443bd231491a9 g_scalar = fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 977b4bce597694b4780ec65de871b7928025224f7ad39d9aa441e5035bcf0e19dc504f01d3ce296729262b6d7636a78d, 37e9158235c16a0f6f7f2fc47d31bf61f5da63e0f8f90368b669c1d60c34153a1cff87ac9748b10ee05eaeb87fe3ef11 g_scalar = fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 75c5b10bcac05c018d3e2eea122e7ff2b2f9d05f3cccc6b797a1f8404db70676b7b8f12986a52261b0428d6baa542b1f, 741623d5932bbc56910fe7424a0eaa765b464e18535a5866c6b4571c54a598e1c51a6f08e6edbbcfcd80f0d9b5def90a # g_scalar = n - 128 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3 r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, dc62354d5d8853a4d9a811225a86e31c4fe0e1fbcb5fd594a27a5f1b5fdd385add7697999b9e1c7d987246905810532f # g_scalar = n - 127 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f4 r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, 3816d59e1c6b7f960c297cd1c984d06b61d61cc652e7f4f1772dd5bb5b983ae5a9674240fe752a555591a623406bc306 # g_scalar = n - 126 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f5 r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, f84cc9fd3a1e1353420c5b2e50458073066298ab1fb507aa068cd344b0be463beada14c64035692c55eec94a4f3b89db # g_scalar = n - 125 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f6 r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 76cc400a8d0ca334832a58b44ff6a7fdaae0be43de6e7855130ac9be1ee6547020c048ce12b0aa5bde6ac2d6bee8f9e1 # g_scalar = n - 124 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f7 r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, b6576363085ed416461662acc304f6746abb244d2b1491cefba31da3a16cdef2aa5b6ae337599a9840b2ec55b0eea403 # g_scalar = n - 123 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f8 r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 8b3b9d12e5867522fc4543133da330cc757954f0b670bb84a57d50c160cf08167c3945fa8f877360e41b28095e874626 # g_scalar = n - 122 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f9 r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, ebbee398404882a8094722669ec58cc4fd488003ef88503893198baf14b2b31e0f1096c5d6c0669988bbf6a48d72c11e # g_scalar = n - 121 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fa r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, ee51125e39b2f6e9b8c2f20607d9a48163e2c65748e90de46aaf85ab51b276790abfb09316fd719d355570f5287bfe64 # g_scalar = n - 120 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fb r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, ac678a7865e25b379e40a6c0acd1f133c36985b9b3c8225b33419045c88737c67618c264ab283c770c8e99083f75edc8 # g_scalar = n - 119 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fc r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, 4e9ac9d775bf5a3265e44e536dde485c146135436ef6481a298859b7662370b84d24690cf930631489ec9f3fa00ae490 # g_scalar = n - 118 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fd r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, 546c7955b5c108186699c66069c511df0caadb2f4bbafe3353ec47eb620c028bf87e6b6c22a321dcf7382a5e694f97b0 # g_scalar = n - 117 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fe r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 8faf654f7d4f688c85ab9a7d400ea7a4598d64724d867b7e92663fa0f95109fe3934c5b31473fa846bf8985f51aceeb2 # g_scalar = n - 116 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528ff r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, 3f52d8fea7e3993a82fb0a4636ef3bfd01f7b3c0d9657c7d7e64e9a13ed8e9a24b6aeb0e16771d06f5e3834263499cfc # g_scalar = n - 115 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52900 r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, 3f3a420930a5ee248afd61cd30ede0fc2065cbc509ced139ff23c6477b75a478c140e24d13851dbecef948056a236155 # g_scalar = n - 114 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52901 r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, f338e5cdf43b9b91b66b98c79dfb532f935f8addb23b5a1725af72187ac62ace0b58d896d4e3b0bac6f969582b773385 # g_scalar = n - 113 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52902 r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, 5ef4c20daa086bb4c2f12e83ce4788a84080212603ce449896678dd5184edfd5463ff80d2999b2fbcd87ade96e250941 # g_scalar = n - 112 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52903 r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, 07d446bbba12dfb2465e614a83e7debeb8c197883557b977c1811bc5d13895e7e958e332f493b39b57e746425ea39593 # g_scalar = n - 111 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52904 r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, f6358897f7d8625639b4b847dcff260133071e06b514d97a5d00ab436c3cd9e5ef6a411a1cfa0469552205fd0b633a90 # g_scalar = n - 110 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52905 r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, 3a600687ef91f740488a5078961bbddf9e28d8d18a3fa9b5406386e38916beadabd914f900eb7ef4053d8f0e8f351c5a # g_scalar = n - 109 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52906 r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, 0b3b93a9e67388fa781e65b180838a978a52cc350a5ebee2d24a804b0a9f250aca3226f3abd6b3faa4c6e8ee15acc519 # g_scalar = n - 108 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52907 r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 9d656f406511cfc08b664ce6e12f221cc3a74a19c3bffdb67b27e171992bac6e567a255c91b54316d892e8f1bfc7c314 # g_scalar = n - 107 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52908 r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, ae7d58e8d503120d1e26608738bc71c66a2952ba479a6b9cb77c8b2e5d80c05f7bb038641be6c2860b36aa1e09b812fd # g_scalar = n - 106 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52909 r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, 0e396ebe68e2e2a44a5ce29540ef369ff960b81ef512e7b4e1f467d4b9cd0f5af83cb47d7e4e82c85099312a2a6feaa2 # g_scalar = n - 105 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290a r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, 33c518d392768c5a31450ebaead0e6dc2c2a856ab8dfda9fc8d3dc5656e000725a30c9af5652ec94829810a0266fd747 # g_scalar = n - 104 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290b r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, 12cf98f9c880fb304f9bcbcdb1d380890a0bf8ce1470123e0caec3c46361a0625c462290dcf3d0ac1df90ec569277518 # g_scalar = n - 103 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290c r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, f3618ec88d8c2412291d2a59d21bfaad9fe42e3ca7052e3c681444b12790b201e5ad1b1719d191f40b5a7d7e6da40f25 # g_scalar = n - 102 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290d r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 9f5b2dd5d9095a20b3937037c7e8aefa5b80425c412a1ada6172a1f445c5fdc4ab9b4514e4c8c458d576509b865161f9 # g_scalar = n - 101 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290e r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 8c78d2c9e8fd1e216f649a90bdf13efb58c1e2650ac17fabe010be7af529796b001223dde2983fb26ebe6c4093708b17 # g_scalar = n - 100 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290f r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, 12396f36fc1d034d75751338b50246d6ef016d9f8afcb08dd5b22cabcc25394a75eb8dbfb6dd6680b581a6ca09f8ae9c # g_scalar = n - 99 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52910 r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, fc1e9674cdd29c42e08b6c4e89e6f2672908a6272e5f15f7998aec708f7db81d01cf69217e5f5c72fb0b7a8aa2733b5a # g_scalar = n - 98 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52911 r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, 588efb43001fde0cb63e8243d9d7df8c846959120049ed20ffc36e0aab1162a528fdfb218f772d25a02f6b017b751bed # g_scalar = n - 97 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52912 r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 7c3948713b0fcff9b3c1db6e3b0a969b34b81b1287765c61282db10bcf1fa22b1b14aaec2979a40bffafae16e38c4a67 # g_scalar = n - 96 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52913 r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, 4da80493a5bbcb5b311f7bd0a2a97f47062e615f37cedab47abac690cfa11b0eaf81dbf9822783c6991e2a26278d67b1 # g_scalar = n - 95 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52914 r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, 4492b45abd20d7919ac9b212aa546c0673f09b17c4384a6eba33c0eb22660603afa0181302869e8221871bcfa06c4a6d # g_scalar = n - 94 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52915 r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 7bc3be41639313209fef39c6248c25eefc0b0623143223f782ea0dbc32343506879cd4b6bf767610a7a492e83e606dec # g_scalar = n - 93 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52916 r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, 3f8e0c70994062f638e4c6ab6f5d971aa8d5bda48e98f234018357efc34f9966261cfc071fc54486e9231d377a0d3581 # g_scalar = n - 92 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52917 r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, c1f7f4cae5df901da1bc3e946f0c72e2c2125f7d57596e065b2978e2b8d52dcd31169bb7d9356b23551529f1d234dcf9 # g_scalar = n - 91 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52918 r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, b83538fc0ee9391df4f64c4265477b8734871f379c5d345ff62f4cce6dc9cbc12fed7ee4c021d39266e3ae99f038aea7 # g_scalar = n - 90 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52919 r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 6031b8801482c98e1001a0af8dd013512114cc6ed63b8db6ad0d3541ec292413dc3151d601531272d0e9e5f8a1ab691a # g_scalar = n - 89 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291a r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, fe3816c64720c80ce2d7dbcabf469d26eb88fef6f4b21b3f9a330faed255dac2879e48e3df6c30811a79a3b2fde8e771 # g_scalar = n - 88 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291b r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, 3be5902bcea7c2ade50d59ce11e7a67cbd7b9ae3c198db4bf80683e20745bcfc590ac7b2d0a332efb4bf33481c7b8873 # g_scalar = n - 87 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291c r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 60fb90511669019742537e77f184b248ce6bbe8a18aa60f62120dbab067b576fe7db928a586f697e96f1193940cd990d # g_scalar = n - 86 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291d r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, bc29e690721b7a85ebc3917cd36d209e5cd08f195f3c1e5a8566ef2afe3b86975b01a09f54df4c80f281bb0e764997f9 # g_scalar = n - 85 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291e r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 93de726d366c0dec5dce7c601d76ae6a3c2baa2dd350ad0d8bdd58d5f4141ceac6d551fc8e04169618304528ff243ea8 # g_scalar = n - 84 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291f r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, c1a39004c52046be23675426bcbe02b6781c1cb2727eba5feb1a8d0de33161f1600347ae28364a4f7f3f276fb2237d89 # g_scalar = n - 83 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52920 r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 88c201259631e30648d5832fa9c3871bf55d9d45ddae432530de56a8b619fbd5b1c3ec8e9ff69bc13ca85b76ec268f3c # g_scalar = n - 82 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52921 r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 9ff65a61432cf2d79614842d0111801a128c900058cb66b01bf2fb109f97aed67b05c629b44ff8449b961eba485c5d2d # g_scalar = n - 81 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52922 r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 6228489f68ba4781a21c729c51d8f958fefb85a11a22d872a9522d0fe70d9c816a65eb2a8c905dbf1ef7c3e93c7da7b0 # g_scalar = n - 80 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52923 r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, acf544bdf9eb5906469f4a101132751bdbecf9c5ec87197043856fc39b7b9be1671680e226dc9c88ff3dec4503318195 # g_scalar = n - 79 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52924 r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, b468d707e2854daa6be399360cfd7e069e84cfe4f79cd14cbfcdbc161146a13d5fad14c0cd88aaadcf087c75594f4e9c # g_scalar = n - 78 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52925 r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, c186abde517042932b85fcf8b1c370d37bdc719b3b585b043b78f3624319ffcb939d400bd3ba155366c5cfd3dc231ac9 # g_scalar = n - 77 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52926 r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, 2bb4ef8acfd302d1319e3c1aa8d6be5922fc6affcf36304deaff7af1b602c3c1cb3281d00cb2e2dc88b2345c13e06e23 # g_scalar = n - 76 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52927 r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, 1878e3cec6c847f09be8d23ce6fe11ddbe445e6ee45c22f9585965db1b07aa3f6914734b9fcd9c064015190e08e5438b # g_scalar = n - 75 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52928 r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, 02bd279dbe829a9d2878ffbd6a801bba9b1dc61c0fbfd1e2989d5496bcf5128d5ace3d3aaf0546fed59aa11fec605d83 # g_scalar = n - 74 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52929 r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, 53cf2923ca46546146228db7428f7a38a5581a9c35e612f0dba73610ec30dd42ca22922f8eda2e960f8b41171022d4bf # g_scalar = n - 73 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292a r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 909a50c483675e9df4ea8bfc78479c8cfb1de1fc6dd9a5a650603784b0e2de90607649281e1729e95702c6411e0dbbdb # g_scalar = n - 72 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292b r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, ced3e2d0c97db2c54fef5323f68505de87ab07433c0f52c5384bc9e6546988b866326235288bc8f68aaa33871896c4e1 # g_scalar = n - 71 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292c r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, 065815d78cd52fe34246db11f8ec6a99debb250e319bc8c5eab0d7afda4c1ce57986c3b1f7feadc295bb2f7c22137c39 # g_scalar = n - 70 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292d r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, bbc20af538b960b5a3a666e82c5892143bf889a8303249483375299a738da5821d5d4f65989e1ac760fbea436400d5cb # g_scalar = n - 69 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292e r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, 0432feffd8e2428590d361748ce985cdf53111b77d1299432ec51b76d42bdc5aa889629cba2c66b2fca521d883f3aa31 # g_scalar = n - 68 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292f r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, 2b984f17d03b99c1263a29e0f60970b3d64fb6a881f035febd88176d8fcf3364a656197694e18dc03fd1299e8683382b # g_scalar = n - 67 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52930 r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 7cdd34755386b66bf695940fec9d3a06a66f48b939143ffce581ca12c0a61b42efb54e58bd87a2f9ad89c485f5ef612e # g_scalar = n - 66 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52931 r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, 4d78416af80aa2fb6d4b7f1128f293c5902cce5c4f2a515ab12c02e6d597baf65a7f2fbe3d3776f8930dfc5adf64cc92 # g_scalar = n - 65 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52932 r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, 1590dad75aa44e365d7993db37060f78e689c292776299225487b4d321d43d98495b787bc5266a2cf1e927c3cf038606 # g_scalar = n - 64 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52933 r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 77748f746bfb35aec11ed876a132c01792683543cfe01da601ae4440ef6f0120f02e3ad10f6e43fe4dec3960cf56cda4 # g_scalar = n - 63 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52934 r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, ad44c8ed5f5976170a508471c8ca20dd237642b6682bfb72c44fcb17772e80e572c5a09ce13284e5c4493e0be7dfd37f # g_scalar = n - 62 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52935 r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, f6fd33dceb6bb947353cdb137d3b0558c2daf76dd456dc649a9f61a62600f544a0a164df29cf3eba509dc2c1de25b2bd # g_scalar = n - 61 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52936 r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, 3b33eebae03967d64f59388dfeb992dcf225e6001ad8a898195877ac8f2cfc13c6b2cd3195160b5399bf0ee982c7ed99 # g_scalar = n - 60 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52937 r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 722de40f4b15b0aed603c4d7b76d198944ba5ae06b757c8a5328f47952d5df020f1f0b07197d55d6f606d524e914846a # g_scalar = n - 59 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52938 r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, 00cc90edafb9aa3e692645f4261c35e6904cb4cfd7b9c3315330d12284fa68fbbe4248bd4cca100f20f3d552c5add041 # g_scalar = n - 58 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52939 r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, d4ae66a086b256fe3f7a6a1caab704151ee96616f605a75e4a0ea855a964a826474b535f057fc7f560c08456e6d6198a # g_scalar = n - 57 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293a r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, f57dc465b4d9209c2d1ecfaad6ad3e0370bd843b8c37e2a4f29f454817f65ec288773da65e8c849a5efe5b7d548b4fa2 # g_scalar = n - 56 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293b r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, ce009b71f07747d2a901000cd90cb631fa7d9e6db6f44a8d49dc5e5114733de2d7e8619237ad09b42ebedca4aac04be2 # g_scalar = n - 55 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293c r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 8b9fda8ceb31112b956e18c6682f05f9e8394a3441dccb07721cef83c2f8609d7d50dc54e7f59c58b1421183d7e0877b # g_scalar = n - 54 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293d r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, bdf1498c6f95d6b69161794484e14885e51e22682ecbbb44f40786296c4bb1587244a8e288032e0bcbf58990cb52125c # g_scalar = n - 53 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293e r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, 120d1c1481336b7a5236c265b7e89a1d2d38e52ec6f9669ca8795e65b1d057c014139bbcf7610574d5dfab4c6a9e7afe # g_scalar = n - 52 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293f r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, 3a33cc62345e02b4dddb9a7991a121896f1d51528087550792f5e99312c3c484f576cf02edf74605561a50c4351f80ea # g_scalar = n - 51 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52940 r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, ae74fb823455f268396b761dc8c0e5f2f4ddbfffc37782c925153f3ca8fabc0ecdb2f9808ca622ca523e74074e9137b0 # g_scalar = n - 50 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52941 r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 90a705748e7e3d5e90840581ec5b08293e4bbbec6ccc1bfa9edb9bd0f0cd4ead208238f9cfb7b9e57c560e82cf73baba # g_scalar = n - 49 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52942 r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, d2e33ae71d74d42488e19bbea4a841d0db78122a807d422c03bb7911b63614167293e8b02db682b7ceec38bdec4da8ed # g_scalar = n - 48 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52943 r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, d8e1bd5ed9db5a7cb7154ff14a36b9d3d9fa35ff625d5d35a3c35ef2fb454679ba7f9f615899220ec2cf9da2a0010ced # g_scalar = n - 47 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52944 r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, 536201382058d574110ff96ed1df03dc20115e5d9a1f036e079a9d576704caff638fe8a6db630648b7851743ddbc812e # g_scalar = n - 46 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52945 r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, 03ac614c1da6382437d2a66713f6f2f9e6547fdceb14b546285e675be7a57b625ea6f3ce130a79bc9f104eec8023d285 # g_scalar = n - 45 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52946 r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, bd14d686247c5b7ae8b888dd42d50e61e906998948dcb16c14c4bb561a4a96e69d4d0abbae0335c070778729911127a2 # g_scalar = n - 44 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52947 r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, a04d71cdd5e228c45219f692fd1abc51b8987504d822571a397fe89afa3852928337d5b10e96704d3ccc9ccf44527cb9 # g_scalar = n - 43 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52948 r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 70c0e09c369cd487568b4f6bea3406b755071f0942f9d72043187556121ceb43e4811bd18b61ab67308603e5c9450e58 # g_scalar = n - 42 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52949 r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, 2497d63d0ffd4491affd6a97b8d58e8a18c6049e1559889cda2f355125e1520af26a645586926ed679c5dc5d5aac171c # g_scalar = n - 41 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294a r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 7d158fd114e70e3a9866ad382e6cd8d14236293cb060a765a879f31ede9b90cda5389d1ef0c362915d01d3b97d14dc1d # g_scalar = n - 40 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294b r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, 2026d49256eb44fe244dd362214b91939c5ff5f59f1f55d567007808c8f148bae207337a59615c5cab4632734a6c27e9 # g_scalar = n - 39 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294c r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, d2843ed7f8b69704e56acaa0e329fcbf49b91bacbc92601dcba3aac54aceac4684d4f54b17d6b8b8b3f9c7b9958e5185 # g_scalar = n - 38 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294d r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, e0b9996badf9e70ded641ceb68bcdf5b0cff1e39b7cb8065251db867bb6a946b783e7c3b1e5f1f936e50d916543ecb77 # g_scalar = n - 37 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294e r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, 05f1f848017a407ad7b0344a9c735cc84af9b6576bfb82e0d156edbca2d35fcad0e9bc29eba6b411936e3f37741aa761 # g_scalar = n - 36 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294f r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, 096677847f9f7a4820cc112848cbfe4e95cda713cc0aa98aefdf6be73e9802dee2ee43a0291d7ec7a68120c9f04f8843 # g_scalar = n - 35 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52950 r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, 4ec57527cf1dc0d953757880ad332ca3dd0e6054d70ca111affe7667677f6d5cf31e7f765aa1f6a9014fd917c2114ad5 # g_scalar = n - 34 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52951 r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, 569b110402522db1fc3faf5f9eadf8d9fd2ff30475894d2961ebe75baabaa83bb8f22396075a80b7143425f97925c6bc # g_scalar = n - 33 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52952 r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, 5802d49e6fa8252890336c5e473cef8d75be91464490f545f7b98315b746f46dec409eda3df61aa18028c172c59da189 # g_scalar = n - 32 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52953 r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, 3aef526c554356608c4bd8da4ca4b00fb434f90ff5dc884988cea0616bb702f65c8d203c0d5ad402eeb7438e9783df44 # g_scalar = n - 31 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52954 r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, b8a5c18a9c675e62a4c2f292c941133b2822b9b0fba585e3bfd56454bd14df2143f59663c8b3b4f72547cd78ed803e25 # g_scalar = n - 30 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52955 r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 6bed6d1aff07734d0a96bb95d8aaa96d693de4d6095e980dcee822fb2b85be22e7b9110222c14ea92393a2e33ed8b75e # g_scalar = n - 29 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52956 r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, e2d5e3fea6880e93090a818e6f37dfcc71924ef4bfbafa0454e872d93317ae4bd6c3e9b5df37c21de5ad7b6079a2212c # g_scalar = n - 28 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52957 r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, fa3235c018677e8986dc880407147ce63b71190c4fcc3eede7b42b8cc52967c46008963a78a011f00e43764ad7188061 # g_scalar = n - 27 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52958 r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, e87df5f43aecb12898198e6a2bb2c32082d9abf9c737a57a28865201ce25e414a7592809961d070bbd552e2ae4971607 # g_scalar = n - 26 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959 r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, b82675620f6ddbe340d3f79d9683f702a2aed20662bd58d8da3846eb90a0db3724c0bdd16a1e92911225b51c7570a234 # g_scalar = n - 25 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295a r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, e01904bd1687f62325c1e5c2b3143691295d0ae21571bcbbfe9d70fa6bdb5c327c3343b06ff61c6e66bb02d29eedb0fa # g_scalar = n - 24 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295b r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, eaf7f719da5cfd36ec6a5786995b16fb17d88bc65f0652c520aa8605b4157d216727d52d25db813776f6cd2942c2ef3c # g_scalar = n - 23 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295c r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 620334f21ddedaa6d7d2dbc8a998e73e0fec76af150dd38185275ecd5ad83140f4335c0e59a1b7ec803cc59513ad5452 # g_scalar = n - 22 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295d r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 98e2963670327be7af037b8dea7f6322389b1207bf2f030884e54b763407c8470629d02536a89396b2e3cfb70558e023 # g_scalar = n - 21 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295e r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, de7db0beecac3345d9952ea55315a7e84babeee17ad832a6d9d144b675eb6f66558bf560c70e84157febdeb5ff73a218 # g_scalar = n - 20 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295f r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, 546227efad1404fea1fe48d4b8e74438bdd259bc0019ecd466cc04da2332b20bda0ab953cde7d7001d85e76c9f2b249f # g_scalar = n - 19 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52960 r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, 5e2b84dc16a8889bea2e23887d9b498dc0a586644980cf3c6e8f4c87900d09bb5738d2c23c25d153b94871a34f23de2f # g_scalar = n - 18 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52961 r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 6e8ff4db814e419c642295f6d6ba58a8900303835b3026443d99147bbeed67a6ab47984708755821759f8e818a39baec # g_scalar = n - 17 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52962 r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, 53c86790aa4e9b36da14a20e4c3d98850782927ab5abafb5b631966ccc940e7bb1dc48ff2a463f25c033963393ed0faa # g_scalar = n - 16 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52963 r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 9a624b7e7e10daecae3cfa3958d2e6984ccc420437711eb76eb78e23eab2beef14f82214dcf30ff264de9ea1105435d9 # g_scalar = n - 15 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52964 r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, a59739012f43d8e978cc03bebff3a8682223d79927670b8fb4dc2c5f21f99ef29e9f6341ebb42a79dcf6336390167644 # g_scalar = n - 14 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52965 r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, bbd67c622104520a9b82db24ec96f58b8dbbacba263c496ee1337a7a1ee2443fabf4747c8cf5662e41b4b570fc34971a # g_scalar = n - 13 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52966 r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, b9e852483396861e7e0242e3c4b6f13c480153d2013c729f8765d5b730b2f01b271770e478351f3d0b2c6ba793c27ed2 # g_scalar = n - 12 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52967 r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, f391bcf1063b50c2fcd6154e086bd0f1bf39b5b199412a5073867b702f1efd527f29f508d8559ae50533ba1c741aa127 # g_scalar = n - 11 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52968 r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 6559d060cacc06e7be7de2f3c5acd785d1f8f0c9016197d1c317ecd67588187e9fb01b9353ebb47c89b14eba423b45da # g_scalar = n - 10 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969 r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 91466a4137fe8b17c1fcc8f5b85647557e69e473302802e2a6d53f4586b15401fc5acf13ec4617a34468e0881984a031 # g_scalar = n - 9 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296a r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, 188f9ccbce170a39826bd60b119658ab5913533397152f27d80f9e38fcc3583cc8881d8e28bd55d00d7ecf8e4e713f4f # g_scalar = n - 8 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296b r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, c3f39228f2d8109e8ff726bc3b7130f1166dcd9c5bd2445d8fe8ab408279791a7c9244c8481aa178f2d3017d199aa5bb # g_scalar = n - 7 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296c r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, 26f5e949509364c10a80dc7196c4f8f9f00c83fbfe00087f9a552890afecf7baecacb629579be386f6694de088f959e1 # g_scalar = n - 6 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296d r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, 3669dead50d56145a792712120deaa656c361a09e4ab90fa742b40034861cc4e8c653961a4c2b231c09d4e92584f7dfc # g_scalar = n - 5 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296e r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, b24e36291df61b5c193a6bbfdb21dc92b4dc805067d3fbee7f49e4cefe3ca465dd3e91d08d0cba99d496b4608f8c05de # g_scalar = n - 4 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296f r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, af6b978acfc20ce619f8461cc7dffe82eb8e9d2cfbe7396c71c19e5cb3abd52d18b4480d84013681ab0c171964c5fc4d # g_scalar = n - 3 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, b9ab9a0367cd6d500924974eaefd4cc697fed2a52d1e2f4becd99c3fb1098bb86d287657851f1c9281d7b7df3fb11ea8 # g_scalar = n - 2 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # g_scalar = n - 1 g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 ring-0.16.9/src/ec/suite_b/ops/p384_point_mul_tests.txt000064400000000000000000005511671352331573000211350ustar0000000000000000 p_scalar = 00 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = inf p_scalar = 01 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 p_scalar = 02 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 p_scalar = 03 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, b9ab9a0367cd6d500924974eaefd4cc697fed2a52d1e2f4becd99c3fb1098bb86d287657851f1c9281d7b7df3fb11ea8 p_scalar = 04 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, af6b978acfc20ce619f8461cc7dffe82eb8e9d2cfbe7396c71c19e5cb3abd52d18b4480d84013681ab0c171964c5fc4d p_scalar = 05 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, b24e36291df61b5c193a6bbfdb21dc92b4dc805067d3fbee7f49e4cefe3ca465dd3e91d08d0cba99d496b4608f8c05de p_scalar = 06 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, 3669dead50d56145a792712120deaa656c361a09e4ab90fa742b40034861cc4e8c653961a4c2b231c09d4e92584f7dfc p_scalar = 07 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, 26f5e949509364c10a80dc7196c4f8f9f00c83fbfe00087f9a552890afecf7baecacb629579be386f6694de088f959e1 p_scalar = 08 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, c3f39228f2d8109e8ff726bc3b7130f1166dcd9c5bd2445d8fe8ab408279791a7c9244c8481aa178f2d3017d199aa5bb p_scalar = 09 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, 188f9ccbce170a39826bd60b119658ab5913533397152f27d80f9e38fcc3583cc8881d8e28bd55d00d7ecf8e4e713f4f p_scalar = 0a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 91466a4137fe8b17c1fcc8f5b85647557e69e473302802e2a6d53f4586b15401fc5acf13ec4617a34468e0881984a031 p_scalar = 0b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 6559d060cacc06e7be7de2f3c5acd785d1f8f0c9016197d1c317ecd67588187e9fb01b9353ebb47c89b14eba423b45da p_scalar = 0c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, f391bcf1063b50c2fcd6154e086bd0f1bf39b5b199412a5073867b702f1efd527f29f508d8559ae50533ba1c741aa127 p_scalar = 0d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, b9e852483396861e7e0242e3c4b6f13c480153d2013c729f8765d5b730b2f01b271770e478351f3d0b2c6ba793c27ed2 p_scalar = 0e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, bbd67c622104520a9b82db24ec96f58b8dbbacba263c496ee1337a7a1ee2443fabf4747c8cf5662e41b4b570fc34971a p_scalar = 0f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, a59739012f43d8e978cc03bebff3a8682223d79927670b8fb4dc2c5f21f99ef29e9f6341ebb42a79dcf6336390167644 p_scalar = 10 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 9a624b7e7e10daecae3cfa3958d2e6984ccc420437711eb76eb78e23eab2beef14f82214dcf30ff264de9ea1105435d9 p_scalar = 11 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, 53c86790aa4e9b36da14a20e4c3d98850782927ab5abafb5b631966ccc940e7bb1dc48ff2a463f25c033963393ed0faa p_scalar = 12 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 6e8ff4db814e419c642295f6d6ba58a8900303835b3026443d99147bbeed67a6ab47984708755821759f8e818a39baec p_scalar = 13 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, 5e2b84dc16a8889bea2e23887d9b498dc0a586644980cf3c6e8f4c87900d09bb5738d2c23c25d153b94871a34f23de2f p_scalar = 14 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, 546227efad1404fea1fe48d4b8e74438bdd259bc0019ecd466cc04da2332b20bda0ab953cde7d7001d85e76c9f2b249f p_scalar = 15 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, de7db0beecac3345d9952ea55315a7e84babeee17ad832a6d9d144b675eb6f66558bf560c70e84157febdeb5ff73a218 p_scalar = 16 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 98e2963670327be7af037b8dea7f6322389b1207bf2f030884e54b763407c8470629d02536a89396b2e3cfb70558e023 p_scalar = 17 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 620334f21ddedaa6d7d2dbc8a998e73e0fec76af150dd38185275ecd5ad83140f4335c0e59a1b7ec803cc59513ad5452 p_scalar = 18 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, eaf7f719da5cfd36ec6a5786995b16fb17d88bc65f0652c520aa8605b4157d216727d52d25db813776f6cd2942c2ef3c p_scalar = 19 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, e01904bd1687f62325c1e5c2b3143691295d0ae21571bcbbfe9d70fa6bdb5c327c3343b06ff61c6e66bb02d29eedb0fa p_scalar = 1a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, b82675620f6ddbe340d3f79d9683f702a2aed20662bd58d8da3846eb90a0db3724c0bdd16a1e92911225b51c7570a234 p_scalar = 1b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, e87df5f43aecb12898198e6a2bb2c32082d9abf9c737a57a28865201ce25e414a7592809961d070bbd552e2ae4971607 p_scalar = 1c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, fa3235c018677e8986dc880407147ce63b71190c4fcc3eede7b42b8cc52967c46008963a78a011f00e43764ad7188061 p_scalar = 1d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, e2d5e3fea6880e93090a818e6f37dfcc71924ef4bfbafa0454e872d93317ae4bd6c3e9b5df37c21de5ad7b6079a2212c p_scalar = 1e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 6bed6d1aff07734d0a96bb95d8aaa96d693de4d6095e980dcee822fb2b85be22e7b9110222c14ea92393a2e33ed8b75e p_scalar = 1f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, b8a5c18a9c675e62a4c2f292c941133b2822b9b0fba585e3bfd56454bd14df2143f59663c8b3b4f72547cd78ed803e25 p_scalar = 20 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, 3aef526c554356608c4bd8da4ca4b00fb434f90ff5dc884988cea0616bb702f65c8d203c0d5ad402eeb7438e9783df44 p_scalar = 21 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, 5802d49e6fa8252890336c5e473cef8d75be91464490f545f7b98315b746f46dec409eda3df61aa18028c172c59da189 p_scalar = 22 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, 569b110402522db1fc3faf5f9eadf8d9fd2ff30475894d2961ebe75baabaa83bb8f22396075a80b7143425f97925c6bc p_scalar = 23 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, 4ec57527cf1dc0d953757880ad332ca3dd0e6054d70ca111affe7667677f6d5cf31e7f765aa1f6a9014fd917c2114ad5 p_scalar = 24 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, 096677847f9f7a4820cc112848cbfe4e95cda713cc0aa98aefdf6be73e9802dee2ee43a0291d7ec7a68120c9f04f8843 p_scalar = 25 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, 05f1f848017a407ad7b0344a9c735cc84af9b6576bfb82e0d156edbca2d35fcad0e9bc29eba6b411936e3f37741aa761 p_scalar = 26 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, e0b9996badf9e70ded641ceb68bcdf5b0cff1e39b7cb8065251db867bb6a946b783e7c3b1e5f1f936e50d916543ecb77 p_scalar = 27 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, d2843ed7f8b69704e56acaa0e329fcbf49b91bacbc92601dcba3aac54aceac4684d4f54b17d6b8b8b3f9c7b9958e5185 p_scalar = 28 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, 2026d49256eb44fe244dd362214b91939c5ff5f59f1f55d567007808c8f148bae207337a59615c5cab4632734a6c27e9 p_scalar = 29 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 7d158fd114e70e3a9866ad382e6cd8d14236293cb060a765a879f31ede9b90cda5389d1ef0c362915d01d3b97d14dc1d p_scalar = 2a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, 2497d63d0ffd4491affd6a97b8d58e8a18c6049e1559889cda2f355125e1520af26a645586926ed679c5dc5d5aac171c p_scalar = 2b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 70c0e09c369cd487568b4f6bea3406b755071f0942f9d72043187556121ceb43e4811bd18b61ab67308603e5c9450e58 p_scalar = 2c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, a04d71cdd5e228c45219f692fd1abc51b8987504d822571a397fe89afa3852928337d5b10e96704d3ccc9ccf44527cb9 p_scalar = 2d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, bd14d686247c5b7ae8b888dd42d50e61e906998948dcb16c14c4bb561a4a96e69d4d0abbae0335c070778729911127a2 p_scalar = 2e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, 03ac614c1da6382437d2a66713f6f2f9e6547fdceb14b546285e675be7a57b625ea6f3ce130a79bc9f104eec8023d285 p_scalar = 2f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, 536201382058d574110ff96ed1df03dc20115e5d9a1f036e079a9d576704caff638fe8a6db630648b7851743ddbc812e p_scalar = 30 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, d8e1bd5ed9db5a7cb7154ff14a36b9d3d9fa35ff625d5d35a3c35ef2fb454679ba7f9f615899220ec2cf9da2a0010ced p_scalar = 31 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, d2e33ae71d74d42488e19bbea4a841d0db78122a807d422c03bb7911b63614167293e8b02db682b7ceec38bdec4da8ed p_scalar = 32 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 90a705748e7e3d5e90840581ec5b08293e4bbbec6ccc1bfa9edb9bd0f0cd4ead208238f9cfb7b9e57c560e82cf73baba p_scalar = 33 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, ae74fb823455f268396b761dc8c0e5f2f4ddbfffc37782c925153f3ca8fabc0ecdb2f9808ca622ca523e74074e9137b0 p_scalar = 34 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, 3a33cc62345e02b4dddb9a7991a121896f1d51528087550792f5e99312c3c484f576cf02edf74605561a50c4351f80ea p_scalar = 35 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, 120d1c1481336b7a5236c265b7e89a1d2d38e52ec6f9669ca8795e65b1d057c014139bbcf7610574d5dfab4c6a9e7afe p_scalar = 36 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, bdf1498c6f95d6b69161794484e14885e51e22682ecbbb44f40786296c4bb1587244a8e288032e0bcbf58990cb52125c p_scalar = 37 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 8b9fda8ceb31112b956e18c6682f05f9e8394a3441dccb07721cef83c2f8609d7d50dc54e7f59c58b1421183d7e0877b p_scalar = 38 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, ce009b71f07747d2a901000cd90cb631fa7d9e6db6f44a8d49dc5e5114733de2d7e8619237ad09b42ebedca4aac04be2 p_scalar = 39 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, f57dc465b4d9209c2d1ecfaad6ad3e0370bd843b8c37e2a4f29f454817f65ec288773da65e8c849a5efe5b7d548b4fa2 p_scalar = 3a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, d4ae66a086b256fe3f7a6a1caab704151ee96616f605a75e4a0ea855a964a826474b535f057fc7f560c08456e6d6198a p_scalar = 3b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, 00cc90edafb9aa3e692645f4261c35e6904cb4cfd7b9c3315330d12284fa68fbbe4248bd4cca100f20f3d552c5add041 p_scalar = 3c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 722de40f4b15b0aed603c4d7b76d198944ba5ae06b757c8a5328f47952d5df020f1f0b07197d55d6f606d524e914846a p_scalar = 3d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, 3b33eebae03967d64f59388dfeb992dcf225e6001ad8a898195877ac8f2cfc13c6b2cd3195160b5399bf0ee982c7ed99 p_scalar = 3e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, f6fd33dceb6bb947353cdb137d3b0558c2daf76dd456dc649a9f61a62600f544a0a164df29cf3eba509dc2c1de25b2bd p_scalar = 3f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, ad44c8ed5f5976170a508471c8ca20dd237642b6682bfb72c44fcb17772e80e572c5a09ce13284e5c4493e0be7dfd37f p_scalar = 40 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 77748f746bfb35aec11ed876a132c01792683543cfe01da601ae4440ef6f0120f02e3ad10f6e43fe4dec3960cf56cda4 p_scalar = 41 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, 1590dad75aa44e365d7993db37060f78e689c292776299225487b4d321d43d98495b787bc5266a2cf1e927c3cf038606 p_scalar = 42 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, 4d78416af80aa2fb6d4b7f1128f293c5902cce5c4f2a515ab12c02e6d597baf65a7f2fbe3d3776f8930dfc5adf64cc92 p_scalar = 43 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 7cdd34755386b66bf695940fec9d3a06a66f48b939143ffce581ca12c0a61b42efb54e58bd87a2f9ad89c485f5ef612e p_scalar = 44 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, 2b984f17d03b99c1263a29e0f60970b3d64fb6a881f035febd88176d8fcf3364a656197694e18dc03fd1299e8683382b p_scalar = 45 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, 0432feffd8e2428590d361748ce985cdf53111b77d1299432ec51b76d42bdc5aa889629cba2c66b2fca521d883f3aa31 p_scalar = 46 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, bbc20af538b960b5a3a666e82c5892143bf889a8303249483375299a738da5821d5d4f65989e1ac760fbea436400d5cb p_scalar = 47 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, 065815d78cd52fe34246db11f8ec6a99debb250e319bc8c5eab0d7afda4c1ce57986c3b1f7feadc295bb2f7c22137c39 p_scalar = 48 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, ced3e2d0c97db2c54fef5323f68505de87ab07433c0f52c5384bc9e6546988b866326235288bc8f68aaa33871896c4e1 p_scalar = 49 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 909a50c483675e9df4ea8bfc78479c8cfb1de1fc6dd9a5a650603784b0e2de90607649281e1729e95702c6411e0dbbdb p_scalar = 4a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, 53cf2923ca46546146228db7428f7a38a5581a9c35e612f0dba73610ec30dd42ca22922f8eda2e960f8b41171022d4bf p_scalar = 4b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, 02bd279dbe829a9d2878ffbd6a801bba9b1dc61c0fbfd1e2989d5496bcf5128d5ace3d3aaf0546fed59aa11fec605d83 p_scalar = 4c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, 1878e3cec6c847f09be8d23ce6fe11ddbe445e6ee45c22f9585965db1b07aa3f6914734b9fcd9c064015190e08e5438b p_scalar = 4d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, 2bb4ef8acfd302d1319e3c1aa8d6be5922fc6affcf36304deaff7af1b602c3c1cb3281d00cb2e2dc88b2345c13e06e23 p_scalar = 4e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, c186abde517042932b85fcf8b1c370d37bdc719b3b585b043b78f3624319ffcb939d400bd3ba155366c5cfd3dc231ac9 p_scalar = 4f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, b468d707e2854daa6be399360cfd7e069e84cfe4f79cd14cbfcdbc161146a13d5fad14c0cd88aaadcf087c75594f4e9c p_scalar = 50 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, acf544bdf9eb5906469f4a101132751bdbecf9c5ec87197043856fc39b7b9be1671680e226dc9c88ff3dec4503318195 p_scalar = 51 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 6228489f68ba4781a21c729c51d8f958fefb85a11a22d872a9522d0fe70d9c816a65eb2a8c905dbf1ef7c3e93c7da7b0 p_scalar = 52 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 9ff65a61432cf2d79614842d0111801a128c900058cb66b01bf2fb109f97aed67b05c629b44ff8449b961eba485c5d2d p_scalar = 53 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 88c201259631e30648d5832fa9c3871bf55d9d45ddae432530de56a8b619fbd5b1c3ec8e9ff69bc13ca85b76ec268f3c p_scalar = 54 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, c1a39004c52046be23675426bcbe02b6781c1cb2727eba5feb1a8d0de33161f1600347ae28364a4f7f3f276fb2237d89 p_scalar = 55 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 93de726d366c0dec5dce7c601d76ae6a3c2baa2dd350ad0d8bdd58d5f4141ceac6d551fc8e04169618304528ff243ea8 p_scalar = 56 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, bc29e690721b7a85ebc3917cd36d209e5cd08f195f3c1e5a8566ef2afe3b86975b01a09f54df4c80f281bb0e764997f9 p_scalar = 57 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 60fb90511669019742537e77f184b248ce6bbe8a18aa60f62120dbab067b576fe7db928a586f697e96f1193940cd990d p_scalar = 58 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, 3be5902bcea7c2ade50d59ce11e7a67cbd7b9ae3c198db4bf80683e20745bcfc590ac7b2d0a332efb4bf33481c7b8873 p_scalar = 59 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, fe3816c64720c80ce2d7dbcabf469d26eb88fef6f4b21b3f9a330faed255dac2879e48e3df6c30811a79a3b2fde8e771 p_scalar = 5a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 6031b8801482c98e1001a0af8dd013512114cc6ed63b8db6ad0d3541ec292413dc3151d601531272d0e9e5f8a1ab691a p_scalar = 5b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, b83538fc0ee9391df4f64c4265477b8734871f379c5d345ff62f4cce6dc9cbc12fed7ee4c021d39266e3ae99f038aea7 p_scalar = 5c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, c1f7f4cae5df901da1bc3e946f0c72e2c2125f7d57596e065b2978e2b8d52dcd31169bb7d9356b23551529f1d234dcf9 p_scalar = 5d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, 3f8e0c70994062f638e4c6ab6f5d971aa8d5bda48e98f234018357efc34f9966261cfc071fc54486e9231d377a0d3581 p_scalar = 5e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 7bc3be41639313209fef39c6248c25eefc0b0623143223f782ea0dbc32343506879cd4b6bf767610a7a492e83e606dec p_scalar = 5f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, 4492b45abd20d7919ac9b212aa546c0673f09b17c4384a6eba33c0eb22660603afa0181302869e8221871bcfa06c4a6d p_scalar = 60 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, 4da80493a5bbcb5b311f7bd0a2a97f47062e615f37cedab47abac690cfa11b0eaf81dbf9822783c6991e2a26278d67b1 p_scalar = 61 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 7c3948713b0fcff9b3c1db6e3b0a969b34b81b1287765c61282db10bcf1fa22b1b14aaec2979a40bffafae16e38c4a67 p_scalar = 62 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, 588efb43001fde0cb63e8243d9d7df8c846959120049ed20ffc36e0aab1162a528fdfb218f772d25a02f6b017b751bed p_scalar = 63 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, fc1e9674cdd29c42e08b6c4e89e6f2672908a6272e5f15f7998aec708f7db81d01cf69217e5f5c72fb0b7a8aa2733b5a p_scalar = 64 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, 12396f36fc1d034d75751338b50246d6ef016d9f8afcb08dd5b22cabcc25394a75eb8dbfb6dd6680b581a6ca09f8ae9c p_scalar = 65 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 8c78d2c9e8fd1e216f649a90bdf13efb58c1e2650ac17fabe010be7af529796b001223dde2983fb26ebe6c4093708b17 p_scalar = 66 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 9f5b2dd5d9095a20b3937037c7e8aefa5b80425c412a1ada6172a1f445c5fdc4ab9b4514e4c8c458d576509b865161f9 p_scalar = 67 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, f3618ec88d8c2412291d2a59d21bfaad9fe42e3ca7052e3c681444b12790b201e5ad1b1719d191f40b5a7d7e6da40f25 p_scalar = 68 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, 12cf98f9c880fb304f9bcbcdb1d380890a0bf8ce1470123e0caec3c46361a0625c462290dcf3d0ac1df90ec569277518 p_scalar = 69 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, 33c518d392768c5a31450ebaead0e6dc2c2a856ab8dfda9fc8d3dc5656e000725a30c9af5652ec94829810a0266fd747 p_scalar = 6a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, 0e396ebe68e2e2a44a5ce29540ef369ff960b81ef512e7b4e1f467d4b9cd0f5af83cb47d7e4e82c85099312a2a6feaa2 p_scalar = 6b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, ae7d58e8d503120d1e26608738bc71c66a2952ba479a6b9cb77c8b2e5d80c05f7bb038641be6c2860b36aa1e09b812fd p_scalar = 6c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 9d656f406511cfc08b664ce6e12f221cc3a74a19c3bffdb67b27e171992bac6e567a255c91b54316d892e8f1bfc7c314 p_scalar = 6d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, 0b3b93a9e67388fa781e65b180838a978a52cc350a5ebee2d24a804b0a9f250aca3226f3abd6b3faa4c6e8ee15acc519 p_scalar = 6e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, 3a600687ef91f740488a5078961bbddf9e28d8d18a3fa9b5406386e38916beadabd914f900eb7ef4053d8f0e8f351c5a p_scalar = 6f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, f6358897f7d8625639b4b847dcff260133071e06b514d97a5d00ab436c3cd9e5ef6a411a1cfa0469552205fd0b633a90 p_scalar = 70 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, 07d446bbba12dfb2465e614a83e7debeb8c197883557b977c1811bc5d13895e7e958e332f493b39b57e746425ea39593 p_scalar = 71 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, 5ef4c20daa086bb4c2f12e83ce4788a84080212603ce449896678dd5184edfd5463ff80d2999b2fbcd87ade96e250941 p_scalar = 72 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, f338e5cdf43b9b91b66b98c79dfb532f935f8addb23b5a1725af72187ac62ace0b58d896d4e3b0bac6f969582b773385 p_scalar = 73 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, 3f3a420930a5ee248afd61cd30ede0fc2065cbc509ced139ff23c6477b75a478c140e24d13851dbecef948056a236155 p_scalar = 74 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, 3f52d8fea7e3993a82fb0a4636ef3bfd01f7b3c0d9657c7d7e64e9a13ed8e9a24b6aeb0e16771d06f5e3834263499cfc p_scalar = 75 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 8faf654f7d4f688c85ab9a7d400ea7a4598d64724d867b7e92663fa0f95109fe3934c5b31473fa846bf8985f51aceeb2 p_scalar = 76 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, 546c7955b5c108186699c66069c511df0caadb2f4bbafe3353ec47eb620c028bf87e6b6c22a321dcf7382a5e694f97b0 p_scalar = 77 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, 4e9ac9d775bf5a3265e44e536dde485c146135436ef6481a298859b7662370b84d24690cf930631489ec9f3fa00ae490 p_scalar = 78 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, ac678a7865e25b379e40a6c0acd1f133c36985b9b3c8225b33419045c88737c67618c264ab283c770c8e99083f75edc8 p_scalar = 79 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, ee51125e39b2f6e9b8c2f20607d9a48163e2c65748e90de46aaf85ab51b276790abfb09316fd719d355570f5287bfe64 p_scalar = 7a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, ebbee398404882a8094722669ec58cc4fd488003ef88503893198baf14b2b31e0f1096c5d6c0669988bbf6a48d72c11e p_scalar = 7b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 8b3b9d12e5867522fc4543133da330cc757954f0b670bb84a57d50c160cf08167c3945fa8f877360e41b28095e874626 p_scalar = 7c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, b6576363085ed416461662acc304f6746abb244d2b1491cefba31da3a16cdef2aa5b6ae337599a9840b2ec55b0eea403 p_scalar = 7d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 76cc400a8d0ca334832a58b44ff6a7fdaae0be43de6e7855130ac9be1ee6547020c048ce12b0aa5bde6ac2d6bee8f9e1 p_scalar = 7e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, f84cc9fd3a1e1353420c5b2e50458073066298ab1fb507aa068cd344b0be463beada14c64035692c55eec94a4f3b89db p_scalar = 7f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, 3816d59e1c6b7f960c297cd1c984d06b61d61cc652e7f4f1772dd5bb5b983ae5a9674240fe752a555591a623406bc306 p_scalar = 80 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, dc62354d5d8853a4d9a811225a86e31c4fe0e1fbcb5fd594a27a5f1b5fdd385add7697999b9e1c7d987246905810532f p_scalar = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4ee443f91860144e0b7f54eb7e4cf44aa177ad14077777efcdc4753ba05068eacfc4718769f60e03c84f917203bdf6d6, 13008228729a0c753a42932184d3927143b06c0b5f389eb51436a70547324930aeeec827bc93e4abed8612b3bd44956c p_scalar = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bab3aa8c60a8a7a71cd9c342e31644be358bbd6e8948b6e231811365ee61bc954043079cd23ad193ffec6674f65de0f5, 7ecfab0112f66eebb14d1c9b4d5119283695fbfe8c8af29176a83fc47ae85174082f4fbdbbc666f31f9aae615c8a4149 p_scalar = 060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 304eaea00e786d5f4d6a091dfab87b368618aa02c421c69415aaed42cca2f15037ba0db6f0f49278ffe3104b684456b1, a8a7f39ea0b9f791808035b692309fdfa6d786e7f62179f09f6b7dc4858f2bdd0a81c5e552c78572f41688b9d3eebf8b p_scalar = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bd6066681a87cd4a06737e54f91d813ef972804fbd39a2bc6be6abe3b91f14827be330a822fbbe61bb39a17a7c34f095, a2f436dc0698e2756280be92f981d3e677ac320953faee4f856c51205a750fbc47df957dcb50297040774d1b0ac72a91 p_scalar = 0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f20e5b8a6c7e9f94c3bf31d408595dea5caacb6256583c442822598ac5d6878a19eda013c543171e9468777a2b389b27, 2f5020a46277c3a7473f2ecad34250dcb7e5a5d08323f283d42b8a7b429771fd8c51a2f1d6c6558adab768c9f4575e37 p_scalar = 0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = dc74d638c785f1439114cdd012def474f016adf1c094b38cbf75bb57da4d6ac4f60262b5dbbb9e4cf3b6fd79dd3532a7, a47bc7cfd8efbe11739fe9ea34f70cb0c7e203f39c915949aad97a4862211e09e0ebe7863432f2b3215f9f2a5726f444 p_scalar = 0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7b81ecddcfc2ca46b9e0718a467f042b49a6481891dc89ff535ee486e03c0851ae3ecda2761b94ba2d268da9b28bdac2, 76efb4917a4400ab4673c23fd4c7db8bc7d1c011cc7d8f381b2408c6389da1632bb5dbde51445470c516a1303e999b72 p_scalar = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a24c76d1da73b71a2ce33c2eee858bc3f02750715adf71d715f1ddc63eb317f94f1d082ed0e418512e7d0a16204be028, 93529833f5ba7d1e7d30553d5d1584db2eeedd5e5b8fe68c60a40a598afd219a1030e8f9fa3069ed610958f6938f3b7c p_scalar = 120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d061fcb5f69a732f7c30fc84cca23e9d1671eeea9772efc6276d435bd2141b0ade8b59ae0034465b3055ed97444bde46, c04827c357449a7a8165f90e7d373069ef875d5fbce1ad6c0cfac5ddffd0a06e313f72d9917ff1257038cb0590a4b0df p_scalar = 140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3ec851d706c4d48507b3e8b9191a320efce43e873cbb2b3faa299008a84ace074399615939ffcb3b139d9fef6bfc08e4, b38e4855b2075e4d334e875f4d641b73229074aecb099ec8a74862fe3bc654db495a234cec3ce2a3fc27598e5b447b88 p_scalar = 160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0c80134604501d21436c61161861628a33b080bbc3350983e151f53b35fce45855b20bc8b9ca1f6d3d7718adaf4b5201, 13b77a209930b29275dbb75bc326d08a7ddd686b4933eab396894f43048371c82c69dba7ccd2803c7a68e7f19c31059b p_scalar = 180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b82c99d2e7c3018092587306f37f0bed46d4729f1771c5d3f05086ec827e6cf877253434ae2c30f292bf8c4508359896, 585becce769edfb1301286a0d8c94319e5e52c115a287dfba3a7ccb8e9a3dc7280567b4066b2250a11febe244e97b7be p_scalar = 1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e9ba9558a68b98f9bd1e67afadc744e38aa99096770fda49bc4bcd77827b62965a01e68261e78db2d859799609f11ae9, ff718f66a3d6334dde7611e9bf820beb2a4d8cbd770d5a3ffb7c1683a3134b499764513ba0f2774da362cddb35b3cf7d p_scalar = 1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2f6fb08031e6e76933cf684789a9d8aee4b51dd0c9f579443a5902cee85717c53aace28e3573ecf687451ca71400851d, a10da9d2f37fed5b473ba83c43e82e035d36cd365df670b97b289eae69aef653d28c010a187f69c7b40c25cec487252e p_scalar = 1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 79512b8991d197c27b814ed800fe704761c1b06eee7c1e8878b310ee8b5624461fad39ee9819618481657860b1637988, a5c217cf3370ac799e81a6a83a12f5fc90e1d178289438fffb78c28ec5dd99f3e8b49bf2b8844a509fbccada25190c98 p_scalar = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4ebd334b35f68229c85eb23d57d002931fad8b304521d7e612449c4fbe35109c72913696e37f500696a1e74f51e4de5e, 512b2421f10a98238d59508a4445773f15547e41c5e37994f984fba98a832a8e3d4b2590ab9c21d183a47998d20a530e p_scalar = 220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c51c0559814f7d9f39d71b35a50c71074a2d6ca29d6b6d55e462100285a8942994ee3cc9bc3e8cc1ef3a7281fad592da, 84431973e89feeecdb19650cba8830f3b5fcb4c90ece33d911a5f705ba3963ba977a9da1b98e62a7577c3de6acc64321 p_scalar = 240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 381e5b521d3f2ddd9386a35d4868dbb2031febb3374661eaaed46bbc35052bd18fb9294a8cf4e306085e33cd9273818a, 723faee0d982a3ebfbd8f80058bbccab451d9d51b6f3e6960bb92056d46253424f03660a6236a50e56c75c5be869e812 p_scalar = 260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0dc856f4656e00edffe544b3f3263dfa315acfccee43b8b5e10e7ed2dae76c71a9f177e1273679c8fc9aea79a04464ab, 73ddabadb693e292ab3442bfa95b6db8da303ec64e018613aaab5e141efdad5a0f38ca039c5c9547732e537083052aaa p_scalar = 280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b4315ab11afe8540cf6ba7db0f63dc797ad61b8ca57dbcbc1f719f7036fb5a4ed86e85a483e43c268f0e1908fac2674d, 3ea75d8ef49242ba648f43739f2d59dbaa7984a9baeb69763167a764615478200ae6960f77c75ae2fbb717aebda3b20c p_scalar = 2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7c18a7a8fa5753e85b6fd841f76a7b01cf6220d49d0216138213e04ad04e93359c03aa457c714b9ac4645ddfc70e9172, cfad7cbc14bc2872b5747340ae8b0d6d63c30f3538bfd28a48a143f3ca8df31c0e68fa60dde97002278b8099491628ea p_scalar = 2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0005bca678d1c0ec1a7c4af600d31e7ff4a4f3afab047cdb8ce2db1f4645152c64ba3bc73d501e010b262f808f1915f2, 08b971756d2d7e38eb6b39faf23c3dd3efa4622d039a848db05c781a0334a7095d664efed15654200a12eca1901a144f p_scalar = 2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8f21250473e722c5d76624e1c9fe92200eb5e4ff0b57513b30bb969b7a4289a53dc876ac1ac8a2fc9d420780b42108d0, 2f8425b13a3e5b657116a5513b69263719bc16c91610a5ffd5954b9afb73fc2dfc3f76208dd4c7d2131ff93719bf5b9c p_scalar = 300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = af51c5bbf42e0e7c92f031be99275c32ce5ab665d8d544e60b06aff65c27f5f6264a09f3f9288555597a26ffb4dc8600, a524d72265d5336447375920ccb2b0a80326665791d3352618c02d6606c04822a7c045947b8cabc5a44d74fae1c84c92 p_scalar = 320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f2038e9fe8e9ad7b08d7d0b167b00a8b732a3b217f4e0b07fa70e3732c9139e3c6dcbc31b570e7e381eedabc8f38b7cb, e80e1e627072b0e51c5a91f66178175a5c6cc28e16a7e540e33de54780a9a6a0fe4ab4da8dae1f6f3cf2282d70341cd6 p_scalar = 340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 308b37a8d48b9574d1ef46340be2d8415267ded09aa9a5c005037f26de2f444ac6d97d37e7a97f33c760823646dd14f3, 06616ad0db0742c4ed9afa666400dad08e404743f47f0c44d2752219d3c638a4e2ae9625c7483e10efd08788b78452a4 p_scalar = 360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4ab1773e6c85c123d67aed02d15b1f9de20b10f1f1021adf76cbc49717204f9387590cedf4db6d03c3db1f37120b62d4, cdaa5cb4d62ef982d33d06dfd82ad3b82bbd59cb0653a72c22bd3ac43fba651f1d280695af8cfc65a3b19b4b879e799e p_scalar = 380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e9ecf6ce198c99f00f6c5993c82e2013e2f87d5e2973be1d4200e00670744f159fc75c0aec6afe4324496a8b7a8a6d47, 70fd207c430346cfb0db45dc0c26c28c1bd8c5edb430039e7169d0042f044eca410b4736cda2e26c34208dfb74c827d7 p_scalar = 3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4a7788de2d65774a2c8a2246a3e93b3391e674f5503557f209fd4dea45f979bba7f9f7519579f6d40c595629484cba20, 76d049fa10cfa0051b8ae5cda2ef7750ed65cae4122be0c7e280d3a70a077d40518fddfb79c4fb656a6b3a6ceb96f0b5 p_scalar = 3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 30568303868326be1f28862ef23931d5623d44b9e4a0bb425bdd4382a7b62effca4ca7cd5a03c014985c8f4b0614348a, 9266f3e9090a365bd0afc6a2eaa1516d84cddb6450c0f2449d48b7864e18f5640b23fdcbf53b5eac7af2d5f37d1890fb p_scalar = 3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 37eea04d226c0de31df6b241f5ad41bb711e5b378c68c6d120f84bcbc82761b390c700aaa28b9162a408aa1b48819870, f6eba360a17d1187ba90d00ec85b901f370744f7dd12e22394e369f18ecff85f9d752e700d32c0663d4f9275bb3be3d4 p_scalar = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7fcf0ecc91251b6e64f27976d5d7412b1a6ea51a2a883b7f340c8ee3ba4a3301ecf10abc47bb619e3afdee277d221ab6, 76cda28580691fdc2c8c6ce171828ed40f7c672a2abd989221c48c29529e4d33c71b74681d1ec1a7a0c070bfc9a4e748 p_scalar = 420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7e3e4b94ddaca7970a21251f7cc002a4391e974f262a7c900fa492995a642da315257c37b24074d0000d342aee928391, ac4d8de8e7fbdfd3a3e2ce952754e5bd602003e8380b2fa8d4deb7e952773296442110fa173f71b837f3baf08bc1eeeb p_scalar = 440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 63102e93ff029787e2a938890afc827f951f92186359cf06536c999ce295c45100614bf206b7e166eb2e48c10bf4e94d, 1955615451d5161cb783176f1ef117c8c948168ee33d0c4b3f6cb359379fbcfa8cab208a6d78bd4054d68383d53769ba p_scalar = 460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5508188555d35077eab1751b07c4cf3c9cd6be7b2601743ac8eeeb6ad5b89ac7e6a752c4783e3da875218ff22509a1df, 7f876cad80e31b1080ac017bf9395a31b34de2691ee18cb6ef35ebc4ed7a1d7f0d9a2f530e1bffb71cea455ffb89bf7f p_scalar = 480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3838356a53264b8a5239b5c4109797d6ae7b59c5fbe10a477fd7fd8eb3c2eff77db868f3a950dfa26e7a578340517347, da35bafb93241a0121950f007cd7d042c209b10a5f90c30c01e5527b9dbe5af49837910a96a705d37207bab4cdf573a5 p_scalar = 4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f27d64f3900000b28c140f1444bee3bf74ae1bb86f57ac995957f390ab2f9f38b6c4ad7e6725e6bcf7d0024dbbf692e0, c93e0a580608f90bbd32397bb8005fc96584d5679eaf205bc4a21f50d1af356fe39bbe0788233bdefa20da958d023979 p_scalar = 4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1969eca437dd1341ca98c4364aaf2f73c0c88af6aec23cd24bea31ad623e7e55101f055acb1b1cd5a319340d6e6c0deb, 3fdec13a97bb25fa581a98ff866ee3063c2ef96b8b0d9d16e6613f16c291563a502366abd150a4f794fc67616879923c p_scalar = 4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2117cae94f663d08e5bd0119ed5225f74fed82fbb2d8dbdf78482d89dae531a4ad937387f2e050ade0732f6de3a1e252, 8d4600665985a453c66519d477e41ceba2a18e47164a495cd694ecca40cbe0d2a761dd7e61793aa5664b811d15e06487 p_scalar = 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b942add81ef8465b860578cf416ccf69f307823e718c8aa3f9fbce33a82d37361c77a3054f1e0d095adf3d9a111792b9, 338563147ab01625940996b76e59d9cde0ade3d2340c3347066465723f6256f31986d10f4fead757611f3069326b8d1e p_scalar = 520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5f3fe3e3209d9fc047f02c4abc4c0e4ed15761fea5957703efaa521a05781b37a23f342d40f5ab43c72957c2b56c62ad, 7157cb46734386bce998fc7d6cd2be7c38bc6b8bff408edbaa881abd5153c3490354f35dee8ec754e3ea6721a9e4ec84 p_scalar = 540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 84422ba89c2d7eb037b11137f15f0cd229b0341dafb73ad113fe0588ba057fe284c5d6a71a50c560fc9660a3c8808373, 3770f3097a3ab2ceaca17abfee91d2478f3214f360dbd5bd6f776a561fd288022857cfbff74c857bf4a6a53bdaab1080 p_scalar = 560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d2fcedcd2a1986bab43adf697bfedda152ae359080ec87ec825104bc4ec82e0f6dbc484f2356b6a44dbfa5831af13e99, 5261fda4c1925c1fa0cc0ee1441b396f0f7720215384d0631da230513cd2a7f508b26d973901b0a8cb6aeea7fba5287a p_scalar = 580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0c5be4a1ab204fb0ab8802bab8da8e68be6bd7b92c078aa8716574c5e9ae3da03d081c0d7f15c9e3f534f145e2290eba, 54d4376a8a45a36694acd76e19aaf2c37aac983b6db13d2d6391d31f44a32d01c6d62f277036485a52da3a12f2c0ed4c p_scalar = 5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 58ec20b5fa1aa22b08285f05e94af0d0e9245a047205187c5d74a59ee05637183b0b3ca6276cf8c41cecc6cd72c1dbda, 4f1ec02c9526a9f048b631552625b7fd338b50c7007ed51c98a85a3f92bfa6d1f401017164a37b8a82c98eb03eddff7a p_scalar = 5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 71d663c80482a61b9e9c222607f4b670c77375da47644b079d86bcac8b5c43fccfa41da6f89ce836b56b035e2a0349ad, b9eead6d51f3682c75d428012b22fc2164b9caa69ce467aff61f34d58358ab730e312080b77cd4a44bdc18c710dc8bce p_scalar = 5e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1ddaad3e57a8a6ce086cf9d3c08d007d4980b91eae21ee2813a6eab45a5f233af7bd1613d7e0ea774be55e045320c643, 3e955126a81a59d3cca7825f07deb834ab6bee6e0f6707867f225943e83b1622b259aa24ff33c2bef82f3e6347394acd p_scalar = 600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5016c8533573235fb1fae2fbf363100ac12df68cce52defb1004254501c4e17190cab0eb9d74e3f6e44e3f864b3759cf, 3e25bf2ce0a7984dbe389ee00ab1b789a540569ecf788d16cdb67a7ca5b1ee7075df2bdbe807b10d72b2149ae26dd164 p_scalar = 620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 976a426e7e387e5c86346adfc17b570aa537fb6be3a14ebf219a097cca4d32e7607683d6d30481954490d42249f884ab, 9dd33f7fcf495103740b47cdeb6949abe5926334a1df5215cbf896be7bab917d078fae93b4ff6bbe322ec0fa9b05dbe4 p_scalar = 640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 972877d5c351148008e952e365e5ebabea435fa0e9ceaf442a773270df98069e7dea27ea124874854df02a7d3088aebc, 82a0fa5c055e41ddb48d5e19e6cab8ae82678717ee376eac44486d1d3cdda0de1af541964738386910a97a08a65fb32f p_scalar = 660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c3eb2bcc338e60ca5e4a81611e943ceea32131487917fb3ff4d80e7182e7578122d7b16cd1909a4a9c5286d78c8e4f7, c578ba0bae6232250cb948a56ac704fe67f0783709fa36a7b3610be264ea29f31e36d0464ade815ddf1a75248db896e6 p_scalar = 680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 762b3406c6577d810accb4a7922d3b253a998cdcc8995cace659cbd6ace07e138540213ea7a3f2f761dd7692f27eed54, 3d82ec206747984ac97ea21d38dbd7b54928d08319b6f7f7f7f5add98c46732b80871fd1733643a05f624b0b81fbc8bf p_scalar = 6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8df49d947bc531c51cc8fa418508b201bd7dd40b7a34781499b5020891035d21e8d66a73fbc1180d5f29d3aaa7d9e25d, 724eb5e24590c870c314181f86c6c208c04be66e5143f1c4a93bb7e8b51f62eb7ab245e80d096e80a8d33a9e0f3799a1 p_scalar = 6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 490753350b7e4afcb041ec67cf575de55f49ef880115b9a54771281390833f18b5e8876c499a1455bfeffd5356adb6e4, 7972f945009f16bc020897663e1b074bcc11e91d866c112957bbce591912ae666244e7e02505265a52b23b5fa0f460db p_scalar = 6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d93bd14b4b11ac38c8de9fdf7506b004184b98d7ebbb8c4dc3c2cba3492a416a313c0cbcbb713c2501b7f6985f7f481b, 17001139e9c1cb5a7d49a5a8d893102d9cce21c6e64c77d20c5a4533f7131e466d4228a3609187deb8eee625ae4482b4 p_scalar = 700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ada548c3b46f1e376b9fd3f7f19df4bc7f7009d735b193cfd8e497fff172c7cfa80a8c0d2771235b46303171491ccb92, 0122c58fee595cf0cc7fc5ef4887bf23d6592a2886470a33d5edefbdac61546910ddba285187106678391557385dfd8f p_scalar = 720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2d56966a409303d605de72b7f70a3994bbaeed33041120a96122ec75d132b62c870346945bf287ec264b3d9d11eeb9e1, bd4e11ef7138f960033b5ad8ea99eeaae73314f1990b214056f0fdace1baaa6455d3f1fe657bda944a2d59d718c5f4b8 p_scalar = 740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 24ad6b0ca28c80673f16d1ed3b5fe8d68ec00d9fc04d8cd5937a15f52a67b12bc1413da46682c7795d782a0778664144, 23261b17edf4c77ec88f1ab2e9428a4d2979148dc6c7b1ea8279c0a4d53f3dc69d3b3d4054d0587a22e1133bcd8cd4e6 p_scalar = 760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 326448a0597de5b3e6361a339e0e1c54fc3e322c7496d0809030804ef95021bcd40b4963d24a2b6eb9f1b4ae3e29ef63, fdad564661686c1a9f343b0dd787a81dec8ce3d8ca45e7ce6950c0ef933810aac9ec4351f39de788946a3be6d38bad81 p_scalar = 780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 20b358444182aa555d43a4a6191cc808919081881990c13c49b13eb95acc557287bc4d75b1baaa7ce3052838df5147e1, ebefe138cd93b2c77a493afab8f041eca2482f96df09713a72ecf4c6ff3a516039191f9d8dd16e188f2b65b698f4e02e p_scalar = 7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f04df323cee02f61cd5a7a956b1f77beee55d9e0594c44ac013ec26cee34c1dc43011b315c10da9bcbd0f599c8e64d24, 3bbf69ce23eb524e62019c75ee460c1830fe65422caceab95fd6b7d4bdc356fd4c3bc93dad13893632bfd92f26917ae5 p_scalar = 7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 010865380377ba8f43a195425fed884fd7323e01a856ae6b6c8e22676e97f5af75921e487576c3ddeef03450e10e8018, def29fe91da5df8c2208dc13f5ee047cf372cd74226e7adb51f674806198412e39031a730f02bd7e83242f9637d57098 p_scalar = 7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = eebb047e6d7c9413a7235359a60a123952d9264a3ba048ebbfb45e7b89486d643ee8c19f0b66d8180150d085890f1e7a, 8519c5462deb0512327cc059bdfec928225b7d2bcdf8790e8e1db2a7d9bd9a1e33bc0a88c290de96d5018d1666100cc1 p_scalar = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 60ad991e4e4eac458e5c12139ee4718f77b9b6dd6816b0099aca885c1a0d58e235414174e52691403c90a59f85adde98, a16403a3d6fbfaedd184b638908577d0a066f6d2bd5781cd345e0038a150c1545340b14ca43a02d53ff3ca97b28e09db p_scalar = 820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1f1b6cc936184c1f444217e60b4b3953db3e9066d9772914d5968b29ac900f4c39dd0be4c1125a63782903630deecb3f, 6a0beddc911e8346635ba477be864d86208b4383b4ea87e2636b535bd4d52dc62b2bcac9d3a4cff0fe9e8f3d8178c485 p_scalar = 840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9db0ee0b907f2cfdf5b944c9040b7ad4d4447c1b20eefa54e8804ab3329a0b9a9713a5e04894f486a31d3524b295958d, e185803564bb842bb06adef60ee8d432d4b835f9dd2b21101f99c4a54d63c2ffcec8dbe057cae89bf4e5e0c6ac7b5666 p_scalar = 860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2f6bdb104cbbe283f9c8e74d26b173fb5cd20671daeb6361192707699fd1661b8ad7721233e84ecf88f2de40a7b3fe4a, db87fab8a373755a5636f4205e779451cbe80ad85c00c5aef3ef46f1042fde764c20f4d91981c7ad073ccc7a27869ae6 p_scalar = 880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6847c20de211c90eed3a6508ea56be90d9b625dcf9ce0cde6459720f8eeefff520d0c4740dcd66f6c9898355ecf2a473, 9383f9a522c8f088b631239cbb8f18ab35370d882eba47ceceaa78b8afdf64b16ddd154ccfdc2e91c92794138e58c311 p_scalar = 8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b1516b4697bf25d1c1c0468307a8949bdf7187596ece704b26adc1564300df17ec96212c96174bf6bb114c0747f74319, 234f8b7da26d270d3ec2ee3caf38512fab41797ef6ba1c473dc159efe0bd95b5626c2de4999b269f627c05afb749f7df p_scalar = 8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 02a37213fac8a477162aaad842f412c5aff5505f1070737afb8a08285bb5202d1ff2549ec4c9347646a95735f8171804, 2855e2dc8727d0655dff90df8191179819a817387d2fb6ecc8c56fc624e1a5be64195f4c60399878fa006dc86cd0f71d p_scalar = 8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 80e70362a61f6b8e5b9d91d31e8f6424ebba130bb3663e1b6a9f149f55dcae398360743ca827378dfa8cd197722395eb, f1e2942a8d5c7363a0af2e50a90f98b9fd280fff71bba7f6581ffe8717c49efd2f60851db832c783f0a9601e20f2693e p_scalar = 900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3a34819d7eceec8835d9fafccf45b75b22bbd01853e14183e09f04e6223a0ce868ff316015c6f7f5fa070e22142403d1, cca372c94887b183e61ed2fa9a17ff557188260fa0812395f37ffa9a614d5864bcefc9297be2eafa26308a982ccd9d2d p_scalar = 920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e70634860b99a9811d923a955e2994097a0a8df4a85fab6ec4a354244dc0e8bcd1b7191b3cfdbab92ca47e98ac1b85fd, be30bb9c9ae22a739e20ca5d78d04cc76fab008306d8bb083184d3cbd8b8ff39c7d3a6ac56223fc8d295a8c53bf99afe p_scalar = 940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a6e5585e996d20338e857069e462cfa8f60ce5d991f1d4875c240cefa3ef520288322d8bc225ce6edcac39d87c1d9f4d, e44d741ebff7641a073463d95acda4738b4ebbcdeb76dd6eacbc5f5d5cdce112326f3ebe06f8140f8f698a5ba9d7e195 p_scalar = 960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0a14f23eb0470188da64bf1e5628f2863ba37c232de1294438d28dcfa9312a5e224f404933c384e47b7bd39f39e00e98, 3bd23cd7f6e987117c6ccb4e084f8832807e360b62edf959631e8e954b5513d363724185fbb3c0d4dab94dae3e1d8610 p_scalar = 980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6189f5e41a991ea2da296dacfe7d778f186d3d934f810d8fbac785aeac0939e3c7c9e5f1d27d1f312bb6e7ec3092d0b2, 9098fb861dd105fc8df32c6f72ec9c025bb85ce127cfbb59f628e7b78e692056fb550a64775b2335f67086b269cbc9c1 p_scalar = 9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1dcb9da2e49ff45c55a12128a50853d180f745e27f7209ce78b59db06f2c572163a394e1404b5b23cbb76478b52110e1, d04b71d399dbe1c8e2ef514d62d0f2737abbe81cd62cdb014a6ae0bec24b6e0be3d26c9c7afeed373589b9b4769045a0 p_scalar = 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9bace7adf8a7c0bacccb784f77921ca4d56ec8f223a1656e16ddefa50589fd01f3dc472a8e2c58e9aa452e81cdf60f9a, a5bb92178e45d85a37d7033885de5229fcc9b83c6d5df6aeca667e877c31798a58f3fa853cb1834a36b10c11ae0fad1d p_scalar = 9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7a51381b1772fc22ca98304759d16a8b665870899d73fb3bfb3339ee5b1cd14117a70200b441bfd0f943b61f038af8d1, 96e887694417a0e69651972fd1ec50d9c0c7722a479f85af48a8a614b99c265aa2e52adef33c7b57adce0820d39227fe p_scalar = a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 282358aa2ff95cfe76ed6fe718bd01b79f67567fe0a7ad0b990e3425ca7b8369b69e308bf8ae956575cba9d530a3ada1, ab27ba46c269d3eb4760c517e2326e9bab0799b3d9ccf87d69644d8d49584705762eacbf3329837ed72d15bfbef077be p_scalar = a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6d7604cffe8d69d781c5409e908e92f8e7dd1034ac8f1eb78fee1bd6e78c1828a32243ccb026239500cce541ad148e09, 6fbafa9fc0365aa73a0a9afccd9a0b0af6ddfa8996aa60d27c23b3294477842d6cbfc6a85c9edc13def7cf22d14d8e43 p_scalar = a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 30369ea0ee12356a6aed101a5295e728e964dc9c9aabc3fc885253779336b2b939b1a9c697b17ee608ba5b61fde4ca03, 535f86cabb971be661ad79dc17ab28302e93857a5e5a1afbc4d08554aa6f8af2c589610e2060b83f1f7e1fde3717f1a1 p_scalar = a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6f261a720ebf3f5d30519b089ab91b5eea5b069985bbf511bd196739a548a22078cf85c78720ea377868bbc67f777fd8, 090f193e862f1739927d1b495a9457f4236b3088a6bd9ebadc722f5b116ec26a2a39b5a09eb96a1d88948cbdfcc19ed1 p_scalar = a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 33a95de702001e8cafbf32372a69ad0d093c3dc2769de89117779f5e7bbc58fef517c925b79aa0ebee521c0af93098bf, 0da686a7e905e4e91a3263c6354cc78efb0f44ccb035fad00e3f96dae9fb59b84c865c0ada438265c4cf5039cbef5d4f p_scalar = aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 35edc49ca54239bd0adc36938b9046147f82050a305601877ee84419f5dfa296664ca68b46f5d9044033ece91c1f582e, 11d0188cf60ab49f8e3622a34d5ac7164fb34d2c8f36dc304e7f07faaffb02a5cbaec45235298c1771f35c54ef7abfde p_scalar = ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a1cae78c7b491c4d752d98f6018d7c6455d40c1b2eb7f0fd55f7680599440d4bb16ca18bd8e94e49291d65c801189d9a, 80784bbed565fd8df2155c8c16d9a90ba7c4cc955a97c1074706b6720556badf44b76a94c31132d8767037397099472c p_scalar = ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3c9e1bb5534739e879ab7a5bc5b76b4fbe21ff8d02a855fc4fd1fd2cde268c8c809a6b6cc5a362e31ee1b6033b28bcbd, 607efe8f93f6250043fa333a77178b50fba0a540d96f3093c53e3d2c0d6bfd5c3d5d4ba17a5dee2f945b26595a7442f6 p_scalar = b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f1d5b458dc7dd67fd6f1b8df647cad2f805b4048e097047f15b28ac7b871c3f3ee702764a35d24ea8b2fc4e96484fd40, a09139a277d6ca1e6c52df18b34140e5d7c12762d70d7b0b50eb8ae16aeb74a909e7a140ded8b050cdb3ad64daeb77fc p_scalar = b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fce39cd1e1a9d1708bc1da4093b5b983b727f6a0f7728c1ae7f34f712b796613950ef6a86c660602cc862ba801631411, 40f67e942f5f5010bd8f326581138444ebd0104e1bce69683ef160f5d38bde87a645acf0e72cb5440e618dc26b6cca85 p_scalar = b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f08cbfe771c4d06186628102bdf579e6675f12cca4fa74a94ebfbda7cf3dab12907e4f38199c51764b0c7d0c69c284cb, 7c3f6e6d14efc01fe3f8ea686db4514e7268757eef2e177e8352d73c8f3f483f492f2b73b38d86ea6221c6f2fc43e346 p_scalar = b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0e1f061a92f572f08000fb5849e023a3884a0bfdef058b6faa278acb01a177dc1c919775c21b9dde3169bc090cc65977, e76f6df9bcd64d74b1a6e8397dec75bc60d918a106c6ec23bb073fb50f65bfdade195a617df28192d33690d1241fdb80 p_scalar = b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e4c35c2244ab2fcc5bd45adcdc6938b91588c4712a3f012d38a1ec5ce16b874de239b1d404b6fc45494dbd2665925506, a914fdd7c73556fefb9e9ce7d9c15da935098689a44f0220c5f1aa3867d5b6d66d563c4cebb02c1178342601778ef75d p_scalar = ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2d2542568fd9f423f6d41b65310fafd4a5591868498f151f764ab40ace8713c9023872c88f2d14ff40fd181041ad343d, 55bfe99b941ed913c624012aafd080306b6ba1aed2cd3585df42566719290919ac744d081e64daa2ca5e9ce9d05b117f p_scalar = bc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fd96bd168940c7665927968beb0f6ca5717c302a766b69dad2d9da967e155bd5323bd638835a4edf2f7de141a48da000, 2ca57dae6f1bce9657c95952ac481916770ce1e9dceb3f31819c6adc5c2a8556b4563273278f6ab007608ac75ccb028e p_scalar = be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = eb7c7b187673dfc835238e9ac5d8b3ccc2493d3db86726814381646777c6b7eab211af35bed7aea0a101c2f02838469f, 75f8daf946121ab30a2a7e4cb30007f68afd7f7eba32b20df0596f0febc4d676acfb32e69611d48965f7bb9c8b157877 p_scalar = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 024cdcfd74a513932dcc51180f94f4d767ef024eb3dbe034f4ac2b677dec20d2f9fa4483d8b4d6bcb3984b176c0f3509, faceecdde21041ff5f3f019fbfbee3ea1334fade7e84372e4ff31aa98f9d34f3003e707d2c58beb00e3f0153df185434 p_scalar = c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 217e60f334f621e52a4d3ec6d979444c99758103696866db3ee3d96da9de154c65382a2312055ff2a6730cb7311cc98a, d53087ca891c22910c263f79b32f780cc994b65b53b4d493a1639df9ce885428287a95a1a2c5d04019d7799f943a90f3 p_scalar = c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ab3ae700d1a378c565bd03584590bf03605e7a32d2e2bcf1d69b7c83177305ff6f206002d878a97a74faca8a6af7e742, 88f79e80e676dbb1e18fb3c4286db20eed392e971988a94e7d5e70fcb6d4fe2a7c9da51e583bae39fc8186fe756d64f2 p_scalar = c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ed111a7a3bd0c935557d173489ac563e8476e71696aae3352dbb2f572373797325d250419c736f9a583dccc1918722ca, a72c7a8de61ea42e74c88f9e59a0b4e3d2361fcb604aefd1b8c5ecc6839f12fc15e84c46eb22c13c5b83310ff4f9ea0e p_scalar = c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d363e435d58d42d2d9f3982e3ec5f7ff162cf27f36ba3ceb1ceee947c3f392126a55edf1c354f4334c98c61d097bde48, f5b063efada24330762dc174921ad66bafefa7d16dc3e5329e26b127283d801726e920a814040ae3d116f28552c997e2 p_scalar = ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bc61bbaba368819180d7ec75226d534da72e9ae08144a60f51e4475e9f97151bc404defedbaf8b42178b590f1c477d9d, 8cf32bcadc393da81bc3e1425103c78da7150074365de7080f7713b7e94215c8e38b469d3a5f6e222fe55cf115d5157e p_scalar = cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 218e7fb1b71a25a46888444f98a9add79be8a33f67d61b2ed78ecebfec57d967a4af7a2d749862107778fad7e65573e2, 9701037c09db99a5d63da33c01c42111c5c869a08e017b84dc96d07a0397c834d079ef51ee5ad32608a59487a0b9cdc4 p_scalar = ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bba8c7b11cc64bb5a6581582454dc4f3d92b8ac4d708451051375d6af7acf0bcdad4e4b8dd0ee7526c79a60950a78a78, 6b6804c7bcf4254c2aadff1376e71f2fa78593186274d8e39ba61a7495527cf8d50ace5155af45749473bd3865adad84 p_scalar = d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ced5e4cf2b4313900490c970f5aa2fc4547bd050b48bdd872e0bf749e05b18e763ad235fec1ceb74e222eba4a4dcefe9, 6da57183ee47a9bf27118db07276f567aa086fa1afaef2595b525dcfafc80316bb48dbbcf7c4a82bf827d8fcae2d7671 p_scalar = d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5526e694909f969fbc6d93d12b1ecf5da54322ea0b5c08c1d151433074d7b4608b7e7552cfc6aa6e17f7e937cdf7bd50, 172c700b6e2009a6d2e0998d8b96b6ddd8bafde0439d7969bb4f20c2decda994b88b7f12513e69928e6a565c8d93bce5 p_scalar = d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f79e2d39b2e8fac1bf3cd96c034d021b15245ac616c11ef494035a1f0c82ab81c749a6a77709a52b8357d8bb460e77b2, 9301bb39c0b773d1762f3b3a2587cf4ce90cb422aac571974da7b5542256530ccbe064ab4cebc408c78feae7b4930e42 p_scalar = d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7bd84d4848a7403bb88ee110d4c2aca40e7ca13cdcc93ab719e453d26360d0b1160eeaa784e7e36db3ca02e33c34e954, 881501194bc77167ff61ae14d6ed1e8892d5c9efd156ab6c2ee716f48bec18649ce66721472f0203d172c2fde357c707 p_scalar = d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 058ff1904c89c9a87b6e3e4d1f54ef38a901f2551406ec90b28f476b59a7eb995ea6a57c699397bfee536a26d4bcaa59, 4cc159e64fe6a7adc1e6a87ed31f0696c1417bb9969b46519e7e05e98ac9d0a1016786cdba1ebd97a96f05f0035ab933 p_scalar = da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b5f1a6c4605f84ccade63185d292887e6000e8b97de5f75dacdf3c75960857e5a56359b898797f27f6666dbd1e720925, 3bb0c2563cf5389eeea64a12b8d49953019f27ebb13b0586f0f68848938f8c723d93037cb4d0b41eb388096c9e381f1b p_scalar = dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 13db3201919c187099c2ff0b948ac53b031fc087255e8c5eab4bb08268cc66781f72c1f8911316f6eef402410ec537ac, ddde867460bcc82a1f71bdec7e815a9fcc5601bf42de10018b72d16c268e981c42005dd80085bb342137e02dedfa85c3 p_scalar = de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cfc013b68f5c17418ca6fcc4789fbee8efe3a068daa3ed3a85ce557932132eca1c048aa58f30fb6a7912ca4e168fecd6, 973e341dff8fb6e8de068776265f04d6b665d712989a0dcd9d3d2248eea57626c82692298c41a6872e67908b19319064 p_scalar = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f58b321ed1f9bce830bf1ee34f114abc72483dc5b3e1d84f0eed233cc25c696a5e9abf67d640c2a1da828fe556467257, 0f2f312caafcabcd275025cbe05d0f92130a9b620110779d625bc3148d567d2123d0efa0e1bacdd634d9a9b468adb0cc p_scalar = e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = aaf3726a32ec147e505f5eb8a58e699214f3ee55fc5144da5629e0626bc5035c0a3de8f6666dcfb1695089a73532e60d, e8cd549cb669efc115a5eba2c50ed0864791a4b43977b0dbd17e007de5e271d60b631ae3815e1138b69010d28e148866 p_scalar = e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7f517c9c01f3f401b21e275d8b991b2903c6831675f0f13991217a6be34fe2e0e4d168e75b0b727bec22bb32205a5301, 70e02e42a8e91264f79b85ea72d54f45dbd34f94402db45347741ea3833ec9813ab8f7f6afbaeb4e4416a2e71aa1b605 p_scalar = e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8aed67b865bac360c6dce3bb1fd8ee17442ae6052b0dbd5d807d8c25d5126552b050787598a85112aad13b2f80f89c8f, a89d6b8cded9d1e0230226ba7aa42c857476445cabf994a497a643a529878de9596737dca9075b7769be36ee86fc7101 p_scalar = e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1690687e164c44ba8b5101310dd4e1d4b120589021649255e7d94f4697b97d7c243622f9e8a47507e787054518ba5236, 62c155a73a4f0718b2d325e37e33582133522150c6e52fc2d55ee8f83b9c568900000117f597b3c29a44b2740eff010a p_scalar = ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 152fe43844ecf2464c549c0e5375bafd29a9b8a5787c26f8979564774ff41b268a370b2f4897efbcaf2c49c193eeaaeb, 6f10aa28d18cfd12a1a49abf7b7b5ba56cec6d2fe1fcee878b5968cceced62e4ef5c0e0949d55bfb4ba25df0cccd006f p_scalar = ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d4b25ed3883ebf03e1ee7508c3ff73564f4576a12c9c77446bdf53fc46c1f31b3024ce311a7194613d92ecc18f8802df, 38124a24938bd1e4969fced00e605995147d4cc8bf12cebcc91e8ad9a1696c09c8914404ee131056e23b9faebdf3c536 p_scalar = ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1a0ab3fe3e1aa3b2da05dfc0faf576dcb6743901254cca1a54fe2ed1821745a31e6d2cc15044f8e3aed505fefec299b5, a3f8f0122452bc6ca4f9932141fd832f862af5e0da92241fa1ca780c059cccbeb235cb042119df38b2020caa49bcb238 p_scalar = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = edcff8331d6dc79d7cfa71e1cf1cb8b3c11c95a22527c1ade6f0ad9bc0579c3e593f085a6dcf56bf5bfa10cd1ca459ed, 862ac252ff6e436fc04eb74728de2fcb12aaa1c81d9f913fab3c748e41c5ef83409dff68ebb1ee5fa7e3b442bcdade36 p_scalar = f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 91d26e18089b6194c58fed0143bfa89695f4f8a7c76e93579b34ffa032e7bad15a5e1b61f59698d9f12d87d33dad94a4, 71a302e9bc09f3161236ec7dd3cd2727a829c0ef48cec82f84943c05000ff3bbde46285e57685ca53de725da29d42120 p_scalar = f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4a95f7f3ad4777a41ee7797f6590d0ecbc2c3b8d7a81382003d42e96afc190c3887071bbcac96dab4b98cb69c5c8a182, 20df90e64170d181e4ff04d75de8e3748a6011e374acfda50678b40968b3f570807398ad5287254985c921b2d572d8c9 p_scalar = f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 92fc21e8098c5b74dcce4b866dcc347a56485fc5055a1e76d2413d03360766ac3a0699eb49cb60f46fe114183c5d5268, 39ff0bc8a4914f3f4ac168f38c3dcf7575ba26656fd737df4e3501d64fbe6b2569f15c596db30aea1e7116e1978f8516 p_scalar = f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0b2d3d2ee01df4e90f17d421a6542ac0bbf2d5477007f2e9840210ee61ff9d1e7734dc91f8fe7a42e6bbcf0bf8ed6302, 9cc5d53777ace27e110e398ef4f6001dd205e8933bbeac442303695191af27c87c9d084dbceef948adf1b0457b0c8fc0 p_scalar = fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 051860f8db9d37b374ddf359c387adeacbea730d7b0b1b3dc9ef099a6d40b18658ec13e188173f1b430f3082d997bb97, f78653fd02c0ba349544df3cf5bff034741b7dc6a382bbddd867480f5e534e39d22d02da7688686529abbc43dceb6e56 p_scalar = fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 977b4bce597694b4780ec65de871b7928025224f7ad39d9aa441e5035bcf0e19dc504f01d3ce296729262b6d7636a78d, c816ea7dca3e95f09080d03b82ce409e0a259c1f0706fc9749963e29f3cbeac4e300785268b74ef11fa15148801c10ee p_scalar = fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 75c5b10bcac05c018d3e2eea122e7ff2b2f9d05f3cccc6b797a1f8404db70676b7b8f12986a52261b0428d6baa542b1f, 8be9dc2a6cd443a96ef018bdb5f15589a4b9b1e7aca5a799394ba8e3ab5a671d3ae590f619124430327f0f274a2106f5 # p_scalar = n - 128 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, 239dcab2a277ac5b2657eedda5791ce3b01f1e0434a02a6b5d85a0e4a022c7a4228968656461e382678db970a7efacd0 # p_scalar = n - 127 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f4 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, c7e92a61e3948069f3d6832e367b2f949e29e339ad180b0e88d22a44a467c5195698bdbe018ad5aaaa6e59ddbf943cf9 # p_scalar = n - 126 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f5 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, 07b33602c5e1ecacbdf3a4d1afba7f8cf99d6754e04af855f9732cbb4f41b9c31525eb38bfca96d3aa1136b6b0c47624 # p_scalar = n - 125 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f6 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 8933bff572f35ccb7cd5a74bb0095802551f41bc219187aaecf53641e119ab8edf3fb730ed4f55a421953d2a4117061e # p_scalar = n - 124 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f7 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, 49a89c9cf7a12be9b9e99d533cfb098b9544dbb2d4eb6e31045ce25c5e93210c55a4951bc8a66567bf4d13ab4f115bfc # p_scalar = n - 123 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f8 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 74c462ed1a798add03babcecc25ccf338a86ab0f498f447b5a82af3e9f30f7e883c6ba0470788c9f1be4d7f7a178b9d9 # p_scalar = n - 122 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f9 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, 14411c67bfb77d57f6b8dd99613a733b02b77ffc1077afc76ce67450eb4d4ce0f0ef6939293f99667744095c728d3ee1 # p_scalar = n - 121 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fa p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, 11aeeda1c64d0916473d0df9f8265b7e9c1d39a8b716f21b95507a54ae4d8985f5404f6be9028e62caaa8f0bd784019b # p_scalar = n - 120 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fb p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, 539875879a1da4c861bf593f532e0ecc3c967a464c37dda4ccbe6fba3778c83889e73d9a54d7c388f37166f8c08a1237 # p_scalar = n - 119 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fc p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, b16536288a40a5cd9a1bb1ac9221b7a3eb9ecabc9109b7e5d677a64899dc8f46b2db96f206cf9ceb761360c15ff51b6f # p_scalar = n - 118 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fd p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, ab9386aa4a3ef7e79966399f963aee20f35524d0b44501ccac13b8149df3fd7307819492dd5cde2308c7d5a296b0684f # p_scalar = n - 117 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fe p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 70509ab082b097737a546582bff1585ba6729b8db27984816d99c05f06aef600c6cb3a4beb8c057b940767a1ae53114d # p_scalar = n - 116 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528ff p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, c0ad2701581c66c57d04f5b9c910c402fe084c3f269a8382819b165ec127165cb49514f0e988e2f90a1c7cbe9cb66303 # p_scalar = n - 115 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52900 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, c0c5bdf6cf5a11db75029e32cf121f03df9a343af6312ec600dc39b8848a5b863ebf1db1ec7ae2413106b7fb95dc9eaa # p_scalar = n - 114 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52901 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, 0cc71a320bc4646e499467386204acd06ca075224dc4a5e8da508de78539d530f4a727682b1c4f45390696a8d488cc7a # p_scalar = n - 113 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52902 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, a10b3df255f7944b3d0ed17c31b87757bf7fded9fc31bb676998722ae7b12029b9c007f1d6664d043278521791daf6be # p_scalar = n - 112 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52903 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, f82bb94445ed204db9a19eb57c182141473e6877caa846883e7ee43a2ec76a1716a71ccc0b6c4c64a818b9bea15c6a6c # p_scalar = n - 111 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52904 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, 09ca776808279da9c64b47b82300d9feccf8e1f94aeb2685a2ff54bc93c326191095bee4e305fb96aaddfa03f49cc56f # p_scalar = n - 110 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52905 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, c59ff978106e08bfb775af8769e4422061d7272e75c0564abf9c791c76e941515426eb05ff14810bfac270f270cae3a5 # p_scalar = n - 109 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52906 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, f4c46c56198c770587e19a4e7f7c756875ad33caf5a1411d2db57fb4f560daf435cdd90b54294c055b391712ea533ae6 # p_scalar = n - 108 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52907 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 629a90bf9aee303f7499b3191ed0dde33c58b5e63c40024984d81e8e66d45390a985daa26e4abce9276d170f40383ceb # p_scalar = n - 107 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52908 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, 5182a7172afcedf2e1d99f78c7438e3995d6ad45b8659463488374d1a27f3f9f844fc79ae4193d79f4c955e2f647ed02 # p_scalar = n - 106 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52909 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, f1c69141971d1d5bb5a31d6abf10c960069f47e10aed184b1e0b982b4632f0a407c34b8181b17d37af66ced6d590155d # p_scalar = n - 105 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, cc3ae72c6d8973a5cebaf145152f1923d3d57a9547202560372c23a9a91fff8ca5cf364fa9ad136b7d67ef60d99028b8 # p_scalar = n - 104 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, ed306706377f04cfb06434324e2c7f76f5f40731eb8fedc1f3513c3b9c9e5f9ca3b9dd6e230c2f53e206f13b96d88ae7 # p_scalar = n - 103 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, 0c9e71377273dbedd6e2d5a62de40552601bd1c358fad1c397ebbb4ed86f4dfd1a52e4e7e62e6e0bf4a58282925bf0da # p_scalar = n - 102 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 60a4d22a26f6a5df4c6c8fc838175105a47fbda3bed5e5259e8d5e0bba3a023a5464baea1b373ba72a89af6579ae9e06 # p_scalar = n - 101 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 73872d361702e1de909b656f420ec104a73e1d9af53e80541fef41850ad68693ffeddc211d67c04d914193c06c8f74e8 # p_scalar = n - 100 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, edc690c903e2fcb28a8aecc74afdb92910fe926075034f722a4dd35433dac6b48a14723f4922997f4a7e5936f6075163 # p_scalar = n - 99 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52910 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, 03e1698b322d63bd1f7493b176190d98d6f759d8d1a0ea086675138f708247e1fe3096dd81a0a38d04f485765d8cc4a5 # p_scalar = n - 98 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52911 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, a77104bcffe021f349c17dbc262820737b96a6edffb612df003c91f554ee9d59d70204dd7088d2da5fd094ff848ae412 # p_scalar = n - 97 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52912 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 83c6b78ec4f030064c3e2491c4f56964cb47e4ed7889a39ed7d24ef430e05dd3e4eb5512d6865bf4005051ea1c73b598 # p_scalar = n - 96 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52913 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, b257fb6c5a4434a4cee0842f5d5680b8f9d19ea0c831254b8545396f305ee4f0507e24057dd87c3966e1d5dad872984e # p_scalar = n - 95 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52914 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, bb6d4ba542df286e65364ded55ab93f98c0f64e83bc7b59145cc3f14dd99f9fb505fe7ebfd79617dde78e4315f93b592 # p_scalar = n - 94 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52915 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 843c41be9c6cecdf6010c639db73da1103f4f9dcebcddc087d15f243cdcbcaf878632b48408989ef585b6d18c19f9213 # p_scalar = n - 93 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52916 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, c071f38f66bf9d09c71b395490a268e5572a425b71670dcbfe7ca8103cb06698d9e303f7e03abb7916dce2c985f2ca7e # p_scalar = n - 92 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52917 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, 3e080b351a206fe25e43c16b90f38d1d3deda082a8a691f9a4d6871d472ad231cee9644726ca94dcaaead60f2dcb2306 # p_scalar = n - 91 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52918 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, 47cac703f116c6e20b09b3bd9ab88478cb78e0c863a2cba009d0b3319236343dd012811a3fde2c6d991c51670fc75158 # p_scalar = n - 90 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52919 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 9fce477feb7d3671effe5f50722fecaedeeb339129c4724952f2cabe13d6dbeb23ceae28feaced8d2f161a085e5496e5 # p_scalar = n - 89 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, 01c7e939b8df37f31d28243540b962d9147701090b4de4c065ccf0512daa253c7861b71b2093cf7ee5865c4e0217188e # p_scalar = n - 88 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, c41a6fd431583d521af2a631ee1859834284651c3e6724b407f97c1df8ba4302a6f5384c2f5ccd104b40ccb8e384778c # p_scalar = n - 87 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 9f046faee996fe68bdac81880e7b4db731944175e7559f09dedf2454f984a88f18246d74a7909681690ee6c7bf3266f2 # p_scalar = n - 86 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, 43d6196f8de4857a143c6e832c92df61a32f70e6a0c3e1a57a9910d501c47967a4fe5f5fab20b37f0d7e44f289b66806 # p_scalar = n - 85 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 6c218d92c993f213a231839fe2895195c3d455d22caf52f27422a72a0bebe314392aae0271fbe969e7cfbad800dbc157 # p_scalar = n - 84 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, 3e5c6ffb3adfb941dc98abd94341fd4987e3e34d8d8145a014e572f21cce9e0d9ffcb850d7c9b5b080c0d8914ddc8276 # p_scalar = n - 83 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52920 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 773dfeda69ce1cf9b72a7cd0563c78e40aa262ba2251bcdacf21a95749e604294e3c13706009643ec357a48a13d970c3 # p_scalar = n - 82 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52921 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 6009a59ebcd30d2869eb7bd2feee7fe5ed736fffa734994fe40d04ef6068512884fa39d54bb007bb6469e146b7a3a2d2 # p_scalar = n - 81 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52922 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 9dd7b7609745b87e5de38d63ae2706a701047a5ee5dd278d56add2f018f2637d959a14d4736fa240e1083c17c382584f # p_scalar = n - 80 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52923 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, 530abb420614a6f9b960b5efeecd8ae42413063a1378e68fbc7a903c6484641d98e97f1cd923637700c213bbfcce7e6a # p_scalar = n - 79 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52924 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, 4b9728f81d7ab255941c66c9f30281f9617b301b08632eb3403243e9eeb95ec1a052eb3e3277555230f7838ba6b0b163 # p_scalar = n - 78 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52925 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, 3e795421ae8fbd6cd47a03074e3c8f2c84238e64c4a7a4fbc4870c9dbce600336c62bff32c45eaac993a302d23dce536 # p_scalar = n - 77 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52926 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, d44b1075302cfd2ece61c3e5572941a6dd03950030c9cfb21500850e49fd3c3d34cd7e2ef34d1d23774dcba4ec1f91dc # p_scalar = n - 76 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52927 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, e7871c313937b80f64172dc31901ee2241bba1911ba3dd06a7a69a24e4f855bf96eb8cb3603263f9bfeae6f2f71abc74 # p_scalar = n - 75 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52928 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, fd42d862417d6562d7870042957fe44564e239e3f0402e1d6762ab69430aed71a531c2c450fab9012a655ee1139fa27c # p_scalar = n - 74 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52929 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, ac30d6dc35b9ab9eb9dd7248bd7085c75aa7e563ca19ed0f2458c9ef13cf22bc35dd6dcf7125d169f074bee9efdd2b40 # p_scalar = n - 73 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 6f65af3b7c98a1620b15740387b8637304e21e0392265a59af9fc87b4f1d216e9f89b6d6e1e8d616a8fd39bfe1f24424 # p_scalar = n - 72 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, 312c1d2f36824d3ab010acdc097afa217854f8bcc3f0ad3ac7b43619ab96774699cd9dc9d77437097555cc79e7693b1e # p_scalar = n - 71 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, f9a7ea28732ad01cbdb924ee071395662144daf1ce64373a154f285025b3e31986793c4d0801523d6a44d084ddec83c6 # p_scalar = n - 70 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, 443df50ac7469f4a5c599917d3a76debc4077657cfcdb6b7cc8ad6658c725a7ce2a2b0996761e5389f0415bd9bff2a34 # p_scalar = n - 69 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, fbcd0100271dbd7a6f2c9e8b73167a320aceee4882ed66bcd13ae4892bd423a457769d6245d3994d035ade287c0c55ce # p_scalar = n - 68 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, d467b0e82fc4663ed9c5d61f09f68f4c29b049577e0fca014277e8927030cc9a59a9e6886b1e723fc02ed662797cc7d4 # p_scalar = n - 67 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52930 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 8322cb8aac794994096a6bf01362c5f95990b746c6ebc0031a7e35ed3f59e4bc104ab1a642785d0652763b7b0a109ed1 # p_scalar = n - 66 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52931 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, b287be9507f55d0492b480eed70d6c3a6fd331a3b0d5aea54ed3fd192a684508a580d040c2c889076cf203a6209b336d # p_scalar = n - 65 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52932 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, ea6f2528a55bb1c9a2866c24c8f9f08719763d6d889d66ddab784b2cde2bc266b6a487833ad995d30e16d83d30fc79f9 # p_scalar = n - 64 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52933 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 888b708b9404ca513ee127895ecd3fe86d97cabc301fe259fe51bbbf1090fede0fd1c52df091bc01b213c6a030a9325b # p_scalar = n - 63 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52934 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, 52bb3712a0a689e8f5af7b8e3735df22dc89bd4997d4048d3bb034e888d17f198d3a5f621ecd7b1a3bb6c1f518202c80 # p_scalar = n - 62 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52935 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, 0902cc23149446b8cac324ec82c4faa73d2508922ba9239b65609e59d9ff0aba5f5e9b1fd630c145af623d3f21da4d42 # p_scalar = n - 61 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52936 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, c4cc11451fc69829b0a6c77201466d230dda19ffe5275767e6a7885370d303eb394d32cd6ae9f4ac6640f1177d381266 # p_scalar = n - 60 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52937 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 8dd21bf0b4ea4f5129fc3b284892e676bb45a51f948a8375acd70b86ad2a20fcf0e0f4f7e682aa2909f92adc16eb7b95 # p_scalar = n - 59 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52938 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, ff336f12504655c196d9ba0bd9e3ca196fb34b3028463cceaccf2edd7b05970341bdb741b335eff0df0c2aae3a522fbe # p_scalar = n - 58 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52939 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, 2b51995f794da901c08595e35548fbeae11699e909fa58a1b5f157aa569b57d8b8b4ac9ffa80380a9f3f7baa1929e675 # p_scalar = n - 57 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, 0a823b9a4b26df63d2e130552952c1fc8f427bc473c81d5b0d60bab7e809a13c7788c258a1737b65a101a483ab74b05d # p_scalar = n - 56 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, 31ff648e0f88b82d56fefff326f349ce05826192490bb572b623a1aeeb8cc21c28179e6cc852f64bd141235c553fb41d # p_scalar = n - 55 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 7460257314ceeed46a91e73997d0fa0617c6b5cbbe2334f88de3107c3d079f6182af23aa180a63a74ebdee7d281f7884 # p_scalar = n - 54 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, 420eb673906a29496e9e86bb7b1eb77a1ae1dd97d13444bb0bf879d693b44ea68dbb571c77fcd1f4340a767034adeda3 # p_scalar = n - 53 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, edf2e3eb7ecc9485adc93d9a481765e2d2c71ad1390699635786a19a4e2fa83eebec6442089efa8b2a2054b495618501 # p_scalar = n - 52 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, c5cc339dcba1fd4b222465866e5ede7690e2aead7f78aaf86d0a166ced3c3b7a0a8930fc1208b9faa9e5af3ccae07f15 # p_scalar = n - 51 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52940 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, 518b047dcbaa0d97c69489e2373f1a0d0b2240003c887d36daeac0c3570543f0324d067e7359dd35adc18bf9b16ec84f # p_scalar = n - 50 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52941 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 6f58fa8b7181c2a16f7bfa7e13a4f7d6c1b444139333e4056124642f0f32b151df7dc7053048461a83a9f17e308c4545 # p_scalar = n - 49 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52942 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, 2d1cc518e28b2bdb771e64415b57be2f2487edd57f82bdd3fc4486ee49c9ebe88d6c174ed2497d483113c74313b25712 # p_scalar = n - 48 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52943 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, 271e42a12624a58348eab00eb5c9462c2605ca009da2a2ca5c3ca10d04bab9854580609da766ddf13d30625e5ffef312 # p_scalar = n - 47 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52944 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, ac9dfec7dfa72a8beef006912e20fc23dfeea1a265e0fc91f86562a898fb34ff9c701758249cf9b7487ae8bd22437ed1 # p_scalar = n - 46 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52945 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, fc539eb3e259c7dbc82d5998ec090d0619ab802314eb4ab9d7a198a4185a849ca1590c30ecf5864360efb1147fdc2d7a # p_scalar = n - 45 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52946 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, 42eb2979db83a48517477722bd2af19e16f96676b7234e93eb3b44a9e5b5691862b2f54351fcca3f8f8878d76eeed85d # p_scalar = n - 44 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52947 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, 5fb28e322a1dd73bade6096d02e543ae47678afb27dda8e5c680176505c7ad6c7cc82a4df1698fb2c3336331bbad8346 # p_scalar = n - 43 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52948 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 8f3f1f63c9632b78a974b09415cbf948aaf8e0f6bd0628dfbce78aa9ede314bb1b7ee42d749e5498cf79fc1b36baf1a7 # p_scalar = n - 42 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52949 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, db6829c2f002bb6e50029568472a7175e739fb61eaa6776325d0caaeda1eadf40d959ba9796d9129863a23a3a553e8e3 # p_scalar = n - 41 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 82ea702eeb18f1c5679952c7d193272ebdc9d6c34f9f589a57860ce121646f315ac762e00f3c9d6ea2fe2c4782eb23e2 # p_scalar = n - 40 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, dfd92b6da914bb01dbb22c9ddeb46e6c63a00a0a60e0aa2a98ff87f7370eb7441df8cc84a69ea3a354b9cd8db593d816 # p_scalar = n - 39 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, 2d7bc128074968fb1a95355f1cd60340b646e453436d9fe2345c553ab53153b87b2b0ab3e82947474c0638476a71ae7a # p_scalar = n - 38 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, 1f466694520618f2129be314974320a4f300e1c648347f9adae2479844956b9387c183c3e1a0e06c91af26eaabc13488 # p_scalar = n - 37 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, fa0e07b7fe85bf85284fcbb5638ca337b50649a894047d1f2ea912435d2ca0342f1643d514594bee6c91c0c98be5589e # p_scalar = n - 36 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, f699887b806085b7df33eed7b73401b16a3258ec33f5567510209418c167fd201d11bc5ed6e28138597edf370fb077bc # p_scalar = n - 35 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52950 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, b13a8ad830e23f26ac8a877f52ccd35c22f19fab28f35eee50018998988092a20ce18088a55e0956feb026e93deeb52a # p_scalar = n - 34 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52951 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, a964eefbfdadd24e03c050a06152072602d00cfb8a76b2d69e1418a4554557c3470ddc68f8a57f48ebcbda0786da3943 # p_scalar = n - 33 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52952 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, a7fd2b619057dad76fcc93a1b8c310728a416eb9bb6f0aba08467cea48b90b9113bf6124c209e55e7fd73e8e3a625e76 # p_scalar = n - 32 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52953 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, c510ad93aabca99f73b42725b35b4ff04bcb06f00a2377b677315f9e9448fd08a372dfc2f2a52bfd1148bc72687c20bb # p_scalar = n - 31 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52954 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, 475a3e756398a19d5b3d0d6d36beecc4d7dd464f045a7a1c402a9bab42eb20ddbc0a699b374c4b08dab83288127fc1da # p_scalar = n - 30 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52955 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 941292e500f88cb2f569446a2755569296c21b29f6a167f23117dd04d47a41dc1846eefcdd3eb156dc6c5d1dc12748a1 # p_scalar = n - 29 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52956 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, 1d2a1c015977f16cf6f57e7190c820338e6db10b404505fbab178d26cce851b3293c164920c83de21a5284a0865dded3 # p_scalar = n - 28 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52957 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, 05cdca3fe7988176792377fbf8eb8319c48ee6f3b033c112184bd4733ad6983a9ff769c4875fee0ff1bc89b628e77f9e # p_scalar = n - 27 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52958 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, 17820a0bc5134ed767e67195d44d3cdf7d26540638c85a85d779adfe31da1bea58a6d7f569e2f8f442aad1d61b68e9f8 # p_scalar = n - 26 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, 47d98a9df092241cbf2c0862697c08fd5d512df99d42a72725c7b9146f5f24c7db3f422d95e16d6eedda4ae48a8f5dcb # p_scalar = n - 25 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, 1fe6fb42e97809dcda3e1a3d4cebc96ed6a2f51dea8e434401628f059424a3cc83ccbc4e9009e3919944fd2e61124f05 # p_scalar = n - 24 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, 150808e625a302c91395a87966a4e904e8277439a0f9ad3adf5579fa4bea82dd98d82ad1da247ec8890932d7bd3d10c3 # p_scalar = n - 23 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 9dfccb0de2212559282d2437566718c1f0138950eaf22c7e7ad8a132a527cebe0bcca3f0a65e48137fc33a6bec52abad # p_scalar = n - 22 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 671d69c98fcd841850fc847215809cddc764edf840d0fcf77b1ab489cbf837b7f9d62fd9c9576c694d1c3049faa71fdc # p_scalar = n - 21 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, 21824f411353ccba266ad15aacea5817b454111e8527cd59262ebb498a149098aa740a9e38f17bea8014214b008c5de7 # p_scalar = n - 20 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, ab9dd81052ebfb015e01b72b4718bbc7422da643ffe6132b9933fb25dccd4df325f546ab321828ffe27a189460d4db60 # p_scalar = n - 19 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52960 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, a1d47b23e957776415d1dc778264b6723f5a799bb67f30c39170b3786ff2f643a8c72d3cc3da2eac46b78e5db0dc21d0 # p_scalar = n - 18 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52961 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 91700b247eb1be639bdd6a092945a7576ffcfc7ca4cfd9bbc266eb844112985854b867b7f78aa7de8a60717f75c64513 # p_scalar = n - 17 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52962 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, ac37986f55b164c925eb5df1b3c2677af87d6d854a54504a49ce6993336bf1834e23b6ffd5b9c0da3fcc69cd6c12f055 # p_scalar = n - 16 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52963 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 659db48181ef251351c305c6a72d1967b333bdfbc88ee148914871dc154d410feb07ddea230cf00d9b21615fefabca26 # p_scalar = n - 15 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52964 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, 5a68c6fed0bc27168733fc41400c5797dddc2866d898f4704b23d3a0de06610c61609cbd144bd5862309cc9d6fe989bb # p_scalar = n - 14 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52965 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, 4429839ddefbadf5647d24db13690a7472445345d9c3b6911ecc8585e11dbbbf540b8b82730a99d1be4b4a9003cb68e5 # p_scalar = n - 13 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52966 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, 4617adb7cc6979e181fdbd1c3b490ec3b7feac2dfec38d60789a2a48cf4d0fe3d8e88f1a87cae0c2f4d394596c3d812d # p_scalar = n - 12 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52967 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, 0c6e430ef9c4af3d0329eab1f7942f0e40c64a4e66bed5af8c79848fd0e102ac80d60af627aa651afacc45e48be55ed8 # p_scalar = n - 11 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52968 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 9aa62f9f3533f91841821d0c3a53287a2e070f36fe9e682e3ce813298a77e780604fe46bac144b83764eb146bdc4ba25 # p_scalar = n - 10 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 6eb995bec80174e83e03370a47a9b8aa81961b8ccfd7fd1d592ac0ba794eabfd03a530eb13b9e85cbb971f78e67b5fce # p_scalar = n - 9 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296a p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, e770633431e8f5c67d9429f4ee69a754a6ecaccc68ead0d827f061c7033ca7c23777e270d742aa2ff2813072b18ec0b0 # p_scalar = n - 8 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296b p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, 3c0c6dd70d27ef617008d943c48ecf0ee9923263a42dbba2701754bf7d8686e4836dbb36b7e55e870d2cfe83e6655a44 # p_scalar = n - 7 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296c p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, d90a16b6af6c9b3ef57f238e693b07060ff37c0401fff78065aad76f50130844135349d5a8641c790996b2207706a61e # p_scalar = n - 6 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296d p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, c9962152af2a9eba586d8ededf21559a93c9e5f61b546f058bd4bffcb79e33b0739ac69d5b3d4dce3f62b16ea7b08203 # p_scalar = n - 5 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296e p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, 4db1c9d6e209e4a3e6c5944024de236d4b237faf982c041180b61b3101c35b9922c16e2e72f345662b694ba07073fa21 # p_scalar = n - 4 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296f p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, 50946875303df319e607b9e33820017d147162d30418c6938e3e61a34c542ad1e74bb7f17bfec97e54f3e8e79b3a03b2 # p_scalar = n - 3 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, 465465fc983292aff6db68b15102b33968012d5ad2e1d0b4132663c04ef6744692d789a77ae0e36d7e284821c04ee157 # p_scalar = n - 2 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda # p_scalar = n - 1 p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe ring-0.16.9/src/ec/suite_b/ops/p384_point_sum_tests.txt000064400000000000000000000421311352331573000211260ustar0000000000000000 # inf + inf == 2 * inf == inf a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf (n*G) == 2 * inf == inf a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # inf (n*G) + inf == 2 * inf == inf a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # inf + inf (n*G) == 2 * inf == inf a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = inf # G + inf == G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe # G + inf (n*G) == G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe # inf + G == G a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe # inf (n*G) + G == G a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe # G + G == 2*G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda # (n-1)*G + G == inf; note that -G is (n-1)*G a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = inf # G + (n-1)*G == inf; note that -G is (n-1)*G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = inf # (n-1)*G + (n-1)*G == 2*(n-1)*G a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # (n-1)*G (affine) + (n-1)*G == 2*(n-1)*G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # (n-1)*G + -(n-1)*G == inf a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = inf # -(n-1)*G + (n-1)*G == inf a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = inf # -(n-1)*G (affine) + (n-1)*G == inf a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = inf # -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = inf # -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = inf # (n-1)*G + -G; == -2*G; note that -G == (n-1)*G (affine) a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # -G + (n-1)*G == -2*G; note that -G is (n-1)*G (affine) a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # (n-1)*G + -G == -2*G; note that -G is (n-1)*G (affine) a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # -G + (n-1)*G == -2*G; note that -G = (n-1)*G a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 # -G + G == inf; note that -G is (n-1)*G (affine) a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = inf # G + -G == inf; note that -G is (n-1)*G (affine) a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 r = inf ring-0.16.9/src/ec/suite_b/ops/p384_scalar_mul_tests.txt000064400000000000000000000024301352331573000212310ustar0000000000000000 a = 00 b = 00 r = 00 a = 00 b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 r = 00 a = 01 b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 r = caa357821c6244e05eafdf931b0e6b53872b45a79929e877e4c3adcae9998bc585acc2c6a24bb9ca8be13114da045062 a = 02 b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 r = 9546af0438c489c0bd5fbf26361cd6a70e568b4f3253d0f002240e13defbe9abb33f77dafbe6cc1a2ad648bee7437751 a = 03 b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 r = 5fea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9681f846e5cd45e4791e0d22cef5581de69c9cb6068f4829e40 a = 7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9 b = 02 r = caa357821c6244e05eafdf931b0e6b53872b45a79929e877e4c3adcae9998bc585acc2c6a24bb9ca8be13114da045062 a = 7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba b = 02 r = 355ca87de39dbb1fa150206ce4f194ac78d4ba5866d61787e29f9fb70a9da219d26d4aeba664edb0610ae855f2c0d911 a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b = 02 r = 01 ring-0.16.9/src/ec/suite_b/ops.rs000064400000000000000000001150521353036607100147230ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{arithmetic::montgomery::*, c, error, limb::*}; use core::marker::PhantomData; use untrusted; pub use self::elem::*; /// A field element, i.e. an element of ℤ/qℤ for the curve's field modulus /// *q*. pub type Elem = elem::Elem; /// Represents the (prime) order *q* of the curve's prime field. #[derive(Clone, Copy)] pub enum Q {} /// A scalar. Its value is in [0, n). Zero-valued scalars are forbidden in most /// contexts. pub type Scalar = elem::Elem; /// Represents the prime order *n* of the curve's group. #[derive(Clone, Copy)] pub enum N {} pub struct Point { // The coordinates are stored in a contiguous array, where the first // `ops.num_limbs` elements are the X coordinate, the next // `ops.num_limbs` elements are the Y coordinate, and the next // `ops.num_limbs` elements are the Z coordinate. This layout is dictated // by the requirements of the GFp_nistz256 code. xyz: [Limb; 3 * MAX_LIMBS], } impl Point { pub fn new_at_infinity() -> Point { Point { xyz: [0; 3 * MAX_LIMBS], } } } static ONE: Elem = Elem { limbs: limbs![1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], m: PhantomData, encoding: PhantomData, }; /// Operations and values needed by all curve operations. pub struct CommonOps { pub num_limbs: usize, q: Modulus, pub n: Elem, pub a: Elem, // Must be -3 mod q pub b: Elem, // In all cases, `r`, `a`, and `b` may all alias each other. elem_add_impl: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), elem_mul_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), elem_sqr_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), point_add_jacobian_impl: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), } impl CommonOps { #[inline] pub fn elem_add(&self, a: &mut Elem, b: &Elem) { binary_op_assign(self.elem_add_impl, a, b) } #[inline] pub fn elems_are_equal(&self, a: &Elem, b: &Elem) -> LimbMask { limbs_equal_limbs_consttime(&a.limbs[..self.num_limbs], &b.limbs[..self.num_limbs]) } #[inline] pub fn elem_unencoded(&self, a: &Elem) -> Elem { self.elem_product(a, &ONE) } #[inline] pub fn elem_mul(&self, a: &mut Elem, b: &Elem) { binary_op_assign(self.elem_mul_mont, a, b) } #[inline] pub fn elem_product( &self, a: &Elem, b: &Elem, ) -> Elem<<(EA, EB) as ProductEncoding>::Output> where (EA, EB): ProductEncoding, { mul_mont(self.elem_mul_mont, a, b) } #[inline] pub fn elem_square(&self, a: &mut Elem) { unary_op_assign(self.elem_sqr_mont, a); } #[inline] pub fn elem_squared(&self, a: &Elem) -> Elem { unary_op(self.elem_sqr_mont, a) } #[inline] pub fn is_zero(&self, a: &elem::Elem) -> bool { limbs_are_zero_constant_time(&a.limbs[..self.num_limbs]) == LimbMask::True } pub fn elem_verify_is_not_zero(&self, a: &Elem) -> Result<(), error::Unspecified> { if self.is_zero(a) { Err(error::Unspecified) } else { Ok(()) } } pub fn point_sum(&self, a: &Point, b: &Point) -> Point { let mut r = Point::new_at_infinity(); unsafe { (self.point_add_jacobian_impl)(r.xyz.as_mut_ptr(), a.xyz.as_ptr(), b.xyz.as_ptr()) } r } pub fn point_x(&self, p: &Point) -> Elem { let mut r = Elem::zero(); r.limbs[..self.num_limbs].copy_from_slice(&p.xyz[0..self.num_limbs]); r } pub fn point_y(&self, p: &Point) -> Elem { let mut r = Elem::zero(); r.limbs[..self.num_limbs].copy_from_slice(&p.xyz[self.num_limbs..(2 * self.num_limbs)]); r } pub fn point_z(&self, p: &Point) -> Elem { let mut r = Elem::zero(); r.limbs[..self.num_limbs] .copy_from_slice(&p.xyz[(2 * self.num_limbs)..(3 * self.num_limbs)]); r } } struct Modulus { p: [Limb; MAX_LIMBS], rr: [Limb; MAX_LIMBS], } /// Operations on private keys, for ECDH and ECDSA signing. pub struct PrivateKeyOps { pub common: &'static CommonOps, elem_inv_squared: fn(a: &Elem) -> Elem, point_mul_base_impl: fn(a: &Scalar) -> Point, point_mul_impl: unsafe extern "C" fn( r: *mut Limb, // [3][num_limbs] p_scalar: *const Limb, // [num_limbs] p_x: *const Limb, // [num_limbs] p_y: *const Limb, // [num_limbs] ), } impl PrivateKeyOps { #[inline(always)] pub fn point_mul_base(&self, a: &Scalar) -> Point { (self.point_mul_base_impl)(a) } #[inline(always)] pub fn point_mul(&self, p_scalar: &Scalar, (p_x, p_y): &(Elem, Elem)) -> Point { let mut r = Point::new_at_infinity(); unsafe { (self.point_mul_impl)( r.xyz.as_mut_ptr(), p_scalar.limbs.as_ptr(), p_x.limbs.as_ptr(), p_y.limbs.as_ptr(), ); } r } #[inline] pub fn elem_inverse_squared(&self, a: &Elem) -> Elem { (self.elem_inv_squared)(a) } } /// Operations and values needed by all operations on public keys (ECDH /// agreement and ECDSA verification). pub struct PublicKeyOps { pub common: &'static CommonOps, } impl PublicKeyOps { // The serialized bytes are in big-endian order, zero-padded. The limbs // of `Elem` are in the native endianness, least significant limb to // most significant limb. Besides the parsing, conversion, this also // implements NIST SP 800-56A Step 2: "Verify that xQ and yQ are integers // in the interval [0, p-1] in the case that q is an odd prime p[.]" pub fn elem_parse(&self, input: &mut untrusted::Reader) -> Result, error::Unspecified> { let encoded_value = input.read_bytes(self.common.num_limbs * LIMB_BYTES)?; let parsed = elem_parse_big_endian_fixed_consttime(self.common, encoded_value)?; let mut r = Elem::zero(); // Montgomery encode (elem_to_mont). // TODO: do something about this. unsafe { (self.common.elem_mul_mont)( r.limbs.as_mut_ptr(), parsed.limbs.as_ptr(), self.common.q.rr.as_ptr(), ) } Ok(r) } } // Operations used by both ECDSA signing and ECDSA verification. In general // these must be side-channel resistant. pub struct ScalarOps { pub common: &'static CommonOps, scalar_inv_to_mont_impl: fn(a: &Scalar) -> Scalar, scalar_mul_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), } impl ScalarOps { // The (maximum) length of a scalar, not including any padding. pub fn scalar_bytes_len(&self) -> usize { self.common.num_limbs * LIMB_BYTES } /// Returns the modular inverse of `a` (mod `n`). Panics of `a` is zero, /// because zero isn't invertible. pub fn scalar_inv_to_mont(&self, a: &Scalar) -> Scalar { assert!(!self.common.is_zero(a)); (self.scalar_inv_to_mont_impl)(a) } #[inline] pub fn scalar_product( &self, a: &Scalar, b: &Scalar, ) -> Scalar<<(EA, EB) as ProductEncoding>::Output> where (EA, EB): ProductEncoding, { mul_mont(self.scalar_mul_mont, a, b) } } /// Operations on public scalars needed by ECDSA signature verification. pub struct PublicScalarOps { pub scalar_ops: &'static ScalarOps, pub public_key_ops: &'static PublicKeyOps, // XXX: `PublicScalarOps` shouldn't depend on `PrivateKeyOps`, but it does // temporarily until `twin_mul` is rewritten. pub private_key_ops: &'static PrivateKeyOps, pub q_minus_n: Elem, } impl PublicScalarOps { #[inline] pub fn scalar_as_elem(&self, a: &Scalar) -> Elem { Elem { limbs: a.limbs, m: PhantomData, encoding: PhantomData, } } pub fn elem_equals(&self, a: &Elem, b: &Elem) -> bool { for i in 0..self.public_key_ops.common.num_limbs { if a.limbs[i] != b.limbs[i] { return false; } } true } pub fn elem_less_than(&self, a: &Elem, b: &Elem) -> bool { let num_limbs = self.public_key_ops.common.num_limbs; limbs_less_than_limbs_vartime(&a.limbs[..num_limbs], &b.limbs[..num_limbs]) } #[inline] pub fn elem_sum(&self, a: &Elem, b: &Elem) -> Elem { binary_op(self.public_key_ops.common.elem_add_impl, a, b) } } #[allow(non_snake_case)] pub struct PrivateScalarOps { pub scalar_ops: &'static ScalarOps, pub oneRR_mod_n: Scalar, // 1 * R**2 (mod n). TOOD: Use One. } // This assumes n < q < 2*n. pub fn elem_reduced_to_scalar(ops: &CommonOps, elem: &Elem) -> Scalar { let num_limbs = ops.num_limbs; let mut r_limbs = elem.limbs; limbs_reduce_once_constant_time(&mut r_limbs[..num_limbs], &ops.n.limbs[..num_limbs]); Scalar { limbs: r_limbs, m: PhantomData, encoding: PhantomData, } } pub fn scalar_sum(ops: &CommonOps, a: &Scalar, b: &Scalar) -> Scalar { let mut r = Scalar::zero(); unsafe { LIMBS_add_mod( r.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr(), ops.n.limbs.as_ptr(), ops.num_limbs, ) } r } // Returns (`a` squared `squarings` times) * `b`. fn elem_sqr_mul(ops: &CommonOps, a: &Elem, squarings: usize, b: &Elem) -> Elem { debug_assert!(squarings >= 1); let mut tmp = ops.elem_squared(a); for _ in 1..squarings { ops.elem_square(&mut tmp); } ops.elem_product(&tmp, b) } // Sets `acc` = (`acc` squared `squarings` times) * `b`. fn elem_sqr_mul_acc(ops: &CommonOps, acc: &mut Elem, squarings: usize, b: &Elem) { debug_assert!(squarings >= 1); for _ in 0..squarings { ops.elem_square(acc); } ops.elem_mul(acc, b) } #[inline] pub fn elem_parse_big_endian_fixed_consttime( ops: &CommonOps, bytes: untrusted::Input, ) -> Result, error::Unspecified> { parse_big_endian_fixed_consttime(ops, bytes, AllowZero::Yes, &ops.q.p[..ops.num_limbs]) } #[inline] pub fn scalar_parse_big_endian_fixed_consttime( ops: &CommonOps, bytes: untrusted::Input, ) -> Result { parse_big_endian_fixed_consttime(ops, bytes, AllowZero::No, &ops.n.limbs[..ops.num_limbs]) } #[inline] pub fn scalar_parse_big_endian_variable( ops: &CommonOps, allow_zero: AllowZero, bytes: untrusted::Input, ) -> Result { let mut r = Scalar::zero(); parse_big_endian_in_range_and_pad_consttime( bytes, allow_zero, &ops.n.limbs[..ops.num_limbs], &mut r.limbs[..ops.num_limbs], )?; Ok(r) } pub fn scalar_parse_big_endian_partially_reduced_variable_consttime( ops: &CommonOps, allow_zero: AllowZero, bytes: untrusted::Input, ) -> Result { let mut r = Scalar::zero(); parse_big_endian_in_range_partially_reduced_and_pad_consttime( bytes, allow_zero, &ops.n.limbs[..ops.num_limbs], &mut r.limbs[..ops.num_limbs], )?; Ok(r) } fn parse_big_endian_fixed_consttime( ops: &CommonOps, bytes: untrusted::Input, allow_zero: AllowZero, max_exclusive: &[Limb], ) -> Result, error::Unspecified> { if bytes.len() != ops.num_limbs * LIMB_BYTES { return Err(error::Unspecified); } let mut r = elem::Elem::zero(); parse_big_endian_in_range_and_pad_consttime( bytes, allow_zero, max_exclusive, &mut r.limbs[..ops.num_limbs], )?; Ok(r) } extern "C" { fn LIMBS_add_mod( r: *mut Limb, a: *const Limb, b: *const Limb, m: *const Limb, num_limbs: c::size_t, ); } #[cfg(test)] mod tests { use super::*; use crate::test; use alloc::{format, vec, vec::Vec}; use untrusted; const ZERO_SCALAR: Scalar = Scalar { limbs: [0; MAX_LIMBS], m: PhantomData, encoding: PhantomData, }; fn q_minus_n_plus_n_equals_0_test(ops: &PublicScalarOps) { let cops = ops.scalar_ops.common; let mut x = ops.q_minus_n; cops.elem_add(&mut x, &cops.n); assert!(cops.is_zero(&x)); } #[test] fn p256_q_minus_n_plus_n_equals_0_test() { q_minus_n_plus_n_equals_0_test(&p256::PUBLIC_SCALAR_OPS); } #[test] fn p384_q_minus_n_plus_n_equals_0_test() { q_minus_n_plus_n_equals_0_test(&p384::PUBLIC_SCALAR_OPS); } #[test] fn p256_elem_add_test() { elem_add_test( &p256::PUBLIC_SCALAR_OPS, test_file!("ops/p256_elem_sum_tests.txt"), ); } #[test] fn p384_elem_add_test() { elem_add_test( &p384::PUBLIC_SCALAR_OPS, test_file!("ops/p384_elem_sum_tests.txt"), ); } fn elem_add_test(ops: &PublicScalarOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let cops = ops.public_key_ops.common; let a = consume_elem(cops, test_case, "a"); let b = consume_elem(cops, test_case, "b"); let expected_sum = consume_elem(cops, test_case, "r"); let mut actual_sum = a.clone(); ops.public_key_ops.common.elem_add(&mut actual_sum, &b); assert_limbs_are_equal(cops, &actual_sum.limbs, &expected_sum.limbs); let mut actual_sum = b.clone(); ops.public_key_ops.common.elem_add(&mut actual_sum, &a); assert_limbs_are_equal(cops, &actual_sum.limbs, &expected_sum.limbs); Ok(()) }) } // XXX: There's no `GFp_nistz256_sub` in *ring*; it's logic is inlined into // the point arithmetic functions. Thus, we can't test it. #[test] fn p384_elem_sub_test() { extern "C" { fn GFp_p384_elem_sub(r: *mut Limb, a: *const Limb, b: *const Limb); } elem_sub_test( &p384::COMMON_OPS, GFp_p384_elem_sub, test_file!("ops/p384_elem_sum_tests.txt"), ); } fn elem_sub_test( ops: &CommonOps, elem_sub: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_elem(ops, test_case, "a"); let b = consume_elem(ops, test_case, "b"); let r = consume_elem(ops, test_case, "r"); let mut actual_difference = Elem::::zero(); unsafe { elem_sub( actual_difference.limbs.as_mut_ptr(), r.limbs.as_ptr(), b.limbs.as_ptr(), ); } assert_limbs_are_equal(ops, &actual_difference.limbs, &a.limbs); let mut actual_difference = Elem::::zero(); unsafe { elem_sub( actual_difference.limbs.as_mut_ptr(), r.limbs.as_ptr(), a.limbs.as_ptr(), ); } assert_limbs_are_equal(ops, &actual_difference.limbs, &b.limbs); Ok(()) }) } // XXX: There's no `GFp_nistz256_div_by_2` in *ring*; it's logic is inlined // into the point arithmetic functions. Thus, we can't test it. #[test] fn p384_elem_div_by_2_test() { extern "C" { fn GFp_p384_elem_div_by_2(r: *mut Limb, a: *const Limb); } elem_div_by_2_test( &p384::COMMON_OPS, GFp_p384_elem_div_by_2, test_file!("ops/p384_elem_div_by_2_tests.txt"), ); } fn elem_div_by_2_test( ops: &CommonOps, elem_div_by_2: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_elem(ops, test_case, "a"); let r = consume_elem(ops, test_case, "r"); let mut actual_result = Elem::::zero(); unsafe { elem_div_by_2(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr()); } assert_limbs_are_equal(ops, &actual_result.limbs, &r.limbs); Ok(()) }) } // TODO: Add test vectors that test the range of values above `q`. #[test] fn p256_elem_neg_test() { extern "C" { fn GFp_nistz256_neg(r: *mut Limb, a: *const Limb); } elem_neg_test( &p256::COMMON_OPS, GFp_nistz256_neg, test_file!("ops/p256_elem_neg_tests.txt"), ); } #[test] fn p384_elem_neg_test() { extern "C" { fn GFp_p384_elem_neg(r: *mut Limb, a: *const Limb); } elem_neg_test( &p384::COMMON_OPS, GFp_p384_elem_neg, test_file!("ops/p384_elem_neg_tests.txt"), ); } fn elem_neg_test( ops: &CommonOps, elem_neg: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_elem(ops, test_case, "a"); let b = consume_elem(ops, test_case, "b"); // Verify -a == b. { let mut actual_result = Elem::::zero(); unsafe { elem_neg(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr()); } assert_limbs_are_equal(ops, &actual_result.limbs, &b.limbs); } // Verify -b == a. { let mut actual_result = Elem::::zero(); unsafe { elem_neg(actual_result.limbs.as_mut_ptr(), b.limbs.as_ptr()); } assert_limbs_are_equal(ops, &actual_result.limbs, &a.limbs); } Ok(()) }) } #[test] fn p256_elem_mul_test() { elem_mul_test(&p256::COMMON_OPS, test_file!("ops/p256_elem_mul_tests.txt")); } #[test] fn p384_elem_mul_test() { elem_mul_test(&p384::COMMON_OPS, test_file!("ops/p384_elem_mul_tests.txt")); } fn elem_mul_test(ops: &CommonOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let mut a = consume_elem(ops, test_case, "a"); let b = consume_elem(ops, test_case, "b"); let r = consume_elem(ops, test_case, "r"); ops.elem_mul(&mut a, &b); assert_limbs_are_equal(ops, &a.limbs, &r.limbs); Ok(()) }) } #[test] fn p256_scalar_mul_test() { scalar_mul_test( &p256::SCALAR_OPS, test_file!("ops/p256_scalar_mul_tests.txt"), ); } #[test] fn p384_scalar_mul_test() { scalar_mul_test( &p384::SCALAR_OPS, test_file!("ops/p384_scalar_mul_tests.txt"), ); } fn scalar_mul_test(ops: &ScalarOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let cops = ops.common; let mut a = consume_scalar(cops, test_case, "a"); let b = consume_scalar_mont(cops, test_case, "b"); let expected_result = consume_scalar(cops, test_case, "r"); let actual_result = ops.scalar_product(&mut a, &b); assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); Ok(()) }) } #[test] fn p256_scalar_square_test() { extern "C" { fn GFp_p256_scalar_sqr_rep_mont(r: *mut Limb, a: *const Limb, rep: Limb); } scalar_square_test( &p256::SCALAR_OPS, GFp_p256_scalar_sqr_rep_mont, test_file!("ops/p256_scalar_square_tests.txt"), ); } // XXX: There's no `p384_scalar_square_test()` because there's no dedicated // `GFp_p384_scalar_sqr_rep_mont()`. fn scalar_square_test( ops: &ScalarOps, sqr_rep: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, rep: Limb), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let cops = &ops.common; let a = consume_scalar(cops, test_case, "a"); let expected_result = consume_scalar(cops, test_case, "r"); { let mut actual_result: Scalar = Scalar { limbs: [0; MAX_LIMBS], m: PhantomData, encoding: PhantomData, }; unsafe { sqr_rep(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr(), 1); } assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); } { let actual_result = ops.scalar_product(&a, &a); assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); } Ok(()) }) } #[test] #[should_panic(expected = "!self.common.is_zero(a)")] fn p256_scalar_inv_to_mont_zero_panic_test() { let _ = p256::SCALAR_OPS.scalar_inv_to_mont(&ZERO_SCALAR); } #[test] #[should_panic(expected = "!self.common.is_zero(a)")] fn p384_scalar_inv_to_mont_zero_panic_test() { let _ = p384::SCALAR_OPS.scalar_inv_to_mont(&ZERO_SCALAR); } #[test] fn p256_point_sum_test() { point_sum_test( &p256::PRIVATE_KEY_OPS, test_file!("ops/p256_point_sum_tests.txt"), ); } #[test] fn p384_point_sum_test() { point_sum_test( &p384::PRIVATE_KEY_OPS, test_file!("ops/p384_point_sum_tests.txt"), ); } fn point_sum_test(ops: &PrivateKeyOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_jacobian_point(ops, test_case, "a"); let b = consume_jacobian_point(ops, test_case, "b"); let r_expected = consume_point(ops, test_case, "r"); let r_actual = ops.common.point_sum(&a, &b); assert_point_actual_equals_expected(ops, &r_actual, &r_expected); Ok(()) }); } #[test] fn p256_point_sum_mixed_test() { extern "C" { fn GFp_nistz256_point_add_affine( r: *mut Limb, // [p256::COMMON_OPS.num_limbs*3] a: *const Limb, // [p256::COMMON_OPS.num_limbs*3] b: *const Limb, // [p256::COMMON_OPS.num_limbs*2] ); } point_sum_mixed_test( &p256::PRIVATE_KEY_OPS, GFp_nistz256_point_add_affine, test_file!("ops/p256_point_sum_mixed_tests.txt"), ); } // XXX: There is no `GFp_nistz384_point_add_affine()`. fn point_sum_mixed_test( ops: &PrivateKeyOps, point_add_affine: unsafe extern "C" fn( r: *mut Limb, // [ops.num_limbs*3] a: *const Limb, // [ops.num_limbs*3] b: *const Limb, // [ops.num_limbs*2] ), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_jacobian_point(ops, test_case, "a"); let b = consume_affine_point(ops, test_case, "b"); let r_expected = consume_point(ops, test_case, "r"); let mut r_actual = Point::new_at_infinity(); unsafe { point_add_affine(r_actual.xyz.as_mut_ptr(), a.xyz.as_ptr(), b.xy.as_ptr()); } assert_point_actual_equals_expected(ops, &r_actual, &r_expected); Ok(()) }); } #[test] fn p256_point_double_test() { extern "C" { fn GFp_nistz256_point_double( r: *mut Limb, // [p256::COMMON_OPS.num_limbs*3] a: *const Limb, // [p256::COMMON_OPS.num_limbs*3] ); } point_double_test( &p256::PRIVATE_KEY_OPS, GFp_nistz256_point_double, test_file!("ops/p256_point_double_tests.txt"), ); } #[test] fn p384_point_double_test() { extern "C" { fn GFp_nistz384_point_double( r: *mut Limb, // [p384::COMMON_OPS.num_limbs*3] a: *const Limb, // [p384::COMMON_OPS.num_limbs*3] ); } point_double_test( &p384::PRIVATE_KEY_OPS, GFp_nistz384_point_double, test_file!("ops/p384_point_double_tests.txt"), ); } fn point_double_test( ops: &PrivateKeyOps, point_double: unsafe extern "C" fn( r: *mut Limb, // [ops.num_limbs*3] a: *const Limb, // [ops.num_limbs*3] ), test_file: test::File, ) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let a = consume_jacobian_point(ops, test_case, "a"); let r_expected = consume_point(ops, test_case, "r"); let mut r_actual = Point::new_at_infinity(); unsafe { point_double(r_actual.xyz.as_mut_ptr(), a.xyz.as_ptr()); } assert_point_actual_equals_expected(ops, &r_actual, &r_expected); Ok(()) }); } #[test] fn p256_point_mul_test() { point_mul_tests( &p256::PRIVATE_KEY_OPS, test_file!("ops/p256_point_mul_tests.txt"), ); } #[test] fn p384_point_mul_test() { point_mul_tests( &p384::PRIVATE_KEY_OPS, test_file!("ops/p384_point_mul_tests.txt"), ); } fn point_mul_tests(ops: &PrivateKeyOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let p_scalar = consume_scalar(ops.common, test_case, "p_scalar"); let (x, y) = match consume_point(ops, test_case, "p") { TestPoint::Infinity => { panic!("can't be inf."); } TestPoint::Affine(x, y) => (x, y), }; let expected_result = consume_point(ops, test_case, "r"); let actual_result = ops.point_mul(&p_scalar, &(x, y)); assert_point_actual_equals_expected(ops, &actual_result, &expected_result); Ok(()) }) } #[test] fn p256_point_mul_serialized_test() { point_mul_serialized_test( &p256::PRIVATE_KEY_OPS, &p256::PUBLIC_KEY_OPS, test_file!("ops/p256_point_mul_serialized_tests.txt"), ); } fn point_mul_serialized_test( priv_ops: &PrivateKeyOps, pub_ops: &PublicKeyOps, test_file: test::File, ) { let cops = pub_ops.common; test::run(test_file, |section, test_case| { assert_eq!(section, ""); let p_scalar = consume_scalar(cops, test_case, "p_scalar"); let p = test_case.consume_bytes("p"); let p = super::super::public_key::parse_uncompressed_point( pub_ops, untrusted::Input::from(&p), ) .expect("valid point"); let expected_result = test_case.consume_bytes("r"); let product = priv_ops.point_mul(&p_scalar, &p); let mut actual_result = vec![4u8; 1 + (2 * (cops.num_limbs * LIMB_BYTES))]; { let (x, y) = actual_result[1..].split_at_mut(cops.num_limbs * LIMB_BYTES); super::super::private_key::big_endian_affine_from_jacobian( priv_ops, Some(x), Some(y), &product, ) .expect("successful encoding"); } assert_eq!(expected_result, actual_result); Ok(()) }) } #[test] fn p256_point_mul_base_test() { point_mul_base_tests( &p256::PRIVATE_KEY_OPS, test_file!("ops/p256_point_mul_base_tests.txt"), ); } #[test] fn p384_point_mul_base_test() { point_mul_base_tests( &p384::PRIVATE_KEY_OPS, test_file!("ops/p384_point_mul_base_tests.txt"), ); } fn point_mul_base_tests(ops: &PrivateKeyOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let g_scalar = consume_scalar(ops.common, test_case, "g_scalar"); let expected_result = consume_point(ops, test_case, "r"); let actual_result = ops.point_mul_base(&g_scalar); assert_point_actual_equals_expected(ops, &actual_result, &expected_result); Ok(()) }) } fn assert_point_actual_equals_expected( ops: &PrivateKeyOps, actual_point: &Point, expected_point: &TestPoint, ) { let cops = ops.common; let actual_x = &cops.point_x(&actual_point); let actual_y = &cops.point_y(&actual_point); let actual_z = &cops.point_z(&actual_point); match expected_point { TestPoint::Infinity => { let zero = Elem::zero(); assert_elems_are_equal(cops, &actual_z, &zero); } TestPoint::Affine(expected_x, expected_y) => { let zz_inv = ops.elem_inverse_squared(&actual_z); let x_aff = cops.elem_product(&actual_x, &zz_inv); let y_aff = { let zzzz_inv = cops.elem_squared(&zz_inv); let zzz_inv = cops.elem_product(&actual_z, &zzzz_inv); cops.elem_product(&actual_y, &zzz_inv) }; assert_elems_are_equal(cops, &x_aff, &expected_x); assert_elems_are_equal(cops, &y_aff, &expected_y); } } } fn consume_jacobian_point( ops: &PrivateKeyOps, test_case: &mut test::TestCase, name: &str, ) -> Point { let input = test_case.consume_string(name); let elems = input.split(", ").collect::>(); assert_eq!(elems.len(), 3); let mut p = Point::new_at_infinity(); consume_point_elem(ops.common, &mut p.xyz, &elems, 0); consume_point_elem(ops.common, &mut p.xyz, &elems, 1); consume_point_elem(ops.common, &mut p.xyz, &elems, 2); p } struct AffinePoint { xy: [Limb; 2 * MAX_LIMBS], } fn consume_affine_point( ops: &PrivateKeyOps, test_case: &mut test::TestCase, name: &str, ) -> AffinePoint { let input = test_case.consume_string(name); let elems = input.split(", ").collect::>(); assert_eq!(elems.len(), 2); let mut p = AffinePoint { xy: [0; 2 * MAX_LIMBS], }; consume_point_elem(ops.common, &mut p.xy, &elems, 0); consume_point_elem(ops.common, &mut p.xy, &elems, 1); p } fn consume_point_elem(ops: &CommonOps, limbs_out: &mut [Limb], elems: &Vec<&str>, i: usize) { let bytes = test::from_hex(elems[i]).unwrap(); let bytes = untrusted::Input::from(&bytes); let r: Elem = elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); // XXX: “Transmute” this to `Elem` limbs. limbs_out[(i * ops.num_limbs)..((i + 1) * ops.num_limbs)] .copy_from_slice(&r.limbs[..ops.num_limbs]); } enum TestPoint { Infinity, Affine(Elem, Elem), } fn consume_point(ops: &PrivateKeyOps, test_case: &mut test::TestCase, name: &str) -> TestPoint { fn consume_point_elem(ops: &CommonOps, elems: &Vec<&str>, i: usize) -> Elem { let bytes = test::from_hex(elems[i]).unwrap(); let bytes = untrusted::Input::from(&bytes); let unencoded: Elem = elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); // XXX: “Transmute” this to `Elem` limbs. Elem { limbs: unencoded.limbs, m: PhantomData, encoding: PhantomData, } } let input = test_case.consume_string(name); if input == "inf" { return TestPoint::Infinity; } let elems = input.split(", ").collect::>(); assert_eq!(elems.len(), 2); let x = consume_point_elem(ops.common, &elems, 0); let y = consume_point_elem(ops.common, &elems, 1); TestPoint::Affine(x, y) } fn assert_elems_are_equal(ops: &CommonOps, a: &Elem, b: &Elem) { assert_limbs_are_equal(ops, &a.limbs, &b.limbs) } fn assert_limbs_are_equal( ops: &CommonOps, actual: &[Limb; MAX_LIMBS], expected: &[Limb; MAX_LIMBS], ) { for i in 0..ops.num_limbs { if actual[i] != expected[i] { let mut s = alloc::string::String::new(); for j in 0..ops.num_limbs { let formatted = format!("{:016x}", actual[ops.num_limbs - j - 1]); s.push_str(&formatted); } panic!("Actual != Expected,\nActual = {}", s); } } } fn consume_elem(ops: &CommonOps, test_case: &mut test::TestCase, name: &str) -> Elem { let bytes = consume_padded_bytes(ops, test_case, name); let bytes = untrusted::Input::from(&bytes); let r: Elem = elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); // XXX: “Transmute” this to an `Elem`. Elem { limbs: r.limbs, m: PhantomData, encoding: PhantomData, } } fn consume_scalar(ops: &CommonOps, test_case: &mut test::TestCase, name: &str) -> Scalar { let bytes = test_case.consume_bytes(name); let bytes = untrusted::Input::from(&bytes); scalar_parse_big_endian_variable(ops, AllowZero::Yes, bytes).unwrap() } fn consume_scalar_mont( ops: &CommonOps, test_case: &mut test::TestCase, name: &str, ) -> Scalar { let bytes = test_case.consume_bytes(name); let bytes = untrusted::Input::from(&bytes); let s = scalar_parse_big_endian_variable(ops, AllowZero::Yes, bytes).unwrap(); // “Transmute” it to a `Scalar`. Scalar { limbs: s.limbs, m: PhantomData, encoding: PhantomData, } } fn consume_padded_bytes( ops: &CommonOps, test_case: &mut test::TestCase, name: &str, ) -> Vec { let unpadded_bytes = test_case.consume_bytes(name); let mut bytes = vec![0; (ops.num_limbs * LIMB_BYTES) - unpadded_bytes.len()]; bytes.extend(&unpadded_bytes); bytes } } #[cfg(feature = "internal_benches")] mod internal_benches { use super::{Limb, MAX_LIMBS}; pub const LIMBS_1: [Limb; MAX_LIMBS] = limbs![1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; pub const LIMBS_ALTERNATING_10: [Limb; MAX_LIMBS] = limbs![ 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010, 0b10101010_10101010_10101010_10101010 ]; } #[cfg(feature = "internal_benches")] macro_rules! bench_curve { ( $vectors:expr ) => { use super::super::{Elem, Scalar}; extern crate test; #[bench] fn elem_inverse_squared_bench(bench: &mut test::Bencher) { // This benchmark assumes that `elem_inverse_squared()` is // constant-time so inverting 1 mod q is as good of a choice as // anything. let mut a = Elem::zero(); a.limbs[0] = 1; bench.iter(|| { let _ = PRIVATE_KEY_OPS.elem_inverse_squared(&a); }); } #[bench] fn elem_product_bench(bench: &mut test::Bencher) { // This benchmark assumes that the multiplication is constant-time // so 0 * 0 is as good of a choice as anything. let a: Elem = Elem::zero(); let b: Elem = Elem::zero(); bench.iter(|| { let _ = COMMON_OPS.elem_product(&a, &b); }); } #[bench] fn elem_squared_bench(bench: &mut test::Bencher) { // This benchmark assumes that the squaring is constant-time so // 0**2 * 0 is as good of a choice as anything. let a = Elem::zero(); bench.iter(|| { let _ = COMMON_OPS.elem_squared(&a); }); } #[bench] fn scalar_inv_to_mont_bench(bench: &mut test::Bencher) { const VECTORS: &[Scalar] = $vectors; let vectors_len = VECTORS.len(); let mut i = 0; bench.iter(|| { let _ = SCALAR_OPS.scalar_inv_to_mont(&VECTORS[i]); i += 1; if i == vectors_len { i = 0; } }); } }; } mod elem; pub mod p256; pub mod p384; ring-0.16.9/src/ec/suite_b/private_key.rs000064400000000000000000000177421352416253600164560ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Functionality shared by operations on private keys (ECC keygen and //! ECDSA signing). use super::{ops::*, verify_affine_point_is_on_the_curve}; use crate::{ arithmetic::montgomery::R, ec, error, limb::{self, LIMB_BYTES}, rand, }; use untrusted; /// Generates a random scalar in the range [1, n). pub fn random_scalar( ops: &PrivateKeyOps, rng: &dyn rand::SecureRandom, ) -> Result { let num_limbs = ops.common.num_limbs; let mut bytes = [0; ec::SCALAR_MAX_BYTES]; let bytes = &mut bytes[..(num_limbs * LIMB_BYTES)]; generate_private_scalar_bytes(ops, rng, bytes)?; scalar_from_big_endian_bytes(ops, bytes) } pub fn generate_private_scalar_bytes( ops: &PrivateKeyOps, rng: &dyn rand::SecureRandom, out: &mut [u8], ) -> Result<(), error::Unspecified> { // [NSA Suite B Implementer's Guide to ECDSA] Appendix A.1.2, and // [NSA Suite B Implementer's Guide to NIST SP 800-56A] Appendix B.2, // "Key Pair Generation by Testing Candidates". // // [NSA Suite B Implementer's Guide to ECDSA]: doc/ecdsa.pdf. // [NSA Suite B Implementer's Guide to NIST SP 800-56A]: doc/ecdh.pdf. // TODO: The NSA guide also suggests, in appendix B.1, another mechanism // that would avoid the need to use `rng.fill()` more than once. It works // by generating an extra 64 bits of random bytes and then reducing the // output (mod n). Supposedly, this removes enough of the bias towards // small values from the modular reduction, but it isn't obvious that it is // sufficient. TODO: Figure out what we can do to mitigate the bias issue // and switch to the other mechanism. let candidate = out; // XXX: The value 100 was chosen to match OpenSSL due to uncertainty of // what specific value would be better, but it seems bad to try 100 times. for _ in 0..100 { // NSA Guide Steps 1, 2, and 3. // // Since we calculate the length ourselves, it is pointless to check // it, since we can only check it by doing the same calculation. // NSA Guide Step 4. // // The requirement that the random number generator has the // requested security strength is delegated to `rng`. rng.fill(candidate)?; // NSA Guide Steps 5, 6, and 7. if check_scalar_big_endian_bytes(ops, candidate).is_err() { continue; } // NSA Guide Step 8 is done in `public_from_private()`. // NSA Guide Step 9. return Ok(()); } Err(error::Unspecified) } // The underlying X25519 and Ed25519 code uses an [u8; 32] to store the private // key. To make the ECDH and ECDSA code similar to that, we also store the // private key that way, which means we have to convert it to a Scalar whenever // we need to use it. #[inline] pub fn private_key_as_scalar(ops: &PrivateKeyOps, private_key: &ec::Seed) -> Scalar { // This cannot fail because we know the private key is valid. scalar_from_big_endian_bytes(ops, private_key.bytes_less_safe()).unwrap() } pub fn check_scalar_big_endian_bytes( ops: &PrivateKeyOps, bytes: &[u8], ) -> Result<(), error::Unspecified> { debug_assert_eq!(bytes.len(), ops.common.num_limbs * LIMB_BYTES); scalar_from_big_endian_bytes(ops, bytes).map(|_| ()) } // Parses a fixed-length (zero-padded) big-endian-encoded scalar in the range // [1, n). This is constant-time with respect to the actual value *only if* the // value is actually in range. In other words, this won't leak anything about a // valid value, but it might leak small amounts of information about an invalid // value (which constraint it failed). pub fn scalar_from_big_endian_bytes( ops: &PrivateKeyOps, bytes: &[u8], ) -> Result { // [NSA Suite B Implementer's Guide to ECDSA] Appendix A.1.2, and // [NSA Suite B Implementer's Guide to NIST SP 800-56A] Appendix B.2, // "Key Pair Generation by Testing Candidates". // // [NSA Suite B Implementer's Guide to ECDSA]: doc/ecdsa.pdf. // [NSA Suite B Implementer's Guide to NIST SP 800-56A]: doc/ecdh.pdf. // // Steps 5, 6, and 7. // // XXX: The NSA guide says that we should verify that the random scalar is // in the range [0, n - 1) and then add one to it so that it is in the range // [1, n). Instead, we verify that the scalar is in the range [1, n). This // way, we avoid needing to compute or store the value (n - 1), we avoid the // need to implement a function to add one to a scalar, and we avoid needing // to convert the scalar back into an array of bytes. scalar_parse_big_endian_fixed_consttime(ops.common, untrusted::Input::from(bytes)) } pub fn public_from_private( ops: &PrivateKeyOps, public_out: &mut [u8], my_private_key: &ec::Seed, ) -> Result<(), error::Unspecified> { let elem_and_scalar_bytes = ops.common.num_limbs * LIMB_BYTES; debug_assert_eq!(public_out.len(), 1 + (2 * elem_and_scalar_bytes)); let my_private_key = private_key_as_scalar(ops, my_private_key); let my_public_key = ops.point_mul_base(&my_private_key); public_out[0] = 4; // Uncompressed encoding. let (x_out, y_out) = (&mut public_out[1..]).split_at_mut(elem_and_scalar_bytes); // `big_endian_affine_from_jacobian` verifies that the point is not at // infinity and is on the curve. big_endian_affine_from_jacobian(ops, Some(x_out), Some(y_out), &my_public_key) } pub fn affine_from_jacobian( ops: &PrivateKeyOps, p: &Point, ) -> Result<(Elem, Elem), error::Unspecified> { let z = ops.common.point_z(p); // Since we restrict our private key to the range [1, n), the curve has // prime order, and we verify that the peer's point is on the curve, // there's no way that the result can be at infinity. But, use `assert!` // instead of `debug_assert!` anyway assert!(ops.common.elem_verify_is_not_zero(&z).is_ok()); let x = ops.common.point_x(p); let y = ops.common.point_y(p); let zz_inv = ops.elem_inverse_squared(&z); let x_aff = ops.common.elem_product(&x, &zz_inv); // `y_aff` is needed to validate the point is on the curve. It is also // needed in the non-ECDH case where we need to output it. let y_aff = { let zzzz_inv = ops.common.elem_squared(&zz_inv); let zzz_inv = ops.common.elem_product(&z, &zzzz_inv); ops.common.elem_product(&y, &zzz_inv) }; // If we validated our inputs correctly and then computed (x, y, z), then // (x, y, z) will be on the curve. See // `verify_affine_point_is_on_the_curve_scaled` for the motivation. verify_affine_point_is_on_the_curve(ops.common, (&x_aff, &y_aff))?; Ok((x_aff, y_aff)) } pub fn big_endian_affine_from_jacobian( ops: &PrivateKeyOps, x_out: Option<&mut [u8]>, y_out: Option<&mut [u8]>, p: &Point, ) -> Result<(), error::Unspecified> { let (x_aff, y_aff) = affine_from_jacobian(ops, p)?; let num_limbs = ops.common.num_limbs; if let Some(x_out) = x_out { let x = ops.common.elem_unencoded(&x_aff); limb::big_endian_from_limbs(&x.limbs[..num_limbs], x_out); } if let Some(y_out) = y_out { let y = ops.common.elem_unencoded(&y_aff); limb::big_endian_from_limbs(&y.limbs[..num_limbs], y_out); } Ok(()) } ring-0.16.9/src/ec/suite_b/public_key.rs000064400000000000000000000104221352416253600162460ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Functionality shared by operations on public keys (ECDSA verification and //! ECDH agreement). use super::{ops::*, verify_affine_point_is_on_the_curve}; use crate::{arithmetic::montgomery::*, error}; use untrusted; /// Parses a public key encoded in uncompressed form. The key is validated /// using the ECC Partial Public-Key Validation Routine from /// [NIST SP 800-56A, revision 2] Section 5.6.2.3.3, the NSA's /// "Suite B Implementer's Guide to NIST SP 800-56A," Appendix B.3, and the /// NSA's "Suite B Implementer's Guide to FIPS 186-3 (ECDSA)," Appendix A.3. /// /// [NIST SP 800-56A, revision 2]: /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf pub fn parse_uncompressed_point( ops: &PublicKeyOps, input: untrusted::Input, ) -> Result<(Elem, Elem), error::Unspecified> { // NIST SP 800-56A Step 1: "Verify that Q is not the point at infinity. // This can be done by inspection if the point is entered in the standard // affine representation." (We do it by inspection since we only accept // the affine representation.) let (x, y) = input.read_all(error::Unspecified, |input| { // The encoding must be 4, which is the encoding for "uncompressed". let encoding = input.read_byte()?; if encoding != 4 { return Err(error::Unspecified); } // NIST SP 800-56A Step 2: "Verify that xQ and yQ are integers in the // interval [0, p-1] in the case that q is an odd prime p[.]" let x = ops.elem_parse(input)?; let y = ops.elem_parse(input)?; Ok((x, y)) })?; // NIST SP 800-56A Step 3: "If q is an odd prime p, verify that // yQ**2 = xQ**3 + axQ + b in GF(p), where the arithmetic is performed // modulo p." verify_affine_point_is_on_the_curve(ops.common, (&x, &y))?; // NIST SP 800-56A Note: "Since its order is not verified, there is no // check that the public key is in the correct EC subgroup." // // NSA Suite B Implementer's Guide Note: "ECC Full Public-Key Validation // includes an additional check to ensure that the point has the correct // order. This check is not necessary for curves having prime order (and // cofactor h = 1), such as P-256 and P-384." Ok((x, y)) } #[cfg(test)] mod tests { use super::{super::ops, *}; use crate::test; use untrusted; #[test] fn parse_uncompressed_point_test() { test::run( test_file!("suite_b_public_key_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let public_key = test_case.consume_bytes("Q"); let public_key = untrusted::Input::from(&public_key); let is_valid = test_case.consume_string("Result") == "P"; let curve_ops = public_key_ops_from_curve_name(&curve_name); let result = parse_uncompressed_point(curve_ops, public_key); assert_eq!(is_valid, result.is_ok()); // TODO: Verify that we when we re-serialize the parsed (x, y), the // output is equal to the input. Ok(()) }, ); } fn public_key_ops_from_curve_name(curve_name: &str) -> &'static PublicKeyOps { if curve_name == "P-256" { &ops::p256::PUBLIC_KEY_OPS } else if curve_name == "P-384" { &ops::p384::PUBLIC_KEY_OPS } else { panic!("Unsupported curve: {}", curve_name); } } } ring-0.16.9/src/ec/suite_b/suite_b_public_key_tests.txt000064400000000000000000000243751352331573000214040ustar0000000000000000# Test vectors for public key validation. # Invalid Curve Attack from # https://web-in-security.blogspot.ca/2015/09/practical-invalid-curve-attacks.html # https://www.nds.rub.de/media/nds/veroeffentlichungen/2015/09/14/main-full.pdf Curve = P-256 Q = 04b70bf043c144935756f8f4578c369cf960ee510a5a0f90e93a373a21f0d1397f4a2e0ded57a5156bb82eb4314c37fd4155395a7e51988af289cce531b9c17192 Result = F # Test vectors for Public Key Point Validation. # # These test vectors were generated by applying the patch in # util/generate-tests.patch to BoringSSL, and then running # `bssl generate-tests ecc-public-key`. # # X == 0, decompressed with y_bit == 0. This verifies that the # implementation doesn't reject zero-valued field elements (they # aren't scalars). Curve = P-256 Q = 04000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4 Result = P # X == q. This is invalid because q isn't a valid field element. Some # broken implementations might accept this if they reduce X mod q # since q mod q == 0 and the Y coordinate matches the one from the # x == 0 test case above. Curve = P-256 Q = 04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff66485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4 Result = F (X is out of range) # X == 0, decompressed with y_bit == 1. Curve = P-256 Q = 04000000000000000000000000000000000000000000000000000000000000000099b7a386f1d07c29dbcc42a27b5f9449abe3d50de25178e8d7407a95e8b06c0b Result = P # X == q, decompressed with y_bit == 1. See the previous X == q test # case. Curve = P-256 Q = 04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff99b7a386f1d07c29dbcc42a27b5f9449abe3d50de25178e8d7407a95e8b06c0b Result = F (X is out of range) # The largest valid X coordinate, decompressed with y_bit == 0. This # helps ensure that the upper bound on coordinate values is not too # low. Curve = P-256 Q = 04ffffffff00000001000000000000000000000000fffffffffffffffffffffffce68e641309515ec1da369202838e0adda2b37040614a5f5460c616e871aa3ede Result = P # X == 0, decompressed with y_bit == 0. This verifies that the # implementation doesn't reject zero-valued field elements (they # aren't scalars). Curve = P-384 Q = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e Result = P # X == q. This is invalid because q isn't a valid field element. Some # broken implementations might accept this if they reduce X mod q # since q mod q == 0 and the Y coordinate matches the one from the # x == 0 test case above. Curve = P-384 Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff3cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e Result = F (X is out of range) # X == 0, decompressed with y_bit == 1. Curve = P-384 Q = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c306610fb0ae5a159cf45c06069f22a6c5eb3641c602d42dea2c4b4f75550793406d80d2b91ad54f9048bd487af1ade1 Result = P # X == q, decompressed with y_bit == 1. See the previous X == q test # case. Curve = P-384 Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffc306610fb0ae5a159cf45c06069f22a6c5eb3641c602d42dea2c4b4f75550793406d80d2b91ad54f9048bd487af1ade1 Result = F (X is out of range) # The largest valid X coordinate, decompressed with y_bit == 0. This # helps ensure that the upper bound on coordinate values is not too # low. Curve = P-384 Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe8cdeadbbd04911a3c1931e26df3fa6439dca9c7eb286fbd46fc319f0e2bb780232baf57825fc0c1912ada2fefe84024c Result = P # RFC 5903 (IKE and IKEv2 ECDH) Test Vectors # Q is (grx, gry) in uncompressed encoding. Curve = P-256 Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = P Curve = P-384 Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = P # Tweaks of the RFC 5903 vectors for testing malformed (syntactically) public # keys Curve = P-256 Q = "" Result = F (Peer public key is empty.) Curve = P-384 Q = "" Result = F (Peer public key is empty.) Curve = P-256 Q = 00 Result = F (Peer public key is the special encoding of the point at infinity.) Curve = P-384 Q = 00 Result = F (Peer public key is the special encoding of the point at infinity.) Curve = P-256 Q = 01 Result = F (Peer public key consists of (only) an invalid encoding indicator.) Curve = P-384 Q = 01 Result = F (Peer public key consists of (only) an invalid encoding indicator.) Curve = P-256 Q = 02 Result = F (Peer public key consists of (only) a compressed encoding indicator (0x02).) Curve = P-384 Q = 02 Result = F (Peer public key consists of (only) a compressed encoding indicator (0x02).) Curve = P-256 Q = 03 Result = F (Peer public key consists of (only) a compressed encoding indicator (0x03).) Curve = P-384 Q = 03 Result = F (Peer public key consists of (only) a compressed encoding indicator (0x03).) Curve = P-256 Q = 04 Result = F (Peer public key consists of (only) a uncompressed encoding indicator.) Curve = P-384 Q = 04 Result = F (Peer public key consists of (only) a compressed encoding indicator.) Curve = P-256 Q = 04 Result = F (Peer public key consists of (only) an invalid encoding indicator (0x05).) Curve = P-384 Q = 04 Result = F (Peer public key consists of (only) an invalid encoding indicator (0x05).) Curve = P-256 Q = 01D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x01).) Curve = P-384 Q = 01E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x01).) Curve = P-256 Q = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key encoding's first byte is 0x02, should be 0x04.) Curve = P-384 Q = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key encoding's first byte is 0x02, should be 0x04.) Curve = P-256 Q = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key encoding's first byte is 0x03, should be 0x04.) Curve = P-384 Q = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key encoding's first byte is 0x03, should be 0x04.) Curve = P-256 Q = 05D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x05).) Curve = P-384 Q = 05E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x05).) Curve = P-256 Q = FFD12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key starts with a completely invalid encoding indicator byte (0xff).) Curve = P-384 Q = FFE558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key starts with a completely invalid encoding indicator byte (0xff).) Curve = P-256 Q = D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Result = F (Peer public key is missing the encoding indicator byte.) Curve = P-384 Q = E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Result = F (Peer public key is missing the encoding indicator byte.) Curve = P-256 Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872 Result = F (Peer public key has the last byte truncated.) Curve = P-384 Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E638 Result = F (Peer public key has the last byte truncated.) Curve = P-256 Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Result = F (Peer public key is missing the Y coordinate completely.) Curve = P-384 Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Result = F (Peer public key is missing the Y coordinate completely.) Curve = P-256 Q = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Result = F (Peer public key is in compressed form (0x02).) Curve = P-384 Q = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Result = F (Peer public key is in compressed form (0x02).) Curve = P-256 Q = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Result = F (Peer public key is in compressed form (0x03).) Curve = P-384 Q = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Result = F (Peer public key is in compressed form (0x03).) ring-0.16.9/src/ec/suite_b.rs000064400000000000000000000213011352416253600141160ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Elliptic curve operations on P-256 & P-384. use self::ops::*; use crate::{arithmetic::montgomery::*, cpu, ec, error, io::der, limb::LimbMask, pkcs8}; use untrusted; // NIST SP 800-56A Step 3: "If q is an odd prime p, verify that // yQ**2 = xQ**3 + axQ + b in GF(p), where the arithmetic is performed modulo // p." // // That is, verify that (x, y) is on the curve, which is true iif: // // y**2 == x**3 + a*x + b (mod q) // // Or, equivalently, but more efficiently: // // y**2 == (x**2 + a)*x + b (mod q) // fn verify_affine_point_is_on_the_curve( ops: &CommonOps, (x, y): (&Elem, &Elem), ) -> Result<(), error::Unspecified> { verify_affine_point_is_on_the_curve_scaled(ops, (x, y), &ops.a, &ops.b) } // Use `verify_affine_point_is_on_the_curve` instead of this function whenever // the affine coordinates are available or will become available. This function // should only be used then the affine coordinates are never calculated. See // the notes for `verify_affine_point_is_on_the_curve_scaled`. // // The value `z**2` is returned on success because it is useful for ECDSA // verification. // // This function also verifies that the point is not at infinity. fn verify_jacobian_point_is_on_the_curve( ops: &CommonOps, p: &Point, ) -> Result, error::Unspecified> { let z = ops.point_z(p); // Verify that the point is not at infinity. ops.elem_verify_is_not_zero(&z)?; let x = ops.point_x(p); let y = ops.point_y(p); // We are given Jacobian coordinates (x, y, z). So, we have: // // (x/z**2, y/z**3) == (x', y'), // // where (x', y') are the affine coordinates. The curve equation is: // // y'**2 == x'**3 + a*x' + b == (x'**2 + a)*x' + b // // Substituting our Jacobian coordinates, we get: // // / y \**2 / / x \**2 \ / x \ // | ---- | == | | ---- | + a | * | ---- | + b // \ z**3 / \ \ z**2 / / \ z**2 / // // Simplify: // // y**2 / x**2 \ x // ---- == | ---- + a | * ---- + b // z**6 \ z**4 / z**2 // // Multiply both sides by z**6: // // z**6 / x**2 \ z**6 // ---- * y**2 == | ---- + a | * ---- * x + (z**6) * b // z**6 \ z**4 / z**2 // // Simplify: // // / x**2 \ // y**2 == | ---- + a | * z**4 * x + (z**6) * b // \ z**4 / // // Distribute z**4: // // / z**4 \ // y**2 == | ---- * x**2 + z**4 * a | * x + (z**6) * b // \ z**4 / // // Simplify: // // y**2 == (x**2 + z**4 * a) * x + (z**6) * b // let z2 = ops.elem_squared(&z); let z4 = ops.elem_squared(&z2); let z4_a = ops.elem_product(&z4, &ops.a); let z6 = ops.elem_product(&z4, &z2); let z6_b = ops.elem_product(&z6, &ops.b); verify_affine_point_is_on_the_curve_scaled(ops, (&x, &y), &z4_a, &z6_b)?; Ok(z2) } // Handles the common logic of point-is-on-the-curve checks for both affine and // Jacobian cases. // // When doing the check that the point is on the curve after a computation, // to avoid fault attacks or mitigate potential bugs, it is better for security // to use `verify_affine_point_is_on_the_curve` on the affine coordinates, // because it provides some protection against faults that occur in the // computation of the inverse of `z`. See the paper and presentation "Fault // Attacks on Projective-to-Affine Coordinates Conversion" by Diana Maimuţ, // Cédric Murdica, David Naccache, Mehdi Tibouchi. That presentation concluded // simply "Check the validity of the result after conversion to affine // coordinates." (It seems like a good idea to verify that // z_inv * z == 1 mod q too). // // In the case of affine coordinates (x, y), `a_scaled` and `b_scaled` are // `a` and `b`, respectively. In the case of Jacobian coordinates (x, y, z), // the computation and comparison is the same, except `a_scaled` and `b_scaled` // are (z**4 * a) and (z**6 * b), respectively. Thus, performance is another // reason to prefer doing the check on the affine coordinates, as Jacobian // computation requires 3 extra multiplications and 2 extra squarings. // // An example of a fault attack that isn't mitigated by a point-on-the-curve // check after multiplication is given in "Sign Change Fault Attacks On // Elliptic Curve Cryptosystems" by Johannes Blömer, Martin Otto, and // Jean-Pierre Seifert. fn verify_affine_point_is_on_the_curve_scaled( ops: &CommonOps, (x, y): (&Elem, &Elem), a_scaled: &Elem, b_scaled: &Elem, ) -> Result<(), error::Unspecified> { let lhs = ops.elem_squared(y); let mut rhs = ops.elem_squared(x); ops.elem_add(&mut rhs, a_scaled); ops.elem_mul(&mut rhs, x); ops.elem_add(&mut rhs, b_scaled); if ops.elems_are_equal(&lhs, &rhs) != LimbMask::True { return Err(error::Unspecified); } Ok(()) } pub(crate) fn key_pair_from_pkcs8( curve: &'static ec::Curve, template: &pkcs8::Template, input: untrusted::Input, cpu_features: cpu::Features, ) -> Result { let (ec_private_key, _) = pkcs8::unwrap_key(template, pkcs8::Version::V1Only, input)?; let (private_key, public_key) = ec_private_key.read_all(error::KeyRejected::invalid_encoding(), |input| { // https://tools.ietf.org/html/rfc5915#section-3 der::nested( input, der::Tag::Sequence, error::KeyRejected::invalid_encoding(), |input| key_pair_from_pkcs8_(template, input), ) })?; key_pair_from_bytes(curve, private_key, public_key, cpu_features) } fn key_pair_from_pkcs8_<'a>( template: &pkcs8::Template, input: &mut untrusted::Reader<'a>, ) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::KeyRejected> { let version = der::small_nonnegative_integer(input) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; if version != 1 { return Err(error::KeyRejected::version_not_supported()); } let private_key = der::expect_tag_and_get_value(input, der::Tag::OctetString) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; // [0] parameters (optional). if input.peek(u8::from(der::Tag::ContextSpecificConstructed0)) { let actual_alg_id = der::expect_tag_and_get_value(input, der::Tag::ContextSpecificConstructed0) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; if actual_alg_id != template.curve_oid() { return Err(error::KeyRejected::wrong_algorithm()); } } // [1] publicKey. The RFC says it is optional, but we require it // to be present. let public_key = der::nested( input, der::Tag::ContextSpecificConstructed1, error::Unspecified, der::bit_string_with_no_unused_bits, ) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; Ok((private_key, public_key)) } pub(crate) fn key_pair_from_bytes( curve: &'static ec::Curve, private_key_bytes: untrusted::Input, public_key_bytes: untrusted::Input, cpu_features: cpu::Features, ) -> Result { let seed = ec::Seed::from_bytes(curve, private_key_bytes, cpu_features) .map_err(|error::Unspecified| error::KeyRejected::invalid_component())?; let r = ec::KeyPair::derive(seed) .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; if public_key_bytes != *r.public_key().as_ref() { return Err(error::KeyRejected::inconsistent_components()); } Ok(r) } pub mod curve; pub mod ecdh; pub mod ecdsa; mod ops; mod private_key; mod public_key; ring-0.16.9/src/ec.rs000064400000000000000000000041401352416253600124660ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{error, rand}; pub use self::keys::{KeyPair, PublicKey, Seed}; pub struct Curve { pub public_key_len: usize, pub elem_scalar_seed_len: usize, pub id: CurveID, // Precondition: `bytes` is the correct length. check_private_key_bytes: fn(bytes: &[u8]) -> Result<(), error::Unspecified>, generate_private_key: fn(rng: &dyn rand::SecureRandom, &mut [u8]) -> Result<(), error::Unspecified>, public_from_private: fn(public_out: &mut [u8], private_key: &Seed) -> Result<(), error::Unspecified>, } derive_debug_via_id!(Curve); #[derive(Clone, Copy, Debug, PartialEq)] pub enum CurveID { Curve25519, P256, P384, } const ELEM_MAX_BITS: usize = 384; pub const ELEM_MAX_BYTES: usize = (ELEM_MAX_BITS + 7) / 8; pub const SCALAR_MAX_BYTES: usize = ELEM_MAX_BYTES; const SEED_MAX_BYTES: usize = ELEM_MAX_BYTES; /// The maximum length of a PKCS#8 documents generated by *ring* for ECC keys. /// /// This is NOT the maximum length of a PKCS#8 document that can be consumed by /// `pkcs8::unwrap_key()`. /// /// `40` is the length of the P-384 template. It is actually one byte shorter /// than the P-256 template, but the private key and the public key are much /// longer. pub const PKCS8_DOCUMENT_MAX_LEN: usize = 40 + SCALAR_MAX_BYTES + keys::PUBLIC_KEY_MAX_LEN; pub mod curve25519; mod keys; pub mod suite_b; ring-0.16.9/src/endian.rs000064400000000000000000000037331352416253600133440ustar0000000000000000use crate::sealed; use core::num::Wrapping; pub trait Encoding: Copy + From + Sized + sealed::Sealed where T: From, { const ZERO: Self; fn into_raw_value(self) -> T; } pub fn as_bytes, T>(x: &[E]) -> &[u8] where T: From, { unsafe { core::slice::from_raw_parts(x.as_ptr() as *const u8, x.len() * core::mem::size_of::()) } } macro_rules! define_endian { ($endian:ident) => { #[repr(transparent)] #[derive(Copy, Clone)] pub struct $endian(T) where T: Copy + Clone + Sized; impl sealed::Sealed for $endian where T: Copy + Clone + Sized {} }; } macro_rules! impl_endian { ($endian:ident, $base:ident, $to_endian:ident, $from_endian:ident) => { impl Encoding<$base> for $endian<$base> { const ZERO: Self = Self(0); #[inline] fn into_raw_value(self) -> $base { self.0 } } impl From<$base> for $endian<$base> { #[inline] fn from(value: $base) -> Self { Self($base::$to_endian(value)) } } impl From> for $endian<$base> { #[inline] fn from(Wrapping(value): Wrapping<$base>) -> Self { Self($base::$to_endian(value)) } } impl From<$endian<$base>> for $base { #[inline] fn from($endian(value): $endian<$base>) -> Self { $base::$from_endian(value) } } }; } define_endian!(BigEndian); define_endian!(LittleEndian); impl_endian!(BigEndian, u32, to_be, from_be); impl_endian!(BigEndian, u64, to_be, from_be); impl_endian!(LittleEndian, u32, to_le, from_le); impl_endian!(LittleEndian, u64, to_le, from_le); #[cfg(test)] mod tests { use super::*; #[test] fn test_big_endian() { let x = BigEndian::from(1u32); assert_eq!(u32::from(x), 1); } } ring-0.16.9/src/error.rs000064400000000000000000000162711353036607100132350ustar0000000000000000// Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Error reporting. use untrusted; #[cfg(feature = "std")] extern crate std; /// An error with absolutely no details. /// /// *ring* uses this unit type as the error type in most of its results /// because (a) usually the specific reasons for a failure are obvious or are /// not useful to know, and/or (b) providing more details about a failure might /// provide a dangerous side channel, and/or (c) it greatly simplifies the /// error handling logic. /// /// `Result` is mostly equivalent to /// `Result`. However, `ring::error::Unspecified` implements /// [`std::error::Error`] and users of *ring* can implement /// `From` to map this to their own error types, as /// described in [“Error Handling” in the Rust Book]: /// /// ``` /// use ring::rand::{self, SecureRandom}; /// /// enum Error { /// CryptoError, /// /// # #[cfg(feature = "alloc")] /// IOError(std::io::Error), /// // [...] /// } /// /// impl From for Error { /// fn from(_: ring::error::Unspecified) -> Self { Error::CryptoError } /// } /// /// fn eight_random_bytes() -> Result<[u8; 8], Error> { /// let rng = rand::SystemRandom::new(); /// let mut bytes = [0; 8]; /// /// // The `From` implementation above makes this /// // equivalent to /// // `rng.fill(&mut bytes).map_err(|_| Error::CryptoError)?`. /// rng.fill(&mut bytes)?; /// /// Ok(bytes) /// } /// /// assert!(eight_random_bytes().is_ok()); /// ``` /// /// Experience with using and implementing other crypto libraries like has /// shown that sophisticated error reporting facilities often cause significant /// bugs themselves, both within the crypto library and within users of the /// crypto library. This approach attempts to minimize complexity in the hopes /// of avoiding such problems. In some cases, this approach may be too extreme, /// and it may be important for an operation to provide some details about the /// cause of a failure. Users of *ring* are encouraged to report such cases so /// that they can be addressed individually. /// /// [`std::error::Error`]: https://doc.rust-lang.org/std/error/trait.Error.html /// [“Error Handling” in the Rust Book]: /// https://doc.rust-lang.org/book/first-edition/error-handling.html#the-from-trait #[derive(Clone, Copy, Debug, PartialEq)] pub struct Unspecified; impl Unspecified { fn description_() -> &'static str { "ring::error::Unspecified" } } // This is required for the implementation of `std::error::Error`. impl core::fmt::Display for Unspecified { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { f.write_str(Self::description_()) } } #[cfg(feature = "std")] impl std::error::Error for Unspecified { #[inline] fn cause(&self) -> Option<&dyn std::error::Error> { None } fn description(&self) -> &str { Self::description_() } } impl From for Unspecified { fn from(_: untrusted::EndOfInput) -> Self { Unspecified } } impl From for Unspecified { fn from(_: core::array::TryFromSliceError) -> Self { Unspecified } } /// An error parsing or validating a key. /// /// The `Display` implementation and `::description()` /// will return a string that will help you better understand why a key was /// rejected change which errors are reported in which situations while /// minimizing the likelihood that any applications will be broken. /// /// Here is an incomplete list of reasons a key may be unsupported: /// /// * Invalid or Inconsistent Components: A component of the key has an invalid /// value, or the mathematical relationship between two (or more) components /// required for a valid key does not hold. /// /// * The encoding of the key is invalid. Perhaps the key isn't in the correct /// format; e.g. it may be Base64 ("PEM") encoded, in which case the Base64 /// encoding needs to be undone first. /// /// * The encoding includes a versioning mechanism and that mechanism indicates /// that the key is encoded in a version of the encoding that isn't supported. /// This might happen for multi-prime RSA keys (keys with more than two /// private prime factors), which aren't supported, for example. /// /// * Too small or too Large: One of the primary components of the key is too /// small or two large. Too-small keys are rejected for security reasons. Some /// unnecessarily large keys are rejected for performance reasons. /// /// * Wrong algorithm: The key is not valid for the algorithm in which it was /// being used. /// /// * Unexpected errors: Report this as a bug. #[derive(Copy, Clone, Debug)] pub struct KeyRejected(&'static str); impl KeyRejected { /// The value returned from ::description() pub fn description_(&self) -> &'static str { self.0 } pub(crate) fn inconsistent_components() -> Self { KeyRejected("InconsistentComponents") } pub(crate) fn invalid_component() -> Self { KeyRejected("InvalidComponent") } #[inline] pub(crate) fn invalid_encoding() -> Self { KeyRejected("InvalidEncoding") } pub(crate) fn public_key_is_missing() -> Self { KeyRejected("PublicKeyIsMissing") } #[cfg(feature = "alloc")] pub(crate) fn too_small() -> Self { KeyRejected("TooSmall") } #[cfg(feature = "alloc")] pub(crate) fn too_large() -> Self { KeyRejected("TooLarge") } pub(crate) fn version_not_supported() -> Self { KeyRejected("VersionNotSupported") } pub(crate) fn wrong_algorithm() -> Self { KeyRejected("WrongAlgorithm") } #[cfg(feature = "alloc")] pub(crate) fn private_modulus_len_not_multiple_of_512_bits() -> Self { KeyRejected("PrivateModulusLenNotMultipleOf512Bits") } pub(crate) fn unexpected_error() -> Self { KeyRejected("UnexpectedError") } } #[cfg(feature = "std")] impl std::error::Error for KeyRejected { fn cause(&self) -> Option<&dyn std::error::Error> { None } fn description(&self) -> &str { self.description_() } } impl core::fmt::Display for KeyRejected { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { f.write_str(self.description_()) } } impl From for Unspecified { fn from(_: KeyRejected) -> Self { Unspecified } } ring-0.16.9/src/hkdf.rs000064400000000000000000000152661353224147100130210ustar0000000000000000// Copyright 2015 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! HMAC-based Extract-and-Expand Key Derivation Function. //! //! HKDF is specified in [RFC 5869]. //! //! [RFC 5869]: https://tools.ietf.org/html/rfc5869 use crate::{error, hmac}; /// An HKDF algorithm. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Algorithm(hmac::Algorithm); impl Algorithm { /// The underlying HMAC algorithm. #[inline] pub fn hmac_algorithm(&self) -> hmac::Algorithm { self.0 } } /// HKDF using HMAC-SHA-256. pub static HKDF_SHA256: Algorithm = Algorithm(hmac::HMAC_SHA256); /// HKDF using HMAC-SHA-384. pub static HKDF_SHA384: Algorithm = Algorithm(hmac::HMAC_SHA384); /// HKDF using HMAC-SHA-512. pub static HKDF_SHA512: Algorithm = Algorithm(hmac::HMAC_SHA512); impl KeyType for Algorithm { fn len(&self) -> usize { self.0.digest_algorithm().output_len } } /// A salt for HKDF operations. #[derive(Debug)] pub struct Salt(hmac::Key); impl Salt { /// Constructs a new `Salt` with the given value based on the given digest /// algorithm. /// /// Constructing a `Salt` is relatively expensive so it is good to reuse a /// `Salt` object instead of re-constructing `Salt`s with the same value. pub fn new(algorithm: Algorithm, value: &[u8]) -> Self { Salt(hmac::Key::new(algorithm.0, value)) } /// The [HKDF-Extract] operation. /// /// [HKDF-Extract]: https://tools.ietf.org/html/rfc5869#section-2.2 pub fn extract(&self, secret: &[u8]) -> Prk { // The spec says that if no salt is provided then a key of // `digest_alg.output_len` bytes of zeros is used. But, HMAC keys are // already zero-padded to the block length, which is larger than the output // length of the extract step (the length of the digest). Consequently the // `Key` constructor will automatically do the right thing for a // zero-length string. let salt = &self.0; let prk = hmac::sign(salt, secret); Prk(hmac::Key::new(salt.algorithm(), prk.as_ref())) } /// The algorithm used to derive this salt. #[inline] pub fn algorithm(&self) -> Algorithm { Algorithm(self.0.algorithm()) } } impl From> for Salt { fn from(okm: Okm<'_, Algorithm>) -> Self { Self(hmac::Key::from(Okm { prk: okm.prk, info: okm.info, len: okm.len().0, len_cached: okm.len_cached, })) } } /// The length of the OKM (Output Keying Material) for a `Prk::expand()` call. pub trait KeyType { /// The length that `Prk::expand()` should expand its input to. fn len(&self) -> usize; } /// A HKDF PRK (pseudorandom key). #[derive(Clone, Debug)] pub struct Prk(hmac::Key); impl Prk { /// Construct a new `Prk` directly with the given value. /// /// Usually one can avoid using this. It is useful when the application /// intentionally wants to leak the PRK secret, e.g. to implement /// `SSLKEYLOGFILE` functionality. pub fn new_less_safe(algorithm: Algorithm, value: &[u8]) -> Self { Self(hmac::Key::new(algorithm.hmac_algorithm(), value)) } /// The [HKDF-Expand] operation. /// /// [HKDF-Expand]: https://tools.ietf.org/html/rfc5869#section-2.3 /// /// Fails if (and only if) `len` is too large. #[inline] pub fn expand<'a, L: KeyType>( &'a self, info: &'a [&'a [u8]], len: L, ) -> Result, error::Unspecified> { let len_cached = len.len(); if len_cached > 255 * self.0.algorithm().digest_algorithm().output_len { return Err(error::Unspecified); } Ok(Okm { prk: self, info, len, len_cached, }) } } impl From> for Prk { fn from(okm: Okm) -> Self { Self(hmac::Key::from(Okm { prk: okm.prk, info: okm.info, len: okm.len().0, len_cached: okm.len_cached, })) } } /// An HKDF OKM (Output Keying Material) /// /// Intentionally not `Clone` or `Copy` as an OKM is generally only safe to /// use once. #[derive(Debug)] pub struct Okm<'a, L: KeyType> { prk: &'a Prk, info: &'a [&'a [u8]], len: L, len_cached: usize, } impl Okm<'_, L> { /// The `OkmLength` given to `Prk::expand()`. #[inline] pub fn len(&self) -> &L { &self.len } /// Fills `out` with the output of the HKDF-Expand operation for the given /// inputs. /// /// Fails if (and only if) the requested output length is larger than 255 /// times the size of the digest algorithm's output. (This is the limit /// imposed by the HKDF specification due to the way HKDF's counter is /// constructed.) #[inline] pub fn fill(self, out: &mut [u8]) -> Result<(), error::Unspecified> { fill_okm(self.prk, self.info, out, self.len_cached) } } fn fill_okm( prk: &Prk, info: &[&[u8]], out: &mut [u8], len: usize, ) -> Result<(), error::Unspecified> { if out.len() != len { return Err(error::Unspecified); } let digest_alg = prk.0.algorithm().digest_algorithm(); assert!(digest_alg.block_len >= digest_alg.output_len); let mut ctx = hmac::Context::with_key(&prk.0); let mut n = 1u8; let mut out = out; loop { for info in info { ctx.update(info); } ctx.update(&[n]); let t = ctx.sign(); let t = t.as_ref(); // Append `t` to the output. out = if out.len() < digest_alg.output_len { let len = out.len(); out.copy_from_slice(&t[..len]); &mut [] } else { let (this_chunk, rest) = out.split_at_mut(digest_alg.output_len); this_chunk.copy_from_slice(t); rest }; if out.is_empty() { return Ok(()); } ctx = hmac::Context::with_key(&prk.0); ctx.update(t); n = n.checked_add(1).unwrap(); } } ring-0.16.9/src/hmac.rs000064400000000000000000000322431352416253600130140ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! HMAC is specified in [RFC 2104]. //! //! After a `Key` is constructed, it can be used for multiple signing or //! verification operations. Separating the construction of the key from the //! rest of the HMAC operation allows the per-key precomputation to be done //! only once, instead of it being done in every HMAC operation. //! //! Frequently all the data to be signed in a message is available in a single //! contiguous piece. In that case, the module-level `sign` function can be //! used. Otherwise, if the input is in multiple parts, `Context` should be //! used. //! //! # Examples: //! //! ## Signing a value and verifying it wasn't tampered with //! //! ``` //! use ring::{hmac, rand}; //! //! let rng = rand::SystemRandom::new(); //! let key = hmac::Key::generate(hmac::HMAC_SHA256, &rng)?; //! //! let msg = "hello, world"; //! //! let tag = hmac::sign(&key, msg.as_bytes()); //! //! // [We give access to the message to an untrusted party, and they give it //! // back to us. We need to verify they didn't tamper with it.] //! //! hmac::verify(&key, msg.as_bytes(), tag.as_ref())?; //! //! # Ok::<(), ring::error::Unspecified>(()) //! ``` //! //! ## Using the one-shot API: //! //! ``` //! use ring::{digest, hmac, rand}; //! use ring::rand::SecureRandom; //! //! let msg = "hello, world"; //! //! // The sender generates a secure key value and signs the message with it. //! // Note that in a real protocol, a key agreement protocol would be used to //! // derive `key_value`. //! let rng = rand::SystemRandom::new(); //! let key_value: [u8; digest::SHA256_OUTPUT_LEN] = rand::generate(&rng)?.expose(); //! //! let s_key = hmac::Key::new(hmac::HMAC_SHA256, key_value.as_ref()); //! let tag = hmac::sign(&s_key, msg.as_bytes()); //! //! // The receiver (somehow!) knows the key value, and uses it to verify the //! // integrity of the message. //! let v_key = hmac::Key::new(hmac::HMAC_SHA256, key_value.as_ref()); //! hmac::verify(&v_key, msg.as_bytes(), tag.as_ref())?; //! //! # Ok::<(), ring::error::Unspecified>(()) //! ``` //! //! ## Using the multi-part API: //! ``` //! use ring::{digest, hmac, rand}; //! use ring::rand::SecureRandom; //! //! let parts = ["hello", ", ", "world"]; //! //! // The sender generates a secure key value and signs the message with it. //! // Note that in a real protocol, a key agreement protocol would be used to //! // derive `key_value`. //! let rng = rand::SystemRandom::new(); //! let mut key_value: [u8; digest::SHA384_OUTPUT_LEN] = rand::generate(&rng)?.expose(); //! //! let s_key = hmac::Key::new(hmac::HMAC_SHA384, key_value.as_ref()); //! let mut s_ctx = hmac::Context::with_key(&s_key); //! for part in &parts { //! s_ctx.update(part.as_bytes()); //! } //! let tag = s_ctx.sign(); //! //! // The receiver (somehow!) knows the key value, and uses it to verify the //! // integrity of the message. //! let v_key = hmac::Key::new(hmac::HMAC_SHA384, key_value.as_ref()); //! let mut msg = Vec::::new(); //! for part in &parts { //! msg.extend(part.as_bytes()); //! } //! hmac::verify(&v_key, &msg.as_ref(), tag.as_ref())?; //! //! # Ok::<(), ring::error::Unspecified>(()) //! ``` //! //! [RFC 2104]: https://tools.ietf.org/html/rfc2104 //! [code for `ring::pbkdf2`]: //! https://github.com/briansmith/ring/blob/master/src/pbkdf2.rs //! [code for `ring::hkdf`]: //! https://github.com/briansmith/ring/blob/master/src/hkdf.rs use crate::{constant_time, digest, error, hkdf, rand}; /// An HMAC algorithm. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Algorithm(&'static digest::Algorithm); impl Algorithm { /// The digest algorithm this HMAC algorithm is based on. #[inline] pub fn digest_algorithm(&self) -> &'static digest::Algorithm { self.0 } } /// HMAC using SHA-1. Obsolete. pub static HMAC_SHA1_FOR_LEGACY_USE_ONLY: Algorithm = Algorithm(&digest::SHA1_FOR_LEGACY_USE_ONLY); /// HMAC using SHA-256. pub static HMAC_SHA256: Algorithm = Algorithm(&digest::SHA256); /// HMAC using SHA-384. pub static HMAC_SHA384: Algorithm = Algorithm(&digest::SHA384); /// HMAC using SHA-512. pub static HMAC_SHA512: Algorithm = Algorithm(&digest::SHA512); /// A deprecated alias for `Tag`. #[deprecated(note = "`Signature` was renamed to `Tag`. This alias will be removed soon.")] pub type Signature = Tag; /// An HMAC tag. /// /// For a given tag `t`, use `t.as_ref()` to get the tag value as a byte slice. #[derive(Clone, Copy, Debug)] pub struct Tag(digest::Digest); impl AsRef<[u8]> for Tag { #[inline] fn as_ref(&self) -> &[u8] { self.0.as_ref() } } /// A key to use for HMAC signing. #[derive(Clone)] pub struct Key { inner: digest::BlockContext, outer: digest::BlockContext, } /// `hmac::SigningKey` was renamed to `hmac::Key`. #[deprecated(note = "Renamed to `hmac::Key`.")] pub type SigningKey = Key; /// `hmac::VerificationKey` was merged into `hmac::Key`. #[deprecated( note = "The distinction between verification & signing keys was removed. Use `hmac::Key`." )] pub type VerificationKey = Key; impl core::fmt::Debug for Key { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("Key") .field("algorithm", self.algorithm().digest_algorithm()) .finish() } } impl Key { /// Generate an HMAC signing key using the given digest algorithm with a /// random value generated from `rng`. /// /// The key will be `digest_alg.output_len` bytes long, based on the /// recommendation in https://tools.ietf.org/html/rfc2104#section-3. pub fn generate( algorithm: Algorithm, rng: &dyn rand::SecureRandom, ) -> Result { Self::construct(algorithm, |buf| rng.fill(buf)) } fn construct(algorithm: Algorithm, fill: F) -> Result where F: FnOnce(&mut [u8]) -> Result<(), error::Unspecified>, { let mut key_bytes = [0; digest::MAX_OUTPUT_LEN]; let key_bytes = &mut key_bytes[..algorithm.0.output_len]; fill(key_bytes)?; Ok(Self::new(algorithm, key_bytes)) } /// Construct an HMAC signing key using the given digest algorithm and key /// value. /// /// `key_value` should be a value generated using a secure random number /// generator (e.g. the `key_value` output by /// `SealingKey::generate_serializable()`) or derived from a random key by /// a key derivation function (e.g. `ring::hkdf`). In particular, /// `key_value` shouldn't be a password. /// /// As specified in RFC 2104, if `key_value` is shorter than the digest /// algorithm's block length (as returned by `digest::Algorithm::block_len`, /// not the digest length returned by `digest::Algorithm::output_len`) then /// it will be padded with zeros. Similarly, if it is longer than the block /// length then it will be compressed using the digest algorithm. /// /// You should not use keys larger than the `digest_alg.block_len` because /// the truncation described above reduces their strength to only /// `digest_alg.output_len * 8` bits. Support for such keys is likely to be /// removed in a future version of *ring*. pub fn new(algorithm: Algorithm, key_value: &[u8]) -> Self { let digest_alg = algorithm.0; let mut key = Self { inner: digest::BlockContext::new(digest_alg), outer: digest::BlockContext::new(digest_alg), }; let key_hash; let key_value = if key_value.len() <= digest_alg.block_len { key_value } else { key_hash = digest::digest(digest_alg, key_value); key_hash.as_ref() }; const IPAD: u8 = 0x36; let mut padded_key = [IPAD; digest::MAX_BLOCK_LEN]; let padded_key = &mut padded_key[..digest_alg.block_len]; // If the key is shorter than one block then we're supposed to act like // it is padded with zero bytes up to the block length. `x ^ 0 == x` so // we can just leave the trailing bytes of `padded_key` untouched. for (padded_key, key_value) in padded_key.iter_mut().zip(key_value.iter()) { *padded_key ^= *key_value; } key.inner.update(&padded_key); const OPAD: u8 = 0x5C; // Remove the `IPAD` masking, leaving the unmasked padded key, then // mask with `OPAD`, all in one step. for b in padded_key.iter_mut() { *b ^= IPAD ^ OPAD; } key.outer.update(&padded_key); key } /// The digest algorithm for the key. #[inline] pub fn algorithm(&self) -> Algorithm { Algorithm(self.inner.algorithm) } } impl hkdf::KeyType for Algorithm { fn len(&self) -> usize { self.digest_algorithm().output_len } } impl From> for Key { fn from(okm: hkdf::Okm) -> Self { Key::construct(*okm.len(), |buf| okm.fill(buf)).unwrap() } } /// A context for multi-step (Init-Update-Finish) HMAC signing. /// /// Use `sign` for single-step HMAC signing. #[derive(Clone)] pub struct Context { inner: digest::Context, outer: digest::BlockContext, } /// `hmac::SigningContext` was renamed to `hmac::Context`. #[deprecated(note = "Renamed to `hmac::Context`.")] pub type SigningContext = Context; impl core::fmt::Debug for Context { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("Context") .field("algorithm", self.inner.algorithm()) .finish() } } impl Context { /// Constructs a new HMAC signing context using the given digest algorithm /// and key. pub fn with_key(signing_key: &Key) -> Self { Self { inner: digest::Context::clone_from(&signing_key.inner), outer: signing_key.outer.clone(), } } /// Updates the HMAC with all the data in `data`. `update` may be called /// zero or more times until `finish` is called. pub fn update(&mut self, data: &[u8]) { self.inner.update(data); } /// Finalizes the HMAC calculation and returns the HMAC value. `sign` /// consumes the context so it cannot be (mis-)used after `sign` has been /// called. /// /// It is generally not safe to implement HMAC verification by comparing /// the return value of `sign` to a tag. Use `verify` for verification /// instead. pub fn sign(self) -> Tag { let algorithm = self.inner.algorithm(); let mut pending = [0u8; digest::MAX_BLOCK_LEN]; let pending = &mut pending[..algorithm.block_len]; let num_pending = algorithm.output_len; pending[..num_pending].copy_from_slice(self.inner.finish().as_ref()); Tag(self.outer.finish(pending, num_pending)) } } /// Calculates the HMAC of `data` using the key `key` in one step. /// /// Use `Context` to calculate HMACs where the input is in multiple parts. /// /// It is generally not safe to implement HMAC verification by comparing the /// return value of `sign` to a tag. Use `verify` for verification instead. pub fn sign(key: &Key, data: &[u8]) -> Tag { let mut ctx = Context::with_key(key); ctx.update(data); ctx.sign() } /// Calculates the HMAC of `data` using the signing key `key`, and verifies /// whether the resultant value equals `tag`, in one step. /// /// This is logically equivalent to, but more efficient than, constructing a /// `Key` with the same value as `key` and then using `verify`. /// /// The verification will be done in constant time to prevent timing attacks. pub fn verify(key: &Key, data: &[u8], tag: &[u8]) -> Result<(), error::Unspecified> { constant_time::verify_slices_are_equal(sign(key, data).as_ref(), tag) } #[cfg(test)] mod tests { use crate::{hmac, rand}; // Make sure that `Key::generate` and `verify_with_own_key` aren't // completely wacky. #[test] pub fn hmac_signing_key_coverage() { let mut rng = rand::SystemRandom::new(); const HELLO_WORLD_GOOD: &[u8] = b"hello, world"; const HELLO_WORLD_BAD: &[u8] = b"hello, worle"; for algorithm in &[ hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY, hmac::HMAC_SHA256, hmac::HMAC_SHA384, hmac::HMAC_SHA512, ] { let key = hmac::Key::generate(*algorithm, &mut rng).unwrap(); let tag = hmac::sign(&key, HELLO_WORLD_GOOD); assert!(hmac::verify(&key, HELLO_WORLD_GOOD, tag.as_ref()).is_ok()); assert!(hmac::verify(&key, HELLO_WORLD_BAD, tag.as_ref()).is_err()) } } } ring-0.16.9/src/hmac_generate_serializable_tests.txt000064400000000000000000000006751352331573000210300ustar0000000000000000HMAC = SHA1 Key = 000102030405060708090a0b0c0d0e0f10111213 HMAC = SHA256 Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f HMAC = SHA384 Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f HMAC = SHA512 Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f ring-0.16.9/src/io/der.rs000064400000000000000000000240171352416253600132650ustar0000000000000000// Copyright 2015 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Building blocks for parsing DER-encoded ASN.1 structures. //! //! This module contains the foundational parts of an ASN.1 DER parser. use super::Positive; use crate::error; use untrusted; pub const CONSTRUCTED: u8 = 1 << 5; pub const CONTEXT_SPECIFIC: u8 = 2 << 6; #[derive(Clone, Copy, PartialEq)] #[repr(u8)] pub enum Tag { Boolean = 0x01, Integer = 0x02, BitString = 0x03, OctetString = 0x04, Null = 0x05, OID = 0x06, Sequence = CONSTRUCTED | 0x10, // 0x30 UTCTime = 0x17, GeneralizedTime = 0x18, ContextSpecificConstructed0 = CONTEXT_SPECIFIC | CONSTRUCTED | 0, ContextSpecificConstructed1 = CONTEXT_SPECIFIC | CONSTRUCTED | 1, ContextSpecificConstructed3 = CONTEXT_SPECIFIC | CONSTRUCTED | 3, } impl From for usize { fn from(tag: Tag) -> Self { tag as Self } } impl From for u8 { fn from(tag: Tag) -> Self { tag as Self } // XXX: narrowing conversion. } pub fn expect_tag_and_get_value<'a>( input: &mut untrusted::Reader<'a>, tag: Tag, ) -> Result, error::Unspecified> { let (actual_tag, inner) = read_tag_and_get_value(input)?; if usize::from(tag) != usize::from(actual_tag) { return Err(error::Unspecified); } Ok(inner) } pub fn read_tag_and_get_value<'a>( input: &mut untrusted::Reader<'a>, ) -> Result<(u8, untrusted::Input<'a>), error::Unspecified> { let tag = input.read_byte()?; if (tag & 0x1F) == 0x1F { return Err(error::Unspecified); // High tag number form is not allowed. } // If the high order bit of the first byte is set to zero then the length // is encoded in the seven remaining bits of that byte. Otherwise, those // seven bits represent the number of bytes used to encode the length. let length = match input.read_byte()? { n if (n & 0x80) == 0 => usize::from(n), 0x81 => { let second_byte = input.read_byte()?; if second_byte < 128 { return Err(error::Unspecified); // Not the canonical encoding. } usize::from(second_byte) } 0x82 => { let second_byte = usize::from(input.read_byte()?); let third_byte = usize::from(input.read_byte()?); let combined = (second_byte << 8) | third_byte; if combined < 256 { return Err(error::Unspecified); // Not the canonical encoding. } combined } _ => { return Err(error::Unspecified); // We don't support longer lengths. } }; let inner = input.read_bytes(length)?; Ok((tag, inner)) } pub fn bit_string_with_no_unused_bits<'a>( input: &mut untrusted::Reader<'a>, ) -> Result, error::Unspecified> { nested(input, Tag::BitString, error::Unspecified, |value| { let unused_bits_at_end = value.read_byte().map_err(|_| error::Unspecified)?; if unused_bits_at_end != 0 { return Err(error::Unspecified); } Ok(value.read_bytes_to_end()) }) } // TODO: investigate taking decoder as a reference to reduce generated code // size. pub fn nested<'a, F, R, E: Copy>( input: &mut untrusted::Reader<'a>, tag: Tag, error: E, decoder: F, ) -> Result where F: FnOnce(&mut untrusted::Reader<'a>) -> Result, { let inner = expect_tag_and_get_value(input, tag).map_err(|_| error)?; inner.read_all(error, decoder) } fn nonnegative_integer<'a>( input: &mut untrusted::Reader<'a>, min_value: u8, ) -> Result, error::Unspecified> { // Verify that |input|, which has had any leading zero stripped off, is the // encoding of a value of at least |min_value|. fn check_minimum(input: untrusted::Input, min_value: u8) -> Result<(), error::Unspecified> { input.read_all(error::Unspecified, |input| { let first_byte = input.read_byte()?; if input.at_end() && first_byte < min_value { return Err(error::Unspecified); } let _ = input.read_bytes_to_end(); Ok(()) }) } let value = expect_tag_and_get_value(input, Tag::Integer)?; value.read_all(error::Unspecified, |input| { // Empty encodings are not allowed. let first_byte = input.read_byte()?; if first_byte == 0 { if input.at_end() { // |value| is the legal encoding of zero. if min_value > 0 { return Err(error::Unspecified); } return Ok(value); } let r = input.read_bytes_to_end(); r.read_all(error::Unspecified, |input| { let second_byte = input.read_byte()?; if (second_byte & 0x80) == 0 { // A leading zero is only allowed when the value's high bit // is set. return Err(error::Unspecified); } let _ = input.read_bytes_to_end(); Ok(()) })?; check_minimum(r, min_value)?; return Ok(r); } // Negative values are not allowed. if (first_byte & 0x80) != 0 { return Err(error::Unspecified); } let _ = input.read_bytes_to_end(); check_minimum(value, min_value)?; Ok(value) }) } /// Parse as integer with a value in the in the range [0, 255], returning its /// numeric value. This is typically used for parsing version numbers. #[inline] pub fn small_nonnegative_integer(input: &mut untrusted::Reader) -> Result { let value = nonnegative_integer(input, 0)?; value.read_all(error::Unspecified, |input| { let r = input.read_byte()?; Ok(r) }) } /// Parses a positive DER integer, returning the big-endian-encoded value, /// sans any leading zero byte. pub fn positive_integer<'a>( input: &mut untrusted::Reader<'a>, ) -> Result, error::Unspecified> { Ok(Positive::new_non_empty_without_leading_zeros( nonnegative_integer(input, 1)?, )) } #[cfg(test)] mod tests { use super::*; use crate::error; use untrusted; fn with_good_i(value: &[u8], f: F) where F: FnOnce(&mut untrusted::Reader) -> Result, { let r = untrusted::Input::from(value).read_all(error::Unspecified, f); assert!(r.is_ok()); } fn with_bad_i(value: &[u8], f: F) where F: FnOnce(&mut untrusted::Reader) -> Result, { let r = untrusted::Input::from(value).read_all(error::Unspecified, f); assert!(r.is_err()); } static ZERO_INTEGER: &[u8] = &[0x02, 0x01, 0x00]; static GOOD_POSITIVE_INTEGERS: &[(&[u8], u8)] = &[ (&[0x02, 0x01, 0x01], 0x01), (&[0x02, 0x01, 0x02], 0x02), (&[0x02, 0x01, 0x7e], 0x7e), (&[0x02, 0x01, 0x7f], 0x7f), // Values that need to have an 0x00 prefix to disambiguate them from // them from negative values. (&[0x02, 0x02, 0x00, 0x80], 0x80), (&[0x02, 0x02, 0x00, 0x81], 0x81), (&[0x02, 0x02, 0x00, 0xfe], 0xfe), (&[0x02, 0x02, 0x00, 0xff], 0xff), ]; static BAD_NONNEGATIVE_INTEGERS: &[&[u8]] = &[ &[], // At end of input &[0x02], // Tag only &[0x02, 0x00], // Empty value // Length mismatch &[0x02, 0x00, 0x01], &[0x02, 0x01], &[0x02, 0x01, 0x00, 0x01], &[0x02, 0x01, 0x01, 0x00], // Would be valid if last byte is ignored. &[0x02, 0x02, 0x01], // Negative values &[0x02, 0x01, 0x80], &[0x02, 0x01, 0xfe], &[0x02, 0x01, 0xff], // Values that have an unnecessary leading 0x00 &[0x02, 0x02, 0x00, 0x00], &[0x02, 0x02, 0x00, 0x01], &[0x02, 0x02, 0x00, 0x02], &[0x02, 0x02, 0x00, 0x7e], &[0x02, 0x02, 0x00, 0x7f], ]; #[test] fn test_small_nonnegative_integer() { with_good_i(ZERO_INTEGER, |input| { assert_eq!(small_nonnegative_integer(input)?, 0x00); Ok(()) }); for &(test_in, test_out) in GOOD_POSITIVE_INTEGERS.iter() { with_good_i(test_in, |input| { assert_eq!(small_nonnegative_integer(input)?, test_out); Ok(()) }); } for &test_in in BAD_NONNEGATIVE_INTEGERS.iter() { with_bad_i(test_in, |input| { let _ = small_nonnegative_integer(input)?; Ok(()) }); } } #[test] fn test_positive_integer() { with_bad_i(ZERO_INTEGER, |input| { let _ = positive_integer(input)?; Ok(()) }); for &(test_in, test_out) in GOOD_POSITIVE_INTEGERS.iter() { with_good_i(test_in, |input| { let test_out = [test_out]; assert_eq!( positive_integer(input)?.big_endian_without_leading_zero_as_input(), untrusted::Input::from(&test_out[..]) ); Ok(()) }); } for &test_in in BAD_NONNEGATIVE_INTEGERS.iter() { with_bad_i(test_in, |input| { let _ = positive_integer(input)?; Ok(()) }); } } } ring-0.16.9/src/io/der_writer.rs000064400000000000000000000043411352416253600146570ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{der::*, writer::*, *}; use alloc::boxed::Box; pub(crate) fn write_positive_integer(output: &mut dyn Accumulator, value: &Positive) { let first_byte = value.first_byte(); let value = value.big_endian_without_leading_zero_as_input(); write_tlv(output, Tag::Integer, |output| { if (first_byte & 0x80) != 0 { output.write_byte(0); // Disambiguate negative number. } write_copy(output, value) }) } pub(crate) fn write_all(tag: Tag, write_value: &dyn Fn(&mut dyn Accumulator)) -> Box<[u8]> { let length = { let mut length = LengthMeasurement::zero(); write_tlv(&mut length, tag, write_value); length }; let mut output = Writer::with_capacity(length); write_tlv(&mut output, tag, write_value); output.into() } fn write_tlv(output: &mut dyn Accumulator, tag: Tag, write_value: F) where F: Fn(&mut dyn Accumulator), { let length: usize = { let mut length = LengthMeasurement::zero(); write_value(&mut length); length.into() }; output.write_byte(tag as u8); if length < 0x80 { output.write_byte(length as u8); } else if length < 0x1_00 { output.write_byte(0x81); output.write_byte(length as u8); } else if length < 0x1_00_00 { output.write_byte(0x82); output.write_byte((length / 0x1_00) as u8); output.write_byte(length as u8); } else { unreachable!(); }; write_value(output); } ring-0.16.9/src/io/positive.rs000064400000000000000000000036161352416253600143570ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Serialization and deserialization. /// A serialized positive integer. #[derive(Copy, Clone)] pub struct Positive<'a>(untrusted::Input<'a>); impl<'a> Positive<'a> { #[inline] pub(crate) fn new_non_empty_without_leading_zeros(input: untrusted::Input<'a>) -> Self { debug_assert!(!input.is_empty()); debug_assert!(input.len() == 1 || input.as_slice_less_safe()[0] != 0); Self(input) } /// Returns the value, ordered from significant byte to least significant /// byte, without any leading zeros. The result is guaranteed to be /// non-empty. #[inline] pub fn big_endian_without_leading_zero(&self) -> &'a [u8] { self.big_endian_without_leading_zero_as_input() .as_slice_less_safe() } #[inline] pub(crate) fn big_endian_without_leading_zero_as_input(&self) -> untrusted::Input<'a> { self.0 } } impl Positive<'_> { /// Returns the first byte. /// /// Will not panic because the value is guaranteed to have at least one /// byte. pub fn first_byte(&self) -> u8 { // This won't panic because self.0.as_slice_less_safe()[0] } } ring-0.16.9/src/io/writer.rs000064400000000000000000000041731352416253600140300ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use alloc::{boxed::Box, vec::Vec}; pub trait Accumulator { fn write_byte(&mut self, value: u8); fn write_bytes(&mut self, value: &[u8]); } pub(super) struct LengthMeasurement { len: usize, } impl Into for LengthMeasurement { fn into(self) -> usize { self.len } } impl LengthMeasurement { pub fn zero() -> Self { Self { len: 0 } } } impl Accumulator for LengthMeasurement { fn write_byte(&mut self, _value: u8) { self.len += 1; } fn write_bytes(&mut self, value: &[u8]) { self.len += value.len(); } } pub(super) struct Writer { bytes: Vec, requested_capacity: usize, } impl Writer { pub(super) fn with_capacity(capacity: LengthMeasurement) -> Self { Self { bytes: Vec::with_capacity(capacity.len), requested_capacity: capacity.len, } } } impl Into> for Writer { fn into(self) -> Box<[u8]> { assert_eq!(self.requested_capacity, self.bytes.len()); self.bytes.into_boxed_slice() } } impl Accumulator for Writer { fn write_byte(&mut self, value: u8) { self.bytes.push(value); } fn write_bytes(&mut self, value: &[u8]) { self.bytes.extend(value); } } pub fn write_copy(accumulator: &mut dyn Accumulator, to_copy: untrusted::Input) { accumulator.write_bytes(to_copy.as_slice_less_safe()) } ring-0.16.9/src/io.rs000064400000000000000000000017331352416253600125130ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Serialization and deserialization. #[doc(hidden)] pub mod der; #[cfg(feature = "alloc")] mod writer; #[cfg(feature = "alloc")] pub(crate) mod der_writer; pub(crate) mod positive; pub use self::positive::Positive; ring-0.16.9/src/lib.rs000064400000000000000000000063411353111575600126520ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Safe, fast, small crypto using Rust with BoringSSL's cryptography //! primitives. //! //! git clone https://github.com/briansmith/ring //! //! # Feature Flags //! //! //!
Feature //! Description //!
alloc (default) //! Enable features that require use of the heap, RSA in particular. //!
dev_urandom_fallback (default) //! This is only applicable to Linux. On Linux, by default, //! ring::rand::SystemRandom will fall back to reading //! from /dev/urandom if the getrandom() //! syscall isn't supported at runtime. When the //! dev_urandom_fallback feature is disabled, such //! fallbacks will not occur. See the documentation for //! rand::SystemRandom for more details. //!
std //! Enable features that use libstd, in particular `std::error::Error` //! integration. //!
#![doc(html_root_url = "https://briansmith.org/rustdoc/")] #![allow( missing_copy_implementations, missing_debug_implementations, non_camel_case_types, non_snake_case, unsafe_code )] // `#[derive(...)]` uses `trivial_numeric_casts` and `unused_qualifications` // internally. #![deny( missing_docs, unstable_features, // Used by `internal_benches` unused_qualifications, variant_size_differences, )] #![forbid( anonymous_parameters, trivial_casts, trivial_numeric_casts, unused_extern_crates, unused_import_braces, unused_results, warnings )] #![no_std] #![cfg_attr(feature = "internal_benches", allow(unstable_features), feature(test))] #[cfg(feature = "alloc")] extern crate alloc; #[macro_use] mod debug; #[macro_use] pub mod test; #[macro_use] mod arithmetic; #[macro_use] mod bssl; #[macro_use] mod polyfill; pub mod aead; pub mod agreement; mod bits; pub(crate) mod c; pub mod constant_time; pub mod io; mod cpu; pub mod digest; mod ec; mod endian; pub mod error; pub mod hkdf; pub mod hmac; mod limb; pub mod pbkdf2; pub mod pkcs8; pub mod rand; #[cfg(feature = "alloc")] mod rsa; pub mod signature; mod sealed { /// Traits that are designed to only be implemented internally in *ring*. // // Usage: // ``` // use crate::sealed; // // pub trait MyType: sealed::Sealed { // // [...] // } // // impl sealed::Sealed for MyType {} // ``` pub trait Sealed {} } ring-0.16.9/src/limb.rs000064400000000000000000000463371353036607100130350ustar0000000000000000// Copyright 2016 David Judd. // Copyright 2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Unsigned multi-precision integer arithmetic. //! //! Limbs ordered least-significant-limb to most-significant-limb. The bits //! limbs use the native endianness. use crate::{c, error}; use untrusted; #[cfg(feature = "alloc")] use crate::bits; #[cfg(feature = "alloc")] use core::num::Wrapping; // XXX: Not correct for x32 ABIs. #[cfg(target_pointer_width = "64")] pub type Limb = u64; #[cfg(target_pointer_width = "32")] pub type Limb = u32; #[cfg(target_pointer_width = "64")] pub const LIMB_BITS: usize = 64; #[cfg(target_pointer_width = "32")] pub const LIMB_BITS: usize = 32; #[cfg(target_pointer_width = "64")] #[derive(Debug, PartialEq)] #[repr(u64)] pub enum LimbMask { True = 0xffff_ffff_ffff_ffff, False = 0, } #[cfg(target_pointer_width = "32")] #[derive(Debug, PartialEq)] #[repr(u32)] pub enum LimbMask { True = 0xffff_ffff, False = 0, } pub const LIMB_BYTES: usize = (LIMB_BITS + 7) / 8; #[inline] pub fn limbs_equal_limbs_consttime(a: &[Limb], b: &[Limb]) -> LimbMask { extern "C" { fn LIMBS_equal(a: *const Limb, b: *const Limb, num_limbs: c::size_t) -> LimbMask; } assert_eq!(a.len(), b.len()); unsafe { LIMBS_equal(a.as_ptr(), b.as_ptr(), a.len()) } } #[inline] pub fn limbs_less_than_limbs_consttime(a: &[Limb], b: &[Limb]) -> LimbMask { assert_eq!(a.len(), b.len()); unsafe { LIMBS_less_than(a.as_ptr(), b.as_ptr(), b.len()) } } #[inline] pub fn limbs_less_than_limbs_vartime(a: &[Limb], b: &[Limb]) -> bool { limbs_less_than_limbs_consttime(a, b) == LimbMask::True } #[inline] #[cfg(feature = "alloc")] pub fn limbs_less_than_limb_constant_time(a: &[Limb], b: Limb) -> LimbMask { unsafe { LIMBS_less_than_limb(a.as_ptr(), b, a.len()) } } #[inline] pub fn limbs_are_zero_constant_time(limbs: &[Limb]) -> LimbMask { unsafe { LIMBS_are_zero(limbs.as_ptr(), limbs.len()) } } #[cfg(feature = "alloc")] #[inline] pub fn limbs_are_even_constant_time(limbs: &[Limb]) -> LimbMask { unsafe { LIMBS_are_even(limbs.as_ptr(), limbs.len()) } } #[cfg(feature = "alloc")] #[inline] pub fn limbs_equal_limb_constant_time(a: &[Limb], b: Limb) -> LimbMask { unsafe { LIMBS_equal_limb(a.as_ptr(), b, a.len()) } } /// Returns the number of bits in `a`. // // This strives to be constant-time with respect to the values of all bits // except the most significant bit. This does not attempt to be constant-time // with respect to `a.len()` or the value of the result or the value of the // most significant bit (It's 1, unless the input is zero, in which case it's // zero.) #[cfg(feature = "alloc")] pub fn limbs_minimal_bits(a: &[Limb]) -> bits::BitLength { for num_limbs in (1..=a.len()).rev() { let high_limb = a[num_limbs - 1]; // Find the number of set bits in |high_limb| by a linear scan from the // most significant bit to the least significant bit. This works great // for the most common inputs because usually the most significant bit // it set. for high_limb_num_bits in (1..=LIMB_BITS).rev() { let shifted = unsafe { LIMB_shr(high_limb, high_limb_num_bits - 1) }; if shifted != 0 { return bits::BitLength::from_usize_bits( ((num_limbs - 1) * LIMB_BITS) + high_limb_num_bits, ); } } } // No bits were set. bits::BitLength::from_usize_bits(0) } /// Equivalent to `if (r >= m) { r -= m; }` #[inline] pub fn limbs_reduce_once_constant_time(r: &mut [Limb], m: &[Limb]) { assert_eq!(r.len(), m.len()); unsafe { LIMBS_reduce_once(r.as_mut_ptr(), m.as_ptr(), m.len()) }; } #[derive(Clone, Copy, PartialEq)] pub enum AllowZero { No, Yes, } /// Parses `input` into `result`, reducing it via conditional subtraction /// (mod `m`). Assuming 2**((self.num_limbs * LIMB_BITS) - 1) < m and /// m < 2**(self.num_limbs * LIMB_BITS), the value will be reduced mod `m` in /// constant time so that the result is in the range [0, m) if `allow_zero` is /// `AllowZero::Yes`, or [1, m) if `allow_zero` is `AllowZero::No`. `result` is /// padded with zeros to its length. pub fn parse_big_endian_in_range_partially_reduced_and_pad_consttime( input: untrusted::Input, allow_zero: AllowZero, m: &[Limb], result: &mut [Limb], ) -> Result<(), error::Unspecified> { parse_big_endian_and_pad_consttime(input, result)?; limbs_reduce_once_constant_time(result, m); if allow_zero != AllowZero::Yes { if limbs_are_zero_constant_time(&result) != LimbMask::False { return Err(error::Unspecified); } } Ok(()) } /// Parses `input` into `result`, verifies that the value is less than /// `max_exclusive`, and pads `result` with zeros to its length. If `allow_zero` /// is not `AllowZero::Yes`, zero values are rejected. /// /// This attempts to be constant-time with respect to the actual value *only if* /// the value is actually in range. In other words, this won't leak anything /// about a valid value, but it might leak small amounts of information about an /// invalid value (which constraint it failed). pub fn parse_big_endian_in_range_and_pad_consttime( input: untrusted::Input, allow_zero: AllowZero, max_exclusive: &[Limb], result: &mut [Limb], ) -> Result<(), error::Unspecified> { parse_big_endian_and_pad_consttime(input, result)?; if limbs_less_than_limbs_consttime(&result, max_exclusive) != LimbMask::True { return Err(error::Unspecified); } if allow_zero != AllowZero::Yes { if limbs_are_zero_constant_time(&result) != LimbMask::False { return Err(error::Unspecified); } } Ok(()) } /// Parses `input` into `result`, padding `result` with zeros to its length. /// This attempts to be constant-time with respect to the value but not with /// respect to the length; it is assumed that the length is public knowledge. pub fn parse_big_endian_and_pad_consttime( input: untrusted::Input, result: &mut [Limb], ) -> Result<(), error::Unspecified> { if input.is_empty() { return Err(error::Unspecified); } // `bytes_in_current_limb` is the number of bytes in the current limb. // It will be `LIMB_BYTES` for all limbs except maybe the highest-order // limb. let mut bytes_in_current_limb = input.len() % LIMB_BYTES; if bytes_in_current_limb == 0 { bytes_in_current_limb = LIMB_BYTES; } let num_encoded_limbs = (input.len() / LIMB_BYTES) + (if bytes_in_current_limb == LIMB_BYTES { 0 } else { 1 }); if num_encoded_limbs > result.len() { return Err(error::Unspecified); } for r in &mut result[..] { *r = 0; } // XXX: Questionable as far as constant-timedness is concerned. // TODO: Improve this. input.read_all(error::Unspecified, |input| { for i in 0..num_encoded_limbs { let mut limb: Limb = 0; for _ in 0..bytes_in_current_limb { let b: Limb = input.read_byte()?.into(); limb = (limb << 8) | b; } result[num_encoded_limbs - i - 1] = limb; bytes_in_current_limb = LIMB_BYTES; } Ok(()) }) } pub fn big_endian_from_limbs(limbs: &[Limb], out: &mut [u8]) { let num_limbs = limbs.len(); let out_len = out.len(); assert_eq!(out_len, num_limbs * LIMB_BYTES); for i in 0..num_limbs { let mut limb = limbs[i]; for j in 0..LIMB_BYTES { out[((num_limbs - i - 1) * LIMB_BYTES) + (LIMB_BYTES - j - 1)] = (limb & 0xff) as u8; limb >>= 8; } } } #[cfg(feature = "alloc")] pub type Window = Limb; /// Processes `limbs` as a sequence of 5-bit windows, folding the windows from /// most significant to least significant and returning the accumulated result. /// The first window will be mapped by `init` to produce the initial value for /// the accumulator. Then `f` will be called to fold the accumulator and the /// next window until all windows are processed. When the input's bit length /// isn't divisible by 5, the window passed to `init` will be partial; all /// windows passed to `fold` will be full. /// /// This is designed to avoid leaking the contents of `limbs` through side /// channels as long as `init` and `fold` are side-channel free. /// /// Panics if `limbs` is empty. #[cfg(feature = "alloc")] pub fn fold_5_bit_windows R, F: Fn(R, Window) -> R>( limbs: &[Limb], init: I, fold: F, ) -> R { #[derive(Clone, Copy)] #[repr(transparent)] struct BitIndex(Wrapping); const WINDOW_BITS: Wrapping = Wrapping(5); extern "C" { fn LIMBS_window5_split_window( lower_limb: Limb, higher_limb: Limb, index_within_word: BitIndex, ) -> Window; fn LIMBS_window5_unsplit_window(limb: Limb, index_within_word: BitIndex) -> Window; } let num_limbs = limbs.len(); let mut window_low_bit = { let num_whole_windows = (num_limbs * LIMB_BITS) / 5; let mut leading_bits = (num_limbs * LIMB_BITS) - (num_whole_windows * 5); if leading_bits == 0 { leading_bits = WINDOW_BITS.0; } BitIndex(Wrapping(LIMB_BITS - leading_bits)) }; let initial_value = { let leading_partial_window = unsafe { LIMBS_window5_split_window(*limbs.last().unwrap(), 0, window_low_bit) }; window_low_bit.0 -= WINDOW_BITS; init(leading_partial_window) }; let mut low_limb = 0; limbs .iter() .rev() .fold(initial_value, |mut acc, current_limb| { let higher_limb = low_limb; low_limb = *current_limb; if window_low_bit.0 > Wrapping(LIMB_BITS) - WINDOW_BITS { let window = unsafe { LIMBS_window5_split_window(low_limb, higher_limb, window_low_bit) }; window_low_bit.0 -= WINDOW_BITS; acc = fold(acc, window); }; while window_low_bit.0 < Wrapping(LIMB_BITS) { let window = unsafe { LIMBS_window5_unsplit_window(low_limb, window_low_bit) }; // The loop exits when this subtraction underflows, causing `window_low_bit` to // wrap around to a very large value. window_low_bit.0 -= WINDOW_BITS; acc = fold(acc, window); } window_low_bit.0 += Wrapping(LIMB_BITS); // "Fix" the underflow. acc }) } extern "C" { #[cfg(feature = "alloc")] fn LIMB_shr(a: Limb, shift: c::size_t) -> Limb; #[cfg(feature = "alloc")] fn LIMBS_are_even(a: *const Limb, num_limbs: c::size_t) -> LimbMask; fn LIMBS_are_zero(a: *const Limb, num_limbs: c::size_t) -> LimbMask; #[cfg(feature = "alloc")] fn LIMBS_equal_limb(a: *const Limb, b: Limb, num_limbs: c::size_t) -> LimbMask; fn LIMBS_less_than(a: *const Limb, b: *const Limb, num_limbs: c::size_t) -> LimbMask; #[cfg(feature = "alloc")] fn LIMBS_less_than_limb(a: *const Limb, b: Limb, num_limbs: c::size_t) -> LimbMask; fn LIMBS_reduce_once(r: *mut Limb, m: *const Limb, num_limbs: c::size_t); } #[cfg(test)] mod tests { use super::*; use untrusted; const MAX: Limb = LimbMask::True as Limb; #[test] fn test_limbs_are_even() { static EVENS: &[&[Limb]] = &[ &[], &[0], &[2], &[0, 0], &[2, 0], &[0, 1], &[0, 2], &[0, 3], &[0, 0, 0, 0, MAX], ]; for even in EVENS { assert_eq!(limbs_are_even_constant_time(even), LimbMask::True); } static ODDS: &[&[Limb]] = &[ &[1], &[3], &[1, 0], &[3, 0], &[1, 1], &[1, 2], &[1, 3], &[1, 0, 0, 0, MAX], ]; for odd in ODDS { assert_eq!(limbs_are_even_constant_time(odd), LimbMask::False); } } static ZEROES: &[&[Limb]] = &[ &[], &[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, 0], &[0, 0, 0, 0, 0, 0, 0, 0, 0], ]; static NONZEROES: &[&[Limb]] = &[ &[1], &[0, 1], &[1, 1], &[1, 0, 0, 0], &[0, 1, 0, 0], &[0, 0, 1, 0], &[0, 0, 0, 1], ]; #[test] fn test_limbs_are_zero() { for zero in ZEROES { assert_eq!(limbs_are_zero_constant_time(zero), LimbMask::True); } for nonzero in NONZEROES { assert_eq!(limbs_are_zero_constant_time(nonzero), LimbMask::False); } } #[test] fn test_limbs_equal_limb() { for zero in ZEROES { assert_eq!(limbs_equal_limb_constant_time(zero, 0), LimbMask::True); } for nonzero in NONZEROES { assert_eq!(limbs_equal_limb_constant_time(nonzero, 0), LimbMask::False); } static EQUAL: &[(&[Limb], Limb)] = &[ (&[1], 1), (&[MAX], MAX), (&[1, 0], 1), (&[MAX, 0, 0], MAX), (&[0b100], 0b100), (&[0b100, 0], 0b100), ]; for &(a, b) in EQUAL { assert_eq!(limbs_equal_limb_constant_time(a, b), LimbMask::True); } static UNEQUAL: &[(&[Limb], Limb)] = &[ (&[0], 1), (&[2], 1), (&[3], 1), (&[1, 1], 1), (&[0b100, 0b100], 0b100), (&[1, 0, 0b100, 0, 0, 0, 0, 0], 1), (&[1, 0, 0, 0, 0, 0, 0, 0b100], 1), (&[MAX, MAX], MAX), (&[MAX, 1], MAX), ]; for &(a, b) in UNEQUAL { assert_eq!(limbs_equal_limb_constant_time(a, b), LimbMask::False); } } #[test] #[cfg(feature = "alloc")] fn test_limbs_less_than_limb_constant_time() { static LESSER: &[(&[Limb], Limb)] = &[ (&[0], 1), (&[0, 0], 1), (&[1, 0], 2), (&[2, 0], 3), (&[2, 0], 3), (&[MAX - 1], MAX), (&[MAX - 1, 0], MAX), ]; for &(a, b) in LESSER { assert_eq!(limbs_less_than_limb_constant_time(a, b), LimbMask::True); } static EQUAL: &[(&[Limb], Limb)] = &[ (&[0], 0), (&[0, 0, 0, 0], 0), (&[1], 1), (&[1, 0, 0, 0, 0, 0, 0], 1), (&[MAX], MAX), ]; static GREATER: &[(&[Limb], Limb)] = &[ (&[1], 0), (&[2, 0], 1), (&[3, 0, 0, 0], 1), (&[0, 1, 0, 0], 1), (&[0, 0, 1, 0], 1), (&[0, 0, 1, 1], 1), (&[MAX], MAX - 1), ]; for &(a, b) in EQUAL.iter().chain(GREATER.iter()) { assert_eq!(limbs_less_than_limb_constant_time(a, b), LimbMask::False); } } #[test] fn test_parse_big_endian_and_pad_consttime() { const LIMBS: usize = 4; { // Empty input. let inp = untrusted::Input::from(&[]); let mut result = [0; LIMBS]; assert!(parse_big_endian_and_pad_consttime(inp, &mut result).is_err()); } // The input is longer than will fit in the given number of limbs. { let inp = [1, 2, 3, 4, 5, 6, 7, 8, 9]; let inp = untrusted::Input::from(&inp); let mut result = [0; 8 / LIMB_BYTES]; assert!(parse_big_endian_and_pad_consttime(inp, &mut result[..]).is_err()); } // Less than a full limb. { let inp = [0xfe]; let inp = untrusted::Input::from(&inp); let mut result = [0; LIMBS]; assert_eq!( Ok(()), parse_big_endian_and_pad_consttime(inp, &mut result[..]) ); assert_eq!(&[0xfe, 0, 0, 0], &result); } // A whole limb for 32-bit, half a limb for 64-bit. { let inp = [0xbe, 0xef, 0xf0, 0x0d]; let inp = untrusted::Input::from(&inp); let mut result = [0; LIMBS]; assert_eq!(Ok(()), parse_big_endian_and_pad_consttime(inp, &mut result)); assert_eq!(&[0xbeeff00d, 0, 0, 0], &result); } // XXX: This is a weak set of tests. TODO: expand it. } #[test] fn test_big_endian_from_limbs_same_length() { #[cfg(target_pointer_width = "32")] let limbs = [ 0xbccddeef, 0x89900aab, 0x45566778, 0x01122334, 0xddeeff00, 0x99aabbcc, 0x55667788, 0x11223344, ]; #[cfg(target_pointer_width = "64")] let limbs = [ 0x89900aab_bccddeef, 0x01122334_45566778, 0x99aabbcc_ddeeff00, 0x11223344_55667788, ]; let expected = [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x90, 0x0a, 0xab, 0xbc, 0xcd, 0xde, 0xef, ]; let mut out = [0xabu8; 32]; big_endian_from_limbs(&limbs[..], &mut out); assert_eq!(&out[..], &expected[..]); } #[should_panic] #[test] fn test_big_endian_from_limbs_fewer_limbs() { #[cfg(target_pointer_width = "32")] // Two fewer limbs. let limbs = [ 0xbccddeef, 0x89900aab, 0x45566778, 0x01122334, 0xddeeff00, 0x99aabbcc, ]; // One fewer limb. #[cfg(target_pointer_width = "64")] let limbs = [ 0x89900aab_bccddeef, 0x01122334_45566778, 0x99aabbcc_ddeeff00, ]; let mut out = [0xabu8; 32]; big_endian_from_limbs(&limbs[..], &mut out); } #[test] fn test_limbs_minimal_bits() { const ALL_ONES: Limb = LimbMask::True as Limb; static CASES: &[(&[Limb], usize)] = &[ (&[], 0), (&[0], 0), (&[ALL_ONES], LIMB_BITS), (&[ALL_ONES, 0], LIMB_BITS), (&[ALL_ONES, 1], LIMB_BITS + 1), (&[0, 0], 0), (&[1, 0], 1), (&[0, 1], LIMB_BITS + 1), (&[0, ALL_ONES], 2 * LIMB_BITS), (&[ALL_ONES, ALL_ONES], 2 * LIMB_BITS), (&[ALL_ONES, ALL_ONES >> 1], 2 * LIMB_BITS - 1), (&[ALL_ONES, 0b100_0000], LIMB_BITS + 7), (&[ALL_ONES, 0b101_0000], LIMB_BITS + 7), (&[ALL_ONES, ALL_ONES >> 1], LIMB_BITS + (LIMB_BITS) - 1), ]; for (limbs, bits) in CASES { assert_eq!(limbs_minimal_bits(limbs).as_usize_bits(), *bits); } } } ring-0.16.9/src/pbkdf2.rs000064400000000000000000000231441352416253600132540ustar0000000000000000// Copyright 2015 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! PBKDF2 derivation and verification. //! //! Use `derive` to derive PBKDF2 outputs. Use `verify` to verify secret //! against previously-derived outputs. //! //! PBKDF2 is specified in [RFC 2898 Section 5.2] with test vectors given in //! [RFC 6070]. See also [NIST Special Publication 800-132]. //! //! [RFC 2898 Section 5.2]: https://tools.ietf.org/html/rfc2898#section-5.2 //! [RFC 6070]: https://tools.ietf.org/html/rfc6070 //! [NIST Special Publication 800-132]: //! http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf //! //! # Examples //! //! ## Password Database Example //! //! ``` //! use ring::{digest, pbkdf2}; //! use std::{collections::HashMap, num::NonZeroU32}; //! //! static PBKDF2_ALG: pbkdf2::Algorithm = pbkdf2::PBKDF2_HMAC_SHA256; //! const CREDENTIAL_LEN: usize = digest::SHA256_OUTPUT_LEN; //! pub type Credential = [u8; CREDENTIAL_LEN]; //! //! enum Error { //! WrongUsernameOrPassword //! } //! //! struct PasswordDatabase { //! pbkdf2_iterations: NonZeroU32, //! db_salt_component: [u8; 16], //! //! // Normally this would be a persistent database. //! storage: HashMap, //! } //! //! impl PasswordDatabase { //! pub fn store_password(&mut self, username: &str, password: &str) { //! let salt = self.salt(username); //! let mut to_store: Credential = [0u8; CREDENTIAL_LEN]; //! pbkdf2::derive(PBKDF2_ALG, self.pbkdf2_iterations, &salt, //! password.as_bytes(), &mut to_store); //! self.storage.insert(String::from(username), to_store); //! } //! //! pub fn verify_password(&self, username: &str, attempted_password: &str) //! -> Result<(), Error> { //! match self.storage.get(username) { //! Some(actual_password) => { //! let salt = self.salt(username); //! pbkdf2::verify(PBKDF2_ALG, self.pbkdf2_iterations, &salt, //! attempted_password.as_bytes(), //! actual_password) //! .map_err(|_| Error::WrongUsernameOrPassword) //! }, //! //! None => Err(Error::WrongUsernameOrPassword) //! } //! } //! //! // The salt should have a user-specific component so that an attacker //! // cannot crack one password for multiple users in the database. It //! // should have a database-unique component so that an attacker cannot //! // crack the same user's password across databases in the unfortunate //! // but common case that the user has used the same password for //! // multiple systems. //! fn salt(&self, username: &str) -> Vec { //! let mut salt = Vec::with_capacity(self.db_salt_component.len() + //! username.as_bytes().len()); //! salt.extend(self.db_salt_component.as_ref()); //! salt.extend(username.as_bytes()); //! salt //! } //! } //! //! fn main() { //! // Normally these parameters would be loaded from a configuration file. //! let mut db = PasswordDatabase { //! pbkdf2_iterations: NonZeroU32::new(100_000).unwrap(), //! db_salt_component: [ //! // This value was generated from a secure PRNG. //! 0xd6, 0x26, 0x98, 0xda, 0xf4, 0xdc, 0x50, 0x52, //! 0x24, 0xf2, 0x27, 0xd1, 0xfe, 0x39, 0x01, 0x8a //! ], //! storage: HashMap::new(), //! }; //! //! db.store_password("alice", "@74d7]404j|W}6u"); //! //! // An attempt to log in with the wrong password fails. //! assert!(db.verify_password("alice", "wrong password").is_err()); //! //! // Normally there should be an expoentially-increasing delay between //! // attempts to further protect against online attacks. //! //! // An attempt to log in with the right password succeeds. //! assert!(db.verify_password("alice", "@74d7]404j|W}6u").is_ok()); //! } use crate::{constant_time, digest, error, hmac, polyfill}; use core::num::NonZeroU32; /// A PBKDF2 algorithm. #[derive(Clone, Copy, PartialEq, Eq)] pub struct Algorithm(hmac::Algorithm); /// PBKDF2 using HMAC-SHA1. pub static PBKDF2_HMAC_SHA1: Algorithm = Algorithm(hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY); /// PBKDF2 using HMAC-h. pub static PBKDF2_HMAC_SHA256: Algorithm = Algorithm(hmac::HMAC_SHA256); /// PBKDF2 using HMAC-SHA384. pub static PBKDF2_HMAC_SHA384: Algorithm = Algorithm(hmac::HMAC_SHA384); /// PBKDF2 using HMAC-SHA512. pub static PBKDF2_HMAC_SHA512: Algorithm = Algorithm(hmac::HMAC_SHA512); /// Fills `out` with the key derived using PBKDF2 with the given inputs. /// /// Do not use `derive` as part of verifying a secret; use `verify` instead, to /// minimize the effectiveness of timing attacks. /// /// `out.len()` must be no larger than the digest length * (2**32 - 1), per the /// PBKDF2 specification. /// /// | Parameter | RFC 2898 Section 5.2 Term /// |-------------|------------------------------------------- /// | digest_alg | PRF (HMAC with the given digest algorithm) /// | iterations | c (iteration count) /// | salt | S (salt) /// | secret | P (password) /// | out | dk (derived key) /// | out.len() | dkLen (derived key length) /// /// # Panics /// /// `derive` panics if `out.len()` is larger than (2**32 - 1) * the digest /// algorithm's output length, per the PBKDF2 specification. pub fn derive( algorithm: Algorithm, iterations: NonZeroU32, salt: &[u8], secret: &[u8], out: &mut [u8], ) { let digest_alg = algorithm.0.digest_algorithm(); let output_len = digest_alg.output_len; // This implementation's performance is asymptotically optimal as described // in https://jbp.io/2015/08/11/pbkdf2-performance-matters/. However, it // hasn't been optimized to the same extent as fastpbkdf2. In particular, // this implementation is probably doing a lot of unnecessary copying. let secret = hmac::Key::new(algorithm.0, secret); // Clear |out|. polyfill::slice::fill(out, 0); let mut idx: u32 = 0; for chunk in out.chunks_mut(output_len) { idx = idx.checked_add(1).expect("derived key too long"); derive_block(&secret, iterations, salt, idx, chunk); } } fn derive_block(secret: &hmac::Key, iterations: NonZeroU32, salt: &[u8], idx: u32, out: &mut [u8]) { let mut ctx = hmac::Context::with_key(secret); ctx.update(salt); ctx.update(&u32::to_be_bytes(idx)); let mut u = ctx.sign(); let mut remaining: u32 = iterations.into(); loop { for i in 0..out.len() { out[i] ^= u.as_ref()[i]; } if remaining == 1 { break; } remaining -= 1; u = hmac::sign(secret, u.as_ref()); } } /// Verifies that a previously-derived (e.g., using `derive`) PBKDF2 value /// matches the PBKDF2 value derived from the other inputs. /// /// The comparison is done in constant time to prevent timing attacks. The /// comparison will fail if `previously_derived` is empty (has a length of /// zero). /// /// | Parameter | RFC 2898 Section 5.2 Term /// |----------------------------|-------------------------------------------- /// | digest_alg | PRF (HMAC with the given digest algorithm). /// | `iterations` | c (iteration count) /// | `salt` | S (salt) /// | `secret` | P (password) /// | `previously_derived` | dk (derived key) /// | `previously_derived.len()` | dkLen (derived key length) /// /// # Panics /// /// `verify` panics if `out.len()` is larger than (2**32 - 1) * the digest /// algorithm's output length, per the PBKDF2 specification. pub fn verify( algorithm: Algorithm, iterations: NonZeroU32, salt: &[u8], secret: &[u8], previously_derived: &[u8], ) -> Result<(), error::Unspecified> { let digest_alg = algorithm.0.digest_algorithm(); if previously_derived.is_empty() { return Err(error::Unspecified); } let mut derived_buf = [0u8; digest::MAX_OUTPUT_LEN]; let output_len = digest_alg.output_len; let secret = hmac::Key::new(algorithm.0, secret); let mut idx: u32 = 0; let mut matches = 1; for previously_derived_chunk in previously_derived.chunks(output_len) { idx = idx.checked_add(1).expect("derived key too long"); let derived_chunk = &mut derived_buf[..previously_derived_chunk.len()]; polyfill::slice::fill(derived_chunk, 0); derive_block(&secret, iterations, salt, idx, derived_chunk); // XXX: This isn't fully constant-time-safe. TODO: Fix that. let current_block_matches = if constant_time::verify_slices_are_equal(derived_chunk, previously_derived_chunk) .is_ok() { 1 } else { 0 }; matches &= current_block_matches; } if matches == 0 { return Err(error::Unspecified); } Ok(()) } ring-0.16.9/src/pkcs8.rs000064400000000000000000000161321352416253600131330ustar0000000000000000// Copyright 2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! PKCS#8 is specified in [RFC 5958]. //! //! [RFC 5958]: https://tools.ietf.org/html/rfc5958. use crate::{ec, error, io::der}; use untrusted; pub(crate) enum Version { V1Only, V1OrV2, V2Only, } /// A template for constructing PKCS#8 documents. /// /// Note that this only works for ECC. pub(crate) struct Template { pub bytes: &'static [u8], // The range within `bytes` that holds the value (not including the tag and // length) for use in the PKCS#8 document's privateKeyAlgorithm field. pub alg_id_range: core::ops::Range, // `bytes[alg_id_range][curve_id_index..]` contains the OID identifying the, // curve, including the tag and length. pub curve_id_index: usize, // `bytes` will be split into two parts at `private_key_index`, where the // first part is written before the private key and the second part is // written after the private key. The public key is written after the second // part. pub private_key_index: usize, } impl Template { #[inline] fn alg_id_value(&self) -> untrusted::Input { untrusted::Input::from(self.alg_id_value_()) } fn alg_id_value_(&self) -> &[u8] { &self.bytes[self.alg_id_range.start..self.alg_id_range.end] } #[inline] pub fn curve_oid(&self) -> untrusted::Input { untrusted::Input::from(&self.alg_id_value_()[self.curve_id_index..]) } } /// Parses an unencrypted PKCS#8 private key, verifies that it is the right type /// of key, and returns the key value. /// /// PKCS#8 is specified in [RFC 5958]. /// /// [RFC 5958]: https://tools.ietf.org/html/rfc5958. pub(crate) fn unwrap_key<'a>( template: &Template, version: Version, input: untrusted::Input<'a>, ) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { unwrap_key_(template.alg_id_value(), version, input) } /// Parses an unencrypted PKCS#8 private key, verifies that it is the right type /// of key, and returns the key value. /// /// `alg_id` must be the encoded value (not including the outermost `SEQUENCE` /// tag and length) of the `AlgorithmIdentifier` that identifies the key type. /// The result will be an encoded `RSAPrivateKey` or `ECPrivateKey` or similar. /// /// PKCS#8 is specified in [RFC 5958]. /// /// [RFC 5958]: https://tools.ietf.org/html/rfc5958. pub(crate) fn unwrap_key_<'a>( alg_id: untrusted::Input, version: Version, input: untrusted::Input<'a>, ) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { input.read_all(error::KeyRejected::invalid_encoding(), |input| { der::nested( input, der::Tag::Sequence, error::KeyRejected::invalid_encoding(), |input| unwrap_key__(alg_id, version, input), ) }) } fn unwrap_key__<'a>( alg_id: untrusted::Input, version: Version, input: &mut untrusted::Reader<'a>, ) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { let actual_version = der::small_nonnegative_integer(input) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; // Do things in a specific order to return more useful errors: // 1. Check for completely unsupported version. // 2. Check for algorithm mismatch. // 3. Check for algorithm-specific version mismatch. if actual_version > 1 { return Err(error::KeyRejected::version_not_supported()); }; let actual_alg_id = der::expect_tag_and_get_value(input, der::Tag::Sequence) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; if actual_alg_id != alg_id { return Err(error::KeyRejected::wrong_algorithm()); } let require_public_key = match (actual_version, version) { (0, Version::V1Only) => false, (0, Version::V1OrV2) => false, (1, Version::V1OrV2) | (1, Version::V2Only) => true, _ => { return Err(error::KeyRejected::version_not_supported()); } }; let private_key = der::expect_tag_and_get_value(input, der::Tag::OctetString) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; // Ignore any attributes that are present. if input.peek(der::Tag::ContextSpecificConstructed0 as u8) { let _ = der::expect_tag_and_get_value(input, der::Tag::ContextSpecificConstructed0) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; } let public_key = if require_public_key { if input.at_end() { return Err(error::KeyRejected::public_key_is_missing()); } let public_key = der::nested( input, der::Tag::ContextSpecificConstructed1, error::Unspecified, der::bit_string_with_no_unused_bits, ) .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; Some(public_key) } else { None }; Ok((private_key, public_key)) } /// A generated PKCS#8 document. pub struct Document { bytes: [u8; ec::PKCS8_DOCUMENT_MAX_LEN], len: usize, } impl AsRef<[u8]> for Document { #[inline] fn as_ref(&self) -> &[u8] { &self.bytes[..self.len] } } pub(crate) fn wrap_key(template: &Template, private_key: &[u8], public_key: &[u8]) -> Document { let mut result = Document { bytes: [0; ec::PKCS8_DOCUMENT_MAX_LEN], len: template.bytes.len() + private_key.len() + public_key.len(), }; wrap_key_( template, private_key, public_key, &mut result.bytes[..result.len], ); result } /// Formats a private key "prefix||private_key||middle||public_key" where /// `template` is "prefix||middle" split at position `private_key_index`. fn wrap_key_(template: &Template, private_key: &[u8], public_key: &[u8], bytes: &mut [u8]) { let (before_private_key, after_private_key) = template.bytes.split_at(template.private_key_index); let private_key_end_index = template.private_key_index + private_key.len(); bytes[..template.private_key_index].copy_from_slice(before_private_key); bytes[template.private_key_index..private_key_end_index].copy_from_slice(&private_key); bytes[private_key_end_index..(private_key_end_index + after_private_key.len())] .copy_from_slice(after_private_key); bytes[(private_key_end_index + after_private_key.len())..].copy_from_slice(public_key); } ring-0.16.9/src/polyfill/convert.rs000064400000000000000000000023061352416253600154130ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /// An approximation of `core::convert::From` that lets us define our own /// conversions between types defined outside this crate. /// /// Do not use this this in situations where `From` could be used. pub trait From_: Sized { fn from_(value: F) -> Self; } pub trait Into_ where T: Sized, { fn into_(self) -> T; } impl Into_ for F where T: From_, { #[inline] fn into_(self) -> T { T::from_(self) } } ring-0.16.9/src/polyfill.rs000064400000000000000000000025171352416253600137370ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Polyfills for functionality that will (hopefully) be added to Rust's //! standard library soon. #[macro_use] pub mod convert; #[inline(always)] pub const fn u64_from_usize(x: usize) -> u64 { x as u64 } #[inline(always)] pub fn usize_from_u32(x: u32) -> usize { x as usize } pub mod slice { // https://github.com/rust-lang/rust/issues/27750 // https://internals.rust-lang.org/t/stabilizing-basic-functions-on-arrays-and-slices/2868 #[inline(always)] pub fn fill(dest: &mut [u8], value: u8) { for d in dest { *d = value; } } } ring-0.16.9/src/rand.rs000064400000000000000000000322301353224230700130160ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Cryptographic pseudo-random number generation. //! //! An application should create a single `SystemRandom` and then use it for //! all randomness generation. Functions that generate random bytes should take //! a `&dyn SecureRandom` parameter instead of instantiating their own. Besides //! being more efficient, this also helps document where non-deterministic //! (random) outputs occur. Taking a reference to a `SecureRandom` also helps //! with testing techniques like fuzzing, where it is useful to use a //! (non-secure) deterministic implementation of `SecureRandom` so that results //! can be replayed. Following this pattern also may help with sandboxing //! (seccomp filters on Linux in particular). See `SystemRandom`'s //! documentation for more details. use crate::error; /// A secure random number generator. pub trait SecureRandom: sealed::SecureRandom { /// Fills `dest` with random bytes. fn fill(&self, dest: &mut [u8]) -> Result<(), error::Unspecified>; } impl SecureRandom for T where T: sealed::SecureRandom, { #[inline(always)] fn fill(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { self.fill_impl(dest) } } /// A random value constructed from a `SecureRandom` that hasn't been exposed /// through any safe Rust interface. /// /// Intentionally does not implement any traits other than `Sized`. pub struct Random(T); impl Random { /// Expose the random value. #[inline] pub fn expose(self) -> T { self.0 } } /// Generate the new random value using `rng`. #[inline] pub fn generate( rng: &dyn SecureRandom, ) -> Result, error::Unspecified> where T: RandomlyConstructable, { let mut r = T::zero(); rng.fill(r.as_mut_bytes())?; Ok(Random(r)) } pub(crate) mod sealed { use crate::error; pub trait SecureRandom: core::fmt::Debug { /// Fills `dest` with random bytes. fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified>; } pub trait RandomlyConstructable: Sized { fn zero() -> Self; // `Default::default()` fn as_mut_bytes(&mut self) -> &mut [u8]; // `AsMut<[u8]>::as_mut` } macro_rules! impl_random_arrays { [ $($len:expr)+ ] => { $( impl RandomlyConstructable for [u8; $len] { #[inline] fn zero() -> Self { [0; $len] } #[inline] fn as_mut_bytes(&mut self) -> &mut [u8] { &mut self[..] } } )+ } } impl_random_arrays![4 8 16 32 48 64]; } /// A type that can be returned by `ring::rand::generate()`. pub trait RandomlyConstructable: self::sealed::RandomlyConstructable {} impl RandomlyConstructable for T where T: self::sealed::RandomlyConstructable {} /// A secure random number generator where the random values come directly /// from the operating system. /// /// A single `SystemRandom` may be shared across multiple threads safely. /// /// `new()` is guaranteed to always succeed and to have low latency; it won't /// try to open or read from a file or do similar things. The first call to /// `fill()` may block a substantial amount of time since any and all /// initialization is deferred to it. Therefore, it may be a good idea to call /// `fill()` once at a non-latency-sensitive time to minimize latency for /// future calls. /// /// On Linux (including Android), `fill()` will use the [`getrandom`] syscall. /// If the kernel is too old to support `getrandom` then by default `fill()` /// falls back to reading from `/dev/urandom`. This decision is made the first /// time `fill` *succeeds*. The fallback to `/dev/urandom` can be disabled by /// disabling the `dev_urandom_fallback` default feature; this should be done /// whenever the target system is known to support `getrandom`. When /// `/dev/urandom` is used, a file handle for `/dev/urandom` won't be opened /// until `fill` is called; `SystemRandom::new()` will not open `/dev/urandom` /// or do other potentially-high-latency things. The file handle will never be /// closed, until the operating system closes it at process shutdown. All /// instances of `SystemRandom` will share a single file handle. To properly /// implement seccomp filtering when the `dev_urandom_fallback` default feature /// is disabled, allow `getrandom` through. When the fallback is enabled, allow /// file opening, `getrandom`, and `read` up until the first call to `fill()` /// succeeds; after that, allow `getrandom` and `read`. /// /// On macOS and iOS, `fill()` is implemented using `SecRandomCopyBytes`. /// /// On wasm32-unknown-unknown (non-WASI), `fill()` is implemented using /// `window.crypto.getRandomValues()`. It must be used in a context where the /// global object is a `Window`; i.e. it must not be used in a Worker or a /// non-browser context. /// /// On Windows, `fill` is implemented using the platform's API for secure /// random number generation. /// /// [`getrandom`]: http://man7.org/linux/man-pages/man2/getrandom.2.html #[derive(Clone, Debug)] pub struct SystemRandom(()); impl SystemRandom { /// Constructs a new `SystemRandom`. #[inline(always)] pub fn new() -> Self { Self(()) } } impl sealed::SecureRandom for SystemRandom { #[inline(always)] fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { fill_impl(dest) } } impl crate::sealed::Sealed for SystemRandom {} #[cfg(any( all( any(target_os = "android", target_os = "linux"), not(feature = "dev_urandom_fallback") ), target_arch = "wasm32", windows ))] use self::sysrand::fill as fill_impl; #[cfg(all( any(target_os = "android", target_os = "linux"), feature = "dev_urandom_fallback" ))] use self::sysrand_or_urandom::fill as fill_impl; #[cfg(any( target_os = "freebsd", target_os = "netbsd", target_os = "openbsd", target_os = "solaris" ))] use self::urandom::fill as fill_impl; #[cfg(any(target_os = "macos", target_os = "ios"))] use self::darwin::fill as fill_impl; #[cfg(any(target_os = "fuchsia"))] use self::fuchsia::fill as fill_impl; #[cfg(any(target_os = "android", target_os = "linux"))] mod sysrand_chunk { use crate::{c, error}; #[inline] pub fn chunk(dest: &mut [u8]) -> Result { use libc::c_long; // See `SYS_getrandom` in #include . #[cfg(target_arch = "aarch64")] const SYS_GETRANDOM: c_long = 278; #[cfg(target_arch = "arm")] const SYS_GETRANDOM: c_long = 384; #[cfg(target_arch = "x86")] const SYS_GETRANDOM: c_long = 355; #[cfg(target_arch = "x86_64")] const SYS_GETRANDOM: c_long = 318; let chunk_len: c::size_t = dest.len(); let r = unsafe { libc::syscall(SYS_GETRANDOM, dest.as_mut_ptr(), chunk_len, 0) }; if r < 0 { let errno; #[cfg(target_os = "linux")] { errno = unsafe { *libc::__errno_location() }; } #[cfg(target_os = "android")] { errno = unsafe { *libc::__errno() }; } if errno == libc::EINTR { // If an interrupt occurs while getrandom() is blocking to wait // for the entropy pool, then EINTR is returned. Returning 0 // will cause the caller to try again. return Ok(0); } return Err(error::Unspecified); } Ok(r as usize) } } #[cfg(all( target_arch = "wasm32", target_vendor = "unknown", target_os = "unknown", target_env = "", ))] mod sysrand_chunk { use crate::error; pub fn chunk(mut dest: &mut [u8]) -> Result { // This limit is specified in // https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues. const MAX_LEN: usize = 65_536; if dest.len() > MAX_LEN { dest = &mut dest[..MAX_LEN]; }; let _ = web_sys::window() .ok_or(error::Unspecified)? .crypto() .map_err(|_| error::Unspecified)? .get_random_values_with_u8_array(dest) .map_err(|_| error::Unspecified)?; Ok(dest.len()) } } #[cfg(windows)] mod sysrand_chunk { use crate::{error, polyfill}; #[inline] pub fn chunk(dest: &mut [u8]) -> Result { use winapi::shared::wtypesbase::ULONG; assert!(core::mem::size_of::() >= core::mem::size_of::()); let len = core::cmp::min(dest.len(), polyfill::usize_from_u32(ULONG::max_value())); let result = unsafe { winapi::um::ntsecapi::RtlGenRandom( dest.as_mut_ptr() as *mut winapi::ctypes::c_void, len as ULONG, ) }; if result == 0 { return Err(error::Unspecified); } Ok(len) } } #[cfg(any( target_os = "android", target_os = "linux", target_arch = "wasm32", windows ))] mod sysrand { use super::sysrand_chunk::chunk; use crate::error; pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { let mut read_len = 0; while read_len < dest.len() { let chunk_len = chunk(&mut dest[read_len..])?; read_len += chunk_len; } Ok(()) } } // Keep the `cfg` conditions in sync with the conditions in lib.rs. #[cfg(all( any(target_os = "android", target_os = "linux"), feature = "dev_urandom_fallback" ))] mod sysrand_or_urandom { use crate::error; enum Mechanism { Sysrand, DevURandom, } #[inline] pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { use lazy_static::lazy_static; lazy_static! { static ref MECHANISM: Mechanism = { let mut dummy = [0u8; 1]; if super::sysrand_chunk::chunk(&mut dummy[..]).is_err() { Mechanism::DevURandom } else { Mechanism::Sysrand } }; } match *MECHANISM { Mechanism::Sysrand => super::sysrand::fill(dest), Mechanism::DevURandom => super::urandom::fill(dest), } } } #[cfg(any( all( any(target_os = "android", target_os = "linux"), feature = "dev_urandom_fallback" ), target_os = "freebsd", target_os = "netbsd", target_os = "openbsd", target_os = "solaris" ))] mod urandom { use crate::error; #[cfg_attr(any(target_os = "android", target_os = "linux"), cold, inline(never))] pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { extern crate std; use lazy_static::lazy_static; lazy_static! { static ref FILE: Result = std::fs::File::open("/dev/urandom"); } match *FILE { Ok(ref file) => { use std::io::Read; (&*file).read_exact(dest).map_err(|_| error::Unspecified) } Err(_) => Err(error::Unspecified), } } } #[cfg(any(target_os = "macos", target_os = "ios"))] mod darwin { use crate::{c, error}; pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { let r = unsafe { SecRandomCopyBytes(kSecRandomDefault, dest.len(), dest.as_mut_ptr()) }; match r { 0 => Ok(()), _ => Err(error::Unspecified), } } // XXX: This is emulating an opaque type with a non-opaque type. TODO: Fix // this when // https://github.com/rust-lang/rfcs/pull/1861#issuecomment-274613536 is // resolved. #[repr(C)] struct SecRandomRef([u8; 0]); #[link(name = "Security", kind = "framework")] extern "C" { static kSecRandomDefault: &'static SecRandomRef; // For now `rnd` must be `kSecRandomDefault`. #[must_use] fn SecRandomCopyBytes( rnd: &'static SecRandomRef, count: c::size_t, bytes: *mut u8, ) -> c::int; } } #[cfg(any(target_os = "fuchsia"))] mod fuchsia { use crate::error; pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { unsafe { zx_cprng_draw(dest.as_mut_ptr(), dest.len()); } Ok(()) } #[link(name = "zircon")] extern "C" { fn zx_cprng_draw(buffer: *mut u8, length: usize); } } ring-0.16.9/src/rsa/convert_nist_rsa_test_vectors.py000064400000000000000000000201121352416253600210530ustar0000000000000000#!/usr/bin/env python2 # # Copyright 2016 Dirkjan Ochtman. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ''' Script to generate *ring* test file for RSA PKCS1 v1.5 signing test vectors from the NIST FIPS 186-4 test vectors. Takes as single argument on the command-line the path to the test vector file (tested with SigGen15_186-3.txt). Requires the cryptography library from pyca. ''' from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import rsa, padding import hashlib import sys, copy DIGEST_OUTPUT_LENGTHS = { 'SHA1': 80, 'SHA256': 128, 'SHA384': 192, 'SHA512': 256 } # Prints reasons for skipping tests DEBUG = False def debug(str, flag): if flag: sys.stderr.write(str + "\n") sys.stderr.flush() # Some fields in the input files are encoded without a leading "0", but # `x.decode('hex')` requires every byte to be encoded with two hex digits. def from_hex(hex): return (hex if len(hex) % 2 == 0 else "0" + hex).decode('hex') def to_hex(bytes): return ''.join('{:02x}'.format(ord(b)) for b in bytes) # Some fields in the input files are encoded without a leading "0", but the # *ring* test framework requires every byte to be encoded with two hex digits. def reformat_hex(hex): return to_hex(from_hex(hex)) def parse(fn, last_field): '''Parse input test vector file, leaving out comments and empty lines, and returns a list of self-contained test cases. Depends on the last_field being the last value in each test case.''' cases = [] with open(fn) as f: cur = {} for ln in f: if not ln.strip(): continue if ln[0] in {'#', '['}: continue name, val = ln.split('=', 1) cur[name.strip()] = val.strip() if name.strip() == last_field: cases.append(cur) cur = copy.copy(cur) return cases def print_sign_test(case, n, e, d, padding_alg): # Recover the prime factors and CRT numbers. p, q = rsa.rsa_recover_prime_factors(n, e, d) # cryptography returns p, q with p < q by default. *ring* requires # p > q, so swap them here. p, q = max(p, q), min(p, q) dmp1 = rsa.rsa_crt_dmp1(d, p) dmq1 = rsa.rsa_crt_dmq1(d, q) iqmp = rsa.rsa_crt_iqmp(p, q) # Create a private key instance. pub = rsa.RSAPublicNumbers(e, n) priv = rsa.RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, pub) key = priv.private_key(default_backend()) msg = case['Msg'].decode('hex') # Recalculate and compare the signature to validate our processing. if padding_alg == 'PKCS#1 1.5': sig = key.sign(msg, padding.PKCS1v15(), getattr(hashes, case['SHAAlg'])()) hex_sig = to_hex(sig) assert hex_sig == case['S'] elif padding_alg == "PSS": # PSS is randomised, can't recompute this way pass else: print "Invalid padding algorithm" quit() # Serialize the private key in DER format. der = key.private_bytes(serialization.Encoding.DER, serialization.PrivateFormat.TraditionalOpenSSL, serialization.NoEncryption()) # Print the test case data in the format used by *ring* test files. print 'Digest = %s' % case['SHAAlg'] print 'Key = %s' % to_hex(der) print 'Msg = %s' % reformat_hex(case['Msg']) if padding_alg == "PSS": print 'Salt = %s' % reformat_hex(case['SaltVal']) print 'Sig = %s' % reformat_hex(case['S']) print 'Result = Pass' print '' def print_verify_test(case, n, e): # Create a private key instance. pub = rsa.RSAPublicNumbers(e, n) key = pub.public_key(default_backend()) der = key.public_bytes(serialization.Encoding.DER, serialization.PublicFormat.PKCS1) # Print the test case data in the format used by *ring* test files. print 'Digest = %s' % case['SHAAlg'] print 'Key = %s' % to_hex(der) print 'Msg = %s' % reformat_hex(case['Msg']) print 'Sig = %s' % reformat_hex(case['S']) print 'Result = %s' % case['Result'] print '' def main(fn, test_type, padding_alg): input_file_digest = hashlib.sha384(open(fn, 'rb').read()).hexdigest() # File header print "# RSA %(padding_alg)s Test Vectors for FIPS 186-4 from %(fn)s in" % \ { "fn": fn, "padding_alg": padding_alg } print "# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip" print "# accessible from" print "# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors" print "# with SHA-384 digest %s" % (input_file_digest) print "# filtered and reformatted using util/generate-rsa-signing-tests.py." print "#" print "# Digest = SHAAlg." if test_type == "verify": print "# Key is (n, e) encoded in an ASN.1 (DER) sequence." elif test_type == "sign": print "# Key is an ASN.1 (DER) RSAPrivateKey." else: print "Invalid test_type: %s" % test_type quit() print "# Sig = S." print num_cases = 0 # Each test type has a different field as the last entry per case # For verify tests,PKCS "Result" is always the last field. # Otherwise, for signing tests, it is dependent on the padding used. if test_type == "verify": last_field = "Result" else: if padding_alg == "PSS": last_field = "SaltVal" else: last_field = "S" for case in parse(fn, last_field): if case['SHAAlg'] == 'SHA224': # SHA224 not supported in *ring*. debug("Skipping due to use of SHA224", DEBUG) continue if padding_alg == "PSS": if case['SHAAlg'] == 'SHA1': # SHA-1 with PSS not supported in *ring*. debug("Skipping due to use of SHA1 and PSS.", DEBUG) continue # *ring* only supports PSS where the salt length is equal to the # output length of the hash algorithm. if len(case['SaltVal']) * 2 != DIGEST_OUTPUT_LENGTHS[case['SHAAlg']]: debug("Skipping due to unsupported salt length.", DEBUG) continue # Read private key components. n = int(case['n'], 16) e = int(case['e'], 16) d = int(case['d'], 16) if n.bit_length() // 8 < 2048 // 8: debug("Skipping due to modulus length (too small).", DEBUG) continue if test_type == 'sign': if n.bit_length() > 4096: debug("Skipping due to modulus length (too large).", DEBUG) continue print_sign_test(case, n, e, d, padding_alg) else: print_verify_test(case, n, e) num_cases += 1 debug("%d test cases output." % num_cases, True) if __name__ == '__main__': if len(sys.argv) != 2: print "Usage:\n python %s " % sys.argv[0] else: fn = sys.argv[1] if 'PSS' in fn: pad_alg = 'PSS' elif '15' in fn: pad_alg = 'PKCS#1 1.5' else: print "Could not determine padding algorithm," quit() if 'Gen' in fn: test_type = 'sign' elif 'Ver' in fn: test_type = 'verify' else: print "Could not determine test type." quit() main(sys.argv[1], test_type, pad_alg) ring-0.16.9/src/rsa/padding.rs000064400000000000000000000465231353111575600143050ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN; use crate::{bits, digest, error, io::der}; use untrusted; #[cfg(feature = "alloc")] use crate::rand; /// Common features of both RSA padding encoding and RSA padding verification. pub trait Padding: 'static + Sync + crate::sealed::Sealed + core::fmt::Debug { // The digest algorithm used for digesting the message (and maybe for // other things). fn digest_alg(&self) -> &'static digest::Algorithm; } /// An RSA signature encoding as described in [RFC 3447 Section 8]. /// /// [RFC 3447 Section 8]: https://tools.ietf.org/html/rfc3447#section-8 #[cfg(feature = "alloc")] pub trait RsaEncoding: Padding { #[doc(hidden)] fn encode( &self, m_hash: &digest::Digest, m_out: &mut [u8], mod_bits: bits::BitLength, rng: &dyn rand::SecureRandom, ) -> Result<(), error::Unspecified>; } /// Verification of an RSA signature encoding as described in /// [RFC 3447 Section 8]. /// /// [RFC 3447 Section 8]: https://tools.ietf.org/html/rfc3447#section-8 pub trait Verification: Padding { fn verify( &self, m_hash: &digest::Digest, m: &mut untrusted::Reader, mod_bits: bits::BitLength, ) -> Result<(), error::Unspecified>; } /// PKCS#1 1.5 padding as described in [RFC 3447 Section 8.2]. /// /// See "`RSA_PSS_*` Details\" in `ring::signature`'s module-level /// documentation for more details. /// /// [RFC 3447 Section 8.2]: https://tools.ietf.org/html/rfc3447#section-8.2 #[derive(Debug)] pub struct PKCS1 { digest_alg: &'static digest::Algorithm, digestinfo_prefix: &'static [u8], } impl crate::sealed::Sealed for PKCS1 {} impl Padding for PKCS1 { fn digest_alg(&self) -> &'static digest::Algorithm { self.digest_alg } } #[cfg(feature = "alloc")] impl RsaEncoding for PKCS1 { fn encode( &self, m_hash: &digest::Digest, m_out: &mut [u8], _mod_bits: bits::BitLength, _rng: &dyn rand::SecureRandom, ) -> Result<(), error::Unspecified> { pkcs1_encode(&self, m_hash, m_out); Ok(()) } } impl Verification for PKCS1 { fn verify( &self, m_hash: &digest::Digest, m: &mut untrusted::Reader, mod_bits: bits::BitLength, ) -> Result<(), error::Unspecified> { // `mod_bits.as_usize_bytes_rounded_up() <= // PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN` is ensured by `verify_rsa_()`. let mut calculated = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; let calculated = &mut calculated[..mod_bits.as_usize_bytes_rounded_up()]; pkcs1_encode(&self, m_hash, calculated); if m.read_bytes_to_end() != *calculated.as_ref() { return Err(error::Unspecified); } Ok(()) } } // Implement padding procedure per EMSA-PKCS1-v1_5, // https://tools.ietf.org/html/rfc3447#section-9.2. This is used by both // verification and signing so it needs to be able to handle moduli of the // minimum and maximum sizes for both operations. fn pkcs1_encode(pkcs1: &PKCS1, m_hash: &digest::Digest, m_out: &mut [u8]) { let em = m_out; let digest_len = pkcs1.digestinfo_prefix.len() + pkcs1.digest_alg.output_len; // The specification requires at least 8 bytes of padding. Since we // disallow keys smaller than 2048 bits, this should always be true. assert!(em.len() >= digest_len + 11); let pad_len = em.len() - digest_len - 3; em[0] = 0; em[1] = 1; for i in 0..pad_len { em[2 + i] = 0xff; } em[2 + pad_len] = 0; let (digest_prefix, digest_dst) = em[3 + pad_len..].split_at_mut(pkcs1.digestinfo_prefix.len()); digest_prefix.copy_from_slice(pkcs1.digestinfo_prefix); digest_dst.copy_from_slice(m_hash.as_ref()); } macro_rules! rsa_pkcs1_padding { ( $PADDING_ALGORITHM:ident, $digest_alg:expr, $digestinfo_prefix:expr, $doc_str:expr ) => { #[doc=$doc_str] pub static $PADDING_ALGORITHM: PKCS1 = PKCS1 { digest_alg: $digest_alg, digestinfo_prefix: $digestinfo_prefix, }; }; } rsa_pkcs1_padding!( RSA_PKCS1_SHA1_FOR_LEGACY_USE_ONLY, &digest::SHA1_FOR_LEGACY_USE_ONLY, &SHA1_PKCS1_DIGESTINFO_PREFIX, "PKCS#1 1.5 padding using SHA-1 for RSA signatures." ); rsa_pkcs1_padding!( RSA_PKCS1_SHA256, &digest::SHA256, &SHA256_PKCS1_DIGESTINFO_PREFIX, "PKCS#1 1.5 padding using SHA-256 for RSA signatures." ); rsa_pkcs1_padding!( RSA_PKCS1_SHA384, &digest::SHA384, &SHA384_PKCS1_DIGESTINFO_PREFIX, "PKCS#1 1.5 padding using SHA-384 for RSA signatures." ); rsa_pkcs1_padding!( RSA_PKCS1_SHA512, &digest::SHA512, &SHA512_PKCS1_DIGESTINFO_PREFIX, "PKCS#1 1.5 padding using SHA-512 for RSA signatures." ); macro_rules! pkcs1_digestinfo_prefix { ( $name:ident, $digest_len:expr, $digest_oid_len:expr, [ $( $digest_oid:expr ),* ] ) => { static $name: [u8; 2 + 8 + $digest_oid_len] = [ der::Tag::Sequence as u8, 8 + $digest_oid_len + $digest_len, der::Tag::Sequence as u8, 2 + $digest_oid_len + 2, der::Tag::OID as u8, $digest_oid_len, $( $digest_oid ),*, der::Tag::Null as u8, 0, der::Tag::OctetString as u8, $digest_len, ]; } } pkcs1_digestinfo_prefix!( SHA1_PKCS1_DIGESTINFO_PREFIX, 20, 5, [0x2b, 0x0e, 0x03, 0x02, 0x1a] ); pkcs1_digestinfo_prefix!( SHA256_PKCS1_DIGESTINFO_PREFIX, 32, 9, [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] ); pkcs1_digestinfo_prefix!( SHA384_PKCS1_DIGESTINFO_PREFIX, 48, 9, [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02] ); pkcs1_digestinfo_prefix!( SHA512_PKCS1_DIGESTINFO_PREFIX, 64, 9, [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] ); /// RSA PSS padding as described in [RFC 3447 Section 8.1]. /// /// See "`RSA_PSS_*` Details\" in `ring::signature`'s module-level /// documentation for more details. /// /// [RFC 3447 Section 8.1]: https://tools.ietf.org/html/rfc3447#section-8.1 #[derive(Debug)] pub struct PSS { digest_alg: &'static digest::Algorithm, } impl crate::sealed::Sealed for PSS {} // Maximum supported length of the salt in bytes. // In practice, this is constrained by the maximum digest length. const MAX_SALT_LEN: usize = digest::MAX_OUTPUT_LEN; impl Padding for PSS { fn digest_alg(&self) -> &'static digest::Algorithm { self.digest_alg } } impl RsaEncoding for PSS { // Implement padding procedure per EMSA-PSS, // https://tools.ietf.org/html/rfc3447#section-9.1. fn encode( &self, m_hash: &digest::Digest, m_out: &mut [u8], mod_bits: bits::BitLength, rng: &dyn rand::SecureRandom, ) -> Result<(), error::Unspecified> { let metrics = PSSMetrics::new(self.digest_alg, mod_bits)?; // The `m_out` this function fills is the big-endian-encoded value of `m` // from the specification, padded to `k` bytes, where `k` is the length // in bytes of the public modulus. The spec says "Note that emLen will // be one less than k if modBits - 1 is divisible by 8 and equal to k // otherwise." In other words we might need to prefix `em` with a // leading zero byte to form a correct value of `m`. let em = if metrics.top_byte_mask == 0xff { m_out[0] = 0; &mut m_out[1..] } else { m_out }; assert_eq!(em.len(), metrics.em_len); // Steps 1 and 2 are done by the caller to produce `m_hash`. // Step 3 is done by `PSSMetrics::new()` above. // Step 4. let mut salt = [0u8; MAX_SALT_LEN]; let salt = &mut salt[..metrics.s_len]; rng.fill(salt)?; // Step 5 and 6. let h_hash = pss_digest(self.digest_alg, m_hash, salt); // Re-order steps 7, 8, 9 and 10 so that we first output the db mask // into `em`, and then XOR the value of db. // Step 9. First output the mask into the out buffer. let (mut masked_db, digest_terminator) = em.split_at_mut(metrics.db_len); mgf1(self.digest_alg, h_hash.as_ref(), &mut masked_db)?; { // Steps 7. let masked_db = masked_db.into_iter(); // `PS` is all zero bytes, so skipping `ps_len` bytes is equivalent // to XORing `PS` onto `db`. let mut masked_db = masked_db.skip(metrics.ps_len); // Step 8. *(masked_db.next().ok_or(error::Unspecified)?) ^= 0x01; // Step 10. for (masked_db_b, salt_b) in masked_db.zip(salt) { *masked_db_b ^= *salt_b; } } // Step 11. masked_db[0] &= metrics.top_byte_mask; // Step 12. digest_terminator[..metrics.h_len].copy_from_slice(h_hash.as_ref()); digest_terminator[metrics.h_len] = 0xbc; Ok(()) } } impl Verification for PSS { // RSASSA-PSS-VERIFY from https://tools.ietf.org/html/rfc3447#section-8.1.2 // where steps 1, 2(a), and 2(b) have been done for us. fn verify( &self, m_hash: &digest::Digest, m: &mut untrusted::Reader, mod_bits: bits::BitLength, ) -> Result<(), error::Unspecified> { let metrics = PSSMetrics::new(self.digest_alg, mod_bits)?; // RSASSA-PSS-VERIFY Step 2(c). The `m` this function is given is the // big-endian-encoded value of `m` from the specification, padded to // `k` bytes, where `k` is the length in bytes of the public modulus. // The spec. says "Note that emLen will be one less than k if // modBits - 1 is divisible by 8 and equal to k otherwise," where `k` // is the length in octets of the RSA public modulus `n`. In other // words, `em` might have an extra leading zero byte that we need to // strip before we start the PSS decoding steps which is an artifact of // the `Verification` interface. if metrics.top_byte_mask == 0xff { if m.read_byte()? != 0 { return Err(error::Unspecified); } }; let em = m; // The rest of this function is EMSA-PSS-VERIFY from // https://tools.ietf.org/html/rfc3447#section-9.1.2. // Steps 1 and 2 are done by the caller to produce `m_hash`. // Step 3 is done by `PSSMetrics::new()` above. // Step 5, out of order. let masked_db = em.read_bytes(metrics.db_len)?; let h_hash = em.read_bytes(metrics.h_len)?; // Step 4. if em.read_byte()? != 0xbc { return Err(error::Unspecified); } // Step 7. let mut db = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; let db = &mut db[..metrics.db_len]; mgf1(self.digest_alg, h_hash.as_slice_less_safe(), db)?; masked_db.read_all(error::Unspecified, |masked_bytes| { // Step 6. Check the top bits of first byte are zero. let b = masked_bytes.read_byte()?; if b & !metrics.top_byte_mask != 0 { return Err(error::Unspecified); } db[0] ^= b; // Step 8. for i in 1..db.len() { db[i] ^= masked_bytes.read_byte()?; } Ok(()) })?; // Step 9. db[0] &= metrics.top_byte_mask; // Step 10. let ps_len = metrics.ps_len; for i in 0..ps_len { if db[i] != 0 { return Err(error::Unspecified); } } if db[metrics.ps_len] != 1 { return Err(error::Unspecified); } // Step 11. let salt = &db[(db.len() - metrics.s_len)..]; // Step 12 and 13. let h_prime = pss_digest(self.digest_alg, m_hash, salt); // Step 14. if h_hash != *h_prime.as_ref() { return Err(error::Unspecified); } Ok(()) } } struct PSSMetrics { #[cfg_attr(not(feature = "alloc"), allow(dead_code))] em_len: usize, db_len: usize, ps_len: usize, s_len: usize, h_len: usize, top_byte_mask: u8, } impl PSSMetrics { fn new( digest_alg: &'static digest::Algorithm, mod_bits: bits::BitLength, ) -> Result { let em_bits = mod_bits.try_sub_1()?; let em_len = em_bits.as_usize_bytes_rounded_up(); let leading_zero_bits = (8 * em_len) - em_bits.as_usize_bits(); debug_assert!(leading_zero_bits < 8); let top_byte_mask = 0xffu8 >> leading_zero_bits; let h_len = digest_alg.output_len; // We require the salt length to be equal to the digest length. let s_len = h_len; // Step 3 of both `EMSA-PSS-ENCODE` is `EMSA-PSS-VERIFY` requires that // we reject inputs where "emLen < hLen + sLen + 2". The definition of // `emBits` in RFC 3447 Sections 9.1.1 and 9.1.2 says `emBits` must be // "at least 8hLen + 8sLen + 9". Since 9 bits requires two bytes, these // two conditions are equivalent. 9 bits are required as the 0x01 // before the salt requires 1 bit and the 0xbc after the digest // requires 8 bits. let db_len = em_len.checked_sub(1 + s_len).ok_or(error::Unspecified)?; let ps_len = db_len.checked_sub(h_len + 1).ok_or(error::Unspecified)?; debug_assert!(em_bits.as_usize_bits() >= (8 * h_len) + (8 * s_len) + 9); Ok(PSSMetrics { em_len, db_len, ps_len, s_len, h_len, top_byte_mask, }) } } // Mask-generating function MGF1 as described in // https://tools.ietf.org/html/rfc3447#appendix-B.2.1. fn mgf1( digest_alg: &'static digest::Algorithm, seed: &[u8], mask: &mut [u8], ) -> Result<(), error::Unspecified> { let digest_len = digest_alg.output_len; // Maximum counter value is the value of (mask_len / digest_len) rounded up. let ctr_max = (mask.len() - 1) / digest_len; assert!(ctr_max <= u32::max_value() as usize); for (i, mask_chunk) in mask.chunks_mut(digest_len).enumerate() { let mut ctx = digest::Context::new(digest_alg); ctx.update(seed); ctx.update(&u32::to_be_bytes(i as u32)); let digest = ctx.finish(); let mask_chunk_len = mask_chunk.len(); mask_chunk.copy_from_slice(&digest.as_ref()[..mask_chunk_len]); } Ok(()) } fn pss_digest( digest_alg: &'static digest::Algorithm, m_hash: &digest::Digest, salt: &[u8], ) -> digest::Digest { // Fixed prefix. const PREFIX_ZEROS: [u8; 8] = [0u8; 8]; // Encoding step 5 and 6, Verification step 12 and 13. let mut ctx = digest::Context::new(digest_alg); ctx.update(&PREFIX_ZEROS); ctx.update(m_hash.as_ref()); ctx.update(salt); ctx.finish() } macro_rules! rsa_pss_padding { ( $PADDING_ALGORITHM:ident, $digest_alg:expr, $doc_str:expr ) => { #[doc=$doc_str] pub static $PADDING_ALGORITHM: PSS = PSS { digest_alg: $digest_alg, }; }; } rsa_pss_padding!( RSA_PSS_SHA256, &digest::SHA256, "RSA PSS padding using SHA-256 for RSA signatures.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_pss_padding!( RSA_PSS_SHA384, &digest::SHA384, "RSA PSS padding using SHA-384 for RSA signatures.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_pss_padding!( RSA_PSS_SHA512, &digest::SHA512, "RSA PSS padding using SHA-512 for RSA signatures.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); #[cfg(test)] mod test { use super::*; use crate::{digest, error, test}; use alloc::vec; use untrusted; #[test] fn test_pss_padding_verify() { test::run( test_file!("rsa_pss_padding_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA256" => &RSA_PSS_SHA256, "SHA384" => &RSA_PSS_SHA384, "SHA512" => &RSA_PSS_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let msg = test_case.consume_bytes("Msg"); let msg = untrusted::Input::from(&msg); let m_hash = digest::digest(alg.digest_alg(), msg.as_slice_less_safe()); let encoded = test_case.consume_bytes("EM"); let encoded = untrusted::Input::from(&encoded); // Salt is recomputed in verification algorithm. let _ = test_case.consume_bytes("Salt"); let bit_len = test_case.consume_usize_bits("Len"); let is_valid = test_case.consume_string("Result") == "P"; let actual_result = encoded.read_all(error::Unspecified, |m| alg.verify(&m_hash, m, bit_len)); assert_eq!(actual_result.is_ok(), is_valid); Ok(()) }, ); } // Tests PSS encoding for various public modulus lengths. #[cfg(feature = "alloc")] #[test] fn test_pss_padding_encode() { test::run( test_file!("rsa_pss_padding_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA256" => &RSA_PSS_SHA256, "SHA384" => &RSA_PSS_SHA384, "SHA512" => &RSA_PSS_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let msg = test_case.consume_bytes("Msg"); let salt = test_case.consume_bytes("Salt"); let encoded = test_case.consume_bytes("EM"); let bit_len = test_case.consume_usize_bits("Len"); let expected_result = test_case.consume_string("Result"); // Only test the valid outputs if expected_result != "P" { return Ok(()); } let rng = test::rand::FixedSliceRandom { bytes: &salt }; let mut m_out = vec![0u8; bit_len.as_usize_bytes_rounded_up()]; let digest = digest::digest(alg.digest_alg(), &msg); alg.encode(&digest, &mut m_out, bit_len, &rng).unwrap(); assert_eq!(m_out, encoded); Ok(()) }, ); } } ring-0.16.9/src/rsa/rsa_pss_padding_tests.txt000064400000000000000000003462041352331573000174460ustar0000000000000000# Test vectors for RSA-PSS padding verification # Including multiple modulus lengths and failing verification cases. # # Digest = SHAAlg. # Len gives the public modulus length in bits. # # The salt is the fixed byte string 0xf0 repeated to be the same length as the # hash digest. # Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdcd65de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a9c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 2048 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44949d4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3405a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 2048 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b34204ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429f9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 2048 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe3eafa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea40a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 2048 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdcd65de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a9c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 2049 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44949d4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3405a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 2049 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2049 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b34204ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429f9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 2049 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe3eafa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea40a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 2049 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2055 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 2055 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 2055 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2055 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 2055 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 2055 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2056 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 2056 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 2056 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2056 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 2056 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 2056 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2057 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 2057 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 2057 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2057 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 2057 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 2057 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4095 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 4095 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 4095 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 4095 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 4095 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4096 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 4096 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 4096 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 4096 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 4096 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4097 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4097 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 4097 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 4097 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 4097 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 4097 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af99c2c2899e7d15d877590501644aa863c20b392e72bdc330ad192147ef171516d815c02fe0e375317b76c9df2052bd2de1b116192785b2282119f875dd89ffaf5a5c36f0524b3a4376f0381184591473a7c131d5f58bbb00b921030a96f260ee78cf1c2c25337e69b4cc42fcbd85034bd41f2c62e990fdd298fd53b453a4232b61426ac0764a5d6b8c45fb1d3004e27a1afc5ed38cf2ec4ab70521e6af5c1a2cf22306c523f87100c140525862efdd2d7eec690f34ad9a3c96c946472e622f830bf21b0c1d0690ebf6c8c98e0595e67b277d9ff43ed93ab568cab9684829f9392ab9eca7dacd191b7f263997bf5a03d4eb5115e84afcb92609554cd14ab304d912c8e9e201350a9460955edba75ba18ba4b5ef91d67950102ebc48432320ab90142fb25dd9decd6d5747255cb1fd7320f2297306c2282286338ab64b060dc0bdfd2271bbd0382d69d38988731bc80b6438a063b8d1af71c2153719a8d8dee2eebf85605a5bfcbc2d364ff291796b7c13506a33fc05dafd939ba9c700a7335cef47b0ced0bcf02722ba17821f144752ac92dda4134b0091b43141a35c53bdc896b4de809337d64caf0e9af200284f88d0f1318903a75df0d1d27f879d9b743a6eeaa9c167ef9cee9a7d0e67bf61872ce528663e4699b54231e6fc12ad41c45518aa53c24fe0cb97fe0d98c696561568d844e64a401ad70db439c978d3f1819f67e017901a307ad26556708f4e62217ab6f4575a0d4800259ea8590e3aa718ac0523330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 8191 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daf2fcd0a705e6c9d89e611f26d84980633932951432c8df1b79864441a79cd0829dbd382794c4f77b6f8677cba13fc98fad99057289cf906d7ae2abed25e6fb4d555ebb86a5252e50eb6659ef7b7f2e1bff9a7d3910f1b0521c8108688003408bcc4aaa75c7efb27817c55fe1640fea83cbadc4e3f2a13cc56d0a544b84a7a50a34399f3d964d7ea0e9ea80001d6fd36a1516a5bca75bd83be639453a4b59cfcddebfda1e3022ece95efdc82b253c0b64b54c504f83f5cf375a1767e90eb68fe7cb93a43532c3db7e8c6446e6ac94a47e420e70531e62be6e99509ff0ba6040e39c2acb5c9d3a8c6dd92cc56962e495a1d3b67b896527902a9dd956b9e47a67b5461515b6c1211e17d05e69a7d866ed7839efab26089569867ba9736bfdba5fb8517af81410c15f1da525cb58ff8c005345a4cb42e555c8ecadb4d0f345b9afdff4fc60d810ee665327eaac60443c4ae1dc5704f8d7059630100b5ddecdaad5f114caac6a8a580ac9b7bad82195cd9561d3d4f81827f3776650c2a3f0c573c955bde7367b665d0a5a8ebd646cc230db4b4c904e6006b0a2e6546b932cbcd84a7d4ab0b2761ece96606fee0ca5fb1ed47f7a3956778bdeba4f065595b68e9e54e4c10650bf1eb23147e5ce5028a1f363f2cc17dfadf7e3bd33db5b31904ea67ba9107e83061a154fb455a6b3790228ecadf1ab3623e374e1b46b4eb4571d6bbe1632e20c4ab7a601860e662b8b23eaf5690b519c4d052f464bf886fa4d92ae6b179e7782914ffb6b31271e7e06382d59da1c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 8191 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8191 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25147b6b5e13ae397db234eda654fe00a839c14e13d1d725fe54a7fa3b02c6068073f7576e8b01d53f54d1287f4105ffd9d6097bed8537b9a0f97bdda2b2393a983f08fbea11ccaa7656c9347b51cb30f4f6fc22f6667309f458b8db00c9a26d733cc75465a59122e34a66d1331ffd6935f028cd2a726a5d99011b9e1806afde624bb789eb934ff2154e0c52ed22002ca86c6ab46e166923e9b91119bf1cfa7635f4053a7369adfd53df69625e6e816bb8c60cd000e4ecb5b2e40a8251ec828efca270108bde76c652e4cc3ee7e1c4dcff37a9e172c1f58f5dcb0e36c76ebc1222afbf7c4bcaf43f683e6619079a3baed0860b5ba587e7fa78f0f01c108506ffc051b4dd61e2cc0ee06093e8abb100151d37a42727001bf53186aa88d7e7cb1bb64de05bf66fb2da084740c752cb967c7b2fa15bc94a4162d3060dc074aa5f02be6b8662db73894823bb341783bb77769627347dbf481dc898a80d74a66410280c82e54b0192d45ccfa67421a9c1e23c0cd3714dc4114aa8e75ead05cf0e1521f598878ead0553d1f0924032c8ec8b62d3bea3f65286351d00c550bf22bfbdbf3f02580414ca4f97dc6d788431c9a18d56c111bf85a4fa26875fc0b4545ebb7247d8ef78f42ce715f5868602c560b77d9e51981cde571b3f53b2675c4dae28f55839106919383800a585e1d10a396f96349621957ab95fe4280ea6fcc57182e5898d67a37c85c771ce3c1eef72da0dee37dedf8f7ed741d3bad59b09bbb30defcc29484d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 8191 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccde518b2d5fe45ac4ae81dea8c450dff8518b5b3bf5433ac7cd244585f312eef802b661c5920a549aae089c437310391019d17390ea03deb9e22be790287b3901e3e91c6ec32e00906d6475e8d5d3db229bae7321a36b5b0fc2d15a12bf63b4671029e9d9e15577aa89e6118d878f320b165e7a4a3daac770f6ee78b091644c8b542de73ca5556448b59f7c3b8653c0d9749b28e7b22dae2a788c5af003ddf5b5515413e40eb3b67f52fea4779f570585ecc0b8b535df5ce4d8db38647ec1974703e618ce52bfec5cbbea94cb8d17242f8ac9c34d209f477159d47be654a6045bba3a7ad572c1bcf3fa1ddd80dc9c98b3a2ce01dd50ae41814faa0996779e8204e3d6e36f949c5609e1a3875aa4cb00ee6f9a6a7d342feef53208ebd8167ed45c1d4720d2d781c946424b053eca7a814b6fed8dacc61c29aeaefef0f653a85324ef48b371d8873f3445bbac0833c8f5abf7aa8f4cae39567d2c902145b1c7ece8b6f0ee2ebbe6b3e571e95cc1230468e905cc2f5eb768236fa82bdffa1d9fe5d49527851ec30995559c9b60f28e8b19c1d6f69c47d782fb8a13136eed564f59aae0a0dfbb66128d83208d073adb6442de7498bd747e18214683f62b06547fa77520482d6b7e046db5dcc9a10809e8b3248e8a033ce1a8e71589c90bcd2d449f890936f8906f32b9f656056c9414c836565fc1fe8251bca7be8975ac305739569ef80df15059b408750be12ea42878ae8f617d378a6d3874ea92c700ea1b805665e1b673bdbb9dc1e2b67959d9c44d3f3fa9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 8191 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d027cdd9e09bfdf380d39fba15ab1cecbfcef8a78f7f7dff2a50e6413005957275835828daafcd88d091b2fe8bda117d614c3b9d5431701e9d7db071fcc232c1a4182c4dfdd233c1fb1fe6522801019ad037357139d3bba905facfd8f0314d8e4ed919972f735729bf98eb1b39483fa7d179e4b470e68868c32cefb1aed52fa4ab650d60c6655c7a8a10f82f2a427a8c3524a76318565df250027986e89f1cc18e3fc13fc32b03bfebf777aaf0155579f99befb56d043df8a99d7d7570b8af5d3c8812d3e5c9f452e894ff8686dd3a0c6849e1f24ab049497bd69ce08c9c291783f3bf3070819fcdb265aa1b40cb182782ed14f3061efca5e8da124ad48486498cfc7eaff9d2617ee1fae45b5d37d7472cf7c93d561e9208270a01adf7d3dfccb1a70fad3155c41b7f8be37b5f2d4bd3d1476f3ee11de31244ded7bf0fd85e941a50d1f28ff198bf188b7ea1bc9da2d968b519667203418d6005b3c84c13027346db4099968106a2540197f8cd87eed4eb969911707bf29160ed9178d876b284f9004d35bbb0f5ea939532fb29a2db4a052fc06e76fa7f031489fa32e25fb03fe01c7840fc01b741f4e1c2b08030222e6b59951c233354e0fa57321481e5204c792923f4b34d9521bbbad3dd2ea96debb8638dd1049b92a3356e0b4530d71bc22611ad7ee3cbd17ad425c9c17a0957c95ef8ff04832fa44993d273e927ed5e56dcef1c133f6cb57aab63eff0a420db877d424add66924efd59b9584cfa1515a8b393bfd205ecaddf4196d9a16639669b016a90ab349b65ac733112103b6610458a1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 8191 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af99c2c2899e7d15d877590501644aa863c20b392e72bdc330ad192147ef171516d815c02fe0e375317b76c9df2052bd2de1b116192785b2282119f875dd89ffaf5a5c36f0524b3a4376f0381184591473a7c131d5f58bbb00b921030a96f260ee78cf1c2c25337e69b4cc42fcbd85034bd41f2c62e990fdd298fd53b453a4232b61426ac0764a5d6b8c45fb1d3004e27a1afc5ed38cf2ec4ab70521e6af5c1a2cf22306c523f87100c140525862efdd2d7eec690f34ad9a3c96c946472e622f830bf21b0c1d0690ebf6c8c98e0595e67b277d9ff43ed93ab568cab9684829f9392ab9eca7dacd191b7f263997bf5a03d4eb5115e84afcb92609554cd14ab304d912c8e9e201350a9460955edba75ba18ba4b5ef91d67950102ebc48432320ab90142fb25dd9decd6d5747255cb1fd7320f2297306c2282286338ab64b060dc0bdfd2271bbd0382d69d38988731bc80b6438a063b8d1af71c2153719a8d8dee2eebf85605a5bfcbc2d364ff291796b7c13506a33fc05dafd939ba9c700a7335cef47b0ced0bcf02722ba17821f144752ac92dda4134b0091b43141a35c53bdc896b4de809337d64caf0e9af200284f88d0f1318903a75df0d1d27f879d9b743a6eeaa9c167ef9cee9a7d0e67bf61872ce528663e4699b54231e6fc12ad41c45518aa53c24fe0cb97fe0d98c696561568d844e64a401ad70db439c978d3f1819f67e017901a307ad26556708f4e62217ab6f4575a0d4800259ea8590e3aa718ac0523330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 8192 Result = P Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daf2fcd0a705e6c9d89e611f26d84980633932951432c8df1b79864441a79cd0829dbd382794c4f77b6f8677cba13fc98fad99057289cf906d7ae2abed25e6fb4d555ebb86a5252e50eb6659ef7b7f2e1bff9a7d3910f1b0521c8108688003408bcc4aaa75c7efb27817c55fe1640fea83cbadc4e3f2a13cc56d0a544b84a7a50a34399f3d964d7ea0e9ea80001d6fd36a1516a5bca75bd83be639453a4b59cfcddebfda1e3022ece95efdc82b253c0b64b54c504f83f5cf375a1767e90eb68fe7cb93a43532c3db7e8c6446e6ac94a47e420e70531e62be6e99509ff0ba6040e39c2acb5c9d3a8c6dd92cc56962e495a1d3b67b896527902a9dd956b9e47a67b5461515b6c1211e17d05e69a7d866ed7839efab26089569867ba9736bfdba5fb8517af81410c15f1da525cb58ff8c005345a4cb42e555c8ecadb4d0f345b9afdff4fc60d810ee665327eaac60443c4ae1dc5704f8d7059630100b5ddecdaad5f114caac6a8a580ac9b7bad82195cd9561d3d4f81827f3776650c2a3f0c573c955bde7367b665d0a5a8ebd646cc230db4b4c904e6006b0a2e6546b932cbcd84a7d4ab0b2761ece96606fee0ca5fb1ed47f7a3956778bdeba4f065595b68e9e54e4c10650bf1eb23147e5ce5028a1f363f2cc17dfadf7e3bd33db5b31904ea67ba9107e83061a154fb455a6b3790228ecadf1ab3623e374e1b46b4eb4571d6bbe1632e20c4ab7a601860e662b8b23eaf5690b519c4d052f464bf886fa4d92ae6b179e7782914ffb6b31271e7e06382d59da1c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 8192 Result = P Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = P Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25147b6b5e13ae397db234eda654fe00a839c14e13d1d725fe54a7fa3b02c6068073f7576e8b01d53f54d1287f4105ffd9d6097bed8537b9a0f97bdda2b2393a983f08fbea11ccaa7656c9347b51cb30f4f6fc22f6667309f458b8db00c9a26d733cc75465a59122e34a66d1331ffd6935f028cd2a726a5d99011b9e1806afde624bb789eb934ff2154e0c52ed22002ca86c6ab46e166923e9b91119bf1cfa7635f4053a7369adfd53df69625e6e816bb8c60cd000e4ecb5b2e40a8251ec828efca270108bde76c652e4cc3ee7e1c4dcff37a9e172c1f58f5dcb0e36c76ebc1222afbf7c4bcaf43f683e6619079a3baed0860b5ba587e7fa78f0f01c108506ffc051b4dd61e2cc0ee06093e8abb100151d37a42727001bf53186aa88d7e7cb1bb64de05bf66fb2da084740c752cb967c7b2fa15bc94a4162d3060dc074aa5f02be6b8662db73894823bb341783bb77769627347dbf481dc898a80d74a66410280c82e54b0192d45ccfa67421a9c1e23c0cd3714dc4114aa8e75ead05cf0e1521f598878ead0553d1f0924032c8ec8b62d3bea3f65286351d00c550bf22bfbdbf3f02580414ca4f97dc6d788431c9a18d56c111bf85a4fa26875fc0b4545ebb7247d8ef78f42ce715f5868602c560b77d9e51981cde571b3f53b2675c4dae28f55839106919383800a585e1d10a396f96349621957ab95fe4280ea6fcc57182e5898d67a37c85c771ce3c1eef72da0dee37dedf8f7ed741d3bad59b09bbb30defcc29484d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 8192 Result = P Digest = SHA384 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccde518b2d5fe45ac4ae81dea8c450dff8518b5b3bf5433ac7cd244585f312eef802b661c5920a549aae089c437310391019d17390ea03deb9e22be790287b3901e3e91c6ec32e00906d6475e8d5d3db229bae7321a36b5b0fc2d15a12bf63b4671029e9d9e15577aa89e6118d878f320b165e7a4a3daac770f6ee78b091644c8b542de73ca5556448b59f7c3b8653c0d9749b28e7b22dae2a788c5af003ddf5b5515413e40eb3b67f52fea4779f570585ecc0b8b535df5ce4d8db38647ec1974703e618ce52bfec5cbbea94cb8d17242f8ac9c34d209f477159d47be654a6045bba3a7ad572c1bcf3fa1ddd80dc9c98b3a2ce01dd50ae41814faa0996779e8204e3d6e36f949c5609e1a3875aa4cb00ee6f9a6a7d342feef53208ebd8167ed45c1d4720d2d781c946424b053eca7a814b6fed8dacc61c29aeaefef0f653a85324ef48b371d8873f3445bbac0833c8f5abf7aa8f4cae39567d2c902145b1c7ece8b6f0ee2ebbe6b3e571e95cc1230468e905cc2f5eb768236fa82bdffa1d9fe5d49527851ec30995559c9b60f28e8b19c1d6f69c47d782fb8a13136eed564f59aae0a0dfbb66128d83208d073adb6442de7498bd747e18214683f62b06547fa77520482d6b7e046db5dcc9a10809e8b3248e8a033ce1a8e71589c90bcd2d449f890936f8906f32b9f656056c9414c836565fc1fe8251bca7be8975ac305739569ef80df15059b408750be12ea42878ae8f617d378a6d3874ea92c700ea1b805665e1b673bdbb9dc1e2b67959d9c44d3f3fa9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc Len = 8192 Result = P Digest = SHA512 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d027cdd9e09bfdf380d39fba15ab1cecbfcef8a78f7f7dff2a50e6413005957275835828daafcd88d091b2fe8bda117d614c3b9d5431701e9d7db071fcc232c1a4182c4dfdd233c1fb1fe6522801019ad037357139d3bba905facfd8f0314d8e4ed919972f735729bf98eb1b39483fa7d179e4b470e68868c32cefb1aed52fa4ab650d60c6655c7a8a10f82f2a427a8c3524a76318565df250027986e89f1cc18e3fc13fc32b03bfebf777aaf0155579f99befb56d043df8a99d7d7570b8af5d3c8812d3e5c9f452e894ff8686dd3a0c6849e1f24ab049497bd69ce08c9c291783f3bf3070819fcdb265aa1b40cb182782ed14f3061efca5e8da124ad48486498cfc7eaff9d2617ee1fae45b5d37d7472cf7c93d561e9208270a01adf7d3dfccb1a70fad3155c41b7f8be37b5f2d4bd3d1476f3ee11de31244ded7bf0fd85e941a50d1f28ff198bf188b7ea1bc9da2d968b519667203418d6005b3c84c13027346db4099968106a2540197f8cd87eed4eb969911707bf29160ed9178d876b284f9004d35bbb0f5ea939532fb29a2db4a052fc06e76fa7f031489fa32e25fb03fe01c7840fc01b741f4e1c2b08030222e6b59951c233354e0fa57321481e5204c792923f4b34d9521bbbad3dd2ea96debb8638dd1049b92a3356e0b4530d71bc22611ad7ee3cbd17ad425c9c17a0957c95ef8ff04832fa44993d273e927ed5e56dcef1c133f6cb57aab63eff0a420db877d424add66924efd59b9584cfa1515a8b393bfd205ecaddf4196d9a16639669b016a90ab349b65ac733112103b6610458a1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc Len = 8192 Result = P Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 Len = 2048 Result = F (Incorrect last byte) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = dce55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = F (Incorrect top bits) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = F (First byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef96b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = F (Last byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86a2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = F (Byte following PS is not 0x01) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86bdf18199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2048 Result = F (Incorrect salt) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 4d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc Len = 2048 Result = F (Incorrect message hash) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef525300 Len = 2048 Result = F (Incorrect last byte) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = f45546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = F (Incorrect top bits) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5446c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = F (First byte of PS is not zero) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb944514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = F (Last byte of PS is not zero) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = F (Byte following PS is not 0x01) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844ae4920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc Len = 2048 Result = F (Incorrect salt) Digest = SHA256 Msg = 546869732069732061206c6f6e676572207465737420737472696e672e Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 4d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc Len = 2048 Result = F (Incorrect message hash) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 Len = 2049 Result = F (Incorrect last byte) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (Missing leading zero byte) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0123e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (Incorrect leading byte) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (First byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef96b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (Last byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86a2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (Byte following PS is not 0x01) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86bdf18199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 2049 Result = F (Incorrect salt) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 00cd13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc Len = 2049 Result = F (Incorrect message hash) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 Len = 4095 Result = F (Incorrect last byte) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = dce55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = F (Incorrect top bits) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = F (First byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743ae983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = F (Last byte of PS is not zero) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af993232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = F (Byte following PS is not 0x01) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af98cd32796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc Len = 4095 Result = F (Incorrect salt) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 0d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb8f02cc31c2862b8ebebc039174c07c926240a6346c69abc75b005969775674a102f664b86f945ff2854879087d364f3117a276492dee29b317249180bd8cb9b6f10aefc6d5b0a09f278fc85f82055a45ebf2b67f75dfb913f72317ff2b1ef96edfce03fbe2e4ffa06078e9546a7f603b8af643be504b537309cfa93a0a1a0aa6352d84f955999b8f275249126a1d5239d043b6208355be3ab515c525ff9f37232f1ef4bc87ef807c7e6f9b80c58a190b2d80cbca97b380708f2902477663a0ebc751fdf4e6fb12a581a271cd8c1ac1b76460bc6618467ff770835bdd2aae4aa5e7438ba762d6b6204b0bcadc2b9b6737aa73befbb09673f0b647365c3ee3fc8aa3612c702d923d93338ef2b692f2fbaed51fd04624f0005aae511853dd00312861b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc Len = 4095 Result = F (Incorrect message hash) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb565300 Len = 4096 Result = F (Incorrect last byte) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = ec7a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = F (Incorrect top bits) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137b60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = F (First byte of PS is not zero) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05caedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = F (Last byte of PS is not zero) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05dafdf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = F (Byte following PS is not 0x01) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05dae203dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc Len = 4096 Result = F (Incorrect salt) Digest = SHA384 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 5c7fa159e0a1850fe9e68ae0b5c7bf5463e4d9dee092853d51b8ddf33246548c4590ebe1032a5cf9a681b755d57d830dc8080189c8865a5262eea7d3b06d0aa6da2aca63ff513153ae49abd3bed5946ad823bf635fc4ae2d3b44e724b4ed7c5d414099b9bd0170259ca2a330b78de35091531a6701f8558590e5c02342ac082dbdbb8e766c45ff7b29bf5fc018af30967fbe694aedc85543a2aed12483a79b7b5e2e29bc2975cf3e766a62f24bd845d9388a2f9c34bbe716db0afd82f01603cd0b2ab94c0a48f8b583566d41fde7a5374bd048db0d63d9c03f5b2cf5e9f925c96b9fdf6f267e4121ed6ca72bd645bd41d443ffe6e729d069602344d02e3fccab3b9189511cfa0500e175715b9c4924f55d7b32482a396b36ad44a847b11564c2d3a1a0a48500d9784f3b7b6e2c63778f61bcf9afada5a35c1121f17f465477ef437b506e92b5cad3b95ed4683047003e0fffd2ecde0d0c89381b2a4e3b295084fd926db58f9b80261183725564b8d654f0302d5cfe8d9af0132ca11720f60a0d72db898c25d2784069a3c2d46c637371e96bcb3c53f15194c1318962fd4357d552fd14842615976aef266ed9637a33d90bbf3ab69595369a7065be90f0f24b21203de20cb30374b473919f8aca7b0c4544f976e720c05f87d02b4efa8871318da27238ad1b6414d83ad6499efe86071e6fe0b3c396d408593d60a2a524630bbc Len = 4096 Result = F (Incorrect message hash) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c300 Len = 8192 Result = F (Incorrect last byte) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = b75255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = F (Incorrect top bits) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485355700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = F (First byte of PS is not zero) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d32aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = F (Last byte of PS is not zero) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33afc6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = F (Byte following PS is not 0x01) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33ae39e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc Len = 8192 Result = F (Incorrect salt) Digest = SHA512 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 6ee75da53caedcd3b27c1e9b670651eb6d8ccf564da7c2a4b2e6e831f28256a21d44f347f0338cd778834586fb5a3d0e91cb1e9db444c294881614930b40af9502fc4c8667712ee46c7d89ae313949fad6fb1a11da6a71bb757786061cfbd24723d0114f02b58a4fbe00d43416d7870966919abbbfb9ac76b68fe7d1356f1a279c7054696a019c4d43bd75a67ab919f99980eef066991057787d5e1b328833f791350d29d4524478b4751facd1c0852d4e375a0df1a51e7a0915eb7fb046087039fdb5e8c67e5901ad688f3a0569debcfd177fa51882de254b8cb281bdd45475d02365cabcc7d4939d0507cb80fe042845e52853c1db12a73b7fe2ced4722679f074e6b9468431aeb06b88287412b93d729fd7c63babc4926f493a26aa0ee487e7754d92d8b6110dcdcc966a0fd4418b073ef461b1a338aa300b80d56b215635dcf4794d15eae0713da7a7cc74b9775edeea777065415be1cc55ad96b7d1badc5fc16414756faf69ebe7148f05e47ca6ceae4804167ef0bb876ed5cbeb81de01abf22cd419bdc14caa8c3829383988e2d7c54be3b9d64ccd584b6f0ed7fff83cf2039a457c0684f4e6f847b629465da61c3b8a7d711ebebc67214e2e4eda47847576a43a58b7f00cfc2efa207e7bca5930e3253bb520e8cbecd216336e2c62405de992da3797625a3bc79d9c2b28e908db98d543b794df1e9b58995669a044e46abb3a7b1fe231351014f6d9c4dac1f145f47661c3cab5330362406da10e3758f51195cb7d48fecc7026b0845e7d7695c87649e99d30bfc1dc36d7446a11eab59f70bafd5996435958abf656821c146e5fb86e371294c5432145eb0c20e0323e95c93130de92a189987710d4266d07c1298e97df863ce662e06c01afbb5b51d32546378d43993fde40474710c49656d4b0b596050498d5fc8a14b52acc34d69aefd1faf0a3f68d48d9162f6f0d1377b21b2ef5ae97513f1603d3d86293d5326fa1428c26a11df67349cf8bfdeb623047d6a84bdce4b58c6c03e69abed6342dc301d0d376447bb30df46afed76a3487b778928e814fbb0dcac7b94c4fd1f569e66d217818dbb45c481df1c3e2351d4d5ece2e3639ef82bf58880d4459ae118e7c2ff2f2107110ea7ea1bce4d19646d10c1eac9d44e9f8d316186086ab61d214f96ae68b7cd1f1eda9f05488e30b0e452767f4e7395b072d721f566873bdae6e45313ec3ec2d4bfb04be3095091e34d48e185ba1d46ee6b61195e2df9528cfb9247a1921ef83de4152cd60f5dc9f9eeae0efe47b566a26043ca8d3a5640fe6388aa84e1083c07cd1ec1555f528f1893cddc2a01f6da125f692fbc9c7a9832dc602de8b5dab65d8025994c0a871259654275ba3786ea3004a33ab12a42d995c71976b519adec222c75e1ab59daa4111e3ff21d8f4ccca6e15a4144669711854ccbc Len = 8192 Result = F (Incorrect message hash) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c Len = 256 Result = F (Invalid length) Digest = SHA256 Msg = "" Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0c Len = 512 Result = F (Invalid length) ring-0.16.9/src/rsa/signature_rsa_example_private_key.der000064400000000000000000000022501352331573000217700ustar00000000000000000Ψu2L4x'4ƣ,I^j'g<]^w *[P0zw*6o[2<9T[$qL2U^N$M0,bme/!Gım(n^9 #X/1LԿ3<6 <}D@q;5 [r)NAcrw؁>ƒZC&E cLG|Ddž+ pr_fpjZ- ['.VĤӈ]bUlkApZ5&"=F@5v> YʮF@|)VZ.5AdL^w)S^0aV=?II18bG n4wzlLKN]al97SU鍈4w;I؍1_.S[T c{㘣K dn 앱0P7+0 ,k] [l5JO! ʧ+O\6?2LUaAEKIo8 P%|A[82/8\<7E1ă0ΰ%\ >2bqy>#LԶ*v8Ul$SE߀!Qc&g1 =,ic hvxjz |ڵ* 3:2 ܈MM7Zh?s1G;Y`9dU>m=cgXsIn@"D׶y?0whh&UJ" $)DףQ:兇FǕc麷kC: \Ea=8oO.Kk`I-j_xb:nsc$i~ {-}}Ͷr5lf`ܗPhY$65>_jxsbI3mq=4P>*#y޲xQ?Z`@AkԲ]$Jj!ګZM?vawm!ޓ| 0j(nגb^Shtv3I5ьmo?Uring-0.16.9/src/rsa/signature_rsa_example_public_key.der000064400000000000000000000004161352331573000215760ustar00000000000000000 Ψu2L4x'4ƣ,I^j'g<]^w *[P0zw*6o[2<9T[$qL2U^N$M0,bme/!Gım(n^9 #X/1LԿ3<6 <}D@q;5 [r)NAcrw؁>ƒZC&Ering-0.16.9/src/rsa/signing.rs000064400000000000000000000631571353111575600143370ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{ bigint::{self, Prime}, verification, RsaEncoding, N, }; /// RSA PKCS#1 1.5 signatures. use crate::{ arithmetic::montgomery::R, bits, digest, error::{self, KeyRejected}, io::{self, der, der_writer}, pkcs8, rand, signature, }; use alloc::boxed::Box; use untrusted; /// An RSA key pair, used for signing. pub struct RsaKeyPair { p: PrivatePrime

, q: PrivatePrime, qInv: bigint::Elem, qq: bigint::Modulus, q_mod_n: bigint::Elem, public: verification::Key, public_key: RsaSubjectPublicKey, } derive_debug_via_field!(RsaKeyPair, stringify!(RsaKeyPair), public_key); impl RsaKeyPair { /// Parses an unencrypted PKCS#8-encoded RSA private key. /// /// Only two-prime (not multi-prime) keys are supported. The public modulus /// (n) must be at least 2047 bits. The public modulus must be no larger /// than 4096 bits. It is recommended that the public modulus be exactly /// 2048 or 3072 bits. The public exponent must be at least 65537. /// /// This will generate a 2048-bit RSA private key of the correct form using /// OpenSSL's command line tool: /// /// ```sh /// openssl genpkey -algorithm RSA \ /// -pkeyopt rsa_keygen_bits:2048 \ /// -pkeyopt rsa_keygen_pubexp:65537 | \ /// openssl pkcs8 -topk8 -nocrypt -outform der > rsa-2048-private-key.pk8 /// ``` /// /// This will generate a 3072-bit RSA private key of the correct form: /// /// ```sh /// openssl genpkey -algorithm RSA \ /// -pkeyopt rsa_keygen_bits:3072 \ /// -pkeyopt rsa_keygen_pubexp:65537 | \ /// openssl pkcs8 -topk8 -nocrypt -outform der > rsa-3072-private-key.pk8 /// ``` /// /// Often, keys generated for use in OpenSSL-based software are stored in /// the Base64 “PEM” format without the PKCS#8 wrapper. Such keys can be /// converted to binary PKCS#8 form using the OpenSSL command line tool like /// this: /// /// ```sh /// openssl pkcs8 -topk8 -nocrypt -outform der \ /// -in rsa-2048-private-key.pem > rsa-2048-private-key.pk8 /// ``` /// /// Base64 (“PEM”) PKCS#8-encoded keys can be converted to the binary PKCS#8 /// form like this: /// /// ```sh /// openssl pkcs8 -nocrypt -outform der \ /// -in rsa-2048-private-key.pem > rsa-2048-private-key.pk8 /// ``` /// /// The private key is validated according to [NIST SP-800-56B rev. 1] /// section 6.4.1.4.3, crt_pkv (Intended Exponent-Creation Method Unknown), /// with the following exceptions: /// /// * Section 6.4.1.2.1, Step 1: Neither a target security level nor an /// expected modulus length is provided as a parameter, so checks /// regarding these expectations are not done. /// * Section 6.4.1.2.1, Step 3: Since neither the public key nor the /// expected modulus length is provided as a parameter, the consistency /// check between these values and the private key's value of n isn't /// done. /// * Section 6.4.1.2.1, Step 5: No primality tests are done, both for /// performance reasons and to avoid any side channels that such tests /// would provide. /// * Section 6.4.1.2.1, Step 6, and 6.4.1.4.3, Step 7: /// * *ring* has a slightly looser lower bound for the values of `p` /// and `q` than what the NIST document specifies. This looser lower /// bound matches what most other crypto libraries do. The check might /// be tightened to meet NIST's requirements in the future. Similarly, /// the check that `p` and `q` are not too close together is skipped /// currently, but may be added in the future. /// - The validity of the mathematical relationship of `dP`, `dQ`, `e` /// and `n` is verified only during signing. Some size checks of `d`, /// `dP` and `dQ` are performed at construction, but some NIST checks /// are skipped because they would be expensive and/or they would leak /// information through side channels. If a preemptive check of the /// consistency of `dP`, `dQ`, `e` and `n` with each other is /// necessary, that can be done by signing any message with the key /// pair. /// /// * `d` is not fully validated, neither at construction nor during /// signing. This is OK as far as *ring*'s usage of the key is /// concerned because *ring* never uses the value of `d` (*ring* always /// uses `p`, `q`, `dP` and `dQ` via the Chinese Remainder Theorem, /// instead). However, *ring*'s checks would not be sufficient for /// validating a key pair for use by some other system; that other /// system must check the value of `d` itself if `d` is to be used. /// /// In addition to the NIST requirements, *ring* requires that `p > q` and /// that `e` must be no more than 33 bits. /// /// See [RFC 5958] and [RFC 3447 Appendix A.1.2] for more details of the /// encoding of the key. /// /// [NIST SP-800-56B rev. 1]: /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Br1.pdf /// /// [RFC 3447 Appendix A.1.2]: /// https://tools.ietf.org/html/rfc3447#appendix-A.1.2 /// /// [RFC 5958]: /// https://tools.ietf.org/html/rfc5958 pub fn from_pkcs8(pkcs8: &[u8]) -> Result { const RSA_ENCRYPTION: &[u8] = include_bytes!("../data/alg-rsa-encryption.der"); let (der, _) = pkcs8::unwrap_key_( untrusted::Input::from(&RSA_ENCRYPTION), pkcs8::Version::V1Only, untrusted::Input::from(pkcs8), )?; Self::from_der(der.as_slice_less_safe()) } /// Parses an RSA private key that is not inside a PKCS#8 wrapper. /// /// The private key must be encoded as a binary DER-encoded ASN.1 /// `RSAPrivateKey` as described in [RFC 3447 Appendix A.1.2]). In all other /// respects, this is just like `from_pkcs8()`. See the documentation for /// `from_pkcs8()` for more details. /// /// It is recommended to use `from_pkcs8()` (with a PKCS#8-encoded key) /// instead. /// /// [RFC 3447 Appendix A.1.2]: /// https://tools.ietf.org/html/rfc3447#appendix-A.1.2 /// /// [NIST SP-800-56B rev. 1]: /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Br1.pdf pub fn from_der(input: &[u8]) -> Result { untrusted::Input::from(input).read_all(KeyRejected::invalid_encoding(), |input| { der::nested( input, der::Tag::Sequence, error::KeyRejected::invalid_encoding(), Self::from_der_reader, ) }) } fn from_der_reader(input: &mut untrusted::Reader) -> Result { let version = der::small_nonnegative_integer(input) .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; if version != 0 { return Err(KeyRejected::version_not_supported()); } fn positive_integer<'a>( input: &mut untrusted::Reader<'a>, ) -> Result, KeyRejected> { der::positive_integer(input) .map_err(|error::Unspecified| KeyRejected::invalid_encoding()) } let n = positive_integer(input)?; let e = positive_integer(input)?; let d = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let p = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let q = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let dP = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let dQ = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let qInv = positive_integer(input)?.big_endian_without_leading_zero_as_input(); let (p, p_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(p) .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; let (q, q_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(q) .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; // Our implementation of CRT-based modular exponentiation used requires // that `p > q` so swap them if `p < q`. If swapped, `qInv` is // recalculated below. `p != q` is verified implicitly below, e.g. when // `q_mod_p` is constructed. let ((p, p_bits, dP), (q, q_bits, dQ, qInv)) = match q.verify_less_than(&p) { Ok(_) => ((p, p_bits, dP), (q, q_bits, dQ, Some(qInv))), Err(error::Unspecified) => { // TODO: verify `q` and `qInv` are inverses (mod p). ((q, q_bits, dQ), (p, p_bits, dP, None)) } }; // XXX: Some steps are done out of order, but the NIST steps are worded // in such a way that it is clear that NIST intends for them to be done // in order. TODO: Does this matter at all? // 6.4.1.4.3/6.4.1.2.1 - Step 1. // Step 1.a is omitted, as explained above. // Step 1.b is omitted per above. Instead, we check that the public // modulus is 2048 to `PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS` bits. // XXX: The maximum limit of 4096 bits is primarily due to lack of // testing of larger key sizes; see, in particular, // https://www.mail-archive.com/openssl-dev@openssl.org/msg44586.html // and // https://www.mail-archive.com/openssl-dev@openssl.org/msg44759.html. // Also, this limit might help with memory management decisions later. // Step 1.c. We validate e >= 65537. let public_key = verification::Key::from_modulus_and_exponent( n.big_endian_without_leading_zero_as_input(), e.big_endian_without_leading_zero_as_input(), bits::BitLength::from_usize_bits(2048), super::PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS, 65537, )?; // 6.4.1.4.3 says to skip 6.4.1.2.1 Step 2. // 6.4.1.4.3 Step 3. // Step 3.a is done below, out of order. // Step 3.b is unneeded since `n_bits` is derived here from `n`. // 6.4.1.4.3 says to skip 6.4.1.2.1 Step 4. (We don't need to recover // the prime factors since they are already given.) // 6.4.1.4.3 - Step 5. // Steps 5.a and 5.b are omitted, as explained above. // Step 5.c. // // TODO: First, stop if `p < (√2) * 2**((nBits/2) - 1)`. // // Second, stop if `p > 2**(nBits/2) - 1`. let half_n_bits = public_key.n_bits.half_rounded_up(); if p_bits != half_n_bits { return Err(KeyRejected::inconsistent_components()); } // TODO: Step 5.d: Verify GCD(p - 1, e) == 1. // Steps 5.e and 5.f are omitted as explained above. // Step 5.g. // // TODO: First, stop if `q < (√2) * 2**((nBits/2) - 1)`. // // Second, stop if `q > 2**(nBits/2) - 1`. if p_bits != q_bits { return Err(KeyRejected::inconsistent_components()); } // TODO: Step 5.h: Verify GCD(p - 1, e) == 1. let q_mod_n_decoded = q .to_elem(&public_key.n) .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; // TODO: Step 5.i // // 3.b is unneeded since `n_bits` is derived here from `n`. // 6.4.1.4.3 - Step 3.a (out of order). // // Verify that p * q == n. We restrict ourselves to modular // multiplication. We rely on the fact that we've verified // 0 < q < p < n. We check that q and p are close to sqrt(n) and then // assume that these preconditions are enough to let us assume that // checking p * q == 0 (mod n) is equivalent to checking p * q == n. let q_mod_n = bigint::elem_mul( public_key.n.oneRR().as_ref(), q_mod_n_decoded.clone(), &public_key.n, ); let p_mod_n = p .to_elem(&public_key.n) .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; let pq_mod_n = bigint::elem_mul(&q_mod_n, p_mod_n, &public_key.n); if !pq_mod_n.is_zero() { return Err(KeyRejected::inconsistent_components()); } // 6.4.1.4.3/6.4.1.2.1 - Step 6. // Step 6.a, partial. // // First, validate `2**half_n_bits < d`. Since 2**half_n_bits has a bit // length of half_n_bits + 1, this check gives us 2**half_n_bits <= d, // and knowing d is odd makes the inequality strict. let (d, d_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(d) .map_err(|_| error::KeyRejected::invalid_encoding())?; if !(half_n_bits < d_bits) { return Err(KeyRejected::inconsistent_components()); } // XXX: This check should be `d < LCM(p - 1, q - 1)`, but we don't have // a good way of calculating LCM, so it is omitted, as explained above. d.verify_less_than_modulus(&public_key.n) .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; if !d.is_odd() { return Err(KeyRejected::invalid_component()); } // Step 6.b is omitted as explained above. // 6.4.1.4.3 - Step 7. // Step 7.a. let p = PrivatePrime::new(p, dP)?; // Step 7.b. let q = PrivatePrime::new(q, dQ)?; let q_mod_p = q.modulus.to_elem(&p.modulus); // Step 7.c. let qInv = if let Some(qInv) = qInv { bigint::Elem::from_be_bytes_padded(qInv, &p.modulus) .map_err(|error::Unspecified| KeyRejected::invalid_component())? } else { // We swapped `p` and `q` above, so we need to calculate `qInv`. // Step 7.f below will verify `qInv` is correct. let q_mod_p = bigint::elem_mul(p.modulus.oneRR().as_ref(), q_mod_p.clone(), &p.modulus); bigint::elem_inverse_consttime(q_mod_p, &p.modulus) .map_err(|error::Unspecified| KeyRejected::unexpected_error())? }; // Steps 7.d and 7.e are omitted per the documentation above, and // because we don't (in the long term) have a good way to do modulo // with an even modulus. // Step 7.f. let qInv = bigint::elem_mul(p.modulus.oneRR().as_ref(), qInv, &p.modulus); bigint::verify_inverses_consttime(&qInv, q_mod_p, &p.modulus) .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; let qq = bigint::elem_mul(&q_mod_n, q_mod_n_decoded, &public_key.n).into_modulus::()?; let public_key_serialized = RsaSubjectPublicKey::from_n_and_e(n, e); Ok(Self { p, q, qInv, q_mod_n, qq, public: public_key, public_key: public_key_serialized, }) } /// Returns the length in bytes of the key pair's public modulus. /// /// A signature has the same length as the public modulus. pub fn public_modulus_len(&self) -> usize { self.public_key .modulus() .big_endian_without_leading_zero_as_input() .as_slice_less_safe() .len() } } impl signature::KeyPair for RsaKeyPair { type PublicKey = RsaSubjectPublicKey; fn public_key(&self) -> &Self::PublicKey { &self.public_key } } /// A serialized RSA public key. #[derive(Clone)] pub struct RsaSubjectPublicKey(Box<[u8]>); impl AsRef<[u8]> for RsaSubjectPublicKey { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } derive_debug_self_as_ref_hex_bytes!(RsaSubjectPublicKey); impl RsaSubjectPublicKey { fn from_n_and_e(n: io::Positive, e: io::Positive) -> Self { let bytes = der_writer::write_all(der::Tag::Sequence, &|output| { der_writer::write_positive_integer(output, &n); der_writer::write_positive_integer(output, &e); }); RsaSubjectPublicKey(bytes) } /// The public modulus (n). pub fn modulus(&self) -> io::Positive { // Parsing won't fail because we serialized it ourselves. let (public_key, _exponent) = super::parse_public_key(untrusted::Input::from(self.as_ref())).unwrap(); public_key } /// The public exponent (e). pub fn exponent(&self) -> io::Positive { // Parsing won't fail because we serialized it ourselves. let (_public_key, exponent) = super::parse_public_key(untrusted::Input::from(self.as_ref())).unwrap(); exponent } } struct PrivatePrime { modulus: bigint::Modulus, exponent: bigint::PrivateExponent, } impl PrivatePrime { /// Constructs a `PrivatePrime` from the private prime `p` and `dP` where /// dP == d % (p - 1). fn new(p: bigint::Nonnegative, dP: untrusted::Input) -> Result { let (p, p_bits) = bigint::Modulus::from_nonnegative_with_bit_length(p)?; if p_bits.as_usize_bits() % 512 != 0 { return Err(error::KeyRejected::private_modulus_len_not_multiple_of_512_bits()); } // [NIST SP-800-56B rev. 1] 6.4.1.4.3 - Steps 7.a & 7.b. let dP = bigint::PrivateExponent::from_be_bytes_padded(dP, &p) .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; // XXX: Steps 7.d and 7.e are omitted. We don't check that // `dP == d % (p - 1)` because we don't (in the long term) have a good // way to do modulo with an even modulus. Instead we just check that // `1 <= dP < p - 1`. We'll check it, to some unknown extent, when we // do the private key operation, since we verify that the result of the // private key operation using the CRT parameters is consistent with `n` // and `e`. TODO: Either prove that what we do is sufficient, or make // it so. Ok(PrivatePrime { modulus: p, exponent: dP, }) } } fn elem_exp_consttime( c: &bigint::Elem, p: &PrivatePrime, ) -> Result, error::Unspecified> where M: bigint::NotMuchSmallerModulus, M: Prime, { let c_mod_m = bigint::elem_reduced(c, &p.modulus)?; // We could precompute `oneRRR = elem_squared(&p.oneRR`) as mentioned // in the Smooth CRT-RSA paper. let c_mod_m = bigint::elem_mul(p.modulus.oneRR().as_ref(), c_mod_m, &p.modulus); let c_mod_m = bigint::elem_mul(p.modulus.oneRR().as_ref(), c_mod_m, &p.modulus); bigint::elem_exp_consttime(c_mod_m, &p.exponent, &p.modulus) } // Type-level representations of the different moduli used in RSA signing, in // addition to `super::N`. See `super::bigint`'s modulue-level documentation. #[derive(Copy, Clone)] enum P {} unsafe impl Prime for P {} unsafe impl bigint::SmallerModulus for P {} unsafe impl bigint::NotMuchSmallerModulus for P {} #[derive(Copy, Clone)] enum QQ {} unsafe impl bigint::SmallerModulus for QQ {} unsafe impl bigint::NotMuchSmallerModulus for QQ {} // `q < p < 2*q` since `q` is slightly smaller than `p` (see below). Thus: // // q < p < 2*q // q*q < p*q < 2*q*q. // q**2 < n < 2*(q**2). unsafe impl bigint::SlightlySmallerModulus for QQ {} #[derive(Copy, Clone)] enum Q {} unsafe impl Prime for Q {} unsafe impl bigint::SmallerModulus for Q {} unsafe impl bigint::SmallerModulus

for Q {} // q < p && `p.bit_length() == q.bit_length()` implies `q < p < 2*q`. unsafe impl bigint::SlightlySmallerModulus

for Q {} unsafe impl bigint::SmallerModulus for Q {} unsafe impl bigint::NotMuchSmallerModulus for Q {} impl RsaKeyPair { /// Sign `msg`. `msg` is digested using the digest algorithm from /// `padding_alg` and the digest is then padded using the padding algorithm /// from `padding_alg`. The signature it written into `signature`; /// `signature`'s length must be exactly the length returned by /// `public_modulus_len()`. `rng` may be used to randomize the padding /// (e.g. for PSS). /// /// Many other crypto libraries have signing functions that takes a /// precomputed digest as input, instead of the message to digest. This /// function does *not* take a precomputed digest; instead, `sign` /// calculates the digest itself. /// /// Lots of effort has been made to make the signing operations close to /// constant time to protect the private key from side channel attacks. On /// x86-64, this is done pretty well, but not perfectly. On other /// platforms, it is done less perfectly. pub fn sign( &self, padding_alg: &'static dyn RsaEncoding, rng: &dyn rand::SecureRandom, msg: &[u8], signature: &mut [u8], ) -> Result<(), error::Unspecified> { let mod_bits = self.public.n_bits; if signature.len() != mod_bits.as_usize_bytes_rounded_up() { return Err(error::Unspecified); } let m_hash = digest::digest(padding_alg.digest_alg(), msg); padding_alg.encode(&m_hash, signature, mod_bits, rng)?; // RFC 8017 Section 5.1.2: RSADP, using the Chinese Remainder Theorem // with Garner's algorithm. let n = &self.public.n; // Step 1. The value zero is also rejected. let base = bigint::Elem::from_be_bytes_padded(untrusted::Input::from(signature), n)?; // Step 2 let c = base; // Step 2.b.i. let m_1 = elem_exp_consttime(&c, &self.p)?; let c_mod_qq = bigint::elem_reduced_once(&c, &self.qq); let m_2 = elem_exp_consttime(&c_mod_qq, &self.q)?; // Step 2.b.ii isn't needed since there are only two primes. // Step 2.b.iii. let p = &self.p.modulus; let m_2 = bigint::elem_widen(m_2, p); let m_1_minus_m_2 = bigint::elem_sub(m_1, &m_2, p); let h = bigint::elem_mul(&self.qInv, m_1_minus_m_2, p); // Step 2.b.iv. The reduction in the modular multiplication isn't // necessary because `h < p` and `p * q == n` implies `h * q < n`. // Modular arithmetic is used simply to avoid implementing // non-modular arithmetic. let h = bigint::elem_widen(h, n); let q_times_h = bigint::elem_mul(&self.q_mod_n, h, n); let m_2 = bigint::elem_widen(m_2, n); let m = bigint::elem_add(m_2, q_times_h, n); // Step 2.b.v isn't needed since there are only two primes. // Verify the result to protect against fault attacks as described // in "On the Importance of Checking Cryptographic Protocols for // Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. // This check is cheap assuming `e` is small, which is ensured during // `KeyPair` construction. Note that this is the only validation of `e` // that is done other than basic checks on its size, oddness, and // minimum value, since the relationship of `e` to `d`, `p`, and `q` is // not verified during `KeyPair` construction. { let verify = bigint::elem_exp_vartime(m.clone(), self.public.e, n); let verify = verify.into_unencoded(n); bigint::elem_verify_equal_consttime(&verify, &c)?; } // Step 3. // // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010. m.fill_be_bytes(signature); Ok(()) } } #[cfg(test)] mod tests { // We intentionally avoid `use super::*` so that we are sure to use only // the public API; this ensures that enough of the API is public. use crate::{rand, signature}; use alloc::vec; // `KeyPair::sign` requires that the output buffer is the same length as // the public key modulus. Test what happens when it isn't the same length. #[test] fn test_signature_rsa_pkcs1_sign_output_buffer_len() { // Sign the message "hello, world", using PKCS#1 v1.5 padding and the // SHA256 digest algorithm. const MESSAGE: &[u8] = b"hello, world"; let rng = rand::SystemRandom::new(); const PRIVATE_KEY_DER: &'static [u8] = include_bytes!("signature_rsa_example_private_key.der"); let key_pair = signature::RsaKeyPair::from_der(PRIVATE_KEY_DER).unwrap(); // The output buffer is one byte too short. let mut signature = vec![0; key_pair.public_modulus_len() - 1]; assert!(key_pair .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) .is_err()); // The output buffer is the right length. signature.push(0); assert!(key_pair .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) .is_ok()); // The output buffer is one byte too long. signature.push(0); assert!(key_pair .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) .is_err()); } } ring-0.16.9/src/rsa/verification.rs000064400000000000000000000256111353111575600153540ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Verification of RSA signatures. use super::{bigint, parse_public_key, RsaParameters, N, PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN}; use crate::{bits, cpu, digest, error, sealed, signature}; use untrusted; #[derive(Debug)] pub struct Key { pub n: bigint::Modulus, pub e: bigint::PublicExponent, pub n_bits: bits::BitLength, } impl Key { pub fn from_modulus_and_exponent( n: untrusted::Input, e: untrusted::Input, n_min_bits: bits::BitLength, n_max_bits: bits::BitLength, e_min_value: u64, ) -> Result { // This is an incomplete implementation of NIST SP800-56Br1 Section // 6.4.2.2, "Partial Public-Key Validation for RSA." That spec defers // to NIST SP800-89 Section 5.3.3, "(Explicit) Partial Public Key // Validation for RSA," "with the caveat that the length of the modulus // shall be a length that is specified in this Recommendation." In // SP800-89, two different sets of steps are given, one set numbered, // and one set lettered. TODO: Document this in the end-user // documentation for RSA keys. // Step 3 / Step c for `n` (out of order). let (n, n_bits) = bigint::Modulus::from_be_bytes_with_bit_length(n)?; // `pkcs1_encode` depends on this not being small. Otherwise, // `pkcs1_encode` would generate padding that is invalid (too few 0xFF // bytes) for very small keys. const N_MIN_BITS: bits::BitLength = bits::BitLength::from_usize_bits(2048); // Step 1 / Step a. XXX: SP800-56Br1 and SP800-89 require the length of // the public modulus to be exactly 2048 or 3072 bits, but we are more // flexible to be compatible with other commonly-used crypto libraries. assert!(n_min_bits >= N_MIN_BITS); let n_bits_rounded_up = bits::BitLength::from_usize_bytes(n_bits.as_usize_bytes_rounded_up()) .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; if n_bits_rounded_up < n_min_bits { return Err(error::KeyRejected::too_small()); } if n_bits > n_max_bits { return Err(error::KeyRejected::too_large()); } // Step 2 / Step b. // Step 3 / Step c for `e`. let e = bigint::PublicExponent::from_be_bytes(e, e_min_value)?; // If `n` is less than `e` then somebody has probably accidentally swapped // them. The largest acceptable `e` is smaller than the smallest acceptable // `n`, so no additional checks need to be done. // XXX: Steps 4 & 5 / Steps d, e, & f are not implemented. This is also the // case in most other commonly-used crypto libraries. Ok(Self { n, e, n_bits }) } } impl signature::VerificationAlgorithm for RsaParameters { fn verify( &self, public_key: untrusted::Input, msg: untrusted::Input, signature: untrusted::Input, ) -> Result<(), error::Unspecified> { let (n, e) = parse_public_key(public_key)?; verify_rsa_( self, ( n.big_endian_without_leading_zero_as_input(), e.big_endian_without_leading_zero_as_input(), ), msg, signature, ) } } impl sealed::Sealed for RsaParameters {} macro_rules! rsa_params { ( $VERIFY_ALGORITHM:ident, $min_bits:expr, $PADDING_ALGORITHM:expr, $doc_str:expr ) => { #[doc=$doc_str] /// /// Only available in `alloc` mode. pub static $VERIFY_ALGORITHM: RsaParameters = RsaParameters { padding_alg: $PADDING_ALGORITHM, min_bits: bits::BitLength::from_usize_bits($min_bits), }; }; } rsa_params!( RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, 2048, &super::padding::RSA_PKCS1_SHA1_FOR_LEGACY_USE_ONLY, "Verification of signatures using RSA keys of 2048-8192 bits, PKCS#1.5 padding, and SHA-1.\n\nSee \"`RSA_PKCS1_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PKCS1_2048_8192_SHA256, 2048, &super::RSA_PKCS1_SHA256, "Verification of signatures using RSA keys of 2048-8192 bits, PKCS#1.5 padding, and SHA-256.\n\nSee \"`RSA_PKCS1_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PKCS1_2048_8192_SHA384, 2048, &super::RSA_PKCS1_SHA384, "Verification of signatures using RSA keys of 2048-8192 bits, PKCS#1.5 padding, and SHA-384.\n\nSee \"`RSA_PKCS1_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PKCS1_2048_8192_SHA512, 2048, &super::RSA_PKCS1_SHA512, "Verification of signatures using RSA keys of 2048-8192 bits, PKCS#1.5 padding, and SHA-512.\n\nSee \"`RSA_PKCS1_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PKCS1_3072_8192_SHA384, 3072, &super::RSA_PKCS1_SHA384, "Verification of signatures using RSA keys of 3072-8192 bits, PKCS#1.5 padding, and SHA-384.\n\nSee \"`RSA_PKCS1_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PSS_2048_8192_SHA256, 2048, &super::RSA_PSS_SHA256, "Verification of signatures using RSA keys of 2048-8192 bits, PSS padding, and SHA-256.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PSS_2048_8192_SHA384, 2048, &super::RSA_PSS_SHA384, "Verification of signatures using RSA keys of 2048-8192 bits, PSS padding, and SHA-384.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); rsa_params!( RSA_PSS_2048_8192_SHA512, 2048, &super::RSA_PSS_SHA512, "Verification of signatures using RSA keys of 2048-8192 bits, PSS padding, and SHA-512.\n\nSee \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level documentation for more details." ); /// Low-level API for the verification of RSA signatures. /// /// When the public key is in DER-encoded PKCS#1 ASN.1 format, it is /// recommended to use `ring::signature::verify()` with /// `ring::signature::RSA_PKCS1_*`, because `ring::signature::verify()` /// will handle the parsing in that case. Otherwise, this function can be used /// to pass in the raw bytes for the public key components as /// `untrusted::Input` arguments. // // There are a small number of tests that test this directly, but the // test coverage for this function mostly depends on the test coverage for the // `signature::VerificationAlgorithm` implementation for `RsaParameters`. If we // change that, test coverage for `verify_rsa()` will need to be reconsidered. // (The NIST test vectors were originally in a form that was optimized for // testing `verify_rsa` directly, but the testing work for RSA PKCS#1 // verification was done during the implementation of // `signature::VerificationAlgorithm`, before `verify_rsa` was factored out). #[derive(Debug)] pub struct RsaPublicKeyComponents + core::fmt::Debug> { /// The public modulus, encoded in big-endian bytes without leading zeros. pub n: B, /// The public exponent, encoded in big-endian bytes without leading zeros. /// without leading zeros. pub e: B, } impl Copy for RsaPublicKeyComponents where B: AsRef<[u8]> + core::fmt::Debug {} impl Clone for RsaPublicKeyComponents where B: AsRef<[u8]> + core::fmt::Debug, { fn clone(&self) -> Self { Self { n: self.n.clone(), e: self.e.clone(), } } } impl RsaPublicKeyComponents where B: AsRef<[u8]> + core::fmt::Debug, { /// Verifies that `signature` is a valid signature of `message` using `self` /// as the public key. `params` determine what algorithm parameters /// (padding, digest algorithm, key length range, etc.) are used in the /// verification. pub fn verify( &self, params: &RsaParameters, message: &[u8], signature: &[u8], ) -> Result<(), error::Unspecified> { let _ = cpu::features(); verify_rsa_( params, ( untrusted::Input::from(self.n.as_ref()), untrusted::Input::from(self.e.as_ref()), ), untrusted::Input::from(message), untrusted::Input::from(signature), ) } } pub(crate) fn verify_rsa_( params: &RsaParameters, (n, e): (untrusted::Input, untrusted::Input), msg: untrusted::Input, signature: untrusted::Input, ) -> Result<(), error::Unspecified> { let max_bits = bits::BitLength::from_usize_bytes(PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN)?; // XXX: FIPS 186-4 seems to indicate that the minimum // exponent value is 2**16 + 1, but it isn't clear if this is just for // signing or also for verification. We support exponents of 3 and larger // for compatibility with other commonly-used crypto libraries. let Key { n, e, n_bits } = Key::from_modulus_and_exponent(n, e, params.min_bits, max_bits, 3)?; // The signature must be the same length as the modulus, in bytes. if signature.len() != n_bits.as_usize_bytes_rounded_up() { return Err(error::Unspecified); } // RFC 8017 Section 5.2.2: RSAVP1. // Step 1. let s = bigint::Elem::from_be_bytes_padded(signature, &n)?; if s.is_zero() { return Err(error::Unspecified); } // Step 2. let m = bigint::elem_exp_vartime(s, e, &n); let m = m.into_unencoded(&n); // Step 3. let mut decoded = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; let decoded = &mut decoded[..n_bits.as_usize_bytes_rounded_up()]; m.fill_be_bytes(decoded); // Verify the padded message is correct. let m_hash = digest::digest(params.padding_alg.digest_alg(), msg.as_slice_less_safe()); untrusted::Input::from(decoded).read_all(error::Unspecified, |m| { params.padding_alg.verify(&m_hash, m, n_bits) }) } ring-0.16.9/src/rsa.rs000064400000000000000000000046711353111575600126750ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *R* and *r* in Montgomery math refer to different things, so we always use // `R` to refer to *R* to avoid confusion, even when that's against the normal // naming conventions. Also the standard camelCase names are used for `KeyPair` // components. /// RSA signatures. use crate::{ arithmetic::bigint, bits, error, io::{self, der}, limb, }; use untrusted; mod padding; // `RSA_PKCS1_SHA1` is intentionally not exposed. pub use self::padding::{ RsaEncoding, RSA_PKCS1_SHA256, RSA_PKCS1_SHA384, RSA_PKCS1_SHA512, RSA_PSS_SHA256, RSA_PSS_SHA384, RSA_PSS_SHA512, }; // Maximum RSA modulus size supported for signature verification (in bytes). const PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN: usize = bigint::MODULUS_MAX_LIMBS * limb::LIMB_BYTES; // Keep in sync with the documentation comment for `KeyPair`. const PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS: bits::BitLength = bits::BitLength::from_usize_bits(4096); /// Parameters for RSA verification. #[derive(Debug)] pub struct RsaParameters { padding_alg: &'static dyn padding::Verification, min_bits: bits::BitLength, } fn parse_public_key( input: untrusted::Input, ) -> Result<(io::Positive, io::Positive), error::Unspecified> { input.read_all(error::Unspecified, |input| { der::nested(input, der::Tag::Sequence, error::Unspecified, |input| { let n = der::positive_integer(input)?; let e = der::positive_integer(input)?; Ok((n, e)) }) }) } // Type-level representation of an RSA public modulus *n*. See // `super::bigint`'s modulue-level documentation. #[derive(Copy, Clone)] pub enum N {} unsafe impl bigint::PublicModulus for N {} pub mod verification; pub mod signing; ring-0.16.9/src/signature.rs000064400000000000000000000363641353111575600141150ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Public key signatures: signing and verification. //! //! Use the `verify` function to verify signatures, passing a reference to the //! algorithm that identifies the algorithm. See the documentation for `verify` //! for examples. //! //! For signature verification, this API treats each combination of parameters //! as a separate algorithm. For example, instead of having a single "RSA" //! algorithm with a verification function that takes a bunch of parameters, //! there are `RSA_PKCS1_2048_8192_SHA256`, `RSA_PKCS1_2048_8192_SHA384`, etc., //! which encode sets of parameter choices into objects. This is designed to //! reduce the risks of algorithm agility and to provide consistency with ECDSA //! and EdDSA. //! //! Currently this module does not support digesting the message to be signed //! separately from the public key operation, as it is currently being //! optimized for Ed25519 and for the implementation of protocols that do not //! requiring signing large messages. An interface for efficiently supporting //! larger messages may be added later. //! //! //! # Algorithm Details //! //! ## `ECDSA_*_ASN1` Details: ASN.1-encoded ECDSA Signatures //! //! The signature is a ASN.1 DER-encoded `Ecdsa-Sig-Value` as described in //! [RFC 3279 Section 2.2.3]. This is the form of ECDSA signature used in //! X.509-related structures and in TLS's `ServerKeyExchange` messages. //! //! The public key is encoding in uncompressed form using the //! Octet-String-to-Elliptic-Curve-Point algorithm in //! [SEC 1: Elliptic Curve Cryptography, Version 2.0]. //! //! During verification, the public key is validated using the ECC Partial //! Public-Key Validation Routine from Section 5.6.2.3.3 of //! [NIST Special Publication 800-56A, revision 2] and Appendix A.3 of the //! NSA's [Suite B implementer's guide to FIPS 186-3]. Note that, as explained //! in the NSA guide, ECC Partial Public-Key Validation is equivalent to ECC //! Full Public-Key Validation for prime-order curves like this one. //! //! ## `ECDSA_*_FIXED` Details: Fixed-length (PKCS#11-style) ECDSA Signatures //! //! The signature is *r*||*s*, where || denotes concatenation, and where both //! *r* and *s* are both big-endian-encoded values that are left-padded to the //! maximum length. A P-256 signature will be 64 bytes long (two 32-byte //! components) and a P-384 signature will be 96 bytes long (two 48-byte //! components). This is the form of ECDSA signature used PKCS#11 and DNSSEC. //! //! The public key is encoding in uncompressed form using the //! Octet-String-to-Elliptic-Curve-Point algorithm in //! [SEC 1: Elliptic Curve Cryptography, Version 2.0]. //! //! During verification, the public key is validated using the ECC Partial //! Public-Key Validation Routine from Section 5.6.2.3.3 of //! [NIST Special Publication 800-56A, revision 2] and Appendix A.3 of the //! NSA's [Suite B implementer's guide to FIPS 186-3]. Note that, as explained //! in the NSA guide, ECC Partial Public-Key Validation is equivalent to ECC //! Full Public-Key Validation for prime-order curves like this one. //! //! ## `RSA_PKCS1_*` Details: RSA PKCS#1 1.5 Signatures //! //! The signature is an RSASSA-PKCS1-v1_5 signature as described in //! [RFC 3447 Section 8.2]. //! //! The public key is encoded as an ASN.1 `RSAPublicKey` as described in //! [RFC 3447 Appendix-A.1.1]. The public key modulus length, rounded *up* to //! the nearest (larger) multiple of 8 bits, must be in the range given in the //! name of the algorithm. The public exponent must be an odd integer of 2-33 //! bits, inclusive. //! //! //! ## `RSA_PSS_*` Details: RSA PSS Signatures //! //! The signature is an RSASSA-PSS signature as described in //! [RFC 3447 Section 8.1]. //! //! The public key is encoded as an ASN.1 `RSAPublicKey` as described in //! [RFC 3447 Appendix-A.1.1]. The public key modulus length, rounded *up* to //! the nearest (larger) multiple of 8 bits, must be in the range given in the //! name of the algorithm. The public exponent must be an odd integer of 2-33 //! bits, inclusive. //! //! During verification, signatures will only be accepted if the MGF1 digest //! algorithm is the same as the message digest algorithm and if the salt //! length is the same length as the message digest. This matches the //! requirements in TLS 1.3 and other recent specifications. //! //! During signing, the message digest algorithm will be used as the MGF1 //! digest algorithm. The salt will be the same length as the message digest. //! This matches the requirements in TLS 1.3 and other recent specifications. //! Additionally, the entire salt is randomly generated separately for each //! signature using the secure random number generator passed to `sign()`. //! //! //! [SEC 1: Elliptic Curve Cryptography, Version 2.0]: //! http://www.secg.org/sec1-v2.pdf //! [NIST Special Publication 800-56A, revision 2]: //! http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf //! [Suite B implementer's guide to FIPS 186-3]: //! https://github.com/briansmith/ring/blob/master/doc/ecdsa.pdf //! [RFC 3279 Section 2.2.3]: //! https://tools.ietf.org/html/rfc3279#section-2.2.3 //! [RFC 3447 Section 8.2]: //! https://tools.ietf.org/html/rfc3447#section-7.2 //! [RFC 3447 Section 8.1]: //! https://tools.ietf.org/html/rfc3447#section-8.1 //! [RFC 3447 Appendix-A.1.1]: //! https://tools.ietf.org/html/rfc3447#appendix-A.1.1 //! //! //! # Examples //! //! ## Signing and verifying with Ed25519 //! //! ``` //! use ring::{ //! rand, //! signature::{self, KeyPair}, //! }; //! //! # fn sign_and_verify_ed25519() -> Result<(), ring::error::Unspecified> { //! // Generate a key pair in PKCS#8 (v2) format. //! let rng = rand::SystemRandom::new(); //! let pkcs8_bytes = signature::Ed25519KeyPair::generate_pkcs8(&rng)?; //! //! // Normally the application would store the PKCS#8 file persistently. Later //! // it would read the PKCS#8 file from persistent storage to use it. //! //! let key_pair = signature::Ed25519KeyPair::from_pkcs8(pkcs8_bytes.as_ref())?; //! //! // Sign the message "hello, world". //! const MESSAGE: &[u8] = b"hello, world"; //! let sig = key_pair.sign(MESSAGE); //! //! // Normally an application would extract the bytes of the signature and //! // send them in a protocol message to the peer(s). Here we just get the //! // public key key directly from the key pair. //! let peer_public_key_bytes = key_pair.public_key().as_ref(); //! //! // Verify the signature of the message using the public key. Normally the //! // verifier of the message would parse the inputs to this code out of the //! // protocol message(s) sent by the signer. //! let peer_public_key = //! signature::UnparsedPublicKey::new(&signature::ED25519, peer_public_key_bytes); //! peer_public_key.verify(MESSAGE, sig.as_ref())?; //! //! # Ok(()) //! # } //! //! # fn main() { sign_and_verify_ed25519().unwrap() } //! ``` //! //! ## Signing and verifying with RSA (PKCS#1 1.5 padding) //! //! By default OpenSSL writes RSA public keys in SubjectPublicKeyInfo format, //! not RSAPublicKey format, and Base64-encodes them (“PEM” format). //! //! To convert the PEM SubjectPublicKeyInfo format (“BEGIN PUBLIC KEY”) to the //! binary RSAPublicKey format needed by `verify()`, use: //! //! ```sh //! openssl rsa -pubin \ //! -in public_key.pem \ //! -inform PEM \ //! -RSAPublicKey_out \ //! -outform DER \ //! -out public_key.der //! ``` //! //! To extract the RSAPublicKey-formatted public key from an ASN.1 (binary) //! DER-encoded RSAPrivateKey format private key file, use: //! //! ```sh //! openssl rsa -in private_key.der \ //! -inform DER \ //! -RSAPublicKey_out \ //! -outform DER \ //! -out public_key.der //! ``` //! //! ``` //! use ring::{rand, signature}; //! //! # #[cfg(feature = "std")] //! fn sign_and_verify_rsa(private_key_path: &std::path::Path, //! public_key_path: &std::path::Path) //! -> Result<(), MyError> { //! // Create an `RsaKeyPair` from the DER-encoded bytes. This example uses //! // a 2048-bit key, but larger keys are also supported. //! let private_key_der = read_file(private_key_path)?; //! let key_pair = signature::RsaKeyPair::from_der(&private_key_der) //! .map_err(|_| MyError::BadPrivateKey)?; //! //! // Sign the message "hello, world", using PKCS#1 v1.5 padding and the //! // SHA256 digest algorithm. //! const MESSAGE: &'static [u8] = b"hello, world"; //! let rng = rand::SystemRandom::new(); //! let mut signature = vec![0; key_pair.public_modulus_len()]; //! key_pair.sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) //! .map_err(|_| MyError::OOM)?; //! //! // Verify the signature. //! let public_key = //! signature::UnparsedPublicKey::new(&signature::RSA_PKCS1_2048_8192_SHA256, //! read_file(public_key_path)?); //! public_key.verify(MESSAGE, &signature) //! .map_err(|_| MyError::BadSignature) //! } //! //! #[derive(Debug)] //! enum MyError { //! # #[cfg(feature = "std")] //! IO(std::io::Error), //! BadPrivateKey, //! OOM, //! BadSignature, //! } //! //! # #[cfg(feature = "std")] //! fn read_file(path: &std::path::Path) -> Result, MyError> { //! use std::io::Read; //! //! let mut file = std::fs::File::open(path).map_err(|e| MyError::IO(e))?; //! let mut contents: Vec = Vec::new(); //! file.read_to_end(&mut contents).map_err(|e| MyError::IO(e))?; //! Ok(contents) //! } //! # //! # #[cfg(not(feature = "std"))] //! # fn sign_and_verify_rsa(_private_key_path: &std::path::Path, //! # _public_key_path: &std::path::Path) //! # -> Result<(), ()> { //! # Ok(()) //! # } //! # //! # fn main() { //! # let private_key_path = //! # std::path::Path::new("src/rsa/signature_rsa_example_private_key.der"); //! # let public_key_path = //! # std::path::Path::new("src/rsa/signature_rsa_example_public_key.der"); //! # sign_and_verify_rsa(&private_key_path, &public_key_path).unwrap() //! # } //! ``` use crate::{cpu, ec, error, sealed}; use untrusted; pub use crate::ec::{ curve25519::ed25519::{ signing::Ed25519KeyPair, verification::{EdDSAParameters, ED25519}, ED25519_PUBLIC_KEY_LEN, }, suite_b::ecdsa::{ signing::{ EcdsaKeyPair, EcdsaSigningAlgorithm, ECDSA_P256_SHA256_ASN1_SIGNING, ECDSA_P256_SHA256_FIXED_SIGNING, ECDSA_P384_SHA384_ASN1_SIGNING, ECDSA_P384_SHA384_FIXED_SIGNING, }, verification::{ EcdsaVerificationAlgorithm, ECDSA_P256_SHA256_ASN1, ECDSA_P256_SHA256_FIXED, ECDSA_P256_SHA384_ASN1, ECDSA_P384_SHA256_ASN1, ECDSA_P384_SHA384_ASN1, ECDSA_P384_SHA384_FIXED, }, }, }; #[cfg(feature = "alloc")] pub use crate::rsa::{ signing::RsaKeyPair, signing::RsaSubjectPublicKey, verification::{ RsaPublicKeyComponents, RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, RSA_PKCS1_2048_8192_SHA256, RSA_PKCS1_2048_8192_SHA384, RSA_PKCS1_2048_8192_SHA512, RSA_PKCS1_3072_8192_SHA384, RSA_PSS_2048_8192_SHA256, RSA_PSS_2048_8192_SHA384, RSA_PSS_2048_8192_SHA512, }, RsaEncoding, RsaParameters, // `RSA_PKCS1_SHA1` is intentionally not exposed. At a minimum, we'd need // to create test vectors for signing with it, which we don't currently // have. But, it's a bad idea to use SHA-1 anyway, so perhaps we just won't // ever expose it. RSA_PKCS1_SHA256, RSA_PKCS1_SHA384, RSA_PKCS1_SHA512, RSA_PSS_SHA256, RSA_PSS_SHA384, RSA_PSS_SHA512, }; /// A public key signature returned from a signing operation. #[derive(Clone, Copy)] pub struct Signature { value: [u8; MAX_LEN], len: usize, } impl Signature { // Panics if `value` is too long. pub(crate) fn new(fill: F) -> Self where F: FnOnce(&mut [u8; MAX_LEN]) -> usize, { let mut r = Self { value: [0; MAX_LEN], len: 0, }; r.len = fill(&mut r.value); r } } impl AsRef<[u8]> for Signature { fn as_ref(&self) -> &[u8] { &self.value[..self.len] } } /// Key pairs for signing messages (private key and public key). pub trait KeyPair: core::fmt::Debug + Send + Sized + Sync { /// The type of the public key. type PublicKey: AsRef<[u8]> + core::fmt::Debug + Clone + Send + Sized + Sync; /// The public key for the key pair. fn public_key(&self) -> &Self::PublicKey; } /// The longest signature is an ASN.1 P-384 signature where *r* and *s* are of /// maximum length with the leading high bit set on each. Then each component /// will have a tag, a one-byte length, and a one-byte “I'm not negative” /// prefix, and the outer sequence will have a two-byte length. pub(crate) const MAX_LEN: usize = 1/*tag:SEQUENCE*/ + 2/*len*/ + (2 * (1/*tag:INTEGER*/ + 1/*len*/ + 1/*zero*/ + ec::SCALAR_MAX_BYTES)); /// A signature verification algorithm. pub trait VerificationAlgorithm: core::fmt::Debug + Sync + sealed::Sealed { /// Verify the signature `signature` of message `msg` with the public key /// `public_key`. fn verify( &self, public_key: untrusted::Input, msg: untrusted::Input, signature: untrusted::Input, ) -> Result<(), error::Unspecified>; } /// An unparsed, possibly malformed, public key for signature verification. pub struct UnparsedPublicKey> { algorithm: &'static dyn VerificationAlgorithm, bytes: B, } impl Copy for UnparsedPublicKey where B: AsRef<[u8]> {} impl Clone for UnparsedPublicKey where B: AsRef<[u8]>, { fn clone(&self) -> Self { Self { algorithm: self.algorithm, bytes: self.bytes.clone(), } } } impl> UnparsedPublicKey { /// Construct a new `UnparsedPublicKey`. /// /// No validation of `bytes` is done until `verify()` is called. #[inline] pub fn new(algorithm: &'static dyn VerificationAlgorithm, bytes: B) -> Self { Self { algorithm, bytes } } /// Parses the public key and verifies `signature` is a valid signature of /// `message` using it. /// /// See the [crate::signature] module-level documentation for examples. pub fn verify(&self, message: &[u8], signature: &[u8]) -> Result<(), error::Unspecified> { let _ = cpu::features(); self.algorithm.verify( untrusted::Input::from(self.bytes.as_ref()), untrusted::Input::from(message), untrusted::Input::from(signature), ) } } ring-0.16.9/src/test.rs000064400000000000000000000535561353036607100130720ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //! Testing framework. //! //! Unlike the rest of *ring*, this testing framework uses panics pretty //! liberally. It was originally designed for internal use--it drives most of //! *ring*'s internal tests, and so it is optimized for getting *ring*'s tests //! written quickly at the expense of some usability. The documentation is //! lacking. The best way to learn it is to look at some examples. The digest //! tests are the most complicated because they use named sections. Other tests //! avoid named sections and so are easier to understand. //! //! # Examples //! //! ## Writing Tests //! //! Input files look like this: //! //! ```text //! # This is a comment. //! //! HMAC = SHA1 //! Input = "My test data" //! Key = "" //! Output = 61afdecb95429ef494d61fdee15990cabf0826fc //! //! HMAC = SHA256 //! Input = "Sample message for keylen //! at C:\Users\Example\example\:4 //! 9: 0x7ff65496d49c - example_test //! at C:\Users\Example\example\src\example.rs:652 //! 10: 0x7ff6549d192a - test::stats::Summary::new::ha139494ed2e4e01f //! 11: 0x7ff6549d51a2 - test::stats::Summary::new::ha139494ed2e4e01f //! 12: 0x7ff654a0a911 - _rust_maybe_catch_panic //! 13: 0x7ff6549d56dd - test::stats::Summary::new::ha139494ed2e4e01f //! 14: 0x7ff654a03783 - std::sys::thread::Thread::new::h2b08da6cd2517f79 //! 15: 0x7ff968518101 - BaseThreadInitThunk //! ``` //! //! Notice that the output shows the name of the data file //! (`src/example_tests.txt`), the test inputs that led to the failure, and the //! stack trace to the line in the test code that panicked: entry 9 in the //! stack trace pointing to line 652 of the file `example.rs`. #[cfg(feature = "alloc")] use alloc::{format, string::String, vec::Vec}; #[cfg(feature = "alloc")] use crate::{bits, digest, error}; #[cfg(any(feature = "std", feature = "test_logging"))] extern crate std; /// `compile_time_assert_clone::();` fails to compile if `T` doesn't /// implement `Clone`. pub fn compile_time_assert_clone() {} /// `compile_time_assert_copy::();` fails to compile if `T` doesn't /// implement `Copy`. pub fn compile_time_assert_copy() {} /// `compile_time_assert_send::();` fails to compile if `T` doesn't /// implement `Send`. pub fn compile_time_assert_send() {} /// `compile_time_assert_sync::();` fails to compile if `T` doesn't /// implement `Sync`. pub fn compile_time_assert_sync() {} /// `compile_time_assert_std_error_error::();` fails to compile if `T` /// doesn't implement `std::error::Error`. #[cfg(feature = "std")] pub fn compile_time_assert_std_error_error() {} /// A test case. A test case consists of a set of named attributes. Every /// attribute in the test case must be consumed exactly once; this helps catch /// typos and omissions. /// /// Requires the `alloc` default feature to be enabled. #[cfg(feature = "alloc")] #[derive(Debug)] pub struct TestCase { attributes: Vec<(String, String, bool)>, } #[cfg(feature = "alloc")] impl TestCase { /// Maps the string "true" to true and the string "false" to false. pub fn consume_bool(&mut self, key: &str) -> bool { match self.consume_string(key).as_ref() { "true" => true, "false" => false, s => panic!("Invalid bool value: {}", s), } } /// Maps the strings "SHA1", "SHA256", "SHA384", and "SHA512" to digest /// algorithms, maps "SHA224" to `None`, and panics on other (erroneous) /// inputs. "SHA224" is mapped to None because *ring* intentionally does /// not support SHA224, but we need to consume test vectors from NIST that /// have SHA224 vectors in them. pub fn consume_digest_alg(&mut self, key: &str) -> Option<&'static digest::Algorithm> { let name = self.consume_string(key); match name.as_ref() { "SHA1" => Some(&digest::SHA1_FOR_LEGACY_USE_ONLY), "SHA224" => None, // We actively skip SHA-224 support. "SHA256" => Some(&digest::SHA256), "SHA384" => Some(&digest::SHA384), "SHA512" => Some(&digest::SHA512), "SHA512_256" => Some(&digest::SHA512_256), _ => panic!("Unsupported digest algorithm: {}", name), } } /// Returns the value of an attribute that is encoded as a sequence of an /// even number of hex digits, or as a double-quoted UTF-8 string. The /// empty (zero-length) value is represented as "". pub fn consume_bytes(&mut self, key: &str) -> Vec { let s = self.consume_string(key); if s.starts_with('\"') { // The value is a quoted UTF-8 string. let mut bytes = Vec::with_capacity(s.as_bytes().len() - 2); let mut s = s.as_bytes().iter().skip(1); loop { let b = match s.next() { Some(b'\\') => { match s.next() { // We don't allow all octal escape sequences, only "\0" for null. Some(b'0') => 0u8, Some(b't') => b'\t', Some(b'n') => b'\n', // "\xHH" Some(b'x') => { let hi = s.next().expect("Invalid hex escape sequence in string."); let lo = s.next().expect("Invalid hex escape sequence in string."); if let (Ok(hi), Ok(lo)) = (from_hex_digit(*hi), from_hex_digit(*lo)) { (hi << 4) | lo } else { panic!("Invalid hex escape sequence in string."); } } _ => { panic!("Invalid hex escape sequence in string."); } } } Some(b'"') => { if s.next().is_some() { panic!("characters after the closing quote of a quoted string."); } break; } Some(b) => *b, None => panic!("Missing terminating '\"' in string literal."), }; bytes.push(b); } bytes } else { // The value is hex encoded. match from_hex(&s) { Ok(s) => s, Err(err_str) => { panic!("{} in {}", err_str, s); } } } } /// Returns the value of an attribute that is an integer, in decimal /// notation. pub fn consume_usize(&mut self, key: &str) -> usize { let s = self.consume_string(key); s.parse::().unwrap() } /// Returns the value of an attribute that is an integer, in decimal /// notation, as a bit length. #[cfg(feature = "alloc")] pub fn consume_usize_bits(&mut self, key: &str) -> bits::BitLength { let s = self.consume_string(key); let bits = s.parse::().unwrap(); bits::BitLength::from_usize_bits(bits) } /// Returns the raw value of an attribute, without any unquoting or /// other interpretation. pub fn consume_string(&mut self, key: &str) -> String { self.consume_optional_string(key) .unwrap_or_else(|| panic!("No attribute named \"{}\"", key)) } /// Like `consume_string()` except it returns `None` if the test case /// doesn't have the attribute. pub fn consume_optional_string(&mut self, key: &str) -> Option { for (name, value, consumed) in &mut self.attributes { if key == name { if *consumed { panic!("Attribute {} was already consumed", key); } *consumed = true; return Some(value.clone()); } } None } } /// References a test input file. #[cfg(feature = "alloc")] #[macro_export] macro_rules! test_file { ($file_name:expr) => { crate::test::File { file_name: $file_name, contents: include_str!($file_name), } }; } /// A test input file. #[cfg(feature = "alloc")] pub struct File<'a> { /// The name (path) of the file. pub file_name: &'a str, /// The contents of the file. pub contents: &'a str, } /// Parses test cases out of the given file, calling `f` on each vector until /// `f` fails or until all the test vectors have been read. `f` can indicate /// failure either by returning `Err()` or by panicking. /// /// Requires the `alloc` default feature to be enabled #[cfg(feature = "alloc")] pub fn run(test_file: File, mut f: F) where F: FnMut(&str, &mut TestCase) -> Result<(), error::Unspecified>, { let lines = &mut test_file.contents.lines(); let mut current_section = String::from(""); let mut failed = false; while let Some(mut test_case) = parse_test_case(&mut current_section, lines) { let result = match f(¤t_section, &mut test_case) { Ok(()) => { if !test_case .attributes .iter() .any(|&(_, _, consumed)| !consumed) { Ok(()) } else { failed = true; Err("Test didn't consume all attributes.") } } Err(error::Unspecified) => Err("Test returned Err(error::Unspecified)."), }; if result.is_err() { failed = true; } #[cfg(feature = "test_logging")] { if let Err(msg) = result { std::println!("{}: {}", test_file.file_name, msg); for (name, value, consumed) in test_case.attributes { let consumed_str = if consumed { "" } else { " (unconsumed)" }; std::println!("{}{} = {}", name, consumed_str, value); } }; } } if failed { panic!("Test failed.") } } /// Decode an string of hex digits into a sequence of bytes. The input must /// have an even number of digits. #[cfg(feature = "alloc")] pub fn from_hex(hex_str: &str) -> Result, String> { if hex_str.len() % 2 != 0 { return Err(String::from( "Hex string does not have an even number of digits", )); } let mut result = Vec::with_capacity(hex_str.len() / 2); for digits in hex_str.as_bytes().chunks(2) { let hi = from_hex_digit(digits[0])?; let lo = from_hex_digit(digits[1])?; result.push((hi * 0x10) | lo); } Ok(result) } #[cfg(feature = "alloc")] fn from_hex_digit(d: u8) -> Result { if d >= b'0' && d <= b'9' { Ok(d - b'0') } else if d >= b'a' && d <= b'f' { Ok(d - b'a' + 10u8) } else if d >= b'A' && d <= b'F' { Ok(d - b'A' + 10u8) } else { Err(format!("Invalid hex digit '{}'", d as char)) } } #[cfg(feature = "alloc")] fn parse_test_case( current_section: &mut String, lines: &mut dyn Iterator, ) -> Option { let mut attributes = Vec::new(); let mut is_first_line = true; loop { let line = lines.next(); #[cfg(feature = "test_logging")] { if let Some(text) = &line { std::println!("Line: {}", text); } } match line { // If we get to EOF when we're not in the middle of a test case, // then we're done. None if is_first_line => { return None; } // End of the file on a non-empty test cases ends the test case. None => { return Some(TestCase { attributes }); } // A blank line ends a test case if the test case isn't empty. Some(ref line) if line.is_empty() => { if !is_first_line { return Some(TestCase { attributes }); } // Ignore leading blank lines. } // Comments start with '#'; ignore them. Some(ref line) if line.starts_with('#') => (), Some(ref line) if line.starts_with('[') => { assert!(is_first_line); assert!(line.ends_with(']')); current_section.truncate(0); current_section.push_str(line); let _ = current_section.pop(); let _ = current_section.remove(0); } Some(ref line) => { is_first_line = false; let parts: Vec<&str> = line.splitn(2, " = ").collect(); if parts.len() != 2 { panic!("Syntax error: Expected Key = Value."); }; let key = parts[0].trim(); let value = parts[1].trim(); // Don't allow the value to be ommitted. An empty value can be // represented as an empty quoted string. assert_ne!(value.len(), 0); // Checking is_none() ensures we don't accept duplicate keys. attributes.push((String::from(key), String::from(value), false)); } } } } /// Deterministic implementations of `ring::rand::SecureRandom`. /// /// These implementations are particularly useful for testing implementations /// of randomized algorithms & protocols using known-answer-tests where the /// test vectors contain the random seed to use. They are also especially /// useful for some types of fuzzing. #[doc(hidden)] pub mod rand { use crate::{error, polyfill, rand}; /// An implementation of `SecureRandom` that always fills the output slice /// with the given byte. #[derive(Debug)] pub struct FixedByteRandom { pub byte: u8, } impl rand::sealed::SecureRandom for FixedByteRandom { fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { polyfill::slice::fill(dest, self.byte); Ok(()) } } /// An implementation of `SecureRandom` that always fills the output slice /// with the slice in `bytes`. The length of the slice given to `slice` /// must match exactly. #[derive(Debug)] pub struct FixedSliceRandom<'a> { pub bytes: &'a [u8], } impl rand::sealed::SecureRandom for FixedSliceRandom<'_> { fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { dest.copy_from_slice(self.bytes); Ok(()) } } /// An implementation of `SecureRandom` where each slice in `bytes` is a /// test vector for one call to `fill()`. *Not thread-safe.* /// /// The first slice in `bytes` is the output for the first call to /// `fill()`, the second slice is the output for the second call to /// `fill()`, etc. The output slice passed to `fill()` must have exactly /// the length of the corresponding entry in `bytes`. `current` must be /// initialized to zero. `fill()` must be called exactly once for each /// entry in `bytes`. #[derive(Debug)] pub struct FixedSliceSequenceRandom<'a> { /// The value. pub bytes: &'a [&'a [u8]], pub current: core::cell::UnsafeCell, } impl rand::sealed::SecureRandom for FixedSliceSequenceRandom<'_> { fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { let current = unsafe { *self.current.get() }; let bytes = self.bytes[current]; dest.copy_from_slice(bytes); // Remember that we returned this slice and prepare to return // the next one, if any. unsafe { *self.current.get() += 1 }; Ok(()) } } impl Drop for FixedSliceSequenceRandom<'_> { fn drop(&mut self) { // Ensure that `fill()` was called exactly the right number of // times. assert_eq!(unsafe { *self.current.get() }, self.bytes.len()); } } } #[cfg(test)] mod tests { use crate::{error, test}; #[test] fn one_ok() { test::run(test_file!("test_1_tests.txt"), |_, test_case| { let _ = test_case.consume_string("Key"); Ok(()) }); } #[test] #[should_panic(expected = "Test failed.")] fn one_err() { test::run(test_file!("test_1_tests.txt"), |_, test_case| { let _ = test_case.consume_string("Key"); Err(error::Unspecified) }); } #[test] #[should_panic(expected = "Oh noes!")] fn one_panics() { test::run(test_file!("test_1_tests.txt"), |_, test_case| { let _ = test_case.consume_string("Key"); panic!("Oh noes!"); }); } #[test] #[should_panic(expected = "Test failed.")] fn first_err() { err_one(0) } #[test] #[should_panic(expected = "Test failed.")] fn middle_err() { err_one(1) } #[test] #[should_panic(expected = "Test failed.")] fn last_err() { err_one(2) } fn err_one(test_to_fail: usize) { let mut n = 0; test::run(test_file!("test_3_tests.txt"), |_, test_case| { let _ = test_case.consume_string("Key"); let result = if n != test_to_fail { Ok(()) } else { Err(error::Unspecified) }; n += 1; result }); } #[test] #[should_panic(expected = "Oh Noes!")] fn first_panic() { panic_one(0) } #[test] #[should_panic(expected = "Oh Noes!")] fn middle_panic() { panic_one(1) } #[test] #[should_panic(expected = "Oh Noes!")] fn last_panic() { panic_one(2) } fn panic_one(test_to_fail: usize) { let mut n = 0; test::run(test_file!("test_3_tests.txt"), |_, test_case| { let _ = test_case.consume_string("Key"); if n == test_to_fail { panic!("Oh Noes!"); }; n += 1; Ok(()) }); } #[test] #[should_panic(expected = "Syntax error: Expected Key = Value.")] fn syntax_error() { test::run(test_file!("test_1_syntax_error_tests.txt"), |_, _| Ok(())); } } ring-0.16.9/src/test_1_syntax_error_tests.txt000064400000000000000000000000071352331573000175230ustar0000000000000000Key: 0 ring-0.16.9/src/test_1_tests.txt000064400000000000000000000000161352331573000147040ustar0000000000000000Key = Value ring-0.16.9/src/test_3_tests.txt000064400000000000000000000000321352331573000147040ustar0000000000000000Key = 0 Key = 1 Key = 2 ring-0.16.9/tests/aead_aes_128_gcm_tests.txt000064400000000000000000003127401352416253600170410ustar0000000000000000# The AES-128-GCM test cases from cipher_test.txt have been merged into this # file. # The test cases marked "FAILS = WRONG_NONCE_LENGTH" would succeed if nonces # with lengths other than 96 bits were supported; i.e. those test cases # describe valid outputs for the given inputs, and they are only rejected # because nonces that aren't exactly 96 bits are rejected as a matter of # policy. KEY = d480429666d48b400633921c5407d1d1 NONCE = 3388c676dc754acfa66e172a IN = "" AD = "" CT = "" TAG = 7d7daf44850921a34e636b01adeb104f KEY = 3881e7be1bb3bbcaff20bdb78e5d1b67 NONCE = dcf5b7ae2d7552e2297fcfa9 IN = 0a2714aa7d AD = c60c64bbf7 CT = 5626f96ecb TAG = ff4c4f1d92b0abb1d0820833d9eb83c7 KEY = ea4f6f3c2fed2b9dd9708c2e721ae00f NONCE = f975809ddb5172382745634f IN = 8d6c08446cb10d9a2075 AD = 5c65d4f261d2c54ffe6a CT = 0f51f7a83c5b5aa796b9 TAG = 70259cddfe8f9a15a5c5eb485af578fb KEY = cdbc90e60aab7905bdffdfd8d13c0138 NONCE = 9d987184c4b4e873d4774931 IN = cb75a0f9134c579bebbd27fe4a3011 AD = 7dc79f38e1df9383e5d3a1378b56ef CT = c6a899758b6c11208241627c8a0096 TAG = 7525125e650d397d0e176fa21315f09a KEY = 819bc8d2f41996baca697441f982ad37 NONCE = 08b7a15f388fafb16711ce19 IN = 9b1ddd177d2842a701b794450e3c81f151f195a1 AD = 277c372784559784b0e047c6f8b7e9efb6f7491e CT = de9b9c8fe09f705f558c62dc6d40b75e3aa625b6 TAG = 52e2d2f153a4235eb6fac87ff6b96926 KEY = 682769d52fa0bfeaebe0d0c898d3cda7 NONCE = 6af0738b249d09547837883c IN = 3461523cd98a6e8bdddd01150812e6c58d5cfa25d385cdbbc4 AD = abe8302d7d5595698d9f31011c24d4d180a637597098361354 CT = aa3ecb46b9330554b36d0cf6f6ac4cf5e27bfd5f602da1b3c9 TAG = 0ba547961eba5c58726c418f51d31311 KEY = e2b30b9b040bce7902c54ca7eec00d09 NONCE = 28ccf218e8de56ea91422a25 IN = 483080d7e2fb42580dfb862d2d266fad9fdce7cdcdb1158d415f84b6e269 AD = 9f06fbe67eb2ace15c8011032feeaf72fdf6d316e1e08ef4cc0a176588af CT = 67e1980ced4cd232ce893938e40b0798b17a1692476342e520b480a18570 TAG = 9994185d4329cfa5f4bbeb170ef3a54b KEY = eaafa992ef6dbcc29cc58b6b8684f7c7 NONCE = 1ded022dbc56e9ad733e880f IN = 900951f487221c7125aa140104b776ba77e7b656194933fa4b94a6d7f9722aad51b2fe AD = 863ceb297cb90c445dbcf2fcffe85b71db88d8c935158f697023e2cea103ec39766679 CT = e0b3aaa890e45f1c39ad4f13ba7592f5251d6a02ca40fe3633651b35fba74a579f48c5 TAG = 5c95fd941b272bafbd757553f394991b KEY = a43859049b2702e8807ac55b0ad27b0e NONCE = bbe8c571342cac7fcc5d66cd IN = 8673d6ee2903265c92446ce110d5bb30aa2dd1b1ac5558029f23974acb8a2fbf4c74858fc73d6104 AD = f77c998ad3ace0839a8657e350bed15ffbd58f152a0dc04ffc227d6beb5738ad061d0f83c2a26999 CT = 40e201a513979b093637445275b2db5ed4cb1fa050af0e20e43b21af6bc56dec654541e55b295b72 TAG = 41bbef45727d19ee544fba5b360312f0 KEY = 68fd608c8697243d30bd3f1f028c5b74 NONCE = 319a210b33c523d8bc39fbea IN = 2c088f38f7a58e68bdd92632da84770303cd1ff115d6364479fb0aa706571f68d51be745f5c1d1b44fa1501cd5 AD = 1417a65249b85a918622472a49df50bdb2766aae7bc74a6230b056549851b3c2f0cef727dc805ba2160727fbb2 CT = 9d376b147620c2ac6a5eaa8ee44f82f179f61c9bc8acdd21680a7ff03acec953437a3cc9660c7ecb1204563944 TAG = 05a4fb5be11e3edd89e34d0b7132d0fa KEY = 6edd3bd2aa318f78b4a51103cb08d489 NONCE = ef0027b144691bc9716fbeca IN = e98f2f99680dc748fe0b57390df38a99950faaf555a888d463d005ef4e4b1c22663d3d3daa812b20ae35ac934c2e187cbba7 AD = 97337902507391de0f15c88462aa5ffc5e4760543850719ccd8a0cfef89484d8095c23ff8c1d06eae4ff6d758c95e65cc3b5 CT = 3c54842c2099b73daa9c3f1cb64bb913c0527955d923510f3f3046df471c1365db97333bc5a86dc7c5f23047e938fac976c0 TAG = 375b2a25421434e5e3a021d434fb2d04 KEY = f70482d53d3ef70cdc3cd3c4a37aeb2b NONCE = e69d3de363e225749cb1666f IN = 4cb68874e69125e1a6f6e68669b48317e1b361d0f7f95ec4cf613b7da2c835832010e8f95eaef4e6800b79bd86cd7cda869d2df258c267 AD = d72975f15721bd0957f5cb1edecaad2d1ef047afb0e779035f777f94cd7ed1bdf8ca9d4f357d2a1e195f195e7483dea1476133235f7e6b CT = caa1e48decbda18e314057c5ec32f8733a5cf03ed0d05c3654531bf56faa70751a6c7f70fbd7d39f7e9775a772aba8fe7731cd0230beab TAG = 47d909cbdd1c7f8b485fc3232bb7185f KEY = 98a12fe16a02ec2a4b3a45c82138ae82 NONCE = 4b3404684825dfcf81966e96 IN = 899710fc8333c0d2d87f4496436349259cf57c592e98ec1e3c54c037bc7ef24d039a8c573ec7868e8ce9610b0404ea1b553ae10cc8cec26468cc975c AD = ea1a99cee666bf56c8c3667ef4c73c2e1e6534800d6e39a97de3bd5d39068bb3e2f74f96c03463afa18f1ee88c21209bae87f37e5d0269b68db370fe CT = 0431b7fc4889ae401eab5edba07a60f9682fe58419d4140cbf4f20c62d79d8a3cc1f23fabead0e96e1c8c90929756ea1efab508336e1d0ed552eafd0 TAG = 01053ceeb4f9c797eef9426930573d23 KEY = 6538e8c8753928960ffc9356d43306b6 NONCE = eee386a2b1e310665e335746 IN = a92eb9a93a90fdbb2c74dea91d273a48efe9582f8af7a4e3a377b114770a69ca45421959fcf36107815e53dc61b7bf018fc42965fb71d1eafce0961d7698fabbd4 AD = c5e572e464718398374c8b45ff8749cd9f517bbd97767f77a96cd021176c49c0acec8b055ef761f49aa6d910375a45b2f572cd5420b99153971a682b377ac88f09 CT = f36353de609d0b5246f64a519d89a4dfcd9d53325a2d2cf910e7692e68391b0357b056b944e0b53e41568f304bea8822f9ff7a0375a5a8087509799226862f707f TAG = f7f9b891089d02cac1181337d95b6725 KEY = cabdcf541aebf917bac019f13925d267 NONCE = 2c34c00c42dae382279d7974 IN = 88cc1e07dfde8e08082e6766e0a88103384742af378d7b6b8a87fce036af7441c13961c25afea7f6e56193f54bee0011cb78642c3ab9e6d5b2e35833ec16cd355515af1a190f AD = dd10e371b22e15671c31afee552bf1dea07cbbf685e2caa0e0363716a276e120c6c0eb4acb1a4d1ba73fde6615f708aaa46bc76c7ff345a4f76bda117fe56f0dc9b939040ddd CT = 049453baf1578787d68ed5478726c0b8a636337a0b8a82b86836f91cde25e6e44c345940e819a0c505751e603cb8f8c4fe98719185562794a185e5dec415c81f2f162cdcd650 TAG = dce7198728bfc1b5f949b9b5374199c6 KEY = fd1dd6a237a12d7f64f68eb96890c872 NONCE = 459ced97ebc385ab3a8da8d5 IN = 04a9709fdc0a4edb423fe8cf61c33a40043f1a585d5458c7512ec8e4e066a0f95e2e6609abf3c95a5d3ae2c738269533855daedd92eca20bdedbbd5677cd4eee84b7a1efae0904364f1e54 AD = d253b829a2fbc5877b0fbe92e7b79f38886a49ca889ae72b91f2c3aebe257a3ffe0d390b5d320bea22d6a5536cd9213612f5ed6e3b0ea33ac91cfee284cb25eaaf6b85b15f7ca894317182 CT = 4a565d3ba4f2ec461c9bd8dd0f96bc00d2a561bfb56443c8cf47681bdf1c61f55854bea060c4219696cac79c09aa9400a7e5c59c6b6ca556f38c619a662905fc5f0e8437b906af6138e3fb TAG = be5f93201d7980af4c5bceb24ac1d238 KEY = b09a4d99112e1637d7f89a058988b417 NONCE = 74348f7126c0cac836e9de5d IN = 6b3c4cfd1eb139b62d91ed5d1d8b0f3b52278d5c48787ce46f12b9f026e3eed1bfbc8c6684c6662f06614c69440b3d7cff7c46b2e4aebaa4b5b89236a3cc75535bc600104f240d01de91e0fb3bcad02c AD = 7883ad259fa5d856ce283419f6da371b444b9b64ea0ddb371b17ec0a9ada27b0eb61b53bd3605f21a848b1e7ed91162f3d51f25481f32d61ec902a7f2cbd6938a7ce466a37e4467e4ec2b2c82b4e66ca CT = 5e1b783b20fd740310333eddde99a06b5740428cb1a910812219fabd394b72a22a6e3ca31df0afae0a965f0bc0ae631feeaa5ce4c9a38cd5233140b8557bde9f878e65e8932b9e3c3f6e57a73cda36cc TAG = 784b73ee7824adf7279c0a18e46d9a2b KEY = 284bd8c4b5d7b16aebce1b12988fa1d3 NONCE = 7ff05007c5d018b17562f803 IN = 903416331583dcbd31420906c64dc76e14d0c5044d728cd9b605b531ddc350fdaadeabe67d08f0b4c7179f82a1044696716cd96459506453141e9ec3130e893d8c2ff9b8b4c241b73866ca4fc1f712d17d7a88bf4a AD = d0a1f92f80094c1fad630ca584edd953bf44cdde404f22c8e476df8708a97a0712e7fbd8054caa7d65144d0be3b30442d0dfa5469ba720afe1d00aa6bb53c79c1c178ed42fce596eeb6c638c8a8dedf76a431976c5 CT = 9bc3708f70a68fc16bcc33099325c821a0ae9a2fd0a6a98382fa21b42ddb3a9ac6c34a13c4805d3beb92586cdf0f4dce3885793d49abce33190685e7009a79242dd93594722a1ceaa44886371c30bcc8312fa2bf67 TAG = 3fd8a4d760d5b878852b1ca2d34dde6e KEY = 6d76dd7dea607a5cf5c21cd44c21a315 NONCE = c1d13e56b080a500f1cb80bd IN = cb959b92e777f835afc4ae4149b190638851238b7b13c9bf65343adb3130e8ad2356101037f30997d4a5fcc0a1d6415210179fdec881236a799f6e90dd43ea3817819b432611eaafd072368b9c7036c7a88c8b7774a8ed986134 AD = 92a2bc3b6b6ca9de0cef10d8bdeaadf6f54782cdb2b09e66cce8cb5b56895636e982f7a3c7bd9d221ade62c9ecf68bde70becf683804386606ab1c48ac764c4e11620064545c5beaa5911c118856dfc5cdb8df50052b01762c6c CT = 522ba9bfb47efc624cd8933fc9e17784919d2b3ccfaeec46af414c1b316355f65b9f9fd7f0be6ac3064b4016e43b8fb2028459f0fa0d81fb6656be0ab8fd841d05d24682b4a57c7c59d89af384db22c2f77ce10abc4d1c352a1a TAG = 5ea4a77381679876e0e272b53519d533 KEY = 1dbcbe45a47e527e3b6f9c5c9c89e675 NONCE = 98f2da8ed8aa23e137148913 IN = bb23b884c897103b7850b83f65b2fea85264784737d40f93ecf867bfdba1052f41f10d2c5607127da2c10c23b1fbd3a05ce378a9583b1a29c0efbf78a84b382698346e27469330a898b341ec1554d7bf408cf979d81807c0cc78260afdb214 AD = 46f1bde51f6c97a9dae712e653fcac4da639d93a10b39350956681e121fb9ea969d9dc8ef6ddfb2203fad7ab7e3ef7b71eb90b5089844d60d666e8b55388d8afb261f92b6252f4d56240fe8c6c48bfde63e54bd994ff17e0bf9380ebfb653b CT = 0d90e869d2f4c85b511fdf85b947ba3ab75c6b1845d8191634770413d7574a6fbd9d86897cb3d3b5d3d8e6f74fac3bd2a9b783cb16cfbec55dd7d2f7fc5c39fe85d39bf186a3fdd3564bc27d86f4019ae0cb73f5f516b602331433689c1b08 TAG = 8777f2002d5a5214a7bd8ef5a3ccfbbb KEY = fe33f47136506e5cc14114eb62d26d64 NONCE = 9534a10af0c96d8981eaf6b3 IN = 3ca38385513eaf1fcd03ac837e4db95c0ed1a2528b7ab3ac8e09ecc95698d52b7d90bf974bf96d8f791aa595965e2527aa466fb76da53b5743eda30bb3ebd9f6a8a7721fbfe71fe637d99a7b4b622e6da89e0824ac8aea299ea15e43250d2eccb0d4d553 AD = 50b7bd342df76bea99b2e9118a525c0f7041c7acdf4a3b17912b5cbb9650900246ed945cfc7db2b34a988af822c763451ac2e769ec67361eded9bcab37ac41f04cdb1d2471c9520a02db9673daaf07001570f9d9f4ac38f09da03ff1c56fdefe16a855ac CT = 927fe3c924d914a7aae6695ddad54961142b7dd5ff4c0ba5ca3e0cf3d73bdb576afd59bd2b54d820d2a5da03286c124507a48008c571c28a0ce76f0ed68dbac3a61848e7e2162be8e0bee8147b9bf60da625cdab8601bfb37dfcd165f533e94a32c26952 TAG = 9bd47a4a2acaf865a8a260179aabf8ad KEY = dec1b34b7b81fb19586c6ec948ecf462 NONCE = d9faf07e72e3c39a0165fecd IN = f7b0bbe9f0ff4dcf162792e9ee14d1ed286114f411c834ad06b143cadbbe10a6fbc86f6664e0e07ff7c6876d4543e5b01ff5ddb629f896c30c8cefd56c15d9f24dfd2ed590304a6aae24caac5870ddafc0e672ac3aacae1867891942998c712d45efbfa4d99a8a6f03 AD = d3c4fc4838cb3cda3937455229ddaf1cb9102e815cb9f519a5434677c68b11a0bae1280faee82f1a5bee593e669e6f81d5ece3675b8af63f1491bb298531aacc940f53678ba56ae96fc66be92b904bc35f2d5b68b3ed98569a4d04e8f8a9689ad9fa4b51db0938a9f3 CT = 2f44ecf549077b98ba551819538097bb80304a55c48ef853e20ed8c3f808dc8cb5eb41c2463d19fed2606b59cee4b458958ea75715f7654146df4519dc63524a0569a00d7bbc4b32a372f82d955be5f190d09d35c267da1017e8b16096ae84f8a671b45aaf0d1ca59c TAG = bc3af80cf9388d35deadecff5455d515 KEY = 021add6030bd9f3fed8b0d1f16f83783 NONCE = 4e460f51fe6b5eb9558c4571 IN = d9aa1d0db5de536cfbacb59bb75c592ae3f34a5f9c5ff4f22d14e8e4bd0754af19570221893797f60c89a251cd6a19c2953662dca51264afc21099ed5c80077b0e10a5295b3c4c6fe47d3c1c84fee69ebf7d8a7d9b1b338dae162e657e6cf5277ca70d47b9290aa7efe67b0ce574 AD = 38d99cfd7578d40ffa1749d5fe83500362ceee76c5af38935806837b2f2d1b3422a5057bf617b07868dd95d8e5f4a24e74f96177d53a0275450b429a2b1f364805030765e376151ae35001d6a4872200142fdce82017f3e976ab0edac1a08d2649d297648320e7dd9143b554fa3d CT = 8863ad51578fd1c9dc40702e34236adee885955f0478ad9a094a6941f95f900e466882dcd5b86e1563ba89aa105f56f3ba5ed860ec3338ee1b750a2f9332acb3f0f61718de7e40fb80442d046b35f147f178bd05362f0559a20a53ebbf78e920fe14c9d80d1c9fb21bee152f8ab2 TAG = 614539247fdcf1a2aa851102d25bb3bc KEY = 311c2045d5486bfadd698e5e14faa58a NONCE = f1cd8b373cec6451ae405618 IN = bd154e428369aac5c13128d29bd3031364939abd071c34bacac6ea7292b657b794b2e717d9bcb5d7d01496d805283fffd8f7de6a3493ddd8d1dd7f58835a44d43ea22d95468d1239ca5567d6c80bdf432fce2afc544a731a2852ef733667b9f8f4f8923eaa9de3aa32addddf99b607efce966f AD = f70cb7e67b2842207df55fc7582013bbddff8c7f3bd9ebbaf43827aa40f8490e65397934ee6a412de6272cd568566ea172789a006a92e5920140ca5f93f292b47dc262cefc66b75543f94365c08795b7c5e9c6c29b7dc67b2532fbf8a6487d40a3eff504e75c3f2bb2cc3969621028e2112e67 CT = f88f4ef0431d0f23911aaa38a4022e700d3a33c31e0c7bdebe00f62ca3b55d358385de25ceb0538242871eb9c24530e557d7981fa0182436e1e49272d52689541f09517fd147a8da0f0d2bb32d54911a36eded0b87bcba54d6842edf461b45839df1cab5176e2c82c871b3be4ec1bced67ec5d TAG = ae8d847f106e914ffadbdfe7cb57beba KEY = ceab57de6220b2c80e67f0c088e97b36 NONCE = 8cf438aeb0cb29dd67506b9c IN = ce2a7a5663449cf6e0068085e3c373c5ca6f027544e327bbc09ac00f1571268bee186d51a00bbc16da7429e4d3d5235d8d54ac96b6ecb2fb7d77a6e5b9e70d431dd4dce78ceb972e9e4b63059e350efaff841c2c42bc29c139b7fd070097556b6281b58e074d5271d9f66c6744ec6dd3b9db2f4a21aeeb7d AD = 03e464d111ac9228d39d22a00120c6ee671fe5bbf462b1ee3fdf348b34999518998ac4e175ed48189c29b49b5527c27c43094eecbeaeacd3cdb48cd15aa82573e884a7b97bbcdad610a6955f7d8b04f6f98a13a907bc2bec4c940b77582b248f5fced1771f810977b2d0a4fa48bd4d78e4bc383bb92743fd CT = 1fa9c379c78b92fa3c1e478443ae38d7b4b50235448ce2a88467514bc9db95844ec1baf4dbdbd1b0720e377d05d82c3b58b52af8c9c50417b39ad225e373c7ff18ac5a6ea5d182b255f1c8a2766e31e3e4e3d55dc08dfc64b818ead40a0e824b06ab24f0dc9f4f0c383db7cd4d40016b31701bb401b126dd TAG = a9a885578467430504731d1a8f537e3c KEY = 585bbac0ab4508afb8b72d84167551aa NONCE = 774c82af194277a5506e45ba IN = d788112213d2b8b5b66b056e8b3e344a7876f6193b59a480c51fc04d3ec2e5166344c833187b14117276fd671a20937a4553181c29d3d85afe385dd86093708226f082a2ea4ec3288f372c772ca7ceae86b746ff428e8add17b0f34f8553e3db63f55224c39edf41f138a2c28be49d56aa8b4c93502b9794a16310f78b AD = a29665261a8eb58c88803bcf623dd1a14e76af49ec5db72a267f2ebcbc479385fb6b32bafcb1239515d74a8282b228e83daf282d1ab228099b315bbed0f0e6b3427e029cc28c025460a8bf0914bd584c13e7de7830ab77fb4a9258dfdc9fdaa96ca941546477f04cea19a365a27de34e23e154e7419aefb0be0e871bbe CT = 24f2856e4e40c0b2b8b47e43d94c1faba498884f59d2ae1cdf58c73770279c96feeee3025ec698cd8f0ae25bf0c9fbf2b350674c317e52bad50aa6ed9845e194f294eb71ff192604af50ac7192f308583a3edaf6c7aeb588990be81b801dc916ffd621dd4016e2b76e9078c89fac9da39f3a88f6548006a48b0199a732 TAG = a5c8f9daa30b045bd3e1c1b01f438518 KEY = c5d727d159dd328b4160ff45a183226b NONCE = 881c0802db519ce1595573ff IN = 88b4be77bb8a2f37bc5e84ef9da92a4b8c3777dbcccfed13b97e93c19674c8c3f13119363ace377a14e5f36501ba9a3898fc09340886d91bf0a17ef0d028f2a92ec150071623a4a5db8e56e99e764629679943ea879ec7634fad1480e8617fe834c26210276d7db208b13f9b4c2060f2867aacb1b47c8e110830beff721dd8d120de AD = 5f6513ad3d490f784dd68ca1df41e8c8e1ab9a240ea8e9bc22d0b1d7353da94d5d37c94f0dcd1a2dedd6d8e1c79a383e7e214cbb6ee2ccb7c6d894ffce5d01b6cf13876ae2648d36adccd88710d7d2ab6d43826d37ee0ee3b434972a2cb8f4db1c3304cee0a352bbef76f05de0e6f55a410eea5e697afb197f2483f0200d0abee224 CT = 66bbee209eb11c675ecd3303c38cf1087b010c532e1357732c4911ca9db78c67805c95c829194cd413b635a900a08454c6eb9cfa3597ab531fc9ddfdc5b02b290be2a618df7d03b1ab465d6d03e8b87a430bf4e80d8cb9916145cf2d2342a91fc79defa151b1f3c695608e76ca2abc4c0383897f1cbb9d4bd9969b2f33813e2b5502 TAG = 43daa08e6eac70e3238ce655adb65005 KEY = 16af56326046c92afca49fe173d643ad NONCE = d32a935b4e56472d92d9f2ce IN = c49c8e5769670384d23d9af9834026395d3f3bd32d88e61ed06b2e00e52a5ae4fe3867993c2af95203cd4006470a89677864431fb9edbed17412913bad4bb3eaff0fccaa150c9b13f83b9bf06698af844841a640d6f94d845296638ac27fb5ed87c310dbbd36415161310b284b8f84b4e025267906e0a4c822b76a682d44a70f9afde9bcf48ac2 AD = f713886f4086026779a7e479fa646cb33574e6c977d70b8da49c8fdbb395dc7c149a59e219db8e4fff053cb00e2a1df9850fce94e52fd34661fd3d4cd8ad3ffe0b4bc7ccfbbf42eeef3e30ce13cdfd77dbd067ae9f5aebfa068f6b7ae2c17ad956dc03511dfcc38eac9fa3c0c0e9a340f5c58e39d868b77dede54fea1173216c0bb8f0a6c2990f CT = d5d7d1ed0ae3e3481e2ccee201857ce1f427734fbb4fbe82a2b90601104008b8ad4daf74514b8ab3e42b6f6b509159ca04489b1175ce1e3fe33d36ea521e0aedff8c69fd00aa588d7a2eb9d2d551e2b8fea321f573e2a1df147535a873d540a3169d3ebc099ea6c33cefc04a2d55dc2d47237b95ad269fcdcd3c3750af426beb4edfe7837b413f TAG = cbe0fb9509c224bb0e8e33f7ef9b49e6 KEY = b3df227e6dc2c846095e2a3b825d7645 NONCE = 578bc24ca3845e23204df661 IN = bf69be81cf0b340b006badc9f644d10376f4f9a7a78c997edb8729e3786447f21e97e4c1e0c0c74e01ef655d0a84ffc04ff7c6712ad65adc9a0da2e3078d4c9e796c9bcd71e7a9da26b987990d366b5e00a23a93652e10942e07a6aa01375af27080c9cbab5f554497abc48260937a6fe895361e79cd3d5e78c1a65c6723d4a4fbe9b3dcae3c05699cf6d3fb AD = 00898eedad307fc017917a3296bcedabaad8a505edd34e93d92f3b61797ddccf3fc31144ef70f255be3b0c165c97eb8706f14c495f4aa9b3f15d2dafd65bf6741d67fe240967efbf0e75e610db9a8f722035e039b5e9246d258084a04c12ee8ad1668032f8caec737481fd894dba2ef702d3e6089acbb0fe0bdd6daa2a5cd47fc62603499fe3ea37365072e5 CT = cfeb249551a695ddfec5f789e7f0a9f916abc8ee01d6233c32744c10a09b5b19ff9ed15e9f10de8f93c8ca1ae3c34e26fdbbb7f3b0f5f8b064501830d3cc982da99b294ce51bd33085c98b0ac0bfe44a8f4a5a26511afa3461aa88b770f076fe119ec90f33d8c9e7777f30b8cc95864f06e04dd8e328ad7a2c7dab83b03abfdde065bcd0c7d6dd47389108c4 TAG = 3dedd1054f1a29286a51817264317b83 KEY = 58a57f04d1d5cbdd1bfbe01dd5f7e915 NONCE = 47affabd7dbb4cce76661081 IN = 5f82d481a6a3856c6f0be2aca54d666f16de88294a4d763134dd51ef03661bab45da94b9871d94e5b574a52214b22c92cf9690ecbffca9b108fe796abed9e608778c0b99d7bea1daec08dae89d5f7229c04fd52cc906b5f5b9fc0f0fc1e0b2272dcf4865286ee22bd9edcce1afadb579ec72cdf6038cfc75c2dbab5a1fd64b6f8e200d1ad0afcf25863293fdb7276648de AD = 4b662822b48005fbd85bb99e6a946eaa74403909f646d914a236eecc5f4558b60b2efb1584b1f32d936b90428dda6568515801d21d24d6fb622e6463897c70be01f81fef741d6dd5c6556d163c3f048abe49f21817b41850ce79d7ec1fdfeba32935b58d898e964fa4b36f79c0f1f560b0afec3887ab325e1a025fa7662f9baf8e08a9ee714b8369621a2f1e6d2e96896a CT = 31ab08ce0aaa883628f4b33369e5f6e5a54ee4a6596f25ecd54eeea30e81b41d357cb6c671adb6acd3d4e6654feb2ab1f3259692502efb33c5121e0852cbcb2dc5d9a4c65752debe9c4bf5e995fc909a2881621d46cc220806703795e61c0fe74c99e3c1230521b1f97bcbf4e95326e2d581f0cc879a2fc06ef88226a4413f9e9985edc913c418cc198c4df13cd46afc24 TAG = 1e54066c6cc37f35c62b47426b609457 KEY = 64011470970333b7b677d4ad8ebf3ea2 NONCE = 17031c5133a426d96de93123 IN = 882cac1ece2d22a1db7f8339332379eb68516c8b7dcb3c089a5bfecceb49f48a169215313686eb5708135f379d89962af478cae865841e0c97ab47a57a456f634282c4e03c99abf7f7cc4e8360deb48160288f06e96cb09114877f9d91dae98828285626a1528aac87f39cfb8ad3db344fe4318aeef6f6ba14bd1edf9caab548c09f8eea091229a90dbc4b0fa34fda2bf13d300a1f9c AD = 0394bb920cf58806b909d90c046402c745f6876af85d8a281081e22a1908f8475126594b39a0e191a070bda7c78d30dc4867e69ea522cfc962fa5f9915daea9133e998eab22f32a18957a3cf7d91c6f3d54cea94875d60be694ee841fef01e69bf5997ba4f25e846558431eb592605265f235211c2bb2d4807278f4b9c314039d0768df24e9c098c6a01c689d6a143073fb1a29f4400 CT = dd347d6a3d4a71b2bcae0a0c690ca311f012c6ceda4f7fc054b8f9b59bad54237b64b93331b99f1305801640a68e7d50cef581a57ff2564c90995a8dbf57fa8cff046d0b946af5f68e0aa3d73262965622fe6d35c78f949a6cf9e4f62ba71accbf403b690e31f610305faa6737a19efba1e1ee97084cff2d125bd69a5a4ff99aa399df650452daa835b3e54114b295f00d94fc60e2f8 TAG = e5e72cda6755bfb3a44377945adb5ca1 KEY = 4852e546fdea545d7dd12493a687e895 NONCE = 7a3e136cd961191570c1b0b7 IN = 30c10d7a63b614bcae1b79b07c252dc55f322554ac34ca664910fe4a0c9a33e30698e124d91cbb55cf34e931807cbe591a87667f2284c1c18dacd108163aa7a82e274ae659c4ea144191e3fc0f82d4cac929969a50b98ed9fbee52cdf465a1f0535d7d7df15a9a6eff3f4a14e254571cc47f82716d7a835dfa839213677c4da8c8623517244891993ad5956f65d318d9bba16f1eb54d2974a741ac AD = c5ded7f545d2eaccbc2cf5cbd1b38b0ec3b6bbc054ba25a16efdd448e5a47b0085974e469c1b0df22441340170d6677f5158e4ccd71446d7ac73dcf5fcfe4ad7248c4ddcfab4c8ccab0968d74d66d9c9561650eb98c088d87766440fc9967e8463febcd12ed07f7e44fef47cabf05274002d0014c4e31f230a41171868db68bf5a83c902724397ed181dd8c6768a898e0c78f6aeb886df95442e99 CT = f798de4998683da7fa9ca030a23dbc493f36c48bb52cd1113c3ea97ef2b67433c00195000777fa3b75a3f689a66b148159524a1fe9576587948760b279cda56164a23748564ec66ea51368ba2a900c97169eb33cf1e557f46100193575737dba670175035f0d921675d45415c6591cae079698e6b1f74e82d4b9216c20e907b148a1d514b2cf653d2e4994f7f668dcfe88dc49c29c544de96d8dd0 TAG = 3663fb2672223154981b4c580ed3d2d9 KEY = a65b520a2ab67a24fb8fc669c41f2753 NONCE = 3bd6c7e8d29242abecc4c108 IN = 9d1559d283f7a38847088116f2156b19a8feab0731f04d0d499c6b0d21b8563a89a9c284230c1298b28a622cbdd38dbceb098ab896a7259caaabfcc7b0d9ea797178c18aaaa351c7f516342dcb9d3e91405882c8faa9a28f7c67f3db8913b31c0dcd56472d8ebbfb20cda2896a66bff2706b12ae0d9bc8c6c123c02f1f0bbaa418c1806482423eac72d718cad0dbccd208eb81663a9d9043d6ae7a52cf32b1fa AD = 2538529cc6eec03f70df2ab085027ce015279484981422f31e58aeee31e79703d72752af2b8822dce9b385f1530f19e692e00e20ef973d333f4bd585ecf122bd4ed9b0626cef46baff0302c71411d27e372361f36c7245096faff21f0236f3dd675646760d5687b3cf1544dbcaa863f1267bce04bca976616b890c7c6ff3448d16072c3938f9b62377609950ff7818cbdd21fba2560bf1954a93517962181b18 CT = c3194fbb5c319a94c0f61c432a730ce7611a005cfc78266ac4e5d7c95351e71d613f06f52d9d008b9d886f4d9a57bcc232d47e0c75ab755dfccc057a9c7558d7fb696a8c29843a8b9199e2406d23cd6507d35a872fa54cb95e2cb9af45405ebc6b6ee353e8a80debc393329bb9499c61c6344a6380c118f30fcd76376a9765517652e1b21ecafa63c0d19c1875658f1eda89c15ac2daf1a6f526ca72ee792a4f TAG = fc16cd532c926ba01e2e6b15327bfb3a KEY = 84215d2c8f86e5b7bf93cb0620da6bb7 NONCE = b35e99ce89dffd1ec616ed92 IN = dfe500919f97713f6d9c4f53913175b162b8b7587d85d5b63f0cd5f51def23119e2e02c224142ecfba7f0a519aaea3c28be20b9c2a9c98eb145afd4db523b7f0b822e67dad630846b2a192bb146dcbeae00198c81b80c290d881125c24a6b01ec901b8912bad5b081ec7d97d6997b33052ec287f692489df928ce36cba1e3d6a41cf10c697a9e1f4aaf75dc5be054b98965ec3ce173be7e127c4c5387048ae6ab5a8d247f3 AD = 6bf6222e64a46c90f83f47305554d090bc8d3838b7a856f0e5e1d92c4e7231eda6af1d9eb7ff6ce914f2256a3b0c853453b9bc75e46109cf8d7e8a9dca224e022d3d1a139d00476775622799541edf9d53eb645a40f6d98ea559e181d96e4df0141e51fe067542300581c0424f534d2c2e3b1b27153c0cd496a1c03301226beeed2b5cce0710d1f485e68b44a918b63fd8db610c7ff894514e272b6ed7ae33a38907e0698b CT = 6c6faa54df62ba5659d45f64a5f014684138c93bf152da8a495e9d067b13a30b9fb84847f56231b2da4d87e6cd509a3e38a9ff47589c627e5b5a1196e27fc7afaa14a8432c2d10d8fbfd5d6d394e4b947c456420708a76c2aa638df7de119c160636fc8dfba32227c5de12e5ef429da933ab04e77b489f2eb761d0c753738647ad6793cad64b8942f621ac67b13bd0cab106ffeff21f24c79de69424e50ae550f2241d4029 TAG = 202b232472d050b9bbc68b59a0c02040 KEY = 7c02b6bc3db61e23736c5f36faddd942 NONCE = b958decc680d5f79ea7b8632 IN = 7e5992ed0474f4224b8da1d038eeb78413fc2f9614fab7120043e75986a4bf1114a80703780a149fcc8dfd115b768f45917065c85176a3f00be40b427fe3765d3919a5b741708624e29bcae876d251fd46dd8d36a8ef66f671c25f984761cf7f75f4329de7093937cdabe32f130b77531ab1aa0a1bc38fbe2758c2664eded828b2589fc5c34d9a0d57a5a4463163736f419b65f0543f50207fff4cf1065a551bc00ffe9466538b673b2a AD = 76e430fce1a7d8340104e6001f1c2048d457ac335c5453e48727244b75c3c4f04f55afbb5ce55ba6f8632dbc168ed715b83968a32e5b8e91cb24abc9efee6dcb7a8bed9394a546f0b9efc5823ecaa192df061eb41c671bd863498c2130f322074a711ee43791a1cc02b5cacccf25119ecdd99233abf3b131c83ddb8c62c93a0d653e91499e7481303adc8dbac615ec464eb8640ea138f6236b0ee31cea060f97ea9145a22d15e28eaf6b CT = 14cfd190ae0521f94ee6b36bfcc403139782bfac3d33fe95c81f53e83c7d0c9a8fdebbddd79746b550a383ece1b5c93316b2fdf5aa36b4e97f739f78ccd2de9963ee7fb4d77b581cf676bb679b2dc4a48d977b45564f21181dc60ecee84d736f2324196c20327495d18973660ccb5dae69b79853d12e48ee0706c8ed821b7f722e46f35c8dee2b7b55ebee01dd3ea1e8ef80493cab6b27c264a67596cee06c15062e3a96b140d0d9ba38 TAG = b6c47410e6f4a2f2b172c6a4490732f8 KEY = 1f58ccb33649d0dc91c50f2aedc95cbc NONCE = b3a392b1fff0157e95f82a44 IN = 738e04dc5a8188d775262c2cdaa04468844755dc912a4edf9db308efb3c229b8e46b2b34aee2c6330219bcd29d3493e3cead142cef5f192b043502b8a4cf0419f9b3f5e001a640541c84141e36d585b05a2f702356bd39bda518c42b461564326969983d22c3ac5a2aa214807ede803d57a61c9547505dd7e08402cc43e6ed1574a48366cf5b5573afcc7aa3c4d4721b362d20a58cbf251315f2b5f9e2c97c5ef6bff44beaa5004e5b7c7f28295df2 AD = 93f7f5054605edc769efc30b35018ee6c929a83bc6454352c69ba9c72e4b4ea6f51c9ed06f314b5682be6a701c719087765d0a7022e5c9d495f28a9053bd435b8b834045c3670856149b08dae742b372a15a0184375d50eb09877bf94f63859e64228606791c516e76c5695a4e529b9dc5f76eff1d4641a22597e4460aea4eff107348077d4ed2d6262744b0a2d6610f25264d905133309ace10bb52f7138674c25e5d43ededbd87c13dc8fd9d3b1b CT = a002b47b18d1febaf64842fe9011484d618a2e855c4efcccc7d08f02dc9b53d0bd4fc8013e01e21fbf2d9bc7fdda69e68be0c06d32003d045dca6bd251c0bb8c2cbe3693b252265c8694295772b767f83661ecefd57353f6f1c442f9d21ed98c55cbe1db8171ef7b54fe3e3a1a253b4dd48416b5fbc7c18d73692e9fc90dc75d4b88de1fa47c9ad33ddfa4e582d3fc61ca2a8b1eab898b9992c8e56d170730454ca50cd4f28d2759388cb8e302be10 TAG = ac502a9a52fb3a68a7e90dc639c7ad42 KEY = c67510714f556ea1744af9207917eb60 NONCE = 71b347a21653cec3d113087a IN = 7040fde3513cf7f1886d7be9c0f371a3b75415e94c3bdfbef485081199bec4494beeee76dcea05b6601ebd4c8fe231fa16d3b0f046eb3e9c9ed8baef25bb0ff6bc85469b2eb41b929fe904735f819b241b01230c68c0b61577899426bf0dd30e085cccb4ac290244d8c1cd7514412a3ebc51aecb6bb4be1a5a4a8d2ff3fc99191f7d7d0b44fe2cc4ec34deccf901f54e3dbe19d2dfe663855fa9d93a01ab14faed7f00c14834f63e1d153441c6fabb3cf22506e8 AD = 6d28b410c788dba025c387f5b94c0bc392c69ef646b9cdce53dc169326359de26a721703d9a7c5017631a469da13b2d9ad9115de7d06922ed6f093792ac25ae2e27993ad6be5217dc4f6c51e18f230d4eabb01a474704b71b1407d9cff921bd98e28bb60c4fc019b4d609667c747e83eef779ee62000b6800ba2666f415dccb12d43af4f585d3185d66ba2ecf0b0fcddf762445dd1b6154591dd069f03977243b45b113b6f9b110f9fdd96f0b74e2c9843a45c6a CT = f2a2cdb4f890241f44e00b3373769542cc3dd24c3d07502ed162dfa10be9906871051b991f36b2d5c4240df483c2ad704be14b9efe79ca704e8eeb9dc250e75a92ebf5800c59fb9a6a32228fa1121d21e0b423b77e20010d36b9e6c68dbc000f69bddbd521a1f7bbc9d7e431e4e46e5094be96a928c6729293d2d805c468a3993fb7439f192b1142272a78585e3b7fcedd2f7cced52ab2bc42e2521603b89ba7633fa3b4d07d9a314d1159d7bd5b2dc5198b0c34 TAG = 0b386c3a58ad23e9a45f00ae107d319c KEY = 171d25e195bae2eaf666993f3b42d690 NONCE = fc16bde0c69d5c894642f1f3 IN = 8775d6aa2e46ffea6ad4439000a968bcd4fce86535b7265684071a498e0bfb37646f56fad79e0fdc4d6016fd1e935dac5ad74b11c69f5261c3321efdb9cf03f9b7ec681a7f708ba8e3f66648b24c41485a5147df31385809c800155d0d4bbf41d248453302c3754eed4909b267893309ba5249588cb4a4a14b4a29496f1e799559ac9f4baba7a9b4cb5bace1c11dc0e7ef7a2ddd2596c29cdaa378b97c7d3c50db49bcadb8e1840c6b9fa12ad88c0b8152fd753efb04ead427 AD = ebb169a863dd05cffb9deb866bdd130a1c6852046881f3f8e9013158c83bfcbaa98743957ed4b0619eb88d7ff69b3a5d06da74076c3cc2dff83dc0375236d363c0e2b1fb60c9cf10ecc0fec94757b1b719abc7066af15ff9b66788b38083f766d67005369319967995407ea20339ba27e7bf1dc263fdd54ddd8088232a500f605ba825fedfed69cccca75c207b06594d1d0070ed12a259d4f574f352d2e2ea6fa45199213b6a42d53a7c717250715e0404f2fe7b64e3ec7e89 CT = 8694eac2bb3968303f795bf0118e43c132c9dd22ec320ecffefbe878ebe6b1e0833d19515c07ebc83f12cd9bb50d2658e6d7fe44a9fbcc2225e93ed58e1bebd78edecbe6c8b3491eedfdcc957cc8ddc95d8116d50cc50b1999ac420802605cc652134ce51a41533e00fe232344e805df146a952b40ce27a2f5c6bbba2154489ca40cbb617476ce6ceac1a6b9c0175ee33615f252377f52583e970f77795b573610baf5cbf5edc6d2837244f88bc155f71588c9c4c1c802be9c TAG = f6725998336b3ef020b99818e0d932ac KEY = f7db0fd345ca6ca82ec8624950f8e672 NONCE = 3e7ee1a209b1a191f0a00370 IN = fa86869e14df0fd8e77eba7fe5a933fd1bc58654deab310a03aa7202a089713e323a323f4932b4b8f6b40982d6738aef48951f621aeb82a747d290d93d1eb5bdec6a62fe66774209a4aea7261acff80af9512af090e0eb0f5905ce8baf2a0ec50ed89906d8d67f370639e6f16eafbdfa982897cd5a3f88929d7f1032a8b3355223bf666be94ba9945fb5cafe655d59af69829ef92365f54ff3eebc45e01ffc439b16e23ce892ba6db7e661fc3676a175a8ede746000ca147db57a14303a1 AD = f7b826afe62356f985e8e10ff356dc9b5b9d9df24486523c3bab7db355c84ec7e4bbdf66482b74fc6b4c6aaeccd7717fba44eb4820a40f03639076776719ea7aabd3a815c201146428bf4c6bf1e8b056b5a22ebcb214fbba64de54089a20ababda5c860ec301f36e1801fc55fe8fa189f35722a2cbf83ae921a9537be2b4f060d918af9b12f9111909d59db7cad24418896ce49762223d8a20a3a83fdf24b64703c19c78f528daecaa8689f307da7fe0befa1d6b1bef24ac8d9f5f12b6c1 CT = acdacc648833698eff4d42a5dc0b123cdf6f2985ef05e6f2d42c9cd04663635d240648da18dce158b21cc0a3f7a2c35441799a4f1f5622e11051c874b2bcc64314bf0b94c2589d2a24d996af57d22085a64f10135322cb68428fbb951d8b14683bf6fc96b1395829a0b05ec83eeb20e54daf7a413e070ae1e0b73bde56faac630363fe215f1883cd9eef9c3b7d076bbb56f6f5ffcce0d31570f79be8864482b6b3666424dadb674f873a1b52ae6e3d8ec8984edf54186e38c71602098308 TAG = 4dba5b1385565427a987c9d0b030f4b2 KEY = ca80ac4cf4057182d06d65dcdc09763a NONCE = 63cdd8090e041baa9dca5bec IN = 701c739ba0c146983b9e1fe0a9723850caeb818514860c3d4adef10dc5e020a8dd7f2fa282896170f9039d5b3fa629dbee3bcb81db44d0d68f9522477619269a59ec1a9ed399d4902f25271dff5c42f3747ab0f4b61c26a2c1bfe1c0fed02282fc2ef88b47825cdfb11df3ced0fe0227e8264132dd62af2d31f23d0c0e253f01c80400127c37806762eb28bc71f31807229172c78ae994b4ad800d6247ea12d3f4f902bb50b72c132902dd4faee05e67836facc7001c8f58475366668ed20d4899aec4 AD = 0e91b38fdc70951b97e43aa9ea2c6f78d445d90ddf4faabd3e6e0ef74f528fbd5c3d4da18cc3d8bd3167b756da495cba49ea35e2db849bc37f6db8370b492d7f82f2efafa5444ac62835cb5602796cdbe85caa50084e51eec2651996d2da0dc18fe10bd6f374168d4c9ea0a36ba665148192252ce9d05cb78429c55256fbb65f1bbffb8799d63bf41701d1d706a44e3f27eb245cf720f2a329ea24fbea803c575513830fff579a1bde3daa975eecdb8d3956ddd374fe252637aac86ed3c702c4ec63e6 CT = ca46eac0addd544bb45a97a4989d45d21599ec70f843d9db38157d186716dc39a5d1a5c0624e6c825b5b7f1fd41aa542ac846ec0edfe6bc28f727823667a33cf6cb5ba1ba6654cd023857c53ff00a63b34d2c17ebae5d46dbd073edb7b2f9e02842dbf663bbe36238f3eaeb7a23e328b0d3d50f49674253898f360c0243722af266c934f021e4f2fb8747fae728d06717b2d68cadbff762956826c910cc8ad2d4aea4518d5ac4deec978a13072fd1675a272539ebea31d736c759227f31abc911e0e76 TAG = 9f0202c228ec48f4be6b2f876fd05a83 KEY = 9c2daabcfae974ae165a2ea58ecb212a NONCE = 4b9317e4be2256a467e2831c IN = 09169c1f5d873f03821393bef013bbcafcd82314cc986675922e2d43031417c8e65e625ce737af4621aabea6fe75030b84acf96967e791f8427b8f052051d6247a897006c6ddedd49cb7148afa5109a561e78abff7c55b97091f356e31b5667270d5653a497e2503d75e5856ac1efdcf3fb6e80b8deba8802acc064905e2b09d45e446d7d810971e5996540ee9c01fac1b4331f99ad329565a8db38eb93f2e2a8ca37d64d73cc8a7f4fe3234cc155226393f1f2ad17d0f01d5e60537ea44835dea853e027dd597f7 AD = 1feb0ca13b3022456a4801d8f5382cad95f7a50e466a102d2208e7482dc8ba5c710d1721de7103000fe8811bb13fdf698844257dd164f1e21b0707251f228ca8bd437994526ed5684c4165c9754d1cefe7eb18f9e116a455c28db1f7c04feab74ab06af029819f51ed96f453fb6a634f73ba8c80e19dc62384e82feac70a12d42e3125c360ec2a97f4ce0a07039687ffc37c5dc1df1ed24f05a37591fcd5c34a3fc5f825c79213adbbdef65078f5e41a4062517334a67560ab215fedde53cd8129a51f27baa80f53 CT = 8a4d4ae0842f8032d83b2e4eecfaea439f745f1d0d07808bee4b68e3b58fcb65a4c8fd9b93cba2d5b4781d28a9cc01508e9e85796551064867551f9083cce342ba1aac4d2b8f5b0b0e4e3d7c82082c441467e47aa2b0f47e167b28fd29cb8d5ee52c2298c1f87cf811061d922f056214346c1ec3d2534045c5c485ccddac7d9998d3d08a80a62eceb2ee18e1a27f97616969df52ec486015974f160745667d6be25ffc20b143d89bcc8b6eab9dff82ce3c8f95a034316a8f2f2a52674105f1246b2daa28edfd829d TAG = 0361e65b1fdb9d967492ded32e1fe811 KEY = c98ed84949749efd2ee41eaeec51edba NONCE = 7b056c9c7b393b0b04382946 IN = 41b87fe62c82bd34cbdc70033ca8d2ec5f13eb2c14947f97fbb5d97da7323f8eb5c2eba210be11b1ab9554feaa516aa493822af4a264c8849e9c6ff41f690f44966bb49c9c1df5995de8070a2fcfa42d0b0b5115a36738102134f571988ba4fb210edc3202d3c74b5f8801a7d1e217b90caa27acb49ece590ebe6637fb6e2f5f0b849f29804efdeb8c102b3e3d2abfc4f6f2c5f71f0a6e4d5daa5cf16561914f14601edc40547d55f7d11eb4768d5c64fc621d04e8c64aa3aa1245c7192852d2ccaaabd448e06f806eae66da1b AD = 2fdac5a70356c2c8d70def497321c6bee8ebb08a5abc8dd508d83f03bf1a09942d7f7a387d4f875a1ff16c7b5abb53d32bcc372012eab7a3b848a93f7af634eff8c5deb3269d418be698a3026f6f08f55a6e31543105cf1ccf56193cd1af802f32e10512a6bcd3101b7b54a8f3efdba03018d5f2475b51bd65e5e183a62ab11c9462450883e3e87a9640eac909f72b83da8bbd34431ed87d14c6f7e79957067c1cf2a12b5fa083496f903269a3c6c8ccd5e3f9cc287904223ee62bffc4f157f0db409e82101e3ca5e05d962378 CT = 384ddc8e7ed6868aa722f6785fab15eb69caadf43246521b97c8d016afd976360365bbfc9f48c08b0eaf5437af8a9c23061dcbdd0d22e1d58c92951b43e013689afa6b1587f79fe9ad3104ee1f80b3c95388e35b0b9a5a3b733b32a3e62fc143e6255d0e5b1b55bc9439d3c1cbed610d36c3667378bbc1ac20d93a5a7e5563409a5b94ec799a5281213d724e46f4987588e6bc7e9e6468bbcf340d5f1a1eb1b45dc9fe9c832befff54c8a85db9c07196d7d45cc389fc9d62f4bf1f4bb82801cfa9c408498331eef4ae1ee2809e TAG = e8cbdc1d6d51ac64f16cf08725f81370 KEY = 42ece9aeffc9d2e8ea02e73d1a4de834 NONCE = b59e0770c689d60823c06c69 IN = eccbb9a2c1241c88d17204cb0f0c069e20512bb1d31f966349add203d84cbb79d88f7add957a0a8370b9a0e04c9f17215531cd48d08c4612bbeeecf3dce68d41724166e06a331e7897e8c7c6a6affb7bf07dae1874bf3bec044d38227bef5c228f4cface9ea37255e15d6b27e154b349b16048b0e7984f17cffa03da07924b190f9b91d6222db1124c1e4e77c2b989fe2a7c338c7316a49c7df0be173d0420e8790bad669f6da96745cf34cd2eb429d18eeb61a8e80a5e03294dcf3a5886bd1865e2a55a72574db8db04a9560f969711aa7a AD = 2aeb8ee162a7aafe5a72a8d8873ce3bc43a65fd7bbdef1f6ba71b61e5a9c3bd033e7e8eaa55e08ae381362ad0991d65bf22c99a425019c4cd7768622f108f5917a4be22b4ab65ede66c58191e402f8cdad69decf6552dd52b62e8d62268b84122b64145c97115373a26d2d5e59e69b7dca5f96c48106e9fb3f7fc7e0ab11c78a1fafc697fc73603d3f08fdfc0ee885f84572fb04fda718a21744c7e5dbace91b0e141fa82fbd4d1a7dc35edafaba7c5894778c5952ec787bb547a37e509b035c684a8f51ceac5e12ae71b165dfe957c6de15 CT = c5874137f5e75ef02521b37f0759b5724798aaab8a1e62df81b73175690ca1d32cab6e7a9d7803a8aea420ab273fb46eab9e5f0773b7f5457d7a8c0058ed9675a6e1a7f15805c7fb695d277ba06adc3963606ead0cedb342614cb410f4197f4fad0b5df2187f8d2ebfe85ad3d5f59bbf652364c7e8c3542c5d7f15bc6e6c24eeb1d3232bcddf6588ab1c1953085bd0a1516046b76714d2b97718ce57ad23cd213507f6cda95ee9c5c23036cc7d4133c84a1d36393979f9d1bbc613350252a6de78d905607adf51368175a20106f81aa9ff9d TAG = eab1c7790a5941270f2ae49895b3113d KEY = 6ace8b5fa16054558c9d0e272573a7a1 NONCE = 358c73828e032f0e0db608fa IN = 915466e994705239afebb8025aa965626973e41a750bd75f9e8ccc7c1078ec555fa618120b4f4b5e273fb9b262df73d39950fe5cc1c265c06a08e2318efa83c63dfc689de80966f45cab0d2dba603bf116b9ef7242bf4d9cc691a775f78148d2c75059d6049c861da5dc40d5f94848c7247a724db956d050975d613433066ab89bf91936e0fc85c61af5c2c61cd1eb414b9df0dc125a31a3805903a886b427fb78551bc696610833a9e55c7776ec1622abf839d733594864de06999be8d483f8dbc4da99f541c6f7e21d946cce229a104a57e4b823bfea AD = e54b90d037c375238f4989910d423bc58d32ccc06ddee558dc6a0c2f9a0f13b2332883e2c4ef9cce41d72cd636516b3506f28f914dcc88311fd7c79bff0ad32770e4847362affd98ad468117cf0daa0f5747c86359615ad6087ee18e6c58453be60f3bf30f8c61c1466d107116f88499fb1b5df9a01eb762317676d5413b839c66e5c1b74121f6f2f7408825745fafa2b10ba7450f4ce207a9cc682d1e1442f972a86d5d4039c4856ccbc00c43b5b3412f5b3f87c16508ffa527c8080a556944d359f388f787f9cbc033fb3333e72127e94c455b433222 CT = 37be446820f5635c1b5ca1d8ccc2c5ab5b393243ef5229999a2c084fbb54a330bb338963740ba470973adc86e640fcc167a88bb940e5ad1723a01089b5e804b932138efed6fa0ed99c1ac4e9c607f466c829af04407a4a2e5cba486685f693a7b973921746902ad8a0242e02075cab66204084e6b281d58430f2d62bf55ad56ad279bdab0fc8c3d570fc3371dc3280ef3aea70d686c855d40ff205c04d457adb518d904f5715fc6a9a5f30bf1cc74703b175d70a1470cc810a366cb8927fb937aecc200928db6b73873935c429e2f8d595b418c5b1bf9c TAG = 01b05fbaa9f2257b3c23ed3cf91bcbd0 KEY = c5bf40aa1127073b03c114b10f3f78f2 NONCE = b4ac4fe9920fbb4e032f6aa6 IN = 164906110c34354a0d4cb6370e1ccc17a739350cbb11d6570f398d50efe3d9db1a97f00d031a579f56d23da2441295af18a640a4e33c29dfdc848d722786d9b73550bfb76da1676af24a7bdf5fd3301090bf342369a24ba830c7f8883db6ed77a2ced83bb85205ca31f75a16a58fbbbd163a3af5e5021bee2d2cece33c08442e89d3f4d6d2359b94a7ec6cac388208a689b584d5dd1103fcf6af10ea2c7cda4f690ea0e4c7376fe2c3e69365d982da28c5bc18d58fe384c9ad2689f4047f9575e54970961a02419d9f2bac8061ce943f132edae1b9622738593cde52 AD = 9f05d0391cb128690cd8bd120120f21725a79e5d2d0ef9e8322c04bf775f7215a82ce1ffdcf0f6562c188e84cb520f30842b8dcbdec36436725633325020cfdda7ed1af3323d86b2bc72d1b4a326f02be2231fcf133762c4fa76c8a7d5d3ac31cd19f63411a220eba4fcbdec40b8eb01e4ef33c6620978d09a8d428ce0e74d02c140881f46f6f81c2850edd82dc46f3460b5d5fe0b54f09a3f31548dc520f1dd46ed657995e63297b6834df57525408b944badf56234eb2b9a43b1422a5c6a59bc58be683e47753803f7341cbb0075b5795228b586cc571c1bca70d5 CT = 5c75ee10a917651c49eab6a1187ed631c7069134e492bdb5e5698f8ccd5503cea5b1902d779c2f6e6c03b0108cee3fba03f2b47803e390930060ee4ac984b1ceb9488b4cce80e329d3427851aa7da2213eca2dc5f79366caf601c49a6b7a8ab068f1a9bb899b81a23c99a9de20466fe01398bc071c724b2942640cb1a00489e0ca7052f7a06398ad42500780f194078e3e77142df5710ae88540761b902084f57d87c2b0ec57bcb7eacee6743d419d8877d61666f93a127d22ccb49b5db0b93e4f4ac0dd9393d6351780dafa412380205a90fc8daad3dfcb1b7ffaff TAG = 8048088e7e9dadc4ef98777c0f6cb661 KEY = b628ee6726a4d7925734ab1db3ec4645 NONCE = c830b0d1b4113f4c9aae46b2 IN = cdccda3718f2b0963414d965a3c36bce0a165f8e88aa70ca9eb3de6510d02b0b49c29cda4a7f6d439c18cc8fd80b932d0a4190236a13edc9994b1c4a71dbdb694ea5dea53ef781ed398e453ce372a99c204a138739edf5b606160e38cc8444c8fb6e9cfc3aeecc1760e90d13d01692ca894572a0bcb02e13f61d8604a75bb98e96f5f36d10e70a48bbb4f73771ef97031c7da23550b3a12554c2c436115fe56713dd303d1c3d87bcebf25f61710eecc9f01c555494facac496c68ef44344aae40bbe1199de793096d4630018a725b130a27d38ab2e8c629e61d2d8d37b5974f9b7 AD = f4d345e55ebd1ef9faf967d76736f7ef38e5eb9d659bf8a89fd3c6c3c674161bb54758f1c14856281a7dff7c9cec16cc138384f644544881d50c7692bf22513223b63274e3cb7509c8a410a389277f86cefc801d026b0049c13d85b26da1dbcc7cb387084a3d4a469788ef85b6da02ed2ba0412ba999c8cd83c9c6716cd66b65760c42d4ef3e324b470c2a5e031846fde97cadc448e87bec15164da006c10d3a846adab2b09c29ecc27ec8a9134d5fcfd2c54f17fb23f1a05dc8da46e737f317db42e927818ed00d36af8dabfef09c8641159fabfcfaed344b03a1dd6f9b883f7e CT = 4f39b8fbd8ecbc8aaea871db2e67583a5b06cb83ed8035ff639dbc9af92c4e3f9fe57b970f4e998a0262dbf77dc024d5e208d3678ae0d90e6fa5d45e2c7f0cf90676368c8784c851d3818e221abaa87c5e54298229a2f4d3f82505ef7bf45686aaf12e8322210a727cfd57c74a5f23bb5d8222115b28503eae7a5c600ebc4765011161736a346b535e1bfcded85c198c6ce6fccfcff0fdb0c2fc480bc6e71fd5de77355932d82f8eae245091bcf5abfa0d62123302e5805ab1f5006a976bc1468e3bed0452c5844029d7d4ea6cbd4a907e905dfc796c01bbeb69c54807354a5bd8 TAG = 2b55edb998ac9971e53ebc8973c4e8fc KEY = 095b26bf096971842fae34af6833c77c NONCE = d59d30bd5384b86b19b33c13 IN = 3be9eeac265ec4eb947dd32583ac2e595505b363d660f8b8c2ef631390bb152f016ba7c75bf7c2e5e23c980d6967772ca4535bcbf4871ac1bf70b53826a34174e5a2e6118d7ff86d4836736c9a1f9de44c80b236c5530bb5f80e5fbce9814f3b0843a088afd029f4cd2e6190dd51fa804f8216448e7acc785ddc5478287b101bab80256977494fae87d0c13054fa4470c3827b2e8172224944c8c4f78b0a33dd78ee2bff16fabff15e5909f62c49beb455dd655ee1188b8eff35bfba72f2ec5e4ebad63d7db8b6338660f9b818c6832954241860925ea9b7eb07479dd6de27489d64b1a9191b AD = 2ff9a8d12980e63a378d6d635d319c26e8f747435aa5d797c6e21aa69fe21f653f56da7db7d67cbf54451f336f683aa9cf373ab40c16738c44efd3e664ecc6eec40d6af82df2b3e58d7abcf26b1d9ebbe6263176ce4ef8087d14b0d5ae1c16917141d2ebdc76a0834e8d83c4ef76add82e957ae376b210ce2d94d2684a045a109454799f3cb453279d89c60ba9d038a1dcb99540fac078d7216ee94f96f5cce939eca9b5f9715b1cf3c9f1e6be982897c2f25225919db3e31595713a4e281e9919bc2c5a88c46835ce05411d0757eb738ac9e45ab3f1a42ffcd6dbd09f17f656f40f1cc2c050 CT = 4723fb7339048f811434eaaf1db24759fc232466f5f53926b84e740b67f457c8c76f902f4d70ebfd97696380de95e8e40e62434ab1089e3a5308cb066fd4cc7e862a391c2f727a63a01bfd9fdb8ceae55067fd9d6f55312f73bc2c38e4b12b3aa96edd156dd758e9175e67a64a17aedd27c9c70945a065216773d756f533b035f2ab53335a159d9ed3f97b2b7a57aef676fad95c46e3b82eb800197c03812ca4e580916c5f7cdbd4aa1308ab16096a8af5290a0a2330902966a58dcf2e72eea7ce799a8f05c986c6457b05e3eec2adfdd4ed38926a3dc07ef208c91a619848917b96a082ac27 TAG = 3ff349a628f7fa8d3f970aff8a6302f0 KEY = e27171ed1baad563d3d299abc0968b75 NONCE = 5931a4414d5a90e93d2ac47b IN = 1d209b32a772e87c5bc593fe943d3d7a1497f390ecdccfefac50ce14595b98b682111f82957278241f291e655b3af108a9cc1523721652b6d446f34cdba2e61464a3217b29344e18ce8f47f10da88c2845a009b7491bbd1e1f36ec49997a0fb09764ee25355de29e56eae7af42a8c96aa137c02268078b7f145fb1249bdd74f2d4e4685de75be4dd7fcf29482eb26b5dfa5028accbd23c3c654bc202c1c0ae7a597ef15f4d14f7b8a14fd45698470ac6355e04fe4a14e3b2907bcade18e4152c68631f313cbef48341008482f434c017bf8e1dbd048f0d6d207446e697fea68202be7283188d1227f21ae4 AD = af2f6abc40ca82d92901de02113cb8f7638f0a510f6a03bf056a75b02beb10157c97632320fe14fdf0610235e3a06172b6b6e80d2fe18263b11e9a5e3a07758c55131ffca0a6c9b121c37a0c85658125d5bc2edc8e4e247a636d7793a1cde364ac22bf754844607daec0a6b939d05fff5a8c44ad030181aad2361ff61f20a224f2bbf2083b2fc2a5b92f5a66bf2f9b4c49b39dcc23cd3ba66b5e7c19c5b7b74a766c3da0c2b02ac80ac22c006e8eaddf48ce6f6887f69fff1fd0aaba0a0f70ef84b54280830a62d8b0dba55ddaa5b0385c586dee60d1a05a28863a081cb9b41edbf3ee9ebff98cff983917 CT = 673ae48b6080a3dbd08034312c36201d18508f4e1ee178ae2632a9a5ce0938687ac7e6cb238cff852ecfc736bb8b3c04b42752fe65cbf6ff897e207582e85533f7c238b0be14bb1deb4cdaff524b013661e4f2c96807bcd928e15e4e159390e1eeed036ce776b579d9f3fadcad81adfcbb99986babc9a8465def3de8de0cae19bdbf6488c12534a9b6b7d6fdaeb1d4c3be36b4adf7444a0b9fc69c69a46f7bdeced1214743f3357803d2eae24dc50933a733defc653dec56f0e0bfb8928de76699d4f7029fce9175b3b7cfb6c7ab1018f6f3eeb2b9401115c8cd382b06e4b9b43a097f42bebcc1493a49d4 TAG = 285c1a0028fed3ab2a4d68946399d700 KEY = cfea8c059d7b866051aa54b8977befe3 NONCE = e54e684ef16a2fa8e25786d9 IN = 5a20333c4dd9b7378bfb773b7d64ab80379d16c0a56eb1f48f53c19d0fc4519d0b5f478e37f16d6e5085af31dc63488f9f2cbde3e49ba954b674b0a4e20df811098f7b8e716efaee6a4109f16afe128ddb0e54034d66bd00d13a6c69c9ef2e5a065825701f5e85634e118c69ff0fd71bfccc25030fe94e778e7f474136cd3722eb5bfd88bc99fb45dbc3060a24ac2bdadc5c82d883c5c63ccc0f7aaf5384f4c7fb07310b66a7c767d025c1a02dc9aa3d7aa921a72084906ae6039f837454493aac3e3549ad3722a735dfce4211819a2d7ec279221d43360edd9a4cb930815c8565c22b94b4849a979d5e2a57b2da8ecb AD = 376d8e02071a93c892293902e369b8c7c44a4c9541b5050347b016243935408d0c9557b0f66c6cd493c1b8da68c8635f4c868e685674aed42f196ee9b6e56ee44510eb9b9e89108d878be917454dca0c62d207fa462a563a267270d6b1602d6795717475bc6fb5c87b747589328e39b1d4db3cb19f0fbe9791aa4232e33abd9e14b5fa3abe4705ee988c657677fa063aa349f1a05de045f3ee66da03af18b6b8b83e29b203e12bb02a4cbaf79eab3cfeb83a5a997daaf8f36fa9e12faee86c9cb351ff361351d98ee3a10af999799955a02fc46ddf56c23070319b3fe0cb42d07d811ae976f242670e618eed113b4342 CT = 06ccc7336773919c2b1bd832e7c48ae4a569db96545363ae0b28061fede28a25ab6cc0382aae3e6b31efaa4c225073640d0148878524a7f381f53b4d21a43e39afd4c12cfdcda442d5023a8d2a8ad49f4a002ecc8354c86520524017e561fe891b6962682d168a860210e0def1cb4be1bfc6590121c1b1988254757fc5a37ef916827a5fc258ae772773a6902b084817f3641c21d3d1d1e8818b9851dd05aa49ea74e16778593f6f486957345462732ab92b1e4b06c32b5ad3270c5ef3d80b4e4bd08451e92c26acebcac1a4592e08ea434a1fbc6dfedc677151ae9471661913db19723184d9ef4bb49342606f784d98 TAG = e7be877dad60c889d397726bf1b6ea89 KEY = 40d35704108a944f1e7582503018cc85 NONCE = 26048431289e7e100481e2bb IN = 515f9bd4935dc10e77dadd81f5a4e0b53eb858ded393979ed75330b80adb36f6b81288dcbc581e8d93b0e4705c07be3e200422397ca3648c9676952e60ea26d12198add3e33cdc589ee5a800a750d77978976344dd5dc710e56dbad462fab7fbd08c057a9f8765c4caa9418e6380038d288e09a90befeffb1e8d60e79925dcb3772cbb3258b15544f9c9554181df3483784b89b73bb6f9ca55f6d644c02fbd7e31bfbff45cc40132d2bbd08db6a27f5a302e1dce2f0afe4ef5bd4ca844c7900ba18faa1896a36896a1c80307cb37162174205665613b39cabd0a5b2dd1d5f8b6fee948006f0b2e31488c0c613c1d178b7800dddcfc AD = 9c86692c874fa785e0d9384061bfce8d8332871ecc195621ed478706c46057bb4fff80515ed65b5fbbca3d463a62e227c228a340143bf012233b1c05a50fdb4ed04b840d983f47e00e001844a0d2ce14f6dcea58069c9b0bd8824537d2420147be7caf4a88dc9912853a7fde6d2a5cc21f85eeabca7902b94eb79d5fa143d02585acd57b93e4eb6bcdbe289a51c6631f7aea7bd9dc0f6cc2ee8426b37220216f834033fde15e3543422612fb3d972b8eacaece9614a4b759d93dcdeed026cc90ea058d7dc985c10859d4ef14ac5cb14849d4ae404badbcd98c28663eaf7274aade4bb7527c4f960875ca703ee6732c9a3720b629f2 CT = 89a21a1d502ba947ac1921efd3c998bfdb437c2da0802e5eefff66de3af00bde934fb9109e961f179771c52de783680683f4bb752f877897882103146d030bea5bc3c03f923b477443e640450244cdf66d7d346954f6e862a3a577820d49151a82f4205340ccf2e11e4575b53f7ffeef09ec640df65a0b8c04b37f6dad7f940cf2d7446a6fc5bc2dc31854c27567b2badf6f8e94294ed5d899a458a080f38d6e72df59f13f5c8f736264fa2b302d5375d6e3f8c3abe4811f4f85cb6e302e2c12a892a1e7a78a5a33e4b555c02917330ea7a45f20cb59fa991f183d1e2a5bb1761005b73fb728124fa2082f41cdbc88bb06389eb165 TAG = 5476c08e9561442745fd2f222d08b535 KEY = 2c6796d0773d12455829a3242ac7d480 NONCE = b43c0e7842006f6a7953d598 IN = e0f7ac13e8cdf4da6c17f1221df18b98267277e79c362ec2793dbb842bb9662b5e2fa34e43cea12f71b4eb53d9c862f176efc5d91f06b5c532d9c30206eb4355ad442127d325ae2c30ec436889e3d7a56b683ee09c7d79768d6876ebeb67b5a2cc13df02ab93646386106e0473149ed77ad0ec91dd282712d0aa26f30bfc44f93cad39504356e3472c5bfcbbf9557cd85b53e33e1a88d2f08686955a3d876e4eacfe783e5f6089b3106295899d4a73fbbdc1bd22e1408a2b93a9d89c9489cfe7a9a7cda7c92b06560a189f5ed04d1f02489685c602f8741baeef3fddf610b1a25ed26d88daf9a05aa0a476c8000dbbf798de92b0ab8779add7b7 AD = 1048769719a44958dbafe1a59a159ddf2427c5dd8746a8454180dbf59f48ff6467d760f8e06aae8d2d2a79efefaef2dd2abf33ba1929073685d0320a583a56e8748288b50c7eac551aa859b274629f3d3cdca5fd7b2a08f0bc830e929584bcba85f80e2eb12bf83de607e4749eaf7631c3545f06ac236d55769c8a08427abce0174c52718c2c08b02afc7e418bd7aa7715de95a930eaf92f54c7dfa2f3ff3691187a21c6bb9b238d2fe2dac7266de30c94c7ee96fa60caf5ec0f5aae5cef28264933cbbc295cade787321f4c12f63ddd85185997a63fec48fc5ddb83be3b47a94e15dda3f315e7495098bc7a0b7d26802e12fdfc6a94bc6c5a76 CT = 794ba0a7df144e66e6e7fc83ee290431818d149673d1821e1df496565aa7996f9e581fcfe9499c01d8716fd3f6d67acd6641285b70f8457108063933126c95b665e551925722af60aed5343e429e645574a65cb6fd767b204ca8fa91979c6fe49377fe4b43fb9994e619e1dd962fa49a8ae5ae0b8eb630f112c43a4e9c28ad91fee9b5bec0b27c5472e30c2699e984dcd9f984a3eb7a7b7209a165b2f4a74bca555dceb81e3495a3d39115d32609f372d8dfce820aded274ac567112d295de5b261b10c01f4939ac532d4a0591f87742d9502d7a2201178b4cb4c069b1873c44b73a901e299d4a41e57dabdefa39907dc559b44e99f2b950e09c TAG = ae5afc2bc4096e308cffe8063277ef88 KEY = 092e4a78c47bcd0b169aa35343c885f6 NONCE = adb73023c873661f02bf4ea6 IN = 0751fac5f54602181fac252cd2fc408ea3763fe229b80149bfb4b0044f541801843c8a20ffa1ec931830bdbde31efa998e0875c09eadaba6906c870549dcc650b865665c56b5cf29b75da63de088fe4d79cce59499518a04a17dce18879e3e33ed11ad808d470b2811da4617039758109f56fe75eeee696ff51c18d5ac04fe895518fe59435ed1f073b56079dec1701999ce0e5ab45829cbb85cb1f94dc67c9ad28815728f6de85fb7ae12203eff28420393c1ae5cf644bfb5633156e9189beb02294d7199e54ca0d2012bee2dcd6322eb90f41b3c6086cf0ac6b3888b21131f3e57643f2ab60141aeb17d9d07daa213658b52503482fabc4a0ba17bbe3a1a AD = 60fbcd82efaa99e17f3cb16a4d2a1e04659d13d84a83135a5e332366ba5e6716bb3674d27e6b2df4269180a0df25841e2235eed7d8eaba571b34178ac1a1041623138641f500a7d4ceb28efdc0ab45274cf26c0dd16174c77dcdbb79a7980e04d48b35efd3656e501e352b605bdd1b57cb7f9ceca5ca14a3953b2dc77d18fe1c4e1b859d2b02feffd3da7e259fbbf27721d330049f0d1c2729ed2f8048abfdc0e7b3609d2e6b4f5b42ece472f0fc330247880fd04768b678fbe20ba9581f3db18bf3668fa0c80751d78286e1927aa6e27ecce63fe883ee88e7a05f8ca2a387b86246f7d1a4791881b14f619a340163da62f4130b2a2c0bf39f463ef0af4120 CT = eb0fffeb17e3309d1104c9a9c211bfbd585f9516f775793c365d36352e93af1b4db15430b454d1e7aa913f2af994191c365d76a4d49eda531fa7ce9c49b98bad4d591c868fb066a2e00a6bf4b1bf529002d403313c5df306ae34b8c62e939569bb5401eb7ba87080ba505e5c40a3856d2e177d247a5d8c727b32a13014a00a57e9f01cdeacb4d1abd16f1548256d661c45da12c2fe3ab561375875c7b6e273bbff5659749631fe26cef86e02742d0cc3f63a76ae5ece59b6556ab27da9de1a20c627da8bef3c596ebd7b246505006d1a381c2a24dda70e52b126b919471acfce274b89e07d125bc69bd94f2c65bddb82441897973566014fef625bca7e342f TAG = 8f2dbbcc01538ccc45436e7176c2df47 KEY = ab1405116f454a3b1f106fd491cdfc8e NONCE = a9e9a06e4bb83c215fc59a00 IN = f64f0ed5ca25e118f2a2dbf069a9dc0169ab0079d91c6552d4a7e8d0314c910ce0614e1f6157b0f758ed6d3fb3fc3e2eaaa9718ef30e8d0c136c8bd6dcff97c0f5ff8a5d3808d8c23f2a9ccc35fb9427afd10dc1c298e95b335044b8d33e414ecc17d7b34901608284bc175418910116410a40b29dbb379eacf4ead521db3ab2a3d9956081af6d7438714c0631147b7d1e9ee4789751d4260b57630bb573739a3fd0b19a7ee8c301d7f1b09f86e60e31d5f2a86c7a65b244d5e4d591df3df3caab80887ea5f1dbb569516672eee351db5d5ee4d662a3d3c0e48cca108966ac6dfa6e4f9b88e5e577752826d2da05f2677dac7c31774eb64b1b0fc938580a78e4a296889c AD = 3726f25fea1d10c2712d157e1a1bfa75d6f9e5bda448944ea2b7b85c7d4ff4ac00f68988f2a290cff3d5dfd6af33770a021b03fadd5741bffb7532924f3f2841a7f7658c49c6b915b1dc41ee4bb9ee89386c9911974979f43e71297bcb34ad6ed085177ea91300c9b42524503bbbbfcdcaea03e3f2c939d6b1dfc9c6b6e53e221568d2557bc3055752f4fd487b903a2a0bb7697a19a763fb7c615c7edd099f72e87849f57722cb0987651bfc476a0acfe13d02d6b01f761784d247301bf514a14a990cd4b59664f826649e0f389787641c1e5b87388cff42fec144d6ff3f382b85062bc21368c93019bacb56b643808a848c60bb3d804aa64e2b8fa1c128d6914663d9d3 CT = bc1c14f1df6ca46e6b4daafb016daa235718fcccfc1ac698a061885c33479c0a7fd44e46e805869383232168940b1a9379bc652c565059ba81b4ec2ab435eb9b91de5bc03cb0a7dc11805690ed9abbadafeab2add15f9fd69b5ff4bf4ab5cdb4a6fd3164ceb7820530641d8460b83929b13860bd2e64b984407dbfd2de51e865d88c63554ea1f04305ab72bfc991fa5573bd6b41c4f8c848fff4b0c5d2398a57b4de4678ca4dfcb16a7612773a24088893444a8ea3d0916e4b460b33657f41d2b04d0c28653ed068a3653975402c31088cd74722d3bc09c50679d0ec94c1e84844886b1a56c4fc3b14614634f08c5b0868d276e9f8f992f94b2c55be5f2e408a498d27c7 TAG = ee43dba528a9ce84a53ed8fc1fbcd871 KEY = 7990cd12d13fbb929fa541bdb8e3107e NONCE = ff7b2818b62e856952aa2cac IN = 5ba2afc1da8c18d8be3936a2e515bf9eabb93e44905a86773a38de7f959c49ca56d7f1fb43213cf7fe394b49733b031334729ce6c7ef17d843790fde814672ca982807b76475350210871ddf8309f59fb280a7d41726ba7f00ed2fd96b4a17aeb7d157130cb7e49c8a454cd08622824d20f86b4ba062bb3b3f9d4a9c1402a9d80f3324e4127ee57ad94f87d6ccfda76145363fa70df95341d483dfcc304757da7541a0f148036b2e2dc7f93697d8d275456107a016b425542a89ee33ec02289f5260257176369d990c8c89df73892d7e67227086c0c2c258e5fbfff8bf9129a230c229356fb0935738d2d6fb82992c3465ca5a9472ec06c7b5a29240b611837225c61a0e14ca2dd30f AD = 865a9b2706eea62f3fd3164805cd8fe4740d1ba7be809cad9fb39cac26f7c57d4c449f4eac03d87f87dcf219c562b9ee07ab3ce22abd46237eef8221049fe499c9189f789948af92bc434b24aa44fff600c2d698593bdfcaea878f8780adbe8dad2cf453d253e8668631a6eb831be01db9c7f1b7b8bfedfae83bcdfef3501cf2b2ea48bcb19f40a70733f3e4c3dd90e17912d5797fa46ec852edcd49b0780bf6287679aaad13a926f750ad7d3ca1ccab577b74fc0ce4cb22e5c619d2d668292c9db4a98c5acc4c49561a77275c06f5c3fd514ed8555db3e2f50dde5c23e84a38129e7a91cec8d168bc828d09239a5c6bbb180bf69950540d8876f9fac5d1a258543a771610991b92ec CT = 1901c8f9b5a99c46c9cbdf8ace9db03f36ac17183295544d8170fdc3a16c7194a2fda400f8f0b251a3eccf639f539cc356ed3fd09383954a8119b536290865c30a629d44e467acff5fc323d2be97f29fb9b4ef7cf2c18a63dabfefd7f75e696c574372f4a35249897a3387a2b10c1a50ae23ea74560b498c9d06bede78f4c8c9d879667c8c8e137a0a254f3f881ce8d183588546e066314bf1989d1acadbae61f7836fa633de9fd0fcc5b3f72aa03ac432be8f7a14c8e86b45bee416acfdace44b783137e3135a801342061781007ab939a52c68d686f5e3b401240bb10e764211a059fb0aa00e2f635ef214322918fffd0326ae38ee939b4045c6039df7e7def36fdad7f5b65c20dd TAG = 3e003897b4d9411cbd449cd8dca5b58b KEY = 64f0a8065987a4713e35dede10afb708 NONCE = d6ee984b82f1097331400f38 IN = 29327f95b41119679b80c3b51fb5240490689880ebb5ff7b59a62ae5e08f7cf0993c09b13fd845ffb32a99ce18c22bb8825c137c3aa622cf3a8390042c6a1a159aa1dcb6b6b21f4e07fada584dd21620b2fe0aef64dc609aac925d8b8d26915fc101031b68a4bc89898bb92146a0a580103da265cad1946791c5735b95d85d3f0f1f39a88f47b9c52e61307627c084d68d14bd14e3572825e190bc7146080bca423099f643d53ee3989386b87fe3dd9c383f6a58fc0437fdb2087b5211df2069bfd981d8ca785384cab31545ecfc35345f38837883dbde917155e631a46ed1444ea0ea8a5441bebd54e5f6ff914fcdd66d62efd223f34e16a880370a529b2ce6ade88e907102021dc87aba9900b6 AD = c8116196a12363785d4d6fc593b23226a5fe83b00a77ba24c69644d2e52291dc59d2af3c6ae102707439f22c33251a01c41867f54ecc552396a5aa98ffc687e3a88d8d0dcf826645bc78ff9c1a3052481933c3e8ba8e30bc249e6d095699ebdc51684696a15dcc9e28d09cac757e51336f79a0cd5ce8d070579e12956a740666d28ead49c47bae10db20fff8dfe6fb0260a87cc6f5a879cd0b2f949dbff046d90cf42c7ab51337e8908302935e50755a4503107c84fc94f7db3d3f0e8eac9c0def7435676701c9acd7f4c2349c3b7324622dfc4d6ddd8265a810c000158260aa6a7e3af973f8b178959de409792652e9c4ed1d50fce2e5e6bcf205c6889ed717db7f4b14500aa8641b8514150cab CT = 3e04445e0ba21e8788f6f192b710b466d5d3433463f0308a3c0fbf7f1666fe01853b9d340f496bb0c2212ae3e3d34b0fa1adaf33f039201d1962f2b51031c2a4dd9aedc08f7c895682d1352e9a21225d81c98ac7fd4b4de6efe3dbe437d255e4464a1258d4497e2a1d4ef6c319869b78fdbcf4632743825112fc21acc0a1431d8cf8eb8865e695c0f3668ff5acd8e850373331ed7ae3bbe515b42c1d0ca0b9caa4df0048425fcd08850f23a86b4adc859291b5c49ed54e41778c7ee2a11da9598396aa889dda9513afb9fa0b66c0affa555bf76849d754702163004fe3e77ae5a7c46f3696bbd52cb8680583aa5cac22608c6d45b96770dbbfca14312fba61b3fd0d7041ded80d8dfbdc3f901b10 TAG = f42a0e4e6e6a1e0654aca2ab7877350d KEY = 2c351f0b77cf0920873fb57c910cea15 NONCE = 4f844d27dd26df3015608119 IN = 227ae9330bfd5a662af4137ca7fa164f383a63e5bc33eba94726a0e7a27f666887fe484680899ad8aaf6fc5426600760f5e6ba53b0484615d0089d9b1e75f5952ce0665d16a045b272c3c50194ab7b3831b313dbd800168a24e576cab5dca4319660fc6add76bb400376fa29cbcaa25adf3cac81f3e66a6baeb0d94ed92aa37271d2cbd8219c0647f0af6a4ba8a8e169c10cf6354122054a547ba046e67cf1fb424271d3d3eee5b51e94019d450de6c1f770395316421b61c5ee9ff00c910103e58d423946c68369730a974a392c21be3fc8223cd816e7432200390fd7cc3f5160795422c9daffed23df42a7f8259e295d43fe57f75f674886c6405bc6954d17c2a36348761ba09694964646cb86c0d8c64c00 AD = 9d7d5e5f63267154bab863a7b53e0ba159a6d8a57a8c49e084b513b463a1e812e94611116dce9c1ceab2b7e18b4d69f7dfd225d2bdf5b7750d0d9dc131f22987bc812da5b0a8ecbe9d0ca2210cf6ed8a791d95c3f72898497226f69c8971c2da342500b75367842d14983384b5985041eda7f1cd73e2b5c71bbbec6537390313583bbd53d2d563848fc93d81579d8db321d1bec973f7c4e8f34b6cab8bd7b5789a7b40f599f2f8c43f6d7f8fdf940577ca8b5159e699d449ffb00acee0940937d491a71a81ee9da0949f8fa1d780f3957908819221941f0c5d011bfb2560acf2d7386f973358d68487954e26ea9ad3068c65b797307831e03aef7d1f1bba9ddbba2f251329e85172ed8efb1a689f8026b5068c CT = 4ef2a097a8e507143b6354ecd94d072c0068c68698fd04f2211a771bec45d616d8eb7eaf90140850c135cf468dab9e9f3dbf059b56efcf616b32992df407bdb735a8b5ac2c361973abf47029bcde46dd5b13728add772264f2faf60f3de10494b0606618c383c8929377f2390c4a104141a11711ba7e3a3c83396761d7d62a997e8782822f51ffd0eaa0e6c9e02ae4effc0686af29f2805039c1cabc8b826d1ceb75c4274e95f854a9f5be709ddf1002481272586aa021acc2fcfe3e6cb0b2a47d124bd8b83585b43bc38599a497d0de3979c30c81536ab06a1649a3cf5dc2c2a6e52bcbb05a76e35139c668dc8a3c038ffd1fde8c1b4a31de48341b5fd586c674e35bef3b104e4b84063889907c268226dc73 TAG = 12aa2a46a9014800b3243d1020290d1b KEY = d94582550b2e0d42255f13a8753f8e82 NONCE = 82f7abb31dfc28491697b347 IN = 53ba297d691fc3abd93ea8b6f3d629584370ac045934b1b738a73c09a8236bf5f99f357b1cbb120414c68ee64d304b7751c88c563d5d16fa094602c0ad3c803a8f116f3a5071c049a4b88f19ba2d500a171565c719fa64e691bd4a9c4588077b0c2b91733a30a214e474d868ac6b301898dc85346523bdd4f6c9807ef69941a5369b4b7ff7fdfd252729d3829a7bde65427639de0b2b154b4830f57ac13894bbe705f02362f8b75367ec7962c53bd6aebbf15d72b25c08570392592b6a83d4f44d2037da8cbfea2456696cc39a3272e46a5b4fb837bc6e4bcd9606afa58d3b260e9f6f58bb5d0f07438f378b6a36c1931e9eaf923c2a3679a789e7ef5865c7e799ff4633f1b2acfb79a5a0fe9cdda9cf347b9664568def93 AD = 2bfb6a6726c6564b31cca749bec29a8c9fd7bfa22f26af0a80db5e6b13a3b10367be6ad87325abc59252453422535466347059b7d57fd2b1eda1d6d37dcfa9da7df34746e1bbc98baeb4bae17281a537fff85c0785f9f27617e77333f11be28f9aa3704651e4ddd72502c79cb2a810c4686147cedf056b5f035566eb34d117c83ae7815e7e1e83163907020cf0736ff1862371e87269e5c8c1926e0bafbc10610a6ba6cfc273c9d9bec0922726dea04acf72b3f88a5fffc57e0af6dddd0396b4937d2e7d52feaf60d29dddc5b4cc139eb855acbb794b99d74b8a93e3731f9092b92b9bd50c846eecb6eaed2e51290cd1f98dccf3fe746c5293e0b970dde72835c44b3a445dc1f2bd67fff6b1a7e378611eaa42889fb92de1 CT = 1afa2fec98728ce39fba26bcc769e9766993c8276f88613db574773c84c91fce6ee7dc6ba4281b8d2dfe13820723526f0d6f20cc21f305b792e9a2bb1622c742fbc05ca1f0121cb9f6e1ad6c3ba80891e2043adaac4f1bdf29260a44a182cb165f58f480be5f16b51fddfd0d264bc4a18bec589d24817f586fc8bad15df7cb4d48d788fe7fbe69f821b5558b0a664ee12ba8ddc6bbd325f9b83a024245b4e68b310f2282f4cc6005209f7b7aa6ccc025d435441e3bb990e81bcd4c8218b8360163ab266be4a1f5603059db2bb67e541e1edbe8e7762ac522a81f495f5ff8bf99948050e61c86e83134f4e1212f879c86f7fccff472fd9753e27a0601f914655a5f803061cc986431445021c907b3ae0f060fac13f3723867 TAG = 5ef1ed1e2bf562893b094d58516c11a9 KEY = 31d93fd51c2d6450cf35d9edd71413f4 NONCE = 28f6f0c288c9f92e80252e1e IN = e78eba6c58f93cc2374932fc21e54f695f2daeda3bd1e0121a77d178e3bf5c0e824a99042e8f2522df829d014e4d35a756780e8c07f53ca8fb78db6fb76754ad461665051c4572b2514804d0a9cbae1a1a013b796565eee13a7832ab8834b8406b1185332552d38754dde2344ff4f6e4823390964ba2dc43de136f2235b1d919e0f4ad60813d30f0ac1dad35abe3bee9479337c7b430841d2c722f12aeaf931cedd8a82053f697fff8d07f0af6013da7da58a5dfcf45561943e7ccdfd8d11fbe96a68a5a27982e47346500c0284caf8e6b63c6621e80503a7365d6693dc9a249093dc45221cfd88562e25910034c2c123e44e3b09d8a8a15547285d2596b98c7a0ee9d10b2cdb032d08a6caee1212420b6854181a583c15e046aa202dd AD = a4fdd42aad5475ffc1b122170024486406033c8640233cd9b23c286fdd40c5b69eee39cfbf965f7a10c73663f9804e6821c4f62980f8362a580bab446325b009a004b60b1dbd12566b55b42e58d8037d86c1050cd6ecaaac2fb0ef616a15bc5bcd8252fd459165795c500bbb2fb1476e5cfef9549db733be65bde391c810d099e3745a2cc7a94debe1f4ff6653b338123ef7d2f9a602bc9a4bbe757a63f932a802014f2f06c6688faf14332a355b1025f33687124399f55b6a5adb4864727ec6c5334c41d78d1463400925f6c29c0f611f35c9640045a740dad5b4f0dcb632e7f9a3478b526aa9f97cd9f8d3ad094b7922890e7b6d9c67fcc4f747d04ddcd115fba0a8f0433c6fb1bf6011a9cd153f866c76b26d427a25aebc60d10540 CT = 8d668fb50efda82552aeb5d075ff3977c37929d73f6639289e7c6da8c89c664df80b2387e788d12398d62d3c0ed2f9f918010d41021c464d54f016c4e10e85e29ba3a45793df2ebd6cdf30045363434387bb0d20439f4986e6eb7ae9fd85fe776f7b8035025624c2413ca8491cc6e79fe901b9c40ff3a0e37a7c7e88b56de4fee65861865162821e046846d253982e4ecd17bd26214b0923a4297d4ed9423395d856940829ca5ee74488c3b4d8aa3c5ceade17d8a3f2e45d3ba91360ac1c76d6a29f8243bf49c1d75aa41ba239fa6f3b123e198ba799e3b70c674607c5371894800954eda0264b3b82606433f71371dabc5f1fb3d703232533662920a241f613c38d16b0bad24f4aa3b336af89cdcd2f371e1bed7aaa47c56d17100a01 TAG = 594ee5c93636cfb5fde940e3d561440a KEY = b06d694a83b14768ae26a8f00fb78ecf NONCE = af11369ee342454cddb8db62 IN = c01130afd7d3f4276dcfc1ffaf4bb636a85d18e0778df6c6791b6edb92a617894b84cffef6556c834a4800b336dc295e80b699b28cf478a01c54052ab0d0d4208e1865edd6906e3a263862c05f033668d7eb5b42baf36c702d102a6a5c723974e63bec848c89d16584f0d1ec429c87686b1ccffd7626e0a83f9c471cb615541ccb02cb58d10e63ffef171f1affca492ace4d39fbf33bb5126c575963e6b6ef9fd2ee4d6efcae5afe422bbfd9c3dc22b6b47cab8dc04127ff93b016e0f92f5d8518d5bd3bc6edd45e0397440f1a4a0c7c9c2773c0a0cd3b890effb010dbcc00237dbed1177b86bf60913309bfda9376b4192da59a360afc5bcfaf8be16ea8313de97b417aaddceadc63a1c3a355693616413ed4101ad68f6e6aaa99c839dd2a9ff536 AD = 18e3195358bae4ccf43ff8daa34902fe48f99fc1371d34060aaa442a43016a1d756f795fa5c9c4a828525554571e18c27134f46094790dd1e68471ee40c17bfa02f175b2c2f7f2aef20f00e4d71926560b58f015de19c871d808acdd341675d8fc19d1e6d4028e1e8926df500c4685c14729c6a056898cf919bf3ae429fa3ca8746495716d78c9a8f2ecde596f985b1c25ad0e73aa305a86259319176b4c4f3bb231fdaa478a856f46416ddb10a14ed23c96dcb86f5bea3114568a44d8fc6ff4bb47fd0e2538b70d964842910a682e7bc7c7263249832c21b7083a1e8b143828de0f3dea8b404cbd82efb19a11e4d60aeef13abd86621ccbc3d8f220715730eabbe04a6bf0e11a4f78cd2c4369ce2447a76f4fa48ef8d322a8a28a67039c24c4bfbf CT = 6beeb306c71318cedabe3877ec916ce2074b2c3f1df887cc3a3e8019c10d353854b6b65c947359138d5decc62a42d50921dc8f6cf63a16062af47aa8cd50d0b2dcbc3300ba0d7d069a5e4b4fe03bbf7062c6001e276be116fdd00d15a6399d1b0db71c58f396f8bc7e51c2b1f47430d4ebd6c5d05328b29aa79bcb26927ea5a40c82715aa0e36cc83ca6d250812c1305c02ed4291a25762cd709cb3d808031b5f918ce253f622c1afcb83c43707edc493d18ec6f0dba4353a1cde7184db65654088fa13baf45f7643f0dfedf4058e6095156b791ed30827c556a7721658314356e7a3f3c62cd62fe938b008cda56ceca71442fa0ffeb78b13c5847a3ee9668bcd2a01c753bd797c240378505d1e8f2b8905428b23bf589de9af390f94f21630d1826 TAG = df5a21a399354b2b3346a9eb6820b81f KEY = 06a4c6a8aa189134f5784a525d46ff10 NONCE = 0f765d3893af99f5c3e6d9e1 IN = 706b754094869313523493089e591d34868b708cbde9bd8b42cba8175d1fdb6a8769bb9ec156d44bcb8f9cbf2685a0dc18b5a802dcf7a12570bb9042a0aa53dfb19af8c0f13763f388d9626a480d6d435dd90fbdbb4292d9015a5633252aa0583498d6f7ec54460d8589c1d6a6d16a349d10ec6070e1cc52e5fb996f810d333675a7130e4f3db9f4db0e3fd3541d32e0b2efbd40ba70cd59295bc8d08481f0f137832b01bac1778ffd7450376e174067b3ec23d0495cbf936bdc176cabc3f42e2991947a4fa87dd8343c32fa3d7ac0e2d22660a0c128a00e1b51a8742fdb2aff44540e39e588c5920ea16293aaa522513c944d3b77f3a0e90bd9105319c170886202e336893d100b0a25aa609a49a8255f78233561f7b88256386d1c3c002c3ee68f2775585c65 AD = 18e2ed6d500b176e49f7e1b5074c0b7dbfdefdf00a63d9fa2fea8c5e78a1c4ae00f17b23442933543ac864097629e112a099f3dce6d5beb1e3f3c8e19522c6b8f615cbe23444bc91a802edf8a08995a55125da805ebb073fd89863996ef708f7293069a744ad95db8c17cbcfedc331119e85020df8852d74b8092fd38ad424f3da41b4775beac19536ed801ac1069925b12303d8ad2c52c36ca5b4ec95e96f02ebc5725ee6cdc099e666d9055b789e39ded77a8fdca0fe2d94b8039be55b6a75209cbee4fc7864957402b50427db71bc75a0b1e3d2ed6ea20f12a980c5ee916067d0dde7d686570d075da4df7088fe5dccf0d440064a96998da6f318b603d513104c723f27484780bdad586ee358d821b480f9569e4dbdd1a45ab9056f8d8e5a879789a0d65338 CT = 5f3627bd53f8da0bbe6f3c9246d6f96fe9abb91cdecf66ddd42f833d98f4d4634c2e1e1ad4088c84c22191bdb9d99ef227320e455dd112c4a9e9cca95724fcc9ae024ed12bf60a802d0b87b99d9bf22590786567c2962171d2b05bec9754c627608e9eba7bccc70540aa4da72e1e04b26d8f968b10230f707501c0091a8ac118f86e87aae1ac00257aee29c3345bd3839154977acd378fc1b2197f5c1fd8e12262f9c2974fb92dc481eeb51aadd44a8851f61b93a84ba57f2870df0423d289bfdcfe634f9ecb7d7c6110a95b49418a2dd6663377690275c205b3efa79a0a77c92567fb429d8ee437312a39df7516dc238f7b9414938223d7ec24d256d3fb3a5954a7c75dbd79486d49ba6bb38a7ccce0f58700260b71319adf98ab8684e34913abe2d9d97193e2 TAG = e690e89af39ff367f5d40a1b7c7ccd4f KEY = 31323334353637383930313233343536 NONCE = 31323334353637383930313233343536 IN = 48656c6c6f2c20576f726c64 AD = "" CT = cec189d0e8419b90fb16d555 TAG = 32893832a8d609224d77c2e56a922282 FAILS = WRONG_NONCE_LENGTH # AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = "" CT = "" AD = "" TAG = 58e2fccefa7e3061367f1d57a4e7455a KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = 00000000000000000000000000000000 CT = 0388dace60b6a392f328c2b971b2fe78 AD = "" TAG = ab6e47d42cec13bdf53a67b21257bddf KEY = feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbaddecaf888 IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 CT = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985 AD = "" TAG = 4d5c2af327cd64a62cf35abd2ba6fab4 KEY = feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbaddecaf888 IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = 5bc94fbc3221a5db94fae95ae7121a47 KEY = feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbad IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = 61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = 3612d2e79e3b0785561be14aaca2fccb FAILS = WRONG_NONCE_LENGTH KEY = feffe9928665731c6d6a8f9467308308 NONCE = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = 619cc5aefffe0bfa462af43c1699d050 FAILS = WRONG_NONCE_LENGTH # local add-ons, primarily streaming ghash tests # 128 bytes AD KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = "" CT = "" AD = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad TAG = 5fea793a2d6f974d37e68e0cb8ff9492 # 48 bytes plaintext KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0 AD = "" TAG = 9dd0a376b08e40eb00c35f29f9ea61a4 # 80 bytes plaintext KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d5270291 AD = "" TAG = 98885a3a22bd4742fe7b72172193b163 # 128 bytes plaintext KEY = 00000000000000000000000000000000 NONCE = 000000000000000000000000 IN = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d527029195b84d1b96c690ff2f2de30bf2ec89e00253786e126504f0dab90c48a30321de3345e6b0461e7c9e6c6b7afedde83f40 AD = "" TAG = cac45f60e31efd3b5a43b98a22ce1aa1 # 192 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF KEY = 00000000000000000000000000000000 NONCE = ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CT = 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606 AD = "" TAG = 566f8ef683078bfdeeffa869d751a017 FAILS = WRONG_NONCE_LENGTH # 288 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF KEY = 00000000000000000000000000000000 NONCE = ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CT = 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606872ca10dee15b3249b1a1b958f23134c4bccb7d03200bce420a2f8eb66dcf3644d1423c1b5699003c13ecef4bf38a3b60eedc34033bac1902783dc6d89e2e774188a439c7ebcc0672dbda4ddcfb2794613b0be41315ef778708a70ee7d75165c AD = "" TAG = 8b307f6b33286d0ab026a9ed3fe1e85f FAILS = WRONG_NONCE_LENGTH # 80 bytes plaintext, submitted by Intel KEY = 843ffcf5d2b72694d19ed01d01249412 NONCE = dbcca32ebf9b804617c3aa9e IN = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f AD = 00000000000000000000000000000000101112131415161718191a1b1c1d1e1f CT = 6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5 TAG = 3b629ccfbc1119b7319e1dce2cd6fd6d # Long enough to detect counter misuse issues such as the one in BoringSSL # commit a3d9528e, when the AVX2 code path is enabled, using its EVP interface. KEY = 3de7b368783bd7287f2b9b731814c876 NONCE = 90dedcfff100eb1f1db9d935 IN = 8d766795cadc0961c0f448c62df3827eef3a8664599b3adbaab0cfd63875bceb8f992b4f7447dca10ddd716aa0bc4fe925e1aa3e3fd1d5c430c650fe3546d6b9a24d576a857c5f04e8c0a3b149df277aa19cfa64ee235891d3b8ec0e840d268b1e70dd8a4bf97628a0c7aea38aa21eeb8fb1a8437f2abfee05e0d2c30659e312ec03d30da51b7c19073a2341c17df806e27e796d581143d39e4de8d3f8d46aa6d6fc1a98d94fa69b92dab751d930cc12de21fb1a7468af09e3c12ff6c3db3967d10cf140bc46f17a16e24b010b6cba5ebf777341c52042596ee53008389c48d9690ab9f5625795c3e588f72f7a1670b2b25a9f4eee1c8845ac90f1bf47ae4ea4b607a50aca88ed304cbb700d02d5486139b0bc81ec042e574abf986972fa008b83ef22dbfe720c2f2f6355c87c975932cec545ebed657e5e7570c503e9aa7f0b87d0b2648e421ed1d34749637c95d1e931af8925236387e50454f0ba2e22ed05f90450fad46f4eb7ddb08656511dd065c0f852a7e42f618a961a6c6bec42226c6b6043580b009ec9837cf99844cb74794a82c269ff648e0bae9ae50256a0ad98ad9f5a35057b3004ac96f469f9ee966dadc16dc47616586cf242706df96bb2f7ee43d3bd1c65d2eac7b82ef242e77ab509afb9639e5f3995380e926305729ca762c487f4411ec2a9c688b8347e5287216dbb38c3fe2281a89fcb47ee2ee7ddf79bfa3ab61cd56a00981019bbcea8aa0444eb75958e5fa56ea0036d2de4950a7db886f4a318b433bd41e00905ab158171e0ef13172293bdf70064b9dc7b243bf9dc927589bf9e99468d1cb330639dbff1850cc51929b8971b0b2ede9d06bc5f6ba39d4551b587f09bf6f8206e8f1524f55714612581d6aa45d8fb83425f84a736576deeecafdcbfbb8670d14cd2ab2a7f8b7f374c07881b7bac2605fd5ff7ff7cf43e30cf49910961a9079c0343b8601be8c3e9fe38f49fdab0b7e1a8c1536cf84e4d80d26ae5ec37570839b5cda02929221898d611525c3a88fc444167ffc532b256cdd0a8f31ff08097d75b629fab99c9e1062d1d9962b211e15ec8709934029c4934e64db8d7a2f32e23dc541be306e9a57a3419115994cbc3a8f8d5ea2a6f45b9ea9ac0e51ed0c6680fa029f4552a6c8665aab00ab77928342e7284c321e9500ad4774ef1fed0f596d5aea371fe1793271aef38cde55547f34701a525526e83a72673385a85f44db511bc87ce1f831fc6ccf8204ca4f4a20eac09897aae93684f14ede21bcaf40a09c08012b92600d6a839ebdf8bdca7b34192c6c50bad8796b3be3c375dbae6217815d2c75cc878d39b4e842d4eaa5f5df2242cf230e44a240e18e47827f089b18bf880fd41a2516eac8e6ba3fc2db64a4bc28789860d7b18d9edeae8b3059f4d945b15d0ee27b1f74842dd1df117fe83a8fdade23a47c93902eedc4d33f2dbfcd1996e6dc1458409fde2302830e8d44c58c5ae67486b9950dd938f14c38bc4c9484fdc4ded93a0f90875773453fc14d428cd6e7beb0c705d61229d2b3df09632ebb30b325fefe2aebbf2a7aa8e4ad46277ca4b8b078818b63d04e7652057f6cbbab7c43ac355537e0d3918b4a73c00dbe6b30a27ee7a6fa213d3347ae478e8edc323404b8322b9c7b0173ed61c38ed25f3576a675d527d22edd51d6dfa5767560d3a50a91226338e8c4e6436eedbcd3d2efe9dc1e686b15d2f57d553abcfda57dc316ca453a690f20148f0dfa20c1c4a58240aaf7195095fedfa56d839d0230d55ce9a8ca1b9d1acd6fe98d583148ba0f4a4e3413c76e6ec57ddb79428d3a90079f64d3321c791f60d501c3fd02c8403f0f5e6c6836bbc96430c1b48e83350c3a3cfd017f15bee3e4bb1295d821dc98b85ab3145555cce2c34a8142fe50f8db19918b514a165d12ff6301fb2296788760ac0b6d9e3a57770ad5111cde5d24b6321918cb0b0887a282b827a8749733171914b000e7d3c0edad1d42ca60da37f0698554bb2a1749f73b3120dbeaa32951f8217a781a200467d5b569d16f56fc9b7dff0ac524f03fee0617f4c692d94613b1e13b18075dc9f0d32811d4a8949a95f6b5fa46aeb83597adb409e68b2a0177c36dcc95dcb2e7dd4fb7337ff97c013364fe139e185014948fa698741d822044fa3f6978b16afd18138c845587c405ebf7a6cd1c28610ce67e992ed49e406658a0a202feed9709500d064b6f53eecfca57dd4b38363ce3aae9d59126d8ae7e140a373851188ae28c909181d0ac64770df70dd2475809350cb367825b59d521d5e457b4e36aea6dedd90a2266898b753b57fa359d43cd388e7d6c7ed90bc4c2af34ceafe88a3af6ac376fec35f1240f08af4f3eb30bc53dd68e5762e6d39e6b16f63003fbe0bee828d0d7adc58c41e857c2c44702215b202701fc696eae021af19c79e59c3e32627cd571f5db99b17f1772b5d746196befabb0b7446687827f3315b391d5dff069b1c39c00bb143218ef458e3b397e1c99640d57fc8db2e0083d3d22ed4111a8fc9e0e6f55fe6a56e946dbee43909bdd7d516fdf756ed8099ba80b1e17a5e279119345104379a36962ca9c8b2a53c414d79eb09fe79862ca749a9eabd9185ad1df57215945882f5894868a134bfc35c835e040e77ecf077d6a98a73ee022963d70b036be3fe5718280ae52c5d751211b22950c0597aaedd35af41f7dd5999e5f7ee34a37edcf97df54a46742b0252b196eaee454ff0c30685b15f8de087de208906be1d971f0fd89f7cdff2af0bdc96759d6889fba9ef092ad1c8deab0404562a7f3977d211c28dfd1573aebd5427a8773f03986101703fa19cd4ab96a381c76a747f63b63f7a9a3a08e251cdc593a024f63b443b76d17dd9e151809da3c582fbd334fa6dd0221b6d410c6a78ba95bb0154bb8999f619f2e084a6b9755ceee4ca3c7e0481a47776c8814f13054e627e37630d593bd09d5f10a049c66c9999f4b0b037e81ef70615d674c7c7975972994a053c069675fad3fae5ae3e779233b70254fb87f25d44c104afc3d5911b8b695173f9337130e39a02cf97356cb817f6cd23f55ef74dd06bd24ce5887a7001ef576262ffaa99f9bb5e3f55bda2aa0f199115909af48bb4d6b1a0a0847774515302cafebe75aad1f63362b1f38141e8721851c3ef1a247931b3b450581eb5d09027b9e3ba60ae9801d629b74991b7fd65520eac561d47115a85141d9a757bc75710bedff1630561ae05254ea541a7ff1846ed5e164834417556dd562c45543c88d8030bb56451fd5b3cbf10fb0164c5288789d2aac7e7a836e79bc3dd401a8e3e05aa6714ffb2dfddb3037c35fa1ebed62a073b2da42133f2620ae88de5e3f46cc69f2b9b3c9b88e39b8b108059ac6bd493be5f7a39f6b53ee825f4593b77ec9238f5ab804d533f48803e7d8187291ee25cfac4da5d8c9279517adfb09c422f6d704711726c73828a5082b4c7b3d85611b8f496d3e0f78c5c4f1dd1c722b1b11d55861f232beee6aaef8a00fd2eeeb45f182af191ca6de8eaa25ceda5451416fbf6d1abc0670b8c10e2815076f271044c690bdcb64856b91265bac202043a28f6bbeb807535aad4bd89e572a9427c826b170d3862f4cca70ddffb4769d6593a1cc6c42fd06cf68642835fe474a23e6f63df316f8361bab959b768d78e20c03c2a99913c162a9662bd9981eee55922f36792de0af68da04ab49dca72e3d9b0de79df828b433bcf6be073f851a36418c03a717d54d48c1014ccb793577c8393b7cb53cad6bc7060a54cc6363734f6ad388763519ca09b533078d3cfa61d7bdd4c4dd0ffe64d68d501b55903d3f4a1f310a3826ac2ca700de01d656188dcf577fd1b63e305614b8d13471f6f84a5d4b12c5e119870a63d1e3dbd39d3b5c26b09f9d80f8a59ce836b20bc933496923d278a022c00f3aac204d07d2e5075bbcef1e4820d633a3a2b35974f72a033484a91a1d6a9913239c93e5783b01833073c98f358e3465efd5087af37ad60b7285550e776d67ea7019e788776c5a456102358c32eb4e7c28096af88b9a20d8ce379ba3928a10ffd539c106f4927e7ac0f382c74017d6e4438fb128c660affd45e9bb68452de72b574eeffe3ce239d0718908c3800bc7e8ecd2fc7d9754171506017fd7868594c9373a96579fed475a28811649ce5dc8a3107bd0d8578748878ce4998684620931dc3981a2499568c2f61174c3b3fc46a7010468e8ff75c08cd43ac764d95e2ad1659f9db62e9554f811e0f43bb74779d923c8c243d12a5314d3c0c6ec84fe60e1d2b2e2b20d3e64054d62049ef9233ff55223a319c285e4e3f4c98dc95b2ca81230d7fed9bb99fd7d97430eb32c9c11647992bd85dcb47cfd58ea3e221d095bcf9374a6baa7c8333581f62b9e489282483023fdd18451f09bec764146b587209160b3d1d7a3d2e145fdb640c4bc382541e0d84255122d51a710887ebe1ccf29d41b4dd7fd7368d68ada250d3968d6f0971f0849c13c09abadb9db8b08960a18f84f0346ea0aa71227afa55b90cabc062d549b616400d36450b19adb67d7358e48c043fa1135abfca89374c906f8d1a6a845debf6b37f055d390b029c7f4524958bdf8d7e2755dde3b957f0926f9d3b8821ba96044d3cad2d637b973bfb657fcc06ff44c17965acf572ab7a0c87604c7dd1cfd136a0ad02b22e8ef320e101ea09772588e8c5b4d88f40fe1be18d27146a2b9559491949671700cebff9a709f297c2621ca9d5d1749623abc20a326ff5be55cb9435c03bf49b147b1e0a4a918bfdc3642df90b396a474f81d75c953d87b3f3b4e31fced630bd7c481c63acbb84dd31249101ac5277a36dcdfc80d8d9a2e928e9b2d65bb257bce97ccda83b187da8a7886dc96eab93d0864d88c358105f9cfe1ad0f0a8508b5b3985ff95de652e684da970b57669aa3fdfbe590a631522abe8246393639709a9a6cd549e78e3c2d1acf84643e9f554c5e076f75a5c1dce1be20a66722d0b896837b7036509ab8d473d5d2b7a8374d6a575f69d54afe3e7e18f4faf4e917be8a74e55c271b96d966e0c0b883f84b3ef2e4f278daeda2efd3ce770801d2c4bda5eb9b646deeab9fa55324e917e63e4eb6aeb4176cb4e43af3db61aea1546fbf16e76a12fcdbe726b565710e3f9866551023e5fbac0038678717e6ab4d3e92dcc53049e8cb65c00216d31a8869ff4d3539313fe2fd7ce0f53b255e3659e7dfc5f92b7627dd9ba42972f0ba72b888932d870ab97226040c4c0f4826be131fe1d2cdc21005ec2addd7796f0927501251ab26b0e5f3f9d2a1cb346a774e18bc233cc89aa69f5f70e3d5c17098eed350ec419c82837153b5c7f5813bf5918defc8df143063f3fe45125deded2b15892d5cebce589b60f2ada0f9d608983e8d107d8e6482b5f542c6650b014445e8c055aac142f16cfc59229fc9626f7aaa40cefacef777e494e13dfa93d27c201788ca9f60e572af8d65ffb513473dade5fe494cbf7377bd1ed03db2571d65af3be4b0bf27c1f069797bfb67ef0bd8a88c6286af6712c106df9c418d88054e3b46c88296a2e63894d6bee0dda8833c373d6a1b27637e1510fea3eb2fb34ae27354571369653a282a8d19f2c34f9e5ec34555b4ed24327dc5d246df13736bd41021697104f80c85bd0ae920e9aeb4e628fb8aec269d55858df149af298b06d61250b043c8a14a15f0646d0aaa18109d031c449e66dd7336044dbdec912b1bb615fae2a3df480bd64cbed74be65c8f1acac247e80bbaeb6f9dab38c6addf4f3b094d5934ef5c9749053b9159e280034e601731a12d6688ff27ee3581ae289de424d16676fb750d2ccd5b3f964dd77bdefc15bb204e2350632822384cc194cf9130f1ee81bfc3887d3366ec0b48cbbe0fe674281ae7445f03791887873659825680448f162452cef57d783821a73047078a8cf94c416850092ac772ef0b2e48517ef101ee0681b5259aa27fd56edf3c01e6dba6298ccc91b09bb304b637eccf8c673b816e74bd7f8ceffa6b17ab03df7ee9ca4098d24d044015a07df782a309cb6761528272632a6e1323c4e18284b463dfcabed708e4fc95cef133865cdbec8bfdde100621c65a92762cc3141ff37b66dea8fa6e3aad61dcbf3b512467c4773d36e58989e12a636389c1678c191137a5f7f59668c8a527dddcdd0c3fbb14cf48b8f3ea306850a5eda76c57aad06312d7bbfc18969d7b611f512358a7bdf959cc2f41de1c408133ef02b1fb2cdf8efe9973c27536434e56fc1bb4880db7fe901087b53ef3c0de18aafa47c25f1cd62c362f2e5da41c2dbff0e13adaba26c1e0829f027dc0320442e851eaed9507b70ac17180725349f6ea7b59bf39c095a9d10790e87221c7c2d24b8bca184ee95a3ef7449aad6c1d905f688498ae7a0cd1b01f76dabc342fb2be0295ca1484bece3c9b8a1b91e53de2d2587f3607a7f348f5cbefaa7a6dcf61bbbcae9444e2d25a77b016cbd1508c8cd319e9812b43b0bbca52df155d418dacb6ab1360a9e605fb53c6e20588a10bef42d884989e836b2ff16fbcdd2c1704f75dc8c1ac2cc6aeb92726f5d46e4784c70e1e249c102be6da506e5e3c2cef6a8bc4a60dac7adf3cacca8679f8f792ddc27613e44a70fd849b7617e042da46d65a3e6cf425f59b83cbae5b6e911142abd13a0a8cdf06d041435ee20e2ca417e905d2dc49c15b863ae5920ff7f9380a86bb0c86b69a000c157cd35245bf71f9dfdefbd1760af90ec3e554ebc511aebf650633221ca9157226f613f41406872765f8d7b916ff3877266f017b8d840dca0697ec3dffce7912ea9eafb62cc2f2d0a112c9bc0727444b47b62766bddf5b5f26d391f653b6894b069069979d0cf8cc7fc4143626a8420bc0a3866db3860096cc128d620ceff059d1614487004adbdf6b0c4428ac8897dcf16e6b11a692a6b465a92b40010f3480b444d4d2e24b0af8467666905c2a6233bdd6502521b621d3cdd4a5e1f268d65bf6a1879608ffd3abf635c5f0948f3cec7e087485c72b00258ba69783cfe7d611bc41c27814ef5674185791dbe626e1f276cf2c399a4eb264f19c77ee95d94252f546528f629188318e9ede65a927aafd2f2af56ff32c0ef39862d2f92268bc9400afa8ddeff591f3ef99681263a33b873bd9e01a59c8b281da30875245cbffee5268563c7f6f20b9e22d998934131dd219624d3cef6df2f3d2d6401833f72c619d6f763837141dbf93179d0f01375581ebe227185166aa7988eb9fd453d510ca6616cc013d551d23a33a4241e85aac3201284344977d496d768f5d920c5670b1d8bb608efc1b99abd261afb0a4ebe191605cc5c2e20523a13b3b94dd1fb24a27009d9a5b6329336f3516a327642386ba64c8769da1324a8a3d1f304cf0700df2b3e38215a954523e1d40ae96d0046e2929a815bf70785e94bc9b89246ab6aded60d65170eeb49b0ee0a57ee2e57db92409105c25f2d0c1a17b5556d06511bd0991a426258372c7f2b402dd533a75aa175524eb5d6b9575300b81fdb2258bd74429add8aa477bd1182db57107d411d16147defc3582861c68f5ce82e0a0316edd5d0f3cf36825a2c79a33e376cce2e63274b3b41bcbdd755845ad9ed2a3bdacb6fa3fa9484b7b60edeb1d9ef84772e78e39adca14c9fa0bb3ad1f1c17fb9449270e9b4c97b5b320839947fc73853fc58304ee9c9e86f3775f5469554d5006eb7ce9d02d5f900c771806c275ee7022e2b55d111338dd93ad51d14008df4c13d8c03fd9bb3689607e5cbdd499c3a372b487af74cb140f6300cd2dc2acda07277ea3dab57ecf09f1a8f2d6abf7c44fcdaa6dcb1f6e791164004b20b3b4c860f409c1483c7044b6fa445f7224606894e386ba08057a387b48920d4de203b1acc4dbe2b0b4cbdc3f7d7bbb097abbf81e01db09e120eab83def925a059cdb513efe6bc93f0579ebf75638df3c3d7f9eba3c36a169e9d88495c452888853640d93ee70f254f86e2d2d3fbb5e8883b36fbd2da105cf3a75cfe998068203186bb37f1d1ebead8ce1f9383b816f1da2fd0a9e01377b6ebfed4f05bec08b4ff9b90e385736fd13a3af7980c21b0dab58decea8e9545af5d0fb11bb51aeda2c8616960e8f6f84e6c2fc4f50d7e413afe030f75475509fbcf49cbe14445d267994fd3f38f41a1339f2895c0b2969a9bf9c59b85e629486c7bb5107c7a6b069793be7690f7a7c96c93b09a9d610594a156ab27a32d5557a5b1ec8920761cd2f559ad808dff3da64717ea5f10fba87b8ff2712ce322eb3c288939e0007f779a3920f45fdd533369f6f85a8cce21f91552fe03702ef81a926af0e402b418fbb25a6a3dad0ec18ec663126b3f48c341e2725abfeae865352d5ad275a9e3ca20393c64d118968023daac84bdc724a3c522d97a5878ed788cf8e44f80f8803d57584d8c8688cff24dd8c0e881b62d16ea30104d62007a4bec051da7fdc95d1df8556ebdf607383a0825ae503e24661ceb8ba773b793360c3f4ed3b761bd372570cb17e7c2030f07b0b45a7974e45ee6fcf5bd7ae9e9abde5421b42cff6af0c6eb7fc73f4deb67bb4e0b3dc9b4008da30c67071243cda649091a14b89bdacf2ae98dd230e932d9b277d6968c65e0006a8ff63f283f2cd9c21615dfd82e0b24af6ff559c97922a3d112ff0ef4af9d6583bec1f84d1aa8bbae705b9bcf458f5d93059b90fc2217ab27d0072a38aec3229d13266beb3015ac2389a06dec3120c6c04e540886091597919da293a4a8c0812d6cd336d5c5faeb64162ec0459e252d219bed78c4b6bb61c1213939bb3cca12a625ce5a45001d7408f6d40fa9466377caa43afe961b5c1602679220258fae72a8de2ac69c0dc97c90c270e306dbd8eb681ba9c092896b19a8d42665b94ff4d5b8b188f19f7c44abc8f88d4ad7b5df1cce3465de377072c70dd20dbd6779336f05ce328ad741d1e4606dce7065347df111c7d3282c8a3fa4a9458561c04d1056cd53ec5a8ddd6bd4434ac910c69cea0443fd09ee32d1256da44ab7896867a0c97fe4faa4a53b6db5cbfe3812a6667f04cd318f3da127a0dd46170cfbaadfcca863e0d4240ebec1cb2a5952881fe89804892d36dc5bd6484cc78db41bed868ed1b321a680a293bc29c420cffb5305d15fba05c76c2138b986f799b6a3d061658e498204c2b641f2f2ba73d633538eef6b5a01117951eedb7611742c120ff24261bea605e94d21e452ddb9ad27af08ed972b7d5e1eae010ec5d83e4505f6a2b7d9a0bb32a1fbba32a2a8c7823e736a69f516b781fb5354be4b0a67343c009a09b8f656c34ab895f9213531fdeee911d677d1cbc5e72c0fd1ad1f3b4b8bc735e14c3f75f1828ea28c90cda40e0cbdc40dec37031ff3d50305d5a8bba1d53d2f176895e53faa3067129a5c97505799967e55e4e9d87faf5920d71055009fd060ad06691b78583f63881b566d4a06b639c55796b23531ea79c6de24092c0e6fb4d3dc739f6d82ee3ee39f229de4c844aba36432d6119be0d2f02e5f72ef1d95fb2494522a7221e18e92cf22e00010ffd93b89fe60b6895a37fca91aa2fefa8debdae3147fe4f01a6adbfa0a59a5203516b2cc7de5faf821a2e72d43beafa30ac379791ad1e5da3286abecfc7a546b80191b7b892cdd01c25e95506471f5eb74568257439aea03300e80699909cc06db2fd607f3279651f7392f80bf4fc61d66f0dfed7b7db09744139d7374d3cdd18d153dede2a65f26130506acc51d5c721a7989485a145dac9565ef6d3cc938c5a51f31ccc88bb0739920ef8f0a01145f4ddccc74790a22a3099a4b57e31b3a01b4118c9e6c393c1304cc51ca1784db5633eb96ccdc88f8b732815b92c9072dbeb61a2cc1e6b2e7098d883e6174f5af7bd4f129389250926e041ba94d1ac543aab6525f151294060791fd26b668d09302c3482c78e5f3271c0150c437b4e78b1cff6f2b8660dc310965f2df14a1f2ad45cd2759433c4f3952402fefd79fff00dd309c3f09a58600223441c11693cdeeaf0a6100d38d612a759a8e01f753982803af30c7470f7bfd1ccf2c08aa0b187382d25868a9fdf729da10bb0aa0e1cd9c6e695eb2c80c6b6ce62737c3e655246edbce5b8f7ae21c473762db0969dc216a93d4db239f67dea74a1de21d50336793d1ae45e931d975bc706ea718a2ab10d66a59d9d23f76969d870ac279611246ed3aab0f79e11611b312624d78b88a9d1a49dc68d6968f7428c33f0a7a65675826422f7ac058101d2f85663de331345b3a25cf76b7c8fe0988a13278be9599b8e4708526b44a70bc31ac5c278ab739e3e6f0927b72507f34b0034e7fdf43364c466bb75b559e03d4d18c864714eb6061f83a6331b3f59dd62f39bfc2529d5cc68bb6ce63db1075105cbd7d7c4d4ab68c9e65a32092e34e76c3178382a965f49386bd4aae307128242a2ffe3022fd7dc1a824b330b9f032d55573c2f004a6905178a2479ba8a2d5b3140ed5f3e10d986265d8b4cf262295658f301b4d36281611d9c61624928da9abc51ff9a6eb481310511772fcb1c1786203d25295e4a319b9c6d65ccc966b4c5795e6e30b2b3ae8246c38b4a911d1904145de63dbd4470fac47f8ee3eeb3f58b5e665c26a316362382ccc6bf8db7699fa3334cb2ce61c746a7d3af24d8030df6759835f5890b7dd1de538cac1dfe843ad06eba2e887f08d9a49b39246fb26eff5cacc937d63c8d0136f7a8ed2af4cf473f3f0d9064f97fb4fe9938d631f7cea3c617c38771553eddd606ab80bf792f34b44111933796fe1fb8bb104223a4de9e16e17321ea7f8de3306e75a2bc79aa5e9c0ec8dde9b3dd1f2ae42a6a278410afa8fb62c16282f1e3dc1e2f8c28d4538a75b5da7645101253dd43aaa150b273f73e505d490490314606264c737bb344b616a80a4931825043a740ea4f75847e98cc99c6880d3085787903e54c63e90b60f03192234ab20cb41c70c6e82b00e0575a1bb0b0f435831c9ceb9dacd1fab8a7328eb3e28533d5bfbeace430e21758cac204631bf033752f947f78ac2bbd9423c2baf4dea22fcc65c96c332ece9abb20fed504643e82f3ba0fff213635910789a2fe1f2cedef68799fcf4a86d63ab0ccd395d6d4f393f7ee8905eb77df32d97592fb34ac86dcf20cbe5afbf9e9cff37bc34d75af046a09a1781cbf51ee2e0b0f40096d85413a30de974c4d1d16ec06c0fad00716c4e10f8dae46ef3cf27ccde74502b657d3dd26b5481d9787f5c6034083ff88807896da55fd2c951a28f15c8c9e6c86ab50c369e5ba4f6311de505c07c7b85573b5a539785820c672557cee4b58dcda948fb51c95674c23f1275b423ee5bf3a646df19bb5dfa22747857fb5c605669f334d116710bd9f1495e242bf47d6b607c1c9d9c706ee770808484ba552c978ef64daabb642a7caddf5a55facba474b8a63577ac817dc57e48ab072bc6a2cc5f5ae96edc45af41c896cecd8acfc36604db3b7fed9d2d17d429f94bd2542b194a3d3405f46c1021ecf6bb907fdfb4b53fe445d5adb18501aa772c9ba75619214384260306ab68a5ab59161b AD = 85ddde4720659e80e25168585a354eb1e021c0b5d2ee289f2314dd5aae52bdf1fd44755bb56a6e659111a1d4b4da73315bde01c7d2c15a4f7114aefd68c141049fac27acfdca24e65c51fb1c27d307cd948e13af2963166bbc9411401d124f1ddf20f890db5611385257f52aa05c09b467e3ae886decf5744ec3749e5879f2a60017f601bbee11a66604d5f3d521d2c48cea1794f77366f29c7bd12a8aa51d34a4f3fb52809561b527016bc6badf9d136156c330e1d69d1aab98c7caa9cb46e782a898b4c66e4ee3e2445fbfacaadf9a8f73c4cbcb2a1ceb604ba5637b51337fcbe0fc366da98e805ceeb29feaf05420113b16e1005079c0e88af33f5970b3d7a8b51d0d9f5120a0795063db508171b75ed07705ac6d6bfe4ecc59243091d48865536515e036860affa880bfc91aae2fd1700de15994792aefc4a176e5d49d0f9135c7d670f3cb8798bfbe83fe73de7427e0f3e6a2df561cfa15ffe6ae80d5016096c8875b0beac8cee8fb530fb421b9a8ada4d551a528d0a0b521086f5a2db371a3bf12a2ef861f831fcb44cb2baede907a9306d3e5a3af796e0a50ba2c8dd61fb03727df5f0654d837dabee2fd90eecb7b2e8f303b0d57f97dc6a52d8281574d8457c89c6a9f5d80e0bd86c90ed39b1db4253affee614e8cf1ff05166c66e7d2a2aa2fe8a81c4741339683debe189c126e7f553a5f2dc16fc16672f74aebf94c7e3041c758fbc6d0c7f71c192cfd0fb2ec52d0a0705b05815d567f3d19f9b5d553a2adce9a79159b0e38980851bf64e97f896c028a6df8363cf1f13f4654265a7b0c0b24198efcf4418c32772bafd3980dbc689fab12e85b3ef4a491e2e5ffaa2fadaaf3deb392105a42380797d3b41ef61303a6016b269ec9a9f6e3f26070ff33cb467435ecb325dc7e18728a5c2e882e720c8f876fef10f5bffd5a925cdc9689d934272019e90e3a3bbf63a295f207faa5c014e1517c7d5c18c3ed70e92304d51944dcd3604c999d4aa8d8dbf2a4c69cbbc08635c968a20dcb80f438d43c57851c4cafec0b9568dd6c19932fd3f1294afd16f019f20e40ec87f6f5dffc7717470614b2de6e9000969e6b7e561cf91c06dd379a09c6c25c7841330dc78fc5be1d9b86581a81f55c0289531128638441fc98a1ad9472d74e2be2f874aff2fcf9c941502f59f716185a4c39289ca368c6dbf5257b5dc5e57a420792c26e602e4ecbc4f17c8787004eb88ea091d6b6ddc3c85dc110b5d1f46f6e1d872723176f4c73664ecb4219258fedce19ae22360354fa4894fe51d69434c2e58e1ec665b5cc33bb295053c591b474b6ae178c8834667bef971604279440170ebf3e739a4ff19704e5886767f81edce95a3dd93d1147995e7eb6c794b7be136658ed23cec7c374705ec0d8479dfb44cc7213076668e5fbe6a508537a9157815c6e5187b89f CT = 66c03198b3422cf3fd8291080f6fb3ebd9ad863e41cdff169becde726946a342ffa0ee547a27bae28cc782d95a90b0a618f717e3beb577354bd91e00a7a57485588265ad2dd0ab946926fea7c754c42751ec7247ee84c17262c0ed092186ec57d6044f0ac9deb21da6714ec7452e441e687e138ff144ea95636286263685419afd35f002830765d810b6f60e8dee0e6879995e9272c798b067d5f99f49e460b86d67c641f48240b61a16dc7cc27b048e8b8e8e80016470ecd2fc4225e29bb127ab48dfe7e7d5a65542176dd7ad40c07ac8b92891d595bbd7afb63fb6f9e1c2aa2fc659aa101f9b6a5c346625acec86fccf17f0d45809f3b9ee81572e5627f1afeed4ba96c6d3ed7e9232358dec01a1231ae7b94ad4675239f3b456adccec439b3cdd45504c5475bbc77dfd242e5e9671d103ba71a4601a7322e0e295357f335fa8d5651d528dda66575d106308338993e615b1c5bd7e95bf3f755ff726b4ac6dd5a43ef061ac9783f8f2804c68f66486f5844969103a36278ee0d10798bf8a802d3fee3a31294bf00ee74f087749ab3325c027d42b55b197469a5312bdc5c9b316b20093154e66605941d58f4db8d46a815c06f209c1dce2363771b5a794dd8d17e93a2fa7b194c6a0b79793c06f002638e5e3052365221232cc4b30adf161cc6e7865cf02911e2ac9b0a75f000e7ef3aa4f3c7438433513da7246d421f208b179763651f18e22a793961e5976a74744696912f22915244fcfbefdc472baee0be1e591d6503f2d9511ee1eededd9f5547c95eb94de134d0c2186109935207a23b2b8420a5858d831ed78202be855cc6b98d6663c1c52e1a0022ed7ebe0eea6b107da4cf50c1c7fced9744a914a66d4604a081587ce4b7e0f96ed408b8a9a2964314b1334a123d5184889958e6467a6d16e7615e5364e09aab75994e2758345511113321a3436db79351c63a282095ec6b99b6d775a5c09ea3f3225716e39e14df260bdefb2ecfe9a65c73ab4b3712ec842e43ccdfb535e3685fa39b4912719e67bbe195e5f0fe6c3aaada2d81b669c4565921f6c183d708b50c3f7172ba841815e9351fe5fbfe2fb1fabeb7cec9bd1dcf2d6332372f1b972b5144aa7ed6c5a985132f9a54469097e2e981b9e75a7df48fa79d0736c6f8a201c7c7d0ac8ac6512a7089514bf58442dbae0529135a7f2455e0ee5716c6610bd7600b3159197bcb20ca055695a36597bf7d3b18ecd08031b4ce3a643951e231c7ad15481e32ed7a3edd2b379c8e96d3288d5b93b562972a04f1b7e0abcc5090cb8655422cf5e9dac0b49678138faec81c78f113255eaa6110e95406a7e7417a6e221a8ec7fb9d55643bd589ace2da70fcb41722e66e0efce932cd7a34218375b6dfa3df1747953b24a41f94e50b84bad4d130d5dab4194665338e06f102f46badc5dad7aa06edb01f8a31244dceebe5e2006d6ab4a31582ff46731b19071c08ad1db79ba018687f3e6afbe703b1de26c11bc8b62fd6b2fa3219fa7190379504820abc97ff6c034f7850e2c7fd335462725db6748fe45920c213c539356b691f22eb490faca24e99f0a044a9f727d0786566ad00635983692ef324bbf1f80c42b269e9d5a8df3249873c51521c81400c729ed7a5e73995928abe94d189cddf2774f1735bc2060bb2240e558699c365dee45fa68801e6a1745e03736ced1b89fc2755565e3b36c2102594d43c451122d94f4a263664bd26b2fb5bc7700319f6b08796864f92d0fdb41710910bbc13aa9cc7baac3b48a24e4f3573f315448c317c149ddb433d9ddd2a2f0cfc81c22d3dab31f184975355b41e4b36fd8f22e8efa01d61a5cbb0e4fcdd273cdf68ac73fee745faff44d44d93c5a111aefe4a5ca8e8e7c075ffdb738cc5b6466dff78ddd837c72c54941707b04d60bc126a3a2fae9540ec2e4672ae13de0d927a7bd363f8abb5a56364d6d564df90a46df9fd59e2c54d5bcb8280415257a6976d8fb24c33330af32600cd1559e0eb05d55b34be456d434bca98252fa531486ce2a24c8bdea1d57d93a550ec586920903a39ca61cbfbce79b8f3a5b1653794872b2c614458177e748f8dfd43840e5bb0d608c26389347673fd0b005f60f52c56731ee5faec6c8d0617fb53d5f2415c2e7906ea0e6d0066354b213b3e94f4dfc311e4ec6afa7e8d1c69a63cccf8326741456a5e0bd0a359b7a37c117f7892969ad7b70cba9bea0a975ada7cf67e0d7255be8d2c6e7b8788b9ff14c5d1449d6173e07b5f9d94560d46f474ab2a67056fe9f4a9fd617a617d23143adb4e7ea35f2d5cc1398fb9ed43ddcd10f28debb27eb13533110005e6c78ca4a874db68c65081ecb8bff1b64eb1e2d7b76a1da3b375dce8a92d32a6277ed847879345717b9649f27e846a701549311c7e69a96d61df616157a114bdf1663ad93a26c28e1a62ee4a7c72bccb9785639eaf1e569decf777bb0548ad9ee36788cfa1150eee3ca3c96f09052ba2300cfb7526b9424b6f7418c27a1e9bc13e4d9868e5c330c051c3885e44714bddf7cb090fbd0f36b826aacbe191dc8c35c219e19fe736198c29dc4fa1a98b5fb1805dc29ecd02f74d4510a3928448b5ee61b5991e46644850a4885bb1ee272883faf27962430de1922d0883e7e80215cf5fe7e8f3fd0e2a49bd50727af793cb7e5b40860e80a1fbb9d5b5696bdf2f741909ab5a713de47716332df6c4f78288edcd6ea130d895fdb2f29f94635bbf2061de55f1801bd6a24294aa199d78021a1ba771c651de4bc08f032fe6ad7a5caf6a6afc6de649b901f783a0ee0fea9b803beeb0f431400d0707f159d7dc29c0c334a918fa08a653137a4a8bc86066c8800e1d171f1dbddf1fab8a3eff6b5023da96f002e7e217e826fa378b15dc8a376db30228f5d6b629f331a162d63e53e5b5bd7ff9ec098b4314285908281930ff0a8aa86a6d89411e6b5bc6b9c9e931623ccca6741fd6d36311e6a8e323a37ad40b7a2797b84694e736d9c135e52d149c760e727598726378cd674b0f4df1c361de0a12a2b8232e611d789bfbea699e8e77b99f3449609caff3d6ef7233df8cfc624376c905eea46c6f77c0b01d288868a19db77e227dbb5bfea5cc3f49d219c7477f7f2b3447b0b8efe08eab8f69579d727555e547c13ec7ae13b83386f2adf634140c311b6e2759cfb9c8aca1c32bb7c002d0f46ecc526916589a29e328ded9679c2163838f071b5b85b35e5e7d99c3c45d25bb9d37d7bafb8350ad4695a6e0cb7ea7d93868c30bb54e301e21147696b7dda156226a5ef8c62121e6b2cad0c4e192116192012468eaad46bea69a140aa3cb9056dec87c911636a1e55695b9e5a27c63cd8c03f31570d4b7507d13731ea31f082b33c6db8dd6e22282f9790be41350a96abfc4dc3de78e0a698930f540dbda3fee923a463a4c4a66bf00bb2cdd6d22b62a47af96b78b1f0f0a174e4ec5b785b3820f47d3c8cc1691d4751ce4e4ab78a4551956158a36717dc35488e890d0631241906db565603205e054815aaaaf17945c3372dfc7193369871e2e88fb84c15a2b9071101e1208177fc18397e6af17b5843e1fa75392d8d3ed214975d50f2b19c24e83f010f8c394ec1edbb1cb912e61627d2760b0e630b986bba2ae113b8f3b51ba00ddc495520274a85e6f6fa7573ac4ec6e2a86a1da9199ceb007aa6f132e5ab8ab8fdca7c829f452ff17524fec475b8f485b29fc6f0d972eea4ce98e242b5d58f6ddc1b3a71256de1c584c9914a3cf1e469f0033165d934fae68a7559011dac7a4e0c72e3b398fab8f8cc2fb67963b0f9220f410e5ba13026a27288a1d49edfaa51e8f220503fb5ec476147cbea975994fffde3ddc51bb189c470078978d238f5287fb2629d23989875d74b006a4122f6a342c996d4a244e8c5e4b804a44c301ac4d6054181a07964b279e0a44c158364395a2ead40053d2f3350ea0529a57552ed835513f533ee0c4b94ef674f31851616a4fa2d0302d13cd4aabf5f96ce28219c0b5bc0e5410fe0fa387ba1009a6f2280f9e7bbe20c33be5eb411a5f6327714b3443b4152cbc54c4012473237dd98b0490fc4228ded74afc81be2a58a22e03ca987faef5310e474f4f5a183f6b7ebede5a8df8a0f94a87a41852826b29466fd761f40b416ad0f263dd34e5497867766a361af1654c3fcd6ee7e6bb3f72d64cc980f04305b63bd574f116d1aa35b4bd642cab0cde6a29139aaa163805c6c40384313d4ec6027c891023083988c1b0d2edbdd9b1afe102fbda285a6f897efff72a0d7fc19a3cb6756cfaa2371e13be3cd167cddb90d525cba7da69608b9995cef92a6424a14df6b860ef0f09830fd7189497a432347680de0f463c0aff82df8098cc4f7753f7680c8c7374d01046b05c63be73f3a1623be778fdb0bdb90d4fb4b458af2890d15f108b0927304c91c8d62cb148c35cc93797db3ef9bba1014d89859a91da0c0a971f330600d71565d30e9c9ea8c07e7f629e1a6d578da04d37e597261cae8ab7d9a952bbf71573f1bf70e064f36c032cc624e3c980e5ea46d36232d61a57fa598347b7fb6b28401e34628b051d6ca3dea190d1d3c343fcc83175f70f77a8fc5e8791b9788989df1e37cc4881648f4fc673772003079adae55c83cf02a894b98561e4a6e4416bea3df18d6f702ad5c4f40faedec6b53cfdb5b3a52d7d43b97ee23ccfa2d30c7264ec555b15f1d9e7e19cd9890a7e8e01ff21d3b8b451e50932f189a420d18e7c7e2f103332c78c84600e5e8fdedd84f055a8b39be9a52782d47c6205c0de41644b09c0931f2da269a7e58e669f3b61ebda28ab8e3f9b83ff3d2bce37864af494860b2f01b000abeb737fbeaf8f9fa6378366606dcd0fc33031b94f9a7a0e562c08ea720a671ff92520047f69b138b4e032c3828874ec4c29e49aab302089956566372b20c0216b601c3958ed9691bbd89f1df45c6613d469e3b9758a70c860fddf768b10a6bf70237a454a2c0b70dd5d02da612a91fc5731513012a4a6fbc16d01550bdfdccaeca22bba104ccf6aeb19f21d4cdd3da231af8ec5bf2a726ee9cc7c85b8ed46d2f6fa4f1b010b2561fb69690d5a9df76d729450a6e139962bdaa2bec0254c5a252b97e7ce7eab1817f454c6121130952b8c40628065dc9b77b0f953552f5aa3ff983b6a51a51dd87c2b51a18e14adb8c80e002d0b47c61cb357babbbe3ed51d371941a8f111837ecf0e45020cb941de170c4a1b5e61bb928b1b11a8d902febd2ba016771f171b8a7ae825fcc4642d95649d53675d0027822e4ff79ffd302bfab1a0ff26f3648c7ab00c10f8d95f21e40ca2b40691bd4be79bb9ccc0bf760a05be4728bbc0a64e585207d1d09393a80d5f574442d6a933966777ab05f699c4e84aabbf753059287e7261d972745906a4fd8967bfc80ae9b6ec2ee1b22a81775f4f24999987365ae2dfb6739902ed51b9a4394fdf29f216c34567102d9db301661b09b728a79e377cf4bdfcf5c83b110a2e267abf6d40947e643ae2ff0c244af168c9f33e7685474ac30611ef95f218e0dd280899a92a41e7a759d03ce3709c2a140ebd35e199f1dbb96f7351cbe1f3de8da8c49758a49b9e724ebd3220ed6f51112944f70c0d1e9178f68a2c9476a913de00abbd1f5bcffa646f926da77a9e9fbdf81cdeaf7f9b13e843afefbca81c93614f8f1675325965b5836b8a77620a5ff162e25366718d8da7781e1a7e01fe2e9e56cf958c6273473abf5c2c8c7fb209307544e1c0726d5571e521621b18b6da3064b473423536b1b76ed75b21b4ee205d7ab5f081bada63062706bd155672dccf84614210d72660095437c6bc2213d9c904a4ba1bfda14d350fa3dce7141e817a50859b1a74aa64560b2ebc67add9f945b6e85577589817078c8ae54a9fc311593d2cbdb6692b089ee6264cebcc7719753f80e30dbe48b64fcfd1037fb9ddab69a5ff9e5898bd8aa947d9ad827c26df67c6786edcacb3478a20bded1ad8c48018ae0d439bb5afad5d39bb8fbaf22d72ffd759c4fa2e94a5a89f41358ebdc4c3aea5110f1965a049fdadff9cf703eabe9628e2680fa4e70320d304ecaed13f513f27220db1916ca1500f1c2e091671fb71329dec0bd6e310c83e67af61b8ab60ee1a8d559a508d174648b1bca451ef0ab0ee2ef74f4fcfaad1cc5ea6cadb8f1bffcb1f2c05122011ebbf6abc16838e452fc47653821589da4cb5bbac10deeea3ba0e0a6241338e64cc78d7a923d018e8b5b51c4442070e5b0e6f1e8c2b83791e930899c5897a602c401c1b85827962ff56d19c06f5af033059bc7fb1bd29b65f66aa5b4397834e846935e523b16438a42c1f990ebe4f83182163ca5fc60a4c6d77fc182e81fcda943a962e9e7f00f6399728b48bbe38d8178fae3582c8d9998e49df5f28e32d541636df3cdc8ac00df45db12da2e5e76f366c1ea8667ba5f3542d21f58ead7c55d06a4b35251b8f77dd34d3de262947379107a06d2f4891ffa0ad3a3e5bb2bbbb978af4953310d4cbe5525ab344ebb98ed24d003600de8f3af36ff3d0a7efeada963845d573685bec2221403b994f97b1e714fd7dccc300b62c2a516e9c6780983062eddde0178e93fcbb2ed4f06f60767356a11d22ca37078fda1ddb3cb907d1020f62ba85d09044574ba28aa3df36988eb8a41e4305e5b0687abe43a90e4f68f0374b6b05049aff5b065d7688cbbfb0e96ab03df38903bfa1c269f43a114085eb4596aec87ced88701b42f0b7426389727308bf10aee9d8f15ebdc411ce1e764a290a12faa2d7c1126dc7b5076f219b826ac8d380b69af7f95d69fc3929a97f5c7da1db6270e9ee1f2a5f7fa3a1b6bfcca00463655121f681d3a627d03efdf0b5fd045fb153bc4488a9a8b7264373c710ebfdb1c267fdca37723b21d5c3eaef48e784bd76e27c133cbc24d114f610c79f2a1f2c30d87ddba395887030b65097ca5566eb0361e70615b46d4b86c2759f1cc2efa3915b4cebdf51a745fb3c6cec69a1fda2ec5e884dce228e30af362815d2d8b59a14f89606bc77439042109369a9648db7d71024ed6df06c8ebd22e8623f48feea77f48b5e88827fafa84b0564151a5997b7f29c4d3d18068e34f2690a293d54003d0ea8f3bab9387ca72212cedb5f4602ad047dbffae2ab3a4cd2865bf896cd96f78b90e4017eb7e3c7092320c0a37f81dd65a5c4817a4e7053e6d2bcb23b11e09f681587f3a9361e974ad54b88c72c296629b1ab754d25be15e87c414cff975fafb3d7cb68167b21f1889685a48966705222b525fa47143b00041df94817c275d93c2550fdd82471cb3cc1b5644338060b767e807bca902c180b3e535c77be2651b3962287b6d1f6403033de4e0aa3a20615ab59d290f4b167325959c1524ef216dda2ffce86b50cb6b56b62a20a043d9d78c704479c22340151df5a1907670f8d4f8c90d93f7b5d94d04a4d383914867aa3c0e5ac85fc299a4d2801a3f80f4b0f046fb62c1c8c539a83b21c7549df0afe200537b52c80ebdbad8a438e430cf876cbbfee9ceb1bc5270577c27d53b40ac153cab377a565b1a9fbdee8bf8e94839c0fc04f7f664383bc90d56ccd1cc01b465c250b158b5e6f321c20db245602d10aab80c553d52f17282b095b5e2234c6c689a84b096112100359816cef7e92029fdfc048058f847cd2f2369ceec9fd171a0487bd7acfed6b0319832df6d59affbfd460ce8d12e4171da0f094e872a2888fe74925c5ef0621c4edad337f7006086748913b24d4d48ce36e662fefbe672b6d476456b1fbac6d80030ab93da93acb4a7e10f955547e7e20a0abcdbf909f05a2ee2e0b7485fa16be652b9d9fbfbf01f082488a81022bdb69af9e6fbe753e9eb92a1762afbb4df49f83ffc0cf03db563aa96fc5ba1af6d4d7eede6067749e8ecec79b63e09742e29e99e1c960dfb0688b0222c49ed919379ac66e3fa1c72645122d1664721e78fefdd1224c0b886f6e214e37d268ca9acab76ab3adc9f5549e5dcdbb3d31ac34ac472894d004eed71f88ca2377fcfa48d3ae43805dc612891dadd06c263ed8617194f890bcbb964f010d277ddce1f6682e661577ecd51a4d5421f00935a5b24fef0ea1809fa5c4fe9cf8c453046f61136ec8872915d2462157d73a205d56d77bb83cf16b88cadf6430c0e5397fae1f91a6a11b177bf04b065a2e55df81d5c086ec8dc8a0a660eed37d41fe4d8b3e3f22238e2a63b6e4feee1fe9a140ed37b2be4193f75c2d038aac7f6b7dad2a3b37e5b9b660615ec1db77a9b7ab416f43e66c872b71cb67c9245c757dc87723ab3b9544fdd8a16c9486e8ec3c4a44cefd98535d6e5683426c1cc8c888b8e0c2e7528bd7eb89b80d9e00969efd2f0a0fb09845426edf0d1d9a0809648e7e46ea0a8c9988bf9df475be12a72c7326c1f2bf01afafb190cf6f649133c7dc14ecf9b8c971135bd303c8894bac637e08257d45e1b68edf550d896c41682c002396e8f1eb7c1e2f4e0ed9b8b7010fc7847e6fb1c5907c17b2d2b7cd24c96f47406bd04cfcb2099d82dc2902d6f91e2f8f3a05bc62019af536309e7847fc06c10dbf7272a1509079fd16bb16a85ae2e078f97f9ce66bba66d6329c7ee70f9688f6d91aa38b25c7f4884658a72ad8cbf96d7d7a9652673273ee1b3d4d17780dfe9ca865416e318bdcbe9efd8e071fcb15ceb0743df5af4f7d598b31e38677e65af61c1109fdbb11fb11e3952e6c3ae8abc3f894ccdf205ae55dafce1dd05dca6b899877f57d712223dde4e7fdec7e0ed4f0a29ad359e318eb36ddb42fb205adca400f5b2615947c4f0ede95788093a1152d88acbbbb272750823151e245354e658452a95f21fef05bbfd98a10c1c975ad1a08c59fa3efa9fc73588407a83d0b26a53f1b4115f83780bc70ee2619d7374ca45b9e200055df1b93977e17aca89a009110a6e74caec7f86114f91975bc6e8bcdc7267ed2920cf12cd7137840628e1b8a0ea181dfef18dc5f74e752f842ea91bdce4b420ee709bca72c4514e92bcff55902e5529d77fd95f5837c8f4fffce80c813630550a0dde24092a25f65eba90790a06f4d4c3e739aaa8194a147fb32e81c71d3e8def79251c33637661b0a621a2a6b302dea00d34a9dbe9b621c1dabd0464e85241aa6712d90b4287cb23c17bf1e4d0e6dbed372e6b49c4a843305b3b0e5cab0b0964a93ad0bbc99ee711afa7f2d0a296a375fdb3176c65a957ddd9b88e9d57df736acdeb02a71b924cc2e972f51ba68a597215678573bede9ca5b3a0a2461b2d3b9ea57a5af8c91d40779bf917ded32f14a66d96e28e1415fea1e9306654c6b84d8a64243a5271c1f11590423c718961aecf5f659b49f67efa78e02ef2524d0966ebcc446d73d49ab7ec31f0c009069d14ccd63f926169291b83a3e37610054b0b964741e2ed8771d20bfa225eac0280b4d5af0c09d3218bd497a035536f5af0816884d606f1a872b8161a266466b56e0be8b80a7bde65ac706eea8cacf1749e5e71ff9fa3e69ce878427a0728d44e666eff977026abfe18cf3ad156a943b917e72ad65725a9a8d60b7b5740494fa63143a7f2a94fe6d8b319be55d6fe1a988244deb798f345f30dcafdb6af9e9cee9e35733274bdf3896750897371563ed2516c4ca6c3c3c994b48cc94b67e8129d234a0e19dabe39e500214c0ed5f0e5d61b2f58d7355d147102d93b2689bc5185dd4c0a18efd11a307b887d4d0fa84fd992731b3a80dbd027dd36cd6933766c537e8e9e27d35d5187e8276b0f59fbe7b6d629d3416b782e7981d85e1e890853c3aa94a93c1667a55044ae42badefab979fe7d525c6a180307c5ee3a9c3933038028c3e1d15d1e78fbf53b6ea61ac5e02db0161719398a31570c55f73cb47ddec8f99e3e14af5adb8d5cd179f4204d080331e75bd391b19d38eb81f148c36af3e8a3ebe76209bb75c9741a89b5d0708bb0fbb0945fc6fcd6ce142d19faf0947c338dbc8d976963281866b5216421c00cbd77c0907d1e16f5e925319cf6c62f8c6e8eff0c2f831c504e7a1c0df09a54e2af708ceef39ed7d0f63d83429e9b0920c03cf85c2244f2fbac3958847113bed577dbde8992cd91be5833c75faedd5e2005d4f7b66fab8fa9305927406f863d1795dfe04028940b765bd79de6972dc7094fe1c2503a73d7b50208835216c23aab3e47094587549fdd74bb50ae21cd1354daab632fd0907e63f4c2b2d39d7fdc4fc216bfa742b4608238623cb7fa01bd851c1e7ad5ef5215173a71f363fbb7dae8092486f4a1549e32ae53b14c1343ff7fb5e2b1487d9c594a1b56e22625d275e41535534d225b7b2c9deeb0d30dba7188cf75d680d4545ed05044a0661c690a37fa14a73ba8c68357e2c948e290b5d9a4b51822824614ef2938d19ea4b650041f59f3b548f0a305b86f55e69760f37f09dfdad62651aa5fd84eef28a4431136b34a49c9bf1f2891364f86b0aae70b0414e821e3db1533b0f1db5fd232308bf118f858aab5ae974c10583f61b283a3870eb82aaa8ea3c4e2ee3c3a3d7169aa8e975ddee7f620f6c5bcf3eaaef0101b62cd54495cb8809052c9e3151690cff7c1efcc4f63b22472111a7c5d9d7d2a2be951510f60dec8c426f14700c8630f8a14dfd359addf5d9b7ae031a745ecb4e17321b385799c90f924c4780287ac187530a40b064064b9036cc46e3f87c4d23aeeed1bc22a5411c7c503594d5d1261eb9fc4da242493beee9f671485a978a32e965faf9b0e2c13f78e31e1630b72d35b4be691e90b3798e18223c1b514b39a8e1eeb7897c22fdee1e33fc76e2b2f9298ad4fd89f44163aaab23d754d98c7890e58708b81b3832aee31aeca85e76416133710aeba0e5d9f17695e607d09ae3f94be191553bc39c6df03cefb4ee05516fc02d66c9866e4eb0d89a662e309379a347159db2e070abceee226f2b8b62847ef7c51d69c5f12eb567fa13af4b4f90b3f3d9d4b6a3f68bc4dd77075081e2e99833c18b154d0d6ac360141de2a25af61d551f10a34e03e1419a37409b4c177c51a8d248157b411868eb607c34d2daaa453a0954fade5eac45d5f21f50efba8bbc9c87ff0435c70f064b42cb2d158384fe0a4d9c90030ace7723af0a6c8faecd8f97f9850e2a489a94ebcc655301e2e14711de9eb08726638a9ddb57160c5545c152a26860a17dd18172bfac138a300f60431fc49eff18c93f71400e887f878f4dd637cf5df8c1e2b12c0f87e31ba2754ac1748479eda0c4184b528554106128320dcce349939e5e6cd3434f86dc7adfee28c008a21ddf9d0dbc87ceb14cc3afbef1e06fb3f9908a4b14f5e6c43b23ba783b75a6cbfa2ebac6533661b8c1143a34e8e2a9723389c4b7087dc07701c53b169894551084aedbb423bcce2f470881fdc7240c26b3b76fd6cfeebf8eb2828b4741e5e8698b19fa0a44703cb4e4c8ed6a7e4d6063f5fab724e08a159f4f04a2f351dcfb6335ae6697dbeca25c76b55e6ec9045eaaa8706902df492b8c8cfbf68c4cc1be5d1e5a173262e38bde051656ea85ffe35d97f1b25f6a47381bc327a946f7cbf6210adfd957b2921 TAG = 469e3ef168a64945f76d7a2013f27b68 ring-0.16.9/tests/aead_aes_256_gcm_tests.txt000064400000000000000000003046151352416253600170450ustar0000000000000000# The AES-256-GCM test cases from cipher_test.txt have been merged into this # file. # The test cases marked "FAILS = WRONG_NONCE_LENGTH" would succeed if nonces # with lengths other than 96 bits were supported; i.e. those test cases # describe valid outputs for the given inputs, and they are only rejected # because nonces that aren't exactly 96 bits are rejected as a matter of # policy. KEY = e5ac4a32c67e425ac4b143c83c6f161312a97d88d634afdf9f4da5bd35223f01 NONCE = 5bf11a0951f0bfc7ea5c9e58 IN = "" AD = "" CT = "" TAG = d7cba289d6d19a5af45dc13857016bac KEY = 73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e13a NONCE = a330a184fc245812f4820caa IN = f0535fe211 AD = e91428be04 CT = e9b8a896da TAG = 9115ed79f26a030c14947b3e454db9e7 KEY = 80e2e561886eb2a953cf923aaac1653ed2db0111ee62e09cb20d9e2652bd3476 NONCE = 5daf201589654da8884c3c68 IN = 96669d2d3542a4d49c7c AD = e51e5bce7cbceb660399 CT = 4521953e7d39497e4563 TAG = 2083e3c0d84d663066bbe2961b08dcf7 KEY = 881cca012ef9d6f1241b88e4364084d8c95470c6022e59b62732a1afcc02e657 NONCE = 172ec639be736062bba5c32f IN = 8ed8ef4c09360ef70bb22c716554ef AD = 98c115f2c3bbe22e3a0c562e8e67ff CT = 06a761987a7eb0e57a31979043747d TAG = cf07239b9d40a759e0f4f8ef088f016a KEY = a6efd2e2b0056d0f955e008ca88ca59fb21a8f5fc0e9aa6d730fbfc5a28b5f90 NONCE = f6775dca7cd8674c16fdb4ee IN = 5dc495d949f4b2c8a709092b120ac8078cdfd104 AD = 86a597f5e2c398fff963fcfe126eae1bc13f097f CT = 04416e23586ee364b1cf3fb75405f8ef28fddbde TAG = e7b9d5ecb2cf30162a28c8f645f62f87 KEY = 8d6ed9a6d410989e3bd37874edb5a89f9ab355fa395967dcbbfa216ec9ce3f45 NONCE = 55debbb289b9439eb47834ab IN = 52939c7416220822a77435a46687f134cebc70a2f1a4c33d37 AD = 7790af913d84a04c1b72d4484ea2e09fdaa802d8b1733b8470 CT = d7bddae8929ed6bbc9ac077e2415d9fbafae4a0432f8f7eb6b TAG = e6383b16ed9c32521dcaeef3a7b9b67f KEY = 525429d45a66b9d860c83860111cc65324ab91ff77938bbc30a654220bb3e526 NONCE = 31535d82b9b46f5ad75a1629 IN = 677eca74660499acf2e2fd6c7800fd6da2d0273a31906a691205b5765b85 AD = 513bc218acee89848e73ab108401bfc4f9c2aa70310a4e543644c37dd2f3 CT = f1e6032ee3ce224b2e8f17f91055c81a480398e07fd9366ad69d84dca712 TAG = e39da5658f1d2994a529646d692c55d8 KEY = 630b506aa4b15c555cf279dc4a7ee9add213219d2c68163ceaeda903fb892c30 NONCE = 79eca200a5cdf92b28be5a7a IN = b12e6f1f8160cd65278c48f68ad53c8c82fd17c2c39bbb109f077c17fdcb8a0b3a5dbf AD = 46cb18593b3b26ba75e4cb20a252caef31d00be31093d2369e93572a393d650c68313f CT = 9a9ad1f78b4d411afe450d2e46347a7df98f39daa4fd478b9ab6e6b417878bcd52743a TAG = 55453a003b021c8a247379cdc4fa6da6 KEY = d10bb6641e9ba0a3f1b016317831ad4232f81c2137adac0940ecd7fa36de0563 NONCE = 99c922d37c95ebeda8e81ae8 IN = 8b9089df5bb048cebbe709cb61e178ec768515a0031288d95b7cc4dfffeb51b836e126a237ec50cc AD = f1cbf6c83493b2087d9f88e02121a114f45ed51817e46ffc0b66a783350eae89c6700db3f3be5f4a CT = 8a838c51a8ef8134481e9951033295ae686624aa4df72f869d140980347a5e69a6d7cb3d7119b303 TAG = 9152bef766579a3e9a1e36abd7ebb64c KEY = ca665229adcc7554f1b1c8f50e7444c6d4059c525f9c0da1406ffb35d50cae97 NONCE = 8e2df19123ce0ad41df416d4 IN = 12365eaac86b270e9c61b3ae7702a6f3583ef4accb80a98454c56e34e2ab97d8afa23ddee34e7e3a522497f985 AD = bf539d8e9e3a02f3e5834970e7efd40cc7cb340a075041428d6a69ed9fa5105e4bc63720be9a7040ce5b4af6e1 CT = 96027efdcd4433df8e7f6181c05be365cdce550b09d45cfc96fe258eab6d55976a9306a0070c9589ef08cf7a42 TAG = ec9fb5e79cdf8ad4c8a79c900975159d KEY = 5033338bf7526cca0425f4a620424662ebc58364c8d985d130e525fd1f598f3f NONCE = b40842b30758aa3eef7cda62 IN = 69a62b8c5f9b81cebee3a9345f4e49ea089b0d9c1cc57b4ef707956d0287de83fcca6d8f5270a9393e00693075028189bda7 AD = 3efe0ed6fbafa61070388abc59c0d06589309736b02418df5534c8c594d61a2afefbee17af8283d01634b6ca3e8e2aeadff8 CT = d6184677a21978b6443d99d7de1fd01c6b6334cf01b7e7d58456267453f4de96708b62301172c8c87e970f91c5301e0ff61e TAG = f8ac7aef208712845d137b8b176c89f1 KEY = f33c39140999a2cb69e43129cb5df18fffeb3513ec3560792e9909784daee43b NONCE = 70608463f1dfabb1fc4451e9 IN = e2802c4d290468177fdb031a717345753cd7c3028ed07dea428db84e7c50c3eb7b24f7381a167b4ee31bf88dcaf5251fdb90ecbb74ac2f AD = 10a6f463dc59d4791b3c2b4c93cbe2dec579a154962cb2c4cc77664e8c2b106c574fe115fd43dad94b8b1bf2f74820e28435b4444b2b82 CT = a27419a46037323c033d7cf2a716777fedc02a5ddd8bfbdbca82ffbdea3037bc1cc80df7c5e502b32276ae88ad6fd0f0cfe72604648812 TAG = b1ae330d47fd399aaaa687e141e23fc7 KEY = 2121056225a7b2316a93c4bfeb970486fa9c586c14ba8b40be5844a31e9449c0 NONCE = b4b7d1e8fa7d0e2334c92315 IN = 2038e2c6cdf5282f081292448f8febbb60a1520fa3771cbfef387f48c5915a1438ab709628e8d4c81623ddbc2f6f159c3c9a8922905c4994269898b8 AD = b07f66508a39c4932b04c16172d6462d78273cd9463e52284bb73e3b8b8e7047bdf10c5ace1f903e5a5eacbf67c9351f82c74bda140df2fe0480c80a CT = 7b54618ae09b37ee72e51873c82cdd20b6dca37c334af89548f52f34df3a757e632cc0d453fc97270898eb50ce2f2a98c4cbd4cbb22a5b7c7564406b TAG = de3a9e2aab2439675c4f7f0b61216d5a KEY = efb15235bc91771aa32d51472877b0eb364de2f88766908eebc6e6b57a702099 NONCE = 1a510b42dc20d1d0fb34fb52 IN = 4eff604dd4bba67f143dab0728b8597e269d4e0ecb4ce80c9850afc645d96da239d9db360605bb4268d74e1fe3431a44242ae862fa2340c076db13315f615b85f0 AD = e8dad34f727e77444a96cf06425640f1fc80fe3b01dafd1d91476140afe8204286d01b0ebdadc0270a3d218516ff5f08a69a7ba251ac325983caccbe0d9e1de359 CT = 989fef0145e2fe93b9f99fd90123632d83d9df8f37d8e1f80dac329dbe0c214c2191009e31232538fec63a29665f0fc1c77dc86b2f5f2050b86b3ae48e85d63116 TAG = 6816304faeb45da4e4772f5c35730f8a KEY = 998c22912d5687fc3faac262a902783fcb0c738520b5c4135a8dd2cdbd7b0dfb NONCE = eeb535c5bd6edfd696655b60 IN = 1f6ae10d425923c882b7d2f556571acfc10333ec665b07bfad9f8948a3b8c5e5f163a4e99d4726da1a35359c657c848f327b7fd9b5f61987440ab12b9399db24715715a2d1c8 AD = 9a3c76dbaeb69a6481a89318caeb6358267ef51a1a364a48387bf77526837c9c70afb6f105cd47d2b976dbda7d2b6bfea7b76b135810c53437472f7b80ffc8ce4dc95c7e5045 CT = 87f4e2c80a4f15f92a8e94f468e70fe7f0e0f83c0a7799a1d465043d25210ac6f0f39a5e9765b4daca637864d1bcc090d2ef33ddfccded2d2dad61dab443b3cfcc683147c490 TAG = 0744d928a5b5ec95f3087cc2623f0031 KEY = e12effa8da2c90a5d35d257c07d1b467991bd5f75fecd7129aea4e26b9e27ff1 NONCE = 4edd0b4cc349d37eb77f5576 IN = 21dc87984edca46a629ed95ffb04471397da8806c525a781d9a71818422e344e4af577f38e7cdbc556d4766770a9a3c95bea59ad497fe0127816ec4dcecb6b999486719b0b86cdb2c9d09e AD = bc158e6570fb0a08d73367dba65b80a8c8e57ba6c7b99493ebdaef0424e18d8ab1f7c88670cf51c4d91b77eb9ce0f89a46ed1316141e4299ec6c3d6e712ec9e92d3db44640402aa4ac00ba CT = 07ab8c623d683ff83030392e2864edd4b8e3d296d60579a226a8d2aff6bc5af3c4598a18cc1e8d7db4ac8eb56a082af864ac52a324851dd29af51a0945cee4bf303ea111b9b627aabf5ff8 TAG = 53e69b7be969c39560c016c6bc1aa4e1 KEY = 3d9723c9235939df8647529b7e4a57b8536476d5b71b424e2c27ba4d0b82b0e8 NONCE = 60163d2eb7822af7fad64c04 IN = b44face0f45e4a8da19aa0c5cbe3aa960ed6b74fe3d3d9201f52523dfe7651756b2ce482e759c87bde4ec670a0e808fb4883e437c7cbcf2f6470352174327824200cb0897edc4def1736f51e229addaa AD = a4b2b7bf36a70a5246feee52c474058100bc618fb0e3d32e8c1f76153edec47fab3045dcc7eed9ca1886bb2593703c9ffb8883c45386d2f4e3fbb0b7c722d19f2eca94767174d9127450549e8993ae33 CT = 66fa63ded066ac67bf218af7bc21169a875f4bd695f44fbdff906f0a9b8a067be721fd260571c53a8b51661c8d49fe178dcb28c31deb3fa71b096b387f9fc8f3657d280404c05d2b6443eba7e60b562e TAG = 59d5450872510c4bfb590d9497524331 KEY = 75b0a20935c4a5e2126ac7420d632bfda8d41bc947c2402bed4759b6e617ff92 NONCE = 0c3edf0dcd1125d7e263b897 IN = 8edc98e70030e40bea1548f6f56b4561272be0c333f3b7ae53ff3e27c35a91b1aa42d39e6305ec4811e75931e5cae2261d88a6f7d6c5b05bfb48802264e9cac782411f1de579e29d464ba56840b126a3fad07f01c4 AD = 7e35081ef652424da6304852243ce43ff711da17f7881d5e0433b1ad7535e755a8531b93d67ce99ffe66e59fbb24f6b42655524b39f2c84daa5cdacb5e7916266c05711a118b2128930b95de83ff1a67e53337474a CT = 858dc74dbec6fdbe4ef15a3596ff7201c8f4fcca765bf5452f678b1493a66ed9852a6fa174a73099acf951a35699f33289ec50625538c01eaa456dc658013a29e4d133b856eb969c1f221f99e11fadc98b0ee08243 TAG = 3d8f17838c4fc69f04d7e2b76eebbc0b KEY = 7a3823191abcebadb7970d1b65c2a8dab8a908151737bd5400b3b6c0d59e3b08 NONCE = e32eb00e5106097e2ef0e8ba IN = 220db5400dce604adee4cb698cdc02d2ca61622bbdeebe347b0bfef55cc45319b940f93773a9878725c5f55485d7a26363251b9ce0d3da1f8f6e34ad5329dc9f752ec7dc12b2d259ac89a8059085996a431a56cc2dc2400a26b4 AD = a83b6dc78931cb7500eddcf77792e810c1edbd5f4e33f85018807a8539a3cace094fb794fa9ea058e82c830d42d5a6b3e22b7785698774aec5c73edd92731c51106a23c569c0c0fef18d13da1562a9a42aa435b243c4fbc9fe42 CT = 5ce6ec0e1d67ced5a6aa46c909b9b8907b372be03331dd0940ceb6d87e928c14a1a1e8ef9096c9b63ab4cd93242ec7be7e38b80643f9c52e7e90ffa06b8f2d238fa63dcd97af74ae37802d124623b8a272e68ca18b3432b7c017 TAG = e21c61d604253bc5b5d58283756b9eb3 KEY = 53ff6dc0af3e89fc2de7370caa433f539d068609fcfed6400a5b9fda4c83e3aa NONCE = 91a824c5e023283959858062 IN = fc23e07b4018460279f8392e86423ecfe465b25b60382f58995ef5fa1f9ca235e4bf87112554aa0e72836831d7b5f39125df11518b8aeb1809d804419beb05ae013482213012e4ce980ddd1c58e11608b775d12b450ecace83e678c69d2c5d AD = b3a1db2d467780480f166859e0e7aab212738b85e88237c2782496c9c503347de02f3dad6bfc671fda71a04ff1e4661767c11303daa0c36d944346d39e3e29ec63d695cdcd83b2b57181582c5ac692b13e4299ab5e86c59d09c2dc6194ebe9 CT = 88af588ec33bdac2cc748a01ee3eec97e5bbfdf69de1d66176f42b66383bbffa8b185cdedc25b11a62237d334d68120fccfd68c2f9447b3b8e1f623f33f7f97ad8815d29bf11bc0c65641ba8fca4a087783f4694fb1d574450191825f84402 TAG = 2c4973323e635a885f78ee106eddf19e KEY = ca2b4d335598f26d3d3607e62b9ef853d3543e741350f92f3050894721d3d450 NONCE = 2431b5cee8c3ecec4caad278 IN = 75e29e46350d1fa99403b1e5baa414e41a8e714910f313f8e850cf3076508ff650011af766b51283fbd5626166d775fd4b4cb7124d26d77b41eb17bf642bf67a34c1caf0fa9b43eec12103f864e56c5ccdc81b89c1a35e394362688d05dd94eda3d05dd2 AD = 31c3ce532bc1bae65b5ced69449129b112019cc6078268b853dd17c41832ecae07f9c6b068ef6cba2b55f352904afd6096ff8432081aed408d9340c319fd8e2029c389b6e3a4bdc38853444c3f7be9385ff1ca27e59c43b542e99799bb4ce56b8e26d6c1 CT = 90c13ec26d01b7b96bdd6816d3ee57df57efeabdb15ba602229ff71d71793fe8081eb1b462e8b2967bc4af96fd6dc72cee3d2b6495c7f04c9068b2ad0b073e11cd5999df541ad705c6315eefa8da49c5dbc258f7ba922908489c1ce672971c3bfb6e8482 TAG = 3a7741a094be92b838850c32e4b06c6d KEY = 49fbbdb5ae21cd955be7f7603cb8563ea0b02b77a9ea14016baa5cffc55d20c9 NONCE = c0a4463350506d2af9e35d8f IN = f31003aaf5d8fd6261c01c5bb1e7bf6af248e0be3cf8aac67ccaeb0b7468a40d98be526a8e4f692dd23763563e601915ebcb59ecbf03bf9c665c4c5313c318939a911888fd427d5297b9b2fd91dd33eb7ed38e2f0f6ab74ec263989cdd9915811a022d4a46ed35eef0 AD = 17e01af2386531ce67d5bc3325d8f83b53a87b38f1c305f99c0798380a7e59d3ecddf33a5ad23a82e33f0fa34eb2438b17e958451439774ab642fafd3794f80a0ee1b9bc165f32df705a6175310670ba54af3a204e446db35170ab02670086c47a475c22d1f14cbe44 CT = bd661836d1b74244baca62d7d1cb6717e17e2fb0bcbc8d36b3265a983d557c562b0be60708499d0e7e9626825bc049db79a0ef4d2393fef6024d849089455e55693fd4da3d910eac11496492a645e4376855732765e1b3580461a2a2533cebb482736ac928cba175bb TAG = 4596e3802109c899f27f6cfcbdceac5d KEY = 30d0e4f6425e38c92ac34dcaa06a815166f301289ca9cb0ed08156617d87bdf4 NONCE = 525618ac9e317405c7d44367 IN = 06f2204ca864dd3f7c9d0290f6fe3d0337eb9442cd5d2b586d1d5c30e58951fc2f4e99831ac7bca4356db4609a0428c482f2580b9e8cf5fd00d86d474fd88ac3b2413f44c1ff66e59e7538c090b2444396f02004ff636aca05ec40439f4e3f470a24916fa4033cb60127223addc1 AD = 23c1a3e1083904f7226be7242027abb7af9d62f1115340cd4a57611be88303955cbcbeba44eab5488c80aed3e063c70cb7bbdd9ac289c8c8977868c3702be63d0358836838a97b31f6aee148f2b8615ad7c5dc0de7c48db7752e5f1ae8637f8c70335bbecf1313ae1b972ffb9442 CT = afe3e71953bad46ad28113b7c8f2092fdebaeb81626bf94bd7e9dd59e000e8ba31c1ce7f728fe19dbbb42322e54aab278e3c29beb59b2d085e65cb8e54ea45d6a9fb1f561bac0bb74afe18cc8de51abf962c2fbc974c7ed54ccf2c063ff148b3e6cccdaa65cc89ab19fcd9cd0436 TAG = e9f5edea1fdfc31cd5da693b50b72094 KEY = 661309741227606892db13ab553070b456c5e421cca59087144873ae6d59e590 NONCE = 9f07692c017e1391a981e70e IN = 40b5f8081b5dd173203e02e90a6c171fc41f804b2903ea18109edcf77c03dba687b47ca389c55389bd7b0ac59bfaefaf43b5f97065df6a5375c1fbb95d95cad589c2a45cd9e1e7960b1d13622440f7180aa565863b4f9dfe26ed336ff4318653e1a520bdb830e01db78a7e598f251834d0c9bb AD = e8540d084f24b80414af554f470048b29a5af8adb2f9d55c9759e5ff1595ca74884af67027324587131d90c77ca72b2d15b66564549ce93df7f667d0218a6e874848563a33886c6a0c5a9d00fa435dfabaa9053243b4c8c25779a4dbf79eb4b8530a7c7bf4263ea824713a90cee92dec78c449 CT = d543f49e6cbe26f1d8a6e058769d5b16e6f8255a28b4d73ba2cbdf664bbc5ded73f9dea12a11b86b6a6acd578f685afabc232dbe9ff8431a5318ec7f0202959a310595b147353a7ca89c9d1fc2d2b92ea610cf6d9ad2716df2dfed70f5b74d498edab114058c22c96873a2a64abc254c82af46 TAG = 31a8441886d0e4c6bfcd6d74f6a5ee5e KEY = a248b0d683973d205ef2d3f86468cf5a343d6ad7c5aaac0b9b6b2a412eed3552 NONCE = 8f62ffac4027f4dfeacf3df2 IN = c2d7d29256832def577392acb9fe4f249eb4859025ea55cc0c4a67806caba3e1cb81bc7f5717d94e1c91ff06607b23c238daafcb0fa96905616f02205b702508970fe3bfca87270ed1102a9ab96df57ebdcfd86ef6e9c4c4242b4febd82b0220b0d6f76d8c2d0fba33ca49279907f6bcf7e8401d1419ed58 AD = c738cdbde6dc277ab81dae20fbbb4a50d71bcf0ac1ee0ec6a39747ccd87be40b1f0f2c37f2c6b32ea99722979fcfddd0ddc2e4ff34a2e6113b591cbfda317c6f4b021ad30325276f8d8dd78f757618b53297fec091f029f9b00850b35f3863a3801c882422b318b4a1bdd89002f928371ea05c6fabcb1792 CT = 7a837df292ad2e58f21b89da43a74de411e1746556fe47db55a136757513bd249384bf67887a5c1f605e7f7e3057596e17039701ea351e5ccaf0fd4882559e87197144632977cf07cf9e86784a959fa7399476a4fd196d7c507fe3876d759e2b37bd37edb3c12b89716f29ddc8b64974263a1ec1b6364b0e TAG = 291098a2376a0faa5da6fb2606b4f2a4 KEY = 80634a8baea1c4fe5dedb664c9b5d714422dd1726d642e60d15e02364195206e NONCE = 725ee5023ae08fece15d621a IN = 4d1d8855b4d155e77bd1bf34b3d049ef09b2b94f4e604306406b015a2d520e8772b084ed668b868e32c7563085f2a82e7d99219da549e507aff9515e45a045c7cd5292c0e09a3a38c769acfd0a11826b27d8bf05184971670200e79c49754debbfc57d9ebc661b25f22f241c4d143bd922f7b0981a48c6a63462cb5cfd AD = 12b3fa94a64454dc5b47433df1ce0a7dd5e8066d05b2433c6cbcb83087bb7d22d153a19c05aeb76141431c5f9801cb13531691655939c0c812611c6a30083ed3ec27e63e6868f186be559c48367a00b18085ffb8c7727638e833a7b907ff8465e3a01d654b52432767b18b855c05a9cfb5d4aabae19164f0dc2ca6346c CT = 6b01e934916823f391cd0d2829c224a12eeddc79f18351d2484ef6cb5d492ec9ec4d8c4bd3354f01d538bbd81327f6360a7d157feee64b539489bfdd1be4d7f724d2a6dfa1af91e4108dbfffd529afa71388b07e5079236644da289ae236100b2fbeda0c17bf2a01e76cd1f88081682c2d074223fb8a41d59e70a37870 TAG = 55762e95d897a33c4c75106449112986 KEY = 4f2edc967b11983f05ef5ee2a4364039ac02dbcccef3f3719913ae2719c8217c NONCE = 255f8209b0c67a6277bdb42e IN = f8217163bcaf77c1383089e396b271e22c517e8ccda244256cc39315fab7d0c291078d90e9b6e336992f015282caa1ec0ea858a179c9735b7a2f0d50f6f1eecaf3b9308772279ebb95f8aa53826e9dd60fb354de0c50c10001c98812b59d7c0f36daa1aecda6782ca36130fbb559363fe07704b0b91ea85be319ada027e47840c764 AD = 1dc7065f1585384b88be47598ca484782716c78f49b3b6bf5d24a5b0d24fbd7831f18d77d80951d2c4fafb6f939d46362a69b558afadb3bb4d8aa27f7fcf3dd9624e1e075fce9bb239926d51ea9dff03619d64d5828103a414e360adcda8fd864fca55c21df86c76972c3765ab1d68ce89f708e7e5a3e06cd4de08573cf750c6f5f9 CT = 6719849b7cea3f7f2a8e4de13d7a864d581b7c638f49fb06378a768d2034548179963c33f0ad099254c2edda9ef771daf5d299f58850033e2e449d7bc21ca3f7d3b7408429b596da615c8582886a6d8c1a9ba81fec4a41a38b7cbf1a80ee0ec8bd71451e727051fbf2a1d1e3c6ca98ee113e47650ba4fe80451e79b04abc8bb99a2a TAG = 2ac7f962553a8007de3369c7795bc876 KEY = 51c5cf1f0c76ec96f4a5f9aa50a36185521f3ba259145ac6cb4da3cd12467696 NONCE = c751e5e7e3d75874acfd2bfa IN = fcda42cd098b7936f4bebaa37d5850cb0fdd6526966b1b5734f23d5050ee44466627576e1144957929123198e40b64eaef74476870afecd7b70f7583208603a1b5247074c6c77e10b9bbd41a3d468ff41db89895b0e9ca95be77526ddb30d4c5eb0796ba97d7d5c56d0eece344dde3ebd7de586226c00da224b04e74d9abe832686797df067c52 AD = 343ae5e73fd1da48dce92ba7b86d21de0a203ba8587536fbaf4646bc45051a7feb343e38916f6c4c75b65f940045e830857c7b62b34a44622a36b34268b8a397892ed3e4de5df3fa7384d4ca50202b5b0833f921349c877931f4b735cec45db6b95410c8042ba49c1a39870276e0165f09c73b14bdf7f36d19084f958695c7ad2cc56f0487eae9 CT = 04192659d6a2f1b7be472372c8f969a7de388c97d37b4a89653593e48b630947d2160b569379698e94de49b21572ef0b4dd330487a8be814a84e959a1a8e3cf33dcc9f7464fd44814d0cd7ab85e4c01c9d015f42ce3723c8ef8c311222b0c78eb83d81696c217992be725faf27701b4922c6e6099442787ddde2b7572500a5320a4d0c787b786e TAG = 23c7a866574976dca8f401c4b5b58292 KEY = 1cec3efc0311d623f34b6853b3dc97e470fa728cdfd65993d9d48fdc192b28e9 NONCE = 320fe742ef171b7b8cb615cc IN = 722e503a97166a07974dcbf136fbaec6c03668fa52495b040383433ca59f6311103f2fc6a95ba4c925f8637167537321eff6949aa3051269fc094393a7b17d1ac8d29af052760835665b0ee89adda5dae7738656af9e8513c96e8a532a46ef34cd7430832d2be51c586a14e9aaec2458c1911bbc0f90b496737e838a12ff37d3db058bda9360d7d33e11629a AD = fd5ccf6b6948c3eb96543aa40f107fafe94e5206c326dd8900ea510c6b61d1bcf746151a75404e31406c8e991fbf6e660db7c18e243fd2608aa22dd7ca9de88f277037661ce6dea4ff0a86809dbfe1708cd47d3061a34657cad143e6577549c9944e081f79c276300bb406378b26f349a91fa87de02a1405d712c516ae11b4bcf30ac9d56e677d03eb33e3be CT = 363c1d6b806a6d97e2fddf53b242378e1d2b818828863fbb3f856f7737d63998a84e02d6c91e1df5f5eb6cf89f7ef53e16d10ad52f82362292d3acafaa02c23be7da7616a8b8daf8ee3ae74ee1078742c4ddc3e5a110e510417b9f43fbcbb00e17af3301b2fbcb784fb0a05b66469e771fbd78114fce3c4352c42928bf5a0ecc49228a3c930b0790bde7ad7b TAG = 669482999be99149f9b723b60fec62d3 KEY = d3465cdecaecbf25943b7bbf8084ccabc15474a4228c46cbe652a99be24a861b NONCE = 04fc836de3a1420b8e7136ca IN = 81e0e984ce0a4074a44524f93e375eabc650a847a42393f5c524c65523368d38a7e2b677fe08502dd3bc42311775016b5689c660cc0ca8cb33a09b89f3ed3d02fa0fb75ca5bf0dc3c27c546b369ab5e7731f93bc074d37ee50d6f8366f6c8a45f73ac92b05c4aa552ecc5266041dc122a0df69a36ad625a26edb57bfff43a84e527ea0d9d3cf076f8de9eda28eb09de3ff AD = e4adc14ac4bbf3ae7ec7d97f5c0e6090bf8127a75e8b70e9b86496a62a759dba5a4eef64a8c679c362785501260d29b58e1af647782564947950428dbf14edab8e6841c7afaf9e7949b560419c44bae30315c597f6f6e02204da7ec605a4d9a8753de1268bb0b1c84c972b4e7296da5c969781feeb35a44d2aef799ed228aa399ea04e21cf9f7d5600a2c07b047aa78388 CT = d7995e7b610eede708526c05c584039d48b9b4356fc71b0c37ec2559309a688a7c69ac9655f94e178cd2311db58587863b0fbb990554dc9a6aa849571f945c61e5611ae7e1a96903be725a1aa75adc381b86e43fbc68a36f44e0e0cb8fe5c494caa91f758597b6ef3b80a879154cd8a7e5f570893b4f768105b24b58efb67c5f07c6db60e0f48eba9563f17d38aaf0847e TAG = cc3fe61642c2d7fcbd579048fdfb19ec KEY = 1a0dfe2a6bc6a69659c68942ad0858e1df905890f47dab728ab9c73f742f469f NONCE = f8f76b014116ba61392597de IN = d93eead436e835a061ca061e3a53c3f9c66c6f011b21682b8a6fed098bde2018a2462aa5ab542c69bfa2805612cf6146c9150888b9720db1dcd0f359c1fa3416df4cd225dd0b0d949e917adfb3e83bf5ba2b967d48908e6b6d8aabc545335014d951a67390d7b5c7cd7dcbcf66e4e3f02aa4e5e9cccaf73e75622bad006c63433d36cb1c6aa4aa253dd1b2eacac75c548aa6648ecf9d AD = 56ca2d5340629ca75de4e98921da352941559bd79f47ef0ab42d1d5857059352f96ee877f5458f090ca237e4eef5b08a53311c8dfd4c4582f18a93aaa8cf75080734cb2ea3389c9c74d2b04ead614eb54512ea93f0e3434e9a9366454b303a8129d6ce6cf96b1d6dd4f751311c736b517dcb50a6f6e0962c46637b4f5aaf0f34bff518cbd551a7aad3fa615708b17cf6d8fbc864f580 CT = 8dc4d8483dc665b174ba32d6b6244da5f2a8fcc4b1865d662ec23057838b332a07ff073ecc893d413696f3fffc6dca5d107a5673f14abe8e0457a02e61138380d25e269686cbbd23cb7da3060f482f62bf80a40dcc2e711ecf5f7836ca14e456c4b73a48bef90749024393f5f8af01b73302e81bc37c4110dc26174702231d831cd14231905d2dd3f375cf2bef0425084d5b19f1039f TAG = 825e7b7e195f65c454ce9fdd637138c1 KEY = 03cec87d0a947822493b5b67b918b5c6a6bbdebe45d016ec5cb6779c3ddfb35d NONCE = eb7d261a6b56a179c88e88ad IN = 2326102c58524326759ad399222c5b5a563cd01a29809d6aed4d49772a4723cfdf30c9f85f031063e838f543c201412d6f085a8f5435b0b2fe94659aaf70cf7bde99309239ed5b815b48342d4f81011f5aefe10ba105ac15601c64a91076c29c3cdafaa12bdd5706dd7305b48e923873cf06944b5027b210c59d79856f602bd6481980ea909152216756d77362c59d57673cedb91ee6f56a40061e AD = 4d0fbeb69c1869d2d23198ec49b3dc23149005a84aace7025293c3afb8cb2e38c167a822e25c2fdf667d3677f4e94ed6574529c987de506d26b7ffccf3b7a36d9adac48bca76084710338eeb5bfca9df1bf6b403e33e90761a0b3152afac333071a5ef4f54010b945d03b51f123865673e8877f41ca23359e60518f076cc64232b306bd858634417e92e546ede4ac6231635c9cfcf43aab1f8fc1e CT = 06746f993843901ce72f2fcd4af7d15e64b3102d2f9bec0fe72cdd0b97e43177a1a2238c9c1dfc3311f701196653249e767a73dbe819b660cee07a5f3bb8f25823875fb4b4d34a5a3a212d2e166311bbe11fb1d36f4e725c3b74054ed7fffb7082203ccb5e9d65873cb8a1ce28d5c6e2b6555c1a864a725e6c7d5555d37dcaf1d0884264be72d38cc4b65bc2f0d039d542c5055da56c57e084b804 TAG = d36a4b6d2f592d4f0d347d906fc319cc KEY = 7f4b4bfa26719d9610c80ba3f474c43127f4aa3414fb070fc2f389e5219886e1 NONCE = b144d4df961d4f1c25342d12 IN = 638982b95d66ddb689b7b92e3adb683ac0ac19480148bac9db550be034cd18dbd10f2459c915e99c385cd8dc4dc6ec48b75f97e818030fc2d8fcdf66d66b80df64f0ca4af91bba83a74f3946b17af405bbbc6e216435641f5633ad3ee24c1a2ed1b39f649acce59ee56c282a3aebaee6e97f96b34cfc63d5b0482fec20d755f399dd5f61688fe55878713cc55d562c2d72236eb674a340d1a64932cdd8534a06 AD = f2fe3d27bfc278cdcf16fffc541846d428b31534ec5cf51c30c8b6d988dc36cd6c0d41a4485a3f4469e92ea0fc7e694065bd8130c2854c95549630bd9cbaab2205f27a6efdc2c918c3be53f2d12f8f7cc8e6a81dc8be7cccd217be1fa2e6887cea7d637d2e2a390f50d2c5be10a32a9b380a400cddbdd40eac67f1fe9ba6033d4bfa88c563eaf57272c8a7052916cf4460f31ad026a0ac2588a45d082fbb5c0e CT = 0d4de3489e09c7239972b675063579e409acbb663bea76bee8fb3f7e8785158ebe1c26db9219a9b97ea29e74762999518613249c3a87fbcd0128f651e2db8e2167f10ab532eced3464b56bcaa09780e5ece18182a6e092477ad933bd8de015c80e67c6802257a97a647fe2b1e9ab6a76c1cbf7d905deeb824aba2a34095f84b276d55ff940d6ab788c16cd63d9b16e0908d718c851a3230b0a37257751df5a38 TAG = 9f0a882d4456847f44c7287c8ff3ba04 KEY = 9799ae8045d58250e4d9c3b0ccc8897a04b5b9fb164e54019dc58d7d77b65459 NONCE = 0f20d002dbcd06528a23d5e0 IN = 8f323018b1b636617c935791e1c8023f887da67974080af07378b533a7573424f1de9193c5d38f55e9af870f6c60ab49c80d7d1ad1f18f1a34893fd2892d49c315ee668c431f5f35e3f60ecfd534b4b09b64cc77cd16b0e1b8882872cd109a5ca377518e5b660d75052e9a4228e3935705b6bf6b4f4249346b7bf4afb891641a76621cd315cd75de391c898959be945ccca7a96073f2569f217617b08502f7d569bd2f80e0 AD = 3f1e297bd91a276a4a4b613add617b0488414a57ede2ac75d10934e03be58ec518a418e98a4dbb39d2365889db7c5f389b2a16d8c702cf21b888a4cbf77b356df48a30298c825fb86128de45d7fa0e5f4b0b7bf82a2c4cad2470f33c231802263901fbda54a6edbf2df638716492157ec1407e7fc2eb6c663d9a215afbec3612778b8115e78a5fd68cf6ce66c12c0ca26e5c1f7ab079bc09c3bc7b673d21835671a13dd2a0 CT = 9a5758dad7997a766db05d698b43fd491bdcec21352032cc023bcf10e136523219745a56f0360efee75a37de55da23cc7d8184a50ccebb110bcb960dcf6b25fe731e21f26290281d9c1c7715c4e6ff3dc0026cce52929163ba222f123d4f50e1d3cf67725fb4737f4010ee2b5b163ca6251c50efe05c5ab0b1ff57b97ffa24c98653f5c82690d40c791047a3d5e553a0142fa2f4346cfcd1c849a9647885c0daaac9efe222 TAG = 5b85501a476217f100be680b2f5882cb KEY = a26c0e3864a7dd3b589d17a74a7c9c1f7e8f9adb4aafa0e75c083d10956b6bf6 NONCE = b54a2a43ca3f84aef3824375 IN = 6fd4ec60613646490791d82de30ded1a12e61fd270f1642d2221272dbb150ef63ef2604213e203b740dfc9c4bcdf722b3c85aa20abb1197949de710d7e8311956c8649524afc72a9bf5eddf0b284c7fc6d48a741b82c215a0dcd73bb8afd08d5532a6f7f99b5c6beb2ad793d6da53a81e6523b2240729924ddac996a723421f57125f928990daa7a55a5b6b53d7361d9728f66590d969659aacd9aa5c0ec627d991b55e9fd0bf9c3210f AD = d6d8b570eca29a48a4d408d5b27ec6aec291d70cfefcd02bbfe8d8ba8aeb6db770bfd723d2c3a4859f1992767d24e7b33e3e241874292af640e2bd22a5b77e0e9e1e0d5e485041cac41d4694ac929ae1fbc08e7591e1cef689028f5db26f95fc9e0868887fb9c635579fc6335757697f63b4f2b46664ae338eafdd827988c8f2ebad80ea9787871ed8d6b302d5dbf7e8019f2e139c59036cb5964a3701ec049b839e19e33e68b83539c8 CT = 2420e09adb24098038b2750c946551a5f6a5bdf23b126947348ddb5e938b3fcb874b33fbac6407095e05ce62df999e7234cd2b4e413009c71d855b23993cd58c1e26ba0deed891dc88f099fdf852cec0aab45f488a90edd8feb6f4c837036945bd304edbf7a2737921a2f8c1b00a1daaf9e25b908a65a8f69963fc767bc975b5b7bcc215ce37009009dc90b5c7edb1a1174a10ad28f4c1d1a2241e7ffc215edef4f847ceedf7b64f2d15 TAG = 20521b35310385ae66557740b435d204 KEY = 53ef3dc7a10e435650dd20550cf3ec2b997afc8d9e79cca8f7062622afac3496 NONCE = 257a205ed0f84016183f4613 IN = 081e2769935f945419aa06fb5fa7d8412efd1f9b52a45863808022850836c1974d53d2b2c5c0cd420711a71e6d1a09e984366b8b677e6c61bbce8f3adf9f5a9fb5860887617a08c923171d681c4fbc6d569690f6a183d42b52a80ef0693862efd22bf83b7b4014a7008424c356b5022df1842309b3a4a2caee0fd3f4d3fc52a17d53959daccf8e0ca889578ee2905dd8c17d52e76712dc104344148e8184c82af8165ea8386f91de585b54fc8535c3 AD = 5b73ae02bf4a70e57f5d48fbf45f85b8496ae8514c8aeb779c184f9cf823d8c1883c9e5a42b2c099d959c2298ace2d86c4479059256d6a4325e109fa4b6c4ce90f84a8228316e80aa86de9b5e111d88b2be447a29297b35ca90a8eb280d4c0fe92a1d593cb966cb0010bc06831efb0c72c1e222b031e900ef06ab8da542a5abe2870a0efbe92351d5915ab545b14900e41a27c5ca9d75d6277afafe7ae861131c2767eb314c0c3da5c264f8f2b4ac7 CT = 20ecb6cda861b660656d692c626436227bd4ac17a9bc71f6c84a1917ef3b5a0f6ba370f00fa2e7f1bd5aa8d6c15032572090482c23e4ab7376ef1f4dfb77f79d5dc065792fe3476c9c37614e32f493e461981b519dd7d10234c2c69264ffe5be06a8e14c81022b652c8cfa24adcc7c7536a55a2fc41e9ffcd09e1c483541cba814eafd5e09e9e44477018a41b073e387c9257c07d97e40f0761fe295d015e1f2df5be65b13f34b6ef0fe1b109ad109 TAG = c129ba4c10bc9e9c2b7d67f5f249d971 KEY = 15ddf0d794b1bf2e67db1af47b45b8abb0c62ff5fe09b29659f63ff943815c39 NONCE = a6e6b4fd129bee3ab8144da1 IN = 9c82ac83e3dd227d0cb9692703dbf41292fbaf4961e28b7407ef069e33850371ce2838b1808ec1f837511dae9899a867959183ef3d988ac20758d7a1a6859cedf687d8a42f3dd53fa4b5843e5be61422fb8774c9eb0fd22cbda5950155caa0ceaa00417f1e89a863fcc08cbf911776fbea8d7c14a6d819c070c9abe76a7f0d04598188d07fcbb822758081172e654c025703bb24c523cee2dfdc31c8d2c84534a60e7efa9f52f7e74e19c859889f9bd024f28763 AD = 892bc04375e9ad5ad2b5c117d1aacc202a74ee4cd4125019f38ed4d716ce361b8b50463ec3255a00670f5f95d361e79349e90bfccbf084586cb5fa145b9eece8a10187c13055ba0d17c0fa526ba7985f00f3eb4a2cd53b6da488827fa8481cf47f6be58771d1e40125652732a7dd5adc49cf99ed6b085fa9fe8721c86f7241b6efb6002e65ae5f72e16ce6a09ce81365485b20f1fc2e092216024b1acd0bb4c2b4ffe28d62a9a813fcc389774688eedd76c0b041 CT = e30465518e7dab44b9ca4ab6c86fd7b701e334b050a7889fefd08aa12c9e381acc7875ad5f8574fa44f8550bfc820b6d9a5600cfb82d1f98721a875610a91c8f47960ea64445c0e22fd3ebe94b3564e98b9b00a68e9bd941eef5382a67782c5e24ac44b928fc986c62a02fc702b145843b1c6882188dcbbb6f6b51ce1aa7784da03cbdc3efb1a01c1cfd7e90dc3332fc6e912a6a967ef1f239cfdc9752e235dfe75dab8088f8cc207a4a28994f122859aeb52d01 TAG = 62e7455cd6b95319efa3ae0d14b88452 KEY = dc0cff51030582f29676482ec8dbf0490a135a4cf3e444edfb7d1ec733cdf7b9 NONCE = 58c892d618ceb6027afbabb9 IN = d6c4d49a9431d51bfda5bd4b07997690748fdc3df196d27d219a62480dfcb6300c5a234d675aec1239280446cc134bd4e0e0b5ebf6f10bb11b788caf949c0c3553497b62e729f08700b66c6720c35f1f434f16b15a4e404d627fd054ae1394a77d5ba728f3422aad5d99a608c2aa52b058946a76a408c5dfb210d280629ac999e86ab1f9da8f2b7b79ec07cb666105582564974180ace98c63bdb962e4580692abe58929d29f066d2f7e25c23a3824483d9e49cb6f5fc4a1b0 AD = ee3bc8d875a4d43c278cfeefed8ced8a3da946adaef93dc356001da151010548990fe08b62edda46634db320601c7f4b50956e29868bda9ae5df186f15c3ab4a19d7cec274209cecc71602e45c37c273b7e4b2a168de5c29278042a3dd1fbea0998d7d9707d412f476ac8de7936e2e5c268a2f22646f682e664e526f88004e7c461bd42337dd21b1cb39ff678974adb67c2ea1b7055ca98697ec16c4b3bfa95b4dcbd7fb015480135634c34acb20f58549f7e7e11e20a991a1 CT = 54eedf8ca21f31d21067af5a05dc3cb99c3dc046540d2cd1664abb32fc7714ac057d039cebdeb124e1ca9511bc71f92ddfd4c6bd3edc8a1934f2fa2511503944f2a0818e30b9bdd26bd3c51b9673f55ad3f2ee5e41de114ccc55abcdce06a5bcf63a5bd61fe71dbbfc97e1c7f3417fcb9c1462e244ad91725081c9176a0b91d3485400d273a16eecd870ec1e9e016a7f4af2fab39a0bc93576ffd1eeef9cc15b7e47feaef85b21de422666ec722cbaef26edd1941e7dc03f72 TAG = 1cc8c395b2ccae3a685183667ee7bd34 KEY = 90da49f8f64e8a585697a43644a48bcbef33a8ed23c1a93c65e59a217c04a1e0 NONCE = 0812f87792508dee6868d454 IN = 26dac57d9f30bae5831f98ed074cbc9af9731a52b2322cdd23f1f0abbf78092c48d6d24a43c7d49edb3fa66086030f37dd9dc67847714437b11577d2bec645b3210baa8f7a540cbfc20deec5973b7489b7607eafe72e249df5d0fed95e29f03cf7f0c7a22fb2f06a0bc75214446b06d25a45ab8087270eec56af3960f53b80412a4ea7b45e54a2c374e8a3789e8eb57e656e22107503920313ee3e4025836b9e1a98541446c23bd5674cb83483642f2f3e8270bd1f77c85bcfb205a9133c AD = f2168cef97c27a902d93cbca07b03f35c5c3ed934192d29a743c3a6c480c5a62172c088fc89cb2d8651b8979e5bd1864272ff179be8003c6dee18789c17583dc1de4e8b4fec80e5c7575838e621cac4b5b51ce5952f22e06b1c196101d2ac8d05e797323e5baacc49d1e74db97142e1bed723d46ab858d59fd36d5d08eaa63f696b610eebdc9662e504992fd3481de1264bcac8ac426b09fbc641ebc93f72c5d460088fe0b08420d88fae219b6a5a67420a5f9d1201bf8d64b2ab3e9050a CT = 82196d89624689bb172e4ff71619046a91149c8ea99ebbaa3f2c32c77938b5ac466481575dd82a008c7f5867bc46ee44faf95fa40b6237c8c3b62474af2efcf07c771e23a63e65b48b0bd8ed26fc64dffe03e71fac6d3857b1248df63d888567d7d3618c68d6b8f1c88029bd7af8677d3b51f70ccccb4eec9e100768515637ad8a4b2e2e317902e456974ce9fe23095cc68566e85cd913e8b64119444f124640d16ef3e98136f32d618eef78f7ffbafb64227b3185bda8f541c0e7ee8405 TAG = 71fffdbd6358f755dd22f1dbe42c4aca KEY = 0b1b256665284390a9193b7b7aa4e3ad15a3d2a58e79d75da8ec284c02fa3a2f NONCE = 346ae65660de8920605fe8d1 IN = acfa83f56f137ac39d6447d98c5f7d5e812d1d8e7c7fa7f7beea9a87c59961449683fcf5332c9ef1587135030309a1c2d95257114b790b18cc32f65f4c7d1652c0106e3331f826e9b8b0dffc50aa6723d0827076b71c668370ddc8156db3831559a72e48266b3886a6d88318e6ca646ff561ed4f71e665abb7a60089f0a115c7b7fad9cbba6c4cb0c242b9e1f17705825d98f4bc10bacd8ab2e11cf579f29b2a0b085d8c96a372434785856b483c3fc9ae909029b0c931098d7e59f233cb6450fe0b0d AD = 64347fc132379d39cf142ca81d7e49c010f54f354ca3365d5195a7e43175c9a47603062c5ca61aaf2b381f5cd538bbf48f50d620ff2b5980c086049a378aca69570ab7c406b510a6aa6b7e8682ade6a091b1f822a97ce671fcf7c911c43c4795b78ce1c86e990e32bc5c9fa34a8a4b22a20d6f7c46722d1bafd49443b4da9634db4615f7cabc3d5bd9a8921e67de45dac261f54bcd0af2b2f845e255a16f2d2f1ffe26e88238f5dbdbe111393aab3409e08dee8b9bc85c51b385c191ee9290454236ab CT = 9d7421330f0c2a525495bc360cd5c2273531d050d461336a254c9af8611d07c3559931cd6804fbdc6e6c9c997283cf40bc23596efd1bf116fffcc6620e45d1c738569af012a7ed0d575ace3c12662f88f3ee480af30ee015ae70db112bf4a185e220660a912f9ad840346e7cc0715e853dcd9b415ca9e865d5e4de2321e6a1b7cd8a35c760abd3f099d395576a91503147bdd51cb4bd1452c4043b42dd526de6f61bcbe819cfa3c122c6f62e0d4c38b443f5a138325a5f0ff8a9a2071c2773ce62edda TAG = 2af508d74bcf8157ae9c55b28b5d2db9 KEY = c055bfc7828d9fe8fa8d9851d33f3e4888e0f7e286e1eed455e14832369f26fa NONCE = 2804e5ec079eada8bb3946e4 IN = a26a9b189ada0ccafab92a79711360c7c396374c6170de395bd8ed80dc5db96ef1534adc4dcd419fdf1801add1444a195367213e374eb1ab093f1f54cd82eaba5c1cde6b867e0d8fff99cdab4d96e69aee0c58a64120ce0cfd923f15cdf65076a12e06e53ab37463096d9ccb11ec654e401c24309fda7afa45ee26e5e4b8adc8febbddaff1e7cecacad1d825a6b16a115287b4b3c9f8a29b30fa6236ca6e883abda412177af38b93e0e64b012d33d7bf52ed18c4219bdf07f36151b7ea4c53091ddfe58b6c9beeca AD = a184e4811d5565849a08d0b312f009143ac954d426ca8d563ad47550688c82dbddc1edbdea672f3a94a3c145676de66085ded7bcf356c5b7e798f5ab3bb3a11bd63c485fbcded50c3b31f914d020840cbc936c24e0b3245fead8c2f0f3e10b165d5f9c3f6be8f8d9e99b97efda5c6722051d5b81a343a7d107e30d9319c94dbc7c31c23b06a4ae948f276d0eabd050394c05781712b879317ac03eb7752462f048bcd0dccb5440f6740ad0a3a4c742c3da32a49dfda82ed1b66380a8cfd09dda73178ffa49236d20 CT = 58dca29b5008f74bf132947df768dc85e2492a381429f151a3bad3132e63a4a977aa09f10879d206f43f27a26909495d0a2c8cb252fbcb3abd953f6e0ef0f6d5e89d89a1d9ecdb0e44686fbf5567a6fe7557a084a8a5ef5316890917bc432164266a331118c828fad4f5d1776645d163dc5444c2e12def608efb47adeb8f9928a5ffd3c46f963a749c310688e78525e34a510f529472a14bc7a5b65594338f6f5ea1d95bb5bddc6e8e1d1a449d126442accd162e4e03c10824fd48b32df763de5d7700dafc54206b TAG = 141c80e1d044e1e9cf1c217bd881589c KEY = a54a347a7a388c2e0661d4ae1b5743d1c2f9116c0a7aa2d6c778a21e2bf691a9 NONCE = bd3456b0dd0e971451627522 IN = 3d17e3d9b5020d51295f7bd72e524027e763b94e045755af4b3cc4f86bce632a1286f71734e051dbcac95780b9817b5f1b272c419e6bc00d90c27496ac5ab8a65d63c2ea16eeeebe4b06457e66beeed20fc8d23a9b844ba2cc3eb3d87e16e1230fdb6a9134bad3e42eadccd49baed5e03e055f389a488d939c276982e4bc77f0a1c738fcdee222e2641b06fe12ed63ede2ab2fee3c54d7901d0911c32980b7c663a67d35ece23136c77f8e4536464225ab427d937e7a4260460d55bb5fdd7ea2f105604c4b0cf129dec49b81b1 AD = c12d1ffb08acf27d51e63f5c0e311180b687438e825204074d4456d70b7c5ba9903ad0b0778a5fe36c3e12e82718c00f5d1ce585e5c73b23d6c5e41ac4a180c97c9418b07ccccbfc58c678e97882ea36395c0a05572b4cd25ddb3c32fa580c89c48a0e3066b8032e3823893a5721a4fd1e59c7d012a01b9e9afc12f3bea93e9d1a2cf5cab26e064576b36bb65606de62fe2887ace0cf399dec08da618954ce55362c8a2bcf31457a1804bbfff68a76d752f9aea81be8868bbca8f1af3375f7137941a1924b8a2b178f06a9e33f CT = 938f8f596e17eae6920410f602c805ad9715833087e1d543eb20b1b313771266dc6a8f86f2ba033609fadec92ac38c1f1f0f728e568fe8bcecbae2ade7b9c4128fb3133c8b4107ad5c29cacbd5937f66905e18cc52d9239c14e4c8edbb2db89b26f5f4a9ff0f2045192fd212af6c65e448834580deb8787b612d6345466483dbec00b03fee4751f543a6155f2dbb745c1094e9721aea3e544a894e4a19a14645725cb8fdc21d259e086b1e411fb1bdb11293d0224ada25da2896dfe0d35095230af6894404d27d901540b0ec35 TAG = c55c870a5eac5c0c774dd10dbadd3fec KEY = b262f6a609c4ad6da3710d58530b634fd7bed875956d426bf4b2412209902233 NONCE = 0b455031d28e4e17a45b7a60 IN = 9cff6ec8832bd0e62d9063e43821db6a1e0f3ae7947ab4d029643b0e7db8224f8bd00a2c011b246a4d5eccf9801fb314aeadc0532fa71cffe188e801d7c045e81b9dfc5cf6ae1e310b363adec4e7ca52fa754ece2540545a5161eaf9ed5748070b6e232125fa8e0fb7548fd3eed57a6be72ce0a9112f166776816a0a4ccf8151b6b93780875d03ea3d59ac57e7904c83b90b7666de85f055b25f9e342af4cb04b0c3f123ea0906c04f252f2b16b28d612e37b2a7b788d66beb8b361385efb73a825ccfb1a5ca55d60afde0349e5dad8096c7 AD = fb99bc661b51464c0df92ba4f64c4c56d601622287bb1bf8e0a082ed3793e74db6a2f5a546391ef55dc45fd2f24878834bdc2903054d9d02ac05bd5ff122b65555d7ab1664cc36b630039e4432315445f303837e57149fdf6bf8d6856ba97abc5a18b6cd2f8f28cd3ac079355b314561c50126812861c39180fd94f9aa24edbec37bead760093d32b96ce30e389f63b2b271fc051b42952b3f5cf3950def581f7cbb2b4aa5b151a16ed3773166761232c106d3ff57851895640ea12befd69daadecc4122b4a481e85088edb093e02d5d3d8a CT = 5341e8c7e67303d5374e3f5693c28dd9f9a5c9368efaaf82d900b4a4ab44337f7d53364544bbd822020d79443e2ab0fd2381bc73750203caa3d28858a8f9a6dba57a7c5248361ebb152a81a89c00b1bf49de9e2d08c0243b38eefe316ef89164b4907515f340468291e0b51009c9d80cf5a998d9cd8fce41d0c7405fc2d1854aae873f0e24cfad253ee07d9f4cd27080ee8ec85d787459080a06d290e6e721d23738470835f173ed815f1a15f293ffe95ad973210486372e19a9cc737c73928572cbc03f64201d1b6fd23ebb7b49d12f2eef TAG = 5e0ac1993ceccc89d44cfa37bb319d1c KEY = 9b4387e01c03d2e039a44ca2991aa8557dea6179d19259d819d70ab2d5179eb0 NONCE = 852124b4e04d7d1d63743d74 IN = 92c6f01cd2cd959495bd8aca704f948060bee01ca61c46005b4db43e2e7655af4c0d96656cd75d904325ecc325f5fc9a5fff3eeafde6f81323b0e3b64269028cb64c9fbe866b400e76487f1759d6ab8fc66589e23df0c008974e1613bb4ec556bd1a6a0751f6dbbbaeff219874c57dffca59a955e0aae62e8fd6a904a50fa7eaacccc6dfd4a2b8c6c040505d3448ed2217b7024224bbc4335c63b2ae8172d7d3088b819edbaa17991a4729bcd5a456cad20ba20dbee99ae56f8ef669dff93c99a995c8f5dcb5d113db4178a49516206a1cba7d872682b1 AD = 92a1d2574182f850e37aa62338b19f403fe99dbc7ddbe1e6524ac67c4092cfe296b5ee9b94eddb5c228c902c18ec1ec26e1ef0263d05c5caf1c71ed9e5ff987e9964b46f27be05a83e20867f1f2107db26b6bc7066af2b0efdcad2b65f2ebe8b31fbe2f3c30171f2e4969f1650c9642ae47c8db5bda47e57e8a9af210a6fd4894dcc2934b4ecf823cc841cdb3c93ecc779b455b8cc796d7d60437da201c3f848dcd5f45e88973e06364e7cd01afd2d49fd3032550f1c1a60c4ba48137398f4d58e5fd0093c06042b103ce0064f2cd1cfdd39b7440121d7 CT = 28b87d324854d5c9c6ebb303fb802b12d946ed681ed5b3384dce2cd782bfbd022f213f193bcac579176440bbf2af378b019d21dde5d70e42d257722d15417a9fecc8e56430551ea3bee798a01faf74d0fb09be6dd0c14cd03feaae29c7d17581e1fda0b4bce632ef790202e98c8c4f8f842fb3e33b3fa5e8700c8644ed6d64280652bc2a5d40b3ee0e47dd5a9f3535e15b1fabb30264515afd4f9b1caa5c224574636935baebf6d1992bf1a7a3d698d457db4248a2b38a803837ac4fab7998722d52de61bfab4f98e1933a77046bfb3941bb7988acebce TAG = 1b07d58be48b81f7007e5683b399dc28 KEY = 9d36155d429b90b5ff22ded128c9f0cfe77ed514d410998091bfca4dce7e3c88 NONCE = a7b73ba1b2b0e846c3f635aa IN = 2510210b420b12300d51ee4a7ad233c9c97d71672c0f9a7b9041d32172fdf3a6ce274aca77a0db6961d7921d1681ede2c1088a7618382481296778e7f56d2c0074c7c545ccda313495ae2a6dfd042474b07d2b59c79a0cd8c3dc16132beff1687111a48ee3d291ac556987e73c5a3807923c2deb3b9a59a135a8fa0d85d5b39016edfe0649dc13be672a639db58839d3362eaeca046767fa1182ef8a63abc104e7cdc8610b1e956aac89af76b40844a358fe6f7343d217e1838aad19587ab4b1c765d2cd7bf7018e338c0207d4c9dabdb1625af0c75749e9a20a0d8d AD = 39e96c8d824bee306189a3bc8a8d4862df55e8016726222a528d76de169746a363e82e82e359b774d061a6e98e3c35aca8ba802a5956a2c512501fed44ae341cfa65ec9d95485763d99cbd9aea078ce551f7f82272bf54dfb6420ae7653f275ef145b2c87720c9ccfa56bd286c61cb822d0473dc2cc3fa22d50fd16bc0358e7c615aa1791b990f30b1d737f798219f4446d173e80fa62380dfdfebdb36b1284a62c2b6638f28fc370034812d09b57d27e5b7d589075bbab42fcd6a91fa2714538be6286e4c7b2657b80f045df7f8954738efa7d49a38e5a55a2af934 CT = 8cb991b10218bfefa522e2f808dc973620ea391623947cb260b852efd28939ccca4c8b1f02d66fd6d0d7058854fac028fa0f23e8de801ed9a4361bf7e5a23e6a7086624a64a29815bedd5e5ebe4d9f9386d47e1408286971654b38ff8e5dd1fef7686d7614ef01900ad33bf97896b4ad02e7445782b1794b45af967ca3ba72a2e5cd5252a9ff0ff550ee56fdd8aa555bbb0bf8a5dd534fd65b13235fa6650761dfe2a28b2757077a2680ef88c84eaada743d1f0d25de38fdd1974ffc07dbb9c7fa67cacca309a10753c6e2561c4784470f5c7e116e12070fb3d87131 TAG = 665fe87506f8df07d173fedcc401d18b KEY = bd187500219308edd6ac7340d72813ee20054d6d4b1bc2ebcde466046e96a255 NONCE = aab93d3181e7a04cedf17031 IN = 55b824816e045702526f8b5def71a0d023a2e42257fc1e06f9a8531ef9f7717474ba4f469e442b471d5da6e71aa635a307205c0a935a54b8a59be8856144dec435e29aa1a3568073aa6bd3439bc0f219fa1179ba0a316f7d966ea379da16be4db2f1fdac2fa6d00bef9351b78bb2773bc30ddc9d019e6e7d78dfaf38010080027afac33e751c0429ef6c70a1f2d01f103482818e9353e39a3a4b785a7dd2c7e1ba7a4c36a5f3836d5465c002bcd1ac576d90ad276952ac155dabba6873e6d92b5278280a540071b205ba99b77b7568862e70e6ddbd804906c33fa130f8b0862001 AD = 11b35743bbcd0113d2c188f75d382df44e874a2d4b3c3148ecf8e0406479305f29197a3a71dc7bcd71b6136ab11a7cf46de80140e15046acfa18774cbcc755e9f3beb37202fc308c03b1c20470b3128f5b91d925bd6703dfb3277d65159688f656d5ccd83d2beadfd778854472b1cb8fe440bdb7efe806f4cb95249cddf69fa0013dc5a626eb8ab69a48b3ddb1a317b35f7772f711221cee1cee9469e2639c44448c5942c95324dc2fcfdc952e05aa336ddbaf57cec2d1b33981ecb8f70ccd34a279b211c50a7784906f2981a2d2ad8fb130100c4f6bdb09c95dfcf4b0eb7ac6d5 CT = 1e99d06f82333ec8e4fa1e81014458c81325e5d69db561449b153727da35c0b540c570b60488aca6aae58f75f84792388d0160dc45e4e5bef552c49228d806fcc22259f0f94da2f786cc94a3ecf3cc15ac67719379d86abaa54ce41e868110ed2b56dbeeaad4a444eab51a96aed404a4f4b9677d22345fdb67ed0df091d23d8acd70bf6cd29f19c99910888b3281b65637590af984e493ac70011486ca88e72fd14ef1cba06a50070f138dfaed35ab12690a14b1c8ac319f597bb690cae28019d64c868acf9a58fde1d8aa18dc1ec9c3c4a0ee9c4cfff8912b1bf23c805af6df48 TAG = 1a43147e6e097a46b61f8b05c7dbbe1b KEY = ce53e967bb4675a51652a9e6e87da6be36d16245c1e37ee00bae09cc30ed8528 NONCE = 0f53ed18bfdd28918c3993d9 IN = 3f2416477ff2ce7da3e5766f043e7a06ea2b87fdf06320d296c71cbaec4b115da356f8c7f34220f91e90c97a5cbbb7fcf0048fb89414eddeb2ec1062d08cc75a39a1f9f214fc3efd6fc8e70d78418007d7d28944b3f37fa5667ff79098d7af36a9324419b53efa76e98a311e1436ecedd977397cd02cc8d377ea8558edca35ff4c71ec31943119b76af4c78a435033eafe73c7079224bf2328b49ed58acef9b043ae3c7ff17a66b521e190d6ca2b2835ed8edc2c173f04616af237391a4440fc5306366c834f6a504e902dca6d3e9e1554088eaf5b15db7fc1fa19f0867ece90ded639ee8072 AD = 64a596ffca0889833fcb537f58d94791f9ba9b6b7ce0c7f144f2f1a95d62ce334f7bf7f0d2ef0c6e7afa2324b069dc6a7a522f19a001c335cc0252ac4a26079c3f267cdca1e3f933069f52fe72e1a00c83d8fcbd2e76149a912c7b37663c2e7967a3a80656c87094d349af6b9d64b3873f467ed376eaa1e0abae06180c847e981c6a12d32b580acd34f779c343f8b79df1b5004d333a5c37a8be7a94c6f6400f819ffbe6d54d3c1a92824fb15c279fc8121c735b6c42248ee22e665245966d40eadc51f12904cd64110d69354cc9d9fc415b3469317d5e4643942dd4b649de0ee2fc5d200701 CT = be462da8cc9d8cdf343f7025df0b8b41c24f7b6060cea2d3c63338b6c3e83f0797e966b8c5dd889bf1b5058fb4d694be2178fb33d9be1a351812046a6d3bd36c84ee3665d39fb98159e4d30f8a25a60064caf980f744fc519e2dc451f5fbcc0834b72920d32f0492abedc1022b0db4f2f44b91ec48c588334775fac91f174a4714b3825e96fa53cad3de94807f3b888950c8776189cc18fdf379cdc9d6054952c6ed2b3fb7f6b49beebacee7ddcb19a3eaee2b2e2b7a5d6476e5fc1f216ca443b859a9a661dcf2f7709f87361186368a62f255d78150f09ad4ab1a20e7329f3d96fa2a33cbf6 TAG = 1cf74908f6fbfa5b2b309ebeff2f3ad1 KEY = 093d932ed969cfae63f07e0c04c7f9eaf1b36f656095f8d5f112517dfc430cdc NONCE = ce36a837ae93a280d2fffc63 IN = d9da99635f8d728843dd587cbb24e68e1df2f81b5f7abfe233a224cdbd48cd8b82da3711d2ab6c1ca722610b87f426a2cdee4456b50781e3b25da037ca636f2a5eea01f4eeea52d0feb7f1f6c2594d63d8c05c2adf339839449cb1d2aca94852d1b64b5641a572c2da02ebe299c7d1ff4da8706f44b14602f44c0ced711fc78005f87b1686106250d3d3860b67f5b38788db1891150f88d4c5276751afa0b2e37a59587cd8b718767455e65eef25bddaf787d52b88556710f740f117b02f244edd47cf0e45646d40e789671ae61ab06336e24fad8b64cd8f60b427ea1f58af443c6f55d54028edd5f40d78 AD = 5e9c95c3449cee3f9f726be031089b2358ee92fe7b408b355739c8da6369304f3b287ca60dde4685bdc59879e1530ffd8f6589449196abf0f0dc6dcd82ba7fba481f13376cf29b32af2ecca24a161e6e57b6db70a7e02ee2154cc0bb5280b08f8dca35b1a342fa18b8025c7a805cebaed99e30b43c139de7c37adc25b0b6b5d873ed86530622ef2d0ed3ab19e9c27df98a4a15324f902c35a23adcad4598c6e990c64893355be15fa7320c1935b4ad3c069c068d6b3c8f43d6fe0588b59170bf567ac3a53a50db68e4be17964f55acfe695638cb5fdea5c40805334a385c2d35aa836637ccdf71390487d9 CT = 40380718f069f44c88932af22a10f80513821caa71fd7a9e5c4f37e1c756c43fe491ac13f244bd1299844cc78d7812110f570b693e63614e639ec7395cf65c206eb6fc9bba86f89d03dd19e45d5ec64c7d3a308ced4ac1f59cf4e13be64e49acd9ebee209afc508c97ac817f1367629af9d59b0cd48f138d23abb61f92dac530351f46a4e7f70ac87388e44f6e9548d3e6a26884bb7611f632da7db2a12fd9174773e685df316ea9401d8b352135b6b32a374eef8661b77eeedc34fa4178d0a5731ac9bfc14bce1dfe96af095b0088371ab1a04b2062625f0c4fdf01fc0a6bbf1661cca11932e93690501a TAG = ef7f960b146747ba4f25c705d942f8c7 KEY = 86875efa72ec1827f133a8935193292463ecef801bf3b461c96b0312cfcf32e1 NONCE = 738136465c8935d77c8d4ea4 IN = d692d3ef47a5c9d0d9a3b6a0d498e90a3ea06278134ce90cc1d69da2159d9a1f5d0a9ef4b4ce5f873e26e8f9d53ced79991491325ba5511be4d9e6563b70459b10e60d8c5da45d3b0b34dad86772b0560314f0215bef7b55c6ae53999cb2d6a14a35b50fe5a1598adb7ebeee097968ee7624bde42862824900c8cb45b12785d9c4d50ef38133d31a66a612d8638008d03edd19c4d7edb5f9b9f195c60883a7d6aa85bc3ca3b59c395b85dbe9bb30ef6896c4ebae8d72cbecfadfa451bf36631aefddd3feb36978aa8d9a45c9fa09bfa0b2c040d9a422840e68f4dcc3eb902f6be1d91b11e1749183d89715761b6cf22c AD = 17208cfe5a96adf0ec903c7618d994492d3eb77275fe5bfce5ab1f67d27431c7746314e52934b8c44481e5760cc8f6b0e17d1fcac7fd5b476196e3152c3dc90adeb58c2c9c62cd684b4b18d4a94f8e5b4336ed3f1758b58a254f48b3aecd9cfa63cf758f2df54c52eb246d046198b6eabc90b2a0dd6c5323e915a117235174fc9089cc9bcb1a3bb49080cbcc24367e7f4e17e27a2054bdda0ad8996df1cfc6bcf43f70cd854f4d97aaa4badb5826dd86765d36a2ecc83d3daaf31594eff02999a423185356d693f26025a576037336c156543353423dd3b5da75f45e297c60dd8e091b961f60eb6786fc988f6324f9e8 CT = 55f48dc2b6836b8603e19264382ddfc568b1bf06e678de255d355fd865ef03339f644312c4372494386589431d4ae7af2eaee5dd3c16340ecae3e87dda9220a5f9b9fe6cc3eaa226d9608385b7e8a6216e7da71997088eaf7c67b5402be01c0b182383ed3c0e72e91fc51fc99c59cc8271660dd7a59ee0e7d9626ccd4439bb9a1499c71492807f8126891ce09451d07d9c5525c5f185559ec44aa31498be3fc574389cf948640dcc37d0b122249060bb7d5d7e5194d4b7a7bb64d98d82a1155e30970a854f7c0d294fbb1a9e058f3b9f4762972c21086e0bf228768d0d879a9cdb110f9e3a172feca7417d48b3fa0b0b TAG = e588a9849c6b7556b2f9068d5f9ead57 KEY = e9467b3a75dde39b0dd44e7cbf2b70ba1757ba6a2f70cc233d5258e321d5b3ad NONCE = a9756c7b8e2e2f4e0459f1bb IN = d6d7f6112947be12e7ec8d27ce02924503f548456d0ba407bf23e848b9ecc310e4a0c7b00c0de141777a94cb4b84a5cc34b2b05c8a37cda08b6c2dba80e80853f2a18bcc41341a719f84262b601610a93721f638a8ca651a2f6c03c3cf1070f32b92c4ab7a4982a8f5e8ae70800f7513405f3ae28ba97a9ce8241608eeb5351e6cef5560c4209790ee528b3876896846e013a0bd3a1aa89edaefe08fb4b73b3fa64c0c8b0f7ab70653ee138456319230174f0f1f7f3477f0cfc80eab8a96e29e85e20658cebb830ba216b1d8281ce499f729278dcfeb59cde3a043ef3fe2c42705f311a422e9f80fc3b58ca849dd4b99e5e66a958c AD = ccab7afe4d320e94f77963d779ade1343e66ae80446eaa5f9ec4d3e3bb3166255e4aac5707ab407b284dfcdbb18ff515cf08790f0470cf335946040438c7de2d2a342096d7607e1920d86b519e96cec1715f4b0dfe375c5959644bd664d23d879b825dffbbdc458ea9da5ede5682ce1ad1cff33dd8820761b1c067cec638873a3cae79c7682ee8d4f97cb96a413dbbded1c242ca669d50ebb6de3c27eca3041fa8aee8974c3d17b0cf79c32c7bbfe20dcfd57303cc40334fbdc43e925df1d63fde57bf60553d7790fc56bd95e675db934dabb1125eb97cded95f397b32bfb3a2d40703e3f11c6c226633b3cb7f9da1e3367de2ba4d CT = 47bb258ddc0945079a0b99ed5cdc0186f453f8e0393cfea258412e423dde4a00c014ac298c4dfe7c03b0d9bbd4ad189624cb6fbaf13e60ec2b4d83c5bc3294dfec30bd6c8f7125e11d7be145a966dfd78fd77af68099b855989fe077cd9f427d4381b4930abc1daae55722540e4bcbe1b560fde208ef1c2dfcaa2c51b76072e67da311c2556eaa2c25413bfc43d00dd84aa8859b296e05945683e028699d60a29227de1363c4138b9ec2db8f3b502fe09d368c5f2ffd81abe50cc1ec1ef216f27f401456d061429d1910623af00bcf500cbc6509c5aebf7de9c956e40a3f0b0d562775b03c282c204e33c0b380ce1475eb5c0441f6 TAG = 9ea19333f5050354a7937fed68e38dd4 KEY = 4e323dedb68bb5cc4cf2edfe3a54a19b410f849492ed6f66fc053d8903c3d766 NONCE = f77b876eff796db621eabe88 IN = a7514c4111d7d8bce2d56faee25d9f5fbb527162576b444fadebf42d48d2631cfed344b0437ce8a7609bf30bf0a44aef172f8b12ea7567cfa5dccbd08bb3115efec59437ff02e7128df9d9e5193794373e30dff7b3d8ec0fcd6cd3872d755c0314f1cd9cb996e4c6ca8ee2e35f9b64a1f0bd1669369f9b333a356ba58e553ff9bf9cb6c5522599dccca2f7f57a91006e7dca4095d11955e5aabff69febb98a408aee92293c0abc12ff23482ebe9d541bf8fc7493eef2c68044dd185eb243b54a2bad9844d831d9b0766a0ef013ad3ac03627b1feeb287e5e61875bb1d0a01315761bae6323a9d678cdcd3c4a85be71b70213d081b348c63fc603 AD = 9bd10dc97ab5e9b35e1c8c36ef37f90a11bae7dd18af436fa8b283eafe04a5bbb16bede6ce1260187299ae6474628e706cc08b3627f5243f1a9ab469455666e6d5f2ab597b6799bd60a365a9248341decc36d473fa52ac5ac469b965cb2023d43b437dded84ad49de95a6dfc6ae4bbefaf86f9b06e3a33ec90d32ea3af541fd2c43387c75dbd94d44b9582e8ea41afba5e49f1d158d48e979d04888fbd42876e12bfd6695cb99640c537f2f9223d37cf6b627207b9318bd1f4c64556b5db1101c486c53dd8dccd7405e148d6d9b38b7ac875a44bd6df75edfa4da8594a9c43b223e7a6f5b81a5cb8dd6e06e9a976ef156e45520af332e4d56035 CT = 9885d7a11004ec546955fb7a8c77ae57588fa2e7fedcc8e9000123495b9016d1a101fec1e6724302e93eb8e01bd05efbe8502eb97b1064bafa9bba5658b1677819cec4998dbf02df1f1eef51bb3e75c19f570efdda98b0b8dc5dd9250eae8396090ca9ebecdb90f32c5e2085e86b64e57464d251af62d9f8c01d7bd6cec5f9dfa5eb7c4cd412077571bd071a4eff5098883940d63b917c08bf373916cccd7a446abff0aa5c687518703c25cd8d3c5d724f348e20be54f77fd18dbf6344d1d25c788ccb5a5747d575435829b1825e31f9e94abc33c0d2750fb62ae167a7a74fc9e39db620d43e0b8514d5f70a647e53dd5764254b7785b1519474 TAG = 936072d637b12b0b6a4141050f4024ce KEY = e57e74595d230e8eae078df1dbc071c66a979a912e2252257e28447e97fc82a7 NONCE = b613d6d5fff507e917674f2f IN = f1ecbb2a45f04ca844616528b10ffa4d2c5d522ed4ae3366888fb371b6ee7eb4be53c8204783e43265931f58f308623f7b2733384c173540aa0bdf879fad0283c2be6c42a7b4feb2b29265fffdb518ea77d33507dbbff7d9921bd97fd27f1100402e02135f7df4b5df85f7472fa75618facca3e24d487453e831efa91242e62ee9d32880bc20f7ec016eb12edb589dc8a669f7c78375f915d7c2b03457b00ac2aceaf37c0369a85c3f6fe7c0447c022d66bb5acaee62163837a36e882cfb8579ba9182d3153a25623f339758ede5a62f67b199fc8abe235fe4b607a6804fd4d15378c76e0c26c1edf1cd637b7ea59edc66cd5ef9b8cf79b95ff89c235ab195 AD = bf4c0737e461c1d6fc45b87175fd7833625c98a03e089c4e3d47c6b21f4bf38cb4b7666322217eb8fa022afae473df56ba3502c88cf702276bf39c6fcccf01e629925a83816a5096e612458af6380dcb7f63cfc0eae99d63475616b18b44111a1927b05503c4ce46ca48321b0f8f247a54919fc844fbabd3a2481e83bed8a5ee8086d7559db00fd1d64f4892ee9363d59829ce1e10af66696c28e86297b43190800251f346bec1b577446120529d486266a271c71011528b24ff4caf2c30f9748a2b03c788dd583541368a643075a52127c48b3b6f0c6ef413e61479c9afdbeb4bda44340ff0d81c7bc0321d3de4080cf7e108dda3fd4e480e685b202c6bfc CT = afb2aae2dce03cb0bd3467447ef6895a132cec06b9f7764ee24d90078660dc820b8384c01375e03c20a6c688a780d7d7fbe5837d477e8f3d7ab3ab865dacb0eedb5694d3276ea914a421b03b9d4e4f586227a3af7e8d5d579bd832450f038eaa7bac57aab996df55367ddf59b338e5d370e310124e8ef43c9fe54e5d23d60023aee266054ea66c9f32170ce97998b527073fd178ed4e1752cb9c515c0b32766b363c39c513c2e9ff6d1c24807afb43af3c5a317f1536087d8576fa3be3b007d3a77ab0422303cd0b142c4ad194e1bb86471b91861235dc336dfe9666f4f2c6a32a92b8fc52b99873f9792cb359476a2aea21996d21c17ab814de4a52eeeb33 TAG = 05906cbf531931559cf2d86c383c145e KEY = 847eb274561fdf0c1af8b565a92da74641f17261a0ea4cf63ba5f36ba7028192 NONCE = a379511688390ade6f0318bb IN = 1e588cd0636f34b656b140b591a9adafb8dc68d0abb75531942e3c6ec1d29e4f67853e3d718dbe61b733490525c7f9ce6746f8639e4d271267a95f0940b3406c67ded0aaed36374b9a4bb8c753579051c6dc3244d6126a8a97d4a912569ba139d55dd00c380e7ec450d44f6c7b9482c2594b21f61ef8d165666c830867139262be5ad3a31f44a286d7e86d4e5c9bd6118147efc8e606c522ad0e9a218aea4daa39d1653157e4c3730240fff67a42e4f34186de1c13ddcb1e44020b7a31d21ba6ba96b3f42360dd1d754a7bae75b6fdb6eb3c76412cc1fd8e900d7aacf4d897f4224f19a1d44a77e06c95eda5fe76b11c6f5088e8ca75c87e07edc64c09a6a31371552449 AD = 331d48e814f660516f3a796b08afb1312625b3b17218819cfdbbbca4c333378b57fd93482d971992b5b15b62f0724d6e7b9beb5ddffd3c70b6f8bdd3cd826663eeb91d37734a686c987efeb4d4906b80c5378fcd07806d2dbf3eb528472a110743df8cd96b6eb67e98b13ac506c9bda167f045a412c93d78e860c9b4bbd7a2d71adbd3530f30253847b4112d4b898b520c7a14fd075e62605b05084f26fd138179c2791fd6e8d3bfbb2735002ae12d986f92d7d300fd6f1dc12c993449f8522f6f32f506a677c8a981aef9815e83019713b2f9943acc8d5b3f6f65b9e2b9a14ad2e300d636166da2d35a6a0a756a76d08709a043d65341695490124971a7574cf0b5845a CT = fc1f0d7309e6420b42d59740c9b9d4b97075b874015251ad55483068b00f87502b18182b140db07c70a80fd884fd79b7b5fef1d307ca4db0ff046494443e1cae83478d275c31402035f1fc24e26214b78d9a4dac78d074150012f9fee810a121d87a16d8e1eec5700e9facba350029788480a259d9f30df1c2b8df7691629314391719853c0b68614134f6028865700b1fc4e7f34ff28f449c6abc3027f38d7a7f6d84b8f27f7cc5afa09478c809eec346bb58244ab42a3bef61a14ae7640d76591343983de9fe5f1b985ce56c9fcfb2e3f6220779ca6f92a6b8aa726573b38ed7663ebe4c85066ae3f488ea3309593fa41dba8efd2b8f44b9fa8f7a427823c1228093a3 TAG = f1832022e06228c36181856325d4eb68 KEY = 3828b138f72f8fe793d46c55ad413bab31a51e7a9093cdd10fddb4739e28e678 NONCE = a60413c0ab529ccf3de58468 IN = fec017c1c51da5ce9dcd8e84cdc03a43145b31edfd039c7c85d8811a2f58efe7a2d7590149a98cf0b5af82d3e0a325223bc9d5585ceb1afc4cdd96024be6c8064c2abac14f68e65de49e25e3e967500ce5b4504d00a9cbad1e86bbdcf65c01a7a92de27583b7b92122b6a4923b7192994a1edf00b75d14a982f92559dbc2d5e427a75ad29715375d90193ddbb39b9a52c1a23d75629c539e0a6ce822c7c08fc77dcd3adc357893215df4694673a16d34513de21217ce86897c8f0575d213ce0c66eb1d1985fe73dd86da3ab5e89df4243e1be9dd95af94f878995d02929ee42a062100d6d4d3884730f54593d5ff7b7ae53e03d4f0e10f6f4c3077206499ab7d4de1e825d532d0918f AD = e2b16ff2b6c73c9374704ffb4cdfe7bad9eeee32157f2eedf427f99c2cce80c5aa4d9145e85af0cb08e6ed477cbe79ee168ded5c0895f9f4f939c21916b3dd5c9d268b3aabdefb85d953bce9b70732fc9acf6c7b727f78d8c9aaca9e022d7cf0f95583e81744227d87fa34ae19de44d202ba01e3d03993f38c9b2fb00b54dfb677d67e6f5a15f46c29eb5597ae3d5384b37bbeca3f3d825e2b7cceaaeb36a8c1273062259608956dd0c79877cc460d0268de27355e34b9d8d1188c062ac5e10a73f2d70fd0636304b3de06cffeedd246e2db19b8b66785f9f9c62b8f0198f29d37a4ab5280f4aa0320559810f89a1618844d0ad5f3a4f5a0e834ab31e56798b7158217f834d372c36f CT = 88ea11ef6b6ee6fb0be77bcbf227e77508922550ef0d7534bf05668ae5fcab2f4defe643747716e7e000950e36c6cb24b79987389a150382c091d39ddf841b0a5e31d763d9c59753a3ef36a23b81f38e6e715357395ce715d30c14d6ab5b7454804ecf633daa39b6107f562fae6a646efb25c1119dd17955bb9e640105a21566345408f72f2acc8f2726a0be465551f9ae566da559fc0b92c36764c5ca20a18a316c02e606030a53450e7ae1146050a48a64c600d33cb84389b0bdac7ff45d3d1f2f669a6e365ef722d76d2fe9bef2df93c58bbdd6965e18111b5de0f4a62dbb874161bf8adfa61e9cdecd97b4fff668b3efeb3e32eeb929cf58d94ad8077c0a2ca79e80877c5d9329 TAG = 9b47afc5816b7229213cd3c9135545ed KEY = 91ea63dc27d9d6bbc279ec6cecdce6c45ff0b247cfb8e26b6ab15f9b63b031a4 NONCE = 80a134fac73eca30459d5964 IN = a848e41c77ac8c733370435b5b6a9960af36031e96260d5703ce15b003606875a7901cd11e4571bf88dda29a627c0b98065a8b4e6d382852dfa4f47d86fa08e48ad8f5a98e55c305900b83200d44029f304abd21e0264115192a3fd7b0eb69b9f8ca7865b3be93f4ba5a28468fd7bbb584c32ae867f5146efbeb1412d3ac36c30cb308c327a6f207e30f561d6efe0a535446c693e14176e9e714ffb5a5b1075812909a362a6c4bbe18322e15690c2c9cf5a18e0120c11551cb7055b5aee97e7a56d7c24fdf1214641c8eacb196d74f3d96a7fbecdd4fe52dc7b6ead9041cafd5a3fdf91fd3614e63189b488d4d7c1ea3c6351d112a2223b29d390ac3ab7f09a60bbd3df6e0d606d902aa44244334 AD = 47940a0694183b2fcb5e760c9ef6dbe4cbff6ccf33208337a981138f9d35c03f8adbd810e94636acaebef6791b531a65e99b03fc78e7eb48036615874e97cf762fa6ca5d880bb2c2f644f1aed70c667880f98834d501caa277cb8ef1095ff882e79c3a92ea8982abebf63ea9ed7e9a24d32cb81d5d98e891974e3d636a59e165984e00f05a040d33f07b39eccb924fb24780a422a6b2b7bddb5b316beddcf6fad20e4cee7d0141c2f7c4e4f759db8691dc7b8525ccbc3ee6071a2ead63e750d6d92dde7eb1303d5b1194702b6c3e0c2e6f9649e60eeddec9c1f71cf309af0672cd2ffcf94ba7e6c3d7cee020a224a9a956274d1d36ba16030e215d90a165756666eff066a8e51bf7d4babe8b7d8d CT = b90449af99327afb1124bb24f1c8b5cb878423b0370d5f7cd297b28cc4135ee77d6f1913a221cfeee119bafa873072bfa79e303fe377bbed05add41ce3a42ca4632b98f40a36227de1a9ba84d6176c01eca9d33d954d0ebdf4e40f136e0f6a56156fbb33b344a8a433941fd6e08774bd00075aedb0e396c2bc37d1250541248dbeb899e1b5170cdfeaf7b89995b049428bb277c501354f8cd48fb58f6f04f956dfd099c48778dbdbb4c95b7c9d6797cf6d3bcd1d00e88cea885ee4a10d94356509e148990a0e10dd89103a9d5c8434a7bdbed6c0ac1271e0709eba144abf3cf075c020e9f7835d5a98fb2439b399e377ae6e19fc5f32df9ddfb9e936190d3e9c62de99835249d1f32ca3f92ecd44 TAG = 6ccaf7c142d86b83e4d0b4289b49c4d4 KEY = 1344db082889367fd48c5f06bc39f9cb9e3ad4b92fa484ccf49418dd4caa2e19 NONCE = c04a98e7e29326b5330818d4 IN = b0e12e3122c1ebfdcadded5a45163a6208548e9bdf95cfd18ea504e5d2e97372e58dbfe460a57b724d38f3bc0ce02a54015779bcf127343474d7d4c1402d598bee56897203b903da5b819e2218bd0d1a2af11c542544f02c46969cd2bfac683b76a8de61698ccba63361a1a0b570adf69d24e9a7e466873c8c12e25e0bcead7828386179a4d65d5bbdb800eb52fc01b67498d7b5f9864270162158a8572eccf541b07833f001848672098c57708eb479855799567c318b1aa097efa70db0d8a8d36fe0ac22ebcc2870baacac690a79e07ab286acad9f7a877939cf2989cd6200eb86dfa7a41e969a3683ceacc7c97d1cd5487f13c439a9777a67770687657d38267a347a0b6d3aa3cf64e7f31017246e4369da AD = c96db14dbc2aa0ce3ac63794f75c7e78037dac6763282edb307821a7938de4baa3d2e35a8cfe0c8724c2a8d870d0a462ea157e15aacc69a3c881d9c819225ea8be479872d55e655c897936c95b9ab340820264567495fc5e4e3354f42b84e191b470ca9f4d8fc25d011bf9c9e73e1590e1bb919dd2f288b26935fbfb8c93e54331dc8edad5e1cc4aec103c2f3320d59870c1770319f105ee790b704ed655be423e63ab040f1153f41e7070ae3a0f34d217c4649c180c84814463902d99a9396f8c7c85a3a4c8ae2f01737649fae478a40fc72303a108822775e9c421f945cc0eea992730790a9aa0c0d014518dab371b52d30b5a560f34946a9344cfb8a19b09ee9b123bcb8f642780697508f04983b790dd2d CT = ffda075dbde7b874995230e1324f17894689baaa7f1354e26100befb546ea23dc74807818e43a3cee00ec1bbb95c82180489ae5f3a1c482dec28f96ecaf5ca4655ff7f33c814197cb1973cf02a0b720a5c44068d8ddff0789fc1e7f20ef408c1a438133fce4f7a3e8c85d95a381b94e949ce47a85895c4be7cbfad468e52a160dee34b8ddeef2ab280eaaed4990ecec790ac16de3c74aac6fe2d5e28ea2b66a921c894a3971cee4a2158054c3567e0d941f867ded5ed1d21d8ab090848fb3eddfb1559bf11815db52b8eed871cfc117980f297da79da31da32de3f162a03d95090d3329da3662df29e6ec9b236e0f7c1d7d957cfd54d5efc99c694b9dece989912388254798513d881e5943ce830729a8e2ddf TAG = 81c55fe9aa2de0d63efe3f74a3d8096f KEY = 31dbefe589b661af00a6fbad426e013f30f448c763f957bbcbaf9c09764f4a95 NONCE = 147fe99bba0f606c57242314 IN = 908bd801b70d85085dd480e1207a4a4b7ef179dac495a9befb16afe5adf7cb6f6d734882e6e96f587d38bfc080341dc8d5428a5fe3498b9d5faa497f60646bcb1155d2342f6b26381795daeb261d4ab1415f35c6c8ac9c8e90ea34823122df25c6ddae365cc66d92fc2fe2941f60895e00233b2e5968b01e2811c8c6f7a0a229f1c301a72715bd5c35234c1be81ef7d5cc2779e146314d3783a7aa72d87a8f107654b93cb66e3648c26fc9e4a2f0378fa178c586d096092f6a80e2e03708da72d6e4d7316c2384a522459a4ad369c82d192f6f695b0d90fcc47c6f86b8bbc6f2f4ea303aa64f5ce8b8710da62482147bcc29c8238116549256a7a011fd9c78bbb8c40e278740dc156c2cc99c3591fec2918cdeb5240fb428 AD = 5a32d7044f003b2ffefffe5896933f4d8d64909fa03e321a1bdf063099b9f89752d72e877291d8da12340c5dd570d7d42984ffab5177824fc5483b4faf488504e6822e371dca9af541c6a97312b9cbf341b4198b0902cd2985ac10a8b5b5fe9691bb29a88344f863c980e4e871a72a8b74f92eef68c176e9d2ef037898ff567298e186af52ec62eb7429a8004ac46b945678b82859396d36d388ec3d67653aec35cf1da2684bbc6c78a5f9e3ce1b355af3b207f64e0fa73501c5d48a14638d0906c87eaa876debcf1a532c1475d80ed3d4b96458d2236eb9f67988863bc6d5c16b96b93d898683d248d7bc601b5035fc365481b89465e37a8f7dd64635e19a0282639cecde72c6b1638e0aa6e56f9c00d031cdadc59ce37e CT = aeab9db30a579ca54195e54a9e6c787f40100c6d12ceee35643f36ae45f618cc9bb66aa4c0fae0ec2686cb4101a5b23a46877460c7e020b38b0d8d1f533ecfa99df03d346bc854a578276d7d5685ad1fb03655683a64aae4159c9efa6781f053057e0811226c7c533967a94587f4025353b28cc3a2ce5763783b4c31e7818b8ad9195bc03be8f294f9f6ceac578f9d30b22b1f5a68d647d46cf6db4a9c3a8a5c06fa97c9efb4578f501ea96db1f40942e3f24c44a7e4070a6b931c39947d9692930b67767357015de51a39e46fff94b6019e4bc1ad9d216a571ba0dc88859c49d2c487ca657384e49b4d382d86a60c8d5195320909c4e82fc077a3b22bd4eccf0f067e66ec78eed642b2d16f0f304f60f1d9ba69e205c982 TAG = 17ca09e3084504fc22e914ee28312c8e KEY = 0ecc44c9036961fba57c841ace4ca3c547c51d9f126567bf41626765cfcbd53b NONCE = aa98b6ddff7e4b2041f29d70 IN = e49a2a5713f507bfa00c140dfbefc0c43e37bcb932e0741db03f0055da61cd837b6e2d8f99115d70750fb23685a17121b52e98a37c87204e0207729fd9219d11a48e57970d790338793cf329f7b239512a44dd4409fe9d157f92123dfc5cba24af106442644dedda87e1d9e95fd395f2f0ad8f7d27f313e6ce1a07d9845dec5ad732e6e4749b3a161527c8ce42331f5de1d700650072fb68e9c7645a0e0e529d0563d2727e3fb38ed341f74ef1ad95a0216a440e1384d0e7ef71cde38cecdc9e2b2d563f19014c40c1f92ea0af3b4f6da9146d433ae85f647153db326a28ef6ea2e0ebac0cc1aff157067c7dba7cc4317d56920ee9deab5764368e7e5b3ce8bebd0fa129f869b15897c09659c53188bf8efb7b6ac7d265c9b85fe96166 AD = df41db4ef5350d4afcaa88b4a577b3370b96699bbd73e59aeebca6ea856cf22694a9399ae7f97a3bec226d82f5598f8949dfb92530dcfe77770f066f2af988fba5543b8ba7655bc43f8dca032981a34a1beff695c6908169d475c55b2119fe5578623f68a9dd85b653656881b0db4006d3336fdfc784d1805e48ff478fdc196601f044c9d33fca3ddde2db0102f90fff0b370f520e00e3786c2a9b0b4a9a7ea6f9d866f77d870c8ef0f3a8bedef17949a32598512af665679dfbe71e1c3efc3dee8f5d4499e20dc63281191751f67e51f201973a6675896484527d66bed94d6aaceff65fbc4192cec19452b8873f22d72bf2f4981fe656285cb24be5c58e77dafd3e096166b230f18d3f4197fe16f6ec84c060ce0793ae6848311a18b7 CT = b15b2bc4b9e8ecc5d9c4a6359a805b7590bdb4bfaa9b3fc4d7676d721edc4b3b1ef71b18a3d78f1b31a477cf25e55b278eb3ed774805ae8e5a2a0204f7291d9587663c4d8b1b744154f3b7cef796e0b91590161f3bde82f1d8139cb8d017606ae6d0552ba144788fd8caf435ab09a43a1f4057776af49bad98fc35cefefb159cfebfed76f2e4d18b7be143677ff8b3d6e2b440fe68475b5a1193bcd19ab157d0d2257f33de8e50091ea3388648c3410aa68c830566a0413d92454e4eff433c3edc74e8f7516ec17b2c01cf57a2d7c48db97b706b8d7da0b68051f2d6a87c417f46cf217a48611980890f669d39b478c35d834ed2c79299df2381a1215d6db303cb63e2795fe517649874226e0a6dbfe2c86370b9fbdd8c5de349bfa25f TAG = 7082c7ef72c82d23e0ba524132acd208 KEY = c05dc14b5def43f2e8f86c3008ef44e4dc6513768812e9218b2b216818c4cec6 NONCE = 5cfe0dca6e599ed9aa89ba97 IN = 8a06e2997b8e5f8040b22e07978c83c48d0f90bd2b2f8b426b43feea0b614d3b0681745ea4224cabcaa25ca45c3053a6300c47ffa4f72e838db135ae35c27939aad4cf7f75fb61daa3148d869057598e4e8b44c6fb19b0d9281e18676d8bc137489bb77a51a3a8f807a896d558f00040e8729ea9bbdc7db6102c8b99c8a1eacb0735577bc6533cd1d8147013935b6344116090a1bdef1f2e38a877a50c8fc0f394bafede31375c57476ba06d95ae734e6dae771a32e5091dff71d845c5f7385b9b9069ced12fcfea34a510880b088bb0016e94a5932c89baee038cbafbf06b3d09426afd2d5dd5e392636362e9ffa9186b5c753eb84f82f68fb1286ed06c58a5a936cad018ebc4269037b49f2ea0349373adea99f06062e5dbb0bf94f2883f5c0556 AD = f2a3f7af8ea984bbd85953f14202c6e478f98d0bcaacd414329ec480d0c29fb4c1a052d3228c883928448f0bef12cee5b69829b4a3eb4680084131867cfc3d3af84fcc0d80c2292d3fe02405634f6cfb20b0fb90345da3a557fb30582175c32e432be66ad096f9425ff4060df54d6741fd6567a1e2fc5f6f3ed95cefc806ff64ae91ae82920b5c829ea026f83fd90d760e240da3c9ddaafe4d08507f4af1049056dc6d09657779a3dbd889d851e97d4ac60dc66df2d24979ba8947a7890a304bb301d0d42b67824e0c68fc882e90cb6deee50c2e3d9f0da59ab23c997b05635a0d56c71fc39aa0e6b19c43a7fe12d4e4145453cd7fbd8a3f33bf5451addf05052df7ef044a33513bc5f1a4cfc8b68015664bb5c8e4bf54a85efff109ee96af75d4a5 CT = 2cf630548d6f2b449057c7861920308958199f77b123a142c6b7c89c4982f4ed0efa2fe899914ddbf4543e70865a5e683b0721d6c8443df2e697acf31e11c8809aba94196409020a7c64d396fe136826455aec973af23a6c7733cb567f5ea550e50e0b796623a97807d042855568e3c568990cfc818c31a1bf415337f43e9baed57fada2fb2ad3c3543f2b7f2777e03f84040c1c854c310ab1cc5dc7f2a5fb213af79ac068b46c7d9475bea126adf079e2100bb57904a931faf248e0f7d5832ca83ea8a283e0136979737132afb1f4ab38d307ac0774814f4d5ecdc4aad79185c05f8a706f579b78f2c1c7004cb38e6cd22c2080735b34c3f6134955ed3bc36b1ad5c8e33209c9f3c658fb07b59b6002b2526cd8d853a5c624b7108573d7df60c827 TAG = 3dcdabcd1c82002a551cea41921570e5 KEY = b33f449deccc2ef0d7616f22b4a00fcd84c51a8383782f66f1696bc6405005ee NONCE = 6afa8baf923f986b5779ac6a IN = b0af85a6deae5fcaa94778bce015ce2da7400ab768f3e114cc1b645fb2716789e2aeb96894fda6da5bc24fcf2466124720d6ba99e5475d77e5bcf2c2f8c8e5becf5eb73ad650861bbdeb51ba5ee789c227478934200fc18f36e4fe392c99d4c3fe0b38b40d2e84f831b8ef9bce9ac1362c755943521ecf5b5cf8fbcdf08f2d47ff7cd62838597dd342695a1b037bcede69500bf70bf1edbb40a17b44695bd8ff8bc8664b3211a6bbfdcbd1bffbfb1a2ea0141cfbc6ac841c803b137be5eeb2666c46c09cc1c4fa82be43bfd56e7a2b8ceeecb6efc1933a90213a0e1bc7aca2af35f2d1dad5f0d9002561064a699f1ce76c39d9c2224ae596e88a1517e19c2115370768d50107f3f2a55051838ae5897acf2ac0814ccd864eee2f6b5d7a6728c6ac6e6a57327102 AD = 2134f74e882a44e457c38b6580cd58ce20e81267baeb4a9d50c41ababc2a91ddf300c39963643d3c0797b628c75a5fc39c058d319e7d6deb836334dbe8e1fe3cc5704b90c712e1fb60a3c8b58d474a73d65fae886394f8b2c029e420b923f2af4d54c9de3c7fa2bccaa1e96664ccf681cacbbf9845069a4bfd6c135c4392d7d6be338eca414e3a45f50510718e2a5a3e5815eafa0c50172cf5f147510645d2269929843bbbab682deb5823d4cdf42bd250bdbd20c43e2919d7a6e48973f43a4cab73454b97cdca96721ebd83b6dbaaec7e12cf0dae678a57c431b81421657037dd47dccbee73a41f56495fd7c25c75744fe8f55cbd1eac4a174d8f7dd6f6ba57b3e53449a9ce7806517e3e07cf6546a0fa62c7b1fa244d42eee64a3182461792edb628e567b23a CT = 0fe35823610ea698aeb5b571f3ebbaf0ac3586ecb3b24fcc7c56943d4426f7fdf4e4a53fb430751456d41551f8e5502faa0e1ac5f452b27b13c1dc63e9231c6b192f8dd2978300293298acb6293459d3204429e374881085d49ed6ad76f1d85e3f6dd5455a7a5a9d7127386a30f80658395dc8eb158e5ca052a7137feef28aa247e176cceb9c031f73fb8d48139e3bdb30e2e19627f7fc3501a6d6287e2fb89ad184cefa1774585aa663586f289c778462eee3cd88071140274770e4ed98b9b83cd4fa659fcdd2d1fde7e58333c6cf7f83fe285b97ad8f276a375fafa15f88e6167f5f2bfb95af1aefee80b0620a9bc09402ab79036e716f0c8d518ae2fa15094f6ea4c5e8b283f97cc27f2f1d0b6367b4b508c7bad16f1539325751bd785e9e08cd508bdb3b84 TAG = 1976d7e121704ce463a8d4fe1b93d90f # AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf KEY = 0000000000000000000000000000000000000000000000000000000000000000 NONCE = 000000000000000000000000 IN = "" CT = "" AD = "" TAG = 530f8afbc74536b9a963b4f1c4cb738b KEY = 0000000000000000000000000000000000000000000000000000000000000000 NONCE = 000000000000000000000000 IN = 00000000000000000000000000000000 CT = cea7403d4d606b6e074ec5d3baf39d18 AD = "" TAG = d0d1c8a799996bf0265b98b5d48ab919 KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbaddecaf888 IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 CT = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad AD = "" TAG = b094dac5d93471bdec1a502270e3cc6c KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbaddecaf888 IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = 76fc6ece0f4e1768cddf8853bb2d551b KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 NONCE = cafebabefacedbad IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = 3a337dbf46a792c45e454913fe2ea8f2 FAILS = WRONG_NONCE_LENGTH KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 NONCE = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 CT = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 TAG = a44a8266ee1c8eb0c8b5d4cf5ae9f19a FAILS = WRONG_NONCE_LENGTH # Long enough to detect counter misuse issues such as the one in BoringSSL # commit a3d9528e, when the AVX2 code path is enabled, using its EVP interface. KEY = 53a6f0d9b8a81818f2fd7525acd65acbaac82684cda4fd357b1ceb6146b31ee4 NONCE = 05d8a92b5a510c3a3dacbbc0 IN = ac0ae17d3d0ee5935e18675c36d9e43967f6da38dddec14c7ec574ff8473e11ae5019e638232323c175b7672a7462df6709f5014bbe12a1370a1ffb570177927106f995dc8f35bd6e6228de7c16acb71e583c87477dcc7b17a908ce01543496c2cab8a14a21c43b18fab52d8a882dd1d999b4275db34c7f32bcba624d128580d7566a2da4bcfcc4136d58816c437d21e90456fc86381b946b8955f0448e83564165a629cb2edb978e5941010ee9153b054ee429b315058334ad7899aacedbc0bf423de69f57c633b56033c6531dde29258694045c46a797987471ae6af8fee8ad0c1be4149605064aaebafd1c5592e61beca9b5c7771410a276c3ae517490735ddd6af499ff705b9fa68d50650e60c19f5ae2c88dbb6d612afc7be28a5f55556a2163b6f66609f7d9ba7e97c074ea39a618727421fbfbb6453ffeefa643decf11404764515d28fce8ba66b8c85d077c47a54125a38bcb6b0adf6d248ba0a9ea129c887c66ef537c45e9fd3c17ce352e3936cf139e13a5946a7dc9dcb6423ca6a051bf560cfc572ef366940e71c81aa302cb9701f9a5206e9eacfe9835bdacb6425d058022a27fe73e5edeeba98c7a3edb761578ab2ad5a442c2dc1cb3c143c6f18dbe525fedd2a9cee0ada3b2c116465c5cca9a7e5d4374b29aa4ad8adaff8d6b0d1ac3990685240ce022faaa07241f9ff445566b9e0463350792cadcafd5fdf5c37706c0025b3c627185b356d39dcb2244b15566e6e3f8942f730fd6d855daa1456fe294f9156c4b5131e5bde7f2d938ceb6c7f5deb0f847a98b7fd11a3f5d0163eef9bbeb83cfc96dd8eedd447901ff4d3a35c0ea1f691b01385eb39fd265f756bbd77bb61b1741db0502947b4b985382a08a5916da809a8afd3fb1d78d9e16f8e37f51aba100d031d9da8613e9cd2cc621025b47150b3e76775ab23412d74334bcd79746cf601407481310a923047ac68a4e6a7f7b96bcd85bb6f24e38f03c80ad41a0a581b4246ea4715ee561cdc5384a51a6fc9ed8569ba6b12bcd95e6202ecf834dd9062ec539cc8cc4ed64ab9ff85998da0e63161e7391b14de47dfde41523b6c614618bf2fd1edd68a5de1c03c4181569b6c361d955c637abbf4efdb5dbf2f0dd2544329c44b77081a48f53231fa9d4cf6f2186427e469d0cfbcd698f7e7cf773240dd2b807a2fe699f0ceb4a2339e9cde01114b2aa5c3591a82a3a27b308e1e7f092af8ad97bbe7b28d78ecd80c0c0a28372193d66bdbadc0b58e4d5408acace53bd5e12101fcb25754f8c545340fbbd1328287044a29d18f40a24b4084febebe228b67cefd970df6d44ffdc033a50534e5977bda660c589c6e3c3a28b4c500b29ff4a1c3eaefb068784a29914ecab7868a43999833b0b37ae79afe58875a0425262e0ec7e10ee8a6bc1c97d332bc2a6195de239a166486a3c1ad8de3a026e5b1757f9a778a511024a260c9809ae3b22d78f18ac483281a796b1ccbfe7a9b9f357d12d340e20bdf2037e8bb91ef858cdf2eb9d7161a756d8c244c55524f8f5be2e4f18641bc4c2409c14816846c4655be716276d8356e516640da49e8412fcfc7ac0e084a079129b23e54952d8030e1f8ceaafcd322dfb4bd189bb5d940ac83231de0585783387d0642a245183f7a251779bdb12c63e9edbf3d0c94281140598fea9e73e951ce650c984cfb1398f8813abf8f8827af5eb64a65dfd1305bccc45086438ac439a9265790fb225c509ce3c9d39e25d2276d7f3c06d7cc28d33b2c21bb38b50dca5b10afc09da83ba12ee878e0f6054e8d3e78d731671de4f9d5a7b97298b01f37c7e78e5fcf5188554bcf5d42559d3b15153bb3cd5a0d1cc4a96d02ae8b1b115d1ff617b6ad894ce0585f46a2a5f4cc1b83065c1d7b5d2f25f3f4bf9966b4c7d7156931861d5edd199c126f1ee4ff6345023419d0a4c87f3388fcfbecbb6c1e2f4745922b88085d21d4551e4c127eb423db87a51c9f9a140f8a7415dbd70c4b0173e687a40f895404f2203e14ccd61e0e5b0d5aa3fbd1c8affb5807d787d840916ece24c56c50d3d9ed9f19d73f2c80c461b5b3c07dedcdb41402c3826a958d74be48382dc741dcf3e0eb8955397da33941fc47288147736d778914a57effbafccd4cf293e6ed1c7d19b55433bc0363e41546b3638a4c630eb35dc6a074f90185cb9daaa6eab54825a4daf76f49ad918e90e5777a826d6d5d52f32f7ceaf818f87251ab4d1b5406ae94e41cc97fe022b144f26335829d9c81725b3daead621a0df71313d18214ff8dc687a7ab86b8eec3070ee1ca9f62005a0cc15ca6e2f4fd893de8fd91f6210f6c96a576024678535c962a2dab06f56be377dfa74bca089adb7327abd05c3ad7646b5e9e6fc2f29916b34c8642f3c0caedb53b8f30c2a77d1757103b7ed156cdc703911366b02cde87ce7343886987f7a8c028921a7b87c5c0aca7ada34970a6d0d32eb1b177ed8e64c1fc6839b9d08acec19560bf4a815ca6187635f0cabb8bf062e8216d3b09b7abd99e956734129e16a7c4f3beb850fe2b1548729355f9015c9bba336d3e26a27b3d75d75722f7a8170d15ebf77f325c97778a5a9d7c76d3e101eeae354e54e6fa60b58cbdd900751854ede326b58fa5caca073c630f3719d6f52afe675f10d464e8b58e5fde75a4f225063ca48d76efd1b645e4bc89d98215beae765601f635a3bc8cfc08d74722f3d95ccb4cb4e3ea977d0c534a4abb866fb9a31771222cfd998231c30bd16b6844ef71038b67d72c910cca40db7260dff0b74162449a9e2cf15d7dfbfb3a685080e6c83ff4341c95819c0317502ed49af7ae688b52c9866518f74d69b4144500ab9d5a0829b9287d5fb67b78801119ddae7a76e80be8c4dbcec7866ffa7d081406e51cf617be061530b539cca7e1ef9118cc06e8eb2a01425b45947a1d2332e360acd0654bba8f1fa43ece68467690d36f6802a32f03f9ea056e57fd548dd4a3225ad5006c6c931aef1990639498dc88a23895ff1f75520a8009dbde4debc20ecc546e378eb7ed5ea3740d2244036588471d96e4751390b6b76b39816d853944cb5677b493b36de9736ba0fa404ad4b3a7d7c54d0c15072c040064b871401b25b88559d059a9519c7e2446b0d110a4aba9c12555e5f620680d1fea2359bc85cd15b5c0bfd6b3715d647514118cd60483dbc9c83e285192108f4ea6bcbee1f0935044610c68d052ccaba23258d09465d5521e2664d59358621ebbb8f28a4627362c8397f0a9852e5d8daf53a961d4ee66299e2b54d8adf5134ceedef57011f810aea76262422236c3e1a478a759584c7880fb3f32389c4bd4b637caad7b2bd6fd295aefb150754799434e99e0fd45c1cc4698ab14d1f63eeb06e53797cbdddd45e7f87e85b45a3dd0df6335c3b1addee87ba953bde29ed98042d745c1465a967ef922993798966e1c8b96ad6f68404136be0caa2264e24d8d93aa1b99da9316c7780904753d4e0b45cf282b43a0c91bc9ff83cb25cacea2ea72563b2e759b69cabbb6a50d6a0a5ba545622e5ce576cc301ba35afadbfd1e26668782e1d741feed8aae894b564a425141442fb8470b325cf7c8e1552973463bf4e67a2ad58d15417e418bb91d2df4b1310a0a70ac744bbb4245efd2ae642609079a44cbf6be19809a5ff7ad6847432368c9749cfb336ddcc0e6f52a699b910cd24671f38af5dc39268a3c87771f07d53bf220b7c2d5058cc7b0bcd492abfedf9bb295ec304107130f0e98dacaac6dab998b511f176d48daeb81db53643ad194690b6e28c5ed2927e09a1e959c494b90db401681f67bf1e23fe9ef4c903f666ef39332a91a25c63efe9bc518e9aff61842007dda72dcc0264aa47543c0a8b1f0d25749ddfbed487282241140d4c64def1831c4d75ca975fdb03258ddd013445e08bfb479a516b011fe3a12e4bfca439407c0022889e46914cd41a4d92a25eaa57a55bc7337e5fbbd11584dca34adb5643105c8171e53cf04b1412c3107e72330ebf1b52f524b4e72570cfdc0ab179991f3782d05091ea57b1a233048bf062e88939cfeefb61e8beaa90395faf61c4d974b23723a4a5cd39d70f92620f8f4f27bc99ca67bed7fb6e594913991ca3025480ad791bc94a0def36fca491a206440ec31e32bb85850c3606c875708309be63c2b4f5c477521aa08e1d059cedaafe4fbef5523b79f88b57d0c81bbdd09202095f10f13e2609e833ff41b862b2214c22e8f2b04a363b38d26bf95c07b184b9f909ad3a92122e158d3566d2204b22d4f2f3ce11a65544ccecb01a4a5ef62bc969fddcb648224a5c7bd94f8da9a7d4df393d880f537a377888874c19dad357a0564d303a5c1485c1451ea55d68779dc0c11c7c38025660684ba3f70cbbab00d15b34c0f2342207ad548eacb32ebad95292e85211a8669b586d05b0d0b9f278a35ea4d78e97fd5dafca6b72d8e1fbf3e704a60a8ec60befe2e3e4d3d37f9d33a0feb88add59f0171ddeba0b79a52feb9a1f4a7a6ee7c6927bd10968fba788a807409346a0fccd4f7daac3c8591fc689aed881829d479e8d360cdb5819d5eac718a6f860f2d9ef6a0d36ef6e10efbb37819bb7b03ab7649173447b2cd47f3433a2422b1611dff91cee0b10c6d060d4e84a9e3f4dc194514cb67f1e3985be05c845fc92b41955d0f61aeba6268789998bbf341a8b37af48f07b13a676a11d27330529cabcd52365842be559857cbc2a63a4ea1c77fa8619040e79705c5b51f473e13b73fc09c28598e070dbbb63ce884c2843ec365d4c5bebbf815ee3314dde0bab6b0a71a398e2d9ee8ba2f832863fae7eb0c18adcdd17f1dee0df29a8409acabf516c8e6dfea5a264c1c6657f774c86a14cf96eecac18a41b1650a9e652c6c9264b03aa2fd30e333a9f24cd6b0313358e3c00943a1de63ca970b7da2cb8a0fd1109cefbf12176f5dfb59457480428b194e88449bffd8b8d87d05d30f9ffe9ac3a7442b0df3418acf9165b14242489a54b6b47ea543fed5de74a00f61ab2af553b60d8d21c76c42052c72e4841bd94cf88185c39287c04d05f6336ae581cf7528a59b2874795caca79f5600ac64ad5820a91c711ae5a1c3762028242c5c8a9aae89177ec4db5785cd07402d45805a2e2e970059e4e6483074df1bcc01f57470fb66f45ab475ebb5343b727168e355a6c25d42384e39802d7b4a8c54ac94d82de12f8de13630ec8c19f008f98c505dbbfb21b363472e23d0147d1ac555f0981e2bfd07c62d097acf930094dcf239a40699421b207ac2575b7edf9b1d772ab066362820c182c2c5097a47d1dd25ca9e0dd9c3ae94e9a8f0dece74cdeeec3a17803d5e11f037820ea20364234079286a7c291f3424292b0eec3e956513cc6b078a76a3b8ab42c5fb5efdcea1d438f7ae08507275b48f9588a15be763ad094885269efa7330f6fc9d4746997c98d9f5feeb6dff2734d75afc6a11196b35bb9fd0c0af428cacef0df2c5ad4e5fb4559f0f93af2fafad6fb77f453238f409ec71a912350d7b62952e4858927f620d31569242615345265ff1cbbd7fdfaff35a45732628da663bfff3d3af3d7b537337754554458a2d1af0e16aa8ad9436096f42e243109cad32fac1adc58d714cd3d0d8483c783006991f3da263ef5ae1ff2ea06584e45849d64a07170675c29f0b2abcf1eedbb63b6f5d9dba600996c7d5edce9ac69448d05c0704fb9f84e831b60c376b8a5d33ea22030e2dd3dd421d8e0a810a77c085a3861fcba214a8baf592d624d673fb34f906581d923d80b06186db8ce5fbef2bb750166f7556adfe93d4951a825d55b0bf92c9f25776df784f6aec808ae221cc98d05ce988fe6a13ff96083dba15500e149409b54345274e3633fa8f6685d6fed40c20a5c5705f8b37099a5949846ca15def5a6a427eb4eec72747f116366adcb9b74d3de0b125bdee23ca98ee6312f41fa3d9bba43a8d343552c969c41f766ab4341a42ec4cd6f4d1d4c4b1f16979e5389fea36a150580418d95520506fe0cb1a1d861e09d21c57d88c46e10a3c5ad1aedc8f2743f5c06f10d6da9b2bb3ec783c6f5788ce9400795022cdcec197f9dd3ee4cd26531e7f057b6d9418a0c52ecdb35a24a2a079b3d396017feca8b31aa55e3d5ef79c9ea9ccc7e3d0b47f28f273276666fa1763b3a452672fedc94557d984c3353344a8bc9fc833dee685e33d63540d0801d8068cf66cc48ddcb0d42cec881eae36fc2614f96ad67fceb5c98ec33fbade0e3049178d503c13c2d5d71f32f4582d1cb0f47a2ace578b903796768a906998bed2995798251d7eb92faacc19255bf12c0024a94971c185841113faa288beb7e58d4a98289630fb3d230f936eb1b9d9c7b94b5ac9d3a211c0b454a26e29bdffb522548a65e8dde3730918fdf0575245e71ba013ce08f6e698342a61a81b1355d2483e97c06462cae1cdc7787f4bcee4396a08dac9c14981f2a8f4614a31b019c83782d5d8370acf9db467d9d95e8efbe44274fefde5860c2333cf81593a2ada9f5bb6c2362ba97fd7c3e5bc836c327c66b57c0f023efc0c0ff6feae0e625df2f4e21057060170c844c86412700d7d337b1f7835a0dafee5206cbd76104c5a36623c7783213f8dd457b5e69a86b74030a27b3c30074242b1d97e65a233885a681ec5a8532bce9dca1998dc32c6b40dd997b99a6ed6288e0b9b09447e356bc5345b2133571e65d47db2c736a391970879103d4137cab6c0724b8e67064167cd5521f32135fb6ca43c1e118adcded8227c9dbfdc18cdce154108eba5d8c60e5362e8fffc5c9ae6ac2572188617e4ce0f432e2476c74a4227af64b58e0ebafaf0b1ce01723ecd36a2a4167b7991e28b6a9e81992fcaf7b4b906d0361add02104db83914f28baea26b50561faa46293ba5247e8263ac0347509c36405747866d2fa2beef44f366108f6a4047e282a477c28654511075ddfaad9b9844e18e67320a831e647d923b2720d65ddd9ece165c222231d3c3e7f0001d15e3c690e9831ceb369a8edf183133814bfd20dd25d50973bda58ad03c4cbda8008556fc653ef401ff76ee858c1f79a0b09b4232768e72dd06e42078923d5647cb310bb644feb24d6b7e9d1167c3676cd96f79965a066aca314089db60bdc40c2be4b69c569ec76b3bb74a43fe731bc869c9222ab5404304a513d4f7d2ec5af278f7c3d664fcde579bba7bd472bdc00a1eb4c46ff69fb7e45e5712919e8656a8887afa28cadd66461fc57f53d574c92105818a89f210d7e8aee6de2e78228b2cb03b850a6e77627f70f51bb919bddf61837a978dd4cec2db138c657214ac07b67134bd53b071e2bffa3608a0b0bac88b0ddcfc1ba4dea17191c9ad76ab8de72118893256a7e13e15a3bf98bb5757a78c58328cc4b380f3786f22c6be81884d213ec3cc2784583a47a4003a59ebea08bd06e290a892c937448e664dac672942b068b839593c442f6e1d22875e01859cd24c17d108696a3196ea4794ddfdf25721d3dd3e754d1ea884e5086479819452991403a39014297fcc734e56f8daae4d49d5c47016fc3ead550783df895542229ff3b034b5b722ae2a2b04ba70e42c174e9ddb89ffa60024aa16f297ac9383b2ccad53de4bbe4ea2fa3fe3d059d16b4b4fe9959ba3c4e58922e7fa2673f50be5b636ee7c79b445471ddf5b851ec3ac505980bb184c8fe44c7776ae9aab4e66ce31fe1bc00efced390a82f96b4866e31ba3ff832a25b1e1d00ec44bf525ae523b7102ba60c1d3a2e2bed004524afc90a064b325a258eb36315b1496c748f5407e922914787acb8b47bdc495e521518e0637eac4b1b4fe1adede145181ec7ef038d48c473d6f296b349d7cf874d329c71f272883eb7e77ff303957e159fd417d5055d82687448950dd149e1074a1785518ebaf7ac167e07f1f559893a20d133b59aa294efebdae1e19a30ec9a3e257203eb9a854096395825ef4d1e4ecf1f8daeadfa049ea6c435c50d67fd21c6f6b11a8be46502f0dda1715f5349df5330454316498660b7996432e679c73f1af33e529ac669496bde538890cc093122842e3e2e4bff937708dd4b1b1d3fc066a63824266461e4af9245032d690aac0ea5636c29606473820ee57b112e2bd68c0ce1936b7e76a7873cad678b26b560d7bb10a7dcad3f69bbf226faf2f572c105741a121fa1c55ff30b2d0b7339ed9aa4c9a3671e6e4b572800afcbc8764b16f0a61c4c1ff24c3b64992cd84f39d1a4d5532a7dbd9f7bc847258a33c509a945e53236cbc46b61fc6fad662c523eef0c1eaa4bc0a49610c8d09659e7bdfa858d2494dc3da0a54fcce229951d366fd17f4120f27ac77e5e6b777693641a853eacec09cc4dc08ff6ba22295acec61c5e6215eaf2a3a012461eaade8faa9cba630c5ce2bee6f1a4676d54b4a38b7b5cfb6c98106a4882ed88153a4f0bad3e0f3d04dc1ae5318e3b8f4ab1d122a548eed47f70edad1a164a9c5c3eb10fdecb24b0b68005b2e958980481834c4f673478d3f47d07836d3c1c513dd920042381f70f1a68671acee2fdd453a7552eba497af27127999a13a33104f0086390e01635d1a0b79d92dd43211c74047804e82d9ab26f97ee88e664871dab52a2a79443e39f06a6e8ac9d5e986252529b389d9ed0b2f55fb16ca65f6e90cc9a149065f499630f973996c1e2b6c53f2ab391b7d78cc6926b1684d066a3a74b86b3b633baaf3730acd28deaf18fb926e1ec9c1f8a2345103cc4cbec05345db57c5adcf062412f289607f5fa41194f69bc2f426a30c7a6f8d1027ee8dc96c9957e90fbd9b16475b82dfd8698195159bd7b4860004beb1fa85e6843eca1acbbb0b8c7ec0b865ed108e297a2d5f915304167e18d01e51497e6e3ea76ae99bcb849f7595fa74c2a6263e2bef65f1063bce05483980ed51eac5289307117f17e99d761337e9b1fb625a1b900e6179f3b02de57a0b5f52352298c8a2d2c816182ec169d2b9c0490097ad98e2edc99c6df683a4b5b6eb73ccee0aaf07e8cf8f2f632381ac407c5c578bc1c5a8d0915dc231b01b92dbd25c2bfd412995780582793736572f1e23ef690bfe6872c2572285cd737a4be91f4dcafef09232de77b315d73f5beb23d03625e031d2438081222b063c343f52565ae314ac47a4fe518b45d0c12f2ceabc5e05c20f607b97035afbe0e29249e47961d9cf9b385c065966b0c7ea91cfa9ed1b55a58b9aaa9de080ca05c6405fdf15bcef74177226eb225a47d532bcbc82a5ffed7fd86c2609b146d86f566d0b84f638d46d6eb696bfbbc62c4fc981a94c1d6ccb9f3f7ed7976ea7e8ff1d2a2d79986fb27f1401f25d5a83f64844fa9e839fc8855007b417b261d325b6e7cb124b27ede8ad18d2b6da8bfc4d4f50c3960d5a1c82e4557b16d05471602d2a31462e4bac9535c9a57389ae0613a674815c2ec10c19f529c9274896dfe49ab06889da517d482145ed8f57ba4b7c0434ce24090ef2459682a4f6342ecc382b4cd3409c3415bcb7f1bbaadfb7ec308eea8b6cb2912469b707c99a55c1754db0650616754735b85a41433a30b28e3946754f90caeb03c7579fc9982e6ec5501d6f23e0f2b6392acc435907d79ea11eb6955723a81c4f02bfc78e2eeb1d0408f8f06b4d2f6d20d90f7698c4e58bcfa993884424f8fcb602ef35d23737fb6aff220927e28c19043ae708fd9755256a8a1660d9c5827bab1b836a10aa23aea9c92fa3b25428b3791c5d25f3f1b63befd5480ac4192c966350edceea8938ecc608e0f063d16d427049ad62625f5177470e7a0d811e8d4273aea8f7377d51db07fc34d9f18497a0c2b5c0bc5e8778e06bf7460f0487eed54d661d74346eeada9090957159b86f8b68183e33d0c3fc134d87e068badd8789d4c7adb829fe08e4558bada5ef3f526afb2c7b6184244af0d07aa5cb525c519ed32298bb6241d900ead0532b0b1fc77a6577963e7a44627ed326741af254ab957ca0298a74323d2ee4f1bca70e20ff796491424e108e03c20f2eed7374c0aa2474a91f3ced6f46165c886a510734d606ceaa08822bfced69def33cea3662512fb42ecefee341d1b499b826ad882542374b032e907a7e6a4dddc4620a5d1002b5aee25711fd2dd6e9d4e90ee350f2889d6c1f4328e4b711fc919ef3c655311637b83b4eff39c157e0510807ec61714b843bc9eb22a0f4dac7e5cc07b8e9ed587b701d9aca2a239e76ac9a16338b74d50578956e06b1ac35ee3b822ca779922d89de7d915afd7d80831e8534b8f8a2eaed252fd862abc99aadde62d4520d9a7c3c3da86081fc36927de60e3479096a2b5025b9a789da01da969cfb0ab2f252c82db9e6663dce3888146b365080f649cf94f991312817147d8f0d1774d8d44ba4afd846060df2de1d1043659c3b94b1eff51fff84e5a81a0c635aedcf677285e0d722e3335449fd0f49a41264fb963ea5bba31dae469c789047812071d8853291fd8003cc31a8968ce7acb68a6e0172ba6ee0e9dedbebeb62143047336c5a91c77085afb01fc075938b306d7e36383ecdfda55b9b5dfdab53aa34000289c398f617a146c4a06404737600484d8d4ea960061ec2cb575dc485f65f275540d0ce7550da08417632b6f0f7d044f6f719ff839aa3e5c9db94d45225a1cf0bdb0c5bffa781572ad605ad37aa988240858c9493dee9f00ed281e93532d89aba5e9e59ec430cdd5edfdfc2ef65e094eeab71cc40b59c997943a0e0dbbc80f1e11834bf3b53153ba1c1f0ccf63b3c802439b2ef1430be6994300d9b2efe4b84e25bd3bf8a566d4851e7fff57cada544d722438e8980a31563ef0558fdd8db9bdd6f1a3e34f06104b680f63c1f80a08ec6ed74bca69bb1023fe63d24c7e7a14ce85db6e21173f2ddf14f233f3787a37e4b347e4d64907fc0a23c3da017c81c27df9fafd4695886d0ddec8c47982912eceef886ab5680a130bfacbf3c67bb4f0cc118274bdfed43bbc2ba56f048d6a390e48932469b30ac84fdfc2e812f32d00a85349bb22f2d8091e64282fca1b40811db756059de5d03861d6a22cfc6289097d23c26c5e3f000f9b34a0e1b28a1269d8673d09107b29ccaa1adc8939bdca312c69ae4a238f45410d8f1b27392d594ceea2a6b42899ee5c5857965b29bea1bc413da618899b1894f2adff3b3a7b05a626e50e42379f5d0e0a148ded33d815f59d1401b197a85656466eaf88ed30d1ad4a87985570291efbb3a2c6f22c0b111e65c843ca3c6179e94335f0f91d4696e1a31107948a042f55f264c32a35e719668483957c9c8e13fd01e5f751870a509f5f06ba41ad63cbd5f706f25b1e598f6c9709ee6bab627211bc38494962e930779ed4ea2a8471d309c4c4f0603238959cb13476b673489696c87ad9da5fef0d6467145a77ae0b1089c8626988278a85be3292680d9d7e4c6866f19b78595d611f15f9a5e37b3d145d5aff4a5b58a3286bd25a862904817afe8e9b9105584af15f54554ca5e7dceaa0fbd1111aae126d74f68bb6f0ce98094dc9a59a31d9526729efa171beda9ac5b7db9118aa94b9b5ad58dc20ae1c328e31269244d636139 CT = d248b9e47c303f735b0d29f6111a742d93509ae051466688d56b587104a74fab1b259da64475fc0d2c3e28d87ca4edfeaa5715c23dc0e5281eb0c0c14e22182bb02f9f7d3c24555cd6a3ff766c774e67730a920db5f85d47dc23bbbee460f0922cd7ddba81ccbe727b4b489e79a19db2d012dad2a732273dafabc0fbded3c47dbe5b6b585570c39eb62850dc47f4aa0c29bf5fadf334041fdd4658fa6cc29a81192a53dcf47c03ddca9d03b33b06e5b3808be77925b7e7d8cf51fa939e023161d969f92430917d73f3aa10b83d5b7402410280561a27c376ce0b5151a51be2ef4eb9057eed25a0715436233615dcad1559fdbd81042544441857cdf46d72f5f50ee552cfd3bf166c530e57fd97f34e2e71bff8a90b30b4c4cc3e843b0f06e4eb2ff82675e428f5303aa9141dbeb615cf6aca5540fd7cb756fe5f9b08a4abdc6eb90b2eaef51c21eb9ae79a0e44b0755b3ed48f5e6e57f3148ce02501528dd3dd2b0bbec2650710a183e38510990002ce6498dc5ce7bf33d699dd18b66c0f8031d958b11d678674c355a635f4b5e8d863785f5dc2f99eba9ce74595493c017697344b651dcc2a0b1d5386b73abd8bb2dc77a2d92173d3688d0d704da9e44a6385af9fb3a81db68822b1eac9ab284f0155c20f6bc34af85d8518d0dfd32fdaece1379abca339a00e1326b624b3e4050be5db8dced5e6c4b88b82b6ee2a48c373d236ea3565ecc072e953ffe01b624c6ecbf534678aad9c3f8a07d7dd7232134b6b397d0c96ab5f795f9e3af65b96e7a765283d8081dab9f953113abe06e8d150bf9a8416d8932fac17b032dc346be43736dbf066ed239328803510f6f62bc8abc92f6df9a82c02cbf85de91739bc8d7805d392341be99798079419540dc952fa0d3ceca4b806ab1db3b717f0d720038343465a8bc0da8e8964e58634e8a2d6c99230af2ac7c89acd3f86a22075dc40818028f3c632b36a39c0e064e3ca2a078c617a3e73aaea56ef11114f9efaac90a3ec8f8d9b18921a80d74b09ada83efee127f41179dc6c19c7965f3e7f43e22f636534b123e9246172f9920f253d2a2652a5e8c337ff93b2d479bef5e96e972a9b9cd8af057c750bd711010d59ce065ad50fdd487b5dde616301d0ae6373b6f9efae99d8972f242dd7a6bc61caee70201869be202fd384a992478dfc133b84171f013244c5d17585934aed3b43b818926246227d255bf832ff481f5f8d074ab159a11d6d17ed0ac50f727b870db966e0373bd3b1eecbf9ed66aa66caf33ac57cffe4ac6df3cf7b0e54ac54be4f3d50f61b33557c2990c908a710c85000ef6fa62716960daf918ae3d81ee60b3813e65673bd911ce468510bd230b9c2d215afe86ec12e49e0ae87e4235baf3df237188f5e0af2e61c22a4bf77190dd5dc804b4cc330b360c3dc093ef208c37d299ea0cd2ba906084011e16ac5f4fc9646538d5b538a99546d34a4599c8529c1524fc4b394d6a9cd762855905233ed92e72c8b538372ffe2f0df7085eb074616c7e695d7de40779e384d5fdb49fe02385424ea991dc05c6ae813f76c673eb45d6105bcdcfdbf04dcdd20caa6e30efcf3537bcf72947e1ac37d1e8c600ba9238569a4b3afa590d61acceb2572da85885146a142c8f8c60afe4d53ee4d61f33c47e5a99da9a346bcfbd013754ef39a4d7f16c4c5fbfa53d7f180c16e2b64f97dcfd65349939b5fc167c7a78926f638f1893fe9a81e897beea3258a4175d14f41dc123ddd846e45a87f35154db8a5ac27c7a0fc95d3b3113cfa9e7c828f83a1f0d91ab7789c33be5f55ecbb8eb0c81bcc0fccc880011b21000e2f10773388b198ce79c5d694472d3ef6b2e55c342b29c70e4f33fe59e2e0bd3f9ef617733dd3329a0e426338d9c007bcdd382522cb96e59b223825a39b01b52809f5e8518f64b81c99022d8215b5c435d87cc1a57bd440b31a19b197b277b2072968595ccd64c135ae1b218046e27a7f2685d013ce3173efd07586dc72a28ac4792e804d44f9efd785ef005213df928560a20daa4c24ab07f081479270a0dcee3c26331c48a164e4b9d79a7c30c77ab06b00e9b72c190d35fb873bc095d5e6231a89b52a0737a99532079bcc72ee221b48f0d0d9ba9105f981beb4225f6efc1230d6da10fd2b58a65112a98e4bbbe1accd6e8589eb6d9c771bb911cccf42aa6cbc68d1976f0da7eff1e70277e8c5f83734ec1efb2b00708fef08e986bd6519a0fa4b5772e585ac8e37fd2a2af07aa382579498b3b75863fe792461492b8e71c4a1a2f4421705696a96601317cfff1632784b5d75fc2036ed3fa650354620781b9fcfd53f1927223fa045edf4abe7b2144512f3e3aee99f7ac3e46028bc2427aeb18e9cb40db57b696ea884658abc9b7bae0d8117f93074a3ef903528f8b55c7687cf9f0119a1f246cc9e993219c6384359e7e5e639bb294b264048060224ae168d7b9f1f795c07eaafcddb10b61ac2be3ab3e1fddf75c1f47559f38d24f0c773d0e8bc5fa85d7d33e3aa8d0f15583b8c1e7aab6f5d0e085b7175678bf11cfee8eb069b78220377819e3f4d28eb833d3d21efff543d5c6357fffb4a8fdd6ce399fca42e2d71c53c50f6b20bcbaa1650b57ff483837c39a37d5e978393c332b43021508b8ef27773164d69d0af3c0dfdc125cf30a7c49a7d8e5320d68a35e80cdfd62a0b7ce6a412f08c8062e35265fad5d1f226d590e9b068d09e48772711d7dbd786a38c0325b3d5665c2ff45ad0a20c174dc5739896ac727b34f11c7af299d36d30c69bbdc35770138cf891cfdd8123489fdef2dfaffa9c2548ebd60b0f0bcedff44691979b4e92b364753120364dc2e3b895095da828e8659575a85cca587ba05ca625480f977a6fe10181ab6ce005defbcd8894f8c71811909cd6b56eb7ffe327f46793a9e98bd7fe8951400276bb9c7607f8ba1e633034b73d7f0d040197c3f346394eba68c8accccefe05f59cb7ea9ab1ae2e172d8f466ee21c6531cec2c9dfeebc477a6d98195c28bccc1d5e23ae50e3a1ddd7de189e36ffe0e387df7be43427b194b16e18b42eacd517bba78edc9f56a2c7e89e6f13513718869da7c8c529bc337217a69e14e35cf97ff7db2c23700347f0a33ad25a299fc52b35f63949735ad864aa127053797541864b07168f89ffb7ba5c9a8bfbcb4248383a95f45461a7aee9c658c5679205f47144ba4a06175e746037b8cb6556f06405e0d537d0f2bcd898dd5fb987d96dbce33001a50abff5b9cb0161dbfe30f5df5a161ddd8a750b0cb33898c110415881fc81239f2e25440bca41a5bc46fbd3787e6c8fe8a463415cd9a82be368a02566da740dca8e40e686e1213d9c15de2d3556a1e1180b298ba3074b4ab93e469dd9a39ac0c8a173b04a5ad913e72e4d7b5ff520f108e1a1747c11b6b2fcfaa89b3ef7e669f8ad9620364b4f4f0f9ab274e76bdd631df033357a24723653e427324d907a9eceb3c375c43ee36cdeb046a6374be19ab04922da93d4dc07c5914df06fee97dd813f5fd501ca75e3c5ad53574837f2e51ba6a257134e8ee0f4127c59840ba8b1bb13592dcbe47aea50e453c7837e91bb12ad1c74fd0f149479bc0334c511a822145690a3a408caa32671ed05c2dd219ea360c67727c1fe6a6cd842301761e94bedc73f93de7091b8b6d2783a788313b2fa12595904bf5d1167a5ddc4ee151b1522de60b7293b72a62c4d08b396ed682b6a6262a212ddc8c70dbec1a972cedc09f593e21d843279561884f9759a593da7b17a147db7559f19d5d6f43ea98012872f974306037dc0d344c55403b35a5903f766359341bee5bccb696fc0fd1c7aa8803e4c2f9e6e23d386d3a202027c5792e355592efab9330af330392a7c91e3cacc4e645359edafd78b77829374cd4b644817322b7650696fa763a0cc7143f9ec7e2f6ab3c9ec2443b0c0b0a31e9eeafb7bb8c375232357f08256959a10a6d4bc98d6cd9314a2ce7feaa8c0eb1eeb15047f715d6ae9ebd64238d648ed6bc50617a360d8ff9a01aa0ce0e29338d34bb9612751445372ac6d74837c7d2d67729760216ee33476cce1a154086ec31d986cc5a14e86561c6929554fb280646164bb03e8e52588a1b947960a77d61c2d2499212a742e1a5b78805b5b64fed141d3c4834301b8a8bef31ce65edb539fd9469b590a6980d0d1bd29e34a09f87438059a09b1ea234d1bb29882e67599fc1e417db9d86332077cfb05fe440ad1243e26a67a0ea30e63cdee8850a543d76e810140547412fb1400ac87a10e3bc77d3918750a5cc3e7a0efbd736c7ed4139cd5855ddba47143362bf40b91fcbf27222017c1552360466483e67ed125745724cc713c713dcf7ef6ea3081d65d8d78b903382717848bee7410431e1040ec92373f75a1bf229816f55dcfffb6e6da33ed8e1e8b05f9348cdcd6938f053eb9f93e0de639e922627bf61a6688f9649bb9cdfce6236a176db8b9b53ce4b5f9eb9c0680c92128bd327aa7f04a745025faaf117a18d5664027ab0e3f5898b834e1a75cd4b4087637733416f8bac1ccd67cb4457005945676d03f76fd0453fdb9968643fec98d28da7c8cd7070a803b14a2459f073ea075fd023a896d3306fdabc54416e95907103cd2fb642e301c71cc48e8eabedaae356582761a14e0b3b0ef1de06002c2acf594c85820ae3a094e5b4680566b592221543c1dc5192d6b208e86b5aca91d4e3454564eedb3b8208169ce97e1632b864f1d9d4c4c4c0fd4bcc5206e8f6d64c7cdf212d718cb5b7c7ee21593ada3f33f5952e12bba4f46cb99044978fe75349c6ca735db35891351d7e5f02a93354bc45a9ec756453f053cb87430b3e9211807f81ad99b6fceb8ef1b2d655910e1f5fd22f2ee90e42abab230f8f39a8345eed6ad294a0d32416a253f829093ecae209bc1dbfadae04a373080f9ea8394a28ddfe1134309bb53ae571d2019ff2bd4be94f8176d90987fcebad323f0b2921b85b2610852973f383a2ff4a5fa82a77b13cfd50a33f29164a9ff409422cc4cbd772132856cbd08470b220ace957a6b8e02c8003d750539a38a8df19a5b662907b72e3098d77c2fc3ece0693b47ff19ce911a93b6adce75653d48ace6af10b8f1141437f9206658707b16794e349db3f1a02606ea167d0213ce3644f64ced64de3799b1729210fc31ba1811b0c226306f2466b230ae35e6d8fa11c8f932e27da8cb1bd311919bf9178ef08bb7a2b4ca2d2e6e9585ee9f916991cfcd4862f5de9fbbc63bee6edbdcfcec9173a252eb59fc6d6e58258ca8b2a4475acfc1e09a0c9566d23d92e9ada97de51895bfb0867c42025c8d089c65bba67f4dd84d7c5155a930329345cdf3b1d6e910e730df273e183190beb900344bbce8c3bdb13a7e4ecbe967a61d47921aa55bac2bbb24e3e03d386ddbfafb3b32235b5ed922ed6ac2c89ded1316b69079b826507d708a6cca14ce2244a67be90fb91ddcb0c97432703729bceb432bc856f5eb9d2f169800a04283b080f0e053670a21468df9414fda9f4153eaf1669a19ede7925f832280800f0063ceee34b9d3b0f8da2012525fa7927e76bda71954714d5f51405b920391eca2ad71160acef4091878b907974573b4cf1b377baca0340ab0e4ec546fcaa6130603ad633c3ef980e88d8f44ec5de743cdc6cd9e0e4cbdb97a5c076be9ada8f26bc54d711facec16a2401292cc167bb98cdd320ec9321414bd97498f6d9b54dbb45ffe4b3e3f88260657ee23e19de48a93595c8e3a289a02d76a27ceead05d591633464709aca117c26aa49b64667f2a3b6371984f813d7098fae7a6ba1841775b52314a06c80b4c994ef8100e233ab3115ba2c39b97f2d5082a145720ad0b12b8a7cb275ba848b3fae14fc0c82bf0353195c056b302e508982f73a8519cca722892482b9d9e6a58bfb4d862fa393eabe6aedeae1be5ed772ea3c94a0df1d9684a131c35246c68b32e46aaf89f3649e58b2e99bd6bb3923d3ab43cbf73b6b3d19fe3b62bef178f46c79ba85e23ee4b25bc561e8fa97f51605bc0b210b02aa28242e81dae9489076d259f17d25b93b0e8a2010584d907314e3bd55482f0fa43d37ae9535629d28d6f837360bb35ec869d2a959789dc49b9c8c515942a1e03650566b736551a5180a60279bdb0ff9c387beebeb9e59ed930b3746464a010a6f7ef1de3c7d76fc6899b1e5ed98213813ffb333d969ad72fd8537ef4e12ca7b78d35c24f44ac82da4a7116492ca2efd86ee6a4474014e72a5cfeee7f729b77cfdd1a5d10a03f3cf28f1d314fca36d31ef2ecb3cfccecbcdfd22367b0a0e04435654286ae3d4fee13f56bb7cdab40b4e1dd01f9ef857f94a67c1e237e24819949935ff3bd73b0461ee9020fd0a2db2cc6312ace97e4a8a33c295271453a12822db8d1438f22ed0d466150990dcb39ed042424eef7a1210c83224c856923e3251484a81a15cddb4d7ada8bb7968dcc8f85e39ca99ece8ce2ed7753fcee6900cc9b7b5691f2d67ef9be13f70d195bbd0047908025df01b4f4d581fd59239836578627d9d585ebe9b053d807e9d3ba25405029a148938a746636decdade02b1afb5ccbf2f0e14a27c98a1e130d9208bbf7da4bb4e572927eb348568921d4a3309a2c24f367c935c2a8e1524c3024ff350ac7da8d2849586817bc9d46a08a21aef035a6151e608ed93b1556a484e455819f9ac2fb155020738962e7255a82a0854b31fe20cdd351c10a33eb693c9be1a51a932e04d0364ced41ee1bf800d0c12ab5eb37fe52563666e52827720e856d4f24eb06e0aba446910aabbe36513f2274362fedba4c19398433029495284ccb499bb559a9cdbc94a0d1b733136969a743945a04e1d2d4e77fed21550af35f22651c7de802eab7a3942d7ec55a3a5002bde8d5cccc1d4ac4bb7f4926615fcece543fe5d9092d2c4f50d94fd9868775a072f4a5bcf2e5fd10795f7f172a3341ce33505ba68e7ebedc9c1e9165864244ed31bbe5c308dceff858cc42010ad8c281a24689cf2dee8a549b1abab9981d70a912174944b403ce664d8608b2f723150f5c12164e4caf28676e7a25c3928ca2a4dbe96355ef8f282e57888d40715df07bd8b5895549ad957e758abf868def1c1f5e260d26498616e2ac962bcaa33b879874569f198a91ce4e50fc50da77fea1df9f9ea900c834dcdd462d338efcf8e612aedebf254fac596507d175d30a90543627cfcef6852c7cda8b430e255c4d6d417de31eb5dba123e3ce9e2269867d9a94fdcd8ccac40a9451953085109f5ae0c3e04daadb4a2a47b0e176917660eb3c9f1aae0ec6b00635fa387e056623947c0621f0a12e86fac1881ed1dc1b9f523388d6b6596a152b3e732c561972879dcd3f0232ef0773a4fb195a90c3186c4688ea58967ce7f18386b80bd38e90cfd4cb899337ab27cba8db6523e979b4c449645bb2f320ccd28578bc7ec38f47225273fa61a2e5df97c4d76c556fbe2b0fd30e615f5fc82c3de7194caed9f5946c151c22b7a0c48f4a7cf78aa153414f2913c5eb95e3dbcea7ca544272cd13a1c52fa87759aeb430aab144fab418c835344605df3a044825965ca15de6ba0e59b2080f5844b2d110d71587e19acf14264cec2de5b8c77d18893215d1c1da0a940e7c2ee429a99e2633c216aecb7675a2314a09044951ca5a8eac798f8878fb5ea65f4ddccac53ee0c786e597169079fb6e8ceb37a71580b0904a97450909ca454a690821e249aebb75449e582fe1b30f1fa9f6464bdef654daa5ede6d4f223f4589ea25a25f4672cfbe974d51008bce296628556f55d26646e40b59f40e3149273760b40806ace3b5171e0b79865c6adb53513da2f24c4115de243150cec76107b48ca8da19117f00b5870e67eb8357e43c1b7b593c9875795d46ede26a109e05406b69fda988947e49ab195f22454c3c743c2ec51b91370b4df8d38653b353e51bb83215d122bcfa591009c007bbb6124bc590fed3f9c5699180b3b1424ad02f7c90a149b77d22dea5c996aba675c2a1a20e206d9c25d9446247d495a26486c0d0bfb09d0b5a1a177a09fa749dc36cee73af0116a6b779c2b827512a04ff0f60b483edbcdb33d2a18339463c498ae67ffa9da0aa3f3beb6bc99212f9e6961afde89045520b1f3f2e2761666a333d76030f443f53322f099035584a60978ef8b49f46d7d4d8c5c758ea52a04b59c1a3a1c2f9df3f3b6f5c45cf4b3547043b18c1d615a2c965c3918d090cc72946e8fd0b938e60e03464f4bc71fb719a1d173b0931930e58bf7f6d4403971d36b40f83be6b57244a7029e1d41dc908764d57a5442557218b509faeda4e9fcf31debbc54ae671ef636871233f29e0013c0e33933543f4b59df1978ec89b109c3977b0cf938b7f6166d6c93be5e87684a703c8b7b5fe1a8bfe153a179b55575ff05e599b39e32ed10d958699a1ffe07136081f0719b18c69dc74f66f211103e9c544f3c81a88ba9f66a9bc7017d9ca9e2cd97634052694a598476b99daf1cdfb6122869375ca5873d32d5c1e07d9b5b380b4f09dbe04478cfb1a13853eafacfed70c8abcd444ed095f78d07c0e8b4093be95c3aa24b2e5b6bfe3a06e9d2d9fedfcfeac4cea2490627e6da6a5cca383351952f654ce2b0ad359c0f7f4ad3f8d1d4a030a947d4a2e417bb79102729115cc8b6558c3362b1d805fb48ce4858deff97677e60375ed13e150a12ee7dcc8ccc64d9710c7f516555c1f7a1a08f0d7c6fd21f864fcf28c8f748c40494e01fc32006f977a5100577f86a484d11b82c90cfe6b4d6b1902fef486cc6f3e033904e150e67283e49a5382961dabd244412ca9657b48796e476a82443167e277d5a65c0c563a6abca77d316e5d3ab639a1ecfb1110af2d29f146508bd9874486dbb56328d6f59479e2766692821660462aa60b6bc8a710707ceeb0ea6429e5113e03c9f41ce0d69c7589deb547527673e8a9f9a9a74e9e4bbcabf2e306b35504c1da99730ae86e94cd047b2e6ea5e97e63a492430d37ec446434fb3b066adde08b17d7d903ad194a4a863d6cfe181a45c8c97b5062bf7c4e44d69c0d1a7e1f5029b805b7c21d1b5e56e697999a32557870ebaae8d87dcb5ca5eea2c5547a16b3f30ef9df8df821028c106f86e091050ff8b6ea4171e59dc2592d405073bea53f8ea62edf112dfbc7ca69809db8005783d63557d3d90d123a944be395c1dc3b5e1476dff188346327769fea65f3cf9363e88ed67335870ec8ef13eb9d9ff5317c4e24dfce9d11699e5f47b4233cc8f9d1b915e716a5730a5898ee65d30b1628b484a5e82eda95a590964a8d8bc89dd3c5cf6c4f9137b8c6ee9d6a692e0c0d1d858dd5b3c12de48badade4d01bff312c56ce3ddb34b0fdde3b0c2706fc292b9fac7e1a0dcd0b6534c968117f7de15eba84d2754e4bcb8093a5440297605598659f686075e2b1b464b6b3ec68abb13cde263b1c607545c45746338b9b207b5c381da690f653b35e363e1249551ad938b9fd7b0a944151cda07127bf9ba76958e926472f4aa1de8512ce834cfcae5414b226f23acdb1fe5cf685d2201b78167ad35fc1da282744c2a43cc49d49242f968f7e06de14455e7ef5adedc5b33184346018114e2d1fc7a5349e378da9b2af5b328c213888652aca9f1145363809eca7c1fd8e64a5cc3255418736e048a731f3053db77971f67014e6121a8e464833e5dbd02ea6caf385e43e9f378bfba657986bf852b32adb55e35a2675bfc8d70d43a902032a61f59f57dad2dd7d7963322136233200cb9a90c952074e9ba0fc0654f1b6fd6f7f0eb77c0fa6d8143213ce6e8b0c178f73e17a7c64839f9bebca2fc955ea8ae406a13b80a9045fa8d129fd859faa46fd27c48bde7b890f98ee938c0d78889f84181ae2f5711304fe554d4251bbc6437ced59d577a2a1f26da736193c3674adb13cef9f4cb4aa6585c4d6874b0309ecde300493b1642c595746f09e03977c8902f3a4a877db1153b248f295a0ca2f1e437d15fcab8fd77c5f967304efb5c4920b990674ae61b954af40be17a8559dc377c591b68067fdcaf2d27bd9a22041b981a84be3de50d5962b58f8c4a22fa05192c5ac99a0a9423284fe62a3a59f085136cec72cda2a53af106a2eb5bda28b6e02c299118cd91714c2e7d045346c78d9ed1b41c73231a21e42c298949f70122277f4134ed5c56639edbf3c3e717310e3d1f03dc5a94e64c4ce148bc5c6bde64eb80b17d5979892786a31225eb89bf9f5a582bcf65b83ff7aa361ccd9238d144f6a22a3f77dd8a01382df4ee90a2057dd310a6b0c4b81dfc92a2cc0c606d3be8b18fbe64ddfdf2004eeabea892be2f914edd1edd8e8829dc7704d71bbaaf08c41824dd0f4b34c9eedead9e10e53bfc6fc0bd37417de0c5c71cff0754d672f29c262d8e27b524427e12bc4e4705ab311d3bedcb1ddd09a3ca0c268c05c64951b7d724a9dafe4d249aaabda91d68633aaab845bf78f9a22d467c7e0c5fc70fc9a318b01d7492efea7fffd329d70692e76647ae665c62b280da0d62f870a52e4dc4cd92c9150c96aab16f8c23475e3152d4debb41b6756f000c3d8aceef18b49e295be7a71da1eeadf4eb96509d45d7cc42af4b7013d8bb445f577e8d4cff92770b8ba0e451f3e24c6d981efdb68c7f2dfafee40b8a425955796e369f0d4da3e998c1626ae0fa583334475f1fdde68ca211c3f2e9afb003f553191702e11f8b731c89ea26059ea4466f2bd0a1a5601025ca9417006bca5c9a57dfdba44c603ef9ad38922623b40feda036d84425c47fa42973e348a180a7570e1215044c375313ab08d6f521052dda415707ebb74d6c4774e039bb04cadc2799224bde1802e2ee2a018032e3a341700c0fa2aa28bf93cc479231efe7da0e9f68e572415348c08cf648117e9b6d1267fef6617f5927252c86cc087775db3e30180feb5ce7e1ac9c3761161e07a4853aa6d97e525aa88302954cf9390fde81f8e11d97a11c79e3bad261364c18890dd1f8fc71127edefe3571518a42be611a46a0426a33221aa25a0ae6514daaf96038cb59aaba898de49e3b215a4464e0af614e638c2d9b6e676ec427fc906bc516331a18121f306a5246d179e2d3d0f38ab8393f7ea5a2d24585e7cca649637b9983924a15483c167e8780f8dd7aa1154cbf731745a8d8d54a8c4f8d854371bb8172303f9ba3c8c7cfe8c378ee56bc35c6376aafe907d3294ee9a8786281b7deff78ff125761f1a31d0e8fffe04a52a7574eeb8679670ca3bfb740167a559488d4337819613d32752d8a89013622f6a8d70f3c64b84a4215f4b7bb282a2d17c36a326167e3270757b8f1d9a0137bfc5ec278e8ca35a69e49779cfc25b95a89cc18732b5b9d1986b18878c57e118506909207207ad0b4edf32fb2b35b6e70546f45d0849bd139ffff9d8ae547787e7b51403b54f110e2ac65468cd0910d80a4e321deafd46e9af19609bee1efa41b762b8ace989dd681503539e7d9948664cf7a73ffac9ce2a34b514253c4f21bbccd38057a6d68732930dcdfc9a32219b53339d100db0037a8bbd101e71f5054f3 AD = 7b3b9c07148fcd897f657ecfcc87e530191536b8e77f9309e8d7323888b3b21477f2ab7c885c105d9c29ac96aed23b366f9fde4177401b7038c6770c7bd2ee8b4335105cc0eab9e367f0cea90d6f1ae3fa76cd21ceb9f3500ce7fb4b2a3f9e90f900a231ec693aeced7afb6821391d1f5b1b957895777aa7a2b71d9571c00336f26d54d756392cdb74bfb67d5a621d517db20441f74d0940180baf613b09452f64224f8af7bbc864ab4a8434ff624d0c0646ee07132fd376506951899bde975df8c836ab4ed9cc084f1f6d500ad56345d2f250a0d6991b9e458c62b6023191f341c8659e8a38c878cfac12b032674503df9c9bb01c4340c709eb6dd7c74907d769a317f4dd7317843c47bdb4c5e1f07f2380d464b0c47269389cc8a43a09adba86f6aa8f44c8fe514e73b5fe8d344769c1aa20a4538ecfbf47562ca79fa497b0f02f103f75522db9ead50d56dbe86997d6085f1b5aa7a4cab9e51a1247ce4f724a14983b6bafd17369fac973c6be268e20d800de870928e100990ebb0d3bedfceda36c64be3a729b603bce677a49e8caf282c9159b6e3e1e775129bd30dc3f5c9849535d86a27474be03bb5749b4c0115e2614f8feaa7405cc69b1de479b3b57e551f876a9c8c57ab9879cc68bb2ea110b2e77e59dd6a65eaa67cc4d4b2f4d6e646b2a298d3c80fb43969275d4414734e74726145dab06124c040656c39a94846e8fd58d326f4f9eafe5b95d85254765a21993f55070fcb9e85db5d42ab6b9464ce66de3f236dd2a0a26c4e5535dbdcd6eb350209a65aee785c6647ad4103d092a8ac932470880eb314f7c98cdff34fdf35ee2d36f09bd443b5defad7a5acb9df55965421fd043def6f4771e1bb27385b30ba22c0d8972aead6b654085a7dd3b60c4004a0dae22e25100e54e0badd0cadf909799329ddff699de8066dd6c3822d80c73c52d87e6fcbdb2dbbf852e37804b1256e23e76dbe43f30be4a577bc23c7941a3d708d1e1f579e9c6eebc219c74768168f6790a41f883790e08cd1e88ad09a544eb97b3d1d5af67eea666b9c027e5c7c976921189b955a9e605f6cc9c012c1c2e197c5b02504cb9ffbcb0f3ed778d540d5194fdf5d38dba6340c93da7c5501a082689616f337d8b59c2a92c25e777515726e1d7f6cc9552693cc7c30f1294b37f97d49814250d6c1e3eb335c5d214ef3641739d508b87106eaaf367902433a148ca962ec694409acb82d7749e1c88938ad382d0ca6e6cbe8255746832fe737c3e71dae8397f260c98d4a292a126ec21935c24096d2f91ae114194af659455d8a4206197495a28474dd2809debf5f550d77ffac2b0db521559910c352f23472d7aa9f4dbbdb158f40aa36912cbd918ae4c642e76d78d57ade1075c4fe1086ddee3d554353b4693bbcef1cfa87e49890838c36156af0edf384b0413d6d7aa TAG = 51cbcf4a2fd82f221de1bfebf86a8c24 ring-0.16.9/tests/aead_chacha20_poly1305_openssh_tests.txt000064400000000000000000000403321352416253600215300ustar0000000000000000KEY = 247a041f6780baf0de3741aa4436024b6a5169b0eab8a090a291f5900bf566a54ac2c64c0f38cab14a143111bc39d1873013f52f2e92062e375c1a5378ad9b32 SEQUENCE_NUMBER = 94 IN = 000000100f000000000000000000000000000000 CT = c87186a24d89e672f37df98a95d0a0653e9f0fe4 TAG = 075bc727e855c8d487bb3060c42267cd KEY = 50c985a29c39c3b75d6326e5f92d2bbc1341ff49b9eda105a853deab9125de9217856e27887b29b61989b8ba4f4169875f402289aeaef239457eceb8e8c2fcf7 SEQUENCE_NUMBER = 52 IN = 000000100e610000000000000000000000000000 CT = b6cbf6d61986eb477ae0e4edfab641effc148824 TAG = 7b476f69d8abc8b948ddc5f45f422f8b KEY = a1c0efe5bda4f6f95a55fc739c076d03515efdd22681ae0317e859dcefc247f0f5dd24c8cc30eda86adedcd96ca276ec446d84f5de6361cae806fdf37e5adfd3 SEQUENCE_NUMBER = 83 IN = 000000100d616200000000000000000000000000 CT = 86805874b9db60ef614a96713a0b9bf974d5e615 TAG = 3842b3a4ed2f1ffe7718d64ec95a178b KEY = 558f82aac8b8a7325dff1142bdf82956d2f053b6e5fcecd15f4a093896c5b15d35f695dc4e1e87738be0b8ef857c18d11d4f028fab34294de24434edbb03f01b SEQUENCE_NUMBER = 167 IN = 000000100c616263000000000000000000000000 CT = 38a55e905cbafa6d79ea8ea269954314e5412a14 TAG = 243b307d2586e8c8cc110917b18fe542 KEY = c88f4b95ac8cbe01c25868d57ea4f8566a0c4f2121d148de52e767eb9980e3c1c8d9a59d980a328cf7b44aaaa02b316872373795cf455da89e606498378542f9 SEQUENCE_NUMBER = 101 IN = 000000100b616263640000000000000000000000 CT = 0d71526d3966e7c57786197ec4b06186a366629e TAG = b89cff146eb8c1114a8b2e106c26ca66 KEY = 228780d2a7509f7a2558c2ec404b355ee7fc3028280d632b7f96c0a3eaf6471d9d2d16a79719d371ccddcc00bec9df03117f0383cbecba12c234f49fd2948c21 SEQUENCE_NUMBER = 244 IN = 000000100a616263646500000000000000000000 CT = 1042673c3c557a61ff50d5e0ec36d1177c05442e TAG = b9457a825592b0f7e01f9e7d697ac16b KEY = 163f3940226dbe821210e403a333dca05e061bdd17f44d33ded87c5def0cc85f11d8aaed4635dd7a9e6b982a67eb3d6c396afe455b483ed4c84e41e5d4e46565 SEQUENCE_NUMBER = 242 IN = 0000001009616263646566000000000000000000 CT = 8b73429d2990476ed1842d4acb3392b217b1ce51 TAG = 7cd635f03f9febc0debcff7a42aec7e5 KEY = 3898a07d0717c3143bb90f8073a78757fa39ae936fed0124524c4871e91d0e56b79d645ea0e00fa5fde3d725af662b1c5fdc4059b5a07c7a6824b4c19cee016e SEQUENCE_NUMBER = 224 IN = 0000001008616263646566670000000000000000 CT = 2ac8116b7d18ca54995aba0651bf9982cb1880ab TAG = 7a74631c17148c06bdfa5c3a66459aeb KEY = 31bb45d44639c499ac5ea60c7f94933b158ce82b2479149fb595654e2ba9cb7f710ba19b35c7a9150a1478f027adc706be98b3966462579a2c784887420033f9 SEQUENCE_NUMBER = 51 IN = 0000001007616263646566676800000000000000 CT = ee8570b7d96a494cd4aad090710e17fd3d46c46a TAG = c5e62468a33c591d120b73967b88291a KEY = 4470511419b640eccc103ed560e05e910f7430cfa22cd06eac335a6e30e067adc1305400c0585130a722f09dfd9728aa20c1b1c91ee8837165dc4cf10ad1105d SEQUENCE_NUMBER = 86 IN = 0000001006616263646566676869000000000000 CT = 6374e59fb470d35c74912f37e574ded425263d81 TAG = 9a2ede4f3d52bf51d096c351b259802a KEY = 166da003239df87cdb35f27804c9ae0c9269ca901eb322846c91fee8febff944c10b1c092012d0beb6e1d95dcc383bfbea85eebdd63e5ff39f584297e7c737d3 SEQUENCE_NUMBER = 242 IN = 00000010056162636465666768696a0000000000 CT = 503cf64139aa6cd5310579bf7b22ecabfd37945c TAG = c199946b567076d4e615311fbfed69b6 KEY = 389c2acc794e55d888297a63cf65525396780ad225ea696e8d6d24852483f71ec6d47e904e75d823902f8599453b548ff42c2f6c847d041cb9a89f3b0a530747 SEQUENCE_NUMBER = 216 IN = 00000010046162636465666768696a6b00000000 CT = ef9ea674e7908aed8fdb9128163061dcb5d24f41 TAG = ef9900822dda3f698bfd4a57c77498e7 KEY = 4a3042e117e06543aeb7fc450dab16b8652fe0a79378f78d6cb0c23f50bdbf4ac00c92a0b330bd035d6cd3918ff1daeb65d0fe329d88305f0728661dccd7278d SEQUENCE_NUMBER = 204 IN = 000000180b6162636465666768696a6b6c0000000000000000000000 CT = 60bbfcf8be81835fe6fa7a1e482a0a6fdd8d11599c3786e3c7976893 TAG = 411803ef2f1b4187c1019fb47290d0d1 KEY = 635638619b3f7fb60edf16361791d85b87a6c0537199c41f3dd087339d2a6699845f6e437879ac929a14ad12721c56b30a98019e51ffcf6f1f0d11028579592f SEQUENCE_NUMBER = 51 IN = 000000180a6162636465666768696a6b6c6d00000000000000000000 CT = 0448a57007a3fa04f64ddcfe19074d18fa8fc9f559f3e4df91df5af9 TAG = 2b26bca6a9b3e8cbe6f6ec480a831382 KEY = 9db759c1e3e2223ee1dff2c8fb3b17728b40565160de8ced8b5b9d45a7f20891fd3d98fbbd42d6e7f518b9071097aa41b4378e64981e928735ea7b817720256e SEQUENCE_NUMBER = 121 IN = 00000018096162636465666768696a6b6c6d6e000000000000000000 CT = 4ea47a2c6b0b7a8f59a0a8ff643d914c4253a8f3a3489845ee1ec041 TAG = 0e10c42a3328aeb49e6b4e3ab3fe31f8 KEY = d56bdf0abeefa000a0bb483abc5e510f23f0b57162f16eec1d3c9a6e8384389d59a9b252a76eaeef7fa420009fc58a2d57f33a9bb1d56d04f2a15b38c394cf36 SEQUENCE_NUMBER = 222 IN = 00000018086162636465666768696a6b6c6d6e6f0000000000000000 CT = 60037819e401c7a4bb49be3e12c58406f571ba2bc3af39cf336759c8 TAG = 15aa3637c6248c7310a37dd7f95edc95 KEY = f0d219074fb736b538e642cde19899cb25d9da4d2e2ad1f6ffca03493080f3ae53a3f2e6eb17ddcb47921d8d0ee8d4a9a7df64bd4c82708469dd86249897f8a9 SEQUENCE_NUMBER = 89 IN = 00000018076162636465666768696a6b6c6d6e6f7000000000000000 CT = 9303e62a70c4bba867d816f29b08fe05871250fa619c9dfa185eec37 TAG = c5beb415452669e7fdbbfd25cd2082b2 KEY = c8af470f7b3e22551209d91c47db94fab3eb93b854d220dcad4495f72ac548f0a368090c1b3860d48584fa3e62e5569bee3559147971dc962d80096ffe7bee08 SEQUENCE_NUMBER = 214 IN = 00000018066162636465666768696a6b6c6d6e6f7071000000000000 CT = 9536fac8b646ee969df606e6d64d40fbe05e9b495e821b300038c041 TAG = 8e422bb115b662a6a4b11e713d598f24 KEY = e68567491a8684c2cf71daa7ccf99c186a79b6cf328874f8a5d656ccbf6ed2c0384d05cc5ce49525f9eb9953e09ebad5d6fec3007b35c4700a0d2996c16c8884 SEQUENCE_NUMBER = 162 IN = 00000018056162636465666768696a6b6c6d6e6f7071720000000000 CT = 5cc13e4c2a33f124ba14fb839ac8b209fdffb5cf9849db01b7985e86 TAG = 3289f355b13403b1bf667d63afe74d7e KEY = cfcd2c688a4a02da67dce7bdb1e3bc2a058b71ea033e28fc9eaa779602ed10c417018ff175f7e7530919e9999fef36369bb8c5b82983f2c8b7bda8c2ddbfa99c SEQUENCE_NUMBER = 201 IN = 00000018046162636465666768696a6b6c6d6e6f7071727300000000 CT = 893c85250a37ee0fdf2a68a47e80c2c763c9bf39a8b51b0c800e5329 TAG = 4fbf24214608f9ae7c24ebe720b5031d KEY = 82891b6e9fa6c259413a2893df1d5b931c421e779affd244b7d7e380c1b6f86bb653bb308de56e6460ae29e3baaa216434c53c1edef973ba4b6a6716a50f2584 SEQUENCE_NUMBER = 15 IN = 000000200b6162636465666768696a6b6c6d6e6f70717273740000000000000000000000 CT = ff041f7e3aed8e76b2e6ecf6808453f618d5335b26f390181b2466fb0fc15f5b358eac7b TAG = d74db4633f889ab3b79fbfe3b63ac92d KEY = 8e293454cda0da79e46ec00694bcd1d558e37d007c80e8cad3545fd9204b62780fae8a6a7c274e251d25801772c3bebf971c7ef5388d7d5872bd6229a8136f2e SEQUENCE_NUMBER = 99 IN = 000000200a6162636465666768696a6b6c6d6e6f70717273747500000000000000000000 CT = 5314b3c960fd718e5db7cfe620745e4ca000152d4d6fcf4e013d8fb7b3e694edee9a0c98 TAG = c67158f2c97f55741da930c1539e447f KEY = f3e8f40daa829cf112b6342733fd00a9264db1a7b9e570f852a1080efee3885bcfce36d16bc90dc0c1b0a7255ffe341d243fbafc0159d28cee444175643a7981 SEQUENCE_NUMBER = 98 IN = 00000020096162636465666768696a6b6c6d6e6f70717273747576000000000000000000 CT = 8dc028c1fdce0b24ac16b50d1b06a1b2eb870c7c61b018cb4db8af1762e776189e128860 TAG = ec01334504efbca042d3281c59227a0d KEY = 89db04faedbead197f637f6de4efec82844a8b0cafae5aeb3a575071a5cc288bcf25e901c45a836de5cf491e2222c9f3c61a75bc709587edf7a2b087aead865e SEQUENCE_NUMBER = 72 IN = 00000020086162636465666768696a6b6c6d6e6f70717273747576770000000000000000 CT = a911e28f149ba1163140e033d85a18d99da72f8f89130cbe65f5619eabb8711b812de08c TAG = 943f28926c39ea16d4922d250d78620b KEY = e8baf3e7abf88dee1331fac29a671c3a9e082335249667fe40a7453ce5ee840cd9a1d0915f008e5b8f1837282888ec06293ca3f26b586e09fc5e59f2cc9d46da SEQUENCE_NUMBER = 229 IN = 00000020076162636465666768696a6b6c6d6e6f70717273747576777800000000000000 CT = 2216092216da36450d9289f0f067b5260ee3c02a7e25c6af3b1e9bc4b46c8fa384b502fe TAG = 898e5c68627311981a8c0464da16849a KEY = e0f96cc3aa2eab959d38963506fa998a7af61b8497a92b6bb5d5480c86cc91f29db3c7bc9239a738729bf59b61667e0d461ecc5bd55826fb5e5487889726a9bd SEQUENCE_NUMBER = 68 IN = 00000020066162636465666768696a6b6c6d6e6f70717273747576777879000000000000 CT = 72fcc3e97bd4d7d1b012fe3db46fd4a5a8ebab38dfb690b5d77f0db0b6ebb839b8297535 TAG = b12ffcb38bc3ce4213dea2d4e234fa0d KEY = 25d7735519841b062d5d80cc71af7343e1381c495a845fd8b16afccebb11116defff108af7bb79f1ae1f94f2a6f99ba803008cabbfe6b970083512d6295fb1ac SEQUENCE_NUMBER = 75 IN = 00000020056162636465666768696a6b6c6d6e6f707172737475767778797a0000000000 CT = b21973084ddee1cc3a39fd30d0b079d4e7a230941330a93c4dc60cd2f275a79f8c591cc3 TAG = 9d2faca7ad12bd14ffe7573671ecb8ac KEY = fcfc5287ef501bb44062700e71b23abc15887a1811078186e8bc5ecdd89a14daf34c48b052d1adb0421075997409f0869f3b82c2d57e4cc954e290d95c3972a1 SEQUENCE_NUMBER = 123 IN = 00000020046162636465666768696a6b6c6d6e6f707172737475767778797a4100000000 CT = 01a66de55a4ecf37f34cc817e7b3915cb0981ac8b9ec79fa21affa63190de50e313c31d2 TAG = 3e446d3cf4c6eb1c417aee561d0b9189 KEY = 1512c3fce6b96693b7471f4d4fbf6e874099439da98b60eb5fb493315f9e0f2da9391bdabb811dd736bfd7d20a233f78f473f8dc094b4d15f69561e4178dc8b1 SEQUENCE_NUMBER = 221 IN = 000000280b6162636465666768696a6b6c6d6e6f707172737475767778797a41420000000000000000000000 CT = 98f720a10212103d0f87ef434cf92000a8449c00fdfe9f61006f13558b2f38b8e1956a8e613477edefc59784 TAG = 92c27399431a38e15dc6ed72d0c25732 KEY = cff80b763e4901929b8799656763e132d034ba9a073bef211d4a759693a961c6b97dac140e6612ce1b0fac7a10d0a10d8277cec0878c81bf181ea66728f29b0d SEQUENCE_NUMBER = 173 IN = 000000280a6162636465666768696a6b6c6d6e6f707172737475767778797a41424300000000000000000000 CT = 0dcb2e7e213ed8c9d380134d94992f50287ff485254d0d066ab47c06499847d8588914bf83163ea2f92d480c TAG = cc0a9ee25ef053e75409b1f65d76618e KEY = 570216cefc554a08864362d11a0df5fb80cc8a7d72e4934e3dfa45cd8862411d7cf2b1a07231264b6a953d3fe5cf0871192d41a4514558c1c169226160316306 SEQUENCE_NUMBER = 77 IN = 00000028096162636465666768696a6b6c6d6e6f707172737475767778797a41424344000000000000000000 CT = 96e568fda7a734f57c1da802bb81e517db255885a7270987e3fa38e0f279d072b9ef99cd25de1af7e871ab41 TAG = aeb507091dab6999308d81b18854e144 KEY = 11353b93163bcdc55f3f53373a95760a458a036c18b70f4cc7916b6f48ff686b29ea0def8d5a1fc52b4e30407edd25e2c3baf6b24fa9f585d141aabc2e19d832 SEQUENCE_NUMBER = 165 IN = 00000028086162636465666768696a6b6c6d6e6f707172737475767778797a41424344450000000000000000 CT = 3f70cb60c11c579b9a8e254a70b80a6f21ae42ab41db8123e9285b0e0dd300cc69e251fd10821dd909d23e0b TAG = badf5fed288cf6657cff798ff252c85c KEY = f690749ae24d2d5e5710a46b2d3a6eb929bd0cd9ebd501b7760191dd104dc34d1787205f7da01f279913703a8ab6813f8d265c2b2e93e35cf81c750df3d41aa4 SEQUENCE_NUMBER = 254 IN = 00000028076162636465666768696a6b6c6d6e6f707172737475767778797a41424344454600000000000000 CT = 1bd7494c9f159342b1eb72ec456ccd2a81d62e77befcd8f86d3132c625db3060feb742562bb9b6a48e952df4 TAG = c25f2198717e2fd726dfc00513ce1b9a KEY = 16c94fe1a75e6b0d40747a8afd0f0eb6c93dd4508fbc769d2b1e0c08eafdee3e067498792233dfd1cbcdc21092fb3e992ecff738e02376eda848ad5faba1c263 SEQUENCE_NUMBER = 145 IN = 00000028066162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630000000000000 CT = 07743e9894a44db0f47c3eceaac0e24a166920e97c8ac18633fd0c0aee798f73cff483836241dd2c938bc5c7 TAG = bfdc5f251698843111031c70c46cf7f7 KEY = c8a2dc33fe6b05ee86680255a160df7a73f8290c4cb778e086534aeeac3cdcbb0932b48ba767678b1f896bd16814d365052018af197566c6075f6b39f89a94c9 SEQUENCE_NUMBER = 78 IN = 00000028056162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630310000000000 CT = a40c4541268a28eeec6818f369c2887eb3472ab9c7f381c8cc896aef25692a7874c2ea1d6a014b04c2b9d03e TAG = e45d5cb5c3815a851d55d0426cb23477 KEY = 1b92da5305b9a1e7234a2d6eca68511dc97fe79fdc7450454dc2313de8f06e068445fa61e14faa1fce49e527943c67475e10e9918f54d410d7ca507076231518 SEQUENCE_NUMBER = 189 IN = 00000028046162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630313200000000 CT = c12861016065604ee867c2b71e8f09bd0cf03b55ca477ca204cb5c1607733e9c651861944438d0b36cef247a TAG = f9af9a7ebecddf168d04f52218763aa7 KEY = aa3f42ae78356f6529dc4eafbf3dd7aabfa6921188627e6b31f39fc4930b2c7f5f13cfea36e47000a59897a2aafde1ae53590a913dc90434d0a18bf1c39f15ee SEQUENCE_NUMBER = 62 IN = 000000300b6162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132330000000000000000000000 CT = 54a9962b5f227c41bdcd901279f2db09e91bf4f1320ae053f6b2625abdc06f12774d759bc1998d42799ef5656f964502e9509dbf TAG = 65b3b25f3f1bef915414b8348b2c8d5b KEY = e8fca7c957865ae62032c6de787488afb071a691cadf0a8c8d40562cbf80b6513c791a96791f001a2543930998816ba9b44413afe49cbd1695dadee2aec06965 SEQUENCE_NUMBER = 158 IN = 000000300a6162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333400000000000000000000 CT = ce31226c64cc9f72745d09df797884651a5946842f47a7ecafea736bf458f52bed38450a8f8521c279fa00eace3af900d68d56b7 TAG = 3762da294869a8b6b2300d0f19527c42 KEY = b21cd69cb3c867e3ce049c7f2584ad26d021ca0f2e94552425f264c442ab6276f2f86509da3bd7e17c5112275d6371cd2a60f490d296db84a6f79608497bfe1a SEQUENCE_NUMBER = 125 IN = 00000030096162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435000000000000000000 CT = fb882b59236f5d4f52b6f11b16b60b1c309d0a2eed260475703aa55baa04ac050e8ef46c25cfdc618381e0ec5babddb3bac43beb TAG = 9249fec7f5c071a24a896c4c004c6e86 KEY = 542f6b64b56093ac155c4302174c1dbc69b28b5380297a05b66d2b4812e78c1f8bf504545b80d18e3dacb49d1dac9c3d2a02368b703365a517e4aadbf6f8d670 SEQUENCE_NUMBER = 99 IN = 00000030086162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435360000000000000000 CT = 779ddcecbd4aa16a9e6f2cbd23bd7dd03f4bdff66a5eac48172b9d5973f5cbc822ce9ed5ac09410297538265c9ffa3b44255ab84 TAG = 62a287ea3a6352f654eb126fd982cdf5 KEY = 12d33230a04520cdd8370e10a82ac97c66a543db2f170b8fbd5651b9d8c340f9e4f82621e365a37fd410e746c652961fad19f262a249d1bd4855d70206fed407 SEQUENCE_NUMBER = 237 IN = 00000030076162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363700000000000000 CT = ca9d827499866f9942bee540624aba657afe3776d80da0505a15dd9ddca46eabb5c8383039a485f418049135e24e4ca484604f0f TAG = 5155e0ae129d8855d7b7c0ac56c547b6 KEY = 9221b183ce2915a6b6e5d34e1e5cc0299f61a1e757e6e51dadf93bfac086a49bd8507916761b3f69cb3923f920885400256e6d356fc13878175d549492775c62 SEQUENCE_NUMBER = 138 IN = 00000030066162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738000000000000 CT = 0199593a687e852219b18a1325bc32b4e697e33888b56687f013e8b0b487215583e8cf6951d84c8559f7c53a753d8f9c89e19529 TAG = 9f5032a30e40cc2da4993976af9954b6 KEY = f3237fb44613c2a6a1db060a3fd25118fff04db48d4d02088e33ca760e030554a8a762c6054c527ff3770ed155ce28dd5cb74e8ea45865f45f1c483817ee6ec5 SEQUENCE_NUMBER = 187 IN = 00000030056162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738390000000000 CT = 5b15b628f774cdcbfb83b4ee6448139e1efe320c108a42be0526c33b7cf2b29f44e0cc0258126acf1e2f243a850c843361bd20eb TAG = f99defa15dcabe76dbf13c2f643694d9 KEY = 7497bd5af9e8e9115533233d4f2fec5ae687473504b172a2da54eefefbf063860e2af83a1fa6a7ccbb02c49cef7d5c063b2bbc807c51f9f605cdea2678bf8478 SEQUENCE_NUMBER = 218 IN = 00000030046162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738396100000000 CT = a6148988572c42545bff1c45aa3a4340492e004b81cbbf1897ff876d8306f211edaddf60fd97b539261527080b9afa4a14282043 TAG = f507d8d51b57f41afb9c69780251b20f KEY = 8bca240f2520e87d0211bae810e04c2e69ca38d1dd44213e7277f6c9dfa15aa585520a4f288a30aef91a97a0c02caec7cc0fc2dba66162406cadf65e85d8f3af SEQUENCE_NUMBER = 59 IN = 000000380b6162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961620000000000000000000000 CT = 270fea0aa9e530a49aff4acda9d5c1954c3153f2184ee80cf80f959bf1146c0b66e38754733304194e297712a6174fc6344f4448bc3dbd2a88266d71 TAG = bed23e779e7e238854be5f62fe751780 KEY = 843c5d6c6d26e92c34391bd5b7c89cd612d15a88ed667f59040dcb1afe0f736b7357017d9b82f9b63c8e01bc6d9b842b9a69241c5b3c063cb695978c5f33af32 SEQUENCE_NUMBER = 156 IN = 000000380a6162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961626300000000000000000000 CT = f29ec1fb4e72c9c261bee5855ba5e1c6e2a63670f891cfd175065e6674494870b7a1a5944f328407c559a0ce7f318630729708e7cd42714a4fae2910 TAG = 8c88ab81fbc1009d9714d8e111c5b9ac KEY = 6c7841f1605b3944ad68ec2eba5f0d57882b7dd004a9c788d6134b56b0704a74e131eb4943e0a61b0fa8a82236901576a0699e83c803f95a767cbef53848baac SEQUENCE_NUMBER = 0 IN = 00000038096162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961626364000000000000000000 CT = b1d5d1e5d77fb49ac824463235901289e1658ac30f801ef96bfca359473f00af65ec2cdc5184896bcd2234aa7064e468b728d91aa30ead75c0af5bbc TAG = 0d59f94c58537d96078ff4e6d5f08794 ring-0.16.9/tests/aead_chacha20_poly1305_tests.txt000064400000000000000000001774061352416253600200060ustar0000000000000000# Test vector from RFC 7539 Section 2.8.1. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = 070000004041424344454647 IN = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it." AD = 50515253c0c1c2c3c4c5c6c7 CT = d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116 TAG = 1ae10b594f09e26a7e902ecbd0600691 # Test padding AD with 15 zeros in the tag calculation. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = 070000004041424344454647 IN = "123456789abcdef0" AD = "1" CT = ae49da6934cb77822c83ed9852e46c9e TAG = dac9c841c168379dcf8f2bb8e22d6da2 # Test padding IN with 15 zeros in the tag calculation. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = 070000004041424344454647 IN = "1" AD = "123456789abcdef0" CT = ae TAG = 3ed2f824f901a8994052f852127c196a # Test padding AD with 1 zero in the tag calculation. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = 070000004041424344454647 IN = "123456789abcdef0" AD = "123456789abcdef" CT = ae49da6934cb77822c83ed9852e46c9e TAG = 2e9c9b1689adb5ec444002eb920efb66 # Test padding IN with 1 zero in the tag calculation. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = 070000004041424344454647 IN = "123456789abcdef" AD = "123456789abcdef0" CT = ae49da6934cb77822c83ed9852e46c TAG = 05b2937f8bbc64fed21f0fb74cd7147c # Test maximal nonce value. KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f NONCE = ffffffffffffffffffffffff IN = "123456789abcdef0" AD = "123456789abcdef0" CT = e275aeb341e1fc9a70c4fd4496fc7cdb TAG = 41acd0560ea6843d3e5d4e5babf6e946 # Test 64-bit nonce value. This is a copy of a test below with the leading # zeros in the nonce removed. KEY = bcb2639bf989c6251b29bf38d39a9bdce7c55f4b2ac12a39c8a37b5d0a5cc2b5 NONCE = 1e8b4c510f5ca083 IN = 8c8419bc27 AD = 34ab88c265 CT = 1a7c2f33f5 TAG = 2a63876a887f4f080c9df418813fc1fd FAILS = WRONG_NONCE_LENGTH # Test vectors from chacha20_poly1305_deprecated_tests.txt, modified for the # RFC 7539 AEAD construction. KEY = 9a97f65b9b4c721b960a672145fca8d4e32e67f9111ea979ce9c4826806aeee6 NONCE = 000000003de9c0da2bd7f91e IN = "" AD = "" CT = "" TAG = 5a6e21f4ba6dbee57380e79e79c30def KEY = bcb2639bf989c6251b29bf38d39a9bdce7c55f4b2ac12a39c8a37b5d0a5cc2b5 NONCE = 000000001e8b4c510f5ca083 IN = 8c8419bc27 AD = 34ab88c265 CT = 1a7c2f33f5 TAG = 2a63876a887f4f080c9df418813fc1fd KEY = 4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd1100a1007 NONCE = 00000000cd7cf67be39c794a IN = 86d09974840bded2a5ca AD = 87e229d4500845a079c0 CT = e3e446f7ede9a19b62a4 TAG = 356d9eda66d08016b853d87c08b5c1b3 KEY = 422a5355b56dcf2b436aa8152858106a88d9ba23cdfe087b5e74e817a52388b3 NONCE = 000000001d12d6d91848f2ea IN = 537a645387f22d6f6dbbea568d3feb AD = bef267c99aec8af56bc238612bfea6 CT = 281a366705c5a24b94e56146681e44 TAG = 59143dab187449060a3ec2a1681613cc KEY = ec7b864a078c3d05d970b6ea3ba6d33d6bb73dfa64c622a4727a96ede876f685 NONCE = 000000002bca0e59e39508d3 IN = b76733895c871edd728a45ed1a21f15a9597d49d AD = cc1243ea54272db602fb0853c8e7027c56338b6c CT = 1fb9b2958fce47a5cada9d895fbb0c00d3569858 TAG = 219b4252deb16a43b292165aabc5d5ce KEY = 2c4c0fdb611df2d4d5e7898c6af0022795364adb8749155e2c68776a090e7d5c NONCE = 0000000013ce7382734c4a71 IN = 0dc6ff21a346e1337dd0db81d8f7d9f6fd1864418b98aadcdb AD = 0115edcb176ab8bfa947d1f7c3a86a845d310bf6706c59a8f9 CT = dad65e4244a1a17ce59d88b00af4f7434bd7830ffdd4c5558f TAG = 7ae32f186cf9ec59b41b764b34307d4f KEY = c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865 NONCE = 000000005d9856060c54ab06 IN = f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e AD = 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51 CT = b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36 TAG = d3f7b9c295f374651a84138648a5919a KEY = a8b9766f404dea8cf7d7dfaf5822f53df9ccd092e332a57f007b301b507d5e14 NONCE = 00000000c7f2f7a233104a2d IN = 4d6faeaee39179a7c892faae3719656cc614c7e6ecd8fcb570a3b82c4dace969090338 AD = c6d83b6a56408a356e68d0494d4eff150530b09551d008373d6dee2b8d6b5619d67fdb CT = a15443f083316eef627a371f4c9ac654d0dd75255d8a303125e9f51af4233ff4ceb7fe TAG = 63c2b4e0973096299488b0a66ffa54c1 KEY = 5e8d0e5f1467f7a750c55144d0c670f7d91075f386795b230c9bf1c04ba250bc NONCE = 0000000088049f44ba61b88f IN = 51a1eebcc348e0582196a0bce16ed1f8ac2e91c3e8a690e04a9f4b5cf63313d7ad08d1efbff85c89 AD = 5d09bf0be90026f9fc51f73418d6d864b6d197ea030b3de072bd2c2f5cab5860a342abbd29dba9dc CT = 35aa4bd4537aa611fd7578fc227df50ebcb00c692a1cf6f02e50ed9270bd93af3bc68f4c75b96638 TAG = 4461139c4055333106cf7f7556fd4171 KEY = 21a9f07ec891d488805e9b92bb1b2286f3f0410c323b07fee1dc6f7379e22e48 NONCE = 00000000066215be6567377a IN = c1b0affaf2b8d7ef51cca9aacf7969f92f928c2e3cc7db2e15f47ee1f65023910d09f209d007b7436ee898133d AD = dfdfdf4d3a68b47ad0d48828dc17b2585da9c81c3a8d71d826b5fa8020fee002397e91fc9658e9d61d728b93eb CT = 8ff4ceb600e7d45696d02467f8e30df0d33864a040a41ffb9e4c2da09b92e88b6f6b850e9f7258d827b9aaf346 TAG = b2ad07b86aca1b3ab34033c12d6a08cc KEY = 54c93db9aa0e00d10b45041c7a7e41ee9f90ab78ae4c1bba18d673c3b370abde NONCE = 000000003f2d44e7b352360f IN = 1241e7d6fbe5eef5d8af9c2fb8b516e0f1dd49aa4ebe5491205194fe5aea3704efaf30d392f44cc99e0925b84460d4873344 AD = f1d1b08dd6fe96c46578c1d1ad38881840b10cb5eae41e5f05fe5287223fa72242aea48cb374a80be937b541f9381efa66bb CT = 027b86865b80b4c4da823a7d3dbcf5845bf57d58ee334eb357e82369cc628979e2947830d9d4817efd3d0bc4779f0b388943 TAG = 6de01091d749f189c4e25aa315b31495 KEY = 808e0e73e9bcd274d4c6f65df2fe957822a602f039d4752616ba29a28926ef4a NONCE = 000000001b9cd73d2fc3cb8e IN = 3436c7b5be2394af7e88320c82326a6db37887ff9de41961c7d654dd22dd1f7d40444d48f5c663b86ff41f3e15b5c8ca1337f97635858f AD = d57cfbe5f2538044282e53b2f0bb4e86ea2233041fb36adb8338ded092148f8c2e894ef8766a7ec2dd02c6ac5dbab0c3703c5e9119e37c CT = 9b950b3caf7d25eaf5fca6fa3fe12ed077d80dcd5579851233c766bb8bb613ec91d925a939bb52fb88d5eda803cfe2a8cda2e055b962fd TAG = 0887ec7d5e1a4e532746ec247a30825a KEY = 4adfe1a26c5636536cd7cb72aa5bded0b1aa64487ad0e4078f311e8782768e97 NONCE = 00000000d69e54badec11560 IN = 19b3f9411ce875fcb684cbdc07938c4c1347e164f9640d37b22f975b4b9a373c4302ae0e7dfdeba1e0d00ced446e338f4c5bc01b4becef5115825276 AD = bda1b0f6c2f4eb8121dcbd2eebd91a03ae1d6e0523b9b6f34b6f16ceca0d086654fb0552bfd5c8e1887730e1449ea02d7f647ae835bc2dab4bbc65b9 CT = ea765a829d961e08bacaed801237ef4067df38ad3737b7c6de4db587a102a86fc4abbaabea0ee97c95ca7f571c7bab6f38cbae60cd6e6a4ce3c7a320 TAG = a27f18846f5a4f7fcc724656c91cf4f3 KEY = eb3db86c14b7cc2e494345d0dfb4841bbd3aa1e2bc640cca0c6c405520685639 NONCE = 0000000088b54b28d6da8c81 IN = f75c0a357271430b1ecff07a307b6c29325c6e66935046704a19845e629f87a9e3b8aa6c1df55dd426a487d533bb333e46f0d3418464ac1bef059231f8e87e6284 AD = 34b08bb0df821c573dcb56f5b8b4a9920465067f3b5bf3e3254ea1da1a7fc9847fd38bdfe6b30927945263a91fa288c7cf1bee0fddb0fadf5948c5d83eb4623575 CT = 146ec84f5dc1c9fe9de3307a9182dbaa75965bf85f5e64563e68d039a5b659aa8863b89228edb93ff3d8c3323ab0d03300476aa4aca206d4626a6b269b2078912d TAG = 854cbb42bade86a09597482c8604681a KEY = dd5b49b5953e04d926d664da3b65ebcffbbf06abbe93a3819dfc1abbecbaab13 NONCE = 00000000c5c8009459b9e31a IN = f21f6706a4dc33a361362c214defd56d353bcb29811e5819ab3c5c2c13950c7aa0000b9d1fe69bb46454514dcce88a4a5eda097c281b81e51d6a4dba47c80326ba6cea8e2bab AD = fe6f4cbb00794adea59e9de8b03c7fdf482e46f6c47a35f96997669c735ed5e729a49416b42468777e6a8d7aa173c18b8177418ded600124a98cbb65489f9c24a04f1e7127ce CT = 911ead61b2aa81d00c5eff53aeea3ab713709ed571765890d558fb59d3993b45f598a39e5eff4be844c4d4bd1ef9622e60412b21140007d54dcf31b2c0e3e98cf33a00fd27f0 TAG = 2865d2a26f413cc92416340f9491e1be KEY = 3b319e40148a67dc0bb19271d9272b327bc5eee087173d3d134ad56c8c7dc020 NONCE = 00000000ce5cf6fef84d0010 IN = 27b5627b17a2de31ad00fc2ecb347da0a399bb75cc6eadd4d6ee02de8fbd6a2168d4763ba9368ba982e97a2db8126df0343cdad06d2bc7d7e12eec731d130f8b8745c1954bfd1d717b4ea2 AD = a026b6638f2939ec9cc28d935fb7113157f3b5b7e26c12f8f25b36412b0cd560b7f11b62788a76bd171342e2ae858bcecb8266ff8482bbaed593afe818b9829e05e8e2b281ae7799580142 CT = 368fb69892447b75778f1c5236e1e9d5d89255c3d68d565a5bba4f524d6ad27de13087f301e2ef4c08f5e2c6128b1d3e26de845c4ac4869e4c8bd8858ad0d26dec3b5d61a9e3666a3911ba TAG = 1414f1b91966340417c38226ccca9d3d KEY = 43bf97407a82d0f684bb85342380d66b85fcc81c3e22f1c0d972cd5bfdf407f4 NONCE = 000000008b6ba494c540fba4 IN = 4b4c7e292a357f56fdf567c32fc0f33608110d7ce5c69112987d7b5a0bd46d8627a721b0aed070b54ea9726084188c518cba829f3920365afc9382c6a5eb0dd332b84612366735be2479b63c9efc7ff5 AD = 1e0acf4070e8d6758b60d81b6d289a4ecdc30e3de4f9090c13691d5b93d5bbcef984f90956de53c5cf44be6c70440661fa58e65dec2734ff51d6d03f57bddda1f47807247e3194e2f7ddd5f3cafd250f CT = d0076c88ad4bc12d77eb8ae8d9b5bf3a2c5888a8d4c15297b38ece5d64f673191dc81547240a0cbe066c9c563f5c3424809971b5a07dcc70b107305561ce85aecb0b0ea0e8b4ff4d1e4f84836955a945 TAG = c5ca34599c6a8b357c6723ee12b24da8 KEY = 12fc0bc94104ed8150bde1e56856ce3c57cd1cf633954d22552140e1f4e7c65d NONCE = 00000000d3875d1b6c808353 IN = 24592082d6e73eb65c409b26ceae032e57f6877514947fc45eb007b8a6034494dde5563ac586ea081dc12fa6cda32266be858e4748be40bb20f71320711bf84c3f0e2783a63ad6e25a63b44c373a99af845cdf452c AD = b8be08463e84a909d071f5ff87213391b7da889dc56fd2f1e3cf86a0a03e2c8eaa2f539bf73f90f5298c26f27ef4a673a12784833acb4d0861562142c974ee37b09ae7708a19f14d1ad8c402bd1ecf5ea280fab280 CT = 9d9ae6328711fb897a88462d20b8aa1b278134cdf7b23e1f1c809fa408b68a7bfc2be61a790008edaa98823381f45ae65f71042689d88acfa5f63332f0fba737c4772c972eba266640056452903d6522cefd3f264e TAG = e84211b6cfd43543f8b1b4db07a494d1 KEY = 7b6300f7dc21c9fddeaa71f439d53b553a7bf3e69ff515b5cb6495d652a0f99c NONCE = 0000000040b32e3fdc646453 IN = 572f60d98c8becc8ba80dd6b8d2d0f7b7bbfd7e4abc235f374abd44d9035c7650a79d1dd545fa2f6fb0b5eba271779913e5c5eb450528e4128909a96d11a652bf3f7ae9d0d17adbf612ec9ca32e73ef6e87d7f4e21fe3412ce14 AD = 9ff377545a35cf1bfb77c734ad900c703aee6c3174fdb3736664863036a3a9d09163c2992f093e2408911b8751f001e493decc41e4eeeed04f698b6daed48452a7e1a74ec3b4f3dcf2151ca249fa568aa084c8428a41f20be5fd CT = 229da76844426639e2fd3ef253a195e0a93f08452ba37219b6773f103134f3f87b1345f9b4bf8cfc11277c311780a2b6e19a363b6ac2efe6c4cc54a39b144e29c94b9ebbde6fd094c30f59d1b770ebf9fcad2a5c695dc003bf51 TAG = 55e025a1eb87bc84d4be00c775c92ad2 KEY = 4aeb62f024e187606ee7cc9f5865c391c43df1963f459c87ba00e44bb163a866 NONCE = 000000009559bd08718b75af IN = c5d586ceece6f41812c969bcf1e727fe6ff8d1ae8c8c52367c612caa7cdf50e0662f5dffc5ea7d3cc39400dfe3dc1897905f6490fd7747b5f5f9842739c67d07ce7c339a5b3997a7fb4cd0d8e4817ff8916b251c11ef919167f858e41504b9 AD = 51f5b503b73a5de8b96534c2a3f2d859ece0bd063ea6dfa486a7eec99f6c020983f7148cccb86202cf9685cc1cc266930f04e536ad8bc26094252baa4606d883bd2aeed6b430152202e9b6cc797ff24fc365315ed67391374c1357c9a845f2 CT = 252ea42b6e5740306816974a4fe67b66e793ebe0914778ef485d55288eb6c9c45fa34ac853dc7a39252520514c3cb34c72b973b14b32bc257687d398f36f64cc2a668faffa7305ab240171343b5f9f49b6c2197e4fbe187b10540d7cdcfa37 TAG = ab1d8a5a1f3eda9b5609c0028737477f KEY = 9a19e72f005cae1ae78b8e350d7aabe59fc8845999e8c52fad545b942c225eaf NONCE = 00000000d9dae2ea8d2ffc31 IN = 2110378d856ded07eb2be8e8f43308e0c75bc8a3fcc7b1773b0725b7de49f6a166c4528e64120bdf7c9776615d3ce6feeb03de964a7b919206a77392f80437faceb6745845cafc166e1c13b68e70ca2a1d00c71737b8fcbbbd50902565c32159e05fcd23 AD = 1cd73b72c4e103afbefd7c777e0480f3f5e68c60b85bd2e71ef5caebb175d7fc6535d39f38f92c24f2eb0fe97d878ed3d5967c0bb4394a5d41f7d34cda6e1523d3848f049cde554a7d31e1afeab5d3e6150f85858335cbd28c8a7f87d528058df50eea06 CT = 5f009fbce4ec8e4ca9d8d42258b1a3e4e920b2fbad33d5e9f07557d9595e841025193b521ba440110dd83958e8ee30219d952b418e98a6c624894aa248aedc0678f2d263e7bfaf54ca379fef6c5d2f7ac422ea4b4369408b82d6225a7a2cf9a9f46fd4ef TAG = 1c6bdff7d8b9554dc7bf40e50b37d352 KEY = ba1d0b3329ecc009f1da0fab4c854b00ad944870fdca561838e38bad364da507 NONCE = 000000008a81c92b37221f2f IN = 6289944ffa3ccea4bf25cd601b271f64e6deb0eba77d65efb4d69ca93e01996e4727168b6f74f3ccf17bd44715f23ceb8fc030c0e035e77f53263db025021fd2d04b87a1b54b12229c5e860481452a80a125cb0693a2ba1b47e28ee7cbaf9e683c178232c7f6d34f97 AD = e57883961b8d041d9b9eeaddcfd61fa9f59213f66571fadffffdd1498b9b014f1ef2e7e56c3044d7f9fa7a1403a1169e86430a2a782137093f5456e142aad03a5f7a66d38009dd01b7fc02c9cf61642dedaf7cc8d46066c281ee17780674c3a36eae66c58d2d765075 CT = 9c44d9135db0dbf81c862c1f69bec55a279794cdd29a58e61909aa29ec4c120c9c5a508d856b9e56138095714a4bb58402a1ad06774cf4ecdf2273839c0007cb88b5444b25c76f6d2424281101d043fc6369ebb3b2ff63cdb0f11a6ea1b8a7dafc80cdaef2813fa661 TAG = 689a141bc11159d306dad7a4ecf6ad9d KEY = 0cf8c73a6cffc1b8b2f5d320da1d859d314374e4a9468db7fd42c8d270b7613a NONCE = 000000003c4c6f0281841aff IN = 4434728d234603c916e2faa06b25d83bad3348990ecde2344368d1a7af1309bd04251bb2e0b72044948f8dea33cce2618283b6af742073a9586b26c1089335fe735141e099785a1235810a3a67ff309e2f0ce68220ba0077ad1a5dc1a4aef898a3b9ff8f5ad7fe60149bd0bd6d83 AD = a38d09a4f1c9241623c639b7688d8d35345ea5824080c9d74e4352919db63c74d318f19e1cbb9b14eebd7c74b0ad0119247651911f3551583e749ea50ff648858dcaaa789b7419d9e93a5bf6c8167188dbac2f36804380db325201982b8b06597efeb7684546b272642941591e92 CT = bdfbfea261b1f4c134445321db9e6e40476e2dd2f4e4dbe86e31d6a116d25830762e065b07b11a3799aab93a94b4f98c31c0faeb77ec52c02048e9579257e67f5a6bae9bc65210c25b37fc16ee93bda88fd5f30a533e470b6188c6ce5739fa3e90f77120b490fc1027964f277f40 TAG = 780cc54bb6f1c9b78545c1562cd9d550 KEY = 69f4e5788d486a75adf9207df1bd262dd2fe3dd3a0236420390d16e2a3040466 NONCE = 000000006255bf5c71bb27d1 IN = c15048ca2941ef9600e767a5045aa98ac615225b805a9fbda3ac6301cd5a66aef611400fa3bc04838ead9924d382bef8251a47f1e487d2f3ca4bccd3476a6ca7f13e94fd639a259ef23cc2f8b8d248a471d30ac9219631c3e6985100dc45e0b59b8fc62046309165ddb6f092da3a4f067c8a44 AD = 0c83039504c8464b49d63b7f944802f0d39c85e9f3745e250f10119fa2c960490f75ae4dced8503b156d072a69f20400e9494ab2fa58446c255d82ff0be4b7e43046580bc1cf34060c6f076c72ea455c3687381a3b908e152b10c95c7b94155b0b4b303b7764a8a27d1db0a885f1040d5dbcc3 CT = f0bb2b73d94f2a7cef70fe77e054f206998eacf2b86c05c4fa3f40f2b8cebf034fe17bcbee4dea821f51c18c0aa85b160f8508bd1dc455cc7f49668b1fb25557cdae147bf2399e07fcacaca18eccded741e026ef25365a6b0f44a6b3dd975ee6bb580f5fccd040b73c18b0fbf8f63199ba10fe TAG = 2ecccea4607d14dbb2d2475792aeb468 KEY = ad7b9409147a896648a2a2fe2128f79022a70d96dc482730cd85c70db492b638 NONCE = 00000000a28a6dedf3f2b01a IN = 791d293ff0a3b8510b4d494b30f50b38a01638bf130e58c7601904f12cb8900871e8cf3d50abd4d34fda122c76dfee5b7f82cd6e8590647535c915ae08714e427da52f80aef09f40040036034ca52718ea68313c534e7a045cd51745ec52f2e1b59463db07de7ca401c6f6453841d247f370341b2dbc1212 AD = 9a6defddb9b8d5c24a26dd8096f5b8c3af7a89e1f7d886f560fabbe64f14db838d6eb9d6879f4f0b769fe1f9eebf67fcd47b6f9ceb4840b2dba7587e98dc5cae186ef2a0f8601060e8058d9dda812d91387c583da701d2ba3347f285c5d44385a2b0bf07150cbc95e7fcfa8ae07132849a023c98817c03d2 CT = c2f109d6d94f77a7289c8a2ab33bc6a98d976554721b0c726cbf4121069473e62ba36e7090e02414f3edc25c5d83ac80b49ad528cda1e3ad815b5a8c8ae9ad0753de725319df236983abd3f69ab4465d9b806c075b1896d40bdba72d73ba84c4a530896eb94ffccf5fb67eb59119e66a1861872218f928cf TAG = 17ec6cf2b172f01e3c456ad047196805 KEY = 48470da98228c9b53f58747673504f74ca1737d7d4bb6dbf7c0cba6ca42f80b9 NONCE = 0000000056fb4923a97e9320 IN = bc6626d651e2b237f22ee51608ddcffeba5f31c26df72f443f701f2b085d6f34f806e29673584cb21522179edb62a82427d946acabce065b88b2878e9eb87ed1004e55ef58f51ec46375ac542c5782725ff013136cb506fcf99496e13fcd224b8a74a971cc8ddb8b393ccc6ac910bd1906ea9f2ed8a5d066dc639c20cd AD = df8ab634d3dca14e2e091b15ecc78f91e229a1a13cba5edd6526d182525ec575aa45bc70fb6193ffcd59bad3c347159099c4f139c323c30a230753d070018786b2e59b758dd4a97d1a88e8f672092bef780b451fd66ba7431cbb5660ea7816cdf26e19a6ebb9aadc3088e6923f29f53f877a6758068f79a6f2a182b4bf CT = a62e313ecf258cc9087cbb94fcc12643eb722d255c3f98c39f130e10058a375f0809662442c7b18044feb1602d89be40facae8e89ca967015f0b7f8c2e4e4a3855dbb46a066e49abf9cef67e6036400c8ff46b241fc99ba1974ba3ba6ea20dc52ec6753f6fc7697adbccd02b0bbea1df8352629b03b43cc3d632576787 TAG = d29a8968067aeb457ffc114c3a9efb95 KEY = b62fb85c1decd0faf242ce662140ad1b82975e99a3fa01666cac2385ab91da54 NONCE = 000000002f4a5ca096a4faf8 IN = 03b14f13c0065e4a4421de62ab1d842bffb80f3da30bf47d115c09857f5bdd5756fd7c9ac3d9af1c9fb94f2640f7f4386cfba74db468e5288dbe4dd78bfe4f69e41480ca6138e8beacc6eaa3374157c713cfa900c07dd836eaecc8827fa3e70e052ae09e8473e2ae1a10b1bb669ef60a8dd957f6553daa8114918e17371f2ac327bd AD = cfe3b7ab7550b0e8e2e8235fa0dcef95647ce6814abd3dc3f5a3bd7d6d282504660c34ad8341e4d11402c7d46c83a494d7ddb105e1002979023e0e3dc2978c9ae53e10eb8567e7a02b60e51e945c7040d832ca900d132b4205a35034fed939a1b7965183c25654931a9b744401c4649c945710b0d9733b87451348b32ba81de30ea7 CT = 8965db3d3ae4fb483208f147276e7d81b71a86e7202ffc9b1eaade009bc016838dc09ca4bcf30887b2f4243fbd652cd90ebed1ceef8151ff17ea70518d03b0f2a24960aa7de9b30fa65c2e2d57360061aae6d9376e984e9fcd5e5dd0911a4bc8deca832ffb76f252bd7da523076593ba6b174f7d9fb0377e066ecbb6638036241e86 TAG = 28a5284696ed82714eaa94c9ebe6e815 KEY = de9c657258774d4ebc09d109a0fc79d66493ae578797cac4eb8830a6a4b547e0 NONCE = 00000000b5e35fe3398efa34 IN = 4d68fb683aa4f4c7a16ba1114fc0b1b8d8898610fa2763e435ded8771b3651078bef73d4dfd14e76a34cd5eb9ef4db4ead4da9e83f4ce50fe059977b2d17d687c29335a04d87389d211f8215449749969f7652dc1935a0f9a94538dc81dc9a39af63446a6517609076987920547d0098a9c6766cf5e704883ea32feaea1889b1554b5eb0ce5ecc AD = 436ea5a5fee8293b93e4e8488116c94d3269c19f1d5050def23d280515457b931bbed64a542b317cc5023d648330a4b7adca14dd6f3783207b94f86ccaa0a0ac39b7db00ac87a99e3cd8a764ed9c75da8454479636ab2b29e770b166a5b75cacc425c919bf1ce9ac34afe6b4425c3d9fd2e48bc81e7d15516d60e592bfcc2ebefb660f0995f2b5 CT = 97a97b8f0f5420845ae8d57567f9bba693d30e6db916fad0b971f553ad7d993f806f27ab8b458d8046062ced4778c004b4f958a4436141637c6039963308dea2f54008b7feab79650295ed41bf9e65e1a2d75ab1c7b2a70ebb9e9f38d07a9a672d3e95ea78afe9ac02f2566b48b0251aef6eeeca8bd15bd8d43b559426aa9d15d960ee35cb3edf TAG = 4ef49e8a0c2ef85826d7f03e81c577f2 KEY = 6885bd333c336c7672db8ebdf24c1a1b605c5a4ae279f0f698162f47e6c73401 NONCE = 00000000f0c4a213a6168aab IN = fa905a2bfa5b5bad767239fb070a7bc0b303d1503ecd2b429418cc8feba843e5444ed89022fdb379c3b155a0f9ceab2979000a0f60292a631771f2fde4ef065aa746426609082969530a9c70ad145308c30ba389ea122fd766081511a031ce3a0bd9f9f583c7000b333b79ac004fbde6ec3eb2d905977ff95dcff77858e3c424fe8932a6a12139e6ec8d5e98 AD = 8ded368f919efb522bb6a9ad009e02ffbc6a16536e34d95cdb34f1153d7cb7b0f3c2b13dd05cedae27cfe68ec3aca8047e0930a29c9d0770c1b83c234dcb0385deae7ae85da73a5f8de3dfb28612a001f4e552c4f67ae0e2ec53853289b7017a58591fd6f70b0e954876bb2f7ec33001e298856a64bb16181017ba924648c09fc63c62eff262c80d614679bd CT = 0cb3d6c31e0f4029eca5524f951244df042fc637c4162511fea512a52d3f7581af097eb642e79e48666cb1086edbd38c4777c535a20945fabc23e7c9277e2b960aac46865f1026eb6da82759108b9baece5da930ccfc1052b1656b0eadaa120ed0c45ad04b24ae8cdb22ceab76c5f180b46a392ab45b1b99c612546e6b947f4d5c06ad5abee92ff96345ad43 TAG = fad7d5a5193dfb121c68529ba8c0c35d KEY = fbc978abb1240a6937ccc16735b8d6ed5411cdbc1897214165a174e16f4e699b NONCE = 000000007968379a8ce88117 IN = 1a8196cd4a1389ec916ef8b7da5078a2afa8e9f1081223fa72f6524ac0a1a8019e44a09563a953615587429295052cc904b89f778ef446ed341430d7d8f747cf2db4308478524639f44457253ae5a4451c7efca8ae0b6c5c051aaa781e9c505489b381a6dcba87b157edc7f820a8fbaf2a52e484dc121f33d9d8b9ac59d4901d6ed8996ed4f62d9d4d82274c449cd74efa AD = 3913cd01299b8a4e507f067d887d7e9a6ded16dd9f9bb3115c5779aa14239fd33ee9f25756d45262dc3011069356425b5c81a4729594e17c9747119f81463e85625d5603d05e00f568b0c800bb181eb717be8d7a93166a504ce1bc817e15530c5bd2b3df1d4222245ea78a38bc10f66c5cf68d661503131f11af885c8a910b6dce70bc3a7448dfae00595beb707fe054d3 CT = d152bcb4c24c3711b0fad28548dc4db605bbc89237cdbea7dbf956b8855d1161a0781f27bd56d798141e2ace339955efb98fe05d9b44cd011e645106bf47726183958cb6df34ce5766695f60bc70b6fe0fabb9afa009a8ef043dbf75f861881368fa07726625448fe608d578cdc48277f2dc53eaaf1bdc075269a42f9302a57cad387a82c6969608acacda20e1cac4596c TAG = 96ae06cd7c72456e5568a42317046158 KEY = 77d1a857fbadfe01aba7974eea2dfb3dc7bf41de73686aece403993e5016c714 NONCE = 00000000fdd913a321c40eb0 IN = db8915bfe651e2ecb3ce0b27d99a6bfa7a7c507cfcb2987293018636c365a459c6a138b4428be538413db15bda69e697cbb92b154b7f4d2cbb07965225aa6865d7dcd1ba2c17c484b00b1986fed63e889f25a4966dc3ed4273f1577768f665362d7d3e824484f0dded7f82b8be8797ad951719719365e45abbf76324bc7d657799d4d4f4bb1dba67d96ab1c88519a5bee704f7214814 AD = 3cb2c06c20cb0832bbacebfc205d77393ca1816346ea2681de4d3ab1fadb774ad273e4713290454496f5281ebc65e04cfe84ed37cd0aedc4bbe3decbd8d79d04a4e434876650e0d64309e336bfb10e924066a64acb92260b2dbd96735d03af03909aa6a80a6e89fda81037257aec21fe9be7e91a64e88e0a58fa38ecba4c4c4cffb61958f3c486cbb0b1d0b0014a2d1d3df248eec1ca CT = acb825e6023b44b03b2efc265603e887954e8612b2ee134bdcb61501cfb9492952bf67be597c3a005b09af74d9e421a576d2c65e98104780feab838d8cb1bd135452ea39dc8907a4c1a6a9161805e4fa3e16989e6a418a7eea2582bf895da967028eab7c95d846a6de4b9980785814cf00484baa2f6de609912fff689bce6e854261ffe866bd8e63274605c7c5ad677bd7897ade543e TAG = bcf523a9bcf772e157941753c6d7401e KEY = b7e9b90dc02b5cd6df5df7283ef293ed4dc07513d9e67331b606f4d42dec7d29 NONCE = 00000000a6c191f6d1818f8e IN = 2ada0e3c7ca6db1f780ce8c79472af4e8e951ddc828e0d6e8a67df520638ff5f14a2f95a5e5931749ae2c4e9946ae4d5eb5de42fb5b77d2236e2e2bd817df51be40b1b8a6c21015a7c79fe06dba4a08b34013dfa02747b5f03930268404c455dc54a74d9c6e35485e10026da573cb41cd50b64cfafe4cfcdf3c9684ef877e45d84e22bd5e15fa6c8fd5be921366ff0dc6fe2df45f7252972c9b303 AD = 0f4269ed5ef0bfff7be39946a4e86e8bf79f84b70cd0b14fecb7be3c071316ce86de3d99d6871e0ba5667d9d7bba7dcaba10cb2a36668b6c3e2fb6c102938b75008bb9c213ebf9b85b5e91a802df0d31d7f11d764b2289f6225212694ab6b7c0e3ff36e84245d9f4f43fc5f98e654dea7ba9bd918658879c5bb4a1642af0d83113e3cf935d3c0d5208318f66f654eb17d8c28a602543e77ad3e815 CT = 22586fe7338e99cdaad9f85bd724ba4cfe6249b8a71399f9a3707b5c4323b8d96679568dfc8d230aefb453df596e13eb3e8a439249bd64bc93a58f95089a62b94f6562b821c83d91f56c55147381e9de4beb4ae81bd6fe7caef7e7e9a2078f2fba8f3e70d4910da9accc92b8e81a61b0fefbece4bd89443e66e8ddda8e47a66a62f17fd0e7d0a4852ce1a4d43d72a0b5e8914bbec698f060f2b092 TAG = bd05336ed6426de412aac37661953052 KEY = 6b2cb2678d1102f2fbbd028794a79f14585c223d405e1ae904c0361e9b241e99 NONCE = 000000007b3ae31f8f938251 IN = b3cb745930e05f3ab8c926c0a343a6eb14809fd21b8390a6fcc58adb5579e5432021765b2d249a0ecf6ba678634c4f53f71495865f031ee97aa159f9ead3a3fcb823ee5238bdf12706a9c6137d236e2e7110ce650c321e41daf0afd62bab2a8fe55d7018de49a14efe6d83a15b2f256d595e998d25309f23633360f5745c50c4e5af8ccc9a8a2cb47064105a023e919c7795d2dc331d3f2afb8c42e5c0bcc26d AD = 1c32fd3df22b3e440e2a3c7a7624990194cb16a5f74af36f87fd6ca7d410ce9064316a2d091945deef7d9b35ceec8396069307caced2b80afd7d53ec479c35cedf2dfd4c95c3dd8400f71ad34028c6e4f8681d93d0774064ba38f3fb9b0c1dfa1f5f0c7d20676a5911d999fb6a1d41367a8e99d852bf3d3b7b3f4c233249ed1ca135389a674ff48232ded3f6800a97b6d409c40e6cd70d09bf9d2ad25d9b9485 CT = ef70c7de98ab1d4ad817024a970be463443640eb0cd7ff234bdd00e653074a77a1d5749e698bd526dc709f82df06f4c0e64046b3dc5f3c7044aef53aebb807d32239d0652dd990362c44ec25bf5aeae641e27bf716e0c4a1c9fbd37bbf602bb0d0c35b0638be20dd5d5891d446137e842f92c0ee075c68225e4dbacb63cc6fb32442b4bcda5e62cb500a4df2741a4059034d2ccb71b0b8b0112bf1c4ca6eec74 TAG = d48657033095db3f873c33445fec8d35 KEY = 4dbc80a402c9fceaa755e1105dc49ef6489016776883e06fcf3aed93bf7f6af7 NONCE = 000000002358ae0ce3fb8e9f IN = 197c06403eb896d2fa6465e4d64426d24cc7476aa1ae4127cd2bd8a48ce2c99c16b1cbf3064856e84073b6cf12e7406698ef3dd1240c026cbd1ab04ee603e1e6e735c9b7551fd0d355202b4f64b482dd4a7c7d82c4fe2eb494d0d5e17788982d704c1356c41a94655530deda23118cba281d0f717e149fbeb2c59b22d0c0574c1a2e640afad1a6ceb92e1bf1dde71752a1c991e9a5517fe98688a16b073dbf6884cfde61ac AD = cf6ce7b899fb700a90d2a5466d54d31358ecf0562e02b330a27ba0138006b342b7ed6349d73c4c5c6d29bde75a25089b11dac5b27adea7e7640ca1a7ceb050e3aae84a47e11640a6e485bd54ae9fdb547edc7313d24a0328429fcffd8b18f39880edd616447344ebeec9eadb2dcb1fa7e67179e7f913c194ebd8f5a58aea73b0c5d1133561245b6d9c5cfd8bb0c25b38ffb37db5e2de5cdded6b57355e9d215cb095b8731f CT = aa87f9a83048b6919c8f2b050315db4e2adae4a9c2ca0109b81961b520e63299dcb028cec0b9d3249a945ee67dd029b40f361245c740f004f8cf0d2214fcfa65e6124a3e74b78aa94345c46fdc158d34823ed249ee550431eaae9218367321cdd6e6a477650469bb3cc137a8f48d9cf27934b16703608b383d2145659922fb83bb2e7ee2ef938a90f2ff846a4a949129b1fb74dde55c5ae013c2f285de84f7dac7d1662f23 TAG = 298f84c8312029a7b1f38c5ea6021f57 KEY = 9e4a62016dae4b3223fed1d01d0787e31d30694f79e8142224fe4c4735248a83 NONCE = 00000000263a2fc06a2872e7 IN = 5a46946601f93a0cee5993c69575e599cc24f51aafa2d7c28d816a5b9b4decda2e59c111075fb60a903d701ad2680bb14aeda14af2ae9c07a759d8388b30446f28b85f0a05cd150050bd2e715ff550ebbd24da3ebb1eac15aba23d448659de34be962ab3ab31cb1758db76c468b5bb8ce44b06c4e4db9bd2f0615b1e727f053f6b4ffb6358d248f022bcad6ca973044bed23d3920906a89a9a9c5d8024ec67d7f061f64529a955ce16b3 AD = 4cd65f68f9f88c0516231f2a425c8f8a287de47d409d5ecde3ad151e906b3839fb01bb91a456f20ea9d394d4b06604ab1f9009ef29019af7968d965d1643161ab33a5354cda2fdc9f1d21ec9cb71c325c65964a14f9b26eb16560beb9792075a1597394000fd5f331bd8b7d20d88e5f89cf8d0b33e4e78e4904bb59c9c8d5d31ac86b893e4a0667af1be85fdb77f7ec3e2594a68048d20c2fb9422f5879078772ee26a1c560cbcbb2113 CT = e944bb2ab06d138ad633c16ce82706ecf0ef5d119be1f3460c9ce101d9c4e04ef1677707fca40d1f8ca181e07273707b06624d6d7063c3b7b0bb0151b757b3e5237fb8004c161233d8bc7e5f28ea1c18da1874b3d54c5ad6ff0835eed35c8853704585cf83996e5e7cec68180af414e04f08134d3b0384ebdf0393c9310b55d8698fe10cb362defc0995e9a13b48b42cff61ffd9fe4c3c8c6dab355713b88f6e98a02e7231a0c6644ec4 TAG = 6234e81e089b779d0d509d14e566b5d7 KEY = 18ca3ea3e8baeed1b341189297d33cef7f4e0a2fab40ec3b6bb67385d0969cfe NONCE = 00000000b6aef34c75818e7c IN = ef6d1bb4094782f602fcf41561cba4970679661c63befe35ff2ca7ad1a280bf6b1e7f153fa848edfeffe25153f540b71253e8baba9aeb719a02752cda60ea5938aab339eead5aabf81b19b0fc5c1ed556be6ad8970ea43c303d3046205b12c419dea71c4245cfedd0a31b0f4150b5a9fe80052790188529ab32f5e61d8ccde5973ed30bdf290cbfbd5f073c0c6a020eac0332fced17a9a08cef6f9217bd6bef68c1505d6eed40953e15508d87f08fc AD = f40f03beaa023db6311bad9b4d5d0d66a58d978e0bcbbf78acebde1f4eb9a284095628955a0b15afc454152f962ec3ea2b9a3b089b99658e68ede4dee5acd56672025eb7323bcbc6ba5d91c94310f18c918e3914bbbf869e1b8721476f9def31b9d32c471a54132481aa89f6c735ab193369496d8dbeb49b130d85fbff3f9cb7dccea4c1da7a2846eef5e6929d9009a9149e39c6c8ec150c9ab49a09c18c4749a0a9fcba77057cdea6efd4d142256c CT = c531633c0c98230dcf059c1081d1d69c96bab71c3143ae60f9fc2b9cd18762314496ab6e90bf6796252cb9f667a1f08da47fc2b0eecda813228cae00d4c0d71f5e01b6ce762fa636efffe55d0e89fdc89ba42521cc019ab9d408fcd79c14914e8bbf0ea44d8a1d35743ad628327e432fdcfeb0b6679ddca8c92b998473732abd55dba54eefff83c78488eee5f92b145a74b6866531476fc46279d4fde24d049c1ce2b42358ff3ab2ba3a8866e547af TAG = e3b4192f6e50528c4f4f70267f094c56 KEY = 95fdd2d3d4296069055b6b79e5d1387628254a7be647baafdf99dd8af354d817 NONCE = 00000000cd7ed9e70f608613 IN = 0248284acffa4b2c46636bdf8cc70028dd151a6d8e7a5a5bc2d39acc1020e736885031b252bfe9f96490921f41d1e174bf1ac03707bc2ae5088a1208a7c664583835e8bb93c787b96dea9fc4b884930c57799e7b7a6649c61340376d042b9f5faee8956c70a63cf1cff4fc2c7cb8535c10214e73cec6b79669d824f23ff8c8a2ca1c05974dd6189cfee484d0906df487b6bd85671ce2b23825052e44b84803e2839a96391abc25945cb867b527cdd9b373fbfb83 AD = 24a45a3a0076a5bcfd5afe1c54f7b77496117d29f4c0909f1e6940b81dde3abacb71ec71f0f4db8a7e540bd4c2c60faee21dd3ce72963855be1b0ce54fb20ad82dbc45be20cd6c171e2bebb79e65e7d01567ad0eeb869883e4e814c93688607a12b3b732c1703b09566c308d29ce676a5c762a85700639b70d82aaef408cf98821a372c6a0614a73ba9918a7951ea8b2bb77cd9896d26988086d8586d72edc92af2042ff5e5f1429a22f61065e03cfcd7edc2a93 CT = 40c6318d9e383e107cdd3e1c8951562193c3ef64ee442432a63e2edefc78f32ab07772aeac172cb67ecf4d21f8b448423527bbeb9d8ddd0b46bdb27f74096ceb24e41963b4cdca176676a75bdbe3abc270b349ac0c6cbd9c3a5cd5bce20202fc5cc0c1bdd4fd25e121e0a24bd7bbeb9b19b1912467bf5338ee2ce88aa383c082b42cc399c9654ca325f35523e81438beb3f8926be79c378822d7c8f785614408a5f7cac49e4543188725643e6c1a70b46d0ec400 TAG = 874875c9a0ba3060a0680291c3dc85a2 KEY = 6ae1102f84ed4dc114bb9d63f4dc78d7dbb1ab63f1659dd95f47940a7b7a811f NONCE = 00000000c965d578ba91d227 IN = b82a8a9209618f1f5be9c2c32aba3dc45b4947007b14c851cd694456b303ad59a465662803006705673d6c3e29f1d3510dfc0405463c03414e0e07e359f1f1816c68b2434a19d3eee0464873e23c43f3ab60a3f606a0e5be81e3ab4aa27fb7707a57b949f00d6cd3a11ae4827d4889dd455a0b6d39e99012fd40db23fb50e79e11f8a6451669beb2fbd913effd49ad1b43926311f6e13a6e7a09cf4bebb1c0bf63ce59cd5a08e4b8d8dbf9d002e8a3d9e80c7995bb0b485280 AD = dfd4ac3e80b2904623ff79ea8ee87862268939decf5306c07a175b6b9da0eb13ac209b4d164755929e03240a0fe26599f136fb2afdffd12bb20354aa1d20e5799839abb68ae46d50c8974e13e361d87ef550fe6d82e8b5b172cf5cd08482efdef793ede3530d24667faf3a1e96348867c2942641f4c036981b83f50236b8e8a10b83ebf6909aad0076302f1083f72de4cf4a1a3183fe6ec6bfe2e73e2af8e1e8c9d85079083fd179ccc2ee9ff002f213dbd7333053a46c5e43 CT = a9aeb8f0a2b3ca141ac71a808dcc0c9798ac117c5d2bd09b3cfe622693a9f8ca62e841b58bddb2042f888e3099b53638b88dfc930b7a6ee4272d77e4b1d7e442bab6afbde96ab0b432f0092d9ca50eef42f63c60c09e7b8de019b32ebe4030c37b8183cc1e3b913b0ce4ee4d744398fa03f9af1c070bed8cdafd65b3a84140cb4deadc70184de757332ce3780af84353f540755227e886a8d7ad980f3dd6fd68263d82e93f883381dec888bc9f4f48349aa2b4c342cb9f48c6 TAG = f6dcad5412b95994f5e4d6829c2eba98 KEY = 405bb7b94715b875df068655f00513cb1ae23ffaac977ce273e57d3f83b43663 NONCE = 000000005c6da1259451119a IN = f9f143c0c52c94b4ba7b0608b144156a49e7b5d27c97315743d171911e3645ab7957c80924e3c6b9c22ab7a1cac4b7e9c0de84e49fd5e4a2d1ab51d764fc5670318688ec942f7ab34c331dce8f90fea6972e07f0dadec29d8eb3b7b6521ddd678a6527a962f4d8af78c077e27f7a0b2ef7eabd19e92b7f8c1e8fb166d4763ce9c40c888cf49aa9cdfc3e997c8fe1cce3fe802441bbd698de269ff316f31c196e62d12c6bb5cd93fb3c79ca6369f8c1ac9102daf818975ea7f513bb38576a AD = 6fe6446505677bf08b385e2f6d83ef70e1547712208d9cebc010cba8c16ea4ece058d73c72273eed650afdc9f954f35aa1bdf90f1118b1173368acbc8d38d93ebf85bd30d6dc6d1b90913790c3efa55f34d31531f70c958759b2ba6f956c6fcdd289b58cb4c26e9515bf550f0fd71ab8527f062c9505cbb16e8e037d34de1756bef02a133dbf4a9c00ac03befc3fb7f137af04e12595ce9560f98b612480fcdba3b8be01db56ebec40f9deae532c3b0370b5c23a2a6b02a4de69efa8900c CT = 1a4b073881922c6366680cc9c2a127b26f264148651b29abb0c388cf6c9b1865dba5a991e1f8309efbdb91bce44b278772c58fd41273526c33fec84beb53d1689b9da8483f71be6db73a73417069bb4cd3f195236e8d0a00d124eed3a6b6f89415b19a27fbe35774f6a1a6ee4bd4350b252b975f0db2d2eea82f4836350850d6290901e726e8af13644e2d98bc1d569c20800521e6affe976bd407049a2e6d9dd23f88d52e651391ecd2fc45b864310824aaadfa203762a77c1d64562dae TAG = 90fcc2544880250f1c3abe8a3761ba08 KEY = 8c602bd94c630cd00c7a9c508067a5a9f133d12f06d9f6fe2a7b68dce4786d8a NONCE = 00000000760de0f7b7cb67e2 IN = c3ff559cf1d6ba6c0cc793ca09a0ba573a28359386a6ec93e1bacd8e630209e0b477a20aedec3c9cbf513ee6a1e3887112218d6155b9875f7e6c4bbba2c31972e905d19f529f4f0f9502996199f94f8728ba8d6424bb15f87fcacd88bb42c63fcc513759712bd0172b1e87c9da122f1993ffb7efd3a5c34b240dd3db89dddea36dbeb2836d9f8648f8e7cd428c0f948097af753b35f9876059e7702027bb00dc69071206e785f48fcbf81b39cc0343974ac70784a2e60c0df93b40379bea4ad8cac625 AD = 9e14907c3a8e96c2636db1f3d78eb1f673d6ef043cbbb349467f1fe29bf60f23d5d5d1c3b133a8ad72065d822347541c13d1574baf737eb3cc3382fb479e6d5193b9c8e7d2444c66971ef099dc7f37f6cd97b9f7959d46e2cf25e8a5b3111b4d9e2ef906d905f0ee2d17587f7082d7c8e9a51509bde03d3d64338e1838d71700f1b4fcb100b5e0402969da462f26f974b4f9e766121f8fd54be99fc10beb9a606e13fbb1f960062815d19e67f80093360324013095719273c65542b0e31b1a2a3d928f CT = 2794e6e133f6892f23837fff60cf7c28ee9942f8982ef8089db117903d0143293fdf12ea1cc014bcd8806fb83c19570eed7af522db0de489bbc87133a13434518bcfb9cda4d9f6d832a69209657a447abf8afd816ae15f313c7ea95ec4bc694efc2386cdd8d915dc475e8fadf3421fbb0319a3c0b3b6dfa80ca3bb22c7aab07fe14a3fea5f0aee17ab1302338eeac010a04e505e20096a95f3347dc2b4510f62d6a4c1fae6b36939503a6ac22780a62d72f2fc3849d4ef21267fffdef23196d88fbb9b TAG = 7fa630c9bcb455e89f13d7a99d5e8dbe KEY = bd68ff5eb296c71cfe6bc903c14907f7726bcb1331f0c75f7801cd1b7948f3a1 NONCE = 0000000065a748004b352ba6 IN = 52bf78c00f6e5dca2fc60e2e9a52e827df97808e9cf727773860cafc89f4b64178a19b30b46ed813fe00c8f09b25a6a1b6e350d5b005122934a59bfbd5e6e0c635c84a5226c3f2f7dcf951560f18ac220453d583015fdb2e446c69c6e6fdecf2e595e04fab1b0c506e3c6bd5e4414a35f15021e97f447aa334f54a8f1ef942dec6273511b5668b696fca97188ff15ed84b2f46145cce031c1a7f00bd88bb83d90797edc46161b3fda7a2299173496d73b812139556e8b4eb318078b9eb2ae5046e83b79dd3d45950 AD = 5557b08a5010cbc9f46bb140c2505f68684eb24889324bff44b27234fd7a95a99cfb4ff90a8f9982085b725f78ac42eca6ce7f3314e457dc41f404008681a9d29ba765660de2e05bb679d65b81f5e797d8417b94eb9aabbd0576b5c57f86eae25f6050a7918e4c8021a85b47f7a83b4c8446898441c5cc4e0229776ef3e809cb085d71f3c75ec03378730cb066150f07e60f96aec983c0e7e72bf6bf87ae42228dfda195f97855fcdf4e6d1c4479d978abcfa276d16ed60ecbfbfc664041335ce65a40a2ca3424df CT = a5c8cf42287d4760fca755e2111817b981c47e85b0047de270ec301ca5f7b3679f4749210892b6ea6568f3a6a4344734a0efc0120ffedecf212d55cbcbb67815ac964875af45f735b70092a8f8435f52fc01b981ae971d486026fb69a9c3927acfe1f2eab0340ae95f8dbee41b2548e400805ece191db5fd1f0804053f1dbfaf7f8d6fded3874cb92d99a2729d3faaa60522060cf0b8101b463b3eb35b380fcddb6406c027d73fe701a5090c8dd531c203ce979e26b9ced3431e2b726a7244a20d9377bd62951bf5 TAG = 82c6194de4d27aac4c54b023b9831634 KEY = 934fd043c32d16a88fad01c3506469b077cb79d258b5664fa55ad8521afdcaa2 NONCE = 00000000c7091f6afbbeb360 IN = 2bdd1fc4f011ef97ea52ec643819941c7e0fb39023c2f3c7683804a0ddee14a5d1784a5246966d533b3538edc7d8742d27061c3cab88df0318ab242102de3a54d03632eeb871b72c7e8f8065b49f4a91e95e15f3f46b29fd76b8fcea0d23570c5530e3bbb8a6aafa9ae32c1b3eac653c5ed5fdb2da5a986075808f6385870c85b1913e26042a9d8e78f5bc2ea6de5a64f8aeafa22adcffc7f6932d543c29bb3a04614783f948680e433a71573568d2ce984d249fb4fc06a9f358c76aa3e64a357f4eae924c1356bd5baccf7e0f AD = f737dd85638eb324dd3891219c5eef7c2dd053cfd055d447a411eba304a4b27dce981d112c4540590933c153d603022c91ebd2b4a58069d27e6ca17a462ef822ca41bffa80b43a68b1b564644cb3c5a7f0fddf7a13a30ff24437fddd8ef93c6f6f205d054f81890d982bd4d4ece0b1563677e843fe48c1f54e9a57ed4da66061482712e710a401073be5080d5b8b96525bffa67de5af31d50385fbbf1a87c21bf0e0a1fdff69ec32c7b7103e0b8ee6c844245e0fc84b9f89fcce62966cea68e2871d3b82e8df424c76309fc88d CT = dd13fbf22c8d18354d774bcd18f7eb814e9b528e9e424abc4e3f2463195e8018576565d16ab48845d11c9277f2865ebb4dc412fd5b27078f8325eadf971e6944c66542e34d9dda971e2aba70dbd3e94a1e638d521477a027776b52acf90520ca229ebc760b73128879475d1cbe1f70fc598b549cd92d8a9ac6833e500c138c56474db84cb3d70b7aa4f293a4c2b4d818b0ff9fd85918dc590a12a8c0e375c4d98b7fc87596547eb960676aad5559834588f00f251a9d53f95c47af4df3c4299175d5211779c148cfc988a5e9d9 TAG = aeb0a4eb29886f0a7a12ec0516bd4af5 KEY = f9f6eb9ad736a8f66e7459fef5ec2890188dc26baf34a95f6f0384e79f5c6559 NONCE = 000000007858dfc084fe4b0f IN = a644ca6e7cc076e87eb2929fd257693fce0f6fb64fd632f7f07c648ebd03696c8e262e6a810d7b7c4e5eef8c65b5323c99dbba50a70b4a9e5c2a9e7315973cd67f35d8052ce9a85a206416dd3031929f4f929b13d0a5fb10cb73c65f6c0ace019da146b51c5274a099f44e3669d26add6f2ff081e886f3cf952fe0dbbe6b0534c23e307574bd35fbd657f5fcbd5dc19fb382a1dc0a2dc8285a0350f71554e4c601497749e35567dd4a273cddc9a48ce53a5f1d297fd8baf8d1b9feb35d9151114345abada4d90db947bb9a743c175f5653d1 AD = 2048d1c2ddfb5ec385b201832c7a993f229ba72ec16d6ebf723ef0c5032b9966209a9e8a63151b40412e96b82f86728ea6588c7e8e11ac71cc8eabab8c4b54de866658d9c5011def61fb3dbe4e630158a45ea41a2ed55ebd1efb1abeda7637de6fa5fd2f151c6d2f385bf6cd002ca8b4a2896e0d65944ee913e3c784669dd201b1985ef3577f7f123a5f9bcffa176c8f557c4f729133cac518642f27d9b22ca9b97faaafe5b669a10b79ace4a7d5727df146c77ce681357d69f9c2d65b4401bd73cd113387e3b3a05d897adad7a24c485e7b CT = 4146faffd7313f5d9f625370d20413cc62ab65f4acfa3c7ee1125b937dd7a39f638fc46c8ed004fb525698de5d8620ec153435571817c3de257b0d0e648ebb92940c86a98262d54e764f28cbdd4f7d9bea970291f2110414f62064d7229c6332236c507b3dac742e651d85a2a22fb243c0cc7cc2d016e5bea38f33f9a9ce048944a5fe8b078d71d23168e12dfe5a0f0b829771edc7073fb96032b7be471337a37aca0cf7c0cdd543eed686cd34934717fd79a3f18492eef72f9f450b880aa7e2e1b65e3b04c22e72301338b43aa32ceec2e6 TAG = 61c6d4d6918b04fc1b72a7a0e9a3b799 KEY = 29b19636cdd32507fd98ec4ee26caab1a917646fb8f05b0dc01728a9f4a127f0 NONCE = 0000000006699d245916686d IN = 5fdf913aceab1d6dbaf7d9a29352fa8a3eb22718043a79cffa2fe8c35c820aec7c07644b8785dcf7a433b4189abb257fb12b06fae0662641011a069873c3e3c5ccc78e7358184a62c2005c44b8a92254958eb5ff460d73cd80284d6daba22c3faba046c5426fe8b7cacec64b235a8f8d3e2641e5bc378830594bcfb27c177aea745951ee5780a63705727ef42c4ad3abf556d88e3830f3db6b09e93edd09485cbf907f79de61f8dc5cb5fb7665ffa0ef53cb48702f6a81d8ad421cef20c1dbdf402b8fafed56a5361b2f93f914a2380fdd0557faf1f4de AD = 39116c49cc13adb065b92cb7635f73d5f6bf6b5ccbf72a3f65a5df6bd4a661105015358d9e69f42e98aed795e8161282bc113058b7ef3b9e23fcd8eeab34a392e03f4d6329c112cb968385ec52a7afc98bb8695785af6b27b700973cc952630b7247ce226b4fbb99b8a486370bf6345d4516c52c64e33f407c4f2d1ba90545c88732d98bbd97972ac5e94c694624a9b3782b0099824651cb7567914d25b3e13181a791dbcd40e76e836b3350d310a52151bf835d3c357c9871482c2928e8404c6e533406d4d6fa8f63366f2c4ed828141f1ff00f01a536 CT = 01e237220b619054a1f3670928fe67d40484b5af40fbd04d032500aac5acaa3b4584dd99a58c390627636a50de5d744f76a56a33205f9e3b00e16162eb47ff3333e1e208ca200f1a5338a86e17bd92dd2d16af8bb022a7dc05b923d019e05247f1a0d0b4bfcfce58dd6d83830705707676d55739abee89fcd5cb94b8fde006a5da02df64b00a467f45970b5ca440f22319b9735a55d454b9fba0588fef0c59d3d83823eba6e0601a96e10233826c5adeea6b2a51d386a07a9e047ad405b23d4c3d89f30c31e3199f0c8f927bfac43ceea1f969de0a8c0f TAG = b9fec6da464c7b85b2a4726694562fe9 KEY = bae06b9b5456707551c7b0e207aae02a19b4848ad8ca4ce40705bf8c856a6e52 NONCE = 000000009c27065c3ef2d522 IN = 50cdd88137ff428a88e87b5845be4924f6387537bb5c0b654c80107ab5698db75b2e131848e7aec156d31aed0766d31c379fece4095d38264c6d5945974d25f729c3b0ba11ea853e9cebdb6f03bb670fce08adff74d0a8f02d633fb34e0fb7337a8e66e1c12084d914fb6173b8105684db822752c6751a372bb16690284d661b8b8bc6a6dfbddf45ebc2219596f9f2f878c118df69030de38b4d99dde43b9b9e20a3dab691645dd518342f49b06a0fe0a397adf261e99f07af5b0b3798b1022ba0939c42a54d3b93641cffa3c2e174bce9ab7ad7e7c7924308d1a77a AD = 5d5590db1bd316eb7a0e30e4c7a6dfdbef9d3287fdb8d824389599c3c2ee262b2192eb5b9708e66e22dbc7eca83fa1a995da3ce64c86fe5aa08b826d476dc439497e2d12e2702c63c8d27aa7f09fedee816dc8bffe1351d53271a34d4292b613b7efcedb7e3cf3e6ad389eef12471e9e20e38e7ae22a323abbadfe8f2e84271bffb1819feb4f77b82843cb8757cfae293631bc6d39669107e7015c85d7343ffa6fc1bbe6f5ab4de30cd752a281e03061ea89de2a3f5e90e20da22fd6e8525c100738667f42212b2cf45fcb23bbb54b21c117484b22c6e514685314df CT = 66b7f69ac49fab4e5975aeb6fa9287d8eac02ac312c4de78f77f59da16cbcf87274e66801c4b862c33ea79cdc76528862bb2956c06db8b8acfac4794ebf39e35ac03cc73a4351a4ff762f681a48d6f25cad36e2814c9b5c40b9ae92509e58429106847789454d376836936bebc7a80e6c66e7aa52936d6b361378a41f849ad4e48f9ee2d3e92217a908fa8eb35736ac8ada7d32ae05391f2d807be3512543c36138a5fe660dd4cd4cd184bb43b6ba6bc0bae634e2fa9669304cd510ed5103f630068ff76d3375738de60a381842b421477e25a490cdd6894b2704125 TAG = 94118ccc68de1921d480aab43d1ef0d1 KEY = 2cb374cb048c168f2e43597f028d9e73cade1b458284ffc260d4fc6b9011c414 NONCE = 000000009fb909169bc9f4e9 IN = 39eb929482784b463546f5d84f80510f2019923d465b99d194246d68c7ae343f91971d8f7059cebb86aa5dd099289aa648248b8c5ca04e66ac5e9bf06776e3883495397618a0227f035666806e636836b47d3d2d255a49db79866cf00d9ddabda259c4f968a1e01e651c7811cebbee2ee71803ea1d9d23487eb221f2d9555756800aba5e6abbefd6fb72b3151cc99ced599cd86df2a9b1ce94f89f347eeb124d9e7f0d9cc48d3dedd819e6d3dbac57ecee199547b266116a2035c9acc4c8ca3271ac74952372897c4a5f2cb84e2d81817fec9d6774f6d8a5b2021684132db4fca3 AD = 0c7bd4f3a30ee944ccf9489181e6911684dcffad4593a9b65a67dfc80718c69b35897d01281016b7731e12c15cad8482e79458e08a755622e3f3f22a23ef6c8487a36ad1771ba06c641f06f85de0db3776cc6df06ad8fe3b4d60d58508de943083f17cbb9dc0d390ac94d8429e8c6fcfe063f424fbde0f62f6a7f91a626d195dc498a6e69bd93109c4e9ba13e7330aba456d710a4b0cc279d4045660406e26d61dff70d4a33c4f1052869f9248024e7a0f85f1effb32f6f7ccb1f860f3ef04e8f7b29096e6bcf9d4b3e0ce703e9bf228fdf515c2ff9cbabd16987be0f9babd3d8a CT = 91ddadb86b7ebef798ddaa59da51d71316fcf6c9678143178227d778750dc9827fc6cc21e605c505023e6db25849df7fb6fc1ca4d223aa215f8c85b724643c83bf8218815a9f9e2952384e0ca6a80a3760b39daf91a3c6154c4728c2371fd181fa3764753d0b0c23808a82cd8f0497246e3a0f17f8906a07c725d2891ce968a9d432c2b102d85c05510b28e715bb60d0403a77490e7f18be81218bc4f39287b9bb09f50227dd2f55e4fb70c4438da8ba3c8ffbced87d90155913faa9979fc57e6cbeddfaba3d3ab4163c0eebc7d94279c27d3ed56338893dba542eaefba30f8c3b TAG = 8980e8e4fe796428b733f4f8e1954a45 KEY = f0f16b6f12b3840bbd1c4a6a0811eef237f1521b45de9986daec9f28fca6485c NONCE = 000000007ac93e754e290323 IN = 0530556424d823f90a7f1c524c4baa706aad2807e289e9479301e3e7a71f2a5e14e6232ea785f339c669af2e6d25f1d5a261096a548d23864945c3a589b67b09b0304a784d61b42b2419139485242e0d51fcbe9e8fed996d214de8717e6a71f8987ccad65eb92e66707034a5ae38e6486e26eb4374c565aad5df949dab209f7f7bcd8eb6fc52761a26cfe5d01fd349e59f4042e6dbe6b232f9301b971dee121d8aa1e62d40f043a42f3aa859d867eb809b1ced5ae1ec62cacf94a69fafd0631a8b5dfd66d855900fb295eec90ae5fcbf77beae267a79d24081bb322d8c4e0630fed252541b36 AD = 13bfcc17b810099cda31ca53a1323db9b07633ceb2088a42263a4cbd6a4d47978776005c9a20203319c3a3ae434e9a26fb541047dc9df38dc36c095267272e203d0b24d119a70a7e96041b6d82b7c4d5570e1e4a1cf2f6e44ae63fe005a1f5b900778c482f7bd89e2e02305e35b8f61b7bb2c78a13aebfce0145d1c5aa0bf1d10d23616d5a3a446de550302f56f81dc56fe4f3700f14242688d9b92d8a427979b403c8de8c493a2cde510eaf6b285e6675b173aa0314a386b635c7577d5aff0d868a0cb3f73c8d2005f8c7c9dab5a060ef80102c9d4a4af988838afe87aff04c0689e8c3c7f9 CT = 2c14c3931e98e84507c4c165c2ed47ad4a178f0e216cd7ac2453bbbf9f85dd06bd8ef54a9ff1fd3dd8e0cafb635d8f2de861a0db5b14d03f17aaea8c89b3010797c71c13a0e666899d7ff6e53c4f08be8ddb3e37688b5afa088079b6c7519b833e16560073e699530302028a3496e05edddec01a23a4c7983956250e8d9e616f7b940856955cde81c1efabf6b7b92f153d03f4cd17e7f7d2907670cfc84d45c1d7936775a3fce47968504278ffaecacea0871b227f250e2979516f6fa310fec0d8df1af7872e5a534e82870aa05f43ef0a455846b93ce938064fa33e92de262e4156dae56775 TAG = 16c972829819b8fb030b2c5f40dab717 KEY = 3792943c0396f1840496917ce8ad89608385007e796febeea3805f3f4cbeccf7 NONCE = 0000000023b2f9068b2c4c85 IN = be6b67eb943ee7b5c785cd882f653e73a8f75b4a41a2a7c56ae5a10f729caf39948fe48ad0e51240e2e7aa43193c7ec6ce7f4909fc94c9f99e38e6a0ad7e98eb29c5c2e61c99e9cbe890f154185cec213a74725d23c1a4e4d0cb9b1a36b78c87e5eee20d2aa29aae80d4759eb0c51c5dc3a95bdbbf7e14eb434419a6c88a954ac03d0c98739f4211b8732acd71c297f578b8cb64ccac45f7235ddc7f2a3f5f997525c1ed39dc550126cdf9cedaf55425489085e91b170be6205a5a395f2dd4084a3e8dbc4fd8b13252f7effae067b571cb94a1e54aba45b1b9841308db0cc75b03cfce4ddafe89ce20f2d1 AD = 7eb6d7b7bbaaa3c202a4f0f1de2263767169eb4a64853240d48c0f8d5d31b08d5baf42977614a57aad99426cde76d242cb37d2956d8c77dc4fd62a3abf30e8ac6cd58c8ef35e67497022960138c57787818892460f3bfc16e37ff388b1edc6ce2bc53c22717edc7a03d4c78b0dbbe9121c7fd8a3e3993b87a4fe389bff13bdae3b349de0b6db561602c53f746022aeb4483c723b67825042f4af20b7dd1e6031cf54215266295c524ac8e1370424c5c5e607fb3e23e97c8eebe64656775edf616422a8b974e1acf13ab45c9a367a7dd9b2d62f48bbc05819b65eccb813ca813f57b22ee4c280dbb5a9d8d5 CT = 0b316ab2bcf5359900fa4082d5d253b49ad94b70e3fab544f98bd111cbcef6766cf953deec08cae1f489fe12f7acc0032db8a6b0c0eee0c206ea5fb973feaebf90f690e840094db5e13fdd7157ba127368c995b426529435a1bcdd1f14ce9125b8a0e4c96b6ec09e3c36a180adf81941c002d19c19d53c2009be803b987504606b7d43bdee5e0b32ff23c466b6cccfcd0d4e88fd1332e73712b5ab725c1a383e584f34f80daff29d285ae5e43cf1d0cc7a828e75c25daced3a581a93d7a50f313b33f38dddfaa23cd5b9914797db820ee2400d52bf5fa982277fe9b5881ac42981633b3957b0e935051828 TAG = c549aa944d6d97e52e0793ed572682c0 KEY = fe4be6054773f634356ac328591fbc6f833b0d1beeb38dd5b6feb7481b4489d4 NONCE = 000000000b3f16f898a5a7d5 IN = 76ced1ade6d1ef4069afddb32e7432d4ff2fd06685121f7b16464e7a72d365744f547d2ccf53486310e38b42d8bacaf711e54c5458d2d68c4dbcc8de31ab6732f4430e88a64565f5b287640775aaa2af1cc461d3e415bb275c6246b1b58517aa72667eae291a2982eda175d1b22c5a58e6fec2b3743d55712f201ca24ba5c0ae8c25724871b2ec2fb914a8da5a52670ab9b43a83b8568ce74db5c634061cb80530c8070c38b8f48c33ba136cb9f2158ee7eda8b65f2192fc94d1291f182f101795b7190c74b319d2d3e02a97c824d9c9471a83797e4936310b207e3a1e0bcf75f7c3e3ee48a747641cdc4377f2d55082 AD = 834cd775cbefe4b33a3ca53a00c06a3c4a666983e4115a029f15729460daa45d1505e95172d3695625a186b28b8be173a925af04665f209267b3c5123e8be13da447ee1ae856bb0925f35aaa76e04a7bca8460f76c2024de2149f38a8cfba81694b854885d72568105571b6b213a0bc188a44cc7fe13153cbf261401b238cf12a95e23cb56f240114f16e2f1e3a514615aab4449c0c49e4d900b0e17d1a8dabb53d43dca32fa052d576b73dd9b40856b515d6d7efc2a5c17e0ebcb17bd59dc86f22ce909301a2652f134e82ef0e4519487ed12d51536024f2ae8f75d937c42d003076e5dea8de0c684cda1f34253d8fc CT = f8defb6fe95dfec499b909996a1f75a198a90e4d6c6464d00a357a555311c42fe92dbbc4b79c935e4f0b1a95e44fdbc1380bebabca28db4dd0d2870daaafc38ef27908c3509e945714801cc51f1a07b2430c74fa64f2a7c2f7fd1551d258c9c3be020873fc1bf19f33ab6c660911dcf2317195d0efee82d20ec26d22611f9cf86c51a64e28b3a1f344500018e0855c88dae3c07acaeaa10b60388484dce93e16e6e1a6e69e899806648a92568c8780e9f4baacd98cbb353ac2f908e775d92303cfab843f15be0e0c322a958802fb1a60fcc7631f151f4c2b8cb965d2d296acef250275a2fecc0cea803ce7c058b12dd2 TAG = baf9a51180f172e5c0cc2c946ce55055 KEY = a288b11ce5382ec724ce4ab2d7efa8e777e91ebd04367935e15f9dac483e9596 NONCE = 00000000874144dbf648b325 IN = 4c9195280a79a509919af4947e9e07231695fd7c5088539f23936ce88770ce07d9ad3ae4a463b3a57d0634d3a77ceaadf347a334682b04be8e58b8e86fb94a1f93255132b8cdb0df86f5bea354eea4e8315fea83e3fdf6e58aa9f26e93caa08e5e2551a94bd916a51fed29ec16f66800cda6a0aa24ec308bf5fb885afba272685de27c1edcdd3668048ef07b06e90d464a8aa28664903cac45e154e8e1e39c257e1ff506b9d95cef4f300bb73b899e7828602c3c1d290b8cf55ee5fd72ecce9e6efc9293aebf674a70e2a7673e75629c12950622dff71d3ec0992e57776c788c6927d30b4e24b749191c3ce8017f0ada6276e43720 AD = 04abe8588c8c8c39a182092e5e7840442bd1c1149da102c4ee412bd8b82baa5087ef7291b5cd077c177c42770b0023e0e462b06e7553f191bcb0315a34918dcdbffe2b99c3e011b4220cc1775debcc0db55fa60df9b52234f3d3fa9606508badc26f30b47cdb4f1c0f4708d417b6853e66c2f1f67f6200daf760ceb64ffc43db27f057ad3ee973e31d7e5d5deb050315c1c687980c0c148ee1a492d47acfcd6132334176c11258c89b19ba02e6acc55d852f87b6a2169ed34a6147caa60906ac8c0813c0f05522af7b7f0faddb4bc297405e28ecf5a0f6aac6258422d29cfe250d61402840f3c27d0ce39b3e2d5f1e520541d2965e CT = 0afce770a12f15d67ac104ba0640aab95922390607473cbda71321156a5559906be933fb0980da56f27e89796eaa1054f5aacf1668d9f273cc69071b9e8e22af6a205a6a88f7ad918e22f616bddbb07c78913c7e056e769e6fcf91c7600c2740212e3a176e4110cac9e361a59a773457064d2dc652dd115d04f1c3756c0e1d39f6737a16b4508663e310934c49c58058b3c7b9af7bb2334c8a163608c42499658986927cda365e2aead3ac29de16e47e954383ea566f8fb245a4e5a934c767bb3bf7e0eb8a477fd0e1f61bcb238462a0d19c5cea9293ca58ade76829413216a7882cd2846323046694f78cd8b0347792ebb75abdc1 TAG = eb9b2ee43e9a3ae1e33561800169d868 KEY = 65b63ed53750c88c508c44881ae59e6fff69c66288f3c14cfec503391262cafc NONCE = 000000007f5e560a1de434ba IN = 845ef27b6615fb699d37971db6b597930a7ef1e6f90054791eb04ddfe7252b5f88fd60eba5af469bc09661c0987a496fa540621afeec51bebda786826800943d977039dee76235248112ff8b743f25ed5f3cb0d3307f5e118d84fdbb9c3f5531bc177fb84549c994ea4496c65e5249da987dd755d46dc1788f582410266a10f291c1474f732183a2a39afe603771bb9c423fe3e8906f2be44a0c9a7c3f0ceb09d1d0f92d942383a875c0567c7869f045e56dd1a4d6e90c58d44fe0c5760bb4fd01de55439db52b56831e5a26a47de14249453a4f8e7da3cb3282c6622916197ebfaad85dd65c61e7d2d3ba626276366746f396394c1bf75f51ce AD = 51a3588398808e1d6a98505c6e5601ae2a2766f1f28f8f69d1ccbcad18038c157b41525be58ae4527a073748b7a04809e52a5df0c7988417607738e63d7ead47db795a346b04e740186e73ccad79f725b58ee22dc6e30d1f0a218eda1791e2229b253d4ab2b963a43e12318c8b0785c20fca3abcf220c08745d9f9602f0ece544a05736d76b12d249699c9e3e99f3f13cf4e5dc13a04125c949a5b30d034b23cb364c8781964bc6c30e5e5ca9673d517ef5f35965d8a8cf1be017e343df97b6bee37b30638b154286d1f36d2f9a0eaa23cc484eac5a05b15d9efc537d989dbc8b3106c0dc1a56e97e6aec2eff54a82cf7ae9df2af46b4c860f83 CT = 027b14197b4012256b133b78ddc94e72fb4d724fefa4ae329f5a5fa3fa784fe6d7e1e805e3f7a75557de64de506d38237b467fa577efb59e7cfe2356bed6655c5aa4e238dcfeb75c16549a0917268768a96acb5e20546a1fb7e3a7cff887f49f2cd7a135f72a98a779150f3207bf733e88861fd79eadbf77fa3bfe97bfe8b6a991cb3bcc2cde8287f7e89384846561934b0f3e05e0646e0e1907770df67a7594161a4d0763faa6fa844080932159999d528ee0558710058ce16f97d13ac9fd9bf5044191188bbfb598d0fafbdf790b61ce0781ecc04218a30ded45efd498cc9ba03562ed2b4a993ee98876b3ab7a9bc07829f1c4ca6ead98c06b TAG = e0bf9b6837428843f5a233ee5ddb8a1e KEY = 4986fd62d6cb86b2eaf219174bec681bebcdef86c8be291f27d3e5dc69e2feba NONCE = 00000000d08d486620ed2e84 IN = 3a22ad5de387db4fdd5d62a1b728c23a8dddc50b1e89f54f6198b90499f9da3122ebeb38ebf5fdfe30309734f79aff01e3de1e196b35bffa33bae451f31f74b8aec03763f9e0861a34fe5db0b40c76e57c7fc582bfa19c94ee25b5e168270f379bf9f8a0a18bed05de256f8f0dd7c23ba2ff1c7f721409462f04cc611ad9bd4c3c9acf30742acfb9518a6375cbb15d65a1bc6993ea434894f93d4f6e05996ebc1bd56579296309a2c6b8fde95072168b5fd31927c4c0abaa056bcd16221d5f220be47591f43255013a262dce439817f534830ba82155347e5fe3101f8011b89365a6568214ed0661914e8cb3431d6c8f2347dfc1209a3eca4aaf0a111f47fe AD = 7dd3f656a03c001b45ca0680bc3ac9d68c6e96b591d3c69eb8c65e489009d845cb331c98b82e627e06d5bf01e74c573df268c2386f12628c019951d42f55991ff20d72a7b2c45f41d0be7af428c92f324aaab8df70d900301cdf09a3d93eb711c919d34a86fff9cb078322ee2e0ad48dbdf3b7884f0f2dc5c36262c59bcfd75ac6200f59c6fcd0ce10ff5005fef5df8f0432377dfbfc1db8f559e27e1aeef3380ea3864867d36a25a18654779a751586cad3b8a46b90864ee697b08605673b8d2123433c020a21c4db243dde2420c12fd4d54a2704a0c8c376454a1b5e80fd6db89aabd56d9b421f29649e474824dfa56cb5c673c504d10be52b53751709fe CT = c40180afd53001663ff4834110f56e6b0f178cd3c0e7f7de5d0089ee41d8403ffb98e84922706544a344d7e2625b12cf66b9c966f9f57d7b94e3e4b34e6f0aaed1763ce012782e2f5e1682e6c343fc7961fedddd0919d0b910e9923c17e36406979b256b85aec24ee352f03b48c1302eab419c83dccc5372cc059e9de596224fa70098eb32fc9579e97917b923914fa2efc30ab29b457bf14e45583b3771486bdc0876f3ea6e1a646746c4f8c5cb2641a1557c8473e6ea67d4811a67485ae9a678ff3a2408ca845c3b51957e189eef47dfc1d46bde4b9d754d7df13f828ddadb06e4ebddb5f0dafbdb28de4c5e6078926f20cdf9e97ecd58e309e640f74f06 TAG = 2e8eb9ff4467c0f61c2abf6ca10893ef KEY = 7d28a60810e43d3dfa32e97c07957ec069fc80cc6a50061830aa29b3aa777dfc NONCE = 0000000047738ac8f10f2c3a IN = b50278ae0f0fa2f918bb9a5ed3a0797c328e452974d33cbf26a1e213aa20c03d0d89490869754abf84dbbe231d7bccdced77d53fd4527356d8e02b681fc89a535ae87308bf7fbc26197a5ea85bdb3aa033b8da5cd197ea6d72f96f63b03f4ecc7adedf399a5043776cdb32c08f30b77f34df85f8adb8e02649a04b020b03e17d445ca63e4ed73ae432c481392e031eba2f9d2f7f981d1e50917822bd6ff71c239d33444ada3523a59dfbce5457eadec1ab926c9e6c5299c7521e3f204b96901a712504fcc782e8cea80ba12a7f7e71cec3d0871899b6ca059061da037715f7d13fed01c9cade1e687b4fbb1f4ac4b040db3b43800f112fb900e4f772d61b921cbce4da6f AD = 324292813b7df15bc070cc5d8a4bf74ead036430be63abc43304cf653959a24a91c7de5a671c50fa8a87e21bb82b069999aadfb6895d8bda4c3083d17b8ca55b9ab1511ed8c4b39d8c28c11a22ef90c08a983e3fe2d988df9e02b16a20b24f39ddb28429625f511db08298c4dc321f6c268fc836a6191df6232f51c463a397a8d8b33374abe94e62c0f5c322387e1fc4a1c1980a04a1a3c2c31b32f183a11c3268c6dca521149dc16af120a78be6627210e8ddbc44472bc24d66ce3681c7579b3d9a425212a704a4f5105cb80f0d18ee860953d10b59c114826779bbc368d7a0eece9f223e47cd8e5fd453607d101d9d9c2bd9a658d6520b87d7b4263f6d845a524a36e4 CT = 2c217e969c04740a1acfa30117eb5b32dc573df3354f4cc3bf8f696ff905f1e640f3b2c250473b376622e0c9bda13b94640521be1ef0fc660b4c10dbe2bfc093030753e04f6aaecf813b43b61f960455974b8bb8a9b461d1e8fd3802315e863c00448f24dd38deb90e135493274eb14ccbde15c50dcad734ed815a806be6622492a84cd062e3ba567b909a205a1d0d2bedd40169697d261c7b6c2e0b1f069853fd470e8f364a142c386c439a6dbe192ded5a3d0fbf73799f588c59e58c60249d980ddcf0d9693631cd9b3f972509c3a77123d38d9e267ecad06e1208e3f1c0a69fbca7c3bb1a48fda19493d0f8f48398820057b94120f3ef97d87e9e8a1b301a2534c68f TAG = ce507bdb0c71f8e89f5078495f7995b8 KEY = a76e9b916f5a67b78a5949651c8c3a9741a1bc3c41cdf85fd2c8f3e9a0616098 NONCE = 000000000808da8292dc14e0 IN = 9c149eeb09345c3c22462b03e49eb4dba6bc98b269b1086d752bcd8eea53b8977b238a04a994baf915591686baab90b79a3bf7d9adb2c6c2e31acd3e72f0813fb745aa5fb2e3da408f78001c9c09bd26a1a2646011b6120aaa2bbacc4a16c39fb5257b9b2ea2ad8bf70bcc9855cf11841116c2767310cf3cd49d1aa44cd505f079761e064d5bc7cea4a7173b086882a77d3fc179efc86fc4db8a373491d2ed81eabc63c950e832db17d09f474d4ec46bde47830caf26fabaa0372b81fccc449c0e19ccd630caf693a7b43bb1c408a54e03f50c44280a05ad89fb6e8f01d8ac278edf556e5d86ceb4b614fb2ef133819c6e1ff6abb86c54a135256204b5cd400b93624d3932e7c2b046 AD = 6aeb7031e4a2e23eea93f05fdc562aa2bf43b8998bea7344377aaddc60fbdb7bcb1491d379ed0cb613ee757cfb66490db61bb431d2fad34b38ddd55bc5b22aa6c4773b9992f34b878c5663f6e8cdb5f80a17f4d312bf342492e48d1ce4c6d754076a634fece61500acf8168d47381af4faf980c6cac2bfd5da8c09b6edb0f543bf0fe02643e38d73fa37d8ae87fb66193f22e57faf4393c007d48c8631a685d520578f8f89db684fb371ea02f3a58b1e2168f0216321139472e0d03b6d90ba8aab65402e1c1ac4f9172a60e27e3d997b9b05e2f672120d6c87bcafa6d4c9b4cf8ba8a82932d92840368fc53dc5b48526103dcab5f1531038aabe89171327ac559b98a3cf4ea70bf051 CT = 9c3faab9261a63cea9477b3269007283995b06ba77ef83d9e693f7e4ee9855550eef94855be39a7a435b6a3584b202973777c7b2482376ba47b49311947a64983b60236756ee4455d4cfada8c36af8eb06b06ba2f6b79ffb1185c89f2b2a831cfaa3855fc1841d8910908be5078352011168a67d36372d851a3217cabf593ea462dcd325cf9a4f67e85418fd5c924e9b92ab026cbee4e7ab1067066cb5949dfc699a68fe539e1abb13cec33904e5207e6963d24f5a0b770613b8b00014e791bfff88f9c25ca126127a2f8d1d1e9794efd28dce98b53e228073faae8d5047530d502184fc341321c3f55fcbf41187fc31262c325b97f519959b6a29b36c71f76f60196bb1457b77c8bb TAG = 73b00b1705602479aab944dcc1b282a2 KEY = 98cd2477a7a072c69f375b88d09ed9d7b9c3df3f87e36ce621726f76e3b41a1d NONCE = 0000000077d185aaf715aa48 IN = 42b31eefdacab0f03ef6060156000c8195adb0976cabbe1a42bfcc09f85659c60b98638401f2d2e2facfb9a97a62926bb0cecaf3af0180a01bfb6e576babf7fc43331937a92abd30cddfa3e450f895e9dd914dea3fafd759c136d685310ebce28ac0613ccdbf30115946c9634b67510b77d0e37f07714b2ddac9d7095b8d4bd887c132c4a9127eb01c8dedb4c39c87b98a741316656f9a8d5a5b0c0ac84789aa2347a5f99ca5ad55cd1bcf98f703eb4b00badb8a8555f38b3b368db8ba7ceea94e8b219f51edce75d84166b5602156ed5962a93a51db73c59d87e906179d7a74a2a2a69d8ad99f323225c87e475d3f771b4a203a2e2b03b458401044649fa6536dfab24d7037807dcbf6518e6578 AD = f5bb1496052a4361dddf72a288e36953a3d815d6876c013f1d6ba839e127f721b052b1f7d8ca20c7dc0386a7d459ebd7eb9fc8cb08941e6ca9ddb980f3115f65bc1928a414d441ae71dcb879d5bfe0cde0562bc37f8fde0d5291ad405c92fcbb860c43b55ac0fe663b54b3d0616aca13a5c82b7b5d34125a05c2acb5530141030e6f2aa0c8322b2c8fa307e7518918e550e9f48921c6168f094d8758e16b9f815fd0458095c4143f0922adb1840d0e685636825a9c90ee90ee537f4b8dceecbc4287c82dc9a00d7e51671e37ea284ee3ca501b1b2596459d3f592f70186f41125739e342c9f6be9241973b1414dfe5fb8cba1af82e679278cfcf95420df0c5364af4d7e72ad57d5c871fcbc35462 CT = 7a3bf3e3ad5ae3ab71fb1f7121c3d8fb511099484b50af7ca128ee0337ed4b828dc4cde0b88dc1e8089101fa82c9beb3eb48fdcf0f5b16da441f5a3fce9a590022af95a94aed6a3e71e505f60f303c78c356f274ea85a55354078530664ecda32c80e77dc20974b3b38f4825b8fbee8c3970769a2f42c5181608a8d7d76ef4d093961b665ee42b9708fcafe2c82d3a307173e2a25ad2528c3bf83352b9265e45b70722d7cf8c9b80826d21335234ee3db69d0d37871c83222365900c96c17a7e9f5742d0bfe383be24d0d44590d4b0f29f7abe0c65daaffb968b3f2657b1eb300534eacb52ec7a6b6f9f57a50a91b1799f491361cf613c934b7f520dc4eeeb40ffc45e10be0a95e76f366d4eac14 TAG = 69302888812eea030d621b640e7bcf7c KEY = 2f0f4631ab1c1bcf8f3ad0559c818d50e0af7d8cd63faa357f2069f30881d9cb NONCE = 000000007d0ced2fdb1c9173 IN = 6516ba1d29357144eebfa486d21decf223da3aa76ec29bbfcbe7f1eeaf4a847710e5080177f7e5a7c8b4752c219b1cc70aef4db861ba67d0fa6222d9f4a1dc756a0ba44e62906f9374a960c16198866d867854d88f528a60e212eb91645787e75685b2e215c0a41990abc344a77236ec0186ba63a664592938cc5a8ac1d3eb99c95ce00e19fbe249263083d85b052d48bfdffc01585dc57bb2a2c6c4a819604c1ec0548c6f0f78dc05e4418b36277dc07233c7532f9c289d6aed0cc6bc7df4fd0a536c497b982e2dad2c30d2db1c6545a845c5dfa83a4ac49ef06fc9c919079d3e299e31b5c3be370814ae5022ae469d3ee55246a41bd0dc4e64351cc38c3c09af0a1aee3b388a6892deff0df3f93cd92d722b AD = 1ccfa1ececc8de1e200d0ecc19dcf67b7c96bea3a282c2bccba61035db5c14776387b8b8f58e5757deb0129d4e5e315f64df354a5985d2e47ebbbeafe0c914f7cf1d63dd0311ace19e69a8b6ff0ab25cc8df0408d22132205e89e5eb679268d82b2913e64e3f885bbf4a6d379b760b94590e3140dd7275ab4713cb56d0b716e2718f11316640cb394802862d39e77a46d0c065af3caf7dec14e887039d8aa8c3d3a8ac1ee06026f49d00b2f59d971b54735e95a51f199389a93a4fc24ebaba1f7a2eef7412f61febf79084fbf481afc6fb6b204084e5ef5df71f30506459dea074f11fc055cd2a8c0fc922c4811a849984352a56a15659b7d07a4cc90b88623638ea00c4c8bc13884df2237b359f2877aa41d6 CT = e580093789ba17ffb46672dc326f09278aca08598d3e5458eaa53e6ed45d5c71a396e35b5ea3fe7b7c0496a734d24f1c75420694be2ff095d5172fd3407794e4b99fd7c374fbe8d1564a048614d3f355bfb5866de1a53e1a51f9f5e8312253cfd82f36efaa1898c850ca0d975ad1e8b0d9597a5a9e6516fe2a3c92efb7495557a8afc3da15b0d3e2ba58f612519836946cf2d15b898320d16a026c8c00a1be2e35f0ebe68f28d91c6c45d24c3f3c157cb132fa659b7794df883d90741fa2d2afcc4f27858e13ecd41b154a35d24947ae7361170060c107d8ecacb393ea67104b60457278a392fdf1794bab97d3b02b71a4eb015eaa38a4b4c944c2bc7cd5e329da4a1ab2937a6af81a6caa5fce752331fdefd4 TAG = 19bbacfac768bb0ce71e39c5d4d3e9a0 KEY = a48b9b6df475e566aba7671fbd76772cb0eff0b12499967978ce3e25fac92feb NONCE = 000000002ccbf0d6c40cb302 IN = 09da1cacd001dce4f7573a065a4406fe0da04ab367a2d87780a2762e168957a88d3fa78f0a4b6978d449026e5a801d32884b6e14fdaaaf864214f928ebc03dead081fee96683ebb032362d5088c4c2a3b1e242f055f2604919f4dd551db777a258cf9da6d95a2bde249247812b9efc7985cf08707620808524d6dd3079b0b63bf0f71ea5de834ccb8b7c6a97125fd6ca49148e866d3134bbf1d8a6b714e9a80fe549c8bfefe342f41be2ba2300e0028f78cefab65274632dfdbe70bf7d655ec4036df561f2d4fc4d56a482bbe2f9f2ae279b3aa216b39afee75e53602de319484db89a51e844f38c361634e474f8f1f01c340f3f3594860d671346449c6d08ee38de22d246309bc7e4a252a29c86aa6d94b5b4fa58904c70 AD = 1c2503d5aa1aad193f0da12874074ea0432bb76a61cd43a3017061514da0759846a0f3ae3a49fdb0b6d29f713de665beacb6568f2694112ca380d13f3c1698316866a7a7f87f1d7503a92176ab84fc08977b46ba664508a858e7525753c45511b3d2f407d5e993c6ede77f13d12975707e5195704970a89f71fc30828049f92f944f3aa93d6a5297e678e08952919beb7eac5919df1919cab3c3da6aa696a1eeab6371f310f7e81143e7d240b0213ae554524b52000306160dd4877bf13ba0f13bbe867da7c7d707f31335eef4cd942938ac890a0829ec66bd30ae01a2188a6e5ea0f17cd7dc875e17f03c0ab5dd18e36db8a1fc1f72859ee046b62368f168b3bea2234e0432c07b7d8e1b9277f21e692c513b9e816e6860 CT = 7d35cfe4be56bd6e0e09dedcd01735b915bc1891a4d1f6a541abc4bcd0ebe89dcb8e365e5813742e8ec65777b6159422fada747da99394252baf8a046fc1b60ad79755f545f4448627b7acaf403000894f5641e78d3f946dfca29ec617f0660dcd6e8d8827e67e1022a245c595d86e60fbd176bf721b171bbe5ecaf4ae671b9f3dd3920146e6ad431bd8fc431820e19454b6ca209723d80fdbee187fca9c937c979206ae97be55f6ba7366a5608770a11d537396485eb0a66586385f4d4cf3905d1fc90831c3e136d5d513fa22be285193142994a3ed477145bacdcbdd791e8b3b88b0d4f1d18b27382550a818c4fd8884bf36f677c6c3ff5677406e510911e696af75e5b3f859bef699bdd16e6215fdb98d874025eada50 TAG = 0fa4cb2bab84336409aa4349ab99a8bd KEY = 923d4b086b9e43b986f7b65e4cea6113a3d8aabefa89323c5e4d5b6f158bb7e0 NONCE = 00000000a0f73297b87f5deb IN = 21435e8d5c8edf0684f58c2cba4070c10b4801adf46b6c4d322eb3990a38a9ad338ad704b9df6597f3e68d66cd5b56290c8466db2231e56d6bcb9c44e1bd081f42ca2a894dad369df2bd0d2c63d6c881732d6ea22bb22b5bc9a62eaffa1b094d0845f6b966d2cb095e7b3b8bcbc15e707449d35c8df4aea30c3b7243e977fffd59c80f1c5c9af4bb5a54b9c786fbbe8d21b2b906a87a786caed841a34a3e0cc0ac3209d83c58afba19edd63622dd261532d2cfb0b49d527d8eaa0887a087f5129d897f665264b229f860363d71a88b7d49c8dc6360182b357b0662391bb41337f46010ac32b9fada2d60a2efcb99365d3b27b7ac396900d1c821d0df8b86cc9cc1f2673259a33efea610bf8e1d00d7e9db2afea21da8f58c55f799999d AD = c853a8b39c0dc597d562f123cd221e4104b65423a062a4f4ba890ba344feb84290f61817e23330c365f58c3583ce08360d3c1171982ead5496d525ac878f23a57480a6ee39d4e65afd6268245bb982a2545fa1195427cdbbcd404cdad5198f55cce2a5a028fae435f71b15921d066e8d43766c32b2f2c3f57c0674e129607dcd3703eca529414adaee79d81fed432153cceb6f3fc53404810d8ec878f7d94be5d379d0e0e1aa9bc404b4b5d396038a9d76a5ce53c9f3759b8e50fb331858ca58cee81bfc3ee58baef5d19c402a3dc8b36370ec1ace5a4aa2527fb94b4f933a4ab8ccaaf6a5af5a779eae5667c2a24ab027e781c8d4f30c377aa5885a2fdaf6507d18cd824a847c35368b4ea984d2c3c3824a5b8ba3042e1852504a21a3 CT = f2e21052eebbb86a4f5e803360855d8632aa727dca6f5e79dd74d7aff106e442001928d113005b030f8446f8eff2ee951db663978abe43090dd5ad2c51ba97a0ecf988c607d95e486d02524f690fa3c28d5c48c1f75c1f555e7b43fe7e46f2ca2b9fdb408ec4ba18b6cdde2af673183cb7b1a3c23ae77eddd4cac75e1ea14743fc571f8d31ce2e96787524cd48aadaa474181c096a032184574ddc25a6e0ac8441c212bc36298708e33c963ae931e6c6241d1affeef7b6ef759495df44b6ab647447693cf703569e69aa72f1def9a342b8978c1edea9703a421ca75b92cac4de14b88c693200022b8a2ed22b1c4678b99f4d695e080dd1196d7168e14f0d0f8ff880d742e97b9f6d00af1f7118e10b77c5ef3ea6c52f84a20fd6ea46dc TAG = 9bd8b7743c056bb2334833afd6143e18 KEY = df73adab2768559ea983cce85453fe81d79be3b3c57f202b31b94d6635cf2e4b NONCE = 00000000e7a87e6bf6b5a354 IN = 0032a37abf661faa18c587fd2aa88885c061deeba81105dd221969bed5d59c7204b09b1a8c4c8de3b9f748c7fc70626ebeaca060233a57b102221b1bf0f3d9fdaaad3d2b1439c24d08f9c67f49f3c47128f92ee530abf4c4f4573bc60ae4b38109f55bca3ca9e1ba9f9fd6e34ba0d174892977a53356e1f5c88c614fe3ff3b3dd0818e7a2285412e3b37444bbe8a80942efcfd03958809a6966cda9430b2f0c9e552f4bced6e19eb3e85fc5758bd7b588297ccbed37ed94c3adc8c08ea8b058462aac9d57a939ec711bc4ecfec944d2b653b7cfc7b02a65d7057c9fdadd51b9da8cc4a3c68dae9da8b9c5319c1a2baa3d6c891c5ac4a39461484b5a01abc64df447ada24c04a4363e605eaccf339a9aa515e724206206da6d22bbd2f52e64cd7c895 AD = f833e5ab4f8bc89167f80f576b1d6b22cdd0e30721f5f735799746cf645b6eff531d4c7b03584f3dfcb73cbd35ac42736216dc7f0de098a4f42c61ceb4b227ee288e47d697a0a76afc762f084e8fdbf9351c28340c324771c109a469341ab10ca10483ed2af5e878d7d3dc2bced2f72da3d1a25852b103ee9878e8158eb4309c1ce528f3a178ace153b6d3ae0af0d577cb3cb1540489e80427f792217ad8a09b84f027fca7ceb651b4264e98e94b4cb8a37b133390897233e8ba9103628d05b9609e8552c4a4b11e3f2fa8d56af36957390e88cba44656be3edace798cf8cdf7771bac338a256bc3cba6df97728f222f423ca7c6d149c9372d66163a98f79a234b00d4b75fb2ec860dcc2d1998105e4b9c01d68f079f3e0aa21cc534047fc7b858f8 CT = b842eadfdf431c135bd6581d3eccae54e2267d8890036aa33dfe2d2d9715c44625441210a3a0d666d708d30588fe851ec36e10d8fa3584ed77b095149494b7c54379d62c8935e1d2b9a8f47e4759ad0b3437fdf2cc2fb6c5ea25ad10e0bdc9dc5b0517fc237eb783cc461c46665e2b1d1a5b8008dbf409ea2a63fea0276de23a32c99d92a498807a0f95e208fc6262321a78aafaf0cc3f833fff37bd4efa66f6023a25cdc6702cee3912799563d908a5183c9956a06aa71085d855dc7c809ed6e2889592b361ab3ab39060f8e419152187a794a19c2a1128882201900ea2cd597860674bf78d9720643df8701676718fd201baed4935a88e50558daf86edd08a9ab227ac7afae55c974b68de8dacad4a4d79b13ed6dfe74017a4cb9148e033436fb6 TAG = ee1ec36804e1d5cdbddb52608c711fd8 KEY = 55a4be2448b464c2ea52a2f2664ed6aba865c14ea1fea77f4689331fd105c8d4 NONCE = 00000000db37c0a405b4626d IN = d266e66272e5d3462081b004cb42429c8b9741e9f678153754d726f6f9aa513464763c5e793b482fe512fece97585f1426120d4cefb3d0a8cc0a8db4bde93fc72c78f44d4fecca14650c660d3e285b327e7cdd813063e7e867b8a2d059a41bab70432b7f857199894da90dca3fe5272bae1ec694a1a07b60b05df275784d4975637e4673109f3ba846dfd1a048b202ed8e89973be608b91ee4743b1e759900f1443038951fe6189e806638985f3c16338c3c60695df58e621154d79bb973859c4558e9dca90470f77c73f004443ad5db0717abbe43266f90e57397b83ac34d1fef2e897e2483d5bcdcb627abd64b0d1aef525835f25e76d6e9158232cdde6dce970b59f58de8a98e653be32fb58edabbcefa5065d73afdf1c9c4fbf50c1022bd22bfcb98e4b422 AD = fd6a3fdd879f8880843eac20ae01c1b9dc3487d270a806572088ef2ddc1f1e0de495e71d4813bf5c501ad31e5d791c4b5b3a0a71b63fdddcc8de4b056064ef467989ecccc5d0160d403bf3a025d4892b3b1de3e062bc3581d4410f273338311eb4637529e4a680a6e4a5e26e308630a5b6d49ead6d543f8f2bf9050aa94ce091318721e1d8b96e279f34b9759b65037bec4bf6ccda6929705aeeeebe49e327e4d7a916620c9faf3765120658af34c53fbb97ec07657b3f088fcbdc401aa7949ddeda34d885018c2c23f4f0bb8218bf0d4fc90643658b4d8834f4a8c08e590c2a790995baa9e77627c342d283e454f84fcc05be15e9627a2d9be340c9d72f222bbdfc47905f56616cd9f936d49e4732f319f020513340fb8b22828db251b102b6b137c9533936d6 CT = bd11ed07b7b4b30eeaf25d6a41a549cca0a5aee71f990ac566a37265d7af2ce3c03703427ee0b2755c2bdfc29f9d826aec6ee4ad28af48079ac23db16580b97424f3a4e35cc23625d39f95699d9ff5143e9a2bc26fcfee4f125f5aa2d968ccfc2faaf9db3c28850f6757f735cbc50c94c498bcde4f23bffafa8dd5f70d1a011e35eb26e905d4e68848fedebeb197be595c085ba33f11ba8398258445051751888e9bba111f800f31b37c447074ca6dce6d54b4dfad6cee5138643d4f6ac045e8047248924e88ea4294c7878bc22c9b41924ce301f22693c33733107bf1ba85e34806c5e4366ea66fc52a5f89dd9bf213239158b3d4d2600dde696c61d76c398b9bf10de9118e812e891c8f3355c0ecc6405f79bc32a58905e37888a1d8395fbedc3ac54eca569f TAG = 296a397d280d026fc3627f4718971be9 # BoringSSL has additional tests here for truncated tags. *ring* doesn't # support tag truncation, so those tests were removed. ring-0.16.9/tests/aead_tests.rs000064400000000000000000000360651353224230700145730ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use core::ops::RangeFrom; use ring::{aead, error, test, test_file}; #[test] fn aead_aes_gcm_128() { test_aead( &aead::AES_128_GCM, seal_with_key, open_with_key, test_file!("aead_aes_128_gcm_tests.txt"), ); test_aead( &aead::AES_128_GCM, seal_with_less_safe_key, open_with_less_safe_key, test_file!("aead_aes_128_gcm_tests.txt"), ); } #[test] fn aead_aes_gcm_256() { test_aead( &aead::AES_256_GCM, seal_with_key, open_with_key, test_file!("aead_aes_256_gcm_tests.txt"), ); test_aead( &aead::AES_256_GCM, seal_with_less_safe_key, open_with_less_safe_key, test_file!("aead_aes_256_gcm_tests.txt"), ); } #[test] fn aead_chacha20_poly1305() { test_aead( &aead::CHACHA20_POLY1305, seal_with_key, open_with_key, test_file!("aead_chacha20_poly1305_tests.txt"), ); test_aead( &aead::CHACHA20_POLY1305, seal_with_less_safe_key, open_with_less_safe_key, test_file!("aead_chacha20_poly1305_tests.txt"), ); } fn test_aead( aead_alg: &'static aead::Algorithm, seal: Seal, open: Open, test_file: test::File, ) where Seal: Fn( &'static aead::Algorithm, &[u8], aead::Nonce, aead::Aad<&[u8]>, &mut Vec, ) -> Result<(), error::Unspecified>, Open: for<'a> Fn( &'static aead::Algorithm, &[u8], aead::Nonce, aead::Aad<&[u8]>, &'a mut [u8], RangeFrom, ) -> Result<&'a mut [u8], error::Unspecified>, { test_aead_key_sizes(aead_alg); test::run(test_file, |section, test_case| { assert_eq!(section, ""); let key_bytes = test_case.consume_bytes("KEY"); let nonce_bytes = test_case.consume_bytes("NONCE"); let plaintext = test_case.consume_bytes("IN"); let aad = test_case.consume_bytes("AD"); let mut ct = test_case.consume_bytes("CT"); let tag = test_case.consume_bytes("TAG"); let error = test_case.consume_optional_string("FAILS"); match &error { Some(err) if err == "WRONG_NONCE_LENGTH" => { assert!(aead::Nonce::try_assume_unique_for_key(&nonce_bytes).is_err()); return Ok(()); } _ => (), }; let mut s_in_out = plaintext.clone(); let nonce = aead::Nonce::try_assume_unique_for_key(&nonce_bytes).unwrap(); let s_result = seal( aead_alg, &key_bytes[..], nonce, aead::Aad::from(&aad[..]), &mut s_in_out, ); ct.extend(tag); if s_result.is_ok() { assert_eq!(&ct, &s_in_out); } // In release builds, test all prefix lengths from 0 to 4096 bytes. // Debug builds are too slow for this, so for those builds, only // test a smaller subset. // TLS record headers are 5 bytes long. // TLS explicit nonces for AES-GCM are 8 bytes long. static MINIMAL_IN_PREFIX_LENS: [usize; 36] = [ // No input prefix to overwrite; i.e. the opening is exactly // "in place." 0, 1, 2, // Proposed TLS 1.3 header (no explicit nonce). 5, 8, // Probably the most common use of a non-zero `in_prefix_len` // would be to write a decrypted TLS record over the top of the // TLS header and nonce. 5 /* record header */ + 8, /* explicit nonce */ // The stitched AES-GCM x86-64 code works on 6-block (96 byte) // units. Some of the ChaCha20 code is even weirder. 15, // The maximum partial AES block. 16, // One AES block. 17, // One byte more than a full AES block. 31, // 2 AES blocks or 1 ChaCha20 block, minus 1. 32, // Two AES blocks, one ChaCha20 block. 33, // 2 AES blocks or 1 ChaCha20 block, plus 1. 47, // Three AES blocks - 1. 48, // Three AES blocks. 49, // Three AES blocks + 1. 63, // Four AES blocks or two ChaCha20 blocks, minus 1. 64, // Four AES blocks or two ChaCha20 blocks. 65, // Four AES blocks or two ChaCha20 blocks, plus 1. 79, // Five AES blocks, minus 1. 80, // Five AES blocks. 81, // Five AES blocks, plus 1. 95, // Six AES blocks or three ChaCha20 blocks, minus 1. 96, // Six AES blocks or three ChaCha20 blocks. 97, // Six AES blocks or three ChaCha20 blocks, plus 1. 111, // Seven AES blocks, minus 1. 112, // Seven AES blocks. 113, // Seven AES blocks, plus 1. 127, // Eight AES blocks or four ChaCha20 blocks, minus 1. 128, // Eight AES blocks or four ChaCha20 blocks. 129, // Eight AES blocks or four ChaCha20 blocks, plus 1. 143, // Nine AES blocks, minus 1. 144, // Nine AES blocks. 145, // Nine AES blocks, plus 1. 255, // 16 AES blocks or 8 ChaCha20 blocks, minus 1. 256, // 16 AES blocks or 8 ChaCha20 blocks. 257, // 16 AES blocks or 8 ChaCha20 blocks, plus 1. ]; let mut more_comprehensive_in_prefix_lengths = [0; 4096]; let in_prefix_lengths; if cfg!(debug_assertions) { in_prefix_lengths = &MINIMAL_IN_PREFIX_LENS[..]; } else { for b in 0..more_comprehensive_in_prefix_lengths.len() { more_comprehensive_in_prefix_lengths[b] = b; } in_prefix_lengths = &more_comprehensive_in_prefix_lengths[..]; } let mut o_in_out = vec![123u8; 4096]; for in_prefix_len in in_prefix_lengths.iter() { o_in_out.truncate(0); for _ in 0..*in_prefix_len { o_in_out.push(123); } o_in_out.extend_from_slice(&ct[..]); let nonce = aead::Nonce::try_assume_unique_for_key(&nonce_bytes).unwrap(); let o_result = open( aead_alg, &key_bytes, nonce, aead::Aad::from(&aad[..]), &mut o_in_out, *in_prefix_len.., ); match error { None => { assert!(s_result.is_ok()); assert_eq!(&plaintext[..], o_result.unwrap()); } Some(ref error) if error == "WRONG_NONCE_LENGTH" => { assert_eq!(Err(error::Unspecified), s_result); assert_eq!(Err(error::Unspecified), o_result); } Some(error) => { unreachable!("Unexpected error test case: {}", error); } }; } Ok(()) }); } fn seal_with_key( algorithm: &'static aead::Algorithm, key: &[u8], nonce: aead::Nonce, aad: aead::Aad<&[u8]>, in_out: &mut Vec, ) -> Result<(), error::Unspecified> { let mut s_key: aead::SealingKey = make_key(algorithm, key, nonce); s_key.seal_in_place_append_tag(aad, in_out) } fn open_with_key<'a>( algorithm: &'static aead::Algorithm, key: &[u8], nonce: aead::Nonce, aad: aead::Aad<&[u8]>, in_out: &'a mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'a mut [u8], error::Unspecified> { let mut o_key: aead::OpeningKey = make_key(algorithm, key, nonce); o_key.open_within(aad, in_out, ciphertext_and_tag) } fn seal_with_less_safe_key( algorithm: &'static aead::Algorithm, key: &[u8], nonce: aead::Nonce, aad: aead::Aad<&[u8]>, in_out: &mut Vec, ) -> Result<(), error::Unspecified> { let key = make_less_safe_key(algorithm, key); key.seal_in_place_append_tag(nonce, aad, in_out) } fn open_with_less_safe_key<'a>( algorithm: &'static aead::Algorithm, key: &[u8], nonce: aead::Nonce, aad: aead::Aad<&[u8]>, in_out: &'a mut [u8], ciphertext_and_tag: RangeFrom, ) -> Result<&'a mut [u8], error::Unspecified> { let key = make_less_safe_key(algorithm, key); key.open_within(nonce, aad, in_out, ciphertext_and_tag) } fn test_aead_key_sizes(aead_alg: &'static aead::Algorithm) { let key_len = aead_alg.key_len(); let key_data = vec![0u8; key_len * 2]; // Key is the right size. assert!(aead::UnboundKey::new(aead_alg, &key_data[..key_len]).is_ok()); // Key is one byte too small. assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len - 1)]).is_err()); // Key is one byte too large. assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len + 1)]).is_err()); // Key is half the required size. assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len / 2)]).is_err()); // Key is twice the required size. assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len * 2)]).is_err()); // Key is empty. assert!(aead::UnboundKey::new(aead_alg, &[]).is_err()); // Key is one byte. assert!(aead::UnboundKey::new(aead_alg, &[0]).is_err()); } // Test that we reject non-standard nonce sizes. #[test] fn test_aead_nonce_sizes() -> Result<(), error::Unspecified> { let nonce_len = aead::NONCE_LEN; let nonce = vec![0u8; nonce_len * 2]; assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..nonce_len]).is_ok()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len - 1)]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len + 1)]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len / 2)]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len * 2)]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&[]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..1]).is_err()); assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..16]).is_err()); // 128 bits. Ok(()) } #[test] fn aead_chacha20_poly1305_openssh() { // TODO: test_aead_key_sizes(...); test::run( test_file!("aead_chacha20_poly1305_openssh_tests.txt"), |section, test_case| { assert_eq!(section, ""); // XXX: `polyfill::convert` isn't available here. let key_bytes = { let as_vec = test_case.consume_bytes("KEY"); let mut as_array = [0u8; aead::chacha20_poly1305_openssh::KEY_LEN]; as_array.copy_from_slice(&as_vec); as_array }; let sequence_number = test_case.consume_usize("SEQUENCE_NUMBER"); assert_eq!(sequence_number as u32 as usize, sequence_number); let sequence_num = sequence_number as u32; let plaintext = test_case.consume_bytes("IN"); let ct = test_case.consume_bytes("CT"); let expected_tag = test_case.consume_bytes("TAG"); // TODO: Add some tests for when things fail. //let error = test_case.consume_optional_string("FAILS"); let mut tag = [0u8; aead::chacha20_poly1305_openssh::TAG_LEN]; let mut s_in_out = plaintext.clone(); let s_key = aead::chacha20_poly1305_openssh::SealingKey::new(&key_bytes); let () = s_key.seal_in_place(sequence_num, &mut s_in_out[..], &mut tag); assert_eq!(&ct, &s_in_out); assert_eq!(&expected_tag, &tag); let o_key = aead::chacha20_poly1305_openssh::OpeningKey::new(&key_bytes); { let o_result = o_key.open_in_place(sequence_num, &mut s_in_out[..], &tag); assert_eq!(o_result, Ok(&plaintext[4..])); } assert_eq!(&s_in_out[..4], &ct[..4]); assert_eq!(&s_in_out[4..], &plaintext[4..]); Ok(()) }, ); } #[test] fn test_tag_traits() { test::compile_time_assert_send::(); test::compile_time_assert_sync::(); } #[test] fn test_aead_key_debug() { let key_bytes = [0; 32]; let nonce = [0; aead::NONCE_LEN]; let key = aead::UnboundKey::new(&aead::AES_256_GCM, &key_bytes).unwrap(); assert_eq!( "UnboundKey { algorithm: AES_256_GCM }", format!("{:?}", key) ); let sealing_key: aead::SealingKey = make_key( &aead::CHACHA20_POLY1305, &key_bytes, aead::Nonce::try_assume_unique_for_key(&nonce).unwrap(), ); assert_eq!( "SealingKey { algorithm: CHACHA20_POLY1305 }", format!("{:?}", sealing_key) ); let opening_key: aead::OpeningKey = make_key( &aead::AES_256_GCM, &key_bytes, aead::Nonce::try_assume_unique_for_key(&nonce).unwrap(), ); assert_eq!( "OpeningKey { algorithm: AES_256_GCM }", format!("{:?}", opening_key) ); let key: aead::LessSafeKey = make_less_safe_key(&aead::CHACHA20_POLY1305, &key_bytes); assert_eq!( "LessSafeKey { algorithm: CHACHA20_POLY1305 }", format!("{:?}", key) ); } fn make_key>( algorithm: &'static aead::Algorithm, key: &[u8], nonce: aead::Nonce, ) -> K { let key = aead::UnboundKey::new(algorithm, key).unwrap(); let nonce_sequence = OneNonceSequence::new(nonce); K::new(key, nonce_sequence) } fn make_less_safe_key(algorithm: &'static aead::Algorithm, key: &[u8]) -> aead::LessSafeKey { let key = aead::UnboundKey::new(algorithm, key).unwrap(); aead::LessSafeKey::new(key) } struct OneNonceSequence(Option); impl OneNonceSequence { /// Constructs the sequence allowing `advance()` to be called /// `allowed_invocations` times. fn new(nonce: aead::Nonce) -> Self { Self(Some(nonce)) } } impl aead::NonceSequence for OneNonceSequence { fn advance(&mut self) -> Result { self.0.take().ok_or(error::Unspecified) } } ring-0.16.9/tests/agreement_tests.rs000064400000000000000000000167001353037436100156460ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] extern crate alloc; use ring::{agreement, error, rand, test, test_file}; #[test] fn agreement_traits<'a>() { use alloc::vec::Vec; let rng = rand::SystemRandom::new(); let private_key = agreement::EphemeralPrivateKey::generate(&agreement::ECDH_P256, &rng).unwrap(); test::compile_time_assert_send::(); test::compile_time_assert_sync::(); assert_eq!( format!("{:?}", &private_key), "EphemeralPrivateKey { algorithm: Algorithm { curve: P256 } }" ); let public_key = private_key.compute_public_key().unwrap(); test::compile_time_assert_clone::(); test::compile_time_assert_send::(); test::compile_time_assert_sync::(); // Verify `PublicKey` implements `Debug`. // // TODO: Test the actual output. let _: &dyn core::fmt::Debug = &public_key; test::compile_time_assert_clone::>(); test::compile_time_assert_copy::>(); test::compile_time_assert_sync::>(); test::compile_time_assert_clone::>>(); test::compile_time_assert_sync::>>(); let unparsed_public_key = agreement::UnparsedPublicKey::new(&agreement::X25519, &[0x01, 0x02, 0x03]); assert_eq!( format!("{:?}", unparsed_public_key), r#"UnparsedPublicKey { algorithm: Algorithm { curve: Curve25519 }, bytes: "010203" }"# ); } #[test] fn agreement_agree_ephemeral() { let rng = rand::SystemRandom::new(); test::run(test_file!("agreement_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let alg = alg_from_curve_name(&curve_name); let peer_public = agreement::UnparsedPublicKey::new(alg, test_case.consume_bytes("PeerQ")); match test_case.consume_optional_string("Error") { None => { let my_private = test_case.consume_bytes("D"); let my_private = { let rng = test::rand::FixedSliceRandom { bytes: &my_private }; agreement::EphemeralPrivateKey::generate(alg, &rng)? }; let my_public = test_case.consume_bytes("MyQ"); let output = test_case.consume_bytes("Output"); assert_eq!(my_private.algorithm(), alg); let computed_public = my_private.compute_public_key().unwrap(); assert_eq!(computed_public.as_ref(), &my_public[..]); assert_eq!(my_private.algorithm(), alg); assert!( agreement::agree_ephemeral(my_private, &peer_public, (), |key_material| { assert_eq!(key_material, &output[..]); Ok(()) }) .is_ok() ); } Some(_) => { // In the no-heap mode, some algorithms aren't supported so // we have to skip those algorithms' test cases. let dummy_private_key = agreement::EphemeralPrivateKey::generate(alg, &rng)?; fn kdf_not_called(_: &[u8]) -> Result<(), ()> { panic!( "The KDF was called during ECDH when the peer's \ public key is invalid." ); } assert!(agreement::agree_ephemeral( dummy_private_key, &peer_public, (), kdf_not_called ) .is_err()); } } return Ok(()); }); } #[test] fn test_agreement_ecdh_x25519_rfc_iterated() { let mut k = h("0900000000000000000000000000000000000000000000000000000000000000"); let mut u = k.clone(); fn expect_iterated_x25519( expected_result: &str, range: core::ops::Range, k: &mut Vec, u: &mut Vec, ) { for _ in range { let new_k = x25519(k, u); *u = k.clone(); *k = new_k; } assert_eq!(&h(expected_result), k); } expect_iterated_x25519( "422c8e7a6227d7bca1350b3e2bb7279f7897b87bb6854b783c60e80311ae3079", 0..1, &mut k, &mut u, ); expect_iterated_x25519( "684cf59ba83309552800ef566f2f4d3c1c3887c49360e3875f2eb94d99532c51", 1..1_000, &mut k, &mut u, ); // The spec gives a test vector for 1,000,000 iterations but it takes // too long to do 1,000,000 iterations by default right now. This // 10,000 iteration vector is self-computed. expect_iterated_x25519( "2c125a20f639d504a7703d2e223c79a79de48c4ee8c23379aa19a62ecd211815", 1_000..10_000, &mut k, &mut u, ); if cfg!(feature = "slow_tests") { expect_iterated_x25519( "7c3911e0ab2586fd864497297e575e6f3bc601c0883c30df5f4dd2d24f665424", 10_000..1_000_000, &mut k, &mut u, ); } } fn x25519(private_key: &[u8], public_key: &[u8]) -> Vec { x25519_(private_key, public_key).unwrap() } fn x25519_(private_key: &[u8], public_key: &[u8]) -> Result, error::Unspecified> { let rng = test::rand::FixedSliceRandom { bytes: private_key }; let private_key = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; let public_key = agreement::UnparsedPublicKey::new(&agreement::X25519, public_key); agreement::agree_ephemeral( private_key, &public_key, error::Unspecified, |agreed_value| Ok(Vec::from(agreed_value)), ) } fn h(s: &str) -> Vec { match test::from_hex(s) { Ok(v) => v, Err(msg) => { panic!("{} in {}", msg, s); } } } fn alg_from_curve_name(curve_name: &str) -> &'static agreement::Algorithm { if curve_name == "P-256" { &agreement::ECDH_P256 } else if curve_name == "P-384" { &agreement::ECDH_P384 } else if curve_name == "X25519" { &agreement::X25519 } else { panic!("Unsupported curve: {}", curve_name); } } ring-0.16.9/tests/agreement_tests.txt000064400000000000000000001223411352416253600160420ustar0000000000000000# RFC 7748 (X25519) Test Vectors # # PeerQ is the "Input u-coordinate." # D is the "Input scalar." # XXX: MyQ is not provided in the RFC, so we calculated it ourselves. # Output is the "Output u-coordinate." Curve = X25519 PeerQ = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c D = a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4 MyQ = 1c9fd88f45606d932a80c71824ae151d15d73e77de38e8e000852e614fae7019 Output = c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552 Curve = X25519 PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493 D = 4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d MyQ = ff63fe57bfbf43fa3f563628b149af704d3db625369c49983650347a6a71e00e Output = 95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957 # Additional X25519 Test Vectors Curve = X25519 PeerQ = "" Error = Peer public key is empty. Curve = X25519 PeerQ = 00 Error = Peer public key is too short. Curve = X25519 PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a4 Error = Peer public key is too short. Curve = X25519 PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a49300 Error = Peer public key is too long (zero appended). Curve = X25519 PeerQ = 00e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493 Error = Peer public key is too long (zero prepended). # RFC 5903 (IKE and IKEv2 ECDH) Test Vectors # # PeerQ is (grx, gry) in uncompressed encoding. # D is i. # MyQ is (gix, giy) in uncompressed encoding. # Output is girx. Curve = P-256 PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB D = C88F01F510D9AC3F70A292DAA2316DE544E9AAB8AFE84049C62A9C57862D1433 MyQ = 04DAD0B65394221CF9B051E1FECA5787D098DFE637FC90B9EF945D0C37725811805271A0461CDB8252D61F1C456FA3E59AB1F45B33ACCF5F58389E0577B8990BB3 Output = D6840F6B42F6EDAFD13116E0E12565202FEF8E9ECE7DCE03812464D04B9442DE Curve = P-384 PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C D = 099F3C7034D4A2C699884D73A375A67F7624EF7C6B3C0F160647B67414DCE655E35B538041E649EE3FAEF896783AB194 MyQ = 04667842D7D180AC2CDE6F74F37551F55755C7645C20EF73E31634FE72B4C55EE6DE3AC808ACB4BDB4C88732AEE95F41AA9482ED1FC0EEB9CAFC4984625CCFC23F65032149E0E144ADA024181535A0F38EEB9FCFF3C2C947DAE69B4C634573A81C Output = 11187331C279962D93D604243FD592CB9D0A926F422E47187521287E7156C5C4D603135569B9E9D09CF5D4A270F59746 # Tweaks of the RFC 5903 vectors for testing malformed (syntactically) public # keys Curve = P-256 PeerQ = "" Error = Peer public key is empty. Curve = P-384 PeerQ = "" Error = Peer public key is empty. Curve = P-256 PeerQ = 00 Error = Peer public key is the special encoding of the point at infinity. Curve = P-384 PeerQ = 00 Error = Peer public key is the special encoding of the point at infinity. Curve = P-256 PeerQ = 01 Error = Peer public key consists of (only) an invalid encoding indicator. Curve = P-384 PeerQ = 01 Error = Peer public key consists of (only) an invalid encoding indicator. Curve = P-256 PeerQ = 02 Error = Peer public key consists of (only) a compressed encoding indicator (0x02). Curve = P-384 PeerQ = 02 Error = Peer public key consists of (only) a compressed encoding indicator (0x02). Curve = P-256 PeerQ = 03 Error = Peer public key consists of (only) a compressed encoding indicator (0x03). Curve = P-384 PeerQ = 03 Error = Peer public key consists of (only) a compressed encoding indicator (0x03). Curve = P-256 PeerQ = 04 Error = Peer public key consists of (only) a uncompressed encoding indicator. Curve = P-384 PeerQ = 04 Error = Peer public key consists of (only) a compressed encoding indicator. Curve = P-256 PeerQ = 04 Error = Peer public key consists of (only) an invalid encoding indicator (0x05). Curve = P-384 PeerQ = 04 Error = Peer public key consists of (only) an invalid encoding indicator (0x05). Curve = P-256 PeerQ = 01D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key starts with a completely invalid encoding indicator byte (0x01). Curve = P-384 PeerQ = 01E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key starts with a completely invalid encoding indicator byte (0x01). Curve = P-256 PeerQ = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key encoding's first byte is 0x02, should be 0x04. Curve = P-384 PeerQ = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key encoding's first byte is 0x02, should be 0x04. Curve = P-256 PeerQ = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key encoding's first byte is 0x03, should be 0x04. Curve = P-384 PeerQ = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key encoding's first byte is 0x03, should be 0x04. Curve = P-256 PeerQ = 05D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key starts with a completely invalid encoding indicator byte (0x05). Curve = P-384 PeerQ = 05E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key starts with a completely invalid encoding indicator byte (0x05). Curve = P-256 PeerQ = FFD12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key starts with a completely invalid encoding indicator byte (0xff). Curve = P-384 PeerQ = FFE558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key starts with a completely invalid encoding indicator byte (0xff). Curve = P-256 PeerQ = D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB Error = Peer public key is missing the encoding indicator byte. Curve = P-384 PeerQ = E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C Error = Peer public key is missing the encoding indicator byte. Curve = P-256 PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872 Error = Peer public key has the last byte truncated. Curve = P-384 PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E638 Error = Peer public key has the last byte truncated. Curve = P-256 PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Error = Peer public key is missing the Y coordinate completely. Curve = P-384 PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Error = Peer public key is missing the Y coordinate completely. Curve = P-256 PeerQ = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Error = Peer public key is in compressed form (0x02). Curve = P-384 PeerQ = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Error = Peer public key is in compressed form (0x02). Curve = P-256 PeerQ = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 Error = Peer public key is in compressed form (0x03). Curve = P-384 PeerQ = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 Error = Peer public key is in compressed form (0x03). # NIST vectors from # http://csrc.nist.gov/groups/STM/cavp/documents/components/ecccdhtestvectors.zip # # Only P-256 and P-384 vectors were copied. The "[P-256]" and "[P-384]" # headings were replaced with "Curve = P-256" and "Curve = P-384" on each test # case. # # PeerQ is (QCAVSx, QCAVSy) in uncompressed encoding. # D is dIUT. # MyQ is (QIUTx, QIUTy) in uncompressed encoding. # Output is ZIUT. # # Note that these test vectors don't seem to test any interesting edge cases, # and in particular they don't test any cases where the public point is # invalid. Curve = P-256 PeerQ = 04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac D = 7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 MyQ = 04ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b23028af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141 Output = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b Curve = P-256 PeerQ = 04809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3 D = 38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5 MyQ = 04119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d08f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d Output = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67 Curve = P-256 PeerQ = 04a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536 D = 1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8 MyQ = 04d9f2b79c172845bfdb560bbb01447ca5ecc0470a09513b6126902c6b4f8d1051f815ef5ec32128d3487834764678702e64e164ff7315185e23aff5facd96d7bc Output = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec Curve = P-256 PeerQ = 04df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4 D = 207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d MyQ = 0424277c33f450462dcb3d4801d57b9ced05188f16c28eda873258048cd1607e0dc4789753e2b1f63b32ff014ec42cd6a69fac81dfe6d0d6fd4af372ae27c46f88 Output = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024 Curve = P-256 PeerQ = 0441192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb9221af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328 D = 59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf MyQ = 04a8c5fdce8b62c5ada598f141adb3b26cf254c280b2857a63d2ad783a73115f6b806e1aafec4af80a0d786b3de45375b517a7e5b51ffb2c356537c9e6ef227d4a Output = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62 Curve = P-256 PeerQ = 0433e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f D = f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef MyQ = 047b861dcd2844a5a8363f6b8ef8d493640f55879217189d80326aad9480dfc149c4675b45eeb306405f6c33c38bc69eb2bdec9b75ad5af4706aab84543b9cc63a Output = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3 Curve = P-256 PeerQ = 046a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba740f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05 D = 3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190 MyQ = 049fb38e2d58ea1baf7622e96720101cae3cde4ba6c1e9fa26d9b1de0899102863d5561b900406edf50802dd7d73e89395f8aed72fba0e1d1b61fe1d22302260f0 Output = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d Curve = P-256 PeerQ = 04a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bbf6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229 D = d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8 MyQ = 0420f07631e4a6512a89ad487c4e9d63039e579cb0d7a556cb9e661cd59c1e7fa46de91846b3eee8a5ec09c2ab1f41e21bd83620ccdd1bdce3ab7ea6e02dd274f5 Output = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489 Curve = P-256 PeerQ = 0494e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a D = 0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d MyQ = 04abb61b423be5d6c26e21c605832c9142dc1dfe5a5fff28726737936e6fbf516d733d2513ef58beab202090586fac91bf0fee31e80ab33473ab23a2d89e58fad6 Output = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4 Curve = P-256 PeerQ = 04e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274fd9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5 D = 2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08 MyQ = 043d63e429cb5fa895a9247129bf4e48e89f35d7b11de8158efeb3e106a2a873950cae9e477ef41e7c8c1064379bb7b554ddcbcae79f9814281f1e50f0403c61f3 Output = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b Curve = P-256 PeerQ = 04f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff0165833bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c D = 77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848 MyQ = 04ad5d13c3db508ddcd38457e5991434a251bed49cf5ddcb59cdee73865f138c9f62cec1e70588aa4fdfc7b9a09daa678081c04e1208b9d662b8a2214bf8e81a21 Output = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3 Curve = P-256 PeerQ = 042db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e D = 42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e MyQ = 04ab48caa61ea35f13f8ed07ffa6a13e8db224dfecfae1a7df8b1bb6ebaf0cb97d1274530ca2c385a3218bddfbcbf0b4024c9badd5243bff834ebff24a8618dccb Output = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a Curve = P-256 PeerQ = 04cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecbc3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4 D = ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b MyQ = 049a8cd9bd72e71752df91440f77c547509a84df98114e7de4f26cdb39234a625dd07cfc84c8e144fab2839f5189bb1d7c88631d579bbc58012ed9a2327da52f62 Output = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307 Curve = P-256 PeerQ = 0415b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77 D = 43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604 MyQ = 04f989cf8ee956a82e7ebd9881cdbfb2fd946189b08db53559bc8cfdd48071eb145eff28f1a18a616b04b7d337868679f6dd84f9a7b3d7b6f8af276c19611a541d Output = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96 Curve = P-256 PeerQ = 0449c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa18af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924 D = b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903 MyQ = 0469c627625b36a429c398b45c38677cb35d8beb1cf78a571e40e99fe4eac1cd4e81690112b0a88f20f7136b28d7d47e5fbc2ada3c8edd87589bc19ec9590637bd Output = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf Curve = P-256 PeerQ = 0419b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae D = 4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8 MyQ = 045fe964671315a18aa68a2a6e3dd1fde7e23b8ce7181471cfac43c99e1ae80262d5827be282e62c84de531b963884ba832db5d6b2c3a256f0e604fe7e6b8a7f72 Output = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343 Curve = P-256 PeerQ = 042c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b0999546cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0 D = 4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147 MyQ = 04c9b2b8496f1440bd4a2d1e52752fd372835b364885e154a7dac49295f281ec7cfbe6b926a8a4de26ccc83b802b1212400754be25d9f3eeaf008b09870ae76321 Output = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78 Curve = P-256 PeerQ = 04a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03 D = 1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e MyQ = 0459e1e101521046ad9cf1d082e9d2ec7dd22530cce064991f1e55c5bcf5fcb591482f4f673176c8fdaa0bb6e59b15a3e47454e3a04297d3863c9338d98add1f37 Output = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f Curve = P-256 PeerQ = 04a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a D = dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3 MyQ = 0430b9db2e2e977bcdc98cb87dd736cbd8e78552121925cf16e1933657c2fb23146a45028800b81291bce5c2e1fed7ded650620ebbe6050c6f3a7f0dfb4673ab5c Output = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c Curve = P-256 PeerQ = 04ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01fe9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38 D = 5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76 MyQ = 0446c9ebd1a4a3c8c0b6d572b5dcfba12467603208a9cb5d2acfbb733c40cf639146c913a27d044185d38b467ace011e04d4d9bbbb8cb9ae25fa92aaf15a595e86 Output = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3 Curve = P-256 PeerQ = 04c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4ebf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051 D = b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d MyQ = 047c9e950841d26c8dde8994398b8f5d475a022bc63de7773fcf8d552e01f1ba0acc42b9885c9b3bee0f8d8c57d3a8f6355016c019c4062fa22cff2f209b5cc2e1 Output = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660 Curve = P-256 PeerQ = 04317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb609420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae D = fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535 MyQ = 0438b54db85500cb20c61056edd3d88b6a9dc26780a047f213a6e1b900f76596eb6387e4e5781571e4eb8ae62991a33b5dc33301c5bc7e125d53794a39160d8fd0 Output = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0 Curve = P-256 PeerQ = 0445fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb15c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321 D = 334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce MyQ = 043f2bf1589abf3047bf3e54ac9a95379bff95f8f55405f64eca36a7eebe8ffca75212a94e66c5ae9a8991872f66a72723d80ec5b2e925745c456f5371943b3a06 Output = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c Curve = P-256 PeerQ = 04a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef D = 2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d MyQ = 0429c0807f10cbc42fb45c9989da50681eead716daa7b9e91fd32e062f5eb92ca0ff1d6d1955d7376b2da24fe1163a271659136341bc2eb1195fc706dc62e7f34d Output = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b Curve = P-256 PeerQ = 04356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92 D = 85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 MyQ = 049cf4b98581ca1779453cc816ff28b4100af56cf1bf2e5bc312d83b6b1b21d3337a5504fcac5231a0d12d658218284868229c844a04a3450d6c7381abe080bf3b Output = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857 Curve = P-384 PeerQ = 04a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a D = 3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1 MyQ = 049803807f2f6d2fd966cdd0290bd410c0190352fbec7ff6247de1302df86f25d34fe4a97bef60cff548355c015dbb3e5fba26ca69ec2f5b5d9dad20cc9da711383a9dbe34ea3fa5a2af75b46502629ad54dd8b7d73a8abb06a3a3be47d650cc99 Output = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1 Curve = P-384 PeerQ = 0430f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e025e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757 D = 92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783 MyQ = 04ea4018f5a307c379180bf6a62fd2ceceebeeb7d4df063a66fb838aa35243419791f7e2c9d4803c9319aa0eb03c416b6668835a91484f05ef028284df6436fb88ffebabcdd69ab0133e6735a1bcfb37203d10d340a8328a7b68770ca75878a1a6 Output = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff Curve = P-384 PeerQ = 041aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3 D = 12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853 MyQ = 04fcfcea085e8cf74d0dced1620ba8423694f903a219bbf901b0b59d6ac81baad316a242ba32bde85cb248119b852fab66972e3c68c7ab402c5836f2a16ed451a33120a7750a6039f3ff15388ee622b7065f7122bf6d51aefbc29b37b03404581b Output = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435 Curve = P-384 PeerQ = 048bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7 D = 8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1 MyQ = 04e38c9846248123c3421861ea4d32669a7b5c3c08376ad28104399494c84ff5efa3894adb2c6cbe8c3c913ef2eec5bd3c9fa84024a1028796df84021f7b6c9d02f0f4bd1a612a03cbf75a0beea43fef8ae84b48c60172aadf09c1ad016d0bf3ce Output = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854 Curve = P-384 PeerQ = 04eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1 D = 84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f MyQ = 043222063a2997b302ee60ee1961108ff4c7acf1c0ef1d5fb0d164b84bce71c431705cb9aea9a45f5d73806655a058bee3e61fa9e7fbe7cd43abf99596a3d3a039e99fa9dc93b0bdd9cad81966d17eeaf557068afa7c78466bb5b22032d1100fa6 Output = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405 Curve = P-384 PeerQ = 04441d029e244eb7168d647d4df50db5f4e4974ab3fdaf022aff058b3695d0b8c814cc88da6285dc6df1ac55c553885003e8025ac23a41d4b1ea2aa46c50c6e479946b59b6d76497cd9249977e0bfe4a6262622f13d42a3c43d66bdbb30403c345 D = 68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b MyQ = 04868be0e694841830e424d913d8e7d86b84ee1021d82b0ecf523f09fe89a76c0c95c49f2dfbcf829c1e39709d55efbb3b9195eb183675b40fd92f51f37713317e4a9b4f715c8ab22e0773b1bc71d3a219f05b8116074658ee86b52e36f3897116 Output = ba69f0acdf3e1ca95caaac4ecaf475bbe51b54777efce01ca381f45370e486fe87f9f419b150c61e329a286d1aa265ec Curve = P-384 PeerQ = 043d4e6bf08a73404accc1629873468e4269e82d90d832e58ad72142639b5a056ad8d35c66c60e8149fac0c797bceb7c2f9b0308dc7f0e6d29f8c277acbc65a21e5adb83d11e6873bc0a07fda0997f482504602f59e10bc5cb476b83d0a4f75e71 D = b1764c54897e7aae6de9e7751f2f37de849291f88f0f91093155b858d1cc32a3a87980f706b86cc83f927bdfdbeae0bd MyQ = 04c371222feaa6770c6f3ea3e0dac9740def4fcf821378b7f91ff937c21e0470f70f3a31d5c6b2912195f10926942b48ae047d6b4d765123563f81116bc665b7b8cc6207830d805fd84da7cb805a65baa7c12fd592d1b5b5e3e65d9672a9ef7662 Output = 1a6688ee1d6e59865d8e3ada37781d36bb0c2717eef92e61964d3927cb765c2965ea80f7f63e58c322ba0397faeaf62b Curve = P-384 PeerQ = 04f5f6bef1d110da03be0017eac760cc34b24d092f736f237bc7054b3865312a813bcb62d297fb10a4f7abf54708fe2d3d06fdf8d7dc032f4e10010bf19cbf6159321252ff415fb91920d438f24e67e60c2eb0463204679fa356af44cea9c9ebf5 D = f0f7a96e70d98fd5a30ad6406cf56eb5b72a510e9f192f50e1f84524dbf3d2439f7287bb36f5aa912a79deaab4adea82 MyQ = 0499c8c41cb1ab5e0854a346e4b08a537c1706a61553387c8d94943ab15196d40dbaa55b8210a77a5d00915f2c4ea69eab5531065bdcf17bfb3cb55a02e41a57c7f694c383ad289f900fbd656c2233a93c92e933e7a26f54cbb56f0ad875c51bb0 Output = d06a568bf2336b90cbac325161be7695eacb2295f599500d787f072612aca313ee5d874f807ddef6c1f023fe2b6e7cd0 Curve = P-384 PeerQ = 047cdec77e0737ea37c67b89b7137fe38818010f4464438ee4d1d35a0c488cad3fde2f37d00885d36d3b795b9f93d23a6728c42ee8d6027c56cf979ba4c229fdb01d234944f8ac433650112c3cf0f02844e888a3569dfef7828a8a884589aa055e D = 9efb87ddc61d43c482ba66e1b143aef678fbd0d1bebc2000941fabe677fe5b706bf78fce36d100b17cc787ead74bbca2 MyQ = 044c34efee8f0c95565d2065d1bbac2a2dd25ae964320eb6bccedc5f3a9b42a881a1afca1bb6b880584fa27b01c193cd92d8fb01dbf7cd0a3868c26b951f393c3c56c2858cee901f7793ff5d271925d13a41f8e52409f4eba1990f33acb0bac669 Output = bb3b1eda9c6560d82ff5bee403339f1e80342338a991344853b56b24f109a4d94b92f654f0425edd4c205903d7586104 Curve = P-384 PeerQ = 048eeea3a319c8df99fbc29cb55f243a720d95509515ee5cc587a5c5ae22fbbd009e626db3e911def0b99a4f7ae304b1ba73877dc94db9adddc0d9a4b24e8976c22d73c844370e1ee857f8d1b129a3bd5f63f40caf3bd0533e38a5f5777074ff9e D = d787a57fde22ec656a0a525cf3c738b30d73af61e743ea90893ecb2d7b622add2f94ee25c2171467afb093f3f84d0018 MyQ = 04171546923b87b2cbbad664f01ce932bf09d6a6118168678446bfa9f0938608cb4667a98f4ec8ac1462285c2508f74862fa41cb4db68ae71f1f8a3e8939dc52c2dec61a83c983beb2a02baf29ec49278088882ed0cf56c74b5c173b552ccf63cf Output = 1e97b60add7cb35c7403dd884c0a75795b7683fff8b49f9d8672a8206bfdcf0a106b8768f983258c74167422e44e4d14 Curve = P-384 PeerQ = 04a721f6a2d4527411834b13d4d3a33c29beb83ab7682465c6cbaf6624aca6ea58c30eb0f29dd842886695400d7254f20f14ba6e26355109ad35129366d5e3a640ae798505a7fa55a96a36b5dad33de00474f6670f522214dd7952140ab0a7eb68 D = 83d70f7b164d9f4c227c767046b20eb34dfc778f5387e32e834b1e6daec20edb8ca5bb4192093f543b68e6aeb7ce788b MyQ = 0457cd770f3bbcbe0c78c770eab0b169bc45e139f86378ffae1c2b16966727c2f2eb724572b8f3eb228d130db4ff862c637ec5c8813b685558d83e924f14bc719f6eb7ae0cbb2c474227c5bda88637a4f26c64817929af999592da6f787490332f Output = 1023478840e54775bfc69293a3cf97f5bc914726455c66538eb5623e218feef7df4befa23e09d77145ad577db32b41f9 Curve = P-384 PeerQ = 04d882a8505c2d5cb9b8851fc676677bb0087681ad53faceba1738286b45827561e7da37b880276c656cfc38b32ade847e34b314bdc134575654573cffaf40445da2e6aaf987f7e913cd4c3091523058984a25d8f21da8326192456c6a0fa5f60c D = 8f558e05818b88ed383d5fca962e53413db1a0e4637eda194f761944cbea114ab9d5da175a7d57882550b0e432f395a9 MyQ = 049a2f57f4867ce753d72b0d95195df6f96c1fae934f602efd7b6a54582f556cfa539d89005ca2edac08ad9b72dd1f60bad9b94ee82da9cc601f346044998ba387aee56404dc6ecc8ab2b590443319d0b2b6176f9d0eac2d44678ed561607d09a9 Output = 6ad6b9dc8a6cf0d3691c501cbb967867f6e4bbb764b60dbff8fcff3ed42dbba39d63cf325b4b4078858495ddee75f954 Curve = P-384 PeerQ = 04815c9d773dbf5fb6a1b86799966247f4006a23c92e68c55e9eaa998b17d8832dd4d84d927d831d4f68dac67c6488219fe79269948b2611484560fd490feec887cb55ef99a4b524880fa7499d6a07283aae2afa33feab97deca40bc606c4d8764 D = 0f5dee0affa7bbf239d5dff32987ebb7cf84fcceed643e1d3c62d0b3352aec23b6e5ac7fa4105c8cb26126ad2d1892cb MyQ = 0423346bdfbc9d7c7c736e02bdf607671ff6082fdd27334a8bc75f3b23681ebe614d0597dd614fae58677c835a9f0b273b82ba36290d2f94db41479eb45ab4eaf67928a2315138d59eecc9b5285dfddd6714f77557216ea44cc6fc119d8243efaf Output = cc9e063566d46b357b3fcae21827377331e5e290a36e60cd7c39102b828ae0b918dc5a02216b07fe6f1958d834e42437 Curve = P-384 PeerQ = 041c0eeda7a2be000c5bdcda0478aed4db733d2a9e341224379123ad847030f29e3b168fa18e89a3c0fba2a6ce1c28fc3bec8c1c83c118c4dbea94271869f2d868eb65e8b44e21e6f14b0f4d9b38c068daefa27114255b9a41d084cc4a1ad85456 D = 037b633b5b8ba857c0fc85656868232e2febf59578718391b81da8541a00bfe53c30ae04151847f27499f8d7abad8cf4 MyQ = 048878ac8a947f7d5cb2b47aad24fbb8210d86126585399a2871f84aa9c5fde3074ae540c6bf82275ca822d0feb862bc74632f5cd2f900c2711c32f8930728eb647d31edd8d650f9654e7d33e5ed1b475489d08daa30d8cbcba6bfc3b60d9b5a37 Output = deff7f03bd09865baf945e73edff6d5122c03fb561db87dec8662e09bed4340b28a9efe118337bb7d3d4f7f568635ff9 Curve = P-384 PeerQ = 04c95c185e256bf997f30b311548ae7f768a38dee43eeeef43083f3077be70e2bf39ac1d4daf360c514c8c6be623443d1a3e63a663eaf75d8a765ab2b9a35513d7933fa5e26420a5244550ec6c3b6f033b96db2aca3d6ac6aab052ce929595aea5 D = e3d07106bedcc096e7d91630ffd3094df2c7859db8d7edbb2e37b4ac47f429a637d06a67d2fba33838764ef203464991 MyQ = 04e74a1a2b85f1cbf8dbbdf050cf1aff8acb02fda2fb6591f9d3cfe4e79d0ae938a9c1483e7b75f8db24505d65065cdb181773ee591822f7abaa856a1a60bc0a5203548dbd1cb5025466eff8481bd07614eaa04a16c3db76905913e972a5b6b59d Output = c8b1038f735ad3bb3e4637c3e47eab487637911a6b7950a4e461948329d3923b969e5db663675623611a457fcda35a71 Curve = P-384 PeerQ = 043497238a7e6ad166df2dac039aa4dac8d17aa925e7c7631eb3b56e3aaa1c545fcd54d2e5985807910fb202b1fc191d2aa49e5c487dcc7aa40a8f234c979446040d9174e3ad357d404d7765183195aed3f913641b90c81a306ebf0d8913861316 D = f3f9b0c65a49a506632c8a45b10f66b5316f9eeb06fae218f2da62333f99905117b141c760e8974efc4af10570635791 MyQ = 04a4ad77aa7d86e5361118a6b921710c820721210712f4c347985fdee58aa4effa1e28be80a17b120b139f96300f89b49b1ddf22e07e03f1560d8f45a480094560dba9fae7f9531130c1b57ebb95982496524f31d3797793396fa823f22bdb4328 Output = d337eaa32b9f716b8747b005b97a553c59dab0c51df41a2d49039cdae705aa75c7b9e7bc0b6a0e8c578c902bc4fff23e Curve = P-384 PeerQ = 0490a34737d45b1aa65f74e0bd0659bc118f8e4b774b761944ffa6573c6df4f41dec0d11b697abd934d390871d4b4532409b590719bb3307c149a7817be355d684893a307764b512eeffe07cb699edb5a6ffbf8d6032e6c79d5e93e94212c2aa4e D = 59fce7fad7de28bac0230690c95710c720e528f9a4e54d3a6a8cd5fc5c5f21637031ce1c5b4e3d39647d8dcb9b794664 MyQ = 049c43bf971edf09402876ee742095381f78b1bd3aa39b5132af75dbfe7e98bd78bde10fe2e903c2b6379e1deee175a1b0a6c58ecea5a477bb01bd543b339f1cc49f1371a2cda4d46eb4e53e250597942351a99665a122ffea9bde0636c375daf2 Output = 32d292b695a4488e42a7b7922e1ae537d76a3d21a0b2e36875f60e9f6d3e8779c2afb3a413b9dd79ae18e70b47d337c1 Curve = P-384 PeerQ = 04dda546acfc8f903d11e2e3920669636d44b2068aeb66ff07aa266f0030e1535b0ed0203cb8a460ac990f1394faf22f1d15bbb2597913035faadf413476f4c70f7279769a40c986f470c427b4ee4962abdf8173bbad81874772925fd32f0b159f D = 3e49fbf950a424c5d80228dc4bc35e9f6c6c0c1d04440998da0a609a877575dbe437d6a5cedaa2ddd2a1a17fd112aded MyQ = 045a949594228b1a3d6f599eb3db0d06070fbc551c657b58234ba164ce3fe415fa5f3eb823c08dc29b8c341219c77b6b3d2baad447c8c290cfed25edd9031c41d0b76921457327f42db31122b81f337bbf0b1039ec830ce9061a3761953c75e4a8 Output = 1220e7e6cad7b25df98e5bbdcc6c0b65ca6c2a50c5ff6c41dca71e475646fd489615979ca92fb4389aeadefde79a24f1 Curve = P-384 PeerQ = 04788be2336c52f4454d63ee944b1e49bfb619a08371048e6da92e584eae70bde1f171c4df378bd1f3c0ab03048a2378024673ebd8db604eaf41711748bab2968a23ca4476ce144e728247f08af752929157b5830f1e26067466bdfa8b65145a33 D = 50ccc1f7076e92f4638e85f2db98e0b483e6e2204c92bdd440a6deea04e37a07c6e72791c190ad4e4e86e01efba84269 MyQ = 04756c07df0ce32c839dac9fb4733c9c28b70113a676a7057c38d223f22a3a9095a8d564653af528e04c7e1824be4a651217c2ce6962cbd2a2e066297b39d57dd9bb4680f0191d390f70b4e461419b2972ce68ad46127fdda6c39195774ea86df3 Output = 793bb9cd22a93cf468faf804a38d12b78cb12189ec679ddd2e9aa21fa9a5a0b049ab16a23574fe04c1c3c02343b91beb Curve = P-384 PeerQ = 04d09bb822eb99e38060954747c82bb3278cf96bbf36fece3400f4c873838a40c135eb3babb9293bd1001bf3ecdee7bf26d416db6e1b87bbb7427788a3b6c7a7ab2c165b1e366f9608df512037584f213a648d47f16ac326e19aae972f63fd76c9 D = 06f132b71f74d87bf99857e1e4350a594e5fe35533b888552ceccbc0d8923c902e36141d7691e28631b8bc9bafe5e064 MyQ = 042a3cc6b8ff5cde926e7e3a189a1bd029c9b586351af8838f4f201cb8f4b70ef3b0da06d352c80fc26baf8f42b784459ebf9985960176da6d23c7452a2954ffcbbcb24249b43019a2a023e0b3dabd461f19ad3e775c364f3f11ad49f3099400d3 Output = 012d191cf7404a523678c6fc075de8285b243720a903047708bb33e501e0dbee5bcc40d7c3ef6c6da39ea24d830da1e8 Curve = P-384 PeerQ = 0413741262ede5861dad71063dfd204b91ea1d3b7c631df68eb949969527d79a1dc59295ef7d2bca6743e8cd77b04d1b580baaeadc7e19d74a8a04451a135f1be1b02fe299f9dc00bfdf201e83d995c6950bcc1cb89d6f7b30bf54656b9a4da586 D = 12048ebb4331ec19a1e23f1a2c773b664ccfe90a28bfb846fc12f81dff44b7443c77647164bf1e9e67fd2c07a6766241 MyQ = 04bc18836bc7a9fdf54b5352f37d7528ab8fa8ec544a8c6180511cbfdd49cce377c39e34c031b5240dc9980503ed2f262c8086cbe338191080f0b7a16c7afc4c7b0326f9ac66f58552ef4bb9d24de3429ed5d3277ed58fcf48f2b5f61326bec6c6 Output = ad0fd3ddffe8884b9263f3c15fe1f07f2a5a22ffdc7e967085eea45f0cd959f20f18f522763e28bcc925e496a52dda98 Curve = P-384 PeerQ = 049e22cbc18657f516a864b37b783348b66f1aa9626cd631f4fa1bd32ad88cf11db52057c660860d39d11fbf024fabd4446b0d53c79681c28116df71e9cee74fd56c8b7f04b39f1198cc72284e98be9562e35926fb4f48a9fbecafe729309e8b6f D = 34d61a699ca576169fcdc0cc7e44e4e1221db0fe63d16850c8104029f7d48449714b9884328cae189978754ab460b486 MyQ = 04867f81104ccd6b163a7902b670ef406042cb0cce7dcdc63d1dfc91b2c40e3cdf7595834bf9eceb79849f1636fc8462fc9d4bde8e875ec49697d258d1d59465f8431c6f5531e1c59e9f9ebe3cf164a8d9ce10a12f1979283a959bad244dd83863 Output = dc4ca392dc15e20185f2c6a8ea5ec31dfc96f56153a47394b3072b13d0015f5d4ae13beb3bed54d65848f9b8383e6c95 Curve = P-384 PeerQ = 042db5da5f940eaa884f4db5ec2139b0469f38e4e6fbbcc52df15c0f7cf7fcb1808c749764b6be85d2fdc5b16f58ad5dc022e8b02dcf33e1b5a083849545f84ad5e43f77cb71546dbbac0d11bdb2ee202e9d3872e8d028c08990746c5e1dde9989 D = dc60fa8736d702135ff16aab992bb88eac397f5972456c72ec447374d0d8ce61153831bfc86ad5a6eb5b60bfb96a862c MyQ = 04b69beede85d0f829fec1b893ccb9c3e052ff692e13b974537bc5b0f9feaf7b22e84f03231629b24866bdb4b8cf90891466f85e2bfcaba2843285b0e14ebc07ef7dafff8b424416fee647b59897b619f20eed95a632e6a4206bf7da429c04c560 Output = d765b208112d2b9ed5ad10c4046e2e3b0dbf57c469329519e239ac28b25c7d852bf757d5de0ee271cadd021d86cfd347 Curve = P-384 PeerQ = 04329647baa354224eb4414829c5368c82d7893b39804e08cbb2180f459befc4b347a389a70c91a23bd9d30c83be5295d3cc8f61923fad2aa8e505d6cfa126b9fabd5af9dce290b75660ef06d1caa73681d06089c33bc4246b3aa30dbcd2435b12 D = 6fa6a1c704730987aa634b0516a826aba8c6d6411d3a4c89772d7a62610256a2e2f289f5c3440b0ec1e70fa339e251ce MyQ = 0453de1fc1328e8de14aecab29ad8a40d6b13768f86f7d298433d20fec791f86f8bc73f358098b256a298bb488de257bf4ac28944fd27f17b82946c04c66c41f0053d3692f275da55cd8739a95bd8cd3af2f96e4de959ea8344d8945375905858b Output = d3778850aeb58804fbe9dfe6f38b9fa8e20c2ca4e0dec335aafceca0333e3f2490b53c0c1a14a831ba37c4b9d74be0f2 Curve = P-384 PeerQ = 0429d8a36d22200a75b7aea1bb47cdfcb1b7fd66de967041434728ab5d533a060df732130600fe6f75852a871fb2938e39e19b53db528395de897a45108967715eb8cb55c3fcbf23379372c0873a058d57544b102ecce722b2ccabb1a603774fd5 D = 74ad8386c1cb2ca0fcdeb31e0869bb3f48c036afe2ef110ca302bc8b910f621c9fcc54cec32bb89ec7caa84c7b8e54a8 MyQ = 0427a3e83cfb9d5122e73129d801615857da7cc089cccc9c54ab3032a19e0a0a9f677346e37f08a0b3ed8da6e5dd6910638d60e44aa5e0fd30c918456796af37f0e41957901645e5c596c6d989f5859b03a0bd7d1f4e77936fff3c74d204e5388e Output = 81e1e71575bb4505498de097350186430a6242fa6c57b85a5f984a23371123d2d1424eefbf804258392bc723e4ef1e35 # Test vectors from NIST where the peer's public key validation fails. # # These vectors were taken from the file # KASValidityTest_ECCEphemeralUnified_KDFConcat_NOKC_init.fax in # http://csrc.nist.gov/groups/STM/cavp/documents/keymgmt/KASTestVectorsECC2014.zip # accessible via # http://csrc.nist.gov/groups/STM/cavp/key-establishment.html#test-vectors. # # Only the test vectors where the test fails because the peer's public key is # invalid are included here. Supporting the other vectors would require # implementing an entire key exchange protocol; since the omitted test vectors # don't seem to stress any *edge cases* of the *ECDH* step of the key exchange # protocol, they don't seem valuable. # # PeerQ = (QeCAVSx, QeCAVSy) in uncompressed encoding. # Error is the error text from the Result field. The errors reference # "PKV 5.6.2.5" which is section 5.6.2.5 of # http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf # which is section 5.6.2.3.2/5.6.2.3.3 of # http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf # [EC - SHA-256, COUNT = 4] Curve = P-256 PeerQ = 04eec6ea7be0362fa496af12e551982a7d9c06b5ef735fadc37990c78ab9be87f4f45058db687e98326036c88eb846476a05385d7bda1d6dd6ca600499b7cc613f Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [EC - SHA-256, COUNT = 12] Curve = P-256 PeerQ = 0439883b3aadd78b044dadbd9be6a2cc8360da8df4241a4d11665a14e1ce17d19296d5cc675c252d902da5118245e738d57442ca042add79f1d07752bb98a7b805 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA-256, COUNT = 12] Curve = P-256 PeerQ = 0462ff2c3f5e165afa8dc919b7d705c862855d87869b8440c8d98db2ccb6144e3634a0335ebf64d77dc1c90fd5a5957c0d062593e8891d339f4b3616eb05018103 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA-256, COUNT = 20] Curve = P-256 PeerQ = 04eaa4b595bd200d3197a35fad5afbee310ac2da532237d5623e1285bdcaa2422177735e831623cd5d67b45e9ca947a48055bdc5f3cca81f75ab124c92ea62091c Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [EC - SHA384, COUNT = 3] Curve = P-256 PeerQ = 0482022f7a7507a5fdf191b7474d8503f1c2f31ef654096f28d046ff0b1f07d59406b2c2ff0fdcc2d913d6f3fbe02fded8543cd6aff9304213acc9cfd8f4d52803 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA384, COUNT = 9] Curve = P-256 PeerQ = 045ce1fd24f150bb8714c7c12ed1d85fb8bd597f6e4a8c27eaabd3348903abf91261941a5cd8978c1cfaf6b0f67441dcc5a3686adc7dd1e157f138c9ce48634019 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [EC - SHA384, COUNT = 24] Curve = P-256 PeerQ = 04d441c98190cf34cff0ba0dbafbade26c4cadcd5438bb5324e136851b09c009ac14c355a01189339a5a9a4f8a8ed57d7f6537ed161882c1e6912f8e3512faad0f Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA384, COUNT = 25] Curve = P-256 PeerQ = 048dfc7063c55a1fe8684ff6675ad4b53dab503e409c12058ab602c40c143ef84cbe0fce323492ee123e2a543b26b327139f234a08355dd60e2fc2c0babf1a10e3 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [EC - SHA512, COUNT = 0] Curve = P-256 PeerQ = 04eb65aaefab96a190a67e566978a179826cf4e04634013f7fe1547a749f3cf6e91d89dfdf23dc14fca68c7c138e90a0d9ee7bcdded8d80e6e409c7f0041d50b80 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [EC - SHA512, COUNT = 5] Curve = P-256 PeerQ = 040d0d6e855cd97a1b5a5e52593b8ceac553be06a19090c5442e521731c08e7fc5efa166e25741659bfa5b257a23f36e7d9f08e084610be8dfd8c6844d0ea860b9 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA512, COUNT = 26] Curve = P-256 PeerQ = 047417e66bbf708b258079648e1a9500d969f2d3860bd606054b611bc853228a324aade59d9ffb73cec6083887f5887c0306deb68e6aa984bbdad141635d078e79 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [EC - SHA512, COUNT = 29] Curve = P-256 PeerQ = 04d9313d9b7c9abebba2d4cb3c05e3393bd5da667efa74c9d4cc33d2e54446d8d9904240a61c8d7f5ff2028041a81e1408451f4c0e0a18fcf33557546dfc380a06 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [ED - SHA384, COUNT = 1] Curve = P-384 PeerQ = 04eed1bfbefb4c3b568ba187893d0d66f0a266928e57f5903213690cfe55660ce86d7eccf9ad1503932c31ab23917bc759a6e69055c5b84ccd92a414b84283bf89ebb85a850f03e02016a12ff22a4af6f80dd3900f68153b81e02c3f0c3d045d69 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [ED - SHA384, COUNT = 2] Curve = P-384 PeerQ = 04f081e7e14fcfbf38e3780f57822e8255452e96c673e4b49ebda246b0a5dbca279935e5b31f94eff8ac753aecc810f5ac4dd779b89b0fb7460fe0c50d90006fc5ad7a7a31fe6b827ec059c3b22b40611dbad54c75e653bbdb408fe2e5e24246ae Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [ED - SHA384, COUNT = 19] Curve = P-384 PeerQ = 0412159e7a89210ff0a5f723904a10c2425a13cfe9016b65cdb48285ec27912b66e415079ced48c94e707963bf5af66cd6ca8c934a135d8d3607f5792b63f127056e715eb4deabd501e6d3e3cfb6eb554c684c10c4a2b31df16fb8d9082131fa09 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [ED - SHA384, COUNT = 28] Curve = P-384 PeerQ = 04a308a4cadf229c47fd74de1d1b6e07722ed87fa7506a0ddb8eb2060ca0f93ced5973a76d9e622b7519142ec41969a825fbb34034f8a6ead96a600281a01306b1a8d9a3148e4fb2e9727a4cec6a62b16690f3480a96a5f42dee895a2d456eb0f2 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [ED - SHA512, COUNT = 11] Curve = P-384 PeerQ = 04ca8e02c55ea6756f5f65d213649c400296a6961d37947025f9d448042ed9c1f3da4e88842f64c1e8a5c2215d57e16cb0697b0923dc80e38fca5381b9a9d59c6f29337adcc7ff183cbb42f267956d130b0b53cb51ba459731001a39093b97db8c Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 # [ED - SHA512, COUNT = 13] Curve = P-384 PeerQ = 045cb621e4a2186b552961cb7fa8e8191d21335c8fbf2eff27cc44f27a3ae5aa4d000c146279979cbe2cd901ee1619494abd0f8333b8ad65f621271c30386cb455bd66fde88705c57490638c3a6b73c27c4982eba177b0fb867d253d4fccac2361 Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [ED - SHA512, COUNT = 20] Curve = P-384 PeerQ = 04fd2a7437151a1df4949386fccec7509d731c36dc7ceae03c1ecd9b2b2a413853f5fe2066b4a52082a0a538b0536f6df670132a719f37a02a8fa12ed714876b17fe4d923abe50e7dd371172293336921229fcd44376dd52a2969f459c4a95f11f Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 # [ED - SHA512, COUNT = 28] Curve = P-384 PeerQ = 0432d3118ba89149e3f75623098a258d5df0706730a256ee257e04b0a39cf8dfb631c4e31f476d40e538798048dc641138081f05d14000f9dcf2c98245951b6ab55ab9b4687eb36e3aae5391c3c3a0aefff41aebebc6bf027d268aa3153a017bd6 Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 ring-0.16.9/tests/digest_tests.rs000064400000000000000000000327611352416253600151650ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use ring::{digest, test, test_file}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test_configure; #[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); /// Test vectors from BoringSSL, Go, and other sources. #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn digest_misc() { test::run(test_file!("digest_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_alg = test_case.consume_digest_alg("Hash").unwrap(); let input = test_case.consume_bytes("Input"); let repeat = test_case.consume_usize("Repeat"); let expected = test_case.consume_bytes("Output"); let mut ctx = digest::Context::new(digest_alg); let mut data = Vec::new(); for _ in 0..repeat { ctx.update(&input); data.extend(&input); } let actual_from_chunks = ctx.finish(); assert_eq!(&expected, &actual_from_chunks.as_ref()); let actual_from_one_shot = digest::digest(digest_alg, &data); assert_eq!(&expected, &actual_from_one_shot.as_ref()); Ok(()) }); } mod digest_shavs { use ring::{digest, test}; fn run_known_answer_test(digest_alg: &'static digest::Algorithm, test_file: test::File) { let section_name = &format!("L = {}", digest_alg.output_len); test::run(test_file, |section, test_case| { assert_eq!(section_name, section); let len_bits = test_case.consume_usize("Len"); let mut msg = test_case.consume_bytes("Msg"); // The "msg" field contains the dummy value "00" when the // length is zero. if len_bits == 0 { assert_eq!(msg, &[0u8]); msg.truncate(0); } assert_eq!(msg.len() * 8, len_bits); let expected = test_case.consume_bytes("MD"); let actual = digest::digest(digest_alg, &msg); assert_eq!(&expected, &actual.as_ref()); Ok(()) }); } macro_rules! shavs_tests { ( $file_name:ident, $algorithm_name:ident ) => { #[allow(non_snake_case)] mod $algorithm_name { use super::{run_known_answer_test, run_monte_carlo_test}; use ring::{digest, test_file}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test; #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn short_msg_known_answer_test() { run_known_answer_test( &digest::$algorithm_name, test_file!(concat!( "../third_party/NIST/SHAVS/", stringify!($file_name), "ShortMsg.rsp" )), ); } #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn long_msg_known_answer_test() { run_known_answer_test( &digest::$algorithm_name, test_file!(concat!( "../third_party/NIST/SHAVS/", stringify!($file_name), "LongMsg.rsp" )), ); } #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn monte_carlo_test() { run_monte_carlo_test( &digest::$algorithm_name, test_file!(concat!( "../third_party/NIST/SHAVS/", stringify!($file_name), "Monte.rsp" )), ); } } }; } fn run_monte_carlo_test(digest_alg: &'static digest::Algorithm, test_file: test::File) { let section_name = &format!("L = {}", digest_alg.output_len); let mut expected_count: isize = -1; let mut seed = Vec::with_capacity(digest_alg.output_len); test::run(test_file, |section, test_case| { assert_eq!(section_name, section); if expected_count == -1 { seed.extend(test_case.consume_bytes("Seed")); expected_count = 0; return Ok(()); } assert!(expected_count >= 0); let actual_count = test_case.consume_usize("COUNT"); assert_eq!(expected_count as usize, actual_count); expected_count += 1; let expected_md = test_case.consume_bytes("MD"); let mut mds = Vec::with_capacity(4); mds.push(seed.clone()); mds.push(seed.clone()); mds.push(seed.clone()); for _ in 0..1000 { let mut ctx = digest::Context::new(digest_alg); ctx.update(&mds[0]); ctx.update(&mds[1]); ctx.update(&mds[2]); let md_i = ctx.finish(); let _ = mds.remove(0); mds.push(Vec::from(md_i.as_ref())); } let md_j = mds.last().unwrap(); assert_eq!(&expected_md, md_j); seed = md_j.clone(); Ok(()) }); assert_eq!(expected_count, 100); } shavs_tests!(SHA1, SHA1_FOR_LEGACY_USE_ONLY); shavs_tests!(SHA256, SHA256); shavs_tests!(SHA384, SHA384); shavs_tests!(SHA512, SHA512); } /// Test some ways in which `Context::update` and/or `Context::finish` /// could go wrong by testing every combination of updating three inputs /// that vary from zero bytes to one byte larger than the block length. /// /// These are not run in dev (debug) builds because they are too slow. macro_rules! test_i_u_f { ( $test_name:ident, $alg:expr) => { #[cfg(not(debug_assertions))] // TODO: #[cfg_attr(not(target_arch = "wasm32"), test)] // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] #[test] fn $test_name() { let mut input = [0; (digest::MAX_BLOCK_LEN + 1) * 3]; let max = $alg.block_len + 1; for i in 0..(max * 3) { input[i] = (i & 0xff) as u8; } for i in 0..max { for j in 0..max { for k in 0..max { let part1 = &input[..i]; let part2 = &input[i..(i + j)]; let part3 = &input[(i + j)..(i + j + k)]; let mut ctx = digest::Context::new(&$alg); ctx.update(part1); ctx.update(part2); ctx.update(part3); let i_u_f = ctx.finish(); let one_shot = digest::digest(&$alg, &input[..(i + j + k)]); assert_eq!(i_u_f.as_ref(), one_shot.as_ref()); } } } } }; } test_i_u_f!(digest_test_i_u_f_sha1, digest::SHA1_FOR_LEGACY_USE_ONLY); test_i_u_f!(digest_test_i_u_f_sha256, digest::SHA256); test_i_u_f!(digest_test_i_u_f_sha384, digest::SHA384); test_i_u_f!(digest_test_i_u_f_sha512, digest::SHA512); /// See https://bugzilla.mozilla.org/show_bug.cgi?id=610162. This tests the /// calculation of 8GB of the byte 123. /// /// You can verify the expected values in many ways. One way is /// `python ~/p/write_big.py`, where write_big.py is: /// /// ```python /// chunk = bytearray([123] * (16 * 1024)) /// with open('tempfile', 'w') as f: /// for i in xrange(0, 8 * 1024 * 1024 * 1024, len(chunk)): /// f.write(chunk) /// ``` /// Then: /// /// ```sh /// sha1sum -b tempfile /// sha256sum -b tempfile /// sha384sum -b tempfile /// sha512sum -b tempfile /// ``` /// /// This is not run in dev (debug) builds because it is too slow. macro_rules! test_large_digest { ( $test_name:ident, $alg:expr, $len:expr, $expected:expr) => { #[cfg(not(debug_assertions))] #[test] // TODO: #[cfg_attr(not(target_arch = "wasm32"), test)] // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn $test_name() { let chunk = vec![123u8; 16 * 1024]; let chunk_len = chunk.len() as u64; let mut ctx = digest::Context::new(&$alg); let mut hashed = 0u64; loop { ctx.update(&chunk); hashed += chunk_len; if hashed >= 8u64 * 1024 * 1024 * 1024 { break; } } let calculated = ctx.finish(); let expected: [u8; $len] = $expected; assert_eq!(&expected[..], calculated.as_ref()); } }; } // XXX: This test is too slow on Android ARM. #[cfg(any(not(target_os = "android"), not(target_arch = "arm")))] test_large_digest!( digest_test_large_digest_sha1, digest::SHA1_FOR_LEGACY_USE_ONLY, 160 / 8, [ 0xCA, 0xC3, 0x4C, 0x31, 0x90, 0x5B, 0xDE, 0x3B, 0xE4, 0x0D, 0x46, 0x6D, 0x70, 0x76, 0xAD, 0x65, 0x3C, 0x20, 0xE4, 0xBD ] ); test_large_digest!( digest_test_large_digest_sha256, digest::SHA256, 256 / 8, [ 0x8D, 0xD1, 0x6D, 0xD8, 0xB2, 0x5A, 0x29, 0xCB, 0x7F, 0xB9, 0xAE, 0x86, 0x72, 0xE9, 0xCE, 0xD6, 0x65, 0x4C, 0xB6, 0xC3, 0x5C, 0x58, 0x21, 0xA7, 0x07, 0x97, 0xC5, 0xDD, 0xAE, 0x5C, 0x68, 0xBD ] ); test_large_digest!( digest_test_large_digest_sha384, digest::SHA384, 384 / 8, [ 0x3D, 0xFE, 0xC1, 0xA9, 0xD0, 0x9F, 0x08, 0xD5, 0xBB, 0xE8, 0x7C, 0x9E, 0xE0, 0x0A, 0x87, 0x0E, 0xB0, 0xEA, 0x8E, 0xEA, 0xDB, 0x82, 0x36, 0xAE, 0x74, 0xCF, 0x9F, 0xDC, 0x86, 0x1C, 0xE3, 0xE9, 0xB0, 0x68, 0xCD, 0x19, 0x3E, 0x39, 0x90, 0x02, 0xE1, 0x58, 0x5D, 0x66, 0xC4, 0x55, 0x11, 0x9B ] ); test_large_digest!( digest_test_large_digest_sha512, digest::SHA512, 512 / 8, [ 0xFC, 0x8A, 0x98, 0x20, 0xFC, 0x82, 0xD8, 0x55, 0xF8, 0xFF, 0x2F, 0x6E, 0xAE, 0x41, 0x60, 0x04, 0x08, 0xE9, 0x49, 0xD7, 0xCD, 0x1A, 0xED, 0x22, 0xEB, 0x55, 0xE1, 0xFD, 0x80, 0x50, 0x3B, 0x01, 0x2F, 0xC6, 0xF4, 0x33, 0x86, 0xFB, 0x60, 0x75, 0x2D, 0xA5, 0xA9, 0x93, 0xE7, 0x00, 0x45, 0xA8, 0x49, 0x1A, 0x6B, 0xEC, 0x9C, 0x98, 0xC8, 0x19, 0xA6, 0xA9, 0x88, 0x3E, 0x2F, 0x09, 0xB9, 0x9A ] ); // TODO: test_large_digest!(digest_test_large_digest_sha512_256, // digest::SHA512_256, 256 / 8, [ ... ]); #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn test_fmt_algorithm() { assert_eq!("SHA1", &format!("{:?}", digest::SHA1_FOR_LEGACY_USE_ONLY)); assert_eq!("SHA256", &format!("{:?}", digest::SHA256)); assert_eq!("SHA384", &format!("{:?}", digest::SHA384)); assert_eq!("SHA512", &format!("{:?}", digest::SHA512)); assert_eq!("SHA512_256", &format!("{:?}", digest::SHA512_256)); } #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn digest_test_fmt() { assert_eq!( "SHA1:b7e23ec29af22b0b4e41da31e868d57226121c84", &format!( "{:?}", digest::digest(&digest::SHA1_FOR_LEGACY_USE_ONLY, b"hello, world") ) ); assert_eq!( "SHA256:09ca7e4eaa6e8ae9c7d261167129184883644d\ 07dfba7cbfbc4c8a2e08360d5b", &format!("{:?}", digest::digest(&digest::SHA256, b"hello, world")) ); assert_eq!( "SHA384:1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5\ fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f0\ 0418a70cdb7e", &format!("{:?}", digest::digest(&digest::SHA384, b"hello, world")) ); assert_eq!( "SHA512:8710339dcb6814d0d9d2290ef422285c9322b7\ 163951f9a0ca8f883d3305286f44139aa374848e4174f5\ aada663027e4548637b6d19894aec4fb6c46a139fbf9", &format!("{:?}", digest::digest(&digest::SHA512, b"hello, world")) ); assert_eq!( "SHA512_256:11f2c88c04f0a9c3d0970894ad2472505e\ 0bc6e8c7ec46b5211cd1fa3e253e62", &format!("{:?}", digest::digest(&digest::SHA512_256, b"hello, world")) ); } ring-0.16.9/tests/digest_tests.txt000064400000000000000000000146721352416253600153610ustar0000000000000000# SHA-1 tests from RFC 3174. Hash = SHA1 Input = "abc" Repeat = 1 Output = a9993e364706816aba3e25717850c26c9cd0d89d Hash = SHA1 Input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" Repeat = 1 Output = 84983e441c3bd26ebaae4aa1f95129e5e54670f1 Hash = SHA1 Input = "a" Repeat = 1000000 Output = 34aa973cd4c4daa4f61eeb2bdbad27316534016f Hash = SHA1 Input = "0123456701234567012345670123456701234567012345670123456701234567" Repeat = 10 Output = dea356a2cddd90c7a7ecedc5ebb563934f460452 # SHA-256 tests from NIST. Hash = SHA256 Input = "abc" Repeat = 1 Output = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad Hash = SHA256 Input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" Repeat = 1 Output = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1 # SHA-384 tests from NIST. Hash = SHA384 Input = "abc" Repeat = 1 Output = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 Hash = SHA384 Input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" Repeat = 1 Output = 09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039 # SHA-512 tests from NIST Hash = SHA512 Input = "abc" Repeat = 1 Output = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f Hash = SHA512 Input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" Repeat = 1 Output = 8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909 # SHA-512/256 tests from Go. Hash = SHA512_256 Input = "" Repeat = 1 Output = c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a Hash = SHA512_256 Input = "a" Repeat = 1 Output = 455e518824bc0601f9fb858ff5c37d417d67c2f8e0df2babe4808858aea830f8 Hash = SHA512_256 Input = "ab" Repeat = 1 Output = 22d4d37ec6370571af7109fb12eae79673d5f7c83e6e677083faa3cfac3b2c14 Hash = SHA512_256 Input = "abc" Repeat = 1 Output = 53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23 Hash = SHA512_256 Input = "abcd" Repeat = 1 Output = d2891c7978be0e24948f37caa415b87cb5cbe2b26b7bad9dc6391b8a6f6ddcc9 Hash = SHA512_256 Input = "abcde" Repeat = 1 Output = de8322b46e78b67d4431997070703e9764e03a1237b896fd8b379ed4576e8363 Hash = SHA512_256 Input = "abcdef" Repeat = 1 Output = e4fdcb11d1ac14e698743acd8805174cea5ddc0d312e3e47f6372032571bad84 Hash = SHA512_256 Input = "abcdefg" Repeat = 1 Output = a8117f680bdceb5d1443617cbdae9255f6900075422326a972fdd2f65ba9bee3 Hash = SHA512_256 Input = "abcdefgh" Repeat = 1 Output = a29b9645d2a02a8b582888d044199787220e316bf2e89d1422d3df26bf545bbe Hash = SHA512_256 Input = "abcdefghi" Repeat = 1 Output = b955095330f9c8188d11884ec1679dc44c9c5b25ff9bda700416df9cdd39188f Hash = SHA512_256 Input = "abcdefghij" Repeat = 1 Output = 550762913d51eefbcd1a55068fcfc9b154fd11c1078b996df0d926ea59d2a68d Hash = SHA512_256 Input = "Discard medicine more than two years old." Repeat = 1 Output = 690c8ad3916cefd3ad29226d9875965e3ee9ec0d4482eacc248f2ff4aa0d8e5b Hash = SHA512_256 Input = "He who has a shady past knows that nice guys finish last." Repeat = 1 Output = 25938ca49f7ef1178ce81620842b65e576245fcaed86026a36b516b80bb86b3b Hash = SHA512_256 Input = "I wouldn't marry him with a ten foot pole." Repeat = 1 Output = 698e420c3a7038e53d8e73f4be2b02e03b93464ac1a61ebe69f557079921ef65 Hash = SHA512_256 Input = "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave" Repeat = 1 Output = 839b414d7e3900ee243aa3d1f9b6955720e64041f5ab9bedd3eb0a08da5a2ca8 Hash = SHA512_256 Input = "The days of the digital watch are numbered. -Tom Stoppard" Repeat = 1 Output = 5625ecb9d284e54c00b257b67a8cacb25a78db2845c60ef2d29e43c84f236e8e Hash = SHA512_256 Input = "Nepal premier won't resign." Repeat = 1 Output = 9b81d06bca2f985e6ad3249096ff3c0f2a9ec5bb16ef530d738d19d81e7806f2 Hash = SHA512_256 Input = "For every action there is an equal and opposite government program." Repeat = 1 Output = 08241df8d91edfcd68bb1a1dada6e0ae1475a5c6e7b8f12d8e24ca43a38240a9 Hash = SHA512_256 Input = "His money is twice tainted: 'taint yours and 'taint mine." Repeat = 1 Output = 4ff74d9213a8117745f5d37b5353a774ec81c5dfe65c4c8986a56fc01f2c551e Hash = SHA512_256 Input = "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977" Repeat = 1 Output = b5baf747c307f98849ec881cf0d48605ae4edd386372aea9b26e71db517e650b Hash = SHA512_256 Input = "It's a tiny change to the code and not completely disgusting. - Bob Manchek" Repeat = 1 Output = 7eef0538ebd7ecf18611d23b0e1cd26a74d65b929a2e374197dc66e755ca4944 Hash = SHA512_256 Input = "size: a.out: bad magic" Repeat = 1 Output = d05600964f83f55323104aadab434f32391c029718a7690d08ddb2d7e8708443 Hash = SHA512_256 Input = "The major problem is with sendmail. -Mark Horton" Repeat = 1 Output = 53ed5f9b5c0b674ac0f3425d9f9a5d462655b07cc90f5d0f692eec093884a607 Hash = SHA512_256 Input = "Give me a rock, paper and scissors and I will move the world. CCFestoon" Repeat = 1 Output = 5a0147685a44eea2435dbd582724efca7637acd9c428e5e1a05115bc3bc2a0e0 Hash = SHA512_256 Input = "If the enemy is within range, then so are you." Repeat = 1 Output = 1152c9b27a99dbf4057d21438f4e63dd0cd0977d5ff12317c64d3b97fcac875a Hash = SHA512_256 Input = "It's well we cannot hear the screams/That we create in others' dreams." Repeat = 1 Output = 105e890f5d5cf1748d9a7b4cdaf58b69855779deebc2097747c2210a17b2cb51 Hash = SHA512_256 Input = "You remind me of a TV show, but that's all right: I watch it anyway." Repeat = 1 Output = 74644ead770da1434365cd912656fe1aca2056d3039d39f10eb1151bddb32cf3 Hash = SHA512_256 Input = "C is as portable as Stonehedge!!" Repeat = 1 Output = 50a234625de5587581883dad9ef399460928032a5ea6bd005d7dc7b68d8cc3d6 Hash = SHA512_256 Input = "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley" Repeat = 1 Output = a7a3846005f8a9935a0a2d43e7fd56d95132a9a3609bf3296ef80b8218acffa0 Hash = SHA512_256 Input = "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule" Repeat = 1 Output = 688ff03e367680757aa9906cb1e2ad218c51f4526dc0426ea229a5ba9d002c69 Hash = SHA512_256 Input = "How can you write a big system without C++? -Paul Glick" Repeat = 1 Output = 3fa46d52094b01021cff5af9a438982b887a5793f624c0a6644149b6b7c3f485 ring-0.16.9/tests/ecdsa_from_pkcs8_tests.txt000064400000000000000000000103211352416253600172770ustar0000000000000000Curve = P-256 Input = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Curve = P-384 Input = 3081b6020100301006072a8648ce3d020106052b8104002204819e30819b0201010430fc0603810412769beeabbf97ce9764e104bca45b3b7428006fb42d1fa69a344bf475ce17bf06daf553c4eccffcfecc26a1640362000417e425506a81d85e607a3caeaccbe6cc7ef58b559115b9867175ef9911f66ea77eb5b7f43e42f3129a1fe2841f6717ed4fc02bf8cfe2d10cac06a150dcba7ae9f035ec9b6b034a4ddc554da7c2da4719a1d990097fbb451a3ea1e664fc444cfa # A P-256 key where the ECPrivateKey contains a parameters field that matches the PKCS#8 algorithm identifier. Curve = P-256 Input = 308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a00a06082a8648ce3d030107a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 # A P-384 key where the ECPrivateKey contains a parameters field identifying P-384. Curve = P-384 Input = 3081bf020100301006072a8648ce3d020106052b810400220481a73081a40201010430fc0603810412769beeabbf97ce9764e104bca45b3b7428006fb42d1fa69a344bf475ce17bf06daf553c4eccffcfecc26a00706052b81040022a1640362000417e425506a81d85e607a3caeaccbe6cc7ef58b559115b9867175ef9911f66ea77eb5b7f43e42f3129a1fe2841f6717ed4fc02bf8cfe2d10cac06a150dcba7ae9f035ec9b6b034a4ddc554da7c2da4719a1d990097fbb451a3ea1e664fc444cfa # A P-256 key where the ECPrivateKey contains a parameters field identifying P-384. Curve = P-256 Input = 308190020100301306072a8648ce3d020106082a8648ce3d030107047630740201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a00706052b81040022a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = WrongAlgorithm # A P-256 key where the ECPrivateKey contains a parameters field containing an entire AlgorithmIdentifier. Curve = P-256 Input = 3081a0020100301306072a8648ce3d020106082a8648ce3d0301070481853081820201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a015301306072a8648ce3d020106082a8648ce3d030107a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = WrongAlgorithm # The curve P-256 is encoded explicitly, instead of as a reference to a named curve. Curve = P-256 Input = 308201220201010420c6c1aada15b07661f8142c6caf0fdb241aff2efe46c0938b74f2bcc53052b077a081fa3081f7020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff305b0420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b031500c49d360886e704936a6678e1139d26b7819f7e900441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101 Error = InvalidEncoding # A valid PKCS#8 P-256 private key, but without the public key in the ECPrivateKey. Curve = P-256 Input = 308141020100301306072a8648ce3d020106082a8648ce3d030107042730250201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07 Error = InvalidEncoding # The AlgorithmIdentifier is ecPublicKey w/ P-256, but it's an RSAPrivateKey. Curve = P-256 Input = 308189020100301306072A8648CE3D020106082A8648CE3D0301070500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = InvalidEncoding # A P-256 ECPrivateKey, but the AlgorithmIdentifier is rsaEncryption. Curve = P-256 Input = 308181020100300d06092a864886f70d0101010500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = WrongAlgorithm ring-0.16.9/tests/ecdsa_test_private_key_p256.p8000064400000000000000000000002121352416253600176450ustar000000000000000000*H=*H=m0k W)WHKb WPwC"bpT⃡DBf#eP墳M`*eғP3M?5Y$^[Zzܧk3Y5 .ring-0.16.9/tests/ecdsa_test_public_key_p256.der000064400000000000000000000001011352416253600176710ustar0000000000000000f#eP墳M`*eғP3M?5Y$^[Zzܧk3Y5 .ring-0.16.9/tests/ecdsa_test_public_key_p256_debug.txt000064400000000000000000000002171352416253600211140ustar0000000000000000PublicKey("04fc116698a3e3236550c4c9efa9bd4d0619602a65d2930e9150ab33e84dbc83f8a6a6b9933f35ab59245e5b5a7af5dca76b33cbe7aeee5981b3ca350bebf52ecd")ring-0.16.9/tests/ecdsa_tests.rs000064400000000000000000000173571353036607100147660ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use ring::{ rand, signature::{self, KeyPair}, test, test_file, }; // ECDSA *signing* tests are in src/ec/ecdsa/signing.rs. #[cfg(feature = "alloc")] #[test] fn ecdsa_from_pkcs8_test() { test::run( test_file!("ecdsa_from_pkcs8_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let ((this_fixed, this_asn1), (other_fixed, other_asn1)) = match curve_name.as_str() { "P-256" => ( ( &signature::ECDSA_P256_SHA256_FIXED_SIGNING, &signature::ECDSA_P256_SHA256_ASN1_SIGNING, ), ( &signature::ECDSA_P384_SHA384_FIXED_SIGNING, &signature::ECDSA_P384_SHA384_ASN1_SIGNING, ), ), "P-384" => ( ( &signature::ECDSA_P384_SHA384_FIXED_SIGNING, &signature::ECDSA_P384_SHA384_ASN1_SIGNING, ), ( &signature::ECDSA_P256_SHA256_FIXED_SIGNING, &signature::ECDSA_P256_SHA256_ASN1_SIGNING, ), ), _ => unreachable!(), }; let input = test_case.consume_bytes("Input"); let error = test_case.consume_optional_string("Error"); match ( signature::EcdsaKeyPair::from_pkcs8(this_fixed, &input), error.clone(), ) { (Ok(_), None) => (), (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), }; match ( signature::EcdsaKeyPair::from_pkcs8(this_asn1, &input), error.clone(), ) { (Ok(_), None) => (), (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), }; assert!(signature::EcdsaKeyPair::from_pkcs8(other_fixed, &input).is_err()); assert!(signature::EcdsaKeyPair::from_pkcs8(other_asn1, &input).is_err()); Ok(()) }, ); } // Verify that, at least, we generate PKCS#8 documents that we can read. #[test] fn ecdsa_generate_pkcs8_test() { let rng = rand::SystemRandom::new(); for alg in &[ &signature::ECDSA_P256_SHA256_ASN1_SIGNING, &signature::ECDSA_P256_SHA256_FIXED_SIGNING, &signature::ECDSA_P384_SHA384_ASN1_SIGNING, &signature::ECDSA_P384_SHA384_FIXED_SIGNING, ] { let pkcs8 = signature::EcdsaKeyPair::generate_pkcs8(alg, &rng).unwrap(); println!(); for b in pkcs8.as_ref() { print!("{:02x}", *b); } println!(); println!(); #[cfg(feature = "alloc")] let _ = signature::EcdsaKeyPair::from_pkcs8(*alg, pkcs8.as_ref()).unwrap(); } } #[test] fn signature_ecdsa_verify_asn1_test() { test::run( test_file!("ecdsa_verify_asn1_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); let msg = test_case.consume_bytes("Msg"); let public_key = test_case.consume_bytes("Q"); let sig = test_case.consume_bytes("Sig"); let is_valid = test_case.consume_string("Result") == "P (0 )"; let alg = match (curve_name.as_str(), digest_name.as_str()) { ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1, ("P-256", "SHA384") => &signature::ECDSA_P256_SHA384_ASN1, ("P-384", "SHA256") => &signature::ECDSA_P384_SHA256_ASN1, ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1, _ => { panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); } }; let actual_result = signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); assert_eq!(actual_result.is_ok(), is_valid); Ok(()) }, ); } #[test] fn signature_ecdsa_verify_fixed_test() { test::run( test_file!("ecdsa_verify_fixed_tests.txt"), |section, test_case| { assert_eq!(section, ""); let curve_name = test_case.consume_string("Curve"); let digest_name = test_case.consume_string("Digest"); let msg = test_case.consume_bytes("Msg"); let public_key = test_case.consume_bytes("Q"); let sig = test_case.consume_bytes("Sig"); let expected_result = test_case.consume_string("Result"); let alg = match (curve_name.as_str(), digest_name.as_str()) { ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_FIXED, ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_FIXED, _ => { panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); } }; let is_valid = expected_result == "P (0 )"; let actual_result = signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); assert_eq!(actual_result.is_ok(), is_valid); Ok(()) }, ); } #[test] fn ecdsa_test_public_key_coverage() { const PRIVATE_KEY: &[u8] = include_bytes!("ecdsa_test_private_key_p256.p8"); const PUBLIC_KEY: &[u8] = include_bytes!("ecdsa_test_public_key_p256.der"); const PUBLIC_KEY_DEBUG: &str = include_str!("ecdsa_test_public_key_p256_debug.txt"); let key_pair = signature::EcdsaKeyPair::from_pkcs8( &signature::ECDSA_P256_SHA256_FIXED_SIGNING, PRIVATE_KEY, ) .unwrap(); // Test `AsRef<[u8]>` assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); // Test `Clone`. { let _ = key_pair.public_key().clone(); } // Test `Debug`. assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); assert_eq!( format!("EcdsaKeyPair {{ public_key: {:?} }}", key_pair.public_key()), format!("{:?}", key_pair) ); } ring-0.16.9/tests/ecdsa_verify_asn1_tests.txt000064400000000000000000001540541352331573000174610ustar0000000000000000# Test vectors for short values of s. # S is the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = 30440220341f6779b75e98bb42e01095dd48356cbf9002dc704ac8bd2a8240b88d3796c60220555843b1b4e264fe6ffe6e2b705a376c05c09404303ffe5d2711f3e3b3a010a1 Result = P (0 ) # S is one byte shorter than the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = 3044022031ed574e9688aed7016e985c0e742fb788be73d9ad0a895e6182c77751817ed0022000d98eb6d480d64d1729c680693cb13bd6bf0c7b651007e459e667683ff65b92 Result = P (0 ) # S is 2 bytes shorter than the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = 3043022100f59cf66594cc837415f16494fb52c02f2a6264bf6ce7dccbf2f78c090cdcefb0021e5a8c8a04ba7825f3f8e56517056daa1a51129cd91382a24589ed05d0c13d Result = P (0 ) # S is the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = 306502310085ac708d4b0126bac1f5eeebdf911409070a286fdde5649582611b60046de353761660dd03903f58b44148f25142eef80230183475ec1f1392f3d6838abc0c01724709c446888bed7f2ce4642c6839dc18044a2a6ab9ddc960bfac79f6988e62d452 Result = P (0 ) # S is one byte shorter than the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = 306302304dec97b54c4150ebaffc2dbfc2bc17c302be47cfc4b541ada34108b1080f2482a3e7f5f2b16f730210bd8c29b6681e0b022f0575984f37064bfbbdda76836f5ef2d632f006c338a9585c8b9108c46ea812ce066110156de9806ae5711153e2ef0b Result = P (0 ) # S is 2 bytes shorter than the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = 3064023100ad8e51ec23d5b8130a5e0636a2f0d1740e8b5404c368b7dab5ae82d307d653c6ef70dcee70b112bf678801f87fb8f5a9022f00806d69e0c2834c27666996d55655cf9358b201aa85d3b08891abcc68c854cac6c67c53b3bf92df9a677d11aba13d Result = P (0 ) # Generated Test vectors. # # TODO: Test the range of `r` in addition to the range of `s`. # TODO: Test what happens when the message digests to zero. # TODO: Additional test coverage. libsecp256k1 is a good example. # Test vectors for Gregory Maxwell's trick. # # In all cases, the `s` component of the signature was selected # arbitrarily as 4 and then the `r` component was chosen to be the # smallest value where the public key recovery from the signature # works. # The signature has r < q - n. This is the control case for the next # test case; this signature is the same but the public key is # different. Notice that both public keys work for the same signature! # This signature will validate even if the implementation doesn't # reduce the X coordinate of the multiplication result (mod n). Curve = P-256 Digest = SHA256 Msg = "" Q = 041548fc88953e06cd34d4b300804c5322cb48c24aaaa4d07a541b0f0ccfeedeb0ae4991b90519ea405588bdf699f5e6d0c6b2d5217a5c16e8371062737aa1dae1 Sig = 3006020106020104 Result = P (0 ) # The signature has r < q - n. s Since r < q - n, r + n < q. Notice # that this signature is the same as the signature in the preceding # test case, but the public key is different. That the signature # validates for this case too is what's special about the case where # r < q - n. If this test case fails it is likely that the # implementation doesn't reduce the X coordinate of the multiplication # result (mod n), or it is missing the second step of Gregory # Maxwell's trick. Curve = P-256 Digest = SHA256 Msg = "" Q = 04ad8f60e4ec1ebdb6a260b559cb55b1e9d2c5ddd43a41a2d11b0741ef2567d84e166737664104ebbc337af3d861d3524cfbc761c12edae974a0759750c8324f9a Sig = 3006020106020104 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r. r + n > q since r > q - n. This is the control # for the next test case; this signature is the same as the signature # in the following test case but the public key is different. Curve = P-256 Digest = SHA256 Msg = "" Q = 0445bd879143a64af5746e2e82aa65fd2ea07bba4e35594095a981b59984dacb219d59697387ac721b1f1eccf4b11f43ddc39e8367147abab3084142ed3ea170e4 Sig = 301502104319055358e8617b0c46353d039cdaae020104 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r + n (mod q). r + n > q since r > q - n, and so # r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice # that this signature is the same as the signature in the preceding # test case but the public key is different. Also, notice that the # signature fails to validate in this case, unlike other related test # cases. If this test case fails (the signature validates), it is # likely that the implementation didn't guard the second case of # Gregory Maxwell's trick on the condition r < q - n. Curve = P-256 Digest = SHA256 Msg = "" Q = 040feb5df4cc78b35ec9c180cc0de5842f75f088b48456978ffa98e716d94883e1e6500b2a1f6c1d9d493428d7ae7d9a8a560fff30a3d14aa160be0c5e7edcd887 Sig = 301502104319055358e8617b0c46353d039cdaae020104 Result = F # The signature has r < q - n. This is the control case for the next # test case; this signature is the same but the public key is # different. Notice that both public keys work for the same signature! # This signature will validate even if the implementation doesn't # reduce the X coordinate of the multiplication result (mod n). Curve = P-384 Digest = SHA384 Msg = "" Q = 0425b890b9597155baf7e7ffb48d8123184cbb76ea3f7b10d8f1702136f969e915188cff306c67950437f816ce6ecb739204cc069edac95929dfbd719313552797962789e2210a0bf270c2f0ffc109a70e40da6303a2599bdd702c19070dd51f42 Sig = 3006020103020104 Result = P (0 ) # The signature has r < q - n. s Since r < q - n, r + n < q. Notice # that this signature is the same as the signature in the preceding # test case, but the public key is different. That the signature # validates for this case too is what's special about the case where # r < q - n. If this test case fails it is likely that the # implementation doesn't reduce the X coordinate of the multiplication # result (mod n), or it is missing the second step of Gregory # Maxwell's trick. Curve = P-384 Digest = SHA384 Msg = "" Q = 045a3c576f0c2a615063c6e8ec40f5bf0dd67e549e9f13f8f881703ec40a8d6d8ecbb0d8e5b20f3aa0f2e581b594cea3e654a450cabcf24bd908cc47da98eba648a0440332ee19fb53da96dddaec521f718f7b52a161b67134d6e0d6e81dc45502 Sig = 3006020103020104 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r. r + n > q since r > q - n. This is the control # for the next test case; this signature is the same as the signature # in the following test case but the public key is different. Curve = P-384 Digest = SHA384 Msg = "" Q = 04a93588bffb32417bd2b0fa03a6a30d2cf90034e6070b9333d4e7a42fe88bce5a03e8be7f2a84fbc25ec84dc34915c53fd975cfd0db77ec2b5c548994dc9f62756e018882a31d883471b0bbbd8588d9a2acab1aeaaa1eb217f8e528e7114162df Sig = 301d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e020104 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r + n (mod q). r + n > q since r > q - n, and so # r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice # that this signature is the same as the signature in the preceding # test case but the public key is different. Also, notice that the # signature fails to validate in this case, unlike other related test # cases. If this test case fails (the signature validates), it is # likely that the implementation didn't guard the second case of # Gregory Maxwell's trick on the condition r < q - n. Curve = P-384 Digest = SHA384 Msg = "" Q = 04576270f9571c9e99b9c71be1a1a705e5155e46b8c6dd920c14e2aaf0f9f96ed30754e2c8f8464d015a9bc779495ea568ac39c555c3b03de021e8167a27425588d6a82b68cf7a0f6ae389a202d8663ed32b5e1782c0377a8f0dc309ae28143961 Sig = 301d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e020104 Result = F # Generated Test vectors edge cases of signature (r, s) values. # s == 0 (out of range) Curve = P-256 Digest = SHA256 Msg = "" Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d Sig = 3006020106020100 Result = F # s == 1 (minimum allowed) Curve = P-256 Digest = SHA256 Msg = "" Q = 046e3f95fae7606c1cdfab1f1560de160ed806bbc2a85dc5a2d002aa1c0ac3e1fb5bcd5f7a325415824365cc584f08c144118318ce4d0f5df82b7753b291c4fe96 Sig = 3006020106020101 Result = P (0 ) # s == n (out of range) Curve = P-256 Digest = SHA256 Msg = "" Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d Sig = 3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 Result = F # s == n - 1 (maximum allowed) Curve = P-256 Digest = SHA256 Msg = "" Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 Sig = 3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 Result = P (0 ) # s == 0 (out of range) Curve = P-384 Digest = SHA384 Msg = "" Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f Sig = 3006020103020100 Result = F # s == 1 (minimum allowed) Curve = P-384 Digest = SHA384 Msg = "" Q = 042aadde5424928b888e20ecef2525f99d646519aa994c075a4081aa852ec309a6ac63006421ff756c6c0924d611d1bda82df99267266ba603b07ba85c678f4ae69daf4634a5e597d77d0b0338f343d8090b2d4420a29302ab47ef04ad45e1461f Sig = 3006020103020101 Result = P (0 ) # s == n (out of range) Curve = P-384 Digest = SHA384 Msg = "" Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f Sig = 3036020103023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 Result = F # s == n - 1 (maximum allowed) Curve = P-384 Digest = SHA384 Msg = "" Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b Sig = 3036020103023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 Result = P (0 ) # RFC 6979 Test Vectors Curve = P-256 Digest = SHA256 Msg = "sample" Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 Sig = 3046022100EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716022100F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = "sample" Q = 0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299 Sig = 304402200eafea039b20e9b42309fb1d89e213057cbf973dc0cfc8f129edddc800ef771902204861f0491e6998b9455193e34e7b0d284ddd7149a74b95b9261f13abde940954 Result = P (0 ) Curve = P-256 Digest = SHA256 Msg = "test" Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 Sig = 3045022100F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D383670220019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083 Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = "test" Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 Sig = 304602210083910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB60221008DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C Result = P (0 ) Curve = P-384 Digest = SHA256 Msg = "sample" Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 Sig = 3065023021B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD023100F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0 Result = P (0 ) Curve = P-384 Digest = SHA384 Msg = "sample" Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 Sig = 306602310094EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4602310099EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8 Result = P (0 ) Curve = P-384 Digest = SHA256 Msg = "test" Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 Sig = 306402306D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B02302D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265 Result = P (0 ) Curve = P-384 Digest = SHA384 Msg = "test" Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 Sig = 30660231008203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB023100DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5 Result = P (0 ) # NIST FIPS 186-4 Test Vectors from the file SigVer.rsp from # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # assessible via # http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors # # XXX: Unfortunately, it's not clear what edge cases these test vectors are # testing. For example, when the problem is caused by Q being tampered with, # it isn't clear if the new Q is on the curve or off the curve or what. Also, # the signature is a variable-length value (being an ASN.1 SEQUENCE of a pair # of ASN.1 INTEGERs), but all the signatures are the same length for each # curve. # # The [Curve, Digest] section headings were replaced with Curve and Digest # properties on each test case. # # Q = (Qx, Qy) in uncompressed form. # Sig = (R, S) encoded in ASN.1. Curve = P-256 Digest = SHA256 Msg = e4796db5f785f207aa30d311693b3702821dff1168fd2e04c0836825aefd850d9aa60326d88cde1a23c7745351392ca2288d632c264f197d05cd424a30336c19fd09bb229654f0222fcb881a4b35c290a093ac159ce13409111ff0358411133c24f5b8e2090d6db6558afc36f06ca1f6ef779785adba68db27a409859fc4c4a0 Q = 0487f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9 Sig = 3046022100d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0022100a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6 Result = F (3 - S changed) Curve = P-256 Digest = SHA256 Msg = 069a6e6b93dfee6df6ef6997cd80dd2182c36653cef10c655d524585655462d683877f95ecc6d6c81623d8fac4e900ed0019964094e7de91f1481989ae1873004565789cbf5dc56c62aedc63f62f3b894c9c6f7788c8ecaadc9bd0e81ad91b2b3569ea12260e93924fdddd3972af5273198f5efda0746219475017557616170e Q = 045cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85 Sig = 3046022100dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693022100d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c Result = F (2 - R changed) Curve = P-256 Digest = SHA256 Msg = df04a346cf4d0e331a6db78cca2d456d31b0a000aa51441defdb97bbeb20b94d8d746429a393ba88840d661615e07def615a342abedfa4ce912e562af714959896858af817317a840dcff85a057bb91a3c2bf90105500362754a6dd321cdd86128cfc5f04667b57aa78c112411e42da304f1012d48cd6a7052d7de44ebcc01de Q = 042ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64 Sig = 30460221009913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda80221009467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc Result = F (4 - Q changed) Curve = P-256 Digest = SHA256 Msg = e1130af6a38ccb412a9c8d13e15dbfc9e69a16385af3c3f1e5da954fd5e7c45fd75e2b8c36699228e92840c0562fbf3772f07e17f1add56588dd45f7450e1217ad239922dd9c32695dc71ff2424ca0dec1321aa47064a044b7fe3c2b97d03ce470a592304c5ef21eed9f93da56bb232d1eeb0035f9bf0dfafdcc4606272b20a3 Q = 04e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927 Sig = 3045022100bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f022017c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c Result = P (0 ) Curve = P-256 Digest = SHA256 Msg = 73c5f6a67456ae48209b5f85d1e7de7758bf235300c6ae2bdceb1dcb27a7730fb68c950b7fcada0ecc4661d3578230f225a875e69aaa17f1e71c6be5c831f22663bac63d0c7a9635edb0043ff8c6f26470f02a7bc56556f1437f06dfa27b487a6c4290d8bad38d4879b334e341ba092dde4e4ae694a9c09302e2dbf443581c08 Q = 04e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d28647f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a Sig = 304502201d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407022100cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a Result = P (0 ) Curve = P-256 Digest = SHA256 Msg = 666036d9b4a2426ed6585a4e0fd931a8761451d29ab04bd7dc6d0c5b9e38e6c2b263ff6cb837bd04399de3d757c6c7005f6d7a987063cf6d7e8cb38a4bf0d74a282572bd01d0f41e3fd066e3021575f0fa04f27b700d5b7ddddf50965993c3f9c7118ed78888da7cb221849b3260592b8e632d7c51e935a0ceae15207bedd548 Q = 04a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471 Sig = 3045022025acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d60221009b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537 Result = F (2 - R changed) Curve = P-256 Digest = SHA256 Msg = 7e80436bce57339ce8da1b5660149a20240b146d108deef3ec5da4ae256f8f894edcbbc57b34ce37089c0daa17f0c46cd82b5a1599314fd79d2fd2f446bd5a25b8e32fcf05b76d644573a6df4ad1dfea707b479d97237a346f1ec632ea5660efb57e8717a8628d7f82af50a4e84b11f21bdff6839196a880ae20b2a0918d58cd Q = 043dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5dff22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb Sig = 30450220548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a022100e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75 Result = F (4 - Q changed) Curve = P-256 Digest = SHA256 Msg = 1669bfb657fdc62c3ddd63269787fc1c969f1850fb04c933dda063ef74a56ce13e3a649700820f0061efabf849a85d474326c8a541d99830eea8131eaea584f22d88c353965dabcdc4bf6b55949fd529507dfb803ab6b480cd73ca0ba00ca19c438849e2cea262a1c57d8f81cd257fb58e19dec7904da97d8386e87b84948169 Q = 0469b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f Sig = 30440220288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc189108797997900220247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979 Result = F (1 - Message changed) Curve = P-256 Digest = SHA256 Msg = 3fe60dd9ad6caccf5a6f583b3ae65953563446c4510b70da115ffaa0ba04c076115c7043ab8733403cd69c7d14c212c655c07b43a7c71b9a4cffe22c2684788ec6870dc2013f269172c822256f9e7cc674791bf2d8486c0f5684283e1649576efc982ede17c7b74b214754d70402fb4bb45ad086cf2cf76b3d63f7fce39ac970 Q = 04bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03 Sig = 3045022100f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad0220049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d Result = F (3 - S changed) Curve = P-256 Digest = SHA256 Msg = 983a71b9994d95e876d84d28946a041f8f0a3f544cfcc055496580f1dfd4e312a2ad418fe69dbc61db230cc0c0ed97e360abab7d6ff4b81ee970a7e97466acfd9644f828ffec538abc383d0e92326d1c88c55e1f46a668a039beaa1be631a89129938c00a81a3ae46d4aecbf9707f764dbaccea3ef7665e4c4307fa0b0a3075c Q = 04224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9 Sig = 304502210087b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d202204044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66 Result = F (2 - R changed) Curve = P-256 Digest = SHA256 Msg = 4a8c071ac4fd0d52faa407b0fe5dab759f7394a5832127f2a3498f34aac287339e043b4ffa79528faf199dc917f7b066ad65505dab0e11e6948515052ce20cfdb892ffb8aa9bf3f1aa5be30a5bbe85823bddf70b39fd7ebd4a93a2f75472c1d4f606247a9821f1a8c45a6cb80545de2e0c6c0174e2392088c754e9c8443eb5af Q = 0443691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac Sig = 30460221008acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce022100cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154 Result = F (3 - S changed) Curve = P-256 Digest = SHA256 Msg = 0a3a12c3084c865daf1d302c78215d39bfe0b8bf28272b3c0b74beb4b7409db0718239de700785581514321c6440a4bbaea4c76fa47401e151e68cb6c29017f0bce4631290af5ea5e2bf3ed742ae110b04ade83a5dbd7358f29a85938e23d87ac8233072b79c94670ff0959f9c7f4517862ff829452096c78f5f2e9a7e4e9216 Q = 049157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405 Sig = 3046022100dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb0221008f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2 Result = F (1 - Message changed) Curve = P-256 Digest = SHA256 Msg = 785d07a3c54f63dca11f5d1a5f496ee2c2f9288e55007e666c78b007d95cc28581dce51f490b30fa73dc9e2d45d075d7e3a95fb8a9e1465ad191904124160b7c60fa720ef4ef1c5d2998f40570ae2a870ef3e894c2bc617d8a1dc85c3c55774928c38789b4e661349d3f84d2441a3b856a76949b9f1f80bc161648a1cad5588e Q = 04072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5 Sig = 3045022009f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19022100a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d Result = F (4 - Q changed) Curve = P-256 Digest = SHA256 Msg = 76f987ec5448dd72219bd30bf6b66b0775c80b394851a43ff1f537f140a6e7229ef8cd72ad58b1d2d20298539d6347dd5598812bc65323aceaf05228f738b5ad3e8d9fe4100fd767c2f098c77cb99c2992843ba3eed91d32444f3b6db6cd212dd4e5609548f4bb62812a920f6e2bf1581be1ebeebdd06ec4e971862cc42055ca Q = 0409308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5 Sig = 304502205cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e730221009c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7 Result = F (1 - Message changed) Curve = P-256 Digest = SHA256 Msg = 60cd64b2cd2be6c33859b94875120361a24085f3765cb8b2bf11e026fa9d8855dbe435acf7882e84f3c7857f96e2baab4d9afe4588e4a82e17a78827bfdb5ddbd1c211fbc2e6d884cddd7cb9d90d5bf4a7311b83f352508033812c776a0e00c003c7e0d628e50736c7512df0acfa9f2320bd102229f46495ae6d0857cc452a84 Q = 042d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a Sig = 3044022006108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959022062b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = fe9838f007bdc6afcd626974fcc6833f06b6fd970427b962d75c2aeadbef386bec8d018106197fe2547d2af02e7a7949965d5fbc4c5db909a95b9858426a33c080b0b25dae8b56c5cbc6c4eec3dbd81635c79457eaef4fab39e662a1d05b2481eda8c1074ae2d1704c8a3f769686a1f965ef3c87602efc288c7f9ff8cd5e22a4 Q = 0440ded13dbbe72c629c38f07f7f95cf75a50e2a524897604c84fafde5e4cafb9fa17202e92d7d6a37c438779349fd79567d75a40ef22b7d09ca21ccf4aec9a66c Sig = 3045022100be34730c31730b4e412e6c52c23edbd36583ace2102b39afa11d24b6848cb77f022003655202d5fd8c9e3ae971b6f080640c406112fd95e7015874e9b6ee77752b10 Result = F (3 - S changed) Curve = P-256 Digest = SHA384 Msg = b69043b9b331da392b5dd689142dfc72324265da08f14abcedf03ad8263e6bdccbc75098a2700bbba1979de84c8f12891aa0d000f8a1abad7dde4981533f21da59cc80d9cf94517f3b61d1a7d9eecb2fcf052e1fc9e7188c031b86305e4a436a37948071f046e306befb8511dc03a53dc8769a90a86e9b4fdbf05dcdfa35ab73 Q = 041f80e19ffeb51dd74f1c397ac3dfd3415ab16ebd0847ed119e6c3b15a1a884b89b395787371dbfb55d1347d7bed1c261d2908121fb78de1d1bf2d00666a62aed Sig = 30450220249ca2c3eb6e04ac57334c2f75dc5e658bbb485bf187100774f5099dd13ef70702210097363a05202b602d13166346694e38135bbce025be94950e9233f4c8013bf5bf Result = F (4 - Q changed) Curve = P-256 Digest = SHA384 Msg = d2fcaaede8b879c064b0aa46e68efc278a469b80a7f7e1939ec2ebc96c76206f23395967279c181fea157ebb79dfadc68e31345f07f13305c80de0d85e4330d3a45f957c5c2526b945838ce5a9c2844b6b2a665c0f70b748b1213a8cf20ba5dbdf8cab231f433da522104a5cd027d3e36bb373c4ed404d9af0cbec6f85ec2193 Q = 04ce4dcfa7384c83443ace0fb82c4ac1adfa100a9b2c7bf09f093f8b6d084e50c2d98ae7b91abee648d0bfde192703741ac21daad7262af418b50e406d825eb0d6 Sig = 30440220597e1e04d93a6b444ccc447a48651f17657ff43fb65fe94461d2bf816b01af400220359fe3817963548e676d6da34c2d0866aa42499237b682002889eaf8893814d2 Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = 06cd86481865181cef7acdc3202824970ec2d97662b519c4b588dc9e51617c068282b1a11a15bf7efc4858a2f37a3d74b05fb5790eb68338c8009b4da9b4270514d387a2e016a99ee109841e884a7909504ef31a5454e214663f830f23a5a76f91402fca5f5d61699fa874597bdbfb1ecff8f07ddbd07ef61e97d0d5262ef314 Q = 041b677f535ac69d1acd4592c0d12fac13c9131e5a6f8ab4f9d0afdcb3a3f327e05dca2c73ec89e58ef8267cba2bb5eb0f551f412f9dc087c1a6944f0ce475277a Sig = 3045022100df0b0cd76d2555d4c38b3d70bfdf964884d0beeb9f74385f0893e87d20c9642d0220128299aabf1f5496112be1fe04365f5f8215b08a040abdfeca4626f4d15c005b Result = F (2 - R changed) Curve = P-256 Digest = SHA384 Msg = 59ad297397f3503604a4a2d098a4f00a368ad95c6101b3d38f9d49d908776c5a6c8654b006adb7939ffb6c30afa325b54185d82c3cc0d836850dce54d3408b257c3a961d11fafe2b74ba8bddfc1102fa656d1028baf94c38340c26a11e992aab71ce3732271b767358671b25225926f3a4b9ec5f82c059f0c7d1446d5d9e4251 Q = 047ffc2853f3e17887dda13b0eb43f183ce50a5ac0f8bba75fb1921172484f9b944cc523d14192f80bd5b27d30b3b41e064da87bfbae15572dd382b9a176c123a2 Sig = 304402203156176d52eb26f9391229de4251993a41b8172f78970bb70e32a245be4bb653022062827a29e12d2f29b00fb2d02dd5f2d5412e17a4455f4431a5c996881fdfc0ee Result = F (1 - Message changed) Curve = P-256 Digest = SHA384 Msg = 8215daca87e689a20392646a6511bb7b5a82d2d995ca9de89bd9d9c0b11464b7cb1e4e9a31e3e01ad8c2cd613d5a2cb44a2a8df6899fce4c282dea1e41af0df6c36be1f320036567f8d0d32aaa79c95fe53b16668f7e1a9e5d7d039ea260fd03711b7d1c177355fc52244d49ca5b238556a5541349014683cb7da326f443b752 Q = 045569f76dc94243cde819fb6fc85144ec67e2b5d49539f62e24d406d1b68f00581208c38dbe25870deab53c486f793a1e250c9d1b8e7c147ea68b71196c440730 Sig = 30450220706f2ba4025e7c06b66d6369a3f93b2fec46c51eceff42a158f7431919506cfb022100b4e75ac34a96393237fc4337789e37168d79382705b248051c9c72bcbac5f516 Result = F (2 - R changed) Curve = P-256 Digest = SHA384 Msg = a996b1fb800f692517a2eb80e837233193dd3e82484d3f49bd19ee0db8f7b440876b07e384c90aa8b9f7b6603ca0b5a4e06c1da0edb974a2fb9b6e7c720ddf3e5c0e314c2d189402903c08c0836776c361a284db887ebcc33e615de9720b01dadade585eef687b3346468bdafb490e56d657a9e7d44d92014069005a36c1cf63 Q = 04e4b470c65b2c04db060d7105ec6911589863d3c7f7ce48726ba3f369ea3467e844c38d3ae098de05f5915a5868c17fee296a6e150beb1f000df5f3bec8fc4532 Sig = 3046022100c9c347ee5717e4c759ddaf09e86f4e1db2c8658593177cfda4e6514b5e3ecb87022100baae01e9e44a7b04d69c8eaaed77c9e3a36ce8962f95cc50a0db146b4e49eb40 Result = F (4 - Q changed) Curve = P-256 Digest = SHA384 Msg = 1a6e49a377a08e992353d6acc557b687b1b69a41d83d43a75fadb97b8c928cfebadebaaf99ea7fb13148807f56ea17384a7912e578e62b1b009fefb2aafca5ac85539433619b286f10643a56f8dfa47ba4d01c02510deaec18029ea6b9682022b139dcb70814164c4c90ec717ad9d925485398531cdd5992a2524498b337f97d Q = 0496050c5fa2ddd1b2e5451d89ee74a0b7b54347364ddc0231715a6ef1146fe8dce0888a9e78aeea87f6e1e9002b2651169f36c4ee53013cfc8c9912b7fd504858 Sig = 304502202353d6cd3c21b8ea7dbc1cd940519812dbe365a3b15cd6aebba9d11cf269867a02210085f560273cd9e82e6801e4cb1c8cd29cdac34a020da211d77453756b604b8fa7 Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = 3e14f737c913931bc82764ebc440b12e3ce1ffe0f858c7b8f1cbd30fbbb1644fa59be1d2cca5f64a6d7dc5ed5c4420f39227516ae8eb3019ef86274d0e4d06cde7bf5e5c413243dfc421d9f141762109810e6b6a451eeb4bd8d4be1ff111426d7e44d0a916b4fe3db3594d8dd01ae90feecf8f1e230b574180cd0b8d43a3d33b Q = 040c07bb79f44012299fbfd5a0f31397aaf7d757f8a38437407c1b09271c6551a084fe7846d5d403dc92c0091fbd39f3c5cbca3f94c10b5cae44e2e96562131b13 Sig = 3044022049e9425f82d0a8c503009cead24e12adc9d48a08594094ca4f6d13ad1e3c571d02201f1b70aaa30a8ff639aa0935944e9b88326a213ab8fce5194c1a9dec070eb433 Result = F (1 - Message changed) Curve = P-256 Digest = SHA384 Msg = 4000106127a72746db77957cbc6bfd84ae3d1d63b8190087637e93689841331e2adc1930d6df4302935f4520bbee513505cdcfca99ebc6f83af7b23b0f2e7f7defba614022ceeae9c6886e8b13f7ea253a307ac301f3536720cbe3de82ba3e98310361b61801a8304ffc91ff774948e33176ddcddf1b76437b3f02c910578d46 Q = 0471db1de1a1f38f356c91feaff5cfe395d1a5b9d23cf6aa19f38ae0bcc90a486decdd6ffb174a50f1cc792985c2f9608c399c98b8a64a69d2b5b7cdd9241f67e2 Sig = 3045022100b0443b33a6f249470d2f943675009d21b9ccbead1525ae57815df86bb20470bf0220316dbee27d998e09128539c269e297ac8f34b9ef8249a0619168c3495c5c1198 Result = F (3 - S changed) Curve = P-256 Digest = SHA384 Msg = b42e547d0e7ddd5e1069bb2d158a5b4d5d9c4310942a1bfd09490311a6e684bd3c29b0dcef86a9788b4b26fed7863f3d5e5439796b5b5ffe7aa2545d0f518ad020689ca21230f3a59e7f8cca465fe21df511e78d215fa805f5f0f88938e9d198515e6b9c819930755c6c6aea5114cd2904607243051c09dd7a147756cbc204a5 Q = 048219b225aa15472262c648cac8de9aad4173d17a231ba24352a5a1c4eea70fad0fee2b08ad39fbf0db0016ef2896ca99adc07efc8c415f640f3720498be26037 Sig = 30450220134fb689101aaad3954de2819d9fbd12072fe2bc36f496bbf0d13fa72114ab96022100e65c232bd915b59e087e7fd5ec90bf636cfa80526345c79a0adfd75003045d6f Result = F (1 - Message changed) Curve = P-256 Digest = SHA384 Msg = aa563223a7d5201febdf13cab80a03dce6077c26e751bc98a941196a28848abc495e0324013c9a2094fb15dc65d100c3e8a136a52c1780b395f42588900b641b6d4361432e2173195a2f60189f3fcc85f4e9659cae52576f20d1852d43c2b400deea3144c8e870e1906d677425d8c85037c7a42a9d249b2da4b516e04476bd45 Q = 04c934195de33b60cf00461fc3c45dad068e9f5f7af5c7fa78591e95aeb04e2617b588dd5f9965fdaa523b475c2812c251bc6973e2df21d9beaace976abf5728cb Sig = 3044022071f302440eb4ed2a939b69e33e905e6fdc545c743458d38f7e1a1d456e35f389022054eaa0eb9cd7503b19a9658f0a04955d9f0ab20ebc8a0877e33c89ee88ad068f Result = F (4 - Q changed) Curve = P-256 Digest = SHA384 Msg = 98e4babf890f52e5a04bd2a7d79bf0ae9a71967847347d87f29fb3997454c73c7979d15b5c4f4205ec3de7835d1885fb7abcf8dcde94baf08b1d691a0c74845317286540e8c9d378fefaa4762c302492f51023c0d7adbb1cc90b7b0335f11203664e71fea621bc2f59d2dbd0ee76d6597ec75510de59b6d25fa6750a71c59435 Q = 049e1adcd48e2e3f0e4c213501808228e587c40558f52bb54ddbb6102d4048ea9234eff98704790938e7e0bdf87ae39807a6b77dfdc9ecdfe6dd0f241abae1aeb2 Sig = 3046022100ce4f0d7480522c8dd1b02dd0eb382f22406642f038c1ede9411883d72b3e7ed00221008546e1ee3b77f9927cdaccbc2f1cf19d6b5576b0f738bb1b86a0c66b39ca56fb Result = F (3 - S changed) Curve = P-256 Digest = SHA384 Msg = bb6b03ad60d6ddbf0c4d17246206e61c886f916d252bb4608149da49cef9033484080e861f91bb2400baa0cd6c5d90c2f275e2fabc12d83847f7a1c3ff0eb40c8a3dd83d07d194ba3797d27238415a2f358d7292a1991af687bcb977486980f9138b3140321485638ac7bd22ecda00ffe5009b83b90397eff24ecf22c5495d67 Q = 0493edbecb0b019c2cc03060f54cb4904b920fdb34eb83badd752be9443036ae13b494e9295e080a9080fe7e73249b3a5904aa84e1c028121eecd3e2cf1a55f598 Sig = 3046022100eec2986d47b71995892b0915d3d5becc4dcb2ab55206d772e0189541b2184ddf0221008a6c1edeb6452627ad27c8319599c54ac44cdd831ea66f13f49d90affe6ad45b Result = P (0 ) Curve = P-256 Digest = SHA384 Msg = 33a5d489f671f396c776bc1acf193bc9a74306f4692dd8e05bcdfe28fdefbd5c09b831c204a1dec81d8e3541f324f7b474d692789013bb1eca066f82fbf3f1cf3ba64e9d8963e9ecc180b9251919e2e8a1ab05847a0d76ff67a47c00e170e38e5b319a56f59cc51038f90961ea27a9a7eb292a0a1aa2f4972568669246907a35 Q = 043205bae876f9bd50b0713959e72457165e826cbbe3895d67320909daa48b0ebcd1592562273e5e0f57bbfb92cedd9af7f133255684ee050af9b6f02019bbcafa Sig = 304402200124f3f1c61ec458561a4eaa6c155bd29e59703d14556324924683db3a4cf43b0220688a5c5fc0c7ba92210c50cce5b512a468a880e05acc21ca56571d89f45f603a Result = F (2 - R changed) Curve = P-384 Digest = SHA256 Msg = a444216c9072caf87fa57c1f04aff9cb83dc2ede9968bda41c9d918825e526c2397cb7d771a7e120582424bbea8ecd56a69bb468cd61437f5a65f04953f9d4018c599afd9edbd4d26e861f86829b9496f829f2b601df73e931fff96559e091417c0d8b8c8129443f7efb985d286c7167b66d2b4d5903583a928db3ed6a883117 Q = 0497c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0 Sig = 306402307b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec02304bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6 Result = F (4 - Q changed) Curve = P-384 Digest = SHA256 Msg = 43c5ffcdf6f9e21aba1b065596745e8738f7b39e1db486a6ae52218d66ce8125fdb155ee281e01b27fa20d0e37d6468a2daedc5fd30573e44b256c5af13df27dea56fd81aef689aad7c022cea77ac3c40a1d64b8c0cf7fb5a128d6a1799da7b8d95308613ceb2260e10b37530edd42925fa5abcdad5d0646ba5bc78c330346eb Q = 0408bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbdd9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73 Sig = 30660231008b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c023100b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49 Result = F (1 - Message changed) Curve = P-384 Digest = SHA256 Msg = 5edd325885296a829b50b16b17e3c4fc3491f1d53384103f1c09a21a169329e07b3758d55c52e9d578fb9e35e8754bfab9fa5e319d0c7fdb45444eda6a2a0a9aaeaa9b7702cce742047146228f9f687e7684d9b4aaa3be03813c004f0418c1a2fe3aa8ddb3658137d7e954e3683a08e0eaad26c0cc3ae0031b191909a3ebade5 Q = 0410a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80da1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e Sig = 3065023100d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f12802300cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673 Result = F (3 - S changed) Curve = P-384 Digest = SHA256 Msg = 4fb73e9e8cbc3e829f99472671ee8719f796dbed096b3cbdf1080ad7f5c410a4541e3526de816fe35ab9e664bb1c1d1e9add2522b9a91eb461b45ae4426e1dfbab7dad03a1392706b9314c03104ea7b40f3632577b0b7c991d2b92460638707572b3387add6ab0f05f6f553fa1fcc50fefe74783cd8b781a35de5ae0e7fc5a58 Q = 048760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cfebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc Sig = 306402301db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d02303e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f Result = F (4 - Q changed) Curve = P-384 Digest = SHA256 Msg = b66ca1d77adf6b2b20c6ef68e50d353a9f5cd0be422f5f6fff8f74506280a55d7923cf047dfdb9147b916f6df6cad8c52257360f746b77edb9949ed4ae9a63d08a7da07c4cf32836574a34f316292b8cc5a6b057129a6baa1182be8a5be1c43739e7d9b0abe07801c2d4343a235037b9aaff14694c051fde4b545931ff9e9a3b Q = 042b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de207133f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934 Sig = 3064023023d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da902302cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb Result = F (4 - Q changed) Curve = P-384 Digest = SHA256 Msg = 862cf14c65ff85f4fdd8a39302056355c89c6ea1789c056262b077dab33abbfda0070fce188c6330de84dfc512744e9fa0f7b03ce0c14858db1952750d7bbe6bd9c8726c0eae61e6cf2877c655b1f0e0ce825430a9796e7420e5c174eab7a50459e291510bc515141738900d390217c5a522e4bde547e57287d8139dc916504e Q = 0486ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66faeac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38 Sig = 30650230798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8023100b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b Result = P (0 ) Curve = P-384 Digest = SHA256 Msg = cc0aac1010fad8555f81423ac25203720853dbe6a465c244388df90839113d59ea3d3521a8a9cbef649f8abe8d6ff8b0cf17ffc199dddb2997511c4b50e944d41cbcdf5d2102dc98d6f9355b211f130d4e89983f63e5dfe6e1b4ffb3caabd1ad96563fb5c0e5905dcb738a59ec2e5d47684707191ff32746a0cbc65b02be7841 Q = 049e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3 Sig = 306402302452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c0230499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38 Result = F (1 - Message changed) Curve = P-384 Digest = SHA256 Msg = b9d8d5d47edaa2dca7d7d687f98264b6e21a8e1eeb20083efedb71c116d13150d95f62a369a79f0f45233d2751a4b36432c7c12e19c8bef37568fa1a347929398b7ee69046e11911e3db472c3bccbd68653d99e461b4e5cfa617f94d59798f333ccf13abf426ca8be0f6587a453632a50c159d96695ad03dbaac716e811a3586 Q = 040cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4 Sig = 306402303812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c540252702305dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398 Result = F (2 - R changed) Curve = P-384 Digest = SHA256 Msg = 6d9cf30d59cc9d6e560e9c52f8be325d19eb3cea592e43bd9584411d76064729c03ad54feb4dce435fb662ff069ca3e19bd16c312567f05018feb8f913caf7553ac728ac787ea3ca073a328633441d7c5cc4d30ec194f248c0701119f7dd80c99e44f469f37cc6726601c97e7d94dc8e549261b46d219a7ea36bee650ccd15cf Q = 046c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce9999435a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e Sig = 306602310089ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed0231008dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04 Result = F (2 - R changed) Curve = P-384 Digest = SHA256 Msg = 2de0c0671213bd4326ffa5a1070ca605733961b11e9f939f805d2d6974d5286e1b1c00adac360f32bd58432629f8c932e241ffaae742c9336f4c95782d4b73255cac0644c8c2d7099c2ba1fd0cf4243344dd8dc0f77004730f5078479955c385959e06303ef2fda8df81e7237251e3e84a03515505e448aa1330a9a1cd4822a5 Q = 04499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed Sig = 3065023025d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5023100e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd Result = F (3 - S changed) Curve = P-384 Digest = SHA256 Msg = 69de70edec5001b0f69ee0b0f1dab6fb22a930dee9a12373fe671f9a5c6804ee1cd027872867c9a4e0bdfed523eb14600cfed64fca415188d56eb651d31731cd3e0efec7251c7defde922cf435ba41454a58d2abf5f29ce5b418a836cab1671d8cdc60aa239a17a42072137cfdc0628715c06b19a2ea2e55005701c220c0924f Q = 049a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da76f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced Sig = 3065023100acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af02307f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa Result = P (0 ) Curve = P-384 Digest = SHA256 Msg = 383ab0251157e645e678100ad3431b9ad96c6279e237ada71d85db0ce3a96fcd4805b2e7676e9a395f1d2f14f24535b77160b22d3d1c7d2e02ec4bbd82058f397db468f4d9ff0ab8306f9becd234f7a7b9c5a4ed44b7474913fe984b5b9e995fae9a951e6e8f2975df67a0180cea81fd4c97eea60a25c15e2ba21092ab0eebd5 Q = 04e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618 Sig = 3065023100c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad702302ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205 Result = F (3 - S changed) Curve = P-384 Digest = SHA256 Msg = b23e83d372422cad7bf633ff84468b5ca0f1902eea801bb2e6e89b45d2f75ef9e08c47e010decdd2cfbd9280b01511164e00bd8323fd06a019e83d3dd23c8aa0313ad5196925b5b7d5c25ff8fd198ac2a234dbe0a13fbd04c4002ea89856e91e789e07e25d56690e0481cdb776a3035a64f4bd571097ef07bd49994f95d8323f Q = 04fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f5718c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e Sig = 3065023100fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f030230485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9 Result = P (0 ) Curve = P-384 Digest = SHA256 Msg = eeef70ae23d95330a71bdde1feb196d599481e057bdbd5ef519ce445a9b5acb46ede325a9caad720e4fc49c198ff5f0910c56a06d0cf76f450da1ad35fecccdb4442f64daa6149ee6b67ab1307ffb5c4b6ca3e72a644d36d9e71c4dd3283d12041e73e6d20ec19b3b20654593a4cca4b2fd9aa12f17d5b00b7ed43df74548010 Q = 04e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d Sig = 306502310096c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a10230373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96 Result = F (1 - Message changed) Curve = P-384 Digest = SHA256 Msg = 7875194a0c3261cf414652cd9970219e3bf8185ad978affebd92ffd40c209a0d17dda0d5b79fefaeba3400088720598cc757aea1fb31ce976fb936726fd4b48d396a35cf4b78d16ddda56067ddc64728dc80b874c5286128b7b5da88808c7df5c3323791720e7ead8b50144dedc15590530b89cd022fd7291c97a4b9889d0568 Q = 04c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d0076689796728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4 Sig = 3065023100d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f521802300941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb Result = F (2 - R changed) Curve = P-384 Digest = SHA384 Msg = 4132833a525aecc8a1a6dea9f4075f44feefce810c4668423b38580417f7bdca5b21061a45eaa3cbe2a7035ed189523af8002d65c2899e65735e4d93a16503c145059f365c32b3acc6270e29a09131299181c98b3c76769a18faf21f6b4a8f271e6bf908e238afe8002e27c63417bda758f846e1e3b8e62d7f05ebd98f1f9154 Q = 041f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b191601c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c Sig = 306502303c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd0231009de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab Result = F (2 - R changed) Curve = P-384 Digest = SHA384 Msg = 9dd789ea25c04745d57a381f22de01fb0abd3c72dbdefd44e43213c189583eef85ba662044da3de2dd8670e6325154480155bbeebb702c75781ac32e13941860cb576fe37a05b757da5b5b418f6dd7c30b042e40f4395a342ae4dce05634c33625e2bc524345481f7e253d9551266823771b251705b4a85166022a37ac28f1bd Q = 04cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb Sig = 3064023033f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba02304428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae Result = P (0 ) Curve = P-384 Digest = SHA384 Msg = 9c4479977ed377e75f5cc047edfa689ef232799513a2e70280e9b124b6c8d166e107f5494b406853aec4cff0f2ca00c6f89f0f4a2d4ab0267f44512dfff110d1b1b2e5e78832022c14ac06a493ab789e696f7f0f060877029c27157ce40f81258729caa4d9778bae489d3ab0259f673308ae1ec1b1948ad2845f863b36aedffb Q = 049b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6 Sig = 30650230202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2023100db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981 Result = F (3 - S changed) Curve = P-384 Digest = SHA384 Msg = 21eb31f2b34e4dde8d6c701e976d3fbbf4de6a3384329118d4ddb49adb2bb44465598abf6df25858b450c7767e282ccaca494088274e37353674eef58f583937d3d184ef727317d3672397a74c8fe327919a3df8fd65af0bc8cebbc40095adf89f1bf2c5e6dc6ba44633fd8433b25f065f5e3eb4840af23cc534415406745a31 Q = 045140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4 Sig = 3065023100b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f02300775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e Result = F (4 - Q changed) Curve = P-384 Digest = SHA384 Msg = 58ea3b1e82f97708053d0b41441d0aa9619050e86ac6c4f7781164e5da3019c47a839366509fa95812e4f64afdc62b627c7a98f633dd05db45c1d8954fc83bdb5042679378bb7e4c7863aacf2026360ca58314983e6c726cf02bb347706b844ddc66aee4177c309cb700769553480cdd6b1cd77341c9a81c05fbb80819bc623f Q = 0431f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc Sig = 30640230706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf023042c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490 Result = F (4 - Q changed) Curve = P-384 Digest = SHA384 Msg = 188cd53097ef3e64b78b9260bf461708c836f25f2bcc98b534af98b96ee4b324e2203a7e62dbc396966f56419fb5135cb124369aaa025f396eac72f05ab45950d9e02cd5a2357eafab9f816117b7f1de192468895327802ec79f5d6b5a3d44d7afbed7b4a308e365655b8db2bde75e143062ee48b7c51688ac5db0bc7c83ec9c Q = 041f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bbf11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4 Sig = 306402303587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c023073a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30 Result = F (4 - Q changed) Curve = P-384 Digest = SHA384 Msg = 6462bc8c0181db7d596a35aa25d5d323dd3b2798054c2af6c22e841b1ccf3dc3ee514f86d4a0cef7a6f7f566ae448b24dcc8d11eb7a585d44923ea1a06c774a2b3eb7409ab17a0065d5834ab00309ad44312a7317259219543e80ddb0cc2a4381bf6e53cd1bb357eba82e11c59f82e446c4b79314119182c0de96a1b5bae0b08 Q = 042039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc Sig = 30640230164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f02304e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54 Result = F (1 - Message changed) Curve = P-384 Digest = SHA384 Msg = 13c63a3cb61f15c659720658a77869145ae8a176c6d93d3a8aa9946236d9fb0463db9e48c667cba731afaa814ba0d58357524f8de28d4c4bbe2691dac9b32632a7dd0f99fd4cb240290878305011f7d3e37ecc410cc1fed601e7901e8be6414ea44317584843a2d2ca2e15103e1ea49365bc384355b3c6fa6ccdd452543e9769 Q = 0446dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b Sig = 306402305ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac02300d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4 Result = F (1 - Message changed) Curve = P-384 Digest = SHA384 Msg = 6939a9118adc307107aa6b0057c280d10fa44a64700c7bd23e1f33a478ad2cfe596c05f72b540cbdb696aac6ab98d9ca8c62f33e182657130b8317a76275a5996333a5d3547e2293b401d0adf60f91e91d2137e34f3336e017c3c6dba6bf5b13dd0de288f9b20a896a92c48e984fbc09f920fab82f3f915d6524b0c11236aca4 Q = 04097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66 Sig = 306502301c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c023100c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c Result = F (2 - R changed) Curve = P-384 Digest = SHA384 Msg = c82071e42c45ac3597f255ba27766afe366e31a553a4d2191360b88a2a349ee077291454bf7b323cb3c9d7fec5533e4e4bf4fb5bc2eb16c6319e9378a3d8a444b2d758123438dbb457b26b14b654b3c88d66838adfa673067c0552d1b8a3ade3a9cb777986c00f65cace53f852c1121acf19516a7cf0ba3820b5f51f31c539a2 Q = 04d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511ae585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe Sig = 3064023049c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f28602301fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7 Result = F (3 - S changed) Curve = P-384 Digest = SHA384 Msg = 137b215c0150ee95e8494b79173d7ae3c3e71efcc7c75ad92f75659ce1b2d7eb555aad8026277ae3709f46e896963964486946b9fe269df444a6ea289ec2285e7946db57ff18f722a583194a9644e863ae452d1457dc5db72ee20c486475f358dc575c621b5ab865c662e483258c7191b4cc218e1f9afeeb3e1cb978ce9657dc Q = 04cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60ef2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6 Sig = 3065023100addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f102301c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e Result = F (2 - R changed) Curve = P-384 Digest = SHA384 Msg = 93e7e75cfaf3fa4e71df80f7f8c0ef6672a630d2dbeba1d61349acbaaa476f5f0e34dccbd85b9a815d908203313a22fe3e919504cb222d623ad95662ea4a90099742c048341fe3a7a51110d30ad3a48a777c6347ea8b71749316e0dd1902facb304a76324b71f3882e6e70319e13fc2bb9f3f5dbb9bd2cc7265f52dfc0a3bb91 Q = 04a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02cd397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec Sig = 3065023100c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe639102306b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0 Result = P (0 ) Curve = P-384 Digest = SHA384 Msg = 15493aa10cfb804b3d80703ca02af7e2cfdc671447d9a171b418ecf6ca48b450414a28e7a058a78ab0946186ad2fe297e1b7e20e40547c74f94887a00f27dde7f78a3c15eb1115d704972b35a27caf8f7cdcce02b96f8a72d77f36a20d3f829e915cd3bb81f9c2997787a73616ed5cb0e864231959e0b623f12a18f779599d65 Q = 04d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a621f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3 Sig = 306402306101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd438302304e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f Result = F (1 - Message changed) Curve = P-384 Digest = SHA384 Msg = bc5582967888a425fb757bd4965900f01e6695d1547ed967c1d4f67b1b1de365d203f407698761699fec5f5a614c21e36a9f57a8aaf852e95538f5615785534568811a9a9ccc349843f6c16dc90a4ac96a8f72c33d9589a860f4981d7b4ee7173d1db5d49c4361368504c9a6cbbaedc2c9bff2b12884379ba90433698ceb881d Q = 04d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661 Sig = 3065023100e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c9580230696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389 Result = P (0 ) Curve = P-384 Digest = SHA384 Msg = 4f31331e20a3273da8fce6b03f2a86712ed5df41120a81e994d2b2f370e98ef35b847f3047d3cf57e88350e27b9ac3f02073ac1838db25b5ad477aee68930882304fc052f273821056df7500dc9eab037ed3ac3c75396e313bf0f4b89b26675af55f3378cf099d9d9a25a4887c1cfd2448f5b2188c41d6fa26045c5e974bf3e4 Q = 04c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e Sig = 3066023100b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44023100d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344 Result = F (3 - S changed) ring-0.16.9/tests/ecdsa_verify_fixed_tests.txt000064400000000000000000000345571352331573000177230ustar0000000000000000# Test vectors for short (zero-padded) values of s. # S is the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = 341f6779b75e98bb42e01095dd48356cbf9002dc704ac8bd2a8240b88d3796c6555843b1b4e264fe6ffe6e2b705a376c05c09404303ffe5d2711f3e3b3a010a1 Result = P (0 ) # S is one byte shorter than the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = 31ed574e9688aed7016e985c0e742fb788be73d9ad0a895e6182c77751817ed000d98eb6d480d64d1729c680693cb13bd6bf0c7b651007e459e667683ff65b92 Result = P (0 ) # S is 2 bytes shorter than the maximum length. Curve = P-256 Digest = SHA256 Msg = "" Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 Sig = f59cf66594cc837415f16494fb52c02f2a6264bf6ce7dccbf2f78c090cdcefb000005a8c8a04ba7825f3f8e56517056daa1a51129cd91382a24589ed05d0c13d Result = P (0 ) # S is the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = 85ac708d4b0126bac1f5eeebdf911409070a286fdde5649582611b60046de353761660dd03903f58b44148f25142eef8183475ec1f1392f3d6838abc0c01724709c446888bed7f2ce4642c6839dc18044a2a6ab9ddc960bfac79f6988e62d452 Result = P (0 ) # S is one byte shorter than the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = 4dec97b54c4150ebaffc2dbfc2bc17c302be47cfc4b541ada34108b1080f2482a3e7f5f2b16f730210bd8c29b6681e0b000575984f37064bfbbdda76836f5ef2d632f006c338a9585c8b9108c46ea812ce066110156de9806ae5711153e2ef0b Result = P (0 ) # S is 2 bytes shorter than the maximum length. Curve = P-384 Digest = SHA384 Msg = "" Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 Sig = ad8e51ec23d5b8130a5e0636a2f0d1740e8b5404c368b7dab5ae82d307d653c6ef70dcee70b112bf678801f87fb8f5a90000806d69e0c2834c27666996d55655cf9358b201aa85d3b08891abcc68c854cac6c67c53b3bf92df9a677d11aba13d Result = P (0 ) # Generated Test vectors. # # TODO: Test the range of `r` in addition to the range of `s`. # TODO: Test what happens when the message digests to zero. # TODO: Additional test coverage. libsecp256k1 is a good example. # Test vectors for Gregory Maxwell's trick. # # In all cases, the `s` component of the signature was selected # arbitrarily as 4 and then the `r` component was chosen to be the # smallest value where the public key recovery from the signature # works. # The signature has r < q - n. This is the control case for the next # test case; this signature is the same but the public key is # different. Notice that both public keys work for the same signature! # This signature will validate even if the implementation doesn't # reduce the X coordinate of the multiplication result (mod n). Curve = P-256 Digest = SHA256 Msg = "" Q = 041548fc88953e06cd34d4b300804c5322cb48c24aaaa4d07a541b0f0ccfeedeb0ae4991b90519ea405588bdf699f5e6d0c6b2d5217a5c16e8371062737aa1dae1 Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r < q - n. s Since r < q - n, r + n < q. Notice # that this signature is the same as the signature in the preceding # test case, but the public key is different. That the signature # validates for this case too is what's special about the case where # r < q - n. If this test case fails it is likely that the # implementation doesn't reduce the X coordinate of the multiplication # result (mod n), or it is missing the second step of Gregory # Maxwell's trick. Curve = P-256 Digest = SHA256 Msg = "" Q = 04ad8f60e4ec1ebdb6a260b559cb55b1e9d2c5ddd43a41a2d11b0741ef2567d84e166737664104ebbc337af3d861d3524cfbc761c12edae974a0759750c8324f9a Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r. r + n > q since r > q - n. This is the control # for the next test case; this signature is the same as the signature # in the following test case but the public key is different. Curve = P-256 Digest = SHA256 Msg = "" Q = 0445bd879143a64af5746e2e82aa65fd2ea07bba4e35594095a981b59984dacb219d59697387ac721b1f1eccf4b11f43ddc39e8367147abab3084142ed3ea170e4 Sig = 000000000000000000000000000000004319055358e8617b0c46353d039cdaae0000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r + n (mod q). r + n > q since r > q - n, and so # r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice # that this signature is the same as the signature in the preceding # test case but the public key is different. Also, notice that the # signature fails to validate in this case, unlike other related test # cases. If this test case fails (the signature validates), it is # likely that the implementation didn't guard the second case of # Gregory Maxwell's trick on the condition r < q - n. Curve = P-256 Digest = SHA256 Msg = "" Q = 040feb5df4cc78b35ec9c180cc0de5842f75f088b48456978ffa98e716d94883e1e6500b2a1f6c1d9d493428d7ae7d9a8a560fff30a3d14aa160be0c5e7edcd887 Sig = 000000000000000000000000000000004319055358e8617b0c46353d039cdaae0000000000000000000000000000000000000000000000000000000000000004 Result = F # The signature has r < q - n. This is the control case for the next # test case; this signature is the same but the public key is # different. Notice that both public keys work for the same signature! # This signature will validate even if the implementation doesn't # reduce the X coordinate of the multiplication result (mod n). Curve = P-384 Digest = SHA384 Msg = "" Q = 0425b890b9597155baf7e7ffb48d8123184cbb76ea3f7b10d8f1702136f969e915188cff306c67950437f816ce6ecb739204cc069edac95929dfbd719313552797962789e2210a0bf270c2f0ffc109a70e40da6303a2599bdd702c19070dd51f42 Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r < q - n. s Since r < q - n, r + n < q. Notice # that this signature is the same as the signature in the preceding # test case, but the public key is different. That the signature # validates for this case too is what's special about the case where # r < q - n. If this test case fails it is likely that the # implementation doesn't reduce the X coordinate of the multiplication # result (mod n), or it is missing the second step of Gregory # Maxwell's trick. Curve = P-384 Digest = SHA384 Msg = "" Q = 045a3c576f0c2a615063c6e8ec40f5bf0dd67e549e9f13f8f881703ec40a8d6d8ecbb0d8e5b20f3aa0f2e581b594cea3e654a450cabcf24bd908cc47da98eba648a0440332ee19fb53da96dddaec521f718f7b52a161b67134d6e0d6e81dc45502 Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r. r + n > q since r > q - n. This is the control # for the next test case; this signature is the same as the signature # in the following test case but the public key is different. Curve = P-384 Digest = SHA384 Msg = "" Q = 04a93588bffb32417bd2b0fa03a6a30d2cf90034e6070b9333d4e7a42fe88bce5a03e8be7f2a84fbc25ec84dc34915c53fd975cfd0db77ec2b5c548994dc9f62756e018882a31d883471b0bbbd8588d9a2acab1aeaaa1eb217f8e528e7114162df Sig = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 Result = P (0 ) # The signature has r > q - n. The signature is for the public key # recovered from r + n (mod q). r + n > q since r > q - n, and so # r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice # that this signature is the same as the signature in the preceding # test case but the public key is different. Also, notice that the # signature fails to validate in this case, unlike other related test # cases. If this test case fails (the signature validates), it is # likely that the implementation didn't guard the second case of # Gregory Maxwell's trick on the condition r < q - n. Curve = P-384 Digest = SHA384 Msg = "" Q = 04576270f9571c9e99b9c71be1a1a705e5155e46b8c6dd920c14e2aaf0f9f96ed30754e2c8f8464d015a9bc779495ea568ac39c555c3b03de021e8167a27425588d6a82b68cf7a0f6ae389a202d8663ed32b5e1782c0377a8f0dc309ae28143961 Sig = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 Result = F # Generated Test vectors edge cases of signature (r, s) values. # s == 0 (out of range) Curve = P-256 Digest = SHA256 Msg = "" Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000 Result = F # s == 1 (minimum allowed) Curve = P-256 Digest = SHA256 Msg = "" Q = 046e3f95fae7606c1cdfab1f1560de160ed806bbc2a85dc5a2d002aa1c0ac3e1fb5bcd5f7a325415824365cc584f08c144118318ce4d0f5df82b7753b291c4fe96 Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001 Result = P (0 ) # s == n (out of range) Curve = P-256 Digest = SHA256 Msg = "" Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 Result = F # s == n - 1 (maximum allowed) Curve = P-256 Digest = SHA256 Msg = "" Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 Result = P (0 ) # s == n - 1 (maximum allowed), missing first zero byte. Curve = P-256 Digest = SHA256 Msg = "" Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 Sig = 00000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 Result = F # s == n - 1 (maximum allowed), missing last nonzero byte. Curve = P-256 Digest = SHA256 Msg = "" Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325 Result = F # s == 0 (out of range) Curve = P-384 Digest = SHA384 Msg = "" Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Result = F # s == 1 (minimum allowed) Curve = P-384 Digest = SHA384 Msg = "" Q = 042aadde5424928b888e20ecef2525f99d646519aa994c075a4081aa852ec309a6ac63006421ff756c6c0924d611d1bda82df99267266ba603b07ba85c678f4ae69daf4634a5e597d77d0b0338f343d8090b2d4420a29302ab47ef04ad45e1461f Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Result = P (0 ) # s == n (out of range) Curve = P-384 Digest = SHA384 Msg = "" Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 Result = F # s == n - 1 (maximum allowed) Curve = P-384 Digest = SHA384 Msg = "" Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 Result = P (0 ) # s == n - 1 (maximum allowed), missing first zero byte. Curve = P-384 Digest = SHA384 Msg = "" Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b Sig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 Result = F # s == n - 1 (maximum allowed), missing last nonzero byte. Curve = P-384 Digest = SHA384 Msg = "" Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529 Result = F ring-0.16.9/tests/ed25519_from_pkcs8_tests.txt000064400000000000000000000060041352416253600172210ustar0000000000000000# v2. The private key ends with a zero byte. Input = 3053020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 # v2. The private key's last byte, zero, is omitted. Input = 3052020101300506032b65700421041fa22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749aa1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 Error = InvalidEncoding # v2. The private key starts with a zero byte. Input = 3053020101300506032b65700422042000b1a7c20b2b4ed9c78f3686db82f854734cdc95be51def304d98e0cd30bf490a12303210063457cd4dfdd0e98a53796265831d46ac6a5a685f2a54c9697a38b2c800d60ba # v2. The private key's first byte, zero, is omitted. Input = 3052020101300506032b65700421041fb1a7c20b2b4ed9c78f3686db82f854734cdc95be51def304d98e0cd30bf490a12303210063457cd4dfdd0e98a53796265831d46ac6a5a685f2a54c9697a38b2c800d60ba Error = InvalidEncoding # v2. The public key's first byte is zero. Input = 3053020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a12303210000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c8c # v2. The public key's first byte, zero, is omitted. Input = 3052020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a122032000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c8c Error = InvalidEncoding # v2. The public key's last byte is zero. Input = 3053020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1230321009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e400 # v2. The public key's last byte, zero, is omitted (valid ASN.1 DER). Input = 3052020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1220320009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e4 Error = InvalidEncoding # v2. The public key's last byte, zero, has been truncated (invalid ASN.1 DER). Input = 3053020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1230321009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e4 Error = InvalidEncoding # v2. The public key's high bit has been flipped. Ed25519 public keys don't # have their high bit masked, so this is wrong. Input = 3053020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a12303210000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c0c Error = InconsistentComponents # v2. Valid except the public key field is missing. Input = 302e020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00 Error = PublicKeyIsMissing # v2. Valid except the public key is encoded as [0] instead of [1]; i.e. the # attributes are invalid and the public key is missing. Input = 3053020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a0230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 Error = PublicKeyIsMissing ring-0.16.9/tests/ed25519_from_pkcs8_unchecked_tests.txt000064400000000000000000000014361352416253600212360ustar0000000000000000# An Ed25519 private key. (This is from BoringSSL's tests.) Input = 302e020100300506032b6570042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 # The same as the above, but with an invalid NULL parameter. (This is from BoringSSL's tests.) Input = 3030020100300706032b65700500042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 Error = WrongAlgorithm # Sample private key from draft-ietf-curdle-pkix-04. Input = 302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842 # v1. valid except it includes publicKey. Input = 3053020100300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 Error = InvalidEncoding ring-0.16.9/tests/ed25519_test_private_key.bin000064400000000000000000000000401352331573000172230ustar0000000000000000aZ`J,DIi{2ip;`ring-0.16.9/tests/ed25519_test_private_key.p8000064400000000000000000000001251352416253600170130ustar00000000000000000S0+ep" ]>! XMEw5|cI#!X X~WX5ök}ring-0.16.9/tests/ed25519_test_public_key.bin000064400000000000000000000000401352331573000170270ustar0000000000000000Z Kd:rڦ#%hQring-0.16.9/tests/ed25519_test_public_key.der000064400000000000000000000000401352416253600170360ustar0000000000000000X X~WX5ök}ring-0.16.9/tests/ed25519_tests.rs000064400000000000000000000140271353036607100146740ustar0000000000000000// Copyright 2015-2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use ring::{ signature::{self, Ed25519KeyPair, KeyPair}, test, test_file, }; /// Test vectors from BoringSSL. #[test] fn test_signature_ed25519() { test::run(test_file!("ed25519_tests.txt"), |section, test_case| { assert_eq!(section, ""); let seed = test_case.consume_bytes("SEED"); assert_eq!(32, seed.len()); let public_key = test_case.consume_bytes("PUB"); assert_eq!(32, public_key.len()); let msg = test_case.consume_bytes("MESSAGE"); let expected_sig = test_case.consume_bytes("SIG"); { let key_pair = Ed25519KeyPair::from_seed_and_public_key(&seed, &public_key).unwrap(); let actual_sig = key_pair.sign(&msg); assert_eq!(&expected_sig[..], actual_sig.as_ref()); } // Test PKCS#8 generation, parsing, and private-to-public calculations. let rng = test::rand::FixedSliceRandom { bytes: &seed }; let pkcs8 = Ed25519KeyPair::generate_pkcs8(&rng).unwrap(); let key_pair = Ed25519KeyPair::from_pkcs8(pkcs8.as_ref()).unwrap(); assert_eq!(public_key, key_pair.public_key().as_ref()); // Test Signature generation. let actual_sig = key_pair.sign(&msg); assert_eq!(&expected_sig[..], actual_sig.as_ref()); // Test Signature verification. assert!( signature::UnparsedPublicKey::new(&signature::ED25519, &public_key) .verify(&msg, &expected_sig) .is_ok() ); let mut tampered_sig = expected_sig; tampered_sig[0] ^= 1; assert!( signature::UnparsedPublicKey::new(&signature::ED25519, &public_key) .verify(&msg, &tampered_sig) .is_err() ); Ok(()) }); } #[test] fn test_ed25519_from_seed_and_public_key_misuse() { const PRIVATE_KEY: &[u8] = include_bytes!("ed25519_test_private_key.bin"); const PUBLIC_KEY: &[u8] = include_bytes!("ed25519_test_public_key.bin"); assert!(Ed25519KeyPair::from_seed_and_public_key(PRIVATE_KEY, PUBLIC_KEY).is_ok()); // Truncated private key. assert!(Ed25519KeyPair::from_seed_and_public_key(&PRIVATE_KEY[..31], PUBLIC_KEY).is_err()); // Truncated public key. assert!(Ed25519KeyPair::from_seed_and_public_key(PRIVATE_KEY, &PUBLIC_KEY[..31]).is_err()); // Swapped public and private key. assert!(Ed25519KeyPair::from_seed_and_public_key(PUBLIC_KEY, PRIVATE_KEY).is_err()); } #[test] fn test_ed25519_from_pkcs8_unchecked() { // Just test that we can parse the input. test::run( test_file!("ed25519_from_pkcs8_unchecked_tests.txt"), |section, test_case| { assert_eq!(section, ""); let input = test_case.consume_bytes("Input"); let error = test_case.consume_optional_string("Error"); match ( Ed25519KeyPair::from_pkcs8_maybe_unchecked(&input), error.clone(), ) { (Ok(_), None) => (), (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), (Err(actual), Some(expected)) => assert_eq!(actual.description_(), expected), }; Ok(()) }, ); } #[test] fn test_ed25519_from_pkcs8() { // Just test that we can parse the input. test::run( test_file!("ed25519_from_pkcs8_tests.txt"), |section, test_case| { assert_eq!(section, ""); let input = test_case.consume_bytes("Input"); let error = test_case.consume_optional_string("Error"); match (Ed25519KeyPair::from_pkcs8(&input), error.clone()) { (Ok(_), None) => (), (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), (Err(actual), Some(expected)) => assert_eq!(actual.description_(), expected), }; Ok(()) }, ); } #[test] fn ed25519_test_public_key_coverage() { const PRIVATE_KEY: &[u8] = include_bytes!("ed25519_test_private_key.p8"); const PUBLIC_KEY: &[u8] = include_bytes!("ed25519_test_public_key.der"); const PUBLIC_KEY_DEBUG: &'static str = "PublicKey(\"5809e9fef6dcec58f0f2e3b0d67e9880a11957e083ace85835c3b6c8fbaf6b7d\")"; let key_pair = signature::Ed25519KeyPair::from_pkcs8(PRIVATE_KEY).unwrap(); // Test `AsRef<[u8]>` assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); // Test `Clone`. let _ = key_pair.public_key().clone(); // Test `Debug`. assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); assert_eq!( format!( "Ed25519KeyPair {{ public_key: {:?} }}", key_pair.public_key() ), format!("{:?}", key_pair) ); } ring-0.16.9/tests/ed25519_tests.txt000064400000000000000000014474431352416253600151070ustar0000000000000000# Additional test vectors from RFC 8032 SEED = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 PUB = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e MESSAGE = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0 SIG = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03 SEED = 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42 PUB = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf MESSAGE = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f SIG = dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704 # These were generated from # http://ed25519.cr.yp.to/python/sign.input using the following Python script: # # import sys # # isFirst = True # # for line in sys.stdin.readlines(): # (private, public, message, sig_and_message, _) = line.split(':') # # if not isFirst: # print # print "PRIV:", private # print "PUB:", public # print "MESSAGE:", message # print "SIG:", sig_and_message[:128] # isFirst = False # # This was adapted for *ring* by s/: / = /, denoting empty inputs with "", # and replacing "PRIV" with "SEED", the first half of "PRIV". SEED = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 PUB = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a MESSAGE = "" SIG = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b SEED = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb PUB = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c MESSAGE = 72 SIG = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00 SEED = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 PUB = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 MESSAGE = af82 SIG = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a SEED = 0d4a05b07352a5436e180356da0ae6efa0345ff7fb1572575772e8005ed978e9 PUB = e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057 MESSAGE = cbc77b SIG = d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c SEED = 6df9340c138cc188b5fe4464ebaa3f7fc206a2d55c3434707e74c9fc04e20ebb PUB = c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7 MESSAGE = 5f4c8989 SIG = 124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07 SEED = b780381a65edf8b78f6945e8dbec7941ac049fd4c61040cf0c324357975a293c PUB = e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01 MESSAGE = 18b6bec097 SIG = b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09 SEED = 78ae9effe6f245e924a7be63041146ebc670dbd3060cba67fbc6216febc44546 PUB = fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d MESSAGE = 89010d855972 SIG = 6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300 SEED = 691865bfc82a1e4b574eecde4c7519093faf0cf867380234e3664645c61c5f79 PUB = 98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63 MESSAGE = b4a8f381e70e7a SIG = 6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107 SEED = 3b26516fb3dc88eb181b9ed73f0bcd52bcd6b4c788e4bcaf46057fd078bee073 PUB = f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863 MESSAGE = 4284abc51bb67235 SIG = d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08 SEED = edc6f5fbdd1cee4d101c063530a30490b221be68c036f5b07d0f953b745df192 PUB = c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd MESSAGE = 672bf8965d04bc5146 SIG = 2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901 SEED = 4e7d21fb3b1897571a445833be0f9fd41cd62be3aa04040f8934e1fcbdcacd45 PUB = 31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff MESSAGE = 33d7a786aded8c1bf691 SIG = 28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08 SEED = a980f892db13c99a3e8971e965b2ff3d41eafd54093bc9f34d1fd22d84115bb6 PUB = 44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f MESSAGE = 3486f68848a65a0eb5507d SIG = 77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100 SEED = 5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9 PUB = 6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257 MESSAGE = 5a8d9d0a22357e6655f9c785 SIG = 0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e SEED = 940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800 PUB = a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd MESSAGE = b87d3813e03f58cf19fd0b6395 SIG = d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c SEED = 9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738 PUB = cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291 MESSAGE = 55c7fa434f5ed8cdec2b7aeac173 SIG = 6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06 SEED = d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300 PUB = fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5 MESSAGE = 0a688e79be24f866286d4646b5d81c SIG = f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00 SEED = 0a47d10452ae2febec518a1c7c362890c3fc1a49d34b03b6467d35c904a8362d PUB = 34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b MESSAGE = c942fa7ac6b23ab7ff612fdc8e68ef39 SIG = 2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c SEED = f8148f7506b775ef46fdc8e8c756516812d47d6cfbfa318c27c9a22641e56f17 PUB = 0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372 MESSAGE = 7368724a5b0efb57d28d97622dbde725af SIG = 3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b SEED = 77f88691c4eff23ebb7364947092951a5ff3f10785b417e918823a552dab7c75 PUB = 74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b MESSAGE = bd8e05033f3a8bcdcbf4beceb70901c82e31 SIG = fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a SEED = ab6f7aee6a0837b334ba5eb1b2ad7fcecfab7e323cab187fe2e0a95d80eff132 PUB = 5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c MESSAGE = 8171456f8b907189b1d779e26bc5afbb08c67a SIG = 73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09 SEED = 8d135de7c8411bbdbd1b31e5dc678f2ac7109e792b60f38cd24936e8a898c32d PUB = 1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f MESSAGE = 8ba6a4c9a15a244a9c26bb2a59b1026f21348b49 SIG = a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105 SEED = 0e765d720e705f9366c1ab8c3fa84c9a44370c06969f803296884b2846a652a4 PUB = 7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8 MESSAGE = 1d566a6232bbaab3e6d8804bb518a498ed0f904986 SIG = bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f SEED = db36e326d676c2d19cc8fe0c14b709202ecfc761d27089eb6ea4b1bb021ecfa7 PUB = 48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85 MESSAGE = 1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4 SIG = b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300 SEED = c89955e0f7741d905df0730b3dc2b0ce1a13134e44fef3d40d60c020ef19df77 PUB = fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c MESSAGE = 507c94c8820d2a5793cbf3442b3d71936f35fe3afef316 SIG = 7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c SEED = 4e62627fc221142478aee7f00781f817f662e3b75db29bb14ab47cf8e84104d6 PUB = b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107 MESSAGE = d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5 SIG = 836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a SEED = 6b83d7da8908c3e7205b39864b56e5f3e17196a3fc9c2f5805aad0f5554c142d PUB = d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6 MESSAGE = 6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c SIG = 16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08 SEED = 19a91fe23a4e9e33ecc474878f57c64cf154b394203487a7035e1ad9cd697b0d PUB = 2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23 MESSAGE = 82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c SIG = 881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f SEED = 1d5b8cb6215c18141666baeefcf5d69dad5bea9a3493dddaa357a4397a13d4de PUB = 94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835 MESSAGE = a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0 SIG = 3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c SEED = 6a91b3227c472299089bdce9356e726a40efd840f11002708b7ee55b64105ac2 PUB = 9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e MESSAGE = 5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc SIG = f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101 SEED = 93eaa854d791f05372ce72b94fc6503b2ff8ae6819e6a21afe825e27ada9e4fb PUB = 16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5 MESSAGE = 32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5 SIG = d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07 SEED = 941cac69fb7b1815c57bb987c4d6c2ad2c35d5f9a3182a79d4ba13eab253a8ad PUB = 23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b MESSAGE = bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa SIG = 0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02 SEED = 1acdbb793b0384934627470d795c3d1dd4d79cea59ef983f295b9b59179cbb28 PUB = 3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a MESSAGE = 7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56 SIG = be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507 SEED = 8ed7a797b9cea8a8370d419136bcdf683b759d2e3c6947f17e13e2485aa9d420 PUB = b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9 MESSAGE = a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3 SIG = 04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b SEED = f2ab396fe8906e3e5633e99cabcd5b09df0859b516230b1e0450b580b65f616c PUB = 8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b MESSAGE = 5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187 SIG = a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c SEED = 550a41c013f79bab8f06e43ad1836d51312736a9713806fafe6645219eaa1f9d PUB = af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0 MESSAGE = 8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27 SIG = 16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04 SEED = 19ac3e272438c72ddf7b881964867cb3b31ff4c793bb7ea154613c1db068cb7e PUB = f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f MESSAGE = 95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645 SIG = ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701 SEED = ca267de96c93c238fafb1279812059ab93ac03059657fd994f8fa5a09239c821 PUB = 017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26 MESSAGE = e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531 SIG = ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c SEED = 3dff5e899475e7e91dd261322fab09980c52970de1da6e2e201660cc4fce7032 PUB = f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b MESSAGE = 938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382 SIG = 5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805 SEED = 9a6b847864e70cfe8ba6ab22fa0ca308c0cc8bec7141fbcaa3b81f5d1e1cfcfc PUB = 34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930 MESSAGE = 838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da SIG = 2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905 SEED = 575be07afca5d063c238cd9b8028772cc49cda34471432a2e166e096e2219efc PUB = 94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0 MESSAGE = 33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e SIG = 58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506 SEED = 15ffb45514d43444d61fcb105e30e135fd268523dda20b82758b179423110441 PUB = 1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8 MESSAGE = da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e SIG = 6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08 SEED = fe0568642943b2e1afbfd1f10fe8df87a4236bea40dce742072cb21886eec1fa PUB = 299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61 MESSAGE = c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d SIG = d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404 SEED = 5ecb16c2df27c8cf58e436a9d3affbd58e9538a92659a0f97c4c4f994635a8ca PUB = da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d MESSAGE = 56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9 SIG = 1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a SEED = d599d637b3c30a82a9984e2f758497d144de6f06b9fba04dd40fd949039d7c84 PUB = 6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f MESSAGE = a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e SIG = ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205 SEED = 30ab8232fa7018f0ce6c39bd8f782fe2e159758bb0f2f4386c7f28cfd2c85898 PUB = ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37 MESSAGE = 63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc SIG = 9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c SEED = 0ddcdc872c7b748d40efe96c2881ae189d87f56148ed8af3ebbbc80324e38bdd PUB = 588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85 MESSAGE = 65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12 SIG = c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403 SEED = 89f0d68299ba0a5a83f248ae0c169f8e3849a9b47bd4549884305c9912b46603 PUB = aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832 MESSAGE = 4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05 SIG = 2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b SEED = 0a3c1844e2db070fb24e3c95cb1cc6714ef84e2ccd2b9dd2f1460ebf7ecf13b1 PUB = 72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01 MESSAGE = 4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957 SIG = 87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05 SEED = c8d7a8818b98dfdb20839c871cb5c48e9e9470ca3ad35ba2613a5d3199c8ab23 PUB = 90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f MESSAGE = 783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff SIG = fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b SEED = b482703612d0c586f76cfcb21cfd2103c957251504a8c0ac4c86c9c6f3e429ff PUB = fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad MESSAGE = 29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b SIG = 58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607 SEED = 84e50dd9a0f197e3893c38dbd91fafc344c1776d3a400e2f0f0ee7aa829eb8a2 PUB = 2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea MESSAGE = f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123 SIG = 69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500 SEED = b322d46577a2a991a4d1698287832a39c487ef776b4bff037a05c7f1812bdeec PUB = eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f MESSAGE = 19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5 SIG = c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802 SEED = 960cab5034b9838d098d2dcbf4364bec16d388f6376d73a6273b70f82bbc98c0 PUB = 5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a MESSAGE = f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308 SIG = 27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01 SEED = eb77b2638f23eebc82efe45ee9e5a0326637401e663ed029699b21e6443fb48e PUB = 9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc MESSAGE = 99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab SIG = 18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06 SEED = b625aa89d3f7308715427b6c39bbac58effd3a0fb7316f7a22b99ee5922f2dc9 PUB = 65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e MESSAGE = e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a SIG = 01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d SEED = b1c9f8bd03fe82e78f5c0fb06450f27dacdf716434db268275df3e1dc177af42 PUB = 7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf MESSAGE = 331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2 SIG = 4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701 SEED = 6d8cdb2e075f3a2f86137214cb236ceb89a6728bb4a200806bf3557fb78fac69 PUB = 57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda MESSAGE = 7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf SIG = a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b SEED = 47adc6d6bf571ee9570ca0f75b604ac43e303e4ab339ca9b53cacc5be45b2ccb PUB = a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be MESSAGE = ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739 SIG = 4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b SEED = 3c19b50b0fe47961719c381d0d8da9b9869d312f13e3298b97fb22f0af29cbbe PUB = 0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612 MESSAGE = 8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f SIG = efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704 SEED = 34e1e9d539107eb86b393a5ccea1496d35bc7d5e9a8c5159d957e4e5852b3eb0 PUB = 0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76 MESSAGE = a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0 SIG = 32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09 SEED = 49dd473ede6aa3c866824a40ada4996c239a20d84c9365e4f0a4554f8031b9cf PUB = 788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501 MESSAGE = 3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c SIG = d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f SEED = 331c64da482b6b551373c36481a02d8136ecadbb01ab114b4470bf41607ac571 PUB = 52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521 MESSAGE = 20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3 SIG = 22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600 SEED = 5c0b96f2af8712122cf743c8f8dc77b6cd5570a7de13297bb3dde1886213cce2 PUB = 0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1 MESSAGE = 54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575 SIG = 06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b SEED = de84f2435f78dedb87da18194ff6a336f08111150def901c1ac418146eb7b54a PUB = d3a92bbaa4d63af79c2226a7236e6427428df8b362427f873023b22d2f5e03f2 MESSAGE = 205135ec7f417c858072d5233fb36482d4906abd60a74a498c347ff248dfa2722ca74e879de33169fadc7cd44d6c94a17d16e1e630824ba3e0df22ed68eaab SIG = 471ebc973cfdaceec07279307368b73be35bc6f8d8312b70150567369096706dc471126c3576f9f0eb550df5ac6a525181110029dd1fc11174d1aaced48d630f SEED = ba4d6e67b2ce67a1e44326494044f37a442f3b81725bc1f9341462718b55ee20 PUB = f73fa076f84b6db675a5fda5ad67e351a41e8e7f29add16809ca010387e9c6cc MESSAGE = 4bafdac9099d4057ed6dd08bcaee8756e9a40f2cb9598020eb95019528409bbea38b384a59f119f57297bfb2fa142fc7bb1d90dbddde772bcde48c5670d5fa13 SIG = 57b9d2a711207f837421bae7dd48eaa18eab1a9a70a0f1305806fee17b458f3a0964b302d1834d3e0ac9e8496f000b77f0083b41f8a957e632fbc7840eee6a06 SEED = 0d131c45aea6f3a4e1b9a2cf60c55104587efaa846b222bf0a7b74ce7a3f63b6 PUB = 3c6729dbe93b499c4e614a2f21beb729438d498e1ac8d14cbad9717a5dbd97cd MESSAGE = b4291d08b88fb2f7b8f99d0dce40079fcbab718bbd8f4e8eabc3c1428b6a071fb2a3c8eba1cacccfa871b365c708bef2685bc13e6b80bc14a5f249170ffc56d014 SIG = a9c5ee86fb06d9e46b379c32dda7c92c9c13db274dc24116fbdd878696045488cc75a52fff67d1a5113d06e333ac67ff664b3f2a405fa1d14dd5bbb97409b606 SEED = a75e3b6b4170e444781be4eeac3e0fdaa4b4356f705486bcb071a325ae071fba PUB = 993d38a7d72f0aee15ff6f4fdc37ca7724fd1373a3766b275dbc77e647980e0a MESSAGE = 4037866f6548b01cc6bcf3a940e3945aa2d188b4b7f182aa77ec4d6b0428ab5b84d85df192a5a38ada089d76fa26bf67736a7041a5eb8f0c5719eb396693c45160f8 SIG = a5db4d3d3329abe3697959e6b5947ea8601b03ef8e1d6fe202144931272ca0a09b5eb0f390572ea7ef03c6131e9de5f16bf0b034244f7e104ff5311bbf663a0d SEED = bcbcf561ecc05a41c7d7e55e696d32ce39b4d03c1f5f3f3a8927fe5e62e844b2 PUB = 4ddf53fad6a7a9ed30f3afecca136fd7843b72c243090891ae4021a32cadff1a MESSAGE = 6f6716b6784740980aebc3248807e31c1286ac7b681c00b66c88ff7a336d441fa5c3eb256d20cf6d1ac92ccfe4be6dcc41b1aff846d360c243001cabdfbf1a9b240455 SIG = 9ff15115f6661f3211d7a40764967629ba6a5263951bdc3c6a4c90d070f7be00024b80d83b6bc27587fcff5f5ccc0eb3cde1497cf56895147a063f61f08adf0b SEED = 210532805fa9cc9be916d213cac374e3cd6fc2602a544d0c1ce29d30105d69ab PUB = 10699e499be99e2b11b98f6f86b67cdc4ccf69f3c53ce094875647d2d0d0ecc5 MESSAGE = 9fc4d28cfd25e6c0c5e724e19ca39d71e53bf4aa2796c54c3351f108fc70f2611a62e0ab90af6ade5216788e9eb2a873059b1e79d7d59debd68f2d4d80ffe31bf74b928c SIG = 4c2d31d5bbc42e026dc1e079ecc4dd072c5d2cce65e3db8d8a1dd9057faa0371727f727231a0f060fa27097533b6db3b8f6252f2793d75662caadf5f0fcc710e SEED = 185d64b69479e0ba0a5844a10ad84125ba11c4b40d63eda2c57afc7e019c8e0c PUB = a5764f6398a5ae2266a38f9714533c4bbd8d07826f63e204cbac374b0acef1bd MESSAGE = 4a0824fe70d4315413d0a0cafbf4f5fe117d5e07e1c3a4effb9d0ae91490234878ccf6792a91f68c6a520de16071f08abe35dc5ea428f1957b663371ce24c609dd55b8f493 SIG = 43e0387da5ba09a190f6e7b2680578d889769bcc445e5ef571b492871c155c5b9f620bfacfbf2df1fd87444604b71b2e237baaa7ee2093ede4a601edf883e307 SEED = cfa9d9164b3c4f6f722635d2066cd7ea5e5533d2c74f8add669c371faa476426 PUB = 41169a66f9a63f285782a6c2db81cc3f70b3ada21a68c84745c88a74c3b0a2de MESSAGE = 757621b1675db7cacef7f2782587ff3af51a3ef2f4bcf9279c4ce94002e1f00424bf0eb621982cc85cb4d171e564a0c2f6e3567a1aae2cddb7e9b25f47dc20a51050542969ca SIG = 01d7c9b5701af71e2f4877ffc9b7b5305f52816d4458e37e41c7719fac1d76a01fff3f50fe1a5875ccc3fb70001c947a33fc8b207de13572ccdb8ba98933ab01 SEED = 1acb4a256c2f8993ca24de1e0014606d668b5e756032d269f1d24d351c8eea4a PUB = cbbdcd8cbc885ab43a057e5f9579f1161954159e7b562ea26cd9a43c88d3f96d MESSAGE = c46a6d61aa0aed1c1d8547a70b89b7196475d5a4870881b1ecd0f0cb9c745f8a2adc8024e2dc55b53aa5d383a81aabc1a47e8d07d00b7f0b56ceddbfb1f424bb5c02184678a666 SIG = 05aa76f7fe51892303d78914715995e7d768ff7714ce270f175e56af17ae018d3fa939f5f620de82bcd1549687b205c7871203e624238c4e309fab7f92fbaa05 SEED = ace3c46424823622979fc3a84a7da69c1d527d8312e8fb018375bd3a96c29c18 PUB = 937cf34136d9e1cce0de11b12c70cbfb7455448421e92c82e7c40934bff8c676 MESSAGE = a9f137bc9021bf105aee25be21cd9ee5b3547cf10cc5f98476fb588bd70e2d6d6b0834e842e4ee94303cf96b09c1715381b36e14a491b80f895ea421b8ec2b1d3c187e02935c5526 SIG = feb8896dd3fe6001ffea171b37b788a69f7f850193a63406f56376dd263d099aef80ece67e2c43f40eca462c6b71e79406b18db74ae5d49844e3b132bc2a1307 SEED = 88f681934e33c35c07dc6e5a832942ae3d59903ccde2f76ccb7587cea7ec41b6 PUB = 6a4e8aa5adb63d22fd7b14a26fdb03b7c8aa6ccd5a196f2c54b0465adb5092e1 MESSAGE = 6e8bac1f853b81fef94707e18cc61c6f0a9cbc2a41d078dcc83fc0229c7f8dbe6dbdd90854b1f1ae2b9f2b120b86a8786b4e78ce23ab86baaf88754af0f3d88881dae0bc5261bfd038 SIG = 45b27bf1b9eac06b62b686f6d546563b2dfe5b175dbef32bf78c35a16c958a9d4f26d291de9bb2066c0a286113cc09172d40a36d4cbd951708860226eb30cd05 SEED = 48050a6e0158f6ad253412e4497cff62d5ee555edffe59e4dc401522813295ce PUB = 975e010abb9a3e56659137b0506057f283982f886ca172c7bc2c500ed9bd26c1 MESSAGE = ed6eec29fb7049dff707f0a4426ebc8f5b350e95870b9d6198c8139e9c3e1e409937d1a858a0dea482a5cb1a854ed3b5a9397acb63bff6b64039ef2eb1159e99858310bbbd86125c3e0e SIG = 7216ab60c35168187d0fce4753c86e80058d540b76bf95843a5898841060a99a44de6f439625a3f6365f59c377bf45909bbfef5c50b25f3194e5fbd34ea5e706 SEED = 18d13d0c00e8e3386a5cfb30a9e79fe88b1861ed2d1201eb170038e194770403 PUB = a4afc833401876090d9b880c41267d68cbbeeaa38afb20884e27328f3b7f535e MESSAGE = 910f6c272dd97931ac47310d244cadb43251365e02ba9f6a5b3c3226be9d7d3a74a2ba4906e8e71a4bf3d3556ebdfc666cd6b12f20c4a00834b88fbb244575199286b0b9344cf334aff007 SIG = 033988154c5d79d2510be83e778015dfe2fb85b8111f7ec139918b5400e3d656ee80a9f5c9072b5b467a5cc5a57cc8ad1062b5bff10862d9d369dde2cc966701 SEED = 4adc8c28646a93a817293a14d29b48e2c6d712a68993547a5c5e4d1452acbc3a PUB = 7f40473628f23fc0dff0021afd487740d4916a9122e6c97d36433e5ebf04f88c MESSAGE = 09fb5501f1688f80a0ab9e22d778ae130acaf74d7f5185b4da198c6b9edac4302e2b753e578766e17d4056dc40d95cf4ca8bcc6565795e97d68bcda79fa77c493397716356164caab5d19cfd SIG = 6d3b4e90ec408311f9b15b9253d3d95c5d152620c260d56302555a8804a5104ba5e8d29ee108e764a64219297298ab7674bbca784dee28773b34e185a386c208 SEED = f26e1c84697a4908151b447dcf6c7c7a38b04081db9e7c7738e6fec900bed0c1 PUB = a86e1422c1235ff8e1aa083470d5e42288cb007ab50e795dd0b4ff87394966c4 MESSAGE = 54ed47606a1487c2f900cefb6e899dbaf6c31cc88ebe3558b83b93f6d422c31e888e48e520eeaedd7e554a9cd40c2c519d533b6144cee484c389e976b1e4022b50e7dbb87ead7e541a2004daf7 SIG = 44f3344b9566c9dfd22d6198e1cbf95d9e28f2982fc7f166ab25dda30c46f768c558e0394fb9ab3e1d4db4cf487c17641a13f3f48939e0c64827a75103c57406 SEED = cc0c33f3a86f5a17d30c186ce0f3b740bafa5fe3c7090f143541e2b2c1e534bc PUB = 967a71c7cf9b82cc78cbe109104d8b438a8d1fd71d260d029046a9a4526866ff MESSAGE = 1944e5e155d75e0d0be92e1be14cec370ad13791f2bfd40f271214e94fcf213c71bc20d7ce0c7584421ac4efc451883cc3f4956f21f73a4216720438bc38ff2cfdf3709905a50a9d94b1d9e7932b SIG = e277b3dd655c33ff75fa920af1fcc859401e6c7a6ef4c6bfbfac5069638f19ca115baf13c09c82af793facb6abd0cd58e8481b08c1b68ad7a2665c4a614a2806 SEED = f0bc979375a7073068dba7f6c094db6598b4e45df7d549583c22fded8048fa2e PUB = b42b6c57a78f1d90090a7181ab2ae09f426cbc2be96eb2cf27abc70d7d32a4b3 MESSAGE = 27ab3049b5c6351f6cfe38b13a059f5037257ee3d65d6079656856edc876ea081fd8a9480466f8839478088466f51ecbfaf2d65def25f0c4dd8d08588202812232f57945df8a6fa161ed8c0343b583 SIG = 19dbc3027f9fae707deb76f588f9fd07aa8eae29bd4e1d04c2c984388286b3b122248a6c03ed67eca35df4db3dc1e4237f267892518497d9552a21de19b5140f SEED = 3022975f298c0ad5ddbe90954f20e63ae0c0d2704cf13c221f5b3720af4dba32 PUB = b845bce38e26ab027b8247463d437a71bbddca2a2381d81fad4c297df9140bd5 MESSAGE = 9aa19a595d989378cdc06891887ef5f9c246e5f83c0b658710673e4e7db760c76354c4f5d1e90db04a23b4fb434c69384593d010e312b11d299c9f97482de887cecfe82ea723bca79a1bd64d03ef19ee SIG = ae14a860fad0051b3eb72b3721a82f7b9546b2867261e2b7b638979e2561bdeb89b600768f82450a66c8b0481283fa21cb6c53bde350effb68a7d1114bfdb203 SEED = 0f710b6c481f71449589753312ef64932b4652ebe0e07597f7da1c4f3dcffb80 PUB = 6973ff2932ccddfc1d16c4c0da50c8b29fe6452d1ee84d52064ebf3d628d403e MESSAGE = 85d85744ad55e9ef9a65ca91e85c8a4f80e4c58f8e4e9354e833986098b7d9fe9fdc0dedb0d75d2539fba00034fc0c2e84344d1edaa09d4f63d5546d67803dd6b54ddcc0b1d3f2582dd75289e31de42e69 SIG = 02a8d26aee11420fb4f09d1163e14b867df7c6f6c8f8dc7a78034659f0401cad0aa90397efdd0704b798db1936503026e2a1adc297e27974d4be312a3753f804 SEED = 7a05f121f60112dd16fee8c91bc2a11479f4b67ee33456042c8de167fc588017 PUB = b3b05be989cea7197505d4b54335e5e1d77a4b52ba7282604bbc1cf6c4e87a6c MESSAGE = d9c59e8cc4ede537be2122ab492a5b915a9b0a114b2ade356fc0457ef98722d5f567b86211e28369d14168ec4a3c804076e154adc70a668cf64a20d13cf190d115cd688d036e46938251df4964dc3517b10c SIG = d30ce8a322b450a2fb1afd329cec8559ccf112bd83965f9ec4736270a0914e061196bf5209778c9f8ccf39c4668bbf0e1363f81afe45dd74e80d5875ddbf6f01 SEED = bf381f8dfb5d0c6d64e416ac23e0d0fcb86ebb899b1d146abd911b92a7808eb6 PUB = 863fad8d1f1bc630a15f6fe8ecefe6b4497b60b21ae8830da46742045fef156f MESSAGE = 8654f2f5c6dcd2cfcbb6ed8d2bc5fb5fec53e3effb0de65aac507fa56c897732395aa09946d3b6586a92edd6dc99315e1ba74c6a0247c4ba7760b948eb3c0932d9fe1f0e9fea6eb61a548a9ab48ffdf1547329 SIG = 99b75378738fcac8067669e8509b5d2607e1ef76af9004e13fe5d3932df60b168216f58565340fa4d638055a89044ee7d45e2bd082a53382289a34700648980e SEED = 36983241a0a8e60ce02a61b3fafab15a7313a5a270d015b9c9ec070dc42deeda PUB = 6647984d42b9a5b3b1afa3b7f8f49d4c2b05e38984e99cea8fd68235d2ae4627 MESSAGE = cebb9e404451818253c0392a4554ee7323c5d5b8b226775700b806ed5b91337916ea7ecbc3d4103fc65e5372ae7e5f9ba2d8f5aee24ccf6e631ae20c4af9b5f728cdf89e8189def1a5b3d35347aa203525ea1d2e SIG = ee37df8af422f91f85dfe43efe79f62378068ccdbaf3916eecbc3adfed0508bdebaf5ce06b3bc279f78087f0db8db3c6823edfb32c12217830be723d8872b30c SEED = d06899f93a408dacb41c969718346f1e289bb5ea65e283ff79c705a074517c35 PUB = 46bf2a08a076c47d7f11b733f8141c355363ed85d7def26ba6a0ce15ac5f2be8 MESSAGE = 0864c39ac4fda8eb9048597bd40be0401021fd2dd3a3390a8facce984b260a13fa2c7cfc00d192fadf134a0ad5a181ee89eff0c795eaa0fbfe2f3b26115d07168db42ed21a51303b1958e4a42dc065b22ce48f17a6 SIG = 6f89de92a66bc5f4144339124950bdf588144cb372f6736245351c9476becc59a258f9a933ffff2bef4b46cd1057395225799fd09dede6823db0e325dbc8140d SEED = eebca7966970ee9f2cc4d74c6f1d8e0ebff7c45aebad349fb9f86df628dfff0e PUB = 89101e0309f767e64ae9c98c4a5d8d2328fb3ef262d082f49b64ca209e1990f6 MESSAGE = 0fac790adb9f59e5cb0ddcb2b667172f2a21034d93bcaddf188606fa9e776db33a8fcc6bd7f5567883fc0de351aa9afaa36d2075b1ba853bada849b8661d5c8154e7b0afea656dd15e01a9c5ba21589b02f8fc5481c2 SIG = 7d447ee5328c9fe7f11936cc42998754a56cd1d2a6951af4fee7c4a8eb319d4923707c793c55d79067f822d5b16bb5776e38dffabc67237a916a81a63339b003 SEED = 3820b6b15939d0afe18c9cb3d9a2a08f167dd458eb6c7e3f1558b0c6db4c6890 PUB = 80b85c6559fea8b400e1999cc5bfed507ad7fc294cd9ba0ce2dd2584a91089b0 MESSAGE = 3e5ad92d44b40e8614d8087c9c743de0c0861a07f1f5146d71cac2f3740024e841cc2d46027cf5d261d3ee7c1875b39551017b5fb1468114fc3e098a899cdbd558b39f098e156b6e9801ebcdd65fed56dbfcaf2c8c787b SIG = 823ee2c0c8d87faa0ec0141e9ce08b51e57c839792d1fbd97a967207fd415849ebfb5dadb5a1dc2c0a8b7fc63fc354857b8c90c44720e13f45cd01e7aa23140c SEED = 0d20fa4a37ff30c4dcc3e44ea7ac501137e5807e9781330ac310982cc3d39dbd PUB = 67bb0a01bc8617b491eff1a326c1c70f7d0c5b95a5ad48241aedce1c6f0883cf MESSAGE = 35e0f4b4a517f9c7aa4514f03e6d65f19b27c62cc069f6bf07dd6378bd6afe2b766560006cbd5730a00919ed11191fb0c8dac56e153fc1cea4bdce5046cccb717759a4083e1c16f740763264cc804de0d0e1a4b5a23067af SIG = deab12ed82ba94b469ca98b66fa20444b4b7881c4f0f853409c9a1504a5b2b6d7860f26ada6bf73459b9cdb573c8017121338efa60f4148086d7a3a8ed59bb07 SEED = bee161881d819b370d240d509ba46b06fb828e20310d9f6b309780703e98927b PUB = 10854380de89162bfb9f7835a2716a3a6e0265671b250b389d01c3bcc03736b8 MESSAGE = 5a6fe599b6b09b05c0ba6a622df3a92b3d376d24d04ea85ebe767bc2ec4d14e83e6937dc0b914b4809fdb607906841a6fd1dcdf61aaea8f9bb81b2ccaa32df412989ae53646680a71a211c8440eab0f1aec5e4fc00e6a2c96d SIG = b07d072eb3831fae8a06effa9201797496dce126b8e11fef2fa07f664dc5cf3d4bf9c38a8b3c09fb5f14fa2deb219e7d852fdd27c7ba32d309942f2746dfe404 SEED = 70150e9516164a3d7b7e8b6f255b65cac9f07459b32d11bb94b3d277208abc99 PUB = 2328bec8e40351047882e8b43bc1ab085386fa47987e46ea87608814c5da713c MESSAGE = 77be8eceaab431a13c2a28d0d1556489d8c392fd7ae41157f7caf082cb54e45f08626be0076be844d38fde901a5eab0e8832d69dac22fb8507fb8ec4faf7c88fd26da308461afe385987972b5e760a34a5e18b9a82b4aaa529b7 SIG = eda3f5033ea7953a0d583c6457522e84ad78445304d48e577d4d69e8641febe15248d8d90ce0944a8f801d39099bc77494bac4ce2a20b38369c6adfb71e03d0f SEED = 3f87fcfdb421422a9c5fb98268313c15128c78844ef9eb3b3713fa77b6718903 PUB = 533ec59228374bd03a4699e3a8896b86182fcf8fc3085fdb8f5c4671524d6fe0 MESSAGE = c00fed2d689468bcbacccd446e8d8f299e2a86925e62e59709afaf4857469ff1e006d00fa3e18a3615f8f06b6ebdff785dde58851d2c239038a0c344dce985bd1fc8deb4779ae5f8932e2f9ed5990b6472dbe4e6fef6917657e0b5 SIG = f6519d7edb6134111974033f03b8d89e9c76caec8965a8e17cd45fff19de2615d73eccdb4a6664a8f0e23adf98988e96251bf26eb7a4ccaac1079f0a772f9b05 SEED = 44ceef044ff998d4abeaaf374eb41d086718b63097b1e35f89634c14897132ea PUB = e83c86677d03ed3a5e8c95f41f0b325ff4333702f2ff6936f57ff30aa31485c7 MESSAGE = 8d3e2dec4644c7b51633b13e6375ca42ff9138465f43d7800c7313199f67c9cf1b520b1820bd630ecf1c992e2767b38eb5bbc441a4ab8d317db441db35a0fe3abe7a9e4541881c2d7b1a2612306959815d1da41267d9649dd4494ace SIG = 554552d6b790d421d06b0a67f8e002ad7a1ed01c06cf00cbeaec2a268bda29f1183f0ceafc625fa5fdb847dc86fae1a20406e459d4a0177cb515220a568e0800 SEED = 98ef2a44d4c8476dff05aa78dcf9c6dc086cb2f622a06745d60cbf223faaba66 PUB = 42fdb1daa39f0159119beec1bedf6f0394b26a2a29bd1fde081eccdadecc226a MESSAGE = c8b5fcfc3c18c7d95957b668e91c731d50c7fcea4f9575bbf784625870e238df546e2cb1a19d2808dd5b230d3871fdec16100ee1fbf9b722fa3744a750a3b396b05f9c21b8c0f61ead57a78c5ecf72b579cfe88a3f404c8acf524f9ab9 SIG = ab5e8724a3e6ff76058cfb214d574e04d05574ecdd4ffe8c07c7af396e882687c5d79ef1e62fbb4c5f1bd06b9bd897826edde0d111d918e8ef961ff2a00d7700 SEED = 93a8c792a239c931917c114824a0174f8bc4ebbf98af8c7e321e0f5bea4015ec PUB = 9b2eaa8a9c2c25ff4f6e13bb12bae5d06fda0eb1105fafae5880ff168740bb74 MESSAGE = 901bf4e041caf16e04f2ffde8d6fe97e93d0900f6bc0fc09a9a0179d137b4b7788e57eb92766a9c634f35adb5c2988af1e86208f461998f59cfec99204b484fbcad3951e7ee4405523705d9739b44307db03f713fda78db421ef3121b3ba SIG = cfe32c4435d911d772dc0727e78d689d0164c5069597cb441b22c1d26236479f1afd7089121b9ab4f61bbb1fae1ab42f7635a92a53784d7170916b703aa5cc09 SEED = 7001fa0c4404c28aa5b5fcff30a961f21a22f5b85a9e382e07aea8a8924d0ec1 PUB = daebb63c4d8f40ceba8ec35e3dd946a6b75bc74fcb29ade7b55eee3cc3aea5ca MESSAGE = 44f48cfb02f08777a57873855f96be4c0291323f2739b275d90757a15472e5750436e0107408fe3026c00625689983f990eba9becbfce403ccd56356ad2741fd21445dfb23d76112e578b3395cf9d960955f1da8f399ca286f21390e25a59a SIG = 64eac9ce87460618636b41fd2decc1673bfc48c5f479dfacb51e86686407374b1d10bf65d6d7474214d7770c9e5c7f806c80d53d48b720870e5e78f32e3a7e05 SEED = 3adce3a3d3fbc977dd4b300a74749f13a3b04a5d73a2cd75a994e3195efebdac PUB = 6ff19b1f18d64851d5c74845c6407f0bf596a52e385e020127e83e54cff5ac19 MESSAGE = fe6c1a31068e332d12aab37d99406568deaa36bdb277cee55304633bd0a267a850e203bb3fabe5110bcc1ca4316698ab1cf00f0b0f1d97ef2180887f0ec0991e8c1111f0c0e1d2b712433ad2b3071bd66e1d81f7fa47bb4bb31ac0f059bb3cb8 SIG = 7dda89f85b40539f5ad8c6de4953f7094a715b63dda30ec7cf65a785ceae5fc688707ee00be682cecbe7ee37d8fc39ee6d83c64409681708a0898a183b288a06 SEED = 14803c1f23a47fcdd35e5d146e20ca630cd712c047d5330b652e31857acbc9e8 PUB = 36f2d5bd6d8324fa6e9db7f7d854ebe48c0e6299998122e9d44b8adbef54f093 MESSAGE = 555983679d026e5354b4cc055ae1bc14653c7281ec722372f3feb778e841da821b3d0b8ee7a9a9129ea06824be8379fbbdcb0748f423721ccb172a1bafa1d5ae9fc1c51e93d41dd551c3086079b620286c1c40c1223bbcbb76722e92ca21d8410a SIG = 07a7de6ce97664b3ea0928e1385c3309be08a47cbf4daa9186a1b948c86fbba39c4efcfcb7a0a3866bc94c6788ffe6be0d4972e56d0c3292d1cc6e25447b9904 SEED = 1a61154d3472cd96b328ee674beb4fc86763a969fb410494e0678414e31a46a6 PUB = 7576d93ac85d0fc61f258c55cf90bd87a635099c0e810ed0b937258d13b42559 MESSAGE = 64c565efbcb8b9528ed47253f3c6a4035db781d6f0976b5e5ba8447d4ed54b04105293ef4c000d8b2e1b5b75e727e5d2a077743b50d183b491764801a2504d16ee6d7d8ac4fe40e6bfc2a8129c7285a5ac691c35e642ed162cf7fbc64516733a23b3 SIG = ada1666c9c3b8284b8a21c4f2618ef0808a646f3f10941e470f738e1785e2de9fdd9c8cb526f945c7a8c6994f151b7d066581b1d755307947c62befc8ab7070f SEED = f215d34fe2d757cff9cf5c05430994de587987ce45cb0459f61ec6c825c62259 PUB = 1ed506485b09a6450be7c9337d9fe87ef99c96f8bd11cd631ca160d0fd73067e MESSAGE = fbed2a7df418ec0e8036312ec239fcee6ef97dc8c2df1f2e14adee287808b788a6072143b851d975c8e8a0299df846b19113e38cee83da71ea8e9bd6f57bdcd3557523f4feb616caa595aea01eb0b3d490b99b525ea4fbb9258bc7fbb0deea8f568cb2 SIG = cbef65b6f3fd580969fc3340cfae4f7c99df1340cce54626183144ef468871634b0a5c0033534108e1c67c0dc99d3014f01084e98c95e1014b309b1dbb2e6704 SEED = 8c9f95083075a43fe426d19f1e87719b40043de88eb0ee971f70e10c7694ce4e PUB = e91d167aa3ebc23e70aab45dabe905e416262f910e2a955dd8619efc74c24e85 MESSAGE = b69d70e860f55c427ef2a71df36e05bbc43bb2e06463aa5de34419c6a614eea6695335a87526c1226488d842891d0574df343c9c1e17aed6958ecee87474221eb77a599ecb059344c0d052c0002a66e5a6013185af69a01ba5dbc660d36cae235f67fe0e SIG = cac555222dafec76a0b47b9d2c586b3b3b9b3b9c8364beb3cae1e8dd7f1ae9dd74f22b8dd4ad2b290f81351a415a99f030f10778be4cda85d1d353331e70f109 SEED = d7eb1fba424feed100777eedb4874bf20810ad686b67e31d27ecf610609a33f5 PUB = a25acb11a6c825713a085fa754692886a87d07fb9be1a53eb961728bb66c9060 MESSAGE = a1d0f81e3d59089cc2b19e07d2fce43db4cf171faa642f3b0bbde77ae3d53af5c02bf8fc12ffb4e57f7c8a015d6c2d178944fae9f7c8fc969d4b77bea51876ae99d59e94ad2456e0ed72c52cf4e5340da17c44dbff86457a519b6fffe269066290d629fe69 SIG = 2bf719682b07cc5ecc0480f37e9d123ff6f44c26e6958e59f080466f9cd373a16500daf123dc3f1334774bfc9fa84503b16dbf21a815c1ada6ebef4920461702 SEED = 4f6aeb35fce14fbcbb9aa8a4f6451bf95b98df047fa8c43f1ead3b404d3f928f PUB = bf66a9edd09481db8444a176c8ce0578d2934f0cdc9734e86fcaac05bf3330f1 MESSAGE = 2dfbb3f59e19ea17d44a5bde4ad227a1a351dda17af840ee0a75da21a5cca89b6d1c567c333e9cc910e2157e05e86ad5d931145064594c47baeea8663a34649c43e90eb95ca10f7d51597b378a722f1f704adf9f22e9f885b89d1f938006a2efcdb42aaff5e3 SIG = 6adb07e364f2a455cb05867abc511acd9d658977f0cacafc92828e7b724f6bbf98bf0bfb29f4e5e6c74738d4fdd816d9252407ae4f3afc574c4f00614824e203 SEED = ef4a6762b400975204ccc13abb47344015454906850ff14940cbb83aa22414ae PUB = eaca450996f50cfaf2bd7f9d7fa7087f09ad49664206a80bc2e5bbbb85bb668e MESSAGE = a4b63eaed5a64a94f2cad212ce2ae71092fd3ea744f5bd89562b2fc2a6c9e4d7aa27add56264a5a55016610be6c19ff7d4989e9504740853012715a79ece9e12c301b3317c7d9b6730db862a4a1d28058e0f8b5ddd9738c7c62ea572cfe59eae08e2b8b6593b58 SIG = 02697d44cad862f1daf5708205f450d408525b10c01ffd06cfee80374f3db16fa9a49c19a9844b345f2f9559ea74aab173baa078c54370a5166700c6dafb780a SEED = 55017e5f61f0c5bafbcde6f849f42a31e5e7a878c1d3f9126fc569fd417ea9f2 PUB = 66914f74ed932fc881ff0166683f675a7c28a926fddd6469cdb3f28e6dec42cc MESSAGE = 2fc84a0998fa6e168a866410bb68105df249a28cfc76604be94fd7dffff2fc1dedd220199465575e8df860190f16aca4084169be16c6ba32eb67042ffd4f230316a26b2624a42f8f90ad57f6916486fa91fd94ed68aded4e632430ef719446979bfaf345409c387f SIG = b1a5e7c49b8fc6b4331e0416ce7e4ed59edd56300b802e0d72abca4a6fcb876c03bf331579124ae0d3fe43f7898bc87e93fc2da3970fc8638957d18c6613c808 SEED = 0553fba866942341217cf278ac57cb21acd09d9916cc6af0ac46941ea139d545 PUB = 840c66e57c2d4f52a4a2796d2a53c5709b96a628c2e063fe6efd47f283ef5e82 MESSAGE = c1fae6262a0e98a6b1235fcb62283b7f0a097f9d002416d318fefc60c5a1584f900ad0ab26ccfae0d6d84aa9aa2df16d4c117ea2724676cb866d4870a872fc829a7c2a5d21ba83340adb339a34c5184c7f5ead0f077289b33677ed6a1ba34be1994e25763bd1d9faec SIG = bc3364c152ee5c808ac340f49ea2cc404e93517121220cce6f7c30a22500e41bcdb6e820480f8fccdd22ff9ad96da532802f431e94240fb83d4bceaa09b92b0d SEED = 7a5ac602de19f3c21040bcddbff42f6aee6f95c1b093868f48e50482dbf4f9c7 PUB = fbb6c7531cda21e7d17ea903c4d14be6c68b4ca803a16bd87120f5aaf7dce1d4 MESSAGE = bd1685419279eb81e4cf3c909031f0f09c5ffae7e2ce6ba9d96c2bce87b8ba0dd763231001e532c7ddd62103abf701288e19dd8f5302e8f5d31b64cc339bd8b7a95550c8a116fd486948772bd5af8dfd46001c59767b0d6bdce383a7078992d1022fbcaf90710687b9aa SIG = 84101dd4b5e8ca3ed98c1e8a06e11d7e424b0d12ca714ee7374b64c29d51a2021cc77ac75389d9b0a646a447623d7d04d1241866b0ca6edd1b7ac015666b700d SEED = 50414cf549bcc55b5b6b75ea3782b2ea7c087b6a0106175e469ca2cc764aeb01 PUB = d0f30c12e997f96e7aeecd1bff6a012ec388ebf8f3f4af664804d1638e4c346a MESSAGE = 75ad77e8c54b0b05fb2d162e7cadb8a7528081b863f76a441b374469413e5714edf54f800496af0157c17e425583414d4361f2134171c0b87c22ce6820a4850ab49d99a9badce9e36110e7f3060118b3590f82b43771e9fbb081afe62227e024d98de6cdec028d7c49490d SIG = b309800160de43a63a89a0acb8a6050059589b3eaecac20b256fece438042f69415d8a56883ee3836d3134a7fc1de64fa8c8cecc3ce27589f606058820857a0c SEED = 93cb00d8fe9c9777a683631f39ba0f48761482cf1c366bd863cf715101532555 PUB = 87e94a1ea5258d61180cb828590ff1418a87d01e702686ba8abc2692c8dc3c91 MESSAGE = 88d8538d31867813d88fef7228d49a7e950d738396f116dda1025f7913547c5d1dc5677a6de4b4a5880507b361780b61b43f7795263db22ff341645f2f5914fd6088c2811211ed4756ac019a6035d66e3170c1d82bfaa30596b396b3260cc1d10d413dd47ebe6daa0c30dc42 SIG = 09824fa2dfbc4d6ef76a9e4145961116769130553b3edffa50d04f39b8b79facbd237acf71354a53a6e5fee754e823b0b290f9619320a13d561269a221639f03 SEED = 2b4cae380e95ce694c26ac7957447347f98e31b4bf02d744e131529071e2301d PUB = e6fc705a79c98e115b4e28d3aa1506b74ee74276c5fc1109a7f4d89c6fafb889 MESSAGE = e0b8250e27b7c0291dbc47a6da6f1268987afdf0a1e90be69bcbc4370865217830d5208693be7b7045099a22ea27f952eb3f79a9a0f1b5a87b19367790788d34c219c2e2a6b834020fb4fd149dc56b544fddbb42071a162fc7cb33c146cac05a31b183e9daadc616f3af449b17 SIG = 555e45656ba9cfbf5155d0e52576e5197abbbc9dd233993eec2a1ee7f6a86409c0b71b0a661978ff5e0acdc9463dc449906f474f8e79bb86168bf70741e34b02 SEED = b56491e54999bb5a1715ebfa2feb14a545a3a43c2fdfd4be0c95fc11819ad695 PUB = cd42bf414f9bfc72ec069882a800557cdf31bc3464fb102c310e6dbd3ae20863 MESSAGE = eb4418ba30683ec7959bdb1ec7b263f83e81f054ddcdbe0a6738ca7763e246935bac419026c22bfbdd1236336cc16107c53513e3ddf34e120846962c3bdd54f5ad5749597208f15a8bb56667baa895f08340db89b85c435e770931928d8abc99262f839aedd9be2aa138c9259adf SIG = e3be3e71a89852df3cffd72d68207869dd3eceb49b1f029493eccbb932444ebe8c8c6db5f0a5a67e2194408df9841913a5ac1a606896419a668f4f47c56c2b08 SEED = 6579c247dd2cd02ba2f7d7a950a330752681e92c0dc62984bbea279ea521c381 PUB = 0b087bea1a1b3d15805cb604f4bb8d68edde274faf521fe6df50c55f8ad4a70d MESSAGE = df7c552ffc89374b9571a6024a8d0471d7eb6be8dfca6f4166b581b65479015a0568129074cc04d6342c758ca18f7987dec536b7033d5f9681504340e20986f027b8cf1f263be76db3525d173422950ea8dceddc585640918aa9d25ca89cba701c2020153873f46108c772cb388d55 SIG = eccaf801ae0a912e21c6b83a5f0e4e88d4b2713459ff93449fc0b21a9f416050113cbae4e814d20c0a798f76d2f9d326ed83959ea02abdc1ab350a467123f709 SEED = 18fba60c5026f3c9dd7aedc04209d5260361de400e190aeb60169e05a3367c9f PUB = dfff347f3dd255530bf7fb34d02ba486d112bb46e950e2ef80e517014cc95734 MESSAGE = 34f08a804d7829cc3914f000ce1a3288acce2149c8a02086b9f67afccd83a178b0bcfd4970c056997da7dc3d47562f16663cedc52f82d710850cf4050379efdac23bee17c330a383ad137f788473b2b0723603b6deb1fdbf6c523fc948a0ccc4ff100fb946d874c1f990436ae8c4f3b2 SIG = 4bc011e40f0f59c618f6bbe230b6f7bc2f50e3617c7faab7f4c21cb84f77eba994cb7c2a1bf10b01bb20084497fdf0a6ab5d9bcd22c4a2c5a78f79926825940f SEED = 073cc15b0536285933b2be39253cf4fd696b81610f5dd3adac2e9cbf338ef2f6 PUB = 00b551d371544375dac5c4e96cd1f0215207e8e166a1fe49d5b0a51ac18443ec MESSAGE = c285362bc8ef628f7aedf654231ee51acdf2cf69a886b942bb9bfed8155105d9209ded2af24f169ad5fcd451370f5827a85111c7a52e032c5038617c0c0170e2a6c231dc401d12062edb186036114e38793b79089077581b9783f40007103ef17472491c00e7138aecc5084d3c85010470 SIG = 3aa52a83062a8f28a5d6b7607f484b66cc374896b766123126333c579581316c742806f627b5bc55cad705cc1d4782b044080c8ac840f38c0c50d35e345c7803 SEED = fd894a1e8232203b289505d5c68c68791ffc0e54f2a87530fbba5b3a3f2caf00 PUB = e95ab565945c7ae5d533df5d0cccc7e9abbc838e20a0b61c930f5d41d81a6fe7 MESSAGE = 2669624a94f2c44a05b7dc3ebf93e58a4bf3a01c273657e7e7878976f6b6ea737fa3f22cc8365b8b220c007d5b642726a408fe2fab69ebb3bd072b349f4dc3377ee7cc752934254215d23989bd3cd02ce999adec9784993f4c19940815f39c9e229247f5205c36cba44e714266369289b4a7 SIG = f51102219e8804be713e556df4e4afa2f8866fe86541a1c2a0934d24c3c9beb280a70dd8d527fe8b7e0b948214d5f2f9638619914b72d55dc198b0229a848708 SEED = 18ef464e28f87ffcfa4d3a9c09a22910951b8c719fdacdb56de62c4b406df00c PUB = c5064c9d43ee2da75b06bb09c77267dbd0d39128f1cdc6bfa451a03e93af4a70 MESSAGE = 9c825707d9358365ab9d38f7e728d628aa722a4f1a20a38e47c999fff8fc32417fbe072f96eb6a0e11e4da9b6de9615445280e93c77a3634d3d2c6879856c248f9800f60a0d38dc1cea8b7f31f286cb0374827b4c6ba144a6694f2b908ead68d18340124cb59cf1701863bd4f3efc709f3627a SIG = d1e7f16e8e597d428adea65591d551b54b667aff2020c464f7f4e53c4773f70433249a3c71b4d11c89c3faa892809227b9f29ef4f7f5d020d4674d4021359405 SEED = c911bdf2f9e7cc5fff35c96e15cc12eafd05ab0db31f649f7408acd0cada76e0 PUB = de44696cd6bd2cbe9b11a0ef18b88164801a969d5e06ed453eb4008cce9a5725 MESSAGE = 76c471241d17192984b00362696e4d9d4d2b7f839c2064117e50a1598f3a1172b16c55e5396866084752024f3a7eb68bb3ffdb80979a0af6d0f6af26b6f0bc0c0384433bcfd44c75eb654a8a8225cb9c4a7fb3c824c3af6125fd46db287e70492d154632cb8f62432659d958d6281d04a54f5f5f SIG = d584b5da371ae4f5c9859b25f70dc56c1b7b4e02d1ae6636283b1b7b11217afdcdf65d1b49ca2c8ef17966e9bc65f10c310b77bb5df7aff5ec1b379a2ce55d0d SEED = d3703299c41db36d77dd3a49541f3fb21d0b2bad1f6e074affd96f1c40d0f927 PUB = 862c5ef616a5f066fd87758a56ab45056fea4bd33f008be24f7b540e095e148e MESSAGE = ac92edbe22257bb06d94aa950e62d18ca2ac0a8fc106000d2231f8a13b8d7a209ccd8cc49a6cd68a7f36c02fb8f728d15595167f0ba8cfe95c8a1e435f327513014ac428b75d4f72e7c834dd70e1a448f1847d3498475f74e3d9334dc7dcc4fed72bf6c7fe3b1d4f53d429616f1df44f19733158b6 SIG = df28277121eac44630084cce75917ae9f6bec65af5572dc30719bde661cf696b85b8672dd4983cab30bd05cc3a119d7db9babd522d7b3a6bcf3886ecd25e080f SEED = d411cd33576d0efe9ec413ccdaabd4fcbafec01a3af4b3cbe34f8b05ef8b59ba PUB = e870344df98dd3a8702c4519bf9e8b35a9d189e746f7203dbbf9bbfab22d6f63 MESSAGE = 11d2c2a7f0190988126696431b4bbcd90ab7b56a32da6404ae446aa762a4ddc66094971538eeb85bde0470a510be0d6d85780ee730a9854138728ae6816162268da852858eaed4ec74c7ac62e6e7096dc002df0bdf5fa40da565b41d181a3f0ad0c5e0b976743e315d9db8ed4160abe69c13a2b3f09a SIG = 83460d15461d6717710bafd6a47a1eaa900a80f2bf8b8aae2468773614ee84bd628c9717476368ef3640cf760acac83ad60232a76963b7d52588b11dc004d70d SEED = e10a2f1380c3e4720e8a8707a9bcb25a0f58270d7059cd7626c7153447edfb87 PUB = a3c717acab366a40b51187bbf35b2d15e97cfeacd7349c06ef1c91ac93e90656 MESSAGE = 135212a9cf00d0a05220be7323bfa4a5ba7fc5465514007702121a9c92e46bd473062f00841af83cb7bc4b2cd58dc4d5b151244cc8293e795796835ed36822c6e09893ec991b38ada4b21a06e691afa887db4e9d7b1d2afc65ba8d2f5e6926ff53d2d44d55fa095f3fad62545c714f0f3f59e4bfe91af8 SIG = 094bf6f953ca0eb77df45129b7bf10d192cf6ddeae94ad6202b8eacfbec119e5291578fe64a084ae600fe07efdb8a782610dbdb0b49eb5f2a46c432355552f01 SEED = b2e697b3d3efec976ef3369530c792717bdbb428d9ed0c11ec0ea9b2e5f39f82 PUB = c4d2e4b3c236d6c9b8c74fa384612c4710d83aa16ad7ef01fbb7421d4fb3f0f6 MESSAGE = 7b436232ac2111a84059510c48362588fcb7383426be5e6f62f372e4f7cca83c81c2357f9b54f4a15291065b6d41aad1ea93cffa776b9acaa58afe2b51644b97af9a3e53f84e40aa6d86051e6914cd039d4170a9a526dd69955ff507c33f74e2176591fb0b3cd7f00ee418f2c258a9981cccee72f01c8430 SIG = 5047fa38197b8328e78dd8a10e966afb7bd3d43608280f1c257d25ca43bc1c06e94a5747ab6215ece54cdeff8c56567d70d2f91f9ec8c260aa1080a6ab5a7a02 SEED = 19a679a7a905a1e2b3038e6e418b3da97c3089c7cd351ea07bc8d1af64eacc46 PUB = 19f08361f469b4ae1e0ceb94f47a7de7317410a92dd013b16ae0d0532fa4b3ef MESSAGE = 980c7b4d2939061ac7b9ba441117a19485661781a4083067c55acf93026c082a93cc124f095e1b4f2c3f6c135412a5096228e8a071e8b4b668ba9d9644ea9f4dabfc54a9856c3e965e6363395ab709037dda229baf927cd01f9af5e039afc42f3cec634f5d832d2ab7c7cad3ad7b8cf27ebdac698431ad8236 SIG = 4347b7b4f7c3c4dd315b8384a0b0caeed84bdabe24b2915f12512dfd04770fc996a1bfb729afef9edd611447081a5330617eaea1c1dab1bf13cea8997204910c SEED = f03b8363ee5b0eef7018a49bc02adf731da54ee50a7f03b88a29a2082b189c43 PUB = 31287ef5a2e64104ab7790b312f35c7ad4af6beb0d7ceb8a58f36a54ce272c3e MESSAGE = 24191b5464b35ac7bcf4a375f033efba8943b09b9ff0fc403ca7aae702a3cbf396c5131bc008132cf5f12910d586dc1db9c084574a96babee95642f922371c0382ec0402a26feb142e4146bbd3360c2b36834fe45af5e2868d4d56fdd504cebf0c2d7f5791b4429417c8b65a98e0b15c466c137f410524fce737 SIG = e8fa967e6afadf6a877d87e5f5c52bb634b75a7804199a2bc9d027b63a35654d9ddd06830455641dbfb49edce42e20e7d4104a071c2cbbec23018c297ced9908 SEED = 11086b0d11e415ab1ce02aaf8f0621b54430f6fb135c74f40d38e8c64737064b PUB = 7166dfbc691eb8c201114ba0d1a2c7b87f7a1fd8d0b36058b0d7dcabe1ae30da MESSAGE = 4b5b2936c5e360a38455503721078f8adb404a7ee7ecc14801dc87a67a152b769569fbeac0afa25a2070a1686b900ac1633d499808cdb2e81ce3916d5a3c04d19c5bb2699a662b8aba4af94d390bac7ccc8ec910ed2acdf86ebb71adb601877885eef3c91662fc30738e352cc74353ccf8d8edeefacc042c10a0e5 SIG = e907459d5adcd0d0c36418581f19d0eebda7138ebd9faa0b262201f458c856310bb77f4c7de922495dcfe8b248eda2ad0df6a73f47bbfb894baa7d8869875802 SEED = efce7667a8ef91228caed14eb477a345e5e8239234080848760ed0970713fa86 PUB = 9193055a84df1eacca28ce2a08c2a07a50f04c024ecf1fe4a47d2efbaf63ed58 MESSAGE = aa1bc80d7bcc1d94a23a57cedf5027482477dc46b86890bc0e5ac29ae6c91bbc43130348797305f75543580a8a069b348a7bd8fc3e015230b7c1940c7f80a82b12900910dbcf0630da03f081d44c7f955d4a1172f56ecc7c5ac646696bffdf4eb6d88bdd9cc3843528b72583abb3bad02e56ef7646eed5139551cdeb SIG = e5a63124db1696b64140b6e9612fa9587b3eef710109398d44ba0ca63c0ebad06f0a6c8994ea34b3a2af91a89bf41ae614d7727d716fd42f8b92e1ac64fdbf03 SEED = 88fccaa96ad884d1165be71dd0c4f5f8f4421c60fbfa498bfee9b967462443bd PUB = c75cb0e0237b45b8656eea9f3d1a9d4acd01a103aa269bb24fd54122fd81f2ac MESSAGE = 9d0eac98556bfa8672c35705d1d61ac4d0fca19dc0d993015877857d27fd80f74acace666c563485d81e53603a6aef40875fa551cc105f2cc10b39694679cdf4a6b073bc88645fc51a36da179d3d1e3c7722454c5e73577c61aa7d148c4ba50ea46c56a1c3b3b3c470f93100494e08bc5514ac763a85483c42c7cdc27c SIG = 27d3a197cc9994212063bce8d799e77b6853b7355ebe369bcf1889a418a82caa3a7987a663f621defe86b3ac4ad44faeed16c9116ace28fccf915557fa779903 SEED = 670b30626fe367d8b45f43733d6f25b37eccbcb551963f0ac8b666b48041c72d PUB = 65aa4c6d4ba0ab34bc75b39f09527ca6f2425f52415cdffdf2dff273f8ea612c MESSAGE = d00bcca7e184d10e1f1fe420b50639e1d5deba52a751236e68c59bb4bff9802f5fc165ed42fd6d534670a7c6fb60e4307d947915a248bf2f93465c2cb44d8f453d2c015afbc8ed58818ea51726a25177930e9ea192ef4514f4bb0eb4e0f5d4ae3c46e357c81187f7ed174733fff959c3f9fae6486cfa1356a95699211de5 SIG = 1b6b4377d2b98e0f9d24ae8dfe30e2396e2004380d3431488e5843cf8d2d7a0070ab21f8a3b51ce84d2f4ba209f739f922bebf798096693f5622873d79ae6f04 SEED = 813c4daed67a190d68bb635d73af6da74f32fdf7c48cca6e59262946b8e8c71f PUB = a2095457d7697020e2b884d95a96578c2a900a7666ac0dc7bd38f1931d7945d8 MESSAGE = ce54cb0450e689a0dbef785308b3177472fcd6d38203e58a0590b31fa253f9ea590be5368a922de88b63450102684443fb8189e601282003323b89c81e92eaef2b5ddc4a55c53fa3cfad4160248b3c286ff80d31d161b7b8dee713552b56f1507fb72eadfa89054e9d1600ac874c4b0a961004eb6d0d4bfd2ecb9c734f00ba SIG = b446574ff6a4bd2b572e487c4ab443ca641075168aa4e1092f71f30bdb068ce46a395efee1ee660b9fac26d54109722c15cdb791bfb87fff63c6596ad4f2270c SEED = 8400962bb769f63868cae5a3fec8db6a9c8d3f1c846c8dceeb642b6946efa8e3 PUB = 98be21001993a7eb1a1277ff74c15504183d25fdfcc05f0d4dea892f6e301890 MESSAGE = f7e67d982a2ff93ecda4087152b4864c943b1ba7021f5407043ccb4253d348c27b9283acb26c194fd1cbb79e6afc32ff686b55b0b3617218dcf39316b4b66b3c8c0d67267a86db8adf3750801bcf9327d4c25441b96197832b4cde0eac3ff22892a2f0bc17c2c213c02377a333e308ed271658049383b7e2e57b6b8b125512e0 SIG = 0ad71b0025f3d9a50db338414d6d670e7799b7270a8444f6ae7f12ae7eb71bd03ffd3c4f36631f69fdcc4061468ff582ede495243ef1361a3b3295fa813ba205 SEED = 6288722035d1ea699bc7cfdf18d89625423180b683fa74639f4f30f15359cc85 PUB = e17faa019572861a064e1bc571256dea1468f3a48590a89138aaa85925080cd7 MESSAGE = 8b6caacac51d8949fb86acbcb1b99d859ff67c64147bc1216909dcab07ee6ef09f403863327394689dc34abc778fcb5c1f5091acf5a08f9d842211d1ae2eb40be9bb8d6679077471547a6c71ff77b519d4b7108e32bc46251c60dee8e332b6229316e6d57c22ab826ff1bc33f2b0213807c19280af110fd26ee27468201cff49cb SIG = 9dec92b6e89adbe8f4e1b5e93ac4fcf957de7d1970a226770ec4eda647c8e3b3dffb2731a39e16e4a0119d3662a937e560522491ec7a1696be04c076b12e3501 SEED = 13038a3a65ef32759a9cd903acb554b252de00e7cdb77bbed1970b20680ee17b PUB = b6a308e67f9b46c66499456ab5cd135cb2fe84a32eb045358626604da4122c8f MESSAGE = ddf00b4033a2a088022dabe93356432f50ddc6c6e1a659dc1a93124a4c2ffffd182765a2f56c43ea0bfd8de8015060889ae6941c3f3e255d4421a1c36201be846a2738a71f120cad598ca8527d70ff8d5a0993b55cb5153517110a41962daff42250158f2096d1ddaf7186e50298cbe51fcb429cbea411293f8a7bd9cf069fa237e4 SIG = 5261558ecc3c98ff36351f42f504cad4a32ffda5a744560960b4c106e4492f02e20478887afee4f770f05597a7e388caceae805ae351e0e45e8e578e6a6ff20c SEED = b9de5b063d3ca3a773f114941b2e4227c07511c0f5c06017b9c8845018f23432 PUB = 5295243c8646e096674dda15979b322b9dd0faf27d024a0ed5771334e1179ed2 MESSAGE = 9493cc23896b84096046ae1053afe39499e9424254b366fe143f4da321e2dc9e4784208e12a542d899828dde7eff625a7f12416990c2841ffb095bf94c0c610e5a663918b689031ccd6b519349d04de1c212ca2a9d7abf52e1b4fd467bb665b6919ef8f91617e205565bf56647e5f8d508ea200a84467f8fa122e74bc3b9979f1174e5 SIG = 92ba760d14d1415cfaf218ca847014088ae51ad821113a6f8630356f7ba85c005e2330f1066d0df464806052a4174610050462f3e013d702e7c77185a032580b SEED = 8ff0297cc08842b5e67552ec2843e04353a34d74ef89b8565d97205b74ca133a PUB = 0f7ef98c5ba4af984dfb77bc4e537b2b39e6273bb3e7b95fe1b7e6781952bd4a MESSAGE = 2bdc3a486c5e4ea62dcfec8a9d4fcf9ea9490dbcc715615d58490a72ce833fa22387ca50a0052508cf0aff1ca727f0fed46ffa7d3c8e23c5bb01d47e90ff06d3858a557d9926481579daf4384aea50e96ec615d2a3bf3c1122f1f24dd6ed98a5de421883589c213998ca5432373e68bbbe89428ca9885d0593d5e6215116b8266386452b SIG = 0783737f706e6ff36614f850074fca1f485f24fcde2a28af544f37abd69b7a581defd8c771b031e108d19d788c74c5f20bb3f1c21cd92be317bacd8f650b4905 SEED = 050d553d282dca3269c83c181768ec067b81c9fe0c94f2a0ebbb0c942d0fcd7c PUB = 63e230b003c53a5672e832ff7f24430be223e497de840233f595a3e200c7127e MESSAGE = 15e13b8c01004f6aa5b236dbb281677f746d81e548e0aa80f0e414521521d856cd694e7c9152bb5e43776b60f6b560ed1ad3e4b390dbf3e46ef9257443f39c149e0240a02d021e1e3d7d046b26fd004eee7ca16a8059e126c74cb3f2194db47bf60465ecef5c704d2e2c75e2e50060ea2a31cb72b7b3c6b1b5ec72ab38004085281a22fe86 SIG = 3f0e83765b31bbe8e1fb92e9678d6cde571a03ba7f1dcc1128461f708525457f4e0e2353aa2b598c063ff1bffdac916b5a2200655156904b0585577a1628560d SEED = 69497cd7b4e868cfa0328d92bd6052d772b2767395c14595b279851a9cdd31aa PUB = 5d276d626e230d18e7bcd61141cb93c90ef0f79e01321212d838ec71457b1aac MESSAGE = 53cd080a0c61f1a093d3b3a74571c296303f363b4107edbe880b7aa9dfe44ab5d5dc5f74be9c8d876f04d754653491ab51b135fc953f71287b62ff41b67c742bd3445671a9d4f2dc174ca1b0335f78627a0dd4b30650504178039e7393638510ffe84091b57298d3ac9001c367c1452fbcb33dc54a5dc316fb2a5270764a2ac820a0b63fbdc6 SIG = beafa58340960908e8d86e40329e3a4523fc7be770addb86e34c3772f84cd9fb338d1f3b65bfcdb09f35c6da36d1a3adf8f91f1ffd5782cc830206433a08410d SEED = 2165a486b612bbff529cd00346964a3cb8cdcffa51dc3d524dd5adc5ac936d68 PUB = 7ebc839a465e14f5892476e4a13b3988f83b3cd27ef79e193f86fa16f34a1ce1 MESSAGE = b728da7a36167c6085bd2d962cf63959facd95c9ad4542028afba90ec9c6c0760bdae935429c3feb3933e2f00042c672ad2cd7348d92bc33f81751e294ae9171b945b193144ef8acb9a1bd9abf0475ce0d0ac789b200c32e9c9a2736b168369ce5f97b1e8d2e7900e1a759178441f1fc430564ae129bae7857740511a668f32c0a3b077a9d8b19 SIG = 7ec6fba56ba52460a1b4f2738689c1883dda9aaffc8bde17cb6029bdce3a0ebe2fffda55939b70bbd07fdbf6fc5cda87fed8ba58575f894a366e45e5705eea09 SEED = 1c64ad63dd147034598e128f7406ec0530746ea1c5b72ecf79e888065486fa1b PUB = baa6bcc1c3d8d3b11ffc1587adddc58bfd96c2b992b6c6f59fcc50ccbcdd0eb9 MESSAGE = 9ebd8e337893bb053ef2b9e3269df54848494f03cd63576b33e64b1080be4be015264a403fb9602bbf90ca19b241a9b66863909b9008ce1b2ffcf236efa4c2668f0f47db9ff5fa157d9cb605412be7dd8b07ea878cccae6bf50f935b86d19e1b648b69e528553a56d8afb78221ad53307b7a4ec8d2fd4861b55dc5dae8e93ef387fbbe0b4ce7f788 SIG = 7477e54158f13b7128c0a110ca6b65f42514fb70cd5cf28a8b1cc6110ea06fcf94290da13f85a11c2351d3bbccbb4c64e0215d6d0f0099e7f27bc94e949b150b SEED = 55abbc5dac4128134dc8c6018a213ed4b60fcc8e90cbd41db2d21eda5373e936 PUB = 251afaa2646926b2a371f2a09d5865b98c9a5eb6ca047cd0d8ee36e5e0416974 MESSAGE = 47010e1398ad55fabe371dd8648f768d90df4b965a3b396100b303b40a17518bed6d86b09f734ab7c10b5f3a01b53deec5f8534b70c79f3f29b284fdec486f22f44c22ccd5c6463594415267baa611f70b1b316caa1b68b5e0e99b31c5bb0ce13679a23c31a63999698164cbf37d103ba92490188be59937f123043ec786efe3d411f9b0623a6ad972 SIG = f6a61c2e661a9eb7bde182e38ec99af985f61698a5d7fa430d16e3f1a93709b75522320de48afcc595ab209122ae0ce132cdf4b0391746e7ff341177570c8108 SEED = f2dcf4a1a0d46ddb2d72f8fdd80bbec5b7dea5913da4966c2f4d12c261f0bf98 PUB = d39570a25ca59f2257f93f96600df4f63e684bf63ae8dffd914e4629c3d5095f MESSAGE = 3b00e808fca4c11651d853d6b90f952ccf5647e102d4ee0ad7a5d181d5b4258c523cd39e3d9825298d84c8cba09f43dbba119988222c76059caf17b4bf9931c45e617448aeade151181497b24552367e52bc45ac79088806d3368207aafefd3057845dce819d5aaaa77b218e2aed3da76d40c1f07699f8172e4a5c803f7a2aceb9a47a8952e1b2f053f2 SIG = 42882a811dad2d851885e4cbe9044708d91a86f15dfa1d66c3eb304314531f3015208c711b9bdbc5fb233951e569b59d34e415eec4b37ffd374d412c9a360d0c SEED = 2246bfb06155859e10a748ff8f5919ad5d1daab756f01057b790d07474775f4f PUB = fa6349b62dc8c6a2feeef6ffc33ae085c649795c1c9d9898e75c13ae1625db34 MESSAGE = 63ee1c7bbb15cebe1c22532d481682754bdaf58b8bc997ae30a34c9d23c33f1690c346ab0a7365ff62457424b6105f8421eca0ce3c630acfeb9a1cc416390edf4920e22b2367e9fb5d2ab25bee56da03ea55e3f57882d48b89229314d734cb83c79f4e17ee64bae6f7addbe9b525fcd03a91409a2dde907751db8cc97e08d0ea89c4d18718d26d0b897b64 SIG = 2be4915a352f7785483046d8ae9625b8b63257af57c073691256ee076d6e1b972a101f551c705d3f96157c33b56ea049be4af4dc561cbe3c1ec5072d7f134e07 SEED = c088a3dd2cb8bd5d684db8538dc22473b6f014f64fe86af168b4bb01b90a1dd0 PUB = aad615a9c28759f03d373abe666691dead8b84f9b8b50a67f8f0aa4a701580d1 MESSAGE = 74906ae05a5af8e9968b6feb498569d6345a24f9711befb136e6c3b5ed49339e59a7938b4ba1a118f169b9ace0f7842a26a645f14c0ad22ebbcda93e67e4c348efc3d9ecbb1419e6262d0436a58ea82c2202389065ccf67c4f550e45b5f6a12a6c011b2e0a30101d5c62328bbf99c8c95563a6e33bdd9cce72b1f720139c2fd3e04913146ae5bac5288e0e3e SIG = 3bb459d1ac575a180c1728d8b8924970492a0c8d2a378c29d1d41785c8379a58e2ba3606785e1c5da29e5527552bc6dc89a2b69c27fe51ed253a9f3b565b2700 SEED = 45667d1e7b5910979c4a328317968371c864d564a661c5cce557c9ecc61bab9e PUB = edcdf5e1a170e00c8c687e7e9c18f9893b5fe495cd2977ceb7f446c0149aa9d3 MESSAGE = cd66cec476c87c8dbf47ec91dac48fb5b42db1282a573e0a5cf0b91768986608e1d7ebd05f5251bcf8b47a17093229acefbd44beb21c0c0c928dd3cd3f8966ecce6910331c508ea76baf904d8c21f6c17c2c58d00afd3259b8bf794c146b12b995cddd1c4289c5be3168ebd616b384c281ce1b38a10e1807808853c681a640a009b4d2acd7934f8c6d07578161 SIG = 6de668f1ca6f292814625289a0808020c87c89ac94f5b0508e557bdf8000a5ca808f021c9679b50ee2f320064c95a464a8439379828c3b76cfa766455e128c0b SEED = 24897428ae6546d85b3190ebe3f1f7bf7c712528ac851a588b07d5c8f94eecd1 PUB = 5f348fe3ea5b2c023d0af7ede60e55f91aa55199699da15a11c3791d68d710bd MESSAGE = 5201d9725f1dffa1863fa4d84c301861141acdfb64be1fbfdd5b9386db20ef394099eebcfdfecc62c6268607a84d55c55cd0efdc372ecf3067343e7b0731c2685461e24b953f99949e59ba3e67ed0f0848313793962a292c459814c5e28690ec1f45171f1abab86fdd14568b00caf48581115ee5ea83b000282fbbf0c0b2a1116039a35cfa3f201422207a3d4948 SIG = 1b5e75def49f51d6b2de008c71fc1a909bd42ca813298dce4eeef717815d7a6c078c2f3d9a3fce1ab5b3ad8ef8d45cdf2eb4901c32eea2d5e018dcf2833cad0c SEED = 7b04aca7cf926216cb960a3890786339d0a615967680190123fda3b60c6aeb11 PUB = cdbc3e70e4e8fd13d0cce2852a3b9372c3a6160cd6deaba90f9b3022f70c91f9 MESSAGE = 1cb09624b1f14a0260c7f56d8c60b5fe45837114232551ef5966386e0c2b441b75cfdb8df2185785d22cf526fa9df7fd45d9d83881b66c1feee0913e238121eedbb7ab504da0bee8998016684535031991f11bfcd9b95690aad2d19bd6a9de1844ed1362302df4217230b25c0552ce277534c650cae526577f25d8b1fe9f9febca2c814670d4805b21adef852daf94 SIG = 25d2d361751d52b4fe66ea18e4b9866bde3d121a7312fd9e28a1e295e087e3176c94c874a2e81600f24c4654f43d1b67d47b64822648590ce5ce44f3b5ddc502 SEED = ea73bf64a1a97877c3c3e7ca4644b71aaa66314c8f1b66bafaebd5edfb888bcd PUB = caac93902e5764ade47294edd51faa14620940c668b5c1c392a6928325d4c3fd MESSAGE = 362eec68b912852786bb4f9afff9ecf7cb28c9de6b18422a8ca940b0d7e6dcb83aa44be0afb5f1806d43f0e31d71f922f853615a26e287a27f08a04fbce3d45a0c6c311d4b7cb17e425bbeb0a6b410b5d6dbb7ac11df9850a131a691e3b60b0b214ebe044106e982433287595267b031b5d4a09262ded8934fdfdf964d868ef9a2c842f804eafddefcb71d9f16a59bf8 SIG = bd86cb9c70a055279a86a9e64870988b8a7345c3cd2948a0fabcfb38abce3c420b4d5521618e11d2de827d9de569f6bc3be66aad40636cdaa64760ded3b7c209 SEED = b8123c116b33bad0dcbc2c4dc06a3d66850dab360cdb5a033c14895c4ee31bfb PUB = bdca151ba32c6bb31531b05fdf86c6d78c8cd1935611d5ff111a0f00635b1885 MESSAGE = 7970f6666634548c848bb52338817b26a4d0ca68df3d28afff207c2d028067a18e4c9543025f5b0228aa691e5088513151a94494e15d1f54210328e0df159b352c30aaa7a844f18a9f4c395dcbb3fb9fcfbed1103e0706fbf9c35fe2666848fa35dc2cf5227ebee89e7d3bcfae2721b25fdec3d3174ea7ce267a55dd61d58201e96bda303cf418edf6e32fb92f5dc1a0b1 SIG = 9cf13eba3dcc37b8fc70ccb2327436b9f08855e726aa7ed82bd5cb7df45fdf9ec1f96afad193f47572d770444b65b74a37cc034fc514cb3f91b2d8ada5b02006 SEED = b18e1d0045995ec3d010c387ccfeb984d783af8fbb0f40fa7db126d889f6dadd PUB = 77f48b59caeda77751ed138b0ec667ff50f8768c25d48309a8f386a2bad187fb MESSAGE = 916c7d1d268fc0e77c1bef238432573c39be577bbea0998936add2b50a653171ce18a542b0b7f96c1691a3be6031522894a8634183eda38798a0c5d5d79fbd01dd04a8646d71873b77b221998a81922d8105f892316369d5224c9983372d2313c6b1f4556ea26ba49d46e8b561e0fc76633ac9766e68e21fba7edca93c4c7460376d7f3ac22ff372c18f613f2ae2e856af40 SIG = 6bd710a368c1249923fc7a1610747403040f0cc30815a00f9ff548a896bbda0b4eb2ca19ebcf917f0f34200a9edbad3901b64ab09cc5ef7b9bcc3c40c0ff7509 SEED = 93649c63910b35718e48c590d261c48e4ef8336613f6aa077b462676b3ba8829 PUB = 06a685898b855212ebc289915d105a4320d620d85771b8c6b15bf10a1be6e9b8 MESSAGE = 2cd1a951056c9ebae1399b6bd2d82c0ae277856290d06920ac56cac8fb42435101c72aa9c08dd2d12426325562c2f0a49cd821b11b939aafa593b4095c021bcb4827b107b9664d68282888bc4a44af3e3bdc861be6af309044c3daab57b77023dc902d47ebc326f9bdd02dbc02cd540ff81b2ddf7cf679a41193dfe5f8c8ca1aaefc41ef740280d9823e30a354717c8431f5d8 SIG = 6274f2d4f431d5affefa35e7cf584a599017193da99094ca908b75acb608d1bf981857be93a7dafb0fadb3ff0906f48a5ee950456f782c2d605b14095ba0ff0f SEED = 1c15cbeb89362d69476a2aa4a5f3ef2089cf87286349e0dfe0e72d9e3e5a66c7 PUB = 13a882a1064182582c211847e19b4dac59722c9ffd34826d96f33113400fac7a MESSAGE = 091c9b9b116ae83d23d01a6295211785d446b6228dd687ddf79bd0d5a4daa8c79d2cbfc37365f1f285e361738123e34e2bcbfc664ce1253a11d9e4a7982e58cf9468e1017ea14d2cc6d0865d40fde8cb560241e96ac1617c791f0ca7c6410cadf328611b18aef333d8350ac497f0a4ae2d03fdf0e23e426d34f4514780d1474e113583541f3c043672057172618cb2059eaaed56 SIG = 5998b2808adfdeeaebe2c3eac026d3f825f9c7f2af97ca324fbd57aac1bedff78a8ee621d037ee3ad2a712e9a009c58ea3e6f2a828f74b86da275a44a4b1e50b SEED = 11241ffdf34ae8ab875475e94c6cc3291f0b8820dc85e20f32fc53b24ae68978 PUB = 09c045e4bd5137314c0ec1d031faf914910c45a4676f5a3cd8f581bcccb03c97 MESSAGE = 3b89deccb7023e4b2b7aff2c3951870af413a9b04dd86ac78b7c8fd887492d8dde49d8fda149edd54781ae2b508030d14416a9a38bed2b9aebbbb20250b3c931acd4e32fbeeec5a26501beab7268d144fce8951a101c4b5178166fbb5927b1dfb1e1ce90d1d123068e3f472c888fdb01fdf70e7f8de9b0adb284b7119f55354316f84ed090030f9c2662061ca48447cc0aef964126 SIG = 72ce9f91be2e66cfc90f952595946ffc90bfce53087d49e5dd7c087f3faa8f18f2356de971e4429d985a99194b4f92ced3ef47cd7114379e0b3267a9f8b1e706 SEED = 3bdb162465eaceff98d69c86f70039c517d168aefe6bb101b4f769a86b17c972 PUB = d76cb7be74328289fd1c64be747cca5bb30295dfaccd0f2e43f51703fd5d3683 MESSAGE = fbf368feaeba87918b1b8c7b8a26832be6e7fc1cbdb8902519281a0654ec73de0bb07101a9d603f745d4ec2357aee9870cb19a56cb44fbd9c91fc34752612fbd83d6fc1a16bf8a85a215d0148e4af37d298467e5cc486b131352ce092182ce8284159a3812b30bacbff595863811bf9a30a9da494565c3ac1814430018ea0eeed39cdbca27f93140e46949db570bfa2ed4f4073f8833 SIG = 6f1362a402063791f950984f544928e616a4ef79bbeb6854e9615aab9cdbaec483fb9a04bf22de5d97a15bda2d390483c7f61dbee07bb5141fc173b1aa47650d SEED = d5efe51d5cd8e108bd922fc0ea126190a94628ffa53c433a518022792ddc78ef PUB = 426b01cc61ff5e0e724da1d3b297f5325c18c62f64d5eb48d4a5216a8e9a4073 MESSAGE = 9d17bcfe2dfc742f411cb53a94f359c001abf096c741f34af48679f281e7ce6bbd9e87709fc0728a563db2b9cf8ea4fbdcc344c1848e653ce970c6ce29de2ccd520300649adcddfc753971f846aac1ba42ae4528952d94980aa7c6cfa2142907647f894ae974a74d59035a73ef56a10b6612624809520190ace661c3a47095e0322efd781d50d1163598f2da32f31bc9c4f913d1b14861 SIG = 2306f58fcd4cff2222d81b05a475532b8b19dc67e6d78ddb4205a3b7621cc5aef0b393d5d24dd96c88ccbc53a3208da323be4587d5ec067c820f0723aa44e90e SEED = 18af89025ebfa76bd557cfb2dff148245214641fd5bda159f73da04b08e87c88 PUB = 0c584459b9ebcccad587b272160bc60b27f4f772b4321de7723afef577edc7b4 MESSAGE = e82f46652ab914af535d8fb720b557ac95018d9f2a3fcce85771bb40ab14cb9a986e096f3afe5bee829dfd8b97335c536ac971a21655af16a2f8fdba183a4e18564c21492956537a419abbbbb02a4bbdc01481f5c6e658ecf3c34f011ad846f5edcd4939195df85e41303fb9a88fdfbd704396f7559a327318b952b3e60ce8ddde56378579232faf950c78e7f0b17c3b8dece36b788a8473 SIG = 26bb0882297c2c08a752d3981145dcde55893a11df77f8aa4c19d0b9ed6e5220ed12e9fac3af13d0f0c71568f4a547d30114a6599a236806c4beee6765284408 SEED = 0c93d99815fff8fe22b9e45aa02b3e6445ce1d6bf5a65dce3da107aa1055940e PUB = 4d27a47b0fc80800d84d244eebb1deb4436d97633a83e67125ad52ea01685057 MESSAGE = 11e877de58c134eaf4c9f1b53c3dc451d3c055f16b09622725b279768512fe10a7adb0765b689ec21d5b6efaa19f1b9d36254df0a9367f441b26bdb90b28cbc403e5074082fa1fed58e140dac97aeaf483e2c13f3cc560abffaba05b763feedb51e60698151cf56efdf1d37d6ce0564486210f052e937f2ea26f63efa5d247ff188329bb1aa83ce3f4f35a3d7dec14599e5feb7b6d5fe4296a SIG = 7dc4467abcf6431adb7ccfe868eac8cd8a615a0ff65f6a9e338375b1aae3c49a126c9eba79426d1641c6b97c3e92c194e5ee4431efa2439fd450f2cd018c8700 SEED = 989e99945635192c023cc5186fc25bbaef47240775d15a56195d88cd07c3748e PUB = ca0beafdf731d89301f7723c5bb7e5a1c3ff3eab27c97d711bcd76e42054bee4 MESSAGE = c48414f5c757d03c523ef3f3b8510771b0ff3b4b97de279625d349ec185a29927a66b9593ba19338c2f5e4131f1ac07ea46d2c1b6e4ab5229280b2e2bb9d140d1ef7af7b1692bf2d097b80f811adcfa95d5cbf9eee92a1641c552b4be4a0d734f0afd470b9d7f4e45778951e21fc534f200a128b96adb8373f10cecec2dac2996a062fb3c294315965a9d5d7b077c4b013c64a38429769d23eab SIG = aef756bfb8a7266e17d15f3f11ee50ed25be420e95a0742271ebd12294e2cb96ead083b8ff0b829d2edeb14da86e402ef25e6d4a5a7958c184ed10c176cb570b SEED = 6bdbbe06d9f4219eea6403a357b25e561992fae0f0f614561dd86d23de415a43 PUB = ed52dd1cce32d9b485e0940746421d36b9fde6cdf0211545b634044d4b3cb8f1 MESSAGE = 582ada13d69293e49bbd461032dfea1ca2025b52e013a33a0387fcfc5f7c0b8ec955982607fc901e1b7f636a9d371e1f91fe476bdd44856e275d67efa14238164354c231124c84de8f5b89d5a58ea6744b4d3b3d7906905233cce694a64d696f5a7024fc9033b1ce390899a3b441a48e53c7c9b30ba12e7d61f35f15e658c7cc4407e2f689ea8a55d01bf5dbacb11954754f920f09dbd48409bbb5 SIG = 950206605b0f417c90843e2c8d8e66c828bb10b99b36eeeee8caf2e0e5484d93fe02bf533405f4bb74a50e5585fa0daef4821f0301d01b46321baa31e1f08d03 SEED = d761c8c5a9601b9145b7d051249b004107e452e563100c6c788038c9ee8adad7 PUB = e6488775d6407efc7b2bca890a7fc62266fc54cdac893343b4f59a196d948898 MESSAGE = 84ead5eabd2fd4b7c79a9a928ab8ee0a16a5fd667a057f8a254663d56daae156d1a49affb2996137b9d8b340e635732f9d2b4c60218442541e72d2b00e1ee7a73c3f67caa499fa9d070b57d076dcde96b0764723c3c659c7a00c1b78b15ccc2223890b51067fc81e23e9458ab0683ba626a53d0c3793a58a9857bb44b3bd85bb6ce53a85694e7f53cc1bd46d50eda37d81f5381b513d1f38339d291b SIG = 7ab78b64e6db359a2dc8302e1092ed66fa736b536253a1cd90fdb8c10efd78300225e191963599ba549cc859209df0ff61cd069b03d254e6e7d76c798440f907 SEED = c5e0c7a7bb8b7ca07bf0a05ea67eff6deebfe3714ee3e1a227f4dc8e242a2fa0 PUB = 5135efcd9052bec57a4431caabe82680eec0a33afd59b30203b280ba12be485c MESSAGE = 3770a6786652c4b78a043edce07f3e204d81997c42afc22331f75a5494a826d7cb69ab4314a473721058a1839981d5b7022d0cd8670377daf3320476d25b9f559561d66ee0a709fe17361e2a52898f5753c4fb43bd0c98b368f512adc09cd927c6622676926d8c2d91a14aca32f226f70036c1c858bcffc2b59f54c1c37bf81eb52ecb3f00da602c94361b52a5afddbfd7e05036e377503050333be512 SIG = 2e7fdeb3484d0a5e8dce94448979496b0642cabc3733a51f8c3c5c51c19ae319018da91091c2385f2f4e9a59edbca2abd0d085ee40d3f0d42061a5a9832a370c SEED = 11bb4748d2547e6196be823c9be7aa18150c204b12ca8d73c1bd46b11a54b475 PUB = efeb42da28d764966403dd300d9f9451b258ab1c80df06fe5943153f5301cccb MESSAGE = f4b765b258ba35b427525c7f10a46f0bccd357ec1ad52a5b139417a9d3894c512d89eb88e681b1f30aac4c115ccf36545e83f37834c82e8300cc1eb289af4375968c29c0ffefb40e156c20c0432669ac8dc0a83c13b1e855a84ad0133c40c82c87ee1e7dd4084d741c80de8a7a9f7759e843a562099c4d7df875352039ff4d3824651386c97759ff7dba52064e6d3112e080819aee8ce723a1a2aa464d8a SIG = 44c58da49d2365d27029d1eebb3bebf7c032d858aa07e0756b1c26a5412d22691176031341ad37d7bb7843289eb39db491584c1b2a1da2e4a2649c2293826606 SEED = 7452a00156d794edebff4adb1f7a7eec26217fef67c3d268352b2b5460a7dc25 PUB = 5f4dc338cfbd384b5f1c14c226701446b52b1e3e2a3cba1a40ee2825080d1de6 MESSAGE = 8c4ee2867656e33f5269414d77b42d8e4750dba93c418bacca10938cc3b570c6603d52c2344488607b2f934f6d269fcb2ad966219b1ab11472f42c672ce20592490ec5baf6a2d2fc8a3ee35374b1902fdefc7870b1b626fa46b12b6cee241f601a9b3fe4c50812e573e6752ce2c7644e3367a6a6b77758d8e4934b58af23abae8fecac25edd734030ee7cf39907e3eed8186a19a807103a9fc49d38f4c8460 SIG = a8f9fa24a3dea1022e73f0d88b1c37d06d0f0b20bbff0ecdb4a40c86d7e475617c03570a7419d74ba0f1327096bf19f0d0cf9f51d483112f26922378682f4807 SEED = 880ef106733f04e76195eba280b3fadda0f25dcf96a6a99c8ccf842c68afdae5 PUB = 70cee33d41c728ce7b141931e6e8524567d7601eb79f67fdcd07b9d682c650f0 MESSAGE = f4f38d077f2b03da821bd36fde673d666e52f4832e1c0dcfeef049328acb7bd71ad2bfc49c123516e196c470df0847b3848a45a2c69bea03e2afa7e58205b63b523814fc8e242f059c69ff7e40f97be8125b70a54fdaf35aeafac79114a7b419e6bb9e70bf07adb559819600dc25e51b4b700d27ca5472a0e7cbbfd14e099faa3a72002da538cbe45d621ef0d5252ba29d83f8b3ec8389c9ceb6c6b2e8d8a20f SIG = ff6caedd8a468aa07d4c6e7131bbda76182ba958649376e711f44c7bbacba6077bea878ba5949cdeeef05cfd4983b0057d275ea3e18c32659468c30c47ac8f0b SEED = a2d88f37ecc2b2c05dd6cb3159962c5f646a9815b2fb37791fc7b606e2913ed5 PUB = 58dd67d7a15d4ca0341a4c869566cad8c4ee16e583a10b4824173b08290d92d1 MESSAGE = d1b87e9e886dfbbdc8ca8ab9010ecf9bbaf23f72ab3cbe769db1d43c2a474a81651c464e9fb92734634641c9485a0239b3110771e7f75e05252e4d8f4c0aa1ba08626d7e96317c20acde2ad99b23bdadfd6f17468eb402ec5eefa57b47caf972b3dd21d89f0e2989ff87d51ed2e2d639c1644e698cbe0221b8e179f3cfb04a20cb2470216a6882fb4ff799e11536cf64219f0c075176bc7cf0f6c5b7925fcd6155 SIG = ccf2400cd673e1effd20161d7b68a5fb87c1e99d3635d78c2da1b509fac33346c069163a6c46c7826a48bbbd03b05e6e2351fa62bf89bf7ccf9a9024bd157d07 SEED = 42aafd0ae26df1e7aa0276860d752783af97280439bb23eae46e3f84caac78de PUB = daa2350adb55dba9df7d7af5101998fe515d311c3cba3eeab9138233190c3b4e MESSAGE = 72131b80ad599b6f5ff698547d16e7499d71275e4e9b30526a5aac0b0c8b14fa4a540cfb1145fc004418bcd318c1a70e6269a3fb69baed86f363f5b8f97f569c20d4f4990e7bb4d0c39921268d636ed0554bd62acfcacd3b8e030217aafac3044c037e0f94da18c6b9a0932c3c5875d3a93fbdadcf67964eec9ec2be69b48f020f6c9874de5f8a5167b5ee024a2c2efd0cdcd2acd8c1f787814141e30b38b163175b SIG = 116143650b6c133d617859db2429c2913579790b2197d7b7b1b4962b328721032ceeca58b2d56439e233bb84dc525e284ff8df2bde1db4986fafd21b3d7d6a0a SEED = b69c33b11ba67841c3d4e6f9234e35370a28b47662ac560b27c078b66ab1b021 PUB = 9df68e9acf67379261744db5d1e377892f2b692ed5a38b37073c04de5d226737 MESSAGE = f9ea126d3ab21961aa2433900a3982b83e0ef86d52d13440afa4817f9b822fb582cc3932bf450d4677c9188181fe7526ad6fe5abc61d0ae759f215013c0b2b41064cb6278ba7e39e2f4c10d6cc9605b3869e169d7da42e88eb857870fe6118bb02bc08c8055f0c189b62f79fb146b4c543aa30cc0cd57f037e9ef7a63711f66e6f2878931702202702614277d513f0850b758549336b30cf40ab8bd460e60e12deed04 SIG = 24368fee5bd848b4c661a3be4f310cfc436e79ec4a78501b81095fe51614231b6ca1ab1269996ad2e98e299781af8e29804b24fe5679ca3ba650c5c4cc58ce01 SEED = 7b63613f6dae01cdcd5e6b37686971cd8d8a99542f6329a12854a9d8ff8105ac PUB = 72ec43faf34d8730177d1f0743c74c20bf72c2394b8a7d471ffe2a04ab00811c MESSAGE = 1816488f1fc83e1ed5911637dd42ba2077657dfe1ae422ad0aee59df9dd56a2763c2dd0ef61a12bb825b0dac1eda5fbb691c5ed58f3fb325050b4563a4042099982fffa5d6ed742d95823da8e1787cf746ef63b3fbb0e88a6c0beae4f7318366936b4917f507336068b194680900a7bf4a6fb69a5c387b97e31bc7f9be53c2a89e3651ce1de41b10e921b206ebf32e5621ef8081616dcd7a2059437efad014bb8e2c8221 SIG = 76f50b2b9c2ad97bfb9499ee41928ac072da5e8bc71d0212550942332b62e70c8bfe1c722542394688decd917aec8f95353e1d72624b70ebed5d17f6c5497702 SEED = 3558d3a74395bdcba560e2c45a91960cec6cb3edbcd30e722f7f055210f37b51 PUB = 534f43eba403a84f25967c152d93a0175ec8293e6f4375319eadf957401fbbd2 MESSAGE = be75444f9ce6be1d83af622a8c478d510127db56f1de6eb8a5126522b09fdc6ca0862cec0b8b2aafa31c17a2cc477da533d276a1ae4f8e0759d6afa0b17411b5170b52f20547c72f3e88d48cb456fe625b62feb0f81317edf1ec09ece534b9f500d4e1b1bda2db21982aa95094226ee9f5b0a65da83f91121c96b3b4010ae7826c9e80636cba00f70c3c8a279b01b95294cb850f91709f4376662a580b15ac2981afe9f854 SIG = b365b5561a13a54517cf90d88b35eb0967d6d58414b8c1547e693159e01378563654c50fb42323f09dd78ffe28056ddfa54febf44891e8a741b6a1687d728605 SEED = a35b92f244063a19bb5e3ed4d699ed2069607116d2bd08113f0d8373613f35b7 PUB = 7ec93601864ee4995a4f7abcd3dfc101e9e7f369e63de1ae68a07aa7f075b329 MESSAGE = 65cd36dae0168d69974f95f09dd9a59db799f911e1a15b85a00893b8c9a3d48a2f58ac126bfaa0a606c05d94701d273abf7d68817f2c71b1c541795c4f6095e26c9dff803f032f75663fd1698edd97ff3a0e72e1b7c9948b08bacb5f7de502b2fea67ca2fef190d60eae92d15158da444a49d2e9d5a573e8e177e8bbf7e6c49f907136e71d2a66cb07636d48768ff417c8beccf4323181fefb3124e434049ea45dd5019e40b4 SIG = a23dbe3757e478dbc84d3db3a933b0428cedb6b01b86d8d73f3959878dae6f0588f505cd4d39f2ab4677b64805d629652a22529825c3a91d043749fc71f03706 SEED = 72d4a564ca15499b5e4e75d8ac0f28217d32114a0c649a7c8eaadd0cc78c520b PUB = c766bd73837c4faa5215502f1efc90c003f711bbef55170091028a34493408a9 MESSAGE = 6c7e7b62eb244a45d78436e2970dcd6c0f7db82297a86140ea58dd22c2195adbc956d4c4ec05354b21efe24cfcfe10e17622368848180d2c4680cc215e8ceea6cce222161f1e092239253b9746f7887df2425ab5a880bdba98153be786dc838cbeca016b1d06524bd6bfba809a8bb37adab15d42415f86ec0358365ea87b8150b05441d9d49846871485caae6de359736c27189736d8f1765f3e5c5f6b92168396390bee94cfbd SIG = 8fc4f179330b642dd86ca9362651b83b006d8375ccef811d3c6706f91594651df2769953723046ccb9bfe66a667e0d11fc3ea2d8226234fdd5164765260f7b05 SEED = 2e5aaab298e66c2dc1d77ea7421ff895255f9d900db0450d63f9f79c1a7013cf PUB = 0381f3f19045719b9e8ceb562f0e965dc07b09f371a963a281c749c2532f654a MESSAGE = 3df0e54c711e3132d7ae953deb7b66869ee531ee40b63ce693206cdb2f4bda0a2569e913ac3e6532c5d9648efd4627780fb8a31d107e033f054d19ed8b7c49dc407d2e949de25f99307221d35843f6d5eb7de5cdf41b91dbbf34cb6c9c530021014b56abc44ac2300313615608a7b4a235e99c14cef8050887032209488b9eaeaa82c09405fc75bec94dd42d6ff1b599a63ee5742f3364093ac92cabab3035822aa867ae56dcc99d SIG = 7c7430305b361a9e35b2780c4d4408071b2130931d39830ec8d313aafbc83a65dae19cb747d9d1c4ce3f359cc824ea8c92f66a42b8614e7848b884ac8aa4ae02 SEED = b636a02448003543db864b40b5d8d6dd9ad611624c9b0fc6890c51ea5592c790 PUB = 1ef360495968e56e6d3fe740b1c84c4e4490ed682deb4305afd596efb280223b MESSAGE = 4aa85aac25034f614ed44f7adcdbeeec25fcc2a9eea32ab6a8699506f7a1cad3bc892e9dce934e75b0a8cd14642b778599286cfd8f50a9e4f2edf9f9d6291a2e2979cf1806b93ed8c9a78fae199b2854a03ec406ab3f720835ee263fbbc91cb4ef0758d775fc784c7d5b251ac8937919a9e67be88c9e44cf2ec7f560269aa0f1113d91b84401db15a3c48c7dacff4939ee01babb982fb95625c6c3ad78749060551bfde8cce4fb8a29 SIG = d4ba80300d5cb51353c03f28c44fd0a424ffe1e40d78ed7bb1133e8fe4e187505293b20a391da962c6a8ac0acec9c67226af3b6195dabe39b3662294da3e0e09 SEED = 5ca0543c71f568a00eedf50a9520f4c15b526e3fb0da816c29ea3d50b2f62a12 PUB = d4a2933ce19454e331b5280100209a6ce8e569f993c2acab51dbe864c5cb2563 MESSAGE = 4ef8496978d28c10abd54a26356ee55921ceb350dd4b742c4161fbeba8a1601f8ad0484b21a8cf5a294fac00ec8a6f59e3362e47bfae1e28a2e6d017c5caa75fb0f48482808037ca21476954d778ff1a0586da3ef69d6cef6d2d8df4ae7a85442a1e46c998cf407a6ad4c5463a43c248f3b6937fdbc845b60c6d85e0563cc16ba9675d364f525f669aaac95f428bb58205099f9e4a6dbbd0151fb65babe123e5393ad64026935cb488aa SIG = 436823eeff3edce5d8587d68e5473ef3d8dc9465b558b6e8e7cd3137eccc80b4c4e806edf13619d8e717e69f48d7061b68de02c8209be1f7ac26ba8edf606d02 SEED = 5f87117da9bbb6091c94da6b230b7d8f6de0ed2a076413b92eacdc43abbc6897 PUB = aa786a146226832aa73c434b0edc2d41d2558f820ab8f87e09e6cda91072b9b6 MESSAGE = 2297c40a2e8365bae4c5f0630c50b13bdd9ad9770a5d9a9451d00874b023d25ecd468b96571b2f16dcb1b0d3d756c1f044fcddd1c51f27727a0369c9cf25bd6aa59551b5b07cf8f807d92b159198639704740fe6eda0f26dba7e75d4530b2800f03fb6aa677d84df75d68d4fbb64ad21001e3fc87b609b9c251e8ccb12bbca927447e2054e07688eb8a20521a52249e7b943bed60e6a93c01e3eb621f0460c18a690b6f6b66edc6e8743a6 SIG = 0f19e6ea0c05f38185c01c2d6477995daf5065ba9d80173fa6bb23a774dc88b3aae879d8a62471d2d304cc3dc66278a7abcb0bb0771cd278e11e7b932e9f9b0f SEED = b53a644c92ba2dc7108b16833f09ad5917846437225a773d32d79c97733c0a58 PUB = 515818c69c0e0a1706b04143842f3e9e271448fbaf3a899119c32f42566ffd33 MESSAGE = 13036daaee45fcfde0c53e06d05aa9c01ea94a67e86c6c538ccb283b368daf7078d3fbab580c76ecf82b4e9660f068dcbb500b80595017c5be3c448fbd8a17d97c5643197890e167b35345bf65e75b82c8d65229f2f60aae2772581bc99c49d416bc3d78746ef830f1af944f4a6715ab4ffb01591bac2857f1a9c9d1700888780006a31607338f7af7bedf6efe0b57299ac915526fe5e1e101298708c6e61b84220afe95b53f895987456152 SIG = 13d2cbac7976ad27f0bf669ad588efb2c91bab8507d57fb16bfea9caff2b0964e75625c4d808d7bbb78c5b464edffe4949ecfbc8b95ff6fdb1bdca2742068100 SEED = d27c9eafcf88151990bb5b2fa8443e709b5fd8d78d233803322dc86d93d93295 PUB = 08e0eff529776714686196d817fdf71eb5b6e8326516ef489bfe186ac5c5bf6d MESSAGE = 77c35bda32a5967d8b302fa7a47583ceab89c9a609a667b753155fa6996f8631d0ebedfe0ac364c77e85ba37311f0de57a0dc2c1e9e400d58b424a322e1d5771e0a9fd9502ad0232ce544f07d8c66e7c3147f8607ac6189bb69066f2fad631185f457f467eba33228ecc40e894a77b571698a9bfac841a54eac5219da99c6a9125c469a22fe81f3b951433896f19ce39b373fd7e5c7b650a5ef2365ae7510b0da5e49d7c07073cf166a98387e8 SIG = c254e371445633137442eefe40ad4a82e69b1ebf48a685a2bc6ffbac126d228487b2e3537c97ef7410342091962e50c0cb85de7b39ceb41ac4078d40f3407106 SEED = 70213d3a79c65d6dbba542a3679635003a682af5fa58de6b0d65bfa24184901c PUB = 4402fb92cc1249dd1ae1690f03b3ec4f1e9bdab0de5bfd289f10296830fd403e MESSAGE = cd6e1cd9c90f566de043d75d7244ecfdb38e8bde2f9a6cd5a4fdac72b5ede6af62d981918c5e610a38789274fa10e527f85fad209b76ca1c281ad5890f9c96d35de522f1ddccb539b8798a0067acdd45b6e344a5d9a97731f545ffa4b17b875c67b48e9d4c4ba72c98a4505583fdbf1e12f22b5a7a494746cc9b6c1b571906c67fcc883a9c15a3806875b659e5816b4276c3190e25cc1ac3de47bf99c49965388f54f3ef8eb569906c6008e5fbbd SIG = 5b6ce2774d400ecea8a808f5fd0a797ffc6116752376cd7bfa3b2cca3a84d5593f5c03ad3eec1d89532275c47b7ce2a0e9c59cc4028a8a65e5bb9097ea71c208 SEED = 5d540b3b14f0c0175c047eaf026c9070659ef13e9d28e0c5c516a428269b14eb PUB = 1d2d4d551a57c6fb2b04181049d4039d575cf80c0bc6ec7033067f27309344de MESSAGE = e4c9e8706898cad4ac68d73c130efa04a54f8ca25919ea6bfaa54c8c720ced854c5e9509102c7b885aeddffbd1b7f2c5922583677ac9eea9a108c7e83e8871aed5a084f5440b0f391ad7ffc6bab4574af1b96770f4370e8e988e85ecb1a8d6034fc3d7f49f7422023b9dab5d0c16beab5f5d37b0a4d7de197ad87cd4ff8ce78eb12e1daf739d8b47ab380abe9093356db5b59717751a49e1948472fdacc259ffffc8c1dbae592607d4ec71cc6a8f6b SIG = 32527da755312889935dd5ee91b1bb117a5d377dd23ef5b7e15baffae9a54391a3fd234bdce073e098c58d05bf195b4c3cc63972383ba4b51072971aebcb620d SEED = ca41769caf1717b4e45c93c121dc82a534fbc6ec0986662c3222d71492bd1176 PUB = af3f89f6187dbcf9217750c67ef89ed47b039f9eb062ffec9df64ab52b0b45cb MESSAGE = 9de8476c5813848ab1451537841cc178002181a2182af305b12e5f7c3b1d56b22cf46ae6276d1826ec0a8c9a7d9f68083b7225bbfaefce82b3b64594052a7700f309233a79fffdfccc5c21400c91cc0e418d5141d486b5219901d6dd2447c1f7b7cf5a0879e70e1dd658d0f2ecf31ebeee11a5c74440c63b9d8b45318c3465d7ff03365edd0385edf80d4fded51f0f7533ee4099f19e93bc9d08dadcd13485db239522ffc81e2c051f8796d62e979fcf SIG = 5cda872f7ed6d7c90218ac10bee8e214f3b34d15d25c39255ec9e6b0177aa3cb7368d11cb8ed6ff5cf0c04281d06bc4272b8bc09c23f6f4cd5a810ddc7b9c103 SEED = fedd63ffd4cfbf618894962e121a9025eea318a80a1adf169d6490445d2e02a0 PUB = 542f2244bdb7d84b87e628a8e6a12f17bf74a9a6d0ea46c595dbfdc680c04b26 MESSAGE = 2e2ae584641be03dd48f9c618077aeaa18212a4241f0c0194ed23e370d741a3ae11a5fec3b040c16eafa4ac8d18abaa7ce8f286967337189f0495ffdd61995cde31dd8dfc3df5700b57a7a29980e9c823fee85d61451176729e72787c6109b47359b93dfd62e1e5a2d642c057242dae500a94ca1a93bc57be1ade76fe4501c0f6377ed0e9246179aecdd9946b671e8190e1ed23f966e96409b948222d8ea5839de904fc51348073b8f40edbd9b4a4b2275 SIG = ed59d9e23dec3494b0fbc5d10cd02bab86b3eb35abbf9e4d4a926479f134583a44ce72dc4122aca377a4072b7156462b74e8df46b686698636836ef203179c07 SEED = 38f2184eaa553656ee2902706bcec4acb5af25157ca0f6a2d48de85285fa3bc0 PUB = 7ff03fb4c82e9c15d659df424b3e73ed1d78006f3e0b79eb64d98c13aec6ba37 MESSAGE = c2df77c9e479f61983b6c7483ef93fb85a103b213923926523065ebff2257e85427e05cdc27582ef6c16be353a3b250372d6370eecb6c8962917eb656f2641690189d172a111051557abc2494e32cab65ed0633affe92408b55c4ed8af65e2c5e7aab887a3cc8d28c52e9e1336d0b7bb3fe2cd843e7fa1680342f8a4aafa02c4ab252f08c3d46d5f00fd01484263ee635284f6db26d6298de5b0dd238da40a8d2a93376da0302783a0e3be23d9e7f990d25b SIG = 4a6413c2c87f2b3856a8decbce493adeae0c69c94134707fb0f18f3049fd3e3d051abdb9d4bee253c6107c02d57ad7cc9f3101db660afac2b7981938e9564f01 SEED = 8bfca48462d2536f74b84f6af59f5d8582ff8f7ec28745d672e72eb72e79d3e9 PUB = 9d10d275c3d3fe459f7fe2901bce389191cc8483c0f51140d9c62b08fade81bb MESSAGE = 81ee4cb9c45da691dacd7dd09aff59737267bb55c3ade1ba32c17b7d0d2d0c6079c39d5fd5b29ba5f9c1762097709843eee5612bd20bc8185bf64d5c934184e13624e6f877a2a5dda15c0df62afbb97057cc91cac9a18406a0e0109cc39b2e3f812e227a4062d5ef81c92c22a7dc797c845d71eb6ea9e42ec8417fba90a96d2bb1439418330b4bb2f99c6d63d304a0e506dca9653e5de0dd56e309db1a76a0faabab163774f000088cef3d1b7a6cf661d2e1d9 SIG = 44d77e439ef6ca5eb940c60ff8732ddc16269ea023bb2613bd447eba7fd69851226c4819ce8d44985a49f3f41ac7af33c47ffe5f89304a3256e445f8d686e307 SEED = d7480d4272bcb1557b1bbee04915c126a52ca6d6a8bb5314a0e1a52b59bfc99c PUB = 99c839d36d8f5b8652618ed7b0fe9ec3d94efff4c453c540631476a5979bbbe0 MESSAGE = 615cc19f942017365ba8bfa256ceccc85ee289a1c34bb1442acc0716c7fc2caeb76a9de19adec106371e47a30d2e1239ce1f7dca25526d604bdd647659d942bcbac368911349c3b946a97da10a42dbcf3c73416d2e6ba22bd29d9f705672e9e338944cef01ad21f009742e07bcd888ca31e1ee953e8c1b1fd954b7dcf1a0b1d5a069065a66cb721adc020f4efe1abdd16742746939285780d753137ae0140bb410fb6ce33676c27aeec593a88cbc73afd9f40511 SIG = e04dc8442d352173e931818e290858de85688a4649ea3e3c3ae74edaa54ad01b64622ad8a090b6ad60adfd01881882828d39078bb5b2714fd3ea8397a342fd04 SEED = 3c2d3650735b41ef9006bb45e4be2e0aa5cde851aeac421ee9c1b492d87aa18a PUB = 3e46ddce298844fcafa00a1b47eaf3de70596df1bbee3c809d1be7dd94080e34 MESSAGE = 1425d8d218da1a10a80b6a9c3c2750efe41657984abd5100f451ba949db01046b7126be8402334ed57528bac05622553a86b726722695a8fb331d8565417c4ff0f251a320ad06dedbb750def35d521c3c4cd571a45ada8450653d5e81fe0beb53aaae787b3eb653c2381ed55aaf2590ee5ed8b6626f1c4b0430a54f39658624e6635fefc98fee8fc3e1cc7ff3dd420de9da11a62fcae0e0cb454fc6f7df03954291d26202f1b188b657b3bae07389449b75e67422f SIG = 3f2af01ad5377ac39040d41a41e36e7b93fa7235b841791f432ecd7f91a3b21ab7196c883ad5a7db446f6c06672460f3f63ef863d9432be9caeabb79e87e2208 SEED = 74965996268cdc4c09220bd31ce07b217a03826ee981fa89f3a2359ced095ef1 PUB = 4096d027c1c5ee4cbfc04b9d534174029fdb50cf5610d3021ef933b4caf33985 MESSAGE = 45b2f064615bf774fce97f51c464685d7b3e4fefff9231240a719b3b0621cd4ad83305675cd6eaaebff791000b0b1fa31d82d8181b7fe57c5e00cec56ff9022e9ce8db66356e408e3ee262fe627789e65535ef1a63e8fec933be3dee34d2facdb8928cc456abf2f3e8cab47eff1ca42e8b0e48d2c73e7bcc5de3f1056fc523dfef6b0023f32889ed394eeda032abf6bcaadaa7f3ee74118760ab6d91df528bdc5807972c85fa7cb56e387d7332e779e52d0dd7db0cfb SIG = 8c6628344317a63aca6f78cfaea965b3aa5522ce914195141c08870a1b8dacf34b79c7abc693cd9e5ebe1a2e86f0332d2048db3cbdef01687962d6df249e3800 SEED = 0abf069c08b2691c3a26f79dc8ed05cb71d220ff78f3a5c5780ae9da18e45643 PUB = 9ef3b5cc016cc82dbdda705766aa448bd61fa1aaf1170efe9149daa9fe64a1ae MESSAGE = 0d055291b2e861eae19ea0fb2069d8c9eef4f1347f3576d78411ae7c0b1c1caf31fde736dc8accacb662df76b620b62ce90b9f92c83309128621d057cf845805949088e938ddbc3d41c5e5541fec8298687ad2f79acda01aa215d25821436eac9d268716d4cd6050260cb4ef6aada4835e073a845821ff211ae2baadceb6e57f06f88345edbf93bfdf54fb74123b57c0fb4a79608d8db6740889e15733507799f7a1fd3017bcd77b28a2bb6c91ecd154e9c5a5ffa0eb62 SIG = c7566fb3b4d8def667e040f276d3ed98d36dff460126a75b4cc2100386bb01c642f6d8de7e649be6e0818b08d77ce60f4ee5e7717a50884bdee02034ecf1cd0c SEED = f3fd5ec5e230b6dad1ac3d3aebadc7863ff89de2a1317f424d15989a3efb0afd PUB = f99e5d5eeeaed1205cfb5c2cc4e5e9f6b4e7f64129f860104ca6244eb9feb564 MESSAGE = 71f28973ed3df05945fa0bdb23e9beca651d3ee6bf9fa45ffdc6061e42fa2e8d76235f0e9e2daa65e52631fc3bead33da055bb492e4758e598a030a33b3c40b34371459b233ccc043cccc3a3cbce549e20e0b2b43305b64aec661aadba6556b17d76e3bbed62c4a4eac4f88603996752d2363c8d4a2789d128f6e959945c68c30146d194ccb6839ec65344601652c18b0074e2bc7668311697d960c7066597924d704d02a0193fafbfdf571ee0dfe414dc2f52896912bc32 SIG = 44b0124663adb0c73aed49f73403461fcb19111b0ba17aa996566f477e37d524b0e1f107612fc52a7c767b181fbf4d629bddc08f30584dec6124c5d39d423102 SEED = 738f1310a4e08f917a0a5c1fbaf4ef72f95ee62fcded50868a3daf98856a448d PUB = 42272c2c8b08470ee5dd8af8849c01b7508d3a3c65b0330e695c841d5dccb2f5 MESSAGE = f0e7ef6782d04c6943b19eb66ff6226b736e3b0940c09bb126bfc4c4ca7a5e7016c286b7bfd73aa6a79a96031bc81cb5da68cec71a6a0d39780cbe6a0cd4774d3aa06a881610444a8c9d19102294e5f635187aa6f48d11912c7094b38833028d570cb110db60625bb1bdc37affa25ea3c8f8dbfc2514f4365c62b2989a66d27c80384e74ae5fba8c1c2af9c72c4971e64fa6a1dc2517b31ea57ccb0815a7fe2da0f146caa08431d25d151662d9d26e95229d0c62823664123c SIG = ce1e3577b6a21016b9dd0b517baa0ccb107bc199b8bbaef68f950c8ed58013c853b4d338eedc675079ab1390462ffefa6a959b043f8b5651c6ca375ce0b4a403 SEED = 8841d22aded69c131ef5ee0a10ab0a9b77cb754ede8d257a5372726e2b499c6e PUB = 715ecca63681bc6e9e31d18848902f4d96feaf43b95d008642903b1763bc9fb8 MESSAGE = 087ca6be2a950c024b3e7467fe00a7d364555d5dc6770f5ebd260642525bd3c0f965db36d7b229a57421eec64e4d991cdde59123034470553f4eb0be81ad2936c8ca26bcab4e5d79040e29798728601684a468323cf3baae4d948d0a1fd905effe16dc44642088df53f6388bc480edf4aa207d0ed161eda345712b4c00cb05fcf635ec2588785bfb8a27cdc28996a1db3e6787023393c075d83c9038fed7899c55fec307de3249c14bda49e8b895860942c36d640bb893779142 SIG = bb2bab7003f1311be9b8c883fc4fd528adfd51a9c99db3dca8da0fca958da19a10eb22332667b1a0065d3dbc0d06269a1259b6a890484aa2143a52695f145b0a SEED = c02135e7b65aac72f63c32bf5bef5b68c7f3b8ed56208e59e4752070e9d07095 PUB = dcf600f244037a75203ae11ac316e8dbe9986f0dce23473939334bf5cea48b0d MESSAGE = 86d9491350d2566e708ed356185d610c73465b2a5c7012919958af2cf76af995230d360de400b7137170dd0835f10fcbec224ee4e42c7d1cebb7f580fea8ed6223163bacdd1923a572cbb6dc26ca8b17ade68c6d2808c4ca1eca28eae9a145f68d4079d8d59d140e958228e7e99520e342dbd7457a9159740f48bdc27b93bdabeba465cbf0c8df5ef2c0f9386eebe656f5d749d5f9147f525266910d7b80396a90be5cc188a9a945f93e753fc99bafa18ee0a6dff79bf8484898ef SIG = dd5cbae479eb5e229574c21ec3bed911113a57a1916d3313457515d55cc5b6e6ebc52c93f821d13988dbba8df5096d55ff9c39e7f9d561cb58930c96a7a5d60b SEED = 154a47eba1b8c38362ea61faeb0c0ad7e61e412a3cba4688af0db2a487208b1c PUB = 16de2c894a50cbd4ca90419a4ca64942cb14bd335c5d3f4a53e239c280bda725 MESSAGE = bf607e8b6e14d9c8acd96815af0c035ac73c4104c93786ccc1c9f859395dd781900320ebf356aa991cdc9f503fcee9f83675888a7d592002d2a54a573a96994b3fa865538c617ed8ad1ff62018288a674f449be0aab5222f74c4fd475ed6a8dfb27f45287b22b2b6c3bd15179f267d157d7d8a4159679be85b25c2bb2ba850aaed9ae3ae571be4f75836329cf36f412c1c80f1413b7661eab4a8e11b6024244fc62323ff02e38aceb1737bd474bf1e98015dbc788b027bbe217cf4e7 SIG = f4b6eb1a8d950e887fd2f30f70a23b41871495bfa5b8a4ad3996cd9bf51eb742e07f4c4d2da4b01ab087367a50e2b65b3cef514e40d837540b8c89966485910f SEED = d3028431ce2eef73bd940ab84ca29f13fb26436aa25e1b7bf26cb33f17fdf817 PUB = 63df203e2860bac4d352e722c1c91fe3776e1cbcae8553a4f19890260bf0e457 MESSAGE = 086335d61275d168eaac0540477f50d4b15f9e50b9be693921ed54a9941bc40643cda62e1d805d0250a81146bd5fe2d39e81444d21e2b21b031c111306cacbf52717f6fb4cd3416f1215f8dddcedd2f0096b0fcfa0a6cc2cde7a2bab7f1e32790b5361df3671424cc722f231bf71895bcdcb7b22ee074e8fb4a9678504e735366c172f07637b7a93149bb21f38883378a1db273fc23239e35337f9ce566d8ddf3b3133cad7f2ce81edb503ce1d27c5a657160b78dca9aeaea379be9c85 SIG = ce9729a96c3ed28943b27839c73382ecd572960c1f9e90c5eff9dd499ff48f17d25edd1268effe41ee6a81ce48d84de513df9c41442621b2f5491e346be18c04 SEED = ee8985dc27504440a8758d4c53e4225215797a00cd8631d59bd93bc66f373d5e PUB = cd647bb065693d486589156a9fa261437534dc86f46f72d0a800399a7af010f7 MESSAGE = f2220485addfebce02a833aca33381d1df917ed609950ed24f85e3b02b2b994b4d939784e332f41064c8b4a2630ab36961742aa1cffdcb08c144eeaedeafd48b5dbe96bf24350e14fd68286bc08eeaef8bc6ad9e195d1484afcd30afa8ced4848126d56c81b43c27a5dbbdec1a50c11062ce21c61d860c25a862fbb75c3bd51c8dc07636668669bbf751eacaccb3b51d2c0d4140316cfce2eb18d2908cecd5a188679bc5f5de290f548e7ebc57d41b589a24ce88ee48d97e8d0c7c769960 SIG = 5bd60ad5e9bad9932ca9c75f231a76889ae7a8b864b91d1fcba5c5d4bfa1d92838adb974842a0710779b3e3094044909e92c7cf046ce519f4c68e8f19ec03c02 SEED = 80dfe2bf7387bad4654eb076f8dae9595163e40127f5df492dad7df04c7221c4 PUB = d1783ceeb9cf8e4d07764c473fa4061b8274397103f2076d703249d758b8fbd5 MESSAGE = aa09d784bb09dc999931ebb4c00e424cefeca104818d8eaf0661f09728ad025ef47393210571f17404e9aa6d8cbd5fd88cd7dfb8e2e8a108c05de206f3408234a3b463dbe71a07d05587324524b7326ee79d3348ddbed7871b86fcb488031dc9ea93f6b8d7fda6239348a562444faf1e72d31af35443e9df53e762f3e56b48668f9784b3368ab278a48ef4546a26cfad0d0a5161698f26ee8d34fc2b3d6dfb93b009ac296f6afe487ee335eac9f02cfcae5fcbd1a16ba4e71be1b112562fc2 SIG = 27279e3cdcb03ef557a5defc2f6c58128a6dc3f8b0385958014e709c1f61b0ae6b403576f0e454d5e4c64c173138ee4bbd5fe7b60d06c5abe23fe99ee3b46a00 SEED = da1f868542cd7cce7a5ca3fa3c24081b4d2344b21a157f0264a347132d19659d PUB = cb3a25a53f272ea813804468d6500e96a1eaf822705b7790a8ac3e98cc4e524b MESSAGE = c6987ef380d5d0e74196443aaa3a32356cbc02636c5a4b6d62a8114b2111bc1abddd9e44b3672c18b58d4ef591af4562e020049f8e1274688e1f8e5296d2f9252e7fc84cd1d0c58e98f0f160530aa22c871eef652e71974ce91b4a65fc25fd09fa1b6c32086e98ec708d9abcb1d9cc8e1a089ed8db2206ee9570236ad69b3de6821862fd2c70cd83a32a68b0486229553d928de48d03a104e87381964abea76683976d527c84163a12eee0a55986cf1431e9c86cba8182ca94689bacd165fbce SIG = 75c517ade4f08d7746305743d1a776c3c55eb5eedfdfcb5eb1d5634a1bdaf7a4b8d24187d6c8850e3ced6567a03c4c59389a4cf47114ce5473160f230546e60d SEED = f13daec0ef33ddd133c7d244d10fd27ddb23705280ff5f1815f0f656d836fe84 PUB = 2dc7f1367de672c51e005c74f876f982593996873acba079292734c209c2b111 MESSAGE = ec02ff1804b2b309af3158b66272a14a3aad83c41a719846f7088ca9792af575c78913c432759f0b9a748bdc5568496e41658cc1cdb8da6c91d07c3ec2f4af504249b996aa00c0071cdfa793f82d0ec5d267262f518fc029b88e20b6201fb9e05abd3f9524c5da2fa8978ff2efd48120cf00822d1bee90df816125d8edc0cfb5de66d16be63896a412a62b031b7118ac13fe2c9faa6b1a3342f9ccf7884166cf489a84de26b5ce5b21856a3af289bc6622c0aab9f2142d393f5d4b236779dbb066 SIG = db771833f7fdbacdab2b5cc80eed50afdf13783b7fe5e903d5dbb4c2e535316a6eef4c34f004d2b9a4e2700bd6e2acdd564c3c80cc68a303f5fb091cb4340f0a SEED = 42dc16c57fb6f128945fa101e05bbf548ef7d97726b692fe404069cc57ccefa0 PUB = 0a1ba5df523996f954b34ddcfabad3f3dee21a5fa7a4ce322d216bd8ccaf438c MESSAGE = f2714c23a3a6fc11ad15c980b7350fc84217877661188055ff750d82c49c5fef7bc8e6aac574a1b79a3f26d16969c0f406eeab3e9e12850a55709745e30dffa62a69dfb2b64b3c1bd2bc3586e26d4eea714d2a7b71cf79fb8ffbf2aaad00ca3e4f2b6f503cc1fef2eab3656fb44f8d62a8db8ab58f394693949eea57fafecf005f6ebf1287dba4d2d623c02ea171f567e526add20709ebcab962f83d98ef668ebd01ef20488b3665e3a446fbfb13d34050942c749bb2dffc766367fd452e68e5b0c6 SIG = c75977e83bcfe9df7292a860ed972555b5c24416fd4b7ee3285388fa5b1447608e4a347813cfe093512a7651e422e9867db7b97c0b0867f0b8c7b7f4f02c310d SEED = 90b455c6bb9cec83e137357065339d030525d0ea7f5b923a2d5972c3c12aa37b PUB = 5cef038c16bfa4b4c923a0fe70cd7f25c8bc837fdf5a7efb9d95f21b96be925a MESSAGE = c62cfdb9d21eee6be47f30727aaee51f0703789a431d32228533350217a93a18900669c95956f3f2ae90dc745a71e18340d058d16b4c6fe33b64af8dad973fe5dc02e8520705c7a8bb3ccbe1838c6c249337f9b6a4c0e1f8a4e5d103196fa79998923d0422e9d079a72cc2a8f86d659031a607d4cca0b947b3abeeeef64c28da420d05de665a5510fe55f77598ecad7faa0ac284800b53829394c4ae90be66678ff04ab46da265ae06402d8c83cad84d61a051de0260559888e779f74b72a5d71c132f SIG = c9345eec2c4a0aec732386494a69a3fce8b8a1be366bbed1659f131fe97cc037fb1b7c1b68b0f3023945d20090a0cd2c1553a47faec4d66fd816ce121168f309 SEED = dc185c2ba0b378dfe5dda510c32feff535ca2e8a02434b326e0158bc878e8848 PUB = 33d6cc05a434e419280d5864a1af209a2c676814b70f72f8141ac7e0573ee63e MESSAGE = e276b11912cca5a84bba650c172aef3a4d5f91ac722913bb891a3ab0424ab07ea709cb8bba3a3d11f82f51c2af0162a82f7219ce27b35a30507d536a930817e40f85a22a5a432b94d192c3c8911777cfdb7fe937a67502770d6d75753d3ae88229e08f1ed23b4328d862ac61863c063ea9848f8ab96a0213d7b936c48fe754836c98487859d199b3d940392716a1d569e6c0cb1ba918932cf88525e256c8abb11aaf0b454655d5db55713cebba287ae202651ac872bfc80feaa7e00d47c0be38e658f7c5 SIG = f1e44514d2ecbcc8d1a7e84bf584ce731835e9894f88974f098d456b60718f575ef4d8062f2182504250cf83bb2af2a79b1f58a6a97bd98da467132d7bec2f05 SEED = 90721c43bc366f24bf4e8c993e138024682f1029dba35abeb0d60c7fa710021c PUB = 7c63a2f13b7b220a0bb752e3800753b8b6b32669378ce131bb77a9a8d230e9ae MESSAGE = 651c9617cac958c7edd4a5f3fedfb83dc971abfbb69a31e898cca8472ef068034a6d2376ee0e72d0a9bfee275796c3795adac8ebe1d12b66ec268f6b75fa3941154f99e223faf2cbab5b92e2b3ba7b79be7700ef9dba69253cce5356b0c4e74703cfcafdb5546850b46232675c90c02d5e426d33d60cebf0c7930182379dbb007f536163c8ddbbd3157bb2da62340133f00ae2682ec6baa6416b5a01521cc10e04695295f2e5b94c05f00383ffe954830797f6df823172532f98165fe314ab325929af8385 SIG = d2064a6d6c99c6c3f152d2d435f24e34b5459b082ef11e944a77ff54ddf9862737ecb2ac8d54207d36c51ad41f36490a111ba80e126bfecb09def6accbdf880e SEED = 9cec246758e412e7378b4579eafe9fac5a25d5405f9270b5d7e543414ec3d5da PUB = 975a9e6a152caebb2f9dd0deb76dd922b6dc77055dda03fbae9e7c685d073aa1 MESSAGE = 17ec9bd47add6ccfbd787af0d9013e9cc979aaf850e09426d3b28edfd71296eb31ff8b21c5fe7be050f536324c3ec48850e0b508a36bb4cb7e754b327183a1b394d88a7941d1ce8dac62a5d8291874d78485e51f29ed05865a206e52ecb12c5d107d4ff96f25d3c5d181d2c4ba6463600db1cca32857fcf597cbdfb2fda2708a8aba281b43c3d28c4a4e7983361509f61a1074e6f0ad6101c7b567ee4078e9839c47f46531b729ff0efeef7c9d1a8d833d9c0f42812a34187c3a778c165c09d6459c9c7ceaa2 SIG = 9bad1e3b1279ef658f4d071644c63ae2b7a780357e9dc426f1650ec0634dfc520f8eda9dc8f10aa7324c5942d2347ff8802bd90e95fcec313352cdae64f32a04 SEED = d1403f63202e080525843bde255eeb6b6783c1caae9d6ed00ba60805bed1941f PUB = 238aea3ad6d6f27783e70516bbfcca4770366b50ed0fe6a4e966b53af121a721 MESSAGE = c4f17d442fba4ca0df8dc1d0628d7d7f36b60b5758d7c13b80b8f97a62124d96a23b279565495a8accab5997115b13a4ba220a73957eb7930520acbbfb6f54cf68726b6450c6ffa9470b055ea262914e2bc612633f1ac3d0618a23dff188a733d76bcbcc460f52ab61e19938f9c8caaa792c208d1f6c754728905fda51d881a347a53da744d3baadc0a76c474c558680269095f9084a74471d5c09ffc29141b5bfaf4954dfacbca663d037b17ebf9559882233e5ca5a8bf75cca4fc9c5a4109f32e145f3853b17 SIG = 8e60e73c063816795e29f5d64ece1159f1b5d5021a6f8f655e261a4d0026f5b94ff2923250499d995298480512e4126276aa4a226d015a95827b3ce692e23302 SEED = bdf6bdc31ab0b5313784483abeca6ea5e9cdc68f81b21f350d09c3907bb9b6a1 PUB = 03627712b755e5069fb9ab8f9e899724029a7f268af9398821eeec9360c9285b MESSAGE = 90a66aafa5642a98e79f0d88147080167b11e4466518f195cddd8940d12ee4918d31a6d4cb77d0bf5af29983bbe5085610a79daf0c75a78ccbcffbbdab2189c394ae24e265bd8c55fd3f4098e1b175577549518e7a4dcf7452086dd1278dd58ea4c0aa690e917951ef39fcff60cbfa1e90910bab5374928d4722f702bf5ad6028ffda6541fa5ba1a3779ec78b0a95fe3850c748b6c8f42f330ec79541a52a1cf57db72df4f92ce7f748aeef1af33bc5ae0a82c89dff216f23aec168a7dbb510aa632daabcc971b3f SIG = 38fac603ed246f833f1c0fd4585698b0a71305eff0d14a0049b3cef073bd036dd451b3dabadaaeaea2aeaf83d395746f4e86866ada971cbe482edb0419332f0e SEED = 57b3b14ace1cd0cd603e6328bd219ee7d9d094487fa668f28aeec02b43c909a7 PUB = 24e6b6395f97ea0e237186d469b71923d2113adf403beeeb4a2d27909aaf3eda MESSAGE = b2e0dedd802eed996dbd5836bf8688b0d1201bf5442ff9bbd351aeefe1a0c21fea2b5c9fe5edee47e921099b05aedaa80367c1ce08821d783a5b64cf059c0f4335083986a5a6ecff8c84fd40e0ba5dd5e5d2f01112a84ce5cf8e0db78beb182d9139c0b0f3e0060a3fa73869e96423f170df9af1cb9c35566d87dff542223f6d439bdb54729d366aff637b0f36a5d14b15d612bd03076cc4d04c1f25b3ba84e0d1fe474e5718d1a17d5a488465662ee4c3f664b4c9274b649d78cea4e85243f3713239048a908ce3e1 SIG = fc79fdc6d090887a61e43c6b9187b657d2e4d9cbafd6e7caeb7ebdea842825b78fb949d2c49a0cf38b6c73296d82c8ddeb1fe2d40aaddd7964da68acf8c66f0e SEED = 018a2c3deea50ab506751f9c2adaadfd9e2192121609931684eb265e193e7f89 PUB = af410bdddefc644ef12c9899ff71b9e1d0dfa3d69d8c2cd676c1916b34591cfd MESSAGE = cf7813efac12ad1c7c7322ccbe54aa0e9a8ba4fd4345b06e4ce7a35c8b1cd5e3f7f0688533849ba2cf4c75b6f20926a1194a72df0e1b1b34456a2133112d006722fe811d5e40c4121159ded88990c0ac2bfd34f35af4f07cc402e9a381a675d03fec7ec438c4ad9d929aec8f242def023c993c9e8ba18c7428e88fde68a4711e506d7969f63c8e0bc83ff0de4e1336106c05e09d5922400e8a81bf54885667899785882b70f20dd8fb1e75f5855b765a256da4341bf23ea0ffa18aadda381816946001045669c8d04df0 SIG = 7a44e6a31932dee6dc2d8394e29a6551d13e6c6ffdfa218fa5b998668d8439db5e05379fbfa0da5b563ed966435ae2c54e3ad16e1a9fca1f5a157a080704ab03 SEED = bea445e9b6d3f21235912cd6c42ec0577297ca20a10357880c2b846dd8e2cc77 PUB = 024174966221699ea4b0a37e517ff9b16598ae4d4e83bfa3ca50bc616841f595 MESSAGE = 4743c7c099ab815927b3674d0054b6de59af2811abc2cf7fde08f62929185adc238fadd5e75ae3ba0036ff565a79405b424f6552331e2789d9709ac1ecbd839aa1e91c854817597958cc4bd91d07377507c2c8d3c006cfeb6c0a6c5a50eee115e21153dd198ea0a3aff62b7075d5a461788783f050e659c572963d7a59e5afaa2b9c501f43c6ac08ab4797c4566d22b93cdf65a99a2a1d638e79f72b5f4631fe5e9e5f968f6db7a1880df51d8febc14942672f8ea6fc3a72814a44d66d148420a69000f68c330de5b80fc6 SIG = 6964b9c5903e74e99328acef036558eecd3369150a52e2cbad4bbb97d461b3dfc6b3e8455813a4f4bdca46302e02e683ecea1820171c538e54c3de6c954aa407 SEED = 6447540ed7be0a11c2a8de793d83c6e244983db18d78ec9d75f1729c92e0fdf1 PUB = 391212c8edc4d334a5bec860ef0f5ebb5ec44e8bb51c0f6741998959b2b379fc MESSAGE = a4381c7638c48799e9b5c43f67fc3aa3cbb5ec4234f37e70ccccced1627a57683d1e53f4e0883d8b462bf83f1308630368c89b491533ddb8c9a5b9e8155002fdd581a9a5be0e430b9086a6beac4720210f87b14e862d97e5cc69286786a7586723f231ef0e3e1b932dbba3a18a0cb221cb07f80e6a8e1300056c13e702b23bfb3250ec7cc864d5c7ec5786240709c56024ea6be5f7b15a4fa5555e39a744a1dc557df5b948db220b3d5745746691dacb4421641cdcc12e7ec0450293f19ec57b09cff135847aabe446a61332 SIG = 3ab5f88e2f7276b5b6583dffba5639993a905dbf9b88ceeaaaae3335800e4a5f10f83da6d6225a8dbe99ae80075009dd508786b3975113db478e14ba101bee0f SEED = 0c587a811add88b994458c3c808ac4e3a83afab26d4cff5c961b9df0b5c83344 PUB = 06783b0cdcc5028c5638bd748f0bc76f7e94d1aa2015ca948738a3500460aca0 MESSAGE = f56dc6b76076325b2126ed11d1f09decef9d15c31d0e90cdb1a27e089cc56329f6ec3f665eb6739ec5678b3f37ee1fb37deb9e240092b7a88fd25525acd55e294eb1046f9b1b69a847eb9ceb7b1593b9f6978ef618c15de4e059ecc3bfda3297a19c2df202adf72155cf21eabd03948df15198e8a68b0884f93ad5e36eb0983cca30e45a8b4b5fb8136fdea8a3341dd7877540a557debf7530cc33aeeef6271c3f0af6d09787e815f2f1dd25ce4d2fd09ffa9f53081b469c500da4d44180c04eb1869329cbf2d823187e831c24 SIG = 33b4f4274f20008a721d1e8d054a2b4e95327e38bb07b33c4bee7e1ce020a442fb2627eda3b7ac93cd3ab0b12b99935a1a9233111604da4acffb5315b907120b SEED = 66cf401a2142fcf4a8018046cf4140bca18d76ef6266e7a024757df172a5d653 PUB = 67d48dfd23743cc2ca40e4dfd6b8cc5d84be82dd2b1120cc476e6af6f25ecc98 MESSAGE = daa8efb3fd41f12fbc55bd60464157a26d718632d882aedb6bf98e47dd2337879e0b46452e062e6dfbff3e7bca7289e4ef6b3f41d4b03bdc2c842afe97f3029883ed45f6054dde9690649abb2b8dc28f5fe8cecf80fc1ea411bfc40bbf4fd20b218cf47ea8ee118d4d5aefa5c1bfa08a8fb1b30d6de0977cd15e50292c501f2e71ce2740ff828b8432da5a594bab5223760b64792ed3a69dd75e2829234943656513df1a17a2a067a9a8eaa64e19569f46939d34b99271ae50a47d7dbca3620c81255b0e1fd1f3cec851f1b11b35 SIG = d6b0e80e60bc1b29ab8f74808fc460847795ccb887bac0ecaa8e135297a85097712b24b0a1fbaf7a67c5d530a47d0643fc8702c059d215fb112dbe475e5bca0d SEED = 5dbf885aa598e895571f5f65090b72323e9d70b0f58110687afbbc383afedcac PUB = fa17eba76e3bc3ea6dab3a5b120dc5ecb9ae6f00138f7d36dda9268bc4722174 MESSAGE = 1e0b6cf15ce03337179c02d65408df5be9200c3782b6004af94ea4decb257999d6fdff301d11d00c98c372fac0d026cb56dfefe3def7eb99ac68d6968e17124d8446f53e8d2d3dd890d37a23c7e0b83a484b3c93bddf6c118e0281959d27bd87d37e843d5785f4a40771398494e6c4322fbb675c1d479321032148f7fe52564ddf7ae7ac269d0cd2e552fec589aeae0fb93fe3eeaef0856096cf4f6b3497e7235cc8494d810a0b46c5eac87f187e505bb7764f8045c9541983f7b025698009a23d9df0bd1a473cbee4cf5e9488ecbc SIG = e1429dab2e42cd035b7fc602efd6baf94706f16eaf2f8b5fed329239e875605fb172f5dd9ae2bc2eb42eb474567e292f5206e82e694bca0d6d433b867634cb0d SEED = 84b3aedd4797a565c351de7dfa0700b9ff7c4d7291c8808d8a8ae505cdd22590 PUB = d7ad72caa7c22209ec4678d11d5590a6cb28a07117fe5aef57b50751583201a5 MESSAGE = 532567ffa53b5c0fcd29c39499d2e78ecd20e63123499240e775088b394dc65c8baaa0fe8f6aa7e70181f9e10add8b4a8beb0b2ec38a43309f100cd4be91c6f48e79dc0aee93a15c9403773b354a8d42ed48d8f276230fa6de5ada501ee0a653b4458f0ecf6d5b3c33e2141c662f6ea055f741e54586917d2e0c4eb2b56621f9665fef3246f0bd800b533e3bc615c4021f8d0e2ad233a11e7736c493acc31faee76a097dc40db9efc22446eacf1cc18f51fd10236a2f942d0a53c3ce209108b5938c0a9e536b89ef0ad6b405a10f22c3 SIG = 9220f0edaaaee1b876350dbe9266061767b86296c351d4cac99d07cd612c6efb24f8f9b0b975f95c42c5b6afedc892f87efedd39d5160294c27658bdcf42850b SEED = 6950bfcf480b98ea18a2d5ae5ba6e7668f4c283ff2711357740ffe32cf25819a PUB = 8e4c6f233f7b86321c9d6799bac28aafcd2503d7aa0a7bded8722727fbbcaeb8 MESSAGE = a401b922aba57ee0c6ac1c8f1b48296a8562eef137526893886a08306e2203667788618b939864467a31f16edce152a42c25546b640ea8bed189a4f89886a37f106911eae1f50081bf795e70c6504437d2a80cb839479ecbb87c129bcc5fe31d716ef978c206d7f08a793466594f4d75e215bb6374596f8e7d00eea724780943e89bd3863c951bbd24efee23c97c2c797c7fafbf8f2c8b43f37a5f881129a09573fa7a034a285e80dc4ba4bc9564a4dcedeb33167e0b30c5a00b9a109a2231cfa0012b29b2b3450b892eccef0808e503f8 SIG = 94de5df7a25ecd70205d40bc9499fc7cd7136568060a419a93be6e318664bb6dfce60e2d4e633f7ec148fe4f834ed277c1fec4c4e2a86f44c4589c817888db00 SEED = 61b260f5b848b271ef48e5a56d297432d89f2ab85bd538fa668870d0560220e5 PUB = 6086fe8735f399f1af2e395e0fdfb5629ebcb04b6ed4a54a9e47052c6e8191d4 MESSAGE = 2826295d79945f675476bc4d45ef800d80b1f0398e4be60e3de4571ed108df989f032de6c2345d9948d677927ea0b8cf1a5ca36fd5f23c25dc0d2ab5bd565a54af46fd97d338d770e3a7b47efb54c07a1664707771eb4e37d9d70ba779251dcdcd3bf6d1248adec53f787259c4d594d5fd4ced8e3db7621d4965d48298178124931a3d0cd269b2d53b7cd261b96d370c5d9693c8ad133ed58945ee3540e10625d924aeba9bdafc656100aab276fa996b1db477bf85ea559081d5b4c7307dc1595654aca82f7b6d2ddaf7357c15a4d7d8b908 SIG = 9828fec8ff5cf85a98f450770b5bdb4b80daca44379d8f53c91c348e22df64ac48f2b6e2a7b3b642bc8193a194316229e69447ed241cd423d83b6fe7b2d44b00 SEED = 936dc1cef6a310747f350088055a39aa762d9a4b52c8c8e4c682794380c2725c PUB = 03b31800412df4d56f1532c05828c0b72528a67a781bef4c06c1fb6ff2ce324b MESSAGE = eb58fe86c4ef349c29ae6fb04f10850e38c6823dbe64a09a5bf1e0ce600d394efa6fb96ed6a8f2c9d4bec05e6a5ebd5a1bf4d0c51db934e57b79e5c6a879d975197dbb10475f65c7f8a8c6a77a420384b5062a2740f1401740ee0f5e043aad7a2a2b4260c5d907f705edaf65b0e375dfc7b00bd660db6147f2ebe870a0ee18dc2ba3c92b0b76fae2b90932cdb6c149e46f3feecf4c26f0441f3a9e006678aecff8ccaecaeda73a18a68ac988b62e83a9bb5188aede38df77a9a164abbdd9d58e52a6caf7222389f198e85fbf966236dcdbd4c1 SIG = 3f994b8ef528f6421c6a6a22e977ade5cee887263de38b719acd12d469bfd8c3f68e7ac07d2fae80a2092778df0b463537ad3a0551997a3d5b51f832d9c8230b SEED = f89eed09dec551361fa46f375973d4fbfa5c5c12f1b5e5abf45cfa05ff31a340 PUB = 3e0efdca3919fa10d4a849cef1de428851bd08efd248594fd89cdeb9deee43b0 MESSAGE = 4cf9773da05fd322fc147be900ef5cf256c88afdad4b08c230dfc8981fb69f476f7d45ef7c9006bc10032ba53436ac22843e0d76289cf68f9818fa64031d4b40955059aa69110915889f5e22732a1343912581ab3b11a3bae7a471359508596575f888160beef966e5708f0e3147eacfcec1caa3ef240c5e0a14c186546c8eeb64658350b1affc0cfd2ac213af670afca7bbc9dddd28a465b586e69c388cd73478d68efb322bdf86d9213011e711b2b95fefa7bb9b5939761706aa7121024906420bddf1d8800a4338d938fa137cf27e9ffc51c6 SIG = 897e6f2797c3f326d2cdb1d2673d360631f063304580ff5b4eb43d39ad6851834c9cf891d9f0905bf8de075f7635dfca601adc0f14e7b2c76f7571bfa468ed0c SEED = 400796ef60c5cf4084dee1801c4a1975e482e70aef961cd42e2fd5a3fa1a0fbe PUB = f47da38128f2d012cc5797571d479c83e7d8a3409802f9a7d976c27067cbbe43 MESSAGE = c473325e785b27df4471eefb9ebebd6461d570800181100ff36caf3c38f67c1921b157ec8e6126f955aebd90ea3fe5385f8042cd704b27cc1d6978c0e2a296695f5ef97b7c2e16ae4ff4d063c688d7f46e964e1f0a00503f357345977683d6e4c3423d56bdb6ce864b6987e085e83e70c7c1a14e0e413f592a72a71e017d505b64c24f1a1a6b813e064e6e0cf8bd4571d0ff2f267a6a13e0cd430463b6ca3b88f0cd40b0fb83d5bedf6f7d47e170e87d0a750093693eda232a6daf98125727b9588ecb894ae373bae3a445a106306469a4c2cd77ff SIG = 84d3aa3f361844396754d80d9fa05b8b2fa4abf3a0f36b639bee9cfb5c8530a3a9cc34677f92a913c41e800f2e8041f7666d07ed85f16a57d817b1241fc5ee04 SEED = 6703a6232c5e2e65e0ab3b92e2aaf9f5fbd33fb46988047d6f4d0ff5387fa029 PUB = 047cffca8b7b11ac6eacc0eaa0c5b73c75b9c637956973af9d97b2dd5b605d6f MESSAGE = a26b30a769197932a3a62854968d760151612366778dc994576a2e0e0355496b46200e506948a0d102b6651b2e7334ca6c6eaef8bca44b425970a0b37d6bde0da9d3c1b9f51cbb25bc335cd6fa928a74f2c0dc2c6e99d37a12863a474d4df43aad35415ffcaa24d8c29f914572ab2abec3892db49e679c5ea220c2f519a7d033ac1a2c5a467869e30eda3d2635ca863431473f958d552bdc5582352c290d0ce4fa9cfd0ad42799c227ec90b7c9e5db9f5a7b6d569212eed94d323326805f2b3a0010d6c11eb4107c8283037652f50dc067b6dc81f4db SIG = cae96879e5b603be866609d4a053bfa12a51378e99b2a2812e4789267d8f32f473243f8af74b9be73f47dea50f0d165ebf49458b73e53d88580c191a182d1904 SEED = e0e72f8f178633626733bcbda2ad2a50e653890f15359b6c22fc7345ad333109 PUB = d13cee540d84b5667d516fe7ec7239bf8da91546ee791f84edd8ffcf3a083e76 MESSAGE = 791fd613c1095292c8a4a2c86b47ae026155b8465b607dbb416477ef79a297c9d7758ce34af9dcbf1c68474f30909fbe74b7ba429632f2403aad832b486b72c23054ad42f7653a9ddb456cc791f348886a7ae5dcec7c0ba815f7a93a10fe331e903b970f7b5028be49d14bc5620d63792672b98b9488c67ae16646693e112047f0ac8921ff561c92dd0596d32df0a6e507ac1b07de516c98428d570a37db9bcd7c7e61c6948ab3fe91250dd1d5bd671275df9a972f22c2ba36804747aec1ea2416c1f41ab87befde31629b2d43317ce41cda03626286c0 SIG = 14552171b95245ac0f0e5a6e7a2f541721068db650c6dada04c28cab7c49195f6436712144cb31913c562e30c39d8a8549fb64ffea81c7445143b5f23286da05 SEED = 544dafd9960d829756c6d4b3eadd44375fe78051876bf978a381b0decaaa8096 PUB = ae4f6425c1b67ccb77f9aacfea28eaef769c8cacee035205cdcd787e8d07629d MESSAGE = 447fe7344cad1fae09d6a7d05f09d503c1b3d3d5dfa584810c35bc41e4955693706154e2d751b2f1b525e1a14547ba7f8b232088a6fc922702d93a11cd82949c27bed645dc351fb4c1242cf41d01575412e792aed214531d94fd66e03dd32e972fd77f6947a353e1ae5e00f5a6ca77992472f096b6e7475fe534e913a77bcb0d681fdfb3a7a0dcb56d274df4aa109d4a8a37794a9276f50006696ff12ca4d0254039df0fb3f72a960da05c9872f2e33ee81d1cf7a6f48bbce0aa18c7c0f06ba55e67689e0af587b500eab79cc7f9640bca104b7fbf31f08e SIG = a2ae117c8de4ca6d6fe75e466023bd550c26fedd3e74ca13adb625f272e175f14d5df550ace7d82288efefabf96311a123bee23889ad3711bff2b8087946bf0e SEED = bfbcd867027a199978d53e359d70318fc78c7cc7bb5c7996ba797c8554f3f0f0 PUB = 7c5ae3bab9201199dfbe74b7d1ec157125bdbaa4520f501da3f248579dc6c22d MESSAGE = 117fae13e78777b6219f020214c1b87c57046d1c09ce82ee2b5629898d9b0de74a15cfe99f80548ba913d7036c56285a4cba493b52d2cb70d6365ace3da12b1f34a2778af36ef52ab82ede04cacaf2793f5f89831e3b205a9ee4c1d6fbdab4ba4d9fae65dd79a5fe76b4b39a3092cc7148d211e85ee82ab463d34dcee9061d9c21ded2051bbd50b413f0e21a0e48d1ffa8dcae240b3495be25d93151b57aa271ab99aa708ca28080cab4804fcefa929f5f1ef3f4c6c0fbfb40bef7ea1b509b36ba1260323512379d7bc3fdbb5d3faac9b00e21f12ea1ca2e29 SIG = e48615b65633e61993b0aaa1fafb74b9629c384fd592bd735fa1f62c5cad11291fcd8c2e91a50bfe0b03b43502fff3a5c382b9c2821907efc34da5ba054af00e SEED = df2df8a9d66d5638cdee09324e7b10f8ed29ab91387e3147b7dc03f7cd800508 PUB = 5c042e157fb7fb12d4d4fef2847141ecfb57c1253e14eaf3004d6513f52fe625 MESSAGE = 21576615c9346a63dccf0c50ecbd7c6d72ad452cfed43ea73202cc7a98576056b9664b54622905a1e7221720730ac685d3bd3977ec3959d446bfa941e725b6fe16afe5432c4b4bdee7aa0fd8030948ed6fcba7c0bdb40c2e517da97456e74e1f93d5ed676de0f4a8b0aea449404bd15b6da79dc1b813965fe5572410d76f5b5eac663050570311dc9842b6fbf8806aec03151715cacf7f21802e8bf5e98a89c0d7d0d098b73c6efc09962e36b4e030c1a64b5d349f5f2042c74428671e4a2c7fea0caee2422d85c4fcddfed32213859a69955d4e3ebb7e1b2022 SIG = 9a1074531ed43d07bffc7f2b6c13b8838fc75cba02c7d1ec7ba38bca3cef20dc9badf3a3064a2c93b1842441420b6a8d421a960d70dfb7c70eec295f21f83f0a SEED = e8ee065f9907f1efa2daecb23a0425f353094da02bc2c931f0a587efc0d13de1 PUB = c72651b7fb7ac0337a172977496fd7f2a72aea889385835e563c6b6053a32dc1 MESSAGE = a2f0c1373473a305d8f1d99138b06b9a9694ffaa8a88222de9f729bee1305175dfb17001cc77f67b6d40c90c1a28fb226c11286db4a13e45e69211242bcdd01cb6e2c454e76c0cab881b4d2d9d3ab100a5d61d1725d866e4fdb66d93d77f5b308693b9b5a333e57fa25d1e5d2e38df6e4e9ec84159bbee1ffea926836a0101c91483bd5bc88a6f1cc4d4e7f008ad08453a0123429dd335781c7cbf8d685a8999ed1177607004a13c4cb5ea4908c542607d3f2cd6690cf1f2a7455bbd38f538f07a103964317efbcee37eb46931c027cf153ef86e43d78281ebd710 SIG = a510dff42d4559a19a7bf0fe0bea53d3e1f22dfa6be55039895e12a5d07da5f2e37713ccb2eb216011628f6983f871fee286e66fff4be7582c961a1ed7568404 SEED = c72e67d8c3fec004ff618718a9099eb8ad7b06ff3b8c542a7e8b9847313475e1 PUB = 4eb002d3cceb188c6658fec51cb479a65264ac555c75cdc2249cf1ce3defc16d MESSAGE = a8f34135c0132ec95b64b0cbf51d66900143370406791fbb55f2b8ca953cc74a46e08b002fa2da21b951b8871f7a29bc6d38790afc66a329c397d9f9250bae0e30ae3426e08d8ead0179a3b313c908839192f289a3f3b6e960b4c5cebef0a09daa9c7a15c19d4ebc6fc2ac3cd02232e832b234edd7965d687bfeb758f70fa7963841b7859bb97c971bd557bc8769524ac4c6eeb3579793334b522d176bc62f86b4d5c0d4017036d2b6bd4e4384416ef8263139691a8606170d73c93d6417dcc1a08a537c9ed4400471a46f52907b46b10a8b6889dbb4647a8bbc7149 SIG = 2d7bab8ebda7fca5bb3c25f51dc51b73e6ff6a3bb1b52acc7811a7d2595cd6fdaf730494418e2f57efdc5617b066fd7b6207680d94fb8c43d3d4740b41cb6901 SEED = 696450b557ec3c94cf1af1326475634aa81def3814ff30a02ba7f2044b59c0fe PUB = 8584773c566b0eed3f43281705b575a434e47d6cf6b251b89803fef53534cb29 MESSAGE = cc257829f30a5f90dfdbc247d42e388738b76c41ef8a82a5e0225ddf1e386d77080b3b9df86c54b85cdf2c32f367aba0c3b6bf888a5a6903529b6aeb4d5407a10180149114130228fc4356ccf366b77be89796a9e71a0c693f31e584a4f143097ba370363b67b2f2e2fd8d6fe8b4e8dbf0d7dcc1a8360041158aa2aff7e2a325b8e518f193a28bae05e3d52b26621af402026d7f250e86dcee301a58b631eadf4527e958f02a61587f0bb516cefac009fe51052fff53336dbd94e7266d3b43caba8a1b38e5d871c2a24a4c412fff3f7a9a52a8ab23bac9791b2b5a669a SIG = ce8b0a5779f4f5f401e84d65927a0c28df829e95d09bfa97111b8700078ff894cf7277e34a716144d55306fc9e2f64cd287583cc8003be0e8faf26af7640140e SEED = a8dd35f054fb6ff6f0ab094a0d3d1c262832181df35ccd5192545ebd6a9cf529 PUB = ca412338d3814b886d964b71925e1aabb3ffd07834dbe7dc512568882b53e4a3 MESSAGE = 55a7ad9132d63ac161e7adb132b9189fdd84c361c1e4f5419a6df73df4d7aeb29a8dc4bf01490d4f484e2d12077517f5fc7ad0bdeda20a6cb0227942290b08c3fe33ab9b2135bc38a6579a54bd982f7d1417ce867117aea918dbd3dd476e7eb5b5d3c3e48a864a2f942a31501aa2b29b53b80513c95d6a411844f0dedf16a29ac267d331e53bdc2539bfcf32dc9b5d640f1231e2cafb0ae94bb5189426863364262efb47b5b5ccdbbc93324216a799b6f50d3704f15ed59af6cc7d910cf062d1be632dca5df213d487d8564f2b2bd7d818bba27c364013d92d7f72625462 SIG = fa709fbc8382af83d11812618dfaca452eab83e4c53fe9e5858467d07b6767e17975c1e06393d6dde15a34d9473d1cf4d6d8c2d57394520080fac4e43448be07 SEED = ae1d2c6b171be24c2e413d364dcda97fa476aaf9123d3366b0be03a142fe6e7d PUB = d437f57542c681dd543487408ec7a44bd42a5fd545ce2f4c8297d67bb0b3aa7b MESSAGE = 9e6c2fc76e30f17cd8b498845da44f22d55bec150c6130b411c6339d14b39969ab1033be687569a991a06f70b2a8a6931a777b0e4be6723cd75e5aa7532813ef50b3d37271640fa2fb287c0355257641ea935c851c0b6ac68be72c88dfc5856fb53543fb377b0dbf64808afcc4274aa456855ad28f61267a419bc72166b9ca73cd3bb79bf7dd259baa75911440974b68e8ba95a78cbbe1cb6ad807a33a1cce2f406ff7bcbd058b44a311b38ab4d4e61416c4a74d883d6a6a794abd9cf1c039028bf1b20e3d4990aae86f32bf06cd8349a7a884cce0165e36a0640e987b9d51 SIG = 909008f3fcfff43988aee1314b15b1822caaa8dab120bd452af494e08335b44a94c313c4b145eadd5166eaac034e29b7e6ac7941d5961fc49d260e1c4820b00e SEED = 0265a7944baccfebf417b87ae1e6df2ff2a544ffb58225a08e092be03f026097 PUB = 63d327615ea0139be0740b618aff1acfa818d4b0c2cfeaf0da93cdd5245fb5a9 MESSAGE = 874ed712a2c41c26a2d9527c55233fde0a4ffb86af8e8a1dd0a820502c5a26932bf87ee0de72a8874ef2eebf83384d443f7a5f46a1233b4fb514a2469981824894f325bf86aa0fe1217153d40f3556c43a8ea9269444e149fb70e9415ae0766c565d93d1d6368f9a23a0ad76f9a09dbf79634aa97178677734d04ef1a5b3f87ce1ee9fc5a9ac4e7a72c9d7d31ec89e28a845d2e1103c15d6410ce3c723b0cc2209f698aa9fa288bbbecfd9e5f89cdcb09d3c215feb47a58b71ea70e2abead67f1b08ea6f561fb93ef05232eedabfc1c7702ab039bc465cf57e207f1093fc8208 SIG = b6c445b7eddca5935c61708d44ea5906bd19cc54224eae3c8e46ce99f5cbbd341f26623938f5fe04070b1b02e71fbb7c78a90c0dda66cb143fab02e6a0bae306 SEED = 6bce4dfd53bfa5506f2f554d2d994a0dc40cafcdec7e1be050006e5c5a4b38a1 PUB = c890023728d8397070291771e65e034d34d4aae5e247653e4ff4c074591da702 MESSAGE = 3239190747ee33d40bf870ac9ad49d88ee320f63c05257e8ab2c60306597ce76d1f1e792ab6a65caa544fbec20892fd4960594f31b3763ef07d4982eae4a2dbf3377dcc1e3f95e46ed39b7f0222f04bb5c3b434c8f9f310de9f122a29f8241e81e206549ae628d2b8ad768972c98847c1188ad04c835356378bef79cd126869405b129fdbdc3bc489cbd1399505dadef7617b5be5da173d3e80e5838c99e349276242729e0219bd7476ae5c4f81a12878fb483a6c0e9b0df2962eb0bf00157782cf768a1b71c010169ee8522def0024ad7e45775a290639c53aaf48198c42de75c SIG = 99ae6782ff27646c27f61e23636ae1881521cfa5ed256f70bce7ce00b68280ce8e0c82aa765afb8b5a1ff2fe42c57441e458e443dc8b123477ae33d884888c0b SEED = 17861a8d4154acd4fa9c8fc947c1886c11290be222872ff4f8cd25939e4d1361 PUB = 43773f4449065eaebaf8937baf758560b0c4d2de46977839b3b873d5d7d5fd8f MESSAGE = 184df5ea3215ebe180390b0ff042ba2381155a038dc732f76a01c7e70f82d1ccc9de9a0596b3fee447209c992684f643df21f4cf9d179262790e8623e42472dc351997e6da189c07e1e8882c07f86c6337ec0113912cf92215c8de1982b8fc57bfabc55a3e8736f73610429d97feb51d794f505d0c5a0b3abd48ef7f55a628f90b8567a1c15ea9d190d7bf4ec2bc9334ada6cb92808dfc2064836fcfa46b96fd7a5d6f4b054dab09b73595feb89ed005b9ec9d3188121de69696d64e7c7bbdfc1c469faf148c38a7785970afe1acd06a92c99478fe44974e3bb2095e4467e9b2e996 SIG = a5ee024ccdbdd4c21a24709ec53dccb7ee17626dd00a093d0884f5b45c4c9d1691840151c33c8aa07b69b34e16f61647ebe793ae4daa70cff48e6ab42ffdbc00 SEED = 0a84baa54f11cf17090fec61f3f9401508a3a03887aca1a7939394b1ee40a925 PUB = 309a73c62d23d740f2e93c18587ac15e7ec480d25ac0794e10f8cd461cc2b130 MESSAGE = fe70017b14678b0d3ad03e183d6f53314378379ab3da65b3511257b3d54086e86f2031139021391af9d72085ff7c3dc8c1e2d91e53333855423d0f785e2cc5f8b7799fcf1b70e6becb788e53e9020f2995ddb0c383a1f81038fc3d543ce0a38c9c288a9bc4077f4277dcc6c5642263fcfe19688005a603f57675d2434f3ed1f46d32f14eaeb073e83ee7086da2fb67659d3fb68c62320b7727b3b8ea006576bc2c7e6b5f1ecefa8b92e70c92c88951d0c12d91de801c38b7ca5a0a04b4c3429aba86386e96e06afd20d4c5c2fe2b9b4273eb05201a79273abdbeb37ed1830d226b6bdb SIG = 4d870bd53af8f13f214d9934ec903ac48284092cd9b162a44ccec851fa942de715ccda07b7991d712723e7a4d5b4f0374ab85ac3867e0b53ebc46b530f9fed05 SEED = 38379423dafdbf25e19d7231bddd80b4cefcfe2aed932584dfa0cc3c9f9232de PUB = 597e81dcee9448b77de6829e7921c8a390535d89a0849430aed66364ee140d8b MESSAGE = 36125ca66668802906237e63a2fe5ae610f11a7cf92520d19e6690a3adfafd5d07a784bc1a0e185273d11d340d5eff901597dedf450c4699d43f3fb168d557f6c9c03077c3cdc370d34832ccdf2a8e3d75796490ed0242899d25ddf44bfc66f329cf4c45168703c31bc9202d890f3969ffd3ac35a12818dca751ceb8808fe81efa26a5e0d200c5ec1d94a5097ea74b6498fe288f30c48d727e9d3d35c8e12d85420702556f2861484ffd09b4f12265cc9abafeb82cf590028895a7d050ff57ccf5f28022d016ab4094b062e48b66fd36d1e19626e5215efa40fb7e3b7062f81e954830c9 SIG = d8b50a88aed6f2a96d082213adf8b2519f6a0bbd30dd3cb0f3fd3ce1c643fc029946cd43462ed22513f1d65fca24bde3818166baa86daa798792afafe0c1a10a SEED = f925d274aaf1fe1a21656237385e97f7783e78090c5d4217fece7057c80f426d PUB = 3b0fc370be3a4b19a88ab998c59504ffb59a87606338e673df5b3fab4d9bfb8d MESSAGE = 143caafa5f62b13e43dffa49d420fa99f771b1926d40d6cb2bbb427f27b6c266eb3deb2d8bbbd47b8214ad40251cb1907ad65eb94193e54ad85c6700b4189e80f1cc0154c63ed151a8bbbd30e01637ca58e70aa3ee52ef75d0873078a405014f786eb2d77b7f4422f927823e475e05b24245f9068a67f14f4f3cfb1eb30bfede7b3262230ced9e31361db19636b2c12fdf1b9c14510acd5bc18c0ddf7635e003503e6f71e1c365cdfb4c65ee75b4de0694af87076374d631e6c4b8e240fa51dab5e1f80ca2a06c49f42ea09e0475defb184d9cde9f58f959e64092aac8f2027e468126f2fb SIG = 79549a317d10a0be322a94a151ad11e77efc4836cc8006a85081273d7602a638963a9caf19c3edf1e25fad1e9d68701a71dea727da6a5c5bcac9339589224b05 SEED = 971f806be6f07d41be8830ff8dae704b08638ad6cff722d8432538127b769625 PUB = af6ac98dce2078a6c73f6097bab63f205caf6953afa284d042bd50a4fce96cb4 MESSAGE = 013455d049aa54ed995fbd94e6369955495395e4438822259b1060e9a34779042a1a69211f6ea2077399dd234806ba0b353cd79a57e1c49b250ab27106dcde576ecfa115eae461febb12d2da25ffcf17b715f8d95c2f0c425d5a81f700115b70d49e1cfe49fcaa14fa205e28ec85247f1a6e7128bf3bb3060dc08464bda6538540d0ac472093e5a0720fde2f3dc4788e0e9b0dbfe2a2b5f1a0f3f80de984025b15c65af77f671e1c5e2840444de5c7eda025e6dc1a3ff16e26cc54cdeed56be73f9b01ab2b1bc16c8ef58a5b76dd47287807e5c50f0d7c0a5b8120dfde645a012c5cf11491bc SIG = 2037a0a7674b84ff27d0b22f62b4bac65e2dc0f5fdc899feb7800f25c29981dee641c5a50f8b9410970b49d2d53658c89ee16961dccf5391a6918f2a84eada0b SEED = 2bb0652f8fff6901991148c68a3267877271006ae9589149bb206850cdf52fb0 PUB = c03b77be983e74a234c1986496b292e139992eb7529e70b3afad7ae4fdcf8a66 MESSAGE = b923ca67e396d8656fa3dbce8289a38bd3c128cefb30efc1862bb944b4507805419824ce2b83d690ef4cf107492817143bf64c024989af1a7d2e1f5ac97874f86bb0d3773ff840f514d9a1394a3959b011d3a6b816a3fae5de17b2a9ff349863d27fbbb50cca734108751000d6358ca0647a93eb49e2e7af06287d48f2c09d5c1c73e4d8f77ea2bcaa7356795b26728719bed5ffdb821578bd5d66bf92edaf8b238b2bbd7d1e2c30a787f901a33d0a76669a9c3c7f2b552ccb8349c7ded5e1a46170cf28e359e2fdd54b05a562f528c68a56974df82d466637c8e53246a7217e4386801e0e3266 SIG = 4e158deaaec3d88941296af2d27341012b0241d4e0f46e435e375c9875e89f5e32c057b527bc3411af096a77bfceb45b983efe455e3f03155d6bc7b0acc8e60c SEED = db9b812cb3c7c03b977f487d3d65ccd9cd2f3dee11602067dbfb72b589ff3f79 PUB = ffa038ad8c3b378ce75d65844d08e3d6a92d194a1b7862e9d9720d20679b2944 MESSAGE = a70092c7697cd4a209567c38ba7fb71aa8f15e5827a20876923943fd6adc659c9867ac6f58a61dc7cec3d362411682000c1a9ad1295eb8b70f242d86b5865eb76b87e3f2c6941d2612ee3bcde8f19765566733152ef54e95690943285f78b375f4036585d4739deedeef6d946db61ca458ef4f650da963c385e29dfdee415fe495845f55197a870f8cdeb5a010ba6bbb32bf1a588cc774d4890184c4b2924a5b8073313bce226585f1adfc229c90bc6cc9d212e62f05d33bedac961d77cf8c2620e451de817f8c1bb16a2c59ff804b635a73a8cf8c181b3f9401c3b643d18a2f706ea9cae47071a6 SIG = a628a77421b2abab576eed35d2ee3d14561b21fa14a6e2fac263c3eadd79f2fc0669f9429b910b8422b4b29ac026a42e98d181be3507c5ed7c748a1fdcf1d807 SEED = ce379bbe2fa8abcba51c7a7543de5b7180771b3c44bc6b41892e7b88979bab90 PUB = 7f3cff89f41babf4fa64cba33a5bb17f413bbf2a1e112b50a8e9b1f821d849bf MESSAGE = 001a74f095c814d3beed67a8d15fc18efe235dc3f6457812a4039b7a46fe9a0e9de81a7a4e5fbab5ebe9e1e4801bd11b45c9f7ad0636a09bff42164be5749a04c02f0ab61f0ecfdfef799b827da6a274c8d3b39f2e3805a6791287eedb2314d3f842b558b9b489afe1ed37bbbcfc5e60a431d5ac60b39e946d903d6bf6b140e12c7e07f9ed7ac46a3999c6245c8ab1bdb21879a317a3dcd257a5c4f349b7f59e4e43d62d9f1cd16f518f1ca6cad37e2cb20f2598c4134291c6b8a98aae5247e26eefb76aa38c9c8231c17e9dbf271cec80fba5b4a834bd9be81ea841637aa9cdd4c4bf26d7ad24ca3c SIG = da98dfb189385b2c853b6cf375738046a8f27ef27974abcecea1db02989b951fe433a6ce1e225b3fa82032fe060a7d3f6c183fd1157f791a064b407650571600 SEED = 2b2ee809d647023e7b77fc541f44875a35fa941d37f7c5b21fd34934d2391935 PUB = 2c29d53e1bf2c7879d73d20ba88ca07a0b216d7f6d05d93663a65c3d9e10633a MESSAGE = c4147d64ebfda41a1be5977262958104e940c3876bcd5b6956acfdec32c660914d62623c210663cb2cbe6249d7f5274991c60e950e8e2809049953c69581d2469f4fe982c7434fedd9d4e00ae08896d62cc1fb984dd233150cc2483e159cff4097df8c036bb633003abbfbe18c8fa79b5a22270838123fc9be39b8892c80384a385028c1a81ec58c8f21060e78afd2c04bfd2d30ca3977c6edad518cc1e2004cdc14bf3d15f5f528e5af277fa182275870e5c012f5f82fb1afd04edde4578ddd2160a1a3dbc050e80bdd811bc88ead79bf93f010cd0fd4433d0bc348dacfd0947cceda62bfa49711d013 SIG = 12d90685775572c9eabc9be2574ca9ae66f0e652e578b21736cd6e654f7c6b1545883d56bf760ccfc3cf87544e0004c798061257e130030cb997a788369a9a05 SEED = 4ea18d6b4af8053b885ec188be48deb86ffb2a69a4cec86637bbd7b41b807c46 PUB = e5986059976233ed77382c3d9959f34e317962696553e86ed1e5902c4bedd167 MESSAGE = e9c89a1a1119373206ce40ede3b89a82f89462a1dee9e789e9845eec21f571c0faefd430ad338e4a72c047a39a4259580387fb9aacaddc36a2b51e7b60a87ca1321ff806794cd6dd4549a4df45c2dae3e539c4d7d06b6e6e9f466ffca2fa4978ce3dc792e44a6283880cd138a75a226f985da41ffdc0e32a5a85c85fe9a43ae78fcfe57f4dd7540a6dd3924a49ab39eb69950d421151d96b1e4fd3935890f634cd52a73a755f5c2fb72f9cd5a2e67ea930915e133b47cf6b7c10a9d889c6af6b5f1f4f51094d27fbba228ac2268b344027fd49e426343cc0134399b4b510aaea50234df42c37fa1c4f4d0e SIG = 27570c002a487d000ca3928b83cb4319722c46dfb4cca260de790ec0e3c1932688f87362952818b54f51bc7aeeb263f960bc0da8964bf312ef93e81f06c80b04 SEED = fc1b75d17d3807217351d2aa40d9b04f525b89ed3f5fcdb311bec2aec5cb7ece PUB = 55e484e774a4392a9d6eeff835a8fbb232cf6276a89c74fc0d1bb2045a8b21be MESSAGE = d031bd11da308097e3beb6ffdb2600ee6a193ca6d8324501c972b1a25166fa7a369f5bc882ea45612cf02580254d21b40b0363237e835dae2656c1b7f4736e88be53d6b119c07f5729bbd82f67de03588322879243c5990a7e61f56907b24171a57cbb0bbefba2316277af9326f9cbf3538bcbf6780be41825a2ca774b41bdb1cd5c608851ec2339eb2f4feeddaa891a6326b29d97d7fbf311e3bb749c5d4c058dcc14f452f9334991e271c16d6508c818633927f429804ca7a38170f1b9f6bd73ed675e11e8c0d321fac912730b4ba2f7c428534adcaa4dad314c55807e6c642d494c6b2f0e8cd129775cc0 SIG = 9a68d151fea3909893359e60b96b68b2a3e2946f2b47b875398a1e39eb01463d35eae7d976f833a762b51f2726ee0dccad5ce3600564fd9dd58c23807fdffd05 SEED = 0d0bf4d42ef810b179eb841771de6dbde76361caf894e42a14b1e09787ea3e06 PUB = 7171510b43fc17efa80b15e320b1b0a408332542e0d36e4ab9a649cd941b5aed MESSAGE = 8e2179975d0a8e5a69fe875a3cb1e79aec49c3853e30dd0320fe3ebfb638b82f89ad1643036b37e56e0b55e0a9e22a4e283d7a27485ce9102db6787d6628b77913e10896774e495c26e8bab26e7f9a94d29aaa36aec9c26ad3f50e5d8c0b7698bb5f01b876d0d65fcf5e9e32cd7b89829ed05b0b8f63a93858985bc9569fce429fd37a211abed650f585c3b55900443b6c5d6e8a48ba67deeed07b76e969fc88430fce2709c0bb5ce926ab7f44e0cd79f4ec359ef76748883fcc3d026edd06c8b9cba54b990d30aa41f1448a10893fb0539280c599d42361433a34cdafd8ebdd92efb9c38a36daf4c74060c696 SIG = 24446bdf03416a4d08614466fb851db50e91a623cacd1b0b35660f3cf933200e15308708da3499a5ad25f0f0306b7942762e20a765b7ca9b901c750b3a95320a SEED = 57b5194d26abe4ab2116c0f03d23dbe116d48825a25e77d64648b43692ae25bf PUB = 499c02dbad2a4eab3b6ff1aba3944b91c3f273a382c548a6f3a19c83f0a86724 MESSAGE = b4813c9d13215fe9f63a78ff7ac95173eb810b4613f0f48d6876b2bd3b2c72bc7d98cb1ac32bc41ca47f09896f79204ecfb8264ce8f3c3e76dc124da8ddc6e0dfc1e13b5a529f20c82613fb9a82e5f5d77326a861faedabc7325c59af33dae6744025e649774fc4f79134bf9f6e3d5875dd91bc8a14cc36a66283d01d8d108c13327eca53057ba50bf210c19f139de6494982646198a1246c271b0a368c10aab95cd8961235d742df4545be68bd010dc0db23b673e623609e420ee76b1056c520f9ce8fbe8ee1863df97d17b7174636c3a2b612295091948810d1d4b8a5843760a2887dc55ef512af041ec54fad3 SIG = 4c7345960c8fd48a7dead71dbd61908468efa865a135568c8f9ca0055483468617a7e335840f57c6cd8f2c9805cd47a9d7cdfde53da8ef4f1adbb6f698aaf100 SEED = 068d27b21e2acfcc19c3e9673dd44142d98aacae894930e20ca067439e749a79 PUB = e22ddd396f955bb90e284776aa76e921e50699d0ca8914a9b7b841eb5ff47d6d MESSAGE = 1c6815423d1a2c5ebe8828d1646527c17b2006e547f016b5350f010d79b13df4fb8c6ed57ba9c26c3cb0e0a64178b650a3ea5444a4fad5b20a3eb8caa702634011cf7892a0727b6e8150b0770429a37a8a0bb3a7edb891a7c90240bc0360b14e6dd770a990b31b31f33ddbf653988f82742e5eec31b27368eb0e4f1ecf4d676f49214a520d1e5b2bbb59ac2e13267e07a0cbacbed9f94d7473ed697828b0928fcc616ee02e51fcd8db4d8f7533b7b139a05e06f9e0eae32993e3025aef0590b3fbb4292a3ac40765e8584ead00266acdcbdde1457a03b7d57bd5c9e64fb06b64a50f35f0a1ec34b6ddbde767b96ffd SIG = 0c173c488ad001cbb9c43d7b30a7c071a2fdb08cf7f37daf71d7ae7128dc0d43f0f095b2929c54b773ed4a1f0bf0dc4f364f0601e8d5ae062f5b78c05bfbc702 SEED = a34d52563159e0723e9f3fd133bd96e20adae623f8c798013bc36b441489bdc2 PUB = 1fb658e645de6d3efdb083a73fbd592fcd4b800e03c7bd681aeae6576bfbbe2f MESSAGE = 1d215f85c089f35f307a746c66c7c1e41d6ba37730d759e6e5622d6c6a198e40f63d37873b715df7518b3c6bb5e95a467726b97c9a0f8f5dfcdbfd1e0de357661ddeab555042b945fd899fad6d382d7917da9e12dfbda0d69900b3975165a73d0ac9de01fd3048b8fe5f0b90be67e03dc22f653a0a13eb4b0b753f3f3bbf787369ebd8bf5e00eb78bf0b3515a91e68b1d5fc6920bf4f4259f8a730efc7f1016d501ef6fb7cb8366fc8e716cfa50ea8b203cca1a316707e0b0fc57eafce82d62f7ff3ae04ac8fd041b55b19a352a69e6d4b79d0e650175168e34fa3358eac816cecf2c8dd1bf2a589113e91bb818f91f8 SIG = 5fab5a7140d47873684305aa6353d3862f5fc13e54a40c9563cceac8f74008c6c445631fa864e0f1c345b5954f80056aeba25662b78827b5e8e3a9437813720f SEED = 58dfe768bf52118494b29975154cf452bd9746dc7de1d6bcd18ee6a05acfd858 PUB = 0f1476c6cc2a1b4764af75805e77341f14a0d8b09c6a5b2ea287fd517c3fa6b9 MESSAGE = 609794201c4f6faf488790d61dbff3f41b328c5b0695cbe9aa8a136d72b4977b21b500f216e9f32168ada8c13bff25327647e30d8a244d74d88303abc90b7f71aa07ca04d17bc8a0167d6e63fb88baa1dab81d50f1e91f46f5af77f2e8408b826336a35052efffdf4af79596af1bb2259f83c1bc109cfdc3dd50fd96d310f27ea4c6c7690f21815ea92bd79389680cfe3ed40c80181190688d24222d9a1ed52ce6a16b41dbd9107eb6d2e3594e4494d75dd7c089e3b26ffd00d1003c92c4c39ae5382ef9291491a880ca4ec3ac2b86e66719b92b6f7cea2cb0bbb1cf624d0d1abeae556e5f73909dd546277037ec972fd4 SIG = 977137a38af44f4b262abff7e07282433c58926d562fbc6180bde6cd9497861fb6d955cf383d999fa1037b8b1754ce888c9ffc1560a451d0e9db8d74d2940604 SEED = 5a63ef9bd7dbf0e89fef155983659e8a0a6ca002bc42fad5a45af8e0281923f4 PUB = e632f4dc994231cc1790c21afadaa977a589b0eb0da19fcb2792911b15ecf8af MESSAGE = 796bc8361c6e8eec39838b24f53971e820f82361e0510eb4def1db2512387d6bf35bbdfa318879209435d6887b1410b3ebc1455f91f985e0fab1ce1c505c455576bca03539d048ad3a0ed1f11c73bac6809e2ea147975bee27c65261aca117df0fae7008e2c3c130bec5533ab89351c2140c9d1a62bdf688629787f954e1c610cbb75edb86209d7c357cd06ef41931dd5dfd1c7d407fa4ee1ef29393beab5713173802cce2d56229cfa76b601662c4d9a84a4936c52abb1981378b717eb55cb604a68d34f03b219f32226ca0e669348a2d8d2453930eb6e9c2bf66fa4e92c75136e148cdb034130d3f646382e1c71579ac70 SIG = 75461f99650c0368058113a15ba16bd2337b2e633da38112878c4834fac9ba2e307c866c02af79bea33659614cbb4465c57ec3effd4c478ae38a34a05cf1ed07 SEED = 8b2f06141e401163f90f674b04dc90dcb6dd3386419339662ecb0dffadf2500b PUB = 54da934a659119198553fd4566b660d8d610adc3290cb84829c894148cf3f67e MESSAGE = 1deb25d43458690323a7d26a26695090993474f467c6fde5ddb34da945be3cea2f6b75652ae21cbc4fd22763a1b45583e1c3e88bbb5fea2049b7336c91159988c01526824ca3bef16b362b9202b8b9754185bd61bea8f539aadf4a1ab135fbc31d2a8e33178073106cbbc02d4cd0d3c8feaa8eb733084356251795afbd78ac3c4f8a3ba19aed755c646f35569c7a6c675b6d6918e834969aca03f71a2e72ccb17003bb75b62e852aaf58b3baea89bcd64a32eb14a6b9e10de48971e53d0e9ac99a78f42de0382ef0e80ed3cfa343f35e4a9983b9aeed986d3a57f47e5e46d40e9d677302809a2d37e4ec011f051b4d031ed600 SIG = d68e3750dc56432397401c98ff1529db9ed48fea246dd4ed383ec74c1a463aeb784c87b1fda8bbce970fc97aa9807ddbe95d41fb022ea68c1e311654fa1da207 SEED = dc649fbb1bee0a44814d6d9e9080d5d90c1fc173ab5fefed826a74723a774e0a PUB = 0214c89f3867ad2e8870e50f8c2a6254986d9c220e3338411300cd9c6404d4b1 MESSAGE = 328700a8ae581c1edc4e2c00c78bf4606097f9bd75aade205a243c5fd7434d6222da937e2881a2e3c574356d4d5679301da99e11cf749c27921c8caa2ab2a564d87c5df8ecf1a72b680184824f6986022e3fc98bd2a21c3455abf1154954fb30c89882947b02f35af7b1bfad05237d242e2b74832fc536196f2e59d1acd0c1db6f1943d0f6043bbd6a769083ed66ba0e05a50feb0acf72b6c16ba9af039afb7fe2a4aaeb4d06181c5a1878689e67a3f5d0ad39e794d6239a7e0a12ce820c5be60fd5f1dd79702f49d02b79755fe873f5785c72f74625cd7e2428262597d31482c2c0508801fd96319d61b91ba253a5e722f414cf SIG = 0e0c5e4e184375da4ef7e2a2e4888050cd84e2fe21d08e84a852db2be3fbc372c472de0954dcd1dc11aec493c569f40fc6f77f03ee524fb06ec40faa1d6cc10f SEED = 39b8062da43e64e1676765d62c7fb8e0a99c4fd417d6f7e3319bb13044205f3b PUB = 6227cefe88ea4fb27b37b5f797778bd72fdafeadccd9aeb67ad437ce08fba6a8 MESSAGE = 740af679e3069fad059fa4825fa41c59fbd484aa649303c27c4f7a94711c5b713b2a6b8987859e2271a6a71eb0b4a15abde4f5168f6cb9dbdc6a27a2a13d52c9720896a1f4ce3a5345ee793b6cc3ad80d7d58163d5455b9cbd073e2b7adbff95590c7172271bd91fefdbd01657ee1750651036cdc3560b444ca2184bf4f3ea89fc973aab6fb4a8ee5704bbe5a71c99fa3b5ef0d0396249758297699ae202b819690dc7ac4692770346907845e2210d5363adeec03f0fc7761b7e0ec0fea1bcf6b04fc54b3e4c40d19b8fa649ac8479e8f80730c0c94e9f4a1ad506f2bcab0c49540f6decaa77b3d657dc38a02b28a977ece482545a SIG = c5f626490c0ef4e1efc3edeb0cbc3f7de267057fb7b6eb8f0c813584965bc5c421feedf54241cae001ec6d5e25c9b1fba0385e5dbd95a06ec1d8ae519144960d SEED = 52f4675d8ccd0eb909df0a516648db26fa033ba41d43fc3845896d456e14265f PUB = f39e7dafc97b0a84dcbf7fa14a9403ee1fa92b85e5a7e5d05f031b44ddf1f794 MESSAGE = 74427110857cb4af0a3342c2b52997bce1a0db6405c74e9651c5b85979acb071e567fe70412c4e0d8c9fa421914f6a62f2ae420b7b2f4cf80c90574221222288b65867eaa66e7e0a0557a26c549f9a7a4e70838ba4074b4cd7a9d758b378b88dd49441df802a444dcbc30624933b59922f33c20f019fe78ee24b8fba79a682f388505ac9c97f4eb87c611880026b4c23306b865173f5d716abc6cd9a9906db3430136f754129c443b20c42be2fbcbcd44034d714f58a4ba8e756607a02b608ef49648f2ad0cea99e7ab30a8dd7814004f725f49301d7b304dcda625c296d928cb581736ab739c86b469241a8259351fd37b4780a9993 SIG = 4bf668827a720af68898a06ea7b44545a34ca896ecf311feea47e0686d911fadaa03118997153c65361fea15de9bb891b8909872045508ffad0cd9eab21a9702 SEED = bad73c9fda4ceb9da6c701c2a6e2efc0467afa0a74f8750c52cf1fd4c8e7489a PUB = bb0f027a9035376e1aa3206c3d774475e351f5767ef86ef48a72c037c24cce62 MESSAGE = 74b966cb780771aee63d734df3756702d1d5fdeddf32136c6358b836318a4f984fe71e7716adddbd649eba44cd4282e0055d8c1ed2d35123d66e5a98f1c0838ded563b9a20eb8007538fc7b0713e7e485e3c28f6ebc421a29dce2524db7f29205761036ada62e5b0b7d5b7f294ff17f338232fa5fd42b6f7253304092d848f50735248595da0f7ef28e568e9916bfc56d7ed0d811b59d5d891ae43e1b198071306bf525c678c6343998005fbb7869d1c40f8cac807fe2ef03f3d5b933f58978ef2906fccf7444a2936e63d928c690926c9c994ed3d666263e956fdfea27764bc5f74125bc46bc102dd3e5ff93b5e123e4b38bdef697e15 SIG = 197d6b6cc88a98c06dfca0c01225edfe38a0b2289f29f8a44ec0816a952d585e2d59b5b08de100c0606296ccf5e92a99e093623144b8b22db87d929225546005 SEED = 707327a431dba77639b3966b2bc095f8eedf57f7a200e3b0077ce420389c92fe PUB = ee2496910864189fdaa3c7757eb3cda9ab1e70fc9e7f71a38a0bfc845931c95a MESSAGE = 32ef31b64eee700fca2ab21a267f8d9d3bdc689c7538fe959bf713fa995db2c0ad36dde430a8417d437b72c74e26dbe31d93701d4617fe51825cff7a544fc9f44e4345e14b4b11e15f26ffc2af8035f3f970e4dda44c0ebc0363c2b56fde218663bf78839092538fc2f39153d4eb29da0c1a08aa966601cc68ca96e993b01b173a261b2ef327650382f568fe944855b0f4fd9d15e752ac74dcfd37b3786fffcef23339c21e9270dce8891dd5eeeba9608fdc7b6fbcc99fa1b5903daa0968e1b691d19d06f215ded047ef9d76610f5de220f5041b313faf9e96c9fd7db54b5225726af435f9cbd9fd87ab40ce8f2c6940b55f0faae87850ca SIG = fb99029feca387a5d765961e361d7172b98b7e0f11290bb1e5b57b51bc2123d0bce29020392a4fec9ae6a72c4c386cea1857cb8f9c50aa9a76d7f1687fcf2900 SEED = 6aa5c9f008f990473ba4a6286a416614026661f11e1a24efa81ac35852d1d070 PUB = 605ac9b4dbdd5033d6c828bfafa93c0039440aa11ca724ae834043e07bd032d5 MESSAGE = b5165d3963f6e6f9ea5657e9f07ff3a321eb338f9a8c3d3c42306b2b278978b31c623a631be3b04c41edfdeddf538e1b765bc8785401c1af29d0467a64411c497395d755dca03ae3272f4bc1fb1918dcc1ed6f04d6498404a8ce1409d447f570a4359522cc54629202ebe507ab693843141bd5ea0573b20f321a483ff383a46897f5926fe0b8afc25572707b63eeed283532928a4144196497942c572ac547605139256b0aa0eaf04db1a256012ed453b173ee19ad6e9b1af3f45ff3044a641f8c8eb0ac7bb45abbded47286b2a069d3908694ee06f2fbd0ef605a7911026ea9ea3c4913f38c04d8b69565a7027867ab3092d05f4cfb18fc7c SIG = 9756303b90655e935251032ab19cfc95ca1c2a2c3ea28b033bd47066cbd4c7d8982a8b9886f1b9cd02e88a65564da8dcc34f308ba9f10144ba469c2efa49e004 SEED = 8efb8b79742be21e6d31de678bc81450ba8621082cd6f0003e22861e2291c481 PUB = 33381e356c4fd386a3f7b969afd9f5c00d2067b698b3f1f00f3784202d3084cf MESSAGE = 6b750325d3a0f08a147700b51a9b3725571094818ed69d1f761013eb86f323f73c49f5e439877c2783b336d1f1a674ef3e431fc1ae0180082df5fca69f848139fe6ab6739a0592ebd6d4705c7f0136b22189a11d60d4d3c9bc80fe7d7c00952d5742f9c0c2121fe792df133f221db991fc960ee64b9d32e0178e542bce8efa8d03ac8026cd77ba8bf0b24215b9faed2eaec920e925d5ec46fff6bde725e91c8280e4ada232a5433ae9680ebb53eb55553147c93370574854896154514299c093219a111dca4e637ad5001338c6d4d5ee9098c65832f7af835bcb622128423036c79a5737738a7539f8d4a6b8b221b56d1401aeb74d4571bc009d SIG = 923005cb4848402aa8f9d5da74030b009444924c214ad600ddbab4c153a6ff022b53cf6364cd7ee99bef34fe144da964edfc38a0ba633312650ebf0e55a06009 SEED = ed046d688b2b0a1bc3daf2119dd321a607b16d2a2d1d963add1209c665b5ccba PUB = 8734f1ffcbd71cfde290017ea6253e580d59e65b541b46521f5e5ec1451eaec6 MESSAGE = b9cc90fd8de2a141f95116db3b04be83e98522597ec2174964245180b9a473767d6d470a217db5ff5a1ab777e1e28a0b16975e2bacb873020444b47ed8326421b90ebb503688f090c11b3b13617c5c5052c297a41e2893775e34d59ada49d994c0e4a9f5220e9f0315a67705a3ec08af0dc724b5cf67ff34fada8ba7109ed2b5a8907bb403fb1a838b4b059f18c792d7bfec05dee0c9cbbf1753409d7db3aceaf47b4c61398497b0eca6c1f8ac08a7ea1eb9c40bc4e92e888212f7d9ee14fdb73158160944ff9bcdfef1a7469cc70f9474e5f24dfffea585f09eaaab4be2afebbe8e6cf86d35680dc5d1b92913e848256ec736316fd0a2142063b0 SIG = 721bfd4776cfba13330fd37269e979c1d7b6ce54a51b82f456e137378e582f192a12089da5aba76a7b161813dce56b72892a35330c94f7ff21d09cf09e553504 SEED = 76ac8e570a39b3a0232c45497537fb2155acec3617865ed1df210f00b49d1b8d PUB = 312a3ad899ae6a25507ae6e4524e10b63a6e7ae53d9cffd39cf28521d93533d6 MESSAGE = 53ced9db2b479e59d3ed643f7cc3784c24b8bd4c63206c72e23fa850028899a41ce1a8bdc003f12b7c29972c9a08bcd231fe0e1a0fef0bafbfa4e0e027d72004075ba37d490eb9964e783bb98f9e503e9c1fd3d23fb0017cc7c7a9f86d171f041e2355d8c5e6229d34c7eeacb6358cf3060d5d265bae2004a558878659a30dfed5f2ec788b4e14397b5d00c29db5d4ebf16639a8df292a3d24f6983cbca760d903e976f5b698642ba1fed49e79c38f4bb3946efccc9d6aefad336d558f78e4f205422e10384a4e531e75807efb389d2af4cab43825fb87f196a9080769fe7585782970a6918affe10d20d629b705845597418d699de3f1de854f94bd SIG = cf03f525913c44303b2f80079393c21c1158146ecf99636f5d97adfdd9f35839804c23804cbf1e553cfd4b73f689a9143aec298f8276e1e4ee0891f1ba75de04 SEED = f64a66ba0f0819f3001416c220bf52d860130a19764aa8ab38d15b2aa75ac022 PUB = 8125253cd337e00d45b45079b585349561e5f542a81f6d2fcfd985c10feab2af MESSAGE = 8072862ed0ab35921db5ec2cba8e6aedb0441fdf47491006c01e6456ad70fae3c4152dcfbfdbb8f0fddec5e96b12bf67989ba96793f4861a11b63909ce8d19b8ca64a544b31ce051fbc88e062806d9965cbd2967b01614e86b532fbf59843218dc9c19c80315f044731719371092a3da38878bc4cf77de972e860466b8fc45e465dc3d0ebf94bdea60ef0b9891ced41b997b11b31ee4167db60c9cfc8b85beacfe223cc1829213774085d7c06d2b2e632cc21cd9660df47c4fa918bdd596ddf622dcb652642b67527ba8ed15a819a8e21f48d7ee70247f5200e37c259dffd17eec8c232f970cb03182fe3964132993f6ecb7c4db18ccef390c9eb3639e SIG = 4de6f5250822d7c9d5bb98582500b5c085f541ebdc450ed1acaf83684827ed1dc77147aae4b19e14a7dc5bbe1f1e4f5771d8a6e4f2351739afb08c806d558701 SEED = 8439b1d60aa48460135eb1002cc112792995079a77e6e8ab020b9abaca8920b4 PUB = eadc3e0c5bddbc3052c3b2f8b0a94566c2b2c879ed17034ac0e6a45f2b3e32d2 MESSAGE = 5419f6d24eb46635d4a7f8eab803cfd0d04de092afbd86f2a6961a8d1eb8c0d197ba55ee08c991822a5aa702bae0337abd5ca7faa15e1f1ae369946e9b81216c0f5fc22bbd4433c3de93c5caa2741683bbd0e1a78df28dda19174101876334d40339659f021ae766162c6cc5421b79cf9d5c090ed4af07ec84493035bd0b2421b533684295bbe76a70fec596ef8c89c5c9dda3c33b7735d2d2f20b28f1a5402e72d04ba291dd59f14af08adf56eeb086d769c6bec3451891372345fd6bd02dcf95e803af0353150e182e323aaf683e036d9a135d2e6f98cb4d327e2ce7d54247f3592ed067b4ce7627174f996f28165c9c11f07e5ee9cee63851c6b68ea2 SIG = 62da81e16440821b593b6ee6540e15d1aea75d23e0a1bbfedc808c9548f87e8bbf36915a39a74716f645cca5714d170af907576d4f3705e543d2adddc5ff2303 SEED = 3a046397f0afc072bc7f907c74d38fd1b9afdf27e14a3534768b0dd2df3a1c22 PUB = 99cd70ef3be342493393872f54c47deaa081021892d11a3268f3145ed4f3abe5 MESSAGE = f08ddef46cc6c34179820c9861375172fddf774f8dc3f7d64aa432da8e5fae644c0a8a9e6908517d505debd612868ac6daf95cd7e1699750022ccd4b88dbae2bbf73546ee4b835d319a842dae8b9ed683323f31e5cc57919bc9dbe3bcfffb2ada48072697ff4a7d310c91adbca81faf26a0eb7bb0c404ac9d8dfec63e9c64e2f420c07d323b7c0dc3b73507283aeb1cee51db4e1a83a692c7c1ea398f6f30940fab85e2138d4b85aa4e231e5424f5b064ed026f0ccb99d1c85a9eb15f5934a11359d411cf94ae8ffa3361a224f46bab852d184a248b4c31fe3a7e7f5134c051031a9f328a7be4a7cbbb1d8d863a400fd2d58daa44f1b9d8e9ddf961ce6322f SIG = 5024ce60257965687080c5b1fc7d1301c32aa6fcc835497d9cb23a74a6ca2724f55353c1b757827ca5440c9ef8f8c1050913e20aabec35c497b56041b5deb209 SEED = 124f7416a80453e4cf1cd7b5e050a9761418258bf7d27beb7f23238c4540be2d PUB = 0da34ab173990150df7399b6bcddba93c6dbcbf4d176941cb5071e8734c5dc92 MESSAGE = 9dcb9873ff054db11d0a9b19de6885ffba7f0e681cf7fb8f6cd950c48328d1f919ca46054eeee6c9e57843ebdda7b24bc3503c4d612abb1a314f39f58221d2b54dc755acca7969740e7fa8b1a9523b8c7379fd395253f4e6cd054ee24b75613c3581d49e19246a7b3be1cecb334be44f3d626fe3b7b269e628d44580c20636eba2642f2744b959e65757d0ee601843f188e95d17253fef567068a5405a3a9e677fea3d7d55f7ead19a3f30c5f985671b55fa120cb9d05f471b6e1e8d779a2c803a19e6d0d7cd507887ed647c2a95483f933991ed45ae301a2b0e954a5703d248c78810aa0b199cc2bebb2f1d71cc40487dbd42eee0f745f7d285685b1fb31b15 SIG = b0572104aa69e529e3465a6fd28f404a4ec20276a993b1725eb8c5f650b4a216f1871b24e368cc46cd1ee0174cda1b5e4ae2200aa9fc44522d975a9c51814908 SEED = 25d13b3837601b07a975693e5a33d5337c34c1127fe4c27490612aaf7f642e9a PUB = 3a07cd68ee2692d51cfad1a80e7763b18a043c74f4e1b01edc55ba9a9e07795a MESSAGE = 115b3220b45ca8f36c7ff5b53887d47e669b78dac13b98cc7aaca5c2e19fce81ec8617ca410e11c9a9118a668453b329ffb718eaec739172f0a849a0848192a5bdea18ab4f60d8d1a0d338952d77b2cc13efe83c76e8dd58803b1d8b3c9729ef102b20835b7de872bef3010f15a4caddf07cf7bdd222d84b174bc21527cffb1b7ffde81e281d30cb7bce25ea3dffb6ea1fbb06cb70569a95ed1a07e97ca42de70aa218159efd608fa9b0896e0b58518a322f251d133e58c8fc1428ab0a170ed845c75fb403f1ffb97d2d2a6d4f277911d326c1cabbb8516cbc17908ab81ff8d79af44611ea1d05879c1ec81d06936e0f4a0aef6d5748e181d30ec25236597a973d SIG = 20cbf08392fea6a99cf446a95c199caa0c0f9813cc217b8d228e2ed90bab95ea92cd73ac95834764d33e42243c80a7603491c8d3e49ac715fd8a5b9e4789bb03 SEED = 7b3a76decaea60c41e95b05877a7da82064c27278c8d7df5f0bb95f0ad2d0435 PUB = f80db5c28721b1c611bd87eb145a98bbf383b068045df2458d1a6fda099f7fc2 MESSAGE = 375fadaedd9cac49b64e1574028046069f4c83654c8a7011abdb64db16b47fa311798172f9072217b0a6a43e5df6ffcc1154bcec1c68e1d35ec05880d012ce76e4cebf301bb2ec983d00b4a0540c937ff1c6df9441c61bdb3be8e0c7c11a35d49b6f55c381269a0e768efbd453447fe48b75ac39646ca82eca7d149304423491871c10dbcfc5973a57fab8371c30cbc4e90becc0b67152226ee177b4ff368ec879b391eb95e36dcbb07b2c16ba395545d4529f727b1a11ef65d120976b7ccc86af4bd204cb9489c921e43ba5e850cfe59899f1c1ec4aa5c92b6dac6914b1952b53dcb540b409231381568987bb2236bc40895df3f17eab7c0274f2244f958612e88e SIG = 2cd26fb3c4f7440a72affe93564f6f6559adb15cc7a2ba10879fb7d67e47d4ebd02fe4823698a5fbd4a907fd69184c255a170e5f1747fce968102dc219b50d02 SEED = 5ff8d4052608eb033a5e94b603ce384d8452f60a26498b9112567f3410c18666 PUB = c4900de24d9af2482763109926af7c481380fabcda9440c1a53ea1cdc27e6568 MESSAGE = 138c60557c2e9008afc03d45bec71f961149a0835926751c8ff3935c7d652d83e1b0b1da7d5bbe0b8e171a4e49aae06fd8a9deff78dcde4d25b1aa899998a0f99e1df6f9337a3ea2f24b76c317a7014db4e5283191795a70d8821d217846490f958701d39dc2c8ce47d928938874d87b3558989bc77af820979a351eef9594aa5b94f3341eded4ea20b08c3e7c5610d43267818dfac0a87ddf527fbce8512bbf85b66c9bb5d62f0fe84048f23b19604a5c8d82b1f25a8da02731feb2ecae489b8475f7bd326ddf1a08189e46c08cf50538c2a363e2f4eb2c01a204c7ffbc0b981adc0fd997aafdf2a222ee84c309f6e95ec7de4fa85d4768d5c003165028225e22e09e SIG = b737d4e5be27deb6d87729c636dff7a406c013f313c38cf683fe14f75a3b3005d9535d7e5815c8f8b37c51d6927111c979f7d9d81a347aa9cc09ed4e6c18e90f SEED = eedefc1757e3a7e5ed3946dbedc396a362f683d2c51b0b9f60765d4bfc5134de PUB = a9872bc2192fc02b189ceed403ab9f270a032a835fdebfaf1c9d6934ed8304bc MESSAGE = b194db73f994cbdc3cbe630ba72c47c2249bc0592ab547942b1d1b882b44f5b3855e568bdddf92ef05022d88fcfc294e76b64a00e9c74355373763e49a4ebc47243d48a9ad588994a518f80f8615c2b31da587a53e529d435a8697350dfcde02d20cce7d5eeefe3f5ab2aac601259cda38538a1b8301f9832e75ab90f8a932f267eac181003965d5266f206180c6c380ece803577ccb46176bf607159486f24259747e2ca6fb1912db7b78a973b2846387c1208030ee1f400d0c5b5e8bde9635ae55638ba17c734de8638bb85dfcd76629a7f9f40d6ab954d55bf8575fc9c9a595097e0893db5a7b8a6c455ecbd3d22d725e19de2941f467f9eb93d66a0e2bbdbf92ed1c SIG = d5bea8ea9a5fe9ed6d2bf839930c0c6cd5039e988f551fdedb5437e1c1af0ed7b3897c035711c3c51926be8d1b32024d5cd582f5f8369ad84d18b12502652f07 SEED = 09d22bbaa5956cfacbbf9fd5510975128686c40c6ea96b89ef4c0f0c649bcd7f PUB = e559ea8acbdc61b6709a7d83ae15849a6c78b203923dd0a299239ee4886930ba MESSAGE = 1c26a0f3a1a5b2d7d5b297af8a6a689d7c62a25267e197d23becd2f2b816c4de92fbdaffb941c3fc8db7a84335a84cfbc92cb3ac806ed58df16b6b8e119a48df4f27c71e931a5938e7d002734885e13a258a15b6e1136efba72f1d096b689f7618f49c968063e8f991fa0b55601e430eee13492a1b09413eb23813591a7a9f070cc396ca9d1facdd4f4ce37c40f7245f55035e10fad6b85b5f01a1daacc0df94069f7de8f6467f96d1fb98648e8a0520a8cd723c98e9dc2dd4b2934d8228f0ae1a415bd3a7cda38d7a9983ce1af6f8c970a2a591635fe12b917536ef815eaf1a3138d70ce70a794264d7c986d9ee3290445f15a9248f2765271e5a992196ae331abd4164bf SIG = e65275c4328a70ad62408ed7fb1728be87a73a814fee8ebd94f2665c71bc66ab0c1b07a600b30bc081a74c536857c20610384be268d9af3e3ecddd3eb0c14c0c SEED = 77826ed351a3f09254ae5692885d774cb3f24410a4809fd90f8a00da9aee9903 PUB = 3eac8f41ee73e6ef136821f7957a1c27e15638d0e3916e6caac6fb7beb7bcfb0 MESSAGE = 1ff06c0b3999cecb1900a47d267beafbb35d93d14cb2c8925e3e3fe5d967586925ee4baa41998edd0103205810aad5c0bbdc77874476810246d13089a64db576424fae0bed9664a42a491147d1ee3b9c3b1ba4875be15462392540f9978d9a4630ba4c525499751a45efc299ec7d73b17f9ad275ee71a687e72690d7320242d2dc2bd4d5c5cf0f17a465185dcf60f8efff53903f20b0c2ab2192d44368f2f2fb36048af071f7aa857b14ad1d11461205bebe17e02be2e3ccb6092821885c4e0d4811be3f45b1fea088453e022432f562562b43a355cb56270cedb6c2c42dbf9be850e77192fdc65cfd36834be988dbe9a93e2518c138b090fb9da827cb1c91c8fe52fe7c57f7 SIG = 977adccdb829b40bbd8e53856a783db346a39dff62041a2972d29009f1c9ff81b8ad54cb901e497c1d3021b50b6c69ee73558fd7be05d625f5727f9af2ce8702 SEED = 99a99531c3cd6e3e9c900a9eeb26267e72f09d11b651a897ebb79be016f64c6e PUB = 9bf9f8b48a2728e02608fc19899d219656839d1cc1e9a8984df674ec26662f41 MESSAGE = 7a89c0c1952fdc4298dcaea854efc134656be147e9e8e82fc9a449059d80570f75676b81c4a94f76a968200cdeb0988c73f59afc72ad4c3103e19fe63b7e95e140b5cb2efc7b97a6ffbb6c298ddace3be6d2ed3d598b8bdf0c2fe6c97602142a76e978514c196c1b9a88efdc1925fc506155cff9a2f21ab634e2b93e96928a5d8f7ce4cb7326d9689469242ba9c6a01b77496badef87578f5a17284e900a72df141c6199b0e71ab5da4375037617ec6196d4f4e23ae2916a72d0fce796022305ac9fbbbbe4705b340e42b78e1c02bb1001860cdcaf71ed89255dd56cc0b31c59d4596dcef84e22234be562bd801e94111d83a78064c90f9d82fce91f68abb03c73b6bd8d7e02d4 SIG = 0e89da5d949cf2bf40c7e17c2d0f9ceabc88a092eb4d49cfbfeab7c8bff43245c67b9e2e92f9bcb9b34b3fcf8b01fa2ea7a9649f814c3aa98b3dd04540c31d09 SEED = aa58403e763bac405db065eb11eb6be3e3b6cf00ec4a222b52bff4b6e3d156ac PUB = 167f9b9a4665f93f5d7d3016ace6fbd13420b2e51e72bde59eedf26993b66cae MESSAGE = 3baa0998ff02b32b90b51f9a840c7b5c5870cfb1810a9b0f77b55909d47ad335147a991c29fbebfc592e9307175c1964129a2d5efc6215807453bcd726969781222bcad1c99a49748b9ee667c4d0c82889e2f50064c115dbd8fb483d72ab0ccadf76bddb2dc727dbc3fa5c4624c283d8921c8aa4425110dcdd69c05e5ed59b359625eeaaec1e27eafe9d9a5ce736c3f9c527ea547818b9bca6811be4cc15058a6f5b683303b80c90c94a83b8b15869713a66b1e0f656331b286d1ef7698834ab3e138417aad6bb3ab3bd9fc78761a482dfc654f3f8628c8d9fc16018898f1641e8622bd272e38d41706cb9cebe6ee5e173576bf61bb1188cf2f39c62220bba88fcb4de4898b25b04 SIG = 64b598ca5b8f9ae742e46ee0d8c1aaf31458b50c25d267a677e44be5b755f14d51801a30399bfcc38d14071aa0ae93da825a581ab6c20725a0a910b4735dfa0b SEED = 1044ee3708c0b0e909a8cb2ba2cd0af8d28a5de01d962e826087fb232df7b2d2 PUB = 46d241ea0c702c1889d44655824629b67284d4e644a48fa45455d27ac5f62529 MESSAGE = b8a445455fb66e17e3143d35204c9ea93474eebeef93963ee5c1d377ca217acd4ca63e5755da08fbffdbd4352bf165193896c8d6f76bb4cd3bc2d3a476a4e320824a1210ce74d0014d747f111eec310c5c89ed4d0850e811f80a8bb28dcaf6f411df83e2c1dfd90c4ad23561454eb5d756b63b4ea7f37dc5d466c16ef70d11190c4f5316fe2aa8597440e88bbebaeb35ea5f04f07b0339264158ef909ad5163bfc248cd724133e274f812695f290e57176a96b9393d07bb310299f5d2a6b6dd1dabcb51bf29c5afa7ebb0701c6c84767ac137793091fe0ed6e47d780628a32c84f83e00e9c16742a523ecb63c24f4a338ed299a06194924f44c5a5d3c937ff9b0945982ad24a2d1c79 SIG = 7d6bed7f87d090abe013c31e1203903bac9c93445d06c7b53d31d15f970d88647a7ed2c3a63050ba19d68043aadd18bd861de1ac4715b8e828b2b16f8a92b001 SEED = 95dd1a5e658fa6c8d42507b3e5b8edb5baeca62deb00fc5d4dca8e1ab5835e59 PUB = 3a5323dd1e07f323bb6d83e9c2db92a29f62e2e003ee0deacd7e2e4e030d8d27 MESSAGE = 9b7afd48c474604c26367531556840c388668b0f3840063dfc9869ad5b901274b931293d04f3c8e8f7f8eab815a641d7c351284e8bb0437ac551bb29438964e6a7c7ba772344b333f9eda5a77568c8931ddcaf21e32e07b10bf4820fb859bcf87b81c4bff426f24a4d468f2e9aeda8f17d939709970db11df76247e98a39eb8b38f5949f349f2ae05ab48c018517c48fa0205dc7f1566453e105e48c52eb455c0c40802f797b3eefb1e2f3b1f84315aed5b0711c6499a691b74b91f12ef70f76c4c05c1aa1a993e2f3e528ab343dd2368162f4036a61a13a88045dcdefa85d68532275bcf5b8f5f00efdea999a95783175d9ee95a925d48a544934d8c6b262225b6ebea35415dd44df1f SIG = d02a7523dcbd29576ba809b531037774df41734a41175813119c6a6a788cd9b8ad780865678667699ae66d010919a966a051c08163df67a977ee6e220d0dc30f SEED = 1abc0b9aa01dc57ca53efe7380962b1a88d50a964f5cd98640982c74393f2926 PUB = 8d4fd14394d7c1405700306983fbf76ea9f171b15a6b56612a1feb1cbdae5dd5 MESSAGE = da2dd940d5e1db6e80bf7e2b782e7e745cd4fd252e981517975887dd05ac77ed837d082961575efedf301fdf24b70718b991b8d92bdd2e6bee17c8aa4bc694a727bcfc78fd85195c42caf883a2c38d161cadd79cfda9a39110e1264d30bd4c5c4a5876777f233b071b1b0b408935f0468954cc744af8063b004ede56cd981c4dd5608abffeaec9e58f3fafaa671467804b7fa2558f4f95174201f183d80a5914065fed53115b41ebc338f78df050053b8a4e75ea7c6fdc354dad27bfd8a2e66fcd7ae2f587d24be0d4a33da30a220e51bc05fa4e412b959fd95d89ea6ec0162516c096a9433a9e7cf599c928bd5305c2173bf7493ed0c1c603cd03f082cce44237a79ffd8be9a672c2ebaa SIG = f738af2d3e290b3d23d9aff7414bfc5ffa47235dc053687a8ba5c8541b8511f781566cdaa130e0677db55fa8be9d81a092cb58923a8628494d2f62d95c167100 SEED = cbffce2c9bd3e23e406e5f66e632dcfa726654d29a955cec983173235fa359d0 PUB = 49653edd64a55f7cd40eaf3f8e72eb96dbcdee398f34817f2c95867949710b14 MESSAGE = 1ffde6826e4f0c24a7961f191e74cc0bbc928e3f1aec3efab32765c2501cbc1620e7ee6f61fccfb00cfca9fb98143b529bcc8c3d0fdf89ee7c342f101815fabf7deaf9f302a288fe175826d590d99ee6fd92da74f9596b783c0e7d47d711a32f39ea4165e5212431441b498c6b70db3b09d1f4e4a14a6bae39da5088bb85b3285ce9df2f90681af2c74dece439aeb91e1c1b0712eddbee8d72569828f37cb720c509d02aec476070484e9b16ec7179947ac96caf0e1be8b6b74f372d7235fe6e3999df733bccd482dfe2e631f56b582667dce5e3121763adfacf3b18cf2095f7394dee4927fc2bea6b5824d90cd59e854ec5872b4551b02efaba5ad54a9b7a8f6de5d7cda5825b325b076ded SIG = e7ced4fa2a7dff73f1068bbad0ec9a1109043c97a62effa148876f0969ed4dc608e28bce797af3b82532c94dec4d6811b7f563679129facf17bb73d69375eb05 SEED = 9f91231497484cab39b9e20f861181d397908577bbb2968242d071bca4813ffb PUB = 8824bc6cd6a6f15a5f41668f2b3bae8fc4967383078d08b51d6d1b2b93a1071f MESSAGE = 21d4fbc98163c3fb6e09f775c2ab7b18b18792340bafedacb49605622e3c08aa3b2b8d0e0902f361aa1c0f652e2732b10a0c5c6a05098996b588267cc8951a78b5d431e7222bbb508eeef1b5e8b8d01d3991e18dddc6ca8d222ef177ce62938d1810eecf06f4738b28f440946ccad2a12e39d38611bed3a39f93419a179ec2b1b52d5fe5c80c23b84d8803755f5146092cc199b4bdcea5bcf2037bd53ff6346694155f027d8ce2baffe30a5666596c00783aaeade9c77fc8637942ece017d6484c2899b1918d3a480bd5157678d4772d271f9b99768ee1bcc46b2489ae87cd030f47d1333c7672cb902cb4f5fe746e853de57940ba2264d3e629644d653a5b7af78ce64a993f36250f8cb7cb45 SIG = 0a1c706dd8a13077ab18386c65fa97cf9dfc43542d1846ecbddeb7b3c93f3c66f3ccd0447aacdd4dad8fbf736c4ff9dbdb62bfc14d8883e385bce9bac56a350c SEED = 1e2bd5487c5f5ced461f604dccb4e78eb91608f0b821f5afc4e3e534f7960392 PUB = ef825475cf2051a2017ae532f077d96774347d2767ea7b45f9c1b860ab993506 MESSAGE = 1dbbbb13cdad88854b809ceded273343d306a8deabf3ff02c9cec6f002b8e9e10ef5d1b0f5711f33267aa91c171b61e960f740457b81d751a473f44f750a080cab80af7ccca7dffcfac9ee4c39dc85cbdf51259ccd3470d9bad3ad30f4ee5dbd4fac6bd5c6c4df7311a470044695a7e1a7e18572207588afa57eebcd4d575b6d424457ee92465ce1863e3c677cf875fdb98d4078ebe7144260807052577144cb8e0359aa42ad155d79dae3deb99c4632c191c799cbfe587d954787068d663bdfc0fab1334f1876bf498c4db5c53db7b0204ed5a521c62f09eaca8d0189f3b394143f29c421cb5c8d07bd751baf4cbe3bf4be1701df4b2207dfb2904d84f4dbda51cba576d5a5bb16efe698edd608 SIG = 4d33c96a2e3a5db7391adf65c1cc3565fe76eeafd0b5c7abb0b492a0b51e1fa33639946a243b2ddef357552298ce0aa95eac6fbfe660988271877eb2a7da1806 SEED = f78db14d6d1a643dd7735baf2635321244e7ec8ca72c5c38c98c809db9cb5a55 PUB = 5414f75f52f3864afb0c79c2c5c1d06b4bce400fbddf17fe9cfb2a8bac47a0dd MESSAGE = 05caf1b8edc3b173fbc1ed29b95e2bf06d814ba2407d4b31c728d04ec273d25394423ac7d4fff2ca36ee90273093c756e2bd13c96d4a3dc7f5be1759fcd328eb66c5882b58fa4588e5b2a3713a4154a2340d0b06ad019601b0e028e497f898256b028af95cd8168df5e58a57cd1ebfc0a0c91ced61dbb480aca7df8dca91eb16e98007cd2cd1a2045b0e4477d12d5a4072f365426567c9d61577f3485c8f46605e7f475ef04a3948f60dba8c5508d14bfddb9b11dd044ef2d84c16b9a9038d8e78eda43b91297df35f4361a383b41d49677a687d5b344ad1ab0fc73017b3bebf32306fb3fd7b3d5071f3ab5f6e49aa15540cad6503bea7784cf9421801ce1385839893362a97fae121300d6783af0f SIG = d7cbd4181f67712007b7f0e18452e0a024464d9dc9b5ff9cf669d1b91169d7573262f83336b97c861bfab3fcf669223ce8caf319f21d23f1fa331a2d89b6ca0b SEED = 7dfa328e90a1b849c219e3da832df9ed77448234f0d89ea5d17a3d64e7883daf PUB = e30ce6fd5f5800389a70cd117364f59945afb180f229927360b06b4835f8dc91 MESSAGE = e5e495d663f47236714532687a24308f942ca9c33e088f7f106a5a723518cacbbef4a68c939a6950b2dc2589f82d354e575272d42b1383d315ab8a20aa0cdc9d4df678ab3b26612b5dca66e71f9f3fa7d9e731dc481e2bc7127cea3b6203ca6cd8162e90886a73dc46c83ddefc4b9e2d53d29dd387c624e08bd8d53be928a40a9aa8ae8b1c8d0fb6a7bd6dce5f62315b7a2181f627f256bbe7e2a95bf464e6132204c174209629840235b2c39913301a4b40325d118d384bc7ac028cd4f12702e161191b149e4209058a55122bbb8b22b24683ba4f8e2e6ccfc08dc8c8b1bcfb6d60bd8f062196933df319ab16906d085730eba1720d4b02c67daf38cce6aba38e25d68ef95b2f521913a1d77d5eb650 SIG = 1c61d53b872f8cde598609682c79f6c5df007c513a71cfb3a06dcb82d85c4b00ccc40b00e59f595393088b4cd0432855c67a207da71f87e72c409b3e50279507 SEED = 6ce13d3c2ec71fed83131a69d5d030314ab49e6565ef68163fff09ac5d9b47e7 PUB = 9c7b1118fab91e0e7b192a23d95fb877cb7936cc6c8a330592f48e6784edc292 MESSAGE = 10bbc311eb2a765e0167ff37618ff70e13f02d7b0617ae4ac06befbbe149c972a994f680ca4dc9a92ec7efa53997fad356b9ff4ebdee629541d1f4dea62ed0d2494f9ccfdf07a9310491f61c4b3e2700b4a3c668d678329a38c2eff9d8cba431fb959e7f7655bd0fbd77d53bbbc2eb8dc51dd718ed98728a181686be122b844d3da331e329d3959b5923f7734325a021026e2754e17a15108be801465ad958dbcf21df890cfe5d5b883ca43c61cedccbdb58b849ea75374f1e918e803e577a5dc7a1c17936eccfcd3481bd2b1eb075b83237ca6f3c07c19e9af9731267be82d4898eee96ebc900d48b059d51b0dd415b1c890660a88d25f5c5f35d8e45e523e0ce3336923ab43670e35c5057d56c758876 SIG = 608b2bf6f6da05c2ac5bbfd795a2ac32c79c74153f9431dea59768ff4c225e3b693b645a506766b860850ee97ea43032b05b69e56767e8eb9d1918df9afba805 SEED = d45ee69a5f1a7cfdd0343f8770d1c6bc026f067a70dbe839a86f2aa068c33f81 PUB = fc8d9fb0e4f34793090755e0328096e01e281ea351b8d95cd9116e131a5ca54e MESSAGE = eb5ed8ab79cbfe61c25981b9d1d6b70f10b60194b4161fe17d11aff1767994aa0813e9ece2f4c5d531b99e8adf1888c30a63893eb451aaf55acd5a52ad8c401faa88d6eacf3e49470566114fd0c6a274e9544846b0ae9bfa124d7951eb26715e19253ff7edc8a70965776f23ce46031e034a200723ba3d11e11d353d7e7cd84aede267ff64bed418cb9f28c61cd0f63b6ce2ecae14b20bc6bdaed8c428bad18be4b7d66338364acd8042a8256f258a69969b8d3ca2eab3aea3706e5f21c3b1efcc254a824bb4e7ea7aba8827c8eb82786c665aa973821931ff990a63fd34a74a6d8c22a882b0b935152ccb36fcc76f4eca65d67c8680942f75dfad073439c0916065e83877f7ba209303f33548d9e40d4a6b SIG = 156c51c5f915d89b8d1400350f8f217a5c02e2629ede9f4a30b6e71d1ea7a953cc6db31ba5c778c269920b649fb4221c6d38cf2cea2a7de3ad423e04faaa0607 SEED = 8a76eaab3a21ec5a975c8b9e197a989e8e030899eb45d78968d0fb697b92e46d PUB = 2d9c813d2d81e2730b0d17d8512bb8b5d33f436cabaa13e141ca1cb785014344 MESSAGE = c6c78f2e2080461aed9f12b4f77c989b19716780fab60e6ecb9793b4bc7ed69e5f70fa6bdba16e9bd3194969eea6665abfd630deeefa3d717b6d254dd24bc97dde21f0f29f9ed34b8bd7a013380f4f82c984fdbd95af9805b744bcd952c5a71fbb57d11f411c18cc30bc3594f7ad8228cb6099394a1b6b0a818581bdf93cce58f3a4a23e55db3e69ca9d60cfb3a907fb68329e2ffb6c65f1e828d28127109c9e9fb70160f2ef82a2ee9f9bd170c51e13fd3fc1866b22c79fe6d5101217979dbe2724dcad8a9bc69acc42c112dc697bd271eea550e9e50406bfd28245b83b8f012d34db6dbdd55ae6e575745c153d6e7534901027eadc2fcc33a5287ddbca6d3aeab8972294dc6c712b9942547277340e7ad19e SIG = fceecca4b014fecd90b921b0fa3b15aeaa4e62caa1fb22729c70269232c33cef0d0aeea66432c128afb9a3646bc7f03a12774da8758398c2a0dcce0bbbf6740a SEED = 18a8f93648cdcf47133630af1e11c0ceea3de07327314c96580df775597d7a9c PUB = 2912f41ab4c87e3937a03331802cba87716b4eea14b9fba6f546d0ac2c0973df MESSAGE = 592093ac7cd671d6070b0027edac1fb015cc205d78bb603f378eb9f8aa388ca830db3cb23420c7e852db0b55241eb88a02cc627aa94143be439aab4bf2634757470406e842f20eb10f0700e3c2da364f588a8000f23850c12ce976f326d2df1bac13e95020b412b175bf74bd7ebbacf3ae55c0daebb5c010bf804feee1d7d49fae050bea55996f53cfe1f15a0cf20727db4ee311c260bad9682d7b965e27a9491f471d4a473aff646c7d424d5a0bdcbb8a0233f4b3060dd04c98ec98dfd05ec7247884e2d8e152d4ae52b3d5865d9efd6706a60e088e1e7c9f624510abc7a2045a2c7a7588e2535e73191dd5cf05421563f556a13e8236670343cd5ba4d466e245c4ee3b5a41e70c9a0f5e6ea2c559ebe61ba81e SIG = 3b77394cd69f8b45d00cfe3a79a7900628a56518b379ed8a11581fc3a376e5d66807df11e70904f696c741d21d139310fa1b89a93bdc4d2c3997991f5220ee00 SEED = 206cd2b8114aae188d81862ccec4cb92c4ef5fc78c24435a19f9ed9b8a22f47e PUB = 97a67ac2811f529456df532737d76bed7e387da83bd55459372fdfb27ffacff3 MESSAGE = 480c4800f68c79f5dfc0c3666c0ac429b30fe0c5fe848750db2171380b80c8e9fec0a054b16d08674cefe2f64ec28bb6b0596b35235575f189bee259aca766c222ac0a46cf2af75774da4e34a0b54fc2ac49ec8bedf4887cd9b7be4fdb7f686902ddfab04627e26ea2dc3d97d62a4b1546180218ed8fa113334819b5275cc54afdee44309008596507971675e6d8b8a8edec4718f2d4bd735213cbbd18791faa8054174907a7ac17d7143a4757e493beeec4849d0b836f18bb2b3c9016f25af47fb96199251720549f15d149503d41095e25f26209daac39154485c3ded7cb1a8c3e83a52f5a06ec09cf83df00726b7968f64c0cbae299512fb438560f04b3b644346f938ac8e90486614cd844b54eae078bf678b3 SIG = 73a40d9da08fb98ea25b67e721557a1a51225294d316b53149af895fa4d63cb4a3f56f688566ef6da42fd2941dffa06d497aa902165d50213a6214116299a90c SEED = 59b144a708abec972729a04a6c13f0ea020b4ed4a48298023a568958c21215ec PUB = c4f4720092ed6179a082ae4d6145df3771786efca9bd9bb79c9f6667d2cb56b3 MESSAGE = 3857bd260b8aad9d073f06765d37fe893a3f53e23de866ddac33495a39ad33ee9e9d5c22502bc1c4b5470d0e3f3a585223fe4cb93cc4ad2b5ba6d78826a53fc0253dc580a2018cc9ff1cfedbd3ac0b53292deefbc14e589acf496cb5f7670130fdbb6cf38d208953c015a0474675b724bd109f7cb89c33016751fe7aa785d099d09ab20dd5258cd764ac8daf343ce4790ead0863af43121aa527a37a11628f47869668f8eac00d80b6bf9906663d7a2899c1cb678cd7b3eb3bc80226b8b13b6e46877f38f07c3d9c86d3368baac4a6f6b93ccebcec9811474b6a6a4da5c3a5966571eed05edcc0e3fe7cd15915c91f44eee8c149ae451f375518a79fb600a971a39b9433dfa19f91931b1932275747c262eedcbd27f1 SIG = 1a80850fcbd6e643c6ba8eb684dbef7df015159228daedcf0604709186054db185aa7baacb09d6caad01638eff8e468735a60124de0c5376e94340e541a98007 SEED = 8d1621eeab83270de857335c665bbf5726e3722225fd016e23bf90ab47aeec3d PUB = becdbc024dae6a94ed4e29c80f2aff796aed8feb2c1b3790a8c72d7b048a2c61 MESSAGE = 97facddc82cccccf788c31b3305e93eba956f89613e6e53542b043267fee544c2b0a8ae8886a31b9d321a63c27623baefea840b2a8af5b2330193ffb5baf873c335528afeae2160163c851c5a2e58154a1b0569c2d1366c0710437623b0e08c686e54fc279ed4c45f3e856868375f78224c777b13d75de10d79173552425d15a561904155f2117b2f14713eb0b04648a3bdeb3302167d1973e788a06cb00d48ccb269fa71af8ba68eae55dbbfd9594d5c2b4dc13ae0321718561acdf67dc8cfcc25bc46bb66e096a1941d9335207d3f7d11e8904904fabe3a50a3883e7078047df252f38b67cd28a6ac45c7d7a1d2a1de8d45747cf09301e01cdafd0cd99a6e91b704d509fce692fbdef2f71a5ce0b35bc15c65f876824 SIG = e08d6caa5f39327d6e6652ed74dd1a37844b979f5cce747a606f5679f4898bbb7643df7e931b54a2b40ebdefe83003f61ca0f11112f023c6a3e8cc18cafe5f0d SEED = f2735d50ee3a9a65b58c8acf551663e98809ec406f73e3e7f4e73bc4ea923874 PUB = df48a5b94a07af3c2c99b8388762243233c850dc175317d602638e5b86ab49ed MESSAGE = ae31e94e7197e4e4d0239348025ed6681e513ce1a6e0aa0e5b979373912150ef113e50ef0569c483f7568c4bbc4703c5dacaa80a0de4e738383fa1f10d6d4071a31b99e6485143972316c86522e37c6887a1c307b29b0dd6f9f1b438310af9d8d7346fb41f9b2dd2e80b14c45eb87d4ed48e37a5260b52257b3e99787a13c55392ba930c08e0240e960def0c29b8550745cf149dee53a5d174ec065d2d6677dee1fc42057062c34e27ea5dbcdb861b9f670c6032c7846cec8e87a7c9520e27967b0186ee71b77ed6d029bbdd70949cec4a709329fa37fee002490cc1bc4c2df6f763f9858f33d750c5b505a67e237063c0486f9456d3c620d9ac7c98f1381de0effe41c18259504a150d68a6a28b0a3eea803b855315c9e0 SIG = 6942a7696417efaa591b95e11f02d763bef5279b932a8e2a7cbb9f583695c14ce5cc556bec66799b33cb592da4df2735f9eef2c3ceca4362164b6cc93da4e105 SEED = cad9d21a01c7e1d15df2fbd79c516eb8c3401e9fe28467cc7b21679d4e331a3d PUB = a7b55c15d6790b40536fcae5ad2892cd66b18689f499c1fdeea66d4a7df39424 MESSAGE = 70702bf19c919f9836defd7b846fd9992d8b7eb2e106aeb71e60a31b4ea25a41b212dc7de7c91cbd613d58d0595db833cfe7e50584f25569602c7744fa675d156d0f63cd2b7c089c8a00686a437169826a12dc485b38c068a8007142e5163747011a07a415683622ab1e23ce577c732ba14f401fbc3043e0693a9205c19a92298a3d9b08fb7afafae0a9f016bc750ee631a5f5da5db6f9ba2692c74caaaeb4d097e90e3c02d2e3a7fb3aa000040b7c17b74564e646bea16bad611ebc0859a3828804ab4f5cfba417d254515ca3620a3ad683c46ca6267bb49539bb30e369087e67438e9489562750dccba3aa0b1b0a6c267032d20c2adb75e68df1123b5259bfe4eac6cadca6778138a37318adb30e8d669f3bc9692cc74b68 SIG = 31927d01db9f2472f4df6f63c18ebd83c2b1aaf88d580e848854df8cba6395d3da7bd6bb9edc1fce1c7d7e1360558fcddfa93915be076efb8ea2dc5ea7b20d0a SEED = d9be842255e9a16b0a51a8674218cee7cd9a8bdf343508397f4ddb05f3fa0082 PUB = 7931bc6dfa3324943aab183d1285515919399ffe0b710677f0915d3a5be51e92 MESSAGE = ac6c55b134663e41f02a6dcb8549eaa1c013f59658d81d812f95b74009513723671945e1324f90f8a3f971369181b587bab45665f788d663ab78140c5a22c1c18d4afedc7448a748afe5bf2387003c1d65ab18482ef98922b470da80ad14c944951ce4aed37390cce79a8e01b24c7dfc1141c0eca2c7f773ed4b11806a34615513486e4ee11af08078a1b4054cf9880298608dd9b3faa1a242a452fe511604b3102c313d14cc27c6f0f8471d94555317eaa264cdf52c69e18f461e47903d21298716b172ee9cb178f08ff2d3c9c162121c2ed21d8734b2f0630d399146cbf76e028a143f2bf7bb50af0f57b9ba8021d264b00c6662f84c86cb6d5952b3d241f7dc3e700c96616cbcfb0d0e753ffd5d21ee320e65e97e25cb8609 SIG = c93845658c9560d2c0e28f282adbd4652bafd3bb2edec17c94878f7b94d3c77afec906ed292a8dfbf5f8e7c118e8f2ca33dda7909d9b695b8ff5a1c0e97ac807 SEED = cfc48cc6f65811fe7d7bba85d1cd84858fd6f7edd638f4f552363ee7685f69ca PUB = d29c10694c5e8e3f3447ed78d34dbd74a2b301373ba871b5850c333dff7bf8d0 MESSAGE = 8e7defb9d16d036bd642cf226e32773e605361c5ec4b951255788db0a042c63e5a4367d61524f10e6258991325a39ab6b03612260c3fe3df20b34202d34395bd4ed40bd61373df781a4c8bcfbd15301060f07437732333d8e49736322dee6b22438e787d8856b70c26ec57d6dade9c3c28e27220c5670e393544ed095937298dc3adc73865f777e90037bdef834716476d78f4e6cb4961a4c68a8a836338a9f5da179c4d5e93c3f70dd35eec709653dd8de37996b12056d4eefcb4b6b3c13ba984d832275c4386ebf4a8ff7f078be3d428c1e0d9b162381f06a5b7bb12704003d91f25d1d8fd43626ce70fff59d2927768a76bf7f9ef76ff95489f38edcd1c9e9b8a8b0ef66c32805776d5ae9fbd84a7af4fa6563ec70ac5733a44 SIG = 80c5d51e96d1cac8efd3459825e79c1e9f65af701d1d29e1f95b036707113b77984b7b3350f04077333c957f8fbc7d9b040c362651417b9899027cd33edb1103 SEED = 15c9f7c4d84a5a479041952e6a8cac24e76fd2d275c197e6b521929b43ba6c5d PUB = 8633c1829d29091df71fd5c0ef640572e4b64974cd097dbebbcddeba041647c0 MESSAGE = 11730dd45dda80d84d080d92e9bddaeea6878e4a0b3b512d9ea733808e1cef51d49048d6c78116a4bde3c64aceaa52beca86b331ab59e9185c70286a02bb5dd04f5c7f4e9c7e445e77458565f159c783dfd4d976a910e937789d2141d416ed3a7f608d26737a86b20b624e3c36af18d25c7d59b8d7427ec6c4d3d438d7ae0949dd7d748c1ffd6f28e8285d440422d22a3761202e9584f5cdb3504547aa4b685730c982cba213de08020a5e4e46a95fac4b481bea0b630abd030ddd335a20fe2cf7094aef4813956991913c6821f4b5410df4f133fe63e22c08092a0a65972722a27ae42011a807c327b417237c540114eecb9f0e96cda5dcf0246f1d2717f49b9cea9dc6a3da9b396f0270529226f5dcba6499918a6c289fe055fec8 SIG = 1e36bea5a583767ebd80306cab233155b7b42814b43473cf45cdc5039c939744a9694b87220daf4ccd29f25cea405e7c08db2ef17f3f034dbb49cff60283e306 SEED = 6d2d0d823f294746b9a5512e14e73c1d855b5e4bca65fe817729810cc5ef840d PUB = 1b6480a6a90dfb472984855cef6f1ab31eb7b3f13c8ac00fa556d20b53e5ae17 MESSAGE = 8772721f72eaf7f73040c068a7c3753bffca7dc2d0930c6525f425e6005c25cd4c0ff5095c9c61a5d8a1967b8c86010c884e509e6b1670f79046e22979ebd354734090d3ada21435c1f8254f7b5222cd5564f064e977640366449f4e5008f870f9c4840565bf4fb5f574c9774ba2568e71a9ccd82ffc59b694f26e7de4ce2e3fd880a0eef387931333ede00dcb065e6d0f79591a2aa956df1948a265cb95750d8a233b15c288a05487c515663f93e740fb1570fbe4bd80c68e8d9297345a8a01cdbd88f4a39bed9c5ef09f144bce5de568bf3733bc53b2039a29cb3e194501adc1c10e86383aac8b0f85c67a6689bbe1470a392476313439ca88d98c021c0eaec25fb2f9a160ce5c786170be0238fb8785dd33bfa9059a6c3702d0de05 SIG = b515f49eb32ad478692df88f07b7802c6e0e5327aa08a6366e4cb1d1e26f9e65fc81abebe2215d649100f27598273a412b624e842d8130403797e57dec975a0a SEED = c0cf799af7395bf27bafa36cab437045e39c903bf807548319ce44f287494fbb PUB = afbf550ca290c905bdd92fc8831ebe3dfeb6daae4f56005253cc50951e50edc2 MESSAGE = dbe65780e968de9e40ffb57cf59a60fd93b3f9a5e7d8ed5180adbc578ca1bc48bd9fb60a1324c9c2c1141479a0dcf0f1d07e84936526df42333c0d773e3fed9e4038de5b95ad905c92cbe040487bf55e10e1edb429a0ecc4e0e8d00a988a9cd53e2eb372f4fc4cd9537b269ba3a23cefbc8df6476e75434b81d93e8891bf417c82e363f3e4abf80a4f73aca84ac7df6337f536d63d939d92cba64be742221116069ef251abba0b00af01718bb580ddbeb79973ef10a68b4d0fa023d6ebd3079d6b32a1aa20a21e9202f27590c3f0c0cc253073c3f822aac459d39f50758b70c00710a3c98438416508522e512adaa0afd503a7ceb04fb94a4a932ce80cd5a7f11bb861263f58e5749d542a110de7c7689dfcb0c51afa9d54a58ff89f3f67 SIG = 5bba01a4c7b25542d06912de70aa1e220423fdf8338a9e693395cb6f0dc1fbfd018e3c77e50aef90a9080f30f1f5792b2431078fe6e3e00464245e17cd8dc107 SEED = cdaa50e8527dc7a50fb37e28fa8b9568c37e8567e0b499997b9aed676180c3b0 PUB = 7c56e164510268c182b423747904f1d3a5809330f6e1b29266ec46e73be1550f MESSAGE = 94fcfbaaa303dece7b908f874cc5f095061f1754bb35780db666b63ab8290811bf1c521a7f8f785ea270dfb39d0d6ed95ab71955a11ffaeaa268e081ff3e4f2425b41880a987151e678e89111350942d820c3eec36212426663be175e5286b4ad1cc804e3e3a03b9fa3e82838ebbc2615a645f2ca1468ac4a1cdbe523761e83f4381b0c8550ae5e8c8cd1fda57191436e27cb883bc64be86a9dc6110ef3401d88a7debd1b701d9c257a6826cf01e9e2922e3ae577f2834275fb0ecda80ed8cf1801e0bc5e01e26a77c48bdf46a5c4894d22ab53e741827e24bed5f0750ffad05e53f1d5e61dfd316b191d9797ef713131a8b430abe3fac5f3c4a2ca021878b15adc8c5f542114260e687a9d199d230c4e0d3fc696993b59ccfa3ffa9d8d2fb SIG = 137bd10a50ef609384fe668768fb871de741ca0f53ff8477d7ebfa90aafd5e2681fdf1b89250463c15db8e17a58825fe9427de089c34de13cd07bba18d4aa40d SEED = 0fdea9bee6288f947e0adbdda4dfb2baa03891af25024a5e138ac77984d00507 PUB = 70abd86430d7e8d63209c8b373ec4e4b79e989e6725facefbade3c7574d23cd0 MESSAGE = cf72c1a180a2bc37d8478d9a7a39acf03bf2a50790f7902f81121222d31d3ec916f4f24cef9d7c41dc021b0e8487bb892e47305e54520303e89b30b263dac4a9ba375d46c40fcf400535c959d2b746a7fc970cf65b472e84b5f1d0ebadcfa1aed6fc47facce16a366a3b1d6e516813c1960975f8f2b43042fb4eeaabe63c6f65db45ddb7db888a19a9d7ba6ca479fcd70c5d1e970f12c14f4d24fb7e2f357bd3a94aa1b868ccc0847f2eef21853e253bafbf07c4e6176a1ef077167841ebbe5629337157f39f75c71d21e7e96c51a1b16fa8dc60f0b1279fcda2641fc8591e3c492f15bf83caf1d95b2cd91332f1b4202fe72862ca2ea2ef92c11db831d82f8fc3d41fe29a76c211a758e2f71bd89d2c6610f201429f348d56e10e3b7af53e27 SIG = 80c42dd5df03b285a86ac95ce6669f786a978a813a9d7b8c6a23de76fbd09bdb66c5dd1cc9f1a176cba388d5051764a32fa27f0028ba4898068bd01a3ee17208 SEED = 03d5e466f8298ab5438a30976d1322a7215a642dd5fb4c3f8519409a7522f092 PUB = 4b3ed4db080e2a452e16912c14504424920a60975604e4f379258d1c8b193d6f MESSAGE = 1b47b70013cb53e1f8f4971e0f39563ce87edbc2cedd99e5a35585df8b00a852f7b9c97c7e4a5465fc5605ae8c5c36570a99201a7ad6031287ef0c7b2ba6e57b056d0fc8d6ca43bf6cbdab098934b403197b525d22d45e6b29c78f8d6183e41ffe197dae25ba22b06669ae05badd7e1da6932a7d054cbab3f54e5146223ad8671231bc16fe62679bd2817a6b80e653998c4949f81ff53b6173163e11da3e6d3c76d84c713225b4173d6bf06a85b6988a48be4359cb515503ca563f4353f8e7d45e4d94462c89a04a00f1b3b0ca6422d5db029c507d464834a20c78a713661d84edffc496d69282619894437b4487954cbea2aa7261e6a62b6851154a5d25fb6b4f09c59473d385ce03e91ba865eab66c58c0abb0b7a78e4be927e55460ccd70d82 SIG = 6d7e4658f26f337c98e03f13542e2f39440ff7bf8d88f3f6dfa4d64948cd96b79051492fc28f65f2cc0d23a0c4d5e2307bb1c47e11e53b371f091b69f80dbd05 SEED = 76cc18a1dafffa100586c06a7b40f79c35fe558c339c2999a5f43875cfade03e PUB = 4b9da8d2f137dc6c857a99a5998dd89dd5f05971a21e8c776670eb47bc1270a5 MESSAGE = 4522b1d82373f7a318221e7e57617503ddf44fd53997522a1d963c85b708d0b245de372ad52ec7f54f6213d271f7c91d5a1d36d134db389df0b081a06bc0c7a4875f724092793172c9115641c6d054f1d992e0fae4df58695f0ea3449d7a4b3a8857e19803fe49b6d52c9ff3746a574a2756956579f9fb809a0edec92c55e95ffefa3d05f165822f464a21999f29691f6744ac5a3ee49017880645e837edebfd2e0f24997f041145a72e2376ada283186ca2b836362977195baee30a3acc81b243f3ee376a2c4764c783667a4b1177e7951d3e3c7be4f1bd7ae8c60fd5fb0fd91f0c1c14d0d2327e8f20d92c0dfcc53870e9d99fdbf9dd9a17e882509ae7baa8653e39edc8ee569000d624cb93a0754a798d1f811f6a0ef5501a17bcf25fd0f91626 SIG = db74751c66e6b1866044dd9ae99f19e6334f179e79d8b8e0c8cd71d22cefb9eab7e3e7a9c2da225f2a9d93a313d1cbf1b7fe2597b8d702bf3017a6a6bc7b7b06 SEED = 71ad980d58ad8e7d33306689358936a372d5190b24ec7f9bde749cb81150efda PUB = fd35a75fe5abc20104691a24a4659440b55aeaea902ac3be274af27aa8312869 MESSAGE = e87ae073ff5dcc5485a19940e4e3ff263a0618a9025ad4032dfb36d171ce881f71c18a49210eb45819806142e2f00db3041835bf2c3bccf1dba02b8b5a5bdaf8fea316c0623dd48a564ec166f037d587c8c01684e5e5c0ba9dba4d23b49a0309244e282a51408622edb05704747e0cdeec976893777071098972c113a8ab639c31f1613233ee460eea8a8c10e1e6e152214529878cf1adaeaf78cf19bac71361815bf57955498fab4f0f2b7586c86f9f4c2ddf8972f9b9e0eb636d84bcc14385b2d038be55a963702efe225a50bdd0c4da92a2a6a09100ea04a211d396458dceb4487116837d139eb0f122538ed3986ad0af4da2dffc89f3269ca88538086e691e5beae9581e7c63d8e612da2c47f74dde1d94951eadb0df60c3897d2a3095c506093b SIG = 81670b1029e481e9ff3c171f05c16861c846ee79cdf2e21e3bf952bcfac97565f2b1dcedf69d2e7eb35caf5662e8bc671fbb96756a63a596264d1b7f4af97e06 SEED = 61594e24e75f996b4fb6b3e563f6a4f9915cfa65ddb199b01fed7f8ed7824ecb PUB = 8627d2141579cd2521aa076800ac354b9e3a47d71cedc8547434268225e33005 MESSAGE = bc01b08c7caa236100a012a726477d0ec389dbfadac73d5106424c5d1f3d1cef1695cfd93a7062ec8bf1067047854920162f651357bedf1cd5a92ec29bdb5dff716e8f6025515a9549ba36cdc35ced7c5c0c368e6cd92f2f10ae146a20728c374bba509641ce88cb42fff0cedfd9fd67f310f9d01a3f3690eb21db17bce67ae35c4cd24c209f09f044759d8d5a7d248e2bd966524ba8c0c28974726b43bd05de843433cc400598922974623d9acbfdc761c4c04375a952ce54caffaa96acff6d9dc278742af476e1865cb8c20d13d1c1900863bca231e44c6b0d47cb41d510f7958f48f304d03da033484a3e1f273faf6983375b7d3be03d8a0a002def6365beb2fa8ccf1a94987adcd33d0da1177fc5159b6e56d004301e921dbc12ec0a73f413cf2c48 SIG = 6302b3ff2710be306c92b9aae30d23c3d4beff394e63201e6ad11713345c4fcb5cc8d3dd10adfb82bb11a189ce7ec3e4222727624fc17881c14788d2710e1608 SEED = 54e6bbfbf8c06ff2c066318c2ebf03d506547bf43c2d7a5d4df305a3032b7138 PUB = 3b71aa1def666d9188f403f82ed30454aba5bc9f470f6eb988da187c92523284 MESSAGE = 0318d7cb4805af9821dd3f914b0e076fea04a7d2db3a59a00affead3325a2be40c1f87f53276a8552604f228b976e288b9be906a7bd25b2ffab8a8af5d0f6e08786fd034e2fe1eb7ee033979860dd1e5327287e9e615f5dc5a960f17026b56842fc8d44cad002edc8501cfb956001502e4ddc81a7700d9c0be88eb4aaa64a6cbc39de82f13c11086de1a4270d3af97284bac1caef1d3edaa1071666bd83b2ede3962d98b9d93497ddfd8e97dab3089950cf30ed11db77ad1437a0af5889d8efc44e612420e3907267df3acff4bd3fb6e8ca5badf8e72f9de39528653058524456a81da5f84982afac34bef5f71e91f8f90938a6f5f1f287716de56a0946d261e87bc775ce189e41a77baede7320a3c608fc971e55d0a773c4d848d428637f11b4e4460390c SIG = 3df4d09079f830e3f982283681ba37b50f3c73de2c5d22a291358ebb1fb854e510f63f9a48e9fff7fd8311302ea3e969394e6d49c9e3182054942f6a744cee03 SEED = 6862061be0de9dfd998118204b2b98db3ce7d7e819dbc10794af0ab2b06e8434 PUB = 9c5f7c2265dde1b25e4f27ec71580d52dc89f2c3a712bc1ad5d6d69e711e08d4 MESSAGE = 1740dde8434a0d689925679b0c180300cdbd0cf6a89ad8fde34653316cee4c571a4105c9e9e0284238fef2c38a09157c5db94340571b390adfb69ff4c0dc5053253a679d42cc1f1bf1ff429229ea0a5044c6f79564e0dd287f53f015b83187d9ad27d91039af062c437b1575a0eab6aeb8aa0d27b27665d6dea9041ff9963a3118b3298a8544e3fd69ac6877e3e4052fe4422bf03560b2c57ec531ee8b5ff53c28dbde35bb45c35077636e6f841b59d7eb77bc7791b6093858a3a80a3aa6d778dbf53db9d06119c50b71c791c0495c576d1b59d396873ed871485352c8299a359da5ee9d7f36ed1455f89851a30851bea719685aecd08f25562609dd106630735277e1d6519bb1687de8b8c68b9671452edbb3491da264cdfa0017c512d2769759cb925fb664 SIG = 965edb34e8ab8bc3204a3201d22186372de4242600297cfdb57aa1df074ec50ddf10105e9d4c89a266c34db7772aa94cba946429e68ba62bf9a0ac90f5f05b02 SEED = b2250bbcb268d2477c8312b1900fd99982baa29a68974fbf8778a1228dc97550 PUB = 44aa8df1181674b05ade980f7eddbaf3bd7422a920287cb2d2db59a063eebf74 MESSAGE = 7ef0ae1336a6fab37f99da5fa7d0dec7409c072623ead84f241d53d0596b461705fb1b3c537d36b89e8960febb4cdc0d427ce2fc1be58dbbce151e35acd8b6ace40a19822914a4bd8c4af632f136418ac49b184d55193ebcc32d0d798709b1a8fe294fba8a1fe72d976b4400d4a393242311b0f8cc994e89475b0038ae5d8914938e8f6e87c6f50b9d656c45d7b14231efed97f3c90668913670bf5be2efd5c270c7cbaf01e8572e9800978dfe2e10a2fc0440b855629bf9cd409ea941cb69226cac771b15ea77c0326848806ff8d2e201e6e26cd5f45430dadcff8f59c321c1c9c6a29b94882935447d3e6c2e8804b1161576bdf0320fe53c307d9cde426077a7677cde3c1bc83e18e60a0c4ee6dccd877c213a8e4cca640ee04929804570ae1f96157c04357a SIG = f2b8d92ed51ebd1000bf9dd3411a9fa9e7aee54c4c86e24ad0f9ad5c55643a12d680019ca03f216bd4bd32c9ce1cd8a528c3ffaa5d5b1dc91a4be56f0e2c5e06 SEED = b809361f55cfe8137fbda880fc62cbe44c216e141893346302b336045de21878 PUB = fd23e42ff06644ead347abcc1b3e03b0e88593b61254981dd8ae59454e61b3e0 MESSAGE = 17ace197d083aaf1726f53e5ef81b5a8c09222f260ee5f1f5404ab78d900d489688449b843bad3c498aac6d80b4639b76e6e81c55276a6f9c7cecd70b71aaaf2018ef76c0e30154aae86a5c86d4e8d0e4ec68cc427060bd56514f7238086bbef5bfca1f5671b18041838fd013572443dba48fbdd95ca740b0daa4327164a1e34677249708f77bd793e7caa6638b5dc9fbe6f0dfd4120209097209c93cedfaf21b6bf59ca6e99e6209639444f0e827bbcc0a61c3a237ca22a283213223ab658e712c7556238d3a5fe31722d65f5706ef6d64d73232d3043220f14e5cfd3c2c83a83d68e20274b6f96b29de040cec8475030b6a8a87d29808dd381795c3d22acf5dc193b720d95a752d9f123c209ffba004e48dd06dd8c9e172bc9e087d80bc5216c0b0b6e77031241 SIG = b5b5950d3772d2eef88e1b0f5df5ffae2f2103885e71446d346fbb5daef94967a6b7b6e4be885110065876c665b7812de46ad31ec3bfcbeaee13ed0c1e0b300e SEED = eeef8074c2eb9a1cee2f2d3bb05325546a9fb7cbe44b599461fc5885f5fd9cac PUB = 9b892941a0573b7a1673ef480f081168d9b7496a81f9177dc427ca1f84cbbf7d MESSAGE = 9ae39feade905affcbedd2e72a6f2429b3d1108e5bc1a9dbaf490a6299bccd94acc413adacc918b14afa85c78bc168cc00740c3da0e08183915f79b7fe3868ce2a7e886b32ad45009805bfb81b8c07b3b1022420c0f009b889d7fc22fd1997ae34198438ca94778575122fcaaf96e6502c33a75a129a2d0dbb073d93820d9c96683db318990be3fef4cafc890afbd9b1504c7439a08a065e7814ee4f9b6f57ee16baed3f0e3aa35dd23d3528a458919ad77048b4e2e6172346be249a50af02bc6c853304c208ae0ba02771262a0d8a465f71fa0635e53eb2ef0a847d56a0bcd7dd3fe077c92bcdca3069a4a682a2859928315ce3eb445c6072a71492ee82e172a20be0b648b756e6c775376f0c7c3df8e64288089c2f81ce9593c6e08bb1cc1b27fcbd392fc7952c55 SIG = 6f7101984fd6892e2144b7d45619830caeb6713bfab4eebbe217c5becd249bd9d752eb76e9fa995e7c71ff7df86bb260cdda173ff5deec6af204b7dde011de09 SEED = 61faeb15f857f6557862c8b8c7ef41f80545520996fcc1127b8c2491822201ae PUB = 60a290c0fc425a0874673d94f9bb1400f9dacde9954f9f5b05dd48ab747a3950 MESSAGE = 253b566eccb563bd6e480c69739b8e372519a3437254e0e5029cac86c71638f2df2a6cf9e56db2569934deba90db75547e3671747df64d6f2aaf3c110fa67a7094ccbe4cc5355f0d43235136ee26dbe37f4225d3bbfe245595280585fb548f894e86c516102580291fa7a02859557fb98eb588870828b0990ae9d74f3831da58946bc7a5ce1ba498b4e8be8989a3b50d7e8789f56b8b4fecbc2a33bfa3ef591a0fbcd932fa93e19f3a812ae5e4e3b4b242be7705a5874af73be310b0058266a378f23c1348524715b0ccc18d6634b23636c316ba6a1dd2fd5092c06716a717b54d0eb9fc7f636f85bbf225a2cf035b4b7cfddd75351682c0576c6b3ba5a1c0b25ec594e7709dd09a0079772ff3acc67fb6c1b37bb3742b726e77e80561d9ab73160b73362581da5b9c7f SIG = 31f90f50b2dc705f1d92f12ca9975d76f1b2826ada3cc185b0ed6c83860777bd8c489b59855a91f64839d49ba467985abb376c47a4908b271b8f77c58d01fd04 SEED = e6b9cd4da07cb34f30391cf68f0d87c7cfcf68f810ffa40f9739c95deb037f71 PUB = 569ede0f04630b43a04c5a66b6a5636b766c75965984a7477e15491960fdd864 MESSAGE = 69def0523afda696f8448f9c1143abc26533e68695a090df0d9e43d0c0eff43583e6f709d2043c815fbb3f96ba2b0dc3be6fecad5dd38148788e4a0385a9fe7a921fcb8ccee0e4d3aed4bc3d216d84b414f9580b02820c03d92e675e685c4b5851f363bb4df97b417c3fd90022eeafa20dfbe82964f2ff073d255758fbe567c76b2c35e2b09f8a8d7afa32c6f5ad01bc3ebf6e210606db038ecb6820ce1ea4dd529fc1adfbc2a138565ac6d0f4a4109bdd47b8aa6ef4b8bede454680d1dbdb75fe1eb2e548d5de7cb6d792fef3aa0d8480a6030b30f104d7e76b58e9f476ebf2cc832923b50c50c111c3515fc518852323426ca778a596d3195da8585d8c3aa92083313a6e6585b70c98b185b472798a61cde77e62ec272f14b0d9eb4f22f9c7c05817da6fdefe7879a584 SIG = 1e375c94bd809ca0cdd02f89ecec4e437732dd20a0a84b254eae889d8070e682d113b0be22e41e6cdc3be877680e7eeb7f0995e6622dc0b434fb0949dd994b0c SEED = 4d9044f17b5a0977dc5aa9916a924300a244a1ef7f060277ad4978351ea64291 PUB = ab9c0692a606b2567c19c30f9faa3b4cfe72fb237077767b76d3b2ae1490a6d4 MESSAGE = 7c8c7189af67327af1c6dd2c30e975f190e3b38d008b4585167e0d450740d46734587f6d208784245cc5cb062a2a277f17ebb2746f9bdf4a8237ca479ab0a430177e19ed7dd3622576b14cdc08282214fe5ee4d76b43c16ac90864c51be8aed45d7b980df7917f290fdf795846465f27fcb7e5730637944f0577c92f32375e995bc0cda9d7196f2c0c1ac8b80d12a0439963ebd2254c347703575816e7964c13d44d629280c312ea265344de38f3b18d9150f8f924afb44b6bfb9eda513d59e65e2ef18666e6c2a21c4018665befe92cae581d3cb14e23e97d830002cb90931ae0210068af394ebe351be5b817f3674bfbf40049030e4fe505d34a1d502a2c50d8e638e926c230676b7edefb6bec77b1c0ce609325287ba5fdd7a9976987bd07fc6a4344956ebf818f08586c SIG = 6fa48aea4d5b9af65af964cdb709443a11fa84f7d44acddab16e04a6fcefb27ae33c05b36da13c23de517d6e6ac574a03ea630ba4fbb958131129aa7f1354c01 SEED = 75ad76bb4c0c229a5adc79e444b13f88a96459862c8cf0ba498d0c996af94a7a PUB = f074dd2b9c1c309105ec951bb5812a91ddb54023b3809ab379c56af0461af617 MESSAGE = 0ca8c1c74128d74e9d0a7bf8964291d074917f2f9920efb911520567642a50a615abcbd00aed4abbfef1a983cce333e1d0df3e6404fb9043c6803914cd5fffbc66a0790c7878a24089a571f895662a1d18be3f01ff97fb3323334b6f5baf96551448e4090d033c464294d09133b151d5b5c6321b50e2241de0ef6f882889ccf4ad3540d5a1e3f7548fb13be71c16516606e79d0449c2a08e5dc23148843c84e97ed24069161c8e75208f33e95b3e10d1d49a2faef9d986ab62809f62ad39c7cc871f375a4f5a6faf104d7e11b890cfb0589902685216ec07cb8e8e9e7a7c43635e23212b69ca3b7ed54f0b97949e3d9a6662f8e4b3ab09cd495294c331c047d86ee785ff658bcd7fcf9c480605ce05e810068d60fc9b26b5f063eb9000d2657a5094284ac80f1375d0b66d6f5f SIG = 0c4643a8be6dc22f4beb6bcc70c6172ec7608378653cb4e99f3ae795eadf4e982a297609ca7938f5df632b095628cb75062d3d51fc0f3323bfa7b22ec4d47205 SEED = adc6e9b2e103b62c24ad4346410e83a1a0bd253e4abf77911850c6d9666e09f9 PUB = fce316e33c910821beeddd634bedc58ee57999a76ece384605283b99b543b78b MESSAGE = 8cccd98ebbf2439ffdfac41687638faa444e1ca4b63d13e898eaa8355492f28813ab813fd01510e112be106b2045d30f63335d248904d521de181abac03e3d2cb2d16c44b3b012a0c51f9901aef9056c724d7a2c6b2acb0a07555940e4c6e21154890611adeb6489f461d3e5ecd1af5a4d2b0adaf41747436eb414757a8fe4775674e3c6e5de4569d6fc6c788e10905eba32c270a393e6f721a765294e2ac99a9b6e534d3df08d1db97d602ac3195cb0b77f5bd4acaf737fadd6991f0688abc74918047574eac28289739a664e0e0e20574a2c25fde49d14539db1cedd4a9204a70acff0a62c8f25cd768ffab15c4db316840a4d1bc92e212670be07c5bdcf537590607dfbbbb4d9f98b89da0b4df7d88f3eca4814d16bfa20c8d2fa94f9f259f2ee2d3a83c9e4171b1a262c4b99 SIG = cb017d6d2682c9854366259aa35f30d491cfaa930998c297dbddc6aded5b3d401cf76d80d8a2764de131718b6e0c481d7196bc72579716b0c0f6ff053e68c50c SEED = 37fc1beda4060b6c57883ddba0776c2bcf5ac28a651326021cca97723730fbb0 PUB = 7bd7bf1c99dc82e06f08bb454d8fb288a57927e07ff1b12af15ee2c12fbb6b3d MESSAGE = 3dfcac0265a024a83cb932674489a163aac314bf3d969f27596e451733b99deba5eeb779210baf95bf545a1ae6b8a915860693ee890f939320e06a844483d18c6a1bcd03c638bb7d1fe2a82eb448a311b1302ea6428f54a39f45a4d560be1557a2b254c45c137f45cc68356836e21bed0b7f73a518ce09db0be393927c339bf2a4b5987539404ce650284de12e3b553b262efe23848332ccfdc35e791a0ab43f139c71ed0fcb2d173bb377ee46b1a9dca9277e77df855f2830251e31e26acd86763c8d7eac22c882fc174f2b5e75ca6ad1ade03f942bb2a13bf541906159158c68363c7480c5b27a99320f8283a2699d4369c071c50dbd90b7792e4772efbc0b195bce84cc4dcfff7072a48968db69f9feddd0f9ced659eb5db7167f35f988cec114887dcbfdf27d02d300b3e1abec SIG = a01dd65fada27039f168b123419d8abfbda48c572ece24fda06e1a5ec31e084f4ee1cbf9961e88ed51e189fcb7f5f235de1e5b28d08f2bfca190b0f019ecc207 SEED = 8d42f4ddd2bbd2b827b0a0d31d8f758ebd13a1b9b3712228948ca610bb8858e5 PUB = b7354898794f9db0a8af6eeafcdbdf011d3fbef0212ad938a4a4ad27ab16ebbf MESSAGE = e3a2bebc0496d8974a8f4061880369314ed9e440c1b77e26fe5071ce694ffd2136db0c4d5e880e6000083a75c90d3cf72b9cf5a2b1a9002c2701a2ff59b0699a8f42d79dd8a5fb71a8125453d91fb80080a3f0a16584282f17ec7dfdc2e5c69c4d9bdf484d55944dae273f211cfb76ad37da45871365439af35eea1fbecd4ca679b59b5e01bacf49c7f4e5efaa406ba1daeb085482af5ded89dc6885ffbe3d14d2931b83897e28ad06e5564e2789baea81bd932aa279fe8e324b9a8ef111c2abe2f137d4bb50d8ab76cebc0bd982a23919751ad4d49e88eb14173d3310289a872317e4a451e88d54320891870f15b2d53324430877a9fb5b49bb929f211c5b89764dd9c3a595a1451e9f85a238540002566e53a99ed1e6ddc9b4853f455edb4cf1980d56bbdc1313a36e76ea9cbb048a SIG = 70764be39c6dca0f067abe1eca490fda951fd4e9499695266e270b9b05eae706ca8d1ca6a92d7c488ec6ad8ba11457a42a5e31702a9c2bce892dc40535c09f01 SEED = b62de5a1acfe4ca2d1f0c132afcbdae66fb29a02f297fbc2407fadbbf2454200 PUB = b63b2d0bf355f7b6d0bac07403411c40afbbb2f707503b3fc2cee8a1c7d0a838 MESSAGE = e659e51d7b193c4b8e2b3ed73a9d7557ed2bab6153883ab723592f730a914567142b3fa435db3219f83a542dc7a4bd805af666ea865b853146f8e3a9fe870711f90d12b0693492af2a1edf99a16458f781f1266ec437a5296a822ca9d69ce844b5c59097a2a56f3eb8fd273a636116db774300922d45b744657a692f5e8bfbcb06d2422818aeb51e7cda68acfbeda16e7c79580dcccde24e8e3d601b16e063b43a6d0d1407552f7504f5be19882e4ffe32344f5f473e73a8f6ed37b0d8d9e5e0a0dc9828395bcbd8f3a4e3124869249d058be0e045de0b1e12b1c83ba0aa227c95b82bf742c3eac0152b33e6d19be8b33a35bf705daab10622a90aed022ea6e439ed50a9308437929924ba3ab111ad0caa6feb0a6eb165824ebdb0866571efc07e5222ed8686b14d9270bf76b945d52014 SIG = 5cdb00e98de73eab480be42f8a8a6163809a0d37101b6a5a4eed6a0c92030d09a5562c729080ce6f6594c8fafb1f594772db7a90a9e7da15896e82f70569390d SEED = 9732059d7bf0200f5f30412430336be4ef1e3cae62938ad08729ce3ba714cfd4 PUB = 0de8425f5e30b2b8aebb8072009a30cf0411c3c8238f4e4208760c56c33e434f MESSAGE = 1a13e7ab603b48eb896fe17173fb31950b0dcd5a35ffdbe1371c7a5bfba593317589d9652d88797729180b8d0e515abfe6548f160421e537d5c94aef2b34c7ebb097420003bc0f361b423e7e14630a803c118202540049f68c9cf46fae0368d162e400d77bb4523cf6c753b975c245bc99ed2f413a9d06c2da6ce0cc0987b6406b809e8eb319033d2de9131dee3b1b7b5c95d653ced8fccf998da1768511eca4d3c5f735adab96503b3551803e4922635095ef811be4c08a6cbac917cbe6cd91a4ae5a330ccec0e8e815371217a3de62f2d2d61466219833f33447132f4d43350c58cbaf422475edb128c56d80a495726b1fdbc56551eb72d0f4fec26ba8bff5eed6774b85039a5292834b5d1cc1b09ba0a3954d29323673f5e71276a12ac4c579355bf1ecca48e6a716b9fcecdc565c51b9 SIG = fba1749b641dd4df34664bc43c00468c7d75e84afad72de473fd1e9c87da15ea604fc2549a1a867fa80850e9c2a59cd99053886760a8d9764b84dd672676720d SEED = 9c7f6f379e3857007e2ac6324cbbced57ac9eee4477813f83a81fc8cefa964d5 PUB = a54ba396d687634d3eccf41c5782494f5f10a521a1e5d388523d80eeba5b0b2b MESSAGE = 3f2d3072fe7383e541551ea9abdbaeae6a464ae6b9f0ba786a441b2d08da5bcada3c5424dc6931d6b39523e2de0a0c2e4e6b5b8cda925e5eac938416a2c51bf13d49531d7ec7114b1c82feaf90f3f87591e397d02702f8ec1b30d99f5be7d2203e4fe4db2ea47e7b4589d8ac506248d7347466edbc96ea32bf3a6ea7502dd60c9e84902715ab2c6ca68f5b00e1d909d83aa6ab662d8aea870ecd861fec69f2eec0ae677d2995b0ed688faa8ef78244e0d1195697b07122ceaa11f5a6ea58fbdfa2e2ec2df9d18693ae96d47127556e91f0864982c13419b04a63f208e730d26951882aefe001bca3408bd9862748c6cc876c28cac3bb2eb3395818c2091e0fbd7a0b4468c6b0d00cd008c11c3c3ad01080a1f5a40ae2e4b0c3a071efc8e1d1ba6ace6d4df0ff19829b0c680b3aeb759177ed34 SIG = 65685f9ca5982e15a22ba3c83a0348348482dfae57cea178f0780c057baebe4af632f984540a26019a7fb34253c9ece7ff308ada233ce0686347ab5b21ce570b SEED = a478f35abb73727b6be6ee5e56eec323c9517882fd6919360ebbbf5d5cb8b83a PUB = 7a6e266a54d135dda0009ccda8a94a4712ae5cb14761e8436e97c4b7814d8e8c MESSAGE = 0173a34050b43748061ff8f5a3d7c43b6360847786e8bb75e536fb47b645b214f221ba24d83d28bc025024663e534f90f6e83a93d8bddeda2cd8808155652a908c437c2db6f3ed4912f57ca5b97928a73be964af59df4439854bb006fc295a87b7b72239c7fadfec40715509d98579daadfb8d524b4cec6620705efd4104c297144aea722974e12c5ecee5391ef2d93ac2b124e4ac496147c8b70363585d7078ccc53e2ae593350bc25548a0542526ab00afe477a0f4b27397c72bc74a8a8ab156e62b8bb47c3fbb4b34913e459687476bf33142c614702107ffe2cc01e25fa30275e1e2e63cea9168e4a47c02de097d4d853b27675c5bb330b94a974ead85e2bdee8ee17cbb5653346658df2f91f6bd739491dd71988b3a976a3e2e7a9d137410f4acba9feb5f11798c9a43b6adce14365a7c6d SIG = 9d16fd40b9f8dd9b4a1a8c6d703b9fccbb940b1e0ae77a5970374af0cf726f4479fd30d7dff5cf53494d9a296ab6b9e46ea6c136b4db2c71c21b97c1c8254d0a SEED = ffe825148c0959b3a68de86ad8e8af7fa5e078f363dc124213c90020da0c9089 PUB = 139152a0bd22962dd919ae3e0b1620e03c033c2ad0a3979ec6bcd1705e23d598 MESSAGE = f125780d0cd088530f0c87b70bd42ebab56adb5ad4345f929ae5deae07fb55322153a8f023d38843bf5d6a93fe993eee71bc2ee563b25a50918f03efdb5dbf7269add69ded3e66953895620d9b6cf46ba2348f8d66d7f092235e378c1e3edfebeb78084bc8dea013f9933aae14a041948276d01f1cb5834b0e590e13d931d19292bb1d8041ff2fe2e1171a2e0b9a059821d0924dde7f3b1bb59813f5e3c63520aafb8801ba62c7097d4d8cf437a568a7f0087c6ea0fce6e568c4883f1cd12c749d06a6feb278f1086a8b04769921f78a9959062ab06f98ee80c2c7854ffa760f86a89ee1a51266053d195e61bb1dbd18dd89ff394e408ace0f641a395d56118ea72b7d8adf78b1655ecece7e8250e8a3a91cb8fca0d9ce0baf8980a387c5ed4318663280e5b4531f3187c47eaea7c329728ddd0e40 SIG = fe4e89ee31786c0a3d3de3649bb93f0b8aef1caf5a832ec5e4067810705adddf539b8f4e05ad08cf3479e45b42c96528f6d59a4625703ddbf15b63093965d80d SEED = 49aff421a7cd12722aa84c48c1fb1c5f8d9e277d0a99ecbc9348c3aaa74be422 PUB = 88d2c26266f493bc67578ca0b1f51160cf0fdb6a09a906db9faa686f11f8208d MESSAGE = 70a1ac144b75fda75586a79c36fd39cce5f5cae2e6375852d3b62a9630336a293ea6d2ac6e5b57da21ef364a595bb0750f5bf4d2b320676423870e4b8e0869601f16680619048c4ede276da69f205a70176e25ea04bd089763e709ba343fc8831e52044eabf9441e6997f8ba1aeb9ef0f491170667a7f5fc9627cbd0551b76be27283a4b0c5f667846688226a115ee8020df08042b19b59fe551316a6cb6916860b9ecd74154b4051038a17352372ec14d3c957d2ef50ff786189a8aeb9c08f45eeb5eb8b040339974aa9798c425d7becb228c447a6d0b3cef271893e0f7076e223a7e87c6a3d270a033bc97a4565edce0aa91ffc3f7801775a6f29b230245bd71fa034353de372395d1bfcbdebba081330f7c076be99c2cf4867f15b78d52f46fc7391c9cb95e5d64643baffe72a8e3a650667fbb3e SIG = 749181284df05dbe5974b91782a1a76ea08642cb0f0c98db586c575c210cdc8b651bd34b757ae38e4b6be9465235bd0eca430e26c3eede561c6e824dfa200e0a SEED = 703a6e2b62d0090c61d8659b6a963e03c9d62c1b38f7d70e5f9ff05590cd0360 PUB = 370c21de6ef2fab534ada999869c90bc9b92ccbf249b79d39d95441d1ede210a MESSAGE = d42a1756e84df4b4e9773f86f7674a2cd78e71e40aa8f644e6702dfbc2c2c5ca90fc242e9cb0099cc8f2c2d3136baafc0ff695482fdacdef9f565610b6e1900722f435c6385b35e9f6c436ca037e03f64e2233dffa58db3b91cc1daa0bb0c54c8a43e469d2cff7fa2bf8f5d1d877931089c82ed89aba42f2ee2b86e445cfd09f4cd78b35191bf467e784eef75dc987e046d37d4d4e8e9bbe14af80d03a1f40898384b9d3279fac9c57fd9c7eecbe19a5acc15033b84e07fd0e409bdbd5a57f65641183a6c0a8ec426d1f1d223166ff0a1900b2e92b7d85835d019d17775e5093ccd126f90f63cb7d15cbeb531324219cd64ded6714b21a65371af07210dfdf0e4e58ddc7d59f4cfa65c421d814ee2c9bf6dbf64873d579b09ee5dcedd733063e039ac9a5f9ca4c2525a4cc8e984da7185e2d64fad81c8a SIG = e5fd64da028800c6ceed068a5e596f1621c70a8cb138b31b32647eb4b07bd2ecc5942c18844f367033f67398e314ba2c7ccf299c069787777025d845f2aad60e SEED = 76849c188e3edd0ff5f8fb874dc0456645518445e41a7d6833e616c3c48c9868 PUB = d670e2ea07db60c22ab79a93ebf49d22a6245ee3af07b3be584eda694c37729e MESSAGE = 1eccb0bc8eca3ab5bee68c5f8caa34536766c705f50827db7ac375d4fe30b58ffb7e2fe490cc71a8ff86c006d6174d05793ab8a55dd51b06de417bc0ac452cdc7cfb0bb00362b6765d20db23eb1848027064a1d9091d3b10ed776f28b76768bdfc08f0bc511f76faeba76cfc4cb5c83dc9ebe8a8d79edca923eccd524009cafedc90e3ad87d1392e1fccf4e60ccab95dc0ab54bf44245a007a96d46634b1b2965b829c3d7daa765972b54a7b365b6f34d77d7176acd8d894f6b417091b6c00edb7a4e81379988bfcecb692e9c3c4310a7e240e5c1063cde113f22a684a50a112ff47d3898812efb92637072b86163ad89316d221195acbfad0a03a1fbc2d967fe83f84c8459fccd490b9c5b3e55d27e9484e943c417f2128d73701da28f49fd3683f33a39cdee234bd305b9491e2f3eb621be3dd1dbbb31b SIG = 7141399d51daa6eb4519bf3f01b233920fa908fefa612f0cd7d5af8a9a3c44190e3f6384a8d14d37c97030ef5018cf8aee8aeb1569a73d84862a59b7df72fe09 SEED = 83ae48ad70da0bb3cdf87481ee2c0c8571c2ca986712f8bc2329e9a3e33383c5 PUB = b785309000df95f5a04f7d89c4113301057adaeeb29bcd28d99371b537bba2f6 MESSAGE = b7521d3f71c679fa7037fe7488a641f6b97c49454acc8e36b903d8f9ebb54d89cb56efd19e04ba6a7c8f48a7d3ec9decd3f1cd0faf6e978118e6adce9c6c6be63c6a6a1ae21651828479a46bc9a0f7943040f940a0d470c8e577c5d575cb53c1bf3ab1feb050dcb6fef0ba4447f299fdb9f27ecb0714ecfefd74bad7b122a462c24a209848a03389074578c5bdc36396d809b0f14018da64917e6bf87ef405c8f3e333ff9c3baf6339667620794bb4743f0514b5de7d7fdd947a7e3501ee88efad159e33a1072fbb99c7c71e9d13a502d5a07c4f817eeb7f0c5319aa41a96d5ff4f15a73c29b571fe211090e172c8db518624612a5c371a9d7cef6de35ebef96e88e1a78af3bd5dd35251ab54d73718f3e70d2d59021531dc73184f0fc69c2e92965844ec27c1c02af5e9a3469de355db2256e0ec2a4eba30a SIG = 43332351d3fb7b45fcf37c607d442ea80dbda2cb69c2884f424e65ea3a331ed8472d4368405cb736b2d6685ad782e239fe833ed789a2923185166f608342ee05 SEED = 39e56a65623a0aebade0da12ce1df378bc924073f73a549effaebc465d1a78e2 PUB = 83da8ad50bad09eb3e94c725df3cc3a119736adc859ca1a10503f48ff2fec596 MESSAGE = a96dc2ea3fa1351492a4619d9194681f8ec400a97158244482653838ccb7e156a82d564368f83a6ee1be46bc34b817200e8464c3d12b5ef2c50b19565b881c4c3d4563fb947eb47c3ee9c1ee7853269874455bfacba305f307d1ac5309eeae5c07fa5c4d428edbc8b9528c4415243a9ef580aff8fcfb12000a71fceee89de97f90279529bcc822ed3cb34c82ba5fec15f4945663636d67b5feceacc31d25f98aea07f7800d5a1034251cb91dd0963ec2c1a54773a4d96c18357f8d101de58e932f8c6cdde8e3cfcef5a7443fdba7b78320403c0196844724a612183e34bdd808ce7b958861ca37115730eaede1fd0baabe976efefd0365fdf926776c536f47ff80de5c18291bb7e9f1b913ffd1d94468b789752fae6ca897c0cca53ef1e731d00c8bdbe8929ea6b1dce1f31a20688d37b0f3a2b4153b306bdba1 SIG = 398e8260011f57d8ac8c58d5457bc652c7414aaf6fb2f426b7899056605c0afc28392423b2b571f5e6c3c7f6d60245e53ebd03bdc5ad3c1ad8738cb32214d00f SEED = 4b9921852f409a323ae38175e8d76a211fc4d9c654178eea3baa7a767a6fda06 PUB = 4c723e436b6bd97f44af52503b21cc50d5f6ad6cfc8288345dde8054e995582e MESSAGE = 3f33d8fb83e68741090a37bedd745cf141aaaed8c92ffa742a52561777885805ace14246ab98a8cb598c9ce3de9b29bae5fa04b1cf828de11aff80a7ef8a3a38aede4f3c3563a25d049badcad5ed7e47fdbba6e111307eebe9ef4906bc989728b76e84afe808e6653b271e21104aa665f1898dd2aab23090e22b4e344a2616fbd8ee4ad8ed8108395eba817fbd14fec5c17dcf56b8220856b2b833e091407d5089b35ddf34b86ff7dc9fde52b21ef12176ef3370b7f3a0a8cb1b058a51aefff3d279d80f51a68bfb592587b45c5c63a7e4d625b887de486a118316c3b6a238575f92ac5b1c94c3f5dbbd96686000d6d39cccd558d420e4d447a8cbc4bc7b8c6a03af0f0034fb3518d93800f0f713e4b13732e16ada51801d7e559cf839d1058f64955698311399345416850dddcc5601a684fd09e6afd3944f5e19 SIG = cbf1f1642df950eb71fd09590d34c265922c58bd8026bba3fc0e594a6bb1f2b90da3dc1d5f6b6d5b405a896d1dbb71b8685c4dfc444acaffe65ab8331789f507 SEED = 1bff652a2c8309a393ac11da3aa97fb078bb284ed5e1b8ccc983652ef8556cd0 PUB = aaabdc091fc3682354201744e9b73fd2a6cfb281914bf2c70ec3dc1dec7216b0 MESSAGE = 48d02698a97bdcb3ef078dcfcf5750005f1702d300e7e89bc436e381113401f852b8b4acff60ffbd4ab46d202168d98b8735e79cb350e35b070ff6bdcafd954b551969b6b1a70c9131ebd40d96140291d8d2b091540a8b18d8e5465915c25dbc6b5c9a687942533c372c8b4e95a953677169b950edd3464375cd43132ff9bd541ee22bd418ce23195f65d8b289f633ec8d71e1a801b06c3c827f627e723d2199100ce73e8e4a4440e778317a474910793b47b10ffb55db7f281c7d7a033bd80048b82673b87cf95e99422ba628688f3c971890ca15d12f572fa1977a17307069da304ead3026eb01042668890d17008cd1e92c46cbe9c857e7193de3aba3911e4f86fe0a1698ab7cdb9251a8424b2848b96ad81ea239d365fdea92ea5c0473d0a6bb1e371356bdfad2d0350336d3e1947c936fd0c25195445011731b SIG = 93c9c33493fc64172d51e16a0a1cd729a0d99e3cb864e89a42987f39dd8cd26545fdfe37581911e803677da4c55b0a683ddf62b728f8f30685ae58f628ebe609 SEED = 002fdd1f7641793ab064bb7aa848f762e7ec6e332ffc26eeacda141ae33b1783 PUB = 77d1d8ebacd13f4e2f8a40e28c4a63bc9ce3bfb69716334bcb28a33eb134086c MESSAGE = 5ac1dfc324f43e6cb79a87ab0470fa857b51fb944982e19074ca44b1e40082c1d07b92efa7ea55ad42b7c027e0b9e33756d95a2c1796a7c2066811dc41858377d4b835c1688d638884cd2ad8970b74c1a54aadd27064163928a77988b24403aa85af82ceab6b728e554761af7175aeb99215b7421e4474c04d213e01ff03e3529b11077cdf28964b8c49c5649e3a46fa0a09dcd59dcad58b9b922a83210acd5e65065531400234f5e40cddcf9804968e3e9ac6f5c44af65001e158067fc3a660502d13fa8874fa93332138d9606bc41b4cee7edc39d753dae12a873941bb357f7e92a4498847d6605456cb8c0b425a47d7d3ca37e54e903a41e6450a35ebe5237c6f0c1bbbc1fd71fb7cd893d189850295c199b7d88af26bc8548975fda1099ffefee42a52f3428ddff35e0173d3339562507ac5d2c45bbd2c19cfe89b SIG = 0df3aa0d0999ad3dc580378f52d152700d5b3b057f56a66f92112e441e1cb9123c66f18712c87efe22d2573777296241216904d7cdd7d5ea433928bd2872fa0c SEED = 25b0f0bb3dcb422a6f3c6c220eaadb11dbfe489c2d455b276cefe8cba057f9f3 PUB = fe03c9c4394adc74b13f47654bead8bc855958b4194fdab2097ac1b157933c05 MESSAGE = 54d99f969efa8870fc20fa9a962bb372619c324439728af3139c2a07e8c1b29c1e4eedc2d40ba722f63ce37670362af6f5202add668c4fb4d62fa8bacbc7d07ff3bd38c15a01064259cc34134861632967460541a99b8d5182bf59347b5a59879aa3b091a1f3e04135bd6301be5226d4895e5e9c2b15e48e5ecdf44129e6122853a606fc118466fa720b5ab165635c3bde04d74289274fa03547accbde780e1fa0bf2c56f8436a53e73878a424a29aa9de385dba419ae6a5d12e004276152b58d325b302400a55333c38cde4908ae1d0121cbeca950809c543314277c1485e68d9f9c0a962d1b1e0dda1d4a52b56f8308a80b92acc9f4ebc3ed45d91a129da8675621af676703def3b84113183b2e3a8c56157f243f13980f3d1756fea7668c91503d35c839a2120c79ec954fb546d7b542f987289534ffdef62d47fd5ec SIG = da50d5242bf51c3951780cafd926d67bdf5640d5d3bb08433831d56e48e2592a1c375968bb4d2fbea56145abf2d82991363b1565fa1effe214011a686e39950e SEED = bf5ba5d6a49dd5ef7b4d5d7d3e4ecc505c01f6ccee4c54b5ef7b40af6a454140 PUB = 1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842 MESSAGE = 16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64 SIG = 279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07 SEED = 65de297b70cbe80980500af0561a24db50001000125f4490366d8300d3128592 PUB = ba8e2ad929bdcea538741042b57f2067d3153707a453770db9f3c4ca75504d24 MESSAGE = 131d8f4c2c94b153565b86592e770c987a443461b39aa2408b29e213ab057affc598b583739d6603a83fef0afc514721db0e76f9bd1b72b98c565cc8881af5747c0ba6f58c53dd2377da6c0d3aa805620cc4e75d52aabcba1f9b2849e08bd1b6b92e6f06615b814519606a02dc65a8609f5b29e9c2af5a894f7116ef28cfd1e7b76b64061732f7a5a3f8aa4c2e569e627a3f9749aa597be49d6b94436c352dd5fa7b83c92d2610faa32095ca302152d91a3c9776750e758ee8e9e402c6f5385eaa5df23850e54beb1be437a416c7115ed6aa6de13b55482532787e0bee34b83f3084406765635497c931b62a0518f1fbc2b891dc7262c7c6b67eda594fa530d74c9329bad5be94c287fbcde53aa80272b83322613d9368e5904076fdbcc88b2c0e59c10b02c448e00d1b3e7a9c9640feffb9523a8a60e1d83f04a4b8df69153b SIG = 7a9b736b01cc92a3349f1a3c32dbd91959825394ff443c567405e899c8185ce8fad9500e1fce89d95a6253c00477435acf04bff993de1b00495def0834ee1f07 SEED = 0826e7333324e7ec8c764292f6015d4670e9b8d7c4a89e8d909e8ef435d18d15 PUB = ffb2348ca8a018058be71d1512f376f91e8b0d552581254e107602217395e662 MESSAGE = 7f9e3e2f03c9df3d21b990f5a4af8295734afe783accc34fb1e9b8e95a0fd837af7e05c13cda0de8fadac9205265a0792b52563bdc2fee766348befcc56b88bbb95f154414fb186ec436aa62ea6fcabb11c017a9d2d15f67e595980e04c9313bc94fbc8c1134c2f40332bc7e311ac1ce11b505f8572ada7fbe196fba822d9a914492fa7185e9f3bea4687200a524c673a1cdf87eb3a140dcdb6a8875613488a2b00adf7175341c1c257635fa1a53a3e21d60c228399eea0991f112c60f653d7148e2c5ceb98f940831f070db1084d79156cc82c46bc9b8e884f3fa81be2da4cdda46bcaa24cc461f76ee647bb0f0f8c15ac5daa795b945e6f85bb310362e48d8095c782c61c52b481b4b002ad06ea74b8d306eff71abf21db710a8913cbe48332be0a0b3f31e0c7a6eba85ce33f357c7aeccd30bfb1a6574408b66fe404d31c3c5 SIG = 4bac7fabec8724d81ab09ae130874d70b5213492104372f601ae5abb10532799373c4dad215876441f474e2c006be37c3c8f5f6f017d0870414fd276a8f42808 SEED = 00ad6227977b5f38ccda994d928bba9086d2daeb013f8690db986648b90c1d45 PUB = 91a4ea005752b92cbebf99a8a5cbecd240ae3f016c44ad141b2e57ddc773dc8e MESSAGE = cb5bc5b98b2efce43543e91df041e0dbb53ed8f67bf0f197c52b2211e7a45e2e1ec818c1a80e10abf6a43535f5b79d974d8ae28a2295c0a6521763b607d5103c6aef3b2786bd5afd7563695660684337bc3090739fb1cd53a9d644139b6d4caec75bda7f2521fbfe676ab45b98cb317aa7ca79fc54a3d7c578466a6aa64e434e923465a7f211aa0c61681bb8486e90206a25250d3fdae6fb03299721e99e2a914910d91760089b5d281e131e6c836bc2de08f7e02c48d323c647e9536c00ec1039201c0362618c7d47aa8e7b9715ffc439987ae1d31154a6198c5aa11c128f4082f556c99baf103ecadc3b2f3b2ec5b469623bc03a53caf3814b16300aedbda538d676d1f607102639db2a62c446707ce6469bd873a0468225be88b0aef5d4020459b94b32fe2b0133e92e7ba54dd2a5397ed85f966ab39ed0730cca8e7dacb8a336 SIG = dc501db79fd782bc88cae792557d5d273f9ba560c7d90037fe84ac879d684f612a77452c4443e95c07b8be192c35769b17bbdfca42280de796d92119d833670d SEED = 1521c6dbd6f724de73eaf7b56264f01035c04e01c1f3eb3cbe83efd26c439ada PUB = 2f61a26ffb68ba4f6e141529dc2617e8531c7151404808093b4fa7fedaea255d MESSAGE = 3e3c7c490788e4b1d42f5cbcae3a9930bf617ebdff447f7be2ac2ba7cd5bcfc015760963e6fe5b956fb7cdb35bd5a17f5429ca664f437f08753a741c2bc8692b71a9115c582a25b2f74d329854d60b7817c079b3523aaff8793c2f72fff8cd10592c54e738df1d6452fb72da131c6731ea5c953c62ea177ac1f4735e5154477387109afae15f3ed6eeb08606e28c81d4386f03b9376924b6ef8d221ee29547f82a7ede48e1dc17723e3d42171eeaf96ac84bedc2a01dd86f4d085734fd69f91b5263e439083ff0318536adff4147308e3aafd1b58bb74f6fb0214a46fdcd3524f18df5a719ce57319e791b4ea606b499bfa57a60e707f94e18f1fed22f91bc79e6364a843f9cbf93825c465e9cae9072bc9d3ec4471f21ab2f7e99a633f587aac3db78ae9666a89a18008dd61d60218554411a65740ffd1ae3adc06595e3b7876407b6 SIG = a817ed23ec398a128601c1832dc6af7643bf3a5f517bcc579450fdb4759028f4966164125f6ebd0d6bf86ff298a39c766d0c21fdb0cbfdf81cd0eb1f03cd8a08 SEED = 17e5f0a8f34751babc5c723ecf339306992f39ea065ac140fcbc397d2dd32c4b PUB = 4f1e23cc0f2f69c88ef9162ab5f8c59fb3b8ab2096b77e782c63c07c8c4f2b60 MESSAGE = c0fad790024019bd6fc08a7a92f5f2ac35cf6432e2eaa53d482f6e1204935336cb3ae65a63c24d0ec6539a10ee18760f2f520537774cdec6e96b55536011daa8f8bcb9cdaf6df5b34648448ac7d7cb7c6bd80d67fbf330f8765297766046a925ab52411d1604c3ed6a85173040125658a32cf4c854ef2813df2be6f3830e5eee5a6163a83ca8849f612991a31e9f88028e50bf8535e11755fad029d94cf25959f6695d09c1ba4315d40f7cf51b3f8166d02faba7511ecd8b1dded5f10cd6843455cff707ed225396c61d0820d20ada70d0c3619ff679422061c9f7c76e97d5a37af61fd62212d2dafc647ebbb979e61d9070ec03609a07f5fc57d119ae64b7a6ef92a5afae660a30ed48d702cc3128c633b4f19060a0578101729ee979f790f45bdbb5fe1a8a62f01a61a31d61af07030450fa0417323e9407bc76e73130e7c69d62e6a7 SIG = efe2cb63fe7b4fc98946dc82fb6998e741ed9ce6b9c1a93bb45bc0a7d8396d7405282b43fe363ba5b23589f8e1fae130e157ce888cd72d053d0cc19d257a4300 SEED = 0cd7aa7d605e44d5ffb97966b2cb93c189e4c5a85db87fad7ab8d62463c59b59 PUB = 4889855fe4116b4913927f47f2273bf559c3b394a983631a25ae597033185e46 MESSAGE = 28a55dda6cd0844b6577c9d6da073a4dc35cbc98ac158ab54cf88fd20cc87e83c4bba2d74d82ce0f4854ec4db513de400465aaa5eee790bc84f16337072d3a91cde40d6e0df1ba0cc0645f5d5cbbb642381d7b9e211d25267a8acf77d1edb69c3a630f5b133d24f046a81bf22ff03b31d8447e12c3f7b77114a70cbd20bbd08b0b3827a6bbcf90409e344447a7fbc59bdd97d729071f8d71dcc33e6ef2cbab1d411edf13734db1dd9703276f5eb2d6aa2cb8952dd6712bfae809ce08c3aa502b8135713fac0a9c25b1d45b6a5831e02421bba65b81a596efa24b0576bd1dc7fdfb49be762875e81bd540722bc06140b9aa2ef7b84a801e41ded68d4546ac4873d9e7ced649b64fadaf0b5c4b6eb8d036315233f4326ca01e03393050cd027c24f67303fb846bd2c6b3dba06bed0d59a36289d24bd648f7db0b3a81346612593e3ddd18c557 SIG = bf9115fd3d02706e398d4bf3b02a82674ff3041508fd39d29f867e501634b9261f516a794f98738d7c7013a3f2f858ffdd08047fb6bf3dddfb4b4f4cbeef3003 SEED = 33371d9e892f9875052ac8e325ba505e7477c1ace24ba7822643d43d0acef3de PUB = 35929bded27c249c87d8b8d82f59260a575327b546c3a167c69f5992d5b8e006 MESSAGE = 27a32efba28204be59b7ff5fe488ca158a91d5986091ecc4458b49e090dd37cbfede7c0f46186fabcbdff78d2844155808efffd873ed9c9261526e04e4f7050b8d7bd267a0fe3d5a449378d54a4febbd2f26824338e2aaaf35a32ff0f62504bda5c2e44abc63159f336cf25e6bb40ddb7d8825dff18fd51fc01951eaedcd33707007e1203ca58b4f7d242f8166a907e099932c001bfb1ec9a61e0ef2da4e8446af208201315d69681710d425d2400c387d7b9df321a4aec602b9c656c3e2310bff8756d18b802134b15604f4edc111149a9879e31241dd34f702f4c349617b13529769a772f5e52a89c098e0dca5920667893a250061b17991626eb9319298685be46b6a8b68422444fa5a36bcf3a687e2eccb9322c87dc80165da898930850b98fc863cada1aa99c6d61c451b9ccf4874c7f0e75b0a0c602f044812c71765adaf02025395b0 SIG = 985ca446ddc007827cc8f2852cbd8115ef8c5975e9d7ce96d74dfed859aa14a4c15254006bea5e08359efe2625d715e0897ee5a16f151203be5010418637de05 SEED = beedb8073df58f8c1bffbdbd77ec7decb2c82a9babecefc0331507bdc2c2a7e7 PUB = b27e908b805e296fc30d2e474b060cd50c0f6f520b3671712183bd89d4e733e9 MESSAGE = 35ca57f0f915e5209d54ea4b871ffb585354df1b4a4a1796fbe4d6227d3e1aba5171ed0391a79e83e24d82fdafd15c17b28bf6c94d618c74d65264e58faaacd2902872fdd0efa22e8d2d7ce8e3b8197f0c3615b0a385235fa9fd8e4564ee6e6b1650b4cfb94d872c805c32d4f3a18f966461d3adbb605fa525884f8eb197627396ba4d995d78ac02948a0eaabb58519b9a8e2e7985cd1de2c71d8918d96a0168660ce17cddf364e3ec0d4bd90f2104751a1927ee1d23f3e7a69840ed040b00e5f6e4866ec58813149cc382aebf6162608c79574d553f47230e924a0ef1ebf55d8e1a52abb62a2d7ac86027c7c03cc83fa1949da29e2f3037ab986fd2fffe650e3149babae5a50b1ee9696f3babec72e29697c82422814d272085500fd837fe3c7a973ef4c169af12dd7f02700620bb045bdbf84623f326350570b3cadbc9aea4200b28287e17ab SIG = 8c890cccadc7760e1e82e43c44b3dc0b685a48b479ae13cc0a6b0557d0fb1cbabba63d2a96843412ea8d36c50acbf52b92cfb2dce49dc48af6ddcf8ee47a8608 SEED = 9184ef618816832592bc8eb35f4ffd4ff98dfbf7776c90f2aad212ce7e03351e PUB = 687b7726010d9bde2c90e573cd2a2a702ff28c4a2af70afc7315c94d575601e5 MESSAGE = 729eb7e54a9d00c58617af18c345b8dc6e5b4e0f57de2f3c02e54a2ec8f1425ec2e240775b5ab0c10f84ac8bafda4584f7e21c655faecd8030a98906bd68398f26b5d58d92b6cf045e9bd9743c74c9a342ec61ce57f37b981eac4d8bf034608866e985bb68686a68b4a2af88b992a2a6d2dc8ce88bfb0a36cf28bbab7024abfa2bea53313b66c906f4f7cf66970f540095bd0104aa4924dd82e15413c22679f847e48cd0c7ec1f677e005fec0177fbd5c559fc39add613991fbaeae4d24d39d309ef74647f8192cc4c62d0642028c76a1b951f6bc9639deb91ecc08be6043f2109705a42c7eae712649d91d96ccbbfb63d8d0dd6dd112160f61361ecdc6793929ca9aef9ab56944a6fa4a7df1e279eaf58ce8323a9cf62c94279fff7440fbc936baa61489c999330badcb9fc0e184bc5093f330cbb242f71fb378738fea10511dd438364d7f76bcc SIG = b3c24e75132c563475422d5ea412b5c1e8e6e5ea1c08ead1393c412da134c9a1638284ea7e2ca032fe3d3e32a9066a8c8839903f6ef46e966bb5e492d8c2aa00 SEED = 354e13152ee1fe748a1252204c6527bdc1b1eb2eb53678150e6359924708d812 PUB = d45ff6c5fb83e7bb9669aa8960deb7dbc665c988439b6c9ef672c6811dc8bcf6 MESSAGE = 8e5fccf66b1ba6169cb685733d9d0e0190361c90bcab95c163285a97fe356d2bdcde3c9380268805a384d063da09ccd9969cc3ff7431e60a8e9f869cd62faa0e356151b280bc526e577c2c538c9a724dc48bf88b70321d7e1eeedb3c4af706748c942e67bdabdb41bec2977b1523069e31e29b76300288f88a51b384b80cc2526f1679340ddec3881f5cd28b0378d9cd0a812b68dd3f68f7a23e1b54bee7466ac765cf38df04d67441dfa498c4bffc52045fa6d2dbcdbfa33dfaa77644ffccef0decdb6790c70a0d734ec287cc338cb5a909c0055189301169c4f7702c05c0911a27b16ef9ed934fa6a0ca7b13e413523422535647968030edc40cd73e7d6b345b7581f438316d68e3cd292b846d3f4f7c4862bc7e6b3fb89a27f6f60cd7db2e34ec9aae1013fe37acff8ad888cb9a593ef5e621eae5186c58b31dcfde22870e336d33f440f6b8d49a SIG = de2b46e65f3decef34332e500f2e11306fbdcf1be85a1c1ee68ba3045dcec2c7be608d22927da1f44c0e2083ae622cf3c29d893887994efcfa2ca594f5051f03 SEED = 7ff62d4b3c4d99d342d4bb401d726b21e99f4ef592149fc311b68761f5567ff6 PUB = 7fdfdb9eca29d3f01d9486d7e112ce03aa37b91326a4283b9c03999c5eda099a MESSAGE = 99c44c796572a4823fc6c3807730839173774c05dbfc1492ed0d00509a95a1de37274b3135ed0456a1718e576597dc13f2a2ab37a45c06cbb4a2d22afad4d5f3d90ab3d8da4dcdaa06d44f2219088401c5dceee26055c4782f78d7d63a380608e1bef89eeef338c2f0897da106fafce2fb2ebc5db669c7c172c9cfe77d3109d239fe5d005c8ee751511b5a88317c729b0d8b70b52f6bd3cda2fe865c77f36e4f1b635f336e036bd718bec90ee78a802811510c4058c1ba364017253aa842922e1dd7d7a0f0fc9c69e43fc4eaeffaaf1ae5fa5d2d73b43079617baba030923fe5b13d2c1c4fe6fac3f2db74e2020a734b6121a0302fce820ba0580ce6135348fdf0632e0008df03ee112168f5cfa0037a26a1f69b1f1317edf2a3ab367455a77e00691215d7aa3133c2159d3da2b134cf04f0defbf07a6064011e64dd14d4f8f064356655428804c2771a SIG = 058f79927fbf6178724815c7b11c63baaa90bcc15d7272be082f8a9141861c816433055f6cf6491424853f9ec78bb91ace913a93411b4e5ed58bc4ba5715c60a SEED = 6cabadd03f8a2e6ebab96a74f80e18164e4d1b6baa678f5a82e25604af989aaf PUB = 2a4a3179564194e00100c18bc35351d8b135bbae5b32b28fce1d7b6766ca4b32 MESSAGE = 279f78cf3b9ccfc6e1b01e1a82f50ed172e9a8e1e702bb15661dd7dc3a456ff7a7a7fdfb081db3867079630c7f70fd753292ec60ecbf50632e9aa45b996505c66e6dc3c6ae892e21b6a8705e4bbae8f16a3378554b31fdb0139dcd15c96a8a7e4b88756a86d18db5dc74fd7691197dd88e2c7d5df52b049344cdc477c9cd7e89eda99ccfb1d00814d0152b9654df3279372ca5f18b1c946f2894a76b079ddb1c3cd61fbb969aeec9193a6b88fb7d136c07f9821e5c1074b4e93bcaf6fa14d0d1d7e1707589d77ec1337206e53a1f06cc26672ff95c13d5ff444766931ba30a0afdcdadd2098e9c41fd87a3f23cd16dbb0efbf8092ce33e327f42610990e1cee6cb8e54951aa081e69765ae4009aeed758e768de50c23d9a22b4a06dc4d19fc8cbd0cdef4c983461755d0a3b5d6a9c12253e09568339ff7e5f78c5fdf7ec89f9186a621a8c0eed11b67022e SIG = 4e65c6c1d493045e8a9250e397c1d1d30ffed24db66a8961aa458f8f0fcb760c39fe8657d7ab8f84000b96d519717cff71f926522c1efec7f8b2624eae55f60c SEED = 0fa0c32c3ae34be51b92f91945405981a8e202488558a8e220c288c7d6a5532d PUB = d6aee62bd91fc9453635ffcc02b2f38dcab13285140380580ccdff0865df0492 MESSAGE = 53f44be0e5997ff07264cb64ba1359e2801def8755e64a2362bddaf597e672d021d34fface6d97e0f2b1f6ae625fd33d3c4f6e9ff7d0c73f1da8defb23f324975e921bb2473258177a16612567edf7d5760f3f3e3a6d26aaabc5fde4e2043f73fa70f128020933b1ba3b6bd69498e9503ea670f1ed880d3651f2e4c59e79cabc86e9b703394294112d5d8e213c317423b525a6df70106a9d658a262028b5f45100cb77d1150d8fe461eed434f241015f3276ad7b09a291b4a7f35e3c30051cbf13b1d4a7fa0c81a50f939e7c49673afdc87883c9e3e61f5a1df03755470fda74bf23ea88676b258a97a280d5f90b52b714b596035bae08c8d0fe6d94f8949559b1f27d7116cf59dd3cfbf18202a09c13f5c4fbc8d97225492887d32870c2297e34debd9876d6d01ac27a16b088b079079f2b20feb02537cda314c43cb2dca371b9df37ed11ec97e1a7a6993a SIG = 7e9ab85ee94fe4b35dcb545329a0ef25923de5c9dc23e7df1a7e77ab0dcfb89e03f4e785ca6429cb2b0df50da6230f733f00f33a45c4e576cd40bdb84f1ae001 SEED = 7b06f88026fa86f39fce2426f67cc5996bedd0cfc4b5ebb1b5e3edbb47e080aa PUB = 3f1469ee6a2e7867e2e9012d402cf5a4861497c01df879a1deb1c539830b58de MESSAGE = 71175d4e21721297d9176d817f4e785d9600d923f987fe0b26fd79d33a5ea5d1e818b71f0f92b8c73afddabdcc27f6d16e26aafa874cfd77a00e06c36b041487582bb933760f88b419127345776ea418f83522254fed33819bc5c95f8f8404cc144ebf1486c88515409d3433aaf519d9920f5256e629419e9a95580a35b069b8d25533dfcbc98ad36404a951808e01378c03266326d120046975fde07daef3266caacd821c1403499d7fdf17c033c8d8c3f28f162b5f09dfdaca06285f00c6cb986dfdf5151aa6639608b5b13e78d65a4368585b16138754fbd113835a686cd066c2b89bb0953c24d50e77bf0fc457c1e0fcf5d44da8db9a88f062be3b688d5cdcff1d1c00e81ec9d413882295b341fee8fa427dc109adeb5f284eec202f1bef115bf96b1782d3ccdeb682b69bf92d170c007d5df80e1ed962f677dc24a145a1e4e829e8dec0104e5f78365944 SIG = 42f133e34e3eb7032a133ed781537ec62e44a5ce8381e5e0bf9e13a914a4b2c757811d6d3b1e86672424ea4230d10f7c610abb7069e61e319b4066a2bd7bc900 SEED = c3f5e149968a24f4de9119531975f443015ccca305d7119ed4749e8bf6d94fc7 PUB = 39aaccdb948a4038538a4588322f806bb129b5876c4bec51271afe4f49690045 MESSAGE = c46370e37f2e0cadcf93402f1f0cb048f52881ba750b7a43f56ab11ce348732fb57e7f9aaf8dfcbe455e14e983c248d026a27e7f148d5db5a53f94635702b895127771047a876d14107386c5e0ff8933345bbd7a936d990d33efa28c2ec4e4864ffd2ff576f7c88f954cfc1c459e883bb712dae3cdf6632066f1f4d13a509615b3360cadc5a307f23e52a51b40a6feebe0b18d0e9ee4e348f33cd81a8def222f6a59b12861d335bd9af85cc004be46f1d3a424f4870ae9dc587e5a4ade136b9370649348c33ac3bf1febeebffea37085ed59cac9d9e696470b234609e9a10a9d431ff91e69cb5135fd117ff58a36539744ebe70cea6973c00c7a4d57b62f4a7136d731b8e46ff18ec0ed69070031905075d8541d568cfce6eeb76242b7819a7b6a93552111bb88f165527cfa6966d39fcbe0a7dea008e39c7a3e577ab307cd1d0ea326833d52654e172955f3fcd4 SIG = 5fa2b531677b00b85b0a313cbd479f55f4ab3ec5cfce5e454d2b74176ccc3399c899f9d6b51ed4c1e76185ac9fe730c4b4014044f7041185bc3c85722eb2ea02 SEED = 42305c9302f45ea6f87e26e2208fd94b3c4ad037b1b6c83cf6677aa1096a013c PUB = 3b97b1f11ce45ba46ffbb25b76bfc5ad7b77f90cc69ed76115dea4029469d587 MESSAGE = d110828d449198d675e74e8e39439fd15e75bf2cc1f430abfb245836885bafc420f754b89d2fbbf6dd3490792e7a4f766073cfe3b302d089831ace869e2730fde45c2121ec3ef217aa9c43fa7cc7e9ed0a01ad9f1d2fc3613638ca9fc193c98b37455bf5dbf8f38b64708dfdca6c21f0975f1017c5da5f6434bda9f033cec2a631ab50318e017b170b240bf01eb8b36c7e1cb59e7736ac34444208132a8f59e4f313d65d849c6a4fdf13e20ecaee3823e589a171b39b2489497b06e6ff58c2c9f1dc5d3aa3bd10e6443e22d42d07b783f79fd43a46e1cde314b663a95f7246dea131fcd46d1dc333c5454f86b2c4e2e424dea405cc2230d4dcd39a2eab2f92845cf6a7994192063f1202749ef52dcb96f2b79ed6a98118ca0b99ba2285490860eb4c61ab78b9ddc6acc7ad883fa5e96f9d029171223abf7573e36230e0a81f6c1311151473ee264f4b842e923dcb3b SIG = 18d05e5d01668e83f40fa3bbee28b388acf318d1b0b5ad668c672f345c8eda14c2f884cd2a9039459ce0810bc5b580fe70d3964a43edb49e73a6ff914bbf040c SEED = c57a43dcd7bab8516009546918d71ad459b7345efdca8d4f19929875c839d722 PUB = 2083b444236b9ab31d4e00c89d55c6260fee71ac1a47c4b5ba227404d382b82d MESSAGE = a4f6d9c281cf81a28a0b9e77499aa24bde96cc1264374491c008294ee0af6f6e4bbb686396f59068d358e30fe9992db0c6f16680a1c71e27a4a907ac607d39bdc3258c7956482fb37996f4beb3e5051b8148019a1c256e2ee999ebc8ce64c54e07fedb4fbd8953ebd93b7d69ce5a0082edd6209d12d3619b4fd2eae916461f72a4ce727157251a19209bbff9fbdbd289436f3fcacc6b4e1318521a47839cba4b14f7d7a21e7b5d6b6a753d5804afcd2b1eb7779b92abab8afa8aa4fa51caec0b85dcd0fc2a0676036d3f56630a831ffeb502861dd89161c708a9c006c73c930ce5b94756426ff18aa112fb4eb9a68500b48d4eedbd4167b6ffd0a11d49443a173ce9d949436748fc0634f06bb08b8f3423f4463dba7b4d199b64df578117f0a2645f0b2a1e2ada27d286f76733f25b82ed1d48a5c3898d4ad621e50ed9060daad40a39532e4d1bf162ce36804d5d4e2d SIG = 1edef9bc036971f1fa88edf45393c802e6c1a1631c8a06871a09a320821dce40beca97e53a0361a955a4c6d60b8ca8e400c81340911ccb4f56284041cdbb1804 SEED = 2dddb6b8fd04fa90ece1a709f8418f2e5d0c9c43afe7cfce19e6ad15a73476f7 PUB = 8059de6a7c4776489ecc2e7d707ffce30285bf30a23f78d72db49cfd6ed0d492 MESSAGE = 474baa590a4cd72d5424e51d8257b3d44325bc4c5063a0033c86ebbe99ed7212184c19944d082a115379dd4cece973faa0bca6485bd25f3744a719e70aa0291e1b5a96e637c140616a98263357c76b6eb0083fe51414e386870d0fdc7dd9abe4ff6fb5bbf1e7b15dac3e08e2615f655c3104ceb32a4cc2c9e9c43cf282d346ac253ccc46b635ae040973b49735720ffb890469a567c5824e0c00d7ccd5509a718092a906461c4d6163eaf422418f5fc6e009fc3f529ac61a2f89bb8e0ed45d940c4c2331ff8d8e1d6d58d417d8fc2656a02e8701aee75aed918724eebe4a2cf4744c5c401e217023df68a6f6a0228bd05a679a697d8de7036b9ed269090d3c65486afb91e27954eb15b964665ede7ad008f12fb3a9d0e69c13b4254f43819e0818a4195f68b8a38ae81f3fcb1879c95ab4cd0ffc38e381089260cca967ace5a085b457ab5eb363852101377570f9ac9e38 SIG = c634ea7bf72e895a2e796e2834201415b8b45e05e045559284eb9052c0e84f62a5a9f0c9764f7576788c7228b19ef517c195497325a48a9344b147c12fd75509 SEED = 5547f1004baedfce5cfc0850b05302374aad24f6163994ecd751df3af3c10620 PUB = 7ce620787385ee1951ac49a77352ee0d6f8c5cd47df74e9e3216a6324fc7cf7f MESSAGE = a6c17eeb5b8066c2cd9a89667317a945a0c7c96996e77ae854c509c6cd0631e922ad04503af87a3c4628adafed7600d071c078a22e7f64bda08a362b38b26ca15006d38acf532d0dedea4177a2d33f06956d80e963848ec791b2762fa99449b4f1a1ed9b3f2580be3ac7d7f52fb14421d6222ba76f807750c6cbb0b16f0895fc73d9dfc587e1a9e5d1e58375fbab705b8f0c1fd7df8b3ad446f2f08459e7ed1af59556fbc966dc249c1cf604f3e677c8a09d4363608774bf3811bef0642748c55c516c7a580fa3499050acb30eed870d0d91174cb623e98c3ad121cf81f04e57d49b008424a98a31eeaaf5f38e000f903d48d215ed52f862d636a5a73607de85760167267efe30f8a26ebc5aa0c09f5b258d3361ca69d1d7ee07b59648179ab2170ec50c07f6616f216872529421a6334a4a1ed3d2671ef47bc9a92afb58314e832db8a9003408a0487503fe4f67770dd4b6 SIG = 29df3ad589009c667baa5e72dabb4e53cb7876de4e7efe5cc21ead7fa878db57f97c1103ddb39a861eb88653c1d4ec3b4306e4584b47b8bc90423119e7e4af00 SEED = 3dd7203c237aefe9e38a201ff341490179905f9f100828da18fcbe58768b5760 PUB = f067d7b2ff3a957e8373a7d42ef0832bcda84ebf287249a184a212a94c99ea5b MESSAGE = db28ed31ac04b0c2decee7a6b24fc9a082cc262ca7ccf2a247d6372ec3e9120ecedb4542ea593fea30335c5ab9dd318a3b4fd5834299cf3f53d9ef46137b273c390ec3c26a0b4470d0d94b77d82cae4b24587837b167bb7f8166710baeb3ee70af797316cb7d05fa57e468ae3f0bd449404d8528808b41fcca62f5e0a2aa5d8f3acab008cc5f6e5ab02777bdcde87f0a10ef06a4bb37fe02c94815cf76bfb8f5cdd865cc26dcb5cf492edfd547b535e2e6a6d8540956dcba62cfea19a9474406e934337e454270e01036ac45793b6b8aceda187a08d56a2ce4e98f42ea375b101a6b9fcb4231d171aa463eeb43586a4b82a387bcddaf71a80fd5c1f7292efc2bd8e70c11eaa817106061b6c461c4883d613cc06c7e2a03f73d90fc55cdc07265eefd36be72270383d6c676cae37c93691f1ae3d927b3a1cd963e4229757ae5231eea73a9f71515628305410ac2593b325cc631 SIG = 4c036935a96abc0d050d907bedbe9946fb97439f039c742e051ccf09add7df44d17da98c2ca01bdc2424da1e4debf347f8fff48ac8030d2cc07f9575c044be04 SEED = 282775df9ebbd7c5a65f3a2b096e36ee64a8f8ea719da77758739e4e7476111d PUB = a2b49646033a13937cad6b0e914e3cec54989c252ca5643d076555d8c55e56e0 MESSAGE = 14cc50c2973ea9d0187a73f71cb9f1ce07e739e049ec2b27e6613c10c26b73a2a966e01ac3be8b505aeaad1485c1c2a3c6c2b00f81b9e5f927b73bfd498601a7622e8544837aad02e72bf72196dc246902e58af253ad7e025e3666d3bfc46b5b02f0eb4a37c9554992abc8651de12fd813177379bb0ce172cd8aaf937f979642bc2ed7c7a430cb14c3cd3101b9f6b91ee3f542acdf017f8c2116297f4564768f4db95dad8a9bcdc8da4d8fb13ef6e2da0b1316d3c8c2f3ed836b35fe2fd33effb409e3bc1b0f85225d2a1de3bfc2d20563946475c4d7ca9fddbaf59ad8f8961d287ae7dd803e7af1fa612329b1bdc04e225600ae731bc01ae0925aed62ac50d46086f3646cf47b072f0d3b044b36f85cec729a8bb2b92883ca4dfb34a8ee8a0273b31af50982bb6131bfa11d55504b1f6f1a0a00438ca26d8ab4f48bcddc9d5a38851abede4151d5b70d720732a00abea2c8b979 SIG = 15763973859402907d8dcb86adc24a2a168ba3abf2246173d6348afed51ef60b0c0edeff4e10bcef4c6e5778c8bc1f5e9ee0237373445b455155d23de127a202 SEED = 4730a5cf9772d7d6665ba787bea4c95252e6ecd63ec62390547bf100c0a46375 PUB = f9f094f7cc1d40f1926b5b22dce465784468b20ab349bc6d4fdf78d0042bbc5b MESSAGE = e7476d2e668420e1b0fadfbaa54286fa7fa890a87b8280e26078152295e1e6e55d1241435cc430a8693bb10cde4643f59cbfcc256f45f5090c909a14c7fc49d37bfc25af11e8f4c83f4c32d4aabf43b20fa382bb6622a1848f8ffc4dff3408bb4ec7c67a35b4cdaee5e279c0fc0a66093a9f36a60fdd65e6334a804e845c8530b6fda363b5640337d027243ccfb3c177f43e717896e46ead7f72ca06aa0ff1e77247121baf48be9a445f729ca1390fc46151cbd33fcbd7373f27a6ba55c92cbf6945b09b44b9a4e5800d403070ae66048997b2197f02181a097e563f9b9acc841139258a258bc610d3bd891637356b2edc8c184c35c65af91aaf7b1c16d74a5f5f862548139254ecf550631d5f8849afdb5b64cf366ff2633a93f3a18c39b5150245fb5f33c9e4e2d94af6963a70b88f9e7e519f8fa2a0f2e3749de883d0e6f052a949d0fc7153a8693f6d801d7352eb2f7a465c0e SIG = 552c7347bdfe131646ce0932d82a36d2c1b76d7c30ee890e0592e19f9d18b9a56f48d7a9b68c017da6b550c943af4a907baf317e419fbbc96f6cf4bfad42de00 SEED = 2770aadd1d123e9547832dfb2a837eba089179ef4f23abc4a53f2a714e423ee2 PUB = 3c5fbb07530dd3a20ff35a500e3708926310fed8a899690232b42c15bd86e5dc MESSAGE = a5cc2055eba3cf6f0c6332c1f2ab5854870913b03ff7093bc94f335add44332231d9869f027d82efd5f1227144ab56e3222dc3ddccf062d9c1b0c1024d9b416dfa3ee8a7027923003465e0ffaefb75b9f29dc6bcf213adc5e318fd8ba93a7aa5bfb495de9d7c5e1a196cd3a2d7721f8ba785aa9052a1811c7fcc8f93932765059cab9c9b718945895ef26f3ac048d4cabf91a9e6aa83ac14d43156827837914eb763a23cba53f60f150f4b70203ec1833ff105849457a8da7327661fb23a554164e05fcf0146b10674964be6f6aa0acc94c41ad57180e5180d199bd9102f55d740e81789b15671bbd0670e6de5d97e1ae626d8a0ebc32c8fd9d24737274e47d2dd5941a272e72a598928ad109cde937bf248d57f5d2942983c51e2a89f8f054d5c48dfad8fcf1ffa97f7de6a3a43ca15fc6720efaec69f0836d84223f9776d111ec2bbc69b2dfd58be8ca12c072164b718cd7c246d64 SIG = f267715e9a84c7314f2d5869ef4ab8d2149a13f7e8e1c728c423906293b49ce6283454dd1c7b04741df2eabedc4d6ab1397dc95a679df04d2c17d66c79bb7601 SEED = 4fdab7c1600e70114b11f533242376af7614b4d5da046ac4bedea21d8a361598 PUB = a25c9a94d6e4ecd95a4bd6805f762eb1c457a8d45d243238b1839cbba8f441cc MESSAGE = da405890d11a872c119dab5efcbff61e931f38eccca457edc626d3ea29ed4fe3154fafec1444da74343c06ad90ac9d17b511bcb73bb49d90bafb7c7ea800bd58411df1275c3cae71b700a5dab491a4261678587956aa4a219e1ac6dd3fb2cb8c46197218e726dc7ed234526a6b01c0d72cb93ab3f4f38a08e5940b3f61a72ad2789a0532000fac1d2d2e3ad632ac8b62bb3ff5b99d53597bf4d44b19674924df9b3db3d0253f74627ccab30031c85e291c58b5fa9167522a46746fc307036745d4f9817786e5d300e6c5d503125fea01dec3e3fedbf3861ca2627a0518fb2b24e5a7a014178719e9b345f7b249ce3a413280c8deb674f59a25be92a8ab6400c7c52b0728ae34e22b2ec200c1cbaba2ccd8af29249d17af60c36007a722fc80258a7bebab1cdaad7462a8b7588c2f7e27c6d07afcf60117fed11bd6859e75e3b4fcee3981881e95dd116827dd4b369af069d3c8f2676f8a SIG = 5075c090cfbeb6b01802af7f4da5aa4f434d5ee2f3530eebb75c85e08621f83edc08aa96693894a4277633ba81e19e9e55af5c495daa5e1a6f8cbb79c01c7207 SEED = 264504604e70d72dc4474dbb34913e9c0f806dfe18c7879a41762a9e4390ec61 PUB = eb2b518ce7dc71c91f3665581651fd03af84c46bf1fed2433222353bc7ec511d MESSAGE = 901d70e67ed242f2ec1dda813d4c052cfb31fd00cfe5446bf3b93fdb950f952d94ef9c99d1c264a6b13c3554a264beb97ed20e6b5d66ad84db5d8f1de35c496f947a23270954051f8e4dbe0d3ef9ab3003dd47b859356cecb81c50affa68c15dadb5f864d5e1bb4d3bada6f3aba1c83c438d79a94bfb50b43879e9cef08a2bfb22fad943dbf7683779746e31c486f01fd644905048b112ee258042153f46d1c7772a0624bcd6941e9062cfda75dc8712533f4057335c298038cbca29ebdb560a295a88339692808eb3481fd9735ea414f620c143b2133f57bb64e44778a8ca70918202d157426102e1dfc0a8f7b1ae487b74f02792633154dfe74caa1b7088fda22fa8b9bc354c585f1567706e2955493870f54169e0d7691159df43897961d24a852ea970c514948f3b48f71ee586e72ec78db820f253e08db84f6f312c4333bd0b732fe75883507783e9a1fd4fbab8e5870f9bf7ad58aa SIG = eea439a00f7e459b402b835150a779eed171ab971bd1b58dcc7f9386dadd583de8dc69e267121dde41f0f9493d450b16219cdf3c22f09482ce402fe17ca49e08 SEED = 2ca7447a3668b748b1fd3d52d2080d30e34d397bb2846caf8f659ac168788ca5 PUB = ab331cd40a31d0173c0c8c1c17002532807bf89e3edb6d34c2dd8294632b9fbc MESSAGE = a82bcd9424bffda0f2f5e9eae17835dbe468f61b785aab82934737a91c5f602cb7c617cdffe87cad726a4972e15a7b8ee147f062d2a5a4d89706b571fa8aa2b95981c78abeaaae86203fa2c0e07297406ea8c27111a86dbe1d5a7c3b7ae930904d9890f6d4abebd1412a73ad5feea64acf065d3e63b5cbe20cf20bbd2d8b94f9053ed5f66633482530124446605918de66455e8cf4b101a127233c4e27d5d55bf95bd3195d0340d43531fc75faf8dded5275bf89750de838fd10c31745be4ca41fa871cb0f9b016706a1a7e3c44bb90ac7a8ad51e272389292fd6c98ad7a069e76e3f5f3e0cc770b9e9b35a765d0d93712d7cdabd17e5d01dd8183af4ad9365db0a0fa41381fce60a081df1c5ab0f8c18f95a7a8b582dfff7f149ea579df0623b33b7508f0c663f01e3a2dcd9dfbee51cc615220fdaffdab51bdae42cb9f7fa9e3b7c69cc8ada5ccd642529ba514fdc54fcf2720b8f5d08b95 SIG = f93ada15ae9cd2b54f26f86f0c28392aed5eb6b6b44d01a4e33a54e7da37c38e8d53366f73fd85be642e4ec81236d163f0d025e76c8bbdd65d43df49f09c1f01 SEED = 494ea9bcce26885b7d17d1fc114448f239f0ce46e5f247b4c999fa8629692472 PUB = 6901e5efae57536ba5fdd96b59657359065f25d391a1aa8cdc0d38bb5d53c139 MESSAGE = 3badbfa5f5a8aa2cce0a60e686cdce654d24452f98fd54872e7395b39464380a0e185557ea134d095730864f4254d3dd946970c10c804fcc0899dfa024205be0f80b1c75449523324fe6a0751e47b4ff4822b8c33e9eaf1d1d96e0de3d4acd89696b7fcc03d49f92f82b9725700b350db1a87615369545561b8599f5ea920a310a8bafc0e8d7468cbf6f3820e943594afdd5166e4e3309dddd7694ef67e694f34fc62724ff96ac3364176f34e8a02b4cf569db5b8f77d58512aedabf0bcd1c2df12db3a9473f948c5c3243309aae46c49efd088b60f31a8a72ad7e5a35acc5d89fa66807eb5d3ba9cdf08d4753cb85089ee36f5c96b432b6928352afad58012225d6157f9e3611426df921b6d1d8374628a63031e9ffb90e42ffbba021f174f68503155430152c9155dc98ffa26c4fab065e1f8e4622c2f28a8cb043110b617441140f8e20adc16f799d1d5096b1f50532be5042d21b81ea46c7 SIG = 548a093a680361b7dc56f14503b55eeec3b3f4fd4ca99d6aedce0830f7f4ae2f7328539b34c48fc9760922333dae9c7c017e7db73b8faa6c06be05e347992b06 SEED = 00d735ebaee75dd579a40dfd82508274d01a1572df99b811d5b01190d82192e4 PUB = ba02517c0fdd3e2614b3f7bf99ed9b492b80edf0495d230f881730ea45bc17c4 MESSAGE = 59c0b69af95d074c88fdc8f063bfdc31b5f4a9bc9cecdffa8128e01e7c1937dde5eb0570b51b7b5d0a67a3555b4cdce2bca7a31a4fe8e1d03ab32b4035e6dadbf1532059ee01d3d9a7633a0e706a1154cab22a07cd74c06a3cb601244cf3cf35a35c3100ba47f31372a2da65dcff0d7a80a1055d8aa99212e899aad7f02e949e6fee4d3c9cefa85069eaff1f6ad06fc300c871ab82b2bedb934d20875c2a263242cdb7f9be192a8710b24c7ea98d43daec8baa5553c678a38f0e0adf7d3ff2dcc799a1dbad6eab1c3d9458a9db922f02e75cfab9d65c7336dae71895d5bb15cac203f2b38b9996c410f8655ad22d3c091c20b7f926d45e780128f19747462abc5c58932fbb9e0bc62d53868802f1b083f183b8a1f9434986d5cf97c04e2f3e145730cba98779c7fed0cab1c05d5e4653c6c3f6736260bc78ee4372862ffe9e90371d762c7432781f35ced884a4baca05653ef25f25a6f3d5628308 SIG = dcdc54611937d2bd06cacd9818b3be15ce7425427a75f50d197a337a3b8ba6714ef48866f243bd5ac7415e914517a2c1c5a953f432b99db0e620d64f74eb8505 SEED = 8c34b905440b61911d1d8137c53d46a1a76d4609af973e18eb4c5709295627bb PUB = b69a8b2fdf5c20e734c2ffb294bc8ae1011d664f11afe7fbc471925cf72fa99d MESSAGE = 30b57a389b48a0beb1a48432bff6b314bded79c4a1763a5acb57cea1bfb4c6d016cf090f5bd05bbd114e33ae7c17782dfa264f46c45f8c599c603016fe9ff05b6b5a99e92fe713a4cd5c41b292ed2bb2e9cf33a440542e821ec82cbf665c3f02e3dc337d7fdb58e31b27cb2954541468814698510df18c85c81fad12db11ec6b966f4930da5646b991db97445097da30dab61cda53a41083cb96add19de6c5eec323bca9d3530e38c00b35af7360077601be6ac97f3030f930a27b90fe8b6911bae389065adc15e1882300e2a003274d23182d5efd5ba4b9130c07bd5c65fecb8b5cb7eb38836b318befdfd77de4d6ca0181f77ae5740891683225f549dd8426145c97c5818c319f7ab2d868e1a41ceab64c085116069897bf2ca3667652406155ed0646431b6de1ccc03b4279ae4d326679265dce82048e7298e1f87fcec0768ac0f5d8ff84f7210be54d411af8edea7217f4e59413121e148c60da SIG = 3e0b72073dc9375eedcca6c4fc1cd315938a050c92716bd2284f4629a962beec0b7d7cf16ab923d58f5b90d3901a8e5c75c8f17dab9998e007d8c49511973d0e SEED = 77a83e18c9f000eeff7deeac959ecba2206c0aa39d2f0e2aed5729482a7a0229 PUB = 62b1b316135596bfbca6037ed847c61fb7f09fa36ce90abb7789b86f768b59dd MESSAGE = f3d5fa2acaefd858f1df26e03059cdcbc2468ad74afc993d0db9c4cde4113f8d55c7da71d38ba06520531c61fddb5f33d5f0353be2376e580711be45c0a30b1fa01b55e228c6fa35e3f95b67909fc7df3fd464d93d661a926f9d11f7550c17fbcc3496526e8f10e0c8916677b2be5b319b688f21e81aaa9482e5c93e64ce8c437b9c1e14fefed70a3fee568811dc31cadab3d5b220254465336dc4d97a3bd096b5e065e0cfbe82849e2c1905aca486533f0da7a61f1e9a55b8e2a83262deeb59f2b13d3a8aef5700845b83b25ae2183c0ddac0ce42f8d25674cb0d0d220a6de7c1858bb07d59a3372344d944602aa451d2b937db0fe6feca0beba81721fc361ea7509e2b6d397e1c191b56f54ab436d0d27ab4c061bd661ad1a4452387e8735754d07fa7ef4d4548b172582425b299046e6301b5ba6b914418f149cf722e10bde2e0d41700f12c8429fc897b7819da92292240cd45565458c9a7b29c12 SIG = 1eaad8420ac12c99ac1ff4476678e3cbbe94da6a797f174664d5ee0f641433fb1e7cb2f5613e10805df8654cd8e0d45d96230932bc7f20b04eae836435134309 SEED = 73b03373ef1fd849005ecd6270dd9906f19f4439e40376cdbc520902bc976812 PUB = 663719e08ba3ba1666f6069a3f54991866b18cc6be41991b02eb3026ff9e155f MESSAGE = d5c2deaba795c30aba321bc7de6996f0d90e4d05c747fb4dae8f3451895def6e16e72f38eace756f36635f8fb0b72a3a0c1f54663817a94d4fd346f835ab0e657f001a6f2cecb86d0825bd02639254f7f7f38ca99dbb86c64a633f73baf933aae3563281f4005e2d0e7cec9fbde8e588a957e211068be65b3d3d35bf4e8d5bb3478333df9ced9b2abaf48697994a145e9321499fc5ee560f4fbb6849e1ae8eb3d1de0083a21a03f6a6b28176f0130d3895e50e75e3d7d0947a7bc2c5b9ff69895d27791442ba8d0f2180712b567f712ea912f3b0d92c19342e0106ff1d87b46ad33af300b90855ba9769d366e79425d98e4de19905a04577707cbe625b84691781cd26bf62260b4a8bd605f77af6f970e1b3a112e8918344bd0d8d2e41dfd2ce9895b0246e50887aa3a577ff73be4b6ae60feb0ca36f6a5f8171ed209e5c566529c0940d9b4bd744ccee56e54a9a0c6e4da520dd315c2872b02db563703e SIG = a40abe98fc69da8a1ff9ff5c2cca93632e975980ee8b82c3c376022d6524ab736d01b072f2b681b5f1cd3ea067012ed6d074e949c42327a366caa9e4750a3c08 SEED = eab179e41ed5c889ffe6aabdc054faf1307c395e46e313e17a14fe01023ffa30 PUB = 86f34746d3f7a01ddbe322f1aca56d22856d38733a3a6900bb08e776450ec803 MESSAGE = 971095cebe5031530224387c5c31966e389b8566390054cf45264b44e18964b7be52c33c4ffb259af16283438fa15dd66bc7791b7533ef10cb0beab524a6437626f4cc74512851adcc2fb129055a482c61107383fb7c5241831d5551634eef0dc0b8f9053a00971aa8fa1ae0898e4b481b6707e97c0f942040b339d92fc17bbade74675af243d8b2dafb15b1db55d12415b85f3037291930ab61600ba3431f8eb425be4491614728af101e81c091f348bc5ffd1bde6ae6cad5c15b3aa7358078cc4effb54a86e7f0e0c55e4cfe0a54605ed443fdf2aaba016585da617e77341d52889d75dd540d39fe8b7993ed705cfddea0cb0d5a731d6bfcdb816afaff47e963eedebdf241af5593353d6d401a34f029a8cdeb1904cc2caa4f9635cc2ba6b7b1a29da625ffc383be2f5a8f1fa4f39b2d4b4f4c2d8838ce258a04d4a120493fdf07f68c0ffd1c16b768a35c55fea2cac696b5c20efc10865cde8a64627dcd SIG = 143cb28027c2f82e375e5f340e7fe6e60ce7bd51000b49c74168af85e26ed2ed630ed2672090164cc54b052da694ebdd21a21b3053f4dcfd7895ea5f6c8aa80d SEED = fbf146ebd51075570ec51ac410ae9f391db75b610ada6362b4dbd949656cfb66 PUB = be7c2f5b21d746c8ea3245ce6f268e9da74e00fa85c9c475260c68fa1af6361f MESSAGE = cd7ad4f17fcff73acc402dc102d09079b29aaf2a0f4b27cf6beeb1e2b23d19ab47deb3ae1becd68861ea279c46691738f4fff47c43047c4f8b56b6bbcc3fde0723d44120dcd307a6310dc4f366b8f3cd52db19b8266a487f7872391c45fe0d3248a7abf2c20022d3769547f683067dcc363cd22fd7cda3cadc15804056f0e2aa2b795008c598be7a961805e6df291ba3041c47ff5640275f46e6ae82092d21abcbcfba11e730216008822de3ce462400596da79f7ae5d1df8389112ad98868fa94fb0546bfe6a67aa8d28c4d32072d2eadd6256255f18c2382e662dfa922a680e06a43622c4871d27d1807f7b2703070c83db8dd929c06038b2183cb8e2b9ec4c778d7ecf9e9ffac77fa7737b055feac2e7982aeeec0b72f1bbca2424e1a844bbac79cb2e7400f81dc449d0560b521a7c16bb4167e6696586058a9b8ed2e5116690b77f2a17e5c0b16a83dcbd2e24552293e258b32ba7f844944379342698627 SIG = 6768006fe0f201b217dd10eb05d4b82adcfeb2ecfc8373c3308f4150394811eb60491881a2e53d1289d96478e18a64c34b2a19832cdccfd96a2e4a0c469fdc0b SEED = dff0eb6b426dea2fd33c1d3fc24df9b31b486facb7edb8502954a3e8da99d9fd PUB = c245085ece69fb9aa560d0c27fdb634f7a840d41d8463660fbe82483b0f3cc3a MESSAGE = e7c9e313d86160f4c74aa0ae07369ee22b27f81b3f69097affae28dae48483fb52a5c062306b59610f5cdbff6332b1960cd6f2b8f7b41578c20f0bc9637a0fdfc739d61f699a573f1c1a0b49294506cf4487965e5bb07bbf81803cb3d5cb3829c66c4bee7fc800ede216150934d277dea50edb097b992f11bb669fdf140bf6ae9fec46c3ea32f888fde9d154ea84f01c51265a7d3fef6eefc1ccdbffd1e2c897f05546a3b1ca11d9517cd667c660ec3960f7a8e5e80202a78d3a388b92f5c1dee14ae6acf8e17c841c9557c35a2eeced6e6af6372148e483ccd06c8fe344924e1019fb91cbf7941b9a176a073415867210670410c5dbd0ac4a50e6c0a509ddfdc555f60d696d41c77db8e6c84d5181f872755e64a721b061fcd68c463db4d32c9e01ea501267de22879d7fc12c8ca0379edb45abaa6e64dda2af6d40ccf24fbebad7b5a8d3e52007945ecd3ddc1e3efeb522581ac80e98c863ba0c590a3ed95cd1 SIG = 6b48b10f545ddb7a89cd5829f4e5b20146cf6bc96e550d06f65de8bdae7ccdded26cd630f86c9266bccf88e924033e04f83a54f8290d7f734cf8673cca8f9703 SEED = 9f32958c7679b90fd5036056a75ec2eb2f56ec1effc7c012461dc89a3a167420 PUB = 1d7269dcb6d1f584e662d4ce251de0aba290ef78b97d448afb1e5333f1976d26 MESSAGE = a56ba86c71360504087e745c41627092ad6b49a71e9daa5640e1044bf04d4f071ad728779e95d1e2460584e6f0773545da82d4814c9189a120f12f3e3819813e5b240d0f26436f70ee353b4d20cea54a1460b5b8f1008d6f95f3aa2d8f1e908fced50d624e3a096938b9353854b96da463a2798a5a312ec790842c10c446e3350c764bf5c972593b9987bf23256daa8894d47f22e85b97607e66fc08a12c789c4746080368d321bb9015a1155b65523ad8e99bb989b44eac756b0734acd7c6357c70b59743246d1652d91b0f9896965141345b9945cf34980452f3502974edb76b9c785fb0f4395266b055f3b5db8aab68e9d7102a1cd9ee3d142504f0e88b282e603a738e051d98de05d1fcc65b5f7e99c4111cc0aec489abd0ecad311bfc13e7d1653b9c31e81c998037f959d5cd980835aa0e0b09bcbed634391151da02bc01a36c9a5800afb984163a7bb815edbc0226eda0595c724ca9b3f8a71178f0d20a5a SIG = 9881a5763bdb259a3fefbba3d957162d6c70b804fa94ab613406a6ec42505b8789465ca1a9a33e1895988842270c55e5bdd5483f6b17b31781b593507a6c1808 SEED = f86d6f766f88b00717b7d6327eb26cf3ceeba5385184426f9cfd8295e2421ff2 PUB = cb1d250504754183704dbe21c323d66f9f9011758f6d8dab6f597b199662145b MESSAGE = da8423a6b7a18f20aa1f90ed2331b17b24067c40175bc25d8109e21d87ac00528eb3b2f66a2b52dc7ef2f8cecb75c76099cfa23db8da897043ba1cce31e2dfea46075f5e073203eaeb3d62c84c107b6dab33a14eaf149aa61850c15f5a58d88a15aba9196f9e495e8dbecbcf7e8444f5dd72a08a099d7f6209990b562974ea829ef11d29a920e3a799d0d92cb50d50f817631ab09de97c31e9a05f4d78d649fcd93a83752078ab3bb0e16c564d4fb07ca923c0374ba5bf1eea7e73668e135031feafcbb47cbc2ae30ec16a39b9c337e0a62eecdd80c0b7a04924ac3972da4fa9299c14b5a53d37b08bf02268b3bac9ea9355090eeb04ad87bee0593ba4e4443dda38a97afbf2db9952df63f178f3b4c52bcc132be8d9e26881213abdeb7e1c44c4061548909f0520f0dd7520fc408ea28c2cebc0f53063a2d30570e05350e52b390dd9b67662984847be9ad9b4cd50b069ffd29dd9c62ef14701f8d012a4a70c8431cc SIG = ec61c0b292203a8f1d87235ede92b74723c8d23408423773ae50b1e9bc4464e03e446da9dce4c39f6dd159bea26c009ed00120bc36d4a247dc0d24bcefcc110c SEED = a5b34cefab9479df8389d7e6f6c146aa8affb0bec837f78af64624a145cc344e PUB = 7b0f4f24d9972bc6fe83826c52716ad1e0d7d19f123858cb3e99fa636ac9631a MESSAGE = e21e98af6c2bac70557eb0e864da2c2b4d6c0a39a059d3477251f6178a39676f4749e7fbea623f148a43a8b0fe0610506fa658abd2f5fa39198f2636b724db22d1aebc2ab07b2b6dbffdee8cece81e1af1493ec1964e16bf86ab258ca0feb77e3c8717e44038abe152c14be15660bf93b2d48d92c4ed7074d2494210621bcf204fba88c654d5ffe01e1a53d08f70bb237089dc807216ff6a85dbec3102237d42590778acf6c1dc566d5a2bb9a63bc21c329c272e5965baeeb0fe891de3cc8cbfa8e541a8881df68942e7ff8dc656bd08575f6aaf924a176d663b1a1f43574d11768c701b269561e55438dbebfd443d2115cb933d1cde4a915b54c325c27f499ef02bd012ff1f9a36390922887600fe712bcdc23eb5974a305372ad52951f83f0e58cc49e289841621917f1fcb0235147240dae4cf3b99b6ac6d8de94efe7c4436714508bcd0114c56068ff1b7c16d51bd906437874d6549ab5d8087896872ec8a09d7412 SIG = 2fbd899d72b6d39e4f45b8b62cbbd5f3c0acb1ad8540913fa585877e91ccfef7bee50a4b0f9fedf5cc1e0d1953ad399c8389a93391e1b7c929af6d6f3b796c08 SEED = ad75c9ce299c4d59393367d77a4c9f8df8dcec765c6dbd25b527fb7669913604 PUB = b9910548fe6312a119c9993eebcfb9dc90030ffb0e4de2b7ccd23cbeb4fef71b MESSAGE = 62fc5ab67deb1fee9ab6cca3b88a1df1e589f0fd4a88f4aa7738948761fe84372c5b18e4655220c1d84d52acad32e229a5c756c20fc62fe4b4b4e5fd7077ae4ed5397aa796f2307ceedb6505b39297856f4aeb5e70938e36ee24a0ac7d9868306f6b53910623b7dc89a6672ad738576ed5d88831dd338321c8902bc2061f65e94d452fdfa0dc665cefb92308e52301bd4627006b363d06b775a395914d8c863e95a00d6893f3376134c429f56478145e4456f7a12d65bb2b8965d728cb2ddbb708f7125c237095a92195d92fa727a372f3545ae701f3808fee802c8967a76e8a940e55fb2d810bfb47ada156f0eda1829b159cf05c7f36cf3847d7b21de84c3dc0fe658347f79396a01139a508b60022db1c0e5aeef47e445e66f783e62c96597bdb16f209c08a9132c7573136170ee3ebf24261265a89fb4f10333375e20b33ab7403464f5249461c6853c5fddb9f58af816892910393a7077b799fdc3489720998feea86 SIG = 6b7ef27bcfbf2b714985033764fccff555e3f5bc44610d6c8c62117cb3831a07f4a8bddb0eaed1d46b0289b15de1aa4dcc17d71be96a09e66ba4dc4627c78705 SEED = 1ced574529b9b416977e92eb39448a8717cac2934a243a5c44fb44b73ccc16da PUB = 85e167d5f062fee82014f3c8b1beaed8eefb2c22d8649c424b86b21b11eb8bda MESSAGE = 1b3b953cce6d15303c61ca707609f70e7250f6c0deba56a8ce522b5986689651cdb848b842b2229661b8eeabfb8570749ed6c2b10a8fbf515053b5ea7d7a9228349e4646f9505e198029fec9ce0f38e4e0ca73625842d64caf8ced070a6e29c743586aa3db6d82993ac71fd38b783162d8fe04ffd0fa5cbc381d0e219c91937df6c973912fc02fda5377312468274c4bee6dca7f79c8b544861ed5babcf5c50e1473491be01708ac7c9ff58f1e40f855497ce9d7cc47b9410f2edd00f6496740243b8d03b2f5fa742b9c630867f77ac42f2b62c14e5ebddc7b647a05fff43670745f2851eff4909f5d27d57ae87f61e965ee60fdf97724c59267f2610b7ad5de919856d64d7c212659ce8656149b6a6d29d8f92b312be50b6e2a431d36ae022b00a6fe360e3af65432899c43be0427e36d21cfec81f21aa53b33db5ed2c37da8f96ac3e7dc67a1de37546cf7de1008c7e1adbe0f34fa7eb2434d94e6a13f4cf86a98d497622f SIG = e0303aefe08a77738dcc657afbb9b835ed279613a53c73fdc5ddbfb350e5cff4d6c9bb43dc07c95bf4e23b64c40f8804c7169952e3c8d59a7197241bfed0740f SEED = f0790d93e2d3b84f61ef4c807147aba410e415e72b71b0d61d01026fed99da3d PUB = efdf649fb033cf328e0b287796f8a25e9c6e2e871b33c2c21a4028a8a25a4b28 MESSAGE = 7973e9f32d74805992eb65da0d637335e50eff0ce68ea2d1f3a02de704492b9cfbe7e7ba96fdb42bb821a513d73fc60402e92c855deaed73ffeaf70952029062c833e14ec1b14f144e2207f6a0e727e5a7e3cbab27d5972970f69518a15b093e740cc0ce11bf5248f0826b8a98bde8bf2c7082c97aff158d08371118c89021cc3974ae8f76d86673c3f824b62c79c4b41f40eaa8943738f03300f68cbe175468eb235a9ff0e6537f8714e97e8f08ca444e41191063b5fabd156e85dcf66606b81dad4a95065584b3e0658c20a706eaf4a0777da4d2e0cd2a0fca60109c2b4403db3f03cd4781c1fbb0272202bcb11687808c50cb98f64b7f3fd3d43333bb5a061b9e377090abb1e0a885cb26b73c163e63ff6451ff2f4ec8249c7e152bd03973a1e964e2b5b235281a938399a112a24529e383a560dc50bb1b622ad74ef35658dcb10ffe022568ac3ffae5b465a8ed7643e8561b352ee9944a35d882c712b187788a0abae5a22f SIG = 08773a6a78762cbb1e25fcbb29139941bdf16f4e09a1fa08fc701f32f933edd74c0ae983c12a0a5b020b6bcf44bb719dde8ed0781a8298265640e1608c98b301 SEED = 4cb9df7ce6fae9d62ba09e8eb70e4c969bdeafcb5ec7d7024326e6603b0621bf PUB = 018069dd0eb44055a35cd8c77c37ca9fb1ad2417271385e134b2f4e81f52033c MESSAGE = 14627d6ea0e7895460759476dc74c42800ceef994327518151490d9df23067914e44788a12768ccb25471b9c3ba9d14fb436dcba38429b3a0456877763c49175d0e082683e07a9058f3685c6279307b2303d1221b9c29793d8a4877f6df51587384dadf751c5f7bfbd207d519622c37b51ceeee2c20d8269f8cb88d3fe43d6d434d5bbd0e203c1532d97ba552147227496c87f67b50bb76193add0144df1c176657585408362ca2ed04ad62acf1c25e341dfd1498d85b4b1349a8b0b9b02c43523c55853419bfed37d5a2cdf17dfbf1a3bd7759d6ae180f9d27dcd9a8933e29a7c0a30771eea7c2e0fa242925d2336dce585629057d844323964f6d3d11ff0b3f829a3be8c9f0468a6823d8e70ab5a2da21e15fa8b041a29812222e9c30b2bd9a12d1fdee6f87876e8ce81009637a8bb2236129a47ca74289ee4aad429ffe29f47430241ca8cc3848b7200fd6e1470651a9a0a6f72c9033e831df051408a6260f65cbaf6e012b18e SIG = e33c07836c537d6bfbd0f4592d6e35b163499ba78dc7ffcec565d04f9a7db781943e29e6ce76763e9baddf57437fd9c6b03239a6e6850e4502a356c2e12c3705 SEED = a136e009d53e5ef59d0946bc175663a86bc0fcd29eadd95cfc9d266037b1e4fb PUB = 9c1806ec0454f58314eb8397d64287dee386640d8491aba364607688841715a0 MESSAGE = a49d1c3d49e13c2eda56868a8824aa9f8d2bf72f21955ebafd07b3bdc8e924de20936cee513d8a64a47173a3bd659eff1accff8244b26aae1a0c27fa891bf4d85e8fb1b76a6cab1e7f74c89ee07bb40d714326f09b3fd40632fad208ea816f9072028c14b5b54ecc1c5b7fc809e7e0786e2f11495e76017eb62aa4563f3d00ee84348d9838cd17649f6929a6d206f60e6fc82e0c3464b27e0e6abd22f4469bdfd4cb54f77e329b80f71bf42129ec13c9dfe192adfaa42ee3ddeeda385816fbad5f411938c63b560f4ecd94534be7d98725cd94c99ce492f0f069ba0ec08f877a7812ef27ae19d7a77be63f66bcf8d6cf3a1a61fc9cfef104c7462a21ca7f03afb5bb1ac8c75124b554e8d044b810d95ff8c9dd09a34484d8c4b6c95f95c3c22823f52ce844293724d5259191f1ba0929e2acdbb8b9a7a8adf0c52e78acdfdf057b0985881afbed4dbebdebbdae0a2b63bd4e90f96afdcbbd78f506309f9bdb650013cb73faed73904e SIG = bc094ba91c115dee15d753361a75f3f03d6af45c92157e95dbe8d32194b6c5ce72b9dc66f73df12dca0b639f3e791d478616a1f8d7359a42c8eae0dda16b1606 SEED = ff0f1c57dd884fbeea6e2917282b79ba67f8a6851267b9f4636dafda33bd2b5b PUB = fef6378ad12a7c252fa6eb742b05064b41530ff019dc680ab544c027ea2836e7 MESSAGE = 522a5e5eff5b5e98fad6878a9d72df6eb318622610a1e1a48183f5590ecef5a6df671b28be91c88cdf7ae2881147fe6c37c28b43f64cf981c455c59e765ce94e1b6491631deaeef6d1da9ebca88643c77f83eae2cfdd2d97f604fe45081d1be5c4ae2d875996b8b6fecd707d3fa219a93ba0488e55247b405e330cfb97d31a1361c9b2084bdb13fb0c058925db8c3c649c9a3e937b533cc6310fa3b16126fb3cc9bb2b35c5c8300015488a30fadca3c8871fa70dfdc7055bf8e631f20c9b2528311e324a7c4edd5462079f3441c9ecf55fa999e731372344fdc0d413e417aaa001a1b2d3d9bc000fec1b02bd7a88a812d9d8a66f9464764c070c93041eefb17ce74eff6d4aff75f0cbf6a789a9ecde74abe33130fca0da853aa7c3313ada3f0ae2f595c6796a93685e729dd18a669d6381825ab3f36a391e7525b2a807a52fa5ec2a030a8cf3b77337ac41fceb580e845eed655a48b547238c2e8137c92f8c27e585caad3106eee3814a SIG = d5008486726cce330a29dd7e4d7474d735798201afd1206feb869a112e5b43523c06976761be3cf9b2716378273c94f93572a7d2b8982634e0755c632b449008 SEED = 0bc6af64de5709d3dbc28f7ef6d3fe28b6de529f08f5857ccb910695de454f56 PUB = fb491fc900237bdc7e9a119f27150cd911935cd3628749ff40ef41f3955bc8ac MESSAGE = ac7886e4f4172a22c95e8eea37437b375d72accedcee6cc6e816763301a2d8ef4d6f31a2c1d635818b7026a395ce0dafd71c5180893af76b7ea056c972d680eca01dcbdbae6b26f1c5f33fc988b824fbbe00cacc316469a3bae07aa7c8885af7f65f42e75cef94dbb9aab4825143c85070e7716b7612f64ef0b0166011d23eb5654aa098b02d8d71e57c8fa17bff2fe97dc8193177eadc09fb192d80aa92afa98720d4614817ff3c39d3acce18906fa3de09618931d0d7a60c4429cbfa20cf165c947929ac293ae6c06e7e8f25f1264291e3e1c98f5d93e6ecc2389bc60dbbf4a621b132c552a99c95d26d8d1af61138b570a0de4b497ebe8051c7273a98e6e7876d0b327503af3cb2cc4091ce1925cb2f2957f4ec56ee90f8a09dd57d6e83067a356a4cfe65b1b7a4465da2ab133b0efb5e7d4dbb811bcbbde712afbf0f7dd3f326222284b8c74eac7ad6257fa8c632b7da2559a6266e91e0ef90dbb0aa968f75376b693fcaa5da342221 SIG = dbc7134d1cd6b0813b53352714b6df939498e91cf37c324337d9c088a1b998347d26185b430900412929e4f63e910379fc42e355a4e98f6fee27dafad1957206 SEED = 2f5e83bd5b412e71ae3e9084cd369efcc79bf6037c4b174dfd6a11fb0f5da218 PUB = a22a6da29a5ef6240c49d8896e3a0f1a4281a266c77d383ee6f9d25ffacbb872 MESSAGE = b766273f060ef3b2ae3340454a391b426bc2e97264f8674553eb00dd6ecfdd59b611d8d662929fec710d0e462020e12cdbf9c1ec8858e85671acf8b7b14424ce92079d7d801e2ad9acac036bc8d2dfaa72aa839bff30c0aa7e414a882c00b645ff9d31bcf5a54382def4d0142efa4f06e823257ff132ee968cdc6738c53f53b84c8df76e9f78dd5056cf3d4d5a80a8f84e3edec48520f2cb4583e708539355ef7aa86fb5a0e87a94dcf14f30a2cca568f139d9ce59eaf459a5c5916cc8f20b26aaf6c7c029379aedb05a07fe585ccac60307c1f58ca9f859157d06d06baa394aace79d51b8cb38cfa2598141e245624e5ab9b9d68731173348905315bf1a5ad61d1e8adaeb810e4e8a86d7c13537b0be860ab2ed35b73399b8808aa91d750f77943f8a8b7e89fdb50728aa3dbbd8a41a6e00756f438c9b9e9d55872df5a9068add8a972b7e43edad9ced2237ca1367be4b7cdb66a54ea12eef129471158610eaf28f99f7f686557dcdf644ea SIG = 9f80922bc8db32d0cc43f9936affebe7b2bc35a5d82277cd187b5d50dc7fc4c4832fffa34e9543806b485c04548e7c75429425e14d55d91fc1052efd8667430b SEED = 722a2da50e42c11a61c9afac7be1a2fed2267d650f8f7d8e5bc706b807c1b91d PUB = fd0b964562f823721e649c3fedb432a76f91e0aead7c61d35f95ed7726d78589 MESSAGE = 173e8bb885e1f9081404acac999041d2ecfcb73f945e0db36e631d7cd1ab999eb717f34bf07874bf3d34e2530eb6085f4a9f88ae1b0f7d80f221456a8e9a8890b91a50192deaaacc0a1a615a87841e2c5a9e057957af6e48e78cc86198e32e7aa24dcf6cffa329bc72606d65b11682c8ba736cce22a05785df1146331e41609cf9ca711cf464958297138b58a9073f3bbf06ad8a85d135de66652104d88b49d27ad41e59bcc44c7fab68f53f0502e293ffcabaaf755927dfdffbfde3b35c080b5de4c8b785f4da64ef357bc0d1466a6a96560c3c4f3e3c0b563a003f5f95f237171bce1a001771a04ede7cdd9b8ca770fd36ef90e9fe0000a8d7685fd153cc7282de95920a8f8f0898d00bf0c6c933fe5bb9653ff146c4e2acd1a2e0c23c1244844dacf8652716302c2032f9c114679ed26b3ee3ab4a7b18bc4e3071f0977db57cd0ac68c0727a09b4f125fb64af2850b26c8a484263334e2da902d744737044e79ab1cf5b2f93a022b63d40cd SIG = c2695a57172aaa31bd0890f231ca8eeec0287a87172669a899ad0891cea4c47579b50420e791cdec8c182c8a0e8dde21b2480b0cfd8111e28e5603347a352d04 SEED = 5fe9c3960ed5bd374cc94d42357e6a24dc7e3060788f726365defacf13cd12da PUB = 0ce7b155c8b20ebdaacdc2aa23627e34b1f9ace980650a2530c7607d04814eb4 MESSAGE = c9490d83d9c3a9370f06c91af001685a02fe49b5ca667733fff189eee853ec1667a6c1b6c787e9244812d2d532866ab74dfc870d6f14033b6bcd39852a3900f8f08cd95a74cb8cbe02b8b8b51e993a06adfebd7fc9854ae5d29f4df9642871d0c5e470d903cfbcbd5adb3275628f28a80bf8c0f0376687dae673bf7a8547e80d4a9855ae2572fc2b205dc8a198016ddc9b50995f5b39f368f540504a551803d6dd5f874828e5541ded052894d9e2dc5e6aa351087e790c0dd5d9c4decb217e4db81c98a184b264e6daeac0f11e074cae2bfc899f54b419c65dcc22664a915fbfffac35cee0f286eb7b144933db933e16c4bcb650d537722489de236373fd8d65fc86118b6def37ca4608bc6ce927b65436ffda7f02bfbf88b045ae7d2c2b45a0b30c8f2a04df953221088c555fe9a5df260982a3d64df194ee952fa9a98c31b96493db6180d13d67c36716f95f8c0bd7a039ad990667ca34a83ac1a18c37dd7c7736aa6b9b6fc2b1ac0ce119ef77 SIG = 379f9c54c413af0d192e9bc736b29da9d521e7ba7841d309f9bcc1e742ec4308fe9f7ba51e0b22aed487cb4aa3913b9bebfb3aacd38f4039f9bbbebe1ad80002 SEED = ec2fa541ac14b414149c3825eaa7001b795aa1957d4040dda92573904afa7ee4 PUB = 71b363b2408404d7beecdef1e1f511bb6084658b532f7ea63d4e3f5f01c61d31 MESSAGE = 2749fc7c4a729e0e0ad71b5b74eb9f9c534ebd02ffc9df4374d813bdd1ae4eb87f1350d5fdc563934515771763e6c33b50e64e0cd114573031d2186b6eca4fc802cddc7cc51d92a61345a17f6ac38cc74d84707a5156be9202dee3444652e79bae7f0d31bd17567961f65dd01a8e4bee38331938ce4b2b550691b99a4bc3c072d186df4b3344a5c8fbfbb9fd2f355f6107e410c3d0c798b68d3fb9c6f7ab5fe27e70871e86767698fe35b77ead4e435a9402cc9ed6a2657b059be0a21003c048bbf5e0ebd93cbb2e71e923cf5c728d1758cd817ad74b454a887126d653b95a7f25e5293b768c9fc5a9c35a2372e3741bc90fd66301427b10824bb4b1e9110bfba84c21a40eb8fed4497e91dc3ffd0438c514c0a8cb4cac6ad0256bf11d5aa7a9c7c00b669b015b0bf81425a21413e2ffb6edc0bd78e385c44fd74558e511c2c25fee1fec18d3990b8690300fa711e93d9854668f0187065e76e7113ae763c30ddd86720b5546a6c3c6f1c43bc67b14 SIG = 84d18d56f964e3776759bba92c510c2b6d574555c3cddade212da90374554991e7d77e278d63e34693e1958078cc3685f8c41c1f5342e351899638ef61211401 SEED = 6132692a5ef27bf476b1e991e6c431a8c764f1aebd470282db3321bb7cb09c20 PUB = 7a2d166184f9e5f73bea454486b041ceb5fc2314a7bd59cb718e79f0ec989d84 MESSAGE = a9c0861665d8c2de06f9301da70afb27b3024b744c6b38b24259294c97b1d1cb4f0dcf7575a8ed454e2f0980f50313a77363415183fe9677a9eb1e06cb6d34a467cb7b0758d6f55c564b5ba15603e202b18856d89e72a23ab07d8853ff77da7aff1caebd7959f2c710ef31f5078a9f2cdae92641a1cc5f74d0c143ec42afbaa5f378a9e10d5bf74587fa5f49c156233247dafd3929acde888dc684337e40cdc5932e7eb73ffcc90b85c0ad460416691aefbd7efd07b657c350946a0e366b37a6c8089aba5c5fe3bbca064afbe9d47fbc83914af1cb43c2b2efa98e0a43be32ba823202001def36817251b65f9b0506cef6683642a46ed612f8ca81ee97bb04d317b517343ade2b77126d1f02a87b7604c8653b6748cf5488fa6d43df809faa19e69292d38c5d397dd8e20c7af7c5334ec977f5010a0f7cb5b89479ca06db4d12627f067d6c42186a6b1f8742f36ae709ba720e3cd898116666d81b190b9b9d2a72202cb690a03f3310429a71dc048cde SIG = eb677f3347e1a1ea929efdf62bf9105a6c8f4993033b4f6d03cb0dbf9c742b270704e383ab7c0676bdb1ad0ce9b16673083c9602ec10ae1dd98e8748b336440b SEED = f219b2101164aa9723bde3a7346f68a35061c01f9782072580ba32df903ba891 PUB = f66b920d5aa1a6085495a1480539beba01ffe60e6a6388d1b2e8eda23355810e MESSAGE = 015577d3e4a0ec1ab25930106343ff35ab4f1e0a8a2d844aadbb70e5fc5348ccb679c2295c51d702aaae7f6273ce70297b26cb7a253a3db94332e86a15b4a64491232791f7a8b082ee2834af30400e804647a532e9c454d2a0a7320130ab6d4d860073a34667ac25b7e5e2747ba9f5c94594fb68377ae260369c40713b4e32f23195bf91d3d7f1a2719bf408aad8d8a347b112e84b118817cb06513344021763035272a7db728a0ccdaa949c61715d0764140b3e8c01d20ff1593c7f2d55c4e82a1c0cb1ea58442bf80a741bca91f58ab0581b498ee9fe3c92ca654148ef75313543d1aff382befe1a93b02190ce0102175158e2071d02bacad8dbe9fb940fcb610c105ad52c80feb1ec4e524f4c0ec7983e9ce696fa4fcf4bf0514b8f0432b17d5448fc426fea2b01ac7b26c2aed769927534da22576fc1bba726e9d65be01b59f60a648ace2fc3e5e275789fa637cbbd84be3d6ac24457a6292cd656c7b569a52ffea7916b8d04b4f4a75be7ac95142f SIG = 17f0127ca3bafa5f4ee959cd60f772be87a0034961517e39a0a1d0f4b9e26db1336e60c82b352c4cbacdbbd11771c3774f8cc5a1a795d6e4f4ebd51def36770b SEED = fc180035aec0f5ede7bda93bf77ade7a81ed06de07ee2e3aa8576be81608610a PUB = 4f215e948cae243ee3143b80282ad792c780d2a6b75060ca1d290ca1a8e3151f MESSAGE = b5e8b01625664b222339e0f05f93a990ba48b56ae65439a17520932df011721e284dbe36f98631c066510098a68d7b692a3863e99d58db76ca5667c8043cb10bd7abbaf506529fbb23a5166be038affdb9a234c4f4fcf43bddd6b8d2ce772dd653ed115c095e232b269dd4888d2368cb1c66be29dd383fca67f66765b296564e37555f0c0e484504c591f006ea8533a12583ad2e48318ff6f324ecaf804b1bae04aa896743e67ef61ca383d58e42acfc6410de30776e3ba262373b9e1441943955101a4e768231ad9c6529eff6118dde5df02f94b8d6df2d99f27863b517243a579e7aaff311ea3a0282e47ca876fabc2280fce7adc984dd0b30885b1650f1471dfcb0522d49fec7d042f32a93bc368f076006ea01ec1c7412bf66f62dc88de2c0b74701a5614e855e9fa728fb1f1171385f96afbde70dea02e9aa94dc21848c26302b50ae91f9693a1864e4e095ae03cdc22ad28a0eb7db596779246712fab5f5da327efec3e79612de0a6ccaa536759b8e SIG = a43a71c3a19c35660dae6f31a254b8c0ea3593fc8fca74d13640012b9e9473d4afe070db01e7fb399bf4ca6070e062180011285a67dd6858b761e46c6bd32004 SEED = a2836a65427912122d25dcdfc99d7046fe9b53d5c1bb23617f11890e94ca93ed PUB = 8c12bda214c8abb2286acffbf8112425040aab9f4d8bb7870b98da0159e882f1 MESSAGE = 813d6061c56eae0ff53041c0244aa5e29e13ec0f3fb428d4beb8a99e04bca8c41bddb0db945f487efe38f2fc14a628fafa2462f860e4e34250eb4e93f139ab1b74a2614519e41ee2403be427930ab8bc82ec89ceafb60905bd4ddbbd13bdb19654314fc92373140b962e2258e038d71b9ec66b84ef8319e03551cb707e747f6c40ad476fbefdce71f3a7b67a1af1869bc6440686e7e0855e4f369d1d88b8099fba54714678627bba1aff41e7707bc97eddf890b0c08dce3e9800d24c6f61092ce28d481b5dea5c096c55d72f8946009131fb968e2bc8a054d825adab76740dcf0d758c8bf54ff38659e71b32bfe2e615aaabb0f5293085649cf60b9847bc62011ce3878af628984a5840a4ad5dae3702db367da0f8a165fed0517eb5c442b0145330241b97eeca733ba6688b9c129a61cd1236aff0e27bcf98c28b0fbeea55a3d7c7193d644b2749f986bd46af8938e8faaeafbd9cec3612ab005bd7c3eeafe9a31279ca6102560666ba16136ff1452f850adb SIG = e6a9a6b436559a4320c45c0c2c4a2aedecb90d416d52c82680ac7330d062aebef3e9ac9f2c5ffa455c9be113013a2b282e5600fd306435ada83b1e48ba2a3605 SEED = f051af426d0c3282fafc8bf912ade1c24211a95ad200e1eef549320e1cb1a252 PUB = fa87955e0ea13dde49d83dc22e63a2bdf1076725c2cc7f93c76511f28e7944f2 MESSAGE = b48d9f84762b3bcc66e96d76a616fa8fe8e01695251f47cfc1b7b17d60dc9f90d576ef64ee7d388504e2c9079638165a889696471c989a876f8f13b63b58d531fea4dd1229fc631668a047bfae2da281feae1b6de3ebe280abe0a82ee00fbfdc22ce2d10e06a0492ff1404dfc094c40b203bf55721dd787ed4e91d5517aaf58d3bdd35d44a65ae6ba75619b339b650518cefcc17493de27a3b5d41788f87edbde72610f181bf06e208e0eb7cdfe881d91a2d6cc77aa19c0fcf330fedb44675d800eb8cff9505d8887544a503cbe373c4847b19e8f3995726efd6649858595c57ccaf0cbc9eb25de83ba046bc9f1838ac7b8953dd81b81ac0f68d0e9338cb55402552afb6bc16949351b926d151a82efc695e8d7da0dd55099366789718ccbf36030bd2c3c109399be26cdb8b9e2a155f3b2cb1bfa71ab69a23625a4ac118fe91cb2c19788cf52a71d730d576b421d96982a51a2991daec440cda7e6cc3282b8312714278b819bfe2387eb96aa91d40173034f428 SIG = b8f713578a64466719aceb432fce302a87cf066bf3e102a350616921a840964bfc7e685d8fd17455ac3eb4861edcb8979d35e3a4bd82a078cd707721d733400e SEED = a103e92672c65f81ea5da1fff1a4038788479e941d503a756f4a755201a57c1d PUB = ee63a5b69641217acbaf3339da829ec071b9931e5987153514d30140837a7af4 MESSAGE = b1984e9eec085d524c1eb3b95c89c84ae085be5dc65c326e19025e1210a1d50edbbba5d1370cf15d68d687eb113233e0fba50f9433c7d358773950c67931db8296bbcbecec888e87e71a2f7579fad2fa162b85fb97473c456b9a5ce2956676969c7bf4c45679085b62f2c224fc7f458794273f6d12c5f3e0d06951824d1cca3e2f904559ed28e2868b366d79d94dc98667b9b5924268f3e39b1291e5abe4a758f77019dacbb22bd8196e0a83a5677658836e96ca5635055a1e63d65d036a68d87ac2fd283fdda390319909c5cc7680368848873d597f298e0c6172308030ffd452bb1363617b316ed7cd949a165dc8abb53f991aef3f3e9502c5dfe4756b7c6bfdfe89f5e00febdd6afb0402818f11cf8d1d5864fe9da1b86e39aa935831506cf2400ea7ed75bd9533b23e202fe875d7d9638c89d11cb2d6e6021ae6bd27c7754810d35cd3a61494f27b16fc794e2cd2f0d3453ada933865db78c579571f8fc5c5c6be8eaffce6a852e5b3b1c524c49313d427abcb SIG = 2aa2035c2ce5b5e6ae161e168f3ad0d6592bcf2c4a049d3ed342fceb56be9c7cb372027573ae0178e8878ebefca7b030327b8aad41857de58cb78e1a00cbac05 SEED = d47c1b4b9e50cbb71fd07d096d91d87213d44b024373044761c4822f9d9df880 PUB = f4e1cb86c8ca2cfee43e58594a8778436d3ea519704e00c1bbe48bbb1c9454f8 MESSAGE = 88d7009d51de3d337eef0f215ea66ab830ec5a9e6823761c3b92ad93ea341db92ece67f4ef4ceb84194ae6926c3d014b2d59781f02e0b32f9a611222cb9a5850c6957cb8079ae64e0832a1f05e5d1a3c572f9d08f1437f76bb3b83b52967c3d48c3576848891c9658d4959eb80656d26cdba0810037c8a18318ff122f8aa8985c773cb317efa2f557f1c3896bcb162df5d87681bb787e7813aa2dea3b0c564d646a92861f444ca1407efbac3d12432cbb70a1d0eaffb11741d3718fedee2b83036189a6fc45a52f74fa487c18fd264a7945f6c9e44b011f5d86613f1939b19f4f4fdf53234057be3f005ad64eebf3c8ffb58cb40956c4336df01d4424b706a0e561d601708d12485e21bcb6d799d8d1d044b400064ec0944501406e70253947006cabbdb2dd6bd8cee4497653d9113a44d4de9b68d4c526fca0b9b0c18fe50fb917fdd9a914fb816108a73a6b3fff9e654e69c9cfe02b05c6c1b9d15c4e65cf31018b8100d784633ee1888eee3572aafa6f189ea22d0 SIG = 627e7ca7e34ed6331d62b9541c1ea9a9292be7b0a65d805e266b5122272a82db7d765acc7e2a290d685804922f91ed04a3c382c03ff21a1768f584413c4e5f00 SEED = fc0c32c5eb6c71ea08dc2b300cbcef18fdde3ea20f68f21733237b4ddaab900e PUB = 47c37d8a080857eb8777a6c0a9a5c927303faf5c320953b5de48e462e12d0062 MESSAGE = a7b1e2db6bdd96b3d51475603537a76b42b04d7ebd24fe515a887658e4a352e22109335639a59e2534811f4753b70209d0e4698e9d926088826c14689681ea00fa3a2fcaa0047ced3ef287e6172502b215e56497614d86b4cb26bcd77a2e172509360ee58893d01c0d0fb4d4abfe4dbd8d2a2f54190fa2f731c1ceac6829c3ddc9bfb2ffd70c57ba0c2b22d2326fbfe7390db8809f73547ff47b86c36f2bf7454e678c4f1c0fa870bd0e30bbf3278ec8d0c5e9b64aff0af64babc19b70f4cf9a41cb8f95d3cde24f456ba3571c8f021d38e591dec05cb5d1ca7b48f9da4bd734b069a9fd106500c1f408ab7fe8e4a6e6f3ed64da0ed24b01e33df8475f95fa9ed71d04dd30b3cd823755a3401bf5afae10ee7e18ec6fe637c3793fd434b48d7145130447e00299101052558b506554ec9c399f62941c3f414cbc352caa345b930adecfaddac91ee53d1451a65e06201026325de07c931f69bba868a7c87ee23c604ec6794332917dfe2c5b69669b659706917f71eddf96 SIG = 6887c6e2b98a82af5ee3dfa7ca2cb25d9c10745620a82956acba85cb57c8ec24279fa42f092359a1b6bbeafba050f14b6288209e6ef7bc1e0a2b872c1138f305 SEED = a8d73d639a23cc6a967ef31bcabb5d063e53e1eab8fcc7cab9bc3a17fde9c2f8 PUB = 8daa9f4c8b1a44691bf44521f2f7ca45dc7fc61f6a4ce6f98faa41c2a74977d1 MESSAGE = fd1fac3d53313b11acd29f5a83ac11896dab2530fa47865b2295c0d99dd67c36ed8e5fa549150c794c5549efb5c1d69114d5d607b23285b7212afaab57846a54ae67b9e880e07b6586607cecf6d4eed516a3a75511fe367d88eb871e6d71b7d6aa1367a01421b1088fc2d75e44954b73625c52da8a3a183c60be9da6050f59a453caa53520593671728d431877bfaac913a765fb6a56b75290b2a8aaac34afb9217ba1b0d5850ba0fdabf80969def0feee794ceb60614e3368e63ef20e4c32d341ec9b0328ea9fe139207ed7a626ff08943b415233db7cfcc845c9b63121d4ed52ec3748ab6a1f36b2103c7dc7e9303acea4ba8af7a3e07184fb491e891ede84f0dc41cadc3973028e879acd2031afc29a16092868e2c7f539fc1b792edab195a25ab9830661346b39ef53915de4af52c421eaf172e9da76a08c283a52df907f705d7e8599c5baae0c2af380c1bb46f93484a03f28374324b278992b50b7afa02552cafa503f034f8d866e9b720271dd68ccb685a85fffd1 SIG = c4dcef1a2453939b364b340250c3129431431d5ba3f47670ab07ce680c69bf28b678627c76a6360fc40dc109aa7dea371b825e46134f624572182acf3957e70f SEED = 79c7dcb7d59a8df6b2b2ba0413059d89680995c20e916da01b8f067dc60cdeb4 PUB = 298743c73918bd556b28f8d4824a09b814752a7aeae7ee04875c53f4d6b108d9 MESSAGE = 5fe202f5b33b7788810d2508a13b3114d69b8596e6eacda05a04a2eb597fa3279c208b5a5b65daacb699f144e1d660e78e139b578331abec5c3c35334454f03e832c8d6e2984df5d450ecb5d33582a78808a9c78f26ebcd1244ef52e3fa6dca115c1f0cb56e38eae0e5b39f5fd863dffd0b2fb5b958f2d739db312fc667a17b031c4c9f8c5a2ad577984cc4146c437580efd2152173fe0d5782cc2ae9831a8d9a04177256018ff7631e0b0d8a99cb28f008b320421e27a74c31359188663456d85e098c1ebd281701097b6ae5a871e5ccc02058a501416cb91c12cef5be6f1914370e563f1a1b2aa41f4b8ee84cd32a1d509e529787d14a445438d807ecd620e2fa26de0da6426864784d4a28f54103e609283b99ee9b2b699c980bbb7882c3ea68ddc90802ac232f2c8e84291987bf3c5240921b59cfa214969317673d0be7f34b1ca0e15ea73c7175401ce550be106b49e62f8db68695e740e0f3a3556a19f3c8e6b91ac1cc23e863fcd0f0d9eb7047aa631e0d2eb9bcc6b SIG = 7b7cbe44c771e4371bae13b0722babcc1064155732962f407cba2acd35381d42210bece822f4681121fd4dab745a1f3077922fba1a78045b712902baccac660e SEED = b9ced0412593fefed95e94ac965e5b23ff9d4b0e797db02bf497994d3b793e60 PUB = c1629a723189959337f5535201e5d395ba0a03ea8c17660d0f8b6f6e6404bb12 MESSAGE = 555bb39c1899d57cabe428064c2d925f5fc4cf7059b95fb89a8e9e3a7e426c6c922d9e4d76984ea2383cabb4f2befd89c1f20eaa8a00dbe787cfa70ae2ae6aa90331cbbe580fa5a02184ed05e6c8e89d576af28aeeaf7c4e2500f358a00971a0a75920e854849bf332142975404f598c32e96982043d992bcd1a4fe819bb5634ad03467afc4ce05073f88ba1ba4ae8653a04665cf3f71690fe13343885bc5ebc0e5e62d882f43b7c68900ac9438bf4a81ce90169ec129ee63e2c675a1a5a67e27cc798c48cc23f51078f463b3b7cc14e3bcfd2e9b82c75240934cbdc50c4308f282f193122995606f40135100a291c55afdf8934eb8b61d81421674124dec3b88f9a73110a9e616f5b826b9d343f3ac0e9d7bdf4fd8b648b40f0098b3897a3a1cd65a64570059b8bc5c6743883074c88623c1f5a88c58969e21c692aca236833d3470b3eb09815e1138e9d0650c390eee977422193b00918be8a97cc6199b451b05b5730d1d13358cf74610678f7ac7f7895cc2efc456e03873b SIG = f1b797ded8a6942b12626848340fb719fcddafd98f33e2992d357bfdd35933c7ac561e5b2f939464338c5666854ca885c4d046eb2c54e48a1b5ed266ad34de05 SEED = 81da168f02d46bb87cda845da43f8a6cba2c016878d6f49c6f061a60f155a04a PUB = aff86e98093ca4c71b1b804c5fe451cfdf868250dea30345fa4b89bb09b6a53b MESSAGE = 6bc6726a34a64aae76ab08c92b179e54ff5d2e65eb2c6c659ae8703cc245cbc2cf45a12b22c468ae61fd9a6627ad0626c9b1e5af412cb483eaee1db11b29f0a510c13e38020e09ae0eee762537a3e9d1a0c7b033d097fdc1f4f82629a9de9ef38da1cf96a940357d5f2e0e7e8dbc29db728a1e6aad876e5e053113d06420272b87cf0c40dfe03a544de96c7aea13ba0029b57b48d99dcc6a650492d78c4cdd1b28e1a115a7e3e7a7cb21333d4ff80858dfb67782c16354b8716596560d7d8e389eb15a052a0bf5d16eb54fb3e4973ad4984e72a187f5347d5b262c32b1647e42b6a53837096cc78c2a05ce1c6e12493a03f1a667584cb97f4fcd57ee944c65b7eed25f7ae0f3f6cede173fdfacf5af1db143730d18096664914ba4cfc6966f392022781c66a9417ca2680b51f63e4fba424ecfdbc6a2f01787d0e7484f8a8ab390aeaa6d1f7ed325d82feaa1692a4984fae43da87329b045da8f0a4f56b695aa935de152ce0385153720979a2b7006d405fcb0fba09e23b85fd19b SIG = 4aaca947e3f22cc8b8588ee030ace8f6b5f5711c2974f20cc18c3b655b07a5bc1366b59a1708032d12cae01ab794f8cbcc1a330874a75035db1d69422d2fc00c SEED = af2e60da0f29bb1614fc3f193cc353331986b73f3f9a0aec9421b9473d6a4b6a PUB = c8bfe2835822199c6127b806fabeef0cb9ff59f3c81ff0cb89c556f55106af6a MESSAGE = 7dbb77b88bda94f344416a06b096566c6e8b393931a8243a6cab75c361fde7dc536aec40cded83296a89e8c3bef7d787cfc49401a7b9183f138d5000619ff073c05e2f841d6008358f10a2da7dcfac3d4d70c20d2ec34c7b6d5cd1a734d6bbb11c5fd8d2bce32ac810ef82b4188aa8ea3cfc3032233dc0e2600e9db6e18bc22b10044a31c15baceaf5554de89d2a3466807f244414d080ff2963956c6e83c8e144ed0066088b476ddcb564403447d9159f9089aba2b4d5575c4d8ae66fc8690e7349ed40832e6369c024563ec493bfcc0fc9ac787ac841397fe133167283d80c42f006a99d39e82979da3fa9334bd9ede0d14b41b7466bcebbe8171bc804a645d3723274a1b92bf82fd993358744de92441903d436fd47f23d40052a3829367f202f0553b5e49b76c5e03fa6ce7c3cf5eeb21de967bec4dd355925384ebf96697e823762bac4d43a767c241a4cef724a970d00ff3a8ab3b83eed840075c74e90f306e330013260962161e9d0910de183622ce9a6b8d5144280550fc7 SIG = 50f9f941a8da9f6240f76d2fa3b06dd6b2292ed32d1c05218097d34d8a19dfe553f76ae3c6b4a2ed20852128461540decf418f52d38e64037eec7771bd1afe00 SEED = 605f90b53d8e4a3b48b97d745439f2a0807d83b8502e8e2979f03e8d376ac9fe PUB = aa3fae4cfa6f6bfd14ba0afa36dcb1a2656f36541ad6b3e67f1794b06360a62f MESSAGE = 3bcdcac292ac9519024aaecee2b3e999ff5d3445e9f1eb60940f06b91275b6c5db2722ed4d82fe89605226530f3e6b0737b308cde8956184944f388a80042f6cba274c0f7d1192a0a96b0da6e2d6a61b76518fbee555773a414590a928b4cd545fccf58172f35857120eb96e75c5c8ac9ae3add367d51d34ac403446360ec10f553ea9f14fb2b8b78cba18c3e506b2f04097063a43b2d36431cce02caf11c5a4db8c821752e52985d5af1bfbf4c61572e3fadae3ad424acd81662ea5837a1143b9669391d7b9cfe230cffb3a7bb03f6591c25a4f01c0d2d4aca3e74db1997d3739c851f0327db919ff6e77f6c8a20fdd3e1594e92d01901ab9aef194fc893e70d78c8ae0f480001a515d4f9923ae6278e8927237d05db23e984c92a683882f57b1f1882a74a193ab6912ff241b9ffa662a0d47f29205f084dbde845baaeb5dd36ae6439a437642fa763b57e8dbe84e55813f0151e97e5b9de768b234b8db15c496d4bfcfa1388788972bb50ce030bc6e0ccf4fa7d00d343782f6ba8de0 SIG = dd0212e63288cbe14a4569b4d891da3c7f92727c5e7f9a801cf9d6827085e7095b669d7d45f882ca5f0745dccd24d87a57181320191e5b7a47c3f7f2dccbd707 SEED = 9e2c3d189838f4dd52ef0832886874c5ca493983ddadc07cbc570af2ee9d6209 PUB = f68d3b81e73557ee1f08bd2d3f46a4718256a0f3cd8d2e03eb8fe882aab65c69 MESSAGE = 19485f5238ba82eadf5eff14ca75cd42e5d56fea69d5718cfb5b1d40d760899b450e66884558f3f25b7c3de9afc4738d7ac09da5dd4689bbfac07836f5e0be432b1ddcf1b1a075bc9815d0debc865d90bd5a0c5f5604d9b46ace816c57694ecc3d40d8f84df0ede2bc4d577775a027f725de0816f563fa88f88e077720ebb6ac02574604819824db7474d4d0b22cd1bc05768e0fb867ca1c1a7b90b34ab7a41afc66957266ac0c915934aaf31c0cf6927a4f03f23285e6f24afd5813849bb08c203ac2d0336dcbf80d77f6cf7120edfbcdf181db107ec8e00f32449c1d3f5c049a92694b4ea2c6ebe5e2b0f64b5ae50ad3374d246b3270057e724a27cf263b633ab65ecb7f5c266b8007618b10ac9ac83db0febc04fd863d9661ab6e58494766f71b9a867c5a7a4555f667c1af2e54588f162a41ce756407cc4161d607b6e0682980934caa1bef036f7330d9eef01ecc553583fee5994e533a46ca916f60f8b961ae01d20f7abf0df6141b604de733c636b42018cd5f1d1ef4f84cee40fc SIG = 38a31b6b465084738262a26c065fe5d9e2886bf9dd35cde05df9bad0cc7db401c750aa19e66090bce25a3c721201e60502c8c10454346648af065eab0ee7d80f SEED = 31010d1d67eb616348e84792b92d5dc128553cb52f6368159fe7b816cd0e7c37 PUB = 266543d96787ca901fcff06e6e434491ae0970880a5a187d535edb19db5cabeb MESSAGE = 39f89a5e7aa530b5463d498f8035b9909d55da527cdbd4de6d228379f089e608a9207a2c5b9c42051a60c8ca3fb97a1c06cd747d9d0739970ceb88ce526f971140ea2ec21f090ba075bf8975faa508b1cc10efa494dc172e6d3d3f3f75dc8e0e96f05c0cccb2f96e911cfa7a2c82c9845018bb1f9d75f82e3dfe1139347b2ac058b014ac93760c90f5567ab5c4eba04b49fb09ddadd305be511dfe05c96ebc86fd67b5d0ab57d85f4fe5e2f0fa9d88a68f0f6b6bc8bb944eb3c0b17557e55d5ea187d922a42813e69057c9b6a7f75e49921b7079e58f8a63719ee3e1ad10cf0e8a70c4f1540218b70494bd029ee02ff9727a7d85d377919ec4051479b70f7cd6767723fe42c1c7899c2b7c1f702dd6b4d13b672d488f34a0e969db79cc2cb2524a948a8de4c5b623ecd90d6e82d97033c125637d1cd8c84803d8fbc012846ffe484f6c02149258f9462fa1e99c307dd0062fe0b6f11eee40c2629ef7c0f6a5107259ea5b9ffb6f29f12c32f7b5228cabc986ab66450af9dcc3da09d0e0b9a4 SIG = 7b1eb677c3e5e6a8b4ba69fcb7f6b1870e42a8d58958a35c674e2db82107481c4c7b37f0f689d39d9f51e181b17b1108c15a3e27b29df3a4315dcc4faf122205 SEED = 8ff2398cd51f51d4c2c57869a2218b8486822031f400729f4ac4d5909c48bafe PUB = a5a88704b68677be3d16c3dc0052cfee6e2b30e08609059d4cba52c6d96061fb MESSAGE = 993953e47a341188bc592942e1557af29546e4e9368e2f1a5ee9806e2baf66b6190191fc5d2b7e47de37ff054fb2bbb1f031684ada5d607adda3d65433122fa904e0456faa84109bbc517f8ad39660876382adcfed0f7620cf1164622eacd91eb37a8596462ebe9ebe26bdc1e32cc34ad46fb1cea420e73c31215408e6d35425f44a829b132f631a3f6dd4b873a000667e19eb22fffd5903aaa7d4c8fdf21953c3c6178f5f8cb2aa6bff92894ead835888df060a3c9043026e0e2cef275497e7d105df3b644a98f26bf00105c99413ee0af8851954d65ceb8d79ad3071b8bb87f0b19743d2556ffd9819830b6eebf7ecc7e045661f43570ce9fdbbe2d252406fa90d04236f222c429ec16b1287224ada1a532161ae8b481bcab8d47afb3ed0445b3060fd6759179856f4085c1e585fd7c1409799af693cf427bd1d3dc10b5ae3447a8d2a18dc3a12a6860b22175dd5eb53a0950432e2d7aefece8af0ade3d8567743de43690f2d253723c5d7e48bd30d2937593701cecde9154b7665cb611d7d SIG = 417a647829c92898e520ff5311daa0a139cd8fffcb25a18e6d9b50cb52cbc35424c39ebbb5d5ac6a6d63f1f53c4df212f7025a8aaef8e36493c874c3ce341a0e SEED = ef816c8f5ec34ef41f68831d90cd29e52de8973782d003ee4edada2ada2691d6 PUB = 47f9b363a88a45053a05bb72160852bfe8f7dfefc2f37283de346752caf092cc MESSAGE = 9593c35cdec535bebb6965da68eab0b646bffcfbd04883bc4cef90d5d01f018c63c9b0ddfb3cef5e786284d5218caaaf060e9288952f16301ed8a4c1bcee256356a0c8bda359fbaa2782b10c86d18e20f7a0ec99b27a0b4dbefc0a262a3bf68fe81444dcae5f693eb0f16e6ee03f8fcbf3a3398146d20ec4d2657761fd0320fee7ea703c49a6a543bc9bba911e7925038710e8c36552d476d6027f58b2c52ba51ad65ea4f039c78f96b889102bb4bdd69b68e9c3d45b5176a2d82b0b95dc321016370dae30c3936515db0464c41774301c74e42d89b8bf4b9c19ed554b12febac0f60ddb3219ccc5603531dbf2eb5f293425d72ccefa0c7f144aba89347b296be87ff18994b4a0c70c930f059303b5dd4c8fe1e6bbc3cd68c6c0d84246dc6e6140a2abd1780b13f1594a6019d1778b7cbb3a3e3a34bfae7297f0b3edc376941c32352a4be314b84a9d8d6d7f1f38a0ad3798020aa2a331a402be9c704484744a730cbdedcb904b6fde708fbd14bfdc29efd461d1d0b5825de0bc79422b69a2722f SIG = 65c5d10ea7bfdbb38d55364a9968f82b548224dff3363b2ddcf585163dea27dc63b0563eb1a8dfbee951d3c9b33fcd6bbf0921c3abb21786b229069bd9ca000a SEED = 45eb0c4dfafa2a7690ef579c095456ceedcd32f0b6144d0c380f87fb744a0b1f PUB = fc85632c98384b5f9682aed9cd664cf1f48e588be2d568e5c734494df4c712b8 MESSAGE = 6f66d847405a03d7bd6f8d2897dbdf04e76d7df2d9470a4996b7dd6db88500f8f4f83e960e219a2486e24545add13614550414d827c41a9b08318daf01b15214c64a4266cbf8a5717ada3e62c26729073e16ddbd66f2d520e1e09935de05e4db11c396d477010aec66aafb762e69238d0b9e76b452454bf9e451e76ac79e6990d41b932bc32917093783c91bc9cf0bbe3b514070a1e692ff34fd06b66ea11f39e10af933ee96d8e9b677cb03737e7964eeaa725f121207f9c1b26a96c616df7cb7caef47bda901368ff2ea586e422e65bf21a691bdd2c13e67fff58cfbfed81782049dafa0f727df88623f2f7e8f262daf939542a187b8720a9b6b2b09890e54876b28a43874abbe3bfa981f8138b772c5d51736885f86acac2215a0b010dfc2c6b150845d4f8296252586a3e115f303c3d8a582e20fd2d43f6c446e5d00280ec179823b7fb4c1b0feb94eb4ef1707f5184e3b52461a7562d1f307cb751cdbbf6eae49ffae91862358e74e9548822b8a049fec6bf4c7a99cabbe09206577b657e31f SIG = 55851de8e1092f78944f6c6dd95bf07e2dbc8df7f57ad576829b978e3af58a7a8e94ed4dccbc0182467edf0bad4bae7ca84aa9a0c17c61a9e0ddff1d7525d704 SEED = 709d2e199006f5369a7a0bdd34e74dc784be33880ea3c5dd10ed5c94451e7972 PUB = 06f989202ba2cbc9c150be611262aca00c45f012f89fbaf89f8ceccba0b1934a MESSAGE = 62f003140fa09e0387d187a0ff96c4563df9f4e28c2282c0183ac3eede1312354921f780fca5361d3068d29949630b7530cd5914ace0468d014b6f53d839b82e38817dbf2d8392c3ce3424eab86a24d804c7acb1ce7acfe0a1cda4393924283105da4a7741196e027550047f85b7a0a01d454124efc0e299f0ef9ad14350543053482261528baa56e65999ac802c00a336267c635106b26403c19f391d53bd82861d6d48a4380b3043aa91d649536881204eccb0de20d43e5a3755b7f600916eccae42a0c9053b462d9417a13d67d778264a896e8eaf90baf66d29e5438a716781123a89fa9b8beef91d965af2f4a1a5bd5d2e2aaf46d5c94b7709cdd38d05feee4bfb76a359077c16bc4be9116e69001271cda565bc19bf47d4f986bd9c0d184cd8a3520ca1bdb4b505aaf7cb4ec9f94789779d30714e79116dd5019d59b28b17dad96f4e2155ad9c61274addc6b638109504e9ed19f4eda5377762648c4098224e3391043e4c2ad591654c9e7f974efdf0b0504b6fa5f646cecf44cd372412372505 SIG = 629bf97b0c78ee6a9c8759fbea28224e27abbb6cbe4dea5bb797e6e0fe80c913f953e3a9b623352d13acf4ce6250fb029a1e198d72bd5e7402e60e9e48ca3501 SEED = 5151617421aadc9c95a442b45e7ff6de06a2c733b85bd789fbad414ee3c91add PUB = 14941d559761b30ab0a86d47e0f7d1896b33784527c80af41cb84810cbff9dbf MESSAGE = 216e9d40bcdc3b2650188d121c9f8ef29e914facd022fe01b90ed11225f2eb93538e5fcee5ab8045e9199aa76a16bdd0616805660e247fecd7e22821b69b1f8e8a58ac3fb85691d75d5957a1daf53ff9ee6476d7c4bc541e6ad38e3a34ea90fc52a48b9399f92d17c9bb0d7fc3104c55d0efb4ea5b831ff9490b3f79f4d9d699594b741566f2b50a8fc78cc403fa40f5abb6638a32f449a8b3ef029c402f46931ad2bd3e8e683108714c989ae21689e9c444b9f55b81119bb5035bcf73e97ce43a2218c7bc3e430d1e814f34dee057265d3194b9f43875d8381f525f78576e64ce692584faa30fb743a12d1b77614d2e10a6b856b52be27cdb630ba1f0d3a6f8ea9844542e584ea0a2777527d0c52aca949aacda45ad83d16d5c83d663adb79cad6f3e39e990fe282a14c353aa2379d7f06adab74cea021b8983a57f1d0cf703292eb05ece89c53f3a1265610e0c1ea8ddd444d1ffd6bc3d03f0a6e4d0df5c5b8dc1f95d9f5558b118afe6bea0f6c2931363f03ab34e757d49364174f658efbbf38dc177 SIG = fae4773b334460c77bf01ec6366c4fe61c0cab57d8a4b03909c619e11ee3461c13fa21576f63870e423dd04181e4a7013a7524f246fe33853c674162a7815104 SEED = 38bed445556de74482bf5fec0506f9af330b151e50d4774dfe8591d7b7e0276b PUB = 4c0f9c49a42f4047bfe6885551c5e4b856cf771a67af3f89dbf602f9db9220f3 MESSAGE = 0ff0031df0beeff3710c6b763f9b8ec81719bfa1528ce46519adf3d3412d93fb188fd497d5d17091c0f0345960dd0eb0c09fc4005173665d4d97f95c13828bc76b3492b87a4b64253c8b5fa47aa75fa3b86d5abeea8de5959a602289136f60a69b309e773b2255cde19ed2a2e199c33db11c16ade08a319750b851d92c692924fc9859be523431cbe78ec092db1129210ebbeaa7c2a2c000eeb105ca0301a48f3e45fdfb15b275cbab83ca5c99d737a585320e9e3b317179bd86467fa9694fcdb2ac6ad36ed7144843dbc34e423d35afd7d8972a1c43c199a191abd6ceba4936d395c995a3eb13cb057f88a9dc9490fe98845ee5d26a89fb642a2a516dc3056c54d3637213363a8628a42a395d942b954a89e8ef7a744d8ae5adac88c616efaa90e2077205a60baffede5c87bb14dead306229495f698f3e490616966b1636387d0d86183f945b24a9dcfccf4d36722cd12ebb6bd8e78325752afa2b1abd13c4bdbcadd170869136826242acfb721de5ff27ba8aa0c018b225ed3404803ce9fa2d508d8944 SIG = f702d0d463282fc7fd5f8f9029b89c626cafd83450c3bb9dd8f6589f0c4b4b71f649ea212e5e33487c59c168ea3ad83150f1fcdfe8c53eba65adc2023c25830f SEED = 055460b32dd04d7f4b2311a89807e073fd556565a4771857d882794130a2fe5d PUB = 260f8fed4bba30b9e12ad8523fbb6f57f0a7a882550061f1da46fbd8ea442221 MESSAGE = 7407f96ee3e79c69d36ce1f64e4f188655ea68b947e7e2be97b05ebc6d4439e950276ef3f0e6a03dd48b24f66929b49c1580eb468807e1e7a25eb9b94da340c53f984f8b81603efb61047bf3f14b686d9798003d2f68589a79ebfad54409c71c90ff67c11fbd76cc72c2d145f458e42f88b75d250eadcafe66bf37ffc837b62ff006685b7f85a9d875fc078c82e61fe35d1922527a551dab62f9e477499146bad912203e664c417c3679c02d872abac0032f8cc77f77bfe54d3326fdee9276a48ea4eb251350406882d08c830e7649fe6854558a7513ab2d8d2ac3e5ced8a808d2aee454779edabd1aa63bb19f718f470bdc8451cd9b294941e3497063b1e39b6ca184562fe838cbfeee922de24ddfcf9882c5e615b11bf904817fbd647139db80b4e8feb37f11e1852d7e876db9cb63c94d7ee34192f7200b5bc77a0311ae43b806ebd4c2896c53f58f7ebc1625cb20d7107ef9db0da28788523de991ef6c5866b18d8de83a954d3281e06dbf27c4f2382e08cd0e0f6ebae3f961b77fce5a95a9b0621b756f SIG = 23f4f1627fbabd7891d7d8489631c7231d22de71864e262ab4da84ea8a13a60feac4dcfb1812f1200444b775f121d7266d755ce9b6a9ad796559c0a26b516d02 SEED = e9f6d31b936942c526e0f9ec4f5a7ac25fa789e0c434bcd9199d720c743c84c4 PUB = 32126d26e28231c5b585b13f43a01c6fe542946b07d3a91e57d281523f5cb45c MESSAGE = e88133f3d17642d5c22779a85316ba0df34c792b4efee49ed7dd93ca3322ef47c72e5b2e4595c77800434b60719adf54e4c1a34c89fa1e27ee8d35a0921f9755ac4a77a6c1684ea0f5c8ee5f759ce59bfe8315800a67aa6c64ddfaac92eabe6c2c613779784b3affafcc620f2a6dc5cb8d8dc7d74aa4d79494678494e5e6394c433c14809ff40c9a592d0d694a81103b44531e1f48bc13965d15af8bf3340488f8cd58f09ae1a6616bf85ac9de7e0c6696aa2f1bec15e17a44da4a84edb4ec6d77247788ba0de3ae12a155cbedc0da2f568eef0b75a877ea5b0c2c0d4bf2c61d468a46faadfaece35fc263a9be9987f4f7f78f05c707784378c7b8f7daf9ac3a122aad39a1677966da9ef286c9e062c4f439ad0bddea26e54b2f7388e238b2a64928450d34564c5a447e7afbbedd1085f1f24c11ae084322d1a32cf8aa473941f00d56b1618213cab3900aa606463d9f800e926f9f42d4b082d8c5ec3a4a025b45f9aadc8bcbd17091b3da49e9453dc55e89b5b5fe6b31f5eddad10b6601572568d8e205d3251a SIG = 7e3b1c4c716c808e90b974458915f3b2239c42077119fe270788fae520578bd7da6488044132e1bef23e3b23c34d9c1862744f28fcaecda6cac0fd72b93b6a0f SEED = 6bf4caaabb96854a38a572f4ce6c7838f7e750118c73f2723582618e2307f838 PUB = 08126373d056f00e54b8d43d77c35f5f919833e90d8aafd6c8246d27917ad091 MESSAGE = 4776e9d60085481fa537bf295bdabd8b1cf632a8cd40bce6bd325c129f977000e88468ebf2dc158ac0f207212db00fb60b8ec8bae229372e9a6b01530a7ed1bc9d389ec8913f59030d5b54af56ae1ccc28f37cc96a8e53204e92a677766adfaada99b0281f867f61ac9ff7d972ee3ed427d72faae75d4aec01b5ffc37061b6f0f7e5714c4cf30d5b731b0746065f19e4c8922dde642f80fe24a3c8dcb2e5f1c266e2af6c37decf55a2baa54f0d5cf0839370c3e0b4e77a4f36bbb3162014933a4a4ebcae8c60961ac6dcf134f30828d31402ae74e7e8513c9d2ad8ee46b7a9d53a1f87ebfce04f461bded1749b6fc4c4f25793525692d7a0e426c84e06082cc3e6abb51368370cbb106c7a0897f66d92c9739cff9f2706d6a2980ecea3ac4945f0f47e656bd9637777e853d2a839104327dc049ebc34f049d6c2f80eca99db7b418424acef752260d2d427949323997cd9617edf50d441d0088b1d47912e35cf542315265829f383f45860d3b45e735bb2f8586dcf58db4f2acfb4a68853a96eed7b89769d365613 SIG = d2113f80d6cf928486a250a679d6e74b35ea9d26061fa94d769e1a8fbfa0a734227f55537e4ebff59336db141cf5d6d482a0711f1e9fc72ff70956a11b4fb909 SEED = 5d9585736ab209b0abe8bf74aca4eea4f6d1650b532550a223e044580f8e20de PUB = e77729edfd2144b2b12078765417fa21f1594f09b269e9b6706802b4f3bdfe85 MESSAGE = 08693591e6c58a5ead9c85fe8ec58508f81a3467636c2d34fcc1f466e5c6dafdc37c35cbee35589c6997e2b15448132744e5a1e131bb49bf5c2563f87ead3efe01e88cbf24cc1769c78cdfc167e378215b15859c7a28ece70e188fa330267d3fc57b4ace6c1520ec67875067fd33be86f4a1967afb3eb164c797cf28d8072aa69d82afa38374f8e5797c4c28471b7d69f5b9c7b4acdbc19f3c5c5d400808a982a47837aed1b3841d69890eeb31494e10e3e513d12d0ca686c7ce651778092703fef0dcc0214077dfb361251bdea4364dd41b97bceb0fb1475a50e4708f47f7878c74401e9771cc3fceace89169981aa77250850090d181d8358ebba65e290acb0352bece8c579832a601551816d1c05621ccbbee0fbe39ea2f195393199e69c234c2fb1c37e474840860ce609161fcfce2869574be0d38f95e20f4f8725247b9627b46e834905101ac12b934cbf87cb2d190d2f51490a82c4e810eddb81f956a9f36bda497bca506a49ee9cd47fda5b7f2b884a3648cadd12ab61898ada46ecc970f81dc9f876845db SIG = e7b08e1d5809fdd8529443d65ada5dd655ea55b5415a011393be7071676486d358e8d2a460ebe075b0e701b24c9e3ab5f2b033592d4de3b7f37fd541f6920909 SEED = 60b142f165114143ca30a604fef51c686436aa1b9afdb266b3e398ccb3c4d855 PUB = eaf6c5a76ca99bf7306498888c3b7a1feae98bf8988d7f2e1547f8f53a4528aa MESSAGE = 1815dee1173b78264720d35b7cc2454a000a65fff214e2473e20bc83f3ecde9c04c1e0696ce6e55519dd2a75ce0464bf601adc381e793ecb9f8ce7ab87b6ca2a3e410f639069451978d14873d3390fab8623969713c3dfcd58d86d124073761ee09a652a48767f9646cb726ac454ac9a1bc5faed3026b703982bc2b1e0758210e1d62519230eb2b2f4a486bc55168560c4363df5ff5adfda11ac7ef51b18196c94337c07aef117990f770c0f1e8c0f88eb6ffc40e8ed7c3a80a632db1e7f63b63096e2ac49e57792b31143e2f4faabceae66b27471681c36fc1139007f9b548cdc6e3b8fbbdaba7a8adb843431238bb461ba24f6e09f62c72d6377b4048cb0134c25a5411a20bfcfc13e48d80e36bfb0da7e0185d33f1928636e15dee0e5df8992a16572b13ea8f7cf85cae32d529f66e8f6d2fb2ad0bbfe7199169b2567ba00c781b20a48e1d70df9fa3119cd7e5bbe58884b0b51218940fa815f85625fa203471cee8084780eb0b9356f9f3d4f6df740301d707ef1ffb3519e3f90b8064b98e70f375d071426881718 SIG = a621f084ea1a36ef812a9755c9afbb53dadaae6b3a53fa8344ca40d3612a268a35fed0fd398ab75bcd639c547937c94155ab1a7a3467dd4bfddfacab1655e908 SEED = 734ba47033c6140232dd4a7a14f1a7743eefe9070bad9662491630cc9d28c1f3 PUB = 2fa5df3026d60742e2aff6b57842c7126846c8a7bbe9266efa7b3f2398c357ea MESSAGE = 5d3c659810c3fea52a6df3861e5cdc5b703cc1cef48558c61d8c51d0edea5a1479cfe5063d82ded9ca681e5748887c40ecfb9e1a9a8b7f8509d10776461c3923399693a78189089178d5aabd15f8c846642be47d6d4caf13824edcefb809868fa72ddf035c4de8ef0a9c832264f66f012761ce6955bc3c416e93e29188025ebbb13a553258c1d7c499c9a4aeb10bb36f61d1bb4cec5ae55d175722b9a9696df881951e35200b9653cf6ed4b3d15de087a9d1c319fce8582156bebf3fc91e0e610ff7a15308fd1d2c6069fbbb2947d3110731d245ae2963014bd76dea42db125cecc493c8e9091a76646577729aed4966fce9699fe12e367d665df9e95a9193e1133e143af92f82b66ac7764e5033178690521809a7107d8ae9b88e0ed1f35b1719901b930ad0e1cbce7fb30267b1155204f605f525e49de2988ea7f74be8815177fd976a1bcc126d9c9c135c5b4276d38019c34aefb7a0220f7f5aeff380aed627b070c2c9e21533bb35c08e394c85ae25e6862942599c65dbae5977a584a88180e0c8c71e5a8409e04ef7 SIG = 9bd074d1d0bd28001baf7d2d4e82435df08c4264d8cbb1c381183c2f01223f79f94923ca178cac75564e16c7f56079088f7ed885de4d509fbc78f438fba3f607 SEED = 45e34d0ef4c196fa6d572b6b1774b5218f7c3291304c13500df7070d90e8039e PUB = 13a7304dff423359177abafa5e6508d26769ca99cf8af45c383f3ff634406003 MESSAGE = 3d9ed5c64b75e135df2f5e85300d90f21b363935e2817556fc9311751ba7535477dec8356ec385efb82b414062f35bb6d3edeafde305f9900a25e9813c9ee0237d46409650cdcdb5dfa2301a8e2647f8d3819d86f7b7e3070d33440f82c4054b1ab5edebeb27f95b3c4c6fdd468f21600f03b3494da200bab9293c38d02fc44048e52ff5fd0f7217a04d4ce912a180d1628f368280b6892672e8ff98d4629ac28b60c02a301e6c6026c1b9e9ef21cf0392df225008d5a0e0284b282631ad1710f811615697066c98296519948a7cfed5aeeb454ee7a61cc271bd3d499be17df09d3a0e790ee6b9bd99e1b919bed4a063b8d1a34f1afd2e952b9dfefd770969c8b2fc37977abb0fee6317253a23ecc97578168973334c8f91763ab97f29c49baeee7b35f3ae7f5cd3a4a6e697ef255a3c2ec0c752a3396f69f663ca1fc2b332dfe6c0faf78afe9c68d99571e8e896c5093085e9863a27648a9e58f3a9a84cbbfe2b41ca3633dd5cf6e82cb77cecacad8d78b353f48db42d99c36bcad170ea9e98abb2788c33a3c706268f3631 SIG = b42c1f925f4baccd129efb109db354aca31c6898f4f451294749a26a6da1677bd3a5c04119e35f47319f20cfdfc08bb4528b21009e00bd41ebc0f46863bed10b SEED = 888ce2ecceda9ca2b948ac1443c2aedd7595aacf36edaf27255bde7a6991dcc0 PUB = 016e572b4f98417c6ee297abd784ea48226ff4fbf0050a5ade8806e7046d3ba3 MESSAGE = 5c801a8e664e7660760a25a5e1431a62159fc3f3aa713780ae7cbce23b8564782799bf2be4817ee2921965bab7e1d44833824c1628d42dcee3e46ae42b2816d0a432a1ab0bd21fcf30adb63d8dd76569544343d0035c760522ca68bea72c404edda1e9095ec90f3325681c6de0f4c12d1afbcba2c7871a1b1e1f19c35b0bed9ec2a87c043d36d819396bd5d099e1aa090391297c733f65a8c5d2120c67635316fab25b4d4847a45fc3f76f2e2426dbee4629975062fce14e2189dba27fb1ded2453f001debfaa899c11660612d2ce2ad2f762ea5dee7e71e58adcdcefa79e8e8b27fc4ccf89aabf176b5d34f82dd15d889f9f087dc9ae8a42a72f3b83583616e170637cd1adf38aa6551cbacca3602bdc7ae210c4a446b3af8db2720e549bbedb8bed215ae00f19da29d8fb0b642d27b2d88575f0ee84f3d129eb774d20f537a1c0fdcf717bdebcfe47f8331a341864346fa6a1c6bbfd178819e387a0d5499a68e81cc9f82ad39e31e4dfe71952d5ea5cc8052a3ceed1751f59dc7ecc9742fad144e18dda8d0582e74e39ca8c4 SIG = 99d83f148a236ebbef1cad88cb3c7694f4986c9250e21c3603a0d941bff199cf77d6ce99efdb20533188d68ad133de033a1fb3468abb706d2b8b4fbac08dfe03 SEED = 617390857dc10cdf82b5c94261f58ce2d44aa2f57d298f08a2d6c74d28147daf PUB = 89e0c3e0a0f130d1916e0e3849b7286fa2e3ac4c17bd1f716ee5a72f0257fb8d MESSAGE = 1fd9e7453eaffd7c9b54055622dde170dd58b71cb945de75351d5fceb1f536bde25158f03786155f953dc207a1708f90d95b15aca0aee3097fdcaae85e4ab1c2cdb705c53e6c2ed21a994b304a75caf2ce4fc7d61f561e74e297397e2cde5cc69056940343aa81375d0af18d17d2f34c0a71dcf1de3c4fc488a14c5fa6b3337a3174b1da7958fb00bd5955148221427c60dba04117c80d2488656dbd5343de891287b50ef4df9825eda76b4977f3acd4ab6d3102fa56878306cd76561491bcfdaa1da567e677f7f03bae5dbf4426c3c4a6c3d082f9178b2efdd2bd49eee97ef4dcf3f0f51bbdeffe5ae6601e28019518f827f02e51f6679b8715978bec3e69d577156dd719959371baf034219fbbd17a2369a8541490f6a02013e33e74f4769be37aefa4defb6bfb3f351c2a261482c2fbec49f85f8445456e8f5a474030cd72d095ef6a622030e1e43a0c5debb034731d2f5e8e4ba3990f077d0c162649d1fa3ea4fe1e81d74aa849e21b059d966cbad4c493ca10bafe7a69243e3c0a6ebfd13d697906303392ba65d4fe06b6a5 SIG = 63e90a6afbbbb0ee696bfb56efd679d68a9851a8947640a97f41f68edfeadd216ed8698e2e43c820c9044caa7adaab5b76762b681831a9f760476a8443c43c06 SEED = 877d017436369ec2453fed46e977d6acc3a7be60d31395ad6e7ea9e07480e4c9 PUB = 4e65422fed334a55e8b673893eba7c181dd724dda002817b0bae28acdc3f7fc0 MESSAGE = 4ed3f5bdbd41d0e3b0a8a7fc3752eea496d6141678cbfe06757f61e1a168d761b6da83052f7994950d24626f004fbe9b8c9562e0c955fb3b5c08fd2d3d258393a349030c8e156205b40483038be1959f1cba490a87fe13899e4f3752063b68fe3e1c5071f7db0002f01494b4a3ee2e07992bdd200db4316629ee8a95ca347f0b28d6402a6da8b53e6b32581c3691e11ae9b6e0f0494894e649a92d03eb49c4d6833fa1f54f8dcd91d06936a6e62d491e2cea46dd07d9f02d3254b850bc9749f258a61ad3b9cc24b03287331b85a24143aaf8fcccac5f18bfc72dec75c0233516aa6e4589c78c665a186ed902091df97b0d04e83a2d74d789891aea2cacf813fffb5efaf78dbcd7af54ef55c77b1c4c8ace9e9278adc23d76c779d64b3bbbd1fb33b09836ea64a71e4711e89e8da0f709213342176ae22c6e7852c3973b60d9f98889b442aa48d7bfdfdef64c36c586c4fb2ad2e27ebe479f6d722f069fd6106b0d08975d5f721547c3b9c52f9fc5f45bb45b5b632188e80626518a79056bdc4ee1d2be6c6542a21fadea92c6dfb776 SIG = 7688f3f2401eacaf2dd88e170ff1c4d7e94822a77f6b550b569e82152bbbb434057e01230b05ce58ee1dee5226b5c7cdbe5a8ade3b9465f59aed74145d14330c SEED = 4f0b3607d70b0f2698327ef4f1982c5b4b94be78f50c76f43bd642f1f0ede39b PUB = 942b43089fd031cec0f99e5e550d65307fb6c3e793449fb390ff730fffd7c74b MESSAGE = 9f700a1d2560f69d9bc105bc83bff539e4258c0248602013a959b978a19cc273280d90c0178089578b50518e06ad1eab790ffe710c63d78887a95569144f3e58a8837f93dd516fcddd22bc97a7f14411d424b2e8e9aa7c280119ad94ce92533fc7fea6c66248644ac3e1beef2553a6f61e91b9379b0fe0c68b40681455b311f40df0c97f53fc954242c375e7708d61bad9f51296247274fa01a7328fa5009d9995f501ae8683552b11a49d2638116723b1319450a90138d278cd9512b80ca5792ed16c683bef92ec87884c9f07f137dc47a13146e511065c2e1b4b80efde88ae12e29431beb7aee365c16d80506b99afa6a1406edb061766875832dba473e519dd7018f402eb1bb3014b7cee4f02e980b1b17127e7d25dfe0c168c5344f1c90044f827707dca03070e4c43cc460047ff62870f075f34591816e4d07ee302e7b2c2ca9255a35e8adec03530e86a13b1bdfa1498813098f9ba59f8187abcafe21ba09d7c4aaa1ad10a2f28334ab53996147c2459c01b6a10839e0301123d91a35ced7af89afbac7d9cf8ac9a38ceebef83 SIG = f396a11f2f03c61439684f79001bd4f346a348dcf1d3beb2d3bfe33ea73a5ad4eb97506acfbffb784e77548189cd599f8ccf17355dde80e75024ef2a78d5fa03 SEED = b8a0010c784d8d002a31da11d022d30188a4197a1d5f14ea4c0dab29a2e40668 PUB = 8bdc63e50bede13c91a41e4b4b7857b9e553f484e3c1ec167dc04c281ea86622 MESSAGE = 5c6ccb298be216808b811e56d972f456b69ad39594eee354701ca6b3e38d1f41a359e5512af98a3a0873265fe5191f4f2ecaf66bee75a3ac0b71a4ddf2a759ebdddbd88a6a1c6fd0fcf7d7cb92a84e3307b4a4f98c710abf4f553dee74f652d2ac64bc30f72bf4354ef7e806a19071a051bcfcfb27e37fddd41eceaec1758e94695c670ef4c5a5902178329db9585c65ef0fa3cd62449bb20b1f13aecfdd1c6cf78c51f568ce9fb85259aad05b38c6b485f6b86076928ddb4e2036f45e7b9c6a7ff24ae1776030e2576825019ab463ebf7103a33072033eacbb5b503f53266afb82f9b2454b8dc057d84f30d9d2cb7c3a31a7dbdfba5b8e49231c231396c47ca042c8e48a1a5e3ec9afe4020595390f9990dfb874e0825ae9ae5e752af63af6fd3e787e75e8d8dc4c66302277ac01b30a18a56cb82c8a7ebdc915b7153255a1fedc492e49660262bb249780d173e1fd20d18c4f6b0b69aa2eca024bf3c80d7d5962cc4a129a7943b27f33cc799a36045541275a2cdb92a40e485ba8b737a04b43d29c3e25f76cb3d93a6b94461f88f5696 SIG = b3f6cf4c0e0f9074ff2c2c47e163202f1e9d6ee117cf757633e4abe74423aa70008ada1509ec1dc117c1c230e9b23786f3d0f29b73aa284536e9580106a8a70c SEED = efc86cbe40363abfbb2a4b1fcce5fd6084da96e7e814de71aadf9a618f303625 PUB = 22f295cee727d28d2b9317153e7d9412da1065c1b16ae2a251dd1fb431c62b01 MESSAGE = 9e4fa45dc026710f6bef4ed0f07c544b0bb0d88fa79e7177d8448bc209d71cfe9743c10af0c9937d72e1819e5b531d661c58c63141ce8662c8839e664db79e16c54d113abb02a75bdf11b3453d071825bc415741e99483546b8e1e6819de53017092e4ef871f1ca0d3508f937828a4667db11ffff9416eebb94bf9b84d654603094834a99ca70b90f562a86823624dfe9cb2f9e88c173f13464d4ce255f222db50dd63ab42465734e75295c064b64cc3f15e6237e37f33d615f7c243e4ba308960cfd4393402525500bb7902970b3931d48b35666a2d4d2ab08fa12af366a004346c9dd93d39fb1b7340f104e51fedbb533605b5ff39cf6d59513f12856dcfa198d793b0fc875cdea0741f1455746d8a19c3e9d928f0021b01c25131811e48c3c75c6f41422a8810c6c81f35b454eeae8cd17cf3f2e6f0bcd9f290984f496578623ab8e2738d2d10840eb91d101cb4a23722b72e3dd185440c3b9f44d46a393a34c187a20d610bb698c50531741efe96323512329800772a408065a7ef8e4e4105eb1f5bf6d3fd6b217fd836d89f53b96f45 SIG = f8818310228ca76111524ce94bfcb0246ea63508cee9306592b2f77548edefcf76bd1454508ea715042cec169cea5115ab54235cb1097b10702aa38378028e0c SEED = 33556c60de2f2c9a9303b99add378592060505f8e49861085a4b15f072a7ef28 PUB = 231ec8cd845859f69961275119dbe4f715e5ec5aa98bb8741675b3c2d0c89fee MESSAGE = 96af540ea2b1923f5fd0aad321ac032070c2d65ba13d164e75c3469758fcf31bb31655cb3a721f9cb34be2c90c77eb65be37f606d32a917a4cb9a709ac0705229930ef6eb6fdb0fa3c0fd3a90ce171674ee3ed06354bafc3c7075467a57445b80385640447902be39262894b1f64fea58287dc322d19875972a7c8be91d31f021c70eb682fdf11a10f8f582a126e064794838c69fdf64f5b6e8ba59d48b4384f8e9fb5c087cc7738295cd32344ba3b697ee6b6a8b78ee7a9575c97972a4d1bb18486f9037a0f3c6f471a90f86498dbc0df5232c07e8c01b690bee75302992a7a36fb4437c25a8bf5e34cf7d5b55572c700a079848d381364f9946a91eb1603ff3de5ebdd523bd92564818e237a53e8f522deaa2c29b897e961586e100ed0fc0ad70d160934e694027e5c957920bc0546e901be39a84535597e1f280c222267abe97f41205d8171820dd2faafc0699419321a9160f69b99fd41180945b62d2dd105cc7bbe821d28605e098edfa8b2309aeb0534e756377f59937c67463fd87c8b92ab58119cf4ce6c665af572fbae1de4a2cc71 SIG = e06a7a414457bbbef2bac3775ccad087dacb1fa4bf938894e8c929118e09e678dd19938bc88f43ed0f7d31cc6a0e602c4e4d1fee33d41e74a119fa2d1e4e340f SEED = 7a5c74314e1183334a4b6226b9a82d70fc2a124e3f87db6a2283ee05b68e34e0 PUB = beae7d3dd97c67f6273bfaa066131fed8ace7f535fe6464e65791c7e5398576c MESSAGE = 98bac6724755912992adc2a48b5442376f2d927997a040fb98efe544eb0c8e1866b9616e298d3360316ed976bd946a411fdd3a6b625c0c1a37af0f41cf6569a7884ab8467491a987df3ea7a0b7ebc4692569a34ce3a2ea3503495b2c02d49d7d7db579d13a82cf0cf7a9547a6eaebe68e7267d45a60b8d4772455228cca4036e282e1a1216f34cef7ea68f938270bdb04293c885d005f9f7e638a8b4ead2626c0945174ff2a3e2d6e15a4c0338c09e1260f0928ca9d3499824f3fedc4785da49c5c34a56855e241facc6347a399ddcac4399a8b158198c151461a3b189e58ec1f7efcf2ab2031fb17b6f035ba1f092e9eee2e92c2d6cc2032287f854b41e70fc61c8d11a2e4f0708f02eebd02e8c7e8c7b38a57bfa1a745f3a86c23909f6f89ab16ce7e1813c1d20147f31b4cf2ad0b606fb17e5ac1ab51ef4a7d8093cee9a655f471dc5b146bd1b93e540a3d3d3e2de8105911c10d6ab5ff79c2d06027f7a54561f2071414bd330a8785442251c810e232f83c367f0be7799a93f5238f7f17b5be829fd89123c04833af8b77e5a4363047ceca7 SIG = c2ab1f6f5114a84f218502582c567b37a8bdbcdf6340fa4622873be89106f0a90b4829505f72129df0ab3d8513268774a34df3ad21ce254b464488addd6c9b04 SEED = da8006adc492ca5dc86c2959437a75deb6120ff787d2ecb9c20c30b52c26bc41 PUB = ff113bf0aa58d546f2385d444ecb7888f8caba43a174a89fd6065f2b7dc17bf0 MESSAGE = 3eb4324dbc0149d2e7d6df632bb0cbe9a9f6dfa83e227fc07bde1b577b3611fb921c9f8313f068e6295d4913a8196be530f6a01f57c09c028491444b784720e909ea1fb69c1c1dd6304400327b7731b33cc46deb046cdab6ad1b53f1749a0c65cb9a7e376ffa02230f536584aea243c639103adbba764321649d7e0126f82e0b4fd9dcb86c731cbcc517f2016841e916bcd5fde871dc098cd913dc546284d1b2165c63e88f32a2789a500856371b50d22fb8c87d1a3caedcdfd01ee5f870a53c284181d632ec66d48b6bdd5646ac39c9e75338a520212062bc3466ef5c58765570b905f63a93d07f8f1baac3526b016da799f3e9e03a4f7f81355e0f7a76f30a42b807322051b71c626a7a296d75b9d9d1a23bcb13c9ef48a912dc057325d3bcfb3f9fadaf0c249b102aeb854aa3631e34f69ad90c2ab2ed33bacc40b9ed1037fae67cdf799d5a9b43785961127d62f8e0bc1589fd1a06fca2aea7cfc012cbf7b5b207ddc4e677d8ae4aec100045ce36c00b74d1d28250791236dc5dcc1ed313c8c246172666f75217437c6034acd64198cd96df2a SIG = 1f5375dcb3ad2baaff956d8554ecb424176be9a6eb9ea54e814e0a73df2a5d848ada26ba8e1805cd51c5e16950c1ff7d4d2764daa6f4c7502fb865cbe55aaf0b SEED = a284e26b97e538839c808d45bde6f012a354454aef81caa8c55914624f2b7d66 PUB = 5ae46e34695efaf463a4208fc4e35b81f2c63593238a56f2444b850f058c3c5c MESSAGE = 9ebfe910b50a5cb719d95b961e5905f00ec7943b55468ab5956692017645b366071f8fbb77eb49ec73ea7d64511405b90de22db98c3eae39c4039c7a133430e8010bdd39a00fd1a528b113dae149cfad3ae340da27dcc507782ecd8929237517afe7463eca2473c7acf6f7aa04efc9f266ae7b6d63bb8cc2a438b344827f0713d1f1736f0cbb65b99353f20355fa0230d4fa707328a8662654e83ad0530a10f9a69e17c099e1e2b5db18e5f6f1dceda5883e8cab79701a5e9089562ed153ad08c674f097c28e4d16633e092969a8f0bdac54527c0ee03bc200e5be612e3d1eabd87091101b4962afa07b310806992f373076d76a58185118137c9d26ee2cd4c618c18283dd19f0e7a089ee37305b6b9518a78d8098436ef62be7d699808acecf67939d61b3e02937cd8c5f1e746d4274334bc9c37fdcba234c166fd712893f3a040832ec5425e57d80f11ef9ca5fbcd6c147fbbf5e2fae746e0ddb605867e3bd050483c3cd1329abe57a60bf88898dc7e80ede0f4517de8fc807e888b621a00f663084ff94b99996628f3b11690a60f0918cb5c9a7ef SIG = bf110e2e9cecbc31fa3e0c2438cd1f4321f92cd287005a48528addf76cad8d88bb22719ef91b139562a1511838682674faa9ff7e7ade6c9d573f845036d18905 SEED = cc97a96301ceed0f922731b685bad8ad4f06207be340f5a44fd187f29903ec20 PUB = eb563a7bce12db97f1891d0f610bebd55101a3125ca8dbb50b25a6b5050d3784 MESSAGE = b9ea3b3df7187ea415a3c335e0834e10f440915b2ad41c71f255d6950a4e9120e4d494fd9e672ce53206fdc417d865897b47ac1054e1ca1068195232d4297435e44e1224e66a912d9d7d182946ff5a9f085bb8ba19c54d16b586a9b30461b6773b93950311e1619886f5a5b3f111aaad094bae31c48f1941080968bd0277bb6fa92eebf324b192df5cc969516c78c7b2d12159b4d1c8eb03160c4cd1907f62ed4b854c569ecc481c08e636f44ed7c390e58b5937d2906b2817bc3769dad9da1b0f79391b55942063055da0d6f249a3e452baddaa032998d7f73398ccd0151bfc92c5e2fdfa9b14855e6b0d3746dce248e219672987252ec747df2747fd3fbd8b714c882d707ee302a904950c34754f85350e1aa3f8ea6293cf01f717cefb6b83a22126df5c4f5698aafd06a2244ad7d01f34017ca0ece6f21040048aba6ca4aeb04325b9402bcd43ab130a105788ac3d7b7da01ea9426dd0ea1933a8189933a6c0c6cd648ea316a7469a5fdc6e7c934d9186586097b55dd51ac487bb80ed11d4df8d33626bbce95e4f13bd49922f00c920223f4cbf93cb SIG = ffbdd3244181cdf6034f4a450fdd95dee4971a933f8be022bb0a4106aef39af3055b721881c9b54d1e99b9409096fbe6dc2c9966e3679964bd7ef4c808cabf01 SEED = 679e3e34773abe4ae25cae7d07ccd0eb3b0ec0a35d570257d62570de58ea2516 PUB = 18acffce253b27259579ed9924f479cae312167bcd876edba88b5d1d73c43dbe MESSAGE = fb2b648ebb16688244f78b2ee9a273599d56b6198900d438a9e99c191425c72bec4f235847e18e47f57c3cb396655f778921f908580e8e83c96c108b20dd416678021bca259b98518fabb2d3532e4851d9d52add2542c0cb3efa3857a17e512438bc0ec4762e2f9baba429c03e99bec4038e6b0ca42bff5b233b24c333b4caead2de374a87b2ab5d80d6e49e4456329d51ae973bc83d7862f3d315e514481b12854a9dfc09e7d14f0d022c0ba3022578eba8f874deba4aa8c833f2b132861d4d51e50fe9aa4b787bd2f051aac50c375390cbbcfba2002b80ad00cdc12980f8ba8bcb7064afc04d5c4682c1029b10a6d45fe6ecd704245faf598c4659597c5d68a192cc1cd4fa45e84b549e8e5e67daa879ae5a520a6b5550519876a562ac49c6db0aa76ec69bb64dd6b5e1a3af2e131e722e7cdd05be34b5fcc6259aa124ccf814cf5b500d176be28ebc40bb21f03e24ccc131e0f41daa1ca02e6b00c9c53fad1248614e940d4b237760ab7569a767b7515dd2d623e57a2841b7d2441cf43049e4698d2f9c9eae7b2910f6ad65edf9cb2bdbd9b29f606e0d SIG = 1a51022628ccbb88eae9b21773c3f830b7b6e5bc36c9903ce70fbcf459d6a1ed8a1dceff5b19269ebf5a6fd3d8958860f554461f0e9fc0e29af9b1fb1744a80b SEED = 9bfa60923a43ed0c24e2f12f5b86a0716329f93d4d8d3e06238002893278c19a PUB = fb1c00687781b55b893d6b2f4f49cf5f73d2903c316d1eee75991d983a1868c0 MESSAGE = a99028b0f4a3aa5e79abef6c0df4a783ef470f1a29ba51eba00f6214e840fe19e5b6dc6021ab599bb2ee3699576015d79a7939af823535b630e3938c723f6e0b9229d46bb3379acdba587c238567e3d89bc3bd3519b727fc694fff1118bf22c8bc8bc82c4df7f5ad38de05fe9f762999ecaa795f3ae630a9a316d26dce9f1568ffa3f22b0295214020b3d3f5337c149568192218132a90709279c01d23baefa669e1c4e42038173f1319c212da144f1c4ea4c52c005cbc0b5bc283e74483a0dca69279deb17ae5b29cfafa7d0063f4e1bc93537efd937e58a8aca737228f937ff2a741890e96c5725da11b45c413a9bbb4180a419987bbf046bfd346295d62f081c76daf2b0e1eb4f6712feebe6f0a92e358e7ddb85896507c340a01f68d1b0f085778b7c44b014aa6673e501796959a17a688db0959058488a7112572f23cf9cdb53b5eb4b45f5953ba0c0c690f86bd75e89a047bebaf847c1dfc345a4f3c7d3beec98b84b0219003e819f5c2adb45f8717903d1f5bd5d71914c56fcabc7a290f9c41699c95584d6a3a16340cb17baa1fc5e5467af7ac3221 SIG = 55f202efb2a57be8b4e4fd894dcc11a4fc5f8276618ef5cd34a4495adb016a298e6480a35cfc53edb25ff1499fc532a33061cc01a250458aa5e4f7f16f51440d SEED = 6e3af45e66e22890c3f3c934f523a4d69427976e6e52625f8bad558993963219 PUB = e097364e76ff9f2e1d167f6b20c1bc5830085e7ec993c138f8b1b2175637e741 MESSAGE = 5cfc2f4b559f8205b39102087617f4d86c7ce6cb251e5f89601dfc88ed28e8d7a670ec0087d2ea5d893021c7044da2899a22d776fe90170e51c203250690d37a294555e74af9234cbf1ad8f22cee8974828a0d09e9554b71ee3bcf880ab98325f706272194eb2e80c701d441b5f8668561b88849f827af703ab0954105fd3c54b3f6ec5493596d0e3bc67818048310c4a3e0c556bc80675f201f9bb9c6538a41d99aa40c886fc431467218d819c23e78498aed0613fa6f973e2211df9fb87f44116f3fe4c26d6cb2fa334c87f78c08ca8c9b9041d83a1230677e0af788598a42e44cfdf6964a4ee80e38402ba67c73a581e552baa2282425cb2ca17ca92edfbf98299102fba761b9b71a5452141bb9c18dd95febc2a782de9ceec08bd2ee3f7f0c1bd8946dba99cf9ea086abafd37c9ca60213f0de17c61ff9c391c9818ed5cd8571778b7dcc13224962386fb8ca14f861e99f3b18edac8a5f130f7bfcd45d045d0ff34c81572a512363d6530f93813e5fb10e9cb8338a7f93800491006f4463e89f0ed4530e5f12df674f598904780ad0812b1e3521fcd0f83e SIG = 26ba562e8a4065708207c25e239b780aee38794cf983a37acbb9d557a65ceed3c0da47d17f3e8b8f4eeb1b65a2c182ea6f29623b63bb0f1c72592683b126b901 SEED = 5f1f271844d9ed5a6a6f209a21408daea470f6fd53ba6479d7407105b7de4d65 PUB = 6085d7fb5a9b2ed806c1fd30a2afde760961f7a36b48f4875246e615a2bd9928 MESSAGE = eed6b4475dc263bd2207fe9d41d48282b713f680f2e037384f18b4bf224347f5e4c4b060b808d412eaabcf733dc39a40c6bda0505ce71fa823bd1b1794847678dc034e7999c16369340bc60c64d09bb9187b2e326055a053f8e505ea4196861471622db0e46f0f8954d8a1f07332da4d8ac55712626009912f8a15a9cd63a74a03c92f246cb63cc73f92e51dad1bc9715b1ed3fe5f2e1b2959b9b71e0e37360eb29536cf797147fab10864d6146c36b82335a0ce931408479c7ede484ff73e2dbfffc6c9227e16d7a23f4d90f15584514c39594e17bfbb295de9d62adadb589dbbe0b06dc8dac5b3bf517b24c1837b39472a6dd38931ffbbff5b763638805b4e22321f7afe92cdf502fb63d109ddcd9e4051ad6f45598532be179523710851d3931e887d02c345c79c489fc106a4ae162f7df71ab90b751da7038a6df7616cfc11887e21068fb9e33be566402be504f3fc2742b881509bd4fe6a0fc722649883f8cb655598a15a1d4c229dd86b5caeb711a028defd431154bba46b48172a4d8cbd45bc90aaf874b6085fa284f5fed655ad6fa17d67b3b9a796fa3e SIG = 319bb4deb2178112241b3fb8f46e105c3b8e4ef721eb200d762ef363e2716f2a89f80b5b9e89970890a09892ad6a58808b477e943b3cfa77774a3645bc745f03 SEED = 048ac9ec3ecb30a3b1bfda9b3b79a48c0793b490879e3c8a5e23ee2babcd9b7c PUB = 946c186feafc3580a58ddd526ff229c04720250f4cf6bde0271eef9b12b1c3f3 MESSAGE = d68be8ef7b4c7a4289f2b18b16ade97f4e4fa16452976afb581693380cc54de38a07587f32e2d4549f26595fee2393bd062e9b00bae72498e4148c8b882a8840e15b585c82b5c0defb233518409916615deb3a55a5f84e6b3aab93844de3b1e4d86e09f889ac71c324eb12d0fbd861cc31229540e843a34f8d5be47c0ec0d23df43e06813fca309439904c167d1043c0dcd444b004be1ff27b7862b00eba9433b94b0fcdc67521da0c1d5358636c78f530431164dde20a1cf164f51e29b8e63eacdecc869b41392c667664d91680d9ac516af548f09e60564e814e36e0b563dbae55c627ffc14158a56d8eb3609e174381b21de4ba82344466dd577f4d1103c43c27fb83cb833d87afdf7412b4090909b1dde264daddce967f496bf6f17112bf351e417db5953b13b8f0fcccbf30f5bcf376861c12ef20eec89ed23cf384ee78dc6eb40fd5811a7b23927c13e7dc5da3a921b883a9b2b1155970fb0da7d2993dcdfd4343642a9d5a6347e43c193b5793e4453ac1537aa3d04dc9f774e840934881d78a39ba250438c507250eed2f6e07cc953f783d6b72b1cc619981 SIG = 2ecf5b8a59a8e27d25890a2aa32f4a0673275d539b174afa7b2cebf2e76280dffc338ede85ac8f614039560e2806d9e1e3cf9cce2ceb7874ffe1a7e80cdef40b SEED = 2f057d20b1678531611f48f003b7d22eba5dbbd7e2dd41b7c79d09071f85e993 PUB = 620fc4eaa34d787df675ccbf7e893204828db92ead17a1165ac7fa1ab42719d8 MESSAGE = 6e35f6eaa2bfee06ea6f2b2f7ab15fa97c5180958af2e90af918adfb3db8323f447c7bf26dc534997c38b7fc977f642de288cdf253071cacf3564e3b8ed6dce57ddfba9ff783bad2e76df124828fc1031acfadf01a44d41b42161ad9060301c1af1928b9e5b73b9bd21cac60a842b504dc3cc311c522e3bb048bf221444f53ceb08e77e948590e94ed98f1b604cb9eadc93bbe7431c1149b23193ff93e8569f113e1684d8976ecae6f09e0103614be418a472ef55bb8890d72b341cdd7505b50a45522ab63ed791ce8f82feddd7a620a4f6fb1d2fb0ed0c4560d78446d83b3d1b1bb56b366d196020d0624b1fbdb75ce735dd43e8e8df163c44e236993dca341f5132d825d0a4e393a19d38f61e11e0cf392cb9b646ea23c58099824dd8d9fbe26a49e33b23df80607abf19715799c19acc722ed9bcf94a0c29ad24b78b0b035b3241c64cd86edeac810e66745694b5eb1625060edf2d949de0d34f522df2dc60ae694a193f3b82c1d6f83a0cbb840f46c49a3d7d1cf06deaf96c64f8f9e17bd9ad512ae6309c486d9e2a78dceeca473a0421dd1b643c78754271b53ce SIG = 30df7b0b1c04fb1efa3517e928d6d57c2ca0d07f4e04ffb1f08b4792c5937dd271ccabdc00dce850afe50af5990f224e8420a681d95f9f7f515afec102efd10e SEED = 3a3d27970fe2acb6951edd5ca90dda0fc6dd229c0a56df6eb11a9c54d242dbbf PUB = 564f0dc3dc4720e68e44dd16711e049e6112000098fa62a1b98c288042f7c3bd MESSAGE = 4374f61c2cd88a3b8972249bfa79b36ab69e3ed484cc60e5d9541fa7686cf4eed1210c5d0dcf42dd25972501909193ca76ae6eb7f471d8bd0d5fb5a6b431bc3de0e0318d50514524de87c4b83005dfb41245fb1af79b84a97b83d3cac7ad7a53364e2e9b21c97b769bdc57f0703116168380f3cc883689eb4a7fa3b26dbe12bc28f8c40381af64df4b5361d174cf75acbd46428740b0d1322d32bbe94845215966ae588777a8c05336e352306d49278d328e496db65e9ecf6ce6405ed1c893490bc48c13a134e1fb6e80debe6d32fce6ef74783c8d77980a441a26aeb4fd83cc855352cedc188f5279ce211f744a40b23ce7ff24437a1dd3373ec5b290da1f94f43a07a3ffea5b5f67b52c196185bce9e9a858257fcd7a8ebaf9040ed091face5a155aa447fa15e12122d25e8fc36eaee2137c7b3aa30b7e3ff6cc86b6dcb9eaf49c9576f0f462008439cb1a3aba013e897a0faf994cb7d59ede5774bb144774f73ca30e6414a7cc7c74b20c51a1404ddc419ef7624593e9bcfb37c0a762eab68faca5863443e16edb759dbc8788732b9e4f59c11192c3fcc872af55f32d SIG = 22eb8ea0507349b6a0ace25cf9180cb08e0357b04502905fbe69b4e21b2bd94e22cfbdb851ae716a5c253c70d5e2b24ea78f35bc213292543d94e14110b24106 SEED = 06d498318da456242b9c3b9ab6d532a128fce044f53882682e9262149c165288 PUB = 413517aa63200a17173209a4b3e78ab9383cb4e39efd6794c46a2d13fafa99c0 MESSAGE = 3fe30ecd55077a6e50df54bb1bf1248bea4063e3fa755f65fcd1159ee046efd0eb5f2fbb38b5c00947c97dc879b36b9e536192286086d0dc12053610386174a7c56f22a85b73ff208c5944f393236c32415809da036e73cad8fc3c30378064a76afa930a3baae9aa357061a8c5e8e756a9cecf94b72df43facd88fa49cb4948c6368318a6b1e5cff52e587ecdfaefdb69081f28c2d13bf8eab81dbaa5e3728c4317fb793dd196bca0fe54a6c242cf26e2d129ba0d82a2c3a45bc8d1dfd6f54f8da4f5189c91ac214fdabf4c597381b2e5c40cc71fa7051cf2ea93906a37d57df12d5c7e5cd77c907e442566315bae51a2222d62e3f42d1767882637d66a1d5305ab4010a0e49c57def69dcea839e1b76a41135ba952cc424950e8d3aac19e1d93de7757c15ff9997b3d2a8613cd9a164781d1be331799fa6109cef614305a1958f62903c8c9ea0b23ba706d49c54baccc1e63cb4bf14785fc7b062a9800349bdb0bb927260b677b60f10e62c8780f3ebb5eb6ff0360263d457ab52fd1125c9ce046a95d89d287350c804cfd4ff2b2ddd18a9e13519f20b4d1e051af624640f SIG = 8250f76dc599c5128787e4f6d3da23173330ce3320dba959bd714cc8cc07c67945d63e75662c075e267460ab7bf561f24faae3b41dbf676899191e3b02b5af0a SEED = 8e8e1db5b1102e22a95c47af3661469f000a33f13b8b87b115d2452a411f6f39 PUB = 56d7b3169a95c22998ec937925bd7cad13cc65808cd5d34a6c4da870eaf32364 MESSAGE = b24634fbdd1b7661315d9dc153ba90d66a88622a4158f8bcff25ba9c29e65f297f8e60311800b7331b69fc20c9f85bb7c184bd4086b3a9f9a27102b62362bdb4fa5b201594250fc628fd2e0e0d1be03dcf818c6094c4c29121cb2bf6d908ed8aab427c3771c0c95f0ac1469a0810b603a470282e5980a60729197fe6c20ef681cd1b96932d2058f896ea7416422a7e541f224a5f04253080741c5d4e3eb039db6ba051b4ca5417ce8afdc70214ba4dcc85b623d11e681c6009aee4e6130a83edd0d2c99fb0647e11ede7301ae56b59904ef7025732cde038801ec7e8d90a9a1bba047fe628351b3b89d0bc5ae665a700891f09ebeec05591842adfcc25adc3c71c1ebc4a312e5471be67253b0e9428b0cae37645a0f7ecb89dd79fbd9be2875433667ae07d74a7983c4cea601e72e975c21df993e7fa22a9fabd45455d45e37031558e13a7a4f5f497ea78fb7399f8838c0fd5de4ebb66db290f43a4867d505309f1c1bc27e9fabcbba71302fc1204715ce3fcb0905bfa411c9d1c9ab4a39954e50b8e0cf736c10289563bdfa967553c36cd9e555bc8cc56be594847de9f26f9 SIG = f6ee5e13cfaa362c8971d5a4a879a7e36966525ccd86c5a48cba08d913ece1a79c4cd146b8e9c65125fbadf17bac1cabcde8fd17cfd68fa1f9c44ea61c08a405 SEED = 3884b8b79abfd3be6c13985eb859ab743f157cd9deb81b2fe97ea4d6173e46f5 PUB = bd7fd9a8def13a542ed2f2fb048886885ba9b5ce59cb7019fb54667986eebc26 MESSAGE = 12adafe30eaf2b9c7203ca5d44b97ffed4bf6517a49988e4e676c8e314adbdbe23d8f2d3e2b081a7024fa525ab5aae26e60057c101e8f368d3addb9376c4682c1f4224d7f149a8474bb9a8f663ef210e9572ce829da388d8aae72a467141adc153473be3653baaa64b5b1e2e30683f6f06dac2784d5bbf0d082aab47305ed8a8efd0886ce63a179315225d1e4d4ffcf1f24ac2f464cf5ed3a8b6d3998454f1c02cdbf0a444ee2b59ddbe0a174a0d937fa62865088ac647499957d281c6949803a5fbdfdd0dd9e91b6976861f3c5f2126f39aac935be09f4b9715bd4f0d5c55df73a6b9f2c0ad26ce49d822bf85bfa2346f3165b03859a71c3d2a7b86db6e9f2e5d7b169a910eeb7ef38fbdfbbec43a9a25f04bc3acfd3b0691542ab6de9db6f03058f9584024f9918edecd90fbb85735d6dcec5bd593ae63e2cc96553599a310f8f2009ba95371196b4d5b80e7559637f22926778be5e1ccef5126e2443fa939c2a53dddb04961eefd34e538cd8d7f0bec2bff1ef0d3a4bdd358317637f42d595538c1122251a94e963d1f81e7b9aeb164f95da9a4ed7529b845ebc961b27b5c19 SIG = f4206fcd34502441d54a73323f33a5dbb4c98557319f21246f260ffbbe5844886db567f4b63c47943dbb78fc35657d7c04d4feb042ff8536f672925c319efb09 SEED = ecd519f287ad395052b0b30deac341d2a9df13d6567c891c813a0c9ca52e871e PUB = 8ee94c588e0b343585fc6748fd1b54b5770c64e9937a56357a48d44ae2f51824 MESSAGE = aa71be5f557e10c9fb5f091a3a274453947c07a0e25b26f9509224541dff76f4d96effd0d5a41d319bc9321a86667d55cf49432fb5c3e715388f3f106c9174b1610c8f3075d5931c290099385ce9249e235128e907c53390036fbf5da968f8d012336958de90c5e8e6b1016ad43fb57c8e288dafe14e90e64b63791e5cbe557e02df8ac9370642a71faf851075e5565f6f9a267f4f6b454ce4c5474810b804844dda38392939719793246aa47454b9b0e82e9803c09935d0027f3995cca9713069bb31027f7b2af12fe5feec7eeb06843d8296ec5682262a07dae747ed7bc821ec17018d899fd167b36a7e3773b427499d99dc583bbe4b429afa6a26593953f943e4673bdd0d2a844256131603cd0903256f334d4f8ec82de115b6ca5338c75c8baa44b4ba963c7c78510d8de9b2a5852f42f3463c685fb3a6da61a8e0892662d6a250fcaa6fef74d450fc457b9871d08bb5be3011294ac888fce215d535c3b1a43bb47efe3ad25da159191aed55195469c59093ffb24f65d60c4020bfbe647ff5db7ab8a01d5e487b0b1b64ef25da156db142e6ad872a4dc1ee9ba668465265379e SIG = e8f51be73fc4e0235aa153a2e1b354e9c5d2d33a11ae0e333478de1d8e6c4456d2e250824c3246ca0e8d6ae3e16677a97344144108c13b959e1daf51cf0fe501 SEED = 193f3c630f0c855b529f34a44e944970f4a6972e6c3859359c2e0c8762ba9eaf PUB = 3256f2c82e7c801201210140569faf18507e60338c2cc4118bb1ce605b0ebe61 MESSAGE = 98623f651698085bde02762e8c3321f14da1619b5c3f7c1a568e8c26ff0c62fdcc412475912eb8e8c4b0d30918b8ffeef3509315e58da359cdc2f26bebfb5703953be16b8f3beb1e54a1abee0aebe24e64dbe873402e156f37dfc168eaf8a114ce08a6795d3f64f5151e9a8b8275cc7b49a6b8d8a66b6d4b7632ef80740dc1c1b0a38d1a28f7c1b29fa44541c1aad354d4590c231dae687a2a8fed09e8c1ebbfcc38f347bf06d94577e49ad139f710ed8bb1fd07663c0320846fbb455ab837ef964ae7d4eceea45fd7bd8d509f821e6eb027494efd8dd8e992b88698eec2ebc5e03025be789c18013f201f77aa2d34f5686460e43fb489e08776f98bcde2ceeb9d4fafdffe0375604371ec32f46b81fec474382908e9d250a0ba2780a7d6df407bd2b1eb126748d72511b9b069eb1cd44270f29fe84b9a717751831d04c2818e408f22789376c61c2ca45e32e788ead3a7536bf09da8af4703902f5516a020d89263e93701a2565eef1270418925f35a288e327bab628ac2f0248cfbca3482e265d1621cc343c31f65493f064bad0d7602460715fa486f29426346af53e333b75f5905 SIG = b12510ac5f2f6d33360cddc67291d6c270fd9ee62dc086b38d932d26473fe9a24efbd4248867ea7e915a30c5bfb3b8b19aa01aa2febf0dac6cfd6638a2ba7e0c SEED = a88ad0048d38c44cebe735ea3802ca576e37121c7d4d760dfd88de1663064abb PUB = 14dd8bb306803e5a758ed68ad21d07d88161d50f1c74713777da1209afbaea0b MESSAGE = 2ce8bca26178913b1676e90ffefd945bc561982660e2a75d482ff30aaba1ba43f82d2e6b909ec10fc09789ff5cf32a5180b601ea80fadece6d7e7baeef481dc6979e2f658ae0f6d8e416b93298f7d34031bb76f716ed991a16d09a582e58ba4003ac17be8b4469e1a889b2fbb2289e98af1c6d5bbee77756713c0778b0dc446a1f6c48c4d40818ec799905f069bc95341657ca5d02b7a539a13a02cd0376a50e8343c0dc20346de5275b1dcd4ad7af725131ac75e954825d30eaa57a68bb98dfc41cafe5710556647b387d9b7fd4e47651e5138050798f6d40f4ee7120b58f74da94d73cacbfd393d1347388ee00b79b8dbfeb57814121bdda60c627dce147d4d568d79052e97b9a5f3eb5407cc46461a55e18a960d8094a5fea48b6937529cc4ec919cdbedf9185456dc00e8d98ad1537ee10a057f4eec4b81dc60392fc9188d3e561785965092e44317f2a48e36605fc583fc173b05db9dcbc7557d06487390fbbba77af3a014e1ac35139caa1c53a8d17347f178e1c54d0f52b40e91042c93e7e481d792e288fc27e4c2fcf111fe97d9e2337d2fc1c3098f06684a31d55ebf362c027 SIG = 1341a148da4593c88ebc5a58821eef77f92186390ff633e76207084e7874ccf0eb1f9ec70a3a3f96b58934bcb061ff920124f7e580fa2b0b279583adf9232d0c SEED = 3f59d6a018f50a822117e5b473609e30cd64920ca1c2750dcb09eaab807a3eac PUB = 457d0e59c11f348f3bfbdd3f327de78c0a7577c0aeef42d4c1e56700d108808b MESSAGE = 7d103a6c6ba2d09087eef2254c1c903f067695a54c4515e4d13bc1fbfb54d6e7a167349c14809976da04a7e58d96b40aac3b2bdd14b9b50322bb11645f05e5e978bc7fbd02492ef88f87d668280fd708373207ff670fcda97df8485d5e46dc3bd04347f4d7527eab2718f7d93d132ba7758218894e75a7deabe693335ba0dc73bf26c288bfe9be8a736d75e5e0eaa7bbe8d0b77abdd5146e0fc9b30db9f07cf4bf36260a1f41410331f8b47c6b38338c6dc9e801ffe1d585f9b7fc31e9778bca3027c232c074cb18e5b72997005ffeee4bf37c8f874b1b246a6345415dacaca7075a60443ac3319236e23cf6b7544740807052114984b8d8f7e857dcc6faec8869cf96b997dfa9af9184ad623f1d90b8ca759b448eabfce18c17cfdf9a3e3312e63e5f084cea904c1c909913cc4b19d044a3720034973c7384949bd6f9ba9256f98cd394c566da83c31180109f16d10347b7e3e9dd6be3bd3c77ff1a7996a078dcf89dcdce2d1b615695f4cc9f8f4f2a08804641bca82662ce88faa53145b6a45955aec8cc2af81cccb5d7c64f9ece1c9983326484a1e5ece4ce36544d63735f7776f21a20 SIG = d7425ea194a6715c452ec4f6d6c76e6dd374d3ca7ae7a11995d02b942d4a31870dd734c12fca89a8eb0213eb139c14a87a6a33e818603b2e313023fa58737d0e SEED = a1212b34dbca63b7093612d05dab7b4cc8f7b676a934ad01f659851b3bb44e4e PUB = ba2fccea9a080591be71268d7e951f250dedc00416e5f3f908db6cc571254925 MESSAGE = 07c37c46be3c68d05689577aa64a932b906446b29baf12f6174a6b42bbaefd1f1f373e0bccc473ddfcee1a7f21b96a6260ef0aa1f2d8b2959e71d12c953358a2774cc5e6f379a313e435ed69dfd6d4a59adee3cc7ec4bacbdbb3fee5430b73f6051a6096c60e9bc92cc8fa059fac2a93ef7007d64fbe50064964d5a0ad601175cd9caba453f9103b25485545d301f03c5f9f9478bdf9d414bf1dca3b1c1d9daa9971f9e617fbfaf5b02a7fbd5d4fb894c0975c54592b49a0fc85dd0853f30c51502d98fc1ab85a17cc58961aae9764570ba5cbdbc96dfceb8d11da53364b4025fe0b8ba8a353ad23686720169fe973432ffe291a4b11dedda0aac79a5e42620a64587d2059e787013b40ceec599208f66ed0ca6e1be9092ec27db216ee6dadfebc21705bc4a85aee577e57d239af586efeec22cf38d1cfb3cd74dd0d9a3381aa81e6a297e39b819137ad27d475e2bf54aa426dc29c4ca8176df343137a2d79d12ef9aa7be1cf6775e5d8a4430a85c33db61cd2f35187b4f6ea9ebdd753d1c4ef72471159ff07b77870906496249d4278e3f3ca6bcbf37a265b896539190f9a31f1e7b4b65cd1 SIG = fa93ed6595bc958dc042ce1645167b79e8f6734c46f80f631fd5484908f5e51a22427ee686f564ff982f6ef4d2ca1f0ca5624910cdd63c11a3c2b16d40973c07 SEED = d9682086fe7dda30b87111060193d847566ab94cfd9c97ab6b43e7a8d3f79382 PUB = 8b0b1372d88733ef7233f6379790d1e46e1e07e9d3fb8b0be252ed04c5fa163d MESSAGE = e8814be124be3c63cc9adb03af493d442ff20d8b200b20cd249367f417f9a9d893fbbbe85a642be2701d1d1b3cd48a85cf58f159a197273143a578f42e8bcc8b6240f93271900538ffc187c0afc8dbcc492bcd679baaef3af5088434a94586f94b49970bba18f5ea0ebf0d27ee482aa83ad0dd0ee609df59d37f818b2c8d7c15f0f6f544dd4c7e7cb3a16724324f77d58948f8475a60d53e5bd510c17137c99e1cfa515af9bc85569d212a21190729f2817de8c46915e021df70ff6d60215f614fc21139904df3b292b749dc4dea02518b62d15862c92d2a4c996701cdecaed84ab628ee984fc111eecb59e48444efc0d456e2c852518441c3db7630ddd5156249a28730983838ae59ac4cc7110fd6de68101ea5b2ff69fd364e3c9448defefe175bcbe117cc11b4ff7549c33e1025b6b592048a8e31969e818dcc188bb19d7a2440a3baba4eb1b81c45679db46b31bcde7776757d9931ec2063fc6f1fcd761ecc57a7d030a85ea273ef1825b05092ab9645359a444ff7d166b575fac298308d9faa68463d1d0f7b7df8a51c6815d37159adc0b593224a818321d7219f09686cfc952259718dfc SIG = 1793e497eb521ca74e35d14a63868cbe9499da2f21b4eb5260340fca3c1feca78dbe5b14ac10f3fa76fa2e71e4c91461aa75977e5e70792670ef7ff0e6a28708 SEED = b52b249a7aeae0fbd94ffcf9a9fde10de61c3f4cbda14b289fe01f82707334ca PUB = 735163bfcfd54f9d352e1c2f3c0170c95c1842ccc7421623ae0496980cee791c MESSAGE = 1d445e8ee36f6e1064ee1281e6b4a4cec50a91c2b667c8305d1e9a5f7b73a3445882581fb0c11e64f6ee92e811f9f2d6c59c6344be7691d116dda493cade51c0ce77372b61a7c4fbb633401333cbf71372ad2f044e992ac035f5879c053004f8223f237a24a409b7894f6ad518e046b8a84c3f4c6260e6169fd944d57fbcf9ba2775f2d60ed772c46ccd63c850b80d587c5208dfb1a25878c02dece3e602e9632fc3c2c79b25ab41034c6e26b869255357a686781dfe6e644beba9b627da1fcb5ec0be497cf188e1ef1af0601bf16b2911fd9ff34f0e97ac95a7fe2cf90ea6ced33ccb0ed1ef2d4160efb07c591a5cb16c70ca1694fb36f2ca19eba52be3d4ad895abcada4b36f0261d65f59e0cfd2a6148a8892ddbb45810db3bf4a9e26e92c15ea2618cfeeb462d8628f254f54d2af27113bab4f9a7d06791811942bdc32f845922d7b2ddba959140928f8c28d98b44e1d19b97fd39cc0f9a5236d349fc835ac492192462e40ac629bebffd2eba72d2788b244bb777ad0f7b7f96f23412399fc1d87a1d087ba089027eabbc05edafee43379e893291331b460bfa7332e0842ec2573393de95306 SIG = 6f48a9f7f0fa192b66d12175a333612303e180b9fab18edabebcdf6674fdfcc53607089bf980ce35894c2f9babdc4438667ab3297a6248ec0269faa99c724807 SEED = 782a93efe0ef06cb2534330efd0e9684e9969b5258123e490239bf24bf9f6523 PUB = 942fa1406ee2683e29377e49f7ba757cf50ef0723707d4403d2862257045de87 MESSAGE = 46a4e319a670ac993994a53300c3f79144c2f7fec1116eeeb3621c76ac35da79dbff6e189ca9dbfc9abbda054847b2971b02facebbe926d469eb0a860389ac744162bf6fb13b42cb9bb8c9d72607138e7800121ee0cd633ed535c7ae5f4060bbdd271c9d110abff5e060ea6ee83890b1e92a9256d7b2ba982a3114bb6deffee2696f0a2f9c21aaa5b2defa11aab7076de6e57e86f284bb67f5a49ee685921032c95b74e7e3eac723f175af082c858e0dfa01728c38fbbb4c83581f81ace6c63c6bdaac5620eb9a568e7ebb7b72b3d1a164ef524e7b9f00799ab086715976c14d0df65f7b96bf9ebcda7feeef113422001a03a7633df5e49939a121db899d9b8ac2db4fad0c30cf0b8bdbc9e9802a797c8238e46511ff24068cadcff2448cc0bff92769223348d45d6b6f2c8f1593388c0bbbf44b6ddb50b98cd7f09c730f7de4d008156cb3cde0cab3ad0a58a83954e234a0a8a04b573c9a8e9b929ed38b8b228bf55a3c6e2c6b51f682652fbb708e74640e3313e17b4694d7fdf0111f90608c1b5af422dcdecad9ddb7f50d1bf5bc6378ccaffc3201e6c787b48c443ba240d9d50ff6c0e9df7f1a5b SIG = 93e7405a4044510166c8ac264ce3b5ba6665d68bad458712dc93c2c390568d7402ef7d57f549b8a1042f7f69a679aa855f34f801d57d79895deb8deadb352308 SEED = 6fe7bcf7a684423de1076fd76da783423373b381329efd6157424ec4b2655a94 PUB = 7740e91afe45324f8bb990ca2a341279ddaf232c3bb415f178b6092fba195fec MESSAGE = 0baf0ad440612b4c5a136c3a42be1ca2b7c319862a44a9fd50c4ee73541c5e6457efa81825b6dd4a72194a2968688bd49e5a8f4c04dbafc2e7884c0c70c208d4e954cd1675da8e74c65c497cf9dc69424965bdcba5de52936f925f62e201f99505d3777beb3c2e08b2ec9a873e5a9c21fb4a2f3e861f3cf4d6b5dcd1c88bcd9163539ac62cd0659f4ef232c2ce57fc77f90285eb350169edc6a806ff50f61c7e0beeebecec63bfc9d3983f5bb4b261c746471fcbf2892c6108970b68db5e43c4504ddae2d0ffffa28b6759ae1128e16f66d492ad61e3722c960f88692be81a9f412890ffa346e702c867dfa259703b73f525074f3227c49cec1b645a103bd4471f33f9f1bac327d7917861d0ad91abee60222ea2a3c8cac052ae9a2cbd90855d733d5319133f9541bd0b61f0995268351e2863c1ca2ca51e3c976383f5c4c11ff410036fd51d5ac56b023ce9029c620f22557019ad9b4264ed4d71b434f4a4d17a7d5769fa1e14a69f7ae419ccf5947f8c7682697116c2405f5a1959c54b48f0872f596ed45964488ddec12bdb636d0b349e749eb66092ff4511fba59b5962cb93cc85515cc86ab0c6b2 SIG = 9914cc50fef0935efb89b3d64e3c1c3412aed659b90166222c0d13ec1ce3a68ae6281b7efd9d4ec64b82e73e14479f03fbac8fa3abdb41ea4215c4a4d4949d09 SEED = dda48a0d15a29eba9a76305d360e466e72d8040efe2e89c04b6461315a9b8bf4 PUB = 4f5cc36a809416b58e15d24cc57968cb573b76ad90887a8ef36cde7eca400fcc MESSAGE = f5ac19b81f2111a0db0ae30d1513ed343e7f57f7f77d65b8ac7ce3a601174baed9bfa136035976f516d5a870f45db1919f1eb1cbecbe88ec32d191e9248821a7e7681fe3abec11584bdb33de1b4ca94891eb66dcb8539ac41163736ccfd69abb83814dd38cd60381318728052a25cb665471058650ccc75756dbee688ab826ecad4ad5a7db57e8f65f1b64abff82dd53334b797ac40228dd817f239d3ee804a19aeac8cfe33eb657ec9ce923d6b388914cfba2e72bfc2bc3d6f985c0d97534db958eede57b16491ffb755c1a58d78ab377faec0d311818e899260e3ebd1ccd29246fa82d0b76622b2c4bc52f549fee72a30f554f331f36d2a74d999ec10a08294f002b4361e590279c2fb1bda4312ccb24d75282ce7c061a0ca5520c74f6f6333b18c4b541cb6c51e01575ba80512ffa7ce0accd22d14027c53aba1f7437835f1114d68e3acf3ff8de94c8e4ef6d3ab312c91d02970157508f54a5816f467a214e9b1284300289e65f365a610a8ea284666cfe5518e435bccd21627501c725f0b8eb5725e0e06e0cef5db201b48ec91ebf878dd57ce8dac7334848a1bc82c18b065955e4f59be3398594dc SIG = ce71bc82d531d0f93b57bfdc2f7316cf404ee09af88f33bf806c7cad6b8ffa366236ba74e75c15096ddaa6e3a62a8f5eb1c8c3f6b6c94a6a349fc7c0cbfb190d SEED = ec57b941adf3ca13e77a780577cfd0df5b49edc85351052da34e99f8a9bf3208 PUB = 2859c071978a04b7f5407b6d22401a78efd0394bb966b9a04da6b5ef819de3fa MESSAGE = d2bcbd1bc361ab32c66d72fd48a8e227dc6b8d6b150848ba715ff47dd35c8e49381bb4e2933f42cd26b75b14d9c0039282b62b8556aaa11cd691e828382be306889fc9205137b169d3bf17b7f37693fce286039f03809d7d9d98c8fde46f1101942a279c516706f50191a9112f6a24630e1a26c321e46c9ccc85b6ef942f353a642b9e7ef998c0fce2d3a75b999eeb77f31f9b0813a97e3014c3a86e2558734621a3066dae35845031e35665f1922907dbb739786a8b7658ab60276f2d921d1a51230fc74d19e80184a4f10e9e834abc9a36c429726bc055dc8c063f0eca9c61a8a970bd4bb5f424ee4d04bfc295e3bb1f34becbd9920fe2e77fcf36763f32fc9cfd5e465979c167cabf5a1244b491fc06b8946419046ba516c5b233c414ddefb6da04f2e13daff7a9a0c02a518ede57ad9521de64eddf6f49a9670f632d3f7d42425207d053604fe39d13b9f52c8bc292b0076ea42a560056df25de51ad35881d08543224d7fa5d70b8603ef23ce06339d6cd09e22a95749e50dfbd3b8ad69fd30496b984d1c0a199c8594805f38ba44631a2c59eadc6554d19f9bc98366dfdec2a121d0e4814d2cd3f5871 SIG = 118e1462126b45b8c6803523755c56dfc4e123e4acbb66ba0ba6fe3e053da4119f5719295e0c82ac64d7c5cb1ac898df263ddfd360f3008d91018b26f6a1730a SEED = cbfd91d7695c1f270f69246ab3df90edb21401101ca7f8f26c6d00f4dcb7233e PUB = 513879cf79d2f46df4b85a5c0949eb2116abf981735a303164cbd85adf20b752 MESSAGE = 264a933f7d0aecbac13eef644b0b53dd53a1280904100dbc1ab87b51148998f9da0b3a0a6337f5e3486c2b7e548d211259397aaa194ee4695bf98c2d5f4487699f7397e5d3a7e6d5f628fbd05497c556a50a4d05e2b712cdbc351068e42af19538901b8825310e343e1a17a1867dde0eb47ddab456d316f3521554937bf808ae4e4bc1c3c5b4756e4a165ad9e8827f5316f748cac6998ed2d2104f268407c135e62f26a922460eab6d851639a00e5f08b34765ea0244f475bbfeac183e3b5bd1aab798522798a08ec6bf2257d4692f5b03cdd0a2133de970603e3251475aad8d934af6b2bfc7a650b91bdec143f8ad254cfa506bbff28a03beb659ef5e5ddffe76e23230c4ccd46310b37dd91fa6aa68167f62a55c8a69f9ed1ec6cdb144dd81ab0bcbd62643420bcae67869f64c0b169f3cdf3c905895b7d35b6fafda25ccf23c3d10de32e7f271e300d39597da8f843722ef08364a5f7a105b9655172df7c82d7374f98264c9cdccb496f2e10fd8262fb1a9a9965b0b841ac0d0e9c1a3d9493ea7aa600205b8f900be0d7abb4d98a06583d2295c276318be28d421982dedd5bfc33b8865d94ef747d626af99 SIG = f336137dfe6f42a6669b55f74b80b3035a040367f90656fcef0a644c52272ddc39273cd7726010ebcd8a30a05201ab70b8ff97d0288a2cb94cbc49020647390b SEED = 51a4197ab7686f82f6003a0c32f39d0f2e47555f4e9f8deee75bcb1bd1ef69e5 PUB = 06386df86b61f1f8f4dc45b73edaa841920968bbd131cc5ca1c5294eeed5c8ba MESSAGE = 2aedb7e82f1fe4ce469ada48345d006d1b3bff40eb21867f51fce965640c409ec13ad4d52f891bd79066d6b4d944ca868d8986d242b57eccc4c4a488291b159c8de4392be4b86febaa75eac5d22d3c4f8d6bef79adb9b92b4914d5ea07c7f021e2c29f58d07be8a084100bc152d51ca897d7c131644d0895322e9440a8339e1aa390a7f4fcb51ddfb6df48aaf5676337d87ddd85b1d925e1a9c29fe0818f514ef72f747a674946476907a7ca99e9db8d209641057a7f44a317b90974bc86f9617a968a76a6b8387cf5853e608190c1a79f1e1d686e0de22db6cd9aeb8532c5c85cc90b5a018579f28e502a770a4ec675263d0dd781b4fa53c9dbf8098d57b33ae2afbaeb3e68266ad9aab7174ba68c6479883992670ccf3e5ac6a17e65e31e1fdc85e269c80935ef574f20d239568486e7d94a4f724ab7006098b24f3f61587691435c7f29ce4e5ca71b2b1874556433a358c8c5ef3c880843030c2d13d51b78c9bf1a8824e62e111844396f5af2e25c3126ef3626e26efafacf99830aa41212332f378a167233a0b42213afe36d83dc4582a79693b9d571a57712a08b8566d361ac902647afc886603e24283efb SIG = 2c072969ff4719212a121938b506c602995b4d02a22e6198d6e87dd6ae076225ac70bb25ef8c0ee81eb6fe953df6b1815949e8ed0506cb012e873cd36cd09b0a SEED = b1119c36118b7a065a195bfb8b79a5c287e09bd287c2daac5e6b01164c5d737f PUB = 88f218ecba99e770ed214a8d01a92a10400acaf1f6eed420067e136ee2c0c670 MESSAGE = 8816b1eb206d5f6dcc2e4cc391d23209006de935e318152e93fc8c2cf08e26432bad9adb3203d898df0a2e7f1f83dc2f3ed3205bec8efcfd31adc1aca5755db9bd4efe54cc17073077de4a3fdd11996e84b6a052f034b41099226c9c272eae12528f16581b91b812850c207144dbff3e850cca848ec2b1dd164744d7b59337d7e3efef008162e680bd4a0899ced60b171f8cbeb48c5158df6cbfdb26240881bd58ebb8b6a079587279679cb5ad82f371b53c8013804c35596c887e436d23926f994e09d98fbb8ce2704174ef38b68262a7f1a712da0ef0dec639606814b3bdcaf253ff31c48e8a752c111bd7101031cc3d38efb0c9c7f19c59081584a0e015ee7c75b10a4c51ff543a30e52d5f94d8188c6b08e9df1e84a4e2c807170ac124a771b99465a0d38b1f1c6330403c82543582c5bb61b220de1b9e0ef69bdae26023181ba4cc077a5f0d425732ace132ae0c6ff0bb18baea83e8877afbe650fe0bd02093f00a7b5365728dcb66fbb881f592945058a5b350665af91c557a547250ad295e68b4fb72457cfb9d5ea1a7b2a39c9ab7d7ace0af5d51669cb6c2c4c07b2256d10e5ffc6b97c660006313c4eb8d SIG = 24ec1e54fc7e722d37551d02cf135d33f5d3ff535773e02991ee85ffd3aa29997f9c464470197fee81dce110609f870b27c18dfbcfd9320548525e93148e2205 SEED = cbb587514e0a34ffc34cbc04f28c9b4f6465f1eb225cca19b864876daef37d7f PUB = 6b705d4677d2d849b6744b1ebed167dbcbf645924b1ff2e6360794bdd0e09788 MESSAGE = bdf7d17c706796efd3489559b527b1c0584b9022c9cbda3aac5146da340d9cea69f916037cd21b3eb1104348880fd5c5b7c65ff820f7499346016951cb715d8df2b41c88cd3c66105458b7b590c21c1ae2f6ea9ddea7470f25e02027d171e0e574a2bb21642f8f9da508e21d8e7335b5ace5935299407bd1b01bdd1423133ef045234e701f55549434ade94a60be1e1406ca5c758c36799ce1703084476e484fb1740530aee84266d07adfb4cc689f3265133a59cdf992fbb9a4b12defbe241ddbf65d12b2fbddfc05af0fb8de42080775bad29c6b0459841cbb648a9a95e48d6e36ac514480a3deb4b36554d8da620808ae9d47329710d20aaa6e5d7f547d81ad30f84c0e3d239cde5b169d9ddf294832d67a8060ba329c4ef39be94ac46434dd2185931d1231f9b6df878a5af0831e0e9d8a08d08069ded6a961ef7f39fad501ffd17d6d9b7c654653c1f58fcee1a6cd803d2aef166c78ef5514a3276d6998dc7c09a3fa982e427c785aa6a9e256f7ba72d5a6ba33eb46f1f9fe9be2bfc14109f64773c00c063b4d5cb4f4f8a0beca92a9a016c4f540feea9c3a31e313bbcbc2ff5eca9967857f5f8a909a29d7f20d SIG = 1274d6f356eb641472b6b9e5b3ce65d2654e6cb87d3a83fb49d0f7da9c44be2b532604465f6089d680d2d94b0edd2b6b2b805c5e84c379efc059673d31007a09 SEED = 8bde3ff61a16995ab9d539f6053219081bcaea1d458ec33684fc1c01fb565bfa PUB = cd9d782a356e847b7a04c885a9b0907cc33ba97ad5390d4ea5fee5eb198d08b3 MESSAGE = a1f40ec5807e7a27069a43b1aebff583ef037028c02c859525eb8fa4c3ba95a901ff3aed78c4f87752fb795522f5bf715be7e3defac10fcf17e3fa5c54b20089a472333327252ec945718fb455e3f27ccfdef823d12d406e62a4aeba3cb9d1c61b2b17e49e200a8418f935f26eeb57602c7aa3b3a24f7e6238d3e08d2d609f2eada0332bc8cb12916cb03b0d4f9cd602002586d3e4cc7e0e0381c045ad2e1ee28298ae7fcf0c10f212808565296f158d2c32e8cb28156581af52bfc3470c3c9582138d2255e8426d648ca237d7aad2856f171638558241d8ae3f62ba92db596568edee3ec0ef370f83626aa0445af08f967863660e8fba5a41c8e8ede1c960514a14687a4a81e776ae0e8e777fb0f250d51a83b55f8c1ffdd78df3bdc97ff177afeca046c72d72af924ad0d0ab2bfc11b7f4abded51c3987a8bb94d640c8710e5fc9a4190e8a008363d7419cea17c40dea20ea5156029f3debf05241918f54af5039e2c4cf2ca2e139f60e45cc65595cdf54a67d92b6ac66fc0c5a290495ca57b07ef5750d05f57d87d0c228f7e4e15ad0ba0178730f951c697583481c66cbfcd48032544aa8d50908304bd81940308706 SIG = 7464df0b67eb90b4b73ff082ad0d60ebfe0660dae97069b52c3727223bf70e29e48711a2bbb438f5f8d8a33bb9c48fe7b628fa8a542ff0b5ae36269d4007a505 SEED = da59bbc523404f07646add7908294977e46645bc8a38bad2809641a23de3b15a PUB = b22c0f21aa1c2d45f4b2e56cc9b5e02f9e31a2eaa367ecb482f874cbd8e9fe34 MESSAGE = 097106c3624d774dde2551e0c27e19504e6518cc86369ab26ff810969e7de24abc68b4b53f11d945d49ef078eb4f6ba6bf257ff7b608afdcb30a5c59a756fd77a6c1247f6f2a41100d99fc5206af3bcc6de1d3e4968e28fba0123f6045a1b54d693a42bdfa071b2b914b3c3c0c29b2593d07e8bdc86ca42ac555b7dcd9439df9fbd4bbec730d6327bfae4fc41ed498b4f04a0eb14cee608283aaa6e6aa46676bc88aed5d9939037aad4915661af94bb5f6e653a2cac123287073270e0b13fda1dd4871af6a92f992f539df881712fefb038540d41191123b6b3b4b6ff87ffc929a6be53c6cef02f48f2f0cf2fe64a45fd66025cc2d7ee55ebe2316c000855661165e2a5ba41afc2097957b6fe4c55221204b6fc1f317dd3ba13cac39924026bdb66be4542268875631d277f210107a33767f6d9596e25742d7a90ea791ea4bc9ee84a67fd328b80f791ede96d89663e937f0b755baa9d52bda210cee1db339ff1d3c4b000b653b9bde338049af84364e2177f80dd51e2a1672ee555d6317589f6f1d5abe6c2877358bf94b0b808ff857363fbfbe32e97337e4b8a8c221a9e75962a8dc9b5a3d7ca5f9c9b61c73c1469a72bd SIG = 1472459cbbae2cf21ce44a15bae9fc85dca40b8182da7d52cbf56ed538d18e03477c140a3ddd0efba43c96aa92f5f9bcdf3481286ce762a7e2bd1e779ba99b0d SEED = 40ea82da41fd15b06ffeb99cd616dc6bc8c1b21477ea239466088e2849bf1016 PUB = 5910e580bf412c31a87451d9ddf32b3ab713f9e4a22c590c641c14a5dfbbe0d7 MESSAGE = a06c4e02b83ab7e191ad818cb8187b52a8da004fe838db333c4e02548db6bdf791444642e57fdbc8594e59d7023280bbae82986f399805434bb072c8a27a2dcd5aa62f065bc58b0621fcd365f6cdbf4d57d577d91150301fa48f182f87e8dca7ce45a7d64845ff434d1bab0534ccc83aa0974e88b38fc2508cefcbbc82135b73b384c80eccb8a09e2873cc07129021d81ce129a9df65e613410af950197dbf9afc28edc4e65c3e84da40d2ef841b886bc44719a5d59db2c6dc776401c895e2b3c83783d7817bba68baff59470d6015bba8d975f0eb712f3b8902912805523aa71c90499de689d31ae44e210b8446f2484727cc491b92a8e8b199d628e1df79a28c561e5a7d882e30787d08fb2d5196ba61196309b3bf0c5824a3548c700003fe9913befe12223150012685e90720e9ec6bc4db607425aec531c4fa36086d3b9be391a3f04635a8077a447a16a6fd89afbb9a72d0d355cb0b22d562f43f59d4e37128b3e2d906c8ae23d0aa599c70d3778a076c1a39728f1d6937bd48b978740850566138d34852b63075e89a8e2280edba6f4ee8f61511e9b768e95c78d197b693b109e88818b486a9dfdb74b4c5550acdfbd5 SIG = d298fcc9a8ecb76a98d4a71dfb01d276ab2d9670a95bab34cf1d8364516d1ebdb23903460215307125afd09c758e981a452da95c0ac2c0b958c6917e6874190d SEED = 28bb81a17d4584754d52818cd0f1f21baa777e695844a15122ac05344dddc027 PUB = d5f61d519944d13b84bfa7cd67cb0bea4ef2281efa461f22ade4ba882d11b252 MESSAGE = 92e84c7a55b0bea03e17cfb65f7085ce3f445b1542bae997de5f092a24ff243380286d137091a598f35e6dae1a1c648f5a494c819dfb240652ff908381f32d70bc513100aca16fe7220295b1c71835f16d9310a9d27a04a980ace297d5af3f7cb7c78b24997ccb41f54ecbab507eb73ea6a3ed470e49590509f5d1e6032a2605db87f4a9b9ec91602583f14e2fe1bdb900ecb8971196b55c0d433489f26be9ca157cbd56572887ba859f39674a8e0ca08f2dbb0f27073551d0b1990685178b1ae9e7885499143d9d72c8571d11e0d85bf58df94e2a74d9b6846557f9125ca0944ce5718d2cbae1672ba02b847c17a6f6b445634d2f0175a75cf6883c62e5b521c57141f218b2fb0994b372a716c4a217434beab75740b8e91c622187d03c85da001e00247312a465225f5d6af232064a427d3018700ded774b9026777a5275fc04754606c86600297bf7b71aaff8b9a746677a3662f3750e81b50166f6237000051ffa15868defdf090057722ae229964a4ea085e0dbc04ce1997722c5bb65d2b47ecb746fd83a9f6a69c81545a9b502f5e76d3130c5afcb1c9af99d918740837ce89d7cd213fef2fd062ce8850f69659e4ad327 SIG = 9ce45a07dbd28d3f6f1b35630a3fd56f1d548f84ffb1c6ae64b21498ae38e596916e77f79905e609fb1ae0da36138a80f242122167068092cc605796c5669e06 SEED = 24bfd4fc45d5093585678101cf563ab8011fd6430de155f2a425f0633ee3b7cd PUB = 9cf5c5fc0ccfaeb28a08ba67707b18dc84ea0698ffbdbc169a09c28123e6c2ac MESSAGE = ba54128f45be2001dbb060d5dcc47144997415d4294f6eba8dceba4f6cf2234683c4265f88032205296e9b27d68506232d57b688407648f87ceb342052bde9d0065542ff1715c942027e67482af4bc278ff71966fb3f62a2a5323cb1b4bae1e7b8fedcbc73ea05b4076421b0b4fae8bc3337416a17fe124e7ee465ebb38d8792306429d8279a1bd54c37bee8f9c85eebe3afd1f64489d4e53ac5f50657bb6ffb97120744b75d47c6226d5a9c9c264ee3e6a6ded05062ca1006669118454550010919c2633cf086950345e514af3843148e5c64352e69037dfe60d4a8eab3eb8cb54bd39af2f353d5ded2e2bc8b11c09f612e128c6efa41f6eb2c958087be34c6335a43005d11a9d3b5a529c2d1b0642f77afdd8c6b1d6fb2a9dcb65f42f4eca8ea9a054058be8613667610e3eed8d1df0739eca171954117989d1b12189ab57904aa960b0ca85541746385efa985be9d97b5a9029989a9c71498dfabdb813681f57e276b64db491b8f082a885145469a531b7f9f04ca0a2c2f8dff20ccb99c2861f54e5eafa962cc53eaf18d3d5e50d337af485f19975f05930700a8a7253f11f184130d0aee70969d96fe08f216951d9dced52388 SIG = dc935b60fde44359af8f50ed7f919f483ce3f24e2320c55ba92f3e7617c19bfb54701903ff183b42cbedfef0875f42b12875d36a0aeec73ffd09509d92b28b0d SEED = 2fc2f9b2050ad7d139273e93e2a0451c7b5cce57599aa6b08d3edc5bb07590c8 PUB = ffe5a17880d718cc7988c2fd9825b03b93450ac1deb8fbd1f1bf3b8f87805954 MESSAGE = dc1297990cc027d56d1fee265c09bcf207a9583e6bab8d32478228e0bc305b9818154c338ceec34b04c4ade7ac61dcb09bfac8ade00d1f29de317060b8a4daf1987de409ca2c3fe4380088073ccf485e9a69516b5bbb4130f20be69b2dd6a9b465159cca1ac88b328b80c51b66af7f4c50f6228772f28734693ce4805a4163dff14b4d039811ee3fce65935444a6ea9a72d78b915c9c3b766c60b7e0329e43c9c57ede94b91525ce5a075a7297219772ef3c029649b586a95a73bbdf16d8fc20368de4ba44de1064be5826b376be31a86ca478a52efb98f1fa333157719bd6e0da80ed68d0efeafee5a13bcc3b457525258f1f7e031f7b403a461506927b1e6c7d4a0c8d84b5f3dd0eb8bdb13edc2b514a81d088eb077a52c8a831861feee8110e41a325dce206b2d67d25f90ef57e0fde709f3e5a39c04eed31e57c193b283e2da7279ee3f1eed482b3bbcd373902c1df811ac33e1de06429e8f8443f602019650bdc2ee8d7f650036a7a22b8fd88517511229c729a3269b3a3e8fc72b01b5a4b3e33f5272f3ad21629d08b1f717935e9e104add2f0f2033432bec82e2121d98c9c1a58e0daba25536a1be8e5088347f4a14e48d8e3 SIG = 7aff162a3c0d28dff41715a974af07ecac2132fc18bc43a198fe664659050da19ae22758d52c9cbb94f1358bb02610a8a351c2116279e7245adf69675dfd360a SEED = 8afe33a0c08aa3487a97df9f01f05b23277df0bb7e4ce39522aec3d17816e467 PUB = d004370e6edc34b3e8818667216f5b226b0ff75a58484c8616e1a866444cab57 MESSAGE = 86fb741f1b9708929195031aa1645fb709a8ae323fff85e5470194452e11b7b1279194b5e2427ce23e1d749c3ddf910b017e4f2dff86dbe482c91bd994e8493f2e6824bba3bc7d7a845f217ae9760b3cd00226d9ff2616d452751a90c3d0d3c36d4ab4b2520f67288171bd3a34b2eacae8d44c1e153dda1f90bcd3595dad37713b8d340156ea90a4e135951ba7169ac175578b81e97a541ab9bfb76328798d7d631c14df2ad613e9c6e1147a0e84062ddba035859d46bade5fadd9b32b43dad483c6b8023b32391e51ef1520c68c6191326c494423080c623dc4ad0aa074748d826c29644c38986a77002f0cab9068e6c9ec73cc2e0c584b80e0bc375721f7a8fc35317a5e240e8c66092fb6305b012c70e17aeaff13386d5e28d06430ca585b0c85b274e7fcbb63e3423a982579e5a64a0262c41908e55dbe43dac1e5cc1bb7298be428720a12e3b072559ec2675d457aaf8f13252e28aad63c1513f5f239564d363c8505ffa4e50f6648c1cb82bba852bff0acb030cbe73f059dd87bbd7318c5586e708618a4f4c9f3bec3f4f07c609eebb24ba878c6bf1e4f2d0fd1450ab94e31755217786fb15182760ffbe5a267cbe998a4ff90a2 SIG = 63a8aeac025f2dde9a73286e56c2d62dcb79a241ba0b2e2dbaca8752ed2fc8cc7ab8e6600b67645fb5e818a4e82c29180a6b2c3f58d099cb635ce52bdc157004 SEED = 6dc7ccf329378e8131b6defcd89370301068946336b0b762ac5ea51487dbd39e PUB = 04e90d275e79df5f2b6ef4a31505aac05a69459baf2c581b3ce3db29f0f1fc14 MESSAGE = 20cebbe98401ac8934c3e65a5738cb0ec0cdc75fdb09dc96312894b187c0a46d2c38f4855be3eeccdcdcc56d926a8c08ce6e748e2a858f53532e7e5fc5f7014c8c6f86310cc26efef30ae525a5157940ab535ed8e403112b08e35e2bb3dd91a9ae8f772d2aff37d8c40d2b5cc887a6f15050a0f5bcf0360c3a9d12d5918655edc3c13c86ba6f4a2fa3bfcd405ed38f871cf7dff0f75daf2c321084ee9fa81211adb105b25c2288f0f2f7f93ef656b2de190122e7a4bfd4a1bd9893a8485b509ff0bc46cc961051c1db5a12490c7e741922ccc0a665496470276f69c7b77098c1e670af6b9f851252996875eb8035a817fa9be07f2be0bbb12025e0565414c817e9421ac700373893862f24cb165f9a271a64fd2305c6672c46767f8f075be5d2d4079bfadc3956288b0215605311b5bf32f0037b7c5ad502013e82ae3419d9d8f39c545b5888f47106c94d5fd6084d26034a99f5dcbf26a84eb4ee149c62a0410d8c707b1a9b071f74ed23932585072ce6cbd33d4d54ee917916f5dfc64d26a498018438b455739345dd60ae0f4750625915cc829ab6822d6f05f6d2bda0a7bf5601e9a2ed6de960371d17e6f43709c9678ca743adfbdb45 SIG = 04509db003a1a6ed3fbcec21ac44ec10cc06d79f2714960882170316275df80423a1c1a112d881fc24d2812526079058aa8b608bfc6b5e57632240c636d6eb00 SEED = ccae07d2a021fe3e6ee23836a711b97b04e0a441f169607572731cb08c269488 PUB = a32265e5328a4f49cf06b467a98b9f9d5b997b85dfb7523ca6a0a1d627d32891 MESSAGE = a4bf8297d0dc5e4c92bd00ad5b9c09b1238b503d619116ef74260378349a9282b41f3f4676a6215e3ce6d02238480a96043b2942b3feed12620b1fa97f7703b3eb683c1601bd2f51825c450df4fd1f33b0bf9c23c03223789e06e24cf136d3b557403a66981f4b777dcfe890d2ba96da4a4742aeeddd6a611d05fc215694a5d89a5de6760b1d9415155044c049cb02291a1514faa2e77d2ae33d44585bdac6365bf481d9c97833937eab636ed65742a0d5973b24d54089b2daf084d5414765105e4eca14aaadd1053338a8470505232e4ac633345c5cdee1e4653d1d93583af11854b1d9b65fc20281838c56df1148f35ccf9bfe2f3f80ab73f5b791cbed2d920644cf0316f0cb5d3662b9120647da56afbeb47a952953bc1a37de857e4b39fd92b632b85159f46cd05b6abc2338d4632d48e9a178860de8f65d9bc23f24507b7c5629e0bdaac067c476c9c3941d86f788944d744852a61da716f95f3b04f0783a562941bcdda439590fd186b2a8ebf19a5a7e4f4a3aaab7a87a434524fbc9799c9931eb8ce4e34e99b608cac94ab7e74495668df136185f487d9fbcb6605ad725345403ec57f3f6db364a87f38fea4b4c271552e9f2e4a1be SIG = 0eec754105447f97d4a9cd246c7eede3fd069018f0d01a41dfabca3e90a741835ea4a9d682342267b250fc1c8c547c89632d9f689af536c7929004ded0d96f09 SEED = db5d5f41fddd6768709747ab8239bb4f42a31d34b4fa88824d94bf78d3149264 PUB = 03858ce6b2d24079eead66ca0dfe772ecda9af4d46bc9b5edfdc286b95fe9716 MESSAGE = 67ee03de45c3e7030db5246ee5b51bf298bba3e4d0934937fc12d9a629604c53c070e30d611999a9cddaf2d9acda6a9f67202b352369d48260eebce0e78e4d5ae54f677521f84a7be0017fab278b2b57275efc5fa57c617186fc1ba49edfbd3308634878d864f2da1583ca8d56ce9fae77c462039abc32d0539c0a60b7bbba5029e9329d275683d9c4ce77d0b908ade98b0e32b4420d9aee2cc10e4be922f9572582dd8967141c1d402e215f20aee0a890e2368e406dea11bd11177f2e038aa2f1a0dff51a128d955d5e5f8d5d0009aaa82440a96864d6c697f910d1df230f467f0e02a2e02bf9e45da95f255410cc5aab8d85f449a5de99aabd44fd763ec14629f3dbab1a247bffb7174648e43b9fb1eb0df5e4109b7a88e05512b20865bad39f9ea79d52f5188e7ca5194405bfb1a09727617f3f6c88192008edbc0c6585dbf261f149dffb593d42716e5a5777f5462beeb1e9a56a2c76e6cb735117cc1183a38d1e00b303d174aa9cf5c731b2c70edd79cc5dc96f4018f1d71d7198bbb7d134cd2ff8c15f9a04280db26a8fa9997eb86b133c022eda15d8ad5e77cc9f62615960bac2f9bbc3ebbd198f72c572b97156fa7fa229a98014e170 SIG = 5b3d0da7102355486be4d69cfd65886c9d9c8738b293cafb23b2104bfdac8d7d01298eeb18fde3ded6491d41b419cc663752c4e67dbe8986833d20e4ef34180b SEED = 7f048dfcc2650cda59491d4ce2b2533aecc89cc4b336885194b7ad917db5cd14 PUB = 08001b5d40958bcb270beea9baba3387e3a4b900fc42275657c6c691a2e264f2 MESSAGE = 917519cdb33519680bcae04faa790771ce7d1397c345f1b03dd7625776f3f195809932618b1c64acd93ad000ead09654a33d14f748b46b67aae0ff12df3cc163280f47cedc16a8579034e49884296772ecbdbb71ca29c166233533c8de54012b412ca13cc258f7c5465d83422f524e4c05f806313478319fd143cf5088e69837697d3615d80a7fa7e7443fca65e753ac1b11d8eff3476636ae02d7a20f4b2388dad684002f5ce957caddd2053d0ed533132a81ca19bb080bd43be932028cb5f6b964f008b5b1c1c5993bc9b5485b22bbef701f0a26a3e675ea31122bbae91d864b54d895afdc79ca58d4fe449213353b149f3143b5144d747c5b4697479ae68528485384044aa2c99ba4b17b184e94982269bde2de0b17705d0bfc46d6906a90edefe89195de6bb8f3fb6a374186c7cd086d13d1b3525a3994dc8020e1a00554ac8a82d6047c5bff5e7f12450f4865da161e1a021fd9be8bd33a32bb54a4ddf874512e74b5cfd3fc3cd9ac11edd878433668e3fcc782b97b6d905adb0ebec42c9254ac90f35822c00f97ff3f0c7c39ed3c7cb3920f5608bb45838bb242a52a8637d7cecdcf489fa183b45451c6c9fcbbbf914f5f7e6b223bcb4675 SIG = 583370971d24652ad213c42615911938fa9aa3d9b7196940e6eb08151200c7b6729d1eff8f4f0904074dab3ddda6af1e4e562b7d6220c1a562683beab268f80e SEED = 9feb3df88c494a99849c6fca194201477a2fa7564e29fb06cb44c1154e8cea3a PUB = c35628ca6ee28ec1c239ddc5bba2a9e09e4846816b143c74dfa2aec1f62551b6 MESSAGE = 95fb7581bd25ffd442c3ae38a19bea7349c7b7683ba6767e148f0afc15373f67c16d471781202e6da8054ed7fb9ee204cc0f63c210a670a5f9ced4294588196330d31b8e8392bef6b48fe3c92078fae11284b4c3ba20d937e2719de7bf67c00669ad23e61384ebdf8c6e60735428c084fe217fdb4709ccb6083fc0ae4a05273eef739023d34bb73f662dacdf110b6dbd3e74fc1491e8c96596075fae5c36aabe2a0a53052bf77c4462438063aa7bc0c50ab920c9eb288671560ca5ba7af44a53db2e2ff43ca56069ea5517cb214e76faa53dbda100003c4f6175414041be74de22ce155d2281b6f4035be39841afdb96dd89aa808e6865bae62d6bedd919d3e86510b9fa5fedd1977c4131b2b86e0f48d7215eb13d5498ca5d2368f81895ed855a527124657ec9539efe3b2499a3b0b338262f26340e22554c79f4fad2b4e419c70bc1a2107d206456b6368781be4b5e2c54da42d336040fb7ba49c32d752321adcd92986e78bedb226ceac50292089bb579027f702217745afe06a5be136b3998a3604c9ff2acd6fa3f3f71633d3102fbf03047c5486f84c4dc2447d863796383d55f08c981fd4dd7dc1cb72b8ba4435af6abdd74e6f6e6798f1ae2 SIG = a1c2607835bec1a1d87872fd8ee488d0ae9ed23d49fd6786fc4996725e49b3262118babb4834877c7f78fbeac02df40ab091b8b420dc9951381e3bcda0670502 SEED = bff68955dd6ae0e8ba85ab0d0cdaf04a9f5befd5ef6014f49994a78363dc17f7 PUB = 0ad9493af80b15f07a521ccd674fe9e5212a4a28c17c74f6605ffef78a4aed72 MESSAGE = d8f5650aa3581c4d39bd1b8afc96c1ad7c4bf723426f9d7fabd1a5c8ac1d2fe54a971fac765e05af6e407d7269bab661b3432292a484f952c11095bbd20a15d77c41f8f3731a504d518ee10cd006c96ee57372de5bea348ec8ba159162170c63e970f1c7a3465a3d592e1d56c6540fbdb60228e340909646320c95f25698cd4896bdff58e2561e3b3d9a73b89747912a1cf467d63e41455fda77477f46fe6937bb0e79d92ccd52e82dba908a05a57c7ecf49554ab44c0b718e3bdd5fc0bf7070d9c58f860591c18bca8b3a9a148a06548e0f01602b1e6f686037c94ff732e155d52d5b0b44703b3d11163e3f56e3b9c1b86476e4dcbfc53fa05984e8c75dd21843cf96f9e494abbae7184aa42736633e3811aeff402b2fcb7d7f702e447241e22a58842fd6d0c03d33ff5b8c792200e173daa7b217e4b2f4433e6c020acce501b9323aa0241144434b08e9d2469139ff67342208900546200fd971a65dbd6db6c21e3ef9172abba1ea9ea2a249addf1a1eaa3ce11938b13e30913cd0dad491fcbb3285ea378b8ef9227f3fa80b586ecfeae137066f8448acdfb78d6d3e9ef4a6b362df4241ad9ae253b8e1597d656e000cea447a02fa4933328609bba0 SIG = 9319eef740633ada1af0e137644c61fb3e11ba4b01d3c6f25392dc9367872a23be56310d312efcb91bdbab78a75e576ebe9081972415f562db41baf5e2338b07 SEED = 1ba919c066bb56e640c3335968e1d1b5bcc093383e2d7cf8b5fff5c61ec47a77 PUB = 804c90bdc2b3618b01f075e041fa971b83c5b6cfa3b6b3974f3fa43599beacab MESSAGE = 87c5c75d8ad07d52acd781d1bb95f78c70e21c2dd66f7aa44234152f98234d128358a8aee98ea903a77b441db1447ae6ff3432ddd4570f7f58036122c1fdcc93cb21573739c19ccaa411508e08de2606f3d8f2db89df6a44a46133d57018462627e22f57ef36d1de024de3d4ae41b752df4821155934b447b2effe512487521be0356832a74ce0e2d8301b79f93175e8b6b961b1df637d8acadc884543c6864f8025ececec7c6e4fe0fecfc40dcd95e8d6ab93ce25595384436b598b73c74b03d49ed5002c0f858cfd9d0df61ede937cc41659d6708b96fc5aaadee109e2a68846baf2c246dfcf3d27c28bd1371e35fc9412631442ee75f38c6e4958070a74f6e6a220f75c7280eab4737d97e37882f3624811675f16caf60cb944bce92e75884c56483c61f26b6371b1b51237621a06543eb4abea7becc4fc31dbb5475b3deb9bb3c8992387104830c6072afe1af244bf681a40329c9b37772b09c5e88e78f7dffbc04549ffa13b4144ddfa538fc4b3300540ad830215e25f11446d289f33122c2c880de3da71c453d7e88f7ca4ea3d1255e82f4bc9e5533dc401c33040e16940b2cf9cf21feaca1c2c6c33337cf75e1884b483bf801536d304089115a0 SIG = 503eb7ed6de1b776c952f255bbd4bcfb0e48bc70c2cc2f1f72bf6881479040c47524ec542ae13f6005ca5016b58b736a50898dd0569d4d38ad298630d68adb0b SEED = 9b36247c17710e95261a7d702f57fe81f2971117a50c87920193b386d494ca97 PUB = 29ae39f273e35fb3f611da091600650efbc4fc4d1e7b4c76aced5a83f82634f3 MESSAGE = e8d9d53ba27e98edd55df3c6b245eacddc8a40e3efb007bc918ec5a869178a170bb4a635b7f8f742e37ad45d14a74344a6b522830a522106eb960daf192dc1e0fd70f16160e122516892d0e2abd0d4ae0f0d2e5adcc99ad55302e251b3e7a4d0cb33774a497049905c33de1fbbc1ad2b6c645295fe416b4d12b232efe0a33cd2ad8732eba1c3cb0eaeb0b2a57fa03ec567ca29210bf6ff9542a766f496fe68058aa983806cbe7ab10a47920bac8248818e54a41551c9a0959e8994cac60fc868ad48b5a24d5f24a7a5a3fd90b847e817ad3dd5d0d6f8de2d204f642483bd53585a92ef925415a9b38fbbf07fc0f35e707569cf488b205453ce5433eba6fde8781af72b52bfbcab85ead385d9d3175e21ad3373ad535cf0e357ed6b5383ef3829a9d5095b87dc9aadbe0ca7abadf33ec3b6ffd6eb94afdcc12e8d66a6fc05acf97368db0f69565dcd8fef4d1e49d7dd4ac053c218f5240c812d4ebba440dc54cacddb1c39329e5bd0c3c80dc3259a80f059f94679aa0794ca0115cc62af25e124cb8a9d4160eace6d22c7b1c44544f81142a19ebb02a9bda6429c50e783db4a07f0219e857c8d3c5655a582831c8eabc3f19b59ad8d2c714adeaf4039d5cf70 SIG = 035970a672e93f87eb42cc396f6ea7e1b3dd5c5951572826d1075a15c2d7e454df195b51aae8dc61ef7ab895485f64e5989573d98a062e67ae7356fe5c9e3b0f SEED = 6fede7396c462033189acd23d2f9d02b68898d35f3a01a798fc24d488de93a78 PUB = b34062060b2c20076a98fea939b3b3a50451a5f49f8351c0ad7591dbbebb130f MESSAGE = 5abcc14b9d8578de08321de0d415e3d40e9de31e1888137475ce62bc6fbee8fdd03b9d47c7b88bbceb804444490bf6a3ccb7a273261e24004ea67cefa3d5d173576d01e38f76c1e0e515083c97e79914acf2be4160ef9360bbe986b36e9ff93346b0e70691d934e47f8a503fa933ab2a50426947cda8e810c9ebe3b36982f09aee6092739fa2358b613c7f129db0dcbe368bee52f2f7f1dfe3d2434605b5afcf256071717d924fd0803bbd0dd1f9555ce834dac781df4cc7aa19e7f11da9fb99cb9e6b9e1e6fb4f7e8dcb2236c28aeb6cbc55a130e03c1b17a991cca1b794e6c13732d5b0a66f6eba860ecb98555aa4c218d112b116bce238295de142741f687be0b2487f58ffc5c12a0a519f1e23793242ef857ed398a20699d4351453fc2f092762abde34f4da2dbe0ce2aabaf6bc4c0159f3fe1aea16a036f7eaecd629538f3e0eed83c9a4dc1abc238f90daaf489fd61b34d937b6f4607a788baa82061943dbab26c1d384d8d49f99348800bf361f871f5d6cda18f689918cec31ad158f1863d13ffac5405c162c32de06e32994cc4106f95bb4fffdbefe7d629ec7797394609fdbfeadb46927370a11fb38471540f951b93c6eb238668dc006c21660ba2 SIG = 88a83e2012d209ca03b8ebf6de5bb7ef4ccb5e3df5cac78954aa694930e4de82544ef5083c4892db9f05d77bf63f4fdfce15a4d1c3f85bae8077062bec0e7b07 SEED = d559580134ab050aca446ea7750ef6b371d92d7645ec7635fe7851100bc4e51e PUB = de5020cd21a8b32339decbedff24664d9580326327aedf09c5ec6b3fe5405226 MESSAGE = 6842e3190a110eee96c507d4bcb4c548c3a0ed7b1a8ed77dd93b38613b23c73e830b205e62651921ad8296b08d1e1008ad78f2996e3c7f38032e467cffecd77b8525e243cec021f85296afd545d7be1a62568bb0cfcdb90d614ed798bfb7efc655326816a61082251df01613aac88efcea1e0ea2961b8f921ebe1558dee83374a0113a78c55857ce2055bb2c48badbd3d8f4cb19734d00d0604b619073020d72a99a1923e6160a09946567fd4bda66442ef5a7360786d178dae44922f350ce2edc6af73d1bd80dc03ec3ca7005f4109d10c6d4f7d8fa61735110f8dbaedf91a0bad7d7fb5c04d706373c15c645063ff4b4fbd2d559b0afad432d4c496cd8abfea286fa675dc076726ec522b3a3c2f47aecc539f48a792169c4cc8cd41cd2cb6b63ddbc19373ac9691c2bc2f78f22603d5513715a16d4574e7acc4bea6dcd8ca7f19865a49d3664a210dfad290774b10b7188f255b3be4dc8fa86f8da3f73a4e7c929951df30fe66a17c8cee23e4f2ed2063f0b02ab40372cbe54b9a708df7c48a06566d39b19434c6c766987b3ebb00675f44c4b3c1e9f4504e7a9270589c0d0f4cb734235a58ef074cf9decf3601aeeca9f1d8e356cb2db5fce79cbc36143f34b SIG = 6fcb1ac9290ab767d59b598c9a24ecdb6c05bb023ec36014a40d908ef0dc378a4528b3760d889a79174e21cae35df45d427ba6ea812bddca16e35a69b5e79f0a SEED = 9d4ce975547876636fea25437c2880c9aa8ee6b270d1b2da197c8d7f95e7dccc PUB = bde4993c030477c35890aae82bb5087e914e64b94ffc64e2d7a5a7c919e2d902 MESSAGE = ea0fa32a4a288811301b9ee533fa351fdfbf6bc1d0555a7402767a3a9198558f74bba7031857995b9f326226f1dd5df107b06342203eb8d40c5f1dc95b4f3f88975aa24af8769e2670c46671bebb7a0f1b7568729aee477e8988af9c749f3202708171fd94b337ae67ed21a6c44174014b0b0eb5ba71c277978d488c24c4a7841309846b4e30a4fbbcfc45078d7e14014114b1ac64f7c33c9ac25ea5626c2c819fbaa2a4de8a2bf5f1365d6b70407e8094f99197ce1f0c35e11a98fbe372414ea2064a3a12d1cd5c8df8fc0e79f5b770b58f477f91976ca0139895120e246baab5a026f2d39c687dc0788334b5c626d52cdebe05eaf30864b413eebdc5581ef00d439276e52f479c9c05b116395826b60490b3ce700cc0027f61e46ca2f6fbc2c9de2e800806550afb06d4a08eac7a758e24582a4d6d428b433d365fc31d4444607afb64f15e370794005a3a2244e666d5d4c38ad2009c769a51cdbf738d235942f412d07feeb73b3657d0b0c91cb5940bad6a706e14edcdc34225b1c1f38b1abecb2adcaf819155a94fe190fd556822d559d9c470854d3a43bfb868dadd6e443d98ee87e4d8284f5cf3a6dafaf295b902836c640511e610ae7d0cb1b1d3d6079fe6 SIG = be17444cd465a87a971df84eb102f9c7a626a7c4ff7aea51d32c81353d5dbc07393ca03db897d1ff09945c4d91d98c9d91acbdc7cc7f34144d4d69eb04d81f0c SEED = 0273868232f5be48592cfa05134e8d5554ed1f9a57bc7e3982a330c57e5a7f3a PUB = f172208782db66d466cbe4f4417f6fc477b7349f2a98db56c03a47227546bc5a MESSAGE = f7a1d4614cc64a3bc48f00c6276304f34d4dfd15e0617b93ccef126c5c638c9d9953aabb7df42df4e0aaa7eac96a4b38c7ba758d860c90d05e3d14e479e545f319b0e5a85ad8f0991b43d6e49c24fa060e3e5df95c98d9451ab833e12aa97f404611bba359496265a6db11917d0da5c6a702d0b102de36dd0c98df5b54806ce626bb96374475f68a6060eb350a7d2aae3204b3dfdf9f1e31be81f7170f8a1b9385413ff8f6881e10c1e8da4c88afb50639ab44887aca2abeecedf110d2958c13fd3390d1b96a762d16ce196920ce85f6c415bed545b1445302a6f001eb8d00e97c751887868d481a0b1e4dfa04b6f761086ee8e697b019e017104bafb98fca242e334c6f18f1db5b6f295f05c559361c6831dabc42c2110703f9d1f64e12ddf26a8679854e9f8ef8479e1f12c35447aac02ea7f242e58632cf2fd063fe665070445b80f3dc6a3303bba96e05fa88eec201c5c2d00ca81b8da6969d0a4dd0483b3477d325a71facd6fa2209b48cb4f6525da73c9c05b2d9789b01448e1527e56a09a9bc6136d9837243c2077b925bbb933f8fb1daac963398c5802aeda3bbca8ae3b8f4a9a871f7ea8e2c0ce898c566217b5c06ff55ff9f4fe78398ae7973641eafb521 SIG = 15e8d8dc7d5d25359d6a10d04ee41918a9c9df4c87be269fa832434d5301db022481bfa395a3e3466f9554ceee0532a8183a0d0550e7d1abe99fc694c6ff9301 SEED = 336a83b55abf4c02e25e540329b5275843c2ecb8df69395b5a5e241bd0d8c10d PUB = dd60569844570c9f0a82643f446478b5ac6fc542214231a7ca656a92b5fdaa54 MESSAGE = 9afee8ab482010e29264b406d9b49453d1ce6d550939072182863e4665284ab05d86258e0623b18754c4785238f697f075adfb9e1d31a42e85934ec071ddddecc2e6c2f61334a79526788b4952190716906dde17fba556eea4c8b59727514f6f5615a19ca36da358fae6a6c54f7f4b7a929e31ba7cc71bde7882fa9ffd87300136409caf3ca64eefea616aed58da5dfbf28b668ec1cccffcef6e2e14f8109e9cbf76cfa414f91ac00f48e93eada385dd3d5c16e1a39ea3dd55c761fca361b428f516c05e694fe5c3c345cd94457187a8e604b200a1a0f937ae89f4d6b5421dffcf7ca15f2e2c25378a4113233f7613f4570aa4b909a9135eae4c7b9ead458007ae17126a11d145258af9563db2f7e8925431878b0eeca8affc01ac5913bf5bac4fa3a857c54cc8906d6af77de6b9326b6506151099e87e99b1e819c6fbe082688f34b803d588e416d853169765d62f7e0bdf72c5cd66669a0335562336735e7efb734a2fada327f858bec602d0da08eba4479e7f6dc4def6e4ebdbb730ee91a33445cadc9df52c825ad36149cefbc51ab102033530814bafa7e87961b06367ff896f08ae334a9b1aad703da686706c11a04943ea75e12992dcf6106e372077cd0311029f SIG = d263f56d59cb9b2896a947267c2ed78a945bac5abdbf3c14dc3ad092b2308cb9315c464942a0a20b2024511d766e85c936499a149cd0bbb209150a1643265200 SEED = 88409172618b490393db27d960171cbc187eaf4dd8b320b3d2f824980043718f PUB = ce2e7c5839ef5632a123dc373dc14b1f0505766e9675407604ca7cf54e8d44b2 MESSAGE = fb3e82f11bc286267e123817ad8864e077d9f7a8e7a163ac7eeaf93d55dd111de8083b66b53ce7bc771fc5071a2d7ac2f85d6fc6adcfcec446e16aa1046df37209ad7a29cf9665b439a54d6f8d942f89bdaa56f2f11260cc95993038b0e8fbdb3214f142e6c90b61a1d2b142076206af30ac35784a6dc15a1e79251a8c7731a1c53978038f8d76d70c6c1cdf529fbdb84d1507dcffdd42873dfa6a8fe6bd6f7fd29c80e4b2f933d2b6c9e62c9457e665472655059b63b618e2a9a8e5b9e41c3646173a892b8e6d4bcad6a62a6fccd3455890b58ec2681a95cc9776a9fce83c54a9ef312a331959c7ef3f79ee576eb7b79469c9234b1eaef609884708fe4bb0efac662da871ba61ddabb3fcbdeb8f635657dd9a5d7311e639a824858b9a9868d3f9384da612c7f2e771a46bd2624c99ea2b6ccbca996c1d9c375554f2a551619ce6d5e6e4d6b844a4dbea83ba732331fcf46572c1fb0e257ce1041b265df02e690a92814bbf3b5ecac69ee998766a02b0d2f908b3c15f952699616f2c07d589198989e6056c16319aab6cf8771902c078046a88b2570c13bc5edeba2ed1e3ba131daf94e6891862bb3de7d1063fe405307a5cd975693e9d58e17c690eeef4a2603cafc68c2b SIG = 93b6e29d63945d5c427387d006c7f0b01956a95fc0436ed42b46d0f17b5bb193ea8c0ebbf3d6d13bb539e35c91f3f0f9fa3414a0223c9060bac83653c6fcd906 SEED = e571189b5cd9e788302de3919d850c227dcbb615022e568bdaeb37ac5b2939c5 PUB = edda890f42dd5fbc7316a5fadfbec38556f23f51b8efd2625437f6b5069f1ee5 MESSAGE = b62c867ad6227435bfa6dab830684e38d196e1f861aade0fd6a7699b6d60901fefb2d799c35c6f3d8bb94deee834403981866bab84946ae9476c75e9f1d3602b42cb2db437bff33a775822f0d6a257d4b75400eba5b8abb314b71fc6b46f8a34e861a9a62abf33de8482f63f9d7169e773a2dcebee03705dac117fd1499b68e7414f51ff9437f253a1d9901ec3b0bba86965a19383655487b58010f804909de1ffb2212c0252ddd9bf2a56ac46bd59c0c34dd59e46598b6babd4e5f3fffde55e48dab0398c22af9e26baddf77275e5f017b35a9b8f8435f9631936b391cb95d7adf35d1d8545a0fd066412d508967bbe9a20245a269e3be2777117e75fbac170dba352be69b254d353b3b2cb3b7e21b721aa9fe044f8916b4b2a6f8c28f8abe66ac92b91323ac73afd93dfbeeaeef26d19bd9f67e99d48cd2ad2d3e55e45d24d54b50f44a39b90e242ebe9b42bebdb230c470bdfde1bc7721c3120008477393dcc2e15fd22b251feb0e18b02883c078aee4fb760655a671dc7b8aadb9a562420a3c2efa2d342e1e0099d951b42242984f594e6914fe282b1ee128735984ef93a669e6ecba26c9fcb9f09f09256645617f1392d35908917cb8d29e0897c7503cddd5de1959686 SIG = 7f797a31715d7c356f8f1f783700aa9974bb936d661661ad968c7cde1ac9e767be56a2dd49b9230e90110c67c0ed187cb7e75c3053ece844984d296f0d85cb07 SEED = 371744ab63c115613929a343709bb019b7357dff72d2a149f1d0f71d3a201efe PUB = e58abfad4a13859f0acb05d0e47d59638f7b1b4936100b988d61e6e70e22667d MESSAGE = c219de1e8d7ad8df08c49377396fe7c1f2d57bd2170633a00d708faadee180ceba92849a7778506cbb366875bf9124701894cecdb3385147d0671843922a649aff7c435eb5a9c74927503072d0067978716dc80be1545a2dbf5a1c38536e12bd7720c1965d3803a4e8aa55765192a13b705ca1059ded0e806362fc5bbe6c76a1c9674bb853790f7e90af00753e00436da48cd082ead64fddb689890162082f8482924f33acd604640f69927352b43f64402d27a883fa6b72aa70d241dffaa1701a25cf1079358260793875f76a2978e9f9f9d68634eb3f5f01bde1ce49e5921252f949f082795e4eafed7be5b49a9f95edbb4a13532e3f3b3be62e2652231253a20c1d5477e8f4bc57ed76fa19eaf03a11bba429b6496ce76246170e043bc14f2d2f703d968f1deb09388715c37cb4752da8d464e348e0313c8993e24133a7c545284e3c9c907d01b260c4883f9cb3e3dc5b6f7fb6d75536365f2132eaeddab570e7273afac0bff5c9fc0b820f2078e0336052e1fe7bdec86674d0998ec78da1c3f34751f886727695f35eca1304b14734766ab05c1186306ded9db3eef65d3c0456cdae8181afee04b296c6722a88c7ef3088d26f7fe74bc89cf5285c688f027b7e68600486af SIG = 5eae4ac72af0174ab256527b7cd337a0e5482e615af068db21dae35a64640742604df73fd4ca02ed9515a5608d73195230fadca7b426f02a2fbfd02061af3600 SEED = 498b6ee6492d53231b3532d193578ba75d6a894e2e530034e21ab8ad8d2c0d1f PUB = d124665b28facd2d17946a04dfe3d129a4561a2b24eb326d84b62b422e44dbcf MESSAGE = 0498a59b87cdae28695547e10863bce804d97de0ac8008f3d5fb652c1757419fdc9e0f9736f4c59a34f21cfc74599fa788fcc10c6730c7df8c3d2c1b6a786d1230b65585719d1cb5c490359b94435d6dd671f54d6e9a19b9b5aaad7e0f233f8797df997828d88cd92ef089ef7dbf1e95277894a2f7c2fd0c8e4dfdfa6d3d14589ff01916dbf9ddd811c2f5e01e94298990a145a6cfc26895614c7c963fef308a4e3856c32dd3e359bc56d2cca496ad199ff1a568d6430ac5cd208e0e2d07803ca523e0d813ad3733ab50bdcadcb988aee758ea50439bf38ee649997604f151c602c82900a8205d8f6f670c8684bf5abb5f75ff29a37eb9bf8105199fbbfb4707e162e64c715270f853e648b0aa26fea0f6db562896bf424a9ffcb292fae85b76cefb8bd5a4b3ce1fb39bd2a50d0c9e6d933e167ff629b8a494f2a9b774eb303c781ea02aff1a8afadc2465cc616968015ed6a5a33c3120b945ed5351981e32fb9fb96b2212dcf8fe9ac56e3cf41dc524f800631020b025919178ce074eef078d6842012a276efa628db54058d1eb5b5b705f1e1818d2df5164baabb0c61956ecdb8c706e562fc4fd64052870530ae425b221f89dd6f90dab882e763e7a7ffa141bbaa8bf7a3f21b0 SIG = 112f5c6d3bcb3dd99346d32ad69cbfac3e653bef29c68a33f43231f66cea1d0a195427d6e10c0e77c5d55fe2794287ee32e5e22bafbbd8052ad3606b90f94505 SEED = cefcfcd1cff4d8910749279131830b1da19dfc5245f78ca68b8c3c1b622b4551 PUB = 1d394abd1b4ed1aedf966a60efd3ff882140a7e56b428374ecb443289a9c7f00 MESSAGE = 5ec94ed06fc1257ae9c183ce56271207aca37a23fdb4b0e74ac9307a1bb112e05ed5a5d047c93109e2e59477b03378346422de36714c2961bb9736a513ca3671c603a68c2be7317b1b52a076dae2aff7bc88cd5eea0aa268faaadae539c938bb4fd4b6069b1945eb6af0c9e6c8aa5ee4a4af37e90c67e248e8d27bd7f9589c4d30e905651baf45364fa049957ea5d9b7146ca68204e5e973d0f1c91a1c4bded66115028a71114f0f4f851bd115faeb954e3f71a01470b2481a0098d99f9d74898c8ba0287cc7834155214173d1fcbafcfe9b08250384439476055883833816c9524cfd5744aaa259db7ebd3a6aa20b5a6546dadefd140668eb0eccb5f668db9fc62983df980850c9d19882a17550d5dca3542cd36003a0d03cffb04575a3e8e1d07015c7b30eca9115cd2b72e46dfddf6a4dda1faa2dbdc89000d433f6ec9adc46146d939f32121b99b28983d98b9dde8c3f6e5779f2b0700cb023db13de656e0aed1da2d5c6ba2652343648ad420f6ab9e55a97482a1a22b3bc2ee598629abad9547edb5ff790990564bd871f81b24b12f2bf8dbdfe7a88375fad9ccbd9fc0ba1d3bba5e3c4813c18a0348aad83fb1b82689054d99b4600dd1760d0dcce44757467bec1946406d530 SIG = 7d83ff66ec79307b1c0c093fda3968a96cf6044f5c802888584018845e7caf2a135ac6f1677e84d22e458e227e4f930209919bc11b12f7aaf2b8c94302d64200 SEED = d107cf26f527db71a206e41d17955321013225bb20f93e12df3dc7399e720ca3 PUB = 186bf453c95dc0a2fd589a78e2c80040b3f6ddf9a6f8681d146036cf2146e8fc MESSAGE = 78eb9e13789928a74f360141728ede98389685c836b91fafbf1a7e8c19cfbe21bd3c3d6c6ed83c409ef693f1d735da3fa466497e19f38e30fba2a1023785459070e6e92c1cb7c9bd0c9ba61220157866c3bed2b01e6e6b9b8dd3f0c47c02f181346a0a9b9b5d3d7e18a94d6956855e16e8eaaaab71b10302f35bd8fb1f9b5847304160324926645b0582c2f2f1533a24281461514241db2850ef31c5763b2e3d4fb18fc6d8c1d7e52f7c13392c17e27019ff60008e431f1714370bc0efd9452a61f5c56488d91a185037f1f647f72fa785010d5d78f0a11587ccf66b8088e0e635fff3774193b2edeffd92d6e8a0321128ae64cdb862e631e2ee5ba0da44bbd589dc392b5a113b86a727a8ddb698a334cc668b39b1cde199b88837ca5f00f553f89c622834273641d39bc10c6a24e1eb42587542f03fc1627524ed6b749391f11028706c42364425b2caf20180e1b802c744b49b7bcd9bf7b15c23a0bf1c6965960d341554e1966b6ef82fcfbbe41d1e09d741e309254446777f13c29a67b8bdebc5f7f04d160d60e332e3d0441a0f2f7b192c3e2bdf6dadec2a424f88669806236ee04dea692bd8bb6f91ca0682ece349142575358b9b7be70600b3cb81e1456ba0799fdc01ffd68623 SIG = 8071d97f324f10358f13ac8c61d424b4f300dd0419571c39e40d99aea5f03140e62ab4c97127ab33e98269966ae1d4557e459bf7f597b313f351a20122f0660e SEED = af7ea8e41c8937a4ec475ad81371a171d3d0f9fd7519a04c751ed4ad8ff8fef9 PUB = 15dfc71585bac71ef20f374987c555a3f2f07d6b9c787066c10d63cf06e02ab0 MESSAGE = 05f2263f0245ecb9faeb14e57aca436668308c8125df3116c4ee20501d0cde701b366e2b50a1c5edf484144ce16bfb1f7d26dc4275ea9732e264ba4d4a362b40275ba47377dbc332cb65e2f4c8853894aa878a4c175dc5b3b2a757ff3c8d7de660973b89dadf076e2e4fc76239b7bc752a229d44e000ceb667104cb0746bfcf59d69603ae7fc1bcf11d2e33f61dc497ec1b0bd5e4f1dbef435f2f291f30b00a85e833946c8b10484e4abd7d60bdbb1fe6dff5807a53bb89382153013b70ca08efc91b7e9fc5b5dbbb6af123b57be2e140fc471a45d89fa8284cc27e0a1fe771f55598bbdcf068d506dad0a592179ceca39ee9526f9e4fe47bf2bb14fb1486a677d4d7b99a520545676a0f1fa809049aa2414ae7b817d9a036e5c157886e8341d4e819c092a3b48b3606b03acb727c6c2217d0af30121546a94af6b49caa2a8c9b1786fa0c2a524ec7a023e924b5f8a89a53780c7f8781c5b8e869430caa0e6d0437967e3aed44f45c901cbcf1026fbbd4e3dd9a091ecf8b34f7dd5038e543dc7eb6ad5494efb145cf63ec0d355bb8e172f455d8a6b13dacaaddbc56e47de3cf762a1a738ef092f1436680467b5cd82e9e36e2d2b6842b3bd5dce77180ddaf0b643378e698599dd47f5cdbb SIG = c0f1739167274bf91831c74beb645af790459b28bb3f21325365130f409acb66df1d223759a9758e08fd7253737484e285a6fb47404abe2eba5ef249fd025c0a SEED = 0c57cbfcebde10ede02d1cb01df360d41f2e66a50443d58b5d4f0828c9a18bb7 PUB = c4d761ba189971b9462c61bf46a765f88e2ecaa5bf2211220afb00ac657f7ce5 MESSAGE = 337703243ab5b4e4d3481ee8dd1f4494507174412658a93988b5c30403a7b7ed8522ceb46fa1ee02753a874ef0675d397c575da0b08caa8cee3393784d0f0db8459837af90b9056df4e38e417f3ad2eb1a100ef207ce2ca6c610018021661e307099f2b7c4ae875991140bdd3f0f99ad2c5d55aacb84cc1cdcd579e08072b6951fd45ed289ac9ff7f0986ac88a4fbb9dc9203d9baf180c90edf937258c9d0a6d48e220f72d250c7f2c777eaa7fb9fa11d50a5798772f9fd976b00599f1f0276f3a2e4d988ae92125467a8dedb7a16f9e3a56e8d00662b3eb67a35b9b60e73bd935077ee238df8f6e833b9a5523386826c1f2917b1c3ec98e0a5fde89c48b1d446da5d0c885fef0e374bff30a997c7bafd5e743c85d0c6aaa6ef10a061211a2327c6d84eb747a56e9bf60fcd5b553b798834d0c5ccadb9d4b54e7237d12c679c193a287bb2f511cd4ee2a2d8549b44b21c11fbe5723381c6c5f784687fd90cebc5b495af9e414f2961b06a1c8433b9aa3292bcff4241c227167f8d1de054ba33ad81da3eb3ec6e40a6e26854af349540171b75d75fb9a8d12937827fd594d317b7a8d9f1c2fcabda56375568c3e9e514c2efffc3878363dcfad9fd95436b022e8772a88cb71e803bf90381962 SIG = 8af7bbe01b8ab93951d16fca05a9c967d1c52c974bea151ea72e4cebaa20cc783bb61d8d69385cac5bc6d72dbd162beef1fcb5dd0e0a08b48ca0b9f6d9a9880c SEED = fe7172278364194bcfefb4783142b79f59d5fd978b1e47c314d78d4cb3f61c8a PUB = 2e82cce47910c7e2a79bc1f419dc3c3df54f23291fc8193e8258ccd2fd38d548 MESSAGE = 23509451a059969f2b4bdfcee5388957e9456d1fc0cd857e4f4d3c25a4155d5ee91c2053d558062eea6827950de863bc9c3df9672cde8ba741744ebbddb45ec1f4284570fd0aacd07ea58c581be2afc95ae444e678edc2a02439f387cec982ea3a44814a8a302bb3bfe8228d58de039debdf7c2a7eddb4e71ca474f94f7e2bd89dc65b1610733c91fff89bd499f40154a6198fdf5ec7ad3722d925b292196c429499075be0c5b6da9c090c0791a7019eb5e7366be6ce58ab2f04fecd9127c42718047bf47030691521312c0877aa3f36cc5fbc9caae0fde3945d2a868ee2502a3833208eb850a163cfcbf6da9ee6ad9fe067fe241986fe4436d6ae4edc61561938e2a33f4a33db63f69d3f1a8850ed40028869164103488fb795cd82ca067fe1b4897caa49a7ca9a80f3a8151fd13bbb7ff350e8579f565dc1c4a9ca938d27b15b3f858ef45d3dd78b2c358635356315f55a97528ecfec5d11a5b721503107faa406c17034e601474b3b60cf48692e269261158fc353d4df4274381357790b7756087b00cc79e3b9d28a3f2439febf199e64a8b37c91b5a4334e3354e8faf3a361e856c54bdaa43bfdcd6ee6c9f9679588f6069950832348aacba2bfeebacaa2071ddc7d77898ef0f68793cd25 SIG = f6c2a4296b9a3407c6d7a5679dae8666b503d1a17eacf71df493791b8ff0c0aa8eed36b327a29ab7828f46f22de868b628b1cfd501e8599fa31693b15f61080f SEED = a951e4e6ba9f1f0b354831c986942448faede37e11b0f247da2706dceef73ac7 PUB = 30362014974bf75c8495c2e271e713d57384384d0a5da88edeea79279c0c58ec MESSAGE = 20577dcac89174885eedb062489cd512fa72863ec5438e31e95878b75ce2772aee6290a0ba3c8f642c1d0ef55da8d5bc1484f83bb9876c7a8c0b6b609b94d112a06fc83ce8d2c1e08ed6c735e57b244aad6ecf7075363d565ba47865695c8423510909e0a3db4b61ed7aa67a7471331e83a0c58b8220a6245f65661549c1a12d4c0d50c326fb94917cbd07be51e83fe8bb3e46ca01b0a260daaf1d6abe3703d6a925113bb4d57ea1a48b4c7dbdaa03eea814a4b5f02e1dfb545cc623fe17a3bb18e4373f5f7ec2fb5217d23e4fed54a772e11323e730aad7efca8c464400e7679055fcc125a876ef7b8b9de186e229a7abf191d0c56d91815f67872e957bfbc7634aac403576a58f427bdbb30e8c4b6fc6c447741024ebb503a5a9025124a4887f825a43ee940f210a1bd5ae4f6732d60f95f2b83201c4c6dfe279412d7502a5211f8f48f800db30fc3776c4ed3a38bb4634822c98a6d6dd3233be60e42cca45a3163cc84e9e8da647c0711bc4c6ccd65aa1e972c07404d103e74bcc31a7e2c3eea5ac9257ab428947ab3dd3fb153d90694a4073373c4dd9ceb131154fe877473fd996f424f33e316e4eb02b8c7513be6998e516cbba54d94cd0a435e0ffcc2c0a8ef72b630ec24781066aa5efb9 SIG = 0278c86a15208d9be5b1e1574761861b8af72ae08d40cdcbec354e65a9c3d0a06b5fcbb297d09bef397462395986c3093eeb22644c003c3078178cdf674e990a SEED = 38a9b2d49ba8b82f301a5772cea0efc2218455c8b218b22cbaa2aad2d7ad3b35 PUB = 9df5ea1f78f810a521774602bbba4942f0459238966c8bcd21900afbf3d84293 MESSAGE = 1778167c49b3a44d4a5ba838b7388553b1e13d36ea4f86d30242e1a822a3bbaff5cea63e2ae2a4635be236fef2b8135d14fb621c0bb773c9c17753f80926eb55d0f115bd09a885d844b818c9f04489a331bb5e032b8e58cda36949c5a8d08b55bb8de965e1f90d3b9cfeecfc6ad9a4ee5cb4047e9450acdc64640166a8c069ea849aebddac1ae4afec91ddd17fa5553fa87c56f7e51ec1cd6b5cc23351d057a4ce4a8923c8ae6ac7a8afdcc0881c0e74ebb024ef7296162cb93c68e50bbb074e651ac87dac9ea59d4c3fbf0fe379f3e97a24566ecae54303bcfb6f0cc9f15f6639430e66b19a427849fdfff833df02689e9de44006c903c559183459b9f4a97f54a0f2a28df7b0e9deeda8239d7b516977f5e7d6971b4502e9885f750af8d1a6669e25e77d5f327c77c87a86e0a1872bc96a76060f5f8a0c40cc973bfc7fe6ed9bca78f884e6a2828b94d489d32a0fd337e69db83fb8789afd4e8ef54c22a78c2587468b9ae071bae3b202d3183ad5f0f8e842e5a8de85bfff49e03c8381bca7fd4278ddccaf0134fb5593a395a77a5cbd434593bc4ad0ff4b8400ec674c4ecaf1d57754be0cb2fa9a6441a9abad7b42197ad82e50827e4a4245573a8f0ef87f58228a2867f4b3b834b6635037940a SIG = e19e62ac539a9ca251d12d4c71055b0a3f581d19f2682e672404c78ac1f12bbefc91519276a5cbe16f520cf7a7f687a240f0329157c59f50026a58dcdc50fc08 SEED = 9a1717873689a03c112dd6b4d76ae73b89b416a598ceec209e27961e7bb1ee8a PUB = eecad1e0e4b863291881a8c241db9ccfffe4e55d8b5a42f307b4436acd0649a6 MESSAGE = e26580470901a07ab0931aa23829802ce04da59fdc2f773bc567f1e65b4f2e2d4a1a6aec1f54158adfce9b099790b503a13d22097ae23ebccf923f3bb1986d6e49111a8cf0d4eb8236bfe0d7c9e93a5efc7feb8e6a9cd1b8d921efa21e449ff49e06c1ccfea31f93e033c3c2a54ddb0f653a09fbd18a70b56315f193e7be56e5168f59563821d4bc3bbb0eaa2048286bbeee5aa3f3e7536cf2b750fd322602bb3847ceca39b75474322d76b1de80fa2eadba152d6f8f020d4d931c53f0a2801224d35deb6ec13b014873e689903607de96d9b7a743a887d2f48daf2ed2eefb202abf6082796981123b966e936dcf3483e2d24d694ecb865fbeb6969f347027fb8b175d24a4c045c0bb4ab5e02ddcbe77d4756c46d137b094473a02307a108340acad9d03bae8403af199cb75cae3162f3815813cc68bf2a5e499e594921149f3bbd214da5137e756521559dc80d9a4b74a0f4943022c7cd5fca42315e0bceeae9069615ce67a04382412313a31d67b346c329ad82e742c0a6ce0a6a02454c113e52022f3cc03fda691ebdfe14c53c8ce5ca9b932ca1a386e3eb4e90a4dc6e8ad8533b5af1aaef5003128655ca64f67fcd97c6ac803002404900bc0fae98463bcc31409f9981748789ade2d07783bc32b SIG = 1af8be095538965800d8eff6d723d028d65d0e9c6eb5e9d125bb3b1783f11ef7079a49a807e27ef1260be26a3b231d03b2ae151e49f6f189f15b1c83eab01c02 SEED = 43bd924db8156008c6b3994a8130d427d514db8a613b84dfb0b8e0de6ac30676 PUB = 1b3461c269d5b0062d5df6fa654a2586f647a0684218a06e5e2f7badfb394131 MESSAGE = 6184e6480c42e96cc877269b16371545ff9523c45ea88e76a1348c68ae7f318b088fe4610928239185b6b55bfa0f43644c4a4c97c56ed77d08b1f4aad2f4aa069994abeca96b7bf81b8064ea4350d8a8b02297a51308b61c57c8f1873c6f97007aca3180429e730a6643f28733547bcf7b9adfe327e85736bd04af7f1d9f4fb84a7f3affdf4e22b574ecb4bc8836b10b8453aeaa5c1bf132248b826cc5230f75e075fac9f037561136e00643d08253e7ad652f702c0d15b6d7d48aa6f8e9b5f5cc146e3f156fb2522751c3710041bd922f37a50377e028b0c4e4bc3465d7c84af6a5fb427acb3b41378b102bda46d8f6f203a5ffcf395d435e93458a0b0a4c2e7782fafe119f769f67058c6677f6d10d9cf5cb8748e1805798ed233f6f930eee0e5075bc58b97af9177fda75d53708beb04dc4f19a43e768074609f14065f48fdad5077ce109bacc357174a6b7956f6e7f32e38415be526370fa58c3c0b31f51e6cd4b2cf27f8bcbc21259d9e5c3b5c2946a9fc1b00d9d15c3b7d80bfd9d05db91d249d3e42d8956682044548d83bda8d5cc9212442f30b45cf4aead80cce9b3512c39c5c737d3f8d747afbab265af5eeef8ca9362ec76e943b0a0d7a39f3db11eca14458a7b592e5e4ff2275dd48b2853 SIG = d2a05d88d9d543d94d57ec88ae55681750f20b9be9c1e918cdaf457767f2948dd629e94f068edcf3d9927e330234badc3a02fa5ad3d9d85e948cb0b0cb3cd70a SEED = 8fb086206dd95a2621f598560ccb281f8273c8fc72e23611089baac89d3c3c78 PUB = 20276ef479f4d4523ab77420d424e8819c33c83779ed80c7f666e8f4403f94d7 MESSAGE = f02903ed4266e849a4485205954fffa8a108c323b7e3f84331043514e48556ab019497233a5a127bff3cd7c97086becef538b3f339d7d06e532dc7325e597ae357f816dea42a6a22c79d22074a2e1ad8023c424b7e096e5ad8897b05ef7d00d30a04aaf2981eddff2b347f1e27e20aabbe7e7a9544978e092b00cce420aba06187374ffbb37b4c22d75f04e57590f610a27347286c298312a6c9b1bdf24fbda8513c4f8356ccf757068ffc11bc65113783a5dde7722faf4ceb19fbb62f40702e2c6e6a8bb49ef40446450c4c59a2990944da4744f6ee770b930c246669813ce5a9f5a47dd80388981bfcc3a56b5be2c4c7e659a2e9182dec0aaafe9031aa3954d4fe7c431196a561a5b78eaba64f3db1b586c53b16f679a84921a642c260e4653a61de108ebde6f7053afa2cb3f3668ede121020dd1bace8418aebac3a5bd5142f105ac26fe49e5fb140c19b22d54a6291dfc954670247881646874defad814995519f6260e9774a8d185c37881b4f2543c4b63fbf1985016ab41c4d728cbc90b3ab876267bed41d0c0902f6b50e8fa906fc4788f7b820467306e0fe9e036a0a00f804f91c3ca718b95ff6d9e2204bc3161bf70fcc17b2964b56bc612e29402d96f50986514bc7d831d58e42793786d5806f SIG = a9305e001600d597d05ef671699bf09f0dcc0c44475d3ca31e7ff1bffedc0c67daa1f3b76a035948c59cd87f82453a40950a1c9703c2e7d9280e7303966da301 SEED = afa1b846c210b52300e97696f81b8ea774d1df12e612527c55747f29c1937396 PUB = b609566bbd1947bd7afaceb14389e836227169215fab66851aa5d70d6e2e3b89 MESSAGE = 4cac1b1f4bd48284dcc9afc8b5955b64b436db704b0335d9755cc1f97477f8d323cb6410ef146ab8a9efb9526d8b62e3bbad1f7295f47ba9f0de958f8ec9b77ab42232437ed974856444cd22e20be35e91813bff4b016f810d0f61d89f6b614db33f34bd09985b593fe3e06e065b7bc6cd39d55c2cfbec7b6d59c0b37dd1d0d35135ab1d1b04f2f30c2f04f4ba2b36582738081cf59190f528363db944ed612931d1d514c6214f9ab92abb1833926183ac52fba2a4551e20e4c0ac959a49ddb167a381e0241d40c086e90e52aca017258975dbab2ba451ee539a718f076a58709c6697418d9c6f13e4d391368bf0e8bd8f2932dd95ceaf7aaca1241147d341a3acd08dc32905483572b89a80cc47231468ab8de359dd525a6257cf196c2ecb82fa8a78aa3a851c7c96ca25bf7ca3dcf3ca21453d0dfd3323d5a422dec84316102f684c359f226bb53779c0b9950939281ef79a58c011993eace085497afa4daf64c9687b0a11aa116cfa7b03936241a5567b646e7e42e9fb592405b8fa3c0a821fc3121b45b1753cec9a83947d211a45499bd63790b87f01472fe566d87696efedbb74ed00048c384ba7f027b3aa4298dc4110349fedf52a96cd05d08bd635771ed4510738d8f07a6021244d1903579a3ea739 SIG = 98b0c6313cecaf7c82cbdeb3d0280641c61a060f65e563aa93ce18300a9b58272dc8680b485e8cd11cf80fdca868fab365378384a142727f2f844f87cfdf1905 SEED = c85913a6877877131001623ccda9cdc12b9d4043b8a83793c44696632cd6421c PUB = 9cc67c6948f7bf6e556d0849d3b8d203457a7b61549b36681d754f1dc0841e96 MESSAGE = 91b5009e83d0f6103399c2d3feec0084973a305bf4176ec782537560472db187a11b4dcb4b2ffb7f0644feb394b28e5bfe97247c4a4a231cf6e916bf99344ccda88a7f5d831d6de3d563dd102eaeb108c5bdce44e0632d17e6fa55b18067df2fa8d200a9869f6aff920c51d46a1ced2d903b1d9b6b075facbf91cd05eb41ad811a8ef40d9118261012c72b8979f15153dbb8561293da9f8b77c8ff14f75387536f0036d1713a72ce8c35b1062f2c6732aebf32936799b51c2cbcd6572413e7dfaab8641a02c150237381cf7a14e22c74c6c20009de7d3b7e69cd1b4584ac2c01babaf973c56b3814bb0089720e41968106cf26509d4aa546fcad5534af303ffca42b16ae6c93ee06bc3cace12e4ec718844bd30d2224cc486d106d1c456bfa165ea0120fab3df2c5ab3a523bbfa789deed44032ab0be86eb7cc09cdb7c07aa948dd5277c3df1d9d1843567dec84f9288e085b05ae4b8af2cea5d9a184d50bef85550c836613d5d3af5f9c2928e6a89660fa62719ebff773e46b77e34bc0470da4d2cdbc7071da758c4d39fe65201c88aaa8e6603d0bbe7c3e9b2d9e41b634682092f147341ad6d667f20c64e81a68d629467a54dd86e1ce12c560a6f9b64512d6f3886cbb9f37c37eb3985c8ac38dd6682f48fe1 SIG = 01fccfdb1fb6888b0310a913170f7e366816daebe7650d72513d9506e66f7d62208a49ece0af1871497f4541ef605bde711c9e0a1205ef48f26c03dc1ad4af03 SEED = fa1e11dc8364208d8e1cb66a361be7e84c5e368166587d4fdb06aced7f62e17c PUB = 4d8e6f4b3415df6cedabfb295c1984fd419923c6ac41764e32d22daf372c50fc MESSAGE = 294e63bacccb801bbf04c1f19d0aee16f5650a6e8eea6fe41110663ec01532bd4960a527f15eca4af2f4e6b7b0fc340cf97aa234e92cf7d69d50e4009c2496e3ed4d9aff000f9e185275b817d26a0bab69b7f7ee1ea30daec8bcee387ae46b4b299c27bdc06eea63f24dbee955a6c0969037eef91c34321e3c5c972fde993183b7d23f6e019c3e0cac7589ae4a1521af87ea42df8c22c2270ec23d6d140f9cf6d4d52fac1b9d6c8939ef8131cb62a035c5261538bcdfd6db419a55ef9fe5d7a5ac44579de700858d74a3434844f28342c565892722e27f407d7f17b74a5934be915b20c2400643235f8ab5795f324e33c50644a04033542cb3816d770fa899e7311c14301c1bd0f5aa60a2eb3165680c720e1efa8096fc25d2779275f1842b2db53b4da0ad3e59c07540c28460cec1fdd3cdb7a3478b91a9caf9ac891cdf3aeaeeca9a9656ac1307259922fca74c5cc69f7e25c6bf587973a4b7d3e3ac0635b0db22a0093a79076881c71736ee1d4d45f8ed2d29a0671a64e6ca2f7a5ef404b1edeb842034f571b699bc59e5a37df02054e8482bf1e7b77d8e8397da15d89d7355a5dce86b1683a9ac4e406c08a94a6eb00e5ae16d96722972e5c50c7bee4a84d0697bbe67ceb7ef295f06aaea5abba44466be0f67 SIG = e857db087e28d6750bf54e53797251d8439989576c12da2d9c811a14877c3bd46c4efab861a10eebe7da04c0b0b445c7a390a50c13de36f3a3c7ae0157022c0e SEED = 24a914ceb499e375e5c66777c1ed2043be56549d5e502a844710364042ba9acb PUB = 20d21ee764b1f35f94568200d63bd5828aca8c5d3e9047d23f478b925295fa2e MESSAGE = 3ff9f66fa2646ec66a1bf933c2b4cc0fbf912b4d6db50534257f97d01e698d05485747de2544e9f5a4a4a075388cf4400ab89b0353ce86198202db3a903767b879a2af9daa155843111af15a2bc35efe41bcc92c8207e00113b04f1303007949ffb6ce8df4b0b34248fedf5d9cb2cee94b812ed58ece2a0ce0454cf14c20e49e09fe664d6e25762e87895932cd5cd32eb6a3abb38ee163078c133e93588791dbf6af499a31ea4453bbcc7a85e406c9848a664052f11113fbb4ffa760dee4c261e396942491119da29a33582f821d4125e0b4162f28beb066031a652d05749aa7244dd4f3d3bb15d268328d6a02fce2501815257f8ad5af4ecbe7cb8ae9661e344f9072318791f3e859091121e08aefca8982eaaf66259d9de4f46a31e716dc033d0f95d1fa936b6c6079b137dd1158d1def113018c73f8ebb9807e0f7415404ea9c78544ace7ce463cd1d1c57e31f4091bc091804cbcddad0e15a40ca91acbe1c6224ed13cafb4df2c84ac9f0c3c9b546007d9dd6e524c467072563d4ac0d700cc1bf30febb334313dae5761745ec0a5e9e8815025958f00fa2e58060d7e9a5f2b727f48699f929c8459930892573f784fef5692518b5ca268e2a73ebead6ebdeb7ec24eac92aa7dcb41b598bd6eff3632d069726291 SIG = 3ae0cc7bca8d73be83a9b809b13338c12706aaef75c4d1a478178f9dc565514c7529e298043ea78d21a5a09dd04f10ae87441e5686a933c92c75548427ad3a03 SEED = 5532e09b937ffd3d5f4c1d9f1ffcded26ee74d4da075264844690bd9c8613994 PUB = 5093969f377bec3e35f59efda01ab4186c5d2a36740cf022675e01096b1a3f0a MESSAGE = add4d7a9ce3f63d1f946e8679065545d8c7bf0a2cc3a4c00b8f142f0945ae362c4c9462a7576a4059d57861662884bd80b96d90d279a952eda952d37d4f95cf0d70da98f4fbaca39e169f9d945d41f872397bbdd5701454303d77d31e86348271da40a1b8f1e57c36fcd803e14fa17716c5631efa01d3a795dc20b2bde36ab73ff6a2d533bc15cce22328713c3c9ccd072c3e450d7f22c0c9f94919752cbfe45ee655d1b53676593cdb448704102631caaa976952eaa1f6c2e876564e420f0c646a0f88365f76415b4085f60a338b29c51633e540f0bf32d4087e7d0fb685be88c7595dc531c99b489584560ad8234b18e39a107cf5d842dabd421e77d26ea5e0f1405ce35fe792714eb4ee1a8017648ac1ae739a33d7b1e089105d1e5add27a62ce64154570340af9eb14e7fdfc2f9a2c2fcfcdac3cc4227763f4d629497479f849216e5d90ec16dfa36b72517f7b5486baee7fda4450c352cffbbae73926c843224f8ce44b38dae53f3ead21890b52a7801075291684fd5910ed86ad33e8a007f6c3f85c16b209293740184f5890874d431cd4e0ea4087c49c3471d789c813c6dc9a78699363a1d87197d3b92c0286689311823f4df22ce8035e75732cdea7f5621f67db0e2a4ca6616193221c0aa3d6de50d85282ee SIG = d527ff0d4a219d61f418121206a54ae4985854a310482744486e4d130a7de97c319df8372c82828c936e6a8afd9c5de1828573d8261ae9365b8f237676182402 SEED = eb36511009d37a9c46c4d1374d0bbd0d9981e78cee7d188c5aab983ec239e10c PUB = b1cc212b4521bbe7b19a7693878a558440eec36205d8439d040a46a9902fbf55 MESSAGE = ba2466e56c1df77f22b6f0241fc7952ae9bc24756419a9446dd2b49e2cb9df594e5b6c77a95aa5fbd9dc57fec83962c7751eebb4ba218253f916a922a5139663e3203e3be482be379ca151c463d9ada21446135f356994fa5449f084478f5bb4f5ba6145c5158eb7b1c43c32ebea25e09c900f01ef91e92f88c03c76504ace9646016ffc2789559d0f3cc9d00fb61bdc6af7d3940f302e588e04f79f7b3d4b91a5d193a4f8222bfeb69bf0347d98ad81ef99d130ebc7b36b0783394eea92a38ddd5e7480d2add4e4def53eb99c449bff94e4718b09f2ea9b1f2b886594a95c33a69e0333154e440ab34b7b6c1134d8179b6f0c56251a9ad8e1b6b0f9b8a5c97081a7f8fd05d0b0affc82dbddc8b0c0ab7e833f300626d4b973b3f60feac55571e89cda0f2b441ed2faa669a70d556cb48f9b1d1cbce32ede5d166b1143e264b11ea327681cb559edd13c364bd2baf1fd54bb781807bd59c868b0e4795a779e67f0bd0d14b5a6b9e440b57a5823328b59affbd027eda7dd785079c5f02b5e32890b038730986a39a5a9834a3fed868b6f45cbdd28acb2709aff556263864f9ae1e757b3278c288dbe2932825712773e431f7c29329857fdaea798ed93920893631402e6b13bab62b4855461edb94620f2d1751865f445c466 SIG = 9f583724de552eae82f254ac6e2ed483ec1a07346266735c490920690c1e3fb2a9e9a34194ed6473733b300d4f23c9aec0da5a2022054ca43885a15a2984320e SEED = 7dbc81902e4eaab3077540f559995c387403cac306d486e959c5eb59e431c0a8 PUB = e03066139082f613448bdbc27fe53aa3f88994c31ddce002e36bbb2963df3ec8 MESSAGE = dff798b1557b17085a0634371ded5ddf7a5acb996ef9035475e6826336f64ad8b84b882e30badec2b4a711998752f4a1574bc1f89d4325cf2b39861044dd03691e71d07768b5933a3052cc7c81d571a9de061dc19026c2f1e701f2dcf26a88d3401bc99fb81559dca76d8a31a92044a273587d622a08d1cce61c8f948a34ded1acb318881c9b49f6f37c30a65d495b02d5429e7ab4040d8bebeb78794ff736d1511031a6d67a22cdf341b980811c9d775fb19c6478f05ed98430103ea24c0f414d4cc07d860b72dc542ff22d83845a42f8ba45ca7ff3aab0b1e7de2b1094deac08d16eee01969f91bc16fec29ccc061c54db5345ba64842dacc99ee7729468d80a3f095583d8e8012408519d582cc3ff9a2eb7aebaa22db81ffc78ee90ef4ec589dcce87118dab31a6328e409ad5059a5132c82df3cefe2e4014e476f04c3a7018e45267ec5018ecd7bff1dda9267e90666b6b1417e89ddacb5085943befc7ad2f4df5f1ee0af9431aeeb6b24a5515b93dbcf68640f7daf8c961e567d7534900205c3df2184b6ac2da961c4c1d2bc49b4ea96b8154ffd4efffdc5e55a7119cb8af429e85105dffd41fe4a2ebba48168aa05fa7df27c4298735ff868f1496beb4b2ed0b8980c75ffd939ddd1a17e44a44fe3b02795339b08c8d SIG = 5b7f652f08f229fda1b0bd759377b3fb726c1b9c9a10ef63426d352dd0869bd54d876c3092f1cd411c3757d3c6b6ea942aa70c3aaeb4217a4c7364d18e76e50f SEED = 91b095c8a999e03f3ed749cd9f2faacc0076c3b477a87ab5ccd6631738767446 PUB = dad174d359daecca9c6b389ba096452ab5ca91e6383c6d042a284ece16ba97b6 MESSAGE = 9b0d8b00299852d68bbf497fe603961a485466a99a5484005db73d4e4bad814e8574efd54d648bd5c91ae8483c54b2f998b02e1abd6f401a25526843a5f2a23a97bd589d1f7e1ab14915b1e359a396d352c360ae6584325ae4bb7d624f61255c5c7bf0a67acab46c3b57b34534c0ee8431d260576606cbd84d8d1839e73da6fe4b0b8b78f0f958827c2f1d93ba7a346dcc75cb563dffde26f997598e8b5c2f1617c6fefc9be4b28b5401b0006413a251690d1203aaae4f6d8a3fb21f24009ab3bff13737a8a7e6646c02732d9ec5a4a510469e2d299e4cc1ad6480a482aa956f89ddcccc64a136fb15b876b6ecd88c7c86a4dfc60e666207c604167d163440ca9ab9cf87a5e0f7bbc5517de4dee876c037f8cc9d959c8ff5dbe944ff54cd91a771e29231f8b5f17d61de904c955fe2025dc52ed480fb3cc90f232459c607ef7e2adb52c7482becd67ad2149a4128f984038b58aa90176782393604aac74c18209a3d6a78630c01955a7cece5da8384da3baf63aa2ddf5963fae05ba3b81c6a03d86a00ef78edb4184fdc89b1d6bfeb310fd1b5fcce1e219524a3cfb2e972577f06b1dddeba00865dae4979000c008ad99f3b638cceb8e8c7a0f998d34d92143d81c0e1c096a925ceba65c43003ee18d494d003e9c61f77d65759 SIG = 64ee9efdb0c2601a835f418520641e436c7dd47c333d9fc30cfbb9e390fe764530654708b40b03581899a9ac870efd766ffbb4637152f8ff277964fe35425209 SEED = 8c568b310ace7d1f0edecefd603a884000544c792565d481c3d3e06e2d82ca96 PUB = 5fa6e267c766736841411072d1983d1900acf01d48c3ce11770b26f78da979f7 MESSAGE = b59f5fe9bb4ecff9289594721f2647047b0da5e0e4941bbe57c5b722b476723f0ac5970b4111f893bcaa411f28fceb4f585a2a7187018a904b70ef8fe1f6569a54d00ada37b69cb5e9c9d26c16a903518148e04a1b936a32329c94ee1a8fb6b591892c3aff00bf6e44dd0a762babe89d7060c17b90390d23bf9d360a293b8308383086916e1182b1ba4336f001b8d20deae9a029f7e85397a9ae5cf3ca10c7f3875588b8ffabb063c00ca26f580f69edc527a1accf4f41397b33766bcf6d55eb8de081a48c981d05c066617b80d8f6f5e60e59dd9b930bc4d04586403bb868df75933bdd86230e447036c175a10de9bb39953dcb1966a1f11912078e358f48c5b209a636c7f783f4d36a93ad2cc2e3244519078e99de1d5158b3961e0fc5a4f260c25f45f5e8585e601db08ba058d2909a1bf4995f4813460d369503c6873685ebcd3330a130b75f2365fb2a5a34ea63d958a2a867e90552d2cec8c390084be0c108b0fd2d83cb9284db5b842cbb5d0c3f6f1e2603c9c30c0f6a9b118e1a143a15e319fd1b607152b7cc0547497954c1f729199d0b23e53865403b0ad680e9b45369a6aa38d6685abd397f07fbca40627ecaf8d8d30133a6d9d5af009192751c9c45f77c0bc011268800bf552512730e69973c5bf362ab164894bf SIG = debdd8e5d3112fd77b394aa0e36e9426bac91df126fa9c317cea7c9d45957cdd96a45ae3ad760413ee1205afd71a29f9c3cb586cd2d7cd1e93bc1652fc34dc04 SEED = 3d09afcee3c432fdfb6bdcead54e3da5b1b4165c50d6d310b7fad787b444d680 PUB = b0d9028c4d1487d293ed585a76bc94fffbafe2c65d980c494e141e4810a35cb9 MESSAGE = 767165caae0e578f16537e1750be7de87a789a51ff2de11838f564e2580b2391362d2868a5a4708af15d2e2db7b9be39c16adcc1200b34e6b4d4027ddffc1a2a3595e29e855ec5261b20bd55c428b01309badb59e2ca3edb967fc2f4bac0729ddf54fb6c20057bdda9e7af7cbfc092fba865fd3275b9d3bcb0c346b951d170ac9aa650a86df49855d48a1b37ce56c9f27389f5c8b15f5c2c900c4f107c064f603e4f867ef2e9c10a1b74210e6b89bb011793aa85ded43b51b749ba7f70287b6bc1b89434db8b8c8b5d73b214b41e36b528005bfbfe002e21b1006fb9d24babd72106d093e3c7093b3138aea719d69479084647498cd6c9bbb744509cd7da8dd61a627100f03c21e750acb3fcf4631d7c0f618154d2e5fa6656fb76f74c24795047bbce4579eb110643fa98e1f776ca76d7a2b7b7b8678173c773f4be7e182fd24dd76291ac67d9f26a28c5e3cb025c6813a378b383224642b4aefad0c76a6579517b8f360797dd22613ee682b179381950fb71609a5fb5494d2d57dcb00f26d1e72956f4d6672830e05c01b3779677c07ea00953c6b8f0dc204c8dbdccb381bc01b89c5c261db189ab1f54e46bc3edc4de5ad4f0eb29c0a120e437cd8f37ac67d48c7f0e730278708f02b54aee62b72952bc1c0eb437ca8bd5655437 SIG = 89739fe441ca0ced08a6eb5796e9bdda0e74fb473528fd4907edb659aab44d3343229046716368faf88e85c1644af66ff2dcaf0b17ac93ca13819f3f241dd300 SEED = 41c1a2df9369cdc927164aa5adf7757136abe51395604266334cc5460ad5683e PUB = 40557834cce8e043580a4272a8804d4f926e88cb10d1df0c5e28b9b67e1b63da MESSAGE = b64b14ba77d239e6f81abe060accef85f0442b650c44015efc43a0aa2ba10bf48d3018b1953ddfffbcda5bf3bbe0b6b3e4b0d9a32c6b725bbb231e0a2704471ee8bc1d594f5c54226f5dd9dfa163cfc1452c61f93e4f8139ab4ce4476f07ec933661eae91b6d500bf508ac63e4baaf1ffc8f0007d802e005f1b4fc1c88bee4d5e9e76384f5a7043bd660cce71f3b67f01f6ab844298531aac73a39d045370088855005a09c6d04238ea478dfacad1e6b22b2be4c46b0d59b1eba1f060bf7da5d1566cf1fdb5c543a33926af63f01a0db86e1a6711c473dc795ab283c8d93facfb5701fa2f2f6bb99f9b7e3749b071d58607be44a7089bcb503ec1495b5feedb399961fd3677d7493eaa3b3e9cc5e3642f40d47de9bfee7c20b0e519c4eb4a40f4da446ed6ac7aaca053e759c97dabe0a8ec2f58e7f2f9b2072762f9f794a6a4e36060b8872bd2c18d06a85c2c141a78293773ee8cfbf154b9930cd39da31b497e737a7750c90a13f5aaa147cd0dc4311f2e34941252ef198b0c1f50827e56c9f16f595aced6d2a69346531495a6499774d360766ca9be5ed8881c0db26ed7c5e6ff3a4f9b73cd8b654640dc96bf43bd426a0f28c9b25fa704d62ff0288fcceffaaebd3ea3097bcbbd778420ebc520a417730a1b5b3b8c96cda9f4e177d SIG = b8b2752a097196c289849d78f811d9a62fc767278f0c46628b521f62ed2759d74462a175da22403f15020445cae06da3ed61cca6203b7006362a0e198963d20e SEED = a00611489467122c4c164bfb6a616e6a619b9f83c4367206b85d3fbec38cd62c PUB = 57ab58babb41dc0da0bcd506059aac9f46eca91cd35a61f1ba049a9ac227f3d9 MESSAGE = 34db02ed7512bf8c67d359e7203a2ea441e20e729766c15aa00fa249a3518fc29ef8905aa5b4670958c6a460d77b3a80efcb473859bbaff862223eee52fe58acfd3315f150f3c6c27ff48fca76552f98f6585b5e793308bf5976bad6ee327b4a7a313214b9ae04b9651b63cd8d9f5b3bec689e0fd000dd501770dd0e99b8f99eafa09c396a245a4a96e56896a29b24190b1ef11063f39b63ee3a586b07627dd3500c4e170b835dc0ec236fa5a35c44184707565c4a50662d8dbccfff7f9a7a68d021b4af64d532b7c3d2747418c2d717bb6aca6b58747ae4dd5641d826f79a8a315c38211a538a929e5b451f623f4fcbbcacdb86c8752ea13a617ab414ab653eb2e68d5420df7c6df92438168dcf9c066581dfe7b2c468194a23707de4659bd67eb634ff024741c5fc8698fd4dc41fe5dfc6299b7a08e6ffca37109c0210c8f94ea2d3ddc977ffc0b3794fe6ba4337c7aab434a68ac665484ea8243a84b79aa181ee6ab5aa37a32d879725edc018f8552181816d7d272ca8818a7b92e6ee4454d1f7828dd8afba1a790364b4ff28d84e028597353ebbef24837bc319e1ae8f2b0b6a851b489c3e170eef53e065f7032653cd6b46d8e57e4e111b789ba950c4230aba35e569e06615403407bce0369aaab4eafaef0cae109ac4cb838fb6c1 SIG = c771ba0a3d3c4a7b064bd51ad05c9ff27fd326610fbfa09183039e5edf35472dded8fc2275bbcc5df1bf129860c01a2c1311da602fbaffc8b79c249c9cc95502 SEED = de1634f3460e02898db53298d6d3821c60853adee2d7f3e8edd8b0239a48cfaf PUB = 9dc1465b3383f37de00ea2d3c70f2c8fac815f0172029c3f579579c984a5895e MESSAGE = d10c3e4de7fa2989dba87537e00593d0eed4d75ee65846dab1498b4749d64f40e34b5911c5ce3b53a7e37d2d02bb0dae38ed962a4edc86c00207bee9a8e456eccae8bdf4d87a76746014201af6caffe10566f08d10daaf077160f011feaca25b9c1f6eca9fc53314a80547951754355525257d09a7fdad5bc321b72aa28d1e02d8696d4f9eb0ad3b2196f8bcfaeb1d6148287a3faefef91a7a3e0609c28ce59d0ca14d0b3050dd4f096b7bc2513988ba212128d5026daaa7188846db21c5c1d179ab9487c1a5bd346588127c20398d362d4c759cfab2a677750b9e45676a1e7e092ef02edbf278fb19a58e9bf6c9e996e24edad73f3ce31fa04b6d8533436bf80b4b2f805ed91e7fcda3bc2bab3b2bb157158af0ea8e3f0731dfad459d2e79b6d3715fe7bf1eafc5397593208857e57b7feb2f7387943a8e0913470c161aef4fe205d3637f23177ff26304a4f64eba3fe6f7f272d234a67206a388ddd0366e894eaa4bb05d73a475f1b34ca222bbce1685b1b56e034e43b3c40e81fff79682c19f32aa3f2a895c0709f9f74a4d59d3a49029ecfcb283082b067f1a0d9505750fd867321999484249efa725f52c94c7596206a911f3f505d63f0313254bd445f05be3996b58fe1819af87352e7f0a2ca320d9cc00a5fe77ad41640d50be8436 SIG = d20506eb846923a0b16ff82fb2c3923b00c1b3bcc6e2f6482fba24807521e8e0223f692e62eac993f498f67102a04fd1acf9c7e3888d857c9a080b8af6361006 SEED = c738ef5f0935281ba625fa4014d4a4d0be7e28fed779a9cf658e21dba43cebc1 PUB = 95799faf706d195e544c76cafddf09d02d1beafc42c9d6c9ead4c1845587d39e MESSAGE = 168d0bc5598be02f5443bfe7dfb8829985ca5d282af9cf1b1482602f243d486bd82ba039a0750909e9b3c7d4d5f8b8baf45718af0311854f4d1c7837f31d8ee68d3558e7e51e0c646a4a637596ee90057b01ed0a17daa3950b81ab47ae8b94c17d40746913c46ba1478bfca51b167628fc3ee1e22f2f19d6d8daf93df6540cedb7a859d1a2ba5911ba71766e8b7fce0c0e8663616d0180697d78ce3040d438131982f3f8112acca29ae53e539ff8c9ec4106d132f402018518308485f2aa6c9e8d1e62fed60cb249457db33c6fd1fe07445361f08194a2b5a057cb03cc754e5c7d4a7eea53a7f7d207cacca5e68cafa969a3521dbb810399a17f328ee767cf55926b2bd5f029549d3b464579c42655265398472e1c77cc8dd9aff187f7ac34dd456ace999a736ecca6d405d4922c779c600c47b84c9c1df5e5f8ed3b2811d351339113f8453cca4c4411688cb0388258ebbd1872b83610042249494ed560d4cda6a68455d957e806dd0bdd83004c4ca80774b8a0a1665866f17085014eadb3eae7382fa870deb29dd8c931b53019625740e28392f38575c0e2a9e504fc35bd95df56439a898230a2398cd2225c766ef36f12ae7e49b30a9c0aad469d5895bbf721cc0ff51d840c802d4a7eefba84fe5205a2c2f14011922dde561456f79e6161 SIG = f44371e6c3391639d457ed14648184809411e80a3201f8811670e500fcad92f300aabf7fc68e440191e881d6c3474efd6d28f09dc44312fcfcb82701ba3c290a SEED = 5fea38739c61ca83bf7b4ad175a2117627b971a634a305a84fa57fecb8035624 PUB = ddd14b0fc06768d5104c50764bfd3b952352a34007c50d5ddd224ff51afcdf9c MESSAGE = 1013c60a73953549e5ed105bdea150b91e60ec39200d43721304bfc8ec439d39609613c2d878044a9da01b26d86d6d65db93d91a137e9c4808a97d4ef286a903f3f1382cc6d1294216b9fafc013c86b9ff68b55a50ea3766e61dc1ce38348e91d62ce732c152d766b9335c68d6cad77be2b4a0cd50b9a1ec632ba55648a6e7e11a14c06853c02aec4809bd147a5ddd9fbc3be9f0c8158d84ab6795d771b42b1814a17a3c7a6ca0f4a8f7b3a0db1c73ba13b16400dfecbd03d216650e4d69704a707246444d5791fa273752f59cb5ae9fd416a5186613d66afdbd1ce691a87bd7d8b67190e9ac687062a080d2ec39fe76ed8335058251872839e85eb62f18ece187caba55b5f7d5edcade01cdc543cc677e50238b89c5635ad5c8fc220f5e0be1bc667d20989753a6d616fa69f8b12940b8ca9e2c48577132d8691b053779a152cbacff3b8b1bd7af692e56c73bbae4634776cfc213c99b9ae458df1befc8c877742664b0a0bb1f6915c8dae3b3f55dd75aba6a3bcc4176b4e3ba03d0c1c04c3c6408778b2b8e5a8a3eb52ed32a7428c00a98a589d8ca9390a210f4a7ac004fa1fe4c6da694f12276e320b41b0b59f75d264a396d450b631ab353f1612709e7a2e6a50d01cb110e53040546dd3b1e11d25732813aa76be5e81fcf7a5773f6815bbd SIG = f4e274823f2c396f3a329486aa6410c5ff19266f0770fd04fb14a7602d2b69a4a2b00928e9e1d92389f8033359ed6fb2146467aa154cba597dec6a84173f8d07 SEED = 60f9a14cce5d43fd9aab4ee8cc8379d575949152693bf29a6790b035e42a44de PUB = bd4a70740d5acabe49f9a2152082fa2025330e6440437f1d047f313de490dca5 MESSAGE = dd7f44f9eb728ab48de54ecde6b6184bd5ddd8707545a0129f2e905905b55d3e7fd57e28485d258148f6605e2377d5b267d2eaf4cd4b46e454962219868232b6f41f88a797f9cdd5c39ada51a641214fb9db2c2a9b5a5b16e303575318b625cca970b74348727902a1cf268bd16e107113161c8cbc99303c2b9f235541a7b31e433120feba14febe4bcb0f5b936c7edddd0ecfc72c8d38f64cdb6cfc2910bc29a521c50a51abcbc2aabf789de822cb04f5728fee153dd5501b2db59c59f50cab17c29216d66951019e145b36fd7e841bfbb0a328554b44dd7ef51468c3d5b7d3a1f7b9def58d8cf9d9bcafe92c86cf6d6119e98dba6f38ea57e322ddc9c2198d4bbc3b94ea1329db0d458e01c7081b33925a3e287f599a858c50c3a8f18cc2aa634df63e7f10e403adeab2f41db5578790c3b4f041a8b7a4f69cd6e06215df8201ae5b3e1d1d25a0a39bfc3d041a2f98213ef4141245792a76f06d4de25f6467a0e56f2f5cf69400d22117de7b46149554b70c75b9f99484a4f6f035ad3f10e3753cb14f4f398dcf6a64d10cf6c4fac07c91193cc0f54f0de58c6343e9caaa6b4f475ef91a59e083f9f211f5bc8e7e4516b45cf06bf50beb8fc4ab579d86d4a4190eeac748d06e0852c4b9ba8cfc50dd0a037a7bad7fad55af309a5f13d4c91ed3e0 SIG = 72f54bb8bdd17e9e422cd339631dd39f57355015d4cbd15acab7542efd784a321c1f6125764c0d154045b32e70dc2e03fbfe1117468ac3e73127b5fac8d42102 SEED = a39053c5c58bf31d462b27a620b0b37b8052c6b1c4102b6145663aa15e978718 PUB = 3642ac2a3280dce52ad8dfcfd3709436edc4e7e4ae1b452d9b220780b08679fa MESSAGE = f65540d3abeb1ee5ea987062c1b579516d3c29c39cbc6b09d60e18fe274c2befe0f5fe7dbd57c2d5835229bb754ec4341394765776d6a9178c4e6a312cd74bdbaca0e88270628cd84100f472b075f93692830122f00f9bd91ac582836c8bfa714aa48e977003556e1b696df328ef584f413f8ab614760699c4d147c3eea1da0435835c9bf7ad54606f0213eb74a1b476141506ae2cd124cd51d66e7e7e579560576305c5fbe8430be3ebebaacba3f9989dd7d199f5a455a50cdb3755037e1a70674a4fef40b4a3aaf7bd3c95b1ab41bb206211c3a1276d3e37d8a3a5c3d5d0f36ef5b4f3de26b7f20f6b2900716dcc22ab734ebaf1e8d00020e5f019551653b9c2f70a4038dfb2f12d25d6d84e79073a6548fe15e4828fe5de83ac3d8d98b7daf92710482c37f7bd2431a8114c6137657bb177882d8a3c76babf1c671a7055365fe90866167a2d1dbc870be83b3601f09d4a317ae254cac9f98dcc7aead9224cd9c9d8a200abc80a2dd108af28fd46ad7080ae741b50054b9b9a9201efb7838bc4c5c2cc3d76ba0fcc49c46e792c26292b7d0312aff955a9f8edf0c696a70a614f3553ad3869bfde48d26a4d367b6cec057e62a4e548554b48b53ecda790ba7a0ab2e3de587bdc22b02f5947634d73099f547db22ec1bbf82343f9a2ca38bce4eb59be SIG = f7383e966cb2309deedf860100183aaefac672ca16d5419cd6422ca70e16b3976f5f165afc2786117c868234ba1109ede031f8979b50e567358bd4f8bd958202 SEED = e0c29df4de45c47539e0896b3a59bc3de6b802fd14dbdc9f25e717ac82c328f3 PUB = a69002b0f5ef354ce3b2d6b8d8ba70ab778432b22f144dc9c2eb92d99d99dd2a MESSAGE = 6a37cb4c749c583590c8d849bce3fa657f10009190cad9be41ede19bf2fdb3c562a6101f27bd37f223cab13ced245a1cedf852f551f857aad9727f62c967c0a921df116f48a80a6040b3c723ab5cb594c4507a3d20cd60514e22164a82b74f19dcfdd83c57bc3652375517414af5d18e0a64ccab36699768d07cf40b7063a83e43d5f607964b1bf0840a45ad50abf83dbc849f40e5b4cfb6a3347b29fec50774046a4b50041032aa4d567e8564b3eed1642040682dd8ae7d7179286cf6e1853dc87d27c3e9e60fa47cf8cb2da0181d53eec40614b07331a4fb7028086d0b1ce2e1115b73a162c527bdd7cab5335b863d108be047bdbca112cc6e776bb453c317314388bb9653efb4444bf5cf1ec8da23b711ba71796c0ae02ba1dcc838455078c3897f07e9e13b76e49274c2e207506b00a0b558883aa122b667db9d670508606a3f54320636cd19f973917fb1875f4363e220f1e12398cc6afd79094743338456813a5826ad3f1aba7cd7beab1fe183859c0cc9ef40a5eab912caf515a8d4c3b93d641b7ab3e76b16c12971ace88ff33e5a1ed9b44e45db8f3085dbf070b256b0d7512ee1069432603d73095db8749ca547963bd71a8a684ab8516b146c4187176386afdf6cb1368a3dd8fcb2cfff77056aaf7823f800b266acce72bf643c6d0c28f0ab SIG = bb3b8c5c27591fd8b9c5ba489d6b6ee5b0fb4a7b0de51f1639afc673d0e5f75e313aa7e1d0009081dbca7435b687ccd12f64f74a386e772b9e24781b925c8c0c SEED = 198b5fd1c03827e0994ad5bfee9b5b7be9966c9c3a267e4d7430343767403c67 PUB = 6682c6f1a866b49b2f8ee97f2e532fa91666bf38da1b4dd65543a1777794cbee MESSAGE = 3fdaa15c46f25143db972079d7013c7f69a136f45f3f6ba2ced8b828468eb3daa6b50b4f8d3380fec64a0343be116f6f83b6ee64cc4c1b1d08d54fd42029e4285cfc6c6dd5cd181ab533ffcd411f23a1003da94ec9340e2ec71199d678540d5182e139ffcbc505a170b8f07f4a7e694ca92f58320c0a078564ce9de99b0fa8e66b0d822e467a5aeb83567996a48b89db25cade6457794e5414d67e9d4ab7cd6cc2058bb7a513abd709f4caf24bb67ce1c03ab62dbdfe309ec7db0fa3ea7aae8236f259b922d4536115a63bc89acb2051d09e731cbb0df157d9d345bd9109973c2b594f148efc6f3377de5163b7f69869ffef853eaefeb402e23529594fbd65ca05fe4062c529d8e321abc05200cac1e839e87b1fd3fdf021d68cbb3a4142b69cc3af6f632edd65b83f5aa4cb17da5b6ba3fc03edb17c2a3cb5b04836e7660e63c8a0483e243983371dfa9839f9164ad4da0d5953655e3a9518e136da745737c79243c355fc125cbdcc76aec92216846c4574f4f7f298bcde54fd2444ad3025955c100315de5a4e27c333a00284b2f702fdd3de22ac6c240dbc14bf71e62d131b62f2db992473f2f913f60c916ecf57df5f3f021fb330834395b79472caff19fcfa0a271795c76d69b4db3f85b8d2e5c3441965484dcc39aba59b701274f7fc425246856069 SIG = f454f35b18538f877e5d614a76b5276a27fc0b433f215dc4e963b3f047694c780c515c6ef6fe2db4b009009bc2733aec4fd46e615357cc0bcc9f1f7fc21e3c02 SEED = 4392f7d4fbd68fe154e4ba38ad5207612a0648556056c39ac116ad468f89bd2d PUB = cbeaef41acac02bf1f780ce934aabd631364b369567be1be28e3906f9db120fa MESSAGE = cf1709dc9a0867ee908721b136cb93a84229e83b46204777ca8194d08b7a3ca9c912eb243e5bdabfeed352349d20be801b722af0892238e72edf190e6361f57572781ad3c2590b197357641c805383baa1d4972f76c65448532c110834a0baa8f48863e166b706653708cd4057d3a4f9fcb2ceb4120001277d38c43847d822822b777c2bb4da4015a1c24d416d5062a8718491d855aaa5dbf5579c164d8e524a9f2fa3f22eb09861ffe6ad659fe36eb40431222c22d7137a6cabca8db786e39d81f661afde4e39589b4db4d3c51ca53590a14e115d0afc3a877b839a9638bece80c32c19e51b7532024845f76cfe9bfb2ac05130f6758bf7fe993aa93aa272e4e6bd0c75c14099d43e652a223e5bcd64c362d4b8f4b95e016f9350c7fa74e653525d08011558b2c6e9bf4fdf9dbd5ef9b09bbc846afc2bcbc86c4ccc315f6d1ccd489b0cf8ed0d93f2f532a426265c590ba3a59023347d819d9b281ef85310b05316d46c8a8c0365d068a8708664ea4d77ac0cd150a65a56586babd34b74365bb8fe3e6187262284d64432e4c81ea4c0e57c1d71ae980c7f4d1d871032e188bbf9d1758cdc1dff989f2d1288fef4e205e99e7cbf2cc324b8c93046f476c59d3d0a59db6fe37382dc79c5ec16056ab3934a52f7d2880d0471a377b6a8ae84d56ac22d1d54551c SIG = 86e7ccf06e79362d40cdb7fb75a98978bbd334a1db7590367d60849bd53e2fb1a4bdae590d1f47b5490d8702e7c1a87268b8ee9db612de7bdc2e38fa6deb7e05 SEED = 0bea98abe7d63f158390ee668aa050e84a25d2893e49fc83f079f9bba6a55a75 PUB = 22192ec0d32ef9835665a61bc88bcf4e1604637921152c116af503365bf6be42 MESSAGE = c178e38d4e83ed2be57ce1c3ab64253a8171e610008181fbfc6d752269f7f1c5a9ec62cb27f19ad99ce1f5116a363d96fdc5a42f358b6dbe7cabdfc9f60718e4012c1bb1f842c5560811ba8374a0637747ff92eac21ca65ddeaf43e9989b7de2d432520afee364ecfba4da669ad4893d0bf69f9f81e7df69657be22b92069745f216c242ccd46d02d35616e16c755e0e37f961a6f3637752534f6dfab8805ab759a032a4e7e4c81953325a2f686bb69a029ce4e03becb3605637c5a65b52e331c26c926ed4711a504d3733bb53c97b80eafe4e75ddd9f415362888c3d4d37bae0e63fa11bf755666437d72f58c91d7a2f8cb619b7620a070b26b18b4d50184c5818712110e36d3e2830f6a8576ba57f9cccb8fff4028bf8ef9cb814825bbca827d649547bf6f2bef931704ca7f6df15f780155ed46eaa7ca7d72e22434ca0483bfb2f7902dc787f617eb9bd41ed4520adfd430948c710805a73c1ba5492e96484c4baa7da24c7435c46a052bf3515d33e42dcef517caa45f36c879121078c688dd10d76656a119762b6a834136fa1f8a643224b9224c543cf0470b3f8ee017d620dbdcc84d985154e9d1ae80e5f14387b88a0f6a5c35905aa57fb3abeb0ea6eccddb004474633cc483b56b8a8e20e8f2e09e979aa09893087875c6b117b5f13847ad8fc05604c4 SIG = 7eb3139b880fdf66376a2090818840049767c837f3ad0036b141667052b33609817ca5e240ed8cdf3ccf3aee29274534594db0b4ccc5c6e5bba3280b873f2901 SEED = c25878b0d1e0925c8f5f04a1e5799080963c413a1399c118afb1687c797f4839 PUB = 13ac2cad41908c255f671f93934ae5d7be325346725c8b40dc39ea80d70ddf34 MESSAGE = 6856cc7144b6bddcc4b58954d1a2e7101d6584b5d5e719a0aea0fbbdf221c2a2aacbacdc4020c5c8ce681ff7381acd607b0f5239692335700655be2d94c53d7b5148e92a2bc16338c2f4c1a7d1c595af622c240ce579a5e0f5b651bf562518cec8aa2ce4b4aadb1f2fda6cf6295bc37803b5377dab65c9b9a2949fdd49bf9ddc8f96d260ff951bf8e8ccf9827e6869c44bfd973358cefdb010db5e1fe5dbd9f5d2b2ca393c17d446f637059e692d7a91aadcc7689f5f9e1b3052175d9b6b208f9026787fdb66783f45372a24946b1bd1687bf0cfcc8174ebe4d32e43284fc78d7844de0fa22e2065e07528baabaf015cb34d629c3596ad040de31c5620eb266defa7533ac0401998e5673a754365047debfcf7e137a20d16cdd6a5521982f444cfc3429397c641bd7e74a770bb11fcb29483e337bae5169ee82da9a91adf3af67cd814c2825d29018ef035ea86f8de4c7563aaf66e0c75d17ca68f49f0758ec2d9c5179d01aaed7d4515e91a222b0b06fbde4f07a7d9df2de3bcae37ca2c8460c2a6b3749e9bda36d08e66bcc356b390434b4a18cfa45af557dca3d857ff3ad347cfb07e2358c2acfd5cd53b3b0ea2a41ee5c0802fd473db5f30526334da41eb4bc7518383898a0b7507ad4ca289d66c5e2eb75cf255dff312cb1e04eebeb47f2930b90d5e002eb0 SIG = 06f55198b4191914b74306f38e381316eac40b5b5adb8a312464f67175ecf612e0147b1cef46c2518750a5606bb03bc6467bb9321514f69dcbebce8f69058002 SEED = 0b2ec62763f687593135da1961ef29a288089696d944b265a5f96893cd2d8225 PUB = c1e234fa8bc96d268e7aad028b03f0a911b697715db3a21c2fc7df48ecda8875 MESSAGE = a83434c68693d5fced91bda10213fcd50c48920b90cee9b73a9c61081a0974933f4fdb0a67e671f8351b0ed5ec0fe7b5fb0c87586fe582ffb1bfa2db5fcedd3302428234b2bb0e726dedf45b13a70cd35ab3e299d13f34503508278c4458eea5b7351b05836bdad5b05f60e445fc65737ae27d2e52df9c39e5da0286392d08fff7ecb7066820fc90fc8a44d5616561c50b52714702302bca5874de85dba045045f9f0e604eb86d6d7fbd775f72ea493b2c4ef7c3be16db2ca7e4d8bd79eb20cfb5f0f6f05336b75cc86d219f3b8f2e91ba7d52b64fdd6a6664f04f2fbab758cdf984168691c32f53e8616b49f76ab7b192b900903082cc89656a9705804cc9b9288a3e42170984f8dc454e0864b9341672686a178c060050178a36c6d906b2ce070d8faaacd9a58c794a5ea4108b4a485c65811c2dca2ee7bb10bffff75d4586b990f43763a16fbc0b48ae1fafb08a9a36fa4326845dba5ba2fbd32bbf66505c5e8657ed0107e3e16144ef31fa6aae72e774097483f5480aa45540568fd08cba0d577768004f58ae9b95be374ed7f0299fe721275e476e0b9ab72dc06ea328384e39bf3ac331c625484312cd9b06b15a2954d33e7aaba6be2261886ca811db96b1143d06dd6e0f3cba7a1ae9b94eaf67771bb2d24e2f94de9c470fcde7bfdb32f410198b5aa9698e32 SIG = ff701f34b3594de3b80045f429e5e32dd88d6051d4195f1685be783766e80119368f56b3749725b913f1223f87fb0fb24d9dfa0841d6a0e2eb1fddf775c2d205 SEED = 8960d7bee8c6b39ca5934d7cddd16f16b3663e6e03e833c057e2181e4597cb68 PUB = 43409095d4f50f5eddbd5cd4d2012298cb41a40e99492d5a2db08be5377ea183 MESSAGE = 308d84c7a5f786e563e5c1ea57aab5e555c00997749d15aee35439efa645da2c3967703115c6c63ed7f94785c5478f38467b86e7626e8fffa4d51a2dc45e6df2a35cec99555eabc9f7a93e2e2b689459b4e0c92b351562c417b1997113754ea59e4a91510728ff3071a2bbd1f465a687f67dae955615031a8ad551fe738a260bbc446b48dca1d979051ab5840832e19d473b666217a9183980d6b27e3d3c76d93665ba2393e6ab1a42c3904d4025932d601a202a59a4c49fdb77f0e02868247de5afdfaa1b894208ac00d77c6bb54c6b2a73a47657e44c85137963b57521af20976248eb261482147cdf7a145c3643e29e0588bfdae6a082904853ce5a10d24970ebdfb7f59d5efdd6a5e7e0d287971c846acd54d84dd45468a4110bab6ef8d9a5b4b2426788900b7e1adfe0624344f98fe59ef8a1e6c405b344eb97bb204773744b6a2d8c6e65d17cea07de03b7f0fe49f1a55c33d5f15ce55df7c9561b251c6ac807a92553e1ce917012dccfd69e7dbd038c7eeecae98623f18fbb650e2218a0bc0fff43a75a116448bb7362f527ee6bc8e10761cccf9bcfc0d000f2127b4cc19211d095a0bdaa4e4be4519e6c8445eab9b3144a45cab9996135bf7f75a78d22275900f4ce1f0a9eac136364103062893dad4390422b77e5f5d1d94d7029c6097b35ca64a7a476fcc7 SIG = 7213dd4a79fd54dec0c548ef42e6cae015be77802bf515cd2582768f72f563ebb2da36af4aaeac56bbffc9932c2e24ec95daff00a5f7a0acab9c8bd3c23bb40c SEED = ef6b9b51fd4f8586ca62658e042fc09a83b943033526ffc326c65eb3a5fb594b PUB = 1d6eece805e0887821876b7ed6ed5b0714d646fbecda38764f94c8155e61d004 MESSAGE = a8f3f19665de2390d5cc52b064b4851273677486d8f5563bb7c95fa94db3356161ee622221f10cbb1fa195aac7231ea716d74b46b37bc85a70dba3dfaa1675217b351199e74a971028f729b7ae2b74ae8c6b3a0679c3e3296802844ad5bba343f6f9f7c4661b4a29b44f17e89e114fb220e984cd980e94c3d2bf9873e0605c92301744a3035ef046bad2666b5c63ebecf93cc140291946c0fa170340ce395092deed79841352fbfee03a927eb458f2a633ed3271652f5b0f9960cdf9015d56fdabd89ee71e259af6eb514b4c1bd4a666f5b5a35c90f35b149457af2944dd0aa8d9b542283a7e5412b775e421d2126f89bebc3ca37f73071621f1321eee52e9690486a33cd7ff9c9967fb65ee4e907b6b852211473d21e9d91a93362ac761760e8c7bbea486c3d605f9e11b86136819a7ab3f32f13ffca16817fed197ff880b4d6d9a808f7f878763a045728df72faaa963e4cb1c09cc2b2da920280c8366b7d18bf8972df16cc23448fbe6b2e6e16cbbf0745129854053189637ce115d2398433c15d6f116a205334824af282fa758494c47868ea8f4dfadc705e861aad2eb8ef3dbbed2a4569e15834a760cce0cbbc84b289e779b988346b9069c744c97ab2bf42b086d2fb0a411f5ce99f0819a3086b4fe9d96c7c9908dce28df1ddd30f3501ddaf78110734f9dcdfec3 SIG = 71d171071cd0fea1c6a9cfad1f7fd835e85ff906778bc6345a4dec4313ecc2bff755a717ebd912a5e02840ac073842f9bfcaa58913e260e3c73393d36685c70e SEED = bad47cd4bd89849067cce1e63c3d91e9b787aea8584edb07f3451ef67e7bd79b PUB = ab0ce9ba1d29bdfb85a0e66b76b5e2e05ff732569e4375ccd75098e9e71d17bf MESSAGE = b5a61e19e4863e0bb5f3fab6c4970d878596895521fa1e7f678cafa2de53322fd458a98aa6e35805429f651291b95bd9950e155f3ada0b609159a4abda5990c04bc2e764422fb49ef42f12529ff6f6a82029ff0185662e658f83c546eed09f06b5a68e857cdad0eb9ec4eecbfd88f34bc80990f8644a9bfdde1d9f3a90d557a8b828d5ce06a64e3b238582bb4cbeba30edc49e8122c55e95badcf502cc567869c09e9f46c6ff3f6878986b1de00b72a1858046fcd3a6e9cdaf5b073c56f2025063a2d178bd4c1e8cbc1e6e671aa97fb2cb4cc8a62c20be41c776372c8e7be63b482e6c63fa85d7cffbc1b2820bae1fc128343a1e20fcf1bc3502eee81358cc9a74c72af63530f96a25a604648ff570df1eb89d1fddbab28679ba2e9b41977e9a9c1caecdbfc361a1dd055ec51620a9bbdbbaf718c9cc136d2007710399536d13332485ec38879785e0c9ce9915a80251373990a59bce440326031ab1b458bfa5b8a4793da4ee11ab7af20de2a118c9ae521a417b68207fc885e109d8463e9f022787cc730db0b1faaed257bed901710885b74e994f54f6f2aeb64f0f60b59efbf2e3bb6515424603a113c0b8a31ba3c1e9a9b8118c87ec6949b75f49627ea7b1328889391104d4f4a3892cf00f26a73cda2a40f9b7157afc40667f4a04f647dbf93906b84c9a35164e1bc902 SIG = e5724a1dd463a97d1222c518c4925d322202d10f04cd078e771e0fb3951dbc1493a234460754c3aae3df93008dbbfb310c99592bede735a4aeab0323a1210d0e SEED = caba8e0533113a4be173408ba83c0db74260802f9186c391402655acde6015cb PUB = 2d7bef6164c279fa1028a9788e3e8ee8ac15edcf92a5855062952310b4684547 MESSAGE = 2413a32bca5ce6e230e565eb858493d5d04e6d2e2a7ab1f89a3b423311676bfa93c67daafd1cfc7109e040bac52cbfe07c28280bb6acf6e3a31073dab2965378dd77f61fe9247135c1a631b79ad668c9ea1cd4112d8d3a064cc21df32aeac7dd718b091fb6915b8bc063bb5815c376e01476312a2e5433417a7a9315d65999b02ff464a474a597e53988773670eca46a6e26cf96e9488e9e6344bc783ddfb535e76bb3b9a603ff4c59c7dbe2d8b6198d5b24490b4ea96c95959ffbf3d8218e760daf20e01e2f36c84bb097115abddee92bed82d16b15a9e192e9893ac638461df507207b0cf595884d8a99fb9c7045f9bff7b73f00ca3fd595a5cec292adb458bd9463be1204d01678d2f4389b8720115fa597c402b4ff694b71ce4f3d330d5e2f3c3ad6d96a9b3439230fc53a44794cda595557c406ca1589bc7be81e2d79636033253fa7bdd600c67fc55936bd96ce0428c3eb97bad1de0a5fbb9b675157de5f18bc62a7c22c9483e2802e679b5b8f89db0fc37f7c7150ad5ac8722ceb999b2435e6997217092336ef1c8a2292dab9a46ff8a9e10d3355765cac9d6598770f4f01ea639125fd031609dd1a507d96280c7d01a3ee987e9b210ec8744cd48c74f8afee961e8ef221f826a1fe6e7df0cb15ad7c7ef4a91f9d0f4c2e1bdea635d275fac8c4bc0601f490dbdbc734 SIG = ec35ec32c8a4008827e178492b3b8bee22a4954fc6b25f4f225dd7ed23698900de8156756a8edc35c51d10f82b830a2a659676eac911f960244766e0c3c60705 SEED = 9bf3fbc7308b46f6036bade0c3ca199fac662b07f103bf75181d52ba6a58be05 PUB = 2f6ac6fc33bc060c1dc3cb9d1a2b9115845addb16c4b84be37ed33adb3b3d3a8 MESSAGE = d65e36a6a38195ecb91de3c848b51f639245fa2baba8a6f85947159dec0ed3fae80c5a0f8c66ff24793c89c0c687543bc633547a1f37f730d97012ebbdc7ac339c4890c0856bbfe2ba29b25a7aa6b089c033fecb76db62dd3c00f6421b9e76dd0ea366eb2d4a052ee6cc736e3819191d5ad7a66d2be042cc6539e5f35652b155a727f3888d93f93a9102598f7538a9ab7c777eec79426a6075d6f38d64c485520f6413ff4d358a8a9cbdab01adf4db02adaea26494d1f5d617637f277f8b0e6e7e61e2eeccdd337de2baf0ca264c14c8cb8368000b9c714385f413737d6816e212cae2aecfffc32fd16d46c3ecee6ab074c0d768bdfe99b86cbbc8df9c47cd586d465871268d4a9d1c877236ab78f8859c114e251cabc4be0f8bc25d148c5f543e290745d11803e49f5b53193fe39969c039b3f249b32f2b8598b6acf4ed64d5752bb772ff4ee00ce0f85ecbb4cfc4ce07daf2809868c2903b781e12a274105f06181029e47f2bfb21f49480aa1e444715c0b9ff07ead88975d93585d2ff424832a9783d94906a60f877ae1c85ff15317badca1e61317433c7ce96279b678ec9d174dd0870080b234154f626a53462cfd547842eab8705605b8ee885729ee78d1833aa43f55ac22731989fdeda7dc5fa9c01985f2661e6c7326d346e6db27e6f921fae7c93a2170e10dd0c460bdc SIG = 0c3136e01f9bcd99e10d3d124b0cdb0772bec18a864be81bd1daa44d818c3d470dfaa8ab6e9a761cf03f93ef9cc78291096ed6d10c08fa2fba3bac04dde20f0c SEED = 64e89304a335e903cb36c0bdf1a6412ef368468006b73d3d2d61cb030cc5f8d1 PUB = a180ef3a661c3c479d5f69807c902748e35e7f725121e37a5d91b8bec88d83a6 MESSAGE = 2f51074d981bdafafb02a40fe826c45f3171c1b3184d8c260b82b8411fc625cb02ccfe755dc29dc7895bf759e61b2450da1a656a38d4f70d2ee748c518c6420306e5f01ec7a0ffe0e9dceb93f6c077b12662881584f98ce6ab945f87fc6d123c45d6cdfd8237a1ce3635b623a79d020df44c74b89ac14a321fbf33a8c0a2559fea1c2b156076b813908f842ebe4c2b949089e52b1ae40dc6e4b2abbc439a0bf72369679aab6f4c00018be147f7c0a67b9679ee88a53819c49f7b675e30a8b5af39661ee8db21010411294968f88e5d604d0d88d76a7e4864fad3a56f5f624ba1b34ea9cb720850aad3bd4f0a882a7d25fbec2bb7ca86da616da96c1562c6d6a1abcc641e1b58b2c178e1c3bc8a3b36ec9e144dd2e75b0bc8c08ccb0d6e3427b0322b3d6ab93f3f60b9cc5b61dad02385a14949f9b87a8e3af1e0e0fab7a9a928c753fc6110444af7ccaf8027ed641b9ed87fa5d8e1f76cae465d57a70dad9ebfdd3ce7576ac4de89d98f42e282ad87ad6a5042577cbbbc4d951e2a8676fedc8cb1b1bdf76c3a38846385a85aa24706c20a8b38465fe2ae0e41f78e614b8e9642fe2471a9015747db976e0c7848c23ff3f417cb05a8d5ef40130adf855c998a62104d7e2fb7c0f9aa2a496075623ced2c0f7eec10147ff9608a8a042ef98117459b93837fd1b8d5ef03978eada74cac SIG = 92eb4454814001ecfc18025d6421f64645a5bcbb5cb8fd85c14d772617c503e8be7d3bcf117f5e6801d1c3b96f9090a66ddc67f8cf8ff0f1c125b16b15e2ce07 SEED = 6f634387ca2c0cb167a740d6afd89e2a28f5307184e81cba3c037046a5ede23c PUB = 011f2a9a111c38f3490cad1685be78eceedc6fac4a3221301c69c84b1ec7b3a7 MESSAGE = 865c20a94ac3f2e3bd5cb85bec9d33726671fe01f9c537017d59c8d5106e43360bf76fc06186705980c8a87ba3633a4a170426ecc0defb6db2670f5f592533774cda50052ae597d48deacc2637063bfd519f2e79bac81775beccb1ab2f5b39712e2e829469b75a2d2dbd08aa6d24723404b25eb948a4834c55246c8079a82ec64354e8c2388f8c5a616b3cdc371e6263fabc9f6099219e861585fe82a67d610dd1eb5c81c96b5cb354a689fd8aac8db76c433f0cb0b31cf1d855b6a30a3d2a212e9b4f7d7afe619951f98d2f1ba2c101085ba81f49b36037cd6457a7eaa8f4f3bedf68d09fc9fa25a9d754db65360285412d1a6da53788905fcf4efa8a80cd86ca48b845633d8c31c2ae06f16c4c6bbbe9cd1afb59e101be50e03535dd8a65e45bba46d45cb14badfc8e93ab5267f4e492ab1f9a95e61fcab81cbf2bd867a3ec7b4baa189a0f08567075596129dcf9ff1c502d3279e8aa6ce56eaf134582a9e430a5aa8ca10c3da8bc793d0256ad19aea7149f0ea7ea95facfac1c5cfd29d7a3fe1a417975739e14da8edc819900472ca8c69716328e8a299f974edff741aabc1c074a761b3ec8761dda2e7eed7af33ef00409849d415497c5ed5dfaa2259a31d076398170b2d9d210208b4a4c7db8c626d1c533562a1f95489f9819e4985fc4e1d1a707be5e82b005481d86377f424e SIG = fd17c618cdbb5d459ea2aca886f0512c623251284aae3a83eb5d7f60da1d9b2ba083c455a5e2583a3cba736e7b961ba19c1cc8dd90745da82a15dfc662e8e10d SEED = 4b2e1ae60fa5d383baba54edc168b9b05e0d05ee9c181321dbfddd1983959154 PUB = 36c020b18552345619ef8837eb8d5494840e85f46809343b4d6f406125da557d MESSAGE = fab98b2bbf86aeb05086812a4b0049a1042abb76df9cd2908755706303efedb1ad21e8bc8d7562349e1e98ce0d752f4b3d99e677368bd08c78fe7425ec3b560e383bd42af6499886c35add80a5828b61d6644d7dc443ba2c06f9bad2eccb983d24458f6ada1b10bb5b77172c5cdd56d273d1e41010b25cf48a7d58d7255702ac12f2a6fe2918466395f460d15236d035ae9410ca86c4605128299faaf09015f1adee7768ee1a8f8ca06d10dd7f95c46fa10253065f9d6f90295908809fd779571be29e0ae66e0bcbdeb7913d2bbb76ac302f3452c55ef199a48eceb0e3596c7b4c0386dae7101ea244a33c4cdc830672df83655b35338052307b94d223cab1af69e07f78e58cbb0cb3c5351e3a6b0c4a927f7562c598d2d3df90569f61db1a3cb0140b56ea02cf7745fbeec2028673d67f1ec5f7daf9715f754a9d8ed46a7a63ef722ee0d5899331b63c974fa880429435767f96254ef46c9968f3fedaafeaf3e8f45634b54f5e0a5fc2d2373ab9e98d9acfe3697e642a18e0dfd9fbc2f094866d401f0a4ca2a456edf6a1a77b9c296c3922067eb3d5a5ca0a77f430e4c8611d8f05a1baac1635ef7ba83dfc69d301949856be4d2c8ab61de29cf39250c5794cbf5750cda95d0468afa2b7f23dba4ef5f5295a3bf4140018b7ed061884444f5bb1b7d239312dd739999536c684456ea06b SIG = 2220119e83d69a6a3eed95fa166d1d1128a3f232ca1b78bc94b4d476c4779443614b8772aa2232cb0720a055eb71d8407f3ab19baa1d962c052c84c0bd589608 SEED = b216cebf878024c20dfc86ce4b37bdc47aa28f29203b5b44925065d993a259fe PUB = c36edbb6254a913f08fe259e238780638f72ec0b3007264bcc60a9e81ee9298f MESSAGE = 9c8717cc86fe02480bfd9e922bd76bffee2170c4cb1b13df834ac01d45006086297f1b8a26f2ba674d33e1d162f19367feba97352b7df2e75b309d4b6f8b07cc0eb6777e81e268e02d07f2a08f8f39d5a8320bfc01fc8c9227d2cf05e12891ff4de885a1c93371a0910ba53392aff9ba2eed9a2055977ec4157bd65b34df79372f4d50edbc48924353cfa1692319d88a7a5bb726254c209291e9b1d2c1a6c8236398109c59ed42a0ac9e7633c520734eccfea4fea95a47a8f0a068b4275000439cc97c57871e105cc0790e9dcc9c25d5af7063ffd05c4f3780e7bca4c456d0170da709fc6cb3faa72bdcf562908ae9340aef4d0c8b91f0fbccbcf1cd898b1c716f4f1474c3aa316242abdf6368e57a247ff2fd5ce23d187f694f11e38dfbfbc3d9db20903b4ebb449b9049ee020f6e2f508e8b2b165bad7464dbdd178cbd423233765d371e7ae1c3e878cdb5b824b20cb309867c0e473c067e6744008527b6bc076d077f4867622aeed1c253dbde7c6a76c7015962fb73391698600bb318ffa7b0136ee4ccb07daaf01f40ff9c194f98681f9faef8b6f9e99f95df0080da8966a8ba7a9474c537b92df9799e2fd16f788dad7a7bcc745226e1e6371f52ebcdbd144044ddfe632dfc0a43d3a450923170ebc7ae219e50e078a511bc12ef14cd14b5309f38abd65db2b2a7af2243b229c9fd2e SIG = b7389ee78dd9763f9d2892912edcbe3e8a236b8bdc25f44b9cfdc8c47cd58168ab56eb0402a5bd752ac8f4978d2ea2b65d2fa85265966b9f57227ef4a59ae009 SEED = afcecea92439e44a43ed61b673043dcbc4e360f2f30cd07896cda20cb988d4e3 PUB = d231f69235a2e3a1dd5f6c2a9aaf20c03454b9a29f4e3a29ab94689d0d723e50 MESSAGE = 0b05f89ebb3397947687afbef0ede87cf3810676277037521d952a3bbbbdc8565988a095d8d4f6f59be572d3d821dd789977ef77a2fd7110ceeed9f3756ed8e188267b97a30ef8957c78aea3a2963deca61860545e0c40824881ebb1db10f607e10ddbddce400ea236ba4745aa99a05641976766789ed0da7db55fdab459ebd4b441a6282f7cfd5a20ea06effa335955e5fd29181671bc92c00052f7f75c39277c9a43b787ac9fb1516e996232a509774d1dc21d8c0513f7844b0a5b5f18957581f99044a14223ccda8a284de12fd424265fe57b270215f8fa9ff2bea517934e4800a47d346fb6c361cfbabeffabd9c4164f45156e245c977edb473642c3940be5ad6fd1a7119a7b18e98d6dc843e0d254c93d0146d18e5c62ede1490f89a605eb454f974778cfae20932e95477bd03bcdb97d5bcb76335942e92ee668f231e69c570ac5446d0f774066737fdf49f10ceb1b52d6d8a4639846a3373a7c6f3b4b3159fe2e7af7eee2f0df172d94d255d017651da3009005e5eac3176c09389ee40d70383bd37117eca083598a1801f592d057186e568e247c252be4b14f723ab7ddb97ae9768c2682fd63acc300779fe04e2b88874751346c9e0f97a2a216772ff9625c33bd7e29fed8003a08dbd33b5d17899c943c25e95ad754fb632e047c112af7f7ceba72362e1a3ddd2935aaf7f818a27c SIG = a65545cf3df456b28d83a6d94c036a19d0d29fb065edc27e5e93a1f40279897e1c6f25959a725ababc87cf2ae727f3467b79570e902711917191d9cb0d2d660c SEED = b834c6e0facbff580dd3b23753959a4c2154c219521b3d27035d071f6599bd02 PUB = d1c384715e3b3d02c13e090605534c7db740da2aa560f53200a3ced8beae8cf8 MESSAGE = 6cf147b1605528a36be75716a14b420bcf067c03f1cfe9c4402f14987fbfc9d3ecc3ccf4f8d2d03a55900b8dc79af3b6e77436f69b1417ad4b68fd44e5e333ed90ea7943fbd1122609ec8ff6bb25e42e9914f5920fc72c4d013b6a9685c996fbd8352aafb184c22d9e47871a5280e4ab7dd6a5cfd10a5994a200f670e0b622a9394d4793d0a420e7d8806cb127c7ac690d45a2e94166cea672bcd982b0e9baad56312d2570ddde7e0b9e7f47136f0481d00f66a2aaca4d1b09d7ce6c5a98a76b68cd97d5793968d667073f8217f9054735340f9b149c0dce845b099e88d0709680f0f77603ff0a2331c558fc36d5f24da9a62d69af5190d21b5c857a1e08f014c6d456468665a7f845c66f9111f9c098c68940efcd87b657070cb9164bc9743aceb7439a0d01c0062a11af2e11349397f5d152872b13c5ab32f51cc58f1475ec82ac671561dcbd343cfb3c5f78d0fc73053c6004b0a4ca3f2043ff4b0c54275c4fcb9cadc6baabe57b1d5acd531e972ef9335136cd1d65512ba1f5b6ccc4b66b4250aafa2967dd4211a2742e0f177d8f4063899f61815cbe6d8fbfcdf74812bd40cc10084e46a99ac128058eaf16a49a24b6ae228ecf0109c52dfc06e37d6a333bcb24aba312164c6c0290485d251280538ce9541c0916640e36d6929dcd9588eb99577f5f6d82bcbb198826267e49f5daff2c0d SIG = 0f19b7066d5792328a9800d9d4f8f67d5b089b541226a167dacd439fa485b0025a5dc7f2c7e23fc4a5c6869e7619d356399700c93650e89cd25b90fb9925e304 SEED = 2269a5d8f7ac2cd9048f5f49e349e5c435a159b319fe3b30bfac8d0d505943f4 PUB = 1c817943dc39c24b01da38a487b175482460c609e4726349a9aa7aea9bc0fb34 MESSAGE = 7153d4d9e641aa61920db0ff4bd537a6d6130a396554cc94537698f9cad16b99eebefa5f2776f2feaff6bd9a6904120c67e0883f6b96bbbb195e95aec753b699bab3d03944c13c72fc84e3f2cbf6296f645549111c93fae1a759bfcd16fc09e60bb9785535ad27da244ef2f857f2de99a6e92188890e452c7f5b9e3a4b968e11743b6fc7faf1275e5360a5468941797894d770fa7da364a337302239fe83ae0b0d084aa12acdc63462524e0eb10fefe81ba96f71f275f3449a3f8db21d58749a38853d39b0ad8e69891bd204dfca8f6c239dc9a0ac27f54db4238d4706df11d607369dc7f704da1d39f2e82af8c283d220c12431f56d803069b4acb77081c031ae3319fc77fca7845097fd727ad0d080895bba23e873d2def8cdc216c3eed61b08761bb9ebce0282cf502aaf6ce7e8c058637958c3ea1b72fe6e8df8d37ac055db6992587fabbdc467f52475644f918863af620492f34680f2056cbcab75e2323626c094759c0e0e99ef19759527250646ad760120ba386699d53934f956b8bbc7395bb496ceb2dd223c7b501b92d36a95f8f0a02eb5ba4dddf166b9b95b4a59e72a30c63cf21e6085751923d54b30281e52a09618e6f023ba0a21675e7f989b8991588c96c2b56a78f5d2945a7baeb6a0c1bbd5d95af3ee830f5809c794a15ab4b5f89dd2be2dfdcd8fe0520fda2b3f02a1ac0155 SIG = be0fb3308a076a61a4a92a97f6ac55327190e1341d6dd410d86b41bdaf2d3374093ef720bdb77feb7014e0f77d3b809623c7ca53e2ae4b097113e96db77a2d08 SEED = e965b3f257356685c98b42b964a253fc495399cc94b099c2445fc81c759c68e5 PUB = 689f5410c8e0f4d37bc07c85d7cce6c9b63601f9bdafecaa448a5eed64afc8c6 MESSAGE = 6f20a9ad27e30dac76b30d4c19a5bd6dfd6d049213f4becdd963d72b8b2dad687b003808201d50f7dd6e599ef58ceb6068c545ed99b9e763f9b0ec1db5fcbd7d490a121ecec6bba1eb5edbd6de85364707c55e300c8b16bb2530f70898136689c988591d5391d9cc347d7931061a9b7696e2c9f35bc0d304a81c2cf954d9c3a88a22e1d67bbe0a85308477f62918c25db504e4762f0e3b4246007908ac701779006b77d72510edc69e17d0f6394c77e5551875a446f81233415d0a91a0460b51c413d644e850f8557281c46699e53b22a7c73b068ea38652cff3b0a7b8ba30971eab18fdbbd8739ee1ee0cd5cbfb7d5d41757b6331271fb7809751e203513c9970f66d91bc0ce062f4fcb28be0a699867b79594c6458a0d307acac91f413c4615877dc53e1b018da5cfce1b63f40be1e55274c4374cdfc21524499a683a231adef779d1921440e5d3fdbd5033dc983cfc931abe638c35d5a95869e9fe3d93eb90bd1861f855ce1f608b7bcad6b5e1bd97edc95ed5ddcbcb715d919f5ff77df2da438f7a3a98286dbd5b6e043fc7372f69704f09d865530f4f0edd3300f185b6d73d8716d32d32b1c9ac2ddf4f902d3f216d35a33f368095ded10be94bb53d6f256560fac2f4af0edf5c5c702143777126e7de32d07493932662129ba0e7fc7cfb36fd2ca531646e8cd2211854fc510af3b1e8cafde7a SIG = 8d2bc4e1cd256aad8a151dec010dc93a5e5cca58298dec49cbc9c4717b5cfb5460d430be726b0f302cbd926beea19aa3c93aeb452a44f6007af49adf2f05bb04 SEED = bc3b1e0bf8d69ea5b4cbbf10bb33fc955adcbe13fc20af8a10872ce9df39d6bd PUB = accd2628155919bbc7f9d86f91dafec35c711a78c79ad360eddb88fa8a180b2d MESSAGE = 4c73e04abe0819de1f84d70541eb1bb61c4f42920e1f2d1d9e6281a8a2e8b3eb45537d83969027f99ef0ea27ca085b13f9db480f00c02f3fd7429dd567708953bbf3b9e8e2c6ac4d321ff8f9e4a3154723085a54e9c9573cc7350c09f8973f948b08730373597a5fd0349821ae0a3cd6c84992b189128f3490987e1e9ad4f6574ca538fdfd83284c1eb0953f24c08f74932d4364dbbef922542440dae80424a92eaef27c1889bd08c44f9df03a3af30dffb48fae445e625f4d9265cf387a1da35fe4c231504535db72ea81a186805f856ebe6a6a65241432530fe6c960c5f9be6c22957060304e9dd8efbc1e482e7ddbd8af03bf2382899c986d916611e4f27ae52f817ef01b6a141fe4f685d94dc8cd52830043934587704c1e642e8fe56be6d6b85bf4a6feb2b6858f1f007f99d39ea04c9fe5fa7ef1b91f495ed0e7fa4213dd68cea42b6729f95031907e27c44098094386fabfb04ab9b4de3d6861de462312c59b27c76f7b6a4fc71ea0d5daf6b7320521a67e5cb37504976ad73dae2d649feb75e2eadd3401a7f2f36e16dfbfbdb2af5716cba1bce20cd47ce1c1d7be00697001fbbeb4915aa6e5393b5ab20e0f31f5119149a2cb4c4d452c8156113ac7824f84f09aeb81202e8dd3dac0aa89399b5a38b1e218301960a37d52632eeaefe3687455464288eb17d9e19a3a72ed9de32c17be79a3b9 SIG = 6ef7f0e91f2cc6715f8e5a98574b4400c261a643e0545ff26747f8e1739899d76640b6451c43c1d03a4775b54fcf9bce18ed3fccad338b7764024fdfa2de8201 SEED = 10718fa6e2d7f6ed38fd66cb6dbfa087e8f1e8a8a24fab58d79d7954b8720c3e PUB = 870d4f666d06fda9f9511b58602eec050d754ea6d8e79cdd19f601c477df1aa0 MESSAGE = 41259b6eef13d6ffe33cdde799b995c40be782cf978440b66be51c440582abd42f526696bb3cb92265b1ed0e4bba764cae2839830a252635dc80ce5f73d521b3d6ff03ac30e198ad20567e75a34fa825ebf9841508da84cd674236ca7b43de3564c94ab079408fd94137ce3f90a5dd5d3ac39a05ec86715a8f025e4539a7640ab88836f4efbabd5e1652c49ea21613acfe343a880ee5a42f2f9134ef4e3716b16d134a9c4c71c39b3c1a857d3c89439783eef1edd71bf4492d05fd18673a5242ff4187b9de47ad4968da49dba5a6092e95ea27ddfc7448dcf5972d9d228d63e5291ba6e6fbd07e3241f9366ca4976bb04b22d01f0dbae794fa9c1d9029f88a83602b0e0ec55e22c37b201125cadb5341ef73f6da1abbe2b1c475f0750345b1be4259d8c28531ffe7788667c410dac339918c869b00ab80f20bf7990d366f9b3d5e8eb2f48d7ed0e64b85dc9fe3bb998b1eecd1231e902d2d152e09da2d2592bdb32c8cd2e2c489496b2980c03dbb09ec7f8a4ea2c7020f2a0faa657cd6ced48d6da27864cf5e97eea9b3c2f0f34abf8d87bd2adeb60c7272fc4306d955bdc8023d7d3dc2f3dafe9ebe8a8d138965a7f6ce93517cd2099663f67c34552176ddb595ac6ea5609febcf24c7d69d412709e578670a21ac8afccb8bf2b18ff3af7de21dc71d50d60d37b6ed729db04beff7d34b2920d87551ce15 SIG = e1659186f1f76fe43ac8a11703360fbeff53b5e57b5974aaa08e2575579c27084cf6802e7c206347314475b603197494e7d61fe4b1ee7b78e18d94469352df0c SEED = c1d4724c6cb1bc6723b2b43034278b3c5b48fed7f8a3cc2318033e7552047351 PUB = c27e392e7c3664b9061ea76d2575dd7c41eaf1da3a65f3a986e0a57f6c40c17e MESSAGE = deee99d7a77d4300c17aec1ab323c571c6e9e73a43491a3c7888b76fc03ec43d07af42a05a2aa322d00c8560acef314106b10b9bd12654357ffa26f2390050da63d668c9e2df548f87639e096a35853f82e761fd711d2a265438f5d4db5e32775708150da6cb686a2b4ca211d7f00dc0abcb2ca150e791116a10a5efcff3514dab8ed80a7092c3a015152cb25d9f86ec0d1ca67ddab44d64eeb1f931bfab2ab188956c743db4814808c5cde1b0745b3edd340eb03ffcc80a78f3db310f4f5c20009fc0279c2c1bcb3cedf990bd0e20c6f9fb7515ad6e933b07e99da6ac32b97141187ef63bdb1062e37220a4dcd419d6244cdcc34ea41d0bcbc3138b1d54aefc0190e30b187db073aa7d6cfe04bd3fd2ac00313e3ddd64a181935ca4b8b2a85d36bc27d97b7626767b93ee38def8b6b2c8da9b00263614342faa9d3e738d2713c45ffbeef8c84bcdbc8da4309c8445530f5c617dc866251f548950a14f075aa3117f96e41f899dbe7340b1d90a1352d3b8fb41b79f16a82bc2e4a193b8a7232400996b73b1fc00b2ec1c667577f82824d39fb7f6e7692dcd97b1d8ce94083ca197e9a5d40fadff0b9ac57e9de761c156e6d31d52c332d513e9f58697dcbdd80a5e42c551702c3de7beccc3db845b1a04c8cbd41695ea7428abba89e0dce3e3d9e70230ae9147c2b88559dc695d6809a51ccbc1dd9e089c585f SIG = d37a6ec82ed45ca9b4855de9cb942564e883ff70a79b8e712d5f604ec8974de5363ac849cbab28e7aeeff28ed3f2d14b608b3146c2efe0735ad815c7d75a1a01 SEED = 37c070d4a53b13be760635110d1bd4f01920225afabec576faaec910f2926d1a PUB = 0aa85f2ab1dff895d1fad0c119f2bf57126aab601c528d37698e97702d35f525 MESSAGE = 10c646447f81ad94d015d86d0d98b2452dca60a47ab35264035e33a0942b954e3e23b91d8123b8593c6af7c8d3ecd290e0e5ee36fd4e53b7be633a6cf027a5ac3f0f679eb1bdd210a38ea6e48b0558e303010af474e7f6df2a4e457699fc38e36938b05ffcaa1b694e32f3d1b2cc5d00cf256f12184c873e519089ec1df15b0dc76e7bfe90780df58136fe597fce894ca563e08efa0f2d4d208bede9a874882873d251baf019fe46d1d6504b3bcd243b795351f34d2e7606aa975528ee50d59efb6ee6992a89b2426956c2ca4247e0df0129852983e9767a8eed1bc7335ffca8d0289f04807f67ca7da971f58db8b9bc9fdbe4f83cfe9a00f1ca584798bc71d851ff7cd6c51b8990aaba4d38b416b92240dfb70ee3c12b5e731057762ef90823fbf683ca06d05c20d3ae2b97a83ebe70ae17afff9d16609d546d8d3c74bc281884894f3d49e083f10ae7c11c1dca0effefcfa6e0f1535081fac3a2819fd2e3265527182ae9d391b232bb7542e68455cd267760db652d19e22fb2ed11cd1305ba8d98c1ebf2d1969b24d64f3e319af74e092006d2a3ff744872a20ebf18d17748ab7110805096ea136bce2f968b205e650b803c531d06775ae5ceea28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32 SIG = 9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e SEED = 1126496a582ce58d3d618dd8a3933547aa7a8a30fb54063b8dfdd31671c6c73d PUB = e10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22 MESSAGE = 6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c SIG = b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f SEED = 9c167aff3b1b788f133d422de8ca9a64316409f9e35bfe22032ec417ae9abc6d PUB = efb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019 MESSAGE = 68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9 SIG = c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e SEED = e9948805eb341b2867479c668fd3532c309941c0ad4cb2e54231756e6a1bdecb PUB = 5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1 MESSAGE = 91cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946 SIG = d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f078003 SEED = b01753efa73bb3de7aa778be7afcbff66a5d3e2c2f8b5aa2b048844050996965 PUB = d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158 MESSAGE = 684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519 SIG = 16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e SEED = 4f4b20d899366f2f23ee628f229b236cf80f43ba183177c97ee34829546f1742 PUB = c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357 MESSAGE = db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb SIG = 0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02 ring-0.16.9/tests/hkdf_tests.rs000064400000000000000000000112371353037436100146130ustar0000000000000000// Copyright 2015 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_results, variant_size_differences, warnings )] use ring::{digest, error, hkdf, test, test_file}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test_configure; #[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn hkdf_tests() { test::run(test_file!("hkdf_tests.txt"), |section, test_case| { assert_eq!(section, ""); let alg = { let digest_alg = test_case .consume_digest_alg("Hash") .ok_or(error::Unspecified)?; if digest_alg == &digest::SHA256 { hkdf::HKDF_SHA256 } else { // TODO: add test vectors for other algorithms panic!("unsupported algorithm: {:?}", digest_alg); } }; let secret = test_case.consume_bytes("IKM"); let salt = test_case.consume_bytes("salt"); let info = test_case.consume_bytes("info"); let _ = test_case.consume_bytes("PRK"); let expected_out = test_case.consume_bytes("OKM"); let salt = hkdf::Salt::new(alg, &salt); // TODO: test multi-part info, especially with empty parts. let My(out) = salt .extract(&secret) .expand(&[&info], My(expected_out.len())) .unwrap() .into(); assert_eq!(out, expected_out); Ok(()) }); } #[test] fn hkdf_output_len_tests() { for &alg in &[hkdf::HKDF_SHA256, hkdf::HKDF_SHA384, hkdf::HKDF_SHA512] { const MAX_BLOCKS: usize = 255; let salt = hkdf::Salt::new(alg, &[]); let prk = salt.extract(&[]); // TODO: enforce minimum length. { // Test zero length. let okm = prk.expand(&[b"info"], My(0)).unwrap(); let result: My> = okm.into(); assert_eq!(&result.0, &[]); } let max_out_len = MAX_BLOCKS * alg.hmac_algorithm().digest_algorithm().output_len; { // Test maximum length output succeeds. let okm = prk.expand(&[b"info"], My(max_out_len)).unwrap(); let result: My> = okm.into(); assert_eq!(result.0.len(), max_out_len); } { // Test too-large output fails. assert!(prk.expand(&[b"info"], My(max_out_len + 1)).is_err()); } { // Test length mismatch (smaller). let okm = prk.expand(&[b"info"], My(2)).unwrap(); let mut buf = [0u8; 1]; assert_eq!(okm.fill(&mut buf), Err(error::Unspecified)); } { // Test length mismatch (larger). let okm = prk.expand(&[b"info"], My(2)).unwrap(); let mut buf = [0u8; 3]; assert_eq!(okm.fill(&mut buf), Err(error::Unspecified)); } { // Control for above two tests. let okm = prk.expand(&[b"info"], My(2)).unwrap(); let mut buf = [0u8; 2]; assert_eq!(okm.fill(&mut buf), Ok(())); } } } /// Generic newtype wrapper that lets us implement traits for externally-defined /// types. #[derive(Debug, PartialEq)] struct My(T); impl hkdf::KeyType for My { fn len(&self) -> usize { self.0 } } impl From>> for My> { fn from(okm: hkdf::Okm>) -> Self { let mut r = vec![0u8; okm.len().0]; okm.fill(&mut r).unwrap(); My(r) } } ring-0.16.9/tests/hkdf_tests.txt000064400000000000000000000042111352416253600150020ustar0000000000000000# Test Cases from RFC 5869. Note that the parameter L is implied by the length # of |OKM| and so it was omitted. # A.1. Test Case 1 = Basic test case with SHA-256 Hash = SHA256 IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b salt = 000102030405060708090a0b0c info = f0f1f2f3f4f5f6f7f8f9 PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 OKM = 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 # A.2. Test Case 2 = Test with SHA-256 and longer inputs/outputs Hash = SHA256 IKM = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f salt = 606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf info = b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff PRK = 06a6b88c5853361a06104c9ceb35b45cef760014904671014a193f40c15fc244 OKM = b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87 # A.3. Test Case 3 = Test with SHA-256 and zero-length salt/info Hash = SHA256 IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b salt = "" info = "" PRK = 19ef24a32c717b167f33a91d6f648bdf96596776afdb6377ac434c1c293ccb04 OKM = 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 # Variants of the above tests. # Variant of A.1. with zero-length output Hash = SHA256 IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b salt = 000102030405060708090a0b0c info = f0f1f2f3f4f5f6f7f8f9 PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 OKM = "" # Variant of A.1. with hash-length output Hash = SHA256 IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b salt = 000102030405060708090a0b0c info = f0f1f2f3f4f5f6f7f8f9 PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 OKM = 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf ring-0.16.9/tests/hmac_tests.rs000064400000000000000000000074461352416253600146200ustar0000000000000000// Copyright 2015-2016 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use ring::{digest, error, hmac, test, test_file}; #[test] fn hmac_tests() { test::run(test_file!("hmac_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_alg = test_case.consume_digest_alg("HMAC"); let key_value = test_case.consume_bytes("Key"); let mut input = test_case.consume_bytes("Input"); let output = test_case.consume_bytes("Output"); let algorithm = { let digest_alg = match digest_alg { Some(digest_alg) => digest_alg, None => { return Ok(()); } // Unsupported digest algorithm }; if digest_alg == &digest::SHA1_FOR_LEGACY_USE_ONLY { hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY } else if digest_alg == &digest::SHA256 { hmac::HMAC_SHA256 } else if digest_alg == &digest::SHA384 { hmac::HMAC_SHA384 } else if digest_alg == &digest::SHA512 { hmac::HMAC_SHA512 } else { unreachable!() } }; hmac_test_case_inner(algorithm, &key_value[..], &input[..], &output[..], true)?; // Tamper with the input and check that verification fails. if input.is_empty() { input.push(0); } else { input[0] ^= 1; } hmac_test_case_inner(algorithm, &key_value[..], &input[..], &output[..], false) }); } fn hmac_test_case_inner( algorithm: hmac::Algorithm, key_value: &[u8], input: &[u8], output: &[u8], is_ok: bool, ) -> Result<(), error::Unspecified> { let key = hmac::Key::new(algorithm, key_value); // One-shot API. { let signature = hmac::sign(&key, input); assert_eq!(is_ok, signature.as_ref() == output); assert_eq!(is_ok, hmac::verify(&key, input, output).is_ok()); } // Multi-part API, one single part. { let mut s_ctx = hmac::Context::with_key(&key); s_ctx.update(input); let signature = s_ctx.sign(); assert_eq!(is_ok, signature.as_ref() == output); } // Multi-part API, byte by byte. { let mut ctx = hmac::Context::with_key(&key); for b in input { ctx.update(&[*b]); } let signature = ctx.sign(); assert_eq!(is_ok, signature.as_ref() == output); } Ok(()) } #[test] fn hmac_debug() { let key = hmac::Key::new(hmac::HMAC_SHA256, &[0; 32]); assert_eq!("Key { algorithm: SHA256 }", format!("{:?}", &key)); let ctx = hmac::Context::with_key(&key); assert_eq!("Context { algorithm: SHA256 }", format!("{:?}", &ctx)); } ring-0.16.9/tests/hmac_tests.txt000064400000000000000000000125671352416253600150130ustar0000000000000000# HMAC tests from NIST test data HMAC = SHA1 Input = "Sample message for keylen=blocklen" Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F Output = 5FD596EE78D5553C8FF4E72D266DFD192366DA29 HMAC = SHA1 Input = "Sample message for keylen Ok(()), "Err" => Err(error::Unspecified), _ => panic!("Unsupported value of \"Verify\""), }; { let mut out = vec![0u8; dk.len()]; pbkdf2::derive(algorithm, iterations, &salt, &secret, &mut out); assert_eq!(dk == out, verify_expected_result.is_ok() || dk.is_empty()); } assert_eq!( pbkdf2::verify(algorithm, iterations, &salt, &secret, &dk), verify_expected_result ); Ok(()) }); } ring-0.16.9/tests/pbkdf2_tests.txt000064400000000000000000001552071352416253600152520ustar0000000000000000# The|dkLen| parameter is given implicitly as the length of |DK|. # PBKDF2 HMAC-SHA256 Test Vectors from # https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors Hash = SHA256 P = "password" S = "salt" c = 1 DK = 120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b Verify = OK Hash = SHA256 P = "password" S = "salt" c = 2 DK = ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43 Verify = OK Hash = SHA256 P = "password" S = "salt" c = 4096 DK = c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a Verify = OK # Skipped because of the large number of iterations and the amount of time # it would add to the test suite. # Hash = SHA256 # P = "password" # S = "salt" # c = 16777216 # DK = cf81c66fe8cfc04d1f31ecb65dab4089f7f179e89b3b0bcb17ad10e3ac6eba46 # Verify = OK Hash = SHA256 P = "passwordPASSWORDpassword" S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" c = 4096 DK = 348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9 Verify = OK # P is "pass\0word" S is "sa\0lt" Hash = SHA256 P = 7061737300776f7264 S = 7361006c74 c = 4096 DK = 89b69d0516f829893c696226650a8687 Verify = OK # PBKDF2 HMAC-SHA512 Test Vectors from # https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors Hash = SHA512 P = "password" S = "salt" c = 1 DK = 867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce Verify = OK Hash = SHA512 P = "password" S = "salt" c = 2 DK = e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e Verify = OK Hash = SHA512 P = "password" S = "salt" c = 4096 DK = d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5 Verify = OK Hash = SHA512 P = "passwordPASSWORDpassword" S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" c = 4096 DK = 8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8 Verify = OK # PBKDF2 test vectors from Ruby OpenSSL # # Ruby code used to generate each test vector given in comments (be sure to # `require "openssl"`) # Example with 1 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("1byteboundarytest", "salt", 8, 1, digest).unpack("H*") Hash = SHA256 P = "1byteboundarytest" S = "salt" c = 8 DK = 68 Verify = OK # Same as the previous test case, but with a bit flipped. Hash = SHA256 P = "1byteboundarytest" S = "salt" c = 8 DK = 69 Verify = Err # Example with 31 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("31byteboundarytest", "salt", 8, 31, digest).unpack("H*") Hash = SHA256 P = "31byteboundarytest" S = "salt" c = 8 DK = cb84e165acfa5bfab1b5aa8c78d62e86deb608b983a102cb843c7ecad886e9 Verify = OK # Same as the previous test case, bit with a bit flipped in the first byte. Hash = SHA256 P = "31byteboundarytest" S = "salt" c = 8 DK = cc84e165acfa5bfab1b5aa8c78d62e86deb608b983a102cb843c7ecad886e9 Verify = Err # Example with 32 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("32byteboundarytest", "salt", 8, 32, digest).unpack("H*") Hash = SHA256 P = "32byteboundarytest" S = "salt" c = 8 DK = 2e0a6832b70598815e6d1350a1705291bc58fc9a66e08a9fb2d89e0b2db26285 Verify = OK # Same as the previous test case, but with a bit flipped in the middle. Hash = SHA256 P = "32byteboundarytest" S = "salt" c = 8 DK = 2e0a6832b70598815e6d1350a1715291bc58fc9a66e08a9fb2d89e0b2db26285 Verify = Err # Example with 33 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("33byteboundarytest", "salt", 8, 33, digest).unpack("H*") Hash = SHA256 P = "33byteboundarytest" S = "salt" c = 8 DK = b7c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdeb Verify = OK # Same as the previous test case, but with the first bit flipped. Hash = SHA256 P = "33byteboundarytest" S = "salt" c = 8 DK = 37c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdeb Verify = Err # Same as previous test case, but last bit is flipped. Hash = SHA256 P = "33byteboundarytest" S = "salt" c = 8 DK = b7c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdea Verify = Err # Example with 63 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("63byteboundarytest", "salt", 8, 63, digest).unpack("H*") Hash = SHA256 P = "63byteboundarytest" S = "salt" c = 8 DK = d10fa19eefabe3b543e90394934173547747a1d38e9d5d8f62bf1f49c9e5d306bc8a4e483b855fb6d7c6a2f2f2dcb5d25340ce87b82661f1185c24313723be Verify = OK # Example with 64 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("64byteboundarytest", "salt", 8, 64, digest).unpack("H*") Hash = SHA256 P = "64byteboundarytest" S = "salt" c = 8 DK = 76d44b557a1e3062fff1c9035e30e0d3352a21fa9bb0bef446e792a75a6211fe7943e156ea32b2bbba68298792e710971e754e1e9e443f167194c957cdcaa95e Verify = OK # Example with 65 byte output # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("65byteboundarytest", "salt", 8, 65, digest).unpack("H*") Hash = SHA256 P = "65byteboundarytest" S = "salt" c = 8 DK = 28f8f2177c828fb447b439548603d9b3b3a455bbd339d6186772b9e7b1dfec5be27bfb5713c51181720bed046bb2d162003edb2c4f5c54722d0f68c8d597b7fa52 Verify = OK # Same as the previous test case, but the last bit in the middle block was # flipped. Hash = SHA256 P = "65byteboundarytest" S = "salt" c = 8 DK = 28f8f2177c828fb447b439548603d9b3b3a455bbd339d6186772b9e7b1dfec5be27bfb5713c51181720bed046bb2d162003edb2c4f5c54722d0f68c8d597b7fb52 Verify = Err # Example with 255 SHA-256 blocks # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("255blockboundarytest", "salt", 8, 32 * 255, digest).unpack("H*") Hash = SHA256 P = "255blockboundarytest" S = "salt" c = 8 DK = 092c7b59d56a3ccc3d02dc145e8500648f4eb6e6ed6b5c78841fefc8f873e580e4e07ab1895f1cbef00cc2d0e52242bd02a2e35a2b243fafa988bf0d4b394c4d257c6b6dadad614d060840c57875dc553b152ff8ff66cfebb3f8d18429522dcc887e2aee80ca9cdfa8b1d775b39f46356bde051c5085d069b5a62fe334fe8c4f2a7605bc4a7e307ccf94069a874a4c0b898e381c69494b2b950fb819cbb7b1f4ea07c33e70e5e4b9d0bca28f6f45a63cedf9cf9db01e969dcdc70af0bc79e18d70f19bbc53d9590c6f5288063f165f32afa92c5548760117d9207528a2b1cd272439e36267302203d58b70c3cf292c8753c02104d2cf0074ca863dc39c5cc3822bee5b2d7dab6d3fe1bf90b43e955ccf3d7775bcbd3a40d60d474a11713ad4bb748e49b0831f13a565f3704f662187db408e7902448c3532956a7bf0c3cd7264e1f79b55cdc42e26af92de4cf2cc876c31cbff64876e7656037a3f1b783c0be71a81e71fe5a4a8da2cdcc217d36b9157effb28b52169aab6d9f0b4b6b1e8de377a66b9af5dfb17836664b09ddc3022223654f1960309953d807b50e46a12ae2179413509ae78461d0930a58ea55ed96cf4285383368d14341dc29d2507d1af2400f8f637d0118305c5faee69a0099e901dcdfe2d28ecc4511a955b073ebf9dea593d934782fa898ffe12d2973174ba78f919e059f452e97dec18e815fb66b968d0be0541cb087f3ae312941c58ecd372d8ff3dacf80dfd327e20fafaae67aae786f2d720c3c7e08d01479142fc36446b52f1ec02043497eb43389ed200b104f0488f10518ece2e041ec54f272e63fa02cd823e011611853bfd2de9e57a14a38a6172bef54c50a021b6e4a426f1d771ee9d2ab185411ade2c667e9245949f0e942abf9b21e6139e8299bfd7837aa5c9a26fd3a894faf066c6c863eca04c903ad3276c47cea80439b96e20881e9b717e9fd570aa03126e4ae0474c2a0d7c22921cd20e0c602941a2a15108f9324d782ecc3d62409653ab9c936943907645843122417cb0210e6320d66b25e64c3f3a18d7c339d6cf3591ee95e92ca4b9e409f622a12a577d905ee1ccdbc645487a67454a357a898906a9f8a55ceabeb41b09041351ff91e41e4e0863fdbdc406d8a7acacbc743691227d4d7c50b7c0e2f4d98fff1427ede0454b025fc83c8dde62cd1842b8f15002a995b16edd9ac4073e28dfb405de0d847061ce5f154ff0c19d56485a7bcc9eb84f7f04bf13f43951bae41c011c7459de18270670c7df424341ab105cfc3b1d10df9262e23425e8d00e410a5d27f6d9f82aad2881198d098a94f05fc2eb99f72d3fcaa68c5fef8e4b0e1f284a451e5a68574dc770e69255a030ec631691cc90a0ea3ff862d84b34632838e7b3c2ff5af544d476136b9dd62b58646b9f614af9fc3d48d66088a7f63c1186d033f6afa9e01f2037aad14bd2404f79c394cd51ee751014b6905600a0ce9dcf9cc2eb816d081eda3d28afc288fcb35e51bbc1832d76d6b97b6761f75b8f908570ea23823bb7bdd8a57f8c431b7fcb7b88837b26f4d3af523ef684a3875636da46e6008737ca1a85f2569b23908736613c381b555198d7a433bee146273eede269a0443157cc1d31cfe42bb58bad9e5523e9d87a2cb5eb16a82f9b84b51b8fb0540daf3f65b4799916fbf218da9fa742d92616f55fc303d339a52c87eef57fca8468118fe195cd458c2bc43cca66724acb968e88f81a679988ae7a4478674f7003a9c3f76fa9a580fb5b976ce51544ad33aa86bd5bc722d00f84fdebab3a8e19584ef6e5865afebe22207d1bf62167923c78f1e4c9fbda21fb23a3e5956b766f2ed5775482606084b1d0fdce41deb5ba0fdae5fdeee63405e47139cb10a15593cfa037595512e15360897577cc62ce634c3976b1e8f50d276736689d39b8eca4a7871b0d16200a5b191789d4dc5ca42831238dc0833457031419174697dea92e14b9c61eba542dd07038d52782e58845bd988ce14951e2e426c43d9c29ac08e893d93c074d54b500bf7b0c1e6f1f85d0aedb8f96ec07622e919dc856313a44e212597685189fb263daac6039222ab25f46d68f995c1ba74f4b9443f55f0030418cfc39b25be3c3722039364ddb451353a8fc2128969bbdbbb36c4570692143ededb9c0c5c47374deb39a1771d24e688afebd363c381d3a0842822390dd97864c92c42f67f363026cc8116ce5e556437af472eef07e58f52a557df9278e94e505c74dcbfd85611ccf40655cba234ac92f47e8d464934a8a6b1c5a6706da8c9514cc133a938798fa474f8c8cbfbfbebd8c077f22fefaae074720fb2e85ea13dda03c083a9ce202f1c7bc532a39dee3cdb6b3692a61e4bcaad58adb79c178277d17887b7de304ad190cf94dda073a19d6c398384cdebd2d46bb38ee0dd367cb0a089c876580878f52fdc49908f210ebf2ddc0ea076636126c0e84018c9522aa5a68eafd566cc247f841742c4a53665879e3c42af53fd03eb5c525695c62de2a09360729334c04a6b3aa59d3489e1423cade10413b057801caf35756e42b85464c8d24ca3876ddff1ff9ced03968f63500f567aa6023dbe90983a5f57991c61da85c7fd0629bc7f684a6174ff39225d929437c2c9a49493dce56034c975b8220d0aae11edf3dc65658d3fd3e1e6386937d97f7c6053c849e9869fe2080619dcf65fee396ad7d42f1db3a580929ed03667f7537709a85f4dc88d911d7a59b688e4a06c8b7057c1ec9cec7acf3549e8c813a8316221f6f45c9ff1b5c8201e853a295bef0fa48923672879d7a3f3417978cb6821d525e69a05620ba3a73de121ecbfe24f0a308e3c0336f5867cb299c1c39857592b59a44cbefdf49ac22f1295562dcf7fc7dad08453af0637095224a71317d07cf1a84d78601883d87845971756814a7a4b79f382c7c5eac96c0404bcd57190e097c6cdbed81ac6a7fdfb9c15f6b1f435e64cb234154e93ecd72e84bf9ec9e5463ad135914066522f8faadc41dfa20b1e0544002138f286305f7ed28c33724ab022d5f10ecc5766ef112bf4fa883e75bb919faf23200cfed0233d914659df5f93caf0a56dafb4aa98d742f52a848a49f3bc9ad36722b21dd40d0e5a03ffa7b89a73a203984c321b26515ed117a30d70d4daa99308e19f916200dd1bf4dd45333d22fe9e95a35f681ed752255a1e26d9df1b1fce3e4fbbfc95f14400c689914c91182855aefc1ca6f89e229a8764dd22af12cebdd224fe0f8cab04afd5d59d2fe858964f7dd0fa2a7bd94a81464010885a3bbb19a0fb5572b2ceb63d21a6a9804608fa18891edf7c69ad5fdd10d2b34592454eef94dd07b337e1cfdbebd9e3603e590e77165442735a6136eaa661c0e0bf451c8c2fd4caef0445d43cf970fcb9d2e181f7db522fb4555021b24af2b7dd6dee025214b4d5802d1333b228cda450633b5a2a304cb9f46d03a2e1df4ca826488b82d5ad79fecb000fe2633adc01cd03d25beb4fff5adbb3d55769d265e9f3a10f2bc21371c17d139110c8e18058c9c3baa67e483c3548baf0ac95e9740f052c3984a855725a3d49ddadee48eaadc50dc7233debe234c8efd41217998b02034efaacdef456fd5bb560fb54b11c62ce080626509e13278bacd24894373cb90f04eb44a68f9ec58d76c64483148175af6acd0eea6cb473a6eaa5b1e106641c5913d1133bb236090065eb275aed77dea90910c84afea2dc22cd79c192ad1f53e712633a5cad5c85e8e3aad0f30508c759f1c15e7c5d20b95b32c66d32e7b19c2ddebef26725fb96694e5349aa2e679bee20f6132236fe4dfbb1da95a5f7c8512f58d040d6bec97f3385fc886db5d83b989a6d31268049117f56e316ccc23395e032a0477096ca38ad60c34ae16f4e4d329da4f04a0ec002d38084c008b9c6453a5ed70aecfb10b2924b04935be21b7cb7fb05f25530d2cecb9d11cd0eaa73a622757a7fa46d19276b519414fcaa7794f71b6fd489ada9f7b4a9f9ccf8dd4db29e4bca623f48a41d0355c6c011bc30834ff882d41bd4fb6ea232b777c49157d36b0e9a1c51e943a3cf328d45a96f21abbaab1e494ba5adceb428966ffa7ede68e1f4b6e817a9502044617192a1f1079af7800acec0921ce5a123a1b12a82bbf86a2ead639a32c2740c36b1c730196e08d8661fa4679b4e056d2c390ed2b4f22a598b86124f11d046618ac36ecdbc1e7d303a3a798d068ccbc63c9432747dc0c1b8017ae98439c2e5843c4dc3ace66ca7dfa828135533db07bb1bd93a82349966968ad0321edbb5277064baff06c4c104d1c64c75b8f36e2563fa15304178354c218ca9b2fe0b3c6c688312506d4ae714ecbe14e1f6f2115e09fbc8829193eb7599e204c0dec8f032445d94741172ca458df0bf71826fa18143f3cc78a11afe2109adb40647138e2fa6c15aa13a4ba92651210003c0656d8554439124f21367ae4a58f4f970e0da60a083e09938370ee9582a944f5481b3935a0100addf3bf7ebf6b4e91be38755ca143284ffc8aa8cde6e293603a894b6379322175e960abc0bd1684d462bcd2327b477593e515df8eb4dfc8d3d700ea965cce24b7e84b2aa2cb3b7b67f45c81e730c02fe2c151e9bd7564c58a740a15e54ab1c3e333a71aa8fb481f304db1d26e874a84314026a654ab1998671525f22fc2cef3bdc8b0a59f2c1a807e10d062993eec589d61a587911a8f66851774949a333ae8e5e98dae248f0225d4008df783cbc608e2f71fc5af609e058fd22e284e3b8e4b3bce312eac704510e8aa70d73729163b1a544f32cac58534a041c46eb41438e09d03e0dc76677fd62d49d87a0757b6d6f4bcc6f9b551be66196acb58dce7e5360baedfe53861f83c2f05240d28dd4de1882f535e1e9d6410f3eeb320bb3e55c53d5d35b6012cb20c110719aed2a53a8e8779abc6b503711657fb4a4e10c1c6ee1f4e2f13728bc2d10ef28788ac50e61e37ac628679141a56d5a7ea9b21aca604abcbb8992cb9532c87119778dbeeeeb95c812d9fc791e13272cfad80db27b20584add19243a5a26606163c047677aee6f65a83ea1f93fd6c82fb5eee717f7b6257f11e5bc441b9178c5671f59d9511b2af6974d76d85994293483cd3869ab7ea6910b12a5431a81d5dd440ba33bd5adfb29404253243916910d9ece9ff93cbdc95d4f64aad2b0f6e2addfc4dfc0639233dd969a4e25606545533c1d1ecd3ce9542d6cc8a0e77733f8f1bf1aefab3ba697c79f5f5c9e182802e83132fbe8919ebc2f93719389aafc80f750151e06b126d35ac1987c061e4d7b652fe2660c57f9912b681ac7338204cde7e6372e509c29187863a762f504923ecd073ff2ad065fe92d5a324a709e97343e18dd3aa5a9e9f2a5511628af65ba38794dbebb7a5568f71515721dd26e5a59b98ad5d725fd20043d2b856ffc21bed8406bb1a5e2cca14a35306beeb68cbabe31dad783377b00f316062bc5b26492e5f226beace8d0c1017318df728ab4b9aacb84b870fff642cc7d3502604515e1658b1df5ac93d655a6fda063529dd58cd28ea5adb91b07657470d2dee39381ad31e21e6bdaea76a95f33d8e51991a803abcf881b7a5940395bdfd4327da5a5e8ee65af23cd19ef7a3a01b8c09a1ef78d5d7194b174c44bc7ce1e5a2cbe9637b47704dcc6b1ed4cbfe9d48072bf175a2fccba68fce6e10b6190b1721382e65e6ecfb34adca72064b44badec5179bf1bca616beb43cb5d644162ffd00857f1b86c9e59a149577b0dd8abad46aabf58f0a6ec0460dbc6386467c47d29fa15caa707f333ed84e603d77429dd92f4dcdaaf4639dbc8c236dfbb6a77d275e2dd0b6f196346f014d31532716e4f304ec494bc5621c46fcc82b0616f6b305037281ad46cdf8c8d97caaf73189bfb103b753e0fb5a78f886a58f509f09d89b9d1cd407dadb9a979715ff32d21efd8fef8b72bbc3ab26d3da1db2c7069b85967a68ebc1ac534721a8b7530fdf50bb0d00a9e0682f95e0e3134bdfb64f0722dfcbaa75ced56560c15090e3960592d4d4da939fc930b91c75abef23120550e6a74442740fdf631774bec0ad3164b6d3218c998e25ae1d807a96772f9c5cd8e5de469602f4287477660b7403661b560e80a790d57eb2a03f878cf757563d9776daa2747218bfb5c988fc1af5ba000404b76540610b197334ca0edc2cb1eb5957c4eab038d2a72012d9371545e2e6d3e3a9c9edfb350c6d03768c6751a97dc7c63320853df87fb6c0996881ef897a07bfd26d43c854318e54cd83e25af3c3fd85ff5c56fab53383bbf874bfb0a90266a167168a3b8fbb96a3a044b99f17c49e99b305afb7ea4a82329d5d57569c2b062f76b056cfc3afbada04332500cd0b671dd7ef8f7a328e77ac42d174fd310bfb90c5c7ea26740d13bae76a365c1004dd7e91f5e60872ba6d2134046dab707d3d9469c5921d0ddd1104555381bf03da83cc3fea32e6badfa9d51800ca551f3a65a70c402462866eebc02f70a4896a98049329498e270da1b961c4c16ce6121449c58bb059abb018391086374ca2ef1f99d3f0f4f6d5d07eec07db704bea365be1b3a1643b17492be541217e7e53aa1473c32af939a26ba6c4720ec845fe97dc2f7401eca818227ecb87fdeac6837b3eb85222ba6b7a20453a680a7796068195f5f901333ff173da8a9b9c59ff2dd2441b0fc39bc02a3b8b09aa50f76fd1e16bf51700683cd485fc1dbefc272ab4f9a26eb124c3ef804a7cb5e5a1b412a0ff2a55aa4cb48a7edc04fde968542ca685576d0cf49eef082d5773f9c21ff5cb41e889a12e36ddb0fc648951e71aa1a7b8424e733c380eeb2419d6a441088850583029506092d8e7e0851fe79ece3562a6c3842ca326a1b8be5f60235362f2250407f526a65245f964e6f3eef0b4b11d678995a49d1119eb6222a46c8a175fd6d3566dda57df56a28dd6309302cb33b47823edf2cb48483752bec788d4185b54e803c7ed4bb23f70d3b261bd8c9e9523bdf13fd2cf3dae992ec2666bd0a53f9971db67627fc22e4057916014625c35b8016133c3ef25d17d6ad11892b0f619caff8da058ee3718afa66affa6fa0d90e8ff855ddd4b15595798e5a09d4f08e4058f397b4b7323738afbf9f171cf058e06919b298fbc8814ada64ff426cd44ca6d6fafd358ff1f38bc340e1206449da3609a39c90dab6b7f4eab8c4b979e0cb85e13f916d80eb97b5097e46bfd2ae10c872e7e70f5f09f83eea91d30a4b3ceda239e05241a1844eea6532cd3e3168ea3507ef9fc4686aa37f1e9c1362d00c6b9e89ba564dd9cae9a38e9323023e5ba07436911fd3e2d3b1d6259d433a4a1bae7d2ab716e3847162d23525355bc826c5ec7cb117d197d83d1aadf934e5dd36b3c8c52dd10514e31e8d2b2e4565e11d052a2976954915fd4bd38f729eba48ff0a57bd302e506e8e450cbef9a8ee8ca4ae53ea56320bd9ae45ec3e2fe11d2f837106c80744c3e7d523ce2eef4714e8392a412cfc1959566f515944981dea89c80a6fd3fc91b79055bb06befb2b33ac4dbb1d0a213fdecf7afbd208459ddd878bc5e5db380c1ecfec6f53d394304355f8a8f0968037f7a4d4740e12ae5c39575a9c4cad4e5f3a59413b97d83b8f32de8413cacde2895f6e5355f9dc8cbdafeaeff32c84074df35d46570adb6fcec8ce556db0393cbc770191553e240c9cc3b164e954b0db7e255b03f8bb6a35b15b7c95a3f658a6c6ac112601a06a108956d3e7a0303befeb66f637fa63c8446069cd2052947e284097e9aeab292bb806efd4c0ffad56c6c67fdb66169b5fc2b8a191089aa34d7b10ada97d7ce3138560f439330e4ed6037d8acdf22fdc3ebda14a1e97c01e7e60f26e9ae2ffbd5ba592f68ce4d9358d598c4760f40c5aa3b7340fc981e6d45802868444ef54d3803266bc865ef7b5a3e8e607a5514c04139a396b358788ac4c8b38c5e3efe759e3d7cbc43cb42c0e18857c0cd1f5f8eb07ce2ceeb9abf5030184550c309226bb4c711f4a9c1bf4ba1d12620066f3180fa3729df635ed51772829f5bb2c5b530a88917e518058877dbeceba5a26f1e1b7ec75fb863c97f5a81f0dbf41043fb9be593e1cb3036abce075236c4d72273d1c04e58cf815e42a79e9f64804a6704396182444e13bf3fed17e81c79e3623cf75fbc5d5bb394027fe45050a1dc4e034e812b5c6074b3d15c6c0504c0876464fc2d15813f0eee0f6c4a7fb7890f4737bd3da478ab329a0b3580f2121c07ae0a293535526709d16bcaf7def4294147a0062181bdfa2ea32d052bf18daa6e1a1b8207db9b78411884f09c36f0d8f6e6e91a0e5290a4b45e9163ea6f18bb84eb304c9f0cc563af46a10d714c32c096943a29da69f634b9e98ecb302f886240e3ec99cb6b47acf5e084d57da0eec5ee31daf8e9e4337d337d676769910b779f730fe5fbfd7f0bb1e7090e0f1c8592d845eb63a42ef4e69899dadbafc6213605a6d22558ab59490d94667281251ee7621662a1a45ee312d1b7ea9b3a0d4bf25bba61c510de32405a3315aaf3f2ed7e02270e90cb91e323e85dac0316c6fa259e97a1e4710b235db509c3384f89ec00247182e5d5288e4895d9e33dcf56bfd0511debb3f923a2940d1116b852fca180a0a9f6e48fa1a3f795ff88e98f18c1fe4f669a0f60daa9637817de6aa3b8d00df9901fdb9cc259cf3d2449d113aecd8e93afeb1a9af4e8b373836e5a9c9664e9245cc9ee6d00bbc78e191872b2fb112164d2e9fb852e65ada5cae0fd4ba9c177af161760337c99f4f05c58e418de35d824ad300d6409b82476aa22e8039dceda726dbd4a9a9d1fc03d009bace1c9a4769a8c5bd54a6dbf409234a3eca478f3ababc4c972c1d3604ee4635e3d41a5c92e52af2ddf7419f7bc9b10b83742c52c924f3d029238ef636dd68060a9933024dbae1a2b178d749fd139c81ca4cf6025a95d4f6a2c9f09493c68f45592f5b6d3dd741a2d2e88f860f349c4fcd7fc024ec57ca60b23f024625b12a747c432e9f583e192784fb1091fbd5e307d5586ac053d4be4c76632895bbf41e540c29fce4b6abdf337f5e1a960b386958dad96318504de3a0451f9ccd110d8f2337b33f523f2fa8d931df8502b0f0034d8daa17495b9820d3591860698d8bcc1944ca002a139e8df1cc2655e547f8e3444650b62a83bc3746cc55ca7093f3152978e64de46e2ae3b59af83c9dc91da3cc4fb805be717064297264936fca83b53ba4df14f346fb17d5c9273722ca742b7505d100c55210060156ed52eaac24cb2bc97777b9b81bf59941127e60eaca89d0ee02b8c629024dffd738f86f51375a20faf0881a9c0599cfc693f9de5a027c2192ffab49b252a21b5fe0564a71cad0d57b287463a7bcb371f4e317645468a25e168219ea6b2579a82751c18e1922d7f5c30173ed1864ca77403ee9466502889d77d7bb7956e659d7be7fc36ae59b59dedcfc7d3ed6d793655d04c33b1eb6f215f44f23e57a8266fb6d234a8beae54381e64dfdae47b070f905ace092f5c213d1d8cb2fdb2914a6071d6663bc68139bc2a1d6dbd58fd84d5568d811a146f6ed2372afaf4aca312a66bb711d69d0b771796bc4fd9e5e4765c75cd0c863e6a6f0aa2244618ed807ae53410c60fd2a663fb2534f1bc550ae0b659435aa142c5a24c448ea8d771fa0e671f446775d1d21c927b0f61ab570ac60f060c4035548819b821c592846ab8d474649adc3972b0cdcb1bee96f16943d736cd7cbde238208eb7b8a48ebd17608d1e3a75129c6d6e8be35e008305d69525dfd8b0db442f1b405c717b7d949981f8a12f358032525ef084a1c998ff9448ffded7285f6d2523aa155a72bd8eb1bde486a8e4590c0bb7c3ab3684c3c53f9a245713e6064112aa98bc6403292a2e6fbd2bf30c132e42fb1ea79593ee9ba65afbe06d2f8c81a00a6bcaaa22cfc0b7a330687b492580aa64d8c4fa7977aa11800fd1510c5c0a17e48830116a5e35e67a013d59841df849d04d86810399a50224e7f8fc2207cf30775a5fd042c62edf2ff3a3698a305d279f0c9c8b577683637b1040715a2aa3c8089e49caea999ef6ab13b562dbef326e96d710d12387661ff198802177770c7b3adca1b9264582b8ca6bb78ae496e7fa4fa6182260eb44980b3cbfa9ac1bcec8cd2a70bee4fcf7f98be0d93dfd4f0fdae41e6334b1afd8766f3bb9296c01f0d17d60c5c1efd7a926476535e856c36eb24879025cf5a3f1ccb7f8277c5c94aa30d30435d60583d00f2b8efdb1b37a3dd47c83ba2bbf9bcd755b1467825a33c75cbb7c1d52c9832b307cf6f35a9b2ff996573b6ae5bb0e52199ea9249dc4938d8b9d033952fa9eb752e2af5afc693647a1fa28d961ae2888741c6c2c36bfdf7153705464105957ca29a04287fcd28af6d41fd61f3d6b1e7b07af41fe37a066c731361b24104fd7de79b11dc848d6fddce156830e0e2d7b4a6da22f5af689bfa442870ec37e8bb6611f68ecc3453fae14eee94d9b904a6b8fad2564f2d31e88a64226f6099781a4167989d87f9bf704f1108279a0011ace8baab9518365a6de0a69675f218e428c10510187412bfd1c4aab5799eb570b140c5e417627a136358a1438e31f052e80f6da4ee5aed1ea95f2654ad87c5ca8d3550d9d4a64fc013bc1bea7c03b432b4d1976685769d0dc0c53984a0f79bc43af48cd45bc8b3ab3491a4c2c69ce81c6a276a75fc6c5925914724eac1553d684ea3ec7232fee6334ab93bcc2083bea5d136d9795b5872d00761b73bea63bac5560df5341cd825641dda95d8c04a4fd24155008e1caf7ec374e9c6a66c87e93e525f9221e9516018dc872cbe1c71725ce15f603f12a0ddf5813fd57a53a16f5d56dac91ee8fa12c5d8313bbe47d3fdfada6a9d5892744b7d9af7a70c958159f36365d11e3603195f5e3561014642c5bf035d610dc2ed8f8765585a844f82b15a509b40f97fb5d1568367bfea81b759314dd3b9751a6177a49e2bb6dc1dfc9d320ef02504fee836aa66b772d100e4b900002428c021223a6a610ac2b96cf42f1099059026ee5719b9d8cf8ee00bc836ac5e4e0e4544c61e38abf3e0b70151a82baae287c468c400124729bb9435685ef90877a803e97db88227f8fc038cb31791203f8d9392c5a26121b22bfabfb82d3ca7ade3ab3e021ad46eb3e9db01116e02c2306f573e1f02571f6c5d4003d67ae971034030ed38cc64dd8beae01bfc114c9a709667680d992b130f1b0b5843dbf72dc4916b18c0f3dc1ed2e86da6b1bb100f85737a59ed70ceeda3fb9645255566f85bc0d8eab38562d2e6765faf5cc45f8a246da218f6f0d2b966556433ff22b348695bb7e6df8ef81e2de8fbe89a0ab500accb4caea339d06b80d515604416f87906606429a162928b6433eb45a37591ce84e31fb781627c625fe0f4a042de6e1638c6b402e9a5541bdaec1954a09e518a665e4843af96b135398301890f07fa43707575d96b3f49d5f36d1de80a4e670b881b5f6000c590143d7901a45 Verify = OK # Example with 256 SHA-256 blocks # # digest = OpenSSL::Digest::SHA256.new # OpenSSL::PKCS5.pbkdf2_hmac("256blockboundarytest", "salt", 8, 32 * 256, digest).unpack("H*") Hash = SHA256 P = "256blockboundarytest" S = "salt" c = 8 DK = eb64bac8e24ae1b54266d757f0fabbc72a57f5dc5d03b8c39e65f2062939bc594d82acdd144120b322ca12fba07e113ea83b1ed2c1b33603d72c67c6ef31ddcf6a9547b5fab0655bf5a7c220a307a21491932dbbffb54f99ac997ec6bf898ff9005a88c72c7ee49126397f368f704e779dc25687af9b419b6ba8cc4e177f805f55242b627e980c0898a1ea46ba633e6c0db0a14f7fb323d26bed1a524387041f8c5f6e9edd0a4ea51e0fbae1b04b009d41049eeccbfa45702716fb57b9f4167082368a36f55e7aac656b3677595868415e9e57e7a5cafdf60eb7a8d66098f0be8f012caf9a78cf2f5c0b4d153f9fd067d781f39b9acd730b6fdc9d27f93946c0e0b184d86f7eaced5a8b734f5beab2b930789c18934296c6c86e28845607e9f6d1035c30a7ef5003b19336a56aea507e3c58360f091e70ff59c5869a9e0bd14d2dca4d0a144bcb607bdf583ef4230edaad75e4db16a8275eb74c4a4cf6163e6aa293ebd6ea10b5be8179693687c2cf9ff038ded9a5a32917bbd2c4a703b0500ee0a0373bb324b409358bbc30bedbb405875eb281e9a7dd58b89ca12a9dc8505c524a2d10cfe120250bd22b9b340a29256b58548dee0da72a16084a130fe6d734bb70811e855d20b85d85f662c9574be68238a88165c22194e4942cab792184050abb3a7e22fec3f58537af84ebfa8d858dc879115b2e71c34aad0f6591c64e11e2ff8218c6841ec9b81dd9affc3ea70cdeb09423e712251f4022fbc4d54e0c5d174e198ddd9c6c8587d0c8f3bdbec79b10d46fda6e354c0a8b3b59ba82dfa164369f3075d1ad93c69a716ba8a377c626b9f44e9591c530e72a65abddb15e3766ecd068fcfe046efb86bbc00bfc24fa50fa6ffdf1f84e6e0c0d335c00637f14414a7369f5d2288bc04f284c0730766b3f9fe8464559b61c2f3f4d6e08b1cbf578f186605601533860d5f69aad06dc993d4f0ad7142249f68e1531c60fb3791ede647dc499a6b9bdfc1efd7bc0b40b95c3caeeba615d0a9c2564151598db35a7752953a7b2a40162359b69a4cf9a591d05f38dce8968dd6b6f16f57609fde9a8af9f16ec3b8a40311aec06a5bbae97e77edf32d22772b72fd61c4bf9cf34049830270653be365cd24b46fb7894150fd9e84ae211493b4ce4a95e7d0aa1f12709ba65f7bd7d8c904a9f967ced8e30789616242f7f9054e596f610d7bed0e55c3c91546b8283d965cbc2a79d5ddc4224e1db662d97bbf35847ecca83ee9e4c23d5b30ac8e2608186930e621e8cfa316dcd02b9dc17d59bcbe7fbdfcb6ecf882ce0c122ac82dd305ee7fc08b18fd2d7f1fab397038b84f9bed0d6aff490d720764aaa32a6f5b73ec6ba2083a5fb0a9e1d97bca1038f235d7b13f1baafea051ae898a3b92dc15bc3f7fd87db77a00dbefb9601157ae806e23386f64683992de57bfa37c8e4bc72ca7894ddeb16b833619f430e7da701859608f609d93044283841154da70b62f9267e15c741d5dd0e86ef58bc3cdc4f64c8fc63b9f466cd5415dd8650f7f400cd5c53544bdfbb6fe68c239e4d8d2c07f6affd864802c495b6b4fd0f1fb968c90934f93ba25d21cd7249dc4e3ef1301746d37e67ba34a861bbfd5ae7ea9ed8d7e853855f0f7bd0314b04697980191f448d71d7aed082781b04e3c01c46cce86ee1b8807bd8cf64988370925305f59814bbcecf0e9d39a8c0daa85625ddea187d19f7e3d970b0739a56f3b5c8de17c946c5692dd0503f8b20a3fc401d6fc6990c2a42e81daa46df79727e6a5f03d5c5a616e33b077f68939df7f9ae8a09599cc3a0e0e36b23ff5df4eca1ea1c8b5223a0cf2abb96808adcdeaf68a49e767ac5f934f499b82d775e995a69cee0822d13492a3038bf78faf01d9f4d87ba1f3311c002b4e603671a2cf007352fca16c30ad307c030d70e5f9c091b2035e164dfd6b9014c9bb365a694f5198566a9d58eed322f6d71b6148c1191f9f8ed4c58c03c403fcc5a1de5ace76fa1c1a42aab81e3be73d312513f278d5de7d67e24c961d709a3bc252e11eb067ea98583543675119f21fbf264024f4d33b2f6f17e98aa06dfb409f16a8692d9c7bf0fa340b13c4826cff8b07efa5ba69defb90870b43f27b632c1b76ea7129865e18d7fc597007530852d307708b51287a85d1d6395b489156f18fcde58157f5100c7c8d595ffe37fb8c1077fa204e97a721d45be4dce7b473a5d02cc31b4346f534d52a7ae7461d12fe12fb80dd7124d95e7683d3ee6b521094c1181a4c84e0272d2e0359bf6615121838c0e7da6b344b479efe17e86b52999fc7de81852bb89e335ee54123c408d9cbca031a5b4d01cb736108f9aa1dae4775d1e970ce179c565bbde3bab82f8bd883afb25a66db21fec824db6f4a140c5008acb4cc3e518b6ca77e446cdc82b4d4d6792a9e1c8fe151e84d531d8e2d1c751967f9b3ea7a2387fe53711fc48ee7524f487a3c1af2590be648f6965869a97b88729ccc6578c3aeab055f16998c1750ee8c9358875ef48c37400d4adca39ed81a0bec5e43f4a5819dca470dc86bcbcd932c8bb4017880b3934844bb76c04e4a65285fda9fc0e4e4622b3b13f1ffbad3754fdff8a3705ad370ad089e590cc8b57c2e5618041042e808dfa003bb19d229cd60a849f345f9bf85f53496b1498caada27565312b909afef165d40d82bbe3405a404ded080ece28834129c2b199a4301d6c4ee6f0502afe3dbb3d7be80da9e6b5cb2188fbb73605b31ed4e6846e75d875ab586d995cb6e20b41765e86ece82db4ce6fc1c3e63fa9bb2d2a273e217a0235e97c7750c5a543757de8759009e243d847f79a1aaba097d540573c2fe0d9fe611fe1d30484b5ae60834206b9fb7ed8fe86813f661eeb01bb608965fd6f91501210cbd17ebe1c1f5965bde456c74b96faa771bcf293a544f862689f2972444b7ae83f536c86ff21b8d8abfe8f3274fcd5d86b3f189546f927cc92196722d2e3cf4a1cd54352ecaa4466b801217200b8b981398e08209f3d597dd4726eb8f3360e757613bfded0b02853cee281b45791d3ae996bbefca334cc35f3d0dfc6f53a3defffbbc4f620e65e916171c0511678ecc512f48a230548aa88dc3886ee91a9d6d6df6d3912fd64dfc80ecc5fa1ebd9a715ad846e0bbe41b09bd33f50fcacb1984ed5610ff1c898d9cb9e948929f3f9d26b8d48ce0014a5f7840d7e85a0f61ed764587e382cb9bb23e5476dd7904e062c66fdc62f26212f66b1f8f9fcf061a2de063a6e510680d7689c05740cb62ac66b97f4060a491aeca2f485d1c1575d85f495bec1619acd001547b05d2e55c661019f67fe2525730e535a235b4e5d1126a66f27c4a9ed3bdba43b94b4bca662731613629dfa088f615cfd4eac538cbe8f137653a9e47a0a6f4c86937f0bcc4a287319f5bd81bb3e187ec84b248005383a955540216385a8efcaa6ea1ad487a01405a636b76c09bd76157a4358fe5326735e0d68c53792d37b26d894e5149d9afd4fe8a18aff58c94d37659cfd1fda6af60cf8dca192bab99336638a4e82ee2e1559571b22bcceb3b2c83e105c526f36abe6deb90d0aa1e8828778e98da0b3e1b24a2ab43851edc6ac887ed3878b764a5da26aafb6269ed3dce51595823ee6d7a4242498159d50417a26a2915492e265a14e9bd3a339f9aaf064da98d8888cd13cd7d13dc18a1431d3ff973c46ef0d487ab619d3cbe5d4acdc658aaea89c02a8255bbc1a824e0df48f2775355be55419edac6c9edce3eed5c2025b8734d0602583b14a573b7236f21dd8dbafa6104b2c49bd2c7179e9e934bd2ecb52b55df6e54aff822b594c8f73dfadcce73727ffc68a4512a3be2f4e28557a6e8262192dc4f83971d4a366c4476d4415b33c6448d6261e69f7563eb1e0d30490f1ef6ae44321fbb291ab2eb8a120094231ef14a4c9caf84cceda7b8f8d3488010e566b8a526fd5ddad414e9f2f14c94a4fb48e4abbf4ea866a48054ab49440fb4d83ca1312f9a3eb82580c1842e8b497e9303bd4b0bce65c63977f3d8dca4b6d55c3b7d67cb4e28f37b469523d3fc1640dead462618806062a703127fdad1fde5e5f5d364c12ada00e306e9592b7f54f9c0e69a32985403f2ee4d33cc37c8709ae05e02f36bcf8d2b92c89a5b29c70fabec2c840dbd5f5adb63434a059c847b163bd79827d1f9af7b47f89f845f31a5d5a6a2f8eca15fb9874d5b6e14d91832d4004cdd59a26c75767d482f565126fb710347930360df8febc3e3566aff94c795d8e7d22e99eb0f8b9696d88ad95b53b74df9b181c5d35103dde3de068141c7d0fa89da6d92cb90012ab815efd7c8481be262987c4dc8db2bb851813988f1ad197f8e5e2c4222c1f0ba0220c5ca2b9abb21ecc4dd0dc21341870f3bcc5597dd6ecb7a7a003434d5cb8f97ebf2c026176e5b3fd14b4eee95c036062a92d19220a341fe0dd73facee271e474d2e43354a03a97ee2096da987e52023f573a703bfef64935e2f5ee5cb692cba060436fe703e0af1abfb19cd85ed8571b051696ff9698368fbcc7695407a479e859b8857520a17f702b45e88440d385ff7dbebfae69e2223e068c87c584041fa7896e864d4c793f3aa3097b3be2c267f73d15c8a37b19fcd658640aed95d1682abdb4933d38c4fd8f057b28a3d31a1c4efab41378cbcf0a08762e27d82979d6b9e6ba717f8e67f6c7e9924a021feea2023b0e8c77a782634d441d8def322151b8415ecda2fb3be81619dabca2e12404d309436b9820cd6a8c186669c678ecfb9591b5fa7651f21fe4efbf4953a5b718618896677fab8762c630a4ef7d37859c89a1395fb926af55bd58b561283e69fcddcb57d3d757005750cfa0aca71f08b44be90725f3670b845298ed96b8584e5615cfc79e6ca295abc9641fca7039253bd4b1b677e230251bf4e6a23465ff595ca740801962f124d6cb658aadbc4e4bd3323f251ac4347f5a71300e2a814cfeb0d52e26f5de00fa5e20cb88490273ade48623afefdd0d8311cc254cb76bff3ce1f6464bff0c610bbe76d96ca96b72d1046b3982fc81f8a0335a448ff423c3932cac3b6b52e3eca4779cdda85838b9f5737eb1ac0ea7e8d788882b18c2fa2753bab41046a5719d14fad1b892258f6a680779546797c7e93d00d3cbafbf8360888233686ab3e60bb556479c9022279435602ce0454c9db189a835eba32b7ec9a722fcb83120f7614939a211d6c7f43c25c5a61abb55ee37999a382139f0e373e6aaa4ee45f095f50de6f636b100452d20be72362fd52bb62bae54c9c4d333efae647e85f21057706a862d6e6a3215181fb42168d4db56fd4d55da007798099e7a5229bb0a50e2f0a6a91f9182d86afaa1317ba0e17b4446f3a64cd44e7904e70dde3faced7a78baadb1d410a63faac63f107b6ca692a6b568bb5bf49b7d8249466c338f1004f0029280ae1d20fc31f0baf884ac6faf8806934391be9fc7f2ea67bf1a69cefd92d2571b7ecba0e8629ffa5eb39a7f3b896a5f201ed6e87112fe710d9a82983f899fd7222e737c8ac2831c002800321cae79702b5e010c4a2e117bc316da9056474d587919cf8c1e1e64731b649968810858dd108ca918e9439945e7ca73497776e1fa8428c92ca4766a9d91660e3b88f890460bfff3086cfe4bb9de117790080299f6f88c0ab0fe080626f1765906c150a1758b14ee5ad28d630f7167d5f14a0ed1c7014b6faf32c482c0c44463712b8dcbdadd5e1e14102faf80c4a5580172249956419cab486a37db73bbb0e5ae322ced6c1f1d5b44ccec14387a1f4e7becf5680ed63e1355c2c895f9eef74c9f8dc6de7051f2e06b555edc92764246390080dc084383d9f52afb23191dd1aa1ce5787dcdd3619c06e00a1506e41a0ddcdd98572dc830797d0ab691c96da19fa7cb5eb415f86fd560b3ea8afb19ec30ad89deb484ef8917b7b36652aefdd18629147bd654be1d444b61a1ef78f833b6beb5169237da428fe1a3322e815e5429e15dd79a09475bd852ed75f4d686ca6fd9ae9b8c9bb592f89382c490d4eb9e29be291e733d85b0dc8a3c7b33f8bb141a3072d8f76b81bdb93fd04a901978f2378512e2b56bef1faae0645cc25ae33a69465161b766f7b8e6db360cfd89b0c6df0922111dc8488e1e871c91c4e660175556d9d3a373fe32677c75d8abd10abaca367c4c2bde573b26b9a667586868a4ed2c11212afc8538577bde92e0c7521f4385ae4ec910b3d46ffa91228b20188e173154c5b3302735c15539c1b1b8999547cfaa76406c18566c9fc26eea88332e8355c18c19464f2f9715640825ccf2081058229265f599b0871c18088a4c69766e65e3cdcae800466045c8eeb46baa6b254abaeb9881581ead324038ec55d341088b0cffaa3dbe62595cc5d70fdf8fda6f0dd704f91c3918ae0e55d0c9bacb00fbd25ae50bf9ae6e2c6b39a7f0eb83e7e65ff71c03fadd5cf0f019afff1d13af69ca52a135e48252997b305d471a81345673f153c25e72a0d5ef5bb432b11f5fa6d655544a6f09be377c0d9a02ed88d6b1aab40545df0392d3c184df739d86d003d0dafb816a6c1d59f54defec6481e875c33a3a620b7ca09207727e7c4458c86f4eefdf1f98b25cbc22d0b9126ac328e52695df3c053b361dad8266ee10444c53545481344fce9a3e6e7265d4f5ab0bf2931029e90741b3e06c95b2ca4b286460695b654cbd0f860fac5f9691d3e7c9440b11210733c8cd6fd1509000d9b96790c3996e4214774419ee338b6d657220aec02a92a4244520124bcf4aab91fea08a8f5a448a6b020098f3eb8be280765159d492607061d1507e7ca1d086406d363deffa149784db21eeae341cef225b79ac9f509f6b3234161d71443c3802f612ffb95a744d9af753714a57fe7dd6832ddfa7d817872a8b21959c1da51e0264d6ab6dfebc532445b485bc9256bb941b8ae2f68f2698804ce8b454f856bfbf68cb87cf47efe5b305bbbd05b35cfff4926e2f29cd2fc5dc79e19623745900a0f381437e5359dc728b3d5a7159abe4395282744d57cd7dba2c9c3dc92a1cc245a18ccc6aee7371c99bde2777619030918875759fa9e3e9d39695544ab43bcdd407d00e818d53c7d6476c4fde7106c6568a6e098f50f27b91a0b7511beaaba617080a8cc252ad6df2dfe36bcfdd4e48dfc985df72424323e0e733b94778fe93a793e7608190d0d3ee0fd70b26adc9ce5110ee579b35a3e9dd0634d532e9131ca7b81f75d0c4f6018449f9e831dbfabe13b8b95562c3f16ff6c767c7db568782027745668bcb1f68e5b2d5f57067e62bce76aa07d7abddeeb4f3d844f0289e16a433f72d979916d44d5dd7917dfc8c79ffbedf4829e5c941d4f094433371a1661b967d62eaf34c11edafadb61cb7cad97221b1def5f757b520d232e8a87eabae2b9c98595b7710861541bc03206bd37b20eafd66a7ec9a8a1acf530de3ad02a11b5c168a06f7238a31185f04548ce2ccfba960b86106c04d441333c2f0a9b1a034fedc3d525b28971ade46af0a612faf10ee0a4ebf72f4cbc3df046f354f7289eb93fcd4a7adb84c1e3d17bdcb2a52bcde29b6056cf73e919e4b09ec0cdea6d4c2ad316d8635aab2ae27a5e6709b0397c9e4f14750ed01f01f1042b8cf5bac1a7f71b937f17bbadefb939461d3109836653e57eaa4b444f501800f399adff23a8a0c571161c9ef952337fdc6f6816125c8223eedfad059d33d6b61f3a976e7cd08abfa46b462083747e8ae250482d0a196ca2a9e3e5abf1541f14aa94faacf1a1c3cc95281774c587fc085bbeccba8565c966941841c0cf05eb2b3dac6e2e340c8f5d658d20d6d4ba6380358d52491609a035774cd5a60c7049afa43dd797db51028b60c550d855c18e1fa80d9da21453e6e7973ff2dbd40ac828ff4e2026dcfc6d1d0b5d8c82a2aa77fccd6d29e218e0524acd9d28f0a1d3073292f4e487af8dffc6dcd1fa20a2918820324e201ac81cda06f52dbbfae9635468f587f7fc2d36dce0891986006a3da26f7db6cf29af463ebd54c05c917ac1e8dcdf5e1a05eb78a56e231b65aacd9784c10deed1668bd293d38b5916ee3f5dfdb1d20f72f138c56cd9e5fb65652b7da41e9c1370ce9abdcbc5c75f41f1a1ddf78392c3af22f29d470d3ff0a3e933ae734c6192f0a9923fc19923253b8ef43e02fc445d2968f5162e56709fd687fdfeee4be2b5362af6d780b025959763bc37dce741909a6ad557e4278ab8656661659e16379df6f6929f4bc0c439d91b320b5fd6ab32369bdb981bad524f305079196b9b9035cae7c818050c68ba6123e5e8a24978d16983753ee1066bd96368467cf26d63107769618946068689bb163e406a7aeded78afda092b3f13ed0a607c8941371579e43bc6913fdb8ff5ef4041778cc52990da86b38fcc99a1e7c2a04cd243f2ecbb8fe2874916741ccd6af8de7aef7aaa8f57a851fc3fca5c6132e3f980417f15c55bb80a429746028f028e1c09057ac370964aedfd0784f8caf4f378c2d7a8adb4124540535dd823968ab6707aa4ae062fff41361cb1b8f23805c262a25c81f4649a8dde4295e8f6649640d6a033da3a5814e47933f56052a19c27add21b009bf4d371972c72138f13511cc3ce647ab9736fe8542557c159b9f8c67db4a99aa9b3de34460ae922cb4e9ca58252dd945f82c5ff382e1c708883793a123d018039b144f7d7da1a86f7af1bfc6eb4bc8c889c2f87dd0bc17b276e1f6d32dd06b87b348c78bcea20e866c42c6984454101d93f1d41378a1664b3f48fc124a385641118e8fad1d5dcbf182b92e4ec0d37fd16cf6f6d77f288be41e90a18c1f284c5fff61cd315097628c894b14284ee5953cb205909648fcf9665cd406cfbae9976f010bc1eaeb6fe62b9eeb3df7522ce31753eac60ea0bd533477fe54052f2af96798cdfa24c801cf2bff25715f52da9e467b59309701ba129b7454c592cbb931b6944d423dac07b41341047e3d7614592945ddf48bf5207deb2bfc59e41514d775e974d86704cfe61c9ba73d279f18f4107c662d49c602f1c041e1d32de6b742bdcb4250273f41a9b304e6bdef2cbcc271d32071c4ab3281ee7e8abf94d128059381bcfd3b113f6dfc59a848f6f47b9a33695ce46e5956ee8d15849acd17720f28d34b7faad46d5d8d8027e76c69c425175eb564d28e748c71dfacec3baa4e8d8bc34b89b64c51ae04e5f44008bdb86149213fe4521587a8a396433f7f09ffaaa603e178131fb628e0122f5f829ce517521c8dd783d0c170f2d945ea8b7721c790b8d8320610e64fbb4ccd6a099566342b7a355ac4bfae8603f005f3ce923a7d54b99b2a4b44aa9f7db887d7bcc655dc1b23bbfec3739bd14947181577ed2561495c9f14229141e3df79ea968e05ffa191ee2d89662a792e479a5d5a7b3cc23f9fa991243caa9b5860f8913739913151ddb1242b7c61a658cfc0e28bd2a058715175046e6a341873f386d97e52f43060c13e961eb577196b4a226a1b57e90a2e6448b319726c28424c232181a1411ac1fbcf241082774e854b6ac0511658bdd679e43feedea2b7f9d609bf7020a6136d766008c8fab7608bf259c2da25069e1e5fcbdbc1b52e0095b3ce136d7f8e844681f5f8aeb3a2b979cdc64b704a9cc0ec68bb09fa9ea22ae4ad9070152da2f305ee6dce978e638c2781db8f4ff20bf56130e8037b92f164c55eaa971c1a58966dffd66e3971afd1212bbe597f36d3be08a7045e5dfabcadd7b830cb2f55d10b83d0ffbc5492cf05d33b1046cfb92a4dfa8ab719548bdd98243ca15ca2e3d5cd956bee98bc0608250c583488f7c1d4ac7abae43b1c49452c352d168ec94b570ca465a358d7c145a6f9d03a2cbb1d4be9c506abced9493cdb4a087de79616bc7ffa74f5a6699bfa83500ccebdb2619a0b485c6ca8a77d0dba45a20d92d44f5f3c0638f6acb457238e0860aa33db923237fcbc91551a44ee71197ed3427faaa51e4ca48a8bf2144e81b5bd97cbfef5093ef204c5945067b7223fcaabf51ee170cdf7c9f2d2f3988341054856703e0f78cc0d3cb264d47d507e1b7c28e1674cd0099a40b73e14c42ad3ca3683fbd13e155d446be2ac05a826cb194d4d564a49064bb1e4d11ed77598c5bcd189755384c94c2ca2002445570245ffda888c0ae1b22feb1c474f79faeb73921590ce1c82c442f11baedef2fe59e4006f6637e046cfc24475b53d0742570abdab779e60a7bade19f01b57bd3e82fd15542b051085e78c323935c6eacd9f18f3a9724ca686b525b189497d1e43df902b4040f63e18d19b8134a32b14685f4b99fef0b98df8d01965a996282a84ea5f27ffb828c899bebbba32827a41caa763beba7aa9237f7e8ccbdbd0bc6ff250c40f7e573c34dc7cf4f8caf53a2ec1c3c3fe5d7233177ba3a25df5b903151381721e7d7fb9cfadb2de316eec54854d971f0230dc2f388d6871985770c0c7b1de30c1fc69fdb88fbdd1df6d5d44278a8f9c3df86dced494dab31c71bdde66a21e6d9ef62962384969d02a578d61ff8717d1a73417a4526f4fb2c90428ace62f17dc84f8438f66f97d1cede7855f7a3d3d9d0383266a1036e1ef1cfb3ebb654f731acab25c922687a239c5759c3d09d457a0bfcb872106427fa5bbc0f1b9f031f97970f05812aafe998d30b7cb6c5704170267a8647b4a4565dc4396a9580c1035bc71cb2ba0569388b69ffa3ae11dd3722d922cbdc318b2f39676a5df27f7066497779059cd997395102c7a29b54a5d2fb2641e0ff8537259e6aabfb5a8c68e1472c2d8b9c72c23a0841f360e8590ad968ce3d0ff99902e20f28eb3c3edba19efa9ac46e630e99b7b54f29366a3cdaa6964608c6cbfb12166656488772b20b64b6ccb6e46b9083adcc850b5bc3c7935500434e75e95313ee15a24650da33e9e3ebaecf8669289c564eb424cc423e894625a11de6094fbb29a59785c9169e2f9a143002c4fb809fc5bfef8ffd9c26a2315f79f6a0b0af1f89d77f114c4c50cb5e02a77692542688dce8c4a39bfb9692623380de001e9751352e2a896d312494adbbf7c8a505145f41c49957077f6452c93b9068ac446430c527399a318995a62cad56d4e2af5cb0579f6d45fa9d56b0d9b43856aea9d394be825a6e182e71e4cfc7a537f86806f6e771cab58de282f12290807460eacc1358e67694e00afc7b93e67d7faf90cd050721302a35fa169c17e1982130c7112a5f3e024bd2ebcd4329ce54f0eb97eab59c5e1599ffb1b61c4f60903f2c8aeba51e5b09fe1c1e8e2306cc11c409fa02f65a90d33383ba70ba0256cac802303e95ba3401bd4667f5461651738d164e890d2b23972e14b675f7c209638a55eacaba3d1874eed6a0605a502a49880fe9cfcf5b0ea99bb731916071a3bed26a4a4309368c8dc9dd23e85c23de846f451b89ba1a7ab5d4e1aa8461775aa4cdddaebc31123860d402332e14fcd415fd139e8cb3be5371bdb79b3bf10f691319b320d28f189de215290ba53617acfc4b1122c8bb5f538b3a24a007b6b6a00c75ebc8aded4d2f874ab909b34ba40a662fa90219c447d85a7 Verify = OK # Same as the previous test case, but the last bit is flipped. Hash = SHA256 P = "256blockboundarytest" S = "salt" c = 8 DK = eb64bac8e24ae1b54266d757f0fabbc72a57f5dc5d03b8c39e65f2062939bc594d82acdd144120b322ca12fba07e113ea83b1ed2c1b33603d72c67c6ef31ddcf6a9547b5fab0655bf5a7c220a307a21491932dbbffb54f99ac997ec6bf898ff9005a88c72c7ee49126397f368f704e779dc25687af9b419b6ba8cc4e177f805f55242b627e980c0898a1ea46ba633e6c0db0a14f7fb323d26bed1a524387041f8c5f6e9edd0a4ea51e0fbae1b04b009d41049eeccbfa45702716fb57b9f4167082368a36f55e7aac656b3677595868415e9e57e7a5cafdf60eb7a8d66098f0be8f012caf9a78cf2f5c0b4d153f9fd067d781f39b9acd730b6fdc9d27f93946c0e0b184d86f7eaced5a8b734f5beab2b930789c18934296c6c86e28845607e9f6d1035c30a7ef5003b19336a56aea507e3c58360f091e70ff59c5869a9e0bd14d2dca4d0a144bcb607bdf583ef4230edaad75e4db16a8275eb74c4a4cf6163e6aa293ebd6ea10b5be8179693687c2cf9ff038ded9a5a32917bbd2c4a703b0500ee0a0373bb324b409358bbc30bedbb405875eb281e9a7dd58b89ca12a9dc8505c524a2d10cfe120250bd22b9b340a29256b58548dee0da72a16084a130fe6d734bb70811e855d20b85d85f662c9574be68238a88165c22194e4942cab792184050abb3a7e22fec3f58537af84ebfa8d858dc879115b2e71c34aad0f6591c64e11e2ff8218c6841ec9b81dd9affc3ea70cdeb09423e712251f4022fbc4d54e0c5d174e198ddd9c6c8587d0c8f3bdbec79b10d46fda6e354c0a8b3b59ba82dfa164369f3075d1ad93c69a716ba8a377c626b9f44e9591c530e72a65abddb15e3766ecd068fcfe046efb86bbc00bfc24fa50fa6ffdf1f84e6e0c0d335c00637f14414a7369f5d2288bc04f284c0730766b3f9fe8464559b61c2f3f4d6e08b1cbf578f186605601533860d5f69aad06dc993d4f0ad7142249f68e1531c60fb3791ede647dc499a6b9bdfc1efd7bc0b40b95c3caeeba615d0a9c2564151598db35a7752953a7b2a40162359b69a4cf9a591d05f38dce8968dd6b6f16f57609fde9a8af9f16ec3b8a40311aec06a5bbae97e77edf32d22772b72fd61c4bf9cf34049830270653be365cd24b46fb7894150fd9e84ae211493b4ce4a95e7d0aa1f12709ba65f7bd7d8c904a9f967ced8e30789616242f7f9054e596f610d7bed0e55c3c91546b8283d965cbc2a79d5ddc4224e1db662d97bbf35847ecca83ee9e4c23d5b30ac8e2608186930e621e8cfa316dcd02b9dc17d59bcbe7fbdfcb6ecf882ce0c122ac82dd305ee7fc08b18fd2d7f1fab397038b84f9bed0d6aff490d720764aaa32a6f5b73ec6ba2083a5fb0a9e1d97bca1038f235d7b13f1baafea051ae898a3b92dc15bc3f7fd87db77a00dbefb9601157ae806e23386f64683992de57bfa37c8e4bc72ca7894ddeb16b833619f430e7da701859608f609d93044283841154da70b62f9267e15c741d5dd0e86ef58bc3cdc4f64c8fc63b9f466cd5415dd8650f7f400cd5c53544bdfbb6fe68c239e4d8d2c07f6affd864802c495b6b4fd0f1fb968c90934f93ba25d21cd7249dc4e3ef1301746d37e67ba34a861bbfd5ae7ea9ed8d7e853855f0f7bd0314b04697980191f448d71d7aed082781b04e3c01c46cce86ee1b8807bd8cf64988370925305f59814bbcecf0e9d39a8c0daa85625ddea187d19f7e3d970b0739a56f3b5c8de17c946c5692dd0503f8b20a3fc401d6fc6990c2a42e81daa46df79727e6a5f03d5c5a616e33b077f68939df7f9ae8a09599cc3a0e0e36b23ff5df4eca1ea1c8b5223a0cf2abb96808adcdeaf68a49e767ac5f934f499b82d775e995a69cee0822d13492a3038bf78faf01d9f4d87ba1f3311c002b4e603671a2cf007352fca16c30ad307c030d70e5f9c091b2035e164dfd6b9014c9bb365a694f5198566a9d58eed322f6d71b6148c1191f9f8ed4c58c03c403fcc5a1de5ace76fa1c1a42aab81e3be73d312513f278d5de7d67e24c961d709a3bc252e11eb067ea98583543675119f21fbf264024f4d33b2f6f17e98aa06dfb409f16a8692d9c7bf0fa340b13c4826cff8b07efa5ba69defb90870b43f27b632c1b76ea7129865e18d7fc597007530852d307708b51287a85d1d6395b489156f18fcde58157f5100c7c8d595ffe37fb8c1077fa204e97a721d45be4dce7b473a5d02cc31b4346f534d52a7ae7461d12fe12fb80dd7124d95e7683d3ee6b521094c1181a4c84e0272d2e0359bf6615121838c0e7da6b344b479efe17e86b52999fc7de81852bb89e335ee54123c408d9cbca031a5b4d01cb736108f9aa1dae4775d1e970ce179c565bbde3bab82f8bd883afb25a66db21fec824db6f4a140c5008acb4cc3e518b6ca77e446cdc82b4d4d6792a9e1c8fe151e84d531d8e2d1c751967f9b3ea7a2387fe53711fc48ee7524f487a3c1af2590be648f6965869a97b88729ccc6578c3aeab055f16998c1750ee8c9358875ef48c37400d4adca39ed81a0bec5e43f4a5819dca470dc86bcbcd932c8bb4017880b3934844bb76c04e4a65285fda9fc0e4e4622b3b13f1ffbad3754fdff8a3705ad370ad089e590cc8b57c2e5618041042e808dfa003bb19d229cd60a849f345f9bf85f53496b1498caada27565312b909afef165d40d82bbe3405a404ded080ece28834129c2b199a4301d6c4ee6f0502afe3dbb3d7be80da9e6b5cb2188fbb73605b31ed4e6846e75d875ab586d995cb6e20b41765e86ece82db4ce6fc1c3e63fa9bb2d2a273e217a0235e97c7750c5a543757de8759009e243d847f79a1aaba097d540573c2fe0d9fe611fe1d30484b5ae60834206b9fb7ed8fe86813f661eeb01bb608965fd6f91501210cbd17ebe1c1f5965bde456c74b96faa771bcf293a544f862689f2972444b7ae83f536c86ff21b8d8abfe8f3274fcd5d86b3f189546f927cc92196722d2e3cf4a1cd54352ecaa4466b801217200b8b981398e08209f3d597dd4726eb8f3360e757613bfded0b02853cee281b45791d3ae996bbefca334cc35f3d0dfc6f53a3defffbbc4f620e65e916171c0511678ecc512f48a230548aa88dc3886ee91a9d6d6df6d3912fd64dfc80ecc5fa1ebd9a715ad846e0bbe41b09bd33f50fcacb1984ed5610ff1c898d9cb9e948929f3f9d26b8d48ce0014a5f7840d7e85a0f61ed764587e382cb9bb23e5476dd7904e062c66fdc62f26212f66b1f8f9fcf061a2de063a6e510680d7689c05740cb62ac66b97f4060a491aeca2f485d1c1575d85f495bec1619acd001547b05d2e55c661019f67fe2525730e535a235b4e5d1126a66f27c4a9ed3bdba43b94b4bca662731613629dfa088f615cfd4eac538cbe8f137653a9e47a0a6f4c86937f0bcc4a287319f5bd81bb3e187ec84b248005383a955540216385a8efcaa6ea1ad487a01405a636b76c09bd76157a4358fe5326735e0d68c53792d37b26d894e5149d9afd4fe8a18aff58c94d37659cfd1fda6af60cf8dca192bab99336638a4e82ee2e1559571b22bcceb3b2c83e105c526f36abe6deb90d0aa1e8828778e98da0b3e1b24a2ab43851edc6ac887ed3878b764a5da26aafb6269ed3dce51595823ee6d7a4242498159d50417a26a2915492e265a14e9bd3a339f9aaf064da98d8888cd13cd7d13dc18a1431d3ff973c46ef0d487ab619d3cbe5d4acdc658aaea89c02a8255bbc1a824e0df48f2775355be55419edac6c9edce3eed5c2025b8734d0602583b14a573b7236f21dd8dbafa6104b2c49bd2c7179e9e934bd2ecb52b55df6e54aff822b594c8f73dfadcce73727ffc68a4512a3be2f4e28557a6e8262192dc4f83971d4a366c4476d4415b33c6448d6261e69f7563eb1e0d30490f1ef6ae44321fbb291ab2eb8a120094231ef14a4c9caf84cceda7b8f8d3488010e566b8a526fd5ddad414e9f2f14c94a4fb48e4abbf4ea866a48054ab49440fb4d83ca1312f9a3eb82580c1842e8b497e9303bd4b0bce65c63977f3d8dca4b6d55c3b7d67cb4e28f37b469523d3fc1640dead462618806062a703127fdad1fde5e5f5d364c12ada00e306e9592b7f54f9c0e69a32985403f2ee4d33cc37c8709ae05e02f36bcf8d2b92c89a5b29c70fabec2c840dbd5f5adb63434a059c847b163bd79827d1f9af7b47f89f845f31a5d5a6a2f8eca15fb9874d5b6e14d91832d4004cdd59a26c75767d482f565126fb710347930360df8febc3e3566aff94c795d8e7d22e99eb0f8b9696d88ad95b53b74df9b181c5d35103dde3de068141c7d0fa89da6d92cb90012ab815efd7c8481be262987c4dc8db2bb851813988f1ad197f8e5e2c4222c1f0ba0220c5ca2b9abb21ecc4dd0dc21341870f3bcc5597dd6ecb7a7a003434d5cb8f97ebf2c026176e5b3fd14b4eee95c036062a92d19220a341fe0dd73facee271e474d2e43354a03a97ee2096da987e52023f573a703bfef64935e2f5ee5cb692cba060436fe703e0af1abfb19cd85ed8571b051696ff9698368fbcc7695407a479e859b8857520a17f702b45e88440d385ff7dbebfae69e2223e068c87c584041fa7896e864d4c793f3aa3097b3be2c267f73d15c8a37b19fcd658640aed95d1682abdb4933d38c4fd8f057b28a3d31a1c4efab41378cbcf0a08762e27d82979d6b9e6ba717f8e67f6c7e9924a021feea2023b0e8c77a782634d441d8def322151b8415ecda2fb3be81619dabca2e12404d309436b9820cd6a8c186669c678ecfb9591b5fa7651f21fe4efbf4953a5b718618896677fab8762c630a4ef7d37859c89a1395fb926af55bd58b561283e69fcddcb57d3d757005750cfa0aca71f08b44be90725f3670b845298ed96b8584e5615cfc79e6ca295abc9641fca7039253bd4b1b677e230251bf4e6a23465ff595ca740801962f124d6cb658aadbc4e4bd3323f251ac4347f5a71300e2a814cfeb0d52e26f5de00fa5e20cb88490273ade48623afefdd0d8311cc254cb76bff3ce1f6464bff0c610bbe76d96ca96b72d1046b3982fc81f8a0335a448ff423c3932cac3b6b52e3eca4779cdda85838b9f5737eb1ac0ea7e8d788882b18c2fa2753bab41046a5719d14fad1b892258f6a680779546797c7e93d00d3cbafbf8360888233686ab3e60bb556479c9022279435602ce0454c9db189a835eba32b7ec9a722fcb83120f7614939a211d6c7f43c25c5a61abb55ee37999a382139f0e373e6aaa4ee45f095f50de6f636b100452d20be72362fd52bb62bae54c9c4d333efae647e85f21057706a862d6e6a3215181fb42168d4db56fd4d55da007798099e7a5229bb0a50e2f0a6a91f9182d86afaa1317ba0e17b4446f3a64cd44e7904e70dde3faced7a78baadb1d410a63faac63f107b6ca692a6b568bb5bf49b7d8249466c338f1004f0029280ae1d20fc31f0baf884ac6faf8806934391be9fc7f2ea67bf1a69cefd92d2571b7ecba0e8629ffa5eb39a7f3b896a5f201ed6e87112fe710d9a82983f899fd7222e737c8ac2831c002800321cae79702b5e010c4a2e117bc316da9056474d587919cf8c1e1e64731b649968810858dd108ca918e9439945e7ca73497776e1fa8428c92ca4766a9d91660e3b88f890460bfff3086cfe4bb9de117790080299f6f88c0ab0fe080626f1765906c150a1758b14ee5ad28d630f7167d5f14a0ed1c7014b6faf32c482c0c44463712b8dcbdadd5e1e14102faf80c4a5580172249956419cab486a37db73bbb0e5ae322ced6c1f1d5b44ccec14387a1f4e7becf5680ed63e1355c2c895f9eef74c9f8dc6de7051f2e06b555edc92764246390080dc084383d9f52afb23191dd1aa1ce5787dcdd3619c06e00a1506e41a0ddcdd98572dc830797d0ab691c96da19fa7cb5eb415f86fd560b3ea8afb19ec30ad89deb484ef8917b7b36652aefdd18629147bd654be1d444b61a1ef78f833b6beb5169237da428fe1a3322e815e5429e15dd79a09475bd852ed75f4d686ca6fd9ae9b8c9bb592f89382c490d4eb9e29be291e733d85b0dc8a3c7b33f8bb141a3072d8f76b81bdb93fd04a901978f2378512e2b56bef1faae0645cc25ae33a69465161b766f7b8e6db360cfd89b0c6df0922111dc8488e1e871c91c4e660175556d9d3a373fe32677c75d8abd10abaca367c4c2bde573b26b9a667586868a4ed2c11212afc8538577bde92e0c7521f4385ae4ec910b3d46ffa91228b20188e173154c5b3302735c15539c1b1b8999547cfaa76406c18566c9fc26eea88332e8355c18c19464f2f9715640825ccf2081058229265f599b0871c18088a4c69766e65e3cdcae800466045c8eeb46baa6b254abaeb9881581ead324038ec55d341088b0cffaa3dbe62595cc5d70fdf8fda6f0dd704f91c3918ae0e55d0c9bacb00fbd25ae50bf9ae6e2c6b39a7f0eb83e7e65ff71c03fadd5cf0f019afff1d13af69ca52a135e48252997b305d471a81345673f153c25e72a0d5ef5bb432b11f5fa6d655544a6f09be377c0d9a02ed88d6b1aab40545df0392d3c184df739d86d003d0dafb816a6c1d59f54defec6481e875c33a3a620b7ca09207727e7c4458c86f4eefdf1f98b25cbc22d0b9126ac328e52695df3c053b361dad8266ee10444c53545481344fce9a3e6e7265d4f5ab0bf2931029e90741b3e06c95b2ca4b286460695b654cbd0f860fac5f9691d3e7c9440b11210733c8cd6fd1509000d9b96790c3996e4214774419ee338b6d657220aec02a92a4244520124bcf4aab91fea08a8f5a448a6b020098f3eb8be280765159d492607061d1507e7ca1d086406d363deffa149784db21eeae341cef225b79ac9f509f6b3234161d71443c3802f612ffb95a744d9af753714a57fe7dd6832ddfa7d817872a8b21959c1da51e0264d6ab6dfebc532445b485bc9256bb941b8ae2f68f2698804ce8b454f856bfbf68cb87cf47efe5b305bbbd05b35cfff4926e2f29cd2fc5dc79e19623745900a0f381437e5359dc728b3d5a7159abe4395282744d57cd7dba2c9c3dc92a1cc245a18ccc6aee7371c99bde2777619030918875759fa9e3e9d39695544ab43bcdd407d00e818d53c7d6476c4fde7106c6568a6e098f50f27b91a0b7511beaaba617080a8cc252ad6df2dfe36bcfdd4e48dfc985df72424323e0e733b94778fe93a793e7608190d0d3ee0fd70b26adc9ce5110ee579b35a3e9dd0634d532e9131ca7b81f75d0c4f6018449f9e831dbfabe13b8b95562c3f16ff6c767c7db568782027745668bcb1f68e5b2d5f57067e62bce76aa07d7abddeeb4f3d844f0289e16a433f72d979916d44d5dd7917dfc8c79ffbedf4829e5c941d4f094433371a1661b967d62eaf34c11edafadb61cb7cad97221b1def5f757b520d232e8a87eabae2b9c98595b7710861541bc03206bd37b20eafd66a7ec9a8a1acf530de3ad02a11b5c168a06f7238a31185f04548ce2ccfba960b86106c04d441333c2f0a9b1a034fedc3d525b28971ade46af0a612faf10ee0a4ebf72f4cbc3df046f354f7289eb93fcd4a7adb84c1e3d17bdcb2a52bcde29b6056cf73e919e4b09ec0cdea6d4c2ad316d8635aab2ae27a5e6709b0397c9e4f14750ed01f01f1042b8cf5bac1a7f71b937f17bbadefb939461d3109836653e57eaa4b444f501800f399adff23a8a0c571161c9ef952337fdc6f6816125c8223eedfad059d33d6b61f3a976e7cd08abfa46b462083747e8ae250482d0a196ca2a9e3e5abf1541f14aa94faacf1a1c3cc95281774c587fc085bbeccba8565c966941841c0cf05eb2b3dac6e2e340c8f5d658d20d6d4ba6380358d52491609a035774cd5a60c7049afa43dd797db51028b60c550d855c18e1fa80d9da21453e6e7973ff2dbd40ac828ff4e2026dcfc6d1d0b5d8c82a2aa77fccd6d29e218e0524acd9d28f0a1d3073292f4e487af8dffc6dcd1fa20a2918820324e201ac81cda06f52dbbfae9635468f587f7fc2d36dce0891986006a3da26f7db6cf29af463ebd54c05c917ac1e8dcdf5e1a05eb78a56e231b65aacd9784c10deed1668bd293d38b5916ee3f5dfdb1d20f72f138c56cd9e5fb65652b7da41e9c1370ce9abdcbc5c75f41f1a1ddf78392c3af22f29d470d3ff0a3e933ae734c6192f0a9923fc19923253b8ef43e02fc445d2968f5162e56709fd687fdfeee4be2b5362af6d780b025959763bc37dce741909a6ad557e4278ab8656661659e16379df6f6929f4bc0c439d91b320b5fd6ab32369bdb981bad524f305079196b9b9035cae7c818050c68ba6123e5e8a24978d16983753ee1066bd96368467cf26d63107769618946068689bb163e406a7aeded78afda092b3f13ed0a607c8941371579e43bc6913fdb8ff5ef4041778cc52990da86b38fcc99a1e7c2a04cd243f2ecbb8fe2874916741ccd6af8de7aef7aaa8f57a851fc3fca5c6132e3f980417f15c55bb80a429746028f028e1c09057ac370964aedfd0784f8caf4f378c2d7a8adb4124540535dd823968ab6707aa4ae062fff41361cb1b8f23805c262a25c81f4649a8dde4295e8f6649640d6a033da3a5814e47933f56052a19c27add21b009bf4d371972c72138f13511cc3ce647ab9736fe8542557c159b9f8c67db4a99aa9b3de34460ae922cb4e9ca58252dd945f82c5ff382e1c708883793a123d018039b144f7d7da1a86f7af1bfc6eb4bc8c889c2f87dd0bc17b276e1f6d32dd06b87b348c78bcea20e866c42c6984454101d93f1d41378a1664b3f48fc124a385641118e8fad1d5dcbf182b92e4ec0d37fd16cf6f6d77f288be41e90a18c1f284c5fff61cd315097628c894b14284ee5953cb205909648fcf9665cd406cfbae9976f010bc1eaeb6fe62b9eeb3df7522ce31753eac60ea0bd533477fe54052f2af96798cdfa24c801cf2bff25715f52da9e467b59309701ba129b7454c592cbb931b6944d423dac07b41341047e3d7614592945ddf48bf5207deb2bfc59e41514d775e974d86704cfe61c9ba73d279f18f4107c662d49c602f1c041e1d32de6b742bdcb4250273f41a9b304e6bdef2cbcc271d32071c4ab3281ee7e8abf94d128059381bcfd3b113f6dfc59a848f6f47b9a33695ce46e5956ee8d15849acd17720f28d34b7faad46d5d8d8027e76c69c425175eb564d28e748c71dfacec3baa4e8d8bc34b89b64c51ae04e5f44008bdb86149213fe4521587a8a396433f7f09ffaaa603e178131fb628e0122f5f829ce517521c8dd783d0c170f2d945ea8b7721c790b8d8320610e64fbb4ccd6a099566342b7a355ac4bfae8603f005f3ce923a7d54b99b2a4b44aa9f7db887d7bcc655dc1b23bbfec3739bd14947181577ed2561495c9f14229141e3df79ea968e05ffa191ee2d89662a792e479a5d5a7b3cc23f9fa991243caa9b5860f8913739913151ddb1242b7c61a658cfc0e28bd2a058715175046e6a341873f386d97e52f43060c13e961eb577196b4a226a1b57e90a2e6448b319726c28424c232181a1411ac1fbcf241082774e854b6ac0511658bdd679e43feedea2b7f9d609bf7020a6136d766008c8fab7608bf259c2da25069e1e5fcbdbc1b52e0095b3ce136d7f8e844681f5f8aeb3a2b979cdc64b704a9cc0ec68bb09fa9ea22ae4ad9070152da2f305ee6dce978e638c2781db8f4ff20bf56130e8037b92f164c55eaa971c1a58966dffd66e3971afd1212bbe597f36d3be08a7045e5dfabcadd7b830cb2f55d10b83d0ffbc5492cf05d33b1046cfb92a4dfa8ab719548bdd98243ca15ca2e3d5cd956bee98bc0608250c583488f7c1d4ac7abae43b1c49452c352d168ec94b570ca465a358d7c145a6f9d03a2cbb1d4be9c506abced9493cdb4a087de79616bc7ffa74f5a6699bfa83500ccebdb2619a0b485c6ca8a77d0dba45a20d92d44f5f3c0638f6acb457238e0860aa33db923237fcbc91551a44ee71197ed3427faaa51e4ca48a8bf2144e81b5bd97cbfef5093ef204c5945067b7223fcaabf51ee170cdf7c9f2d2f3988341054856703e0f78cc0d3cb264d47d507e1b7c28e1674cd0099a40b73e14c42ad3ca3683fbd13e155d446be2ac05a826cb194d4d564a49064bb1e4d11ed77598c5bcd189755384c94c2ca2002445570245ffda888c0ae1b22feb1c474f79faeb73921590ce1c82c442f11baedef2fe59e4006f6637e046cfc24475b53d0742570abdab779e60a7bade19f01b57bd3e82fd15542b051085e78c323935c6eacd9f18f3a9724ca686b525b189497d1e43df902b4040f63e18d19b8134a32b14685f4b99fef0b98df8d01965a996282a84ea5f27ffb828c899bebbba32827a41caa763beba7aa9237f7e8ccbdbd0bc6ff250c40f7e573c34dc7cf4f8caf53a2ec1c3c3fe5d7233177ba3a25df5b903151381721e7d7fb9cfadb2de316eec54854d971f0230dc2f388d6871985770c0c7b1de30c1fc69fdb88fbdd1df6d5d44278a8f9c3df86dced494dab31c71bdde66a21e6d9ef62962384969d02a578d61ff8717d1a73417a4526f4fb2c90428ace62f17dc84f8438f66f97d1cede7855f7a3d3d9d0383266a1036e1ef1cfb3ebb654f731acab25c922687a239c5759c3d09d457a0bfcb872106427fa5bbc0f1b9f031f97970f05812aafe998d30b7cb6c5704170267a8647b4a4565dc4396a9580c1035bc71cb2ba0569388b69ffa3ae11dd3722d922cbdc318b2f39676a5df27f7066497779059cd997395102c7a29b54a5d2fb2641e0ff8537259e6aabfb5a8c68e1472c2d8b9c72c23a0841f360e8590ad968ce3d0ff99902e20f28eb3c3edba19efa9ac46e630e99b7b54f29366a3cdaa6964608c6cbfb12166656488772b20b64b6ccb6e46b9083adcc850b5bc3c7935500434e75e95313ee15a24650da33e9e3ebaecf8669289c564eb424cc423e894625a11de6094fbb29a59785c9169e2f9a143002c4fb809fc5bfef8ffd9c26a2315f79f6a0b0af1f89d77f114c4c50cb5e02a77692542688dce8c4a39bfb9692623380de001e9751352e2a896d312494adbbf7c8a505145f41c49957077f6452c93b9068ac446430c527399a318995a62cad56d4e2af5cb0579f6d45fa9d56b0d9b43856aea9d394be825a6e182e71e4cfc7a537f86806f6e771cab58de282f12290807460eacc1358e67694e00afc7b93e67d7faf90cd050721302a35fa169c17e1982130c7112a5f3e024bd2ebcd4329ce54f0eb97eab59c5e1599ffb1b61c4f60903f2c8aeba51e5b09fe1c1e8e2306cc11c409fa02f65a90d33383ba70ba0256cac802303e95ba3401bd4667f5461651738d164e890d2b23972e14b675f7c209638a55eacaba3d1874eed6a0605a502a49880fe9cfcf5b0ea99bb731916071a3bed26a4a4309368c8dc9dd23e85c23de846f451b89ba1a7ab5d4e1aa8461775aa4cdddaebc31123860d402332e14fcd415fd139e8cb3be5371bdb79b3bf10f691319b320d28f189de215290ba53617acfc4b1122c8bb5f538b3a24a007b6b6a00c75ebc8aded4d2f874ab909b34ba40a662fa90219c447d85a6 Verify = Err Hash = SHA256 P = "EmptyDKTest" S = "salt" c = 8 DK = "" Verify = Err # PBKDF2 test vectors from RFC 7914 Hash = SHA256 P = "passwd" S = "salt" c = 1 DK = 55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783 Verify = OK Hash = SHA256 P = "Password" S = "NaCl" c = 80000 DK = 4ddcd8f60b98be21830cee5ef22701f9641a4418d04c0414aeff08876b34ab56a1d425a1225833549adb841b51c9b3176a272bdebba1d078478f62b397f33c8d Verify = OK ring-0.16.9/tests/quic_aes_128_tests.txt000064400000000000000000000001431352416253600162510ustar0000000000000000KEY = e8904ecc2e37a6e4cc02271e319c804b SAMPLE = 13484ec85dc4d36349697c7d4ea1a159 MASK = 67387ebf3a ring-0.16.9/tests/quic_aes_256_tests.txt000064400000000000000000000002031352416253600162500ustar0000000000000000KEY = 85af7213814aec7b92ace6284a906643912ec8853d00d158a927b8697c7ff585 SAMPLE = 82a0db90f4cee12fa4afeddb74396cf6 MASK = 670897adf5 ring-0.16.9/tests/quic_chacha20_tests.txt000064400000000000000000000002031352416253600164550ustar0000000000000000KEY = 59bdff7a5bcdaacf319d99646c6273ad96687d2c74ace678f15a1c710675bb23 SAMPLE = 215a7c1688b4ab7d830dcd052aef9f3c MASK = 6409a6196d ring-0.16.9/tests/quic_tests.rs000064400000000000000000000051471352416253600146450ustar0000000000000000// Copyright 2018 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] use ring::{aead::quic, test, test_file}; #[test] fn quic_aes_128() { test_quic(&quic::AES_128, test_file!("quic_aes_128_tests.txt")); } #[test] fn quic_aes_256() { test_quic(&quic::AES_256, test_file!("quic_aes_256_tests.txt")); } #[test] fn quic_chacha20() { test_quic(&quic::CHACHA20, test_file!("quic_chacha20_tests.txt")); } fn test_quic(alg: &'static quic::Algorithm, test_file: test::File) { test_sample_len(alg); test::run(test_file, |section, test_case| { assert_eq!(section, ""); let key_bytes = test_case.consume_bytes("KEY"); let sample = test_case.consume_bytes("SAMPLE"); let mask = test_case.consume_bytes("MASK"); let key = quic::HeaderProtectionKey::new(alg, &key_bytes)?; assert_eq!(mask.as_ref(), key.new_mask(&sample)?); Ok(()) }); } fn test_sample_len(alg: &'static quic::Algorithm) { let key_len = alg.key_len(); let key_data = vec![0u8; key_len]; let key = quic::HeaderProtectionKey::new(alg, &key_data).unwrap(); let sample_len = 16; let sample_data = vec![0u8; sample_len + 2]; // Sample is the right size. assert!(key.new_mask(&sample_data[..sample_len]).is_ok()); // Sample is one byte too small. assert!(key.new_mask(&sample_data[..(sample_len - 1)]).is_err()); // Sample is one byte too big. assert!(key.new_mask(&sample_data[..(sample_len + 1)]).is_err()); // Sample is empty. assert!(key.new_mask(&[]).is_err()); } ring-0.16.9/tests/rand_tests.rs000064400000000000000000000050041353036607100146150ustar0000000000000000// Copyright 2015-2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use ring::{ rand::{self, SecureRandom as _}, test, }; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test_configure; #[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn test_system_random_lengths() { const LINUX_LIMIT: usize = 256; const WEB_LIMIT: usize = 65536; // Test that `fill` succeeds for various interesting lengths. `256` and // multiples thereof are interesting because that's an edge case for // `getrandom` on Linux. let lengths = [ 0, 1, 2, 3, 96, LINUX_LIMIT - 1, LINUX_LIMIT, LINUX_LIMIT + 1, LINUX_LIMIT * 2, 511, 512, 513, 4096, WEB_LIMIT - 1, WEB_LIMIT, WEB_LIMIT + 1, WEB_LIMIT * 2, ]; for len in lengths.iter() { let mut buf = vec![0; *len]; let rng = rand::SystemRandom::new(); assert!(rng.fill(&mut buf).is_ok()); // If `len` < 96 then there's a big chance of false positives, but // otherwise the likelihood of a false positive is so too low to // worry about. if *len >= 96 { assert!(buf.iter().any(|x| *x != 0)); } } } #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn test_system_random_traits() { test::compile_time_assert_clone::(); test::compile_time_assert_send::(); assert_eq!( "SystemRandom(())", format!("{:?}", rand::SystemRandom::new()) ); } ring-0.16.9/tests/rsa_from_pkcs8_tests.txt000064400000000000000000001240001352416253600170050ustar0000000000000000# RSA 2048-bit key with e == 65537. Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b9d7af84fa4184a5f22037ec8aff2db5f78bd8c21e714e579ae57c6398c4950f3a694b17bfccf488766159aec5bb7c2c43d59c798cbd45a09c9c86933f126879ee7eadcd404f61ecfc425197cab03946ba381a49ef3b4d0f60b17f8a747cde56a834a7f6008f35ffb2f60a54ceda1974ff2a9963aba7f80d4e2916a93d8c74bb1ba5f3b189a4e8f0377bd3e94b5cc3f9c53cb8c8c7c0af394818755e968b7a76d9cada8da7af5fbe25da2a09737d5e4e4d7092aa16a0718d7322ce8aca767015128d6d35775ea9cb8bb1ac6512e1b787d34015221be780a37b1d69bc3708bfd8832591be6095a768f0fd3b3457927e6ae3641d55799a29a0a269cb4a693bc14b0203010001028201001c5fb7e69fa6dd2fd0f5e653f12ce0b7c5a1ce6864e97bc2985dad4e2f86e4133d21d25b3fe774f658cca83aace9e11d8905d62c20b6cd28a680a77357cfe1afac201f3d1532898afb40cce0560bedd2c49fc833bd98da3d1cd03cded0c637d4173e62de865b572d410f9ba83324cd7a3573359428232f1628f6d104e9e6c5f380898b5570201cf11eb5f7e0c4933139c7e7fba67582287ffb81b84fa81e9a2d9739815a25790c06ead7abcf286bd43c6e3d009d01f15fca3d720bbea48b0c8ccf8764f3c822e61159d8efcbff38c794f8afe040b45df14c976a91b1b6d886a55b8e68969bcb30c7197920d97d7721d78d954d89ffecbcc93c6ee82a86fe754102818100eba1cbe453f5cb2fb7eabc12d697267d25785a8f7b43cc2cb14555d3618c63929b19839dcd4212397ecda8ad872f97ede6ac95ebda7322bbc9409bac2b24ae56ad62202800c670365ae28671195fe934978a5987bee2fcea06561b782630b066b0a35c3f559a281f0f729fc282ef8ebdbb065d60000223da6edb732fa32d82bb02818100c9e81e353315fd88eff53763ed7b3859f419a0a158f5155851ce0fe6e43188e44fb43dd25bcdb7f3839fe84a5db88c6525e5bcbae513bae5ff54398106bd8ae4d241c082f8a64a9089531f7b57b09af52042efa097140702dda55a2141c174dd7a324761267728a6cc4ce386c034393d855ebe985c4e5f2aec2bd3f2e2123ab1028180566889dd9c50798771397a68aa1ad9b970e136cc811676ac3901c51c741c48737dbf187de8c47eec68acc05b8a4490c164230c0366a36c2c52fc075a56a3e7eecf3c39b091c0336c2b5e00913f0de5f62c5046ceb9d88188cc740d34bd44839bd4d0c346527cea93a15596727d139e53c35eed25043bc4ac18950f237c02777b0281800f9dd98049e44088efee6a8b5b19f5c0d765880c12c25a154bb6817a5d5a0b798544aea76f9c58c707fe3d4c4b3573fe7ad0eb291580d22ae9f5ccc0d311a40590d1af1f3236427c2d72f57367d3ec185b9771cb5d041a8ab93409e59a9d68f99c72f91c658a3fe5aed59f9f938c368530a4a45f4a7c7155f3906c4354030ef102818100c89e0ba805c970abd84a70770d8fc57bfaa34748a58b77fcddaf0ca285db91953ef5728c1be7470da5540df6af56bb04c0f5ec500f83b08057664cb1551e1e29c58d8b1e9d70e23ed57fdf9936c591a83c1dc954f6654d4a245b6d8676d045c2089ffce537d234fc88e98d92afa92926c75b286e8fee70e273d762bbe63cd63b # The same key as above, with the last byte removed. Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b9d7af84fa4184a5f22037ec8aff2db5f78bd8c21e714e579ae57c6398c4950f3a694b17bfccf488766159aec5bb7c2c43d59c798cbd45a09c9c86933f126879ee7eadcd404f61ecfc425197cab03946ba381a49ef3b4d0f60b17f8a747cde56a834a7f6008f35ffb2f60a54ceda1974ff2a9963aba7f80d4e2916a93d8c74bb1ba5f3b189a4e8f0377bd3e94b5cc3f9c53cb8c8c7c0af394818755e968b7a76d9cada8da7af5fbe25da2a09737d5e4e4d7092aa16a0718d7322ce8aca767015128d6d35775ea9cb8bb1ac6512e1b787d34015221be780a37b1d69bc3708bfd8832591be6095a768f0fd3b3457927e6ae3641d55799a29a0a269cb4a693bc14b0203010001028201001c5fb7e69fa6dd2fd0f5e653f12ce0b7c5a1ce6864e97bc2985dad4e2f86e4133d21d25b3fe774f658cca83aace9e11d8905d62c20b6cd28a680a77357cfe1afac201f3d1532898afb40cce0560bedd2c49fc833bd98da3d1cd03cded0c637d4173e62de865b572d410f9ba83324cd7a3573359428232f1628f6d104e9e6c5f380898b5570201cf11eb5f7e0c4933139c7e7fba67582287ffb81b84fa81e9a2d9739815a25790c06ead7abcf286bd43c6e3d009d01f15fca3d720bbea48b0c8ccf8764f3c822e61159d8efcbff38c794f8afe040b45df14c976a91b1b6d886a55b8e68969bcb30c7197920d97d7721d78d954d89ffecbcc93c6ee82a86fe754102818100eba1cbe453f5cb2fb7eabc12d697267d25785a8f7b43cc2cb14555d3618c63929b19839dcd4212397ecda8ad872f97ede6ac95ebda7322bbc9409bac2b24ae56ad62202800c670365ae28671195fe934978a5987bee2fcea06561b782630b066b0a35c3f559a281f0f729fc282ef8ebdbb065d60000223da6edb732fa32d82bb02818100c9e81e353315fd88eff53763ed7b3859f419a0a158f5155851ce0fe6e43188e44fb43dd25bcdb7f3839fe84a5db88c6525e5bcbae513bae5ff54398106bd8ae4d241c082f8a64a9089531f7b57b09af52042efa097140702dda55a2141c174dd7a324761267728a6cc4ce386c034393d855ebe985c4e5f2aec2bd3f2e2123ab1028180566889dd9c50798771397a68aa1ad9b970e136cc811676ac3901c51c741c48737dbf187de8c47eec68acc05b8a4490c164230c0366a36c2c52fc075a56a3e7eecf3c39b091c0336c2b5e00913f0de5f62c5046ceb9d88188cc740d34bd44839bd4d0c346527cea93a15596727d139e53c35eed25043bc4ac18950f237c02777b0281800f9dd98049e44088efee6a8b5b19f5c0d765880c12c25a154bb6817a5d5a0b798544aea76f9c58c707fe3d4c4b3573fe7ad0eb291580d22ae9f5ccc0d311a40590d1af1f3236427c2d72f57367d3ec185b9771cb5d041a8ab93409e59a9d68f99c72f91c658a3fe5aed59f9f938c368530a4a45f4a7c7155f3906c4354030ef102818100c89e0ba805c970abd84a70770d8fc57bfaa34748a58b77fcddaf0ca285db91953ef5728c1be7470da5540df6af56bb04c0f5ec500f83b08057664cb1551e1e29c58d8b1e9d70e23ed57fdf9936c591a83c1dc954f6654d4a245b6d8676d045c2089ffce537d234fc88e98d92afa92926c75b286e8fee70e273d762bbe63cd6 Error = InvalidEncoding # RSA 3072-bit key with e == 65537. Input = 308206fd020100300d06092a864886f70d0101010500048206e7308206e30201000282018100ac2d26e81b524ff75bb23d79c5eef2258546a1cbc9ce00cdb453449ad3af0d38d748bab51533ff39aabe9d21a0b1113f57764a6c27d10c97212296e3033814b8b1ec1d4b8cb00a4d8174dce02a7a73149d195ef83c3ee0334a8bf94d86dc0e8ba2a5ac80343e8124ead35dda110f106436813fae364113f8136a79f7791b035549dc7f7a1492ff0cbbbae937eb7e05ed997a3023bc3622def643a13aa4b20f15b4c293ccfd64a26db61623ae4fc69bac32162953cb37c93216c009ca217bc9b4cfa463e22b9d083d1c42f321cb8c248c29090194c0e5e94957ca2a34d62bcab2a12acfbb4565bf2576583a57fd78b810a7f7c70aec118e7e9bb7fba9c80c10acb8154af0e0e21ee4e488393c9dfd977aa7c245925fb5f880bf1074d916710630362c246f0270d70cbb546bd5ef07e423c37f1f446707c4d6c3874f9c7abfe80f873884911a6a98514b34ef147b1e7ff93c9497b57c73653f391d74bce6db9699cfb3fdca698427db519f08e33b16a7105b27f1387aa9958a674d777c1403e03302030100010282018043901045627b415fea7e9dfb0bfdc0cd9267ee139ee41492a3e14cf9887997b1a76125caeb40153616d767a78b7c102d8fef9e32a4c936ac935714688e99d21fcbc9c09125eaea90116dbf42c3c87b222aa78b09d3f2445e3c318329b5f2e24e4f0bbe0e2cf21e1153888fba83992ab07866ed8b3a44fd460ab06c9dfccae9daecf9f697fc3cd692b3941bf25299884ffd3ae26b136f16edf12b06b8916a41db1dac80fd1eadffc31781c68c9f476b4cfdf68e4f105e9ab7ea0f7f87eeedb96f723e2a17e5103af96c3a508d38262577ffe3b2fb7bb4f7150cdc9dfb8d4f3d5cdf349192d1d302182df169403a066ddb28647831041d587884282392f83716b74f201d33fa5a967d5f506a93e4e9506ecf6802869ead17beff0b8903114f154fa3973067d56003409cdefa962578096d664c79d2c5df6e8dbbf67a9bf6e2c7c938608c17ae1ef6e56fce9058fb4823c5cee63e2a1c9f495dca8021fcb50cd92a35a9de5df29755b8f0d6d677d8fb8144dd106f07782e63032e6f40f3c29c0de90281c100def986933a3b7fdcb21c7096a4ef361c6631a23aacc8831f34270efd4850eac191d9284070cc910cf12864efd6d8c676491ba8f810b005dc4143e7e774d2d4fa255007ec75a98f5fc105100ed49327e90d31f01771bfe92b1f47cb36eb8c2d30067d1523980b9329e73ff7ae84a8ae11276a085a201bef0b398f934e4bdd7eba261e676a4a933a4254934f6ad8c17277a977a7782da24000eec12cf8def48d86a73ac84e9dcf5b5e8dad32ceb4d565085c2063f88df9a4b1f200375d2a58c86f0281c100c5ad84dcac6f51bfefa20c2b52611bcec8822739ff907491912b7c0d80ddcdfe1836c264969048133e76d3c4987a563a2d7d3c3b213cf47e1cd9329df1878bc4834e9742e5d0a31c663d4fa8edd8e0abad1c5fe2e6fef1f01c35b93eff619c7ae80873842daa277096dd1f3da4b4182525d06c1041a9c8627be145c3435a79dba4dfe52f63fa51486762d1b55d449fb55f07d304fcc726b9cc1e42484bc6d72704e0192f4bb7e6c6438dbd9aecf8d10626bc2ce1904f96d7594b9fc0e8231e7d0281c050a322f519a92ceb8e8a5479567aa032130f3e21441d5bb62c3137ed877aa3fb8f185ec33747f3e91f49c17f2f4ec42f40ef3ce3417db710d9958a479d6b25d4b52bc541d1a7998f4289e72dc5d8d625253d7b1baf6a7d13b843498dba0fbec3d084e9e12e7a79253d5957e4885b4c602dc5ddf1620d581cd21b4765987029057f059dd6c5d38acd3432f614a90104b99bd30700a2583c175a41085794a21290b0e7c44b122d4c58dc99d77703d4ecade24b607c22343748974156c45dad30070281c100a8d548d2c91bd2b0a1d4bf9c08a214040ad0cefc0440b6aed55454819bfcd5411e2136ea7e8600691f4292202932e38e90e79397d50da0ac4dab5c45f5d21517e4262d9edf75d0ba22c05ed7233dc6b61a06500715cfcd878c307e6545ed729eaeaaf92e7d6a04816ef8b1040f361a213028d10319720f49be106b6b188d9fe26ef12367d476291233eafcbd70497a368851c073540a2c132838f7d79390e295dade23e477413c833d9343cb9c75eee0d8188424ab02af0c82a1ca7212525c690281c012315e04ad315f39c8c0657c93ed32ec2501c9cf2b3c3f6c07fc78ad95d9c5827201ef95d7f549ddba41a75ed1b2a5261037490d235c4f097a123dd454da7f2954a1ea4e612662e5086d6e532adef15506b2adf1aeb5237257df7193d85e2a4d61bbef24122deee62b41b73cf277486da9dee39311904e49fcf7e5cf7c1ba5da0b8e25853da1389b79753a894643ff8299d1c599130c9d0f25db07eafde4a1ee1e66f839c3b775000a5d8576f3b158d2cfe8cbec94376cb81d54c6066a4fc97f # RSA 2048-bit key with e == 65537 and p < q. Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001028201007df2de1548f720499020d0c98ecf931f3036c938fc4c76f9fa479294b2aa98b8b6cc1f2d8cc72afb926c048d1d783bbfee2723e71d13c9b2b96baf0850511b22ccb040f25c82458e6776f7541575a0b9300ff2224dbb726bde235226d48d10d1762433cfbcce5e8c99c2c7d266f71a2605fd42d54f98da8e0720cb4f7f7f70d2668b89cb57fde159ac7922756fd161379a5693168c388b7e1468552f67f896f69740e80e13b9badee87b7116e559c1e428276cc9d4788b0ee25f10ed560daa8339aeb52d8bb2b05a2e1e16e3fb348ae5feb5dbaf53a7d8a318865e1a746374df077d85120b02e3f0ceba47cc734c96ed6dac65f11bde2db2f1ffaec0da5924c102818100c045a3996d1465c73ca839c442b1026c82e418c68a5f96b34ff36557144a86af092b8c2873c42ac08d66e2f471c4094098be48058ed2bb0ebf0beb896f0eb18eea16d475914c901e35dffbcc257f19260819213c46eac7e508aae0114b98770471949f006d42a6c2e07d590e1f5f14747239154f65155daa4bea84f5ee8d2c7102818100d5f20732ea986dd3d1245dce180595a7f48b36c58f1576f6782062a4f1790871bfb2e31b96f1b596c59b6624cc2b56c441e4970fffe70e59c0fca099b598170106a60e32725c35401271ba2216039c627b18a2e319331c1444238724ba7c80e2f35d13fc0662638b414f7c12fe66db22328fa892a4b7632ea2c24f6b06fb3535028180448f5073e0127aec5d73bb0d819e6eb7d4c0931910b45f1f576df9ffe00b67153916df26798944995e92867115b40a7c8f3aa2a1e0b8c1dcd340e3df20cbc382ab7432942d9878775d4c9e13c0771eb79201abf93b6c7294f7cf3e90cc3cf48b9018a7cdd6280320d03dc228a805165d2371b9689329d83966529cd0b91c7bf1028181009f1bbed4d3f9067ca7a63709057e69bd1db5c6c707d13bc6b2b1cb0ac5f6701c4027a694a71e1d2102d6be1111b20d762956fa2d50f0221107e01904173403afa4a52c1bc246e6e73e904b8ffbf535815bf0877b030baa8f3bd97c31096b7c62cc0065d361601c8dbcc5830d911b274ef8713439d2bbfbcbfc092c0cf9852b1d02818058e7d95fe1a95fe10f60b59eba5c8c28c8eeaa82956a3035f37e7570f5ff91a104a5df77ba13a09bedb22018e2ac7461471b5e719ab202032cb3905391b7d15c74b36aff25c83987726e0ef1362c1b8f4f8282f2c4fd6a38a9a15e63400b92bfff31cbfc375313dc40f9cf19e031ededd32c47de6b3a99696a903638c4d6969a # RSA 3072-bit key with e == 65537 and p < q. Input = 308206ff020100300d06092a864886f70d0101010500048206e9308206e50201000282018100a893194cf895bbbfa58f2863ab9bd00671cf5c48604efcb175d6f03a55d32a991c3021d52265369d45b94c4e80210a5d8d3d0738fb98669f1256d406eabafb67ad028de2e25909cd87b723a6f29eaaa46d77c74e998d3ca635ddb71335c2d77143c61d1875b0c6abe15474dd61e69fb0a5bfc381f8ffc251be4a03ff9cdebc6d890cc5d1e1b4da6115afd7d4bd9ec8b12361158eb5526cb9ccd5c1763862f65ac0cf10d7718efdbdc6f4e23325b129625d0e87a1136dc34af0f9e0e2abc7d617abbcfdb8f33d04a2cff977336df6c3956b5b667c399047d720da828370e601ca3e032a81dab5eeb9a5c37ffb4ae255fc0a3093756e9fd039faa87f2ccd396d8c44b51dec14d7a0c00e2a0735102d30ae30edf41e67af3bec5103f7ea969dc1222a0b7fdbd622788aef9fa410a9640312c33f14c322ae3b7ff2dce7c7440e9ea5f2521bfe75e206b16ea5176a7e4b9a7ba326fdc2541bc56fb6b16451a11f23f50217b61a277e3116cb65c6aa40615041e20118bd10fad88602bea3a232ca12f102030100010282018033cb3e72cfcdf1a9a88c9bb443fdd3a4a74336ef65e7deec0770cacea1a007ee932296c28d96db78e6fb4fdeaeaf7827d64571faa812e334ecc590cfaf3f540f3eb112372ba47fc68e744e97f4e39b3a7a07db4ce310ea1987635fe49f180669de90f84f939984f13a826085c496bf69df03546692c2c249ab55c274bf16107ef724dd82e6fe523a92173d113851990813feb848e89d329ac3bcc97c3146f6ba5b9343716e8aa89bae8d7f1287fa2ee4f2028cd988c6a8c255d7f0a8b46ee9f04c36250f4a66b148415c83fe991360231e8f267a9400a31111fedd19aadc93eb0b6833e556c2c91e2a69ee6ae0462eb6a146e1d30680f02bac5e2ec95879e9a42b05c790baf87e6481f0a703a4897a221f2f4604facb45948bef592d61891fe55e5c52b7a44f01a0148641dee97eeb2efd96968fd82310ea551184b4c63c48039e13bcd15abc15029d3c5bd41665895bef92e12513e06706cb03221ff5aa7f6aa64ebfcdcd6882ad2ec765731ee6452d6470a7053a276f51b7c20b7b54d8c0010281c100c9bc1dc851bcfeb8e8d33063be3d8be4d09f816c0567a06935c7b8082dd06c1f2ce9eba3fdadef1a77e087e05f76bb05d625bfc835dbc1cbf5397cdb9e5f67b23fce81bfc7b27f2cebd7db80b8a696bd57b3eae3f498a1b4782f8721c12c685b85ef648575ce81010fbd12e6bbefddc3e073ac309dec8d9671fbed47344b8ca8fb90a974fd4d306c92f2a2f8f6db36c57780faf07baf850454be836c6cca4c9e35327d84babcac06c14ea3295fbc772319d9582ea185e4a685ffdd1316bb2e810281c100d5eb7ff5b91f4068cd2739c0c5c4e609839e07b950307f55a5b5892d8ead0b3f77c8657204cc320e9b52d67af2eeec787dea098ece882abf6e93957ec1fb753f28e17de205a0e4967c7880ad9580b81a3a2315e3466f639a62162e4f0de8f009142bc19488510b2e0e2ef86f0be45f4efa51ea794fbabff294c3c40199c450221c99707026bd1de3649c10c37a4c493fab1aa9511ed64bec38a1724c8af4a9813de028dcdc0bde1639a1b6a4b9ac0480cee494a533fff8214de959a9a6bc8c710281c100c87a9b3a5d08ae3742a1c60009aa0e6159767a5ec84c405cee26495c4f734650010982b4d940c6528e79636ef64ffef280ebc8d885b59bb53e416034bd01e10282688e06f1c5109faacd3c85827b83682d454e94359a8d70d4d39ebe4bc3fefd9d6fd77cce23678e8f7e7dcf314be21e6beb685e7443063e518e643293e4d4a7864130366418169c7fb8837f598b66b5fcda0007875359a481374752341722e742c4a77a853d44d3fdbd5166a78e9af31618298b45d7d2f02e50a4f9f86812810281c100b05497bc6fa4f00db315a348607cc5f58fb542bea0f7e8ee2b52b1498932e073a783db031a2b4b13b93a962af076bb1b3307286bbb98884c1594b784add75db4fb38abf0141da46edb18e550b04c52f4e3792a40963d990797d49ac5753cce275da617c21c7f594cd44a296437943e6fb66cb16edfa69b3415262d39f88ad656d7e62ec573592dfad362c57aac2397b9508c00872a79104a1e000e5c43aa1ad2bab33c5b99527af52cfa3cb819884e89f2807e7a929b6ae7e0f5f97f9b3e0e310281c100b1e8aeff349d9d187e73d86f166a9703a14bc93ec599b203232027a180f3179ed10a51d9b482ef12f218285d2e06c45ae984995405cdbe71e72170f4a602ddd968c3673f1d5262e69eabc3106553ccc07b8bcd8306338346d2fd2bf595d96c48df5f959dd9384561014c79e7305728587bf01821eaf1f85e74f4365fa1492a30cf3ab54cd1080da479fd834bd07c1ec5e72e9ab68d855845cae166c8f885fdc20e946d40ec478628f4498ebc18e37204253765cf41bdfcf0cccd2ca1ef06b6ca # RSA 2048-bit key with invalid e == 3. Input = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100bbb126534d64a3a60711730846af3c2f4cf4fee28f48e7c9ca2b0b5a6c8ad51e2509d38b87ea6b039ad3a33ac57e78c444d86438b1938eed73219cba33b06454e429330ce0fcd356624630c58f32a7ab3bef8c7cb3f9843b09c3e61dc92329df330f002451b5910cac3e7b513d3ca1cd58e39a5cc277e64da395058805f69f19bb62571f28525c5a7f781055ea82bddcc8d10c7163060e2040aeb390e6cd8cbba216726875d3b2975fae77d9d092a9e65f545f8a1e282c7096b3e8293d47d15e656717b0ea2d9a170d489c2f3b596cb745fd3f587e10cf3ff043a1f42ed9d030d900c02676761e70e2b5a8fd9387dc658cc95b1ac3ca83ce3b352d6e71514025020103028201007d20c43788edc26eaf60f75ad9ca281f88a354970a309a8686c75ce6f30738bec35be25d0546f2026737c2272e545082d89042d076625f48f76bbdd177caed8ded70ccb340a88ce441842083b4cc6fc77d4a5da877fbad7cb12d4413db6cc694ccb4aac2e123b60872d4523628d31688e5ed11932c4feede6d0e03b003f9bf6556ac08bfb5829df7f6baf74772fd3e22ca571851c5a0efe8330ffb45863a804f870f4535da65761c81c22decb3bd8fe55fb250b09fce0f12f1c1a073ab5349a8b9d8e3fb826a04f441479cf3b4ecb7d61aca60f44a3f1ffbe2bd615cb65c29b11beeff13074c06356ece01581b45fcfc2cab27a8777a631b3361763d59b7f26b02818100f6434d514907d7c9f522c84633148b5e2fccf3bc0fc4e6a5c5f7b88b15a062433dae12c53d5e54e2a47427da06b6ff4e2c4635b90aa8887b365b96e6485584f64138c39ef0d9108dc8f569f5cdac877c5d4bfad3a89dbda8f5e88d05277462b2636618c6f21f845ebbca664f1c7d5534c15ff90f5faffd712ecd2f130b8f808d02818100c31cfcae4f06979c983cd5248af2554a6981743aaacfbf9e2e1f021d87d56a0119d177d270dd2c89f8970b1cbc3f52c02382b0c823ca8d58f5b5e09573f55deb0d68fe18b5b5821ae267c6cbde49d179c081b3166614619d263f02e3f5db2ef4cbb428c2f96490c200b640aa4e218bb68868a68eb0e2f1b43f55ccff5f2dd3f902818100a42cde3630afe5314e17302eccb85ce975334d280a83446e83fa7b0763c04182291eb72e28e98dec6da2c53c0479ff8972d97926071b05a779926499858e58a42b7b2d14a090b5b3db4e46a3de7304fd9387fc8d1b13d3c5f945b358c4f841cc42441084a16a583f27dc4434bda8e37880eaa60a3fcaa8f61f3374b75d0a55b3028181008213531edf59ba68657de36db1f6e386f100f8271c8a7fbec96a01690538f15611364fe1a0937306a5ba07687d7f8c8017ac75dac28708e5f923eb0e4d4e3e9cb39b54107923ac11ec452f32943136512b01220eeeb841136ed4ac97f93cc9f887cd7081fb98608155ced5c6dec107cf059b19b475eca122d4e3ddff94c937fb0281805d84a6c335b77a5d2468b81cab4ab69198906454bb499b00c8094456b855987dd20a95a5be48f21067554b86df117cc9abab45dca04265fb589606b2cbc074808f39862cbf39e3efd1df44e04fcd9f778574528fcb52f5b7e16066267cf08d29ce7a29deb3d9c3671634af765916a865646accbdec557d970de3b242e3450167 Error = TooSmall # RSA 2040-bit key that is valid, but we reject it because it is too small and # or because the private modulus length isn't a multiple of 512 bits. Input = 308204b9020100300d06092a864886f70d0101010500048204a33082049f0201000282010000e978633c731dc49958124170096c8dfd536977a5ad78051520be93de8b3040faeebe61b436d02e6015d78dfa2280a7a1c33b87b16b82b367e352545a6de6ce46f83dc0fc421c2997c7149f9c616cd538a311cdd8c7f5b0959c3a9343090f0ba87b02dd44e7dd0c8a2eeb0d7ad2e49527d5d420b72b52301e7ea2f6f18c86a05c8ee5a20ebac5a78f76d4a1443db1c399375293e008ef34835f873f0ccfbb3005d1efd17ac405db1e86a5b64ecfcf3f02819818802f122d1a889ebfbb6658d3d63355894a4141d1aeb4dfcbfc5bf6d2229532326f73810364a42b7cd1b71f05720698b74c58e5e1fdc364f8403f6ec825dab667f6b26653e76f6f7eb8d98b2702030100010282010000bbb8bfda0019845563fa31c17ae25cfcbe8fc3d3643a67a3c8535424113878570b95ea8b73b34a4699e95ad02fe3d06581cc20dbe83d0c31d117069a3b59e4ac2db7c1af531cbfd8b90afd174942afe2bd43788700a8ad166eaaae73ad19fadeba21e07622149b9b94040d2f9fd88991a11dd23c5549dd44f7bfe2dcef87e3da55d5b0c92e321a992600b6aa2205b90f03cbde204ccbf5e4ae729c6a4d1d38f415f559b865b91996973a05103410842a84c8e19e8b4fdad94d498392dbd521691154381ac6cb5bc6d180daf72cdbc06a7d42a2f503cf44ff804b1b6004b2f4f058c2f20712fccca5866cd107a812390c9b2784d5e199b270bcbc0b2ca3f2410281800f5fd9faeb3fc7a0d6f4011b731482e8ab1d5fac10ed36241d95a28fc298e3bf41e75aa9d0d967d79b857d7156496f073003c45ac8d97136862c103a8e2e3d1548e308b4e50f436b86a236b0c15cbe50d812819294db7cffe6f655bcf50113ef79245fa94886be820ee043d1e4ed9984ad8d8157610c433513a96f86398a7aa10281800f2f85807ba2ee028bdf1902a9940629b8844797d41b922f91b81dad222089079979db61890295bd20e02fdc7d8ccf34c569e328abc83b0127ab6a3ffead18f1e3172206fcf0a1b032dc899d142e64c7e5ef1316992f537bef6963f4304a5064d67e8bffb7a16ae165746cdddef21e531ab19fe2c03940ecc9462da340c138c70281800a3ebd6b4fc8b8a69d970c05d6b21c6a1f5cfb9c15cb7d00a4164ab5b1df6024db2de864b11faeeb265fd62fe86816ec9b3a676677e12e683f10addfd74f48b51e54ec405f43c491aaadfdf3db668a0c25706f97d64a4d09da46dceb85f8a9e832b9e2655447363c44dd7d5429518bb3b6534d9584be3f2ae767494210a60f0102818008bf7d8ee8aa91a651e171cd00d7cf3d1598ce8d7e996b7b8fdc9aebf42efe01acbe704d1ddaa95c4ca619ac517f5e96adeb33fb680a6f435910fca2651a5eb669f6179a22f8948ca6a0397e8df3b4071c44bfa0531ada631926837856a158f2de46046c89e2a969b34280bcc8047ec7ad270a4e5c221f6ec8fc6eaa0f51c05d028180083e0d97571b3ca817e899b3699cb4193d331b4ea9d53e2be2a5c81985f1b609d58c15ee596e736e5647c2a89d05c784836182f2874d83c8648dad4550ab51232e88017c82ec6ce8612e77f5842a5615bea94d116bf4ad1d0a478034a3da7a467522ce292fd30b1c5c0c51e0888dd4397d0708a216456935cb2de88398690320 Error = TooSmall # RSA 2046-bit key that is valid, but we reject it because it is too small and # because the private modulus length isn't a multiple of 512 bits. Input = 308204b9020100300d06092a864886f70d0101010500048204a33082049f020100028201002d7374f1cd461fb28614fc8f5db38154717c8ec36f61528768ba78910d78042e4655566aa56d81de67247a85a153d14eaa651ff3e4082c6f67b587d7f94d4d2991c59aba31dcac192061811ca39e6cef73169df49283494eeb51d1f28f4438999f7222cf3fcf17955a155ad901c7e058737dda655a17d0a78ba9fb69783e33c208d63c9f9984a2c612994f515d5fd9d71b18439fba6b092d6f8c8562a0e2eea605a218b32e8f84c4dbb8667bd0a5ce88213966429211fe2fbad80f5ece4b70a4ebca26981e5a27d1468d7cfc9c67e6d6eb2c09b62cdceb8e75a4192fe68c15b579d7138ac710e76a63fa0866274c85f94ff5127930c1316def7e7532582bb6fd0203010001028201001e7efa7787b946695d87d5524897b9ee33db545b136fa4955092d574d629b1fc6e9ab1ca0ac7683d16cda61be57c3cd360874ba2345dbb9ae06630089cb0de564705e4648c323992fe640de26e724d3b78e83301b810b8ee67fc55374023912a9a8e5586e3948b895d91388ca4a23d087c2d748d4e9eee148d24779973e1a08e3ee60a3283d203ad4d1d8b92070f180dae0fdd0131735872b1e5a3bd6c25b02cf44c396b4b046ceca986e871d22c60b63f0ff6681b89554309dbc8a03ca1020e64d07e42a4831e326ba17ce44d0ec727c01b6832f07188e6b3c83a999e5d3922987350dfbd994883d3c841412c53eda5b9a131cd981f87a0991e2055749bf06d0281806d352d2ecf4b613356b19186c1d4a110910235213717edd29e1131516e2fce9b59f4ae2a9e2915bbe1a2f5f10c59ddb898ce7ebd1f2a38d7ec52baa3cca0162266a555ac4c8bf4c44a2e5f29449dad674067c37d3e1b84c978947f5ef96761c33d4845a04c2a7106f66868e71982b4c95585ad727e5feb8cbfd479b2c0b5b3630281806a8b553d7d109b1332b2f397bebdcfea592ca801f8abac7da8d3951cffd89615ed588369a16b33bbf256661f68f8397963c33ab3bcea2d2a7ecc7b4cabd0840145a704ea1a7c52eeef57cea22ab7ab4ffd470a6fd0ff6b285f9fa6f0720e10a5a75ebcf1f84cfa20d34db34e245460023ab3b2e1b7aa57dfb9f61c61d1cc6a1f0281805b3a4fdb49a9c3b21a5acda1cfebeafca6d63c41d9ff305980580665eaf11edbe1e2a757ccb5af853af162189263c3f780170802beb50bb53ca2c36d2ff40f697f6be04cc5c928988d0b7dcd4097a3929c57d2139ebd6848d164e39e182447a3cc5ec2632d1d4b3c30bd79dc8c10072c25383d7366a48466189dcb680ad9fed70281805ca34f774a41e1043d45d9856c64afde2cb12657a876e460d2253df6dc01dee5abdc154f07fa251e5ae482a0f6ed3553f5c92f464e9132ba4b4bd23d64fac57c31aaba1c2ef1404ede2e73cd0ee569ffffd200221f0fa685913748b8b202c6b8b2212e9a19721cdde3bc2096660233045d3417ea287ee52ef30b29bc67e59bb302818058ab3d6815ac06d311d3364f8da1ce2ec7616864f90cfd4051668669ceb4ec8e3eed35c83c48ff18595908e6d40f0017d14eb455bdd5c282b21fadb76be331e6bf66d50020775cead697cc62d07cfd14ad1d383afe3b3f7d0dbf181213ccd3df42e7e4481e653333debf7f5523a46722e1231327ba57374c4dc605b04822a7af Error = PrivateModulusLenNotMultipleOf512Bits # RSA 2047-bit key that is valid, but we reject it because the lengths of the # private primes aren't equal, because it is too small, because the private # modulus length isn't a multiple of 512 bits. Input = 308204bc020100300d06092a864886f70d0101010500048204a6308204a2020100028201004edbbf2909ee78cc4ef9914eed0bb1ce5267ac3f141c69b288eda901f73e8e68d4184e8e62b23e10e8fe3da44a2ad6826825581b01741d5cee01964e2561d1ede3cf813eeec832b6aa43e31bfbfc9aa3181cf4d729860fa5bf6477d468374640cac16dbe2c82f8d61c1e3cec8e42a18cc1e3cbbaefe21b2c8490bf3f9dad6f90b9297d44a32899fd88fb9914f8843cc1600ce310d69ea52c9bf26bb9ff030b7a5b01e1809227f59e58a3531559f520028e50bf2e21af4fe53ac19685661d03c0ac75774cb518ffd85f778b16b254b83065bcb09dd4ff2e7e908aa1f90e1f99aa94336844ba04ac228b6edba3f1d2e602868ef042a8ad1f6bbc259ed86e5a06ad0203010001028201000c43318ba126bb141227cec7b626be6475fdf713ebfdab15ff22edc807796bcdb3458059b5d13fc383679d9041943dbd1392d30b88035559910d202150c0d0532cbca4bd73862014b58f4eee9815a4ba3dd2aae41669e95efdcf12af2df182742ad33f4c76417b8e57daffe04d12e16a30f04a4aec687d8f43a1fa8b5aea905182928441401bb9dc7946806b7f21aeda027974e32b08c8d31a60283f36b4fdfaac2763625e792b9dddceebb995a379989e39f79a5f07a26d4cb87504df0e4dc283cf44f0bdd7d313d33d0b1813b53e702e34c0788792ad72479563fbe0f7bfffb7033842ef62456d1d087399fb7e425bf92f78b438027f9a8c81305bbfde8fa102818100ced2d7908326a8085b5b05a46c7933c278bd6dc32e941b1fa5cf78db252ffda3bebe5e8a824f667af2c89d40cd299d23bc898926cf40365ce4c4d90c173dc372cf392d1ba6b9f92ec77d69e59aa37462e80afc75ed491a9ec07ae9464a478f4b3593f1e518271925d13cabcec9eb491257323b6500b2f15c3283dc43ca3e45b9028180619bc84ccbe7df0317658039047d6ed73b063946863498120e4bad94654fcf12447e00c4ee2bdb0017e2f62013ca193cd2de66ba69c54024db2e4233658d1cdd35fd98976d291ebc86bf77334871548c16403801380a5afd9ac3be64d177e80583ad4589371308e44c883b93f7711980e389c661e5673c875bb7feb1e010029502818100b1aec3911c8b664a9fa9882465288f462092a52ccce4629502cf46460721bea72164cd35f393a13839420e8f3072f2d453d258e8e59e85d5b29846dbb34fd58cd9e8860f3e62816825ec61c0e6e44c45f8920fa8846d8c981c46bc082e226241bbcad942f74807bbcc91720cdabdef6df949676b7379480fec3a0a4e96fe7ec90281802f38671147fff7b28e2a0b7b0a020892553ab090beb248f34b392f534023f900546444c90093f4d1b9bc91e778cb67a4363b63a541302cd4e7b81c4cb30f2e6c92070a400f8e3a11687ace16e02ffb7ffdefb968558d24f1d56267046d15be0894e8496095653f02fb4758d33f7cd6a2b4f15d28d50b398c1e420814535a4b7502818100cc6fb56fd8b7b3db0a4171c662a0d76efeada4ce0dbf5891b3b51d60efa31bb8f7e176417579bc35a751de444a9e3479307af73ac1ccf0458d81e021d1e4e33a5203c5d01e5e397ca26e62174ded0d310ca0c78685c17738783c9f06acd286f009a623cb4e651776ff9adad81a08299144c9ef4d07fd3ac1408d9c92c98d9379 Error = InconsistentComponents # RSA 2049-bit key that is valid, but we reject it because the lengths of the # private primes aren't equal and because the private modulus length isn't a # multiple of 512 bits. Input = 308204be020100300d06092a864886f70d0101010500048204a8308204a402010002820101019129387ed5eafe167c7c575ad391104cdb7ac95d25c2b0e3699a98f477de9729755574b112f552b28204480a061cf6a6360e0959000cb1b175301ee7d7accc82735c2388fb7bbf2673a309e25e2e4b26f046c9dfd858e78de52bd36991e0fc1a28f04b9ebdd6b0ab8da95b6467a7869b4e5a19dc1bc189b666729f7edb24a64965f53382ca45e20bb0a315439f7bead07a0bea88cf25a179e2aba7ee8584c1fa58e731246fcb4778e6f9ef455d0e50fc60c044f7745a4380b9f4c82dd4a64dae636461fd351f2e871477d801833bf44e7e4a7e08691776d263433c19d477290f1b844f0555c2995b22525b57681962332271a3cb522464c27989ab7c943f48e1020301000102820101011c7c6b00279bfa8cdfc31dffdf416499dc9bfae8ffba4dcf3838d677a7fa46a0b400e23c2101b09fbeec625a1973b8c6ae56cdf23bc2c4d0e0163c14963288e58a01b18197366e9c4a2d38f93b69010aa022d34ed71255439f5db11390cc487c14c4341c62ec3965af9486a7718ab03ebb15d278f18612af337fddf40c5cb53e46b99d7da4b7d8d9d586be8add8b0da6756a301155f2472b484c0ed8a23c052dcfe7ce40e99b6cae94edd41cc6a24fb5fda50b5ba3958cd3ccaa6aa2674cb9f492e208c8eb966f1d4d9b1c2a39efc324a41b562ebce4cbea0af06a6bdf19f4c45aed56efd9fd892ceeaa9abd3458c151a83a2b80075e1bab92b388a747baa64102818101aa9f633cbbe8135713302e9b0d22bfb7589c710a6516d25521550d98ee4b827183fe8351285387686d15abb3226813f5ec6367fd9138e2f5e5f248bacb3247219490092620f3660c4d7e091c5e61cbcd4992fc10441261aef9e80d4baa74f1fe9e7eb358c5098693954701a62c0309aecb7a32f0a763988d6b5fb26b5be8a07d02818100f0b8b228a6ef97211d25f0962132ec78ef48f99877d49d3b02e969a34b72eef8e289d0c99b8576d0e704ab27cb908b8c791ae9cba56340ceb9ab13436f6d19b07f1f485d8577b72f6bbc42b6edef6f9fe6dff28bbf790f26dae0c85f76689a440663372cf21f660cd860967b69d6ba491b58b7ad817eecb7f088df4053027b35028180265fd5e655a4a770b2aa27d70c946e984861320dd44ffc356a1d236ef92853a07056096bd86bc30752a09b642e991c0a87ebdd23c2d7521afa4713e1b17b614894fb6bc74139839961b30f90bcb0a14b62edd4bc85d2fd7466c847c1e1a0495034e382b05e70dfe91089658d93f1e602120d78dd8ac0fbace4d6a3cee2628765028181008155fb03348e4e59105c2e23bbbaacab5d858bf58b8cc4ddcbf6b5377376514790101409fe717b214abe8b675a4c536e2a3377a25f3e30b7e1b2352b6a56e812987aaa5af5371949754d355b2c0415a9885692eedaf5a45a70078e211c719f51254d717bc8ab6e1d40b4c4a5927c38a2c6faa7d5a55a18bdcb92fec084d934710281803e411557b7c0e6e6e296a1d0473b7bcf5f7a71d03c70bd6cadc3a9fb3a11cd0294dd02893ad1c28f62c20294d3893d6ac77baabf7772dd47be587893c79c8d66701c3037ceaec38088b500e2197994e048b1b357f8fffbbdbbdc94c0c82a7cac7ef0136cd6f7795355aeb3e4179eb2b363315f6ccb0a26434682adbbe7b6ce6b Error = InconsistentComponents # RSA 2050-bit key that is valid, but we reject it because the private modulus # length isn't a multiple of 512 bits. Input = 308204c0020100300d06092a864886f70d0101010500048204aa308204a60201000282010102c539e76a413401bebc36a0e09b5acfd299393605da7d25289d085a872fd761b2cf11787287b9c45d285b146e11d8a043c07049947e49f0e89791c99aafa2224d65dd8118067adeb1417e8fd3be306aa6001bdda425c89f691aa1b77ad2c6cdaa890fa764c541e74bf5e1571e7efbee69d1331d5d7544e15d2a7f21de27f268135fb7a4334d45e348d15de362ba649e5bc50cbff86a6775d5d9bdd75441eaaf3a4f4acd1a28cf3d81dd3749a460f87721a73e45adda47134634276c6acbc341fd9c96c4b7b3f6f74b22f93512a39fd4e77f330726d07728f7ae8246a7f2c50cd29625c1365825c8ad257213444ec6dfeef03350bca7091415a3505d5798dd37b7020301000102820101017d721734debcc9f37be725bfa7cebfd7d4f1204d25a609463eaf2f816609c1521a6c9b0b7e543b789f2bdd6115d81cda53b610dcfccf67f2b112880bda4aa98857313b2d60ced4d72112a0e8917218ea0f44ed804b920baacbd80e86d0b67c072c906ec794104e065cc845c2f1292ea15b12d2c8613a1abbb10f8f779ca493b38d5e704ce2644b3798e852d0371214a862b6636fe2d22d5f5c95b794b317438c14ebb28d9c90339f505c90c3fa6ad5430c163c067931df4523490906888f1ba4f55c07fdeb6fe77932b817eaee669f72988a09df346fbcd3abc3b0a6d60546ff52aa28405aa51d1dd83195be0ea21b7995a61a9bcd807d3b0683526b1f79eb8102818101b41a1d8a1fb22acb2f2a827655d9345de5c5c606761d99aa75116d1f50a432079ffce48dcfd9a1c2888b865c92f02a309520291b854759bcca9c4986b85f2c0817e9327bdb69d233f1dae5b52b5cd3f3797c672fcc7fcdf8feb57d2801dc3ca43e4cbac95b919270065a4c617e1e4f11d9a07c7eb87cf9ce7968a9819e79974502818101a05437ace086421b86c6dfc1e7f4ba18e4faeef9ed4d1cc4b6366fb5810ceb5610dc349852b340fea235b0af07adc76ff4ffb91fb73f75bcfd2328d20d6c6c099d4e6b1dd70e75c97e272e3984383657341a8b36978df2bbec2c557357a9bc46cad2703659631dee2df8a61e65841ec80c004adfa169fa0169d476b9253b74cb028181018c3759f53f3ce9a276f4e15950402a52d14af1d2b707c7b055f282393c5421dc49a043ab1057c39ef1de0a321b923652b37a67bec8457e2387d59cfbd891277926f84954bc9195587a798dd01f58947d16384fabded99332918024f8ef4fc08cdcc96bbf3c01b391324462370595d5f2facdd3ae7241a1d8d4f7a161d1b0d91d028181019e24c8b17f33ef0504e0466bd4bb1c787127b19c0ad41f9f0b0741be931e6fe850a34cea8db1e520a7e9b2d59a54e344dab99bc511fbddba5f319f84bc77b34d291f7decd4267d432febf7ce9d5971acf396c80f49599a321830cddc0c433b984c6063e19cafbd715667b7901b39ff88ce6f680be7bccd46a4a906650cc5855b028181009a8f419948a190615b84cd10ea337bfe5fa33b94d2ae506e153a20e6c006c831d025c2fee5a10f67e708631f98532417c2ce89146b279349f9defa5ace677dbf11a9dbffec36a42c0082a912422aa8f641fdc559393276ace5ce985937c3da09220210f381f60eac5cccd0858a8273045c42b96623aeb042d2419be434519dba Error = PrivateModulusLenNotMultipleOf512Bits # RSA 2056-bit key that is valid, but we reject it because the private modulus # length isn't a multiple of 512 bits. Input = 308204c1020100300d06092a864886f70d0101010500048204ab308204a70201000282010200ba546c668d1f047853f6d70ea45f0e51926bfff13167985f6bf6056b1d6254255458e4d2145dfb8fbcce9ccc1433da1d34804953487cd1b45b6c16c51f9c0d50cd0118684a96c8a2f6bf98b14ff417b1d591a4f125cfe04c6e6ee7472d45fbf791729824f2adac8edb9b7bd1c2540da03337369106a2b40de64d1f8ac5f106a3aeaf5eb05c25bda6f5d0e2aabcb5901b552559cc7f95fe46af048307f6b8ed954d205cb583d526b63914d1b9425ecc90d598d41c97297016130b1e5cd2c384a04132df6919dba22216b6f962cfbe03859ae0923145e1f60a92dc958f0b1bc12af3215659950a0d4cd28450b943244f37c6f5cc38e52aad4acd64ac4c933e737f4f0203010001028201012e4367e6ce833508eb500e75843a55c3cb2725952d3f1b8615b83000387b818903384f181a167baf64a1a82cc3975c408418961c2793563e01b504b24cf6e2177dcf17d04d34c2fc3367bef1c77843a9d3ed2596fa5c72c48766e1e5ba47f617b1f551f15a8fe49853ce771fcdb030f1e5c57fb6e27ee355d028b5fc2ec9796c83da05f851bcd5798b1b5b71c27a888f8203f5c642c59642f96ed30a62e028cd806a974e4ef3be34845feb67bd879e9eb6a8adbf0b8fd1d87df6e091c45e411c82f764a5e6469120345e39dc896b90b3b677d7d82139908437cd7695b29629cdcce2f23d75f6406039196963868d62a4de9c7b3f299393aa88d4221cef342205810281810e3f428717de170fd9a2a11fdd057211dd95ed2d39998986e064833a186f653018f8e5230ba9ee0f1ec40a5f7aaef80ff900ba71f8af297806780f0bf0a2584c95fc1b9e326cdcfd58dde68b9535d87128aff2920f01210ad57de059c673f0b34903276a02df0fe05b3521027e45907838ab4a7cb09a185fe4d80d5e5733aa9f3b0281810d1413d14b7fabc6ad1840d52a00ff6bb9346e3931289de591ee9772668dd12dee8d4ae0a7f6a808fb48ba2405df36d39842f3081cdbfbfa2e9111b2792964cb6c7959dc5a45dff89aa1b90f0f1bc4e4819d64b83e673937fe8a077895c6544e875e62c8ad4b9d2a1d4b1ea526458de103d2c8c9f95e077af2a39b63c4753e46fd02818107c50e2618a921109ed32765f6268b201d252f94d36ddd67b6267abe8b26ed1b3ef3361b57b813c121392ea30588387695888525b4c6ea29aff577d73e237b5e41099d9237d3d0ed45b2b691770d477de6ff959d7c1b5486d10975f9dfd5c8f62da24fb36bdf748c1991aeefea274bf3948c2df23469c5533ebd6905032f8524930281810a440f46436025031fce20ddf249b434e7bcdb24738cf15c498fa23b7f7aa48ecc69063490439224f2b264c2700585b0d41d014e05f13bba6721226618ab405e59786bec06c44089913f8ed6de422aec3f3dbfd8cbcb14e3fa1e78bcd3bc496316e924db67042a8aeb5192ed89bc21215671f7806b08bf106833ba7eb6b05d413502818105d0bd604f192d745e6f88e5194b2ef390dc4fa61c230a4862d3a12edb3db48178aee3ec577b156a3b0b1474d14e6a9c59276c21202c46410945c7ce6bcb72ab9c61e2c4bf97e3dd4ab47574aad5ca7e0f94698970c07b60ca268f11551dca945ffbbda1acba78d42e9616a6c7da464959c94b44918e6d41423a0ac9deb368efd3 Error = PrivateModulusLenNotMultipleOf512Bits # RSA 2302-bit key that is valid, but we reject it because the private modulus # length isn't a multiple of 512 bits. Input = 30820549020100300d06092a864886f70d0101010500048205333082052f020100028201202e8314b5b60f188172bd5b0eacb60b94c15375e3df7fe733d523c37a8470acc8108ac1130301167dcdb2fd3c87f48cf8d1a597a3401cde1c64cd115be2f4f03d5cb8948137ea895b1558b8c836ca2bbe8c4376103a6c490e76fed580338a5da6230680855e6659354525fd3e91e7b238abdebb0a12bd8c52adb49b2eba187d87b577abfaeded16a26b8f2705313975f5214cdb0033e08f800c8d5baccdbee86c435882bdd599667ead13b59c9703f8d82c9bf122f70e80639d98f1559ef57e61cc63593ff0111fb7fde3cbd80531e351b41f258585e4e74afb4ec7793982de1d253ed1e479f6942c48f0d0d2674d3e65a547c11014ca924bb3b01401a7e507455a9de56bf9f74b0a752dca972b463b9113b6acdb0a1ebb9b297e496fca0a1597020301000102820120047c9c98d2d12df9fec9896926fc00adfee0403515304f6b4e9a3e9729037d8767211b72ec0d44d029f1a4401c9558abfffd4b5d7227d6bd42740dc2a168236ca7ef1e5440c29d316e23badf85798732c0711988833a42e9e44cbce7bb1113eb9ce159b083e4b7a24de356449cea8ee4ac9fb5c748fb83f7cdcde8525f9d512eb030b52465a34355b3ae81831cb6804c6a17f756956d9c674d3882b65996b27301f4f467478617432c2d4ddcdb14c77789f29a6c866a975c8c8128043a07535a05e40bc625ddcce0eb295cc3b3bfed4f5d5f6fa2bb84b5580b5ff54de7d601533909807c6497da7dd8c292d9bd247430a6000d00b7b02c3cf82d8faf9653b16dbc344b3e2a7e72461b26600720acd3baee6a11c381281e322e79a2088f543a01028190795c84579a2a729defe281fe5339696f8750942e49b4fc6809a66b628b17948242aa2afe65cf5044a8fca45c5794696085a6c20365df2d7d1b3458b47504a1baf869c61b16c7ea2433094905cbfe311d330d4da8fa81c8f86f6d756f5324931941095e832e0da7862fabefa9b48e8c58aa815654be07ab8c7ec4b739cb990efdbf5b9575fbcb3baec42df70060688917028190621cd2ca19189990fa6adf8f0b1f35385312c501415425094c58b7b6f8a9cc641c3b4b9053bb831622231f7be8b93895acdbc8caedf924e61727504579d6e1911e1346deaf471134aed767b2f4d9e879bc63813d7a9647496c29e1d0166b2fbfa0dfe9d93e7de982af3de427c342baaf3bd0212c386dc50c32f821ccf2059875c36df4437d74a64c94c7986672e9a78102819056eb7635afcadb1056f0e99d9749b54415ac1695186131ade9cb7179c09900da5298c1f63640c70285ed7c624eaf92d178a7b8a8ea5b6f9efcceff01301643274027b1a55129997e97b6fcbfd41c985c8b65e9cb2eafa99a9563d60a0788587a6be423f6dc13177ab9c5f0fea0bcbfb3f95a6cd480cdc985f47d3ba57f367e502aaf935a4f1e7dfe6baf680ab301ebbd028190104ba34307da0b1f86481beb813864b97f2abde7d076ee53d607623414a6f718a58bbfa8301013dca83cd72cd861732180fd5c2340554228a92dd16a48ab44f9ba5a0f4a4b286d962778057436b0bea9017e316809a54e1fc6c44a0a2abf10c62e2d2284ff992020a18491117d9fe6abd62e62641ad73884272f094625e88203053b8cf76cade43511fcf8b6035e0581028190575f40ae0aa97cf56c9f08f6b9e418caa562f9378a17ab36b8e6d503f3f4f975aeeccc162e8870a5942dd2ca8157a208faad72532a11e8f0d9bdf0ba38f91585f49f8b51927bab2fdd22bd99544897a08181e32fe7993173030a2c9fce6c219f44299c96137f9e060da72637546e6837c81cadeed9137f8f18ea5c24025f85a118404b8bdc86626ba24b05e081197390 Error = PrivateModulusLenNotMultipleOf512Bits # RSA 2303-bit key that is valid, but we reject it because the private modulus # length isn't a multiple of 512 bits and because the private primes aren't # the same length. Input = 3082054b020100300d06092a864886f70d010101050004820535308205310201000282012061ca8d93087a5eb0f9a4e5dd47f62651673943ba5f3cfd6aaecbe355e6f37b422d7cbb13fd0675bdb22cf0e5906a224a83701f3256a78f61ba294160cb212dd5a6b42bda1a8bbfb7b21863dcc8a7aaf2a473dc71a9371e8f16e5dc77b2c4025a69fd27c60c7123e33d8c8bd03398566fe99e7601378e4acd97235bdcba08e388107cfab48c0ac6cc713aa09be6eaa4173bebac4141fc8857e09cb136d9e994efdc5a42a2dd2cf0a15a8f67ab8bf2ca5bfe728bbdd06b1d1eaddfa238d28a857e1b376613cd2260bfa7905300af58f8a14e7ecf41fc31cabd45f7f4445bb00d86f15912bcb730216dfdc656b57b94ee5f5c8b3000ca80628713332028b6d48249174fc8a0bd0ec2917b76218764070ae24355c31eaf389d3403d802bf3dc42b7d0203010001028201205268fd0804a4033a871744b3471a93ce13fc392c4d683b73751cd357280ad63bbdd398604ee1ebc551eaf793ae3112f6d26f618aed65c5ba28c4ed98a1763387123651a23aaebc8114afe3304354b1064c3a6b72c9946ec74d17a6c4a4bcf3f2b7d1247c8d2da77daff7ca3749d3be3c0f977f80a50ddfd203e5435beed6e0d0607cc255f6927a57fdafd77baa8ce07caa191b77c5b2b725636fd252f9246c4d26d4734e472e3884a0c205ef9e947b8882f9b27d8b3e305231757826b900aed455252552af86a1cc0f9f405126272d4e86a5b3a4539fa4ec46d1737921ad5a47046a9b2e1fbf9e745e802155b2e8205286b78317d5855494aae4ce94874c527d21027d11979bcef23917eef81bbd3e1fcf7cb04f8b0f61083acb08d94ed990cd02819100e6c1fc3765e9c9eb83316e06bd2e910f04cf23aa7aa5d303001db15f93bfba4fe28f19205499035be6d2c224396c9d669897dedd6a8c4f399dcffdb8181078baddc34d159a10741384db2a1850b4242a8f63b16c5478b72fbc17efef4866a5ae156e4b6222c86c2f4e370a55c9690f20122f6cffb37a1aa71d848bb9b7b84116a511ba76dedf8743751b842fb140ca4f0281906c7d0b982df2ac5d289aa1925f65be3c562373fc8f19171b53d85ffc4989cd30442175e423d4c106cd00e64f3108fe3f8cb3dd8eff6fd380334baa0e4372d98755a82c6d02e63443eb5020dcc2ce6e452bb6c7434a9758f1cb33b9ce6148a4bed5f042da4a14cbe83d161c26450b8c2f0fe4267d7ef0499b4c7b6407aa7e66f2d1ff5724a01ace5d30a3bc0bb2319673028191009c9e73122290b024b2119d8ce36034c24dd04d73caf4bba860aec69189556b1e07367aa64fe4debbc489ad8d2a9086b078c73353729ab2b6f75e90e51f2826d925e5056fb0f693e21f9d251005ce8e71788b0083f73d4b901188e9a7adab45ae470b6a0cbc70edc499c08fba340ea35e70195250a6bf2c51da9df8bbdf6f267639293436b40460e92f15b2fd2fc03acf028190157424f6d31f4a36a1f0f2429fdadee3cfa4f32adea177904fe45a16e9f3f63fb53968b6d4df1dccda7d730df6047142dff031c0358347aff274e40c2e0a6839fb1666b2a8001e15d052e82cbfd952b51b0fea17c488696e6760b33dbcbf40d4fc39a6fec3e798eb34294b27c63fa2592c2b51f13f49054550ba95ed6e29d0f1f3d52ac67362d9ac54120cfdc31f4b410281901ee70df154d97ae00935532cfdb43c4464bfdd0d6f76712fec6ae76f2a08f37f48eb2d54a341c023a1f79b143414f79479f5ace419ebca650a133fd6fa599dc3754851e04a5128bc007cccb1116339844861beacb1ab660ab629fcf0ed70ec41368324848f9fedc296c7104811b85141dfda4e7a51af43483e133d557c906b75590dea5480c2a3b7ad881ae6de3047f3 Error = InconsistentComponents # RSA 2304-bit key that is valid, but we reject it because the private modulus # length isn't a multiple of 512 bits. Input = 3082054f020100300d06092a864886f70d010101050004820539308205350201000282012100cd1d23382a2db0444fdac845b1645182df1ae59d14830e6e4fa41ffff1c1dbcb63e8cebcbd8e643702ef0ab6953d65d9e3138509d5be4fdd15aaff1ccd7d34619ce713bdac14838d4a25fb561c6521992ed523158b538eb9dccc902a7955c5f568e6652fa6296370d589b5acc0ec1cbd110b2506ab73d2c9180c77be49cc8c27c4b06e4a102c60414129ed8644e613735a1f8f5ef874a50ca7dd6c42cf5f90ae745d59cfd4b47bb3c8d86a0c5aad1d7f306343f8b12fbc3ebfda03a59a638dfaa519e241c0fe728322df643cf20eb85134ea7625b8414029ff89fa44b4d8955c43382dc574bffefe4a5f3de5908a4d220d525e85b5774380b244ecf667014786c14cf53517c5f15179435c81e97e46e83c20c21e5ac8922544f1c39bb20571b302030100010282012100878559f0d10570f221a4d7301cfdc0516ce193964ea82ccfbbb52023767374aa94af8c70edf977c3551fe57f2f69eab2a4b30ff2a893dea69f9b64857e4bdc61264f131efde46beadd73ecf53f3b9e905c7e1c792e9e1dae35f1becb217207a29715ab036990ed0fef36d69f76b44a64ad2f24de9c47a19c96541e85ceb2e4639e34481a8d4714ade8c53017c7cc104ab6b0df5e2100f42af6ee1a8edadd726f3303321b9d697740b9ae11cad24f5a9edd3dfe5eedeb03eb5322c7725dde8162cc1b5c4bd56e07fdbba2b75b414efe84ac12885350928d2f859e2803261a6f449f92810eda199fcf279e780e2c47aa119a7b0d7b7729a0a0067f3d648db50673042a27f2f714d335c9aa022a2f51b9752dbddaffe039f5ba2a9736aed89cb3c902819100f0e35612fbec84c21e07de8f8a7f1c82bc1fe9d4e487929d88c925c352750dd4ef5bfeeae293f44437d3da88cd377a3926f621f1d92ec2f5b56775fc4a234ef1083ce3fc309bf6974758891e3b4d5d790d84d22b839adbe2d538668843d962a9ccb761a2f7d1329643796fdbbffb9d2a3b06f31a62f6ea24ba96e7f827cb66c4ceb763aa036906cfd126547d18b57e5f02819100d9fb446655a1eff75331b259824d3f1e1e845d3d6f385bba360424ae08ac55beef743b6aebc5f4028dc218d5eb5c31bbfc53a0035e7951ba9014c8e4e6ede6d21763272770058cb8ecb7d995f6ec9cb34c8cd63455eb832ca13783ec52bd789ce47010f141d3364fd6230aabb0045596680225fef8f0e7148c1d52ff630be6bca36ca3cf996507ee3e2b6d618a35a52d028190767d8d0067954f34612b43c9ddb96adfd003eeb47ef9452062817726ddefa02f26d25cd15344adf9c4705c65c0745295bc598416ffdae5a1916ae3f986ca59716cb8eef8453ce28e45550295b15bfbe7a8c3b5d21bb95801fb19f42d811a7452cbd5449cb243e01b53f36f176c172b96f35416cedaf153f95f230dd5de554a26f2fbf8754f9a20f4a68fb12d9bb2e307028191008319d431981f252c232528971cff488edcdbcf183be43186f525d8c9b2fdb3347adff53c81413558b3d9a10647dfd329b4c0b6e44fd5b789f54e0ae560de848ca6f443803ca799d33ecbf4597581295dcd14876042acbae004b656e9b379b128eb5b5b553eb9c15892f9d059222bf92dd4b03619fbaf27cbfbd94729c2704dfdf66c48b97b10808c91679d09a50e4ea102819100835e751035519d3a6c0a6cddfa73d928b5ea0c51eb7ba44c34ddf148edb1971e436c1438ba996c114f0a545bdf3cae1be3da1ecbc6859fac3ce04a7b1beac6c19e5f032ecc7cd9e96e8e6fc2241911f90ef0a26b1c8b9df24e324690f6be4d904a7070d9424120b65c8ebd733a97817f943d4c697dd931e66c8a5eb0bf54d813e0df978828897bfe304cdb799728cdc5 Error = PrivateModulusLenNotMultipleOf512Bits # A valid ECC P-256 key. Input = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = WrongAlgorithm # An RSAPrivateKey, but with an AlgorithmIdentifier of ecPublicKey w/ P-256. Input = 308189020100301306072A8648CE3D020106082A8648CE3D0301070500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = WrongAlgorithm # The AlgorithmIdentifier is rsaEncryption, but it contains a P-256 ECPrivateKey. # TODO: This should be "InvalidEncoding"; that would require delaying the version # validation until more parsing is done. Input = 308181020100300d06092a864886f70d0101010500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 Error = VersionNotSupported ring-0.16.9/tests/rsa_pkcs1_sign_tests.txt000064400000000000000000011070331352416253600170030ustar0000000000000000# RSA PKCS#1 1.5 Test Vectors for FIPS 186-4 from SigGen15_186-3.txt in # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip # accessible from # http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors # with SHA-384 digest ccf23d868984de1112f2b6d089bff30ae3aceaee371655111a6e746487549a5f8661a7f43b9333b3d3f453068140e1cd # filtered and reformatted using convert_nist_rsa_test_vectors.py. # # Digest = SHAAlg. # Key is an ASN.1 (DER) RSAPrivateKey. # Sig = S. # [mod = 2048] Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = c43011f3ee88c9c9adcac8bf37221afa31769d347dec705e53aca98993e74606591867ccd289ba1b4f19365f983e0c578346da76c5e2228a07e4fc9b3d4807163371a52b68b66873201dc7d6b56616ac2e4cb522120787df7f15a5e8763a54c179c635d65816bc19485de3eb35a52040591094fe0e6485a7e0c60e38e7c61551 Sig = aa3a4e12eb87596c711c9a22bcabcb9dadffcabcecbd16228889e9bb457d5d22571a72f034be4783384f43ce6fffc60534b8331cdd5d7c77f49180bfd194b5fd43a508c66d786c558876735894e6a9300952de792f747045e74d87fd50980230707a34a4df013ce050bbff0d6f570885c9c7bf8dc499132caee071b41d81ff91b8ce21aa2f282cbf52389f239afe1490890be21f9d808b3d70b97efd59c0b60e466088bb42714f212bc90db7e942ebcee60e7b107fff44fb3564ff07d6d02850215fd357d897c4d32bef8661689f2d84ff897637fb6d5568a7270e783426b74b7037493e5155fd7cb3ddddfd36bd8a9c877d71d2a966057c08263d2939c84987 Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 61d7b3150131351e7b4c8e5645d38be9335b40289af34cc6b6fc5e48493bf8b7852c73982c99441ef66c7d9d33c29742b1406e02e0aa8dd034b1ac13cb0d775750cc91421fead9caa921eca61a02eb023a457e77915e183acf517d946bc68292896014fd214b7c8c5e14e15944be0f9296127771f736766e4f81dab3708ea2d0 Sig = 84e92a145ae6be1ff9242d9ed2d68de668e802524e8ac0a79de62fe74048c35491fd2ffdb185057e666dbfaac84c34fde7891263f8b2bc74746230320f67a7bd7319c9b9de4190547014e2d7a2a5060d6200aadc3a44bac029ff3992edd30ec53ab0d9123eaa6b147352a073a98161e64f394bb99492c6977e24f445c7125bfb90f87faf262272134acb18823a99a5228d1495463297fd774877fb63d4918106347e6f29315e48363f39b33299eaa32d8da71b229d8ffee5f66f722ad3aa4175d3f84ece9cc8eca8d6f2f356a85c1524896c18f7b5c8f9bcdef45c496d539179891ddc76e5208ad8353d48c624054f3440eeba4432a10654a11ef53783bd116f Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = b6771ab0e128b41b32b8b05e05add23ce0fb877b40bfcc3b992f4c8698d1c828abecbcc1c33d401859ea2cb2afbc7fa4588802a5faee2867534639287ad8af84674be18db661de1da8e19c6b6bd452dd9bf3221d0861fb6fba96be42329b9f04f37dcf3b41fc58d2298348b0c15d1190b125300cf27e0dfad60522fc49846053 Sig = 6276925568626f0cbe6f5150b050e1702582f8daf99a6f880ef75cd96c2d4208fb6e91b01ba6aba2a816b2d3cb975df850b1d268c4662dd1ea3a300c1d7171c633dd2efbac3000c56ab80f989dbc18243e636ba5d4d26a7d3f1965ad3cb0f1a8513f998003f7b67e2ac5c718cb688b3201d56e68f0b9f86257b84794cdffbc1fe3ea24b7bb6e9ef0539bd4fbc1afb55bc1dca39996ea8a63769f6e225707f69047555e1a4ef3c639c5f2a497b889424a90148639bb64df0a06e0b7f0e8ed466a977baca32f482337b2abe3983eaec3fe1075016e5867521760fd0607d799f1766b3ff6e2ae155d69250f8bf08c8edca0b4f31d0f838cfd298cb7312df93f0997 Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 6a81cb6c7b268f4b9fb9172adbbb36a237a0dcf1c3c83a95dcb0271aac6ac330f04a5a00fee38bc00631a98598186159660d9d8e4c14a9528dea94836083dac4abb73fd00e38fe0e23c7236604a736540e52193ae56c33fbb8f5cfc5c7c2be2e222e4483b30d325c7ee14f742851fcb8b6d6189e98b822b8e6399d89e90fb997 Sig = b67991050c083e645097db03fff34758868beb19e9c0c48475f0f913361e71d3d6f27a8c4f0b269b49e8534039e53ad3bab9a3e62abe078ee75e7fb5959006fbfb014ca7b81b3d5afe0ee5f6fc2dfbc450f2839543002f33f4f354f827278c76c041686eea7886ebb2a7afa5995c6cddb1c0b58066ddb8dc54a6927c146c3b2a0fa7cef28903c6c672bc20ef68ffbfab247eb688ab4bde7106d9c59d2153096dc9e5207267038d88e2174e76adc1508ae24eb602332e53c0c2e33154a66a97a0f12f66c61258c7bf6bbf3f1dcbe9caf2fd30ec68c0a9d09f4fd776304b540e62fc8512beaabc4be2107a1ec18e87f61f9db25e871dc0693cef17c2a687fc854f Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 056c1e4644599e3183dd8d2f64e4bb2352ff00d012ab763f9ad6e560279f7ff38a5ecea9c2e4ea87d004ef8cc752ae93232aa37b5bf42884baa7e7fc6a8c951cd245de2d220d9bee2b414b3a7520c1e68bcf1ae99a9ff2bf3a93d80f8c1dfe8b85293517895c192e3c9e898295d65be334f44d62f5353eb6c5a29edfb4db2309 Sig = ae05204e409d727eb9e4dc24be8f863328c2813da4fcef28866e21a5dab21a485321b735274af06bf17e271518e11164d722ab073548f02e1b441923db6f1cee65a017edfbaf3361c67fbc2b39fe038cb5cb65a640f95887389ce8a5ad2ec6e69d3d603505b025f6d6330c8b648802caf7e6fa3fe7b38141659986cb89e6232f106222564d5e5195eda6a25f99068572c2fafe97f147f7f2f4119f21385af1fced97f78632d8bf4fd9a9054d8b9aa2a9f4ded587847a91d42c6391125f103ae288547e8489693ae8686b84891b772b10c4796883f66cd459a8c1a6a4187bd6b387d349e92d7b604953727c9e9fdc449e7345e7ca6b339e26b086f5548898cbe9 Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = cec5c9b6f84497ac327f68ef886641fec995178b307192304374115efcc5ee96270c03db0b846d674c528f9d10155a3f61becce1d3a2b79d66cdc409ad99b7663080f51a102f4361e9dbd03ffcd876b98e683d448bd1217e6fb2151c66964723b2caa65c4e6ca201d1c532bd94d91cd4173b719da126563927ca0a7f6fe42536 Sig = c48a8e01d4bbfe0f2f05659337ea71d21f38d7f7a10b00b06e1f899eaf40a8e97ead64bca37f13a55ef1cf3fb52cee279cdcb096085a467afa97b03d78d6076e472b12d6be9647cec32d8d91a26247693771687460ba5269de18e1edef6022533a9579f91d584f9e0cee1100c447b77576b1b4ee163ed4700147a9aa61bdc4e2316d2d818c1028ed1c3e372c9f6a1745572444637248091b83f7b539f9bd58b7675676034c20e4ca119b91c4ca5dc76acbff3d0462898352c591c2ca6f2d8b09e2e6338a84336e06f0cc020e9eb8da785889b497f3b98e827ee7a7d3f1b0b73c1958e16aa97861e6675970ce31d9d119bb340be80fd0f43c3dbe64f2a59d629d Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 9193f8b914dfe0e62521f35afa4fa5d42835e198af673809377a3e7a99733142a180dc0e13e6bb7ceb3b60e5e9d515794d82c392e07913423391d22e2bb19aa0bd88afd7f77e27a240ea4e2de085481ac31ff8d37990211f82f2cbf4c90de98d6e1338bbc88e6a80ab9684dae64785dd107248048593abc9ab03f1737a6f6530 Sig = 5c2fe453a8b08c90b02eb2c9994242d518f3f21b368895cffd624050e48aa714005ae675fe79aa3cadd4df55bdf12bec5be8a41d87538f7e031b782e34d392468e5f14bc613b8f4d28c8fb79a2537e1e601031da720acd7b2c8dcbe9858624a7a9a92a06f91845f732370d67365c6464f7b68f22eb3edfeec97e3285024d7f6943b6d50a16cc96d60f680351deaa25f0bc868948607a6ba7f1949b85943c6a92bd6172e81bcc055014b78a733972e3f39d14099d1607a20ff8681c29ae1ef99ef115ed6a1084b514b81a69d4a15ce1e2576fdcf2b2af615b52fec70132112dcc5bc19ec17f32281460623420317353e8a255fda502bd1fb11a58832ae2c04f9a Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 0e57ef40b021bf87f642c5756b6515a0e06c15a01856d716c566a6edb381dfdf44d9033b1cc809e61dfef9a096dfb689b7271be449d04a1a9c354102c077af5ff72005ab6b06cf131d7345c21e821d6201cca4e090440d70be6009d2dd7a98d311751e1605a3b914dce6d2626b16f233a5a3d71d567cc820152f25e473514242 Sig = 7643aa3fe63e66f79d6b409d145ea820c9f7356f71b4acdcbd43fe1e99f8802cd1662b16240f5cfd94a769b0b3f2cb0b11887e886e5ba43733367490b3fc188f2fb3a0c0c8a68b5d2726c8f7a31902b6b86cd402287d385c3e3c06503ce17fd6e54e582f4a907a91f952d2a360e2fba00028e4d3b02aabf7d220b31d1f8ee7faa070147682ccc8bcc756ca6a68fc20954550c317e87918781a3d1f1923503091090c3c60ca1c0b1c699906fbf85aa70ad9ae48709ff743b82dcc31074cfcea623ea45e48644b19a21772ca107ed64239c56574a087f1a6aadf0f4b00ffe581c1410274c875e4599063e46e5168803f0d28d21fcd3509b4c6222995add7753bf3 Result = Pass Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 0c8491fc348d341fe85c46a56115f26035c59e6a2be765c44e2ec83d407ea096d13b57e3d0c758342246c47510a56793e5daeae1b96d4ab988378966876aa341b7d1c31bba59b7dbe6d1a16898eef0caca928f8ce84d5c64e025dc1679922d95e5cd3c6b994a385c5c8346469ef8764c0c74f5336191850c7f7e2b14be0027d8 Sig = cacc8d9f5ecd34c143488461135c4951676145c6e472b92f12f758046f172142fa388f285f3fff068242028829047e248059ed4fd39d2c5ade469dc7c39345e5114950d2031cc7465fe712c4041d05c756d3f2d88a46ceb99f2e24a52e958a03cd2519a9b137e62d5ca2b353f7b047b625c3602313fdb53c8db23d83951a599db328fedc4ae06da89ce7f56259b5c8222f7bd3d9740478fd28e5810db78aee8623fdd39f603f8ddf98081d7873980c4eb0e22a9cd408f7c4134c12d2049a2d120f4b62e6b382b997fc375ef7ac955fcf80b045c3d6385ff422dad350c68870539068a162a2edbb93ceefed9677939b90bd3dfa0dc053460b4e2332efa692179a Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 6cd59fdd3efd893d091afdc3155d354f10d6d88167427a2cf7246207e51791a6ca6200a914cd2834a9b3c79fcd59e26e457e0683bc33d49267edbdd6e5d90902696f1e7b1a4affc4ba371339868c28015ebbb73e262669866c35db974ba69e468f2583b9191d15d686cd66fb0b9e0ff0a3b4721a6dc342f14f2446b4e028595b Sig = 3974900bec3fcb081f0e5a299adf30d087aabaa633911410e87a4979bbe3fa80c3abcf221686399a49bc2f1e5ac40c35df1700e4b9cb7c805a896646573f4a570a9704d2a2e6baee4b43d916906884ad3cf283529ea265e8fcb5cc1bdf7b7dee85941e4b4fb25c1fc7b951fb129ab393cb069be271c1d954da3c43674309f1d212826fabb8e812de2d53d12597de040d32cb28c9f813159cb18c1b51f7a874cbf229cc222caeb98e35ec5e4bf5c5e22cc8528631f15117e8c2be6eac91f4070eecdd07ecc6db6c46eaa65f472f2006988efef0b51c538c6e04d7519c8e3da4b172b1e2761089ed3ad1197992ef37c168dc881c8b5f8bbfee919f7c7afd25b8fc Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = acb30be9092b2f18f25934a0d678b6bcd6b67c2b88e75884f47b4fcae3adfa405afe2c7e61e2d6c508b92790ac00f76b77c965082668bf900f70a33762de6413af93af2ea8086fda293ded4475f23c4cc31ad494f98d7dd7b7fd6f7d972bb76cb35adc206804c3fe5acdd0e5b8b54e07c29111f788bc5902f40afac30afdbaf2 Sig = b5c60d8da9b3943878cb2359cf65e4817c0794f950453ca77c81a5a1c1585591aa50a67468e3b399e4faf1d606bea0d9e6cc1d2d70db8063739e0c27d3dc9f9afe88dea52e73298a07d05c7d9707002efa537c389e38bd37bca74eb0af6261a5da06136202c8ad487eebd50bef74767089c70870be1d8fab9156f9fdbc2f2e9cc330a95018ce7943984becc25621bfa66018ef8320b60059f941156e9cdd87ff0d82cf7be77465e0203e7120aaeced84abd8186947d4ac3daf3f993902aec47c3090475c857b5d359f0a5572d4688e5a76a4653868ff54ce9f999e6bb559d1c11c67c15be9d7fe5f8c1704301d055f3d2907722779d6012036084e950de36f4f Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 601a6aad3faa7988d5ae528a6969031b10a6f39216946aa89fd4532c8ed141f9a650b126ef488f7c5cf3fb2daa254cc28bdd55560419e80214ef999896dac4946852d24fcd9fb77610eebfbb6ba58bca26f4567f03ac7e56da553f23817bc103ee485592a058fb5e3bc8299c7290c71a29137e75dbf5328c3a2dcd34165b3f2e Sig = 301d60d56576f3663a7fbe8036bbe4fbc0fbd82cd6a42e36d7bbc8b206543dc2d56d3198e7911ad138cad222dd99050dd1f85fe19c8a88bf67135e7f8f11b5f5e485c91fc7d478069b72f46ebcdcf2d2ae7de6ac8fe53bb6c04911d122cc231dc210b2147ebe8b052e8b2ccc09f338b349de2025cc87b2619a7b163347ca66a34791a2e46b4e2ac57eb9f6029cdbe024e896d57f7d0491f7783312f8f06c790770150cd139f61fd2b3e7041b37261c6e7ea86d4e06d9300b1a5667cb0288c550b2afb355944834b461cead13794276bb46e5e20aec7b63aaca4d491a500facd59a37c52779cf467d74af1e62b1ebe0fd0be1cacb7ce6d050d86e4eb76cde0693 Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 44d3e0fc90100a1c9316063f26b180326cc2e3834ce56e4324528a0bbb015b3d7812958cd26b91bf08a3a0b1121f9f9dd77acb98a02ad75fcd613c53c732d1c235f59b6873ece6363f279452b6a4b65e80bb59fd47b9a2936dcc1e4dfe1f5362e3459b9859db3209a2698d27fa8aedfecd4d35b927daf8686c59d700490f0aa3 Sig = af2229e94a857b89e0e890daca3a8fe12ebdba04948d1883a7d7816a3b682f7da3032540a8769f9ccac9586cf24e8c204b45b85d1bdcc5a5450a215b4048ea42983b3456fa8c76c6786e024f705e088d694559d668caa8684cad0fc57850fcaf34e458aee8fad4e09e6f196557d4e8860284d982c0105d98ce4912e96c3550e2a0c7e8bad5abc29a9a542f57a8c60579038067b3d5391abc21b4f9deb024ca58f9b0c38c0d1f82373f528e939bd73a24d501c591168814c872c525db0e56cae47df00fa3728dc3a0976965323ce8d2dee2b138b50ab7afd48495114673e91bb3ed2205e26a8455474c3d4ec8739bbff6df39b2b72ee050410930423b1472b6ed Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af09077a1f534b89822b26c3272adf8500d3c6bd90f9b5e0d8b211f16d0720ee0eaf6462b6c8a80df6d75359fd19d03a0cafb52bc9d4c37c2aa099911a79a92652cc717f0746fdcad627c72f1c216b243d2175f6d00bf07d3f6aa2a04d4fe9f8fbce93218944b92aa07af6b4fcd80cfde2d7ada15c05e96e777ea1c17df08fc Sig = a56823fa577e8946f1d2f6e351b738b53592544358528af88807ea4f19017dfe81a3d69f62fbff649550d9b310faf27a041fe624f0a02bdcddb79bfb0a465739ec8b64b748cc29e5a02c777e1826d3e2f1eee6fe2edee4a8bcac519c7c7ca5c039e76d630668945a1e5e8618e235864561a440e73e39f6d6842ad7da64ef5b0ce1c4ab88db157b68107174ad7d5c9a6065068768c11c4c96ff67050b5d07b8cd027fcd0d347ec79a197cf43435985bc1aeb479db0022289e8dd3b31bb7c62d8831cfe6952f41d24f89d753789535f918ff68b36950af6fd31dee1ac476a0cf93afe9f4a766f3c4d2c0c3f92825d5572eb2eb8a2b644e329eea1683f90810ed77 Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = f60a3a543768fabe37f003009a8c26f7dc91f1422d4429ed7f9d744cdd4b552afef75d241acda04ffc39672159ee248e602dab7192449e2ed4552995c258f00a476346e36a29a0126bc249040faa57c9380bdd74b83f62c56790920574433432f8d65c5cd185e24fad13127265c6a5ef8db4f114493d5cfa61d91664981408e9 Sig = 08d396481deef18cb0bef7c3e826fe6e5c9ecc85e5230d35d66772b8d2d015d4e5f5794fbe0550df2f745730d6f8d1d3b850d164fce4630805e711b59308f8608506b7e01e8e9294ed8b7e7582165677f180e965169dca81b3daf24d7b92fe32d6a9ac63821d48b1a0a144fc7a04b0bfc63a3bc16a0fd837b02037ed76e50d46cbfa3857e658e370c586ab1eed825076321ac8e82be374bacb295e4d3408f0cc1fc4c300b84275a51c3573e9cabfdbe3dc51e4a6f5811d860d725aaf8fd0af19a2437b0f1c80f5ac222f6b25f1fa09e93399a6976b1b3ca76afe6086e9b232aae6c7b818255bf963f31c04ae3fa2136c0a442997d4cf12f395fb804a4755b56b Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 2c07a81de58955b676fec0572d48d1955b4875ff62a44b0010c7a1072b299ee44dd0c076f2178a83d0ae76e767e231f1d81e070afab29c97abd4de2164e437b311f507841f8851d6d69ab51ee9e29e654b54bcee45e9b519c6a21787facb927f1d7d6491926614792fcc6346dcd080bb5cf07bf56ad0fc4e083a358214631510 Sig = 9aa391e7c2f0e920aac27ed9fc2081d3c9caa3735883d01ad7a7e3b11867d0ad624156477bbbdde659f474682d0d774489e2b5b039d1eb35454c9e3eed78cff9c4262e3aecfca1d817542b486096598e1114bfc03f20a45de36f6df70d144d01dc4866a0f83319e7c2b8530f8c27a41b7add9f692d8a8e646455b67c9ec47a4d2ce3dfe35d6a2e89d9be50c5b6da39bb0254bd23a809ab97b2b48a068a87abde6b6a6e35955fc92a9626f9607d5b3f401517271594bef73859812b6a621ed6bdaf3c5f2a90b1e1680f68dcfccacb65e0081f1ccb6a2073709d1ba067065016ed73ebd7ebe9e7a7b60c8c9dd04a56fab30702c8a6df6a353a301047df4c7aff62 Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 35ec92afdbc2fcefe48f1e2f6e4829ae53b3da0459cc4ea8a96818b5831891ee2f506fff37c89906d3233a51a5cf1469a62c185061f033085fca6a54e24529c3d6f0d8e904bcb0f089a5cd50869484da1a84f6fb8de4e53fce3dc714201519d11013f6f6aa64e8b5ec5cfeb27b611f0895059d8c47720d55e00b577ca5500920 Sig = 6b0f5b50e678da083ed0f1b64e943e8c6279c7246af5ad079cdbf223e42a0d471e56314bc0d58f202aa6c5e1e5255985b0795d48eb3d4b8e3fc92240ae02b4088c6ce8ab0e8c79c68dfdc48657d6a28295391b9a5a5f35255126bf8ca53cbcc0082eab52ec109d22a1185f6dc792fc290aa8dbaebb2fbe404f1d039aa6343cd7af9fcb2d1e05def48096c237e10daa7cfac5ae9b3b3022005d0d2d5c9c5c502b2f23594e80d1604bbb8f5dec07cd3afe1f777743b0b58a4e0e4e5caa148830eee047968e7f40661f9f1a02e1a7fd2b6caf19326a75e9565efdc0114bcecb14dda06c329cf322a5bd3e6ab48d95f2d2a9c1c1233a0aa015a738f901f13148b454 Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 80c9debdf93174d75750a6cf09af71fc18fd513bff9cb491be60af112a93f000873cf43858a07aca760a37e760c8cb01d276f42d997f01cca5e08a6a602f5fe63edcbed395b8c91fb0b336f21fea49d950e1ff24640c8d8d3b95081ad1596644ce34a558587e4a1e2cd50db9ed1dd3cebbc6dce8084d3e1ba70692e82618ed61 Sig = 4a15a783adbf274622d5a610bb6fc73337999e445dc2133accb788d6203d70f3cdc63e67daa4171a7952a4986456fab3c077a8941fb259e37a5c0cbb20c408fa24ad0ec850e9bf028c3604609941f5ae2f18bf1ac37a24f755abb9c85ddcd0bf4a12fabd9d253029e081f628e2bbe9f9afe9224954d8315db86c2125512bb98ce9b36930994b091a8a1d7d4e2f4a0e58d0a35876adad14300530b39c8dc11ded3ef2fa95d5f22e67cae34cc21ad5e23f9122b53dfb79f1a2ac63c1844e9ef069a2e41f178d6dcedc518aafcf81e0ebd882556e731cb0ab41d957274a3fbbb7cef2608791000c6b860868cb7393e7d03d945689ffb77555efe08f461451d33c11 Result = Pass Digest = SHA384 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 31395cef349551343a49271a8d812b4c7b65b455b7eda811fcf74161f397112357ae446257be26c93cfce55e4ba7976ded997ec10d1c8b1ac2fe22dc2ee81d05a6eb1361125cda0197e24ae974cd44092aa9f36fe01352ba05ccefd2370ceed6641950562f1776c39522e023d09a3b097bbe9bc5f87d05d80f8830abd7ac8c80 Sig = 162f387695cf9d82dda89c749318e46c9be895ec364ea4aece97ccfa63925af3710894da2b7b5967e46f4efa80ca25d2a965a7e15f75e0aa1bd4250f8f41099e6e9714c3fc4311077ae9bddfe35ba4727531529c239d546ab1c298187f165f708ccc0ae3979a8da193e34859a59c2c3bc42253c8346688e6bba6fb1b01b10c1ec2c6493dedcc2696269d851bde63e27e37bed357455c8fee5629f94afa7a986695cfd5b99212657a6c884644596086b89e0c7c05e819faebebef745fd295af8866e0750f5479baed50cbb3d059f8a5eb7e0e61e2733ae50f0c1ec42be71f5dff324195cb4f0e941a21561513c3037db92fec9556b772ccab239e34b1876c56b1 Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = a7c309d44a57188bbd7b726b98b98ce12582228e1415864870a23961d2afb82cd5bc98bec922d5f2ac4168b056da176ef3ba91f6b699ba6acc4144868ff37f26fd06720868d12ad26ecb52572cf10416af68df03ab645a8b704857d2190ffc3f07eabe3a8e2abe34ed6159e884c4fae141d4333d5c3e0db044ff9cccd9cbd67f Sig = 148af61ed5ea8a87a08b3f403929bf8031db4fd3999b64409ba489f97a3ee5208ea4202d2ec18734f615003a51f77441085be6ac0f11810ffa2dad58f0e186d5520ac2b8a5d3966e8d2abb8074e13b50a4e7de83be10a66fdc7ca18118c5774f781212de9efebc6376fcdddc65a3b1b8f1ab31492fe478259ce719b3db587498d879a01dec96e8eabeb07ff7073f3f3eb446084955ca26329a791315a2c259d225e26b2154b2047b21faba68115bfd962e5e24ec52d7c5d231e3044cbcd8c8804855703cbaa622b15b6ef78c7421a367166f1b02576c87360593da75b7189efafd1082bd59f6857f1701f646c24d70c95273c49d5b11e6afe258821b55c1680c Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = ca505d4591121664990747d95d9555cc75bfc3fdaeeceeaa60eafab3fc320cfce56eb9138138bf138f25f3c8bb027b136f5d3d90ed4897779b5951c09df5d08ba9ce8cbe17abc4f038687086e93d771b684322266633d0d65d71ec41234a1dbec07abc8f7df28bc43dd8a45b10ceafac06775805413701914e3bb37eb6ba5b5e Sig = 589ccd4ebf9764f87e6afa7f13c4062579b02228117b15a8738ab39cd64477069cb4f52cd8d5f4574c657b453835ca3cedb824f03b92a573d6d3d91361313f11bdcb34d2059fe2e6ce2b854461af58a9294c88cbfb2a639976b56e4748026f3040e2fd7112d6ad44500689ac777c071d17391969762e186417c4400abdda5c16dce0077642f1fc1354e0e8c14e558c923c1bfb85488b8350f415866a60871ed7151f5fbc5b880500011977c778e17fe8918c5d343f70b00d58f718956125fe28b3a5e2d07604a2b8a877204434ce903b35a030936bc71951ca593df97d24e8e8ad8f2dc9b78f76ef13a1d386ca857ced48f19f3ebe39108f9b33ff59eb0556b1 Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 237a7e44b0a6c268bb63364b958ae02b95e7eed36b3ea5bfb18b9b81c38e2663d187144e323f9ceafb479507d184e63cfbec3ecdbb8a05d2dfc8929693ed9e3e79e5f8abfc417ba1e17e3e281e8a0a32f084117f28c3dcbec51b86f5c85b2822441a9423b5b446d3928f977626a334579b39cfaf58f214c98d0cdf640be1ac59 Sig = af076bc213caf75619f4bd1d787cc198f7df3324a0dd87a88416e0a4b81c2fb9a9db5f98aed43bc15fe2357143a6e4ff701d9c48f51de9eb803670bbc4b0aea7220be2f84b8300318c77a9f615986c4980abda85e3ad0089564dbaf7f44d81b6664eec0311adb194d46de96bb17d5a5d47426845802ca0f49a169eb82b75afa191027a0cc8fce9dd16055350df9745fc7200ff9f4ea3cfbfc66c42848113e3be3293d510382d0999f032515527bd99f66efa2a755e011247b223a68e51258b6bc319a7cdef4aec533e9dcd8ae26e349e5b33c79121907de509a1cb83c2e59a47c1a884bf68e7229316a62e3c49d1f542ebe7105cfc27099268120a7743908471 Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = ab18939230b096646a37a781629fbd9270f3891a5ceab4a8c3bc6851bc34115dbc066541b764a2ce88cc16a79324e5f8a90807652c639041733c34016fd30af08fed9024e26cf0b07c22811b1ae7911109e9625943447207dcd3fff39c45cb69ee731d22f8f008730ce2efc53f114945573ea2ddebb6e262c527d20f8bb1dc32 Sig = 95bd0bf2362f34b2e04075b2934f404798703ea472b81ac3cc223aec486e4c3d9c5d1c2f9ee22417132964ed58e49937f5b257d316ca7fffe290b19f5b58103836812bef30ca0327039d8b9ea91295392fc394b881e2d2ac9e30c5a44256700fc9de0dba298273aec30c4f778d2e7127e8b8a88b0274fce04081cc13adbefe555014e1b5d5dcf6224c5ae2775423a66c81818eec014a3faf9ee75a3f6c3e51c556b0a288e8c262946684eb628b88e3f875e62ef6e801cae75f61cee404971c39d24a9712eb342ddc663515dec103b18d97d78ed68212f27900e77c049b60c853002b08022df56f707efa71027589e1a3ca6e415ba5f4437e978b07af3b73ba0d Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = a280e89ceb2c8cf26297191baf9a955d0d52375da023633e0afcdb0d39dc335d8295852ef4d06714e6511a95d37c04d26818606ada54359b7d0784aa933cc68561ee96a88910aa3d93d10787cd1d7580556731c174a6e3a32d9dcfa416604f0c671481d051f63db6919f4aba4486d1b0fdc6112c1521559f424523c26b4fb738 Sig = cd60de3b4a1289a84ca761f90fa63f4d5688bd885f4b531c8515add2de1251f993ff7f986bef3fba692ecdebc81942d7429c7a59c5d3f1fb872fc1da1915e94586a5c3d963603619008f7efeded1d70b0a11ce2cd81b5b0d86b3760c9483674f55e9fa47f2f310d588fb2160e8b5c32be4e7a968d5a8d4ac6576b71a2b91cd6af0016cbc816d4aae8c70649e08dce90b3ce52ab49ce2cb5b0ed8a45e33d94cf2d4cfdee1151270b2073aeffeaf717d39e04192b8b693c53f21a6123813280806920b7dc582201c9d117050320671e86139a027976b7ecf413369a9fc28e0bd719ceb5e107de799f1bc2e255a9f29476d4574d1332f66468afb9004ff7b535302 Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 85ed1e3dfcd5bca24cad1d01ebe192b7d059ec9b884436e18714a43fbcc9c64f687301352ff240817001e757d27309cd1fbbda9456b267dbfb958470b24d06280cf43382a19477875f3259f4210bac9b831d0a07f5e97e5f0f78818c259c289e1a789b6c7942c97bc1485a220131e5eba586643b9071e5366bc482dd3c3c9279 Sig = 138134bbecefafc7ca8b102cbe87b012f8aada8878995002cf1887694b5be3b8f0bb616bc6e07962d5482d3a52c52ab91b3ee0064d24558e13c75c80f6a95b7dc498442879d5baf8ffa7e2f638808b97ff70136bb645e30944dd97a997a0205169553a5b9e874c5a9441e18c15ebed76043b639dfd64db79e174847a102724a2a05c649473cc7dacd39e2e1d5666bbb5f01246747048fffcdfcddf782da24a6dcc022b2695f70781bd9f8ff7d03be22eb8fc793f5c071a66d9a6ea46c6a2cf0556526ba8b085073546448081732ac15f12833c1db1701ff7f68344ca65dff86211a003adbf5189cfae79eaa8c8b7141ea378e44cc9c5bf024d2c710ff5cd68af Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 0bdba34e35fca65a1781d4d7c933a5f210d3a59483aebc95ec71b32df13ff4abf401916937fd88ff44ab46b78cc369414e9bcaa8bab0bb8557828d73a2a656c2f816f070b5cb45549e8eca9d7c0b4a7b0a27e51c119358dad2a17fb3a45718f9dec3c94af78d65c3ecd36b71e230cf080d1efdd8d07f1cfc26768fd5407bc2b7 Sig = 9f48deb96bec0b72fbc4f12f08afb46bccf19d9e0cd0368ebeb312d83872626380ac928b612c5cd77438d47aa9ceea905a9de7182c8ef76e8a7a03d6efec8400b6496362bf6a30ceb1ced2185fc7c2117b6a6d888ac20c1687b0f2aa9b76705fd3154889b6acaf4e63be25880c71e6c239ecfb965004cd6321257f846afd2a6590c72ad83146eefc7b0dc4796339a7f64da0fbe359f94ace1fd151c5ac7bb5707b32eacf564fe1622e66e1844e639602ca36274ae01f93e6b2bd1effd34ab63d852cc9caf3ce8446c29c8ae3c6110fb7538cc8371c2a3981249cdc1be2b24b6a0c951764d0b7efa92a22cd8ed165e182863579377997a9ee50c8ac3aa4df1aca Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 9aeed85b40ba7f86a228b5a1515ba190b2efff66993a5ece19d18baa9b4e4df92e5152fe1ec56a9fc865f30bac7e949fc4f62f0b158d10b083636b4de9bb05db69fe31b50103fefc5f8daf3af7156b4552ca3667a9d720bbb2e4bcdabadfd4b7f4fc5bc811faa36710a9d17758a98d4a0474fec27e9ef5b74f5c689935442357 Sig = 9eecdbd7fbf618ddddfb6e75d64440f60445b853c542fe0fbaaa6a431294e6cb6683ae1a71ea055eb49cd2a3cb5154dc93d9aa166399f4e6294f0eb0652800d71e041c1ce1ad849c03c963bc0929dcdd11be5d67a050d02b64b29eaba655642b6436fbfb163690bf432fdceedd106c2f4972ecbf3077ed8b753bb605ec1ea03020839a318a24f8d4c1d7d8df99a7f0010ae41a8b068e2888531056a7dabbe921878dcd3c7d69416867f4012a606ae86855f15aed0da1250e59687706e89c9494baf37f61fb1703b79928795f90ccbe293a1e9472f6e0f4b890fdda3ea2522e3d11d5abdf0069519424d147b5646a5a601f19ec89729a8b48461e71c08bbe9cda Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 654e189f06c7d42d5539a5872184f8336cf100691f190818fd02082ad68a7609fd095e62fc32b529853aebddac3dbf0d54dd571be72c90404bcc93d01154a9bfeff65065705f8e7eeadf8575b1ca48e28a1eed516265e34540dd867c79d7f175235d1330cb1706356b709bd796f43abaf6fce993f88eaa2fc67f0ab776daf732 Sig = af90298bcef615309f235d5c3360f0df11f5fb988789f213d4c46134fee5eb104aa1fabb1307c9a904709de88673ed9951cba93167c67c09d827021b08a22c0505828ab4beb42e59a38832cb4da24ecf91f470a3b412c0712a8a59f6f2739d4e9eb4cc58d2c52592f1452dc65759abe43e8d2bc804e2efb3efc9b23cc1734ff7caefa46b03ba4b397d0714cdb8501a812c1b9f47411c91cba53a3d3b139edbd7cbb543f5bf3829ba7f5fafd8a712c0b111943f53209353afaba176b3f5dc060339d09b1fb3c213dae5d0f004d302828560fb5debf9fe491eaa66f597aa4de23eeef9176358755c952ef96e3672583b6ecd95a02e8ca7b21d7c20cbb7a757af71 Result = Pass Digest = SHA512 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 121f80b43f9757b3fa80906aeab232195f0e2c41e5bf8c091ac0f1e0bc9e43640680a1823d649bdf86aba277fad8bc85fc957da2caf7323053025ff949706c1476ae9b0953283d34d7c6266f8db65eebe96d195fdce8e965a6383320ec3de0230ab2548eaa69a47a96d80398cad57e14ce9eeac0421c1a6eba69559dcd8f0659 Sig = 06a2d74585f12ea7a80527b8c635a21cc11b45dbb0885a12722126811dd25d657bfa9fda774301ca3498d05dfdfb78a6aa16a9f8a95f40f1f04bd354a522f6a2d62b324efa3c006c22c2314b01fa0e91a3dba49aa35b46b19804b07ad98fe4bc990393a4a273ce8f1c85fc19cd5eae9af0b7d1957bb23409778a010b00c6959e1b67066fdb9f8495b4de4dcbb987358145b1ff6a39ef6fc588cda1744e0ab9e7eb002c29a78531d25157c5c2cd6470551560a02845db6dbee242f965a255406f6ef47b3221a5110edb44d38b94191aeaf433c0ece3480b9d1b06d8b8b6c0a232a04c567888e6372f2e94bc2be6b827f8712af48c6f1e4f223f5528fcf348799d Result = Pass # [mod = 3072] Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = bcf6074333a7ede592ffc9ecf1c51181287e0a69363f467de4bf6b5aa5b03759c150c1c2b23b023cce8393882702b86fb0ef9ef9a1b0e1e01cef514410f0f6a05e2252fd3af4e566d4e9f79b38ef910a73edcdfaf89b4f0a429614dabab46b08da94405e937aa049ec5a7a8ded33a338bb9f1dd404a799e19ddb3a836aa39c77 Sig = d1d21b8dfa55f0681e8fa86135cf292d71b7669713c291d8f8dc246464de3bbb961b596dfc8fda6c823c384008d05bcb3dccc36accf1b2bede1a95e52258d7d1bdf1fc44e18072abd45c1392015ee71692690ef8cdaaed337dd8546783f961bb9620eb5c7b8b6716e8c600351fab7765ee38a15d32d8a2c0949825c49a7f25eedd9be7b807bbfd517913786620d249823dae6fe2fd39ac639dd74821b0c120b42f31c2c639d2c61b395f09f86851bc809b34c4981ac65cf25b2e8adcbce190ef2ef67a0189039c9110f26701c3eed731c8d9ead178220ffcac7f0f678aa22268e1d01942ec51e80eef06e2112830855e87bafe8cc9c22fd737c7abbca5eb7a221d3835a86610d24b507b5dcb4618aa421f63a5609ef5d68f5760fddf970135602efad0851bbff98fe87fa58bc365f38ee7ec8ef5aab17fd11d89d91ef4c604e0d1f001d0e08869df9225e3b4cef52ff86815e13b3efdf45776f9353769a8a51fe7d891a7ef7035eecfa259848738376886edc91cc78f6da31c2f07ee362c3d82 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 2bcad6e744f2490ba6a6e0722832417ebd910f9146eb62baaa5c749529f79d6ced0b81a2e2a48852c8558e338735dcbfc2285794ae60f81a25237c66f6ce5d5e801a001e7f9e309b2595cb866de2bb74ac51283b6820ec9f6ebe482e1fd2d5680b7fbd23c1e62a2ee4edff35823fc7e4a295ea4f1c332792aeb53eb44b0bedd2 Sig = 37d960fe391298bbdc223fa1eb1d3cd9a46ba8c62e1da8c563c89a8f0e67b864fc89837ffc08aab7122b84c435c7f9406e165a1029857c1e4dea653569277273b1d9b0a9f5b0dc24afdd214476d47208ad5221a7d793cab80671fb4987c86bd6144880c59d24871400f64bdc6d496dbd497f3dbf642864fe49af3e21515e62d60f0071db4884f49670eaa9e4e4982f269abe724244288859c2adf60a09faaabb07990e09e56de254babbee14be7eb6eda0cdb22f3d0de8724804673fb99f86efb4263dcc5017abc91bd9cd833679475bfac50a2be8db86296bbf8017889357371314604e83d68b6efecd4b79f0a8afa0dffa448fb7fce6d344709a670e0cff432c3e187bcff7fdc4f4e9abe1095c46b01d88b6044bb950e92859010d9a0e3b2d1f27a096eacaa24263a2a0523d6e0da1fba8af768196f7a51f92fdf152bef062dd1f8327cee1d344c200c2115ac6ec1dd8514cef9e36d0ce8c32e58783c4fcba901aa70c2b42966488002ff171d36414a144bf46775183a8815de9ee3e81f31b Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = c3978bd050d46da4a79227d8270a2202953482875930fb1aeae4e67f87e79495289de293b4a40d92746fc84cc8318c2318fd30650e2bb9ce02fd734eb683410d44bb31ad54fd53cf9296ccd860b426f5c782ea5cb49371d56184f77911ddf1ba0039a0a49aa7e763eb4f5a04575997808b0ad9f6b330ca38edc19989febf4da5 Sig = 9aed20a8bdaf26f1f119020d8f3ea6ce915138d4c87dce025e7f4e49536c8ec079edc6caf0d603bf42bd6a454a6d52d0d99fd0f59ffb3b22e9e67b3d0bb2d275d9aedc6da96a72cbff35c43e7f39a996fa8a6d338a0725f785254fe91a20834ba557fedfe7152b9956feddfd941741eff9177c2fbb55e200bbe42162b32a940cc300ab375557dffd48dfa539f50edd52df158d9072d14982e96303bc612c2c2506dbca3a939d626d2e7fb444c6ad7d8d9f3bba8210b2ac2f696783c349fc5280c105402a4b3d86bef5026c3dd999e3b22380f9dcce40e3a9cc9f1d7bc38ef3dd7e9413bb579800c0e6c3e9ab912da8fec1a4ab21398e9680ba0d04f3b4c8d53c02f05c7ae49b70a5611cf82e38de84aa8c2426f0b63ea01b289f201d3af40dad5d6e5bccc75b9959e5c9758e79105af7a9afb12aee577cb3991879db0fd8662c5bc49022752498a301d95f4b1d08c01ebc313f89c00b1ec2735a07983fd528e6388245036f0ed4a2dbb65dd33ab7f124c014ec1679f1c2f11edffb93fa2d1d73 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 0c119502c2a01920a090e43357e7b28e33c7ee858b4330e05c71048931c0ed88468ca931ecf0b79c2fdc1756b7675156ec66b8335e3df09463f5aee7028fbf560f984cf698fe5c4280229ac96a2e5923d8a9d5299449bb665008ecc889797e9bb15d04b88c7210fadb8bf6f238e5d2dc41b9ccd1f80e9a3e6ad147948f273341 Sig = 8abf2a30774e6e7338eca09cccaca3684399940492fb94b23b5ad62ce3e11d2dbef8966ba5269979eb9653baad719516d3e8399079a2f670275a2ed42c820a9a31fcd703a76637e0d713f32d792b9ae36d7288f60c2d1ae52683bb15941b1cd890d2cd64998b772585e76032a1702e0652cbf259a1ceae695d40cf2f4f6d81341c8bc9082cb96c752c355dfbe296dd21d69846fa37613e73817b2a07046658c9e3fc6d091e17591bb1a4fb6e2ac00a3194c1488e16a9d2903786db86ae90e96acb4de9901aaf1b0651fb76a58dcb3db473efbfb831ef8e30f89967ddd3a6c2f18979a0450657cdaeef6e59377c6db1ec46065f614024a69c518a559942594a46266e0d3ca1334296b968a23a4b11c63a97e29eb16b24c02d545d5b427e6aa585333318e63a204524e0e42ac1edb70d3456780dbead31f785f0b2a77ffeb0d37384cb5f65b4e36ca241f3b2b059105faaa3222d6c135ea5a36651aea396d22fc4ea1b404d7e834b6df1fb838bb5ba0d784a96e2ae2843db3eeea496c7ad2b4241 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = ddbd8468bdb036f4799f428bc8b4374ed9b7cde541337ac439d441ac0614cb75b816b80c17d237b8db73d4a11bfd929208333afedbb8f2410c741129c53932b596a7881c6a4d7111ba104d4600d1902f6f4a1608e139b71911c11c390a0dd091df369aa29d670b8a7e3f53825f7659ac74c40a0c3bfef0d3ae8307e4bdd6cd91 Sig = 4e377e2459815d5b33915fa63cd477b5be7c6b7f7814d1350034ce710be67ed69139db622ef60ec6b7638e94b202368bac631e057702b0e6487b324a6b98ed7e03d1f3f20a9814b00e217a4648e4bbc449a2af405ca4b59f8438ddfd75d34d1064e58bfb325c55bd54ea6cdf7712ba807c3e4c665d620cd59513d7bc0855247eb670ecc292509661812702703275d9b2f87ef279d7700e69d995db98144a14c81774a4cd890ec03d13f858f3769e5048ed55caa81201e8785d3771ce6da51175d017d211fa703794416f469b1129d731abde744da5b2facd7a9b093d6c9743509b0103bab9c81c6e5f38bc9718e3e4faa86475d13725a829ac61df8d15f0b27cb40d0eba0b246b9c360b569b81b3abf380eec27492316bc292e5150ee0607219a2bd80ba984c7e3f1989bc51e4c5da3ae5070676e0c150d037a86a0f91bfc07cde64c19f9c7a7af44d6929970041448d3b17c249d5e0b5862e9a25209e8f97d7a0f030181504fead2266c873fd235983df3d0657b92096e2b490df33ca115733 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = f996f3adc2aba505ad4ae52bc5a43371a33d0f28e1950b66d208240670f352ef96185e9a7044f4ce2f2ff9ae01a31ef640e0b682e940c5105117594613dd1df74d8f2ba20c52223b045a782e850a12a2aa5c12fad484f1a256d0cd0872d304e885c201cd7e1e56d594930bb4392136fb4979cc9b88aab7a44bfc2953751c2f4c Sig = 30b348624faa9985fcd95f9c7ead3afe6456badf8c0fedbdadb3a9003a6702973acdb4e86652367db23e0a8141880d6631834f9f171c94a8fe9c315bcb8680ecfb5a4f59b45d4e4c3c05828b7faaa8e4234aada4e766646cc510d07b42bd3883a83b5bcb92d9e7cc1ddf590a690111bfc62a51af7e55543ea5188c92453d41d3e8fdabee3e1defa9d0afdb85c8153a5019ae45563ea3080a3022668168f0c273a6db1afadcd5edbca5021c2e53f4d951c604206ae10f287f451867271d370482791cdfdcb6a4010f6b3d9b928563d168da19f1c1e570f8c158f3d490b29aa23abd1ffdf20866c34c6e63b9e8a9a02d7a1b196d055f4c53ce82b400e4ab9e1b9d70d0049d6d57cf0a4949cfc68d633882882dcfdfc50cf449df10acf20305c2aa43bda10fd8a10b4ecaa23100aa47e92936dce1bfb8d6595235bbfe2c8585cb1647b2beacb1e1d4b6cef758811a68330fa9c3a82573c08fa2cda5a03f3425554e45d98c1645c5bd27d12e6c20b2c462a746e882a3421a7b1b1e25b4c36c8b16a1 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 6ace052d7e99cd973bb5c9f6679b1c305e07208965fe58c63b10a692f1dbbe22fcd0db15893ab19e107ba2e42c9934a9aafac32adf6c73473f6969e42c983b8f0c96a4639ef77d2c8e88e8cc47d7cfdd08f68d973a7beaf401cb4d1311992ddac3a9c9e067da198adc6304745f5dd312a182e6971c34a515a6c1bae647e57e4c Sig = 5f0e74f454754a3074faafc605f3c9af47604a8983650a9b6211fb191d9afa5315df4db4501fd4f04c741d764656d4a5d006388ad8fdb219ec6b756908e23b30cb639ffa7bbf2874713bfd5a1062c19d04e0e4a74b14446a7fdf5cb812e9ac7b6012d9ae991c47656d2aded24074bb8a38b1a88b1c2b131e5b09c93757fdb2d6b69aa8265a435fba00aeb36a1f629bc34b876089d28a948dd6ab4c899430da60a26f6c13603fc889c7b2936ca3c5156bd7fa6e34eac9e04800833ef0cb9b6eef788c0ef0021a4536fb8371fa3e2c8bb8befac16e8092d69c571c1e15fd255ec0a07acf9ae9953831efd3dcbef44e0fccebb1af959d71f50130e8acb4fa2319261fba12f2715def82bfafbf40e345ec5dcdab5c1bf5f66b1d0e9f7a9c62c9375746e1ae0c8f14a489184383e81dce2070ad4b525df76b446b1f22921d424d9ba3ce21577501df6280fdc69f0239ae1127b69950759d5f0b693f54e87e0763623bf5d3ff69430081b9c9e2445a05e115675e090bcab2aa1d75ceee2ad619ec8b80 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 0e49740fdcca6bfce294c11f45407805b3da412b01ef3fb513e70e62fd9504c0670db69c36b6bebd69a0bcd240179ba8a47816a0c3437a61fb72adcaf9096f2a22efe0b431fc422d225301e850f2f0f4da87d6944a8529ef79781909ad96d1f20596f93e17c57fb4d756974bbbf900521cb089eee0ded5c956a15b096162b07f Sig = 7bbb3ddd17a42be7cc4e7eaf456509a4ba58d40c49a3d99573b733e1942f9fca20ba8b910708d6e750367e847302fc603b8063c19af883e7507fb0d9cc2be37479a37cca25b8c7c46f6bf661dc6a3232f88b483f1b8f41b46d49ba3f1795d68eaad4a2556fb5d7873bbb6501ecf06ac558235ed13990b0e16f67965b09366bcb362cfc6fb978f4f68d8146dc8b819804df424e8ca5b63cf1fcf97bbf300d0b998860798a63424383fcd81d37773d59bb13b4fa5d468cd128bbab18a8ce5173be5d9d54d3177f0245788409973df4a9016b944baefbf3bf1146a9393d22e35ec2be0ae6f4c31dc4981f40fc1baf382600699eafcea92cbe24e26ee846fa23bc193b6e721401b7ac3f5f4ebeb633979f8ef35f4ab1117a869d5b9dbb7482f0d5a59e4163548d2512ae067205b57d030c483f720d2c44350428f5268943fc5f6ea1c88e2ec13ab3dc1456e96a3b8e7c121af4d6a5fe4ee55e99fbc3592a487c194bc2f2bf6e79fb79c2876cf3365e075beeacc7db4db7ee69e7f1fe12a327e6cb0f Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 0e675dac9aec910106a6ab219b4cceb52ded2549e899c9a24d5ee55177761888a3be1a2def6aa32d62f788132d6227d9309806fdc02db7d8a850ff2c6dff37fcd777f1a0acefdf18bf85f1a12979be86d799253945fc34a288f348b7923d764db27a2a2d5ae20e6b25372ef318f8596529d8ca23fd6f08a8f62e0a1b6d989f23 Sig = 8052d95f12ce0e6e53a5a356a0eb353bdcc1a66514d6cfb3a3d96155310bdda0a0d1795f97643f3a4496634f2dd9b95a2138ee390e1e74be3134f3f47a919ee7b59f8ecd272ab88c82cbce7c217e5f92d057a5b00fbf0575cdaecd7dc285a4218c8a955216598f0742671e018e8e4e76839a575f50b2102a8b77d1b84f6dce98d78e5758e0a6f92bf35d6a2f18ad400925d7880f9efc774a8c7ebf64885cd2f6f629b54a7c12ec91d39b3c2518241fdc322d9b235a8ea44f77e82f3dc4f728f620c07d1e7ff4094f29c674ab0f0802efa1c9e6481ebb84e0bf13ef468d8cca114570b9edcddf98ac4a834fe7a0d5c6fae8a60a48399f3c8af42ff4026e42a81aac36114ffc053f3f729b7cf9a97a56848ebea0115aa8298341aa226963ebdf57ab2d8e4b9000dd051a6c5d69f60e1dc1b33f2094fdbf8e5b627bc0764db9522cbbc081dbf38c21b13f980813bd2b00c757ebb8c0b21213152e694039f306f7342857651f722bdda01212a8552799bda6ef07c5207dc744ef7969afd5af2e6f12 Result = Pass Digest = SHA256 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = f6a7a6e52659125fbbc8727417283b9a64441f87121e27f386d5019f10cc9b961e09f1b3b0db23630cc0caacb3858c6f93afeeea7e1a6a80dbe0c2bd9c7c939570302dec39a4a25cc0cf1d32a71a75b9a0c302bcdd80b046c86651acf30838cd52e30399a8fab8d03fbd140cdc2f1f02f2480405169820ccb32e5974ffb8b1c8 Sig = 84603acbfe1f2f769f1a62b0f287f306940b225476714a4b6827c02d7bd052f303f30a5fa6da83e60615305669ca9ec177c5b32b1415eebef78620296ebad6dbbd520839d3aacc9781ac8602ddce0736dcfa7290b45f155b8e924d0afdf7dfc8d199bf09509d0176a68b145756eef53de456e17078859849a352a5bb654239d8ebaf8800ca8263d34a868d52bf8f22644dd9f3c05bd891cd92f263530c5896023c6b213ddb64ede1770ff1686c34036e281e911d9dc960354fd844cb7b22dc0cd81a96203ba818401ccc225f857e59a5cb7ba6dfc7f5135ea32781e63daa14fbda1bacc18ebc50824d4028b8fdecda49e810bae5acc8adc0dca2e236fc832a97330a1214fa0aed15cd10c049efb65ce855c060f05befb317b8065843c4eb5a0371fc6f209f6ffb948c881f2f2091caf0f59f60b72c5f67271bae96b913fd21fa1dfa975d5ecd62b0d50873b686d29c880d36edcad33ec3e2216c9cfcfb4f984c23fde815e280a802428608bed3739af9200de1f85edee2834c04942c068aacd2 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = bb294b95d913005b110987cde45887484ae6df794873dfc5c41fb7e8992c2fdce70699fcac8004699961b3ad1e1fce9ec8ea5685ccec5e80e4d0792559816f68613434bfaca81a843aac459a6fe35f5369c48e9191e4a32c70789594c5152db8d4bb02260012a8739cf325ddff2aa42fd67b6ee5bfe31591131ff27d0273d292 Sig = 32637c60798b450bff100bff12838357deff281d5b31e4f4c2cfc96eb779ce6d31b1ce8bd7aa7fa88ddc4279c8c3280604b018ccf452004a1488ed4750181c5025636511ac6724fe51761c27d7cf9a0c8782ea2231268853c4b1f7acb0005e5687c8f3df16c962f02ce56b23d387a2baadc8bec94229c3557526e61707a8b59293a976e32c7fa133285088f3ce3e677788aaa947e7622c757e844b117592be99fe45376f8b3013e8772ec92c5bb0b9fa301b95544599690ad93668d83b2daa7df05c66214e275014780a912d8b1932d7a655058e743f50b074b1d9691ca23a2f95f6affbd516d64ccb2aa43c236eb95d36d272545e3beb8ff5aacd95b30f7f1d6418af042cd9a0cf0189846262322a18875ae4c3e68e4e8ffaa0276cdd99a0047c86c0f71d2deefd50642d29c195e6d14fb46fbac33a508c1f03a232de08aae09faf1da8ed2ba2ae84bcca88b78dccbde9afde08a3beb322dc79356b29c84841698914b050beb75a7b2f6701aa8101a5a4955ee27bafe81b21d03b43e3c77398 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = f946c6bd5e1d6b89092f3c487c0568fa07c356fae9b8e831b8320289039746a435b122cfbc4a0d316bf90d481d3b7d979cc50d98c1190af8dc58e0035557dd5e94f437f41fab513202643a77748f76c6b77302bf40c392cd18731da082c99bdedeb70e15cd68bff59619cabcc92adcf122753c55afde0817352bc247d1170b8d Sig = 50706ba49d9a316688a3ee80a0bd986757d43ec83285af9e78196bd52c900d40b280fa0de54e35ace7d6660012f1a66204092f0e634b97e0e51665b4075e36f1422266c7cad7b2d9981b913df3fa3e6a5a1cadfc6378a8540e0faa26f1cc6fb2fb492a80d0a6945bce5bbc23ddb3b10701f0249b27407a6700802e8842ef3cc761c4823acb5d1453508dcdbb979e7bd8d00128e60a9b3789167c91417d93f0e9fbb00c9af1498e09eb6485eb94cea4883f6a256eab2caa826de4fdac01baca3a216e3d204a3d837ffd4d0be2b2cef711909054c4da1d5b93a8f98451c7002ae84a5e7080d98671c50e3c91c4087d0477b104f916010e742f2d207fb40d122d8f211af6d7c5eca49542d9acb0f166e36abc37155070c12e9f28b907d67a2ca70bfce554e1c44c91520e98fc9ad0c0ee477f750516476a94168066ce47000030a99c23e2c38755de946d5edf0d6aa94212f992315b248c1f82723b29c42216c78cdcb668f11278261cee9252c8fd0ed37d0a8580ca9b9fde7505615943712da19a Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 9a337d4c0bb9a005b47f4765d696d19dec58bc8482f2173a4a203a0b6d38b4961f6a852e76468e807c7e457683eead5cb8d98642fb76c0a1eeab36414c1899597d57aaf96782ada586f61a423f57953771d520cc4ead90d569f23d950f8dfedddb8355748576e6bbfb6f2e91b3da71753fd2f4ea229f6d20e27db8d05e9fcb68 Sig = cff7aa7f875642fb9343e07ef5e7303bbf5f069b44c19fbf83e59d422e25267ef9307414b6b1ef61711ed0013276d1a2ad98390474027a0a703bfe8a6e87706059d89c060980c9c9e60dc7e1fb9f777a41785ab4d2b663ba0e3c1921545c479c2a383a50da8e489cb22b71101d0ec148ac70928732a772195a140d080152762a9c40803a39fa2a6978c2a75ac4d8bd1bccaa1f4204ba65edddf32fedf2d9d0a3aed9b06c47e717733c577812d723dba74a852b2905235c812dc5f1d0df0f0de73dfb86221c6ffdd1eda119bbe98d148add36a4fe50489b06aaeefcb5c2066d90fa79738706cd18e474d69609ff1210c77de7cd23ba2a775a4329cb271a826d602c401a71439019cec10cd9f184c4d04584211827b19eadac3258d8a0f2631613f051aae0c613050cb24442f15ed4fe0dbd290e42629141bd2cd56d20584a1d10e1f2c2a9ec731433d5bcd1d318bed5243b4b7d0f9a7982061c55dfaa86b2c01845c021fdd2a978d42034212f43b3351b6adeb03bdd6caf7de059502f16d77348 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 32fd45e73f6f6949f20cab78c0cc31d814baea6389546a365d35f54f23f1d995b74101187760c89bb0b40b5057b182e2fafb50b8f5cad879e993d3cb6ae59f61f891da34310d3010441a7153a9a5e7f210ebe6bc97e1a4e33fd34bb8a14b4db6dd34f8c2d43f4ab19786060b1e70070e3ed4d5f6d561767c483d879d2fec8b9c Sig = c389613717ec7476ecda2144d0e8c8f9d66fb469c167c4209ec0bdeebfb471665d33dad47b8f3c319a76fe8a8a9f662b6c690b74903d17f61e2314e5ea8d26670ee4db4dad295b277ca08ade880de2e42d12b92952764c1dc808c266dbbedb670158eef36e896f55a203fb99556ded0597410ba37486b1d841f3d6d5c0b39f2f49f0c5794824fba94a8ec7c2b2c91eadd5c8cbe44895fe3be3bc1727d6fc0e5364f53578639d3b3af696b750a07853694ffe145a28c03620c78dd7377d094d92c3e09546883d4703e62a98ddf81fd01fcdf3c4b215224fe2b1b4992abf31f20d12afa868202390de334a846b2d58b253ea8ab3c5265d84773a659e8bac7af44123d9ea15062e65d4d419cf2d97077d0624f8e5c36f2c7b35ccf95435d5c36886ff9105a6c1ea225e15ea8cbc7b6bf6856151cd76fbb75b5b98f0e3db516a8e218189fcb1cd5de3cafeaa33ef135c5d8b8aa5f881afaacaf4c08bd7281255bc2a33b76d4a36e0b170c45588239e5b38c679b08cf802af73b6d79b3935949461e7 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = ab66cc487ec951f2119d6e0fa17a6d8feb7d07149bec7db20718e4f31d88c01f9a53d5ba7ece3a4dbc67af6a35d130eae762cb7962b9ae557ca38452464002223f61bcd3c7353e99d62558ceedfcb9374d4bbf89680c8e2b9585603e076f1cdb0058299b4246845dc79d1043b1422efe84018e4c932c45beb8851fbf485e36d2 Sig = b51331552b08be35a1698aa6203d84dbfff9001ed5dd776f2be4ddfc07dd4620e9654e82a33465bd20f11863c0ed02a0aea27a44d414c328a938bf877e15838ab99d670d01414262e8865dc1d9fc30fd0812699fa690c34f302f637ec802cd40ac8591e976c0b8bccb1b0137af64a2870210e8fa3dc431fe0956b8addff1e4b18cf07e078aa93af81bb3023c9e594e66595fd92b10226ea126005f4724427352c38e9e85fc2e0723f80af1f61599550b5ef54c5b38ca405738017b89cb9468d9741cd6bdf7112162251ba1d083cc370a4a8261c39b6b94bf21a53b7564531ae9ebc4ccea7ebb8bd314b2e13b58ed1018ae5b415e0f9e3e19a5ead3a44603f90674a190febde25f8ad8778aeead4d0f64fbae37166a54e3a763e35559bf8c3f173f19ff7bab98f3ef803dd56c07628399aff87485ee73dbc3db34ecc7bff3a53226cf87bc81d256e80c09520c8f38e9bcda095e3635128e1bedd9970600546a751eb11dab42e289d6fdfea04bd58d4571a79d24bce4508c54e1ec4cf75b985fd3 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = fef7fe89b9a59902a70a1d9caad09ced8bee4145edcbe3ef7fa6dab37635129f3b8c5e0860410ecbd9cec3d8693682f25aec08b071f05dc8213bac8cff5d52b576653560bc01575604e6ab90f67227fb5c901a781eddc027700913e54a7fe51318482c9ab42c9d2b911b7ccc39ccb290f9a420a5dad93394d4d7b8c53fe3f242 Sig = 45068ca6d82f2c123925cde11971215d8fa4a4df6848bb7654868700978764854638921bea5869280dc6ad9581ab43ff7012969948a5677fa0a66136a316a4bfecb89adf4131b5bedf3d4693b780d133af9bf9c133305be78374afda3ba3854203324481a9d10b9ca9b92dc7d74df531872ddfc76caa82de020e2c415643cbcc4280e6d2f4371fda7d9249314a8f437648991a9b03d71b5839ad38a1555ad34526994ba56870b6ea18011295f2ca2b0713b2e92ad77680c0dc5bed8d3b9b31ac14df769949c4a43ea67f6deeb3dc9ed589ea4e8a2cf6695df46f946f1467b28e875477ae4e645080fafda6dd551d2c02fd6b2b194fc0bdb050e06d4c784105f5a33b53e73098055963071efc1bf397fd325f3a6f4e10d76f0411a001e62ec73729018316f56310f893a59363d1f6fe5c17444b6c728a4933b75212fdfa258e4018b7763951ab4e5096411df9e5bc16df3896e46c973d32ac9276a4e2b5b80e3d8d798dc0470b45096b4d738669ce052ed818e560af1e92c915187d66cc308b70 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 82b3840eeb95c9c57724c70f112b6c2dc617c31785acd0c823f8bcdda285325eb3d308dc790522bc90db93d24ee0063249e55d4219ad97145feaf7f30668623cc8890a70f4f149866f82cf86f98b0053b23c98c8dd5e9107e341460e9bf5d88cc8bcd1f2e4c007cc1c02c4529b93233a0b06bdd15925854ab9e3f156eb925bf5 Sig = 0593b9fd4421452376d27bc7a280101cfd6e88a6727d7d77cf65ceb723ecd257f32fe10277e85798e0da75917736da1a3bfc22adc7658fbb84da6ebea0b07d1cc405732fb040b585c1b63c8034069bffb8220656f1ac54ce693720d6fb1b5aec67b03c887c8077da148d10f48af7c028f992b18f13c0e57530c086d775483da5f66f3a6a19187868340ac63c6212bcbd6cbb7beda8620afd9b66de47473ef24d1b6a36f4ece9add49514fdf1d84c7a785b7f0e00f382235899790f472d13f48558a4314742f376808dec96edd2e229e943f7b983bea5ec6edfa5e9bb37f588e55ef62ebc9214beaf9da502434e1088df272c6c77c1e1d897c47beab77e3bbe317f8d43d21fd7e94337c7e263e2867bf580a2a8ecb9e36ab7d3e1d5cf9a23230953d59df0d7e23558fb612b7918abba31b164ce178818a1a9e6b6687f4de685d70e16bef6e192faedfe0b2b95477d37b0a3a2d002f33ef4321cb905040ce06fda1c98a008767fbc781a1eaf3375dab8664b590336b99e157b8687a6602fef6a3b Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = e153cca4431ed9713f4744ba054f5f191cb37b280108ae3a114ad349a872d1308b46211a83758a3b4be32fbeac42ccfee7e23df853ca400147077bb43a44c12f299b917f3aabdf589eeb1709bb3d60b08bc71eaa3ffeba4e2903a5dbd8339aae85fa24b9aee76130000605857a6aa197d00926270dcda58b7de758a6ca67e617 Sig = a835cd4146bef465642d494936268a311a5490d2c9f9166c6ce98216a9a23a643597300a0050e6445abd5a9bfc7a2d9b70726c824c383bf5acaddddc34d434a31e5314d25fb58e258f518866c136e52855c16fe64ff8f1c4d66c4e9e39b8cb1196d80944d0746c0a3e1769cd4167df72ab5e4c9dbae9cb35f4828e12099f9b36a5a70c48d4aec9872d7b19e1291b33cbdf08a2263d500c0a83b5237ef6ce92de344b3b41d0d07404fcd5467b046b52b8f85fc6b5d7afc437f1ee9e78390ca9bb6cec618885ece29758f2fd6f4e5f4f896935de5f67cc04055a4c4c0fba5def8d2caa179331a85501ed25822ae79da9bc815cc39c6a979211083e8683136c942e1e17e9eb8f84aacf091aa1e51665fae446bc48c304af65391f279afb98b92e04c2b73d9d94e991198fe7781f0f9696fcba2c03485f76e6de30b9535cf3903db2f3afa851a47bcde72d4ed2e8fabf9bb7d4696cb4ab8c289b0c21e1f979ebc532e280cd9010df4ee72f84bb9e82752828f167030c0fe348ebc31ec17b8f07d94b Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 9c63899dfc7bdc0db384727244caf71ecfb9b8792b9f57e936b3c2f5695565a9b0979f3c78fd73f00981813a16da342392fe3ceec6e63ffba191cbeb4f4b90050d2fccd83beb0622b2c3fff159d9e608f3abcb843bdd56c03339b975b9f4e3265b32f6bb6ccdfc6c5752d6e0344d749699c74c85b30c04ff95b272dbcfd6c7d3 Sig = 4d38a297302ad0770d9729ce5b7212eef287ce0250f403e32b4acc3617dc0d2edcccc2d580ddbdbca5722b70704058a3b807f592e400bd563fcaa8b066a614b4906f1433968ed2f520a2f6b034d4b2d6890a241afd1adb8639a6cad9dbfd2e278dfebf79740d75f295759d29130b19ab19983dd68f779de41ffefd4e82b5e62f72f90efb73437f08a2503dd9819dae20ba9706c199de9cf884433eeb756286a85eae14bf9f6dbeb705461d91822282f18efbb10589a578f2c9c345b079a7e9dd07fd4b34051b27119729906c77dfb7d2f8fa6bdd5faa1e132bfba9d391e66395e67f01353fa275eace8b53aa91cb6fb693e19191d42a4c1a85a0c504b1c85f49a4d60936dee4646aca62a94aa4bc7828c1ffafde8be656317d506abec179cc90191d12356ff50644d3e01aa5bcfdd71d3c828dc3539dc0cf3fe8b9b91e0c2524f6a3710379c90affd0d0a50d74387f9ca88b46463ef1bdba58cc9a36e5c2c435a20d968350d15d941c3212cdce815592b310d259860de1dc1a3d70ac22302a51 Result = Pass Digest = SHA384 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 04846c2e676ac73160bf4e45652bdc6cc4d4c9284577b4320ab77f6ebbb59a1fe0e085588e0f90b346cde6441af3c9d0117d1f3bcd962e406bf5a465ab6cda2d51be598fcbb29ea713651aacd7e47d22d8fa3450904730f51792ea374761a4dc1fc6f1bc657b77768f31f463e4267fc8dff61150d4b343b9d53759cdd7b98094 Sig = 103bee57e25be8c3a2f774e739b47f93435e414932c0494b6b6aa2475bf7c9305c73747e0adf82c2032007b3f75a69c93112617a62566c5a2deaa25fb95209da49fe9c161cb2ffa40fd9d77f1ff660c8b6cd3b54e3e79a759c57c5719802c9311db704ba3c67b4a3113754a41b8da59c645be3909e7db7e7cf7294dab44f74240f81a281eecd6ef31c7cf18b1a19c7d02a312b91d6edfaa954462d34740af5ab708db5a10b00c542be82fa2b2026b09ef38a4001457e27a6023770e4b4d5003267c85c9eea1d5f8d770bd40b554d5b4daf146dccabac3ea8a13a05c3bddfc971c5158fac027ca19b7232621e9d2e37b6a655af545e44a298be78cd475c22a48bff7c3494a5f8a6abdf1a46f9de082e374fd598867d61e4d51daed84152e43cc6a2affae205edc52613480d411aba84fcc9b69d1c28f16f76836901a7c5b3eb2f2c940d0a3fad38a8efab968a0c85eb22e11d3d0861136ced5f06734fdf8d4f151d23861b1cba9b9c580d3350c76d4dc808461d5f872ec548b2b427dff74b1d1a Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = db6c9d4badb1d9b74d68346448b4d5340631783b5a35ac2458563ed0672cf54197587fb734c4ac189b2dda954cdfb18b41c010a77e90464eea6f863c5da0956bfa8cc636bf0a28be5addfe8d3e7e6f79f71d7fcbbae23ea141783f91d6cc4c8fad125811760ab57133818892471a79c6d04eafef37b2fbe506785318f9398377 Sig = d480d5a979ad1a0c4ca329ebd88a4aa6948a8cf66a3c0bfee2254409c53054d6fff59f72a46f02c668146a144f8f2ba7c4e6b4de31400eba00ae3ee87589dcb6ea139e70f7704f691bc37d722f62bb3b2cd303a34d92fde4deb54a64dd39184382d59ccaf0c07a7ea4107d0808260ed8d421cb8b1407cdf9e915159282b9f7bffdbf40d877885da7399edebd300a7e77a908f756659a1824f95c8a812aa540ebaa64ab54a233723db55caa8b4466ea9ae6614ad1bb869e9d8e0d032f3901671e94c0b673be6537cd54278ed3da2e1edbc04ee3a9e8070d73ba0ffb93e60f30b87ff3862e9c53908f2c8e99915668c1f46635e05bf7163051ff9d92bc71a626553c69dfdd06a49f7ff1ed51e918f3ed801dae62ca276d7063d72a6ebc136ba06cfedf5aa23277e81008c63b2e0083d0fd6814f6d4b4b40a42e8c0206f3c356a5ec709b7c8a4b74b7b48d53c9d8694d27359c2c7701938d2f0161721a57313bb1a2e11da215872498182493d8517043b4c03f93446aac93830276542026ce83055 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = d5dd3b6ce9772d9a97fe21648497783bac5bb5254aad82b6f7cbf43b15a40f386eea8d151967db149e9465865968133f246e1347301adad2345d6572ca77c58c150dda09a87b5f4da36b266d1fa7a59ccd2bb2e7d97f8b2315431923530b762e126eacaf5e5ac02ff1aaef819efb373cf0bb196f0e829e8fe1a698b4790a2a05 Sig = bf9e8b4f2ae513f73d788958003733dbe20957b147b17c3f4fd6d024e8e83f07b65d9f3dbc3b1fe84da021ceabfccd8c57a014fbe5a2bce3e4051b7d03e09fc0350b6a21fad214ae7a073277c77a40dc44a5aeea5194a756b69c93977b69ee9294360eaa73a574548fa6a974a7cd5a6adcf09e80631156af85a8e5c5317e189eead47e2ead65c381396b5cacde260e937284a8e90eff2cbcb9dee22925f2f7256f74c67cf3ffc7b8ce657e8d135f0f376d9d936a79792c981614d98e3f7d662a4fd46dcda96916b32f366ed27dab188f184b984df0b559710d8ff2040be462f91943501bda4840fdd5c8ec15d189064def756e545db319e007c433f0468a6723357ba47d156ab7652b06ae2b18874f0771c626466dbd6423e6cbc518b5e4ae7b8f15e0f2d0471a9516dfa9591697f742862324d8d103fb631d6c2073d406b65cdee7bda543e2e9ebff9906985d1cb365172ea623ed7aa4c7a322f0984680e34e99bc6231b02e3d14581608bc55bca7fbe22d7f03e904da4552e009e5607f0418 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 591652b6eb1b52c9bebd583256c2228680110b878917dea5ad69e8c5d2ab514277b0ac31e7e2cceab2e5d9c45d77a41f599b38a832f6b2d8097952be4440d1ff84baf51bd70b64f130aeb686145fcd02953869fb841af7f6e34eaa2b996ccd89697c58fa255cc1e81f621400e14146361e31c709e84a56082231199539f7ede9 Sig = 1de79d7216dde125deb77c34d90ab321a4de5fb11c296656ad9bf9a24653591117ace415e18eadce92823f31afe56fc8e29494e37cf2ba85abc3bac66e019584799aee234ad5559e21c7fd4ffd24d82649f679b4c05d8c15d3d4574a2e76b1f3ee9f8dec0af60b0ced1be8a19c2fa71bcbc1fb190899ec8556958e0782ace7196b36658656cf364d3773de86260fd8987604ef35eae8f38ec2cb0da864cca719219c2ad71c08506c412ec77995f37439c856977b71dfb9647990ef70faf43273ae60839cd0679ec9aa42bf914e421b797cba218a400ff9dbaa206cb9c2b0596c709a322b73cb82721d79f9db24211bf075a1cef74e8f6d2ba07fe0dc8a60f48af511ad469dcd06e07a4ce68072139c46d8be5e721253c3b18b3c94485ce55c0e7c1cbc39b77bc6bb7e5e9f42b1539e442da857658c9e771ccb86be7397647efbc0ccb2c3ad31ac4e32bf248cc0ced3a4f094526b25631cb50247096129b08a9c2cdfb775978b0feee265a6c41991c1dc4452615b78c906c7ed1bd207969d98d0 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 8dffaa9151271ad22622f228c892e1d9748b3c394397f2cbb6febeaa9244a027eef28db48a9a660162152764830f617e1ec6ea1cdb0ed25b6f999a107175a16669d6dfc92b16d50363fac4a570371ea976343a55ae124b6301ea935ed655d44f28320899dba35122505933b3371201a2a45f95ae65ab442a9479125e68ed212a Sig = b329aef83a56ddc57cd9a0e15eb0b0b7aea7d78d5e8ca3982bd31cc825a0cd1c444d9f7bea9e7a27f3bbb3761060ff95fee1a3e864d2108fc40b64786a96a6d62d201217e03a8ba2c07ee94c267149d1e72cc5779b737e8547acd6aa4bba3ff38bf9687e9e82f511b597ad7ec1d795c36a98bf83a90fc86b0cad41953360738921936a458674b2e9a7012ac3029fdb0a9d12318202d2544a0d976ee536e03b7e8d894b3b9c762dab0110849cc1eaad747e3d88d7dcf49f824df027e645c0b9294e655d9fc9e1ef95eb53aaff5775c349486d4b5d67dba29b6217f8b9976612b57e16fc1f99983f2af04579938606879b7c7253e870714b4f0f24e26dc8c7a6fceffb5f98e3b2fb5db949d2f98cd1ae1aa552696b48c39f678e154351cc756d3e9a97f79279853ebd0db9ae6859fb2d5721385d06f5565a3a8ff0992d517acda1af69a92854a1b32a79cb9e442a90b055bb2ec3af8d9926a0d857e3cb1e7e4a7300d1accb9492ec7832af453529ff0f4a6ad3259757f707f713aaa5df231f7487 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 71d4163e708c121e931bb9692b217dddd35c7346f61cfc9591f7a4313abd4a9262af820bd7eb37e78c2b95b89daf25ec8e783aa1d4b78dbb96852433b4d478b109a6d65eed7d06f3fe122b172149eae7c365ced66578ebb7571ec218c36b65d2ee22dcdebb28c66a7138432cbdd712f7fb8bf78cb14860b25c2b4789706b5a1b Sig = 2522ee3bda30c0434e54b199da8c9733964fd402b707f5b330f4f754a0502c7a713c7814f0e851a4a4db72690db96ea8b8813bd8629a948bb30c1b8272a816b30a755fc6fb1754167c3eb1f194395907a56cf5a73b4154383a05b78b731fedd9077f3c2267a5cf926697871fe0a4bed9c219552dd1c87aff50613094bcaa2dec42a35380a6bac673da2594f824a8f32f21d7593a3e49c78ee280193a478621d3b095c16dce72935314d4a2323eebe7855ca4738a19b5a31a5f95ab91fbe1289c02fea7a65b91327b7b9790556289e1b988e45d50eb8cea1581de5d5dfd21001c73b43921d8b21b9644b0f2b96ee6b09d73709c33338143d6a2fec559a436c5ec865d3acca5fee654f1325ae57255dfd42188c84dcb1f7c1e86028a74e31d736078741ee97c39a56e4de00fc12b8051835bbd0d8fcae737322099adc1017107022dd15c114da57e78b95681ba9945615b59da90f5a2a99a252eb42b2006eedd6e78476c2905473ee6b4f23c1c5cf0b80451c5426ea009141cb3fcb0df2ded92be Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = d00e1529228c79a20a1c3668ffa4a54140bb170bc5c669fd7560d9309900175e91d5a0e9c5f5471fdfb714bc385d52b08ff7e4230184d8b735593f0dd8c73b8a49f8595b951a21b6a5bfec63b684f67c0af1b471dda1684e9ba3f241501fe957603dea86784230f0c4fd65666361b82b187330fb4267404c0e059bd4eb52494b Sig = 1835dd97e5093a33ce1e62d683863f6b3507f358a62fc879b524350fbc7330681cb0c682eef4330419caf8543bd9269b6d91d8e107ec38b6e9c6eaabf906457205d52a900e05579aa11fc581375264e69a925798e5a348e5a16f1567d5d0e40853380b34deac93ad7377aae8a27b090d0d3a92bf7a824d926e2e35a0c3bd0e990b591120d74dd9b052a73568e3c3f29c5a77fb1c921bce9c1e7f764aa67bac119f5839a5303860edeb634814c2386c831fee6200cf55b6bfea058b795a0fcf26eb7216ae1b7587c82e5685e584170cbddc89a77e0989d4ce5c3c7fdb664aaeaadbce1f231e64798f6f9a85456b5a93a502126a80e2d21f46921cc3601f5ecdbd56998a63b865fce7eb299f76af40e91281bfc019f40e0d46811e383691e4024c94566f18024ff2b22aa7e1270233ff16e92f89c68509ea0be2d34511581d472207d1b65f7ede45133de87a5ffb9262c1ff84088ff04c0183f48467996a94d82ba7510cb0b36cf2548209a50603375cb82e678f51493345ca33f9345ffdf54be9 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = a35926685561f09f30925e94d74e5661892a2ddd524f751f8321163d611ea1591a08e0dffd46b208e98815a306aa8514b4db859dc1fe7bdcdf50c095554bf8b2f4cb9f884d70e55c2143bc26199c2f94b743f5528dd54689ad69eda660749f5c1bea8becaea632a4bf0c79a577edfcea7baaa6861e9d7f2dd5b4c4f6eb5f3d5f Sig = b1a9c45a264d2c9af441a7b2d330dd788089ccef205d5d666bfe864367be9738124e9d74648ad99160bd3af81a81858babe667a5d95c980fe2f6ac34861eb2ec9b4b4e8b642ef3820f56ca388a556530d42754c47212e9b2f25238a1ef5afe29be63408cf38caa2d23a78824ae0b925975d3e983558df6d2e9b1d34a18b1d973ffaccc745e527ce76c663e903719355e45cd6d118ed0b85b70cbb8e496411353f84f8866a01fadc819ca0ff95bbe2cc68c8cf78da5581becc96247b911d185ed1fae36c4cad26208eb80883f42a08123dac68d88f2f9893cde02ef5a57661db2b3e1e9269cbb0e15c407bcf55d92e679383c90802cd0bffd469646dcb60ca01a1dead43228934018391dd81f8b7e797e527fbe1815b91bf3cd6a1f2ffbf5dd166acd5526761ca8bab5d463fb9fb820659f5cd50f8150f12f7e8d52e77773c1e6480c2cc184d411d641f71a9dedc2c5fc2ec37a2770a9383bfbf6a489cf32b56a12cf99378e39b50bdadb9f0591b2065f9d44e511c9dfb6158fddddd1bc2cece6 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 1271a0ddb99a0e1e9a501ca33c131b0a1c7820a397790869090fba373703ac38ea00a9a0ddeed199d97be1801ffab45206710a61e5ed894c3319012ded0ff414386e56b548ad915d80afcc2bdb976d7c8adddca7dfa28aeb694033a5612660c644e32f85c2805651d713660a38914d70f0e41fdc4b3d162ef3acd70659eef637 Sig = bffd010b2ec4e4a32777b77619b87622f8921dab56e102c8d824fe52b5df7a203fe71799eeafdcc0c8872dba6a374407b5639aeb5a30a904712f15097dba0f2d62e845412395cf09540abd6e10c1a2e23dbf2fe1dfd2b02af4eea47515957fa3738b06411a551f8f8dc4b85ea7f5a3a1e26ccc4498bd64af8038c1da5cbd8e80b3cbacdef1a41ec5af205566c8dd80b2eadaf97dd0aa9833ba3fd0e4b673e2f8960b04eda76161643914242b961e74deae497caf005b00515d78492ec2c2deb60a57b9dce36e68dd82007d942ae7c023e1210f0be8a3eb3f004824074b8f725eaf8ac773e60fbbb7cba9630e88b69c8bcb2d74dbdb29bfff8b22545b80bb634e4c05f73e002a928efd5a6aa45621ce1b032a2244de48f4df4358156678cbe039c9ebe4cee945a25b9038469fe00c3092936a8cff9369045f906733a9d2ab3660182069b157ca8f9b99a71fc153c68301e97a38fc3a87ae2b6f03754e6da82d0b0726e0703979c9320289feefbcddcd9d706b71b51e9a1b9dc1412e6ed4b56676 Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = f30c783b4eaeb465767fa1b96d0af52435d85fab912b6aba10efa5b946ed01e15d427a4ecd0ff9556773791798b66956ecc75288d1e9ba2a9ea94857d3132999a225b1ffaf844670156e7a3ea9f077fe8259a098b9ee759a6ddfb7d20a7acd1bcb9f67777e74615e8859ea56281fe5c400748f02d1a263b1867a3b51748ab70f Sig = 345e2f60f7c82c89ef7dfd7dff2bc2348bab020479330899d4410213b35e98d9bac92fd8ae806b5bce8a6c4bd8275b0facb4dd13f9d68ba67141fa5085264da6dd685a6d212170a2c9cbf2cf5930180effc250868c984bf50ff69d6069ea28f5bc1b63705d0732416fd829a5f5d6217462c22a33fd4652f7c1d198794646c08406024e8163a7ebe39cfb514c5443897b5894dd19a213e037f27e0ffbd6c5447a805a54dfdf4f65819d4e0fbee25e3dac47fb6b636e8de6190adccbcee937d0977b35b973606b0ca348758b50cdbba028b73d0ef01c56014c031c598fe8db87d2ca4644770aaa0451c376ded82ff5c6b8e7d2ed9d1c8a17c3122c128273c60fd1b0088dfbc9c927f162e43879405964cb11ef7899123feb8f88dd2734df98aa696d936a8df07000e84af90101f7006a9bd2549fdd0ad3f9de093012d32d2afaa828017ee9c607cbf5b54f223666d4b5f3e26e0dfec003961b83d83de39ff6a0e81e1883c1db4aaaf082fec5aa30a7e578553d89774c67907790c96dc4f5be4c8c Result = Pass Digest = SHA512 Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a Msg = 132cf50c66ac4cc54339751a0ebb865e1d3d320562fc905c4abd1e78e464066c46c3a0c02db0371ee35a104d66dda864c6133e37cfad9116e883ebb73b295e7016c34ea9911a309272ef90114d8f59fff0a75193fe5ae31ed99121f9c59209bc4bd507b1dc12bc89b79ffe4d0df9209762a1730136290cdee58ec828ccc88eba Sig = b12503b7b2f783618884174bcb9be10877960431ed6363c807e12db71b8b6bd9d6401d064e253740158e8b900152d37faf20333a7d80b3d47c7c7a3fa12091ce31cd8aae272a4da15fe2cb5cfdea541195a469c96bcf695e0b526dfa48a59003c6763af8136392c4b8d24db314746f42aca550acc65e074913ab82232eb8593509158a8ba34bc0f0e3125a834a3ed2d6a8cb1d085f234ae868b86aea8d6f82e13a08842485066e48aae4837873150f44475e12602b552dcb34d1f9fdaadbc6bff5134c6fc76263888be67efe63ee1840fa08c49938858a9d48b1058d18976bf2e3bfc625552f75b3ea44eb91dd366865f240a0c336a0110e0fa09d09cd94c70cbc8895ae3d44ae3dff545f0e8c8cc662ecd40f9099a952494396c6b423ebb463409969281cdd54ad87a308e487ce19745b30d5da76b98d2aa9a007a55783b3037e5b8662322810bdd11d86dc3f61451149391fb2f14ed9c17c751623a4042ce7edb875ee27bcd1f19d6dc9283ad06d15e097e2b0b15a7eb7128adbca0aa6adcc Result = Pass # Additional test vectors. # Invalid key, no version Digest = SHA256 Key = 308204a10282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # Invalid key, version = -1 Digest = SHA256 Key = 308204a40201ff0282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # Invalid key, version = 1 Digest = SHA256 Key = 308204a40201010282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # Invalid key, version = 2 Digest = SHA256 Key = 308204a40201020282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # 2048-bit key with p < q Digest = SHA256 Key = 308204a30201000282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001028201007df2de1548f720499020d0c98ecf931f3036c938fc4c76f9fa479294b2aa98b8b6cc1f2d8cc72afb926c048d1d783bbfee2723e71d13c9b2b96baf0850511b22ccb040f25c82458e6776f7541575a0b9300ff2224dbb726bde235226d48d10d1762433cfbcce5e8c99c2c7d266f71a2605fd42d54f98da8e0720cb4f7f7f70d2668b89cb57fde159ac7922756fd161379a5693168c388b7e1468552f67f896f69740e80e13b9badee87b7116e559c1e428276cc9d4788b0ee25f10ed560daa8339aeb52d8bb2b05a2e1e16e3fb348ae5feb5dbaf53a7d8a318865e1a746374df077d85120b02e3f0ceba47cc734c96ed6dac65f11bde2db2f1ffaec0da5924c102818100c045a3996d1465c73ca839c442b1026c82e418c68a5f96b34ff36557144a86af092b8c2873c42ac08d66e2f471c4094098be48058ed2bb0ebf0beb896f0eb18eea16d475914c901e35dffbcc257f19260819213c46eac7e508aae0114b98770471949f006d42a6c2e07d590e1f5f14747239154f65155daa4bea84f5ee8d2c7102818100d5f20732ea986dd3d1245dce180595a7f48b36c58f1576f6782062a4f1790871bfb2e31b96f1b596c59b6624cc2b56c441e4970fffe70e59c0fca099b598170106a60e32725c35401271ba2216039c627b18a2e319331c1444238724ba7c80e2f35d13fc0662638b414f7c12fe66db22328fa892a4b7632ea2c24f6b06fb3535028180448f5073e0127aec5d73bb0d819e6eb7d4c0931910b45f1f576df9ffe00b67153916df26798944995e92867115b40a7c8f3aa2a1e0b8c1dcd340e3df20cbc382ab7432942d9878775d4c9e13c0771eb79201abf93b6c7294f7cf3e90cc3cf48b9018a7cdd6280320d03dc228a805165d2371b9689329d83966529cd0b91c7bf1028181009f1bbed4d3f9067ca7a63709057e69bd1db5c6c707d13bc6b2b1cb0ac5f6701c4027a694a71e1d2102d6be1111b20d762956fa2d50f0221107e01904173403afa4a52c1bc246e6e73e904b8ffbf535815bf0877b030baa8f3bd97c31096b7c62cc0065d361601c8dbcc5830d911b274ef8713439d2bbfbcbfc092c0cf9852b1d02818058e7d95fe1a95fe10f60b59eba5c8c28c8eeaa82956a3035f37e7570f5ff91a104a5df77ba13a09bedb22018e2ac7461471b5e719ab202032cb3905391b7d15c74b36aff25c83987726e0ef1362c1b8f4f8282f2c4fd6a38a9a15e63400b92bfff31cbfc375313dc40f9cf19e031ededd32c47de6b3a99696a903638c4d6969a Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 912209edbd684deaca5855ea6cc89ba16753caca12df2e18f56228f0c2ccaa3bb5e45aa2107dbe2cb5b5c3e1af159c858aa9f665df4433e5b8df78452da436310beded396ce5ab4fc3882ed72ccb1a2a9226ea4177deb2d341ae88aba789106cee2b25ad4049c47a46d05c94ebd39416674adfef4a212cf139a5283b8ec51d54c21461e302cdcbd8ce9f7659b7d88195912d706cfe30f68ca8419054e22f0be31f86e49135b86e3021dd43baec6a0cd24042d81f71f8a1e23079e6ab1f8cd7b3fec2882e93f6e724d3dec5a2e7883c56b8d9773036f116325bc6cb934968a780b66251e4583fde426e63951b8dc380ae29751ba5cfba759c4f192bc373775d44 Result = Pass # 4096-bit key with p < q Digest = SHA512 Key = 308209270201000282020100cefe6a02d3b9919783aacc1e555888b6aecc45c76bf28f0efc673a4576d44db983f5669fa28bf31966d1124d01c0f1e9976796a4f7855115f74b59f65aa17d3e56b3a265ef91463a562fd2e770077cf7a0cfc4d0903c812622a141076046bd2b334e2072e21b9cd9d949cbaa010d73fc7c1f5337431a18fc93930509c713ee4e773818134912d7cfbaab4b57038d645cca237b2fc367f76b26200894e174d3c4265f58765ca0e81e2525db528afabc5d149e60ae2aae8e313138b27c4bc901f9612728ab7a32564d3d93aff6ba0033c9e8db84cbc1a2f0de32a275318836c07f07c51cf5ed43c5c727a4e2541a78c91e6a7609edf4c1c0cdfc59fd63621223ff297f63096f876cfa93449994597ef27e47371ae5c3ad575b6fda18fcbc314eda54411aaec457d52e1a44da6ea0d6f43ace949f6a6e9d5a917edca6cb38b217e9bef4279b8b98dcd603ca299dc3173fdb3978fa6926e8a0dacd58162e9337b9c5af7f7260b2c4f4cde6bc7a71f1a56974b72c721c57eb925860562b744d32a65cd2577e70e8e00cfc528d54186bfd6c3fb84a081ee7f5c8a8ff388296f021ca13b99e5ca6e773adfb6a6b7206a23078cdcfb57db1f1cd7d21e283bbd8a7c1e8d2eef46008ad2fd440d6959ed18bb84831d872d79e1ac4260caf481faa9bba227e15a1b61bff8249c9b60d44056118969242b004059f85c0125b1fbc47cfd4772f020301000102820200607f0a3cb727535026f9809ec37aba812f8bdb1bd49f07421d38a259afc3d9581ac4544b2723c6f8988deed22777234f9a5d9844df7f2f05e67b223d4e92ea281d9330aa04bcdcd8654576349e6d5f3cb1a32a457078445cdad801d0c67933c6e7ec0c0482940cd32210dcf92bf47195cae76f8bdba456f1a87a6966dd7fd5208f437f35be6322689cc52e222a6dc7d3da08206d6bd313ecc7a1375ef09bddfd1b46679f061f9d16308b2d6b958ebe3146636efec2b70d62b167950d8ce6f01ca9c5ef97c127a643ebe8e5a7479ec085e8202e102efd1efcf6edf56459f3ec594bee004a4589cab1c53180b16485da7c6b750bbbfad63863ceb8c4ff87c09d368761e95315c1187aa04e86a33144803b14f50b5659a5af214e3338bce3801b06cea9887a10cc17d826429f45dac630bffb0fddee5aec3bd8b85202d4b33e8aed30b9366eda3380feefbc243333ed5d013e7e91cdcd9ca9e5b8b269046e190aea052b62d59394881b0682dbe1c3c075cf9a58bf1a0b3fb87093a18337f8eed96502c24e92176e02d627e468e9d539f5c57e95c0c278e84f75f0bfe57044f94a9f29fc9752f9d625813e46905a3f863d95dc55d43c9cecea0b21624ae92911f270bde30f8174327abb33f4467e7eeb19b58fd6ffcbd4e9a9c24d8443550605a5bc1c47824f9e3da734e3b3999b40fb0cfd9391648ea4ea7a42cc822d384f3e28410282010100d36b7085d0e46e43171c196feb4fb4a620afb13165df1d4704840ddbfda6f5e0211a09ac4ca93a50d1fc4b9a1a6b3cce695240f150f4fc40749381640e03d6443c2e927e76961c95011a20ffe96c0202572e211e0f6ecd30a77d55e15b7d71fc0d2aa8d440212197d13d5449400ae65eae7c464fb5e019fc61f403249fd3c97fabece326d47e4246ed5f8f4a6cc7ef2074807397f25b3eb25c88fa8e394b1d5f25dff6dc7facaa2c4ff4e90b60c5b56841f335d0db13f1bfc2b3a84362f14861245e3010e4816c6261d7b29fa8ebc638eb8cb68bfdca48c426a56ae8fbda8a2db20727b1e372b7f11f56efc2d7e5aaea2d7c0f6b10872c0a3b4a7fcb788ab93d0282010100faa41019d952a30d1472b7185d7eee7aff729027383baf87ce4e691b8c16edbbb5ee7f621d006150761c6757f5cbd00a3a17534b1fb6ca777b7b6507421d7adc94e258c87b15288988cb9e4eaed4759041f34d05eb14468a26b98e2ba435697acd6366884e16d2bee912445a2ad91ba73a058f2fb03db6d4f460c2688303f23712ea5c601551d1a5267b2f782494eb43287a490bbd0118c247dfad2b487d1f20989b0f636ebd4cf28843de937d34e48b35d8eee7d9718f342d825955f4c04ee8d6f4b9e26fb1f7acba75f9b65d85fbc428408f623ed94c1f83f48bec1cbbe6dcbd65e1466052d350f4c17aadf7f3b9a4fe9f12d5dee380f3386478cb784800db028201001f5a649283bb0c9b0877535264ac2a5724abc97450ee38924a9a26d0041ad985c682ed024f501d64d4ef3c6afb16022b7e35038a85fdfed6b43317d235bdddedba9b11808da78f4f8d9d495d8a494936fda4caa6819565fa9c2c1b2b537d140554128a7d0791a240b87806e2e20b7bc478cdd74384ee5a0c329e9444bf2b124bcbbc52a77485d0e061dd750b8d7c4cfb1c2bdc78a12964efe08733d919a809100e36db8e31a4f28ba5c3e53799bf583ac0e5078b14a22d8cc99c090d0d4448fe96fd1cd5b47d790c520441ea298be596956005c656f9c3b6cb2066ed6c44298fc3420a61f820102543078a80f3b18c9a33ea9d02bcadbf1b3955c003f5b964e50282010070f1554010aa2847509b90de2de370db8418bfd4ac8658c6bdb49fb086241ee4a34ae1a3f8a59f347ec4b5dcf129f289693bf190bcadc5f6a97225486c0694c2a96485d571814b4f0e9192b8aa179b1272658ca3ca16cce29c28a964090ef88519e05ce7b72899b6e59811acfff9ed7821b137a0a9ae65a0f8ae516c7efd5c3c6d0da6aab570b523d27f5818af835bb05ba11f2166fe0386289526978686bb6c18d866cacbb009e89076e4e95956685642e18a667799b08a36a7b2520584530aa1328e40f74c1eeb7aea86a822e4a95aef388864212612237176d546847c37bfe8a8ec26a6692c4822c2bce1800617f5bdb738e99f12ad9cec207a3e55e93c590282010037217ba957fea90049c4cbe3b410b44250541ec5e846008a3f80620e7674d56265e22b8c724816d90bd9c111c003c3f2b11f5c56c3205ca47f61e036a7319d6019e06aa18d7e070cb04c7cfc7a66f1f736ef121e970b7a4f6d4f7c3924f135fc01d7cdeba27ea1bb7aecfedf05dcfd2f5311d3f0f458dd4eb3c48ca45ddf5ac2dd6c7ca3367ec8346c8f5e124be3262989aba3bb28012606b8727de275e7c9b5f86eadbb8b6f6acd583fb61ececedf15b02ce6539385f5df185c6e973a336a036506a7499d1e08b3071bb40eb71d166e748c3419642496ca46efe09c1fa0aa77e0a5adeec50536b4ef112a0782a9182661aeb568ced30b24833e7d4199f78f74 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 98a95ccad59ccd39b1da810b53c9c0ce7b4b0acd65c0ffb788c88c856ea3ecabbe7015d4bf36b7c3de7c4c7c18063428afc567b94d4396048cea1a3b56544928e28b15360f9f5be7e700eb3b4d64b47061df1c0e096015bdf1329ef7a8a507ef56fa9330df4b1f3f097968839a60d1a6f1bb5b247032dc60b2889085d1dea210cff53c444b3f614d051cb41d8f171df025712bf57497f57e3c3e424685a8858f431a90d689dc1f7b41f868f0e1a6ef612710f365ff2bf90f2db89d61d9ab9fffac16581daec6ae1ab9f49c8dfd33a55f7b1e431fdd413649070e0a915f25363d3ddc2091fbfbf0fbeafe49753038dfce6973458af66a3d318eb7caa44d3fea95c46f40976398299db270e04dd20e77360013fcca04874307590429b13301be5f47a9681af6a47e5eaa53dc7ea05cadeef4ac96bc2c8e14ec9d0966e035898525c92fe7f0bc3a8996246f42da5dc0fb14cd856fe5bc51c031b3d83870ae89e9cdb1cbb2605b3f8bf4a978435c80a0e99a1a60b4e1a45d77458ec39fbf0a65b9b5891738ddc44edede2614d96e62303f0138051ab899e67bdce065ac5ec8edc6b591220b2522f8f4920bd9b7d4084b30d9a79cc658de0260b6e76acd7efe0d5c38e7856a7dc22bfbe287fdf88ca393f6c575cc1db8f0d8e47b0456e5a392f27e9f2b0352da61e58d1c1ba23b32de9f82ed35cd862644d63ea6a3f09b3642347ce6 Result = Pass # [mod = 4096] Digest = SHA256 Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 782a4da593daba94dfbf323458d4e1ff250f38689db3f699778d2ba9ebd3e327d636cab93b5f77cf333f9219cc8b9295a3115cc7b406b889f1a301a4757811b17b1a7004b44f25b987a1bf7c3c299f550c4cf41a9a27678137358ab02b8956e045f9cbed8c00aaba672e6b6b279277f97cd0563f51ca495957083ce9c0fe1c33dd254dde9d610df566ced993f6a23000538f8b5ede07db291657ff1dc72c2b919877c64655d0d6f7a08c5692fee15ec4b4658c2e7414be9fc3834d0b47209e9120a5eb5c4ad6d5a9b598b163eddc7555888069ca9dc431b2b67ce18201323f0c20895015fef02d8d1e25a7115552292ddaee50eb658f3bee98ce423c788699b9d37d2da690b8671249b204a5b263ab079c9596396cebbbd04285b98b6b8ea03ef066a2e2a7b0e77b40682540d94decf311d3b49e1d0af607756888fc3ba7ffe05e03c24afa0c855729c30abe93c0acbf5e9166b40eec18c316a01d2409c7c83bf7cd8e57f2d7c8854dea49b704c4bf9c443fce3fac5ba137b0568c1200ff91c0f538d3a7d712154bbabe4862c19a32bb89cc44e8f358359dbd349f98496d9031459fa674827e92213ba5f9ad36e0416f4bfcf8c8b16f88ce77b4f39b1889d0ee648895a36fe4c4322ac9783094e9764adf4d72080b3549faf8d2af95e2fb696fee3d64761c8e719f67ec04339af5327a7227ad1c5f708befabb64e71eb5782fe Result = Pass Digest = SHA384 Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b Msg = 6cd59fdd3efd893d091afdc3155d354f10d6d88167427a2cf7246207e51791a6ca6200a914cd2834a9b3c79fcd59e26e457e0683bc33d49267edbdd6e5d90902696f1e7b1a4affc4ba371339868c28015ebbb73e262669866c35db974ba69e468f2583b9191d15d686cd66fb0b9e0ff0a3b4721a6dc342f14f2446b4e028595b Sig = 166b8b8aa7a806397d8f28c900ea0f650c8cee021d79f7b5bfba2bada0400981dba364873a9f55f9fd002528f16053706623869b93aa8d1c83705c4ab321df3ffe5bedef4de369b345ffa16acc5f5e0b18db4a0dc9e843ef51dc7126b176237d4d8140f6d7bc1babcd135a6e471d06f264bc1e78996d8782c8f15da0fc32009715bfe21a88ee0d34c251c94cde33761c8e398f0ab1878e478700f869a7684103d624a9be0496c85669394f4915bf8cd68fedb0475c9a508c40862bb3c3f8bfa593fdc2a93c16e2866086d5a8be5e94c82ef415ac2cd20eab8bb3bf1c0f68a15ceac46bcff72ff2e0db004f29c4970b86925e60a6b4439bbc7acd95c1d480e0c586cf2af5b62bd56636be646b17f7df1419b02c8ff904b0879518be09c79f0aadb0bbe8f599e44afe9b3dec90f740fd2c586619e47603e9c6782207cffdd522cffec9dcb69d17df3d66ca626b8c14e7075fd8b10fb483f66d01559932793a932d872087e2d904b4b136cd33fe9cc4e83630fe1a192006a787d9e293cc3847fda8e0454f440841e7cb4caed5aee0a395e7040c8e133f52a223e1d402a1269fdc7ea69023f5168756e27479c66c759ef64f432f11f1c1751cb70b47d32e0921a2a415433316090394aa51c7249783cb43aa44255527a9450f60e8df078d0b31089b6f27a18a16a9fc01d45a36ede9fa4d822512467952da83ef5110aa10eef552c7 Result = Pass Digest = SHA512 Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b Msg = a7c309d44a57188bbd7b726b98b98ce12582228e1415864870a23961d2afb82cd5bc98bec922d5f2ac4168b056da176ef3ba91f6b699ba6acc4144868ff37f26fd06720868d12ad26ecb52572cf10416af68df03ab645a8b704857d2190ffc3f07eabe3a8e2abe34ed6159e884c4fae141d4333d5c3e0db044ff9cccd9cbd67f Sig = 72a8d4f11321d8465ba3cf051ecd8e307367014a0ba1677e77a9c500d77e874558e245f3e2f52985e770895827a2cab290b05229168bccd3bfccea7e7128beeae070890de1c1b7f52ac90894ec52403a33187baff155a471f913e8bc2d96e4ff16308838f9f7473bdaa29d0ad5a6dbfb0d8fbc229cc46394c5e25fd19ed6129f28b0c15282793bd288ad491d1324ca431a63212b75ceb510b19d4f635d8fce80ad86e7539b4883c7aefad92cd2de9cecca4e2d7986dea10ca122dd6cf455deb7eb3930937892e713760034c1e9e8b7a0e566bf471845d125d79018f1b3395e2fb4a908ca3c39272a3f2ee733e56bf76930a54efb049fd14cdb67c728ab23f442fb0e8efdbf0389770a086a7451cefbf5b94ffce64ed0430b441897f5a7875420c9df2aa4b3eee7551d0072b021abd579279f8d5b42b129fd13fb4717a23eaa50e0bebbfa64cb973aa249d8095b68ec5944f4f9b73b5f2d6686e9a0d84497d97dde49f8b77a0141a2ea2de47f08d171d16a53fd2e02369c35de96530f5006c35e96857219584053aabe880d246066e225dfc9ac4f59dd295c131796d4b739de118660897c22e9964d7ec8e53272dd2cbbcc2b1342faf9ebbdf4c24cf31b192bdd070eef578ca8cfa02f2c6f29e1643796087cc3867a4a6be8cb35fd63e03f66b9ef2be3fe7975aabe08d7234d116b4c6b41ab5e5de0f93fc60d68b3478ad4ede9 Result = Pass # Invalid key, size = 2040 Digest = SHA256 Key = 3082049d0201000282010000baff76a0e86f27d7cb0b843454475348f1a7b474d12c3ed1f479d2d8d34c0bc8a7cf9562bc43b3649585a0325e17d30872c19202af95b407fbbe701811a77937a0c866f863f062f1d36724faf5a44724aa8b0901bc61f8632bf6a1bcad8da8c26b38428b88413317f2975019e9a0c0a4c2ad5cacff643dc3092d053f8607bba83310ca90197e4f38f6507d60d3fcff5c42d0d9e2695b72490c0b622d783e22ce0986dce6047410569e869651acf168f59bba02326f5a2a5d1292766a9b5325f7e17c1820a1ec91aa4257483657f8d13fd3ab071b9ff361f8ddbb071b61aeaec3ec7338694ff2f3f7b43d81cfc9900a6b8cc5c426ef5c26559a5348c16b476b02030100010281ff26030c10456f630000ac44a18688412bd0c3b071169c11e107fb439b03c8af948858301bb3fd67180934f28d8a86f944fc5ed0d96eebd57ed1f3b241924522e4e5f016ce6332584aa4189171da411c9d1d75c9ccea8857bf810e4f6e5531389edcc0c0f6302a60c27b73babaa9bd1dabe04ef149d158851d825dfe751d3fb126355980af98fa7d977e573f58e428a309835958ee689242dfa6018c070d39809b8c21632cbe33fe3ee1a862e38ed13b6147115194b48922bb1de56ffd20679146251c8d2fc192c931c7e538299e7bbcecd81d3b8f8ff5ab95887b5bf3c621653810e2e3fb3b00b0817aed965d21b5ebdce84055c15770cef5d7599c79dee9410281800f522a5da7007ca094340bdc9136edd6ee0a80bbf3c6d1eb062c57d58ae69e170ee629fa269fa7bbe3ac78267a7eb260c5fe064a7ee05f78ba8ec0be8f1d0f471d3af0820bd09756110b4d53c6ef83211b10ee0862d879472e030c9ce0862c5b5aaee108d3f1c011a746629d90cd78d8111f1da85896b93d9e088205c314af510281800c3492d56d1ecee6d51bc376436baeab40a1a3eee530a5faad1f8db149cdc2fc01eb809089a36de466a620a4b997d8112b613c68fda78a7237506c90cc890d260974430ede8942e2bb34fb9473e46adc85aafc42ecac2a84f56fb4bf7d7f8469e791111cbfc75a221bf0e3d252957e5bb0dc78fd73509007e973014476c273fb028180072a6ade3a89a3c0871080abbccf701622678f26593218645012d551ef1145c78b146375b832dc04a8cbb5b6697c70798aa0f0d84ed72a5011114b5cd51ac65680795c9bb662ed2537fb8d432dbc401c6fc84f4c64ced28a541ee0fb4e97f28f17aecb5991a77429cd8ec1f8e80cf2043c9dcd053bc9e301cab437fbf1edeec102818000b46865fa4ef5134eeab376789e170fbc4398fb8a302ce53469c5fc9e8e4adbd2208ee3c98eae21a9eb9da6e53067415687debd1128434e24f377d1447e054c54ef698fca3992ab14b4127297de706d1b2aac3611043fd03d7b9dac10caf41249548ef0620258a9ef8311246bb04603754ac5919cbee21212e0990a22f147510281800e6614d7fe3a6c3ce1c1d2cf1d3eab9b7ae046fd78067141dd841726968e8cfebb4171d94754aa4c71ae8cb53d251b06e420f2b7f0f01a6a2e6b386c3554e0e81a74a94b053bd5c062997729801885f3c36b996b2757b76d09116e11af29d604f70e7dd63225234677796095551c64692aa52ba63aaae2dc836f92cab9def128 Msg = 61 Sig = 6041bb20241dd3aaa3eb8175f9642243e1e3cb289e52bad58a4d56bd8a10306bf139ae14d2489fa3575c74f53d851b7dd7c6bb7520718295afbfb5e67ea7b414c332fa0bf3df019c95ca9f6d0389a84c2020ebebeb09ec42a4985f47560c356979a7667937c94de9e16dd26dc4bc4c3a7f34f9b1f5f1166397c6493dab8760e822f41713bb9b1978cd413955a3d356f2d03d973036019a1115e502f65aba3c9b5a3955ba2d6155f106283657541faccce43db657f9aeb93f64e0331f3e71e3f569a26e773e1d103c2c04c59f331ca53bd44c271df15c32279f433359e1b1744fdd587c94e2d42ddbc899ec444718ae6a22e302ebcba861528d08683345e9c3 Result = Fail-Invalid-Key # Invalid key, size = 4104 Digest = SHA256 Key = 3082092d0201000282020200da35475cb97abb30a924594d855d9279fecff4bf9b950c5ba8ed23a263429d1e075cc63e2438b34ce5ebf1699ed0ca590c1eec0e93dda1c5a345d01a6aa2b1708c74fefb91cb078b4725996af868ecae9390b836d906288c0d86f3991121f85059b45c24611d97df5d497a56176c3e1b9b83887e8a07f72bc2d45cdc8e5a90439ef77b09ebb1c2e538058dee343004ce2351c6b398f1f4896b165e2ef6ccdb46dadf51db109137e7db57fcbba406c16b4e8c3d741dbac14d1c1a02fbee6a58cd2472737be1c73fadfaf3ab90064bbf1d1b1eeb499283334c9ccaa68a875ce25a025f9cd49c6a64a00a7c065c2693a02cd4c4984879a9b46a7f88274b259ada9d69dcb62dbb9fa5d865841262a76b63018d06cd808659ad4cfa31e022d227a884969346de362697ce192dd839537ef3017f0f73fa080d012a82f596c24eaa9dd01fc10c875020232ffc1635ef094b050a118bf810d8d409df9399f5ccfbb3ebf25a96f438eef72a6b563be8efaa1f5ee5fd2950cacc06f7a208a311f9d5e5e9c97284859cebecd5527f76c7b80dc44f6a5856411fa53148a28ba3025ca02fd9b4f97245fe31fecadf7bf5683a3ebfeebc91695a3910f27f38df143cbf0b9b9553fcef262f16ae5170a1b5018b2f0fdac640afd5c318a9517ca8491bdf231e940e861e4bf3336a0c83a9cf1c1d53d6ba6dc129717f14fdf6261a0cd6c93eab0866c702030100010282020200a9520a6bf3293f33c52c0577d7f30204542bbdf9289b0199e67d0cd7a73a3b7cdfada7cef48062f15ac038f6025c75879f96270a30c71c0ea66137d827c2d2f948a4486fa173f008ad4e89bbadc28d55f1ffac5233194a415305d2e4859cdc784d035d34857f5727e5d56c6e7d826ab735775d65036aa6eb78251d61afbcaa912e3b4f6825522caf7d47221922b9d820b4db71da4ee60120d8cde48b80caf9a40396a287e0552f1264ebe39b1eee770bf349732e351b837f783cdeefead2eed15064d723dbd0a6a33445fc6ca7d603186cc1134665c015006ff1f8452a40730bf1278c2496b3201de7c4d19294049d97ec0a1938b3df71b5e9fc16b1831ea460c6a5813b96b542a809b4e92092d0c850a213936ea8bd48467cb4738e55f79202045a3e58eb46df455f33ab8ed1f798001006f620038b9557d21263dd1b3f849550d7c79d37a816ee6ce8a14bb8b08ce9caee2860815b7ad0c862e40c0639d7d5d129b501405560657a49b99ebfbabc666086a4c9ba394367f29321c7676ffd908b65ca0b5992f6cb65bd5ffe1c5257e584d6f01c04f4a4de223cf39ab3cf1f0e43b933f0f2fdff24dd8f03b0d69ec5d592732c960205e7a94401baaabd7cafc90b972f56a0d096a2ee366f9be53b97b820b9639382cd3508498a7f08543032f8d33fc0968596d4db961e8089ad17be6c1fec0228968e7b21ef164ff8c43479e1d1028201010ee8e72193d6b01c1f603fa872c04d0bbdf690cb4b3dca22a3cec552b788434302390004d118f53532be3774da84c9d2c675b81481d2df4e17abcafdece67250e30e76d7671b145c2accb57a19c1e95029936dd27947af246ec1e522c67f1979575555795cb6637532300f5b1bdf5f55f130d195165eec33522367dcf9331f9a3ac52db8cab35516cb8944f73c1903fb6936820d1430cf6ed6f3c52d2696ba20cc6098dbc91d392d44a0a0d543aa0382998cc4133d3ef3f02a2f563b9c2aede75cb99c40ebb01ad2a622ac376bb72adc2f23a3efb681d6b73e99b68d43ca306f68c42df1d482a490bc01289e2dc81daa76aaf7b4d17456b9d1f4272542be12899d028201010ea29ee81cb4b4ca41b489746ca8ef83675c90bea23224873af5026a01a4f172134f2da20ae520f099b65cb9a6dd7f50f8f0b0db6aecb1cbf3630e975a1f1af37725a8fb88f1a762c3ab790b80d60cdd320582d9b1b6adf8e52ce56d98cccf1770370c3e54cb69100adc2da03a50bb107095e4dd6afa0f8de4c93d6cf27d1a1a11ee21ded0d6fe4da95a3a0df2dc74aecabc5ebc99a30afe4a0efca184c3b4f0f58be76ae282222da06971390d6951f8124bec79a912deae86bf502518d6720e147bd6d74d7ae0e90bb42c420c957bb68498f82e81dfff51c4b9f9725b1553c25c9b49d7181942bed4fc80a1290cda56f2755d1f963b276e152bca36f9ff1286b3028201010e7ad41540fd8bf513e7a68b123e7dd4bc7d1bebc33bd3f6463dc656e9d514f59bcffd9baff25c19791950c45480077d82adcac367bd828ed5e04a78c6bc9b22c110480c339f11ebdcc90829f79fe1d5af3af5ba257c9fb473382d2ed3b595e8c90f1fbe8872bd2e913a297fa31711006707b152e7f1f1d4799dd6fdbcaa90b379060bbc5e674168acecb8249fa1efc317500f876227711cc4f6e37450f8aaf4b567ceac0caa2be031b909d9742845d66d074f591beeea7b408cce637fec1535cf509756594ea30e16b8afa5f71f61298b4242b0c7ff5aa685ce4482f6e6029a00161e44b0ccdbc3904253cf22c9293e6696ed9016a6b49f2c2ec061a86aed97e502820101081f078d07f8e2e5e566186c89ab891562f303c335601bd30acd50e4a03af65c760896eaf79ec4139f4889d5df99c3ff9bd47c5f95caf8b29341a1a42d375b8e44cc9a23d28f3e7258e03b503dd309da68da940cd747e6ec59c7fb1c41114dcdd4d04734037bc8b645407ef50dc724b6efb2ce086c478d001137f6a5113e889074e8aed4e510989761e596978ceff6b3d3fe8997a0adcff8e201c500a01ab5ba8c9770f867ef0ca643009ffaa7cd8cd5dad954c502245d7b7d7c862dbfc5a80ed6210e4bf54bbda8b47ceb9e4f3b582625187987dd3bfe8352665cdcaf5c7b593c6853a64f521d2ea623e4010a357ea786edc79a32946ac1f46f934bc4985da06f028201010d783f2e727336392f1f93272cca34854c0a2afffe94fdf19cbab693c81d17c0f24d3bec537b7be9c0ca6d57450c11cac258332e4d3d0fa82a6d1a2af223dbbb9fa90cd60bc977ead9a5c377ed7123d7b3238b56587780081f29caf322a99e40f982bc6189ce68c959b1106fff19c9aa3ec0a9fbbcfd461de51cb6d3e9b664558124fb88359043162cc144a023c2ff1ef9fdca01f1db3dfad8c4e0aa914f84b42f4bfa9fd4be67c5fe864166d62dfb779aa106f7d99866384f13ed8c6dc34ce9a950f9778d009fa1b8936a67403211d4bc8f99da77f0f82cad1e3e4f594ab7cd377fed95e720dc1acadd0d75d415b0d5bf1257c0c6ee78eb09973cef9773d3ca32 Msg = 61 Sig = 3b06ecdd187c947f9007f0c4bb77b1ea60898bbe426505fc9200e09e2ae7fafd8d563c92b57755a6e62dbd7232ebc59158c267bd965ce39e24bb795f819e92a6a5a1de2a1f164353583908b74878e8042e488041d3c9122e8006452544e1bfd279295ede2cbb02334e9dd818cac7b6561d4123898bddd29e9c59843bec5771827e95541bbb82e9e1e9bc9c5d4da43d756f35ebbba0b31d41ca446b3d1be046e062be0a2f585c9ef7764faa71d178daeb153f35ccc9cda28ca40453ea09e3eb7a0f77cff09fe074903a07856ef24a158786d417593c6e9d6d024da4fd7d9bd5eb6262810093e5bf9d250a84fa431f6a36ec713b7b0c8f7df2a551687129a9f1eb0a034d350c30c715d515099f2ae7094a754220f7403b04641b8a1d1e4c5a0fbb0082ead3620ebc21baa06daa561440f43d53baf6ac8ee413935ba1dc2af63bb34abc87e669ced4bab9bb40e4cb7c4d8c136a70a175e55e022d66ac18b43355faaf55ac73eab3f59019e522c4967c492f11a9e80305fe37bc643e2ef61c583d60d9c2afbd1dca9e40d2e66e077c3b2cb4a574f6b9c73fa6ed6aefc03c0e39632529cacab6c1fa6dbd645a6bc05a5b8e91f90264f404bde99fb538bee7ba15624e3790bc088c2a0a27d5dad111802a167d181ce930bfa2f1f8b90e5643f55bea1e0edd57b0997a5a84b7e36d5b107913a2b503edc2093998ca2fbc2f2a085d341cbf Result = Fail-Invalid-Key # Invalid key, halved Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # Invalid key, last integer value is malformed. This is designed to test the # error handling, particularly that we properly free the `BIGNUM`s that we # created prior to encountering that last integer. Digest = SHA256 Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201010997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 Result = Fail-Invalid-Key # Invalid key, e is too small (e=65535) Digest = SHA512 Key = 308204a40201000282010100d3e94ceebdf732da0040d4ac1b3cc89b81718abfbb5661a516c4395d4d01689db558fe2dd875a36dabafa81b532bcd3edfc126e60d3acadf8505a2e45570c7ed19649de601042e10953d40639614437f7e380919c994bace28e249f9f2e28d3fd170faa7245e6836c97cabddeea0bc0c94c16d64348175043c0cf443d4886c39a9faf025e9f1b385a2188f206b726ad34f3a5707804ce448b42b04a25db31888a8e9903f0f842949109e35c0719dbcc2b5d541ffc7f7270fbf912f149ca47e90a4232ca40a87f0a24c37a299f04979553a0700dcb2618f3ca448dcfb2313dc028ee78b151ca7dc46d997cefe5b62b5a6f82535059cf8550d08ecab04956f12df020300ffff028201002e2e83cc82fe83f97a0b9ae4648bf19ba51f2d85da0f3b32bf5ade832dad3e43acaae37f4d2d601ce4891a419eafa8581e072bcb4a295c237616a288390edf00908b37dc3990ecc2d5e8c112f4e5bb63621b0446bceec06c71e1525464bcb7d8e2336b331be616c8174cdc9927fbfb37111a003ad89416de551c7fcfcffed2e4365ce61ea90836505735c36a087d5675c608806e361cbd02b9b5f9d93087fffef5c17d20475ab164323c1b6069dfc3116b99990ee41f6a7230ecf381e838bfc3265857963f92e09e82a658ad054c4593fbb8832d4e6bd42da4d9a6ef365534469c7c8f14843f3f69bb1ab5dd12b4f2150c3c16fdc9201366c910ad19809110cf02818100eed2c519d13351a714b5473fef7921c6f334a099178fe48404a567bb59c125281e05746e188b8eec0fa2f12cda11f386c11ab460de0b37131d1e3bb8ee6ac5bd8de72939d2d0660ba9871e1c96072c8759b36c938308d4876cc9f7df707939b1c1a3a642929a1d0ea277c4e4b217140164cc34d3360072aa55bb1782759e9a5b02818100e327067c378bd8fe8cb78f119d4a4e2abb42caf13aa0693cbb824ff2b0a71230b94e72f3a9ac2beba21707d7a004a6094a95ac891929609c8cbf1eb7fad204a3811da06fc64747451d1500b20a388b4246c63c309b19acbade72218edb41df4525a27d5381140918ac68153e2d3924f604cac5e0202922e6cf8d6bea7491e8cd02818100ea2f2a601918515b0c9345aea0fa01eedd0d29bf076fa9dc7582be17dd7c57718bd1991a45bfae267b039b4c3c28f259c6d77c52b04ce38feb8f3ed2f6eb3d4cb9dfb2b65bc3a0b37430e7e1a3a63079f098f6422330ddc6a09d336115e4944d3753352c6078ea92f2362f110709d431aa0e3ea2918845f7f8046a73e0d523e30281805a268208642fc360e107662ddac32d02c06e056a7bb7cf1baa6224ceac8c2a9342cdf60acb9c20d6579d4d790f7987c26dbd0e4343209ff92110a66898525baba3547e557a5d1a14f6dca1b04a20b4dd1565979ebddc915a86cc803feb21f296aac344521d2729b7557b7011aa123cce63bb40fcf0a063fb4fd026e92606621302818100cc847aa3a8851bdb581b1fc9926abe2760d1fa47b5993e6ff83a4abf3827252e0bcca53331eaef1eedd83bad6cf10327ac573043bb87d822a91c3c5d35989c82a00bac71f2b879d2f0c7efa582d2b3498bc190386f90f02e4a6b5166010439fd7070aca790b597ead9188e295789ac2bfcfb6ca039f235dcd0d0a7c197bc84a2 Msg = 0123 Sig = b62bdd9c87f8f409178a5155768b536c1341f52a28c881494baa80b39f4a25a841f664eec49a464adf3cf5c920975cb83de4b06f0c7740685f0174627fcb4d0511bc6a25d473952c33fa5763a8e9bdd00bcdc1e4e5881d061193d77335d7e245987c9333455c9e1a2f0ff45242cff45cbd9ab8859d1c81dda62680ce388caba410be15bb40c0a66ea3a4ef07a3fb1f0f66c656c754dd3b15e694902ea79d1d0496a83408bdc2e94b7bdfef5883fe748ed50027ce0f35380dac8245e042ccdad69cd98440a2f77085a6d02d097f6ef650400b7eb469b9e6ee5284c7c7aee8e6365731114490dffadce428b2d16dd086ae0ef350f8e9dffe22d63203d891394322 Result = Fail-Invalid-Key # TODO: # Invalid key, p & q are too close # Digest = SHA256 # Key = 308209270201000282020100b748949450eb0d3c045a8d34aad4e9c142c4eefca9486ca360f6351ecac183f232604aa81a32d0a5d62fc28d3fd2e1fc2e3e097dc2f53a7929574c46397eb666670d1be2e590f3962982aaf674f7cf345f2d3fc6aee1819b8140e9f97095a75320d5bc3c4e22f4451d4624cb42e9185281383d239b2db3128871a35f5bf02e804206becae433073d987fbb52870a1942c7e449aee9c757ac35c0f34d6ffbd535497dc08fc74fbf314fc5a9c2e98eb6db5ecd231b16196fc346346fd345347d6d3a84c5e98c57e5b39e8baf3573d7bc99f35e725011410ebe60616c1286dbe0bbbecc2b6ac73a2e2e16cdb79e49455d94f5796f353e02548bb5a500829271345ba941471ea5fa87fd36d7aeec29b159f1c0c7e7bdbd5599f4d3ebdcc7e46e37323ab81682d661a8a9cf88b2a1a09ea5fdb0e18745a3c63f51b31ad466617821796c53ba05e34b4e9a1bebb43641cc2fc63e295b6f5d8dd8bbc24568e504789a03bb6a7468c76036ede826f2c96aadb2c24e720906c215e48abdf0f10570aaf09778ef80758c2de408bec35937884d96f50757b29ff4f82824daccd2d4fc174929eaa66fbf8f3a669455db24f54bedfa74f388e01e5d5f6d51c49376ac529634e3be3fe134660eb453e9f0466446768ca1c4a7d854c9ed37b91b81343bde5b136ecd31cfe53c2d7c3b0e072736ea6d24903b228d814ed99e9b78796e148d0456f502030100010282020010d03bb10f6b409f8cd6b1b56f2670fb25a0e33b925bee7b5e5db7a9c777d11edab832a111263035c65c4340a9e6328cebc10d25d8489ec096a6477cf9b142124ac9cd11177620a259d47ed2751076959b558f502ea2c93cf6b279c4442bb659cddd4d934aa7b238d4e2a6656f11eb05468d5e2e7201d3379404b8b3fabf21c4ea49ac1ef8a825b5e4d372dfb33b9ded9e60b6d1b0e874867bb7e399eaf7f32b1c3ec8f767954d38bcd4a92a143adf536872f1117f097e532f9187e09dac9f04f22553f284c95b6d0ad24d945db820b90eb64f4e4106f2cf4c1023d5df41347084a43e27617758dd29825da1cb9eed62c8d206fd9f5e9f5ae1a2ed550d120d7763657bde6ccc337a623709e0dacdf98d26ed746593dea884ab3058f1328ef36e47ef6c104512afaaa1a2c00671b3178f9e4dd10a7e162ddcbbe009e39ac19e286742b5cd85c355a321b1075b61d7ca84fae50170817f9f512f453c58db40217013b24d1b8f569d6fbfc054f135e8fd5accc37d541676247c1723f26b15d7c98f97f2f56cd29b08f4b8e8d8c8d17167dac3dabe875cddf50ad8bd86330753d98613a36455eb5aeffc97ee216c533ce3fa4a5b0867ebda1a07746984881aed86415ee89f0617b43a9926d94eba3a6fcda514aba0ab0762def92f6ca30897e9a4941766c2096e794a935ddf30df230811ea59a355b4456f06e6544b5ac346a39d810282010100d89c9114d87810961378876909759f9ec38cc294f150180567faf3fa709810ed2f1f52a0f28977e6d8d58436605f7a741341f0413ddc0e6505e7e7d2afdb62ca901d525c75a1a9e377795243212c0121db3fadc53f0a5ae4205c32b31223d828c2ea85b46141ce004bcad0bce06288394077a72efcac5a4aea204b39796c22ce2c7ceaa53a15ad61804e642f389b70c6bdce3438bde7daa7ae1db4849adabdbfc54309b0185492003f7abe5ef4ccc3d892dcbc4d6e5861a2463fa9968e58dfe04d9fba774f40df95be126b56bba14c57fd0dce0be7a5e8c33591e15f46d921866eb65781d9d0b75f9ab7a3501735c8e7a2a4325262e23e1264d2f66e3a1929d90282010100d89c9114d87810961378876909759f9ec38cc294f150180567faf3fa709810ed2f1f52a0f28977e6d8d58436605f7a741341f0413ddc0e6505e7e7d2afdb62ca901d525c75a1a9e377795243212c0121db3fadc53f0a5ae4205c32b31223d828c2ea85b46141ce004bcad0bce06288394077a72efcac5a4aea204b39796c22ce2c7ceaa53a15ad61804e642f389b70c6bdce3438bde7daa7ae1db4849adabdbfc54309b0185492003f7abe5ef4ccc3d892dcbc4d6e5861a2463fa9968e58dfe04d9fba774f40df95be126b56bba14c57fd0dce0be7a5e8c33591e15f46d921866eb65781d9d0b75f9ab7a3501735c8e7a2a4325262e23e1264d2f66e3a19287d0282010071abf816d0627191d035f8198ef54306b5e83054a92e36ecdf5c3a9cba6992b8657a328a73bce0472c932006c91c51ce882c9a40228e509f8331e7de109b3884c48c1ea496b677c8fef193d1d69e9919834d2f8bcb414be15b7a06c1224bdd2bc6ddfbbc652d7b457c80ba79e3e6d145fa26d07d3febd2966db6f4c2fc8d5ad687522670fec25172513ad22855b47cc24ee8df4ec799dc8d123a5479222a985902d3e3499dfb03834dccc40a60bcf429bb284b48f7173a654628327ee7c48bf7d1c478be13c11f941d62dd216ee57e82ce316867a6f0d1ed5f3766e5f0f0113fd2e9ad925f13c0a75331fb6a14440d62415f9968d2ab97975f81b600b24c724102820100611e91ce0ee0864f439b9edaf16ad38e938ee10f76c2ba8272048aaf971c173ac10e023637887b41fda67e09035ccbc28f7fd900e7836ad0d0bd11abdd3d38262a477b4e094fdaa42a453324f6128ccf69463bdb5c50804018623e391bc106820022b6a0119b3789da71acf58285ab1e4051659c239e033de38b672ef5ca0e30f2b16f63758f92954cb9d92172f7feb09d197f4091a50adc73accdeb46a31cc086e96fc68ca21e740e0232a8d0899ea5d3f3345a63472d3f5ccfde71aa911e8fab3e1a94b3ec1a53414d70e30a6d5f9573d864b1e1c2f981ccdb03797c828e0d80463125ff4b1d6cb829ee0752e0c29b58c8d5e72a7ed5e5d95edd2ebecdd8e1028201000f8fa951ae728e6ed3ca21449a6d3b4876820526a76797cb6c405f811263333d2d50f67cd983fd9443124806d9506c1b7715a81074fee39bdae8333a89b0dd2a8186852e5dc8abd639dec8da27e678b99ac8fd090543afb995737f3a793611bc4ebcfc5d2469824b0e45be13742a638886d692a189530099fac01cf1bcf3e80483322b56e77bac1673e2523b4ce4e9f0da24259733e540fecdfac7154bdc384c4e2bcdeff5fa4e2aaf3a1aeade1789a7d595be144674b1ae3b7bbef1119518e9200f2724866ddb18bbffda1a17c72c791462d4afef89b63d1aa72b68af054cb50f4f4e60de5c3c40fbaa9e1f8032356bdbde2fc0c4e5961d4681e9faad5e7f54 # Msg = 68656c6c6f20776f726c64 # Sig = 5d449a4826dbac7da405ffa5eaa8b140aa0980d2a458ddb23f03702ce2c2b88c75155ade558d5e8a1a386fb49d9b93f202bf17f3e76a5be7640fec12f046453ec8000ee15e65efff8866610c51cac55ae8a5585c2f637db4be528f5eb5d71a5439c2ed908704a75453134673273e1420b90da80ca6705e4244b876947af66a64c409b41e6137243c1da35b3341b6f2f02083af264bb233832341aa0bd38f83eef03b720d36982142171e18c3736641f059c632effbe65f233ffa8ed45fd964f4e674c3b337d9ad7088547b2153d5d0b93a4c6531c3572669c30e90b79ee8481a197022ed9cbc54722b9bd02d74c3f236840656aef762e38638b82a97ee45d4952cd09b86d33cd5dcb57fd03d4a53b7676278f29809e60cd980788fa8ee504b82eb476e3dc9f231e0a62984c4cf2149d2f5dc382882cc826ac9d0e9f9af1c0f47010f2b8a75520fd95f60ae538d47361b52b83e1befdb0545d45ca4bc33bcd0a14334f9f1377ed6e419aab4cc77f73378ff8cb44f5f6a17ed3a0e0b079034471c8a107e96fb5d2074e570678e9cfd5eeeed09302cc4259cbd279dcc352acd958045dea17ed027e827ddf9ddc862fbbb2fe8aeb440248138eecd8ba2d3114e96e6242692aafe282133d3557c3d71768008e41bd841b44d7c5a8af2821f4c40de975bffb2a3e6e0c0ad1ec597c9d3c44c9f837a60768f689de7103ce64ac3dc525f # Result = Fail-Invalid-Key ring-0.16.9/tests/rsa_pkcs1_verify_tests.txt000064400000000000000000010022601352416253600173430ustar0000000000000000# Variants of NIST tests that test edge cases. # e = 2**32 + 1 (0x100000001). See https://www.imperialviolet.org/2012/03/16/rsae.html Digest = SHA256 Key = 3082010c0282010100a1a78a0092878cb43263b218d75fc924e915ae80f1d32cd9db690c1c7cf6942ecdb54c0357e0a55f959d53562d1f89abbd59bc24a03557b068449d0753b927a5a68921281fb92e61050fe838136ddd910ba13cd71b31045823b53d0a96e19ec97bd8dffb9923743060f84d6aabbdb44eb0470b34dc3223a91b9e79f68cb86ba616aa5e62ead9627eccc110a72e2b03879c360bfcad3ab0e7f3184e7ac154ee2803b2c7b57824c2fe54f600668087cba6778fdda5bd8dc1a60af7295a8c793520b0f02e35d16ef58e563b7929cb7045f9528e7a335888e5a2ad4a9f7539209924299f7640443bace8c643cf73c249fd43d616f111450baa403a9a8ce118af5e6902050100000001 Msg = "" Sig = 13b1addbef54e405580c0df21429fa030f3edfc7f7bd446907626d1e73e69dee8f5a2f1614f548e58b684da033dd8fbb7e9616408e1d1318698d10d536c622237febf2fc73d64718e791192d5c38326217cbfaa319e5fc1ce8cc4685d7d2f0b77c22fb11a0ce00467fbb918d5d0bf6926dd6b3bceefb15040f153abe5e3eb9c6ec80fe1064db69b332bf70cbeb2a483afcb09237420e1413941e2f71650cc393800efba739fecff9bf3a75b9ac88de483af0a0ee08d1a09f1de91f342017c53745fbe658a5980926ce56c14df45088d92e0bba61f16b8847d74f3fc707c60ba82af29face1c5269a54d4185e8efce9e566c3ca0c202ac1a4cc180d5320bf599a Result = P # e = 2**33 - 1 (0x1ffffffff), the largest 33-bit number. Digest = SHA256 Key = 3082010c0282010100c2bf9ba415d7c612933ef42f350e621e12dc92cf9f1ab8c4697208e22643d96c0be81a3cb1e841a26b73d354756d3c00e83244b367ee63f171497bf1859841afd35edde7aafe6ceeae279b6762a726c67aaf19506590803c53a22f661496532c90d3969cd44f020290ca91ce9296120bc88d40d7be403e5e3ccc39ba177bfa5fa2f7828bec5e708cdaa1fc8cae1b26f63aa30178bb86ac25e1ee1877c17f37b1428d7125ffb6296098d4c72f4ff2460fd52cf8aa6988eb7447a638a9044969519c60b8ab25b56503708e450fb5af32248932730c261d0d76623c2dc4f75bbb77fe6c3576b2dbec3020d2c8433bef402e2172a243420163319a930997ef5a47e7020501ffffffff Msg = "" Sig = 0a5ce0746f099812045cb79a4975cd1a5b60dabc7031cbb36395afb632c600db13aaba61b601219dba672d2dd100b06f270eccb41de0a22542222c05c9fc86f6ece18e25b287ce69fbd5544967a5eb2aa633b9f940fddfb3eb18d5de0966e74be2992db44ad80f96e86ac9c8d06e3d0d0fd7b02f61b706cb59f334a721b5bec83dd941dfd029208d1db617adee196af6f3f23bd46344c97be6697f92ba6bf72d5c404dfffb0d47093cace28b99a6733d442137eb7a4c50c9c4beec38520978743679618a4b8def94ba246bd31c96bc84837caedb2b282886fdb0a0173e2e15c850641de49149fcc2d965891f641f21d401fabda0a7e96f6e5565da4d979871fa Result = P # e = 2**34 - 1 (0x200000001), the smallest odd 34-bit number. Digest = SHA256 Key = 3082010c0282010100f29f6bb9c42e2025d15701b7278a301c92162928265ff63d08ec7c41467303159ca453cebc5709b524a76009203b7871464178497d6739d291e7367a1943f0d38b643fbb78e204c2afb99709b579f033e85e181dc6fc6c5ba20a65c5dee9ad7c44085f34fe13192f1be071fbeeabc743ef16b0e19bde382549090f200503c670a63c895b4a3a8f3fe6411b574d89d3b7b0e57f9922df070620421a1e55acc5557aa35671503ac0d21c64af1840fe4c0ffc9e21b3774f3583ac32c5481e3df8a85b79cadc5bac78bc0a37a08b0d51b147d31a6108af6c42a4738b3657b8fdfaa0a7f90f674771987c19d1be67f45ff14aff1adbaef2b9f78d546559cdc0b8d8c902050200000001 Msg = "" Sig = 28b85afb66dcff685336be3b7103283d3ea74d38928092dca582188816d59afa25d26d1cc9b8c67de01dd9465475601c9ab7b980f129652a76556b6245b178e4ac52660153ebfc2939ac08ca5ce5d8dae7c1b50f98d83c3419ff2b000bd2e0d2f6dc87539f42248bd4de80169e7015d9cd2184887211414d48a10f4eeaac7968ed1d5d3000bcc73fbf4eacb1e2a6db87c6879e4382e01f46a170cfa60b682af0af7701a40b3eb08e927b8a461dfabad72bb7fdc7769cd188c4ed103eb8ef49737e46e1c48157758f0461eb1ec113ce81b0eeff54743178b8a1b95b38ed7f24a550fcf8d042fe5c0ee0b9aa7d5bfb14c5e2cb5e81772e854122b1cdfdbec12f67 Result = F # e = 3, the smallest accepted exponent. This is also the control case for the # following test cases. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e Result = P # The public key was tampered with so that e = 1. Signatures are trivially # forged, since Sig = Pad(Digest(Msg)). Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020101 Msg = "" Sig = 0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Result = F # Length Mismatch: The signature was tampered with by removing the last byte. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa40877 Result = F # Length Mismatch: The signature was tampered with by removing the first byte. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e Result = F # Length Mismatch: The signature was tampered with by appending a zero byte. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e00 Result = F # Length Mismatch: The signature was tampered with by prepending a zero byte. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 0021f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e Result = F # Length Mismatch: The signature was tampered with by making it completely # empty. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = "" Result = F # The signature is a valid SHA-384 signature and the validation is for SHA-384. Digest = SHA384 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 2c8b7d5fc1db73df3bf806af732324c19c8374d486848aaf3f3e8f81a89f425987684d4af644d953046345b7ec65022c8658dc144aca59de421de359c54aac4f625f85a2f2092ca3cfff99fb179d5057415cea4b868fa047045071a75b9de26e9a09c69b2d545fa5f8a8d63486a17feab184f8a227a7628d5a3812b66da388fc20cd96df69a6a59da154c0726828588c7df9abdc64090e40a62c8396ceb84067f637680625732e9dd3b277a366977bb1bddeea2917bcdf259f3ace8162222c52d86e394364e28cc1c57d2feb5e9d9fa4a51b88555b9c40a1efbb6846bf6e9d56ce2a43d32ad767e732c81ec598a1f0217c03c7533099b50dc8d0bfbdabe9625c Result = P # The signature is a valid SHA-384 signature but the validation is for SHA-256. Digest = SHA256 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 2c8b7d5fc1db73df3bf806af732324c19c8374d486848aaf3f3e8f81a89f425987684d4af644d953046345b7ec65022c8658dc144aca59de421de359c54aac4f625f85a2f2092ca3cfff99fb179d5057415cea4b868fa047045071a75b9de26e9a09c69b2d545fa5f8a8d63486a17feab184f8a227a7628d5a3812b66da388fc20cd96df69a6a59da154c0726828588c7df9abdc64090e40a62c8396ceb84067f637680625732e9dd3b277a366977bb1bddeea2917bcdf259f3ace8162222c52d86e394364e28cc1c57d2feb5e9d9fa4a51b88555b9c40a1efbb6846bf6e9d56ce2a43d32ad767e732c81ec598a1f0217c03c7533099b50dc8d0bfbdabe9625c Result = F # The signature is a valid SHA-256 signature but the validation is for SHA-384. Digest = SHA384 Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 Msg = "" Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e Result = F # The modulus is 2040 bits, which is too small. Digest = SHA256 Key = 308201070282010000e9bcb0e5fe68c4ebd4dd299f1434ff2378bd1e5261eda8d7466d41e1485a92118888306dc03a7a448f459556fcc2375cf8ca4f26ad2b4203952b6b60f4f23d834e30f19650753a02e44606f39807d9c1cff27114e76cac6d4ee02e3c68aea27bdf5037ce912212725af0294cf4df5173a61349ddd40f1c21bdd4a876d1b52541e1a784d11e1ca5e1615ba0c8f978534e9de112c379f530a31014425e907c9a881449c90c764f12f9831dda121ea43c7c034f5829ce4fd1445749ee461f72b763b2ab4d0cf838d48140499564985132a69dc537259905cb69dcdc658c593620c26e822ee7414c9adb1132341201689a30efa1ed733a6b5b149c81a87e02ae0b020103 Msg = "" Sig = 951cea8d14c4fb4ae98746e4c404105f63e880692584155e7f6aa053e9e897ab07ebabf408860c0c725d454b0d206eec7668382dfb2d005f31182b1836ba1f449eb5dcfe026bc500fbe41250070e8f148bb8e4011a5730d1e4f26b228e484fa8c1211234a2d599c55c678cbed083a5dbe7857caad189cb7dd4ec3db5f16f2bef13aa2c517c3ad13511615c6171ea783c742ed87a9d451a73b968de26c2928313ebab7cabfa824988452cbc606c3968c8c7b41de733d9b6f62425512a64f89cd235681abc8498797980a646c51c3ae5dd18fbefbc813637fc6d633bb799d7dbb3c725b2f16b4b68bcdb5a4a859667f5bacb365a358d9266dd2158dbc1bed112 Result = F # There are a ton of 2048- and 3072- bit tests below. # The modulus is 4096 bits. Digest = SHA256 Key = 308202080282020100d3f6c3ad0a0d40b3ff8048991b6a9ef9f3255294f0d894a1c8917f36d9490ced4471f75a407d34659f319cf9f7813e0201e2a469eaf9ffbe77c7ccb0347c4e34b130efc740ebf83d6689b8aee89292f94f189c717d0644cde45c147358b7575c5d650de0b5f4d28a1745da3cef185017c88ddd83235c5576ef5280a042782cceb12aab22f12ae1378f46d46310028f45a157846694537ab604eb6edbda4fb5762354357005baa8d0867942dc363d3016cab6eb2c7eb5bf5e184e8f0e2e82eed23982647b6d04237f22dfbfe1d444b7220325acb6cd96d9192a233246c2fd650f9bf193c3143ae0cd7f333118b255fe79fe333afdf84fca8485f7a5b0f69ca2ed3c95af14c6f9ec5e37625a091c9dbdfb46ddf625536d43d10fc97f4e0cc1c828665075fa9e40fb7178eedcec9134b51c6d6d504b1de02a773206ab2d467040001ceb8e18e4ec61d03de82b5cc2a317bacad1229efe228e2ab751616740ca2951b9620536cac4eb36db4c9b24c2e05c6511ee09c7ff9729c7fa27ae10b26b156f15c9fef683f67107f5fefac7fec4084bd8cc535d9c7a14733715ac37bbb5318604905e6dcc48b6c78be0fcadf6466407f0cc6666d46fa2163799c7fdd8518a4e4643dc83c1cf7de96d905233da230ddab73279d526f3ab36d2f63f17001f8f0f8c53ac8767f9ca4c9c10c9a0286f3c9b5d3fe4c314d542a1f54b6be1ff05efbf020103 Msg = "" Sig = 1dd98725ea75fd3e262b8b6846be45ced065073ae5c1c98a532467359c948bac4d3ed0876bb46fa450e47f964e5b34f806f8340e7987b83cac22c76eae7ed03f98ee47c18b09e0cdbbda07deb2190c8085871b18ca52ebfa06edd5ce83a4973cbc803879f697313d279f02f36289e382163c6de83327f38452c1018d926ef1b2dd0d3a1bd01ceb06fc7e043eacec0db3786883d5d3a99b6502c24264e96e07731d2efa0b4de4e798553e70523555e5e905148d57a74becc1ca0800927e464cf950376dec0190bfb0224cff204ac0c9f62eb3c1c3ce78563a38cd3d0a20b4cbfdbe48b82c5ef27adb262ba65883bc0b6506f4a0d987f559e73d67133fc009d9062e23866db9928e9b1163681d9012bc6c072002bea9f2512f20fa61d3091a979803036e6deac801772ecec18f153d61d6f93cf01e592cdcbe435bddbc436d462991370de5df2b21a37106f56b60c4ba40965d3b1ecee4d9bfab548b38a1beba4ebfe60af8921d69bedc6e2da548e22e4d7b0dcf1d5c7f83bd4e96835fbb2ed73d6ed411ca042221e3b29a90a46579f76618ad324deff1bc873a1f1e9c727ce4b73498e255ebc8975d5ee3bfb4aa4883a60a33900451e7d51b60d21e68ab4f7e80296627bb405745ac14ae583e1658f3bfaea06385b1527fa4293e0b62beac3439bc8f85a87ead36fe702ab412f78c7e26b0e20ac1dfa1074453f660f7409000fd Result = P # The modulus is 8192 bits. Digest = SHA256 Key = 308204080282040100cd39f39b27a2731e7b2fefa1379c55e2a86e3a6b6d623a37fcbc535bc9e6453752a06349a85e4133e5daa6eb322590f7caed50309194ab78c290248a041434abf1fd5cdba1ae2922a5616fcf63a8bd1a806e89dc19237f360752210c1f3e082aa1463745bc6072e6a6051d9168fab0b54ac11d3fac3888306f06d44f31306c7b916b50cab75c7ac9cc33610ba87a61d8bf08e471174b517da710d4d5afb4cbb2aee8104b2a6bc78c5c5d3101447eadee776cc96ad874ed4a2e1e941ff73daeeb6eaf9c7014741d68e7fc6d96038b63f07dc4b0b4eade9b3d6f4edd7e8f1b64606a90d9ee4e221c0fb35dd8cd688a5c60cb4dafd22648a0310b2d18a6a2cbcc30f6444e29d07f179847d2ee802399e4a6d98f688a39fdc667d3ba01cd9681c51172b0fdfe6234a329d8d66dfd7709c1eaaecfd747de069f8bb750f0659020e1530cf10197fe95a0783d6c8651235e65868b0c868a1f10073da972050c0e2db911290e15e1a55da024679d3ea266ba3fdd16338827cd2dfe76e3c6c00f33dff27e6edbae1d2e19f54e0c9528a27a75e1247e25b15fc38465e5d6c42f83d9b2f5ab69090d62bf99cc829ec05ca7a1fe3fd9f24f3c08c4b4d531c30c1693510ddf1ce8f296dc60d3076f971c838bca793a75579d8368ef4427215a52d02b28d760a4ae0801f20383ee241f20170081d432124b80bf98629b40b25cf99a328fba652fe35bf4cf63a3946522c78ae874cb77c95989eccdc91ef39a9ccc0d86897a04d4105617c4ccd7816002d89f8ba94a936e82f8d15e615beb4993c67d5c02d606a8395e7319163996d042dcb086a7171bd2df268e2bf229f16a6392cba67b10deb571d69c73acbeb3d5310e24685e639c1b4a02f32b661c630199d62e53d319f4d64b50f90eb5d582ac200a2989e4eec5deb1c9d936300a1d59682eb483cf43ca0131664f647cf0768f12cfb0ba0dd92631ae89ed702bb485581fa3588bc344de1dd05201ddac68019750ee3ff58cf8ac40d45735f4894911e465823e8f0bc4bd3d0b0ce8db310657648b9dd327295b5a23f45e154be6222249fb07d31e6c251848c87544dbc22d5fa5d3475c1c16bf4407819d27415e9cc62e7057ae3fed23eacfad77bfb87b7dc48e4bc82c18654d09bd969a688a840871c005074507c93149d2aa46133e8c66ed10320fe4cd6e4d4e01331068e5d011ad9a4c94ea91287ba39a0647f70820bfca29693457a7446217d9f225df9ce6ee54c9674cba0e5a5c09ce27b11ff9e8b1f68c517712c23beb8debccc6695229c3415f58a8ab158e280bd4b54a4bbf279336bf1871b3e635910081311aaf713f21f9eef5f62b9ecddc49efb4e0cd686bfd65420e6f11022cd86d237e7414bf077a9f8f7ab210389cd455c6ae580f1c77fdcd1dafaa1a1e1a3726b6ce13f50e7c2617a152d10ec9cb03fe0d020103 Msg = "" Sig = 3bf15ae5d08a7eaf53c7e6c0f1a789a197ac9aaea21b6c2a14ea9a6175596c92432b224e9219d68f7d58649c476277d8daf5d2fdc61c80ba6eddc513ea0f91363eb9506621c8b32381ae6d0eda72984b2f450fb1aeb144e6c798d0af5117dd35fc4a27163d258a5b227b9e72b83c4fd72886f616b50d59c0886f6aa291b65b4401dfccb855d697bb7fe9ed7e29cda28df50736d3c2b66cd3a039d2f534b580a00395746962bf8d1af5fd4940975aa6ef17cd11b496ef11c3df9aab7434cf4802aae07976e685941b47df1a7a24d097cb19301cd5362d6d742d0f94f6dce97e54cde999c4dd1e201c867c9fcc46d30295178430c2ed8d0f3699b5cc5a9de3044b7b63430bfce3fd7c333f291a1f31e41c71735df949861d43136356239ac51156cc5d11a92dc3bd2921cd05f785557a24a0148abb9678a93f8082d8624e9289a3294921855a1afae7fc41084b3f03829afa6e4abc9952aa9d07d7495427d169fc47d0739c31d71657d44a40ad17184d3510a4db56b4ab5d277f9814b9568686c0ce6b18ae4d69b0176fb3f5aa6798396c6fd390df61ecbccfbf72fc3fcf34dc737a6a6e22884f677b1645a68f65ccf36c90a23f350947b514f89e1521c329b08d109d032e13f7680a68489c97a7ba6cfe66d37bd3eda7d97adf9d49d1430e07d34279207c98d1a589b7aeda8c45b5bed17a75efed9ca22043d9daba1a024f0816568652baf51ac1c8338036614ac834b0f69c6539eb40396d53f5d209f434ecfc3d56bf8295d247cbdb559725b7eb61fe5a93f6b701a6b86c4a2474dcc1014c0c82041b68c817f12d9ed410f871e227abb3d25b9977c3129f70b4663bec7329930eaff732433e6f5df3506d0f714d6119facac3fee635f1e5641db853307f76723eb459f5969376433a7b3cb688175e5caa5e0472bd3ba059992e314d1cbcc318577222a587b4607de7211a26ef6ed73676eba26bc8f12badca267aaa43b1f582e7679d9bd05c1a67675822fb53e6699dcc0a713508f7d7d9f9a99172b48dbe431f54e6fa15e1fece6b33989de0b425b83a7866570e557ebe958b0e384146f592f62e1f708ee010d4020bd580f88e469723d4a2c55ca4bcd278c3971b9d0beeaf93d674b6bd9ef367e3c5c11f24f4356dfef571c7b1aa65162c2f7d5ba0af81e5394672f24aeb9c66d5e9a53c7d4b1d3c526215932a648d131c37cf0fcb03458f05ea8b81f5eec5ff372717e7fd64766798319eee066f5632e8bd9ee89084fa85015dd4ce1853e56a7146f64b6b3a08c9cd7209eaec59a34612b62a1350332631dcfce94db871d735fb5e66c3de124aac76aadc63eacd2b84d1aaa3e8bee57cd2c046f73bb115b4f8aa6b570a37e22d0dbd07552d9fa44ae0c30d884941e9567ef0a33cad9c5068a98799cc711e87a05752dfa6ab5b14d2c25519472f2f31f9d2 Result = P # The modulus is 8193 bits, one bit larger than the maximum. Digest = SHA256 Key = 308204080282040101dd858d9b063d894acec656a9bb8b1920bcea0c963191c393acfd4f6765479331d50ac9490125572bbbfa1d551f9b1b8bfea0bb40ff09e581b35bde4e58a54f0e954a6ff639cbcee04c4498be5442098beef6cd9bafea003d6a582bb648a69a723f182251fd1165fddaea382e36a6868e300ec423d0198b404288cc21dc7dc659ba9e7c210f54684dbbb3fa07844761a3afa6de256596ad5b950924b5c50be17a3a9d54df53307202afbc80395b8e0683da5309b9eebd26344e54a328da2a259894626824b811b568086011983d457ba60628df4ab40d0dcdfd903dfabdb55439b10efe38526de229a8ba4c016c84263d857b9ed6c3c3922263e8a37faf23adf9836735e16958f9d6ac73f0129a4d159be1ab7bf991d72fec0ddffbf78d9161048d3c63781bc2e1f7e75f417b2e157f4954460ae9e8132fbaaedd399085bd4bb73f194ecde81539de336e8a04c51c13fc8433e26f12b58572d7a6bba4106dbaad2b1c253e5746d3006296383c72e4c4e51e0bac019f5b9e8f7018da482cf93485ccf6ac233f1d90041a0f5706424852fa57e0c9e5bf15efc504bf954682ee0e1f939b075cc798afe985c7e37f8d63096391f4b8c178cfbf4936ba3a2d115b0dcc73a49c98078a6d068c6716919fc8e81c9536cc0d028be1bd7b1e23be2745561b38d74904867bf2975d6bc1e976f91073916deaccb3bba69626b9547233fb767100a4cfb306c4cfcba1887b6e843cda76d2ae53773220893cdaaa1ab8efaa71f2fd2a6fb69ad96d6ffd4ab45ab38698b87f6b491c58e0f9cc57b9ec1ce669f074f0735f26e8457534fb90ab4a56cef04c79b2245898e58fc1f8f441a69b0e29ec236d1b886b6b086b231af034e5096da42b2fba959cadc246b3a6d7837f8e7bd50d1f6d4ad39431099de63ac3d94206ee296841319e7e2caa2adfe4143425cecc55958e705149265026e58ebddac2b524187ed422963c9c5a5af4633058cb39972991bf1195e641af30109cdee55b45506cc5716039da39e24621054f3105071a037680210e1ee59c8f8c207d73cd8ae1c86f9a393998a74829f980ecca27a1bdc160a733ad3b98703f1d63f07b41df9315f68e014127214e6cdc53cdedac3f77ccf7a58c7735918e49c682716d6b865ade2f7648d21c1dc5a18d24e19c271f3f743a6f37ca904068db40e6b1dead262b29a1d492bd3fd9c50c90d3c5d51072eac1273ee37d91a99e89bfd035f097fe25f7ac1c319a19271d5c46e4f78367c4cf2b017a18716c6e8794d0d04bf580e6bf853552f3501b60da05969c71ed41dfc530531e653629002ee39d3ce489b7bf634ca1a3c9e896f7a17114f4f237c18b555d73fd7ef8553dc94cfa3eb33b77ca25762ea8a8ab446dd8592f6a5ca82e263fdbf0ab143deff6e4187de56412b0f97d4f12fca9b4954fecddfa2e4a79457d63020103 Msg = "" Sig = dfc9e4e1c3106605f5b847463dc1809b58494d981d6c067aa9085c9147db821a50bff823e7ffbe20fbc731687101cb3e4abf421f59eec7b5baf8e1a20d31bf114ff0cf02cd0e4bb284c6c74caaaf95f97b0398db80c4f5e70de423bc643eef4a0a96303a6fc0c8d26b2ace4b5dd353f57eea9efe5b444f9cb48a256a9f41201030e1ee226d9b5d66b292de430a1c12be9f30f58d44fc005baab7e5f325711ad8e8a37d79388e0638851fd49b2cf7d977f197f789d2c3dd131a5a0e820c113683f91df9800ed0c68bf1c9f022037805f2e4a1abf02c4154e1420f5dd774a3e824b5bff8d028e21e4fa413c9e35f7293f5aaa4b900dc272c3b407891b536d8a2918128c2eee1f225b145e7a514256792b9d1886013e8c15f2d70258829760794412d8eb32bc749984779b5aec57c22278f89c30d57d97937a1c0536b39e66d00cdc11f2fac0095bad249d2c40504b68f611902c34ff653a782d25509007764b30bc051d4f51e80f806b0a19df377ba5a9d6a85642a5fb87f393b1a1d57f847dbc4cdc2342227d64641c615ed919f2cf05084feaac3f500472e4112d169a0025f4db7ebaf8cd26783518de44d1fb4d15bf128ab63198069a229bd615340b568cd4271bd0999b38d502ee3b2eeca8beb362a330532e8f05f3149101e448f1a670cd350f56217bba47d1c58694b4399dde01bd519b38f4bd5e98599b6a8281346fc23579c151b5f6c193d42156dd4cd819da340c7ed1f74661a75a1272925e317b4999f5c284d872b71942a7055b8fcd59ade776294b7c26d95608b4a94c6142e57e71dda5476f7bbe7751736052a679f176434ce1ec9803a0fb6305162712ddb5e6a25dfd392cba964e4b526bb5ed45933d37649c131cbd40437663008ed3dd0a3130bb2d621d78e01223a493035ffed6d0c9c47ff71fad5e4bda62bab70dc222a5fed7a3e08a708f25958eadf0484d9d5541c35b526ce93dc6abeb6ccc86ab3b342295c112c84072a63074ad87b4fdaa7964e59bb5ba8d0634e13a8714f750e84eb965d46f9709204abf9dcb9a0a39dc82a4e48fe1256069dcac7ace75d0a4c42426d2d0fdc2e82901f4f93b64d923c88a735870bd9e0f59bde0425dd9ea595193e8cfa4ccb331b4c82edb2ec727049a79d25d00e3367c7b9f306cca0208a119b759feb24bf7af5f6c226249d0fb4511f74e1626a50de4251e254b0228fb6aa98abc5320171f9ea9d597ae15046fd4a5325dcdbd49fc54093cf2e02186ca54e97457cfeef373d5c9da7d9e839445429db160af5bd43fde2f3053e0efbda241c750f3d7bb4d12df685a6d060396306040518741d8e0d492a3f2df43abf4988c60b6e6722588bfe2853834c7424c033635727a17d8a7cd4ea007d765b29863d58903f41b517e9d9e6085b422193ff90a9af687ce24d8a393e803106c39b7f6cd964d8 Result = F # 2048-bit modulus, p < q Digest = SHA256 Key = 3082010a0282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 912209edbd684deaca5855ea6cc89ba16753caca12df2e18f56228f0c2ccaa3bb5e45aa2107dbe2cb5b5c3e1af159c858aa9f665df4433e5b8df78452da436310beded396ce5ab4fc3882ed72ccb1a2a9226ea4177deb2d341ae88aba789106cee2b25ad4049c47a46d05c94ebd39416674adfef4a212cf139a5283b8ec51d54c21461e302cdcbd8ce9f7659b7d88195912d706cfe30f68ca8419054e22f0be31f86e49135b86e3021dd43baec6a0cd24042d81f71f8a1e23079e6ab1f8cd7b3fec2882e93f6e724d3dec5a2e7883c56b8d9773036f116325bc6cb934968a780b66251e4583fde426e63951b8dc380ae29751ba5cfba759c4f192bc373775d44 Result = P # 4096-bit modulus, p < q Digest = SHA512 Key = 3082020a0282020100cefe6a02d3b9919783aacc1e555888b6aecc45c76bf28f0efc673a4576d44db983f5669fa28bf31966d1124d01c0f1e9976796a4f7855115f74b59f65aa17d3e56b3a265ef91463a562fd2e770077cf7a0cfc4d0903c812622a141076046bd2b334e2072e21b9cd9d949cbaa010d73fc7c1f5337431a18fc93930509c713ee4e773818134912d7cfbaab4b57038d645cca237b2fc367f76b26200894e174d3c4265f58765ca0e81e2525db528afabc5d149e60ae2aae8e313138b27c4bc901f9612728ab7a32564d3d93aff6ba0033c9e8db84cbc1a2f0de32a275318836c07f07c51cf5ed43c5c727a4e2541a78c91e6a7609edf4c1c0cdfc59fd63621223ff297f63096f876cfa93449994597ef27e47371ae5c3ad575b6fda18fcbc314eda54411aaec457d52e1a44da6ea0d6f43ace949f6a6e9d5a917edca6cb38b217e9bef4279b8b98dcd603ca299dc3173fdb3978fa6926e8a0dacd58162e9337b9c5af7f7260b2c4f4cde6bc7a71f1a56974b72c721c57eb925860562b744d32a65cd2577e70e8e00cfc528d54186bfd6c3fb84a081ee7f5c8a8ff388296f021ca13b99e5ca6e773adfb6a6b7206a23078cdcfb57db1f1cd7d21e283bbd8a7c1e8d2eef46008ad2fd440d6959ed18bb84831d872d79e1ac4260caf481faa9bba227e15a1b61bff8249c9b60d44056118969242b004059f85c0125b1fbc47cfd4772f0203010001 Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b Sig = 98a95ccad59ccd39b1da810b53c9c0ce7b4b0acd65c0ffb788c88c856ea3ecabbe7015d4bf36b7c3de7c4c7c18063428afc567b94d4396048cea1a3b56544928e28b15360f9f5be7e700eb3b4d64b47061df1c0e096015bdf1329ef7a8a507ef56fa9330df4b1f3f097968839a60d1a6f1bb5b247032dc60b2889085d1dea210cff53c444b3f614d051cb41d8f171df025712bf57497f57e3c3e424685a8858f431a90d689dc1f7b41f868f0e1a6ef612710f365ff2bf90f2db89d61d9ab9fffac16581daec6ae1ab9f49c8dfd33a55f7b1e431fdd413649070e0a915f25363d3ddc2091fbfbf0fbeafe49753038dfce6973458af66a3d318eb7caa44d3fea95c46f40976398299db270e04dd20e77360013fcca04874307590429b13301be5f47a9681af6a47e5eaa53dc7ea05cadeef4ac96bc2c8e14ec9d0966e035898525c92fe7f0bc3a8996246f42da5dc0fb14cd856fe5bc51c031b3d83870ae89e9cdb1cbb2605b3f8bf4a978435c80a0e99a1a60b4e1a45d77458ec39fbf0a65b9b5891738ddc44edede2614d96e62303f0138051ab899e67bdce065ac5ec8edc6b591220b2522f8f4920bd9b7d4084b30d9a79cc658de0260b6e76acd7efe0d5c38e7856a7dc22bfbe287fdf88ca393f6c575cc1db8f0d8e47b0456e5a392f27e9f2b0352da61e58d1c1ba23b32de9f82ed35cd862644d63ea6a3f09b3642347ce6 Result = P # RSA PKCS#1 1.5 Test Vectors for FIPS 186-4 from SigVer15_186-3.rsp in # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip # accessible from # http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors # with SHA-384 digest d63a32378adebdd6450ce72175b76baf06e137d1d0091c18af157ee772baec79df341125789e4f23529aad7c13270b5a # filtered and reformatted using convert_nist_rsa_test_vectors.py. # # Digest = SHAAlg. # Key is (n, e) encoded in an ASN.1 (DER) sequence. # Sig = S. # [mod = 2048] Digest = SHA1 Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 Msg = 9e7d8a94561c95facc082974fcdbcb813e1b37fdcbb1013a7d9c7c53d6e6dbbd44d7961fa36a106404fd760ead4ceacd61a0e150e144c95bb239f01a212aa1b585a29024c47d7745189d022b13dee9b9e14b5b70ce92a38607b50638a503ea61e7473e4abf3f15c4914f947437770f6f48836f079a81d7e4057887566a5700e9 Sig = cd0a22729f6a2eb4c7bd6c1ebcb9510ba1aa6e8921109d7c1fff6f7cfc36691b69e89656b9d7cead82356efd740faeddb0e3cba5a98656b841f2e98d296b995b758074fbd97af3baa4b28e9df89e9246eed76ae3eca1bd213a81b5d15411dff648b887a8835fa2f7bb2f78be5c4be8dfb1ef0d6b08319685edc437e56da3c8a532ec8c7382f74859530eef7adffa68ede91e3fe4bd29f43bc8ff813fec7d0a15aee6de202e4f32fbce4621807cfab47bc395ac10368d931bd73a86d40a38cfa898668cf76f0f4eff32223c0e452132c36b2c16f228286abe0f3fd4f0eb73e5ad989ca19872097948c6152320daed43bc2a98c3468a610d13ca086bd8ea89bbce Result = F Digest = SHA1 Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 Msg = 2dc3fc128057e1c291f9b55ace78d9473dcd3560a7ac7d1bfc59b301f3bdee5ff1b9593f2cba7e96108ec5bfe2763728a37c884c370655e1c6acaa526347c76feb4a24643056b2e7570864b67f16ee41a49acda3c2ad87d73d38342980073deae41f6468d452041e30109a27ee8085f907cf0a4f91c99b6728a6596e9326d739 Sig = bb75bbdbaea3269a01bd9b5e492178b7ec11abfb59d417cd5cdabb8a4b922b0f21ae69e9da7a9f628c9cf396bfeb75c836bf734561e68e91fbefeaf0f57f261c936bef741527187a5315dbf584f332fe3ed8a44367688e28998675c31f2b1cc3fa87faa4abcadff5fc64025c9589149e41c45a5037fe1c27d320d5a40ab6119b639ba052ad1d8a0339fd3a03f1356bcbc056c4f604862df36b66685feccfe5f93f2fe0c957a02e8d41a574ab0e56d8672d338de761fc9e9a1b801ac5dbd56c1592efa77f782d1dce3531efa5c7f569ddc313f5dce62466ddf269bd5b780f7c7c68b5232e1f77f7b4a8eef8a978eeb56d691c3e4a95965867c61d3c8e7badda1f Result = P Digest = SHA1 Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 Msg = 02e74a1d1d61bc6c856a20fecdd64c6a011542b3e7629c1c843e2d3ee21de557115ff5e56c8134741d95c1b4e4efeace14224df8de2b3d48d1eb68c5a2dbb6c429fb7472ad0bb1ad61fee8182eace06eb3c7d1168b10c8f8ceca4c90da6f424053a30eeb6866fbbf588ddd523573f5f1e9ec1435767a03d682c423c412435174 Sig = 7aaab14a1a89468ab4b583a8ad03df515e5d34b0c36eeabff6c4532385d448ce99e4ba35c927751cd499fe3080e004a903afe833667965fbd2d97f8a4b617f805ec88bba1133c5c304e2183797887db331a597d1e5f673264f6fcce750b504ed24fc066af248833d42cee935779bcfa02b73dcd29254b4dcbe831b70c289f6998884bd216f320e4615fec8181d17654b7201b62e8610e69dbd8cbad6de1a5cc1b4619b2680e7ddc27c02a9b8dde6efecf0f6c4551bd38b46f10e78692887bfae9cde1cca4e33733797144c6cded6b58cde54c5b877e5d10d4775200c0f4eff5ccde7a42788ac22f762411da48826b670297f2b07435d61a31e063ec1a2791a32 Result = F Digest = SHA1 Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 Msg = 4b4f319b5c8c53e7a4749c4ee58b0b25365a96da57721b2044af994c0abaa0ffdad106065ccbdc7e4556a03c2c84b46c9a860f7760b7332b2ddc5f165fa905321a887ec89797fd8ebfefc212f92c905c402a60cf780c57510283f6ac8e4d913330fb02a8b7f89e5d3ac7689af38c853f50cef0aa487b6fdbec2cc6d63eab2a49 Sig = 1ee9549fc8cf651a593e8c4516cb1b3d58099e6334b2b35c5da1e1c549e4a7769e92d51b52f622d5da43f8778c0e0f860f7e3a02268ab7a64523c0eddfd7db7941896a67bb33895d577be6c8c86af72d4e2feb5968eb2f04e462a2ed9e648c36c2d6667832a640d393fc11494a7379fb4fd6f0bff27718d8c9cfe0c9f2dd82472dbb6b751a5398be3f9aa67919461efa7bac3c6d5fc42b2149acdf29f8a30a98ac89a6a48833a3b2658111094372616986479256617247e60d95bf797b503d0dfc61b6336beed318d36e9f3575454cae1df787ff7f163f40598694ac891e09f743e02f442a1ab5ce1148cb66fde982ccb8ec945e59c57cfd5747cd5de5f3bf12 Result = F Digest = SHA1 Key = 3082010b0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70204008ffac3 Msg = f62e0e07bb71ca7f93736ce1d2c29a4fe7a5c8769955a364916ab09a19943063238b48648d495e73a376c6ade6249ec20cbcf69447383501ca93b7fc8a7ebbe341557d0cb9519fa247ffcdaf95f1a179a5b3c4121300572b9b369129da08a97b5973f62ac7f355b186f6cb106a916b1cbd727a198616d28a0a3c84489499c1d2 Sig = 66b378c5fa44c443f0ec885d55dc877612246703342fc8ef38a98c26325e52b9772f30d29f4a23b67153cdab1f84a615208ef809d84be83c57cce32ec9f9dd07a64af14f964c73d5a8f9fbafc07a68dd046cfed8e1c54c6fed3a4bb7c9ec153b64bb6c1591f1f78f834c44153da1dafbaaa9d44b8406108d70577ea8497b33aa09c5f2b63906949f1ac098d34c82a80a37d2f4164ea88bcaa30ead54f3b0391485a8eba084de3be452de37dc52d278d757c70c1b75bc1ce7c1441b0cfed2ec5e045bd77e732715c593e2a3b21ad81f7f92b6eb9ab23f84cfbdadfc89c75dd4474e752bcf479805f2b4fc5b953e2aa82b72044fb865cc93124096c14e0a645947 Result = F Digest = SHA1 Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 Msg = 60c3a8bb6b10b30395cb1a4b8faf39cabe5cc3b79057b769115390bdb9afbdb8883f506d564ffa2164e537ae3647c625a5bd5cb7309899d693733b979bb9925b386834aed414f16fe32e0932bb869de2a60f64ab36e29f16d9864f76ad6fa58496c4ba468d6680353b2df99ec675a649ebd943594d3eb1730c1434229ad8de7a Sig = 5d36b5e092060e763963b87b41b027a1356a1d5068c8ddee205f0b012c27d6906e75ec2fa93cb840d69ff3c149653802659ef116c7d740afd3c4050193cb488493a9bf1025ff3918ffdb073e5b2f705eb771e1e7c91dbb9a9e18b1a36951d60671e25e4042776ca265bbba032b1dd5aae000737c49583450e072c4571ece1b5af9403bec0ee4eeb1e14165c8df6d2eeb93f10ba3dbcb9ff92abc2773d044560fa162e9e5b7f6915184e6ff3548df75ef7fdc8f2c869edbcb1b4a6598fd1acaa394f501eefc3fe5e6945f4143509d6cf8b4c8418e4f26f53400fc50d00cc4491ad16b58785fcc6f123d52b482764225f66998b3abc3b3e2d5e8741f3170ecc574 Result = F Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 Msg = 95123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea Sig = 51265d96f11ab338762891cb29bf3f1d2b3305107063f5f3245af376dfcc7027d39365de70a31db05e9e10eb6148cb7f6425f0c93c4fb0e2291adbd22c77656afc196858a11e1c670d9eeb592613e69eb4f3aa501730743ac4464486c7ae68fd509e896f63884e9424f69c1c5397959f1e52a368667a598a1fc90125273d9341295d2f8e1cc4969bf228c860e07a3546be2eeda1cde48ee94d062801fe666e4a7ae8cb9cd79262c017b081af874ff00453ca43e34efdb43fffb0bb42a4e2d32a5e5cc9e8546a221fe930250e5f5333e0efe58ffebf19369a3b8ae5a67f6a048bc9ef915bda25160729b508667ada84a0c27e7e26cf2abca413e5e4693f4a9405 Result = P Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 Msg = f89fd2f6c45a8b5066a651410b8e534bfec0d9a36f3e2b887457afd44dd651d1ec79274db5a455f182572fceea5e9e39c3c7c5d9e599e4fe31c37c34d253b419c3e8fb6b916aef6563f87d4c37224a456e5952698ba3d01b38945d998a795bd285d69478e3131f55117284e27b441f16095dca7ce9c5b68890b09a2bfbb010a5 Sig = ba48538708512d45c0edcac57a9b4fb637e9721f72003c60f13f5c9a36c968cef9be8f54665418141c3d9ecc02a5bf952cfc055fb51e18705e9d8850f4e1f5a344af550de84ffd0805e27e557f6aa50d2645314c64c1c71aa6bb44faf8f29ca6578e2441d4510e36052f46551df341b2dcf43f761f08b946ca0b7081dadbb88e955e820fd7f657c4dd9f4554d167dd7c9a487ed41ced2b40068098deedc951060faf7e15b1f0f80ae67ff2ee28a238d80bf72dd71c8d95c79bc156114ece8ec837573a4b66898d45b45a5eacd0b0e41447d8fa08a367f437645e50c9920b88a16bc0880147acfb9a79de9e351b3fa00b3f4e9f182f45553dffca55e393c5eab6 Result = F Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 Msg = 915c5e4c16acfa0f49de43d6491f0060a944034475ba518572c08366a8d36c7f1e6afc11e5e4649757bf7b9da10a61d57f1d626847871d8a2948e551b54167c79de88d3ebd40a3e35809b996a53348f98a9918c7a7ec606896ed30c271e00c51953dd97aa6a8fe1cd423c3695c83fcf45120ec0a9cd1644642182b60e599a246 Sig = 3d57ea5961db8fc144301ca4278f799911229d865ea3e992c7fbc4d03c6551729e26034e95dd71da312340e4051c9dd9b12f7700a821fe3b7c37785d5106350b667ac255a57c13da5842d90bcadea9e6b1f720c607d6893a2caa3c5f3c4074e914451a45380a767c291a67cac3f1cab1fbd05adc37036856a8404e7cea3654019466de449ad6e92b27254f3d25949b1b860065406455a13db7c5fe25d1af7a84cddf7792c64e16260c950d60bd86d005924148ad097c126b84947ab6e89d48f61e711d62522b6e48f16186d1339e6ab3f58c359eb24cb68043737591cd7d9390a468c0022b3b253be52f1a7fc408f84e9ffb4c34fa9e01605851d6583aa13032 Result = F Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020307485b Msg = 03d2f0693517cffb2b724c1f30502c5359c051c1bcd88dc1dd54b89e6981009d275a813b2bf016b74d0f6ed0d91e62d0884785c9afd8fd1fb7e99246cd4005cdda71a39cb649197a996d8ad2d23fdfb6bb015f24ec3d7f88af64fb83b4b525eb06607d133eec834cf7d6c9ab817b4c0dda370459d9cfba05ad0c1adc86a909fe Sig = 511abd82218cab344979b2887b02600d2427f1eb12ac01d97684c2a443a9272834c3f79cded07a39dbee3770dde827a74dc994b17bfd8a26d07b239d26d58c42f79d560264c31b7e1c3dddef6d7556f228c394414f4cec561c3da2686a8eebec7702f32850809a93deeb84b2a02fcdba224d2fd9efb8e056e796f49b57d56e9f3e90d0b49b08bdee93a2e12e676fb4d4fa838c5bd88eda008f1b592a72465587be0ae17d9b156b904f44a7e04d3b58d24ad67b71b0f4c699fa51639546b62b9f83597ff03d465f1bb396ae15e92d0e92e85647d5df113e2c7518d0e3ad2e7aa7dac720c98347aa151e4f37fea081dbed350cc9c93f606b38f21a3e5de6d140d2 Result = F Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 Msg = dffe42bfda886e1a73fe8a8dfcf71c9fb44deb054588a9bb9199d554aecce08f2ff88f2aa6f8a0fb675fb03c8e685c27432ca7c33c189bfd849d34fa7b2979ac1f57eca389632426bae0b98398ad60a3342557e14e96041c1bf4d90b46cf7ad1348322d28caf43c4f7e86c0924ae703c109ec50a84ea2a43df078c3015a52b28 Sig = 8f4dd479239f2d08dc05d7d40539288b67c4d77210ecb16be76f0b1925e8b088570831e361a1ca57893135f8af64b8e2996b8d635899da4e04c68acb9b1b3813697d57da90c57f18509e0ab6705c704feb448cca5c07d258ecd884ab93f508cefdb25f2bc3061c4006099e2e33b27972c3edb0a0a33114d381c82ab506d041ff680af595ef3400a8bb6774030d2e38dd304272092bd32a553017f7bda4b998b27aa8aca12def327b1f11063a5342b0d55738183417d321c5682fc4ab64e79174216feebb989521e1e3d827647068003be34fe1d093964d28f4877c49b4065672448597a89b91919cfb55ca13836e7e6f3b3fd04f417cf1c16d9872538bf4e87a Result = F Digest = SHA256 Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 Msg = cfe99788f55ec6944942bd0a187d51b80fd8bd4051bd4f07c73e614eb75a8b9f997b176b2642b5f1b1877061ba9ce142c1d2a311583f072b7cbe08ed253681191c209d7b0d438fcdddc284d93d59d6dd80e48333a921dd31c9b6834f88768f8701e01102d3e8bdf074fbe0b8c93d9951f41545ef6eeb3be35530babc079f1fb3 Sig = 9fd6f6107e838107f906c26cb2910704599f175b6a84db485fbc30776eb7fd53bfe20c38c537b154a3e519b662bd9fdc8e3045e21f6e5ae97d0ff6a9d8632825544525d84f99f80e3ed4e69dc5e219d59ccfbb37c23c84fe3b3e6fb22f402f94e5225c6387fdf8bcdb3508f8832908fe05771521e92234348004e8fe19a8f24bebcab9f074327c88d066bc12081748d696be6135c6aea32220ea786ebd7800e6936365ff25831c28cb6c8a59237ff84f5cf89036cff188ee0f9a6195f2b1aca2e4442af8369f1b49322fa2f891b83a14a97b60c6aeafd6c2928047affda9c8d869ff5294bb5943ad14a6d64e784d126c469d51e292b9ce33e1d8371ba5f467b3 Result = F Digest = SHA384 Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db Msg = 6c1c4396f7b7f9228e832a13692002ba2aff439dcb7fddbfd456c022d133ee8903a2d482562fdaa493ce3916d77a0c51441dab26f6b0340238a36a71f87fc3e179cabca9482b704971ce69f3f20ab64b70413d6c2908532b2a888a9fc224cae1365da410b6f2e298904b63b4a41726321835a4774dd063c211cfc8b5166c2d11 Sig = 422e70ace2a2c07d2adbecd9dd5714c42d0e768d48bc33fea822974e42ecf99c791276e44936e70b183e712e0dd9b484199b92f24a76c6908faf6bc20fe266fa03886781cead7c82aeeebdd150bf48ae4698e76807ef24d29f3cd5590395f4725dbe7e468540b4d4d8be84e673bff86b0c08af17e738af91cee4f14367dd6bedf71b5e8e148b61ea968f16160604834831d557879542598be7d2fd01c7966f0ae1ec2554d8dd653f20c551a1de6212481e2a19a3e2fa9cf005e5f3ee1962c34e3e85f84104f9172debf89db438c32f2a8061ac15d3cd3f3a6b7d75fd7c3f8ea0c505c6398d1e70eb12e9e16f5a0e4b459c02ec38f0dfc7a4a3139c1fba6f59b4 Result = F Digest = SHA384 Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db Msg = d6a169031049b0b3b582d22bf40b9fca45d2618457146c2b4ac6f6ed1f34291f6de8773955cd2e21b7944caca65794621a7ce181e5ddbb45e9252867877dc4e35b6914ff26ec18890bf31f60fff1df367bc6c59373e58a1d8cb607188a394a2907ede95f6bf096731867f44fe520aacece76b5c3ea75023c9d3f3c080eaee376 Sig = b9794f252e6907dc4c41de42ea5a0e6361114ac3814c4a92583ca70fd78e98190a0d9215bd5282e8520422093eff2e1cfa335cffcdcc27fe9bafe4516e74445d4aa17a08db754fc69b156d86ff26eb9e814f605142a3051d2fa64305d3e5c5c5f67c7d9e38c5054d069c14b23e4278fa5a73381f61f90a9ec428c883f1366e27ec0219db8c942582a284c161eead307285d0e4df6b0d7dea0e8216d7ef2e4b2ede2296e0b780e5a3f8d15f123f737b9d6170074f758de32b6f1e958b27e422b053df8f5fbbbafbc14119260f7022cd2934e8faeffbd7085aabc44497bfe07387bc0e5aa02399eab99318adb98f99a677aa0683e0c11d638cb13907fc5c3147e5 Result = P Digest = SHA384 Key = 3082010b0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb020400c74c01 Msg = eab87ecf61ca1ea8eb29498b510ab371784d0274e2fa77e077ebd18c86c66e6b072fb45e233baf4cf627fb75934ae5034848cde22489cfd2b7e9a2bb19b1bf402ec7c69627211e974c7fdc12f95ae766e717594fad8128ff8776057155e084fae7e87e217766b4b0779bb40b8e2201c1dd246e6186cccb8f6ffac356433c05c0 Sig = 35720e6883452e78bf0f9ba1566a638c8f5060a8ee313ba66bd2496d67b78d01fa1d5bcd4e3a96aebe6b0e66480335a49a500abd126c5b1beaaa60135db4e51b4efb5a59b662ad3525c2dd1c867bcf609971806895550531d9f5b0ded79f804d1d63c4a00931a64244a2b5f004287b523e9bd23a3ae8b393d2607d1a835062282477c2441cf3176110fa0064350f2cf73b7c67e02bf498eff69161e62e514563d23385be16498c525967350e047392861b7040c9b4039b5a8a49eddb385aaa4593c14e20dc4aa2f67258290a51c6e836e83edc061d4bcf5b8f3db470068372ff76a0109be686c25e70638d15156845dfb8ca1e84d0aef538798014ae1c173a14 Result = F Digest = SHA384 Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db Msg = fd73237a3010d505ea0ca786c5a3ae4d20c4eedbc6232199ce8ab4c9bf6f13bcf8cc26454f2b1b6ff900676baa3c07ccfc1f0cf7154e56d48425a0ca6d4ebdebe693206ba0f0a257caed8083322ba3c5ae3c2560bab710c3628c697463966d478d6f1ad36b88f1262679fbb8a7950a9efcc24100fd88d6cd2f6717ade86eab38 Sig = 192d8fe5a69a1f9acf186f42893e458b6356b10a8fd0ee45114acf625b61c69d13884f7860b02acd67b5b5082bce20815e384dee608162fc9d19ac977842018e4b3f321d84bfb487c0f4f6a465b3f296c73ca3d8817c771c9969ae1144b1abcf6de251e504d1f662d6094d4e6fcd9ea3f85162883e1179e9fee4a3d7daf95bbadc64221fdc8c144fb4ca502f3eb11df85fe6bba561feed191963ff9f8441b583bd84ee540e47b318629ad59a251b759f060a40e717e50d9c0c0eb43122e6594575725382684c65ecf7f27e42c3e1f7d95c657371978772e111309bf4bae5241fadad0ad9cbd04ebcc8ee76b368439be21493aa41549dac8c356e65435f706d79 Result = F Digest = SHA384 Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db Msg = c17eda0010c4add3f0616155cbe6d43f90568851052d9e825fa002591027e39be03966263f569b1dd94bb0456cb264afd6b8bf987323008da593d8d3b407d505d9a421ff95b26cfb47e827fafee9f3668c0e59f5dc66bbd085fb8af59e57bad9d5477352bbdf0ab562be2f3b2a9468aad8e1be31e8ffb59325628288761f7960 Sig = 669f6c902798a9c91672addb4fd138ca41ba9b5fbc8efab9bed5e7e25662a40af734240a301d304134e75494ba961740aa6b9fe54a340851791726a864a2d1645daafcbf38f49a5b319ab86101ae4fc5f21b0f15cd12e7979b6e3b2fb61dd049f9d864160110a68cbb9d399eddde358571cfad48f2057dcdf324768d8d3903d0a861a5824ff3a5b715fb7a098a41624ad13219a0af11eaced337e8e8aaf926eb4ad60534422ff986bfb498c63cba0cd6ccea9018a96e9a41e4693586aa70a0d6dc5c6312418d63e9f91aaf5df8d01dcaad7335cf88badf6d8da7fa9cd83e32be840f1b2cca1c8103d73d8a9949d72b4b8c56eb7fbfc523dc1accf80de1023d8c Result = F Digest = SHA384 Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db Msg = 92c641b80aa222fad6c757ad0a8936e0459bf8f4367f63ae5f41a68a19658452d91eb4f0b1c188811a78ceaaf03bf42fbefc6fc13c225c1816396842efe8ee3ba62360bdd8a1e859a6914fc7b8891d7b81bf0278c57b746959cc9aee2b7b6934823d0dc8862c8aad0278a3ac695afbeb174a7ac1da72f2c9b1620235d3053b65 Sig = 5135f98250db1ebbd738c4d905db5a395c36c99f929d6cbe5bb4de9288575eded2b14220ea49ca7cd04584067b000964df2a4cf0b185b7a080c14ae05cc277b8751b2f1fc061de93b429fdef99c39704a158a5463041a109614c9bb1c9f66df48a67af779bfe85e179f289cca20d5618bda9686c0826ae14f8c86acf28645c5c28613446f202bc952ab1ae4aa06391edb0eb5355712b43d12ff96548292bfa072ff2411e7f9d57e3fc35a43c36743b4a384150f34059c815dbcb26f55da2be86ac5818e2a315a12f01b98e5e7b03a67cb4056a803be2280138d1611a2667c18d4b2a82aff86d9fd21568b2e6575b8e3c0470da8b2d7d6d0a2a172e6415a1b7d2 Result = F Digest = SHA512 Key = 3082010a0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd9970203662f3b Msg = e5b327e067ed7a242749d21d78e0b1d68d288595dec82a55cdaab1768a5260b4346ff95641b040a71fd9b7aa1b16ac0a838f7550073cfb5865fb750646e0763562cc2af0eb41dce52974bc1662a4e0d2fcab88e4e5d3a60a33ea9ea908994abeb9f141182f4759c58d426aca1232551742a345b9403335527fa0b3c69925e338 Sig = 488df2a0a8775e6e65c6f457cb9e29dcc8ab6c37a12cf820308732052bfe068e3c6f3c4e73c17615aa6319b76d62df6cf48378b834dc412b9e5875f7fe16bb2670c4ee51cdc259df813d5faa541472581103421a9718e79b8c671b1c7b50f6d4315b96423ba6aca9d060a32372c4c237f02eef44f54f872bf91b5a390adf9c5a7a884416add7d15afd8fb8073243dd587ac8011a88d5566cac84d5dc4ca3f2d6938e0d03a9e8d016b4aea22183425c2bd4696d85501e264bba7dd980c3ac45d77a363955565f4675c5246802abc015236d69005d164c0f18a666d43442902be38fcc381ffb6b5a046af05686b0ad32b25c1e2d82707797016ee63fc9a952d2d5 Result = F Digest = SHA512 Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 Msg = 6b7450077038ca8478e7a380292151ad413c1949d78076efe497beb4013f036f7242375864a894d5732b3b906feb1ccd606315fbc79c5e8827a024fac432743cabbc5b35f2894c9f4134c1179261257034aaf24d16dd17ef42649c4ba80488601dcb03c7a343b88cebec7d3c18e9363fc6faf6684baa68cb3cca6ecf341d0784 Sig = 1933ff9ae5c520efeb711fd17a571a209c2ba9e0469e39a5341a70ca46c6deb2359005fb21c9e914e8a5037345906204261476427ddbdf29212d84c6e4e1dbda61aeb21ceddad1c3789d99ea28ebf72c4fef790f838191b30587e00fa841d63bfebd00bf468b462ae935eaaef2f83ad596b29a0d538ad99b44d615217f0643f0d9bd755fa281e35bedca37b238a89b78f9d911a24c40ab3cf69dade4ce4a30bd3104f890a6cf410a1e76e625e28495f6f9b385d698e6f8a6eadf0df3af03b3e078f4b0c984bddf525f220635cb2993b72ccae40ad3378cdf775431c2ceaa1aaa57f355eefffc0f34b5d70d1a41aac9b052594f0132308b0e329e34c0d2fdc519 Result = F Digest = SHA512 Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 Msg = 8b618f6669b9f0450a57cdc57f5dd0bfcc0b4812e1e2c2eacc09d9422cef4fa7e9325c3f22c0450b673c316929a339dd6e2fbe10c97bff198ae9eafc324133702a9aa4e6b47eb4c621495afc45d223b3284d8360fe70680359d515aa9ea02e36b5610f61053c6200a047f186ba33b8ca602f3f0a6709272fa296025258556880 Sig = ac87aad4ce85038b8552c4a6e93ed94368bb3376ce17ba1d08812e004b43a952e27fc50daee8929094e747dfbe02584a7654d950d21700605e699561c03e64d2016404da7b9c0b0011ff64f206225db1c8b5f974bbeca720a7c2ec73e6fbf58adcc6f5cc24df6d09ade74416f30df70c4449820f24378b90c176f65651ab1c1fc82d3fe834e7b66d0daea47b8d1931a81d1fedd4e6996c56edbe496fa237fbd41876a460780100e4e6f0864b6f9282abae4ecd98630548b5cb42e66cf9eb890e0651f159f356283af40c02913d2f3bbf6d8ebaf6b7d88e6699f482d7825428ccb7ef8129dbc665bd4df8e9a07c339a1134e907e439d0846480ae6c888c1e9be2 Result = P Digest = SHA512 Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 Msg = e2a14fdf10cbe13b0afa4294d073af00b19f02c2786987c9e3e80c79573e37aed1c01dfe20570f3f5225b7496c6c65fd5eaca387350c0fdf93fb6a965c17eccfb34eda8c25435b2b23f38830b698c2446ece487e9cf408e2c0d5b62745871cbe6c94b10f87586c0667aadace17bf6fdccb4a1a3013e81bd754bc19b579566f81 Sig = 0e340359f9f1fc5e974d8ad8c189efdb2849ec93994b152e497e15289015d915014c73503bc69b83803dfa9d8216181fcdc64782c27fe9d464ce12359aa60b44618119df19a8f5defcaa171c44c0c0ebe1991131132aab4b19c02438b0fead22bb34e51bbd565665583bb6eba36e82068e2e3040a177dab3c1d3a6f81d0a3901a934c10e2abd73e8b9ef7a1be29a7fe18b304ce57d073f85b1b6873ab6b8ed94d5a0a0f3e5fc9b4857aed36de4ca72deac235861297fdc51fd9553eed189335935f23b4058f293c8cce8bd9bfc8fbb374ecf4eaa0f2a1f06ccea4ff3071beff69d70efbe07513ef0bfa02dc2c6b19b5ced674a16b6672b6e04a32ae14157fe10 Result = F Digest = SHA512 Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 Msg = fb200350b60d1e9b4a3b1b4d7341c55c635bfa791569a438de3bec72450baae8144b1f28afa2e6b5a5312862851a10fff3437e37fa5700b9a40efe96c8af34ea24d365bfab6b4e2e2004dac7e44a94340dcb6118b7fe6f3d9f8469efeeadeda3523e3fdd53723f50e53e984639d93b42d97c0ce4f467da0ef62495455c0fbb5a Sig = 624183bf2abdb79689a45158a4876a352b19077de88aad06fadf3abcf4d2683b126fbf84c01ef614448c63e8a78d1e8749fd89a9b2550078c18989fea591c2a7c47e6a0bb4491dcb1868a43e75351ae2a7afe27782195f453bbf10643e6c3a23c01f2e713b6ded81e1db7ca4ecb3554fa9ae8005b80316cacdb4530a66dc2a073ec494bc3419df2f275db5a33871d0a8d9cd0d8bcf90aa24f096a79a4c8f5c0dfd8b1887535e59079c974f87d26bfeda7022399685748414df842ce04783b6f57bd2a2dbbe2e225f89c764b9775d7721157498446ce3d613332ea2cc589f7043afe3cae32b779ea8f1ab22fef99f67a0720306dcdf2d2cf7b35b0bf3630e03bb Result = F Digest = SHA512 Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 Msg = 64ac0940e3926d11b78494ee758ee6e7f9f034ddb622a99f4a15fe5355bcee188ccbeae909bf0dc4e51e520c0900052d41ce777e934af66bcecffcd365daa7af7eca69f547e401bc899aaaa07f0d9268e8d08de65bef0b1fdb3048acab98c2606331f02b440b313ec98103707ebd75e1157fdfddb719d00398bf48a6cefd2773 Sig = 3853af577c8f5f96cdb01de108ef8737886118ded95a315a5f2c34ae22f8fed6aad5cc1debcffa3576cc0a5050f572cfd171413275254455f19312054f06e9bc50f9d2dcdd1fac7ff2fbf456c2c9a1217992acbce6f867b48291911de8dcbde4e0b85a92536157d939dab1a42fdeeac9b15e5ed3ca542d1cab43aae3723349e405f998705fd0edb19d9f4631e6c7cf7ad1962e99fbfe11629226a634eacc2ec2bf3ee2d87c2f6fe934a2293f5ff81b4dbeab62eb4d94bdb4ed481bcc4bf400c2050faade7375c811967596ab5415cc6f60fb6169faa95303ceed5ff261a93e0c2a2eb657501db9866fe858694f57ba25ec2f514d8f75980247597a006ab3df80 Result = F Digest = SHA1 Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 Msg = 3ac87eafcf45920e233638ed4caa54765db4b801dd143ad978130943f5af41bc68f8bc83a9ba2c57045c668232080116880d20776f818c19142a068b619fdbb52baab85eadf1c0f135d5dc801d9b5209fdc99af81fd36dee33f71ec144662dc4eba41a48c33177621c6941eff4a970d623b3cd8dd55404df3d44faec884d6071 Sig = 80ab1f8e28c9f939a7a15a6f81b41547e8497b5ba2dd08333243352e9d7aa347dcde6200a5e1cfc8136d3c59999ee571347c8a48d91e185d0b08ca31c8ea83d578f0fea6ad38c820d68b10221d493ea93e065fd846340ae09b94c6dcb78cffc79b958540689455734a9adebbbe50bed6e998e957079d11812bc2b4b497f9b9fc1496a639e021337d86c4df2bae4a065fe69e517655a571369a4454a1e29370689f8866375fad63075ef189f0ec3b686b5f3f02ae84c99ea67701d6906ad867d0dabef4f210e533d7daceda12ee0ad2a6826178503ae472f278b7f25d51c1fe8ef4b3d61da0928f4d7315abb27e570ec36fbdfbb4e3158e29b4605e1b082e56ef Result = P Digest = SHA1 Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 Msg = e88292f68268095c2d1059d6c671ee2cc3bc8734748f97a2896ceb22d56b8ea4512beaf7640e2f9a61a6f9cf526a2df0f4ae230602d20b98b6b989c18e7ca3854c60dd654006a231c9e2e61e1aee0a193aa0005a4e19af3b1b9f994bc74dbb9edf09b4689fb72aca6dac6aeca6664e4c9d7a6456e1cd4c34bf0762e708459e97 Sig = 4b40e154df4538c2de6fc13cd93522acb23305b40890ae9e9ef33df58d0d1ada511346126fcd55fca4206bf3bf988c2967ade215538b818303596ffc33d4ae05ffb321ff303fa9a2b87b5467723dd1e036633398e15d9abe62d9f7528b1f31f3ad6ab70fd5af6029da4a961d006d7ff0f6b7e2f9181fdc47ed5fe0f74802e9d63249bd394bd6b570187dadb42a1ebb38bf1c78ba5b57c0a97ae29a6c9f8680b493a44c4909790143aaf12152d56df38864a36231f558c624077a00ef3619c58f7ebad4cdf706c4b2a47c6525c76b78f5473b57a0802432dcc67230fce82c87e41282b7e8f9855bf72f0770dd6be3f7fd260a435d51c1f2323257b507f97a7c38 Result = F Digest = SHA1 Key = 3082010b02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b020400d0d14f Msg = 3853cd6d1384358712da7c1c583afee73fea00ee4aaf41be5c32d2f827a8280ce6b270454f822206c340d953c9ac6292ba041293be285dcff6fca5edfb0e508b88791d3a7309b8cae29f8cc9bbd7d8465ce905da8dcd37eab2a3222646511f55846e7e55675f1e5dd5bf3c861705898a8d607fcba0e6f497f7eef0aaeebabcf4 Sig = 55dd7641ead751bc1b160724dd86e89497764119a998d5f800f97defe942aedc5cd2c8413918ac107a705dab99bdb182037f051b61932fd4d41f0a890f6db996cf99d210084536e3711653ab4ee5ce5b066a569306983c2f5b6c00c51fa49774f33c13565b95e832588ad2c004b81887c3df340096920908979e6f168c8818062cb04391f5649869e35efe762628f49d6751b7a3e0b184e9f935f591e4f2a1db158cb78f8e256c74c294ff424bc2efd3145cb234af88c623afa67b3eae68b91dc16a99ca36fca81653aa3ea47338c5a5a2a5b2340cff80672767f6e9549c6adebe6a84a4232560ad431a5f42a3ded809fda302ea7ce944ea3e7be7853704e1ea Result = F Digest = SHA1 Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 Msg = fefde998a5de015f63b0a75ce7f79f4dc681d18dc298aae64b7cbfa74610b3f70ed35b69b81221d19c5ca6551037acc7771132327b79e0b2968fa689d7b9a170e3983e2b3a3ba160bb9248a96b25ebe87205a7db66035cf0cc21545adc4625648536d805b1c04ab5ca3ad3807d2a2659be4678b00c9fe547f6190f41de1e087c Sig = 17a01e1254dc902e8c6d607226175416c17ea28d28696b20706790dbac60f73732c804b6756df87ce6b1baceb22d582a6e24bf3d1754ccf1ca57e06150e6da60bcb8b116b3b8a31a715e0872b6047c6a4d7f6817ef5f12d13356b2b50fd71f5d9a38a0c35072ca38beed29ba541557b0525fd3d6639661037b5b61bee51aaf4e6c6bf5c577f9dee4811319d671911138050c54bc273db9eed5a7bde3281e65942cbddbf909e87587c58c8d40c081c81950f73a33d80bea61a56ee4a8930ac3b954d4a0706aaf3c753efd304946f90f33a20cfde65e388c266bad024cb1aea8879c78fd0d9bfddaceeb84f10ab66cfce1aa4f0651d7b1f0b4ee808a2e1f490ead Result = F Digest = SHA1 Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 Msg = c0b2621f30115b296d84c7d4e015981a24435e1877a660cc6cd6ec1de088eb1b2efab889a79233993cc211f67e2e7607c911c573bbdcb7e0eb21aa01d8b03ccf20001916f3d01134c60d6e1d4cf784a3a28089f5caf4a7655adf506e752cd2f5fb8a2bcffd141e847430865232b7eb75185753a68a365ae220d8856c9e43d415 Sig = 368416eab883a2643e5288ad1d97887941e6a42a54a44336f12336cab4038e693f98ebe3df7378fd501ec9c7f267d6f8fafebc5340744a436d99647b19df668169849032b852df30da848e4605015aa0a9ce39c9ae25368c0575e7957273639d957b392e3556742bc5d0214c4cb82e3d342d3a73f72b7184b72b2ae2225ee830b1ddc528460046d83526c6d07b2bb89d4593b459f248eec995442e4aaad368dc0d3a10907ee779eb23c8a60df52fa461ea99e47e8cea7b761a02bdf81d43e4a7a44992d1317211607e099141de07ea034e95995ae52ebbccd38d0964e3fb4756dd6d57fb01dcc44b6d89852bcc605dabe36398e53029f4397dffef3ece22b939 Result = F Digest = SHA1 Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 Msg = 84ada4599f0bc0a41db787310f53a1588282b8669ba82e89e7f20fecec974422045d0ac86b5ea366960c4b97c6736e6adebe180771fdad962025da5c2358cb2725679fed559619b0ba9f98a4c6f949942f599b82fa7af38ed91aa219b645142990d5490f863a8948317754a2376d999f1d5c281e5da76838b9d74d69cee385f0 Sig = 8286a2139ece519ecdf8aebc2db2427c207100212008dd27b1058bf46db2a477ff55bde9f0d02cbc3d93b6a97361bcbb3aad990ee9d255c58a96bd7108311d3d9276247f274d5a0dc9e6e411ff389de34cb693b273b5da7bcaafa101a5fb6ef42fdd6288ff6b6868291ca914f564c75fcad55d7c2ca3bb5da2abe02a3d589686f79c4bbf24876cdba03ffabaab32395245d72051c4aef965c0c18ee7ae1d19d8c179086f6c0495df64c44b618d5e9d07f20e051ac360fd6a84e87f7f7a777059d0ea3eb21a11de8cbc22724944c71cef002b612278ade389530486df058cc5459c20dfd4e9695c04bce91dac8a1ec79f43f80c0d691a1cfd1a7204af2a7a1a96 Result = F Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d Msg = 41c00eae64f3e330222e114541eeb5eae1a705ca0c0687a68e7982fa07f1b3de3ee7402ab89df2dd8aa69ec06ba8e4460d611cb7aee88e8dea35e11fd3e4d77c4336379a71590ab0c3e909e0e3b6571915c86c3cc8a0517d6ac1130d816f72f6f8b7d946b6af936f76ff3beed2a0742ba0e4dba082b73a3eb924ff0c3a1bec12 Sig = 13165444a1f039da049b998e332cf7655149975713b5378ac5772f2e176ddbf338a25e297d873cca5f19eb4e4157c532d06249d1e99c2857f8d74bb74cc7593bc872daf5b45541a373aadc43a0711b3b2f27ccfed06d9578b2a3c7d10a12e398d0302f86e05f154e3cfd2a0e072aae157cae529bd5688fd0ccea22f58181d069eaa0957a5b0eaa2e3f5a4aeaf3d1512a43dd2f8434579eb57e23852d7323c5dd22359e9dfec59dd75ee3b8e234a41863fe0a68c46f777a9f48887a786cfaa40db1c7d9e04efb8a882d8169764b47a013b5d1d15f4cbf758adc83c53e9548e77de20f14b3b5f064465beaaa32ee41755aa48264a14df837ce5fb85a5ab91bf6eb Result = P Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac90203391c9d Msg = 671ada018b6132b381978036f19cb9fa9cf7d07334642cbf718c59896113fe2d00d70f1c087743830a13c927be53379398abc3769bddb54772bf1c2abd3ec017a9a35939c315fe940e5fe0eb52f438e1b8307e5e94e1dc348206e203b4d77b5a8a05201e63424b30b4042f4a5786a62a25106bf3c67989d0c8ea13daefe4163c Sig = 2942af5fb4e5230990bd20c2095fa29e9aefe6e6489111971f0dd397e8d461ab3f59c0f29b86d11ff187984c54c51b0bea35f479a4b83c33dcc8f149f56eb9859a71e45f3a33b83d30eca87bf19803eb5888ead3151d9b673546e2c0dbdb523c34331cbd3a83baae6b55dc465de20d40c5bca9647d74b8399d6e40404828772690afb93b314a55efb5149603c8421fd85ba5b61828c6f679b53f929398d87affb8929e4684631aa2e86d492d3d7c9a90c58e465080442f69623e4eb2080f7af2ed0442c0bb3f0eccf45d4f075e4474a2c058665f25164c457fd19e5852061af9b232cfd2eae7b60001364c013a1155a9af18cbc134d1ee8d30c157cde3a9ffbc Result = F Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d Msg = be91864d3728f895c689f09b28484138e0afa29589bba7486a68f0bf4b2ea1e287cc11f46344c7ba9e27a2e049125798d97921847ba3b3d6a7f672b6f875e1e43b875c9ec6fa0ac40b470d3a6c18fb8e510792da78a9a7ec8dcb60a5fbfba39f014bce120851a9f9347299703961166170e25e5f2ad46bd2446e2355fbc9d05c Sig = 631529e0b149ee1528d514861cac711eab8c01c1c22c7ff6ccbc08783a1ccb2748c22e57a1deefa867dcb1ae74c40b1969db2cee64c0706af8daf4c9e91c12672d8f0849af4bd0c4c5f8e439a3ba7e3ddf38a9b38db545410dec0aa40522d6a3cbc2ab53a838298f0b93ae7d362158f04858fc33ec03fa6d3b7ff0f27d74cc4abcedd25642f4d259d41511456004c24385ec32553ae5d5728a8f68707ddd6bfa51c2f4574e1c96ef4db0715675fa4fbc57b9091759eda387e16057e9d89797f61df9196044b98667866e12c5132928eb735fa2d02c0ee7e08ed68d80fe1f76bd85756a3967c6d3e1378a754fecee72362928cb622731bb01231758ebcb805f5e Result = F Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d Msg = 4c2d1103c36e96d179291397b1238177d4af3b6fb9dc622d23ed80258b096be020346d970d7ea100fa7aa068d5f25d02d2d94e7fb081cdde3f0fbd861f2b7092cafcc86cd4539d9d72265fe33a41fd84293805e3eaa00c51557e502537009c0f516b6ca9a355524fea149831677627a6e2b3a7c4ef9fe82d7024812b5bf0b700 Sig = 4d8b5ba1f5409f476221b3527be6389c1ca3eb50cd62113ad2f712cb2142ceff3178948670c9cb7dccd44896ddec9c0eba228370cb23919610774e9d70d6eade95865042edca6e90cdc007234400591e1cce71bfbf5a546548d483e68905113693a3d1719ce376e72b180b7f3c7ecd13469b8edd7ef95d9e330d78cb36e37b50e87d161b1abdec433421a3a65b49b39cacde0678de41df894d6a2b0f171cf91052bf0f0bb7cc89889bed7699e33540b4ec8f93ca2c690783dc5d80fa5b815aab0feb3ef4f10c0cb46496aaf6dfd2e5b3a7dd64386ab9a4da0319bd927facaea80ba5f4b1d71e16fcc7550fd8211756c35935507a32f204858e2b475d28eb56c8 Result = F Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d Msg = e896edb0455f372c01d222d40af9298bc17fdbf450b4d0923dd7e12d4095987752cde6ef079614061d83fc805526791e81d21c7adfa52132a5c6a148ddec09c97320caad8dc352ff1ad23c3eae69c3028d867de20610469602187959dc5e6791731701b27eedd860204848d4bdccef800b2364f66cfc26067b53d326e4f39b18 Sig = 6e21208ce42d4ec6512c300f6f9c0d43163eef7e05365448380ce3fec34913a701a5e30455556335101af1ba40ea69fc17b30c4192730336e8af2094d36873cc83617a3feebd2b09dccac1b31b9352c1db3c3dbb7ea1e774578e44c92ea925dafd9de71c46d3f25eb015199150e6e8c26ee612edc3fe2f0ca6acdca9274fcaa87d97e104112b1f85d1c3f3e92f0be7932613afe5a683c0e52f9234fd9ef979844e277e31d3c2b725bbebe97a9a8e619f8308c01a9b3ee48e5dfcca5b153e4890effb297ee0fecd30fd71b6dea0694530fbad6c65abc4621f23263ceaf2cfa21fcd19cb180812667e8b1ae108323ec289826412f124547ddd92024c0ea9784654 Result = F Digest = SHA256 Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d Msg = 3f49b00ac1f9255907cc03f9b45dc787c250d9d6833fb389e2f746e1ede599d390cbb45ea3b7bc1b28365f16cdc573dcb988d9d5843fa8d4877587ed57fa5b878c9423b1c7f21fbaf3e138fbcac39cf89b3ca9a84b2e0c109be82a17a89abf95b80cc4ad3390975df0365653b23e8b02f3d30ff6e0f62864a4b8f506e9ac0c25 Sig = 90ac97a93a9f6c5c6e268e3464b6d547dc29bff8797d9f776e2f56fe1c30fefbb679ca9fafba40f400f08a5163d757e638aee083084581b760ab30071e075f90183db328e1ab519fedca1ed92a1e4e473b538e2470606b5379abd2e4b73f4c132e30c115bc34c73019880571c30fa6c6c1e320c13022317cd3acea8c520f87cf054e84be89a952202fc3f8d0d707cd8806b8b22bf2c0d7bf884688607a05b635210b9a7e2e1d2a28e324c1573d363d5a76ea0aaac70480671caa4969e5177448e62e76270197697fcaab720d811588c8ab540f053c8b23b7cefad205fd4c444bd5e73d80c62451158331face2b6f7ddb034dd5e61bec444f68d0c7e39d2df940 Result = F Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f Msg = 594007ec8417ba706089919c0659195a06e8fe38094ccf18b5a10028d1a43515aa7ebe7cb5dd5da2754950649fb68b717d5546b690b0b71a79f6216c1a930d99f804d723e3ea6dceda5d549d2982ecfcd460f43f38ef504bf0720a93f60798470a7d5dc75865725e556ca52deae8c265d4b012ba4b312214e1bec587ae285c85 Sig = 25c7ab6e2f2365bf872dbf31ccf19239ca06542a9fc8fc47c69d25476db031d7869d3a340e1e0a8933fc36b36c49a4ef34af62e53bde304a4ea28fb14e20b3785a543a05bff10c4572753267179b45e32ca403c1e60a49e15086e160b006cbbedd908854e271e5a72c1695411da6078c6157d1d929d1b9be091c41f30f839de4500162ecb8507ae963c0fee43e6a431b7724fa0286d1f34f67f6e41cd6880aedd38c4261e43223eeadfa7d7c21c4ec3a47d04cd2fe5184180e4fb53091b7968df377fe09f02f9fb9ecf4ad929b373c131628fe07296dff3b8c278f50ea61dbb5c1023dc311e67b45e2986ed4121eeb6a345ba4c32eedfdd76e78a036414b1839 Result = F Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f Msg = fa742374566394a67041b2671ea19204ca568b0c1588f605c008335dcde1eda4e1309ef8ed3555c00da9b79db152439dfad6dbb267cd8063b0195ec2f27a089e0d5d04f94af58abc428d89aafb1deb93531b1acaa293c3d99b7ada727340dea946a45e61b6ccbc04d59531784528114e9dce503c0f0546cd48d3af57985af62e Sig = 01c7c3dbf4d817f4c473b23477df5ce1de19da551dbfbf3bc2d1d5ccc0cc0e92b047bde1f953f7bd0617850f9fc9fb6df97cafb51f123006ebe6271e5ebdd9e5a78d3a537c723fe512dfdefcb424caa8918d3c1949e8f495e01ba3c74be7bcc072f9f9708b08d15380d5829553c586797bd8d6879fa705511e5f8471df0eaaa9fa257fa867bb2bfbdeca0d7e333e4551fe9d7fe0d933397b33ecd261ad3f0f2a387be15b86916b18a3c96a782aedca04b9d04c8fe40d6ad607e20d29190ea97114d42b21a5b852c5c60301525f59345e648e2f6729b5f28ac43db465e3538f279c0759ac5784cc0ff8e5c6d667465af27257718029c94ce06665562108a8ef93 Result = P Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f Msg = 27291335228e1da94acb8a3b47f7e1e581e7763a88ffeae4b248f55006c363a858fd5d02b6e4ead703d9b6b6e2061139d6f23a39a752de3e0723dc3975f54b76628abecc929fc617c60ab9e89805b27aa6cad9e8f260e59e89b4df0d63eb28a48bf7bdfb7f68ba51da851d38309ccd8f3a96dbb133ce07ec81248635984d0219 Sig = 017fd9586eab20cfa751dfc278b426ddf05fc29d0c51d1de59f1adc1aacef5c31abd2c5491994f5884f7b6e939c238ba61a25c647eb881d34cd21e99fa44f778db68268b46dc6e7f06dc36f28d9d96706e8e3c02bb2d6a7bf11c8fba3b7477697ed5f43ebf109c3f6a70ac2af0510d91ed7312c131fabe48df9ef578965982649a3aedee8e103845d2ca72f5ea5f33f5f72a191e280f732cfc4d2cbd32981f385518da19755bae7c90d398c15e75492391c4bc06e61ac883ce397ff2a464bba432c3baaf65a053446d6d2b98f15243c00f2b248fcbc3ca46fc732f7c1297ed346a80b93758ab55bf32f8bfea9eb791c26b642ae085321831c0f1df200adf3afa Result = F Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f Msg = 7a55bdcc36e6ff6c685ac6e7c3250a6c881aa37c05dcf6fc5c95d38985ea9e0b962ead8d42d5f24ca02cda0d2e4874b4163cd613b090bd0047ee73aa201df62db83456634e075ffda1e678d3fb87cb796e40a6135e79216a4062023fa0e1dddf69cf80f761638eaaf3ee69e131c955e2198cdb2517816c62cc5947ef0e1d9d49 Sig = 54807d1b14852038dc94c53e2bb8bea76f074fe33897ded6222b52f1ff0c9144ebcb38d83b70f6b2d59600ef9ad089d4e3ad1ed35cda4fb54213b3e4b7b29d5f18725a03e9a9318bb56d96d9538013b110e7d810980aec6a451b52330e7d7f8fe02bb29519ea98053cbcdaa8d3657c0de6a4d268dabb6536d050de9526a03b242ca9f30e7889088645fdb0e46ac09f8a7bd79914ed5873fcd66137f93e19a5e1c372869113adfffc2186c70f87eea2f91b83235ab3113439b5cf1b0fdca9d4db02af34ab48decab4b4b0db27c6fd36f8dad5fae9f395417b3049f8c995318a2e09768869f23a349072fb7c885efb32cd3aee0b35469fd8516ae252e45df0ea25 Result = F Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400b9bc79 Msg = 9570e4ae5307f347703324da8bad990a8659faf8d17acf13ec232d3227ee95e0adef19f6c0ebc07046c62c79853b7ac82bd06a2f9108c07140daea55b562e2f861d75667f4bd076ddb5b6faa0770a6e5f12286a4db370ef95887049e0eb1de44bb0ee32976e38ee938db33969ab4e40ae038967c376f80523b13c436bc44516c Sig = c442aefba90877c319e5b8b2a87b50778bda701fa2bf5af4724d3eb7f894daea3fd719cbf0fa88ace828a1c7ff1701077efca06b8717fc2953f055d69bf8cac6f5b352da3ea459282903d42e886642c5ecf49dc5c8579f22d88c951a562a335b615df1bffed752abaad6a60612b186a4e971ec2eb8c33d3595a47e8fc871412b8b8f5f2fd262306499dd81f373e29144776c04393a2d433e9e3dd221678b2e62e7f7df1d40238c2c10c6f923c83b055e2a14ede1ec3ec1c48ec95faf0d61831e8539dfa62a3723e57d12bda7f75c2a7bf77d8a4a96ad2ba9a01d615b6ef05bdaa85d4e1e4804e316f4d32b8f1c3532366872497f139bea71a4f86ce00edab93e Result = F Digest = SHA384 Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f Msg = 33bdcbfd07f82ceb4a4b208a3d3c24316f745360ec1f374ab092df90613031503d8e825e51d564d1eb68bfc253c72450b6b45de7639449c33a17e7af601bb01338ce2a2d8f13ba9f1728b92a1785cbb960076ca1834dcc274163dd43439daaa30cc6eaf32b7ad55cb5d1364af23ec27357b6a815b414697eafbcead2717ec809 Sig = 2077c18cf72a6a6366fa6632a286e116ae694008cfc3f13b1cbc005fee635a317abea470fdc28fbbe9cefa2f9ed3796488d00a8ef419bae16ac54f5c7c5332f2221b4e753599e20d778d714dc065106d0f023276afbf012c5cfb97ec3a364d27392d2a530acde5b6631b6fe40fb825bf31c7e7dce52e1f9a22fff93f8a5f2a34dfb03fda309c580ba5cd174886ca1af32b24f4733093a4f360c696107943e88e0e9896f78011800e6cda15c94154db4167d4a508e331c08d0127446de659cf2d519f0451a50c38e14572afcaba1e8f0ac218ad250c32cb370b5390e7bb010b6ec10d81c05e86f99c63139bb7190f605fa9ca8c8decacbcfc4d3c6e61d1895c0a Result = F Digest = SHA512 Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 Msg = 142565e97e8f5f95ec31fa8325beec222b3eedd82062bef364146ae2fe53cca53d3e51829e6e00faf189b7fbb814b757d089627553aa4447bc14517b4c176df6adc5327ed649edb62e7be950f4b1f17eded710a900c29b66f0c171a62875822cabe38e45ecc82fb3eb2c1aeaa13aa27f9e4f7eddf151cb3a484255c958151231 Sig = ec232493d315f0c4ad232653ec9de464c33f956af3718c5b9f1266e7402c61c5ee9c177f14f8dcadd1d074e8f4087516b77b2477e4fdaaf48fd138e89903ff04e11cd0fb07d832ba545025b921496443b52978e215239474a031c44bf96ecb4aef393fbe0fb52e819cae819af3ab41c48b80afc60aaf41eefcf36cd00c2aea08dd09e5aee0056ed1b7f15ba237daae1cf4fd944dd09596e5dc0f029bf83b52017018c046e0cb58e3f24593117a624064d5c9afaf9df69bf92c816b72e625bfa5e9cd96e963c62b0cf82eecdc1852c1c02147030fe540dc270e454b4106f8116cbed3231630c7c1345be5f8847f8627fa082675c680a98ff109649fc4399d40aa Result = F Digest = SHA512 Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 Msg = 53b72306191a180e86830fd37a1f13847739cf6ab30149ca6b8ccd0d791d261e29a315144982fb117f96d969e0757a07bdf5ef0dc0ef3cbb38425192b21a3cb9c9729c9f3fd759e24c6f9270353bd7ec21999953290ddedfae40392bef49fa99da2ca2f123a09a4a9416242ea4f691f94a2cb58213e398fd73906e205833c9 Sig = 6f17ef5b663a05ad79a4fd77515845d7dcf6fe5eb928f4e6567d7d615277ad7963595baf26971c1ee8db870c9e830d5be09732b8911476b09c1493aa1ce8faa2b527349ebfc882eb93acca56f5c0f5682c784c4094ef86aca1bf36acc97b7a9a96aa349c5f8d2034b92b8a8725be2091f7adaf8c3a1ff14a1e900a35bc6f2eee130595411a3c94aff5d7a0f9f9f5a8df9bbd5b28676ebc587c1f1e26000cc8b789e8c6974cbd49d58c139fa5847a924f14074d340b7bd4f325773f09d82a0da54da2d7df251951c5950762c9a3a0d2db10693f4aeeb97780367698aca99a42fa47b5f185e4c607cb0dda51aa2d93611e2f5bca343baef36dd6b0bac18cfa6b73 Result = F Digest = SHA512 Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 Msg = b286242ed447af64ee029c7f33b5428d440503773f30748ff843be68868d45ea025387a58bc546668d31e9084377208d7bbdc76e9a630d2edf39d535ecf05cdc82cf1cc58ca7f16d5f097b0440b6c37c265721e0c26f5de7bd8d14c941c65d51ba62ad33ded6f8a1ebf319192f5c7481ce3dda75c03aade019a644c98df69070 Sig = dfc19a45dd3b67cfa9a47615cb7f5365f28b85d5c11ca965846326849a2002e64b8f0e377be83641ca5e795f190aa609bc03f94bae4ea25e681959ac85e0ba28f6d298244c8c6f5c18edd868005c375221729dc434ebeb21e5063fcb281761d2b626276dd14b6e70ab53c3909e8df9f70f8a93a1485ab9794e7ce5c424a530329bde2834b8363e1f857dd9ff8908f4108c305ef2c303018392324fc600617d5ca4d041eea9a77f116ae29766ceb75a1c5f4931674044c5e48c7b214a2bb6f1da81ccd43ca056776da7b1c0702a9f39ba1cbd861251ea25620eee495e6a8cb00bb0a0963b609086ffe552bc8badaa9aa6a06a9710fd96f6047b8b1660a7680b34 Result = F Digest = SHA512 Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 Msg = a5374f49877cfd0734fe20ebe12c360d950416748ae3788ad69cb7cc4ac8d6c69b5ec23fbf84d6b19aa4a4fcdac1f35a200c049660b21a798af938866a8b2de7cd11cea6e5048320eec005b712db65c88ab451dd074f93235060da1e2ca5bd9b8279fde6bfa70a3e787cc9865120953d1d2684b04661eb6e6ff924fd59bf8ecb Sig = 2e985464b882f7c6672154a107154add844b4be163ceb8053be6b6fd632cfbc86d934e5aea7d11878b4df6e24fb0dce099c5b52bfec0897dc57fb03465adc2067a779d011e64ceadfb1e0a7051c5d248094ec8cc239d80c6e70591d617e54f503158f2b22b93eeebe017897fcc8f44703c815f07a476bda567dafe122bc07363818c83eddb6f777bb9e84f11549f3cbc283b78b3f2277c7a54072c13032a416c6470395472303c84adc17dc6128cd82c6ccd907ccb93adb0990289bc5b2eaf948c2f421ad0caf2655cd5839c86aa854370550ce033bc05b7638b8edf67bb5ea997bd904df293b89a0d16535134b66a6fd5551aec3dc09f29fdecbfc6f474de6b Result = P Digest = SHA512 Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 Msg = dbed25e65429b89264ff6928e6ea9424b862a2df1daf870660fe8f4bbbb55b5a7604260f53bc4ee62a650fb3d18b91933e582522f068cbee8bd8f92cc2a097aa79234e052b05021c8a3d9dc4666b0fbed06b93e67f2a33ac73b88ec8d79fd92a2c742430a4abde1cccaf9cc56e33168db6c27292939ec62960c7d888c45a28c2 Sig = d5c50cfbf215c17489ba4d29b5e2f84a4ea244ef0dcec72c3a077e12d74d586574aa9683cdd0546c3581a723ca048415c6252894e40d3bd803138f78c7c493fc679aa1104e2844bf51618c3571789175828cf7d59addabeb8fa2745d08a247d5937600f8bc0dfe2e1ea7abd257b3e1c207a3be3e2fef8344979c4e0dbbbbfcaa908e1c9c6da303e510f0bb455f4b91dc7fee576e358fd5b2aa8f1e6440bc229c004c31e6e61123aef01a0d382852689ac04424007f55b6fa6aa298b9a93b3eceb6e585f69a5714231e60e1db27b2cf94f7ca5f6fc4118c0604ee716f41736c7efa6c43a3af42b27b585cb9c6356be864e0514e2bae881f4ad5ddb9aad592d7ab Result = F Digest = SHA512 Key = 3082010b0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0204008f3795 Msg = 562eea18d9654547cb566556964ead28616c18e0920dd7f691883c8bcf1cd6f90826deafc597d13c24a65fa9dbc2840c7bcbf55af281bd7d543d28a6dbdfe0e52c0756f7db88635f321930b82e4e5349cbc73ada81a8cdc60f484f52772e853d4a391b98251e43d87c189f2a96da6106d9c9b10748684ffa4a137935adf10f2a Sig = 4df68855dfccab1e7a94430bebb9c631770e7bd75538a9017e2df5b35117db59f8c9f620c1fe41bbc5bc65155355a83c1c1da767bf7e6c40ed61464a53009d7d8d1ee31e7e82c4b97c520d74a60e0de0597b977d07ee95fbbd4e5486d7ad61ebe302de0cd634be178a04c8b9498c89b7ee1c674a074e70ae0f93e7e5dda89c165808a8ab55337a048ddb7eff91a8b5309ed9941ecdf3ddc3b1e235f7cf139b681b97cfbc584d9c0359b26a8011dccd7d5ff0475d52959d35e30ad66735bfdd06e63749dd775e65d9407375ee9f5f9e73bf77b75fe0a5923fa7fcafac08e10f0563dfedc2aa2abfaff6f73ba293497eb0159cefd63c974553a24cf0602353fd4b Result = F Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 Msg = 014bd8a7ccd4c3924208a8a6021bb7df5f238021062ab5e1e18131223c583aa4278c03581bc07516e0af2f92adc0cc8d92dc6448137c553e16064312ff595dc719a6e22f3883e4a69c3a4d0019671fbf75c200891239f5dacc426ef7256f8323a0427d146a4498a83f5107d58c3639ded17e5bcd4a881e1dceddbab7f7c13320 Sig = 400994dcf90a8391d448059aa51ef3ef10ac64df165d5b6b22fb745bbfec307bfed443dd912414bde19bddff653f6460d6c2e1be6db883132981bc05d66827540a0f5fdb883645511173dc3b3c900daf1c0c2da808ef4a86061777f0c6f3ef738813f3cbce89cc8daddf6d178d1a45c83da92b3cc0cb68be6de5f5d56e5aad6db077f23979648253a8b1758e6478605646981882445f46738c955c900d74c60771528b91a83c69ced1ec3159be138b7d3872aef5ffd2f58c02b50bebb5dc3164bfdab96e6f325f9d4293a6b41d3f9f53535681454051778b98655849174748b1ef1a3841532b5aacc6a4b68a0cf994993643549ca0df2eba94718b11b73d6c9c Result = F Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 Msg = 26dfc6c8d3f37c12edf9b1e176ba99ea602fd989a3453eaa8eddafe95a1760f805d049415e69d7cd5ccae165b3a7ddf7a902543b26f293950ba2a43ec59c7c9f224876fd63af005b9285949c1667ebe984616d52b8b3ebb825d590ea69b8150e244f35430b4e61843832b4cfc481298798530c188011aed9827d5d366df2930e Sig = 8b9416808240350eab81f1468367cdb6c2b770b7dd9d88fcca8786db9407179b9401c5f074bf9d7a85c5fe26859e8e3bfd26502175bd1a759d1a6bd79149c043b25d9fa70d80f163696ca4153a3df857c63e709f0c00bfcd47e66467110dc6aa8da6411586101eaf99068585962ff994e8e51b30319561648994f2533bbd8b8adc2dff2126cd753ed8b8abc5913c0cf984e78128e2c18fc1f9d8017c60d2c4dd642633dfd412cc00a0c32569b25e328f242d691d75cd2ae22f8359426548b04e36f15bfb9fd561b1e3f3196296823a3828bb791f19bcb75e172f7c06e30cb2e9576bc83a7b59c67b821fc8c1d4d9775ef0f2b33a44c19d3aad04abfa17b8ac71 Result = P Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 Msg = 59e84c0d700305007789dd765f33fc014241ef0fa4b406befcbdfaf27175d3a4e1ce097d27caeaa39eeb3bd3e1ea22b0d5ac445aea712a439d4fe93e42df02d9003687ed1d167f737b668c9963e0cb16820afcba3167e349faeeed8957bb179abc050c86d8508d1919e316f36e7dbfdb5044605603fef878198350fb3972db8e Sig = 39daab754cc68ccadaf33a057d76aacccc30ad5341dfad503b33f29243e57636a68453323d81cede8ba0959bb980905f4a464ac21880842cf26eb8e8801c105ebda3a866d0d3e8597d234a21c46adb5dff49174df3c36f7c3deb693362418520af227195d609a548836378f4885af1ef95d2d9373c53ed811884cc534b7d88449281b2155938553205d5b51e39439904757a50d6c877d686b32906dd50049a620c3c3489c9007633a04882ef0186af29c71518ae8ed96f307d68eb33ce40793de205caea711cf9bea7fee8b751cd764f4e4e616c50be2456a868803969d692ff8b8b15a4f0d4ead24f610e231d5012a31247b46a582f1d3fea404a5d29691f7e Result = F Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 Msg = 73e48a5d845d55944fe63aa61db36d80724b2809ecdeaa106dd880827db603e1e91822f1b01861b520db22993d6523f162b249a22b029c1f9174929857d6906ea6bcaee9f4cfbb2d2a68816a055e4954bc1ca2d3e4f65ffb91bddf3ebf9091e0f0f6b6ac162a69e6b2b6dd803e43e790c9b0bc02e161fb8ab5daeedd7b8c0d21 Sig = 5f566d4ad20bec081e05f610df9b972a69afbb71e2a345f3b4fe8b5e2243cdc6a68044e46996ee9bbdd90e6bc7354238566fd7535e6ef04b7d0ea8eb3cb287b23e2492f1f16c799150bfef616467f1ae535667fe76ad5f6ec16aa0f0491c3ee7afebc6da5d6e4ebcc0194e90fd0bc944b0279c9973e269a7452b87a1a317c3d8131804ba4ab2b7a48a8241fa20506d9dd4d1ad74051d28c32c0e1c7bc4099e25c6056a359132c3f0d8d1f2725fffaec815eb91d9bb902aa8d024b797da8035c024539514ff3346067bd583aae8fe5f2a54be488f053407827445a27faaf635e97a7888246d817e7b291d9ae5939e0ebd0cd4a6cefcdf4bc5a637e294a368ab29 Result = F Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d020360e097 Msg = da4c0bf959ae81004fed9e58752e03f486906288f30fd891d7a77e952dbc3bac41b9dc3f64f86610e4e2aa7a3b571bfb8750ddef3ac21e9e13c6a9794df8b8a1161c0aa94208369d41be3f434ed868a0ea294abe89a123ad8b7171c86d70c03941bdc0c05ba69ab04ec9843a177994ed9764d17e477290c527f0fe09f7edf97d Sig = 8b31638425af6493fdf969789f33b2f44bb0d84923347cf03cdc72ad9f139fad79096d100e567caa8099ae15c2ff5c74a3ddb8b40f5fa5a23da10b6b39d985d2d2219d129a39587983660fc9d51f43b1cefc1ae1a102c6d9634b4748d3a2688197fd445a635bfe40dba7da006e7016b9f1a77c2be92f1f50181c025b22224785d4c9c7062429506ba2a1b18bd719ef72892029df3098e707bf1858f81dee73827f9e1d1f9fb1055d969ed45a513f39870250c2b8a507605468d75f0d3ddf1dd1ac3a8bd245101dcf1eae32822dd208b0dea4ef5722d22518de07712192178f57c523175fe4ba17fdaf7e604efc6ad5e2215e1f327abe9ec2004bf7b70505e492 Result = F Digest = SHA1 Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 Msg = f0d6d7e7eedfec55dbb2e7506ebad1c99ba7ed0a5b1f9b01afb07cdce20ad7d70f6b3b52e45a6627a598663a7454fe52cf9e4b275a1ea7bcdf06ceee9345404d9bfee62cce38f7f4bdd71dbef0cbd4207387134692b42f45e027fcad7e11355d99761e9c35e16765295554016b861bdc8e498e91894af947bafd4e402bd77faf Sig = c6141f88f387f4250ea16d2bc2b438fdfdaf3f3eff539a4f0573d249502d08c4a57333c511dac0b1d0e85cc3ff3bcd9ede0bddab2e4141157e41003dec0dd494cce39e4e9e4d77e89ab266e74579382fe4c829a090ffe40ae17b53da2653876112acb2b1575613570f4ccb219ae51ddd950078c0554cdb7394906c54ca960fc56bedacf7d62e25b72d5e727d18b9cd378f8131b9de088216929f42420404d75b4e960a257927f82ff353217042b61a45ecb45457a581dd82c57a76f7160273de2be85b594db977a29e92813f74feb1678e35a339c42dc66eaec11c8531869ee64c8f6fdd4bc2d918ac29e8995a35f06edc7fb1ec494a86b04dccadd448620ad2 Result = F Digest = SHA256 Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 Msg = fc8e19e3b26bbf7c8c33a452b7ee02cbcf56fa94a58b7cee3e0866481fd6f013c7ff47d27e4678704d1590d74eb701be26c748c2cfe9cdb99bb80b4375fff0a16a2b87cb6900d4bc478c00110659b6d257e7cc905d5926b0b46fd706b2b48aa6edf921f6fd019b08837e3b276a3ce6b06c9dce24d8454d7a931613ba5d5f84c7 Sig = 058bcfa4b10ac6a73918a07b9f0a8db1ebab9a0ee5c7f0a2261b98efb3592eeb6bf45fceae24ff20c2683e1b33291f49a7f86d7fe239c58a45910a14748e10c25a4dfa693e5a77138de2fe5f61de0a09078cd0d3c61b1e740bca7a3d4048d4fa12fe69412438efa18216819be40733500acd8087f429da734fce6a97fcdc9c32991dc847e4d653260890304f378a10b7754cb4ac5efd7a3db23bd44b6542b81ae9fc33edca6eb1570b1a39a0b8976626c3892afc42e6fbfa8bfbc191c3d026a6248e7ee391f977ea5f0442306ce87702ced7b3f00bf0a6040604d0a663859737ec6c04dc84763d1cb63c4da8381a08cc52b370ba09515b93d9a6d3e47c5929aa Result = F Digest = SHA256 Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 Msg = 4c587ab2ddd6b13bf7a916b5d571d7613f24258201b1421b9de4dcfb3d8a99f7ebd5f37704024634ea38273ffab4f846be23b913634f21556dfeeea3a91779be63078d16da637990f1cf6487271ee111c9bbc483674733378483008c9171362f1db6f199464373d97334759445f8bb4acab3ebdaf4e09f494a3bb9bfdedef7d2 Sig = 052bc5efecb052b92821c405e6f22cf374dd1ce4bf691eb8abcc1cd01254a6e51fe9237cfb9cadfe32a8780135949399b048d26f5de49bb9d008d39b749527eadd13066baff87765eb255021517a2ea69e45bd35db1fba9219c94f944b2c9a33a37779505c8eae52d6061988d152f9f51f0002e545973402294dda7f7c7cc3135c37ced8cf723d4011d1ac16bc1d0bd670eb7f63f079f30dad8cf55c326a33bc1684ff17a91509f4ead4f93c3c0eb6679eab612e05fc71b936c99ca8579cdeb9f26200a4bce89e330fd5d84b1ec98cc1d758243001fb18bc325b630a58154c2d38a5a8ac2ae6cfa54a20f7580a745c206990c142e8a580eb36266a3a9602a8bf Result = F Digest = SHA256 Key = 3082010b0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb020400b53999 Msg = 425994d102a63f542766b12d5207ace27de9207630c2fdeaf741450413f1654f7061c563d7829e6665500cd33cb4647a78a9c7c9659ff749ef1c6a6b59a99d8532ecab1885121e54517005de386947d07b923602261467888852c27be6ccd5fd71436d77741f6825d20dc5d5b0ecfdeb6fea96a9ddeaf5adac2a74bb2322b4bd Sig = c1f91aa430083ad84ca80ffae2d1ac2bee9b22bd0947175ffd03bd294f6a3cbb5ac63afdacf02f7a6a274fbc33f8aa25cb08174c9c4aad0cb9cbaf02e6f72a8deb6ac52ba88da773b4fd07b33144b9a28a23a1db150cb095cf03b208e80dda3263806b6b0e8eeeedd624d4eb8028e6b98ef2a3e55f38f1b0041425cf7557c41d35d4b0383448c800076eea2c22ca2f333496bdf53564f39d76822f55cb767cc1c2d516a22b4c6fc1525608ba61eb42c04c788c7050a48b7f3a431b2553dbb52cc065a9869c49cc021d7e448dc7012842d3351f98820bccd4fb7640b85fb431fbccbfd4e2544b6f3c7c270326c8cbbd216333ac82260c5edb47a301acd05c7c7f Result = F Digest = SHA256 Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 Msg = bf082fa4b79f32849e8fae692696fc978ccb648c6e278d9bde4338d7b4632e3228b477e6a0d2cd14c68d51abdeed7c8c577457ec9fa2eff93cbf03c019d4014e1dfb311502d82f9265689e2d19f91b61c17a701c9ef50a69a55aae4cd57e67edc763c3f987ba3e46a2a6ffb680c3c25df46716e61228c832419e9f43916a4959 Sig = 621120a71ff2a182dd2997beb2480f54be516b79a4c202d1d6f59270f8e4d4dbd625ac52fe0e49c5fd69dc0d15fb19ec58c9312a8161a61cb878abcb11399937f28ff0803877c239ce0b7c4cbc1e23eca22746b071b2716475424c12944660b929b6240aebe847fcb94f63d212f3aa538515dc061e9810fdb0adeb374d0f69d24fd52c94e42668a48fc0a57819952a40efb732cfa08b3d2b371780aea97be34efb5239994d7ee7c6ab9134b76711e76813ad5f5c3a5c95399e907650534dbfafec900c21be1308ddff6eda525f35e4fb3d275de46250ea1e4b96b60bd125b85f6c52b5419a725cd69b10cefd0901abe7f9e15940594cf811e34c60f38768244c Result = P Digest = SHA256 Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 Msg = bb40a410b0183b32df12f739506643bdd2fa7e6aed83974918ecda402cfb09dd1932af4fd7f3b1b5a0e8269c5da268c25e806b204dd34e28653f304cdf6545bfadbe297f6bca7493936b8e91f08bc56455059c4c8ec36626972414ee0ca04c82e1aebba953e5ab531e62d823f16b7f2a1f51b9f6979b07cb16602e309bf545ad Sig = 3f6909f674d4c9c2c26b66d8ee3d7702c560b193a8fbfd0ddb3a9dc909a6eb7aa74d446b7993cdd5b7e272d826281e4cfa08000d2291c2ebe3ee6a77a4e03a79248385359d0885c61c8ade8cf4de7c8e51e879cc1e6089a91a56dc58d2b239e185e9afebf733e2f0fd061270eee0670122c44fd17af6860b6f59690a1b2a91e16522e6a75903bf4e6c97237825f0b01e4c236052b173a8d91f910b0c903590e16d7104609ff9c0194ffe0c09dac1969ea08b01497c8169c7357e8b1f1040604dc0f8b967bfd075284736aa22b0822d3cd13c48a8169413e0b6b26af56c577c829b38e3fb5c4ff78949634d14ff3a40d0d43584d832d6b51d4065e0900ef197a5 Result = F Digest = SHA256 Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 Msg = 56db10c78e9fab7c1c356bf8b38e4adcc464ebd1a3cedabfe812144016baca547aea625656f0bf2e3f1dc2c9c4d310c650e01672520a4bf79aebb5d00600af805ffce9847e62b086b35270d367a3770fff33fb28047b5f888167b28fad647940cabaae3a4d1c08ea3f7d7d00e326061f9906a2d902499dda652c1263520faffb Sig = 8432cca3357f5ee765bd37dbe2b2d107dfd840f8f720cf4a80144740f96e47529c553fd503a25bfac61ad76a24386af72d81522e6f05b66299f6aea3b98b23838e7dde04db8f8b0f32ae393f6bc0bd7070e566ba1fea53ca871d680f70cc9585aeece672d7c64c228c49bf1ce877dae73f9d8756433f5edc4331415d51957d23e490d4f25317d09a3ad06ec9229dd706cf593915cb156d7f7a32d68e52ca27aea7087d4fd1e194b6029246694742dc70c5136a26cf41b3abf9cf9cb65cd2e37ade6b9fe5ef6160279871230f35758f02c3b37789c1d74df0dc0f97f28bd789755982dd249c0960e64739b3c74b9c55ab810650529e7243bdafda7edef76fc748 Result = F Digest = SHA384 Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 Msg = 2d891e111a8812a6448bc2ac2c234a616997a8579335c36d5fe6acfe0b052358fd715d70a7e104d4ad7880e04a9a7535f0fd8c672e0377f6d7472f80617580348b60c88a424efc31c696eb49096ec7d358fee1663cb9b423a3ec25eb3b9709cf1f7de8c7b57700a7d60d8d5030474823e9c12ebc85fe82dc0afe15a66213c50f Sig = 7dce8f644be457f76b46f3537cd3c1965832e89ffa636f7bca10a2505db17e9babb7c3e5628fc5323d505efade76ed8a9b702b84c22be49c70b8c3e54b4a1f6daf66c2425ebc03fc6ccb600dbf916048e395aed1a5676db004d917c4021f786cfd0ac332e3e0434907848229af099ee468d6324d54f5b2fd051c7449f55460bf519eb9c076852b017220500168e18cd0358cb2c409acf692b4bfe1c75c4d319a45d465f920fb3f92b5c7025c21479c3e9c85bad8a323ca1fa0f112f448aba0bdfe602734f149f619479b39ae5217a01139c271007748fe5a089294a8c3c3507428c6a11d9ea84ed7c7b35a90d07ac3eee713189d47d4681316de68683c1fc94f Result = F Digest = SHA384 Key = 3082010b0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c15965930204009885f3 Msg = 8e8fa198e16acb264e1d0d9895af5ade743d7586d554bf39469e4e89a9c13eea2d844cfd7d34a0153746ebf49f3db2d595ceeab0c442c4b91d1dca2984fd2b42c8c4538dd9f9bf67356c10bba4195e11254fcec82812679ffdbd217b8dec3f644898dfd05e84d02432d8a3780c0c059a0d084c56698a4ff5d0c77b042d552357 Sig = 421b51d49f5d95922894f0e44dfa5928f1589c632e2c0051b1e085c174e928d98f035b958564b92daf21408e130815c00b35b32578d320b4e604c77088dfa321fd69f6dbffb2bbcfd53d6d8023d9862598ef38f05f0d44dbe72d108aabcae0076d4dd48e4c38115ee7fccfbeca3fdb69ca26f233284d866aba242c932936a0e1f6d01b668204f7cb534164dac3183e08857b4f150ba6a4a38eb98c4ae2aa983c0c5971e62e687cc63fb9eff8148bf01d14011322cbe85a2bba650200ec39f8e3327196d3587e1f167cfaca4abe538f9f420b3ec5ac95c462ea32a700da870756f7fd759befbfed269956abf4d22d0378096bbef743b0feb15b30e2954cdf3ed2 Result = F Digest = SHA384 Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 Msg = 92547ecfdc67a3887d5f686c77bf982d84ef4a951131051d8ad628bcd7b289fd27cd5d54ec5b58b226ef1557e5ebb7e8093bd1c14d43838c8415e61222e8aa52fdc6fed05584b03012f796034e652ce1133a7eb866fc496384815d7f6b60457a9ca52aec20c9f52bc9e1b41aba153f4129541b2364469ecb128254a9bc02a29c Sig = a4c509864fb912cccf022eff3b7e2f4b568fb08aafc498cdacc1fbfa3c7c276645a7d2d838ed703e2dadc205c77e38e0e326a84c3a9dd3a1d6c5aba50c23e6923378ae1e3edd125751ccdc38d80b91569c20dc517ff1963be1d6cc35d2728bd3cdd0d23d341ba91b58ca868d90490a6a5a88bed3a789d46907b9acb725f187843b57d22b17b3966971deb99030eb72efeb4704a91683ab488160a5b43de32319fcf609cf00485f2a9a5a3a8eef1ff1b9cc646b8645d958bd002bb152327e92f6beb9f4c3c193f4f35de29c6e7a8739761018430e5144dbeb895857bf5a313570f1e94e9ab2522c6c046f0a8190a995bb49be4cb7a3794f89e1a4c8ab295f70c1 Result = F Digest = SHA384 Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 Msg = 1a852bf321f978536e0c9638414beb424afbbc711ab742e7d85b01ef3521553fa10a4e7ac080bdf917398fcb0c5e5afa0ded36100f5cceda3a7fb76ce2ab0065ba1c0a754494991c8c452cb416f18ab115509e28ddb2848e9be5e4c344597f4ecb8207eb977e344334f814fa494ca3eecaeb9bbe6e028d8a645631fa4272fb82 Sig = ed0c530de2798f47c15dfedde11d93fa134b243aa2d7ce2bba3718fb1a228f1ec7f6908f56f57166fc2f37c86c22b097f2324bbdccff72f6ff7650fbec45b0211a43ba885a6aa807470a93b08828e04300df4916640e4d8671f22d57ce20f1f0bc89b2f01b55e4aa5426ece11bcd05aabbb3d7434536cfa5256de9b99849e01ca9ffbeb770cc00aba63515aeaf92dac5e03a29f9f2746c2274d60f04d4353d76a174a17c25255a4dbddf8ff11987e2867da69049981e8ab9c1a200788308bda37c4fad9ddf5ea9b62ba42505bf3ae3ca5ab3d36ec5d67d993817caa1b0a7a225f0b3b42aa5734d7232d2d9e3c0b4cad51b26bd5dd2cefc22fa09ca060ff16801 Result = F Digest = SHA384 Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 Msg = 3511607cfd2eea7780877d2c585d1d2043881cebc97ee0ec20b1e73b4c1e07df8a22fb41ef901be14d026b48566cd73e04f7bd3c380cac24a1ae6c30df0e3e28e85964d9abd5e4c2f42c8a1090082ccdb1df3154941154086030a645529ed297175ea52a7924ce823eaee26c4d57a33513ea811925b461fe27dd9e63ecf84d93 Sig = e91b444f45a604eb9203d83adc877a36894c5fd6d75c521caeee6a8e57904698a887d0c54398bbf82da4c3aaab349bfc706497d991bdb86b9bcebc4c87df1b901b47ba95fdd0b8ff4b5dc5bd3300d36ec48e895208e41d569b2545fc7f3776797de5a21dd228da7ec09ea154c987812b12cb4c349e6029e61b9e5c1d3038994445f9d4b5151246a6b7012576cf2aa23afc2e259255663cc1977ac1fe8daed2b2b5d1ac1d0b1a7b6e32e50be4d4c3b3d818d7b650f85726f9d4b505e5491468d7f286bebb4d97fd4dc0854e0f18c0cd0455fd54d57968aad620a670e0f4aebca070247563d69044c3ddabcc735177e91c99953e00b81de45d01eb3dacc09c1083 Result = P Digest = SHA384 Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 Msg = fe627041cc6368abdc8e193d731ea6235fbede7c969b050b1abcd72f1f96ca1570db942c0f94edd91b6f966df75a9a54a950d48e8073b164fa5c3753e4af464dc3f21e21739f22370e77dc80101a40adb8d5359fb1bb511ff1f7e4d0e2603961bf4e180741ac8f2b7c4ff3600386219753f309966f996ea6c735e78c5ed22abb Sig = 3711a7daa81e0a5b897d3d371ab282b660307168c968cc3a1e4e947b32ff2f0d5d766535450b5c227f7a054b7f5110df9fdb6a8b8cdea54185d6ac90c9ad5afbb922d6ace388d121ce977ca4d778b83299a85a74cebd71234c04a1c2afefc034e9905023774b280a063a99a9c8d70cad6ba0b0cb943a2887caccfb3c0b436748a9880052a16f35c467e78243c0d175dcd92875f3f421313f69d040e8222c6ced1ff5ae12e352e8f45c759bec21a1a645c64611ec0dc94b69bc9fd52f287e828eeeec41f17afe3b62e7436d2940479a936bc5d82ff212967484550f1f552f301fe1f189088135de6af7f8e3a49ec5db80fd450bb2d9d52a95cc9607cc3cd1ce15 Result = F Digest = SHA512 Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b Msg = 7120a0657a833d7f9723b647eb6867f5d9f6f1fb1a77e8eb0c9acc954d5b3b6f8986643b9076bfe3ac23fca8315c397b555077ab42534fc16adfe1a91bd90e125316e716d51e641e7c305a00d086a76bd7d9af852e280dd257b682585552310176da0f40710295f7b052b899ef6e1a8c069a82d1037d8ae67c2597eb244c0e05 Sig = 385f2fe2bb8e9483bbc05c316283ad01f8aea41bd83ad941fec99bad0f066fb1c7dc960d536d4ed5302958a0df7b943836878a1c906b3f3f778e7335407676c7766183ef61624c32da8e79640ad5390660a46610b2b172dfb7fdf48e556408e0da06ddeab4468a00abf93d6e3fd71c04478b49f394e849f1923d4a57b76f6407675fe647f7bcc59f7493128e62c0cbf999dd4b3c62cbba2accfbf77351abf76927b89cb6f57d900d631d2445231f75b7d2c3ef303a51b38f9e7f0d69a68ab397674628a825ae74605f32deab2a0ec2fde1fe820b48d824b68acef3f0bdbd7804eb15899029bc9d349951d732eceeb3c42ed02ab35d112841f8e411b28435ddbb Result = P Digest = SHA512 Key = 3082010b0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020400fd8739 Msg = 77449a132998a90b149b91bd05fb1e53c85e28d7923e16a69cf7a122111edba82a156fc297dc2a9d222ababd8fbdb6efc6eedf7f3488a6ac6edaee59170b120505ae2afd9f968ad089ec8c04847e90078f5a4068529c1947bd84270bedcc0f534f38532e076ed28e93088efaabe8b2846ccbd4fbb6217761d31dd49f5908da78 Sig = 240add12876bc54e013030c890f3abf774a109f687effbbb6a03d0b828e8e1ada27e424db835c78dc0d6905b212fbfd55885417d571e7da1cb1566a1cb713cb04a334eaa68545cb17cfe55c037230a5a71e941fe51517530392ed35b844ab7e891e9230d67250c7fe73a9d969523815dcbdae4c01322648cb0c686aebba24c4e57cc4859fd0e38a23dd43f86373d7c3250bd03d8400887926df0f98169c132f819180b9fc482ec77304b8af96a5334401912e6d210361218267c21f2c65d3a83c376516b869466278841e267d73237789b33e5a7ac3f1feb2a1a3e9bae60523ed5f814124805f11c151357fbb8a717fb8c858c66e647ddcb59c20c2bb8e86abc Result = F Digest = SHA512 Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b Msg = f99ed2fc9e07ccafe0704660b1906e93542e3c7220d8551c81d8303f3f6477e90315b09b179b1ca06daedf9ce3476268c511f61d931aba6f05cfbe3d4d2768659c1e17dde7650700eb5875256f300376c97a5d00a3c81d06ffa6ec9b79cfea70cca151ea98cf557763564e23ddb218666851ba40d7484788764502824bc4c5af Sig = 268ffe2eef8407c215d1e0d02d3b23d387900877d4b6ab515a9d35e30d6c64830e748ab782191f2f9a9c133765ec3863708dbdd36d5e4ce9dd262f040766829e365ccf8e19b146355770ec4dc3a059581efe466e59fdf1d6a7d0c6a24b052c54b5a0f02e73390cd70ac56c0a004a9e45ae81296b3f5f1677db8c0dbae012295eb884130530215c175239e7160182009b46607a71a6186c48a1b8cb45c1dce3fd2f31aba568065e8e490f021454a674b8dda3e436b375f0daa3294969492ed269e9156011b133de86ada6a84225b1c297b71b3462cd3ca037585bb805179d76864a9083f927e8e1360d9302a2be39166bd5411c997000d882b268623bdc5dc9d9 Result = F Digest = SHA512 Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b Msg = 019d049056b4bbaf6c585c6aa4b7670ea52fd6814e6dad83eed6d334b82520d67156b7d56cc49604b88e6b2a983ea9bd33addced8d213ae5b6b97a4d420be913f80bba6bcf2f9d1416d094ddf2d402690d8a052f8dd506c4438d8f5d25225c90ff82b45a653dfa66ece77f8c9abf9a999a8dfb4e34d13cabfd19b96d4bb3a2d5 Sig = 772e888d14c70c4e546fa77a85d1be25ef85bd24ea52db68c2c0d3889edf96a6d7d31696536a12fead53f44a055847be51567a6466730991383e5aee41da40c90d6c951e36c865fa4638490ab44a27cbaedaad7d415b80a51ab465c8a18df567356988020d7e6ec0404577ce8f02d581e48228bc342f6bfe2d2eb2dec17f66fae7debb40b839b1085c16caa417bf31a7bfa540405f76671c8d80dee48d8a1cd44b456ee61ba601938bb3626805c232ec3978936bd8dcea073ea483ba8cdc29841b442fd28b4b4b1a282298776d83b2174114766b2017e5ad547a1021fcc3b829ba30f0cbdcfbae09c5e0101f8ebf1fdbfa1e1d029bba61c1ca1920fb36ea6e2f Result = F Digest = SHA512 Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b Msg = 1c0c43b58a3c85bc56763bb26f8060b645988d11d0651bc6d32e886b624a1b38a2d8cb5ed0b05e998499ce0937bcf03e03585792abb877bbdb6206a0b192a86c7be6cae1c35bcef089786986cfc94aa85b8ffdc2b8b60e3c7e07714fd39f211732a008e96b261fe6eb7dd6d03e91b61dd2a5454afe482a724285911fd15bd160 Sig = 5be423f5b70087c95d748e060004afca6b49fea89dfb37c2460578af2484c0b9ac384193dd47bd06736c071b557aad22684016e6d97e9597f49d11edd8bc7e6dc44ed1f94403d171b215b00c8f3a6721e1cd4d37cebf67b705dee052a2cc97415fa9fac97180fd60ae20667af437d3caf6b69ac87eb9afc3c951a49719f32a9e12062500b958a5b48136bb41e4d6434d5fb59814384e06a4e4d0a779f044e873d5ceea1249f9648153663234cfe9171f988e12926059c896793bb56630432c5d3305d70b436f041c3eb1b6377cf01b27f507a9a8389f57b2b17010b808123ef23201da72f39febf7ea3841cdbe376d3ac89471f2494e948702f618ce382fde3d Result = F Digest = SHA512 Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b Msg = 21ea231df11ec8a62b2bb1fb3a19d608e3ed32a531cf62d4b26c6e43e39ae719e83a32ef8063231b39bdce35e02a99d43cac9699fc83106fed956410701312cc2c5a148600176fff3baf075710deb7d0449ea1d62a4ac33cd103ccc97c532df3521072ea5783d3d89bca0667b27b5885638afc64a46da3c4c77d4d74eea05e16 Sig = 20d90f8361337e7196010e8778794c721c881492e63ceac4a7bbf56daa41fbb9c1716be12b56b79fc826b090c3a2a73f85fe761c9249f0be8577ca78385d11ece10270c05d07590b8d3c889f4cf9cc0881c066957974804f4a74aa9eed9a7d26871885260b2d67c96b1cdac2a6ea61650d8324dfc37105b916ecc406d604f79bbd7c8a7754cf805cc9c74914dfa1bd2dd6ab62b0e228673ac84faeb9b38c94f3f1a1b74d83188837dc7cdf8521bb61c7378c3db6c2305bfa906ab1c6ba3c2fe557feaa5c97e28304a64f3b4153265cf51910a7636b3723cd56131ea16ab4ad865224088143d36f7fe25c9f18363953b33692c10fa3aed59eb70172d7f4708b Result = F # [mod = 3072] Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 Msg = af09df21babe776fcecbb5c5dfa352c790ab27b9a5e74242bbd23970368dbefd7c3c74d161ae01c7e13c65b415f38aa660f51b69ea1c9a504fe1ad31987cb9b26a4db2c37d7b326c50dbc8c91b13925306ff0e6098532dee7282a99c3ddf99f9e1024301f76e31e58271870bd94b9356e892a6a798d422a48c7fd5b80efe855a Sig = 8005d3a1f6bc9e5b25e4bfe751a511b741d622eddab691d10911019f2589475c2432ab9a90627020ab3117042e468f1847a70d8fc392b09092bfca421292c5d4ecc0540957dedf526914490ce8338de9451cbc1c9c25dbba91d8c3d447dc7d044d9654022c8a21c08ecbadac1e44b0fe2ab462037cb409a8e37f617bc723ff4969e4553f46a8532cdc9429c0a03b8c34cb41812816904c98ea31eefb0d9a5a8f0c182e7d889d13704ba616ef1e91df911ea868df5d03b39d30624f310bff100d404fe6e86fe5986abd597babba200a28bc961d6d8054887a2f44ff269129e9b085891840e926244281cc312282e6da6ff5e70fb44cff6b2a2c48951601b1db25b4f70aabbcddb7e1c33e0521442e81df7835dde8a2852d410b45705e8763b5bbdae5dbf4d84dfe782ae862366ccf37adcbc8e51c9769fd516bab1f1572d8ebcd80ae9d052b1b102a2c13a7ed44465d9c535e6cf202c981c302e4117b74475f1b129d719280facc628fec3c28285bfccdccb67d75a71ae7908aacff6adf55d0ff Result = F Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 Msg = 5fa7b357c3630bec6d6e119f4266ff9465391acc638a87a7ad565fa84cd70679d0a8b82f892b64cefa28be108bb690627e5f5030247ff86251ed12270ddd12f18c05e9c161ffd7a4eeef817d1f6543065885c712ab65d7154fb66fe54da717c27d066f95b1a80c75300c826f663bc287d9f2a7fa5f03cbc68ff99f6c75fbbbf5 Sig = 1e84e79b2c46ca8d7a0e35503e4713f556eeac5b86116ded6c9ae1c14343c4c0c241424fa4ade7f76d93e6f845c62f0f2039e3cfda2d364cda93006199ba774842a7f0a99fc72bb21d583ab440a7ea37c371211c8a99f49772edbf14a18b8c1d112fe78af270c8dd3eafad00c004ba22bd521f3767b2d05a4f4ad87a850c4cd444126c6ecf50487053dab17dd624f9daa9a921d31ccfbe77a56787c13522eec9a7948626e560413cf210e438b61475f0fe3b53c29c038e8962781886eb2bf407b74ef7169a8302113cba712488fb9f2e27743d3a48033ae9b6fb76b768ac7014d73df1f4740721a5da04257c5cd72c0bb3de9e734f800e8db60b5b56e7dd58dbcb02b48e837f0264c2aa8b2543162533081cd579c1651b8ee4cd5981a7b27b7c77450e6d4bf3576e541409c2ebd09975d92ba4c35ffde2a7b2bbfb9628795de7c49805ce553bd632ceeda8e626fef36e5fb118dc0708f785680a5888096046832121d5427d7239e123733ca606fb991cae95f1ffc23ab0457599abf92732a87d Result = P Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed0204009fbb4f Msg = e4bc017c194430d1ae0798c2a122b56aedab0dc4f68cb81c27911fc3dabf040778e8c362e17cd7f20ea29f29f58762c6acf69204d22a4d112be029c18ab03184f49c2b9602ea1d75872f0f9873ad115ef7de8045ea51865c6cb5e0fbc934e4b1a002c27e44350a4262d76e76e439ca1a168b61ee07aa69e53339cbd75ef32476 Sig = 2e6b315e6ae71c573f396ac918df88f2254b6c29d552dff65d30f37e07fbee166459ad9b21969e19adf0ef493d368ef4e889e002f636eab345a1bcd373904d8137262e7828f50c3a5b0be2d89f5cf0217a5a593bb4b58b93cd59870e3e61e682f8f2778cb907cae1e9650280748011d08cb9b1e437ee26099a876d414e7ed5a1f31aacc632f2503ce38d4a15cdc9b5d8c9a01a379e5cc6315b6d81bf657c4b5d876752e8682177a799c9ae4687b58ca5182d6fcf06c3048b2410285d5d4f98cf94b71d3af8f7328450fb0cd8189a3d354c29b425ab75c33c9a29aacc602bfd0955e57214f1b4def30dc2f06b8abdbd9d609e126699c7994d34312bfdfeda87b23c484a097e614508bbd9f0daf2e0e71ef7c20ae14a943499b82a294ba90787b26df264fd8ce25b88d14b636c6a5b587cff9c80370162859df1ef2bec3a946997f84a5c8c577ea8329f3cdcc97214e6071badf226851ab3b5c7c1c9bfee3feec017393c3a054adf70a58e8596fcd47af32ca062567cdd87c5a53dae3780ba13ee Result = F Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 Msg = b6ce2cd484adf679c884c35b885757bd48a50241733f215bfd5ae70547e25eb44311a88bd8418bcf88fe2d9c50601bd6cf979061abc8f5953118a4ec3b06f1fe57fd6bb025295fa8018b9e04e248804b824729a3c0fa0b45427cac2f5eddaa183bbafca933107aea7c51a0fb08b88f04a9da546e797f6d5479af8934781090eb Sig = 01a0e831fbe4cba0309731c0bff9f3348e919fedca607b59d306e5f691879692ad2eda3a7e911da2dfcc2c1ece81873e8741ebec79dc58cf2884f638f393ad044d18c5147801d3c2238f10bce526f82d8fda18abf635e4c4593b44d4d1b9d390a62a9c3bdb662a0b5346e128c1841bf65780133cbb7ec1efa67f94a2ee8d503fcab70a0d9fa50c0ebbfb94910b0565efc6f0d79f1ea29ffdb0898a21c919ce9aae3d7349b2090a8c09f98e953a4cccfc8b0d19a8cd7a8a34c0dd5adc2f383b7dc2b5bfd7d9aed1a47aaecc54b5998c0c8e735b6f6ae7f737a68ef79d38fdf0756cee89089ceafc9cbefa2a02a0d02a7935c10a7826ecb6aa17a4d34b1c77d6942889457984e8197144907d3ac2a3e65ebe9d974bf522aada84f45bba806ca4b0534cad5b460d1bf5571a1e050e5494138f4c8bfcb4334968b50d9cb50b32c52aba4598fa47603de7d358f85b68e13432fd85b247c3759ff7e24dc1934d01ddd60a0156d4fe9d314681d3fd69f071bdfcc5b3a5b2df626f34eb95043bf160eb0a Result = F Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 Msg = 79d92d0766310a0011b4398c59543062ef8dceec5e5386e64949c028f4337cc007ae39448e1f156743e935c910e36714d009064456711f46b081d1c5ac60fa419caa106157684c8a803f0eb00be77d6cfcdf6d4f725f8777e58fa35facf679fbc2357905c9f5f7924f1e8be85149b893fd79cbb6bc0506a070d9fe9ffadf4219 Sig = 1fd91927e15056b040794544ad1bd99a077f3151d9d705ced12c9a6c41483dc1e1b94bc549e06c91a35816ce9016a9f56b9b95f8ce2c9e4a33b445f701abae9c6301bc9581ae89ea2e83b725431d01a3ce1e266ad3b8cd29b217b27e1db105887423d25dd5c6e0c02b3800df9fbcb9f306b86ecbca65366542da71b03955d4063512998924a30283592516037e51e24ee8e8c6bba339e5cc6a3b64375a7dd96e7efc00d410fc0a63d0833dfc8ef518c74c2dc13f79cacbafc3fdc2253c50cf7a1f79ffc185a96a1602e5b7416123d874b5e4c4b4b35b3523309895113d7d2aa71cd895feed0eb9174ecb5b8dec252c53890e28648e71c87a8528be9c7b23de20550675b0b5072fe52cb1de14c5e1be13896dac73220726adb1e8102fcdce01b92251497a553d74f938c96fd9e5936392f0f5c5efe15a7574e01342cedc17cf4f750825424c7b939d0328d2c5a0a8f744826ed9f8dd4479a40da051b7924a29e81c13e929e4815474bb4a825d564cee8f22ce451d094c19d9661dc413e070c5a6 Result = F Digest = SHA1 Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 Msg = 569b513e3a2f031a0fb2b3a2f3d51c321ffdde7dc9997f8248b2afbc79c3d09961ccb52e14a2aa29d589b5077e041c8723ec275ef2c0272c5d3cb7af7c2d4236ac83c6597da8d7e8cb10e6212a12c32688f661ae0d4fdafa468bb20b83c860127de90a283ce9913f3870cd58bfa41af7964213d4e3ed9dd44ac62837573c3113 Sig = 0202f80676900c6ebdaad6750b5e0600af5caee8b03480b8acfecf719fb3508b41ebc57e7625ee0303675478f17de92710db1855557ef3ad3e29353a53794df804db4ea20e8cc4a9c9ddb78b4be6f2475833fc13d9810de1bb338bc45bd88e76d8bba7b08beec647f3e084a15848591592b0fa7ccadf033a958ff643e8741fac68e7f8e7f6597ddbfe0e696fb68811d910ae817a017e136d100d50e2de6f9f8569593a5a88b535d44466e97baa7f9270334c299a7684059fdf5dc519ddceb050678501637b48ef27614b042365900a060e438ab6f16e3624795d47f448c0e91661c8aae15e46ceb37aa58ba8c413b6a6a812dedd263f2d8de3cd6f7f3b396334248ecc3f4dc5484a4218e33de1359798dda01affcafe7567633076ae95b847b2afcc1919e296cb77c8b00ed4aba717bd8c79b4320adae92bac470019ea631cc2efde91d5e465394c4c616faab83f5875fbb67b6c6ceca73c891ef4288750b02bbf478d532517bc6f76f0fd48dc2c0971888dc94854017c8e5551f0fda68e681a Result = F Digest = SHA256 Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 Msg = 921961e184a5d9657697e3e65ceb1ed10204ec56e739df0e4f906ee194c9ed27bd9fbc0d514abe3a6e480cb3155debfcc8d9fc815719b334f7500a769488773b68e31b69cd273c824f79f58306692c0c232fc5c0c83415ef1dd59a73a063e9d7bc6ee7bf9e433c8344b3051ed616c9473a90afdde393ee88e9a5849e5f642b43 Sig = 55362a6854a7846c4d105dc8a358fd4c02931f117631968457f422939d266682fd705e2091bfd5d1bfb52b4bfad684914489ecdad9038b75c65916a9e967630b16c76656b58404ec11ac46d8684b3e72d4392fb6e7e6c929e43ad4fb6ce6198f241b39e8bcbbc058792dde31b195b91bb14236dcb82c28a5c24d633dd847d1548dd403b3a70149371f46432db1767a00c462758c2298fe9f1f04c2ff4b96858d084ffe5a624cb85c1f9be2a60fed40133b7c571c6c467f46a0f1e48ee6e2e6d65424bf8196b0d927e0fd4141264aa5df4129d52d2fb57b8dac9386a84ecd34ecb1feac3a2b99d055eda977ddf8027f1178348a30e4cb4ecef2291d7f520794018b39f5251fd46d97282ac21f6bce6539d19aa1c21c3c220a2ddb6feed262eceebd753eaf5e0eb98cb3eb7d324a3dac0a415a18b7f36170676e8b9d3e421a6f77046bee6d9591c93f7ef0242f464f15b63132a0aee80949709429b1e76d40d60f79b2a6ab362f12e2cdd0bc66868c80278043e179a36f2815e7916378b0fbdb8e Result = F Digest = SHA256 Key = 3082018a02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b02031ed02d Msg = 8568ff68d40c9f240b5ff56d8919704a4819fb48b2f0741db6a3608a1aaddd861344d79813dd7f85e2f2f92bf00355adeadbc1d08b14fda5b5dd0f69c0fb37a9120e25a9ef166a0793352d9c7eb71fa3104fb11d55a38474220b205e6196ea04a94f506412be47f347b1f787dc3cb475e2fe31f6b9a6f0d026b6fd32a587dcdf Sig = 191cae43b354617b1ebedb701c124e76339935835a3633b4f806fb835d0dc4b7e4abf00f8c575fad8467ca35bc0d37b58a90db835f4ecb9f1dbfdfaffffb6ef1e0b894dd65fbf8e36478adb673b116188d864f185be5fcfc17bf1e6cfccd499d632b3cb1722c75776cd4d8ec68d2512c1ca598b970f03f6fff5facb107c0e74d6aefffaac20f8e3aa6e825a1de1690a84c8ad1e766642f2a89d3032b58b8e6ec50ef6a8e69b6afd30a2755d42b55f9e21f69c8d9d993549d198ec6c17d12f09ab4be0209030dcb274afefa77fe461e6469ad51f56dc58ad2f06b620af36ba712fa798d9812d2b6ce8ff4554b58bd2a6a8abdd8d00920bc3ad3b61586e544eb073419a85bbc1dfaf775068dc004a7f0ae789d5023d013f3e6096ead893158ac4ba050b87f8186705179f531be573d9557744a70ee42a4b3eb89c824eb8ae1172212c177557267ef04157f9fcf003c2d1f6039671d3af71339c30fbf772f14b3d59e81739ef82d61ab61475e1b4c835fa50350da15610f45531ae85fae5ff9a31a Result = F Digest = SHA256 Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 Msg = 88902b37b0db4246c41b50f180eb1350b1b6dac0477a3dd1accb0c5f541a85fe9637ca9cba15926153ce1edacfe66f574cd4b691adbe0c90ed8563ccb401bc93288e9baa06c7b837f191f8de0a5c9b2bc0a5b730eabfe56f13d43afa142779d8e99b86abbd791e90476ec64759d30194b631c6e425053134c3c0792f9d122296 Sig = 9d64c3b9a4ba78889747aef7c8565eb075e5bd92a55f9d34d3df6a2d740cd863ff98a04be4866e9f906cc6d99270d208a3dc2e53201cac9f4f758eecbe8a44db0243a3e40400cac37856079f2fe02d54d9748754331d9935595c35b22cc6c45686ea964642ec4ca7e0a88e4a4c0a6166733e361c46a592469cad7009ca3170cf3fbe485b1c8726e23a6e35f9691d9bf4029d82756c64a4d31ad0b8ef57a0ba2d55419d7cfabbab1a23c8baa4bf043a444b127920250551467d7d528425dc7c903c2c824e6b9b65f543ad9d7055300f19500356100411271e15b939d496b4bd4cc3ba4b6aa2ce65f4825275404cb19512ae27cc986b0af6fddff35980c2cc0e96829ecbd9ee19944838e4c83b1eadb6f78669890f556781c4e97d8ede9664080e47b3adaf2f5e04bd42d46012aeace3078f9068d870fee02b088f9674fdc0ca0064e9f0f63205836d7a8771264c553c945eb7c87df2a13d8efd3cdc8409843e7a246089970abd43526f3cc9cf993d419a6beaaaf6830208686a1fde4733f078ac Result = F Digest = SHA256 Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 Msg = 973606b2c7e5658a9d8f264b8f5a266d0992cfbd6e9d3ff95c31a69a32c4f0f1cf44a5759d090d5ccf089768e6497b047a9b9f8f3786b8f82681b18b2d65500ada2217005cb06852d249ed17c9d637a9ffa7a5fc6d66882f854e8461b9983ac63c3623fa0cc4bf9530bcf0ff3ee9a086211eaaad1927f8c70300e9c5db45f54d Sig = 355644f5a26a4ffc638c44ab4d0b7359f37845235bfb994d28e63b114c0e0f97d2e29f448da8b12eb804792ccc686dd807f44211d6af410bdca1196df84016b3cdae180bbb59133aeac5928560ad2cf6be61392dc9e28d7ada11658cf4a873bd2626ca839e697c79a5c4bb3ed4c9b8f48f83f2800e1907376f2e8874c23f1dff8bbf3b3f98bed7895d486079a92557a553a71e18cfafdc155775f39a77455b432b0c2c4f09990d130060143e7310b9d9e1ae6f2b1b83b90b36c6581473f60c3c61a10e286557f84e5d04cc36e12cbce835234d2d773221313ad7287c9957d94a1cda8c1fccd3eec45dd84a5d075d6bf823123fcdc7d549286142ab514db6d998e377429494f07041387de3ab31b02ac1606e590572bd9003e5a62b90b95b00c0eca73c744ccf4eae44374e26ba6033dd2baede95e19cecc840a045bf995a3250ce7b08e0c3267de822616f93a4dd9e629eb38b479bd31071b48976cf73ce52c3734abd93249300dd5c40635842dd2a290276190737a123008a4f0be557ca6628 Result = F Digest = SHA256 Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 Msg = 170dcd5458adfbdccc757e0b5abc19278112f24b418b995d395b46410da3624c0a8b49fc0d914fe6a02101ef6765adbfbb5e24739434be92acca9f43e19639bddbb012fef028c7c0449d52a9350b88c2f6e5e52a79648c0c931e8ace5bda5b8bd3a3afc4ca1b6e520012f99f8c57b3167bcec0d8bac30cb1367e8f4a4118d0a0 Sig = 6a4db2e6c13ee8ec6174bf57ae5bb7555e66dc2e3b618f259d913b5b8b6c16b9760290c9c576b563316f510ad2461cd5086b6d9670551ec74b8a9d15ebd43ccdfdcd74cad660a3fe3f36992c86559cd8e9e4d3568924b1f7e55bc5d8df4cf53f240fb3b945a08d24f205d5a7081410ea3e8136ca282fc99e6be0b1fa2faa742c9d682d08a77b791bb0421241e6a82f84605dda359e4f8475cef346c9f6a54a085492fc4bbb30b1047c66f5fc529ecb6aa9ece561e5a3a62f9a19eca2badbfa32a2aa205713b16081519c2cde2f8e8261726fad49145dce0d9e24f6e085e44bd86f670a114ba98d54389f0ed683d062735cd495e6a8a6eef9fd70355b92b4cf6cf0c24e898b6d3f7fe51dcd1548a1adc67ba585e2d18809ea658d6ec4bb5e33e8501d11a266f5e0928ecb58547e72c27db8b07aae31eefef865bcf6a08485675d3037f432c157e5ee428d292bfc24c654d8fca7a60107dc18461251906521e1e9965fc80c7b5f582ac3dc3798a0a2937e76d7e7fd7122d3fd9083feeb9a44ad7c Result = P Digest = SHA256 Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 Msg = b2f72cef31be4b7439191d9b342065e62513792826f950481486dd4289429b6e0ae86a05820c99e1ef0144845cfae05c0f6f144603c3ca50992387c38ab1f76120e2cdeba624cae61dc51a9f3010e76d6ab92936a77bbb34c8ffb4f9ab00f4b15badfda8834e050c292b49f398a9a39f9eb75f01f8684b7d0be10dedd576b9e8 Sig = 8ca52a9040ac49ec2415054ee86379f297832a2a33892c9dec09de778982fb1bbff68b3787ef43ad15f9aa0c518847ba1b3075613bf187a6fc8a7fd7f0b43a6a24086c1d6c5fcb1db18c93bc508e609396ba019fa43dd19f95194c47003d6092303be35477a3137aa2adaa51b22618db29fce98b5bf791ac70be7e238c558f0fb42a40bcfe0e9c07e178afe7a2db74fcb03693ed46719d54d69d5de43ad6a93b0a5b7da6e05ebf7c4b02da42c7ac1f8997da7c4de00c7747361bbef534461bebc23477e93a48558b3ade7d09dce6fa6a378e68e7204ab35283c58148df0cf9444e5f91ad31cd0474815895555cfd7f9cef9164b91db4f98816d194f85bad581f410a655273e5d14491793141f9d928cb30a322c513935dfd830dfc75030b8b2ba1f46b763ec303bef32b4dbeb01781bc1f2bf2ceba27750082661558cf3d42f03d50409b7db521299009753c25926e3e6502bb1763ab68dd5c19dc0265b16a2d438c3ed23b74e60ecff88708e5601a478986dd1b607a2db0fe049664d136517f Result = F Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff Msg = 5a145e4a9e0f639fafe50687c28abdb29650e220fa5b58359155710fd2640f1752590ad6462bd20b43a356fa4958240600ded182413b9bc5d89a4d7c8944634551cb6f79ed88bb48a148300c324376d7344e5d4e8c517cbb2dfa185d25b34703ddd254d99c1066814e3d5d658432fd4cbb064e2ce185423f15dd9959af9b0279 Sig = 89d9b5c50dbf8ae358aa201b9840d1eec03db8797f9d32dc4fc5f6421ede24c52715c698a5d8a6b4ef2c85f4bf2aab139e00edb17f8abe19cdd427c1d72f4e2f9b97aff034dc7fb09ed1de84ae491a04c71ac24fd8b16622a3517746cf63df051b55ed218a2c1e6ab5d603687bf199af4192c1f11f49f0e7a9e0e85563a60139b5829fc907599c7be5d19fca86f17b6fc65b6d039a43447c5d6d3deb41f7ab77a55bebd03dc92157131691a66cabdf721fbeff93250591faada512d7403f6f49912758e030c8abcbda4712775afd2d1b2d0fa31b175fbae92becfeed5b9a34a6c61c761145b8d2147b5834996850fff9ce72f59b5cbb7314bf5fa951e39b0a4e0b6c83ea1632d3b3bffd560ed36e8dfcabc60d8e77787ba1356b47b979c4f734abb5d02463f264d842569826808447365692f9508d69002d9a21893848ff62f3747592cd1c6b2b4d7e8b118a3a89915633958371c373c7c677a499fa32444d21cff20ff35c342e4277ca009e948f56d9e5ca99d281b3624c38c33098c1c18448 Result = F Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff Msg = 31fd8f67e35675269c8deca6a513b67ad8ad903310195027def430717edb6a3909d10536ebe0ee7098034a4b7b440bc12f22c1eff235b3d357152f543b771e82f999db20e2e14660e7c114ed99dd692e5470a8cab6eb8a6756e06db8b31fefb66b1fbc2dae9fa47bf18cf194e726f74aad5feccc4583fa6c451e93a5d01b055c Sig = 6d4b0803da15feaeaa9ee2d32af1cf1d209693da7b8847d30a11f6fbeebffe29691c93a9687519bfd79506f33c828d84c4368297067b997379098236db4856a40275256a3803a9bc2c2a748b5f22a5f9802251b650dbb57952abc845d5c10e0587497229b78a09b386d77b17bad1f3dbbd4a539e12f345cc96ecd6aafbb6c163c333a06ec4b1eaab7870dad2cc496e61e0aeb2bd8a23a92d95a7e771591b39de73581fc3f45619ed3f4f4eaec26bf364514d25f52fce545a60856b0d57cabbdfeca6c1da78552e75673d97c544fdb854046249f44d57edac6f50c6fa99d4c29a6d444db13797f064ccc759194da4a228649849379a197e032d6cf9cc9d62cbb46a5217c69947f1324d1743d5ef0863d80ac8d3566e89d0d892095b88397db3e0e07635805593c4d41db8a3528e88671a699a2f4b100b8ca601e341650cc73c6dedf36a9bb860d222fa456e6013419158e680217738551e90b4df4fe3c41ebec266ff230789ad8a5482a9451d52bf9efb8fb44c3e1bcc9f018bec51f8e68e8c19 Result = F Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff Msg = 8f3b827a1dc3967aa2e26c9d9052a97e64b047c186cf980070528708137a2246763c557ca197f8b8b9240d876cef42669085be79064e1980e51dac06d4060cdbb870d1c5906a9c739c4358b2c554bfe4392120ad56a160efc9d940f9f7b0ddfb9cfe7dbdb1e688919466d587632c27dfa8abf8c43c6f753765adc949421f9e8d Sig = a5e1136bc2db78827f97e435352303519df3c6ba149748ecea4c493f3355def8f94beb1ab45870d8bb1e32bb10c6cda4546c0bcf90da0758fa1e99b22742302ff17c7d5f0c5580a727304066204f524dd206e1a2a232d4394b74f3daeebc81d8609034dafec29620427caaa72f648fbf39028ff685925b1b7ae4b53e154ca93821b6b152da380217a2f82c864437df45c32253a9e3ecfcda3444f5db879cd12f2fe80d0b88a6fad7cb69303b82e1ed0b761e9f829fafbf4a7027fa2a6164f7701684f7aafd8b5dbf41e6d4031ca28bb4ce360fb3815c33fdb6051c9741ff4f9ebffcfd2f52873ba5567c17d40eb8a92af139b21a184b2e0740e0ade97effeea733cb2e1fe7ff65077c200b36e544f61e90dab2f524a74ed46f10d5244509faadc47f8bb57cac5026e00d1438b24f328dd5fa11fa3add3acd33b20f3c75b1007bcb5379cd8cd8e0f964dacda0157952f41e128ac43878c55acc5967cc2fc631010594248a439820df0ab1b7bd1be5f81bb026016dcc65a674d9ea03bf1958e591 Result = P Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff Msg = 4fd8f7c586b502fe11ae866254e333b688f33e29b41cf995dca4a60275778d6c1d114cc6899e6f3ebf6040c38552e0c4190b973b22e469ebe75deae5bfbd5351c8f9d46bdcd72cccc15378eba04248e3b935f87754a03e53fb3cff94e6a9678bb75838be68a86230814fd5e38efc939ad03b09e333989f5580078e17d483f1a2 Sig = c5fcf6db007527d04b7c7b2ab744547521ca009e1644f20e793bb51837922ae9411fff23c646c2b56d99a3cf24b676b7e3cb036b6445c33629bdcc979fbaa280ff8e1c1c9e66b0f453633d3933b788590302746f0cad1be62e6f0ff1457358137cddb8574f9df59be5192a2556b8689beeb266a5adf6b21ba56e6b7cd0d6760f5c350f2ffbda1fe30fda8e2cf563f96d85cec8051c7b635da259dc30e868d917fa31b21e91caddfe5dbd21475a98bf6ab4cbb2d62dd52e35a3320f48b027fe89eafc15bce8f1a5e6c5a402d0d87743d3cf6950dfff4c616da976fac676cc944296381d81ed8c8a782adad29b31e4b2343e92dc8c406e022e566c0b9f5477024c73b21dee60128098d2fcbf67273aa12f44de44ff22bd36a0292723d026e34a0f1d545eec9fe4024214aa647b31af4a5d7c8259a720462476fdac9aa480668d726b9fe4f3c220bb492cd871f86527072089d60872fed7721f4764277903f90bb987af661b2fca1d7ff12694ab654037ef9146480d2c1c8c6c5e52adde601bdbc1 Result = F Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff Msg = 68e2b0476e66a61efdb9e8e7388840d0e58e4b9812ad3547ff3dc41d38a498c80226b1daf8ff3179f6af63583696fde7b9c0a2c7e902ab817c4627779b23201b44b1215eed9bf46c6a75b0961050f48f1b8c6ddc4dee9e86d8f2e0127e63a7b2f72808bd9361785d20b3d7880edfad31d19ab3bf879995bedbebf6d4298bb4f7 Sig = c25f7a4c2998ac04d2291a849323fe2af98810e8270474594d9287230da4fb4469e198a6eedb1ff28bdf780320da132de069af846a8c88560722bcb59acfcc0a04533de1a69175d0d16c070098e43042af12fed1d5996c1a5a9550055440146ac83913427c6d60be2cbf0038c2b74d297f981af211aab0e08f89bbf4bf37693ef40fc9f44bb3df2c23ab3fd829c483f6704e541da8c842f1c3096de5c30ab6363fa2ef55b99d7ccc31b65c647893008b5b791f388f55ac1dd6fa786cf317c41a0a8eef2112549b7ce8030d403742995890adfa2f2dca37ded1a60c0fe987b1479a8ffd7272c7165c477e311cf208020d840cbd93892e72f05186a4aefbdfc0c4bf34525bf6d801bc45bdc41e8a1bed2cc7862ba789091bbd388a770b2c1bbff64416d7fbeffbe51a961f0fea7ec7c643b4d3f59beddc4d908dbdaf028c3f1ed10834c3e4b6038a53c24f102d5d5977f2d1573ec0273b0b16b9278e291a542939e63b5854c293bd42a571f286b347769e5d73f38ac034cc14dcc0b961bb0af5cc Result = F Digest = SHA384 Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf020310143d Msg = a0a014cd11ec9b3df8d54647f5ccd580dbaaca2f6197c0551b2bfeeaa9d44c6a2f780690055b6e61af42466d0fd99f52d952ec81484f5a450f0264019392a1b957c1e1d3b7cd791fda93db16e2fa6a5f658f8c98216d0052eb60725de94a4c4701c5d01f9109647e61112cc9d6f9deb068abd2fa55ba5985978e508814c2f51c Sig = 19382307981e33064a7836168c5302d691c9a364aa0193165d7852145b3ce74cc70439ee2652e598c153f1bf5c0e2e7bd628f15e797a974efd47cd70d368d9cc0c4d7ad8e41973c935e81a391e56c1ba9b486f59653cab41f5f7a0d5ad0f9730d45c6e2d00e5f78056d5a527ff128c584f1735ba1d4436bac48e74e1a387ba7e5de21d94ee419b466d6d01ea81f5fa7dd395ee8c5f0762a08799cd237d4c078ade6222dbc33ec83736760fdd04a0f911d9a1e6c1f97a57b1dcb9deb53471751dfcd83e17539a0dfa5e253aa0616d301dd613a2de4873fcffa324700e2c3f61c24b3cdb0e0e2cd33b33bd97e759d34693e18a6a40029c00c5f7e9d7c2638c3f6b5df9ee16da4ea4c1556f572d4c935ef1d091f313424a6085fdef28f76ab8562818cbb19e0b794669f6e6be366af6f0a43fc85bf82ee0abe8df1deffa4b1e7ad16f8feffc7e6b48995a11bcea982c995ee676985f84d47f93f4f9973de8aef4bb56cb66c9ac2f02b75f9d96a097b18a13007d716158620342e96961d6b7942a57 Result = F Digest = SHA512 Key = 3082018a02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae0302034df3ed Msg = 54a8d256702239dee2ebc1dc681938b467ce4740dc5fff1796b5b50fa3f31000085860cbb568319bb746216bb065eec9845fd3d95625159cb359d9720cf838de6a3c958a5dc12e8b35e6f2e5757693528588db3fa7a343182c26c2c5e8e7e375e31b1a9a51765834c593dd53a1954ed7d10f077bb921b2126be418101e08384b Sig = 869091f55f7e61bd18d88b974ddb408df8a724ca72232b6326de301cfc985e8db211180ad2057a4f4f73c07e48973b00d2833655acf393b31d155c11e9ddc05dd5f4516ac50fbc674cd0c577c79b00e5567629cbcf880b729a7ae0ca9eb040fdcced198243d40f5e3b59f35f2992da079e9f174844f1b2d0f1307624f4d868f558dcd1c6064297a152c816db1ee5848f9e670d8d837911c85b221430b309dcfb4853c3dbf6a2d8c8a6cd3d697ec325da6d8740081bb86e98d092a8794009915f5f55ca9ec074cded2745c50f328af98f78edc94cb6b416cf543d59a4d493824462a21fa6e368943d9d541ac233a7d708fcc7248be670051abf60199c656b8595dfd29e19a207d5c2d33a97dd7b66737023e62bbf522077b8531ededd070a2b17f7d1f9dba47a89585eb72d21c3dc6fb321614604899553bc0834baf3b7647a4aafa046964a805f05477c9e1def5c40430e82d635e7f90713e822e355edd10f2a65c886c4d94bb306bac35dbf307400eb7d8caaa36e167760209c80362e8c763a Result = F Digest = SHA512 Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 Msg = 6459ea1d443df706907ffdd3ca2f193f93f5a349b50357d26748b767cde6ab5cbfe76b1acb2b9eb97da5c4d2ddc8d18e3a3b1a0326d475c1c2c49ca73c0fd3fc9540cbbba85ac52d6811fabd693a3b09a281d535715ab784df3ad7292606d15a70ccd1a7e2b1b48ad92a6a3f736f9fd5522d9a869c7b654446102e9493b3ed9f Sig = 2b72942573b825cd1f0172119c23440a2b384b7f2a3c5582bb02f764e2b159ea9ad880ca61b3df7ca249134f4bec285083c7ebf984b192808e916af687ef6c6a9a6722a4fa9189fac1521d03853f3dd5a95ff4b9dbdbf3c7077f720650ead01945ab5bfee582ac1643526fbf68efe1bb3b6f7d2b4b01f2155aaea38a2c7ed29add23ee791a703d11e3b1b7c500d9a6b647c1337bf537c071e5bada6faa025bcaf5e5d1196998909c3d64758826939ae7fe1466dc6efc10a2b25e21186c2d135ceace33cdf490b13a0d10c2527e04200aa70bc1d4f3cfb04b5d2bc17aee881d3a788401f45443470bc639232088a9553c8d792aa5707654f075476a66b86368d5a92b4c84a3b4baba1b0b98bdebb85b48b82b8409f2e9c1aa500670329ff3b6e83e25c561110d47b2fe93ea2946a74f9730da9b7d126f8d7c3fa4a51fc30144a827831c186390998d552a1b677afe5afee46e9d4a5774a56355a4d1967677e75d176aef71c3fa061644d7a9582385877de67f87724b0a6e868f3a2eeafb68c53b Result = P Digest = SHA512 Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 Msg = e4dcdd4e122e9466560370fb59ee0c4c323fca47e57772a029ff1b216f194f411f166af725ca43d0ac3d0e4029a381359c8e36f21363511b6f0a620c6aea8d6fd915e80e2fbf24e543f5707c538c9a744857775f3b9d86d539c9d0c44364120799411e3a39f77fcda2945c58dd909f2ebe005535680c58f50fa32cee026e282f Sig = 02ca1d1fe97e0c3724d649dbe493c4bf8825d72f0e1717a6a8767453a3ef20bbbbc62fdcef7b816af229dc1ee2464a19b63825f47dea9774745dfe4ffd36ea72eaed7137412bcf0d0d5a9ffb02ecf15309aa047fde0a32a16876bcc33363b7290b6ec9c019d82767d36dcecb841b6946dac889cf3e11e614c4dd07e594c50e1557665c6ef76ef2205d57a2c8e6d0950ad7e4e476ce2e095f7e376c21f96c38b53327c94a9c4547982ce396eb2070bb73df03a09efb3bc6fbe5c35dd89e3ce54ff093739c678aeced539f04aee3c4d391b1399cfef4e24529033098a29aad09e715daba9c4323837b48b5292bcbf32b39cf15c6430714a930bd840b8c15d7467e71e99ef6726e1ab3d05a0e96939082391956f7f0492676a05771f695d24d7c7c22c64d7ef99a295ce34cb882153162400a9d6bacb4e1002ee51317477fddd9923fa1af2ef60e40da01fa19a43e446144581b3eb8f4d44d16b31c0b155c7e95ec52da4676c6abc1075ad271e5b39a5b3ac7672f1c65a1f28d402c691e8024559a Result = F Digest = SHA512 Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 Msg = eced7082ee6e916e753959e7dfbec00d9b424b64eb90eb2be7eb22e9c648674859bacc26d82edeeae158cc14beedcc19e713bb6dc71603e1c35cc22f799b29d34549221d0a5435852f14ac3ee77ef50eb69a495c31378b8b05dd73863a03eb9cb982b98f0c4a5fe766533f8ce3d7039410bf3c5aae5b49d0b3557b1692e8774b Sig = 11aa09883b9f571237215bacf3ea7f100740a1bd72748804bca39e9ef8527692b5a8e1f94d255cab186edd16fbe76bb9d673ecef79f2614fc0bf4e2b3c28a93c39e6fb31de6c21dc93026f8ce717767d57bef1c91839568b9da11c1b48cd7e53e132ea7f9b12f80c3bc1a6b9ba1e7d234ffc4f251e6ada2588b21b457d9bedb51d14b1214144a81a3b987f00b20c6cbb314840363fb4a605495124abd45ac3d7e9d65e8b95dff0ba916d432749dfb24e5fadac418ff716097d86943a6bfa8dc5ff27dda853c63c1b2ce3383bd78197af3e30635d0ae65e203300ded374a790245cdf4d1640ba5d0da8d6ea35ba0263efde90c7b1a8ac1e3cd0f843e5fe57f681055de7ffea80e92af36bc183efaed08a5842f9bc8369626d60ab2c460de622b9b3c36e6e559787264abefaba843bf443cd9443eff990db82feece2cdb5e336f84f641176f82b41efa2377737089792b4a9596a32cad5450a5f6a93f947d249dd734be9b3cb6c825af53c27070eeb7c1713aa607fa89e44a542dac00b80bd246f Result = F Digest = SHA512 Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 Msg = 404f0ccd8f6ae6f81cd7a4efe9a1f630c56ac1987002698e0138507e85f09a89e976347a1a1214fc6addc20b36d217a9c52844d274e017b1109a7a1484ac3d1eb475153ba8efe459ed843a5638231cb44d9205941f062be239f103cd5c1b077a6af4b7f98229de786d7516b639ba8ebb23500bc7bb9c2d8842e5f48f57648205 Sig = 11368e0d1b3900af8ce2fa432a871bc448e0d49a71eee2b201b67b496ce00854138386c3cccd6e4210f84c2e1de653f70f16d0240666fed5b9fcfb247d8c77f0ae9826fc32d0ed6aff6e94eab735ffa2dd108b842e59e7d04e3eddcdcd087b30a3d65cd9f6566dad10bd2e9d7bd2b6c20167552e77270ca43a1ca5aee8c9e7bb5825970ab74ea79d3ae73b12d34274d58117b568aa724a6766ed40afe8d2649dffd5bb9c1c854a70a10ac5459fb9bfe4bcecbb04103ffba4d314c2c5aebd805acfdb113f5321ebfa19d0c809e8713e35bdaa8c7930c2f2ca5792206aaac8e44b4cdf1434f04acf6c1df428843b14e1c8401555742707bd5f9e4188f38206fe11c13f29947ecd97f5f576d4ebeffd1f29d38e43d76348bb43840d9044fb7785a0d7d04bb27206b2907759c29a70acd14dceb05d21e7c8bd907df3746b666a40e35245f7bcd723446b4e88ab0e2d8d5b3456041ba111a8276df1e4625e5863c5dd6b2c7ec1ac55aac7eb8373cea752a6396558fa7adea9d8c4fe0843241bd67f2a Result = F Digest = SHA512 Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 Msg = abdffe0b951a91c54c7f00e1ff8e98060b413f131d9cb5589a861a053ed7b1e203b2e3414415873222ae60f527f1e7b529674b737149b7401d4dd3afc3c08d8a57d519c44f3d36af04f7b46f5c6a33afa6b12d92c53637ec918283b37a53aab06fefa87afeb928a5bc020337e721035b4ac6ec5a618bbdc6becc33f9abb98fbe Sig = 183fcc6e78a7811df1b7442c3bf543e198ce6c691ea6b3aa1952bee39d3218a2b1cd55af26efe672b11c640af1de241fc1289cf10643992fbfe604e1e965d2eb9e19f3399d9fe174ec4129bffb0e041b15f8b7e7b25b535882cbd5d6983d8d84dbf91daf22078579670f70e1f46b723e5a0004f1870d88daa8d7d22df709226ee6d7b484ff47a44db43073f65bc6974493a807391861adf95535b560a47e0ae96af5239aaf1e524758ab6c7a2d3bdccc2f2cc173251954504b837e27f32e699e7604a11d8205893d8cbf9a5852af1f65f8e0b1e1851b4f7a80ff929d5f4f796aaeebddcbfc4c3835d6381b2341404b77d90c78be4d97747b2d6fa9b88610963795ee95f70bbc897b486cf4b313ade25d56ced2e8b6584b921567d32cd627e9497f39f743f020930cf5141668e127152fd92df34b44e3cd142c1668fd71f7f83246f2be3b2ff95bc1ed7e193d75adc5369fbea93314f03a305a825946846f59af8c108a14888e894872e4c0086599faef2f5a0edfb4e085c0402cc56e69930f59 Result = F Digest = SHA1 Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f Msg = 8bd0e9c0054beaa7d19e08483fa541fa551ee71421af980d4b2b71e2f1117fb8ae5576c3fc63a666bd622a9c14b5639679c8a5a60d092f5b2a3461ee3fd429dcdb07bfd5078192d5d9d3829146ed4f1438e251aae0ec6afd4eb03a7e3fc39106366c2abdceac963c4e7b76ee7e55edbcb9f555e94461313ade26635b98e5a07e Sig = 4197ec722775cc065adfcecce1af88d2556161466124f358563c84c52eb4ff711b9afa9a6c0bab52ea08f7a6f434ea5a6b4dabd3554baae2330b1de68e62d83c2d6217781c6e38376f142971e13c8806e0bf467089e3dae47b80f9f93e8677209f29d0b20b474ac815a2e2388b9d34b838373401b72a33e30914cc0ce9e1357d00f55d9736107d3db204bb13d77923566d35715a9c986f199d5d185f02aed6481dbd116e3fbc81c3bd4e3438928d3c93f63d9566b4af39bdc6361783286611a0bee9f326ac1678ffd9ef517ea0a6908cc38d3b153e68ce79bcde3c2f33d240cec3066d8c05af6d38008239979dacc67c2bcc14212909f4e2f92b654f7dea995cf006088be930061798d5fd0e4851c65d5a23b9440a83aacca0837059e85f32d16f390b02a57b910c6a9109f8d69af07d7a8a44beb4ddef724bdc475369ad34510b8edb5c2b36c9f9cfc775d1f1840d2406943048ba339d94f7f226763c17425543fc5d2c4f0d9fb0f4ca98e100be9c2917c13ebeb90a9e4fd235671cfca89769 Result = F Digest = SHA1 Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f Msg = b8012a53d58a2db0cfa9e680b24a6327a01873cc7493650ea46213f26cea2020291f7d50039a32ffceed5b66323370ac0aebca5b0b066311a63ede782faac7773e8f1baa567a0b10c48bfd04ca14d46ffd63713becdb790b024a5929ae7688bfc0f90c4b174f404d792ed442c21515d641286f565f3b3064812d8eee3077ec61 Sig = 584351aa09ff6cd9da1771735e122bea891e20c6c3e297966885f7c7768a395c455768a8c6066018cce86d2effd909a719bd7d712072efa0aa530b9ed6a1a24c4c4f589a006c077ffb013f4fd9dc0a9e13b516a3234d09f79ff76e8d46a8c5f1e41f229805d9ffcea507277511b5f8e71d13568574d01759cd851e2b6cdb6a7fca280ee10d7a62ae15db9069c0438ccfdce2b8d83dbc7e5abe6ddb1813ce1b7aafad383455b50da544bdec9dce0d93894927940d17159f1f82bf44dcd8e69631125695b7cbed538ff467d0f53258d815b8a817e79fa238eef0a26e53202ff5e2d57b547831eba68f71ee81b1d4a5af42de2c5c4e9a8e4d3f53d6e9832e71de9590851a5be5e18b381c94536313185db54f9f03d362971b13a8612d3456cd8d3f15644fbeb33f8fb2b9b6b60522f49b6c6bc5d6c3701371f66dd115f95eaf5889893e27df3975ea90ee3e8b9438e7dc26ecee1dd9fdc34843e3188cb020778b4ffb8b52339405f17278be0e6d9a227292363829cce7cc3ac2ba1ff90cf8c09dbc Result = F Digest = SHA1 Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f Msg = 0803aa22e7bfadb1ae48bdc6dea805f2951c23650d81d2056509c6c2a432d823fbf963254a4aee46e6bc0bdd9a7b7eaceb85a2b8a01a0959826d638d61a0a19157ef5ab3512c6d62ca6be887dafe281870a442e9dbfda2c69041f2c027323ec4a64f5572024b722be3bd1b6ca8194a5babdfcba0c612e57616ec3c02fed0f6e3 Sig = bf3adfd66bd872ad41c1b2465bee7befb88bb46c36d1a113ee3df6e0d2547f771fa7e72b7ba22d86673912d70b8ca1bb61e6835da82f6a272ee25b4d603bed423d6febc079a13f9140cfd22fe2aa9994125310b8f4268b3ebd68ec0ec781bd129d921502ee93fad8d96d006996e44d662ddca2932d8c06f088cff205e5826104b7f2860beb589a5161e8c0d5454fa7c522e395e843f025e6b99af27951ce577894adf63516b7fc78a6bebf17c287d199888e5237a17a88a765f929618c53b87a7e4660507dc7fa3e4ffdac8eee8963a960eb34f0f974d83fcac38223f24c79f818fb46e767cb3a807a77d6fdaa4d1b072f9d20ef025329da3f2933ab694b838996b0e6710cee35339f4e1cb7a145e3feac23847049977a6afd55038b8fd9449bee3875ca23708932d693657167ee577fa56d790dbd98537857a5d67bfa5c998c39af621c43c5ebc3976a0de1dc09890929ac3384abcfc22ed1c965254245bb2c6f68399ad3b9c4e6499d1f09ae800a5d6fe871dc7adc98293fd86930aa566523 Result = F Digest = SHA1 Key = 3082018a0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b02037e024d Msg = 66617eec7cb213d31a231ddbd0d4cebf80f32ac36d81bb979559877f416e3fb1da54b9fefe02a0b5d3d66bc59bd98b218945e969d3448fc609fba516a5c7a049e3c6b60ad39a95a2ac69541a6328aaa07c1a5e2d2193fe647102d4bc1a2e16e12ac05d58220258624ce6c2244f4a9104017a71567cf770387477fbbac82c0943 Sig = 72d24f9b4b3642043b7080ce66d5c2bed95b1a710776ede03cbfef3806760a6ee640def72c6b04477342dc3d1109d06d58a1880bcb8b3ffd8ea15c2e66de6815419c684962f79dd0c0645b2b22cbcea29c7ae85bb5e689ead0f07350a3cc8dd872698daaafea95b014e12132df28b50e63f7c011a9e6a7184376223730119b201e8ac5d61b6bf9e7c2896fff600a119300bfb034a985330de944ffebf67f720a33115fa680e02bca71eed92d0160c83a037be1bc4383c26ada8e1298dd92d0db9d7d918a59baf2c2b2b88e7996f630d5f88675b8cf80be841973e3c1efd0a156ac9f5570eb2797ddd32cd4575fba8c3ed5c39236af3845bfd95020463ffb983b9a0ae24bd244f20a5ada496f58c80fa5b16dd2a8010abc86c7a8474621d4ebee2849ea96e0e94956614ea0818c425c0ccbbff20a62cb7d218573f5aeba6920f75a7fb26ebcf5debc473d4a8daed02e1eab16212ed268caf07c2df497d1ef6700f47287b80c6635edab668c3665ab333617daa98aac9c1f71f749bc1dc2bb2428 Result = F Digest = SHA1 Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f Msg = 1c7965099677664f23eeec41046865633a36ef29f6116ebd5101dbfc3d7edfc1bbd5a0674fcedb89b18c330cc6b4c860ced20c02dff8d24692a8a853fcf3676fe0e3087d2217b9c37fad30f17c65405f9c02aa97d6f4351346350148237118e3f1694652f8992b86f4188ef70ec1f4e90b9071eec44ebfadd6718de19a3e19a5 Sig = 8b7a7e94dd13ad803b61a100b66075f011b9c52d8d443c49560f99256f0eef53a699d24dbd8aceaf85c2fc0eaedb6e34f1bb4e5a58a171b5f08170ff865cda853e599dd6f7b88c32678733198e1ee4eb586cb360f3ef8aa3c034557c49cc39bf02a5bb8b4f17aaf7a736b83d2965c4ae8bbf9cc81f3f7943dcfb74caf216b745f6fa6b941e6dc5d535feb5862864d4ab4d4258d7bd1f93ae81219f88d3b8790cd40e2c222b074a1d396a92f75bee8e088e0e71daa7120256c5842dc4abaf04d9784d25dc6374c0c33126055c4367d841809fb21f3a3cdbbee5aad204bd89b3b7aa4995154b4f2ff3896c936a1b8f41a95db16ffbb733d6abc23889ea2ddb07498a3bb270e259276d4bfbdccb94683a7860de3786c93b19e285685f4397594d1b18c1dafb09e614e8e59760968e14992f9b1b7bfadd283c3493ad5035b79630846b349e3cd294e93952b40cf4580e4fc24fdfbe77aeb92f8c6afe03624be13862880f1f939c21cc895e62fa4c78a3b95341092a6abe7d21b5bf5528b2383c20e6 Result = F Digest = SHA1 Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f Msg = d02569c471a2139f9265920ec395fd1803fe857d1e1063e03a2b0f2bac1ab33010dddf8c98ab7ed1a43709e49333faa3d91284cb52138119d77bacb00e2110bb8630c0530329c9a31627654af16771007a07217d9e0ef397e8ade1aa52c5db3c5ba874e15924dc5d11be0e09853b4a780d65c659a90ba19f964a18e01f0bfcfb Sig = 40bb34f18580db4e1af934834953321a7fda886fb8831041909abfc08db1aedaf64115791699180c18b14584457933033e9cd0347b3e25dfde4c77bf5983f8f1635cadecaf7b109f399ef891604d4ef0b8bdc49d24011e7b1e4af79c34d0616aec06da2fe4a88847dca5f739bbd8c4dd6e4b196d8117f666534538ba180f703bd5cd87a9de0a50cdf2ed4b9e542d4ea9c2eba109754c55bd4432f37dba8708bd528a244e2b8aba7e8e56facb218391ca9dd29d8c1a58d7bf749f047829ff52998649f52ac76cf540ced9bc63c5fbb8e470a91fa0aba01bdd1fb899bac38c7b9e6c5f69591f63af213c2b543078ff3e29d02327aad6242511e6c91b37074a94ead1753546d0db25048fe2f3d10dccad0624495a3e1efd1687c9d0854fccbaf13e1e4892ebaecf2d1336681ee4f3888922a75424ee61d229f2f85984d187c9955ae51e6707bda528586b7e373267834dbf5a31332e640b611be64058e79f02fc4fa02e2e238eaa4cb725c471e9c0e5a48bbcd6efb9fb851cac9617a4da16e17166 Result = P Digest = SHA256 Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b Msg = 1d15d87fe7045f2a6650659acf23faeedc28b1bbd64a54f8f3bed617e3438975a6a891f4a08f99e6ef72c52efce3e7a15018f5b3aaa6bb4f4e8dcd069f75c06cf03799bf989f86ca4471cc0992a9010edb077b234fcb083148bedfe1d871d700a4c9d728f6bb8e9d0d556475b8feb0fc23fe2b56f041a5668957f6efb5c038f9 Sig = 1f1563cbb8650b8a7ff7f71aba6c06ea20643e4620f29e8d1aeb4a1be6f665ff9779ca9303437aad3264aeb0f2b250af32054585edeb44b0a913175e6006d31b43eeb9c97bbd679e5434e8f645b6e096320a5906a64264abdb9cdeefabd5ff61ee3f851484ec6bb0c7957d6db38942be1b3412aeaa7b0700028fac765cc4f03bd7157122420f1acd4828ea01cd32e0cacc55f43fd9bf58ac71961031f72024832191598ae69dc96b458a237cae0e3a81784a98a1b012530936529efe73d073eaf974f8e1680706581e0accb3a189d80dc71b051474e50cd9d8eaaf9e7be4108be1e7d8e6a89709c50c2d85034f0e158b208a205fc4b30922d0e19ca58e15e46384ec15650ff56b6eaef908b44c4f9d71250fd050ce96acc204d68c09493596ab2bf3052792226d60b684e516e92fa0b1585dffbc309fac46457c07a901e901dd659e4fbe4ec0b327f88b8b8bc689c3f678aac3519ec1f7392936a726b7fe4be534b27bac5a35a55e18fdeb08857850940476c14fa12102014872b81bc5dcf292 Result = F Digest = SHA256 Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b Msg = 50930141564ac38dfef23056b5cfd10efcf3bb8823fa6f5254f8ff45d4b0725a86076ac0b1b8042b0248006ed53d224cb08bd78b104f1c4b69bf9c96686118387b7c0cd193cd9028297a7cc27f4ccfb4281852b5ca7e787723d689384a68ff9437db319d86f12e2d7871ec7b3b64a2ed6b83722dd8f14b7f8a260e52022bef14 Sig = 65862ec1d10c408e4278ee1421e773f49ad426e368a48136d6f77d5a6de96ef4643ef3b8f7b451f9ef9ab4d8590752dd7adf1d78ce23411f3586564b67172ef718e8824d357b37f105dd0e38c0578df14220dbd83588c56c4cc658b5d4b07337ba3e40b40aa6d877aeb3cb95256d25e55b702bdb23026bcf05387d58ce020d359348536f9f108d111bf69c3823aca8655bd73a64789d258bc90b5006ad01c0640118e17aacedbc0545c543df8e05f254fb7d8846703723fadbd4179d4a1a5a7c371e980309d33b2d79061f741aae529d4e84c686a4077d3ffc66a8b18fab2f72ed06a3372efee4507425610d317c74d5566f4829b079012e2e066bacde53e43dd702fae3861eaf2721e3fc5818de552b5a9d084b5f03a451527fce2d3a608028163befb91ccecdcaaaf5cc357bfb698f0860350136b71b4b087b50e2d97a9a6765a6077f1b26e168b5d60b7a91330c3e1769adc479ffd866351eea4cae92609c0431511b91b6683d0d8d4d2a72be8622c7dd969d5977127ca5a6c3d0ef7ff77a Result = P Digest = SHA256 Key = 3082018b02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020400f1d0f1 Msg = b1fe0c7145b1e35a8062ed24ab82e862a0d695a53a1cc7430af1b9574bf2a40918229110dd8c6c750c295b9911034e79879bd631ac883abf1262c80a98de6923993a78ca63dcd434eb36340bbfecbbb73b39cddc008f2023a27d163ea1d64a269b1068a7bfea431f855121839c8559a2247821ae1e77a1f8210b4cfb4e226f9c Sig = 43333cc1b7da9710ad7f58a595078672be48dbedafab37dda0e1328e2f2b8b91dc88d2c33e0d8e06fdfa3dbc43e24d827f3ed31a994bf662225e1f0827a205cd638c16f38d664752d73db2c84f26d12a955e237f7a4d171a14d720b43dda3fa728d69ee0ed95869fc231d8f6fffe93b1acb81692ab9ff0f926073280a3bdd4472cba3b84541f1f9cd4508bf780e96c80b4a705c9893639f127969343a1ff9aab2b98d154c7f929fc55a5fe9485d1d9ca411131e5c0ff3fbaef353d49a9f13583cf1ebeea6209c123df32abcb311edc94c04e5eb3e1389e5011499e7d0d5bf66bb69ba7a06586d414b1d7cedd0106259406235fee1cf0b2bb2ce679f247741baecccff27c6e2a3a514d7aaebed281cb6381e7fa8d8a092ef1051b5418fd9886747c9194feab56eb975fe193076b474c2056d20a818a5b4ea56648ab5e7d4ddfdca1238d95da14dbb51e0a72b6df8d4e4d708a18e1828619c999525772400a9ca91c20229b1a979d30fa7bf7e33129abcc8d91f61ff0b8f2042345c27a928b7865 Result = F Digest = SHA256 Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b Msg = 89574c2f705f32cafde26824389468218712eae98268588f02d683f17ad494df8b53457fd24651ef0561282d3e20e834960c8968f63a57342a14a6f2375bc10bef6d235fc2c4eae7d7c088985ca6bc8b1ae8c15c4ca7c5d0b1769cbae061b61fdc2e4e98e8e2e5f89c87ef2f392dcc6e3a2ff98c2bb788a9be84cd111ceb5b62 Sig = 45c1da7fa6d790ac28f54716f23b2d594a637c5f6785e37fec8350e5d5334edceb66c263197702e5e5d543a2a9a6893cec3608512503ca26831d8847c2563c326bbdf3aa5edf7a583d8252e2cf35bb16cf30a0736ccdddd41af4b54729c843b9c675ab33d3ba1e1f7f63d2aa2ec94da2a9fe4eab9036b0561d5ddeb6d3dfecd1e243381de0eed5d41b8fd6023826d3bf4ffece8570e800c1689a57c2987a0f5629dac772c5f40b475ac61524c0308dd7de872d2f2d68c6017992ee060c607826db6f263f3276f330b7d267defe6eb91f9e9ca63e552531869f0b36784813991da6aa930736858146a42eac2b17c3ed2fac55ae3e0c6370b5302e693f84615e4174576150c6454a5c5f7a4f72d03630e899363db71eeb8e4e919ab6d15e87306c626dbcc18bfe62bfb1878a5105cef0f5b4f06cc4b6d7fc12f29e687ea9d0e16b7ca009356a2cda1f7b48b22e43883582cc770803f6c75892174168ac6954c76a475f0bdda4dce703e5d7737f7019a43ac72447b524a6132dde51f925fcbb9485 Result = F Digest = SHA256 Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b Msg = a8d283d3e616fcdabe06076c3368e022884108cf569bf363db860010955dafab0f4a0f54fc0c755982f87358d83e08a4136e15ea3d3b1015a87efc6e817e9908a86ed85bbf37912f827878bc56cb4e0f244b54af67530581848804e95b1954321b45c7305a1eb923658dfddfd497182a62dead66fc6b397018aa01c748b648f1 Sig = 5961403c27cac4677ccde42cb807477e004b7cc795f8e14049e78326769803f852175ad36d6cc08232c168a34e33eeadb7aaee642b6a75928ad303fb4140eebbfc2fdff5a990f8bea12311529cc4575594a56f6d362a6cf8623cf6580eae79525e502c7be1ae71699e2b7916cde5ab5149840ce8db96e839d0d507bcc3d6184ec68a99c30a1b562959d7873027aa491a9dee9094249e7e3e1913f263e05b6d892a8787686baa7ecb9a88e3bdb52a7e45fdf49bb73588173c722c5503bb5864917410da43ff55e85e4df1af4bdd3b913ee5ef8b9f0293ef36641a775dd4f70df95f157569899df3b7f2cf54a5e34575ff9f6ef5b93d00699586a247c2b42ddccffa5c88294b7bfb686970e0fb9a1e7a823a8b16ffa9b5e45726dd3bb015c88307062aab622fcdac7ed30b7c773793d3f7ce326d30535f4bc289918aace1feaa02c620be6cdcde24d694e7936c58c83f9e4bc3dcafbc542afa4daa7be014099173708452817dc1493d3306053e97fd1c258b062a982a5333925472eb004d82d8e4 Result = F Digest = SHA256 Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b Msg = b2a9f33308f84f8718e860ee4e439ba1541a985f355c5dabc3a8df343660c69515ff713e5aac3ab2d10ffbf4c163d13bcecc1fed1eebd6cbbbb0f46938704be2983884c96b6063633a634d1325ee0715cb36c06f6a8f5225473bc5ad517f14a201fc34bd843d53001c8d5e34c40bc596130082ce626f582031ee58e6c7b5aa3e Sig = 6f443dabd187abfeb167c7a76954251cb017b40dcd3c0de81909993fbdd6c99f64613e73aecc29eeb29fc9aab9ec54b55bc3539e0d34095248b5536b35f1a079a4f09ca2e83f51b07ef005a7e0a915be137e1d94ff2b26eda29a337b5b8d8652cb9f98703648a4b0d8c759ba48c1c37b2b76c3bbe116574c1f6265cc19703ce489186e3951e97e0d26230a82cd0b2a24def62b8af8e4962cf4e1a693d0d0bebd6fe45966b3a4e890e0a6f535919661beb109eb6d11e73ee2b97a3dd20074711bd4b817f442866d11c3fbf62255e05e466b36b8ffd57c6abe5592d72061d96435dedc32a822aa342b159ab21a993703b5ee7bd6d55508800b67667188810e062be554244db902947bd2ebc7f9e6c899f6ca1d3ba3a5c2edca8bafca8a5b54426b04a5a16a3c752d18647b578904f60a5dac531c95b0bfc37b7aeddd3c3564d0581f1088e85ed85ca366ef94eeb8f8d06b060f73f20778ae83bb884527fe9bc1a04d6dca59fefdfb9e14d68f97d9fb5fb1045c9a229d3015a4867efe88791554f8 Result = F Digest = SHA384 Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 Msg = c084bf63aca6e6917b6b46a4ea65bb59cfead64d6415d21de30ecacc538b2a65a19764e1f293e44a387a45210369c5fe9b5ef6764b3fb741ff1f639c12be48ed614e5ba6a47d296bfeaf1177d28bb13cd9ba9e4971eb5871381b7d2ada133c3327320d7a696c9f3cf493126efed5675cb18735907f219df5b6897f3c5494ee7f Sig = 3e81c4d40bddfa8fba559459acd314ed43381be13637b35d1f3856a3c881937e7338cca224cbe3fe8464eb0c96944a419857266bd1bbfb6fd5b156bd735f4a8642d96e40902a47f4302ab151825ba5b63d889ec54fbc100943d9b09658eeb654eef21f2168dfad01d2c02733fd192512ad643808fea2b1af43e10ba60c65548c82769df02c8d6cde973c24e9d92f31fc54be94a292ff2ef77cbbc53e970242acfbc40692a745208bcf96bffb862e1dd2ca3b90ae6f8be53fbc5899af6c7b4d1fcc530a34fe0856a0645181af615575efa02833b853775d252233f4c2e4bb515732814594ab2a82ba080e2db520fabcea260084627bfbe01af01e3774f3d8a6aaeb0cd80c901feec45d4eade1cf66cc878f190d3229b2df5b227dd4e03125a9a6d83a1580c0505e4a785ecb698e1ed0c83a2c62b48e3b44d3fc441364e5a8bf364a937e5303d16244bf016142d9841c04a52a8b3eebea3334c8b52108c7a62999801c840e98f30eca401772fc6b8462fe17c0ac75928ab068a16d5536df11170d Result = F Digest = SHA384 Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 Msg = cba095c8a79360b72e4a9f1211fbbb6f267852c4180d8a6f5eaca67a6947d71c227e5483937aacd0e4195b648a4b9c5abbbc7f5425b33b7bdf3ac5c1a07fa26a2f7af9ca1ad0ec50abf728c3189bbbccfa4127b5002bb470e57b0adb9f9bfe42dadbad25a45cc73c6a2e2eb923b5c0cdcb51706d133d9c5657b89b4fd06395ae Sig = 1390587a993b5f01af71c53023b9f1746268dc1486ee3466f66e34b02173781e8a9f971dfd1a6095f0a4ebe18324e79cdec45354822213a9d7efdb529abb6d1aaf8c86aba3f786f2412e1af6f392a9b2143f3c805d7b703e5a95ccfdcdfb4f2386766c99b99d90ec9217608ae513bafc062f3cf407a3bd684ed82b7b484e18a9ad507f75b066fb297bb19b1b092fd3741742f06887315dad3c30e3e5419caf0ffd67eeb9e986dde031968415cf33670402d35ef14f880b6d9e6cf7758497923c8575754ad3f9f7fda41a4e6021314cbff1a7f5b2799935c476e55458b2bbd61a32638eb45708d91af75723b5f4f4fea15f16eba82235f8c6f81d27c02242c5ddecfa5a206ae6b1e348c06a03f197c9a0ea3654435798abdf4908016709ac1b0cb6368b893b02a8aee9096dfb23897bea35ed7ba5cb897f50a6023e6d42355354545f43b1b8af8aaab8fed275efb57323e8963d32b1d600b55d5f35b52b1b0c937691c322cafbb32a54feb84ef38e221c9b00a80310ea3a1ca6e713277e6bc127 Result = F Digest = SHA384 Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 Msg = a855f314f00f48cde12b6f316f9922604622960e60adaee1d6bb6f1af635b47897672259a94c5f23100c7fe2b3c3bf33cf847660929e48cce51d9d9289945169651aaecb1e939756e93105729d3ab8340d0b2682945db878f1c7350b55847eecbb777daf786c582d13a1ea275685732ca5bf8ebc8f7264ada3bf20ce858ca3cb Sig = b360ac35950b6be6d9b9b604af60cfa6716a23a7e9c556cc2f3bc9b298cd8605a28225dd6a0aaf135fb56c1dad09b0481e573565bd13d6fcf8fd3f73ea12912ed4785093e3c12864e1d125c41ff4b30af81c6ddb4d9a722cda98e1095a2eab53a05d22ac1bdec2687c3bab14aa83ac9448c9544b685ef92f5aa3f02a2b8b7cf4607c68169e6c5d9bb4bd8a29beb2a2952fa02d172e3120f414a37de6ebc2f2f7176894938beff3666bfb852528841d9771708fbafd61a3f1410300b77b5efb7e682795f290fa0a469cc22cadd7e188a6a41c9ff25443850f749df159cb5748e071df8b5e0ff0e7d1517d3bf4e4b51263f8f76ff1e8114ebefc2b33dc3699870b29ea68853ecd5e6faeff01bbe8ea1595273ef6b0f0befc2d2cbe8b8c3c7f6a45aa1f905624d71bd649c85797a337ddab8d7b67feb3fa681be382f88b11eda4a0883e55c71bb452079f32ba8235888fc82b339efc574521e80d185e271bdded1df25acf2fca5acd1a9cf26ca30b71bb44ab61fff382ae7274669d5baa20d02a6f Result = F Digest = SHA384 Key = 3082018a0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad015902037fd99d Msg = 52b8858ed4d0a638f1694e25ba9d40dd27d5579f0de71ba54a8292a842cc59a79049f2e5f5ff603194d8f16962475c41d82e0b41eb00ba0d3d2341e99598ae7c8ddd97d48a12afabf15c96e99887f66a7befcb00b1a002bc9ebc4669691d175ab03c1c667b51ba306fbce5ac45a436de7ade3ee547101b39d3164831a8a4bac8 Sig = 4ffd27f815873946809b20af5e752506c39c881dad1e61ef880a245755ee35858578bb2bf826ab8adae135cdee5a132d3d5d02d4dd4af4c530447b4ee8911f57d29d1c88853cb415e0c9d041a30593cfd7f539a4450c4016f629d4d723450ca869fc247fdab20d2d34315d7292584961dff6e8726a1515c1d0f0ed1eb7ad902d940f1513d3c9188cd06ea8562ce5a288b501a80110011508c4e1e575c0dcd7fa9a7df22bc37fc6ab2183b0570fa5b53c583ebfc414b412f14ba2eba86e996660ecec5d2cdcf4a408b84f35718115237ae3e6ebc7489ad754642c25c2c60dac66379ebc1e4b0fb7ae3e8a5afafe83e2119269ae04465a55562dfe8f2139b2cccaff2668cc9805d15f0a8a159ef4d9a4f4f6a1ff8f6b272cc317e7089a8b9ec056978e7c65e5e8a234b1e992ff9b279852ddf70b5b8a3ce8ee14ba9b7a1ccf7787a9ea8c97fa872d0c7b29002e4548ee6bbd7878d43cac68ad58b37ce0310d37b73342033e98d4725b629ef5400cb389c95356e893259a7a2aadcbc735186274b7 Result = F Digest = SHA384 Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 Msg = c59a84b7b6a11b30d6e4ae9f4d745ac2b122ff0787f0e7a107c5a8db20654bacbc9fad8c45c92687686969901935ab17d73e08de31682208891d0b7318426547326ac7cfcb4a63883b6ee6783e2aa0c13fd2e576d62db3ad8f2894d6edc8c64bae629a28510e1a5cd659ee00c53a81e871485f787e29e2b9a14e0daca7ddb8df Sig = 7ae1169c0d774fa54ced1d2cafc75f64d46a0f154275191580feae3c043b1fc84ffb9f39cdcdaf2e76170da8dacb51c9fdcd3ccc4966911576823dc2a312afae8a502b6ed879a51a9be3a7eb8fb7f0ba96203722add0d8edd2d1267fc74be56b1bd3e42a24df1e05c5ac2f576713fafe6b105fd403589dc6c8734b07d6650c12d215b2378ad63601c4edfb7f4e6a5951112b7e9dab5da98c863d2f373def298e408110da2e21b32fa1f942df85457dbd8d3e0b86e89547471b86f27df3c1e361de5609b78771557a859901b8e2310cec7af6a889c9bddc61c77293ba455314375ae731a12589353fc31104613f51384cefd8eb83b465cad5ad275e64dbd252a1f602afd2ffd8f50216d5ddb17fbf9bc30325427ad02cd525e87744c4a048e51dad778224cbace8fca7228df229b3a9e84777c2b4d0aade9c831f51005ee51b700e10efad61099a4a5c1516c85d2851f42660290aecdf1952a189681fa8a74682002b69318b9a404973a5f139f2a6594a8e0a8cc14033f27400c9601d9018c363 Result = P Digest = SHA384 Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 Msg = 601f9b9b34cd3fe2fecf6244bb33a668c00aacfb5e76d95cbf045a98113c6598e677c299dbf18bdd781f30a05843bd4e8a3d60f336a426f3841505fbb9cb1f37a47045c63833ba6b7a1b3a859e9b3b416c66730ee9849a5134a6715aaeb703975db32b0893bc56f3ca6b8ad9d364a8a8302dee32be40bfde975ea79e36279a21 Sig = a7f140de7666dd42f10350ffed86802c528fb6062bb7f2e1544622191dd93f337d2dc831a7885c8f96a22ed4b318865b73d9a38b994410ec4464fd6e3ac496df6c8184382a633240ea5bd6069e4d6a1789e230ed38eb46f117b286ff7721b7463d1a7a4d7e2117a5902ef1a51977f664b81524c2e42a4618acd8a0c4a2af1e8a454dd229f435159f36b132a1579d922a5828272a776540ae827adec7aa8e5d06703956f90c0a5351ebee317b3bb48ff14ce392d48d59c819c6111b37914be142038628416209656709a084d963fc5e213e0847eca013c83f4f002712ecaeac83d3224af740c764bea479633527632324745aefb28b87080e16e1febd5c435e1a5e17245ce65fb049d01706f3f5682f7e8bea9bdda372ece37a51fbfb611b8fb58c06d2c0ea37a6988a716fc6e38da4e09f66c2f745e1b51180e37deed1cf6bc7cc5edd6e149489cfe0045300390280ff940d762e0d866f5f9da73496d666a97c9d2f4f69ee3a51b77641e7faafc409d03be7afd79649eb293d61069b4479ab6a Result = F Digest = SHA512 Key = 3082018a0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d5302035a75ff Msg = 32e5485f4834ecff046b3f554de9f9d02aa8f95b2812d0d4fd1683c06a7a8d3d667324377873bddf6542d2590b50e3b58d4abb21b0ebf45d8515bd6f4920db978972ee85894ff6cae7f3158d7cde977f83702f11fdb583e45482eb803ec1764ae4092fb044729ea7d3a79157673c1c145542de91d6198650b086965d1205673c Sig = 4f8d07925bc0ac7e423a824b1439cdcc486e9612f54c93f5d4fd34f64ad67369b172388e06da52ed100d278c77d6efecd3fdaf56d0a572dfdb978b9449d90951494809c2e88b4a25cf879967659db47dbd43656182958dfef8bc9c54c3a4d62fdb48066735ef5aa39cf89834e479a99e8d22700d288abadcbe28c6667e437515bb47c3d1662d9556ad98abc81bd1ce1b8990155c369ef3827e631164ce8d710c193246bd625692086d0e7f239ce3aa9d6b8d6a5728c64d24992465935aed196ab1715f88bc36118c52ba3cf48cff4e61fa0080282645cde0fbe9493150752093054f1f0889ef7a55c5814d6cf667913cfce4aff2941d1999dcaa5525bd497909839223759c62fdb1387dd4c84f72a32705ae7fa14512af2d7002b315c8c183f0bcaee254ad976270d035fb9d2f4cb22fa2e8a2535d9f345511b22391171aed821e754922b2f6c797debc339264fb28a9788a1d385f99a0333ef388113be22c7b93e18cc80b3a91d6dbe9dd46587544eef85335030a70ab73283e539498f2761e Result = F Digest = SHA512 Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd Msg = 6de2659492e82a0541143765c7cb73d457c9b695b608231137e3b81fe97b23820f5ad7b3d05660e230b8f3373f9e4a5d909eaf41edac5617493eef9ff6ae7ca619df60cf5a23b993e05cf0877c628fdd24a5522ea4148077903d7b617db596c570ba286f9717df22374856dde6dfe95dfa26c8e341064a37f32784ede4591be7 Sig = 1ae7122bd67306b4f3d0c3c25a6d3f3318b8ba13c64267f1c4264eeb974131d51566fbc71108873b4920bd48bccf493558b63ded97441cd674a3f020e1fe2fd09e093a18e654a4a379443394e540a53f5c24d67cce5f15be955c446ca872b2505a3b07be1fec5847261e76cf708dcbeef8db95a6fcc87bced3f7cdc1f524616fc0539df58075f818608fc38809ae8e489a35d186c8053f9cc26e869866b98347f888f701635df245248f29982efb7b05e80787cab12cdafe54d065b2ae3e0bb3a03ad0a727d77f6fc3cec60a32c5af590983d08b0d2d0a51dc50f3a6bb2f9786d6c77c37a32c917b91f5b29c65a6911a6638222256ef04b4bf76269f846db847b29d9edccae04effa28e357a76499389b831d5e8dc7c42036bc4277a71b4bab0edd152ccdbbddb8957a3bdbbaf1e4cbfb2b8af678ac7706d16ff6bc40c4e8fc4cbb30146f66b8e035363c935c5c72d78fafe2c8ddd4f0793b98a71a6b7ff6b6892c7ec193d1076fc243ac061801a72cdb78ba2f1c34881c6212af2a7689ecf51 Result = F Digest = SHA512 Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd Msg = d9fdd81eb8d725ec727cf671386e9c4d7968b23e4d37a39414cb6de55a8ea401fff5b92894547c7b07f6e0b1836dfe0b92275d8a8542715f15a161a34a400e489cc450505957823c46b242c8897b72d5c6d282a78927f250e44e126c59d50d0ff99525fcce87401877d9a41e1241ff935f92aafd218d2e50c8f908a94ef6a93e Sig = 9658a72570e4ee228863702a79115dd33a0d562762306cc603ca2c480aec784df73a32c067400e5539c68e34fcbac59457b0d89e6eb6faeac716234cae40a5a40593be11cbc9100280663007ae815d4515210f2f6220a09582fff1c085ae1dbf7cfa9ecbd3113b0f1803c47c65893e8cae0802177aa0a056007bf2863298cf172425c61d4798cef950e632f1f6d7618521dbd7aafbec3cc3e41c3f4bc9e80e437e71b4d6f924b15509cb355fa2d9e91176b861b81e4eefee72e988e7ed8e4eb7b93c4ea35c28332aac9de918e49a7575473d9cca1f117aacd06618a1fc9e1c6c6f8a7b0d4cb5d04187bfe930e4fc5a080ada4888e6aa5dc3e984c7841a225c50fae637369150863294ce5c0398a0c7d045098c644256ddea27b63b921fd87f86ab719962b71b5d8582a91f762cdfe3b1b2c714dda16dd91155fc9b5be378bbf2635997ad8effddb3869bf0cddbc113cc97d67fd69ed4b7884246cd18f0ae3a63c2db35ab7cfa4b73777cd8e005d6e222215a4d8818bd6426c4adc9b1c69565a6 Result = F Digest = SHA512 Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd Msg = f5277358fc0e0ed9c50e381423ff803035d7107e961281ffd557f42625585ede55fa23cf02b6e7dd0b3ea0f24564f0fe7038b33c6a71d4b6a30f640bd13eed70e57c03f53dfe1d0a1b50a341563d48554fee9a6c2756d7992fcd03a5a0fa370f8df73c5115b05965dd8c6888be502f3eba40ee96358735af61d8f87bfb56e5c3 Sig = d261372ba60cd5812e0230d6103e1f9a777b77f8bc9de3f27bcb3d32e23a60f56f4631350703e200ed9a97d3e2d397234576c5f5c1a347101f62142cca0a53ef9e2b22e724c9d02e5bf4fac684e2803e95640fad841aef7626bd6ef22e7a97ffff31237a70118504ee8bfa0f0e71fd80b195e8221a296d62fefe991e4be69785bad174ab44728605a3d1c41918d33a60fd5a002465ba7b02341c30e6b058b47cca3f5c8a289f5ea3401c2dad9b32ca2f3511538407fa5c03045528e977ce46c8dce655f445588d4a1cb8cb5d76e84776ae86344963b675a3428ca717e4f940ad29199cbf87d27334eab76b878bb015143bc2537fde09a8aaf2649ed29a5d09570959f011778677177e4624e0ac7d9146a2493d5d1299a408b1383ba61df26415d64bcf38e1441c4e0123dbc5ce22e7e077cf9eba5d632d308c23654f0453758a984700097044fe48c61f1873e5a3274c7d5cc7d68b392e26007a534cbec0167760adc5f8b5fea3e2e949e963fbff9ed89e844a3ff2e145d7b4b1193f724aa014 Result = F Digest = SHA512 Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd Msg = 4ebfb0c3c540ba37f357cf30a2bc9155305d091f7db0a3d608477abc54a5d6889150f3157827055c77f678a00e487ce8797cc1b28f1b7fe6ea69ba09483ac4b331070343da41f4d14ae57064bb512f6543568a54b38e85bac0f00c5f60a17dbc770d67b3b337927eb44d3fe67180b0b5d713eb6db3b1bc3ad103f9266582098c Sig = 6c640306e33515434ee5723d46bce72dcb4c5716311c9ad1d0182987a3090c1b4de97bf8c7323cef9f7d36fc0cc929b2bac1e7f6b1456409f51656b9ac3b9290fdf7910f28a2d0f72e56c94b1d1e5a76daa35e62c93e373b6c6b4435dc1394e131af3c0658e41dff438208bf6b159bc54f5dea67d04e0f794a251256f915e8f9770815c8d89ba123e0c057bf5286e95f017e65492904975b7d493286a634fbf3163a18adab3caaea230c2766deaf36243a37085377f3db5f091cfc707805cb8a9999a06eb3b931bbce312bb2ff53230fcb0c920a816164afbe947ef666617e39ac521db2156631b0f1ca24daee37a521e938be66d36a8819d2c648db87914cb7c7db43ce885d1db4b58b99b3c0a35af19c9cc4e0af21db9d133cf7a2699429fd06faeb3365e18cfe8d14295584167ce708a047b2eb3ab1c25bd1089c4fa5f9ace5ea02a8e7a5f170c398940270405eb6fd2382733247f4c3faca94b368d9e104668854bd3b3db5a5c8e9f63e5547da813ac8ae5b020013280287832703af91d6 Result = P Digest = SHA512 Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd Msg = 6739c2996ed518592cde7619a0a5f361c09c51c36a738c189d80af0ce964ebdd24ecea5f5f3561441814e59ab2b4ff952281828fea451c4d4b912c84b65fd39b85f54eb3e80d83e52232d9caf56d4d415a21c36c763499fcca6f82afaa289216f01e959cf1a4a5c4b002fcb2521806edd244ba63f6862bae82e25a95ab064fd6 Sig = bd4e9adfdf12d10d9de2d3c1d5324cd2048a57e0cac12ec5cc054f2f4c974b5c5dc3e8aca34a2a7d2907d3b930faaeb194f84fb6a9e99a2a7762346545f70bc384181b0213767f2a7381565cf4a17f3fd52c0d107b12d964605b576f2779411c38129a99300c902c28336ca76920b6c8e52e1c366fe92afe8c7c0ad93f38c07a9fd83926c1e634e026dbe67ae1f3df76a9bf6c75ecf6ecd660e68b0bb571028504bf233443e238aa573727713d659bc1d15171baed4d962017ab5689ef894802a65b4d522bf3b377aa2d3a42b718c8c7f205cd4c9c4d12f4fb2657bab0460c22737a5ee6524e96430493610178f19eb3750cb56f27e6088d26424ae13e863f410c7505899705168015e14ee1c5a1d4112b097f1e0f9dae32f64b75e82558f8f41bae65ab7cbfc400cbc1fd45601b53d26abe2f53a6ac660a7e940584e7fa90a0b8c4d906c46c4bb3a6eeed2327ac4409fd28b77b24c98e5c5f14a8e3678f965c46b455b02d7d0d58f24daf5f7b03362554d6809da7a90a3da53d81148eacea68 Result = F Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 Msg = 711cb316a158e229d3c4d2f5d6c7e5aa29b4ade40e95a188df2715eea5256946e7c98034c09173be343f8768c4235d9d409c6951dddda5e588ed874b79f1306a0aaee6c4ca4ac456cd52b0bf47028ea559c0b3552be99da93bd0e12ff504648783d2ce0de60b3cb94608364386eae08a1c2674362042ef9ca2d90be341e56e65 Sig = d3c03e8891632b8fd169dbd4ef4a51f207ef89b50dffbc23fa2d941491d8e185f3c743684677df40b18b0d8cc712ae61a3027ad5be4725d6a8e7b242b2139494bbc5c59a0122b26e0f9afb8df76db8dfdce8e9d2c38818bb0140a41f9060bf23e6ae364220eb56e3a62eaf966873c14dd82bec57876d43d1e07197da109fc009ab8b45e48ddb7cb1ff34ef3fdb3f4226eea8597c5c59ac573d15183489ee52db3af1c13feddc9357722978e4172a3bb26bf2b2b537f121295c00151e1629e28cbddd7957a595cf5effa365dba30698d8049d4701a4dcf03e9bf53e4ad449a7aed4abb6cf65ebd33cbf763fef760c1fe178f5d748fe37292cef145d61cee1dc02bf1655516a5de3168dfbbf4136e6351d3b8313ece067edbe34b1678ea34387636506192384489556efbd133a9912d51780d7fed8662ced97a6dd49e423da4b0019fac0b83e96862eb302910284ff2eb190ac61dd2159ee24e0b233eb38d383b4ff6633bdba58d85cb81abccb072ad716eda8b33b6c8ea9de43e8bc184f1882b9 Result = F Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 Msg = 1b51ee87dd2a4715ad8de13b9dd8f46243d37bae04e392d39380232ab4e8c1044615d43e80edf7157bba9e3cf0d9fc2c44b624bcc1f86ef127f81c1763783d109e92d2ed79ee30bb9738a59f5dd15e26f5c588d699feb6090eb783fb6e3378212bae30bc5194b9af0bf13e8d6928e3f760e9f125135d33c250a3a0fd5e8039dd Sig = 397e6e6a04b3fcb3f0379fe1f9b9e5cf5c6d433e383b688cced0a6ddebc740b8ec0266aa5c7e89d5ca77c9a020716dbce12dc044c00b3b1b23fe3419630bbd8bde5c9883a6d26232fee11a81ced86ccb338dfe46faa3fd58720b80f305d40f1966c268c56d92af05c4f1bf66e6d1c5c810fedff5b316f3b61089c8ab9a4f2b4d7a46bab1868008ff3c0bba9800634c5781cfd7711a9b51f41b517ea428a9b63eb36609c763cef555df2cfcd25e16b8b3c631fcc12ed78904111188908a21253544a8f9fb0615570b3f2453a3214ecfdbf44f403d1baf0fba84d17527e7cc23e15cfe047f4fffd89bbfecae01cd3ebec787c3dc54d9511af93a3b37924ef9d6d5fc6e147dd9e91a39bfe101e3e55004f096b9b889e95b4f1fcd561ea76ee6b19276e8a26aa3aa3eda99de7ee48ad1b1c907cc302e909e89f5e3dce32657ebcdeef78722b7ac95a87930facd56e9cc976b501edda38b663d98c9993b0139032dc95fdbe4a17a9eb0e82c40402365fb84c1195b039246cd424233c88fef251ff77c Result = F Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302036ce901 Msg = 45d9c631cf0813fe85c7715860bc3a3b38f2a41a8688a12e6ea6030dfdb5e47eafd0458c3475f5d97381b535d05b996faa6fb16b28dee97536732ed5cadad2a46c0c32def50e96b897db58331d9f49f1742550476b935495b7555cd23a57f56b8577d54e9b3abd41f7bda479d1ef11689efec9d6d60faa33f932d72cd495157c Sig = c7958952aae21c256809e83d7f1833e9819d3b4e4cf562ec71bc0effe7a797d62e71d1937a79361d1cdc9cd5726207daaa9def6249a0fd3da6a23683fc8b084871325e07223a3317868efdad20f52a0330f369a0ba51f0fc098afde7d2b72b7f2faab6782cb663c4701fc07bd82fa6d4ea77205a7ee8473a9c8336a781fb64c03632c52e6c1451c3ace7674d5fc9f26e8613c12137977511484487d9a8b928666bbe23cf0eefc849d9e0d0c125cc2ac42f342cb658d164ae57ab3d5606b8096fd4b4c81d54c9db79c5db70106cc474bc64ca73b713385dd9539329260899054bf6f74a45fd5363f78de558484a124a113ac2d2bc6fb8ed19730dc746748b62818e6e62f558d5d9fcbd2c6f4fcc70db6c7fc5c22524a89f04229def949379074e7220cb4717d6407364062095b615464e9ce9c50f53c4358d9f80ffbfe70c15cfd2d9d5f0b451979412f3cdc8f9619e189bf23e71116eb3c620c8f0740b890bfbe961f6cf8854ac6b2dc4fbfd62b6be3bfd1824070cd46b1002b61c1e572437af Result = F Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 Msg = c58629fdf3aaed600121e5a109ec1f62b360ab46abcbaeb1535ab2d0b53a40dabbfeb195a241411bac8c65de157a5fea49190f6a54940c6e9a0ff3ebc8d3ff030aabda877f8db3bbea7d9159aaafe7d8ecec68ed1f361c53a8afb4c8d7b71b581a554ddd71d86cc722be1119aed4e0b4039f5fd8f3fb08e8e5029c6dcb2fbb5e Sig = 40ea4940619e7611473537ef5b108f9e1216e2ab9bb7fd45cfffe15e70621af6590eb571f9be970d30e5df0dbe527b9a9ea70e259b964e496735177d417de3291d16e0b055cc9b8f4dd5498bb7a78d8882bfba624580d81ff0b76f6a82f9a15d2c28cbeaa0e6c02807901838500e36cb403acadd6e431196c794c0bbae65fa6b7ef2ab4c58c0fc7f3d27bbc14dd7699d7b0fc42a3dd30504f7c7e71d8504c23fe08a05e76c8061337687241d27a0ba2411619d2befd66a00d894f302bbdc4f3ae7a562307f21cc43c377b084d8521e2f3d27315b5c8b494b5178dab25fb3a8ade194cf3f909e9f29d888f15a75d26d427e7a17edf63f7f5dd814c67433ae7e15f668637579a3b1d59c73f153e094029e74b8966a9a4b72efe0d5d0e7d9c44c63de6d0dbf00e76d459c3ded35165eac8a76883ced93359c34fdfa94ba74bb58464770051537e9b71f16f615d5615a7b8d380b4bb9ec2499b255ec17131d2161d10709c357687728de9758cf5a166e81fbc086a2e20dae9b99c4f4f83c5edc0ad6 Result = P Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 Msg = f7653ea73a08384cd5dc0f14daf59160b94ee19eb76b83109f3db3cfb446fb0febfe04a45774adc6e5385a1149798ecf386bbd7ad8eb5b7d7566393b75f711528ecf602136da73885ba0c5ee5569888919a482d9af891a76e6feb30c46b738a446a2f825bf82b51aa1d9f7b5e50ca614c2c2d8c4248de8845accc84b0ed0988c Sig = 4ba672add725521df81acde1e1efd18d169ce4e04cb55d39fdb2c6598250e0c7953867dbe189c327f76bb6afeac0e013853e75829eb50635622c26667d55cf3bf81bcbbb94e5c0fffbd853e2d7d536659b1ca9105b777d6fdacf3000c7c287e484933d38e2c52b301e01a3fd196b4960b4d8a983466ec376ec1d70bd26e1d4dc707a87ccb32a4e12f56d00d1a8f9dc20794a59a437e93fe5c79a1ecd16dbc0191589b14c30e5187e626a0038b6f2396bb30c9b4c73a5b21db2128ffe67c6bcf81b0ccbc68a6fafb94296e334cbd28603a4f44da05a4c5d243e30160cd44f08aaaef7135632dd50830010bcf4b5282cc55e070478e51bdc87ed68534b8133876222986d525ec26624ad87e4a6910c6e3caac92e32e2fbf0945f8f1b201de5ef522aa4e84e06633ff3c092f8f095783da7f929013844458e3978f5e7679b633152a94880b6ccb064e5093a126ccd0435381908df6b4c84e47875edf323742429b7428bccdd889d602085d6b40ac2c05c705a91b41a9081586439cd178edfe7f909 Result = F Digest = SHA1 Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 Msg = 0ad50e46eb42d8f201ee505c91168bd00494cc1945b402f86b4491ce98ea559c20bbe42dee081492247bbecf0263c1d4094d49af60d451ff76ba66ace937aed5a7902a0a53ec38bcea645cf1a6593f3c220af8edc0658b85481eaf6dd1ffd5e7e57f6544e0954b5899ceb22b449e0ff197f3623c2c10b9712799f57818ead0b8 Sig = d4abfe9247a4fbd27668d0ed8473bb4d40eb5d5ccab3fa2dc7662d52dd613c12335fd0f13bc99c34d6966aeae422a7e3c9a2389d80480c9120eeabacb884ddb2906ea80511641747229e0a07c2ca082b354a0a52debfb93e1ffa19787134c8d7b8f81c0a07be5cf421fbcbca0084ae5b2410771f06c4bca56a920139ee50009ef879631609f0478b21e6548446752ff85905d0c5a80414afe6021a3ab737f061134f8fb390b030b1e6a1a016b8ec34b0cf3b38cd1b023ee7dd6840d459ff83fb2c6b703abf646478fdd64cf0347b9b55c78f2c731cf7b0242de2a6f247932a5cfe1391d7d19480a7945a105e3088c3ac5b72c8e422991b0b36e3ecad0904fdcb42a64271840dcdb1625760361ce81f4f68bab447390b691bc63829f60af23a77edc2cf97c071f58cf8a7c414ce5fdbfa7a6725203cd54c3386c4c85cdf17f770aea7e79de4d8368fc68b6f6c024bdb4ef9c346e0d78494f7134b0e9c651540dd2cf8edb5812a5f8d9943622fac67d5ad8fecef405bcfb16ec1fbecef8bc1c787 Result = F Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 Msg = 897bd083c89256d56a247c12e265f3390962eace1cef2f7504e197bfdb7ea144ab3256f2798473a48247caf6c415e658c0f9ee627f6ccb68d3838d4ddf660b9cd904cad40f05210428009a98adef9a73c8e0453e4bed9cfff36de8edef6c5c839c59f6d393ffa61de5b7b2a0a5db59b0a77db7098859e863ee0970461178da20 Sig = 7a172ef111b0f2f9ec43bad8f6e8fa11e19222ed9575571716e55fe46b43aacee433447632849e0f486744054e70bdd98863f5f015b94ddd1571e64f6b9a26302e151d4865423791d596063bfad7e3b5c5494f4a3c5ed994c53b6d915824a1f1e8e3639f8873f9095a7842d88817a93bc2651e6ba94acce93830735654fcb5a4a01cccc090ede15ff5ed745a92d92d8186a746a693a94db4fae34db26c6ad0b4904c63001600947ee994e24da490a3de240e500b31b8be8b1b415599aa684c77116f12e3cb218cf388424e3276b1a3622f1c4115125f5af47d581b78b609a067ef5f33549fadbdadd098dd2c337897f113c8eca9a20f3da69aee2fe4a89bd3ff73eb4e8da271065a9013935731addb3480f52d07fb3a91261d8a030ee2cd9e0ab342b3bd62db62e359475ee9a36971ba37f5c3ae1f1939c276980140961e9542be9e0a4739fce668549fb606ae18774bbe62b20148dee0379f0f38fe982b25bae164785d3410c337b2f11ea74558d79991760847109dc0c77272a55afb0d3f58 Result = F Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 Msg = 77ba90225f3ba1722312f52b1a07c3f659aee2a085e939c3e5ae77a3bb0a0456d56637285f0ac93dfbdf89781479529c6e543ab1025e0daa0ab6fa4458b48b31eb29db76c4e80312f685d5e0fd5ccdbe50d544ef3ae7e7bee5db6864b853732ce28ae4d537dd37383c8b3f2b7db91ba427b96722d28baf489fa429cb83efa38f Sig = 1f442887263f403f6ff9b20fd2780937596e99e3c9e640def7de2006f14026de1e140e0cd5d45d7fcb1f42a9127a661c87cbaa4f9b600d8ad7fde5beed5c125294ad7b211d550bc35429c71f84a837eca906a580aaf3e301b46deb59ebfa4b66323f6e136d178f7ecd8440d891eeed5c91ed785ffefcc725f2792868e296a8eb03c5683ce791b554636a787d579e3db81177b45aee1ac6bbd90d84144a706196d557b48d7fa8b551c3bf638ce93a6425eac03232256f4cca758ab2c427d996702b522eca24b0781f33aa2b61e1256fdb94b166f98cacea3d5da205f818d19b432d50309d8265eef151b0f40fceba927fd6b5ec9d1c2ba54eb9af22aa354299ffad07da5071a1fb4314c69399a5aa16c3b4ff3b61937debf6e55b5f44e91855ff0a64ab59f549c3b4dcbad5c4306b08be4b1be99d000ea52665e9bd1983fbfaecb15ba18adb3e88bb9429d6d1aa85f7f6304c253692ea0ae579123703f9d89f69669fdd4c12607d8c1b7a28f814e75a45122956c21cae47bba9e4ec1afb707e5f Result = P Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400c15efd Msg = 34a83157520e0413bc2ec4b48034fe5cc3fd2f69fb7992f95e5437ad99d555aec606e1ee98155fb1d9faf94b175ace2b9aab8c18999a41bbada96e5e851d5ef3dc17b558a8014cd9942b3cf7b1b6396768b2225eb483d50c8e894866a800d6295d24d61ce8997295d50bb73eb612e819175818c2b4fdf7f5e93aed4f69456559 Sig = 7a1699fcecfd4d337bcc6f4904d2356fff44aa24fd4a0324945d4a4dd9a9a552c59239dc9268783067477dade944adf592495a3b1e5a6eea7f58762ec4d5b0f3515f3b1eaab1273476cb0cc3080fa8c7d2f2695f4417a6dc538b8b2c58bfb248b7c41485aeb668a0a39ffa324f25074c75c0ae1c70496a4a37c9332fd73ced1d2fe561ae120c6c19d1e526c211ce8869ce236d06a9dab8f9ef453f8854cb4451033960a62fe279830667845edd5883734e730e50e7bae3bbcc619e5c4211ebf741ad2526bf0226440b7d076faa02a30f2c79132443de9fe9e6bfc12c65d1ee703ea274c06ffd5cf945413cfe13d1ec63d48ea477ba8c60a7aacc078b988cdb58691911975f26e1b33c2c0ff3e5026d9b1d7a6293eb330ad5513efd19937193b796c40114dd1ff32a2875963020f26177ca1b6a7d0c6a40a6c0be44b03555c0f4598f91600a336c73099fab278271c46d96f16d6882c00d5b3ba59f2a0bcb98f39b152c55eaee62a4eba026234f15963d7e7395de927e94893a8a175c65f0dd43 Result = F Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 Msg = 72e970c5fbeccfb254bb1313e33470e3074dd8d3fc60093fffc7c960b2a970c3c113a8fac64b71916a616844cd06486e29a1b1c5b2a02845c00c606a2f61b7a2069c040258959038688f62c1100ec05c64e9f2be929f49870dee6075eaa2a2d78aac0c457973348f966f8bf374f3df93014a2426650673ed2d9553e8a915384b Sig = 6ce37157a92a7eda47c16b5b2d961c564ef7df9d5886043c07abbd1e74ec7f549c78b07e2140207e6b93e89ae69a74a5a76184e00ec03f1dd36c0699535e0bedb4f28634b194fcebe13d2c4955e01e4ef459244a7497fd647d5e6dd5f7ec156929d0e2f1e146d3397d3636726bbea13b38d7d38d4a5e4ebe68df7ff86c62c3802e18250a2cab3d200363c577895a33dc69c18d15309e7117ebf47b3b98c893785c99dd0077982ee084b4ac08913de46415e5abdbd223aca6ac5574ff4a61f5fd7631b776113f12044e5e53960a5af3867c8366e3367a20de73e6c4e0f7b9075a1a79374aee0232d06280c53bc6a148026e1686059d652d96c99ac41f909e278b3c408568adfe35cc55800caa58d03ce9f1cf533018ec4fcb5d66a50758229716c2abebe4b3e3c6ac778fc008db8985e5032d7825fa333fa4d7468504cd0785000f92833d5cdd61880bf40f803ac298343d75e18c003a8471e06449406bf1bafd988e162b0b8c62eee5795d957f1fe5d7abc6e7c8b3b43759f212d01def9151dc Result = F Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 Msg = 6147121ced1b5f1d73306e4a22c31669b76c20764fa4b4467d86126a9ad283565c378ec3aad26e51aff2c4712e1e8a821559483a54a48a48efc5913752474996e6c27b56e15c44736290c6d7bd2e1d7b13a394cf277b195c6c24efa763f5a359236e419e39c2c7cbb392da4378fcb89bdbd46efc6f314bc91c2c948272e479e9 Sig = 8b5320215e2133754a182f38444a68fe9f3cfdbb7ea9d8e55d006789fb1d75c0fbe5e94201b15c97613a35c3ab54d61dcc62b978a8fab0ae3183fb7463814ec498eb0f4b0f5403044f33368afcf692b1b3ee3ef0ec1492c5c2ec370d75163b777705a0675252908bff8010e819bbde67b86b33a35e1fc43cb8da167691b6d69ecc19ae094a5461cadb0e977ea6b7ef6f3f639e4571a073d6033cf464e5eb17323447ac079e4e69caa7966d3083ecf616394fa25d2e30ef4e5b7e558c8c46802c2e35db02b7884b53b89f041037bf10ff30f291003323112dcc6b8eeebde3bf97e373305eab433061e3a634df865642743908ef822df62cedde8f4af403e7a924e22e667734e91a29d4b6c8f1c12da7023a1b22e6a3dd33e878efbab31220f4f2c923c88f1bb0d7b7497a9c687fbf59f9eb4625e6f92d7285bca5db93ae63213e3fe1333801fc3eca1d3a1ffa75319752a5aaac461d7a799659ad31569230266c1a62e787c25fa635b0d3aa248d047d9cee43fb12342a4c066dc971b893a7dbcf Result = F Digest = SHA256 Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 Msg = e9ba77e32581fb11b3d44a885ce8184207a00b5835016418cfe6e25921f4e30b26d1cd120691ac55dd711d11bec86a74f83af667972fdcab2e83d327d48055806d0900eb2b173c3f546a1e4f45788c76b7aaa27341c755771eb0567d314f39da46cad7159bfcf1f89f2516e7f9e0c671cc56d72539b218a726d535033e4ada40 Sig = 17c273523709d84746ae546c8f58086a5ab385aade0707b5b39adbeb507670453a56bd356a9b549fb0112eb3be73466294c0180a9061b04128a001f62025867277e28508fd1c94109061184f6acac575737ec4f93c58ee452089e6714c4dd9f23833278dc66332a914ac8e1b0ec33472061bab9c29cd8d7a0c1778c71fb973c851b6c9bbb7b7dfd24a16f146eef248d1aa81e4f62cafce2ea146314b2a8d5711de6625011ee7ffe7ac49b03a5b7e2d842e9b35969a934c75d16b6cb890f8d4ebeb6f74a08059e70e90ee39816cab34c4702ccd4e14718a8ab5c981f9c8f7cb3e91bf066ba387824c1b27e33b27a06d9eb3ff3fcace0b285f51cf83b117005bcc12da946b5a36e9308ac98e9103becc8ec5dbb048df722e5c8e6cbeaad8f2e27af33648c9ce5d7940013146f5d3cb8c30849ea75b209c36b745dc3179617933e22dc25af5169f784d6128af2c8694b5caf19fbc0585ca1780181150e8f8bbd8d12ea8b0d41f86b1b3b27771b3f36d3cf5ac6a2702b8711d52edc1cc96ce071eab Result = F Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf Msg = f17fc496ee707a1bad8d591e059c1e37bf99e6df03594431116d91ed324983c2eda601cd7d24365d8334e5f9f935fca467dd6b5f59db36f010bac9e278098dcd5ab9b8d7d3c6697b051af4890cae7a6e33f2beb6686f33cfeeaa5a10524c4af9a08190bdd69e3afd99062fd7274ec21f8d9f86ec1a5c63571305e97fa85ce5d1 Sig = 3ae65cccca0d7e3ffe189b1631aaa79a70bcce76156782790bd3b6c8ef7585b15509ec5400ed771f8b8a41c001257bbed0dea39a3ec68bffc1395849d44e0f4b238c7305fbbb0c41b0ef7c4b86fccd363b057886f504f971d5a072713ddbcfe0cd6953c0b9aa7c01c651a89b5de9d689701fd09fc609f098f0e758932b186c10555cb48ab6c90b3954416cc50232b427595c4acb19ffcd97c806b23c504071fbcfd2a5ce6cbd097d56c5822ca788bbf6fe935c2caf33e8e69b77b35e6c6c077781999e146aefa448c839f9293c6ff5d7e3dd791f34ccf9ee5f358890b59a2c387bae4232267ec2f8d3cfa878f507184e3093b50ad891675cc564442d99edef75bb86fe908f15017da5d263fff9d50a0b1638d5770a3db54c2f957d52b9d6515da3eb893ded69b2d54732a1f433c78d97bfd63fbf9d2b2650c18a95a07f629a7f0505010a43dbdeebf765de8e0c85eedad07672bb6b627eb8488f8d172ca6f95aef2c3250d3d10ff10ec2c347a540827bb57913f710d47e31aeeefa42cbfc6015 Result = P Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf Msg = 92394393057dddd26253cee4bcd5d9510b69da5821e95633e001569ca9d8768f17f23952ee559fb34eeafa912d27fd9d04eb1662c7a9fe831bc98e44c44bd44c5cae66aa4b10f615f39627782b0e9faeefd35d8955f14d1ac38a1a2c60794412c83472a304f70982b91ffda39fd4e80a35ea59d6b4096e7f410ca55c66a8ef68 Sig = 5bf8ea11a6637f0258d7b66b9a77dfc1b7d278e6e3acffeeb06a044a2aeeb041e83feab36f27a7cc416c49cb1e086dbbafcc1411dd5b563e4731c72466015e781984434604c8f455b96714911330ed9eba40bc0fb2a38adde08db1035926225483ae62c3b90af042cc3f49a18906ee749ae6ec85e86a73e4d8a451ba77b4b11853dccb173ab2049fdcbfbf568445eb3ad539f4d4ac488cd2a13dad7d3e0dff3f92a6879a6ec7905711ab83f5825f7eeaf6a99a9c445b9edecee786a88d829f70366bcd382971649243643da2a87d339b3c6782d655a284a4f4869cbaf296453a2fc8a96dbd29a5d2298561dd6595f2c6a30f0c9e66fc926368759a0792c3110ebc9a9c90bbeb5c6fff1b66ca57ead5e556e98f69138ea792701c572402d0db36a1161c3f129832bb5db1f49b21e9476a02259243986e6437a437acc7eed412cf47ee2034474b5e4391815291abf07a2fb743a628a893e4cf43a3773dc7827aa5c0bbe083e4a59311f5e1d5e5c0e7704335b7d93b76d46acce9496fdb6ffa4fda Result = F Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf Msg = f5304ceed3b78326d2020a99a63f697c40ec35dffe3ce53222bce1078336dc1a82d5648e408bb7790eb0d9a325ece38b98569eab86dd50fd94e8d6be9a39f3729d17e828feac45fff0acfee92f37c1aff001873613b06a00a085b6f5713f42642c3c014575e2d4c1613da2f42de9abf1303319060e7bd8422fdda8356f1071f7 Sig = 3dbf093e71870bc6cf17f01719dd3bf09b5b128d3396eafa0b806611d5d5dea961c0c1678ac69bbb3139b0aef0ba6be387cee84b27f49422b7c9616b78f58892eb132b40e6f1dae7226306284fed9174df4c36cd0ec83531cc1f854fe3edac489d6c42552f4701bb37b58a5618d8039375a367f414021959abf0fa255793e6589a0234fa4fa8e4515e38afbc0d5077703a3bc138e3e12c0cb9e2d457def3aecdc99ba5687521dd93e2b9dc031efcf2681cfbd730fda3556cc97a018332ed1be584a8c9b230f2766ca575e40d7e20e2eee711cfd9c773fda2ee1accfed4d10d39d9cab7c78ccc82e1cdd692d18a4c960676afbc742b3e38587e20d045e26fc72bcd44113d70d5216e4e15e5c629009cd88cd225f2b304da9cb7a61ab03e6f1252f7b65448b593dbc6a8b813e09ff71d8c90895eb962bdf7a2d0ebd4834708c1f44b3a5405d500ef7bf8d44719da03e76d8bbbb66916797bc244555fa770668fecf7ae30901450cf0b3046d0903e5dbc982e13b64f06c7bdac7f81e6c031d95478 Result = F Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b00133984047020374dea3 Msg = 22c5152bca7a2d7c48eb5bb3a50c937f2423ce8625220d5749349b9fd796939f5fa8a3dd9d440f1a9f4ef9852a8cdf2e5bb865bd8ad4556473bee412980437eae1f925f386093f112e490d3459529bcffb50348c69566e3e79f56716e50c4d1bf1e124d44e71c3473d052028f806ce4a4d12c4598c4f60cba300ac148856df19 Sig = 58d2bab8f32a675ee83d4f36b0f7499adf4cc6f3335f5159d69302349741a472a39e8171b3ceba18230614003b247e0096dad35dad90226a4822de9d7108ff1f76da6becc3e5b41899ce52b85626a59522902297161d0bba1cb38236b6c80fb01e7e55278ef1523a3c41c232cc3caa3529211d50cece53060a5a36523b3ecaf1949fbe3032dcb17be1003624dbb280a926fe70ca19f6672fe100fa90dcf8b84bea122e0cfa5cedd52571a2fba21bdc0cd2f7d79b1d33e950e4828fa0d2fbc0d708ab428c1b6680e85e0386561b3e30d58bd4e0dce453d3eebe8e4fb47e6a1502db77d1ba0e6ee5b0aa71d6d0d91a38be4e1d84c7c95f68775d8b9c192ff61ce90644dd6a34b926dc7c8da5c3b1bf47236bb1a8cb7a5bbeabf86d649707598cfc9b1d4cdbd123e757da4238160054a3f7b5b4f77c1f0631f07cccab6a055d763b42b715a0872ea188410bde9cc2988f66f691122117d001e8942a20ab833875c2839c4bee53e82de7438a561aabe499453f49a0287d7a1114b8761202c6a4dda3 Result = F Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf Msg = 21af062f995cfe8325632c751f445cad6102d56607d73bc47726b4689fb14a437e0c91a7e65289a48016c591109ccde9fa49c2590659401660d08874e3b3dfb59677311e77bafa51783167d6c8e2b8fb5393e8de8c8290c86a5609bcb056d05072d92fbcd5fd1a31169c586cce7ce38a74c6901e23baf2819da07c699102e7bd Sig = a3d26043c5f0eb27c6d22818dcbe19f156e246712850ddcdaf7aaccea00d028aeed43d3a39833bca74a7812143a80d33042c19952ccdc86fe4608b2702ebe93e398b4bbdb9a34f8500bc040e26d5b4667cae0e653ee6b76236f367a425567c93b31bc5549c2ae0138daf99fa2bc0d3986cead8ddfa4bc4e751b2244a1f395d449f4087dba2a9d003ed059caa4f4209435bcf266eb8070be17ebc7253d2327ffb6d2fb958c69b020557f1499987f78def362f1c36ab7f436423b21e729333b73ab1a6ae0941056339ea42a4a20c644e19ffe825e7814f7b48438aaf34e803995bf36044ea88615e4e91b7255938234a6304de76bb6b504978f49c27e85d98fabdeec915a408d4ad8bdfa74032fe285acdf5f20fc908a1482cb2861d64f1f960ddf7fab77a327c42ba5fca17269b4a068e44c4b599c51464c26ddeeecdeff81919dae58e6f5b70be99bcb18235edf47a4aedc5ad7fbf365d87cd94416499287e7e522eeaf172ca83120eb9210f7ed88f6249dd1ad1838080af68ca6106c6fe7305 Result = F Digest = SHA384 Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf Msg = f00fbccfb64b9cabe7abe3e25e2fdf96881d0e606cf63ee4e8a8f1a83d050626ce74961f24e61d33360cdaafe7c878a6d1e1ed4341faa35d82c5d54c5f743dfbe370ec3f634e7967bfff5d15e4469e4c956fabc96c3f87971b272adef8bc25fcb96c84d67b69f8700aea36bc5c939ab05e31109bf4ab34b93a36b80511c7064e Sig = 095f3c7b47d3c07fefa316f5b09de27afdf7337ac4fc4c77a805cd9e104cbe3344dd9d44e14130dcfc6e90b1bfdba92ec2e7e0ced121b08d9c4c7d6b39f707ac693ecec0460c850af7399b813f8d0ec9a0a3c6feea102333464b80cb1aa68d179102e9f600e7d69b68ac3bf31c7d064b8ff4fe4658d31a6910d6f5474f0652a6a76c6d2f75a614d168366d63f45a4ec8f69f754a57de0c8ef0a7b007f8785ac27e38b6f3f23792d20d2cd89082ff664fb2277817c23a0a3b584e6aff2800eb09ec7677d7fad80a4e5d8ca15e296772b5b89e51120b11ce2b983e6e430b764464a11a0ea16319b7b0a28e56eac826bb527a8c05dbe47ae187f22cb4714d4564d783f45fedae28bbdcdea7bd9d88474b72785a0ff9089e1007247144914712cda36d906c11d99373c29411f9264a9becf9c351f4dade4ef1dd3d48ebc6f27ae19d94cb49c3bdf22f685b4b9c3ad7f8c9cc5251499910c4a9e84945a92a1a6e0fc6f0c030c94ce7a4194280054af88c2d6e0b6934a0f25e159fa89a70c077f21a0b Result = F Digest = SHA512 Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 Msg = 76dbb0c0d2069fe7c8287301f57169ec11c79fdad4191c4913f111362d495e8da5a058e5104dca6a32123a1a64f46d35384a2dee60154967cc8fdedc1307d51f14ebad44dd277a9dccad2ee9f35518c8c1e8aa72df777fa959f29decfef6f7ee09e53646013cb868dd21d9d46c3c728df4c8a0cd1aeac7f70141d6cdb6becce3 Sig = 2e34f1e2f8064b52d770593345194f13460cdaf2bdc502e14e77ecffd093bb57fed459b1f1a26c15d58ef9ab1da879917cfcb2d5793b8c774bc94f0494c66010ace1159c8b546f616125bd79111d81614de5b0f6cc42d95c41bee3789e897adc94aaffbb3bd51e5f022d0385b7a1956cb013353c1167dada2a9c7d0052a0e0cda5eb0bd30f310099c1dfd36c809e0ed49d14ada4d39551a02d6d7e6db2a3a1ab499854c9445d2e9513529b181ebdaa6f97a3e84c246277f4e9ad6428a82c3745c050951ddb16a074f477cb10ee2765ec436c83df7342c6055a4c4206c88d826d04c7d342d5fc46a90c22a5b68ed57de78287a2047149290f16778ebbd253aacca35602f2b2f855a277ea263fc2ab286a42f5531248ae38adb65b8ce4b28185933d8a03f4787ec35a41d9965cf8a3a46bd970831842b94c99dcdc748ede26611f151fe33a64921e197ea329e26ff3cedddc830198a94c1917e8b6200f453c69e04cdaa9e872167aeab367ef9dfe7905581ab0796d611b15b97e4f6b351869ef3c Result = F Digest = SHA512 Key = 3082018a0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad02035b1365 Msg = 3c2cc086a13b1d1b232f0f131032f1ef2dfd616ba03641680dfd012a00c221c38b59f1cf30509c620080643f05e22f4bdea44341a97c4ea6263da90018a8dd43ef84678ca5f1b811e6f9805873682ca8c8ddadbefd227cc0eab9db778eb75db8b2d6a823c9c57a111bc2eac7226bf1f034d1284a63cfd39fa29a1ff72998a80c Sig = 51fb0f16194df6288533f7b91df149c79e8d474b4d44a51f903902700fa561836c4c6a09c9c5211737217b2de1d6d73106f4709ebc219a4c71d02516a9e42dc4ef9e372db5c3d05e3ba2c3da25e5e8519cbdc3998c0ac5187df777acce31f039480e11d745c6c0b235075cf1805498ea1f15bc911f6d94b3d332084ffda0000ee0d72572a5a24f303857447081129392a1693552c5da4ef6791e2a0f6e68a889e98c1ca7d8dfadc7beb60e8ca4756cb8f56efc62d3accfa16462f597363441dd9ce27328ba9014ff366600ac42140e1b4a4b9a068bbf05fc37acd0eb7c9fc6803a4f87d706d72b570e0fd405f6fd5b7a3926f5e7206d23bf2dd39598de89fa1e66a2fc4533f516d15f0e44bccd0e8d405ee95f1586d17ee25feff7bacf0f3a008e9c0a15129ded95f5a50fa7cf129517604504ba89fed73cbd4e96da21e824b93df4cfd6776961d0d14e5c3a11cf29a836f5c87fcc60e9c837717a632d070737b470f9a374c916166b5df2afd7250cff6f03ddaacf68b067bdf0edd1ddb82d2d Result = F Digest = SHA512 Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 Msg = 9a3482f481638f436c51f7b74d3bd19a91e99b02473c7f028507d421071fe80b1ab6fd87b8e491a9f587e3499a4db2b40f0f48a07e61b7663567636b4ceac0df88aa5dab80f622a4fe7bd605a85ae31ce07d5e43e82a42124ad8fcd377422d36aebbab471fc1c99c51d4d8d3c189ed3cccdae5d2cec0a7708c04a941cf51b679 Sig = 0f5c8dfe8b67996bb62af65fad25c816979b33419babafcfb3d35c2887a0375ee7461487d4d65b1c03306919abad43793a93643b912cf906c4095356b64f8a3e01dddd2446ff3c07ec62bd6c1b39fca4efd95904ccd0cf87c1bc5f3659825b86daca6b46bfdba8790c4f958ac9647cb1991e2661a01925c79d1f9b23856e8035507b1cd66956a47e97e756443c6ebd46105f8788b0713f6d3f04c3f16849aae50dbe920a35d5e5c1345af610f38ee98c153b02dcc6a1175762af98587c203bb6bdc93300af93a64798d8f621a0805a3212ec9edc90ec4bfbb63d6121ce478a96fbf3e731285daa14a638d5bc9dfd2c365e9d1d70b80d3cc461bad93e7b2ee984228206b52c9bd1ca44561efc558a6133e93d82079b1d5bfc5006742848b95a7e50fc3b14f3590f76f1e86decfb7af82d49853b3b1a8b54d8bfc7bed9f50c78ad01a1b8c7a24ea959efc8c54e0a6cbde288d36673fefe3a3a308cbe895de7e1ce747073eeac6df67fd3e15b38de300d9555450948d2c72c592f1a3182be99d760 Result = F Digest = SHA512 Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 Msg = adf9b0a89d93e05bf18d5610d03d9e70474d4a169bbfe6abde2f2e4fc1587e3ba9da89a5053b4ee4de2b48d5af0ce57d78b13af00e66f571b53193daf058d33f98236ace2ce3f8f968333bd8197e82c82fc265591493b4673c62ad86feff72a4a25dbae9bb96c6e2b72e97dfb49c5e9995063418554d0bd49c49e41b905643b2 Sig = 3b62f0d4fb1b702eda45e08c47d87b2caba37728133b54bbc654f1e39d4290050392a412226429384178be20a2bb8a2d737f08bffd1396052e4c82d625e3ff46955852b4ac9393ff7e620c8fb7ab5a7173f3cf67978127df7dc4496953488365e500ff13a1ec170ab95d48ae4b7c0392c4822f531a7a534464c91401d40561384c0ef1caab31f449a926e2b39dfc1cf0a048d121080ec31776da00f2c392783f15dcccb369844d7cec262fb6cb755660b0a08f00720b059b0c272262f2a943b6253c353e6069ccbd3c70b0c3a1474cc1d6f878e7a8495b4aad1d963351f9d23b69af996928a86f113ad50b327c26ccd599425c67c4f7bf8e495f7945efd4b11b952c52266ea3ebb46e445d18c596b8d2d6a9e8c70f0e3ceec51784c7477b662b304a5530caf18c3c8a232fd11c63258002714c298c258d724d8e8d4f4117bd74d2d92dc66fc324a257ab2f907aae0c7a8ed9e1aef7e9d0657472349eeb3da29972b11a9005fd93dead2361df7273adc8b968e0d608d782878ed75fd7113b7d67 Result = F Digest = SHA512 Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 Msg = 8b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe Sig = 8a5503759f374b78b8bc654ffda8f1add7ea05e24218f9e9c140709a90c5bf8868f081bb2a01a43d724c99e47ebc2634859dd11653b1c5a4d65dd306719b7b4cf2b66f7ba3c93e8731a7adf715c5b0365e0f9453b14d08dcc88052c97d4fdf05f4c92dac2ade4708abe6fe752ed57a5f39281b0c5aa349e3c4ca056f66ccb6fa07154b12657ecd5a94db390e09320dbd2c452e84d389bf2fdf4686b21905497830aa57bc5ced3d23b519f6d6c300ca5d3903ad18ca426b13dfd5bf56e7b47300f88ae7fd0b085807951db84ca9074ec40d285334e85570f0df96afa9d85c55aff0bcc2ba28f2d5fa4860159575ee84194238424213b7673d0f50bf903351e274eac603f2e4218ea8c626fced0aa08097f6630d92139feeabb747ae20e2343c3d8c7647ec48ee2c0d00031b9c882f91efbc7e8487a0010ad3c51f160b902b59baca8f19e8fe90402e1e0131b37a936e101e15f8e4cfedc727cc160c6ae206f3c70ea09f08f00c9bd1837296785536d1bb9785014c59665cd2b930050161d946e6 Result = F Digest = SHA512 Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 Msg = 379b6b72a139346febdb0fdce95394c509a6c5f0876de862e47b922594c00549f76dbb298a5943f05fa44c5bca9a00c05eda934f17b71b98d9dea24d19397949da14d0d2dc7f841b10f3380d4e38a7474a853864c5ead47c00ebf4ed766efe5bcad7d1f5ff719efae710fb7cdef43265b8f1dfb7f7cdba1841eab18d12243a86 Sig = 88f3e8e1b41671191471092d34520f6a43742702a629f1cc9d2b806c9e6cc1f3ab47fe1b0281570a0825c0de59b24554d4b78b00de2b807a92c51dcf22def3385635b477b9129a34c8543d24173f13167ad7fd7bdc108dd5f8e3f364c3f53ecb26fcc59145ea6ac74aaaa7cf0f1aff4b1462256b87e8d5dc9cf74ad2419b965217cc9ec90337cc01c7d9928ecd310468ca69cce111a16ed5bf7a07d3fe4dbe0b34b59645527547ffb9264ae48eed86d05d1caa8f519d5391bd2ce830d8ad0bda965a735cd4c061797ae661d0bb0431a8189a35aa0b4d2a6a6877b703bea7f09422372913e4ac4e2981e3c917f7bef9f9a1727fab29af9320b9ed44d5229460b06055c2ae911f4eeaca72de9c3b6269ac23943b13376e5009ebf8d349d34a28a07ba2f85466c2d488b6593f7abdf0f221c7aa51e142ba9e6828d23283e39671a41531f01a04fcd3dc70172dcef185e26bcee509a143150ca7f4e2dfdefd2be9dfb98ed0c7b12de9dd8d5653b88758ee1889093dd529657042a86507426caa6488 Result = P ring-0.16.9/tests/rsa_primitive_verify_tests.txt000064400000000000000000000242751352331573000203360ustar0000000000000000# Big-endian public key parts for signature_rsa_example_public_key.der, # encoded in hex. # Basic test of verification functionality n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D e = 260445 Msg = 68656c6c6f2c20776f726c64 Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc Result = Pass # Test maximum e (2 ** 33 - 1) with too short n (2040 bits) n = A614CC5E164699777CD3DDFB8C63CFBE0F1848E03CFF5C03066DACAE5BF77F90621835E0521648F5B4D5B1BBD0F26CB776BF3B8C431FFF73F88BA5D0675859FCEF3C194B71941DBA0EF8E7E7933339D53EAB4F2AAC90C17B09351731A829E620B0D3C8890366AA23AE1596DDB17772B4C23AED387A0A6BCABFE40DC3F8E5671CC519FD2770FB7EB1F89F63F23B1D6ADD8929D8813019A97EBA68D1B610FFEFA94F0369EEB02330836DD32515E33286A5ADD80D9C6D3DACD16BAEFD028545DA521E9FBDC3158D0D28B5B266ACD57F1AEFCA9634D8C4F16AAD1224E15886A994371D0AB99C84CE0CDE34512480E9C86C73F09C30C6AEA16827E745F7D30FBC4F e = 01FFFFFFFF Msg = 68656C6C6F2C20776F726C64 Sig = 9E62FFB36FC346B07DACC8AFFA5013F5FE339035ADAF666223255D51BF81B361DD382EB6D9468BF15ED474A18B477F0A45E49EA71EA120CED66A8039B2829CFAF45ED31252D1093B59C6C8543A282C7922D429A7E187207B7370E080E27181310E581D868BBF3F558ADAC0B27E65BA09E507AD2DB275B61DEE3153E2BBCA1EF9FE6BCD2D41257E9E478603EDCE8A545D9E53E5AEE802E4D330B8140054EF32EC3D6EF2BD131A64F8AA66D9D547E75C3C59B5063A5532A610F1A30E1C610749A9DE318313C1028883F40D6E5F9BD2B8629F522DB1C21C3EFD666F2AE3867700FE8BF37CF678F7FD7388373D17D345E96FED83AEEF48FC6662708C258621336E Result = Fail # Test too large e (2 ** 33 + 1) with shortest allowed n (2048 bits) n = B86EE74B2A5F42C57156C3FA7CF6D88F481850D19E8A85CD1FCE6383EBDACB0E45302D68196B6A9EEAA584A7E0B13E38BBF43DC6E7AC5791789A43FC0C1CB8ED44F28AD81C4B69106C19D8086414BF50B9A2E52760FDFB40252048C9398C3E9298D5CF18BD7520BB62C88D5FE85B3FD4A2DCD48497CCC5E03B7335A81EDEAB2D90BBBCDBE6124BEE43E7B8594B4AE09BFF5DE65D24E0682850383B804FAC4D735C2967B78BDC7B1CBC970247FBB2648CBFFA10B9AC7530AECED949DF613DA85E505353EFFCA7E142E1CCB533BFA99D743071D41037A17530F2401BDD6B6998811DC5ABA431F53086F9FBB568E144AE590224B908A58FC401E283B61F64657413 e = 0200000001 Msg = 68656C6C6F2C20776F726C64 Sig = A7F5989E8694C6444CD2D97D22D2F2CDD7D088C36847A25E8E861CBAECEA48F1828586FC5B40719F2606FC82F9B826C2B55070753E310EBC5A4A9E6BBF82C41F3A0C30E2C22B95ED3DE3866E332048F75F562492946988F5AC7A687793C97D3DBC3E6E3D96C8217F1F873EAF4736594E1B91D7BCC8B037A19850EA1F178EF59F4855C353D26432E1E573BC3630F8D1C9C280ED5F52AE996D2F1F98D0E53C53FA58ECA5F74D97D8DED59729F03241F5E7D87D7B72D549C559B6225BF9AF626179491A2146A3ACF8A18C82BB0696F899359D8B7DBB6FD350D5FAA3C4421A1C34F34895F30E70CFE0A98918C67F97DABE0D24E479A44B787391A22A5A1803A16708 Result = Fail # Test maximum e (2 ** 33 - 1) with shortest allowed n (2048 bits) n = B4224346F3222B5848AF0071D9A2EDA18FE468FD76BD9C4F5A298A9A089929527EFD835CC28553F990D12FDB6D52F37716FC8E1CEBDBACC8C791C84688D5568DF256BF6B4C10FF039EC16A1E842EE605D3F2B455B3579E9635084D8587BB6871A64B1447586F1D7D015F26FC70792591B127371FDF3812C1D4ABD17273EC9979829FC6F1536C3E3BE1B8830BE03E3BE079BF557A791DA66CD6F635B90FC0D0CFD449814948AF1D9FAA7BA375640252CDB0B19BBB610008409EEE895DCE70D6A288030A1F38DFC37A2738409DEC62A4813C6B78B7AA148AFF2796F5D30A631E062AB0AD884834AEE46F041AA563C048074616ACB71A35092EC29B607973ADEABD e = 01FFFFFFFF Msg = 68656C6C6F2C20776F726C64 Sig = 736495E32CAB554FAC3E81605BDBCCF2206D49CBC682A6DFE20A298354109F0FD5644CA06F281240AC0AA6F33AF35855CF6D24D870E795AFCFAF013C2E46B54EE09AD13361A2BB275DC3F0AB14AF075EABA9B3B094FA6970926E41B9FD0951B8BFBA67F3827CE2F1D5D49EB3BAB34211A759655A33689901A77EC5384D9A26979F2AF295EC2E2A5EE92730EA4C0922075F00E43E900FF6B8EF702659ED273B1CB9B95E811A4708D6A0C175F344DE8B114B7E15C41C1BAB9A7C19869FD5F615C6E5455C920A4C8F41D440CAEBC8713E2CF9B6153E2E56659BBE9CC056138F942AD988FBC39F153721FDD67BEC29A990492B1A1B9AB84756B423692FA3C98EB517 Result = Pass # Repeat previous test (max e, min-sized n) with swapped n and e n = 01FFFFFFFF e = B4224346F3222B5848AF0071D9A2EDA18FE468FD76BD9C4F5A298A9A089929527EFD835CC28553F990D12FDB6D52F37716FC8E1CEBDBACC8C791C84688D5568DF256BF6B4C10FF039EC16A1E842EE605D3F2B455B3579E9635084D8587BB6871A64B1447586F1D7D015F26FC70792591B127371FDF3812C1D4ABD17273EC9979829FC6F1536C3E3BE1B8830BE03E3BE079BF557A791DA66CD6F635B90FC0D0CFD449814948AF1D9FAA7BA375640252CDB0B19BBB610008409EEE895DCE70D6A288030A1F38DFC37A2738409DEC62A4813C6B78B7AA148AFF2796F5D30A631E062AB0AD884834AEE46F041AA563C048074616ACB71A35092EC29B607973ADEABD Msg = 68656C6C6F2C20776F726C64 Sig = 736495E32CAB554FAC3E81605BDBCCF2206D49CBC682A6DFE20A298354109F0FD5644CA06F281240AC0AA6F33AF35855CF6D24D870E795AFCFAF013C2E46B54EE09AD13361A2BB275DC3F0AB14AF075EABA9B3B094FA6970926E41B9FD0951B8BFBA67F3827CE2F1D5D49EB3BAB34211A759655A33689901A77EC5384D9A26979F2AF295EC2E2A5EE92730EA4C0922075F00E43E900FF6B8EF702659ED273B1CB9B95E811A4708D6A0C175F344DE8B114B7E15C41C1BAB9A7C19869FD5F615C6E5455C920A4C8F41D440CAEBC8713E2CF9B6153E2E56659BBE9CC056138F942AD988FBC39F153721FDD67BEC29A990492B1A1B9AB84756B423692FA3C98EB517 Result = Fail # Repeat basic test with left zero-padded n n = 00CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D e = 260445 Msg = 68656c6c6f2c20776f726c64 Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc Result = Fail # Repeat basic test with left zero-padded e n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D e = 00260445 Msg = 68656c6c6f2c20776f726c64 Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc Result = Fail # Repeat basic test with right zero-padded n n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D00 e = 260445 Msg = 68656c6c6f2c20776f726c64 Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc Result = Fail # Repeat basic test with right zero-padded e n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D e = 26044500 Msg = 68656c6c6f2c20776f726c64 Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc Result = Fail ring-0.16.9/tests/rsa_pss_sign_tests.txt000064400000000000000000002704371352331573000165720ustar0000000000000000# RSA PSS Test Vectors for FIPS 186-4 from SigGenPSS_186-3.txt in # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip # accessible from # http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors # with SHA-384 digest e918e2fda7c3159676ed33547b08e1dd4ec2fcbd0799d51510ce69b5d7302132b6fdf793709a3509773313b5d507081b # filtered and reformatted using convert_nist_rsa_test_vectors.py. # # Digest = SHAAlg. # Key is an ASN.1 (DER) RSAPrivateKey. # Sig = S. Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = c16499110ed577202aed2d3e4d51ded6c66373faef6533a860e1934c63484f87a8d9b92f3ac45197b2909710abba1daf759fe0510e9bd8dd4d73cec961f06ee07acd9d42c6d40dac9f430ef90374a7e944bde5220096737454f96b614d0f6cdd9f08ed529a4ad0e759cf3a023dc8a30b9a872974af9b2af6dc3d111d0feb7006 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 4335707da735cfd10411c9c048ca9b60bb46e2fe361e51fbe336f9508dc945afe075503d24f836610f2178996b52c411693052d5d7aed97654a40074ed20ed6689c0501b7fbac21dc46b665ac079760086414406cd66f8537d1ebf0dce4cf0c98d4c30c71da359e9cd401ff49718fdd4d0f99efe70ad8dd8ba1304cefb88f24b0eedf70116da15932c76f0069551a245b5fc3b91ec101f1d63b9853b598c6fa1c1acdbacf9626356c760119be0955644301896d9d0d3ea5e6443cb72ca29f4d45246d16d74d00568c219182feb191179e4593dc152c608fd80536329a533b3a631566814cd654f587c2d8ce696085e6ed1b0b0278e60a049ec7a399f94fccae6462371a69695ef525e00936fa7d9781f9ee289d4105ee827a27996583033cedb2f297e7b4926d906ce0d09d84128406ab33d7da0f8a1d4d2f666568686c394d139b0e5e99337758de85910a5fa25ca2aa6d8fb1c777244e7d98de4c79bbd426a5e6f657e37477e01247432f83797fbf31b50d02b83f69ded26d4945b2bc3f86e Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 60402ded89d0979afb49f8508eb978a841abc2aec59cacef40b31ad34bac1f2d3c166611abbed1e62f6b5fbb69cb53df44ae93ab7a724ea35bbee1beca74fc0188e00052b536ac8c933bf9cf8e42421a795aa81b1bc6b545eaad4024161390edc908c45aae1f71b4b0228e3104048d816917cba4ae7f2afe75e7fcad3873241a Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 5f183009708b379637dac2b14293709aa6d7e86c267a0b690a3c275031139891267c64e5edecdff14c2cc2f2d985b62f900aee6e04ca51a70a5f946463691cf16c2d45547c5374f15bdb8881641d3040ef57807532cf5b2ced07623d0f638b39ebc2f2ce283eea2247e1df3af5430554d1d4b88b7b21622993419971b7d0d5449122a10fc31b2ddcc53ff751ff4bf4d336fac667b646780272db89a3ea4226afa20877bfb86ba3ff4204e5cd56e13a1dc9d53f5c9465b97a182b2bf671512ef89e6c3969f97307a3e4beba39a78e0ad1bb9799cda92976ca39d99db4ac149c84bb9bc8997e8d5e056d67ca23fe4be28e66c4bc00a25d65bb9d7d623fea2d3b9cf859dfd9efa9e52268bfa297afb1cc2883db0c9c42fc04180e2ec6f49657c7008e4025061f896886613895a35bc2d3655a8f50a9fca2ac648f352eb06bfba2fc340aaeead4a8457c65e2e8fdba568c60a6d8d381f5d9caa30127771f4a94fdb8cde7be4fa7b4f89fe379dd3e1ca66ae1fdd63bebdc0015448e61ef1666594b8f Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 2f03701c2fe07d47f5fa2c83a8ea824f1d429ce4fa1df2671bfadd6234ca5775b8470249fa886dc693d2928603b2a3899b48062a9ae69e5196da4ceb1d87b5979dbb46a2813c76369da44bcecc6f20edd753a51099d027e1610712ad98cfb418a40643100b2522ffdc1760454b4c82e59b09827e4102177e462a3792edcada61 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 8291bc1be9c981663156ec80c1ed1675763de06199b9f2760caaed5207fb4b3d6037bd08462b100bb1767e3340105b1a68728bc45c7d6fd078dc1b5e7cbfa193006d52f67e77fcf809cf26172a46db384eaf552a5fb8e33840fa3ef3d6b20c7b46c32ef019e8d15dd38eab66f6e40399ad0bbb07f94b8c555196901c27e2d4573958f53060d800cfff40c602308044b75d6451801c688d276525c3fee17a6792882a074c8a41420109e2511418c9eeaf3ab47350dd8c2d3e066abeb7913e08f0a40abe71d397c3dddafc41fbd04cc8fa3b0641bf53a90031b61a2a9b63d8ed8aacc9b301593c9f425105498cc4f84627f4950758e01a291b9b1a33ba918aacc172b68c9fb2c767c65910816921281aa8e5482512cee686e51cabe88e18f923fde170a506ba3c340fd1d68261986347d30d124931db2ce17602150000b794c050e137f4ebd45cc41f70ef3df1656218ff76f2e75ad96e4167eed524fa2ed9fd1a0cf76926f382ffb16124dfc87bb1a4110928d5b1cd3b16204ceeeccb7db88fce Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = af90f131f9fc13db0bcebfae4a2e90ad39dc533f34165e3262bc23ffe5b20450538669bf6a5210e1ffe4a583381d9333fb971903a68aa08901f14c2a71e8d1996e59889a36d7c20cc3ca5c26fbcd930128541a56a7926a8ae49a5ae786c4ef2de6527549c653ce6440c80b1ffc06391da65b7dc39ff4643bf3fe74bf8c0c0714 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 8c45e38eafaaf10a710e131bec63e51e67741774a9ddbfccdd131a123ae2a03067e7a6a92e653a25178bf527b93d6aa83fa366a2bd44896baa8b7f3f54830e4d9f5632c2d1bcae2aaae8c55782132aa7279cf1cbb6b7a81e4965ff84635c296c5ac206a04680e91e7b1ee7e5793701b1feb832250010d4ad4017c1608de8f405014ca73c39adae7c4adcbaee35fbbc71151cf955acecd8083677fe49ececcb62353c0a89c9dcb9c507979b56bfe060fec45567517c05f29e262df50767df7547630d8a7b32483b923bb1e3d510422dd4cc2d61a647e4f9636aa7587d4f8ed84b6174c1fdca9a217d9b907972a66c1f5a2ec2dadb60b93b515bf74072d315d17d54d57d721c8f4ce1a43eedf2025e51a48e9ea28160cf300d7a26010383c3280a186c44a53b7188e6caa364bf4dbe0baf4dcbe37d70e3a475cfdae339386558ccbc119873b1863975e2300ede1e420031b4cdac567e7b9c5d575c8bae27eebb37097050acdc87008ca2380f5631d190029a1d712acda147c5c4378cb6eac81731 Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = e57debad3563fa81f4b9819405e41f98a54096d44f6ed119dceb25f8efe7d7329054de70173deb344c59a710cce03b16af9d168f6745eaf0eb07f80916648e804941ce7e583ab0a8a43a4b51844850edeaa4d7c943135efa9e770e9411a2411c586c423fc00353c34483f5bff5c763079f7e60eba98132213d64efffa94af7ed Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 851dcd2d4e1d34dae0fd585af126be448d611acaeacfa34f1492aa7d1caff616707dc31b05186cdbef769479243afb341577803b579e105070ad5406a6744f56e55f569370b9fcf6ab10e1aa0383f9182d451afb41358a2f8c29d1a571e11c404e6870cbb04f6ef30414d9b6d7f1416bacab0184eebd8deae72f2a48bea3a7844a8bf472a5f8d349d5973ffde3b1c40623dbaabd6f681485a9691c9be12618bba393b396f41cfeb89e18e378c51f147c7b0ededbc403bb1306454848c9bdb89f947843d0aeaadcdf09bad99efb76e742322521929f034dadffa483958df58a71af7da45461fc408c7c45973fc60c37a6358743315169b3100d4cd54f810d6e0369b9847ee38795cfe58443019523c3c9003edec4cdaa70de31d00958653058d8509907a5149a9f81be0ed028724f7232b57f93dc62ccf093a2635ee1e5bfe6ca9ea017ffab79182eefff542d278c471e1a2b34231700423bd0e757f6a572a14a99c90329dd0701f347d8a679cff25fd6b0d380ee5dc330d6ff1b4b1a347fc98d Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 28db8ffa55e115df7f188d627cd291fdecfbeea1109e1155e0aabc2157f7fe2a1284611e190365d2fd972d2a23dc793a5f28d4aac4100f5fbb2eed57532220d5d8d774bfa7084b44400249c19dab50e6c3c3af15966a960af1e2cec1f697a694a35c31a5a6f8ae7b73e148f09347004a3f54e7a82db390a0aa4fc526e95d79af Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 72c5555111eaef954236163753674a6ff81f182cbb379bfc6b548a52f9a5f260a0ed58f562a6086cf5ed00ed30adb023e90076a8adfa17cfd7d74f1e7b1978b210da847eda6b49891e6bd3fc6cd4c87b9326e8481a16c66e40021e5f878c303d3d8532bd7d966513717d5499865b2d03e378e76f7940f0448ab4d112e3c52cb332d340af122de3ee849f2e2544a40691ddf701d902bfe629766b36d82449286fd03f75bb2632dd61d6b3c6ce1c9ea8e5aff92ad2ca95a950eecd998e495e90e1f0966f922b7fb3f03380385f3b143ac1960c3bb688adbfd91d8fe1a1c32160243d3bd231a31c95dd78b6648c1175fa9c3c1244b1fa34d7c6f3255853ebacf5b3ec19b864e0a4eaee63fd719c21a72fc25b30b03207cf2aa45fd15d7102e5bae90882d00a812959593031ea3a436898582cae5eded5c7ce43de3dcac30b8690631e8db9f7a0a7f3f67b7524db275aafe02448727ff629d13afa94801d37526fbd9176fc4c216211037f8ec26b4f2672975887d70bcdbeef1e6ae99edbfb6c9a9c Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 796ac3f6adf4eabcb7a528ca63a6168ca6d31d5e357ad7a3fd180334a90d22bab20b762d767a6e3077c2cc8732784e81330041dc79068d50753bd4109c9c6f9ba03b5ac44efbcc23ecda27948511645fa17897dad7c122957ae56bf4ffe3d7bef85010b33d3b91785b0427417d94b11f73fda90e6a8748e6acc1d2d582e8836bc7dbe196876a9545b2a3207c1d4ec28acf8fe6f24c240b56ab3b4e4313a3d951aa1a558230e5f1eaf38cd7fd9b393d58d359f58f4ae51dd3971b418c5b81d0707cd9e2c33a148e492e74bfdd565eba8b1f3935e37a9d1a8764cd30497066e3c4622611fc14c45bf46fc85b3ed3f6c9d4d65e9925fe4b85ed30ec35ffc69c5fdc2bfa35d1bbdcb20e399cf934fe938f4c5798cf091d51100b4db4be42e81901e5dc79a98074119b7980b02821f4c3ff8ea07a2fc09a701978364bbd00ce4c5e2e45629526e34a3652719d27a47371480daf52fa49844f6495f35e6f5e3116c00b27042b3cead283bfc577905f8be87f0d5daa13d1ca74203a9e0d9199e885f4fb Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = c0b8b24f4b8e0bf29168ba73aa912c97121f7140f3259c40a72a6d6f78da2dfcabfcda00bea48459edaaf7b5fb5a9aed2e6d97959c393cd1a524a269c15e8c207cd09142be4f7e7d5016f6f19c735b8ab4c0f28e96954172af3cbcf29d65a161391b213dd5f7c006c294fe5016423718abffc8546ba373cdcb5a053196573564 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 8503b85dbd9eba8d6fc57c6ae2103a78df1fff3600585e3e18f6ba6436a3acaf8e49fd12dcbb37c25b4b765037f545c3da8c39ef6842bc9ec264af6f519272f3d8698ef2ceac55393baa9846a7961b738e41f6360053d866763c824bc5873da14a28eb47d68d67f0cad7880853aeb561045f757a31d9f5c756f54d793637d721c88fb1f60126d3d16478f1fc15e0c4edbb531c2ca2e2fd9e8dabe1df2c09fd55bbc724ebeba290a7646249cd779fa1a923909b29345e54a2e25dd935bf0612a5580018b233d765a6fae3b46ef51bd8325912f439a7dc40148fdb754e2d866f357b8f0ebff6f18a6504ba31d10fe45226c88c9207b9be3c63261d75270466b43c271f75b1ab3c1d6b5a00dda8457b4d5c2195f320b0bd545fdd0679c84483c14a46b4d43c8452879725aa91d01fcc2c3867391c72200ca5d628ed9b566389f02fe74ba2a428a7ba31c00ef6b8d38c6b82b7379d2feb11031848fec0fac5b6091eb7607138bf0b96c3d2c174b5713d0dc8470b532eee6ea0ca1e8ffa3b15cbe0bb Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 4935eaccd2af7c5b99405471bed9b21da8965004f5e6f2a6b7ed3ee2dd26cebcef4d845fff7c1d5edc94093f88de7a3aecf2bc3ecbd8c435f56e0b89bd099de7ac5f6c4377a5eb1c2ff4d801b8f159547cad4b4e60cad743f8e04627f61e1652e9354d8024710d1cfb2969be365a77f2bf8fa63b9e045257270a96c572ad6285 Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 66d1cea94b9603efad92b6ca8a1fbe0c6c4b9dc60ec0ab2c33bb62d27a100e839378a39208715de2102eae384ca407e92787ce1118f91a0ca2640a5c93fdb78635bc91082c99968ceab289890b3ec210d6cc6f1cf7e0fbe2dae88155e88f2fb7b325ab5e529e4b63493e551c53ae38c3fbfae49810050a81cdcea627da21b63224612d4361b9df19761d6ead44488dcabb50127149f077c2963afc049ac8837ff2c29e6a35593e22531ecc2e9ef8bcbaae4349bd7227ff3e13b31bb929bbd49e50059f28fd9ffe8c296a056c2760e5f6d8dab43e9bd557793f0759ad8e08b5c3773a305a0d316ff9bd07b43106335942055adc461a4346f05ab455780f32027de8b8bb6d4845bb24d0c5a21c293d2b0740e8d06ef5fb9dbdacb4fa1c6225fd4e19dae69a8e2cbfdff1ef8b7f21804ead0a45274c735fccbfa1d60bf497a3aa931bebac2e0c8beda9af596dff0cbe11e8d4602d36b2f6c6f5bb80f12f4b9daf2c0748f591098ea63d3193f50a1f4737efacb62ea85fb6fb212b3ec8effe788e55 Result = Pass Digest = SHA256 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 3b8a68da11b61b5fee1c2ca00a6aa35bbfdbdd42855b284320ec8d0c1848edcf6ac850427d8479eb57bcbe9a11771637886974bd561a5387014592cb717e8364a8183fd4ad463c89c980215ff629d867956ee5e75f71f7a19ea7bd589d7efb915d44dd9789448bc1ac32fdf7a2c911734db2dbc589a83c1a61dab6bd83907ede Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Sig = 790058355d7ab9eccb46ea12368f3be9cf6b895e1734eb20a13c749557b9fecf92b316870f0f765864b607439ee5f7e510e2c83b2756a0d9877b48e0cf257b13c997b9dc70421d2d87c9b9e5625c36a17e21e20ed389657a3e544c677464eefff08a9ee4adb091a9fbce7626cdc127b5cf817c2a5f069e32c720bc2041cd21a6bae816dbbbe28552d022b7b608fa99da4d217dae8a69f54004fa3c004d50540957648296e14cca729f791b38e3645204c2c6d4cb678b0db63a181b40cd9851be84629a068415d54cab5cb5244c8dac8dc9799a0df1b58cebfbcd8377a391778869dd275e0dc8305eb0351d81e3afa46719355eee4f90894f7fed662dd3b03270660adff637b91e18330a4f3a62c914f0d32b4eb6a30b79371ab55190578a1e7d43294bb0a721def7dae3e021981707930bd9b5cb58675851c83acf330c6ba3aecb3a890ad3c151a1e2b583a7dccbf204850daa9f4679e759ec056abef7ba4d6e0bdfa57a5c5afb6368b048a2b74e3530bfa8991c55de7cc8bbfa990d118ada80 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 9221f0fe9115843554d5685d9fe69dc49e95ceb5793986e428b8a10b894c01d6af8782fd7d952faf74c2b637ca3b19dabc19a7fe259b2b924eb363a908c5b368f8ab1b2333fc67c30b8ea56b2839dc5bdadefb14ada810bc3e92bac54e2ae1ca1594a4b9d8d19337be421f40e0674e0e9fedb43d3ae89e2ca05d90a68203f2c2 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 9687115be478e4b642cd369392b9dd0f3576e704af7218b1f94d7f8fe7f07073e3e8e1186fa768977d6b514e513459f2373df6ec52e3de9bd83fcc5cc3e6b97f8b3fb534163c64f5267620700e9d8c52b3df61a7c3748ef159d6b390895afa3af59109a5478d016d96c49f68dfc735ba2aafd5012c13515ed6644f0d4109c45556e14a3821e1aa24beb8a81a48da27f131de84f7ba51581d81b8ff31ba92b8a1fde867f07e32e6c2709253448174dd31324dbc32b05f07587f76a9997decb80f38d8c13d0f6eb3c10e3d96a2293f7464f1e04602ef6e84c2d0245d7db256a67d132a47cae9abe06b61a8968f50a1749995dc15ef0dcb1d5f5959e4d454c8547bbb4d195698f484617bfd122acaae2d0e8c76d28b24005ab03caa781ea97b1c4d9396a16f7998eee7ddd9de4cabe57032d9438a5d99c6b34a956122350263c7e998bc61dec91381012e686d079e39e96b1ea4bfdb7cdf630ddb422c6b580e5506c9cc3d6c100f2041d17ceaaaa54589249f04a1370ffa3bf3ff1adeb890688698 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 752a9916f449aebf814ce59ca6e82fa8038e4685419241c1488c6659b2ff3f7b7f38f0900a79c77a3b57151aff613c16f5020ad96ba945db88268722ca584c09b4054a40c00901149bb392f0916cd4244699a5e6a8c37e9621f54b471166797a7b58502cff4083140827052646501f5b5f1bc0b4e129147d7cc157cf6e73ec58 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 6646a88ee4b845da4931274c23840dada6145fe0af954829d1d56661546a25e46316e216bb6b9446b368884ba14969a6f68ccbc1cf5b4e7a6d3aabec67f64963f63b088fa817c855d776ddcada57e5daa50fc1c877389c3cb9d99095a869a963bc91ec24b2422ef6b8dd18fd20d2b215fee6e98cda415ae44d2d2616fe1708292a3ef50a075170b3a7ebab02918ab0301794c17fb35e2038f369d94dd49569c066f7c392889dc4b878c50c7e52586b5081114d202338d23304f16f912d519a9ad21baff0e3d21761f373d08421e10108a983048fcb90eb2adc7c7f12ffa1571b091c781b255a77a880e97975f14f42baf5aa285ecc142157c3e1addd6aa0c09253a11c59144abd3b1e212d89e27ed96fb75756afc20ec67423b151194cb0b0648c659987a5583cb7757779d8a39e205e7101a5351ce1af2c9c6b0847cca57af52593323905e3d2297c0d54541a0125621640fe1deef13e759f8f6c56a2ec2a94831ac2c614b911e79edd542fef651f5a827f480575ae220c495f2a2842f99ec4 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 0403ef219938b8cdbf85d3b88cbb9c60d174134e43a7284cd87936d37456cdc3c541b4566b682e575dfc7d8f883fa581b9df7257bc82bc1bc6a2ea2a109bb5e6c5022fac1e390306cb40fe2196cece8143a10af3ba1273c368ec7a30e27e021dcbef6609f9d2be41d3fa5e54fd90a0c83862e40b837ed4ac8600edcb31283bcf Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 0a217503fc4870481264d8308292c663476b25f8dec08ea1d1276f0951ec6df27aae3beb93d630bf8fac08b6cce50bd92994851b4f310fdddce8e0d6a8b7a1e866a567b298c5577dc50d8a906ab1be880084e681b26456279149b4b85201621c445de13d127fb77e7f236c39df34052b4629572abe1c02c09eb198188003dd852f88f4f767f1000458680258fa4b63dafc761822ca8b98c1a121b72b1455393bee416d24051290f02a28a7b49b18b30ccb29c26fbac991401a3a6fe01fcd0608920facae9d5bc56540c80f4740af02c9b7a078958a8d8a7a93a5e5b6d2571f49d775ef7c35a6d674290b52cfbcd67277e2b2e829ec437fb70e90537eaa6fe4548551939bfa98fc98e235b264aa6064a505a8d67946e2c33e5c6f0f34fa86ba65715c258f238b69e4f6e36d86a89822b4802d21ba0ba760b2f3a5bd061f50aaadff12e0d86627294bd0c4cd1085b5dab6a6ab30146c9bbb37de3ac5c4f8ee29736d46047e450cfdcb1279e4ca83ab69e858741bfd01a779d475dfc0f71c621d78 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 453e0835fee7cde81f18c2b309b804c67b9fd9e96ef0a96e3da94b640978830e5cd1c8940c3d4af763f5334a7caf2d20f0b82541b3434fa138016b92dcf14638817a833d79b79bc7a71223a7e0144ed4977bb217ba8d4f07d7adcd38832c05b0fc61c39a0dfcca3f32971931fd8e6dc9b81107d44c77af8a62d5f9c0c7d0c75e Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 6ec22bd58c32d41374c017a77027e770f678fd81017e20cdaaab48a8324b050749e5d864082f1f77fecf67a59c2885e931c3c2f58130fa6806fe1ca899045114b09d09cf9c513ce1109d2210511a3b2e93af511badad2716f48555310e6c5f547afbdb0b9a684491ff3588df933d6b04dae8883f5f8aad62a4570646f72f3656c4a7085623f5152164a81a06ccb59ca478c5c2315414550b0ad8eecd0328b2db01fff7db0f26596c41f970d032925887f1c8a446da889be64d48925b9c6b79a3d897700ab40af20b451aaa6b427ed162864db89f7824b6ae9b475b5433b865335d6f91491c1e32f635cb930dec1aa3ee7ddaa08e8ebd67b6b11a46ba049922446fa69f1a804acc29f6cee487723f2e61a40007865d80cde0119f3fe6e161a339487f5789e1fd23ac0a63b4673969fd8722e3edc9439778928f09610cbefbb42fe6242c73b68d466cef889da156d9d4ff888362db4cf9a941e80f577c944b79fb27dbe0a6967e88f1f67b91b0d38e083fc0c0228cd49d27352521312163f90fba Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 9aff46c14fd810a039c0a62eda403f5ca902ac41b8e225c6944748a36cb45f8a769ae2a18f713d362206d2af4a1742bf3b1de8e0de69a7fdbb72e66e1c6ed82a6f1f0138edf0f6677940643fcbfe5337cd76ac29456af902b5656dbe7f4c24944d36ab6db07dc39b081662c8a31dfb2c29b4ff04370ea43f4ac7e57adf77ca2e Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 62a505b3f3adda45c6badb61b464a28bc45d4c66159a34b63c1cce32604242eb8fcd9ac6929ec6ee4ac1144932d725cbf4638511464ec70dbb5543a4487a241396adb804c9794b271f9d35310ee560368d949a20a2b64cb4617fcf63cf7b60978cad734650dae86c7e51b766522ef0be48bceafe2030564d5b7b17ba125097bdafee48e4df60fbb7ac2d9f14af9a270c2b7ef18cadac45b9b54ef230794339d279d72ba48783bb09b1d1d5c1c65301276523fe90e63789ffbcd489e45f8aa9cf98f33de8f7d9c5cdd21a9ab2847896de6dce0b92f07b1ffb4230ee71ba1fe8048c22dd38af80f8762e747cdec6e99f1ce0d1c743ef98ddbaf7c764412446dca58e6ff5ac0dd13322649acbc96f1c5e0bc58d1a8211853a7d2f51538c5e5e803de0b13044608d6e650bace12945a7008194586e3b74809714b2a52e9f3824be41de9fec3f36175a289baf9fd68b7e92f3754e00b41782d055faa65433c25259aa653fda069386b083fb31aeec8e30c769553f8f0389b6e6d4b392cadd24ce3f74 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = b50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a399 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 1f068bd083a26534040f41c1387e71a8c00370c5f1c958127e0bc721751b5940513023fad02a6101bbcefaaaaeea2875952bf859d494bfb23fd89149d91290359ecb44ecf2fcaa5775e2e61e5f8d5151343576fe9c7167e919a5d081dac6bb8117229c420fd2b0fcb521f4e72366bfb443e688a65fa392eaa5115c292ab05bb4db65468aab267178653dfa0a5efc960636fcce86433528dbce955a0b1aa188ac33ea128206ecc0feeab8f7df6f8c381b10489c8cfb2d02459e4cffc16f43a66aa4eaa19bc518ccfcf9fc1e4861cfa13e9b41fcefade2cd2ebc001ec8430a1cb949a0f2f876badc568c703e4209e7ca16f688ba9705c14fa1c882e6c4871b9deff31521d2d418e0342e189c40ed19c1b6f4320d89a36f78eca143d3c16dd3eb338c0743646fd314c725c2d36a13080bfcdeea0e431de71d61f652033a75424fe1e1586695c3dc463ad553c1cf3ab24a41ff4e031f9e0c2cb0024cef68273ea3b8c1be9d923d3e9c9686c41977ac7be94a6d23181936131c17a39a898c943dcc8b Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 5ff000f84a951dbfdd635a4d9f1891e94fc2a6b11c245f26195b76ebebc2edcac412a2f896ce239a80dec3878d79ee509d49b97ea3cabd1a11f426739119071bf610f1337293c3e809e6c33e45b9ee0d2c508d486fe10985e43e00ba36b39845dc32143047ada5b260c482f931a03a26e21f499ae831ea7079822d4a43594951 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 18cb47bbf80bad51006424830412d281c66ae45c0b756d03e5d8d49f73037968d13df46ebebd9b5b4c58b164d91d0608e8ebe31d8644cb0bebfaa8e2ccaa1f5746ac8f3bc02ff6930e219f53fe13fc070f910ba1cff0617aea6eb312c1ef285869746673ac1348e89c3646f583d7633f5a2341626bc2e7e2087ff9d8f13d573dc6455dc0068c7ac6eaf5b3093b081614f7b252170c4893891e469121fda655a2a55d67f5df0ff6e29ce5f9b0c3a1a88342140ead748edeea9706d6570e900f1cf3a9adcd7ae64f207585417946b104b3990d1a2d950e0e6a5533d3cfc8c470250e4c797273210f248b8922ab00422f2ecf85aef73587e8c5cd1c2ee6ed9509508409673fe07ee2c462c52d091e7a795d8d3c55fdd5a710d5450695a5a31ed76f115e71a73c6757d2def7ef472571b0bdc7558c71eaefeddec946860b0c77936db31f2001d0499a381e5018870b41ba04c8d42ec0dc55c9fa2af237dc1c405dd8f555b07a237cc50cbce46c3016118cf4ea06c047599283ad4719d647a225206e Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = 531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a6148 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 80baa663877615c2e7ca9dd89958a74e54012efad55ad05868dd74b0ce78a661e2b893c3ac1fd837f282327efe4b041220942649b5472c1ac702070787ae5549398a57653d5fca69cd5446d63f6e9d0684925a235acc96b8a10bdf14fbe209fcd4930b5945910d84b08867b2055fe8eb1d771b753759593b90d6aec5ef182cb33bf2fe29e8c67ea4e8433ecfa3f9ba4ce461f0ab19997f299e95409af97bf57e2de410ef7538f699f385c1abafdf9337f7f9d268da87b2b389131fe3dbefd8c67bd2a158cc4e04f9ab7fee2a58d74d063e6c16958a90574e3e4cb881d32c3116987e46bf5bd44f80abe6b9eb717a9fcd4c0cfe80dd2ca62c33b5dd3a59c64810073e0476085ec7b76638983291b69559c815cd3bb87d4b07e24c6b9ebb7028e800a04f09b110c167f6ee3a3bbb73695d89bee92407d4adcea3eaa47811e23f8c7f2fdfe891f8cfc071cb984a63846b95ec04d6261bb1c5980018feee15c4e7bf632dc8306128fa22c47decfd9e8b099554f17253635e6316712e0b95efa3fb00 Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = a454391a7c3695486c337a41c2add417d8e9e9c6466d2ebb56ad5f97b9e7ce30784cfcd82d6066e372a3a1639a71a9369f2777435c87d100fc5e6638b3631a0bac639f36429b4594726613e5901816cf3a29f9228b96d66090844c7d0026d2e327e24ab924afda6554c2f74f0e69c2e8913798ec3a61e4e4fb6838ee08f89dc0 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 261180717edd905b647bc869f5259203811606221f545a3aee5fc123f297cf7d8a7ee6cee3dc8f97d24284ccdec2fd4680f1428ee75797e0379512aecb9fc1667523413e323c4bd7dded5caf9e5c606e5ee0c694d4d1b5a1f1cb613b980129f64146e42e8261c1f7ef5603954d34d56a50f7431beee5ab291a4759168655a5123640d596b744d97979d39f874ea7ff13a7466a7655d02edb492b58049f2208852297eb023e657f3240c5da9a99fd377728bff3cc073109c31712d94bc24e08c433533d4b86a73b58fbf2c598ccad78d46ca0a055601850960195aac1364dfaddbd06f14a78aac2ab4d374505cc61fc72c1050647d95a733517b709aed2d896721e7484208501480058fa4f6044302dd705c273fa7fb42eaeb02d025092b252e16d270d88dab6f68fd7ad571011f89627683e029d1bf1edc149d47452ebe87ec68679579940f5aec25999b0dedb820a5483ec6901abfee041c03b1a7f743548a2caabca613ff5d9f8fd7c694af12b29f2c2468eff55f9e008757443960fae459e Result = Pass Digest = SHA384 Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c Msg = a05e5782a96ee6d6f10be8830d8c27c0acf272abbf77e684dd6a6c19e5398381e5d0400d3a21927cf904cb6e8e425c1ca3ece04544f25d6c40f0c640d24bc45c807db53044adf63fea835d8cb93a0a4e55f760ebe4594e247051d38d8c34c1413b0ec1d30d3a97888b2fa7c3d59db8c08ab9f985e8d4411635339be95d1b0299 Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Sig = 87d80275df7b196b7e1d0a41147719d773edd80b5627301a500d91665ba86076e6a31c8f3ae86aedb643fe2af223976ea4eb3d4dca2cbcf81ffd14b7ef7de3ee355a8d0f4143e5b0f0a0950a42811102e602cd214e1c945c47e8b7b66d507103c3456f404f9c48aa7fe48dee0aad05e599f242adcf8ccb0cc9db3a6c244a913551ab595600ecfbb67c25a95b54f4054397abe47650e5c4991edaf1441ba9c8e3fbed904ffbc977142ebdc84769865a215158d5b052e75de318d75012172e28c31db2d8bd4edca787216dde2a7387c543f162fc91924918fd6c845bf1ebc0220a1027fb4227340ca4cb0f183e5b34b1e7f93e14fa57bb9d2d2ea53f86d838bcbe3f055b473b0b469afd2960c0d76ce2c30f3d49a3b29065bb9260248e728cbe328bdf502b109e1f20b9d037860cf9e261611b4cbf27ff9b5bf425b2612afc7cfa3138f78ad26077cbfb947fb2aae6f4be85ab2d1a15860839b822dd03a1a92a19a5c7244e98bdf561625ca2a8df410ff855752ebdf3d49f5eb98f228acdd52791 Result = Pass ring-0.16.9/tests/rsa_pss_verify_tests.txt000064400000000000000000002235331352331573000171310ustar0000000000000000# RSA PSS Test Vectors for FIPS 186-4 from SigVerPSS_186-3.rsp in # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip # accessible from # http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors # with SHA-384 digest a57b08a04af67086b065b91789a09f53b940b51df4ad7a56246211d329f04560415684d2ce23658a691cb9d14353ab01 # filtered and reformatted using convert_nist_rsa_test_vectors.py. # # Digest = SHAAlg. # Key is (n, e) encoded in an ASN.1 (DER) sequence. # Sig = S. Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f Msg = 7518c85b67e7aef7f26bf006899faef76e076f0c6c946e5dc9c83521771a6d298a9cf5adefdb314b5a07a54d8054c22b879fff50ba552c218291033c918401fd611a7447dddad4815e0f56ded825bfe256557622a385de4b4a69e265c1efd259e2da6db19aac3fa0e5ca2d42fadb4e24c271fc078feb2be10b9afa256f228844 Sig = 992d48b21bb3d2219b44e8fcc8633cf3aeb591de90f4386496ac7ecd284cb63d7dff81a50b8c4fed9f2ef737692ea6be05248ca138947b49b4e7f3cce6640e049ac2154c40f57e22fa14f97e7a9507e1dc98b206ce6ea0e180039199d1be0a15d1f5093a459e5101aaca2a23cb1f59cad2f1fb99dc956b9d4344bad2c1121d63b915004acbfc7ac60ac9a7b0b1c6812b30bfe087f7f0c7d1625f9c4f458515e11478e3604aa39d14d08bea30b01fcd6189e6f9b701d360e4714d45556b29815c8d8fa8e46e10749ba5e8d445a4c0f487e70ab5890b7ccc1651282a54e87e7db4bb2f7d4a671e71c43c55cf6486416f171d1955037474d06a71dd078767848e5d Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f Msg = e002377affb04f0fe4598de9d92d31d6c786040d5776976556a2cfc55e54a1dcb3cb1b126bd6a4bed2a184990ccea773fcc79d246553e6c64f686d21ad4152673cafec22aeb40f6a084e8a5b4991f4c64cf8a927effd0fd775e71e8329e41fdd4457b3911173187b4f09a817d79ea2397fc12dfe3d9c9a0290c8ead31b6690a6 Sig = 4f9b425c2058460e4ab2f5c96384da2327fd29150f01955a76b4efe956af06dc08779a374ee4607eab61a93adc5608f4ec36e47f2a0f754e8ff839a8a19b1db1e884ea4cf348cd455069eb87afd53645b44e28a0a56808f5031da5ba9112768dfbfca44ebe63a0c0572b731d66122fb71609be1480faa4e4f75e43955159d70f081e2a32fbb19a48b9f162cf6b2fb445d2d6994bc58910a26b5943477803cdaaa1bd74b0da0a5d053d8b1dc593091db5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650ce61f251d9c3a629ef222d Result = P Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f Msg = a3bf44cae8aa8347fd07d84a33eec5dbbdd7b6431368887c988c4be779c5473dd8c33ec82a35f1d3dddfe55f3eed67179b87ce86a4a50088172538fe9d1b06c6ef6897eb3c8e3618cfc21353ed4343e7fceb09a2eb035441cd5c8829c79b81582dd5d69ae85c5a001bd8e98e069961342a2bee00ad2b8b91015ac5cfc1f0c2d9 Sig = 877f20eed60f8ce286108a5dde9b6828b37e3fbdb08fe153e591513897440f21f81214598fba08ea077394ba8c2a44aa4f0d8f3a5fbaec3dc69b3bddfbe28397c90adf35d08ea771c7aaa31eb06413c1c62b77618af940f4c71859fa4384d29b48e5cfc941d69bf0a3804d2008e758742b8ed68754bc71d231623d181347c36833a7d7160f742a37ce7d432d748e514aa7d8156b50c532151390d086cdcf9d59f122c6d97f4ccb737289f7b00a237cb6b4aae6ba79d41ff73d019a26b59ade04c967356e2aad52f115357ffb7676f190db38dcfc98666e5b258559c8c85fa32942cbcb99d757e8847e56a1687b3302415698708191b136d923349b02fe38b6be Result = F (1 - Message changed) Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f Msg = e1c46c309b6366fb4d56ac08c9393cee9a7c95bbe7b7c0e79a3d9187c0f42bc33364c28a770da585e3fe7b4901a3ccd037dfc42aa65a3470521ddafa835ce2d16c92ac670bd4d086505e608781736dc4dd64cc5080ee19e586c8fd1d737dade5d378b32f1d5df1e8dda0e32a125024b2d53334943c18782d7e69825a580093e7 Sig = 8ed1f28fd16d45d416a21554e104c006fd7868e5895e8b99831ae0938135b543610df64a8c3574d08118bfe396f9a5609a8dbda21b9a8530ff0ba90e629d6abe30d2c1b590600db971fcda80e6eaa84017e209b9bd3b641f3c81d5d27f842bec8019790ed99a0e5db4aedc1c070b047c19410cbc56e9a0ff12d8f6e5d7371b1011ecfecf7be7a74f94403590a52f95238dd69e0b5f4c1fcde97ecfdb1acc3803e59ad8b3088b2bc509e3dd12d40d875625dc8362c579176799c75e4fadcdb392c68f401f68d854e46377f084c081f9d83743039f6934722e30ef3f0226bc841d79a4eb68c5cccbb6ae0e9200444e50ff0d0953047ef955d2d39a70c3b837c5f4 Result = F (3 - Signature changed ) Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f Msg = 925d59f953cb3ffb6d5a3a55c079cb1083997536e33d7c8aed50ed76aebcde459938f79229613200c70dde2ceddceae08c10608aab9e30ec51842f14a65e5f8f553471da3497881927ec400b4207ef3e2dfc2b7fcd318c9520b8b22f69dc8a1a8efaceb7be93cbad569e67db062362913005dcff902018ed22937fad405fe84e Sig = 62b07f6d1b8f13651d7f22ce2ce01061090029db5af7dcecfeafef20621dd9e254a0fb914f76a3d79662257489cb8122708583d30778791a77da83c7bea81140c61e4d0484806e20fb85f24d1bbf774ef2ed38809c9b14f2a58c6e8649b760baa901544522ed94bd405c77201d07c8d12864a8d1e97a4d322c29994b214fc83c2ecd5c955b9bdec424e7ca5a1325ec0aae4ab0c202b980a2187f096aaaaa5e85550ebd325799f4f30ef2ead07e79c7a475667f5965e6b50269513659ab5962a391c43cbc3a3da34c0fdd1546c40ea7e2eb5352ce6a06ce6a6385ca0ddd5d162c137836df9ea1f89cfa00c3eb1671a43bd625526f3b6ba8e48a7a2d56fb4f01c6 Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA256 Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b02033c6cd1 Msg = 08d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cd Sig = 72ea7d669ac699a149c13aa168eb3e148f590bbc0424951f1c3144c541915573ecf05cabb5275488c98d0ebe55b1f1af49ef8cc72cf00e849897c6afa53833caf9ffc00eb84cfe55b8277e93a6ac3e04b111c9d07ad62082ca32854c40de1e0956a18f8460438484403abb91e6fad12b28f114157f1b6ef563d2fa438ccb8a16aa3afe6ec5e98365c30d9a355e7e14b039bbdecf59f91248d0f1e317d2e3c819096ed68cf98361d7f9310b354f4f45e2f7c4dfb82c218cd438f3174a6f017f0f148a71c40ad5b7e2c8081ddbaeaa764d601bb2e075eb3618aabaa4b5060022c6d23ef072643686a759227daef0331b28ee76da4ab3b5ad5dda8991b9937d1a59 Result = F (2 - Public Key e changed ) Digest = SHA384 Key = 3082010b0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020400cbb343 Msg = 329b4257ece34ecc0185031b0bc665c9c87ac66ec01a8c69281734d2076e97b0977d6c6cee140f86ddd0818719a4af3798b9f70f3e78e8f1b9e54917aa2e5d4a05836654ba2968b795ca2f9f621093165672fb77aa4d20258936147c2c8f8208445837f59848e1c7ef1c174c30309acec84cdb8c4cc0bd6c5fb39bead7b88d54 Sig = bc7b0631f92c7dfb0e3e8694650bdc73623d0356ad2897aad8eca32ef4531263f3219e0af3ef2fa3b8a3eb878b3f9c293c634263bab59b1dbdee04afc3fe39dd8bcf22a0052e6a081d3b68399294c8c6aab199beefc49706eb3436d95bd3e655d21cbb0fb3488052df8819594ab0f9138fc5ad4e9e3521425e375684d94dd74b9a3a7a858aa1023e967502a38b67ed3b8b8f6086427e8c8b4ca608c4b394fc8dfb818daaec3d4f10e77f51d80c0a103569dc28814a80eca64100d9fce5d6b9081f871bf8aae624f1786151290c86dfac7643b21c74f4f5313bf8b7693dabe4c816d7d309ce27f4b08b59d6a26795a9c2278ffa2185a1af12257a5a6de57c1a41 Result = F (2 - Public Key e changed ) Digest = SHA384 Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf Msg = 3cbc49d73addbe2875dde779689a363e42cf88b3e13ab520fcfe655ba246268fe32bbc3dcdd8b8809aeb4d95271f5e9aa828db969bdf4ebafa9fb1e7b5ef83705f611b2027ba3b7f0b52e85148be796015adef7b901084bff97e87151ed666fc16260d8932cb6eab31da61b4b3bfaf15f1246969aa157fb661618defc543f8bd Sig = 37c9ca333ade423c46419ea16c5d79f56165a03bd5c674fa0127500a1bd7f5c2d21547d7bb45f558b3b986624c8eaef4db101e4092dda2b4fe48811ef7fa694c1384f460087f81cac1861425e44b86bc2fd825eea94b645afa4afca29f632edce048aea9e1365185a60821e4385de7d7435ec00d307d477b2e6a6e3cde0f340c71d2c59624a7ac8cfb838f68b436c403ab3b45f9a19a0a14ea8f47407b7e25e51a498a902ed8eefe9c493421421695a6d17a9cd5b76efad7b39b8d584cc2902c03422f06af528c6bc65bcebd8876b5f4d1ebb68ce22af5de05105837c15f5ff5c4d41ed8019d6a0448c94675e192a51d5eade91d2237ed57773cf3b37ba3da71 Result = F (1 - Message changed) Digest = SHA384 Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf Msg = 59632917bcef9eaa6edb1bb6013bef9e5d285fe212c49b44ed78f129ca804141a8aab16a035aa1d25ed2e25c1fb022469fb8ab0882d44e7f4459994a158c5175e7651c54c5937db266bf052c0215c8d764010f2941364c16c8f553797a8cc6b63c1dd19daaa01892af2beeeb5271c89ad38af10cf7f27f51a0d3857ca0878a4d Sig = 77a69f4fbd9456eb8cb973e2623d8ea83df850f3c7bc7c8f976728f11b2daa6204ec45e15cd36dcdba5d88bcdeca490bf488a32d12be8c93d9fc63d2a91fcbd79b4bed113dd98bf5b93673a1c143828f47935aeeada7938c65717fb8b370cf649134f6fde56602ba7d6f890ba166d3fe1c51e7471c98b661a6022d7d1d0caa5be5d140e94e70cd1478b9b33622ad69559e27cd6878925cf07f37f5dbd1ae457eea785053d06e2e4d010fd885b897f743ec09c2b06f774407123ac30cd91f81080845f885062fa4be9da31f4e6f626c61a7fefbc123e8b7b80978682b773b5537b2366d1118f506464d27db3991fc2af283abbed6d0c552120f82f906c38c2e0b Result = F (3 - Signature changed ) Digest = SHA384 Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf Msg = b9403622a632794f7cd74fbba93aaa64c8d91b63144fe7ba23305c4cd135652d7a995d1c6cc2214e9b24696e976358e1bcb7514ea8950d5ef38ceac01a6d8671bbae8d3a0810cf7a76809625b53b360de536e56007bdcd72b15a60bd06f8ec27e6486f836264ac5973b37eeaeb0c6d6fab1e7fa2170f507fc763654c7f20bed7 Sig = 81511a0c2eb37d5c6fe2c214c55d6b0e5fcea17242d5a5a9eb4568ac1f0af9b8912498ead877ca43cf9e19c743c3d8ea6f4e67301de53ebb81a1a3eaff67d72e450ffc6646b6b45ce8826957b9afbb13f571c38852c3eb384f6a595538ebf467414f3522471147f2ccb347284d0873018bf6329f33e0b49f4e86338b423a1027a6c4718187d19281aa896a286b6c89622e4cbf4cc6cf4c3ad4443516aec8708006dcbca5f42c9b943fc8cdcee23d9099edf61185635b53ad4d8853d8a511cdc50e189cc8929dfd32f9dcdcf2754adcc19b855f41d25620b65090180ece407427e9ab602a38f1f289eaf3299db856cc5bbda17de17a74bace89913813d147d9ac Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA384 Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf Msg = f991a40a6c3cda01f1a2fed01ca0cf425588a071205eb997a147fa205f3ec10448090e53f56be512309cf445b3f6764d33f157749d5199c7a09ef6246bd5c793b85d24d9093c4d4b318b48e11727cc8bb7aa5ec8699aba7466e074e1887bdf2a51752ec42f16d956fe5943cbcf9c99a5e89bfd940c9fe447fcf3bc823d98d371 Sig = 6b42514e88d93079d158336897dc34b450e424d61f6ddcf86fe8c9a368ae8a22c4ee4084c978b5169379da10ae6a6ae8cd80028e198cd0a8db532cd78a409f53baf7d231b545835b0dc06d594d76868d986889419a959268fd321bbc8bad5e800e452fe1a1a2a5a851d542494473deb425171a2f37ffc4cf0600a8d561b20f777407bbef1b596f92e518c0929e8bd52b015c2718d14443a56056f65015515673deef32ae5399ae71f97873ec1508f8c41d6a66a13017685134e5425c4b580a7f6986c26fb272f0ed215d6698dcec9e7c5258173b295b3611869254a538945de952dedf291837df0d7a205e1b76b01140df4edce3afe7245d46ee3b292bb117b1 Result = P Digest = SHA384 Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf Msg = a95ece434121269f4bf036395e54718c9b3b247de3534fe147b7b540bfcd2fd81f6e45e54848ff209b81f986b49db65a54a2366d9e7acb9d8798289c88dfbbf395bf3d4653a187d98685a753c8e933c281eddde013b6489555101abc4357532af497ddecccf263d1f242672904008fcb0a65405da9ce6ecf9a65b3295afe9e87 Sig = c878b4b14526efdfdb99f7287c0e871ef6c0aa7b4d2ee29299a782c8391ecdbbb60b8aeaab5343dffe7ade8af07156c45b16842775cab5201b3403dbd6bf0769ab5533d4c40deddb1eecfd8a46b933627d0d25893f0338e6dabb2a778649ebb2193a9d7c99d069c6c209b4436eda411184d99be0f80e3b293b5ede00f58ec4922fe8e1c6de04e58fd443d1cd96fcc9ca4bfc23343532a3eb840fd5c197e7795f2e3982a928e602b1e8f5cca7ea20da049eda313b1ee8d4b1a8e7960e4cfb5b16082ba73060f73c02716324658d3f00a3ff0a78dcbae103d5048e75669053645156f6640d4f6d1645d02e772dd8e70fe8866cad5ec2878ea6fc5c47530bf9eaf0 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb020400eac839 Msg = 9c3d5d23d2746d15d616bebf3cf720c6e6012a71cae22002f5021a47d0b8636ca3bd201357e132a680fc5dec9b28a9db932d08ae8b3d3a37d7e2ee754b342a69b94fec26b50412289bcf77e6d4095faa545f15a16783d22eae21e18464150174e6db0b837347d440307655d56f0409db307f9773e81cb19282a93c9ca4c3b135 Sig = 98657fd8163967fa7d263bd45bb890035adbcdd1645fd48b28febfb9b4e15172540e38b7c2f673c40a205fd40b08b60b4b81ed6e236cdf08f0d6b11f50dc74c60dc466ac372e0f467883aa9a398f4aeef87b040e14a51502dd467e8e8dd89812dfaf6b1dc1c2f6c28448af084590c05aec499dd3b148e66f3d71cf75e239db6d21f4074b8bd9a6bde5ca668634bd47953276ff2d0ebbe01afcfe0e381903736d6a6c672a45fba4ee326e342dc5925169517c5f57e9290724576a225ba89cb4dd091f4e6513be10dd4181855bb4045d6ef6437c16d3b5589ef9d6836682711c7d66025ae37b525580f0dfcf3db7fe57d7c6b15777cc41600307e58a1721b6f7bc Result = F (2 - Public Key e changed ) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 Msg = 7759420c8d1a39ba0e3e1681d9b757fcf30cb40d844f4a71224ff998520e0bb44c761611ff4723a455540fe6b8ef32e3d5a23f8da0206b57987ad2ff4c9616ab1ede493847350dcf1b2ff9b98e813f74f8b68c0615243091501f7f28416c77e174f8a32b6cca3e62e7379ca16455c6d8e3b2651eec45e148d2a4c9ba3978767d Sig = 91ce8e921f85de845b9bf7503dc65a328224d15b23e8ea65dc3da6d804fbef196c305e0fba059a7d842c8c0f580860cce77652d4dc779073d6a3b0a92bf2dd3ec6c0618da1485036fd594bd962f7b5a1c61d53f1626912c7e312aa83eb4326288a52437c7387916bcb11084a40c219c84cab2ff66e83143f858647f2dc914da0c7858ba39aa8ad8147ea5c9c52069eb2b2ca941d8a5023748dc401e7664500846c85cadf0287e39b8b8b46794a82bfffa752960ab3b9eaa02530b5903c24aefa108f10aee35b6a8a3cdf8795a182e5c04ed36bb68c18785623b42f0979fff319112e1514cee51db437ee32289f61ded61186c6ed44ad722d18d556821f888221 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 Msg = 864f4f5890a03653d08daa83d9e2992fab3393b7ee152d6f7b8ea3ad1ec9c1219a0e0365eef2fbd5d7cbf3a19667d421f3fe46688264191b2583e484d209ebe2975e4603dbd94015e633febaa43c615aa5cc2cbd69fd6ad9db970ae81bcccdbe8026625adebdcfbb04ad12f589c70883c9878fdf2a46e750a4b15f03807a2d5e Sig = 245fda2e66d2bab102d0da4098d751650f5ef4738d14dabe866c782009ead9d6d05d43ac0a3014a382d62ac971ee19798f3b8ef49f9bc247fa07b368ac2d0e8a4fb210af5acd87b6b512e135861b30103403304732a10b75c9a149552d1ccf0f9912968c6431398b7d48dff48cc7cb7184e76a0ab94ac9a6b0035b91b3eeb2d1326ebddfc13250224538c143fc0dfa3995926415a658db8e6691504050a1a30e34b21af8d12707bc4454f174385cd84c729e2ddfc5cc9178812059b5da4a1a605a2a81642ccc1bc5cf953965f705673b12c5b46ac8c1a03c1001ae4df1c39cc83cb54b10cb7d33cd5108033c268ceeebba6c6ada92882f46562dc658d3525574 Result = F (1 - Message changed) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 Msg = 71abf895e56ba8f6ae8d0e9e6690c09c759270a73db8c1aa95d05980793537fbfff3472c8d2c34de4abb7e64d216cc952e798314034197d50996a2dcbf4c33485e0b68910baebf0e50ea29bacd3060372bd47b13526ec04bdc81b90dc95a8ac2743b814cc5b9ef8ca9633628bfa4248b55eb7f2d9208e114f4dac69bfe27e472 Sig = 243c570cd1bd85522e64817361cbb949c83876d7a3609513aebf506fc06750ba38e820232c98acbe00ffa50b36c538560069fd13992ca0df7d9f6d956b883334f1c3af8a74adeed5be15b033d85b207be2fe600a9902d699ccef1f4a8d588672c446401eb390d174d572b918f9b349e2e704775300023850a534cd14e0046e385181d345a01dbd230c7965fffd71d4e9f9bd274d2ef46c556c7332121362e71706c39f08919efa3a4f2f142150c8cef4b30ef788f6fffc2ed2aca0262eba873a251795845da526b78e2b24d66f21d40d5fcbe5542a7553a9178be5a9805bb53579bd108cff733b37640789318db620a6a94444e9203923ae325500b676b14798 Result = F (3 - Signature changed ) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 Msg = 4b648de2e390677ce1727191498b76d2d2438d0ceddf3db502ade5c5fd815bc70965d42f9b8d04eeb38986445fbe7dd580177c00d0f8a36c24740be3efbf656408e6dd73adbd45b4c7196fb86f40da17b29e91bf91ba518b4c68ea18e13fe7d4cf4d71571f0a71f7a58bf59684f8d5bff04096f2380b8e3b03f14909d9e92c3e Sig = 277fe81a1540341c9c04fb5d3c8f70c1e72f87fa7d04b93ee54d56d1184c141ec4e125e2e5cfd0acff1055c76697a1c3079c371cce0bd84ee4437bfa1806aa76df2955935331915fff879d87c7372e75e5e8fecc906f9d34a5adc0b75409a87fb6411e2990cd237ac8223f7223444f5d527a115c85b9ba10287f3e825e1dc58eb37c8a9ca055155ff6a5aaa6565690dceef6f647729d071cdd9f0688c7fee8f9293abe658d0e1ef855c86a28d8d0f8f82f72173186353080b84f142f965907377178fc1ea00819d81afc2474becf79e1e3b70c7c2a8407d50795c3131bb6df78720c31b2f8c43f705464d8982043c45f04e339aa1c6f4e26aa7092b3e6261299 Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA512 Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 Msg = 7811a407fe653ad2343d83c0499fc11e2951ef0a4791a3cd9a06396be5f72e783cbbca2cc47002babaf09cdeb70194b532ccbfd24691ae8eb598d59f2e6becedcb4296a1debf417eeddb4d74fb217072091a597ddd0893ff02d6ad61105098db2e90508bd4b8bec5d6e7deab9e651dfdb8210532955e1bc788a908d7150ef8ec Sig = 3ad1f0faa9a36586154a382a1f2c10e819dc318a68be35f54f95401b0ef2ba5cc895f0d6bde28c8d3b364f60de03ce75a7af29e5807c1eec4cd70624756e2631eb46af010ca8cf93ee7d86a4af3ced5dd2a8a41c1feee6b4572070873939ae7a2ce75193945937461d0064eeba07760c495c5c70bdb04d89951de3f96525f8e44612493d490731e7ef7679a24b0b1e2b24c8003c2f94114e4193d6e54c0af9e870530b008530210ac0b0e4c7c79f379384e1bb319b5f2a0b622517ae5d27f0eaaf7958cb0b41849126075092e86e7e7be5eeacef9a8e3ec595432ef619858fe0d0517871b8b495c01af6f18d4e6d250dbd19280ef4f8a37d1b59a48fa41b831d Result = P Digest = SHA256 Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f Msg = c3232d8060a3e3f8687dc05d8879004bf5c3a7030336bacaf4d9ae8c0daa21c5f09bc8a225dba963fa568a038d7fa91b274dad04cb83dd3b0f35900a2b88e46550b9b3133b61c30e09f73d2b4d9661fd600077f7f8e409d2fc5c4f2e97baeb7c8c84d71bc9bd9bc13e66c31def4590bb48e5ee27b1dea6556356d5407ac89dd2 Sig = 21bfdd610a56fb8b3fba9f3841e7ab9cb2b91d16c7bc3ebacc266271e05eadb6d209a043a29d542b57ad832a3ed03933088abd7b56b86fcc295a95fa66e27f5b9b2c919b82d4165e2bc42b9e46eebdc7cddb29888281250e6954190f8e13b6d9ed6906e8d603520deeeb5cfe4f7e932c88ec1ee2dc9b971a0288bd71a45ce6037d8d7ef2325ecaa573c57ec753916fbb6335e9ab5cb695ec0579b511074a6cac3b21584e5e4532621451641a4a09491c77555972a5d42a627f50ffd490c79e32c855aef0e2859c933321341731e796b2ed4c6c50a98a3f3c6995bb6bd53e52c531b15d042061186677f9158eeaabcf302626c8ee639685c832cf3bc4357cbca7 Result = F (3 - Signature changed ) Digest = SHA256 Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f Msg = 0d8235883f37654b35d3566174cf731b5b22a54ac15718f9d8e2415c57b42003d80dc2537e920b37dc9fb21312de8dfa39190f20024c0f9299ffca24d0d22cab795a4b6d132b35d6aa36eb6df856ad06d0257838bd14ce11e6bbb509346d0235b710d7bd462b6b90664109566e5e5ca7e8efe97a39d6dde085be09f2cdac2b07 Sig = 6530d456e14269bf37a95ab7b2ca4f534a47135052665a2b64e9eff970a9566ff0304029d2844d5649e643212aaa7f1f9103bd5288b1bebb7797cd8df3393373852cfc7001a4257499fbc92444609e0afea095927ebb773b7b666962faf0686a8b173f446fa562e82be1467111ecc38697103cdc1e700890b60104eb35575d25b9565098544a2e26003b3150c9a579c534a44bd0c1569b58d871d6a5af51b5ecf3cb2b0650793ac95a44596f86723c31ce4b3b1365dd61d2bbadf394b16f734608dddf991595acfd0aba42a12095966bc005c67b60776ba104c9681efd38d2e91fd3995588d9ce244c6bdfffb8e0086837946c35627a09a2f83b325af71f474b Result = F (1 - Message changed) Digest = SHA256 Key = 3082010b02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020400baa86b Msg = 84b1e3cd7c5d6011c581302e03489fd37aefc841bad659fc81d796c6ddd6a1cd9199f824bada3f70b29b40e435ba306fc2c53333440f233af2048d6474b9fda447c87c6c625a56661a85216543d9fa9b9835120c5ddf6a4242d4da438b5d58c06ee3778fbc042e5cc4e7db9b75cc87c0c2e76cb34b6eb47e39f1844969ea3989 Sig = 1864eb619e358d7e0340b582288e3290d5f8caf1b6831bfe5978f4ea56d15762247bfcec56e2a44fe11507e5eb6fda0706b7287b09ea770d577cdf660c523a76e2e70952177f0260cdba51efca71148e069ae6540f5c4722a4b4db6336168eea86612b6b4ecf8b5b2e1adf3d4f79c3894c617ae0ba56a930c658f0f55c0e5f2719b4b52b7785c30489ca13c9799ded9144404409f284c41530fe35967c2d844dcb1d2d80c10a985164466ced3a4d74573b175ce7288418b39962d4a34cfbdd43ba5a6b73af0f9ef55946b61bc7d5c0af9ab0e99bc0842edfedfc91e213f021842ccc785cd73a5f85d8aa8371c80151b836651020e71c524f92d3c654fef0b37a Result = F (2 - Public Key e changed ) Digest = SHA256 Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f Msg = fcef065e293ecd29ab52046c68c6e940aa0e2d5fce5d4a2b40c516f2a7a198705c301b95218282891098dbeed1c73765105db8532e87ebe53772585115b1585f03df272944853a1e143dd34ddf18d2e1b13ecee7eed464584323cf53dcf6b9aad74351a0f90e9ef1a08b1313f98363bc73f897a4740c5d8c4a1fa37f64386458 Sig = 00acfc93e41faf5004cbcc252da290b9cf66b56a6a4849c572461d3212cc4cf1021eb96e8651475fac7dc87faf3a5b52923123378c18cb83906d1ee6e53502bf0e89ce66f3cf5a4b7cafa13f2d97f99498c0052fcd640570e5e1dacdc66e24c2a54f02bed338a26748fd17c07bfee5492c4dbe4dfe111932e3153394721b0556a440788a2bcefaa2765ade916653f4aac20d5ea587fde0fdc255dc32c5aa52b05e3ac2db4d7c3a8b02ee1733fd300801d1bb8e8613386f3deef8dd497bfe803523491ab88553db60b03d29c55ff52e71c546873cb1b52bea1853c8f0070d1776545557becb6a11310acfe1be060deb53d16f0dcbc396c1d30e03c4c069c3ad48 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA256 Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f Msg = a6a2c5c8718c64105fab8d44fc69d334273aa71e7475d924ce625cfc61944aeab77927eb202f6a33589939da64b375d3bd22f61db010183d053676ebdf3af50ce33c05e09cac237d1e5ea27ceae0acf2120b84a29ed80d702d759019e098ba227314e40eadaa98d4fb215090589880796f1cd7130476c2a6904633ee2b56a014 Sig = 8ec5b4e7671975686b72eb3930f77ef3622119d0b2ae0618fa52c7410519c4f846c986001d3d82844ae4c13e99dee463448a498a652e9b725ddeb6323b83d5521637be0dee7b224c50dcaf6c7b9a2d26f9b0aad81ac6e4651f241d7a860b51c96ebfc3df978c5373b7846d3139f509dc16726f712c0e61af620b2c6db0955d0ae9cd4760bb9de6151e04bfa19df4d5aca2576f91ee7aba9eb446fee77c604faa5af87536f22fa6e239e898de906642fc6594be9328571b35a3a8420ac697ef993016f78def8a17d13698cc4c1876ee1006d814dc60161214a8f8b6f2a345c8b0c0fc645873b6bf9d2fbace2246f643a6d3a2e0b88929623a2e2a73823f6e325a Result = P Digest = SHA256 Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f Msg = 79220b8d86942a13861560882a66fb4c5c926a661b74ad2586790a0636a802d9d1df8320dc5f5fb8d18afdbb72ec4fa45c7903b4df15fe950d5a063e1195be16c311d85c799986c61f3831688a436ed809992e903d2a34932bb6cd5490d7bbd374427209024a878697a66559197342308a7d51c0ddba39670817c7105a77df58 Sig = 54835466397784e6229228ea1e462b37d77757ba17a6624fbd3279408e89fddab2234f5ee20b56cc7095dcee3cf033e4b04cebb9771997e3b9f50ddea290080888fb406cf1af4b2d14c12be788cbbc6454c52276bf64ac3b3158049cc78986e38413bb09d408f04e8234228a9403eb901d6f2fb21887996fb228c292a2aa99fe8456172145939606eba9cfaae694e5fe824ffc3a5547195e24af5039aa1f1dcac9a9cf54c51099f82cb1a5aacd8c9419d1c7ce880366f1276fae7b9e1848e9ceaa7ef7244e5cb788f524bb50231ef4d81e14d59d3f884dbff575e953a145fc45f7661025e1f6fd95874eba803de03b5fb0a8f5eabdc739fbb91c45ad1c29128f Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA384 Key = 3082010b028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395020400cfdb6f Msg = d5f5d567512a899c0168240b319e6abcd8b92a8d6e20b9d3ff80a0447ecf92155b8ba15f5743b1c798592c5ef806f7c6a39ea597e116eb0030c354b2966436f93563e52c205826486dcfe7d88c4b2d18d78b4d59690b5fa734cef0aa4e5bf7ca8c060a965270d267a951bd409275f2f99b058a9daf08fd103229daf54ebbbcce Sig = 672403ce06f1ab0ea42fd043666e4623299fcefead6cd204599102fc8d543d3bc93342fcaa1262d52e6ff344febda6faa57119ee7418cb78a893aeb245f618c072214e9740abfab998a0896a1c9066a823dd62b5ddf9e9fbd7bd6b68437eef595e90e725180b3cb12301a989cb78ea2dd48730521caf4b2754679c4df2d8e2c12b8c8e55f1327fc6624d85555558fad198db6973ab155deb56cbcfcd44d8a61f90400dd3760b19aaba4dc167742bfe1da0d9ce20036c284729e16b8aff5b6ac3121fbae8cd55fc0779fd0ef7b382c85db88b2ae79270b1110875923b2d72d8ed7d37e2bdf5396b158a89fd1ae95c146737db028ad6cbeb0ed43edd421197d23a Result = F (2 - Public Key e changed ) Digest = SHA384 Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 Msg = 6ba3f34bde03e48259723bd599464274df4de2b6f3bfc3b06970b507234a4f0217fbd5e352eb5f783d7138ed204685e4e43a27c71d25e25d4821be9c50f6adbf58d66f98b44bb326386d7f6ab658d177c2dd87c9b8787cd70182f4eb91a83a32b49c870f0b0a26b5d1ced6f56364705400a0c961cd9fda461cfd1e9ced483c84 Sig = 236f23de25bb3694f5ad9f09224f5ec1e78cd7f371ec50097327026fa53b1689a95eaf54738cb75e5abba87a964d32817fd5071febd84d60c7b11d95e33a7f90f22259bcafb9425cc1a79305a00a1b8ecfc3bfab326b6463ee57d1e435db91f45cf4edad0f9ee50dbe42130cfd1bc424906deab4906571688d1a514d98dd074139d57304c0c2d8a87ef5f8766486da8df827f9e0c81fe3465ea52d1984d738b9fe9368a0d05384e9cb298330671f65fe52062a0d3c4af210ad471bd5ddf9d72787f40ede3b77297c1d3a5b29ccadc574e9001bef89e4ac093986bbdf048d7b63bcc072a3cde800eda63bfa8e068fff4cb9f15b5f98c255fcde6d46f139e4d30b Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA384 Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 Msg = f3169de46af85cb510fbb4cf9c0aada9f875301ceafbc818f428a59679e1e6cd203d18a97e96f979efe082e8c43a252ea4c354872caf42e4d99aede1281b5cf8fb9d25f43f6a33a8cc09c6e08ccabb98e09f0e6c3f2d9d5021232f811bcbb4bc4bdfcfadf69d91aa701d88a13ce3f84f75b168b36c9e60c3936c725d9a177780 Sig = 47b74ab96c333f1b60313998e9bdf5e313534c96c2f7b139f4fdc8295c8e53a1ae275b235a6931c69690ba8f1cd5bf9d3e1a6f8a23c9f026a592ddcfe35dc498ebef292ed49a87b4813ddcf04cfae8aaa6978f629ff58f24960985a452a09439a3aa027668055ac5900d62f5f584f8bdfaaa72489792fc32b6adc9d289dcbf5bb9a278ada1392b42a4e5b9714a1c3af00f937962477fe72b820dd4fce5cd2e25e6a56081d6119df474b7b7586b801680c4ecf9d067f584d79a9cd0f451aa90644096bf9e80bd469727ad7b7ceeb9cba63de2abd423ea96675d8fef64130e357a5d2f67da0fa528fb3ddbe2fd553033e517533c6d1c301c094ce0899bcbbcd4f2 Result = P Digest = SHA384 Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 Msg = 599d4ceb774e4906332eaa216b2fe8e1fa52506f381baa87c34319cc80ac425fdc9ab0af581f779344d71896cad6a5912fdf268056d63a8e867802726c4a3afe64cfa9f5f4febc1e99f36e96c7e56a6a2b58746533940527d05535777bc4dedb76a6ff6554d45ecfbbeb72cb69447f94752703c9d73b517b2b417c85b202761b Sig = 0745457af52fca56abd808f094951d3eecab89ec10b74dd49d51a9241c3b85972755a1f80bda2cc96cda7cfd549eec820bd2f99920ebef1d10722918adca8d408c3c883d7c257b117842420afbce88159c7ac4f4bf27f039c24c19dd275643d0ead111d5f04912571cd3a7d40e3f83c32b44762eb6d2e2de22ac006643c498ce55f6116463336cfcfd0ccdab250e9931fde68c9796e05b012adfb76359491f26f69ca9d06b43843a4976f2b017643e6cb80b8dba2a01f1b01231ace075ab31d40319b30ad738f62d2b8a1f43ff1bf67f83330fad67f94a39c2c51db23aa775aa43b708ef25c9c62eb565606e4f5002ab15b00dfa829c99e3dd96b454c7448174 Result = F (1 - Message changed) Digest = SHA384 Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 Msg = 73a125e5705e14e15f2446fe326f563785bcde93d2ee46abe4efd9668e9a1e089cd9656b0a0aa08b74a87449ce279068551f3edcc5ad3744cd17bcb5c0aee2b98df92e97f10f61d5eb4595fc7109899b610e3a8ebaaab3800c7c25af2d513aef2e48a7f28d3501c6ac44d19f82dfead791d1fa3318ab606889663dde3d4bceb3 Sig = 7a7a4e5b349a06dfdbc9ab958d5fb70b650b1eb2f7eb43cfdd7508062efc9ada3ec0739ad95b2066009f760c8c5030e909189f36b0f7756a67a69a38d2db57d0708a4a2e295b165411b2ebce13723bdd9194afb288452d49c585cfaa3148f5f5464145d2d673cb1803b6ade6003a9f25bf27325f8bc4b883ec7cad37eeecde9ea1a62d0b30da841e2446706e72ac2588948b15fd9ce09ecaf105bee8bea71622e2c58ffb9eae9bce35e9caea8ccc7e0c8593128a6656267ed088bc26347b7b249ac45e06f68034b6d39a4e2eba8c6f5c878450654bf36e5e73468413510e7b50d0e63de67cd7ba35d4f2afca5b460cc7277f04faf2fb03fd7c8995c2fc9b7e6c Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA384 Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 Msg = 86843b3170034a9f8ea79a39657a5e7460c50ef75c800dad690c8818cf25a1e85012cdccad1e7a886c4cf648d7478c334898f044a41bdd5526b4fc7d5e3e089c79c43034c2f4bc7b69d0f4ae83a73da7534486b2c865e29d466f760eaa5f961988042b12b66c58a00f9c5d137183bbf8083199eacf4566ab53a4c073bb719487 Sig = 45dd07f00a1727f2e992cf0fdaff0c233e6a6866128416456fcd2db6030a4f3cd216db9c4cc2bc7440e06081595e9c51f3c81af68166f6b9cfc0ba4491bf1835b1c946d69d0a6b8c39e1eca84a3bf91f7a299cecc1d98e6fa2ec56cd01ffa04d37423933d746295ce669cd8974caed44f45b88cd7eaffbfcbc70353a3b45c53895edb4e6b19a65564ea3ed404506a4b8dced831c2174995b4455797dd2fa3430f575c6ee80b7d74149746b415ffa6613fc8404ae9e5625e1b8e2b74125b341bd1cd8ce2e87c06114f162fe464d299aee6ed0fe70cb4de523c5b0e10f1f8996f3fdfc9379c3267c268cf29823af84fa756b99ee42f4e0ab8b691e5145f43e38e2 Result = F (3 - Signature changed ) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f Msg = bdd8719841159aba3f353440ef98efa92cc503da8d00745bd12094c3809bc971cfe3907dc4f5c2ee9c2e172e6a61e8bb0028391e1277f62199777d3d76915d5258c85d9bdf4dc1e0024dc8edae0e7944af3a9f0fd47b13584e47397c5afecddd2032e0d8da451df7383a516703c52bac02a440931a325168b83ad16a7409a27c Sig = 2e7b28803bbf9d58be8219ace68c020a42a4b42e59c2c2e0faf56ca17f7c6f3a427688f124481308e249e4d579f576dae5743bae68b349f4d04bfc21d60a969b965827a67025bd8220603763cde90a42b4308f2c84bc2c4c8fd5de0efda349e9cad1f47140d01fd27021ddfe16873067213636ad961cc85d79a87231e1019ac4bedf9630e2c31f4b413d98ffeee53fd46ca6d62449e86fe7692b59feb18bd9296291d1bda77bb9c7cbf15bce21aff1c6f1ed9cc95a87378b13eed54d7b54835160f88f7ec710c87eec07c2239b7001bcd4a8428a1a274d1c78d89c2153c46f4ec997df9a19838813cef1381dcaf97bccac39739a3142aad21a966da1be5c471c Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f Msg = 3858011a054c52e3b659066f55f219dd58464bfb22b8c55dcc90ffac24f0e141f60929f28b8e0c2c7069204378ae790504cd1295820b6f77343381e73388ca6fb3ffc2b888ab78a1ea797c8e751dfd02734c2f715e2cef4fa109aa6d9f497b85f6a29314058ade67acefe4f95229edfc2d2d6836bd038d0e9a7a42e7701a3bac Sig = 311e1025e0a8820a5ddc4f632628bac218baa94fb32c709ff70db3ecb3a1957e31513fdbcf15d83927f5840584af5ed90b350833f50cbeb718b12c56fc260b41ef627776bf1c0a67f39be26cb0045e6c2b60216338a085cd867bc5d9e744a27ff77baea199eeb669a2e0096256d081b2313f3b79ed180712ef56a0b549eb299b96029fd93e4f68bee5a0e6c8ee44ddbb06b8843fd4365cbabb229d2f8f2a9881974adb406e6ffb39eba8f20da38b558d0069f45f91c85debf6872a4ff36d5a79284050faf42b78b1770b176c88b7fabaca9111e511dc73a2bacb30abc3a841bb5b0f0b844e756dbfd3f5db458c47861df00b085a06e07ab4e788a080483ccbe4 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f Msg = 6883a018b48af70d2875a7f5cbb5a303d7338b6d76f988c3cd2f787f394a4bddd880aced4c7fe4e6bb5efcbd1ad422f6aca84fbbc568262bd45e1ef4a0c0e324d227fa3cb442a48638cc06a93cbb867b0cbb781629dafa2e49851ca29eb345505b60d22e753dff97a6a60be2b8d49739005450a829b7cd75338cbab0ba8b370a Sig = 15be3fb200858d24ddb7586470ffe706eb299da157880a68aae79ff20aa92eca298eec75ac4ada285ecabb10479fa593ee72c585aba707f45599de0dc792c6e3390da5729ae5506100b31c617ee12445093a7593bbcd0e5a155fb9a41cf332c9d65b0d8f077fb417f027eaf728c5c326bddd7be7bf3e69a165c57759337105b94623ee203641ed2bf58f1907e3413b00e08d54a10bb645175449f02da9366b11952364c0328fff018723c30625836a0cdc7a13c220428d03efd625fce63f022b59508fc68ed4d16294111fc391052705ec115da4ead8caf5c50af586ba4dbe1b29d04452f947b5fe9e16a798f5d00094dfe2ba910e6449bd52d3f938c045ca9b Result = F (1 - Message changed) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3020334ddb5 Msg = 20075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5 Sig = 9166e91b18c8518760131ea0eeecc443023b61148a1d42030ed09d509d4c02cd0068142fdbc6e56073a68f5a942c0c93a7f90882f160522ea005f4afd34453c8c1b1d3a4e5204d0f9b797bc00b84d0dd96e311394f089567e45ecd0c795be010e7fb24e46a2842e8c7dae9d2c760fa09e20a29a623e6c53e3c436d809032b99ac4a81e63ba95a356f86a62dd6abbb0aac1d0759e44ccbfe225f5d206aba8dc7261daa9451ee1ba04de1172ad80c08f0709d2012ad8ffc8c5152508bc1e18ab53cde79ca50da9eee9b3b5229d38015f7e18f03612ad6270727be16fec06a5d9230ece777ff6936a3ae8f3a631e3e13f930256c3903d963ece49c5a10b5a6da47a Result = F (2 - Public Key e changed ) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f Msg = 46c4bea2eae66ba40f3a6223a28a9756d7c980ea6e4976e2342e5fa1cc238a45af4bda37727a270048a6e15fc798f698efe7f60e682776140b5eb201a4b77682f67b3e35003c9c737f54da6db48ee07a672259af2ce712b1e5c4a2c788675033233a31c31d9391a3be2c9475f1d21da34961eff443ef135ecb48791c019be200 Sig = 85f33d22d92f3e4f31c5fc0f17df916ec770903445f73536bef61966918efd0b380b9933d2864dfa10f5613d8a232412e5b3db44717eb576fc180891800c5d11597d2d09e477d0392740d700408f3482da6f8d9bac4da6faa220ca3cfd2287f5ed8654bb8dc8ac45e09e52e93bc78d8cb4e08d76e15cfa78c51852c93d31d64417c29aa7e22411746c280e3e275f71c4742faa0cece8e540d1b8bc393db120fc14244a2577650b514c73dd1e5391da76aaad375f56a3cb4e0ca942bbbb542213b5a38445cde0dd9eed4f7515c6c58251dc94c25f7dd929d714b2060da252584af84b82013f924fa91700d92523d69c96e0b0f68203a977affa92574cb241c0c4 Result = F (3 - Signature changed ) Digest = SHA512 Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f Msg = 25e9e6c39ee6f5c455d81f868713362929cd68ae87300aac2bae94440095ec56b7e3e7f56a5b0d197fd89c94d0e2d048087f6296504b4e1a2ccbda959fffd42a96361bce842661fa493c2ea25831286b19de93198c5114463020ba5a23fd3eb78a8b8a34337179cd79acde996829c7fc2293031d816ae19afe553b7bd2b9b365 Sig = 2e0b30ae35777c9f951b22740fccb88fdfa94e7d139c9eb105be1a1ce542f6efdf4eb3d1ab0b2342f8e354a0878e31f0bdec1eb67ed19491a086065af7e5188ed0b95e0dc88812f66d6c726fd672e03652432f85a9fe4766a7c315c0c695fc37c45ff5441d3177c4181f01c243ad3c9614e4c6f4f8b879ca8167a7790aca6b34c74936cba58e64cc4e32ffc8ad6c09c48ac59f1eb18dd11871ffccae98c465abd5885bddf59dcec5ddb31ce4ecd86bf6af207373a912b2717e726ce9ff555f3502e8cb83e287cf0f7c938cd4b26f075fd50e4127555ade94c974a4cf604ea5c5d9e94ce91fcb9a2bfc8743c06e69ca41ef029881c3d64078cc6311c694dee627 Result = P Digest = SHA256 Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 Msg = dc4c136c805849fe77b4b381e4c6b22a3ff69947a9b5aa6b7cbe42cb279c50e8396d0b6ebbe5e55cc396ba66466e4e982e81f63bac0895fcd0aaca4b57fb6802c4432747b28099b368ae5fb4ae459c2fdf04aa6a40ed0c2a9091a418e08d2669a555cdbe0c304d498d840832c35484397b071d9c0b6bf73be5f937fa6b5b7367 Sig = 723f89429e5f8443defd528d57798d67548279cd169d185a0052e09472e1b37c313250136b2a5f8910e31229363515ad674ca9489d6c7ca7974277ba323110c152f664a79cfdb3453d4cfa6edd124f81384daae9b06f24f3599884e13db024393b5e211ca352149521eb37d29902de0c4392b44bcdf79d2f3792cc0a7edc3995aff9629719507a2bb35eaf2be9a88b74551a068e6e556d78f1662f0a78cc29be00acf9af7ba491940b8a731a3af7003654f15205c6171d009a015b68d423166e971cfce113bf2c7edae6af28a500d43e2f3bcb3b8dbe940eb0f8bb1a077bbfeac4cd20dbfe058605c31b3d1be79aaf1d051e27daab45597ac2838763e49caebe Result = P Digest = SHA256 Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 Msg = ba85e1f4f9203ba8d3eef645d7923e10c614080149cc5ec6e282f70b23d30bf91ed665fc1c00baca924539a1508063cffc151d78bfd504943e220037cc531c15dd5a9545bea330458440d13f43444a8a806c7174e805753f42097269a28c4231df56975648d246229327e6a716a49a493a612b7c2c235acfd581742a0d452653 Sig = 90bb73e761dafdac0b38e4ada5deb5f713ffcbe119ee7af2152ffb3664ed8b7dc11815fdd39f398050ef8d901f836945a89dd0c71ace4b60979ca7e426f676ef3653d7f5045afbf7f38af3eefea2bb2a34ebad8ba029874995d24e98926faffcc79f110ba8f9de35b48829197634f0d842a8ef0dedda72807df0676e08c6b8f76124ae2994151c0379c21dcf3ee33297d8b13eaa74511ec7edf8058dea5d5ee4a6d6701d0700aed62ebe6d69dea7d0b79d01fb5fedb4e291542592e977fd13ad1d49d3c9cea4abaaf003764ad0d3cfd75cae41fdd740e6c17b36831a8f88fd8f9432f45d2bd529291c58215c221d546d71e78a4a4787630af5692a43e1c83af7 Result = F (1 - Message changed) Digest = SHA256 Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 Msg = 284748185ce9e8eb0f872623d43950277e53f59b362f9b40ca2db01548f7c3c3cc0af4379672a9915fd4833dedb2915fe6ebc375e281a138c39f3cc249db65f6e1b81e1dbe6f4ecd2befb90f20222ec013720238108cbe2a0c6315cb77781937105aae10fd683e681bdeaee193109112aef09c2dead65adf4d812178f959454c Sig = 49193eb45d4d355537d9bdf3bd2bf0fad9d7e33241172d231dea6ca7c9d7bd2bc3ed85285bf01bf379da0db4fc04cb7e53cbbb38695fd689bb73f818bd4e3fbc042013f8e002beb92847dd0d5fee9867cfa3fcf76f3f648cc36f4a67e295aff914f796cc0cabfd4396fc6cf171f468361ad6ecef2023b0a23884880a17ada5372c7cda32cc1e3b986451219d7a171e6c6d5608c3dbe55403b4b42f6eb3f87948d0d72f51de963ed80033b42b5e7ba76c6fc5f74b9a5249b60bb507dc86ad53f5b9b710652a2486a3cded83e447a4c114c4dccabddc51787c19687548c4ff157d887c7886b19ff85543c7f8340a6fee320ba49e02c463c8bbe10d45805c67cb6b Result = F (3 - Signature changed ) Digest = SHA256 Key = 3082010a0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b20077502035bb217 Msg = a3c2ec4c47f444bec34c15ff25f2f811fa94f9a5bf05a5de982a6458451609695174a8a68c25a7a9bc2b181290c646ccd5dc8e92ec9e71b17c69e70f64eaf56cf48681e85cf966c5643dc46f5ead99b9596a966a98fe2bf8433fe5935b76f965f3c121199eb6a69a2449be1d79f01961ef05b735aa6bfc3c547406ed13023edd Sig = 039c1de64720207c408ea9889471fda297c7b3828e46831ca5ee60a938ba13a7ac524cc394d5ea12d89c2cecfb06ddcc6d86994ebfaf84eb91f39ec470898d89cbc55a12dc47e7be7e0f389dd12c5e59a32d5ca6a37a3e6456fbb8c8c8101725cc3d529f5d1be12de765750e5ee632e43031656442ab0e49f9471cae87dec5751130a2622ecaeba85ef337fa31c472d6a9696231123db350f5a390c8d7ce1f1a839a4c674aee4e7af60ef62e689117fe645e4c322f20373b9fd75dc8606e70d659094f2d2c98108c6c32576adda57ac0b30c47dff442b0901448c68aa1afee4879eddd84d9f2f954971249d87811219e433f3d0d5adff57133d0e9c12f82deec Result = F (2 - Public Key e changed ) Digest = SHA256 Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 Msg = a14e35290344465d6d2f43688a663ee418f80f13e1dbee22ed4641aff65bb28a1c0985b8da3128be39070c1c43bcb417bb5a0cbb0beffb217eed3beeafd1691c420358fdd1fdab7c29b0a3a7b723356a3d5e609dc986bd42e8495807177dbe137a0357fed1f2f621a7f1af11cce5e96606cdb3c104e95c0d93223d0415a6daf5 Sig = 93775fe8676f4e6ed580f3db99e0697e15f8e0ad168a9321cfd004e6d0bd555bda6483f51b1df63ad78f28a3638e70d230c5e654eb4c86c2c1889a06e28e2a640210523b90fe14019d03d0a3b14c7608614fd88a84ba2c68f7c0e01f9502269382367a07f2d90ee53e15abcd584c56de4602f7573f493e41670026fefaa6e12c615d19d1b2ba25cd0f48b6ab20a8bf809dd15ad9172bc8823302993b51f0ae5f89e5c05ee0dfd91f8926abe7fc64c7694613a996be5728ba3c6a4d2387331c5d3b21377f9734b587fba180577aa6cbba1f4a2483e4e46a5d7c355b4088063d32a10c99bc654677eb08a9b57ad40d88d378a8111678e8dc60be3c789a0639c056 Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA256 Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 Msg = 555400784d0566105b91dca7f4f0849d832d51f0a3c7d3b9925651fae271199672d014a19dae9ddab1719376a38dad2001a60e3d27f51a74b6ec876e421db7da4b5845b56f13dec8dd0f52720d39eaa7afcffd39e1c3be56a4645853913b3da7c833ba3b2afed0e1c8b33f219abce33c75ef436b37fb68684506eb2f37945206 Sig = 6dbc3049603abc4677bfce12929bcca60bff5350809ce3f98259ddb72967faa076bf02206c9bfcecdae3421c66f2eaf846b4effbb5e6d774e000c1f1f7c1cf409b98f5e0ca13cb2dbc5b1692c6bf7e54a743e4b24c53451387f277aa66e16da87246d3ab7ba1fc5ab1a9029546098d12d1a45293860e2c8f4838148c89921467285b0f6c916f3b0bcab98dd01120055ad1acf9ce18a2f276eb15aa6f9a0fe05652aec728f831063fe6c7985ce3be11377703f76b4904d292598abac7be35bd1409dd7096fdc851abd2b20a1883f4f915309ecf507ce76dc9a75b36394c6f1fa6685857538ff3b847affb483a670969ff59c8de0391ce73bf1e85601d6bce92c1 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400a26a2b Msg = fbf1f99265060ab82e3cf1a3cb86ea71748f05c4d69e79c209bd3b61c11acfe1c8ad5f9aac1b0af7b5db7ec31997c9a373d56ce472d6b177cebe3f3a81f6ec7a33cfd2b5f668a5a433d14478e4708d6504a4765d44a9591e00bc906e717f42a5249e7c6dabb384c692676a4d95dadfbd0f464ab6b6df19bd86fd5585fb7c7a6c Sig = 89e152374ee953c4d9e69e29c3100f0168eb71d0f5ad31f6eeb52ab6caa465ac028b81478947fe08765d77dc9d4e75bbe2cfd14f25124e42f7bcff6512193cfe3ef9dffbf07020cc5e4ab0b0c44fcc4b2bc8285f16fe08be89b432fde26b0498c9ad46be8bca8e1354c39b571a8e30f07aec84a1fc9d1a8e239d79223a6af22b4abfe36ac108291503a4f557a7bae28b25ceed47fd5b81182cf391ea409de7ba1eb2b404d4468eb2b47c2930845e2e9199fff4f0c838e3bd5f3a0bc798fd6fa4be5e962070cb45d01a84170638fe2234e8df928777213a87be0adee56b8ae514cc05c5d52f872416b1ea2112e76c364ce82ca33027e0fd1f8c0424276659c08c Result = F (2 - Public Key e changed ) Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 Msg = f2280564177a0b97e8089b77d7d0cc8ed54849a90d44a7dcd319f5c6d70394169fc4494e348e90c81b2333f6863b1cedcc26672517b2bc7a5c4fdc77917179d41a364b3d844960567506b4fbe3df01cc85fed8e9872bf1fa82f1c073abfc48164bc634b96f732449e0f9450f55832432e818c47dc777ee632c46c8408f6ca9e2 Sig = 7f65da249423b1406aebe4ca1253075588b101d47207acc5dfb7198dd45548ee71ffbc1bce87e7befd256ae20250208c451bb3a4dabe87c0dd67601ce21a49b1fe723b224d02c7304876e5b2f6804f76d1d57fea8edb951b536c372929863cca988380373af61402e746f71103a9d012d0db121c4e2f636e44b6457d16d12e8b493bdec5d05fd311b502e56ae99071d9bc62dcae68b27f8db50d030963e2dab44e4215be69694a55bb113a8c43d3c2412af0ba055ca740ca628a6254add0e0cc51593cd9a283cc70303caaf8e543ac71bae196f208cd4c9373e2810c94029da46b78b421d6aa8bb00bd83c474534bbaf9629f53bd2df3346200631f7cb9ed4a6 Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 Msg = 55c50839aa7d0321a6a85cc3f55ba7f6643bc6a18a8faf73ae9a70d4e527701b7b65f70194f5f0551342eef2bb116eef94595c159154d8966fd639fbe0de525fe96af5db8990b6419bcbf10dfd930f98f230048fc5cf1ca4b0d6f883fb75d308687d0bafcf76dc4c06ec6efc0309125b4569c8f7702906053741b4537e147b7e Sig = 0b853828fa2089ce0d1955d52b20424748a4b227b56c557ad63782471cd0462295cadd808c5250ed2f11e7d2754c8734fa9d13c8b96496eefa515f3f127869bf42fc8c6bd0ea0247863b9c56747d15b16da322064f7cb723e2eacb4457c241b3f84a63b7bc307dbdd63b4d755b9b4a6c0b7590e5c1c7c5dbf9ba61eabfc29a21944ca6166e56e01a42a94b5d8b898c0fd073b03ea998f35e26289454012e62bb58222fe9a03c9b0a562b9b16602c7794ba835245a1401b8e3ae28e00541cb7a9aa8335de46d063739e8c71999b65f7c8fec3701a46bf3c60139b5b780bdd08c679117e14136c84c93fe403efbf346213ef4c85bcf3e2dfd44a6b616009ff47b4 Result = F (3 - Signature changed ) Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 Msg = e4ceaf62ba10e317e1001d8a6a008843880790159597ffaf56ef666d8081bf747ba650fd6591d3f15a81d3b7f33b59490cb8c88ecb1b06e4dee6dcfb036ca0eace8a117ca79282cb12883b1133911cba91a883be1a93702d6715e70c4266965f65e0b88785fb39ce8f7b1b4132e818be9d3f894d8ae786b37be64f454355eafb Sig = c269b61d34cb9814934aa8d2eac38f5d941d7b69e1e0cdebea5f275f9fc4a94007cfde1b33a0f9cec3d2b60c6b6675d8a91e7a3251d78c31943524ba75824cff10dee098205f0c84d0f941bf1098785597a88c10058f2c857f85e53a205de7cedc10ad3f1d2abe3cf7c61382c14eeb6d7b409f690f9690fe9b72eb84619fc1f95a8fab7bf9a35248d7e1c89559798c0958a75b85fcaf143b41c3a23864a548026d57209ef64c2d6d61bf9ac15257a531b10fcc06fa97fd6e3fe1a882bce6fd2b8eb5a6267835dd8eb0b5e3e21350f6650de66d27c719980e98ed96006115caf94c061fd3669dc64653843853269b1b6df0515cf67f3161024ab3cd99a4ff5f16 Result = P Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 Msg = 71ff5c8bd950fa414c774075da8ef7a1a58165bf4fb7670cb1f5c00cd07fb1ce0c80ca719babffe73623fef91298c08b12b35e223bb527a3685bef5e3f04a94a63153992eb9d83511435c89a322b32bceddfadc4a96cf943468bfd510ab55fd1db8851f7b26cae084c764561238d75bb9ccbfaad82250672b34f93ed19daf8ea Sig = 77b82998fac61f387b1a3264bd695ea3fff605bdcaf4c2d3a57f87f3f425134b16711c7812ef1a6c7a5d191fed835b90769883da3e7dbc81e141e3a477cee00b1283e80dca67998835ef33480caeb10f5eb02374cc38129156197e81ffdf36a09e4c22ba30adf9760c441b9691925a2233138f93bb0283be4affec35094f9866e1de3ba4a7c3ebacf88abdd8a1034e968d104235a805c372daeb7b7844ff292bf1e02f3fe8912a28d92e0724f285410161f4fc8c9ff8e0ae91feafb890de775f874de9c8fd990fe77c21525d55f882c432060da56561811cb7fa2a7ba4ad907faa5453d1c2a8834eeeb7400f17445d59a3344fa64db8ee9e97020c5158def04a Result = F (1 - Message changed) Digest = SHA384 Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 Msg = cb254c69cb296eae328fafd8354396594c74e8f9ee4783289bcc8a922031c2f517353c2fade0359ca8713a9ea899907dace6d272d982dcfe771de8803d28f707ce44736583fa12856bacfdfe90cb32e77c4b26eefc54afa4243b221b93b0b8b3f9393731d6dfce118426401e7743453fc48a2d94e026c6c1aa0c808aac32cfa1 Sig = bab31e3b71988cd3f2a772cd0e33b9db6d7aea6b6b99f631a0259ddfe9489bc662d9c6c9e03916592f212bd4e9619148dcea0b58b475c72dff8815aa3f274ad19d19126d67dc6d120e985ce16a3aeb64aadd785657fc0370c701ffebf71d83260ccdd9da04a8f29a69a01c3a9a6d2bd942c44d5cb91fcb44af60a2b8e2c94cabc23ca04ec6d3005a82cbe06546c38d4fedfc56d549c785a2e23b04ae0135b03a17d63ea504c51a0d129c172ba2ecea5dc6b8db4cec7b7a4d021da03ebe8cf6cce67b8e032b4ce780136afb144e5d8019e7916932ba87c7d9c963c0f51d62c873af41396d87877ca5ae888ea7d322faa79345080fb9d2e6dd98b7b219b6662114 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f Msg = e74ded82964ff874c9e10540c9f1dedaccb376b882e61f33eb5afd316bafbb01205f7c8673ff1598edc179a74d3e74a1d7729d16ee08869be5d8356c13afd855254eb4d2b8b55f7528a12f88a253f2f48193df61d7f5cd9f495ba34421bb10979e227cad8ef93ed21f880f2bf3b8be99721d26df64335e08bfe82f03bd5bcb91 Sig = 23cfae518dad78ff6540e64f54ecb571ae4fa33fcc57732d8555cd25b44b46f46eeb109f91af7d08c89e16f4cf6aa119cd9633515c55ab3fad64c8932417ca945be3e26028b752bca8851567da6408e211df8fa215a8ec07fb6faac5cff26d174a1b5b7fec9ab12c128489c4ccaea60c1347b8451bce07ccc9c21e90c2e5dcbea4a292c16d60ba66ca4e5ffd6c9cc3b8ce4ebe39df418573e0e9f42ae09875a11050a434538790c5c700b5adbbf700db2a93f3e5ac4c570f8543f0a1c1d664f29d161b064a0892db495b68da2454eb983db0fb3defb0f688b67c8506c20dc7997e0bb51854a85af613a3b9a0ca3e746f3d8393b62106c58f8ececb502824c478 Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f Msg = 19dc8b8a9da18dcb3cdcd54fe19fb766a8635ede3904bf27550dcfb5ae36f4a6fc2bbaa54d8fc80e9c411252a6de509ef987aeb74ee4c5291868caa05dd70596c506852ef1e313600db46457a9a49317c47bce632aad4fde01968d709e04b4eb9df653ef30a3550bb7be332491f9681b32c824aa7667448f351e82ed18c4e9ef Sig = 694678413019405b4650f73897387df0a9a0744c345e52c02dbbc7d0083c71e0304d0d8cb47e08ac78ca34bcac209679671a036e1262285bddcf8d65082d8f49db6637bc2711f2ffcbebc84b0a96f581bd2de0e53ca24c715e416cb4f4da2eb4a4d0df893895910cfa4c346ee002f35792cfc066f25f048934b911dc748ecc88f709ba96f320b3f4ac84b740d7ecd32af63a833612a6b153e06f082e25b195fb0498e57c0e284ae03fdb27124f3af34b468ec03c8f9e2e4182a8d0d18f10221f79c13715be8ca77ce322f81f7555a57fe2e759f280d2a095d33ccc89ae1629b6386014df1215bc21cd8385548b1a149f57f2cf8487a6867a1bce842240050763 Result = P Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f Msg = d122c9b539021a26f4e66a823f29791780a879da291b1858dea5baf0daa906408fe0a5dd8ca84647a49fe61c4d714e8b46eedd0c7d60874e2f1b1e715155d0762f38f2f45336fc0ca89dd49edf6b4fbd1263f561a760045c78eab8903007ca5ef85336625453425d4707bc72bebe83962c2e494271c4966a003910b34166fbe1 Sig = 57619bb864865b005fae1cb334fc5e60a23cb148e722a781b1da7e822b849b93fc502927ce9d72bf8d2f809ca6afaaf268133a7820ccb1e6c5e8a7252f67f41c8c67f97d19c718b15c32a2fd4a98c69ea535b37d6a1c884409603c80e1aac8ca32c48ad5481ab56a02526a8f37b884f15585a4989f0a7c7f3afb20718f143c4d49fdafdd33944445d39bf857f8c03e4132b1a00d52064f60172b44b67919610f2b69fdb7a51b69087915f76a2a0896fe53103c81c27d00b8c805b42d2adbd31b21d1773bc1f96b3d5f9352f224cf1ab93c18cef97134fb3cafbda7b8e4c301981ac4027486d74d1308c234f84a13cdf0e505d02c3f1f2b8e9984d6b2fdbe0400 Result = F (4 - Format of the EM is incorrect - hash moved to left ) Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f Msg = fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b Sig = 2fba3258af60a9c026bacaaba33076b21789358f63d709e4b2374c7e010a3f13d77d71aa6a70a116eda22a652706ede6234e71bb688c32697087a0c12c422e98cd6ea530ad7adf9e293c5eda311578cf0cd6b2cb32c9342f5e2e2f3fd8b27fd8b9bd7beffac03adf6148e72d9775c27ef90aa232f49bed02af05a0d1567817116a9abc0b81ffb02816ec6bac841e559fbdd7c2e41df9e4b66f76729fefc844d6dd6a879441fb212d4c065ebe6af9365fb2ff053433aca778d3a667c901dfd7dc35bc2518640a79aaeca1270646464ca55b872017a51cff49b56b53f70324168da72b0b5a297b790c89b1f71fa7937eb1e514d77f33284765b66608010c324013 Result = F (3 - Signature changed ) Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f Msg = e25750b83c69e4e14cd31a1f366d7f97134201535b3601fe9deca9e874e68051b6ee3be3eeb5d7800dbbe43e5c6e24b0b5965468f3f04ab9a71940c20dae70a73eb2e122a630803bb9217253e28fa967bcfbb59385fdddd5d02a6f14793a5461de6be77c4c20089ab8ce6b65b01836459139ccdef9a3e3da7fe5dde8a2d25504 Sig = 5c3ff26414d2af68f316f7646fe4740d571d7d08a4553c250b6abf0187c2ccf16ede3ba33acf57e28b20ecfcd0c77815d280c08ef4bc76aeba9012939bb53a5c932ccada6323d8de5b00439032b0fb57c77e64423a50d480d9364356e0b3b841cc8a61bbff8f235aa8247c4df7ac1a31faa85a855c76109cc0a8baff6b46feffa65ad576eb2ecf1713baef88cbf8a9d939558f95677e749045a06b8da3fddca07b8c6e25499c8d2dc6f2e152b75a9a85af85db7c84152291bb03a6ecd65a1a0209d8291cca9db5648acebeae1faeaf488c49183b0433d74833812ddd35ca6b483a9f24845f10c11a18152c9d3c8ce5209ec4d8c10c5960cc5889950428e557e3 Result = F (1 - Message changed) Digest = SHA512 Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400fd7a0b Msg = 2288961b2d0b66e75dfe4079804a7f99cd9735db1bb50721513a3f611e6d1ca8ea636c5f0c685dce3da191de4cef70231415c219ac1e7daeddf9db01d967b06a2917fbbae80ebbc42f4d041cd0ae511e47101c32edb3ac4f6fe52fbe7fdf0821c9ea6ab329c626d11b4bc1ba7351ca934ece6aae483e3d0bef48601f789eccd5 Sig = 394ecbdd1159193f00fcabfe13f1ebad7d74c0fa954dfe2fcea5203b54c93e02960490f51c155da452cb451aa012f15f27c9ed603014eb88b714cd3232b0b08caad1e18f80cfb81345a18c4419b88a429a4f69c72149e96acb7f4463deca7105938d51f2a9169297e2462dcf4eac45208bc509cc3e85feac0e51b3bb32974ee82fbd23b3e2dc06da6e7f64f917d00befb181b264101de55cd90a86e0fdb27b3e9e8ffb458b39b1718e20da779408de3abc05f98e196f5f92f4dc22b34a39c28aaed5d44ba5fc8a50fbcc355bbeada239bb664f2d8e32fd53a0f8a0ca081276c32cb61c74fa9523b1d3f6a795dacab8363680ef62a2a964f66e3f5c0ef5d663d0 Result = F (2 - Public Key e changed ) ring-0.16.9/tests/rsa_test_private_key_2048.p8000064400000000000000000000023021352416253600172560ustar000000000000000000  *H 0ȧPێlvuSe1tDu輒&D5~] rJOwv&?ya.F~k@X 19ssr.5UIaeȁMX$\RlI ZcLkگۨ8;mm"Q 132Qz^nBI#:8j-.vPu/jshdλ~]{lsOH8_݅x{ jdoӲ >7Gp0>Od9܈$;!KAxr_k)x&[36%0Mgāߒu,9i*! ?{q$&bf0z\HW38,! Ez[)\4XaU1Wll%i|M_ejyfR6ݍy} [)P#*UEسȸW|VosaNkvܲdp=q-Lœ!疞5_[-z\@W4_N_6ݠ/Bh}2xE84H8'4Ca1%w0N9h\`B܏nR&KcJ)BDՎO_'U \#zGQR2\=f2@.]-׻BLTݖ Aj7 C\^P.mZ t=ja-qnLm3"Rse:ring-0.16.9/tests/rsa_test_public_key_2048.der000064400000000000000000000004161352416253600173110ustar00000000000000000 ȧPێlvuSe1tDu輒&D5~] rJOwv&?ya.F~k@X 19ssr.5UIaeȁMX$\RlI ZcLkگۨ8;mm"Q 132Qz^nBIring-0.16.9/tests/rsa_test_public_key_2048_debug.txt000064400000000000000000000010631352416253600205230ustar0000000000000000RsaSubjectPublicKey("3082010a0282010100c8a78500a5a250db8ed36c85b8dcf83c4be1953114faaac7616e0ea24922fa6b7ab01f85582c815cc3bdeb5ed46762bc536accaa8b72705b00cef316b2ec508fb9697241b9e34238419cccf7339eeb8b062147af4f5932f613d9bc0ae70bf6d56d4432e83e13767587531bfa9dd56531741244be75e8bc9226b9fa44b4b8a101358d7e8bb75d0c724a4f11ece77776263faefe79612eb1d71646e77e8982866be1400eafc3580d3139b41aaa7380187372f22e35bd55b288496165c881ed154d5811245c52d56cc09d4916d4f2a50bcf5ae0a2637f4cfa6bf9daafc113dba8383b6dd7da6dd8db22d8510a8d3115983308909a1a0332517aa55e896e154249b30203010001")ring-0.16.9/tests/rsa_tests.rs000064400000000000000000000244241353036607100144650ustar0000000000000000// Copyright 2017 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #![forbid( anonymous_parameters, box_pointers, legacy_directory_ownership, missing_copy_implementations, missing_debug_implementations, missing_docs, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_extern_crates, unused_import_braces, unused_qualifications, unused_results, variant_size_differences, warnings )] #[cfg(feature = "alloc")] use ring::{ error, io::der, rand, signature::{self, KeyPair}, test, test_file, }; #[cfg(feature = "alloc")] #[test] fn rsa_from_pkcs8_test() { test::run( test_file!("rsa_from_pkcs8_tests.txt"), |section, test_case| { assert_eq!(section, ""); let input = test_case.consume_bytes("Input"); let error = test_case.consume_optional_string("Error"); match (signature::RsaKeyPair::from_pkcs8(&input), error) { (Ok(_), None) => (), (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), }; Ok(()) }, ); } #[cfg(feature = "alloc")] #[test] fn test_signature_rsa_pkcs1_sign() { let rng = rand::SystemRandom::new(); test::run( test_file!("rsa_pkcs1_sign_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA256" => &signature::RSA_PKCS1_SHA256, "SHA384" => &signature::RSA_PKCS1_SHA384, "SHA512" => &signature::RSA_PKCS1_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let private_key = test_case.consume_bytes("Key"); let msg = test_case.consume_bytes("Msg"); let expected = test_case.consume_bytes("Sig"); let result = test_case.consume_string("Result"); let key_pair = signature::RsaKeyPair::from_der(&private_key); if result == "Fail-Invalid-Key" { assert!(key_pair.is_err()); return Ok(()); } let key_pair = key_pair.unwrap(); // XXX: This test is too slow on Android ARM Travis CI builds. // TODO: re-enable these tests on Android ARM. let mut actual = vec![0u8; key_pair.public_modulus_len()]; key_pair .sign(alg, &rng, &msg, actual.as_mut_slice()) .unwrap(); assert_eq!(actual.as_slice() == &expected[..], result == "Pass"); Ok(()) }, ); } #[cfg(feature = "alloc")] #[test] fn test_signature_rsa_pss_sign() { test::run( test_file!("rsa_pss_sign_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA256" => &signature::RSA_PSS_SHA256, "SHA384" => &signature::RSA_PSS_SHA384, "SHA512" => &signature::RSA_PSS_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let result = test_case.consume_string("Result"); let private_key = test_case.consume_bytes("Key"); let key_pair = signature::RsaKeyPair::from_der(&private_key); if key_pair.is_err() && result == "Fail-Invalid-Key" { return Ok(()); } let key_pair = key_pair.unwrap(); let msg = test_case.consume_bytes("Msg"); let salt = test_case.consume_bytes("Salt"); let expected = test_case.consume_bytes("Sig"); let rng = test::rand::FixedSliceRandom { bytes: &salt }; let mut actual = vec![0u8; key_pair.public_modulus_len()]; key_pair.sign(alg, &rng, &msg, actual.as_mut_slice())?; assert_eq!(actual.as_slice() == &expected[..], result == "Pass"); Ok(()) }, ); } #[cfg(feature = "alloc")] #[test] fn test_signature_rsa_pkcs1_verify() { test::run( test_file!("rsa_pkcs1_verify_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA1" => &signature::RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, "SHA256" => &signature::RSA_PKCS1_2048_8192_SHA256, "SHA384" => &signature::RSA_PKCS1_2048_8192_SHA384, "SHA512" => &signature::RSA_PKCS1_2048_8192_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let public_key = test_case.consume_bytes("Key"); // Sanity check that we correctly DER-encoded the originally- // provided separate (n, e) components. When we add test vectors // for improperly-encoded signatures, we'll have to revisit this. assert!(untrusted::Input::from(&public_key) .read_all(error::Unspecified, |input| der::nested( input, der::Tag::Sequence, error::Unspecified, |input| { let _ = der::positive_integer(input)?; let _ = der::positive_integer(input)?; Ok(()) } )) .is_ok()); let msg = test_case.consume_bytes("Msg"); let sig = test_case.consume_bytes("Sig"); let is_valid = test_case.consume_string("Result") == "P"; let actual_result = signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); assert_eq!(actual_result.is_ok(), is_valid); Ok(()) }, ); } #[cfg(feature = "alloc")] #[test] fn test_signature_rsa_pss_verify() { test::run( test_file!("rsa_pss_verify_tests.txt"), |section, test_case| { assert_eq!(section, ""); let digest_name = test_case.consume_string("Digest"); let alg = match digest_name.as_ref() { "SHA256" => &signature::RSA_PSS_2048_8192_SHA256, "SHA384" => &signature::RSA_PSS_2048_8192_SHA384, "SHA512" => &signature::RSA_PSS_2048_8192_SHA512, _ => panic!("Unsupported digest: {}", digest_name), }; let public_key = test_case.consume_bytes("Key"); // Sanity check that we correctly DER-encoded the originally- // provided separate (n, e) components. When we add test vectors // for improperly-encoded signatures, we'll have to revisit this. assert!(untrusted::Input::from(&public_key) .read_all(error::Unspecified, |input| der::nested( input, der::Tag::Sequence, error::Unspecified, |input| { let _ = der::positive_integer(input)?; let _ = der::positive_integer(input)?; Ok(()) } )) .is_ok()); let msg = test_case.consume_bytes("Msg"); let sig = test_case.consume_bytes("Sig"); let is_valid = test_case.consume_string("Result") == "P"; let actual_result = signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); assert_eq!(actual_result.is_ok(), is_valid); Ok(()) }, ); } // Test for `primitive::verify()`. Read public key parts from a file // and use them to verify a signature. #[cfg(feature = "alloc")] #[test] fn test_signature_rsa_primitive_verification() { test::run( test_file!("rsa_primitive_verify_tests.txt"), |section, test_case| { assert_eq!(section, ""); let n = test_case.consume_bytes("n"); let e = test_case.consume_bytes("e"); let msg = test_case.consume_bytes("Msg"); let sig = test_case.consume_bytes("Sig"); let expected = test_case.consume_string("Result"); let public_key = signature::RsaPublicKeyComponents { n: &n, e: &e }; let result = public_key.verify(&signature::RSA_PKCS1_2048_8192_SHA256, &msg, &sig); assert_eq!(result.is_ok(), expected == "Pass"); Ok(()) }, ) } #[cfg(feature = "alloc")] #[test] fn rsa_test_public_key_coverage() { const PRIVATE_KEY: &[u8] = include_bytes!("rsa_test_private_key_2048.p8"); const PUBLIC_KEY: &[u8] = include_bytes!("rsa_test_public_key_2048.der"); const PUBLIC_KEY_DEBUG: &str = include_str!("rsa_test_public_key_2048_debug.txt"); let key_pair = signature::RsaKeyPair::from_pkcs8(PRIVATE_KEY).unwrap(); // Test `AsRef<[u8]>` assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); // Test `Clone`. let _ = key_pair.public_key().clone(); // Test `exponent()`. assert_eq!( &[0x01, 0x00, 0x01], key_pair .public_key() .exponent() .big_endian_without_leading_zero() ); // Test `Debug` assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); assert_eq!( format!("RsaKeyPair {{ public_key: {:?} }}", key_pair.public_key()), format!("{:?}", key_pair) ); } ring-0.16.9/tests/signature_tests.rs000064400000000000000000000004741352416253600157030ustar0000000000000000use ring::{signature, test}; #[test] fn signature_impl_test() { test::compile_time_assert_clone::(); test::compile_time_assert_copy::(); test::compile_time_assert_send::(); test::compile_time_assert_sync::(); } ring-0.16.9/third_party/NIST/SHAVS/SHA1LongMsg.rsp000064400000000000000000014753331352416253600174660ustar0000000000000000# CAVS 11.0 # "SHA-1 LongMsg" information # SHA tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:35 2011 [L = 20] Len = 1304 Msg = 7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d4 MD = d8fd6a91ef3b6ced05b98358a99107c1fac8c807 Len = 2096 Msg = 6cb70d19c096200f9249d2dbc04299b0085eb068257560be3a307dbd741a3378ebfa03fcca610883b07f7fea563a866571822472dade8a0bec4b98202d47a344312976a7bcb3964427eacb5b0525db22066599b81be41e5adaf157d925fac04b06eb6e01deb753babf33be16162b214e8db017212fafa512cdc8c0d0a15c10f632e8f4f47792c64d3f026004d173df50cf0aa7976066a79a8d78deeeec951dab7cc90f68d16f786671feba0b7d269d92941c4f02f432aa5ce2aab6194dcc6fd3ae36c8433274ef6b1bd0d314636be47ba38d1948343a38bf9406523a0b2a8cd78ed6266ee3c9b5c60620b308cc6b3a73c6060d5268a7d82b6a33b93a6fd6fe1de55231d12c97 MD = 4a75a406f4de5f9e1132069d66717fc424376388 Len = 2888 Msg = 6487972d88d0dd390d8d09d134860f263f88df7a3412457adf510dcf164e6cf041679b3a19fcc542af6a236ab03d66b2e8a155d1061ab7859f75732775fff682f8f4d5e50d3ab3770f4f66cb138155b4715d245b8069948ea016a45b7ef0fdde93188c57eef4717f3425181de5b9a5d4e0a2963f2a67a340eb1ae994b98a48ab19b90ab74391c50426d28287ac4f1eb93f5af1a68c7dae40876b8afaaf35a19293c1952e957978abee40ec32f2aa880c956c7eb72f117b397cefcfb4e75ace3b081776e46b13521e93559d453e32ab74ebc0859b9a8dd4d1d39000ebe95f984d80a3f5004dc91a051dfbdfe9194f4f9a483e4e7955577fb0933464c63eaec771044d59abc3029a079519f8460a693b25b4ce207ae9d9447fc4c5446e6dad234e9afdec0c562798cd0297318399e838be385845c6dd79ede66e2ae80afec6738d4d9bf44c8d9eddff6c5cd2c94e340e0ddac40384b9a1408c9a4b98c37a6081d5220fba92f1d03144db MD = a135e32581bb06289b8c83f040e9421ec79bbe01 Len = 3680 Msg = bd74e7f607cd7d905e90175d67650a6dc2f8a4e2d4ab1249ca88812bda7984deccbbb6a1ba90a0e91434ddf5e6137ba85e39a598890a7f635d335242fce0e9e037303b6c51e54aec06614ad5ccce06d9599c80016530d7fbb1da6eb548084b2b05babd7d553642443efda726a1fd71a8bc087c44f285e2bccf661ead475a72673e4386fc4eea5197c4f13c0feb0a85bc8e67e28ab872684bbebdaa527f3c253debb2dc12c2693f8e9e2651b9345c0abed7a0fafa3e5d305386c95acb7a172e5413ef08e73b1bd4d0d6832e4c035bc8559f9b0cbd0caf037a30707641c0545356bee151a24068d70674ef1befe16f872aef4060faaad1a968c39c45dbd7595de8f472016b5ab812d77e545fca55000ee5ce773edaa129eac6473410c2499013b4be895f6c0f734becfe994306e776262d4528ed8577218e3cc5201f1d9e5f3f62230eb2caea014becfba60fcb1f3997aa5b3bb622b7205c714348ba155c30a79a2cea43b070cada807e630b4086b129051898e1d9e68d1d0ecc9429d20d6a1403e0035a442b37bf508eb87e8ea347a3e68427b6d48ed299ba65ecb37b38754f4547423eaea2aec403338db2dcfe61cff4a8d17c383656981e1838a23866b91d09698f39175d98af4175caed53 MD = b22b87ea30f4050913f8f0241fc2ae2c319f52e7 Len = 4472 Msg = a52638f0efb19bff5ec95fcde4ac9aabd95e14d2e5f84c551f43bc5376855e71519b6f877248739a20cd790b85baa00d5503da5cb056f02d4aacc760c91fe1fd6efb26def817e5a9c56616023bc9e2fe662765dae2c0b2edfcbe17db140da30c466de65c49c6f81496bbbd1acd81666455f23bb243dd987d7ea1362a20faac841f1a36692cfcb4c3dbf5f6bb058c36296b8be64e9b56adc5187cacb7b58c054f422a9e6d6a61229fdc3b494da98f5a33ed1bee14b2d2f6ad1177ffe99a6bb553f7c4a6d0cb9e498ee0b63f388235d86c26c9d96e50fa7d1eb3bcb9279940c47a8510d7fb175b3279318d5fe45823baba5dbe31c33c7649fe447061db78b33baa3637b854163fe34915e931b9f3040807d9217d7b3fed62370dbe806c006b21cd5061d24490f366e4d5f23e201a7ec83ae31b46fe2108d1af56cc9d42f9117eca1cb5ab344c1fc334b9cf0d7f9739043bc3d413b3aa6e9d5067c240c52b4c5b89e25ccd8a136a002008a9273f30dec3f2c1736c04a1c7ce0087c9f25d5ec5bff2ea7ec0b0ad7c278f0ca712c9ae150e472521d958d0bd6da9ff0939725924b2ed7b410a0ce2fe3f6b0bf25884d885ec223605e318fdf6803218a9a06ce5103c62ded035087a98519b4eb180d778d7656b3d4811aaf11a128317d1acb3ca3166395c51c90a3cf164071d0d132c54b3810a8211ec7774d2288447abe7afd030375a3bed4c7cf1b28097c02e98ea36bf49e74d89fbe74ec6cc1def5cd8c8beb5b8adc3cb48c56182ad337e3b9778e4a6c4 MD = d742931bc51d4d44ff938783be73dc7beccc980b Len = 5264 Msg = 892af4c05368aa9242acedd87d0fc68de483ab59520aea621f264b65ea90f005952c8163903d86ee5bd6147d4691ac9b7c8260213f6e370b7539d384649e5143ba23711ad04bf7cc2f0d512054857933b0ea1d12f3c0fe888a4e96356653fde000f50d0f9afac5d4c73aebe92d54f5ff8aa12a54f5660584674edaa17917bb856f8b9d6776b2b7ad2a462b015b67e8a71190cf0ecdca15a5121fe8ef245255da10cd694decdb96006017599066251ad34d9f54690452f59395ab0848f06c9186eaa3b8e785dd2a747297bdbdd4f5532a47b7008c21686ff7f8d881d464cd383205f6d45dc8203bb267ac9eb12f415a5406be1c9fac73497941909dba08dd12856aac03d83e0d916147404694fe70f8fa929ef0cc2edb4cc07abaa2236405e62820af8e806d0af32a1b3afb8dcaeaf5c4f43dc4392e074075aa3ed93601ab7ec22fe5bd7cdf802bb5ea8206c41a1619593385e00e3461ed3fda048a1c6639a0fca038d7f51cd8ffa9bc00af62765e2b62575c8b74c8501ac711f3fdfc1b15157e7a8f2612aa7838af999c3d8f6629f58669ac0f93733c91b557f579ffa9a9a4efc5d1f0fc13ca9e6e8a3efa7273e03d6e705cb292bc8d18b0b4f1484d975b17f88ae87edadf34f88f96ce2c3424e9ccc17454bd992cac786031d0b00d6d953540d0bb18d5942010b9c6341cfc02ad6a287e7c78d249ff796ed578fa68b4bec5709f320515bcf5ac95215812f39494de4b94bc2a639eefe282a9d26d85f33d902fff358fc1de1b95caaf2255416207f2d1c1fc1c74b0e57d43b3c6538db27c5e26f9acfc0183fa9301787b2f0df46c6c630a24972e0947105afd3df2a779e2f6fc947f95ff32fa6de28549e67fd32c15a8791ce1b8307e646e8f1d94fcd1d7225ad997a2e07383ed14dd76c3c186b0b54915cc MD = 20a3a677c117c61ed3bb19e2ac77f69987896d0b Len = 6056 Msg = a5045d24d07578ca31987db3d2e25e12ea38bb1da7a8bd642a574261d4ba3a50c009504190f1ce6b6d8abac3498845cd67b567b21e9fc394da8dd01e63b83a5f62b886d8213df6d392ffacf793f8111a70d07856a999ff5ff6bcb6138933045393f9461209bfb8aba8e1997837988aa00c713830d1fe3a6e88cb3d6acd935ed55bb4d716d2e1de9bb817ca6dbdd278084380ed691d363c6897a2aa48b741118dc3d1820d030a2e4ac88987ffae0da2f91de5e02816a9cdf62c2948d7d0a3e522d2398f1f25a17261e31f185690b0d11ca388599642bfb5c04e485e3f9f22a13d91d24673bf1070870ec1c499ee25cd19dc529fdb2be1bb6d05e733a8ad270f850685ee3259bef1655357d4f14dd35e97d129fc1e5975a9a559ee10398018f5a33b3bd1837c13bca3b9c9908537224c3e88f7b68753e5451253453d1aa25e1c3e38da358fae779be848ff407e337a5eb70ba21640a197585afad402749b624cff034b637e7a5254dc09e12c03ca435daa6213646ecbf5a9255784a76ff18b4c8da677a377650cb02803589c3d82e512be9333e83c5965021c703b73322e40e69229453da2f90d77743f4ad753e6c8429ca8e9ead0d45129e64fe2afe6d9ebe0b3929c7828bdbe7167c3a1266e7b55b8eca81cb152c420e72cfc62a4b27bf3039aeb669d31398565aa9943d1b6cbf23b559cb686ebaf3a04967da197bf9bc017ef3c8af4e4f6cb1de5c91a20525d08927f8b9eb1c21f0748cbdc89d334c1bae4598bf0c56a7bf95fbf590c5a6bb90086137dbc7a019bef7b7421019f3a76493181e28058eb5075f4e05303c9286840dfb97bf828cdac5a643852f042f940d5c80f4822f48efea9a4f1bee6b3b2f13265188b3a0551d8b0ccc079400598aac66faac6bee37b0cfb369aa39d6130dc3ddfd9b86a57b2aa597bb49dd830403984effa623c6bdb02d57482090f1bcbb2c817a30770671ba7bd39bbc7a00b18777710a82684d5d6699e2452f82629abf93dd31f82347db25944ce7dfe80dd49eb07995c1a7e6993c8be0fb179c9d2f73c03dcf5309fe19f47 MD = dd4374e29b17e2ec533813feddc5253765cd37ac Len = 6848 Msg = 912e0dc25b52540f4d33d26fdcbaddb420f5570141bccb8c2c94b8a38ad32dedf20596f35d8fd6dedb9296828512dc9cb358df586f941a1729c79f6eace0ae725025863371d57b86210c49081ae6a85ff6e720c3a39b1fbe1179492f2d0d0f951357838a7f6e6a8e85689306837e6884536cc349c51703094c725eeef7a279dfa361350170a0cc7e71701e86a822459431ad6ff3bd51ed80427a87b1f1e713d6690b469f2ab4c9df4cea8f8f711a6716f874cdc8739106ac5b596c8203240604cb1f5b6d96f288387e9f912ac6adf5920f8785d0cf1f751400d6b46815a079f132631f719ca132116f57ca5e8f251791e0ae3e13ba42634097bb076c0fa4952307a137b5250aeef287dae233b4c8f79ad2b3a09a1a43f8b98ace0f94d9788124b09f4e411776e5642eef82b11ddfba354d5d556cd96a5b063fd871ea5c64667c97260a1b5c2b3feecc6052e1b2b18beab9730291ddffb5af20a0d8767eb06cb122fd134dda722319c9f3f9ca5c8890427fbe5212104a2d3d93f0ea3f28a3ba4dbbee12df7b92b96c8d71207401aaf1c40506eaf65893ec37028e4f4d438679d8c9bfafd725d52a6f80a16ee88a60d7f9b41275459f211a25d443b0a8b5a1d0d8b439913fc2819eaa0a4d8c2de0f26a67f4ac9907cc3dde8f71d7b559683ce8d7e324611e39df3ca6943b214be9a8d1982e9afe45c72f60fe41120567429fe95cc048c67d72372dea8434d64b8fca3514c8a54d07783fc9faacbc49da2d12faf0b26c696355d199fe44005334b99fbd612c952e53c7b541091a9c28ba10dc431a215af1d8caf4a76b3a673f0e4f709209c03248339cd8efb5f37b4b10d246ed6275d807e5b9e97fb8d03142e23885db94ee4444aedff1fc859f2159e35d98205017af53900af94a6d6d2505b75e26c1881d92c9cc78488f018656fb3c981a036d6da77ce3a5693013780d3095a89b6c6fb4e580964f25d1b210e2d9226b13bf40e0872be6728458315baf6b84fe2b03d01d0511134cd0ea1fa68c9a9dbecd7b51d91907a05a91eb4f7dd35c8d4820ae34bfba234c589001d1ae1de7b5798e6029be23b91943d710f54643aeb76ec0972202cc5e4759af3e4e925e6773859f964ff86ee859179ff0ac1ec6070b5954e3224e026c0e3973ca20b814c3dec848444bf0c23d69bc31b2fb6d23108fef23bdbc0b25f2a9de25cdce MD = fdccb6e47645928fbbd51ccddc6cef48d6afc011 Len = 7640 Msg = 2298096d8a02225d4a5a91e95b43bee70f5a23f95269b1602fde6f11967b650b5c4eb8e783e416b1bcba54f62af4561e695130fccf5f8aa4f1eb497d69bc6c97d781333e260787cf11af96cae520be298839acf0ba49c5069b83c4436daca5ca9c17c399fbd33d5e51239d8c142ebcaf74f8e0fd9c91282d348d2a8c2ab3da4db2faae208bb1ff0784fdb3654088195836781449fb9e7cc2c4f0c17f273ad1c721103cfd5d079672b3251e7df0959cced59f90ff62d8886c5496d245eca753e1f243b755fa3ecb46e68226fbacbd0fb659579b4556a716d4ea66a405016428432c796553e8bf642b23fe1508fc6838bbcb877e436173eca1914881e8efd71894d79c901cb1f129cb748031cb69fee183321782230aa4d37c4e24af163d6aeb7cfc937edbdc3be4cbe0f1c46d7ae7d0b696eeec0ad9a2930d2be277b6738468a5a14677b6f2075bd66f371415b88ccefdfff6072257d6f4fb2f6b21f0198c59b4d19dc5d57abc57922a3b6aeca953a20076161a930ba6beef62a5f5eeb8ec84549180af61fcc1a0a718e50d1ad7a5166602366c857e7bb890cd793bd5d70bb12bebd77c820180febe421e47c6caebf0d7ac3e461f36beac8777cf3ad0ff51aae1e68a755f1060397faecc5e18088bf9fd7b17f089bdd5607b69903b04b726361f8a81e221b1c9189166d89b391beff97d77a7b2ec9b2a9c15a9a2869c87f21c8de0a50bef6c23659d722b46518b7db802a8d7d47056232afd41ef63bef71d25d2efdc37f2cad7e64ad8aca787de9ffd3217909d3c782ad1da385e1a93900f1996c00faf52524b6441a24205049ebc91b5cbb8577989a6585497d6f242d931c0835927bc368de8a629d8d7aaf0523b3d34cc38484e0fff8814654134f35be9e13fc40aa4c6011676ab8052dc728386c75723f9b8e4949c29c2aa8629d09ca0467209a2af2c383e9a6fa49ae4b2b804f7c5d7e2f1629fe703066f8d16fe26bfb5c52ed5278dbac6db1c4b990ad9791d9727f0da3af1b947dd86bb3e46a881acf7df3d8d52140d18015a7e36950f4f396d2477cbdab9682480ed968100f433d1d46a3db17ae6bb9ad4d34459cf7bc0c04365739c1ae137e7b5e1083e8b0ac695130b3729e52e4cb61c2ca5eafe46561adf91ec354292abf6420a1a5d3013c25f7e6c32dddb1246d3a010a9d26b9799b00951ea7e9af34ebaef12d3c63737ad99db3536b5a6ba3358292559f75e9710e88b4d765f692da79b869e3c61e89d11aaf30e4c998d4f9aaf7f13bc421e6e432b2c2c97c0f9673e02cd595b178a6e75fa8e9d7a71d7f9043f6a83da9bf543bae2b397568990ca9c558ee83ace67 MD = e50a54470f59fb9b654bffcb4c353e58b683ada5 Len = 8432 Msg = fa15cc7f0de294d7341b1fd79326c8be78e67822343c19922ace4e7925076145ef5f7dc91fdc1de032d8c454dd06effea2b0472ea2421c4db20c0fc0b0440e10184a8648d230d39f4e7afc57d3229de514e0245205a840e1ec7397f2bb42b8269d6050c4cfe8a05cb1882eaa1d84bbbcf7fe765705746f98018a4ed7ed0a45d0a7294305bd0c6b5e828ac413623432cb7292a5064bb090b819d99d36efa39f565e2cc7d245a21ceeea09255b4a38e85aae2519257f638b8a5be9ead96815ac00e9f145f50fb49a54118cb94a7f9ac7b1d33e397c49964856f0419e860169561670002334c249cfd81e9be8a7a662b61808666fd54f50ae64006a220662a683df1de2cb58066aa2c23abe1a3c6a969cd6752423f63c99a7fbb2eadd2132d41da4161ea329851efb598c7eb7cf704063344300bba8b6791b642e4b369e1afc0bad833c156ee46dc2e63d6227296367f27a9a82a0b365f9f0e89d149747c12435428dc488f1ce5fdfb174f3d212e91431f0a1333adff3200fcd27ce67e2d05783ab5c3f6478e9fd3b025ab72151aa4e08dd819af1f405f7605bf3000d38ee9add2f173510ccdd4ebc2117387ab0501d5f8b61402eb94684cbdc2a32f311c4f72b18e62cf6b5535a4b55d2fe46f580891e406aab57f75bd13996f3ed8035f97555acf2ae7dfaf32ad1e8b38feee9e49b2d45c465d676efe690d277b71c6b361c433463420d6564c53420e375d854245a74e296f611fea8c9bad8dd1b2f7c23f5def761710ebc4f335e468a386efee8cfdc5e08e472572e849df04e9e213167070c3f13c1e8c85b7d35a1cf5e17aed7004b0344b95f482a1f2362f2ca5b50ab5bb652a1bc045131aaa37bdb713a2e99f7aa176ffc429b44a03375f02643a196f7c57934eac81f78c28f1ad6f94144d7bce2e3b43682162311b473713a42eed1e51ffcf4d29df9d9cee0c7e77c93b93955d9af39ee8782707990a29c8fc1fd032dae2308fceca8fcd580ca3684985466cc79c326acb9a6d2e1ae4b9aac2697d5d5583698f01bf588df566bec98b8df0729a966a4f9804cf250f6b59219da84efe7077cce3794a526f54af231415b20c37250e1db5b443a77ce502aad5f468cf86aa23ed058bd837d1d44a62c05e9e143b1587cf25c6d390a64a4f01305d177996711c4c6db005636612cd1066fcae82eeda87f118463115318da50eb93e20c79e53c56d949c4e5f8c9eab9e60466fd2d2f2832625a8e8af9f4da925d92e31441ec0b3c302870f96c5c67a6f54e26eae87ec0dd0a66576ca5008cfe93893b58988566bdf5036e5a392289e25bd4707606e258c73430247efe43d9dcb200529d27b635234d5f25d0082339b43f1ead683063d83906415e89adc5a773e57f90ae958960b462c6fd2381686063c9b546890d0a287ba8206e55598ee00c528f5d528b06cfb95cbf5e1a4bf8e4382320a1a146de31d54355baaaaba76aef21b72150b134 MD = 9b3ed390fbb328a1641fca93691763000523569d Len = 9224 Msg = b718c968e8ffe4ea282fc33f96da233b8a8ab6ddd55781244a5d82237d6d9758ca039b3a9978d211e179870aebb8f38b59e161c466d090876f015959b34891c957c23100ad0bb49ab5b1c1b4e4e90a46258174b41e16789fb487c901d1a93779643dd3e3aa1f542cadc0b9640ad53015f65137d48391011520d71b445ffa4f11fc5cc90b1a1b7870cf8cb743e3e52da0d539f14d1faaf291bbda9749e6a2a23824075a9f8469e90d25fe0379f97fc88ec921ec467ac715ba8e768439ee09f897e626cfc771706facb7fee42dd40dca88dbf16ee81a523039a0942c3bfd9719d549a170ad6898d1f58b75a488faf5fc351291c05a89b10cb5fa1dd5789db4cc9b55608576f149d98fab4989b1f5a1233e76ea2ac54f4e71d7a2f7c81755c8da91134b564d94eb4d231f64dcd04d770a4a0fe2f351f28f2747a20c4d41ad3b0c5e8a4b2b58dae6f658edace40f88e17802e6626525fcdef5ac0242ab1e2e7528abc3464bbf4aa39cd71f0beb943045340d0253c66af5a2a4afc8832cd55fdff61fc425ffab6d880748bd683787cc0d07156b9b5f476342fcf7feb6168fc9df406397d18f44c9fefe51cdaa1111e5a0b9bf2a2478e5d028c52dabc3b273f2decc1e443143b1e86e4b9d59bbc15a026612b546d4596cc3bbc7f8d89148aa644563f9d12c621b523eb4d268828f89abc7da9fc7954903c563ca018c0a205ba77acd9c48ac36a98dd8029903e7c3c6692bd824b64e92d25d8895efcf1581af41e7d2aeb098058423a2fd9931d2a43bc2fad5ed1ae77a021392f16ba99ab5cebcf23ad812d718d39c066c7bfa2b7b0d409c99a2fb474abb6feaa61d238202dfa005ccc17553b7bf7e6a18e666da90676b7aecea61584924faf67cac44b3b10a73875111e1f32a705338ca837ec82b6fcafa966d5501c1663b1f3bc115160979bfe092725f9fb80da2d748fa49db944de5855ed4de2af8a8bacdaa039c9354510b77548af53faabef4af5af2cffc122a44840dc705bb37130069921be313d8bde0b66201aebc48add028ca131914ef2e705d6bedd19dc6cf9459bbb0f27cdfe3c50483808ffcdaffbeaa5f062e097180f07a40ef4ab6ed03fe07ed6bcfb8afeb42c97eafa2e8a8df469de07317c5e1494c41547478eff4d8c7d9f0f484ad90fedf6e1c35ee68fa73f1691601da2e87b00d1c6f256431227576398bf21945cc44255925bb7b6517e34676c959812eaadeba7258aa1562c102938e880d9466aae49bf361e852c54858ce2dc02313ac93fadbaad8aa936b17a9a740adeefffa7106caa497657a72d5fa0ff4c506998f8b2df82eb7cee7356d9039b7c33d61e86ad438d591d9fb5206f093349eaa1ac1d89f9a65bdbd18a70adfd15a91a1c318dd736fec15edde4f2263e25614b89e29c27748b7b11f2ea838bff793e1c32c72110ef753ec492a50737a82c0efd82eaf93de8b8c5d9e32223d5834ca794ba4de50cb5670de94e73c3f5efddcf7b1d03b91fbea4c87e02bfc62d10f6522e03444e0d216adb2761dfdcf36db11f4ec8eb506f7ed5ff88d211eef5211cda42ae28c0a4cbe713299d57a6b2ba2c6ad30700538f91c2e784e1c702c05c06ac7d3b89e1661d72324a217 MD = 09bf403d8a9d2334f28fab704d9cab87da43731a Len = 10016 Msg = 32245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc3049321327d170d4bde314166aea193ce99b032c8665c3ad129b58528ba87c58c6539cf47e3f53a6b890a295cc08e658eb547af9052cc544a6ce701833e3ed9a61632c5c54e080bde7e46235df060c6e354944746b51326d9ac61e3edd4fe10977d46aab4a596a92b24b0d6722661dd54de61a3f1797ad90651ecd26e641191e9043d271dd0e83cdae20feba24ad7d369bb746a9985499559c350760fd6bd852312dee307b646eb74222a09f6440bcfaa54954546c1c8815b6b5578d7124b14ce0ef2877a41f7de804bcad974fc45faa00f8edc01153ec693afc380cf000365716241ba7e58453e86c5b702265bcd7bd25526d6d169f58b89f86135fd892ca1947593251ce376330ef7b92d1447ea7bc88f24dcbfa533f9c6aff8406b930fefc0afb06f5bcbd3e4a14b980245a9e5220b235195d2b14138d13a50482107f5787b78604144f6a47ac6281b28c16a0697227b75aa1275676f320331f625ce246450386a43dd4d311c06f60c489070950395fd58c287daecc7727063f281cee5dac457971c30b8c1f3e81e3109bba5da8ded13c1863ac61a6718ebade33df17f02613daf7545209e27f406521448f01d5eb124799d32223777acdbd9725f1e3c05ae537af5226b0edfb21739104238a59d699749b177d78c21b7a8ad46f13d620b33ffbf45d1835a43abb9ada6ae67bb739ed6f76712cc618bc0b9f208fa353a3b79aa480c5a4eca7c6655757e9664a708d6484b690ae8fedd4f786f5f83f00cbe07bddbf3c3b6a5b26b515a3f0117b1839c550f5f6715aa40ec4ceef4935520bc659e41a216a2350c43172492f868210d756509f0323aaedc209d356e324cbd5c1cb742c05bf9c0b3750d9b1e823f3ecdebe002c5723e52d872d40e7668bd2cc6b36fa5f598a58fcf899d868ca78451ec852fc3862f0bde5c6b573fb43e90b623b22d34ebd78dea87082eaf836f1fa291ccb811da71889a92918f90cfbbada19ba25bb5471f9918037927dcace3f879e546e4b769419dcea06fe4cb70e8fd35550a60f1b479b1636c64f2d6af0af81e107d1b7bdca632c1ae8abfb63ecb66bc7a72a4b0d8ebbd11ea51f66533ed05d839f9c627dba92fbce56c861be26fd17c31628fb95b80a56ba4c99b50e09208f188404b810d517c076c9ca3c003d927bea36389d6e63d51b9c35349615f03eaaf26dc14521ba602ea6ca27c6d4a134ecaf7fcfacd212caa436e78685e5848915b3b558761acb0a7ad0d077bec5e2430e856b64a67b3549650cebf60107267e73cee310e786978549776520604e914b460e818e16c45bdfe2a0bb09a3f566ad39c68fa105dfa05f2f1d00b877c90ebc179d4aa27a47e70cb174cd37cb3ac583cc1d137f5d9065f670342ba651dfdb2417d43f485d70774e360b9b16f331b3a0cf4507124b4358f9d15f5e808afd8711bb25c7f61cc87d1304d7bd1dc894b172a7d0d2f07b6319c7a6f111cd8fac82e376148d2244ca7909925babb297be5f77ea431f905a79f8ee859bddf3dc576f37dd12e75371f0fb805329df8c0d291e3f0b1e457864e2a6ece1a21b89fda8ac7d54c37f1000d66515eba4d0f0755f6e168eb4dd2f274784313fb662f66ffabb327188bcde9de54648b06f28868cebdfcce9c95f1b2e13115a144b4ccfafd81bd5b7e5191595983f7745eb3ec49038d390a0ae33d2c5dfeec5f3d3218c39bb5f059c6b2c6b84798150109b8c2 MD = 7f32d7486bde22ed00eeeaae073858144dc3ee37 Len = 10808 Msg = 9f07e6b7ea8b6d2bb301d6ce7019e0f27ad55abbb799e6d47681fe609af63434fb84be4309e63159b3638d0d875e7af11a28d10baa185e8902dee5b09e14621610169511a214be6f3d65a667891eded056e44b913bfee3597caeb19031c21f8da5667409fd3c9cd31aaf28c6c08495f9f7b1d135b173fbacae9b6ae79d28f201841b6213618751ef12e81b1172b526d2c5396adf569e30ea5e4b199f287063da73de6817181d672aecb88730e8dc19c587211e7770a8097b5566c69f1bbffa803b578dfd682566eb72c9750a6a1ff7380714f5e548b80ec75b9577cfbe40405ba42dd9ad9ac7d49c6ac0ec893fa647950bb8f81126f7c837388036175818bcd37509540ff52d3ba49d48f594b19a91435cb52ee4518dbe31b3ce0a5f3372f7517892070cc37c226bd307971306235eaac2b4a04413a1781e9527fc8f9574773b7371f98a4adf1259d3a5daef87683432045d541ab25b7f67a635128fc746c6fb2f4d3272d47c92d667cbc60e7c929e43ec57544f77e45a72ae9d564711116cf774cfbbada77b2a4a552164592dc82145404ba8c9aa6491a9750ad0a0bafdef99099f9b220b05621d664ebbb8e13347a0c9e056729302ad73c22287800c31d948b864dab84a42c3b762fbd314e2fb97bc4fbf68317ae735375f8d83d14dd6b16b47c68159ab59d48011cfb553764799029a8fe5eda63bb15f12f4cc79c613006c7f6f97ec75721de13b73685fe63fd6d871f9d6906025aa52a4ff6b62bf114db228042458f1b72740a78ef41e7a0dd5a79da54201f0cda778dd5567727ff720a50a303187674e79061ec9627a79d61ed8e73a31289e5c3039849fc89350ee01adec99c4601e5f9c9c68ccb95a2dc53ad11461acedb2facdfd638496ac781e793298e7e8cb601316684d3e01a5dcffb0fcefc1b93873ce072c40addaa440ae0f9cd4c3a2b0739171d495c74345cfaf08c03f0363f12a01652ee4c19c65f0c74c5369d5fcf7a0023447071086214efbcb84cbceaf001fba706b1769e2d6d090b7bf1fc4fd892f8ee8296cc1d221a00b80b25ccba74d9a22ae4ca04db6df2832d849bd38ad4c685c14e18c822f2d0f08afb1baa152c1e361a93749141f683fd437570ddb1529939540d92ff9a62de11ae1e9adf9b842419ee995d86726595e9f5d53d5523c08f760f5781dd13e095f689cc2fd7be2b9fe02f4cf16edd19acdbbd1a3de482bd2dde6b9261db000a9d11b6ba471ced70f60b4544bcb4f2a14d44f1bb1f063e86d8d4f174bf93ff2f67f5ad3f7d39b9f2ab0dc9173bf3439adbb83c4e3d34b7dc34fc2944f77251ed6b04e5e23e98943f435a431aeb945054ec98053a34ea9f1bb6b67ba9b600a8c32ae1f93907c41ca543932be63832a96e0476e50582a254d3c286710957b9843f3bff4faa6536a3c3102aec0fce38af4497d7543692f669830d0ea1ea692754bff2cf51cce38ada275d941bde0a20d2873b3bbb5402515da7ea9176d366b49ac403d4c806ef1b2030706133f77885c3944316b2e44d4d91c0efc1784aed0bd6e9d391eaff0472067cfd14bcd295c1f2fa63eab34dd045b65c81012eb7487789afd6a962fba02a0d6b58211f05ee8fd128024a351737c43bd942f2f2bf25823384a16d98a36ead959a1608f2e7ef29febb9297d0c6e05382c5a9f96cb8f0d664e6b861247cac674f77bb4ea12f143adc13b965eed3767e2bb02a97053b26ce8e6480267efe06018b92bc64d211fa3ce9dedb3707d346aea717495e54cc53f5207c9d10009df7e6ea599dedee571d9aa86b7c7db43ced5f85798ab1c3d2f4c4bbad63d061d2fe91dc6ae44c5e54dafea84811cc7c86d72b37356333eae585c7c06578ca1b43869ce21503f2ba91ceb369f33f85b927a07c4cf97747227 MD = 37b7277fc606556160f9bc28b06fd55f4424d9cc Len = 11600 Msg = 25a43fd8bf241d67dab9e3c106cd27b71fd45a87b9254a53c108ead16210564526ab12ac5ef7923ac3d700075d473906a4ec1936e6eff81ce80c7470d0e67117429e5f51caa3bc347accd959d4a4e0d5ea05166ac3e85eff017bff4ec174a6ddc3a5af2fcbd1a03b46bff61d318c250c3745da8c19b683e4537c11d3fd62fc7fefea88ae2829483871d8e0bd3da90e93d4d7ec02b0016fb4273834674b577ce50f927536ab52bb1441411e9fc0a0a65209e1d43650722b55c5d7ef7274fb2df76ac8fb2f1af501b5ff1f382d821cf2311d8c1b8ec1b0beb17580ca5c41f7179e4ab2a4013eb92305f29db7cd4ac3fc195aff4874ca6430af7f5b4e8d77f342c0f578f714df4728eb64e022e9e13dcbf00663e34f35368a362a91026ee196b746b4437cd1c546184e9b1301e8103367a06adf7487c8cdd330c04a6f6546897d19cf3bbc9eb75ffb18e05cdd329d4dd90fce9c84844cd2138487ad1bdb6d749c1f8e873ee47e3ada307be33c2f5032282779c19aad88ec521ac8e390391ffd1d4239508a0ce27ebc7eb4d1a947f38b5cceb5773f6c46c499daca1356e524cf076917bd297cabd4aaead34ea9e24cff7eeec8e6fa284c02efacd766f3494490627c71f7a29ea1e3ab5c1f81c6682537946efb35534a634d5d783504f1cb47e936628f257dd98c54c7bce193874144daa936968dd238534dea262d14d8d5f4818c05b970439433ce06f262ac74d57191c22ee115005be4ab9e9e07bf2ece14016b4c37007b395ffa71e6e7f2168c7604e93e24f6641bde0f81c80b2c7d1e6f10dc1f50fcad2fd87f0f81bb90f4cf1ada254ea65787e108209c8c81844c2ccd57e6664e8c62de6607e9a925ac970424bc7f46b061ef132b87f6d3b0ee2462f67d910977da20aed13705476c6f85955d51fd0e8a3b261b0fec9783e1938c27b12be5f1140b7207e0b96d44d90048e88d42aa8e7c0fb45f7cf588865c9a0ce3c809eb046c4add515d352986b48768677c368bafce021f493a4dd0c2692c2cff01beaa2bc9bdebf40e523ff7452e6b78f1d6aa57c73ef13f109a7721507175e125f32a4f718c2358bbb9b97ed31bdb85b5ca0e6fb0ebb1abc885868a58906ef2fc4f7456ade00de52e129e02a8763ff591b9bfe0d130e8f428b504e4cab2a09a4d7b8f2ac5e132042e04f76d0a6820304a4bc69072361d82f9d3f919eefe9142e21e83b101b6191b8237cba64219059eab292a69db25d8bd02866e100c9dcb5081e159d5a9884b94f354229597b076a77bfbf3525424a20d0d7769b16cb6d62ef36c187c047e4ed5490305225355fbb381682932245b01dae04df5e456723842ff66c8905bc1ac484ceb7a35bc321d2a8619d5f394f37f8c45b1179111f97bf66f7872f8f678ec53c3b58cb61c6c637452b6ff7cec14a48b014bd9a0e67226b10a491d9c1dcc97607808408db92e56f9ade6adb574e5f73fdfc242f91d05c2da9782d16418e534d6318da0a2dc9e7c215f51e986738f0011a6bf5a85fedcd6dbdfca96382eea4b1db7ecb3ddcce460552fa0bad7333947671de92a2ad01cea1baaca7500a903659dd2cc8127d32987fbe77b2990fa0c55aa0ee9b9d1ddf08702bf2975a4cf5a09bd49d5136637957b7d4d893c991130b1433f6610636b7e34f8e8909f0ce914bfe8e6b07084414fc3412a73fddac0cce398780935c6c3ee7965eba7f9213e5c0f836f05a0673980e7b145e0743c4e097413837a32e42d69deb191158ec9185882f7ad7bacf9674f6f336879a8a5050eeb1b27600fa3f017ec44a28363edbd309fac68bb9b2012e5e43159e6a1fe2b04d0172b63d2ed561f2a87e6988276760dee0a686d75c68469ce12e1ce67300912ac71582c85a9a5a920e025fdf24a8b17f87a743843d20304b33ec8da0322e761059076632fbf26df57b82659bb534475446256c40c2cd8de1d1dd6b17cbb0d1866dc4db0d91621e75678b255e677e9505b2bd4bad8bc4b1e9317d3fbdae5c26054bda4b98a98dee9a586919979a0c1cfc33eb7c2af6aa3ed MD = dbc7ace190c9dc985d2c3fbed5fe90328352b3b0 Len = 12392 Msg = c29a1ab020e6434a50a271e5525a47a29b447a76162eeec569b51c3379b8b7b7300c8ff17e71b5bd9dc5e0089a780fe2114070d5380e81751e4075393518d9890f6d771865a07b745dd2d4dc0c54dd513a5f3def66060c7e0a683745212a251ee5259ad0dd5bdc9817301509b3d7f917a10aa86eaafed608b59629fe43d7e29e3d9cc0bfef8a215154476b3894e7aa5bcba77bf70cde283aa630140da5055a319c39b18da21693c69b7f9e11b96d3a4542a07c35938e4a3c65a0c0194f9dd3fd8c6634e3ffe577207440753b2952effe8d5b74cd47f684377a4cf5cb4788962d948b13690ce0188667f2b95fec7c12ae34422a6a30ff1e536e9e7bcb97acebe73d0e14c6d3efbd21fdfd32240bd5ea7cbfbb68b2578f5fb7c7fc19c047f319530d5800a25cfbad19bdc9a8338d44c191b730f44dc38f908c10d099525d446a9b8ed19ea7adea319530bee3337ab0dd15a40897e47ce8f9f9ce81c12ae38624e448e1b87bd0a691bddc45aacdda03872f0cab191f8b80e2278b775af0e0a39059c2f114c6cd1515ba4bc4c7a9b6240707798142a5f741933dce1a2b4c5d82f61f84677c31aa2105b405a5006e15fba5c672f2da1fc812536420d2fee4610b9e6116adb56371b1a8d2904e1ec40070a9948066a83407da6cc408079963f426cf4501298a052aac473d7629e9557e6b5a982945758dbb8324840e21c56f1ebbd3f3cc45c2bfdbfc2a1d3f9c28c697d402fbf8f709d1ecf4c4cdba884ab0e8b2f094ff6824388e8899997111a5c25393e7e472e42ca9a21593c695a4f0d059f36f5022f97a194a38dcd996ef26efbb90517c2174a6bde6cedb9826de7f747a67984ebe628a0918f43a06359e74f5d6b48aeb8c103eb4bf07e26af59cbe4651f4b2b75a0a1db1ffa4fd48d786577dade5d9583b1ebe3736a8f2658b4776eee98307b27f59fab907306bc6030f962f460c85ebb708eced529951b06f486f1447fddd68b4b7ebc83880cda941a1fbb2ab12d7ce8734907f1bc247752905715f75487d01818cb6869b7d6a1819a44cafe4dd1726330c7494990c1ed942e844777a4e2fa46e40249d370d8c3c148052cdf7578d1e44f65fd5d55d1c064158af055ef53a79043bfdb21419793db99dd5b5ee6780db415c18e9d69f8b24aebd7cb12927e8a9cae609703b8a7a4291639d0ed0f43a88b2a5687aa4b8b15a127e7122e4cb7f5c49a70f7cb346d773233b7181a6e8014b1f39172d4892d7d1f405570197c948b907e7d9818437d8f9f78b1ab6772a1e4c1180edacc91344b1dcb9f5f548098be98e0f2d25b744c5fc95bc61544ba2d9b410e2b29f2f254221520215a7017290146685d4105354e5a386370c042b3879aba2c72dad83af1749df487dbec9ee9e6015b396eb605181175163e36d1dd448585197277fcc980c520af3f6e3a965fef825ff3a5ee722e1807ea7b0382c5e8ce4a4ba68bd12ca69645c6b48bea7bdf9021ed38a10eeaf4d05956d390c5dbe8e772398b80e5d2c76a65c193bf6cedfd5a786964caa80e00dce1f1c4792badc96375799df1ab6a67b419263973423b3da0ee7b049d3a29d6804a41ba2714aa0eb4fc726a48a2420bf5d86b2231fb0215260c88949345ecea8cfaad4125215f3d7e5fca5d006b0828b20c16fa8607c1283c4b2891475bb5b1356bbae5fdd24bba0227c802b3561b427b5ca00ee9e8f6cb6632c18713dc22cf2c25e1150b97ee28f2dd11d7dc03f9fdb4229cfbd82f2193464be9e293479298c3a1c65af8f2b4eec2f82e68e4e5229eff06742ddb4acff42f0f0830403ea3b2be77b13420634e9ff4f18412688a33baae60bc315dbc5082b2f4b2fca521d4815f10581d2c7a0990fb61a980c1639be554d9db92f9f461b3548560a43c81839937f421826797748668b1052099f1c98384ca58cf1aa361faa64997d370ee5f7edb9b94008c5c2dd4af783d7e5cb55b39b0caca324a19dfed0aa9dee6dcc8c696bc8f2623e5388400422fa8f6844ebf5c6b43968902f839ff043e9c6aea9137655d475e491cad159dc33fde259afe648006dd542fcfaf1ea5156066ec24d8408f204cb30c9d3a5101952143882b74f93935f079931aaeec73d0c7a4c7161e6068b817bacae150d4d05a9c8f9a9022dbec5b157d6f8e8831efa8dcfca838d425768730dc2073910 MD = 796135c20bfd2dfc7a1ff2087aba7f93b2814ef4 Len = 13184 Msg = c3ec01c755385f27020d88ed2c578e73185c6d514c9192d13cb29ea4261167d33b2f3ff8ff897aadf2b42a4570ac2dbad66a6ae7e6b457f76d39bf1e22ddc287d2521d8dbae8ab2d35a62cbb979946d5586cc9967539370b139f84eb65151a82d17d20ef4efdfc8f110a16b968c5dface68b13c5c0c73bf6770b7573b76077ae80dad286836f74bbcf0871a6acd90327c7eecfde9007699ee1a61b1ee066e2f2268ebaba21e61b9ab6cac4ea2b7cb72e45bf8548ada1cbec9898fd55a7d062360cc460f4ef0cfa12107597edad5705a9a623bd6bdf3c69c8e608a37ed64600627ba24d9ab686180c23347316fa12f480334400afee80491b111e9603336fc35fb95008163eff7e71392ddecfd9548c9b344ad57ca11775cb62045d4a87f4b3130ef719ce4f1d32279888628014c5d6e2f15dc53ac1a6f5c221df80bd997cd867c4bf092cb1883e18886e878f710ed93eb1a3575116d8cfe696da88c233b03b4322cf5f962be9a92a5307d465b9d79e95be47132968520d21091afcc31b38e3906f50a37687e87c47407ad16ab3c72bd15e6f812a7fbfb75ac1ca64271abbd834f4695e338b2cbe5696f0060629878ad8da442abd23c5d37907104956f8e22319f9431735005e773f9e90fca2e1bfc3947aed95481b0c6b65231431b87d54cb25c50556e4ad25b0eaa0833aa4a516dceb85924a35303d86085dffa7b571b9d842a2d8a3a85c2a703fe3f048763b34dfc7455dd2ea2a002d49fcf930b59bbb5357d6e487e9d315bf26b100af7e6bc2d30f0074b4d1d1fc67104a295620c400434caa50890fdb8da58750daf626ff68c1abffff7850ecda3c458db8a05eb430b009664532823c3a2b4a09a8a5d5bdcdb0828a27a7d14541b4d10ece96d733f4a27552ea08aabec55857248f45f26f9aa87ee813c8bba2dad89a1591c1f309f4227ab66895f029d63596e9b95de7db76b28663ed6376cc4daf89ea2ca81bfdd737ffd9e661ba4414c8efa04e751bca0ad48341da006a8b414186d4c5d4b5d945eaed048df271d8281b4b907515f603fe185bcb0428ffa65f977a1c85cb2b63e8422a7f85d27eadb936900257c6e050f986f74993629de74eb84b0b9317e36465479f92f589478b701fa83e1c0f4177a3253f03af37ac14b6ace3e7183f47a367013485059d363af5e0798ceb798141a5fd1b407e2e94f6417c28f83bccbdea9479d29fdf98b281ef81ed34ec8b0876a716744a2bcfbd55952f04882545afff94b65f29a802222a0708eb7d49cd3fde50793067dca28ff95acd5eddfd3284ab10c0c46b8b61f0fbe47f5ab127c78c40492d39e0ba3073a9395f1d40ec1ca4b6b0a0eaadae3f83bd2fed2416b1025866393a75fdec00cf2fd9ec2bf91a8a77e81b5db837392343378f5b30f40c050c16c9a9ce059a9a0c51e47c6f50ae046509faff155055969833add0669563580e19a1812b42ee8793d8ff18d18dd012d6e0f48feb422a1fea773054ae40dc84c83768ca73fa0e4ecb8bd4c639f7aa3d3236b2132153df46a1cdc1eff03c9f10a037c78c907622771b340b908fd7610ce1d3db969fcc9c9325fb08aa14d2d58400e365d069fe538bed994c7ebb7520084b7f181d4df58b8fdfc9ac8c024aa6694f01eb9de6d9c811a8843e97a6190db7d80211b21315d1c13501569ea3ec3945f55a00fcef51ab91b3bb89e3360b50a3f1236d5cd97599b19069ade7ddffb7a35ab64df46cac21937806d66a54921254fcabd524875e09e859cb5a6f99cd4708e6dd798d453354a05e2fcd35e9f87b516363f010051649edf6ed043ec09c12fe01962dcf632e6c3fcdfc154bdb83b2228c10672b3be58248d197545d38b5400c13aa11c3ace590f92d3757b4147ce04fe17de17a1115dc825093f1d3eb60f8bb84e2cc70099fe955e7a63a797a2b2c60c871070770ed7e22dda885a8bfe56291bc0407df62a69fdb611267a1f7d7bfdeabb381d93eb491b0df9db5e49e8ba71823d86916a040d9130442853472c9c051f10cf6f865b33cb5be3b2b906f9befd821289b1fa9b6bf8638003d3bd24a583f02440e6dcb32a8b8e14a8fb41a5d61581fba440267507bbb661237bc01a0af324623723f5a78fc41b29288568619262083570dc5c155323af4411ac2e613ecb12571ca76f8cf61d898dabf809d1765b8b7c79e729e0f0f8c4c558e5269ed384507f5bd1b8f7dff06fbecdc39469e47a921d29e10e8c43738d4163d767274ba745478f43406cbfd52438e868a69f8f4792b40b6a886bdd5c6f64ccc35e9f29bc974c217cc45018445d9896579ef6b93b33cd88d4160 MD = baa2e9bef9dd836d3d37013c296ec31919fe7840 Len = 13976 Msg = 7810aed4d42c0606d0c1f76943d0c63f38d261cdaa6244b58c36997f0d53a37919815cc123fd5da0226fff19d91bc0c25c5be8d3d04d6c7d72c9127ddb96d6f082dd8c6982ddc8419de1fb2e816fde174bc314274a7c0b21059423f37f95128db90a87f379340d914aff32d0c434e9e60df02ef2a055e8484d7f130981ba1ef8c8f29288906bf53a30b2ee2529d3aad6abcc7d5b5b42cd9b53732ce96a6cc4d8b67bf85050e848e157e0755838b2e6902c3e4b8b02a980c11e56b4b8c212cad58c8fff724014ce31c872118f793a68bc982ddeaa1df4ca63b612f4a10f16f9985115f117e9574ecf8a5107f275d3f701f88380df348a7329248d34cadbdf19c90df51466d11a9266a563a2abb3e65a0753277652d0d343ba6fb1bc5badd5f210c917b18882c3609c229229dfbbd95a77b1010b2c783702bf9f64d37d0e604b138c630fa484bc811908c5e3b91616bff91af98695b51e77dfbd90c25785e8ee7d5ec178e35d6bbd865fe4195e4b03513497f72eb40ef06bc3d01cd2139ad5a1f44719326d973adb8b30d614f9e20ad7d12fe34db20b15a613e0f048d6d58f2d2050538669b990a5cf828519b064921b77eba529b634f6f076f6f46fcbbf7e5aab8057bcff4cd4e1fb5dd873ab5802e3cfd1250ae912f9119418108e17df0bef3ae00d1c59d77058b6c9b7681346c4f881ec4c3a732c87d016512cece5bd9cb678765dee9ce2cbd2a9cf0a4210b63f22344100007b0a09f6a4a630d25be29b750a4c3079f3f64d177c76b947c931db2890da2aa32935e54be5210488a1d56ef59b6a6c06849a5eeed6c7adc0673e00d43fbeb36ca634859782c99056e01e7ffed1d6fbdd775666205fc8ccf4116616ece6f581a31a8f4fa222a6bd8440463458549ac346f5b2cd76c083ff2df030853930887e90adcfad346ec17159e8d4f7cacdbeae892637fbb5a1002fb12c24b683c27e907a857b06140e21951e01502f1de448a3ed316c59a8a94642caecca0f9247dfa1abcd1bc10ba9ce121cb2434319404289bb3ed94d16815d22bd58abf92d65b39869ab3848e1e7d1ce9824349d868ab34a3c770740c6d14db5d59a4edd1ec4035dfd4759025e7231b3dd7eaba42c69a4cdb5027d9b81401ee559d73b212b0dd6d8afca065749eff6a832e930c0d3861cfa7107c3c40f76d998903afb2f1de835f1c65cc7af6c092994de8d4c59428823b9b7af6225381c86b8c3e8156dbbfc27908c2425728d66d1612a9186d74218c1f2ce21e124c4da2b2c3b0c1145cff2b49d474ba70875aef6f65e1e67a39bdeff8dff86c82b7a57d2dc3dcc781e1f71e40040f8d6daec8aa03bc25b76231581e4729206a0a1233c82b01450d15f7522c0a1bf54384ebaa2d8189d713bc077aa798acfc8f0ee8730449007c1a47297ad4f680b8757cda69da57539873ee28b00c5bbfdf540796edc1f645d477abe4db99a3e6eb8bbc07923103adcc608f2172cd0ee66b419aca0e71b145f09d9ab61eea7092e10ea8dfbde204fcf562056e4d5a20c502e01eee4fa408855304ca199f680b394b66e9ef473dd9c5a5e0e78baa444fb048b82a804bd97a987e35808bf762d22e8d2cf592c8d4f0ac4065bbf6141bda5caf22440c6d7275d3c4b87489919b440728e93286bd27f7f57788e92a05315f0e98b6e1ff3f1f88dbd9060c9f0841ff37910447278ea74e459d92f5b408254c6ab7fe8ad53b2132253d96bf48b6276254780699e1c7e36221354c6810a78830e56f61a52adc37f02444e312f3459bfbd22078b161f36ce1fcd0edc6cc3daaab033178d77cacb4417d81939e3b11104a353cd314149b943c5cf32f8833653cf938a0bc88273736b47595f0b79cb344cbf22f9e38761b09dfb60e6a3302a89fca1a3fa53dd6e63fb7c0d4b30574a67a0f9d6b32a5031c2e5a8c95264db662438c1c50bb7ee8342fc9d3e022fe7f6540739b9258c047f9822b653a0c3eab3cd8cdb3a667b1f7cb9779232af909097a389671174930b14d95c0c43f548c6d92cfed8483427d7206f72433178dcb9f4fc2e6b27cbc7ceb82e9b92e47c7cd7a0e8999e389d447d360df89885859accd605ff2d4350afb3323fe8307d5ae685d0a9621652c8597b873a0e7975ff523005690395ad2bd3234cb34ace55ba0f3930196328dddeee38db9fbece480e8d4d49ce428cac85bb87cc33ca54b5c27d5989dea3bd23068b1cf9e30f7f47d9d18b6addc5f88986f0457b666faae59aba4fa3a02abb6a69b98fabaf0a74ba89a9522f3d93c38d55f9c721f541b92d6b4e814608010cfb2efff9b7abb595e9459a0a6196b4d3fd1b5e7386874867d55dbf593abd2f961e7ee6c2e67e1acb1b362e1bc892311224ffa8b371c58d9d2497973d4668bc431a81f55200d141fc9984eced2cd71166492a5eeeac56174463425d9734b1b1f9395eb412cd4b3011ac565ce8550d5cb9b3 MD = 3d40608ab9bce3f372bb29a62ff3fcc68e48385d Len = 14768 Msg = 6b50d70eb3d958730f650f7f99f9fb046d942f985a112997dd4e60674f8e1c005d1c8aabb93210090f18de583b90c6f2b9724d165c9402eb43ec0ec20af90d9c3d5e1cec12d1339e5733b657a90046ffe7eadd7de6c11ac16696d9084520075bf35fb559267e6a37cffebe054c112433df4408535f611a202d94e9c06accb34667647b7b5d035dde5fc11fe98c8b089689c8f5222f3ca911802d6572e0c5b86482b899d92027b39aefc3008cd2359931cdbecd71bd1a709b47ab75a70fd3c0be2aa235fcd5b11574674d8a7484d8800b946db7c973c316c66a5443e55fbe705a4869786ae66a2a72afa7e42b0c3c652cc41edcb1b8fe449ad271f4b7384d7242c55689adb91a9b9faf193839d029ee9d471963b1f495a2206549b3a2024a6e7e87b1904db8890f0050ebab243a67c66503a67551904ed75f0c26a630257b0b1478c2b7d0497e2f9f78646776b0bd938ce20d3a1af2f28c5fb04ef5e809a8f20e7fd024c0d6c2a38310cd94b69cf5fe1bcb95d99383496829370ac952169bcb738325ffa4c61e12b4016e596d65d5ae19a5877b45ab1a14c48ba24af7b51b3d4c6e0771058157243b318fdf2273264c8e5a2b47b6d32f3738925e9f5e4ceff0a027bfa26a6f38821f8a784e5d2eaf7f83d1c96670614e7a8e3686f11045e08d779694b95bf888d468f371cda7fe3af0fef2a9fffbbf4085cd5d61679306b6bcdaa3d0de60840ec11e53c184864b8d460aa5133bdd53ccfffdf1382a71f93924cf36b93b027b93f24a94b19c847d722aacd24e42a087bc9127d953613184306e613799f5c845df0ff49d893d29fcae44ee61a33bcbc2d7e252fdfa355c116541958eb6373b4ababf2256918efc300c3bd73a5a4ee76be49b864575ce79079e4675235927e1f2ecaadea710b8858253b86f46bba57becac63cb990b5310cea42508dec9ed45a63c792f7850e24c584a62bf6b0d650facf7e32ae106ecaace3f8556a850b2eccc74d41eb19735da1bbbe2ce929ab92c138cc2aa05acc3ce6e360e6867349e60ce5a62b13a2ed9b6346cdfa5a4a8c7598935a954ed46fd041953694505bed82812b7ccf2fb5df5680925024a8780b71e76b8402e821bc5d4345c3ef5683689cc0252b9e9dd6bb27904b0f3c7256ab20342de2e43aa7541c7281a34817ae4d8d404f5d29dc6a237708cd4592464ade091556f1c984e9a99645d55f4f0210feec98266bf169f48add50858dc672e93684f1833b13757d3f6333bd5264a4701f233e36e275c51a63b31e205259a6a6272c5f1f29627ab6880bd2b617198d3000d988fd5b378c3040a0a81a3dcc40063287c4973727034a15e8993c37de1ad556782ee630a71dcaa41eb4dfaa9eed7deb0fb897fee1bd8c6b920dcc1f32dbd48277868e0d44f86df0959aed1321fd91b32ca17deb22e811eb8086f247b84eb2076036513bb1aa8ec8ade0cf1225fed61d7725d5865b416f284cbb2b3bcef1f277baa4dc565db2919eb01cf231fb6fbfac67ac1b4afb27f8a44f00f385f7541a35ff588be7a9af3ae554b5f2dd12dec2c286aadbc3a32a42e2100ed790b1f39dd496c7ec6a35dedf3ef4225d7e2cba64025cb8836ab3b6d264382b44069f4ef1d629897a5882eff30e27087ebf799127ee424baebadd6c2b9d1fecb5321fc4babd1003c22d01411ac555dee2fbb9d182d8efdaba3e60a8b31f3fd9c7ada3f36cebf2cd30723180bb0718fc36dd3e1a1964adec326fedfb0d4d3068e7f3cc696cf54a5c61a2b40d5845d906c6bea6d930241506a3b9e5d19eb96a10929f19855f6b7f27b248d96587042e853f2a647d8b79bda08ac6e8daebd6756753f9ebd598b119b5cecf4227abc481ddec9af7956fe7f05053f157658946cae3b8aee3e8cd68929cf3c06eb24af96b977baae0bf71e1558c9bd3c20fdb6cd30c1d28622d41f48233eda6bf93f925544858b4b03a161865bbced8a94866cb36570de11711bad7611108fcc54b1adac4470052d6b3e0dfa964699a8d9dcfe46d3b078353348c93a7bad23d1056448c4439ff0fd4ab56b9892d0873df7e5b4ad04ea669a7143bbbcea7d5e21133eabc5c87c1462a9eec389d6c080f2f78bd611808471e933f4cb25e6e8086586291ed65c6e38058fd15df5ea804c6fe0b5ab99cde861ca7f43419df556e844660ce81f86dd268d044680035776b35bba4b7c6e757cfee45f18644ba12fc767bcce52c9ce31a4a3113575dba40c7d5e8e3491b700aa10e0da5b7d5871db6d758f59a4fcbcd37befbc8685a659a97121635a329df4d95e65f8f4d4ebedc2a217e89426dfd92973180f21f58cffb4594c41a4a748db70b11cc2cbb12d9e4c2ef5ce671f9bac9c53c712ee10b41d97fb8730fa37df3cd9d1ad3fc85c460be2d8b649bad957bd95e5a3ccd61d473bb91f7839442c8aa07b86bf78d41c5dbdea690361759a3c957aef5545bf636ce1828fca636acc738ebe98fa73d53b9a3aceaa831f81ab72bbb43a8485932b4c985a1223b75560bf8e0ace083ab5ff260cf460df8ac45420b7ac8ed99538bd0ee7a96f2c3beb2f9928c7f18ed55ab129bac656beab27dc6f12c9b2fc7c9861dc57d76f MD = 8bce8c69fd802389c805d2945c7499c9dd279ea2 Len = 15560 Msg = 43b1ac9c15fcc2b0168aa9862db0304441ce0c5659db1fa80244fa18f2f7a02beaba8cfee1c2f6805e8153df26bf1b4017ecceb354b53966a2d5f619122e32d1e118b2d19cf918c68716634240a8b66ba0335af5e213054d07575d1778d3b8dbee7126fb8fc8b1e95af0e396c494892ea348b7024c1d0cc6f87337fc6d0fbab0da6eee66025848519cb8dac5faaa1defead6edc4dafdd5373fd18daf370ac1b86cb614f83cd06566181551b62a13f9173b830521d3d8e909a21866181eeb545b6ef2a09b8759918f95b04f519cf6a50f5ff7060381d9cea5eaf1cb1f6cdbfc01a6c99836291b5237da30dc7e987caa3e1edbf8512a250e71df03c3ac67014012dee406b16b3d33c3b03e002565cd8f0b3fd7e4f317e731d748f756a75986a8f6dceaf1f495e8b99cdf82c42e4c10dce08c92d1d09045bd3eee748cf88891bc15698462e6ef436e2a2fa32f81956e1a24cbb5c7d2dc673c0e9a236e873d4b05d84c5a6071c177d9d5684a4a07880ed03ec5e7cee0457635ae12ab033cbfdb0aa54f13f37c52ab8206511e1ca66c19869842d1efe2119a31881eb65400586a53e5385723f0eb08f223b3c8ad478bb6c4990a1b31c189fab70388e967b94e206901d0d0f9b3d4b6b09656ef05d32b0e13a9e46c9d63f5bf4f8717ee4651ea24d35fdf247cae55dc44c5023c2d309548fa30996c39b19d10817c926df9ae749f19692dfbb5c9b6a2371a7f562c48118d0296f2c40f93c816d64bc20d86ba34b8c48681feaaed3e3110fb94e70a01e605b144b41c27f2c0f9d55a6f77f75b71985b1da4d4650036b157d20b94cf455ed792a0aa1b87b4cbe007126053547b756666985f26eeebe64a9506aa0784fbbf2c2a139b6a39c332f3f2db5f48a301864b6e5e789c4b97962250ff3ae8310b522b03064eb145053d5c201e32feeed5ed6ffad7b7dd86eb8e64132582dedc5c5ffda4df8c97b16433401941a21e3cdff2f9926be692a7ce153663e04c928fd82ec995081dc487c75eca63ae77509607dc12be82cb62b42a75c0ca985eac516606b85fe7c9e1cf15041f88cb793b0335f5e1078430f6b7e6f42bcfb581d32bee31f289e658968f386e6a100270888b51838ff4d9dbf5b7eadb9ffb9f7daf2359f59e9b6b918ad117e4d181ba23de3643cf430ee99408bd1e7243d4be1ae9448d9be41de03d669c9aad7c655a5be60df32126db1d25d7d06a0040e47b202993736aed98ac24d1f9a91394434ce0481749c160e5db5509f8b6cfbeb33c56161af3ace194370e74ee2c5c41a4f77aab5c2ef618b48ceb473dea25e4c76a8559e0f6a7e897e9c3f6860bd1aa0fc3f1b7e5880976ce99b038a8ee4bdaaa6e759aed62a5282b2a0a01c62ebaf80c180c15b94142a3bd686c8540aa89c9e4aeee804a21ecccd762ad3ab87e5f52235e946de03fe9c70963e6d50e0626d9fb94b8b3fe19c4fa24f9724b63e107e1ddfd5266636c460938f1e8d118eb6c3179879adc113477da985722dccf40fccdc15d0ba949aea192d4793821683fa1fae6ee5ea38c584c96bde485940584843d58e78ade9aef418a65659f6c06ec0e5bc833caaf766f8a531b09621c0c93e859280196ac5f166f18711ce55af8d8fb7da9bda7a9d7607a3c382c821bec57704bbb14f6bb9f0b73648206d29448edaf8710f4bc38b71364769eb7ae3aaeb76338998973b462b695971f8b2ec2fe1174a28640d3051f70902cd510ac21599a0b4b48c6d53fb0ff1dd9d113c08c202e90f69209b2b7165f458463a14477f5eaaea95235e40392ce52511e065198b82b4caabcb722f7a5c8cca6d2d040e58b8e957d3f3d67a90f0b7d2891cca991cdf0f0e78cb2eb6dd3936dbbaa076712216e08ed954528d8309ee685afcd901d6865c4d48b63d5c0a8a870eb71ad80a7c2724e21deb7ed39fc6fd5910272cee49072109a4030a8992cef1d5db129544b7382b142a1fa7f747b66927411212a8f4dff1b6033822b9f6851bc3af1e5aba73e8677786776a630b56c645564436ec6a7f42e4fedc2277b63b494a9ba484c622a66e9eab7932915b367955c84416030a739918ff55665d42502eed393ba01253f0a4fc119b9d2cc7c416bb3f881c97654b68c47d3a8aa53b72112e004a39098865af124155067fd18e02f7f486d7040b754679f101ec1a020fb48f7956cc262063f163c34c0b150902e28ebfd6c1f35d6f969c0332271626876d840cf7b5f2cc89f0831fd71786beb11a01c9ee59cfdbb8edbd2c41b8141987c09e439392f9dd2640d2af9cc84f93173dd3db342b0416efc05fc4c71bae7b7f4250b5c0ef95e2e746e4fae379ca06a3b2874c4ea23a9f5292f67528be4f9cdc572dcbe638716e4b973c9a61b8a089f51c9e95a45bddc5affa13b5ed3c722e3d93980e99e9f6efa1963c069e114dad89d08c6fcbb4683a565a29ff8b02a08ff17c11f65290a0e7a7e885b7def03be1b062d3033b48545dc427cbba98ad6532c6754dfb86a909d6bcf28c36caf1e5b72777f51869843cb098075b8f8ca94ac6fb138eb6ccbf8c4d6f48c20be872f5ae4d547517dcf48bc3306d6be6ed62abbd2ddb66909b20c2ac2d4fc99f9e1fc627909ce58a0c15cc163bce7f4911760275cd41682158992783759bf56a7244f1c3afb598d78d74782a08aef83ecf50098157ca05d1ab753553e6a1f804fb8ee302e9333188c77d0a6f258389304d9d0b806be9c239fa4176addef623f7a05a1 MD = 064c6fccb707f0f3929084eeb0298e800d542370 Len = 16352 Msg = 0a72ca03c9977dcd0169da7af1fa3f3f02e374175886de21a796f54348daf8148c2ddff950ca918ed1c65747c2de90579c73a7d036d3430c95babd4d0519d7a06815ab07cf53e1d64773255ef6dad8c966b50645203a99657d31ccc3b9b4e2eb493317746ebbd7700b772e07b477805e07b07abe3f4448f2060408f08b337fbcd58d0b8a5788d923c4da5889243beede286ce982ba78b87cd93a5b1ba41f18dcb42e708faf4551b61aa58d2e6fb08b1170f23ddaba5f51ca9ddbac8b2b0014148f1b2ccca177a6f2b7dfb43cbd5ebfbe88495c0e677f7ca6fbf0e289495cdb2a0e5d298952a8409f4090b5fc35ccf3af17793066e8639fd69b80e75d26bdd5e6d8fd4d0eed5f878560c078b600828daac68b9f29669024232493a24fe9aa6a12960382a29825e36bbd78e4b24508f7783d8693a1089071553f31fba7bbac0274ef75af8e7b81bc1affbfe3372de797e12372f314f7e9f0349363daacc34a05d68c5dbc1bc0fb7a5bcf9e5d8ee0a6d7ac2058a7cb5a260787c93027a72a0cdbfe14c2908e8c1b85f4d51c380085cd1ea3de3f960e5acc201888a1cae0177aecb430ad15320a6a45adb8415dd345e4d38c022faa251f65a2ad79bdac9fb31da0c28825324e5f6f23502015b44f477460303730ca57d079f50f438cb32c257c60efc332cf29b6b285a3b7a125beb4042c57234bdeed968e81068f16c8ce961f92028adcd50c35bcd47022ec9966b31d9fc86e87cf2f982ead5a0564d4cf2e8fa0c4842c2a3f0414797d0cfef6916d46214dc1ed8365ffe0e3d24c7dbd751453f0fd5a29b70a4c42da921be0268509071aacc483e3d7f22d8b370d696d0971f3ec74b3dc64b535cf6179f7990f8ab0e8f2ae1e53d7cd9a9b0b51ef31cad26cf8faf3384b1a87e64275f949319bea8a72111b7765488e1eb4cce89bdcbe1a2ee984409180bfc988237dd9b9b1b1ebbe2ce0bb79bf1c63a70036c4b8723027df4ef12465833cc442fbe3e2ee2038d7759fc556ca6b3d945d06b2aceffc0743a5b0a9675c5a7abd3d510edc91861af4d65129b312719169674ea66ae8802db4ab9514d11f0f60ffa0ad668f49ec3e8b0acc759bfad70229ee607bc44a0989c217889a2a56aad5d1949753c2bf598ce338980fd629a7771e19c59a83be9c03b7120ea339a931c37a41983d3f9bd5ec46893b612c49e9d78e1104696feb4383d9c3b197c7beae1143ce378ccc846846fa253fd165ffa30cc2fda5524f7a05f17253f8de9c4028a77464fda832221b8248332cc948f5dffd020630bcec12eb35c8e96be080d5a86d552a71fa381ef58878db88b09ed3a49296542e0f0f5cfb3823ae93053b25354b2d491be8a820fe40d247ddee2f40fbb3c50e27b27eff3fe0cdcaf7b694d9d72946e883db49cf3f939e9cb2ebc3e5ea48d85da10f02a4bf160d642059559996efe630323ce2d4bf672305900e226a7c391768268d62f382c32aa49458440c7b855649af713cd687a6aaa8fec11376b66eca583d94689390cd6db3dd192adb8dd3de5a82e41f7e9d367bad846c60b1a2d039546f8cda2df11e1eb98306ceaed5c1c58b34fb52740b01de3daa75cfc54745ac8542dd8168ae9c85dd0c85fa2b593855064c209f5fd9ed1b80f9452957adb66a1240f025edcd31e948020074fd231ed4f052bacce80de4799df8443512dd0cbc24f12b8e6359c49422ecde05ca3b5d8b74ce31a2b6b1cd41bc30dabd9bde2deae3dcf78373573ccc925387753ba7dbc2b749ece972cc8fbc072770879db8033c7689bdcdc5d183dac0be638cf77182c1e44b5569c367142fa4676c5dbe7475f90680e33400ce8006d5b5da12a7a138cf215ad3e9528943e5bb783805a6196a6bba4ad380cd571b97f9c054cef23de7359600ce33c63a042575e03a47feafccd8bb6ef379d3733cd753683989814f763c6dc4ae0dc8823f36f929dced6e3f82893074ade7bb2acb0c0c34f10bfbdecd29cb2edc40006adc6170da85bd9dcf74c642e568912c84b07f4bade41c09f3d447dac7be9415f9c4ee027c9c81346a8ad719478b40cf8ad37839597a84539573ddc216bdd0b038dd25d6968bffda15ac03dc2580bc4c431d3efec21c0a80cc9232aba442be782d104d15b0b90038dac293b404aecd4ab8741bc170307838a0198fbcf7b32416e246b0e6538e4bf6c0b4cfc86e7d3b71efc255aaea2094251af03c1d9979cb315f6594720572aabbcf6aff41ea55cd6af2ed35e3b85227ed41ff81f712fd7b72aa5642e151cde32f10cc6b46019e4cddc9de03916230f8381e2fa672e8a6fb80cd02025abc07bffb8ac35b0039c081717a7e07df7020d1afb766f2b5a5db1505d0501c05d08806c7463516961d2331cf0fb489f36b8c78f9168daee9d0068fa6b927d70b14b9803a4a0ce5313230279f8f67d0f5dbdbb6bf438d2335f28e320d92717c941000f4fda02e10f9024d2a880381250e467553a9444c96c292dbc6e2631553c74dc62cb85085df1514e3013272e9d06536c2175e23b452b7385513cc32fba4cd5274ee1260f799aef05b7546e4871924322aca87e8ac9e3d6d64e074090bb7cea77003b3da6e88eb1f1b4e6c62434770c31533cb991bc17cb770f782ef2dd3f1d5243344c5d1f2f5288d544bf205a4746feb1bd340eb049ba1e11e9ded49425e63f6456d2a0820f393184e8c9fb57655c1144a47e403afc3b01f1e6d09474a3ed95003d510fa5a0ee92306d66e3b063e3ef888ce8e4b0a1b6e92bf9b4d0f34b9c09933257f91e86eb01842d2697f9c5570ff9d1045ab5ccc62a2c8cfc18948f69f399e0480b4113a735ecb28976a80c2de9250b6110beffd14b803b06c9ecd1efe980c1b194b1e9bb75d697f00e2f9 MD = bf2d47d4435ace28d3c336acdd6313aa8f9c41fd Len = 17144 Msg = 09ebb3463b01b2c492ca2b1f6ac7e6145eb40646537230d5b945ef330d3f5733a2fce963a290b79c4fbec9d78f6bbe42a851b69448f8709dc8e2b021b106e4e68081060ca687c49dd39fdf657410d1047b96b2415e5a5ca16221ce3919c4cec029e0d3e850ce21eea5d63670219f65805deac1f69d803c0a0e6910224c5f5ee8278315a0a74e16b94ec996a19c01c3ded9b5aa5b0e5358ff55233f8452c1dc8702d097dbb3edeb2354e2c6a0ef1c334774603617b8b9f7a9bdb5230934d090c4403120427d94e7564188901422dafce3b8512dd3a49b6330d0888457f976c1c86b0d777d0c2c537a9c22baa63b2268d92cf15736d8e2e2bb16042a16a99ab9ba0acb6533699b77b6ee1a0dfd44dbbd5258a87be95e74bd721691ddef4d24bec3a6d5b20c9acb9b33bed751c244ef4475c5df63933e3b3c7e58986489ecfb190bc69226b2a9a2071994c14e9c4445456bfafcd5dd7e1ea607647f888e8e0912b9f26a88ca9d0a028ff840cb344bc5085b7f699a6e28044534c3b011a33b35f0f6b3c5a2ff7fead6bd73bc92316157d46edd8c7af043d75f2efc91c772fc67fde98f0b3af65629c9cc8c9d693c8ee3f3cb9bcf3c08d87e3d1d978c71a3d8877fbb10a4195a2ab124e4cc4b19fddb51ab9c4199aa60eee127281c08d9ded87ebf93bef907d104692f2cba2f6a1b4f89450658518aa08de86477146dc5ca0332059a2070cc03eb3931cddeaf233ff37408336761a570bd7b3e330722fe0f618c99f7be722f9ae70974efc0340e10cdf83e4bf630c3768782fb847b914c56fa74c2d32068f93b00c13eb8e927f137e8fe2d758d26ac5df2e5e491fa217647d7d3c956cfb8f2903f4ad853e0ee955b496f1fdab5ab27cb078c41830b3a4689ff8ff6a752cce241ab8a8ae62df3c225fa315aa2f527fd69cd5f5a81374482c57a9291ef310a91f64c6a9b9a599c3f3c022e27f4d602f6de4c4776b404a7f3a251c2e255f5dcc7562bd25596eb53d64a694ccdf8dfa4dad28c2adf44fccc61c98b09310225a94b094fabfe036b7f4df4377596d8987671ef96f2db58a71994e1304ec51e49d8e6b8c1dbdf0861876de47590c8b989de83da7185b3188cf753934979e7d0e9d3600b874c40ce56d5fec22b85acc63b45d73e25cdafad33cf6787dc71df408e0181a9abe4697cd2d0c8355f3c8a24351436c1bbb0163f24079964f420f597bfca103b348da13b5be092e61b9caafeffb1680b3a1832f5e809afd2966d71fd0596d7682b2e31337b6d267d668f537a228635c5aaec49f8063b717bcc409a99e7cd9cd997af618bb9df4aa149fdcec025f965971314a4700607a9049d81b994edd7283580f7796c9d9fc7facacc64f99074bf287e778b8471d41d18121816159f1d4325eff0c1fdb0136531f4e55a4dec5e0c21f2ff455ccd09965d31eef9458605b451ea81816779a4ebeecc30fbe3bf1f142978931c21a510dc7b04e9aa4c29f845607c9200d181ba23d85c958ee4941f9fe9171b56fb7e50b71b93f27051105fbcfbaa0c87644ebed398abfd5a77f0c57509d7803c11e231efe5e4f2957cc4a0e2c97ed55e476a16c4d6c14ea8c55d7b5d30c0a8168c581b4b8002cf5ff6cc257f73ffd6cda35d2cbe39a772c0f662a92106db7c2c9369769595f27317e7b0545ba035f71ca0ad678969644fea3188b587352fe4c54f9baa93cbbdc40477f9973df929219265e42eec0f00cf6e9e55085862c4c92be8791f0ecb6cac70cc2e55ef25e23a781b89ebb0d384d99366530a5b37a311a485883ecd3c0712a111d7f537cd682b16e925059d5cf754a3b10a235a5cd3a6794e526d9ac794dde06c7de1de99c4ddb4f83fe47b53612ae4a601bc1b795c6ef26c5e153b141df77505a780ac30fd379a705ff0125fca429f6ec03b683547535607349f79caa947a805dd3a683b1b2010780e912a293b841b30cf0a07389b3cef465d711c9141b5c194a777dc6127825d38d22f8a58bbd8a215b78fc02b6010035260f5ec13ec2907d98e9fce4b2844cad93632fb9553267a45ff345db69fb9db53c592b1f5b28bc3fd191a07a1264e9f83bf0245880a56ece72f60a4805f1ebf7015af32e29bc33e27d1514f0a2a88245df70730d8e8504024cf7a5f32a827f6d1d7b63880b0babd803caa6d2e3adaa09065a9842ef5fcbe2368ec547382bcca9f930e8b77f8568b30e48e2bb6612c5d43915108313a43ae0d811d4cecf6c58102d11ff3707b80ef5e51664f4aa466a19f0465858abe0b5709a3750e450b2a64211a513813422130330998a2910d70b5cc454fc3e0893e0240555c6425cad3bb25f50c2107541f97d6968eec34a332e1f1dc758adca4c2f7d91f3a143439a9ce35ebb877f5ba646c6f80aef5da6e946c375241a22616817efd8977e71b6392e47a83bd02847ad6f7284d62842c777fa0c52e19d265e761dfd41c7ba5824d77471c45838a5d9e5f7f27871163d2c5d9c3c4f867e341204c61855faf161001413d42b973d7272de64e94b5225873608c1e5b39929e64c8294d39db79016e86d60f1468f3b08b3052aa9860ff2cb7517ef9b37702c873e7e0eb1716423044e42005bbd96cdf31ae8ddc5b0f0fa7489f999cf33d1f2c19865883489a7369392306665f94472ac0af7e2b044aba90cb52c34e44105191fcab7b5df3ef7275f54c6f7c2722ea5ae13c0de1bb9a68b1eb73e658ce7a00bec46130c1419ba91c2167458d3c0abf373b5b2245aa8581d04e09e902b802947c1aad5ff65a287e25657a6fe2c6d42c887717a59ef6956db69c1cb4942b317593a699f045651e5b5a688fd5c3ec099b173c757e35ca52952b7eb52f564e8d0bcb0f2cccf68a03a781d3ad5f77d63073aa337f96524c435ff69bda42904aa0bfecfd6ed951f361ca634dddf548add11c0a033cd33ca4f034e19d96d58946f2f7bd1a68009dc5bf2cc87f267f7c9974feff55b41e3dfbe17db229eed08a6b091c070b212a242ba635781090e55cc1a28150d1f0609b MD = efe28211673e7bb68657243df023d4b70c0e5325 Len = 17936 Msg = 46cb5d391e751146ba9700b4fd5f36ae7dda1758d8fe50fb47ed0d6275786d8491e23263a1e7be331afd3bbfaeda19096636bd30f0d277973ab9b54440c67786226603db799fda10eb52eaaafdbd0585294392bb317083c7b23887ebfc7f80cf21df376a4ca54e25541c773e910fe46bef89ffc140df5ad3d7f0e91e52ac6fa5b7d336d8c3ff03ba7ee5494313d89d03df8f6a09c827e603d06b44a7e9542c510ccc68ed85b7e0179134c8812a20189522dd3c5c6f510d9fc631014c6b7f9e1a475135703bd5cc84b4925cc07ff03d69dffbde82dd64b9eee0c886d67d35af4a90eb052b8c5fb1480f866dc7ba4ff4c73f72b643bb68d13947ba3d0cc97f4628112040e4215f76accb98635f824625f66ac82e67b1663dc8228f8cb8f7644bfbef7b4e64a1dc03f81050a6507fdcb83f8788adb56664e5e39acddda0afeda70c55819773b5df407405379e625a1995eabe379af6836db1d2d7fe978d982140a369bc84d8056f1567d3d4b45cbb05a43f395f5ff2af8689dc00a922485a08ff0753b37b5d38946a1ba1af4e0849a9ce851d87637193b9554b3d57e6969eaacc823ceee5c8f65627d69851d62cad0cf90695380e3bd70dfd65b88f4b420c10905a4cf62be2e9be34e1e041b2918f360e08c6f9c817228b697396d9b9124b4131d8aa52b373b7d37984a0074cff9530f6d4db52f9cf1c3981bc02bd98d0044599447f8ae743089ede06012c0a3e6a0197b2facb09296e212e8a22c45042de25aee6f2272e1985254cb12a375615b4b1dbe94ced61eec04b56231e75493182e85a052cb0efbfd572a9cb43b0974d1c49a9c3f83f67e6b9bde2d01f59eb64979684eb54ad94fba18ddf9d762034ae49d0e886264a84d80281bbd94df69fa5c63814de93a68496917cd46fe90e9700e44e827b0094208d439fc786cfd7cbbab7d4f127112427584c497289c402270b94cc5eeaaba7a4ce231df01fce81d96c1175050ef5aee5087bfc9f3230844c970250641b520b76614a051deb717e2f837c2037da68cd2670c59b45b3551d6e6bd5e57c551b46000e615f3633e15437c7a2df6fd591085256d3304b545a54f550b6908ee22ee2a99f1031223f458e570028b9954599e7d1834cc2995d67b24a0e4d5b8208b467d8dafe85cb57c6b1f9f5b9b79273a7f20bbfd95a1716a6bed36d414d4010d55bf789d46218c38c47846ffbdf4ca7e4b269d122ffadc73d00f9353b6eb142b8486d7239d1f1cabed86036963bac2977ae5183ceb943b75400242de2c7bbe586b5a25ed6d83eb684eaf41233d39a40896e2c9b8690c12f1447bd1edf5f4743662bfe145382e7cd0707aacb7aadff35427b63e2f18d0f77a45c2ad0d93f3ea28131e95e57d4d5586fb6e92812d3c150c95c5c20b8b715d72dc7d50b796d864bff4fcb028ad8ee9ee4801af2a44dcad94799811d8217bc97d711249767f30986070d0cc995951be98deba3f1d7210018e3bb39a0f8b3eafec9c1813b4ad9ad9ac1f4147b2013457f9281eded54594d55c649eb73c29588552c5f53c0ca255cd1568b4be0d25b52a91cca60aec2fd98d717cb015c87c57fe4277302ef90e1fd71ee5a1abf54742caf534d64fbca13c9e7ffcae224ef49b5f3e386f68e441478c3b0eae7e24d66b9d95e92629e14a5c7cda6cdf693a42b14ca881f96658ec7b50fc5c21b0f663ae36f6521c05d47ba7cd1335ca5704b7383b13dc74c3e14019b9d556b1f0f47f790b89283e8010b5bcf3bcfff57858f27e9ef2a0580df81ca14b4876b5aaa97a5aafd0b3f40520a8fa852a13f7498155130cd786198117b2a089d834c33a7ff4d1886f8dd3217e95eef5fd2a3647288f83f934f63fd9caa2a5da1729514d026f5c29b82e5251a53d08caa89b48fdb8e25fe89d6941748b8d1fc067ccf64ebb5a89084d1e08121eeee687beff85e9acfdf55f6367b4edd4a28cd14c8818ac1536b6a880c56adf562bf691a2cf93779f52e2c2496a10b220b35b8157f33f01aa94838f15bcd135e584b78ce673f833ea51a6b591f8cb4e0a002a64fc86efdbe5e46e205e7cf1a23789b7ee1c850abb289acfadef9c6b3dfb4977d0bccb819741b6d500dd8e32a0e69b6619978b6159d49ebc1fb4bd76ee7edfa2791b29cac0588c66b505692abe5d4a40b3f9ff92bc78de0a9f73d454fc0f3358a29a39f1e3a4c58191888620571606e621a649f54f7fc91981cf99abc316f50901bc74bd8d9102c43ab96dda17ab61b5074f032f7f73e0877b0a45d1f04095120ae452740aa7b48d252a98be5c87db3bc936b3a7e8dfc4d2ffc6917dfff6842212c46bbbf7736b6ac55e9f33a225e3f8dc0fc3d5082de66a6486e4f64eb352a7ddbf190be06e87ebbfc7d9d095101c6ad43cbc5d59d8b5dc6dcdb8d168f17121b046f2da3203aa6e58f8d11b81e0d500364015975a8ac3a76ffd95a5db5b701e3eee71ad78dd438145543d8b14e2be6776bc6829869e8039dfa903ca123bcffbde382e0c3155d3b2f97c5795aac028ef19f41c6a6aae8c2251527bd4aa2cf1591296806ce807eb81e9d3b7c1dff3b52594a9bb00731537ef598c665c0fa98494709c0145f95deb6c9afce6a610e7d3a97b2fbc523c6d240f5cb97bb6bf3bea5c7cbb293e01d263d1815a5c98da2714d941f8a8f63330d0f0df6bf47b455ea31f9b7680ab8e1fd56f316ea240b83be9336db70952d3fabf32560699101e7c3f4c61507014fa60c0742fcc20042790d14662dd45feab155f42552bb22bb72f2f6142cba000d37fa5aed0d57e79a4c06d90d5cde760352b21bf514dd814bbe1e3fcd45a7905a5b7057dc92d1607bc350e911b1b861deea6b6f7eeef8361793f0d8d7a8f6389ed91605f7d258f44da8944c5c7487a8e54127f8a62834ca89b910c81c9dd081417a936c2717122978c1790bd4ed76d47f1e8fbf5609b8c408f72517826c5df2ab06909452a72a8a64d7a82d6363aa6c134a4acb77daadacfb17d7cdf35cc4134445b48661cbc69c7ab1c8baf0204ef80b8e0125efe43a0bccdfd0f356b62e6c75fea8493dcb0fe9201982bb626a8800ceb05cd3a86c8867e218b59192c3c286a4fb13e5ccef2cf8bfd57e37a38a800dc47802df88bdbf4ba58a31ad91c8a9e83b029e63f87f4551c0ae63369ac860a6 MD = afc01657b55fffd0c739cf017294a8379f60c2f9 Len = 18728 Msg = ec2f7852d0a6e6d13fd4220233a00d9c9c063d24f65e3b5620e1efc66c6958c7f378818c2b7cb08dbb51e02c8d08719925e71ff332b031b06327f23e7cce65eaa9f3350212eceb36afa263445e4c81d5337d20a10f614bda7443b0c8975351b1b7a77dfbae7fff94c6cd9592cdf5a4176cd12978b4f8f39efa4010ace58185e1c59c42c126bc546fa6dc5d5e038a412878ea23be4afd90c29e23f9318ddf67457adb6a9aa32c528ff7d6a2ef2893c2d100d0f4bcf8f9890f07f655a0b8f660a47f6bdecf4d5562bc62c44e8e63988ed8ac8c86bae773484dddc10b418d4cd9c57b5487a74bc1eabd8ead4883dc220d052325bf003ef33444ca8a035c356b3871179f4c6cc6f8545b25997816bcb8a7220ea389d52601b5bb745b2539d7dbe670fb531464e580065ecc91c68f2be3c4f5140fcb83c726337c833b59209c224c8ace78c9d9d1e36a8e2d9b1a35502acc48de706d5048e9164da0338758accad18739175211b1a9e6b2f0c25c51541527e113ce5685d2d3c7f77349972a2e5bdc2ee3369755ae58e494bd0b742b5e2c3d885c3170698c6bac42a38771de4a5bd74875e080ecf07acbfa3a804a0b97f8770761a2a2469f392ef5d9f5fdbc2a54299d961af5209e9603ad1228c73927003b25c928d46232c5b5dabc9a240bf3cd3af5efeede37e135f475eb0bd1fc35ccf2a93dccee076e98aab7f57ecc15d04f72182763237ae0de06196e32519ee9e5055c6495d97b7b3973552ba9de20e76139cee781ac31c419a16342a430656cd2da06e78b7b0680307a7c07244375608bf7ded75161a4b46e2d190f69549ae61bdb6f6db6bdf2a50626f330f6e15c645514119eda2b1ad96612047f8aa7847e496f5e9f1f87851442de844f27a21c1b48f82fe525f0dd5a88b8ec380e106d5de3fd9c25cdc209f26c0cf50cc06dffaceb0b0053389a33605d8799e2fd769bab71eff2a6c854c46a0c170f0ec7294b3fc6b64b911d0f65136ce8d22660c3578f7cac25ca1927ffa1ab679afe47c049fe625fda46dc39ba9a3d4160ac3edee9318b9c003ac72201c2d0645e834519410f4670731b7bfe7c1e58fb0c1b9faf99ba26274a9eda2c14f304762346cb1c7b9afa4fdfb80448f1c6467f9c1b8b1eaf52d5b5ca9d5b2f7e5cce05b0efe0b13ec80766e6c47efe63bb8e34d8560b13722021ae49e051128827b679ce258dc0d4c0f41b4fe8f2081824b8818a7126762b4d917a8f0fc4bd7a79443a4590d93183ab49d8e4cb674e592a4cd07817e52f2300ae8164d1bc179c7d01b0ddd9ccec94b18f046b16e5b76df5d3886bee4e269f62fe2c90ce420a355874435da86eda4ff94d06ad70752d9eacd5102b9e6c44ea9b0be1daaf5d7e8f35265c8fa4c8e1fbac0b4872821d983278d8d280d0446f4bd25d090c1c1659f03a9d613976e1eae1f1523181f3e7de72806635322ce09009307a0decbc7484a18f63bc24c6c1de4af1a829a46cdbe8a6ed06a1085947906ddcec5343387fe7ea5d00d3183b71a37cd49898a195009e16e6417ecc008155bffe3b45d8373f6a12ccfa10dd7df823c0c1a7e641155ee809949d3544c897c947c0ed4a7562bdf66303dbda3a355e445de05f7c4c95fdafc91ea42c395a90d34c488cc9e0610071232b2a98f80bacf09d5a47c08abce6d99caddecc725d745a18bea02ce2db10c59b6b70b4dfa6e90ec657e71bc3332050cb69d27db97a4b48f14bafda4379f6d813ec3495b7af1d8621fec8f6bea1b3fa9d7908a8d4591e842017433bcbe2b994d3d5fea348cd5040f67871b744afa8c15c0608b38ca1f4f6ec49e3b742be61df224f57465aa98b238ded6ac81d05068c4e375b08a9fad6869f0918b66fb7f7a34a82c5e6b4ead5192d843c8f114ad542bd35880df30ecb1c808168a01b7381c79195d2eb1f39370a1f656e76e8261dcdef27172c3282dba0d6d65edd0e9a0a3340b106bd633eb8dcacb988e36943e7142d3690cc2d010efaea337fd510d597cf9efde8c448a060781aa813405d463affbe8a7c54ad316d1204be55f1e9cc3283f5a20069960837c6b15996f48cda1f76ec4a632e7abaffd06b9f67976026e2378bc7d612141d46aebbf59967bea59d61fd9fcbc15c45cd1d69ff3d303f8bb0d3aa95f3298b8894197ea3a401bb4fbca83ab03e751b7adddf440660254ca5a23f9834de14c3f029ed438c402a4a818434eba643b27e00390045db57dc5019c3639dcb1f3d84fe0e1452d7f44a35e3feeb58a863e04e80e966b4a7aabf1292182703823f0a965a4a74f3ad49c9421c31b6c8df246753a1f3fbd991e2355cb6ab741082c5e5c0abe5f76e36c60f3ad5267e857211b0550c61a5fbc286a5f42d83300ef33935cb99e8840a99f384e4b5e329d58aaf211c683b4e64611e79a3a0a84543fd246180ce5a0211ff58910a6572a0014f88236f5e87dd5a97321831b72399f8c60cd3a4ef435bc98f7e9c728cdbcc50e8231f18964f3a268c4bea6619fb1674797cf202a7ac767b72ec0fe5d324940c7e087bddb79a4d1067f0570a6f38a3013cf926619b9c3b6ecf2a502be257df7b38c0a1876a71fe5f51aac7e460e327e5370dd788761b92eccfc1c90c607b97e73fd2f7de56db355d7100a2bd95028c69943f6d40de31633b9a38e050f599a396bac6e7a924e0da50f07a505db5a0b9d5781750517be796a45717ffbe4ab8ebd1d225d7b27b88d581f5a0398c69c296710d1ee983f744136f2fe78d2007e057dfaf7531bf04dc0e38a9fbc61259720b847bdb9e9ef750c2e4492ef23cd419cf0a78415c9966e36dbd33125db62cb70058ead7d86926148c4bce7795da576c3b98560ec0084aa5db57bc6d68418b9a5d33819800ad299757ebe547e0c43be083d27066c5d3582b3e4f6c954d7c1d210a5e68a87c32abe20d0db7283ac1267e8f00efd0d3c4377c80ed6a11762c8b56ef21c88fb6c052fb94f96ba10b98c14d476afad552a190a08779df69491c7c41f5c3c9d3141fc6ecd6f72a3bbc12b3559457bafbaa330aa03d3bf226301399e9028e92fe0016b0bdb94f1c7cb3f7a49e5c1156cd43424e83887bcccf92d88a56ffc84c98e16fb874274868ee590f3e3189def7d086960351528094ecd634f690d5ba1e271ff0851b072b3719162126150107c58ed9f6d2138293730666ef85a06aac31352262c0b94040b08453f70752aed3e78ea52b63d000fc91a4a9d1e08da8e6ac49518c1057bccffcb7765787f1768c865853fe5d90b403154e07a2af5f76afb8ec16381efc6220423ae90a4ef94378c9 MD = 8a148c03dfc846b484ec15809d9cbfaa4b74a060 Len = 19520 Msg = 0b6edeb5f06b22773d0af727dd59bdf552a130004ca497bd7a233d9da0a325eaea71faf280e445685ae2e30756a5b57887bf9976d05c9930b2c863ef6331f9f820adaab4c37f410e98967c1d6d56c003e89b0a151efb293c604c2b9a58661571562ad741e4c47e31a02cacb04bf3455c1d3c6c235b09aea82cb87ce8a9cddf1d33f167e3093b659919af590a1704ae4ccdaba5e9b20c903dbd13401f7bebc0c4600944df5b6d5c0dac246d71fa12629ba0ee9faf498e36c3bc655e88f94a212d847a548001e1cc570195cf2e1ca4c911400f40bd48160a02d0b6be6b48716821484d810d231f1e3dbf096789a4424b765215725ad82d73c1a20f481093e8ff685489b1cdebb0b8888f891dc9ba74509181091ccf2159d9cada77e4be00384cca4f36ce097f1b0400181cd93888c3402b72f226654a25a4e31ff77abfb7e8b90fe15dbf0a07e8686c03ca831c33b6830cd0d877617b163dd51996f259e180acfeb3056c15aca04e95f79b03bee6d681fc41c4f90edeb60a67715c34d5a6888f606d36bd7595ca1d449d984166c7a9a3c36dbc93b3988c7463cf51287b2d89c9fdb7f89a70ecee3d3f9dc8265cfeb94f28fecb2d97d420e48fda7eb7929f0bc29d3754eb50d694164e9e3498e7b48eeef599f6b003b8fbc0b53beac7642394e2089851985b7d45103b48e2805011aee9f0e847023f6ca4719b9a9d4137e2ae910580f889da098893cd44dcc7e03ca3a6e293c50c9319a3600a9da00e5404e0375e9850a714a2e607cb3a2a53dc5ef58f924278b647e781f4c9effa1403b0b23cd98761d8536ee6d4fed1d20e8f9e2a0bca9c69e9a2fdc594a236b33d8b0ead083ff53305dd9810622eb2dedf4025cc8150499f8bed84f7aa5b1bd47036475803578ccf17fc46ec19228555ad361a635bedf2228571a3a09dbd4564954a833c96ebf13cf4f5a10362a4f14062baa67500693ffbc0738347d5905d6b9310e9df27c1cf828613d0dca37a9ea6e514f18cd88cd731233e4b74ba9c0af254d0a2cb20a3ccaab39dfbff456d358f1e8c222f4b1e63cc951924afb4a8f5ffbfd2d588e75790ba65da4cf5b1455e04f56a62e7c1e68ad5004b36812b7ec59dbc5dab9ce6a5c4bd8313e9454ecac00b52f5d83aa2adf5534b1da87187e423d133ba4c91835710b8f591fa7783c404af1d76adb2563b4b4e5ed7a30830a3b7a50c32dfef28331bb5a399a814bafad1f53e3508d7455835cf21c14ecc8e8328202f0b8d3c3c038ebb75761aa35a35d0e79d7a1230d8cc5bdc7c22d247094b1f4a858d7d02278d10d3536e7aaccb3da98c238df245755e6480574456010ac5432cf402d8c8509a4a0425cbedb774da03ecb6b5d19e86d8f9c09a6d0381f7b73dcd65b0c51721f1e456d3d39d4dbfd486103f3cd7c47100c1a62de6014f3aeab436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926516deedbf76d58a1d57e63065438d8fdaac1d482f694797c8c81e3e78df55e32bc7cd6e68c848f897e6416c2a99d77be9a5fb0d15f4f6661df87d7006dde10d89c6a5f4c54440cdc258b4449dcac56fa54e0229f8ff6cd140552ba883c36b6de994073537634386275fcd6e513edde7c804c1132ae11185ea7ea76c82583ba0d5c05f9451bdd7be213beb5db76e9770bc5ac67d4e328ae076d58f1084e4f832d8dc1d9686ac53e26aad9c7762f278a6ecb070bca56c4f7d7fea31590df217906d47dfb058c76e7f4e056f6fd632f7d6e3b65e55f306c5b9603d3c8a70182045fd7404763a878e0155d3c29b73d8abad3bdceddda99a9420b23f1f496dbf98c024112a5cce7518f51ca9348ede2bfa765f84bdb82b80214ff070480a6970e79b5b8fbfd86718b5e6fcf643ae87d56aeeb95e3c7a1b6ff393a5714541c5a493341e40437da6dadb43913b6e9ed34d8362f3b9f897dba281a84ba2a58434f33226e6f343b100340f8753f913c472fcca6f79385095eed061da5d84c74629b53af03fe94f1705dcb94ecfafd1b3c97ba680c45a0308e7720ab645a8590c0693140ca3c2a4142a0d6ef66ed036e16942ae336f8f5e4547ffe2d8ae8da94a6df563f89ce0014cdf7ea71abc0aa1d1b4da57f3c548e0ef72d2909df2955685c254912095f1e505a888e82821afb1194ebb2a4e8037297c0aa28a92bc6fdf42a64922312958adf317b4a8ab4a3fc30c895daba00aaa965f71e83733666da2158c4bad86c184ea79af9a6f10a04b7630174a4294df43c62e4b1c3d1c8b2f5d52d6c489bde917292dd2a2b1f49e5349385b0985a97863274ce896f2aa85255f9f285c4d331a8fc874135607d3ced7aa69e703eb3a60b9385ffd10fe59fed0276f036b7e72d04f66d0f42cd71aac5918691dc1f9d4129677cbdaf2c6c752b05326ca8a8419a4e672e907bfb645a158119a91ec2813288b741514b4d26f2b66517b1021f48402d58b1090671bf158452492d5bafc53fd18abc03cefa7bdd332a0c066da464e74ad0dec50bb7e8a3ba0dfc64be6fd331ace9d51a60bbd3004d5df8b211c0fd564cd79d0bb35649cc60ba1c976c8911cfc0db74e028199621aa05c5fe15fa7b56dc75d62225d548581e5f900f9085e9e3b668819b4f9b2c09f22a5a32a2db47afa2b371538abc4f0e9b06401150ecc2333598e494fccafe80ced49f96dfeac729459856e60a94c5b780b614e8d4450389e6748513582c724ee60c7c71f5af648b6e2d6e23cce4121b7478f4db451816ab71034c5f8b4bf13ae1d9d90d0bb2869fc4799f51f9349d022053c831cbee62617d4e22c2bcafe40d67449eb04a7c962bf084d2bab80dd0342b4f78338d4d4f75b25bed8214deb18f2254b3a3da94faf89956f0a432f512783e74ec29b4c045adba3497e8ba62c288b711002ee2821cce68f8df588f76cc9801cb0d5b67ccacd33ae1063cd6c37dc0d1836e988acf63750571891ef618645a1b5bc110cffbecaddd6824c692874cff16b3e32bfc0236b417c9d43d8f624387352cf19114d46d0448d3d7cd1438960c2ea8482d5da3ff544608aaff83dcd1e7f64786275ddf989f262a099b845dc2b0c26a86e7d83a251e3c37f2aafa0e764107b36618d2a5d3481d73a1760b7f3ab37a0283a1925010d79e5e94871b819b5e0f787bac9dad87c5d5b887a7d12565ddfd7729a3b66c274a178377de0fbca607b79fab2de37f1ddff800a376fdd7abf5f4d15f346a17d43e4db085f7fe470102a72fe0e1cfa4fb5e2b54dd2ab71e74c506190c9dd6d87f7ae8eca5190fab12178630011286a38b0a18bb1d0d29802813dc561a2724378ec79140bf8e6a6f4310fdabf606330434ab673d4b6578872fa81d90701779bc6aedf0b2bc9c381bfbb4b3a6a705fc505d08c0e24f7bcfbbf24c72cff6b800f07bb4ac4d828ca138a1ca512cfc59090e70ea MD = 8ff89c859a6ffa3d3874d3d1be4125f9de62c9bc Len = 20312 Msg = b0517cc1d46ae79e220c9ee73a2a54d67e6da0f26834f63222d9d665503643d13067771be6d2d56711651fbfa21fe9b9eed24e540227e12436e2e6af0567c3161b7db1f8b053b79315c1d92c8ccf8db15d7b6e9e26b7341d73b2e4718e584494991c921fd9f5756b55a634f6a0432608f3f16a967eedd76600d036749611af95d0cb825a0ac0f837fa9f98e485829d04d7bba805b2d0b34706c44680c398ed5feb12e96febbd263f2b316dc0e494dbee326192b26a68ae07ad177b5dbdf7e53a10792f2723f3e8ca11e61b506482c70e2b6c8e674dbeb1f01c503cd22d367e706889bc4a5b6b2721d3450a5dae5348abeb6306ea03d9a5487cf7f3a8bb5ba2481ac9f9a03a2bc98d9bd6a3ae690f480e99ce610435c27058f49407a70e7038094ec24cf0693db7548e224c0d3ebfae805e36077d8b7ffc68adb0e097cf7c27fc2efa1e048fa8dabed6b06e40d56a62476221601dac1a2fc0cfd2e640a5885969dffbd8a2557519159b087210d5184babcc1ad4ac419af3a78183816a399bb5988c4de09363ab5b9f04b3be45e7d153f6c4a6cbf1f1082f67eb4a19dc33bd23d05b76a09f60528aa63a38bca7b29e616e744fadb5656bcb4636af165f3af68b5a74007e8df5738d70651fd3fddf865e5d029ce2c044cbae8d8a3ae0bbf64fd57e0073e427c9154c45abf16a11159230099615d2da3731c2830e74dfb810cfea84275539338540af6f3735eba9fdc9c0bb5943e5cbe6a3ee72ebe47b1d307fb0b41030e57ad0fc9e352f73bd8e3e33f6ba72ad845af82c1aa048131db4fd651056e48b50c4535201debc34488881d8ba500adc155116d12e564e872b43208bf2b1caefe2d9b549c0b305fef45f6ec1f5c349560276e79c13dc25ca0f9340f93f0eebe303809feac3fc335c29daacf58d5c56a5b1921494af7af4642f6c06b6ddb56fef1b83b93cf2016dd34fc2e47c6c635a508c6c44c1eb78e3dbf5961acab6ee7d9b92a8aa473609dcedcedfbd5f78207ce0f9ce202cb01d1cb9c8d8233db1013d70d0b81b13755da7310ef9e0a59bdae5dc627e4fdce4b3c4850ffbca17b535d8f53d7ab3a99946f82778d8f456bcdbbccc2e457ad9708006c834c8b661acd476b341b81b10880af4587243a27bc3692a39c5eb492c3dcd08099e048f237d243e304538fa502cf1c54b6504921a97cd57aa8f3863dc32e1f2d0b57aff63106e59f6afc3f9726b459388bae16b3e224f6aa7f4f471f13606eda6e1f1ac2b4df9ef8de921c07c2f4c8598d7a3d6ec4b368cb85ce61a74338221118a303e821c0f277b591af6795f50c40226127a2efacce4662fd7076c109eb59b18005e7165f6294a6976436ee397774e0df5000b17579b38d58fe0e1b5a2d1ccf329b4fe10f71e8180fc5165a369c705f6150f8c8b20d8b7b6d64cdc0ad69f2b8373e734055a2ea90575c5658610dcae483b50b73c6fc4693a74f363f681444031a6a0182c67804962aa4a7776d3ddd16b2d6a96138c87d8ca307e8164edeb93638986b46d663de9fe6086a25bf9f3f7c7b40631f8be488cccd3953b3960baad82e5420fb19e8c12416221ee1bcb45a7c497cc8ed44e2f0caa25df9b5e23d915f7827b31de58964a9377c4639f91fc69caa063b78d8465e0caee05a8bb7e71532928da23dedc821c5c66170acf933fc5419574b40da8129096f6ae6a38b8aaf07f9f06ec9772790d04f8c1ea93183744913fa68b3a025da4740583eabe1bab7363aea894f362a3a7f3f56b0bd46a0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece451b59118191b309c29884240b31988934ea185148ae0bf42be11c0180ad9e13c996cd00d055575347e31bfdabd430476ee6290b54da97241e82d023661cef43cade1ca04cd20ea3f9e4cdc1c93abd65c7c3d82a71133b4e626ee4642e22ba488e1acd58bdb1e0e121c425d82e0b47cb88a9ad166701fe5a40cce02ba26806095e736992ea99d5f507aaa8aaa2f0d761f8bf3138fe4de83000c44de28896db6e811177b59c33f6c8f3bfe09fed90730f612eebf6fe9f01b9ea80b2f0a954415f411b7f299b274a402d2b5420d69526bd091d64b92e9e52db452597bdcd4841c4e4ba0a55af1cd946fc158c9326a4f55339b522ea57f3e27f5bde84b1bb1de285b3159fa3a0baacc3aaa51162a568eab9391eafef4146b98e72d102343d792d8bf655c67a35aaca9d7d056af31b860cd7517f9332b43ee0eed32698ae190528bcf5a1074237943bbebe5a1fb050a96395c900541978835e89c606cf871868dd01f722eb646f1f080cb4cfb9000c77f8dce8cb7c0e54be3b4592992e27024a544346fff946a2f43871a989bf4a1698d292f80593781297800c81063df69f5594682861ba519bbbd3d4e3b3b9f837b5f9a13fd91fbf78b534c5d976845db72fa559e670b4ed211be21cab732f71377676ef066daa4a4fc15f58e3108cc211808fffc7537183fbbc6c3349f1aa1dde82506694e9bb835e6209ace7fddc8e76f15a4115337979f24779000557b264f3828fed3376dbd16f413bab2d64fc2aae290f0616375239ce64126b27cacdae401d3c6b293c909c4805fd3cfc6e75fc81d1b6381488862957ba3d5cf67485638bfc5ecabf62654db25755479e42ce6eb79155be554d9db354f204bbbb7d61eb9dc6fdf13d10df4a75df4db5590a8fe71710f68022af1d3e8fb36f70bf0de9ae3e2421c8eb7088fc5944ec6c76eb41cf6af7a066c2d69031cea68564474aa61535bed33710a7e7cb262f3a553c0f6b8d78ed5c587fe97df6da734e7d9e5f1f864c3b1a26f6e08420a3474058f59e958b099b313e9f116df47bc1d2a40b72dc6a4944ff7de341e8619935055ee7bf4730e5a927006b75e79378381ac2d5ac662af580892420f29af8d1a0914d5c9b0ae4d3be46862b3e733b9b812dbd4534442c1898c003f51c224b1031ed0f9a5a650f9d8297b827939954aa44137fa333feda7a33ac03a9e709c42190208ae923e119099f217fa69de2466e28d5ee37d01d9be2fa560a867ad6c9cb6432a8931e046be0baecc1f283d57aafd67af4483428d61a94c501d2fe11c4d5552c4fdf75596be97e0168516efb5635f60a781f86a7f5e8ab01d1d69a431c080d1569144d6582ee90675a0c86da43c72f8e6105ef235f15e41360da77f3392c31f5dd7bd1b218b59b26816af2fcaa2f290c994097237c69e9029826bca983096cd5935c26c796084547c3b5dbe9f1338d8f0718a52fb4ab62d6600192ed626663bc73ff772c62ad36d10a336827829c031c93d741cf6fa5f6989fb521483e0cc1b265abea6ae66c17cc3d2ec240c33132bd25c3958c151d4e4f3f8890417fc42cbf51a9a708890f904144ec10bc1ebcc379a526c6ed0edc120327c308618d544cec1f42d78eb25c483707b67b21fa MD = c0af54b14db7ef0c68b1300b7350fd2a82fe96e9 Len = 21104 Msg = 5e9d7b803f8a40cadd83200abc49e7ae245635a7d1c2d16dec6740443a4497bf941f8d82976ed44b9c78aa34eab8ab322b82e9e21de93e858adfe1487a9e38caa747edd831c9447b9305ac34d630948605787fb5e0ea5bced4930ee72be553a8815dc40a7763375fab724e93e7784ab1988020a8828ecf50b3caf0a8b5e18f6208a939a1cf045601ca06bad8845a76bbcee1f4446b9d43130dceaf13815a95fe26727524a3734968d90a158b179cc0ad8de5221004df5e20cce572b0f5180c87c202a01b5a79b79cc1c68a340707cf8ebfd2d395b31bc97ed65861087ae29d02c39fe10e5cde49a668823e5cbc634c664bf12e59e11b2b35156fa6a27982f07913926086116aa68db8865c8a9e78de3d198a5ce6f7a52d4e6f71660658beacf39923460be1e4765998190a47150d2e1c11e584c45b8277d0cea8ccbd815f79793d99bb2334166312ef85701a89ece30a1b49cf79777ab0c3195afd4e5a2d0112e73ee65872c613c1a710b88b62dba6101f00658fb254802f38d024414defe9c67f58f03103bd2e6ea703072208a31f3505506d8e73da911d1252671fc06fdc9ded3000364fc35d1fd7a68868e30cf581b5820ffc24d288949127ee6f1d7380a0190e3ff0bfa048de1f4060e45bddd1fc17dd75632c05109d9c99e2b9cbc47dd6ec39d5e6b91b96b2671bba1fd9e05aaf14abc44af33bcf3f1bee6b86322a7c484cfbe9a0a6fdefa4977dbc9fc3db39a19232273ae13b6d82f76fb05cba6c25fc229aa3a7ef0efdba97af8eee839715da7abcc4ba5ecf936e1664dac6cb541ffc575f2c82fa1665fe4ff959947fdc9763b58fc352d2bde90c61151049cda81350d192acb931ddd278a8a24517217167432af34d8aa5ce1663c0c97b6f2831a8fe7a7b4ad5fb2aea2f88f47901d0202c82c0328aeb3fcac37b1cca43bf44b7871039622f5dbfc7552bd9351ed9f3af8e296193a1fc0879975d5b5e8fc18a02578df58e83d9e77abc7481ae5b28f4e7373ff45dba4569a33b1067ce87fe60d9c17e98486dd2da0cc7136aa759753a90cccc60d9ff4fc80f569c266255fd2f056dea09d815cf00451d0f7a673f482d72f8d98f4f96a18e86910a82611e46604f02d93086a458c1ec67709b3836293554616c6806a7c424d0946162150d62597c2954f59a42f585cb4c3eb46066a1ba00af90d3485b3ef0b506a9adc447d884578961405b162fb4a87582ac28f637243c8b4ab85bd9995cfd8feb4db7f73048a7cb0bf912498db64c89446dd80f74dbd19da4ff884a5ccf6fd82e293643f30c33965708070298f37f318adeb8d8df47878ca59117d610b1d4897a298853a83ac4934f55826ad6d408155ee7107a00d12500555450a43c69f44ad735f750d7392269fac9cba9d1bfb1dcc770271c5fdf75a3bd317bdd686197c14e35c962097115c1604a29e6111d402fce6146e785db3d1ae410dfa81d008599e61147b0c44a65438ac1e64a1c577eb579a2b503f92b4610d3dac52ee1ae8578a8b1b963932cd9967f1748fc7cd33317d21cbc974339582b907575973fd361079afe67a2fb7f3b6347329824b9fb27fce1b5a3cbec6b3b1325cb370abcd7dfedc6de989686ab5151ebfc1dec5936210dad56b1c87b2bb67199c353afe223c8d2343a9667bb18e409725c217ae6ebebf23ee82fb678e092edf54410af381de360ebfba73c222ebb32e439eaf6e8844b529c5165bd6bf1972e4038b832462efa3df307143d4456a0754a7dc189e5680ad5d07b9b03ddc88ddd8286915f95bed31154482594a8f6597aab0fee5b67fff024e14c19b356cc3ca1c416e45fac36388516a52166d778afe80fd7b993f5b1c4e7d7ae26f35c656c230dd0f85a13fcef40420552de57426a687ebd6a5918e650c5ba880ceb79fbe40b659c1777537ac0ebe052fe21b2be52a101a948d756065a6793c111c534f66d00d46287def317752ef6736e5a6f522e3c9f839c323a79ab7569437ea615bfcfaa630a91b87b3ad4b08e50eaaf1768c8e06133ae9549a70b9645f59bb8a5bcd2b2197c7d2d744da71aafd1b9483167e6364da1c6260df941722ebfaf236b563dc0ffa0936465b7b41362de254e45b751e56eb62c0d0dd517b22c89040ff0f5da7b1b5e1b86d6e0c444ae5f74e9dcc0d196c9582773d1a453fe473be0a3ba026f8c779f5cba4f309e559b3cef407de92ef168700180e2cfbefd88be8c0753e3c59a1b499f29590f0ced315dde7cb09c2f9d52e7005bc7bc2058f6f850644302a44e0d462cfa7be5d4b479aa89c4fd419d438fa36d2d08d541b79ad273e210c6d450577c4b563e1abf547a0c3741ed3e408a288e901d2e81e8c07a343fa844961c4701d54465291695723c69321b07fce01b248fb054c027df1ea007fadf66dc45dc11385e4ec4411eb9c8abc079d3e3459d8b8d16f94631ec771431edaeffff18b6918ce23a970421ce25b82a83da5c36b965720b354806d874dc9c603e96675a7e88bb18502bc5685c5b7ab863a3cd7d17bb25d5304f0e6abc022e9ab6b37cd6dbffac48b907edb90973d7b13eb79fe05e948ebc11e2b16cf88ed1e53fdfa55376fd47ba9cb3e5dd7d74b95f3f9c3b2837f9950a018a57a4cf866c8701a04d98f68a74b622b8149c616607088bdc071d49f1220527ce68dceaf4e7c92381d96e04ae1b83739de1bd5d52a9f54dff6d863d841df7ac364cdaf0df2af3ce07b29d4872246ab6eab60a183f866eab8bd42cbaba6e26b74a6b678a501c4d29bc40ed69dd77b31428fa493b3588bacd0aa4d8699cfddb71932e4a604ea71f5d27eb2610f8fda6b4de14436d3c9623dc034450f131b25d0198fb4d19e1b2b091d01c0fe4ca9c8abf946ec0575d98ef00ff1e5cfc8276f690e13b365d112649ee4039718e5b3da95cd26f88a19f7767608599c62f952fec46f757ced6e7e9329cfeac14b5b3c949b4217f62f20b19d3251d1d553474c7884a61b5dd2a6ae4b3c292dbc002db26b3ee080617f2a7677b764f12d0b3272412c5a7bf2b01a3ff148885303d1cda3e2f33106c704a7d49a67ca4e10053b430d2de52dc7f0498239c175e1152adb8f704abbf1a32a295a89e5fa3f0adbd25d10fbee973a2da53369497a5e8c95a7d3b7c7da07628a1f56aa946d5a89e9982f1138cf4ee5d2cdc214430e31c68cd32f1ddd238e919f0a7791059c0719d8ed1772471fcb476a239cdf4089e15f8aedf0170d111dccc37b3bb1bc2eeb470441c4b8b95882db5e37421ec4a613b40a48a527da3b2b50a1d1f1a11a6e7d7e0646a55901f20c1e4989504731cb1f60a583dce4c6fa3de9b4af57d3c303144b596c47d7a384cd8c968a260d3a618ae1c72ff5c245e6dbd47673dcbe2855661b78131ab930795da2efca51c52111dcb3f99d9e44f9897bcd61cfdee4cd0de98aeceb9c721b5822fd9fba520398549b53b75d14f1344a9410f103fcdc2374f50612464b96d699c3f920eab54d02922d4d8aff283b98a2bb6bbec0a508be233f0992c3b69bf4c697323ddbea05e263291deef41698893a682a257675ff1fa11e21e8e45bf5f867331530fe6ec2da4015214dcc8e9ca87a20d8cfa5ce23aa7728db8f18aa4943e42e2e94d2b2083ca1580431f8eecc58ea5bf417cf4c1af10dd592ffd13fea79c5cefae3e9624a9c0f88433609b58c3ce3900888734e4985edaae4a5be7b7e0c94bbe6a8b2ee0e7af32c4ac MD = 4c66ccc9d6a9f1d988bb7ae0fb41be3a1e1a648d Len = 21896 Msg = 54ad09ead61540366364b6f311e3d9e3736c71c31bda3b695cbed40f5554d9ef2ab54d10954d3b5f9e909c01a6e97ae8aaf356a4c6ecc87cf86765be2740e55364d586966f73ab677d0fc97a383783f50848143b91e0ee027d96a0ac7be9fdd487777b276d70d97588490507d0b53c3414d1732f839ef62371b54f825836699a1d02f569952a0db248a71750754bedcb56f73b29a40f28065e2b38e7c70f70ccaedebc04f18a8f45448fc9fc2fe1dde2562233d0fd19cbd4cb602484ce5c5c92c07298a18978a657046ae1b4065f55a29dbb24cd95a529b441bcda0178057315dd2851e863dd9b1011a1281f03ad9d32b228d6c7759c88cf47a72405caf3fe7d8c67ae80899fb697f29a66e62db3fdbb1dd31167a3e4314d6589c838ce0c44f25698781203a83f152fbf63b08d5abd6567229d5529676c5523ca8f438b398f9bc1217745d7de7eb15177e62629882457177f41380f0b800f0ad241ce096325a0576b73c20f2bbb94df29b9f00b267bbab551c6b85bbab7a4a109a68051704f2aa0de3430b3763de5613fa2b53b1d0ab5c900f57e175b573c70d885026a4a556123e28138c9a74dcd60206a1dbf531971dcf494324ad6a9fe00a5a8fb5cd77f6c68e024825ba533746334d9d2a1b2f01675946b7cfd13f513d8d9d51430011573f73ee3b5705a3701f2e3b679e921d7cb1d4a440237f983a381ddd5f5edae5ea05966877911ada19d9595cbbd9d8715b85b7ee56f00729ad5811870459bc8a31915bed8784586b86fd5b2de43c7cef306b7961769606683d162f16dad43362c06b3b09d5714cdc5a039a2b8b66eddb9ddb9fba29860bb87c0abd296d4ebe04190bba3a0c1866a10574acd21bc9b9caf64ea154ea6075aeccae522b1639eae2adfb6ffa75ca446e1bd8e9ce0fd55f31cc4d14ce3385e2bfa169748870161882e1a2c2b7bd0754780fa8f75bf23a4ca4a24f70928f96b16fbcd49aee0573e569769a391e4c601563435d5c184d390097fade2b2e68e3804351684bb840c3c00abf5a598a9e6515c4796e6e9f8b7229804871cb1e5a2cddbf11aced73ac9636eb3e6b9a894d76c3fff464c53e377615f21d92d6ceddb30857700b26acb36bc89f66468296b425ae9a56d8f690dbb56471dcb9b4dc6e16be80ff1b5dc00fa4e37be963883f7ce2440803235923d2a07364287f0ba375d86ee011561969fbe226151a4b31f0024d12edabec8353d6c7e15d632b31d0af7877e94933dfe70293ef0f8b761634eeb699af939d0bcd32ac3cd22f76ddd0556787f1294d17d3de4accafbf7c9b8a8ccf56b26cad38ec80cdc446efca562f12360dbc13fa67ccc9674d9a28b7387d76f7c8ba9995b13e3b9d3640269e31495054879eabd4361e6e89c03359be736a47b06e1cacfefb3eedab0142567b05bbba53741d435309553822e32fb51ae2fd4999c55d19418d6af16793b201e929f29aa351bc9d0f681db0b314d3dd34fd8327044cf050f5ce4f01638c33bb51348a8bd4bef0fb61c8c462cae3c4349529b85a90837b06946457781f493be54bbbe00867fa5ef0e2a1d5b8cace755dc40df94ebf07518c95b610c00b693f1251169f9acdb25b100a99ee3d43336bbb39f0b28df0372855825a1793b85ab1c4d9db25bd867579db62076a7ab4c11bcf8fa89092c4914413e2b6b85d969c386f7e7ffedb12a24fb55170d6cbafd60a2d0d6c0ff7bca4493a2f528f7836ac3784978b978e02c72120816cbfda8500bb365bd18d2748febc2ac0c4198e091933a6bd749c40c752b2bf5a618211e4dfa38df36f949be9fef1786f71c3099e51c14868c1599de0e358e444e5c9fc4fb157866cacb2e02023ada553e2387556e444ec22087bffefe7a831e97ff40416245bd20fff647e7c1b253446abd64bd35f42f461a06fd134de052ab0869cc3e8a704d3860e25d16e341c978025190784115003b02f91dc50351421229020b627c7f71d472f8373670ce861c8e49d42f9b8d0ac861cae5be29b49c7c8233c4563f5b711dbf9e9ff07140d056960cf68a49469216bde01ea3c7f0a9109c62c1c1dbea953ace3d5beced81f04ea302be305526e34da1a3901fe3efaef7fef9c84c59162553273e34d1ec782e2e3c93f6cac6174494927b02d88798f658305ea29fc0c668925307f248760dd11bea2764ffa500fc131ad03d76bad3c85cbbfb176118e2a71dd9025df89428233f3426d278f9c854f3c00a0aa285886b2a2636ee3a69512a1c41963c8a4db16ac2a2f806ddca59945c0c912f04ee9f28ecf979f1d4bcfd39b8142a59a5aa90efccbc05c8d5219a047587ce7443000147c7bd2be6d418cd1c18d8287af2b1aefa830bb6e2080573eb67b827a307c09410e5f9b396e586a91a6618f768186cf1d21216711a1f7ecc9359280582fa3841ca6e357bc9ad0d797dc759ffebc0e342c19f659f3ac2948d42745dd1dbc26ff1bf8af9ea46d4b5258b6525a8ca921d8a0d5381a90898509f41e0e1f174076d8a355fce68d70386968d68035acf3522afff55f1f54d4ab9e8d8c43ccf15723bf575183b5d42e289b2caf87c7dc052fa9bdfce3dedd07fd7514e48f4d188aae01bc7dbc9315018c5628c3b17796690ae34f5e5eef85be0b3c2ed969361945864e372d0fe4dc94e428f195c5cb68998446488c38b7db4155424fbd3a1e60024d034c0216517752b091fbb81d39df111c711e28f9ce6a4c5c35dc12aa4c895b52bf8f7f383f81c5821fcb7d3059465a43c254972aa9af398065787c1266e1bb47d166071e259857c920c58797904aff9ad8706943c01693827f895c0ae425ac8ce7643c009a079406539e59bb75695b7211f611cda83ce4a2d2a3250c5ab199a2700e80b8037c04ca169a56348f0e087a1d5a1320c88e97921d4a799f11122d28f9c9678d08422474e86e1f7b33c5810349110005b78836a0ade3dc2bddc3b170f32972f80f167d97577e27f80a0c4fbe23bf4ab4ebb64c8f02f39f3ae752d11aeaa315918e456ab1d24ed243886edefb3bb965e6eb95439dcb1e6564e42bf6974ecad1e20c7b8654e754d0d62559c95b0f93e3f41db1b65d44b8b1024acbbc769e053a5210155af1052486486759795e0de3476518780f6e3e56f4cb81ce7d2966f6a17a3faf52f6ca3284e2c4ea6964c50bf2c26264d910e68db3093f80d33027f3c9b2c1a6090695033f5dd489340fa382889462148e05fba17e43ca9f392b5f90f5a46c95d781041b28120cb253cf47fb8b43bde3a8bddc46b913b986295b8c62c7c786fb690685fec1a7e3f2332420bb4d68dc7ea3a906e1f5f192c21e712ccdb284a74317f79902be67e0c56c9eac66716c243229481a17a755dccfa2ecbf56386454097ed4bbdb510a89a86aaf697189d64b9a841b743c5fc8fe2b313ec280ebff03baf84e7cfd4be84517a7d6d650e92fb9345ea3a3d491b38d5153d7c4d22fbd4ce43e954accd199b9afce9581a921e0d38c13713784bfbdf0de855834be861775f19c79a3eeb4874dbd296be9dec692410e4cf49db16c30cf2f4020a0ca81a6358fbc4c26b7573977dc52da7d6649ac783765be44df19c47ec00ed1777aa4d201faf88d21db2c48de99d561cad42da7ff93e82edb823ae1963d6bdb5743523341efdbcd53beb61dd8622b8230acd50d2da05ed6b03f52009bf3c1be9eb92c429bbaf08d0ad69720fbb1cfcc7d54e254a8e93436616af1ba068fbafbdc40a5787608b13cd5b7120acf252c90df60d806f7db02de7d999c664c6db2038e7e305d4745b86d32d4e923b928dc8ff55528ac8102453f434fa4adf41a317623d65f59a5fe508eb0b46f2440395a1a4db656addadb65c980f1cce99 MD = 0f5176527280b8e3fa69a6c14ce1f759d6e9c67c Len = 22688 Msg = 04c873c05daf299923a2bfcee193aa104fe90717193083f1e20f799a897a5bccab28531869482a366b70689a24d6bd4758c29fe8dc43351d9e227413e5148857d93375ec45affe9b9cc1c68a3ae1b510ed399dc8b4591de4c62cc6c4d62b7dc896d020627a4e6d6fbe7f1fc7aa1e5912153648de28da05ef6417b8d6e62703c6eae79ea28f8c3e5ada91bc78fcf373f6d8a1ea53c02eb3e67fca92719d70e2f9de6135d50cd03b06f6dfe5c6b9cac9633e62c94e04beef6f202d9cbc826ee20a79242e237a842a181d51e1d9680a250250622df87df083354e281ee01d8acaa1c419d1b35f0fd43b54cffad8911b4d7b15876079b22d35de11a35f05f62a6465c52865ae46d90115a54176ebbd65097595baa9f82bdecf137186a85196b876ff863a343bb44a784e178f9e3c72502399d9e44f9d7169177b77b941ef849ac9160f35848333ca038fb2a1baf03b44618ee8eb9b920b38d6bf2a247205483a255366039eae4ac168807f5f12329da98dfccbb9d5fc81b1d38693b083bc6bfe525e958acae3829770c885b2ed2822e76d8d883445065c3ed879b843bb3b745017dea4b44f4a61b4e30fcd8095fa5166cae7294632d52346ab40a3c663abeb973d7c9967770c718089ff5db350d1b28e6bb2b5d6e6945e3115825c22c333583a8ddf7e8d88513a642a3e3f3167d5cec81a9735cba7699666dee7e93d23fc44a3ccaf5a0dcb4043c68d747be4222d2c7a9d3db00fbe7c514fce195401cb2d3739c59636cf8802140f7b4a17b2c802550ebd4e2e8973f61a53adbda55502efb7643f3a19bb07be35a8bc671d85a37bcfea426fb8210dff76da427ee220126a4e8c01430bb98f9d2ff718759444f9c12478f44a54bfd6beef4c5601154c41c58319d45a15b169c78866571985d713fbdb1e9b870d4b145c0c12b1f145c0d829de7380273d8bde63cb5c40fdf72539527d46fecee8ad100155921bf47b641ebde803cd518d2f349a7d419cc9f218b2ee9157e6c5efce12d353355cb2be205daa282f83810d85b393287c33257f97c8f69fb91b17299461fd8d633bd516dcdb172760695ec476a5775377cdb7a48bc19230d3656a9ee847a58c8582028b80e22d6bff4891bae8506d8799322a6bdae6eccb0f8c6757b30af4d601f7e326f4b8137e72e8c1f7c4fe9e4b4a2924dc6d7f29f8d457b55bdbf311f5416320ee20a5f2e823119784f3f53127f27c4dfe2cd4743f8b8ffcb24a4a2471ab8d61ecedf3f22f788bba685c7d4fa3f9f14fd9ff2cf3299afce665e65757d0a93f4d2641e83adddb1dd4abe6e02048c851cf75cfd1ce3d6a66197b9961d09ca23f8ca606cef379b3918a567b64cb9dc56378db82092e0363953dfc49b2b75cfe56c77422eb448c68ad866f0253792b59f1ef12021d3b04ed51fbf1e0903599244ca6967f88569d623a700162f35178ecc1df2235551cc77161fb61454472da7ee9d01603ec513408ffef11858d7c0ee79dee1405f8fad5558ee454601695a773f5eefb98615cdac4c6aca952682175b04bc4ef5950fcb403a05ed2194dc6886b37a74e252d9f15fd554fd0b1ce6933b1930abb18a34beee15f13e458332f06ce78a416919943701c757f8f8a057cd2513f68802c3a0e0b5992a891050ef5a805808c5bc6ed707087eee4edc55681daf71585477c5d6e91d203c8e2082743f776170826ab714d9fa78827f24b09a0d10ddf0a17f053930ab47819dd49c63f7a8a05c07e286d0384e40bf0a602660341fa639ef97066a4fd66ba438cb13311b9a9115b6b2528b9a7a73ee612d3b5cfb1266aeaf4e4dcc9f35291eff726b5e23c3c0582f58aeb989156eab23da63d2faaf9bb961034fe2c73dfc4c5259195da8ca9a7dc253ffec8c95bd7fc2f644749b3db2049554914f205751d6c1edb1c20305ac012022da970d71ccd6bf1f31b4554345fabcc096646317c628deaea8fddb0b517cb943a34b9440394a78a3d014c156c41657c5d3b4e805c5ccf92a83938952476b0e44fe6ca9776f359022941867feb8e1f6e2ddd32797ed3db1dfc615a650ea368f95508cc58dfb429629e221a19190e80a862921ba5488f5893cd4e6aabdb679cdc32e2e610a59dbeb186ed306b5f883134e2a3318a2357effc054991ecf28af493d0bc41463077c1f7c8ebf2fe23c6da1a97589bb278f448618b9af7b2bdd4172815de0482e809d93c4c618659ce8e226068f882a5ad2f0ac94789c384a30daea2eb8f584c351daf89fa9a1405c9a9b1103ccd0de92ccedd3d215e1eeb0cfc600a3919652d7f79eae5baddc5887bdf3031fd1d65085b996bc401602f6e606ad667e7c252ac2ee633597471c06c4bf747cc9231b18aa45a5966cfd81f95081fb8c1dcd34852aa2c32ec109f2e38a3bb9de8e3511af56ed7522b730e15e86ae3ad2102936ea55b138ea676af3775eaf1db8dd8c4c8d320d9fc1cd54a3af0ef7e5d8e404ced2faa63f08f8ee902aa8762a8c359d4e2ab2428ff40ded4b534ffb771107e44ec78fde3ffb04194b85fe4d6ad934ec79006e18c04a074f3af3c035791afa4c59406bd5c641075fa801d681592049fe6fc6bbfcdb34280f15091612764749b150c635397c6b71361836a7be6fe1f34794b6226b2b330eb14bfba83ec9366497c7d172559ceae0412e9d1851299ebf5c8a8737e05ad729ba5253fcf71c58d97440fa89d6d24fc2e55d9d7ee620c70cb1a39272f8c480e7aeba9a9af7da3f26db3e9a0229a6fa97b727b061f9bffb69cb92605a1102d0e6f30747f8ad7d59cb41334871ba757bed2b0f8e57e8819c652eb98963d58037961baad49c848029352aa17e3f25d86421a5878fc74f003a7d3f9b760692e73583ad37d90d098d2e031c1bb3e0e84a13d3db222d46a9a6561092baaed8e5825b2e1c10cda0c8fef8a379f481fd7e453b822061ff4c64fe5fddac89ac5159fc08f3ecc81b2e3f4fe994e8ee50fb54441b9b19c97e4f1d72e82301aae6e64cbedf8393e059dbd91aa165dd4ba95106d164bd2bbb12d54fae6f8f2670f72e5a453f3ba5dbf25022c98084cbaf039502878736dad95565680b66708f8e459fff19b8ba973d8d11b8e73770388af83dd3b103b6ab86ce75e3045d8591556a9197c6cc5eec677296e7fe16c69861efc206e85aab1255e69d6d33c52cf058dec9d0b6fab719ec5b664c78aed68fc662b7f8b7fc82b3c9263253142de5112b0a9f2674b441b45eaff662d1805e731ae986358a89ebe44315db3120083c882e7698058a998d2020d8dda7a30b9cf6e1fcc359fa533538762dfe83e1d491a9e5cb3afa631b07f1c56e629767c1306fbe14e5b262190d34b4e722c7c423830ae340fe7188a930bdcee94bce9a41a75201ba63fb6c2bb24d91c9de7961759f2fa9a0590775d495c8afd1ffa9b50d60425f65d471630be3079f5e9815243b348c9b41e128b51db5c6eaa0d4a5427509c5199fadd1014a1dd7201dd62796f4e1b65aae1d51c0f50f1cf1ee816dbd18f23ed2c05686a166a150e6701f2d342335114a5d742f23eb005f78137c5f9f79b8341d90750eddd23bf9350dd9a276569d41fcd86bfd487047f2cfa83bf76417da295c687fc6112d3c34ae3fac03f7ff88ace4978b58c925347b7b1536b1a563c6a311b0dd68e5c83097b49dfcee139e95d6842358de006a545e0cf2f33acdfe0c15c0121453b643a786ea9142ad63b433437df43ad998c0261ee7c9f7ef683729160a04cb132d200fa6a2c223ee52c0ef681492c7f7fcb73832bdf2cb5beebf9c1831f1582394ddd76b9fa9070d8b5538d8fa77869596cff93dd215d3ecdbe7d390ea60521197ddad5a13ae62a767d19e0a922add5f116af794d69bb82eba507e1495fa2f49a0bfefd6b15add3862d68d716e2552a0d728a1dc3e0cde9df489da17b707764839f52d75eb26cd2d16c485a200ef7d07627986786ae1bdc734e4a61ed0109da9ee0dc4bc43aab911fe3c2510dce1c2ff4dee140e0fa MD = eef7dfc20c57895d31ad15aaab13cf710aa0d739 Len = 23480 Msg = 13c123ac379146d066767ac02ba4bcda80fbf8a4e4cec5b0ade84fc3a0d19435bf4dd49b622642a4892b004171794a0965f9f2dbd72a0cc5af21ea24e3ce4b0d4880cfeca8abae6b14eaaa967b40423c7ca3299879bbf630ede71dfeff811ece5763fce730a9f1edaeb9600672810b3c6d008623f108ecbb0e42d0971b72763f93fc43d423a873f200a20ada7ec50dd1df18f1c36899542cbb3aeb39602abc2aa5558dfaa82e9c42b2ac905bc692b0c27af453c106f7974c9bd8562af63056553476c0a2e8c5d4a46bdfdace73735cd9e79b9265f2a91ee35723fab2040cae88e965c6140af483e2d344d17eaced79dcce1598f7553750b99624bd1bb2472a8d6c2c8598374411c293e25bb29a8a6f94d66b4bbf562a949501e188ab2a68342b64d3e776973be60d53c261b165d1a6c9a8a495051e0954413f6444ac91f733297960d3f551636a8abaeaccc4344a8743ecc85d10d45cf783f9b5d764127c8f5054dd305e8e440603716482332f7e78c949e08b29a1ace524d7da2b1cd280af689d51e8f97564203e20386d4680f4e22567f30698ad7f85ec80dd261bfc8bfd39fbc5e20e2f4d22056e6c74454c342e1def09b8a51f6041a29dc5b2abb623e08a174006e5e387721e030a7e77bec7c27a892a889820d48010d59bb61228d2c02499ca3cc6ba987a5188197525fb340803dc5f5eb8d765abfcd16619997c1f06d0286b6cf8dc0aa068a5a240972e03668291af224e6d9a282f392ec588d79218546c2c7ec470654e2901acc7157dbd46bd4f23bca209fb6071b4fca12763b45f780f145a729e2feb5e453ff2e710e90f7ebfc215fcd411bb89ead795bd480c4306b62ce94a90f2dfcd1863a954100f298b899413a4f663a24184c78994ae232dc40b7b11936b35913f2321d4a5a5b8fcac54a19fe1967a7b5f2ad465f2bc7f837cb609bb975a816b7b0e805b23f66bf0abc8f2a2fddcdcafac830711209aaaaef45fded09c835dd44b808926132cb06d4f8e8e023ef113a7f038677666712c17f5ad0336eb0e51347521431dc06e0fdb5f4e7da9edfda7caf3f0fc7a0b698b2546487fd7cc24e5f4c29ab62971e511a2a4afc87d51271e7f7c54cf0659a9513fb1d95a9986eda27afa93ea306db93d2ae65a7668b4980230550ce703965a05cffc089c6663900f2fe5b3e81bfd111bdbecf78f515c78da4444bf4d570ba3303cf07c4e25a935b57b4aa3b7d36915341e802d1c1f92ee2f23121507ec00ad59ee55de78bea1061ac7f30b5f3ff9ef0f5968a423bc9e22883587b81fa8bd9f084df3d520189328c879a691e946f5c435f66d05af0fc83d6de16a4d9c7589a2c6c1910a501dc7c647fb2ce05cd2a4bf2c5b57f8c50058676692857f873aaede19b2f9240fb484061db34d9ec0ca4f057ef2ee246f7795c7fcad9ef3e7df727a8c88f1cc66c51410d40bd0741d153ec1b221fa32b45cc986b69b7e54c44b1e9fa4ab42aa5b39bd0df4697f097c9db919515242c99d973acb1dc4ed482768f974eb83b465f9f6c82503372006e4490835e2ec8f92301130bfb790b277171d4d22e8790ea645e57d7f8bdc7c125e01723eed57a93577b0f58a0f68978b9c5260d023f31a1449ee234413c05bd6f1ad405cfbfa58597a5dd053aab26229beef7ca7255a9e580cfa039b244b85f9a536bbb6933f64a64001084212d7dcfb86dde7cf7517631996ef66ad45e5c124828228753d8d94c6d182e681ce40cda9fb02e96f9b903100f0b792a2fef6d8ff917ad2c0814db15e35cab2356654fddb2547ccaf202fcfb52138d0a1d7e69331d90600c0e8e5831974bfb489627a33380d94d6b88b5b07df315c67d2591db863620ff99df9bed29c974b33a34b1c3968bad251b2647b9f262909a15e0b040f3c357b067e3d406692a65579aba9a1d51434e783c534f960341029c46d7501626559346f8b3ad307a1a7c4ccca0271d0e484bdb517813c12aeeea31926207d7785d6207cee7ae07c71a4827527e0f4f17fb13b2ed3d6ac7d3fcb5fe8b293e11745b52975cc85cd8eaba476bbecca92028ec348381fb8b1688db045793956930a4dfd36a150e10405f7b088e83e49b3c9b8c3ce1923b1b39d40a43d13e2f2fd1844b62e499f18eba9fccfa04347e4bf10a6b8b41a09481ae201b02fffd5ee8509d3e9fbb5e4b2ec416309a6132f231e9dffaae283f6064e0078db03863bd295a4a19d842d45356e97d36682a11e8e38386ca23f9c1471b7bf4c2da1ee3c2794b257dab1f9ea2bd971f5ef1d353bae75ab95a6b5ac8b13bee625aef17fff74eafb9ca86a60fc1b949871ab5d16ae0a3ebd21c12bfd8374c93fad67dc83ad41fe47191097aba38e09d4eea32b8ea02af935b9f88ad5231a4290895f48406d173a5e75192023060b9fec14dd70e3399710dc0455b87d938f8fa2649e1fff687c050859cced0d4e1abeaa8d63125ea0d8e97aabdf9e3dfc5b1a3de42d4708c5fbc70c6d2fe7b4a243ced4fe3dfb47fe75eed7559e245c86044928b113aaa3ad19e933584df45f2b0f3733127111e67af785baab9b33245814862d74582e184860d145c32bfd551105628f6f093e823de518ec54ddb1db9b133812d505bdaebd57e80a55d3ebdf7baeb5b0bd0c68656ec70e36f96c88ca7687c6a07b213eaf35869649b74ca4459190995da58379d53626cf5e42519e3912fa9a9f0fb49861d77644cc909e12cf7d357760ce75581bbd88c32cd693dd7096f31bd738c7b50dccae585989d21cc56425b57fe2eaed7f2a78526a5e3a2bb62bfbb1109f607cfa3bb63cb94aeea96e71e6bd8386eb2048a57be4de814f7255f999c411ec8ad5724d1756b47afda313c902f533647ed9c0581be151e8d999932755bca3c64aa8bb2a581011c104f1fc9701c75924ae002d69dfb18c3be088b9deb7028ed5aadd1ef901d19ac90d7b7101699abb6e807dd8004fbc54216d270e4548fc9ac2b15de3e39b0015371f29ba2fc4d523e8fe380946f46a7442865edc858f138e35670e520fad074bb643e31e4a99e2573d2f1a08625524b247361569c514af34d5d5d9b3a5bf4d04ec8091e67a71281f131b091c7dfb50d8d88234ff2e6039524b02a64dcf593a0781de1b5be6d30f4513cbee8ebf6c58ac9c74a3e4e8fa17b13ef75e69b304361e1e6569c2b747ff8fe446b2a64f32a2f73c134a601a6ab31957bae74f7947a90f6b1e6366145560c72e943bac56d598805f6711bdec3974523e552b474aabfba30f10f28e26869ab39bbe73e8fbdba011ae79e14187eec1239acf11994eb794a2b343fc811561151cd1cb41a267ce2470d150a036131104551431808cacf3ddd4fec06a88086f3ac978c38c21c1358b666ff438e2b72ba4b0538262698de73c01998e25eb27366f8439af3eae32993dbb306e8f8e9cc309fc00ca9e78181c1af02bb514f29b401d13bc963e91e281a237bec58f81ea619b01c2121c017619e06a5d3e1ee58c15ad3fa8807412f87522a2be011f05c88dc2874261c44cce66f437d7302d0b213b85d0a575c8799dfd25c3db2b26605ed0e65527bf7ea1498cc01f409328ad833c0f8e5d7e220df8a21363bb4a8edbd5b16f341a3432470f12aaea4070f613daa0b24175a26a1732eb544a06663ebe55b9c5ecc3c9c88747801c5f81ce81854dedd5b098ea88df7261504065881e51056e5045c98528a9195f7d47a8b5b04b04ade2a46c5c64ade18a6f0d7fb616dc0e5a7807d5713af5ae35356a602d6bac286740e59903e7c9a7f11a78fefa0ea69805a6f98e93e7b22e8dac904f3f9af1e1a4573bc8e4f77aeb1bb74b875ceef8caf640e49df5152ac1ec49811df2266356eb8f6ea1097d0ad592b04cc5e39e1accb5b090a99fada38ddc7604734ff547b0c45045cb7962bf8edd6b445d970654c7ca5cc55b979866bde49be3f95cf0e816b70289ef3c8ce23e8452fafa800feee3beae4b5be7bcbb778d1ee45623ff8db14d0d02b45be5ba0c0fcb3842a79f2f47170ce9509703e9e35d68d032ac0b7da90dd978c3dd5491210740c4dd139f601c60e069e2ad543a2bdee16e37fdfa012580ceb3c3cac0ada5f4186774ccf8c9891e9191ba3396f47498f1880b20b6614d2c557a5d2a1357bf5cbb MD = 93239fa543e8bd68b59a4bd55a7be068f18c5ea1 Len = 24272 Msg = 595f40b057ef2d4f8774a22899acf28da129fa406d530c9416b02cced6637fd119f300fbd74e754a200ea2c3f9fabc1466d02078c84245db693eef3f5672a65e6d106790b6ce99f0f73242ba820c7bf85244225e56d5ce720d1a08f05349b86c7b3ddd399d78818a3168edd7dde919828c0c66bbc0168fa129ccdda976ee9b446b02cabc3452165ff93808e0b2997cfa3db05656ad0d71afe6ddd834676b392e66e796e222673eb9752bfc9ea8258ea88cb858f9c6c15ae66bd46058cdc878719475a97310bce2decdc831d9689435d3a2add66ab33a338ce139dcdc500b42571c336c37a55beb172a970f599aee5bc5a61737721b80e5ea6f95b689993e7e2626a945f68a4b3facb421ffe5e53ce7c4c17ce3d9a79c57483e6e552750681427dc609d776694c8e592ed6747f185c1191b664267fe9570ee754f217e1d92eba264dfdd83e23f6c0aed84b04567d1d10cdb5cbce4c8731a233dbd8255a6c3eddfe6ae6be2a6521562ec6c43a8ef28ffe42ae7b917af3e3c30be42e075960301258b56b15c59d8aa36b82f8637309333eb2f8ea1c959ffbd5d1f65a3a7935a0fbe7a5e15b8a3d613ce7854e3bcd319556713d9dcc26ebe87f289af33b145d100f0dc4e01c02e5638725564c1fd7fc34da1fd50d2ca9781813723a6f95b566fba04d9afdc3a9f5f016a77e688c4dd9803e1167ceba97c52937416d45b6f6b3d264298080eefa1fa56fd05629fd795a05f6f85e49026c438a5f089c1c2b32f412cf142e1ffa7da2e1f75276170fe4ee34a927310270b173c9ff4a5f397f14785b55afec2172af2034418076a6203b06aaa9308891a1e1f6469c891f440ef5e11a7c6f534be3f9281ad2fca05ddad653c69ba6bd6cf2881baecb4764c27761aebec7b4fbe5cb062b142019bba49c312616d4fc57fb0f0e8460e007c81b24d231d6ac233e95943099aecd8a0120f0e62e2a09a3d0d2340fa0fb8f3ca1d4b3e22af0be2c93c1dc1304491fa01949556fac6e8e3fc0792de5f1dd3d689a8590fbfa7b5253a3f10f17eb81ab0e7c9446285152f712af56493c07845f1e0a84489a10f52d1ae7a9a9d9cfd70427a3784fca9d75c8dee5f0127c529f88cf8a7737471eec92f4c76248b311b79f8e168beea0e15577f70ced1621537d2eff92c5098d64d02873dba1484e61b1f1a45e458f55dd7088fd9ca3c0c59aabd620ac042bc7933e521a9ced450630449efcd31bce53e23570551d9aaec388aa02c53eab1aa01a85a44b73bcab74fdedfc0a2d9508258032c28ff8583cb5be06296fd32052817b549398f88608152b2c8d5eb647e94547e6f410c552f7169b3ede83020a7ff63609a495a3dfd751587ee76d158ade2d99c08989fd116a60b0c286a133dfdf78cb335b940e3085d406538eb7c3f44359066df75e182a032e9f2fb63cf1070d73bb602d46801ebff7b548e7b13a0ad5521e3dc20faef36dcaa6d4e1d8b2169691770eae1fb1f0d236c5dd870be044f0a331ce8e011a13e6df78509de70f94e73c9e9d32720c5d693be87fe10a7f2921c6e17e9ff4e1e22ae774315efa61f88bef829a7ef007cae1617dbe9a4f3f2de527cdec9c3daf04864d3ae5898541b80124d394c81c2cbfd73205f7f73cd8c9b7502796e75dd9e1a5ab2cfbb20a3769d367020ac25903b2b73801da9c75b49314dabeec25c7eb1fe57bdac26d1bab746f408e6ad238f53a0dedf1d50e6c5b009a21c47abc2e6b05e229c4f82f1c266e512bd9439c2e99bc57ce7665a19344a893c008c13ed3d23a184f6c0b5c9e20ce1593930374cc69b00143effb1a8d09d1ae3fdc3e126aa932f457305a9a14330a29121c58e074ddcba708cf33bdbc033255ebbf6fdb55587702dbc2844c10c5a90822058283ca7e55c567a47e2fa2d941076e32c4ee26787cc0379317070661213f3dcf3ec32fb3e4c8faf058c4c3e4644f31d6ebef5081bab91512614f779e193aefd9dc2337270f4e3d435231a1cd32a9d10c334355fcc759ded11189e6c4e78792c5f92853402bb1991dd8eaceec3293b653399ec952192f0f5f963ad67e22a1d11404471687c08fb8d07b54add9ca897c4c6d360d1a36a5210e7df6c942311625348c13f3767454f71ba803c11e81177d385cbd93cd8658be6e27323199b950f9a7fef37c849d9dee4ffd7c9b12ecba43d7769a1fe4aec6220f207191ed21fee90eeb7a144ad2c708fdda23be5f73ee6a8a496ff3e8165a0661f8497cc4f15c5db9c01c4d218a6cd1a5cc9d8d7cad204bd15383a24043a0d5f72d0e54a9ae15d2391b6e99b14afbc2c8434e9ac2fefc823d1389bda5bd171b4f2d44bc13be97e11d6bc58c628af066d5eccb58faefdf882e07f6a850e94940da8781159ba97ef4c72fd597cdd0e7387f17786a6d0645d844bf4ef50a5e93e109aa57e39a0527a7d6d6034e5b934cb1f451ea2191c8cbfcf197e7161a93a3668d241db8a7581e54cd0cc30284689d6e063aa52111bdee60b52073ae0a2ee45bb58357073bf8ef960a22b966e0c765c6f5201deb653c099e1ff7690f6166d33b2326a851d08e07e62eb64aede926124771a0d8e2f4e9ba2f827b3bccb8f1fc8f46ac762b0d7df3cf9b35fc0a160b3f79ec4b4aaa594d8c7fad2a50586946ccb2a08334f53b5f3fbce030414defed59d8c57e0793fabddd18c0836b54faebc06fb1298932e29848289e23bf2bef52ddeeadb7844261d148758d24d135063773f1092dd776abbfa9ad159eca169cb2582605964538172e3b30637d266ae3e053f108fea432ff3bd0b4e6fff6a060b245095d78cee7930b41b3e40aef794c4cecea412a73fa45a359da92c5c95bd3a91113260d85d36e1ee88a7f4c70e287f3bb37422fcb2f277cb178a98eb6ab8e2d68ddef930e7df0cf9c3e95b06f292f6b2b827c7d1e640d2e54398bc95301c8a5a8c42ac7cd69c3a3d91ad7d53edfbb19ca365090e21b7f4ede77c9f403114bb85d60680a47097f222bd9b6397458b39623dd8f19bac7f6449ccde49d5b3c5fcbf32d17e90fef5bc100d5a14b84369156a4e268660cfbfaa63ba64c33dff5ad5706a4bac28c7e1206f4b9398a02fbecd1e9ef7d145d1a04fa179b9145e5df9ce00441d14551581a7a73dedf83551b1eae5f4f4d833fc49da6dd083442214cb70d889efbefd2efdd820ac113b61f06bf3261ac4a51096e2d32e886b5c706ef7425e0168b0095b7e3c425fa6690b5613704bd61040c6e895c34b6918632fb1a5cdfb7331f462e42c597620558b1bc9d2e9bbf180af3b3a88312e3b33614926ff9717a8f292ee112eba22b5c6a77892d0e7de33bbfc59d4e3a53ec6635fa5152a2a1b695290972aade4b0e7a0c80cf934f11c636a2f06fdcfa7e3d251632bc6510e6d7cf9f84476d061867e8bf3be452790dd4b344e2cfe74c08526a478c3809ac977a990d2dd3ec0b70e42313276c0d04b89b1c263b21ff9778c8b05a3558d2de5a0babf2449caa471aefb378c1cb058aa885ebb7580a8865561c91ceec93333ea4f752df87262a514d070480a995ee635421ac88d7ee145e16aa8906007bbd45eeea483553f4eeb2adb6a0ab2d312a37520ac91b294125ca310f00a01f86d37cbe40d684498d59d3b37b1258eb314b6f188debdecaa82f323bb6831da829085b8997985cb6541e3cd4b0d42a621ab4831e376f543a87a33ead4d9aef28e6ee5ae75af82f58ed8e66a81460900062081be9a3de0c07642437fc10b2852054d8034e07906c7fce3ce99402321a648bb881f13fb276afc224c6aecc64800cd767ed2429db94b95a9c3e3f16d33a0d1c486dcb878714a23627634bbd2b606d031061003e444884274eccefaece6f48783a27ef07b6766d149e86498f6196cf4c540778b164f86ec8a71e4c468e3ac5440058c22ceb1c8ef20cb82eafb1938237c558e42fb814e79347badb7a9d1d01f42d68eb837f678662f461619aa5f74449c6ddd915a83e7d3ba32b03b765966d0d23e0d197fde7c1cbe82a98dc993273f6eafeddefdfc59e064bd75b99923784e386590ad6e13defb15a7c2ad205d5afc3a444592aa95ad8a7a448497d8d60d83bc729fdccb3aa6ea7cdceae37963146248546e162af6eab743f1663ffc1a2e56a68ec20e60fedad03a49a8979a505d5bdf06eed145c6185108eaa217cd99e2af3de082abf30484979817842f4cca3dcf48824f2ac2ae403f1157c08912f83176ca91661b4df7ab26de6e06145779bda4ccf1188b6b556869a66148fc95e2239395c8f7c6367d58655475b7 MD = 2393e09e218261acb91ff9fb4783253e9b44b9f6 Len = 25064 Msg = 215c37320fbdd5520037bce5b02b12871b345bbd84169d87bcf1c134a1bb3d7ae5ecf0c6117b4dd1c90abc74515e3dbd50114f42d48b10b5972ea5b981d1dcf46d70106630214ef9d74ab559311223058e150ea7c55cafa17c8c66e8a35d5a15424e60b975981ef1b460703b58300a885ba85f936071c270f373cb681148fd04ebf0a568e7c605e2e8b2b2c3cfa13b6e42320baeacb2914d844b9ee2d3780eeaf0bcaa1a8e944df4f9aa46999d4bfedec81bdba1b108635eb87ca5fdefd7d4eeda1c367873ea3c4e71aff364ca189b0077cc9414775982cb166ea9626f4c99393077102a9db11c19d82880cc5fef59fdd6ab01ae078f34bd278a71b85abea3f27a3501d714cf337cb47fb67b63b781fd6d21e9186890c25c7136c7a8b9173c4241bdd127e12ecaa08f1b5d16de5a5b27c59713faa24674cf7edb71da933eaa510b7948c40bb428adf0643d48d9bf2fa4657348fabe97913fd6e238f5f01b354663d02d539a4b97ca60c21db65ace459cd51e50c3c36d63d3ffb1e4a2d996274ace2a4a7f97da5d1f669dc60b6c6fe4369e01f3fbb9af30b483b23d885497c684d6ef65ed0949c3d58a5d01ed148a569a4783f94ba8454109ea4c0a506c065c1d02884748f8801114546a94055c07e1f1580b295a9916defbbae615a126cb2f3cda5bb8366d668f034d2d47fa4bcece635a034cd1930c4eb27dea24248cce870ae7d1805f6ee585cbfc0ce474e9c86517d4d22a579f0edb55babf0080a5f8aeafb053666d06e43a93e970311d3fdbed364ee08b95c405cb0cfacd715e792feb52be4733053a4cf7849dc2f89a54f0b0e7509537320ad76701c47c3f66115c851b9716afd1140304c69f68ff9631f0f4536359f5d7796df759a034313f7468c533c529a2799bf2a98077cc0fb7dcc102a10e948f2c1aafc33f165d1092aa39f3c2d0e7d4a5d7012edbae54efa55f4d22fadaaecbd8f48512d9af5fa406bcb957ef3eb70dfcd119dafecb6a6909c27a9b864e0f72840fd82e4ff2a2b544b1ce38e3990314269020f6115675438b0b32b76cf21f4cd7748e5dca688f0bf39162e0c66832b2cc1c00ca3ed8dd46d2445cbcd54e47207a2a91e872978c6dbc655c95bf34acaf967e9f9eabd8093a8774e0f3e8ebedb81439c7176e0902a54734a4a0f684d8d32bbde7ba80de63e751a4a6a4ce507bda4eaa1a31e7465a793b06224994e020e534e1be65e6725214d9db9517ae05574fd084718004d4fab241e3bed7c1d0ebaf58f30ee9051d3e8bc7219793b193ebde41cfb34aee3d4c1800d46094a4dda2f740fabe8c04668f12c27e9362ff819d514a94cad8cc09b67221e0f0c6668eab8693feb6970bd6ae7272fb72cabf57d76f92da9d72c7bea28a4b1056b62e6c6f24fa08de5244f30173809f1a141a9e00ffc2a9145f07e67726276b7aac25fe56981d1e1e04d548f1dc9473748737dd7fca810917e9b3089d0f5cf944ef73ccc9aca34b5ef6e65ae777557d686d3f9cbe9878038e56f3ad7c0d93c29dc93f5e2e2635948671a0b3490a6cc7df0c596324304e9e61eff15c7ce774cf6b80b13deecf7a037ebb2ada805e8059bfaeaebb195cace379fcd29d0567a627985df3f0726f1b9f2e1cad57f53b3a39f299652b05e23ad8bcc5c1f87f53d2d20aa82aff21cebf707ede51b30f6842715e15a73c518b9f871391e4f652749fd9aba981f362b30f7f57483d7535af3f09ed6c9c74631f84f866aa631ee692b64361a81e529fe8b2d39fa19a25d1d6da0786e46b5ea46690329e5667f9a375be1816ec29a73f33517440328f4b4aa6ba7510c73d7f7c286c3da1de180df2e46060b1becb77aa5d946b2043457008e7875a755b3961542cbf21598a9de539a844241a662b4c472e22bf291be41b7361ebbf9ce9888b923b32e6ada11f06e189116c392c73ad806da478410493d5f3db8cab6db85185a01d6d95846dc5fa534f703ef657c823bce4c19f52447a25f01f1226d012bdd8e49a1736c834b848f6c208a4393154356459223b4324c293d2f32639ad3df40bc879d8cf603f1f7831aa82a5ea003f6bde956f54fcec93a7012070eaec821da6b2845a6a34d623126ece8549f10db14d93604ff365e414eae56e9743752960310c81420e2c40ec9f14f7ba9936a0d164eb816a1e66546ee3e6a4444c307ae6353d393bc430c7a1a78bedc89ca101c7374fc269e0e783c81b6d8c1e0c06bdd73aad74eb9328b16ab03a78595b1b77bc4e25e9f43ed0ba4b18e0ecce8bdd395bc6c4fafa83fc4770448b6012dc8a4bd832d6bfb24209411f64a98dfbd19f379863ea92119c94d1dbeae56c9d29d8c6426acb0c4cf37a606b872e374ee732ffb9988706d8e7d897d32bb066a24aeb2d237e6b9869590c5f5707d9b16ed480d9e4ed031cf66bb1e07f8d5514c845adcba2f71d2ab27da5850d6e11c505a06f0d42ebc69d143005f6079a3a3eb82404e7e85c4b8ccf662e1bb2433d39b854e9e2fa193850d93fbe1f94dac8ae1aefdac81c355c84671c9069710fc7d631f6d5a13400c2ffee9fc2a44ed4672b95ac16b7670bb8db22a8b1b77059166418911a931a26ca70fa58fbcd5c10807cd165a0fcf164c759aa117b4dd7a992ab142aa2fdd115ba6ca6734fe1e616796a772160dfe1cbf0c5a45fd572cf87a372cecb542a8455f8bb9af7a82a166fbcbd2fe93ea85fc59ee8bb9ba670807cb183ee7b1861596cee257decedee12a2af3da0c4229e95dc368b95ccd88d110f24a41b43d6e978e40272f75b06760237bcb173baf40aa9972174dafa5212aac9649efd29760b0a459e69b24bda0a0fb64ae34fd39c34c37ec76c332dfc477531d9393d38e10f371529d453c453f161a8c099dd1802640c1a903a486ebe7397cfec3c8375fd3d26de0b7985ce58751f95889cc5900ee2abf2e5a8c0c480df3b2b037176eab3dc0027ab20ee72d2dc710309b4ae43a9f5c98f2c7c43382ad487ce889ebf9eec36ec79739336b7a76f807caba8403ab9e78e77cf7f7bd1a498a33fe18c06998e91135bca9906a6c0767487d642247c27fe213434790d97d673b8067803f2e482369d5518f90645053975adf2480211dc83ab4ec532a492a9afeeacb3cb2b86b16db1efc67cdd9e5effa97467838102bfbd534be871e6cb03936cb8fcab5a87027e77b23aea33b9b4123b679ebb4a56b7f642b507007b49ce665bb2ba6c27f05cb01825dd0bb29cedb8510bfdb80515ae749f1389a50c14f071e22254d639c8a94cbcd117a60051f33a14eaed4159488b8193eed629413553fc2a9134b13917d09a8a3c5185c5e0ace0ab8bd720eef6366346cd5653c1b3dd4e5b87c1c5cee5b9e2abf0f16eaa4f02f13e76211b6d279662df3871ed359678b19c8a63daa13b4c6c4775612a56a8dcb7f73435fb7ee395c887b78fbd44e70b6b152482b75920717f8551078173f32178fc4c7987c8331adb65d3188d97ad7dc5efdc86259f9d10658d0e4d3aa636bb7d75465789f41e0ee5a2137423d5f0b807523ad8ec1bb9116488339a1f997b910e8bab36c7a9ad572c65000b47a7b8a37965c7ded4747c5cc59e4955f6f4c98b7265017d0b90e7def9d72045c3b50e2663510a01a553eed9d0f6d7e8885e2991f32dd3961b51d48b931ffe8b5ea6f9290c3d8ca9265f1871ccb965ba9d80a18bd708a6e8bf937c4744671f43df238294bd52d33f2041010a030e7c33fd023c61672004dbc1fee8f852d40dd70fd3b04fbeb869295ba0b18dbb1ea3bb6f8bfffceb9d74d7e83b1f8706904fadb65f8b435796d6d19f2531e33d1062babcc3f442aba77f44fbf229dda8c36d2f9c6e1b56d014a09db47888f2d10d4198ac54221cee64ab8ac3ca0fe08094efc388a96971705c51f76140bea4be3dc9bd07e39172feff8311086cd87ad52c5ed343b77c7d809370466f25dce04ec78192951b4a2d219e8c4291808c92f1b342c696425c6048e486f2a7d1e98dc7d4f17d1ea15433a06a508328ad34101a50210446ef120410751a63cee9ed95728ba2e76920b76ec38a563d939bd6db992b85f51e68a54f206eb400af18f1df97151b393f3e7cc5d12626d99bf37dddb66df501e5551d2bbff8dd331104fb537e99e4d968a3aa1f146849bd085d2efdb83efa90625d837f373b1b64bb5516d96e408631acf84966d2764653a280f323e9c51b0a5e29de33ce5ef9f976b44759b13288a7d3e562815478a5023105d3378f2be0d7a161362ecd89fc5b0ac998bb8d9672a5a411fb58e297ef317c93d722f397d15ff3ac935a7ce6aef23f3b10e74b94cd92e8251fd3c3faab4a4cd305ca5d32770a1cb2fe9e229a9626ddb2b7c6325620d667c8d3da41cb61b4696d671814245941e31c7ee208d03c60abd8963e8c01f3d9e9a32155a22f99d79b0805 MD = 7d90c7a14fc71e228a4f4fd191d3b7ea98c6509e Len = 25856 Msg = f9ee55f87ae8343e45f01fb285953c752c15a1d8927314145ecb143caae31e6f62022952ed0573bd10af7fb50f415e9b154a2fa2d5c1e2877251417c9cf43065fdc33346d30d32fcdea6792c7c81037a1381f8fbaf8d74ecece38aa417ae89c790da7dbd7227f962767c14ff157fb27aed6205c966ff53ac9528f99c6138b0fee4ee0f9d147c5157a2da59172260f3036d945df64341063035c9954cc2bb2d73c1a8efd0ff33c14328684e5aeb4f4e7d59c008688e7815df946d669c845f898deeb0273c7b75d28fd1cdfdb1b7724c507a8d0f098fcf092079bd7575ee4b4bb335adbfcbd26a0aa165b26e04d0f174e498a479bf8e6c685dae60c9bd47a8fb4f5c48bd644a39f4e2acbea83c7cf54fa17bac4e74d277bdfdf9ff6a5ed89d21c82c282bee2d0b15ba6e9ab33f04a663f0ea4e960fa4198d682342613ee95346866df51053c107f79272ed97f7b02b3b37ae325a784c796205f4d0b547c1f2f1f1e759757a4f5621d081605c4bc7ad5cdf8fffa29712c1c33e33526e5faaa1ab7161fa614b1e1f1bde639b0b2293535051555e74543d16397aaa6f9570ea88fb6ea580dcae788b6e22e045ac665a469ef4c8f6da9717a24b221fd03161cad069507994ef8ba3c2a106bf0645fe65adce2fb070db48e68d819c5b1d4a1a92a17d7fa6dea0cae8eb3cf0ca88e0d2fcb1686cd4737f4ff3ff635126fde9838a22c063f405f9538f2ec74ac77084ca667af512fda8cf94861f7aa947181484fa7cb9642ab2020ee0b4cb7b7f693aceed2ffd89f3b6d2ffe7154d0d8817d60529d6f1eb128cc2e423a5d0ebba1909c6d7f806387e4791795d0a64e3afa234ee6059ee5e723c41bb9f295c024028f99a6dfe9a89660012e83126489485603827e72d3a271369877d9d66f928d83f1232f76940e3728b5f36ac908089d2fae99806795dacbdbc9d1065872ec54c065d76bd6181ae6c908049137194295e174f2a0565dd5737dc8a5e3fb283416224e14f060de3531ab67b0bb1f00ddbf06073c32b1b448f4b73564d73108104e342a6a31c95f03844a65a62cd367209527d5c4cc1c019bbbf260ac748c8af769607b55c452230c6b4082538ae6a4b1a4a1512ae0f7fe5455c9facb307029600451c1560cadc2a653183e2749db52176a1d09ecf5d7e2f94ea8647f8f9e8bc08b628ce99f3ea667e82bf9bfee23f7a851f580799f3e57f103182e080639fabf8b2d4e9ed07746c77706557bec52fe1ae8b5255f318dd5d21f83c81329052eb3601c86d4650a4c5bac31d1f9c8eaddb5cae6991c4168e522f095c31f6c727022c6bab628b14a0f8ad438efa8084e3f2f45143c2f6331fe5a22a89f9b44f467a40b825d1a49c908dbab761f052f0f7addf3a88f070b8b89fe2246bdf5471d8dbdcafe0c178309d0c48e93d09fa1a11948532e1231aed830757bfabeebf7505ab671a813af117effebe9fcb4e604a5a304e00f664dc19a5a56ac2f12bdba3f47449bfb344f69badeb86a2b3c66cc8f908a36e6eba9e85490181f7e4a09142cebde9661ce87002ff5907ba9c7907db17a5ea42f12e487a95a406242d54ca9cba0fb1d9642d45950ed2a9ae2e7017cddc8d8d4529c7c23eb1155f12744f6cf7e1f108df341c5e9c02ddd44812b285e46f4af23fbb8df419c6dcf689609a609c6beb563f34bba35f0303f04ef0473a69f96483f85288c755fc823151993c8fd37f8504c20b14fc2537ca65896f381da3a161a63794c121397a8e7a31c83de0e445487830612f5238c9bd9cc1388c15dc90cbc5c6293fec0c698838f295a63a16e6bb1b51e0128bdedf61fbbef34b0c5aed29476bba0a0e17f0f8d25ca77e87b28a6755ec2ec79160a240eb47477ee967e10494efef2b71a23867b237a7cdae0058d28fcbf3564a0639e1d526dc2c944994e314196fa9fbf4695d3f4b3c9b974879862fb4d8c5a017cccc1f215b5df4482d4e2fb3e38c9657aa60e1600ff12ad2150b9f70841e7add858a33016c19f3aed5cd4d83f2dd291123fa003dc7d64fe553e745c7a169bf9e8aa2778db66978c1b3e9d65345a39b6bfdb204ab0d53eecb5ba48b80d4ac59a3039c558fe2546ccbf02932e983e6d6ad60105672896fefca56c9d865c7f12f34190134cd97e3b512b316c90d55aec11f739d5c5ae2323a2b6cdf933c223f2998f3577b117e1d3cdf25360389630444095fe07f2bc1a4b736c46d26ce8c9f2f19bb2994213f0ae9796d14492454ef47b24b6227accdce4f3287fbf8e3ae1729fd96fce6c581b2a52ab53501a5d178b26360a9bda6afb7e869dc12714330b2ff8dae5ad9c7ec1e5638222395d581a66d64c63fa7e10e676b21ec39f9b5b9759a112bcad5ee2955e5ecde656b7c0d8161fda4ac4f2593e7c1a3def8f802f16ae0d135d54201e05f3b8e1183ed621c11747622761b3ae63ed037dbd7d6f28298ba14f20188c9b8453e66e205814e575f8f166a2775e7ae7482240b5ffb4d110710248dd90f0e5a0ed8bb7a74910965729b26a146c4f59392beb49517d0db49c0cb472ce240976ec2f0d70158845cf0527eeef25c702d3f9f6b2da287bb64cfcad1c6f8a6812e9b6a6e009e37c20c9d0822b683f0e15457a373d8593825af4e2d0ce918ac3b99890c397f799bb3e4169b6dc67c8a7e3586a7bdfde3b177856cf263f7b47cd7a1e1b33b9cbb0bbfab0313496506b3b19772b131e4677a17aed120bd3af69fbb0e4b645b9e8c104e280b799ddd49f1e241c3ccb7d40e1c6ff226bf04f8049c51a86e2981cf1331c824d7d451746ccf77fc22fd3717001ee51913d81f7a06fb0037f309957579f695670f2c4c7397d2d990374e99f36408e3ea3f71f60825452f82810d80d9e5e71db95a897822f48470c5a9c6c5b16263d02e539571e988014852c13b2843808dc8e260f4bcc8a86ca463206da49824b614adf649786759b7b26f5b9d76fa726fffa9ca7400aede12de31464c1cf2cf89172fd197f3c8bdefd5a1f63b5248e21528d840122c1dbcff84f8c06a16058e65407c8c86ca55de3219b03a1ba573f808ad3569d5295b6aba008039d07b1b87d0f95bce1ee556e407e663d14755c4decff489eec5ddb011cbb8915784317ae254aa963f682c13f7f7a48360c74c83b9f2679b76ea3166d9bb16f3c290226ac879b9f3886b88d33d89bbd892a170f8b4fa6c35aa4d0dc4e911806d23fb343561c68f3b5130dfe0e145932a0cdfab6bf46e6d1d32f55a116a5560c922ce5122d4c3943541bd1b8009b394417989e423a4d6d11cb5eafe9683101dcd661060784af830ab011c22fcde5c27e57fa50369eabb00fadc35e39b5dc91f4298c94980eaeecc633955de9c87c7b2ddc63def85eea3627f4eddef671f08ceef5f02f482dd2cce27906e35a72c7c9ff2f75892bfd9195f73b3ea0c44f255929e64c249c54a3aa0bdae711167f70454ecbaffd35ed3a25f9db5652178fe39d3154f1130935aa1a8ed3c6559220ee63b93b6399aac03c8cac6fa55164c6a3bf91dc7f7913234e85081e253f52199aabaae940ecfef921208b62ac2d3085fe46c7e747d54eb0297ff3f4742ccacc1d93b07fb865b70a8088135eeb43ff404ba9400ffaa6106e9371cf1143ac80aadfa256494aa24776b339d0bee3444588247da6b1087a0cb134f115df044d0858795e08e0781134c061ac5ffd149c97b0013a4864e1af982a867454c8466cd637432d44dfb1310369f465fdb3ffcb7a6a7a45b1a626d5572cf07208578aaa5ed9e5a69681969047e5f3dd565e254f4219f8468eff3889ae4b1b80ad27318416b2d9407a9088ad56d6d898d665f5969340f3b31cdaa71b22076016bf91db78925496916d6707e6d49f2b1f1a56113fe271f4f207c2f32836e456babc31f8f65621860feb8fb4eb25a153e67ec8e8b9c41f94a9cc329d3f716467d32f821a8be6cc50127174f018eeaffb759018ec829cbc2b40c6c415af55fa3bf6960ca0b7a8976d4f9bb149fe83fd7a42ead0ad28e0da513da3d1ed1649381b9b6c2c3bf83025462dd6bf331a7a2c68e4eb8aab2b44fc8f16dff693f2ef80bf482e8b3ccbf1f863239f193beb55bf4fc21ea156f82d953d52d79c9ad3ad666f73698433b182734cc76139e4ef9b288760f0bf411dff26f488275e7227077bd4a389b1b13756488b9fd9ab9ea5befaa8480e2eea1b5e444d1d4b96aa6b8223676f2b9e25cbd1ca880354d8e98c35984afdc38ac25ebf5f9f88b0ffb41fa1ef902cab9411eda98bca985f6c56219393b7e8bd5d5a8696eb6450f3d42fc1eb42f762a65df62b320edbd575b065045d7fa7af581122f1797a541c90be6de0c2c005b7983652f30fb62431246f869307be72982040bc4ddb7eb731f4390f0adce93371fdc7a8e397345c31d7d43b5c06d2a159b25676ea317b3637aabe739e7e111958438c786b6cebbc5e2c8903cdef4ecc6a6adcf365100239a430d94c1a3afa1fa105ff31f8f55eed2c8f18707735a55c30d65ea22cfb8639fe02f3e90ca7e6cf02b18a761ad50067137becf1d65e58c943612613d05879cfabb MD = 07f84b3990bbeb9fc280681dc25d96bf8626992c Len = 26648 Msg = c8c107930ac3ec654f043992cfaeff31552d8ab796374b18c109162f57f48e603d19dd7c1071a8e4b81041f240aa1f94e4568c3a6c929ef3b98768d29e8f7197f1f5668be1fc0bac8922770ac6a5817146477648e24e0db92ed09c134e2d8b6c0bdd098a266cff04ebc242a40aa80d10a388aea9a0747fb4476a18b80fd7c326b359313f86c96b3306790a86b3baabb822a29e254d0cde2a2ddf46898b94010f13f24374aa1c368201ce38796ae443b3eb1cac84911c116407b78d50676c2d6d502fa8ef396d4a39054a3245d72dbd47277e428d16ae00aafe7854d34e6730899599c879dcc28ea0397361b2a19d01bdfe51c70981c993443aac05dbe68ef0ab08b60bd93b25eafec6d42d88713cf85d971ba3c17d76b279e2da0730d7e8561bd111dad9fd9d469dd3f2ff8eee13886e1b673d7ab0bc45921f8bc29aca7d4a20192f9b3fca328ac389573d8dc1299a3ab1baffffc2a334d718469ee16756b503089ab8d44ced9fb9108a514e91861707829e50175c336790f69303cc557a7d0dc5d9976028d56bc78f13a1960733e51eb69a98892675c605e0fa59253df18c837974a2ab09f3d7342e7b9730cb37eec77437401ec7703a7eff0408b2c6c4c8b04bf33f7c954dcb4a174899e3849a1849e4fbae9ee82ca9427a38783c99fa1bdb64dfd89c74ee304f6f051176da654dee2f704bd130b2fd9a7a1f118a5d9b6c4bebc0d4d44fdbec8c613766b2779f74fc7d1e7f7e48091cce273f3c66bbb0a249091c9beace1de9491268005f005075bcf58cb36fd739f026a8235f965b40a71de67d95a698bd0dcead1f474520803876c0424d6a864b5fe92650e4e3e453620fa96a2ad256c3426258e5a32b7d38a47205c8b738fd465361c8503115fff1bb677b6cc234af356f4e3b417cdabf7fa3f7eda757a1e332b3d4b7a9b0f453239a6c830ac5964c1d7cdb80bb3a1b8f5e1d4ea066976ce018678b1ae6c74789f0e767eacc9bbed482504e4cdb45b495dcf8c0458dde639eff56ce1a8ce0d848618aa0d73aac74f06dd5f2ca2a056d78011d9305a4934cc2ef6ae5df25626d397d6c5f73dd608248e5f20e1f2fe310e0d5740f073420f0f7f08a179039b5cf034c73ece53c20af83f28fe9767245637761e57e74c4ec17e30b9ead564e41c64fd6888e56df52c24a9c95ccf57c9430e2ac592673dd5f882e478fef58ee6d1ac524948fee4f608444eceaffc4d4393dccbeb6512d06e10d81ad4325bfa0a3920c3d7d35d413b0bd1ae977ca0c029a52dba0e645c9c7da6c8443a397b2ed4bf7cd292dc931b3ac34739c2475f58f2139b759cf4a70a8b26ede13978d5a5bcb11aff18a922cb8bab3f80bda47a60235b909f15baa4a32d1db3725084ede748ca85b9c7edaeea9440051407f8948e33d99797171ab7eeca07b397fdc2367c0f6847832f0e79f0eb1e42543fc8402bba3a2aee0f897355f85168a2bfd541dc6726cafbcc703657069271c1a3a7dfd11ce9c5146dab49611e973d2315129270e662aa840ed746b55d491dfcf20bf606d264f09acfe4bca8c355bba97c2e9ae203b840ac94982d7485aea166a9591545713827f194ca3f858cf96e96737ded9855a437e5cc377d2ce63f969f1833a0158fdff5b95ac0649fb21ec09a9974ed1c4292fab034399837157877e6ed1038ef74c8c442806bae5ff9125bf63cc82bd65120f3ac5b13213b89e5c00e8673424bd68f2e2db4208f3ec8908b59fbdc2c6f07cacd2abf588a92ba04095682d15ea31baf8deb548389b48705e9364525614eecfcf1cbbf8e36e53c5fbe5f50bed09dba868e0be0092079daeef00bb7385cee7723ebfffa08d8ab776549997e906a8439b098fff535e5c72ab83a5aa08981d61cfc2647fd6cd24e019155956afa6f0f2fca2947f27e3c550cee22a3cf9d728e64d22b34283ea64541804cc3b4516096f31fc9647666a68be81d336762e8a18fd542853508d2d739dd9ea9b4d939e1a42a4df3e5df63b6d442c20716290f9142f4c9aedb1dede7943c68e6e9581854bf4bb1234cbc19efd6a358f8507056c45029d41286e5c459dcc45baeb19f815c60ce05f1f99addb40b905e9176d762ad200b0e5ad8df1a908c2c034bde3de94b0127a8ca8cda4395db804f5d29dcc7ce4b1eb4e23198454e2ac9ec58afb1d4b348ef16276718d017cf09a7d5b9eedaaa39cb7433317fc8c52134735fb679b827709aca9328c4f7cc7e730475d78c3fc36497d8d8591439a807e234cb7314281a40b15298327d4ef64272c1d7e3435b9c640a3f4c08e40c695759ad26761f88fe11a93a9124903a57b38f8c566d92a2b7a0a93408d17db57b980148eb2fda7f556c08ef386fac4e535a0fa07be6f8c987b2eb3399333fc971328f949410f36fc2d846ecd8842fff6b9e99cad2eff4249f0346da77bea8bccccf4b1cbbb9e8de98bee9c00c02a9c21309a457d5d8f348602a52851ec44703f0b6da4dcc9b394079a877e54d5b984aec23c5c41f42a4a97d9074b008f4a9338f9193a441355339d82d67d9070f89de596564bbf9ad56cc39ce5407c0c03ddfebe82dcca408c52f26b64027e38edd00dd57079c0f89a825374c46e8d0a7834db8130f038f860d94f7cb773e4d6a20670a6134e0bb680748f882e3dfb31af82156aaae054e5dab0fcdd59398bf11f255432c5326a7b8f2abf01aa158d2ab2adf5a37812e7ad01bf41b7d2bd3b326a1602a1118da3efd08c2b06c15e0c9d899ec35122f0b8f8deef6632a866bb408dc2c21a7cc77fbb4a831bc0f98041313a3ec79f30e0916f7726b275659bd5c59010dcc59048c68706f5d656dde3f18fcf7449b32b4c38b9d64d6ea990c64f6679e797cbd47940fa0acca5f1f2f0e75f4f2790b59b9b767f034de3f5b24ef2cd52313c54d0c0b4bd60eed0b9c20dea48c341e5ce06351369040c5682529b86a223d513870d86ec7810459fd5d4a3c1f232a99025f682d71ee3741277f815d38cf2bb648d1234aed220b7596eb01b3506a447d9e4f2ea8a47a86c5efd2d24a034c9cb778e6730c3739a2e48abdfdb0e2c2203073083d5f38b59db813c7730b742afed93b195e4f3048591b2b5e84d140bb2c564342fabdb9300abc45b61a1de5dad09021e23b6052deac8e0b353d80e4c5f75361581d40a07a4c36f8370dfde2dc9070afe9910c395d0ba1acea9e3c6962efbc6fefeb8488e4e0bcadb2e527f5b0dcff4798059f3e53f51a82e70d80292293f5c1530bf5dd0056b1c8c2262888f814908b65ff95ec44074d1fa331e8be8572a40829e521076d1cbafbdd478c3702c5e8ddebe58ccdbd90bde5b771d293fc0a2b96ed0d72a28ba13c997cdfaf6a716f4cd1825de05d214ff1778c63da33f6d9010014fb8748dc92bb3429452eadc47f40e8d1df3d050f936c47aa7e6c39165dd8e62a25bb34e05fbb5e5b1e667b6c84799642dfff6fd8f992d88a3804fddb06f78ba512ab212776c16a8ad2035dda0d3b6c6de6a4082de109acb417310ca57301930e58b3882256420b40f671bfad782acdbb79c7387ee84526a0927ce016107b8ede5e80c4619cc19315f22e2b5763bc5ca40fd5ab3c8db9e8e8305512ad6db9c18d9a8f7055b8d4a4726bb52b583e547bc01f6bcaf73ffc65f387360ecbf960eda4933c167f18dfb1cea9933a3096a7bd883ed6022f7d61204afdac5ef231f565bbef13216e5b674db36244d260db1a9474d4b0fb55d4ac9a670a346dc0a5ebcc2c04a11b73feffcaa8fc468e799a21930e7799110ac42356c0434ac5b7c3b8838d5a628f5051fdcb17fe14b8db42512bcdaddaedaeca59c7ff2f7be13829e01e4876d3d7541305d1a8de3bfc16722de13ade12ebc255d4706c25246ad236f70ef5d0719e2fa09c50a42328c2bb981c35ce8ecd85d60517e2afdaf0ad068961d80dfdc84e239925cab24367a72b22a0ac014657566a56989132a75d42557fb50c09654461d05b36c25bd58503f5a06fa66b8b6cd7efa8dafe8d10c6a54fb8751d609d8263d66543ba095fed839bafbdd765c46a84e69a539d27adc9404592067ebc1ceede7645d12433292d809d9f2f91a887dce7df9996ff8ae4d1cdd7bafdc2744a063c508b639361e7a1956bfd49878c5c307b4b2519983f4c7c989681df6b11cb4507f5948f8a2e12063c9758700b89a801a9b9db6ff9ad5b262ad2850feb2d0747cbd5ff997af01ea7e0a02f57903901cd0d9c1aee966d876b0f4c4323b51e947af2623b25d84084231c06e044d812efff11727229e0e857b7b0343aaf7b7ee94b062ac5c944a7e8f4593c29ec259fc9245fcd5fb67bb64298a85ad9f780b67c5481a03dd8228e938832d05aa22b4823b9331d51f8c95fee9a7200afb0876dd413ff62e1f6f47d3a7b0333f10b3b94963a55d2f7855c3da21987c63a5ed20d7705d9d3708a5cec343975078b8be91d8734129e9ed096e803b2642bf856f30ddba69b825826be64274ff2ab98a8a63b7d1303d0d65f2bd799d191a2783d8cf77872dee017408b7d7a2af69096e61586fe73940a2ca56d94cb139aba2876e242e3f6fe8d2c5c5680a3570b6714c8998871c26dbb1037ee981dd4e9e38797b58894af84da05fea2263950ab9f80c4b4a87d7beb541f8b216a18b1f9af1414592111090c67429bf0c6b2b4519a696ef96f782c8775a913a8833227548d6c715fb4cfa MD = bfa71db73fb3d8103fd7f2965eb89f2394f0b751 Len = 27440 Msg = b00250cc952f6dc3042600e54b896d178c8484f5bfbba96afa81327df04b116eb964b302d1e2281b62d8838bc6cd842a476d74272a7f519bed172b64cc0dce308aada1d86db0cef08b6ca39c444739a4107153cb7bd3885d6d42a508aff94decab46e2f57383a969054828bdcedfd3ad6cf8e88cb89e98d8046a6711a1f7d5cba5953e03ea42ffaf5ad6da986a7d9c6ce56afc0febcac73339f73a28abefaff5fe047da7dbd519e9117c81d52309da0a023057ff1b3e5e979451e6f5d3c9249141fa668b4d233f40b3a4e41cfe6bd6af4bb0c10251e2a42b9ee1331f236d7ac8f3dfc2574816b8dcc7b5cc13058cd881495302c0949ee318de0de94fa3c3f9c19e1a59b3d595cee4d51701653f5227ab8381e1e3ec5a6185dd3ecf2c5ab4eba5c915f345fa89c78066314bb8b4a60d5382a3281061fe689b21ddae5f5026969bfd3758b8c1d8ecda016d72b56d71d0a2cc1f9df1fc723e8134504e8f8d0244ccc1e84fb2326b85172e323d037199b9bfeb5f092ec49e2b609e0177651a313b5f9d90a2db542ada6275e9754ac80810d267c9336fc26b7960e556f188fe9ac37d199717dd2ffd32e15ff8e2347ba41d05c6c7e55bfcbf6ea893b983a24124264ebe66775dcbcdd7bc73c84c679157277e92c0e59a7c8454612f91f758ecb9aaf91363890631800f1c39c17b8b12077865521cfcd54aa071b242461354054099a7a1f7177d680023293a4b3749079e56e38f42f2b46cfd0ec45340a03e97a0397fee8ae76d78335b0afdcf474977030a20d09c8fdeec8172bfeae665bda7c3d3aa8485c37c6a03fee80bb374326a1edc439d919bfcd116e7ca90a22c7a3f90ae4feb4e7152455756eaea6186ace8d713747e89ddb524a3b30dcbdbbb1d66ef1497a94fb9981116a939243f4561fa16f9ddfcec1eb2ec0f1fb126fadb4d25c84baa48ef65f6d62a40fc41b778f6a7c3d4a39e23269a314473de266554b283039caf50953b139d7a635cc730e916f8c6edf1ed94bd16fc29f7bb5585eef588894fce47ab05986dee598140125e67f3078ced70a8abce54a6f3713ac271be3c40ac31b798892c4f6e6c9233c4a091a26ff9bfafc7b76941a3ae275d85a4b4a811fbfd27c490784ae2e2b729b0773d0de47b90325aab90cb08710647345080d3e4835d2097e1246632041aa93daa133b4f5b8882c74deafbbd84367f393dcac5a28d77297946d7ab471ae03bd303ba3499e2ce26786620d8ab2fde8dfa333987316173cad2853922076c3467da48db00a8558ba6d3bdd96ab8ba27fae1fa75207b477a8b0a67f3d25b413cb6ba421da866ffe68b421cbebacd6c384d545927986787b4f589b4adc42be320afdcb92933ba27085b2c4976cfd38e3a0ebd1af7f8dc68488fb7340efe609809dba675a6a98b1418a1f90daab2b06854c683038c47c4335ee1fdaebf8ae0a91fc0813d3d12c30f3fe2103002694e42affc0edd8f8d06312074c1ec6870955e89e8d6da96774960a5a8db7a25fe93647238c66fa7d28aa7b4cf6cb4b0b666fe70db0b1558df054f717ac1b3bc786915c60213837d1f38e0427b67cf3f663ad3fb1f8ab42b53df24cce12aa26ee0b79fd3e35ddfb87bf823f3fe1905be87fb23533eb97fb9dabf26dd647e10e43d6548c0620c4c01efb2b7eee2e91dd52290379fc00240a77c8d9ecd8b26c5c6975a59b608889200824ee55cae41e12b3ee157082bccbda04131d4c3de8889bbf78019dc5b39795c3cb4f565eb881769e3d6cab6097ebf4a329310e8e60d246b64bed25be588c9be25cc2f30202588361957dad0e1820e4d569c9a632a1d5d7fe6fcca5a2edb49cd467fdae6d582fc3be94ccd7e3c3f7252b632b95d3221fd9f85224b02bc9bc232a6b340ae93063b205a9deceaa11db301583eb7fe877fcd724a199b7a1931fd944d51a7b1e0190c8c75327f399884980146a9da6db0a192a13cc702ebcd03bf9c444258174723382741f3ce96a9dcebfb88596bd335ed17d36315ca7d5e7bd3f2926c9b074d8c889ac6c920275d8d72962438b1579fcd23b1c8eb39575600003d3fb9b8a97cbdc18d0c9abf143bfff67b242df62275a87de3723299a23df90d255410f6265b1caea71c50f186cc9b3e518f1f805b3fe6ee1069d0308599d0c354d8589ea672121691fdd1ffa596c714c16ef8992b86ee3ee0b6af4729f4ecea6fd37bf8504a08c0f3b707319823ec3e73c89f87bad02a35fd60b525b6d5b54a214e604c4d6a64757353d8ce88fb73850ea5fc922fa8019a0c6fcc1453c593aa0f4fefe2c55a8ffdbcd82e209ca4c2b13b0ef704b393db37b8ecdb5a284beed3e4e11001dfa3f220744ef06dfda8438aa10978236d1b20d2a6deca405eef2e8e4609abf3c3ccf4a644bd06fed28f5dd7e9a1673986c73934814d810e1d39bba1ded1a8fe9a5dfc56d32e571b44df7762badbac8c251f8c25ef42e70c8cb2fed45340ef6b8cdf74f9caa8cd0b7b22fbf1bdc12f6473ac826d98c3e682d4e15df14d5e6982c0d9c357d0344f189edf504d995ad90b98f584d326db65b71c4e41be7634fc8a5fd351388ed9c688d59fde3ef7ae90c8bb83f8203e8f4df48d82130573c991cd90558664ab9f18a44ae90d8c7fc63de204dc471c8ae984814f04398cef2611917ce8caa2d08e2eb4224545fed8a9c9a29c8ada8fb2f0f3a6895c1d1c9051621f4a1385bca5aff000883bee5dab5f1a50ab1518415eac82ab6413257cfe546ebf235f1f78d10946cfa25470719ff11a34580368fa35261ad707b0bb76e2371bb82f53009ffda4196b981733025d66af95ccde3481df65a1739abb46d0e4005354957790f9d0894f1a930da0d88cc6c3bd2f2de39f057101c747bd2e53abb9fdd97e53384df3bfd225bbbc1dbad51a3df2a879dd1c4f53201b343ddac7e069019011705e650d4e88d437ae1372e069057d5f4989c06412e8b789c3b4f42a1947c177556c07c73f5b6e306bebc654bb03a67d255152edb63fe26fd723a132d0b6b4d78ac8fcc999323dcd790b7fda181fb42a959c9c91480fe60e028f98a09638b05a98dc0bba64f4873762dd65198941f18d22d364f9cf3f098dcb609f1b73b4ff28060efe43a98b9595aec73fba1551a3cf535c73cc53b79414bbff7f4b7013e7685cc89c0b6fdeaf10e333d764c5371317b1a091b3dd5fcfcd58d200d9943bb1432371acbbbed51cd08b88f3c0a0db898ec3078556731f01de2d42e96de815a4e0e270f7fa9e5826fc2d2e5c75ae254c5c11fa195c20df736fbfb804ae72890a68212f4571184f13bc528dda2cf7fea6a823df136ee9876ea9989a17453c80290268155dc733a22c3a810d348d844cdd9a821f3c33d8ff38b33f51ebd94ee04bd7408a09a5f83ab99b4216343f5cf93a5cb5235c54f42f19b63c464813ae93b60e30f60fb36dfd020a1d10a0eb87eb051344523b7845ff5bda18e0f59b667fb2d0c1c238989cd44ead9b6341380e0c86eab813a048d45845465a86bc187e8e894579544cfd8da7e7ac4377dfcff842050797d0556ba8201e238aa26333fca78194e3151389475f13309eb442574d77c9926cf0208ac9412f98309bb393eab1e4e6846d55e5d2e21b613283317915921bb4bcdbca4d40a1c0ced5d974e04f96f862e6c5d9b8361a47668a4a75dd597b439411f81b5b142a18ed00c46ec4343d0631908368ab7beede682b72d62a211a895cf2b1da5d4dc2811c3ac468e5a08e557a0a11ca66aa452a8e9f641c0973573431e86dd1faf45341830a412ceb9b712f66ddd5c790cb0971016d870f21591a8e3d7a95c6db10c4a14bf8a3807f2eceda1d903926d1e421fce81d42771bda4bdda8308f82a8a9fde99c8c522d495f8d9fc6aba3b1d3ff75136c37ff1b9efed26a9a92c4cd08c8e6619d4fb6fbf03896c689b67d2e3b23edfdb54425c453ce977d3a299c6ea373675177c837b11dc1d1978f3a2e66b4597104eacc1c3ae151825eb07c802f22b5680051803e197701275a00bf1e21e4a8e96e33554b45f2907c542513d6d62d93d1b754fd31f9a7007e5604cbb52773183d84b9691cad2b916ba8c177072c6b178abea8c97a1a54c6c0d4c1e85b3f0ab1558ea48ff639365e39a3ab2f7cf985487b5d746c7f44275cd31c629d7833517c19d41c5041b3bbffcc8a0cc39c05222e8ddce06caa3ec7c9a1760d7274c9ef80729d483266e1617a0ea80bbcce17ebd2a682165362d2de15102aebf0b7ca8dc5463350bfcb8bd1d9e544d1a17cf9883baf983ba80ec611490a7f239ea9fdd2547fdc5d7fd97bb3243ba585fa0d71a07191667af418e30a6b76bedd05b32c673403e197f9f878ae61f7145050e948db7d3234f9bee7f171863b3043ab3b1df36dbc8a25b591496a9a01d95a297846e3667c4ae08ee3b8ed9f431a7a1aab991f08901e2f3b0ab790d6413cca1021325d3456ef58ec74ff27c075c7adda6968930c69e7df14cd8ac81e9f85c88a4fd5f4f0a76d89610290c7f0b97e0271df52f6812e2b5bc7408ab97903fb7e2167f84ea1590a9a74f5317438f786a169731ff070c733cbdccd7e0cef55e7125cd261134f530fb3aeb5abd69e1728b34a8f962be01b4758dbdb3068887d91acc3f8d9ec027dc4fe96aac6962d02ac609a9a814cd914ae2a4dd166764d634175df412781c3bf70a0b43d495cea9e5acfe3fca6fe6399b268ba19e9de45ef3f943716157999015cc490d4fecfdfd47929ac1ccde78793993aa81a8147780ad23254dd697c8d2bd190b3d9ab98138d53957e64c0af4ce8acc9a13cf559ef9a4477bc00ec34a625152ca4b2195f8eaf2e3ce03b46ffbb81 MD = 92588ff54cd3903ceab98afd39f1854835f54492 Len = 28232 Msg = fcee0a4b7817f88402166350bbda8ac2f4be6ea3e6692c72a3f289a94d48cf4286d2d87a275268d5350fc06211336f40ee726c6188ec628e14554bab7253403daa278f2996900fbedcecb0f620a156f977bbe8e31ed7a3c76c3fb5f40556077751375ae12c99954adff65d954fece7f675e30ab20ef0992694f9ef0b6c1acbf861485f285134a37e2672efc608dbc93ed230fc55c200eab274cb2278116735c9c4a3c6896d2be1649aab8e12b337a5d974ebe354a0ce3e74f4fc76c45a05edf16090b889e844f60321e86000b6c822d0455bea3812243e72fdd61276b1bb9a781f565db22b488b63a47090187a56e92a2bca36887fc891b6759f1f167d52e467e73fdc8b9cfe478d0c8c44e267a9a1ef107ef2cc4f83e04846a0c42d269375c5a2915d9ca430d3883f84a5e7e688f328dbc0448de91dd32e56212a421443f29a37950a6eaca4d65c27a0daae5dbd87dc74d85451b75e11728f6a78ddae2d06ee8e9309881a23f912ab280bbf350e0413c30e4ba3200e431cd7c2d7865e1857ca8fd382725775e4b1b26362a3d74413d5afaa51088cf4103218736fc68ccb8d35229c9eb5cc623e41269a04e1a9275b2b22f38d0a63d921be39c367249e0f51382f3884d8e0b2afcbee151c01157e851c043228300e851dc722fbe829fdac4bda9eed5e63fa2ce155f21cd08c821338b13bb04a02f3c0ad56bb62195b116a2223570451df849a79ea1af7480958ac1df1b0b219097b527972ec42234542117e1b42c487d3e5c2228f4eedad00fe12dbe44b83c0cc0e0228239de12d6cf96809cb487728c7856c824e764727f9de0d1b92f56a65d415996371b689605a9c38683a4f635b43cc62412e7a4edd7d5f64850494ae31a7f6e0d1651f80e4969549467040d249d0226b08384247f813e9e1c04111984bcf1b9c1b06c00ee0a84a634976040a1af5ef4e7f72b67d9f44e44a75515570dbd4ea98e85d817d7c19254e19538154f53b9bd44de6bf37fb97b8684b3d477e0b3ccd9be1704b13e26f8cd15f0fa1f702298ec51a9c43bc3494ce03eb0cce0901912b6cae49041a3735e9b6c3b34b3d6b4730e9909a2b5571c38ce3fcc6d45be55a6cd4f6f096d8a6f0a3c3ec46676c551dea0755ea604adaad5bcf277440bae020f79b616be796542a22c183d0dccdea3422e91194c9e399d9a490141cfa6f1a6a368999c4e19b6c6ace772f5a94a8521341556d9e4d68d3cfcdee6ac9e9c1bac0906543036b3114390faf99ea7645b542b0141012d620b31840b1d280f7fae8aa6df90a2e6c9e741e4d2f698b6aeb3a4ad6eea4f74b545e3b63a1f34b0b61ceb1350b934fce2bb6a1f0c0464258e309b21aaace56934cffc0a08676310d3d915c5164896d7820ff4a602ad81928764b02e61238369850bc305e27023be6d75c3427cc929152c57aa20535c817c2e928c3a1ec8a9f41a8bd12044d406f7c7755c0200b56c244614c3048a9be440f87c77cb2016b9a769b2beefcc0d7d7b864a488a4e87f08363ea07c8f4d61a9f59751b58319842d1f722e4dad48707b82e872141c2cb26b10a29c0f43ea5a4d5d60edf67bfc7d632576edb57fadb361c349e7edee9f99f4bad66870cd485039302bc4c80271fd416eec91b1dab6479361d02a9a8409dcaa1c222d27932fec735440feb28041acd1e31f41c6262dd51946c564a3453223961fcd13bdff67d605b3e7c23d5d34341a6c56267ecbd804f95870bc9198e215bea92141b978b7b5f6346838ef02123a24f2d86860317f7d3d81185beae7e05a2ca364e0a365e9324fbe0a8953d5a369f85bee2ef4c1ece8eda807683999f59be8f6df170430c3f4173b17ddee3faf669d91e0a0c3e1e6ec0fb5830c0316e980f888da0f63400ea45692d55b4aa9fddc1b7af6e854fa3431ad8fd56fd2c584b066439def48fd91e915ab8d2cee7956717b00782b2f759f60ce2045b82d108dd43a0e6fe03bcf166c5b6e8677621982cdc40aad94ddb8ef217b4f1a109d5ece937ad09a0ac51e63d430c30a652fef4999fe7fde48e52dec1bbb049e9ea9180d96307364946d5242ca9c925f1edc65737d31495372cf3b5df79627178bd9a4138463de16a7bcd378f6a8c3cec9f1e1c720664f543824490c5c14a1cefeb56ba8061cf9f76a390ad0ff5b3e9f8ff6cd0e2ba57929c26bc1bff33e580b20c6d593c462ac51066c5d118ebeeb1a9774901045f4af19392c0a3f641b351618934b9e653ddf6aa2dd35024ad7b2870af39295175dd96dc5f08c5456b320360fa4338f92b57a8c6715fb6ddcb07c2d0ff93b6549e7df6e8d3dafc5710f02b42d82f62ff2d365fd7d9b1518eb512f55cf10f347829aa961ba9edb5c5e36c1d899b4fd462e9e89050bf7edcb20c0b54771bf22056a7f2091739878dfc53047ea7cc2af9ced1fccee39b2e9502307f44b1e8f3065aa9d2a45e1b5ee174d067a32fd3573f8d85c17fe3153736e9b2ed6a9fe068530eafdb0c42c7ca5cc9fbf44f84594b324965f537f1862f2ec303b42a838ae892dd1a59b577b7506c663638c837b67d6e6d03066b71967ce938b381f91f50fa526089fd146f62977cc40fb3a1cc83744072ed53aef59eb6e2b542c57ac5caf3fe137f33cd9c71f61a8de8e350b548a644f5758b56e03763c7c3220d1419618c12805a7c35813df2d20e624679846eba085f4c0c17e3d8e9f4dce1b7598cad291c11ac54d0a05f241fd00c5b70bc7df5f73ac1645652fbdff67d0252bf9216319741f54c438c2df0706d37a0dabfef00adf2861286c038ac593df46dbabc355bf0bbc5d0f2a752ee505084a51c114a5079210a954dbde7d5797a3876df7d730ed4c98e71628446845c0463e6b953086bf540bf7b0faea1f1e3bc6efc925857a0a015cfac17a57148e01365d446f7b1c9aecc15224104ff78249ed87d87df7bd7ef0af9ef867d7ba288e80afc2971dee0124dbc29867358eec87c25680465280b0e23adca338ece37b2fcb3cce543d855ac2014ff445c36ac2bfed64aacac14c0a9ea5bbaa36bd16efaebf0d51f003670e8fda0220f321156db716b93f4f6aa8f3ee9744f5a673dbecd2052931b1981e86530fe205b978175638e45e251e751cd398b87e6cd335bada62459858e0243229d647f789def0f6e409ff5a467f0b301365b171f8042c3c21272663acc4ce295edf2b4a95acb03c7ef410b588b9546d191d2a257f8080e829e9519117a7bf8d8f3863e21269e1708ebfbf77d516775a4e88caa3ea9058465a6f6e2a80cf1fe523a796c8e65eaa1b7b33b3a914dc9c801a6d3af2227cdcdf1d832437ce8515ba82f56c02fbd334c4ad1895532d54ed65e696221a0e8c363ad8eb1bbeeb11c99314ea8f9a3710a6f38c360c7b07c68f9318c9282495088be0f570fccabebb64f8404da497845c29318054c12b8c7aad921acff717a1370657dada6f602fcb0e7171e85602c901e504f13c5b6aa3b76de8527035fb1962cc29f1f11b8a2688ee870c814ae2ee4501f747b4834134c7f71f2a738bd8e4d108dda07da94f8b3c2dc17ae12b3fda71a68fea85e1b628f074bf08a2a0b7eccce0fc5145c0b8462df2a823d09f2277ccfb5642771cd4657b0c4e56c31d9f189b7c0d6b1209cb40a366c26f154e92aca029d3b851dda0d4b0e6567b9fa9995085059856ac2c925fe8b19ac77ae2976133578eb2ddcb245dd62b5edffeedac7cd3a32679dbd0158c43fab591c500397ecfae1099e18f67e93602efeaa890e085ce7d3e3e679d5bb0fb699d36bf5281ecba56e0d626d0715e19949004643b3d51bbbc680c173d6cb15928d91f308076913c7686cf74374ba6c509c995fb96ccc9e5872c4cb4555079a55cf1b3e03220569f368bee926cfca783882205364894d59307136406900fee27306d59960f882329bf769a4a168c4b9a3924bcdbfa9d5e0c64a4bdd593b2fa26cad67b1cbfb5e12439cf3a62dd047854455623b253f04a99c568bfe9094184ec52b48038ebaf76d6cc1f38a36b6b18f7d440a085fc94838252e5d20a98c273bff18dd0b33b7fcc889eecfbd565c912cc0d6b9c1a9c91ef0f35a55fffe83fb1e8ceebd354562cca81dac1ebc076264e1b195e803adcf078889330cc91a2bf25ae1355f1e5e5be570ba623702b448bb42c20a1b2ad64b80534970c83886e4bb75be554922c8f3e5d6c2a9cf2e077ff2c4649bd9c3bdbf17d5c66c3eaacf3ea4f366e6f1ef3fdb3c3ed90b3d9a5b88b9eb2bc39a4aceaa4ca482bdd6bc4daa4d586d62efd00d62571d6fdf18d43af36f2b9a29d34c738d8d3400ce06d9aca8131944519971bc39d4e6f9bdc7682030810a12372b3556e95808c315658f46c8a4ca8e2b9540e6c2144ff92fefd295c09e0b2663f891e33e3b973c3c6939b68c60c09d5959da078bc3ad00adf880264424b36948c1dea30cb663eeab98857653e5a014735d898907319282a0581d3c0ba3773d4e2d9810c546f36cdb69eef0bf81fd660226fbf5b50c7501afa4e651b798eb24fc724ab7087bca095453d2d04fe41d147e3c8dd825a2d90034659801b88363b2cc6662f046a36c769eecdd7f558aa3a25004dbaac99332f0d6f08eb68ee1956946408d66f08c3f2723ab6b6890c40592102641d8216c2775fffc570abb31d4baf2b70685a664c68d8b061926624ed75647077cfabd8c0ae227ef7d58ce02c61a4a207ad6c8eba72c2d9343334a797d815d2ed99d0e7171d7d7205e3b27c2de29c51356c4e87f358583b98609c9e28c85db12e41994cad0c99655962c68f0714bec1636fa759e162c460f6e34510878e6493a28fad0e6cc39dde5a1a6f22a4403379f77c200d6bd82bd0b482d9059c725103b14db5353a89b26670d3563bebad22015b5c61a97801b8113c06fd864fbb4c86c34158ca01a80084035423e5c4a5b4e2f5d71138f22690adf4365b9988b37fa640343fd4a866aec07b667d25176e11a32fb4d8bfc0 MD = d947e8fd7fb5d805d70c1a21bd6eb5368f312885 Len = 29024 Msg = a24953a800e0b73b4554d4be70f6c1ba76383ebe38ca47a6b202e91d758155615714334769d8387e29a2fb17f99d0445d035266230341033582b1e6dba147578af354e726a4892772ad8a820b4ee8a4901ed1f1834bbc53bcf212c7025756b4b13764d34eb77ecafb1c082e08a317b4e7128cfe72ca58e447eacbd2f9feb6062e99dd892d4ae6fac2420325f61adffda88aeded7003b94d8cf9476b00ebf7c469a7396960d3543f8edc15fa523ab3c77ae46f5f098c5ff7e29a001fd5c3ae67e8fc030477e548f1b726bb2bbb6735dac4bbabc3bdc8bf7bff49a061e6fa1c7922f4c4dad10537b9b1de5d2a8044d8801c7d0dabfb5d4a32199482c19313f460be1de96d1a979310255f96974f381e6ff8a51f88409ea2b2e7e721cf8885b8c700f40b3ba320fd6d7816d1c286d569e2dfc04bd93c213b86e0ce27ec35e3cc04920384b70945d95a30b0a95ca5915d81486b3d2f3c6987268ab5ff9809a2b0b1f7c8f06fcb5ab94ed5a987c659e07be3a8e24deacffc180a4c4b03539247095788b0d8e657f41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64a410f5b7524f9cd5fd80b2d96140f1e23636f3710498a61239f0fa3f7920dc8135a368d87f175a5d1cf8c626dbaf0a6a26cb00e5d78e787e4dabe528be4e5606ce5da8d261fdfa7fae59621d969fdefe334a8e17b3a720a867928b201781003b99c51d6da10c6583db29ed88371857e5853c04cd41ec86d8b02e54ee2cc2c267bb633070e74981b1caf2cf2d69225c694329ccd0296492564f06a95ca41884d35fbf47a5dabe3750a43b6fd4d2c6d6d095974de812172d696da3f030278c2ec8ab62ccd2237270aa908d37471a0bab63a410efdca40e3d5b328b93335f25a88cc7d325c06a6d1205b76f8e4deafac46a981b1a768850ab72c548f82df1ebda67dc9abc3756b806aa4169dcadea99092d9941367c66e560f74f6289e688e6ada31240f7ff8f5a35e155038a30c1f262f3cd08abb7e5d64331f75fac25ca1f0787904c40dfbe5b86f21bc6fe9e170db8065ffbe2efae2a3b6ae6c9cbb45f9dd25a7f46fea08bc4e024bc39a1bf96f0f1ac759f41ec69e932e843274d59f068f46506b6980a9d9c2dc060e5db5ae4a5f72e387e3175bd1c0ff537029add258957f04e2578e59deb540e2e501539a934b0d4cf1f1b5452cabad7eae11a07a507e1427f1b05f932b93d564f04b5228ea306e5620a654fd1fb1ad6834c35a119ea7ca5c01ea70e050fd0e0eb8925de3afce0ab1bc8792fe2b7193c2bcb5371283b0f5f39b8c6ebbdf4f5f32965cb355747256c20e0bdbb2c079e4f09e7dc417b0181b91370ca59037194d9312211ee8a8abf7199da9bbd58f29259462738d7b944bcfb76ce1c207f8d95d82c475ed37dcf9502af3f7afb0d81dba00914cffb8b0ca76d895b2208d850e039425d19aad81d8f668995c13ff4bb626d7b34097799622a57759e45d9b7c25d449aebac3c427d95e75167da4fb5a80f07c3124f128a4d2d006120ed5ac3ecf5405d797e5164f58fcb2c3a2cf3f750cbb80b33079307d698b176678354a5d58e77b290f7b1e690655b44981ff562bc7cc678219bc3b70453b2dcfd6d8f0485112fc2b77f236f5300dfc1081b1c9ff30b7a3463716a43df474bba6a15d3890567b1b4767e70a748469fcb13882f56fd611c6781f350526f5ac43834e1e8dc5c7645b1555c60387620e2883fcef72ee364f43803873c8dbd756480e53b95a4922832e1dd81bbc7e576f22317553cd0acfe49d07297f79bd08174b7048aa389b064c26b955649ff9e3115c22086c5e460166557568a4a26b0643c081a36db35bd113b780541d285a837948ee4c75c1108948ef435c8fad366080499aea7024dc119e62fb6ab1d040b72b7aeea81c7ffaa5f0dcf99b9d24cf95314924844e37cc5630bb92ffdf322d0c9c54aba1dcf5751612a1109c59939712fb31c71774568cfd7f23df89d1c87fe23088cdd013cc102812ce20e541641d7832b5fafa8efb9ea5de2e49af560dc9d6ac69ada97d6e4c7a75d692fce120d3237c2828d3daa181bdd25d69c6b87c9b685489c39466569a7bb03cff49b55458a32c1ad909f3e2d6c3f013a866958f54f5cd6bb8375b0f7aba6673be523a790e75e700a4236739fe46bbf38e1569c0973d7b71e3f8e8037d94ed1d68bced09652a216be2a6a11168b4aa6fa349a1bac27de35eff5f89dd13b9c88c86d059700d2e6fcf4d0a4df3c6ac200a5079d9d87755996532d1bcf6cd978d638132ec67670126bd2bd4aa6b688bc1364e3c6ea4264302374705fdeb0b9cb014e06b3239f330fa98078c62e2fee21295d4e7fc984fc4b247a452c9147e57b5234cdfa772423c3fe27897e3f4da2d788b8d23004f54692e18d35eab1d66572110ff06d89ac4817b4ef79dca1b8aec8789ef73f613e49eea1d3c70106083f96860af87223e0abf312ffcf461b1919da43374415a9070e45ae7783d958827dd1f94a6c730b6853405f8013267718ecf730aa411aa3f79b814e9ff1da6fef270ab1fad4d70aeb48e4e499cee37b5c2e06862076b619b7fa88ca749a6d13f54329f740b906e81293c9e97387e5f08ee7ef8ec06c52d1ef33446a1d05f80b3cdb151344a1686d843bd5b535c6949d55209a90b3aa5495464c9b75c2bae5206df6b84d2f176561e948f2920813584c5ae0efd320b8262b644f77358d429a1a309df9ec29a0658bebc307c614f799c3452fd6a1301f2e5bf243bff0a42481c12cd7c03a59c6d0b430b3fc9a80f9bfcbbd1537400a66d6ef98315bef2fe800dc0aacf57de8100ea46020b95675a2322c6a9bfaf9d81585adfd20327a57178135712481fefe068723241225421a785aaef5c80714bfb5a25fca182ed843386b920a484a05c131a3f924922aa69805a01906a546d9e9cd97cba62236531dd326bc7d1f39da5c18cbed07a7afc916d16a3444389f907ee5cbba3a4433310a701a7b71b136c4f54465c9755a9df4bd6221c8588bfb80a585a6f32e880bbb3498af968f072a0cb53bdb5318b2da6fb5422e9de9a640f28736904029f6a739c3d24dd77e28fbfbc387935495b74f8225f9f77ba08f582e4c7ff167d395eff3dfa75c04e61c93d748aff7939771e475350de62a2550297c1be93131d56dcb30ae9e44e671ecd8e86b3c6ddac4e9828f0f0862711ff19d241cfbb866d786243a5b3f6d45c59fb47855b55fefc4260f19d872d21a37789b6d793defce80e9e0570c123fe98a3d0ecd2da2349b4030745bbbd1a0eb14ef0aa157373c30799de9d0eaa0239969cfcd301c8c54a6e0109a9ddeaf33ad5f5dd406e172085669aa25ed1c707f1f095cdbe94afa27d84bcd68276993f327bfcbe0e43c75bc06f9197ef5ca0abc4114ec1f40de7415f92a6fc54085064823dd40168593c8be09d1f1db321ef743c82f88817d008286d024ff9b325a8f9a6760c45e300cf47827983a23ea3ebe7b7b0436e9e7daade226e283d1430fb651bdf15fa02ccf805027f7fc406652e7cb243b003fc7917c91c30b064fbccc03d5eb381ac4c205f4b0d3954019ee83fb9d897cee6b655078fb6f488dfde5bbff8fb9dcfcb23ad6d9fff11b0d96c9f88158746e0756093d2788f24122c3050131e5f1860e53dc69b5a54a306c9f41db0163abb953e6fb8013a1139dcc8965c9214059dd578defe7130aa67d641c9c510328f606da048242c4ac9b0594374e395809bb8adf49bd777896cda9fdf52384100e1ffda599e8abc113532080b506795da6dd34ae708c426eb1865d3f131e9caf7dec45bb8b73e2923c00979bebd5b2b8818784cde8a5707cc39a41335cd5c069dd278724c46c10bf916d11eac1050cf2008321439b50282b34d2fce0b98f19c597966ae92a1b5cd07861377720ddae928d98b5186fd592016cf4374f1296cf4b11029711a7c7ef4e5ba3b149eea4c1208f8de5544e7bd788d3c8998650300983b432b5a422b9f0c1a1fc266815a36c256e2b5b001f8b1f48d118cb8f59a6eff6e8f06dab823a88afb2343edd7b22d828913abf24ca4d91c8cfaa74721740ab2b1602672cb190dfa2f613a2af0a682cb16282b8c63609569033473d35714562aaa4314a3296031c21d561fae6a8bf914848caeff04d07952867b7cee24eff3ffcfc45bec219dd68b5b7e5ed8b3f6d2f76abdc0ca9f68e7719d1c2ce8098b467a884066de62264eae4046824a4b6bb2dc2f37eb6fa19e824e9db30e61836ad0536a63cfca599e2cb3924b2473cf5f1b4b5897995e99f5bc323ecc8bdb110323f2fc9ae1608669d32397f8bfd58e457ebd5d39452816e307d4c6b53fc530e8a3d1a5425611572de486e7dbbee026b35fbad3a9995c76faf79eec29a4a0618ff287fb16985d6a3ec345f8709c34172d20bc2274e05c58a1fe090586250d316d728e647422b53e2111f94033e241ee177449e007d4b82a8cad9bb9576b5c1f05b64d87e78fb93189331965b22b89fa06ccec82eec0f06aff68df6e19d22d98ed305dcbed29c9e2bbb91ecf57d28cf97f9d0c81a64f85a89ec23c9a49e3f22d887327b6f19b77c05d1681e3b171bb3af6672272bacae851cf4c4bc4642b3a4b7be143cf915f3368c1dddb593b83a55cefade6cc88eda8f525598582f51276711c2d3a7c58ef9d2aae6193867272dbcddfe391f5bd024811159c624c8934274d0d99644394c705b4676442f1e2d9bf0c5baaec84b3b3362434677a977cfadd2da4c859cbe1601d64713852220922dfa6c7662f00097b03acf65d26da5cf0f891963ca36bdb6544d9706049ad51e8ae1bc7a801ee2ac42119dfe00fabb5911a273658a9a9cf210c71d97ea1fa5985aad9c0d2edb594192f0955928d81f365b24d29cf051c593dd4dc10d5f37f8ca4766f37994aecd2047de9fbd738d3b2e94171d4e21e29e6165e66bb28a6c367af715ab04dc1fa60f0ae4a37409a3760864833cc448d591234d9a03cc9445c77112c2abf72bb64cd7830989c411a2378e757116468bb304a3407171a4a44a13774173db9aacfc27405955 MD = 66ba577de1222642fd9e3b2a6e20741905356c2c Len = 29816 Msg = f7a5098b2a4d92a7e71e4658b458f47a0b5e0427adb967da3a60ced4ff361abf0fd51492958a5fb468a0ab64e0e22a58e95b48a4556097de77d10880ed9b618dbd81eb78a41d6b41aa2154e1fae33be8f1198b6575e07a0688043c801c7b76312932f504fe0da096d529ab97a9640e724c1f3630b442fa999581d09d36de41f37d6f9a004b62e5fa103e174d966b8b3e21f5afceba8dfee1c8d12e9fe0cdaa1bdec14232352421b783ea00cd69039a939924600730c96d24477bbc4ec44e99f076af5564625c3e1357b4ceddc93123bbdc33afa2beff31ab3a07e4728a6cf6bb6dc13b5c7a122357b424ea465eff0efc11aa06690b3631becafd0dd2da2ca9c4eb7f5de3264cb8cac1c3bacfd174439f6012cc22c07655a51ee69e375a989a53177221c00e14e5b6a718a742ca98abebf2f1699684c785a7604a0169b5b7b2b01921f0bdd97192618dac1a66f0742c2aefd2458d0032a90db5af9d309191d7231a1433a02f6ca7149c057902ec0fafa27f3ac8cfdcbea920479fda54972ff2f342d45032ba0b0c17fcad2ddf65721d9dc8b35a23bf746d253ea1209c6e98ec69b8e8b13b1f58aab2d42c9fc504a35c61f5c46352515ade67c23ed7d1bed4abcda5d8bc83095b672d4c08367b71ac56362cf64b253b7be22df9fc67bb31ec1967302ddbd11e1b2ccf8ecb59cb5394f16695cf7a6125dc62be0e6639226de71d7e826e75ee06a0e2e2bffc727b536417385ad958d1b68747632701b3ce1acd9e5bc223f1a36af26fac0a24e8541823aff3a09c4e3c978377646d573e87e1a7864719d5b9b6f21abd7695ca231e4bd9a1e0929fc26970d8dc0907ef43146a7cbc88af0b34ef451fb28788768ba1938fd547556a1d21e88f5d9a1d51283e5c542866ab4dca180c0938290cb188a4994c32701485c82ca7aee15ed90657cd5f37b22b3523e3f7eee036a2490182f10418a2a2f57929525640529e619536891d2e421d7716e75694ad933b66f1e14e7dfb0d2620ccaa5b9d4a97a2dd862f393b40c08696ad3efba578393c8b060d84acfe5945be09b20e23d698b27662a8a7647614acbd7151aeca470fede2ca6e5b38286f44f7b5a83491eb3d1653af0b993ed626d812e88639ab24fd9590c46c9aca82376ef25af6958e926e159ef8bfd8716bde51bd9c4663ef16eb7ec07c700b0912990ad87f03f9c3d213f87cc22c2ca63a2561e715faf33f26c1ee987be0749ee27e5fd0ad3728d7b314081797ba5c854de14eb8d908b2425a672e4048269e30faccb6036bfae9733d598a97fed132b5abfc615772da68a1bcc686e16ba85168606d579941b4063f79cac92480d974df5c5ce2ed68d6dc0354c43da36dd054ee1e478ab9b7cd45e26e500ce4a43aebaa69eb19a14166d811284a9dadd50571693c44978b56ad6f0524d19a02f25c5fbfd98f4d9c87f122734341ec282bae6e81c04bc538a5bd4c4fa436bca4f2a898c5b432c805c1df83d0aa8f733bf83514dfb4435ee82d63a369f568baf32d845d6502bbd0057897c3d0671e7a0fc2012b2b1f16a8c274083dfa1f4edc162a597747cc12aec43383aa1c80d449cb147a7b0c0aabecef0415e3ab2bcf6a357190af121a1faa697a0a005c009b27987308cb2b7cea719765f05b2420d5ab7a8b8fcb6ef2ca0b1dd5948c37ec5a5e9e6913e5307dbb81e01d036d0c0647e80bffc093055efb1b07cd8917564ef934047d038fc2150662f5b6b5e30ce60c6910558ad17c659a2050e95269612d5ff2f3384092894db35dfcb86d84cbc70e76b216544b7e0f8f631fb2554aff9276df922032b62f2caaba1ea99517f2b1345718c988cab165c22c9daffb82d88425450abf42c259bbd4c18213946528ac66536cf68d16bd6e1bc3f168acd8950b546a829dd680b10117ba517dd23616c18cb3d325cbf74b33836f4565d116de2feb97234058b6df065cecb270b75163f78fc077dfaa3503bae079be2fd0025af9d31415322e2d8bd28ca0ce73ab80b85755bf80ab92978c0d1c29864d1365b270f2297ffbc2ad5c6e8d1ecc0e1689bde7c7fb1612ebe78f341dc7c54700068e9d311e89217afefae149aed5c9603519b1cdbb5f9b1debb335cd9ba2a601af9486783a5d2ec0e70e33a698112df14c75bd504686ce906ca11a12ed46f07d266f35b0c720aafb31406c8e23a7c13196781136e5b133ac3100ebd604d9b0dc34c5b2bf0bfd1b92a43795e898c00d89dbcbb769e00953da0479ae0029826b85a13f038f4f1a0bef089cb69c3f839a5fe215b7cf7fb5b580abb46d78a469abe235843207da9f01792516d5916019ef1c74ff17520adde108ef582f26bdb7f75ab83d470ef6b58698c34efcb143a995295931e1d9c8ab60d8980dfdf2bc94d855f111488ee98421b4a9eb32e3305c12ec59521d4b0245b95a6e7ddec4e827d53ba9a93f6efc335a35a096800f6e5af0cf3b0ad19200d374f4394eda848a997675a8ac339677eab98470f7ec1d46cab639c90307950a7e1a10c028f91aea114369b6c32deda2d3c707e1b581f600d4ed92c9e2c63c686d3215ccb4446e50b8c5809b96345dc4130b27ba794480e4a21c410452176f61ca446b2599c26804b683221ecc50ce27d50d4cc5ea3fa43959cbb042f900163ebad87a93807bf14d3205b8090d8926113f56dfc8b1794b492483464b7f8c19486777a9de1178ef7554d4a82203e84ecb796d468c75fa5b5a29ca6be68dc060c4f9a862cdf3c04cc246775c3254742e9dacdaebd9dfcbbeb5902b87ddcba6d4fd98f40d29cf5bee7d2d763a00a836aece0026347797f35aa2822b02f6e0455b3a6ae210ba4c52bfed345aac56a834b7a89cd88b2d447a1968275445fa75a5dec29afad44813aca55c80aa19fafb782f71a97857c48e69e151a62db6b031cf46de4ec4c19bcb718a103ceee9b54a0a00724e8f00051fc79ca3273ebee2bdca79d6afc9407a1daa55528eaf834f3df010f3b4a4eeb59c9c31a7d410c656c09e61f2e490b7afb15eee6a9e7351907b34493c023f889fb0f088a5d32a34d5e354e57a15a18f002e953da095c5ba40adde919461e8388a01cc89e54c147127cef3ecb56c8531363d57293c9b2a26267af4d245f928663d37371cae6857e614288360ec0ec3031985ad9c85d72cfd0b8b80f395f1867881fb3a294a4e7afa64990d286726e36f70af9e7ec47252a8b78789dccd728bd71ef5dc98ff280514decb972c6eda6edc056233b54294248df217187534a3bdebdccc2551161b819e4c632c544952ebb29e47732a44632b1584e334a614ada71c83281d3cd65175ff740cd1883fb7e258040566c5150aeea83492e557b3b7ced3dab3cd4289f2699f1e6c90b09931db38ff45146ffcaff6afcbcd33705beabc76aa123c497525e5e6142b70b4a0e75fb956af860e407bc990123b27d9526ef86fbbf0723ae413723c1df27a7c9902f543d3eac38b2a95f1b5ce85c87ae06a0a24d5f378fe1ce497090069b4f0cfa9263e3c9fd3cf0225f684ca521f3b4f067bffc0c3557b66bfddb5863728f9890579125a75bfc110555e67cd4b3205e56cd1664309119b09cccba87704de7d0e3e7628f5158e489b4bb3c59e180bbeecc197c3286db5454f35e94a9b7adc65a77ba5e6d526484eed2f7c060660b250aa30527d359648617e1fbf04b93f2c9a9ce48fb5c151f6ba4c2a4291cdcb2da168de8cfc332dd2d6dfb4d63c9bfbd60335a3bbfe823e9e7401648cd0bb03869b6df6cca8e9d95c8eba1cb55b0757e087baddb127e0944b635304e22a97adc525039e9be92143ec70577fe4cac6fa541072bdfa9aa3fc02718c32cc072b74f02670fe8027a1138d64fd04ecf0a08e3985a6681dbd931dcd85f318d3cf3dfd1188fd4003ca32f04452f5d354345cb898cd9e09a2fa78a0b387cfdb7eeb96f32f32f289ac3a9c821b228815a400c42278d2a2c612b8192cbd6069a656c1fefc530c970404dfa77219bcfbf265bb9e74e17bfac7f45e3f6af1f6099fe2ba3dc084fe33d692221b68460999911eccb355dcb0ed35d056b2015932f6eeaa3e1ae9caf0102ade69bf0babefa91b579dcb6e6f59c4382f073a9afdfc7abc36b65e1c2dca7426711d5c044f5772b79895ae67a55fc8f797d99fdde33ddb310f88d103b674a8f2d2a7bafa3b2a3d8e6a1c23e783a83e9b9334a87115db6274bc1e3b466cd6f4b7896da196754e52c8549af396131d714ba8801fff9bc057aec5df648d58d99f9d1fd9d98007adf98cdf77e61e5ca6a8306025ca2e7bd20206b332147f8063f3cb1b52295ff82e7a02911cc424662c2a72428b71a7bffbaaa50c8112c4ee5d366a053f5bdc51b81c53f5ef55533a954038d61bde126f2299b25b332705aab0b1a1660a359e193529a790596150dfcb32aaa53bd816912f155625b01beaba42ac99c51a804e588ce725ecc3afc65db448f23654265b2f0967b9f45fb61a28fd6f79aad7039317a59ff69093085bbd3aca3511cf918a509ad7024faabf3efcc8416a9da988165d689841043334b70644ff9ebf12e14bfdc9ac5abff800fd3c8a6c9427f8d57e32bd1c2fd109fb8340b93052c787de453d7e30e8cbb23f00f22d361ecf2cb4749e8c71e87e7f25677383a57cb1954f2118a1a9d5fb3e45ee2598e8311eadeaa0aabde09393fb790aa889a64206a3fe86961b6048d705da70deb3c9f49be442a95d38b15998e7c015e7b37bcc4d1bb11dc0d29d6ae86fc52e24662390ce378338c0e52c6116aac22f36e96b430e64318e9dafa862b5e5d0cfff993c2c3f0f74f4d9ac99d495ac47019f13bfcfd2e64680359ac859c6cdc1fc77345ef177d5df86b2763fd99b5517332919c0971f09b79b917c4677a490615c951fcf07fdef8a9553296799b20df96cdce3b3c480354e88b83b6ae3d69778986043d79559c73dcac2af593b613cb754c15ae37d7ad2d1efb2c17cc6e449ce57e186c0c314c3c2cd09ee5de8314a1794df6497eb9748097788f4c447570d2a421ed1d0bbb54de04530d0bbc8a89fe2d43fea16365effbec941be8a8fb64d5600210d51a2c4cc5eda3d3cba0250a3dfbbe7d5a9855760b88de50615c58970183af22089a3c9a805353a19a3bfb1bfd8f2e10b98000bd1be6a7db4ae1259de399897f4c1e34d489dfe2e51be265159932135762bd101bb9a0810af9d9eacfe81c11a6f408dd816eedc22cb5360badbdaefe9fdaa1dc1871210a6e12a900d3ab75e827b50c7f079bf781d6f MD = b1542439b3590f2e43fa30baaee0ed11a9c46bab Len = 30608 Msg = caa5cc5d0d87680eafc29429bac55c9e33167d485789c7c124b5c57a1ba8a00b45da41c77460b694cb62d7fa80cf2979e14f0220957aee5b2547520dbbc74fde2913e9d72c83692cf220ff58db5cac6f7d015fb0ea685f5a35ebe8c2329c19a17e380eb2bf56497d2de4566d52d4ae290d13dd21ddbbe0675c89d1c10a91c6fc4c30f683b5431d30839622616da0f74f9c6dc29bf7db3a2aa3095333ca0d1d969ce5e97094b0afecfd1fac5cb4264f882ff75645be30354a1153b740fb78e718753e31a1e607c55aa2653c85b0cf7e7cd099e348bc239870af50450f2439ec29e023153f32af28217a511a04e8034bd4863bafcc791a2d4384e644c9cdbaf472e47cdc720110a0ea8dcb8d02e42b80385ac503f87c7eba6c98fefe957f62c79b8931cf61da92f45de4bcdea72dade34f521f27f44db80892f381b99cc0992c4bd72b3635459dee21860a561a4af33dc2793163e9742edf5e9e55be051bc7ed2ad7505915ca9954df7b9f3b84c3635538d4e4ffff794a0678a06455f91554d0e190897f2af2eeef3ecc61d50c2167f55a6d1e425de57347870194c5a038a99e180abff19c440487e7803a6edbeb66e3d04bc8762c40106833c9cf58210b2c1e764ed8f8924944e4819f114c18a9c8e84176cbe193108b322601fc54a516461aa463beda348714cdb532cdb8ece4f4cc56f70dcbbbdf4b6d05b1030253e25f584a5157dfab88dd0b2b3f58fa7f225457b6d5787ecb34b8e17bdfccaa54f6e0a20f218d511fd408678ad1995af8ee4f510918f341ec983a552e953e94cfda2fbe9bda4676b7f1fba67bed78207fcd4d81f9c9655b46923993c6da4307ed17b67497846c989c692093a59ddd933e49b6b02ceeb81500aa1d61ecb7c24dd634dc8eab28e6fdf6c4def5b1e8b0fc5ae9f3a64a92d3b743684e884832a4acb1b908d27ecd9cedec889c9346d7d9a3fe356a2bfcba9e89365535d08156cf6da62fa40ab97b76b2a63fc4360d7041d050b68407ea7001d202f838003f282cd7df1d17fc033a5c934d70bda6adbdcecb78f3a901bbbbe4dcced9c0e22cb2a334810bc971051336d709a4efabcfc669db9f7542e317a42fedc381363ceefb1dcab7812230670decc70162c20d1b92fb4aedc2b573a831ca4e097700d72d0b80e3a7088a03d03166ab5e329e9338296a5e89646c7a136c9d47c743887b92ebb6c5792769b0e8868dcb479ceb07cf93a0609ce3cdbf035d911f256e34efc4a2a5b8566727005814476ee529112f87d883974dc5420c1e0b8c204c7f6efd6c383706664f2cbbc8e37ddd606078d30901fd4dc59432270c7e779064fe9d6b32b652f5d067e0a9dffc1861dfca88bdfd16f5c82bd705d976be3bb894742802bd23e0cfbd37ac914666fe408aedaab4091d5252a81722ea04d4bee00568798ab687c8da5448f63da52919c28a53447fd820fe3164dbf3225dc7ea50df62f7cbc4eaf25fbe212773a34e4f310784c0e71026e0ad86abdf492a9fa64f49ea0a8d905546a5224aa8fce8db8ad3280784b45a38e010370f4e261264d9266b891a97c2cfacf6a94ce0a01ddbb1f21663faae5d5de6a09e90a882be1f6d1e6ec68fb201610c987aae3626ea53acd4f923889cc29ddaa7e4b55625d5d8497d7a2ad2a6f5124ed4bff81458f64d63c1f8cc98483000a46b3007bed70095558bb63c493b47ea5af29db3e1fcead0be033be89178508f2d35ab0d4960e76079924b845d389ff1183a3e6604db6de5a5e1ebfedbf5ca515b4c7c4f5f8731409dd8618a7667a43071f4ca99e7bd289300a23097de87454f17facd556915873ea9a61ed7fd8effae4b6768d4f16ac2e2b78f313a01f5698f4a85c3a8cdd390608544adf25876587390dc41a08aa9e4dab2f0176faf09df1bda3688cff586f5b01afa3463f1e75588269b7d841a433684d90d09bf4d894ffbb155445247f95d364e10dcb32fa9a1f4f7ec430909015fe7152d30b0443e6035b52a1eba2df371f90acdcc697983e2bfe917bbb5c0a9080b4c99b4ccfcf0bbd3d0fc3f8d0e3bd901377b2d0d393ec1f2e6630f13a503d8f9679abc9bdd6708dce915cf56529a3c56bb602627d6a2e594d51a64a821d978b84f7670a4506aee59e7bbf59a60d8420180c4e040b877f7ad9d82e5fe9df18f50ea75f96fbbc31551b437d9e3a2bd94096cf182df47859e4628e3b79c7f14c6ca22e17f84873826cc37d1a4b87f10da76692e358deb9483655d87050a300ac52dde00296c1d92c9d358d07ea25f9bbb505ec221d10c6b4d1524b5f5d1199b3381061c20aee398a56cff7e8e28aa24e0a032f66d3312d3a55b65b4af78a18fb9cf817b8cd2431463a21421fdd2c974f16ecf12423b6594334108cd5c872fadfe1e39659460a4ccaa7a7f02f228225395c01c5ec7726d769ecef64824862dbeab76152460e16e8a23fe286996b31e8974a00121255f92418f0a156d2efe028a67dffdff19dd08147635f89d11fa25dd371566a5838b3dbcadfe4e83a37716d9db62d93de7dadc324a27d5e88a85a018862733300a7cd4b0a1b18ad4aa77d173ae069127f16251ae47dda89029ddf50208df500be1bcc1e5122bafa66c889b2089d40e0560fccf4f165e5ade18898e636644a67e32d36a23a975a6421131dca714d2361f5b31bedc5fb2d11a7c11d103485f1bd0224739320e9658f0c0fbfcd1f60af2bc0b87871ec9e2f78c80fe28aa5436984bdba294d9e896acf8a16c6366d8842b25988890ddfdf5b37c49d7fa1f35d40635856be5e1df7e89a1dd0e792e6147c7a329bc42e0a3f3ec310224af2b913e4bd7472b93139c55d9349c69a7f03a5bb07ce6aa05f162e58cf4d16eaf96117e51794a690635c72383f9050353760ac8ccf8f8da42d6e2d27a0dde3b61285c9afe63b6ada60f08f16f384166e7867a96056187d45f58ccc29ec452162fa81b9d3cdcb280db6b05c68539771ac9e932ce41fdba21c63fc8bde060558480e0f58cf22d66680d0f69aaad43d0a56367d9786a16ba48dd537dcc282b0e0fbd969371089ffbefa4c4daa5cfa074911bc7179a67f2afd10e5c94f65e6ba63e4c939c536578999d085200c0d3968a665bd3963e20d9c045c021b4446a694599969fb93bf30067f9a1818502a16e3baa8a51fb6b7d15152a5a6b86bc346d11a90381923099818e8bd8190e742170aee70f0af12a66edd70b4602b269a5bf35f5fc03ce3a3f4136db13e1461c3ce30ca454c61e82c3a82e6debaedf50a3a6d706e7eb1561cd898572bba2d204d8117c6ac04c2a7b7c8f41dab137b57b176c20622d0211ae2ca1a6d739245d34de4027c0bb66be1d79ea39d90064def1ea5737933710682842d1bf92f32f8db237b9342eadda8271a3013df340feffba02b044216cddc2d8f861f92c538b0a88c9c4cc3cfe711d7ee01b76aed9cdc3df49be71923330c8c437987b2cc0ff7dbe7ea8177317f3384c19810c953499cf67a6cbe470f6d321f6e5c06e1aa2558e5a3daf3c5a5e287ae4377c262db72ace5a001dc5421c8c7676eb1ff97f6053e466ed1f647a3cd88c4d2052ec00cb4866c041fd3d910d246f4a32fd45e164c228e97841b6591aca158fbe4b8795d9ba3fa250b374e43063b37ca1a479cb156901ecc55d5b815ec7beb3f7b11f7447490207158791c3ef10eb141f5bbec2db121876bcbb7a7a72972fc0b5cadb267ebd57f878c1bcb6b1f5be1896693c501e83148f45a23ccabc020fbedfe0e432e7dee57c61a81f46dfd8d592ed171afc46859f3f485cc9fba6d006b65d396220e973559bb885dffadf82d7890cad814ebbe05e8fad2f489596c8beaf171d7c79eb464e5d65a0275b1abb6d06db7398cfe65cfb865c64e11ef6b3dcb1f4d65ac3571d79cb50411df0f84a3f1041b088062dc11e2d3e42be202d590bc4dfab258994c17eec62b0e941e2f9f4af29ae787cf9d66e8a39130422a382f1f1bde305500afa04c98134b4d63e8e35eb78b391b7b36494a8361ddeadc0f6363f77c721a2218fb3689617a63875d2a9cd1708fa41c133378c1eaa7248ec7c83b7f59fa206414a35d38a9fe6eef08df95ceef5dca28d0b0040d700e87b8fde805f1fb3af05d2f12f1243159d801687cca1e5c15f607db497cb4b6769ce11e2d441dd4a71263c4d4c2babc1f2774e87cba2e5b6aa05fbf5a33560291dcada51276518ad10f1e7263128a9ea0e5902579e69d41ae6196e98cd86008d2bf652f223d1b625b3ee3c44891024d918b199bdecfe9c363a223e63bcc712dabbdae28f6e8fa1f882a6a16efaec06d739047b825d672352cfaad21f18007e59f7fff0eeb0a7bf6ea6a07f6e2cc3362a99dc0f6e9aae53b6cd3894948b372c5205ece6d8921ffad147643f0ac99d9c1a5fc0bf484bdb12a95b55eb89bb76040c0d292a15bb0139678c7b470b768320f1b439f3da18f44a74a1873fc750c4edd1383f266dd555647a9e6c0138dd7baaf5bfce11eaa703e260c859f917f32ad2e7adb540a885216250a5bfd35ba6902270a9078241a30fc2b3f8507f3f4cae98979513e28d756f1d31c8fd273a79c770a8996caea7b221d2b558f63a07025b282918e273e64d467c672fad649ffc2a7ce6b886fde37c40fab011d29239be366ae55da95b79b4af67390357f250dac02e712ddcd8bfaa7422ea4a6cf09b274946138df0010f53b0c6ee6c833915b9916f9321f6a501e4c532ac2c4dbaf7e69ba5facf40cf6fd25481cf91baa1b842a62592bc5dcd72d13c123edffc5a13a2346de34c1f2c63d8a081249b8392ff1c063ab72598b9da1ae0aae88a0136b7041d88162c1880b10d9eac35b16774b4efb9944a852fd00167bae2f256e5b8adb35ddcdb96b034221b55eb49fcedaf9d65c81d9303ab79ae5fd0a3a36a2f46bc58fc537ab271ae7ea7cd27a9a49dab83243abbd9c8931eabaa2cd345ef674aab9b03d43aa9e2578d5c0f469ed0ffd02dd4175866fc6f26bef1d65c1e0c162b4323794665a38b9716df22326ea89c87651e68db80c5c8f9b0dcd42477eac3514c99669341c7f5d7e3db0ed16155fb36f1aa342c704e24ff4812301597b0f6248ea4d2a2173ea77dbaf6dc0dc1ffa4479a1f83337ebd0ea0503cf216c887370cd0edc65b2e3029f364d893ccd4cd202028255dd8f13b0b448e01200e50970f71dc1c49a6d0c4049fa92a3bf8e4e8f62b6366cb0313efa553cc0ac4e7780705bb78d8646b4322bfeb5094dd783778aece1387d49c2a026335d0fee5888800a2526dc91e92d073e23e23bd7f3415a4d173ff33818b7f9bcd5262868cd9c8a96c9e82987f03bfdff6ffe84e2c14c894e681f010d9b85ae36c124c4ac0c27f2bed0881ed8fa7588d829868eee90097717560aec6e40b0202c7de55f1892b MD = 18de122bf588dc3d1eca78661673fa8d8acf254e Len = 31400 Msg = 141fd0b3d111b510ddcb31dee887a3d463461a95ef72687a15c17892375ce1e7c641ba03b6e5b1b32f1e570b8641beaa6b87464064b6b44d7afd842b311f814ebed492cb756cd71781b5f411d71fad436d1eb465a6d0be2311e0dc2154aa093b639fff11f6eb50c33956b1f9c5689927cfd10b0f9f08af874431287c8744a2371d6caadf21ad433fc1ca36ca3766a9dcfb69f34336a5affe7aba0f44b13674c954013b3cdef9d9147fd92a8c145f06ec57ae160b53f1e5121c413a82bcc9a67970275931151639c9dd4a3648469cd7df4d67196ede327a4a908f513e8f4260cfd9a6acc4ae4d8de641e70105b465453b435ea775c0b1962e3f6cfb7e12eccc54f846ddff91e6faf4157634cb4602788aa3596626dfb65f47919fe04c2d0e0f8f33cf94eaa629aa7ac0c076a2e4ba9753d421fe8b2488001ceff2a9afc8ef5408f308788cd65dc500aa8d709376d6cb1f3e7e18ac77719f36bf2bfeb0cbd8c148a1ba32ed07cc720e3ba5c9a5e49e3b7549375c8fc1b7651b6a1386551e117ed6a3ad6a1522bcda2ddbcf2ae1165a10dd5d16713ee8a379555972eaa8aae2b43a63a9c70d107625e4f2d53b4df55271dfe2e100c1d67d036cf310d2b155938bfd4776f1dcb7427abce87da3f467ce87044061b01e718d2de69fb4e477086b2aa6b9db918a0167013c25900bdb551579d3df5e2a5fa31a1d4dc728cb02acb3babd20a24f20d52fe4ec11d51a0ca87070d528a0158c536efb28d2322d5a27b462cbe491d2a51ae048541516798e4627949081ee1aab69cff000289bb38863b34b576c71c321bac357fd9719cf6919820c8e5311e1c6cc86245c312a049346fb9ce92209c99c9c20396e01a7c5a508c8015707d211e466dbbec454a9c983bad37e096d238d1fa83f162fb988034bfa439a7103f7520e1e15e6c0fcdea960a6821940b585b6b1c66715c929843063d9390066b1484e4bdc7ec6d98e934d33f151941563f8ed5bdee25ec3b763f4f38cf35abe788faaa3885c8396738e5c0485881811dd44da24d8f61aa5cdecf905fbb9d1ffbf92111e0bf8488013987fd9496fccba8c3124149cec71f8d2e8e4a00ed38db3f01a29c54b9a3b1dd6785ebc254dd99bd8877433130c8a422e2060cdad88b56172ef9a9f318a84f825f8a0b4016c66392a0d718a239d8e0e48591393c0217292add90db4a50f4c9666deedc9c5129c1ee88cc420b5e9a4e18a5ea5fa2fe6ebcd09a02a0d9072bb8103f3ef045a88a3d17ccd14fdb236f5455bf6bf0ae21f499aee0b98b1d8fcf84062ff4b6ca616a2da4c950a2a00cda9c123e809ccc114b381c4e400a867f22c5bedcaac0a9203c1c2c2af4eae89f6e7de4bfd2a47b50d520bf3f109fb239f7e5a0a1bb8e406992a0f44e2879133f8d72239fdcb83a4514dbfe3fb5cb1f64a17c623bb1705eb1e024c3cf55ddce81da21756b093897829cd26fcc9a0d2c73a1e279f73727227db74fe11b17a968fab70450add2b6017ddfac6a7257e677db8bc03e6097134a418a5af2bde83c710eb6833be4e3a106bb5fb2a4ad59e77020c19e46045bb54481dc0e6f24423775325b369d8c969a25af8f9d74fa2a70a3d7e5c5175f1f9dafd31eb2cceaa00af3fa1786fc217601dcef01b571c5442281656aed38dd3d2ccaa9d4e0827d9c276bea6e0cee200c689aee38a301bb316da75db36f110b5ef3437aa1302659a12d5b87d130da24b43efe21a6dedb286cc2742561d33665df7198b9d5fa2f0b398d3136f38b469c2815651dded134b970b18650f8a21f793938490c15d7130ecfb78b8c2784b9e2b25c6e574322c4dac7cb4c74ea6442b216b7c2d5d32f68e0fe3cc8fbefa5bab4fda47852663c0208ec6034e5b98236bce26094ab809b970e2fad880ade76bf7f646e2193ca9552c05920de37d89461d616d33d01b08433f2fe5a374d56604eae7119e8afe2b75d8d988db6ffea136aba3e703a5ce571b64bc4f355180a0adecece484beb412a78ed14f74d824077a7b5c3d80b2191fc94551de9701f4bcee65cb679a9ea68574b6b690e00838e49af75316b3df4488d64cb83ad06a79e34fbd4d41ea121cad62b650f228e5815f1f85521ba21596b9c9e0b80ce876593d595c3a1a7c035db1fbf7671e535949a1908f1ff4573a58db2a6818fce80cdaf193ab5a9c5657b2bac7e1c3bb694bd6d2757c8348da37d315824ea1b1d71346288610756d82f863f04ddd2b7273a2721857b446bf31f54c9058f91bd4bd75e309b8f4523508ccb87a155169eb7748639ebc9f3002665b0e7334d14e0ca319fabdb3c0ba9deebdf881a7a643cd8024f18a2fa509b9815060e79e3e010290e7d26bffda754c3eb26d2c8c4582c1931e6605352e988c88be89141fa8fe5e8cc7b53c22ac4bec00925da44b94ee6eba1e083658a2a621858cd2213e770bc79fa1e958a69c04223a4711106cfd4e7dfc0c21461f69fb237fa283378413f1e5d25db7e613146798f6b8d19977e76b9562d0f75c12eb5f387fe8e47d78e577612ce3670eef7b3df63bcde567f5ba0e5ff253d2a1ba909a088c463c1ca25367e3b51b41fac4394ee3126e94a16eddfd82b67bfc3d9ec1733caea4d53b8ac6881276ee8dcf19b662088183277068ba01a7b631bc5747e4b47cedeaf503b9a7a197764292b87759410d93f4e6fb6db8e176f95e59173b63236f5200e59cb65c7b19be0199db658cb2994da9196b043f679687e81ca604a489bee4ceed2d094fde415411ea606bb77f54b98b08e7b6b759b068b94d2c2a11ad11ac3c54de3be691b7425ccd7011406ee8de80fb980988806ba5b734d03310590eb03364d9d38b5e2290c88a33e09048fac47139a5871ba47044cc18bba90b5360fa99634359a50b2b443f68d05f0fd43574470b37b8d68d6650df4315136964ad92589a47559c617968a8b06f1725dc3ef5e8b976232202f6ced7fb05fa92549e7e56510a50d728b503eaab3a8e3b26c04f3e8b895068ccc8c89e89b3e5eeebdac87dd0b7d2c028861eef9e574eb77c618b30c899c70eb383451b35485ce5f10a78b35e7461be2895c09ed4eedf03a4c9b0a5bacd117e7fd04e3646ece7df2dd594e244698739f289f1df9428c78566a1c687a74eb51ef856ead706c60f4468e426f1cbc0cb994c0bb99a252c90a78c91d6bdd8433b58e6be21e6bbff5b7c6ade35c8389eb547ffc321b7d023c1d0dc40e62f95d52c9310affb4baebe54effb6cca4fd62dcea9d358301fdd35e367205701c5262c0e363fd281ee272c8005e336ec6eec959d288f73efb894897dd61e7d2c67d26f6cab3bcfbab86d716927e9e3a30dc1feab2dfdbb646b3c4817849f5b71fde2c7cb59cc4daf8fcab497bbd71bf7149e8f7e1ee3d999211f993ad96a99d76f9e5bb5a8baf4665d841d912b7388f16bcb70a0640a7496c083a56c3d49de66a54e54b100cc6de908e4d6dfdd86d098fa90ca99683a356131b194381802d227873ad948c9cb6040793204093bd79bf5aa35c5ef913ac3045df18d23d25e1e21feaa13006b80747199b6d297ab30920e6101882c46d4c8872b8bb8b7d3256a5df0e529644eb052864fb8661297575ced083d3cd7f1cee9f082c63e7b841f5de1473444f9db26a286827fe8026615a29a88320879f9f1d0494ceb47f74b13a0b7e9df8c4978a90b7a1c5481ed80320c1bc7251599c605259a7042fab491cbdbe7c02e28db8e003569047f585d4d76417aaf618abfc0d28fe9d6138039bf0db577b268413786f4c95b224897d935a9eabf272d90744f1fb74066a6010e3ba2d671a9d7fee6c64d6f595ef663eaa092aef016d04f3edbb645a60842a4bc6f52e7dc8cc1886fb8d3ce69a0d3e716f6fa36176693eea8cc5de024a43191cac1e490c1436f065ac34d8f96d02548e89fa92a3bfebe96378add30c022b9f1c09b227827b529a1304e8559e5d635b1e503673165c6996e757dfede846a23ec2764d24816cc378177c341d5609a4b48978afcf39ca66b9fe90d87927864b7a98684bda7976fe0cdba894aab0e05af35859d2f19e8867e501ba342f3a3f9bc516563ab3eb0866dae7e086882f7fda8a137a2c94b514e18aa94a5f5aa0d0f7c0b4c6964b56bfa264b4da86202246b7fb436039330e0e682d5db7d695fbe8f3d00c4feafb3d0b153cdaed102d49c387d95092652719c3604f8789166b9bf624857548a55e0e6943c5b2aeb0ea0674ae76d3875d1b58e27e53bf44bb460176ee53985751fe5b58b291e485e4f0d8e8b08634c56d7a5bc9f6fc7d6121afdce9d5bcede27d26a457f613d90928dc418e227a0cc332be93087e8c4a64d6138edd6f43de70839169f562de18af0906d0d368b4b40739628f2c8995aed6651b87a00f6af28811b92cafad532bfde1faf76717d8d307ee00a0848caaf31c4b2268005aa4b2af83f85ce51a157b6c504325a7a458e25bcd1397cf1c3eefdcf4c2904cc583a74d66e98b445d879f70e059fc1392b75a795305a56aacb3dd6efe76a103d48a38e84707383bdc4bf0b1feb9eb396776b3c71c7189c5a2bc4468c4a90ab40c1af01680dbd43a0ab5279627dd6397970976eb85c1858eb2cadd40e3e44debd0d8654ec0d1ffcd8d659c93d85f05aca5f22c4d2b8059144141d09dd8b2eb09c724f0f773740b74c8dfd841ac9931f718c33c627a385504d2b3e6b61f9f529c53933bb7054c97ce41866316013688e563ff3fd1fe5409ceebb3884034f425121a959df412c615188bebb58772917b262c089f02345e07d0f0a33dc2957bc31960ce9035187b14020c82581c7d347907b561e28998c0afb986156f93dd70cd00da80daf082d6050947ecb35b8dba0328a4bda2beb82681f7108c965a598d9366fc7eb6ccee61789cc28d6fbb208cc9f78e5e4837fefa2f08347b5a8cb62cc6ca2afabc10b797ef4b10e6d5c1d2170df2b6d65b7bf9b6076b466424815fd8d7990a8763727af3c982978b9df61ef37fb8d2a8450124e49baedac97cfed30c3651ffc74558a50fa7e1dade10ce63ac6fa85666ad5dfcf05c31763ddc5bac4163939f1cca39d245fac76f60e6b14c9c8e4fa673ece90e73d9a18d13bb0e38230fcc5d1a7a9c6f2142c1a9b68855466e3c1d67729c48c5e9945da3eda1ad22fb6b6abe22cf06e84c006f3e416e10cd7bf9a00dc533e3bfcc0ce43f4e18aee96536fd36d84fffea00c40e8184107a6e5057660dee3c405885b3c3d3a79899f7ead3025b9d65edc0fa0e4e081108088585d5edec702de52cc1198af57ca9e4dae6c0089104b96729823f9c565acd31cf86e5962ddd7158a8e8be98094fb5160ef39e8e7b80b2e27053e887e0d3c88c88de16fd46a8bf0159770379a39352a4009bcef27fa3dae621d9898f3c1e928f6de5da81cb445f85baf698be48e9fb256c49c1d311e099e8da7da310cc9db3a0db48b0d22042eb3c59d1eec46da627008e8817aed6c98870f6cab5bb16c394675d713a5cfa16eabb92b3662a867a5ecbf3c150f432c12f15034b41fcaf32bd4950f9c7909 MD = e4ae28261f24a10355fd1aa1c2554592a331ceda Len = 32192 Msg = b85e29875f6e2a2ac2a2b8475376eaecfaff0f76ad2fe6fa415512e480e3c8de7b74cbf4220d9af511a3e71cadde4cef701d3a6881ba3253888f37f7c0b983f84e9b797cd126db8d3a583dbfde03b912c9d0e5195583025cfc8176fc6b8f7d95d7dc1b68944255bae4c9a0770d6d9a1bae21f8d25213bfde4632b83aa8ee1d7dc13e990095e87043b7fdf98d62a255d3c6165bdba0f1d2a20daae3faa05ccd77b2cadb8cf9a094f25dfc3149062c5402babaf67c66a5a16dfaf2e0847a63f54d5287c954ebf3298d7bce2ef32193fd703112b1fdcdb8960ab51198205f8bfbc54b7d4ca0916797ddbc7cdad3da5dbae4d42875a5fcb1183fe50ff216775b48a842b44ab7138646aac50c1c315a14f2284b0328be1b188ed632f5d5ade95b44bde235ace29ad89ebc4189db54c93f0c023dabb48e5476629546ca2b2ede1357ced0075b694ee408dad6f801854e67723b5229ff5ecd52fb45c696dbe17d0ceaa1b7323e945632eace2c63750c11138b9b3384f375ae34c1ae5d61cd0eefcd63003dbf3caada4aad5eecd11f313bcbbfe988c4771d20a41c97b134e9fd5bde2cb10ab53ff504b5ba53be4be73cf41876eff8f2729c4b2b74c96a1617f6eac8ab7cc71c2ebbfafa787449d8b574638018732c14ce3b5650310d31103f40c4124a2b1cfcf045e4a14e8b36807122b18d0d3ecc357242699cbb29ae29492410447084b05e6fdbeb32a65e2c4b038e05c7be187f5a46f9ae967be588691deaf7e784512c4992c53736e7b7d442530088b591c8ed8d32a74ac6d70b67d8a3daa082f05837c6414aef35785cd66c4ac062dfef18bfd51e9668b43861f57fc43b339d1b627adc64b33bb5c315d9d2ce15bacd41ce9d3bf20c2ee907b1d7656657dac06d369d93e44844402fac857ac849b808edb32ec59652c4ecaac1b8927274bb744e9e47f3a751325d24e7846e21a286175d8f1b7df2b053458b593e0fd1dbfe402660200596162d950a907bb6bf694982f72a0b6bef6d037d104311e369d4ccad5d45d1d099df5c6e4a6d15588ce52cd2254ba79673d3fb1ba346da1624a64d425b15025c99f3e7724a47f85e6f60548e4ebc9706672864a7ab2941b1e99ba88789985ab27c9bf72973e5cccf4f20ec3ed94382c3b4b565a990b5edbb9ff906044d9582d92c1fb41a2d113ab4166e1a6a30a911d640c227aab9b2873c30098e4210d622d98fc745cde191e914ab92069bbab5eb46f597d23290e8b63d831369c83b21e1bb8fdad2caf52e83f7f6d4da58df31b81bba7b8dc77c1e23c4805fbe1e343f678613a2859ad3b0ad66df7cbb2a07e3225d76b880f3e51e76dc0f34b6cd65f85d42026584c4e1df11674ed1d3989a95cf151394d43d33ae568a18dc795c34136bf8466cf7d0898357052b1c4a2a000d674b7858b12dcf976bd8839d2e530b5a38afc6ff0746326327455ea54868a21493058d4b3e4c1fa05ecd38c0fd3b51936d6f6a66dbaf43482731cfb4f4dbe671fb4d3ab7a4218c93d771208c0f9a6e87b1401ae89d9326fa02d06791760a35ee462a67e20a357f377dcd214b8cfbcafead2bbece727842415e2a0c84f77df8511ca5fc15990e5e53f9e824439ce3cdc009373e6184e8ffe5e448a7d49fbd956327c4e198793692b0f2cb12be65dcdf946c6d82e6fb6ac5ad3b3121ca955176ec0c91ffb3d1358416117cd102126d68437ed373a8ff87fc620bed60ae02c101b476143caec9919b4cfe054b57c91fd096e874f7eeb6c50cccfe854ec80d96a0820b5481d08bd43e1c606d6607b2787f525255f7ff4baf5eb3ba00d25fdf57ba1f7359b7633c85d74ce0bd0c59f702dd4263805c24e4ca58dfe766d3bc9f8cb654572bc4ad072dcda525fc2494bd45532dc4fc0ca5aaa063182ec03b2876befee75fd392f7125388efd83296012fc847da1dd1f1cac4b8e8253715f1e98c74f9a032580788857f70f2a0684ae8721322121508f2db5a9a4dcfa96ddd4708360f4979c20daa893aed7526a52791b1ae4d9d54a7f61f96cffcde2cd0e78c128ca8a8db198ba3460a674211f1174312222e4383b9e7df9ede5b1a6a47f7fed4ff2c87016668bce37a461f0a540247bdf52fcc4a43ac639a4fd44a08d9f5e7731603ac92b18e3d880ff2d5b9d7cee6dbb2b7ff504f2df3b3abcd38b18fc98d1a5a96df3700e46e5f53d32cc581646594de2da53ee452d71078b0aa0b6f5b39ef514bea985d52968dcd51ebd75bac0f0f03fb86bb0b0356db41e469be8493321a858b945ccfc0ff3d05d5dc966b8e2b75a8886a70cb28b9398bd13d73d35ac2c47ebfa42c5f16ef9584c5c5abbbf300ed563c19042ca94954e0dfedd266962f15c24de3af133cafbdd18b6fbd53c1d7a0947f5a20366e4b54c77643824431c234db9f198ef51b87de748da27539e2f8b6eab9f76cf25f0a61c9fe052c7511c34a511b0d700d99be20f635257b773cab56e052b68f6765cda16ddffc7702207a7eaa2b89fe619f9eaadeeac27615b938a8ffb260329d66db3f3b81f00cf2442ef9703653e0fc166da5b4133f0e1940e6d5ce42bdfc9d4b7d61bb4da9924d6729e22aa434bde3e47438011a65ec8db8ff05d66894966efdfb3076a9eeb21b70b16261dcf43d20f3fb8c4b66fcb8780bc95f9d8daea718639dd3f3fe881465470fa19c485b09b9294ac81d5fcc19e3208d0cad1ad4d8a464ab72bab5405f33d48bc6634f31c9b970a815fc6d9cb8d5df92348e75ccd119ea6c375434dc3b8bff6cfa3e593d2425af5f9b72f8363d563022fdc6085e397fdc294848e5245277b0fc64b6ce48c307ceb5810668604f6efb8392df3a54b9df212acd1e2fe249fecf812d52171a4e66b4f3f04125e3962628fe19617275f840a3b7ef5f79dccb2844447c9b9a7b6c4b4b600fa99787bc859fdbbbd21a889faa4918d5922ddb7efef78d7a18c033c5bd7a4607c82713669449629fbc99565525fb94a93fb2a70a87d0a44e51f10902c429ebff263b513e5a0cdbeea657a7c3baa17490ee700818ccb8d022ce96c7cb68409820493d07ecdfd18dcf19bc4290702401b428cfc650d3955a1b181533c7b2a89592bb93fe182b81c16b9c30f165506a803d7437a859a6518a63b6d8169fa9472a7c04a7fe694702bfe9b71b7aea605c3c535b1078dc4dd2a822304537fb56069f06aadfcf873a3ecf72f2e5a6c6aae27c1c64c2fc80ce02fc7f0fc66081bfcd3b5a37a5381b0c1b392ed6f63da236e587c317b5fdee33c7cea3d9c257dcee85489d336002cdc5834444eab607250a4ba66efc5142cd840b65b619a1e5b2eb140cfa2477f5446e5d39ddb68eccf830fe21469cff95c6c7b50adf54cad2acbc64d0979454d9290f916020c3e453c2b0e440727e25bc8106ad054614a7e6716b5cdb9c0a5e7623ae0601369821652c90e74b1a2a2d80a548db9e14e09fe9aa00e377320ffd94db55a66446beaecadedaee8968297da9da96271d71411aa2fe81e3ea812a99faf80b58d179bbf14a7f96e04382027fffcaf779c984be80da16f8437db0e39a7123d9048ff71954acb7caa7c1903d994a1b73b9eb76df3a59996ceb78e7c269c104c592e7e75f3eba30802a4bbb6335517512cfcb6e2caee730e6c22350506cb242daeb217116173a8fbf51292afbbadd81dda3b1952e454c836db2c510140c0b861df585bfc546f57f9004a2078d90b6e6db1de5136c674f3909a3a85296b1967798995af6f435b3a6f92bff77a11fa44d1426ae0f6e7dbafac27b123c5fc419be52c0ea412c4b3cac05ae89a4c0ce6f5e91a456b1bded5370a1234cf6f6ab5d0253507bc6f3f0573ab97585b67107dec059812323e021e341ad839ea9e3d02aeca43356add48ccef81f693ed53d32ba1c74a35e8a5f7f3115ef834f7daf9948244c4fc31f5487678d3e70fb27abb5cb19ebf44e11c37107956d0ca999e1707e51538e0944fd4aeba21e7303d743f9d960c55a3ddd935e2b683104f22601bc951bc2d67243563b21dec85b9f0b8d66ac980abf711957ae66374355734b98e5562ca0114444e7c3d3ea430e17ec12650b6ac30a33eb98c880aaa9e574312d538629f526c871394bc76d9776b3a1595cc07ef723cb7bdc1641686d9e3dff486df0bdc9fd46f0d339c610cd7abb52eab4917baef281f2aeff711a976615de719d5b8e257e06e93df6987bec0176294ed6470af05e9d7893ebd7672d2746f6314b8e4410914f8500eb0555fcf52d4b0c28aad2c651663415423cf839c8166e0fdd5288931e6beba37fd546063d28e3ac14817c37b3254fbb6d6874c231ce6f94bc6f02b50da045ae19cff810c1af17b70196af4c6a23f10dd22384d14ab5204650ad597e4637b8aa23bd1025690a0fb457af140c5fa54094da35d06dfb15aab001d435f6b1776e1e0465394a1d80f42b7d95527f7af667d7ed65ff9e2c34345738ab402637aa8f92248f1989c55aeea4dd1012ada45d8c5f747cba6cc55ce7c55bfb1f15be16428eeb0558e949e124a8dee7fc9fc321d8b2d543a8e0aed3eb81d48c7dcb2f05b09bc18e9f73915abfbee8e4b75cc08b725a7a7f7201cfe167130926005173bd01400ef1962d8510e66f63cdecec84e382dfc9fbbfd810d08304649150ae70875c063af7e4210e4ac242b76b4258f67132c72c7e386b5ae669da4b9416ea10aae974ad683157124f7bbf4d8662a7fd7ca89c0acf85c4936d3e2028f9fa0e3a70d212cf0c27d57a68386e8be6f3e1834e0ce5cbb74deba5ab2d5b6286a321d61f3c6809aa6ca52fdd21d8da529e0f6f2d872bd6fe38e676e95b156104ba2bcb0051ffc10ca8cf18f66084a3930b37a96241f5956cf0bff06ef3d58d3ae635035b395e60f884591cfb1afa4c71e164183461cb6fc81a7efa841b244ef2d04565781c0d4f37a74d25337ac33fb4c99ba6ed0f35ccdc61297b71fb890cf22066d99e2195f591bbb21ae7a566e2246ae63ad475bc146e6aca5d7ebd8c2f037d9d4716707db9cd6591e25fc66b9f896d4cbc30b8e7b047e06887f386b51fed8ff49729324d05b54ff167e3035bddaa79d6154a033f062f690ce118818d4478ff72b11c8f8e400f21da90bb84bd0350378a2b6a7c4b7feeadbd5334d39b076c751f7e3aaec7d1a48255452e72197b434e72e7d74b93834b5683c591a767ce909804e4cab880223c1b686e85f5f8ac4b679631db999f7b0f09661f75237a02ad1128cc13d4419a9f941ef40934e0fe302afcf2bc8ef8cd02706f49296f5b0c8b87941f5e2b93a194947cbdff585cd9b93eae10c35125e3ec33a52bf5b49252f2a34ec3f3e5fd9fe4c38cb2b288f1a5b04cb475380bae2495fa11ae201aa83eaa0d60a21a2908fc57cb55bb69ed29cadbfb140763e31cf7c56cb9b8f4c824377a6cd1a31b1f3a21b551dfc16baf8bb002f4d8b08b02f5c64331a732b7e78ea42c69aaad3df01e74c60033aa01f59fc0efdf0857fa8fc4f8d8f2e305b29e6fef86abf2aacac4395e527d586073e7ee606963aae4f6b30ef54c5773172d164e7f51dbb18108c21548207356c909affff93728c83ec8965d24670761527076b3bc54a0f01a40133998f98836cf0b725af422d7694fb85f38eff0abb59dc2e7260e59a3b65db9de2db8a564ff59c05b88b7f21896fe0d3728bdb1ea75df6d9130dd26 MD = 290d124e77abc911e4be375232ff1798c4b48cb0 Len = 32984 Msg = ff5be1eca7d45eff12e9645ddf05c1735b973bb8b06f6c32596bd13cd9541d86ad03d35d7fc8132d9c0cb444a83494d891c92c4cc1d668af9892b586193f5bcbe3520d3563d4beba4908b753384ee7ffc2477a0a933aad8fecb7e03c547aec558a91b8fbbdc207afff279412f81b61eed75a4c7a8e63e3da3f2179e6f1cb7a2c8809fb38f4589513a8af74094e63abafb948ca251b19b3997819a90c5afbaa59c7ffff73705f11ee2be97ec1a3ed6c4a4e591e92a023c5d37fe79837f6d226e32dbeeb34999e2248701ddbc160824dc580d76d49874ac0903cd36dee2d1796d2a48de804d7df712a5f93b291ebeaf62a3608e2d336564cd8972551ba6794a12f13b31e6992e8a69be0922cbaaeed0e815836a2b7170f12b478246b220c0ff0016179b4ed328268a4db6371c30f523ed0cda7d87d903cba2bc719e4ae84512b507827d3181f755f4c384fa83478e32d217fa3aaae0ba7ec466c4ce3e63822f9243f05a271c189349bdf9cfa965066837b557440d1ef164f0c4f0591538e4902869e5a4a8081868f99b8928e6fffa4eae73761c36ea4528b85588c157cef90ef7d7d70f2cdc533174fac7b8d4aed65086b0db15b0e922349b9702898e9c4bd6812c48dc3e1f65975c4a19d1eac82718512bfad2f38215031b17d2342237399144c5bfae5437dc0510080426a1f268f0ae1369d6874b9a3ea7468c33ab166ec9c332bff7f7bc030510c32b0982a41893fe258c92d4ac2e21d0a1a51a91b037ea7cf1ae3b912297120ef9e2fd1563b25cb1c0e78a743a4d6717c7a14b6eab416de2911f0bc8f1f4a64b1ab093d297c2c579741f3fee6c7478fd16f568aa5e07ee948f96cb07a0985c65b4384032d6c658a5cd78359bb93fd1e11e35d4cd4ee7c6f34b8a0bd5c51e8edf44dea4cea739a0d72ba6ee04b71bfc744bd73250048d918f638d409bb5e3c8284b0813fe7fa9187e1d0fcbd1dc7563273e5de3db0555c8e955f50bf2298482c14569205ac6713a1b2037715bafe8b06a642e6bb6c7dcf7619175b051667d694aa2664c5c124e803ec392513a87f24ebe3bed5c8bc28f87b8b473e032133ac61510841a8af97d854975c50dc71b1e98b3440f18b29bea143f2d742e3ca64933c0ee46fd6fd2aab3cbc533e9b9cfba48ba0b1842d3aa7907656aeacca996253cdeba237763344286561063776b2c71b962ff7d4d5784c8ebdbfb6c7e21796b4bbef2be1b0d94c1974915d85953a7c1752eafb2aac691362c036d6da53cb667eaf2265b5ae78ac441451406f21bc816067d8a5cdda9765d626c2f62c453e3b78508d39fb9597cb71ebab973c42c140be7e02de07868aabb0976cfe06dff67e6c47378ffa90bf116aa1a64a351fd020f93f6e8c1ed8c84bb9bd3bd7b0497d95203b2950fbc477e6f6df4a41a2e17189d85126985bf9dbafb93d376772ac5bea5cd56962465c47b2dc4da065cbaf2ce3255d32eb06114b3d78c26897943016e3eabd01af237eb7dde592af9cf7b28a97a60a986c67479e5fbdf2d7505dfc38ea919af81eda5350cfd95680cf6f12120b24016202c5c45e7c51758b781739496618145796b20299f1804319e77cf64da866e998976ab012fbfdf48cf8080ecfbf48d42501f4b31ba9a1ff84ca6486c1d6366b40129c3243468717e3b978a4545ce9826a46e9905c600632c9626fecf8fe5a2f645aa47278c4b78597a2b1225fa7c3c62f4dd6bee67f7585ee95e74d7a869bdc0b59ca9939dd57e7b09afab179079d467bfe0668416cb79ffd4d12d4cdd8c11a3ef655cf0ff92de4378b9a7928e440ad5641c0b4f391942afd713aa67b5a949304198f3b80800325335cdaa1f7a775a1c8fe4bca8655d3cbf7e9a5ee0c76dcec65aabe0616da9f51acf502526bb602cada1df0d3821f3e2cf29d9bd2069360d069922b575970c911aa3e5ab30e7aafd29386f7f76d599bf5f675667af318e9e519b71e57d0a84b0d361f29ed675b465efc21a85dd16ab3ce0c594d0f5a6f3fd37c02de2e03ebecec5780b927fec28d191bd74a2e35ba4e5d3a3197b9c4ff2a439a5bb5037aa273571649508a5c154ea8fa8e279122b1344d8ae58d9fb83072dd7cabe9febe33a9f57962373e08bd4fb6a12f85af1fb72c44045d77eabe6ade4829d8c3495608566f8bb3b66a8a2359e916a3adb0b434ffeaaf819dc15e15372da9cc8b09ca87426c512414366bae33e963d0e7bb699075e9933a464d21994533056d8969a31a3495d59e9bcb32c5a75f90a07bf8c73356e6b86ebbb68e5fd00344a5058f6828f5921e07915167d27bf3a3fab09055856a8c270645232ecda0446e5b46a3a1194e0a34493fef933c784ca6c5cfab9bef7980e7eb2abc874c7c9f8c7795ced65404a5204aedce3d6b6613a0eb207022d74a6d0003b2ab23452ebca5e03a379043e20ce9f4e316edc70def9a53eb0871a6a6f97b3827158a1e7c42c1807d08564dafe7972d68ee2bb834899be5789b11c555cc5f71cf2542412fdae83ea566b1da32dd33dfc57e80a6a588ab890e50889a1f8fb496f400d5140f2b2302fc7b28523497c3f143ef73f92695d227f74f608fccea828edcd1cb01e3de79b4c86f431e7dbd524b28698d19805819a779c1200b2384d243cfbeaa6e759af33d526a8aa4d5f6e5d5bc13546e7b7887f1ddce5176ed06ab9c17effcc58b089883e293864d04ea867749165261de9e25ee6b9d7a37f2171681fb8d486deecf706fc012be81d1423c19159a0f587371fa846a5723b8fa601adac2c017ce669883e93310baa906a610a369c612bc009a0e9c2423d560cd89bf8fb5aff050ba0bdada84b5032b69bd08fd8dc2e3f64ec0691fdf2a169732390d891c835b5bb4cf7c28fc282071c3302f0fc9b70a6c258c14f3e49371c5f3180dae3f63e0571a8d71bde19299e1dba68ac265cd0f884ca616027b876b52d6cfc6e7657808acb5ecc27f7b1af7e57bc823fca82b7bb18db57732eb2e8ea7a406401dd7ea5ac24d95765814e9c1e4693e01a6dcfad64eae613f6d7eaf612a24648436dee05f02aa2f952ff2267f466eaf2ca94761a6c97854779a7a336c442092991cc0829dd2936328eb5efaba7252c4adeb31897589b33327a128e1385d5e3887b5c5f99e9bd1d93576a08df8d2dd248b56e499caf627a9556ad0e24cdea8fd57eb376deac62d38c7b70006c4cdd777ced1a7ba2e789b5c0bdcba5d302dc48910a45c0507b96c29e396c68da3cb07677f43c1142877d9f450e12d7b6db47a85baca7eea7fde595393fb394c1f34369aa4967bce405ba71a2d6073648ada94995e44e344da9cbb5fdecea268bf712cb848b11d11fe8cce76a842d23f0f06d86c03fad33a9e5a59f4cdf7490c0be8b16a707cef04eb7316afcc6d933485a210a7b1d498f45582fcbb665f765e8c028d5826df38d08e76466d9ecafd6d731502f170ba799b867b6c5bb3ec7186c927872971c2429c6ffe285a28415a0f61c777f34994bd57baad717dbc8781ad4bc069855a0d53911774821c71bbf045d7203655434aad4f7880d3c98819f0fb9833f916e7a8b4d70d3e1d5b811e09355e8809be67c491ac485c59e61f8804973aea0081227bad95d9c6c1c06154eb077d67b6d6bcebb195b2a9cd7d89be06aab94b4571136f85f3047235f21843dee4bd2506464aa554333fcff535cea13d5b9bc0928cc16a861a15ac439aaed52cf4a52ac1b619dbc3ae763699b7f71bf3d36ab0ad7a3455f63294dbb1602cf01b5ebddeafcd3276472de04683ab0c136e39ad835fe474191e620a6648eb997ef54b8daa97349c5c26d803687ab71370f8b6eda070728a9c46d3feb7d0e4fd6600e29ef443935f77a8d869024586161cd772b171a8cb7dc8b6adf83511f26090854c7725799184ad17559a7eadbe1cfe5394815dcf985584b5178048d3becbe4cbb0a0a602d611e8b9761d427a082efeb645e5ccac801ab78c391f58ddf0454a1c37a2dea60b110fd86479b8740b530446ac6626082cd54b843c5ccdf82fd7aabe0804342cd8890aba473946627093f84df28bd4ab438e27e348c010ec2388ecfa4d4e125ee483c1a746e2560edef6c2113edd3c5d6e4b33f184d287817560f8182b09df02d8061ce989fe4f3efe854bdbb9e3c7e6551657f8191a9b7ecd67b660ccbc02e15b1b03c7391499bb784779f28a25dd0d9ff67b3e2f20b4add2a60f1a58efe5c316c95e887ead9c4df34535a0db2be79bf5f4870cec6d3bd42d24e98df62aef70b01815757f50bfbb1785682bd17e4b59fe1663aa7b8896bc86e92e02cff688afd21010d665856dcf8d11f8dc96a5730c6366f86002f92f2d83fec4c10bda184924ba37f357d50b4ffdf1cffb5228c57fcbec2c76aa496defcf6a9512d15f07074d1d73137ec602040e2bd3d02c90ab79dfafe8339affb7c91035873d490bbeaff641aa7f02e2bab669c9eea24d638cc147b715e1fba37784ef6884899d69a309c62fc5800ab19b2db6d207bbdd2cd020aa0c99c6f4bd14e8130a7340f2fe1fdf66eead5cbeba0e309c4f05610370de5eb0b75e2aaed6f6bd25233ba873549bf77d86485b47857989c347d2dde7b9204302bf4a57507585cbccbcc60945f27d1ab40080c7cd9a45fed4c25577b28efd96482c4794032329dab1dbfbad93602e10b3633ce67782db5877c976768c78dd2129063c28ef674ab17b8bc2db832717a121b764026ec4a15e53621d249cfe28aa4e56105c3bc95019d3d103da3dce9f95a705df61dae801da119832c70ba847fa5f24ad7810d1a3da61b7a6f3eadd2db3ec54974be276629258709da800fea0d90376fac49508abbccc44946eb2dc2bc499ac730aaef72c50d1f4460fa4899c0fe256df87f3f5d087bd80b393bc54009055155be567f3c6da242b16431fd0a363a5cb440b51217b02db74eca931cd14dfc998372335f09af8f81df38e985b1e9ef4dd1196d81212f6cf2728fa38cdcf799c3cef0d3f780f74f5d3c63637b3738876952e71af52ff2b40a14dccfade9926770a6cebae128d15c4547884265f0ce9d4fa84e40069a869d7eb44689f87daad02089405a9477ca20da8efc08ae74f89b615f936f0dd77783c0cf6164e51fad7e44050a2599d45e477d815328ed4a630c2ec76b1a938d21f160c4a1e2fc2616cc6ba890be69e4ea3abebd12257ad78a5a38ae49b530123270df427c76b6477344f7d258977d200a651e90ad710fa2db1fff4293d15c1d159cacb775a2abfa5f628910e6234c0c3b710dbaa9adf442d1c7f342fdf18ff447bf599211f9359517cf8fe2ade46f0009c90c898b3ec11dfaeca50dcc98443e45536670d5ecfbce58c68cc6347d5ea1d1e7ab8bc6a60ecad2e89531a42801619b1333c235f0570c7ef20049fe30837840576b3fe06635afe666342d09334fe4b5597204b695efb616dc7aec8fc085e9b192bc246d11ce53b1c0127e605c985e20a081b6dc602e719cd05d0c5d8fde7cc2242ec7c11b414ca190a0943de673346982e3671bc18bc59d984747ebf0e5b7ee7623a880f536f142527f1d166358fdfc7b3783f94c9008857e9a1dbfb6340183134b252131f7f810700e677e75c21165f3ceabf963c3d0d10df60c4d3252104c8605fc36543cb7a893cf01da7047151277492da099afa52cc0cb8218e7c83a9748d46c14ce5dc65718317abef5308f9e8007a76370ac0be5218b1da758ff06ffd637135122e38ab887f640a07746d776a8baa7c66b516b96cac53d7d087efbe2a8ce708fd4569b596d6de20378d283175bb28d5dfc284abe070a701e78b09fec4adb0205652 MD = fc8456f92f8a8bb38a3248e988a3e12271061510 Len = 33776 Msg = 9cef2854f7879c830ba861f6a92ef7025fb98aecf1520fac075190f0247dc464d776e3313550b8c38681f8d03ffdd296319fc764ffcbbc5bd5524e76579565c8d8ee0c05cd4b8044811c86030a70026c7b5ac6d75b9aa88f5679d7d933f56f32061e4ad9a7c01a8d6242b498f0ceaf0ca6b32e4ded07facff290d4219fe5092bc9d046b4abf7ae2793bb2a96db6100ff1b6fa8ce9d59dba4115dec5782ac5b3a89caa89ec13765987a4f8f05b26f1ecc4159db6353da72951baac882c6938ee7aed5179fd1ca666a81c68cee5d4131fb7f387013f7d0e82a783d0faa52e2cabaa0b93bc0c3f6da240fe7c858c31f60153fd30ee7718464eb91de6ad70ee1363cc83ebd087f04e94f8b7bec4bce50d3a1e8f35ee5a93e0f61cc578112e2d7fbf48c2c4580ed3cba725f4a9fcf651eb327e260071788461013926ffb62b60e406a554a7a2ef6e57615f21c8aed70cf282f94e2b285f4e390894ced81d072cc2e278c61051c804844c1acb954acd8ac594268410736d65eb74c609aba63fe5aedb297398d5274ae4dfcf5e9a61583fd6fe7c544ad3217fface3383e4f234200a493e09abbd6bb5db9513573282e5a0a91a713b54d819d0e98d63aa1e71827057c53cd4c37b23b9eaf45d4208101451ae809bb5a8e2c52d3a2aed08a2b4b93b39c79c816a8eedeb857623ab85a962d779c9523fb19391d96f3f261c2c2c36f502c8d38c2b7908bf5da2fd0035af3f867d4d3b46295b3e59eb22a54125688a425561885160ba22a9b6034fcc82a229033b84cd656ab9f943408df13408ca3197a40a116db4d2ba2f310fa27d1712bdb237187f29e030711a01d9705140e1bb59712b055d82434dd451308bae4d814c37e270c6e0344f2442a18dd925884f862c3f5cda9d739c4c2d991e61bca07e72f8e0164b44d1769151a223622d29543074711817a9e33e339f6b11db44ba5ac069928162a4423736cb7622c1d4bea038b6b8d5331f7bb992ae59b34ec2e5a6932e8c4aa3aaf1118314a0146ec8c2b40d87791cc34a879ef7def78b32a3dd0289ac3fca94b5888604c1b260df55aff02d5b34772ec7914ec1a5a7023d83eacf02671f89ac4053154a572fa07a1800e526a67d5d0c1343599ea6eaa0b5dfa99cabe3ce1050f7fb4fb2597a5be58c401377fda636b1c9f83fcd3754ff321393dbc4a6adf72938eb85eb2d14eba83f080bafc551acd6384a720beb586638cc240d1b244196ab8f9e583356a1d8188ca32e2c920217d00a9480a947778e4065f4b0ede12b874e68ae47497a83b9dd11bc0b7cf83a10359d60fc43b034cfdf7d6067db71ce31985075d39bed4d096c4aad141f4c6c2e8d8d5a3559da12b37c7f0182523a9c3e0fd39f7d8943503f2cb410e892130abb3e36daec5a1993d19de752a0e0b038051b7e85b5b0015fd3b4da61f963f0a85ece465d51c2e32a92ba42de341587041f419dc31c9e9bae6f8b2a2ab70349c771b4286c2632eb698f582e0ecc5f0392e528cdc202b396de5b261fd5a20ea2eaac965981da2886b3100de55eca2bda670f279b2d088d77622f0c47fd6ad4708467db5638ddf249a9dd321558ce1a6fe2f5c4624eae8ab1dc63a42f0c41f357272c09aaebb24ea8a03f6b4a87489928b92195dfb16549daaf9184317cf7f9bb356197c434f78c2858cf2fd164ba26b93c2b024fefbd29564e2132fbd9dd460141b10c3e8f0e494d1604e6667b935185fe7a905f7426d7b95aab26faad6266edde92dd766466e48b7a692566268488137288d66ac922a3783787e69a6237dac56e7f92084fa21c67f874735d0fde68e62ade3b1e79413b17675fe86792ce202c63efb070cb402f6712af46a792314272a9f334d6ef02fd2b8c9ba2eea985c587715bbf2c41b1bc0d5b8215f2580dc34d52606a2094d8680909b3acac30ff496af95c24a76d8730df258567b9cbc459dac69e218825321a4451307c0ca3bb1a5b7e69778e89312c311331c26a580574af7915217a0ab0727205ba87ac8c19b6bd72fc3e2e3f301cc7a70fac80a741b23fec5db072afd40ef6998a55e844cbad15699ccf22ea0470e753879c9913f9811082e0750e9f0d5e668f587d6c88217bf7e4b3c0f9343ec734ab31f920389d7fa5ff35d5aa52dcdf36498d4495a0bb91e956d9aa0d884f9e24008778927fcdec8493e658e255c30fda7a9171f0390a8d4e4296f0fc60a7542a0600617c73eb7610f34a852332407ee7751d5bf8bb9edcbb3a542c3257e687db2e256a4a9f76aaff9ffad0f952d59ad1db79893ba2d8fe94a099b24bd87da7abeb7ee9996d0fd984ec7fc2e14202e22e105e70258959618f07e029a55ced4210c06565c56707a0658b31e1578a58e350a604b742c980b3fee2c008db7fa5d5ae4f81757b181e8e05dec9a2e896382cee2f24b51ffdff5468c3a1c65a9b47e0d8db5b8f16fa8500ea69af8e00f0311d5afe36f0299115c1412d0df8af4a43e225064c191578fb9777be3c192d12c4432ba5b3fedc2d74893c818d0656071a581752dbaa133de2b0523f27cae988722cd4b81447b42d9c2aaf637775cb4c4bb1344392c88c93daf9fe8edb19b2cbcb38ea97d0514e0bed141e3585cd8ba4489be04b09faee1524b2d10fde9c15572ff5e1e780a21652f7e41d8a10842389a166bffba997b45c80998e449aa88db510f23f09adc089ad3d0901d3a0200f76d6a037b7da457bc45f1c6acfa7f588503eac7680a02334453cf17fa4cd27cbf668e6cc12447aa0d710aa0b037ed991c2d9830cef104082e5683beb7ff011c572d899019d50bdc01f65c0e37297eb3697a22486a766bf11f85f56e9b7a164a89696355cab876556079eff98bf7b90e318f8ff583c2be55de882c0defe6996d1bc225a51ef7127df2a5cc47f2ca26123f17e72163fc859c34063084fb6a12ecd6e2d6675bb767bd7e1ffae2b5ca4e285ab832b3504d492de9a70abc072f0a31826e7e83ca23fb7bce9281b01c1eb8b6491a799393dd9072c514c19c5b5d09a3e71125e0b3605920a8a46a9b6eefec26d5e6c4a974d3e5d290f55d0b3f1b95aacc71d4685e990615d5fdbc8af56473dec6c419dd3a57cdb511f1e7f3fa9138aefb36930212f48bc11d467f64f7a6d448e45b82172f93d28311b1663bd5e879173a0968961999718b4727bb13bddc97caf654063f99ac7ba558dde2cb1848e04e52925d0db9b140dd1d47797e8f2f45cec656ad3dc1cd5081ae1c638b0bd8f6b90b78794d3b647e1e654fc18db4c765bb1a0a80f9ef1cda80db16f263f5c142c12c63c43fe7d9b5b5e8e6992876cb7ff9bb18865b6bc1a00aa674963b202a4dce7ffd47cb04396c0c6eb50b371b641cf07127c84c7ce52b88d8de58fbd23c9d49caeb09dadcab2c8abf641ea2ecb9c30803df4cb26bb0016039fb3e8b541fbc98d6d81252b5587c97a29ada5131f3fca93bea1c778149acfc917453d3eefa32256b6a6b1dd868e49be0ff482d32394f3bdfed408103d9b4c2a8f09cbbe7f5855750491b218d02ecfe413c6f1c36b44526b893beba3c879f1c4618232c893a3f954f1e2a481b4e1d298df95807878b65d28e81a008737cf7713294ef0c1aeee7492e91a178cc75fe828cdd09d76be737a72962ee55efdf4329350b0845e33c06dab649879be69f187206918c722bf0440e50dcae88f9d90cac172677bd2c4a23b0afefe498b2f3f162c2bde9c20fcd136dcd97ea89d992d961a08c435e3d40c633e12ac157789a13b8890826ae5ea72d2d663ca940d73132b297e5740e5d4778cb14a325c080bc06de231a4d1d62a518b7e473f4953bdf9f06c6db13b7d587bfe00f0218bb117f503a589c65f961f05e720ee3d2704cc3a9c6f3142640ee2726da9beea230740e7b36f0367729a4af86c5ae354bb95306d758e738b891ed4f3221800fcc07f28f0f38b28f8a95730b191a8a11675898cfb2256af0ce921d296d1d860e9d28d12b92aa6750a625162c9ed86c1d2f356347c19544e4722bc5da5e3674931e7b59098ef3d720d3c1d4399d661a04aa38fc958c113cbbab442c8d8dd5144555e9d4528a7bcaa81a51f65b9f2e5c6ce04aaae39bff1b1d82c59b6883602ccd4c58882d0faa089082bdc4b92b97fcfeda51b75677c8a9b4fd965a93c74185d20bb1bec3a4e8587f14ed867cc909c0619f366918a7d5ae25279fb137e1dee7fd98ddbe3bd19d841dd7c984cb01ec723d37e20951b38df21b05c9e87c5aa11af6fdc3d0be1e315213d33a06cf5ca9d83cab3cde2824573c3ca1fa4689b9f1e564424a3c74140c8b09102653af61a6bb04022b32c6809d5630021b1487863511f06d5c49843a96f7a69777b494994ce23d44994b5352c606a030159b9d4ad7664188e0411718385d936f1371a68a0317907a6d72f61f3a153434ce20f48b3eac009abd6a5437588678a0e4d20cbe3420a4ab8fefd771604b931530eeb3d4d2abd4acdd0d641e603bfb33d01eefbd45c623dfe60a1fcfa26f66db224c03aafb2b66c527716e55b642c72fc19f760da0d1b21e5c0bf6c2674b548e8b810c9721f35ded83e09b65c463829c9e9bca38ab09fb71d83983d118a5063755d6f522accc622cd9a013d5f068d5824f5b12c6d036a6df43deef841b4623de6793e7d4047e1d8b11fafd2da41767eabb27773d761f5b7183406163d9f65489a900093391d13511143681f6473ae1dbcc472127048dc12e81a702f7ba7c4142036484c9bc8d53c7c89cc9b74197ea5e6902370be448801e255dfac727a291105d097f1eeb791eb31674faf8f9f72b7a7aa1e2727d18414958a9705b862eedfc9f3523b8875e3fdfe6053f42d9214b37e86c49e337c5acb800d28c3c40e9fc0cb1319821f9045d532198be1b48dff39d99ab95e67a166872062178f1be9b674a7b4505e1a8332116ad759f0eaef7cbb576a6ed03aed41e7f53de5902670cd5bee6b8927efbb3322f74e40ba074327a8667a57ac33bc775e8ce515af8a203ef6fd8d469825c4b3aa95d2d2a5b0058a91855ef63ad8ab716b45ec1a05ad94a5d653adfaf7532c5de894f9723c6bb31ff7426cdd14a016ca8ebed7856b073a7c6a8f5228fdde4e7c8d9346b1f690d8425a1c487ec2009add49662bca283d8e3d241efe52f44dc7aa0a1f3f245cd5f1bc2a71565dbb90b4442bba4d6ac596fc62a371270b73181450de77471be7917bc7f8f03aec79d6df799659d0e9dbda2177692450a502d3b12b8b59f33b1f59f30046075acd752998f819934ab9d34d8a05d5a6ffc22bf72a749125c7f47ca5d3ff82252a53462f5d4a46151f7d3487a2788987a8f546f8ecd6707939ca77fbbb004de84e20555eb8da7c4dc386880ee759f544d080ec5f74cba9a2cd3fb9c1f4dcf9bf2ab73b1e18435cbbeb784649d524994d0b27a4a16ecebd50f6c68aaf3dc02618448a600417ff47cddbc4d7def852e62ebd4bd855175a2c024af18309e2644382200c5c972478ce1228eee524dd8f7c586b502fe11ae866254e333b688f33e29b41cf995dca4a60275778d6c1d114cc6899e6f3ebf6040c38552e0c4190b973b22e469ebe75deae5bfbd5351c8f9d46bdcd72cccc15378eba04248e3b935f87754a03e53fb3cff94e6a9678bb75838be68a86230814fd5e38efc939ad03b09e333989f5580078e17d483f1a251f620c7135939f3651cffb235c8e872c6e3718aa514b57ade873e746f931b1cfd9a328dc631d89cd7819f607fed6ff203f6d971935ba7497d84b8b5a1200b83250e19186a7968b33e485df653b552a2ef3be8a2e6b69e4bc6c6a3e25174e95e30187b70e57a10c10237e07b9866b60af37c4724846dc2061f14a80167d5de368681019e2179f94d8a17d1f73849c5b3757f9dff57c83a04f1376f1cca8c12928f1052a904c14adf40afd7721aa6a724df0d933b460e2fcda5f89f3a64e1acfab28f17997899 MD = 94a5d77bc308382a8aa317be7bad0a870f006c67 Len = 34568 Msg = 1d91b86acc6ea170bfcf187f773b577b95e29d36fb30779d2ea23e2ffed9e1b46aede42bbe03a904fe22ef8f874298b5f4a6afe63f6ca9522863eb5cdb1c8d4bcd445e43e7302875e6ba3592024c1185cd3a92615f551698b0bd0c6f45f6b6ae0f3e2c9c901ea52a3f40f26f2e804b54ea454e91a21245d88c58a84f858fe344f884581d00f5a88dd15b2e0e5407cd8b1170ec5c52ccbe7885ddc7e6e30e9c754fbeeaad81dcb90563b4f257bb081f900b6373acb5aa0ae263f4711ba69b69a9de94e83659fb61fabff24532adaccacda0c5eb6815d5b07cee44afd61860d3486bac5c9fd17b27d4abbe3087701b55a8973f5d78b87438b0ee7688ff7f8261babfb14dd0318494fcf0c0ba3e4d7c488bba78d0c4e7b02be52a31057f242c9c68a249c4b0c13d2fd8569feb3f8cf72cddcf194c33e9b110826b1e2d3c4f840ab8db1cc829c9cf80d1a404cb7275b688069fc9d9af089e6ff179e5081f48b2351334d3612290620f50a49663bf50dee46ef23180208a9fd1991c2d9e1056dfa5e2731697845f1c65bb1cfeba0f649ac87d90f8486cb8debce21c9ef8f8c233e08b618c73357e28097bd5e3d848fa10bd9b40c73a7cda80bb3440e11dbdd5d57078c6defc1e35ac83f997eec6545a684a30cb465c3838b053f7519e1549d4eedd0f6ab43b27ccd15c9c29c78b19cccbf8a4fa1cb88819940e93187ce9820aa5adba14b436398abe1bcb55152f8198614e5f93f25655c75473715a24a052be236ae08e89f73ab89c48f0e180bb730551d4c95e6f3c8588190af7e23e42a0378f9be89ed986149e926b7296b236d65cc4124a253c7402a50b5c8e7771d853be12c93c0d4de9ad84c90db93c50a894e6e1914bae0006b26651f09ee06568559bd47b43a28c2aefb268b52d9b051a94e8d1d832c264f87f12144e90e6c3fd8d16fc3965273f51c06f98ec367a7692beadbb6f6929105450f37bffca51339ce377b38c0a620d640a0581393ca34e1bfa7cc8df56abab220c4faf8ab6e95c4f3f0520fa9a1d9f6db4ba4a24a7dc33ba309c1faf6310dd689d6fd777bb75e71d89096c0d7d1e9c73a6d71c35dfeece794856ea67f71f5030ea9b1c4f40bf7b0fa9cbbe4d1c2ead7fc8a31ef54ca1c65f2af24e9079a1a981db1aa699af8dc12b88933f41dd147a98026879eb56bcc374bfb875b1535f936458369cdd6fa8617b0ca91671299aaac63c6c54a066096fc1edef8752ec1eb4df493526a4e8d802071e546d656986e5115ef9d89ae24e6f4d9de1abfbaca9b4fd96606e7482e44cd5a7de69a603a1d58250552c6334546e21b8d40a35fbc73cc328ff99d8a596e9f08d8d34bb61b32020fac87a83c2e312432411cc87413ff43be55ad255b9b47e5dbaaaf62ce9846ef4449ce780f6c303bdcbe0187ae6da836cb6b83f752607b625147cd68205db680417179de437bbea97938816955260925e836308bf54573651854dfd441c81b55a5983c436ec946fd76653f060ee99c81a35a156bbac6ca9e9f46393fa953ffefef42683ff7f1639872b87cb63204ccea7b2bb51f2940db5f34808bf2cdadbebf6ce4903c65709f1aeca6dd22751434b0de4f920eb750402796b81a963521d234cd1336c13dc353e552a4d2a33ea44e855b2a2ec2eb817398244197a2665cf4f08e42ee56f7662c983356ffe0f51184d860300dc44c30f0217bb175afe7bb71630ee8096608d573a40d21a7444f08721a8c15919b400b3043fb8c27072fc9f21ced972a87089dd3894e998b4592e580cc4d3f6ca06d5cde8022364e50a504d18e98c4c4327d2bc6b88632fe7d67255b8e0211f18c3ac235568e443e04ee089a18aef568e0cd0bc7c23262835442644ca07931b2b72ec7ff47ae4a78ac7121d67b8ead8b2a7eca4136e1bcbc529b1eeed3e11342a9bfda76d3f09da0bfc4fcf107b6519d7808c3ed76f2a5fc0107b1bc78f83b03dc7476367bf3c238a75006945db486223201a5071303c2e4d7eec920001d1d88e7c327d8b0366c92fbb8bb1ade17bfbc10efca388b9377e95fd6c1d419ce3f4424526bb80126d1524555a70f194e62cd7d29cffc5100598c01463823269a14c84a78be7eef53b4f8ecbd36db8fd723d8ef5602cd03f8cc4f54c398a7a6ff4277a2cc9c77fb2b6bf98a66072ab2205750dfeb2f1504eb6495c2b56fdc1b7c2cf4c5b4824d953c8ac676d6845720d881d7d75f917ee4369711e3b22a3b147f58a23bc70c5a4df586026a853afb4c6e47d05e29c6751288f8263040644f02973a127d8aa74895f4d21fbe088781953ffddcece05a621040fc5520d68a72665265c7f365cf72fda91380e9b71684bbec385ffc19b9f08e0d18214deb195fc01f402545ff01740580bed88647547ef0f17bcc141c619acc3bd01d0ff4ad61907c7ddcdd9cc9c61e2a38791c0fcdcb04ce2cc3cd8eedbb5b5bb89aff99932277e8633132e5a4e3c7e415050396ef0337f0efb970d7baeccbfb363d9520871cb6f194d4de500f57937cd8eee56344b23af8292fb68d55a99e78dd87595fe5aafe16773a4872858c0122f8a939fb4b526e526d88f7265a7c337312eac47e3b67bdc5aec409b3940b719508c659d57f6e428e2177cb2915df3b787ada5f21e4dd769d90248a99b75095316db8fd785d507809e95e9b1c243d06e789f891d19e7698ecdfbe43ab5bf5cc86ac137d6a71c34f5429cfff561220364ea4a7f513b4cdc551c203ed5f1e659813584862023911590b672e508d4c233a1c6f8b015ec43d6c6afb97b02b6b1a7855d6da33f63fd5258e25fc47285eb092ef5ef43f19496ffe86e0ec6496de9eedcccc4b6bbcd279356afadc4b9da652c125e77616d9b0b01c3416645337c56d88f68d1e91acbd97f9003a20c673df74655e8da32126a6b815f110b20474cc00ba51bdb62e6c4d9be10c888c503156bfc007d5edd67677d2ac5c443800d45ef2f26cb2c49a620f0f9dee4a51616ca87f819044d8bf5fb0ba1fc44578d0ecfabed1b620ac7e346e6d80041422827c414e2ab64ed63428edb910c778f6ed153bbed8bc7be0424a0830280c5a623be6ad961bb87878ed889b7a0fe47324cdf37e8d67ee29027f1958f20655a1b2e6426a01e535462333f526576d99b8a4ebee5fa50fc9bc758d28dd1d9b8e7e7719f5f2fc17ab3c87bfd53adbca55add9df8c3b9050edaadc150f012d680535315fa7e4ff1398cff8e9cf3591a6a6e7460153bec9abb878887f2271abec588a742fae9c85697c75093a4992f3731be97c09bb45dba0c8aa1d54198b13a906d2b1f290962999c4d03b29baff9bc01328de51496d20b07cb40d1c4ac9ff2e8ea27d50e46e562500460150b9c7d50e3b2a0f607481435b633ada303cbab8dd5e7e28b31091858bcd5afe17bc8849cde26161bfd34ebe121a82f74865e9fb45f4ca56a1bb8c424e7a83741749bd548fa76387e7dc11eb74f130f6cd6cb410e8f01b89a53bdb16ed966415b7d7d3afb3f8b4e440f57775e485d96b27a7c5a446cef6342617ea7dd9bf515571ed6795db64ba0983b5ebc7f146c096ffad7b1fdfefcee8bce656e19343ffb5edf0e5b17669f75a08a3eb6c1bc2ab3cadf4610e24e11a09c21d8cdcbac2b3b98498da8d1586f178483602dcd477edbecaf303d9a6317c29ee2418e9b0ca01c2ce3bb283292a4cc6daf2ae94abd4fc8fcf5fd01ce46f49cb89a0777305b88e7423501a2e31e24dd839405b1e12687c32336142426fd927613d0925133a1cae504c8c5e08c04d992edbc5a4e3a8b0d1489fcdf6e4992d798d60c4ae34be64e5b982370a8d44aaa32d4af8f89fcf3c90355cec5a7e00cad492ad697f72133fc9426cf6bc363fa7e075ff30e28cf67a3d8b0352e969274fbd337b7e1535c8fbcd7d7521df9e21b3f57b7123df35dee83dac1b8820408d1a97c243690c0a503766bd236ed11f9b6d46b039486b44b905152b1df2ab9ea2b9e8d1adc0c06a4961299400245d54fd2258b6cff50314455f588a7328c7ddf8bc44d402fbded005078a9493f8c0b8d771afe1add0233ee4657c4cc3a11188ff80206bfb90c3d623990e31474297c5aad9b0e34b50682f16a604e477e2151a37a40febe025fbd715a438eca2986f05f7d9001e210c3e6f6caf66d418625f1c319667f66901f36d6ba77f492e70a2f44eee1204e75a127a56c026be2db83c196de5dcfdeedb5713861155b95341d00b00976b39d6c080ca55a6d8e5104a586c5d00b364fa187334058060cfb9b272c4bd53702fa7d605f9f9c1d1fb789f10bf7f759fee132ff4796a6304feba1907cbe5a0d548b3111e63a38fc653bf3d117d55c2f6dbb2a8474e1537d6c8dd0c1b5b1a0def3780f836a1f38f1aa06c9ac71070676cd06117d81c968d4aa0aaf20a2cbb09425eaa01fb2f5a3e3343f93eae234fd1464e96d5437f8ec1c528ac6160ab5911533096a4b886582bc4d0fdaf232044af37b8dc8705e13e73fac349e0cb4174b4b65fcf770b217dc633b9e242e2921f4f9591aa939bec562240031be686997e71c02eccff7f9b2b9c04613fc058e30031048b799171eb363b396a9ae93f1e06c725400784625df22bbb897e7df2bdc801f8e8c1f724788f5d4b5c3f7f61498e234a1617cc7fe451d3cd7516f24c6ca720e74c2c3b202ea1d6fa7a720f89a68514a323663e14b8db52bed6a1b3d28a5e1c542810d3f1582e56cb27eb1004af7c29b4fa8b3fbd65eef70400973901913d62b40f0868248f754b31f703378edee3c113fdff67f6561d5f31857008661bc572ab638b5e165f1722d36a42dc74bf4c8934c02b3d4c13d6e9dbf7c4988c74a6fa9eb8022c5321a48c03e4327552cb26d0abc397362b29bc2547c9fd7fc1462239128f156977917dd558174a98a58cf335cd8aebd910023da0196e8304b10ae7dc8b5b3d8bd00933ad545603cce96f42272e88619c9727cbd8d5680dede83d68437daed30a190346526d32e6789b0c9433434ec0f72d14f73de048f691c358240c6dfc8e7a9f0a268327307b3236cf59d8a030628f4e54305dee83c576cee59ba5e0b6b843fea864bdf6c13a7049321385d9ffcebb776017a7349b032387503f9e5a7fe8fca448814170879cb94edf41d934ef7e1244c30da87711381e793290545fbab91b2c74fcdc18d62a73c41175316591f90a12e792e01a68ccde11073e7644f98115e3b847dc544f5c4625931e2cc089b8297e6847dc931439d8db488a62cebed973868ce2d0b755ba970fbebd39fa2943f6f3af8cfc75a61795546114a8316d3aba715d6e47a68bbdeccf0ed2d7671314d8ff37e2ce3680ee9a090b5dc531a72d6130c44aafc643eece0ffdef838bb9b3661d9bd9d05a57176d7581d63833df19fe413bf8778b30c5a12f2673dcfc9f9824bb35e291557b3a76067f0e7fbc8788f83f3ef84d79b4cb0cc902f0322e374b7b74b08d9fbc7fb05a485d771a303312c56747da8ff65277775a0df521950345f0c6764b49f3d72170b797a0763354201c65d11fcd958c43674eb1e329c5a6001b2d019c2e9004065fe0d80b423a7d3933c7852864dbe4c75333995ac93472026114ed00bc25a8c77e307927dcba20d6c1e8be95044dde6bc1951ebc7e6609e5591a8319810917ed62330576c436c1713d55f7d62a4ffbb948efdc98c7eedff169aa8e370bdee400927507888734d1a10cabcb7c2576af284fa03d70141366ef194148f9bafb9f798562f9cd9438f3eec64693f7a4366b415c62cbc301882116fe7b5dc22d03ace0c17946c689c79aa2e0a30bc92523d29cd58402121eb1b1017fb53730c06b9ebebd4498f3c6452875e26d7d7106b3578371907addba347947238b6fb613b7d76c0f414ae5d8563fc041f2737fe7598cad871490966264fc50607a51d2956cf9810dfbe71d4e5f432a95de884635aac463ac9cddcca5e7bca5ecee9816d3ff77865fc0f7fa86e4c51d448e2684801ba15e4875ccf0f3212ccfff64ace35de3d4046b5ce81e106b5800e48dc89b452095e5e15be8a3e895ef273e890ad871be8153c71c51e889775e7dec5a08faf35e34a31d9bbb45f4da565410b83c56dde4221ce99ba MD = 515d2a8972936e6b45b9b457d9eab8e2f62cbc3d Len = 35360 Msg = a24a4cc29e44d50386c9cada21d741d35cf8aa713c6a5f72167e7c55023ef01a8d52d449ae25fc35fc43cc821d064de58271802b515cf37da3d191e2f0b7be05c7ada439c339c7baba22e035371ae88b2ba073d3df253f9e2d6e0d7ef039afc9b923639ac4c95f192a2eadfc575d394ebf4f296fcd0e6c5d1c1b9631ea0debedca7cb974981decdab22edcde651569b5a6444a0a035fa242d9a1d404c67c99f9617f50d0297d9586bcec14e44a8b9f4948487fa9696008d6cac871fe6ccce275e8f6cdb55e3182a4af2efe15ec0704900e227056e759c7a058571228c545edeac6a7db2c1f80dcbcf3bd427934d0c0145e9cc41865910628eb186188b731e3e0635a203c54b4cb56f06187180a30fa5da17c23f8cb51eef7ecd106292bd6ebdd27d944ede51376fb0ee175fb576ddbf1408b37fc01e1a794c14ba9100a7e2e6b7aebf047bbe60632b507b52901d08a5aa191a52eef895887d44ef1473a6fd311c457cc53bc74a2844d99efaaf2a12f202e5618967e912a598ca286d5a5f103586de67f18d10773783e60ca871028f4c94ea1363b94404491500e11c2314ee6c6dd60b29ee3e5a196f024efc745adffdf683ba7251adfceb78a5b3a16c8cca3e57c8d0ceed8575366cbad0672787778eae6ed145cf9b6f254a151a8da51b5633db334360f9aa5b17138c2b69191cf88702f7d25e9170dd6effdb80416b44f4d54e81fd7090f17e43e9d2da72a77fd57fbabb381d35e2ca2100658f5d0d9e38ab4841498e521f5145563b4824814490c12c259d122b55a7f3f24f92412a8b841e5f0dc21aab786683ff320eff04ffacf3edc35bcde03e19505bf6238e309189b6d933f1960b8130983b338952c105aca056111eb1032070be93f5cda4ce449c0d6d40428100ee41fa90dc61d033faf22f2b9b305c0291509740cafb2532194d7a81df5f7c1a041d13a68902e7ec542028a4ce3b3f4d052b92c8e236703a8410869d5d82e7b567247bd2c6071a3885b9057836b9db60f08419b2d7fa26161987da36376754618beaabac0fc8e7c7142f4e0c4126a0dce7dc949528d0a7734e15bdd3197722bce6f22b98e2c2c11683e57ad789fc302f5fb7abd6313484c0a63cda0a602d03160cbd643fdbaf3685698e14708db4f9b6cc87b7fcada03e8c967f9732a813561b61befdf756c8d8b2199b935da8eb7e21b2cf517edaae4545b3507de25da4ac1b9a694165e0c9f82b38608ff587fa2dfeb71100e364b9397a6152069ffd6b65c4fb6ee6f2160d453f2aaf52ee978b999c2ddf3ea0c84b7b9944f6c9d213d2137619125722431d108c84ca949f43fa4188abac736d61ef8c30c2a1201f1d7355cd88060a7d04641a91cb34bd8e39e0a64294eb377fee200bcf5ef3a1ed86c97d29acbc7978d69ca3cd52804631d5a938689e2e037eb9574ac39e70e7a3fc3f2a191ba83c9c46014cbddf3fc730a3ee88590bd76fd0502ff9bbf57b39f8ca5ecd2a395bcc5dbf4c85d1b5c5a8f1211b16928299c52b4f047926f8a541529da2d6bbaa399143ced8efb77ab47409d9a953a386c7abd6026f49831c717627c2a5e77bd2d433d4d130dacd927ea0d13a23d01a7cf39c6716dafb6ed552410ef5d27fb947be2c8782eee7829196c7edcf151c65f9a01f54f8d20f38b7da4a7e83a2f0127d59d3e2405d8674fc9f41b604f788f4715f9d3624eee57f387bfadd18a1f905e839c26b8617482347fab6d08845a6647884ae71378c1ea0ebb9cac11159eb121cc08089e0a6ad0be83b8fb3a57a052473a1bb9c8d243b5c260642b10a3556b58fa096c3dc86159d61c444d5f92f25c2f7495d2ea251abff8c03eb336fcecc6eb53c6dbfd630226659477ece0fbf78ae77ee0b9e239ee10992153cbebe70acac22068dd46a2f43e5131785f235b58e658a023f617d668b18bcccbfb972e5780c5a816f8804edfaa843c702e9279bd7868228712f0c42fa9b809cdcba2977defdd35f9b6132f6d70e4fc86e2941fcc47004b3394d7caec00062081c474eb211ff00d399e680d449a5bbbe3029013305b09644f0433b247bf5f58106d75f1ee19e779fd38e5b00c2fd0bfae16f01e8fbc69b505eb6b42e7edaafaa24e0e7389e4abc16d0df3e06e382a5210a71b0892730a867bd0e9437592cf4e5ef0a5379d88232db2a4fb6411bc53ba313c7999e086d21fd93b147c98b7b59c6ddaa407d00e3605f48563059fc3323f385d72992200abc748b454b7f962462cf79471a9ca7dce905a39948bbd56af2b4e926ecfffe67cc8f0c411ba409e694523a776e534ddd2170d47f7be157bb2c49a64d50420422d68f8f2b34e14700631199a1985b63729e23537f3654f3c2354455a0f002c1ba5f088c7a23b1de2063602f5c44ff792bd39f892ef4a13a1ea2176fd848bcc7acea8caca474904fb4f9d0641de0da0f6756481df553307b1f07456d39d6da8668fd7e483084071c3caae4c05cf85586b39aaf6a68ce9d6741b940d66c06d67e7d0c6fe7a4ee70b435fb0fdc9fe80c8faf1558070fc3426f254cbc23e5655b10579be413882077b82f7ed4016d5c598aa85ab46c30ddba034845f9de1c8eb30c97305d4440a68688878ab3e72bb1e6f84def5712a27a8eb419199c7d97cf8893aa4e3e02650d27b5ecc331e681851f58ee27a282ab261af2165c168aedc436761f5a28d67ba0d5c0bd9cd097d5527d3d27a84944d16cf96dde61fa7e64f9670444e89028eb2e0b29789c0273bd868b1588f59dc1abbba467cfefaad0b3cb74ced98df68239f15260bc2569f290adc362607422a190aea6706949ca2a40d6fa464b9ede6aee9725f6e6ed59acf534a0b46cc87a3d36926a2848f4bad3a298620af9bfba5b8f7c006c874863fb61c7cd8c0c47071cf41379ffdd950f654f8c467d82450cdc833c6c222bcb1b765cb38449ad945bc95fbe6057959f3a67ae2f122e73e368567044e3c832e9e2964ca47f7def24dabaefdf97c00f77be5354fd4f8e2d0f3f51cd21e1bf3b294be3c7f719a94f6d167a1b138ae9b9b32da0ba73692d3c2d0466f0600087a30dd9e74547dd5c2cf1918f67e6d40512d5eae8652df97c1fc15a0e806b9ab2190bff094af354f72646de436cb5edd2b9548882eb897b0b5650a2a103b14abefba83dd25fa5fb1ab9d15f6e802d42b2fbb38918a422685b6e7f70d6e0dd8b1ed96708cae9cc4a276625874948a97d2678875f1225653bdcc6923708be5cc64210dd025b7fd2ccbda9b8087c3cb6f7bdbe249cf7e5ee701ffd4d77ced29ba6d9505e9d2c8855fd3df30d356fb2d24ce92b3fa5327c0abf8580e5b591e436873516705b96a9c24648d099a0ac7187d7294e1d1a7a4e6644bde00f72ea6999e1f5b1c6a0224aa4423ed0f1ccaacf44410e95516f07d36dda19a92f3230b952619bd0b60d67f1788ba0628a3bf34293f4f9af811593b1adda392ad9662d79dc7087f1b315d024bb5d1e03d7510e61f37d8adb10a0765f92bf9d0372910911b4894a73623be35af960f8437dbe64a3ef3522d674825833a904a5c1af458c27672663f438022a0a9f21df9fc1d69e9ef3d661f0414d91d47d43e3c3c3f60f1160d264e298eb0cca290a2477683c04a98dbbc8d6fb64bbc87bf7e7a875250a663e17cddd2969140033947778b5514f6a396fb7e9076a5e76218b21ee174516ac5b50ef325dfec8432b5b49025da8c737636cbfb4f9b0c2740a9822e34ef8bc3a45287980ab3ea2199cc909a2b5b514b7b83d60b946faa03893894b46709253c68818dd46958b39e9e46849e85208a051845c1b64738a703a58e93b7620b475a7908c8b02a176e83abea37a21b71602ab7433704503f2baffd7325400d3d1ba73fafe23336384359278152b1d596fb41bf46defe97cc5d90f7aff25650e6c6aa2340806673035ba67ad37cd09bd682d298165eab0527652dfc09a301134f73eb8b814d4fcac0def50ba85e09557b1e66a97b601480976c0e754ae0493ec148f3e03ceef823b6f4cb44c89f63ebcbf6845c3d8c3ff1659abcc83a5037b9826d498b370e69672ec3b28cfbe8e7450f33b41823893641da16be5fa19cd26cda0b75f23b53a97c7076314b08e19b4b8efc7e46f60001563c099ca0476c233f134a007f0f65bf4cc433d1eab83189e6927a6b4c7e98a61ad39adff5f466301b745171997dedb6be722218cfd381b9fc61d4029383fa2f74e9f20ec56f3503e6444950a74b9393b9c16d9063217831764433cb83cdcda34bc438b177817fa48acc59261342fe6027fb39c10e69bffb3d83bf4f8423ba0b89ad955175f2ed19ed54aa79442ad725ef66b1323975fd1f38669f15ff4f696e15ec3175268a266cf92364d4a2cbc5e8f94afa6b4a0bdba34e35fca65a1781d4d7c933a5f210d3a59483aebc95ec71b32df13ff4abf401916937fd88ff44ab46b78cc369414e9bcaa8bab0bb8557828d73a2a656c2f816f070b5cb45549e8eca9d7c0b4a7b0a27e51c119358dad2a17fb3a45718f9dec3c94af78d65c3ecd36b71e230cf080d1efdd8d07f1cfc26768fd5407bc2b770af23e1456c6eb3f8212e1b065d81511f291bc43f9b8d541ba8c7c1be3adc637482061ce790ea8c88211d8330b8e6bc07f046c8a610354878e02f5f66bbef67b3e67be3242060b5657a3f92a86988b28f1a86cc4c059c4107c5ce987f27822af581881e4645599857d59c2eb599ef9c7d50e3b87aa348a88e00ac5253a51e1401fb38b593265c9c25da3d40a170a1e09a3966747812c3e3d638d176285e4a8da1fd909154ecf129993029b1b21528e8ae7e16e88e79955ca71646ed477a8efd9b2f9a98d0bea0a77980686731b10c1a81c6fcfd04004479c842129df82072ccb8385db351c5f27e8e71034c666bd3e0daba1e9921d15aa403633d7083787f62c0c1e1cb1d286e17a0ac0147986c07a1830186a52e115f441e21d04d2fab3c287b712fc67d109dd877d86a3f10db2fc442443c0a73ebd9c0e226d21b45e13284b1f14e8eb9a5052ada9e471e17e1d4b3e02b46ae3885528217174bc40d41e7df29e84609190e307692a69fcbf3a67dd5255dae7bc50751f1859f432fcff4e5a2acff2021e574a62268977a2eec51b292d8837c58619a5f75f364c344d322b43302dee3bd64feed98211ae02f4c0bfc52c344b62c566603762b0ed2eb60f1dafcf32c97c4dfd58f3e88d6dab659fbe17dac4966e1ea92c55cf346790cc08ce163479144209e20147e64746fab5d4aeb7b5c3a935e66462d9014b4bf8f391951d2c5b7f3b8e90802bf7c9ba8f69e1fa2b59bbe468b12acc47856ffac5c14c1b0b03643ac7408b5e36899f48b7f65a38d91307d865035e9117d80cf485c99ab886562e0753c424e3ee38326232ff9fd3478e5205b9518289c075cce9c750f006059113458f8e1fc9c9702da75eca4561fd3804fcd42048fee7fb0a2af90c0e7c1f40be75c902be684ecdeb88b9facd6d708cab1e53f3f468e4b45f38996f289329e17a289ec69357e4ade676c315aa4e3818befaa74117604d5e36a336dee0d3bbfff0de8f5e2101219cc902088f6e9cba48bb025cac447d98451aeb4fffc9c64bf89cf8091e0a0c9c16edab08ec8cc18db919d5c279fe094bf59681432635e36067e905aa9a90c2aaa8cee23291776518d675e5975e96abdf0c1405cf06d7a38fca5fa7c26867dbe3df07381432d0ffe21d39a249aeb0cdd7e52dd93206019f309c8b3f0eebf1b0be06112d2c350bea7019ef9c380edef7bd1d4e8c1aa8562ed96ad63beeb9c0d9bfca6731f91c9abd5949025400d363a1f510f08ee75247eb0091db3ec03657cf6fa883d6f95e0ff0f4270c3a22b10165166cbe6236b8594c4cce04a8420618fa240cf19cbb7dce2de73087ef2c1c1ab9a78cf2a6873efcdaf45bed28d29d96f293843ae3adf077bc98f1efb37b6922081efe47bc375ac51fbde7ff0100615431349aba5c4f5a7f358fe7be579f4cb9e8f33d2813e5a02472ffeea4e149f5d34e6dad1a571e105711329e7e2c162b44c4aac61e5e0083ad7d40cc994a1dcf96a2c557b574a8b691e8376299a16e895533cc2584fb1689b2b7172e26abfa5300c6c21726256db1a222f4e0bb7806eb5daedde8166ba626f688e97fd7677e24c432fa67e709eba62a49f1a53de07dc5d0ae466a2d302dffcb9b4e3e463d07b9336fc4c6626280e87cc5c40cab9b41ad50ba9c4843e91c58c4469be5ed7d3 MD = 7fb74b4dde68f8c5e0d9b27878040123a9ed5fde Len = 36152 Msg = 0e2fce9e123c9e83a8ed6fa9aac879f9b112c0f77c9f963e91e8612a265e9ed441fe26431f26b0e0d3a7982b2f1bdfade779722df4e6af2737ce257a5f349b610c4654a434359210c74359248e1e750d596cbfd559a79bd7cb2bc576d68d4e0eb72fe12b1b114bf9ccea3afc907845014f142d55738963349426ca845512bdc489e0543f9b63e3852cc4c41bfdd15772109846160a350e28dce8bb0ea26bf269cb8235477bd3639b2df87eea9dd3b146e5219280e652a49ae999207b863ff5e6c63c0dad8408d22219aff1cf38245d6716d798fcce892e71055f8233c936cc24bf3763d87eab38043610a333956c63bbebe1e0f08c82b2977665679e33f9810a019abf3031639e28cd441e7f7d54c92cab68f2c5e6e43bf384d15a248c301c7fd38ea91d64d90b762572ea19b88399a1a09357e4a558ce6d79cce02d9b83a36d7c3baa07e1b587d688c38d6b0ea3db01108b96b3918575ed9b7d8321299820bb45c849566e9e1a303c5f91db475995364477379c7114375b340dca68fe1a9a51765e0f72d43ccd6c8a6d7ed32a4fd1278480c2060eac1d9f8aa33d6ae2af1a17572483c4da38a772ba15daba802d96bc18cec05931f62da2e568658f9dffa7f52f432db24a3ab02a14812ff8119aeddd4788b9fca099714a8f84c940f6b349d348e295a5ebe9f17de0d604f5a53fdc725ad73359243ef180cf1ef2e3b7730899e82a440684ee7151653fe21804c46e6399e2b8d7848db42dec5e66e2a6e6ed2f5843c13bdef03990ece250cbf5d0a8984cd2cfde8a2dc2372f6dafa38cb5ff7de05494aec1984f20bde7d676420b94fabbce01d6fcc72388e07355903088476bc78546c5f48ebdeb2077fc7fb11f396f2effd427a302e0064797de0f5c05cbe257005eea41798bd75dba4b4f0bb19fe0ec8cd23a4787ff9bab02d48ad6d795c8d6ea64846e02bfcebbd74a4e176ccf363e9e8375b0fd8b2e56dcbe6867a4ad078d6ee0fb44d063b783f682e49ff5d0576c5d6e41a50d89a68e4c2511d7151985c4b15bb68b8c7e79fe41797a69f7aa2dbef01b07ef5f03ed9c7a90edeed1e32cc3de5d1f0bdd19fe71deb9763f18669f7b80122d569a00eac88f8764748113e2d11b6c9d8b6c3b2d27f5ca42e7000b94ed34dc1da267898559b392de30ccaf9137901298d5e0ecee67af32442958a1f65a35003d9b6da5a6990d3ac3eb5bc1203e67d678afe2342978337be6cfc831ac0baa06f709555c35cec6067b6dd550772bc540a6e21a1cc6a3aa2c8f9ff7c19e48bc77b2b3c6b61a41057f6e7ee3657e49d4d988362fabae303ccea6638e5cb45993d9d56269bc3d3af32b04e62d071ddfbc288772caeac76710e895e13407d68556b7cadee6758700b894a66c5a3e3c34a5b60c6092dffa8f4f02c3e292ccec152e96f8efe4eadedd7b42bada1212c391b6097dc6309430f220a5982d50b2de514200c75d0b212c1764bcaaf6ff8c9a3e17ab436d4b114fd6ac577c8c15c19481bb7c9fef042457f79d8adc89c7b3a983f124c71d8c5c40841ba3d7c58902f6edc093e86e77fb48c54b34ba5a1290d9a86cfa709d9a7fec44940e11a1557ceddd7acb0aa30bace8c99942aa33892910f4afb7a5b71f823a5e3f2292e821385f9810af6d5369411e4bad3d16dad38837b0e3e2d031c06b11194566c362943c3667abc47a4939c1d192afad651899b537252f0458d427445bbece620ad6579258927394974c2235ebe7c818ffb583b6f698bca4a568fc15ff95019fd00e1242af618fa62d23cca453921f084c7938955e54b14a1fb5e6e4e5e607a47ed06c52211b2882a597e016f1dbde04b42c615a56a0377f2e828ebbf5f908f97ae50dcc980a65b165700694ad092a959f95a50bc5c376c93a999ca117152b272e159eb7fb746fbad776e5246f662e41757dadb2950695b3abc0b79f338498b50027c71c32a26d25627026d11f380f939eac2156adb1bdc2e9c087bb318c782b5ae52f0224dc887b6d2870a0a5c8f81082eaa800f50c15805c61b5fff976f312a3157f71bb6ae84262646c9be95e0f4289ffeab7555ec6746c6ae973738a30f143805e72de93b405a8edc2c9d4427cb01cb29083b5f1f72682a5ca1e880f5850a2ee750b75a01549a78b19324cbb68e2a1cc426cfd0bd11f04d801081e4f92b728276c4669d93298c70519df3a12fb618216a77b15f57ce65ccc36391e9007af3df2ea2ba086347970256bd787905cb4255568b7e5f71f03f04910ba711bdebf491897c103ef42750ab1b722197ab463f4542c295658e2ff2a173792fd384070b4621c107a5c8513fd72a4c9da1b2af755da9cd74e62ee6171fd54c9ac2e5549e6952120ee1424dbb130dbd3b1bae7f7b2ae60cbb65b6bb12cc40f68654744d2477c4dfa456048558fb30448859e12eb72991f0d778c8178c5340f750fc9369340de49a56988190afdc2c6314010d45bfd6381a3773d563ca315fdfb94fd52153782bc2940d4be816427c995c95855d0bbd43097a0b615882e2f80ffdb2bc1df95314f8fb48b60422da8b67c08bebcd214b3d1f1d93ee4e1ce4a418bcc9baa79c3b3aadeacf726d6be0e35eee58a32e770ca0fb7091eebd1eb2de7a64f94366c27d0741e0f5e39c48120edf44803de9937df8ff31a9f54dfeda11b594c608d3f2b505657c709c094dca887951972e96fd1bbfcacf30744943c6e85abab45d67a36faf792bb40e4cf396caada401f7af1a626fceb7c9ee576405ccca4548c3aa6af9700d7d34bcdfcff36ffc9a552baa81ee837b79dae5f0f6232994c307ce04a00ef182cf771a2a396cc2e6d3153d01ba2c857183e7ddae708ba93ac255ff0ee90cae89b0ffb8c4c66f6decbca69e5d3988f011647547d849cba63cb1c7b941ac7f0172b0331b280d77eb7ed59de21566a05dfbaa07b707084fbb0b1fe1af2570d294ee4bb5b3dc6512b63dac7f8ab2e7ef2990b323adc332a452367b182322cca3c35cf20c154a73cc4879afa00ace23e1ed711e3d9e953f46064f41ffb7d2266f273f318ab20aa0012ce36dc3d4bfb115140d59c9fbe5a4c131a602ecffbc04913b1598c60c85705ddddb554f9b1005e527c5e46d684d09927edb4c844d38edc67960765297536b3ec5f1f497a05798fea34b5c7c4623b426587f7d4a42e1485b5cb07894e4fd07309fa7ca50a70ef0be110e009b18125b1928d313a3533dbadc7f761e2177dacabfa56d54fef1ae93affb7e9f2e708154d79aa6ae2400b6abd63c31b57cb2852c5881c312f712aef840bd2d76cad20947ee184abb40cdd491b52d73fcfb4774b277bf4992ddac98951cf08b35e4af129ac91c3fb98e3d201315bdad43418931e3b9b851431701e4009110284af07a25c3f521063760b1219664875e36d40a35367b078aa237d529b149a6752492c5cb59fec13ea36cdc41921e04f736274d07315817463eb478c23da32e026130146bd35277398c0711089ccea118cfbfc4205acd722487117f55ec4a01507f5cd89fb67cbd875fc3f1ff2ce2f6236201f2091947a2a609e34b5d638aeadfdd7da4cf79e9fec8ad27f19dc8f77eb7ab926929f343233b458e8f3139f225110a16eb83a436c54de2b7826cd7789535fae59c2b8f6c7e54a8879d79b62c5a8493bd2f54bbcfabb79ed736c4fee2f43eee700d5634100ea2c17308af8e75f5baf8e4e2ab27311c76402b816e95c2f632e4c63f6297ea6e762eb5534b298b8114a80297ff8ce7920a6508f4a2429525a27c6ca4b91138187f2ee30fc4fdc977323faad1da437f96f47c1403086bd60d1e13b7cfc2369596fe606080b591ac62841e5202c3e155b5c503c12f29980216f6595c23267e8f64a451d278958bc0bd9ad27cbd34fd0658ec8a84fb5e5db5dddbabae415e6f820be181ad39dd2292f2e6daaf63b5ed0e0aeb7ef3da4f134dbc2e8942acc27029e7366e5556f51c9face8b54e98cf37c936326f824e445f464c7f809db80b26c39133766f5285c0433620e0febed963e48561bab4ea06984c094f103415810a0b9439485faf07c42a491ffc24586d07dc52fa1f002fee64ab7d0db69a27dc804e6ad832aaeee37eb13046555408028a2d395bdaf872642b01023be234716620287f90f3d574b1867496348af220327133a3079d02641081d9537a318784c670166cf3da63e2ea41e0e55b1ba33365339c2a9dc3b2777bdf90cb191327d475e6949d5174dabc065792982a65dbd42377c33a8eed9d2efebab3e3c91589d2ecfa1f9b6a41ae529e2de64933280064f584554d4b8906ed2199df37eaa72212942133e18ecf63690a3b685305a0b578440faeed641494547d036f31fe46951624026dfa4f8c7e41d316a550028e7f8097605c95592ed9d7797de05c8472375fe5042a601cf7738fa13609caca3fa310782ccadfab162bf8af6fdf321dc89d528fbcf59d779ec7a4cd10222dbd32d4aa6edb9626da892f3a775fb83d1aa83b906c835c1d0ff10f23ef4b7ae36c1698a0d3d32af557f6381f69d417e81b9fa68c03fdda69268c9e8f503e60a6574943b65fda15e5b3cbfb0a0f535abd812d42b7fe82dd0c5bc01a39c86f9fc0ff497a3d5b26d3526e98dc9cd0640d47fbcfb4a6b4c8e0612049f6c5905574ddc4a5b0a86e6fefd5f8db514a456cbbf1dbf550dabf2691221478b8b540968c5767dc7ba9f20bc7dad311ed94e6f3c355b24ccbb686224ba998dad48b719942b8295c2fa49e90f7fb9dcb260f3d9fcfee1f2479ec92529c722deedeaa7be4349ab9b3611acc85fc92a9658f0b91a74e25631adfcf7c2de00664333bb4e7fdde596960a48ef451425a967f8d3cbbc0ba962eae81e19c1ad2f0ac36701d4e4cac8ee8e26e73be89659de587b4f4f47281aae24df4c58abfd1ab9677105617572ba598c7236b73a4d2d7070c7ad6e4135ffe2e77acedc07358a1936390f1bbb3e827f96d67c8cc2a26b08b8c5354f34991ea63ba1ebcc5dbf47d238a7672d3d94ea0ab73a03e108fbd94d365d2e1ba7bc3fa0293cec503602198d75a454bd83ddb89ff48611df95c141e8f478e2f923062c7bb83319921866c8f2f6161ff41682b5e857a2efadf05d6980fafc97122fdfacddf16ebab78e531ba8c2e711f97de9a98de776e575a13519be4ed3968d53af866fdad617ea1d31dc58e1fd70f5407c5c36acea3a5c31b31b4afae3279317de83d87e5178514f68d1a95c42840fe8a2958aafe7388c273e36cb0616914c04d46bc0e2c82414ab60c3443a9c9770fcc21e31f753252d0b3d31e978521edfa1f906d11024645cb98279d083f5ef3f0446bdd48c184a66661ad54d5a81147576b61bb10f4b80510234bdf63f34d5a589953b1b771cef60bf3cea9fb38abc350c717408e727c01a0ddf555e774191ca12175fadbf495c439e0b38868c555e48ea93d77fa19f6be062ec0aaf33046bd52734f3336c85d8368bef86abecca42d599850dbd439acbca8ac1a4917965abee5054bd5487baac610f509db6dbd1af059faede6bd80226010cc8ebae534c983f16df87b917cf21edb196464e6252ef008675113165bec5ac7068a7abc8a17bed003d170924ac7d02fa29471b873548edd54470b6f4b6f0f43f089f33e04c9c2397d635edb73908c7717268c7546203f41582c1a38cd2ef0100129ceca43543076113ab0dd65e0c659ed773f7d1c1673fcd96cd9f36fa09fa3bed667e1b44b8c1e85a40108c03cf0409c12e55053bbef385ea5c53f91687077901c5924e62427ab414bb9fde109aca3b996389f8b64e3bc6e53667dd0eb15240b681d043752b5a4baae561d66db5e2bbc5d83bb21b613d16ef2282eacacf001b7461df0466b988378286ff7b02687211af56123c533d210070e94c2932293c8fa32e68991e352d00066620d5b7fba3c6bda4b69d452a1009d0536fa12f072c26abb0120884e7702c9d4c6ded75b59c61598cd0ddd87232bb7828905aa7b0f867f4af865b7f167a45ae018dca22e0866aead40805f65cae9dce305a5d846dc9dae6f36b9af90b72d3a34e2974a8c28869d845051b862fac373b3372b1ac86c708ea436acbd90f815ce3f9e9f4eda3cbe78aa7702a6f34561228f8835e0943197866692bf80768cf6ad6ca7451dbcd766c6ac2f0379bb3d2b5fb48336d81ebe8b2c42b55286a5e8384e48b73935987b27edf5d2e4cf1f348a81eeb2ae5fec85b3f6a529064ec3bc63375028dc34e18a7a75142d170593ee174f7a911ce67209ba6c2a686b37445bffdf1f86be8a4c97c6e283782acbbdac4a0f04a9031a43ccf6f32eedc1debc6976dc036b50a42e25a5bcd05e907ff101bb46f954e159c64202324f43daa370475084a81123110ab68f7a674ad89 MD = 534702c37c6fa8e1bde879ce4d87aa10c4cc8c8a Len = 36944 Msg = b3f197b98441a1ef2bb353f6f7ea1c975d1ba5e6f509facfc533eaf2c24bb0b194ebd3869a844a9a2e97e4942a27e7afaa6ef71014cf3a56560cba726fb90bb931f02d374547b3476fff2561137ea432f9ffccf24d89dff2ea1d1f74d8347bc012696e748d72251c7754e002bcd79a48cf38ec33a71f2fca08d0e1a003a549eec0bc5ee47bede641cdffdb222d1b1217b6801f7c2b797307388cc79dfaf5be6ac253c53016a03edff966df676d3054ca353f2c75df7ff2d002ba9a14c50a205da0946b006773771e84f3b3798300a887d5dedcc5cd1af64eefc022ac6aceb7eee3e918fa744fd825f50d21017a7256761cc3f715fd30c5a88607270ef328cd4612b993c9471aa81dd41befa7576da5c19457450c75aaa8074ff771e167ffa88cb56ba513e8be302daa87e61224dbdf8dc5028d533f71e793d3f8c7cecf3d91e9556916815d21b87efdb8ceebe9a34a05362d9991636cca739973f37d32c9d085791aaebab02d873858166fd9acad2e4e6f3e2f6fe78299d02acebb95988bad87a9e63467e9c8e7824009908577e1d593f89f1895d59d9bd10c73e8bf0a6b70176d35722f0edc1e843ff9fb96512786fa5ab61caa34a4199fc9c842a28e51605f4e6f2ebb29507567dc4e76b5436788ab1ced02570d7e5b61e93790e72f25c684d3fc31b2410c3453a070ca8a538924cfc6ab94436715a940f2279c35f2cfeab1854543bd5ff8a36f11c8bfbc8b75a28ee05798164a504b646e002c35e137140ceab02b848afc0ae4b9bc1cf4f3134a0ff35bd77abf1788f4e429098e03468cbd8ca6b3aeca00b0d920b5abd9924c637b861e1915cc52aa19dd0cfbe960e299edf390a1e427ecde77cc1c3214700637f92208258f7ce9f7fae010c9ee01f485c4a5d4becdaaa8dce647577a4c952a0cb24e81c591d4c5b8c0759d3d44ed6596692cdcd2125a1cf24d19d04b2a0aa12bce92f1bfc3decc3492241b1d942c1b1505100ea55a403168d4c8ed6c56d651dc7476c0dccca1e7b59976f23285c7004abfd7d4fe4e62cd85a5de18a777012467cc8356e45525ff81fcf28b44c0c5fb7cc00b95a795cad992e5e3b8c235940113ff401c9f0573fae1e4214c1bec2ef3f42f33b866d8803ed7bf5d34863a96cf29353678d58592c21d79899e7eb20bd2fb35d8a704bf8ae29c59d6f6bb2b0f78f195ebd34d7c8a3d7de2b4ea36ba637fd7fa81c949f1f2af29dbd56529b307e3b348e996d093645549482a960cab3ee2d0a5b686fc17c08cc56ee3e9977887f8b776b827267227f1c8d2710cc52ea4e3305f0046e7d8fa60ba3a87eacf22969f4445def017c0dbf843a913b22cea9e6a3d4fe571d0ddaa154e6649d0975a3dc0a4e0e5576b25885402f498f20888335f419eef6f80ced792ca1ab104b8c883431d6d55c6e94b37ec4ddc863320af6caa8273a6a9bf528abf768048ecfa137010f815b4a45ad7f0a86c8967dc3d084f3349f791855411ca8499bd95f124e30c107dff8c598674b970a622c257273ae7e3dd51386c09b49fc97cfc207b00e26029f354644d35c89c2c45d0200ba6ee39a088aa23c7a4e31176686372f354b67344a43bc5e82f7ba0c48fba086082cc4f53902adbfcee452973a31a12bfe9074d4ad6dd36923b36cd20cd0902be827b30e53ef8e775af83eea8754a8849877ef721d2613fb323a12c2946e4968d70a4e43cda3dcf98af4469fe281b5df8f5c278b3e0f068b3ad63c4c544744d3512ee7442ac201ccfb531a05b03b41833fd7cd8e647b23afaa2249edd0de0ae1e3002e7ddfbca55818bf29da94d3e4164655420a451ce3cf0c98ec05aea5142b1948745f711630215f72e68ce4fe061f2f6f157d4446df7fdec47342223ef8f54052696773412abf5c28d07b451c3ff4578fc855e69b6f18ad1f7021f00e11f704a87e345adffd988b4b984419a0ea3c5b31cb22908d2b4fd41473037c9507a6e2c513349c45313369457e65f74ead5da6ffae71f69e8c8c004dec854c56326b4732d8f6bc036e2672c1236f5257f1eec733e2c27d321b339e266d15d3d43adace7c2fe93ebcfcd83428f7beaf6f40563888f872990a5ffd2a384543a791797bd4fb988a98b475cf29f79bd282f7213a77695020ee69b33f20ee258d3c1086a4e75b93595e9c5171d0b7605961820ce2005f9a4bc1e2bd800ed28e5105d3eb0c91f6b0e3f4d72876a4d2e5a1cf927c036fc63751c7f7f756606fe03d994e0f09516761a8ffe7633422f4bc4a219ae7152257a7e1653bc928b210abb16b017b31a2284626e46f8a30e77724b10c1de68da46e7c693e00db8d708f714aff70a80c00a3aecc26b206034ee4df84e39df2d382852557970986db2826b178cb2e2dfef9842c275b617f11e5c84d245c9d848d2936134b249853c84560ecb9528c6580f9244ec6d6f05de3289bfe1dbb9f142124fbf6a24b3fdaab54d8a38b3a3df7488c1e77094de12b0da3ca52ef95054a15f2312ffb9f82841ad2f8466cc6954bac2edd458d04b64ee7d3fdec088d726f020d803fc575f2d88d5c4a75ec9c34eb326deb3ac0bfd2620825813a06e9692b4bf363968e82f340793d3982793f9f5e51a5b2b722c3d7ecf5350ecd495d5bd77a3055d4b53b16747502602c9105370da072ee4b41b53948257ee1066e3dcd2c0340d16ae802deccf75838b4d2a19e81a561d8779c08791c1f6fc285d42f2f718da160d9857eaeb2768b3dbbac892842b6df1bcca03209d149840dbc299615406fde7e911c0328dd8937e9b18d2076d97b6712aaecc68df04a584d29ccf6f131205495321a34bf9695dab736f2fc0cae697677a2d03a58018858eb4f3ce6559c45a04f3d1e87e58622d040ac8c905c49e7a99534f9020a7d9a1262ad07d8b51a564e070287713d24c6d4f092a871e8349c6d15e1d5b217dcd5f16dc3ac428203c8ca5732e38528eae8455179e51522e6ee3d5439e4cf02a7e282571398b85f111381aa3ec1483b510dadedd2b0febee96396da9da4cd4d574651a92d5baebeaadd108a969f1ed6efad7b203d9a92fea48306338da4117a7357cbee6173aa03397c0372caeb9d9e2f5e39830b008674b0c307e99a515ffc74bd7d91606f1ecf5576c6fd5c1528f398866590cb912da386aa1857443aed55d3edc33c9aac81958763c784caca6579a3cc8bd40fbb0d2daebeb4170bdf6e09394f593a80ca76e837b9a1938779b792d98718c747ecb955816767a361ad36a8fd789c25a3377329feeed1c41281b3c1c24c98e4f4b496cdb74aaf76e622fb9798eff8988271eaed3589c4710c90dea8c68398b7a69149f8b8bf082bf9ef1167a42c1aedaf1862a484011634d6158c9a7ed274a9de012768fe6aee1d1d501c9ba7a36f9f79895ed252eb337a0f9e622953afc945fb92d39100a4ddd4d0f471a60bec6348824354193aaea8daf989e3c7ed7213168fb4b2f3581363edb54aa519496d925349e4d6cba3d1e2b25466861894dfce961ae56a127d2d0cc22ad15b5808bd796a40dc5b7c16eb7daa80b2cd7de23f784f2db35d70d85824fcb216d8f4924294d8079856ad1c61d62e0f0d2e7a6e179c9c289d0191022b68e7db99b271aea35126feb74cd11ccb98b77fc43d90910e9817ac00faf5832d352e17c87c5196464af19697c28aa08f11d123865f52e37b174c188dae00c3d41639f7219b16e1a1eea27fe84c2c3022edf5caa21833ede386a40ea19f655c967895ea33a324294cc8d41af75e48543d99afa5c60ca608de62b9fedb4375a60af8cc618d092bd5bd45e0e8635d61852581697560813bdcd237e859a93ec4489803380d8c41706f6a026378aade0a3b7151bd99e02a67c25572d9af79f5c3acd424734ebff0a46ed96ac63c3c54a4efb7671683e37cbc71eeafe870fbed165b25e91895a68b3a4c920ba3b3a665b43a5e5dfed3e8ecac33e45baf4e7d991ecc23ad6282ce6594910a51667f6765ca73dc92f10a4eeea9a10ce298889d9e5f8853fe1b96963455c4d8d898effde95a54b8a27787a41747419ee12ecfca415b182d579e319c6c006053fdb585e874e62589090cec86eb078e30d3ec84824693e4165654e45f7106fc225d46f1a58cf09eb4231b9945de6cff59476c3763f29c84a556ea3f5dd7dbe0ba63c783b385fc08d0ad4e2e8f65ea0d7e980858cdf9c76260f5c8a2f62511c692ada1eca1148afc54f3ff0cb215f14127624b795eb0b715cf9f7aafd6dd2b063197706cecad0001b7a3b8c46c633532da22c01964bbee0747d06ac66e74aa381dcdbdb4f4b40d817f1905e5fcd2084b0d45e0a99e7fdecf602533773b6ff1c4bd9ce43567ce062421d060d201e6fd02376847ba5a710bd6bf0a4f42ac33a444a7918e6e945f7c32366654291a1685e0fef64fbc3733e7a5baec28b95f642420524806e138ecf26433574a4b93f5257fca7c733fa33d14c4ca675a3bc37613f0443d080d93faeb128f0fcdca0de77e2700674ca52cf0f5ac83f84e4a56fdd63d03ccec74540dd8c5c01c5914e671d28f5743569d32f41cd56e1b9f85a84ffd5f07943e85e79a4e067ce976cccc38d501259d0b8863baecc7ff4da84e3600fbeec60f68e2cd24ad5cfc13a1521d80f83501d0e5e72dca080c9e0b03346e955454d5bb15fb83419921e4075335590eae93528b7049ff85d10be0e03aa8d0918939ad13a0309855740dbb5126e71d268a94be2935116782ea5e6e49b94c0a7a2cf5b2a5a2327af4d068f87d7707b85cfec1ab469eede455b67c8cb3f97e5ab392219cdd9671b98430dc11e8dde7e9368d929040382ff452c7dec2cb95b06fc26b45a247f76ec2a807cf9e2fc637fe37b99003b27b68262e910da6dcf892a84b1aca99614f9a24b4e7cc03beba5885d505327c29e326e83d9471bf84ac95a2a21338b8b5f9746e5f3359c91234ca0e92e3027ff309dcb90454b3633f1c29dd6c0708a6b29f9dfdfb8ce184c6d01d06f5f58865ca4a0a2707543b3888e1dfb70d48c2d9f3ac67521e570b9d48f6c1fd729f2cf40c4e2fa0db1581b5ee7817ce1a6aefc8d5aa71193c242099151349509d5268713560cdb4e41b2f41cc697290f7eff809e5144b91d976d8fec7d013aeeaa1e383c23c54d1b6c78c92cf10709e3a4a7403ae64478a7ab18d34bd97d176cf2ff6925f3b6595c7cd31ff5307824455fcdc5cae3505319476c5e172f4e336cf3f4a3358e8606f9b7ea80df4d93831ef89995b40e0f545bb391b7b9451c96d7f7226dd4bbde5ddb66e673520eff2d54b7343a622f2a825537ae6697e390499344b44f6a446664e8d0ee81b63d642ad1e4c63c3a1048e5f01bebf41bd351538a22d0d15fefc525093f2b3073a06c837bc77621a678128612a671e8acdc08bca2db9f7c1c85a4a827f9c40bf100bd3f3ca86d730d2e2f6ca42168cab1c55d8dc5b648d707cdaaf32847e2979924ff66fbced3b9d7fb489f8fd4f8239457f7cddafaf36b89918010f671ad5ed1d6db01a082cf7c6ba70528b9074779bc5a7f84c9f0cabe0b97cd0777bf4ce702dcf817120c894333fa0d0e0c02805791969cba7ae0f25af3a83ade9579e8ba95ff00b03bb42a9696bc09596f0cc9427bd2f778d41196c7aa8c6f9f36e6a860f00798d402c2dafdfcb4a012c96f4ac4e2d838c5c1cddc8b990b1352444fb5607dbc6a8c4f7dc001cdab7b4004712d642e6e06aa295aec3027edcefda6fc3642a3e61edf0a2e0529726942eb075b97abc75d092ef201ef3ebbf94aaa4435548fc94c5cd61c1dd0fe51b69c1bba75b21f166cea59050a0d3bbff82c60064237ce59b7cb786b924a07d35a31d90506a64a816551334abd6db19ab31f28d46a0687baef13cde0d59bcc601caa2cd0589bb4710ee5c5a9623827b4efc90996f7ea4254bcdddd632dead561c5af1d03b1b8e34f314f160b4095267577d20b342f0a888fe6d1b1dde45fab3c1de7b3865a25618194372e56a0ad354512e336965b8fe0d3349650344024d55becfbf6419b0bb67100431674caa8dc8c87a493a5c2a0d3886fd5c2528a5edb24fa92ee1dbb9268853c1ed54b06ada3b29fbc2947ae66e8165f35101d093846010f55a40004e10127126e73c59ce4131f22d400656508a7e5cc5f417f07d89c59f2ec1fd4bc2109be48dcf9c9d376b33bd89321e830af985d7efa5d5fca6668946cfe677f2c7906b2a70f6e3ef58b0b6f88a293b6578344e73caf6da49b0b2f19453385eb9c12826af7b0da0e484aa421fca85eb922ab32e9d0267738c2ee7b52453580fe531304500066462015dc05bbfa4e8bd7d950eacd000686028739d3a633a960a29ba515cb89dab95ca369b6a34b3c21fac399f5f995f79fea3211c07dd93a2ebebaf03c435cb33baa3c184043b719280929afdad757a3ccd80aa0c940fd8ef139f91b01203f9ad4f226112a01058da9ec53b921cd0daf14b4580e7655684db1fda04feccbfb378d1caa7dfc47ff42aa8b89e0534581c6806664834f25e22076f1f7b386aa MD = cdd84a87e1457601d899b2abbe2e0974784491b7 Len = 37736 Msg = 1600a349990df42aba9fa03f70deff0f75ae35c1a882b48caf75026ee097bd216284dc4b8f3c37f59d2e4a3e7e96355004090894494e3e224e70877ce211cb7bc6016b890e10ca11ca200c34e67e1dbe4f72f55857141bff5b6268b4a3900e75899fd96dde31b468899c6e89713dbe3f9e0f85759b7b54091e722e80eaba8ff8f585ac5dc648fde022caf9a5e77c21bc38083f53da2cf02adec96047813755ea50dc6fc390fdae63dcd334f110e24c1e6686ac5adfcff749e58e86702eb06835e3cba70602f7cdd801dfa7d3b418494b70b152f3710b724d79ea2965bacdd1bff67bde8ee5df6526d715dbb49ac5202d9eb0bb8457886820e305d08ded359772d1149bc3005c7b37a79e57fd8b92d7ab37ac6f775aefe1a96b0603508e91c234bbbd670d1d1719f2b8a2a3144f2678ac85ccf43242e8e5d058164a1667885beffe9ec9d402b7463f54484863ae2b0a1ace39d41fd71a7d7df45c2e473ec3688ae0e0498078e50b06c1b8cd50704696dc5b1a97a4e02eb0988501364bdce9f4edaaab6f7947496f2f481bba455c2123da7498c32b27cb8709542ceb8b09a30400a326c427378a7aa3319998a93b64b9fc61dbe21b729a08b8a906d36d8c99a2ab157acff310513448c459eee4d5b7602a690a7bdc8a433d8eccb7785a2f72d5d646ce18439945a6074984445ef2c0214cd54d17d6376d2e71046662bbb8d7a6697f4b28809b0fd7c90741237e5a2a034aedce3d7140c0e24a9a3b17f6f06f1b4c08198613df56cf7447b911aed49b0f0cf9b275156fe66102d65f21759fe33f67295fba622ac397f1511398562abb4c7a4124482a8a84b37f00fa089e8dda17a22a464dd747fe36296d7840dc2234c27d0d4a3c185a45e1ab603352db81fdade652f5c6d9fcaeb403e31090a985ab79fba44cdb47a7cef16d3e33899345f40819eb94adcf137b1a66fa0210251acb7add4f53ad1f39caeeace122342d9f6630253b4d8b23520f6f3cfb7748b8ab39cc0c56873909d7dfdd529227dc1358fb2ef08b46e73c820fbb6c2e96c1cbfea0776f010f076b4bb5c846996a08ac385c096422a749826b2606dedb8802c4dda684ed97139fae5bf5b6703e1440600631c9684a99395dd4fa597a4a74930d0ef3fa7062bd8a3bd047b0b8c94d0d978c2177e3494440358633bb28c383fd0c5930e1dfa8334f797152bd06813cf5b990d519bf68cfe5724a7a35d08dddc72b88054121b29d76cf08bfe542af0a822edbf5bae3ef62b17ce677ce5af1a979d161192320c82487a75b3530549bde3c5f35285f3726272bbc22d18eae37109c65ae158ec332f00b68345da7248de1aab2651612a35443db98c8307db4a739b75135a08bf237288a7959df519bcd3b54903568da0fc3e149799e3ea455884c52fcbf63219520f48a449262379fa213c2626bc6c063b927fec86ea00a772473f5ce13065895357d9530a98e5f1956917d8ed0d7ca877f3d81ebfe01b703c1d4292ffb3038d8beeb32a5640dd3f22fdf0c7e2c4402635d4c5a4c1607b4e2a89775873d89ca470366ea0b8d849b107622f79847b470e09a7c1251805a08fa21e5623ea2ba15ca4c1543cbea9ebd5d7285c746e8d01be480f4306403a3bb3573e677bcf26b214ae020c74b440143c06d2d03efd9400b5855dd3cec668ad67ae8c13c6af543f7ad08b0fef462553420ad4533fae0ab4825625ebe5172b660b0c69f39ae72eb9edd0ced6f2e0e4399677bf3dfd1c6badb31efa03ffaefd061c156a7f7f1330b1ec034fea2620e72797c1f5f90db5214cb6644cb4751a57fe294e002fd9cfe4a8040c70b1ff62b8cdc47e1b3cd804e6120aba8065cbd5b6ce911acd7d3159c50cb440f3e6f542d36cbb009141f28804be2e7657908a6db3f8120014f02c6d5c607b352bd19e2dc1a4c9fdeac0d3bb2781a04c14dd274eb9fafa92992111570543d77d9b0a50a00e06afca9a31f21aa90d0e905aa429054347d946ac7886c37a17477ec409b3360302aafb221dd43313c0a7e78b7e160dda7f2c90d16f032f056b49bd39484c4c5b096a0414dd0070e24d2ab649d364d50a0163159a8cfcf641a05cbd5d6e827f70bb5b89e4f7fd60bef2f580f83cac074c6f2b298a5b0ab5b9670ef3b2b4dc3bee78fdd11507219ee452a6dc292231f10c28d351035182e9d72fcef4ebd3d00e2ed2df8e178323680d0c9d2c5f2cbd3ed3bf0a30b7e91c0f155b2b353b43f462ac496f257ee46978935167060ca4a45d3da21e2cfaba2c920e798249538dcfd5f14d2b1bbdb36a2d11f192ddb4226dc89472adca4e2d4b1f3d1b9285b6f9a8d4987ea1f55668bc11f34d9f27d84e9ffd9291277d44bade02fbb1aa8ec84045fb0c3e5236cb8cc5b3c1c5ea890b51a188929e29da610b7be9f4cc58d919d9fd95c70cba449f881d7f180b0355a00428e62eea13561567ab40a2dc1bd92e3f5641537a58c354f339f0408d883248be8c92c2157274e487d2837061622377d8d69a2c07ac276e5691a3d5bdd78357e9431af690d5bb50b4883ef7ecda3c893ef4eccb2522e54e1abb06622c7fed702cf2eb26fcab8deca632efa3dec278c4fa47d5bb535b8196b81c945049efc503f1f28ffda962810ab578f20ec7e98ccd7335c17732c480bad74cda4aa6b59e95c0f875c53799394d6aa10293388ddd0532455c7913ec674cc0b2449bb36ffea8124b392827cdfb374e718dcb914dee0ec00ce35ba741a9af3cf37fce005d59bd8e814690ea6f5b2ad930e0227298344c94d312794d42cc648466c87c1e2c34386e212a8a000bddca8385c6324d0b4431496e566c769e43ff3fa2cb105d4b12cb69a1619df901f788e5d69c759105926f26052bafc382b4f1d73e04155e4879c8e998682746004cd868b9df66df15a368d35e0eadb4be73cee37ee0058182ddc3666ccac06785224b94960b7097b9fb80d9cf7c00ba9024f8dd0c0b6b77a8c34d7894e5f3edef3c54f1f1ad4d5b710f79a1eff02355a62d023c6bc2a19128aeb998b7662c49ccdf86f95331378ac963a5a4260790067f107d79f4c2627e6104ba3f3ab7f3fbaca054134133d9b6217c8789082ed15d7953bd2e5d7708901079a1e49547c573ed133ee83231ae5e27cea1a90ce261bb238b63b1fc5d1e66855213116db22b532c9cc9e0bc971ff33aee869cbaaebbb00c1be3bd67d11e625e42805e0a739019d9c1678526e0b905d940a8cc87f059dca189cfa9169f8323e9af7c1322089e288315aa5e27bb141691598ab0fb63d681825989fd8f04e72be61d58e91aed901fa70df4d435629ba5e1bd9f029b559c4f0d0f953337ada4daa200c9487b9f306fb41ef96fb693ba2448d16819de6215b5c01093d2b6f656c0cbfe2fa9ba99d98938cd0ab941bb1a224529786f3b05fd263a00e864738b777eb25a0e956e6a05fcb39cbb296d352610554a428b47ad9d40d955155103b9815503c8d883ed8c405aa3028d487fbe588ef7a858e67ae580763c81ad30de1d0ee42ebf300dde8d02f395a2f38f1fa33beeaac81e294b3a4136c21b127c69226abc91a1878bb7c8e877f9d28075b3804acffd2e149c3f185a131895d7bc3b764f4edb145195efec4b584e25a684e1d1ff935d5eeed7dd0c359b8e667f48db65070b799c20b50d43b6150120e8451114e4e959bedf649b825e20b2217bcabf9b3c82eb8d7751968bb32ec138c82ec7c5753250d298cb01175e53223b5fba5e654a45bf7cc7f3f200cd05fcf1c8ba7c603afef13e9d53943790933d389d804e7fdaa443ee8534c66f5e4b12c06c70b571a0bfb9674fc6cb6faf71818db7c4e637485f3767516c8a13f16ea14915d9f97640e4f7c1327d1d2bf56e9dcf20f0ec282db7085b9f33938b20d136e0676ebefa961f5af0e7ff10092cfac0617b8c96bef55c155fd10299516723422ad3978c5b0abf515ad2b53a6390a6b7e929f09c8839af0cd88951f1f33ec5317cecfcd824295559838537f2e7dae2d2cabed5540065305d4a4aba43ed1247a37b15f738f27c71f1ff621fefe2663fbf8aaca363b3f270654977a3f5ab7c1b0699e12f05227e85b9130bb5780fcd3dccad65d3321f7bffd34aa2978dbae6cfe95dc10ce3509a00fd82e49121ac7a4d88a78cfd45bf6c2f15c25e0d72a7ecd6aa3b480949f979945db38f4b8364e7ef720d847a14f04d9ebb350c9e5adef8bff7c6e8acbf89778048296e3d03b5a0a42743eee2366e9acf223720929cdc84fc2065258faa7d2e855b58f40e291b3efc06ef2ece1086ce20e94d5cb2bf2d3c0bd2aa70fa916108f3e5c6c3076a021d679f73b68639e572347ecbf357485d687f7d1b7da61ac1915ca5f76dd15cf6c6776f5638a328e7019a614796f8bec9a4b78e1c8dfa8d1b423fea6f26f46885b49be52b07cd542806a32f44ba2f891e7b54944234609edab61e41a2b0e9233b72559f46b63d4204ebef4747cf644da856d71e010380968c47683a168e0803648a250c5db6ab892a4bef27d5692f6313b1af89fd6dd32abc80be324f01098fad669aaab4ab608ff481136f51f9f96fdd264e767bf5c0b1c7ec70d8c0cc462e729216f90fe724ccf0360c8c62044ada613f5452211dd1c24b05308bf042567660873a85b40c40d699d53aed6a1aac294c3721ab7158aee2c2456dca7205a2edd3d075cf458d4d137de91f20feaf85d2ead866e0e1389089aa379922ba88b3fb58e8493438ecb23a08ec39c57425706de98d74a0f5302f2d7f5643132e3e22357c493552f2ad1880c7490b298f3ef460c4b0db5a21c1e354ce2bec1a61a846129a7dbaba2730d8ae359a13eb943e7a41e8fd1b8afb8045860322f4b6e959c8195fe059c84b2a8b08e059d47a27b68a97d2ccb5a1e6ddee37aac61d5729c500c0293b831bb30ca8273402dd63be299db91eaa2a3d784d15f041af96a9a77c889d82c9d7130329989fbd2f9f26cc2a3c5c291fe9bc24407536542a20fce6d2d807e925b64cb03404c8e82a8a31d61adec79e8894bc8f7a84705ec02cef6c7a7795e8d9b1275eae5549519e3f13609e0da1cb8e8bacfe3dbc34ce2c1aeface5dfddfe40584142eb127766051e59f00641615c9c6f0c052c950a2eb88b8c2c77893696140c19118cb4f9b1c9b86408e6028cae3c9f6848a9a756fcefff236fd1fc464caf5d1d5f05b546a1868dd01fdfc99a5ce99d301d475bb1b54cd663fb77b1738e8cbbdc7fe8bbc4d1b61f0cb9362ef0c51df8f217782a90e459a1cc33cb4144e836b8c4e898111abec2ec9849ab7b569364333cbbdebc7b069101aabd5f1430c637c4654db65daec5476701658267023436cc6e7ecd59d6a87d56ae0ca5a2ddb4fa7f4c03a60a0771be1eb6716d4aaa24103505c4d6ab4a2699114496319592410949c7aef9aeab6091944611becea4ef7afda1428d293c1d5ed1ecde8534f4d6eea4969413a4010e5c383ebb194b98f2f196af6c535c23094909256a03398c0315200777a682aed798aaeec1ef49ecdafe90bea6bbaca566e2477cbd4debbe32173cb8be14e31b58b13cf4eab36217040c6c2d86389329a2a4ed613cc7f402006f6b18dbd11dcd1e409edf8a07fcae0aa5899a8f6cb826692b8b618d03cb0dea782bb6657dcb4a74c1211d245fa2285b548974269a843216c0a1fc1283d9284cdc0effcf7d540a08bd642c4e1ccb0c8293ec48f0747fc3281eb1af61bab6e7c40575738e424082468ff88b6be20fc0fcde1297517d135039904ad9ff2aecd2dc8f0fb0268f2949cac32eb90221c8fc36adacddde06d76fb7cfde3a5f66d35ff2d33e143c9676d6e1f19743a56e8f04dc8d0b9b0ab444882f17dc1ee6c11315a36c713e150aa1a04895c2a9ca2ada713af6cf3d4c07e3200c12c51639fc146a6ad5599c645e423c5b2a3169f4d933d7fe75685336742bdddb4b49aecd6a6fe4b588479d8f03c111862953e29a1c139f8373576b4e8b86f8292baa47258e8e0b1fffdbd0198db6a6760daac23e46023e569b2cf3e8a09d35523e978db6eae74416c686d2887e8b919751b68765f9784b0437497bb975d6ebf2fe61d1160204361666c8f35038c8396690078085a8fe3c08e24d61255dbca297d5c9bfa7668d47ab4b12d0f55ef52450430e6c31d6fc87d1169952b0dac6ef9d6f1fb80f8abaff51fe04ea0c538ad900d54ba8eef60bb4f96ecdbee06f7e299024d448a2d145d386fa1fbcf9a901dde4e13fa501a8a459ee354b0438ae5af6fc9197eff5ec865ad6c9b3b841e1e29988d16b0f3e414edd2c24a1c12df9e5ce5f3fdb1c9d3f24fbbdd7716a7970b59249304e35e96273c53f87628434e49716147a0e6cfd4b8a4c98cdc94214e7e35eb28869c7977eab98a507fdbbe1f0f764d8eab25f9a942eb413f73bed88ba046551344e22cd186ecdd910e3e6b9a17f41090c5742f99b9ac8abfe49bb5969813cb1ee5bd5fea225db582ca5732078a73121597dd59ed45700cd4d633a0b68f24b30f1235fa0ce7957bed5c30fcad8f79bbe5c9675fee0dbd2f45f18f8234ad0276af7253e57dfd1b95986bd1afd54f9073c7021a29e13a1e5bdcdeb6415819347dc6ae1e09858b776d4ba04035c7f13fa285eaffa011f318f85f45b0c76afc422f1c6d9f4c6eb93269d0a38774cb9e0fb0e5 MD = b51232c68cd82ce9ffb4bc1fea0ea9f71354314e Len = 38528 Msg = a489cc5f00c1835ddaf2f0586710850752abe68d001f4e4e180b2f0043041805308adcf8dc3af1861046167f2b23382c218197e4c48025da42212e39effa3e73452f40d5299de360705842d4a258c30dfe6f3f92be7e646c9ce9583494489f70ec603f20725122930510bb7f5618ed51f05d28c27682d5ab2c4bf41ab95503a52c0522fe3cbe76c8d457cba9cfcc7da10033989a75f23e40fc304912e78932b90d063299114ca6a7e713b87a93da3ca434d9d842423868d2147ea045a54cf355974bb41978637cd7452ecb192cacf203963830e365ba1b0a7a1f41db7b061021d3bcf3a6fa6bbe01f68e4caf22a866652e36e7a567e21e9038f974fbf11f4fc4c84236661ecc35cc031d8363fb38627302bc47afcf173b0b56f681cd90ff79e77ec3c4846ceea9e173c1b75e41c3acd51db3962a25c03823dafdaf7adf0f5631fe28e6266c3ae2e74e6432c77bb10d3284011d3df247de81cef5482a67b5ad4b4f5ae475a716a7879ced3ac732694d3241902411bc13f5cd39c89204ae5a47dc79400698a4ebc16966441886ed55347e5a46f3cd0e8c45ae245dd6313e67ed8d85c194b7eb22f934b451142b34dc8abeda0dd19a6d1a95cd969c5bd99f4265067ac7d5fc052115908cfc75df8f661699c6cc08a06325afd2976d6b22575577ee6039128d7952dd27f82d85c9875ba1b8286bde06771559642fb84c37f007edee40fe9392cf1c1b9effcc8a12a324f3c307d19cf532525c2b6765473ef2bf8ead2100a03490e695a0a9c1cde16c27d4616ce889941a4480d1465ca460e3e721d40b26819a431a14d3fff4965f69cd0c3a5e97ef0cb9548cfbd586abc44de66f0a06587dee701f60df084d2db3227e62f7e5c6148497e84a531bc9a493b72440f81b7edd559f5d416dcdb5d9071fa3a040095d41253a6a8081200ed6f4aa095b455181eaf9593c7f255412e380e9a28cbcd345be172c40f72dec3e8a10adfd8a9ab147e9022524e1aea74e934807e5ef144a64d381f5d477fe883f080e4868939f41b925988c7d31b1ce4f318701d290f077a3c88b1b8cc89cfbfb981703b23ffb0bbfe5e115af35d5cfff056460d339f660eae45f28d2b1b04d58825367435657174270084822b6c3b4445708aa4fb0d10f227122a40dfbe286400de9fb83a05a6b280f33ad3e7b2285086e9b6aaebe278c31b5ff15a46ed9af9a820247dbe5ad115b0a8bcd6c4e9b4832934425572ba1dd01f91c0501d23ed04e29c5d4b1ecf711c1a9372f12f5d607aa0e2b65b4bfe60c7984a1fb8befb8ef434a5b296e7ee17144345f5b9a397ac9582779b12c429f2180a0b780aa8df016632debcf7b63133bcbf22dda6ae22f9724265692277b73220093861bc6738d4c951a9e4c3e6334773d2cc733ecb89f78f652e98f0d330b19e0a63554476a389ac1589c2a2145ec2b842a55ee86837074b6f45b3047320e0d0821ecb3963a9906cf300cf08bd3e56187340094a20a4a934c54d3fd3b4025075f4cd5c119ab579ba8ea1627e4d3c4202e92efaca716d6dea0ba7a7f5225f80ecf6e150539841b5e32cee456930e3471618b4cbefd6fbb5c9a6e783df4a82e2a40d1d7075e8f8c5956239b05024cdb5a08683c520cdda21523b7f4bf8a936f6398bb4150f1925393fd3366bd985561e60b72e9f13b28331221df168e7aac65c2c0757b67585617140d446b04bdf06f1a52ee7b22f417155a7e2c08312ebcb64ea047aed4fda381e5709fd265d9e7ad00c6271a6e9f73f1f520e7ef300c8a0a10207802204641390d0c8cc4655400c29f4d64ec5ca2046eecf157f6147ee00a0e29529ed29df7e694cb52698e970457ffd0ec1c7466923546d7c64264eb845d52a11bab72698e3083933be86708ba13293808d03e53e5ed0bbc7afea8bb3face4721c508912cfc1e14e8d697810ec9f246b003143d2c43f4487bc506955d99fca829db69e007f3eb6e391164a1860a2f8531c660a49f9d3f820d4602d231add0ebbe604399a69520a3a8f156486dfc5aed7a4971b214a502f6f0a577f8cca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeffc3805ff15ba65de4f8b0dcce44effb227807d951ce98aa91381e0add5216903d9563a747ceef99e6cf95ed5a653ff3808a4b9d54db3490b44c6e7b671a91a85d01bad138b02e340c7a41e9634e777485e9e897f64ae96a3f66e8adf11e985ce86e4f84cde7ac56de5f7c79f2e7dea5b7fda66e3f03005dbbf05645864673d46544e8690d5cae25e5e70e450e18beafa12e4dca37eec093af517eee2b7a69395cea4e2700f77fcca87abef4bfc95db9c8e5a455e7f47334a3f1284eeaa2c3b355ca4967aea16671b081552f0de205ecb68874b456fb5f671f381e0dcaa6ca69d94ba0d12040aa3d83629c9d014bfc70f28185928cecce55ac8e27d4d46ec3846fd51d0c5dbd9457ab8758e7a2ec8a6c04369f9592b00626d15b0a4b0ee2f92ba0d086c16d016ce7b05654b4f9adf90875118a656f2d50011707901982ebb387f3a4a49759f37a17183957ad0c778f6ecb780dab2b4df30e05fa81e6386f38c0f0ba3f37287a050d6d97287ae53096c391d5f20fcff73977239ca55c3657d1fd1f781f48e28057f136d890c28cc254324c8fff3862136861f956c321868cc66609470b7390ecb6ecfc63572d071312e0860efdcfec88c9f6108ea5dd30f55f253590cc6038a66b2646a24565600d17f8c6bab37b7640a45eefad11393a79e45f2bb92ab6e595bdc69cfc210f9f97ada095fbebe5062241c11e1cd0dcae029c3f742ced1e9ca3f6f486d9b5d6ca981a007a396bb5a716e7462642aa709377d0ea974fdd3f67b75dda8da1c75febfaa742fddcfc925e04df158e86669af2bfc88b1c8cc2c24db9399d38bd205509a49c8ba64c662435d47257de52ce04d2c4cc488c4a634e5792d3681093885e2d7e4106fef17114336ee5349f0da8563b6d24496ef0898c8b2873619c8cc7225e70ddd88c34e50a60bb83d3581ebd3736a217b74ae8fc23f36460b06410a44ba462ba2cd87b89adc5a1935d91efd550c94beebaa99984bc972ee47ef088e87e073c1e286b2f26a669095cf9d2e7b849ff51f279116be9ff7d6f45f3c95a5b6590e652f4ccb9849c55dc27d0a46e2dc9dd9a681d0dc6f293af0dcc3676f0c5a846489eb9837f6b388f003c0a8eecfd786d0f9bcd2212692135f2c1707fb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb6ece06c01e54f4bc1dbbc9592d1467c6539c26c8cfe06cff51257e6b6a06952f415f3594876aba50ad2834095403741505b16784225ba3601cff4033e713e9caab6b3239bd5c2c1fcd22382b617f18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a3d8279f06b87f806a88dee508cdb536e8539a384790399eaac7b3a24e3631614cacccb6e9329ca6de0a75ec4e3c1ead8c30e722c425e5c1c9e0678cfb4783f676b17587a504961c67ecdeb20c14fc6aefb398056c6cd28765a7157d6b24972dbea0b29fdec0f437a4ba69e4c6fad7159f362d5eb4b76845faa63e02122ff37d80e5145ddada4faf20fdb7e313504734274307ad11a81f83f54841a984fc116c69e91b404dc300e95921393b55a7c52d0454b76f27b170c7f217d0d2480b8980d63727f58c0da05ca9bf7e6c1283c986a305cd134b5604985d9f6c1abfc0c4415259dadc3a3cb69fbf42f7e3ee56dcc7afb0b9381128336ba44963f160ce4a246abba462ccb2bc18f63626412da3677676fffc5c0d8a85c8629068e4ef8683b09bf70537a812196eeb1389e274fc0209954e16fd950f9415252eeb63a08c296c42767da970dd56f80a65b36638c324f78725897b3c29b6f8485f4c0c184173ce1ac48e66ab770d4ac097033b0d8b58d6c900d473876b96e868bc3b3cdb392b3c616bb7cdbc71a4ddda4229ef57d7160dd78a7864fb379c4be2c019745de5885dd2d67a6d284fa63783d167e1ac18d5333f0cf5de0c303fb962f5774104d94398cb9f56b3738399de69df7db06ed32ebd6c12dd2d4ec809b745e6c5318486c583d810cd4f229fe848f8c6bbea34887b22eb368f01177182ac27fe93b44170869574e55e7ec9f729edbd11a2ed81cb52fa48d29bc80acf232e75b75357c0191f442e878ae0be4bd763336ae338dafe3ea9e19174009d2373a4bbab948a84f2f8265171c31383f0691fd81ccd5aa4b3a6c851ddb8395320ecb56645c7cb14a099a2aa3e9775cf77579a27b1e1d1836e23cc2621c8d0a15a06c702007d97d3748c4f85389885d5534b58bec4c12bdb802e2bbb0836752c115a501b76268f561138838f0a16c25a168cd1f9cfebc821bc2e7daceb818537f94fe71f21430010f936f5042dc2b9a233c49c552db244fa54bd2868662a8f79645002897c6398a88f000a911dfcea622d6b2e7d88b510da0c52b269e2920245051328f6e1f8c761551c4ab25555d30e85e90ecf4b74ba252587b24dfb787c4f3e01c0c41c830affede41be46e4de1fbbfd693c6f071bf8042a48e711b1e5bec8194708d6682d1b8bc1014b3b345b5de4dac73f1022c8f6fd661dd7fcc242fa17253aecf6a88ca4041f8cb8cdeedbd1aa1f315da1b15a8387327f5c6790a760282c7d1e69305431b023686fc4ba676357f130fee85bda89e8b6f8de1cc31bd842559908f7a78da9d8f21fd6e83f06fb327a4b8aafc94fef691c0fc5e104a74aaec8151068b640f6c4b739570026c08182e20a69bca2c19d52894d797ffb529eb5ae79a0830474ffbc983c59d6169ddd9051f503d78f397aeb273862be4f24bc9d2f4e1f113a31ac08bdb24430b8a6f8a4ee95c0ca38bd707b1e5ae965a8258cae721bf5daff7fe5ef4f227fd7b4e2b805e171095c4458664c963b743eb05ef732a06889a6fc6792ba76157493b15a06fd531144545c0f45a4b6616d0f0cd6e36fe0be453dd8f09bb259128a2b5714cbd26cfedb7b27ecf3cca6563aa167953aae5ba390673c23e81c21a12969501aedcd53bf34994ef6590c8fa245bc67a4e23738a2d2ebd0066243f54ab9134174563631dcb97678355fab99cbf427b40ac552a04074923ba4ef6efe96a2f2d528ec552dded0d94eb2eef3eb5bb1acf7cfc947bb07dc24260278e4640c4dceb2409971704ce38b7774ec2aaedae311d8fcd85db07e7369382ae6ee4e35206f80c343d421ae59559c83439909cef11ffe98d9dea82da1281a231fd4e497849ce8bad4c4698d9afd65e8d98825c1459e12abb310ca9dcf2b73f50dde50bce21f912c338a706f0e4b79aa983f293a4656bb3e503c3f556338eca99754b72ca0be2521486e5ddf1d0981d166053ec25c0fa25797a92eddc7182d45a47d446d284249a2fbb758622ffd24662d248ce0ef906f0170a1c0be6193ddd41ea21c09e072a7b534af8b82acf00b70d4e23a1c67a2c941c36a1d7f9b70a45bec0b6a883218e765db9c1cc6fcabdef7438871fe2d0d5821784d6ca8dc792ce4f600547085fab1b7d8c733b687f34404625d580fa799c5a87892d6c28b741a7624c9024b40e2abb51378f9dbb593e59d19ab18d63e0db8dea9818254122a191a5ead9da0cd96806675f795bcef516acd50b8d8db5a33d8ccf46298e6d863cfd78cf54df893ded6d2e48b30e29bf77b99efcec1a764d1ce79417c420045e6e4b596ea39dafa845602497df2d3234bbf0bde33fbc1c2b041ee7918a62bc17d01bc64d18ace6a4ea7fd8d150219ed16df MD = adf2ebb0c337c89334fe8580b53dae70b25d00a7 Len = 39320 Msg = e0221d19cf617ed827d8d8cb8d2c8ed81b9b3354a832f1d14a402b371a0a611737c0543b0eb06b82d8ba56eb6304f1ef16ef6b143049a7bf50c4e2493aa69756d8c39f627fa89d9d741a99f9afbfeb81de1a5becadbd867245b984de125ac7e5ca1146b6abb2dbd204dfea1ef6c444367c064b05a9f556933109571d2b8cbb6b1594915e1934efc98ef39181c27dc4b8f7998286ab5bdfc91d9ba42f0ca63991c232c88351989f291d3dd64c9a5132ac57bd4a983c56e8bd1057b23c3d0e0affd8d5324cdc44b49ab6a501a407a858bda559e963e34e3b161225cb6b472ef65c5f6418e241a2f6c6631359b390ebfc91e854a80e28ab9e7d2bed35e4b16cc45060c7c26c08182c522b6f27a1bd80e7d02898cfc293d6da9a649739d003323e85e1e67813ba1020e917a1b39616d0e1236d0ca6a6ad35b714c40b1f57c6e72aa0eda982ffdef198312d9245b92443b232c09875e3fd31fc9453322fa081f2514c89f82757fc235dd2772825326e4221a4282483a00b3373c11af2b1d4bcbd7b2fbfbbb1449c0e3775fd4c9b2a7c33f721ae98190660a1e2442034ec1a00af6ff196da66ed471aedc2c6e7eec9d77ffc5359dc7f3d83e412c46ee1299bd330f73b173d8f7b84af4960dadf6736068ff8df31d9fd6cfc65cbea0adfb07ec0a8d9b548cc7315dc3511f8411e4e9a91cab3703e75dbbb548bd45efe18c9ec4c7fde0633705ce4d6140e31038aeb1c0197f4ac8999605312bdf7c75272bc0d011eced6e00f900ffab408b4290d85e5dd60853b192ed55cbe65facd0cd7d00866eb71cf559258bfd07dc728bb8e651cad8c2cc6f61a82fde1eaa619362e4e06034f8f979ce2fc1ce1d81236bff4d4eafa83b2f52947af5f02b4c353d75f7e2e61b3efd6bde5c44db42bb2863f2918774aacdf6fb99ba4aaa92b1923f851a8a9077d5a35be85f87bd1df70bf421479ea28717addae00a8055eb76f2fa0ee149e7d17985ba9a9dfcdc15d1289d19d416b19394de6115d0598aac08f22d71d0a364ce771f28539c26c0b0c608ef3acb624a76d1e33e999018c14ae3fa2a5c6d199fb57ad9f5b1ce97f37532473b029223a5973b66b3e9ee50925e9485713d1b2ee12cd130c323c9c2fce9c24e310fccbd8b7b4dd371853f93663d972eb2827f55d1ab36ce1128023a4574e29841c0efa244a985a3f80a0843c58e68403edaee2109a7080c504d0c5055ad0fbfedb45f6469988f72a7d6dd0438c79484a684fc02c1a6c17610e14cc7a5f8c62fa568a09672dea7aa118a2237286f88465a3f3d9dc220ff95d3b347e2defe9262093c679af8c27ac4b5828c6f1cecd01ffa68073463bc1ed6090192443914f0e179cdf8f4540a855d145e501e9ec5e87be77e0d792eceabd1217a905e7ce26e48879bf9352d1d43ddae7c21b826815de4a20f94de9bef22f1dd7cd6b3f2dd76e1a304ccdfdc5122b0f47a75ee3cb59cd4ca9b51c7338410c26d86e9c7336c87576cb70846fa6cce9176c7d10359d911d6c18fa8e57e23f1bd82372e1ac7162c043511102cffb693d9c5e2a7a9f6427965177b2e9be445526d8bfc38212670d192acb198d464d51f0432698e44aaa8200a4cdc476cfe7e9f3d1b447c7cc9f3246d3406f6efc23ebcab6cbad955df60a230c23187db352654c690be8f803a13710e5b8fbed1805a1929d5553d701d127c732809646910d2ff748cb8c5cdef6863f093ca551c37bda129fcd71f05ec241b3bdec261892a1b1bc17fc1d3c8625859be6d255e4240eff10653aef299b51c0b05670b03dde9551657ea682e022b69eeb2585f3ec6445765597a4b4cae1060c86a5121cfb9c7179b824d2a390db3238f96d5a67b2aaa9a8a9dc13aa1b576a8dfd51dc529bf4be907fb2886894d920ba8b675b997e1fc1fdd3dc90b8642604acdc03d63a640f02fe80cfceb93343088e6aba8f7298ea15de9d4022c6ec755ccfed6207bda015c82a8424ae7eb741721b5e0ffed847352db1cdb0d2bdfc6dfb60f61777c1952e957e52592f9f66fde7c92f0eb1b4d42592df2cd3a783dc3668c5c0c92e2f8d80f361b4155904899cee00a45eafef87e4cbd18252a901d4f72b68132135f0ce36693b700035966749102886a8006fa89a60ee97d4e01f2cd8cdafb7c793eaa07680754fc3ca3b4a2ad4a99d93ad1e7f6ed99d320255c62b02d504736250074d68be75190621dc7867c2ecb1c8bde35489bf481d840fdc1a9dcbce109a752e1c36aea4967040623a2962578aee38a56e139a561e01164a41d03874571908475405d56a8daa31b3d8983d53efae274e1633f02ffe2273f9e8c4a3600d8414393e00bd30c85cfcb99adbda49aab091c594114b3b848e2dd057a194f9fd869eee224ced5c0d2da75ac81bc19f819b7ef230d632e17aed4cb6d58e93a7eec5b04d4814ed5825c53c80a97f7bbf3d18f6bd32aa2e8ca6e9d995acb329d2a7e9513ef77e468ad8cdc21286308f0fa6ce020ee1b4c6a1d228da542239dde2f19b8aa978b27f5ceded42f8a75585f98366a9cd861d8289c4525adb8048383f9483627614d920352eccc31a5417e6e39e87f4e2690ceaac45105e120e07c1525848e18e101bb17c61134d60d59e3937bddae935d2aa87721c0af0e1139f008105920fd7b79fbb9b4f69e8b27111065ca90693af091fe04413e71730d9387d35620bf53a508ec6f9c0779df87298d6ba2ab4f73655927d88f04fdce7a6f8c1d738599a9f220f58fe7ce5731a1e5d2fb9078c1fb3002be7a87cec45eec30a53cd4f2406ef764bfb124a5a7300be859cc10a35120f5014a50a7f635d2d7894bb816f154210946a369df37ea492993ba23af958d8308e723f18c15f298c0cbf825960d355ecc493910740fa0eb9f9a5cb8c9d9c7a0001703e380986b3f4c9b22fbfe907476a4eee95b8f676b95b24eb9e1fbeaaff66f33329d42080024bf5964a1ad459217179a4c919e099ae616336a35c24296f49aae68853cff61e7bd9925bd2e770eaeb8fddb690c50cf4b4feae63a996c2d2936fafe41ddc90106abdcfeb4febf5aabfd6c0e2866c77933a3d7a656fdd1d312b8ab6c39a0ff5df02e87481f8a78f69d59776d7649e8094dd68c33117c1e193f94324b03232ce9329a4aaa637e5e7301519261d9023d2fe84c6b050070ab701e5e221304d0bc235c93799e1736ba50667a6f93a74c313d917a06a49a9804682d7aed4cd53647acbc9ea68ba150270f4b38417b87646ec2d7d3e18a464eb371eb7f0660eac039d60110540b98372f001e1fca71f00730403a0e8e3ea9f1231dd6df1ff7bc0b0d4f989d048672683ce35d956d2f57913046267e6f3a2c4beddc8e1f6c59df735c7a01993a94b66fdb29883dabfc449ee9353ba7f6f543ab7e2e6fc4ae3fbba591d5ca9958aeeaca74333c7d09713d7cc5add81fd7f8969c5ea40a4347f1e6fe37f36211f14d65e4a2a0d8e7f816b8d750008a4a64dc7b9b09adcc2fbc28c809c943469796e8de6ae0f2ebe30a653d2b02edc0cc3fe99923f9cc43fe8d3cf534c056169ebc29baa9b989f412b2d530e478c629f9bbd845c3c98000143da6f52bb79c20abd358614d97067fdb83ff3aa00c1a14678b0127f6d3596f25401f2e3b099613236f1d88a2f3d8edc1f04bc0ca476a1eaa0ffca639a1c90f9626ee270f40d45ca9f1e187667a81dc5a7a3359dfb526b715cd334708df5f5fdb749c660507c76bb40e3cf3f47581b9f9945e7c5ccfe06c5f454d90f0d67cee899bb271b898efdeb6169844d98f690543d1158ede1217accb0a940a6e11a22a151ec8c096aece1444ad8bf08212985cbdb30127b0064d070d8fbf29fd2b7f91026037d92ba3e2aad435709d8ac9a00ecbbc99dd9f26f0f97b3717560a8e65c1d6228821e402be00d930ee825fff00c9f25057f6d7ee93f2b8a3453532b4e51b04b852415c55c0c4e8326e657e4d4aecc600c42a16e7b6913a56b13de2298e3b12b3feadf1179b6575bc78bd620eef05bb5056ddc89cc94374c3f3e6b576b170848815de4ec29e41063185e0a7ee5d9346c1889859685c87fc7d85b619070f79deb71038c1e14a061e242e75cc5627140cd6f1d065e4d0dd35d5df228964f8a585b3767406ee3f132226cae32bc0cc1651f2fb1c6a9cd6c1b58f68c2831afd822e2fc0e66a63ee06b69bf3cf52d8cd08cac83ce2d3eacec3ffecdb0c82838eae1c6e882688ccc73f40063180ede89a79eba91fba3e79396279807e6734593c77f50224aace936b4b52f7fcae397ac4c819281c0906a2a70bc6dcfb68e4e6877e2c8d3ee9c8423ab973d3cdbde229dc91f7c7ca55c901885e4c74ba9820c5e03f47622f69e273c5f8074c1d2664603265ebfaa336f2106da88eca346b7471e729ba138eb1c9829d8591a3737e2ca866928a532f132e59b799125001595c750ccc1933c557da0911e0b78c593bc77cf9c64743c670ba48069e5ba8a9f85539b1a4d9257ba29071d3a7dd6946c5b1586c6fa75f21e63255cb26ef3686bedb5a76327e7b1a488957433967ccb4d276c53f0d1f07a9da331d85d1218c30236b31daf37da719a02123e1140b193bb8843dc21d32dfc6c31909c70bb70c2eac916a50665b2c025ff4525dc62be1440e663cc61e773a114770a4ff650448ead0ca5e67199b9c5cce7f7cf9de3eb7563a995c9b8f50c901cdb6699f4b9dc4ed2692a89f7bb35a91722f0e45cad80dfad399f7b2fe63ef20cc76e2474de802be2476b35a1b36f938e18f80d1fa7c579a4ff498ccda052ef6da2e8957da7784d640e32937669afacba31d7f2f0b9026cd2615da19b0c90aec6d49d9718fc0bdbe025454b7ec53d1b22d6543ad6cb7edfbfc8a1659f123f589fc555d04cc583fddff66c04c1b060094e6d398ddac582fbf19ddf7de39ba81480ddd8e821ea26dde8e871664810619ec7604c95028f56e7f246dd946f8d140bf284ed889f533da083631b1b1acf8801141556f7581242cc4a2d645049d2c9657c225e58cfe80f7138cf31c83fd31d5bbdf61e5ee4348ed27fb83b597b501049a71ff1ffb892e67690957c18c00668d34b696e70adde81201b512c580df130dffae36f26623708d7121bc4b0a44eb19245d80cd5bbf964dfa65ffdf5059b7350fdd69f74d6c0bebd47cad03bf3953fc033aac136166b7f36a64a77d76d381fc438604b921b165050b50a6a5fb5c25b849d47553bc71e1a4ea57962a74caf7d6234ea3927391f06b7e64458c4f3bd4d060c17908bd5f87d4f2a56860cabe8d55378da32dc39c5281b62de6313b56e5d6f08823acf48e3f060be48aaaf91cb6fbf8c9afe5922effda3af4253f401bdd3e717f01aae28c6baa9e8b79837064092cdf9906545fc85ce7857d6f00ee192f695c3c9f9d17e882453300b164d132f87a546262f48d06ee3c1e204020a5cd50fa293759fdf511376861eaded99be809770fbc3230ba59484a7d633508f7a6e66350f5cd481aa4ef8693b03e5c2111b0756a1ce0b3683def952bdcaa34644454377c0e6605f9021f1250e76c57114e8227ebfb1ad71723489e91e33c3d7c142ee902d7c0a200b74abe11f6f574dced02f11ddd3d1627b7e7e9482d578e9fa4eaea7df849b6d232f6cc6f75461ff47b97536839c41b4a5a41e7d70188a24f54fcde45c68dcede13b7dfc1d8eac2e878d3d163a74c40df98fb2c97064c032bc2f91702e8e92494c7e26aa198600839732cfd889c321167d2581a30a21e3b857d44373dc6088286de1aef974a324a67e9273a6f9f121763b4fd531c7b7bb61cc282a14ef4485334a4c5f10b54ce23e449371a511668cd53bf6f49b2e8f10d22511907ceea45012eda87f1864eb00f3f21f10ff598b2add8400270ac80faab66a79bbd361e7b26c5edb57380ae7476f8e1d9adc59c6c2341d57b6a61ba051b3a147f440d17573e9a3cf2f992ea87f57237455639a801e8211e1e996b1abcc71d46383ebc5b65b32c66a4f6258967056b60e8abda3220470658808031296e4990ab4b0fdc51231efcf96febc1019e11251d28011fc123da523325a14c4ca61d34c24c39e59f1bfc7c43a85cfdf999c33fba881882eba91ca53c928f251b00bc6a19a03f50abbcb63af3e2cc24c7e6762bd78d34ac081c787fb34bac441afa91b11ffba2b5fd81e6b97893bbde0300b479e2abf7e3acea983255b58b31a2e057aa4392e67e1b080868505faea21175089a6a78d4d250bfd67d8264ae76697e5896331a7d216abb95c8099b16f999bfdd0ddd585de079f8cda1d7dd787ac5112f355cf6f9488329096902da774d025dcc64c9def5a6bf21e85fb4849bb75c4545e82fccdd4bfabcedcbdaa25224d1bb311fae712e8d66c7b107a6fe6ad48587273f39e08ba42803bd510f673a098e74b59ef9c37b1d2756a22a2daf782ad7536d9af9e697099179f2a90fad91739ef6c4734a2a6dce675b4637c72c3652c836638bee5381b4cdac283469e9fafb89ddd82d0e3a7929bd4217d0f1d947c4eeacb3a295abde6e32f6c8638cb0c8f9e5868b3cb4682fb77fa791563c4b0ef9a122d85f7e43ff7e78064de706769e07387d3822eb27e3e044f84d6815060e7996454c1306d0876e0347331f65bfec9bd94e7960011e484ca3c0a6570a7ec8cd1460797dddc5e8c54b36128d090137306e66c98494afcf45027d26d38b39c05cc2110ae05198a61cd65f66a08edf006d5e52a2f11450eb71e79a594e25ab87b125e35b0b00bd31cd2b2f9a0a659dda9b3f9e90461ea62f4bc9b4b827586871529633f42e69c83e5ec023471b0be2184278a70bf402140d4b3f38ce0f91e52fc9b9af50eb0b3e1e6a1bd6d86300305c0b9008807b7d2ef7f89eb3056770a6157f06921bc153834447c4b6d862d10d185f1c3f984cde5b81cc9eafe8bf532fc4fae3a89f41e14c52a0214fc1ab0cdcd MD = e2eb69f7d6fab720a3f038ac773b3274b6d113e9 Len = 40112 Msg = d2799441abcc3ba3bd2aa715899eff2f18a12c453c483e3a18bb0c99e2e91be1e87ac221d1058bc52684dbb01105d68b64a27d5cdcb2195aa841dd0025bec760ecf4c7ba0e3c234d9ef01a6d7022c8d6218e494057ce21334acddb1d847ef1a2e5ceec33e9d7cce22e56aa74305f9cb8574fd91835031e6e084750198791624fdbf079b4eb3f4e2cdc9ed4eed8231cdb0fcc750dfcb8d7b2ea97821bb660e210d642b6679adc71d5b2b0e003f1d50ee451ed6547365715a8f7a6ba4c9a51398ddfabea728116fd82b87416da02df3b7e239af0ed6a47a0f8375a3fd3bacd2e6dfd165ffd2556b9ddf5d3be9c93a86b4f8fbb5f2721f04049b29c5bd99e3d8a5839685b3110026e8e71b31f702d9865ff9c38fa1fe2babd4371555486cf0715f89a8a2735c984e43d34fe827f5717f33752f909fa350dde8f7b6b7301d49597f228640b32d842e391479a2ff1998ddb9fbae7d4e3a2516cd5d8c80073354dd8f1ebde4e50c6a63332b1716eed7b62e6dedbe8a300b2ee30bc915243037b999f9bece13ab619169bc97a69879b86fedc9dbee5bd79ec4cefedadf383da2de0b6983253158d5cfce5feab6cc12441ca858369c76b77d9d3741034920a1fd389e391c51e28fc14bfd7784a6166b0342ca939e674f522ffec86cc2f161efbf6feef2eae28bb2ccbc73ae0622fbc66e88d0f663dd6a3a1e8fdecc9a56908961da6a216f45b1645087cd5ddf8c00c6fe45680b374d4bc1d1c706fb09e721017d0e9c3f29f9d806e5446721816fb9df3b0edc4c795558abd21abd72922197da7972f1c69b8d843cf368dd738c3c8b919d5bca34ca74353aa8118ecdb3a46996dfbe0732445f3a59136b9cde6080fa609da29e5e7b385600bc41d756fede1aa92836491ca51d6efdcdc321ccaecb8adec479e5142c003f90970243c8c44d2f93db8243e04e16968d7b1608c8b77ac16eaa582b005d6a566cc0f9407db4501ce972086417aff945aab3cace5d2b1d1292a7b3dcad8fd53ee7b28d59f04fa5771c845f364d3b23f0b7f057cee46a3102ed5513767613ef5da3e444fccae6bba29f7afd46db80352c47c9539709054526c12b0d74f4ba073723fea6a55819f133f4ce48f25d0f8b5cdca734c3457cc7d2c0a1e87493c2cb5fea3a28e04279e4bfbf06e8e54c49c506e90271bff44147ab6e425af1fdce9a3c695f5239f457048a50bd537c23bf40beff73a109cff333252c94db597d5df26123b6991ef861ef485c49ff436de0acf97263392d12f318c48e11d027acc162429bd8840bc8fae36e344562c7a55e582b0459a08687c176fdf531dfe8f6c97865444da98ce0b2bf506b3814654478d0e807ef8dc2790ecc56048d511a05a6935dbf8e602eca09a1b3738a9ac8d5c0b5950f7d475d710b87513e7cea473419418060034e4e0f6058fbefb55c5ed3d664d67d8b63b40a7836740598f1dd2c721161c844ca770b67339e3250df93b92a6d10f4a269629fb56832fc5a0e68394171967aeb7b46588ed01eede5ab04102d4cc8e75adee5bb438b128548a654e517e082da4fc7286137acf264dc252c536f6282d80d2ab9f7b32d9722ed404fda65ecab78ea3489d00228bd49bcf4790d617cc34931e35bbf84be3567a062a563ac0494d9534a070f6ed1d40ef09f86a893ca0ebd818f577d28bb71c61a93e23b6ab6c37e138e1c99ee46db272f7cb1af76f8c997448519db1fa3d0c0a44aa2ac1281bbc9937726ea00e64724c21296ac9b778889236b2f33fa15e6d9d5fd534043e3e25e5b7bd27a374e8c7a40f7b20a71d4cfe586b8143218700894482270827f5bebaee4229be4f1ce2fba24a270538a7f044ee6e245302b40ca625360870d15581c3dc5f1ef94e103b54705997e1255f4ca27dc705eb88316b0d6802e032aa677088d79704a24558d91b33c4317c154d495f2dff8ad55b050306366f17175b3273510670447fdffaa69716145f9db178cdc5259d1dd82438bed8b70415e78cbe736591744459c20089123ed0880ea1e8c11a8e2925bb8bd383cd1249436ae414560da12b6df7967169d2d68013958ca50ea78f2b0a4737dd392b70c607670c3b06915e1c27230456302004ac6afb1bb89ab4512c3344d15eca3bf804caa8ac3b6939efcfdba3b3b6c544f0ddf407f5284f89fcb40a7a005f1d45d38af5f36b1d694c7cccef404d991086c49a1983c2fd146db749f6b06de61a9128e0ee11f1e8ed142f9ccdc27708f92ea56c41352c3fd0aaaa755fb0c0fea966208f1fcae7a4dcd72ec6dbf1db096883bddad4e7d9f76d86febfad40a0acb20ee31eeee5f55a20dea1d2839521a745ce346c3a5f712dd24adbaf4929b5fa1dcf9815c52cc211a071b1482c75f1e7785732aadc669de7e73d68ce9932a8efd2f267fd0b65f7d144d885b13d5af1d3e966de1d20c3052f94a9cea306252193babe795c28593ba2f45a4795200ccc728143604c6f40500cc1d434b7f9c9c7efbb7df6bd84d0378d98401c7a3c5328cc2636e1bf32a326875607c390d8e5430abe7506a58792939918d32eeaf9f7aeeac18689ffcfb531a63b8aa3b80c423cedacf0cf9e9966f6cf5c58a56cbfbf05d33b7c7f93b03e167359a5fbb7fea85b9e6b347c2f221508354d1aa989f674d58f7a60ec033b0680f696a0f31315de4827e58933e18a6872d6d16060c706dec827687af7d8dad41536dbc2b556b8aeaa8f00391c3a3924dcb7d171f5b158c584a2ec11c999f4717d3b1155660751de2adfa68b61c49714ede236968ecc52f1b108ed6e89cef0a6610d1e9f31af47376f1ebec627070dff4e5ee61754a25d2af86255da6000383969b5ece93cd5028122543033998a01aca733cb3c6ebae23701b70b9b76b633f23c3a617aaf01ea84ea8ae41adcd5dce49f6acc4d049c47e1730ff7f9f278499b83a4679cb3bc670770c7c1c31b70076fde09d09140d1f6f0f672013efccee2fae5fbe595708ce1d45b13b1757ce4e8150d1bc15148e0552c34e911b0be4166d90b48c2ae0dfcc0b154769c7927b7e99ed4a586d54451ce5cd27b0f995d583dfe9c93e82fb2916c6703f96818457471d1dab107655dadc74a7b31e33f049cd03141e23e6089d54dbe0fa3fe97fea0e777c8462c49ba7aaabcd51175ebd993853ca23fac88b74fcb7d217d464179c5b558456dddc88543de7b8826ade404c7c5e666b11af167874f6ee08d285ddf6a423cfa2d022be38dcb4f3d757474aec0f9f6364170e1bf063f57f5dd8d325718f6eb8e8e83bbfee2d9ff9c08b0e1ff048735b9f596a1e753050107755b090a56392caa9848bdfec970554ce64b741e1dd96b98d7757908f60734bf5b7c2a20ac73c9f654397c0bcbf817f6172b753493555f7aeff3b04a78afb7c599d6ddc0a20c8819c93f3f4b6fd90e41a43a2c68ec65db0843f990d4606454c037536a12c16c32bcff404de93d7b02d6945ee0e3b270a5eade705fcf368dd1583bda183f90fc8f86ff25ef0bbd47bb5cef81dbcc6cde86c7c53e66628394f736af52316f98226620d0d76dda78a3007cbd8a634ca3164647024dedb6cde08e029aa5fbc95f4780317a3d0f7df5f89ade0761c18bde82ad139b833cf29fd95e6305babf766fd4a662063e1d1cbcaf5229d5ee3db0a58983d39bca9a3f7ee72e02f779c49e502f9e5b7bc4dee1562eee052d191ee480938f2e070951c5f472c88778ca546788c230c3e1b69bf24adf361c19caae4ef8089acde928a7ab88e2f2999095b5fca1f4264341fb9c772029f413a0e9331794516c58480ee51ac39f75e048c23083232c4782a27d29996173ee95ca5ef666ddd4cd762da552392b111906a7390d2594d45a290c238a7f9427ed48a0113f645afa85cf9fd438314aa1a5b0b6e394097e5328df87d5065341acb9d429ea5638932b5b0ca683dd29a8b5e3887ca60d586811794d1c7be63af06a1ae26ed2820c10d019d54a9a8a4acbb79936016bbf39db76141ad2fe735e2ac9d81a75af0c055a4f85d1940287bc3d0d90624d1bf3d55eeac3efb244f2e77631ba23486b3c4df81268a98ba11ca6862190b3699cf15379d54c74c236aefd5d0a8aa6efec5a0c727f8905386091302c5961d15cd801dcb49f78500cbceec666bc0e4a701cae695100b28ba1272d84b91fca652eb56b9898b00f2c98bff96d19af0fb8d5e1808d1bfca9e6d0df3ac7b5da9417e71d76aeac70d9af6c251818fe4b5497262517a05bdb37bccd6efe24a6f1878e90f76b4778489e8292d893f09ef9a79069cfbcc9960424b69ebec2c116ce6b73312b928a859e254c12beb21c801fce4ba8c7b73056e1387b4db6cdc68cd8086dd0a033a05adb37b6f2c1bdc42c27926feaf550fe22d93bb4e23d695c91772625774096b080689c683cc8fb122b77bba43841cf5b8354f408633ddcabac138c422df203e37dab1c09f8bab52c0479119499937b6e00ba2c20da9d6fda6514036dfb9ec161db0e7e412c81333a3f935ce515d39d602174aba34e456a1144e3534ee72c195121f88cbae204bd65652f633fb4e97d586ee8393ac81c157ad2e6448cfc8553dbd8d10c19212b9bd4fdb4ef4b7fbd637f707f9e8d4f0cb73a96869dd03f8fb7298700c709f2de14b18f8ac8b07d3797fdaea1a143ebfd9a7c182b28c1ba338c60b6ef85305b057121a319b617b64060f9b0b70c04a4d50466e13eab08745a1cabee050e366788fb4ec2c8812833be089bff27a57a837d3e207825ef4c75eaad30b5aa29c41b4ff7607301f08afb9bd50d225b354b8fdd90d3654abc36c6cd88179646a0828143b07f3f2ccce616bd1074a1b9831fd1dd41a73113da6e6ee9f58916413917a04a6dd1adafdde38d0e00fb05ab599f4f669bc363ea109b75283baebf04bd2c804d758145f3eb2a6774efc7d5987d72135ee45083362765e470a4ad18f5f3682a3511b58f60be62acd9230399e8b84125af65751a5fe876c2ab76aea97da574a5e88996145f1d346524e5d5da02d2b48b3f665bafcd187317c0fadbfb0599f7f950254b5b56d248993d7d651e5093724ff82f29cae78207eb97785a95f3989a2f542dfcecaea345500c33dcf039c32479c00708f317edd847183853ffb06a054edbe8d350d059d492784f62d52529710f813820b3c5208e322b81efc2a5d7df5ecf9ff50e22bc9c686b181e577c8e021b2208989157e4d2b5b89d556539a7d068179a8dae0e9346d9cdd739fda7ba7ea48bc0991636014cd7a7d2af70d3a182729b21c1b9fba879ee84d5db4f0c758eb3a4a74ac8ca3fa3a0e069226cdd8f9a87437cb9b651c1deae79572ad61487da4f5507d4327b667f184ba9d8e0be37c3acf7f29e2d77a71c2194a8511927b7098086265ed9b23d8a48d1dcf954de61a3eb9fcc98a6d722dc4fbe0f76a1aecec44e1f4e1147d58d69375848ac50a5d7e24b2353ceaad8f9c641ddd3c2f40f95b2c208c515034e1ec7edc9371a5d7b6029d56bcc69c0e2f681feda3d5c9cb4d17ce329d3919583b84a730def6b02c8c3208f5f8290715ddfb68e9e956c21034dc9ba6ac2ad86de239ad00ab9c6c8f4c96e83e8bc6c44b17d0cfa10231c0966d0424db4d8935cc526600caadc5336673abbb9ecc125c147982c49172e92de44218fa6ed5f68a2a28b4430d4a23cd489deb13754dae27085f8bd839d00f627050957cdff9d57dddc18ed437051a62ac37cf607094fcbdad46468b189df716d105042c8d0db8597db96044d6532bbc17bde3231f2680a869da5d5d9c3142b37cfbefaa14a601d5707cc30579d8da3201aca0ebbf66dc4fc4683ab0632e64b0da91a2460547645a6c8841a67ffaa86cf090931afffa524c539c6933dc09ff977062e6b0bd563250b86846a8873d08b57af634514f4594f68dc36348854865ffe4ec074acb770e70ea995c7bfe148da3f739feff3bcd1706d999b37eed6e2a229ea99ea4ae1e5b037997fd916315b9c0fbf87d9534155ad5dd7bc43782ffced81408173ee3b0aab0fbe0a49944b4ef950fae1ab3c6a2d2ebffd62012c451c668db940b79fad26fd1d81febf41186c18898b760cb71fa01c1b75551814018935d5bd9d60651f83d1e94822e2267efc2242dc0ea5ca48f79ffaa65d31384b8d83e1b561134879674dfc7c3f5b4a66453e0354711e80ce7bdee2f842f49e0c6e783a07547a51a31b99dd861dd1b6b99095555b661ede9771025ed3cb08502a753b671d3e3d8785e7de14cc84ed705d254fbf59b64dee8c2432f39fc216568feaf5f05ee704f30812442ab83c57823c4c93cab62955b795db972bc4edc5b62115cd5e3117769b12e6f2a6b10cb6f33d4d89fcdb87db419bdd598daa14be7aca3dec3700953b898ca911101ebeb3cc476f5ae02e988a9584739fa1ba01a9aa71ac7906322afcc55fa4c8f16918f51444fc2efb182407ba3ae591f05a7b2d4cfea89d502f9e6155711f40d0f9e325d31b3a2cd702f2fdb8a37b5901f349f26a587a809f5eb91143ac62a03536e6ea12b4727dfb52cb1298a97d1c5cee34a10b696a497a2942b597f7b411a888ebedd8f7eb48ef7277ee613332058ab104e23818bf216af703f457395fbbb257b8d52dccefb63cc8be3a1b28e33912a6815cf84dc32ff631c2778d5ca9c5da0b174b191bc4ef69be689ece72d8e37c3472b853f0bc9ca63d48e54047db58a90ccdf7a5ccb31afeba3cc183f8592951c2a19d51eaf38f02845de779e23c9ba6c3a580d8c704608326034c42a2ae3318bad4b4fb21b031936ec8253f1516b75996668fbbf4ffe8816985e611581e2a5983d4a5587e3ba9e06453469ac8afd34aeed7cb543becdb80eb8a38fa02f2369d85691770e9db2071ccc4f392e351180234c2ddad8512600614daea0488737e6a285ab24c4bd9becf0fe4d3304e42ae08ceed6cceb8baa09d4c3ca337d2e62b4bd4711ff38a7daa81967b8f7bf2cabce4262021bdbe2cc2ccfb7a0b9cc99664c5f174066d900f0d0fc851ce7cb5336a1fa225a4847db0ef1c895acb3a53ca5262e72c0ec343d70e020c2d393980c3e240acc39c2bdf8e4f135ea58b1a59c91da91e MD = 9c5bf7e24e8764745642e23e7cdc5fd44f91bbf9 Len = 40904 Msg = 9c4ae2217c928dd5864836be5d4ec281211471aa441a594b99b013e5ae01b48c5c4ffe479c80d8b69cdafcf7130bf0c9d16c37f29a86c8df34d6bf8bbfcd53a2451b08e5922d25d046f4697a28e9fabebd4e9e981ab62dd1f6c747df033f42077f3566c405a25d6caa1fe51145f0c8a50e420e626bb17169060d11aa235e6903312582ac9ee566d2f0e2d882122942c9ebd0ef1a357f7aef8d3087b3c632b0e08374c36505002a4a41c6aa96369b51717d81a986222932abb2b60fc495c400e49ea990b6e1fa901cc552c3155a4edbe4ecdca46fd8b680e59e2913a3381b3f59aa4c5368dbdc7f8fa30e8cc7254bc96b5f6a499cff2e4be47810fa19563f5785cee673439aade1ec04826b744099044efeb1fed7409a7df169f42cee97392eb133fe580fc7759d7b0f37c9e3524073d5f23b2ce64301fd54995c11eaa510ae24011c6a94093d9b84edb40fdd0449fd4863903c92af6bb3552fd011d525ccbe285fc8119a090cc34fc581a32afebb8cee783694a32ce0873c54d89476c2764503758bb5e86eeafd24c027ef92e79e07105ab79ee1646961502ffd029622152dfe6cecbe47e1df314a062d59dd67fb55f6319bc114fc0d29dae9c6c3fdedb15d616c74947f0af4470abe1b4bd228d960e8246864039fd5c722a9bc3f73cc53bd749ca99f58903027ac107a2c3acf400f2e5ba8f177f3c723709865dec06601357f2515479a1c9cb97825d064dd07384a0fffe2cf38a0ee260cde4c09ab65c5adc92f40f50c553ee6b525a85b8376caf9d4389f660e4f4fb63da2f626fe6ea70d9be1b10f77e42094ad388778f4c4fd05c62d661ec1a8f4bc4d0ced9f7f2cae3d3d63f0ffa3704aaca684f725f79ada542a07bf5f1852e4218245b8daf744e225f7de852b58a2c217e9347fca56a067cf4bed3291dcf627cb2575df412d614bae117af9fd5e2292bbbe6ea8cdd77dae5e7008481cd53bc6a47dc3ea3aeb29f2bed25ed2db7c97c2826c5af89743d9b7eae0808868cbcac893d458622ff744de3e83b39b2f7ca958533d22f990615e8859e47c7bdd864a357f705ccf871a5b17176ca0d96024015e1577eb3320fbb22b95c424a7e4cd6415529af6b7aa1c16a62fd54e16d63d47dbb263e02db0d77da884c8a196e36ac071f39a4ea400c51c927006e4d9f98e23d81149266fa6bf680510381bd0442305504ab88d1df1dd16e3c1468bab31e13b5c1a71e8816c781a4c205bb9db6dc1dbbb3f3cdbabe52baba209df6b13e6fc3a6fb5224cec68cd3c859b7aa441c80cecb9ba6d5fd4447884d63217ab9980a8c619caa67a37048576b66bdd048abbcbdd52a3954223768c4887233774c567ad876341439beaa7676fe977cc003cb0c8598ee2faab1de32fa0bdc486ed2003d327540242d78db83dd025a78fc0e10ec906765fe4c34cf3293481fd4e3f31bde24bf5f6eb55a9a1cd4073e36d6d003d978c11039db2370f41abdab6d59180fba19d4c03853ec5c9e068da13b02f22a5fa9468b46c9f669d41aed1d7650c9626d9c564125ab96a983df0621f9e2dceaeb9c6815b98b26207efe46d4844d7faa7526b420cb0ef1f76ae7f13ef80908cc09ec966e16a15b2b313f6b6f1ba1c34e4d436f0d7d0086ccbf9bdf66c9d7fe4436f461f2c2aedde0b778bb4bb1100cd4727ce755d022bd9ffe754127c3f235f9ff5e4b22620656f75e24c708c8fad4c3712dcd9848d80ef7a40e96f08aca4843cf84c29b693a2ec5b1be0f14e7e4b391c5f082436bb3035a5cc2716f92d29dc8240258bc3cdcfdd24ebf13fe724011d5dd4f95f5ad26334e652b30e350adaeeda9418e1371412ca381a246341caf87f643a5892d81b4072a69c385fa68be042aabdcd32f9b1933cff70236442b758e79858ccc398def0794e705c1233f863605b84eb86f1ec7bbbe1b5964ad43548dd61f8fefc81639bd14497c72ec3988ad156af1be6070cf2cd46b0241ede8af0ea27e095447df16700f2d922bb40b47e1c02060458235b1ffc962a76e747ff799552d93aa474d17f90befd15c2919467c9c6534fe72d1f2bcf39eb34adf9dc0b674aab95224c4c090912cd47499e806c600c5ca3980da13ece97bb0578db69cde7781e4dc9eea82ef1550f615b4fc0b56a3beaa975ab297e8218629151d5eee89d42fa0b9e422d15d2ef8c0afd8c9b6b6fbac50885effe167225a7813fcfb28411110676ab3025e733480ceb393d5bb6f5f3b569d0c26a2c2724537d4bb1fec7cc4e0b37f7a1d6cb9dc857ac164a46bd864d82745f0ab3e9277f2e2c7c631adc555fd1f58a7b89ea97d734f49d9ba5a9a930f3d039b12274fc9c0037dace4ee934ae20596da8876ba9dd6c6bd418bfa1e704d226669dfff62de591456dd8e217f2a1c00ba70e15775b42c7bac5aadecec632e51defb8929643c0a9ff3e6a1d8d16a278b240977e36366e0d8978374858d020f55edbe8227dc5970f0d546d4874281812f6412a08cfc1c9067ff3a846668d37c9903217f9d23bd18c16b7c7abf3b06b5481b1aefd6b84bc7a4540e6202084df2b5cfd2c5dbe2ed6e8c270628e33370207f8980da33108ad308367d81eaf3d81e16a430f9769250eebbb8624395b4447f306fe2e434ad405f1e06e65883b4083b4610ca8effaa8e15ca601f7f39460a1df51ecf924dd712d85045f77a5eb164f6cea60dfac993fb7052eeac206061278948169569013658bb49841f5bee8464bd1ac489c187073f8acf9486db8d8e235db3f7e2dcd143a8946441dc61b5a58e1aa50cbc779a4cb0c1aaf23df5233583e7a3332662407778e02affad40468d478c17df2481860d05b17f983021b3efdfc39048de9dd14a501b182e006c13a4377dcdcc4073dca084e6b7f71bd5d2258d7e25a979e40654b4c1b64d84499f92d48c41449ec300afd4bdde8f4f85e06f2383bdf596e951ff1d608fee876d6cd185241ce89e0384937bb36dc159b681351850e39da3f236d200740f81b84bedd8efd1bb28dc99eaf3d073e05db8fc170ff28211022fb33755e478af976579a5216b119675c91ab639695bd084ebab14784873c0d3a880d5f36feb0a903d5b15339d60496fe1ea48ecdcf7b90760582bd660c29d729d0f9542d9478b1c9e74d097dd4a4e67c5ad457671c3f435c587afc2f1daf17f7b93f7ccd71abb9d076b49c6d14c100dd2b82e7eee3d3c9079ce32c66249575ad2d26fe9dfe116821682f338efc238b297bf565ea8efdcb7fb703749488a4985213f70225a17167c3a706f66af59130683176fae18486f1cd9323fd40b1a429ee52fbb2eec3945dbe19810e8868d597a3354dce5d2d36e2f8178aeff2075dcf8ad477347fcd43f31ba8e8a370bbb567e26fc208e5f1d447082a827133f296332c80b6b0602544d1e13b82dcab58fa492bc71dd102382ac706b651ab89da19fddf3eff4f1a355f9e18b998e2c0a56ce48825a5503a6afe0bf9a240c67f27acd4a8f6993834645e03c80c72dd370cd2e10071a3ae18ef19bae9d697ea9a4118609190cd95361907a7fa1b58f499f3f5e79b935f12212f437dde399e3e6490244aa1f5e38ba9be2433b6ce924f6cc49e9f627321a5df9343fce1b59deb647d9a3ae00b234414ba7b4e020d67173be693b05cf9318ed981e3def931db18226e40d757bbd4e8ff75d5a1e8c021748bc19dc4920ed6f69762e9cc2f96a1ee27cce0ca0dee409ef257f9d36fcf068de6bd83800a985a05a29f1e6d8aca3795fa0040ba0a8aad8f76c8b18d9f225f8bd3420f8ece8003e2819e4a6a12b6e53423702950577864e31230c37781a27395dbb80796e6af1ab6bcc9356acf42f3f42b866234fba1adc14ff7f8381c358cd48487343f580ce6a8dc87a616ca57a8fc99a9b50dfeeccf51b485187979c4f07059175e322e7eb1e1683f67160adb4d75f540e884694014bdc942ebe19e38e890dfd14c1770efc189e85b3e1197b82a86c8b5c4404387c22a169738199577bc5ca01bc895244660c7e442f4af7ad48758986f11ea94a822c224eac9c8666bb4fd235e9854546bd4c3e55c5199ba19ac12f0d69729658b7cad7aa4649717fa189bf00385fd074565a672111c775f6de0dd55521da6bd181813a02ed22eb20e2f5d9070573846be5d9814c91ff072ba6de1514b6d08a4373d1b1feedb343e8e426c8a0fd6ac18bd02c052ec20adf9e799456b294df822d035ed7e4e4652c46299f06647ca02852b9e47b4e2e856ffdcad322c54861e40cb46b245b5dd2f4b727c10ad7ffae195ee7754c2133f928981f0cf1a35e0210510b992fd8b6674dba633f4e6212ff251efd51005e8ec09a1beac45bf3222aa7a87d6b42d37aac87ce605c5999431ddc01602a304c7b9644e7b27bba3b41660a519e4415d2371d4371a3cab4e40c849ea4c453447196c4b99a0ab5a4c2482ec90ac2d6015b6833f132a1ecd8e8dbcded877e5eb5747ce6588157e4944e82ff54329f73ade58a7b219fef454e0e3d44591802bf1bbb7a75b26c2e8b1136ae524c4798bf73f71a7d5507e0567cdaad9261d505f6efbd3bfd4788f33ba3f106b211d8231bec169494fc0939b2fdc4a942885cec989a002dd798865a58b52448b93562e30b7eaa956c97123fcd4952bcaf4d0e1b06b31abcbf25d2a884dd46d0b227564d20b459795ea6c17717d80b5463206735e3c36384fe6ffc822274bf2b477840c5de2579cd05bb85842522651cf89306b1923381032fe7725bc42413d4e3a8a0d1a63aa21cdc35dcdb77c0e652ca155b02a48be9b3be1cc2b9dc63db5a113905151b7c58c55cb645d1823c05b26237d2cd9d45041343706c00fdac8c274a89dbf4a053046301bd4f2ac6ec59985b7b0c66def766ae3aa2ece58a669cc91a4b93f4c7674b8265ab573bc86a4891104f76630c0b97e12e04a3cc153a83bbeadecb9a0321849ff300fc79093e59191b359f46870a0e5878165f292090d78c46b3f158f60a4608247ebd870bc111bcf6bdf595e26b4070b3684d813ef21e96b88b93b5f29a0677944508da429af8e91d5907b5a0b7b4d65a7b1d68c2e6bf77aa9631458b495c5aad247ce73034752a0997443a3477f1d5f7bf3d444ed730abb784386c42a0be2dd97d783277261cfc45e9399830148e0bf5a53ba8455c28bf49d647ae9b28826dc3b0894069d866dc4ccf66640625cff4eeed770948edfe0eec0cbd9117596f96e67e2ea59ad3d946a8ca490239145e0d4dc89debcbf527371888289829abcc35ac36e6b67c90fac7c46a50174b68bed19cf71ed4411a4ab459d9074844a83ec69f6b3007a1a831dc3a1029f7bfbb48de46d968373ab5cef31a8fd8061ad71dc63a9b992d8c8214f0746c25480864a27fe5e008992b502a9fe51d1975fea10fb10838907cafa71aa10dded07ca7fd525304bb7e8e9591f40743f15a0c82ae8b2372d2a4998d8fc97a50d8ca0a20fdbee40dcc486c0bd3a1c5b1bd183e2947f67a24ea43e8a8b497c907ea506505ee6eaf6b82e4d5f09dba57b8c0b28f6515f83178f00d0e83be0c297d943231c937d811c88fd240d668a439c3bcd774b88106f5f9845e6f90f4ad283c66bde4dd6291b78f339f214fcd05e85cf1e582b62189242107b6706300e121bec271f2d517020d4a2eba1baf2345efff107b3dc070153879fab3d57c6b4ec29f47ece0229ddf8f63c1b1848703fabd2498e70a79e531cf8eedc4f34f8c5c7738579d41589f50ba66acf3f05a077adc67ebe77d44f94545ba51685e5eec80bc3481e17ae9742c2aed411fe3ba866cca2399cb0ab444e62796c61c7b1d1451fdfe57780157b4b83d521e83d30b094713021320374a208b01ae9c6fde2c9c46d8f038cf7915e98b7e2fa5de42ee1880236df875976944ba505c74c0fbefdce5c9d4a63656b68b2c79e0676db7b62cae97d1aa398fa409ea904acfce58e96ea54cf6406b0ecc02019d1ee3d0a5f5ce28ccd7b8faa48ce8924dd41dc6899bba1bdeff67dc2598f6a174259ba5a24f75955eeaa5275a867947e592df77e29957a00c3abce81fdfc1928bbf0f4b1105ab5aba74ef4e36233482040185210844cfd83142803d71f30b4b3025bf3f96dae81f5c10f7edbbd592c705aacf707f307b2afa91824ab0652c322e141bf18811a429d0597f7440201c9d76f8eed49beee22ec4c2137e4fb8bcedc1d4a61f895c7820a388b67087a55a5be46693cc02d2ad4a3c3eb466c46035e49811fe07ff0ddc8a42596d60e6a7a4a8ba8e3ed5288e3503ad71f582a2fe1fad1d4684497dc839dd3935e4d3e1d9b40a85da406e916401f1b50657606fe4e2bdcddcc95279fe188ff498bd380dade0d7b2d55926c206ac8acf664a7e8fa7178d265f4dc168220119010c671bce86b3b6ee09e96c3ee89d35791c5f3b86c73691b3488214ecd68c0eeb0b72eda906b52e73d261cd6c8c4c983e82f625e9c7b861f122f6ab6c8e01e81f10512c21a06d8500d962b8df6433197c44bfdc3d2b25847c791c136bbb1b2b29b58255dce6357101895ccd0bf2f93fdedc1cbcd563f66f91a572db6ed0204e7755a7091f3ab568f26cc06876db0771c2b38d4656f4b389ed529b71ea7fc9d8948b1fa47d3055e35ffe3e19a46ed665c4659217467fe579fbeae655631c70401dc05cb68b49af66a6a8165f1930fe82505cbb9e0847f4a629e8f4147d38ac1b6f9ffecdadf92a696314e9b749b3d83df3136a5930ff799513c7453d7d56e5d0f674664879c14f6211af48a0ca8a0c1f29244eb734f8dcdd36203a2ef7e9a5f76ed833b5533486f73ee183a9f006029c7f09b956a8e6a6d4fd6e7367817364f52555e7a2eeb5798f47465b416eca443c413e3aa5f12b5012f61c61758e86cb60a657e28f90d69f90d7680ff5ab4949852c3c53339259712dacb494e7939621b08e68c4d9ee1a51b24ba142352a059afdac7e837e20d3827b8dc17e1c1524006b39f2ff204af3485a30ac729e5f81b10c2e8f6be4112bfc8315cd9db1a7a2fff735a101d15bf3ebff02c4118fd03014473ee94d13e7e557dad1236416bfb578fb0ddd7d9b858ea5275e82bf8810a34d256a16c76c19721cf94c7d71d9c1bdf3dd2f12b2bd5c460c598082dd25855dc42d2c826b7b2a74c454e4363769423ef92415eb41d5549c9a0c352eead6c2c1f1d4e2d6a9cf9f4fd68434e83553d5bb11566ec1bb61e304d6c5d901791a4d728ea3496de2c7fc75d MD = 7731a20dfb7725e61d7aacebb41afbb4a05ffbfb Len = 41696 Msg = 198a696de98961e3ad0f953339350b5871d87a415492676d3ae88eb859c583758e2899bc5b1903052ce139f6de7a9e7a81455f135dfb9e7134e6d043c751634d9b3da4bbfd55e1b54424ca3356861d136e5c83691c84b5168d09e29c0c965530c9315311d92542197f401191aa3fd34abe87ade99716f383ccb88e6a307ea1469f6c6c67f7727059649ed3b9e18f0748fb2da73ed897a1e1795d9a553cf08eb6a556b7645d22b19e7ba4db53035d0034acb5370ee7f107571c5fcf0737d365a96357feb1151f4e104dbbf006199007375a892602ca0a6d0e3e26f52529116f4662d807f5274f8fd6614bd97a291264798c103bc18bcc1b2d661ad45a1b91f1b6293f9bd9999cbb193fbd5f583eca5f21cab240f4321d58dd1da3334b133b362040f6820575ed1c0070774a485da040589dd7fb42c5e76e46ea29dca31cf785ad30638420c329f8b47be362f1907c4e458be736544e11a38f551495083bad258480f069d2893a985ce8686efcde46d2111e4ab7d1d48340e1e6cc27237a455fcfb804f8c5d1074421406d381050e614e3de69476260258c6326b95a9be0a77bb36106fa9ea278432b0a5c86d6ec455ce452aaadaff9dfd13e9c43f51875bcc15a026038080575dfa1ce9c21f6bc49f23b0276b35fa7995599d1d3c244426a78ec237977a900e65eab1595d117c8db1d1276361f1a723b629d4bcf87c44e9aea904cb982299eb3097365af5de116e4278e3750ba8a63ad3e7194a10d43a2355d6f06882031e4c5281e49528ffeb14a56d9cc2e4c5581d7313f34af1c6744211ab1d84e1869dc0203d746e62d139ef7f31bbd369d23d5a1852cb1637cd83e48697d4b7333788d53e1c4e6d300cbe6d1457b93d2749d65f480629524f43f989091fbe65f3907ffa00c0db081d0cb92c29622d5699a6a3bb66c0967594d4458e3dc55317bf2bd3bd2cadb2c5965beaab12c380b62d8335fd18f48b06c4f8e882890b0b42d254348cf6456e3c1864a348551e4bd27f4a0d72b3248f7c4c2c62f47f637f8de9c402e8122a55c22fd173a284a4e741fb658adae9c31c4c96e935627560f84f71d5df6cf4bf11fe590cec381629fb7b2e804e941172aa0e31b9e04b2f863e0de7142a7a02961b5700817d878e0ff0f48504b91cbe95b117a908f41cf235995fd609649de021ea52d2c9980f50b950349b8d6af365beda1f6960d156621192abbb101e5701f4f7782c6fdc3e02d8a1b1de64d4a69b508d8bff5c0896038cc277f2e2d813ec81db4d99ceaa9218c05df2da2566b4c3fd33d3d7551a4a3b19a15b39dbf283044b0e39978093ba1702fd8dfb69c19c7417758d9dd686f18d4aa7abec762df2edd2f8c2a2002804623308d9ce8c55cc2021cb1f9f7acf0a7e825e10874bcb020d9c238f45c7c80f9ec2f86cd027a3c25cbe8d10789c631393732cff96b75a2ee81936d5ff62044a312544cd8ca62c2d8e4063f695c5d3ab407facef97636bd801dc7b6d3b495d32adec966270926f5c3959c8389381a1102a1a565705ba70abef58998b86083367898b35c20866ddecf26d326cde5a5c0094d5a1dc6e36f909150ff9d76c0947373883db72d0be083e2ded2af9f2aa54fb352417c63d63658df78514c759d6e9405f58cfeb55e27eee506c2a666d0c3c4e6fa830caffca66892b3a82d1dbeb9a01529cbb92048e927c1e6ca9389a0a6298c8b4855131d65ca904a2cc9d7ed1ea08a6a2071d591ce345cc613ff725ff6858c4eb7def5001b86c38504a709f0449b4e01b3ac3e01801fa0eec47288d85de1ce8bf92fbe6e71a211ab59501d90d5994836adf5c260a4f074a5067233d281443a8a35d0d72f0e286406524a799576a3605036d1c975e5adbf350189db140ab6b892944aa60b9c1fa3dc181f87c7d1bf7e9975cabb09e8606be4dc3ee867a14030ec3e2395cac090b676d256adee8ef88a57936701e458105ffbc019c293eee88ae15ae60b332482841ca97855d155536cd3b83001cedbc683c1d4a3d26098b8aeb71118700f70fdf715c50ce639ccda0d550aae248f1989bf8041637e9648b884b68a432b264c0af6ab4d9ac8ee9e945324b468d2eebc61fb7e2ee22ffca5eff528eeeea6405eaf6a2469ab62b87189278adce774b569561f05c4a64e5b5865e75364a2482551f639c943c61e5feec272cdabb170aaca71135b2a39417b0822438115e6799ccbe74ce2007363aabc461a364850309687b9bfc8892372245e2ff2f82842a16f74898bb7cb3a9a62831d090ddb4c1a4048370c9609ea471e0193db00c63e2864f6e4de8fcaa4294fed50259a8e2b9872b4f1e00bd1182a309b56e5e317637744f6002eb425387939a0e65824877711f273f125710a348224d181fae74238f4d61fe6616c057ef2e844e788f5eeb7ed892e3fc10edbc7b7c04d1a0156704608e4169d610092fffc24825c9f53ec7493ff8de19e2b6d5831cdb72ce176c8131b34862d14b8f34200b4024c8487a9356d1c37e1a20fe86f5712b6bc849073299690159f64db51d064616bbf1fd94c82e2a8d546b70473959359f3d4d1eb9810dfbe6bfa38b3d32f92f365bd5890fde35a6a0e19c45036504c68167bb0d1604e608631467786a2e9f0329a4f17f6e6e13d2b8b61b03c5a2beb08c6ba0988f36d80b20f8b0b9de586e8e5af7c44512c03f4b3f326651007abd601ab98c45978f5a608acd2db40c58ce1d64f4dc7eafad2e5caef71ca14645a761b6e1dca8c176c3c52b122cfb66a8543cb20c8880976d579382749c7909abf331eb7510169fa5ca956c584cf49fbf8758dcaf770f6c89418c442b644cbd06276d12d3d5238464c55dd91ffc33fa06ee1e4f6e265f819972b38e9c0290e2fcca5fd79e8a54026c5a8aebd9b93e1836eee974c9050589167185ac3705ea1df842a6a435ae3cac04e0a93f0602877c980047073091a5f578b49f379cdcccc07126be0329cf21e3c6fe352d25768499d2c8b351455a952948b24cab2df59d7d0ffd227eeb5bc84c3b09bb40c873c9e25fbebafd67de77c6ff013a917afee0961d2c50620ad28447d9a9a8146f98cc089748da66288bb2411407d564f4474abe313ae47708d1da591b4488127b341f5f220d7e25f7e0c91a106ca9a03a7d1057d4bf4b0855c85f027860e7b58bf41868885322a7667c40c48c7613ddbdeef5f5801ff0a0822476e69995239812576bb722d07474f4ccadd2e0dac077ef3b4019bbd371ca0e74b647d747d8149ebc7dbd9a0bc029134064c7a5f12c095ed0a326f0704b0f6b4791d8ba0f81c581b1b30e464bb21e42860a15546fb2fc7d5d83cfc68ce8cb190b9e0bca32ad257bc5c00bc036a6cf22fc023e649cf1dbdb206656967fd797a84f3f437077a6aeed77194880533ad60510e1b56f0f7521f8c7bf6df8df93ff9970fa2255352aec473423471f07daad99632d1ccc3d996946c213685602aa6d5d1f532ae1019648298b7279f4eaf2c0307148d714bdeb1c459df6f846af976b73a8decf9c53655cf4eb8b739a633fb86ab9d976c0f6e6a585b9de70333cc7646dbc0172ffa1349549e2d2a678170df0b8bb336e697f28af87a43e82b410c6f2bbb74fd77381708b98ffec95366cea03aad3fb4076cd0da4bbfbab8231e222a0de292e4fa05aa59a52a13dc22ddb505ba1b2a57f615721ffa31e89f1452746c95590315e0ec3405c07654abff6e8dd834dd5a68dc1a3e24acd8b6e726636c006b27add850721dd5b37baa7d10a2bedf4ff9b92ee0049eb00abd0cd680db71ad36547a757221ce8e2641fb9c7d00b0e3b4792ef32b5af98abce7d3b64b42ea3a9ee951336f80adfbc0d1314e6f11ccab0a64a0fde4a4b77b695ef1cdae1e41704ded195b6f1723e32a3232dc0e5b7801fac3f996346b3f4bb92b5064d2f9dd17e868bc35996f990d0c6ce88e81681dab2c9d20044335fbc25655d6c2df5a26f71a632109160f75420c8839abf1c0247247fafd8f388d52a7e5e46d31fcca84d788e4301f0e7f204ad58d0f7d85e9f31ef4e378813cf8acc411e1fcf751d05f80ddf6d1bea84803ed0d83514a666df477da5e7920760071df7f536b5d07f41fbbbf9eec300cf185f35d72e75bbbd48e44a276e8b60f2c0ac1da42a2ab46be2c4ed7e669bb63020d236c63b8f8ada4284ff330ad892e04dd32c8b7882935b7ef01ccd530a8d5040546e35dae6864672c5e7696b0e1fc1153faf1b8071ffd66ce9e46732a3f897ed4246969b0f507a4013ad2afda08a1dad5e0ff5006d4c55332ebefc93dc7a8f8e285a78ea7e5bee40fabb083114544e8c9ad97846e91b60784b26cde528a59fa973144d47981b3aebe79b81b3edf0dc19829635e259ef8092ab968bb52cec50d5befe9430f110b8a766b917e4a1f25efab1c0be51443b2e18ec9896623dc13b896893ee451ddf1009f4ae4b41b4db4fa694e372123c80d1816a977e9affc6c84b0c5eabe272c8b99a1de58c69bb1e16839878e1b3b7430352c23db4cdc75f8f8116c96d97a4801dce4ef96bbb092d5c3858eb8da429043c037fd5d959491de9c2146e93e30777c52d145459b443ab892b42c5e66226470429f00a4cebe9647f8491a8cf433022481cea70e6f3eefb15e2e2928c8c138dd42cbf459fe42cd5a95efb22603693120f344df993e86fae8ae5a4dbd070954b24825a1232e087e40fa7dd46074bc4b99309cb38d1004a3860aa25fc62be0ff18dc14ceab65f7f120af5949e24e139ab6be3cec93eda031b3fa6d29ea3d30833787004599abf96d233dedd853995564a0278e5252de42ee96072471d244e02636d051cc9408f53c712b9f4b5c5e6cf27ef3f8ac73ead22058b82d002548d8313d40702c4485d4a43101d969a4a43f8c79a8e4c49d1a38102096f19e8c5200ec765dc32d52297cee8c4802f9d473b679b9d0b96079755c061728d812af68409e07b2b39666fdd661a98781c493d3b90365f2df49ae03264965f64b263595809018c4a9312707ca47b146c0928acd3070a597be47e5cc7f233188b0a0c7dea80bd21d0bc43e5141e6cb0d262a60680309a346be21c6d94ddaa36770490c4da0555c44421852e3218820651b56bead1b16848747a1f8317ab7e51af4e9ade950b6dfc1b7f50cc35473d7d507dc4ca25edf73e2c18d24dcec021c29a34851baa078831dd12214fbc0ef19e65385b151b5ab96e094aef1e38d03731de42da1c979e26fdff76911934f460e1e651996c208c4150828cc084d4302107c2162441dc13bcc8f9390ac91e8bedd08a660a2fc407019e3e5af1022f8461bd1c1ade3be62ccc1b50c608cff72a1af297e227e0743f8caf7341eb26a9318bda12cd726b542dd77dacaa159e4d735ab0b5626d1ebfba44fcf7be2962efcc01d76c9a8b4094bb51685351bbd49fec3fa35943544b04fbbd1f023c363761b8665d702e736c2639ec53fb5955e35cf92c32fa2177f5f268777e49589c248d8b1ba4d3e5e53e974deac8fb2d9e4b032ec2f82e69429006a4e6a3238fc5aae1b8b465fe6d3b48565bef4fd94adf8c30f1766b5ca73ea990259d16273e4d4afcc5a3195600f019e1e86c511c3da42744e5c8f50b47e6c34d6f0d5fcb008d753d367a37715dae13d877e4654a72869cdd703d2db0e7b54d8ce5a9e8956310ca318fac38e6dfbfc6888eea04da85e16d6925458df3f334d8ed2e15391cd271aa6835bb961d13cfb2a091dfa852f46f096689749e4af6efd5dcacb1c9a7cb2ab65fdd1ae78a7638688f2547d82a2a6a0153f13cd70c6f40c4d9e61222ecd9a64e66ca5ca5c5839448c2bdb51ce6b47cd5b01110a0dec8c236636eb8dd427a6ef33ba2034944d86de3d9cfa9df1f0f1207194d92b428900eab17ab18515f2a0f454cd8715a8ed12fba32ef989719b6b405ee2b356970516083553fa3177974e1a4f8f2594219fa444c7c71f3fd8d37fd72ad1e7b495c89726faa710b9847c780a2ee641da86cd0661b050b5e4adfff38ade4bbc6cc33a4aeb09603946c40ae86cf9bc220e5fdefef966b203a37989900380377ba6aac4f9006964be00bea965e7b6f81159353a55b4f2d351a2c3d81eea1b7c6d8cd0cc6a0c229de70efac2b6236f8256e38e49d33c5b9de709135465e6b404d743bfbc66b83df1fb9800bba4c92b4239d3f5723f36a9f70c01f1652ca055b604f6fffab5acc14a44c859fef781f3200251ef20624de5c80ab2e6733dc0057a3bcb16f01f8fb68f08c48cf177f2ce04f88706b8052716fa274379e65eedcd38c3ea8e046c0925a890b421feebc5c4d6649bc1a3ee6c4474acdc332658cfb3d8e57cefa063c4157c24c1a08c1da1dd7e8eb5a849e6c5771ee1a79b9bf30fc243e9a9bf2bce658ef50b139202d32f22e4befe4412b4dab8e00dc939aef655ff5f1798880d739798fa8fd17fcad6179af03c9d1c6722520ea2796d95c52b487415b672d1ad1a003c74f623ed4bee004d8b4fbbb9aef6d5824c6eb9384a5891284e105e23758d488149893266ede292449b4180a151f90d1bc632d5a9a346d823f06b8505cc93187062902671187c76860958135eb6f39fe1f80dea703abdc46ee4100fff1af3180fa75327973482541bbedd9d7847ac36dccb4920167585fd1013472399c876ef6800195b5ea9bdd30ca11745756aeb7815252d9e22be652c116458e95c3ce44583562ced51e0f59c60995034df897a0d93f0008d1c7c26f97abe8a8acfdf05c4668fd203f53ff2571f90ce913d0b1f9e5e120b148c16900b520b262e7b19a0121b9554c6d42f7bab526ddb851858a3d37f75965cfbf66b0ba13274fce6537fd7aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837fa06f1bbc1d9af368bc19a40bf0606355bf3178bcd162f367c7e09a4bcef4259473c5ae46b91f632468727ed1a91e7735d0ed772279e11137d6312d05478e44712baad359f7fb097b85bdc392ae36bbc11a3dfc3557fd9a0729f79f5f214648df7127723fffb84f34b8005d97273099c34628f03f943df69d673adaa184a49aa6ed43733efadd9c19ab4533283d957801fbb73986572a8dc13902c5139731a08e4606be9f10f357f006932d8c17ebbf45e2f1c053c94ac73d475848fd8374c35f25783baa6881ea8270f3330ddfbdd855a3de6ded11280dd838434ba66ff66be031a2d3a62b0fbc97926b2df1ba902af9e586299e5949c559b5ccb657843d01da138b6cdd802635f714060381d2ee1dfb50f2daacc637598965fa7158ead3eb15723bef95904dbd699dc99e054f5e19228d29696082792f30f1d565f1c8409359f7bb4517820cbcb6d5bee4c5596986354433bf02b597b1160065786a460a5f6e4a MD = fa47305e71a8e1e536486a806cbb839d813caf9f Len = 42488 Msg = d2f61e1a3e370e78db7a356cff4e3e0a40800ab936d79b89820131c60eceb2cd979c4f1e691365b36a12a1905ae8689c59c876afaa77c5ecb648b051544a588c47c0471008d15369c781c5ccace0bbf36281cb28d62ee99f3cda8b0854d70b65eb4a4c19a4dba042f8b1e9497c9dffb86295524b4365d1491ca10a1496de92ff8a21a761c49814e80788552f5287fc9262eb5341788243935c84749da2c5b6042c2fa00ff0707600fbf050a5b606792a696b1631fdef0824066a13ca01f63f19d95b7e4cb1cb9035ddd024d3318240277ffde2445b12e8a6213d2dc43ad7f5e89a8d8b3f8d11282cb40f17e24a631732ac8901a11955aabeb6e40bb3d5d29f1976ad0d110eaa0790889772fa8a11c7f3f9f7b972bf1f1816cc47f5be5a4e075476a44de9bcfff507624f7d4278f518116d2f53dcd6d7f8566b4e320d52b3f340a15893f01e76ba39491f7fe39c75d135111a1609e5e713269be10cc945682c85ffb2274dbc781dd045efc2057efabc06eb9e4c2174b6312c65e8c91ab9d77acc989a50291e6ee7715ea78ccea7ed9f2d06a43b4b0bac1a13d04bb2273867a4bd75f957accdbee0c69d3026699eb4435167152db033319581e5f20f19498074ff9db584fd50d2d0770970d8fcebb9701b18d7687873ad6b1fabc52817758ab03b18b81f452f107f2caa50e9b01762ed3220d435ca548864942aad444a42ed2118efe870abf3e2b58c89b8a3aca919844087f2dbce5d2a48886a90adda3a128f3f292fbf5823af393fad914c192945fbea551ba4ae16fcdfa57458a9eee55fc257ce74537447ded4ee1fc12d1e1f4d1bda9336d68f0764f1904feb81aeca3d8109e79f7526e7d94e41e5328ee4149bacb8492bba9cb9cb45f403337d43711595fd7a976d968c076fdf09cab7929096762b7de298fab39aa4779916e4d5624dc7da924683edbdd0fe719273ef5119a640dc3942b8d47d37d6c1187e008b264fdd483493ff53039cc59e89147f493933d47384356150a00ca37b8852178e44819ff16a6628efe5d38a0ff595afa177a5f89767a3dc96a37fd34df17a7206444dd77a3ba747eaebdd166bdeddc7825b6575f0e87272cf0efa2dde5cdd591aaf1a4b8eb03ea46b9d23315b4dd60f136ed91327128b68236ae47ad7d06513f20b4fc4d3cf14879b840ba2874867cf7d376a99e4ead609b93da582df56f9eab7e3560af1a20f38a227fe3396da784ee73f80d1ce7a3b9cba12a50d9ff5812491bc96e5913118fea70e65aa3108f2d57a0c84818ec9a3684d6e4be3bfb5e60aa720771d5b821823d2c2a6d0ffdcbbac5d28dc72ccdff4b69bdb01cbe69e0ee422966179f6a0f5ed4cca2b6da95dbc1bb91bf26c2fc518cecce02f8fbcb9e2fa29a7bcc30b9099a53dae5a49d693dd6ab66b2d375f82f5f807063bf5eb0d4a93e5d9f0c1415bea92cdf79d2b2f8707e07ba2f49a051e757c74d38ec618a22ff97eb7653c410ad2fe222c5bdd5b4020c63147b15ec9a27fa13cd190c9ed8177721bc684fbb2a5382f67d5fb2503c61164ffe3cb4b5215fab18788a9c812b10c47e490b3c83d32036ec27be7cccf22c3020efdaa29497fd0f27c7f42892f3ad4c0029c5b698abb1d035ba5869a665b1de8861db6c055e8e8ad443ec1d6eb25b9249d72e5a740476d365bdb40567179065e8ecc57d81f592a29064d9075ee79a2bddc9bb74a07dfdb4feaa57dca978568ab4e90f5384ed97eb0eb35152ee13e76d1e89e3b1a898a4f952f8ca5bc81862a18eff4f8a98b71cc881b7dbacb6c7d1fa9e903d8df6b50b151531720f5d78434ed997dc8f37e28fcfabdade612363d848d0653f5605839e9cc7dcf573d40886e7273b5cddece06f64efa4d00cde8868dc46715fc66f64ee04bd63ab05b6498c0eea6236f322413a2ccf9e672c22960229835d154b9ed967c1986e29419ecbf12ab594f17b62758e9bce3ffa3baa2d42b4f980f6521e619a67db44f6c3d80024cefb5c22b3380dcb165df21fb7cfbe99032b758976689e047be89079e90c76b5603e2031571d6a7e41016d3e2d2dba83989bb33524f7df245252c9494da6a01182f079a3b38d2c26805af9dc082ea170f9ccb29fea56b588afac57eb4e310cc7aba4d1007501c34278cd307fd55d141f8b210c10330fa18fc857e4b687262d565eedbecdf805b0507edaa9a0113382bdd15b283c9b8d33c850d7d8517510823bf11dab62d91373ef26f5bdd3584c6dfa70bd8f7b9059dcb0cdceab32846a9be726c71f7584c5ae6cf5b0f59ff6f24643cddaaa639de01ce7838ee5e051aedaf6447c935c876690586f9ed94c89efac286d35117b20da74cb36ab10d15957efd7fea09fbe5da0fa4fe911e18f9d7ef016c34f5d28d58364da4b95a48c07e01b0a99c5ace173ff2c9216bc96df8e3ab2ad54abd60308857da336f11986e9f21d1cca6e438c66cba7fd6cf17192f8ad745ab5bd2480565b1f948d3008387be8467cf50cec05a2a10cb050430a604931b58d5b05c1272b6edb5cb2c4c9373a4d27a9ae241ef3b419cb796533b9ce1c81e6d3b918247e145b213a4c320509b19b41315a4644bd179054a720460812def898bc5456c6eb9d8a91dbce0a24165e4d13828de605e859af38c7f5fc9df50d103bb5b16430f623879daf9cafaee3acfd3f4bbd75cb0bd6b1086a6ab9b3db2363504e54a2fb2442dcb5244cb51df83a05f4cb6d881c7e2b5013fd0320124bbe6c66e4b2a57e0c77e478e8629cf9da620204a0129f62d5d4071bfe33a211bd3a85f0175fee42053f59495a52d9baf0d17bbf58412e46a94d4060fc90c23aa6245a8c64b0efdfb50585b6f8b1fde9d1e4ddb5528db7304f139683668f03059d08648c4b6a1cbf8267043251e47bff043892673d3cbca85db36403caa2d70b18530e8039c01769f3d05f5be48ec672fe39544566e2b1275ba95362a750d0a39e90e2f8ce7742578fddf1842ef58fde26537de06e243725af51cf107b3d6267964e7c6667d43000ccfc555bafdd1aa9133389c8c155b13bef6941adb4bd1eefa5f82549948b630e21980542d59a096c5b45f25eff1bb1d2824c458af2546884340a8822e2e14dd8244d9bca3eb0de805507622375dabb721e776548a297d1cdd7121f82c19a72e75b99536249b5fc9da6f433a6d40720930a770b6743fbdd34e58b55d9bf0b54c42df7f69b951e060cb7990169884593cddcc7b25754f50d4205f2c5a849b875f711d5efe69f5d6d660d6235dc010a878b0be5f4996417c48daed4d96ee01658e8bddf99c3d6f8a5221efc4b8edcca7e432e6e4cbdefd8a570569e1bae10c9601178619ec3ba744fd972a3dcf28a09da9eaaad253566bc228283db06d65a364e19d8086956d864cfe49f055497874d4ee6073f08804746be4cbd0825883ae1556a5320840dbf2e97ebfaad3cfe63092dc1daa0713f2feceb2778a1f224216f287b80667958cd464a582be800879bc209ba8b5df9b28f234bbb2d34f74abc1439d5d636a3b8815059a1996249d3900c65289fe40c9ac39e3270713d9f6c49850bf1db1dbdbd79b14860c9887352ee5cb2a49ebf24588b9241dfbb2864f978360167f59801c8250d990e42e70796151794a6fe6bcb6c45c3ec518181e282c6bbdca0bc121a78f1b9ce128bfa810d92d16da835668c566097b48e5ae69288936ad024952882309e3a4a060b2f8a49e62eb040ea3bc1978a821ceeada2ef8b8ce79e6c2747c39f5923af6157126dab9d740ee9734815b0120797eb005373fc119699ffd90c4915d0fa60bcd63fa5c31735dc0a6737e320a5bcb81be984aa6aa01c455820c29d24842300613f03ed20e2089a3c3c77d479a405fff9cf930d57d6dd42fda5273a5bf1320106c80b8e359c50dbf77984441b9b77c1fd392b1734244df568cc86ab1c96abd50627b31381949313b494f9dc96fa86b09eaca9428ff702ef220d8d59f6e2f50ef7c4a727956963d3fc2524e87c5fb75e66908a39ebed8092a1fe97e16b64a21144353404d189379f5680a1f22c298e0ded9b6a47a8664b72610622bbfaaa378e83dff665c68282d83c6dfda436f68f418c13b606760fc820f7bada54251239d93f4b6aa4f4d3da011613a4591d251fbbda9ff9f0b5288b00de831b446b4b0d73cf0e1d6ced0ba1bc8c3812ab5f63c3bf4196a280e67f08a47e0561f73d933700bb7e6b080f887e6cf731e4f56e012fde69ae4c519a41c58e6ea84b072ca95ae29d32f010ecd8d494ff9777c1d9ab989bab3d53cd413f562118f232deb8fbcdabecc22901f57b28c70def67bb12b1b2799eda556e6bb61eff1569b5f852e923bf12829275c9fdff659a90113bc9b1f1fabcfbcdbf8a44949aec7550ee9b1fe1beb71ab8c6dacfdd033e2020be3f2acb817e18293b1d796b66f6ab702bf1fe7c0d42e1088f986f2622511602cd039ac3c06ab6046ba5b2e7f5cc82a02ae813773d3e8bfe3a836a8f458bf833e2b7806f19fb6bcbbba38fbec9e6817d85eded57c1026226524c305cef473d3099bb5a2200b89ffbb5a77e4445dd2e44a783ea923b470a0d61235f33820b6b854c9fa681071ac920e421fd0d1c08ffb21a4aa9bb0e74ea1fd1d955979040f9ae95d4e400bfaa8db7c1938a9d9f026c2248928936ad0498da3ebea1edac906e18efeba1257ce0444cd87cb56a5151fa31dd0c3799b98e8cd90243c2ca39723f50c5444c63d144834c836debf7d560304d22080358966b4c78c71936a1c95ef3e2a08f74405f5fd1336cb7ccca8db594f0d2269af7c6334e45f7af8c08cecf125b2c2d874f798aa48dff1aa6570cda9eb947e85d0beb7f08cd0e672163dc3b1106a29f13e5b26d73d8b4e72721b547c402fdbdc7e96897028a95d0a547543b8681ce6498b78c60c59028adbdbf29758b6a8e177a24b013d1eb089c7637d948d968ea1e84197a1d2040b4eed883dbfc8b5c6395d252649ded8ae0fb1299dddb9008901d74a00deb0a67042b16144f351a5508b96ed6f86dbbc6a9ad08f1c47c210d4ae1d8cfba62fa7f70d2e4f4e5c7dee0f7e2be46ee3bd34aed02d7d44f9322d3951c2f1d021d57069576d38a521d3f8cbbb23f16a860aa74059cfdc5b1b90be7e92cf60c6762d678dca74068f6cdb2c4bea86fbad974d7de9debe92aad7652d6c184bc026cebcf52d0c4d9f55621ef059b25dec7d3f0b1d71070389795338e1cb8c3efb38500c820fc500ed3f2d23adbbbbafab23a5cef1a07ba5a710b791426395b0f84425a477fc9e93d694f572cc3aae8420e7f31d603ee3acd6b62cf8b8fbdcaa9f92740c3abc3e10449ee194b39e33e433104e81d212e621fdb4daf6ab5d0833d86a66cd35174f7e1ea31a10ccaff1d8cce8e081afe52d0b0452e812834fc2548b13236ecfd576e64cecc86e7e359167d3b5d1a5607f5f72d2d87ed5a89ab214a0d6d2776fbd5d4fb5c1113730f7ba9a30c049754ba8255e518ec6c683067f7bfffb9b707f99acc1436920f24cbe1578cb516f7ad92827d868bce56d7a5ad29191caa7e2662f0b45dd2e1b2739524a098caf6b3b72c60ce7ffa90652f660525f3c8a1e558c4720e16b562b5f5f7b00555c2466407f4b7d94ff9e4ffe60dea8ece985284f59ab969fd62a77202601df6521f68812668021e64ee3e8f81e9d7b408101eb5a3522138704f228f5f6ab9140c56ef838912aa1e5d5c0fac89a657464ea4792fd88733fa0def665633742bbee2ed4df3a6614a4997c7dadf73afd3b5f0e9f43c1ba67c4f24c7d57f4518f0878467064a14f05d30b2c61280c682f7739d350262c33c6478537d1252fac571de5f389b0f4b3c4d642cbb5948f8bc1d0fb23a465c85b5873628538f89cb065a53d1f69eabbfa1a544642c118080a7cf0ace5e1251d9be4ed9020fbf8c4c6804688b1563b7f8bcff5207acddd004f287c54015091b159346017ee624c2e546fa8cf9199cbc6d0ab62d75a210bffc18d1ffb5e39ce0ffe0e7200d9b41d62c4fb741aa77ac11b30764373c905c98bc8727faae6e407bcf33bcb52c83b92e97cec526fdb40450313f73ffdb1c03f2ecca14469809862419f831415a23dd44ae60ae9d815358108e1f7ff7cf99b966f35e0173e149f072769adf55151030a0d681ce25c3d9f9ab1033e2bf889def6d66cf8a0338b3f1ff6bb83150fbcd55dbb6cece4033bc7bb86df946a7949d186ecd7b1864fcbc1d234fccb1d57cbfaf5db594098d6f7f50a10dec1640821bb6f38dfd2719abd6d476b934eb42f66bcf9f597e1a6dc5971afd6688cc2acf9e6d843ec250b1d498aa722ead483a1756192928e97b51e4a82d361e6be2c6eb998ea936770f9df586219e2682532b4e032e739a6296da2b0719e37be1f4954491acdb2b67ce6e8d03bc632750868708f77217247617872758737e25a77c26991b4a828431178419b5ed69a7946cdde6b7867c5d9057b967f09c7ea208e3eb279ada37b75f657f19f1370a2dca70a055a7ce2bbc4de2114b84275d57a2c6639ea4fe835b3f52c00c6a1bcd307f3c7ee45cdb9db70b40ff606796a2dcf18e205cae09cdd67d49f77f652e3b460f2ab9f15b115ad454ff04453f5cd79871b591e03a9eafcf85c575d196c0dce506c5f22b0711ebaac766a0486ffc7420afd748d7bf2f819ce55fdba163861a740288b7f0055fb890bf3254087df800fbf86da591c03eebc51873897d5fe08c996efd6bceca4d5a3cb8ccaff3edd1f68107d338acc23f56ee9bab1fb3e062abcbc89e8e35ba8d38e550a014a9341cdd564ac2929759b35b5feb510ee3997ed0618be6afb37a71ed4103471286e52b1df24d9623cfeb4d51cf841fc78aefa7c311456040d67eaddfc63d4c3a1b759f40db6cd86ce4fb3fd283f261da28578fdc516185d20d3b9398fb8b09fbd569ebde883503ee450e3d7633b2c1c73a657994888cd1e3c635c5a147692ab85336935f7f32a3288e98b8854541aa1f4f9df7744d13dee69ff1a671304409200360283c26f2209c102f23b83f3ba532b675ac040593076b08f3c8915cc82fa3648b0d1d15d016b98836116797ed2db22d60e9bc5886e5e18fb0ae7a135228c304fbd44ad268f0213542041bd5f2be0e12f44315ac6be4daa2bccaa3fa7e6eff5346f06dd3394733d5d77e5d7fc8d0b6e5b44a9877beaeb6d07caf9778a98cb8de00f3fe9ebd8691b87ae2a50bfc004d341562cd40fb8e169784cfdd247feca013ae4165ab5228ab7b80c37af0f8b7218c8c2e2caeaf1d7a66499ddd744e192582938b4b6fb3c7e18d9da357c53b7fe43dacff2f0745d742db5fac20fea08cb9a9751418824ecee46d3614b40f50c4f5e5ec785ce16c3610551b7d400a13d1ed06b78e45598fb824a8ce6a2815c520e703bf0c2ed36ec463622183a34d24632018df5c5a7be31e12beeb461caf051e2825b93d2d43ea1c9c90e641d33e3ecb135e4100d050055b4f1e012b1a019d1749ba5f7dc0b94a895c5ffe5a4833ef7 MD = a94d7bf363f32a5a5b6e9f71b2edaa3f2ae31a61 Len = 43280 Msg = 9b5f37f5dcedd96d9b7ff6d852b77ef90498311d24dfa906b2979b28a7e85a1893309c41855581d92b59d1133a2e859610cc8a2f9982c1c26f894a8745df027285524af338db0be0272ef7b03f8f11e93ae76fdb7c173e8f3b8c08fbe3143277b9f0c975be2a7e6cd629ee15298227daca11688c9749295460c85bec4b2ef10e76309f2ddfe8e264816f40acc0aed1510771fea7b0bd89f92464cec243d6481f063a568562be3faf702b74dbccbc16363b30b895901e6665d089e6e594b43d93af3776e311539e37eb83130c1453ff71ac751fbeff12c982ab5e2dbd066fdb50ba4f85b1b25006e33a9fa4a6611c92eba269b98ac441b937ff0c2ab360b0273f6fa90d560e5c809ba4a8af117bbfd98a67341162a9553e6c12ba652d6c1e2b48156e953aed20134772c6bdb42ae3dc3742fdacac74f360092e916794f062ee54f5c5a6c51743c7d0ed2055f93630a2db7aec14d1eec528f799b9b751b523784958d7c75f536ea41c5adfff476650335c582bd03adf739d1c9b59ddca830ad21184cc80706a49b314042a430783e897a424df684e0fa5c7617e99626921bf0392c2cb5960257bfba0322aaa9f55a3d699263364744502afae88a2cd9559e913b659fcdb974aad84a92b07bb78a426f925a54d4d164b325cec039ca6b5f1300b6393888d7ea186571538e8fffa381c082feb55ab9be7ded60135af7633b23ef283b697f77bf4af7bcea1f5fc8dd92b099e3e74046be2ae26d76701c37664b8d0fd0b50a2f709cff8baae583c9a4efb065ce7d1e2ee03495355e0bd18e6cf49adb9dadc155ba98fd7c3a7364787603506502d96cc8c14586562ea09faebba97929f6b63d80d9c971fd0d3baa3bed78112625ae84baddb8265e8cb0df3edef4a8697050c7477aa8ed8c87b09daa57b86317ab5f1e6b922705aceccf38a54340b9289f1ff70ff9b1d0b95e74e74a613ed6b8085d92518afc94cfc35e048885282bd5d7865540f36ebbf1e5faff728695dc85c13c890324a3644594efeb3f111560ffbe066a90e44a1fc4b2b54ed93437f51f7a7e5b06fbd5f48cf5e7555f8382f904b7129f6648de6ca049266dd4e6afb0d3788580c38cfeb6345af6db60391b7493675d7c378d9633231dd0d50c3a6780505004a2cf347839aa4870d5c7ce29341a2329799b4f0bf3bba5570cd59be9e3f4a55e3990aeecef7d22f7dd1c9f46e8079f192fe7f9aa3ee873fb8dc787c17c5ecd04adae38c7581b8efe69d548fee0fa1faef7d419eb75181e60c0588a6889fd5b9a877e8e91f403e0e7046837abbf50495d79b63c5a26f8e9195d1f1059cd3eb5824f97fcc753d4dd64256c07f7e3a880a72e24bd70d4d97877bc71c61f96b18f4e7e712fe1e7fcb8d85557264dfe717a0e7d9629c9ff58511e5706f82476e42d718c90848c30ea27c60c900f2850398a15f0810db016e3e77fb52532f2fe55347e028c9700cf3b8ebfc3cd4f11996f25301f8be5edac0ac01e7f7313258d7328d678abd3ea035f7228035552942a90ffff630d2ebd3f4b6f7cee76f516c4cc7f1d47a4c7c28dc4568153deb62a942d6ec6538b64b941043a0dba87755104dfaba4f7ddef04bf18c07e3dbfe63f66c2f647799d046c41f3d4533c4af05eee0b332021ddb63b27bb3451197f6f5d02c02ad54da8aa30b268b2e01c3812bae10da9f13e1ab9e0582a26bc8f93ce0df8c371023834b2c132f15a36b2b548df8e2574aaa51b666eb0f41c02f8a36eccc93b7d50d1d7aa78141c3ec99868ff57260127bf0f664860c28788e6fd14de03f496844392f81dd00657d50b45b9c29c791f47a0c571ec411d82f1baf56e986dfb733a5cf41c79636a22b18e433e2f19d7de38e27fd4aeaa2244eb118a273a455e4003ff9dbb499cb00b58d5095c9179d2dc800696e52be6616bd96d23c510348d9b85bdd86b0b0688703f42109b9616ea88c18f9349c0906b5641204aced6b619c4141a3c923a1b540fd987e171a99b8f6151e00d7929229092b6fd67baea448378539742d753559328cc09048548525204d5aa5dd9a23781bfbf37130fb75a4b16b8b78390e34fd6596b37f23cfee5b2d1b1411d01e829bf2bae8fd533ea71e13da7ed675576648e204ba7231f49b022566936b37857839965294a16dde025d64bc5bb769b693e3b0bf1d91f82956c3111820dc9b37cdfa10a9408605434e0aacf86a429e948275d7ae240502d7e546f818038c839c498867a933d4a3d553ccf476f3a09b5afca760b817f6d7671132e24e84a2771cb488a339b7b2cffcd94c431e3ef8e86ec92152c73d8bfd3fa22fd7a2eb47ff1fd5a5cd4012481220a731a1d893730e3ab18ab5c2dfedfec960e7e0fc7fa2a40d7585eca88dbff3a98624168c393994247c8a92904544626c13ff044489dced4e5cd00858703ffbff3ecdab2279710296f1cbf01bb7b7af8f82224c62511c634a522f2a3803efb08a97d367829b43e1f7d9f2d74a7d6e6f9c76f6be3e1f8b8c691f4958308ef89cb259df5394e7d8b7affcaa4f05de9229fab72365c13b51f3148ac89c28588247e04b987541a4580f2622996134234b66110d5246d1ec951db15d51fe08aab4387a36a7d76f1ceb6ec3136714c095c0ad49402b6b577c7f94aa5e8f85b8ccb6f7eae2b3810795b75ef096bd718f791a860a1755db3c3138df655627392006b10c96176579f258e7661575437e8a1a8079bc5b799e6654e8864c0cc42229a0cd00e89d65c916ada10f9876a04599bf1b0fc7d43ebdbf2cb611c54a0c49b9e13159463b5a795ddb0ddfe2627ccea5af13cf934a4d3f2e03cb093ad6a7b5b91206a21abbec8fae2c55605b00811f94338f4288854d2c9a1f4ff612793e6e127b7360cbe3c415f0e69e1a6b1a55425093b7ee0f4ce78cedc9695eb5fb797daa64a11dc17c8a120d5213947b76a03fbf17b45d8e69c3680e4941cb8b24ffe96b15b760644de68fecb8d956f1de0b1ccb07ae176fa288c7e5e700c4fcbc79ba3cd5deb21c207e9375601be837173de35baacca218c0deb25aebced2708a8ef904ee3e9a51bbfd269091ffd3b3ecdf9c56493788f38b6f30559cd27b4f57e7adada6fea06be709502595ad9ecf24994da62c175166cae049be44354a01eb2bde1e46474cd26c4a1a1cb24ed1f2861200329b9383db47dc057d291ec4ee0e03943f154027ee126a8b5d310af483dcf3bce2ded3a8b9c8096d7a93b6737e8817d8f85d12b828a10eacd15a0890ecece38a9e3c004768160f889ecc25de1a200eb13164e487e6e0e0835e74712c947f8b714eff42e950f9975fcf1b928d28a09128d274df1d9198881bedc96c51e35c9379da6dc015d93849f8f6c7250912ce4744c3d32a019291ae79679f2286414da2aa2acfa3536b9dcc5dfc1908d93e72d90decc9efbb4f93f9a7b23fbb531618600d276c122b6eeec996c75960851656ee8b36a053d4326611acb8f15e40ca8677a9b78e36264af4e7a941cf589600412fc7879e80d3a2d19f905ffc33d6c55f8c86c37b37cb6777cfa051c2159366fa43c8c90d9e40079e4b5b91aa639c706b4aad347c3ca32d3f2882de7cc204af4ad496e233d4a4c893bc163541161b31715625f0d96d3505139b58d243857143f9873abc594b864f799bc9330a73d9713b5bf6e1daf30955bcd029146086638acf06bb3dc62b6e03178f7a734da360998fff29eec7f6a786036efd8c1bee62ec94f9214fc49be44c374133dc52ce380f36eac5fee79d9801ae1edd22bbe5f4d10f0775d999c371929f58fb58601ae73df8c5d2fb8311632d8587cfbe8a92a3a109d9bec28ecc9c3d187ddbcfc0b2f7899c3859cce37a90715252de48ce1ef6c44a1704f4ebdeeeb56a58d927bbbcf05decea60594fffa737db260fa8d0b175a29a684f56f820ee635d90004997615820ae84f28a0fc831e6e9ac6cc6d871a9a3c174a8d0fdbb24adb9ce551d9cc8b93aabad14476afeb6e5448bfc8a2d89193086e4164a41d718fc45b9e28b141a9a13ab0ed078aac9bc9eb46cc7dd191f4eafb260a2ac0d9a53b9cafaae7c457e8413764f2d051550cd7801f7d6a5e25cce8a0d8f53dea92f5c4a1038c1d6781dfea2d31734d6f4bc70dbf2d330ccd16723275f1a31c95dbcbb19df1c2483f61e90288b0eebd38e342e2f51a9dd382e69d4f070a84453716af98cff4ede6904aac20d66dd5ce52de18ddde420e6d341896a4b08e295652c609d0d3775f772ede91db92c2c8ff217eb174b74e1528351f06ca2ee702be8d7c72f0351397885f7022894a5a28ae3957954e2c8932932a8c5625cebf90ec2bac637d6134468896c1e6b0799e857a1efb3cb0aaadf74c78c31d5e1c72547dd1d863eed463bcf6892646f78cfa6fe136dc2042ce06d3a2a465c4c994a9edd1f482ecbb2b2c9b509b2fdbb501083852057ce87ae33e483431e6d4fec3b09d87282e7678c1e9423541310d8f82427f6b2f4feddfa6bed57fa5b8c6642641141bd15d999e353442031ffc64cd6d33b58b08d7b8d76502fbf3747e31a038b5c1fe8472be9201a82b588bc47a154e567b4016a6d1f8ca953c2e22897f29779927ada6106dfa939f6e94193ba5ed92152118fd3fb1ba3400069e347d37766f65c5a7daa9104e77847c444cc470ccc50a57741104d0a22dbdfbb22ecbd2fd9ca62c8b86cf5df42a11d4e79af1832973a07efff688c74734397c0875f7da456bc4bcb73ed59f9237a2290c9845258a1a7217fb125e0dffd40d180fbe73c5e4695bf6c9677e6d8f0cdfc911a922007525f9b323f8d70d5289a350464cd22e4121d68b20a50c306136053595622a8c512291c0d92e965dd5c186a53ac5a56bd201ceba5b5c01a0bf2fbd0f1637c121d49cf4c1a9080e68001831975b9d30174da5af34d8011106df7681a602be887945f17d460229c1c447fa3e97375834a8ea79e26b35389cfb6886edaae94ae2fb4bcca5ce731832fb43f408354c6b15a95eeb22cde17727f6d0fd4b8e488153104c9b08bb8a37e4655a7228e2096a45811195caed6b212471bf3635b09ee66b50cec900ada62d589b12010b3dfcca56d888f6554a40eb250479ce36c25adeae5558e33805554d0214f13d49a9a50fcc184b895c54f1299c279721c9241afe6e7661862963263b736b7e634ea590af17b8cfcb3aadfa511c43addd57663dba5e3c7f0e3f47876d1ef7203f94c22e2ccc429c389aa5db1607e1045d8c096196e0201807e412f74677507d0eb67ffc0d4c3e175dd6ed01dcf198612eb17df51886b9b2ffd265f47c1f0feb7d1e4f78c52a13f7a789d40d1a6bd21acd723486b3c481d64264a11d62787e01e746a122e8e85c83a22e0b5b42d916b7b638dd850d2be1089c3564d09e162336f9da2598ed098061ea2df38b0acbeebe859fd97e692f7fb059af119c836aa82111233d3946001808cc241d0ac6a6b29597f1a8e16c31b664074c47ffb7087526c9cc7892985e9beed48af8691b0c1ae379f8dc4c9af51d9a21876868ad5202de802038133897849aafdd06145c6e801eb7ffd41e59cc2dd9350b0365dae9e9aed0e91c59bb2d5a829a94d69b1f407aadbe8130e53d396f97be21a985d422822e386195d4a492963d414cda6bd82473271a17732fc9cf4b6c2975bb370dbe74b3233424f27959b031205f92152b7cf201474d0b5c73e049bd0371c907fbf03a042ddb5a519e0540f4a4679e156dcc8fc2b27c7a09b03f0300d8a04357337a3a67c4b1a670a707c0fe69df4eeb339594f208303fa6231ddfde257bcac328befe74647189be18f3a8b4dd312514f16ab9f5a502dcb0311f58bb568ebfda60310ea0997574b8683b60ce7b07c1114bbe5774156ec1c66eb6061ef833a2eb5e72e372e04807ee09419191cfbda36e86f305c3d5ce9f473074607f9715149497e70571b563b3dd90c8b3b547ed3c9b57cb4d8b62ccb5b12acce0639fad7554911ffd13a552f8f583133f9f7ff10d062289872148c3b592b2420e519e5755b9de8032df2c9057c464d3adb6d473956d7bc05b3bf45e1f7a6b5652c00fcd2622d4ba3f4aa79640c89a6c7691e1ef560fc7f2221201f643c6ba8c56456059772e18207adcc2ef5480a84032c734becf8b9bb18469de16d316245671482c96b93a1d458e0bfb06037b13116abd298c725f6b60eaa9f55a3dc74d374c4ee10f7ce558bbe15ebc74ce167f4276ea4cb2ef09bba2dd38f41af47879c13fc01a2e22ae5ed60d5b83b614f12145efe52adc85f900d9c4bd36e387a84e66d452346d5b0394367a78ed348889bdae4e242063e7dbdf7849ad5a4e77b54faaa26bcc6786739d4fa14d558a994eb8ee1a2de9e374f0ac20d46fbaa6454dd20f12834e87257ceea42a3f5932b7ce9787cc78d3c5cdf60b45ed9af4a560d099f6ad1f4756c88decb67dc564977477cdfded8b6aa5534a517a0db584a65acbfc13eac62340d0352c09047604535fd8e0d2f5dc3aec956c331fad25d733a3be7cc953ee7effecf1311e56d7c4e0ca7064896df1b11614ea04b9548288d7dc168099611ec6ce6f408068fd5102ba44ccbd93be5269ac42326ac99c42060d6472cc06aacd7746e7b18e7b60786a5a6f4c70847f74c139add3b9e2dcfadb3ebd41a39389711cf3e6b2dfb818c4484baa7e11ce29df5428d85c96779f0375067701abb295b0345fdcc2e8b19ebb490876e015f336089f14321b750a6af26fdf023148f657f149e53a602dfa6ac3c90b6500f1763c770e664bceda1dc94e3832ef6f0fe138baba1ea02933f4f58464eee56f48d995b12ea995b53a24228d4aacbf0964e5c07321867e7c8f33c763990d8879609fea2d8c48a08d19b01f262396c1aefc7677c10c9755e8942968e7d1f1cebded2ba26283edeca4fd3407af5fabb7ae1b35d72ad7cba6ebe7685287ac3618ab432f46f6b1e3daab5932849f6b3601b5558656f71fbde1f4fd530cd98434f6d016fd5030a2d51aeeb23e1e6cb2d03023400a8fdc40d8a7925a8c0043f698f9babd2846c6b33bfe0d9cb92d9de304b3964f14da30e79668526365c56d7fbc91c9ca32932f8f8324868d364ab9684e0c7cf737deab708194a3bc92d4ac8c2a4f9ba2aeedb184350ed7e827ee35af06bb45bd0605827824cd04da75b687a86c939efaff9f132ddc1d704210809943d9408f24e1d77c6afa62042190d38550fe0e4227972fcb08f2e0ee3f82ca6ab3302cc7b37ddcffd56d04104676b43c22490033bd18282f91f3f9b014f1041079a5e08ded1c7e63241713b79d99e10278f819c21ff510d75559b85486edc62103a4fc203650446ce3632178bb7ce27ed165cbabe4b06248cfbebd49f9cb9912edb7e04d23abb773afebbdc214822117d82c962f9fcc950a6d7d690ed23cf57c94492d5339a15ffdd61b39222d5c3553d9a6f9eba5cc4172bb305c21c49453b493e343e0ecb3a681e26c24278a6d97b9728f775e9b11c0483551f72135743c616910c454b16513a671791f30a038b0cf2f208f06f44fc9c1685cda6ba94f37e9805c1f5d2c382fb1ffac8adc034018fb6c24b15325d8a694d0db768f94a7bed3761fc538b1af735ad980f788280648c4a5e68ee1b44eef28eb484bfb8bf039b5c6f64695e63d5 MD = ed76c5bf4ada6a2092e6dbb40ff40909b8ec06cb Len = 44072 Msg = 5edb47d07e856a3dee51f60a723ff8dea7cd06c7f21cd37fb64e00eeca3234ef2a236e57ec2d9a3476726352efcc4904f3b4f3208b63c64c5c36b6781e575cac509a49042aa59bf9d454cee1d55cd4b9ce2e6723681e9eab8bc4be4ed1a2533d3a0880de213594146ebfddc00e35c188a0020ad771948224abbec078c95b412a4e35bbedb725ad0eae7b3bf6809f39f6d1f986448f0f9b4024ed63fcf0ca4efcf6e8a13ad5bc106dfb4f8e8b15e4648dc9db8072a8d510865e1950e42c37a03a99ebdacc6443e2bcbc047f88b34b69d4f170a36aa52f0a7fc20a2f3867e9626c9e040fac4a024e805b62b5f4441b7053af7f94336f65b1b1b687a7fe8829ba1b6ffce8e0714179433f31d9d7af9da3936cd2fed5ecbf2ca6a35a6040773fd0ce739a0c72bf488e8cd039923adc19281b912f87590685a4e6f24903051c73cd0d12a824691e5eb3e476428924b3d62773845fd7c6a4fe40f7091d38565f0cd960b4ecd7ce75cd10d29913659d1c1ec924af2a9724ae732963529da63a28541b50c130cea8abdbcfdea175cfadff3735b579576f7b0b2c86b23393f6b95f91bc64a13ab0ffaad11590f6306f5d446a94ae49b006d4a571806a16c5cfdbec0ce325bdd226dc59f70d71000cecb4d3ff0e9889fb0536638a3f1562fddaa9b70db9197bc2d846a094dc0828d1efba943ecafaa00113aa2dbeea3a7f01bf2aa8dc66ca44d16d4567f1adddd4461f78706ff15cf68ad937eb57aa62d5992566a8c011c081c68ee19657a6796d3425f54dd9aa46f35effe5859ba614cc8fb4669d03e381986ae223160cef635c63a83a15c51e41ff442cbce4d307d8ccaa153171eb0397f3851212cd58b123089b514dae7b75d4820508c5ee46f4363db1f0cf0ac1998af8dfc5b6a4851442d8a4c8380243d688e4693c078c3e96b7876dec4952cccfe0113fa41883da3f473645b403f76569e48d38708aa70114e212a6b2a62f56cb23a56e563f539e5bba8948bdb477285870e53a4b5725d897404623eaee8ba5b5da1b358433fa1a8f2438738c5569d6c8b455377675f00b47578cae3b2a4d02b68edd5ad6fd6296040cad8fc9edb4b5e33943f699eceee24bb24a0d4d615db5f6c652a5f3a47159e1fa4f631c85420ed18618405bc509a5ccd6e909c99ba3069c0ae2e0843011ad4f7686b92b24fa28ba233ddd6407279bf14dd26a57e0063dd0e2f5d130aa29d87609ba57a1d2c44dc59918955dba320de39e6cf89e3971a1bcd7f342a019a1237d3a5306249788c31a6f1330eee71143c9511e7b47adc97b857045f97c8561d68d92b98e5c7c2ed3e22d9575be95ac85ccee52baf945f713563651be6bf75039cd9855b7f3889fc5455c052d76cceb1b14fe6f7e5d08e3b155b0805b1575589466d48d498ec4c1e16a83cd20bd94b64cc809dd8f1bfe759daa663a96230a602e7fceca0bd8367d6f7a2a54163cf6f562119503b5da2f961e7ee0e8393dbb5150410f75c676e8bcb69cd902d79bf990a3162c4bb842a42c7ef9a7f00a0a921142d41ef44213e264fff9193f2a81a66f5800551c5ffc6420034242bcd23396894c5f83b147552a5e92b87173d996037bc8f699de73b0775bf68239b2585fcfa1b60ac7129de4ca93b7036a06aa831b9a3d217efabd05e6c49fe0153c66374642c7ff71810b69caeab6ff8a6166f0f3b5fda88ed602a4b84245855cc1c2630252c86309655b8c304ad6d65cead58495b551b451db0d35f5bf319899a9358a0bba0161172653f4069d60b0650abee80880816d4e71a55fa522ac42515b87546a63ba1e242cbc4a54ca9cb42f29eac45400d5fa0d0191cad153fcab0e41806b26343bc5b7de5d3520b9d20b41b022bf821b958416f19a1f813969fa57c2e8744714cb7c59a6005e74524adc23052c8198bb0832f2ab8806bbbe3d58b546861ad6edb46b91eb6b6c577d4b505e92d0b3a1c7772d2895232689c9beecaf352302daa63cbce7166708d2221f8f79bed8fda2272a9c40193228f24336dfcdf887d75b27ac94e38dbcdaeb290cc0fcf00a06a5c369a8c29e7fb3ff12eb5897f57a3f62584c1e0eb93289ac7a5b0c6f923077b1837c79378cd070b61f26809695c4e2f521637fef0291be1dfd549a5b0b10f7cf4faa36274aee0721522e7e51402c6a1f6a3be20fd1a020459b3e9348c3732f060f3d081842a11f48934d7b505f7c7ce51b1a6df48c28582c3a631ebc2220c65eab7b1694dbb06031cbc99f1c587ac3511c4948289df10ddac309644190e165df0bad89227de574e6e0eb113c95efe46a55109c336ac3e8581f798c5e757cb492171a884b9006006fbcfbfa387ca28a38aeb6919b5d6691ad34fbbf9c39ba5a7eb80c3c957cdcafd245418199775d5bc410854eeadca1afe1ecd62581446300abd4c9cc8aaa2f26196504cfe6ede6ff1561c3fca7513eeafd2e54e597fe3f4d22549a61b280c7104c038e0ba746061f338bb9c25b2303ec07e1bb2866d015eaea21c72394676b137107255e65e985632774afc98dbab95a0aef54157520af7e0b219839b8c8e5d7925812f0a6402b72f806ec38c57e28df0b3f67d54c57d3b28e3e55cca609fb05b6e09de8f5b2c0f5ae27ba388cd7172114b93c8f73de4a2e7a5f4503e7947645e6860d6fd7a70b9352c15ff1682d4fc82c451a6c731bdc99d76cb10702cf1d3e2932acacd687d5f5ebbb248ae4e8997d5ccb4b94d278509cae4ce1ff7f24ba9987ccc0c879bbe6c281fd512c8570bbe8ab33152e1b5c70de06e91d14e7fa13fd083d92ea48a906a31d6f2efed52d7db02165c162d32f0208e72aad6ec0b8f213b56b6a3bccbafd40c5f903295b88a97dc64a965a8458cfc159f7d83495c81d83953f90e38c569240848317d49fe705f9a3c8de3bb5419fb26538e88feb915cf4b0a14b0911e68f4c5ff5b3282ab35bcabfc8df30ef513a8212d523a64c7b790f0f7ae4d5e1d0ba0b60371f4d835571982233e35eb9f067da69b7d2a23fee3a7bb9b0a370867edb268e31a36a32330f0cd5ef30f09b86f06270c43caa4d5269e0b62dd0028856bc44f1cc87a7c0b7ffcddfe60e0c1d7b9bc131e5abe7fc0fcce80fd7b3b26dc2240e92ee122db448088448fec7dbc83831a0b4036580d78d2c39cb9894a9bf29da2b78808d24964df1d91921a284232379a6ff04b39e6335507bf257ba0f05f3a744ab6b40b4ef3083735936e62fb7a53d7c1cd2dd692a6d02578dfc6e0bc887530134957303455886fb1025dc060a2743c913532b08b39e0874a36ef8c58f4fa6091ae86e3c232dc21846d6cc2ea60f5436ea71e5a486312b7c3c97a066e2b26805654b78850e17fe730430fdd213c6386bab1252642c8c3314605eae164918609c1ea5db06907e04b4511db918d7b5b70f5e20bb712c19e8e618ab69fc4de957774ce0dde930ca9a82368546287c4399ca098268f20e3f129a6b661a41758e153ef7e3c75377638985ba4eed2b8ad7a546b620a1105b6578d86278090c4a6d62982796e16eebb29866e561f64987dba4286ce2aef39af5e34704c77e8653ef062de5e17262161d91cdbfa6a9a9fdb65f1b34b0d6c253561b8f593cc1d7187cc8a638acc457800d3a6151054e7473d09bc5157263a60ef0e85969bf1926217d71ab29df1d74afeb5dcba2672cd1729123ce17109bc6542b124d3d39d09bf758c9e3bf62c6e12d1dc0b3bab28ce98161bedf4272c74bac6f6012dc902c60217798f7021d07c7820d2cbfa2d0b6e428a833a09f812e5c9f249b514eae769a2740a68efaf9274e3421689a61a7f2e9efce4bb835231a22b4b28bb19c79f574921dbb51b0dc709dcdc33eeaff2188205f3bced00c41d1c47381f8dbcddbf314e8759ee82bb028ddd55a74588525bfb2ff57848f2dc49c6b64f9aa76e9bbb6a2b4b018fa735b9835d24ed38bfa9ae1c7578b349e9f92c33f1083682bf90087477b35f12f91c708ce4e06232c666a3486f03da8a46a958e67fe85fca20394ae2ac76ef1318cdabfcfd0ec2ce2d27c011851d7a64a97b3450cb6692c82125e73751fc2dfa56c7e0761e167b55645b88fa502bff7382dd62f55c195c1732b461e4d0c9985363a9a26ac08df882fc70628548c5f631534e5956ba673831f5834f6dc155ca98afd1565d7cdbc6b16604e124d761db189b5c8bf75ed69392ba010444ac2711449bdd90c0bb86727b3197896b94863ab3eb667f59c1fe1ad420cc250bf9b418e1c82cd636f524684adf96cfcc08b9817d942aa7f08c342a50aa23362622934dfab55d9b22c22c249ad08138c89c623be055e79a4e061f4ea2b6c49c25bf3b3ce9d3de54069b044405a4f538e3d816e686814bcae4d815f444e72edb8d38124249a43d9564f85322f5dd515490345e0dcaa6b5be376aceb7a1bbb088bf25cf0a94c6e9d3c0628f5df5da342060498e1e4746c3e8c84690056394f8084df0b802558c61a3ab521f61803bfc00d6705d9466e1d4df09e41069e51363febc3163b606953369884f99ca1f73379a6551130cb3f887159edbb651b0a782b08c5068821251eda9d9c374e44e0075319f6464f3b8fb5900d985f85950d1e2e220e62d132342eef92256376c7664138ad712b9c5e08aa9355c8b5ced401302f82c5b27d593f8b5bbf46067bf332eb0fabef4880fc50716379a546a99f8fb41571137ff45fee3e086c28a7c590ec0cc05b972664dc0f12e6c156997cbf5fb4ca35204f9d0ce84edce1f3cebc663cad3205924caec7ee9306750436b0fd1837351613ade227d6c3c165ce03c83cc8d54ff10742c88594feaadcd6a6ae1f62463e5e141e2a7a5fa69e42e1cf51dc3b8cfe671f9118deab5aba3ff570ddede7e8cd534d2cdecb2cfe5abe55b9bf0c3bda27ae02c0089ad8b01de6881ca4314c25ca3fe35e64e3e4d3df22524a7a9570c8b20fd757fe80c507bd19b8336db13c051d68013c258a302d14b6ff08ea3f845d88d2c6df64591a678120ad3c9f365d91af17cd4f8987b815e1c1857d77d11ca28f3ff9dfa1ed7ed951428ebfa18857d066936f1ef9a423922e8d0c318a15e39db09d95df1d049a6315c98344dd6fd3cb2b261032dba71aade360bbab89d17e58d436c56740661610b5fbb654bab37988e716d8119859446de983ba73dece98dbe150af0072da99e51a214c76a01bf01180acee4599824ada263e3211efd4d72cc1347b311b2acbec2a827033f771e16ee0307b5645ead3fc83d84b0d26abe3555a2a5283a31c562cce684812287bf3a5edeaa6ca035888dce89b2cf0ea1a655e96795c7d7279dfadef19fc9b9902cfc09121982b3d9610813ecdfe42a2ea054d5b6bc0a7f008117873deb556b3cd1cc6b21f78005a6a15f36bb7e889b8e36a2c9346a7898693919444ff9bccdea683c03a2a6fd2c29d3c3b59a1134f93cd3d02255338ac9ae00a0948c4d5848353acb5108ba528dcf72f60eed2a61b9b7025d8f9da9c9796b922e069758c06089d3ead1c8a418a123f966a1494ca763894cbb5f723fad2e0e481208d59e7dbd74ce2b1466e6c80cb3f1862b22da7e7d200d6a107757be6e229d0d19eb90f8a56283fc776814d9370bd5e4fb0e664f6d17defa5111a475a0252b7fb83dd2b9beff8fefa94090d4a67821039f5072a2b9dd3bec7fd5885b6aa25dda7240d64970986c64f884fd32e1956d5286bd8200f9ecaea11b3785d83416cebdd6991e2050b9840d03a9bc8c6ee005525f9a16f293d291c8b1bc1f8472fed88a33ab0cc6d5ff713849335139a4f4a393787a93e01e0bafb3c1e7d7e8ddb715d037fb44a576c6be8737964de32a2fa2967fe39b620f143302ca2f217daafbf120420e3864c9abc67a6d5714e1750d9ccbc4499ff0dd68d6263906ae9b812a14eae0586a5d351b1372490a48dd0c2afcb3e42114050f9603aead12b1fae6cddb90a17e4d275f91301f59045c3e55f44cdf5e0e9a172c08460c84b7ddf45263cfc1f3c4733b9faaa6c22bf9c17de8e5f7bea07684bfa95c07b05e8aa5103a686bff65df5f027bd3e21b204f1b244b9ca7d249dd76670dfdd33aa8ff99f735583a99563373247a897c7ad468bbc9f474b7aab8b7e195d05a432bd28b1ee1a9bfa6306345521a2247c071c6fb35c75a0ab1b88baa58d4871da1d499a1b6982e1b59551ba97e4bf9ab7890666b1ba502cb107c21194eab98a4a9f53cf7f35328d7ae67cdb45a426700ef47313cdffb75227e66177925738b8bb5ee5ae257db20912fe9181a68860104af16b5e4f53337dd3626ed6e9fc4e63f402061f54678bbb4586979303b9f4e03327f72f7edd4b127f21ef15df0282f3be34bf0a551b440dda2697f9a45e6a4a903f1e6ea3c6877af1cbef1cbd915dd0e19c175771c265669b85989bd1a04bb42be0e90306356f1df20973d3cbd0666325e116efed84762d4e4ca261d2a71e88cab35ed6ef538c634983852250e8251252abc4b8148800ccbc22bd33ee9a6b2d365f88d0a64865b5c0e02cf1960122462fa42a9b2df78baaadb0f2f96fa1bb0b378d6cd7723b82791dc87128e341e66885724f807ff89d2fe99e489b9be6948a94e514d49d546c1929e55aaf80d3f8de1cbd3b5053b4c0c33793c801bb8e8112170e87b06dbdaafbacdcf26eb5dde012bc2ef7f1f1537bce6037791316c4070b86b1cd512b9bc4896e583e4dc988276a2d6c8a4da1fc56b82d3363baf6aeb0ddaa75efa11e19432936ff483506fb54503620fc4babd7dae9632f8edca17403f04b03f487905cae45cd79170cb25fef2ba1f256d2560d8ecacdd20362603f88ad3102e4eac78f8d44fc6fb3bc16db806334899fccecc6fbc132c5c9357b37c87a231bc7b40cd8698e8989252b7a989060b88edf20b329a73759b0e83b3a834ac0eaf6a6cca75fc88b3c6e744325bda689f4a81eb6f45f1c950b39695ee54c96e84e3a881ae04d35a3dfc7a8ea61734b48b2806576f68fe241100b5385c3b9355817907686ffca353e383bca0a74e20604b8bebb4803e27fa530ccae981df3ae7a0d9f77f84bfd52c41173e08aa7315f26cf09291461807d273325827e3b2189b5f81093580d0f139d3016f5524289de14bf09b6c259906431e0bdd821656c4f709f8ad28e8e2800315dcd0e4a8d110c3750676a3a333bba2a003db768e3fc8715cbb63d82136ea2e86240355ad0f270f74acb4d6437a8097a5b4c283bfcf8b90b443bdb1de70c802b0616716a525393bd74dc6828ad00d888b9933282fa886ebad2c3b5455128236010f8cb625c5dfbef9743c26fdc6ab0bee2b9dd2523d62c8a3df3d1e398eb11f1498d492a363732f77ba8631f0d0f18839d67310dc0077ee34c7539e0057cd444797ef6aa280bc03be8b154228816983fb44537201846e92dc9f1f522e003f4c36872d7cb7afe2b25a6099c5e95a8b85bedfaf64775b9f7d07a0e0b9371aaf7d4dd12f673733afd1b7c5643bd7ced013d112f766b1d882f342775851aff9767e1a1065a8b5ce7bd8734415226840cfa4ee88bc07259dc19c19ace6a9ed4f2cb517df50bfc7d2cf4d09471d080f62e2cf639b7db4671dd3ee09ac0c30936e4ac8c368712ac1e32295e658fc5b51a7a1d9ece5acfcdadb225f7eef397426e9591fa976576858721e4996e423aac381957ac6d1da5f1558457705f10ee31c32c020367373f6e0020aee97933354d9832628adfa86498b07a5ab1b5bfd1be7fd1870f6da4754ed0570db64c09c18082eec49eeba214ac07bdb824b8a746d1e8aea9867255210f MD = 6a5fc2f4a741f17a2e62b198d65e4a5ff6a1e748 Len = 44864 Msg = bba0967875c4743a54f5b6375352cab3f662f2792e6047cd7dd6fda15a6ee80cd7043ff781ffa11a88e25527201ed644262b8fbf07d6e3fddedd70b4dcb9955aedbb31de985aae9527cc3f7709d3658b74dab8a04f40e43e4ef4f2dc5f42c95345ecf493827da5957bdafa91d71a80702897f684cd45537717430a81aab08cde26c00e80070f8d01ca3510db529a2edb898ccfd34a8e37907ff3400b86ace6e3da5f090befb96fc05d0409bf41fc77b4e0decdf58ec39870cf2c1ce3bbdee04ba7f06d9e012252bc7c706ba36de763e375b87853618b7e014e15276f11ed81fcd69bc0a006f23edc6fa1c0f19f04fb51904057538b8ef22a46d7e8185082d2dfae8a8c79c7d33c087dbe8f109dfb46e4799ef25ed375fbd3fd99e7463f44d9dc79e25890096b5228efef61682f734c8577fbd1dd02e8a2e4bc84ad62a7dca0dc7dcead4f97628b250d5ebd611f14161dd47f7d36e08eee46cbc0c1d250f12fc50474121d3861ece51f302b633487ab92d6517dd33510e7df7274ab00022c8c8154fc0f62b3107f516d9033d6357414cec69a591ac9159598f9c9f4528535c1f6b58f2c87d1164b513fa45e22eb8257b7ec819a756446015aa7e62332a0b3d60e7155f2f25a1c58cedc9433af1e5a7e378f2fc74bcd4b320bc6f3c0071d4ed1afcf75e80c16c9afae8d893be695a49035f8cb6803cdcb30949c1a5439c2afbcc31617973dccc657db9aabfc2d1a079698707e05072c6f04de72816630587e9e318f6585ee46ba583b4b2100ed732b974a3d7027beb2deb5d08f507e53a66280e182843c854a4ebbb8e714cf8f69b99b32a7c8559026c04b513db0240c760469bb369f446ca12a8739b8abef79c459ab38f8af18e552bfcf4bc2c9e1c38e0c61a7f5dc230913f5c4a5040fea154cb2cd44764cf725fc8148a567c23cdeb721718d056363c667577ae6146748cac96d0b3e6bc87ab8edaebe4774c3bec6b9eb9f55af5d8b0a67fab2e330dc8fff02316d0e1d4a2907edef391931f6ede35c14f5e73bf2243cd9837484a096491ec0a7fa9dd5fb8d78c4ecc202e581549d68417b2bf149b5c6869dc6b1abbcfd8ecb77bad1da022d74394c60edda8c785da41c380a198bc60f36eeb2529a7634b7eb48b5937688916415b71cbf5640e389d94d346afadfe07fb01e3f4fb5ee7501e8c2f4ccefb542ae20d7fd61a2c41c8bcf7c7735dd6e8a7ebed67590444948d4898e7e628eb0c7bc22510bbb0641abc94e500a510a604c7426be5dfe8fb2359897545b3f9ba2a8f4e3d04eb5c9df19ad1e71f4a8c9dcaec9b17dfe7fde4fc5b5dbbb94495eb26ec02afacf3835c5ec9d06883d20620a39e527bc61fc78487f931a6c306a1e09a087c177952a901caf03d03deea31c13743150228c5ea6c6ec9a1f0f378925cec6b06ef0a875230be74642370d18411fe713f458898bb0f19233b14bb28db92a69a5fa0d11ff36bb1ece251fa56617551bf4da05606ddef0fbc497c8a860234510cd2d75d7b21154db03409cbb77e7de973dcbd217eb77ecafb79a2f21e9ab464390ced10274fbfda74d5d575932f8e2e3548f66b8ecc50c34728228251098568a56a7c89b2f3ede091442f7867f948888a3ee6b4a5a0e79145f175abdbd349c6e877e03a8ca202089c0b8254b4601f80d90b086d61c9b5ad7e4206ef0d8c541768b1c29342deaebafb98789af6f885bfa859c61631ab4d8036b670bc749946c2bcb49e34440e366046777cabae371d9d8e97ba4f93ca11b225bb2da48f8e94613adccd9e2eb55ba0f335091748804992e2415f7a06aa94abb1cca837dce0cf7b89a6fb21516860e5883d985e64789c4849e3200618c158d571677ad6eb144a6a2fbf817e6a9bf8b68c0db4f1709478163be9a6a438a2d0e7db18000228ada7b573630af5b8c4859c6531f960fb487f951ee14db4f4c39f2b555af26a142169f61b5df237fa7699ffaa26a03d7319153d8966afb8cba8164886acac4f3bf403a48decd1a57e26a868d17873e7669adb8801c627402bd4d8a7c589a8521eba073921bc13ded26923506193ceef4432350d0e9c5ebb93be48c1b87e70e31ad7e73c9d3853448592bd4ed0f53bb5aa63a4250655a0bba1d8f93ed5f790a2eec2162746ddfa670657b8dcb63924faf7c3bb788f8eb790c4c96c77949171f1d92d2671c53983b6e30cb86277cc24ffbac6ed6010b3ee0b7af414f47ab8bf50886d9aa48ec789c49a462e789c2ab66461e1bc842041de6c42dd753dfee9b35f6b07e5480a0467109a88ad9799d143a99ba8ab4d34d4e333ab0a2fdca7b1087f0f8098d4dd7cc61b72389848075c673fb6803c33d4c9970211fe8738fb9b192fd46c17c35f9d01559ffa80f25b28aba7510cd1d076bc8458161f2ddb60f48ff2582ef4ac26e1b35fa232fa2f1bc26b70e9a31e9b911a15963600864c7e79b757094db1e7c9f75689f7766676bfc6211ceee7750dca5ee55ce0372304ba8749de764cd21eaf2a55652e394831bd80870bdf4e779f79175e0cb327768cab9991f91db0d7b94d075a81a4f032189b9de7ee495c88c923cffa361d56034ca84d2a277dfe25302a2ab0600a3f9673e08aee04ab764b3350e534698d575bdd570e9ce9f5996d1bdce10170ac7bf7dc12b3e41f7430114696f3b707818fe2b72e5a44d13326f1f4cbe6c8442a39d8c9a8c5647f422e8d7b5c77dc90a8743a62a4bcdc4db50b66237d887f4b020dabc5291c09a483a6125a27ee2fa550a8c55830b2adefd9db2c5078628105b24c03470a443e3fb75b326b7fc32ab618a2060078b84418300ad6d432f19804b98951d7c2ca6ca16ba28017caa358337ed48f03e34a2957460ed85733a20eb8865a29efe91b2f6a0f006df79eeb22bde1d4c2daf6e4e83d9a7bb331f1106fa1b712fe07f3a2f10a10196e73731734b5e00743ee2a24eb2b9bc5f9fd01b92540ba6840b8791e5bf22d420423ddc3e8ac080074b5f366bcc1c8721f30dc08ea160ebe8469cfd9bac2951ec171355dc900b844f7eaf946d760bf049545f68c08b2227a5b948e61b7fc160418f4206150647f392fd59221c5a8cdf1eec4d7bf2b85a44018d12b42bdfefe969d25155b0947db719f0e54a4020aa3ce9e35f61ead0102945ea82d09474bdd4aa07c8ac77e1b4b72c80db73a0706aeff2611d83717c4abeb8f721a01de732094d5630723096f4db13d4c40405f0d6e0818d10474e6412eba4dd768d90e0567199e80f0fa45a450b15162867374bf5f8de8fbf164b2f6f984fc30a00b40632f2d8e5f0eb9bd6b02f7b6b8d03fe27cf1d5190b2592e856aad02d2635f5002cd755075586eddb23c2f8efd7d40222d6d3821b87276c010091205320b132d7b30e34bbed1003195f2f393f47f866a04d632972e86d7c97556b0a00a8a85131a61220febe2096027d864d5781c3d9f5412f1fb1b76e2115f596d1b82661cc9876a1ce42214f13311f9689bafdacd89c72a5f95a6cb015f741932bdc4293f196952b7148bed206ffb5ae82cc4449ff0032563acf80c9b7c5c9ee8d0f55a58c96922dde650f7fedf8c05cdd1dddf199cb00be48938c11731c0f0759a4082cea22ee175a196baf44a6d01fdd22335a45577e5cc758f73df444818c364cb28096c6197678e88bd687746566277bdcda9e200ba02b625a95a7d9b1db875bed471efa94d9bf54b88c32fbe0de308d32f8e0cf2926e9421ebf0a662073e17420f6ef2af0af81e0aa36e3a7d2c67cc8fe4bd9bf575f859abc1098544de3c907f5f683f1ad66850eb97cf602cbed80c17739c57b36c884bedb40de4eaab99299c4fc79c93b9d3d416ea506973c81d1093649507d17e06b40c4b6489fb763f2ac164f3d2c2bc1ff3b427581cf9541e202c400e75fab45ada330f773c204515db182854a94ee635f2edd34e426769c384098d7167d4146c068886acc701220383c62252e8e040fd1ce8789ca36410f48354d625a607a9247f333a6cf14514f16cf6da56591fd05fb8ce9da9079950996632a092fa3c786b8f5db320819524c7dcced9c6c2b4a0440dc6cbdd36ad319a76cd75202a1b8b277c2e772e4098586d1c76a60cec46b89264f989a0f749bbdff84ddc37004be9428fcd1000f6f7bacc7417c98e9f7e1e33058f5f5a1415f75037da5e3f42759aa2106306fc6a5952ca2bd9cbb6a204dc0d38afd57353b8ecd67a9a82a0b940a7314717df8c666726508be333ebbf7ffa0a458174537ddba25708b8d0c22d5517d57b122517b0c94147da5e8994bc977e11732ec3635a2522bc2a5ad00e665bf278f67b5f051126a8956171561b62f572090cde4b09b13f73ee28a90bea2bfb4001fe7b16bd51266524684520e77941dddc56b892ae4bd09dd44acc08bf45dd0a58dc3ad1a938727eda37017260c922c8719ae522bbf181a955d8eb4ff67da85865d8df18308eb2fea115ced1ee19413ab01f8d839669fa9e5b193069f599043010399373ba1a8dea604cd4c7f933463b812fd63ba97be284cd56c1dd26619b9c41497d6bafa5ac4cff223adbe9ddd8d3cc10ebd45bf1e26492d7c633f09f12a3e04ec68778f7b72b65e0299626e09f0b790bf2d61392a14594e468f4ba19144dd59195507bd855907ccdc87e180445ea706814c73b25c82fbac5cea7ee9847a3085a134d21102e822b33401d28106f799a6f78313a73fe2aecc122d4f3e453ac61f16706d266eb095a58b8fbbccec7bfdd68479b7844ec3f1221890331c5e171c99dbb03f7a4342df185599e3e04f5c4229aa88e5d5f3975152e2dbd100399f826a734cdf690b0f7d9024b90147ba190524ec491518e8ed5db2d3689f865224b6257fceb39f3086ef817b559a8fb722c53ccc22cbc9793654d69ccf051b5257263f53be52694e49b370cbf7f604c109f0f5ccbe70643ef2f5329157983b9497313c91844273dea847e28938ca63524f16c46074b975a4b3bd6b43cacf63a3758581bbc8ea3b4c533b6b55608e17f562a54d19ddfd7a44e8fbc53671112ff96291c324f4e02c21bb0c5f9337978f24d53ae46b62b2fe9a135ef4ebf3140d20fec4657f809ab2f9501953d5069d556b27462ed79b805f0eb3555ed6b93e6794aabbed2df4908c3da300dc8d55f5f732c93570e0f0dc282d595d87893bf6ebdee6d6ceb2d958046934514e4ebe47e1164ba77f19fb3cf67075f5f36613e3e66a33b38ea0a767b7f674694d7ba7f9af701f0a9de52309267289bd170fb97c03c131c0a169d736137ff3d74ea69b81beeac3ed51c500e7549e04f186e89525a07e418cab80f149b3602319c6520176abe0daae3f4c0d4dfd7d9851b7834f8768ebe37601887e18f44192bf3900925ed2fcb3fbcaeca0b38d7b844c2d623107b9a4a82b47e2e63a629ec3263b249690d088f024692983ae7122895f5cf8022d1f32f00ae322c2148ac224ed4150b6b321300fd6ae74fe95650cf7e9cac70b6e06116b9377ba8a3de9763872cff75b4c516c73711f71aa1ec59550a9fb61d550faca7b635a3ca72ceb059e654b9afcb2cda8bb821081fe811f4633ee632af86c89b89fe92f0bc1582c0aa72348be238d127f589846386492deba1245a6b4ed273f7659934aba314608efe34b4bc36841ac5adb120507849a804b6c3e1a820c07688e290051baaf8d2e4fe32bd96d236717b5a38df161d72eb084b23643050d83a16a9eaeb8af6483f885176355fdfd63d12a427a7ff9c4b5cbe074dcc4c04a2276961afd03eb28c0f43a008066084ede653358562511d5c64f09348ff4465a7a648b3e89b80044da9dd93ee16e1ea02d403b25af755ca2e6c64961ce7609a6e1d7d479c34981411771ed1324f2a389d6eedc6ae4e53c948dae3b9d26be8cb7ff5cec4d383ce0b63e0ce03dc978297461ed8178a4f9342321735a471722322639704d3956f6a11c84cb4d0f2d8332f864c8b4df5e25c5e758c22fe01e65ac4a169e71bebe2b34dca2399e17ef98327e45ecf11f8eff84498a0726f8baed5dcc1d53e45dcc4f2e8f0ce45dd87e2bba8e9bd6c0b9a5ead1e23baeca115b2dc904c42d3f871fb700ac2b3806d167b22d91bd12ae2e317c4119f445a39aadab708c9186cddb17072d9c93b123932ac02e30502d13edb02844793a582e24f0ead6dc0bed29ba40b43808ccec2e8e35da1ed2cb928c98b0837e887452c420e3607e7b99ecddb52b52a2594d55923317649201a5cf828fa0f231b038c2201ee3a0e9d3d1f2445c4546ef167b6a09125df40a4565509063000920990e22bc8f80207b8d3a9a18001d1580b8fdb5cdbc680cea0680a230936c4cadab5af0e3f32763d5f04a40a351115309b94aa58a81d413d3cd9e50ed9134114b5fb5b940da67ff7bb5778280bfd073ecbfc8d5ba1300bd3a22f4c911fcf61b7c2e94e85da5c037cf4548ec3abcc8ec9c151eb2c6e09c4daf7f5a97683730bfd2b07f0a9505aeb1531834ca3bc86941ba51a2c94b6b0569866b06383ac06272c15ddaac715aa200a9a6d1b8fe734007aa0e0b75b212ba75614eae28143909c8daaf4e2a9d15489a359996450d4dcba2fda2af6495984a15b2c2a8e37ef1a546812d301152d5e0d28938f8dae2a89a9817a80502503c32bf1d4f9cf6f59aa3605750270d4d0d296e073d800719240b7baa86a2db9caee2c5e34de0def294b2aabfa0a96ae64b70b141efb2361b30bcb218e71f5cb530f8eeb7661b080060218a3c972da6a8e16530cbf80604636f1cdfd511c1124492d38e0bf0a20ea98d9e8360bc2a6d2f8f658107cf01ee7c2fba6971cf4e78c525112853a62c5f588d782a9e88361ac4a5f01687dd2c40d002f3c371580e0cb168204210cf008697e04cf47873c72c12b5a365bebaebc8097977824644864a83fc8f6fe603c4f0d2169b557117543d944eddf32ee0d6d08303b42a832d4dcec722bd0625ccf03aa1a0d1d20adb63bbc3d23e536ad753f6d73218309a7adae5f59b47a9628308d0810f9f0eb8488c231bd012eac51719a7607532190ea5a44c99c6adce2ede753efac331400be7240016c91a3df0186e6ed95d90685246305f2e356df8dd37dbf2796c573a782fd1df4f4da2c16e63e8b98c4b918307c5158a2d57e69e10179387775b6f428f8afc2d2fae4b2982820f13f3dfd41d81baaa7a01aec6324a06325a9f20f7eca4913956329b81baeeeb481aca8ad68c728f959b55ba8b69fd7c4f083b4d7fbd79daeff6f265d51a06083a1a6accf7543ccc3d6a940b8489acf2300ce641652951b0a69bd9cdb3ab6a814baf4f16d4f952f9285447026035daf08bd51a9d56b4decae3916313bc038ebef355f208ee00578edd04d94face2fa0fb8fd62c1b2e463722d9428d84ca6d549d78afe13b0fdad05d1e8e533a905aca85de2394f083ca25efaf0959be3f9e08a5edacdb7bc45e5e69d8cd56f03324542d12028a5c521fde9c25333df10913328ffb1db756e7d74b9964d344239ed6677c9338b668838e89b1a187e0260f14f8e409cc1cd4618ebe752b68c6dcb9b72af9ca90bf1bfe5f4fb68dceeb6539e9822b817fb3fe18cbe086955384226c11c62c1dd14e7eabda573450d005b46fd9f9eccaff24dbf5d6d8530b5e25fd9f2a629df5c20a977247cab35255d71d992d85b04c141673e0f6cf64f34f52753a4c27d5bb2d9c703cedcfb9fb2509a79f2e4dfd6f8531cfc274ed42b6efb29325bd3d5bd5d8ab11ef158fd0b307425a69217a5e9b1c1ef681985974bd06ee5e49c5cbb7ad8be0807507317fe2c52a3fe0513358389f85f007aa3c826f5caddf8caef972a910e3c7b40bde4ff0256a5dea05a175aed70dc63af2bdf533b8981cd7bef113332e5bee9669bec645f0aabd7084ec3c658c5f7f04b8055473e4561f133fd822b2acf0fb0268f86e49ed91655b MD = 280ebf4f434e4134fce0d3f7581c2434bab1efbb Len = 45656 Msg = 52a76855b415a357d6747842140141dca75e257d1c3731cf0426aad2eed4a2239262ca7d4f078780d8fa48b12a9216c3c1ab6d150b4d4a7b1d888541a5a2616d1f7562454c125e11e0aad7227baf8813db363e4f50a0e9d37079f3360ba0d0e662a8d7b4937f5093584dce9cf19fbf565fc54135d378376066c19cb70a161815c1c5d1d20d96848da7abd42873ace213b4211dce7d1f5ca968272acf894b6082a592faa8a09e2387358c92cdea1c19d342127b2234dc7f37dc7442837188d1b677d9f73d35e154096ab8af933c388e1d7160033ae1f6c8902b708edda81593389d60739ab5a5409caef6d48252486679a9d25c1d6db6603ebee3b6e4173acd9081f014c506330ec76910a9a31494cc6f52312fd3be646fc9fc9562a0a63fa847895082c812d3e71303ccd5fd6a63e688d4452365be481cb74c4e391a3e6b4be41f4a66abbfccf307e4f301983dffdc4b97d6e1da53a9909218d5e359c507deefaaa46874f768592b744dd47d73aed74104ac103a67d1f3e1c7f30965255b8bf192272f2da1ed42071ca1f7b3f6b9fff0818e598ee1066c2dc170534744af78713e9b64dda5a4d52442b91142ac687be2774664dda99123fd6d1468060c4bcdf718c8ae8debd53b09505bcb337f02749f4f9ad82fa7ba41d935a6f1aa6376b30b8775b6445ac89b3eac50cd8d56d111ad6f535e8cc3c8ee4980f0953c337a5236f36c240adcc41e4cc05fbe58181b7b9641399dfde50551d6b7b8fdc3639dd1ffc4739fe75813ecbaf252479daf29d9e22b133e89f5b7930740c7d047db2858ef6353cfe4b7fb2c10acf00f630243541797abe839db27db6584e5b7d18363118c36d45d08dfc507d75500bfb2f9b014bfecc744147f9d5277ebd95a6743952261a6bdf15cb9b8a496544bfe927cba40619230f922c96020c5de6d60140307b3f31cd832e62d1e2cd51399750c73a70086f1aeb06ba2ba6cd7c36772ddab02edccfeebc9b0243dc61cf9b1cb27c6c07eb5710811f8f0f15e36039037cc23ccf773b5bf5dc2845f9bf46e5da9ec5e4ddf767a08c3d09d4e206907b058e853adfa70aa1c972237cad2e4da63b76121964e5174746ffb8f19d7f8368f7c3923ef1e4c44c91fda23c69475a68c9c90f8e2f1cfc715bc82b09aae6cf7f44cc87cd98a8eea909cf2329d092d38a00181cb7bf077dbb3536ce619cb4bb4a96f9c44b267be0637b7704b955897f9678d3b83a774d21816dbc11bdd5620d4748ebd65c3dc64ff87175e55f8aa3851a9e9c606afa566e705fd89362f7870bf1e5134c55412093d4864c33a0c269aa92dbc2a3edbaabeae4961cd1f5758c5dc6f5f084eac3134284248a8e11af54467bcaf6f1272ac5fd6aaae95be9d20a6952e6141e615606e283c691432693ebef51e6a9e69bed2d3c8f08de7fb48f59c5125fee877d5c73ea5006f0f15432a91b91b94bf2d0545a1ebe3a5cdbea2012e791adf04e8358f2c075403a272eee1441d7ad5d845902c51a64b9f4eeff16ce473d6ac9d217de0c0b601cdd331b38a5f8705d7f399a7b06b63ef2272767e5e46a8210cbc0af5e1831acf74ac3ada4d6a61823f171191f9788998d7423b91fedd80c2a7678be5bbfc9b85a13575ab53ee12bab84d95982e00800e65c526727430648326a98c9495b4a2edfb75cb6ec4730275e89c0d027789af1976042068e9c7ba2a3187f54b983195cd2b74226ac87f997b770c6118fd9d8081af050fbc852beb806f0bae52ecfddeeed83a64e8859c3f930ea57922e8c35a0dbad2ddb76fe3604d893c9ff1b8a0e318abd0773026515c8755703d686084a5873f73709ed07780592622b17024a00e124b3d458ad126581df37496318c66cab5e5eeb2bccf70b26befc6ca165a87c6a66289b43eafa49b1e91b96ac794f32f5f554d89589555604d8c2fd32c7fdc729a95bdae93e7528d51d648a370a1b33d4f3798dfb949aef1c5a465b5fabe287cb78edf1ad2a1b997806b282775db2d5c4c32d59b281404cd9cdf7156c83df24bc5f5fadf44075f1f71f761e01e69e9f51dee0ea5ed1edd5c9ae75aa0de24c2478c7113e72e3ece8fed23fcb4b2736f6e8b144ae5508ec4058661287a839c20d8d3ab3419db718e4dbc97008d7b2348315e4c9243998c3e3329f8e4cb01cd9566644b645d92c625c3a6fa7552bf9ffba45e3deda70f42d54b4c52957d9edea85905f8ac9b9a651d5773f464ebc70f1031529063f9fbd610b6b5174377a3f7e2197f5a12bb3c77fe73ea2fd43fdb9c0f3f04ecfc21a57077dc2df0f6a15842ca0e9a1aa1a6c0244e7ed550cd38426e81353afac107553993257b85b7e304e4e8a11de05e426e9397e0fa0257bd46acee7dbd62b9935358ebfa697d8d25f008c438d25353788ded600021eb7bb72d7edc7e55cbecaee6f608c1bd80814f65d4e73d7f1c87316759324814b3400c400dd5a0c9dd633e583b70e440389a49a970d816ede302534200941f9a03afa5c781604be341252cef4eadc9ba4ae0fb04051f2de44fcdc7670a0eed7a83ce6a0a0206e7699f3a61f45847daf3615b4ec0bb45e82c08ef761e9e281b7ddaa74350b64ddc249eabc4ae80c47db223142824b9d1b18cb77047afe46b0f6bb04219e3c8c093dce77f3c67efae1cc138127377284befcd04592161055e320cafa5d2095ee4725922beb365cc8c1ee6495d15022f3b09b796b1ee7d298aec277dda580ba143e262f67110f240e7ebeafefef80df72a69121680954b7775a686c2e99131b8644cc10b9f3b547346eb94fefc02dfa8a076a62bcefe1318a9c6ef27d867c2cbcf163c0a501bd38c3186aef25f1dc26923983b7ea4111d34aeb62b53b1c108040daa9c9b8c9ab9b43024fe813030fc623d3798b609b6b0f20adc02f07c864989a56ea8655c9f4c12cc2d4e547622d6bc75bb867c06d5167a47a23ba33fa0ce821fcc2a11c713d6cf8c09641239dd989f538dcd78a25695f5ec6fa01604f6df18042be846d6dc9d12f920086481488a3260133551e521768b82aaf7f1d270c372daf2acad90e3ea0499da04f2574bf49e23b686b0d71e016390bd09dbb2f6c4ba2c8b3ceefd1004ccf7a01f63c2ce1d0a25de873c81367da69e0f9e7daa7028157f5d60b0254c359498d82060cbb94e9fecf4019eea4f347b35087e7fc5c638ad5dd0e29b117dc38106ecd09079f4cf85025ebc7d1a526c0bdc10708808e13caa4d4c8958c88cf7bdc842f79cd468e8e3ef8680821a286e7d1b8f3d407da77c34d8391c8f5262197066445d2be4fbe1e139d21555f1b782fa7aedad512b013f7184ff64e7b8e571c16858c9e6b29601a96aac429da7e9efaa829288601ad7cf8cdc06290901ff46d957e8047445229160097bd00245a5ffb4bae79618531272ab65b7329d3597e2e0bb5bd77fa585d9319fa7882ed2d2f841aa529f1edd9871f7a978494a5d958bfd1a1907acdba92142b3982fc6565a2378db3c6a1dc05314972fb234b87fe08a58fe8a5fa5ee74b1bbcdb59075da24c882d40ec0bb052aa2b37fcebc90a662271aee16a612e6d0d0c5766872e164182f861d2e69a0b30465752232a97ad702a96b7325a39acca4c88834199cb2ff1e9fad3f062d75d2cba3039f48c31d1ca85a72141f1fe6a7d8df2b922ed791b01e621fc1fcd4e26b66a5857e77d2227c3c8058596ce29e7f535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695cff8db34727a01879acfc8106e7e92228b8140784bfedf0aecf4e5ff09f5def47c3b3e7afdbbe0fa00b63c3d9abe8455c3f1258baa98a0a909d85d15256a4d94787199dd5950cb5ff033dee2c2eeaa02a3af33c724c3c25aef953c178ff53cf653308fb42bb53af9d7dd02d88d7b7db999100dd3510cbe90eccfe57eb043078a8b0c6297db75ba8836266a67310169db12c81638a5dfe00bafccfbd32cb047d18e49b500eefec46b79845817741d18e7bf3bef6fa9b9e0fba730e18d5be9685bdb8d1987ecdce314309b5e71cd0ae57fecffebc0c3273c1141703935d43b039a014af2854b7c8122e9b0000e92676a043a68be0488a45bbd2d2f65351c41841c8e17c291817a49181386df366abf0105062ab88360bdca8fc8b2e8339a897443d0581c25354285543c743e91bc7e6502fe9a7dd5f1e002e982af4499e57f5eb086a061c8cd61d077c30cb0991e31e08e825c7064a2978f5b09690cd0639fadd30f6525e4b054a4e355b4d7c4f6562df81fc522b7f960da64bb94a38fcb66ec2bd93afb1184979d375301069ddb7787d0458927687cb87e9727a69b205361844b828633d7c0a703e44975ef9c43f288b7820cd0de932ae652cc13762ab21c109289db729feb0f836aa787d538b673cb1e63c4c182d3149c38176fa7175df31b915daf39e27a3d963b0bbb6a1ba967a96559357c0dc3222aa7982fb07ebd830fd87c65fc37d4bdb6e5d485108da33ace3cd0f352c7d9cffc31dcb824a9674867d874b43c18a11c6ffba0796b272a8983f5797308698d7a9b6743ad765fd1cfae01c50e6bfd65b61bdcde0cdc70a5c0753f9148ef3b54be82a86b7417ea93656ce4fbe91e6e7927551a0bc3d6e2ab7c0c7bd6c989d5d6083c85c2b09be202c60f1277b8c5e471fca623b812fd05b218d42ab8896ac177e4437fd7c784cec64e1eeac701f4e7e682899a419eb152402346cca50d0486c0df11f7194d4519448a070e68592de12d7579ee56ab9640ec27eee22ac8d97e375532ac15965f4a13e671ddea32c388dd31e18065ee1e5a0c93370bb8517c4041e32fef4b5755e9ab0fc9d9bb0368177c347b00ddcaac262801b999ec1b4f557705643128f4ab6070528992595f8e45611980d04cb5e20dc4dfd12d24aad5365d486a224ce2d2571a5b3b9853bba87b424dad8f215432a9799a3825f064a05b5b08cc2315c66d35ff865a4c289c4921864d4b8e0a1a1051acdd3924edfd233cf6d2e4d41203de759660603e4665d2e0b395056d557c2dced4f56eaa6bc8f073c7435e85d02fa89e7575d7df4bccf83140b1459d91fedd59989f4316f84c7a7832c683d8beae4e3923333bbf87260b8bb42ea6af4e16918a5e17410b121c33b2cfc91f4d5c0441ae1625064fb7059f5884698312f857fce99c1a02e757acbecc04e76b5436c62595d4c7c21029e02640480e65591f3771ffe903e34c27726e1c689e127dcd786c68c597f9a17e4a22ab6569e7f231499325ab617c9a1001e44c61498f2a8e7f889f8f22076412a827226318656ecce2c30389bf39619fdf93a485963bfaf85ffcb297d285e8958eb62dd7a6883f40a7a401da79a42325600edd5bf0c36fa9ae5b4a66460f9f556232262970aad43b1c98b9342d376f4f47b85f4ae59fe900cf06bf70d8df0900c72db3df2347de2a9623921d467da68bdb2292e8e14c079c56919a4e27aea5f6222b5f7f1b09ad8dc8d7150c51f15959aec020ac80323beab98e53549ee906c417ad717fe45ae2d30925ba67dc1d08473733810c2efd066a8c4f833acb08abe8fc16a2580ba5ee98fb820ad6415b23b318df2c8e59f6e79a336792672897f5d364095aadfd85415e048e8ede2e564c4ba8358bb99dda60083379194034117521c3f812d826738b90b8adaed60f78d27f89d9470476f2001320d6807c7a0fba42b055536d32fb1dbf7c61f354414d66ad222cb6f551e838797002506266ed35b49dc3a4d39f768858e44de4df804e7972f5c28412db277979a5af11a88724680600a58fb1c8905beb74b40bee28f67b5f991d06d35f3a63b2361f3c95575fd1957d8d6c7e4ab2f8f5a256d0e6c7dffcd170aee7bd7a9b57a1a5f549ef53fa031168edd3afa268efe60188cc8fd9556e6710fa8f47a9b4f5d679a3b1ed098d6cd857494dac4c1cb16af6dc671fca01508efe7265f85921aeaf35bd1d34e4847f78cd22432ab468edc306c4293d367e33b79dc91446256be2ba4e93d44d8169cb613efb4c7187b7e5acb5c29b5e9af6988f734112b78afe428638ea8f9d4cb7d1302146d23712a44976987a260a6434ef65138cd9d2f6534e819903a7bac2f9114418977cd1f19889bf033d61b72ea3b8e6f30ee21ef3f5573ac381a51c60a81c4b896f94d8b11f16f4aa9ec6eb56bd85739649b402006f0d106ce71038c24f42850831b2c1cd9271a5d310de1d78fcc59981bfd812a82ac0b0d9a661a6445934aef9707f1393bd3a4131261fd401ec09c729f3c6c767b3227abe3221db83406317e1be2244cfd9d1652960f4959e05b29b1367f896ab92930c7f3cd94efbaf4e5e657d74dbce82c770403404e889c46073b29ee616f033a2b48108e07719f066f0d930bf5f1c429cf10a21b92361c283efac0b37bee230d2218838dffa6abe3d6dd17a9a353593b265ebbc99fcc26aad7d442f35f4ddf491c1e94f304f6a533223d2ad7e04a6e0b85d69671fdb08374d9b3f9d996f6009622428ae89cc957a05b1416bd333ecd40f3607a3c324cfb2d4c7e2b8aa74f4e9e3b6caf93518787d08a4c218524973c8379e4b152c807557d381d21311ac290066f84491daa98fe6bb7cc94543bbd847c1e4a81da47485b0ea67723f478b59079c672a1ad2f64841ae87cb75501186dd2ea7a33fc3579d3859d7678fb4892149d491eff6c6954e1852744d1adfd10be2ee55c0ee21c01868d26016a6f12c0e51aff71aa82dfcedc537b0c2c87b80e413718d95cb183483ccc48003f785fa7cb99f151ec16193b3e2cedbc0e09b878bc968ad76394f3b6bcea0b5c403db5af8dc225a70b50a004cfba833cc05b87b8f8f2433f6db1f3b3d09077fbb5e79f40f53ca55c5059fb8f57a247748aa6ad34bdf44cfac0300ba73e6695c6e69da2c2c9b079560359b2469e8f414db312b056d244acefa43ac3facf136ca51a88489dd2c5a77f6c774e906b2778ad85c61a8501896b0563f7a4144b4004819bd01839d82439bed3dc56d48812f47e46eb7228106b9226448e355d7a946640af9c9affa37436fa7fb0527cbbf9bda63fa841a9c89428398e27fe3e24b899cc9f145755fa5ea71db91acbefcd84dc0fb8260e6ff1a935258aec881d1053a50bb362d6a4a68a930ec9424895865a589ff88c61e25355c2d480035a63070e93e732ab9f55709f02b5f75151d6ad2439404903c26ab53ed52db794fd79d1916a47661a3bce1d46fdfa8b6f6e1a0c8987d9f1b3ba6fe10c791879c8f7c53683321295d4317978268ac5ccc328c969324b5139c3d0599d68b37d0cc6d2b1fe8cf432080409bd48e8b4fe0376064b8dc68d92695c8d90b2fa8d44b9b715a4f055b78e07d04c015433808d78af910840ee5383c9a5787ce8690e56c8c34906d586830ed96081af65b0f85a73974f694952a70ca1c71986065d3e998111f53e75c7609ac8dd302e4306234e3c56cad47299901538e9f814d68026f62ccaa1b698be571a1a6fe2e6b6de094f1a138ab2816c1786d7349e901e77cd551015d6d506166f76183d1d3f86e0b34657f7156c3f724247c6d09260a7ed3c9f761b1a038675b1960a706ca17ab3281c3929f56874541b414de45cee398879baa604f8a8e2842363382f54745c0070b709d1b210e8b9aa5ab49885a09cf08e90e8f7f52ce0eacfc3e9a35f20f26e94010e19d2cb624af67b421594e097ce8208841c9bf8494fbd9f67f4140d05a69be19227df00acaf078d40831115f3ca5e09c19c7172e45df4e0f849fba35c4f8d3edb2361198c8fe576f60a84a6788b297de99fff037bba7c6ce5ca9d4bc11273023236de7dcb929920acd076fdeebaeb4b424cce13d40e5d2d76a1816bfa975414df88e09431612a71aa006f811dfead5b15cc650bb9029f0af2f3306dd085385c2a40eec685a4a05337c0f59acd007695a9474c51f03d4beaa3eb30b70b8527c25b86917b910203ad9d3892b0c5684ee148e40c4f416869b7cfae0bb3733e2a2eb9844f1b1b245c662292cd2bcedd3d2738cb2c6c762bff58bf6748c7cf5948888d5fb30eecb2b2680ff32e74b0074c4fc225340f552d MD = af75e59940783e84761dbe59727ed7908a8709b5 Len = 46448 Msg = 0287fa0e377c9dd608cf9853907b010bcae4c2160275a7dd8988b522ad86be41e84f32b558dc38dd6f23fd00ec3a4c900ac060abf779f6e78738a64f2a0272a91c70a0fbdb55c54ddea123af8485347e4bd887e442bacb9ec1772a0257aed84004b2ebe8a8306dacbc12af6840a4e15ff4f5e0c7cb814f899d0ce9421cd1158d09dcbb84a8b55784713e4c3108de7aba6fdf125f7b15a93084c18c1761b4541893b8bad8c12bac5c65eda014c47d2818235ec6b138c0021bdf5cbb890ea0bb6a0b0c8eebdcdc93bd00e753185cc71200783aa4c7ebc882d314a61da10bdb720ad7a1dfc5e20e352eaaf30e45b80561fad63a53a87d7650df8d675b6640ada280613f566fb90ab937cbdb79a4c17e3c8ea5287c5cd41295c7b0671ce19660735510ad9af04b184860cb653b3c5d7ccc454dcac6ecdae47814e76d0918f33b0c104bb554507e7f0a32125afc16754538a636e8da5f7533224d9943ca15418596397c1d2c983c89263408816638f222a93ac94c5fbd8f49bbfa2daf06e0668738590aaec9cf6c7cc5ef15a41facba5b47876cbdfe0e0f6c6aa30d7a657f4c891bf75d30d4fdf6a10ee9a289cf7ab738391788025f5bdde557d1a06c91fcd9d2669bdd6bf42ac1402aac15f91fa8cf01a87286e429abe1fcab0b4e4c2f5ef7ac42cdf227d25fb7a140c0d8bcb640ecfdbb1ecc2b050703f88eda7fe4eaae8d5dd716042b16a4bf0b79ab519a3e49f5759ba5c49f9a762b2327c59bfa67f3822e4cfd7b4067ffc1c8fdf7ea5b5cccd2b16f8fd507910041c39f540a575135c067ca0bbf2e6d7aa61ef32b0ac6bad06bf96062662d91ad2d211d0f35c34e7d2e5078c638bdd11c545683d018a5005da89596a8e1d74386d785ca7f820506d2b4317fb84eb43bedb4b7d76d7ebed67b71cc38e8adce4e922736ce2b5ae7233c3a5106696add52f6ae8b148aa3d9e233aee86fab32da5cda067e509b262f4ac3a8f93660f2febf3e2b1865b0efc0cf8c472f6278d8c212645aa378584ca62570e671372550e02acd11a8f065ca3a438f24ea3ad707501a3a0dee6fe936145c4add013040ea4b39ac4a81dd349c0ee6432d601e50274a1c6405a75dd64a41975973f1493a2a0797e2bceb55a2cd0562b04bdb376ca079bfe82c166aa8f2f47da69188ac9977dbea7751308039c5e75cde64a1acb2daa5acd06883bce695f7b638200f7ee83890db74ef978580ed7c7fd661fba6ab3e968b24a3357e189a10eb1806ceeaacd7ee11e080678cffab8b709f2b314ddd321303eac475d6c76b08c44c2d0d156fbbbd35c3ebe9bf3f68deda41a88bc8d21fe6bc2cb38bec7a6fa6e8de7b142ab84cc5ee26186544c78d3b63c5c25140126ed55ff158bfe9b90eb400d5da2a4f10f2cee510ef22431f806bb33260cadc2385a994429b58f50cb0f8b33a3199acfe159fc189586ae5d0ab3673906a3fc58fce29022664a037fcbd3caa1467a76b0a1d012b993b83516175634be7c7f822deaf1f52a59bddd8109d468c6b669db1bc72bccb4980b6b05a45bce240613d1c9692512bc72858ffd1b9de024815c3a99d7c9848a00f4b2a448507e1a21f56db41de893695f359d5c577ceb4b25c607834a45d4ba6d08ae6a69c0def16e98a8666fb8d1b16e428827640dd49b123bd490950d27b64acbb0d08f296b5a3a723468e51258152e40c2d6c7dd26a4d522342a5e9c081e18925c6f2ef6adb5141674240481b1052d94fff2d9476be8fd2d88b8fd8ef042651113aedfb500828a09fa3044836711dad371f43ef91ee7e89244d4f8427ad39eac791807e11e431aa129062b93d4cbb460db536f4eba1226051b06e543024243e8ff234e0751873480a32e303f948358e18eb8c0d4b80843fa6db73b2d110ef33b1859089444cf663cdb00e8e320e926ba2e7cfa17a32ab0f6af7e605d419a0b374741ce14627c3e1a4336cc2af46dac7f1d1861741609fb6e62b50b4ffe841a522e460514352e1acd7e383083a9716894ed23ad966b2691e62a038291b25d9f001ffe53f027558aaaee7dec699a94d990112724eb1cf102d257d26cbef78717e5aed32144c3731c571680265952587df52b8b6deec609ccd79eba2024587103674d6cf39e94073e3678d794ef6b3cc4289ec8ef1dd0c16e5a4123536e3fdbe0099e14514a13926eed97fcae884fa25adedd883ef4e7c855def1966cf928083c40f361b0f3cca53cd0f657d9a07a39905c7a11c410558f11da229be351ab8686a1ffed991819a016851681ace465531335f72e24dca47630c0569c4d1434f74db11610801395238a7e7b02aeb0ab9f41ffd715c7c67f1e11460020009d5eab0fd2d862fc92c990072186435591b77eab1e9c61236a2ff761cfa1bfa46973422b9bb96d650221862b12eadc17f41361bd26a9a8ce44519270d1cdd3bf152d2d4f802b885fee377654c6fb258c7449e9068ca1553ec16e6fecd0e704a70ce6fcea04b15c53b365d122b249c8198eb58505c4f5eeeb8de0f024518fbaf2dd3b1169aded41d6fe5726f379492c55aff0c6397429ee5ae643b3b5d82a6f38e2940b6cf031f1602b65f875609bdaa764961d200ebfcc1387213b2fe939b9dfd97c5b626021b365d72cc5f71c944ba528e00a47e91a108bdce3f6e0e94ff35e1e7e81c8622f208e6e16001711d507d579991e1fb7db445a541667776cdfd43a2df50f2d9accc1106cac4743c4d097aed31bb915ef85efd579330d61f86ba50a848a64006e8d0db25f6a0c0bca196397d1d26bd8f48c7ba3d8c4792f00761e35ae9910cf51e27edac2e9beed76120426d267b6d75b51603bef450b3d0971885228cba608e96f8cf01385d0477d4ce1e271462a7fa8974614292f642a98007bd67f7c843b9976c0a8edc8f0d8343c95411af8275050a085b312fde466208581392f364be5e6bab25bae4d90ee3f6386c95be84de7f82fb79f493b3c7e378300f094836d76558dca8ec16e2117f3544ee1a0b0feb4e377443f1861bce1418ba3a35bee598b6a7281b8e3c531d3f481563085ccca25b729c4291d0be61dd2f1b1b7e1d1a0939a0b607071cd33b0b76d253c67a630d8e7a9afd3c38468b26077e3b4d2c7c31d78aaff4bf7f0b72cb09a444be2d7b34cf9997fc5b885851d7e6092008b4b41876af3a681e2ca2ca6747b2c0573cbc1d0715bbc854869fbdd815e454197d69c6ff5580ed8ced414bc779254ef971d0d21c372de891fbc0d611dc385fe64f44445bc5a80a718890fed3e624770c925c5bf84716e478ae66a46a822dc7d9f2ed997047db4835c636ea74d8d8c1f8680bbe818d9d4573693730cc51ea16582d0bcd2822412d406fdc17909568b626bb8205a150eb92e9f2db811d8f98d3cdca46e96aa00143fa4b298e1066fddefc536c383fda27534212fb9f47855e879f8f48f31d074412cc21c656dd93bfc0e3f76f5d43717a11e5913f93307b65b93645b6f62ba031211cbb5a77dd64d5e44471337e945e0c523c374e64c2b8d4f1fab43bf77bb3f1f853df8efafa2168d2858761a21ce904a1aeccd11ae386d4b853a37d00f588ab1fda560ae61b119f131002a1d2c2598b83a3176fbe7d2b8d94a9db24188166881f17e87543287da32e4ba99a156ef8c88283e1d15777f026106425d9480797b07e745c781a08ad9baba046f573080ce425b7f29eedb91dc8b1ec4744976f614ac7587cba72a5e9b013769f59f479de06f4a5127f892bfa9a01a9090c0da10d7e7f2b0ee453e6790aec347e6fa1a7b65778b6091c31b5cfc5870435d9b286e2763054db9dc5b3a4d0c144a9df817bdcff38529e1cf03fe370cb6391558f042a57613dab8ed1f4b42b170de8509cdd9725bde29b28cbb17fc4562fe726ab042b4c9b4d465e7e91ef4278f7056bfbb630f18dccc6e7ccf3ebe9afd1fdf40e6f2f7a65ec73b6d5739e3e6b6ac6d7a5ecef8c327ae702faed6f065eaf9b68c12b7c0c4782fc3edc80084679cef53ca2691c1e3452c8205d885343ec338b29cb225a28c977a79d9da17783288b5844fb13ffce19be30eafeaadec9e0c494e0343a13f774343d7c20bf311c0309b895b7d4e0c56b25e607e43c59c0c2c97d35055deea0cf1f85826bc07f3a8fb1dcd7de93062bb1efb32017270c501bac0fcf4572324b63a14958888ea90556e98eb37938ba2774835fdda0513f9f71d41257fc612822b6234fa57f0ff7a4df1a94d08faa44e13b4bb2e586a43ad84fa94e743212184a520b6012562db140b2adb7d828d3ec828eae74e1d10744213a938acff06c49eebfc2444717ce1e005808bf704c9afa32f5146c788a61a7a2bcfa90103d59053483b1c3ebcadc870d5895744204e7b518f9e56353b89ca9855c4626de22c19244283fa5a6753e348e3abb9ef657a2665d218a211a639f93efa3df15e1a68a394736d3b12222dc6dac87e104344eb45528f6696e749352ad0a172e24c2d19d426533d7b004d89e7a8fc6716fa3f003caa2ffeb1209519d3efe42991d29abe2f5c5a9b26bf7a06ca25e7fd2a7eb45780df3c478d482a46890f3ac89c6bd3d419a901fcca7a1812e2f423a6c74b555fb6542cd797d87959be910db67e9278ea378ed1e8d2faa83cc676280a79ea929751cb7a354d5bf2b1e927d59994c0fa6eed8052d5dcabbae2e93e7d8ebec6ec8cc787ccd73a4d36ed9d363ae89b81b8e0c0200d4a43f7c0b3dfaf8cba027ad3aeac2b6d33cb26a66b5f3ea609df4f64de33e059bca5794a1dfe6bee02e170d88b541903e19c72d1c983c39f93fca46eb5dd43c0b37daac78fd9d609ffd8437b9173f309471aac4976cf47901d600b471610bceab53906b99806807907536d2d5f702be60ac24d6df1764d1feca5fe7e6d62de30387407a0b4e8fdb3cfff487e53cd3632731fd0bfd83d46a7a82af8852a680a29c39b480d6515a032a0188feefd0fa46736afd0df8968b6bfc68b83ebeb84d34fdd3b226036f11a8e2e5b8defe9abf91cbbeeb81d83ad3fd0de341b231f4dbc1aebb03149992fbf1ed114dcf17826a69b8959112a656f248345b148bb3427470385b6ff1a0a16107d2ef0f7b447042f8c158b56669d13173f938f7724c8a5e692219bd6521848b1119e5c5878c4c90666e6d20252995d8a7e4e3b30f05b4e2d5f45fb71a2223c1384b5d399ef8fe9cdb473d9af8ee892f0b7ec21009e5a848dc379423b5ae664ba4efbe31668e6fae7ed530eb87c1957ec84e3ed509f44fd8a5721fcae1ca35707c8d70768758850e779fafda79a9a10c05dcc0ccb63b8fda592d6a744480787ae9addbd0aa5e2904ef2d203076af9522ebb1aebbb9c151951ff1dce886d717af12d8670677a744d70e08ecb528da5908a254716bb98f7e522044ddf050d8fa5820957ce2953bbcd0fbb77c313432d606514d72a45fabfc5983b1d5524a8909bc3a6d822aad227b37dfc2376c45bff2642025182d531fb5f271bd2cd71bf42d2589e7e1a766646754e1b2842d018a96693863cad03cf38f6512f24b476b214cd9348b0121690a6a6e2a0ecd3e109aab5ec18ff253c22d74f98dd7986ae4164f2164e14a605d1c6bcee15e79651bf7178be232f77f8ed74bf70bf47c082cdd1f454172252beba051bd2f2bf06bcaaac438c4d3411c48f8fca7b3d260e8eb7ea28df2c5f84bbba006813cfb9918c4ba98ad8ffa38f298996e51aef8aad3caffc241a0622c89742371622f59de33b22f7d316a2f44c824c18b3d23eec491706a66a872d22aabbe327aaa30ca26863b125a0e7dfbcd6897783ab33b3d14ea87c6760b919c597943d4099f69d8dad7086a168af1e53b9897c663fa1e6c04a6b41cd9b2244820bda811068bff0a60efc03f9beeee76f621ccb4ee5bf303fa8ca17379e5545fe93d98f159b41de821960c99d0829b3466cbe049c41ee28b6065f6d33dec49681bc2b97deb63e9fb859394819d8d21a9f35d788ecb8b158b9df95a450d0e2aeb1d14b3bca2df8bcaf5b0fffeea59a85d06a13f89ece9b18b191076cfd1951f7059fb2fb767722cded7b3f6199f2c57d7055dda441082e1133c72f27c71c75280363fd5742362f4bd946520d9a54f569f5a5af4c71d9ccbac6ee67551d6ede8a21ca74cfdbcf80af1958e2646e20ace3d6b603318fd8097dd1736a758e64e0c5f73fd3d5a1c7c970241f6af683fa4e739a2373f4196766e2f9f2832988a34e43ea4074f912936c276ff646448a467c81c66a6c14ad2c578296e85bb19abe598c7158e2baccd6db4d739a2ecedfa999a6e1e76613997b7dc53ec14ede42faa51822f5978b2ee6b94ac5676f15f278384b5346fc618cf92c335829f6d0000cb37f85a32dfac76768b7ebea918a7156daf7b0f5999ee619f545896ece675049071b0ffdf08a14cd7c1d4d8030bccaa9e424717fc81c43526b84392c5fe4c2541283284299a9958d65d360e4b72d6d06066a2b42027a1336f167edcf05d8c4925830753d83e9d82ba882cc74bf4ce6ef943134e8c328d43c19792de35ac3d5a85abb6d2b49bb3b2cd693f6cc93abb6cb200224d094b914d666306fe5e93673fa9c7c76b845ae6d05529f6638eeca5b1d3c657195f1ab339a4a162a631b913e0d900c38512223bc49befda1562b19427a4bc3b1a5646fdefc4792f3d78c749255d7e3187249cbc76e7e472ea0c3191b56d0b55b9b57877570d14f32bf9640ff67c6899db836f70cf812f464b5615a34375da2d5c4657285ac99a39d77d396f3b80e683e8f7445fb5b0fade9e0605d3ba05524c6dcf8c18de3e3386abcbee70dcaf22781648c39211bd6ac34ce5a82800659b395219be4fccb605640ead2a1ac15241ffcd3d9310ccf0a97cbebba7aafedddc7c75ec96d60d773b5a68e99576d3b06ea1759f5de1cc91df915b50a9619cb53d9e3c10bcb487c9fbf12248d88bf813cfe57636c80efbe8338a8a6b5756c334e726114cd7f124f66dafa2929b6219c18c5339ca7d9e403dcef0b5d6599059a3029c5b698f96cb45bb1f518f85011f03ce732423239982d7d84b43575617474ab58981308ea964fd0ac697063f72f021bdcea0086308abff78219cb7f7f476712974ed667935d667852eddc171bd766380eb1643e5f2a2fdd6fc28bde32ecd6086e506d6fb3f0bcb51de8986c2e897114052ec9a505f4f191b634e33c2cd335ef3643447bad1ea71995e051edafd3d72248c8cd64d579a9b6fdf79df3eda92b5987adf805ef25ba08337b75162034fcf55205cbf83e36bcaf9f70e8bfd5bd1ab9eae6f4a90ab46a137f009e60203b570fa96c61c9b0aaaefe23376fda75bd8892d894c6df80393bdde1162a76104579d3c7730b73cd53f52511b19fee5df8f976c92dfb13d022b39a022295a280e1d9e434a04560f4a123b6f385f555ff1de1c84518ede07b0f460a4acc8c8fe29efba3697a9c2bb740cf26411b1ccbc98ad629d4ec2bb0016d7791337a6b98c5eb53b3de787c3e95813be572e7529a4dde4afdd12e411ce3bbccb14492bf57ab4576782c00620410010e970181535c1c66b4c6f245aa819278c9fd06cbf436f34bd872aad8ea36a73ecb9d956f7b8b85e2a81790c8e488ae32d3d6f27ca6c13e5cfe2603387120db98d77b770857a34aa09952453e6b9c87689ed1802b4390fcf76c24adc5936d1dbdd6a35ef2542dbb4f1d29780ccc27ce887f7f386e56f0bfa986d102f6cd75fe0c3dc785a41d95583c87efb1ba72d4e420ea2293ac6d9ae6f1e2cdbb429bd5ed02613ab3940084b1f78e277acdfc0e58b0838e2a7bd3ea135f147d3f4f6af77b3f058f4158a956591e74634bcdc44eacb5cff455333658c54f7061f763c76529208f37b7487484ae0fff159d20580040af2407bc8911715d51ab1e8c264da9674562c69e19feba314a62d0f77c43edc51b242ab8e3d1ce7bf418f5561d4a3ec62c24be6e13a441736c6407e3280441aa7844ffe2ba13ca81a54e98fdaf699fb63349719fec01d4f4c4673cd8ba25b651550ad9c29233f01ee3a07bdb531846c7f94592bbf993cf2610e0e250a904b65a2fea5ac102dec9944dd31087bec2be6becada44ac2d69a97a0659ad38b3dcc356767f5766260c192324af98b391571229be5f8a4ee46e1ca1169c8e9c73d62739a083c4b576672894f7c894e587d097c75933282c2712f2dd261eefbf3900385464f91c8484c56f9e3ec6 MD = 06f0df10ed7bc4b446f9271fdbe6ac81e36bc142 Len = 47240 Msg = e36e18eddfe2c21d097af7bf9f8d89f1934ea6b434e8a3a10bcdf7d8034a8b3ace6031d883cf71aa8c738c85bfd3bb47cbf8b855d67b7f4764e256e17b2d0b4505ab7d6875125dc3adcf364b1f9baba2334f018fe9f9ddacc02f4e5ed6a30d0a50f80486fcd40ece3537fef9080be26b95fc894bb7894238e75be7375dd61af079efcf1b623d0b35ed52ea77c04be708b7a6587286543853a00f295558eeb95f4637e50ded74dc5e9ac905ad8f8442e361f677ea9f824665b4f31d9e0f1273bf81794e46e6a209b307435483bfde7c625d93ed9d4a3af5d6ecaecafbc96bcf79f05c13ac95ee1a9afb69e1e297801cef7227c271cfa4cb0e0ee93954d02155f35c893b294181987d3de3b3b05e93aaf16757fe5075e95275e24b70926a5b8d968ca7cea433820bc39658d2d75d3eafd005cdaa2185311273327d799be04100ca4a5fd504b41af9d4ce70473ddcaab2f31431cecc47a39271c4265c597afd35f85c5956330a71ec18add419cc22fe3bc45c2a703803685ad561ef1fb37fb4b4868b3c5c187dae6bf7fb2c506a7963d2aaa4619a4f01a7f209d180cc90399106de9fb0ec9b57faffd97f1ff5012701000db67e53f88889e373dc806adaeeb9b266605f10a4de7c2e2602560e7875ff4c555828a41be236b37d4a980278e757408896eecf1b5c5d83464c79a6b7ab863feb530793a155d5ed8ee26f9b526c9139ab080832e817c483a1252fc2a611bd5f356ec42b702a8f160d6dae3d50c48f24367f533ff458dab89f55206c2defcd379c73077171a98bb864b4fcf05a397a8993c377002566c6a9a9a3f5ab348cdd4c8928776f8c19f25afa7c02bd58117af0299c1d7d648bb1de25d85688a33116286257bd2caac4eb85379067ab3295b6e260d2edbd9a0dc3e07dbcea096226a05290c681b0b1f09fc083b7d4c3d00d57e6a02c8ec8ad35233617175a3959b3a2527c3e6a048be6359346b8f10c1ac184855173a9a6874bfa685db14d1d712044b18d86202f1eeed686e85c658ef9f86646db6fe5600e976fffb5526cbf90b4b0f62a684c39544faa22d16bd95153fc25b1a7e8ebfc2c60ab8289c15f269fb80ba9bdaa962b1353d8ee6aadf45e1213e84e1ba66285c8f0d67940c7cd5a87748052ad15a50c4540897319e95fbc1c86d7a6a070f300c98d176c422c5f642e30347a627122e4d15fe43747e9c1735b9d1c409f104677198096e4f7b8bc4b7e3452a84486b4bb9ff812c45d73c38cb59fdca47e4c02f19f117c69c7328c175ec70065bb1b049a97533aa2c1500d0e14d6425ba7edcf774387f1811a6479d0b53366382ffab988a1b78557dd4846015f8873ec80bb5710ed2c1cb65814297f6dbeaea908e97c8ea56e1b6d1822166d7efe9adf737d3fc48546268fe90b442c6db1fd40aeb1f5b38bbe236cd9a8275b5880ddbde6fd329bf31e3694351173dd9d547e86891acbff3bf0c5da8aa01ed2d755640d4301d69e1ffc754ea5ee5e9ce5ee560201eba77a9d4b2b4192d3a6dbe2c75857f152d3d4f2270b449f69ac702dc9b03d7fee302d9a197a285909657d611ce12458b8d24652e91ffe8c4b05625d2bb2bd69e90f1f18a0dd18470903c03d9d26fae0fa7bfa2888d905d55c13785d5d840c29a5eb58002a7a98c49d29ac5c925064f1e275fa5d4d62e0e0647bbc15a74fb225ea6de13bfd7930388b7f4aa74386e7f336694ed780e217172be8366e503b35c77f3dc1b06103680b9caca106f7f10d4ebffefc80698033e17800ed4ea26f1f762e020046a040c9a59859b962f8b95d6a45dd0e3f5065bba5156be99fe314f799bd64a7e70157da6e472d9ba18c055fb090ad8bfb7cb937cdc8d232475c51469af50dbd7acb7023cf71d14eadfcfd9c8667177c9e36a330c05addd130554f93e09ea24ae647b52d2eddecda6c90cb9b5593c3e80fc64b2de69333cd40153566d380ce5715bd4c7ff4542748c88f94e486dd58d73674dab6a73a7d2e61e62c47db6237eaee745da28a9e2a9fa84383007f0a7f52fb8878536b1962fc7a0e5cbf600e850e59b6111c56839ce7f3f2bd76aae5df5f46494c8d9af68b4072d6ec55ca4a61c83ec98f77c2cb252993e56dce6e352109ff007feb9c9a9f023386059281df732285f6003a353d6e6c6f64b99132c1ec550ef538f6d9cd4748a466cefded95622317858cee17a21fb86fb6c9466052e94d5b70a034ba562b1cadbe701e7733d6d3dabe5a1acfc2e0157b25c6755fb0bff8cfb9df2fa5fff28536d5127d8583793bb7e99346c765578c7bf7d8a797a3175e50171c6f038e458c27f4dda3814bf062964d5efb66532f245775266270f39988c7d4807a3dcccb376863f917d154e6516033e4bf14530ee6f7e7d9315267ec7d1d3632dab9812d90e26a8d61df66010efbe34d1d392f9dd844951899a5c9b94538865a17e175129f7b51c10a1149e9a351a5c09a3dad830424c60c24d1dfa7e9020b22b71c6f236b1c5fbe99d1c4471749c165c08996687280c4dd593e725f70620fb044d13908fcaeddac9686a0c373ca7e651683b1f62941d5b2c0544988e23fd82c466a99685a1713b38997a504bebe26e82494c8d3314d42b3e27c2ecb4883afbf434e58eb8e4149f9fb6e9bb3000cff157324a1a7928e530a461ce7d0a915dc91c5e53e3a9f12c7a974724a77429c52158a9c061b54eb4fdc759e3d3e0ddda7c9539712fd9574d4e97a0b7af98b566610f162bdd6804b8054f568f8be7cc3588f76cc9edb784ebae197a1f2e1e322852d31e08e811e982c9750e4e0f7ffaf360db4eca87d5187bfbb529c7bd652e8f594d17d43c434b99cd00d78bc929d898a68985ff98b27092c9c3365dd80e190ff6e59a0a246cc961825b58e56365f399ccba78d59ac03bb49aec362e0889702ebe352b375b0ed17e7becf8d748c4ba7b45c6bdf8f88ec855d1989fc4b967d26011a431d82a9a02453c4e3dddf3b6cbc1a436bbb65c8ea4fb2050e9be85199e4893cb44692daeca5a25f7ae65fecc75e15a92f8aa11405018e99d8a87d62f525ca702d966cebd9821db61b0fbc476676efb640b50c1346843afd7189d37099cf0ddf3775da836fa30cf24ec2bdf350edee9125a26e6eb4befe5a61a8b2248bcc9ab0594ba24ab7f0b73a9b672b998da95b6366bb8fcd589821d82e6ce226d502b90c1c808deab85265b78b64cee026947e538c6736d638faed9e623c2a1d7f5bb21b077c63087aaf6091a5226e7122959e8a1e0d2d345ecda8d5848253b28fbecc04a2a7ec4f06f1eeef7109d3f38993042fa4173a8dd2f79ba41da5268c0f1250f0756aef6463fe58f97882c40f6378f96ba6ec268a9a620e34b40d685406418606092b36f299c0e6d941f30b6db92bc366adf4b8d2c0f448acd122e4b17d32b66fe553879fb11ddfb455c56eb49294aa474097ba0e4c979335fd4b614c7bcd2852914bab13b2ff8db53a61b68df79bf837e83df2e5443235f7bef3a6cc08fa24d8967a6af7a44d36017a2dab9fef28f35d2c4e2a00b2ad77199f7f7cda2ca1f1297b478bf390ef23c39d9314938223e5e2943228069df0a1c42558ab1ef0aad86cc81cd8ae7dcc9c2129faba10b87414eda851b5a00ee2fb1fdae6fb3f5bfd21ca066017d173cee843a8ca66bf9a03c9a7f11498760c6dcd53459134e67683146abc7a11037adc5152a16ade472fb84b37f6e19b2f9f785e87eec21dba4822f87572d48eed9bde1d769d44ea52807ce4c63f218473cfecf7e45edf7f64d9c31712b0d55637ddbd95d623bf54859335da7c553d1ceca5afe0921c52228b314fb76affe53088495f019bbb43e38a72cd7680bf9b2b4028aa61b8b081ced859ac21a4e66ce588e5ada9eced385e09252a00fb05a5791761c5c27ea3d64bf258c49de9eed23ee0bb8fd4f242078ea9b236c014b0c2cd1a56e94a0d7cb76083367d72619d800038d3eeccd541163b1323d7fdf44759f0f011fc428dc38ed730fbc1ea337edcf63733b0d7bc73ce2cef80f701c252d4ab429ae7f22601c276a3b0774b88164fe786e5bf3ecf5e972be4cf7d12a75a9ac4b8f793a2febcbb06845d87de87ef429acdf10149388cdafe9a1a5179cbe61303f932e79a407fe14e7a08d8eb59901bd8b35d603f1c85fd6eba685b7e557ea732ae53ca2112cf9c182ebb54ba25814469e033c36aa6cf6a43ecc283686eaabe177e6026819c36542a487de292144b2315fd7b1110fbf48745d72fb1813df3c07c1263e200073b714d6f576abd4e7522a4b23b347a467cbe3c24b7cd0febe015271163e6e77b675b494b4fd581fa87a7dda67d13f0aded76ef7a62bf5b9ffa25e024691a7e1f407ae68570092740091c89824896b958d1162782396fad82c75971f37c660c1c5037ecc5bfeff64984e870eda5a51f70af08ace443c54dbcd117a125a4b2db9a1ff822b2466f383d80735a909a28681d10b3464788aa8274a0c83763e9e631c0332651f50c72334483250f123207dd867b7fbd53110495d2bad5fc5454ea57b6162a413619de31841766561d722ac6d478d4d8b1e5bdceffa9a4b8a1eca695a5506aba1c769d7828c39ef956647a6b2e8f1a60090cbb7523f59f32f1ba0232b56750844f2a9550561035be670fdd13bd49b91e028fe8d265242d34edc4e7780de54366783db0033684936ef87b3c08a92d19d745752a2deec0b5843d143badd652aa2a3fb8d4d8f2a920d1b0b1809019c4a3567ac66bcde651a1eb88b2e81a3734ef964ba2eb16af0745ae38b88ff43594bd62488b92fb745d583176a4d407591579734503dc06982468ce3798537c2727d0c257cb87ffc06e421eb0f4e9bb637cb088d4e38ff0d28af3fa565ab36f1405453f508e3221f30bc77adeaa0d807ef2fc9fa14bec1c88c14cf83d05961727b482a1dbdc7ba935bd4f0ca8cc2a9cd2fec57e5342dbd1e04fdd9093a1e6ba85bef1b09fbe4adead0a429db4642758862873ee93d1445802be0c8c01378aa159abf933453b8709847d08f5ad79ecfcc3f86eb709ff0ff9179643b32ecd6a14c90101f4745c1a72e19b09dc391461d0b0f71fa15cd424fc475de9ccc36e6e5afd4a73b9d528eb61edeeae1a003c6e1c76acec7435586ba9b99d65a0671f7ebd1e0db64b10a7e21ed0fd5d76abf9fb273c9f3ef73b94cd4896dd21f7c3ea828354d33272cce1e8f0b1507fbae253f03a2b597ef3178f302005a684987ed662f5c6234ff5b1dfe321b8707dac4c53359d6b61123170517e7a2f7ff64d41eb065b9d85759e68a8bdf70fe4bd159200b298233f6476efe39d9e3cf0dfdcb43256fd00810c3399445cbbdb34a9bc5c6350737b7cda8d3c4c77d45381a80e7eb23b2218a07c7decbcaab447e9a86b5182f5759c9fde3dfe94f2649cbbb7ab48749b140d692d4407178d2c788a21e819678ae7ae30d74dddc4f8954025757bb97e601906658850955def69999f7efc5d1af811d8b82d8683e370b167484a457ada707a2b1af3683c96b7b4d0b0266fc5a1253b43be47b095f941fe38aa9fd33290b57fa512d756a4cbcd5545468109f806fbad17ca8f93be0f55c5dcd5daeb8aa6156f9cd59de07604199422e8f7929f5161ae7b646cf6a42b934d7b5165562a267a9437e9abcf5a4782b98c1ff0d161883e88971546a2ef58e3e03ba4a6dcb917cb349fd86beaf79ef30bad72d48fe7b57c8194648660489b2dc447580744e082f098fc2a43fbf61051d3ad690b94d8df02e29ada92f657fe5942c5f5ee58466ed00875659dc8fea5855ab48cfda8dd0fb8f3d0fdd32cc38850a2de01c5de94e355cb3213e01bb86677e5e96413939e4c86fb5f58b1cc3441f82cb906f39f71ea662b5cbb74bacc5a0fbf7478b31cc29e54446f70959c54323a287f8be0638689eb6e1be6c16de18a362f7e50460df20d0a1427cfe566c862ffdd5719f4f27acacddd961b2ffe9ffcd27c2f75352cd5a290b4affc0bf03bd92d946a379713f6b5f2c0f6e22633b0baccefae6ee7421464ce6c307f6d0353a0ad95df6d3190a251435f62c30ed6b9cc0dd024c3c316565cad83d2e17566b8be6828df432a2f25a6a80103474fad65387c67b8fd337244901343bca989e3133b45959242eab928bc0af001f55181590800fb93a39d1c850ae9f2175f13400c202b231ff1d9f5529c4f7283567c19404483d5dc3d6bddc2d218d90a8b7a464a74041bafd860ad4c4d61d0b1f0393fc0f2ec3ebc54047da3ee8740beb626bd763fb7c56980e5a7bdd72652b44eeeb9811c237c5b6fd0c4cf681d6e5a677f6d378a2c697670d2ac4e43883fb4f505502cc90fd7e016377aef48c4ad0727ed1d365c4b4ffd308d84a7986ee1d86fe4cc69029a9973d1a166aa946343ed7dd8971bbdfcbf274980f76fdebf7e4942f5f5dfceab083e297651a956e17933f1a8a18db527001c4211cd4e1d655f2ff99e9337352b6e66a51e0394952897020bc504344db45b03a3aacdee5e47ccb119496d193f001116ce0244125a1fe581549788b98c8b1804f5b2c1f4a84d0cf72c5d4c2bf5133a742a88dccbacaeabd95387f4c47b947f49bf916f0b045f692aba42f8185e4c30a84319926893bd303190fb12fc20b8d7f789ae9fd979652972495f398682933ddba11e2f911734bdb2945ca80a85dd6a39dc731b060f4795f6631ed71e6ad1a735cafd7ced41fb9a83e6137f95b2ec7e353e47aa3bceedf5df8fe699871decb7dd48203e2518fb0fce0f865f46adce5c133a921320bf40915456204869a3ceb5fca3ed40e0a41a64b8951f0fc580694cfc55bd1f5ce926b07e3e32ac6e055de9b961ce49c7ee41e06b024559b933a79518192e969855889c85d1858d3c4a839a3d0c2a2082fd59cc0fdd5f03cbcc6f818e0d4e407b094f9b909781b37b7a2712af2b688eb8da4870cbafd7d6a255a85687b985e4ae0f61f6c7178ee6d49e31973847f25b118bf814c8ff149ae7d53c5d2aa63c4cd86fa8f553d915edeebd887200e72f4f371a4f002e557e17415512dea05bd93ea22f0bdf5c657c9173df16eb2e938731cf8e377b24397d1459dc12211060c683b35971fe09442d9a080cc249ebd462cb84f097cfd234795bd672246da33e69e3b5f4c49883fd8ed0574d74d65e3028e3fb47564261cddab2611f300c807c2c254d09ebf6f21809fa08a914d8b0314142df9b5e1df98d08e2a2ec1e44d1a27613259fce607d1d05e2c3298b98085f16b0d6f596a8c1fb6cb340e0d65ebb39ae73e5be551d4c95ea4e2fd4bf5e8f410df5885ce62ae29f6cece40441a168c83e0e356e687788081f07f4b299726c5f8fd89fd836ed84017157355e455700d78dacbbb8efb459fc0ed5bbcb011bc8410522c0716e37cdaae4badcf9cbc6aaee031522a3d21de6fb1e7f2c28e0a2cb70d59b95307751e8212bde80dabc388f9608101038f9fa588cb7cfeed01c4f9c73690bc61c3783fbeeb08bca0bfef3d75604662e7e4c93d638418baacb9f6a64d2273afb3d97142f9ad98861937b40a9b75fdf237db42f8985247c07224f3b4a1679f0db9c7f4eabac109fef7a19662d408143973d171899fdc96aaedc160a77c6c6f40e40d87798acbc9619c8c2af8d79d35a34c75f942d28961d4601db1e136a750f3d3288d81d22443689865d61eeeabbec9f2272ec6d8df45c789a86c0458af009107879b963971247e7bcd2c57b1ca2c083563a6882b44cf0ecadfe3835af9eaa2e1c916291938d91da7009235996f19f866c9d4f942504a249452dce0c60e7b94025ba1ad09c1ddb0bace9c3b3e00e51506b85ebca6986383767facaf2263300ed9cdb2a483c2aef22775cecaf83639e8a5bd9824d07387a601d4d730e88ea45de88dcda20fa1c93c6da4ae77506564edc44815d45878432696e0e12890e7451baf1a472815e5c909fdb99fd2ef15128ed2f64c4d972d126fd6325ef8a403aec2ae01d3a92f150ae5685327302cdbbf566236cfe314e861fc2027b523aa7a2ddd65b2e7a7c3a61b493ddfd941820fc7dee29805576a60de56055f683c1ca15ee656dbf7966c2f76cfdede2a799757c882e48880fd0ffcd4080647fc94631fce5801bb980790f7b9c3dbccaf3ac51a2dece886d7566e32ef8ca35ff6ef165bd8bce6f02d7dcab530dfb529bc17a3ed84675f115cf61d998d4e5d35cb8ebedc2a8f87083c6b81ee987deb83f592bc3868acb8c6965e86a739e7a4380f05c517104a526249535eea4d28ef59c03e66912707a60517e241c271c308e515d6c1a34667e9ace8b7aa5ebb5b4119c07d3b6e5c12775b6643d7a1c17b0bdb94941cf72982ad367f1b0ca28f9 MD = e900914d8a38d14b307d1eb8e569a509421d811f Len = 48032 Msg = 383242c709fe5f2ce782bf8c83b645d171f2bd238abc655d8fdfacbd0fbd39df8ae52fecd6e8b00fc269a028fa74abc52a11894e6618807fca462b1b5d917bdf3bb9fbb5f420582b2fdb20239309cacce763f7d17715f7d0bacd8f0d3311f96895d52d8c2a4d5f6a7500c9e6171eaacfef138f15855cd136a9995ffa57e4bd60de624dd84117ceb2deff22d74d5a54b78b47d9825894169bddd5234a92b3cfb15f87e4010228acedb000b35fff66cf6a03285e81b766cfe69fa76464ac263541606d796f32250102342d05e7f3e923d29fdda5786c7a03ff3737a8b26de4f9fa293b94899cb9d5d9b2ac9fd5f28c59d6a78e36d03d77baceedae7a9b9d9623c2011abdb9078a315a72a50992c4f7785d62659af2f306fc3a09345f8703e3b98332327d673a401c6dbb41cc8731d188511987584456ced22dd2f0e1de6874c52402aa5bf9fe849ffad7a76f1b01c29299141ff8302d78438f910b870994f04e8dbaabe0d81bfec1e90c017ab5fb749c1d9b53031d42ab58468fadd96e4f005da6a15c926c59558a22a37476bfe98cb1c5f64b00735b10183b11fc6076614cf95701e6fc1d8031028de32aeaa091b5d6796c307799414e8b566223a389917b2a882070a354573c3213164b5ec0bb951521462af0f9bc0eb980c9482b10a836f82148231177a71b219a82fe5a8731d475a5cd60f4fa93f8ab9f8d947e716f246c0abf27cdf03879d70b716c675dba1bffed46fb0a0490b3689cf72e2616abee8d2bcda35f25d2fc5d4f29bd0caa1d12b9e1fc22bb7f79e8f8604f3eab65273b646cbcbf50803d4cba4cf318d2d62360ad6a36fe8ed3173e64d2ddee93c8aab4f7b6d2a526674012f6ec16a5404994ade36e3bb70b69325eb3d9e86468a6fb0150ef597a6c44a5f61a16dc8ede6b38a361d65474baa792efed5fbac8b167e3c977019769a77e329f2db28bf834a5d6e8318bc95d24f6fe9a1b4b9943f7722ab472d2d597617db0b637a76c0dcb5d38245b74e29cd0bf3f074385cefdc131986c4b4c5a2f21a9e6e241dfc7f52afc2400e578e75646681ddd70f4a01d970bf4960a567057706a9ecc5141e4d8d9eb6323d9811fb60f5b60c5a78259cb016808ddb5d75d37d5289e1c72b50add6191bd373e76d3e1b2fed066f216403188b09ae656b96af9d84baf79a923822c4955f9e11d3e4b02b7bb356958989c74b34c735cf4e3dfc2013b998b007395ee19a1e1cb7dc3cf3fa7f95675e2f1b6bf0ba25be5983d04bdd96024fb7e8d884b5adc3b9d66eca7c0091ffc339607d638171b1a2949af200fe72318712b5aa66a936dd0fee1a11aae6597ef4a7ec343075f1f77d20f217de3b3ea3c9410c036744cbe6897f4ca713144c8f763a20d47556b173b85f27b615fc61e590d34a87f900d36cb10aa50f5702c1adc2608ce284ac4692eecfba515aba7283783a0fbcae75f3dc0100819eb94a8f5653abaec2f0df17f18af3187e1f0de6e9e9f5a9f5fa1c93b103f180e9ec43dc15c48c051a4c77ac0c1769d0a0c56f45a56096c7e86e5d4988347e117552975e687f720e3cf9fe893f1e84514e00470532668dd7f87db06bde1cd6b1d57ebd7ccaef0e48cf7bec1626fad338ea323dac0d865b689a9acea10f27cbf06ed31ebdc9bdb1433664b9094046e6f619edabb0b32a7fe86368005fa7ef9e4bc5f233a7c155fb6c0626fda9178d3ff7319529a9bfdd7bd5d747ee1e44cefe225f5eb4b15e324d41a345229c09383edae5cb2ffd8009cfcf6accf05342504c22bf7aea610ced3752b241b048b1c2741f9ae23722a059fc239259af954d1e08bb5ac97d4d39e14a2da79f3f459dd66013b59cd7cf9d287170e290846aa182c45aa5dcb5cc81b8e620f7d0180939ce9375ea3d7a4ad31fd035dfe4173a0c290f8f45275c6560ceabdb2766e309f2257ea49d56a73aee7a98f0eed6c089c96b3ad7ad3bb9be43bcfbbacad618ce6375923e436ad7065bf32c2093eb28d085d3e6c2428c562dc6ee665e36a031dd0a297e91710c923388041a536393a8b4bdfd83bda98bca3a56ed7c240f57b6ac62db844caa9e51490f17d3e7d262d8acde42a24846cc8e7a70349daab95f2fb2e9e653ce54b2accd6dc8f97c74cb210f634dc2e0aed10b44af4e4b60d93905971be45da503cc0d270071eb8faf4f2a72e9695615460bd95f60b515d4c377c0bf8550125f4c4ceaec83ad3a7006614d6ddd4fdc64b10f60f130e38d752c9df992a2b4026b72d7ce9443f566ebfea41266bb4bd64d544e4ac09c6402d0591e08c6e07abe382bdf40a4edd4e1521c8a11d40ff7d44db43aff340fb12664fd7a86b2eb3e9663ebe5b994ddb63a20d475b45c47ce46c46567e6c2175568a17e25ebed1f5a3b7d176dc1ea9023e1f6ab0982660f59be6fcc579a012fbb3a245fb2b0ebf9681dc252e9c22c91a8793224b7f467a304abae7d8ca167c57d1b5c06a37e15f5e2adf202dc62d17ebe5071c60392f7cf798eeeed79656c84f59cb7277a9c21b1447c7acbd80c5fa3c01824037ed69cc102d8cf80908e95cacf3ec426aaa365a827f9db024f274dad6830c7618c47ad443b29befb74556a2354621188a61c7856e7b6813ab46c1208212ada64ae6ecfa5acf24ba29782500b4fb71dc20f7fc02a1e330bf9aa1343206566eb8167a47a81b2b2e41a7c7dfe0efb9e57674935d3ae35efe9b392d56792af95694c4a81145506fc16c795a0ba9b02984cfce5e7395fb94d98fcf12ae5db8a06e239c9ad439bf42e523e65a31c3bdf356cd7680c57cb32ec983a678c54776f5bd4be57517eb314da34e37efda96debe6359b320dc55d1d4d65f0486219d2ea04bf5e96463c56d3802d5b5408d8add32b45ccf663e891e2d090b32644cc8a649200aee8d3f2e3daa0ba0a576d20781f850bc107b758162e26970783bce31a79745703d18338e674bc59752b8317591b83f63bf8709a4659afe741d332d3ff832c1111e2ec74eb4c438a3032f333cd6198a3723b18059eefed1006b73f35963c39cd3d8f784d4ecbd6caaff035fc418c438228622640ac7b6e9fda824a7e9aef2dea0b59af189d7dd6a958f5b3d751e61510b2e023c1eb6694f511d6dd256a266905ffb3f97d53ccd394dfb5f56b8b297ded9647891fd84bf09e61277fb0807c8baf8f310fc21e535e1b98b3931f39a0ee57670acea0ff96221a2cf69aa67a5bf6252e532aad398bb6bc0870e57909f6f71c99ac7cfbbdcf79e6f9b6c68db43f4925719d029551e0ade4c36094ef5896287ba2af1c86cf7298934c0a8bbccab0e51eed610ff0d3fc84244e14fa08c208e313167515e87109de9d984442ea2a3b6a8ff661ab665c29e9f8fd00bd4bb2c9c76169b101875f0fec645306946c5f4949d730f17d6c37133fe174b6373ec74335f510c557f9e5ff229620b3e8d9d664f3b301a2fe591123066c39a7f0486c1fcf2cb0249196a242119175fec8a93c090871fcf896d366e3ce07b04880ff1db9f396ac714714209359e4c729ac50dccfe8b28754ef51a4d007327d2a61d948ac33c17a2dd0c8cd4d3c0e98e71c77450424e3455a506a5772327b04d00b5d9961002bbdacc74b14ea588d7f99917311503d829b8b7273fb34e04fcbabf5f27c630933cb80b301a3f53fdfcfb393daae3ea32f1e4ace050ca2913f4640aa3e7e3c8f78484bfc82e6f852741de79c249819f637222abb940855b5b80920a0a7fb58336798613c454a5e20f8ee8822d75b9c97396b9dc3b77aa8de4898be71b5804065905052dadf6ab12bccc637c069551106b43f368ed5e0166b7f598c85fda98fc680f4b350b7b47be36e1958fd613121e52631677575b548fdbae01d55c6d390b697e9e54644b428e86b7c7e12356c49830dd6b3002d769af589a0e389c7aaedb663c47b142ce6329b335409d78c62f290d993abc753b096f37a30716a767c01566308d762c6c7438c5424ae95acb1a77f27fcb4338edfc777fb0339a039e37617242bac8ab8d3b62c5c82bed53cd4f2ae67765ecd4570a6e38a8dbe93a85db66915a15d146998250baae2cd3ea3494ebf26951dfd0dffbfd6b75472ed48673cdcb60e5b985f80fa9acdc95c0a868b2621d3dd845b4ef96cb1ffebf8f5708c93d283c73a8f012aa16a439aede13d171366fdb404609eea4815c2b8b344d73a35fb1d707c5104f1d3fa8afbe55b5d8980ff02bd1095644edc62ae4f2463d2ecadb6d17e8386c182fcbc3250f4d16e3f197a916d5b72358394392113dedb0a3065865e5602a8cd3a763fa84e7edbc5c4273a1829277f994509f9b9ab5502d391e7e9f2ab5c3f9ea4eae57b28f5d31a9544ee05951725e5ffa834e679f983c58dcf725cc302a3ac3ec55e1984fc6fd34efce6f815acfdd21fe97b16146ec65680668ffb51988d7c849ffa01e6e50a663da9b55e4f5b7fb432582cf6ef17531d1657c33cbb804595f2c559d2d3622b6a0df5e9a686a52422b37edad77e75b27fcc1d9cbf854c747f25efedfabed65b552c4bf47f700c73942fc7f556571c5d04fe227ce2237f829e8a8a36e82dc4029e052656378013f68f03be1ce1ed7dbb2338f0f4533a7c088a9d0ec53984bdc9cb451f9f6d2b3e1589ebeba208c61c7571192383712ed47ea9d9e8095d782609535892209ef5fd690b24bb3549657ae474fb14caca751b4da2cdc083c25c8f59dcbc289a2b64c459896ab74702300bb0857b5f0adda1a2fddbe502b516c67c33bdec3d6cc0fc457f9b0a6a47f1da513248f65ce409392e27dbbc392db93a5f1f7d655b08ce20d343a6a03eb866b8ee123618b8e70bafff3418bfee5e282cba8591c40bfec177003e32b8cf38ff5034b8b34edd84237aa8ab196c6cb6f21200fea164cacf39735ed7d5a0761a1a34c79e66f5552c0f2dbd05644e6ec8858ee4f312d401fa948a4198f613de0c55db094bb7c89a7f1d4daecb7fe24f1380f7b8fb6c9e6bf171305afa1a7f616020b78c493c2517dddc3ee075d2a4a82842e11f80253043544e09fd93b94f9ab6095ed30f5a9777d8da86049ce321e46769df6b29c3163283998bbbde6901048e7e354016999c14e086c78d9947c69e6154472e40ccdcb41fc21a18329030195a0ddf85e77faf99856f57ee03772f209690bcfb6db8e0428976599548d559539926c2070a834e505802dba853d7a83587bdb535190dbd584114beb5899ee94ddc576135f83af4e3b8dfb74f130fee27b529a48ddb31e07fe73badeb6d537c62842e41a5291d4fbe28546f34b9765d819f632f481cdbe623dc49cbb97c996f3c3109f7d715809b6a371f880bcfb172dda7089a0666523aeea0cd8ca22fe74e255378e84e562b7452658f8636ce37ca968c78993b403b5b3ac54565380fb3a5c87c09877d637477112422ee482d7fc1468031917922fdc392ca3fe9ed8484e2901b2a79d6b5d1f020f37824b275fff35852d2072287200071101b8f3536e1a116a15a23fcd5ea9c0c740dcdf8204edd5654c88ed9f5389e604766c9919f404dc6af270a524c24c73df6424e9bc4d2ebcb06838d01f5bdf9ead0b02d951627651ab50fb17970f6fe202ac42b1fcc32ab20f8a1863cf106af7b3c762fb2341d739d2372add4ecf7cd6d61e1e7f6bec497f29b810eed8fc92b9bfb37447b8178f5c8aafe53e7289da1703c5a19b3153f4eaa8fc08b862a7c0ab78d52104386f068279c114832bc6f16d32a6b14c757d91bd315ee80a94985a9687374f7ccbcea3734774a0f5a00d29a00bcb37dc5ff48abe6fe5982c9657ca4293e1e7f597bed0f69dd16fd9fae6ea77353b1c91183f45b607990066916c767745d9d2b8c7c6f5d523de6a7a60d99cbb59fe46b4c8e62c6ca4820900ad60c8fd4529f60d816f78d680a5791ffb6fa7341e1d9f8c9671a5aaeca9994111b9269b3ad93d3bed3fc2c25c2e850ff32f73aa2d9f0e63ab691a3687159972e602fa1bccef8e8c35c03b60617f74936fa268e52d8c7a7f2f56f2d91ecef2db53c0ab43a475d0467e7a4b7a35a230f3974eefacc7eccd2949be955b59dd8ac4817da1dc6a72edb2f3f45bd6809f9f7794bd6ec9a3c8eea9212b6b84df494b7597c044adc6efcc18b9b6d13eeb7cab678e774f026827c547e024dc1c591a1c35be12fc805ef355c0fb4817771d433b0aac02f820be123a4bae3250ea6e59e44e1efa311bdd8670f1df33934cbffc36a917e8d3eb4f9035fcb2db2fb7c70d8d06de004b47e9b005f58dfeaf8479ad868cf7b1462ac0a99ea415aae14b0b3efea627acb2cc2a7afc122e31d2e6f26012fb73e3bba7bc655d89fe24ce6ee3f41f752087ce724aeb3d91ea54633cd31cc23eb3089928e9cd5af396d35ee8f738d8bdf2180801ee0cb1bae8f0cc4cc3ea7e9ce0a74876efe87e2c053efa80ee1111c4c4e7c640c0e33ed4518c74df6bd12e5f2249305977bfaf7b72ed08007188b2d4bf7d71f8687bcd294cb1c3bc73d9bacda075b9982958d6270569f22e27a4a3330a6172f18ed947ff02e621ad820a0a2f83b34bfdacbddc79e8391ed2b96dcc29cf1b2ff3d907929f9bb3f678406d07ccf28b4e4ea9f6a7b940e5f6b6ceeb1600333412c6f10c98513ea0aae6570997ee16862a54c709212f38f6e0a10f2767fe603382317ff03f5c1336a5bf6ce6a3db172b47d7af003122f5f3465a2328a96d7ea0e7fe2bbb710a43fc50cb2a0d14dc1c030d9f08e2bedca2648faab4f6c293b404a8f39c7615a1f67b11d13685d0394d95e5737bb8b2a365d12359679a9cb92be62fd97b29136a5339519b3b56c13ad369351cb089f4c066c36a2fe61b1d260bcee3776fda53ad83c079efdf89ce27d60766634e5d6c7bcec2ccf4d9812f247b442c972193bcb2ae98ef96ca25de477df8e10efe3d021bc554b16fe7d5b9f9a3d172ff385b38c0fa471d58a532dbe3f1c30de5672f9eea72038169b91ea2eeacfc1d785d3baf20925769fc18b9ac435af051b2323e282efe56a4aaf764d44bbe4e95ca3839071b9c503d4ccac039afdf07173b066f883091d582fa48af3658004e43bd706029f741b8000e64526a6fa891c6498ccca638510983215408b05d9b848d19aeb5fdfca8191a0b8d7427cade16c5a46b5c6a8d697910e6c4762aa1b778dca599426b74fafaf30bee30580aa91c7e144c27bd79ffae8f1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b68c2f5458c40fded975557524dc97d998c0cefd277cb772bd4c1b263b1d0cc824e508bc837a78fe3b119d86557e288740582eac3f559b4c22873891208a5c23c4bd96ea21aa697b67324c869ccfecbe7f9c8b7814f932bea0abfd4a7ec1135c12705a7bd7d669ecda61b2f48f244cf582f865ef3cda2640c404d9a0aa63cac79aa7e3dffa80e2b9212a915e912dd1b307063e500b7aee78e93c4e3237e4dafcc9be93852e2c7c76c7e74833473f038d88407569254de3ddacbcdb7dabb6cc622c4f1a19d75b9f9c3b32480115fa6acb6331bb890ed5bed56b00f1f17a7c37ae3eb3c7fc8a70b49007a6215681c270134454714e1ca4d7f6c093322c288775277d972dabac1e63f8999d64921f39abeb98132716f33db7b83a0e0c9c3a7b3d746563cba5d0a7164c7d82724242c276cacb085d721702d6a023bbf1b024c9d8fb92a422898ccd53f2201fdae590ff892779ae74fdfc86cd453a3772067bf5d04361c2b2b534d395903da02f0a9e432b8810701df9185c03fdda0b1e0db471cbe26f59fcc76d7c638d02ddcf1faf2006732bf7b921fed503508fa1564442d0244f27d4812eab0a366f3c033b936828825f289fc6d7249453d3c784ab38cba361d007ccb059520fa6bd25bb05143dcf27d292f2c7a70e0c6e0e1e3f9d59933e1d4babad3ad6071f0cdd7c8fac00b4867f43f77b4c002fcfca45f03c9d355e32aee87fe061333e9af1668ceba0e740e0f149c2a3c4711e30f141fa063b4a6113af5ce120c3ef7d25fcdef34984468751164a9106b1883de26b587826e8076043871f9bc8e369272277bd3c33b69cec6956cccf0ea3a423569110070933fac054de86fc53404ee1230a77c434c858d4ac5b56e9360b5343001aff3347afa305ca1e498f5a5aff2f9a2d9527c72a18f46c7c6f8c2769243171617c694cab9ea515becdc138a3f8571a49abd3556c3bb05c327d043d4d85631cfd2e3592c82c22ca489a3e98abd91c05e702538a0f6f9cee26160de218f54c75567b04b475fa034a341553d4e30fd2ff9e6f24bf73f31e84bfb0f5d06bf2721d05e9731c4576cb2819f5ad87da0b1069d818c3703a84b9c287d44862a71b6876740fe MD = 581562f2a9f3097f760488cbe87f823d0fa7524c Len = 48824 Msg = 9d1898f04e38da85c27e6317c19ee81c3bdc6b1ae72102622a4edbfa3ad07ddb8375505c4a7d60ef90f55e0b3940e8696df709733ff304fa8ca74d2726b3d9b432b7975bcf653f8ff9db4a6bac2f41e84c4b3b5244fba2fdee443534b3f85372738776d52618fecfc4d8301f63927eff9f81089f3f6264d316cc9a0826c4737d0c8df4b098bd2516bb96170ea692241830407942784fd2e4cce8858dca42c23dc57019d56b7d3ccba4ba0722bd57bd9ac531952437eb7598da40fdaae697c71b68d8ed2ce77fcc5848ef0842ef08d1ed27fb642bc45dd458077b0a47c1ee0a7dbb6f799d56ec5c246fdb235685cee6791e47ee4066ce778a1a42b44da46d14cc88dac411feeb7597e0265f47c7d086a572bd3c4c6766e798dc3c04a2d73c6c7195c4d66e29a59e196579c5fbfd3738dbea0455350d4cabe81512012fa2849ad2aad3b89e1d415f12c47c5b5b6f2a85834fc541e5a1a94be48c6bb4dc4d6d275991af718722e840eac6d62b4f65d2f30369a709426aa450f20bf023921f1e9a6d1101091382c2ca09332f3dc026560cc40053b436b266417c5849583761c07b75f171892983f684d8d3319794fbdf582edc704aa8bf17a6e93c1d5bb45c7a53dbfaa6f8b06fadf7bd6e8243b52c955eaac4a7d47fdbdd08a17f1432f25575a906f4495e928c0ea921cbca4909019fa69e82a058a54ce3ed0ce9d7e7d897d8055ea701c4b62342246db3b2af7ac126b873dc02e1015a4fe092420e824d69ccef4bda7731047b70f007eee17fefb6511d929b76747b4f4a669b5161093b1279f0355753ad64dec193594401c14f26495c6187a31bfb71fb098fdf768689db068f84e43c40be925d97c97db77b845a35fd4a6732dd690a8b50d6b4f8001f0c9c55a04adaf3fae06b84c160adb7759a3e88b404cac3ad6021c3d8988d80e5ed62c9f250d6cd001013e0a8b68b7c0a2e8c86072714d3b0bbe6ebfd53dd0dc3c58173e0c0d8d6b86a7f35e647f8d32b5d467faa96b7175865024faeac91afa1de20dbd36187170b36d40ae3db9dc2c07095f9071a5c978ea59c78516d516e677e688a34fa8c97dfbb3de8063a2254b1afa07e857aab5a3bc2dcec505cc453fdee810769548e5f1e42e056b92b2e8ee66290958c804b684505eb35114293654b7692dadc373675ae13e5dc6478697a48d18cc784f2e5c996b6f1dbfee666ad395dc38cf36a2ce3797675026de77d1fbd44bd9ad5992086141d15647d12e331b0ed3ea418b717b165b3b8513d410f852e024a98e83da5a5a981805af88cb5fb966c28aab2e4a0e55c11d5503c4dcab584545c4923a61b313c2c5a44d61d8213d523ac2629ba6e8945d9f488d2d553b6a5821b34ef9b2b2fb464caab7f8df37f535aefa1e4012aa407543f7f689f55907bd4aee1b5e57da9fb72f8165ba4af49fa591ca34d817b3f8cc7dcbf6475764ced913ed8db4cb8a6f89e0d0dd22a5f79b06759b2cb010a61bb7df3d0301d5ef1e203f2a2cb98852f932f31184ce6aa155fcdce58c64b7e127cbdad38325fb6874470f3c6eb918b4bb46f8bc031a13927eed4a51ca625805ab7ce3181d4052617fa2168cca5ff730243a4448ce923b3b645c10386d458b84254f9a8327dd555a7ec5e7a3d60a9e45c28178305dc34c1cb4cdf121fb6accdd13c863ad49499ec42026f519f835887624b1071b1729c0b6deb75fa6eb5e8681055bd0eee831792ed249b147d78d4041b95d6361a142238a40acae3fc3ad6300588e54d08b118f0b23a2bec5ca6e50290ecb3f9c82890f0789127f44fab3ccebabe481eab8663ae982c6700c6755329c73aede24218acddf268d455f171e3e937dd2caa5d6ac273a7e29779424de522ca65cd1b104a3fa51977192f6af5932a82ceda19a9c5fbe7e844037e59966495a1569bc9ba2810f0f6a73eaa409e1338a57a9a9214ffd7b3623bf33891b8992952f69f17c818e9678fde8aedfdd32dbda8c8b43d28801e7f1eadaece751b4987e72c212bc38490b1ee05462128fea75e919f6f436cb198f222847d698a283f5767df682d33d3ce771b05bb6d4a864ac56ae914cc68f80cb578a6a8315a454240dbf9bd469e6d6b611cc42efaead3de9a3b8debffa5be447028fd774d6cdb19ea4a61689d8eba2f16fb2ceaef904d2b840a733c05aa6c06ca386f31e648538dfebcffb15c8a22e23fc0243675c55cf82ce1834f06ff681b6bb2e62023771366243abbdfa81b0d4b83719359b40f680f3ac7a56b292d1c4bfc9d498a2d80856c03ca7d3cacc7e3338b18639cd3f9d93655c5c1da96bbee5d250280b82beb106644772d0e8d190c62ffbc7b47fb08173625e1bfe27631481b8de872f246411b1e8e46b39e7696f0a08666c3a253c68ad7532587ccf118914bdd570980a608105a8a41f7348dc8f7b5c81d23f404ba9ae0879901e02ef731b6bc582ca972cb56e3e06fe218fa368a686ee98387356cb01b6844166556569024d3f1c3b6d30f558137d85a91e6680f8220d2cba10f65324e9f2eaca590bd165dca2cb7eff05e75fb378548e879e7f0cc85e1e38bba2c8a42d45face605b52b284811ee9cf23f1e1b897d9566da3a930b461db38d5d491ebfaee0ff71dcc5374ef5a75105003bb8a7d5c8275032e9620a0a8f24ee2045588dd5b88b8e3e76a2987af6c87243d9ab68c26fe8f1a87dc3907a3d1cf82ca79f73f2ef3a84534fd4cb7f063c2ae2a15f26f979bf90657d20643e3184f1a9f75a3aad8ef39d42d835b2abe09376061b3da922ee93749071e04ffd734522bfbef3aaad9b9d1f34992e14a78bb79ed7d0abb8e4d74ee652e16b195f0945d39482d18b9b212253501b25b81a0f8eea7c47121de73bd72ed356298a0efd6e4c53ce5ca51e256981bfe58367ad7502a11e08db9ed42216943a588269af57a7d42227fcc0dfb15af1a87fb1e908c4fa0de49c6c045394f360b06dde80ed1dd7b4291719a385ccddea34721506d2045d74f78a2f160b9a56d95c1fa5956d59e83592251b17b97fdab68b451986b43d151f7e5a8a9ea53b274867f53f71da12c19d82da6ae423d1399bd480243055780956a295e762c8804ef5f87714dcda514a3423bc6ed26acae2e238ac9dcd5ebd21618bc2ad2c1d6fb328382e8c9e151d6b449d5590a83772bed2de50ee2576124587606944c24c133f294ea1107e357e0c13182d363031d2b3b5eef47e0046815d114a1214ecfc71d83f63590645df7c15eabbcaca3001f1aad19220b5267511514770468574d59367b49fdcd8bbbd206e11aeb6b2714ed78c70f05dfb5facca0971fb8cff218180d5ce29b4eca8777100d01a7958bbc18d3fd83032b87293b56ed7126deabaa54008d62a68acd4b577b16f279922d6021aad517b285428d1d966c1de70ae08ecdcea13c9817f071e3b6a35fca07a89b886bc25f9c637490f3fda76861db3d3fb5b62cf2f86cc085ac4146cc216c79d8bda569ad194ca9df4edb33f33fc61e27dc5575083fffda0121b955aa08170db251d62fa2c1a73eb29edd7640d9621ff1822b3e0ee757997ee46d747bf6bdf082b57c88b31e19bfd5547302d3b7259f0747b5dc5986fa8b5954fc07d465b7bef489070960970ab992101a5e1e618737e3ad73d47a875f2c1b03d3a435edaac5722d14262db4f098835251dca3511d571123f3bb0470fbf85e6192ce02f6fda0761212639d0071f9138ba822e51e4e991a3ba3f469cc677c7e0ea7d9de0a26dc8ae890461101f547ed3c9bb56611915a696503153d021825045b817c29afbcd62b110c423c21f0f16ad59b08a8e39c3779209f91d0aa948e8be8ce1978403639d11be4ec70e8fba206f72491200cb5acd40ee7fed73e43256f36dc363c7419541769b8a951df8bc65c01c6e35de5742704806ac0a335ca6648b63a5708a3dcc158ab060d517e27dad4960073c5065e228515a66be71990dd82f766f04f68071e2f204b9ce24d365bfb145fc6f807ea4bd03f0964f5521d07b86af09683391ea70599f7bc96a55dc65a1d435169329eff608d22506087e551539155ce468f8a187658a900e14ef4a65c1149a79b4ef2c9c0508f92bb238066eefb04ebfbd3efcefbeccdee5482a1788b80d14e00957c177a598fc067ad54a4d5189c8435bea656f0d6d4f962e8cab962fc78992bae9174f8d8c14de89df887c06a7b3b66a8443d1fa76ca68f09f6e57cd4be3d8f02d96ec68eb2bfd07de2ac1b713f5611195fedb2cee36a5b3ebc9933ba008fad3aca616dcbe28a91b5897e50cd3788c79a4fe564cdd7d93a2f7221120cee2408aedb094910cf32bedd737b0acf1227fca39aa09014c867ae24be29a25de57f13e781a2f31dd74cba6e272e94074dd812bdc6cbef44139a49e6f72f6f2d7515716d64eaf613a93d06e02b05a6f6590dbc416ab3bcdc77e58fcec38ed2ec1b7b83b8eb2dccb2938846cbd59c9e2cb23d6be6ed04933e33ddd24489e4681a4715dd428b07d17b54b2dc99ed5ff41ae7db8416d41b0ce9f5e7c3f0e0bcb9589668e0a2daf5cede3b414ac2a8cc4331788c9749967384702c97d75c3e7420f7780930524173ff3bd5b813eebe7df600c2b53807daaa946146728edf199749a77a6b3ec954fefd44a28bba7684c1a71984e9c8d9e73ca72de1ec4d01f8b29dc90c037e708c1343692040c0e29243b0ec0d9edc28628647467d79b45d624297dcab7672006d4d5c29ed5ba9bb7d80bde8eb58e47bc333ff3b87bf3759dcc3b262d718bbc16f09c1f75850e7899ce528a09c8c745c8fa2398d7f01588fceb297fc2d7ebe6c17d4ff51ffa50ca5770d8b939fbe0e433e7d80bce2049a57be9b92f90d1cfc48ee3b7eea51ec8bc7a2564142737204b836025f3a5f1d7f4a32fb4df9f487e7e058b9cb00ed7be738954c043da62d1a343cfd4f9624d069efb23e136f822413daedbc6e3620f791a0c67b2ed5a653913f89babc40f1b1fcb0c2e0adda2496029123cfc30aaad42d78bc503bab029a0c42c2c73fdb3436aa25cb9f57ba5a32369b817083fed9961d28fd67b54e39550dd66eaf34b57ac2f4c752a6bb90a1ad12628d2b0b733bb1e359f02e160fb9090872f3df5570240b6f1dfea343fd895b487ebd7bd4084fbc02544b1ff890104a7ea0e8d3fc8bce646b7206218b417fb12b5888cf684e94191cc054b9b74fcd8de2d8b429b478d8629c9c2f9dfc0d03634d7875b25286975d7526a387eccf4f47d792ec4cf7c7e09a54d4d16500c0a2d621671ab10d70d7fdbdffbe07037f240ccf5807ba30e9655036c47233540cdc8e49acde38037dc47e59941ac385dfca412ca08d0e1a6de538b4d3a87540421ef018a236d3df0deb53dabc302a0e81d08991f4e294feb5ceb8419adaa75fe0f8a020efcb00fab1bb22a3b094b6e7d5a54a71ddbefb7861a0638f729f462d99e812f50de14be109c24f5729cf06bc6bd7085eb368bdf1e208aed1035cde23bd7bcd075540111c668f5e77703575f6b4d447bb3e7638f5c7461ec8b599dbccdc0242da8e3dfd276870b4673c6ea121412b8d09a77e191e820717d911dccb936649f8e0f1516c7c702505a8d6e104b6815b5ceca6d6cac692ca4e74a0ac2a11ec8163ad2710eb962e0aa6dee8230d40f5d21bb6b516ba7879ee074dda7e73c2ff6727a1a7f306fee2903c5bd8ab473b2f2e6e0a4ac484beb800f6a737ca4510ff599960fc8e2b314e542ab230f03f1f9ddea859e056a603dd9181233125faa66cd75d6d8d38d4b7c1d4f67489885158b2517f281e439ae24b2e3b446f0810ddd87ed819e289a00cdd9124153ada2a911d2536e74d11dfc49125898d39f73431b29e8e188506f9aaf1f73816cd6c27332ed88429f557e1354015f0503a59c14c9be503cbfd276e1ccf95a6ebd9c4d3d977d9db72bf7c4bcec88e045fe8c63478f4b0cdb6a36169dc96eaf516b86abcde78a7a13404057bdb9adc39eebdb32a614da0406b205b69551865a72a11d44ebcb1d079e05b7a0de657af059f21b70f701722005bfc6c0920a4a431985e78161eb3c2ca2a3e405e995f74fbd3dd38403fd1c481fb8019b5c9cc1528e3f6ec8f6eef2d165424fefa4f32bc914f18bd892b1df649dc53fafbbb0f47018f83a82717d44de300881c7d9271e44a439ccd36cc5c35cc710066477eee98301d8d1189b3f3c3b4b2001f34ed9d8a9b73b1cdd58e0d018e5bee12257fdaa748f06bdf03cdde1d0feb057ddccb062e1931f065e1faa0f803ffa555124863f2c0bab86741cfe3b8591e10ceb1a54c3d3800e0fbe89cd877d1deaec59a630ae92bdeeb20b024b53434bdaa787026e0366c830c1665eee40f5c6b62da2a5a4018decf8cb1cb76b30f076c4b0184aa62b84b2aca3bc66b843d28387a094e9894007e1f059110407da7658c6af06bba3411485aa3d2969d097fa9c85ce98398871e7e5ffe251afc75abb39092db81d0e50fd8a5418162ee1445759d73e145f499e153e4df0448052b7a963b4b298388e5d2909d0bbe97e9153cf01a678722173ce7834010a524151f9271df0c40dd3cc727f4946ae0c2188cb4cde19051848ae0afa1144b9e3b86b291caee5ed7fb86f96e794df7ae5df6fb4b536596c709ca459821b3d835fae494e725fbab456ad20d24930c2a6de80ee17f2528d35e0e4fac3f99c15f32eec9370107898a1fb7b872d8d6619ba5dcbacfbea7adee9d2ea5b5045daf38eb837f097de41a63dd4ea4baf9c7e093fcc89526887f6740fad746d094f1e00de665a08ccc4010d0f4ac115605cc0bcbc92828766b00d762fd94bd8f5ffaf636a9e1b8416aa02f4a0c6ca8c49b6745ab9177ef4fe4d080cd2be37451c3ed745bac9440c7e788a8476aecb597192e10abec3454137472f607fc4ff5c87f2dcce57509b470b16e2e41b6b8d23e0d950f554fe9e151a84ca97be536dc43d040725c899e9dec56c523e1766d8939f71094302305318aded21dc17d34726465da073950ef578b46321b7f0067351b544541b51c12af3fa6a7c5513ac5629abe3efdf471689bee1e1997930b228042a3979a5c819ec4e09e4222a3946627673803b9265186b5853cf00ac5ed4bd540737bf0befa061d0e0415c84110933b4a61bceb4777e64ed12169f7703d3fbeb532870724ebf5022896b728b245e908c4d9cee6c05af3c25279cbe03a617aa6e16f3d2046edc82ec0c48ac66f9ab42a66feae4e29813bbaa994ba578cf08928858802ee9d661c0d56fc2513e195912a914eff83fb712a921700a9bfd070e7adf22b7cb490eb4d085bcc0ab3a0ad1c53e449271abeb14cd35b5c0e9bad4912c1b7b80f34b9f3f7aa5fb290083567a260c08bb994dbb81f08c6f57d8d8c1f96ee56cc3ec17106888dd32e7994084bbfcbc6752b64eafc1dacea6b6ae7f53ae09e5fc68ffd6e999c0d46be1be9a1dfe0ef56a4011d54f3c53a462c5b3d61418c5c2335774b0b339ec33adffb7b9a8aa2560186bf20b245b23b6ac6c31068b9f6924197893ccf4b0d2a10129cbc4ad2709a479bca018b58411ab8b936e3640acbfb5b7b3a35337653bc76d4743e3b5dc826a951b65238a20e72b0822b38fbca58d1a14f1ee6c01c2ee4cfc4167404733585a757187542c986be02a01483986f49cfe3818ba40dc2eb5dab3ff7f00eb93521b20a44fd42252666ff919755b26ffb4072c1250f74f1156169c6ad34e29643a569e9e05cbf4b89f837d50821e25309cddf7c5f8b8e3d49aaabe68ab508a0fd6b2f845f1612b31e0c2bf8fb6a90aee1e29a11bfaab1edd493e21e24e2e95faefd835835bbc4e24efd4c6bf5b255da0009333fb9df98b952b79cec10511d38e4c6f5d3f8a07e5fb95629ac6b7b9a7b00bc2b44c2acaaf640704cceb1821ca33b7207961c768791d9a14448e128e6e85075f2cf8e94514b3a786234acf850452f6938fd05a0791f2c691cbfdb6cb3d87bc11a4e6229341e8d1a8dcc571660951d26faa768b0db5e2e18237fdea99991ef28122fe1ddbbe6d4e12fe4348eb5f9a135dcf3aa2a26d55b28e9175f5200cb27057b128214614a8e66b91ae9a3d909381040804e6ed42b3025ee04c20871dabff3a564c78fcca03605c9eedb08324a6e30d5cbca017bb6499992c6cb3f7557167d21b52682468e4868c2be8d2e6a13a031fd44b184761d03fe87dbcf6973a6c70c807223ae776b51ea44387488e91b6a7e3769796a6ba60bcf3dc2430905605e1c422a5366c7dddf14bebb259a27b8498004c89625c507ad761508cab0931a2846d75c1a3dc05c4c72a2d514e4ae80b9e1f5e09c390ab8859dbe2dcad2b51ad1f6c075fcb5e94d268e8104c6fb05fb380e8b200036b51f00b0899fc7f1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176aadb518125cb94b7c3725f5c0755ed4da4683339e4df690d4a41c5b077be8af14ac241be4bca46964a77874043e089be852dac7d1362afce4b78769ac5b20b507e2ee42336bb647316eaa388966872869e8a9a9deb2a6581b5b2601a8f765e7c8e47c019ad44f43570f43c MD = 844e1f50dd792b283902e66bc1086a273c05d511 Len = 49616 Msg = a28331a966b0865892c2c76c124c50a04a6ecbc74c4101554f75f1205d391f684b5b2f15eeb1b2418cb740f69179c73983b422473838ee1e4790993fbce5bbb31020aa4c584f492dbc4a208c2b96b2b74d890a55b9af98ef696d3baf6ae49f67d818c9d40a52f0250ac38fb74869b8238f37ab7a3770a7cf9d5400f6d0fe728c8d8db5376e82512f5e69b4fe50bc828431042c3d1a41c4c7cb8c109e55fbdd2b16c595fdeaa61456a085b8e9ab55b7e21a39b627cbeb97dddb5e922f60a2874a5b0992ace888e19fb85fc200c1fc0045341d70bfb036c71bb512ae2f5bbc19f444a0d4cecfee5e148e3ffbccfb7b05b666fa838d32e9fd8941f08e28ad113a2eb9d482ea07a136bc0b6d8bd4bf996d3c98161619b9cee02e683f57a1be699302a2ebc589f8690f9f153099a0761de1e0b2bb52ecaeab191210493423f68ccb77e72ec4320a0d92c695d24db989d008a99d2f5f8d77494f3d22544b35bd428b9570e5a86da55766387499d0a65e7a8b9f3fba64847e702bb887a9c45f7b527b65255898c2310d33fd98ce4aef5fe311ca81a6895a2ae7548a2590c829988542eeefcebdba16f8a31eebb8e21df3d243334b39f896e27873bbe6507f1c7ca38939b4913edcbce05ca254a1c1b78110c9e186bdd6c010e93054b13310bf8f74f74c5ee744b18b8d0691bacf0f4573664adc18784e601b03325b6d7fa39a3abf3531d319f7c0ecc64af4078bf35030996e2debb385ff6b8e22db047d6236e34eeaf0fd6e7e914554d0d2221d955f2074dedbe6b5a6246852a7d95d75731af4e7bf8fc23002acff003f33f3cd1efaabbe42eef0c8d7587a176a5f60affeced3535c180ca5aa9a83903f1f62e3b6a9393e416ff332402209a41374f5722cdbea5a6892c2179fe238cc7a9f57a684f532bd8465d63c0b0a7dc24921040824c89fc38c06cccc080c857e95baba5fb165fe03b3d8812e5d983e39b46d75b70f1d5c586f7b120d0ea0d46c3b797357648205d875d0db506155b4d1fd6030c8156388dfbaf97b21d9278c5f12e26ad3c6d2b0047256cee93cc84751cc021e835d218a211489f1529029141fc200881effdf654e53714243197a6083c85c252f10dfcce626315ce65c2cd674f4d8b37f36318d80c02a1da41ef1652d9a752e155526b5f597fba22664ba39265074d43d944e91606088485573b7c018ea55227e557cad1810efac5ad15aa5fc7ddbd4a140c0d7b7dc93ab9e4154d70c5f05e7b0386c1c15391462caca9582c0241599f3620fc94cdb532ec6b04e14d1a18c67f4257b6ab5b972acbd78f13938ec2b0d7b24c1cee906d1ba17e72fde2e59f28891443300c03911737d02f8302d7e241780ac604d54051435d70f7e9cec2f4034d1be1b44fe60fa9d509132d06681089e4c2274b0567f24894f4fc4b8d3ca7d52fabbbb9f37d734147f4d2681ad9edf8c25af835eb71d0a9cc7d08899abd3b1ca55629c7a3245c7be515d5cacc87db2c8547b17bf3f86cd5887b952a73cf1e4842adc453bb853bc8510ea5cb780c5883a20adb73bb66275a3d633ab4a4ecd1f67c1513e4c91a91a50021baf0c9d1e6acad36dec3ae35b0b67fe6619eaa80e695d61e8101385eee9067119dc11e7325f60b4e53c248f17958b457926ef135dcb4e53c942fa5cca3191a30b6b3026a66fe40a3a3261823e1ef7f4955ac157624c20e01d5c67dde7fbd8e11ae4d02125a23e1e9753598479ab9352e13cc83cc4f4bc4e0ce7c4d1ea4ec3726ed058a1550156382229755d704647a986546d8a2ccb0ae5bd6a78007e333aa02eb7326ede93149f033b1bd4caf6fb3fab2a160841daf2ef596deb3249b125b1831fc5506961619d6311b4b32fc4975e79472d7fac285db20778852ff3d06cee9492790f9e7123786a34a9c049b6034c183218b714bd3177f014aebe2598f89f8a97b67224cd44793f2b60c4bdd72751af73417822a258863bc8cea98712af0c8cb7e442a47daae80b7e4386362cebb766930e8a7edeb827111d4db6c0457a7cc3786b47c5873f0df5b6b9d05abf38c46619e9b4cf793ba29a9a93ae793a42395665b44930f5e92f265a2968d197f4c2d78d39bfbd7cc83efdc7085859f7ed896e0325108ccf9298c5f2fd1744bc09f7e1786574f2ee4645632c157e098664b533dc2763821b218efb069ca55b375dacaa60d79813d79ffdf35220e630ef9004cc77230cbae37e5af01f6edabd0fda285dd0f6f6cb40baafd6c09359773858c0625c7fd1db2e9144cbc4db7e134c67b5204d2a55bf307fa233fed49f866ba32f1c14a57b8e054293b57e4b5804f7eb991b61db7c9aafd62033954d80048f5b9b2326fbd27a6f7991d5d426313916501d7893713402c5a76ffe0c64c499ad674a9e1aeb9d48741e84544ed4d159b47d895c6b54459f7bdad8bbeb8332eeccaf85b679dba69f1c19b55974bd000dd65a25f172ed771bd857a393bb1194abf41b9393c935b32870526c0dcf4a86fd86cf385f2fa2921be40618ad0276b0782d93be5c95608d8a77b1f197e6e12ad0cbc40cce2bdc5d4aa8d07f324b194efb80ff4c3a62c4fc6e391f8b2041ecb52fae21e765ec04a14d2b9b1f491b6438dff4478654bac9c77cbf8283d069d1f0c135ce124cfc8026cf7651411bfcbe35ca9253b4d324d7b85b10c421cee5faa02f6ab3d5ace3bab4768fd82dcf758f0c65610b1ede295695b434cbad433dcd902055b977ad271813ea801a2b8e0f40865769580b9e4fae272e34816f56fab4873dfdc6427652040ad451fd838050376b48b220c53a2147367217ccaf30a3164c2e6ac37c30ece563dc086b7cccc2dd83e2454d92db248a8a27e596b4f8c05aa89aa4996e027b23e4a9af4b5f9bed9a95ca29c5bba9e2ddeaf6a7c6c7d7daea6329b42e6015892656e44d84741458d76bab667287cbe2a91f87644430f5782d4584a16c9a909d558034eb0003608bfacb2b053a406aac57f28124f83779228b1653733a639c401a2c4290a654a60e6d7ef20d072cadc94d288defca248c606c9d3d327f0561f8dc20b6445eaf0f6a964ca986c095bdc0f58c52cea23e55bb38a3ebe725c606500425370f105bc326dffcf8784dc1c119b6e579c868cefdba57f0059a13efb4cdf8036dfaa4a1e9caaf5886ec96f9e25df7faa9e6041cabe6324c325131c792f92182010c03c9a9de6d26fce98284481322948b2f5e7088c52f7f1a166798c95be76a9b4e131b2ceb832f0178fbac1ac39e7bc6ab5e12bce1b75066f09da8807bb382e2c6bdde9a79583b3ea0e9b781f5d3770362ed496ec23388bee8bb41e0e2eb937f7eea5c1b0e54125b6932eea4322950ea5df15fc6ee09efc904a9a91117f965197e80dbd534df7bffdbbf99ac0108cd22a3539aedefa34d304e4f283aa243c059cc69a4f372613fd2ff7800c0ebd8b8543cfc430b4d676a9ace9608830c336ce7728bff9b5042267edc456a097701d72731d3a1478ebf0eb08b648f15dc2f306a78d033f657eaf8a87a0f21ae2debf34489bffeca3c12001a8da307189aa1d68be41e8a2b0ec27dfae2bc6bd895fed3524caaa0bcdec7097fdc39b6b3cff024f1c05f4a62fe307d1c1b3691af38a341fa827bd044fd48f1888110e50f0284e344147abcc5ad9dbfb62d63da5a9d4003e4341ad68a20fc80dc830edb54bbc5da2ee6572879a5720c6f212d90024c3fe2b76a6efab7cf4b7d24ea1de2a9821bd35540ded6a96e152ceffe7bf9cece06a61c2a6184f3939db207be244036e0ee946129f70d7b8ef0e7dfcc345fe7aaff17ba7edabb65f25ae52e080a3e245ca6e7fbaa8a17178f6905e7944208746890fc3a6dc2e93676eadf40d0b9249b7fab92cbc97f3aa6f9ea4dae5d8c3d9e91231f43ffff548da7b668e61c183ac2cf655d7890bebf5052da88dd2ffa458dac1f467e3d7a44930c2448c8f60fc7c2d63d12ab072fee3c24a17e1b12746a6841ec3a922e1b03702d9d468d658615c31c99770b35bb0e93f6a7f7110fe2f258d8f2c328dbcbd84b928a2bdd72656aec28e256412248697c5153bb672d2c2684fa98a8e84a700a4cc451bf6223940f65828175f4d6bf4520bc0f91c4753b4e152e48b37985f3e29d4a5ccac182fc4c57b2dc9ccd5a09eba7bf4343d0edf5b232fd6aaa84943da863ac1114a5978368ea405d9573b50ca338e25597349f439904ee6456b07d35a4c973da64b46912ad45b56b2790efb2b4fbaeae5698930e4db2899f7fa64ac21df4261e849600926191996d19c911e26819aab648a3d03c14655683ed0e03ce5d0f4d443af464e9cdf572cd34c8218405ba5fd534fe5eb63745de79678fae40aa4070b64f769e01399acaf240352a7fd4055374e3514565fd79a8e7b7d155004daf18db8bc3b4c0eda7284405b731bd1d2310f91e438d30b02a3c36a37dfff58e86cc1bb584b1103045152b4af74025283c1eceab7c3ffe967f23cff43bb509b4ea15de97609ad84c9c180fd99d5e9f3c77035952a563b9f9a1e41871b27e2309057a8cf700790087d3b95878509413a2fc4904dd66ff481fb7077be48b622bd3ff838d9e0b556f2a13806ef0b8e969a3f4773612661d9351ea155f136d690a5b00b84a542a370f7c83f6ba087e658985871656bb4ec482d662952cc8019ca6e92fa229e00526c7c74ca2a28a4a105c90dcadce9ec5fdfdf8460f49c9ef02e8c4b4c8930c432a7f51950c8f3cc3f3c80e1cc4058474cfecfdbe0b20dedea3b836b8b2f19e8d4b1f6487bdeae89215b6456ee463340242372ef41218d17688ff8563e9a95f8a9290464a3c19545f7e0f7efb935078185ec6d30dab996960b8a3fadcf42517e306b83f05118649d137b901ea5c34165e2c8134345f0b6d443b8edd4c5bcb8e3fb08099e0c5978e90479e1664c477d77bb351988fb5d7a6c91aa676daa7058b4796d09a04dfb6ed45b6a5059155818318fb1c49463563dc985cd50caf5f3ad8a3c2918c99e74a2c988db5159896bbe2dc0dcc8d826718d6590902e9f20bd13bfa3ca9b5c666bb1430d3b890a20f8bbb70f047ad6bd45e5eb32a1553cc34347df40a025eb4e3706db69095bcd6495ad87bac77f028039e3a4ec6f5936561ca663a3683ce8be6d3ffd1cc34e25dcb91ffa64a42a0e27c3e33d3e58cf1e41afbbd74c8134f72f74b912a907d495e1d96f999d19203c0c8a811ea8fc1b471e72f4c4ac69c27919f40ed68e3583b02c8d38efb494e63eb6e429c3acd7c263651ced9623a059f11651ad934ceadfe7153ae8575bb5e068af6769c6ca6a58d58df402d672b36ff1ad2421e365864dbd24691a8ae2eaa35c6e9abd827232532021aee10ffa2168fd36d1e841589651a4d2ae3bd4faa1937c7ce4819144be25d5a883e49d2a68f9765be17d27a6998030c860c8dff379556b42db727db26c55688b399a2893f885ef84d96d20c01e5de34e274e067de06d8b58f5fca23bcb664b52368e1cc75ea2db2a3014a745835f2f0c6837e2ea65206f47aa8ca94169ed0095e11cf42519b4cbe47c10359766e8866bba12efd9862289679faeed73b63e3abeefe3494da840342c13fc564647ae8be4836b97cba1e86c611bdff9433efe2c45b95d86a198d9a679ae2573d293f5a21f6aae852166e67aacc59c6720728187b2b40826a149f58545911838bcda726b74c658128b43b156a3137081abef8ccf9e866fc3fd5a0863286360ff6599993a7d2cf4ca59a6bd62fc8bd903460464565196e0c8f647a6c28a9b8c428d4fcea1a10501372d2e8f3211a542567f6f9cce847c27b03c713525f4bff6ac646ba74378f519c366498b467ae648e5b86fba9aaf9c91042085580fef373c97bb8ba7627d638b09a5665602a0c5694b91b3324d2b7eb95f52f263d2e2a7ca8ec30e43b116d6f1746b2364191bd90ff29ba8985890a90d0c34270d3177782d1c4b9200a1edd5c99e180f29dc5487c97526de513f678208b554b1a88e062ed0aa958562a75ad69fe13c683bded358123dd3b2f17428b038c52510ca5b273251c44176ee44065fd0d868ed0e9320d066d712d4fd994cba29c635d2e71b43392cf3cfd5080a48e7f8fdfdfc168bc57753bb7492ea115bf6382307668360f299cea3912e546cbaf594dc9c23e84b29b35565799b2b7ecefaf0860a4a23aeadeac37e55f137ddd50f20cea3d2f833c62ae86f825c46243e3eff49befc4c76ed8287ce5ebc36f01f9b297ea5b7cae8432489242f34dec3f24890f8b60b623c2a17a82e4bfde62603301b572210e4daf966b44df0e339b0a39e721d6fe609610c1081188e14a9f2285472d2a99cba8e8137f62747b60b8ccaa6ff224d2aa6a7dbe3cf1795bf16e6e78ecc8b9ca9c065533ecb5ac43ba8aac008b491ee27de533227de96035b9166c93584ec8bc69b11e7d1a052c6f2b5bd3c2a2ef6b38bf515a7432c2e5758ce1465ef487fe781bef6c79721a9f079a7169781badb4dc5af4193dc544af2551152161263a0405980967b05abbab11ee1695aa6049a1d4341799049d37674cf0fb28255731816bca4736a93bb2f897118f7fe1d88bd92a370102512263b4f350db8031f0321eb398f002ec7ec52fa0ea2750a4eb3d05e64afc7badbc903f215bfd540d570683e4e94ef20289bdf8356125307c0125cc0e544e2c9ed385b0def8a8ca42f6755706a7a72f72c661fa5d5ed046f0820dd7ac3f403eaecf0bae320f260a5734464222b944e0c49b7bde20c972bb88d6bbcec7f21ad96518eae12689bd3dd47843ee3e076d2e8172d14b868a51b6cc66f757685524244a16eaf2c14cb68b422c32006579694130b22dea988ab56045988b1d9650a648e532d2890c41591b27b7dc239cf7824059c355635dafe8e17ad53dc659cbe76dbed26c4d0d50ed160e8109fded69fe53850d115ddde23160f386d7fbb9ae30b95e607ee7ce62bca37cf280365fb726a43af82b81210cd70539111f63bfe1c9574c42d1fe575d0cebfb720b77fac9425803ec6976301323fad3e0dea7724cfa6d10e22d3bae2b261612697068c7879a9a655195e413e15d644959db6edbd80b2433a65a46ddb2524b4a3f78b0cdda7590ea8f7575d05ccd6e24e6e061006b43a33cf81fc6ecdcd7b2295cebf715a81d62190ed2cf716eba3debeeb328ebeeeb13b33f4564e18fff74392891e7a5dbd8397a36739afdfe6efc26d91d6aa44a4b9b20e295c7c6b510b9020c32268759ef3d9670227f7df32fd15e0ee6cf3165ab640c4bd497a23553a80b6e955cc30caa95f422a525f83746e419f7d6019c295395ffe1cd7e7ef7106adcb783325fda506a1db6c53676b1fb5ee2fbb5a5ed7d8a577f0c472261e38f26fd50c44f65ad2be397924a57004995673e824a662a489ad21634092b53e11705f79f205ddc6c8129ec20fc329ce75e26b7f45ee95d74c92d4bc1dc425dd9f12f500e5f01cdff9b63a3c6a36f55739cc4d4bab9d98de86091a61b880f85b366cb930448e53f4dc1ba45ee06b630d598691d3a23dcc38ca625b0abd539d557bc0245e9a4b13a403a5659ffeead37f69a3b1bdd649a0648e512f0d78b6955ad3bfbf0243b0dc7bf505e676123ff71bce965550b43bd5e04637fef0871460c9e2ddf1b1fd59fecb349faf87b6d52e610cf0d542d8aead3a86a9533a750790210d8d54f413a12b3026e5493b7944f9fdb925c9ea9ffcb6e1c407b461af0a93fec860613f2310c24950791c07c5f9da3037b79bde96b0836482d5ab0cb197fcc1b7d99ef9a843546545cdc073397e4fa72d28c3953954934157b5af72093a2b08405b76ba1f9372127b45bf14204cead0edfbf985147356e6970a2a58325bcf30e6888107059b7bdf7593605126e01c3c1e938644a4774ee2e565b415b99729ea3ec33656d6b6023aa9196cb0b9d2544713a1f24a65eafbc4a73ac5410b56eb72adbe1f301f9d75a2aa5a3cc9559e33908189d61cc548edea710be650a4258498a7bb94094c9c76a5ddd848f1969e3a96dccdaa226f1b85e2b74b9fcb007d759ad15e4d68fa5d65c2d80629dfd96cc9c889efd6f1bfdd643c0e9c4a26cce94f17af0893d5853ac3781d8647caba8461a41d52e50133f8f964db507dda55d3718d956d1fb599bf203402bb3b68967fb2c80bb97ce76808c5eb921ab38c47d67d7b28de49af94750c854c276d3019a90d92d965d70ad8874a3ee75d8382ff6cc35eddee9a29f1d6d8fa4e5d6597a0bb02a30afabbf1e1ff06ed3f9b5674f900f3a73910899b5e7f25f18dbfbd25c800125714ea742320da8c650f56b4c8c13d8ee2aee6b09a26b864198ee0cc50ec22bd4d9bb7981511943b34db0216f4f46ce5afb3d3779ce72d23c0c6431bbfa99d73f4e3d4a04e40d6a3db2730059fef29a85cec59772a1c37e585c86943b87ccad6db91d425451afc46d6786309103dfe4778ccfb17b8328319d719c5acd1d25546603a488f802c8fa4a5531d89fc4d553391ba3ad1cdc67931431eeaef9246a7532121745785d1fb3dc62bc210cab9c8fd26589b4dd14494dc485c3b6480464b7dad0c1a05dcc7e982c776e325f1efb414a51c9ee47939607b655659a4126dbc36524e9c22db6ab50417d90342087bc11aac6aa82e1c11668f08a1a836df09740dbf5d6d273836f84245a6a4ed84da5a6f9ae7598330790197c0a2b9952cb5fd7442dd1f9b49a92dcdbf844a90ed87fa93ff0735ac6cbcec262bfe0037a20fc30a9b3225f7a65dcff703d666c4a9011c18474e9 MD = 61ca85608418090c78ebe8614bb2b80113fe130e Len = 50408 Msg = 2d18667cac7403ce75175d390e00c5d40025ad5fda64c5d678bc634685bd28e03f3de14c7a4dab40e86c5b5097fa1c08bbef5a38aeccdf8f35d23c6b05726bf08606b258d6beca8911dd41edd0251d7eef8fc220944016346cb9e26a384e7cd689d9a347c7afaad478d3d9b7bf6a105f236fadc092a8b0eea6d91dea2737a2bbd01f7ac156089147a6b7e9576eb23cd2e0f6e3c0b3ecf6e46a9ab593d81626c7e44100708ab1c80a22ef3a74e5e3ea00ad8c2bc7fcf5303f4064710f55d450214ca5fdf96b93974674e594b72be6621012994e7d77a9a626b09f1a03a65768f290b539070194452325ffbec847a4ec2b9785158b2bf19fc243b3781ad189b66139d87b40559d1cc8bca7824e4404d079c5b9459920b6653a800853fae0518297ce758c4c6e97625ec144a6f227ed5521239ba94e5fde3eb7f006734bda9613bcd7f635d45468600cbd3df35bfa49c44c3a940853ef5273611916a0b6c842b2f7dcc23c8010fa5efb37fc3131c5ff6521900d294fd8fb4b5f859ea1e2b13ca770664169f7a933a452b7e8281e8ef780c9af6cd5eb23c010dabc083f799d6c3a50fcdb86e227fd793ac5699fc85f195d6b1f1ad4cfd78808f944ba422095bab3bf27f859e8933f27dbeae760d73f4d44306680eea2fc3d7de5a71e72819f0e59e46e00acb2f4e1f45cadca31f4377b7c400e05eb0d9bc6b5c56d9a9644c65075e8595b45e752ca29e6977bdbc74d8b4ec29f1092b7ba0bf9c21c9878110f684ff27071ec30b5e40da02f6026f78b6502de9f0bac4964f490043e7fde8e843e2f2b3cab6b352616eab3fde2d92df9f1e0be985d016a9e69c4b25ab791662cbb5dbb446f899dac4806468969be109e182f87116e59c37252dbf5f9a8593f0fc520c910260d115062ab825c5e9b4982c0396493a67cfbe7971ef4a2bafdc23645c27d2939c038194d1f8ffd27397fadd2447ba56d32bb0520d5d8dd554796a8248900160e6abb0fefaa94f42e605b283799f4cf2b42abd5d548c832e1fd636d48be7a5f0fd3413a3196b9cadad784fad580f8994875725e9fbeed2ac6e8d38e9ba8128da3c273a3fb2928069268a32b9640af8c2c93b9a964816e4c6cd08c120491f1273100f95136ad0630c0d960c46123402f3f6427bc0ed774213b7d36016abf3fb523567a4cc8687ed0cbf362cb1d6fd30aeaaf65a1830927309cb67a64b77b23c0e0899e9d9ba3b56f1b7e524bb46d92a6933e1a60ad5eae01f5440042d20dc5cfd0640e4b96a5d6941842d7490d65a38aa4d7efff7220321caff06fa3a3bd4e6a5bae725ea0b807c82a079acf109f2e3e83438c88bc95da0a33806f8f12d3e619e92e71dfa3227092b99443e4a5625c4b9a4a98027207cf52e8bcaa0f0796b465e2adb4d5862c3b7a2db27991b4f854384fb3bc767cbc387c356ec52a6a4fe1d5aef3e348311e8d08ee29e4dd25a73f8d0c489febc2fd3e10845c6be9234794f2b5c8a5408b4091c564c12dd0e0b845d338cfea692b1109973c4f42521ac3f64260f4a2c67ed96c38f741fc72ce738d913a1144f9a142c099c40ff270380e2f4f153e83e1f23349ea1073f8ccd51f404f7cd656a10cd68c9c86642448636f66a13d70f09acd944e61151dcae5de05859665e5c76b5216942ae91680e4842dc4be415090f8f845a32770081ac5d26e85ec5d08405f5c4a01ca55ecad4b8491703087a70c035b8e71c487fc8f7597a068dccc05698412bafa0532b0548549e3927f793c0bc3deb6e0bec4c1d1fc17e455eb1aa5e9e25cada861e9281c9bbd6b54317ed936416a07179f8e1e8962388174a3b0b06981236d3268e01dae94c770dcd0fd443584e5c73fee4cdc5fb0e4c1ee8bf4ee906a4d40c1a28056b1784e3c52e46046af94393f7f3468c3faed02eaeb2b4f2707a4c46f7d96319dce4f3c15dff30ea74d7a4cb700f8499b03217a45920c2a2275376e418dcc5cb8ad227844ab876f2fb63d0877e9c2572c2154341a0cb5eba8832c35001acc6770f5f8ea10dd27eba692e553c6631bfa3efd8f17b181aefc81d98a00f24b1fbc8d4eda7ac39d5cead38b7b17ee96899a983ed90d511880c3751e59b661494cc1d762cf10a415acd47f47053b35a9969f038d3bfe43f9b2aa4cfaa141933bdbe016d6df94fa6aa211726e8ea7e4c5ca714792bcd0d04dcc17cd176b88d14a5480115512ee0ec7c30974a91b434211ac782cf4646c3e3c5774c11abe73629e400891857106285299254da0b6f799b6c41d7a5c3bbad5edda28f0aea3ea905e27e25e0e03c48f33abcbc4fa66ab2fdb9ac6f8714aa2df89dd9b227921d5a1b38f754099d1118d938164a35f34474ea9b7dd6fdc980da237e8351f23401cdec40229ffcee1d3689aa459b07926b33c48a2c8a7442de16720845eae5508a88fba076662543df4696f9b10b4ed47d741dfe3f168521208766b387e99b7825ffcbc279432d4ed5ad83beef376669c9ba79603be7aae4e6817418dfda6f0b52a6cf3e81b37f5f7effd252669c08a2fe8b4968999a4ffe9eb92ca0a439ea9aaf22986d564396065991f56cad9580107a4b207fde9afedec782e2d37b84889679d799e73d500bc3f4288f562ad07742cb9e711e81564225ef635939cc56e39f614a5634cd753b28bd17e2b764c958ba70d9cdad0878843474fed23c2d0d6605f40f4fce7d3fcea532e4a208f1ecaed7f8a188d40a6e6fbb06a9f06304349a7a808b092cc2fc10b9e4134fb348b6e43bc17a550bdda45efa02f92636e848fb6db531f4c84556bbe75f283e5eefb4834679b894bd18b6cca1f86106305fd7034ff0b8b5396abc2aadf29810544d6216986000da80321243235575f2e7c14b4c91d173ace8a9b8d78e4ce7484be84c189242d798cdb0435cfeb8ac8eb5b33221e3c5f75e6e98b96cf8cc9a589e46df03d460a1521e29d674b480793c32bc184db64cb83c339e5a358e0025c3d3ffa762df67f288f9f52824b54b608dd7226a0a89d43ae8c05107dbae761e1c756911a003b74fcfe9b8c4d7a18806f62bbc93e2bf0af3c6ad274ec9ea9cf7b50b19ca55f1ed1d7955cb4917d9b4b0f798b14280f64f776842a79b7ac2f327300d981e0f1a57e027c6c3016ffe601314b6c6e25fa0203a4039487a88b807411fe55aa905fda63c5dc536aa4a6ff881dffe53ffc95d1bb0e0e990685e4a47b9d73ad7d8050c56967dd97c8031af0ca1bbe7ff07687d908fbcebf5e175ea4315f866a64776d6d7632a6c2b4fa04c1ad73b0c0e75b7822d0b56a91f726a2877c9f6013c63c5eda736c605c95530c781b6cfc328d7312b5fd820b943a7a575546a428300a98ca14495e32ebd3d4d91ffb4fcb5d4a85fa9975abd9528dda261776b7074a9a535924de5045f9d64614bd346444c8875bdbd62277fb52590fb7d4f42025e8dd35b4111c8ac00d0570645bb0f390fbaabb5b75ea309a1c07e2b194a827a9923b0683e3ea53ccb0ca1c72005644d67e1d6e227db71cdd39fd18bd5f7a14bcd01c8d6da22ff591688c10e6b40e9f3fda463cd9f67085ed30a57c823e522e852be8931b57d5b636c0b415677fc04bf3968fec28e8fdb1f18966d5a93818be2d2a07e0350ac3dfe43da8f39d6a5491193a5f48b65c46e912cda7ead956b40cdb56e23c62c1e1b7c269d172317cb3b9d94e1d162c5932747883d284bb9f0e60b835df6f4a861788f9cb975acbbec30b5c5b331f31e8ab9c4a334e6bf61b0e02ec51674096604d98b0eb637212366dcecae9082b6e1099a7b165836733d29d399e32e378ee586b3110529b83afee9a4c4b7e04028bd9e2ded4a2d9401acda14ff65eb9dff97459994187a95549ee30cb05a48f6b2f4b6f89dc71b8bd5213038a1d5f533d60beff186a12f3b0893c199423e2112f026f28f0f05b88a884acac333bbd175aca3e46f8b37ce35c17e23befcbc0f216ae4cf55a39e7b1c757a1839177fe6ffee0fb147f454cdf209ae8802326c79ae8d8eabf11de9d9be374f96feefaacc2f04afd53f7480a51c6bb54ce7a5b7e726d2a526c5b0805aec382bc5a90ec4e77f9af4ce9a6e33fa01421300f3a926ee06d4c8be681dfa853312af22bc0746df8e1b8f1c0d53f7234d374842aacf51d4dafe69d13ca8a0df0f314a4cac6ba90ac700cf3becb842b75ca5e560718a91522fc9f91dd8032bcefd2e7da1eeae73ffb6d545acdd2d9f2cbc385b08ec6d9dec51c1f6e2be9fe3eb6964c9a117423034da2372ed43066509e849199a7fdabfea0d70f3ce44f171aaf07eaee8aab95620ad55e78ba2e54cc56d72b1a3a0747ff19f51704f2f8a4d840ec6add72d966e69acf70406914cbef5b82fb392f2ad6699a3ddecd3c2dce01d30f736faf44bd176658168cc82af23f154da8006eaf80c28a780d9faa35bd1ccf36aead2a34c37cd438f866bfb7f246ed02db77dfde6c94516e4b82245a98b19c2ac29ecbf3a09d4d36bdd53605f38c49673ba56bfec36657e7417f92e28848a2b3584b7bc87b023a1b0de2155a1c9892467192f859acc103ab979ddc16b46a489818ba20fa7c3401af929344ff95f2316524466f35502cbf81f4e5eb3e459ef8a3a9f5a3d2cdba0cbaf1f2ac3c87228c8cfdcab9dbd72ff333005da5a2626d1a9ab404ed98931cc104d50733581ab00d85a325bc9368520587640ff389345e1446e0ede594f9e38a54e4d9c29d75251b17c05f62a42b1e5e46c803be3de2f94f6fd6ba720d2496ce74c6704251c1091d09f9819258491a6638d340ec0495c633dd3e737e4d3fbdf42a24d499bd25e27d24f89134f5eacf85242ece6627754e2957bf1ef09a70e0663fa60eb129ca3aa230659a2fc435c324d381b515eda91897a701c5b03ddf888b7bf32470ddd798f4f5e7a16d0d5380a90e73fde0a05aace693ad6fa57eb63ccba5b421c0207585db3a27b0d5186c8e7e9bacafae86af937fe46b25b9a41a858e87900a883ccc88bfc9cdce4f2ca7730942d5d369e9d154c861e2eed3f935ea3ce730e9b077032908688004c3922cb9b4cd966ff80fe7772bd4bbd2dbc32ff33d8e3bc51f1a43f01ee0e859199324e7e602968d43411a850f039dd9ba4b3028fa445aa7bf6cb3666af8aed53975b78606ab7e3432c69205dcb8310c56d95f12d9d0359677b77c12527a7a800c800c1d7e8ef56dade8767ff9b91f7298b4e43843fc739a2f41c57c3f2cf36378fe4c34b574a43f9cedee7bd0ce0e136826e822a18ebdbbcf54b72d9ad8c28566359e54132432b2e71e2482c8c1a6f8af759359594fba0240367aacc9448feebf6e2b03006848ce76c33d1b4959902853ea0c64d5071376682f3581363901a769f11acce4068e9c312464cfbb5d74ab3ecd7ccb7b7e6f2030891035477ec0b74e06943427c7ab230188bf258796f98a56660a17b57b7706808a344f66dd752655f5c1c53173486bcc3976a513ccc8cc85fcdfcfeac8d332417cc957fa1cc8fd6505c8066bd20c7d7c7db2d7c8c68979b2d9227b812b2aac59a5f6d66b0460436880d27f3baba060f79d9b440e4ee39ac543fca4e46d247ab24ee453205de60045ac06b90ac8ab1c27e058734e2a7e36a58395d17a566aa633bebb5683ef013ce4d28d3b41efd6baf29012ecee2303553ce1148aabada438c33fa267fb815a002d398e8d46e9c94142f3f03858011aff71a4a157df3c7a364c17c10ff0dd9853082b3238837e2bb9fe531bdef28c6a3d2c1666c17ec992aab58f41d5cac9643e5deea1c35e75a52b0ef6ba66268c9c16557d884ff01d979be6ef4a42f20e66c814cb02b64198de9e5a25f6595bc85793d522328a9e002f12c67f03ddce7445f9150a7d9a93ad7f1ac927f73ef80944bb924d8af8ee3902163f87952ec7c2aad948f33cf6bc7d2fa74546e49d67170b967546b8234992b9af384e28bd46c23c7195ce645224d0974eb6c8e5ff0fba532c6654e59318d1fce59a1de213b13aa4c8e5e22036336e5e1602f624ea58bac4864ec039cec1bf72c14b3ceeb771f389e61e78962b511e2d081218c6e9aade07ab13d3db5eae24c44a34f37231efb594d42ad8eeb8e6a9ac2ace76f6816defc4a39fd2f4cb45c89a893d8a970a92476d99ef4a51665ad882861e57da3c09b6a277d808ab9bf0729a844f4884c9c173bb3d5716e7bc15715824eb059aa1e7f84a2ea8bc295816ec6f45507662f6e6ff26c94983d7427f3cd50a1bc65f386d8064d0f63595891efcbfd42a5c581968b45844acda4a800003a24298e3518a04159766a9bc18b7726b3337c3428fbbaf5af6b66a6467ff018c66d448a4971e147e8bf6ab99da697900727805702e6323b9ab286a665746e8a0cac615505a7c0684e98be31402279b85259fd62d5e9a2c981ca0942b41dd1f077622e631c12d40ef592a3975b97a40c0f3b220c347e732c1f429d0fa4e4d0c8911f0a28df5b82c8782dd950326e8d07b85bbca7810d29dfad9c8061aa51d19ee433633ad1da531130dabdf0772fbb37c82c1bc95e2e3d50c74871ed470d5adfdb6fe80d9627db65da19dffc9c43b528c93cdde61e4a342bf6c6d0070d4fe2f7f0f4f7158ecc7252be7b9de91452f137260e618263f994cda69829536fb1f093df932ee74e20be546870962a71c5f5ff89014522a1a4e5c2715cfc36d0dc0a2fc1aaddf736cd25e762895745273539fe4cb5f74b79e48d86c155b735f316962871acb2c9eb4a2f8827263fddc6f9439ffbbd06613f2112a72142f8e5290a3b1a5a291be3ddf061b340f7ee38b3aa99711066e10864031b801b851fa8f52f5f71d5a097b9818832f52a4eb10a8fc1a1fe254425a5aad2eece1a9cba15e9ee89cb8e93a4cf685a39ca5dcb36a7adc703b394e522dd563922dd990a569069c03083ef82c19a14eedcaf55cdfdb4b033252df9ba86f418ae4e2b215e53cd176cea4772ee8cbdf9ce9220acf774a6199e8cb9de44c0ae449ad7534df95010551d1d62a347548f997200aabdb819e06c51a1039d144e407c9744d2797bca0eb58950721b1db7a376619eba22807c17faf51887b099ae7f132c1d253e46300cbb0a1a0224e2348e0325c2eb55f109a1780149b2d3556faecab1d6c806f910bed847d07f6b354993e227239ad28a5111560ecb115fc7e043e5c0e8375e04ea898fab2a665877657975fe276512acd0ec0766032fd071cef306e1e7ffbdea2bf163ac7e4367292693410344b6b0e907962ebf886abfe37a20a09d5c8da119639ad6d4428331eaeb75d5ef122c17bf63a41e63c16e787d8051454bac6da2231fca6bbb2dc2230d5295971a0621d1a083aa590b5487b4d0600967855e2c2b97cf1494b9767cc530ca77270c9734593cd5fd811ea852df6c97bd79d2e825c7d7d00dd467e31f92d5d19ee83f5bd018d4d9221906336c72b295e20e9ce106e173e12acd3eca27066cf6716d4aaa81bb191bcc735a9c10f932f91b987bcf2c12ec70dfc1b6b22fba76a793288739c59a6a0c3132a4390ced7e2fcea9d80921d6b1edb16468219609837378acad501851483914d94b909cb9e4b88fb54a3564a764d62427bbaef68e03d8a65c05a3f65a5400cbd9e9496d091701b33d3aca80ff65c8cc7e2990cdb2785580d9289bec2ffe11eaa6d5b9ea3585b9edb4323ef3594513fefa4a9d88117158bc869eae663ca6dae5e2c96890d9a14fa3bcb909285f7366500e972bc2256f709df6d062012afeda31f01cebed6ffa1159b947cfbc4c712e543d87b1e858c33bc9ac564d2955568e7361489a7c6310cd943c56f91bdaeeea7009a4c677362cf8a409a8d66b566e661eb8e52aba5d55d2d7a87efbc3752d1937f566d00b47fd55d1b1307423a8770f98597ae323a969af88a0286e4f95bc3910735674f108d4c1c71595cd0ec620c974e5627a44e19cd24b95dbb71cc72cd89e15fc0be4f313daf8b931376939fc5238cf4446aa909fd9850c116cb783ff56356fb03b43815affdb1eab59ef6e6a08588998dea130c333c9655205bc5694507ac32b59994e1aaf02a86c9afdedda7a68a6b8b8d54ca76f8d54260877b99c55d2b2b60d42b3d376f408ed711132fe16cd995c5bb33edceb453af5fb861767c4e1d0f8bcfc5cf5c63392a682b5d8256c0bf3dc4dd7a1a43585ac5a35740a972c0c805bff12a4223b25e840367847f0f8b828c0e59effbdecc30abb6cae0d9af9c763683a2213c9445f7c1302c4fcd13b36ba92d995b38a6f81d8a207b09af3ccb6dc95f4a7465b6044c0c77e387146a22c2bca9038579a4c56b8a67d083d22034f5e7db51e96791d7a48b61f2f4fe1dbecfef08013765de1960d2153315ec63be58b8802049e72da7496675c25e313371d968d4fa37a45ede468bb10b89a20e53dc63d51d5b90935a81c63bbb8d55b4212a4f94564edf2cfa63dcc4c0a59e27dacb1163b1e907cada95d33c454913a9b808cdd17c44be4e5700eed5ba3288b93a6be9b044b9f7da0dcdb4ffc95913191dbc0a12d6e1e8cedb64e96c60f707c95d0514463f9506ccdd70920dad86fc0c388e2ddfcbed06b370d9f4121cbec4612ae0b9ad0843dca731c894ec5b98768af1c55ec0c32fbf06fda5374d554d67888946016b098b2273f01be32639572b9c30abc73e2670bcce6911dba8746d9747627d140aa937803804b2a643b18ac049dd868de05d78a4139e6508a8dfe6fca59dce19124f0d9dff54d506c92afbe09ae09fdb2fce0f20de83e9e5d7ff803faa2381380965d722cfc8cb2b420c703195213ed7b2e2fdd83600e59bbc3c03085edade9b79525bb6b148de3c35beb25b4489aba9f101097323fda051dfff36fecaab2d67e97e6202acbc54612baa8907affe2d7a7494fd9aad626330c9aee2caf57eb5c7e251b3aec80c76c4ab37bcdddd MD = a1f35ddd6a6275fd21bb8c2ebf290a06a2563df7 Len = 51200 Msg = 3a14145dd1fa9e46c4562eed0b0da10d845ad84f43cdb16e29933699b8f7151925295133af3e36503079925bf2c9226bc3924ba24cb00a559eba2e6c0e83c50c43e7d4748dc44b2578463746a2683a46c9b738c3285954ab044f1ba182f7fea2bbd506e81292c30ec6458676c3f2d0e8be50097b80d075b982da65febb5aaa21b67b4f56e7b288533fffe5b2fe70cb97c9e62592fc1b57c741e4734c62b4b0d25b621888b42c803c0dfbbdc3fbe9159c1200f4d04344e01c69f4af521e0ef8fdd311c7442006951158c177726165953fc226defdfe53fa02219380da986f6aea4510c653d34aae1947da7985d8ec33c701e14be0d44e8cbf91484eaa77dfeee0dae87b7d7600b29d03cd2dc40a87d77ef6b7a3426e3f7e9ce29b828c64666c29ba205089b12e8be5b422faf99c3d69aaca324eeb732db8e13c148245070dcc0b0c40ab412bde2039806247ea3917d194a4dab4a38c2121d6c63cb7a007dbf6cff9d1f66b8d1759e192147e60871bf784ad363e326122a3c3a99a89640dd9d2bca85a98d07ee21e2410c006232e53c4c10dce525f993825ef0cb76158c00d491c4163f938a746574c23ef47fbd7c71e95eb2a5af3dd6b90a31819a546c9814135ee74816baf4bec9ff227a9b02a7eef466fd3bcb7d4c4ca27f54abff4cf3da351d516983040f9c566a6f39409ce801d1dc350e270274abcc3cad2152a7b4758b61ed0a650ff59cbe866d870d06cd591620c2932e97d064ebfbf3711b275a947acf22b13949672e46f5b60a5cbab86345d75e716e97ffe6962fe031953646b577d79ae47c1ad4cf941ac129bc33499ed562311f537d53cf3f5acbd97d4f093726fdae1aba2ebf0f3a78276ba7fae19a394412f369c26c8d6c0f4eef2fec22b7fcc3e4ca5fef965b8e905156bc9c20b4060f5c943e01aa8f80bfc1d9299823a65dacc789e9c7eb3324f5c7614671879ab02676883cb5ae6431eecd2df6dd8c90ee2adecff4523e34721b0221f22576accc2c1935e248e8a9d40ed9641416adf612b08302ec190fce1a6289ff2c227e78be728d33cb55e9af0bb27ef20dee38446ff06cd95d86c06e727ed77f70f32f7d0bbc6af8544702023d5c168e40de9c0a5a4cf4a9a52600a41ec263194d11da28384c3afa19a6f231ed7e386f594249c66638a2fa7f6130ed73dfc5633cf93f08c8b475bf97f01acc909b7d3bb3b3e1f72845f05238d2e1d9162976d3bd23aead318793cf3bbcec20cb262d69fccdc52af4f775276df583c57a21efe14a2ba97417381d9f8157f6dcf1b0f17070da93b060cfaa107b43a751147ba922507bc00bce388ba7156bcb5fa8de41f5cc84ae45f02107740d47bcfa79792b0d8c9e82b2db1b668c4462ca3754e097507c36a55a37adf5e8807c45301dbcfe094afe5227d26326a5bad783e28a6a7a16ec7af95b8bc92dd4714bd07075a98aac2825ced928825489c53488ffbdfe62cfb9bc1ab88104f7de6c40df5a25e1697c80af492561fb68bf100429cd740ed9d150949a2fabe3ec4cbdf5d25b82d702e0f0f561bb0350ebac17b116fa210e57c23d7ef7ff50d893c5f2d549d3210cff7ff59298f8710545d738d5b104698f5528fce5a4c6347556d0a759b67f94f5b7b00af16f7c5f9b1fd71fec985a92046a5c0b633112bb2cdde3581d98bf4323b417bdbc55a51384d21229602d8b5ef00001e5721d4359616174617b70f0a0198d2d6a3ddc013154f51ee1caf11504f4ae81178cd9f693d5ba0a700ddfd250399b47bd00732f3d8df153d5a773664864ce701e3de79afeec202be04f25c2c816771d02aeab6d9c827f677160351d8dd2f84565efd6beff073c4f5ea9f3506c329913f782f57ad2e4c7b0419fa69949c1b4878b2d27b118c976eb37c8b8f9d11089a2f847d1a5752792d4d2b0587800b37b9d0a704b3fd0a56885f805e72d8b32c1608147d09bf7cd492b813ccb28472ac61c4043c1b9bb2d79b63bfc2e79ff0bc8c31f1d62bcef48534ae9bf6f28818a1c8bd9321bad4cb432e26015df4da12e18514e331886a01b59b98892c4f74463f74241a5c988e9fc1ca100dd7a4715fc28818b136297ced8c4ddca615d23044aeef5f6294bdb2747af689add9fc4d20881da5258c15edfe31d4e4ba5a82a45a15c1d83372322993963af9a70b06549c5acc2305dc54a37dcdb8168da268b9d09c70f5549efed9443c1ec8c414c96f1d611efa1acdef88b2877fdce6968a55ed6d86208fbf29accf942b5ecc9d4d87e9c49a932c08ed83e488b39d8fddf261faad8bc0aa7dbc897bc7e824874d9b8249acc9540334567b5cf7dbc04e20a8c63f87053c6e82be5791fdde80bdcdba4a854131a666fa335a63fd80afec07b26a04217efea3733700595d93db35c4b2c5e5aa5cf21e028b073fc229d131391a3791a37d6d11fb2f6b1b10919eb8db8cddb110d29ef4f3666a386d5e8ee45fe8142d368bf17fc0af801f3e602f0eba4f79309a1914ad76cc6b9827a84ecf2022e822022ff2b76abe27ac0d86f8ff080380ab71bbba1432c6f2a5178d79b825d29db62ef1d87fa265480ca88d5f536db0dc6abc40faf0d05be7a96697776816ff1a32e2590ca010abcb8535fdced1935f74b5a42e3b08f79432ea3b4eb1a79ab247de48f0f4e25b989860dd5cac421f1830d4510fe4255077bbb1bf398d3c59f20c01853df90c2b3498e5c734616ebce1f80eea6a5f0f820f6b4519e074f1fcc751e4c4c883e82a88b15b1c0c551d10c4b4ad98c8138e366128f072cbcf8c2b39fed02b1afb3cfe9bcc0c036df017c3c84cf782b0686a1477dbf8f28304d68d51fb0be2bac7d14f75d23ea5de9a237ef5a835d1aac66ac3586da6c08f7d97cb1630dd1230516fc61fa93a29e7bb0be954b1aeac3e9558ec0cc4420577a0978c918690e30500dd0aa03b48b810bb95abec4dac3cf53dfa369cca14e8c4d79d79c8e36b7cc03be5c4006eaf7ae2028a6cc66575a85626184a0f656392fd89733ac531b506e96c4d9c482cb996e4f8b1d6e8e25219eab97ccf6d7f792baa1ddf769056b7a809fade397f5cac359f05d48f5caa8bb7375ced6ebeff9cda53fdaad52f3cb98ba74d6044ade6d17e9992b93f2aa768a9c77832cf0bcd15c781909c01acc902d64bcd9b64dab1709a5c05298f58bf3118227614995bd12c1bbb3e7c9f0ee7dcb27de257420fa7d1b070c8ec26f0dc2d2bcebc5b75b7f328fe8a6f145a5e7d8d47c6f45b8654af3be95b41caaef9e5a50b55b4cf0a261b5397758b2ad7a3725ebcad6b70d7afb1f86da7da8bcc7cc2e1df3fc53701b031f30f04fa87c1e5b0973abbaf5edd2a964e63dbfaf62a805b29d012565d015d1d518dbf25f3be2d1e80e87628ed41cc4486f38008d5700d98c50658d107b336c7b53a2f72357682a461ef683ee4ab9da4e7471d6eee462b61fca8989dfebe4217663edb4a1793ec2a8176195a0dc2a69ebb843a930952e39e18df5b220acc8af6aec04b165fba739829a610e22e2fee1b48d560dff03f3c375fd228c8f282144ad3e8083cd69520d6a1a7d540109a7d01d86015ba6ab33f141aaa87f7808aeafd1edf992644ccfacd31a0f0da7ba95c3ab14de48c3e56f31d908e00177a8c14f5d7cd863a7107096321b9ea1a370792ac1bc552bd35d2603b0ba71c90a92f981c46da58e224ed5681b81c49670b5a274160f0e9b517cc8e54d11c62cad51c8058b32c96852726e8103fee9828c04b24dfc7f530ddacef86512b165b2ec6fbd49365eec88a405bc8f6fe5a5cc71e81907097fcaf9bbbe04f1b61bd8d2243739ab4a546775b3834fc1d3d851fabeda573db192fef580e4af198bb38820f162cdca3bb5c2a5fd6588e6b449a683cf55ed60895b4777d6bd375b281b0c25e05cfa148ef5969fee47085ca5abfc0e2fe55c0df52b3cf709b23e250fa4cd375d904f28b8865bca02823ea21c91cae05cf3139489a55809b66e3405a6f353fbe5972d654d0a7acad6c1ac457d7dbba0d319b492bb3c1116593bb97b728928e9f4fc2558b0d48c08d76fc1b56cd216c62ec3bf970e6200a35ec52f0516d8c4682819b7718886f81a90e72f805f3194d6cc8b850ff7b9af4753751520f864bf1ceb9a645e389457567fe24624c90e8e4948dbb56c0ba56568c3d5fc6d9baf616ebbd8bc6d458f226300db96113edb9b94002eb149ceb7db8e2c625539753b63e4155f102d43c9d1c6d02dafd4253b255d9f0f191795536a2df9a4b013197b2f0384b8002c97f6fdd84a62e3fc208fb3fc81f74d64141aa9deb8078d890cf13b43866e1cd9d678ff3dfc15e2e7954bdff74571de9daf701306e4154e19a420012a96dbc6b363d25e6e41b11d25081201e446094d42ebf62e4d0a58823383aa293f329b8e57e485b3cfd7bf0342fd64b23a201809f23e1f5407974bca653fd20be7e627e425bd2577f91aaa25bff9a6796f5048950a3a4e4ccd1769773d1d4a31cb2dfb68ab72141360771d04fa6169b00a42f58f1955254104173c2919c075333f86a07c6797e42eac99622190e9210e8194b9589e0316f952f32e5089ade578eb6c919fd893182223ee13fc01d55edd6bb1fe8216e8a5de2047ca7e1b5a1d8b255c59537cf822866ce1cd04cbda95b52f275f7c026a4467f2919b023d397fd293e26237c32b95c3ee10d7cc6d5d482e526136d6ef0c951f504d1a9d6de09ef7ad8b46ad59d1d4833df7eec354d1f8916bfc2f033b43fa6cbff6c3a03bd3fd52d8a371349f5f711cc3135c8a10dd2996e254a28185a4f6e8981b10ab15881d8cabe76c5e1238fe2923dfab713fc35d974c173bf24cb41d1b8f169c2e8971720dadb3a29a40f2de10c6c976191049072b0f9055a60ed5df6dfb95c09b06248d4e5494be79aa11936c226d26f260c2a8baa36c7a4d2a9eb068640528812a15e1d716f71a6cbc29a0a3cd47589d7fd4c4debe1824284e8322835ee13e7153c9f2208b7740e4058fa8503dc4656aebd3ee0fa60fedf7e907b85752b66cdc21b540c31881bc8004c7fce9ea80e7fb235486b5f1d0321c68a0e44cd5f15e21f27c402754a2f7c1387720e959e94abeb4db216a37e59b066bf338fc6f2e6cf3746392d5a6679d182f01b6c7128a28362eec30b4dedc7356616328be64da23c0f61f9b46a42be70546ec111b8adfeaf1efec46fe5d11758cc765262b8d611d0b1614dc02d47c90191ebad24f59571d62766fd6df3920fc0a2c9dc3cc1f6fa34242c7d792add612b414e28cead47c3a0860fb62a00987816f0f618408b15261070acd106e96d4d966d7f78376a2dbcb742e037d1934a1901bce54e979d9c5e0b9ec79190f25d56eb1d65e586b3ae24c063c0c7883512bc2a107ec6687ff168cdb467043ece1744d257eab9e41132c266f299b0776d572738f3a9c7dcba7e0cffbd7373390401dff225f53a780b215f4ef65238c8c38223d46e4e9b1bd5aa1449bed326a81c85eef48e6fb26b29e4c32377d3a8a0bff978a68755884c58dc4652c16f65b49e0a3b7f9b3e67e4f3e1b68b7e04482aea25ee5548a6d798cb7e6cc3cd2f788513f88c3c524ba20cf281002e11cd5f8bcb6e4d8ab929d026b7f74c43ebfba64203b6aad3bd7eaa0aad2c68b63b1637eeeb3d5cece1c7ba1fa4afaf7b22bb3914f4ae5debe4bfc907ac4bb8c801c71679d0f8e424c866dfaa180e5c127a57772270476c2ccdf7452b7844b60f6dc845540409add976ef85f09d7c1db1fbb7a995fee9a140820c679d98812b3086010ca80fd67fb4f44bf518ba61b800aec3169427fcc2cc0be877869468ded6545ab29d77c9225d4960774bf825f6a69a64084871e8987b6e71bd0df56399a7e0bc815ac6485d7b7d1852b1dd309f4cc780c5d86616ebf2b591805b42d9224b310dbf0883bdfab6995ad071f3ea7b993e00966d8eec83dce82f0a970332426b4f37b5ce378fbfb8a30d37b4c2bc513606cdc32f70d327df0d33a1eac1d5c1af4320abd569267526a61bd0a1d10cebca27cd94459434a1a32e848e7c022c67be14b2e844a1eae4aba76be361a8430ffeaaea51d88275b7d1520c1974519efc41cad3b6446843d3edb0e5b81bcfca867a960b410fc300321182b289fb339347df6e6d5bfd44990b94c87196f8cf0718e5f318ad13de3bd90ac55e28383273114107672096c0545549f8f7c7202e648ce8caf8dd0b5b90766523f83c54d5a7220e9da94d3861dc77b4475f91ba7748ac2a22951920c366cfc9a4690e76a49542ef391b2a0ab199397cbd913dee2f1b3e5403d6a97a9c24aedf5197e6c728a6398ce1a5ff3537f46549627612e6e0440b0d75a3d4407134d94f316b0c6fe842ce8ca02f13e07b53c1c53ff45ac7112ddbfe81e4e49bc7fd18c04ccdc7956dd2cb987ba1af34061f17965bf45bbc4b3d76ce2e811fb228e735dbaba660613dbcf6577ce31b595fc12d64be5f5fea15dca3268563ceae1b5af64755dc1ffce26a1772aadd9f760e9fcbd8711bac7cf7722cae8c7038b629be25ac52594c8ee442f8900d7883b39c23bb997b128a987967d70d4d91a7f3d87b88b4ab032f3ec9ae605aae9a0e3990b4c450e42a436724246decd0af618cb3f9e80567c410351b151677942c893072b9ada5b54d1e107f0fb5f21bb0afaa3fa10c478e83369b61dfe390c7173cc0cb9c3f3ff56262bb139179c8387ed97506d9be232928ea9724738f4d50416f0f21c442c7ac51589266137f152fff27148f0ac4403f9a7451eb3be25536946a48ff997ee4e20248ba02fb9082061de1b0629de748d8c31cf23e9ea45181f77491ea83ba3fa05c795e6fb274b7c7be4e7008f8efe0fc8a2aa2a5049ce83a51d7126ceac080ed4935a433a1f35b7accb77d0885a4b2b4d7e588a9d593c3688cd9f50c36564ed2b1c2b4d82fd516252e64feeaabce66079296cdd17a518a138fc35f53cf4551567a69b7e6c3e192d2cc9d1c37d134a4fea48598a6599ee44342dd7ac71e5432818d72d5e3c7e074888eaaff76619f13a0f3fa12afdb4279018d6e6ef2894d995bd2253559a29b67505cd2ce2fc2d75bf5683d63746804f25458c0635c79f62ded31ca00cfbcd711311e5fb2ea5ca42505eb95b27d69adf7458b19808b5719973e93a85dce7d5f1a33bc97d23097ce19d9654c275344052fdb0ec2ed09897c7f56de0875dd4dfa2b5e1ec35788db1cde78bca8ec7d63d4431ec903d35e79e88b3efc327084946fecbb2d2a687b90571deadaf226832ce2da16a5235a108d2466fdd36e754bba870451cf162e901e477d38a57100ee09f79dcc886ca9a92ffab69b4d04acbb270a1c28edcdd04fedb4a769076fa04461da34475c24e9b1c6302421513b3e5b43c0db497098774065664285e7322e109c54468f079441aeba8f5796c65d53b37770eabb3ebf4becef24f7952c03d3d7212d7bad7304da2a72dff80296b0124c29e4f086418a73daf1b86e9fc02ab6235a2d7da886bbdbac58e8ae6ea87da4adc3e296b35f411892d5e84eae8aef017bae1bf1882a036dbdd37122e1e40b315eab338449822b619d017d3fc7729ad96885c182564622b8e44b44fb6332a4e0e84b9f615091917782df3febf46072687148e5d619c161e3a92827e2fc7a8ed9d209edd5d174bb81c9d5f5f73c3cc0d61e5d5095d985081794d3e37fb5a41245a44fe78ad213f1a8fb4d690ea8eecc4bf72dca689e795f7b2eb240799598784ce78453255e567b149fae61d63e5fdeee85201bf77185ae38fe2e0579a43f0815220ffa517a25a0ec3d60a6f708753ee74f9f0ae959913c758cb0fc26eb7f0ac9dd5aa4b43068aa595dcb001a0e19345fdd1060e65f85525b619eeb297141c58fa1cc18f68707df82885736e75734077eb8dce5988a49381204619b293f6e8290f4cd20c088ea8890456c1205ebac006b676c61a4e2c636c1fd62d4cf5bec89f361c582ba39f9ecaa1d725a1dd26b674f72279cb56fe29490d5085dc3cfa522e16d1c078ba41d55f997d1d7d61457845162745d713a8699a813ba00aca37f9582a23b77dbd13c09a43bf151d9ba5a9e9abebd6e804a9b8e313fe28332dd6429fd87889a54c63f51d4913a90cdcc5bfe510e69958ba707bb52e2e7affe873b277ba46c389c8d0f75b122155b5b5041ed9fdbe09b3a5ab4683483314cb8a8ecd7238250185b2e92bd6275e87b2b50f6b1acab8948346a88ddffaa282208495e811ea89a033aafb27110121cb9e4d361929f09ce6322df6d61dadf34f894717b6d939eb4c1e01a56d8e2821adb2ee26adaa07a16b6abc24a3eedabbd9807282ae3abed041af776663b014c49a9b384f9cfd988ca07781a06ba61952bc80776532a8e1cf4d624ccc9e294f810ed18c1f6bb6fba501f30ef8b1e5e26e6513c64de8b63b3eabc11236915c40fd96d08a149e48d9811c67c49c0b20be456fb50f9b44e523b509566832d1cb9180bf2292ddb9359ab75c304318dbd9159e38de83ebbbb853b8d29caf5fd3e9a9b0d44236c920ffb7ae5e06faeda89180df6d1af39dc19213b0940e67fc1c58f20492b9f6757a29c8ec7e366c98f5cc787f58d4af400b251c32ca2622c61f7c230266f45241392646d84959089957fc64f4a8a64770dcc3b5c5e16e501c61d58520cd7bcadac287aa185be96f6d23a3eed5b90a3c8edb0078d07661708d67e7c0f632dad0a0cac07b231261f182fd457e99267aff186a6dedf8f58a2487a6454ee9437bf4119663226ef94d4f8949738cc56d631fac2f5e8d95eb52bc99b15087705be9b5cbd9d248729d25c9deac90a1e0ea6d1e987e74c03dc445d941fdac1321f89e862de9b045c46a6610f17b3f465249f36c8bfc233e572cfddb0f0fba7a84a624f5c66a6fb2eaed98857059d1f2bff89099e51cfc408861c5625f4c0e160ef0f78513c073184c8337b7c9aceb2f7072cf174255628f382f56efc157198e274590a494806cde6fe7be286c090d652a4509751239f862ecc20cd3c3955f3b74308ae4d72eaf8dcb77b647e5e29b3c33ebca23d33f1 MD = b09d1a963ba9bf92907707b7d48b96e0d37dbd79 ring-0.16.9/third_party/NIST/SHAVS/SHA1Monte.rsp000064400000000000000000000142611352416253600171660ustar0000000000000000# CAVS 11.1 # "SHA-1 Monte" information for "sha_values" # SHA tests are configured for BYTE oriented implementations # Generated on Wed May 11 17:26:02 2011 [L = 20] Seed = dd4df644eaf3d85bace2b21accaa22b28821f5cd COUNT = 0 MD = 11f5c38b4479d4ad55cb69fadf62de0b036d5163 COUNT = 1 MD = 5c26de848c21586bec36995809cb02d3677423d9 COUNT = 2 MD = 453b5fcf263d01c891d7897d4013990f7c1fb0ab COUNT = 3 MD = 36d0273ae363f992bbc313aa4ff602e95c207be3 COUNT = 4 MD = d1c65e9ac55727fbf30eaf5f00cc22b9bab81a2c COUNT = 5 MD = 2c477cd77e5749da7fc4e5ca7eed77166e8ceae6 COUNT = 6 MD = 60b11211137f46863501a32a435976eabd4532f3 COUNT = 7 MD = 0894f4f012a1e5344044e0ecfa6f078382064602 COUNT = 8 MD = 06b6222855cae9bed77e9e3050d164a98286ea5f COUNT = 9 MD = e2872694d3d23a68a24419c35bd9ac9006248a8f COUNT = 10 MD = ea43595eb1cff3a7e045c5868d0775b4409b14a3 COUNT = 11 MD = 05a9e94fdc792a61aa60bcd37592acee1f983280 COUNT = 12 MD = 7d11aa9413cd89a387a5c0f9aa5ce541be2aa6e8 COUNT = 13 MD = 37297d053aaa4a845cc9ce0c0165644ab8d0e00b COUNT = 14 MD = d9dcde396d69748c1fe357f8b662a27ce89082c8 COUNT = 15 MD = 737a484499b6858b14e656c328979e8aa56b0a43 COUNT = 16 MD = 4e9c8b3bce910432ac2ad17d51e6b9ec4f92c1ad COUNT = 17 MD = 62325b9a7cebcc6da3bfe781d84eb53a6eb7b019 COUNT = 18 MD = 4710670e071609d470f7d628d8ea978dfb9234ac COUNT = 19 MD = 23baee80eee052f3263ac26dd12ea6504a5bd234 COUNT = 20 MD = 9451efb9c9586a403747acfa3ec74d359bb9d7ff COUNT = 21 MD = 37e9d7c81b79f090c8e05848050936c64a1bd662 COUNT = 22 MD = a6489ff37141f7a86dd978f685fdd4789d1993dc COUNT = 23 MD = 39650d32501dfcee212d0de10af9db47e4e5af65 COUNT = 24 MD = cd4ea3474e046b281da5a4bf69fd873ef8d568d6 COUNT = 25 MD = 0d7b518c07c6da877eee35301a99c7563f1840df COUNT = 26 MD = 68a70ae466532f7f61af138889c0d3f9670f3590 COUNT = 27 MD = c0222aae5fd2b9eff143ac93c4493abe5c8806af COUNT = 28 MD = d2efc5aa0b29db15f3e5de82aaa0a8ce888ffb2f COUNT = 29 MD = eec4f55d02c627dcee36b5b5606603bdc9a94a26 COUNT = 30 MD = 0e706fb1a1fa26aab74efcef57ab6a49c07ca7bd COUNT = 31 MD = 2ea392ca8043686424f7e9500edfb9e9297943f7 COUNT = 32 MD = 74737ef257b32a4cb9428c866b65bee62ccbe653 COUNT = 33 MD = df3e86e49a0429fa81f553b04b9fc003510e9a51 COUNT = 34 MD = 79c3049944fbf8b80dadadc7f5174e5cfdf996de COUNT = 35 MD = f25e2eca4cfb6da8e8b7b62f581672fab80754fa COUNT = 36 MD = 76509239d9fd6c6f050c0d9b3777b5645e4d4c70 COUNT = 37 MD = cf4bb3e1f330c862e239d9b010bd842f302bd227 COUNT = 38 MD = 4eeac7ab2ac9e4c81ed1a93a300b2af75beddb08 COUNT = 39 MD = 46443ba72a64fff4b5252fbac9ef93c2949f8585 COUNT = 40 MD = 5e9c42482343a54aadb11ab00c2e00cbe25ec91a COUNT = 41 MD = 93acee1977128f2a4218678b32e2844f23eb526b COUNT = 42 MD = 226065d299b2d6c582d386897b93f2adf14de00b COUNT = 43 MD = 672fed0d90c21d4ec0111a7284bcf1bbd72af9bd COUNT = 44 MD = 90d642f12f28cb3dad7daad84cf0f94ded1137ae COUNT = 45 MD = 4a2815b58ffc858e5e7e9e6106765458d2af4ec3 COUNT = 46 MD = 29fa3679032421b78b7a08c54766c1592f6739c1 COUNT = 47 MD = 19f4e30393eb66c6e200744fa8999d224e6df173 COUNT = 48 MD = 30650026be77212088ab50438e04b4b8e3761977 COUNT = 49 MD = 993d0e135bcd598fa673c6f19251bcbde18b7b34 COUNT = 50 MD = c9eaf20b473219a70efe85940620426c6ff6f4a4 COUNT = 51 MD = 6325d0b83c308bd42854ce69446e85ba36348d7d COUNT = 52 MD = 2fb354f8a68030efb747f78812060a9c05e92164 COUNT = 53 MD = a7e33bd16f770c17e8818ad5a5fc4fee673eae56 COUNT = 54 MD = ff23e7105bc9f4dad0fb9c6519d1eae16439a5d6 COUNT = 55 MD = a31aca821e163213cd2ae84cf56c1134daa4a621 COUNT = 56 MD = 94ab9cfd4cf9bf2e4409dbcdc9ef2c8b611cc69d COUNT = 57 MD = c0194064ce48dde771b7871efa86a4a6e87eec76 COUNT = 58 MD = f1a9065e3e7f98753c6f833f5ffe74133f6b887f COUNT = 59 MD = b8b3cd6ca1d5b5610e43212f8df75211aaddcf96 COUNT = 60 MD = 33c3a8d739cc2f83be597aa11c43e2ad6f0d2436 COUNT = 61 MD = 4f5c67e5110f3663b7aa88759dbba6fa82f2d705 COUNT = 62 MD = b1ebc87c7b2b8fe73e7a882d3f4f0492946e0d7c COUNT = 63 MD = 01566616fe4a8c7cf22f21031ac6ea7fb7ce15db COUNT = 64 MD = 5650f3517a393792781d23b4c9d360bf8bd31d65 COUNT = 65 MD = a4fdbd24cb4a328b898b804b103caa98baedd3fa COUNT = 66 MD = 0cf01eecec4b85aa39f40aa9b4dce208d68eb17b COUNT = 67 MD = ae9ac147bab7c10609abe6e931a5ab087a41dc5a COUNT = 68 MD = c0328145ce63fb0aceeb414e791d2be92009b1ec COUNT = 69 MD = 60343e5fb7eee00d31ea507b820ddbb7ef405dc7 COUNT = 70 MD = e0b97cd9149ff9955b6a35b3a79ecb3bdbd2a5a5 COUNT = 71 MD = 4e4fdcd382ae0f3f4fbda5fd934eee0d6ad37df5 COUNT = 72 MD = 9d97dd237d193482cf3ab862a38843762e69077f COUNT = 73 MD = 2bc927d17ff2f8a844f6f36a944a64d73d431192 COUNT = 74 MD = b91200306b769aab18e5e411b5bd5e7bce1cc80e COUNT = 75 MD = c47493a666085e1b7a75618761a80c402f46546d COUNT = 76 MD = 31355869b80ff84fac239db694ada07d3be26b15 COUNT = 77 MD = 1a2022f6330bf96f025cb7d8f0201a7d70b3b58e COUNT = 78 MD = 0f60d7c5ad49efce939c3a27da9973f7f1747848 COUNT = 79 MD = ceada087801616fc6c08cfa469658f3dc5239ca7 COUNT = 80 MD = 4ad0cf9181122b06df714397bd5366aa90bfc9fa COUNT = 81 MD = ac6404e6b9d5c0fa17fa77fd39850f22b76ecd83 COUNT = 82 MD = f0658218adffb9ee9328577854b6387393957a3a COUNT = 83 MD = 6fe9992747897389957b9a91467a4ec983829ab6 COUNT = 84 MD = 74320b3ddde6dbfbdad3ad29a7695f5a275b2105 COUNT = 85 MD = 2009ea5d6452f51d12477740e374e0e313134779 COUNT = 86 MD = 7dbf33d7125709f101fea4ec03436ab95a900c28 COUNT = 87 MD = 0c05b78e324cb265bd6adc7452249eaa85bccb3f COUNT = 88 MD = 10c1b9b2de8a9050fb6f4b10a99f7e1e47159f25 COUNT = 89 MD = 20072c1f691142d9b83a090dd01f446b4e325a1c COUNT = 90 MD = ffcb6a1525f20803cfc79deb40addfd3e7b2f05c COUNT = 91 MD = bdcbb4ed636e244bb0fe6af4bc53998936df4ebc COUNT = 92 MD = f58ccbc65a2ffa5b35274dd0ceb4ea70eb73c26a COUNT = 93 MD = fbe95ac75e4b9cccd1a5debf757fa1a502d07944 COUNT = 94 MD = a8babac55950dba4993601d35adff874a2b9bb2a COUNT = 95 MD = 594db79de71c7651e9eef2f08bb7be3d26b6ee99 COUNT = 96 MD = 63377d45d0e2d0c987bebe8086c76a5e8b63a14b COUNT = 97 MD = cd1e7a192130866aa87fd1c8b43e9b7a0eab7615 COUNT = 98 MD = b3c69ad5dbdd34b7b45b2a89dad72f4cf1d8fd73 COUNT = 99 MD = 01b7be5b70ef64843a03fdbb3b247a6278d2cbe1 ring-0.16.9/third_party/NIST/SHAVS/SHA1ShortMsg.rsp000064400000000000000000000210371352416253600176510ustar0000000000000000# CAVS 11.0 # "SHA-1 ShortMsg" information # SHA-1 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:35 2011 [L = 20] Len = 0 Msg = 00 MD = da39a3ee5e6b4b0d3255bfef95601890afd80709 Len = 8 Msg = 36 MD = c1dfd96eea8cc2b62785275bca38ac261256e278 Len = 16 Msg = 195a MD = 0a1c2d555bbe431ad6288af5a54f93e0449c9232 Len = 24 Msg = df4bd2 MD = bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa Len = 32 Msg = 549e959e MD = b78bae6d14338ffccfd5d5b5674a275f6ef9c717 Len = 40 Msg = f7fb1be205 MD = 60b7d5bb560a1acf6fa45721bd0abb419a841a89 Len = 48 Msg = c0e5abeaea63 MD = a6d338459780c08363090fd8fc7d28dc80e8e01f Len = 56 Msg = 63bfc1ed7f78ab MD = 860328d80509500c1783169ebf0ba0c4b94da5e5 Len = 64 Msg = 7e3d7b3eada98866 MD = 24a2c34b976305277ce58c2f42d5092031572520 Len = 72 Msg = 9e61e55d9ed37b1c20 MD = 411ccee1f6e3677df12698411eb09d3ff580af97 Len = 80 Msg = 9777cf90dd7c7e863506 MD = 05c915b5ed4e4c4afffc202961f3174371e90b5c Len = 88 Msg = 4eb08c9e683c94bea00dfa MD = af320b42d7785ca6c8dd220463be23a2d2cb5afc Len = 96 Msg = 0938f2e2ebb64f8af8bbfc91 MD = 9f4e66b6ceea40dcf4b9166c28f1c88474141da9 Len = 104 Msg = 74c9996d14e87d3e6cbea7029d MD = e6c4363c0852951991057f40de27ec0890466f01 Len = 112 Msg = 51dca5c0f8e5d49596f32d3eb874 MD = 046a7b396c01379a684a894558779b07d8c7da20 Len = 120 Msg = 3a36ea49684820a2adc7fc4175ba78 MD = d58a262ee7b6577c07228e71ae9b3e04c8abcda9 Len = 128 Msg = 3552694cdf663fd94b224747ac406aaf MD = a150de927454202d94e656de4c7c0ca691de955d Len = 136 Msg = f216a1cbde2446b1edf41e93481d33e2ed MD = 35a4b39fef560e7ea61246676e1b7e13d587be30 Len = 144 Msg = a3cf714bf112647e727e8cfd46499acd35a6 MD = 7ce69b1acdce52ea7dbd382531fa1a83df13cae7 Len = 152 Msg = 148de640f3c11591a6f8c5c48632c5fb79d3b7 MD = b47be2c64124fa9a124a887af9551a74354ca411 Len = 160 Msg = 63a3cc83fd1ec1b6680e9974a0514e1a9ecebb6a MD = 8bb8c0d815a9c68a1d2910f39d942603d807fbcc Len = 168 Msg = 875a90909a8afc92fb7070047e9d081ec92f3d08b8 MD = b486f87fb833ebf0328393128646a6f6e660fcb1 Len = 176 Msg = 444b25f9c9259dc217772cc4478c44b6feff62353673 MD = 76159368f99dece30aadcfb9b7b41dab33688858 Len = 184 Msg = 487351c8a5f440e4d03386483d5fe7bb669d41adcbfdb7 MD = dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89 Len = 192 Msg = 46b061ef132b87f6d3b0ee2462f67d910977da20aed13705 MD = d7a98289679005eb930ab75efd8f650f991ee952 Len = 200 Msg = 3842b6137bb9d27f3ca5bafe5bbb62858344fe4ba5c41589a5 MD = fda26fa9b4874ab701ed0bb64d134f89b9c4cc50 Len = 208 Msg = 44d91d3d465a4111462ba0c7ec223da6735f4f5200453cf132c3 MD = c2ff7ccde143c8f0601f6974b1903eb8d5741b6e Len = 216 Msg = cce73f2eabcb52f785d5a6df63c0a105f34a91ca237fe534ee399d MD = 643c9dc20a929608f6caa9709d843ca6fa7a76f4 Len = 224 Msg = 664e6e7946839203037a65a12174b244de8cbc6ec3f578967a84f9ce MD = 509ef787343d5b5a269229b961b96241864a3d74 Len = 232 Msg = 9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6e MD = b61ce538f1a1e6c90432b233d7af5b6524ebfbe3 Len = 240 Msg = 75c5ad1f3cbd22e8a95fc3b089526788fb4ebceed3e7d4443da6e081a35e MD = 5b7b94076b2fc20d6adb82479e6b28d07c902b75 Len = 248 Msg = dd245bffe6a638806667768360a95d0574e1a0bd0d18329fdb915ca484ac0d MD = 6066db99fc358952cf7fb0ec4d89cb0158ed91d7 Len = 256 Msg = 0321794b739418c24e7c2e565274791c4be749752ad234ed56cb0a6347430c6b MD = b89962c94d60f6a332fd60f6f07d4f032a586b76 Len = 264 Msg = 4c3dcf95c2f0b5258c651fcd1d51bd10425d6203067d0748d37d1340d9ddda7db3 MD = 17bda899c13d35413d2546212bcd8a93ceb0657b Len = 272 Msg = b8d12582d25b45290a6e1bb95da429befcfdbf5b4dd41cdf3311d6988fa17cec0723 MD = badcdd53fdc144b8bf2cc1e64d10f676eebe66ed Len = 280 Msg = 6fda97527a662552be15efaeba32a3aea4ed449abb5c1ed8d9bfff544708a425d69b72 MD = 01b4646180f1f6d2e06bbe22c20e50030322673a Len = 288 Msg = 09fa2792acbb2417e8ed269041cc03c77006466e6e7ae002cf3f1af551e8ce0bb506d705 MD = 10016dc3a2719f9034ffcc689426d28292c42fc9 Len = 296 Msg = 5efa2987da0baf0a54d8d728792bcfa707a15798dc66743754406914d1cfe3709b1374eaeb MD = 9f42fa2bce6ef021d93c6b2d902273797e426535 Len = 304 Msg = 2836de99c0f641cd55e89f5af76638947b8227377ef88bfba662e5682babc1ec96c6992bc9a0 MD = cdf48bacbff6f6152515323f9b43a286e0cb8113 Len = 312 Msg = 42143a2b9e1d0b354df3264d08f7b602f54aad922a3d63006d097f683dc11b90178423bff2f7fe MD = b88fb75274b9b0fd57c0045988cfcef6c3ce6554 Len = 320 Msg = eb60c28ad8aeda807d69ebc87552024ad8aca68204f1bcd29dc5a81dd228b591e2efb7c4df75ef03 MD = c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7 Len = 328 Msg = 7de4ba85ec54747cdc42b1f23546b7e490e31280f066e52fac117fd3b0792e4de62d5843ee98c72015 MD = 6e40f9e83a4be93874bc97cdebb8da6889ae2c7a Len = 336 Msg = e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d MD = 3efc940c312ef0dfd4e1143812248db89542f6a5 Len = 344 Msg = dd37bc9f0b3a4788f9b54966f252174c8ce487cbe59c53c22b81bf77621a7ce7616dcb5b1e2ee63c2c309b MD = a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56 Len = 352 Msg = 5f485c637ae30b1e30497f0fb7ec364e13c906e2813daa34161b7ac4a4fd7a1bddd79601bbd22cef1f57cbc7 MD = a544e06f1a07ceb175a51d6d9c0111b3e15e9859 Len = 360 Msg = f6c237fb3cfe95ec8414cc16d203b4874e644cc9a543465cad2dc563488a659e8a2e7c981e2a9f22e5e868ffe1 MD = 199d986ed991b99a071f450c6b1121a727e8c735 Len = 368 Msg = da7ab3291553c659873c95913768953c6e526d3a26590898c0ade89ff56fbd110f1436af590b17fed49f8c4b2b1e MD = 33bac6104b0ad6128d091b5d5e2999099c9f05de Len = 376 Msg = 8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d MD = 76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969 Len = 384 Msg = 57e89659d878f360af6de45a9a5e372ef40c384988e82640a3d5e4b76d2ef181780b9a099ac06ef0f8a7f3f764209720 MD = f652f3b1549f16710c7402895911e2b86a9b2aee Len = 392 Msg = b91e64235dbd234eea2ae14a92a173ebe835347239cff8b02074416f55c6b60dc6ced06ae9f8d705505f0d617e4b29aef9 MD = 63faebb807f32be708cf00fc35519991dc4e7f68 Len = 400 Msg = e42a67362a581e8cf3d847502215755d7ad425ca030c4360b0f7ef513e6980265f61c9fa18dd9ce668f38dbc2a1ef8f83cd6 MD = 0e6730bc4a0e9322ea205f4edfff1fffda26af0a Len = 408 Msg = 634db92c22010e1cbf1e1623923180406c515272209a8acc42de05cc2e96a1e94c1f9f6b93234b7f4c55de8b1961a3bf352259 MD = b61a3a6f42e8e6604b93196c43c9e84d5359e6fe Len = 416 Msg = cc6ca3a8cb391cd8a5aff1faa7b3ffbdd21a5a3ce66cfaddbfe8b179e4c860be5ec66bd2c6de6a39a25622f9f2fcb3fc05af12b5 MD = 32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4 Len = 424 Msg = 7c0e6a0d35f8ac854c7245ebc73693731bbbc3e6fab644466de27bb522fcb99307126ae718fe8f00742e6e5cb7a687c88447cbc961 MD = 6f18190bd2d02fc93bce64756575cea36d08b1c3 Len = 432 Msg = c5581d40b331e24003901bd6bf244aca9e9601b9d81252bb38048642731f1146b8a4c69f88e148b2c8f8c14f15e1d6da57b2daa9991e MD = 68f525feea1d8dbe0117e417ca46708d18d7629a Len = 440 Msg = ec6b4a88713df27c0f2d02e738b69db43abda3921317259c864c1c386e9a5a3f533dc05f3beeb2bec2aac8e06db4c6cb3cddcf697e03d5 MD = a7272e2308622ff7a339460adc61efd0ea8dabdc Len = 448 Msg = 0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7 MD = aef843b86916c16f66c84d83a6005d23fd005c9e Len = 456 Msg = d0a249a97b5f1486721a50d4c4ab3f5d674a0e29925d5bf2678ef6d8d521e456bd84aa755328c83fc890837726a8e7877b570dba39579aabdd MD = be2cd6f380969be59cde2dff5e848a44e7880bd6 Len = 464 Msg = c32138531118f08c7dcc292428ad20b45ab27d9517a18445f38b8f0c2795bcdfe3ffe384e65ecbf74d2c9d0da88398575326074904c1709ba072 MD = e5eb4543deee8f6a5287845af8b593a95a9749a1 Len = 472 Msg = b0f4cfb939ea785eabb7e7ca7c476cdd9b227f015d905368ba00ae96b9aaf720297491b3921267576b72c8f58d577617e844f9f0759b399c6b064c MD = 534c850448dd486787b62bdec2d4a0b140a1b170 Len = 480 Msg = bd02e51b0cf2c2b8d204a026b41a66fbfc2ac37ee9411fc449c8d1194a0792a28ee731407dfc89b6dfc2b10faa27723a184afef8fd83def858a32d3f MD = 6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa Len = 488 Msg = e33146b83e4bb671392218da9a77f8d9f5974147182fb95ba662cb66011989c16d9af104735d6f79841aa4d1df276615b50108df8a29dbc9de31f4260d MD = 018872691d9b04e8220e09187df5bc5fa6257cd9 Len = 496 Msg = 411c13c75073c1e2d4b1ecf13139ba9656cd35c14201f1c7c6f0eeb58d2dbfe35bfdeccc92c3961cfabb590bc1eb77eac15732fb0275798680e0c7292e50 MD = d98d512a35572f8bd20de62e9510cc21145c5bf4 Len = 504 Msg = f2c76ef617fa2bfc8a4d6bcbb15fe88436fdc2165d3074629579079d4d5b86f5081ab177b4c3f530376c9c924cbd421a8daf8830d0940c4fb7589865830699 MD = 9f3ea255f6af95c5454e55d7354cabb45352ea0b Len = 512 Msg = 45927e32ddf801caf35e18e7b5078b7f5435278212ec6bb99df884f49b327c6486feae46ba187dc1cc9145121e1492e6b06e9007394dc33b7748f86ac3207cfe MD = a70cfbfe7563dd0e665c7c6715a96a8d756950c0 ring-0.16.9/third_party/NIST/SHAVS/SHA224LongMsg.rsp000064400000000000000000014773411352416253600176360ustar0000000000000000# CAVS 11.0 # "SHA-224 LongMsg" information # SHA-224 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:37 2011 [L = 28] Len = 1304 Msg = f149e41d848f59276cfddd743bafa9a90e1ee4a263a118142b33e3702176ef0a59f8237a1cb51b42f3ded6b202d9af0997898fdd03cf60bda951c514547a0850cec25444ae2f24cb711bfbafcc3956c941d3de69f155e3f8b10f06db5f37359b772ddd43e1035a0a0d3db33242d5843033833b0dd43b870c6bf60e8deab55f317cc3273f5e3ba747f0cb65050cb7228796210d9254873643008d45f29cfd6c5b060c9a MD = 9db6dc3a23abd7b6c3d72c38f4843c7de48a71d0ba91a86b18393e5f Len = 2096 Msg = c39147fad02c6ed5876eb3257837c3f456008694fac94932aa521bae9c8e77abb65524e298595abbdc5b261e9c9f0f86359dfa584bf94b740eb54d09bba6d4ad652421adf50605a170ce4a4478204e831679f1d4b61db1c9735114e595cb47ae58670403f01bb8b0c92de64013a3c6137efc33b0421dc45b638e38eb33e617d61884968e8f80bb1071e1c3b97611c15cf78e8793f8e1c95265d480c29ce08d4c2ce59ff3dc1e56e8f053a958a75085890897b625de520bd6028bb512d89ff1391cf0e7dddfdbd160ccea5fc5b04a5ac03a7f890fff56d10dc01b9f85f00d8bc4710f35f29fa073a28f0dafa798e58a2913aec5f960d662222aed06c1eb11a216b2a952da2456 MD = 2b05b170d4976409f23ce885a0a2c0a943226688d4f5bbaf35fabb46 Len = 2888 Msg = d488bdda400932de56a9f105f0e74ee79c2ed869faaadc31665c2b5dd7691d7407b8d69cd5bbc80ee78d79c8933e8781006be9e2881177f361a2add47d59acadaecb81e70ec0aa9d9e40d64d2df1edd47ca050999f1d6208a64c47427d79ec1211ec4724b4bde071c3ea90fe86a788c657f596f40776a4567d80820fa070e58c7841afb98f5d70749eb22d4265096140db93425d87c545c72e66e4a3aee79f012af2410f6745648c76c1378094be7f2b4ea2dc3be9b24e420028f7666f85235b7028858e0420c3a3953f3622d96feb6df949edf6f3e4c6ae3deb43c1abf37880920b049e2e9496a04153b08ffdc4abf024b1fcf66e04b5f52bda4f1a29d8a65ad8c245a8ac49e46bc3252f2fc864c99a170291a221b924fe121aa3dab2ddb6cf8976d01247e9b5ec63de3a6a01f84c5519633464d6ac19b13cd6c76a0eaaafc9ef4e2e46c719120b68a65aa872273d0873fc6ea353859ff6f034443005e6992f5073e6aaf48301b01c MD = e12c2c07628185fcc930d02b5fff6408e8eb1aad2bb0032830e04ff2 Len = 3680 Msg = a67e008f13a29021d1493c7ddb0e7f4126a786f9e01991eff52c9b45d81d3d408094d0e7b1d5d2cd7c3a8a2b09e1ef3194a2c79eb6440c8fe6f093943fe5f009846e94a46111384af30a7f278bf8d6fdafd59fbc622b9054a68555c73e247d82b8f493edabbf8b413e9f619ae9b9fc4d8028587b6d38e4e63cd529045e43ad52260f17eb1845935963e378abac8e29c70d8439025ed2d2eeb3c7577325a84822d6a566c52f0c183b6cbd0e835bde241660cf897abd6020141042263e1dbc1699ce9fc9a4787ce28e601469497e10b6e081f3910a134c97ff5d30e08acee7de6018e688b07cfdb8fb48d2d2269e8ea7ce76d699dbe6fdff58a278cb82bf926a1ebc61eb10c2f8642a2bde914242bfbf874962e815c1db20c6e5022f4b7823807cc0f73aedd3d3acc21120eec4f20bc5b4027dc8df294ec1f230b656108104e9222e92bc6e35f8596c038031d436da83fca7117f61a8beac838a7c87f7639b6db70d19babc72cd33cf07e6a19c9794bf08420556c4c593a722fc3c0928a552d3e466737cfe12bc0194283a87419ca1427fda41953009357b778cde25cccf90e550408a4a5d9b2c8d626b642beece6ad40a78ad84ccfa0df029444a230b69bc69a3a3456c0197859de2da4cd5c9 MD = f6430298cd0e80d919f22cf1094988241f84b8753838afead0156940 Len = 4472 Msg = 012d3f35fe162ac6999ad84d9057fffb5cac15bc4e780917dd2530563fe682e8363c06032dbf8b8e831b993d2759a7fe65608e94ffbb3e81809cb02acd211c36fdd76b376a7def8c080a5286f6f1ccc953a399f55355ab8692049cf9a8b7e631fd055618dfd6be89d16eeb6e26a7d625cf7d1e2972d0b6eebc66db0cf7304aa0dfceafefb154604d864f4b3edf032eda81f7067683b4c980a5c957abe312ae4c4a3a5e040b7f3ea0ceb55c3d488e3ab010183725ae874b05f535f71e94e77cfee7524c9f13debe4a51a905b58acf636f25e99a7d1dd3a44656b3a3ac31361b7c5e1d5f08f1f94912b8322eeccc4e11de677017c8f51f3b086e49439ee288f38e56a38086ce5848c1ab59bf2b3794adc67fb7974c61f47a16e502c03cd1646cfe77ed9863d284211fd125a1baf3289def14c6005387d9c83764e300ce2352ee936a028de524043ef4d39ebae127924b21cfa33c238f568d3293f6ec9c03dae114d7eb4955ed60050858ccf3e8fc5b1d2458583104a2f332d019426cee9785ad4a65aeb2fb5421e02309b83516990a7dbf56edc940e8391dd99fcf690b07dabafdbd55b21e82ce360c8e6966b52627d2bc7168ea1e88afb715cca6c93c7c6271f487e730079eef6e8c8ee76f0bcd3b84e152d37ee5aade684b49ce76c91ea338f96a6d13ffd10cf26bb23b3961b4cdfbf7a1356cde784c9945bd4f56fa142778d20eee454c43ae2971a16cabfe03659ec505979c511783b0c9d132531687769a481c72ad361b5c7b650382ac2ce38bd7 MD = 79e084af148e8073c5e86aab498eb1b7472e30d9093930bb6b819224 Len = 5264 Msg = b418141ac57d6002e5d473c10797f137184f4be031fc935a12b78f21cc960c9ebdd07460c121a3a9a770f72ce2b0a6158104554a6226e6f0a209913257bd363d8294f18f3f83f0723fca81c378d76ff81b688f62c7f196aefc3d2db2d2574867ebabb331a669ed67952a3a0f32d6f4e9cdc522b0c9244c9c089b8d2ba42ce921e05fe1cd5e9c458f92d84a977674dcef7f6135bcd089afc1af6ad6243504c27549f6a4eccfe49ef21c1bd8e3ad78d0131986f10f45e66825d7f43326eda77a6a0eb923156108a1991c3d0c7c40ab775c847a7e308e041ed0697fcab834ddba0817f087d07cd2f58b7b840fe995d57ad2a68503a715ab7acb4e54c362726d2a584ce3f7a5880842d01f3909b216be807d68f1a8fd41a2231d6cbb47ac0f20716196d99c1ded733271f2a321602a2d3266b20497b979b3c2ceadfb7e1f73be382cdb1c9dbf13db6b75db0c807a38eb38946d08f56327a4ffe7f85e8f42060f26bf05f22314620895e4c1ba4e88aac1390f7f43ed83b23e816e342aa29d31dae424faa456a343c159c78ef6b213e774dde0d2fea4a28249f16e4ba8e1b95ae91963a4795df41ccf5f252908d4a257cfcd0e4d804547ff8df6ec2420721deb026e82e9bb618f56fb4e067a38ddbd6299b1a1d713f6fb91d239f2a7da7d514aee8b8bb3b089fd5a0bce7269cef5ec709930a25afddf45a0df6287bc1d2bdee1751785e9a2fec58fc78972de1143b8e998f318bd872aad947d18b44b33a34b165ebb7973d7e76f5cf9240dc14af0a8355ea20be8f9fcbbd57403803c620e2053731e6e39986d832b674a4cfac22345bcb3e483c29b80f8cb8cccf377f394e6ff7ae96c222cb88a63daa13571be0515e75f618935b4dbebde8c1b15e52e5c24813cc37c18ddef0c6b1ad1d30f89bea21c29c224298e MD = 662e1e83c3a4a506a649bfa6f6c6eedaf5b3b6fa05825d45c13ef2ee Len = 6056 Msg = 51bcc9e9244e2fa1752c61e65aa5c592138447ef9287fdcb3b120bcfe825c50c308c14d7e9551bd7eb871a5c171192f29801aa3769f6d1e917d8a543c9c6138a7d50c0e394e7a867919106791ee27357502751f02be46af66981d53377401a20c17295b42feb207aefb3ece676feb0e9c15e06c3e1381119b6756447fb791ff782595bf3c148c9378e53954b274f91cf750f8f5792da0e7a881b1a265c5b6d364b6dda4753e8ecc7f5dbca4e3abb5d32f4a0b55646b1a94266ddbe79a2cd4b06a116da59ecb2d051acb1519ab62c5e39c47b406505a72a99d9221ae7d5b6008f0ebc22d0948ebffe3c3ff2d5a389da0d6f06f82ed8a3d8a66853f419fe00d5f819c77b555364fff62ceb77a809ba1ad57daba559c68efd929bd615b62592126a4b9fad90321cd960041fa6baf1a666ba74d10e8ed84edf84fa1445675054ff0c2aac8028389f95644d4249b4623706e4dedffc7415ccc6a50e754bd4892ee3074057bcc66ed37b2c8ebc263d6554417a423f37b385f0fc1d5e62f1a4d708088215062811daa1d3dd4ff406fe01e560a5295887f430a3c8137241fd8043cab4a62f228db286f1e4a21954b09e3ed3ab8c1a92b4df1fcb71afd37b380fd35c309b1814b3507aacf7a17243eec624046a589d55851b5951401b08796afa91a6c48858436294bdb85402e529861ebc61e5303a09c351e61e7d7c99a25be88591b7957516622556ff43eef76f414d0dd2643d7a163628cf1970fd0f5dd282b60353ecf9f77aad50680c8d327be7fc1f402ea6e4e5a6491b2960c3f11499702ce5deb26c4d74d1b0daf6061db640d2fb918c9401dcdb5bd23897f9c72e7659ef20a112547f163b803f4a8240881378a8afc62f57649c07fd2d5bc51a1332e5089ae4323bf72993c87e5128245a2a952e80249e70e6b3f5a2eff54f702a95bd7e3def3aa81c74808e7f502150924bd296eeed0ad4c8e6cccc68adc054dd668959f009532456c1abdc2a92944c9a3fd7e7e06b9a0974fe34807fca404b936ff0a19a7ba5360dd6bcb9675eaaa1d8ce4b293de4779950c3d7c8 MD = d2323cac073625fd6dd5d937cfa2d8bd01f75cb5afb15b7757dd8ac4 Len = 6848 Msg = 52f5a110dddc9f44f8a534eef9df0b22785706470cd4246c5604a8e041b778fc874bc3447867e6aff7ed9142c52925e3024f616df0243e00fbfb179bf6e30deca81faa6687d6c595c30ca5ae86d1696b7bb8a6158d8b53e2f13de2826620b0f5bb589f9f9290019e65ecb95bc63e9c5feb7c1e6969722abd40b451be18d727bfcae0ea1722fd6573e47314710cd8896a5a820e8e0e3f8c37f146ac77946e3bf3dc9ed3f5be85b8bc488b0017e107f732d1b2c1af045c41f80add3ad4634fb439fa7aa262ef90c120991bc375cc33ad5f57f47ef2d12f11a9966044fe0ce05a382b5c9e853c864948e00aa6b455c4749af5308c7fff22c4f29ab7121d178bf599772c10872dcf18dc2542f1fc0422148bb24e347f169b217a20caec580db74c03e6d2408f4ad3f6836eaaec7462b555d99636be1a9c04f1ea2f811ad775cb281f813776c61cfbabe5c52adf45f6e6ff2ca9d172771bc4fce9d0c4e3c3d73151954f41fa532aadfeab31aa1196481bd92ef40597bf1a430a200a7b9144bb508f0c58d9135ffc52b97dbb12cb90e1bdac857ebb771922e9e337e58e6a81aa90aa2da5e80b121b53a202694a555b483540d94fdc58aeba1e4ed569e5b7a32c59699f3d5428930e1682e3453bf71e05ea5dd3704e83a66a4a15a29f68bfd1c713950a2907b30b5d0520c857cbf902a143cb1ae8fb4028bad5fe488e00cc340526f6186fe7f3a191874657a6e3a22ea3aa5157bfc9d75c3327d26c3e9324f46dfb546f19de327e3103ba3b3a6c3bca9386b932fea28f6b5ca858b9b80a103887f877b72ed3b6c9c5e3451a1b4c0c00fa3ec952ac6db17dbdc15ad4034ed828dc862799b7adc9abd68eaf9d526d5df65f3c4a60d11285b9dfd89e682746c4edf30e2bbcbb56b14ceb6cc06be5b576d44ae70303767853484957ee1b2dd91caf54f64cca42b5b6d38ce5402ddf0e9ec343a7bee4a189635283a410951cf1279588a7526855b222694161f68a455f1febd3e441ab5d2cfcfe1629cc7ffc752ec8168a0540fa353b359348ab2b21903f73810655ffaf496874894cec81d64c797086062cfa3b264b60090227b77a884783d675c288a1c9eddd64773642b16050b36182913e206d98112cf732d759317f45599a50ef3a92d4613011746b9598fbbc2e68fab2b0f36b7182909433c5722edf92dbc7dc828d652774826ca3 MD = bff3139ac7bf14524d89645284c3541679832b6d4858b3c47ebff434 Len = 7640 Msg = e563453d6ad52e08bb112f1e6b6c208ca47815a1c91d27a25aec78bf18af71466a454e1700addd58b6608269bbe47f1af29e721c98e81fb6286370b97b8ebab63498426e5b73008a482aa38dc374d5066989bf0a5234d0e1f02aba003a9abe370a052a2cc450200839189870cb45a8b7d1e204523d2cc18c7ce85e7b9dfa0432b6340d38836cc43951d16bfc1a7f8395f25047dca1f57a1d92466211ecd7150dfeccf37ae0ee748557fe2417fa49eb08937c9290c8ba83fefbecd0ac6e587732ab76e5da23feb8541546c9abb1cb6a787e0dec56f9a165957f81af336ca6b40785d9e94093c6190e5152649f882e874d79ac5e167bd2a74ce5ae088d2ee854f6539e0a94796b1e1bd4c9fcdbc79acbef4d01eeb89776d18af71ae2a4fc47dd66df6c4dbe1d1850e466549a47b636bcc7c2b3a62495b56bb67b6d455f1eebd9bfefecbca6c7f335cfce9b45cb9d2be43b9f6b8e42bdb6fe3a3a513aa6dbfbcf684cc55e35bf245745d645054fc3a0cbb4aed0adfb56a2117dfc6cc7617da048cbbea03b514cd43eaf44fbe2bb71bef79bb58b0b35aaa02de78866f7784a01cb4f0c255ce3b82b7073e164e5f7efadf2567d43b0d9ffd9d9e0a8e8cfd48b47e05c00fbc8d4495077fb752915eb8594444fcea1a5d09e759dd0229a595b87990f5a60cb870a486cdbadc8f17b807b9b73ec6f4df100cf9b011fbf239cf68820e1b1f53ca26ffda622f3a1651d9c18ec09972aee9c53da738e35472ca08ed403ddca87f720eaaf27d634ca2c0528a5ac8eb7c52cafb00626cb7b825c6e09b46b8c0bdea30962a7167ed709ef3b0d6a0688b309b131fe9cdc4157385c0d51708074ddc1e966c12e9ca3462756c531af2081f5be222a27e4bc763230d3854c50691fa9f9713eee8ae1cce8ec08ad7ebc2200e4ac2aa21226eff475336adfe49c4f15d54fe299d1030c81251faefbdbd8358ee89a6fa2a7aa9d438609c922009b59dccb88e57f52e3464b658aefb52f4d81b269529931ceb7ece9cf7a97568796b0fef16f21f95970b6b010f374e564612df4cf9a51586f970770b64e7c8363d57b03b1cb3f0ecef4853a8e23e592615d61dc833b3f1e72901460a54c22b27ba0e3717263e6c799b5da7148e2e9c50e8947f3ebfd0a8bbfeb3c3f033d2eebb73f10d29b00bf2aa2fcdedca4f72885532c04c070a75aa73ff0a69738e94b34fff929ad966a7142d210b8030b2c4bda188fc3cb7a03d97bd8e67befac181f973b18578bca69a5140f3b916ee647facc45fbaa9d72d72d0e7317e2d0c792521b53e2c1f39fc503aa42c391a69b11dc64c2b6e1bdbeecfe68f9c904c1f11e8dc8 MD = 08a9d2171e9c2ff730050bff7fa4ef91e4b004bfa06a452a13d6e087 Len = 8432 Msg = e5949555fbcbc3903d660ca9543c79d9a4f0af7d227666bf65d21d73ff230c3f0de15bff0d639167f0a44fea70463edba4d746d3d254015284eb6fa9de05eb172e845d32c549b28806fa8987bc022f9ab1d9ce957c85e1539a61eb9dc01d694e700605b5cb870c3ba6f02246df77355df17daf8cc712f00acebafb194e716f2efaeeba52c62589c8f80f82f082ad366b8f4b51805c0214be498006e3300ce6fdf5c4e3cf5e29107625de124d4cad1b0db1cb1d39e25d37b9323a74c40df3b4048811eaf53c9d888f55e63824e67ecd8b8086797e022b4041b271ac848d30c38bdc5b368c0888db59afad5d3ef728332d2303ce186475179ff1ac18eb59c9f9da182d2f5c69f3f01d5cbdea6428b4343bc2ca85d0af43a41b16731fc119c94038650c3d2c08e5af22849e455c2129bafc8764046c8b9bcffc4a4e29cd74357fefeb82c8c68d6600b24dd6d8ee898facb99858b5b4a287808cb4c69ed813179e45d11638f09f7ecb13e2ef0ae409eff1ba1d2eff72990e9f117d62e7aa9e7684834051f573e636f88e69714205485073473f6f496c1b3814d4ccab6a0bbc5b1bf05fb967170c956f6b0be2ea18efba19a825a2fd6bce0ec71dca2890c315cd4ad657d8f7a3b6a419f2efcc69e6a535cb24f94f82375a97a0349e61c19952d4f97b4f360be18e6adc6b3eb6273713ca7104e0fe409868dc886072de66571b78102870590d973cefa11d1f298cd2e080f49104389f56a0e365ea6b28e5c317c27825e2cb638e683b5151bbac0081b5603a108d840738a9b6211ab3c6a8a6efb917bacc14778eb957d24f39c7eb0a3a702ccca36be0082c5da238724015c74b66d62f56baaf5fd74a0e5fc202b53616bab20c6c74928cd0ded28ccf1f96f0d1cf9dcbaa4775c86b1cebc97ee6c6cdf246b5171327858d3e43975ef3e992e72cfe55d8ed4330921dd553d494fa8697751a1b36be0c21d21d94dbf50629717502fbe49c4a344785947e2dc92dc65e5c4840ceb196accf2516d7859a2f649a62fccc3460e7a42469791f61f070d3b4e312c0b4d0c28ef54cd1167d9596247776c17b2c6bec1a2e0673bed69186a8f1f57ca0b7db6a3afd10f558ab2e64f06f79fa10b307821fcd242b6576f496ce7e5a2eeabe19b8394d392aa6f7adc151ea324e91b37ad13a698a481b2861c9cbc1dacfa6b0d3d2124f8f1a074959d4ce506a6608130d00f36a0173e9d41f4729243c07da7751e04d69da6b83897bc6ef0ae9e97cbb0837d2395154d56277376f0e4a8090fadb0b7305e1c5229f5bbe3c7e7780f692b3a0603c4292eabbb1c126e7cadfcf21b97a0b8a6dd1ed7341e53e15dcd37d82556024dc9bd62dc5150fd51685cfa0d432579d604636ebed75637c37df89197338a2a68126c7a869ea46040543f609fb8fc7b1ef349d24f63e5f7e4d4a4ad24ba28c6f94a90e62907a913c1bccfc157e19f4d09effaea174e601cdbde3c0b1 MD = 4e5132de5ad5300a472df3132e85ebaa94dd7dd0d910d390900adaff Len = 9224 Msg = c0b461ad07ae4ab2f42e33f85e7fceba9d6c4db29c0019f13090c70ea8fc4882a6315f532df258f0fad9f85c1898b08faf85151a1d5695094728620d31c7b3dbcd292ccf113b9ad54ce1e489ba373f9d561ea07beff4772c7ea29a79b7dc7f50dea4af69dc107728924ee1c66de5e3ac3b3dd51f3d6228227d05569861c415aa81abd068b6fa57b37328d65a5929048305ed9c4d2d2911b3eb597eb45806dbb05d447716c680a23c9878aa8ea58b0aeb5d33dd4ce7d099a771a7f913c42a3b2c1b7a8cb9352ac18ca94647aa7a935daceb19806594df27c5b6f6b1fdccb89ce46252f79a2a801a6b4d9894f6ffca658e56a66ee05cde25d6634e8dbc983966a2dbd6a001ce0b16a12c7879b95db78a5947e28d056656faa21fb775975135002c2e0d703549521df5efedde3dbbe335d465d6c61bdbcf0ef1933a51d51f32d44a02ff4d80c2dd98303effabc842d4ccc85989026ce2cfc98b66de09bf29ba49c6ffb520286135ed1ac0b7c8a31914b9fdca03273ea4e0933841ac869d9854c767ce36d27650e1867b1e1c1e166a2b623b614d1eda4989d4bfccaaaeb79389b6f4178a49b2b469c91b003793685a9f314ac66ed088f853f4e9aee26a5443df7f3681ba6f24b85620c20c0e10e313fa8cf1a06e2490d9c45b7e905ca3bdd0e088f5b5cd2b14812ff237edac7ecdbdc3ddf99756013915667146191f3f3b61143af85bcb64c93a7ca7434916c36f7f838b2b542d51ccd4c19f08f23328141e02fd091abd048c09c6a7aec956c91182c1fe4d7ffbfb913d5b4b8ec2a0449030323aee9aaaf2a516935940147276fbee059e27c0c9e7d079bedf9e326e7df9bf2c5770849a165c8a6e27c0d375b474ead8d383bd9efdd1af72c101eaa6b995f279be57809558f88ddc78f8ad646ac59ec00527218225db08fd5b7f9150e2aef2a0d56b35a4a0c34667b5ae4b49803733479cdc927d4738ace913dfcf72df8ae72906744cced603de9644ab542bdd10d1f5006ab8984b2ec2be53eb4e169871f89db8396c1ce2017df18eb771136b989f5199993dda190673028269b343f5ad4d8252833e94ac054901fb994a081119c6e3d031c64c9908e63f0722a902de850f633e1a6a411d576d4df41b8612b7d96e330bf9fef4b47b44fc4cded65a3b4066c5e3c697281b3e0f5edf03cd394521bdcab3ba8adc50a9b4c2b864e253f4277932a94f6d538f0458ba251ac986a439de2f313c150c56d85f18b37e76f5f1827131f87c96c962ef6feb2f282000ba69f7eaeb47458aaf516c86a5f23a491b99754b3816b7927a487c7964f57ab070f931844ba3c260415c0494f689d55658b3ae06d1e57bb7c156a9ea2b48809caf30b384b8173596f6404fcb0f0bf024911944ed2cb1873f1e631cc8eeebd9ce5d58a6729a6d4632b54774b2564032bcaf145e85af42863278b5fd9a14a42e4e63b731d7586b9c3e65b79cd234f0442598ea2458c3601e98b99575e9053c2722aa957d395cdae0c1f0d9eeb112e2cd6736e3bfedd1d2f77ac84bac3c287b6b54193cb1230d81b9c43df593d956df768b6f4957cc3f61badf8d1fc91be728a3ec97f3f61ad32ad04e3453b2d26aafe7982d62137e76d50f MD = 86b34d3d4bde0f05f9d5c409c0ff134dbe71d2c41640e081a9d3462a Len = 10016 Msg = 7b3cc6f18a27047f4cdc35404e44eb8e51b1855d4bcd54ccafd1fcfaeef71d1b3e3133cb9a1bbba10a2e98082437b44ad308eaee576e24448d63c03e71843981e1c503bca463b639aa1a6fb2959973657933166ae0d7dc451242ddb893736edbec5ffd6eaee73d6db50784e5aa507107cb98d17aeff0c3f6c4d61b0f5cac054ee869eb86c38f9865b25d9d4a6a45f35652a0e3c68ba123802e8742ebd41745045c4a93afe8430e4a29838388dd60447d95b313f5bcd2420ad5be19f6049d7825d06abd8f27ebe844a2e3fe480b8aaba21d3a2ab08a6b6abd43e169d5f324e4d8cc3133ce876f6f7aa6e4d532fda96fee709bf19efe54e1c1ff5afa33a995d346d907bc1511b7e815bceed2edbaa6d98818402d681f75ef3d918f94b62fd98b977e541f0ccbab9e3c6d69bb224a6a31989d8fa9b5f6b6de5982eaff068cd655f24480255abf34d81840bd5978b6dcbf4885f22c2e8900f43f58d102ccc876787fb2f396a7f538ddd1bd53749805e3cabe5ad07d7be2397b149eae67b0eca03e6850153a9d73a0f68e6c91d4293f699c22a3916543094bb903d9e8f459ff3cedd2a64fd8e243556b77d6e040d46d557b9de99cac2e041cf73193e772700931cee73d073a1e6d3e84b682a98141958fb057b35b1ae6dd967cc95313a89c136929cf9ca626faf7428970f8525f17c2fe8277893576109ca092f1a2d4608623cb46b24b95651deb4bc1d0c145a2fff98c3b25f3928a5747217fd1079260d6443f6cb7d33bbf31504075fb64e812a04420228b7ada1c60e8038c930ab571337bade406bbfffbdb2f08ed1c69a577a3aaa27ecea576f5d6862d015c33a55b45d2fdf7c88b4be3c58f8d715959e398af34fb9819fdccdd5f2a8726570bcae6b55017ea25cc863d9778b649dabb093e6de811b89209459ca3dbf942a9198dda2bfde408440517d2f8f36bbcc817813184d0cd25615149f94ca16b9f7de554fe4ee24a984ebe686a910694134bf6b2399df41729af5d41bdff84c583f9f8881bc70632e16a7fe0cd0abc1a978ade041e605ad80aa4b693b0668def3745d992f93d72852cc1d1e7c20a1ae38dae5adfa7740cf61167e3a99a29c3d1038a10d860592c29c17b3be512392ad840deefab9e82125b86216cea43f02f542ef026c418c33e08e8bf46428541f3e1f74327d0c93172edb1f9dabd7362d75e029ea2bde822af09e9b57867e3c77de7f90589b6f02a3696d918b38cf127c5d8c5bd0c2a9a1f88130b865cbaf476d1d08f4b9dc6dd15663d48a582be86e801abc074ed75f461d010985a77a480f3f686013dec66579908ca44c9ccbbfa4d91bd3beccc05bf918fe7d658538e4ee9f4ef9705fdff255e262416ac1bea15fd7ff87e4c3142c256ce800ea977de27fed4f599c858fa100dc7350675f6b59ea1d343d0bda494c75994c387746bfed3da9d7f4eb186bde04ef4e45b4de6835fe093857b67ae639441e9988be2b8541a265774ffe50eb25dc8b4195f5b72bd1e63c9a8c571d617f3b7d5e7601be54ac48a0abef48f78404e240fbc58c822c9a4d17c93f704a518a96361984f467a4698adbf4475d54dce7d090db68fbb7e10b9d3b52e5847a2cf81ec9493a08cffb25f387eeecadf14c6b020b7ed4c5d0ffa24117b61326355a242fb77c09b14fdf5e1d24da43ad6558fb011144ad7d55cf0af32d614cb7f46fab33710078807fc77e624364e0ee2999145832cb5774ced5820dfce2f6dc4fe409e496951ae8c82a036d6 MD = 197136a53a6bdd29e64182d93435be4427f06ba6a14675e3cf886b57 Len = 10808 Msg = 561fc7f9570f612df1d6868ea2922f40c6b55171a5fe05ecb0a8e7eb08e1bb2d407d574964ecbd423a69875bc775882d1584b0f634f630347f48df73208cdc63d716752df7794807b1b2a80794a2433455c201e3cc122f414052dc2ce4758347a153eb4d169e4ca5de17b3371101a77f0dd60ddf763a493a7b2da6be5b84f801289a8050cc430f4449016e95457bfe33c52a9c933956c747b94105d28ea282baf454fbdf1e50da0a7bd9a3c938f68e7b062576a71d4ef19280f6c11083b56b9a8bea25a116adf522fb05187bf25ba17d562f62c22a0a0f405bb4a11f44a6f9c877c2c63fbb42a8b251ef96527c937d6140b0298c6972697ccfe36ea8d95e756d4046a66015f73be306fde4f6dd856a50491093afe16f476c66ebf05248c427b06cdd8cad2db5f5dca199cc101d18b272fbb868d09ae7f038a734efc69bbf56ba85ee41cd0a6220c6aa2a144845369ceedd0e709a9dc4ad091a2633abda394bb213e38e69b4e802c8a91885455bc66fec777b73b2f1ecc607482a83aa0b194fc19c233929342de30b27cae7b06aaf7496526838c39e498359b8a6a96b3847a80faa160ab4911b0db6acaa023077dbf312f53b8873adc12b28f2046b9568aa9ec3c424cbb3d399c7f2be1f9d6e8c313388e85e2b6a253e089b7faa92d0a42c7b0673b542cd038e58e7e7918211b0997e21b437e9510ea760dbe602e6c6f3b485ff3d3138ab28e409bcae6877c2ecfb1a04e0308ad071e47c0faf722e1c5d2b06d7ad0076f54a82229a9b0d4529473f505bf4afd58e55dca4606364347dea7744b5488ac1527150eba837e6b4edc94e684b791e9334c27920f6893fbe8fa38188c29838e46aa636ab0f095c8bb77a0eaafef6e48c69c0a237f8a96b95fa8f3119252470a5e6f01cacf69ad8942e63685e9cf36988d6583f328e4c508167b6704107749bce6e58ea348670c095fb8b44cb4cf8154f23913959e2f956497e21244690112225a9e5888ce6157d57c5fa8b3a378e50a8f77476f41938e5b7e6d73671e7826b73409fdefc401178a235b923f3853c825dfa07df4b5e91659148e08f0a354fe07fda8ed5cbb9ea183df3cff63e5d8b1334d5545ca6d78d3ea04b451559a101e81320bb53437b2ac4f2a644eb63e7026bf63063d64cacb3d8ac980db2a5541feaf5ba2d41aaae58e687f621e9a94d29f26bb23a3386068b9b7dd6404d38763150ee4fec884979fde5c58d6dda5ab488115a04e35d9c0d9ef0daaee7ce582ebf81c687010e6805a029741030a5bc46a82e8cce663ad6e8733d8cc8091c4ea452e5450c73bd4f7ac91a5c2a7232182b10b3cab7c9b47bc093eb5ccbae21620171e433834a7c45ff012044813c69b58b4806da6716b2d5bc84630f60dec4db6da5e657978f3293bccea3f6bd9532dd8dd9918487551b2a05d00c702ea2ed030f75537aee49c982dabb0b38878675d6594aba92bf8cd9c3c2fe4d46de0184201069936430802858814dc0d387161ae91823ebcab6c5d3e81c9790581704727b97090edd063c375dd80e2a8f644d095ef2ed8bf61507f1e13b223c6f82b29d5ccdde2dad1886dedb0885b133c6332a7d0e2e02dc835b1bf54627b953c613ee0ada6f569b0d650518383abe8957d1658d9571b745a9c7396d652f6ecc8c2f4dcfe544f2718de2945d91b6b757bc2ea3d8ae3b14f82e563391c2c1c5a27c0fa3f116e66af5420473f23b800666a052caa4821680bfbc0df1a98265259c3dbad6b996dc24f0d1d38b1f5d20117ea946c43a39896360f8f65cfdd0a3f6847838d06f8dae8a29e557c22c201f42667f1177e2fa1d26a48c185ad5d204a120d492775b23e5036a24990160ab0400e8cbbbcde4ed582f53207bd478b00f8c39facfb5c57e08f67936a03105 MD = d1c82cd0224a5a141643726388c004461dd8b3aa540d4779ab7f0321 Len = 11600 Msg = 9fb6b9c886fd33af0fe62ceb277b147bdf5ba18dbfbbc49f5cabdbe42c9a28e99a1d827856ec4abdef2da1a7a3f6d891760d282281f2a4718d1f6b6de08e227d577ca263b56ded663b7067b079a443f563fb3b55a73e84843e51012841b9b782ff5b81514c8604f31c34e6ce508d3beecfad40efd9a74c1e98ca03dbf823cd42b942870ac34178acb90386c8d0baa9c5e2aca1b9be36e488c311db4fadd44d03aeba1c55c1a62fd93b64af68a23276c3c37fc478fff2340ae6aeef4c07d5200e054aa8fbeebc12c2c9e0c9746efd882d9bae13f743e425eb292aa99aae2d2cabe77b93c5f38b09af8cfe3cb5db24c94e91c2f4fd33129d75b50c70004be45b217cd44578781bfde7ab4670f392ae206dce42d151778685eeb2dcab47860394baebdd26df2475d4b34f40cef63ba374d179b611bcb648c69f4823c4370690bebc5d1e9fc1a0a0785ba075bc857d0cafc3bba61c06985e46d09d6722987496c370f92016e593a4cf27c56ca36a00f0b88bbc9b5af7c7d2efc9dc332d32771a8a1ee86af414a68ac35ee7adec6b6d577771a31d3356e8aca8d12b0c4dcdb826fb0e5184a21681593b4a2dc1fd516c49d4bd99b20feda6f25831b27cea30dec1fe875df786b3cb191e31c02f40e3a4cfb7b6c5e45682a6aee9329b0a6c2492f47bd3344a0ab32dd2565cc77f1bebbef008a5503a70de93e7421a0b3f3b717cc65a38fd0595dd4e8dca136b3af82f61b5afd2613cc5c913a64b312ca1bfdf433f83ffe1b18efad752629ed4e73e79362494852173bd0bcef2ecc126ba61359067df6f07d55fd26f270644290e558fe548a006b766c16b6ed30d102112873d0a4754d297f96f2dbf169e4e9337a5391526b99c4c9e37b298519667442f9bbd5ae6cb6ebba526d36e26120439eb96416ec8c89108a189a8f6756f0eb79b037e274c2d8d9962ec8c255f4aae44b1906e9a35b62b12f91d153046814da3de29481a82607559b7291f8cca2f94db12fb873e7569b3932d5dc1eeccb26c307e73e3db8f4e6e242d45554a6ea7fe27953f550591cb70b2c6b074d710ebb285054b16117bddc2224ba8f608549b334fc2c4a09490c3ac984b7df593191569cbfb18aa644ff7b77a99bbca6d82f47c7c21f22f967a38ad6c442e0dcbf016d729e641687e128397559fe49822029821d63b32ccb15714bd573a2a84279bd844c850301504cc69a8dae68c2acedc716a8497ea3d8d303e2281b4d9224e2441facfc04c7ca185913332f51c461a16669eafbd844bd30c9e24113aa3aee9923b4067bffd64fb46e37f8454fab5aeba5e077e3666be2bf41c0d3054f0f29feead5db8d4ab94ba1647d6f98c903e31cf43eb1a89fa5e3cefa023058b28b4193f7e9ae987bed587fea57eb92445ab4c5efc93aa3ea6f3af0512b0b966b3bdfe8d983f23609eef0a05e5c0eba480c3a66e714757ded4442b3e5afa736ef9d5f7e1e2948de8b4aaea33efe4b794ab4de8078a4f49f0eb1a59a3604a5c2963c3ac4244e050a666cecf90ab32467d2d12b9312ff2a7fc533de13b0de79c215751c4b8a66d93221d22632501f2c0e76edac2f54879998a73756a0f471b5ade3e45e84bf0817fe5426f4bf9da6b4d58d66caa5abd2c4923b58a9c25f72cbee68168bf040a653c763b7d32141ce6135acd921a697653dc4e804321870663f1c38682f2eadd61f15d7214be7fb1ab3d74bb12ba295b367d943d699e3d5a081bfdb75b28054fbcc6234dfc97417f02f12f08b531a2551d527c52c4be4ddd63631a7bba0a5e49c0e44f36fc6662703357111c4328dc4a4f838e281c26c175bbf2a439693ffcb4b3736994ded3eb6b8599a45f8446e024153952273981a00c5af0235b2e70e876de9afacf6885e35742dc703a4034b5c9b79c51b7e375f38986841d48d24528798982894f6325521eb04bfc133e9963237dd31241e1aac1d488d61c681d65c6a3fc539e7b965a41a7170bd053471ef318ae071d2bfcca12d5a80fa723d679c9de7e34c1bdcbcdb6dac1477463236b6c92945ffb MD = f97cf08fe663a2506c5c8ff6284bdd9edb71181e9271d3fe19d4d205 Len = 12392 Msg = 9a56a80c07149fd9d166e0b59a31486032d93ef168c02e75200a39d9a6a42a0a4284ac5a0d32bb26028759b558b4826410876100caeac474dcadcea4a585eb981f5409ddb4aa0628538c643dc275440f369b922921737d4c4b772a5a2427a972594e285da5866629eafe6b13807b77abcc9d383215643f4794f2b5c3ca934ae117fa6fa287cec56fef65d50039cf017efc16bae450c4f4abe0a6d7a640d0b82b81e1477303880a438b470acc9577ccd1ec8d8207779b83c1561af9cc2ee6d998c08a1999c1be1dede52e723f3e7dbeebc48af76335f2d4d11fd681fe3ade9772fc7d4bdd6877e6b527a17521d9e8c116ad9581bf2fd0cf236262d9020fbfd9ff5c434705a0bc4ce376297b3911c1bc98cf3788e5103d5cfe484767a053918689096373d913943abefd4dec508b0f96ba51f7749b7e4163acf90c95a2af5c88562b6539236707958fe195302ef2da39c45b5eaeaa21e5cc739c39caceca29c6aee9d200a9441d469e4d89af9bec2b8cfe17f39cdaa3307f9c59566dee4dff28db6b312f3453df353367b2d15f210977afab3ea7f2a92b646e59ece8c8dfe79624da0a308c3b544a965797ff413b7ce2213fc737bcdedc6433c482a22529e8f8d05ee66a79a5846e0e46c09f0bdf8cb59afc17b5fee74d6531c2a103ccd20a36281e4b45c3397887e55cb61b83b742d86309b587816f8650b279d073878355397443c429319e377e61c000d9726ba534c48f29170d1c8d0efc14975a1ce4d2e7fcf4d67e8d7dc93ccb9b26439fa3bdaf04b6fccc6a966c8657b97e20549c8829075a0bac9d7d37a86b14b1bfd40693326da5b50d5f862b9f0d910e2df75480e8de9cea1b2a4788a9885428b7d73c2ea64585dc44b594d04365c3ceeacdb3c00acae4fb34fb82c4296b82139271ee97f1d57df9d834676559a67747bd9d6252781157c75ddad7f40f5dc7fbb86ac4d4fd65b69531a4a8f1c819d7ff0f31083d1bfb1fd5ff8dee1f43a44b66918a65efb03d5837b7cdfe7d7a060880494f4e8adad264ad83dd6e4dac8835df85997aeff4a48a68d277121056b53552d1c0dc409cdc4dd84f9200863453adebfc5eaaddb0e474afea698cb2446d84fb114c59674b6303ddcd744bd3c24bdd145ea29ec0cc433f94676c136b2c771d056fba6e08ceadae44644af83b3fbaebe1132dfda02f0a139fb1484f44f61b29f855d4c22a0d0274967bdeaec791e6ffda83c77086c380175930c5e9448ba1d05a2a60fed5f0ac805a7cf6167ea118428816389f786fef74494caa8974d15139b55627c9115ff2f818ce5bd7685797db72354731811b9d51f86ec1d6dab1738d9041f1cce7421b0559d9d59a8d9badf32146becfa6afd3d7ecfcd07980134ef3745386ae5e8170cea3052c07f656a0b21bb36320f114d92eaf60a0196ee02b94e8f4ad187f04397c81ba27c5aa6eb93feae2ffcd6930f77dc900f95fabfe5298748c30b251b3be3678608f7db1cd40c3153d597d16ec75ecc046a3f33f570b26a083d523dc774625125f2cd614597d65252a3bd901319aa51e99657c32d29e66f541651428361a70d61fc679dafcb74ea1136b8831e5b0cd6a6008a38c565281fa2ea72c3eda83414c09250d0b9d38a5115fb233aef1fd8f2d05550f56cd719f38b265142549c7bdfd83103bb0244693fe76d882813eca11eeef1168981e41e735366573e56d2e0e70f651abcf782a40efc0a51cb1b35e7b3586075858310b827b2070f2872c025c2dcbae0473832cd36ca5e1aa463703f68b32fe85a0ee169892da4e39117089cebd68f0efa12c9375fd8d53d349b4ffaa765bbd97773dac5000cac7ef8e200d8da737df13635ba94d2be0c440c1119bbe80690d37e60613d24f5aa3bc0324d4c0739e4219c0f8b4847d06fc99b6361f5a31c4b60df331944706f1a94a7a642690aa07e2a8c1ecfd417c67c385310bd3a810d480c0a9a677d7aef6a23efac74d25d3d988696c1dccadae6be1ac3877fecda50233f90d4d04a9ced357438c3790a6767cfa03cb7469f09d7b1db7d665eaf478b4965f290e83e6eeef8dff379c363c1c58011fe6d91b31d1fd404e10badd431253729b04d23bb597b20f1a03dc880e4cd56465c3352b98d15b1218f05f20e2fa488f54a67f753f4f84a43df8e0ce458e5bed7c6c6ee14e25fb5bbe MD = 05be5210d70c1d8de9c777a2d7c5a3957a639c53015c1020ec0151a6 Len = 13184 Msg = cefd494f2fa82277de69b677e76c8f814808bc39a69f23ba3fc619d920a630ad98a2504fec3b0ade4c3028c606e98942fa152c204e938ac5638e297007ed6ec3eceab37f5800998f1f0b9f48cfabf4ef2ae98a7bd91d6c9d5e0f51fe4b5c71c8b11b9767dcc178913d424383a879798ec0caffd3af06724b1a8eba0a53bce2c4d17e2690de444eec901d3b01fa1cc029a301b3af381543d67d568b1c89d468bf335b8881c852c4a8ffe3b04a2e5d70c7bdd6cd97db14884671aeedbc546eacc2bffae5c200b382ce71dec9e4aa023171f590751303c9e8a3dddd08731c5055d45da264dcf02f2f66d054af59d8d3ad2e3379d5ac15fe0cf6a82c03c84a430cfef59d2d56fe8e7376038e89311f9a89065fd712e97a799b47bce30744440f79476f3169b89497f808f2d480f2e61d700162f357539a033e9c004a3b6d737c43b7b3a7408b19136323856ebc26972508282215ca70dd639dff5ca8c8ce3f521356aa47d955f5cb5fd0a4a36454997af982888593cbac635f77b847d5ec1158902d3a585da18f84921637bca10554e4ec177c8adbe96dc92c0cfc6d8b514f5763434c24f3f45109a4fd26019ac0302b89f0e76dca548a5eaec711631284631833a0c9f1c4d8a2213e8d59ba780d95167714af77879369ea8aafdd71910db360a94d9708f8d4ea9308cfb82f6274eb6f5f8bbeed3b2e74356bcd49de3075a9fa6d51a0b1b6719228a9ca2ca8817e9afce85efa1a0dad1106f7273df41942abad26b4ca33263500a8ca869b6cfcb20a86bb944d452699aa26d6c8a2f971ff23407c7fffd871aa9ddb120cefc4fc99a3d47f359eb5ad7aa65eb1b55e366331787c19b926e6bf58d1882a630ef8a9b9ceb0dd4ad4b3cbd66d7430f75bf314621229a26a27a637c60579b993e2502a9df1e07ddad987a8376730fa977f78af19590fc29aea60027c9f7468a55113a8ca762d06ed94796b24fc5cb89db40c5adfb5f51f52565c47020942dfa0458b4acac35f218bedd13d2694be110fe1f83d3b8ea4619955e12fe1a9abc58ca5fe3923423e75bdccd645c49720aef7ee8582b54ce53178cf38e2a0e976c27259b59c605991ab8a19d1ac866d48365cc2f84ed5577e37f6aaaa87c7306d805948f89c0672226afbbc0a99f47efe5247479ccc2417371a1bcf7d47dee556a4495c0f619ff4b75b179ec93597320caabf64b82129f5da82ef26f9496e72fad94a7c4112b3471925e6a556a7f6f239e5cc0193786c572d197b9768b6fe3e21c56590d7d8c8d3107170baf81899244cac760776f776a6fa84c60b10b517b19210a18119da68ff64e7bec6f9b009320ea6c65ca9c6ce4b076ed8683b6f4033176307354f411a35dc2ed7af9f96cd82477cc3e9740efcac1c7dba982f0b012c76669d95c13467dd41efc35f33f36d7ebed576961ff789330359738134b2e20478c06d89b7dcd55d5bd18bbcfcee728c3d5ae54cf1a8fc4783ab0b0d948c6c23e5197ffa7860ee1ef27d36b044b063168ab31af1334add4f631b8b2395c026f2851bd9ce4de93a88ce9acc225161c8836e871d6e2e04b5b56c50faaa817799d7206c85ef7e9f4004b6d156f96d272a3bb17ef4ac27ff0be066f3608c9ed84b3b7db48b4353a988f874cada1fde2d0fa61b41a9926962673819abc6b0350cc687659cf1b413309acdce2c637bec99022c747844073b5651254c2133fe8d3a9221a0cbc129085bffec8da0f6f5e194883583cbcbf5e403520fc9fdaf5ef08b3573f6eb038978533ebb79cd9d7503452b2911e04843ad90f15e56e642b8a42739e32fa1bdbeac3fdfa4595c5fe39cd57270e662c2d9de26b77abc84f5f4f23526db1297f9afec486a0ef6f44527f26be572caf7429fbfec2bccc280cffa22dd82c26875be4480966861193e552a4d300d978547cf7d970bd5ba3282d8b27c49d700f9e21565af50610488e199d2f74c7148defb715bb0aa3dadd3311905489eacfd8d8704fac29fdb610c86190837e69aeb9fbb302150f2ec0e6c3699d9cd078a20ec0c96eb01aa60df6cd5dcb554260eea8e2e15b7c00b6943c638611854aaf8d3dd18d020b49a77e67275eabf973557ab74fd2705481c3cb6a9e077a825af7e7e2a53bc822396a9dee40f4b10483bfd9818d06ff32f4deecddcd6e573883fa487996761f796c77c2f8b4a088eaf5f8617444df36abfc806f229c1b35fc582f357f3f9c76854547a422fcf272313ca7c92be1fbd503eb20c8c564ae756239ff256ffb4f7bea6662b7d9845b3b6bea466704fecd58ff53688032c188b3febbe2aec873df8dfd42516498d55b1 MD = 12bfb13c57b24ec9088ed5f6fe67ea38010d00f6744cee29629061e4 Len = 13976 Msg = 3d9446bd9e5c72f122b7ee181ac32e663f635cf3999355b2a0f8f5a2a2bb94486498d05c0c328dc33eaa3bbd866f5860f658354510f0fc81e611f2d67fb4fa2b7d075b3afdc0c289bfb18b9b879d3c67c24b52096dd841b83351b6f8d5821f10cf086dbf39ae182bebf6641ae4f5e464ed643ca979f52a3fd0e3c86e6ccd0be0a3c4905387a398910b9e51a2671e5740bdcd7a8bfcecc2fe05edb0a20c3ec78141634b5eb04749a366d4d79bd6c19de17bab9419be680edd1998f7fa7d7c5addf10c26487d43334a46be806dfa85bf316e2913b9860f18c5560b24e08630ccdbfbe7aa79b33f5e6cf184d3809b13c417e06c7ed51d89e79c026fbfbbf1022662a61d5e5a1de2d3f2b04f583d8112b47a179f5dd44c7f834c66eb50f384996f5c3cd6cb5182d599c5cb47980a732b97445ce8391ed999f5bbcaa860f0089eafb0033977c7a9c0b8cb8a931a503a06765cf76f981b8c7e44d375cd761944b8ee46446fec255b4939ee355c66789e4a58aa305d05332fd7787ab1831bd802903506469fb2d1601b231513c905e867a046164fda05ce884b9a9ac4f2d69408ce8bd853f24f3580dc7e286d037e0a5daf47889b0d22546183b01af7412fb61f19f9a4b1904db78335520e8b315945482063e85d1fe32d8026c5e29299aea40f198652a9a034c130cda8b1b57c1f00ef9aa21ede38d0c1addddedadd21dcc7a0773aca834b8aba504d87f8330c57a51bc60d12637e7278b25005ea200240879adb1df487b8d90aab5cf8cb4c08899b944babad371c50bb562641faa263634dc4ec38b8fd10a81809a302124a983e4a22d385d5a138f3f060089bf2ac6dcb7fe75392ff2c7a804e32c9adb573e6fc1a8d03a173e8fbe181999d19ba86470287cbb833af5d1fe813ed77019d10174e739c850970558ca4d4c98ec63a781b90cb38c124b2d82668cf045507b06856b9bd1901c5b23013c453b882a75bca0efbb5f6196ceee5b888eb3d0ac6d7c5c9c760ca1edb23c1bac7642d22c603c34acdabcc66134dccfdd1cd613f46fb6d98ffc4778555aa4fa73771f1162a1bacf78d17845122b6d41ccade389b9002a9ece951eade3a2e24029be1cd05db8ccd3cc460e481a010463efc8689c7abd6c1ed0e70ead0939986f47c1c8697e23c6e42f9eeb59f95456a8aed2e1e6a9f5dfdc2f5873e0367d2bea5618ae7754615d731b429be520a3c8829273cbd2d7581a5942700af20bec1133cd293b7470ffe50307e79c94305dde842321a2fb83428008a2a4105cfa14ecfe1579fbdb445de2067dd469c199110d2fe942e3bb2e43c57cd88b408b7166138be7916c265f19f90ff5bf8017db3bd8d85d7e2abc48ea4f284c8bf7f8128e298f8bf608e021b28e82080f7bd1775cc62fe829d4695394819d873cc34d4dcb935bab2e5e932c96170f1d3ab9b8ede2599911ec6d3ceed1014f11042ed593cce582ad80d9b9d05326f9bdc7d628bf6b17a6832c71b16b2e42af6278973b84f094870bc416becd6832f4523d3d9b5c6564ca84607e61691aca50f41098e981d534fb5e3e723c7453cf6183116cab555fd597ce3eefb759150cb66e52905a1af92b321d76989d558450d3c8daffb32ac8fe70a90e424dcbbb8e5209b54a27c0cb0bddb1f2d66bf1986bcd8bf0434d5d1f23f7ad55127f315cd3a68ebef2bd13c93b50c439d812c90e84a15507f3f46ce10a9f53a9dcd61aa7514645e6369474825e3dbcb1fa4c5c451011ac787e32cabcf6ca34830decf7f99b93c7b182487374c8e71401d9532bdaa2710ac83e72f6e19d2ab867322e49e227219ca76243911f200f52afe1d1a83dc051e88dd14f821d521357ccc61490ef68723d4e63004dffe7f900f2a04261fcee36de1fc322fcbeba26bb3a462a5d7ff408120ce1290a858546a790912fd986709244248097c75429d73b264eea10223e55c3797908674e8c7aaef030f47f691be6c3029608526c45a750172cde5954cbddb9faa738e4b961f79fa80c2ae41334b6d350700f5e658209a2938c7189b611127e26d824f364aa6fe21e8f4d88234f84ed84ab272bde63909b11ca3e2194a2967874a87723ceca262eca36d6dc17e0d38a25a3ca4b457ebeb21882bed19ef4dc417a8489e66645ccce319f51604f8d25219a06635d2917f6802e325dea238c56619ef8f7cbb9a1c658fb2547b558a8fc5c782faca207d3da7db955a60bd0dd874158622b443762a5477d75143bb1c8bb83469be0ea4036cd1340692197156d01694d7c9ed06e1cdc223eeb6163f960f54e6be7ca6680c550d959e95b1c6fbf3761d494ecf0dc14ed71c61499ee7e063c067e7fa3d747e418487c52ad1c4e48ab9384478045f00f5bae996d380bde3cf253f4e0179ce43765e91e31b2174f9dc0a6d300e3104840a9412f71b67c9859babf459580280413dc23c602e48dd23338f4576d9010537d58c20 MD = d07a5cfa89951f608bac73886f5bd9f9c5bf4fe49e9b0ac7d307abfb Len = 14768 Msg = d8aff08f7f75b638cdef556e35d970d41f0b4b2e8b938e19f80745fa841a2a34546c279e36a7173485c7cd0c4eb9578cb02883db8994a3954fa48ec33bbde70aadd3a222cc7fc38a6c52697a366a0c1a024203f188ce49a038c880d066453669aa8b6804872644a44a3933a0351317e4dd02d15ad16c07a27c1b24094dd9a0b9153d812db0c422e8e723336795dc01540910f7fcac946503e347815637a2ac62b490f6848e80e3c00bb970b59cee51d04d137dc1606fec2b35f19fa06ec7e2cc502dcef06b8311937da3f27494718fc273b4698f372423833ac387cd3871ca5fb0bb115b8df533c80688c18ac38c4491419ac55077db9371ba6540c7dec8ed849ee3c7ac3dfdd2c96e11e6e17268f7a5806d99eb69bec25e7c7fd274a7f3d2a1e04df9cbc3c375fd7de5685fe82d3066f7d7eb4855f23ab349b846bedd1b01203fa0af9f6770a4ccfaad4fee6f02773c707ec54f83a283d6e9b8a38cc66703678385ef12712ce89eaf10a3754d0f558fb10a2ee83af423312428f1c5ac005fe074a3c30b281ec7db62b76ddbcb7d51c784242ffbc410a42ac2b03953d50d9df1d9a33273d66fcbebdc49b50a3174f44caf74ce70671f8e2b8af7821d8ab746047c2c4430c1467c37e56f81e9c71bc486faa1152f6c49679b45a6d40b1226e18023e7022b31cc612545d1db60d49b4bde2f540c201bb5b9e2bb643705b781f6cd977b734c7029021ec316ca57a21c11ba1434ba2cbb8c0b68b4dab4f3bff10d53a091a07cc584e78b28e657b677c59d8373ea273996f5e694f8b052bd739daf7905d18fa1770599d23ceb88659cbe77a2121d5b30f219d1d04e8d1a4c1bae63a990e24aa4cfd69f5dc7ca674d5930277db9765ffa1820548480191286ff4bb24b076dd96e151c8192912efc54f543357e329c3a7d5031f71654fd4454669d23c5331942e69102c8db61bd4e63ba1e2a0c4439f4a3e17443ef93e1b89f9acb3e80dc8f8ff38aadfb9f011f6563eeea8e8eb6f296531512bf77056c754de1fe8be4ca77c87f4a48a24537fd493adacee76e517126753233f41671478347845e935ac478f37117f94537ccff03d2c6f3bf13dd5eaff081fe6835a01aea76ca12dd48943a1ab13ae86ddc88cc9911fa809de5226036ae4a9ca53a5b8cb2c1fd43f11700664426fb3fa19c320d16e1bd9e0a4ce720c596d535338f6845e40f63185830d1a47abaa1236adf94697f2959758db0f646639069f0989a8fee884a46ba99f9ce9bc35476be4f0d7489ded1142cae79157919844ff55ec59a2fa459ec503cdcc1f427dcc038d88e9b143ac037ecf50f0d61ee5ad06d0c774faf42249e03ca407056ae3bc8b98dcbd1b39ce009dcebdba5a7eafa32802b1778176993a3fbca8da56a6157d668f72add0e0b18d4251743a7f3154dbd55420fdb0e228e455fc42a26d84719316d9d1489cc8f50deee01b0d9ec7839bb15d9c6413d74fdca574081bb47686923f107f29b9630707160328b053b1aa772e779a4714b67c87b0dc7f92e5fcd30f21cbe2adc13f761d3a3313af18803802bf4a81135e103d7a0a6e0fa46c97d54e715492614eceb094cde8627667a3caa2e63f17553a75112814d14ecca2d80bf4a05304c0bc815512639bab82bb9cc0fc35dd938944458626528ea388332df576313fc0688507b21a7dd54570aeebb96320aeac2c06120ad965fea443981a106796834bb552c276219f2dc6bc9c11226c291ab7c9fa5b2dd5a1b9c79b3c2ceb3d62b60d2380321fac29fdb5c31d9d8a9bd1ba4ccf8b915d8fa84893fbb9c6f46c08509b5fa7d6fd3eb0dd8910adf150669cf5e1b95445188bdc138ff17b78ba6809eb6cb63431bd4db645b741c7ad1250fd660d23cef6fd3edfb311f90bc2abd5e9def7c3afd2de4dccbec6c2e5315eef6573257b66276a3d059fd09ee535472a1aa3c304953abed346a14e10a11e849687b5d14cb446edfb0042323f92312ad93ef264f56eb9fd62c6a5a3b765d531eab6a686f423e606fd3232bd779d56b567a9134412a7010870cf347e33bdf5d55084bdbd2e5f7533b82df9e8c351068569fbbef6f8d8807e71c2c623f213e0ed6c7463fa47a184f2a046003a9f67d10934a93dd3f46db8be0a43e33b8ef236e8930851b4dca485c26a3cde29884c46bf6c341881a1f12a459eb5142b76f3586568b2df7359d308317a54ec4c0a78c816751ee7869ded55a3b3a8b18a2671d5d261f695bc4bb77cbe3530d2f89277d5bcf3dc233924ccbb66cd9173ce2a082fbdf355fd062ebc63d73f52fae5bcb400014d0e443ff319dbfd5101b36e0e20d696b1537dd77f6c5dfafd3dfc69e5c7d78204f7d301655f37e5e27c08f03f466aeb0071a0b6ba51bbb7f344301baa3dbccd905b480417f73f9f0652dceb2a034d2985330e1a6be71d9cc6283e6186503032939b2bde779c83a71138b7b57ac1fde0a40a0e790096e3f7ca3c8fd1e6d9d25f7329e6e6f099849cb79011e59e1d1d9ed1793a59150bbf779403acf3582503b2a39a11c43f88c2ce4dfb8402007efcb2b2130a41259ff09a98100e3c56bc44bac96e34eca0d4beda68dd76814e624bdaba3a0 MD = 4d6d3f7117c907aefb7bfaf2fc0f01960c4968e824fe0483ef66916d Len = 15560 Msg = 943e365bf18e4a49e5b21c5e43022c6ca5820325ff1e69837a34d7677f532f801143ab6e614513279c9b349a084b8d934f214bdf1bf378b0e2286f43047b93bf13fd4061715902d6215c05e8d7b5cd5d51f9271ceaea60926df8b454270809064075de7b4b547e1d1bfd7990d8c7549253128026978b89f1c1ab90e41181fb1b40b26b0514beeec6338477d935098bfafc753c43485e5b958649ea39e96ed0c7bcbcd047f71dbc9710fbe60d1303d85cf52945bc26ec3f4565dba99cd858f0d25c9cf6891afb4f595b69b0729d3ea482e53681d958bc9bcb0568b75506c6c304c759c413a5df0fd3bbd7bc50f841583275a5dae10656d8ed10f8fbac9a40b125a6fb212cc15264cfd94cf2f14f945a354d7d371e5a435f742b945de9bc4e22fca08bf71e96dbb6135cd03a9cc8c0145314c67fd67a0a97270042c55396797e525e0f2d2f4b026d69ed6b7c988b4cec5373889c528e33e7d0370c1b334d482def8792aba8084ff1973426a02ec1c04cff11cc75dabf47b93578fa47d10c44979bc41959d1f74bab65d8088ea692a59b1d9799f2b534cd74206a133275f9f3241ebdae1ff13d7d019d821a2f4825814176acf8fb2d174d7f57b55fc2673cdf3d3f1958e551056d5c05d963695ba3dfa6d2f9f078888d4f44a202e6e0eefe9048c78120933a75a4256786eb2529334432f92589510fc05c2acbf9b17554678daf7f9c0c11f2b5a9c28930ba4cf8fe3a4db2d9cb6f0ad8fb999841c767df9e5ed82c132747c1ee049d3380d9c4112c485fc6bdbfb8c1fcb5f9d38330a0d8cc8b2d998d761df1483e1c2f1d4f77bce4f7d0fe786c157b5511b34266f50687189c148db3037cc9eadea944b1244b414ecd0820b3db6e820b972dae931d8333ab1af7cf2dd54a90fd6cab39e1602ae793546ff41512ac1c45cfd0deb1b0fe25ac8d3d28a2f4718fa8718ad7570cfbf7db146d44471bb5922b42049c69b75ea6447b4e60ba69d70e1474ade6bb30a6b94d946bd6f0fe732ce77732ae63388dfc9b6e923f1e3b665468fd7e2eb4d21275125ccf73b9c1cd319ef6c0dd463e726fd8ed718d767204abcd946476ebfc297351f403e34a6eaaeb7b4818f1bacef5492481531169179b596bc2c78808b5d2fa33e56dee4a0cf4a0a3f4a0b269f2fed0a6b0a094a03012a7690e0f2ab206f554e0b5775c62a492994182c2e8f8b1754e8705c0dec3c851ddf001a52591f57bc77fef88f4393d6c1e7b7be55a12144209ee051bb779e440432721ef404e8d4a9c3918077f78df6a76796670d15d214e4a043a19e76a8ec72137f9564591d34b1b35ba5ec6c69274eb64cbcd1581e27f58f02b23353fcdcebe470e43fa01d1668b9c5cf48ecc5f72c3643263ee275fbe7ddb609f6aa0aa3d6380ea1c29478e8436958731a2314d4c47a0249a24f79ff4ffed62f74e342bfc580a144a980b128b6249c27dc99e65eabf4128da7e98aa07274db891a9a45bf3e50c143610f4666558df9540cabbae34736ec78bc5b388e13d24ead743973f0b52ae734758aa91f8608088e26e2f3013aa508815c1ef42688999812fe4b6e12ae61ab8e43ad69b2ec15424cb7da3f36dae0ff3e13af5de8652d5040353a94839ea756b777c208dedc582f064bfbe002cc5d29055f86c6722e200fbba59177c21a6ea1467e72f6e1fb2337513fb295e3638c1e8dac2fde2237f41eebcbea986c8629e3c1c43ac46abd18e3941fb8b15754f0682d96250597372c066714a066d1866bc6afe583e1d796abcc657858d2ecf51c6e6b89e0cd3f903a6eb41c4d639f8f96a2775ed8efc71c5e4a4bb62d7b02e882c9de13fd9599d791b0394f6c3f24f65d0fae9cc43ea7b292f59d75a10a3793a5d2eba0d61f2471e4638d2a673a107f0186bc2bb06f07fe0c56f1234e00f98b08421adcf49a6df385011639d8e4e07e3670268837f156530cd6ed3baf1fd7232c7ff204f3c7d4d106016afa3bdff3786e84843ec556115626fdc84b2e874f1074e4f7d53e08079ee9fd01f80a8be7f20c0c4bbbd31dc77bdd5438ce5707dfc7942992ba4ddb64c1935c619fbf692c7fb1aff39c0ba8f748b242a531b2f1f7bcecb66920adc28acdb498006dd4f84f75d1c7f23bb9981f212871a411bcd62574f103c1a4c85dc827a03874fee5d9af78feecee37775bada9c249abeaff34e76443aa62b347fdcb73f8c625af6c5deafd9b974dfbcf743156f2332329d49ecc1f570292d88733031720c9991bd32580882a5f78151c7238ad3ad6a05ae764320a9db4f881108deda5baab55b0a4a0fe8d4d9e130008c622012eacb9faa235b7caaa39fa497e7f099428f3d1fa7b50b39157eb9538fee09c17301dc6859f73dbb3eefa1eae2b76d556ee3b9475a1c54e18ebb0854c7971f543d1a25c9839bf0c7aee7dec0b9215ef828cdb23aec27f3ca87b9559a702cacc0b95f2f28efb67c8642b5dd8fe5cdca69b875af60257defda479f288d5258b9ef2ff681ee66f1eae2417e26c02f62b99066043821ccc750fb1896099534c14cc8e607a484b0f441c2f56d42b95c8934557aa2d5e5abac1e1440c6811ae00f703328bb1e509566890da4a7b8e437e941a03b760f1488d5620c085617841ceb2a183b3979bcddefcbad975710a8872beb59f2a96d162ce924cdb86f543bb1fd845f68aa3c2f4f380e8916a3d36c13f63768e76278535f916a3e9838bfa767ec85f1f736f011b4e95a8968b3889aa4f3 MD = a44335bfa12a61f8971109350e6ffc62c1237f3f662b7ec27b520370 Len = 16352 Msg = aaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6 MD = d3b2c5168685d9419893d8bbad9c144bf4ad7b416cd5bd2c2d90a11b Len = 17144 Msg = 098fff593ee4614b5cea6b1c5ec57f33602950074c6fa4d7b5e8599b0371a63ad147a4fd931d0d447c6c43789f0b944054ffbcf8dd94ab5f49ad898f9958f83322a599f432b9d134f61ecdff9b5dc33eb4cf7b2edcb00f119c75ef248f5f27d0c351e52463df358393a7109a9ce495954940969391ea565775e991402cb0bd7b7ef290776eb7c2991bb01432e8c791aedbfb140e436b0a989eb079ccb970429b1930a3d49a6affdf56e0e2adc82f40ef32a7fd863b5ab23bdd73afb17eca3c975db52522302075bb0ce081f5844428c115ed5ae5c2e0d7aafbda39d5c3e435d912261e4b7800aa960457f9f0642dd38d4d7532121e25004cc08c2122d0e6b4c8002e9636ba3328d907ee5388b013c9b9a3e68df59750b589f3326f7fecf942ccee7396cb3ee177eadd4d96a4af1d90afdce97376778a7fc95e7329d36145664da69d25f24b301d334e1bca2baa74b2d5c325ed7d04fae474c7f8590875f1a8b3ee554c932b4ba41a2200f707e93fb7951f4302f288c96ef2f7690605712590678f4312962458940920a6261fb4a72556b7eabbbd491ea5acb66d39b29d0ba7cf510e7fe37f80736711b25f5b53d4867f54c31ec690221008cbacf9f740c87454fb5e9b6384eacb9cbdcfa8a30ded617abe7536f6a4fc376f00cf4ebca3877f5e57dd6ffc7abf2310eca30bdf2c1b3faebda90833cfd5a24a1b7e40e90f6e51562b310297ab26042b66d68ff7f685a78319079e6657d5daffe560d866caa571a240025c1d5d48f555f2113cd3b45421619936ff78852366f8261e1d1b1c5567ac5ef98674d94c7ef65afc1b5cadaf35b007df334fa1e8ce9ba65f18f14fa6bcdb4cbd8786675b2776643e33782bbf6cd829a943d5f34b9b522ccccfceaabff796d4f767394e9d793dd97f8d1074ab4d41c73d36f0c2755484820d4c9c74c9a047bc4f2f77d839fbb380692f0dd19c6154ab42148a588e81986ec99741f6eb4055cd6ce6274b58364023a223558aba2e779c61e58afbbdaaf8b9a8b6a7784e5e28cff79431f021b04d88d271d2e72c3e136142b2d8f42a580b2b54b3b4411982288a97417c0fbdf34078a21f6a301b1991c38c825c8bfe12398b7295529b7534bdc6f5f6f2f0538783bbb93707acae45578ae85efe076161eaa3ad6568cc8afd4f4ab9bb7ada0cf27c19c1c090a40e4ccf7efd4da6b27acc8639aa2add1d7f6446df8a96fc1710be955a5fc3ed6062b6606674573cd272db751614ec9bd67df20a4d109161ed867235453d470628d309710cf484a8b07016200291b4893fab2d035cf4b38fa59697c3a40354c34489cf6c3626ddd2949d06edc4c9898fa0329f99d3de046f866ab4a93d59f20cfbab8fb8adb169a2c5213245266673954039d0357c758de9da27514ed8e52ac99762d2bd393f31018d232291ee0d7a8368e9473d1d6255e6e7f8f71a3f5203e25ed51fe3a1753bd532cb5f37e568a741606a8c1b7f4d644cf7032c753946863f992dfe92affd9108fd4270a1d31f01b870e327356adcc30550707bc78d69bac88f91f732297f3b8036b0dd3580da90cee07ca1f5a6ba79f73a6869780465a7668a2a932bd8a23f27253d2f5db3405d6cf75f80c2fa8d8e0cff1380f066df55ffd01f59e5840fa7e3120fed8036f96f7bfeb14f032ffe0b2ae69847987b82cd7caa99d2c9f56e7b9e44519f05cfaecfe13d9d93220db4f73b361f46d60af316c660c0843df266c13f0429ce5647078388fc48d6865c585a2638d20613dddd38c33abbf9aa459f83ae9abf01da65ab955683dd9f97e4913dd334d70eb8bae63c5d80b3b979b4c2c8d34e3cc0f9f3430c35198277bd6d08a72a7156e62b6ab6297b79cf4a100877999667c8931bb776f10c085fe560be64a013397817d6b5f607056e3836d90865fddf2f8a03a87bed4bc2969e71e8a04e3076d2642820624edee2a715053a7e35fc96ecab9708054f22410c64a3bddb6e603b8543a1703b65b7fc6c8f3d9d308e9ea3e752d8a41d457f70b2dc0447376b374a9a3d0b3006e4993a05ce6869e819ecee68a84ce28d776937cf2b1bef7ceebd8b5979edc78c728d84b9f90d066c7eed5fb7d57d2b1c8ce87eac7c701b719efbe70a20cf9d95b89ac2d239b5dc8464a9df1b00f3e8912d042d92f58c34df24f844f459391ae95ec8dc96b5e753fa732954de52347fb501c62dc7bef6a38e27bd8c604db4a64f0b1fbb4e962bd3955474a846f2ca5a50b13564930036cf465050a59624c7a99067a845410309c41caf92c19c083ddf2ae459bb40e3d51fcf47bb79de05fb8b741b6a63b9250a8e582b8c8927be13780a433b1a158e5afdf0b306ee8018d7b4c3cf6dfefc23b599117169e6313ad68cb975e26a592a4dd0733c37eec387e38c452abafc5326934d0e2931c200a40d820023569155de37ff1e8b5860f177a77cc2d5584706562a1319faed04dd2541c4a5f5a07951d39ff4ba48702b5012acea01784fc55dda0551f88ca49410e5f9b97092c70894300d160e1b88392980793fcbbaa860a0dba97074885e5ae10bbdc92ba3d328681e09cde4aaa771c3e996e4e8436afe1680a0d95596233d98bf155c9ccfcdc013c51c8102a0d5bb68748c3f20bc9d8908f271f3635dfc287c2b8ada8dbfbcb8de4ccd9a31a31aff5e49e2ba3bcd4ae8be58a4256686f000d674a3acc41ba8f811dca580395b7f25ee9120bc001d780380dbc1d925b808aeeec5e938098a9a67f49c2b9ce2720b166074cfac38552fc296a35176699c4b1a0c44e3e726b498efcfb5e754f48dc7b8fc1976f4ab1c770d47d7dc64fadac12c78191921e142ad77e94e61113657b9f40aa99dfb211b59ccdda0e80aa01972cd796d134f04dcdee88b90223c7175ebb3d14bcc2962fadce79e25ffd2230167e359685ad755293528fda3b13b6d9265db9a288ce635600946d38fa8234a3ba7575e3175239dd2b92087ae9678f2542d55ad67649a64f5e6d2c3056c65de6f3a12d1f1ec99a37e72b871d95a MD = 9ed5ae504ccd18400fbb45cc91cc19c72fb530ccb323d1c945a94bcd Len = 17936 Msg = 6821cbbdc2171d6b1060e4722cc4d583893334a4b164eae8f1bcd87d52716becccef709db77b2a9a8216a294a7a43f2bde4d966a922483919106791807c516f0ad86fb0c3e68da202b67d0a98f7ff62d651433c4f99154d79c505e289cba221273af13133f285587721a16b6cb9e21118550b0b9cef482417a602eb5f996b7db863060b8a201c256c1f91bc54349e960a5c8b851f995385893fe92c806a1fcd24fd18c054f3c49167fca88dddfc876a12f45f19562bc9ca250f43267ab251a7f345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e973f8fbb0ff55104c46f5db37f1cf64cce292307104762bfccae9b0a476153aa55b422246f0c67ae06e73a4e171ca2410063089a9217ec2b673bd7a875bc910ae4f593321d78bfcf240c4f8127f20c3f576dc0f6f681ed72b1fabf8231b04057ed0acb2e42c1c32fc5e68494d8279a0d7b4e3263650acd5c54f23ce0a1c7c85917f9b160056dda95927ec2ce5142b675150e452b073cf5b1f52b3409ed8891d80bcc2c0f8f066bca32dbef79bbcbc73dcdb6e395039ecb393fae91463e7b039c708b26840714e0974e05f5db3d4a352e4a4cf3e881b8b8bcd78239dfbc29876cef3c8608961da0c28e05ba3c0048671035db5c6dab13250168af161c8e19831230e934e164ab131399e228e62b4dc7ab3568086ca73678d1983e0e44ddd36154da9917579845a15418a42620e7dfbcc6f3fdde2c9da91bf40f360ba1d0e087fb955519b45b74b24bb2549b315c88ae2b16a1c6f7b6f57432769ff47990c75fcf0b24213ed4beaec110f97162b1cf05a0475da81319a1ed537582b11544104f97e10e183f2caefd7fda9b8ffb0f3c2aee2e386cc9f035ec1eb3e629bd1544c11dc21be4fd8ac9074ab742dd449d5883dd723afb61603adb5cd9d346b92bea1c2754546ec1179935ed4ff7438484aa7934bc6b3b23933721d58e51ef50ad8ac87e3fc09ed2faa5ed2e4bc1a905ebbb75bdb3d41557b1b426517b690ccbc3ad2dea2c675d7a5c7598d753a9f70dfb11dd3e007c7144e13952984822867297dab332c35291ff65929fae0eb615e5db361a804a6b38334c4f0d719c85438d4e99c220ab8823aa3c83687c25f0ebd5b5b2954b3aaa506c1a7dbfa61f982c641372c27a8d11fcc30ad05d083f5f6224ae0bb5667840a337724cd0fd7a65293f0cee1b0910f60292f602e51c050c601cf0cbe19bab3518dc7c43a83f55f4236561943595dd3e1f5e29a0677e1ffece03a37983b07b9296a262eaaf34574b001f3bec78e69bf13a71cb324df7343d9522ee9e026e925e07d349c94ea32974aab5c27f4dc3f3183b110340fe4fecd29bc1fac1c69d95a152b55b69eb557377076f1dd41af58dba0987f953e24ef1c4ca28ef6a37052f635f91c051f013dc5a01947574484510df8e1bd6f261bce81b099ef422bd6d06ad16aea009c3a30c277f6ef1e54078258fb114c2a6e3607ce03f6c316fc09fc2865f56221acecdace66843bab1695973d35abce4f6d003531a56dbcfdca8610cf722cf6e0b775b649da65cf75f2aafa3b27159656a906d15d13531f6eedd7c8c074762ad642813db562001d178ed415c35df346c8a8b666b0dc4b6cd2fc7b8e9beb65707ae48bfba18be7a708319d847638a9522df2ab6fdd7ebb47d26cedccb2457f6a36f3f25a8ec680efb08163c0b445bc3aff0d324723692712d5b5bb2dc421286aa32740e4ed806069a904b3551e03a083a45ef7a7233a1360657d400c11fd051437c514153e780aa77a2228bc14010aaeb67e77ea7d5004b30a1a38f25c3779d97d73d88611ebe42b7c60205026bc3f2ebdd21f9b62498f8d2c12e27ae37f1b3cecaa0a91d87a9168584536dbd693d28622f07b24a284f851540df8f048224db0fdee36d3129276e07657e899943649478e6007309ea0e3920a51d91d0acfa5d82996c9c450c219165f0e9223f00227e538973029b71be5e1c784ff3babe5a805086a4fe003980c8c8aefdff56a85e2d1ea0ca28a9c5453a3042df7e69bf2b8da12af35a0bb72a5b582522ea874400eaffb46caddbef8d15858934fa86b757cc9c0fc27a0d8e09923cdfc1a97adaeffd1e4cc159d8f67c3942d8b62fb8afc5856abc7724afc704b49d644005d67515aea4f031f449e2fced90b4cde5a8ad5d0032b97c219969020ba23a09c6441a5945b9282445d5bcf47897a7e1e3febc07841d8f3739727ceddd74eb82b46bd3a309847d0215258b4b237e385af261e1ab5b53c51233e309ac733aff1596f4a7db432e76332ce057eb366ef0a0da792631cbfbe373d9931627151dfc2936869fea3bde9c1f52af28bbf98e551b63ef92811d3e71c4f12bae460b456c255acac1b639bd752f4f3a07a3b307f134546b2d849943f86c4452d6f19cd9d673cb67172885f38bc9ea28fb8bae004c5177940020863300d39ab198101101c37a5106a92866a76657ec220d5b30a2ecdc9213123e2e350f61bbeffb8bb2e7baa2b34f7d9f26028c3f1ecf44fb82145b3b6e8f6cc7d772af7e6eb5074ac7b04353bbe99d730b2b87eb45d8a854ec7f21d8d3b114a1ca1167927cabc5359887e6f52f7d118e5e4adfc12ce4414cb50bc419892114b64f3bbf05ae783c356d922cf0d8b2dfd666891a2b9a9c18cc27dfce68578674ecad18403fcac575308df99cad7e3111356d0ec28f56a734bd8824c72c06893a2d2ecf71a99839760f41e5bf92e9a2af92b9015e5729af9d05210135cc5ed170601889dba9e27d49bbd17e1b08e0abbfd4938b77eadb595c8e3a9fa2b227071d6db46d04a86e38f61b85eb3a782df74be543d494b0344f783e1b26954529d24a3b4aa4760f05138316a455a448962c5aac11033d11fc39f9ff0bbd97ed2cdbfeb42255b9446fb6fa9678e3dfe2e4f3f5114540fb75fabee8b8548c2f12f7c941bf83a953b174c8628247be75acdff323fc26b55444f7874c513cbce51c53451b44b7c8cebcdcf2c4c15a0dee104ed5ec55fd87d2e6bb3c2db10c75417408f7952c04d9b2cf6edb273df9f9d074fa40580412e1fdc40e8493c20bdecc80de86b65db3048551f32b93dd6caaa542acdd70f2ade95c44b807876b83200da99d MD = 491242cb9704f4776c51e53268c93bd4c3e6ddbdcf6e153091fb64dc Len = 18728 Msg = 5a9725971f5bdda5936d9ebb8921015b8f9e1b967e2aaf764fa8a19a305eae20d7fc5bc817da2b55b18215376c6e35686813c294af1e407c0dfdf79c22a1a30bb5826da44be41a63f859831176884524742cb9e1306027c348193620cef4a70a9a324374e400129512fcce92cef697575cf3e8c52a78ca13a905486e5cdf22e32f12c67f09b77bb5a473e0ff9d4095c8c770388ac5ef9334d8c813cef5ea7c5f1b2ddc0fe390be8959c49fa30aefa6415eaa8f76284be9ed7c6a8188c19e1e4606886e6a9a1341dad6f9f5c53e8a3188c9a9d7d37c1733073df479e3e7826e609a2d65d955c86d6fc61ac9ac6099a067af75f6e7e8d8db4bc56de2288f1fd5757c23a7a43c38aa12cf2d02a199a45aa3b817d6fb9518487eb9dda6a0e3fbbc4c57721e1378ea6189993c8aec1134c7078d965d56ab5ee26bc44cac9008a089aed123b06e3166f89dcd4e48d5efd04f5ad6fa7542513311d98cc3dc432996a663923c47fc8e35d916136c24a45c015a633a4b0505af1e3d8fb9491e006c63793343c8ca06b8de6abc129d06a07f4e50eb6292f4e8eea7ce56f4e75a0ef9916ce68ccc21d4d7e9155773e9d612813f99baf6d72c3336562cf6e5a478b6f9a8e543145234ae12df41aedd587c42895c9d989d20942eaeb4bf3733886040942e4e138461ebdc9147558af9f3e178c02ec54dff7714217f48f0e1869bfbf4f1ad0e1e83022ea57da9bbb36fc1ebfc4d3c77a0c5e39453d09a25bb88e62f1939ac8d2cba3ce553fe8ddaf1e6ca8315590e1c5b976dfc0dca33c78edf70e5f993b43305d117f82c3b7c1a0c0717920d0c2d1d441c1b3497959a3f22334106da284c68706f9b4f795dfee3cb79affe2a8d20e024fdf725395857f43f2d62780520fc94373cd1d2818b999df7e49bb1b5056fcfc2e209b53b3cf34dad74da25c2a24c1f20e2c06a8eeed7b058f2e191f59ba351e87158cde468f5b433b1b1f359d6c571f40670fde6ae3f85b6498b88347843cd5c55ec567d04e5909b8cf0cc11e5eef27a53ea74d2f25982d991a07db8c3d7ade734cd364e3a4c48abac9e9733f74f0b7c6e35b89ae2ae1089732957cba5e85851b704579f30b1462cbac33c07337122c00259b086a7c5988d962d00b346fd366285979fb80e9cf1e55d68a2d5c2dba110b55f43de692680aea4b45fb8cd9eafe24791f8e0fd95b1a03e93b3e5cc15ee322f4e5be94f5a31b442c75c2463532b98a4f749612525ee23054f567e78a873ee192edff082e814671a6cdf3d2fa5124d45d37a81add3103759a173eaee1b960e1b08b63b2a58908ed4add04d5a1bccc9d12c7289bd287fa4e293f36f57f6c158dce3ca126d330cf31892179a0b3ec1d4f10b1bc17faba432492cbc56dbc25b9605c702bd7600f25c8c229d6d6b945a364d775c7019e4e5a93674b7e7a106cc8e3dbc46836b47a992db65480da2a7fdb68c781ddfb35babd05074cc69d24a7b092dcb7eae7591995dab6301c4d7ff131e5616465776995f704033e4269517d2ce7dfb9284bb642a84a525b1d832220534555ac01e89256751adb9e56413f338a7d4556b4e664bc4d170b23e92dc9a39c12e4b717c15872d3b400fb96c7369155adadfef539dcbcf0ab412923afdef198c8cf242bb424817f6a13c4686defed2b038a307dd896eb3f81b4e9318bca70c5f15551b2237ef8f49774876f97c3cd57196a99c3251bbd8634b6d2b73424c7900717ee5f81d04fcfe6b3c2f0f74aa87659bf7949b1f3aa713ec774195b765ca38497586861b0fc6db241f5b0eefd05053f097d960187486cfa775bcc4427b66cf4540e8145a9954a94bf9e13f143799053d9151c966f0de60246e86490b15b58d0ce9f1e90229102f87d3a9ea0c66c84129ebe61e3136188f0a6a866c3bbb1f3a47788b4f3a48613781b49b57fee547d05caf7fa6a0cf9a220171a474faf60c9d9df39d8c2a7daf87e0a49fcd133d7c7a7fe503aadc42cee1b38cc8ab6f4ce47fb7640fe9fb5063e94dab9d9673f5d1063a935c720d171b96c5c2da57c3470fa83cd2c9aed549e32270d27df84595ac3e34c3714659d7e807e21cc2c11d6ff5e0d546b223dff198fdf020273cb2a677e8167c2a6eeb099ffdb0a06831a64bffef2ac7b49042cfea41769e83a9e1af99cd87c76f31e935a740d758b5ee8663939ce25db63c256c42b5a9527a89fa387ab530ab28d97ce46898004c8f42e43f1bb0a610a170b14e06233246f22227c98268b8303daccb9c4acdd383e073e868fdf41de95b740effa051b882d4be8eeb19adc95e96f3ffe8b5a6f7058ecabc65a32df0efcd9063077607e40c09a35725a74d083e1cf53f4d11ed15da828f85be7326c62bdf0cd8ecf20f5eee7819ab0094111fd7b5fcb455c668d40ba50a6efcd7a648a37a2f97387a30cd30086ab20348beb6314a4e85873ce0dd9ede839ca636741e618442c5727831d9d8a3dc93b62c1f7455c434db6bdb1cd79e14413a44f759ef6de78d8d2353db2bf030b977a1a6fb024a09f6de8a0ce66b10318d6e5e841d63cd895815d273f66b7f9647854d1f19071803dcb56b350441fe1caf607d4488238b54eb8507404a418ebfcfe64100422cc8982e8997c03f006fbdef3a289f61d7af2e8d064b229e53249298c105af3e1961b2338194135f506cfc9421e8fd72273f0188c02481bb4c49f7ec3f2296d575eb3834c6ec982cdbfcc1e83f44c681b945b422da1dc56ad205d611881f1bcfe96f12797f26b56e4627f431bcc4625738c82fa47cbb56718d611750c384a8f31cf3284ad5cbd4ec3cf57db8c0f03abc4ad15a56d0889c982764a3f118daa40ab78262eff0625c6f636f44c57251b47897671d7ffb0b00a94517603cb0a777dc6121a8aff773b5bf639c32a0fa6e3952c892606828cce86a92803779b3768831c3dae2d4138746a4e5852d9081cf3213855a0b5a7d54bda5b3a910ef49cc41d184b4f8a46b2579e691301ede2ffd058375c8069b222ae820539ad4e7983309844db8d26828d5b54c0ea7eed32b7f1c6a41e3397340d6cfa4185a69a9cb324811c6ec5867711f639f05f283b59edddd9091b48c2cffe1dcf8aaf0b97d08526741965a73eb6f8ce9a71d17c7ccafa0b2bd0b41e80d86d276e6b267abab7719ccdc660a093a49a3b02cff20a162874f02b85a94335dfe310434d8c4267a4211e0aadd02039d28ec20f65214f8bd4d72344a24b557658e87f0abc31114348ec20b72a44c4a5c34f0a1ccbffcb6262a92b23b12aa3a6d5f5aa1131c565c1f86b3b6fe62f0c5bf94 MD = f33b1abef61613d17ecba21d6a92116261003daea6ed288a456ad012 Len = 19520 Msg = c7d75b676a1e38fc653cf9acc416bba938b04a2a76fc9cd3daf09e7150db34eb74f97a76f8455107468e170e67cdb56124b6df766b8d97d6f43bf3ce23a12168312ca89a87aaf0bc6a5c053fdd4c989dc3e0478c45b01e7773955d2e2e027bdd45986c3bdef4200318cc4ca8ee3a6c455f5709d2cb0c379ea12563f937a74b31f9644ec1c6cce6c4970673b062403a403e43adb2c74aed33c4148d980738994e95b9d69407da4ce7303302be00050978a8cbbb93ff11451e25896371665c6b1b61be8d1c69c559552b7b813c9132e1d4e717bcdd3d0a49470cad6eed1cbbcb80a49cfac1b43615f4d0057991dd6eca3c425038f747dd0097c0a83574f0fec065a87aa6ecafd489ad66fa7225ac62cd98009eb54be53172f48ba1406fabcd52b2b38117032348bc693781f260c6b5f1d06a28bd40e1aea847b3c0184415cf8a4f0ed8d770d839b60e89c383aaf3103fcdc817d73e02fda979812f445df6ad6f2501a96e9996508085a5e8ac6bfa1bbd7562928cad0fc67d703d134c20160f0a1ad31962e8253521b7d317f60ba47d75b17fc262f6d1b02d162f97b9f73d9b6117ce523dc34c8fa18b5b78e7f2b9df6f6a68cfe37f1064c0529fe0124932fc7f05387c8694d40609e88434098801e8b28666e097b1938a3e0bd419df7ebed869ca5abec6c2864360b89773e436434146efbf1d05f424c9b02b1768a9fea9d829507c4184b528eeaee2dc5cfe624991338bbbafb5b189c91d99b0f5f630bba3c57de62d48d582affc4e9b18e176d9818144a4be2f4e8b338d3de7e9517ebbe2483bdfa99b8a5e2c51e41cce15d8bcb93900c071fc35f2af08ff036c3f4f733cb771b0dd033c8210b58ca6a720f2bae063a959f1a3cc86e497c74ea54a0ca95a1c07a2f20a53b701302e83cb8c2a9a9e0526b566ac7d0f7b417d0ebdf91b26e37ee4fb103837c5a7cbb2f961e1ea269d295f1cf7a0af541b0f098cdcd4e5b280e6f2035e145074ac8d005192a5992482d63cd8cc05c91e6d0753102864d214d95b18040526078cb57f00d385629e5df815a5300e663535193444e2cc304b1695e53e442df6c2d46da79bc6639f6399a5ed826be5485a61c69bc249eec1b67e5c8c4c0cfc0dea15790fb77453e54f9f3166bbd27835a06a1c46b68fb79d7c15d8592ba49df2e81784bf3d237ebbca39458838adf0b46f17c53c09fa4e4e06a3af53c154362d22a234bd161c0ba93c2d895ce244744e2f316685a1d3db5cbbf08983f764f047027e311328a723370d44a4e99fde2d894880aa2a6861884d02c30fefb61bf2c7ef7224c95d0beeeea6463f3758c443f023cc363245ee7bab45e6e8a1e4c365355148b5e59c9293556dfb014ff63fdd0826ddb5a51fc0dcfdeb1fbda16aa2701a8fc68b71cc823bf5cb2b93385f95235bba7bcd8be020d4cc5c3736f531003cfc13b54f74d7240d54299d9cfa7d0e3e70486d26ed6f568b9ffff6faa72027f06644dca8f7a4c032fced1ac59e36f456cf367c69d2b4aa28fe3e23b2bf1e5eb5dd8a053f011b9ed175816ab62b748d9201ed703e439764d3718088054315ecb3eb4df6bb9a240513454b5516a91e231b8dd6114c4700cbb6812eeb9c3dec1a1117f578c6caa73f20f6b5a38d211cfc19fb58263ce6d728f6b5ae151eb48b30f8e9ea53059a8c921f10251bc59a5660b3d4da79b52804c3be9669ce34b1da768fea954f2211bb4738190586631cb399119ec6d060166fe434abc7dd863bc033ffa15c34c5381da5959bbcac12af1eee5ce483f4e5b701d3807c310cbb5a28b16f97a8c9951598f65b1db255785c7ca6bc2b79adeb14a0d7cb910d217c16f7360852e2d73bb31580b5284f493d2ab60a58fd10c21a33353a3d73c4e57078160bf15c70265e177d8dc943fb4f0a22b46259e1b0fd1c1ea942fda9bf2040876d78533dbc7ea74bb663bff61e31874a5ef6e660c12496dde23834bb659a934ce4c4567b2ca7be56aa4ac0c920b55bac9c0d2801ab003376ca6409321d1a12cd643921a02a684a403f8cf44569a42e5057f0474cd65998f3480da594516a6514d31ddd341d8bf4115f7082f161c5aa3c75e86ac9abf7705b437c2f6c685033291bb9b1bd6dd663d2f13d925571e2757ae03bb90190a161b7a5fad03fca9524122255c6c581123f8bdd3c4efaffc137127e315d7bee21130e55cdb097de01e1d9d23944d3c30732420bb5dc67752b990a39147ebf2e3d30683b3df6fb0e5b128611ac52709a7ce20163ef642439e8426cf82a4356b6be5dce3f94cbf4c26d5f1fc9f718226e3af7cfcc340fbab5c0dc40a3bdd5c7f06b44464918560960fd6eaee163bf74a80a1ab531ca04b04f7b0c8c21135c9a420e8ddb4113c0c251d4ea3a41366febaeb2f3b977fa6c8e71e07c5a5c74ff58166de0920fcb30a7fdba79ccd1b84f11e9fa29e6870c6fdd82b9d4b13b2ae688d352e3759b89cf41cc76c36b7933886dc1ac654149483424eaccbb9aa67c3ab2e183418bcd94c41727d2711f21ed41879f8e4ed4a5f6e4eb10e2da1b85b1235ea8c8a0dc8e3638b174942bf0b12fa3e8e96a8da6845da6bb5ec2d93fc012c81590eba971c4b553981c8598e71141d6170906c9bfccc6a31a3b365f0b40e7525e01b20351595a3c53886d610b296b019c652aab28677903930f041489eb78e8c263e75684336d1c6a1f142e65e1f54d0067a0dae83bbeedab43f5a2c0aa0cb3c81e504c133c361a664841a6fb2226e1ca752fff0732dd89ec3dd1aeb866ecdbf89ab68b055afc5fce6dbe71d7d248e682f99ec28e331d00dd6660e37a056187da3fe0bb627709132af5513801dba183b15ab6ca8425c87a062669e60d71b1dff7769885337aa35c0348c3a37f237ae1de003fc0f1f2241ef0e6b6627990240cd6a5a4917f4b1365dfcedb595b941a279153014bdd817a15220c0dfdc74c0436ff36cd864ed2a15449ef63039d15cb7e52bbc31451ba11872402375ffe8b9784fb8fdb0ca8f79452c61321484b8dd30eaaa04fc35485339b7f2efc312637271f511a96cd96a23686e0a2dfd16fe67bfe206a6bffefca2679bafa231b4837fa2f893dc66e1fbbcd191e04634510070b773d81e0702971334a5dcd76c46a7358db2c62329a4c2aa23208a1754d37d8cba0874d75bf0a62a236f10ebbd597d38b4bc1f0a3f724d7fdfa27e1df91eb4102a28837f4949a86bb64fd27bbf5d43fdaa8d04fe12dafaa2599022d68b8342afaa4c8a52396e2c3c6fd097f3ecd2b9f8c1ae1e6b4e5f58c643622ebd76b1a7bf9cfce00cc6ee9020a289d7e0c05a3dbeac87d1fe4c7ff6300f90d85f551a61c484a22b1b5c4b72cd00e428cec4444db3cdb2b61387ad419420b4d618a13dff52f3e4c1ea73f552760d67f11a7321788ca7a741579a77c9472946ae95e58ceeff5d3d4b16987cadd MD = 450587633e9d302f910baae17d3704c5c570a4990b894df1bcbf92c6 Len = 20312 Msg = 729a8e1c242642376db87cf530bfc351c82f0511361cdbf87e870f3e4e785c3de14d746d235148921690833474ea575096677d4d94ca7731ae691915ea3b47d7ff33000e72cc9c43ffe6515e3ad0fc5e76a61e4de6dd2573021ceecb2c4d87b394f539e759c0c6b0f161ef59ca9839e33194f1fa747c6e27434996465cd6a43b683a28e11f554e43b3a9640f6c6b97478fdafd3a85d0d9b339971a70c2fd24d542abd3e20eb2bd630f67b86668719df258204bf66201ee80acaf812fa6eb91ebebef44d36c009b77cb43f44805d1d34d540de117543635f66438d36d4fc872e42caf839d82666ee9b0e41f9c8cb4c1be4b4ac983a197377d28db181106bb5028cb939626980dc02086f3414a4541f0ae047f0b24914d7b7ec240590313ecb21f90428758f61d18841517633978a1e7864853ade06e80895ff80e9e2bbe84203145655e1ae3bdff7d24f98b536dfb2eacdf6eb9a17e57ea8a93eded714fab22c6b0a32153a915fc737d40c47f6c784e8a9179364e0bfb25655b8750bd0d8841469ba5daed8e4e97cee69513a5bc40ce86261c2dcf5b94c25a1781cef741440419cc1390cfdb9058f628a082aea67a360a65fea50cb6494ad091866f073306f4a70b944ce1d702c8540b081880724f0f7d17c8a6ec6642442f8f3c3cd52bf7975822d0150bcccd6e4e5676dd0468e6df470421395ab2a838deda4b3c49713f7895d770f3350018d24dd391da22cf6831d0f4b2643be1a3ae473a5c784c4c051cc4f41cee47bc0c7dba480216c3f1fc8a7faf2331783c5a2fd17617f6c406710d4f3f7b0f2948d1f6fb7e7099cd14cb74befc1ba8f90bf642e45823c09be5add29c81365dc4ec8ec57a3d846c2a81fc76f5a542d0a6969e70e8a629deb732def31581f4e0fef06c739d4ce696c080b8198a7041b167247b404529d05602342ff820095ea1c09b9287ce753d1f795827e3e626c05325feb53a64a9c1326235c66a27df1ca7f3372889747e31103b53705e718f66bfc66d73e6abeea37ac17bcbd191ccd5fb7d0a5802f6306c70f0b7bc129372dcfc34b7ddcd83bf1f34064f67b3c69831a3485d4879be5393477fcd3286b598ca1255241c7655e5dd6a19f9c19a2e0bdaa93a77207633af519ed0ddfb423dcad60a13fe586987298423e2c1030d31ed75143da20981bd0b4b7ccb2f3ece95ceabeb558bb82f8351bc6848ef52953705aded38242b23c4312ce9580a24b3236cefbd0215654faf252f4036cad9b9a81c273b1246ade3b0e79aed5fb8d578516e4b8804e28751756f83b3919bbd01ecfa8e06b550b74aeaf63d91c87f78a5869a6655423a45be3cf560c942aa29f56b678857088a73dfd826bfdc7ba835c229bae92ba467c71d6b806f8b313f431e8d2bbd35f33b072ae33ec5d7607a3558a4947b1312b036f66cd8570046a23303bb0dd7a85ead9bb37308fa88603fa0ee5ef1c514745cbad2a6c5c1306a1a222c5bd77bb831265803f14a03f9613d9e0dbf986e36b2b47a37810f552483f13822d74f536e54ef65a1c3cd8b324cbe553c2f531f81b5009fb0657dbae37a6d9c6c953e07d1b050eb15535938390a08f00316e880fe638850c2bad9997538d77792ff6b3fe92b9012e808b6b218826395eadc2038b4a593b6f7e8e999e3a477f01d7ba0a2bfaef901a149aba2d79b196d7ae9c3f0ac646af8d657766334a594309473a3d85a22d1e1c88001b07c3f719f3aa6994fec865640e770479e7025775e7f4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a3677436600079f112816df0c49dc425b36bcbfda46997877bc13bd90acb3fb027d24d56011b2cc9b423f3191a297612e4ec051beab6565ec099bf298af9a894114b4165161b7030e6540ec32ebc52c111be8d8c786c1868a9c48bde1c32305f8957b82a46092c70d09b26b5a85e40796067cd18f593c7ef5fc909c0677fbe57b9801a6e3aec48cf9b80a3b82f172883f9712b860a344a390a30a09614e73bc6c74dcff999ccab966f8bed946bf0f227056411a05e56898ed082b72aca738df2db463f930cb23f0c73456c1105f087adacc6e62c9a016c38dc46b842322a9d241ef4d2043ba4eb7bd03588f6a520cd5d152112f3653ddb7e54040aa7f31453a3b7def113cdad9729ade4aa0df286ad7f69fcfdbd6813bea761451521b63997b9cf8d028a6bd22b5f33d8381c952c0f5acfe00f524a8afdfc2a8f417823a252ac8e876f2fbc1d90658a9b9cec351adc377054b079b4ab80c5d86df673e1566ac51b569ecb6995ac83d9b53c457b57fa5e74e048fc4e7d2f4a92649cdb995dc94c9f81f9251942680148ac82ef0feb5317020c3fa1bf08f3d281fe9b78f2c055894191e607752dad26010ad5b198deceaa4261fd31b054b2a6ccc25b129586f8c32a0dcf37245d613c29569c54bf38525e5d66ea73c86a560f9d38457129b79944817d1b7ecfda6d89eb1941a12b02c97d7ba46e31b051c55319e9bf5c575c20526f6a32a41eadba566dda2b5d84441a4dc3a1f2310f11e9ba6a5c329dc77b74361c5b7c71b8dd2fead721c25374042d175ee7dc3c8eb3a88eb81907fa201f7f38afd861ad4672b38f52776e4aa14cea2274fe961ad53dec152aa9a43c0b4d289f5169491f6f75308b06629709b32339b82c6c86938bba9c99e993732b2f0f57b529979c90dced8d271a6ca5595392021faebb166f582fa0601c5fda8e356cf4c060e9c2c835e2b2abb61d0002299f2da02372ad75e6a6e0b2ec96432ec46de8091de8238f215d875f04fc10ccdc55a283b31ab26eda2643d981bf15d4851819d8891a27ad4864f38a29913e7f15b94910853a8f23dfb8b31c0262b8461f777075cc0937e95302e1765064f0e27bd50a8fc25aab599b6318c29808944d3b92d5270d3db90cea3c36699ffe8fbeb7b0ce4791036edbb62f58146a3811b0816f3137743d17deb41cdbac3ee684db70527b811bbb4070d9245c5aa17a973998186aed2a91b7275aa9b88756a436014fc4fb85870d89dfac4b0cdc64568eae29956a9157c103af83ebb5410fc10cf8fb0d349bfe7eb1f1d6ab50e1dc555ed8dbec176b2255613ed8ebbb2490c470871d35100ba898206e004c11b330fe6f7f57275bc3b4d63b9b01b0b0760235c9785d45761cace23f1ed137359889d9296b454e1de035ccf88fa5427e808c9d7e9162444d1733e474c8f273a6d90f6ff5634b67450bccbd00e26caa0b8a5782f99bd53a7f44642728360a084abde9473930147cba8ca133bb5c00ef41dc8b6fa15d5d2ff3eb6832c42ec2ff0b8e40ea5e9a469466abddb591c4061906bd4fe9dea1a32c9154668dae79c25fd0923bdecd698ab830b0a8cceae429314477cb7a182d4f3841c787c150dfb130801303aded6587ef00e229fe2e820f3ee25028a9b7ca085ceb8bf3551127377b0557bfde2556e641be8a89d6c5676048c8918efe2340769f77e9d1d1581bfd4746a798fadf034eb652f0efd9175bc558de812402c5574209cd2949be8f81ab9c2b4ab68882356857a55c84918c26e5740c6a133c03d714a2 MD = 1fff3932e74bc6a0ef9f7e994889bf7cb3af3b892af186983f4b0b1e Len = 21104 Msg = 8756a342c15fa13c38118db26afc86d419edf8f0acbf1ee6d374c6dc6a855532a0750ab858ac871fcf838dae7f9c073644744a48be3b9ba5f6e3f1f64477fdbe70ae688c17c05c75507845c1908ad9e5cb2856b2dcd00acb2768195c7d8c7b0940274425c740282503173e54637104c8f630a494d026753fae2bc575dd6dd6fd570826eb30d7f3173089ffcdc2f791c60cb4bc5760e6e3e9d3557da92bc21681ff7a9646192bc6331ff5109673c487c957de276455b85db1de0eca603132447c7ea51d9e4be4a8611884fa153e81eeb81dd46c227643ea7f167d3202b56666d81db0425b8faba289625e44b4edd6ce7aa7be13f88d30923bc4cb3ff78006877c24c38ee5ab28bb9346aa76da466a30f93dc5a45060265dcd301f79a85ab9ac50db0888a56702fb670c9119ee13e61b1c2711a891b9ce541da2a2677b0a27df3c89a4b8018de16aedfc3ab45a1af198cbacc9a7225ed07e14627c91d95af9272878c2a662e36f110e5dcdcf852434aeee1515276d17d3e498b7d47f2b10d78dfcee88db313351f7b07974f2d7f857656eaa1eb2d9ae7f8c92ebd2bad7f56817a0341eded4433224bc9655a6b86001c531b30ccfcee97e80eb44a0c947d155cffc92ad37b5dbb8a11bfd98729022dad720780707b49275c8890b6334e16c45bdf94f5d6f3ac58b75b3f666dfc7078ba2234136e0f46f0f6a568746840f8de1e87db5550dcdc854a86ec8e774c5d7bc2e2355c1e4f449f27039026e4038fed158710abe99d5abbb4333bd42b9f35a148406fdd19b1de7c6e119c206f0c385bc15be97bf9bba37674de91ba036b7573cabb6818e8cd71334c6e010341c1aeb4b284aa4819ce33401ce7a2b28747a98dcab19291f3f8b93e3267534204da4f72598ff792c24ba6a30cfcd3503faa5e39b8d193cac3c9f307d09c076f40ac973f26dc45de7b9a6a09d56ca8158509e0121589d045f0c7db2a778a91ed5dcf1255caf809adae50fa0f06e595650ffcfba17148cc75e368be10b791873ed4a84d709671d762e2f5d30d01c62fe138e9ed525cad0ced14233855117f5be64dcea4fa19d823a0b1ff919e56acdbfc885751cf2815061e1b8dc6521572847621a8c56cd57972d983e4922d85f82e2976dbb552741f4c8b521ed4a214399560e8dd0b3359f4499fe13b61551036aaea9ccd8496b12a44a7705d0fcfce2313390bc1f30807c71c46427a9b9f75f6b6d262d34c067fd48304ceaec43583cd626112fe29356f706f7f30088d5737a6e6536153782c309c8c35e5aa9e7de5a7176b96f7fa56116eb7ad328bc326c5d5ce0ff0e4956263f0c48d5dc6faf3543eb6caf03602e46e309952b27ae988b0e1b24ac9fd20538a5fd0ad9f9a66405ff2a501c73ebf6b06646902383c5ce7897957963513a58a24681509037b6cef897186a27488ac445a68bb2e5c6689edaffb0294caae9140c278161252108b5b4129c01f909a461adabc145967701ce5a4f567b913447041d52e686be3c02e1e1789d5eb93ea096917dce8f611ff7279f8e6eb65777bdef7ece960784120d1a28d205ca9070e82999259cd96c45b27152c4e023c9fab19cd7a37b2c9e2a92273127bb8ba626e3e26caa116adf719a741afa940a0c458cd4cfda7c3d340cf7d1a37fa7e922e8f98bb314178ce32c17f7a03771b34be0b75f0e7980817041a6e026e2b12e2c3e92ea156b9585a0fc91c48b836165ac5498053d8b71417850051c6459c1a0eeb116c93bb8729e3d6c70a184e64c695727998e041536c574c17e4c02ebbf898dc8edeecc03981fe2011c573369180875e421c10a21b7558d1d773aaba1932f340c80217152ee50b945fdae3f13ae872e109767f8b6dc39eaea5aac058125db0903352cd2af5c78e7bf7b6d51edf631a935654875dd8db8b5b38e6bb8965dd4343775d69621cae197f7ff5e10fdd84d0fdaf22c2a9db21b13fd7b3f6de52464de30a9e666b120d1ef76ef47254d3d228788a6dbbefe33ab2e5289efcc7860d12f743725e965469117c3b5f137e50bf93ac6e91cda08f8ad2e3920457c56fb644e8d895bc84725693866b724efcb2c1a501c23b926c4e96c3b3ba8072687db656403054faa5fa3a07ae85fa7f50986cdf012bc784939ef2f7bdf89fe7114ea1c985c15cb38b3a98004d01444f0a7035a42311c22ec6ff03d19ad2bf206040ed0132220951a4e204fffa63dc188ab8a086f00ac7fb66fd5df3b2df7ab8c5f31cbfcdc8e76f735ee5692f344e7661f02219f08d2565040875d0ae853f0ac2d3a537c13c6367772fddde63d907e320a55ebf9cff77061eaedffad65a88a0e7711b1bb4e329d430b332c220f894e93756aafa6df84969276ee0d4c2c5f4259459e2de0153973030b7a8a6fee971e326729b4cec0df8e8beb74ce11c6dede359dc90e14f0437f5e77b941f56422b8b7e87a4497f87220f351668b22ba8f264c897a9e7e68b88afd59d897dbf892e2c90045a52c11a41673b1ab8ca790d9e4431099234704015c88b8bed54a334f6510b87220b393dc37b2122d19c9d123dec53a0ee6964d84bda69d5542699bc1093617e9fd5504844a597cd37aaf04d7dd7810c12f94caaa75ff0f842861ba5195e026938439ee03180ff785f683b15ca904999a466803db4b3c1633cd591865d3b8ec56fd88d8c1697d8c2bd66a601a0a12de82723c80800905ba4a7a7a3b678966711baf694b26044a42ae638e9a79c84ae55ffc35caff750104b277ecadbd8092bdcbe305ce9ab31f22f4e217e6e1aa53b81b2c7d68c258d9fb510cd6f6d180e3d94ce183e9853ca432e69e2dcdba7ad65f9c4a3ce22f7935a81081609c095101cc88f10c244f68807c6cdef6d66cfe7ae0cc9e99c1b0a2bb11d71db429cfba959e655bc80860ff5c086fe99d895fffe8459170bd8bac9916408f2af7258a844757cd66de1c20c9dfdcd508486efb44c796d507d0cb8b27ec3d1eee5416a177be00a75b77e8f88eb2028883200ea997c0d97facf906b414e60e6eb2f1867e5ba3a1db82baf54e157c826ea24cf0cfbe7b1877a760c69128abbd66bdf6fc88f89d405023d0ca8b27e66271adf49cd7829f5aa5402e92892be452ed598c01271655e7f086e0f0188c98ac78eb429b27abd4a8f1bf8bf304e438d3edccdb1cc37c729da2f313ed5b0c39686aa55c742901c409436b9e706a1c504a4d5f0ad5c4f39d6b4eb1914bbe6e719c31236aaf434c1585838d9091249bd3bef55a41b493437e57dc098191a87cea52b4ad95d5df536f24996d88de98296a38cc05aa429634bc6c35430b4881fc4991db8b046d64df7bef6d53afe02f8ebdbfbca76a06368d00af3fa759f7b0b739628e04e1ff3ab8e0ede7872d1e5191735bad8aac88db18f12ae37c90269f7560cbb5615113c9a64726f050292067fc341485f49651ee9b38e40a0cdb5eb5fe66d738eb7e32787158a36ef8cb6fd795aaf32d2e50e8d5df7ce59a9d60255a19f48bffe790e3b1e0ba6b4bc53d920b257bff8d8003d5faac66367d784706f690b2f1f3a0afafdcbc16866d00a41169734f418d31d7a1c3ca9ede99e5b986f1294710fa5d011d5fcd13fdbef02b755b49cfbf168bf3d39a00cbe5d82bde2fb4ad5cf0fd65b1b5a3db5ad724dff745486da2830ed480f3e61795542094dd88a5e3989ae501e5ff10ae921c8913330998a871955f55a58a0fd8a6325b66de192d95a4 MD = 3bce1c957e773813765d44d218a7c14dc9d03a57489ad36331b5c90b Len = 21896 Msg = 506f894899eb517c95709b5525a77b65274bd2d8a68b22fa4db0a0f922ff8beb71e1bd120541805f9e36a236a0e2cc71099a0fa7a546c0ae850b865ead28b1980d1ecd87b31477263e79700396ebf042da583de49a637b4a4709c6f4e7847e8f0d6fe22f092ce1d95c832c446f8b90e084ce8318eca8fdd47af0894339da9bd75a1c24917050647ee09aff82928a5454ed440aca03deeb570809f6d209f4af78da6dba35514aa81fb107114369b0e3a5ff01f98247cdf0d8d89c3629c098637b77aacda312e056c3b91289125bc5e6dba04f79c9203cb261d2f170d0c78f5fe7181a84641ddb1673df029074d09004ffba74b225f6f4d9f9de4fcd5084a14ac4a50608ffd8028f360b214df330dae61834b9cb2131be0ea9e400752f6195cd1b05b680fcad1f6a1425b5e916e46b332ef666ed423960f978cc4a8ff8c5358ff3227215e403f84e1516078b65520b944ae8c33f1276a2416e7e76433018473954e382ef3d4157e442c45f5c69e382b172f218ea18514e8e93e3cbbb61c1947246302d3592d102d4a2180584a9ff9731b1fcac15dc302a8af0e1931c122ae4e3d2f1bd10681ac1c53dfa402aae0f14bd0ceec8e9e77c00db8c611491ccbaff33ff0e78a749845e601c535976fe79bffc8db0b48ec09e96296f4c983f16d9ac0bd670a723bc779f4c4609989123a760973b2ab82beffcb41da288655178efb5135dfd91ab4a5b4e31c30645a3a5ffc1351e451ce8fd00245e2cffc3ed7a64e0f29e9e8068799831b99c30a8d30aeba97f3fe727ee7111ad951597fc3ca5a1f651a13cba81d496118ad871094adcd2df1ca5f92265d396166a663a5765800cbed76cbd881fe0beb54c7fb0af30a21c2cb558645575acf9288426cf1b90940e022d090b326a2776e7a89ad5e3ace53058f2610e084482a1ab8c5d3e91e7671088fa800c008930276d4530c7ede62c782b7ac7e183fde0f66729136f018f837819e7d7aa3aa5833a10cd49701507ff5b6df692c40dc64b6023045149b2b370af7d9c18cb27e5a91598e5edb7a337e641e50dcb9ef0c74d47a9c51eb6ee79b41e7cc04b5910722922cd372584de9d6a925c687959722a6d13bf13839efb09d92cdefb763b3d738bc8776bf8bf0f6212b79aafa4dcdc14342c2e9687e7228c67406af7a359f611586e5d296f517ead67166789540f76af28fbbdf7327aab2ae4c4e959d99b8374177e4818912073a7f0188b9e92da8723d3e636de8c3fde0ada1f24cc21e92bc3505f00e0661536783525cd9765255998bd565ff29e1e0355d0b9e0f6822b38278b794d2af6180e47bea6f61cd6d832356cb402dc6f0061324ffae87f0449f0c75134f79e4a12453c1401ced4ecdb5b226a66e54407cb41cade4a0310af2b9ccc29f8c5e369e92181bea01d68af161c883fd6d1d06f69eb450511f8518cba835d9c2d80a25b87eb3b44e9ab7f2772bc8f716a8d2baec0a7ca4cb790e9a2dcefa3313bf08229d2ea952f4640c25dd5855e8a8ce3fbccbabd813ca49381f97a26c5708add2cdab468b5051ea3d95829bd1e12a399e9d23e74935c40c9c09a7d71ece1820f477614abc351d99d6b2054adf68f17789cc733162834f4f94f8ccb18400d8c4d7c06d9fce898def620be409d0f8b4f48bdb383e9674d26edd5d74e63e87b0e617390eda34b649776a239d3d4908db5d1f39f1536792e406bfb84ec9a0db37211d31f37e8163c6be49699f79ca21eb0dae792d144865fa83c699a8f04d63e1e2644b89f136ea9c20aa7e7933b6dc5a82d40949f5db569c828c6211eea6ca37c6870650d6b7d3205ae7b2a8efa180a0590a7ad67c72ed306f6ba228194f66af29efc2d69396b5f9a99ba6ad221cc7530ccc4e611cb1a25cc70efa3a04a9d1cea9293199bc560b8ea930daf46f8b08f8fa93e4685b1a1e8815c0aaf63548940cb0adb2f8c5783c65d641c02d2c7eddf8beebed5acc1eaa38c83b64bb2f9e15efdcf7c792237fc105cd38e6a5ed5aaed8d65eb9c6c431ede57ad99817583cefee8a91fff46adf41e4da90bf0d26b1042fbd46ea2ae7e642249a15b58943877a9f45f6cc8e100937999ae3d9b16d147653e04eef05bbbe5f5ca29a5d9f76105e689bb0adcd97900a8a9aac973134f76debfbd148c5942c8e2420b1f0a86459f3e0f83a24318606433e4655a80af2dc536e5c68880925b366e191070f52a2e6e38ee80db0584fde6a3b1a696cbd3b25df417e9f1d4ec4e5723b80040a2c962995c8e7a5e2b0797af7f7a37255b682766a0bfecf78e5162528885a339174c2a49325739d2bd8877e64fa6deb03854d407c3449843b8a8e05025e9c1015e9ccea643b284e0c1eee6b49c9d64df6b810169e40eb57d59d91078834d21407f9f96d71605243041232a41ecc69159fbd5f6b48b850b4d7acb3af329178c9f803fca0533b9e269440e8bb4ca8b2cc7f03afa0f401161592268a6e89fb1cac56b63b15723378433d3975335bb53ffd0539757a28c1a814c59979c806e81a35c47f394f66de6d238f5a6c8ee4987d01d2bd35396f60831cc274063e31df1df091dd6bb09992d961db2233404fb8d685580d8371307433a81954b443834674576f4f66eb93076968d12f6dda259ce8f215a8d4b4045336415aaa187a73c4d9e4bd43af52eb9289b2e1e080ceeecb20c29c2dad6463a40762d6f28745abc0ab22fc68a978fbcaa6da8dd3f08103ba2a914bfa7224d6ed33a74eac952763c0649cbd0ce9e04c166d4a458841b31cf042c8b5adc757c6852768f256d6b2644a92bc7fdee50b751c398ca95c08b792e415e359a6218fbb027f32928fa05905d5b1fca52d3f6cdf32980c19ed9a10fe2c207bb871f53f3ceb879e8f95a69dc0e84ef7cd963d771300056327bb9a51c73eeefc429fc6d8c4a6fd074a273df33e08c618799873dc98fb1e0c43246dfc7672cddf989e1b0edadb3bf762b2faebd5adb3e909a286efd98a2e720cd6a963948e69b01aeb7623f7feb0f969a7420a104d94d42e52cb336d33c32ed530b14999d83ef86a064cca94681887bf92c7b0866ef5842817d549cc9e78bd4cd139f10ef6ba22d68d236548cdcf2ce4f3e08190983253b76019956010cb87d426980c6c5057ca00de7e767d8641536a5920ffd74ff7ed3cda2ca8d0311828fbaf5ffe2a7bb4487978d290bb381b95c0210d8db2fc929b28d462e685860b1b33e9f638d1df4c4890fab4268a49ba5e76ea0aadcc34bee81bed70e10875f0d90d44ff6eeb019c24f7c297ba5331aa280f22acf28b7eb97e8683cb2ac18785dcf87edfe2ee7900781e6ee1cebe86678cf94968de69313ea8e945d626594126b175c61c4744bc25bc655e46d614ce7ef7b5ecc2d3ee02ab11c4a2266638294fd115d9390e9631785c6d2f2b630e606ce2d58b4f6592498b239907305cd6a68dc64916caab4b7f84f2a64003e7f3e29df8c8937325feac4b68e703889cbd4f5d0b900d259ffcfcb7f9a14f74e77ddbae841f93b2778b71884c3f159388749a3a1b8b3aee6ef34f9debde9bd2e404a1fb2f3b0a91fca15fbe67f1bbe5b2650da1608b1e999ae6deb343ceb3b26010dc2054bb76a60808bd5a26af75039d37202f8520269ba64020849be22597ee2af09a9f1156432c0a20f812d8cf51cb436830f3daf1891387bb7e4ec97007d0cb75e658cd281dfb2e00f4b70e3964af124c62372bfdd66536162cf6e51166ca7ad2802c4f7a8ae80d03ec8da021c0cb3c431fc983a9f80dd3c70d0eb588493da1ace49438ac1e64ff704bf14f36daa229f2d6158294828fd9249b00cb5333ace85baffae96b3d04adfcafac6be736c653c231c5a93bfa6dbed5536786f0a MD = 40a3de5449297067bc4bce3068abf627d229543f34ac71fe9710d7cf Len = 22688 Msg = e43cceb6d7dacd6ecbe62ff95dda944257a73d57265522248fe93e819d8b2e70dee8fa9fcfd6333594363ecbec1fefb765395a91cc66e5f0e8a8a275683fdc0b1911f06c5c4f5ee8d85620626cd33b9b672b93b3fc1a03ecf09aadb296068fd8fd7f5825688f790ffe0c7ec6c33f9f74c74692c39eb7a4a10f86084010296f60f3f9d9d0dadcaa3270210000dbab44ccec52ffcc9986ef95ae355b27bfefa32a61491b779a7f19da955d4d169a5f512a3e1781d3d7cf0d5233704d6f8aa254beb035c7218fc0f08ed5870e13eaa2ef17255cc1e23fda266008fd86215888a9a5498685d7a3e654d79869eafcb2be461a09eb6700b9ee614593a4af4513ebcb669203fca0bd3b6f3c46c98adbdaf97dbb528a1a362d54e68b3e2f70e1a211e189f576d584c5056945477095b7499cbd826802828b8355deb9706470ffed431497d9a5b78ba48d6a7a0426b499e9ee2df8b41a4807a3377158900d58a6dcc88c17a65a4bbe401b9964e3b28f88a139f6a49c9c14b27642c6ef08f0cfdf57ea7091c35b392482f61e8a4ddecd8c59c33f0e894e8d95e2c006063fd67eb146efe88d9a7028c552682274ab7017adf9d631bfe4fa5cb7d0f758269d860c2491201e949263c0aa99b7cdab633114f46ab8f43e136629202930e5d58aca224020c5372d13fbaada3d2c46b6dfe96d6892b1af13805b9bd9d3b3d49e6e68680edb265ee185ff8e5d280fb61d8560c9125a0b8ac791a05ae9b8c84e06b1298595ab8ab9375138133c40a84469bf5dd1f8aa0caee1b0ff0f58bfb77b97bbd522dd763b70b7dd6ee27e6f3e1921f4aa2d246bfe43e9443e622fcfc782d8f534e6ef267face99268a32b9c1b5ccd8b0d849e83277068b526fa75d2428c51c50d7ad2a19f9556d8f0fd4caf8536f6ee4f7e6cdcd05ee56a7f8032af6ec08b942a858ed1e2528518cc98e88fc5cf238438c4985d4035e8cd119b6e4e94470dcb51b02c9c920cfeb8c51d0726234edcb58ffe2aedc11cf945a3f43297fb485fd04ba3b3ecf5ea4a22a334b15be6dba9e91ed42876993ba13aff328572edec0a0de0052ba85515f0bc2e84ef1658a01388abec9cdf11bb6714ebfe70c7b05b95e8d77f9db8f8b478f02eb6c83fbfc2a1fafff18d1071c4d43c3000fa7e8dbc88cbfab8100427f06b256a7145bf646cdca8e28904f0017d6f1896df2b7fcc376c1d0f598c7329f150c2ab5e6d7c8fc44af81b5c0869090fc011e4440bb2b5f6c846df0919ef48deaf31b925485f88f275537413a162d0a24f90e4d6a3ff901e24ae3271c060cadf11d95c6dde50961fe522b356d7c49f5ca5fb5c3efa4fa4da08bdd03888acf81efc225cde3838027320cba1ccb375be6849bb152318883a50fddb80077abc1ac0fb7480215dfd1515b0b8061e3c5e75ecc339d72e06949aa88a700b869c7878f0933791de5589142e1d4faaf47b670c119cdc6907cb590c0b38e43a5cf8c859d44ed358bc29c24ae5edfa54f47679cafe5b0b95556fc1d8a18e9fd33296950794b3b19a64e092fe63aa20cec9377af8dc883021c0fbb3459114099eaf7cc5c8594a37227e82e077cfdb28de19c654ded2abb2d6f276169c04528a657cb442e54b9cceb7b11893fe52097c4d8d29edc4094df97c90e8d42621d18bee4046f2a69130de20a5a895db14bb83e2cc6a2ff2a8f56ddb455ad42811187202a438bf52548ed026033dcd563c79a5677f9100afd82c76bab6d2feedfbafa96950949033bb3f0a9173dc23b7f3cc4aa24da44a45c1797ce38e5b3abc081f96ebeb624c8fefcaf6299c8f7f45603ada5ddfadf4fa8a64e71c73fa70dc5fefa3501da8ddaf17b7fbb5275dc949ac4dbd5edcb3e6175c751f2e0eb988962aa7375f90702adb5c8f80ffbb4fe90bfe8d5c6eedbf08e35e358ce1069f6a328ed0b9e1e9c11b5ae6d9efcd016bc8d37f811d54bad842a8b92b96fc03b4fff8b5f1939fd3a49876dc1dafe8a1bb4ce956b169daea067cac94e0a649af012d2fc7922c5ef41f897566e4281842475e94ada5a9c625519e3918da228eaf8ddd21eb3bece9f43dd6a0aeb4c2248c15e71ea9e643e115c290956ca37494ae61f8144a753b077c03683fd918e5d62930cdcd74fba1f360603a08bac30223528364510cc7817f347b259a1295f9f4be9dfaea366c29c4ae3484dc27c0360343fd0b2058ba261ac3acf6f87fb56647f66554bc16c2451ba8445757dd2477fb2ad7d3c856d592a0d29ec3a348ff94977691c58d3d845cc1f59a99c304762cd4af17a69330a02ed9085a75e196fbecace92934a3d33ad57f3e3e3466c33fbf5679c76bc70ba3608c0ee7f2fb9132d44df5338848ff6c1a1b2b360e894306974931ee0aad126791838b4d2439602bb54442b9abc1e9a3925d638c1173ac531c757e956a8d6a732a842895f2e22c6ef85779c28459ba66a50f8f48246e25afb6a209c375af3e4f91588dc643401c84034f4257fb579a3ebbf756702ec0d6a0cd977a80125ab48430c761e8019959f440f3447ff802b0b23cdf610e19b2e8b0c91d78d429d8f4996e984c0413360a46150d284263a4254a908d5829cc8c836712fcabc8a36f2716b295f820615f5803ec6395a82483208e20c9e1ca2f96ce4c10fcbc636668758466840a47d35b6bb22cbf34ba24e7ca07525da7f82a18f2e72ce453ae5b0b0569f12e2d7e51746adb3de7ad7f491a4b3c8f0f50bba55917c0cc7e17af6a9f0050bb5b07cfc3f07d0787a3a7ff7c63cab540a9851b88a263605a90b1707c6e8dbe2cd240411118cebc72bdcb43a6096ffbcbf1ed21bb3b014e3ce3c8f977bed53dac5d81dc2334828566fbc052ad5564959ab031d4266c1712dc3f055045d80054a3c272a9e18cc4e7cb272e357b8fce0b13adf83db27dce35a06c107fcc04358c79cabaaf3467ba6c0907bff2f6ffd8e6a0b2eb6245b54d3ef231908ef6899c6b963d01f7020f8c9b8864199308eca7ada885b24dc85dbdb539572e83a9b15e7b62e3f18735ca63fcb005e41f98a066e893eff40624bd4522dca79168cfc2a34446843069b3e16718eab4c99f8d613b20c8b859933f1d0e0e45e661444f05924da8e766a5669cbf769c376f1ad1784edbb1a88bfe03c53f01dbdf482011c2541ef1d53c413442949f305780984b2dc8a4b5872f4f57fc01810659ec03fd41103f8a165947071d0d190cdca122e3c7d1003c1cf08c220c7c182e1bf5f5fbc9ef39d97267bec673536e9a8e7cbe81909079ae3073bf4e3bd74dbbee0cfff3a3199248b10baf598d8d254035b9770dce2e96748b63efc2d23ba8159ad927cd18b5d53e9aef21a7b3e4c7689800526fcad3dff4f566256618cfb2a5e70377716eec8723f6bb1c9a2c80db7980f75990cca5dd973624682257bcf2d19d33f7c7ede5325e8d17a9194288e9dbb54993561bcf17c51547c0ded529f1028310aeb8dfc95d5927a9ce0d3b247af5ff9c08aa017716e75c743582dc3f35a16243a42a8abf917b8c1c955c607e15312699c175c4c66063d155d0f6b22548140273e10638f0552c831606eff9bb42f6f1e7c59dade37fa33d9298229f04b2c52b496e352f8331d4d63f28ae4e0689ad292e1c0c04f6fb0d67d396efed04f91aa56c529eb7a1addb4b410381a68573bc9618cfa811295a0b19bfd043e24ca77d378695281a7252aaabc19f514b60878c004be55b1ba2260419fe5008c8054355ab3c40bd9e1da7a7bd6a050483c04d852f6f660b6c89e66030391e24e556560ac73859448dcb353b4be13c8497cd4e0feb2d5ba24a07238626184081826867045422eba42da382ce1bd14cb7cfae1193fb2dcb07fe4464e0c342c005e663feaa19a1fbc7c7ce18c9f7e03e87728c1f772816be22d06731d5cf60a59a5b6ea466e05e9394a2737f92a5b619dbca8efe253a903cdb079812cd1119f82727b1df9f6f01baf308bb3d93edfce59a1ddd3803f9454e1aed0190305216c09393553abe8f3179 MD = e4c064eeafe8323b68aaad4aa6fbed8029771b7644d49849d2cbe96a Len = 23480 Msg = 7b00efdb61a258fa37c34195a111f6d8ef29ee70e34face6bb63e32b6b10dd742b471d4731ec44d6c0cf318d61dd6ce77198c585dbc4388127631400b4e45d0641986e8fb265e2db11beb509d4d2a7e75e04e109c89cdb18e0bc7d6d729585dec7da28d86c75fcaf347a153180596e81be578b23303f5d53ef54669b2f8b1ea4c4f7944de68558fa31e9992eefd88b5d9a780bfb9d1586d95b1517b1722eef0041d6fa13a8fbc0650ef58928a9b9c422f94fa9ba96861e532ce6d7d8c4e6c298455fa2553a41f997d5852c463462e278e4c4ad88a4faec686baef038ac1b5d17d87ad33925bdce398e80cbb11a3dad0962bf5e8c4dd9b9c11f57a8f8b2358923020fd7e7f0d906f33fd0ae91e3b0ec7a7b2806ef1c8b4d0550c848415e9c0e64cc06f48823fc686cf25c1d0d1525697637e7ebd8967870dd06e9173a39b8b4843d477344468dbe4dae0c604d3a03eaa39fe455704508eaf14aa25f0ccaf243285ebb9c42e2f6ce3d7cc8be7ad9b238a9ba088edfb0a482e823db66de99b082fa3548b6ab7e9e61e5637881bc7b9a1b319139dd4c5fb2026b9a7c76d92f5b3aa2cdd70ba6a3ed3eed6b04ef3aa7235ae32a6089dfdb9c3021b66dd524135c33c82b51e15cd84b2ffc9c54511de5b5bf668f66dbc2abc8d4b37f96cbe9cd193513599c81f5a520fabaff51ee8cbdb81063c8311b1a57a0b8c8fde0a24de6fc082b5ea2339892d468d19be110b0b8941681dbab9112688aa3093931a07ae56c73b942493e6d28cf41e678edfdb15db19969d2bb84cf65f05c1d3a730f9852d140650d7bec9dee7a4da49f5efeb6357761c2b4483e7cd639acae088c35ceb69235d6c81f83506d3b53b0171a5be7c74f35358a3c053f43cd5b61ac665b4598191bb57b1d4cad2b7b1db5e80b5c6d9b9fde6a5b7e2240351431e02de7c82580cdb9a92c5d8fddb2a371591b18497039d025082ff6dda83476f6d393f9c695f616d95be5c694088a191844b72869172a4bd0b80f8c7d9fc65b71e1e7839bbd835c4172ad42a2543947da1fc425058bf577a72101284c4c752b6bb3306c90c6ae07ba978db902ec49937e924bf665f422bb74ec10b290d8c84eacf1769eedd8007f0c728b11fdf64267ce445283d1793981fdc04112926b472cfc42c100fa1a002dffaab233d99baa2a90dee4b49142c3300b469e309a2b7b2d234e1a7affb536775be80707de020b448d070671ec78482f66252ef4ef43ebbae8be88f443d12ac6e7d394755654ec1d8d68c2a22c434ee8d606f947dbd92039143a14560f9465836c14606687b8d61d58a91f2f97ca5fc22391080fa416a0146f69c588ab296e14b25273c0ba5750acb571260076360225146d62369321f5b1c1f4a3735fb6cde38136d66d3858e2326d68ddfd10aec07973430fa2f023a67ad282b6fd73640b56a168905346e4141748374e0faf5b1f2706ba183d03433cd56abc070f2e5aafd7d98fa95c2f236fc30e86811c9965a995967b84ed13aa3e2c504a9d92d9c141cdf3532a6f393c7a9e87fc7c0d17f3e62cea2d5b9c6a7f34e64dd3806cbcc049a0b55e1a73ae58bd117b4249cb712d5d54cc79a6314eeba76b29ffb9871f8050b7e8558152d49ec182b100f03def3c967602076c9408161e23ac784fc94a28dd7c54e367f3f4370d5af2dd774ad94819f8557eb5ade02721769de34a1c84e17956c0aed53e554a2a020681e8dc76786f448d8789641d4638ccc6ebb36717d3abadf55ed21b41009ee0b5954ada0ff51fc072c9f1a1099dec8ded3691924925fbeabc9c6772fe81f35ec7c1a62bece7b1d6cbedf44cea51c421db6cec846300f173db109b2bd5f4b0e303ac03b95575aded629a9b4d098d49f05836cc27ac8b16b11a61762e0e815ed632ff696b92c79c6cfd79ed8cae7701632c3c3a626eeff10c43370063f15284a11c61e129ea0606bd6531f2f1213776e01e253d1def530bed1c3c42b3c68caaab897b71dba75a7147626bb265a9f630d0f799de4079e0eaba6f164304d45a595c41f524690fea6772bccf36ce8fdcb69c7f4224b452bd18dd026d0b4064e2171c0b76ffbc6bdf6fa63a0485161c108faa7ec5175fc2141dbc9deaa34dbe4c6f53b1a60cba0260124ba5b3a72395bb4664bccdbf2a130a7fc10a3412152ac1e669f92e524c1e96d6c9c583a5df45046031000025fd8bc9c85210f4607ef06906c6acb6d95b05a94689621d863073146778140650c174797fd976d29672576b56d392e5aacd00c0e7f1442852006612e3a3be88485c14412dbd0575bbd8a8ef5ef67264cc8c5703436a324d113667275a19c72e16b8b44a59668586d7972c1fa79815da477e529be15df634ccbabe7b5642f79fc1bc9bbc8b3cbeacf3992821b82244f0248d39b0493056848b74b3355e861584514f13be4ca7779015c5e71d19fac54e6aa05369044d1be6544c8e7efb4deb84cf5b6278220f7ada4803b03c538a609b219ee9ef991a0d01312a967db3ff3f4842c7d11398dc8d31913bcaa5ed39df805171436a9001f37e29f6145b1104da77b27ba8b73376793dfa557e826f6e08a40300a901726896044498503f9ac484ba275e2f8b7d4505a78a3a14f86293a5b03f3363dcc5b9bf3c8bf89252d8a804b9aa5aaeb8fdb2fb1749d0d4314d0f7c4b0bf2b824145b34cd05fe22bb5216241b42566c653b23213440000555b84a561e7125f201e4b6be61bb9347a39077aa89f83bb2bbc00141a776b3f18b2bacfad078b4579abf32249db39d4b321b345faad3efc8e213b52117f3cfdefc2f9d320a288730182c37302bf705748f7ab30b27db5bf601bca58a2dc03d15d04b85c4748a87c4a2b42da8b38fb40be3355e76a718678441443b4391e4e6de2e08cc79b5a59a5d61dd7c55dc81915755d59c67d393fcb9c932de16ea67b1803eedda197682a9417d328cff4fd783a20ee1d4a8535300dec20ef5c9e15285452a82176c5e279db91d38c66db499743236e170ffce605d3b5361ea251dac4c73174fec39169e5c0d69799069b2cd4b51f45dd735ecc3f918a5b124f2477ded532fddbf4a45efd0858a7c53b9f17df04570de71125683bebddf890bf806ce502d9ab3f9659420df69a8c978261ab04a56d3eba65db4a892712a6e07fe03a65d4980590353ab3b7300eae96578d56f43ce450ddee0ad3b5f7eaeea80cee50dfcee085843dc3147739379638477c9c1c2f3edcb8161ea420c2a9284de2e550b15665a3723c7cf4dc76a7dbf3ceb9faeb00ff4adf7a913c881beffc589e7fba990f79f7e0ade2c5457cd1d86f49bfe3ef368813ba880cfd2a6811c33eac17eee55eaffb660e7f1640b04813f16508f7a7446bdfefdadc66a63bd1258678387e34c87a1668cabc585cb56d27209d2fa691bf3d07d5cfaa197a0b808bc69f7bd8e5e15ae16f8f251c07f0d38a735e9e613d1b6e1402e2d086245bc27e559e3c9f971de4d4e0b843c1c0f6fda67025dfb817cd618d0dc0fa2d13a0f965d9d10522c6e28a7972d282fa263c5e139d8f5e2ba059c9eb4cc6818ef67f97eac9f46012d3e3ce478c6a8d259635674a61f7a43c655509b74680011c1b4c40758c54c7e06c7622b7a3ecacc49f86cbc353fb5c5ae533a3699179e36510ab658eb79ec70bff3e1a423fe57c67a084de16ea06b1179e6a198aa400c2fa64f199aed22ec7f5ea90378fe6c1667f57c420ad9aa67cf2ff8cfe92f4d10a3c86d33f4e4271554edd10ecf90f1d158c13d935fffc670a6d9700a50b1a5733bc04a4d8f5af22f9773524bd063f64e40e6328809675a4d3e7e359bf5b7b0fc9e95d0ae93d6ea02f0f91602a4fee156c86d42693099d0c7402631ca01c9d675744fe5a027e177550586047b72e91bb1985d577dfb1e8ea654d94bde9c6f7fa467f77369730201f2812204fd63ad0d2757be580d937dfeb221a06b21ed3213531d936152a0c1f09f0ad5fed19fd11e80ad982c61203e86b2508279d91d99fa483e2e97a3d6a6ad2548a8da404dddb58344f4bdc1c9ea907088885e4f532d9c4c73cdfda43c3a9e4ce5a2809096593cfac1d9f275b60883b272b900cbb8746226647a7b9dfb042cdb86ccd909a1ce1aabcf50b3c41020c741b61d489474f8b2a0 MD = bc824308b8955420c4eafec6a9948bb5d35ae2f027f5813a063f3927 Len = 24272 Msg = 887486fff7922768186363ef17eb78e5cf2fab8f47a4eb327de8b16d63b02acb28029899b8a4f6f586d4da288939a036841ac5b38bce91d7c373f9d569e3c36916e4ebb0419f463d05546569244bbcea4d0e03a89ad5ddcc5d42b8191c4ef47fda8447ed986d60681c4bca5af109142caf732f167da31736d3bbb5e085da0536fd4874f8c7f48c9d5421d2a2f75cef2234b10fa73a1e8740ae48bad3aa6d3db5069a3978d61e1104333e45e93f2a97f463306c01db30740f75508d9a95f0e5257de15f16cbd139c6430aebd9cf5d52cbc4580dcc67c028ceb03bf7dc4e4c45adea84af79b0f74a0b0cee8c18b1db69cfe092bcb1e7b5e9a3e870c041db67a576d6edee498c778dfa1550ef4eed8e24273e443f5762f900b6a359b073462b4da7c983e73068394abce699dd24895ccafc67d85f68e073b5306c5d8f17977f846949ae61d44b25c97807321e418f2fa575e1b4e4896a0b4f39c8e424d8d44a94e4e0d623dd3d23515701817a4f06eefbbb3642966406a918f84156385b0776c33f1563f6f4471b2b815af0b9f3f78115f5ede83da1bf3556965e1c934b37ea5aa370bda2c16ff5a01d9de6a2d769cf3b4c8f10a0e89a97523ba79cfd4e6d8ea0377a4defebbf99f6544fcbfea364c2b4e8a32188dfa1b8540da53f3e0cb04adf24ba79a51b3fef754dfa0695fff141caf0b183bd31db7ea337df6d1d2f08065d91b9aa8bf8f6e0673125012f911635c38c429d078450d289dfde8f645c7daa64a7fd496a2bec52122759239404dd84e8e6ddd92e81099d4c2e280bd93d181e3a8d10bc0a5b292ec0581dd48bfe4e1781230a9ef9cf0dc5354b474b457ae04a276c7a6d3331b65db7ebf97cde2770d6d66e5155311664348c5ec3b56fbbde17756cc1c2ad549ac63f09758353294ba92eed3b649e0017d0999122b321a7186b6ab46f253f6edd50a2da1a52b3a9e779d3c84f3408332d83a30aeeac21e69830506d0bfdb32488e526856f4fc5524d2c0b28152d3757ae33f4f1ae083821664c6dbe1eb2cf20a16c1533fde353c984ac1f3516b7f315a3cad26feb2e2e0088a90ad02fac5c0a33ccb50b4a7623b994df5716d93b0315132f86ac2c88cb2a082d6ecbc652218943ef4f36e071ffc886affaf4e71f30fe064a58cff97dd748edc2e3d66c0ee846dbbc2adb473aad9e610352f6c6cd427884038f00da751901404faf19a74777e9021b9023053bf5e42dc2a54500ab012d9642756958d85afe08bb1bbd02669719c1f4c736a4dba142f2d63c081d2334c243ef502ffa0f62e64df06fea02d1107e1f2f183bac81775fb9265f68a39ca5e294f2697d4980f96218d5f3c731f1aac124b5cb5aa39741e4899a558d1c7e1a338f330879cc94e71a7052ef7d162e2d8ad86c28bd1384c5786b1a689e0f305c5d3e9b754b0bb3f3b55d4faa3339f16080443d778983b0ccc4668edec3051c3309a910f71c8e46e7dce7b46d1223a00c4c6f10ffe97c831d7082de002685a966dfd77bd714deb38936176980425ba5f99661ce090385658223c7f316ec173fbf86d0c55e5a8264a26cf4572bea6966ef05235dddff26bec1853eb36840434604a79cd4d11702bff9258664b633d64db641bca7c306e7f6a33fee073d489226fee944927b72e72e580ad679684429c015f3349303405175f0f9e0d7df2c8b4875f5cfe6a394b71885c2eb7f8a46ea29d6c39408e4d4eba3705a1a0c9415b712317245b790a4fde549f6ce5c6460a2efbf58e3f0afea3de9ea0ba68ca52b9cedf909aeef8bcb3efc6c4e85fa3ebbd87a995b2932adacd0ad28b48c415a95c44296621375dc3104c7b6711a3f607e14322b736eb623402b58f0fcd212fa7cb777d1247b31cbfdd6adef08941511d2de7f3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f5f1a253b8576eba269c06a4c30591144cc3e7808cd8bde337a3ed559213e3c33ab9c6efc7318b91a59e7120112b30655c2e4f44ecc1e7a61e80a2d1d775a8d53140738796cdd5d504f3a74c507132c15e837a53528d8e071f1477453b5ff82c6c2e5ea7b16cebf8c7442f960b7806ace67c1f4858ac1f8abbc7c11c4823503d6dcbdeeca19f2c816ef860999cb02a8c6660a470599e2ab5672316e388705f8c98a18ab2e1e525e35e98e0d39eba1ce470e98077efe42dfbc3aeff2776c7649e8f67d896fcdf46a338ae36b09be66c59786f59db960e97d233d3c0548d891de7b4574f054cde2d556f90c8dceed5873fef7a96f7b68e06ed4a3a30f74735d9fcaa28548a7c72485e75f91d9531f7fc1c6893ae78fbe2e981793a978c4e6e2751c3339f92e62c0642de3fbb95ffde4973563326cbc09dbe53435d8a9fdd92846bb20176bb247c05972aed194b92f8ede95ae1965c9f1f03c72b2b708eaf338fced92a807fa1d2b4bfce79bd22a5c857c2c91753c7f2074841a32cefe52dd197dfbb17233d08d0a2415b7e2da7a2cd25b4335d058a63b6fa774dca6f4fc3fd3b32da4ff58fa3f64cb03462c1671497c6121c2b12106edea8cc8d9c650b1bf6f84ca94d7df41da41280ebb04edd6588b78105fa1ff66dbeb1b5e51b67b3908f4da1ca8802e6d07aa23803fefc7730408875634275a8fb07d3c7d6bffde5cc06a9c690984af466da5a49ff9770c0ef2fa763c6acb9a4a12a5d76f4f28e0e290d9b2fade6bc993b53d93b512232570cd692d0a2915275daa6dd47a26b9e8921f4a031750bbe31e8677d808b17b78613b5e9308988e6a901fdc1be7183b603516c4790787fe67ad895d5be0ff086ea9e4df927ee0bdc9ad19fa95fe4c35af931c50fb14aabbbc0965f605872451700f72f711b3282aad7a42d02806eb2f3d74daf57284e17b4afac34abc4447dfe45c8aabf9f0995e7fc13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a548bbc23d0d0844b6de1caadab02e21b1baa445f51e28e6c6cbfe0c9fa2953889d85ced8e9bd66f71f8f1cb9cfc94175a1977fb46cc3771047daac82ea770ef9138caf09a3bafbb0bb41d25f2cbae30dc2d6b8d46b0e45f54368142c6d3138c2732aed34734bbafecdb49c0c567a4f39fbe2902db11583a20bd2b814d6fa697b28cb09c7fd021d37c351ca5fb169fe90c945862ef39bb89cfdb518dadc353999a0f775529550aaf24893fdb7e21c7988976a1b6696e34d5c9589b6fcc1740194683ac052d0c9dcc4aa1596a34d0438a7f2eac0531f9eba575fcb02e94b3959f20b0f6b5733d03b15843135b076a3c47578220572f2209813d8e39d2ebde7bb38f5dfe6ce23063e6b43815b5de39d955773ba6b44b30b6f188d8dd64bbe21adefb546c32642ce6f4c8470680a083433e4921e5256d6d197ebfa045ebeb0599a7cc5be70fe07bb462fa3a8fc53791a18a33fb86b17d1f5baf48af186f639020976b3b170c3f63f4b8b4d8578b8aab1cbf9f933061638fa30d8ccdfff90bcbd9343ebca530672dcf7f5de807da8118dc67f4af8c3c07051a1ff3c1a28fcbfdea09aea5398441206c3e5c3346ba042208099a18414a51c8e86de655a83c8b6f7b9b24c07a0eb586f47d1b81bd34fb0fc82ef996f8932a22347fcb4fba05336ab57406d311d8aca58ec40199134f4e28465d79f05920785926de0b787ff4ab34bf1bbda7a5ea0cc7639c7645f114e6b5a71e82f00bf825b6e8110f98a010db15c218b204df4abf329a8ce24bff89a9fe16f97c5cb72317819fa03e77c461ab57e6f44cb16702ab2e5c1dae74e4b8804ab977cffd04aa38027614ffdc94f004415236f278e41aba05d1d5408849a953e3b81fe39b9b946e8193f3bc91b7c4cc1a2f660e1fff98d3fd203f014fd5630b0f3c7a20fe23e9a3451ec8dc5cd6e5ed2ba40c076f5f86dd6072e0599131ee8e176d0eefed45b1be974018c706995c4dbcdab14530acebc274ee42b1150452c6437266b631a9f5a7bf206de457a730d614f9dc302a90d06982bdec6fa4f7979ada7407de92f6bd4605e84e9d16a9696e7d28163024b13cbad10666fd06b2c6f1269a7bd0d8d50f83b0bd44590d4610ff3d8fe6ade8b7379dabf239c103dce7b56d0d49f3cbedf5460ac9d68102272c709d57d40f3c4bcafa56a9ec25621d00cdf8f4f9ae33e7767759348c7bbef4c5a9e5a868bee915fbb91b52078fed1f1b210f78136bd76a9afee626eeb00954e4925da92b22b7bcd4c2421512696a873f99f9c12091801f6ac3f9c68588 MD = dbf37238c302735e88483a64a3eeef0c626defd048fa39bbbfedf112 Len = 25064 Msg = 2eb0eca524d5a152f51af240c51bd815f2d52bd9afbb64aeee06a7bb844c016a8754eed3fb291e78ae6d783261f0606b2881358e14041ebc0ec507c1060ce6464ef243474072f7c827c334c45de5c567b07b977d0ad87929525c20da8d016e7b4931f4ea3bdbb5ac27c52cdf0024916f516a598ddb5ffc5d7f73faef5f52207141ba07a33489df8b751b6a6993d24bedd2f681a8cdc02fc160b19ee9c5288490fd34875972a7fdccda6cf64c5e1a7c48fcc819b52a249abbbcbf13ae07ab2341474879f63e5b97d91e60d66ea922abe89788289b38b2c6b45a4461286d0284eae59ee761e0cd361909a014b9bc1260356bdeb74440933a1503e9913d3f5630f5a0ddd882a02761f462d4b813de1324973f70cd9789ee7e447f56aad7c4ceadc840ad5541c58ea1d2f3a4c866594d7d76dce9727c5dec1bab9632b4dd459385cd8db86586992c7d1b82b64e9973e7f63a0befaedb02b598b01026b8370acc3f6a4fa3103962297d37d8b551947509144b922a8a9cc1707dbdb4d9bccd5ba264094d195e4269ad298fbd47da3fa7dd611139440da8e24553394bf4cb87803d7b1150c05889f6df0a89f914f082508864f5cae240e5ad5da08c9d1eea4dc0c40cea204005f751e7a78e53c59b45b935a55d0baf293c6ae0ef1d720023076560a0fb85426e72c1ee88079402e3702b0aadb2c650d29560f6c55692417d9db538beae476e99e38f1c365a8472d1ebec2f035dc17043d9d8c5ac9ec58a01f7f975ee6a2d6b9033049838f1ebbe6c9e44cd2fc4c5b583ee1a782b5dd283b5fd783eb89800e25b48668b1632918ebd717d0cba5199c799be6e35cbfc82d3a3987cbca59e887a000cfd1c59873e88ca4dde132b6b074f90301c2412e19d23d3ae4b163ce58ddc896613748857b9579d18ae0b0a79d5f56d2b6b6f8a75eb1a4b282e7505d5d7affd3deeba2b09cba13ebc361be0e5cc603a99a53bbb20336115ef6d0189d62d9c657bd717cb073c0fb31fbe6c3316b439ff6110b32c4b3f9f39ea50e14f51594bc80716b3efb8d448062b8d268e745527c26bf4fc655cd57dbd001f3ee0ac21632ec9f3b51f845af53fc6ed70766776d38d9f9b41eebdbea3ab1b213fc2514e8da0a9b645e3d398bd64da24727557e1e467e54ca850d4c2b80a229f0d7fa6a870248fa68dc40d54497f4e7b5512ac5c0359254e59120ba865e3fce1cf9f15f6b5c5630cb2499a5740970a3a41d6ceb0d86947ea7dbcc93a513d932faea8050203880d30dffbe3694bb5f6a95d4726a50aa133683cd6753e2420ced1d224de920377755a3a604e5112e0fa10d2ef1a024209d110bde9797d8895950e629a076f5c9984d2eb0244d93c20feb6c756139127a80a29297c3cbf23a2d0308793ea61b7f620df1b692ec7727deae465027a186286c4fda71826cb9d52677d6896ee2fbc9732cbf21b72e45b00a6e2d47db5609aabe8d260449f6b9faa433e2e2b7ba31283a3dc97a27af8a0b01af83b4f2e3178205ff17c880f65d1b44aba00daf98362c2595b3386accbe8962f6ec2fe4b52a4ec0fa2226cde82da77653b072cd098535d3e90ed4d7224dcb8cb8b9314768dc517e22d7a79748a63fb7d076aa869aa8e5b39c2ee8133cd2320d798d31916a883aabfd9ad363a451349786752d72a81bac4313a5da9568c66d63cddad93926c88ac8defe32c967b936840a3e73f7ce480a11041634e452a4de0e0a2470c54a1792536b743e1f1f38a60bb03506ac89c88f9bd1d28f7676f7f48ad2fc90bc30f011da179f6dfb476a13ad3cfb6e0747279d42016d32c2422a5168acb5c19477dc69db67d24ae45cc80fd6f4e4027ea2bfc3a21768d76e40d66505ec028bd48b570ac5d0af3d40ebdceb176c917c99092b834a8837d5b0ff66b001354547f2e7da8537e6a8edb7511335ed288624ed06e56c99d87cc650da65c2d90d008e7629e169901e31b4be48f590d6ad34a3c11867d02e8c8a11c47e5e0e0bd7c6e7e4ae06186cebec3aac200e5c626f2f71dbaa3d6e5718f2507237a9f20829fabcb4f0a3122ce43ad82772c828fee2c9078358d087d21237fae0a2f42f5c782ea56d9e63076e7b9025a6bdbd672aacb3ed6e90cbccfdeced89965ca7167746e51a8513a0489026ae9bb06d58976421528be3ee89ae591d658519a14d37f71a908481dcf5563089c8b2cb0e144a39e5377b89ce849c62384265d13d51144a67b38bea76dcc0ddf980f35d1c9af02a7cc524c6bd6727a7a206b4536d5d2bffc2e099356db108e71a69e5ed153719a43cae2031378bc0a80f24e926ddbbff65909a24e91e3caeea40d6030184832745b934e64fc96d07d1b41f8cb1fb180f3a7532c77c24ba23662177c320e6f9c96d870bff88ffa55db35579178b31dbcbecc55ce9750dc3f6d920a1bed1b92550aa0a95d45326bf42cb57a402193e81b5db257b135a35e4a9b1c2f64e7a87705d89d864fd54eb0557983f32d4f26da47da3fa0fcd923996ac8e7ce80aa1be75506b54fbe304c921fc9870a8189d4bae53c5d7ad80b385548fddd2f96bedeaaec9ed24bd1dc92d9fb25a90664580552a08cf32b6d544a598c42e599cfa9578874a7dbc3b1638a4d9094d131fd4321681dd1e8fce23bc16edd9de75653f5f049922ab8ff854d9bb5871ee7d175d290c5071326356049055ce318ccac492910b4f02e514776202cdb87cbd32ff38dbb31045b941e0e047eeb47ba7ae4d9ce1e9336bb8ee3ac66a78539a47d93a0fd0873bcb01aff15f694e2b18bda452d6b84ac0cd9571a4ea6737c44b0cd44a4a9e055d91aa01f9ca7b00bc894d4196a88a9c7189194368569f88852f8ac8c2619ac9d00a10ec7cc9e382c35dc51a6bbaef5ae05ea2d7d78369e70088200b14ed6d214db4e4c3fcd63960ea06b37364663d02879ed0a385095cdfe1058b3fc4567bc82122843cfc67e3079af4a700f3332a2fc1ca113ae340eedf81282abb53354d0af4d37d9bfdf7870350d80e279aba0d3f3980e31294d2a6627b506d224402678623384f75642d7bd09601577bed637cbd5923c4aefc270a053a2ee0e9192641b656c1686dd14267ebe51121525db7ef36ab5344749bc690444814249435496207ea1f66c9c80ea1d1c877ea6f5e2fdb179a6fd117f639bf8c1f9086a83ac45f1767a2a93dbabad01ebab611177153d6ecc109f8ed9de90e594b24a5999c2f8f5149ebce1e2c0f692f364c43ef39ac593299923a89f56d03483550ffecdbf379422b6b340f8e54e38fc5bae15b0991d8659e9904618f2e14b578a604166cb8a366669189767423c5bcd37277ef83bceb124a9ee508ddb4d94d7f8440aae0d7a43aa60f2cd750148632fa1376111a75f7b518145ad46389c75cd48c341ebae8e23b44249cc6b47fab8ea41e7a64406584baa189e478b325458ff21e5ce66d54f3f4cb8267b913fdbc2c6be3e35d980428bf5170005a4f1ffa4372cb39967ab43fd3c6a90c22e0e72ea8bc144f6183ca4a2fb2574cfd89c24c13b11348a3658f4c64bff8f898bdf479600f102d2496306f884eb018d715c4c17d377708a1a03ea0340202bb8f1d8e32feef77fafb31cf0f55811af27b558fe0ec906707f5dd5ab1ae4746d38a621cd1e1d7ac4779f90eb013e3e8686edb9c20ee4673b5345f5c175ffa45ceff2e38dca5523d71055e77e84ff1a8f9060a6207feb42d9ec1b8bb47a595700c61f46ac9a5e9ac2641d4832e6634ed12e5848a1c9a73e533426c10a93b93662a57471b1f8ff868d593fdb8e8f328254491bc6cc54e004b011b0bd4d27e8e88975388d244b028f3ed902ca1ae7345d21c7f2492a885d3cf86dffa7049daf167d1cb4c18efa2d5edfcbb03a5e5731883f9225f941cee88d342f5ca8b85fd46847843036766f499b77168f55e345f0abb690fcfd9c8c479f6b3f0fe8f0d41f85ee93f31364111dee0fa4e843301a3a6d8fabbf7ec02b431ba585608e34645a167a334781e04873fdae5c022ccd3fd776d1c9b5a33714a4a9eae897c20c774bc2f44b72a8737c11735c262737431a8f6f84d4279588ae32f04353fbae0175bc3263c3bdafa415c0f621ea9d8c19152a00b1b35d7b3b60b599b7abd5779ac7730ecf8370bffc7b482e0690ad54d7976fd05f4e9f7ed894f44b4fd96d4860d338fd4172d3ff021771c512019fb706072788968d35c6e8b1b8af12c50b47da02d5a7bf7a2e983e4f03604e23bbdc2dcf1acf5e58667af31fc96d0857f79c90bc10b55482c8b1388cc5aac0df49ecd456104ec0977cc37f45ef2c397878700a6ab3cf0573ea7379378048721e900e8304d1adc332bdc8168df294ae0ed8ebd172849cdc33dc0688b6fce56cc6d96bc3412493701172b23f5e994e6e025d346c3e4cc5e0abe691ed730127b4c06c2a1b75d3a8cd1de2 MD = 4784fc2495fd5a20178c7a8aa50686679138f54d4b9cba149269f191 Len = 25856 Msg = 8f4754c41dc79bd76b8a8aa08ee17e15788b8c0b7828204b00f0e4e9aba5e4d17ec6efa36f0640c123fd5ea6fc1c407953e6b5e1025d031c26bbce4b23633c10e817575b746bb381987a508fffd7c1dd6dc78ee644add8564cc53b65b315f96453a1549534df3b40526a2903a0fa4b6a4c94e1c045fee624fb76f3df66a361f449ccaef9b8482126d836b1ace66e24477ab774170d3a76acb936bd6041f6bde951002c2e0790ae5ab144b02fd919949e7f960f94a547d016116d63904ef4546af4a597dd299d270568feee3781e4e594e19b7cde140f3c8b8883ab18948670a0b823b7ad2759d74e82cb326ae7b75d532a2c829e62780233a8e05ea01b9557b328e3544708aa055e89124670127b4603e1b3e87c986c6935f8ed44cfec0752cac94b3652d47af85c053df0f20a16e6cb8f97771fbdd2bab90010244e0ec6a90d25c4247793b0f9717cb3f998d87286d4bb40f730d9913ee949b2c7c489b8a4a5c3b7e85e4e3450c578dc290983766d46ed163056f5933aeb5a3cf6da66c78bba2b8a48ae0dee457f802047ee1309e548ae81e93a17bff9e7bb147738acdaa573e6a70d10d6c620c81de71dee9115340284e9ec844afdc206f5a4128563d83bf97b74ff2bb3a428c7d59971b20481a39dfab6ffdb9335dc6f8f53916a93ab9574725be5a8ab70a6a5339e0ce174357a419550ebe7fc4f904c1188ba8e453afb0b54c2882ec612e289bc5eb624e9180115df1f77518c3426c204ad579a816db5e6a713b1660d72249cfa4236236c1480425f8c6dc14bcae6fbef292e354d2c0a2ef6b526f78778b40574b0568504103eef9dfd93de42fa171f5a640808b35f440bc610b08b3d0dd9edb211dcf3baf5844522dbb35178ad0355cdc6acbabaeea9a4a18c16c73517dd7c3dce911495a99a6c758f93c1f5c9f0c6d1b7e4f46ac182220e912255797f06d99c4d3d919d15c88b1e7ffcd7c237279aed9f765eccc116ac96879add112e9d2d57f8a811da2156cba615b53be6e0f0f8aae62b9fe7d4af6bbfd64706030be99ff736993d55b68b5394b8889469ab92088ff4cb60c4e3938714e6f17959fd3458036edabd15bab04c70cf3b8b547f57f424311e4869d70b271a205fde1beec480030a313822170dddc3c497c7ae4685e1f106eb00e0965f735bea5bdc4fc5e33e7f71675685b3ea2f13fe64f17fe765f97fd9fc2f310ad7945eadab1bff6ad7ba000b44c045788f69ebe56ab0d04a3f645513177e6219bbb2abd2184432c4e81d0d408f1e6a4c43b4d0e170ada8575b4afb1d05957dad52f4cbbf6afff1bd608f2f781217fd1950384c5a408f0ff600d2fa5d8e1b89ade58345de69f3433c8537ed1b935404c6fc1ce6b8a0ff0d0f7824d93d79b98f01bc87a196ddc9302aa13ecf91db7d8a3b9089276359a5ab8a09692024901696911f27684e8d28c06dfacb5d42b239946053a695c43328f04ffcc9587a99dba645568b217042b9fceed8072097df302c1d8f9cba41f531e546996b08a65dafc705a8dc5463c424eb95851a9ff62c0b595a8a921e43696790582778b812a43b02b95f42898fdb10954b482b62c85f7224ff8eb147335573fb6bf017f02536265e49c1e4495c4f2503f66862f276410c93f4e120bf7782fc2e683a713947da19e49d17eb1b32e70c3c7f2ee8d6669a82b121cb080e79b8ab2f384eae1ae05abc9b9da87e88796c6d48cfe2e59602327b836e9691ba9fbe2808c174f51c587cb68b32bec61799a7ef30cdcc80bbb1d0a013c488e24d535e1ac1edf36ec51809b0bc429feb50fa5d3bfb6033e2ccda3e996809eb244ffc5e2960a31542a086c85137b69414bb0459f9b172613351e7420d8a27057e460187feefcb2099320b83420377e569e12062d05bea9c9ad33fa5a582041f19bccca141754c5d9a0510002a286cda1349b43f6800af2d3fd94a2e08578a801d38c4749afb10146ea0fb08b2af7cbb3a7b2ab96aa8ab5c4beb70a7de119f72b14351c7af88fe8d3c8b3563829f91cf0500e8987e5bc570e69119d6d1b92d3bfd64db642b24fe0f2d4f27d94100925f9d5f58a44b22e5b33754ad8587551b242a23ca11b4d7f8e36973383297da66b32a20e0a47a04f36b67bb947aa8f0517560088797f2aad452177fcf352e36f713d3ccea62b20ad8e19d4f367edd8fb776c69c78be8fa47aa260fb56acab1b2cc7c0eadda49c3b7a5d0296fc58ce3c356f8566064d30ced31b6b70345db992ed161a022133e09fc226be1a4cd222feb3a7c4ee990e7f2ec5076166d110fea2224a099c1ed7253e9886f8638fb281de1967acbd9ac724cf39ac6963958f2253b3a9b4413c571321e5c3d9f72ec195e24ff7655a6f41c7b61854acf1e8a1cead897c4478e37d534f8f2688608fc703143d9f164d82440fed48455197320daab98a0ae0ca7b0f8dd080f72d261c8c767ccca7e81f3a98a47bb3c781dedb9c5d7e9f9db1be6cd668ad9e7ef2cf3cd79421e2560257fe042f683f24644c4b169004b17bdfdc1e9a8dedd303fde55671050b68f58c7d385158bcd6a2216bea43ea54a6ed91acf923a49806cd76f0d423724247ccb01a4f47c6805f8be1c321ea1475683befb7663854b71f2586761db383cf652394b5abae22bcc225cbda56d5b56fddad2284cba345500553550199e9dfb9ac4260d6b44e1376e7b9083af2ca764bef8b529b912a206ea29f0a18b08f2f0803703d05d2ef42b8b68ebf6b5e92ff10851ca68521968d16dd50cd44ca6b1ac451f753cb6d58568917ee19f301f5f7c686a947c9e1ae33529eb0c80b4f4749f6801dc9afed52f8f2f21f3e5c42ba0676dc7a5def3b3cbb29cd0520f8a7e963a6772bc73abaa5d0f92f6a552e8babd5276ed70f809606cca4539800903a1911da1e6877f23c1985a9b61786ef438e0ce1240885035ad60fc916b18e5d71a1fb9c5d1eff61db75c0076f6efb29d12c53ace654e800ee722ca2ff98f2e6b248c8f31c93870f0083281d42b7d9639f4d50919c0560ffbca2ca37f69455b366d521e843113883110966f218394b2614b8ae972e6114892b30918ee4eedf4df611ad81bade394578d0218ed73d77f9983713c784b12d25a3e22bb1afefb73bc8c415c86942b3dd9ba002fa690b856493902827873cd25c8c823da841dc060546b500c53987ced4e441b13db4eb9eef6d8c94c21d4c2cb54fd672798000f334d7ae177f10f3b1b0ba7ad55fa225ea238ff3ff9d2f2763b852a76f2e56a2a74fe27502fed8d085fc841416691a0090875f8d13c2a6169eedfebcdfcfaa0949ded1d4684a7764713dacd81e6203c5b8a446227538686105ddbbdf6862637e02690b90f16cd7f89efd998b925247bd8c00ad79d0075f50c10ff2d6b2f16b49fa79f874466bded334c3b3f81d41cd2d3125fa5bca38712bfa0b096a6683a9b2589500470f4f763f5a1862e665387d60d29b97900bd18839d75a6a632c21050145468bd0f320868238830e1c123e3f9d95e8eae03cdd8bc381837b89abd2677de81301d89be7f5e5f78c1f63cd5cfb2ba2965d1305616211200ea6a48c9eb76f6a84ca27afacadb0bfbbfd833e999953222d56f00d67f56bdb84527b768ddd1ff2214e85d675952bb79910440cfd015d3d333f40fdf62c19da6ce6d712a8c2d5a973f6bab84c959e08adc16edf901c911a327fcb7c17ef62464ecc8008f64cd9b601288dfe389550d97f76c8615bd036e2b17e5933d1269047b26b3eff7f647242534dc850427d8a5398981b38650696bc39a4b2ca2cb9e904212bd9a04cf3ea75f2ce31557035949e7f902f0cb6a7f7d151599de83090b6a62374189264df8776651191b6cca6b6e1bcc5cc865799a2498105e435e6933e543eaec47dd012926e3480af1b5eb63845d89eba4d4fc6df4b51104d5b55abcb37fc41a50b96725284e882552a2d4e61f15a85c00aa614f6ff4ae2a1ff85bea377e49683e2c0e911e1087e498e41577a0dcae1a865656d2e8ef3e3a7cc7fb50f3b7e1326aa555e15ac1cde54eda2b7cbc3b119380593b8d020d47c29674a7957ab5321560c5eb8a80ead093ef059589c399697399338dd24dc7613ed7beef1c3f0ea29daafe2e1102f4267cf3e6c20359701c272b65dc372eb6012bdae74049b32cb917b3de9c095366360cf80e6f9dd067a02ad17085402751adf5fa8e39c26987fc2015b7c3d814c985c055dcccadeae8abfb05e44771ba12de49b1243a0ad4b8d2534b3a1401a986ac33a7e287b7eb6b86144321614079720873b949df778737d21dbed62b1aa4360fd368a01f306468d50313b88140c807b3205d5f88bcf36d81dc0b1c77877740372c12a601cbe8890f53f22a15d7384c74cc37e5c43fabf2583a9a5d77eca54d98ba3064cddeda249b6368f69d884ca8b3d3b36d1074034ecba5f749aa9ea0b6caea3c5cd1edcbc40fcdd29e96d867b4f6c36a660bfebbeb62aaac418e221c044448b0febc7d4fffe30fd992805c3be9c437b7610534184093b513e5a12b59be7b6218eafc11b920ab85e862e8681bcf829d44deaac8baf MD = 735f3f0ec0f653b00db6fdd424eec183433cd77461b21c2ebb8a42a0 Len = 26648 Msg = 2a243246bfe5b5ab05f51bf5f401af52d5bbaa2549cf57a18e197597fe15dd8cd897650f43bc034a902036d6c051a1d44684f9390e872269bdf795083bb3050c6f904217494f5d0506cc0dc0af77515ce3085760d76f9d619b0a56d69f1b0f2775799207d8860b04ee60695cca5c071335b08c42ae6f10b2afbb80a93236430474b91d86f9495470d046125218e60b20c3e25f889a6fc2838170da2bfdeae8ccf3b8ab3db380827134e5d049a1fea4ac15079adaa457fcfd9a922d02072048a67bde04d40e13db2ea3a56bea6e8d1cdfb48803dfd20f0648818a41d658c1a9bb9393eff212eaa8d0a5eeaadc8679b9e027cb63402e80288bbebfde50f9b35433c33f363fc8ed307ec02856c7f2acc4d8f63a81a5c090aaefda98cc17f1e09135934a9f653705bd617ebb3755b80c84eeaa3c27b48f28d39b5c7fd2d4482ea8e98c1cf309671895a16610152ce283434bca381b18a331ecb7ccdbba2f0787e078351df9d6610f0165008db8f477f84716de98267704913d6db3134acf35d2820a16b67b712cd349d5d59be8568052da786fc3107abb320ee398914b5ddaf7d6c6b84d3f85d04bb51a6ca36cf9047b42990421a1c8cefaa74103bc8480ffdd24d5a24c0fb8565e8d5c4d0b0d870b5ac7a0251aa10a48d34fb07cfcbfe1aa6eb45f5c19b1b2c5f618c2013c93a59ed7b3b65a16d7e72ea450588cb9c228e691cd8b6f1eed1c25fa9f750f9fc6fdc3da4c022c7d0c088a55f060ba5b56fcb82eb98162c18d9e7f516a9dff9b6d37844bdcad22b7081463cd78f08f4a43052a2ebe6abd6c57dfdae5c1605a9752fbe912a9dec52c93b4c2f6303292ef51ec4377256e098615883e9dece9a7fd3beff918fcbe9b457590aeb75f4c4bb048590bf236b4cd778d40b361325e6e34f1bebc431c752e68754f2ff84e6642f6eff38b87386591a688b04219dde838a43c0e3a7c532a06fe5d994da146a9002a0f63ca1f75a8de7dcd80f2ad33ae8bb5e3887cace705a970f318119b8d3c0cb27050d0a033a63a632657cc067dd9f2cfb0d389b9212fa124007182cc6b48eef8da63a6f4bb8630c059ddd60a0290f25a6997698d49d076844b4fa91d2af52f6215445301557145fd2fbb1aa20cfc15bed77e250ea70faef79e588c76116a565ae89adfb1488f03807099a0b7e144e263c22ec4268215d3e4bf3435c067d0eb471d0e53eade07f1b2e41e6e2fca92e1b2f24f4ebc240a6cb5778cace1754e76917a47b6965d0297fb52f38ef40f0b9b112e8accb7d31502d18e08f7c3830d809fc8ee109c0ea77ec484c008ecf8d997e93f874501d85e1ca0cc4f204cd83590dbceaa6ae4391f2d73402ce201cd245da3eeedc1817b0e428af90a2f66beed2fac5624cb5626912c724fdf261ad51376a50164481f034dfdf7dce02af87b5de47a26033bda1c2604277982dc1e59cf69594096e3c3ba42d34f3e7a1bea58ae37ae08f0c25865063cfc85bd0af7a180be2675289955e6164efae77f09249d08b0aec19369b847585c573d37ba8cf54cfe7366c573bdd0f0f6609f98fd8d9292d8e31c9337e20b45eda26799f3c59d5eb0aadc1377e3c0f952ea2e6dfe0f7f7536b5e09935bef8f47644cc8abe8ae0dc5c329fbaafb0fd59eafe5ba51491abd8538dd44c6935588d7fa534b322c308ef8b737763230ad1374606efe947fc5fe4b5d1c255dd2d713a902d67bb27585bbec3d52cb6dadb82bbef68b3e0a036e3c1e6eb705b998f8d2132442c4cd53122728fc0855adc09590f6c8e6c3326287f966e41a607a344f26aec524c0b3537a432749c4cf8317d9e5845dee589e2ba7b8bd33d2e010533e83e47bf90a24e502b27fcd14737e22099c103c2e58bdad51eca9f45cff0c743b9c5caf3bdb92865fd78aec73fc0f5d9926f2da133e1185fb17859c3507cef5eab26fd579ef7cc5f634e12e6fb3a758fd08d4be29832a4427cc08a1e7a4e876b088a6851fa054124a5d1b197454e672c9c41e5efdc268464c7c8b9be150e96511618944a988a8f9e0b281240e3a4d5973eb3842fc766c2afdab86e0be96425fa1ef908ab412fbfb3dd7cbe4b9ee3c6b8fe0daf0a209a6609fcb9326dbdf63b4d67544cdabd9cd84d62f43b1e3eb343772374efe8b16a765c77f38b4c5a6fe0323b52e941d478e253e3b913238bbe53bcf712cb31407cfc8f918d041089751c91e01b66464e6ce6ada8f2cdc04da9fe6fc00fcb4d967bff8a93af222110b0f8529fd64b53f21fea43f9c8f25f4b1f4c78c79377a57b0d8835c5836fe7b7ca7b5ec0ab21cf893af9fd1e6309674ec646bf54c5589fb7da9e786e2e72cb4868ae9b8bc36e22db6418c35eea9a401e46f32dafcdf5a4118b493bd7dbb333893597f24846bdb3b046517d03862e5183485ca81fd4d61d52c8916649b0bb8844d6404b3e5c93ecd087ab13535e4c0445748719ed02847042387fe10ad511333ff6b18fb62b7a3403d02f6d979b7cc02b717e69627e8607a9841a9462733d9a433bf1a4f8def9f310c9e373166446eefee8497ec47164484f546b679bb2c827174d07744c9b9992c019d10e1ae233f48680ee425b02a79dfc4e7843fcb9394185d5fee6fa8ae077db690124e93cca3b8be2779c715ad66d771d4b0eccb1184f537bdbe149d5580b2960799ecc9b932bd5b5eb734ca0791f8967ecb254c1eebb4ae6a84f83a189b671a743650b27172c2ba253b135fd191dfad56115dc1241ec32bf6d17ee19fae17de56760ee07dda75751b63d74993dce920eb421abcc9c4ad3ad3021d26233f213c3eb76bd646e021f691cff519b6d9a18bbedbc0b16843df459fb5579a7bc53fce9d991bf6550a74c938edf142b31e9568312d04218832d5f6ad59b2a0e1e6a00fe38983d330dfca67612c504731223120f2d4499fb2082da89c7db2cbfe0a1e6ab11727ff52d6bf4bbb3996a9897b01506450058e7e4a42e5ed7fdc8e38a5f78976b09cdd4365b000976438ec549f9271163ecc70355fc23900fe946a2a40b7c6a4e446ff8b234900965abb820ae640fd88ef02e78fdf080c87787ee23b70fbbcec30bac88285d6d6287ba30d1505a9702cef4d46d64e90fad16c0078f4ad2fd69d046cead21405fbde4563d01b74485382be0020b105096e8f47adb0de6bc09e380dd1b8e24442dc2856829d86988a221ae9c007a8b8bde20199eb0c61235a9e5d8b9dc54b9d1a11871d93a7df090b6665e1016e15d04affe8e15cfe256a5a317e2c05826684f8168b08fb919d4c289ae44258c680c21d02a5ac580883a74c020a5dbd92dba2696594b74eed39b88e2a266c1a939224c0b4b85980be0470ac8a929f3a59036bfa894496f20d4cf498be9cecdb67927ec26091875b71304d0835977ee057865807fc0b2679843f76c4a2c8432fb53a168ea0e1a43cd49fa2cb9d996b6410dcdd2e2868f469f499c5be8138ed6c0ed1a2a1fff93ec95a9af8731d08e31a176f81e9a8ee7f37b0e457d2d45f6a34d6f19998d878b57575cad4ab4e768496ddc6eca707fc25674b97a3ae06bc480e902271dfb4c0b6c5b8a7cdb0ac62be5ec66b54029022857d473c4facb2cfe54dececb1e33f61a13e859a2a4fb14dfec673d57e690be22dee163a925b431ae0972fa8d04fb2ec13448f4a90b4f798c482688dc266c5cb7d3e5b2b3236422db86eeaef5381c9c07b7c181197acd9f3be07170ca678483f01e26876a5da3a68eb39a148c205ee7f4849c2978583e2bf49c901dab10a1dcd3a7ed0b55393865ce78bd51d92588b790842113500d6ac8bd64cab6068b8b0e6b578165fc20ed08a3bda09064af64b6e49d97682801191ca0206964643f0ac2bd142cbee77b8837156a8cf7b627b88af7b8484f899c13cfa4b8b34e4c94e6a0d3c7343e9fb0d2992d67c7ae56f34ddbd1be7af1fa461f8ad114f19d46f2e64fb459e20cab2993d7f29c99decc7deb527b957675036707f5301d6a78dac1d47868b07e51934c93986df24cafa12c5996fc2784042c6791b7c8b96808916976c2f8b65034e0839985a44f27485c6761505c5aebc6feae8678a2d13174f25294d66b519fde19356f46a19d71d28598c928a418f5e200a4ade2c44e0ee586e5f85bc96bb577c6c9db826cc27374a5265ac5db48e881bbb1d09b38164783d38869fa1aebd8266fa9a6e10ba875574379dcd009d20dcab53eb54b0613247563a4ae5b67b951139d3c980d8835bea2e7f917f0369dace678b1259b342bede4bea29025b7bd6867d7ea78abea53987e190ed3ce6b930dfc8c74e832cc48e9f76ae8d70113df644aa61b10663ae949136220d712b09b773577edc6bad55161d7f1e04b9682078fe3913726e37fde1a884997ec630b9d34b9c38687d8582e9dabdbf1b38d0c1d2f5b20a683cdc11c530657dbda6986828aaff7a6f2365cc7e59cae82d98db9098dd9dbd1efca098a3cb4125469cd2830c23f9cb4d17ce90481d2f4fd833f92b3f1864b1e31825e101dbb046a6037f9902393391aea5207cdb87434c97a4a9e03a28af7f6139fc8963d42b586894e028af7d0563f055ebf0ad4abf74e8658e6e2ea0c67c25bc64f04e572ac0eaabb4a0784217c8bec4b18a31b9ec4f46e0e70360f3424e8d2a1fc425d73716c8c26d9ed14ac316666bf1b80d6762323fc1646e95a2bb5d240d8d639ed6c8c06f735b826ed9900383a MD = c034c032abcff2da1e21f1c210355b929c6a9fd188232721aa13078a Len = 27440 Msg = 515f1be28acdc061fed8aac89cc2dd99303825fe87e35a01d33ae3ff509a795a28982d6f9596adc84594c39202491e51927255d2dc6b29614dfc0b3d7a75de4907fdfd04c72780bb24c6bbfec20308505facc722fecfa2034488161122172eb3b435928a69a9c1a465169bf3231722fe5f8d81d733384e4d80850c628fa7f400f8e9f5e7c343f9eace2b6a5b6eadf4c459be8dd7c4ceb3a8c89cf51a0a4eb5979bc12c051d1eaff528ae301decef070817e7f30cf9b85b7de575da20db34fbe2656441cabf616b2d3a46f521e203e2335fafb95d191fce32a0b7c25c4a804d481e7b3b20f035b5face9cc24f9b110eaefabee9b16e2a9231bf0ab6b69f5b34318dad23eefac216c4aa579e8f5e4211e0b0bd8af23e0231e00a18bd1621ec37057ba3001c232f15f3972092c972bd75304854a507d2ce33a94b86df64195cde2db005da91b4a53bef5d9fa5e520abc1088c2a41d872b71ef348ff2488cfd2b10ff47aba37f44b0e20c47bdfcbb0347ecf42e8664d65e57c25ca29956a8b7739140faaa7f52d4a18ef945d48636a7f33ec33351c4ef57fd4a999ac39f39572fda4c83ea9b3a5c9e1c294ece99695b568c927ba6cc368adafe67d31190934ec8528e8dec859a6f1ef028dd1c94a7bfda6cde61f5d94079994443e603b95b20d5a0638310dd076e9cc1848b3f06862807360370bf8a91a680b2ba3e0a98055fc03a87de07ffe5dda006a8a3b67d993665aeae32644eae9459c03765a6bb066e20874829226cca5ec11621e11358356d6e0d3b3194940bb56d0347d75870f2ce6f2d40ef00b2294468967cbdc6250f3f88f846c8c0f91dac32e2681da0784f131482fe8a235e97411f0e05844f727b1f5ee63d9269fc78cb53f424930f2f6fbea92edd94fac078b74cc378ef3fbefd9f585d9c19000c81a5489ee9f20514f943a5975a99f79662298a7d3358e7692b31fdd4feb723a7eccc7969349522b7602492331203ca3ec80a5081c15c071f7879c7d2b207256cfe937ee9a106d88538d3e7b8805cb3283efc2787af52ef2069d94edd6283b5ba5bbcb1769bc1a71ce7f42e6e222f72f12b5177e559e8304a73c2eb6b9cb7351e788ac9b6a1500eccf1e7ceea73d65a1811bcda215d965acc2ae925f3bd1c3407d99010204e2c8043eb4151a401fc090b8690c6c226c7df43f39e970c301d2314e36f3d29eed19be038734f21390ae059ee7fb65e51f72e306265b72bb24492b44a6aa95a2fc9c2406df02ff8958d7061dddc314c4bcec8100bd0fec8a02cf3746334dd277d8f83d3006a7c80b3ee59e1c928b01280995d713452e6698630d5c3d2304128549d61167434ad6ff0b7dd2844f7cb57ad012ec2808df684d0faaa20fbff9dc3417dea994dd13afce8749ac3b5cbeb720d70ec9284c4b7b11cd4f11a54f51b8ec09b70ca01d2bdde17af1332a01788f84e72f74f95a99264c67a4b2e71b372e15e80a42714bbae89fac1d6f3986d3c60cc71df7857af2f266a3508cbd6ad1c7177c7e54f1afe7566fe574695132f6e32241815ab2f37e66c74afca71086470a5a8dbc490690dbb1bbec9e28584e096e2d1b03a36a0f640ad7244f0cc6b5c28047e36b299a38be80ea8a44b4382236f0951e4adc9414cd66fff8f2c2c9406aaf444534fd94edb74c64870e16d7f6a3f0c112ff0c184be003a5908cd1ff6f6621ba7dbfccdcf8ee9c90aba3551f1278f61bbfc93cdefcc66833b2c6425289df5e1251b39e5aa18cf8d8bdac79f6bdde8a0aec5173cd6fa61d0f27481ca9d8fcecb28ab97bf62fb9e8a387d08b4641fd35f6633fb9cfeba9aba3b6b967eba2e65504f0786c98ec9cf55acfb892f6e4fc7e47ea3a16cbbaf7995529c22c0230c4216e4a9978281e5ea6635e0b96eeef03ee664aea93aa22b76f8f470a72d5cabfd65a62c3a88e0e268427fc72a016aa3c0bb94bf837526c12b6b8d73a414cb7fffe2ffe9f03b2041d160e7095b6565ccd60a9b40c0bacdf2ff537a2f9a14f41ab2055e7d4917c476be481841be3964ede729f4fcd15a0c537b47670f09bc6aeebc534e50b5ad5213776e6fead2cbec998cb01e2e45f1764517bdc08c6369947e97434bfec67a3d8a955a6a7f29bb61322f23836f8f1f706a6d3d134247bb154cab5bd3f1ebfd0b5eb082a4793376674a56fad13b2d12af15d43bdbab270f41db910372b4a6a42002217d9a63708b63649cbc740ba09966d9f540963171f4be9dc0e0a4c1771e301790b1a8b87178fa0358ded87b7a125c4948c1bf7fc909e025b369e6a2edb9900166a57c02a6bd7f9923d89ae529fbe3c63765c3e08cad6ae5f115b4d36b04e4421bff70bc90c788a8763027e320d481f35973400e4d5d9361025aabcd8f8e916c38f62350c03589b3d88c0bffff2adb331790c0437b991e295fdf180bcbc52be2364ff069a576173dc332b396357d44180a34a13aa7ee5f9171e9961890471846bc538451c10795c8bedabb30443a510499d58f5e52dbcc5bd120b27e8d62eafc03b74bc39378a9c723da8f78abe086ab5f09c728fce008cb060ae9a803c71894c4d1c319ad37b7cbaab8acb9ed1e595ec238051506798971790e982fa3d22583783966de7ec34448bbfb9f8e88224da15be6a5cd2026c2e1b2a26a6fde12965a9654b38c78b9d3c0c029d460fdbad815849c459baa66498e4b7cccf32316ef8c97ca359e2b69eac66fb9e7cbce468d2de4df511b35c681f99bf43c54034d959bf4f079ae1781fdbc033256496a43e15cf52654c632b600962c8f250d1f353cfb466ddc16cd60812433098c44623159153de7cd2721b349f685c43388a74c2a3d04a8e972ada4199177c61657369d78f907ba26a8934cc29d3029d4415c1101e3a8283e4c48bb2b8639fe60fc67f6a57b1b03fde507f10efcb43683e1ae223851b962370e1f144b74f1f9189e66cb831dc05bbf46e03e93877a50dec40dde5239a0fd5022a15dddd0586c99d7d38a7653a037e758cc83d4effb2f21630bc3c3fe074036447fe6673aa5bf51130ec213af231f02851d7f6778cf2808692871220144d145cdfb4c8c169277faea98e0df92c187ad76637fafc46ec1f030d444e0f5f2370b39a40e90f6871ce3c902952eb123e824872f033255428385449fdd854e97c7f3122a9b3a5cfc14a838cc2da55c92d72441e0b8739de2e3142efb99837d9e3a89d1cf70dcac79f5b4a46638c827c6db093128fe0820e877495a781760057dd56c03333dec87894695b661350b95184a6fdf58425460aba6715185c5af68df4ee630d6410e50927dc7c93db0e4170fcba4a6ff33ecefa4f7489eb522c62a1afd94c52928a6aa2e11c7675c1ae63025d56412ae3126207ce02bbc76bd48cbb967f44abc5349f6d499111b5d019672f2de1accb5c8b4959c0787155b03abc04324812c006f6cb8fe7a414fb0d35951ef6c351fd6690cd17ad40743d28463aa30a9d80385cb8373343bb49ee82eb34f83f63f8660a0a34691bc18c26dbe14dc1a7e454bbd0622c7fe640763736248ee4912b6bae4fdfc778946380b8d2f13f868f8757f369dcf09b5799647e31c6e90b7382717e3ef8ce6c9f8e1a9c145f56194cec51852f0ecbb01e30db6a7cba8e956dd0d17edd3d916dc5aa207aa914dba3667d0a1c2ae107e6c46ba3a31ee9c5a9077e5455369657a18c1f5bf99af7154b63a0495e633beb64d0b483d21f3ad66fcaf2c2ab51ec6a337f5693c2eeef4e3acdbfd8f3e106be53ca72449f889408103d95e32a3425104923b5907dade6cc972b417d84ac28c9da3a0caeb160e1a4b4e9cf7e78e92b920c02a519d1e0c3d98b068e01b9cd8b5422a9ec89b1af08f28254095d3d78e438a3a38ff8668e6ebb3ee50e2b394b15a6539f799d467df13aa308a94622e73a49368ed9f3e5bfcebad75029c5ad2eb00994a21bb219d384c43f8d1902ce40140fef4cedd3f67bcd207fcf4795bc7f43c30d3c3a8fd1b8a9d77d69bf59eb8b59d0f464315f40cb52335debd0650f45b51de7f43efd173548bd852605121ecef3d56d5e0f616cb6463d9a2b2cfb4d88f05f4a5290c4935149bc804b52f71113c96683c3ee9f21458f845d18c31f1f50dbd15ddf96acec14941d96610dce6c61c3ca5d1935e3087f1651cf38fd9b2da65ebb4922b97dcb861128eeefa060d6c1c94b25eb4ef3c96cc3eb171643361e91616435a461fed7b0a924b17d7275f839c32f00bea0970b147f9c5f37fbb79b1acc154aebf7f8b999425b0694ebd57ad499bf181c9399768030aacc258fe74b488716b081e1331849c51316bb734703973443958c8fc0b3b7bf5e8867658ed7237baf8eee89779dc91b95087a72943b8c7a039f97fcd36ac11500bb85e774e6b38e280cb8558cf0202a2905595084ccba54465cc3429b42a718d88c077b602101a9c85469af39b856dc1635e175df5b29aa56f79bc9e0e470b22d24768b1b2f14b5d88b88fe479d7418a6bf994a6d93e2657996a4fa69f824ca49ab5a7e6ebaf498a0dc9eaa7f4981c51fcc0935f619ec6bf862683b0025cc48724839bc1e67aa3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb887908917ef0d33f117b614fd291e3e91736b15150e650db9bdcdb56317f0f5ebe97c938bd691fc91401b42576c606175e0d5c635103612483ad51bb78f33331c93cdae11c6389ee98470e19e2a6e5e0b7af88b5b41bd33c236a1766b265611b14e2cdf91092aa05fab5dfab9ac70bdba097d6b6fe723f88f79d9ce6625811413e24130f3e58e8a5d7c8993903a8f07e9540b6f5a4b8fe917cb242b92d4de MD = 5e82f3d3fe344c0b4c05023e58f9f81efd31c8caed10d535fb800867 Len = 28232 Msg = d0a43de391d492746ecf322acd6e5bd78839495c4b38b51d3d079cb2e22941e0409e75c740b8165c582ad61a67623df5e019f2902b2836af489db1efb60e71b5932d3064049dd5d3d7043efe67623dfbc0a1e030046df6c40e45ce5354d242e61278f422a52cd8bf3485f33c961562d170f99da69eaffd42d5287c46861ebd5b05a84c69ea0c260ab8d47c3ebc24b460384ab158c1975413e66d4230129ae8fcb4e4bda19ce5c79aa81a616aa1363b8e60bca2b035cc021d893da979c1edcdb26655d1328361c4594f7e2b2a0cf400442f76fa14c1f70f4a05c038895bc0746364230f846726242df42961e5c7050a6beea140ee2fc08480a41d77c9a8bae3f8f775ffff10dcef00de428b02981361e9e664fda545ce68a9ac7dee9f7084245a65732a0c462c2eb956f231eb48c30ea85ce8b8a1cccac3ac660726747ac53f6ff6471711d0bee840a461dc079fbf188e9b54f94a8b5b9d711ae4a6b18f263a21f4164e787739257d10b613be64af8785ead149084c2affe0103bf6bc774f1f57a50b58a70345ed58e21a5f78613a647490872e43d5dff0e18f359ffffae7f6f9534bbc083c8b49b961b4479d5c09b642d69d3263ef21795ce0fa28e0df97c5ee44010201e9b34088d6ad53951ec485d9043cddd06298a1394cb119c9f0069620c053b3fcd465dbad892c0bc96f12d920628bb6f2f6ed70601983fb21f3dc707611695660c3482110c25af89f169bbbff37b3453273c8eeb98f975450b1c35cd87e6c73957f041a99c95ea180dd08325ecddb12f6a0d0242df816afbef261602e4e849303d042ce31e5618ed58a0147256a2ca6a746ae19a29a2791d37e5e8760cad83d127daa46be608b4804e62d013c57ce88ae2d0ad501bff384f71c63d6573a91f92a50e3892980035677b935688cdce840711d8a6133ada10f92961857f9e6d64fb30f969f5b8ef24094cbc084fb40a2575aded9c41fac5abb0cb224112f15d0c815836a913bd17f8fc5e3775e72cd2554d0379d06ac06460ecd39300ce210a7ebb8740866b093d3ca71cb02fddac999bf3af27f30c4018c923df2e351f820824004aa1726a41a1579ff490869197d262102d526494ee755cfc4a7e6e75b8b895062ec40d9feb06e25d92631ab1931f2008fa93b5931fec84ccb1ee0d6f199e6a238032b88a69b0655662927cac02d28e749356569578f0e91b8207a27a494bebfefb87f3b832304910e1c8fcef8b8ee5b98434d7fa7e14e26f5755ce15ac23c2df0d1e4f87f92916139c514c0a81b6ce6e4999aa6093eb194e8e52d0cfd6d8576a21604c9812ed44e4fee5ca7b89fcc0f9500f5e365ec5f62fb3895b174dbc4216c5184b57241f6dfb85d0f8b0f89335e13400640a3347f1895353ed6a7541fb7b8480fc438111e9ddddbd6749724cb5cc72174c4ac5e393e1da6cd867e22bebfedc44bffbce7750e242f596b37b7bc90176be87766b2b75dfd51edc6e18ccac1728de06de60a23bcf6233f77d7892e836ce50962ba781efc9cfe44a0b8d96b46b16b77179fc44f2fbc7d30a15fe348bb2f59808c90f799a462777a1beb52c8d51126b803cd5b21eddc06d6f0b80d32c2c68df4fed1784ddcb783383f623f0af6fa854a3b5918c280c086d66cc84f15209b490ebe6343652c03e9261506e85831d452d6c72c435a70cec5db1d78f1195b145776d630a0071cae72eba4bd94db0f085303ad2d241043708a8b0cb13a65fd9b7ed34d1fd75c3520e62ff5708cbb17fc517af743020d830d9e8e405974228e9785cd2c172f8bfec20d9c0e08191fd21913e2ad582779b70cca8dc159e5779470350d7a02f1bc00faaed8f96b812fc6c763e4d553d97b68d7d430989ad58d998d563b3fc76619c131938bbe830c157d6f0728791b613b1dd5841ecc038e8b2458b0ff844ed3c7cbd0825e633604f67f77c855a09a07e25e6ea400657b579abe380aff507f83f1a63d44f8f26eaffd52496e1353b71298b40afa7d6cec77e2ed952de6ab42bdbdd8e2a1037212574f804bc10c995acc84a511503ee83d378a3cd8e25a9d7fc853eb266024ec0a421791e789e57a6b7bcfbbeb6ceae156dfbb3067ef032f1eeddc67704b05673eb87b0b848d49fed368a07e01162a5f1fb79c53ab1c8b68077480d22a284eeb9603a3788996de2e78db2075b918a66b8006562c0c33975122a566b6bbc0a781fa6ab85f606c4c11431b77287c39050c61161043f3fad2f058c7b79a8bdbb62f5234e24970d73caf1c72cc1fb340f04baa2df321c63be14f8f249a07024126ff86aa48bd219f5611ec2647e3c4f60e2e4394274deebc6f76b002388488b99df97e141343db8b413e998012fb192308c01493d34fd446226ba4aab999850cc32422ba6a630664a63e0dc852ef188f850605711fb0dfa0a238516444ce610242885be376a60af22c1a2e4632482b012e0aff7834f7769498e5a17801ac8463bf2d0fd85f9350fd7cd9e642d88db942abd3e8ee3aac03e8ac787b2d19ba56f7e51c27e24cb33e4d3d831c036c462a1ba369aa1c5858ed6585fbc6ccb4804086595c8c47658c3da91821b8d217fbe551bed52b4ab7829cd3cc756c9df987a8d7c6f5244fd4a8b6dbb5baa1f7003554afa51e55c07fb278fa28ef54e81156f7b3d2f0d944be8f0fa9bb56c1ba517bdefc004c0ec5d770e9a1427066f5247696e22554926c4ec7b2dcd3fdff622f56ebff766840a2e7455792c1008a0b596deb2c68293711a9da053ca4b84339c44de381b078d2a0d8b82a934ea7a874d8c560594377af79fa507290d78e758538e82f4a5687ac05d252ca6d916ea876ca055c305d47e4ec67af5fa213887e8fb3af35220f9ab619fc999fe8315c725a57b6477a5fa0bdb41881363801ad449f5c2b5ed183bbd8267f1712cbd77aef68a65f88fff08b2218364d5e1b4805b0fd5be3121e5bf1fa72835489e02acf05e7e0888987b90ffb5fe99c3f139198aaf0d95fbad33f4504462fd76dedd3639d212cbab1da623430d258f541e7846f1bc1fe28bcb6d6bddeeaab2827bb793ea05cb37b68bf9202aab9ace0cc61c891e9b9f1c58290c96470a620cf1d12c569f4e19c561600f1824f5c0ce548470606fe1edbbe7228bf3fa3c2b654b9b95feb83f810d0236328bb0802a18d1d62e5d74038e39cf64861585d859440627aeecc33e83773f8b1dfb5bef4935fb37a0e0b995132e675b657b68739e31b7f1b1a14eefb38c6fbb1bd79577b09e4735728aaf0afef24573b48610a24ca6b7a658dcc9b773c51952d6b0ebddd2ba2c3c0dcbd2c9b43df039fdd62cc8e72baba20ecfc22a56a9d2eeb917cd66222230c7ed24a375d569de3aabdc0b7c1028fa714e2aa6bcdeb312fb5d6cc8c5416efb75ab15cf83d4fe95e249083b204a373a90815e05d37e695fe51e205c5f92e8c2a1922f857835648dcd400b4a49e7ded28c62da5e22a845205875e2f6b9b9384cf86cc283c769544c583b35977d8b7858c14d302e1f0edefab21f25365806d5f0d6858f38f5f316482f9517d12fa7ac33dbbaffd43cf48f457e545789bf0e3a34b866d623886553079fe83255d4ced30a48368a1ee10bdea739d00a6f5351ddaf3a9b47b20332731135af15b401539532733a6f3cbfa7658660fcae55b96448b6c99d4482daecfeeb8d44226a39f85b42f9513fdc2d798c698044c3eb55a803f1e1e76d1483e76f0d1361e8f6e30fadc256f55c6bced4ebc71432eb8ebcaf87d7100421d5a2d44bdc4462f9c8911c0526f8a14569f86bec35996175ce52ed5cdcd06df3449c160dffbcd1a57dc8afe9e77aef9b655e81062b8c3af318cce3eb79afaf61eff43f3dedc928ac850e2dc49a3a2abedc45b6d22f6939f3fc6f15cc440a22ee362fa2440d15f25f6cb6383da5d30d303d629fd8a7bce8f8e7ce0577b27c6308c5c301c8f41fa93e936531bd90c1e19017198e722af3c262797e45665b730a421d42b0252942c7da97afbcbcf173524ee7ff25472fba40d11fd43810859a730a8b135ff1231bd8b3f7da3bc43e83d9dd2e77d6b03c5d0ec54984501ee73f27f2bdd943b56827564b2299316bde6fe2bb59182555c76866af94e34fe9f6fda37b13f90dda6ee1cb10a651200c5794077a065483905778f2f0609569fa2b3270143bf730e8add79194f1869a2e409ca299a4b1940872fb3e486b0f50d7ea9a184e84583f58bb755458a2ce125a1fe65e8ac2b3b916905b9317e2b5770beb70f69a8b90abb30e578dcc388c0b185c1d95cddedf75633636bbdf862c4efe7473b578b034e8702cdaa8700144e6d17b8ee2e357995b46eb08f31fb3d86b283c0ebf79a0c988288d8b3ee4bb8d582df4c6b06bcb75dd5a153ee3490a4e4e2198ae8f1dcba2fd34a6e5ab8ab5c9b1865e51a8b7b9097e154b6506fbe7f25a7320dfaec5af65da4d0f8688e29e8e95532ecc16679ea8aff0f407d898db6922855b0e8901aa9681aa3dca617cb440764cdc7293fbeaf7f585b593c2b0531738e0ade7c8626b9995f4a84d9fc9b593d6bbee01abc53c5be14bf6956fd2fd81000dafc7c768610389b4d56cce4a10dd3938e9e5c883f168f5ac4d894a61294b0a74b73b10740948df535bc4678e4491003c468b6498a883a52f00fbccfb64b9cabe7abe3e25e2fdf96881d0e606cf63ee4e8a8f1a83d050626ce74961f24e61d33360cdaafe7c878a6d1e1ed4341faa35d82c5d54c5f743dfbe370ec3f634e7967bfff5d15e4469e4c956fabc96c3f87971b272adef8bc25fcb96c84d67b69f8700aea36bc5c939ab05e31109bf4ab34b93a36b80511c7064ed7ce278d7521e4769f362b4d5796b4fbb38ee361e128f1ec685a476ab07c2a1cc5ff9d0c585d83a0074c0570de3733551deeeec23b9d05582cfb9eb4e0c3d88c0c68aefa2c051f17c9928bccf75e61e523b9f7670bf1b9240e81868ca68457c633702200fa00fe036d72870aadf384 MD = 4400a4675f4a2f3ea0ba303ecc354da665cae6fa1a30dfe1556d5e39 Len = 29024 Msg = 96e237bb18f47db8f32eabdac743f7901932b8e39b76cb4fae7d35d1265c09414dc18de22a29983803533e1920f4af07d2ac5dbdb4395d0831eb10d846570297895012b96b13d495bac233736a145be6944ad65cbf65f4f35f96718e9bf6522953771069621af8772063d20f2b0bc1d468f46ae7446258b740679f1bac9fc09eb21ecd1997a7ce883e1e6216ee40aa7a54926286cc9751fddc46e4a601bb169eaf2d92f293201c6d1bdc2daf381ddd7f630c0663de6ea76d3c1c865723b31ad3518ca71cddefabd1bf8379039309248d9a4a9ea3024e21ae67cfce5799ed95e2a02454befd7a435a33fd8f3a866c454903357271c09f8969654904ceebd34e76a4dbe1017c2babb07e30b77b9aaf095da5b3caf3a1caa5453f7070e4a2cc0f35669a950ce169ad7ca80639ee5538387188aded512c353eebfc2e5abf453f9ec7ed4aba08b49b0f66ba665cbc42709a2cb50c24b4ea491b02a46a098a5c96c4d541d1961c7e2b9a15bb37690de6bff63733b6b744616e0633400cc66b703849076b197171c5801632b363a808cb8e16390a95ee281b0dc526d6fbd98a088df5047208952e14024b64abd161d67843c0db43901089a08c218271218a10acfd90755e88497cf0190154a969dc9e7548bdc5e58e678e7655e2f016652125e4f0e1013880d483e32dffaab81360894b03d59ef879396027ced017cfafe5f039ceb15107d77f6a74a60e0dddb737bf81decf0f8538cf263b61b2a0a3e71f9a32ffc80cd377925a2cecf625223da7679f3f75bf92b37109387552329bf6174a58ebeedba447557a91677f9b8e8df9aa2d908d572ad26731a8717676bdc2152931fbeb66832f0ff32d807017299075afb438e07e527df8c512bfe7131334615f4795865477170aec889d9340fc2c629fbc9f36dd149c6dedffc66db2a53442132223884e89e78c8e2828aebf0e4a0aa1cb2d571b77170ed3f6eecffb79ab026e480bbafbc087de0097878a3b68d3b3de6b4a0ae183d6239c7f9fd795997fe79743b7e10424e0486b5d24ef5d10ada67d235e18d741c1f47322414b290d9a3ab69b8dc810bdd811f70065a5cd10c22ba77bd14aa4b8c1c97e683cf45edbe242f5d6f736c8945883cb0ab4733270f88984fc0b66f1f1bce9e5d8f99add0d41497a7e5bf2d3b049e4100378223536390a3b2d753465f29b9dd1fbde054eab9e956d1a23c5db19917ded71187a7d6c6cf4f597757ea9c5472d6a5754fc57bbe06ff733b67785d81a968bdefe43b3197990d9c0740a6472a7e1d776c449a347f11f40507cd07bf4ca7712d191457e4647261032dba13fffa20041e094b2d856b8ed6ff9dd9865758b67a9d3394887fac0fec175100be27622d4cf1b2e009ff11d21acb74196ea6444b0786b5e13753dcb5f150f7d10f4de0ea3aab1f8fb9f1f080221101093b3c8dd98a821686ff1175093348a88781e404db6f92a5c6a81e861d9f38eb25768a93d68617dc024a39138e0456e9b0a07a3c955e50cc016ec5410ee4db990aab00f4e67ca08ccfa32b2698f70411d8f570f69c896e18ec8896cfe89551810543303f7df0c49f5b94783cce7df8d76d0b88d155633302d46003711f233339b1c9a8c20164ec8a328890a4932b7d90d92d023b548e4820558f8bd327010929acb8db3b155b90e3f10a151c9b623ae4ca047dc32e6d35e7ec819074a4d14be7329b37f93e475a22f39366032bd49939ac1c6bd7278254c005d0c1c3fcf663e90feb5f8ac0ba90cdd6bf13d6e8d51105fbcf5d05e4605d4f3de7905fb3f2f9a57123a26e5127ed5af6e7af2636e64ad045a7b1cde98997fbf1407c864e5965b322deb1227401b840f097887fbaaaaf3ef6301a9dbb509d4ccc75f6f6408c408881670c358dfa8a1640693021c884a69899f2e803be67e5c83be2901e2f1e029c096704161354fb5162b746db04f6c983ad5aba8e873209d4ac30c87c5e91346447594952b8b36478d41c3cf9e483a066bcf1f29c8a416218a9cb008f73685e87b7b83c69d2885df300f2731cebbd93d8253330cc5c08970ac12be8c5f205d96cd6fe5dc9e566505695f499a28ef74c5e92a8f58c611a01016edde1ce5f1c4d9a21b64e0185bfe42a0f7d112942e3124061cda15b2dd848b32f5b7be71efe1386245a6d9f280771d3ba066a2fabe38e443f0bc4b736d5c6967f2f27ceb64dd3b75b653cf140df81fa322b05042e8b28c0770df03f00951301cab365e3b96df6a443614ca664aabce4045592654f4c7a5b962e84511f98b6abbe92c6b4ace104e358d91d3cf7eb6b57ad1062c182a9eb6c38f8217be84319eab747cabfe53976eb18271f13af34159ba8d616977d260478cbf5383dff36b555414cd26406f9d5221de5c2d8cef7544664212e5573334e17cb903905c8e63161e91c7e5f9684a83eb69fc8eaebb79fde8b8c1a8a296430bfb473b461d9d3e6971b213ef0f87c58879ebf61c889f760ca6b715bb3e43b54d712fa3ae0b6827d6b540594c6c1437e9312cf5df02e294fa0a07b6251582b12f463ae2cf0c3744e652044005f657c72f7df39fe005cefa4d7a6f4dee0d9b5f3ae230a1b20951bd20b0c3712197979ee1c40a9c2677a9d19060b9821f10d5e8f5aed9875debffbb0d374894a8361ee3876d3795b942bc404823abfcbe057a74e810fd3dda98896633505a50a3ba32bfaae24332a24c4f70ff2b0e64d6d3d02a9c71636a31fa37e51c61c04d190d1c5ad18af61ae87faa893ce0a9616c642033983ad4b768f8506150d44334121624db84cd17f693c114b288aa469c8a9fb1b764d118cb89791e01550fabad96bd916b4b13706dacfcd7136af1abbc376ccddd89a0f7509b67e7eeb57cc05faeeaad31afc4c728391739d56a1da16a7cb3bacd8e0d39eba7a9f44ff88149f36185be563748e5ce45fa83201096f04e605cc1b0fb82a546b4278d4da4881010b8760d016c089208d58dfc1be5c4600feb502aae59660409cac9fa1043f8db5fb9a5e25bd46a957ef3b8eeef7010b95625753dee2f211edcf17782bf5c3973886efb858cf9d7b8d7a6639fc339e0c2ca17b44299051bbb6532196e8278b3a032df5e3dbb63b8c1bcf77658c0c99d4414c8f680d664bba34f949706831ece290513b75310987379d4ecd9610ea7b008db402140ced26b9d4020d992e7d6f2d8ab12ef0fb42272a8c8907402d45b7fd3c8881ecaa8d99373e0ddc75ad9298773c9e4ecb9cf891b163fe82f833b6e747083a7d6668d0199ebd9d34aa67f9df5c30a9298998853d88ae2fef32b6a67f6a5b3a5305ca5d1e6ced00a48bd01bca4901322daf7080a10ce59d9a64489ce6c3c008b13f317d1e2e3708baae8880efca28f9f991a77352aa84b813214c22c40fb146069740c89f5f45e5d596f3c1a66c0240ebf4bfc5d90e160ff7de43b08d9ab942c1927ab8288c745883c9a446848b47a7933d2bf09a941415a71fb1cea9f142bf70b541d430126cb153ab0c8800b443ae7ddf7e9c1dd8f969af5a38e5afafd7fca27438954cad7980b3dfbf2eb18390c61a502a20e949506c8f022b9e1522f38ac553c183e49a255722cc1e830d65a97ee733a117636193aea4cc1c4060f73ffa67d86f288e851aa52ee4bd2d7ac7184962fe85f832be4da0bf0c8d752998f7cbf876a3eba0eaa3eb46de1d96804447a61c154b3bddcbe8d30c47f1c4c594b56ff5b30255d2277ba9f90cb256c459d225811c636abaf6efb63b02db87cb571356ee120cef88e7ec51c3f50dd6bd6422482088610d50dbecdab9c1cd66a16c7c31502816113b988083262b929eb21fb27e88cdb68c35f74ab1170929c9fe517a5fba49d08360b5c2be9e24e32768d92d390860f66fe0b593c9b14d832a288278628b0bae9eaecc4d549a557209382cdd284df68340d7b3529537036c1fb69bf0ca50f212cb6c486ae5b941c1bcb6876c9cc7d2ff77815d019416df37133eea9df79a71afa23fb6b5f2697e54aa4a853636e4aabdac843f1b56cf15969d181aca8ac62ec7bb8f93b90b297f9d5a8a82d46742d2602846c62a5dce5aed25d898f0f4727e1d6fd27bee8087aa1e55fd1cb1ae50de69a34f7e99099323bd35f6e1bbb51dd3f347aebbb102f2a25a2508bf788cad434c8604e4f1facbe489560971855d26e4fbcb8aefcb02f8dcd33033f77372a6958b491d85bf91c731d40e86e4e84d3c159973ed9476f118de0c0005314d10db49a884efdd7c6f13801fb7d5a84f15abea5ec94d265f5dc11a873d03196fb7c9d42692025893033f43eeea9c38444724d7ae443031eeb98006b72fa3fc55f7d0c97818eb83bddeb911a42f3111424205622a7d2d239f94e4472e506e769a51be9e2f8201eb37521f6de1fe3adfd396ec1e35cc9a980c605c405f57c9049755b1c6bf65ec0baa1db0bd1ac02fd062c6376062bb1efb9fbc5686cc9e5a12e75478d7aa2d104170923b83d12d76af9a5075ed23d100cad3f9618ee8bc984e050e62557240053945400e56878eb5d9d4b635f91ba7168243b81bcd460aea027ac40ca4aa57316f72a7b7a9b07c43cb9c77e6289ca596be6978d3c67721e5dcb325e659a4db3b309359a5f1ee7ec7016c061500493527dbafac380ece9a023938947df90434794921a677d393feb627cdf120f4840e306690c2971aeedbd5a4859031e74b0b71f5a84eaba34374779b2cc9b899df7956ebc76caf5f4a4fb6ab24c9b0c8ebb8cbe28192aff56f98a1c822e03a44de0ee1d78e0abf50539e5bc99081690258d4dd8c5812f35e9aa3bb5b2ae534a9f25787b68f1d65a2ad200b6c5357c91824d82d4fa6501423375e3ab0bf39262daebbbf15352520aab98d6c1fe7cd6f9ee24b41c8d6da9107d80096655a6c8d4475d3ee500ab27efd0b2ee460b852bafaf3a6a1746402e850ef3354e586efe882ea089c038a35ef0e148d0abb5f7839b0db62c2def87988b30f7f0cbdbf43b65d7df24ebc3e2fdf42584055ac47ae6a552c082c64ee9ef0929b4c045a8df8755894098cc69110fe5e58c14b900b85db5c482f54a2d0f3ce64251302485d8ea408deb6bcdf2d899aa698885323056efb3ad210c2152a0870cc3f6c5d03b876d0c2c09 MD = 1878f939aeb1f29193f9b1b6fa4da7431de33404e3027537df537554 Len = 29816 Msg = 5a8aa485c316e9403aff859fbbdf00219e3b15a21cfe59750f261db2f9be94d1480c3978d80b6b92ba1c5aa134f8275508e9475df93a297d8ceb18e10caa62b1d0ffbae5c1c7db5b16e36e2662312e2ad1bb4ae6ae2f0a902990b667582ab4457bcbf073843081c2d7be89d74e735cc7801be5e443c746d66f7bbfede527d1b5d0d8a3cb2b30a4f08414725cffa4fb549d70e2ffbee82476e515fb1abc87022a588f9a95bdae8d0ca54cf25c7dad51fbb12207e0297ceb9814c63197e4348fcc99569f784391853fc2d0d180d177a7e243991d2f8b6ae46682f72b0b6514c0c21d96781cc4c3d2b16407d76f02e94431db3ceb93ed9a5705b90eaf1f4811dc356cb8ee2a482bbc891259cbd118ea721101753bb556f48ba04175867b94122d4c0c22c94ad8b18df0552e77501c6477aa3eacd33dce60ca5da09278c651fef930873ed1237a3d8b0db4eea192153e9c2319477cd25ec65a6460cf4ca887bf89086573ce5e38b70009b701123f0b6029a41baffe1c0c0e84de0893cccb3f3c25fd2c2887a21a07320be6d0920006b26657ca4c21c5e22090f32145bed4815d153766c7c59827166a3ccac1e97d0f1b9a62b186ad72e8e4c6ca324feb6e530aa0dd9ab750e867caefc3ea3dde5d2d860fed55c669cd25436e8cc3181b3fbf2b0f175160f039e20c0bc9cead3a4869d80b2140721e7ea123cf605d0815efcca8aa0f122a6d33a1c50476ff77c5e8cafad725f9f4942d646e326f8787a3278269b9ea657d8e7fabdb23f1040547e258d4bb2208b29381770adfe1c9fd8b8fea5784d3d2c11cc50838b06365bd88e11b4efe40f616e322e1e11eddabd296ce0b5853f0e25ee0acc1c2f3f3ab094f8b1c51eaa649864bb9aad9378bb66e8c8dee556d691cbc9fdddd6333ca5d50668862c3c57d8c6c95eedbdc7114713a357399371b67094324006402ba0f03f99381f58ed8ec442f87687ad116a0649c592916e4a5122f5c36bc5f86ceeb266e9f1ede986b1cfb37ead0929f6c5618fdbf566d465391186d9cb9d5d9b8864d16520624cbc63538ec85cd2830bc5f14c630a3a4446c0d4ce01fa0cee2c007005973e2cf0d305e84b62208466b4de3e05d74b7c5c53aad511b871952892d97c79fcc59e848f3bf66fd8728f3386909052c533cd7b3039ab1889ccb6ab6495d2b5023147563558166297dd6387f56f90a9995d7e3f510fbf48d255f1d515a82b3d441ba81469fcc0ca2ccba1c285ddc770e0132f073a9f9a094ec7c7442a92de894eef411d918c7e1d03c7ba71cc6dad5f260f5061516bc3f04b7cb75717e8750f6f16a2f040a9b6c1c95c2e141d91aabad7ac82dc39e6b58454ff42ac721b8756314c3e2afbb6f35ec9e36d380dec581a717516e658a2e74bf7c9e9b2ad9e7df441da833c2746cc5a9208084c21c02e047ff3bd0e3222f1ada0571cf83ef3c14ffd5c028257dbaa3bce447fceddcfa4ef7f92c5c25ae93d2feb417cebbabe09efe04b4ccc01e80578baf3444ea66d4551fcfcc1913768525934f35a0b855fb05a7722b247b9fe76a804cef63a202b97d2547c50f96c22b99019f764e6435b4cf64e6ce3a3f47166302811f61fcf8d14d722abc4694d9adb8b06c7fdea69334869c2a4515f26035ca78186c47df8f434d6e3f5cc7f604340a087efb5b65b6a3b1b60437bd7e306e284cd7801c3510380581504a99a58be816729c90ca8be728d91c3d4c3bc900e704e58700e8e5c3d7fe142331c488b6f0645490e635ff6eeb85359d2d96bd17c8e6abf097b3d7f049bf8d82b75186cc747c1720a6a3a993153d69eb82d641bf3a5606d9eb86f3dfb5d05633844789179ee72415781d719ece8a20f1f2043c3e65dd5e0ba46821d844bad5fe41ae78dd942ce23603aa3fd63df2c275262698dd70021b4f6b6249221e0474ad968e3a677ed3b84df052fb848bffb740c6473ce4834ea56be87b53066a369a062af0b9fd85641020e61d8df0df39681a796c109bc8486527c2bb27cc51d9aed3a6dbdce7d16851798e14dd6262273bcae79ffc496478c14da12aadbcfa741adab1588b6c8967e21e903ed4223c51991ab9e7e838826622a32fd1ce1d8d8f45e4f46eaed5d5e72dd793a45877943febd0974dbcae489bf1f311b7703934b297b817252e6ade72996e3f4c52ab927a97b528d760f4de9e9403f2e47c5615667820c185f173cc8f8ea93e40ab0460890791158fbc526df7759b7861dbbd583250e29a97e038c7c77452358849cb23f4a12c057db90f1d2ffa854b3573b6269f87c74b62e301f6a0b42fcf2a16470644cf4da1a83d7515cd8d8814682e88a73485977ceee31581a4b409b230f9c22e00f8be911831ca7e59956b7b03f37d0279b31ad444c6bd915bdda786a1d982c6b083457cd57e577f5b7af7270da9db60f67717fc6b76414e4c97d3f486a0d0f4dcdaab0be80a64415ca3f4c18e3aebe8343a589c6bd9e9dfff4b53a3e635f4e00d64b7e558bf39ece47a2af08f8df5c3ba65a35b4dd9fc6cfc5ff03dc98036b4ca8933b22d841da77966605d168a4118105ec1e1185dc41fcc3d72673869de959cb1e51c6f405a9aa5cf60b02e191610bf8f7ad7d44c871ef64ba1cb39d833ad0a4497c927dd36eeef1df090dc22bed34e5e95e58a908e9102f34511d7b57e249caa0f615d42facbdfb9d9a52a8d7f884535dcb2411021a1789c25e117e80722da4c168d1757ed58fe09e2981f42a2572d7b15e701b48875e1ad0ae1035916ce4d9073f55f0459bed376d511c32a6e698c98092bd2640a37c590bcbca2f1f3507cdff0403c318424e76979b71f2b2de6edf48027bd08f00caaac0318fc96e6d1efa25316b7c6b7b3c04895333a2e25f6d5f74283c988831e1a69a79e1a3136792f3f6521d6ab3a93e87cf22c1d1ca0bfce0916e6ffcc08959c2f6ff503ab2c6fc320ee06a3c955ebe76e584bcedbe46c5f92c5f865bdca99b96624c5bfea10dc33abb670260650e343858e385755392311fa186206411050f7768eb857d82ae7084a8405664b72a586285e9abf70e90c6aa9d4cce74121e5e1c87574d25cc1b9c964216d6b81055637c18e1a0f163b51f407c4dd12a6467efcc2a1a1385d1e79fe6056513d8e4f21dfb7e75f4e2e7617377daf3e8e56c744d2cddae892c58a5030a8e959e55c992c0572311284a0e389ba715c97633bec5eea52e7f1e77b4b66e6a3a22c6ad12a9f315a34daba54cacc054c948f9a3cfdf4ccb791633f67a9e2a8b94b73d4d74ca3ecd7b760f731730ba0771fce394041300166a0e6a271eeecfe52aad52b554560bc51844b4321256c1458c5fd4b31013810c5dc24198160ae71d689fb78325efd2c306144a60c2917e7594ec4d5f68534813e0cc2ab7f494d88adae8cc358dfa2c1dc17f329d8c835a4e181cae177154ddd37fa6b6153eff4cc40e13112ae107905bd6effd36e47eed05727b8769cf9aaaa1a6cc541e59bc9c3f5ec926f1c38a77f3b2d11adb6f169f52508359d4d7875734e2b78561d94f4f7359656e18aa157b7bf1ed0bd980dcf9ab2ecea5d72dbd3bd3bff2da5e4249ef069a62671e091af36af07e50dfde24748669b7ebef36bee1249af8c382091ef34f7e5a9250651d78375b1f7a5cbb9fa86a9dc9ac8b86deef9e0053c16bb240e4d491b8807e529f82677e4af8becda10dce379e684a92cfbfb68c7e6479b2524c3c50f6a1f63603aa81f67b5c9468db0d27c3809f9afef3b9f49be31d4aadc581cd58bf8736940c490d404b067c31a02f1dce2ac2fb0fdd96debb2c6c4ce90d3e2e055da0ee00fbf66fd81486b4ac82fc06c3f762f959ffbedb76b4c1ff18bbc9c4e36b7f5ae1652b304a726dfc2e15fc892161000471dcaa813b06cedfa133cd386f63732bd9da6fd503ef2ca15abb98fb73021aaadbf6d25684ace37d1717b0ef25d03cbf3ece2cf490e53352a6f669f44565236aecd0cec1f0219055eeda0d5f933c3cb3a4a2fae57def227e9748e809f4e4bab348ed1869e9ef55d89ced4b0033f1e377901b524e27877a83a0457b832e0b311264be27a4fe60c493a5e3e28784abd1998579bb852a289c00565ecd164d633716b4c675099a403d059e307c4c11c48787e950af30f25d07832e073539cf772d2edd98991e39e85facea6560d447d665d1502295b81c9f6d7a9bd15c4440a193c933a6fc4979d38d081ef548a6a35bfcf44e8217a1155a0e65344f9aec3d8cfb745b643711c69c4595a0628c39b0bfcd6f38d19d8259378ac16bd489881293d4ceb962a20dacad29e4232fc4040c9c57a0a3a3afb27492631db6f290be6c40a026e234e5a39880aa51fbcf58abf35c1c47237ac6d7d40527d8ba3c58e5a73dfe2b4a2d7a6a16a1378dbec3d28821899bb11cc96b69140a3990ca143a945fc64f2a65eed8d7a3a961f5c0afca2ef39f568d041205cc911c18c48b1cce40f28403c2c9eb6962cbe3aa08c5e598170627bd197dd74e98f7a555e251b88c820bf1cc82fa95d491fbfa80551307d4b6c59d6004feab7e54a4407178d269edce0899f9c95c8082ebb04875695c7908b4be7acfddeae14d661377ec0671b37a8b84e72c24843e0ce695780993f6cb9c674d4a6ce2e72b1463e1b63619b427ab50ed53c422e620cb08f7e3bd83767208651e86b7d267db6bc48b85d0010e3908a4be7a622316db45c97425f1a6500ee5249eba412ad194cc1e7d615a7b046a0b0d84c586c38ab025be76b9468b17f4bb3c4a4f893ad8c9bdc833c325d62b3d3ad1bccf9282a651c34e9c184c9032b5e302adc100a0d1fca9584b35d2b0e71510b7e2e315cf1e32a6f030cd545434d5051e45b937eb51a017453033e179cc94151683caa12746d55959f132fe4592d489e58e92af88cc56a0256f47c2cf503cb0841bc09519b4bc42d249f3baf2d136fa0ef4e7d7f7c672ac6f64dc06fff6719b77077f9224ec4a1bffa78a0ada747edde1151331b6d4a6c489bd8b1eaa33c50e65f35208b752111d3896607e6b010e9e027bcf4d445b45611ae5bf8a4cacc9b1e75be2697f8ab3ef2383118632eb88b2f97556ab3edee10a8959f3ca55a5d20e51ad9b44bbfa750a371a07a2b0b85fd52cbe53bbf4d40c395ba6c26f63d3807c6b65072b1b3606f6f9c7cd6462dc064d129330f014df19761838a5e9e59a57946b1e907d0ba1dc1dd1f8dd3bd7eb0eb351b098f7fd64bb3935ac08ba598eb9eef746d1cb0bd257175639b1a97e49fb705082d6243ce94 MD = 77236761950d47b374cd31f3ac68d5347092a37b63e84c3e1639bc59 Len = 30608 Msg = 513a52c2b8b80276937cef3dcf54046d3b6325638c165a1aa45930fc140a5cf7dfada2d48162f5c42f15e03c61f524038e27a38a36bb7c7b26df7894f852a5b6d91c40398f7dd883ba23b1d9599f6774911ad3d8aa4432615b8e841f479933e4c7eef59aeaeff3daba0e2bbbc13c13e8cca47ff6ef9ac4f4c9ce1e4309c64fa8318b899f9ba28ef2b93d168ba0b37186c82e6d8b0da37a5bfa080ca847c1412aa05bc4efa97cf1f33e1a3af0ffecc9770c1e66400d499cbf76a217f7097251939cc66e331c676404d20c5e93e5cf63e320de32bdf6737147c30607d855c1c70bab344e12fc4a2e4dfc7b4c1b5a4486f18dd499a9d009421c6b9aa4f23596eab9570d2d35520c98f744cfca3167337bc9da6a63aca4f25765f6c8b6eeb0d903c627b9d3432597ea2a3271a17d12848b948f07576f7918f84beaf70473ce725a59a3a008e57ed26c0d4fc799a6651ffb7a35123f9a57626df6d18e572a9849379b542a94c364a565c9223a795568ec16a253f5e1d546b8fd8d32f777bb1546e2b4c1c03e84dff81f8533330b3122d42335711705c64f02f23896992ccd4e52a2cb73c8cfd1f7b3e06a0b1815e39bbd695a17e075187928922184dc3e084953c108f0ac1051b5bff1a031526012db91313aceb8f871cd13266d8428741610338594c2d2c6ad20029a4e2d4ab467eb36c3fc1d07557a51a9f5471ee5979cabd8379770a4bc8c4165229d8867d88ad29667ca8d3555da0fd349d5db7b6f45202c1e388388b9971ed0d3b4c9109622989765c9a5aac0390f7a683f4253c4b6791584a082e88476c12cf3bc78afb4d746230423edcf5e4158849baedcd35e9abe7daff7f52be6d0325fcbdc1eabfb53e2218e00ed0af698f1db2a4a2f640597f54be86465b9a74d7753a33d426c333b777849872ec452e6e5655d3ac56f80552867770f59fa8f969aeec3066c5a243a0a127ee1376638d4390c7ca7265a987d5eb8a42159566553a31a726024dd95f6a5d6743590567109f7b6ceb8d88e15b7a028b7c2ed35f32b98bef973f35d50174fac75acc2fec52e274d9c966574bfaaf59ef7199effffc783c2a06660421b46117cc76e54c5fbebcfb82e6855735dff6503ae4ff31c52cf6b0daf61f4f4bf2bf22eb3a2ce12dde7f9dfcc572ef2b95ef83d228b75f4b4ea59896e8e35db046dfaab8171b94f31cbacaabe8b7a5b996db7359bf6aaefedc0541d2513ad5fb1b431d979029be3c03ef1014b2bc015c6d7a9d363b81c76c4fa64b11b18e4e990aaa0a1e37eff3652e9cfccbd5f89880842d600c1f853ef0240912e99c661df67f54eeb060c6ab0af744ef35a515c1c265747a2fcded6c46f39e47ae744acabff3d43a02bd566b99e86765e6b26c139eabd03a25d942d5bd38e647e4dbb4db3202b88a69a007ab9e8c750f6370940471a1c12e92c3fe01ef6e71a221353cc61916624e79bb62f1855e1e3a1082062ae7f1e7d5eb10a7773a0ea0c4f8033b21c1c971f4a761f0b3ead7937482493aed6e1694be8331b7bc4984244ebdd84874b876682b672629893b83a55d4d48bad2808a58471fc9a7478a795cadf726dd1589b7a5415d8a85e803ec9442b6030e50abb7b31e052b0e8f7958ca41487171aaa207c9d4ef018e46b06d10c3710a9e0e5c492591d7e8561a92acedc7164aae9a9de13654902dbb2bdd9f8b6de2c1f2622e994040fc74066f62d047add514dc7bd9de8b5ee561850df7fe6490afbb93d27f3263aa07709804668d5844295283b4e24a3942534f84737c044cda2c6a0af5ea9f204b7d50a3501a1ea04877964cdc43ceb0bd6e3a31d2f64ba4b8ed5fb042dd5a0693c2868108fa1ea019445290587ad6821e9ac405d2e32efc9b670f3c2fe3dd87218b94e9658307e8451419e6cff3fc3de46d7f78c9bf38c5202dfb07338aa412631d0e251c5154e94a6b4ec8995b9a44ad5acf234e06f38eb5a69599e43e5838d70b44cc83c1a01397be83ae4afe5b26e7f7256dc646e9c9ea65816cc87b347afbdafb58326053f7bb823b106b78996512a734e0d8fb86072cef211846cdf35950107450bec9fb26345ae7976136ef8fbbff5ff4ec9142b70ba806f4e5a2ff446220523e7f4b000f80ad1b9bc2d5c7e75274194277a4ca59e52495bb2b96d2dca0af1789fa800d143efd39a616b1bd3c6489f33200a2677067f97fb39f15f872a9f136bbc6f56ce4addfe43ec37729df60c5605c2e26b49b027b0776a6aceab6dcbb225c5b07c9e17ba98dce5f82a850e5ab0319468e3c2a233ddf8ce8c81409b7518cd42d538eab270ea8fd5150b321519f3df1f05558be68c66a6ebc042efbd858b8cbb45535a21e53c8243f8dd4d13336839e9218a4c841893a84c6cd760d9e2548ab96895956e03d6ddb708687d118f57647c254bac82c1ac2776fa093afa76bbeec3a6c544a1b0ffc9b9ad746b1515088b60775e53ea6ef84af3d0a025252807e16267ad0ec0d6006ed24fc8be2aadc2d41b818beac407c03a495864cb64e0828a1d13139cd55c21f389562d1f553fcf6737aa9c1916734c1e03f81dd1be8672127c12c095e72aaa80672b6b36a0b3756d3c595787ea9ce41fa61a92e23c0320a007cc7ca2ff28e33ff3344aaa12f1fd0eb0f886dd4769d065bc258ca4e43dd45d47aa0e6b243e1456b5da9224b3e2af711deeefc236c25717cd81d3bfc01dd670c31240975e5484ed35850a4b8c6cd2bf0aa35bdfbd8fc35d5f952fdcd88b6d02036dd8cfb5527c2dfc9e7bc8a478b01f007f91dce7b85a60fccb68a33270e23b90249fba3220443d918bad4204ef8fba86ea5b60b92665482b8a45bbd8b27d42f19d5d01dca624467cb66862b2b7b8b8244c7f133dbf2b3d753b8fcdd23b8640ae42da4bbccd6470468574d0b8ba7340620dc69e7a6cf66660440e8026f1455c507add41d87b4be2766298331ede077ac995f8a978160ceb760e8a7ddebe02bf5eac308b3a9922c594b49d33ea0dbe8fe04cdddb40a3b6f53f01cb6b02890490604299d0ea10314028e34c79262edea72f9b3cddd9fd3cac428598f3983a94f8dfa3e1b8eec6c07cbb576badd929b0e93fe8df564b0ae6370703bbbdaab8fa1f6237d0ed50a517a1d477c2770ce67c7e979c8cef9fb4fcbe16e1fa703fed7e2c71662d1418947ed6fcad1b7dc64c8a8ec0200c50dce1c56bf8891eb460c068489498c2d84c7a3c43ba613c6a0f45214040db27200a7b8a643461ef331419ff9a543555def6419a1196f9eee4efb98abca134a408326993d152d3349263e08c4b38a5afd11dd0e06818def9936f8e0e2b6a954daf5a9328dbda46b77c55fd5782c9509857ca0f566fc978252196adf3b52465e8be8de191aa55223e97f359a8688d9fd71804e6434f302f3a336dfe8181560b3edcd03b15654bce928b44dac7250ef836bed33df12fd66cff74fa6902b888f117b22d89fe3442b47b015069fbe0d4c47bee3ffca63841953d8947d7bc81437e3be7abb39240c43bc0a120ef8ec1656c6f52510bab92fb14bc1d5c2ef8050d1a712452a11ab158cb2b12bb52c6f14b56da92105248648c4f44d63f58fe6b712d82112b3cddaf87cc82fd297cec980eec845685bac4d67ab09d5cfa3b16dcf41f37553d6a2561d7a68e09735347dd34953445b62969124f9d8e5895c1888020595699911438efd2c217dfa0c121e947b8b407ad887d3d9280e17216d19b7e7c41a7842d235f820086e526b8adc0e4cfbfca4572c04982ccc05c51875299ff9040f4bf1b7de242e85bbf87c4fe6df552113fa70bb7150784c5c89eef2ec82ae5bf03f1630c095612aa6eaacb9e70445a16dad4825729f442f7ec00574c712802249dc30bb61ce606d9bb36d57411fa6e366575df87cc728fbe9220c694db206fd88add1d65621c4d526bd4eb68983f17d9a631282e47a9f18280a544ee503bb54492e6a000241e6e7b492b13624c3adb6767b16736e2c0f2ab7f38da4216a15bcf7d879d6faa14f1be1ce4574a771445486e9ca386e5df1aa157818e787679e9e012671b9a3c275f82aba6bf085ff4dae4839be5069830f0ccd0276a78b8ebe8e11a2f2269227e3e2ebf1a52854c0324a47056349e43d8fc95b2d3762a2421df395e86bbc4a343192c20e718a78869aaeefc7498362d02c662c42cb97702405650a315ec93099b75e396b619575a4df42bee9e19b69fd4d79ccfdb3b459973d58eb483bfbe9ab0dcbbe92f5e7e09d78bc40f7bc006e176b6ac9b87047e32e0e55b58793c2d9faad51ce0f9ee02de31f61f27b4940f3b11ebf8f0d91d0815af0d1f569f6ac85fb1e96e45bdd1cd2180bda6fef09db7f5cdffea96798dcd8a09d642779c517824eb9e19de2210c51aef69c05bd8e4e756d179e9540e5cb3d916c72c8319f92334837f8574d1b2d410a381d407137088a746e15cf44092a449fd684542bd6bb2d89f111bce71bfe14dc78d4ccb4a4a803153c0ad3cb9388723e741f67b31ae0e5868de41b6ab40d31781158f6d2578b939219c43f51e5643b0fbdba5f81cca1dfc056d60f2273c94b7f9a205b54b04190ad80086e71af2c23562bdbc7f27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb9f71ded95316ebfd436fa1d9faaff9cf5df22a8983c52098c6e92a5b1a54f3239e79b39471c9a64fc77abece3c87958e68f8a574b363bb6a6ab3a94913283bfbfe9f6de11d14db721565792595588491e7e0b9d3c59cc4316da1fbfdf8794cbbe76b7486fffd72af57b83ca8af2bb0200333cd7060792336f73b883f70500dab8066314bbe8f544eb2fc6e1d2f070083e3774b112d00c1c12e0ab9d923b46612f2170afa02cf679750b8764dc0f55c01b1379a7fd33b84193d95f491baad3f3a6407685975c794d15974be0008fcace492f82282fb3255884a64a231dd438069ffbcb432bd7ec446f5b8adfdaf24d872b0444be14dec1d547e002c7f337f12e8ebc0544b82fcdd3c4a0dab0e5e75c9f433a27d667071c2c600f0f8446568dbff4f9bb26c6d4ac8fc83fa20f9bdf865b1439b20d70dc92e26f9bc70471a06c4f553d3345f256f6ecec608748773b495f306b69cfdcbfd47bc90edfb52fb62b51421f244eb5373b6f93bbd108029b14200a77b59a05313f7cfee0a002bb08397a2de8049d79f5f87c70ca45aac86f852224c72c0884c1624a93a9be99be07250e8b503abecb03acb7e5e42bbd33390af9e1e24377c5f0bb8909d291d6a3335ca2ecc05d1f22f0c69675c219cbcd7813fbf4418274634fc9acd3f3b046053d6ebbc4b0d25b1c3dd49ca2bc863301bd4eccce6d6f9ac72f0b2a847590645e55c9dd95ba40ef015b653eff6bf7af7a7909c0c2ee71377c2f0e868dd0b8be094d0c7ce2450f479cd9e6f1de38f47 MD = 1796669a13a3a820a69a2b7f4206d71406dba0d8ef397ede6d00823c Len = 31400 Msg = 1edcfff2ba6d61ce5e16e8f4fa58208f9b5aa69ae38b3ba3b78917ce37427f1cf3599aed5bcb81c478d2954bda091597d2d1f0ace1f4d7446f8997ccc018a6b025fefbd86f122373a98892f307163758195653b2446c8ae173e83ba00aee0dc21c94cabadd8b71615a0286f467c7ad5cd9af77b3f6397c032a6eaa51fc0bdcda3fe2ae9c8d7e9018f1061a57e463a02b7ba505b7dea3d431fce28ce77db93c80f8b250856732ab20d85df6236534374b6500a5c7e4f4bbf4510e8b6b773e553dafca587d53f1e8ff75cfc160d1809b460188fee9f07258d391b84de4d1e34e98caf36d8d39016f3f322323161290f3a4b605b927ea67d45624a97a5a73f04f1ab2f537bb01ab69677623c64e0fac68ebeb3e7d89ba19560573a9bbd545ad8249cf9860119337fe00a8954f10b01c22a50afcf31649d10769e480b85e2e610db089a48d97d7ed559132426962dd2748597a07c3d67dd60e09e0f518fc195618d449e06854b61597a27bf2ba4e7e160290a32794d13f72946dd0d183b8ebd2cc3f7515995016f6ebbceb6ceadb7b317ad1ed240e1078ebc11e1adca3998d1e5078770bc893e1d97a66ea7aa211bcc0d5a4c0c5da9a0e8abca328de1da7e782cd07b58a9c26fd066c28e0e28af92a0b3e9184d3a077eb97ae84609f9ceae1456b75995abd1054c5e88a356d499aab5adb21a11707b0f55abe4a2ce6c66b64b151488942d459cc5e161551e388fd28f4d4db7f56b84c161a157cf37d4331560ca80bef0c890a4f181f509d0cee288a225248865b5b533521daa21c2abc44a19f9743327e8329c43d2bc37fb02425b72c7dee1fed97ce39b5364511b6d9ad2bb2477aba616bc1121361f76096d1fc995a7c57b0d314c40c1f51ec39e94173de8de037ef7ce8d723e3ea73a9879eb317f3780ba3d67b3d95a7521ffc8a9d9ea07789033999a375def4eebfc04b3254184198905ebe7441bc946266c26394375bba6a65007e43a22b9094640faa37e6868a05704b53a6d96930a84af33acf44f69cace5acf47167f2fd04e9fc6c52724817e633d05cba0c84c14d52f7d8f5d05966770ba5c3d5cb1b8467d6f1582dff4630645f57a357e3f59078073705afe06c5ff26053b316d68f6de5b455377095681da77e47ee2664a4e552ef1988a57e17d1466b1f8cdd903400a50a90d1c33c9625d6170806cf997a080394062b7eb142029ab46f15d102f385d0600aeeccfdb89119b302b3f98a5d40b27e67b4e382d53b17c4ac179b33b5438d3f2a5636dfb6a99ad99dbc4c3e36d68733a2ec7bf7b8c4e5223f5be22b6083052d5ad0a7eb78b57e1141eb72bdee12ab3d219bef1bd3e52b568ea64ff3dd8d5fb40226c728e6fdf0e45606100f6b3c46244a89e6f30ee612e903c38a9215a9c45c881e409ee9c916d844d6d13d979c7f6e877d0989520ec16205783a10ef1f5cac5581b7556760187773235a4d597a7fa53f4100e485a76049fb8f077652364e2cd116d756490b1f494bb5564a981d6e50d99b720c91f719274fce9bcb2837c36464a745a8781253d535536b393ece73f8bf54070a5c47128368fe9b17586ae2dd77faac53dbbddba397c7412432d5b624583468e5d0de73e5aee7b262ca17d41e70d9b2605953df3bdad781125c7a605c0c023da5d40665d5895086b56686c0afb90affd6dc1e8926674cd30ca405992943882d534f0510dc6102bf1714ffcf19b8553cbd4b64ffeba5edde19f2bd8811658ce1f52b249b819ec60691bcc929e3d784111d8d6e6912fb844b412eeb569edad701964fab2e4da862032a462df5957d5d25ff8c84f023d3d7c18c40d72a580b31343ba3e2f3c7e89e5dea9a735cb811aa216a2feebca794b0e90310c92dc65e6122ee0f100f77c444bcd9a0e385d3fd31ac675ef3f426a5d56bad870987703c3174b67b7fade5a51aca0041c4986ea8bb6ffd01dcc026700eee938bde5fde0e67d29ccf75f39af4ea2c666360bf117a0f123401f149315c251abb0592dd993acce3a6f33b091d177a8d13effd2045dbf73c14447ab7ced1e0992fde6b2b282a2850decf1918f678929310cee4e391333995a6b3bf3286370910f7fcb26e134443c04c4c5648ae7dfce664e65d317eea9ec6f13608e1dff7662a1949aed1e3f2e4dcf7503cc0cc907f2f1721af329368ee77fdb69cec6377c08d9faca9791f9bd54ce7c411a9d818e2163266240d5816f14fd319c47c9a20dee1900ce9914fa6dcb724911e2a5a7dee42bc9c02eb555a6ef77a49c8b90b5a8acff553b73ffb7dc2c6b79dab6cdb266b5cbdad92f3139d2f17fa2cf0ca3e8e8afed5685babac874e20a7d20097e37d210b3e801c4e1948fa565cac83d7bb22a71838331dffe92c4a6dfc1764d2f8e9d7f845fde823efc1985ca7b0cb0a0b80a9c2279c45603bd47c57be532145a4d257cbdd0c3d9b1e72d1d2e31f0e89b50e58a6a88b1af829e7ae84f6707d196ea0672b0b9565de2dc16c6019e3957c41367c6cc6e8e5ef3bcda69cac55c176debcd0c0d980a613a41833ad50e3a80c375fdcbc869bee6df9ef2d48e6ea34837d8c59334eb549620cdeec6290078f6020f0413cf28c7d99ecb30a30ae172069d279cc2c721d95f4eb7b6026e13791a28453739711a4da9b9b8207fb0bc4cb4f66ecf0524e9ed4f1cc5757a24c5bf7f7e9ef3a73ebc94d9c8ec5ea5106d97e5ebf4b8c4ee9214c8134da997ed85b0a89d92c5e7989e41dc44ee27cdca53e81be67ff69c74c8f47caad6ced618e1f0f80db72a650f2de933a62438541f2dc1c96e6714f667dce0bf7be751cf3749051047829dba02e9df727524ecd2bf599970ec20805d386c8e02ef05defdd9594173b36b9c513460b91b2a76d1b40b55e3950852b55b56e631097c98c2bc7f614a850a08b2c4f410fa804e80738283a144c81b64405b53e89e25cd36a9b58a1f94d693b05d8fc279085449d83ed8c8ca116ccdebade7afd219da2966006399d294eaf919091c30178719b4f4b0014b4efe05784f5a8adb3138a9499d43312f28ef34929951e4cd6aeb23185c63967b9e4f14a305d2bf56947f157642feb8aa90f845f8b7a483eae1a902dc75c622ea36a93ce6b5a2efb26a41a167fdaf649c893481b40a9d74191a455b79d7541107a680c0bbb547b66f2144cf7733b1cf85a0488a3cf8893ff883447f99079a0b647c5a528abb3d8dfd57fd022c6bc253f64498c1fc081431d9ab2b01827d045c7126ba64dc0df0e0ed8cbefc003c4d8c5f04a9cb89cfab146d006d63febe3f8ece14157a48440e59a02e1eef9afbafe3305ef0095e95da32030180294621883cdbe2fff527e3e242c5ca918f454085f30ac20ffe03211e253c5d07b3f16d8ad11b01de8823642956bec0bb4da7915c365ecc5e2befc7e368894178b698f8c3d61c0f3585a35b2fe00bcf009d2a749f279cdc6f259d10c6667a7d3783a539afc64f499980202f82892d43e6005650cb315570b74d938233c9705ee8bd9ec6cb2c356f8f0a3257adbca3adf019b3bc6d0e1937cb366ba2b7ec1b64e0c6fe2682625eef6a76527a2de50f8b934bbb1df0f848802f626de8cf58cc3dd4323bbf82233c27c076f8fd7fbcb16b6418d50bf39a73e8384442cae69a13381771e01836c95dd7356eae580f8e39abd6f3a9fcf16f1bee8a6e62cfaa2a70e24f2873b71cdf244c1ddfdb2079e418eb508ea27756d0b0f1aa43567d667475cadfa87f2290df20150e4d17cd3b58df98852c46e1a079c3900c65864ab81292604d846ad15f43e1a06b38dce4c056ee41d96f1fe27ad4d45815477abe2b9f47411d4ebf49c4a7e9acd915a2dda558d565c1b995f0225c63a8795bcc5e1d5504cbc359f4f26d659868cc86023e56f92572d2be2171537ae20f9d24d39129de7b8ed4589471b6178e82b9ec637d51924ef780cf7b0c7adae00be53528fdcdb5ebf8c4ad263e4b383c7915cb5f2121ceb272507feb27f4e6de1c060f450a6556069818da12ce794212ca84954da044091061c6420a3a7e194cbe6415a03dad493bfb4561f298dccfa1e57afcc79144cbb95466b840da62fcac6183dae30df209fc80ded73e23e22b7a586d44457a80a13db89645377e400b8db3e9d155f1d012d8d7599c7df636000c91d01e5fa2a4041e0ce96b46ac91b051141aab919fc3fe514d2a340a9624c7c93057ed7ec00b7edacfe4ad06dbd4a5a7107a9c2e5e4a16e670e5308c7a5afd40a249341b59437be48ffc8ce0828535f0179e5584c3df1718e0ff147c19250b03763884bdb4c885cbbbb58d7c372ffbbcb7fa5a1d56ff5958fbfc5242093f9b620aaa41fe89271700d18421327031617d70230c808e27683740417c86a0f7091cfe231e264cdbba24600cda9bb43601a2be8cff36dfe3be245c82e5b2a6e7ee74cf175bfd5642e996f5a42c2079ba56dd11bca4b8d2c0e5b08f25304e517eb619dc1b9dcc5c192fe900ee9859471acb7d18169f7efd2b596c76aceeb25747fa6cc394461bb4baf78af030a1be92e3ea13104f41f1b5af93a8918e73971ec025fe1406077406a4db0d623edab8f3b23d3fb8bb2ed9a2aa2ef57e4e61652e73b33e2c05346db86334d0c55da5e0cfe23f437fdec87f3ac785f38b612a94fcdf3cbd9a066f514072af85a81185ceae105aceb44ea15ae4643303476b41bf007f2cecdc8e1ac7356fa59c68ff0ccb04b93a52147f4c05462ca0a530c1493bdfb00e5c71f0c9581d96b175b68aad6e7a49384e0ee52af6c67d6969e607a3a3f12e5b8ce8f2ed5c5f944db1ef28ea41653cef431214b0c7ebd2f7b1c5a2e38fdb468eeea009197c71e4f4c1916e35bc5c20c9b1ac828fc12cc9d62d5e377b47f4a532f23587b0110b1521353bdf3267d581521a6cb32a9b1fbe8f3d2e19fd64e3a6c258280353b271816d7d4cd042bc47db02fda12ae3be2b4d7d51a3eecc8f1ee7c760e60076e94bd6341a5305f922599a76dc086e7da2e5f33b1b5e0a7aff0cc4acad0e038c2e00601f9cdcc4c842514c0825f0d24ac1c62c42eacb117b6d43ea0cacee9125e925db7a6548b12294e57c417bf90acdc342652f50697860224ab441d1261db6b32294ef04353fba827c87ad3e9f8c890fe13a5adcb7c3abe687bff6ca432dc1049d28f81a10e4d2938d0ac5fe42bc0f1039284ff04477c102915995f8a425d765ec03ffe76a351d60ad82062b813dc26ca09b993b8e09420ede3da9dce7ba6c4f95a2912cafa4fd524469f856e976457dbe10a10ef2fca173f4c8acf78c3fe23a20a1463a6fb8f4e0e83f1700d9e9faebf83401fb11b661da4b8709c8e04afbbe238c799118e586a51f8deca9d12d650fd552367078eaf59a68f55ad1a25ffb3404a0b5d149bf450740c2e3b27da51681dc17a91f870eef4cc3a01a9230e373445a9a857b60aa92aff26a86db1de581ca82e0f448da76c169e1f3c39b2a79e6577bd662effc3c01d7bb01605460633942504a829cd1c6ee5a5a7ce05ced87e6f61ee0d8af7ae80536f113eaeeb3a29f91caa0ee7c0b7 MD = a211e5d1e24dd8b638dcc0879d6dc5a84cb3cea92028e9fdaf487539 Len = 32192 Msg = 7e00aa080c127cbabfdfa5d9d9728c7b25358aecd26f5850810cc38a9d9da75deb9f1ad16200e8d93cdf40324d94ac8e94f046f210c52a5dd4a927aa5ef8bab725183cc771015a256ffcc60b85aa2cc1e34968095b33f6bb72a7a9adb7cca0d553f377b2e21dbae781bd9f2a28bff45c3bc856f95bc0a4b3828eb35a4f2243ff9eb932595c5cf0689aaa3357dfd8eca7c3f6798ab9741c8d2de4ac7acf018a7d2ef1d78588c7e4ede04cea5c52fffceaa45a39841d5746919a33fcd5de725d962a23cdfe0d657fc17e2a2d00283b0c6c057dffae2e720a07f2020a33257ca494bad87c8c953fa72b9acd620a0a9504760fe531d195cc51365cda405c4b2747bd08964cf7c55b45725dbbf3439f13cc50e91c39b5fa6d016701420517f97b2f5a39e8a50647c342dfee7e467390c04c42bdaa7d22035e04e208c2c12ed78142b27853ef83c37f84ba759ec56284a16d94b01567e05ba640ef9ae2dd678c40690feb619234e095f54b1ca1d6d724c0158dece75db6a84d9fd6df2bbf8bc1c08db7ba99f6e1470f7cd90911e39b18242d7699a7c96e935c08defe24d0621d0a94f30e838354a0f400ae6475537707d59e97dede12cec3da6250205678b34925680b0fa8a254924d6b1056568e3099dc4e38e413a09fe1cf97746c472048ec19ef47e48fb9a8c521a448073bfc91774027a1d3cedba894448e920b812ee7afef13efb6c13219e278939d9eac05614909101ad2982bb3853f2ff2248c0c593aaeba4aacc4736f915b205943311167b63ff0ea09f7f8865bcb62dce0ee2065345ecea1ef22e67279d033c22053886c67ebb15aa175aaebbfed0f976731d4d54608363ca662f1e943e2b4225a99d23804153ab2c29aa9a759af1e6ce0dc8f7017b3da63fa0dfe9e96968bbf1c8c579334c3733a93ed5d85d01877a37378b8fd5067a25e13aa74571bf6a0e28cb27f459fff44393df62f4ccd3003844a8cb945982c767418c1bbdd7a09dbd2d296b315eed095f9e73d85c3f700a8568aa0f910980b3eef31db3bf85ad725d917bd59cdc93f4ec0ba4bc8b4f78f4f635e3de025f70be215887f5b6f6369643d83b1db33d75257d7dea761e574e6e1f1ecead64e5e354a2f4235860c3ec682473df99f10c11398867ad9b61e170b44495c2f4351758f5f848a85219593f6653f6e1d0f2b2e8afa14b76a3129880862b3d7948ff7e324075e86f895d30902f76d3da5914ec7be63cbbce139cd6ee5217685a2220851f92b035e154a8e49f11e18d31a8f3f34b7bcf1b2c635d171a86bdc8de0654c6618b4bc3b64a88efbcbc48a570470c71c7deecfc0a28ffe3a5b272b17d6be8bcb8888d1456e189ac699d009f2e99cae2819e0ad0ffbae1c71053dac4d0d968c2751918aa3ba007c52622adecc537bbcff9279d3c65cfaf3beaf94a7550c5618237cb52f7ed1c9fa482eba510cc975b949f0a3880e4adb4ac7601664575b64f7670fde07fd39dcdd500568a9dbd4f26cb03b45150f4fb9ea3720aa2a7c832af19a15f35b497c9fec11f01c3060fb5a9eda7c46c2f0f2fc9cb4f73843eb0b0ecd6493dc7389217cf134f6be2cc4c615176fbb90d7dabc0c26e6eea9f5cd7b7a556f938197e6b1dab2602036e62ebd8b9f18fe0a9cf4335250770ce3894a5cd54f601cca0f88b321f93e756ca6c76924fe7d4f9c5967e134e40c5acf4789358784e2379f2296afb88c76fd48b4b65149fb45b52e555a4e1ba850de5576b38ef8bc9bebe81a382e0933afc0b35724fd60601839a8d9f6007066e8a25e5fefef90bf33408d3d98b77bb891c793d839f6d3f3a0e1f22d628199e47faed04b66e1b754533e76d4dbd276e2c619d27f1cc3087d82b7f599c75900ebbb08958040ebd545a3ee8b262c076278f3be5694f6ec69c569c397654d0e0b4244ba9347a4965258ca57b57db1dfa843c3bf095feefa5c95fb0cc1d81b2a24b3c3ccb4e7ba6996567181da1f92e1ae0bdb23d1282d744bb3e09a5c3b5a35b204e044deaaabec09063f75e355f896dd97e6f29836dbe29de8c1754ed631b51dfe422cfbd69fa71332dd3ab9670b849db18a3445d21fccbafc46a681f1c934cc69928bf2b4bd231da0f2d8429df235571f6ff2c04421bb0ab71634dbd44a39290d776aab8c2ee78d192758683fd63171aa3e34f1d40a37f5e1da2746c7db4d9bb19ad00ea61a7bcd6524c11294defe551a9f00c0ca02c6e3413987a911a4f78a1fa2c50349a868434c901b28e5332669373960156d30f23ca0dc5debfbcebf5e1d385272be00355996136f917afc3117c9b55bd806bd4268c66ab0f6cd812d8074047d434e4b6a760a56c4379b62a5c697baf9f1ddd03ecf7b8c89b1cfe4ca56ecad505e3eb1900172012201908d0cdd6af143483a926fd987eaef0448201d494cdcd3abd9592e6494bc91d7a0a4edc60a0240c5652b5cefb12bead7825caec25e380d13666ccc06382d1aa115cfd1e83f94f951a5c28e77c2f88212c3c10627e86a067c2c11f24f28ffc44735383fabd14f74d2447f8bdb83f8c09e5477ace1b319c6d0747129a72bd898b24904bf7787ddbb32888bdd81b9d4ab617da5285987ee56f586b3f87608619cc8985ed9b42ae3d657ba0e0bd32f334c44857403f62b91bdd5aa01e8248841da726c6c16ca820ccb2b212f9e37acbea92fb60bc41f69a903562880801973205a990b56fd2257fda49407171d17f71dcc0b5693f33e07de3162475a48be91a82323be4517227161697cb2ee10dad9f7bdbeae3319baceda4de051b7c879a97f3cfacd61ea3398de20ca6bdb00e81af482320614bdfb864262b78cbe89b3854db00480d100be931cd3667a0674a982bd254da65d6769f7c175d1419812d5ebbb842b1fbee1292bc489372798f485d8faaef9d5379f6ce8fd9015b76ceb45a470c255f14f13dd287e4b27bab908e4e652231ddccaee6c239eba6b38639d6d7815726c3fad204352f1201d7a90392e726e8ea1033ddbd16e4dfcbb0aa5afb42e529a5751ff90c270c61002b1460ecb45f6f66c92b8ef0392b25ded7659a98190ce44fe6f6ee9c14ca523bca502102327916468d165b06a5774e5eac4a8143e64327749e122b5aaac3462349eedc59ee0e7df7c086aa86e843b9c983cb9765273253c20ee427be4591ed452e62fb7a537a16f907eef5f78e3b18be026b55a2585509a6be0f6c4d71b0981ffc4ef6e9ef5671c8d7c1d5cee3a7cb9aac9c3451f625b9912fd6817ebb99e72217f5571f3e2e0ef594a1b273a52442edf6e0cc1a8d1ed41fd8ebdfc88fd84aea1608b480ac6b5efdd301248c2f3b2f3655db755289bae9b15da20fb16ad633d68afb67b4d698e2501762a47f0e46d0f26deed8a078848ae402bb79dfd92e5285db4019222931197ae638aad2bef1e8a0939d6e6ad60608267c7aa69a574b07667b69216f30be94fca405b02dada6d6df5b599f382eba12073f722e8771b6c2f70ff918f279abc553e55c4cc676e01bfd49b5f39eff1b08f4a0347a0d94ec25c5fd52783260833aff3eaee95397383888d334f3f5a3938d7d633401b34d759041c817c7c581df567d04701e4b8b19ad008c5928d2c8cdf01fdcf36e1f17cdb2f8e4ab70125a0ab85bcb424424cf0efa02d994fabceb24d14a91e50787606ede59f7a009bf55bfc0fa1787f365df72affe4f7af22a6732b18c169b76a2d3c392f365881d03014910f66dc3b48538ff2f61526da781e9721162df8923f7ce867143b2b5f2b3e94118cf32880009680ef8ca86ff7389de5d614d5130a7dcdd01f9d973cc53187a3258f30a475e78e92cac9851a2ee78a26f31da10247ae87bd08d130d3d96c7408751f05974384a48c2bb5946fa90f4f221f36790c70591278cab8ef37c3636b8da8445a4b115f3e38b959beb58d3753a10369457bad07d6c60e5abcb2ac9ed5f8660617060801c65c1dbce93605e8fe6b47bded95283f3b727cc0808abca61b12596e241150f1a2c1ffe6fe3836a9b847923b59a30689a942bbf121081a02a3a3278369b410b73c2f05e0e6044b02e9ff8ce971ec726d880074f58974ef3ad773784ece3671dcfa6edab187e26a7bf959ded11eba927440724ed59e1662d71e49f5d53ce19ae746452461cb19bc9d511e30fb46538e253961f2984a359c60dfef452299fbb360877d8cf999f368ef5716296dd2008f09db940746741bc45d842b113dcfcde6d024deb980d8b696fa74087231ab09bda68fd536e8040e035674c6012cc49f59be873054fe72ab704410bdb34fb7b63f87bbea2784e15781d41788bcf962b934b2173b047c4e1a1b5794fe93cde04f3e31c99c8125f53e655ed538ebac8f62a0343cc77200544bc2bb6691bab50d1be12e1fb3ecd0270ad87d16a0354b35e3c5cd5e9b45956c858bf6f03ed10f2663510427f7128f5f0501b8428643e03b84ca04e58026407e129e9299cf80e1126fb53e4730986985750997c1b3bc72898dd7623a3ebd0b72382417c80a6e35bb873661e925296782a317a2fbef490a0746166ec39db1fd3040450be7b9441208f3fcf7749f6b8f3cd75462590192af9df7adb0e965ab1ea17228f85da2a981e1fa2e88506606eb9c59e75e41b33e6933e7c4b0145d5277ab15f665928e46882ee6f49ae442a3838a70f91e1ccbf640b15f84f7ad4e4f0f3773d6dbee44c332d7fd77b79afbea5def65b22b5312613dffa7140c1a0049ef2ed2f1e1d98ec784c588df66d9588283b180390c4c50286705079d77c53be91d767b6fffbb32fa88dece54300a2214fdba09b749714df2c7acc747c114c7d7a3f9b677bdfcf905450b19fd9b932147d1f048536b29d06863da2e3971716bba899dca31a404ab90c335af0231dd1dc4093d8536f9dba3324578859c0f43f03ad54c01c63b3b10420b42d98c7a50de32ad8807877bf18cf7756f149723f21f0091eda15e0a0aefc4241cdfc3fd542b3ac3b9176f7ad2545ff9a5235336e6beb4c468f3209ad712bd16a909ce4252ce8455b7fd167de6c314db04faf8cf8695fe77a53f35720b3fd6ead39fd5d1b08db76a6c01a30c95a0bb2373e1ad773c6e84b18bcdc51b0f3fb7a780e80233d8317b0bbf6b3faf47b5ffd7d91f9ab5700ff17a04e4f71b4ada07559a2d7bef30827a3f988211ef64c8850120fde8118841ebdaf8cdf3fc23d76ffd08b6688d2247590edf8f425354a2f8a82fc3bf13edcc1ada4dd1e245040096a5b2cbf295154ac3807cdaf9647f0bfed5eeb9464407782881ec36ec7f541b255880b4419071515e9e58ab5fa84eca3f8f4526a62b3e0dbad8bd4438317af1c31b5ab87c069d25d26f594a9ca927a965de1c540651fb527be5a845efe3e04a19f82821cb7d038ec8fb68fed7ef736e15ca5b898f3ca41010b2967f381eedeecef6d235577f0a53e84b6e1138009be2f95cea0e6976a30f24476d3b3c6809a48b1d403d48931a3ed96651c9e86605cdb99bb12bbb875e175daa17c1224c9c35f8765b80c6429b154454fb6f0fa91bf7fd909927adf53ff063e57a59134f0e6abc080948f812f5a1d01e524ad44f44276c41884c694aac61df00804b37fbc80980dc33db068d91aa26cb40a460e2e727aeb867e0140d0f34790110deb5d730daebf8c282193bd5f8ed63acc3dbea6ebd6cfd1f2cd9c7cf2fd8f2115c MD = aab8b76572a544eaec4cd64bdb5c84f3c6674e9cea12e596afe88384 Len = 32984 Msg = 690b710fb47b7259303305b23440d0b5374da680367406205754e449cb64ac4af8868541d8e0d38b9ce7ff7f96bc7a5c55bcff7f125319da4b10e6a1adff1a46373346a89da25b88ea366a3c6a20ada7c770cb6872e2585244fb9b1c6655955a6e383eacca6912366247cc507913727ed49091a21fccca708c3d8d23bd0f256ee4bdf5b629df017e4c43b0238b3ed0c9c644da95e1b7771d6afd441c7bd5d26be2ebf22c80aa2f48ef519b1d6849cf70e3b62da97f4c683f25634771684ea537b0e9bd789872a47d949a17a6d7db775b740b1246c332a4bf06991e884c23a5bb96e0de0039e069038345ab26a19cd173c06e11d47311338655c451cbeffcdbdfdcf8dd2e2a9b85c4047be0058e36e49e1105b3bb58931e7b5a0f68a0197f4d8cc9584369354c00a75f643cab664eb8c5adf87f633a5e6c855ca0ec71915705a8a6299818209be393db274980f18f56d1dd70fe35e11a258ea59f65a5202a0b1cbb9262a5b42f3572c1ed8fedf79ec5a8e995b6971470527d7b3559a48ea165d150bc2b77b9b1fe2b59dd95583f260d34198e31f29d07fa3a278a52d6a3631daeadcf7af6f7c846a6eb20e32a92cd375bb584f7af428925acf0c5d7a326193b9a1af2d88a361d16cbbfdd01ccb83b4a07049e8e34cc9bdbbd200e7173e16ac57fde4dcc9b3d5875821d3d78a479194e1f4f0580eb02e72554fe8fa6ae9affc5444209de91d5206cb34c68ce1c9d0f4c8bdee0553aae150a59d16d01bc1a7f42d18e4e96d4c61d024695858e9bebc44a33f958938b96cd93b5e2d307052993450e0a437dccd8f83f2340bc3d882ce153ffe895c44583b6c74e79e742f28ee3d5e3fd111ae2d2592b329537654d280d6cd7f2be6fd03e78ae0dddd139e91316fa38b1dff57c7ee7cf5cdb1b8d51a7f19fa361fb1d948cbc50da58ba74537ed4bcf56cd69704a24b32875c933efc7135f34b7b7655f9382ab69e30ca7c9998c72402771e87e0072d5c9c5ec4ffb64d8071b789549f670869e73fae28d821299539471ade4d7a753356842ad958e7057a1fcfd2c08346c622eba71afd1055f9e604ac9c3f7238b408272508f8d1f75fcc077ca0e08afe38fccbbcbc70ad9ccf638b1a47687d848b52d7693f4af34f241e31a439dc3bf727a08e68dbaa365d75b3d8776181f6c5c3ba6f3719f645551c17a330e6dd1f995ab53c92c1d23302b17ff3ad33b4666224e7f676dc2450720e606709ef0bbc4d9be4de22b4112cf24c6fe2a2052754c576827410d1fe9a0ec3a185159c8d9d79b0d57afffd8faa950e2aaf401f0248558132f2ec40a9ad920481033e358c4787622f1b13e4733453be59626dc86eca7a0da076f27150116497a8eb6b012f44dd799ac645b0e6539426a301134993639ce1730b0aab194cee44bf4584499f1ae5bdc0857dab0f8ec00cb19619ea989a23c654b61c382ce897d56e177055035405f6465fa31b176d3f392a2867f3a5f87884eb81105eb26dc6105c6b196d8477a7ebd75da04925787975b7c0e5ace40401e3df73ce66d361e5bf324866d94a0d326519855a7d6238d78700657b5d7b4627abd9943f98b64e5ba897b73fe07c9e0e2cb4e1bafff534bf39ac1f114d924652a380ed493b84bb909434be8ccc42b0a2085179a81607f49a5164f68fc5528deb947d85d5996431ec4ab16835e3c5cd58c198530d0bc001d198cff3dd0de2a258467765ccf87f37d794b5ba236e2d7c971e3079cf2647e2cad6961de36d6b0d0381179314a1fd55b938e8be3cb4a246c8e8c2f3d8afc51fefd3607d8a2d1557520d051997dc0513fafff37b69ff4bb151e7f5c70eee6141a756d619b8940707afb1e8ff3bf0bffa02b17ef9939550479be372ff5b2b44cf5929a0fb56eb6aa58136684bea27549139163041a0bfda900ea4e0a3a6ad95516f12652b4d7a65b930652e078bc7ec6008f5b25a7ac5111312f1e8b9d7bd7d5050dacdaf838921cc2404e23a0619aef0d518ab4c07ef1c581094324bd5a3245364498291e260c665c4db2ced4365c3c80945c420318523e76e5365608aa7b1e2132629d951477b0d7ab4b22729f353710d45a5dddece504996f72901dd114d85c53b6d8db785684bae551ff0a20a857148e0f58bf813c905ee482835b6281fc5e24ef3b7fe63b6a7c687195096f3815221dd5d33669cb6a3e00d0704fd355029d228665e0d298da92b124850ebf7709b020684db10b140abd31071769a80073afd916c8bcc1f14da45be56f78a5c7ad55221138ede9a8fa62f170c9476516d7ecc50ad45238c74c17c53e84e5b6ac68778f7b151b89eca1c5beb806577f0aa7fa52fd394fabad4e73998a95b466b7d39de50072e86071993c15476f186a4e5c5f1f4838039ef5dd2e2563e2834a5c674ebf4bc2c301ba595c81996418cb746d619686712c874370ce15552bd0b61cabe07aa79539e2396a9d804875c6f6ff63c835327518f91891d9c5d8b20b5e7b0a29a3be6acb966145859dbf24a19151d7f997d6b46778d7b8b7d36915b187fa1a50c70aa3e672e4628b3677e1470f0e225c2addaf766b237e0eaa70d761e71c551c60f6e1291c154a34f70d4c15e4a6eb865ad1c6e4546e2a34d7aa777ae04432d2ee0d92e2068675193be9b59ca69e9c0ec43dab3fd92a75d0d750668af8244c1adad949cfa6ba7b9e8187ce59b967ac3be38bccc74deac959261d3500b31ef96ac3c466409123b63b7471f6cbb19494b435369c3947219d34405b538a95a6d339156988c33a54bd766142bf6113a7fdfe35e8aa0449517a08b2b55277144e520c5c3321e626b019e5f44498c85414408061fc6696b90ce82cf995a254b3980e6b14bbb217dad833f08a22034ff75bf4c1460c628f3ab650378186d3b1f7f660cbcb6dc9e6cb3f942cbf559f86720193675e731e4c32e04abee70366fd55fbe1a4dcb3c9c17c58c300f049be0a588794b917cb0a6c361d50199695ccb5521b099ce538423662b638f3b988ff3a2f50815d1e9eb75db8cfd8de2cb8857870d6610a6175b3c412ca8eab979dc3944b1ee1b9bf58959f3f6a7d72f5d611a546b05073ddc6aed901280c6f06f2bba740352e55867335af3e8f968e9e8901ca282b806fb6d58403b2315ad4842247f1b325cfc71089081c3aa1bc77934bc655b9ba5964891ce3d2aa88f2629b96e8f1f8736e74ca049d54c84367c45098efe65fef43e8c0f74eb45e816bafb9eb2f26a4a052e53f7055e74be7210b72faeeeaaf3ce872fb0f152752dd0ef26b797b1e2c3f45aedd46d25249ff60a366dc33d10c25bf8993cee7aa0bde85012cdc6d3713928f2810028314570ebf2298d75f381b2c219327b126cafe1846228a7e660fef6cc7e7944df8bbd7a7851fa556e19e40c2c726334062f8be1cdafce0fa061704006863c663a397602c6ad108e53b72019c08c923171cb1a05eabe6dcb9cddb160fe93322ee0455653fd91d300cfd31f1ea7ee2938fc49469503176ea481dca89ede2cc3667ab647b44482ab728877c86608208e124fb0f6d842433762f8663d41cbda57d4af95306cc30a00ad26aa03380cab2b8711081217cdc932cda8845893ef24564228e9f8c4a3b03a7a5275b8dbda16665eea59819acc31c6ac3a3de1da729228768dba89040cfcc19fb4decf989ce9a96184ac2da968045ac9559ac05f7cac35388511ca742577fee4f3f031b777ad5b568408fd8cc8c858eaa2a1de6a33fbe652b8f5a35b17a85713b7b0c48095e9e3069576d98a160827d8c85c2142c206a18acf6efc03091835f2aa28713a1e25ab395dfda9ed77492f5b70d372314f55cfaa7284bdb2244d014b725f212f3ae91ab684a555fb1515d83a420dba7d0371d9784840cfb190d121e4b75dbaa50fbe9847b376c6fd18f38a3fe512df6f05e125bdfaa91848742cff85222b25e5c82b8db29279e23aa86cad3002eacb4f7e2d1d402fc781bef8e401f85ad04b378bb961c0c8b592fceb07a9d6409e646595de28cb90a3f25d46839104085413e280ee7d39fe32bf890c4ce6f9483494f8737bad24c544546b83911670d4c06430d15547e5dbf94f2b31c3cd61c1b741523f8c161475b38d31da94f805651b2867a373288c08112c2783f5c4d5542c55b9229aca6348f687f771169e8b646d46d021d289f52c823cc82969341fa99db776442c31d9e8172805709e72ca78bea6b370f9d0e9f05569554ba7860567114fd1cccab33efa1d5aa200b5db894a173058bb706730fc9199151338205037910511e2fcb8592911041749e14192827fcc0628c0b492f73eb651a7a36cc8c024c180b04ba8f31afa0ead72ad0cabc7ff6207df7021d78965a7522f70d034abd26b645b3eebd478e05fa9a39ea59dc19edaa1090814c65b0d545dd428b65d9fa3eb060e5ee9c4e9cce156063e722f19641c1dce10f728153ea5bdbd52850c45a029aeef310b8b15c47bfbc014dc2b775910c3551131c55f0082b81476a50745d00ea42641b7f0a6d315dffca84c5782869fdac7932a65df5cd398fe1c7e16463c802fdc1656bd41fe984be083287de3f2afac4b1c4ad0405980a3a5cd7803f0ea6898393651b8904fea87942cd96342a5297f0a36f9cd280071223110fb95ece4af28642b0eaa3bcdf4db412bc8d245a8f69c2c689f2640588f5cca6e6f93e2323b24867df75aea809e8f0f095c919702fc4bd83aa4a12f69c09b966e3cc679daf6d7c6b273924471d1ea254dfc6adebb25d3363570079d3bed25c098caf65ae6c7884d54e918f1a77335ac7f1223c3dc587e6fe06b1f34d7ff446e7481ea2d5d957e42ebc3b59a2a6db9cb280585ed6c7d92abc4feb39944dc3dc98bca6c99484a02cefd6831e703a8bbabcf3d5805737b5811678f89778a6e5bf8640b4246aecd5c191440547f390b8673fc2264b2fa3c18ca53886b74b29be52387ad35dd9706d44ab7b3e60bd47d614c371c709d07a71afd104f1f38c24d22747d190d060cddb28a6f29ae32dde8935e0993466da5a4a5d3244e6d6cc56b5b11cdb69268133a3d00c20a759d5b3365d0f9efaccbd91b027419eb1fb8c0ddd922ffeb8cacb705bed53abe03f356461fcb90986b5fadf47a077790fbc3bd8be1d09c22c279fd267d305fad20ddd709097654f64bd0281753b5c4a4cb36c35dbe422bc2fd78ef85c23ab8409403e4646afacf7113c7526dd5a58a8f55b8db3bb6a234330551940bd51acddd260c883f8c7e89728deb34dc4a0050b862f20c0d13153fdca2abf49efdf926eea0a1c882b52b095f7fe5d54df8ed9f89b98c5ebb1bc5d5279c2e182784ff4cd9c869ae152e29d7a2b25c3ea92895fe69242dd92d17da7d7bba83078fb053c608670d41e03f9f7ba1eef975d6231ff5c0697d864b4e7cc040c552c9bcca1e1ce1443489cb2fb57dc6fa6484be2eb40cf751266cfe0ad125df864267981987d7ce29878fbf48956678a0447247947ccc74a4cd932c910434bec2fce80ae7b77e35dcad5aa2d064be1ea641485b9b9ebca02a1d04be2d3b7546442854f97ad69980264ff25e104d0b22d5040de18d4365e3aabbc69d239e71dfd36db44f1c0bb016cf1560d95076d7ebf535c9c1b0924da6ee52e1afbe57aff236730ff3127e4c5f9fa6abfdd807a9e1ce7c85e34db4fe4fbc885ede458bb7e536e36dcda758f4c35eabdbb0ef290a6c277f482fabd00048dd054411ff6512229b65d6c522c131aad3cbf9dcde0381f4cae91a8d140fd9f719729b30350a470f2da053c3cae08a7cc7af0c68eebf96e17d6003e5ce9913c637776c2230a5de16b33debafe9de87 MD = a22cb5c43e39024cd1b46d349e84c9ba81fc42a3323c7f8ebc8c1884 Len = 33776 Msg = ca5893a1e5c06b218d91d87dd4e89259621d9c7f66ecd324d3d7c86dc8c6cb314ff148014bff5765ac6f8e69e5381958a0ac0dc8b0a2fad647d4c0b36986a360a069a1b5f2be02a810be32ccd03acc18dd7ff7eaad7cf54bb427f975d81c3993248745c7c045977121466baf7d36d120825c00ee47c2ed0b83961cbafdd0b6524315dd3e9fdb3c4947cfe219d47350f8f50cd0db65bb099c1aead18bc0e9422565d9102376ca19b7ea203e12bd3b7229a05710b9efb07288e3eabfef09b10495f29d877d2c585843720228a220d45e3aea046890cce94f5744608feec06e25295227e954abce1e75473d48d2e5873db33add7f69e6aec98fa712e890cd69cc6aee3fdfb1da7496d6d19945a9f49c371dfaa8fe4b244708ba73ca73de18ea22de2caf119ba191e5ed79dec82f355b73ff912e8c3f6efb335f104ed8df89394f0f753e261ae86e3642a5d3786d910c1ae16737d24cac147307e666be9b099d7a8532b3c7369754af5ebe41fe6aeef6534be48b787ac6d8ef395ddccd1b7e60ccc6c9d79bf8978978c82df0012f366247c670f125d1a590d07ddd77ae66d2c86c5ca4724b67ce55ba0859a82ac24f981ed97332815a2f833d5bcefe0984eb1e82cf294c7e8b25029da7a931212d23e0ff0d5516351c4dfb5f5c983a857eb3a938a5c22cdd6d84d7482c87528d78988212e97e65e91fe83e5d07a3f3cb5b10b3b468d6db0f14d41be41f5ad516a998c581f556e7446ce69560e557f08323ec821e9fcc22bd88fb179809898065ca0af371b94664ef0a3148907c1dfb54df2e5f9fd30ec78fd2e3138d717e1c22e2d5520cbeb4a39201af9f14575bdae696be925f8b03922cf97256eadfa070f5fae32b7a8b096dd45a4ae215fb7a56e2508463854f134d3d05922ad8db574684191bc5e3a8ae8a5d1ce858baf2e337f015671a39a7a6be69ff2ad57fee0b647a47656a6e9e09c2d64f734a2cc3fd45b7ee52fea51c24af59ee22a0069f24937d8ca96043f484dde7fcd20092f62f48e0e22a58ee35f6e6b5da62d396770a9b35f1cff08b3286a2372aedc21513e30712fad8703f7b822b24ccd1b656fd26444c7dc0626ee176da6fe1acd8dda3804bf63d448ebe7531484eca59916fb9de56673962fe1388be4d3629f789112e6edc34b356fa93ab6b03dcdfe1ab08339b98312b9e0ca3afc5c3350bb61fda3a14827364f7fbe7a599267610524d4af4c6d34f5d5dd345def304148ed1e05f51dc055b590ddbe2ec2177c36792bf5d83c5cf6cd7859c229eb0d77abb3015c9fa2d2c959981e0ab076dbf6ceb8a49686802542e9fffaf617664060f98bc053fbe6fc0c92c3c536b7ee3c518a42233932ce32a3dbfb4542cef77577c305bfaea230b8a9e1b257c49daed53709b43c40856d218423f8bd3a88f52936988f63af1b3674fbd6d23a26ea1f22f1cd7d345ec6e36e8e5256b73ffe15b827daa760e7df6ecdace2a200e015e5a22c360bbfe6afc7760cd7b3e7d596afbeb619dc1beb67302f2785a03092b968cf40d3fe437a789fd49a349eb39ddb49a97bd69c192c3b2125e6306b4d914d3f26da47b3538ce9c2f6a0e955aefb446a14f38175cd2cd3b82e738361ac6e39cf3552d1c954805be778db76973e705a876d97aad7cc5fb97bc559ff01f1ac17af773532beeb174763c7845cc1e68f96383fd2c3608b4764d26703f3eaa1bd5f46690bbaf27b9454ce7f461c743bcb8fe2f85f6b7e8e765e52affc127a4134892a97410b028a99dc8dec9b360ca296901e1377f3a04a6f1e72fccccb4f34841dc26e7f837d9c9a7738abfe2a19bf835f403dd70c6443942dc9d9d09eb8003e95b46b11b4a226088d4539e97929e714360fc3d706490e77f4cdb3b20d6338b6796719923f4ebb86b74a22d793abcdbbccd3420281bd0fad1bd536eb87df42ae4151069b53a1c1776d9dd3531a1db80c7c1134d3ff3ecb85fb96cfd79e6ac26886189e77c269dc6d18d6e7e66cfe4a68dc6018e5ef4cc6a52c78eb20d1b41c87a0146dc1dbf560da518bbd0c1cdc096356366a92d275857d170215319249d58e37dad0f430d2f331a002ef3eaa25598e821aa67539379c9053a8da94807a61eea5e284a9419118257cf2dae88568df3ce8635907940150615af3b7c3fce4661b82b1e53b8eae240850c22cb43f24ff10e1c6fec463715572a579194a981646b746cf7f358888cb6cb407410c57c82d8d16bc142637f62046cb9f8b82c26e88247aa1af21cfcf52c52f28b46b3ff10f13efa915c7720e255025dd9b270c7b9ef596bf118ab4d07e941aacf35b880e0847e5148002b237f9215cb9a481e6bc1fad13ae32dae83a837c1f1a8a47a09dad9b8f84ff7278f2002cc8ca543de1be7ead89c58f8cca7c25cfa4d7e5ca1a1e63715780c09126cadee5027606a57de1309951bb842aec03ca11349b926d651ece8bd57e9fd95c30d9ec824358732bc2d9d313e6cd3fbd6fe4e356ac1c8c120d432d7204d9d579b2a5a5d0c8b6016bd1eefd38dda735cf2f0ab873afe0a0916865e8b58a0af01fceb6a3765c9bfaceacc47a4916bea791afa003240d9b6563bebb3038949fc3aee38157dba596a9c4a20edccd187fff95904945d04b8925298e97b643ab24cab7af9a55890a2298de5022872d6977c85b4f6b0310f0468a33469fcd9f44267fba71660ef710cc628c45b41be260127c435b89cd6e826fef1175480873e6114d37e788f6be4ff0714ee1180d94b2fc85fe332a07317841ce54a904d99a0771ddb050579f372e3b6f96b0e2debcd8729fdc64d043025888c26d407ab35a2ec48ba46a668b0a12099814438901b32731147e7ef0f369999155dbd9fe484cd295e194944a2c9fc1e79528079f192045a47e44d010aadfb1e7e320e423fada894269f14c5706708461d1427b89778caa4947d006c3dbdd481904cced703d8bc966af5b1131ab24ffe4f7042ddcbf40db8c0ba0916f08caa2913540546792f8f98f0c22814e8d158afd50dd8cfd52e540093426fe96b45087ecff1bb77e9d7ab0081af7fb222edabc27895f178fd4f27e3d5be3accf50e73e88bccf9519afb9837e564c0d30f2dd19d00ad95bf8b7f0ec94dd573a6d80f75cf118dc6bed6c1dca6e488f361f8ba51aa35ffcd8cc6e5921ac43021615a72959b27db2ba6e35101b446c31e4325bbb350df33a0c7f7aa3a3f02774ce4c45c5cb4965e2fef0ad48fc8d2bf4b61de5980f6c5f1175966f58f9ecf51fc175ef7508325bfda8293720c4c512181a36bbc3f06b0e039285bef18a0f3663ae26f6bfb6e9ea63447c65202a78c94c9f1130b78e768a80e1d1ec05dad355f0d2d41e0e5dec7ba4626eb9df84148be2a33206fb301b5f29e20f68fe62e5ee47ee01a7d943c6aa41708497a77825047ac51d80f79bc5f66f21a2d843c89369c94e3436a92ee4d0cafd3291206d26bd85733841451802dab11f109c9e6288530571e04d0675e39981771d38d2d99601934c26ba5c4b5e86a038fd3836c711347cf7aa4d799f2f5f356c88f12743ff8b14ae4d7eb59c3584ad1dad2dd57cea88a05dd6da6b2144bc374c2a5c9642cfb49a1820e0d981245f482bc50fd2da60ba10031a5663a2b01b17a465cdb84c8318842855934090a770f1e1c930b79610533c85c953eb79fe0646f3bfe705c7c611734d300883514b544aee1e430c0665ee866488557b3d7b0855b8bd1af75ae559d7f564b30a396c93b38f58b938c1fde6ae1dbbcd8b53d39bb471d1ec156c8d3c32cf48255dbfa799bc73fd05e64f34c5e41ff84ea463842af3ad92cce8730a4314297ec1e66a68e0c60a7fbb6d14a726f8f9b23b5ed3095083ca745fd9150908ec926d2b4cb04d0380d1553c55a8d1643d296e260328df86f556faf76fb8e5e82ca897c3e927a06c4d57121b38722018212da09149db8348c8e19b3624d54d8b74ba832e54472fa5bc1a3ada8e072fbd5574ee0f8b7171106ee8d99e91009c4d2576b3cd1685372a3d7943fcbeee5cce4aadaaf35071356867db4a932cb14eb7ef3bae12986853744212a1f4438e43b561266bdf21515cdb344742b6606df1561297d6b16267011e7a74e953c46d511d398da53586a833c364ab666ac4ad10923009c20bfd17cc73470e9e8dba1211605431eb98f8dc66cb69863a32d1d52916d81ff494d0e1123d284e16148d03112911b1b37be064725dc34612a100aca73e7b28e2de76697eb6aeb2048ac5b6ccd2228b7150d5e6d2e50289a437e96a178389d3216b66076e8a3ad8ce52ecb390e5e73db9aa51c9f51b97cf4369f4b4068084ad14ae18416e226d30f7ff7a7029fed03700faec84754bf36594a9ab00d0b01bf5412915adfa19a65905f2e772e4678e05cbc4febcc000b60b0c8984d7129c906a4b6ee6b3aeca869f6cefcc425cca71389e9b10c961d4501e1f8c0abd5890827a77e1f3e8d8cf8e92b1289144ef921a3dddefcb30d731522d3223b519ff4672847b24d5b414a31ec1673fcf213948f9842e2576899c921ca708e30c739328d136b999f4bbfecfb7b9f3b7de3db6798fb9f3feab4a2e914019f84c896090b24effb7c3e956e3a009daeb036710f38e5d3db3bde1e909994cf484b2b457947d1c5dea351c1b5fee55a2b1c4c2315d01d28e01f5b2fcba2493d532c805cefad3e9cfe560158fefe55bafec5ea8156f7e9029533886dbbccdd52a96fef64d506137c42dd76e1b003f6c610f436143a74f16ae2be8e62c8def517305ca2e4921af76e927fd7e432d5708547f058632a11dc67af0a95965ba23c92d13abe648eb19378d6864ce9ee3c6c008c0379f78c945302e45dc490dade57cd75536e6c31938fa5f638ff794b00923dc873c156c9c6fd426a0043d8af5bf1d002edd885e38792fadbde151bb1e88946e189570a4a6f832f273b3bf640e1b0a1625124360c5744816bbfb95888befa23c18d649b76578cd10455d472f7383c4a7bc77b0814c94f418f2511b739488cda4ec70f8fb445c131e99835d53b273ed33796058263a65842305645c02a4fe875727e81706e03c956bf4a87a773775e427c08e92c61b50a8d349b7efbc49ab5fb13fce1c50b574e486cb4f16e09f043a13463508e77c00a29853ce4f16ff39c751b875817f30af510da1e9cb4645a96f746f061310b8d031e09819e29942045ea71680eed8de468b5efcfaf00ec7dfe4d9af7459c87e69b75aab2d52b99ea5762fde72acf43ac4f3f951153db092124aa18c0235751917a354e16b080e8197be6a74bd5457c2c51b7b32ab0cc230daf16a89224ebd3564966dff658afe775587c57de36d8a12a17243163ed5ba20a489a32b770df73ffb010449af44000c5972ff5e6760f186f498ef6043310eee0973c9e752ebb9b52563c654aadbc9ad3df0469acbc734ac38efdec55a9746f574306d4158608b219e4f22a4eabaa1c65d9059b78318b9fed8e7afa9e780e8e36f500bcdea14c201a01387bed1592f0442c397492fcdf80b7f20c0826c766b14754313f1aa7124c1e5618407113fc7d3881a8da4147f753e762bcff36bf05425009a1430fc0dfa0ec8b996120cf712b09805bb6ce375c81468591c5168872a71abb58b107123d834e47c3c6436e78627ed059f181f695739c0493430e49354a6d135f7248c8b35d0a329f58211b9a8a601aaa71a2ac2a90b186ca61662ad79111b9bd6c1a08ca97e9f534fd04fc5e0b770557207980a33f4cb43f086554dfe6cd547a89c7fa0897b3388b9e32394c4e8b3a67e54e9b89ea3736f91e54efd5b06a8c9fb096c8f8c630a2aa24f4fbecb96460e2a7682564f838b3008c7b224256b10b32c9ce971f8c27dc9b75926ac7b5c920d1501045bad118d45d3b2216ad4267763ebbb8920752628e667b54ad64ab84223bc78e2315dd9e40171291f39edb5778c8709cde377ea75f111c82ed4b015b0d28f42a MD = 6d99e24ae740fb14d971811c6958965790a4e45afa342823a2451cb4 Len = 34568 Msg = cae884fa25adedd883ef4e7c855def1966cf928083c40f361b0f3cca53cd0f657d9a07a39905c7a11c410558f11da229be351ab8686a1ffed991819a016851681ace465531335f72e24dca47630c0569c4d1434f74db11610801395238a7e7b02aeb0ab9f41ffd715c7c67f1e11460020009d5eab0fd2d862fc92c990072186435591b77eab1e9c61236a2ff761cfa1bfa46973422b9bb96d650221862b12eadc17f41361bd26a9a8ce44519270d1cdd3bf152d2d4f802b885fee377654c6fb258c7449e9068ca1553ec16e6fecd0e704a70ce6fcea04b15c53b365d122b249c8198eb58505c4f5eeeb8de0f024518fbaf2dd3b1169aded41d6fe5726f379492c55aff0c6397429ee5ae643b3b5d82a6f38e2940b6cf031f1602b65f875609bdaa764961d200ebfcc1387213b2fe939b9dfd97c5b626021b365d72cc5f71c944ba528e00a47e91a108bdce3f6e0e94ff35e1e7e81c8622f208e6e16001711d507d579991e1fb7db445a541667776cdfd43a2df50f2d9accc1106cac4743c4d097aed31bb915ef85efd579330d61f86ba50a848a64006e8d0db25f6a0c0bca196397d1d26bd8f48c7ba3d8c4792f00761e35ae9910cf51e27edac2e9beed76120426d267b6d75b51603bef450b3d0971885228cba608e96f8cf01385d0477d4ce1e271462a7fa8974614292f642a98007bd67f7c843b9976c0a8edc8f0d8343c95411af8275050a085b312fde466208581392f364be5e6bab25bae4d90ee3f6386c95be84de7f82fb79f493b3c7e378300f094836d76558dca8ec16e2117f3544ee1a0b0feb4e377443f1861bce1418ba3a35bee598b6a7281b8e3c531d3f481563085ccca25b729c4291d0be61dd2f1b1b7e1d1a0939a0b607071cd33b0b76d253c67a630d8e7a9afd3c38468b26077e3b4d2c7c31d78aaff4bf7f0b72cb09a444be2d7b34cf9997fc5b885851d7e6092008b4b41876af3a681e2ca2ca6747b2c0573cbc1d0715bbc854869fbdd815e454197d69c6ff5580ed8ced414bc779254ef971d0d21c372de891fbc0d611dc385fe64f44445bc5a80a718890fed3e624770c925c5bf84716e478ae66a46a822dc7d9f2ed997047db4835c636ea74d8d8c1f8680bbe818d9d4573693730cc51ea16582d0bcd2822412d406fdc17909568b626bb8205a150eb92e9f2db811d8f98d3cdca46e96aa00143fa4b298e1066fddefc536c383fda27534212fb9f47855e879f8f48f31d074412cc21c656dd93bfc0e3f76f5d43717a11e5913f93307b65b93645b6f62ba031211cbb5a77dd64d5e44471337e945e0c523c374e64c2b8d4f1fab43bf77bb3f1f853df8efafa2168d2858761a21ce904a1aeccd11ae386d4b853a37d00f588ab1fda560ae61b119f131002a1d2c2598b83a3176fbe7d2b8d94a9db24188166881f17e87543287da32e4ba99a156ef8c88283e1d15777f026106425d9480797b07e745c781a08ad9baba046f573080ce425b7f29eedb91dc8b1ec4744976f614ac7587cba72a5e9b013769f59f479de06f4a5127f892bfa9a01a9090c0da10d7e7f2b0ee453e6790aec347e6fa1a7b65778b6091c31b5cfc5870435d9b286e2763054db9dc5b3a4d0c144a9df817bdcff38529e1cf03fe370cb6391558f042a57613dab8ed1f4b42b170de8509cdd9725bde29b28cbb17fc4562fe726ab042b4c9b4d465e7e91ef4278f7056bfbb630f18dccc6e7ccf3ebe9afd1fdf40e6f2f7a65ec73b6d5739e3e6b6ac6d7a5ecef8c327ae702faed6f065eaf9b68c12b7c0c4782fc3edc80084679cef53ca2691c1e3452c8205d885343ec338b29cb225a28c977a79d9da17783288b5844fb13ffce19be30eafeaadec9e0c494e0343a13f774343d7c20bf311c0309b895b7d4e0c56b25e607e43c59c0c2c97d35055deea0cf1f85826bc07f3a8fb1dcd7de93062bb1efb32017270c501bac0fcf4572324b63a14958888ea90556e98eb37938ba2774835fdda0513f9f71d41257fc612822b6234fa57f0ff7a4df1a94d08faa44e13b4bb2e586a43ad84fa94e743212184a520b6012562db140b2adb7d828d3ec828eae74e1d10744213a938acff06c49eebfc2444717ce1e005808bf704c9afa32f5146c788a61a7a2bcfa90103d59053483b1c3ebcadc870d5895744204e7b518f9e56353b89ca9855c4626de22c19244283fa5a6753e348e3abb9ef657a2665d218a211a639f93efa3df15e1a68a394736d3b12222dc6dac87e104344eb45528f6696e749352ad0a172e24c2d19d426533d7b004d89e7a8fc6716fa3f003caa2ffeb1209519d3efe42991d29abe2f5c5a9b26bf7a06ca25e7fd2a7eb45780df3c478d482a46890f3ac89c6bd3d419a901fcca7a1812e2f423a6c74b555fb6542cd797d87959be910db67e9278ea378ed1e8d2faa83cc676280a79ea929751cb7a354d5bf2b1e927d59994c0fa6eed8052d5dcabbae2e93e7d8ebec6ec8cc787ccd73a4d36ed9d363ae89b81b8e0c0200d4a43f7c0b3dfaf8cba027ad3aeac2b6d33cb26a66b5f3ea609df4f64de33e059bca5794a1dfe6bee02e170d88b541903e19c72d1c983c39f93fca46eb5dd43c0b37daac78fd9d609ffd8437b9173f309471aac4976cf47901d600b471610bceab53906b99806807907536d2d5f702be60ac24d6df1764d1feca5fe7e6d62de30387407a0b4e8fdb3cfff487e53cd3632731fd0bfd83d46a7a82af8852a680a29c39b480d6515a032a0188feefd0fa46736afd0df8968b6bfc68b83ebeb84d34fdd3b226036f11a8e2e5b8defe9abf91cbbeeb81d83ad3fd0de341b231f4dbc1aebb03149992fbf1ed114dcf17826a69b8959112a656f248345b148bb3427470385b6ff1a0a16107d2ef0f7b447042f8c158b56669d13173f938f7724c8a5e692219bd6521848b1119e5c5878c4c90666e6d20252995d8a7e4e3b30f05b4e2d5f45fb71a2223c1384b5d399ef8fe9cdb473d9af8ee892f0b7ec21009e5a848dc379423b5ae664ba4efbe31668e6fae7ed530eb87c1957ec84e3ed509f44fd8a5721fcae1ca35707c8d70768758850e779fafda79a9a10c05dcc0ccb63b8fda592d6a744480787ae9addbd0aa5e2904ef2d203076af9522ebb1aebbb9c151951ff1dce886d717af12d8670677a744d70e08ecb528da5908a254716bb98f7e522044ddf050d8fa5820957ce2953bbcd0fbb77c313432d606514d72a45fabfc5983b1d5524a8909bc3a6d822aad227b37dfc2376c45bff2642025182d531fb5f271bd2cd71bf42d2589e7e1a766646754e1b2842d018a96693863cad03cf38f6512f24b476b214cd9348b0121690a6a6e2a0ecd3e109aab5ec18ff253c22d74f98dd7986ae4164f2164e14a605d1c6bcee15e79651bf7178be232f77f8ed74bf70bf47c082cdd1f454172252beba051bd2f2bf06bcaaac438c4d3411c48f8fca7b3d260e8eb7ea28df2c5f84bbba006813cfb9918c4ba98ad8ffa38f298996e51aef8aad3caffc241a0622c89742371622f59de33b22f7d316a2f44c824c18b3d23eec491706a66a872d22aabbe327aaa30ca26863b125a0e7dfbcd6897783ab33b3d14ea87c6760b919c597943d4099f69d8dad7086a168af1e53b9897c663fa1e6c04a6b41cd9b2244820bda811068bff0a60efc03f9beeee76f621ccb4ee5bf303fa8ca17379e5545fe93d98f159b41de821960c99d0829b3466cbe049c41ee28b6065f6d33dec49681bc2b97deb63e9fb859394819d8d21a9f35d788ecb8b158b9df95a450d0e2aeb1d14b3bca2df8bcaf5b0fffeea59a85d06a13f89ece9b18b191076cfd1951f7059fb2fb767722cded7b3f6199f2c57d7055dda441082e1133c72f27c71c75280363fd5742362f4bd946520d9a54f569f5a5af4c71d9ccbac6ee67551d6ede8a21ca74cfdbcf80af1958e2646e20ace3d6b603318fd8097dd1736a758e64e0c5f73fd3d5a1c7c970241f6af683fa4e739a2373f4196766e2f9f2832988a34e43ea4074f912936c276ff646448a467c81c66a6c14ad2c578296e85bb19abe598c7158e2baccd6db4d739a2ecedfa999a6e1e76613997b7dc53ec14ede42faa51822f5978b2ee6b94ac5676f15f278384b5346fc618cf92c335829f6d0000cb37f85a32dfac76768b7ebea918a7156daf7b0f5999ee619f545896ece675049071b0ffdf08a14cd7c1d4d8030bccaa9e424717fc81c43526b84392c5fe4c2541283284299a9958d65d360e4b72d6d06066a2b42027a1336f167edcf05d8c4925830753d83e9d82ba882cc74bf4ce6ef943134e8c328d43c19792de35ac3d5a85abb6d2b49bb3b2cd693f6cc93abb6cb200224d094b914d666306fe5e93673fa9c7c76b845ae6d05529f6638eeca5b1d3c657195f1ab339a4a162a631b913e0d900c38512223bc49befda1562b19427a4bc3b1a5646fdefc4792f3d78c749255d7e3187249cbc76e7e472ea0c3191b56d0b55b9b57877570d14f32bf9640ff67c6899db836f70cf812f464b5615a34375da2d5c4657285ac99a39d77d396f3b80e683e8f7445fb5b0fade9e0605d3ba05524c6dcf8c18de3e3386abcbee70dcaf22781648c39211bd6ac34ce5a82800659b395219be4fccb605640ead2a1ac15241ffcd3d9310ccf0a97cbebba7aafedddc7c75ec96d60d773b5a68e99576d3b06ea1759f5de1cc91df915b50a9619cb53d9e3c10bcb487c9fbf12248d88bf813cfe57636c80efbe8338a8a6b5756c334e726114cd7f124f66dafa2929b6219c18c5339ca7d9e403dcef0b5d6599059a3029c5b698f96cb45bb1f518f85011f03ce732423239982d7d84b43575617474ab58981308ea964fd0ac697063f72f021bdcea0086308abff78219cb7f7f476712974ed667935d667852eddc171bd766380eb1643e5f2a2fdd6fc28bde32ecd6086e506d6fb3f0bcb51de8986c2e897114052ec9a505f4f191b634e33c2cd335ef3643447bad1ea71995e051edafd3d72248c8cd64d579a9b6fdf79df3eda92b5987adf805ef25ba08337b75162034fcf55205cbf83e36bcaf9f70e8bfd5bd1ab9eae6f4a90ab46a137f009e60203b570fa96c61c9b0aaaefe23376fda75bd8892d894c6df80393bdde1162a76104579d3c7730b73cd53f52511b19fee5df8f976c92dfb13d022b39a022295a280e1d9e434a04560f4a123b6f385f555ff1de1c84518ede07b0f460a4acc8c8fe29efba3697a9c2bb740cf26411b1ccbc98ad629d4ec2bb0016d7791337a6b98c5eb53b3de787c3e95813be572e7529a4dde4afdd12e411ce3bbccb14492bf57ab4576782c00620410010e970181535c1c66b4c6f245aa819278c9fd06cbf436f34bd872aad8ea36a73ecb9d956f7b8b85e2a81790c8e488ae32d3d6f27ca6c13e5cfe2603387120db98d77b770857a34aa09952453e6b9c87689ed1802b4390fcf76c24adc5936d1dbdd6a35ef2542dbb4f1d29780ccc27ce887f7f386e56f0bfa986d102f6cd75fe0c3dc785a41d95583c87efb1ba72d4e420ea2293ac6d9ae6f1e2cdbb429bd5ed02613ab3940084b1f78e277acdfc0e58b0838e2a7bd3ea135f147d3f4f6af77b3f058f4158a956591e74634bcdc44eacb5cff455333658c54f7061f763c76529208f37b7487484ae0fff159d20580040af2407bc8911715d51ab1e8c264da9674562c69e19feba314a62d0f77c43edc51b242ab8e3d1ce7bf418f5561d4a3ec62c24be6e13a441736c6407e3280441aa7844ffe2ba13ca81a54e98fdaf699fb63349719fec01d4f4c4673cd8ba25b651550ad9c29233f01ee3a07bdb531846c7f94592bbf993cf2610e0e250a904b65a2fea5ac102dec9944dd31087bec2be6becada44ac2d69a97a0659ad38b3dcc356767f5766260c192324af98b391571229be5f8a4ee46e1ca1169c8e9c73d62739a083c4b576672894f7c894e587d097c75933282c2712f2dd261eefbf3900385464f91c8484c56f9e3ec6249a365e1fa1819d44cf5c1cd4371e28f9276b239faeab28865cbaee9549e1ef725806c94fbd1fe407bded5569b5e602d35e7307044f5b592bc47fa9439dc98ca3aa MD = 69af5ff4c109182dae8ec7792deb6fd309fe01bd0b81bd8df8208a73 Len = 35360 Msg = 81f0f1f020766e876ca103cadfd021b3a05d490e57227e223f3cfa937d0e2087b089b208c9ab44aa1d46f06db8034ce4f4a699974b943da76a9274b086cf42f3f325acb5f39c27e2cc3051f61dd4df1d71b6d69915c5ff6527719418f0b1400b744b47be46500078a1e58c2eb549c2a63f1469dd5cbdaaa59f5fc49261bd02175883ebed6ccfb8b4c5ef0bdd296dddc78548b828c98527aff9e66ce881fa705fca5600080a2135de60d634cb204518c86cdb2d4504245fcb5e8ef2e0fa70732bf04aeed8cb4f613e992071bf43db5cf01b542ffab4a23941f6debf437127f1c2f2e91d25545f231c995729833a368f89ba3b251181089c58e85e3bd89128d36df9bbf5b7505c62bf8802c3ddac5e9bd973197950155d72595d96ce69ff7a02742d47df55654b08708daaa996415c66296c75928015a9a28c7c0fe1bc6625651fb51541c93b36fc77d0d64276a237dac0cdd7d8692cf414396e50da9b6c32e3b5b9ad84d97b24261c7a0ef64477f7dee8bfc7b3d20047b0a85ae123ccb9a866806398114ecd1e6ea7b3db2dca67a559e76ace8b8439a95e21694b2217f68fd5c6d95d4fefd82bbc5fa2c34fce1b473506f573c848802306ebc3154146cbef17d04384a5864553f88d7050c4193be8598d883fd2e47dbc904f8fc7e71fdfd116e6ca957dd9bb9e0a79440af5736e8dadc44db91220d77ce495f6ea7b6cdb3cb95096193eb2e315da6b477848a35c4019f26969eec6366bea051f0567f36639e855ce984fd765bf51aba1222673ae08856107d7cf9c44928be632a0127d29cf8b3e9a981a10e8a555807990f8a90ceed9574d8c1e6ca6f8ad825943e4d1cc068b5323a3062714cdcf34f74b240e1df8fd1d630f41fc07a5391fba7745b9f6e6cedc91407be29341a80d45da146a8a30d9fb72e8a2140da218067dc39dfb4f783d210cf8e10b0a09c65488c52e85fa9e5638a2a0a77e60f6307fcbb0546080c3c06abb51a168242b1350eb95dc2616495a1e1abeba01a9a96bd1ccc5d2b031cf40fec6d521c287b1764b93d185178639cef303ca426490c4b046a78a80b309a5a326560ccae0dba2d68bab01901ef1769b00844ca770bc4ee6248587c430b14cd32a937d048cc9071d5959ad67040009a78dc6cd50edd64ff7b48d4507f1d1ccb652a4b0388cf8e732fdc55e71905af9dce2f1d5a7a385d0ca3ee84bb2bc102e36e5b12dcca9124afdbf199b168ca74e21462cea135972d7470abd212b5a16793a2de47d2aabbc3966e77aedbebe91105d039f96fcd9456f565f3550dc938cb5a9706327b85aa0ba55bc12dbd1f0be487a5f7360cae9a59ddf87785f2b2e1aeb6df756b3e07e66d8b28709edb7e8d6fe5fa3d0d0e6523a6bcac8add682f567226d0ae6a909deb698659087abd96f8238f416dd6fb6dbade0ff6bfc3e48ae1c6291f13a929a433604561fb39e9d4c6a002102c3c4a34ea60467b78e1de522e0b3c1f37cf6fd7591236e7cb54d6c49355dceada9581672cce0e8f68bfec1195c1ee559d15b993c6dfd93efb640af2c8b58e360b8b1750ec87b6b6e1b66445b38aae56c634bd660739baebfde00ccbe16f74863185929eb41ded96964dfd6af1b60a9715a4d1ca84a04a83554142dc77b44e6fef0d89bd1e00f182d91f0dfdead461ab3deead3dd9a4067994104380f6547a37968b432874d181202c822c7b197671e7915a863c70d58d533cc59575d7a07681baa7755d72f00ad3231fbf6ed81c89e0a2a12352e4953d94a1e9af17a628c1e2edba86e872fd0d304f605d45d127383af43adafdaf6395a275e4f6d2fc6deabf826d0e460f48f6bbf3cc8cac8f36fb3b089033a93bd134213b50135424e06f9c2b1761f2a27455dac2ecb3ef5ccc41855239b3f2046e878544b37b07ba10beed3a42287ad6ffb9113f19699ad447b99e639fd244a38c0e432477946a468f57475285d84b075b8ee3cb0b144b8039a1daaf5b253d93ba36ef7d14f5f834acc72ee65ad7efde0845e6e91a5a5deb22c8eea7d413295f99afee9134263e2f099cf87829ddd5a5967c9f2bcf826e7f936d3eef9322b4517ac7c5232d9ba8701647588a7b20990886a15115a352e9a7fc2d4fe920ea4b340e2d078599dcd3a26334b39fe766a6714942b1093e124c0edd779626f5b07a51a42e2a4ae1402c5071039e1ac7068a6a6eef33a8e867221ea7eaa61baa4bbe44dd79a1d59c8c2ef4b0227cadc286c17e57e55d674ab7f851fbe4f44986e283882a6e12d8341767f9b12fd3ab427dc807a4e3a2b6cd9b3b4339f50543343b66861b99d1a5405843e9e46a37a5cf422aa0c6688829f977675cf2995d6b3aacd3e9117b82df39e56f4fda802d2fd17a45d44cc2923356d30929b650615402cd580bbc818ae899452685f400089bf19cc60ca8a035655e349d13e5a8c58005036f786d5a7e53d6de2646d1486e9c981017d45a80063278229fb61100de61e9e586b9b454b1938b36daecf2f7d3844d7aa7a5d2c0791d4d139d8ab907208c09ea4a4a120ee94a1ed5b0f2c96cbbf57a43120bb20ff2a8459df2fc5e1a4060fd98069416e779ca1a4134f2c535ac62b6efd37078bd2745ea084c9560b8a2832d655832338ce7a605fff36786c1095e7c07687e87667b88b30916f07170bb6511d8cbbee86db7605a6868cb8ecd773b41f04d707e8a63d33916ce7800c11f796378bd74a5e86d7b901101893d896aaba150ff10ce9774d7c497ff968f2833427abbc9fe1cab7e7a3f905a3b23a35802029ff9b9e81c22e91e2316f68d248b52c0186dd58d156ecec15cef5bd199b3e0fe43c9e65b96f2998e4e91027b34ac2cec250575a7b4b2fbbded1d65b7eb22baecc2ec20b986686bad511a34e9d70a3347584d68dd17ef839db770e34706191266b3ece3527908d1e3f10f18498a29f88a2892299dad78f8d942864f1f790b69e49d28c8d6dd386eda94ec272adc8ffefd1c703279f3f3be1914da23a1b27e33fec54c2bb7218b84e9c33ddbfe3cb0c938ba641df269c455a5b4c8eb6e50f6031de2a39673e486c6a9f270c1443910b9c578ea36879d8f522798ff10e5c2e759ba7beb938da49ea683a921519d3034732bee7f36ba0d99361737c92ea896d6aa5cd760ad64d057a71f5dcc1759d09077b4719f78fa189673ed27d3bf072b48679dabcf3ea9f6264ad596dd8d1a98c92a27a8c787d86ceb9e21cf9b2cb21ec133c56f73d1cd84aef43edad22d4fd7231cddfa83ddc5792d075dc58c0219efb5719c78eb01301a4645c39056727a3a52c25ffd610551abcf51e97012d9befcb9b36b7eb147822580b1fc6db6e71a30bcbd1617cb790d9347005d75ec1e01e4326bbad7531f2414d2cb51b98005b038e56f98d04fb349be2895323d64499334a42d13294cf2a686d0f45c1a5e58dcd1514c70cd4a4e969ae883004d17d6d34ca35a0cdb0b5c79e9ffcf83e68e5ae09874e6165567a594a80b4c301b735052baa484f0631ac72eccb3af61c4bc766bdce4cef20f0452a46405635a2f134081fd2c30665807cd358d91266e2b5555ff3d1569ac60ccc0465d6b6ad6fe5421f1929eeef7303ed91edb2cc70190e553eb278b489de11d890b02a1c54f1fc27f22099102fb723c655b03cb03e48bd90ae03abade6f06731752e24d052af9eaa283c0a73f1b948d1c6ab6005f5f72cce55ec528ad684769f5ce7ad19ce3134956975625d5b02dbd48de50715c0afc2d7db7855948323a5eaede4ab41f00024ae5fd48a179519429851661726c5f6e772e9ac9c1015545ed9cf2c088ee2a3d8beb0606ae9c886e7e5bb377a812c57036927921049b4a00935abc7aa49c9a2b68c0422ea1a1cd23083735f166e1e577e823c319786868e0cc628be7bb9d08628e20420f3f4b884873920e6d534c380c186d1911a0eb6a6d054ef1861281cd6958657646bbdc52453d06ad59d1d4259323c8dbb822a6a70bda7a7dd46dcd81a6541a6f63cbe6a3bfc11fb33586fc36a3a6e19b6b522cb753c86f916111e2adbffdb99dc4c3fd050eac17808ed73703c42e21c8a9d3e003cb3bb8dcaaa363a9fcd1cd72085881eeb84ab8c5c44716f56b0613f4021c6314d8b0c0a01f96c31f136cc09cacde07d943496dd3845b1e840edb32adf280188312d4219c3e5083756a2b2d6e00e9115d4624913a3d87a048362a0846f9c382a6fff256119585173587997e76c2fe10d32748dd7a6e516eaa676f0f5f964b3428f6b7c8b0a3a900e7e2443e37518198e37d32ad14854cbc431906a278368baf61ad8113e9f710e3050097e7304b180bf69e7e8a8910de2b7ad1ad8bf1890956e97aeaa23dfe610ff5791103f20e260c953188f0489f8a2eda17b0068bdc48bd38e5410e1d281e1a61a24c0eed193ffd37acfe68f39fe558e951baac87cece54d87340b21802bc84b222b57291faca7066872b6eea80541c11162a0875cf0ec030bb5628bf2ca0c17f50c9e9713159e8aa46bc7ccdef6b0af9eb8a94e66b8e51ea13fdfc62f47f6311d315ae1b4b62c86b620e1cfe4bae880c3858cc5a02c1bc5d23a487b3f8bcec1220056ae0b779b2227fbcc9fc137325b093112931435d521250e66512b7ddcf18ae359a71e4131887d624fe57d57d568f7240360cab95a5a222401f1fa0467e7df412a74f7fa38dd43bf344921011bd115c627d6c8a1f39751e2e102b40ab9cba88292bc9e8cf64cfe794172b41d4abbeb80459b18d6e8003bb1cd2d627618c66e0d592719ddb4fa38f83f093e92ab5002b82757c23f81bf67fa8e1a0a30cd00b84c475f72d7b91278a4f5b5c84a86b8e1d793b3ccc306f95d23ec70b71f1fa00ea62309b1614fba47e52d1f582c231b10465256404cbed9a696afd86e2d58cef883b7d0dc62bc1a2c23adeff920c9a0186c2cea25c1f284c9b99ff93941bfb4ff4bc959fdc4495cafc63eccb00ec16f80b0e8148409ea254ef6847c1f439b77aa67224f1b6e3ea55836a85e87de54b1d07c507e640eeee2beb42508291c3542823d8a583f48e320b0dbb34e8578c78e91372ad0cdb746e3a05a4b465db2d53b0e36c91c703a7ff23e1e2744b2c5652d4a483fb1c8ec39517c52beddc5eec28ad6baa645b62c5c468a65cbe717ab75b7831957ca5b951054db03467669b846586232ea781906c0421d1968e0bb133e53c4113ac3919b141343d5abb94ff9a7cd3b045d5fa2b0f40e7ea3c6d6a7e6092a9698af436fe48ab73f30b44d81972e10e89ac7a2581240d33569ad72e10a1e6480167ff2ff59bd67547c2bdb077c234af15bf0e94415ebb9cbd5e55c7369c5280bf3727a48e2f44c0c21d60ae78ecea2dfaea0db6c9f3fe7c74e353b64ea469ebd9850805268768eee877d832bb7764138fd9e20da998286b13b67b8bd74e8ef216be1af26d18c548217eaeedbde654e87afb36196ecfdbd1206417a85f1f543bcd5edaccb077ec65137e4f2fdebe1f2512ca746a67ef8b571168c2ac448b3c1183f3b2249f0940ee25032379bc5335520db42761439bb9556d30f6f83616b92bc0f94b7a9761651bdcb9d66bc56a39e7b264b9ae8048d8649a594f2c92464dd30afc013f2804bba6b0eed27698578f6eb748c5928c6b8b0d3f4e15a9e79e8cbfd8587df2cf57c6e7383ea21a93afc84f72ecb5cde69823a7b28c0500a483d84aafbb1c35fbff1985d915bfd845d757127bad14a11d4344dcaa9f67c1679ac2fbf77056694c5f25eb29f0a6202d72ce4038166cccaef151047e04e85c9f47df5c4634c71d3efc7e8f917bdf92c8e690614eb518a10a26fac7a338f142ca1f8fd42264e8b2225b75fba603d6a096b74fee1615c2bebd58848eb0b80d045686570c128d35d8b4f0beb7ee2525ca15694f5f2494d586370aa0d23d1eb621e320b75c7d1a38f15550cb3cb05c377fd381213d00cedb8815b1b23a9eb9671bfe53335de8985c8c81fffe02c315a6424f7367f021304f44c7f23b105c349a62e6b25d78db843b0ad962f9926ceddcb1e7d486210c55ab3cdc20cdfc0bfcea975aa29845dc6a3f0cba0e30743441553f4b090e38389b69e0a0d1cd76149ec219c8c8764d41b6e302b2662520afbcaa5ad7a562be2c9e25c0d499dbe70c86ab6a9f8869e7c1f6b17d311f5a1035cc46951c2e161b5eca496de5cd5bf75a41111a6d56f5bdd3b644ecd47e41cb7cdca46e9707aae855ac5f483300dfff944a9da9a0d8ac27dd51f7d21b277edadb7a6 MD = cb4309313212a09afd1befe509427ecb3a644a9e42c63d74a216eaf3 Len = 36152 Msg = 296cd04c4d9ab493def7aeb6841a45309e777028868efe45166235c56b2dbac9e852b1f37e9324332b84a9dec13f3f01e95a7af46716e032a0d9926759df2fcbc12cf5afb2c52955341fb90543d8215dd2a58be90f8c3af4e953289dcf38ee2dbbe2e5a770988ba100b12853904bb1ee5f40ec2f0556d533f9b6418d56a0c196df5cc904407411be97203cef3202b8599a13e5edd1de7998d9ec235f757f6eae3483e9edaac1855501563e02b163fd498b07bd4bfc8aedca90db163cb53dbe1ec23d8c8b37e7ad0d463975b393d84a643902be720dc4fb72266d644c9d42798e9173fb066e4e518f6fb32b2b62c86552aced2e8a8cf36938a48853b6b5f667a5aa0e7f85d85e3b8384aba691a59b17bcecb156ba027e00c311162da385c24f0c14f45e30fb80328f8b08300ee5b8284a02347e2bf6cf88bc75fe383a960cfb6bd70fe030611afd5e8eb40fcaa98960a3f560ee05f04dc9cad828bda46f3d3169fc454fad9296659694968bec79758770cd1ced6f78608b96437c030898bebaae8980f1ce155a32e0a696ee9ddde46458924fc491177095c8bde2548f9af65ee389a710bc71d02ce3cb9c7e045e3ec0044de3bc9454e5b0074f42f660fc4ce4b001a2f29f315e1a480b90854a83ec631b06bf1ba0b828a4fb008432a5462a16bcfb59df9eda6ec6b66e5a4996d5541546c3cb29dcca9f394dd890508301f7bab07eb421e1f667f6d6fde31311dbdf9e2d8eef307112b336a5df4e9824b41a9933939bff910cb17350bf112ae21df5c5776e13768718cc65aa1ea752b0e7fd7bee41f6c0d6a5b405cbbdcdd83323ff53cd6c1f444465538c059c81c54e2207288890adadd748d773effd006329766311d68efbe2d380ae745e61c63a27eea067aa88a80ebd7d858765899014ee9d8bc43bde90985af147e55b765cf963d23001fc32cf2bafcd2307d5696733aa20dd37a364c4ae024185a7a7e22d4a29571fbf25950b4bd6be1abce6a36b088488c331b727806bf2f7cf81e8ad1f75a103d667ceb942b75adad26e414186daa55ba4791f2fad19539b8f3cc7e01cc1f561bbc19ea75db862a9b3e58e4a9ff33524e8d8828431fe4cb52ca0eb820b784af637973e66459416b226e874c79d995b68f616882ff66206ce0e75fd9bd3e0cb4cb3af55fee0939f7d91419bbf6a153fb138fbda37e28fa86d9d83a4345e419dea95d28c7818ff25925db6ac3aedaf0a86154e20a4dfcc5b1b4192895393e5eb5846c88bdbd41ecf7af3104f410eaee470f5d9017ed460475f626953035a13db1f2f59f92ffc3ac6bcb9162bdab55cf4f6406226cea89493c168d1ab499b1295c6b74d7f7d779932e01992e910caff63a05fb2379c45b068c9bb92392f3e2b42d5456bc4cc2f833a6e7a4a30e835e058f6b891dbee92fced00c374a4bc2ca60ad4437c71240b4206ef4408a96cde47fc81b4c7bace77bf4bede83f95f84bcb144c18482d8df31dbfebde92fca3ae7b77c8bb1b7d43dc43a91993bab3ec84e189c52c97a110cf5b8de8b2b0d0958bc6f0533656cc55a9ce300a2aaea79fc03290c5e73174b487459770272ccd4b5e6e8fab8b404e0dc6a9074a17e31819e50452d6b1de4f820423060aa5cd9ccc10bc7e5724a1ac721c1c5861c021af63dca0f77ff265da802c3d013f945ae52087f8e2df67418e8d916e48d58f3014848e4ea649128fbcb8e8dab1955d9c4f50ad6ae6ccbee89a640ee90130ead7ee84e25687ba79249e3221433e96665b8363695aafa5905d7b027cd3abf93bdfe56cbfffc35c8fec27f5bdc1cfca185e2961a20f68f24569d76cc1756db9e911a2430f9282b7bdae0009a69a8cb8db6fe85342d2373c45d457acc71770f75c33cd11b957eb516934d076c2169ee81854684030eb4409f766a2c87401dc3bfc0d0edfa59627b4fd444044fb7f2de235d6523054a2b8e4c5e661cbb27ad80e31690bb4bb975d68dfa7f87c371b602f9cbd4e2b963ebb52161e3bba68cb8cf6630d6f98e3a1b6f379259f2660346056b3d1033ade0974dd53d4d99f7e3d217dfac2e09305fe5adf3185dd485d1055dfe4da1a6414490c0ce2d1e281db16bf2b5e5006ae09f470b471915cec16f76653969f3ab22047ab672cddff69699e8d87f77f8bf0d7cc21f8a00fc1197333bb3830e90c2aea4b777799bfd85e0f1fb4192e17146257ce943525c8b7d85c0b7d191c8038d75b9d9bc392411468b5df5c6969df4c0a7241f2f26a84e430b9c6d47bc12c65be59843dd47d295b8f4327ab0011a0d8f20e6f62b8d60af02972ade7e887b53be9cd4a8630c34057dca23fcc658f226322149e0d0ed12484cb6f08dfe7d6e2645fa0359d61cd4eae56b86fe520492d93a06d171a7cc398481f991fe301167c8528b88eaaef021b08066eff1fbaa9891076ff22b28a142fe32cd6391cbcaf4b494dff9cd760c96e0ef2ad36a1ba16fd83acb406fdc12db1fefa0f9fb2a30a1755d55ca94a3e8c1167245b5e94a8f8539448730d22a874e640922d9acc3b8da854c8b6fb2b10b2cabca461bd1f0db651ea54237d4ac8529652fb1670920ea1c6ec2ef7dba35fa362b578a89b6b6fbac02ed7ae9f9ca73088db3db4692da3af38c5100691dab2c6a1f9aa17429f596b6707dafbbb41cf74858461edcfc5821dc78875cb65f791854e314295f9e45031101e64f21960c88855f56eabe88134543bdd662e9f2284473304460c0762de74811a7d7b002218d2c0d56cd5fe8a40bd5c6bea1786851475161bc063b5408a9c83a52d7ebaaf49bc8ecc645357082ebff1db096e6345c875c01db7824ba7dc11de647de38d2ee3ac86845d0d3b2287c1c4d4cb1b7e8d29b0f9b3345111be5d3c5a017492c2c76c0c71a25feaf400d12d9bff39061f83be8e88853eb74eae9483bf241b74a0a46e4317d172d5c9cb976a3f045a188e4f0f78373add9f4c9e0a4fd474786f71ea70b940b79fb301ab5ee0788a3737121aa4d4cc7b19ee51b74509629a966c7bc4fbd6b4fced6de5c7b0f70d39d64cf50c060b10effb8da620cf17313d7a54085896023a4965ebbd481417c8bb41407d4cbc86cb3f8a64930230e309062e0d5ecec9a59c460d15d15513a86fb580f9f3034eacc512cf5b5f85eed3b29db981c54f1c27a09aefd368173412cbd299619f5845e4c511d05b54d09351f3a92396870318f00fed130ecbb6ffbda4b7965fc874279895e4974ab80ca7c496d37436eb114468b0e97fac4359fc12c20f7edab77e7f2ffb322c12d460b09461c2b54838a128f84d343d971628b477ec805abcb59fd211c0a39599f0f538281d1eeeb4b7dd4d06ac7655b58c4cae55ecb231ec08ffaaa5ace0dcc954f3c6ea92912562b0eb3afc9658cdf0efed7215884f0b52f8c58e55869109884781e34187c1643a6af37740d381af2f8532891d89fcf1d6cf1a0789185e22c012c71595c556b2232f1e8d3c2b9b035a98447ad7b663e960d3259ca728ed3158feeee74f15f9180845930356664bcf586e4bcda9d92cfed84e0fd5187fe93d38511eded53d529ccef57b61f84b3b1d134f6e0bfdb8ff352686ff3a44e5f84f48537e84900508495e87fe3089a413f47285d5bb3a1d829832c41e549321c26e704e3760e837c424a04343f771377a5d5d57a965c8ce602ee44f93aa6efdf0a2988870fa46992d377c71733e17cd195ebc0c12910f933fff257187c43b3f2af3a84a52db10f5ec89db58b58ee52d980277ed37c87736c814db70222b63b0176a88dc058ab011a822a341326d42219e4e77424191687da274f0958b664f18600e2086b08f8cb50a0bbe741266966fd34ca25357754a3275274a28ebfd663fade858907c730eabb94b12397cfe4ae0e103e167a2fb851beb36d37169790feca5fe194190bd9cba5eea89d898bfc43c6d7b1dc74aab8101aaa871b72e61b4e9f05a49e315f5a0a9a1f10a988f306d4b22bd3cbc760da6ab5a850e44623dbcfc3704d2bc32a4814129677cc389d9add4a5d0288c4eaa5de3a4d6915e2b968fee22029a151051a74a9f54c99fad43eda1a1bcc77ffb090c6f30a2e24eb4f29586585e8b35d6847a8caac0d87524f59378bc8a03dfa5b21d18a5f1e95c23dc368e82208c66adc562cef3b4918c167709229e41c2f2732ef6a6abcb8ecfa1d9dacc474e84eebd9dc7da2237dc2eaa52b567f0e9ee028e0401e1ec39b9f15573e90a50f25d162d931176de52a1a1080d010e5a8b6e551ebca4910d4252086831cb0e4413fe262630a86bcf0cc82e593054e1832d2a334adf497db9ef415d019be8a0ccba4f66cffaf4809e6d391dc54415a614da0ae63af4576e96476e38493aa88a90ee381d517b5e7ff37dddb673d0ae26b497f6b51783362c4c52c1e06895749337b7a195d33b4c2e75459a418c5c86290c6ed6e709144d7f8418239f8535b2826a1d72147ec12757cdcc590537700577c46692c53730062fe6a27abbc8a0cc20d02993e3799558c0a31a034b9d9593d783871297ca5ec80319f7b07d5a60283512e2ec4aed3f45329e387e5be5529812f1da3fa5e927fcc4c61fab2d63fd3089d751669002475874662db47d38307cf0b766ff36bd12083a942355130afd4ae3c87ce7ffdf36f850a4018bf9beb6a7397d343b936ea7552d2c0a947778eae00c8c6d58ddad948c8c00bded169e6c82b5ea4adc05236e4b6535dc52a0d54b59cdcc2ca27393e77ef12168c11d01da732ca7b2c8d204f052a958a176d748a91dec30bfab09bab93547b00aef560e89e3655c74e9423ab4d3c33d62e864f98b94315f305de74a91195654ac5e09ee003b29b096259fed4234798b27908f1179266602879f546af892e5b654f87ec8c7e1404b22662f4423df94eaf656a0b8fb3b51c0ca589a427508be7d0da4fdc5673f72d61f933c68de3adc04d922de159a3bbc420372fffb90e3a752dc4acd0d67bb87f996940c81fbaf187ed7dc9251dd8e6d3039d4ccbdd18b69ddcbd337c74fbf465b8e51e7b603a51203f86c04934d9c2c31756648afc169ccc5e125831ca8b278a50fb1172f7d84903945ba7c0470cdc3edbe10bdfae7e397b32629f933f8fce57e229fe315f1b35bc8c5ae42ccd18af80d1cba71c5cb62944ea3c7e035ca05558fcd009290e79c3b5981319d12f5399539974cad39f64f893f5fe88249a33490801abd6dc7e8a6f7947f29d7fe6644601838aeb97eef103f2d627225980df35df811bebce37b395920c98036baab11225306c9ddbb3e0f7ec1b54f12498faa869fb9ebc70b29bd27a6671c036b4c0aa291098361196cb20da35f659185b2bfd11e1a2cd568799a2acd5fe7853cd195aa7b4ac58cbf0063b67a689ee974fc9b071d3c6a2f22f3392a3ebbc70653c31c00b9d078a8d582893feed9e0643df7a6f043288b1e601f00efa083a6ccd8aa066df2a482fb857b8b71a9b91548092b485339e579e84a8658409cbd6b20f40cbbb9cecccdcef572d314501024deff1feaf9a77b1ad509afaae6da73fe4ace73a3acf7523f684defc8f08ee7f56e485bf2ab33f3582fc5225caa01ac47929066260e123dc213b67ad2cc084570400b67ca2f88541a3ca568d852b9712d405f6eaca6ca963d15589c597269327d9b71ccd84d4ca64746d20884a6acc99b9b66129d3dc46497b75adcc5a857b604c9a21186cf28f1c993748aca7080bc76eccada619babafba41e4c37f377adaed10c5be3b7bc33e876bb2771176dd52a77bb64e608825808dfb20d8ede77ca520b9025b5e1bc6946918b456c0816c94169050f702ccdadef82c34a3787f0220850b82715975d8fc57e1a3af4159d489ab73c05cb02e74d1e31e48ac88c9b75105506d879352a27d390da70bfbc6be394f6b2f05d07898613617857c868b404286ceeb267479cb1ff7e5e7f05690d2ade8c2c57bcc70f097d960129ad88e48fbf1cf22d564b4fcea7ab18ce9ba7eb7ec5fbea9450adf247ab541188ee89a75822f993d1ccbc9dde7a8b9bd7b8f5a16fe9da804ebf48cdc12b001bfe11d776fe1277462831181151d6a44a3303dea96ec89c8fdf6f041bf68b3ea2e1adeecdf20c0aaba939ea44d95a99b658f2cf7e0bd0a65bded68c47583a7428ec195c26d45e4826cd3dbfa2c554b072d20c5489b790ac86b58c3dea76c7252065ea9c1c05a7a43a0cc2e4a5b6739ce206c6ea77029703a30c06957fd29fe62bf7a82b1816669368004005e81d25c3868fa90da07d4240134abc2f71ec431bae19c885a57729ba33105bafc479f9b8f2d5294aa07820d659ea43686b344f5a1934d2384eb85f7d2de57c2ed55d5dd1996fde0df193b15b096302dcb63b23161fd14bbf6e5a7650aad8082f9527c0c20cc82de41 MD = e747c2429ba8fb94875c77f8c0b2d0b5cc8ffe8d92ff3aad800e1e1c Len = 36944 Msg = 3239b2ce4efe4f6a6255dc53347400a6446ed3280c65422386fab471ef09eed6cb94339329fcb037287718b9babe8cc4a806bd52d632547cc947929066203365fc6399eb85b326062927ea9d04fb7eee29862f24e76c5f2b4b1529c3e55e44d3cf8e2a00ec8b797f6e4e99279b949fcbd0d671c6c67c2bd7144ec230f52be8c94cfd2ffae5ec7049fed26e8106efb704a4dfcb61fbc880292dd8a5ff1defe6ef7a98ef01f93ed50de19db1d0cd768e40ad87851d0fba26c99d9d1a59e61207ec6148b43baee96e722095aa3f7990eb28f4b7e62189b9e45e6c836966d7fc136909f3c4d38f550421c2a4a0f391a4976380583796f12c8490a274d94d7815d20d7b8268ef21eb5ec1cfb1dd179d1c5b9a5a50c1a3d07dcc094857b33751c60b81bedee8b8ee1146fb50a3a7d1255ffd758889c971ac13856e6613404beb75886cdaed8c557d3082774c644749b2d5459b14e99a281056776a0292c5b2cd8c0f77d8999cee56b1dbdccbdb05a9cbe6fdb5055a7bef81ae69a326bb8d937f71694abfc95fad02fa19d3d5f02816f9faeb6a64c3b3ee898324c1d976df178a8e5e8c97651eb808750403738bfabac379d963380b8b4eaf3d716d24ab02657549b5e568542137f0896315ac94c1bdb1cb8d48891c4b377b44164f0d423fa7c80c38ff3b80b053439d00b089f3c6474b58cfc060dd3bd07601db0e9f24de020c3ead7f17d01333871ba17d1091517e1a896973c436a24227da8a52df3727a0c846dd10052c9101476a0f234b54a98da5c4210abd0fcab41738e9c5d76461a9848e90580c7c74e208f2124b4225189a7472c12d5350f94fcc84c20d8e94d645c87d8dff34a80200541b719dfcede4ce10fc0f838fe2783bd024dbd20cadcc9a1d7b9eae85998483b24df6c08192565000c8d4b578ab8f9fab82fcbd5a988cd30af0890d08354193abf0675dd9feb649cc40d76a169485a3e304ef757f3e5e16184417c3c4658356c66c8d1b0d174ce0fdcbe24b7285a47102147ba38386898bcde01079c11290f78b2930a323c75f3e1ad0bb009367322e901967ef6f57575cb42a3cd60822b29c8290189c26f4398aabb92b3082207805137b7c004a9b0eae528b6383a07f2e6e34070caf1b8820ed39edfa83459abe1c15a1827f1c39f7ac316c4c27910f4f9428f7d6840c6a5d8f4bd4f0a3e6bb4c9b1df54113ed195a7bd833c06be4bc5c36e6c93cc20082389769d6d5356c6d69abb4de8065c6237f46cf4a87f7a06c9c7ef7e3071200b8f82d1b5b70e4e0975e7460c4091dae3fad339f176972cd095892e2afff1b13f4e77beacb8a554921741dac0fa2e2ae552e6acf042e84747ad99a2f93eb86411e4ba65d8eeb33aff2f0ce1d28145ccd4d4814e7779dd69ca764bf67f994fa921e6dd9fd0c5b241bf41db13d752634130f44596fda7f104d7844281148c3200fdc953a50aea2d0930e42eb935fa21288836a60f0949cda8fd5bfffb5e83ea0bf410bf1e0da87e12228a6a7a74f4e9d35920152f20dbcda6ba61f69db41cd21ab33162735f9d4fccd2b920b02abf47e21225356fbada7bbe8d3aa900cbb3a4bd99bff04d5744fcb9efd4e3f2bdc5a5d541ca69595dc24230f44a99ccfbe4cc753620faf4ab1c1f69c87226caa4b49e0d76943374702fdbbe7e263b5adb2ca3d216e8b511c1af125cfb156ba085f88b2b1ef72639987f82a789322012dff7d5449a9be11d116a9ff40643150cc7fe179ea987a4114d3de18ca402cabd70d2db5d5faef18f30caf2cf686fc577e151ade8b4ba5fa3f4e762fe6d2cbd93344a108cc48658d0a66cc55f90000f6a788fc889bf039b6a3618a14d32f44b4ca0da3f4377d69999c8bc82252bb8256ce404f20226e7f9cc672e0729941e26323cef9211d80436433e36b3a089ecd9e7ba5db4d29afbfd532eb42ef41eeec0ec6f06c3886393b1556d67d46239028f7361f67b8b69a41886f327633d120a9df3cdcc4e17b9099d58eccc5edac7bda898816bd08d4174cde03b144e754be62fc0cf9c9c3026da4cb612d0cd8aa462c7bf8f2a3e6880e29ff78ce76b3cfb0608dbeae438726b8a52059611aae25d966f60f1be2fadc67211256f3d23e4cdee8bbdb65f9d4ec59e4fbfed0b718261cd02153f942ebd70a7a4023872231d23045adea85b4535e38a985d7e3abbeb3f7b1254ef48a6281e07cb069f22c336a8ebd8d73763cac833e3ce56c00bd47d752532988758406e3cf718baf9bb9ed1be09a80fe9f59866351e4444591b75c9715fc5688e2f68004c09ff87eec9007ed0e22b0146ad389075aebcaebfc5fa4fd28f5d4d6a5a977ed9c4f205d4c7b28e8009e453c3e715e7642979ee5ab7ec8107386cafa246594a449ca2ad42340f8159e5567ff83fcadb8ef31e9bb04db6fd8def6607cc9f17f33b1553f6bdaa8217bd1913ce4a23d1dd64b00d2f67140425e528fc0e5fb17dfa1ba3b87abd77b48227f98ef7301f957d73d4e821d5873e8a9b5970fbd219d5cf74ec2291b8381181391b4a63409fb03c3ac6121b8233d0ac1f157788aa54c9f3c54344e4446813655f02a89b0220ac8a38283d64f396650afec1721d6eeec5078b4d71dac89454df08245c26eb5ed4e7ea6f9c96b02b6617a901f3228644517b456f4bfddb29303ed314c76f6286d3e5c000e2393e6f5e62ac3b6d4096f1e9af722d25b5f2b340053e486d0d1e552404578090c504dea86c86f252e007741844900bb1ab85af0ed2a833cf5865264fb42f631ab299f5eea5b7bb56a95e4747bb2d8f52472a98e727bf5b7109dd96a185a62d029a64419baebcfabad501e80273b92c9a0147fd8364d243c479fe12e3e96a42cad4fa5e39d81535222ba8d2d32eb167fb6274394e2a8f716c213d17616fca48d60ad28843b23eff1ee5a9a4241cb4c5f90325f8b1d94568baa81130b48974b3d6a4736c33ddc8bcf3cb8ab89ffe11cb153bd3a85901a29e527710eb57b6c7f83f2a538694bb10f35325d2ac811376fbc2a513c4ae341586a606c2a3b578529a62050943e0cac636bf8d07dc822d52bc93b75cda1bd12cc637ef9cf6786e932ef1dcfb40a29d46fb9b7990e51d8c13a20aeb15553c6936b17a8a165ffada080a611aafe9549311c679741432bdb058209ac8d3c29a7ce1ed007eb54cc77b3fd13246adca715cc50bcbf4f861dd4a9edcc5d92eae808cbced4c35f059689298f7d7c96b50735acf401584b3ef06bb362b0e847c85b9091616d0385de258e0a202e44b6f07e50d9f17f89bed26c472dc8fe75343c49e828c1e0efe648402c5e976ca253f7d40e5c2d7b7b2fac59111e09ff2ee2af79b898d478b109acb10b2edc80bef431d1193c92405526337f708f0cf839d88ab4a7e9847c6e76703ed481d7b2c121063c16810715402bcfa60d87b934be9e33c25d24b73351b6feb02f607049d362dedfb034734164c7e8958f0ef8fae6bd146b835157e67f50bccec3d28f8f1b4021808d5cc00de881e6159f2cb191d8bc9377c1764bde23cc146239df1ccac24237e85501d5c1f5e232eee5eacc42bd231aadbe9d7b6063b36d32388fff43eff189dfb12b9aa5b27132e8084f3155bd7b10d623cdcfb7678c2e0869eb2042cbd37d2d49e3f70048b64fcab164c912ff4bddba970f2f2a58dfc1aa74fa670e7e727c99c430d41cde39f15e87307ac0ac1be821c36a83005e358de000c5bdf12f56efecca1b193f9d83816a33bb2da9eb749bd34ee6b382a014fa74b552083107053cee05abaeb2ad1b65b75c0dcb13e5dc5d97e18ba7f84707702c3dab32172d09cd671ae87bbd3589070dab2f3a47c2dd9737246248aa7a9357d23dd821ebc9ea081fb4da69a75d56ce34c828648da9ffaf79be727cdf6242172c60dfbff5052e57de798a5eba4f0921f35a002f2cc2c90e2658c32ce0279b18034bcaf27c075f216b11ff433c302a6a1309bf856e36c31c06995e41f6f026c31ea9a1a4caf704cd8f254101762b41105d7f6e4d992d7541e02a4aa167e56c7e47206abc25fea6c5125d597eb065d77b9661156ff6ce68e67db28f367b30f4b244582f22d644cc70bc604ea432097312895abad2cd422371a6da36e67cf646c8defbf7be25f0fe3654d7285a433d9e3ffd10676066b12e4c214a469bb062eb26ddaecb78592ac57fa469f0872c29df6ab92b2300084212ddb6a9c73c61996a36091bb238bc1ca7b372bfad1536f7bef98654f79afd1d568e2fa0c2b1d5c64b5f2aeab4e694eb2e3a878067eba6ccc3552c33e9178b6b82c653d63de2540f170807c3d96a2ac2e27dab5526f1c7d377e6736f045dfb541fece9f443b7289c559b694c2aacc6c74ae2a5e6f30fe031611423b04d5595ffb46abaa1d91898968d7f1830ae94b022eed23fdad52d38110a4803a0cee7a095c9a78e8609edeb25481cdc156d0b2ffc56b63fdad5331899f8e8dce58efc663de60b2c4ada1e6a700cda7da470f78c7d0bf46e8dfa09c8f1b55e7627957a2d2094fe5e9655935da06421c284be4210cc94f6949c4c989042c910990fec4b3e655ae8ea1280340cdcd559745d5fd20012792279aed3c6b8b4ba680d449a55e135c131996565eabe4de9ea5bd95c91a77643e2e46c987c876e12cc996fa7825db8504133380c9bbc1b273c3f9ebc654c21799d9f7da2a3469958a607381cb8fc158f8180327b304f6d17b7e8548738363aa3ba708bf9213e5c155d1d4600e10475065748fcbc92bd6b42c41ea4c6f1aeea49a3203ba6e0b4e0d059a4425be4beff3e2c523dd7a74e3f2fc9a8368078fc59f4bf7737b0c6f34c110263d335a972dcbe69679ed2594c0e66304fb1bdb568ae2b763c271fbd42c961c024a2971868330e744fc7b78ffd03705fdbbd85903a12773039b2fcace87f46fbad578819e72db7b7d25f8e31ab43d4c01403e1f1b9ac5f5534814e7a2e954a1bc799119438f24098b70f5d269cf91ab9c12bd8c02ea56b4df63c1d115c34f5883a103971a4a93181c87e2e58184bcbb4acdd73e5e1242381478a7158ba83ceaace650898717b13d9cb5408ae69616e189bc0b9481a521057ee1353378fab5dea4b4086f1e78f6c08893bf410d6648b4d577cb2d12156b938b580ca9625d32aae7848bc65500ec776cad9f866a67cabbba8ba66693d59a68d6279df5dc224be5f1e26b1daf21fa98b56d61f9822d055ca5522def6b88360bcbea59974afc6a06605826d3917eb9caff4db6e8f928911e2285b2161d8fb6e2f91ad00c434e05829f502f96b0599274a6e90ef313ece676be70e3793e6ea584ca3381c33989a6f12b6515c570452d3c48a9ca9676dc8e0cd5be229732977a77dbbeff6aa251d6c880f159ee45e3e268511a8a41a689f03704c80fee8ebcbe229a37a95122191d7f2caf7c8fc5984aaf5ca5be930787a58bc828fbedc720d91b721800151d51e39baad9ee1863f4de77c7f5e7f93e381681ac4b8713608663d91fea9435189ea184781b3f16956c06483f6586e29f1debaf0dba320def3fe6d1e019f62f88520ff010ddd018fe706a970f8f2bfdcecb6d7a790f7d3bb7bfca9c6f407663010e673501bc517df39463ead4dd479921a3445a8a95c90b7ea8979f19d8c58e07364fe9c71123e4196a9aca0bda5a435c57d8e5aee7c61b986cc6607c6d43ff0f7c4274dd86d7b9d44577ab3100d49ac33bc392429fc4daa99eef77035872347e12b76cb187ed8db8c77304d0db66edfac17cf7020875c706916b595b34e0ccf7cc3747ff9ec5ce4b63156d57e451eb67ab6d7a59cc397f43f6d26dc07d1036f0fb4a8cf43600f9e0aaf75b529655e19e4c2d92a6558051e621bd4aefbb70f0fe1269b24bd81faf2d0161454d6bc38f031635e6943efafd71c47477455a839973b40d3e731f824c84f91bc1a4ff2b323aac0edc9fe309b05b3190594de4e88f0652ada7e656c9609d045f46f5bb0d79a97020eb25dc2d39170ba98785e4e0400a70d38532186569b9b5d44bbc19ead3e4050498c2a4e5f649b5288869d53b5b0491173cc2fee6e68f8ff34664a633cf5ecd327c02b7b45657c085b286203a4e9925d1553564be5572f544dd8bea78da8e4b32fb429f28f7b5a059bc57606d891cc1aa64f5d45c44f8783167ae514a6407117ead1eb5a45907f71cfc4a20559913d6fac280d85123a49b418b2865091a3d927de7f3b5c6d8b3173808faca830d22d85b1452eb3d7ffbe11d9e96b0356bb640d9527dfa01153b933358d5c96643be6833c1088771c862bbfe3885ad6fb6e5cee972fa0cd38d25fda76267c78fdb3af92d6f0e277e8b7dbe9bef51c708aa607f56a01468bebef6a90ccc2d2f50424cfda054d055e437a15b5f09a797b0a4aaf47980399843192247cbdc928b680758f825490bad235b7204b03de389c84429a0fa99f615d12a3d3c7d3a34462798e37b3481fc77bc75645d47f28237dff761073233c65c1960bc09896b9eea2f7570f946b63f403003fcc78eae200c683ce5b9b90416e56c6b0 MD = 633ec87b5455c12af54a3edb3589b8fa32056ea686b9205dd980477c Len = 37736 Msg = eab3e88d00f2f164e92e95a8c9cf3391037969944fd5cc400e95dc66dbb2377c63f80c4376c5d3a85e0e3be86fa264f8dfb34f24d89293f6ccba5159091069fe8d69eeff1b4dd8c38efbf9216eac33c8c11ce7de2347b0e7197052e9a368edcd100d77091611687c22fdb799ed7506c850bd1a09597c8ddb9ec0c75cd1432ab195ed8da89099ec9cc21c5d9a158346c1359dceefa1ba919a03b198fbbd288872c40f1926b16ecaec1561d46a0d605c7c17c4ecd6248724ebef4cad0e8c9f6fd7447d04c9a0176c31c4d30251fe94aebe9f3b5d070a6eae970a98eedd693047aabe3f34da861c3836767ad09910a5a652750907ca7af49767fd9d44af7a6478b1d95b93a08a0698c2d45f26886a1dabff4036d4679ca34820706395cee7c26ab53edb0865d55cf39c8689ed683584248ca8cbab259902278d0af3cb80d9d3867d94c67a6f8ea6b18d33000b7f98607bc257cf734d99999d757454cc0e781d32d38425d308de6d395d83cd6a16bc3b1769f24a1627c3f1139f568e82c0eb2ad77db6fffa76ed37f5d420f7f074c99c604924457bfb4091efd456aad3dd5b82de44d15cd701e28f4cb9af8687e3e60cbe2992c68a1138019adc1fafa9afefabadf07e4552f3e6faa6d6db8316a93b1299d2e7d82bb0d2ca7d7f57a5eb7cd02fae4964c0539220026bf149f5850ff136590dc98046223673ff85a794818d259648162cd8c228b92e04d3a4e4bc5d300066a0e1c8c3ad8d8487b5b685522a1766e2217d9287fbd806d7449259a2db1ff92953d6b78a9aff867fd82d7f489ace29e63000f88a53a6134d0cbb5a21d1e7a808f050558431b3004eb6b38b4a277166bb0c5c11b47a4bdccff2c9f22086af956c3df9ab97b9d27a5c17f1b0411728a6c97d3ae5ebb7eeeac3bf61268843a049be0476c0ac7c837c11c38ef613b31d70784b427d1851b7c3923b2d003f50e24b640b729dacc0ef8fd5813365a943754c303d1be02491cff1a52ed5872ef59c23c81b93487dce3d3a101b8806eb0f5bc2591c6e16f5bf5efc636001c33d7af75a50fb81cb09ee96062a5734e0c15ef55b5bb0e22875238b6a339958bd55261a776675e52e3667227a8bfee0fb147a6b9e9ec1201d8a047fc57fa0827c5c422d02714f6777ee83081e9bd83360caa9e6148b17cffd1eac6294ae3e28083c165a84d952aeb01888717ac3acd616cd348e43887998d118615b60283bf26adbeac784054663e09cbf84176944702503638ab5feb123a0606c92b0545f87a923069c8a5ff32d1062706a7cf766aa96567d03f256851772de15300c9c7190cdfab1021e4e20b54751e34a31d3db2c70adcc2080f6be1d4f7aa35dfc673bb4df4a3521c93a97a38d535f4dbf676a9dbbef960ae94824dc401c6040091e839ce6fad820128b1e9eea4f2e9bad19dda6800624e8b5b27efd4cac9202ba2712efeaf2e32782aa7e4e672e965b8353fbeec6d9bee36a9e96277c1282ca98ebb056f41a9e609ffd7f5c0bd6e0b6ca7c8b1e9550ab2392733203d73678c12ad224790a5a50f1f4ede870df3053d309fb56ddf55335cfb4991b386500bb0ff84538ff379a420206e38331e92439dbc83a24d4efcaa20f5978196f2e5995db8aaab29180c2bdbc5f451648339bd8f58fa0bcaa8a9d3b0d0878f3503b274c4d696a5bd6efba0746867c6a5cc57b7a4ae795e808cfb548ee490173829354298f1ceefb778b6a68c903f14716a5ae650157816e96c4f811dda47b5fae3ec674c62b9d5a1b5cba2a6d5f0b741edd1ae14368cd17fb734fdd00a24e807b4567751d1fde3f6b6b9394592131bb1b75a93838a0dfabe0e4a2f67fcae29e92af1d74ba7e1b740ebfdbedb6d1cde2b67342b0078a20f2ec1edaa283a59f819a84d2b8c5d3bbbfad607c7eabf746b296e1cc93d9abf8b4c829dd2a34b9eef03ccc6d8a67a326e9f0575c8f611c04f363c63127d58dd0b81b0d95d6b99135b42090d632c778c3ba7eab656700c76f6dc72b58b524b70ec78ed2e9ed3bb2dd95edd8f5f80fd9fcf900647d50af81efe768172984edb11ca9c981c0b9e1a64f5b4caab223644f38701d8b8e9096d1ec2bee928cde5904602673220480d4f4f2cee410f5fdf061e0e57e277f70de3fceff02a569099037440534bb9c8b3b242db65e11a6ccdb975a21cb403838af53fd2c4c56a84eb9d22e10b65670223fbe6ada61b5add94d790fecabdfa1303096e17a73af31f5fc5d880d9efa688c084b10039605f26c6d90670dc60aa2a08a8fe2b020b8ec468261b9c597b06c13bd5387f9a4085dcd6363cb4ec5cc23cfe4c76998fa78c28973662900477f64fd865c368435c7d743587aa175502a0c0667c4dcf8aaf79905f7f24086566f38938cf0876cee484617745e524b0e2e458d3b10a599d73d5b03348f661e6d88d01df796e17879959492de964798a8dfb6ac87332a432a53eecb55c4039234d314e3efd7ac727eb6a7f9bfaae724c54548ab73b3d5bd4a403ca580197fa85257ed2c9b395120a4b169973e2399b60e69e1d1291a0dd1e10c2bd9de174229701c41422346364a9490c0b38488c7182b526a67ceef394594c0a5ae9645b4dc352bfa6bb086c4baf65b9694b861d810c308ccb58dbbc3e20d62916dd02c3e8b4a8bfef06a8063377118d283033734677e94ed038c051270f4fdd65fb65246fc5644371978bc7c88add15cc88d9043e506fdb799f3558eb7f0965ec96d4136f8025f8b2d02c27576538d1cab7df76c51004b11beeb339f7eaa3710f620817447f6e3e476321bb8c90b55fa74fbf11a741787e2bc9c28ad8fcae7d42df5986ab1d9d8293a2e4eab497c30de6a3108b217f1b814d92dbb20b0f7af92b514107efe534742c21ee3b8bd4f26b0d645c39d0036e68e5ec67560aad99532d7a6711af50e3716562b6246ef2b3f58005faa43f88f19389391ddd54519a49ddbd341a560afb08f3d7d54bca5b984be30a8460cc6a45afabfb37be8485fe1b909c20a8705e1ba94c13b4184a8a1fccaae471e61341cb0bc2b57d7ff7d52566fa89c5327ac4a5e0e288daf05c08aaf65c165bba8089f246620a37a84aa9b0aa80288a5ef1f92a3e3bb9c28a7b41ca675b32aa34b0bd7bde0e4bfebdd98e2054a5daf8746256292fcc29033d24e00e8e3cabd60b005698312bfd4b2740fce503e0239819485623141859159ee54de7d984f477a41be007ee5fb0a58afd707f26d394d1b4208398a9a4bc520638f5d6e7b89ef7764fd42b73fdf8864f8b736f3be4a13deb6768fa5f05e57139ac726c273c2dee1838cd7350ab2775eb678035c187cb45159970e8829046db7f9c4e1816a403b3f053168002cbdfece50e21534651858fd93325c3d2f863096e94d35b4474d2f1a52b59d218f48463d30bd15838c662668cd1121cce82cc737d32cca62f22fe2f9d2df1d9f199a7733bdd1aa5175ae471c6dfa063b3e3d5a221d274993522e7b64ed799182b4fdb8365fe67da70838e3a1ddb6b294180313e031075a4f519423e30b49a0d347b731d07ec3358c2d4b217d830dcfdf5dc418f87593a49fd6a701ff9419f399b9110b8882317b09cc31293ac9c60222f7c991f25395d08acab13e3ff0af31dcf4536ee6d4f8f725cd30245f16abf567cd5aa75732d3851913f8012c87d303a4dfc58173dae050e818913a75d18250b5c7be81ad79176c539ac5734cc14f11fa62af6db6fdb12f5a959c92036414ba15cd3f497f92272d40475fbb2a07ea02e565585938a5323b842d9855913629dc8dc7232452e4cb6fe80310034bbf6b7f6ed0096e7f3b2c1d6dc6cfaaa8af895e289db33cb0d7cdda54b41e7039539b2f9c8b0ad41525677c1d4987bacf37fbe7eb3837b920d3f4178b43d22c7b2942bb777fa3b282cdab019d9f09ac8e36481fe07ef7c32b4007ce9599745f99ab28ca07921c304c99c054f4ae9da96d1438b00e583a805786cfa67b9c4c301b3f140555adbc78fdf36d1c2a608ad9f539933f7dae4a1b2f0d14484436a1c88a4fcf1368b9ccaf1c427b01489c1a63ad0e217736696dba383e9d5cf84ebd4f6e42229e489c940032eeb3ad554993701df9aafd406fec86fc7f3489a0cce6ec4d80d24bfe405c91c65fdac559513e27ce63f57ca3aa0fa602399f77429765c7b171aac4918b6c8a60fcbbf45d9b63b147b5cb9a68011d42d2d5a7cfe9998209217d71b109670b14892f1de0670f4a351055f4ff965b6084f5b914399ab984da260ceeb96fbb8357c760c73182953adcb2ad385435a21e92f24fae5c5fdfb5614786ea85ca6f1a7aa5f58290b3157dceb4235f414ebda09451fe3de13ff35bc70c532dbd226a19a5a85716a5047759329e21306de7942eb39b2d886f43debf33fddb7f087f96c8025aee4b177ca31730f90e74810b0f0f16574658af718629cea386a80eeada6eb64222e98e2382fef24c52f324bf168de70db07549d3d4e0c085bd6f786a1e54ece85cb7b402fa589d1f5575ff0d91ee4b45d3a7e471b02e302be69eee084ac3cad5027e2e20f46b5cfb7ec2bafc687b6c8817b628510359461e6bfb17cb470178907e06a7865981556637a1fc94837c725de469bf7db3aa2ce5b24f9cbbfb561fa13617c53a0fe0b0eae8dc6ddeca39854da2894efdaa690708256124e04f0ce7919479304600d0960ff739b6e126f9cbdfb9de80d7cede02102afb58432b6af7e7fef391b1129b2f5ccd817fa67d066f9b9130fa15095142842be3e0eb78b7782bde4f90842f88a259d27b6f33b9a69709924767bf4209f2ec8fe263e01c3c91e69b53d4c63ede188e6ef12f92c0226cb225eb6ddb614f38d1bec08a2b01416b9f9dc8067f27e6b8840aa967cb7cc2151db0e3b4734d6b3cb92045fcd30d0d2dde4c75cdb8d2e8abc20c6dbee4d3cdbad29df8e58ef0a5272f1d3961e02aea002b1024d278272b18d0de03dce7af8d855a52f2a835314421b81d63635b3f1e0c0f519bbdc70ef92837e6336adbf7489c3c3999a46ff89251de888ca84b34f2781177a335ad6f98027e8ec710c993472700b8b482442dd5e028c67cd8b8f1ae6dbaea04e2333251d02d3d8575b86ad24f2f390de9bcb956f61e3ffb9caa5d9a129012866d603f6cb7cd5a3742b066303b50236a82e0825db9495bd19c2a62fe901d58f17e3d7e31e1e54fa31eba6eab15ebde94f5b77132543083c57f3fe7210ee9220cbcd0d7e876fd8392b2dc6b890288d253e9496e1ced5c1da1edf2d54cb57ad9a0d02333d89d9d5ecba62043132cb0676e079f6264ad53932b904a12c7ad5ae675613e784a7f4e4818a18edf91bbea05aff6c03353bb9f4b2c0d4f87da1d11af53182790864497a93f4b2d274bd7bf14dc5eb4cb2f40c7af6b0f091ccd2d259e029de861d41301e9094d050388a6b6fcbee9841040635425b23c81bae707201a499789d57c1413703e4f1e5c925357251d3d37ecd04dcd17c73cbe4771d08a8af2af10d3c57155a7a6f88118af042af7c102d5462525baec73b8c8acb3b3e958c38c8742f94f4ff408f1352128e2b8db71e167058814a40c7e58a8d2f5d6c7eb85d7f50c5ed98ac02ee1425d45148837f781f413414212dfb0c365a07f61ababff3763183c348d74de71b1b64dc22274198c845798d68ccdd1a207fd987d1e00fb55d84edd8be076e14989138a160ffba0a720b9d5f89a3ea89c97d38a52a7523fd85c9688040c30ff10d25b4236d633537cce213fd2c59afe5a1b099b07ce099569f7d884c79808ff6f9478be4aff83fcb398771f8994499b839e8714c41b8dc3b0b2fc1afd0c68ab0dd851467b135561f486a3bd4890b347c025353db31747915494ea92cef1b7c993a5ce21f099104ce69f8e61353f40cab9bafb5df9499dc9fea68b3461cd5d22a804d799d3191b8331eb1e53782b59eb1564c1bdc139f83155efc547df2bc27ef5fc54f4491be0ce7e723cda3adc64737d2c6fa63170c193027781156f904ea521952d7b7c28c6f7753dd140a3d9cb2b9818ed5e71755eb5ac46a8e43a86695ed5d74b7694c735c4bd53c3cbdaaaf4d80f33232daad0395ffc6520fd68947b72b9cb942db88195ffffbcfcc408d749458982f95d040ab85b99dbd3a82043ecaa7478f1e711dd4f6ee281627354e83039af0f5835a6aa45702db0a72d8a1924ccafe74aeec763c9da0fa9df1fe766137b29e126fcb93847655dec86d3cfa08ba0111e8888019b6c0a2d3c5a11e8d959d49e004dfb643d2603d39857e3176089f0432791fee70ea0c8e543ba9280c76a0cb675b37ad040491237bc02a589e08782ec0a4f98a343cedadfc4e9e8d7baaeeb1a4742c024c91a5a305e6e614ea8eb1fb5cda99d5ac25c09c2cace5b14398d39727ee017896000a26788855f8d401f8f467a86573714b41d365a513560cd6fbd652377c5278e63b484412ee66f31899a4618d00c5fc03cdee57e5abce2fcbc409c3cee1325daab562e9251401c0193085eb06e05fd4e5e14743dd13ac351dc8abfd42d49accd41510d81d7b3bb3ba4a03549488a374781868ea09ef52a51376375f01cafe3ed8b6cca19a6887564232b74eb46e235320cfdd9adaa3640863593669aa38df3c5f2710d5fa70771067a72c29e505720976941fd6edb442c773fe13bd9aa2a03 MD = 2ffa408e12424846b83274f71c3c682e1dcd13867058b01801a0df66 Len = 38528 Msg = c429cc1d6ee0cbfa8da6540d8950baecf142a1401e85be76131adeb8a88e2a1ce8cfa91bb73e0644b80594316dab8fbba0e6a56a02b0b42f139cd656416b9bb654da952b09bf1a46fd544542cdd33e3a7c43bb9a1591c7d491e2c354fa28aab5d1f39935ae8b8e66263b6f27f1ef4fd34c02eeb89d517ecb5694ad991beedf8127c2bb21ecc9ea0ef9611bc821284beddaca43ace317627d2a599c0fece4c3821eee05d70ca1b7a5406f510da5a6b9efec44c45e2f0cfa52d4d9999db533dd217d207f3f553c7b93c10c17dec49021434b1778b7c957ceb31ebdab2bbd02b5c40eff304211c2c13f45e17723c80e0b50bfec679df8226606ceaddba24d7ad4d5973420c6865b0e13939678c4f74a007e106b9af905924bb4ad5030e8adc3c1bae16657b4fe2dec7675d222a99a698735053b18b438d10426834fb2e6250404ddb43edef5bf63e2d0b13d7ebbf89629dd6705e9b4d90719c318516984fd6526a4d864bc6f1123798a108093e05bf76ddefe7016e3305b12f233ff5eab7c0fae79147ff90c3e95370a5a436a0109b4dba19225a62885f6781d9e019841eb2a24c331379eb38de3a7b9572d09074bf6fb8cebcba16a1f00d3ab1ffe1f2f92dd11e9f836b14c45324effcee77ad869e55608d00b109347a0a9047f9ffc5eb951fc552e213dbeafadb6458919c55eaba8737e0b8dfa8a45fe8490858b36b5a8ae6d6e9ea347f3137966f14e6af07f5968da5462f867376143ebb6fb6ad51ba61bec9c0f62d9d2b9c1e66de6820525ba4c14f49ef55f82e39767e1a7e6e27afdc002474806fa43e8abbf1f190a0b37177da8c4872beb5312217f7653a563b9f3c636d71238b32ee95f7871aeaa0b9db8221e2ee4431292370abbdec54f63c0d15511b435a00b7b050699ca6f090c3fe564ff987fe4dd279a79a381c68de777df941a4779e50a1381c8aa9122d01605e66bd26c1eb752fa8397c0c71d07f9c664acd9f6a6afb8dca8cc343090a631d7025e1f118a637cf43a8c99199464a095aac5d62a83a81ebfc13bbf0e8134669d83656fef8b9160fb067fb6ddf14ce5ccf7059a4cd97643a4133cd193bd22bc3fafaa486ee8e908f83198a07dfd69ce539497acc270c12f74e7f8f4270b173ca5cf5235f66b127bd40101de5f80606612c9a194f61032eb158597af3234bbedb72a88bbefdab5c175bfdff8ed42dcb2f1dd4cdb4e81707e7135408a1c01b7d75e0a7264c1fe79e3c5b25d778d0a83bcd91abf08348a24f06f3f1b0e4d37b30280b538b7d49f07e8ab24a0e2a9a1fd8bb0c623a30ff5f64af6ea51c22ea156770674033c918506d80e5bd3c1a8d0f327602a9f3447888d93f0800a2f2506493dd98ffb7c5e771fbbd8a01c9df25d0d99cf8e5c44440c92d344476ddb9b2d345cdf4e47fea43efa9af03ba3fcef10f2e8e739815a6d48ac12da88a350f9dfbddd02f9104acca23e7c3e74916907b34b1c8e7537ff2c0684599a8ad316a5e48fc729d77de93c6b946aaa930e69a20cbf3eae88a6bae80cc2af6c9726b3090450223c31b7625e61a36b1cdf418628e5f7542ebbf5130a230d1d38f5c4b18b07a9f6224fe53d994c14877ca1534701049a69f6564d92f8130daae6edd49895b4414cc579300354f38ec6b2226c3495315182eea1d5c01ba46b5e5ec77fee8ed4c12b0cf7c03bf91fba31a6a7b2d64c36c4a9fee4b624db9ecf4188cbec3dde2fd09cdf10bc6def983fcf417b50b48fda9ae50e661747a1c8e05c4c41440cec8d17a6260e4c229e26c7a969e56c57c4e47c3f067021afd3eb47b69370aee422b63d51c9379ae06e91f7c5072c2f45551d11bdce4afbe6dbcfac5743a1534ce771eba5b1d4cb32c7a0792d0499c008a84d026a4e3ccf741f3cb548461c5acca388c9abc42c0a9d111df5e946744728273cf64b6f8ec2df09fa0d908229ececbfc17e6aeb897dabb4ce12ffb705ee2b38b1966a1787feb1ffd05a37e1103135a1e5b3ea0f314ce3187b79793e93db9b45758ace2f70ab716b8845464a18502eb2bc0f34166da0cda5eed25ec26836ffb551797fa091f0a8b4e875c4a48a72605a0d3b4fea85a1f2c4eec4b72dca28e0f00a0b865032f6dd42b993b9d9aebe5102a2de4371c176d9db42f78b6602d9c55e6be9ea299be5987dc2462ed0cc5d8b1041a1199569480b54b314e255577036673bbbb31214e462cdcd3729712c7696eeb32cd83cc43e0e9509c3c5e21315bb734128e9f2e41bc19aa00db5a41632f802bf2688501b816c080cab3af57cf2ddea46d995b354b33f4c0571d751d1b93bb62f3832b8b638ac1383754c76dc2c23341276bf3cacd4644bc10b9960a632e671ca09dd5cdd8c572038c8004d79ee16b96da66d7534a5b7ff9f8202b9ddc5829a57429124d8a5f496f14d60629c5e3ce11f11a946334fc0d1667f1a45be9c969b9f8a56f8eeaa0bdd77ac739d8ca42015ef607a97f3f90727dda9eaea90dcaadb6a8a35c069c3255d928c41e793e947bba73be950bacc156acea979919db047c27fe935648f1ac97d0995d326f7553b3d0d49fc59d1f07103ff26d0232b3ef4b8a8505fcca9d47fa8a6703044010f8301ea33bd9a808ca35838c9f58683ae3925ab67b9e1fe1ccf432fc56027f940a77105a034fc0ec934d3433af2a4ed299e7151d54e89d81842b76d3b6cb9270f2ff328396865c5ceabdbe720cf63b0d7ac04624323ad7df05f6c287b5be0d2a5a4f119a661beebc490d7eb2392ad16dfea47a658423636cdaeca282d358644298ed2a18e27f0c9d26c3118ec45696569e0a0e5bdb20a4bd7b83a34f80392c3c473fe889ac3e2a721c5503623ef7fe69f1778e6197b13043504221684ccec989edddd96713c7bcdd8269c0d7099d6e1a716387215a637a9101beb947a987c0bde53d793bb9aa58220147d64794a589ea9654651593960818f83fe77826f2a63ad5e544622e5470f21195b04e90aec64ce8d0c4b8c3f75d5dbc6c186435adeea3285bc784c2648bc02bc9eb666e17a7d3d15f02756bd5eed1b6b9e8b666080e6965077f1e16592d1ec86ae4098d8eb2f1f855caf61bd031178fbfc4c928af8a00047ed798aa80c9606fdf46a29f625c39c66b7a952464c891afd439370df2e6099f386d8eff99e5379abd6febe441181db3f69ded461219c28f9da26a8670a6e88dbabd5b75f304f6c18bdc202c897b00598da168d156a94ca782bcde12a7511f687c23a8ae3aad308ca12809a8ca09941f97219256a0fb72a019d52c33155920b8035cd128bf427744b3bfe31981285b8eb99ae4568f84e6d1c987cf8839439ee4d6a57f461f793d923a2056df2d7ba92f5b79f95180da0be5184122528184ec876cb9fdb6d995f5fd8ad5cf6a4d581f6a034b2bc8137f74329caddf529cb19c084be6f6db6c3d22df4c6cd75b6f6210c7378b063ab5c99242bd0a50d8d93e2fffead8d52445e356cff541e922e20e4fdf6eb60319f65cf8ae0ff31185c5af0ad6cffc2331f50d0437fbf18f4163d10f1b1f58ccf643be19dcebf4bbc9e078cf1561cd6b85083ebdbfe6e83447534ee0f2dfffae402c417847f79b9a15c82fef3456c9188deddce5c03cb272954edc680f16f731982eab9687b9344709eb38edcc157bb4cd148c1ed173dcb4cba50e06c85afbf16eb940e704877b4d16a8284d450451bab31ab0bb6c12c3954af4583fa7225a68245aa5fc5708bd16bcad727027c9e7a4e07edf5e0890037ea3cb4f8523f3bf0059913f48e7b3963e7c59ac08fcccaa0dc5af8c793f7228eb66785889d74586448eeb915f4efe831ec63b397a2c83155fe33b3c9f694f8065f3aa078039ae3ccf34c830a1f56ff0423ad0af464f93b615c99064232e7eb668ebded13ab3846eeaebb591a3637e8a434aa871ffde6518b9d94d97c6e786478eaf755a0bed6e8921f44238f611b0ad9c663135f9418d99c6a2c14bdd3d0c9021cf0be6663fc3182f1eec9afca89cd6b81de94fe51153d5d6a6aa04e897683cdcbb012aec3338985cac234c3960999210f25f4425d67e39346556377b7f2fba1a04037c00502586253c64a12f023d6c415401974e0953509a5f6467f86cd984543a717e453f206e23304f4e6fe60ec1c3e35eddb01289986305331b01d8ec1835bed9862d28afbcd12841b85e84744f12f0e56c1e9a779d18f760d50a5bde021901ba481ac52a0eb9a4da538d761440b93d33e6cc09a3cb36967c0a845e35ce88c37228b09d25b0371667c47f3345532108a8c25ad8a4af4662c340026879da0f44cf9c6109395df3fda86fa634ae02d4e3d2834d8fe0b5c2fcf4fa06f310b11735f137bea1cb745adaead99502b4bc5f6f3f9e16a7ee7b26c58fbcf49690e02af7a57f1bef527fe62ecd76be15dffc2b0b5e9748b9246c0c4cd1fd6dcb80e3d50a4ad72b5a74fd2079ceeb93f6a65ec238adf3462c3904ce038a3fd4fa57388ffe6fd44f7b9968844c4d9cb91dae40af87ac46b18982d1f68a06e8ccab9a5ac64472fb0abb363eac06e80e90033e3e6d78d7e5fd49a8501030e6acb777a0c7126cf2cfefa1e20be24a1cb5bb4ffcc4666ccf658bf4f00ba59897e027c72109eed86da760b8034cd1766a268d4c506f3503e14a0014107111319927801291afd63752260076407df42c4ed5a880ef9b53bebc17ec1f800cfd9c68f762f2690542ea3ec03154f01bc4dc39477fa610d53d0dce33927fb55bc52995b442df1dc6cf61821a85ecb8a2bdf6b7f084f46aa97b618631a5dd26ca02799df2a2412640d64dda797095f0af5a0c59754b245384795a72a698805af4300cf03703c1192fe1ff968183f94e9e23ad8c2a549e71f2c17921f6ed31c846d8341b05d9c77cd09d0744b7328f08fba52ace9413cb3c70ee2e0297064a055e55bf9cc3a6dcc7cf41f5737efebfd6445934af571b43299b59e9932b9631989742eff404fd6960988b3a916d5b143d14ba2b9cc7dd9eafbe8f4c6218ff90d88e2a559f5e4005fdb8d3572cf6da1493c932a0158add26556718b6ede3b4e06baf76711d24113ae5acb4cba4affe4970ee6d12b7f49c82b13160d995004898b877a1d2fbeae360cee0aa18a6fd3a1b5b00c3f3e2b98e2c298a01f4f6134d22557356eb9a3729100ff11dce92631012c88cd1d4243e349b44fd66b99f812535a92ee03b968d64d12f5a9a4e057602c8200f11340af7224899e82997efde531b5a06e8336f52292ca389aa176eaa949427f3fc83e578d9cc7ef6a510759f697bbe97d9739329e87b130ac7cb3c75480f16c80e547237cd9f8a9573a3bf28dabf6d6e2e7c90791554e46a6dd9fd6a9fb19317c1160fb8602a33412fc22b1f195edcd671aee5c452329e0526b4300efdf4135fbf593c7f53f51f86040c47e6c7e2837d2d8b019001acb6876cfa62b7057f2e0c539e76f0fba895d0cae2a42448e307deccb18260b62bb44dbb1d0407288b39aa18465db1d98d3cbdced5be3c2ec8c057d992d6bae2281de49b7ca283e9d0ccb597e13f36604b7aa9aa65f4b2ec1c4394deaf8d03083a69c888c9bc91cbc85dbb3d0fba03424be620c803f60d034618023677f3edbacb1e85fd64b0d530ea733782225c8cd206f5bfb24020cef6eea41c9b7cc9bf5c52a29973ee3db2dbaf939701b97547a2153fd2e39b036d596e7e60583e7d1c7f89ac6f86b6a1af0e8045662645b2d834ff0b16f6852c6c8d5e0d6a073d6c6996b88294a06e8b4e5c24ef217a5793930d1d1dd8459eea311535e79622ea364b3467cb955b66690546d61765885f762c9d07beb36b38fb7f837e837125d56915cb2fedee124ea968514c548ebacdf8f957378414d1e3ae9c4aa07787aa7f537ddd79700b5f77faebfdd00d298c339a8dde34e499144f921bfd342a460b58a3d7edcce879ad82ac04cf09c7b29720b94e9478869cacad3472fdb21238d2e1c8b87e92cdc586ff5b4727621aa64605f3d01c8ab0bbf5bd1445de92c5dc9bbb40940283865b763e7727a9715c913363c8a6d8e4196399df9fe9126ecbbdb04599ff1bf7a8b7f5d08e3ac7a023ffc9bab6374c0d2720038555e13b9e8a38db01335e1d67ab6770461ed4f486f74e838b2b06086e406dcd5ed4c2acba87ea568eab35996c14f6801f979ad28e5d09eb55c59770901bc951cc7b11f84b5b5ecd3e701a126d6bc1afbd9700c43ebbbe8b9ae470271b0fbf2b4ed733a0b96ae2a9a110701af4167559b07b8b5c1099d8cecb26048e67a2cbc46677cc389d3d3276471aec1598bb6e1898d3bf0c9c7de53f76f8d938fe5b5bb793bb20225f58baada0ddc284b3b13856c73df0483aee60582edb729947bffb7f673ff3f08833d7da4ef7a7faed9e50aecbf8e3b18451d6a3435c4531ec4727864174ac159055366691f710ea9ed9439b27b2fdbb014ec49b64e9e59554776c56c2d7bd14104342ed1a3a71d650088d866aeaa2d72a4b96caf402b83608c7468b6bf79b7e807489d868506f40a9928afb061e779877ced99c8145519671bd227e9d42ebb7596f77a2dcd75dbbf41de88369bcd071725f199a9d10262947dfacbad7581251139a98f7181db19ac7f1229a364461e49252c34f97f1ca70d39521caca95a3ce379c6a2f7ab22f7fadb2a5b9dc43a074506053161278a30fad744e18b78a14914ddb67c6a5231bdd1dd8fe6ccc48f0b344fe65a88cf344584df37e4f5ea3e94cbeee1e5707ff0b3580ea992da6b2e703e8936751782022ed3da93eb90081a653132b0a4b1394720b8f5e0276cc2ff7e8a3b5c4bb545dc320e50bf MD = a8d270a4267161167dc6e0b1427a8b8476645be263d29c5b8af924db Len = 39320 Msg = 9f363cbbb7cb244b6fabb15d4f0bd46fecfbebb4bcea38b92a6d9248e63c5a8d7f7db1773346e861065d38f21142b4411d6f7b3d70de324de7ccb23345bdfd36cbc0778009f453c5f34b4b25378e9454cea111f8d109c7528fab9121dcd614c3ac84f69ee0dd4bbe5ffd50bf69f75cee281a13ab8873dd12499297da5391887c49539698600ab99572fcb1894e86f4585361eb1f3d245dd33e0a2c2551f63fa9cbb4bf383282869353cfd4488f4244da76feff1c972530de959ab8cb7e0c22925930d944fe4d98fd2bfe23c7d33435bbb97ab96a3e7d3c7b77cba39583db197f1c4e4c856b74d91e211204cdc362ad45455c80d0db346bf10c245548086b0db73b9680c322fe303d5e92e12107d695be422cbb171653a48a7b2d36afb4c5e483df90dec6cbf384a10906218c4698d66fd873d40796e0ce8ced6eaf9130f0882b30c5cc550d5cbf934bf62cd628ae56a02db7326804e6d340897026b523f4dff755bcb33a9040c85b4ceb6ac75722ff996c833d02076a9aee78ba04e436dad32e77fdfc3bfda78741336d432678fcb8a1bb5c5d9d48760bdee1d4b2e611a94b1abd110d21fc99e48d29021fbd3642680142ccfa006e110e57ed4796835b692e01507f50b3341fc7865534665236fef9022b5a7cf422448ba3c49a1a83bd22662c57cf2bbb4e401875e08a80ae233752ea9b8f4b410c166a088d55a5addedddae3fb8a08fff105bfa2f18cd599a3f65b01bcf1cfafd38f93cf71019eca67a2726e64374e49c674a455b1c3cddb5e42fc91b60a710520b7ef3f97256fa2ff771614b95e655f7598b0d647b6d13bfe231de0b162970d9a9764a227497ffd4f66ae1e2387b509a576c96cdcee478228a1a637d47fab8dea36db3e4bf536a3fe7622d4c93ba611fe18d86198f1997886c57fde47eb134eb79c3d5d29b2fc5cb5af5a7ed401a03e2a85c6fba2492de5c096911d332e3918aad27045e90739ef1c1a3f646b620b57cec57983237d6d917e1cc23cc0ce83b36bdf5e3eb47d5525dabeb7ceb7e54f2595e1db404216c0446760fb8215555be6a1cbed92b29bb8c698a4ab03df12d47024e0d37c289b8dc5236925395b4b287af49f07870ae9cb9afdd2044c0c7102ff26ca487dfc943edd5b4026a7b93651380e629367e5eff468b252a8f1668b429c41a7248de78a3a54b7ebe81458a040e5941c79786a369cfa5e2c813a14e7fa0d1d804ef21104e9f2de7451ca5f105c4c31d5a103c2452c16aa66766e3f0d941b635caef4a18ab37e79e24b10f70f0d348b96f34f14a40a853e0a6ed70e86768ebb442cddc0a400c22f3ebd2d4824bb644a6657a689dca00ec11f53bbaad90a2ecc3fb0f395db3884a98f8e6a79d7cea5174eb54e4974557bdcae0c633a8eb6c33f55228049b6c38d8edda80fb3b0aebf9a55f5907bf4909336be8117e72ee414bb8e6aca03be09a58731f2641d38c47a7a83ffb447e4bb1d78579a1fd940fbeae9f3701aec7973933c9254b0e0f6769e5fe0bb02d6cd3de249813fc2374c630d718b1db72c7167215408b63d23722df2f37511c250377eaa5245584929da8345fa5f57ebea2e4e15789b00510f35523fdb49ea3bdda8e63c3aaacdfcd973c55a2c7507fc4e3691384f541a35ccc64b4dc2642cb6a3aadd62aab986236c9e9013b1d7163381139652823aed3181ad82e44ecfc17bcdc4cbe24a796b060de44d392e8d6ad8ab4dc72bb8555f8c56735dcc27918fd2817f1885c1f265ede2cc62944e9ded33f36a8b8a9aae5990749f46ccf6b28003e7612c13b82c5a1f13de38ecb611858b82f44939cf4cc48303b9a4ae633b7b5529f46f54d63034e5c9a2370911f01c2a80736bfe003886ae2a4adf38153367126cc04a10c405d9872ca1c7b305439956146d58a2d578895912d95f33b5a22e80db4c230e29b3334d636251b13a11e458666c78edf516b3cce3ee8b66ea91b7e79b206317ae43287e976d3bcc5a62e5789ff733a60919ee4ec411cd9b5d06ea91d7c473f3fbbca264ef4befcc0a3f84fde797f197b88a2128ddcb8c98b60cafc5b5c1b96ab72688459483d379f4aea93165d21a86ab7034a357a331269ca8eeca5d9d9f438a89c26aad9d519ac0ba3c5a4233163c8ad30e055a22220db7e48fe9f8e38c481eee371b6322d0f9166825c1a53f4d81fcbc99960dcec815b0c77a6aae18e83f185cd1a0de99b85c9cc24caeb780281ca931bca099328b062f599895a6c61af123dc7740458a708cfdcf9968a07d0dd73a3d5f6926d3d4a7dba3cfb109748c26e5751144c07d6251df97f53987be657857e56a3adb3b09c15dac0808feaba5a6062f88f479fbf572eb23466794cc99c8a733c65be0f1941c5c7d2ce0aef2cd382f12c298958b91b9c87a763bf12e0f8fd32e59145e7ddb80811c218241d16ca60827a8783fb69eec1ea46bfdc36c319582de0cad7d6848b57493d136ded0eab6387522dc9d0384d497aa0ff5350f66a15d4cc86d64384182dcea2244ad78b0316804190bd7faac39d993486b6c9e157d0c7f739e3c7830b16227fef3d75024de3fdd734e16237ce38c6700a693a1a8ef367ff6862cad7c08ad544c8c84e1af8766071aed82075d99592f1eefd0a086c083553a6d5d618d506678f457dbb1baf2848af430422db825e8f28a8e4b2417b89d08269df61bcb50349cdd9c054aabe8426feb5e7f1df34de0b82ccb2eb4c39e29a0a15d20649ed2c0c7f1a32a34eb3148bde6c1606078dae989eced9ed9f23cd22695f403c36e9cb10117b370f5e3953d7ccc9f0e7dad93ad6eb23ec51a0c583da1e9abc6c0a378b05237160217fadcc9b58741b0fcfc42d16e6604cbff79bb151985ca92e3a52c65c33a12062297cd956ffeef6f66ccad0092f088d810a12d009751998eb5dc80775b06f0a59c243249b219f17342849de0e1381212d6ed75a621355fe3bdb13e8f2384f8060f08d18d86c08ee3188eda196326eaa4d8c35db1c21966b8838a2c54219c715202ab7207f4db0fe771512c5420a357b49e8cabc67fe5f43690d0146f5f37a5b0fe75df620352bca9d3355b392195a26bb1b1288f628152846becbc87e53bda498acedf44bc0ddd4ec9a22e6f6de614f098989cb472d5c8cc9c44ec45b99259442e1e395625f5ba01d8006f9f0c7cf36cdbabcfddb7c99d33ac426e51e5226aca72cdb63f49f09be88ab7e47007418706035188b13a461be3224d095271d55403df431ea72de7c72b662f568b651b1ae797f191d80232880486cc84f063916116fce83938dbc387f3f4d18c972ef4f2361ff5b0fb17772dbd6129a8d4c540d72c5125ce985a6a2368bd03503d6ab3581c24c4aec282fb52373acb3da69ec9ff6c6760a76fb2c6e3b1482e6825224094c12dc652d44aa83f9a991a0b0df71421ffc5028a66ecbe0ef71dbb9df65e83ee4cc26366da77643b0d067ed9b2d709850cf47440240e39ee61c510b7582464aee56b03b07b12198fb80a5f703d469072bc7a1d91522321c918c7977ef57ecb1bb6b10efa6022ae84c42c2599554d913237e1644498305de843abb7ba7273a07ee41bec0a30af0b6059f5381aa2f2f40ba4b0b3239d3fd5930bfad7327a0bcb1f9a3205a894c2186b9eec01bbce3fa1462b7071f40a577112983b61afb34f3446fe7cc29e3461bdefbc99e6467e3c802af6a80580868119ac11f6bcf9c546c33b388389b3b797e232db8450815cf07a012ae0d98fbac4b5aa9eb450d859f9614571cfc3aec6696f7d2136a83610637511f2a154e94e282d5469fb8514176ef4aed1e6d95808e14c18b936542b429d5aa47471de55e9b569f29756c374a6af65bc7f5231792606614bc90cbe2999a71200d8dbdf9c337451cc534a72c1afc49db8a49b35d9c7e0965e7a414cf7bd88846d4764bf86d66cce2ac361fac3d9b383ea67474c3f9478d498f35c685f57489735e996e7db77a5c6530f22c342cd86fe99f1e0dd7434d501435de579270ff0359fe5f8bd63c1282390601535063245f80e69ee524150ff07a5df64e7188c8645f26312aae659fccb29dec3b9d6b1f65892f8f7126c90ffcc06a26219fa7715ae778d6d172bea29a866b0b3b57cf2a3066bc68585bd9bdc3ab0cd67799577a25a7689906afb1ab8a08eff6d93be9c53e9e1fa1f13fe1a9e38ea89f96eb0353730367f030d1e91b09debf27ab965570feb3ebd4e24f5b44eadfbfea2601558db1801984f665cf81986c3b2619139cddef3c83698206b12f3832c53e9b78a8997fa1dfbfbdf7df7fc435f66aa8101a3c8eac98e886f29dc95a1c5b156dcd87072bed3d28fde483560bb0737def38784d5b687eca379f4b93cef0e3f7235c7b4744d6b4294cd865b4dd8034d844e91160e404b7973a79751f1554e26c42b1efea58d2d759113ff10cb819acf24fae8017a705c5c7f5fd84dbbbbcf8dd527a7f50e6761930e187bfde39e15e5475f54ee212f04be4f0a8155a309d79d2b8f2842b6c34ec39344c2ca9c18bcb974e59c850c6389c76c115810b027af7d50cc6a8ca58a3d2ea9ff9b1effd5d77033f48a6d42f5349e5dda2627eafd9f57cc47357ce4a276fcd7b1d0a112beae350cf4e44fcbce4d6caacfb2415974ee50256750ba7af54154a6c227fcdfbb892e884d73d2b0d41c58dc57c6070672e692e59385ed6f6ae65e9d9a69d76eb5af832e67ff9ff8f1e88b7ad92821f8e0cd4593359abdcce8ac4444a15ed9c592695d86aa505dab0cfb2d0cbfa13637a7ec90b8b458d49859dd2b2340cdabee3cffe4197f2db5d20d9b651a70f9eeccad8b9cdb7887d7dba4bf3dc3dd7ff5f199b93f6e4c5f4f74db115b2d54f8f3bedcf29184e9ef719db19ba2abe23d5ed493de970e7aafd29960a538ccd366ea151b68963c6f5748e768b88263b5cd8ea111b8137f72e2e749839e2480550a7eda5136d389728904c0b1600474c0f72e60fa8ddc4b9bc3358d2c4646d042ad551468a571f65a4b4e3174d950656985e61738a619f95c19656c43e3c744021717cb47fb98088f66ce41996c8fbe1a3d5dd0b24bf3121fab1eefb1bece64fd106d07d6806f4979a22bf80861e9083ae93c9250c4921d4b42091d5c1f84b99c60ffd1fd7e1f4080c60d5ea90085c9314f2a66fa581da248a6cdfe2d4d11ca45ce7430a43bcf750d9c1e7c64908c8c6638d0529850bc2a7d9f139a0c929c1f6124742db300a87186ea0359225b25d6436bd56112f4993c54f583fae2344d415928a9cf1215d2bb557967fdc9a779312fb2e398508cd960346fc425957c4db793a3b81eaac274dbe011f07143bdb02492d39f013b60a71e85d77f230fb2c409795c4c22614fb75a917946bc76e5f138d597b3a3b9b829ffb0f35bfd361edac0721d0be42003c2bfcf7b12e64c6764f35ec6c786b3db878a1b8c01baf408b563e5ac9d6bd028be9201ddfcf8ac8a32e0962882b31212ea482f69186230b7807a3cd2abbf5704d25c9168abf97d978384e5848d31bca57abf545449fed274618ede57dde99fdf27a3e6e4c8f1a9d67e69b4a48f089bdc5e79f3133c94c18780263303daf08e03e4f26819fae9178f4c16694e314196febffe726f982fe73806caa39e4bdc0eb732ce7fcfeae7af0a14136e4b1be39455c4d43b3006d42bcf1b0296efd7b6064239c193cd40f6598effe92963f4f67f279685b41e2d8d7593e65774bf27855ded20520cdca31bfd65351f045d65833ebd5c994700b661adcd9050a5d6e251fd00100a52c4bb6083d5dd3d65031590b95f3f965ba04859bcc5407691fcb122cdc3306fcd4d31ccd32720cbb61bad28d855670657c48c7b88c31f4fa1f93c01b57da90be63ead67d6a325525e6ed45083e6fb70a53529d1fa0f55653b942af59d78a2660361d63a7290155ac5c43312a25b235dacbbc863faf00940c99624076dfa44068e7c554c9038176953e571751dfc0954d41d113771b06466b1c8d13e0d4cb675ed58d1a619e1540970983781dc11d2dd8525ab5745958d615defdaa266b6213b8abdf34ef3d4f3c184a62d3fc7e2a98027993fcb60e8acb933d6e63b5e7faddecb73634e08591d19f7d8fab6c7b7b4c622427499a8f0ebf49d449e12def181e81a41c8ae3eb7fa9a31f447efc2d71b36dfe8f3cb07f7709c0100a92ecf52c6e1def0cb747f38b1cb9bc2bbf0a18b0759c453646964436338c9d3b19717eba34f7e4813aab2226b359b0cffc34d1ba0b53a4a6d79a61ded515c855b56a00441bc64114957bfbe4f5e9a98ba70adcf0dd4aa97b905b7cd366e22de517250e5c8aff71314848d5486d0012f95fda8ee773e7a00ee147e9b651783a63bf311d55fb19f161d38062c37133699387428c20579144eb5afe3cfa2d5e7a4c0e2ca1e2e49c4e10b7b118d8bada39e4adc1491e00fde49b5ddceb0172eb6a1894663065effce3d875596c1aa28ae06743e53a42f8842b897a62787e9ac58653e27c3d6175b26f239cf7e0ebb0cc1985da1cf431b6aa6640212d69c43d736b8868dd4d580e632c8c8f0afbde6df431dad0d6fb6cc3f74169f2ac4374b36b66209817d4dc2275b87ddc11215552b9c5e0e8b1b44698e139416f5d7a02951412a700aa68404a609f61f488f602d7733202621bb361ae0eba60e7bf81e06b040d9633137c36feca5de378f0fe4994c722e9dda38d409bc64162fc510fb0adc193789fd19522b809507cc9e78ebbf31c04f1cbb78665baae6ab22da057d5c5c360c8b7632795fea4339877bb4bbc7ae854a4bce64343b32d92c8fc3c1ed25b8fd2010a46b8034b3153c1030a99cda4b2ae8d11ae486cfdda5621d862a938c79d83bc190adaed16275d70ec541d8209115f157a7e1a33f32b215752d2ab6ba262e244641de4d5e7fcad4294062b6c007af2d847e41d4b4ba690c3fbfa89fd64766a446bfe7a305937c MD = 8b8a54913b5a4c09432ef2faa98ea704e6bf068af26b35cb22c4586b Len = 40112 Msg = db71e06debebb085443de3b1b744f546d29f16895a5a3872f5c966b026b757ec7ec1435211fcf54e28de2293355bf9620c4efb094f1b0daa2a92cb3d411720d8e700132e913fe4578a4158cfe81651c0bed1a184933220651382fda805bf51cb7df9fa0a53fca628d32f2e6bb6bc26e952f1b2020de79a2e1761a1f959f6134ba8739eed3f7b62496c704b7189979f632e76d38ca581a38a9ef6623624068ee2d035a7df3d034143bbcc59e848ede5b8bc28ae28434a6203100ae5695035e9175d08bee935dd6b9c2a0bfdd9db071f6f62cfebe1cf880020d665d599c4cc4d72b7b48b110f5207df20f4e14b292d76118a3232bc3184a56956cfd8cf6812e17c4701b561b3a83e910550ad461ca612259b1a29c352867767f91096122451cebc73b7e5e10927373c40e709d39bbc1a33fd4f7bfd18d5a1a127efb96ae0cf3bbba49dc298fa191b673b819bf88fb5b6c41799ce726cbb49a04936e6df84d651ff437cf58e6cc4119b5de60ebfdeda105f53c0cb2b377e98eac5abc77af8ac3712b61c25cb4872425f0edd083071734d8c188b192f5f67b509051704422499167c6745fb587769d53bb630315230c898d3cfc36086cebec8856f414540f1e716c3bcbf1e3ce0f1f3b7bda5332d032017bdde304a396acbfbe46df3317a45dc5e711f51387f6a54c45c8c05b3c9d3c5f2d1ae9a7d4f1dd574b066f370fa0ac2170df7c5ee2affd86fb189175c2f86fd5297a7c9a1d0cd265b70c20aabc826df6820ace1ea4386c71d3f1da5d36606115f9831855fc56404d9ade8008aea837c7a31a66ed4d5e667f58cb075c3763949405bb5955f35c9b816ee429db46a07e075c84c3353e509012022ab51d26809ec1e6999c24828e48a39bb37a9d24f9c55806e08fa107dd6dcc58974ffa8435d44204847d4c2a69dc16a9c2feb8ba22921c3a94189b3a435420d477547ee0f1c976f82259377b8dca7d31a922c886a958d670460a9e3630e7920e615f34cd4302e329f9dc60c65898299bcc93470afcae19404cb2248c149ca25eebbc9699b8051922516372cb68c9be70b3acbec7aaf657133ebbc8bc6cf7d44e5d193ee6bf447b79ef8ac7db1cd3ae38e4eb9a4d22c612718283f547a86daa755be17824d745ac891aaeea76035a7b5cd6dc53fbf291cdd3beb724ae6572973c5ea1ece48e8d0ed8796c553cbaa29865000b966498edfbc259a1e16112ab1d3bebd6f7a6438f2500723f829f915097ea06d5bc07943f2ec5d9f0b6003e8bbedc79fd42da94d081699b951d0f25f90c4441e74f656319d946b6001cfc5778fe968f8138f200d5a6ac5c096f1be6e0381c479cbafe83e28ddd847c80b5ec175f02930f549d0612f7214a09033662caddca9e82a943853daee2bba27bdd6adb52a93af4203c231d1560dc2073ff180d5fe79d2574c4d59fcf0ec23e88d362296be2dddc264fc66863f398cc3bc6751c20ebf9f1b803036d60aa4e9d122850a61d47f233c1588e697551e678b53d089bd3500b63ed8e7d4b065da74ab25cb4c5f9612e77abe6e9b4cbf46bc28ac350f0e9bc68188fb7c19d228162c3d3d10d0d52a6d924206b46ceca639f1636e9dcbfd679867c192f6ef837ce07951135d7e0eb8198d5d956440c1317d70024111a5d2c2ffd0b0445e3d0d89c1c3ad4eb93e51699c3f9314850111899c9fcdcf9885d4d382241ebabbebb67640721a972df8e564800fab2b209625d51ee88ebd3a534cc3a9ccd39c15e0c76ce6ee6096c09413d24c676f813ce7453e89b20bb6fff782b9fc2e979175068792399f47f27afa23db89aea5bfe1dcb8ec67640d60f059bede04b33241e2444011c3ee975463125da6be4b168c175dc8063f685c631462485948c36b55648238100c41176384c5085c73a88a91e752bbb49a25c06874f8675350c70b7503a8b9b89a0190c8e4f96e24312cc97658a3da20ff030117160465f4a525db48c89f0930f797cb2a8b97d5277e3f9ae273386d6ff66ae617046f8863ce47a077ba4d70a1ab698d328288868de549c67d3ff9bccc07c23911461f19c9539325a9e19b38333ce1a188d0b2c97debb216f0c4cf0e5dbb73c0ace2fe5f4dbd7331874671a70d3466ced37dffe61f1ae34fe30aa0ad4a99e54491e2f3a418934e8bb9f0b807581b5fdbbb9256249cf9423cfd1a56dfbc2a818c674de52e515d8cfce6e7569e3b773691ea169ecc1c1038a4e7fbd7eddbf4ad62d72cbe4721a4944cb63435b5dfd252b80511c126c6e82e4e49b50d1fce81d28c89866535b0eed043d3de3b936cb31b18b78ca67ac3088a03c951debcbe5959d32463c24025c6a7a8e2ed528209a3f978a58d35103bf8b58b12d6340ed202a8ff51ccbdb2a9b181458e6a61c8de2954a17a1f562f554118aeca4cf65b330629d8b7c73ed16339c6e07c5c50ae14cd945cdc47f121396a1a349abb0cec08ed4325ff5f2de77ce5df4257cb077cd317216f740fee2c10fb22e4292c5d097a3d5db0d099723a1b3d3233c5c06d7a429064a2e97e3599027d9a8720a6d3f9b180e13fd37ff51269ca287b6e416cf08abfc3bfe39cafb03677e9e526325506d43d369baf189fb98e132ae1fc59eb25d22ca78c0c7242b8d57177c6e4d7cc760bfdc48c0d6c5676b1a19e2e140dd362436079d30907d7fb06f3acf2019d1e928047f3da95840390fafaed2a60670aef05e29f5a856457bff286f030268c34a258a32b4cee678f5092a8809d886e79143f3a83ea268fa84dc0b1ab4afbadf6eebe99d4abc11de0fea133be4f342a08191af18b4a9492b4ed99fd450627074cbdd8b256bfb5afe0e24e210e080ba4a045bd8e2144787561e6a5f1262d53a21f59ce75195073247543c2fcda8fb5e327e15099ac9e7a3e99820b15b68726875508c96b8626a284896b254b89addbef8735fd9b942141f74307f4f15edb49bdd813f11a0308ebd803a09e97832a25d1a689ea1b409576a747be870e84f3634c8ec26d0cf9c0f627cb2b55672fce3a906e253fa11ac2c0578defedf392951d3d615c66c9d1146a79c9547343f760c334c55025b5896fc80efce24d28ee8a1f97382b03d7f1cdf0d6e56220b342aa67c69554c4e0f56636d47eded03602991062fa756dc0c3b32f47079f83407972cf4dc57743a9c66db1b1fa2d9ea4348c99a79183cb0cad8dd0d31751c5710281a2d13d02ca99654de1ae5915defaee2a616de49d464119257a83fdc10dcf469f895be53d833638ce6fd281dfb9c1973a11bcdb0a06e96e41d65ea13784e1ad932cf1a56f940ba8b703265bd256809685509c5e14328b14aa8b6cebfa522fa027329e65e1259d1ed244b0cf38debf55d3c7165501f2b0732842b5c4549e41852144670ddc5f7600e5db7ac65778063beb1d31a81a70dff382a342128b90a0c54a095685a6691db7b96f8c26794ddeb097fbf640a7d1a0fc82551abfe852d3c96a2a72b5876c1aac16a9ecd9e484ce1c9d096b03f0407bf6ee0145b1b30962f8494ec385c990f646c331a4c5e0465fe8c6ee9ada3ce3f9498f4eccd234e0d6b9ae1e52deb3fc38ec8aaebcd4b7bb177ada538badd5e2a15d2de5b608b3fdb576634126a68cd9680831c93aedaf0a813ba1df45650166fc9a906d0b3d77888a962e6047c79d4e0e01812928f7125c2293e33bd0e8099790697f8fd358c9aada81d823be272e84b33f42768ddc26d884eb670e3420359ce830c3f31741f18a2f9e293192b086a3de2a3c5a728334a72ea9f60179f4cc9e89582440dfe037521057e833cb48efd2182a367bded483f0a83758bca84b18c4fd4a6a1f311de2270613dfd072d9af39e8a7fa81d9b75ddc7bfb55e6c90f5f37cb6d5d3717e03c33983bd4b18e4a0f01d6094e156c1408932e5fb427e227ea1e7b28c53198118b9e4e35907e278357526ab8fbdf9dd3cd3c49c93f29fd7b01a295e569b4bc981890b06adbde466ccf532d1cc98676dcf4ff54a3bc9121f3ebeba20b12698c5d2b3047427c79f1edbf2da69d7fb3ff17c505d854f40a5777f2202a0288f70f480ca69a263df833ee6e075ea4e70d3f6d88765d44af3aa6ef5c69b33193084e42021b317ce4031157250adb97c73d3ec4847a69dbb5c9164372efc702fb414f3156b795ad3a4195102c5ea7e0e8ea040602378681cd60af5b7cdaeddc874c1cff51a14d22075bc601cb2a4ae512bd9a194ad83b9ec1a77a1fc252ae2701d1bd923802e14213f8ac134a964a100c5d07e7a483109a57457e788b7e904c2f7738d45601da7425c1502cf0cc31c8a074535658618edd58e3c34c21861db1d9e797abf2c7bf22075eb93506f1867494a78750ad993ccf8b285285ca93ddbfc9c9e201537b18b37f76ef17d430d27eb1a0a9bcec53a3d9babd3209cfcd57dec6c41fbdc2466e8f56b1fbb8a2af9c4dbf07c4815eb94961ab496bc2785b1377978058c78750471e54b9e402b8966c498683dd8948f0b8d1277506960c6599f005a69407eac02ec74033b2dc5d0ecadacdbdfebbf523788ff6e90a6fd51572b3d8dedc6533bea8f5e3ca6e2ddb3f3f685e5d2effac780f05e04c7f3419912526d8cf37c9a9743f0d06241fdf7850525bff0a763db4170799ad466ecd21013ab3cc22ad1b95087a786fe9cdd97d698c1b796cdc5d5629e8b52481de21358e39c17e7e46433fa2e19ee7c2800332b47410942c6b48dad638c00fa2d71a9c60abb7b48c0b29ef6bfde735574145de5692a317f228e4884581223454619fa09e18ff37f403b5ed8a55bc234f1787ca7a6e3acc651d1aa79f4a425b3d859987700600cf5d36d08028728377520bb13f46913f792e51d3810b1c8a4e054aee9affff22436fad60f26ddaa6fa0a24ab83e28218e7f5ccf55cb27e61d455b98721738acd5dd36f4e8980178b741c6a5dde77c92fde61976981bcf82fb4d5d84c64f43069e33184838e8ab19cad33e5b09a2defea261ab9183850125db72cb125aaa8775e9e30f5e648b22e3f6cf59e8afe2b7bb386c93ae9c9965551a5024cfb3dbaea155679c95e012118de7b0a9cd5519af5f1c71623c37bb748744601afb463500ef4d3b408d5fffef6e0a01be777dca1e50bb1a87b9097db742e61cfe43a65936d64dc88bb328c7251ada4d0885ae769d46b0c284a3765295fe8c014f3738baa8ece3b9de95deea5b0ad4ed08664b91a4a78a03d98a02dca93082979e2491cbdf998b69c9a3d6dbe9b4868c4e97f9cdbcd9a35906eb337e698f865a5bba362f6372c162dd6bc53e69ae6b853ba92d6d4e73992c8d358caa4f41e3c428668a37bcff022f7a6c1e64436ef08260084b02e1fbd808ed077302c31e475f549822874494ea4a311357001f6cb1ee4c33f7211fd8fc78a6cf8afa7d6b1da680ed8390a2ead62d820fe374463e2c2360baa64a40a152f63afc3903d6cec3143dc521d640474263fda058436039cbec4e1adce10cdb880c2a1c01b157aff432dbcd81eac560db68047329efe6162d9354c30f77ccfe0814e4bd897588851d8cfb4528207a9dfda426f6ecfc6029ada32551b281196f6fbb0b4f14e2d1f4ab8d1cfa8929f87525c2d5b9f5db370ae8a620356a9f7ac60b68fe4f486bdc652aada12c3969c77ce03ea12ae91ef3204b16e5ecac25599887a94e4ca882f05d177928789d62602bb96219c84b3a2d00617fd6e5dbb53e3d40f67bb599cac642fe7a335e39963ae81de7902070bf3d21a83b83cf8db1b14ae3caf718b095c6cd4c2b224b9297e0688a39b4b21e00bc1aabe46cf846bd2b37dca140f471966a429d06a5df4cc9d8f39ac2f7fb97c12251d91512fe7b3a349a982409c7412f39494d970e77acbe9d3fac3dca7b7252f84dbc17e650bfbb45d9a29d820fc3d2ac57ea46fca356e895934ae4ac902248a684c197778d68b2d77b78a87a4c6e234be50fa0d0f0cfca5a9503622f084c14c58d860e47032aa37206a6cf32eba49380770a3f2bde6bf674cb4230c2124439ddde75d6c5606a2fade1b96c4c9c0b95f294867c7dcadfdf5c9ca3daf66caf4a47ee1d9b8313ab99d3c30d1a37ac07cd1ab3e0e347548ff77a8f94cb4c65e1a8ac32e9c7009b53848bf12e5384ba2d8b515bc5fe08e9f0d1672a817c24ac9fe7634366e3be6616725f1299a2a434e1633f0292374329a6ef9ae416782f8f1e8915a6117c1d1258d5959ddb8216aad7d75c3ed229766216c4ae42b049cdabf1f03bc185eabd1e9f30f7f9706c7c9a557a0167024f2341c4d2e9cceb6b7f81bedf3e2c10da1ef95e26decbd4dc1671feadf7219f12da3735acf5f92457b58ee988955c6ea4a3212a09b27b955ba4d0480585d5250efbb0edb55b4df7892041e69ef9c8dbe4fa24675c2b8f1e658813a5f3361830be085d518e8241d18a10495a84a3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed535e399dc5c7056a0b2a76899afeb9c224f83d1ab2d368b0f24d88e5d2720cbf4d1cf49085bb86d2135243569bc2199ea34bda87a550ed2a625a44057a608d563a46adc8b5a36a5116c7675b34fd5622670d695d9b050920a239cb01cf89a07ac0e24c8e7b0819afbd92cce08e36d8171946d2e5bb7b25585af20721f874abf287fab82aff70fbb4afba582cd0f5074460fffd672e39a79c318bdeac1da918873895dbe46a6678289447f58923c24b73e53fd22a1bc7f9b2cf0e3aec68b14d017bbc9c03e46ff8d216428a3daf260c6a500e3978abae8162dd820227ff13b428f776e3d19415e37bdbb2ff919ba8b2f248741a970575a97603f01ea60a57b3c355cb9894a3dfa1eb8b9f3ccd10d1a5d3757a5dd053a4d8b4e85f75b1b206b49c3cc3a49539559aeacf11283935274dd58027ea6bbac475e635d7f18f1ea71e795567ed1c7c0036404f11ad1d333413c01184a9b0645cead29161798a78c2592348be5c719767deb4b2a6b2c031805d5bcf9782e779f49e41a503f6e8e5dfcd62bcd0d9dbb013f810a0d9206b5891946f636a5e572014f9fa19c74ef28f87e2fd5aa64da3f08aee1ac3b1dd66d0f121c474052349824563c794b56af09e4100bec9479e12 MD = 662eca1e9e98d532113093abc2cd6300c6af1fbd159d29210727d4e2 Len = 40904 Msg = c754eb208677abaac84c9bc8e2e35e232561591dbb50b6c2d239affbfd750905d640de22e90fa08fcd245bb5945f3aa366574dbc68a989ade29011a3a2b6b4ba9b4ab6b8d253d3fb7b4481b05ed0764680ff6a2200821e953f449d0b4341c1855e9bfa490aea4bd718d495200adf18f3bd8237b84b827b602f7cdb9caabd3b4d665a323c5a7e100cedfe206d5e332a9263083ce41052aaf8fb6054be9ed327fcfcb0e7fb88b42b8142e8a9fe2375b30abbb8020f1999b343eb198fdae62b8f7968c59fed5c36a31d5fbab83d204cbc450dbb10a22c009c2b46cf14564b6c7aacf2c0e57aa0ac80ca8b9dd5911f614c2aa139ee03122f6f9756a96c9c953ff17de2ca3e0a1abdcb6f0fb98962e65b6ba1be59259c93cd346e61d01e128c4bfbd47f0a340593128bf333355b193fe32192ad433cd47682f19ab06cb222f739a09912a94ed4d453c8403f39d41cf0a177e5b720bb1285f8b0028ba4b133a0b0e8b4e3ce15dda2278a3d7bef7ad4c13c748222182bc086d4788e39a0a2ac4d59dc0d3aa20f89c836dad22f7dd8a97c5d21523652134542c1522604890df7c7dc838d5f4dc6400c29bfe7a20b7304e7ab843b3df7fb09816544b232877a7bd6e0e61a99f6c26b38a842641dc2d54bcccfa8267d2e6b740a68591a0cc172a0410d0b9d32c58970125a6a31e8c985e8f17092fc3f20eceea7739646da607cced20cfcff70e3a5b963e83f374b490b411e374ca3cbf405df1e2e051fe48b216d4f85c1269c789eacf2f9c95c8e6af0c01dcbdd0569d33faf3840ad8b716be8e5811f60fcfdabfab389361189f853bbcbb5d64d0961e521c6bd529673cb28599f3083e368dda54335ee471ea7d22df4ccadfda496fa51338c750bc9c038e9fc0124595151828e009aead3f89c641f232aceeaeb967e40fd6a28144d5801d65a742448b3a1358dba494582a852f652d14de0452af033d908c69d142a256e18fa61faf8103f3ecaf8acc7fe35afd0ee859dabb5678c6245db099db4690ec6d7642e6c127013e56e422a38eca79d3a1ac882f6e3ac5252abfe9cf09c11fa533a2145433edc0572a1202b5ff707037bfe21648b77002a4d34fae55e732ad35b6ab80c46235afd2c8a1b1705c55cc8dcc318ab30186cfc9908564eafe1bd80278fb1ed3f6af5e35d52ba57f2feaed6a59135bfae6ef6b07f4e9a3eaa90d0e9ffd0954ef4bab29f4b208651ee4b05141e8f0108cc22a92e472f4f1d18256ef62a55eb992fbc9b193e1d066ec1546a6a8ee603ef54dc8a5e39d2fc52c14b9c8ff2473b35b618b73a8071c21632c0e4c03fbdc3da0c43a3289d6029476da8649c9dce0e8a51750ee8584342b20b377cfe773dca32be00fb75ba005e63e4e4cd057411ea00ca7ba90c0dbb0fa81263390d7f8e9f6030bb9a2bd9db240eeda8dfb2bf395affe8d38f8fe803b06210e923d39fd7cbca2b1b8934421802b0529ca38bc66de3ef7225c8573140ad46cc7442391e41d4da76c8cf763de081b1d9672079d0d60f3831185d4e309d8fbe10aa9f2746f344f7db6b74db125b277a4bb15f62279b6542ed55555b2c40dc31a23341865d15a28820ac814a08b07f716f24663011e66d766d84b8656f511f074bb8303cacd177f70e32fdaa68080eff0f663fc9d7dcb03a7b4c8f563ff9dda7d3e175337b4d4aab6da6f0e57a8a5e8cf11ff217c1a7b5f7dd55e115e55fa07b0255175112b1a30c05af62e2865ff681def88500166f04165c48b68aa9adefeaa0bd1e80b8260a829df65c89d4ae5e449e98026e205b26fdc0cd169dd208535c74c093a7b6d40875ff22e5c2aca01f3ff9a970482594a216d18b0a36aa9a533947077dae54e2244df1dc0675555dc0d9b7d0d8766e4200c8572b993d778b77eae139e47cda78e7723cccc68a180cc9799fb741df438bc97a1954cc9a820347d50affd0fb90c0d84da8992de93dd5c2897b06b36deb9a8496e0afaa3513294c638a014a12bedf7f44fcec437b0ce1347011653707b095b98374e43bf671250dfc28e659a9ab0064c0026c1126cc58a796297ad395d8a5f1a99d9a87c6e6201209ad5706a9a049102a80c29ed3c762a1638df09100acf1b2702379978bb842e4f0e2fb58f8e5e20ae83f95f26b4325ac3f046d792e74a28740cd2b722f30b20a1b8c7b577fc2f4da64078e16d489cc4f925599920878dff5816455209896990cf0767e0b267fa709049f5511f8e17d13c4491ee476ffd1869bb1a2aab0321e73d967ad7dd663221e32d191ebbd92607e3da8a17761539fc1f679b7175d4b6ac63d26b0b475b78ea15563eaad0de69f1a653acd54afba722efa873f6f892ba48d847c2eb8ecc3121ad41e0a5ecf235f6fa5c647824a7d725610a2e0ba1b18f5511531cf9224cfd71219ca9606eb92cb036316ba0918e4c6c09e914201fb5b85985a0d3c49042305118b2f39ad487b086108f0ccf2033697f40e1d0e4c113c7bedbad81de57307c39d9214995cd026410efd1d2544f2bd0c7bc60eeca14502ffd59d59196f5bc2394096435e1b6ada9c93a9656e07ccbf4edc302c830a7ff73bda6b59d9eea39d9081ff8231f0fee14179738f4f437b85849fb23e7c8ea76154838da0056a33e0f0e8369abae575815948c5656f01e657d74db60e7e35a589755869f644ebf3d380fea153a001b5030c8606ad7749f57c6f6da362320861b7c4e268233e7acbbd694aa9748b4ca7af81bd9d300e21903e7387e103400ec33369a8f2ee9c1ea3e8d255b6c725cf33cce174f4b6dd939fe30c24d8b94f50b4448d33702006e0639ae4a53112139142a4533472078ca60ab461cbf04b07d41a335809488123c6f31cc7c4801e009aba7d00847feac262b9f99b04918312a4df49f1b4e4d99cdb3bb6a23a0db392f385a010ec832827d095fae157232715c8e9cb81bcaaf0182423af9d8d3f9871a38955aaf4e68964f784fe5c4d0e00bb4622042fa7048e40ab9451e2477d9746b2b0e3f62511d521e06f4f336dbad6a928703b24ff597abc7774e296ef3176b929e0941d066ad405913f338f3f8f718a76bdb7874b117d3390adabe40ec2fe710f03ae47205a4eb914daf3984cf6980436f0c18114945f4eff25f4f22b98f7176c007a9bf94a0ae5712ad7751b5515bf72f1a13ae149e8b4cbc605e8ce1b295249bf40421ba0d130ae16264f3515ae6431a89fd93a9adf0dfc7625ef80b35ccbad2848640ec66b42d5852a4d209f2c9b7cfd0387a7ee0e039b1f9d2fc7c8572aa023d9275822a0c4ed612998665a560b5ad8146bb1ae3b3caea8b6cf2ec2e3162a983cb6831e385eff916c578eadf65dd3211baedf402f6040f9b5f73a09c837546fba371720fab712fd3bb32102d239efc06077ba0db21856fae5d17505ce36259099d39a92af782e8dded4a6c0b445b79d2befc97d8c0cfa938d82661ebcbba6e321b196db1f485b299ce1a54e622c32a0c43d94f984e333acf43595bd5c6ddd519cfa926312d0a2b9be03a716a49468b2728ba3e763450a2d63108b4874f5d4c050d5179250b80a258c61337f442662b97ffe7fb0f1dc85fe223bcf29cdfa9319866bacd0a0a79c554e24d1f10889279e31c0afbdf64daf0779dfe9c62f25204586e3d985cc455f314c7309d4ba65bf4ad1f9bb753a438d31b0246289621e852b986626199a3b5ba2ce776491206433a4a6d02c3f846429620e31c1d92d8ccab2041c1cf4d331988e1b57698e032c8a93fa6e88859e588a83dc2f8e1d5918f5c4112c427e3fce1fdf7c3ca1342a65cc0113fb5aae4ec8b87d634552bfae69104809bf2020a5bbf77b394e92eb5fb802d53a9e27225d5cbc36e89c9326f428222532fc3f40cea0284c9ab4c61c68cc33f7b77f794893bb9d98b65bdcbaf3fc3445d50c26488323bb38e697c52d0e4b674ed2c7d78ab78e638a14abb2e3738e4d8f39165d9e8aefb729671e158819daa6c4d39eca4f937c16f349b49f093b8575eba8436dacabaa2406637240935123f940012bd900ed2ebfbd9e9d2a94148ab44168bbddd8b0fd0ab723baceb87ece67aba6978c038e4b66cf5b8fdcecc6451379c2a5358c5f8f7223ef1f455e6783f9eb08096bc13e7c1111c8b13b79195d997cfe29fe2f820963340fc92fecd5e9b6e96faaffa2c469ca6b2c2cd1a4d57b4f306471bf29df12e6d1cadf13cc90a8a68d25a2cf0feab998c5d12726d3c1463b7e3ca200e13f5302e2698a7a656069d1c07118636e76158407fdcbc06fa667674ecde74ac16973bf5034f1eb1f0dd440689a34442831249419f94029e14c85db8960662330271b2501733dee625e90fa6ee920f9a6e38fd2e30dade9907b499e153d4716963ff33dde6e950b961c4607bba6010a4f54fd464e803a86e3fb5ab7dcacb3a85c7aa20ecf6d22cb230f9d70361902008a4b17f7409c118a44936231c5f5d263e8a0d1a0bdb70bb572ff3e3cc6894862c19285eda2a7577d1a0d0611b75fcbcea37927fc8e957952e9b4d0735540feb85befee305dea37e5cc2ff0619c33c771f5cc4d292c4f9428f1f5fc1eca844a8bc02bfac957add74cc4c2c8295bbaedd54763ea2f7d2d83c1f38c6a430c9e5461570e52bf7a385f39698d356fdc396681ff04a7176b766fa5553fc1ed05d645c58a5f9e1aadd2f835235ae03d07fb59fd87782ce8dd747f5a81d7a9219c73453cc0e885e2d7c4cac75aef719ac447efd2458720aaba6ddc6add1ccce9b9bf7b50626fb020e257fc7776158f8ffb644f87a3f82c66ecaaad5dd3d5cf4c44001088d6bdc7dcb5d0b6cddf94e222949ba3a40795f7235a731bb9c9cc5d53267f2c6c859a711c387a2252fe34135d773410b2db242ae9ec104e0829c71c044584f585d7cd56ea539c658d39bdca488c77c038866e6cc08ac86dd15a8fb4698a56965a35201f4dee7daa06f9f6aeeabcabdbbe703b66b11ce4a19dc4ecce8add3f35740559744ef1661746a7a8684bed1a88cc0153bfc38aac11f3cfa5126d2785fb59b041fcf3449fd4d4a99ba073080af0eba17d20ffbc68e65be384271c4e710f939fa06046d0700a386997fd6bf6c43ba2b883316b9b60475d684fb69f3c4b99aa393e484f7b21e1fb4d64273a9d90907aae2b99120ddc5d82c6cf66fcd75bc324e5e25a152ef980a4bfc9c7e8e7b517faeb3e01f9fb234f5165cce03d09e8b38b0d5641a0d24110bb2690857ebb7dfaaad783102a4e7e4653ae0ecb6ab93c91661860a3f84d42b8c9ea7f0803002e5e12dbc46facec356a0e075cd089cf9d863e6ec929268941a155725ff97fa0116dbb5dc7c587bf90e20cd97f97a43254ba9a77587a316c89f2e728f7fffa826e4f2cc755bbc3aed6d7d58d40c7c2cca954029ad73f21e061d4077311c37d8e8d2ced7f36f969a05170ef896508ec84e37cfe420c1ffecc106f3ebb73ec0facb52b87ef3226817f47d6e437b60429424c5c17d4c1c3d117dfea1369e623b9c43074817d11ea113201303cfefd6081ee2a19d4b9bcd2a2ab166e0fe3321082be443063939aef23a1c7a77d4500c7fc71c6debe59c6f5776ffd22b8921f5a72823a87b69896dabeb4e163317688dfa3b168d15b1ca6d45a4bdb2f99de75aa91f95aa000f4ce56eb53968bdff85d507d97581a366b26165227fabc3730fba7e809eba4cc0e0709b1662f48103347c3920bdde2d4ac0c6367eba0f21cee7afa7e9b37ba9f500c9b18d5f4c14b8f0ee0ebf64051bf492165a28016f9cf82bb4a5b98840b0321a4b528882d1f1874794e8f3eca8e7ea82dc10acca4f8d852834088e61bbf7fe996ffea672289ff4a52b686cdc0c29933f822a8b89117c0c89d840c6f44fd9c11ab20655b1b2889795fbfd9896d149850492e822c27800d4ad0bdef1946ede0ffabc1a14a5f233d6969128f5c18ad0469e98da311ac584a42e3933ace6bb8d51c5e89a71e37a3a4823756b02d08b465e5a1e8104d69cafc179fb0f475f98603d08b217ebdebd0442d933445e38652412c37e7d2caa6fbad31ccb925f6397ef184fc302e11c3d1a8d043545568daaf22a67331f26eab16e4f83259d53973c9279e775fc00006cf55d5105de8a34cf28fbb1f6f7823bf412ad498360d25ef8e2d88c5563b74fef1d5a2c2f8067c244411d301486ad02ba4062dc7f8d4a4f4f68ca8aebca754f160aea121ccb8dba9cc2f56e365d25d3869006b8848339ecb29cb68f9390d8828436b38f48205a824b371ac8b6db7b12bb5a0f6a1ce31f9bd4e722f707774f7ebc391d105c1f6cbdd205f3dc10922b64fb36f36da31d69e108e0964d91be48b8208aad31a32922d1c3c82714fe11a53eb88f494fd192a750c101971fdd0652b34393ea6fc7ce1b4292e61b1fc9ca770465fb776d0303666fbfd29bda43c00bf4a7fd3b27348eb494b1f84638fe3d1f6a95e41451d1b015a237cc2b09507bc300c01f35e473eb9d5cc3774f1d15da1cb5cad196aaa859337ceb66bb29adaa264c2e825143f05523ef29db8c18ab31ed8a775c74b3f14f5e742d2ac2b795db844b45bf23c2446be6e067ad83d818c5105d2ded452a6702e50c7f90d83fb3708b82a83e03cbea8064b4ff55dcb8091403b240fc7e6a642465ca7531722e8109aa96b87797dd5d431bf1737ced54d6af560e631286e063246f228075171089274fdc0904567317147b1a468b3c2b1be785d616b80548fe735f9943e44d62363a09e71c6cb639928510840ae95fa7435cf1bdae656ff090a1b5b311f76ba002b2672c65093d7d7a155ae3134fae55e7804819cc932d73c4201ff48d3718668930c630657252cb1835e8abf206deb372f1f76ee3d9c44ef38eecd2081bda023425c587b020acbf0777184349b7374c60226e4176a1daeec94eaad0352e072f9e21e386b7ac91a5c249884d6cc96e8d49723b260773c7df9fdfd87376e6462b21858ed1fe6ea83bc33da72efdc5daf29991dc8118d8219df1b304305fcd1da158e145edf6ff56dd94b4036c5f250318dae1d0e72d376eb65978ac9b524ad41ebec5973f33d73407c15d0b9a037f8d6c87e2a6cca72a059551913018f1082fffcd93014a277ec636b3894e1cad3dc07a1b24cca639188cc7648d4d4dbe5d77c10fe9f293546e6406f5d94978aed852ae2f28b108359b7ad8fcdd428e0ce351fef03b19af4d1eb3e4f2cd7c427ad79a951e5f02673f2b462694f1ce7e7f12352608f6b4f27 MD = 7f28550790116649a20517a4cd930792e2c349209d7d2d366481669f Len = 41696 Msg = 7b32391369aa4ca97558095be3c3ec862bd057cef1e32d6237479c81d2d03a3e1abe5480e6e5824cb80b7f4734923876d7572349e5d9d2d8a39ec86cc7d28b412d32fb8acb28e1b6e737cbf2879a18ef2a284fe5b57bb5d8b0511e1ab23203111a54d53a00bb916e6ca49564c524b2788c0d82aa4a11fbeac62a45937c39c9354bed8b976ee6b9fcad1a84a6d4782e9965cc64a18ae3cf964defe6df0b2c063526c4c4a9fbf182e9146140bf9edeb5da1d2e9ed15e385765ad69a8074956e19a15a32979902313bc074072b70a9e6fc41cfbd843ae5abbde4f6034121dfe83ea7f50610e16c595fdf081c297ffff83decafbb9fd638f248a999c31086e6b13b0cc941571731f2f3536ead766674a19b090f5ea096320baeff4e448f126e6ba716337eda891790aeb41445a2c29c85bc3d4b3136f9855a497c90121d62cb7a0b7ae0190bd561b4da77956f2f12dbe6f9efffbdb35e9750b0a7ebc63be6826ec0914baa7b7ac4c21f146ea48be5b777dca7a96ea653dca16ce7ddbb6b2c27bc7f0fd29d99f7a56ae5210c6039a9b3aaecdac4ce9067e9aee6d2c26c4b922fd58f3d117cf7ca87f1b513fb3cc8ed54e2931fce48021932eba6ff56732db70f5c89af94c31561d1091773b794ba1f1fc177dd42856bd64cea35a3f64ab2094ab3e6ddb90a636c350374a6ce027dbd78ca03a9bde14e2d9c1d1b871e6d5917667e3f5e0abd623818936543bb009446f46ebefb8cf6198da516b10f5b55835ff71deb970646a253f01b51d0eb098e5a271212495c3e6e84fc499eb3299dd1515105841f4840a44e502dd2b4ea97dc55657696299824bd9206385d0905a0c37a18e7916d2d45d895cd2d50864645fec743eec2f2cd337743576544777bf8ca58c3168bf74190cfb8ab9c63cb6a6e763e56fd216b67f52c0764531d84f920667bc424ec4401ebea25801d84dae3abd318f32429c9f4f45c5cc17420c809921831b0852aea0aa1c87aef032c5b3e7885e5ccf644b5008b88b1d36af6a729d860390cd9d04fb84ceb175d0fd2c2c74f0f3338d61aa2f75521b53e8a17b8e65dcee02d7564eb9757b2893e7600883aa9ff7fbb56141a55dbc7c547640c53abbcc4d5b70a6154145cbf5f27e84e31f513a729e8f8b991b879eb60a28b3d2df65fe2782deb5dffdbc681f78dc914468316c6d03630839f7bc9ed25b45232ae62c19845f69aa3754a1f7ae0f4baeb4c611daee127900a9a2c467d73117b753b5d8c66dda5baea2aebe23ab9e1103baa1ba2f00b3189a7285679fcd73e498d7b631ace8dbfae8aa73d9911d0d77b9de61f511a8ce8afe1b076defbc09f5ed3e50fe74004a9081d60cbbec0c44c5f8a86e8829f04b15552c8f9dfeadda92df0eea09c5ba0f63a0aedf2cda812a43e7a1313b1edf1202c72e87c075a7d00296d1ee18482012bb6ebb55f40382a939af5010d8987d0c997ba8569efbb3d28f390ec3f4a4393ce21384d7da111aa8ee773d742541d31f219a2264ff39d8c97ff04ed165820d731fb692cba7a94e10ab68f1c6ecbee834e44b2419abd61e9b1be51880338aa5a0b97f6b9a237528c7b8aaf36cf3bac53428b737dd697b8d31ab3df438256308acf99799ad161dafb65d64cbd003db70053605e21803d02e7377236a6104b63e7d2726a46b4849ebc5e2bf0258e3c9f391565eae323f7c0849c6bd0363982a50fd8b53123b81a0e5dd8ee21f6e5d2d56becfea2293e628239ce23346a6a96845126c476d8788caa4e4aaf5aa7937af9f76ebd0c6a3c07b885211aebc93ff1725a6142a3cb6267030c47e222ce13af6d8a0f03922cb941e3e559c56eb9061e0f9a0c9230830233a9263528f2c0d2eab0824274cbf712cb84d8bcb525d06996bc8e8d45a585c47cfd1ab6e643267db7538ead83224ff4ef2bedee5cb9a5e6d5f9a667df8b4a459d8f58219cac65608fd6fd94b12d9dbc374983534e828fea66577020b25a46f23fc07d29de971427febb5dbc715676f52e5e377fed291500c2468a4c808b1266be40e8240e8ba9306e612d796635521c5eea88e8cb05dba66457434faca622ffa37127a4bef2ab266968fb6fe232b5be336ee6126ab12a67e6fa49aea9240f3989e1ca20628470567a4335e487e72847366bdd813eb3a7b1a4bffbee089d2da0cc132e2b8b99cf5d0b807b8bb9bb1033e251ddb9d975ca103808d8823d7a04d20475f22aacaaeeb6b7911aca1a370420c1c17520ad7018001b756e1fda332b29ad9a84a2584074dfe905b2340bd37a8a4f2b225a3d5b080db9863afb4151172431e17426f0e2e8452a4ed03e2128f9dd050f73db0b6f1095bcabbdc9157c4f6e3bfb3f2d091abf92f5ecd36cdc9ff8956deec8079a54c8347f6664edc8ed3a542638442923507135c6605a2490b10d5ff439bd745c84a5668c36defdde5c7e627b3931bfc21c939a3639d31a00048e793280c2a5e4772ea86dad7a5dc8226235c56e763557e79d5cafe9bca18cf3228da3446620a4b4da769e2ac5a208d7bc3a7f58804e6739f4e9ade0954fba153009c10516592fc61f6d884f4f5f22f4b2ed1387fe4f729c40cdbabeeb98f9d35d8a063351d3e81393d9c68b85e9a8f20cba2c6d3edcfc86f77550f53e01dec5f16afd6fa7155035ae57d35007d60d78104e1488c05b87729f7cfb03fb1ecb559249111a94821a94e574394d23a8b2cf7405865b316f85e79f41336ba144621ac680ebb4a8ce89c9cfab62c387d65b809e8cdc64f07d8a6e7d6e74acdf17158df4ced7ce324f303cc359ea6392e34a33f62091368c0a077fb0514947e30b6817a36f8fe7ef88a076672c2a9dd3541152117d4f3072998f83ee962bbd7b95dc40590f5e622f0f4d0f318ebde2d7ad435386ff50e322a085237ea9868e074ae4a09c1addfd8f47b85fb8fe1ec30e5352b0bd3360df4ab37ac6f718042a04af13b0e31e88fa7ec654e043e6c7def5fab2022a95d9852946e2f6ce4e0f21f216dbf9a486e9e97c0fb54988f543670ce7f3c065a335656cdf503b8ad811f65e36bfc376e06b5b05885bf3ee960c1bd1cfaa63e4f80f0073e144fdb322b727b76331d6c0b7a7cfb9c4bb77fb45ac6de2f618752ef0c0d6dd0133b5bdda59268c40d48c187909a7f759463e15908ecd9f1ff06cba19e56916939f1c215b92934b341a6bf4a11b844c9aaebee3e32dcb8481b4c30cf00737af2cf9697412ddce82d165eedbcc47d5382d3782ecca23e831efc8009e0f80b30541d5563cbca558a19d598d4467392b3865832286b1fb9405aebcbdf3c4fc6bc756b54ad1a583c255ec77efa4ee49e6cbf8140648470f5f9e43055384bcd4e253f01bbfd969f38bee63135e93ee04a871395ca6a7d5e9bb5a413459f743948739926b3dba766f25f985ee8297c2f3e0b6cdefac3c0b1537d82dcc399225c5faf6a2464d0b577120f5c95bd4072992100b1a2f6f6b331c45866d2f9b0baff39e09c41f56328983fd71a1ddcb886e69b6fca2ae68bc0a5974e383e0d6ba5e87e0e16c68e1d689221bdba3f6e1922dd565f9ebef30a4ed77367e06827524be0d741c0fb5985dd2d61cc25439be9ad48f7d817a545fcc48d01ac469870ee14aeec8282277b23f030a70941718ab28fed29e21c2903e98c90e92452160fc6691c64d844931f7f07659a7ef71064fb2f949286969055570da8d2d7ed292d63b0f0e74cee886b228c92e332306a504df707dacb6b2364d0af9c64cefd1bf24b53f31fe5684c8793e5802a2dd2c5772f4e0daaba842a58dbda3648106b328508b8edb1ab9a279c5a7cf71678c66a01299c6daa59c9ed5901f63c26a520b70f2249a648a66d63d200b7bf4f1af5a115c34af081b222b38dc86b77a59603f1b71f6ce58adfc747500c009f7e1b46b2db86be5ed7cd78c61fbba2af6eeafb2aa6898b741f5d921a3f06be604b84a0e47cf9617f56b0b16c355f01ac29a9f2a803e70d19b028b425c67658ca5d5ced8020a59b1aa465b7eef83ef1357ddccfb5f7c25a9de54917b00ee538a55dab14ceee10d5f969f470948fdfdb14128a7a97aaa1dac765c7a1023fdbc5b9f279fd160fc475e24e63c6a522ca250f91bbda96430cf561d9aa3c6580de67cec5cf90a0ab49e59efabca06bdb8839efa277d9fceb8b1331e8fbcf1ff97886ab7db4b5b3e9258bf51707e52ce0a07d7becc75e0fc9a79c013bc14179d3308a19c3315499f1e2d1ae4a4a7f31599a5b7d18b2521906e7f89779047cbb368edce03f4d5598ec071e933d8f55c26fff3abbcd419b60c9d48fbb4bcc672d491be2c89810a0f9021dd96a98dd4f26495581ffb47b222d3bf4c9375922ea17355e059977821d045aab6cfc023d55a711279a0f7568cfc783d20fd24a0dedc021e0ad1a83acb5001d393e1124b54f8becfaecb3b7108b78cbf3c753c79658713627431465954e377250b771a650251b0458dfb5227c3c8638e15b8377c413729cbd2d4fc445d1ef82773fe32f13c09f81c8dbdc5fb3cb3af423312a039f070b7a2ad59349c5277174363e306708065f8bd348ef16bd21dc2741b310122f1a84f8f4a1a89c1c360571151c20f836e0a248ff8eb7eea324b4f8c347fc4d7d352440a5fb556452e8f2a19d417b87a536b2e3d715fc906cbe09903257b75b90413477c44a63497024822b551609bf5ef1d582e04685a420d62517164a0ae67024fcc8daf69bf57dd1fb38c501924568f7544ea4871cd1c8544eb4f588ba9326c8c4596e67c20d81d9a6ef766bddc4cb32776eaa4187bf6a1fcd8f5979920cb913d4520804a33c8523cb79efbdb3e29089850a7add8f171121ead1c98559f931ef73dc313705288f97b2fdb85ddc47bee3c84c9dc1fc81c241eca2ce14d6019743eb1f6f68af79aa1da2a45ab5209c5d2a865a9a5796a487671d29ef8ed2cdf2f782424dfd6ad8db9de5965c2b47897645085cf9062529677bc38fb45b15054af2816d505ffeed2cffc1fa462918b50f1c967b433570b76b6627fba5e36750a71e30ca02f6335fa42b7ff8a1165cc9339777deff4e40f7990e91964b8e90561262d67eea2ad1d64b0a66baf45adb6ce79ef5afb5b85d91fb5c48882dc557c092a6bcb490649ffc2a82c065c75d5d4735195613eddb8f2c993896f8d3ee863630d22b927d0a6676487cd324a386aa0224f0e334301f9e70798bc10ec673e35ff3cf69403886eeefaee1e91d0e3f8944bc0be43a05ec5107a53b12f48dba37e4e383bee7493eff0d6297487892f0c4b50652a14df5aa71962532d1cfb02d496c08d774af399c61786e88385eb7ff21fe09ae619387c1c6c8ff5646cab832e3a06bb3d2bf8f06dbd9d99a03f704d569c7ce056e37439918423d91b90a2c33cb2813001f40d3e637d8acb7f06a01da63b75b410e5fb19a2fafe7ca71ba9497caab08a4a4598ea33b1ceec646e03676d977ba488a345a2dd3b503e9b70079c6a8d25389a93347a5b04ea7af4e802c1291aff3042addc5b8cbfc9bd5d30461282d44fb9575f586545d15e05a50736a1455060c5b35827aa5e02db6780defd72521a908b252c8d3180c1aa0af93e078e6eb240f37f54d025adaf05db9ace960254bab83c786d4b7598305ef9661f0dfee1bb2037fb064e44181ec9780fa19869074f073bc5a40b97f8b7dd5f700ca2696af58f11bafefa8c09cca6cb53da8d0ce6420e079163562f2ec2a5bbab998d5456dbde0f23a17d741f531e441bebec647e3e4d2e502da381a6eb588c7d47f75621f8ad8ee9803f82b52ca080ac581f163b9e452ea6658c560d9c6650699a98d578b66e2f613dd93e67c3ddff99a1cd88badc7676f89d6912af404f85f503ea58b7afa04f3f1ca30da3b3171f684b5042589351a5db47d22e188184bbb40654566b3ee48cb7bf4586f564fc7eacc75fb9b13d8729a2f7502ee5da96600b247f65000e9b667f983920d973ee8bbbb8347531455770f42e5b9b73b604f18ee0c3fb1279355afb39f671cc4a6dc5397086fb7535731a435f5cda6eae510e93cdba9f1f1952d8bf06e5e04a631ac98a82bfc2d9a84a9424fcfc82231dfb15de4dcbb78269746e4fa1bff2d05855f743815751faf84e6cfd9983292daf7385b2d39fdaf8e40a9a017ccd2ffa94afdce8ded62f45b00f0341b7b9160abd4afca6117f7fcf0395da990aa60e359298f8df0dc4c1466a0d05a5d9e6ff36d1f1d94c6a132c816296ae5addc303fdfc91c9ba90abae7980b8d28e72953b3e77f8ba0a4fc357cc6b9d93eb58aca7c01d4acdf009e34d5b9ea2f850045c608e39d00d64553887ec991b19bf2deb70388ef48413dc0424690e4bf5bf21a4f5a2720841ef0ccb438e758fae3aafe7e3b3bc4f6a9a79a6da2e6a2439103cf76117db11f60ec8f4010e7b7bc002612a78be4fbc0ff87513c5183cbc60f7c8cc395abf8da8482c5b470935500d9ae43bb5d493cae2b251038bb2f084dbda57bbf4f799cbc72fa9699bfb1dbcd5689b84118342ec716c9fde748b201e283c5c1f1a5b146ce139c2975650af02c5f019bc1236b7913a6bb40d361d35d8c492589e100199d174dafa7d3ca663d24dc5c11c3e8b6c69ac44202846c5bc554f70ef918c97b4a9f097d3738568d69bdb5e344d0cedfbd6559a86b81d313e04075c6391d669df46e304c022e71461dffd3de5c6f3dac057b4b33a252fcc0575bab9572784147448da865303c835a01f31c9580299de747e4842cd07f512dd1aa81c5ccb2c043e1035b10e8ebf492bca0794fd98557562aa9eadb1c903821f737e09d6e524d5875d82f9552c12cb4f70fd2568f0bd1c257d16787af0e1b637109ae6481e04f4da5140e3b97489388594610f0c94374f27564e279b08161bce628d5632ce52eeb1bc0df4bdf0891d88b4f1966afb6a8b02d6b42fa486f72f4fe9d3be298e851fa7fe48a0d51888f6a3432d7006bebd6c227ec71509f62b6d3626fca28ec7122427886f6c91650f307fdf53105226a64f10af256c3dce19521baa6687f5108088aafb00dc755e827778ea20ebfffbcbc057e82d99d287577a5ad4bff2def366b9ccc69b64e37d991828e405874276844c62da6e224aaa4c428e464767bed82b33e76bad9a8e4a99bf0a6d8f66dc5f666fcbc6559a28bf9e47207fcb5b17475493955a95f1b83e3ac887d71d0f2ffef896ed6c8265df2f93f4bbd18a417ab95935412412ef03d0c2b13bc13ce4afdda14e521d5329e082e3d7baec22bf5bb6dfa5955872f6f39ae825a0ac6d8bfe83f7129459663acf41f47c983013292cb82e70ec5854adfa05018221093d697e8a60702eb13a2d1df54c3fee4dea137045ec03d0b42688a997b55367581b01b24983e38bb53 MD = 078f1c8cb726ccee15853d9f94d8f6681505175a3b8acb071d5e6c7b Len = 42488 Msg = 55a143004b932f3218460cfcd400530463a7a47cf634673fd564af1c5db0637144809ffc259c58ef38e33f42603fe84d6cd82c969688cce8509056a541894d5c8a9d849e4df6cb0e7077cdb89eaa39a48ffa20aa8a239f8728e6bd315a019668ad5eba8ecd8bd0b8486a7f05952a8e2f5575495fd8eb2746e3d0ab69b10188bc372d0873ad41ae1549241bd24ea52e1645b26f5e8acaae4b0bb4e7f44d726981b07137f6f302af4cfa0e69c6cf046282e8175a4fa8a77abe27fc3a7c363a82de9e910fbea9b51986e48e338a2230729bc40dd1d83869d4c8c00f6ca675431bfc8bf75874d64235ea8d0d3fc54f10a68863fd9ea444fa04915d55451c11737c03fe0adabf83904ba17ff456205c8b45724d4d8759d341524086368d8612b4ec1a80325d48b789a3d242a94043538b9980086755a0ee2606fdc41a0b8b81edb56998d7a8b67a1484a65c96c5d53bf7e8db1eb1d0209c9167f29d6988d465061d19ce6184b2d41938455721ad7f1db67baa1795bf82e56abe449b8bcc09c6e66d52aa39b9e4ce8105d6bbb4bfe800b29a167979eb6dd199531e46e99fd1ac77ec3bb5c50ff36f3234810eb6c4b8ecd28d47cec71d8a69076ea625e9c9d420a0e4fd766e4e88c0150c70da8f8599eafe9b649de61b81b49a5704c0f411bb29499bbf759c3d4ac712d7c8a6a6c731001e0d956f3eadf9ba3b55619f73402ed05a5aaa3bb8a5e28e12dbb4fb655528391b2b04cb379d9a84d3b2e54bcc1ed41cbc69e64f284ef71dfb625a6033f6279adb3dd63939b20d1948b4b74b6973561555109a395600327ab7b2e25d7871d62d478b3641acb3fa8284a40027b0075bc30e97ef82a8833baf2c13757a9d8fdcf9475d4a6cf86908c56dcae7680ba28c2fd0450cb1889eb9c444cf3b400818e206c4fa3a41859ce0eced6d9595e10b91608164194e5d1b54bfe52d5b3622d48f5da4ab2f49bc132afeebd63136990b115e0a3a40e28fc0b5aaf974fde5538a8c05d1b8510a03988d044e4ee4d39d6ab5325410a7f48656848c67ed4bd3040480063169c70ec3f1b105001bd6f554f024e3462d760ca9a4686e17e06a8a9b081469ae05badd65e73f09e8852e2326640679c7dbd6b262740a57f1948592825ff0352fd651fd4f42df19eed615e67b9005fdc160ef6f198c124fdd53c2711fd1bb729b22b5f8ebca383bfa54b2c5bb3ac7761b05e8ca34b5275fc36349b1dc251d28dc320d56a047f379f4492e484e2bf4ecbd12e94c1cb7f18d8b0d43d92025c060d94e829dd580b7dbc4fbb0f79d2b35678fcf1c7b395a1ae31d99d872529749227abe3c57f43e2d6853b3615b0e0232f07883a7e2f3664769614f2f03dc446374a7c9620b6449fd2887b868fb0a77928e6378b206b3a222264077711425f4b46048b81c428d69ce234954ee5ffa53fd4a35f46671dfd75322a058c52e956ee4ed45d39483d766486282cd1b10445e1d2bd740eaaae1cd82656b3b54d8947c9c238662ef56aa0714ec186c16955260973931a467391f4c56f88768469a8ae4840bf4ad58436e15dac9f57908768a21167c2b6705a7031c77e2de27c2fcdf6f43ac75fcf5d38b594102ff3c183c566840fdaed3eb7af3048e2b56c0f087fbe5820ff296ee8d6998f29e20fc6f6e1dffbdc3a02e423d59ce43dcd97af9c2470ee83a54c46cfa709d95a53f03349446ac36d6ebc131759c403dfb4e9f053529b21e3781ce97a0092fd120439790373b38533f75d4e1ac242325939c753b690a98cb0e63fc96099a154e161601abde636bbb0528af7a69593ea2a9ad45c4e5538998c5e19592bd8d18b58f9f89ac11260c1730ea992335a35b5d476856c8316a4d2c66e2e3b2424800ae93c676bc58ece50ec9a5dc04976a40fd74b5f26ed6b9ac31f8502c1f223595e02b7312023c1dbc49d640be461716b62b397c5fde5ba66e4c8412b900e5ba9ef45e8ea3a744215a6f62a388113d0f858f9da5e641489b5a271110d27e1141e59135ff72d2f961872972b6818c92bd75d0a819cfbf26ff396aa732bfc130313060b6aec7ace1430a1f1061f3e09d894e9762be627f7c3ad3bd4e60c7f0c9f24809eb84ea5d8630adf8438c2434e6d9d78bd47de7aad2b4f0c60f82333365ecf533dc67220c7091365d141f5db1f616d955053fa567b1d45830f1804bb48b87fe869040b8e125cc6ef58902e67f54a91d9cfdeae5df9f04d2a1fd425798c32b2dac0ff8f4052f4b1d69ad1d07c588f86809c567ef3926ac28c13ab09f0a9640484a61751ea016740b60855808ac1b6d8544649f0b9ece32203ab0b36b308a2e180b8fa17ed960b1ff831b9c305b946f3af4e27981361eff83b167310232295d65949f635cd99769c37a76cfc9fa7b6551c148dc98289e7b18d16813ad39fb35f7909ca2ffc842031dec9edb19b359b990559db2999dd60ea93fba42b46d871f95a58b48b0cdeae9d6819ca669acb5d2c055e9e2ccbc4f21fca665a55ff55581097b763cb7101682b6e2771a000d1718a96c345479ae901adbac7223f5f9edc419bb64665cba4e3684b7371e28ff07f3124087f0e89a21630cf9e8a6c0a3d8518e0d5eaee7f31b6d0aa7e59927aa0ecbc479e99e61a98b625736cf1506199d8f2f186bfc9fe2038f0e5b87754635b30888c063462b035581860b2f571083c4e5c6859338cdb09004597b2899cdc87f1224bdfcd08fcf07275f1f1156260ad5bd19fbde4ab9844a35b3aecded048df9526017bc24d5362abbac1b7cf990d6597ef223551aab87b888e39c805932a9a92e0676ab2a455f45a733a67928950ed88f17a5ff91ebe16266b3ee48c5a147170fdc84d2cb2672e052bd690fcb7edad85a5028e595c0b9d038e94c2e19978dcc5eace638edc2998324110c46cb9363e34667540d0f74378b644e5d383d5da34f813c47e5795ffab785f936260e1cd180bb22d381e84d851a54aaca70193bb228e2544de25846bd03dd3b8fb87d614c38214b4a490694c8056ec53ade9678e2e0e7bea03670bf0bf094a0c00300aafb91e1a8646b53902bd51c6656899a5e5afefa41e9e9ab110c0512f0710f803e06156102c7f1b68bd311c557c6790e33430a82a4d004f086e7cac0f349e5e366964c0a201be216cbeb41d05e31b6db40c48ce7b0fc8e2664c5c70470f18c136ad3bd44cc09475d9999eda7444049e7cd060d902d168f37f4cd854731110cf692e4f078cc3827723d059eb1d09a391c223115e7e3c5100a7e288bf2fc506e7625f16d0ce9528a3dff59db56cce78e61866c2a5399b217874afd616b9a56b97a6d24bd6aebfc79a627ba2dfefed1509d43dfd63c1985af969f75901cd3ccf5e9b0a367f89ae0fa95fc521b1130fe88ba9fb3a00a29e5dd1fc7b89f6b6e5a2bad3796f320bea618f2c7492df728163e9fe3101026927aab0a08ed16c235a762ad4a26e9491ef6d8a5d0c7eb19afc27834561daff61bed203fab3c7e88ee5ca2d1317ad2da837644965ff3dedd8caa4061420304e38ee644a7f7ce5d256220f30133bc363db5d163aebcf58dac89759d0eede99856b20c202836cb3e01599c5e2599119bd97cad3dd32ff680ef6ccb9823a0f8f1b54e08bbabae5ba6849b78ea25aca38b16a0b3dbeeff1e400cfe563788a35899692b811e19a9a41f16ef5ba0e9b19a8d5ce88a44e87594546d07bb84263e3018db11204f586dd1301f1eed865af31e2a131dda80a7d98144784fa587e3b9a8f472c78d585242086207f1d7a75eb955e8a3074d9815730c99979dba47a85beab795176f40ed72713b362dc108de4a6a52756e8993198a5eda31baa2cc5e6e1be8aec76f1013443645149d52b3c3ef83edef1a36799a679e8fad6f061eeb38661024a034cfabff7c080a0833aff3f0c9437ad3fd538253f54175828e463902f1b65f6a67859dec6e0b7e350c04589563db7f608628b8948b77f0bbe14b2e13e462c7edaf3bd15331d6d9ed84bbd926793d648a7800247287b986e4a835b4b5689dc4f0b5f82e7cf0f184f843da5dea35f293197be3ae37118f9fc38a0cb22ea5edbe3d20c49eaed1e5e51ef26cce2abd8172d539da3e295382a32230d90fc7c2dd1d9a99a70932fc3866273976132e39726b8557ecbc927219fac741a4b5c8e7f249d0c8aa55519a756edabf02143ed24ee4f3802210b899dd0d7a66738b793eb6aaa754d46b50d32164002d17b9a2af9b47e55a8222e4ee54420547507921ecb0a8e6e62e337acec6b2612abeeaa1fae4fb248d17da5d9908022f8b42670a1c68ac5725be9516b4ebbfc55ffe8f84d8ae6878c2e6216dc381b6bfdb523d7af4671cc0ba8e7a6bac19f3f473df90947383f6a8a1f9dd5a9445c47ede86e3ba9c3462ea4ca6c8c2dfd7b6b50f69d516f3ea0d7ed157f86d33de96343de842123d57e49d840c696375ad70d2dba54655806c15c0fb0858eec9d492a89f8040c9ff590ca00aca4396952389117e9acc9840907637c615e7257dad22a4ad54c62909c141bd85e840a367c2693ba1504d265ede98abdb858b5978f3adee0f6fbd788417eaba9d6c47d114117918ebd0b24800dee4e4e1602ed4e12d9b4f6cd60bff97e47160fb603f6ac4991f6f0521e4464f19c0a981aeb7dce1e4538f6c939a066bae3d7747cb12b49ee0c409964bca68721695c363780ebaa09f3f76b8ac50d52700b6c728b6a7f8cb70d1af47574bf6915dccfb2ec61bb645e6c6ccf82c17b3f45f44174728e67d73d1ac27c04c5137d677cb178a9ec617f9415058d318d6eafa554f314c29b78dbc89bf39a832c37467ebfcdf210af727e33945e3f27a75c060693fdbdec1026ed12271afa81288f56c41c61d9811962c2c550e35fd59db7e4f247cdea5f9af69d824295067f38a020e0290979abb8b6ffb1e11169bbef26bee0c6e024bd8a6c6fa1551e38eddb0e374b5c416cd11be38791bb74e74b0a1d166ab7e0e7567d0cd5e7f5031c4d8e2dfc8e2c962d91a17cfcdd468a43137d0f6de8912cccdad13c62de98e02b2ed083f2f11074367df7f7b21d18de27a5b67237f2c9402fbb258f88edc731dff230b4cd3cbe6811f66dc859a9b8ccef6254fa0711e6a79a77e88acaadf674c5483d14bdc97cee3a8b9183562b9cf314e9c6eb5dbe7fef9781a892aa87ad2555913438772fe2733abe019d3a1b3bcd22ac9adaae50db64a168d45bab1351c01b5dd4947bb875937cfe1c9a77e12bd7b30b2f4c6b91afc332adfa2a4ed99ad1811e9ccd2e2baccb8bdc60ef9225c39f20b612c537c96377d5c188a2f832ded62143db2710d1fe87d1c97d210b51c980061de3b975907cef05341e4a49c7945a767e3e56c653f1650955afc355ed7416ddb2f0bdb76f72b54b862984b5f061baeb1e34b0b11a1bcf7d01974b045179e01205e8366fbedb57132818d6cf55bd8409b43ce9639cd443b74db22c993631684d9738a821172d40f6aa8ad4f8501e525cd0d5554074c14e429a9eec8704411bdad740a75e00df0f507dedf3c387ea825ee49c78ea1a596ba998ac0f40341f775456bea888f4671ecb22c0b7a365c8b07a6fd0e8c2f6030856a86809675e23174485f120346a5c0bc13981952a622f5959f331196da064c0c44a516f6edaf25825f59692e2fb3432dd12df20cb0594e957ef2b8f4c91e5118d0f06a5c94313c673260d9506ff7630695f07cf07e88fdd0ee43ebed2630a771b56e641092efdeea687c4ab331f9881106eba04535376c0e952c92ca16c4b6df9c27ed590e7174d5a9b5a29d9b421b14cd25475500ef02171bb895d4c363e52a2d24eb81304064ee9f14ca57d55982d891a65766053627b229ecdc5055949e190f6c48ce22e318fef0a0aa2908c62725fb77bac16c9743a967d25089f4e04975eb07ea8909e2f6cc44622a5a5c1270c3b39f56ae5e97bec27c71d7c6c6ce4c0668febbf910c6682244603334f8c4c7796026157403c001c611d15a4ef6e610942f58a1685c16d5c697a4abfd05649310aa15dd5d8299727ccdfbc26aaab0fde7e71d861c185aa581e6367cfeaa7b3c513b7398af03aa7aae59f6f5620bb57cc63956515e6a1b3f1bd91c8c7f10902a01b8482db3b07c82225ccadd7e407cf3fbcd0aea767adf0d5c1760c5c85e2bc4ebcc9c84b1af96f0a17f806106718dcb4c4a4139ac7131760c490a0d20bdd474d61d7885f128802df36a1f6841c8716d82590325487796e2f216204ed15514a28953e318ba44c3a2e0c4afdc786aaf3f65a1599891b398b9d727ac6f214d72b4cd17e625562ae6b6303539a4f382cfabbccb4a7ad04ebe648323b55859ce77136a1188940b0471d0aa67c3a8fa365a18517edfb14e709049beb344f1c0ffa92728e8d14d22f7ed5a18ff58d0d5aed7eeea631f26503f97d1507f6022a0099358cf44c938e22de1bb40a8fd04cb13ce94502112c121e65a64002e11d33f13ba0f26cf793e95ced55bea08bc2c258dc7744b61c06b088b626b97695fece746a8b2f62ee845810151a2e0c79c302c434bf5a2cb320a4c57354cded75355decae4ab070c1e36f0efdef8e98ea6f8255ee17f1f066f8736715d719a21f4f66cc6f660210f24fa28c003c5cc05e06c5b05127a88bb7fcb0e01624096ee4bb7db62673b0cdf0177729b497152d354751561654ea6916bbd1c31ca2399e75e8171c8bda28f25bd9715a8376443a00af99a9a626441313a44a7271f816ab4373a781d83ff748961415b115506671608e133d791222142f44af90be8c2d2fcdecc368c3eb981b2f45d8afb2bc085db581628407bf10d6da2b65806ae4d9967591df43a78387f497ed2eb9042f86797027fc1ffa73ace5a4a700d40f88c879fb217f952b8e435f5088ac6f82117d3f30c0346399d632cb0f75f5fe04ee66349f1a18ffa87256d5f986c635b50869296808cfe19e6d6ef18ae6d980e38c3f7101ca2fc5a6c63ed2f396009e058ac6c2a650132c409f9df397981fff43f8b09993d04899cef067e0cf04e01afc0f02854c4492a658e36c4bc5f83dbb7eaa7628f5bae7ee59876e89ec71e94f110bc90bea44e2e22fef46548695c7582c27dca987f882360f01bf38ec5b807ced1776a100df78623e09a8b869df2157b4e76095cb07abf327e5e6784f205a56d8a887ff1082c7991bc92fe1d052e02ca16fae685f66c9c86caa50b2757ebb5f7c359970a9bd550941b4386b6a9f88698a2722ab8594600825d59a820fb537e9304517a03d1db54538315ebf98f39e70d7b449d9fe2f0344ebee30616e726496ad6d8ef83af24caf77f70f48dc1d76e5028da07e29852801375a9edb2214a5ea4c056bf323f99fda794bc6b1b47bc638a319b302984552bf90b15259cb3a905684b33b2ba8822348c4c61164a27ce0ee21feee01bacdf7f27078e757ba42a86defdd890c092a8b6ce2ec7bdc36bf7b681783dde601ad9c2c6f17ba7f8fdb4282f61ab21ef6611cc94c2572a2e1b1ea58ec7eff3a1d62c3d MD = 825362c8fbb680c9485933a84e343eeb488634cbc9e55b020c93b369 Len = 43280 Msg = 6c49f1ac16f820b4845c2a307a7a13ea2d00e29cfa29f5fb58e197f40c2ad5369cbe8df005f5c7dcb0ea487ca3d965a4f5cc163884774b37ea6083f8ac439ab4b5b4e2450306762da16ccbdad55e88299a3e9828503c7d20b377e7d30a648502a0741b3278f1d5b03d29dbd378cf2581069e91f4c83f32be9c6deb0b8c573d2746465e40cc7f8b6c6d6b9eeef4f5e3b51f342825534a131a8d8cb92a9ce36b2b8e71d3f5687841691a783fb3b1986bcbcf4786425823c83b6f1a76b8a1cfb7175f3fa4dcb2a49eb02a9ae4aa188064cefc21d2d34193f82a28604d3b03e4c8f2a3f6f67a13cb4b488716b65c8f7477c39008356175624beda2a6643d29ea47c441dff459f4b4ef391737dc507f3e4cb47245d7735c586b8ec334e3457da9db952142c300bb28338cc4447e0e51a48aa88a20df915e3dfd147551f3dc66e82d6e2b678ef7d2efbf487484c61f6b6fdaa8c0e07543e3d8ac889f46bc884c71e55647957bc79fd13a751140da0a3767e3bbfccfc31253f21df1295c65d4970aaa565d16b2f78c964c1c82c1e2571b534ee92633ee851653fb57fad81645b07c247555305c0fff059e44af4c078f81fcc23a2655212594c3ecc3fc05f965fd8efcbb172ca19762e7d8f5802c7039d02be8b7e47d8278360a983b162a33bbe70ada308b52a8181c04a237dda747dd70a6686749f3390862efa9ca308eefcfd7b665dd9ae99a1a9524a213ae07b103c935e9533bfe6f5d813cc475337a532a335c46c92a3b9e23350f8390db92d83443a21381a3e74cfdfcb793460536875364c225fc248eddbd648cebb74c91e4f746b48ffb6af7f7723929be448f0ab4d2d3b1a87f712b7f6f8a65838fea4bfdd53a3205c976739944a259ed77b93e0230e7f07a59f75aabc10f60f2209b0a495587e51cf1b1a659f99e11c7e86c1998f407494192a062893c5b46e0724814f3ff95957d7d02d7601b9417f49e8ee49fa69d82a633538d4267d6def78edab3215bcc09d074504dd532ee341da108e83ecf10645043f821fecbe9f2dc7b372cfcf2950bbcdf8551e1c41330eafac36a9ef6c8b7e8ca7667e4eefa483a4149caab4b5661e9c5882bac5b6bd302b0a6b5e6a32d4315d1b7a71d5a73aab7e9f6d456ee78d4002e41235d7e5ee50ecb98103f5ea7cf805ea229d097badefb7928912764642ca92398811db6542db55483c2d1b09e25d07c1f34262b39acaffcc64a443481318baa758c1389b574a0524e14c3207a0bae30161147a056de7b77b848d5e636ab4fcec08d6881e98276cde14e3e37a34ac2846f095a7e7b3a06f4e6d00303ed619c9461cc4326581fe0ce24b8697b81aab37f1262884b0f8af97a382df5120d1c1b064091cdff6b13865bff996d767cf22a29e864f8917a94fb1296a5d59bfea4742b46242d9488250f7f5a3b71b0fdecce8bd759d3d72321b5c3e882c82627c14e0b59cc8c6d191f243f1de49eb06a5e48acc88740a674f8cf95160af83cf23b51af62d3121384c76ca530dd1cfe2d113f95a4376885d4e3f09008868d64c6d9261e4a7fe60d33e690b87b6e1222accd5c4c51b272fcaba8c0bda63daf270b647560f71931e38c433780e6dea8a4515947dbb93d87936210e923d979840c2aa5e57e53e81a1ef9a80a065a77080d837fa749c223cfd35fe310ca8780379b89611f7f4536ca45e0dbb051bd7f57e5a905249f56aa71430be9e0bb999cee5c9163cb6bb44969e0aba5d269f93fc0b22db467e45c1c966ccee9fefdf812d1d8aa72904b8a6b1e77c1ce1857f4ff69fe76541820bcbf65d411ad15988a2d0a963d551626aee111938a1e292298077a50ecaddf5c5edc07053afbcb953934be1eb0d5060408f66bbb6e5daed2cb9e1c31f786629f2abaa387b39cc8fbec6e18f96dba08ed80f15478d5524e70770d7628ffa94cf108a362e0e258b5d28b243daedaccc3eafe19f35127c6b203839db2bd6cdc435ae0dd6c9a31f63a23fd9f58c561d2e0026ab871cecc818293d793f578a6e8efe39ab1e83c0740fef52c248fc76996063eac14f5772d4b65295b3a6ae21595fa931e67fe4fcbfcaa50fffe0a3b59dedea4ac75a8d5b0ec03cbf7d9368222aa09735447d85ae7f3e53c5e73f2a99b73103f5325b26fbe2b058493b784e033f1c78924999be5c2ed58c231cd6f99961d4314876b3acdc0d11359171d7a85b230d9df77a47279c4b2abe96052a894b2a31f2d318e68781ca6d4546b5340f80530ea7d33b1839d550985bad44bc62157cf4e913ad765f73c72f17c77a1ffc196b9a0694208f6d9ddbb8e3b73fff0c9ed677548888e59d286fd11d9244fdf69cb93a3ad8af1f4b5c4916f7626b84f13dc343f5b05fb6c92640fdd7458a407770e859c51f5b4a5ba7250d073d6bc0b878dfe51d19765c4be3d6ffd54fce9a073c658335b6a98306f50c3583969554bad668d56b228168cde78e61881f967d1e65ad40fd5d0e6bd5cc4b1b0d0c9c8370ed0a8f4069f54ea7b7f3cd6043563c35734c1d9c611e7760a37e18040dc60f9313419d3d6e468061cb939e1e49a289d4ebbe7383714e08100121c6f918c64b69ef8a69c29df9a09498ea4de290ffd8853570ed52fc11c06c6bb2a25ccbf1b99de8618f70878311b8a664778dc7b29acef70fd57b600e22ee59cd34bf95fcec77844368b7a97776368a9e85504c8f530a96e7d67d4b97920e41bdf891e53c66bf49cca018724b20a6abf501da9dda93d0aba56ad92d42a054ba21586458348abdbf59a0037072b3719114779d3a28dfa99ba50d0f7393d05a3983eeb75d79fafb4b6703193282a13fb0595118bffe890ded732790cd1fa477365225fb73712a00749123ca26ff6c69a04018cd8dc04266179c64fd882a8f44370898b128be8a65d1548c86dc5d9777e775492c32127e5ab09d2fb633591339c233b168ebb6ae83c82dc7dfa10194f2dc456cd53b69af543ed1f24b5d3fb2d04e5ffa933afe08f2ff89405533aff753155cfe29083a57db18f7573d7422f0a051f9fec0a5092c2bbdf3a058029d3111290877c82718fa57e569c90d06c75f12737e1861a84c7aa6a9f942887c7dd4d56df46413266a29731a95b22a837140af1968e206b34c86fc3a06b1372fa644f87a9d3d9a74b247852f27bd1678d567eeba46e610649de384e4b867149acb23f2c55f7ede9095e736998c547165581759dc948f2f2a94f2d9406afe812c40d46ce4d7a25018698adff03fe29bd77de16906ee57a373e63781c3aac20d72abe8cf4f82428f6ac1a519b9af12262dab58a4bf90ea2deee643e6e5046c39fc60d3826bebc9fd0622b85c6c765d80f684ef956d48912eea398aa13ae457673804172ed070c31988f147107f221f3cb08f08a3a651e716f4449e192be71e35a40a464cf3bda87551d1e3fe681ee1c9fa2e5657e1697686ab9bd0e73e792b25cee7c3356c2ef480ff38e14ebdd94fb911f73b3aa4ebb9ee5ea3c573f906f8b8172120a0a05131dcef9af1b9f6edb37ac65e39c477451bcebbf10e47d23d114d2b4ae0f726a0dae9b17c879899c8b78f55d7d47dcf22269812080deb50780f8569c986a165aa7a27d35205932d06b6876ef88ddf12ff64eb1f5d36d70a444dd151317447e3ea7a27d3b00e1207044ad36044e850e939412822652b83462e56c18ff74c5337cd655a211b039dde6deef3d821568bc86c65efd9b45e88ca92a4c664af814bc7efc64f4a0788af19801d7945326ad827052da283cf424fde1dc2507dae85aa1aae1767bcea0fce2f0750c425dc97de9b9012d0df2a6951172c3a104998fbe6b6a4c3440846fb63a5401374f8a450078c99b00b4a3a4634fc4a766646d3469a12507454aab2ee1802e6f00c4c0e45db709e8fa233837b53f3f501c2f401e82cb42d853a12926a43de5850ea8e9ecbd2edfb0c4649aa5b36a4c866c6ef99632712b88034ee89c28f8e10c0a03eca64766b4ba057faf3687575110fe2880e4a11c47dfff58cedb94398acb9bddb15a24e6f1cf667a6134568eb8b77965bd50f653fea4efc7c52a1189488c6a3f20507b36fcb78f5f97e54b98e743852d98225a9fb8a17aa4b4d0c76e83151f3021cf75df3f3a273639938bfc487ccb89f9a1f487dd9c49f68216dd72a32f61b99c203a68201fd7052e8441424129f380c816ed93d55e04c519447c1d10a2d8e1798cf159093046d6600093f33c14a51bedc96c4b09af521960a2cbf632362db0a059c33b61331cb0b651a996a003886150029a38df56dbfb3f77f38572b3082ef9cfd79490f1039c18beacb3d5bf445ad9099ee1c01d48729e0d1b5236e010646d3856effe32a1a06e8ec4d34310820e7125a1ce15ca418765aa6ce6e786ee59e2da67d113be9ec7a00a187d52bdea86fea0cb8844266d417c970ec8ee6d4a1541ff33c4375ca316977ad1396a9023c969c04396b7f975a8cc1c2880b15dcaa173ede14fd2d658973926168ff34fd6df9bce3280d40b00c43b80e2979a1e19045fec9afb4cf264516f55100855c3aad17b11bfcf0523b79eb20d65941077dd46ec46864e0d79704c2250e72bf8b448a6f0d3130ab10b423d1a09d9ff7a32bf700441ccd27d3223913860c28044ea5766e45a55b93f8948a959bd6661421566898e27950f04e726279bcbc990a22c80193ef0ae65196671eb59713240cfe97b99713e088c0b5e201631d926e278436bc8e6db4695a669670a006d68278975a5a997cf4ed1f860ba67e4d4feff2ff8bf7bc36344d14e5ccf0e38f82e9bd8838dbfe7218e6635b59c219a027c6d30112438bfd2d1a179055400e85bac2624d9dae6497ef1d428256d4c3dadc5b6e2564409c16e148e8f2e9ce7f8df0c4fd5403523a52c9fa23b78d5f1b41b0461ac91c4f5b281361ff89d4fcb4fc9739e53804680e374bf58d5757e16e7945ff7f8884f0478515edd1d1b16b4d7640b9c0761b404ec9e797e5de60dc6be62feff2d048b3ffc27b54e646f99ab77f7fcd057ab28b7a6f2f79d3d912d0621cc0a01b2cd20ad264a63fc36637fb717c96ec3ac2549a2fab85e3cdc3e84e0f819ab86f1abb757df048f6ffcbd70e19f2388fb6f99c0ccd037d9e4a2b7ba5b2b9208155166f8430d9b612d1c461630f84d720206cd343e11b88d1cf7c3787fa27f4a363ac58a7b995802c000c616ac088f5560db894efea383a56c4329665546289871149216076c839ab00e051b5db831599b5497b61670e0475ceeb22be4fdd41b4f489343ed6d645083b0cacb4cf17aa53ddbbe138d5f179c7560266f35b0ccfb573c91ba3783424dc34ddece8099b462ced7c50d6c576fcb3e024ddc4e48595f12595322ed9867b9f74c0acd019925b7d4b0754dba4231fc403aee1839abc16f0607a324159319bba8171470d8da15cdd9cd967b7f07a6590171d3cbfec34c55bdaf4768b95ba17b5d15c45e0c43cecb6498f03fc48e13070b10c29ea3764436bfb70895e0da47229eaee440a5bb97dafe784a3f90bfc331e67d843832aeef3d9289ae5393f752d8f44a3abdac2cb7222dd56d26eb82fdfd1822e143b252978fc08b014cd99a0cc4e551907e287d77ca7c18229addbf08932b66a0642c4a8257d127c925baabbb0ffb2bac2a21961ffb70a72f436f5e2d1ca7b08b45a77ef8bb4bc4cd893e13a8e0be41566a9f5ff7dc93eb5ccba847b4c0126a688e2bd643e3b8c9d61e6eb81b60b5f958e6abc046966c4c73d79162e5a6f6fb00e7c13aaaf89fa0ac8c51835bb768bc79454ca1565083333a12309807f7dacb1bf66f92742289b0177cef5cb20c5ff380308bea6d3361067b218fcf64da474281663fc6ea88fd61df96512c66872304364e6e83d4678d2efcafb6f04278c4c8f9dd39be5453831bcb817ed9c0523b5963480054d3138f148662abe4eaf9d9c54c036462faaaa346a4e67e4d08922f58cfc54645b15ff01fe0e27891a4840ea14282c89b23b6e64a326c5a6e8672886b416e4a3fb87437b6d4d825e1b841ecc4a3ff6d4f189fd3903dbc19268218cdf982eb13282e7aec4328ecb8bb6d59fa9637255c67228cf37e8d7dc35c43ac866a5be3a9ea5c98982da5c53b060cf4c080c6999ccc87a5cc7de95861f812573b2591fe156b8af7c2dc130cb5acdd39c7e8170635648f14e8f61bf5fae137407594efe55e9500bff2b83a682f9428519637f312301984fecf4fe9fb9601fa91bb1e3c408c4e0517b029e182b0a63564b6d6226594d2ac8e07f21c133d3fa26f962b3fb6a880e2278597d20140ca4b99ad2b6ca8697751e91a457ce4f88379048d23c1f0b812e018f86ad38ee7e8b41805a09983b7efb93a90b2d017ceb5c578286f8a96c7ec4512920aadd1aee8b60a459c709d87242ca7ef9fe253c8becff3ef75624fdaf6593cd9df28719cb29a97f687ba9fe0fdf458c1767841ed84df9c6b9e11c3fb1866bf57520b17ba2fa8e69fc83f30cb6258768d9e5b8845f03d9b23525e9b313ab2c394c9206a0f452720c8c9c7f94f3b9f29dc7f53d1d8ea30199ffa137f8544866f17ad2d13a3dd616cfaf11aa274701298358127c4af5b013e68fcf616fd1e2aeb6867fbb97ee09cf3bba8ffd242eaf9ec200ca108d129f93105c2d009a4b0e6600f5d5205a93421dc96564031c28f9c4c25888746463e5e1bfeb268ff7fe302f694f9f99f2bc338501063a368fb4842e1cd5da22517807823dc3688a1989dc5d480a2ba2e0c732877b338f11ff5fe34d39ff3ba4e4bd9917226b5f697f6c779235bbf5b5a542e3b78063bf1fdb997bb4924b39768ea30ef2f64977b88a14a640aabbaa5cd0cdbb77c91d56dab4efd1d6be203001cfd6cdb831f43df1da20cceb2fafa602c3c62e5aadd6e2bd1bc16a262634cbe128a779d96dd23eafd00f70142cfe75422eaab0d2b716ff5160ccc94562ff79af19c387d8f299e64d0c3f244e3b3e94855209d7726d53e91224505396ecc6a59623897c396881c1440f4e4debd2d68066de5226ac49245c79e6fabdbd3c40fc60c687cb6d58405c3f399b718f7c5cc54134221302d2feb613293a5c0ad9f4da89833cf9f71a4c23991bd523aba037dfbef3d830f8834972585b8db3023e38bc6ada278c69570b93ec3659d8c2d70e4c3a8e12e50fd2ab3dd40e635755d1a33e9f4bb60736771539a319b805579936773e6330b3ab698a64f0a259bd684cbacd914886dee0f2ef8148266e3dfc5f46fd5533d0217d806d8448c7ef59ac07f5e5eb611887eb63011765ecfae703a1c65af9506fc2d8efcb1836ef82b0a38bdb140825d9a6d84fd04866fdcc9510092afca5496dfc6fe0399d6579c256e150d0d461f748901a01f3b0d5a971cca3edeb7ee39f6952850a2f803ef71cc0e7ef7da3a365e3f83331e1cd2ca0890221c89e3e2eb2d049bad6236d3df7f06319c0480e26e23a23a6480119f65360ba3c31a9d70134316693dcabb0ecfcebc2097bb670670cc9c705ccf813ad32976935b194c5e5941b1d82762ef7c6667d72496a5f770e461146b4292d46cbde9ba3b0b0f5775642ebf3294b23be44d513d83c14899e770e8f1753f5271fdcb7fbde3fc83287ddd1227bdab4305102c94d885412eb332bf6b1dd47b96c2b5a4f269d356fd263e6bf5d1c2 MD = fe345afe05c43be99842c395b02e515e02c96cdda43210344f70ca6b Len = 44072 Msg = 3bf13f77155a5d4a56b055b84862e45bb07413e801db0ab2d02b296f886f553f5f5890ea889bcd69aa9402a9922f7e8b25087d2f98d1fa72e3f5c4b5727ad4e11e2cdea75df8260db5969526776b0c20a9adf88544c827baa000dacc2c581b6b62b35037fa3a113b5efd37b75fdd352326a9ac706d873991ef96923a1cd1d1e812370f21c92935fd8d130fe5b24ea29b8345c07a7bd7d900b8fd1489acad9e5d16fe42ed308c3b5a2a1e4637d886fb90a8c95c2bd680af0de37e894043b32cd456501224992cca5b1e670336394de70b7d7daa0ae64a62c3586119e848ac2054b977a74d6bd28b064f366f683d6b0e12e9a8cf9f14fd9b27ffeeeb08256125e629ba28f00e442565a6d3b2574da719b0d794f672c6600143c06d28284197e1918e60be96ea4b41800b85f38bcfcab0ea2c87450c653c3d1e8425f7d10419fc5dceb290c667ae875d67955a8b2d9c7acad1cae4f45a59f6c0315f8189d6ae1f52d2f8c708ed379e06a04b10dfcde52057aea5fcb20c7fd532b163eddb1f1df279827a8ae4e4ac2f83a0ef3d0f196d4999ab5fb5cfe276817bea79644c472f1cd9c67f02e3b4d6e1da4dc908a377fc9e99b14236d24605a3a3c6e90e66b6ac467a8751568cc57d5d1591219a245159c75ea694a8439ff6e3b32cfa12b0d55c1765ab36af677f694b3c533e1b1a0e4d6bf0749e32ab540fe8b203f599b20a0638a11c7735fd4b6151557b69b20b16a0325801a8fd90cf195ba83522caf5be745036c05b0fd58f2e1a6af0ea8781d11ac69d37fa317d77dbe39da9c9ce005a6c082d812c6678b4984c829c09c303a782ccc7fcdbf5f7b41f299a4732cc5b44b7088d4630616c236790a6660e8e1a00a2efdf3a957188eeabd5a6f7a5ed8fe61df75ef6b1293b43638ddd36400f4c4440d5ecd86eceb78d488ecaa1695923a7657da97bf5e56c7b54ec2ff4e86f24db2526f6beaf340cf9befc0d2dc7379fee594375bc45be88350154a4884ed5272d198b06d49fca109bd5c8778307af8c25bff1caa1e8dc16d8336e45dbba6adfa2e4ab220288b94ad9559a108c71eb71b3602fb01228669eccb2e219d37456d3a34d305530b028431c0519e12e4c10d60004a330f74b85a97846572859c3c08b961dbfa446604081cdaeeef152e249437472f851389a60be46b7757b56f1d090e51c03192ce0298e5218c148e179bc417774d41cbe5d20659dcce519b044b069f612a1bbca780af2150b39efc15a915771d0e0976fdcec26e54e4f0a5105859e33c7449208700b337c4ffeeddccdf10eca4fc3cc345eed8a87065a571f7b7ab8030392a7cf0f56dbf1abb94a181904edeab925c3f62d4a18e9b9af0704f0b43ecd8d3301059f1072dbe9120f5f88f17c39d6b0839b8f2c597432f622e7aa5eb8fb2ed0a89466647ea2cfb0439860e143206e0a140ccdbbd39038d6b1aff29eaef4ae11a562ad7889ad263ceeabeafbcb0548db7e322e1e10a692f7bb46109ca920d59dff59bb741a66b55d187f6e689b512dccc9f4fc7e981c090248934c8231e76a1dbe60da81ba3446bccafe344f3b6de584fe397d02f15c659f617eee75ccb13738eb5e50c7ef7f9f000c0f83d934bf38ac25ebfbd3a5cc6e750cef3d9f04e602978d3d666d44b089d2e49aa52d0db1eeec44f1bc183cd6eb2d53ce822860ee94e1ace4649b3e2dccda5c88e0754eaaceeb653309fa3ce1a66e3e0306386831b5bf503b927b675f30bf7bbf7dd68012a1528f9929a12f5465e1d4770ef5a5182cd9822a373246ae7d2a4928c37a2a502fc8cb0b66349c99f12e1d10e58a9e09c3d649999deb63837ac2cfabfc89d4ce40f6207106dc0c1712fc21b7d21ddb6d405fae700acc4744f03014316e2a06f39c8496b352c006368ff3e9551cd7e5ad6c1bb897c7fd795ba81b20a0638649270a1935b99209125e32bc7cd00cdf432f0fb36ff61ca7812e672cfce221c524d2545d066b0edeb8f7c1ffe212ea5e7d5df1cedb7650f2e827f80bafddf00e205c40fa10b20d68816905632401fe7b1c9ed91505fdad0535ac225f417b1a89c32e97955b74d9cef41dc69149878f5fa759912ff4747909f027acd0bba2e66098ae20d9f09bb8399a79cc31598be631a6f8dfc6b0c4fd25a2ff5f08243c9bb82445a56bd60df3d1f9e6deea5df44c1aa2e28c7f42d38182d29c03ac843082bcf15becf615b4d1bd9bcdc6645bac0742227f6004b18b4d4708666067e466e3918659bf20b6769c2608944a485e9a5fd0ae3722fd05d3a89dccc53dde4bc606626ba5e491c03d9a33c6a5333e6ba69eecce729c114792dcaca72163bcc138325529a923f23bf0150d5f6648ed8cb80ac00b9894e97eb22f9b20e29ba74ea4b09247cc46eb307753db5b4153fec8b8ed71ec11d32db21aea93c070ab47fbf2c9424d751323a6ba9dc6409d1a18288e8d2afa452184ebb254bb0d335b46cf0ac28dc30e5443a5a03af698e167e4b2233311bb9d45963262b73c91947549d3d4e69a32fecff235137492ea77000a705d264eb97f090c8e12593dd4f9bffb0d397c9222ad4dd95ffb91c3bfc6ad316a25b00a7c54338e08aa84e75dcb0301871fcb9c198395a02a3edab09e363801a764176d8a858cc3a7127e62b473070649701ce1a1e871ee9fc597820f2f67242f00a49e6d78dc5473338fd5615794b05912b7894144a76bc47810609a19043f0ae39fc6ad97ebe874f30168ece171a7c1efe4bb82ff00c0a33f8c73c85cd5fd41f3500cd0498028b33b1a45de78689489edeb9fea814495440355e22060a303da1afe9960f565bc37f42491bf833f1fb7f6135e03323b91adaab1d62b8e35fce03ef394e505604b08046577156cbfef55f1a620557bac5de81ee9776f4c558e58497526e5e03a7d2f55261d6a9ab0ad6ac5ea0c66c261a1fd4544ec7603c9614c22cd77eaeebbfcb3cdaeab4575da00ff5c284bc1702004f2090c5ec81c5a1ec3b143ae7b97aa6d9c56474a2f6504911b9da704ebeeb22ed15187f4ebfdd06dc6de1ef42143d07bf3d73722afd2f808c670b1606da3dfc8a204ffd76910f3f55c91a870625af6ccbf37c75a4d247c0c08bd8c87d0f66e7a6b0cba2ecabc8b5f8db2274bc944e20808603f1a91c35945ea6c81a09c5129eb3650012294685f526129e4acdb695dd8d639e78c0418575c7366d8d4571bd6c40ab81bdb517e3877e1de27bc22322ee432aa06d52d893df9ac91d94a8bbb3eacf02c52808865de7614ba38a225051fd3239be620947fd5c39bd6cc2bbf9b294cee94ec3ac28519f603a35e876c4bf64db2f4cd93c263e5634a1ef89e7c225f4c0fd832308646b19fb482e293806d7cfce69d04563e9b3680c14fa6cc49b8a75358e16c8b5c106d1b31400cede8d17985c77fd392909190c307521edcaec5ca09d395e272cc4b160f82c324be2ce1b5935d80816f41abbad42310a8f733b1911787dddb0e5f5f7426adf5722dd504f7ccb1895814d8537e5a20708c4561e5c1257ca2a1869cb44f06bcbd3e636aa108d8ca839eaaddf0a2fe035911edbfc725dabbca7a030cb26f57b602cf887322b160b0549c58d9e9ef67d6b58018d6c084df4b3eafad35c29cc2a4ae6ec378eeb80c6ce69a4753a82d3da16b21ed2c39a5db34e787aba14a9dee8da8633c026de583051fe09ed394242a6a633c954b9851777fac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937bb46505b3374444560663e2c71266f8bc324d574ef2b632706935ce31bb900fc02ac6a2e5829b931c3ca6e8d7b7a15b00a2c283e50cd30a8c9762d0013e7380caa316799f7b2f11189469250a2bc31b4f587c173aeb66532b327d7d329f70a8e3b3c0e4316f7350e3844741debd40bbe0c9d68bc11d049ec4b0c220367d1beaa3b3728d5c0e0cc505a2bda9a60aaebf7d8d7e7c1820226ff198ed539d55d9c8a34897df6fa5500fe76638d7208271987e09b052908344292a515ba1c7a84eb53ad9ad54fce3e17411554554beb31dc95ac52899dac4ee7ce780a97555e2cf5302fd2f88743835a40be66f9ce12b17e49c5653cc475395bdb19d3358b893e00474199ae47610c1124f90143a2849045ccb23ae6476bdbe6e010da5c6704a355c06b57be3731c184144e8df96f49b47a46fb3b4fcd961dd205e686d390d6413cc43574f1feba8bfa394672e4df6a0764de29cf3effffe76574223e64af0702fc7b28580f450550bdba6818cc98ee704dbdc35d7c85ad22e9524c6cd56ca0cddf0ccb6be0b318fa13c03de77942ddd67b0b514fd206a8b4a4caec77ef6ea7892b9fa6162bf1fd6f45734c48b286402337ef5c0c052af987df018bc77a5e2720295e42bfbaa6bc999afa1da1400c1e3ec9916bfce09aa782e122b0c43ee32579216f26d0537b5b5e5c7e385bec7b7f0f791a06872afeba8cf453e4d603a6ab7c5bfadaafbf18e4a8d12626df7c7b6b7e8fb2b515aafd3b8f5ebcae65904fc0111e28e7c6c6245e5e431b6e94b8b6eb735280010e29403172688796d9ae856d20b420d47b2f48d268f88498e16ad106d60bad71da6f6fa41d5ad9249a25f0b991630b2938c42b47ae398a2c305877c58f03608ee144319c777cdde110bd39ac4c74116f644b76c5174d55b3e84b4e2e867fc2de8c702e226a15b854a33d084e3a2f592d668dd0558d7e0cb5700bfe4ca4cafbeb41ba0f3dde6f9506bc6f04a841db0ceba852e2fdf812d8b832603024cf2b323d69ec7cf6b9d09a7dc119d6c14ac15132916153c73e52e04695128cc0f0e9905a6dcc1c54e481ef431c0426a13e2a51888984ccbb48864de601e8b927f04d3cccb323985f47cabde033f89b51035c3478f881f5e0fef64621deac6061b59f5e1ba5b8971fcaf22cda70bdddd883a021874621753e48e9f47d95242877292720cdaa55c29d564363bb3a1a953ea43d403fdc2cf5dd0fa97e848c19ba70332ca86c29c0c1e0d1038b0af8d86b8c507dba27206a1cc6397c0dbe2c52bd54baf81e808cc23bf0257bcb5014bf06c96ea6b7c77ba39300b0abc9b2dd99da2ba8d1ab8f3a23d9d638f34c14f5970ffde6015ea8569e01935a7dd9e808b4b9fee40077239bab4299f4b335de03282d30a0d6d85117240f88213c66e8136c01d456cca9c317221e413f02af37a63a096b836d4d4a28fd65e6ec2e973b68895ab6e67f69f8164f17d7032ae2a546944ab5790de41ceff1aab5a29d95686dd36eab7c60e14800fbd3612771f5b24bff99176affc54ed6c886fd2dcf87f78c12e2bb00b6363e3deefaea932011e61d439e983c8c19684349a3c7740d96702c0d61ee5aca935f35f035772f7e5dc824280040d8fa08f3a03da61a5f9eea5cb48d914d72e41e3551c92c12e3d502e0c97668172691b976546c3affd6ccaa438e5a1adf304bff47f74086c2976b27b672f47d260e9b5579c79e057dc1ddffab213ca5ad7d495f1d901feb90338af5d3896be874795e0384619baf9c081a101ed5fbdabd3f246640852c05829f7894be74a350094d23ec208a2ae16494cb0623125e601960253b373c3079a3c37d2bff9d645eee743237d4aa1543de4b380843402ee0c9c694078a1ff2f2f887e3e21f6a76ba2ad4d30d2929227c1116a83f04c73301d35bb9f1c2953c168bd4f0e2a545a00bc5574e96a66f1a3506de65d2f110356c4105db226605d48d6390ee531995abf9c8e4eaf9d3e4c415c389b5ea8f81fcc81bae44c1fed9830088a5235d04c1602e3a62f15f38f1eac55200e1af68834fbe673d3af71278111703f9d826ec33844f23bba9ef5efc52ecbb2c3048037ff8f62f9a06ec2b4a4679db7654d95c52e2078cd65bd2cc6fc53304f4ecdee8dbbd177aadf0c7d0b7eacf1803e19cd98641fb7c9b4e2f0ab00b42373f5b98a00167ca515e3fb18a27c4c0c387c597ed3768d6fbf2cc2fa129ecc05bf7c79fb257beb6bb953dd1e0029df5e2ec49f41fcd203e11c31bfa184030557903761aa6478984c03a30505ab03d158019b5d8f7b031dbc7f684b7f75f9eaa984bb132053792db6835615580996cc9a2f6516dfe49635724734f8fc7ed0067c0b7bf0f55919f64bc6e1809db26f2b9526b64dbbbfe7e573022c4a90e521c34f92fead821bc79c6c3cd9d93f2bd968c9760384ab7384986f4ec2b2e57f5bab74c9b78b6ee20e8aa853b371c4dc821eb7abd13e178608d8977b7cb452740a49bc0e3b2d04625b3b80b9e2fcc75ad5c7d016a3ec888dc120bc26ded17089aa1865eefe04fb033a4975ce0cdcaf1d60ceb364f01286f16a0b2dbf4d9cb816b78212da74a5ab5b281f080e7593f49a9fcdc2155a329b374ff26cc36d78a1b1cf21335f4371adb0a136a809d1b520690f3f9c9626ef2de60f6109d192f7c5c13d7047ebcf1b6ada322ae63e85b2caff2b8ea365fa8ac78414f18548728c8ceb9ef9e11e9be57b0e6766331b260f4cc36145670359a7e077fd0e5fb670b97f9760186f561e7256e39d632f3e273d3e6c6cfe580ca8c911582422099a0201064b3d767320eb3476e050bc3b060dcf18409b1406d08c60c29b16c70371caf5c97d637e7d1d66ce638b3debd7014e3752e67820f3fd68f18cc76187edcc200a21a49eaaed9a3582955a914c93be6d0886c4809f9fe1b31dd84380cf2907a5b0b7672b865525cc1394c51788e1abeea51c7140fa7b3c1f282dc6011735b2c07bf32bb68b444e9ed3da512d1b514847af9c6335cc166af1b305954efa946c04de5d68bc442b832255ee953e6e53220c8a7f20eb8ee1dcdf30e857d6e3d581f75a5ea4992b8b51eb0c49f7e80c77b7a1c84d10bebd6e203c445e74356d79a2fc728f75f9bbd4497d8964ffa6702f77abeb8ed93bc22bc39d4fc070f6e1e12d98a968534a7fa6c85e3fd812f633fae09f56ace0ff47ab4576d5c6e477fbbca0608171a307e1735ce1a20be853c26a90d0bc2fae55b85d045d58da3555155ca9c87d140bbe7bba75bc5288d64b95eef6f46e9fb7fb9ec1aeb54b62e9fac95188550ef7e3dab8ecb142c3c7734a4908818ef075943d6569a3234ff988f5823bea7ab975c1e923aa8e19685035dc3637def4d439a9b7a6c5700bb91688b1ca6c4ecdff263c6646446ab4d2ab947df80d5dbaac648ee6cd6593f339426fdc2c7303a36271a9ee9b6ae589754215abf8e98c64cb8eaa3753ba8d5e22f5b4c102d0c7bf65e0a0ce9d8e7d2bd2bc4ff2d36ce977c4009245d444dac118b8ee0cf80609668c1b9792b72f9ff06d6299cef20803682862cd8ec984faa07d04721c66a3273d475b14e782bedc9bc7ed89bcef3b68aa6b3db27e9e0b6b90e250e77bf918cfa82a57af198abca17254a5a629258767d30ef9f791ec38ac06cb26c4a809d7513b9779acc539b98d08b63365b03f6caf66761fe3651ead4a66aa0e802d337f6a6c3139b4571a360de34f0f4ece876b9de953282c64bfc9c5550170b077e07159be6a205c6b96a2928691a1d7f0b7f4b1b0089b392d4a2e8b4663e5bc149b4dcda6b4c5eb6f499fb967109387b32ba8996f08f1800b484c2abf33e6299fee7534b9a38307dead7de1096e4cd4826ce7a37af6c3979b2493122413fa8f5634781d7ba8f028363cddb7e1ed4644eaf6427e784479e6697993e019668b43e427d6e6415785d2f2723f9c8520086f49424968cb648d02d2b1eef303be10edd613022dbf11cc8ebfd8041d77a91baa49fb5d10f8e995638367d4e9878d33e388809a62597a3cb1faf8cb991deae89c6 MD = 35eee77b8adf8f39931ce0264563f68b51b36614d6f44735e155f023 Len = 44864 Msg = a98e234820f0e682240872a79a386b5be663009e53b77045b5cacdab4de901a4ecad0eb25bce9a7cfb3caa7ba96caef7e4f0be32324b23e3bf0319e548f8d33137f3c00a10820d770b046bf60300126f8ebb05676e099876286330fbf23a4b0ed28bc0b605b4475c9e863b806f9b9fab2ce960a5ce98d9e736119c5313587023059b9620030b5114faeaa581b6e55e9306a554541ba1ee1f3236e55773f94a58184ccbaed12f328667592e61a088561064156bdc1dcbdd0564f9916ed9c6e29652c5e6ca39c9f2992ffb6089f5298f088d612ca59cbfb08013832aff0e663fc3fd2f6fdb01819a3799f7c25f7d731265cab21f1760246f7a88fb3874db8269c95fb1ee49f2fe3047ec75dc4c000be60d6330cd9b30a320da0c8a413406c2698ec074ec7bd4e9bfb0719f37b9459c13eaa002bd97d6e4cd88e558cfa757cd46fc6a9ff1db6fe94c5c709b5a0c15cca2e2c8517775188e7d6b5b8c6935984c08faa45b83d08aa7e1323091cdaf38439adf2544849bbf49396db84f98468fe6b86fb5d02cc2efca851afbaa190876aa03c8fd046b7393bf087542c8e24205445d45e625731964fb41fc170dc58197a9e68599b8b4635b95f26c4320d291c30eff637f83e03eb2e21cc0cde4598062e74afd4189e8d5e176ff38017eed9b8eeba6b1c811fc97a1261e4f65545e6fa00d371a3d9f8e30eb0838c2c50bbdc931835b1708f84e8df8704f8f27875bb519c2b5c3d4212edc42f3a4f2d6eec981727f257d895f5f898167b8695ba5d8ba95afcde04f375141aee04bb17e50992c1b870dcb916fb5f102b460c548d55de6dc7c865af60b7ec7f67736e50359b633f2421ae9694fda2e44fe4f8c374073a1b5d0e91711c23dd6e45f6c77ae30a7fcc05954bf592956a90fee8ea4700ea153ea53fc00e88716d63e41f550c7fef4f14c73c336a822afc92a2c24f73b66706441aec9fdc380922fcdc4da5696ea267960397034a0646ff55f5f196ce070673c838958f7e9d5384959912273621dc4fbc25362a287171d97742f76eaa6560e43788bafd4a3af908caa4fd58e75bf56e13b68a169a66242163246425bd73dede2e75dd87e3936236187a7fc8f15f764929320366f456e65da614985a6b94f8d7f99a7dbdbf391782eb9419e5d8bed77769225289eac630e4bc9e347b395b475845710bed518e9185c09c4c3e21fca16f5001c7fdd2268c6d131ba916ab2942d57e7408b53f26589543cd9730518b6ca77a4b04413f0a513d463766ab35a163e6211e04a3cc72e557d1d27b7aec0d81a6447877e2a5f4380bc25c0db76d3622f0b9f98017ae06b033e735796c55d598e24b1493509b56a92f14040eb9b66a188bc570fbaf485451c01051019333860ae1faa9f71983a41d3db7c9da20a5bfbd2dc03ee7c92fee4272d9cfb47de991603befa313bbf38f1cae2a07f08abfa9793d369dc503c926fac2a00bf28afc7a3146768a69a66f5a1ff6f769026668a9e560852823cda8a0e345ff905c48e0c2e6983bea69775ba7afbe8c47503245537a0e585874b542eeb46364f752464aedf8b7bc2db39d4cfa445b753d9a7cba18bfbd1cc958292c62b6a16c9b64f17f6df01b53dea886c7c466542eb621b45b7c2ee34ed51eb7d9af9286731714d912c56539bf67e8c230989e4f353b86678df030277b1658dfbf27b09924d4d27b8986c0a94b73d4ee2bd9449315584904e6176bd00e07970f515d994fde6f3e4768247ad0746cfd592e2901c63b76ea2ae8444aa3842349d544c3c5211c30a8cb23112c45e6cdd2919bea4e6f3421da37f91954e879e3f1bfedfccc936ae3b2854eef3d800f10f536199f92d48be3a9babd0903356be41f2dd16b083d56d2ebe43011270559d0c5a50bdb67ccaf36c9319895ee00b68e32bd838110854c98a5969b29814c5387d46d0710458e1a95c91b10426dd1065cdcdd68f16de1d8af8fead49ad4cb8890920c8fc0b4bf5a7b2a05b8811b3cb7da6e0c161e88f96781fb7f70d78a1965959ef1fa7f2dc6eb615c5ff5f47e9a677176d80f7aea3295aa88b2f47229ac77014bbbfbae294b49e2d0a85cfef07071dc77afb9991a03dfa3a833e3fd2c0b396e38c8f7d02f92f27a376d521329558355f121a8fb910391e7ea50a3db199c3936e6b77377b9548181f11d89d371c0088863ac5204d7a878f1bfb7c89e7af5d2e5c5f5f3274f0653b48e4748a272467dee5fce49575678e15ba8d7c6a9b8aeb3056712fb41690f056c7f692322933f5ff235f5f365b5eb6770361f32af6b0d36203a8cf0688ff4f3243501bdb66d312b2e96b1e4b24e7677f9d81c70f1fab7f890c0c2870f3c5ec9765f8f5ce058b26c0df29091cfb8a09f331f5e2623e03557018a520397f682d4dd5f80a532fe399f2aca009f106d0049c66c32a6a7d3ebfded07ca0ab53727c1b3a5840b10c64d30ef9d904116d40c142e5f5897102e6239adb98910c986b40ca3d1e8132c3953ddc6ddae3c55963a6ad5693e6bdf582eb6de301d9a575d9e0228554b41c7dff3d26b1ad8f55f2bf1ca45fa328977f9b7e1f8dc062be1346c6ebbb01c1b861283cb26c5aef095fde8cf1ab2f3947c8b8447883dc129f9a3959ed862e8f4e989aa34947e7ea28c9485c5ae03e0015f761a5406d5dd38f313b01f08fe2082649ddd8b3ea5e6afc5783f6a8a7d96549341f093ef24c8cd800d326bb7d2513879d7745b8fcc656cb3219c0a3a707502aa978d83bbbb025c030893017f9ff98bbbcf25020262895de8192241289d0a9017bf67aff70918590e9e588ccab798008cdd663b20f8b117d6d7488bef43c5816d5215852b8f7968f527094a23a9ab1b7f8a9e5375ff7b1f01e495670915446b1dd80d8fc3beb3f0794b1bd614f6b140f67f53e78c0755d7ebb98f5ee081f591abb9b63c4a274683ed6306bd091f2915a3f41d53ad80bfd706ceacd0000a57a9898fa6273959bf97d417607b8a93911deab1614484fc47a0e5bc6467021ef92759c263bd1bb67db0cfd0af7e13e487ae5d1fb6269cea5baa0adb4c805140487f7eea658a6bde0f4333174a513f925b6b5d9782764fdb8a66e8d3cbb8681ed4367b7021fba420e2d3a063d771682daab96ec15cc02830426c021e787bc0fb0ac0d1ec3fad5f3fa6f68a3ecd7b1806f43d2325bb70b099123dd913c946f6757ac304c7050be78aba00730092cae9bea64b0d2d151473668830e06c44b6631e92a196891883e7829a95dd71dded37c55f877f400027db390309ba805126b146f0d119bae0c1d9c7d73b3beaf55e9cbb7e670c26e3377271110cc9e895244b8f03f5e0d5043238baee5500d47f8b72f1916e361a54afb3bf40de811d874bac674a748e5fe9517edc4e67eed6d310751827017fc2db1d297400e392878de95e6042d194c416ac36cc8608386aa689fd9fadc56b98ccec4e2fdfa050cf3fa9dbfa6b91769a02aedaec13aa8ff8503486e8a42e6c04c0b98c433bb95e4d12f9afa64338c65a33d5e5bb75c3580876bcab8388a103af4cf18e7eb3831d998e4533e4683be67d20cde1cb2ae72333608ed610e9c1c4f0d810af02d592113d28391345392f698b6fd3599bb17a63e1d42790e146052261e8b378aff06acb906731c8493467b1fd6792a79d9821bc9c182356951bffae8af54675b6b271bf3bd1cbcd50e889725bae9866415d417fdac2eea1acd9f5bbc4944610b78a4b6eb7ee639cfcd4190d2ebb3110476f6e30165b060c990eabecb73c3ef432e65c5c6d1395a1bd757af4df04193fe04d0c7fe746e5f1da3866b3db539d7ab965390af3e7de86134b43cbf51f9d4fdc74a0a1c62d2afbe0d5daa39970ee2eab7545fcc4e1aac48ed3e7f4f97459ba7c84df682b5421755d655c3e7a2aad8a99a51794588786b7909dfbf26498cb2a40ebfd159f828618a0758fd705d76818f4533274375fff09c907e466bef35df9da18ae4c8b0eb5304a64da2fc50d8a545c2e0b1ee9b1802588b025a4712aaeb3a8a9477f867f3b66cbe1bf8b204390b7219425f6d84296855015544e239529e22d0c7d211a4a8516954ac48bb00027cbf504078e9b89ceb3cfa5e4c63ec95bffe7b093c3af072eea472e7d93fcc99c0d371c14689bdd753b57e05b9f3b3db18759444ff9bd2b953c41fb4f565f1689f5883af0f761d4468679632d5b9178c6f30215f615dd2e5497264fbe255f6d5e1f38ff11cd76049f1fb49cde6de9f108dd62d42aba8785e985648a4e938634a4d4e9c6fb5d50c50b818a0be3589d4d03a10bdd524a34d8c0817d3985236c12eac11b2112298abc08367a1ed0ae33c323d86db001677d8d8615e0dbd657697e9c6e4d9bfaa47c4011b905643ad14619f60df8eabc74ba1a86ad2fffc6a216de3636d1a61960ae07b483ac7a66543cb8069c4dfbe80483165ec1cb03ea85ecc834b577cdf2e0b8696d10dfbff7b98003b21dcd42189960f78b0e3286968563a3345480821ba6f3eba80b3fa37373c8a3a50d078bc2a5cc3477bd07066f230415b1be8c50f8261914f1bd1cc34e157f1e3be47d077abc3d63c188b8f1e8e15696193e1bb92ce0705bd6b127ae0c110bba032eae63b53f2cfbe4dbb8d78842d39ae76d8f290e589246c381b0a221f9072d87661c1ee6c113634e408735b1b9f39aa8b7873f2101076c44a9787e142ff9df25053697a3c4a9408a31c48b19c94f1bd9c6645a197c4822e682cf6077384c5588968e7c50cc370a1539c14614f33ea506f4d7084c2ccd0105c82617bfa477171e94942b923a45267bc33df537ca5abc9ced3fd82d850e8d3ec42cf251f7129a5379e823dcb16c2c2a587b26f6b11bc927fa0f385237a53e0e11449ed2a2a765c3d0eb0384a41491ad740949d64a0a6114a5d5a74e970989e029fd6bb6299defec142d294e94c6ed71b078ec5ae7af0b0f9b23a36735a3f74198c7e7710e7ebf38ce2f338f05fba613784a7cf92c622d652469cb50961d0ccec8249097c3b25a46695180ca7a4b421f35ee7a358adc5ea1fc287d8f3add40d452a4059eebe137716034bf85540e47d193d56294856605626cd04877865d39eea2c6a50ae983dd566d593e4445ed2de6fcbfd4aa9e97b8130101aaae1b153e9a32fd0d403f02b271cb3f9b8ba2407adbfade3ecc5909ed30433d12a76bade553adb78ce37ee66d30144835c00ba0a50cf8e10f8e27152b46cdd31ed7fa8fb4a75da6c2790bc7543dd313bb85e49633167148d5749b41e8c2eb643dc44a333301ed1b4c5577fe0dd782129b51bf99bb651e761ef42828bc313670edf0dd20c70fb6b5692d362300b99bd543981f1394954b094aa140320c1e3989adf215d1070d54e5c754e8aec340aadc42dd65ac55137172f6f095e65ef66f0f0c2c96dc7997322cd550e229cbf9198817a635bc736c3c3392567bce2b3631817724d2ab8539f90b21c5c50c816f7279406701dc85fc05dbab677442076a4b817d5f5bb6b071f3f12b1803cf9a0030104bb45c85036f68cbb09811fa6a1ef77f9d50848681bbcd9f5fcc210b6c57fced9802983e5222cf94206cd74fc9a0dfdc459d0fb38f93e0364e56af188ed31381b3c6676118b2c4c5a95a26cabcbc6f3804893fa62076d676554bf09f680e3e5d3d942ca5bd9bc2c089e4a2f3a9ae101368c9a6d6eaf11ad03310a8088e65b7d093e06a74b75a54156090be4317128ceed0c2d7de458f17d4364937ec68862a9c353f9346ac5ae344bbe2eb319b76103adb094514d69d67d2fd5a22a39ccbf110b00659a3f32a1adefa6fac578d455477e601613314c8858ce6d7fac681b3c5ce82d9000532545534ba7b942d930cc436904fce81668cfb42812722ddbde9f3263c2c38f2c0461cf66aab152c1338e9f75848ffa8625733a46adc2d51b7bb13d82a7466f5438bec849982c1bba456202abc8147108eb3b912f27b8cbaf5c3a224fc561c7532a24e7fa5770c84bce111411b9d6752522f061eb669c381fe7028cd2025cbfaf415ad483d1c57ffd36647eb23d1c2c63325a548354b643f486d02112477e81f2e42a36ebec756856e520e8933d2dc14d844110fed84d15b5a06d89177d1132a37d5ab63b92c7ade04310f9bea2525a687e6d3d64d9aad5ea9ca26de98a5bfd4b73b3fb7aaa027323b9fb5a3a52d3203e89a684be4116ac1ce435759158a508712efdaeb01c6fe5a6ada8b30f37f83a560eb38d13f7d7c2d2dfee4816cd367b9d160076e6d05628f188e0ab463809d038735dff6be3353e94f5978f80d3587f589383fc23adff678cb36beae53c4d0c6d226c82ceed7a48ea8ef6f1d751513c280d50e76f9db1c800941119f72d0d147c81a8c045fdec0a5d12d517242e6ad998ec2de0d288b573d3959ae081f29110edfad85ed7fbd5a974e9faa86f54eb7e2d98e38f55545491901dcde68d73212949f3c6078dcf7b50b87c2d4dbeaa1c5571793a9bffead34abc9373d42298058616d638616d612725af3138ae1b184483ebf7f9add9327dc5e161545149498451df0af71482992050e371e2728d86ad33237bea6ce914992b86ee3806096ee7af29f7cbc9d160b0fadca5f2421ddc9d8ba26bd38139796ea334a2e79a6aef77ca7e057b28649c1d4b203331c5d1025db3ef317d93d147455672e528b674b479ca659cd1d84237b06a398567a4b3e135d49233b04bb768666cc81fc50230a538d7672493827317b180af015b86cb5f6c1614db3351f5c2190cbeb88425a5abfb170b058acd002668b40811d7141f654ca0fc90d04c933fa65edd182ec8dbac09b5d9a77e62f04a1c2fce1ca1f6badc1b9bd2b94de497c6548baca88b92db91abd7597337e84b6d1718888a82d3a1aa222e1fc073c20b3e6dbbb4ce622cac4329a614cf7c0819769f98bfc24253deb9a982690c0a8ef69137157bf37c3d56a9cb499124166a634dfdd7fa2ea91f77eff8be3b05daef61a6fbc28b80a26ee2aad9e858dbceb531da79fcc1357fdf7736560b1a13aa8e536500ea6cdb9a6757309aadf25a6a9189055a309c3f8b3ae3750d91909e4413d4b690b3a46e2ccfbd2257bee60bb2a875b6ea9a14b496d9c5946377240e6e25ec81f148bda0224f1d675843bc55709ffcd56f63b0fd6864247aa1e65fcbf16ca4ae6ccf3fd8438e7ee9e565fd9f6a21264a32b2f980c98209110e05c73d959203254971b0805635e88f464b305369d4fcfd7bb076a681db7b40f4fde6cd213c12cfd0559aff24eb6341c21fddd8356085d69284afd7571882ef99f544e15f14d89249a484bd7559f8e7a2068c96966ecabebe582c7c15e12606461667e315c25d57fb85f7221026ae6a2f2ac6f554a6d19b485176fb81dd706e4388d9390ceea9072f217a96bffb8eb0aeb3125d36afa457789914be64b5670dd872224d0c3fc5882d9f958148809ea26ac9f93606324bd896588e2b851114cc4dfcc885dd5db8c43d28d04b745ce828aa9202e88ad6cc08eab56dacae977d93e950554b46f18aa1a7e4b45c0b38742bb539b5db8b4431cdbcd937a8a5f2ac4bf693510610a34309b2fac81cd5bb4891d4e49a77d023821153ec778733c8a9dabaf0421d031aece3a79394f49a8e6e444fbc3a25231cc5bbf815b2b020c27a2a7e8db2fae7ff8d17ced6a14a2158ee2a6ee81c4b4ad704b3f37c728d348729228992280484f92c8c6fec768733c2ce2d7990c8530efb46e18c4a3e8537c0bea925282da3a2b1d32cd2fc9c1498741834b7dec7a33730942d0ba79f00f0143fa99877483f08ce89de3f2f99571815d42671f8a0a58d20f57fb7ba1c66282cb6092ba601407ff9578afdadf7ba7a4d08edef06dbbfd87171bfd9ac3d20a7af2ab126dde00fcfda4318559d3da488c6be707931015bdfcb10d5b9a48a943546a488d1466e12c0185871 MD = fc2503d7b8baebc96e4af56824ec469b3ad8829aba34c239a776ae91 Len = 45656 Msg = d302a518d7c625756d3e4c8cc2b1d973a19107c945fc04526b88a4e1ab40577b07ea59b9c58c286e7a2e3b8a68e0f13e09ffc861ecb5cf13c0bf5ea0af7304a7ed01c17b90f975c9a20d997b74192ddd3660f1fec518d85ac42abab5ee33494aaace4625e015f5ce0c65ce27916275974f3bec687730086e9e5121ea11880ead69d950815fe98ec4e1bd425665c5b1b67d192067ab02459977bcfc05c07a3b1950ab4855b37c29f5489e5dd09849c980e781f5c30998782177f4b1cfa212b8d487cb946a84d6afa76a8f875cd3f6a53eb6fbd34338f98a4fc580aa1060576d2637c19e887b0006236e1828c4bed52e37110f22b1e12d616b8ae84d90a15243598816cd763f0118b17dc1a8ce00ed4ab521464ad3ab3de7bdedb504160e0920b4a15188fe79e1cb98bf136f434147e2fe0d27b3713f30028c176e366c4f86ee7eabfa39e6d1a909225b95e5ea2be9df5bfe3bc655440e9c22309b4a580bd19300cd9a47f7ee60b9957ad0728d64dd27141c08e94663df9cc55fc4aaa3eaf0f98230b81af9790ec33a434a7ff2942ba4718e18850b44aceabecc72bd1596ed064bfbdc1ab419bb0e59df8d72e264d93cba7df3036d8e7c6e55a02ceb75b4cfa4a5578eaff07770843a7521b5257bf1d936101fc934ea5810d1037b9c8def9fbad66c5741743b350c242e8cae83837a622e70264128ff47b87c1ce63823ec642f2761be38090c108e613258c7c4217dbfeac490d21076514e9c14f527005626ede05f4cfc77920bf337a80c67afff01d8b235e3e3b6f67eba7a1230d2ecd3eedb498d87f586762d21efb831f50ec50e95ceeba9dee028d7e45e3f209fae0bc3e1aa14f98bfd607e01d08c4edba71bacde850d692a57b363b48fc34cf710a8ade74a1b2a27a6f7077b2449eb8042a7e49b21c4ac2fe3412b1357c53c43d84fb4d572cba12f47e4cf78311a914ca914bdb4e837f9554b7735e7fc6d79e9cfaae1936a4ce60da9cfdede4125c6a7a3084011238fd80459ff8b1ac7e48a53bd613b0a7ac58127945e3d979a9215f9f72b749a19f3d1a4d38135920052f7e76a1cca20ea5efbe7d03cf389848a03aa6e276138148c6d9d82a43939efdf490f9d8297be0141dab4240f089e49351a22d0a10fd15a8133572e11a1f5dcb10732203ba9cd0893a9f5598085bc30bae1cae544874e34fbac3b9f7075b00ef3b9b7b9f00933477fed14373671cd8041e00874b5d098ea225eaf9c68bb51cecbe8083149bdda062a307886dad4b882f4a045479ff295c41dd31cefa17dc064611b8c4fedcfa88dbff9890e13b7657ef9a8ea24a8f62f0a1593eb5ec4c2e518dedaabdd8546872364d1af978a21bcbb78805dd478e34d03312482b27993a8316aadcda1b82b5e12413f52e8e61aa5839ab1081fb8c1d7f89a104bb267f7f1f92c1d5a652f8514a080cbdacad0aa081c86c252cc1098b43177dfac2837f6a8b64db1baef915c931646fdaf05f0dacdcf653ba2a52771cef6f1170fda9098b5b1f4f2560787b9c2bcbe5e3961edb1dce45fa56270a6530c8f3042db921be600324a669477b9a389d90d75e1a670371da39b87f9f6344756435be7781680e771817797dd06ce22d0b65eca0d9b207579544269cfff7a54945c9b8f4e2e66a3f1e5a20d9a7b6f3e7f9cd7e62609a672d63e7bd34c532082ae2017c1c5a4752366a8f44e319f43007fd1a05095b8a9371eaa6f4ed8b9cdd98dd8f805453f566eba1094e40c3af36fb69de290c170d2ca37e04661dbfa296217cb65e336c6b18cd366aa57911426930d4ac52f11f9c9350b282795bddedd24354387e400022d869bf1602d2af485756c1f70b4ef1a358080ca3a71e62d9127d086858f0bbb7363f8fbdcf03ea3b71cbc630ca7c29dbeb1800da97dbeafec74cedd886dbfb82b2bd4ca462734ea6590e35fc091f1480dd2f23b9941ae2c97121990b80485c3fce716a7c75b768f37dacb5bb5f9e6e4caeabd9a34461c6b3a0997e73cdfc3a28e9ea6da87136b5ad4015a9e126708389d02cb73a21371357c62322a3d83e21e8a586cabadd77b15e50d7a720063bf0e2c21030d0b3016520524d0a0e27a4bff981d4f62612f0e861107121da776732c224f4db29626718a7e575b92544b650d5ff63a46cda48c7701f60ae82e278c5b259491a86b7ceca58f04ba48ba7e971088ea12a016bd5eae5de24a1bbeff7263ddf9b738b3baee6adf32d50a3d9b4bcfba02c0b86703eaf3ccd4b9fe7e858e0cf485a8aa9669dea217e99420052be8139e452cd6e6fd9910f6d241d99741461e0f414a463b102615de31dfd139b6d6a4dcbb3e42bb33d3cb84e7c9f330bb0360d9338654cb372d8bdd139e6702c27c4a1b6cdf430f2d01ee1e183a95727c2e9bf765451b6d665bccbc96b92887d944cd0361f5230a74893f6b6f7a07850b2d9714df6de44a26189f22c3185df18295f43da16928d38fd58714f3729190f06a1cd6a7e7f789feccceb7a0a44d6746d7887134249b93064b8dc0ac0a7bbbb44bf2e5c79c9c5477df1f2438434212ab735246230dc47162551b18a32b0c30de3ae0ea47731bd017ba5b1190de82193bcf1765750bea96295af7c4dfbb8d14f69eb08d2d53bb2769c34a25b25e56a57e54a27632085629e6c2ea6b68a3469284df28758326c581f263b309a5a906defb6aba2062eb51531ef4bcb547cc7fcf1165114b51d381053c025f6571a9daeb3a7a260b0e9c213c5b5a354c831d80f6249732b69d4237dcce0917e01f441af5c3eaafe03e020e0b245b1dd5247d902d46df555f715b2f2d30dea122b5640d231f241d47f80762e9025f3bfb33d6f99cfea440edd406b021ebebc5d43ef0fc9ed58e38e7469263fd7cce5863b70f016dd44fbc09cf2b04e086974d9ebfd02f8d6d92c7692f8c5b701a113cb8b810f1c55046915b68b271918949ff2742ecee196f979474bcdb9069648eafa03fc111cffbf2878aa983405d7c6ba518ce2c816a640565b1f3684b11e3ae79c3520aa8b05cbb663f9a86b96be86405186c782fa7d44303c8de1bd38f1ed961cbfcd30093fc0af52142a423e4559ce8d023b842f945bb366085dc720c9d78315d42045f9e6145fdd9a9c3c8ef497b15e7fbd4008741d4c521ee946eb0e9f1af242e850ef915d6460ed7cceeb54e695606fcb4b27a4ff67ab5232910a289aea4c5c73e55cda0239869d5a8de5debce71d52f409ff9f8891bc12c85a00b0515d7eb15177b428896bb92aa3de010a9122ffb9b61112dc2f571f00f8e6612e690123c21f9ca7f579576305e753bf60e9d582148fd4e3d37a344e7d62ea9e0b3861b60f2ca88ad948a93ebfa373936a4d7b4ee3ffd9f52dff95c51894cb39cf45fbb009074fef3c8dcd86d846a20f9f3290a0b874a4c94416080d42ed0ca6f3282bac404dd747a7af30e5b07f8396682f9241f28ca9d2ae5417a18cfa13781f359e05355ef31693237fd6088c8cca6d9b0c8d32b67da3d530210c673a942f9c24bf5568b907fe979106c2211c221e080b7bfcf97084af4140d0b8623cf320024c0c074afaaa422d5e62449a9ce7f3d0074d1ba74953678afc832ffe6fb51bda3200a56c824e93bd121ee7e59d430e5df51c53dcbf5e6f0ac9d4fdac415e559c6d49ba3dee6965df229906928bc7affa8b565ffa312a28594f328bec50637fb15423b04fad8f3afc266d2b11e6ea6b3e00877a904d3b25fed318754f2b48fcc19d3b22122e2485ac8417efe43d3fb2b11b1c4e2f6205da542c13244520835f459efc7a161ecdc858c205afaa0d1c38cc21a145382e1ed80180af135edea709a5eff442dbcdef859976c304b3c5144017caa2fa3affea817f9748ed0cc4389e6ae69ef6c3da0e4fe708ec6991f3cc8afc6c9dc7b8660d7936c67cfbcf6f9c801d3979007eb1ae89b9fece48d527895c128dfe5830dedc11bfa4b7ea173f6751355eff1a5ce354c58adf054cedceff35d2a5410624e8eb0d8298861294c20d843badbd9efefd7575e2101dd05c5872cac559126c1512ceaf1848641fa886139ba8cc20f8c55e952d5838646da162a87d530fcee471cadb88f90aee5bc2fa0dfa0520c5c25085485e55ce958f4d6bf4b0044fe329db9fb62dad76617184ac5131c9520886211fe38b43291dbfc0d2ec1571700b86a30fc30f9e0179db5e0b71d56dc685bea77d1b36d90e69799c35f31ff33684957879a6a15332a403df9604577af4b9d6642b43d36fb5053740139e223209fad0cc8bb57555905c8559da7d3a79631157d7b8e2037fd37d935cea61ee9640eac30fb4940e2d912fda7d5740e0d1a828cd82949a29a1d03ef83338e2b79891c0e6b262b6de33bb8a7dba8af3fd2c2a7ca1f54cc0c84e41c5e0637d752fc17309a6753492681085e8d991f41ae1d170697f904ffa61fd8ebed67e26adb9a94b419c9898bb3e4c76e78884110a317a008bb0e42cab79383d6664e3c2f0e7a8a0f543cd1d95b33004f3050160566e8e515fd07151589086d468f624e0e33c580a91066321b68973b697d9aa6083eb76e96268c86c862a51ca4324c1ff091a2ffea18efb43920370124270efa0275acc4f1fe449ccb8b921a5615b4b7bb713a8e3a33805f1bcc3cd9e8f55319d951f16e904dd85f064cf8efc601401f591bb5b50128c13caab3cd4c1db0120b771babf4d9dbefd762ecff215abd9b5eb0d73afca7c05952cc1f13e12b20f2d9c21a05df3670320dc5b5ce3a7c136b7caaedf1ec94c3f1a96a5635207a0d9c8aa49825b50ed3490819ed8ec293c959822ea4030c30f9304a6da15c91723fb72604db3301c9cddbd044dd663f07a80c77234698e4e429bf3cbb48b0bd7c7decb6c92c5848ce26906e30cd7f3b3f782d637319d7fd161d45873e93582bfe91e340ddd3bb1487a612e9c304003da501634f0566e9de309b6b34dcca7d63624143cf271886ec5b140649e7cc12cea00a5742c174f60f986cd94a7f3446ee0e56b4688f43de59b23a1797836bdd75985db0448f8d2519b85836d10e1adc536c98e015fd9bede2f5deebda7e2a88baf5c0175d57f79e83f6262ad271c4661ae2ce6cdd5969db0f8ac92a1ac2513c2520fc349601fb8ad5bca05f53907a0dccdac203c98bf5d068dac37d5f3628203f7fd9aef675e11198718c7a5f5384f9f0bb3a4bdf7c87f3764d948cb2c2f75d8f7b1e2e859cf15a537cb326fba229510eedffec2912676cc04c03fe1a4e051a9d7d955b4c5c738e8e47dd093165b33eaed8d98faf36dd64ce3dd97ba0c29b80f2eb04de529eaed4d239d1cb088468e759e48fdc78d130032989dead4b0601b7152e345ea04beb55a5ba591589e791759679eb7a8cc9a9705899da3923037fe68eafed843c49723892323b8fba76750feeffb312f30890d4e3d495ca309f5d35e6d5f6f830828ba61e0940e0a51a5edee8deb04bb5742d5653a1d6067bc3e2cda407196184dc7ec7d3a830b052b992090c7eaacedbf7c71f2f6a67950b5857d650af1c673e4192c23875d3a9c73c5ab9e24769426d78a756ff960e20e84404777334c8b3689810c0d5d9f1710e8cfe16f3a2b45071de16244c8d944f1b7131d994fee5ed09c940e8333d51b02f8fc647c6f554a0f1135ab19cb6c1c9abc526243b753bbd2abb6a63d907bc0f302ffa75e3a912d9f4febb247a7b5c37a02a2a7ff00191c9d258d6584fa1fa351b53e1c7d327b4a3838783a56b432f40038787123c0ab1bc0987ccf01e71d3ccf7e3c4661dd602a8a596f85ef977008ddbc38306a6f8613cd7309353cde10f79cdc6eb79491dc68d62136474ab7d98c530c86783b7336af1453b74a8e45775e6a4e69e29e066c6fdc2e60d1209bebf910a7d7bb0f52394855a91b717ec3dcebb842a259e6918cb9ecef83c5e9ca23c9972ca06b6ea30a69d1f18a4ca6cfae29f767ac7ff6c9a9d188d2f3880eb92d9846f9752bd1ec36ae49ab982e6ecf6793b80bece747156041408744ba17ff45cfb0acca5ec1842a6ffd55d9b96f4995b37adde802701b3c83a45b0bbe9de318ea54a52486b60172399d8ea35000d4b4f3a02c3263da319b0314ec9d17f92b2372b370f83637ea8a958a94a994cbe741fec895307e1e0f086a22ba9d58c23de1f34d9ec9dfcfa5f00e452630fa3907c91f749776d393fa11034e2360f37171c0d6939d1e05d5da3efe6db1fde2d0acb6e004a189e6d489217907d5ac6a9f8d6cb715ea792af2fdb3f064a645011b4c97db2951ce3a6832c625d03fb44094d731ff65054fc19f671b8eba91cab7816df88b2316d840c79d7bb447d03cf809f5bd29d18c266c43ccc223eff2e3889b97355ab26f1c9c6b1fce8edf259b03675f5ac10bdd717d7885445a655823f6d24efae437d92fafdb301b2ff6ae52f5257ab74f7477d597b6371e9ccb200084bdfb959223d365ed80850e123ee8f93fdcde4f4f9bf9b72d8548bd5571e90da4c733b1ef16ec73e80374f3d00843f265e6009f2bf2c19ab15e30ad2f0a21aff9867dbc758182ce21cc8688d3f37dd2e9e978037f196de4c5b9856a83f4486bd5643031afe444d92d544029b870c51f4e4fbb28b3605d49dd1fcd71feb0ebc5dae901ae18cfa1296d332842d810d83c0591307b53682e2e6a096f6fe9d08a426c9d488e2a94063353d1a580cd4415cda2467e87f9a14f06eefee190ffc392762cf9ab4e6fe2028b93b84e50029b0c2896f7fbbaf0ac4e77ee78daa18b1a92b57e86708b433a14968f7f993d128639e165fe4e90e2d99ad5eb0fa0fe26360994f3ac5eb16efcbae8b9600ca467861d9c91e1ddb64ac9b2b5671bdb235bb675a90f03bc5d2daa740694322f228c2b259ead4b2f8792ed249ae525ff9d961c554623052ffb19d3ce54c24e6733fad5f08c1a82ba7145c47f0ad7c674e95fc82710f2290ff7be093867a61d4b653e26fcd96c31152ffde01069c175d183234a798def0802ef84ab20c3c2374212c08ea8fb04dec60005b0874c34acabe79b33ab116bfa7f4ef84a35dda924f1d91c8d938586d4239e07c65236a3e35aa2f1e46a300ba8fba2a366e639cd5ec134cca43afd64b9d4566e81ffad91b26431f20d058e406bfe66f071904ca15d36923b530dc721084eb5c473ee0570825f1105fe2b70acebfe2879fae2aab798d89df32a8a774e480968843cbbf2e2dbb1cc98383a8b93818143aa734bc882aa1d948e8b4f823ee18abb482cc7ea4b36f2c1335bc133a6c51e64fc7b4a2a94f97c325805bb7c857d493a6ac4c0502c2ca89b61d94e0d693f2bf90a635c45611f8ad40a1a6ccab463cb6276a503c9081539c7ae213f8d2d58306c3edbf0ad7984b015ff49b1f14e4d97cfe64e20b951992cb272c414179598d25b1435a5c730b18264b2045994b59324ef541095a5bb20f7f84a527a41248988322510fa27492e884cccea92097cccf92d2a9ce11287253215af3cc09e4c92a88debfe5c420574183a9a6d19d426539b25e4637184584e51771be38593805cd9cac34e5aac07fae8bac4fc4f9924ef71461bd4f57fa0e4dcb91af747a562408275558163c9b35b4049b728a1ad0ac9122a3b91bb68e3914a3826d8756864d6391a2d48063fb9fdd563fb62cea43aa9042ebe0a51e4b2cc1090ba179d410a8674258502b0526e5b0e960c4b150356d7bde02daf4757710dc64f6f353db3b5e9ba34273200b6530b526c6432133ec20da5db15010a55b0ced1c090a1c555197881a27e6665e00a8757338dc847db1e93627beea02943f497d990d8fdc29987ab410ce5105e43f7477397f37e315ccf015a4f14fd12c6aee1342c9299b3f5930a9ee005a06876abd43e163fb45e3855e023c14288553262438810781627fdbe0ef1a85ac702ec8aa62d1acd1b3cf245b8257ed1c27f3b91373bd8d3f38d168b30cfe25ed4bc1a2645b73226034c1f00e1f5d46d4bdf36ce24c5f240a261d46d18a00a8c69f274012b62e8d51d0a132a060b6e5f7523b87ba4bcd948a334bbe61f18ad5de754aeaddfc69b44b8f573339cdca922eebb352c2f970a5686743188cc703 MD = ab103523d6f3d051bd1d48b3c9370269d9842a611a83bae98e5d4e87 Len = 46448 Msg = 1da80758ca2d0bcf157ccfb41e84930c5e26c95cde96df24ab0559a9857d22f7d70c2427ec2416de5f429516d3ce7721e5425cea5f8f857faebdeacc97d186a925f3f618e6d042c7573efbdd9c1e86f37487b75f6d21a2b954cead98f090ea9df0a7a4b321f93894e4b72690e03e688af43b03436f13dbdb8482cb94f882f5da1e6e57800567a04df0f741b706f4c6ee4ba7671ccf2edaeb261f6c49176e506898913708fbe121f8624472da7809482863130c74f43a47f421eeb73db61da34f47576bd26931639f22e7e1829d45953e22c719d246ffc9fb5f37d5fa3b589597120a1c66b81d0f491728b836dd6f563b720ab7bf2d44090ac742ee0810e5ce49e0f0714d516ecdff2b4e1c7fa05132243a260ec211d3af28415629ed9b8cf76d9b53930e9aeb44c845a337e44eb1d203626145635a72625eb5bcae334617b8092a79a931fd5e1dac4d6d31ed4f58dddfd104852a70eacab30bbda661784cb82775abdc3fe18dffb32cf532220c0efcc17156f5a0bc02902f2b9f390098f5a0ce643054bfae4293e6c883610ceb9ad7b029a1be4ca4845cdafeaa8e9710d81707df523839cb43814c0a5ee63255c615b4e12b07b69136d5bd6a28ceae47bec6d9ce57b035a25870eddad0ea1cb3585fd5813ef967ece2a4df585f20cea56e544c1988e63c9a4b08d2211f95536b195c1cf220bce61b4e7148b198ad7d92b26a68a82dffd51be3f202c5940e5ee7d1b5901a1977bb8843e3015b1b9c467650b036638e26898de7d685b0777ec58d48113ae273526f9988a211403016aeb911cdbd33f281df59205b64c8100c11c745192032747689b8e75780471f433fc3bd6a05fea3385fe5562aa6f7a6e1c9fc92754cf3660b914c26aa57572f4a80fd1c2e17aee774919a50eb532483247593f5ccc60b8f3810bd0e429d5aaa54f9cdf5c2fa29075dfee0d8457437edfe9ef637c6946438268d7267c85a37d688339c12cdb6594a1a2d20b4e010172d97cb8c200cc0e5a8fd90d5f9e396d6fc0fb5d339f85424fad4a6c0ad652fae8b1684bd7746527529e4a14d8b3c5a1f631007d833ebdb745db2f22a8b7cd9e34ea351f1061c50fe01034942e77aadfa55b4b215c84d5330bddd98c416cc179ec068bb909334c46779830f1cd346984f18233df0bfc7c540607c20f816fef0c7278a4902e739b598d98c7c4418482206f58430d3e200388c8fb8132d52b96d47cc3484b0cad12c78694517207e27530734ff1425f7a1b4fb91b9f8ca93a69504f78cf20003a430f171d76819cc8c333a1dbe704ec7514177b0a65739a16d70e7f0ba1d5b5c5bc9ea386af798cc1ecb87f8e6ccb61ab9e8e832a7b9e144b506d8fee78d2a9b9eff4c07244d03448622d70ca2b0c5b880b03460e6a42a442660c06a3bc8d38914dbfd2630f1c3fd6b4010a218a5e3684fa2448288a37c686985857ddd58c0ee6664e6ddb46b41bf762e1c02703278f3cec400e0b83b3f79267d117cf6c557923ca3ef74d944e4514ff3e174d3e0ec22a42050c19cf6db4004514ab2ad95023c3c9e0132c603137d9d9749406936a7bb7abe1d6f5c5bb982ac081a662b5228b6115f0260a430380908233bad59bc1186f7a44d3021f23f0ac6aa68df978330c661eedc469a53babe3a9e9e04ccfa924dc4dcca4d1344d69ff9401b661ab18435d551752cd1f50164d8105c8ee97993d6886e7a0e59d8e608edd01d43dc638bca1492b75a709d75c38d825c90d9c07aeaec6047ba1c36d80e4b6555be0421ad4fc7b98817a0d47ea2fefa8655c357b15198bc189b83e71279bb04ab1fbb74528a95ccd2ad892184cbd683c224d0c79ed3338ad4f7b772fe11e4b707ad28e2e24527d57c62520cef04bb22f8442797ab3865d06517df5f039d6f8551b174f5c54624db6e7f241d271656e110fef24f3f47d898b243243788e703777173c635645635e7904b26dd94c94ec7f29a5678c1c931e9a3c2ae81f7b54993503b4729253c0200ca1081d39ee44bdc87607d999b871bcc20dea4c5b7d0e9e3d4511e5971c2322e04145c88ae31f729b5978f3a34463c4711dd2e8c30008a6fe6fc754db1ae6d7926a1e0822a76f7b56589b3e3f4d13c655e08765cca0cd43d6f86718e4bc95dea18fd344b7c7cf689807c121d43efc42bf0a7a1c0edbe715855353ca3a9dba888c270826b0a0b9aabecb9d46f89677ca3ad02da3d01dc06c58252fe1431acf65c0c44ef683eeb8b25938820622e020bd47e60475d6e2f3e8ddc24de6a4d03f06cdfbfa5cc7fe372ff5b301e7d9a881ac64b0b10a79c7fbeb94df5052c64a93dc2212bcc1e34bcf73f2efbf84836c15082fd495ea3f4943151bc0b9be2dd678666bcce8be7c73ec1eff32fd34b6874560f7a6359dadc353d5b10b0c7142203735e96f10bae9f3179169215da0f996bd375aca128d3bd2c8ae13329b14b9a45abb499db74fb245dc6bdf2f5321b326c70bd7a4af416003fc1ea0cc1820eadf7d770acd6ed57be8a51ebfd1706f79940d5eecba8e42c0b378a7f83bf62e6c3df9e98b6289e48d57fc2a89ac27c2c38afa9108901219c48db8ca7806a785a44c7a936a11ab058d105c0fcb140bc417680942c9b9ed2ee1df5706aeb0cedf29875a05154f44b0f1ae4f3f02bd7efbeba7d4048e9c720abf44bddd0acebe83628b129f2b7fe96f418e4048beed03d2c6e6c526f5bc3335a34a77ce2ac4f92af5a45ef20b280ba8f34cc9bd6e373cd11f91675a6d9dc328345cff5a7d18213e497f798e32dc1df68d4665fd7f207c8f8c3434ff74b5845af8f8bef2704cb925d4891cd43100a2b086278f99804d6556634ba8869998096647aa5136b2e7137a3d3d9354943a3c9f644cb1021ff269de5b445c904ab9c4a2d6ee3087a35bd2c3da29879fcaed4dfbae4274d78cd40c8fcabaabad169f48c8fd30f765d03f796b31b9540653ae596dda85458a7546cfd3481b202d7bccf821411ef071a7e67a08ea89a338acd1d15e6fa19d8b67ef164139e25491f8a775443904c61bb90546f55b06dfa7550c5855d413f76ab311926236acb39afbd322ba4b8ed2c4720082e909bd73c2eac250dcae48fd990572a6bec4e6c78913b492fc0f29c11c715c903c8d0a0a1bbc785d6b64dcea96cd76d5af5b0cfaecdee04871ea41fb74259e01683b990d3268b2d07a9e3c79048992a1cc6f9bd8469bcaa5c47383fc8c0d395904cbd6f7777df64c9290e41342b85a9d8e792fea16f8f85d5c114c4e94a6b2f99a8440438b4aa7444c036033d1d8331b7e1e15aafe64edb1b16a276c4e609f85821b618bbe7d6a39ff5c3d654277b0be13a509953d7e1f555cd481d019f9536f63e7c73ab174a3a03501d82214f55807d7d468237492f1bac6f7080487af7329b87fcddae4dee80975aadcf4b9ff9d6b42f2bde03442294488381683f8118346d859f1e6c90aabf849ad9857b1f4f55adda66755fd1a1aa5091e39d91bbde8397bfcdfd8fe8663df1990a6b58d640479105610ff1f695a3ec22fde7e43032693fbeef44bc5d0a4407dda94a8bccb2f28739837464bde4c846bd390ee1e9fd2c8e086bb99df87e1aedf01ceabb098ea0b8fd346b5e2e776183eafed92fed2515ab27ab25dac0aa07cc5acd139196bd974bd9dcbe875036b6ce31b5117644946cbea3154f1bbe7755cca1228db47a261f6955e333892b090e4d1bc47e60f73079f102130107f8cb4a144f851fcebdb0823afab29309c7d9b3282f94e8930de3836ace0c0146789030cdeb5d9384684506e54fafa5b22d8ceb88f58d17b78e93d4518e68188146ac4d1efe12af8081ccf593dd433329640cff95f617d375832ab2cfcb8e0e606809ea300f0c3c6a132c956b2ad60319743f3776b99be375f38f660c0ce8ab8ae88d4e2ba6b201e9234f2f96c0d1df28660fda54c77f105ee6aa382fd9ddb7a8cd22c3364c6ec8a6bb1c0a3b279a8dfe41633256a62d22d864636f60bad5f96120af8f7987a75749e27b7083e59bd5440d2285a5e00be18d76a255c938383a5ee81bfb1de2c67779a154a796843b81a2d2361c68fd831422234f308fda6f42462d504f4ae231f0deff8ff89b8ce157bf99863fc883fc8542745249dd29e0d9c2f835d32711518a210415abba83f7214469fa35edfcdefa936f93e8d9acf4c77a50b2cfddf68e0deab8cc081df3e4a5d84b7a48feef903cbd1efb55abeb13d3153daf8a93195140e0249d57e96310ac2446eebe23e57c13698970d77c6ea6c73cc7144d720300ecac4f70df495ce3fdd0623ee0866509463fb7dbb774be136996f7c960a23b05d9f6412ee96365c56283a753f64cf79f9fe6b0253eba62c482ccd4b70b4a49c6cf6503bdbd5f061ea1e51e1348a023a6e4077c34b177e21fd98566c49693b6ad96a19c07a366c756839fce671da87286de4924f25bd2c78e386ab6d948a40920f55314f3e3a031d5d059c037bf8c6ba85555af4683f497786522cbdf6aa6ca89b6237468c434cb0350bafa6c7475977211d225177004dd452956aebc44c0824f9fb8c3508f4a1d49ca6b86ec858b7c4dd9698e4f6b2b1e5c4cae655a1e1bb8da79bb09928d0cb00d08146ca13af5a4a276c2f3d5bc91e42796d1fa9f40def4920bd34e1603a00bb8d05cb272dadc97d7b1845b91ab5db60dcf687475f132bedf1fa99bc43c2eb7b3ebeb6246af67db565057cf6b80b81d76be1adcc37b3f9f297be4f7847fdf3a65216a8307ffbffa851be5564b82c9a0ca2c903971242c1ed8e82d6b3e13da1e3539811e9c130b7ccedcd3f819fab9c772e17293663522c4542e2cfeda4148ea8dfdd73aed3374e79859ccbdbd30af1ad4a567f38cf54817051588b840515127d43315dfe2a622c54a5b76ae1f6cd42259401760caaec7a15465eaa1588b1c5c71a4e21563b63c9d4eaa79d228f64f6669792be208a6c6eaa7e5f9c20b36d211ce18e7e558a9eaf80b0e7e32be15496e6d194b812e276e78675e5e223f9c9acf5257cc56a9c8565de94f2dd4ca13eac3cbe91e462577e6d5fd99c0c9dd039d1c652838713e5ba55450342dc2353659ecedae4d38d3de5789cf5bc8c0ceb403836f54d33dffaa0265a8872704e5c7bf7139337f5f21a6e91a476f1e0ef8f7f389d8a446c2d5fc9319590ec2a0c40d43db193f5dc4f715c312cc9c69bb451495b809dd3908a69b80f7cb92a7a0b9520eb1f4998f6e3e750ef9c5a951d09c52129768ca53185ccdf28867da7d0babdc477b320abc65dc0cf1559c5f8054e4fa92ae5e323df9dddb115293b0edea84f517c23a5a8cb2bb2395b0b8869b4f07543c8654dc9fb3130d04dfb8da9f442be3a60c7651a95cc101229181e64dcaeca839a6b0911f4fe4aaf4b73f213a2188ee1be44db6b86bd8f0bf815f463bcb7b3eb196db1968d43afc08608e4d678a83609fcf275364e8e7369407ba6f105d9c5dcbdf3e3c204afc4969640f26cd85047f59576cee52dad61ccaabfa2a7285374faf0840c2f0b912da3e4b2973151df395720385502d498dea89f5873d0a4d345a869948727f2a63f7b09b43fee65738e8115bd8419b3ef3e8f86eca707fbc7bc7781bc01576a4d9e7e7dec78de93dbbc05fe8ce8944bff25e409d298d79daf5deac150f737c305bf40a9b1ce9c5d665678431d0efd2d77193880a0d5aa2b088e64b0f9d543ad5d264415baada232a1c24a7bf443cea8b59d0f93edfa19f451d297c91d280579b2480b6a5d928ab42c93ef018933836e5905dbbc005281ba29ded682416be7c8a3a908e01119a042555fe88c626ab5eecff82f518e9b8bccdee7b364fd1d851abfcdcf4f7baf9d7dba6ac9751645d0aa88e87d0cff1182ad0fa1b0f9b6b947d0552ab0e103c0dcb6da690443fb416e12226b3736c87120eb3a7141b8f4cbba9a0254704d3ff9e89e23bf1b81a809d8b61ad4f0677126c107cdfb081b3dc157c855bf6ffc96c74b8424f191b692fbbb16d0da3b379faefd73589356a8f84699fbbde012778e9560196c94e94b52938fb4f2cf7a0f9a6630ce58decfdacaa81b94a94b0a36adf0e0ce591d94b85d5dc100ef493f57f80905695d31d6391b823733b674a9c27b76280378f0269619d6e99b24bbedb93ef3d5e4c4210c3c6141875953e193935d71b0694ab1016d1e8b83d441bc27abe5b34cc12c40c46d4282766600063a31ea9014505cd4d795e1f80a5cb4be5f9872c3b47ef405b14425a1aefa59771016a93dbe691ddffbb8fa88f784fc3708077cb1b77ec9f43549814b8b76bea8b7c9fff739041c36f03edecad5fd96bab39149e9c0510c70d2f5fbdc867bae1f83c47548fec1c67e57aff53a1026f2bdd4ae90e859964a100cc1ebc13a69a640268e9faf8a12ab1a8484d4635081ceb4fdb7b84a0daee1566545d7b611d145bef280e597658738a02945f2b2f1ae5934a155466b371b80c85eea46179732fae08a63dd9d0b900d83986be6b58dfd40b141ffb1d8705ca6ca7c37cd62551f4469507fee2d06bd8859648f16f7800f03bf522f812e43f2a1f12fa6c422b5f6909de76d9dc3c17037761ff809e5724410b3746d4ac91c7e20b0ebcfd0e544498e02a19572fdd648a98e2d6f45fbcf4d06421b216525844fa1ae531b5a068a989b3c318ff437bfb74ce61f3d31c7117a42cfa8f466eff5f7833dd801f612f35436bef9c5a80de83c903257ea83c3c36c54d0b04ec674fbf663d40d2c0b97191ceeef7cdee4fcda5911e77a0f827e6f93cad9c3a91a5100ccb22544e2211f564322623d246161109d5079f804d4437071036f459bc900af0b0c9621dcccf845777fabad4e73e72569da6e5482efdf60949ce5d88f69004111c1ab166465de612a65106fa5b30b835efe3901d24b9eda6f05f1defc60dc81717fd8b521921e33cc7154d6d2953ab4dd5a6ea29b6e1e2870cd07db7b46f1cabaa5a3609cc85427de02dd854d90e134756d739946cdb9e54a509c508481ec975db19fbb2e7efcd7ffb81efd8f3cbb7ca7a5ec686ce10e9b4c4f23d090b82971cb4222275f2c94ae71ff9d92100f1607f4a23d92665e88a4f6f732de384034d493d5df37b767a8260557de05688e8d60dcd0eba9cb8cc4bceb174dcbd3c0ab5a37db3b6ecfb6a3d90a4f54a9f1117e11e0c08b0114f22f2d98fdd93c0b9fd95d37c0ab2f00701431f1449602525e849570df704adb353481713969a148546b680424c30ad24a75bb6ad616a104bc2d562dac5ff976bc81531448739e0284be053d85f784ed9c44ffd7825b0880c0d4fe77b58e6f8ffe821ce2a99b84c2876daf3452dd2f9aec0e59b7c7e79b4ee327d8df69a04f7f81a3397ceb25e820f2e6e0a919c86d72c03e639c1520fbc7b9727fd5571a0bdddc8153437bb74a764da623dc596db0fdaf5197e508bb8c93ba517dfa0c7017136598d4c6d9d42e6b0e47f36e7021ac941ff4813300fbd03b5c414dadd83703c8c356487793e10657ab38d9d02c78c2fe787399f69c86691715de596168d354665c4628f6288264c4aaf54191bcf766656f7b5cb049cfa9bf7d653bc52cd98b64c6d4e093062cbc4a8409b533c01239916b5843f0875c34bd09926f49a2be1b4c69bf1a0ecb349f51dce2cf36c45daeead2b6ea27d3a07c7830c26e5f58f576a5db314fa9d65e60630c1cda0b483e28da5bf3b9c6cd30f3798991a386be143fe981e7dbf4b5feb1f6a8147021aa3849f86dbb2d7dc2723c497a7cc940409ed98ff44f598fe89a06a527662c2a98e084cd6e69df8d5208a96099d02a2c9ef9d611b8d432dbfcb4c0c7009e588662ab6bb1f48c2aa5fa58ed476e5850ac17b9b8073623125950d38304ca09afb5b60d515e868e993839f75a664e61d73f4962e1e902985288937adfc6fa547c48f19af81bab0dc5b48f488355d0891856b26a063f84c08e0a231f198607eb58b0a3b8a281c8762abb78d0fa9e8b3abe92d143776353182f2e8e34c2da795acf7d5afaf329655422bd652522a8e4f314742493c80cf42bb09633608e3cd50f4b0f75e66c6b0834582af2b98ded544ec46b3acf6a84ce57acb1c106ce15919545f782ff70cf37733584a012bf048fba48f8724af17368489e01a5bbf50d35795ac6109a92de69ad457adba51866cda21cac69badf41486aef165fd4a57c3717f3eb9d6c5511254ef25e24053c9cb4a2a9e79f83a686f53b2 MD = 1d5c7c600564a3cbcecda0efe08f5d375ee8135a7414b3bf9db6d53e Len = 47240 Msg = edf5557e15473b747a819398c9ac1459ffdb4c97d0072c124a16c723b63d57aabf888147d6b7dacdd44ca9f3e1e2ef4d95c0a47b5eae44a122088a1725107b612c88a761e381accb7c6efbda997cdf416c26bb651c0393c96be3cdc9971b398c7d1d5034044cb957b90e12b3b722ec1dca3417bbd4ae21736fd219a3d3069813fb6e032803c00a5ad55474e7047b1fc9f81242e64c57f68874fbf50ca378a1deeba448a5a786a6ba1669abdf48307f2e3ee9c44f4da51beec386e96ccd195bd598e6a713b7469561c5753f024be81432e3e1235d9e40978fa49c7d2c1a92cee1495da9dafca7e035299fb6b7d44ce7be3121e97709d172515e653ab2528b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf3384d8748a7c37c493aff0ddb830dffecadd779ff28656b1ea511c276c5c7eb5eba596d882277d162a461c872f6d3f94e5f6ebff974af224c049c47e7dec886c43286c35cd16394a59522acc14a1fe4ed3d64cdc03f6173ce39aa273f195858ca1d70194559191e98a9ac1b54f1243b5fc45403f20d1ec83bb0c5d11aea09d9b6f78fefc01e0ad7a24e78a48c908374fc80a6f2fd5259a80b1669e5d9d55f72314d40a76b94ab6858f012d8f68cd02a7a0ef83b40a3848bb2b720c61a6fbbcabf8b3ce096518d49332b0519215a8cb42eaba21d6a7541fbd92f65024b2db13bc83ddf1bdee932e2b77bc9e58b9e0baaa0f34f39e95bf470d4fbb11aea73e25dd1d191c9a3a00edd5c5ecbee93abef9667825a113bac1e733c889f8086f6a1a962e30f7a932aa38198509564d828aadfe8c55d33dffa427b86727ad39f0a8196f1eeb29f1bed838801ddb118c778c01fab28b30254cae3023935fd749143f4af155105b7ac7d11591f62a94af030b1be3549160d28a292afcb3f71e41c179d6a33c67344d33def6d578be8abe0d512341d92d0c4c9f5b3dcc31b82c28e19ce50d39ba5d71ec4703d20b5f99bf7ca4429aa928dc9c758d8f19746aa6065bf19eb8b5cf7deed854661218d469bc3a4d9f782c4977c9f3064b6ee4d537e317c02a2b196f3dcde14d441d05e6a3bc2e936462ca5a86db00109750e9c085c8fd51b1eecb624515ee79c8793c5defc840c0b6e1eb21b0db86f19b49ebf538bcf5eb5a8a35703ccee62117b02301f4e7581bbf7cf7689ed06cf281e0523af9c8e7d74d86bd61cb01b38d5c4a24995b215eeba7bb56f5f7c29a5b6e9e865870f3bb5eb36acdfc99b53c05bdcda6efcb7e3a799626709064baf7748c09ef17444559c6b4bfcc0a4ff269d162c311c9ed07d50db346ad038dbe6d8403abf63e1dc6a957770c225394c0223874b3ccf069c315ee26a2761519d9e3d5fb0c0197a57f945b25d9369f11284f831b26412ce6bbe36618c2318db11042ad9bb27ae881770018e5af72b66d31d8fb7ea3d7440cf528bbb12f4834fc6d70550b27c7fa5cb6d7d7e0143d6051e4a5e5c6b2f602857bca36187021d2a3f7561574f35295dc45ffe03d93ff6465479f8c1adb062cf655b31f760d262f4db6dc34fe9c8180a92b627b25b1218b5065ac37a3a76f8b0a89c9bef28fbd12a3b3ebfcd0acbe856c70e6f0c0f8099dbb43b52d899d9ae76721f65ab57d50444cf569b313ab706acd1d758635ef20624deba3b7f346ed08b524203de65f468ef18440a2ee1ffef87339f687ad1ecea1af645c1d0928d1b59d9b31adaebe07b63a6956118a92d2f707cc50394f0e7c2488b6caa7f5cdafb8c68d10f33520fb84ceab95480e8b532f30df6de5444690b181ead49ddcbdedd7da02a557a2108ac25652e38ea393e968977834d2b34e741142066146e97ef5db7e03d8201d131c3679672a2d7131fc69e4a28d4ac5af8e0c72155beb419a2d8b5c969198d0b319a9e0f1516b9fedf4fbbe626093a2f04869b91ca9d40f99ffb11cc6b805e177e9e433f84091564f3ae6cdc295f6719909f2c12533497901d213669835b078e7f4ac1985dfe6bde034f2bac915bb5b33386d2f37e192a75c0d7be016f0e1be8ca2cc3a9e16b4fd274be62d7fc62a87453fa3ae5b9bf6c2311aaf3547d2e0daed5c0a3f4ecd413dace78ccded918b1d57855ce49849bef20960770b33c1f4f5938830d09aecd7a6f871aa431a5e2547f1725f79f6d3335e6b479d0be3a66637049004948c5bbc60924f09360f16412b9c6e76167d219a2fdf37e7dc5e6a7ec7cada4f342b02389202eb714fd29f27f1dfe16763361b3e8ced981f26acf384ce6dd0d8577fc99564d1acaa366de31fc24333fb0728aa669e1ed20b93d62bc07373d869a6919919ff86f97b92e7c971c64fccfaab5bb4598df94d74c9e3f97adf665cc8c968580e8ba93cad0c493864248b152cf6d822608007722170db44f939cdc3be670cf0ba2fc3dc084b9a1a41057f745991a6ddc39fcea7dc31c7f686aa31751328864766145b4154f8e2565090b4524823cdccca13d8556bb4aef6695a19da8fb6dd475962f9d359ba2ad4d9eeb118c25556d6bd04ade597a0982cea700d5afab619d7dd4025fadf3a797c2446fe2c8fcf48e5e399d3bd289d8d805115955d1bd343de38d6681ead1fd73679c124f87738abe085fbd447e65596dae5703a4bbbb36246b34d49a78c124cea1f87aae2423888aeeb5238ea996dba22efaa838ca2fe7ef696cd51fd44bbe1805fbf1854b779e6395dc5850d08900240b7eaf988985da0d6297d06889dc19de08191f7b59fa0cd68237c451afc64741c855922a76577ceceb486f2b05fcd89f2cd26cd6dc258452384a0ff783d911b9fa11f8952d0f612c67e109dde5186ab9f8aa625e4e8475752c9593c8f93c0fcaf5263b3efa37f74a6d0428e783c950dcd02398481d9150ade3bce83c7c6992135e24d2ae8a4bdfb56f2444de8e8a1b7657b0574ae5c6b67ad1f285c889dc3911a970675a39c55afbe2c3f62941d53af503e357cd33bf174a8c08e4f3ae1e75444bab61c8a52f298c7c65b56e6a353ff7493ef25563c4e3bb76529e5455aac739d9284a703903abf5707bfaf444148afbbc15bf5a0282ac4c35521a511d0bbf50c69999f781cd52b573894f818c1dac50c12a37619c62f15b2d99d18060bbbe278851d8c50bf6ce4b0a101b6c9e9b24b4eccec3029e003386e39c5c48dd25542cb2f37f4f341a7f3488a2f73bf8278486b3861aa393c4e35ddbdc2330cef311eecaf0f61c96a2d5f093b45b66253d4c54a9e276cafa4b912e9adbceded28f67dc34dce5a3a02a730dafb6c081a266cc9d34669fef5ddebd97950da7896464c6838519c68aed0bc6fa214ccf04fc1eb5cee774de971b28d9274ef455e7111dde63302a0118d9d15234bcc8cf669edf786837bfbb48dea4743c4d22527e4504eff9caa03e03f315954bc6cd5a2d07238507a989ce7b04cc0f65041a15959cd4abb5b8fec5a2c54310add3bce7dec1858c1bb17580a41a2a1b20084e17e374e772358f98409bcce454e9683a00e26a7fce22f4056a6aab29180bce20e1de69c7d3e7c32f37458663c27cf8a72dde4e6ceb9bc5abf42524539676ca550bfce7f0515ad81602366e6bf9e709a6d738f9e76514bafba67a122416ff813ceeb57beb7aed42df39f501475ba61f9b85790979cafc585709cff1350a04875b129e9233a13da7fd66f7cb807838aef7d114d99e7dd10250969d4de0e0345122001ec74374ca5bf2e1b549c1c01d4c6e12a306cffe216d7ac56884c259fd53444fcc87a555f1f35262c3e875d3d25c40e29a0d78dc6bde281ec83253a7ce12145a1e5fd3d562f28e329a440713e67332c9605a43991ef90b1b22e31f8a352224a79abc59638bce2909aed90020c805962fac699aa4c93276431ef37041b0e7f7b0b8399090eb0a95307813fb5b05a7fd9dc4d7f89ff91f0c1ef2f0109ecff8001dfd3423edff2c654f9c8153431dbecb9c4011d7db0d133f1765755ad1f0c6d047d0489dcb36a81bcf82ada2797edea293a4a3d2f693a381c4ecdfc98bb1c8dab6e7f348c930021b38a0f5535eb77bf51c790a54631b64668fdfbbe73c819291f39ab0bf5859cf06039df4f073460b45af23b1e6b112da6000d4762e64fea898866efd8c0942634ec8c0290457a92116c44b370460f85a10a061bb2985677f50d7db56194c586367f0be0e096c5f41eae4461637e36a77daf6ede7432e8a8b5d607646f1a22a43e3f3fe107a21e6e23497aabbfbc8b7b8216cff8715b0a65100c8c63caf9b2689357af6ecc128ce867656efa4ba718e9fa68b0d171bcc69650d7921c3ada7dbb7fede4edf88e184a3328a9b7d0e8e4da2bcc9ad13cfd2323bb5ea3f687658c83482a64c853bdc97ccfbdb2481626f7345e6b146099c52af49aca46597841e6aa3735b965a548a767834a1117e50a5ae1dc6ca6e651bce1f1344204add717931694376a2eb6d6baf197f84f8a053c14c7eaf8d8cb2c8b5203d3ef635b6a8e9cb1a75700894e100b0352eef30b3d632dd0d3373377f2da8510bdf9edc9fa4f0861b7be02e0349ea186fd5585015727aee3dd503e526b5080013b872a604e01df100e93f89a31278460e0548dd419329ee7526c81c55f964dbf95c1a188304d2aa5f2ff6b1f0d53bd7b431494eb4c2905c678b285369554f43113d0daaa66dbf008ac2ae2d790cc53bd6ebc21b0b8b7eb67984bd10ed6317b3efddc5d2cb9523921843be52a81374e10a875bd8a248259b2f95eeeb6ead5ecd09a0cb378f15b0dd8c15afc80aa3fb75b3b67efe15932568fe514629499e94ece338963f4d69d7515adb1b041d18a95866db93f1e2070ebe6a295b712ab15aa1f107bf50a2fc178c08e6588d5bfc0f078879435a73fe41f9f79087497e70007ad7909f121c66e1fc1ada10da43c8ad01bd01f5ae57e35faa2b295228a16536d5fb65be0a0614d7100528bc51710903e5692833540a70b84d79566485500b5e51d0e9a4af1c9057665c54b3a940279411113e74f218010c6276aa06e5f6dcf75cfcbeeb57bc63f36d94d0af484dbede2349d742eeed3eac778786e1d102549285d337eaba620a3ba4233f07a50639628a876515c1166418fb408f6dbd0efca03b08f73b3da9ed8098ac024535e62191b53e6a861f001be27c16260330795fa10ae26f4567f09872b9739cf0a18a021c31e379ec3f56e089689ced5aa1ddd825640422a1afd29572953e91824e5e45429f1af5d0c8674c8e4f2947dca7a900add4f293d8abdc6f10aa417282b2cf85a54b5980dc30ddaa61ae6fb7f1a877639aec124542b25a8fcd6740a26a757a2dc4c5038d571f169493f4c4c0322aa56b8d0807b97879e962195aa0b3b1ecdab821aacd8de9d9ae95a5b0bd0336b4cf92e4b72762f25915a08502e628f1af6dbf3c5b0bf50cf702280770dcc357cd6284428815d448d64ba580fe85749223af9d85543375290dbdb6499398b31ddaea9a26e9477fd48817fbad8c03292bf01cfd8d34f860c6643deaecc775450173e44ef25920d83dd4e71d5b59e3a9177b3239c46bbf5a7dc10f10515af6eb9b1edc3d4556567fed4355752ad6ab86fd5b8becbb66fcc4b77aadd117ec922963322ecf807f4cd95b69cfad8c80cf4535e78680e2b52531fc179697b0eaeb80c264789044327877009ed23100f6c36669c5ce80dae4ed24c41e65febcd44784511c3609f0fe6dcb8588f98a18972c6cf16ca086f464a90f97f578508c474a9697cfe3a727519169528ea22353f07ebb7542b8eddfc2fd64f0435a57bfa27959fef60de247ca87b2e036688713711ef46dfe843fed7e3ec7657e985eb77438210f351165e2c7b54ac706b94ff7b7918a33e67ef7bdf4f1a9500d9ee0144b1b9e40f39a8c88e7be836f8610c871328aff7f9125afb1c5ba8d5886fa765685a8242cc805d09a98e81f521b0b9b00505fb6999504b2797f0dd5d76127abeeb252452b18efdca869d651176c063235bf74622a5888ca757f4025652292db5d6f9e93e46cb50b22b91ddb17cfad1881de8d64aa524e32264515fe7a51e89f130c0172b13a01d6aa25031fdbdc4cd8651bff508218b1940c7ed3c39f558561b0161f743a1732e99f3c4a91ec0871dc50164e984a225f6aa87b2e173cd3f5cda52c4d1ae77ad49e824d38d3c0dac8aee34befae7af5a4108ac8695beb23b62d72ad1ed941db737ff3f67247e2d99dca9f3b77259d192c4013f53a2422eb432b99170921c1cf7c0854b67b70da7b8db9d453697018f35453e46004e26c81292298f890a6efbd7ab2351bb8e1103704f733224b30871ab8d67cc75e29309bd4bcf2d049bb342bec280584bf1b1ca28ffd2c2670c95ff5c6423d69aa5b0771e255272c98e137a14cb4568ff2815834ab463fee8ead1c2b1911a6e57e1a69c9be75b67c02bb52a408f1989bf7a66b63d36ceed8f97e44110def59b94dc9c009d5b9112d2b9c2daacd6a5c47331cceb694dba97455af504e2115c6639e0bb298d479d7de5826112bf68902003936eab36c1cf05f07a2c9490f3f6d52e332aa1d17426b0e2ccbb5be10c83a657e9757d0c59b63e7940b278804c6cf35b1d12f0d3aad5b1b2e0f83c7a8c265d577a08ea53de174ac9f4af381ce465c5a8e89b9cf9b0528a3b063f3ef2ae204dec90507973199932c7de4a5dcb828a55fedaec2fad5044436785b8e7b23b1a7efc7175b2d4cfe5fd5a45ac6ef4f083aa433d2e31565053e21da78cc220fabbf970669e1ddecba3b36c73fdf301f4f7cc615788285b79287145b2e354a5b5acc531b7f343fad47a5de4ae647559578fc43e71239e26936bf7c6efe427aa3294ea26ac9dab8eb11202a93f097b64e0f299c4d2271a1e66c47d8aa6b8c2953a1c71368dc4dd042b14aaa56e158d8a59c853d9c4bb25abb9d90a781f86adcf95ec614ba18f62c20a285dbf82b0333388bbfb678d0746355655a678a17771c10babc24c3127c13216f524dfc501f6c7377197557634052403de597275b395d264019c2085b482ba162406ed7d315dae2c92328bc76aeae1891c2c4ee461a1696798f8b1e55d2ec4d45c0cd2f367f15030c7d1f1c8d07ed2b0b926f434aa1df0de15dde6994a4cb716463d746fcc38160ab87e6fc18f48603f5a504dadb592ce8f2354a7e8a464fba58aa1bc3888bc66840c40edf9ced0f300a9b03f99ab886b426864dc1c93fef849cf409298c205a9646b2053b9b69ff4b94e51b33eb3852fc18c156d7b3ea316c9bd23dfd5a39948737f2489496f3cc933f13892e6f61382d3386f434ecedabdeffd5189385202a979ed5677f1202fdc36396fc2d79bb9cc3f147b44dc6a2c558137d27a09f7c8363e60be06f9f201948acefd2d59cb0075cec740596f3b20464812af9890bc7156897e631ca80c3958f659eab9b6ae6ee548fac66b4d693ef80c37efcd15c7877023ef4da247965f9243823e50346b8d8475541660bf1b0ed3954e9a00df4092eed55c84811ebafca939f002d91d2be5bb1c7e37220d791940aafeb91937501837656d119f759e9705a04c3e3cb715fcf0071f31977face6a515ef52ff651fa3b39bc9fbe6946ab80e403df8614b525c8cfce00da95ddcfd6b9cca709cb1d4baca41194a3dc247e72ce16c3a3020098df8c469d23fee30e7fb083718d76297e6e41d04068b495dadc74a800b918063159b276188407bd12bbb20dd5498c292ad69f93338ba6fd391474422746cb1887edcec7038964ce75115ae652bc717ea9ac19b4de8b17dd11c1497fa7ba9fc9f5025dd3fe928a999e2707876a64daaca3254cbfb1c58ba81d4960baf2b30a9d011ddc076a3deda0f653448b9cb10c358ff8b53e5de977009433567ea89e900454b6b5ebd6ea0267262c8e4d6a4f9aabc88ccfab23556e591f15a75529fbc492385397fba5356d7ea6196147439f0a61f5580870b2a7d6342656bfb907492cb9548aeea1859e8339eeb05a23b90de00a9ef10c397c3f4304327d2c24b1051cfc11b32697d893e83b7877d54d5b3a90181dde276ff0aa394bdbff5922c7ce39dcf862dc292e9410e5cbe66f4e7aa3beed0a76067ea0773d9d8b63e33dbbf2e7de81107befe84d71eb61729481c7b7a12bdd6f16001c14a45bb92146cffe11cb734452925695fe9f9ed1a2c19193050b471f1fc27ec401222 MD = 9e12e074960f9d3d59a9363bbec9625d7a6f1f5ac0343b043b57ed7d Len = 48032 Msg = 32c2c3a0a04af8dc989e8daac785bfa177ef4ade647fdda7cb46cb4dc5d20357d36742dcba8c873191c9c8c518b0e3484b1ad71337b334c40db9d0287500bc5f243a763ab17560e8a4e571d2d1e42bc3e437cd4c3c93c967fd5f785a60bc0dde4ec3c8812e0d6c49fb79f29a99297f5969ce94521b2684d7c3c32caa2f0dde1e788a9e78d85d919bbb0db2e51988c754026894ed7b744e5e886a52e28afc1765cb1861e9586cb8280f2a197af808ebfad98c34e404860d4274de54c8188fa0fc6ff47a9a5543ca361d578f23dfb2d39413c2df015f63abccaea6982582d0612b8ba64f5378e8ad0e0d1c7ca6768c6869db92fa0a34130e445f4a88c06fc7433948b74ade69654bf8080148cc64a190c35785eec82a9f20f2ae528a63887b2c70cdaed202cfc28a3b368f5b5d52f634e8af222303ea0ec71dc44708d475f4051643134e8652055421be4d1e21e7953d210cf101831c68ed0fc8b169dcdd3ab774d16f28339b3890f0c8c3f7e0cc8591b6967bf10f67b6790ee3161543695629d2a048c7d1526226f17e7a4f61a8ce1aef7447597173ff53633d0074d1c04f4278d72993281f8cfd6c06f98f6d2479be14cfdea26fe94b6356fdf6ee4e8a2decad9f97f4ffa8bdffa988c81dcce88c676ccec635d271a2912e4c81eb8171f80eba201c521f98fd13ef2d7063469b12fc409a897861b20dc5355128d3331bb98fe7813f1551955421881c78c7a2e51065d85aaed5e65593e7b135730e2c3078597ceb89a55b47cb12ba7e68b3aa70908a7c37beb327013ddfeb1fea0434593b53c185806b055869ccce7bc98e24e199537459407aee5f12952b38161d133e0c65fe78aecd196d37380c3a22c0d9e334a807e7bc9101171af1b9a77ec29086f2777aeb9b345d313b3ebbe4fbb1911c68717f09bb6228d05ddcdc95aa5975d9f6717e07cd099b497fc724a0dcc914343d9622e9c4542d32e43cdd2a234c88e11e3b52f3ceb299600bb990974e7029d4bbff39ac5fcfd7e7b6fb048d7001924374be3ed82699201ce5fe45f1d80e9aa4eb940b7d143bed94dbff99e719e25aaa00e08ade5b24f725177c8cd5030b2d4bd43ee2826c0138e45c32e45fa755aabcc98a7d2cf7bde824a91dac6b56cfab727ee304e3ee87807c407a2d1ea1c44821d7a560eb82cbb9c1a1c7efdc59c2dbc0f26cbac923368c078fc1bb4c8f96fd8232177b4282b633a309649b50944c87de37c24c5c9176262b51eed710f9339187e3ca165a81e51e73e8dbf9ee90d6757355cb02c3c2b014908fe9c9926803ccd7f1a4795b06c242d8471451dfd4c66e28557124273e4a1fdf519ad9fb646e761b648fec6c9ab4667b2df7eb4be8863aa53e9bf9af8bae0fc09de94f7373dc56fa4472b6b5c4235403a26c0e59557ca1911831ca843342acda7dbe72211fb5351d9a34205f0c77d219af5b0331a2126b94ec1adfcdbe70bed6f8018b2eef61db2b6dbf7292fa19a9655aac13fc57af5f57c14080b3b29f0c5b169ae2c16b4810cdc6faf475176fa18ead4783e2fdba47829f8af55e99365f12e071bf031cd29cabaccded31eae2813db0149e0a1b9de9bd8ee085f5fa9f7fa35d6e6a1c8968466c2720a7edfbdb13196afcab9d39bf0dae972a7aa05e4134b5967a2a333b70d7b93fdb68d2d3c01dcbe3e5f1c2df887d00c1501a894c8446f0917b4970b8541839fde77908f9fa68fa23b9b9a296600059153baed54cd07cfe585b0dfc8a7ace95682a22b6f5f2bc4f335e4b64e5af5d6299d17dafe68d9f84f300bfff384cc474898daa05500fe0721abeef3255dd5dc257fbd13da323772d6854a6a04b30c17f66f85b1c91b89e0ae0bfed316d52c82157a2f0a70afbcc9ec13d0c084a908c5e09547b244057bcbf8e4b8c8bb5776629a0ac2316a47b668206a5375fbdd3eeb87a875344e653033b2a491668b5b2fe803903b2b2f70c0d7f3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065a6e02c8921fe6d3beb42fac8ec859ddeedfefc9d58fe79f13fde5620a0361d9fe8503f2ab5ddfb13e0e681dbbb0558ff97d4fd148aa6cd166f7524fe2d1cc7923dc67f8166a707afcbea28ce28ea232e59a44fd61c6d03d317e0b6d01d1b65e7ad2b36b7bbc45ab7b33537c9bc9cc7133a563b0a96bae5cf410754bff69ac1464065aaf33d9cbcd2a1b1f6f6fd830c5542d309d981f739b3f4d246f34203a155ff5d235e7297f5a89c45ad7b7507b99c7901016a638bc8263929d39388bdcebff1fbeb20e41ecce2acd9a380ac919892e8c96be6c7de5ad117f445c75130102a1e2849601b970a28d956212e29876fdd96138e743258b75c961be2b924c42e3f8fca84469e6c77212ca26fac745307258bc8b33d2e61a66ebe86f38e89e1f2a54bcae5fcf503db76aca6d523155b2813d0ce22684261f0af981ebf7108ef22045a11b4a7a8c6fecf624a9bbb9409994e6c0f231ef7c05dc92bc990882a568706c58639723f1ba8d25477089b7ac4247f6772fe87d3e6b5617f70acfb767ee9519310bb83436ca02a8c1365ec4ff38f4ecadefaca603bc0229dfc5cf375d0108dcc9984023c20af7d1207fad59900a3629c3d6010262846b18c53e898adb2c3637908da18b09f9d74ec3c0f7fe2522864e5767880ac130eb9545f9811a88dcc7aa14506ed295132b62499ec12b151e6fbad718a437a65e1e0fe06b487eecaf17c4c374fa82e9e35ecc205d9b58f65a5d0fd16de80188787ce9132832105cffb0e82c8ff7148ee70bdcc6a1d9003f62c8bdc4dbc600fdfc82c15ca4e087706b1da4cdf5d72fda9a9d24caf01cc956c44d353fe6b0be5d76ca293b65d63ccd5dd88b164b0d0d837a9d249bccd91cd2fb550691134a825d63ad711def85b8aa645c0ba4041b65e003866cc79c90634a747ab266e5f5f5443fb749a2a67183be0b2296e59584a196d1d36dcce3c54513dc18c92fd345afc8877203382f1c166ebed6bd5983cb490e422e981a370a2ac57ed9ab6a7fabea40c7684e6cee07e942fbb2ff7e5371d4bce0d27c3e0ab19ce5f917e9952fbb6d537c048baf67a794c14e71ddd298fadd394a79aab6d36e13ebb76e043e77d6716711c13b8e208d7160237dc8e4a8d8baf9cb8e84032592184d56466bd4fc9fcef22548de67ad1c37a617515123279e0675008b98b175b02291323bb0e70279be8b22e5f4ea71f630199676f72c79bd384175eb6920586abb4df7a853e34de6d8a8a7331f84f38df3212d693b5f33a8d8d5884865fe22044ada0326d568238995c10ebaaea5b656096348928e39da0350a7d40d2fa9872f79dbd131a5d417b47e7ad5d732eb4ee0eb3684ad705ad13f483ed5b42690dc4ea0ba0e5355b5bf0a1b1c99234cc401b101414df48210adcf281109d7db62b5e457fb0706559b7dfcc44cd5394cae9348f3ea21122429e43568b4ecd2ce9d8873181557c535d3d90f3281f663b329680b2bb78a80d6d508f492a0fb5f608fe88d69af7d0a672d54a3ce32993d20c2f48a211006cb3ac080af2e5bb1b841d84a95b51fe35079d6757cfff52a4015e9bd486cba025b906aefa7a44bac87d2f5232e82fd3731ee8dbfdd504015f6f32c46c876ec29aca842ba808cf74848a47506ba7bbdc52925a19857678a08ec58f9158cd84cd948c2c655cc50f5216536c669cbe7d829a0cfb0a37d9e596f7aa7eeadf7f9529dba708455ed88bba487fa67c0c55fd2d1233d4945a27d24b63c705b74bc5273d37c420b3f56acb15e0b7fd7a0495c44683b0eca03887c82799c42fe0e2c8c473708b7a986aa358cca7a27a48cca55933b52a4c1717224e926348014eedb0f3324da320da05aab94565e924ceacae445e704afadf4020ecf487fb85e7b3a53de397b51a630ea876eae23304f5ecd80e2d7cb800e2fba82ab5ce86c2947ece28ec16686e19cdc41822e52920a3d34a3e0aa01b66068fe2913d0091c03e94533eb6926526e68a272654387382c1aa2d5c5ca51b323546f7a8f4e5c388cb3e5d07a9d3534ab18cf828eaa1b83238b9a8f08b54616e56660ff74344c52125c4140a2da0dbe0621c60a74be9a036ee48e483ff7395215138510790e73e93326e9fcfabc3a5f2e082872adfd8d598cd9f099c1fca5f540e04e65f4494d7e7dc8426de89025887150694390e35fc60bc063ec45523650e7412f688c8143824094dd3c031269ca8e8f0b05c40cac094a2c4ab82094452576da9a808832f0852a312ccfc09f71b5c4187021cdd5dc63e6922795ea1f6cc37e1122469dcacf07a911b391a7b3c7aab0814b3004db7b965f868d0e086017bb7b69693323d5597a2bbb043a2eebf649d25dfea91f8a03f1237ded791202d09ded57b1dec0df0a6d50919121dca467f3b8130d05547df004c0ecbb7f8d7421bb52609e91eb346c418639dcd13769a738c024f8dd6a03ea61b6579979e14075c42918a2050991f9a75b1869c0a5c83e9989183489c6c83d687242ea0093d45718fff44e90b2643cff3db1aa88ce3c889681716292d14773a993333fac3bcc405a456806dd5c2790c9ac9a219207333fa037a4e5913fee27a587ad0cc54f74cbe878086d339d58af9736465174f748ae571a47400d6948c3ecde24c3e4258a54442639e44bcc73f3d8592adc99f4e96f1bb7bcf45fc3d3c2dfe51f17a17459640dde910e8e8015e81d93cc0579a6a1fc7e8e9a9510f60bceff5b005a55a28e95a5ef923e644e9af6c754be7eac82eed0e00d5484c9767d22dbae8d1ea94686439cf7a216758e8fca763a56aaab003c76f0c26f55d1ab9478f53df9d6f4c6dd08637565092ad670bd9ab3491beda52769213c6f8ac22bee2bcca7fb15c0a9ff4e89f74f990cacca5ab53dea44ece81c31e1d9c996236de6d5d27af54da57669a080ebc6388378092c5658dea8415fa73bc339020a7df81ae197056cf11b92a888d8c16d8a37dec9acee828ac86362351135b8ad4a2a30f6f99af5e6a28ba538720226a9e092377856fe597327cb96624cc9f72ff7c0df07684ebae6d47e2495f69d6a0fee1b1881a4f63c2c48f272ab38e0730e75ca28c8b832d2e2098b874d80fb2a04053b08922176a91aae606d6c7029aadd46bec4c783e7cc6cb40c43dbabbbe52ac89a7e1666e03ec2babe1d428cf60cf10d17296045ce05eb56a8e0acc14019f8aa81ef8abfd34bb91033d8b9e9e617fe2b5bcd3f68661de273c9f44d7c3836d21db9d36bc6b07e62218a463f117a6a6913f536c1763082e69de7e54a36f4ca6ba48ad036061845527129dc4e8e1362a6699bec72f9cdc37c379b3a0f8c165309d17d5c75e87b2f0e719b1164da519f5a9e8854e06d8e5df7d35c7929e61d5f512719eea7f8499a0ac5366c1e60a58eda257316863c02c0fde3941915cf6a4db617e8fd48b01414bbceb472d7cb9fafc980b497c0ffbb8b02faea904fc28daccd16530ed4aa5b3da6007d9c3d6590709d52f55f4d33292a8b9bb885544a180afab4f099e8319f636e0d0a6e9be9388fb9fe9dd37750dc0e1c18964ebfd069e6b3863a34d00041245846d3508fa0f84bc3f616aadbd334c419240c82eef023aeabdca8564870f10f194060e8953740333fdc183be754d3db273073986e13b5e1385ab3749e1e2f72157c5bad2916b0d48202eb1d263029c1bab06415b9c5911ced72f4266d624cfbd16d0c04d7c9babe3f2d27b5151fb706383666715e9055c03fa7d2d212d7da0ac194fa861dbade4ecb9d569a305e0c174434f331c8ee7459a37bf80e4b09773d8a86bfb757848c14bbe5f03304758983533e82ed953a6d77cd61ac41625174f280b4b3ff3191548e94996d261e10bfc8e9a5adfb202ea178f1fb8801e55a83d848919ff4287bb83aca1a55d9c99a2f567c2cccf10615d0fbc59c13c6608f044d46cfac0ca8ae37a7d10b22c4a39c58ba8f167845c3aa5c6ecce5d805505976c00fa180cf3e9353445dce6c8d4871bc73a705388fc536a4405c4b2d5531646bdf17c9b6a256e58b9ea4e68b8a04c4db00387b7635a745592f084ebc2c801a5408d39ab63c8dff51156ae6184184f024eec7dbb9bdc670db796562ed01c8f5bfcbd7b6e7e4405b3456f44f8b5a35ae3aadd9c89baecf33bbbde81a385b88811f96a880f4301a83b5b1f5756d2a83398cbbf2a4648f1df87a7af4f746c02b46e407aaab43a6890345e4c31a26391a3c8ba78701dcb53f49882f306c60a63db1bd8d72686ecdf844753e01805f1c5721b7df2b634cd79fa175491efc4e944c4bfc96747ace0cf4e1c44c255a703ac683b1e1344b3d5cdb9ab25715293900b38031c14544e9ea1b45a38da30af21ae4dcda4c561c36cb6f8fdfe7b775e8722ff8fd8c49496afbb7faa3810f045d333e87c18ef568c189c81b5e697a54b57efe10a056150aa9a8777b34b4cdf93a2a302ed81796c3564e71a7ae6ad268287dca61cacd2d1b2e76b631e797643be156663cbe74ae8e6d5008cf405a5402c9f4f156ed4ff5cd71fd10c92ca7665f1b5e4d3bc534c15c9f54d9ecc4b673c7127b2f7a885d03c40c9203bb847348d5208861a68cb663a034b371aaac0db6278a86c1472c72db7176dc0b638f799030998b2ff795a809ebf5f27c6356deaf96aaae53472a3fe1781931945b9e38b0e3fedd14c9405838a23ba836c16597a4b6eb3851f53202ba2a8c493b2e311f3f71c8d4cc763d6554657e3b4d2f58c749ead4db49cbb479ca1b48796c45f8bba07c70289398ed4df1a846223c1780fc13b4fffda75531f3a5bcd658a42d559c68369d4f269bd07094ed2c037004ae9476a7b515f70c2b0eb1a19e5d7f5ec8101b62989ee219778bc29688457591122f07259ccab56b0029824c38fe5a54d0d52e730abe427c42edef46f36ed9276c3a39d12f726eec71e2ac3f1eb1c19a004a05da5c23e44ed3158f80e5f607420d34831ce5b3902ac0b873ccc82e51b8c6fd561b1546340ba8a137a6e8618c7b85ac677b47e4a580ad199da7bdba671b955d83b7cebbbe3d240f6c5b6337d53e56107b7edeac3ba877946e4267ec8e4d0be91332d0eaef5de5be8200feef7df50eef239a0270aeecb0978a1f7f4b43c79b3e891ed46a43d85e4d3d2a140ee35a00c6f44f6bb89bc7f8c165a14c4d1415b3ac59ce319058470e29e2493b0ca1b7ec066211730a6ee4b070858a57686bb1f5e109d38113992465d315e0ec7f35a9214bf192a0ecb4ad68436e0d3933d716c24b1dc13b6a82fb05e74c8390bd1ba830f627258db5f9ac90a883dc5a25d2ceb9690a19d8fbb2356eb4fa93d06cc02fab93874c821caa4cba2e6b5a52b4eb444bb9634fd24d835df0faa4b41404dfc9e1b2769a36773318553389298b677d11e9ba9dc5cfd692ff4cf6df46e40ba6e183c18971036c4089f25661ac8cc424b213fb2e3e2a3d4d73c3580edec8e7d210f25f447381524f3c02058965df416e9f6ae9a8fb69d83f66048cb7ee2b2fcdd2cdca1c2428cfbb8904df64d7fb75b7445f047290173dc53071036ee7834a169176b094d5723b220b9b32989549c7ab5b50ea3f8eaae49b8da96aa87d89dd38f77d912339f63aff3e05ad790072bd971ef0f95469ad530eb80e10d8f2775f915f42fa6ba41d35bf9b04be9acbeece1739bfb04593970fbb5a2f9494f90427dc43774ac2c66fc1ef9ce8d4822a168fa8260dbda7bee0711dee8e7440f398ec664e8b00ccf356461bde528da3dda268d65e6b6fef1e123da2ef9b2e8174ae03cbdafecaeecd7958a0b9b2589448eae00e5d69458063b4bbe6d7e621baeecc14796322f7aca731703ac988b3c7ee889bdcad87dd001240825621e00c71d46b84fb91c8158b3327032688562db340d3e2adc937a4e29c3e177d68293d3ad824dbcec13ea30ed3c2a81060ab34daf2855b1e2b092bac8415e1c91522327a3c508f6f8bf73eac1b8cc5750ce857c345f57b9a6d6cefc24c5077d5b35b9ab4a3a7265a5ca236e77cedf1b0c7ae04f0edacba9eeae34fc85786500fcd35b47e9061272bad903a457a8ea3703b5ccae83c239eb83e0cfa33582ff0e3bd514e3c754708301971974a96b7512fd285281dd3f29e62d13a4d77b0a5d10e1e3e9672d4a150240a96fc7b4420914c27b79b062782402b3efbd819e38086cb6a4e4bb6310885540ba0d83c1532da519554a245b96b1a7df1e218ae735878c82c10cc7b1cf51e6c970f99218c6692dcb5ecbc30fc0593d7745d8d89e2962d60de169745faff91ba3733dda01c44514a13f0676c81fa32c440feb550b3c22b41fad04a8b4d7075e956ce145c4754ac260a00326ccdb17dd0e2161e775944e8d7fcde44cf97003166803ebbaa800ffa0d328c9b9651b3db69d264278265c6ec8f6e8114977a176aae4df6520f68dec14c1806019d8079e20b8 MD = d12c093caa6eac327c6a36dc80ffa41b3905029ed6d9efb4147fbfb1 Len = 48824 Msg = e01f2ae593994249a4eeeb942a6b8ca7501a5aefa0f1c139824806c8ff912aa5cb4311378317e4133377b3151b335fb0b377b782ecfae12cb977fc60ce61033ca7d3f4d6cdc63218558628cea96730fd8bb3b37656e891ac8720c3c37dd13fe97db61be9f90df6fd120394e45b6dc835e0b897f367239a61f52ba4189447a55654d6ce999056f66d72d63d82b9aeef01ba6dab20a513c4f50a81e7879c2dfe2b341a550e1908fb0e7ee86cce4c926c0922ba36269a20d60dcf08d43a1cea120f266af76f1c8acd883d1f68f09b8209f41f87822dceb39a544aa9b2569ce6a9ab30aefee421463484b8647b112fe48c6bbabcd55cc832d66f854dcb06a4898ba75dceb097b1a3f8aaf5a0eb598e21be15fa4278db1007530988da6570bd3b7faab2b356ad5309e0a1feb901ef42a2679be7ffb3d32e98d9c8593ac9bc6e644f5c3943375190e0b612db9905fcd3ce4fa489dccd6caa4f305402533f13406cc167f9679da9ef9140a492263fa7c70c3dd9e9c110cd0d931f568b0f0e9dbabb9e70fa08ceddf88247002d4af619a8c6fbe10e97c21fdfcb6f76fa54808164b9ad22450c1316331c92cdb3eb7479fd634f6600442c89a661e85b590cdbe8c6cfb822e15db47c29c7ebb42df3fff04f4b020dc8b29634ecbc52aeaf1e68f96963851bd6e1f93661ec185da249e0a625e5dc806dc747473844751605726fddd4dfdeb32d822a6d63f1e26f1ad55fc2079ba467f76d89eb1361193c62f038bb8fa98992ed268e48b84011939e7fc36d7dd424696f8ba248047b05c7ce800abc232b4e611eb76ef0e73f6d70342f56ce10f9222fdc09db8593fa0260520a2f0817cbf7c8c81c128c7858bdafe7cd5e0e4770676146ce7ccb4846d8aff476edc6f3f34a6ef43dc245f4f2cbf7bc412454aba2bba6b5c4cd41acc74f5bbeac8d1e400a11fcaa02c643e2745df1bd73f0c9c3f7e5a632d2161046e62e0db894563984781219f05365adca483c44f14c0a9417d8af0ac4e09e5f9e093f6ce917923f4aa4166ed018e9ab34d5309960b2b9df2fabdf7a74d7ae573d9a4821591b875817f8e4a351399867a9830198138e46cf94d93e9d499d8e20aaff12d310897faa75db465f7b9ebb06b0ba76e811c9f98ecdcb941c4b1b86e16da2652b174ac060ebb5024a573099b3d2e2583262491a4462e8a99e8239dec20fe909d1754492a002efe10decd57c9496636f1d0ff8f118db9744ccf7e0ddec173ec56c32613f9240efab504376aad184a683521fbdc633c1422f4eb1f6cc870d0862a457880e60301e28ba62fc6c9324115c789a7fe0bd9c5030cbb864f3ba7aaea923eaa1462f57e41ff4534d0a02ff0dc138892888ddf22910ec15139aaee59a5f8ef693302a3faa5aa61e53cc459c037c3af39f06bb4d359658cfea098bd6334f90804814766fd69f77c9f4fa8583595325e0cca28034db8cb7eed08778d5e140cf92a73a3e6fd2b70f5e1adbe93d790fa25897a4543086b8b37baf5e9d6b0cf9f33398e9a8c8046a17e4acb89a51c9785864e8535ec89be4f27c6ed4231f1c43a56c036adc01d67f376492d9bf47b355f00ba7f8c78483d61cfcf532327a79e68d44d00603a2afc016e5b48681a89d701156bcdbb6eca657da002cc0f1038caa52c3e8024533f6f35d6ffa0708fbf18f644b0f4454896c2ed492fbc58942bb579cf131a9c93d15e1b30a4ca37bc8167b90f5897bc9e23e25b1b94a8b22bf6fb415d79442b8487352c1bf92a4029874fc3e5910c73c7f8202197e0158e203118a637cf91439da780e2f95b450c7f173d916818d72d5e9a28eb6e70875f49507a12ee84968757d8cdca4959af0ef5e7bdcbf74e9c2bea704912dff472a7efdbbc11f246a8694b81785c8c62ccba564f4cbe23a0a001c4112d329cba6bea9c493b2dd3746b6bd1381d24430532b0f8d466f26dcda731a40321b50550e7b9c71f93b1129c44018173288c0dbf5565560d99034614065dd2bce324aa465a7808c54266303cb6bce4b9372e3d0fb95a06516f6b3d1231c908a4de1c0c0958b7c9d0c397acc458107380a5756164e30182563684c346de159e617ee5ab2846fb92d893dff8c19c8ea6400fec1b5d46fe42729afa79305fc60c59421bf811c9a5ec332f9994b2f89a059de30cab6779a2df3d1936bf5d3b5ceb22c449835435694e87137f1126f0b509f0ab51c201ef81a12c1dc4163bf54cb32471d8cd7e3e98323adbdafe8c19823bcee555dfbb1d2d40b6352d0e4b1207ecf4d76446de39c52fc4f547ad60d76413af0d8364f177082661ebdc18091621010a61567022bb72afbbdc4fae33beed1a17a054e253a1a4dac59e4bb3f4763a97dbac29e9ba38232a960d5d8173348fc77f3a54e8401185d647e90672abb686f9ff14791423345938da04fbc7addcce946c380dd7554b1d916f4896c48d6bc8dfdb46be7fec3477430e6f94d1521c2c195515ea4ff1b2fe94b239774a27ea6292069f549d83bd1fe18989c34efe871abed07074a2a3ed8b7897382243e9c6d6c8e7aae5ed6832b58cf200019101822d0d54c4278fea6f5685b4c112626195a7dd14d5ecf03839dacdde4eda2819b1d57d588d9d68439cd2746160e2262dbb584714ccd4364246f1fc84e2b7a4957aa697524920bc3e0aa1ad4393fbff8ccc6abf4ddc263034ce8db1ac481477036112e3e8636c0c384d2698c1d6ca6f2d3d418e46a06d7e7e451085ab0b9b2ff1f99cdb7178d9c8d0b8e3df62a5f7f57d729f3c85a624618d5f2cd11799962fdf98b6f693f5e48285f26be9bc9dff130c20b6529159b589f051353c687ea0072ae2f3bda67736b9c66e2130260b3a4847bc3968e037cb6835efcc2014273336725cd5a94f592aef20a0a65b459a4415bea98ad7f8ccc08ccc7f5414b12fea4e246adf31f5384b93131e5db371a7a70bef7d4d2841852f5822745f82a5f51faeef9172f01e7103361c5bc9e150dfdd8b38abd2f260fd726ae683510289136de90265236c41b00c58badd7d5d598f422458b9de9ecd9234358710db1cd1072f8d2b5a72fef561b16b6d17ea9002529f579e2ba2b5fdefef3862a1502a044d0efbb8e5e420bff28cfea19f9421d1b62fa59775d1b058630de427b942c2996176c539abf999f80f0972f6d8fc7b4e268d9ec32cde1693a80ad934cd456f06c0e16a3bf115933403b178eb58a604ee203393afc54a61060b80882851ba97e2f7f96b2e69ead50a7d0f60ed930377282fac24cbb389284629e96150eb24d5a48309389f8acbb7d1d79ddb8c1ca71a82d171d2959c2cc4ca6fb0056cfe1690c1de9b62edb84ab420afc7492569f39784820f2d9bc3a7df09696ed4db1ef261d1874a7ab796ea627d62262a77ef9b56b3cdee865cee8ccf8983906019a26ab14a0980d08b8b1d4b5e9b350fc221e0d087119a8d47513e2ed16aaf37a73cc21791c1c904b82975c73ac77e59b2b576ad74f99da2e9b05e65777b25bc0252aafd5f6c9d97ebe6666e98536ca8b7fecf4613f25257c270401bc2319e7dc97887eae956790a854671ca0ddb7a6d40825d22da78731c501595ba682a73ed5b02eb58f61be5dd22be2a41f1dc3227fac4a2dc4f085a711114c1b9cfc2408b35a637dfdc295e6032d1f26eeab22e69255a22cac83e82f683f246a27f957ef7e7c70fe8220b5d6434165cb96f19c9918ea76f86fc67770d3732b6fcee109993ffd9d5fa5e3e7d39a4ffeba9e55f8e316530eb89423fc135995a753191c02aefec732c9ef73f1851140301c8e41006e9678b295a4013dbf038de13d90120ad7c1c17763e6399b96affa4419ef1c7adf9f41aab726c8041dd8432156bc2be9bc92d3b456149bafab7d6682d8484e2fe13a963d45a2df17d5e09fafc524d0660478e530c90102f36f816c3182213fe71a6e5fb567a1b03e8e238ad2b350674b577cdf34e533d73187c5f59a3e02576a3243845847aaa243f0aaead348c95a5e5fa4a908d134802f9e51e7063574fe7fd2c1ed6f0a451deda57ca9faab160f68c1fa2cf4b68c67b65a2b2cbb8ffe9cf0a2f18241dbfa890352a1ad8f05bff03028864e40bcc1f28d635daa027329998349da2c18e0524f4ea222e0da7d4d63803a4ff8330a5d8b7e62ef4b22097c5d017084d13a41d4d5963a0628233c47d21e9f5d1316c9e8994fffe7f5657a7f5031bef85af0270984a2c5556fb16a35a4d300b8853120e884c9e14f9211eebadadddc3db082ba77c43ce9179ccd2e9f4167056938cc38e7b3b4b12e096f8cb664cb715bb93821a8fe2a4e5597bfb00e11a25577122f396c90d8168d42c77dfa54c4265b5f5a852498359d1748cf190a7c4c99eafda24a0082fcb9732561e90e1490a344892f0d71fc257e6397459119ea2c78cae06c932af1ea41e89a84f77b0af78f1e1f00e21990c298436c683fc5c30b9b20a2d63d72456857f58979cfc8a0c192f208152ba4bed494beaf814c956fb1a9f32d287060e73fa3a0da899a7d3db555c72eb61198ed2219dc48d8df1156e64b4c68aa537d3d37ccf375f98023489d80a5782bbc7f8475d0a61fb521c2e07229323ba30f50b0177bf64214a8412b3fbb94cebb53e0ed9561231c603a2f761ceaad8e5dcb61a9a957b02a213b5f4d63ac9d18b0fe448f4a735c282051e17ead37c5491eb0398eb309291367600516d3fec73e50e732d25cae57293f8e5e62eeb783552fe65fc8fe3869e72f40bcee56571b29e433321e92bc1e09031a3088a413ee98d8945bc0528d798cc1020b3db3609fbfb30dccdbb542b9aeb51dde5a9af20ffb60e3b6dd76b060ec65d07b6bb3c05de9079b89718deb2e029cbef13e97fdec6611faf786344826ed63cf93e01e1f5d902605f049e25c87eb0226f09e62dc8fc23102a62552fdd4790229db05bc27a69a59748ac97c40cc532d7d63e1c43600f509224c21997970778c06db40547e3ff1e810dd5a233d032166ead36f85b345e9e18370e2d16105ce478d1cfab0cc337b1b0073659efb363df595c7b06dfc6884014c9ad0c26098687ce7259c96ba87223a6dd450b6236c8e22a7c70c43b971b0b0a65253331c332c723b7e8ccfef45cc8c7e8684335daefe35485bebd191665437b921d3ee3ddd0273b2b034231475635a5c136add500374759f0cb5dd2d5158deac8eb8b96c9fd2c57442fb59d11dceec2e03697ba573d92cd561d2303539a3eda7226a5d518084b1a8bc483bcd47f58a1ddce8d7040613a011e3aa9250271facd46351a29388017f77a7858fb1fac07c512851b713c50b197c18a5cb2622b36359dbd54fdabf2f770889191e243f1709f16e0be47db7a9e13e8a2ca2603247595e125f2ed02ef7e184ed6cb0cf1de27b25377e26e8e4d63f7ec1a5e0a65fc4d70c8f55051bdc41041258e60d5a9c0918170a1244fd55787a64447a4d9fb210258ada219d63d1f629db54effc6cc47429ec6f2f08631178db1a9b11b1f432148b017b29be5116fc980668ef46ad9e0cf5cfee3d38c220bfaac54ed4d44de8b85199fad72f8cb23d99bc1d4eb3c731b7c6e610a49dc48b342f90e5297e50dae5be79e092babdada07425f9740b5f855ee2595cccff0f59beb1a1e97a76a812811bcab5c1258c100c706886c91620a3ea92515b1e264b92477a20e22e85fb9875b0b3ffce39a0e26bd6ae4cb69caf92411ef69300d9213fb6d03656ad73f272aac55d4820bea22ba4ee1ed2a164b75a4dce6f8edbe23867f3fc0bcf5f0834aa07a2f0171f7c39f39f00e1a0f337de04f4eae5d418073a12e545c6d4ac0b6a48738f93f5333b0e4344541e3e15ddcc9720b97feb1d11cc4876f58feefc463b52d8d36e69c4c2c9227b32fe356d1e2a1bb884665d54c798128d5390a3b77f50d21db7aafb3ada11992ce1a90b65c2a099a493c1b223f3467712a6ee7e457f50cf2a836f33fd4b8eaf3faa464b6490d517cc2eb970f45b7e80ee37d4040e0ee452e77fe49a75dde96c9cd5fd7ad15172a0189d76212ec8e734074e68bf7bf3b4623cf232b70b57cad82baaf82216cd1e3970271f4c3903299b4632d236f2f86707112680122583d8fcd5705cca9acc82ecbc16dc7a7dd1edbd932d3bf1dce3a5494e61f7342d27bcdf807154fbc51646c0e4b0d73262fddba3d785cb79a27d1831dbecbfa4890c1e8915f3053cff7211bed03e35fc504d9a54f883a955aa8e66c6a00fffeaa3faa4037d3f9a15b0aa8bec68072160af8bd3d8e06ffe0d5ede37118511e08fe1b9f9549e9d390e40845d549555c1e7e77d2d387591f12a25343418733c891aad10c38462540bb018c92ffe3d6e3d1860ec517ba130ab33665a04e550d622136ec8ab9cb0ae37829e41a8f0499bbe7c829fe6a94b9653b08b1650800628d5038ba958a36ff1e50d3bb37134a2246c99b66095cb5b091229fb31c0ef7b7ac8716e7b73a189663fd757e832d22e516efa62f506e7b8d210271e73fb3c991423e57e06a39fe5556a6a5ba992d0d76aed24f027e0084c3974315ca3aa6f463d0fe7231291a36b06914eadbc393884b610a1c6becb33fe8567d01d8b748e6c3eb400c566e4b803c0da09b7e9d0121d7e00f74e827172b600108bc9f102a3f25f39b7cccb45e395cd6d25e0faff64890ae4b1ee3b77cc5cf098eac89efbb5c0e8c695a1095c2e0973732a8fb56d38b2a2e55410b0884ad99e2675825a08cdbe218521aae8d0a047fb149e2ee4c3957f8e2b6a1baa4af21352e3b560ecd1f2d4529ce350304a4138ad770b244da884d815dd7b77f165cef354f631c81efd2ceac23363fba8711ac2d0c5f8d9b9c50ba581230d8b4d82e661eb887123b63583e8ba732a1419ee32ceae25eeb5efc235ce1826aac18649404660c1feda7d2000b68283bf014b6892458dc07420b946073c230ed9806361e688fbc85f533b67aa3c628caa2c0688400db6be1282ddf98bd5e9032331ad73e01104c61cf8b8b18a63a2b674fb12f64610714650432484c882b42c0e3a2c2634c7c3e2be30bba7a6118928a4d83659ac340580b7cb568fc62ccab12404a823ec948045cc620ef1082f600bc22a3b597863bc95ce823bc18eb974bbedf7e911105f8216cef87736b8a66f865659ea9fb484dcad1dd19ac32713fa72f07bb699a610127e4d59bf1ebc5cfec2e9cd09d3677faeef2d1e3d3c9920a4fdb5f9d963b88e78a5d0edae531e3b55e702ed609d9a3c7a8485d2ead5edcaba84c4d718164dc3fcb2df1c0b7ae62abc1c2a23b9a354a28894ae566a362af78331a67f3c5a6e96e6ce024ea03e1a107a89e8d7da909d9b1f462e1185065891482ae2570dd922ef7d20c2eb3344c4d7d857c46f8c0a7d0f88c28f6a02ee807f519700c9523871b60ad1a65b8d37eb661eae465497b9fde40c3158cbab95a8a9e6a1883cd52263d3d508370676bd98a594b5f7eec3472403f1bb129b46a4dbf74f7003185c3d012f26eefb55b57ed27c81955ea5d859fb547f8744419cc21e51d32bf9c4b03152b045ab7cae1424a1d32f7504e29d9a88bf00be762775987b9fbcfaf0aa99a75e3f7966427a59540d92e47e6f0bdbafd52dba8731b499cdf9c950067231de472ec50c47d3224db81fa1e9d8298a5a43ea84f60bfb50cf0aa0b7d87706c149b8c9284477b90cb8f8dee886aabac5e2fccdaefc715f63e0f779529b7535c2a0a337526a1e7ca262bc5350021ca8263b82889114e2e255953b8b80e327859cacaf8129c563a24b12ab84bfa7587d132c7e231786860e8fb47fdf2af6b580b83585ae979f6fb56e926d7b1ebb83c0f67f98a42799846a77056a7b391d48ae7c03ccc6833e6a3d75a8ab405687c8fa36fa7715a897057e7652a56993a0089651dd2dd2d4eb7bc0c71d0dd94d534db23b66c47d84c630d3f561d7b122c71cc0a08c50d974eecac8ccb83a50ed673a706d8a26e5a26f2ef05afba959ccdaacb4cfd9dce34a8f80dcec43dbad1d0ab8bd34304654ead9265d0ee8c36b7b20e2fb48897af93e16c5858f8497f6c485ef1ff81ecbd2444e41a37af0ccee16e2e41c7167d12138cac0491d451735cc200620211d5e689814a74905db6deb8568da9fb43a8a6520f59ab3fe4c02711c23254817f5a71cce747fd716704d69b0faed0d78c94ccddedd7a489a6101b39cd6761e426e4df8ceb6f1d6177815707fe044ec24ddc0605bca89925a4ebc0234811e2a0b50f904802227cd6fbc6c09da6109c7223e8d267d06ef18a4dada66cc6b48f4d8625247cd0046448601fb3aa9c76123d9b45c272dd8d362e1cc04e74cdd1a05126d01c99b9779c3c412690dd458768ab107d56c54875df97aede18e9c1fbce42239ad92d430e6d391b65f8a435d708312fe9ffcd85cb764d5051a62a57957196e8effab5e13b5fb55b485b8de1d7797646363dfa39f062b5cdc566b4d33132d60349f1b23880fc478d5829f8ee2b14c0ffcc81e9b9875d776393eb27d9417a75ff234ea09d71cb562e1ff4739f2492d7b9277c0aa8e29ef8ae5793e1ee58c0fd2926620fa4703567ba0a3b9c89665bf11ec17cdb7cb4dfb02a9b018166f99ee23dadfc6dd21ed2f2cd917fc24162e8c37d4514ea9950783454b8b464f7767cab993 MD = fffd444e93ab3d40a103e64d5dbfb6dc9cf7a23378de0c065ed8513d Len = 49616 Msg = d46fbbabd323c656b036d590075e16e30e8c07e3d41edb07cb561fb7850b9da6bb9e81629330ba2a2212a3ff307de3fd3c8492ecc0469d13b7686b4c5bc3c05e3359e2864d8efb57c995bfc597284e7c807c5c766b748fccd91528ccb33ae64d4588273f8aa55186aaa57009c1c52105e25caea85c0e7adb3b43a05f12d7d71bf81499b4d1dd845fcf2b00f338be2243690cd0aa1b7e26e7e5db192b02045a7155e37d0eaa9e5b893f10b5ac83791adb1d740aa5302a5b99ddc6dc5b0a2939f762de1e749d509fad023ad85c2a60d078067da4c1247ce1992dea3115b3ac3a5429edc30f335b18722193b02ab5d90ec02d0de5257dda7f8edd315f8183f62630b2f9b307f3278e81a302873fad4e9a5b990d16fac6aeff20f382b0c9046fc43503e83783661cc981906ea3c39a263df252667f67845f27f879c46a12be7fde0926a497ab12a3901bf0c14ddd02c9bf2d61fe68954155c0be76e1d687388f3a5423131ba88122adf7cce2cdb56f9fe8b3cdbf19ab84f8911af3c03c4dfa05a2bf001f0ba23b03e6bc2bb96b746810802d9e90d9d2d6b064b2f749e48f8c4bdbf1c7afaec0c6ac0412162e6f4276844e42dd58f232bee5ff318a64157377c7b09380aa4d2bac87cfa3942920461f631b9b9101aaf2c4ff2b3db4f9192142e3e84d31fa300b75fa0e14ad92c8a9ee15afdfc2724a3b7066b07e7ef036c275064ac6e4869f87a76f8b106951ad926802d2b7789319344b82569eef31b57e9897a0a7a036e2c7cc4d0c3dd14e172a17924ccbbc4c6106dcbce54210a5de7c3400b0976ef240f46bfc5a43ec725099822ee4c2958568d8ab7a2414e732f8e5d0a8433f55a203360de43dcbc3a39f06313c64450c2678d34125dcbc7fc14de0f5f720475d2e71b4396d7c7d5cca4b99ad2692fb2817d71e2526d5e2dd3b23962a5511568e7ed39777ffe100c1d09d7c7d52368df140cde3dfe3d72d0b86c32ff72adc14f17b70064f0232fdfa9bddd4292a1aa26f8aa447f8c6aa45108c75d2e4de4a2b8d0b922a4ade381b0d1553cc3a1405e3abdba274f73615d3f43380a77ad923406a177f2beffbbb0304254689377abef7ac1d1192649be27fbf652ed740842ffe91888030c7c1835ce6b20036a8c30e887a3637c8c85cd7f07a09c58abf45350a0944dd61599957cfbca6c7f91557bd3b1e105d3faae3bdcf2d078ee77d85ff0fda35dee72de900048de8e4fa079e93ba9f91ca1f92975bc3de47d11704ad53b30d42cbeacb1a47a261609f62060058ad05a3c88f08e07b7597b0d642dc23fa9ea952eb91bc95f25241f63f5998e5d3bb592d9db79526e38c5f2ce48e8b51bc79b64f870587c1c9bb33920e0647b5cd8da21692c0c0d15cb13fa344269b9d60ec3d20e76eb4059686421c52929ad80ecbe848efd21249ae8c3dfb3f309471b09e44ad53f3cbcb1f5a737c542519b65e1c33aafc1412f7a1c4641d1bd5fc347238d6de13bc557a2de0d09a5ce54db785288c2401af4841fd02b9f1203c5d4e6f61f89b6ef2da7988bf605eb1fdbd444a98fa9e45cb3c9089ed465f988e3e276fc2b4ccaebde032f8a02bb19d93f2c376148600118e774d0e2e1250c9f228273a0311591944f10c452b3a7966d0729ed1433732ad2380de546c25aafc91a2b697cb182af8b0946f360794a055dbc73b23ce151d61b0dfad235088577a92343c4fc2cf27922852c395dd410cb2dd7804345c28a7755e1d204382423d881e66212a91403931d5b17128544aa7c5fd0e5fcc9679b93054c1a17ba95b46715dc1cdf0e073461bdf3bdfb815b657d56410b6b2240f3cdbbb5397956ddc597b76cca869566e37996d78760cc78d062c390670afadf216beba5b6a5778cc5df0920f1b5d9c3bf5f3a7ef9eee13d89b10a579f58bd92b31217a62818a6f333c16d8138c935ae26771b628c024a19efecad0f0ad0e52c1734c22ef46f6fd19dd36715f64d43769745bc2ab427718e717a2e1f300ffbdbcc686db8b2062c8872897847c0ce8dbda06f8f2018eaf21bbcedf000a5628c5251119cdbd7797788405833af0ea97ef3c04916fb10a9463230bcb57be174f10033c4b1f0db45eb6195c40bb4568a91b98556e614320ed8726b6ac0b96ab3d465e2e65fa033d7d2a4d15172e02ede506f5e3d7ef3f378434cdb7cb471b7aba103ed1ae85287bbc7b281850bbb0e014595b9514412eb61f131ff67031d3ed8e16ac0c70e903d6e551b24d338cd6abfebbd3536c80980787cb245be3f1486a80ffafc7f14d1db7be56f49d08c6fcb56bd5630529d403918405e4cf6bb0025a597350ea7bdafc841130f5ee1694ab66234f16939164f9bcde69683851968826e11c965e54b72aa7a487bd2aa61c6926edd0f1e6ed5901f05c9eb780deca6134e09f8909c40e2f863f0455370086c15d9300fee484daa495c74dd98d577518ee1ea731d41504918bac4ec4ff6cfb3873db884476a0106813e71dd74907be32bb62da97a78dc3da1cb20e126832a358d08e10cb858723d8d384b7b89a35ce390276e0c26b767391a318ec485c99a5a8dd743f9cf7823a793b66c2846a28ccb52d2062ba06163b3f87a78f6dc2ea29b00054bebeb6d97dd5b454e743a029e12ca329088862b6446b3027a089816e59f9a2f73439a8d41573a718cefe24803528cc597933669db69d0660c6a5836a5b0a2c264a16b7bb2adb7a781ebdde75ef3010775ec3f915b85e7119aac7af29576b04a7a85ccad5e396973d8086b65038cdd74d5e4105647234d91cf4faedf276a59442f513c86b692b642f9b639458378589a122b471d30daaa62f4b43250cdf3f43c1da439bc5e4224b15185b60d615e38e3c512425aab145401b57ac3fc0bcc178eafef52a2b7b04b2b89e760212f96c4ee694990831858f0fa7c13c245632b49d870a315de5565703e1d6bd62540caa3266931c04b0b20f7c9d31fbba166b9f195ea5fd1c3a9ea6a556673768e47524a086f5b4006e5f4dedc34ef2ea478f0a543878634f747b7600e0fbedfd095d62010c636ae5b4b5d2cbe3c1289d33c57db6dc2a6aded914517c4637e5070decedbec1844599cadc257fc331a5b9203681a714641ab1b292be8152c5296f36494c3d6d014d05f8fbce6f2c477227570a9d8fa6ce7cb1461c4677ca4dc11ecd9d07e8d8818a11863b5605e5ab96d020685ad65b0f97c4dfdb6fc67776b3fb190fa726c9ad05a6bbc344a8b804199bc2783fe4fbd074d3c3f7c4d621e909ed64c8b35e0a2dc5aae0bc20bf6bfb046f8764d4214eb819c73b97ca108f4ecbdef4f0b3fa61a8d2073d4d73b4c7375e36b551a1f61b7090868fe30bda8b4cffb513ae2f6197c635a31a9fc3ee94612fd795692fc92c9fe1fa07040e9ddb8baf5a072ab0fb7430f568bfd99bd59a20803a6fd4050347ee1209eb225bc248b4e2b4188dbd30bf8e1a3c732480d1a01d58478bbaab0d35052d9d82647baf9a6fa1ad90ffdf684287ad0980a8fc4a70ffbfe63042aa4dbe8b399d15f3f5ce9963f32cb5a79d0bc3c4b4b62c8c96a8d06fbdffa894892da9293ff1ecf751860d39e01ad1ae7f810bed3a2bc0f9d75389155b7a39d9d014c08646814f97183ebd98705d2a3b0d32e2a94450831645b46398a03f2c39086ac94b563586fbd1607229acde0877d0870fa0dc0dbf0c6a3125a19536c9dbb8968d1f77f5d84c0453f4949b85b58a4fe65c7b094aba02ce3399d7404857e86802d4abb2a98fb2397f0b80453b789b12b88fe2d4efbe21f72385e3ab5b2087a01566960e39f154f94c7f95b3e698d2a266717c43e411906f67b26cde586ae1e9370a89948d475bcb22177cec6f5e588656caf26111fb78be69e81bdf287e1ecad08a2c4b8dd8ee38699cddf8bf125546f262eb335ec6016a8fee98b8b1a465cc48ac263b22ee36c789d75fe0bdfcf06ba10010c3b4b852fd438e8a71dd23de750839206c32cf5b00ea8dabab5063527cca6e0918f91b94ffec8e99109345b25076f8c1e7a6c4846bf48969616291a301d7727d3a1735eef6f1b76e9fbb5009e2fbb3b2b36715d9911092400bdacc0a832fd51532f44f896cbcd1b1253c8d0ab500309ad85c0a83f9a46fd8b09f5daf893a5e78077ab08de8b4a40aab0044de50eb38225f6cebaa2b1ae9da589b8cbb9b60d74ec18fa221f341f71f38eebdac3b2593f24f81ff75b0d8c8ee0bb5a05641090641691d6b6d14cb949bd4ee3f9dff1709b1b0828f0d0f48d4bbd2d5e3a7049db5f7050b549ad3ba412487e813d9232862078a56e39ad0d0d4eab4e39bd76b84aa18a041a5d0b877c7625ac482872fbf659ee6e743437cda9222bac8110dff26ae4d3fa7a6364c68eeff546ad2d0ab46dc1bcb1cf7309acdd40ceb6a8d7246ec883eec259ff516f67da07ec34bdb20248d2942dd468ab21163504fb2562eca3c0292aea3d7349e893eefdeb537d116c1406e52127a794c0e0795ee88b668137fe2f18e09971c6d8af7947f29dcd91385bf9203a3d924f12c8783d1d5f349a71ef105923f27d50a5f71376608841ca1d8d13e5d79acb428d3adc3ff7f56f8107ff773c42dcf86fd72747f9d3875c147223d1a697a3a507a6b3ffd8070279dd60cbce62cbcd758cf2ac8142ba3f7f18ecbcccd2e8fcd216e5c06d85d8eae627f2c0704d1d2867207ee349f182f54d4fc3b4600b4a1ab4f8c0ecafd9dc3336d9546a175bb5825fc2d2881c86cc6d2911bda735a04961d015ce9531448f6fde6a0c453e2f237fc20ca3f7736304fbb5173111a8425586b5f675668c4670f55f6260de3f37f555304659bde926cb2553b8a4605251fcddd9234bbd3b500f583c5b189194f699c72d086a47e8326d7e978eae2fae6fbdfbbc24b815a901e92cf7ac8a0bf9fb8f3a0adb5c21fb268a6be2f1b4ec26fc0754c163511c6fdc6cd803df4ba9b8a744127c37b5d88c639071e89a3f125677676d9b779d1dea3028ee038bb3f77b9a6704d395fdd8268a2e24fae0c32ea7626ccaacd9f2b6c2bd9bd3590a89719d356675b37eaaad540a91f9ac5de7bdb45d75e077f3086363c5443c870402a49818a0e98e7a22c49f559a647f69f33be7c911438f5b34a067f7906e1fe0d61d16b4c4d4e6f11cba530b75f9e6bd9c15cc35cd68458b0dea29c52efc86296a27838a30cc3f7bff0b398cd32e749138f7dc0418c35d0afacd23ae7e6c4c563560591983341a8330139d6a20869bbd604e81e471e9184391b60013ed41e4ffde6411d31aa0ea9f56800913ec76de7a98867837774e19dd593129b619f1f27ebb8f485785972238d8bd072aa593bf51483c098d7776c420c7cb2ad58310c76b536e5707529b73e84d47121eda41b0e9f5dbc04720d7c9c653f06e229703063e4c7de872f00232160aaaa450f92555ad37f236f4d1f57d36842d7dfde46d217ffd2a572aec800f5ac744486190a3000374fbd837296460e9deeec4f7f9a39b98ec104d8fa6794e1ed9c088e12f3f528543652e5e85891758dab0fd81253ae7219fbc0611cc7280ead89bb020237edfcb09da940b74f8031bfe20622a15b796a29e8a4b61bce03a473a3288df1bd5da1d5ea8b3ae8615b6abbf99ad63399e2c845f0777fff666fcac85216d5e86d90424b87c07b817869470a5a939cd1f531b5f67b0063d076b2a833fe4c82ee2fcd0598da10ac8d7bf3f1336bb91b8257ad58c3f1080b97e515673c0f933d0ceb5b12464d437511524190be96d4fc4ea79fda34ba571f5c9de02f6bedb3ae49898392dd46207d17e59b4b3442abe63dcd4f62d13eb54625855b274900747cadf18dade32f706da61c494a1cd6078258b2051923e6ea28fc85ce785db19e4f400cc18ae26ffbecc7df92b6febcb078a63c0926b118bd6ee88580492f66f8d10bc06652616e89a38116c0b7625b6e6f2f54a2b2033df8c0f26dbac348884ba815f6c62ce994e23adca91974d11b0910fce31ae5a2be61c52025c40e2f805f7c669727410149cd58e080e616d364480214cfb7e61501c1267c96e6516cb5fcf60789d2b931f514a596836ec4ee9ef4ed8002c2dee470df8b0ea668b5888eeabdffb60fbb01007dcb059bfba7ac31d57b466282f49872859add3e91610a75f07a5604266ffad2d16f35aed3e79486b35270d94151b86e79fef147aa7d7ad1d8d5155d5efea3d3d73c2fa53fab2e03561a054e451cccce845d52a7fb336109687543a80090846c59d7fa69871b0311867c0ea8d87e5df96e600948cca946876903e8cd544c26031deb9ee1f3609a190a1f92d1409ff257ffae1c106507b1b2a2260db3a25b1002ed1e24f4cba27b81abad99b0c5a61350fff096e90d762af2dd87b84432e5cacf8f18938c56082fb231cb2c2db1bc484c35cd7cba0e1e3aafe0cef4674b11ddd4cb82f390ddbb3d15642351304a081ab36aeed86bae26685174a2c6043707d0776b044de7a8e32d110b5d12a1dab310ed66fab1e336b63d4061ab38043cf02b223545a87bffa6880df0217768a7e4b362f19a100ceef840e56f92514da3f4773cf3ee0c332a2fd573d915876efac4897bd376fccd1d12f9a666ff19c8b43a3b2d6ba681f770a49caa8fe44a991a7b1c9ed3357d0e0c2cf0ec0d99995db6ebff5c661610af1b2e661ada34c8d25130f434bb7f9bb7046fae202d09d8f5f32e4c33abe6c04371f4b92b81ae0a02e50b97a651fe5fb14b02baa88ef6de76b12ca81904bd9a9cbb1f20454ef9170f1f358f5a5e57d0e2290e9ceef809b4ca390c9e763743a4a040d620d007bdf7e347d664baa935f733e8bbdd5833ea61d7d3f7b3b30d21e8384a42433475a4b364a5159c2dfc3eda8ccf3004500640ed87c61571364eff6e4d1f8a10d96054527c801bc11a1d1a83d62596993d3bb461c05c8d5f68c2843cc508d80f289075dc1222105aebd572faf73314248798edc46cdb8805b130595c8a4d51c987ccb05a0dd11bf007ecee45d941d32e95e6941e728c2dec7a6226d682361fc55fddadd357d6640ad62a356e6296fb3ed1ec5078bab7a59b291e92b0970b6a8b198c134fd7791430c057f07d7c7cb3dda274cad92ca4179a282d45f4b01359a41b9f8ad6750153eb2d3ac6780e3923927044a949b09aac72dd57e8aab4971597cfdebc7119b848c1859c6069001674e5a42696d02ee38caab26323d88ddfc6ec9c134e27abe41c3c304565573a5bce5ea4df39778ec5deca0d1b9d882233922ce904eb0113cef6e496fd7e4ba3505886d93a3945b889cb5b5845ffc15bdba4de207a390539beff40208c534c253d3be4abfe3f4394767ae4faaaf08c201e228aa83de03d06fb5fd834b98b62a7699e0183f2f2770bd613ed5b1219f0594635b9e91589b160cf3d343c4dcf95121daa63c7e0fbeb03efc0fee34521f5ee9904f14bcadc683180c1dd9e11c6ee4ca18794e18e01a7650ba7a0fa0ab2a3c760b8bd3623806a5f57155ac4ca19743e3d5c1c37c4adb11a70f05a082a7103cde278a212ea1ebfd39c5e3314436f30d0395181334ca7130966c4b5756e081ce6696d2a47e55d707697c7f1f8437128ebdc904d3bed96d519374b38a99b1ff6fb3bbedc3ddde6832f90751bd791c766756f3e07b96e22fd3429ac6b0d7c5d9af5a194405c996003e5ce933918f618f2583a86381498f495418610d607d86b0fbae317df0de374f5829a47d3253a0cd27a858e67b433b4a427949e020076f05d34496e40b681ca63ed3cb97265254c10c5987e1c01070a33d09c7f76611f958d491bc2ecc13c09540efc139d407e80b41fba7fe063db9c4923e5daba909b02a6e3a03a6994dcd9d1cd217add1e0f50c47235b939427815ee08b9d857f7b2deb0e921ff419929e4e112f518b9679e624aa54f53b206a71b2a675ea1d4fc2cd2b443e638fb36ebcf8cc5be15b983f4614da05175d0172e5606281d5cb909d085b8d9370e20d5e945dacec59965dbd9f3d64b83491dddd57089343e318f8567a0c7935ca937ddececd41552cb46d515c0ec8e2cf420c1660ebc710949dcd8b9cae6599c30c8b6bc6c8183add3e3da6f71975195a16129a7dba5c8c6cc2b698eac1f1341cc5cc7216eeafe1ddac453b0aedf7c0776697e627c4e21bce201a2aeed79a991a47a7ae39a156feb0872a6a01ecdf7c89bbf295d9cbf6534b1e8eae136fd03d5e1aa36c9970cbf6084743d076a68aa2039eb9061e1ff7a766467a9ee2fb10954aa74649c0ed7d4c277527ead3ab97d5978761d35f3154aca2107489e7f9fa45828616a24a67c98590895d35a34c659ba7fe737a37b0cbc78104e2db9cfcfba2782f8b1290805f26f60c4a3d50399248a77c6457121e9b7c75bc6c107c647340ae1c1a173db79c94aa66755e74d3ac812879cb1688cb6250127f76c4f0d11fb496d45a2c9c8e1073303075358bbaf2b9ad8efe250657bed6c9f68975b4b35f62c4d0b1df5774493729f2b04f0f4023769924a40f1533ef750e8a1a8f129b90cfbaa9c78bd8faa554fa15bd076a13bd2c9dc323312ff092bf72d2a09da4fa727fdab7e1deab91c3512311f1fb46960e600de31237d10e371a8948c20de64062e7b793b72449ca01b0279005970f57b5a57c1ce78f82fd5b1aa454e57c411df08bd3b5be192e141ef689e85e673ec931616ad929a4c04e5d34669f81556fd399f0b1a64d19e2f04998ccb372f85f7b10285c903f241361dbfc42812c15ad01cdaad3ee0aa2e2ff301b6269c9a6dbedc06ec3eabe69e6e855d MD = b3327b383d73bc7b18368f4180f63e26b5819525980645c6943c6eac Len = 50408 Msg = 984e1a22313c6444064cca92e2ab11c75f1b4ac5aca1b2e48e7dd68aa55ffbfcf1d8bc73950ff573dab5e058763b7e320f4239d2fb53c7254ad051c1062ad5beb955c9c7307901707febd2ca455b7836314fb576c5d0bb0a5a624cb9653a206ef8ac87458ce34fe6fdd4e812d674c67bcf2907d9947f563ac81d0f994af7a3b3b7c53f1630b3a87b5d5a6a55b1ef31aaf0ba7722efca5f5e9ce8e18a3dc92836fd883861a453d4d7a6649fbe5f32816b9de94c7a5f18a01ddcaa0cb4c718759ed2ddbc4f71299ba3e0d9d07267a77e65dd9ed0086bd2df20924dd63e6f4c54943eac11081e9fc58713a3459c51b5ef41b8c149f59b5ee50ec5b88851becd8ac04add80b3331b192a48a94662a6c39ea6363b006877257a907ed369143b04e2c9fd5851793807603587d31beced3b513d60f23d8a888f654ec486c3b06e5723586005cc81b6ca624fd6090b63ae84d1ae3dcf4882550570ef9fb9dc4cdf2f141479cc39f435cce7213f335fef7206e6a0d5ba687966ed611c1754fe1117f57fa65296dff93b75b753c93960b7bf2957bb319ce69744b0017c353f6f279d0f2ab5f34907b9522d998c7c0353e42055eea8585b0a0376b718b8006377b5f9e7ddea62cff95b015c5774617a839d1af2710f52e11ce684696e7781a660e3b4e362eda90efd08d16ab7b47f84370b3768a99728146467f72dca62bef170db556d8065d0f05be848bf82f4df0ab656fe1f5ee9e1de2aaf566df620c12df1c264ecfefadd5c5a22f0c37fdb87f549a5f78058ad8526b5e52990b85a924029c369c8a555da3943df51df7812812b3820abf15e8a1dd44e32f9fed9b837146103ed683d1ece715e46f1793341d596cbf1a1db3a28b0cf3dbe4c1e21e1ba8fe0ad78368efcc2ebf3805afb7a0f891d4a3d61a7b2304601cab0ad5a577e229bf0e790995f98bd8f4ab414cb1324a7a7fc2f74bb8f4ae7513d31a1194536781fd7d9bff9799ac745ab0ba553c629361e2aec6181981d9ca7dd68b2c4b1b2c302dead8cbfa5a9e8f55dad97f95dc63f691c9fb05f97526cebf37e67c1649a0b2e4d887f51a96d2987a9c172279ea2c9701a6eeabf52906005c79a48792695598a6c9421184d9091e3d76fbc445366dc1b6c81960893807fdea1e5de54be4bb4fe82f9f97c5bb729f22fe1ffb842b9805259013ca220cad15cc987b0bbf6652472d9df90e6998cf89af83cc2ea3444befd2a1665f5c1155e6886a74714948bb1ceb76d6cbcd1b706c47cab8e44f0af9d0428e7986940092feb226d29c8616464fa65cb1767c9e05b590154ea2d40a1264f989d5d66644f4bcbe302e040259944df2b2219504aae003fd05f5e0deac260c6c55f3c54f48fbaf2128ef4e3a8d15963509af8de1bc9fc6031f5724db7bb5352f656be9bb9708546f638eb18b1b5ac6f1e5a3e7806da57a26b3eaf536f3407d972aa6aa37b9bb3b1d9294f490aed44ecdb8b7288d18919efc8619c88dad485448282c8d401b84c1a0189a7dd79202ac0d0541d75457d4b2e8e86c254bf44d47c6e066197156e5968b77f7c3cc7f664d545dec6a72a5ff54706d7a720e82cfc687e60bc527d65e085433355cebc19fc118250f58648d61d217879d5521b3206effab5626f0246ec58edcebafa1f2ef95eced3337a668bcda62c97d4542101f9fb2930d9546cb982c9fd78332bbae064a3738f06eb4e250cbd69572a8cc23fdd7354f6ab6b8365acc0ba5849c653d444c8b7abf941c64de34e79e16164c595ba3ec3325f1a0ff371256e978334b3b5a1b4e35091e497ab5842a25e0142f4aa9946be0a7ecbd70adae05f5c6adda22984513ea5583c89e6767f2df69090152781728da68fe5a453eddad5d08429e7d8f48612d3d5b263a742ee62d098b5f1b37baa772f1ad03e76b4f91a1b5c814c6cf93ba50190acef95c6778815a01950f78ed6c5cda8f36d1a37267564774b978a9b5841581293f3590903e8ec3124fa9ac2dfc0a7c0b8f9e77d4a2dd35ff091dce3c62c00e2d0389a1378cb7ed23eb6451fabade6ea86a9878e4b8b929bd9020ad86bae2088c98601edc077f30bcf4da0ae23d7b1aec6469f7213d7c6b36db2bc823011e08de8a4369ec13572643f8852762f853195de98da3188599a2f136899eafd9b6978945ce02e654c2366f62d047fb8fe8e263767ddd49458349835ee4917bb96e3d13474a7a692062f985d045dd2a48befea397b53631e1ebc763a0a75115048762132b5350d32a9be82dad70676dd747c674c9ce2e40df15b4f8a85c5e1a6fa48eef5e72f6b2c7ef7add66ca67349015f27d99132614b1a38ad8d26e08ea4f384c3e5d240c868cd03a0ba8ce6d2d27abdb24623ece1bfe07d17abb76f20317d50256a3d0e2dcede0ae3ecff6e9a5f26c18efd1ab86d518d4f164cfe19a037ded49eecf241a146f833ffd68de5d3d74e9045643e3d0ce968d831d8c587159d5f3ab5d3b7822db864a67bdefef486243a555fe55624c66fb840f0b7d260874b48a7f3875579d80c6b8cdf6e1942ba2d323662e72c14a3cbc6afdb51ed4dff28e145de7094cdaa2a530db4eda77877da7e5bd8d286b6ace6da4c7b0ee0f6831e713c00f73b26abfa645081c3703dc51365ed480d2db2e8a63b3f575772021e1442b4e182142ee465e87ece573c3aadc030143b02e9af60f433b1f7926a1ad5f39ad4077be58a5c5125be2413d31636c928f7381881551ab908cae42991e5b2a1c2c4fc4877e51ba86439095efd7a691692bfc7b7bf4e20db03b1a582af0cbc0702ad485392e52a50ed1608a0810e4c90b9937047693f7a446c8fc2078c36fb0da1b77102fd329033087ea6422879ea1de49cbc3048d32eda8b8bc41eef0c789ce90901bf82755537fd996daaba6448a65a0232db24b04687a7ce3231a1353a9a20cc80f1e7568246138ee441ff76701464ec5baec57ec9310a7f94a76b5a49f18f2774fff57c1e479486936fbe58694d4a82bd12f2e6c0c2fac773e81323ae877e43675374903121c6a8039dc1b13b3b54eee270758f3221c0ce555c613770463547e0542c39c4bef21dbb31ce2aefc5ca55522e14232736a4bbc56b1f3f9714fb5c686ae520dd055f0c4395ae6b8bd2f3e293b69847a8e9edb6487d13e22cdb1aaa86fd66ed87de579e242f291b1a4c18ba2f6ec8a5bb22e5e968fa06c93682d858c2757847c73120fbe56906e2a11a8108aec06ee56bc9d27aac4ac19cbdf17e8fa43be3d6a7e6034a0eaa0f6a2a2476f2961350afbdc6fd919cd50902ca105376b5b56f432ee648b428590a58bc523fa071ce38a9bb01ae57c103a9a363c7a1367c4ce33664173760bae0c057608c233bc65bec7e6c632df3a23d672893feaef681680956526218764ca6f90d1dba6beb1e2134d4d8d2c18ec8e90d395f9dc4df4d72a74cffaf322066137c22fbc460d70088da540837b350b971617dd18c291967d086bf74e7ce84918f133f02924728f4f8a4a5037b4b60ff3b2c9df0b325cb57ec6e58b7f034ca5482840c3b0c6b0582d95c6fd184d1e722b13540c4fa021da62d27bfd2b4ac1b38549830ad1b13973393c85c7b3c8d0ca839460f564a0638dbfa789bcc1a7e9fc46d175460a586068e8eb112088ac7f81b3d25b2ad897b447ebd2a95ae09f17d8036c91f5d930d791c33de398055c6d202249bd0d1a1a76818dd05547f6b4edef415763aabcef01863e8197aec87d3c3e6567011cb78d3cd30c2d1814727dde9a973e54c523d770ced16287d530736f34e3b6c1fa2f8469b4ed456c30f25e6c726b9dffe5bc7ea7d4226d4e9bdbd3789c23b579f5e084af9fa7b5cc3de4db19ff34d2cf8cd569092e87ee56632911eaecabef83c088f250fbd1faa28bc87869a999994e1b0d1b2746988239ebb6b3289ef2c189ca77720061e28099bb1bbace09f03df610d1f984b4dab56365f33bc43b8ed7f6743a78306a6fe41c4c6d16c988df5d422eb2a8a3e1a4e45d927d10403ae69f546e5079636db091a4a02b10eeaecd63cc952d9d0755adbb92d192d52f2570842e0937fa1bf47b15cd66e43daff420edf014a14b11994b97ada4030ee383e332ddf57f7ebc9725fce0f107017ff1a058570dcc3765251505089a1c01ffce85080e83957bd7be379399ef21e0f12f922f6be0fcf6847180803e246c62f66dfc901a640875ffd2269652a1c36085e69cff994ec1ecc2171495a8c362b649faa0479be746f1978b7951a5c94a14b0ef174589a7999ed07e47b1e3079d507cfd16bafdbddf833142b6720dc644520481a77d977c0281222fa06177518ae5f1ddc646da38408f4f804453e51940cce346a4145d3c9b4829a3a520d041a9db6b2545979be7088a54dcd993e632add9ffc6b3a63589a2386962dc7c884878952b6c1b19cd5a9618e3a0bcae6bb309fd9c5a5cafdac3d5f663e59ce0f9e675c7c50a9d49e903879f7e84840ff01ad3cc5ba9f5ad977ba4e6abb48cdacfac3fd7ca8962a479624ba287e0b6350ddaa9bab00e150c16217dada35822e653fa2549ae70f1b5f90750b6825dd9ba3f52ea4d3c2f3167a145eeafdd38d5703150d491e359d0fad25345301054550bef4413f84265e12cf3697651cbef3b24e260bc44fb9c66efafe687c3945cbea6a80eb540854a9ae8770c8357f1e3ca50d17a4ad779c15a00ec2196d590ef7d16f4135cba5755c516969fb416e1aee9a0a93e0ecdc050f0db11a4f0ea887526d95e1268ca4b1ff623fca377131da93f80b40c869c61d3e1dabae134770d96327a405c7804d2f1b4bcf3a85ad0f87b227d9c6630d7f0c2939c3256c00f72bb26563571e8de7183773e262ecdd5249d48f3ccebabe4ef958c7c328632187a6c8909b7f369cbc93dc423fea74e940478098fb00d3657a0c5431715eff9266712c111425149612c99120b07925b922aa3eaae003b8eb4c6fa4dd9570483bdcb6664e96f0c26132e2de75fbb708363f99962db18071360c47d035f9054605339affb1e98847e764054ba9e94e2446e13d1189371e043002bf619f64c602d6b1477ea1d496ab0eef5a612442e381d24ebe36263a867bc075fcde859d5a8398a0e56b8621c2f6c01d0aa74fce2128c3cf438e6c825fddcdaf29cf4e6d6bd131469b4fc796b331e4343da69054ad20ffacf4a0c4d6523341f66cbc629c9ef58bec92b1cefc1264627d1ae4509e3271702dfaf494ff07840393ed2e29f29df68cd9f219021a86952240caebf8725624fd9a7d1245c625d8fbced5ad0b3710dc1e57e20fcbbab8ce0bc57543ee99c1408d3aa48340f1553811ee4cbf70329eb028ac8a1c91a24f16075341729cdb1ccd0a5698ceec483eaa2d3d79eec0acf079912113c7bc9bf476fe33590268ff0fd45b36817bb0958939370185c1636dae3f43fea599b46d4ff4d6aee37bbccf415b68228612f69eddea178398c0c13d7f0a258b6719e2e0079b780a0863ff115b6d1962cf1c252ce3c7b50bd87442e40be31f1082cfacbcc570cc8fef44998e040f563d8521a40742d7f9e070644f29fbd119d41e437bc8307dba87c1a5f20ee54b07fdd0a7ddf7a322cc4c86194ed5f7ddfb2061feb8cdf1c92b38a50f7259a62814e8d73837c4aeb114954319a9b0a60ead3c7687c993af5c05ebc4098136eeaf6547c35b1a350a8bbb04ceeec682b16c1870836618e2133f32e9451b876e65e6e261bb99ee1460b8a7e1501f0f13bfff2204b1240b82c579987751cdecc9b4d77480e8781c275741c274f035ea2b79d0b43f27480c3a6c1221e010a8180f838a01ea72820a37982df204d7b7c19187e6b76a0e5a82d4b013b46aa9337308790572e8803f210bca8421db2c2dfb0e904911cd8de2d5163b83385f45f6667c3f52b0c23a36c96d964f363f1820006a3c02acb0cd696cc9b26a97050b7a57327d79a2c0c9ef6b23a4951979c317386d35186e5bf576b1b5c0d0b8a52446aff3da802f2a55f26df69b5eb2d1549a0bde209341152e920ba10bbe8386b7e3d787fe71414705c839ae24b2e98ef331e187a87c0c28a044e2563b3be0f2edd735b69253bf6002f83513e69aa6faca65222e73dab7da72149f9df950b72feeac33483e2f90bd740acbec8a1dd15bfebd369c29b52974cd8aa83ced04f086e1e93804a90c9ea682866203b74452fabac2859973154c3dd82f66fbbe5f733fee17abb37cf2d06354f5611e1616111f24fa78edf903077fbc8a41a4146928a23fbdf61d5eea0e3b13df32064e9bf61264ef755f62864280a024a2fd992bf8f7f963800af8fa4078e7ca3c8308dbea1aa329e5b856a7e58aad83efd0f3acc9854792b142f22d4e60f740e75decdfd380092f31c07f6dd9e30a3192e3caf485954fd0f18cf388213c6cc89b5ba1ae9b8dbd88bf3f82e004d3e1b6f1fec70c126f39a8a8b2a3159f536debc046d0502886e8bff9fd0a084fa4579876eb91fb5a5b2e9f3e7aabdbb1ef232fbee620ce64b6b15946c1bdeea29c96618771d1c943a1563f1badb3e24056b61ffe033a2f356441e00d554399e605c6988e572f7fb788d80fa813623332d14d40e665c57b85d7bfdcb87f451101250ec6f26652249d59dc974b7361d571a8101cdfd36aba3b5854d3ae086b5fdd4597721b66e3c0dc5d8c606d9657d0e323283a5217d1f53f2f284f57b85c8a61ac8924711f895c5ed90ef17745ed2d728abd22a5f7a13479a462d71b56c19a74a40b655c58edfe0a188ad2cf46cbf30524f65d423c837dd1ff2bf462ac4198007345bb44dbb7b1c861298cdf61982a833afc728fae1eda2f87aa2c9480858bec6260b1916e8e7a80fb12a60e60fddad614f7e9f6141b527b85080a199b347b20b984ccabda1a631a2f6fa8c309a10ce5fa0e4bdd3721ed9d416c1359c5f77083c0d896fae604737f45651b68262dc89834691eaee0d9b47d03ffd1bdc57673ffbf8596e75cf4b295851e86647d4814d70931edd0d5eaae0313e8cbab65588b7bfdb254d80291294536c2711fd79bfa8ac38e3dabdffee418b850898c6b46c1e0c3885936a284df78a2786401fbcd8199a8a798a7c5ba5ca23c5f94c9a0e71c14592f2c6a0274dc140f69e872b387b1ec01a5852c51c8208ae53c73c8cce4a40007ce55daeb0a2902c6bd84dac571936c15af8da249d038b9fc10aef3b7e4618c158e5df024eecd2b0f9bc1a1fa322eff2eee36717679aa16c802ceb128905ca1ca96cb1377c7d076312b262f1a738b8e928a0b01a06c8088933b5a69e9909c256f0f27aaaa3e3bca76973beceddbb0028aaa91bb8e51c2f9a3e3da85c08b29024c20fa1f86fa1511240488413a13a7415e7652050acf76504221d66c76290c1ea9f2cad9d3a46632849c9694cbc278355617d548da8ea675b61dd786d3134c63ceac224059e33715de87ec4e669129c4bab5a2edc737594f4700643b9ef1f1b7027787bcdf608fa27aed12d8d428c4d8d177425a997298c83ff206f3a16a04048f7b83b52fc276c19ff59198dd2e5058e4863cf918e66ac7e41a4416a2278b31bbdf9d930fb2f45a97c7f0f8484cd62c3b0a18310c3cd73580a1a60c6ad09126cfcc5ebe48d81255a88cb75fdf295d3c1e2a5f693c1be7f859aeb43dc10c1bcb12694c9fa2dbd79a1b6c6f35686eed70d50e980b712ca3f9b76af7126e833308cedff19ce4644c11388e9fe1acc28eb0a7df4b7e73171220e4fdf6f13bdee0c54955d51ed81a77a3461bcfcd73ce49e4dec5002a0a833c56278e3943eec52beacdf47e8e44a662368f3a8760853925f4c0e74077fe182a81c745497150df1a5fa0e37652f1af15b359145002a9ac2bc8966e92cd167fe38a0d4bade129d5b80c0a4b45d4a7de9603edd1b11ba9cf6248a7817f941b606f5a41c8edfd414e0ad95554717a2ddbef0c939833134b49d25d3d498e34d662d7d8abe3922c5ff31aafc72584ae4d4d28b892915c5358c383ed9eee47150c2e22eb92c523d54d6cef74aae706d7cddc47ee34e5b74197e47ee11397329f886c587d40962862d160911244c17d5c76315696bfbcc946d255ca22e46cd83b11c38275fb7d2a3ab478096fdedc73a710f45c977c3d1ccbcfbd6f975996c04f6edba7ba0ca2b0c5bd5b5e75bf606f1f63cd62dbb391373657c57627ba3d7245685dcf36bb2e426bb6b1980a3174fa2c36626f49acdfa2f03215e6bc4e887783c7f102d04f4968946524c0187a409b36535e8bc9ae50e6622854c73d5ea05673533e4970121aaba8945adc86e3eddaa58067be43020c8af3012a219132ad977bd3edabfe4aca920f09fbf73cb4a33fe28625119ff13a160a8441fda212d6c30511a531634080a6318db01622358953532d428bc5c10312117b3e625746436178d30fe2853c656d77e7214320aec89d613c63359eba8e076faccc5998151df93ce2d3c64d85a17147e1f5851e6687a5747d32151026047d8cdf91e94dc98c13b90698e5a3655b3a0a41d4e504a6eff4f5b65736044b8cfad0de351a5ea8b738570606487022bc4e29d06869bab628114ab07a9d63734f08a37061f4b4fbc7ef7eacc6f69a05eb370a56561b28de5984dd33425413e4742e6d5cbd803509e3c196be80f70b56107d179b49033766abd615075762fee624f5966bf0c5ca1c34350705db54a95d55a6b766e728cd95458e59f362cf0ac387e38665a3cb5c7ae2d3394980145e62e03c5180d892d3b44f3413c00ba321c1c482a5127d9bd16c14239452173f11acd9c74fb2c549320bf351aa36f9e72a2a045a5c39273c133af2ae81e747deaa8469cd18c25656d0e2576c861dd5a30d446ef111a448b6082ca5fb66d2b8f71032b8d8147832c09781a30d0f3d46ddb2582bd12d1989129a8a5592acd913952dfeed6fab9e028f6e2f00bc MD = cfa7c3f12054db27ab677227b21948cd4aafec0b179027dffd033c87 Len = 51200 Msg = f61363eaa08cce68283076fa1ba17ffeeade05f89e216891c703e7e0b5e671e9eb94b763d12486bfa91e5465c4df1941f63e607e476f9d91eb28c17a75030c46472422d94d1b62eaeb0b734f330c1f7b5ccf65456f81c9eb44f1ef56adf4689ff109ccd37c3909f3d441fa3fcff33cb404da3dd47f1d95a5b9a59afcc7822efbd18bdcd9c64524e14e0712be005b16f5d6a60fb3dd0ca9c9318ee9f529750663cff47b7393095abd40a4e3532e0b5545ba7d046bf315ac5e96f205c83d9597ded38ad02a4b4b548e91619486c1cca2ad98a544832802476dcf1a15fd69aa8a74c597048556d4b95c2b864edf2166a5345867f683e39a21fdc44e421d177b862d8d613e0d1c6c3230f55b38e7b7a105e2e20b42f38ea4e3165dd6b4afaed134121331a74806da6711d7277b25e9456abf1ed9515c90e934c082f9923b96743c2a404e67c07ae8ff07b9343e2120197ed4f4194b465131bd041b000449362c457efa02a5fde15ca31a83c8aa64c5e6e6284d125837394325e910333462f8c1f7142a938985a4fffa531d2ce7753e744dc30f0d9eb9b0e9157849da470d43fafcf6b94a3ce22999adb970a81cdcf58b59ae245248531ee935b8ae3d68d380a0f92c8d6fe69cdaf263546283712250f3b2f072297c8eeb0c2cb128a4bd3b157b99bc904aae391ed1c52ddc070fceb9730191e3da62f07f1aa36b9d566ecd6b5381b0a822bd435c007a4bc77a1e6897d5ee9a5eac240342db41eff79ca411eaf05c0fbf413b42fe452bb70925c57952df2012cae9e74f9d17af441cbe8790fa1ad0e2bced4fbc6b6980778c502d88525a400111d7d65bf6959472f6043ed104988530876f213b0b34209536437e1dfe0df5701abe16afb61e99826bb5f25c6e332501080fda46466db418f145dfc0c0c2e865cde8d2d3467a667b651bcabaa2b3555e2714a26684dee309a49f78faff3fc1eb129c30500c71a265cb7cef7206e0bf4dccc8a0212d4d566f379a7252244d2707d12158ac72caf5488521880c04810bd9df71fd02a983b552917cf55195b4c2c3f2c07372df4f092d7a52be110360e1074858e08e6048a7bb9c8d287dbb3c3b265dc1a927bbc6831b9457b9086b43e7e1efc5724fbb63d4b03f173461fead3a38fb6c21556df80e1bba77a079a3f3c86ebcffdbcc209ee53c62604182c7ce6602b20804835fad5034d4fb9bec15382ab69850428df8bf8264edb1766a7c68688b6bdf793af8adf16ecb2bd4ea28d9b6c269fecf1bac8f5232c952fba08743e7dc0f37a901a0bf9ad1854f70fa44a013991952acfda2d6feaddc8bf9ac4e278cfb8459bc60bfadf366ebaf9aa5d153e9438e94febb445c2ddd0fa498173bdcfff2b48dd9dfbd3da334e593787237bbe2c9b20cf0def9e888cb4be4ff67b429e7c9851b2807033853435c4232e9dfa0a4326b02a7ed2844b77e7695572723d8ed86e14ad25ff765aa9c3605f1922fcad786a3bd4e703b3661fe79fdc7dcefafb833af63ff70028e51465d24ddf6900024ce41860bef99872e543d6478108077f1d7d7aed6c08d79ef49b7e71d9c6b0c33112da506f3aaffc887a914914a3ef73f7b407380d9feef2dae2e95da0c26b4ab574f626903d665d49fa4543b1391f94b26d4fa2543beb8b37ca9783bcf2bc134a88f0459a88583fda5186b9ef2e143bce07a8aeb84369c28bb0fd6696ce0fa780dd5d500691f1fe8a0eca2e16f969f3bb11a6dfd26cd6334744af88b6baf291c8d091b86ce0c02409808412d1218d370a29de981b1ead480ae4126ca55ff14cb31131f135fb4f4ab965490a964cfa702bae947a0abf7b9b471dca84eb137842b00db29cda580bcd1a0b8d67eec24e59a02e7cf819e5bd878c503c53e07c141e4024981df27d6245cc11c5dd3327d53df807fc84d117ef972b39ec6c2e004139f3f466e6f6d1ff2f1fe686bd1bf43bb7a3e9a7c2b8dc8e64d4295f304c268c204c0b839a600c4ef3a6184499f1adfe312441e314499a166af7bd09429385515ba8c892bab672be3dff1583f67cbb7935098f530bfbd7140416438f15cc733d66aab9f8aa72abe9688b6cc944e5b3595dc4405c1c581a03daa08b352c3f96acbbb26e49ec1d2e4cfdcb9c9927e51c0b05d50382b7e6e9625926c2afe865562bd56043eb122e604588301357f1f35bfab7bc274b8110bbbc0a39a863ece638473e24d9709f1ee88f72696faa458909c4fdfa4a3aea7e078d58399ad5ac3ac36b70809d6ef5773d7756d81fe4952e9be6431fdac566776332eda71899a8cb7e14f7041e3ab7cfc5999ffc92bb635c88db218d677f87a545591512b0145520cee04c1fda6858711762d8576673228b571003d36ecdc070347c78fcdfca53c34c39ea34307c5a03a96f7a6919c065339d2174825f349370970983d62640073b6cae5c01deeb2f10021c10b21b17bdfdb18c0e0ac748932f037cb03ef209f1e1a6aa1bd9243959fea7f515b2e8ed7f424abc1add157e21f3f062a887e18ca66e90a9945aaeeb6d581186f3fc11b62b99bf4e2599e849d267f447b751634c973aa1496fe6ed75db94b55e55fe0406657c859ed891be3017137588771c05ce36ce5ef6090e5e6d273d29c7a6296e529f63343a8e74f5d5825efac1625837861792303bfa418045c2c9e56f5f1e8f2f4bc651bdd1b42d8e86d30a7f03967708bc4eab87be20d17450c35ec1fb3e04f0fd4e54752cdfc3dfb6f80b1dc54742ca972c5765bf1ce08d33a21c4c05185e4c2643b31d0a48675d7536a32a31eb39403ae39a5287a63c04fdfea48a072df995595f03f1e48e767c44273920d412b91e19ed0adaa24d226012216df86bff7570f8e8bdb066227fa0c64253ae262e4098a6a11f6a9982521302c2ff03bdfd4043a78946c4e9a4f18f6e00790ea2ce7e6473b84e8ed7d649b2524bde5887b7e8a1c7a935abf9765a8c9dea1fded443b0e6039b2ec3d7c957b29334625333bfecffdbd110c21027491ce887ceab255e86b1d8b2268633dc2a98281541804c65bbd276896ec3c8281bd4d041fbd0205f7e3c55a5cc62567f20c78356e26c5c59d3be1a4a861d7c096138d7a12e0a5fc6f60a2cde96c4ca22e8e55781db73cdfcd307299d1d3bc63ba7bd813deb963e358c9fa0d50c4a0987d165f71e73332bdf286236e98aab114f6dd74f60ab20462bb0616411934e8eee78de0495702700714243c4c854f7f7b5121aa4d1e314f209ffe3e92cd26ee4f74d91e27f28cbb643bf2055a2128ee3fd330c23da3a00dc60c9bba28f30178612de36234423ade7c70d8c5c1f39ec50984f004f0206606fb0ac4d12a132d4fcc1993f397ce729ff8babec6a8841ace806d4ab88e1deb0268a261ccc0b6123b3940d21b791e9dc880228c4e385a02cf4d9526253e2297c9b5db5bf31463180350ab862002bb241fbbaf2aa698ffbf9117046d9429b8d22289be988e4ba2a771b861984b592c6d6d52698016f2fbbadc87c3054d776604d78c5101e590fb274b1a6af1e4a7f9e279ec5877e56bd45a7745d9d8984fb595ae679e7e4009f7005a1dcf773313abea0d3285f55d2d14062cf84ecdbdd92ced70c2adf8e6de1d9a666a97147fc6c9ecefccf7e3c4604228c1482bcb033f5374e54484552038f55d37a8caaf12e8db52e861b62a632be727ffdf77bcb4a6b293d4962d7f363f08b29480713032a06983c099cbb082b78a6bae623a871638d2b00660b05c701addff469a937e2816fce73f1e3d5f692cb35c967c7c14721d3a35444913d615f2fdad169d38833c731be62d95141e5fb1eb627ed3464b0f7d728854f960d46feeee25c9326826b5df4fe851a959d4ad6eb8e5300f9f14377f0313fe199f3dc4373ace2a002c4fdd811f557400136b9c8ca54d72d99057304b743c0c51d6fb5df4680f00b08be6fa8213955e424aca723337020dd920fc430a4d6d44480ff5824e015212e98ed45509b310d71806d9778af86cc9b657ebb8e4170d70a751137b6d8cfe29543cff363f882fa72a5080f5ba6ff36d183d0cd70058845615a53d8f78917b0d989d50e44c1958951f2fa732ea2400c3a9db47e7879b39bf3b115b07979930865eb9afa957eef46b9fac367743a0f9910e388532a0659672c0a0552bf42b875c4e9905cb88906cef54ce150ced6a48a0f25cacfe744002394e571343b4cfe7560f443893088626eae39d2d390f0a53b8fb50a6942bb3e5da8a407e97020db83e4ac23249ff588c23f7216446d20984a0d11b593cec47a81e1e627c6f046e63daa61cd935958f05643663a37a5dee42221dc5af3edf82b1cdb2c5f612e2794ef3cc59179ff0b2f873486ad31fd941f40487578fe12def69afed72d5c9c5b7e2506381d3ce3b49cf19d63eda7b6d8b040fb6d8e06efe13388b7870ffdcd5ae87bb149df50b9cddf11e88e8a2d64252d90b53508c2d7978872bfac75e9339e8a6fa87b3649e3bf5c64a056f117a7f21dbc005c87a66c7a5bc551c80d9351aeda5d663ce0acf4119b665f6db11ae4d7d72f6754692610f2241d286a2570c9f43ee1751f3cee6d6d12936023589b9d4f006744bd5bc657a787c6adf35c25ef174e785f82c982a21a68786d28460e43b01ff032e7ae0bc302ed7e4d04201743708fae7018050e44b1f381d0dd08077ab39c56bc63fe6ac58ccb80a00cffc969a858e0713f8df5c7bc5a4c35c21d0ba4b1ec074bc2bb67e1bda89a218e79b0c42750aabd79a2bdada1e3440678038f4443a59e5b846397aa0e1b175bf8fc61d565fd89cf4701da690b44e5bd5f4a06fbd15f688619955e71069984b9ed16512fecc5fa213829d07c40f5cdd4f86f071df350123602bf30f92f8a6ec5cb4603364430784dcd694479fb5c48f7c3d1043d124e07f5c05fc384f18431fa2409fc8ad4c380cf676e8ac4830f0360521e92dbc6afd64fe2d56ab6e50d7ad187e0a19046f5a000a6a837fe708469d913a6176c88dbe9aeeadebb01828ca5f65758a6e8f35d529bfb84b07a6c3308bc99161681c178de8d38da18e752984fb322e050e7625124fbe6a2a8eabeb14c7542dd249e190d11756d3628facda6e4926af6442e2c8773aaf88075a1e075c1adc169a623e7ef1ef1e8915f9e6c4ee13ea029052fba46db13818c9b428a06f4c0655a3fb5c6b5738d4b6a2154a6d6d1f252f7086e8435d7e04245ae4f13db5257cf1d35c63de6aba1f63f02b015f5436803ceb25d22dad67b9b3a132a066966de6f214cc7a60923da897e98332220920a333eb79e0e8c73500ce86e65da47aebeb614d95c9783788165a7464063cf6a5351b57c83bfe11b0807cf147527dc968344566fd79aec16412b47918a537818ddffd165b0af7f59fe2c5ca9ea47bebac69a6464db28a999944aee1e5369b149f48e0127a7659d9cbcdb1f9337e26497f318cd7cc9b9525ef534f9214e1ee16a418cc326da7ae27fdea49674e060549a9340000c45d56ce2ee8a075ecd0baef65f9ca5e7bc47d46fbe194fa3764a054f11b09a97b1f55fc1daaa772b7288606a791e07eedf54f9e8d599a9b35c17fd3208eb0ba3a0a1b1885426e72bb14dbc53588197b0b64ab977dfa643392452b2cfe34fc1c49462f882e57fd5b42ba4093d6877a3b1d361999926df9a894172bc953b6f5b5f0fa19b6e0925a1792423dd851360da76b96210c935a62e484600710e7bba36e774f6208639b8f8cf3d55afd6f3cd9a73daa4c584968a5cdaa47486b82ec0f30256c91e87e19a4a4af9b2068f842e624da9a21e57c40cc4d4df57541ebf140e144792ebdfbb49f450dbb1682b4ef3d048b8f291cf38ade4bb69116f9eb713e6a1aa0c2efa0158a59545dc5b36aece53198b1ea6378ede4ae2e44b3fd4a1512b4f007d4e636e46cc7cdabb364e4e0e6914927ee23d111e560fb36d5b4d084c3a60dd6ec0984c84e77c0ca6afbe874490ee51abdc5c79fe948658e038644665927bb3692c2546a375174e572e23f50158fb6b1ddaf223ff94eb675c6db7065dd21404f4f796c722f3d3322517fb11b52fb0215d84baa981b5a3412a51b1a27567be548aa9495873f2343a9913c057d083c126d360027535954298e28ae0b54cc1df2492c7c97516debeda3b980052040392ee27d356017bb24db10d7fd0b9547efaf7c5b993a7ac37d793852b277a902da9e9c37541e8d48b393c13b6ee292d0d86307c25346a749c12f8fe33c24c35407a9c2ebc4295d08e798c8db6a57f26ec35812e613828206a057d1f485d41440a8987c22ed492e03a9344e3f5a335d2a95d4c6513fb7b3020038250ef54e44cda5b3f4633746a842e2ad7bf0a43e7d0b37204a8a41ade245cb1bb4b8f45cfc03e6424f360ae774cc784c7675b240f7199184c7197f2cb6d8e748a67aeac4e4eb548db823cef53aa955596856ea01765c8b47658763fcd7c23e0722dc3f4fa38cd5dc55b3eb39a1e25f1c781cb648a0dd0eb34b5a53e4ee0bb6a050675bc5e2ef52764e6dc978527e80dccf4e7ddf1da3000ea21db9aea3bc395a59a2a7ee481ab4a4ccdad07df5859fe39474a68c96b64ba19155fc209ddbae7f651589927e17e1aef780690f3100a377f0179b18b31fd5b4418c84038573fc559b496a782beec3dcf6e9faf5aef676e10bbec34b1be5888fda49b91e02890d2524c5b369f8a54175f29dedf8156fff690cf186ec77104a798315033bbd27c8362811ca2d8c4642c31222a8e00e7326561c384cc56ea905bc6477ca205d5415d2ceb6198c91d8b00c7f029575400bd3f2621c7d9ca9b6a09ea6f776968b19dc3f3e3b064eac64729960c51a7e543eee830724813acf420368711d6f65ef7d05c6a128fb3a87f170b2def1a1c5f1155f5232d9c16789521661ec721d55308879af1f065f19ca87929f21109110c0960ea70cc1a3ea7ff0c1d3407de92ef7421e42df5c9ab31d2ec0a750a9522869cbe4cabd66908d5823ec0494c639b7ebb4ddc70ab214d026efe21393454cd593bcc7026c50f116bdf47f3d11d676b9b5e59f85c791343890d1e02b146be7dee670a09841052c4e556962c6df3409fdfcdd4ac53f7f64b201dda237f8a38b0d0cef58d4650fabfdc98d7de72568584869a5c7cf99060c08211a107f6a76a028aa41d5fe00f6d4ebc065b8e80cfbcd65a444ffebfeae92009a90134b906a8ef86b6f015e394011dfe3fbfc10bb74cf1a54c2d96196fe5f63114791e29209bd45f47fc33c3977c9a3da562fa95a5bc53121283c78887edbf83148738d99db95d7f07c02df282263fd4c7e3bf913391970b57d1279fdb66e899f9aa294cd677f75056ba8902dca49b6e17c06490c9532a0b5c942ac1c2f81dc0645053f5535e1e9db569c9770f6e29642577ae06df77889cc14b4590e707abb0c5283d559cd24f91b44c63c1a2e966417177e085fe753f2a06750c8fa01c3ec59c806a003b8b16e6d3e0ec753fbcdea07c5f9070aee2ba4d9c9fe41096bc23796af75e6797def0f784b5c7f42e3efeebb67d526959368682043a60b6335e1666b0fb7f0e3a445a6e57398ad10706439db08f9ad285f72041ddc306f2fe7873f7ff1b6066ab51df95bbeaa99e42a95930ead4de4edd9b240779c84b5960a1b8c7b5c59703639ded283357a8be798e8c3fc60b91209898ee6d68b8a25bf250713065988756eb8eff705dff1cb4142c6934e282581a7f76fbce4b22b06d2c0b29dc9ef2b5e3ab8ba3088c5f5a019b098c9ac0e7977edacbe8c46184da2f96384f16c262b73c3c3a647b4ed6f54976bc42ebd189d3d032fe11ca7c5d93f5a97e5d996066efc31601b023361482de5fab48a2a50791b12084234adc2b8261de33d1bef98dd41ac18812baa29667428e5cea59abef65842c0479e0016d09f6bd0f48020e3608a5b714188c44bb3708bb57c46b669fa3ebade5a2149c90bf16ce572d0d1efe01e66f5c1e227d1166b33f1253726596e13a3eae28430e4506647aa20d3a9c54346f62c6a007bc276ab4b21303e91963b20246c47905c6e864425a76450516c734a339da4ac6927bd79f9cd0724a02947ad66edf00d766f97d42d65a71171ec567244d0d8ac9807d21d657e11b0fa197c0291f547c325f06a5e886b52dcb04ed605514d6cc9b26a9ddfb9bbb6ac476ec166cc0ab37912f7e72a5d41cb7ab699da4d849dcacb5c5906071a0d5ede3130fd233fb69cf9e58ff67fd5707cb32cd549900347587a40daf5dcb2fb71105e681a7f13806a0945bd7fa7187fcb4eba0b0d17f6d3809e06f852a7a90d5708761effc370f08672da8b6ae84df6221507420d2a86c9a9fe56b805b027cb798f225894367d8f56fb4d009f8b9c5ee8cebc823111dab23a63d624f63f53be3d6c0a20c12263e4436e462407d72e3d854280d361131c169d9531430e9c556d0c69d57d6ecd4978b6926c0088162b1e6139fc3e8579717b395c0d1d330f56604f4c2b78838058d1152e689b0b8ebb86e47bd8ca858c036b768013bb4edf7e206cdeb617e883b879c90be1fe798904ff76cfbb804991fa6dbcc8ea244855f434cde71b64861e90f83bf1802fb84d31107ffe4d66bad37e0a73fd3a6007b9e124d82f0567439908d4d2a7ed38b222684267d13787be99b5c803e7ad7875536c79f77d1a27083b4a97f5f7cf204d52d11b960d21e83e2aca32d54ee973796abeba919a02acbe4e7bc80ea7cff073249625747db29323cfe3cd4ffa9659fa47fe6f0d4f66fe4b18c6f0848094af0bdfdce86ae8938f53d02923dab35d33e2335521d562ee2699e25196bf4ac765fdccceebde156ce4b875c3bbdf40e6081874eb57509b412b8ef3444227cd0f1b313391b639cde49b3906d91dc46ad8e08452e799e6c408151495c87d24d015d88e5c50d1e4d8a3babdca95d2f3f9dbc30e17716fffa3eaec120e05cd1e1d80a4fe8e31c545fe524c2e0a1d61d2b599ba9e09b362030290b96fa722bd7d7af98769125c18c6079956730e9952cb65b7cc1c72d2f95aa7a18415a847d2a9b0288ab531fa55ceba1fe2741e322e44d3e002 MD = 45ae4c1aa7ab5c5eb3ef6ed9bcd706fcfebf72bdb5f8f327e1f0bc02 ring-0.16.9/third_party/NIST/SHAVS/SHA224Monte.rsp000064400000000000000000000174071352416253600173420ustar0000000000000000# CAVS 11.1 # "SHA-224 Monte" information for "sha_values" # SHA-224 tests are configured for BYTE oriented implementations # Generated on Wed May 11 17:26:02 2011 [L = 28] Seed = ed2b70d575d9d0b4196ae84a03eed940057ea89cdd729b95b7d4e6a5 COUNT = 0 MD = cd94d7da13c030208b2d0d78fcfe9ea22fa8906df66aa9a1f42afa70 COUNT = 1 MD = 555846e884633639565d5e0c01dd93ba58edb01ee18e68ccca28f7b8 COUNT = 2 MD = 44d5f4a179b33231f24cc209ed2542ddb931391f2a2d604f80ed460b COUNT = 3 MD = 18678e3c151f05f92a89fc5b2ec56bfc6fafa66d73ffc1937fcab4d0 COUNT = 4 MD = b285f829b0499ff45f8454eda2d4e0997b3f438c2728f1a25cfbb05a COUNT = 5 MD = 206d442c6605be0e675b0efc76243c2f18f2260a93375fb36e469631 COUNT = 6 MD = 1cd8ea34d8483b6a513c52a74e416bac2f322bbaeee02c6b0b05a781 COUNT = 7 MD = 00cee48001fe8442ef39c3433ed05473179f34205d337940d4bfd3cd COUNT = 8 MD = ead3ad27819401912bc9abfdb50037672a3aed0e94fbaa1cc0560621 COUNT = 9 MD = 8f4dd5aef9cea829d8802ffcced2e8ed6b48ac23bbfbb0fae2fad0fd COUNT = 10 MD = 03aeb918feab459e39af29ff3aaf406088bf06d793338bbd563641a2 COUNT = 11 MD = de80c312b153fbd7241c8bc432d1ed253d26dcc6f458b953ac2d9259 COUNT = 12 MD = 3eb8d347cc2565ddd71f7fc21cff7eb3a2cf8e85c5e1d4c751f69f26 COUNT = 13 MD = dbfd7033a4f884ecf7053f07b4c51f3efb1c09084cc7bbe667196a3e COUNT = 14 MD = 5323fc60310fe29900eb7a500f29897001c37945c5f8849674725553 COUNT = 15 MD = c3d9416549bebebf679c0122a9c5bb86c0b514c6a4e9eda1e9782040 COUNT = 16 MD = 749fc9c8c21957ddcaf5eff69c297284d722c79be1fc6c910495a586 COUNT = 17 MD = aa307d91c4037372ff0ca60eb17ec8f1faba862601b95754783ea808 COUNT = 18 MD = 071e361909c38791e941d995b0b25a3294bdf39456cc012806ada3c5 COUNT = 19 MD = 18751a765f3b06fc2c9a1888d4bb78b2d2226799a54dba72b5429f25 COUNT = 20 MD = 54b39c96f6377e3fc2ae0ba4ec89049a6c04808da3fa0415c9053ce4 COUNT = 21 MD = 58c1eda7eab2fc4046ae153ee95de5df036dbba25b9bb5c5428ea882 COUNT = 22 MD = 3a02eaf55d04b6052b7d79b96d1e316f90f5dbbb3217dbfaea55faef COUNT = 23 MD = c8b5eac17f450458c60c075a8f75a24a1dbc58247fcd0ccfaf03e446 COUNT = 24 MD = 53084cacfebbc4d1ff2db614b42714c18ddde36c6b7c2fbc3b1a8706 COUNT = 25 MD = 528b867aa481d42fc4931a47d24c3c905aaafa8f6dd5820c67d3579c COUNT = 26 MD = f0a3cd3f53eb72df80ab67d264a973b6bb2f58bde8f636d9100e8864 COUNT = 27 MD = 7912f20299d803ba917f408a5a59822d147bcd1008ad5c7b678e2390 COUNT = 28 MD = 6f0e49505c15669302133d66e45d192e0c6ad02fc5b9aa128aa5517a COUNT = 29 MD = d06aed0f18e6c377174fd00cc74a92020b3df218c376eac0501a094a COUNT = 30 MD = cb1bbf7cc5dad591d32534c570e5bca93b8952832779dd6e0ccdc91c COUNT = 31 MD = 4775bc11834930118654a3e66e5b7f51871d6f5068f4305dc2845574 COUNT = 32 MD = ce3b5703ed9f946ec4af62fade6e69c2751474ab8da570064ecd2ef6 COUNT = 33 MD = 49a9e1aa84700874ac27eee43f193df69ed6718b131c4854f729a32e COUNT = 34 MD = d2c6592251a27cae7d819ac7b476c8a2ff608e57b018f79e0cf19b87 COUNT = 35 MD = a861be4fe188858b913aad179ba575cec91bed54c1ca27608daa27dc COUNT = 36 MD = bf7975e63aa7f1bef84e7446f1c4a00a75c13285fd7c4a7a8318b1cf COUNT = 37 MD = 5d125b14e966c9e431bdc5592d3e6305fae678dc5d6dd064fa1345f9 COUNT = 38 MD = 8c0fbb471404371145dbb66e8b1c6fc428e6dcfa263e3f5ddb47b30d COUNT = 39 MD = 7148b69b04457296fca18e6f7b7f2145d9af9e6bc8f48b8571af0e53 COUNT = 40 MD = 0bd47a04fc42fb3d9643496e5b0719c22262f741e862adfcef91d61c COUNT = 41 MD = 3dbb14133351e5d4bc885d9594c07f7f0f99d4a7c745eff3e7aadc2c COUNT = 42 MD = 94f6ba7f94ba9903f7e9bde9b131353fce560c7de7159458f1a39cfa COUNT = 43 MD = 65fc03fabbf57904f572358c20f004aa16e0b5ae6530fa961ea10b9d COUNT = 44 MD = e46532e3e4bd0a0cb389abfba5d679e916a7c193324f1bac498ee1ee COUNT = 45 MD = 131d096c684345311cff958706eded139676a74d97a1beb861998485 COUNT = 46 MD = fe3e03637088ac8ee2e035bfc1e7f4e944304663c832c26089e85f9f COUNT = 47 MD = d570c2b7040fc721b41f2d213f6ee87ac1e37f2b86526cf46c699aa7 COUNT = 48 MD = 82ede72ad163b914be7c22c085cd99438b6d5557ddd3b752f0a9fb7b COUNT = 49 MD = 343c21a0cbde3cccdbbd66eee32c50f5a54b0ac267ec3f41ec07a67f COUNT = 50 MD = 94ad254f3b4a76f6140d0dd3775bd75eb3c081085fcb76c91b4cca92 COUNT = 51 MD = 65fa84f358bc32caaff799129bc2cad883636826415703a2dd1a3cbe COUNT = 52 MD = 1c2f47c532856198d03dd85275357dce085c8f6c5a871aac4ff4ea28 COUNT = 53 MD = 1d51c1019131b41a076cc603f4a8e56b2f4ee70dba326af30d926827 COUNT = 54 MD = 9789daba3a8e9702d2d0b319878f88b08ebc5876dd5dff6414bf1922 COUNT = 55 MD = 1968789785f1ef61f849bcb29fbc1491c006021f729718e72f29b80d COUNT = 56 MD = 62dca9550461f8a85e1abca4192a8a55a6e6663ebcda9ba6fb95f10c COUNT = 57 MD = ee190aa251c1a2ae0a376b4c6b6ab3bb09f743fa01eafaab68d170e3 COUNT = 58 MD = 02273be94aaaf4a1d22496821e8abda8c418d3a4c278947c27d6c912 COUNT = 59 MD = 3998a213e392978a38016545a59bd435180da66d2b3da373088f406a COUNT = 60 MD = 7308f2145d345bdb01c38a9993a0ec81ed5164ed0c6caabfa3b23fea COUNT = 61 MD = 3ccde61f4734978995b7489bad8c1e6bafe03f7c3886e9b4ef0f1aa0 COUNT = 62 MD = cca9745f59f3ae2bbb8d65d31c171aa33960c8c6fa4689bb7e6d2152 COUNT = 63 MD = c976de72db46c1a254293af6093c563ce43232077c249584c016ff6f COUNT = 64 MD = f1448af3cfe317aff1470f0a3de7bf533d77dc7f55e8dd790fd57727 COUNT = 65 MD = d4be0ccfe4913851c9636ed036c625524e72891c5c0627aae50288ce COUNT = 66 MD = 6bd99c53693d4e2467ba6094710a6d2f48cc2ae907c4ae28604586a1 COUNT = 67 MD = 2eb4fa0872ede2a378386e40002cb00b4d1c2fca3413b944ed210915 COUNT = 68 MD = 48b624151c9d3a1cc8e9d6665d42d4e640ac91abcd3556a31ff0250c COUNT = 69 MD = 31159840b7cb040d819ebee1ed0e52d09f5805be523cccc22eeacba9 COUNT = 70 MD = f9a67791dcae0aea00f77f8536ddba439e9fcf7e5b1ed827f83818a8 COUNT = 71 MD = a5913105fba645ba0df942da96d271a1d5efb923a4f61eb463450ea9 COUNT = 72 MD = 6ece291f81eceaa9eb5a5e228c9924f165b8b10e2cf0e143dd5fe601 COUNT = 73 MD = e07ab143f09eb8ad0d381b888adb22229c2e2a8b067e0fd012ef67a7 COUNT = 74 MD = 88a33980be5bc911c1713d5c2bd2e5ecca7fc87879501aefa9722c89 COUNT = 75 MD = a709d188da8ee187d91bd17069f785ebb379df013d78844a45b2bfe5 COUNT = 76 MD = 306fa7bd696b3e9841f84d1c861712acba0febddd7a952499b96579e COUNT = 77 MD = 61341dee2e2869112bba2e1077fb409375f755dcafc1457bf49e0e8e COUNT = 78 MD = 0959a6e3b727c6213119b9e8411132b5819eb848bec6ebda0b75578a COUNT = 79 MD = 11cef0312aaedb9d0b26de64656406c8f4c358e6d3db459d364481de COUNT = 80 MD = 5de71b191eec70e591c22ebe3a5d2973aa3172f1c272e926cc0d4873 COUNT = 81 MD = ab218bf4268aec9b41dd2db80622e4c0319cc0de12a60e06d80414ea COUNT = 82 MD = 5c83874afe6da0443abfbbbf8ceef38f9400b63593ee7a29d467b4f5 COUNT = 83 MD = ba0fd01f699a0d00a0dff4c63f6ad19e9530a7ad11fec504e6481816 COUNT = 84 MD = 835ec2c57424baaeed09a7c0c0b6e8bf9d1cec83de4c719846c990fb COUNT = 85 MD = 64d95f2c92343d8fca6f6914fba8814478850b5d4c2eb227f4ae6fa1 COUNT = 86 MD = f8dd5355827ac4bd040fc05ed6cb2914d013f126487a6d5f2c22f767 COUNT = 87 MD = be5bbf68d6b99749edefa6b113638ca5cf5fddfd8fcd4d719aeb54b5 COUNT = 88 MD = 3434d03e98d0af69281e7a7ff8301369c5bc6166cd29b83397ad3fd7 COUNT = 89 MD = 747b2a7cfb8c4fef7de0a08499f8b19f37e9161b855a84bd50ef84c5 COUNT = 90 MD = c1c1fa2bbb10c5672b040ed0c33d4d93e0fd210d1373fc7fd2312c0c COUNT = 91 MD = 671f67380b7676ee7c9fbfe71f3807e3575745ec3ae3128420a141fd COUNT = 92 MD = e88394adf710b9764a448abc6d62928b0268c6b119306f3c93d7b6d2 COUNT = 93 MD = 711cc90bfdeed121bd5a8629a9cba6df7bf8df89184ec64ee918cc67 COUNT = 94 MD = 3f63432484eaa1f389d27947a84e256618f9bc81015993cac386887a COUNT = 95 MD = e00e0bf2a32227461230a065bbd2eeb5364277e83a850c53ef5c92e9 COUNT = 96 MD = 1977311cea23a681c83dc58a6863e362bf6c02e30f4c9c4c8439ab4e COUNT = 97 MD = 2853a64f56c6282de53e30eba9418dd62eccb8c9a662c313b4768265 COUNT = 98 MD = ca9d0a2eeb484b9809c3850f166362d893f951f5e93cc7a3c72522e0 COUNT = 99 MD = 27033d2d89329ba9d2a39c0292552a5f1f945c115d5abf2064e93754 ring-0.16.9/third_party/NIST/SHAVS/SHA224ShortMsg.rsp000064400000000000000000000230641352416253600200220ustar0000000000000000# CAVS 11.0 # "SHA-224 ShortMsg" information # SHA-224 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:36 2011 [L = 28] Len = 0 Msg = 00 MD = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f Len = 8 Msg = 84 MD = 3cd36921df5d6963e73739cf4d20211e2d8877c19cff087ade9d0e3a Len = 16 Msg = 5c7b MD = daff9bce685eb831f97fc1225b03c275a6c112e2d6e76f5faf7a36e6 Len = 24 Msg = 51ca3d MD = 2c8959023515476e38388abb43599a29876b4b33d56adc06032de3a2 Len = 32 Msg = 6084347e MD = ae57c0a6d49739ba338adfa53bdae063e5c09122b77604780a8eeaa3 Len = 40 Msg = 493e14623c MD = 7f631f295e024e74552083245ca8f988a3fb65680ae97c3040d2e65c Len = 48 Msg = d729d8cd1631 MD = 342e8e6b23c1c6a54910631f098e08e836259c57e49c1b1d023d166d Len = 56 Msg = cbf2061e10faa5 MD = 3aa702b1b66dc57d7aec3ccdbdfbd88592d7520f843ba5d0fa481168 Len = 64 Msg = 5f77b3664823c33e MD = bdf21ff325f754157ccf417f4855360a72e8fd117d28c8fe7da3ea38 Len = 72 Msg = 10713b894de4a734c0 MD = 03842600c86f5cd60c3a2147a067cb962a05303c3488b05cb45327bd Len = 80 Msg = 006470d57dad9893dc03 MD = c90026cda5ad24115059c62ae9add57793ade445d4742273288bbce7 Len = 88 Msg = 6f29ca274190400720bba2 MD = ac53157947aa4b2a19089182382a4363d182dd8e4ca79cd8571390be Len = 96 Msg = 17e8556176fcca2addbdde29 MD = cc6ad0488db0222066f740557b5758a19b30372b302332295d8c3aff Len = 104 Msg = dbf163601db9a122a4026824de MD = 9849845f4e47e1ece9a1c1e01a0d896ffea61c6c8894a75a11ce5f49 Len = 112 Msg = 5e1ef2ad86ceaf5439fe87d2ec9b MD = 223c5d5d4a0116b32cea044f9af0fe44babea1c5ab201502591bcd5f Len = 120 Msg = 65f3b9866fb8002b53cfaf806f702f MD = b1e0806a218d593821fde8e9eacc44ab5287c32209a94f011ab66b75 Len = 128 Msg = b776708ffb91b3515ac46598ab9fa796 MD = 427311b1d7ab2488791c4deeb4251d783fe5f9806bfdfb5188c5443d Len = 136 Msg = a4bc10b1a62c96d459fbaf3a5aa3face73 MD = d7e6634723ac25cb1879bdb1508da05313530419013fe255967a39e1 Len = 144 Msg = 9e8f3c6645c1749b55c50d2018ce40dc2427 MD = 2f5a583bf588c8988a572d128a95bea5ef1b66780a7d4be9c29efc31 Len = 152 Msg = 2db6d207c0b7d9117f24d78ee59abf2f316978 MD = 35681fce28307cae19522c23cbd4a77969347f7d8ee4a3088ba90ada Len = 160 Msg = 3df5e7f399f6dd61a12a9d4e9464fc4997c1f37b MD = a3e68076e30751085a843a6cbfbf0f3dee63d9c4219c914372e50b28 Len = 168 Msg = 65781d018f27ca0c72a9fa9ab4648ed369646dd3ce MD = d15ef0d872d02da6427b8d0349dea2f204e67133b7365b4b150efc3c Len = 176 Msg = af48eeddd93fee69d1bd7de428a63986011d10945eaf MD = b89d428ee42e397cf11029ecbb27baddd036c8938f51c8ab56b875ac Len = 184 Msg = df2bf0d5f9c994ac69d78baa0d512eceb74d8a047531c1 MD = db8e1ce68c8c6b84d6db755c2b8bf54f3c4b081a881efcddaf303294 Len = 192 Msg = 48d2f20955ea2d13433c20bc0404eb2e6ad79ed28f7cb4c0 MD = 3617cc3179f8b59adce181eebeed5e2763f62650949224a67e53694b Len = 200 Msg = 218f74a42d3a47ef3b806601fba024b078cbff4e4b85772e0e MD = b5f40b95dcc363b97e9d00b67c5d7c37f17ab563297d2d67a4df20c9 Len = 208 Msg = ef55b1e797000b04fcdb9b3021b09327e3b4e269d20cabdf418f MD = 827b223d51240c2e3271c534c19c5637b6fe10083e85bcf06761ef21 Len = 216 Msg = 96df4387dc2c40297043bea36483f65e4eb1e07e93359cb7e68610 MD = 98e430a63fcdedafc9419010f7f59a4d816a45b4f973beb62530ff8c Len = 224 Msg = 3ec0aa8d30d5ed825b77dc7095f421b1e608158797a377ff8bed641b MD = 3108321eb7ff857f6aae69101b937f32a51ea279a6c14ba5232ac8c1 Len = 232 Msg = 8b0239712039f077ce323b35f4e306787b9b35270096e57735cff45d84 MD = a5c740d3ce46bb2e0a048488f2b0605c6d0ca0ea2f382d043d13db97 Len = 240 Msg = 044be30167a9758c46c727921dc4eb4e0dcb965623423e6fdd44e7a4ea52 MD = 6eb78313c743ea8769d8340f284dda6ded64a1db64392f21abb82c5c Len = 248 Msg = 57f6118bacce47ecc31ce8b0c083d3c9219e0dbe9e4fbea154537c41231acc MD = 0dbb53c866d63af44c222c76c825df0e379dcedfb958db03b6fd29a5 Len = 256 Msg = fe1f0fb02c9011f4c8c5905934ed15136771737ce31c5859e67f235fe594f5f6 MD = bbeaacc632c2a3db2a9b47f157ab54aa27776c6e74cf0bcaa91b06d5 Len = 264 Msg = 14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db3 MD = 178272c7d7cc71b15074c27e3b7997d4a3ba99626986a1a16cf30030 Len = 272 Msg = ff6c49712f044f4063c14125c0cdfba18ed8b7138453768a45dfa2d82a05f1e84227 MD = 403284c888a7280bc8bfc25f0c34182cd378306a21a1404d4e1c40cf Len = 280 Msg = f900bd7e0117247f97c8fc7a665c76a35f571c3366571d6c4a3ee5d7fb93f1d1f726e2 MD = 48235b9820d66d8885faabf6a9ede63ba2a21b6177e987a33242373e Len = 288 Msg = 42d38188ac49440cfefb77db975e083e6b22348c4c67f0f8692e88ad140d861dc828d595 MD = 615344f890e5bcf71b5efe39de1fc942ba1fe30dd9e9146adb6a41bf Len = 296 Msg = 74fdd7d958b8ae7c2c3c5cff4266dfb2b3b842c9f59ecbbcaff575edcbcda08ccd6e08b764 MD = 66d7d6c54fc7775a0ba845ba3e11719fa535b9289f20b098c5f7a342 Len = 304 Msg = 934416dd0581e22f2bfbece7bb64afe820451fa21342df7e6f9fb37c4103381a1f7cd379bcc4 MD = fae8f1aa22def4dbaa814c5b0babdec43394951792c937050d2963a6 Len = 312 Msg = 102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb MD = 8f34812d57a16ef8a51ad987660c5f8623e0fa9d89846e28d46d14d9 Len = 320 Msg = 79bc8fb60f85d15a2386566e3e7314df284533085add1c7bb6ead3ff760c86d5633a66404761b544 MD = 65c54014cfa30f0bc27d1c6efa96ae8481f4c2505bff272956eab0df Len = 328 Msg = db3121ea71294983b185207a9d8de3e484a66c0431bf07c962eb82977c4f834b7c3f1e7931a4a7f7a9 MD = 9316d2f021c2913d63a7e66924c87c161c3cfde0ea7ba07f54772862 Len = 336 Msg = 0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7 MD = 31989e7a62a5132a5070d77250d8904bb82d457dc63469d06b50185e Len = 344 Msg = 487fd2e5b694b7071d3789a258a51e8604dc0d3e8f5d62f39131968e602abe1ddf6b0278962a512408b553 MD = e798683438284626d710877d9eea3a0e02f349fc43acb7f9f8f9e81c Len = 352 Msg = 11183bdebfef58e4da5b1cb73be0d30b20da304d8659d921da2e270fd14626799537e4d12119e809ee97004a MD = 96870657d6cb668be3995aa8bd31df77840d1d1915d72482e83b6b2c Len = 360 Msg = a239de5c8e2644e8f030d94d98f1a30664e6fd961dc2977a9c08be5c31d8de89450945a53d79299ea2a1edde7f MD = e99743d4fd26c8800c36a67b6762247c29da6b62794123c59de06dc0 Len = 368 Msg = 917c4577aa6b0f9df49999fc1c958cb09b7fd5fc80be949670f03545eb27dcaed052076b24f96f5e0f2e2f4527c0 MD = 7ecd693d4d9cf43929464698efa0bac33c2e1424f816edc769260978 Len = 376 Msg = c3f1e735a6741aa481ad577a98dbac1f03cc80ea0dae1b94db2369ed4e93facd29c64e4e77b25038279120bdfa3715 MD = 86f0d89d8e14fd8b6606412d71a7a54a347b304ea5d49c208f2266ab Len = 384 Msg = de4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f9 MD = 4c5262acb4a2a44eaa9bc6757024fb202ef4d5a7a16fa37252a422b5 Len = 392 Msg = db2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d MD = 16bf4e45bcdc60447c68dcb30e6b08f55ce9f4124a29cf1f9a9d065d Len = 400 Msg = a8e729d336d5d6ac50e1e22f0b193b66e26042fc6459214129875e740ab2b142918c138aaf941863ad3b7e6065450613b273 MD = 452bf2e5ebfc4e451cc434bc09e2a10032eed0b7627cf55e7e5ed0e2 Len = 408 Msg = d05317d4b535f9d10f739d0c2dedf3ffb090c1ad9d205089b1346693f58273c4925c0face57ba45ad6fc687c66a88fc78878be MD = 4f03c439e097b51b00e314f675937c4d911505859fb7ab16adc65e44 Len = 416 Msg = 26bb4ed4f0424c60fe4212ff8c955e89e2f553a7d7701be59416d2089af59fa1074724e214e919b1e30f33fb78374b4b055bbc9b MD = e7c899e27009d4dc77c2d300f191b757e52c9e7eac4b023bfab2b52a Len = 424 Msg = f015ec83944f03292463c4345fdb1c26d1ea07645facbc9520ae244b6eb191e53dabadb4ac0fb15cda4ed77dfb9e1193abfafb1b81 MD = 459e40b3fbd612912f0217c60099379ce077cd02505871b0c9c14e7a Len = 432 Msg = 0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c809cb4171bfa4791539aca1abd91900e53ba93ca0efd MD = fadebab7c3d0fb8e97e429b79083087735e4ab385a789521260ef3ad Len = 440 Msg = 445e8698eeb8accbaac4ffa7d934fffd16014a430ef70f3a9174c6cfe96d1e3f6ab1377f4a7212dbb30146dd17d9f470c4dffc45b8e871 MD = 4c7ae028c0fe61f2a9cada61fae30685b77f04c6442576e912af9fa6 Len = 448 Msg = 52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724 MD = 2f755a57674b49d5c25cb37348f35b6fd2de2552c749f2645ba63d20 Len = 456 Msg = 5fe8c2072d8900287ccaf07f3f66b0c22acd3e0bb91d9573754e19e373ac35271d8b43443436ac0c162850ef3d7f281409ad29a9bf716c77d1 MD = 42909757f6e229f69f04cc7a863c4e70e48c7c3575057b455c959775 Len = 464 Msg = e8064d83f3d643af8718c87e3ccd6a9733685eac61d572a22ab943f232fcb04f70858e8984449db14a76bb7eaf2458efc3ed2a32100622c52b7f MD = 1a1d8ed54cb45c97bc970754b43eb93d9eabde4c7b07f76ad82d8ede Len = 472 Msg = 87c9a517e28d1bb54ad20fca76460efd894d7786e68ee8d746b2f68208682157c8ad06cc324ad7a3189e09c6c39d4c768719c0a49a41669f2767d5 MD = 605977cf87b9b309bbddaaa64e528ace66b04df9f72c0e7ec88be1da Len = 480 Msg = 59fdac3b6b32039291801c7d6f46ede8d26dc5b7a192e007116739b617569f2523680b3c0b6631af453e55805aa760c6970833ac06963bbc9dbd455e MD = e9f0cb1dc8337e906385892f2348a8ba4412318ecad9b96e3711531f Len = 488 Msg = 30350a4df0b58ff49c0fa09e426fcd7007b290c760c825c1855d9b0023b82caa51e3cab4c60cfa61492be50568e5ac0f6db0fd468e39e4536403e3809f MD = 776cc6636c02408fbf65ace73ae80017108b917c16c5a912fd860241 Len = 496 Msg = ef797a0d43c30b4fe1014bdb9420879c2ff845d27e73d55a7df22930c8ece73253d8bb265b4ef2ff9c69455cc56ff25229b4126bb7bb26ee2c9ff36187b1 MD = f5b9ffb102affac352a4a535a00f89b06c268cf4881d712668906025 Len = 504 Msg = 716944de41710c29b659be10480bb25a351a39e577ee30e8f422d57cf62ad95bda39b6e70c61426e33fd84aca84cc7912d5eee45dc34076a5d2323a15c7964 MD = 61645ac748db567ac862796b8d06a47afebfa2e1783d5c5f3bcd81e2 Len = 512 Msg = a3310ba064be2e14ad32276e18cd0310c933a6e650c3c754d0243c6c61207865b4b65248f66a08edf6e0832689a9dc3a2e5d2095eeea50bd862bac88c8bd318d MD = b2a5586d9cbf0baa999157b4af06d88ae08d7c9faab4bc1a96829d65 ring-0.16.9/third_party/NIST/SHAVS/SHA256LongMsg.rsp000064400000000000000000015003411352416253600176260ustar0000000000000000# CAVS 11.0 # "SHA-256 LongMsg" information # SHA-256 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:38 2011 [L = 32] Len = 1304 Msg = 451101250ec6f26652249d59dc974b7361d571a8101cdfd36aba3b5854d3ae086b5fdd4597721b66e3c0dc5d8c606d9657d0e323283a5217d1f53f2f284f57b85c8a61ac8924711f895c5ed90ef17745ed2d728abd22a5f7a13479a462d71b56c19a74a40b655c58edfe0a188ad2cf46cbf30524f65d423c837dd1ff2bf462ac4198007345bb44dbb7b1c861298cdf61982a833afc728fae1eda2f87aa2c9480858bec MD = 3c593aa539fdcdae516cdf2f15000f6634185c88f505b39775fb9ab137a10aa2 Len = 2096 Msg = 6b918fb1a5ad1f9c5e5dbdf10a93a9c8f6bca89f37e79c9fe12a57227941b173ac79d8d440cde8c64c4ebc84a4c803d198a296f3de060900cc427f58ca6ec373084f95dd6c7c427ecfbf781f68be572a88dbcbb188581ab200bfb99a3a816407e7dd6dd21003554d4f7a99c93ebfce5c302ff0e11f26f83fe669acefb0c1bbb8b1e909bd14aa48ba3445c88b0e1190eef765ad898ab8ca2fe507015f1578f10dce3c11a55fb9434ee6e9ad6cc0fdc4684447a9b3b156b908646360f24fec2d8fa69e2c93db78708fcd2eef743dcb9353819b8d667c48ed54cd436fb1476598c4a1d7028e6f2ff50751db36ab6bc32435152a00abd3d58d9a8770d9a3e52d5a3628ae3c9e0325 MD = 46500b6ae1ab40bde097ef168b0f3199049b55545a1588792d39d594f493dca7 Len = 2888 Msg = 82829690aa3733c62b90d3297886952fc1dc473d67bb7d6bb299e088c65fc95ed3ca0f368d111d9fdcc9476cd4065efce7c481be598537f3f53bbbb6ff67973a69837454499e31398b463288e3aafb8b0600fdba1a25af806b83e1425f384e9eac7570f0c823981ba2cd3d868fba94648759623991e30f997c3bfb33d019150f0467a914f1eb79cd8727106dbf7d5310d0975943a6067cc79029b09239511417d922c7c7ac3dfdd8a41c52455b3c5e164b8289e141d820910f17a9668129743d936f7312e1604bc35f73ab164a3fddfe5fe19b1a4a9f237f61cb8eb792e95d099a1455fb789d8d1622f6c5e976cef951737e36f7a9a4ad19ee0d068e53d9f60457d9148d5a3ce85a546b45c5c631d995f11f037e472fe4e81fa7b9f2ac4068b5308858cd6d8586165c9bd6b322afa755408da9b90a87f3735a5f50eb8568daa58ee7cbc59abf8fd2a44e1eba72928816c890d1b0dbf6004208ff7381c697755adac0137cca342b1693 MD = 5f4e16a72d6c9857da0ba009ccacd4f26d7f6bf6c1b78a2ed35e68fcb15b8e40 Len = 3680 Msg = 5f664be0c0f3d2fc9a1a7ed6b515ef9c52ad1c7fb3acf2c2de943e109f91cc12ccadd041cc4386f95ab616cf8762ba25fed322fc8c351809e00c600a8f26e25a5bcd0bc3b44170947f65b4f417b8ac769187c2ee4561978289cced04c036c37f942ec10f7fd4d7f6908e22ed6cfd0fb89330c2fde417b956643aaca53baab8a8ff38bdcd35e60547159b26618e1b29128a35ebd2733fc4adf6bf6796076b09fd2554c6a4df5e40ae97f389f986f843ad00000515f9c001aec9c4e47e2c60fea78de8a33c8423d1539dfe125c5b7ea4b17cf8d86e7f84b88264afec06b370dfcebf5e1d3e2c1f005faf248b321593964587852b830c7231504fe947d6a385f399441cfc52df3914fa55cdba25bd215f91a80fc8ffa872b34113dbbd9504868331a38c081fa659574b186169db590f48be67fe75885b6c877d37ec16ebde5ad7be6414084e88670f7b7f485efcf44599f44cbbfbc62e48f62b438319823aeb3767101ec6868e4c85b113ea623193ab9a5ae0ac226328ee4674bf0a90ff1f20eb542e110870bfee01165ab03c2240299319aa3ab1045247bf7f34e8410d96e13aae465597b42336cad2de00b67602a7cb5832cd7253b239ab752a85f452a6166e9de0523bf9c20c2a0c274396d5 MD = 044d823532092c22a4b48181cfb2c796e1f5b98bcd713a21f70b5afcceef1d73 Len = 4472 Msg = 9d64d891d99bb8aba23a29a8f69b32482714e031d31dde3317b046d000f6b7fc421fa8212d91fb66dc46d531b06faeeafd5ea40302a215351f746c0c42523ba5a3e98bb7b13870d04bf3e0e13425c4fdc11a505ed57c90a90fbc447242b3ee03268a29594dd73c705808efc16a059e08dd118b4a34f178175151760de963f89d34c92b12e9b58ace694fadd73a576193b80bfed0074bf5074cfba9e21da980fb366f39e76d1b8073e88ebf2d8d623827bad051f736d02e02688185fbc7ccaea69244fae2c15146e63b8ed0cb496f494b4b272bc8aac94c8f0dadb45fd015ab25b210170acd9f05afcc1786b758c6bc87d3d93449497d7637a345db161ecc9f00fc9b37677a4de55701f189fba0afba63baaf1584fc36d5819212a5299b39b2c0daad0302aea20d6544e3829f0b726b68686e7681ac3a91f543dcb79f2da30aecb30d23e252e7a661fcb619a98056f61d46e1fe473fd3d11b1c6bbc80be54d20cee843e0f4f65d7d49032f523e6a4830abacf56de9f46bd7c86865ad4359230a9f5dafc928b61c9456a1fbf1427a53cb82dff264eb2de7f9feaf739a47aa64c4a2fd70772f026a33cf1451e852a9e47ae083a159f62e23c0cae8402f775d84f77044204b765fb8e418d6cbb7dd7dacc74b148cbda95991f4c3cf65dd60e6f61b8dce59e6ad127b2dda65b3d0416a0f49392f1f107354c4de6fa14f1482db5a9961f867b921ef33697a4db4d22cf37e69211fd2f2c2944f16252a86755baf0509835ee433733a743f8f0b493e0eae8cb MD = db593a375cb27df689cd78b5154949e5bc30094a05d704c0295d547385176662 Len = 5264 Msg = 7dd546397a9a0129861fb6815d419a307f90d259d55f3503961754126cd1b776d3236aa2c239b93f8e2837220b80057cf42050518d4f1c2c860840102394b2b19a5f05e4bd043055d8aa9178dd9332c2bef24a181bfd07881d448a37a241349a9a3020e9b021f0d12e4bcd6a1aa3a968a5adc795c7927e7f23743a6d30fec3989a3fc298e6b8811d56b3f2df0cd7f3d871fad0b0d83609795f3f569c16f3e9136433f3d9a6f2699f188b08c1f9589778ea806c51981031de9a4ee8ab9d4a2d73beb5bb9437f632c13e7b18f72a4d1db2d8e8a3604d497d169c48f7820a281721716d23b1e2ed63ea8e2a2869e7df0eed02d97dc5400876892dd68c09a8b7308345023219efff8581d24143ff7836f09031fc0368b976a29f15a0ae28be1fff02011df1b2a6531ff0d0676ea124794e052df93c32ffbb8bc11b4d65c793880d076f6566654e12b99e5145b33734d1adb3be7731095cfeb9550985b9ce7019e0f855839b1b3163dcf31c8319a9f0659702ac1ee8d71667b3c5a5f2b3259dfa023e7c1e98ba956f0e57fbc8a8dfa05e935abe976b8276200177b83a5ab46254fb42acdf632bc35eda32b4bc69c18ce32a23bd8ac2f3c44e2bd50905b764074f516bac6d06570357c5ec10086338fc1de2c5729ef313481cb94562fcd01bd3128e20467289259d8259edd7549f2a373346a8a27c08c94ab0343189c6afc20fc639cb4093f27cd8081d9ed1472381864edb3518cc08fc11322400470c5c420492dbd3637a4b46fd119965c58af92331962bd29b35fc96e6cb0f1a6476dd81f79ffba077cf9c6a54c456ab7dc529fa8032bde8f25feb7e11a27fe7a8ab3c693314219a4439ebd0254adbd9bf9fb9ecba4b19e0e6f3dd9cdae1fbcfdb5481e1ff1ad62991614260b8cbb05554c0b3e32908c8203f99 MD = 0599f88c429a3d4fcbb0206fa57e344121afdf8e56f78e3f5e61ba3bcf134ec6 Len = 6056 Msg = 42172d5fdae447c4cfdd13836bb8b833c0cb85f7327f92983501a4d7583a5201830266c37c908640b0351461314b526cfb68cad97bd7ed615248fa5756c6213bd9eae98d2f4ecfdf6a452f2e68c9687210b53c74d83575e08a7ace9b49b21056cf377c64f80669c884742e93181c426d871ca2715081733e68ffe94a39e6677aea51e8f0e1a09d258629d7374a2b2884e903c577eba32fa2713f130d2e496eceb4a0f4daf105b31bf9cef4c306de62dfbcd46e2fb283f1352fa3138c31c56d7bb48d6aca301bf3d464ca4bde521d37a78bf66340ac09011e2991b36e4941aba8727e1067a7cba4784f85a53138d0f104dbd16d54e21ea686e772b95c7fa6717e77dcb05a5dfe102e4267c963bfdfd61d36cd53105aa82a95f2afeefddada07254a10104a5a9a7d1fc6d8811def322f1b2352df1e1e90d372d1ae1afa62c6b5c47380f9e0a788347362409307d1b243252bc8d72636bfea460cd905fa1f52c3847b9632c44bb17d519f07c8c86c455c64d49704cfa81cb6382c9776a61a67788ce9b9859d4efc9fe10495e809c9d4c000a9272ec27e8e8171b84f37a65aeb1d054550b814b950e44d1952bb71ee48b8202fe11ca7c0ff9119386b0ea1e7c8fa1618c594d0939792ba66a708a9e5878cecf02b9825745630573452c43fcae457e8e87fe17ae4b8f25274fa9958b67b848d736e68e4a47ba453356c21290a297ca240e667b9b59b4c3dcab43427670ae82b4013558d57553536c221ec07af7db06da562ed360d28e8a3f03ea2be021effede08027c896ce2d2864d9ef80c2ca3d71a15b3d98f4470dab6ffeabc48e9e12fcda1fa63c68cdd250a2fcf03d49f769d5bb391d8872e0057dce5e16e214726980b6579a92d53b6ed704f2b8e64fec7dc27c6456ae90db164295c5adbf9b824ca0fd8fca71e5fe47e412230f22d991c05f6a45b0b1552089224d9b36042bb603843631ff82a1ffa5a055f8bc99f1ce7cd50f42f23aca97a6447d477a58ccf6d555e9a4016d1026d23354d789f49e8bf74bf3c4e6f0f529b4d1ad334164872a0c3b9e5098d93a MD = 6c83f9b69754facc3155da93261ed99c38e4225e748e8ebcd04ed62719fa56db Len = 6848 Msg = 9c4bdc3b1af6ab9dc7bd2dd90e2e429a07d5dd5c48bb7016fe2ca51d3cbd4f45928ea049e2cd9c6d6f7bcd613773396983a891bbbcaeab28807c32fff5709d2f5d935dabeb1f5b13d53ea190ab155700e701f253c520a834551427ecce03868425e27c2adef4d0d7238d102e131c86a65c6868eb0c1a4f82a47ceaac6e80f48e1104638e6354e3007ef182021691ada40a665b4d38a3885a963de5077feece934a807c9f21487cd810f15fd55d7bb4421882333ff2c43b0353de7fc5a656fcdcf8de2e25c1d783a50115106f8fe282c8ae45588ae28450c602e71fad8dbf65b141a7e0e7ea0ae0b079e5fb9855ce017ef63633f6afebafebcbe02f89dc31f3595062fcae45e87b419fea8918574818ac15dd2a4a020141bad752161f3bb58d1e4b97e9427a793c9f9bab22b63c57af9936c2a65082cfec7a4ec53c3750511b465bcf0f6b30c50c1496b02f3bad04af8e7f6e10ced85c997558bf099bc60f861aa790d6f10fd5d1e6b88216705156fed31868ce8dabb031f11bcae51243f7b4e25865a69bc1b0755e28a8411ad15585b02a384a55a4d49a37c26d38636f108ee695d3e732eb5edec40faa1604d4092c6ddd67eaed6bcfbe8f73316a57f462fc6d8764017f38e8f6609411fff5037bdc51587c181fa7a98340569ce3b677f5e7c1559f5c474d55a379e06463b406b27ba5c4ff3bb1006bd39495380b48a3d23528280c6055d5adcf591a2baa0a84b6f2b14878ba6c201c95d1558d4bd41d00d0eb2834767076f861466bef3bbf25902abd0d70ff18acc4b140c121092490879e527c9e045fd83f4189fb36809b92470a113b6f717d4f6b0e29fe7faefea27089a44dd274eba48a576af18be06673e379f5f9fb7862af1a96d4372ca32bfbc2782bc2592cdc82df8b307573c3e76f6d61b06f9e7c9174d9308892b14f734485522d04ba96fa1948c525b17891e72feca98bc6dfe5d047aec48f3797199d25c101f33a7d180c12cced8fca21b32e5b6839ce26461ce8d0a33b2f4f666b73457f6cc58d2b1cdc1473ebb7ebf68f849ae9f9c1b65c87a1b6bf7bb102a4acbb4dc77bea254b0930c846a7e53a808eb19478d1ab9fa88fc2a10a6d5d77db433ee49f16ac296547d1d64c0961df46187cf21ca9d608b39c153b8df97ad7929ac4b3112551c2023e87e58efa7203d196ae5cde69881a031760294f0852 MD = f574ac85532bc0c6c4e7614a2e084dbc49fbc474cda593144af28c5cc5f293f8 Len = 7640 Msg = bb64be5c71918756c611cd6e001dbab53e6bf9be164875537ce76367e5f9824cad7da126b6da63a0532b3fdd64dacab2c2703912ddab21c9a3d2826da44504927458803e5161c29d06108ef50fffe0dbfe8a78a81ee19627555b03904f0e50bad89c628c8a4f2fb5a969c29c4bb5859abc62bf6820115cd35a2dedb72d7bef2aa1f250f8a9cc2f5002dde4bc5e244056c2a0153a2d64f9377aee48ca87b5684c9701516af5ff4cd6db15fa3c91739978d9eb83068b02f7b97d471cb0a5e3438782726dcab7110daffab80f042ccb1866c9eb10b48312dec32adf7253cf2e094229ecac00382afa43276f28fc775346895a49c42c5dbd34bc4a5f519a4dbe41e7551817f4bd709cfa2ce24f0cba34aa4954ada756612a830ca56ec26d66ba73ddce9db58f910e7a3dd0b88b1c3c95cd0f7ebec21ad782521a03b5ccb4644a288c5c258fb7fb2a1d72da9ae514469f3541a1251c6106ec2a502cdb77578d98e65cc755ab5542ed0b03132f63dc20796c49858abd1137919215e789cb3f2ac938b5d6d71352af7ece564320105c124dfa8df293ae14b29812d1fe67d1528208a3ff5353cf948a05eed53214f17d64406577b0ebf650bf2a32ed371c9079df7bb1a20470e5051bacf1e6a7b410255d7c376d86389dafa66f7bcf5b51109d874ae906b1d75f8ca99961f36ba8743d4629f7d93e23ac18ae8e74e032ad5aa4c39ed393243044107ef4c563479725ae676e2e229e532a7220b0a68883d97578db9ff8b224229d7be0e6a69e00292c5e087463b06f711fa744fc9730187c69ff1774dfc9785571b418978b0c6107903771631eeb7824949e629bd13eb73f3f23bf461142e972c8a36d2efc1531d95920ea62e83b83158f3fc2b4dc1c29cafeca1a3c14833f21ab3029d3812137468f00ba99470856eb1b72ac703e3035c4aede717f72f64209204392b0a3983cf73bc12a31c5babb4f3d1f67f781e4a5d658460c36b201b9d332c4f2eae9e20894654a8252eab977e9ff2e3c702c9f40a703ea338a5d0e6e26e69b8facdc6763c413830a233d6d556068877303c8c8cde0b7b22ea3fa8427ab46b0b21c028f152f4f5409cd463f1c5d801354dadcc915287c8644a811cbad0a59eba262e6c3e57e20a5c9778d95938750b8261af009e0285b4ebfc12b4bc8ea2735a9a70d699d598f5e904a9bd88487df5f33ee8df0f5875bf2e518cf6b3ff3b9740d1301eb0367a267a76ef771b50436f1c17c3ae61eee855affd28596dcce169217cd49afe05163a8560a29c6eea75b5419ec7f532105df6f541ad531652346750ffe6d1ffbbeda0ae447ba41f91858728367e49fc77374 MD = 19636dfc80fef6d47c7ab8fa620909ccc387126cec56415c9a898f64be728515 Len = 8432 Msg = e5098b6a0b1cfc57c6a76537104a39c48baecb15c6bbb46fbb0b745f9c9e5c05cfcfabb33786f7b7b5b0ce74eeec9eb84f87d2494fab3ec1f4d3bd9c99821890ee352a1d40964264fbf2c93c6ded2583cc75dcb27bf4fdb489cabcf97bfa5cc64b2352cfb0b3a707a0579eb713b697cd0b5e3377d1feb9f181d7b89cc86dee4fed8269f10e44ec48adc6940c6badbb40122c1dc2d9323920e4e1fbad0b4397d4dc38b8ade3b3dace2926f464fa3b5b82ebc5e3b81cf647e8bbd2cb55c9e31ffd212f8729b66739421c6106e64ac83d3b9e13cd8321b3a9f10d9171bb8cb74e71c34d1e8d0fc8d14b8e5e12bbe2bd2a1431fc224b70d228e4e2063509db26ecd9ca7cc402763e69928805600a4a80eab4ae6a2c3792b98c6942195e643f98c0dc3fa3c2b07431cbbe113e38fc0b7b45c51c4431700ed29d2736b236f63f75932329aa60be9009bd7832f1e1b9ac1503ec84727a1e6c8423c7c5b903e763262d559078e654532e0868f206a468b5b5ebd3eddb4f673536e5f0f8160e5f3311561b7cf79c9c440974355965c931aec5c7225f69f776f052ac4bd6b19f85389fd61df60ecabbeb00c8886ff7983d20ac5d81e303bc71253f40806772fd81f938740205a5b7dcd07cce083da258b493d275967f91e4815d656936b342727cfe45f973b2a5ac257ce64c5eca4f53be8d9fd90c3dfcb8cd1e2cef15c307449ed02c2e1704f4f1be76a40b311ee7cf81987b5089252a807ef3fc99c79eabbc0ef657d897037bced04620d32a425015283bcea1b53e0484bb613d30f14c1422f5f82cc29ab7228b8375c06bf13d746dd9ff00953a90720badf2577d3ed62cbe7a5f15b3c929d26ffe8aee9d2d17391ebc6a79f4bd235d5f7b2db2455343d9d7c6b27972cc6071c36a0d112f86d98972fb06a186e900abc64e9ab653db9b05b70079c0c84a64e8cfee8690eaa68a4bafbb5be112632e46894ec2cc6e7ce697a4513d517deb3e20dbb37ed5963232671e27ef9f62d6b514f0a22c5a5dde2d77e7e184965958f5002fe17d47fbd5d9c407644d443ce89eff427360cae9aa788dc8d7d9f62439916f139f094ee035884cb29dfa396941f0eec9e8e782da88cdc18e5bc1d9a5351b57ce15ac520ffa47e666f87fe5b18ab3c8cb2a48ecf81f36fb8397c6a7a5f59a9fa96cedbb4ecd1c7a6d9d65afdb6bef7791600b6e0a18ba23edb06fc9ec21162feccc54f2665611f10db53401b18bade263b3b972da1a612115d144a5426097efdf5c6a5d1f3c2d318f687242f993f5f1884bd95f2ece34dd4320cea46f5a26c7c945b665402778233bdda9d97c2acd8c4a4ff39dcfdc3a3fbfc5942e3ab8ca9ff4aec17293c1fbaf583d603002f93f9befe8909485eb7c30d0e91fac6c228c5fa6c011eddeafbdbe30af20ae53a85206c03d37ac17a30096bfb4f584cd3f72ef28a3303cea9cc636095c70bb36de0eb50577704d4faed05bd54da020 MD = 3380c8dae5c0b68bb264b757e2451c21cbe2b899fe7a871ab1bae6041f48e7ad Len = 9224 Msg = 681737f93ffd835d7b51afa871235694481272c75a1adb4addae0a3cc30723c8debb33544891b5fb02945c3edb660cf694d7298d41b6156ef2e8f4ba93b6b33d116b48a0bf1f3be0f7ce65ff04adf8f93fbdbff979a0a7cd99ac7f97863efcc6485000456a4e1bf2a2265352b49f208393ebbb72c97f984e1a22313c6444064cca92e2ab11c75f1b4ac5aca1b2e48e7dd68aa55ffbfcf1d8bc73950ff573dab5e058763b7e320f4239d2fb53c7254ad051c1062ad5beb955c9c7307901707febd2ca455b7836314fb576c5d0bb0a5a624cb9653a206ef8ac87458ce34fe6fdd4e812d674c67bcf2907d9947f563ac81d0f994af7a3b3b7c53f1630b3a87b5d5a6a55b1ef31aaf0ba7722efca5f5e9ce8e18a3dc92836fd883861a453d4d7a6649fbe5f32816b9de94c7a5f18a01ddcaa0cb4c718759ed2ddbc4f71299ba3e0d9d07267a77e65dd9ed0086bd2df20924dd63e6f4c54943eac11081e9fc58713a3459c51b5ef41b8c149f59b5ee50ec5b88851becd8ac04add80b3331b192a48a94662a6c39ea6363b006877257a907ed369143b04e2c9fd5851793807603587d31beced3b513d60f23d8a888f654ec486c3b06e5723586005cc81b6ca624fd6090b63ae84d1ae3dcf4882550570ef9fb9dc4cdf2f141479cc39f435cce7213f335fef7206e6a0d5ba687966ed611c1754fe1117f57fa65296dff93b75b753c93960b7bf2957bb319ce69744b0017c353f6f279d0f2ab5f34907b9522d998c7c0353e42055eea8585b0a0376b718b8006377b5f9e7ddea62cff95b015c5774617a839d1af2710f52e11ce684696e7781a660e3b4e362eda90efd08d16ab7b47f84370b3768a99728146467f72dca62bef170db556d8065d0f05be848bf82f4df0ab656fe1f5ee9e1de2aaf566df620c12df1c264ecfefadd5c5a22f0c37fdb87f549a5f78058ad8526b5e52990b85a924029c369c8a555da3943df51df7812812b3820abf15e8a1dd44e32f9fed9b837146103ed683d1ece715e46f1793341d596cbf1a1db3a28b0cf3dbe4c1e21e1ba8fe0ad78368efcc2ebf3805afb7a0f891d4a3d61a7b2304601cab0ad5a577e229bf0e790995f98bd8f4ab414cb1324a7a7fc2f74bb8f4ae7513d31a1194536781fd7d9bff9799ac745ab0ba553c629361e2aec6181981d9ca7dd68b2c4b1b2c302dead8cbfa5a9e8f55dad97f95dc63f691c9fb05f97526cebf37e67c1649a0b2e4d887f51a96d2987a9c172279ea2c9701a6eeabf52906005c79a48792695598a6c9421184d9091e3d76fbc445366dc1b6c81960893807fdea1e5de54be4bb4fe82f9f97c5bb729f22fe1ffb842b9805259013ca220cad15cc987b0bbf6652472d9df90e6998cf89af83cc2ea3444befd2a1665f5c1155e6886a74714948bb1ceb76d6cbcd1b706c47cab8e44f0af9d0428e7986940092feb226d29c8616464fa65cb1767c9e05b590154ea2d40a1264f989d5d66644f4bcbe302e040259944df2b2219504aae003fd05f5e0deac260c6c55f3c54f48fbaf2128ef4e3a8d15963509af8de1bc9fc6031f5724db7bb5352f656be9bb9708546f638eb18b1b5ac6f1e5a3e7806da57a26b3eaf536f3407d972 MD = c31bc10bed1384826cc30369b2d0b5880422e1a34d0eea0b67f29f40de17ba46 Len = 10016 Msg = 3842b033f3ca31a6f8e5a638b39efee6bf73cdcc5aff57e816d6ea21d2b17288e9cb47dda98a495507622f9a90f71c14a3817367de75ed3dd662e9450b18037c1b10e7ab35086830d1eecc029eff6af0bc3078292ccd1e018560cef2e8d4d8e135da39a37f8cb4c0be502577c40011027348811b2c4f11be8a994431512c1a42a1f1e5d0705e588c3752e101ea4039d22e903943c742effb4fd5f1092e67f124c61d9237eec57a1da2baa8a8f80808e956d145abe3f0df413bdb7d8267ce84110c26e8e2e20b43f968512475d7a0a9ce54d3505b699f0a17b67591a4e4a9fc90dbd391d83576daaaf2dffb6f6d5042098e5e0059429897052869d5788e40802a9bed3221cd4f67b8a72cd59fa360fc236e3afdaf5423af93f980f0054bda3965b43c76c694dd14a9eeff5b0b6217fea35b2ef06589877a4a92828b5304c04fcc8f8802ce716a0707312234bd90bf7111bd048181c80e1fb159374d6ba23be9e4929981414b3c6859d75b09bd169e7cf6fb82570df8fec751b767df540b912f37263799270c9c602848738211ddfc48d87f711b1003a099b015d9e816290a4a4cb429f2899bd217fbeb3246c3cc23fc42b0987493d03cbe58d95611bae2f062aba238356ee026b45a2a5ffedbca5ac1b9f6c10b9d471a5dd16da6024720899edd592c0adfc3e05fcd6cc4515fc1e8bfc7b9b2873650819fa1379162c5ca1f276942cd18e32c4742dd1a27e85998161df361349266d3bbac52a1dfd93dc8f825d7c4e2088203a482119a516ad0372c04c5560fd136b80eab6c115711b6025cbfb0463581c4303f4af2550a80cd86729bc6010beeade7c3c475f1c2af385f951d7a328c2cb29b60c007b319d2576c2f0b7dc8f091d4492121f7a8e85ecbcaea68c0efb0b1532d4f0cd81d480776d4ad7b73148561b1c472e7799e91c47828a2c807e569b7b0cc5357edf95dc832a332142e4e93074f41fc41843b858946620664d97c7ee6cf61b6c9cfb021bc94c207fd38dce22ab3a909559fe78b563e605e65bd1cb9e8bad5be8905ab5c8ca319745f19283a73e7e2df4b520a6dd3660af2f23c2de062790eb4c01751d6df6890c0625798638af2d6c64c250cf1a7c8480934dd17bcff12f6e0958e09565ee910352d7c962416dc6b0880a155e07a6c03ec53284215648f748931f03da6b1307f19e9108947c0ad8bec0e4d4d01f65821e476a517b33cf76ff8bbc8548c7f45c7b5bd99d9922f6e1db91eb15d1ec1968c37c5ddfc5d2d53d1765c9bb6d1702ece51d2a1edce0b2709b8da56ebfd832e2a2d69575adddfaa81493cf3ca3d2df57e3550af2fc3fede373168c36167e526e5108a9b9af9fc0467b98257fa975ea2bda85e4c0638ae9d8f6bf08025248e88a4264f32227a296a6b105750aea9ab3b75f324fedaf6c36bf8b09b16a1fc285c4fb9e1a35c2710e27594e2654c39baca8d5fcb5014c6e6515d46900c3bb758a8cd0f6876aeca59776d8f4c1e3d103656ed327bc71a6ebf55a376f8ea5d1cc87608700b348229ac2e3b47bc03e9f6c5e87db45bed55b6f582b388fb396ef520cde726f2643f0eaf11c7055b9db8b20f87252f94492d6831dd75c4c080d60807b65278468e4d3f0d27f9105073130ebd3bcde94d630b4a1a70d1727047fc1e263731ad2f3a14846c78bab2c40d60d0770c5d2bafc455265942b0d932174afe255b6c0ed4f1fca7750df031dff408c1e403bd3de2f375c2955bf8422f762772ab27ece35e3a6d6ecfed MD = c3cd7be2de832774c614ccf60d030d75dfacf3cc7e49a37af349a4c3c196b106 Len = 10808 Msg = 9020918aad4ebe24bfbad9f9109325d09ef520bd79ba08986d949fade1592cb5ff9dc2061586c4063bdca9e53760fd8c9d5fa8d03b8673ecb3f8c82e6a9eb9f0a1be45cae2d0d6069e8d0d541448c2bf748147e045b8ed52047fca660ed3b917c0aca140dcd3fb0c2ef48eae70f47d536c84845560f77fb2a6502cbc94a03112a28f61ceca383b00353ab35c130b362fcb90e89854eb30f4e295769ac6ac2bc98f8e0ade76a69ecaf98605c4c536f33bd9ccfa0fe93d0800007331676aa0ae24d1d126d7a6c62d53c3010b4f4e1dbe5fe0614223e6950fbe4814e48a4923c30baf813c212340ef81dad24d6575679e832677483c159a4e1702a0176d2bde716670c6d524b5bbed3d8823536f03bd9c8ff43495c33cf5ccf1753e5277d878c01d5dc7784723df2d701319a6d3c1c6be6b92c3b01e244e9136ea171e10179ab818beadadf53755b900c4decdfb742b0e00484a21b7954ba6cca95302a0b1ec623fdb9ffd93b7c599d7e39a504de79394345ef271f55797129dfa19878f6f15c57bfbc6ee8a6cd6d3dbb874b833e1a757f01be2273f31d8dd8f2591334617bee9b2674a0a421e3171f68a958b14290f5f1dc943cbffecb7108c71e5912b718ed7cd6852d923957e7a0fa32554588872b4a1ae3ce59c50dbb27b283a26a7472e96b54406e2969864f70d494b9866c6785f6612f6fe7e25edcb4390bb7c235f452e50438fad01f18befdac52fe1a8abca67523f989d0d339464cef18d1a05827ca888af15c2cd669c6a5d5ffab685fe10d44f7c4b4bb14279830395db88b6787b0b44cebfaa63c03f717e5ed4a06589f1ae4410378fd2194333cac3cb4f9f09e95f6ceab6ec29c61b0a250ce426b01216fe184483f1d8819b790bc285f627fd6fade74922108942d9403aaf53d0cf6227ccb56058f92b42295faedb3205b51bb4fc9f332a9eeafa2018a59048262841cb1e02acdd30332494ec9c56fa04b32c61547bf2f61fb4b8999c4ef7ecb12477aafee76f3b1d58ef8528bb7b047c88f81dbd63cdaf1b4e42ecd31e2b67f82bcb6d734cf39949036aa31cf49179f59c4791403f0b7d182260c0c5fb76e083a606bc85197e203a9a5e97cf30e280f557e164e4f7f587a097dcbd7bce1e7fdbfbf03e3d3659f77a8793084955b44206218e3fb274d3f63a157d8cfc806c6e8794519ca28ccc489130d19f934c50e7af6215cab09cedf16f040ad550f7a8d20fd7f17ebd011e3805ffe004b4fefe9679823face8588aa1c5cd4c3f801d1ad6fc2e988a947e99f1605a87deb4520677eae9d48e6291f32ec6d60b7393d90a9fd5000d6b32ec839b29ab8fd59c2fafb38cff9c17252d71bffa880e199112bf5822b519c79c31255de959c192737f4272e72d5ef039164a7ce84b1fd883b282276cb58447dc37c76027cce3bd412907db81d9e4c0a632c68e1888045870a09b3439671692f8e4b1cc6b6cbdfe0f154617e46df430746b2f1d12a5864260c452a814359651fb222ac83ea119fbe42b474d984f57e8aca7cb505f0c6d3e5b06eeab8286ce2bead87b7c26d3bd5fc85351a623e9d58f56d0e450862381f36a4eb9640dc384c9cfeeed11ad6a72d0c375ae4a0fa135cd78cdc0450f548a0a9484f9fc3c5281d2b14bc6af5bce00f6de79a460e4e1414c1c86a75683064f2ae290f79b979c8def99d94e7db7672f7b20477c112810bfb149e3e3ab68a099fc5a5afb67a7096fc88e7fcfa4499ec70492c77e84659578a708ccbb6d498c302807cb4d8bf302f10498258f4c99d98f3c3ae2f1e222da34d4602976c4ab31dc55eec9342d04edd94bbfb3d79b308150c8227e1f52e846bae059e25dd718f7652b193dfa766033f0470c12efbc95ffd25352844efd3e41d474fbdfb8cf174692548f MD = 888e223d5a497fc679c3ecfe98bf7dc531a4adf3ccf0e6d586c8912ebf781af1 Len = 11600 Msg = 562d412b2b65b5b906848ae4c8b6cbdbf34726e6bc659d4d62267f76bfcd974d1d49a3e84afe086cefc8c32a1d3da30e2933b53aba8300ee200c73abe7fa1c98ac489b243083d5edabd1ede1633370a27c07cf2f12d113c2853accf414594a27ae321025047c8605e3a8ee4fc11e996096ca5b0fedd73c903aba70996e738ac4c90fec35ef72827c3f53b0bc6088880d1c844120721ee422e69449e21ccf4235a5e8169a19ec311a66dc197267f8a474b93d69abca2d743e32ce3e1647f5dc43ebc4769ca972fba6014a13b8fff7555c13febbf71c8c52adc672367f166ebeb643acf485c88c48eab7a685d5500c038cd2ce1f4e91c4e83649871b63b2c1525654a7789b9dc380ac31f7561281bf16cd9fb67df6515c9da36416d40b4276feebc7bdea28519e0bb5164570b7bb98f6e722bdbd3883dcd8bbbe2649bfef162c3c43f632720ba651cd0f99ba0c25200ca202ebc75c4fcc034500bf62c7e1284312715b38c2f461bbbbc4fa1c58e8debec6e74883aadeb5850ad1e9076a3f34ab35f9f3e55f3459af49dc707ee52b5a751a7bddd96a581fc6d2daad20f131c2cb6d82c71f93f216963d0003c8f9171d9a6763b1b2e3e5902e64c21295a4e15b0d82b4ddcfa4561ed960d7bce2ddd4ae93754accf45eab92258a32214ecb7486d83b393fdedb89fbde7a0aa2b5d98995ca0cd6378923d5ac130ad2e133ae15cc9561b6f53280b3350f5340bd27345e5ba5f4aff9577a896760ad495a2d95eab4aabcd605b5dbfb52d3b2221621387c878ef47e1a48abef49743b409422c71bc680143e794d338adc916157b48c2b0ba1ecd6eba343fd31dcb77c5e98fc8dd18a7f319958e4d2885bb32688a04e56323227609d9b2fba74a892384c6da12f34890fdb8dab61fe1c55a0ca5de051011ac1a75b3d0af628e3346b36b11bfbf56b4a99d9c279ac006e54c0157d7e7b74ebd6d38e72f97f8fa308ab3f36abf0269f5583f4e2caad20a7df7bce9181b6f6ccf915c3e56eb239dfacbb1b83246a0cf73337f492a74ca5ef7f39bf40f2e9d0e5b3d4c03e74776dbda901923f8e50ed9c6b1ba17c1671d96dba62ae33d8fc4b5f8b794e2410b6726585e76b12f18a12b58599c2482204024a1b5e64123bd6ad620a6a353f4c579100cbd470a656ffc36b0a18219ed0ed69ad2795a98424613e15b6103d382f4212b6003067a0c49948e6810084242a1456bf68704431998448a11ad32eb7c1603daeae6219ab443fe84d72b8b485376110a86555ffc2a527112ebb1ccf630b9759115cd44e6dddd9ecc865aa7967ffbde18fa6ada0df4d32e2e32351e9e514d0b00693edce8e97509c81e33d9a738b0e0f9cb4e1f02f9b8e03e8d9dc44e4e5f488b6da1560b77a8a409d73d9e150e23ee3f91657b75b9621bc666523a80984e92a49b9b4ce908f7020479ee614a60c33a5cb5479bd0a46d455855090ddfcfb99dee6b832dec0ddea84a5ebccfc1f12d79d3df7aec9e5b490156c2089aa6452eaecb560f859f06ce1b3dfe2f46161fb101374865da594e73b46446078d9ea8fc69bdf386c06c7453bf61e0bc40b14cfc84e9b89f017bee7be2e3495c43035bc14348cc9f7afee6fe2958aefa5c1e197e697d888cee80bbd02156549d578eee0bcffe399021a0cf2bcd84a15004d705a5236530c5fe02570ee45fe031378bc04a5440d32f310cad7b30687053b756820f473369c0bc6b1086905284ce6fa482fb94b321c3359d025ae696848c00271f1b495a6c13a645a8e5d9c0babb6c43969df5b78dd2bbdc5e494471665f5bb35d67ae6cd025480c509b153cea8eba038baffbe0aff4204511d4fe9b8e4446a59d62eacd3e7c1e39d814d729acbed54ed2b02ba0e0adff51dd7c697774e14d588fab830e0f8e95588ff1941969d24a8ffc3ce98ad846c5ad11ae1997b2accc5684900ba1abe359d2e89fd07eba5f966178b4ca00ef750f915ee8836eb00d602a1cbee92acc00b85392ae10ec06bd254dc8964195aeaf39a8f5ca3b7ef599954dc886bffbc86d4d34ee7 MD = e65812200409ad7e1684a2df8e15685dfab7079449c52d032870d80acceab3f6 Len = 12392 Msg = 5310977a5f3689bb9acd32b9ec2a60a027e912ffeb3c7fc1c7835a5fa01d5554577ee4d0a68243b04b01baae69a420d52bf79e39aabfb5e4118d8213ff9341a32cb711c650e6f6fa40ab243c5a007b7824644e45302d68cf43205114b53fcd541be2a6c22409ab80c1f1f9ca89e579725b57aa8c452fa16aa4634ecb8dc8004f6c282b2eeb946a2a16fbc0c2bcfc23a918f93b76b06d679d7e7f019e4ed7e37c67b029716d2e39e086f2018bbced8006a371886c3b8ec250179bf2f6bf137cc354a328f37280228a5afe458d515f987143e819d4ac3bba6bb9e0aa3caa25d50d7a28ae1cc2322c10db46123042fa74d341867717cc1b58d6aa76b0d6d5b4f6402268455424eb5f5a4ef3f3dc59671b12e572299e63d7a37a32848c2e0869e546948a74036253c451fe2c6df95c4e951877d5b7d03916a43d9b32c7aa0decac0518b7c491421362db321a0aef1456ebcb3fd6aa14158161082baae8b4abe45367f617bb668dd342e131e5512649282415859e89d4c1bfe4c42c1177b3a9f9e05375d1e3ea0a3a6a4c44b4ca07c36c48dd9054dc7703793557e492fc0fd0d45db0de0ec48683f1e402b3affef849c9600ba9212c65a4575aab9c52002fe81dd16879f5e4a0bea0b8edc6007462a5e77386182dff056c005da69b7c0b7db97b45628eafcda285eeecf4c5ccb4ae9d6f8938259fe0c1221d45322b36a3600a97c086656307f29e838afef73e4742fa09aa0818a0540090551b3692a85240a4194abc463a18fad10899f5a57bb488835cdfde3857e52b7c51e69919fc9f8650a8ebec785c8a20e82522c017ae83e602112fa2ceed1aa8afb9ae4508571298d4ecacfe44f0e5cea9812c4795fd3dc63dcfa33c22897be0f1347c21a7e334dff88f94daf21eaf6bdec5bf726790698ffe3f42957c54913b096a57153dc88cc38636ac69ca10725f4d98e329d4908fa90b0914932476e322c1044709142ea3ad448bfb9113ebb511bfa3a1542525387c2cd4211f6116fafbdfaa54e5723cff03fc36893b17da01ebfb8e00dba376eb702b4872227d5c5c2f2c038791a01a2a2e74df5e501c03dd54cb0009a693ac30edcf0e0e82be71932770b8e7f6e6f1ac97752d83b66b8ed1b4f5a1c39d40ee8f5bdfcefd296d7d274a73707cfa8be90ba5c6c8ff574ca46574421a36a9f1659122242f48fdd1a79efffcd44f86d929d1bf3159da19066d22fa7a136ab0ed39bdaa66daf6e8341882b0d58c678316da854f7c881ce6e3108faf6533689b7d919b5b6c770fd1dcf85ac4c43fcdd78b23b0bc70fccea529b535fbca233753e995b49e00ad9c9f126eafa39295876c802dd96ed55ef83e21869a47738bdfbf796f8fd9e824a33c1ea208b507389f283d1f88cd7355a09813a848f9261169c67544b576ed852f8f48bded61eacd1cf509224641118ad09d4746c77bac60dc52243facdbd7784580d8e7e61205ff07ba2e5e993279a48f3404869d33cd1e404acf85fe726ea4eff715477c2d1e73675ff2fa0c08714ce6459490548b50f49d95be4132a17ab234dc4906361bfed444cb9e1f242bc22adbb93d8d74e9ff89fc1d3999d1d2c2491d17ba4b9d446dc8a7e879f46b0334e5797648a583b7a08664c988b5626c0f12b091b03f371032f7979dcda268f98e26c565fdff0b5cfc92de81f2be6dd729b5f730750a8fe8170b1cd2e050a3739a94c96ea3c49340db56712dc0dc7b7ad8d9fadd50d32a32e2a93e6ffc27a5da1ed88c7a831ba4cb057925b63b3613bfe426c08188c292575c7b065d674ff597e399166fe62dc56541a40202a8f5bd0d1446510266014ec04d297b8269ef1b10b180703712227e76587f11fa524001cd31deb54a32b5e6d47d5ba5c74c2fa0af4f35a1b85021576613b15986804068650399f43f3409e2fab3b88d1456380bdb875fb1dce752d99d38e3e28f791d793e521c17cbb323cb9cb9e83a52d132e4fb1fa6a98921de8b848fbcb5fb86febdc0e61226d5f92b29215594b4670345b479e0b490a944edf581e2e5d9b4ef0bba53872127444c4a82f15064043d359701bc922e6e2399a6a0fdf70556a0fc6efa60fcf12402f5a7607471ff31bbae53562cfdbf4bdf6832136197c535a9f54c054d0e2b24f63b6c4a12820e43c8b89f3831e80d30c5f9b9d6138acd7db621d0618485 MD = 2916d4595a3ede77f4165357977cf3529c672dcf4c39e76ec3aa848dba6ff4f6 Len = 13184 Msg = 3cfbc77b8897b6a5613f62f6b1c89b0d68f272c6c19b9e0ec6331ef616702006e64322d3460a57d3a5074c719811cb5dd78900268890da0ac177b40d487735489da374843a1a6007198160ae77b1363cd8ac29f24bd66360ef62987ab60ae8ee690307b5ec309be8c496e5d6d610a453714336538fd501b758da1166e88f02a0524b218fe5b2ce1fae2c25103d96dd4aac376f70def57bb705c868f967704c0561630b3aac0ac254df2c668535aba8c8916e1c72bf9e9b09fd15e65aba138bc69d330dddc99e3f2e607ff15c45b7ce7527d18580bb38275548a7d0b269e28a8a0fa46ea0c5d80d55380b0ebef62218fa7648f2c3592be842ef687128fd4310fabd9c78ac271ff3726fba04d3cf544bff86bcaa6221dfa679f93f10e5fda0e4beb104712977daba2d0e731dc258b5322b6013f6869bbd29a26e13f410f160cf7df3c5a23f3e732a2d1b1d9fb419ae94270b371e57502b386457ce66d261eb99df89c5531402510b1ba1a2d3d09ba5389a8f0e6afcc7929d67bb57ae53d6a90a8e7deeccd34edc259ea5e9013f6503e72df582219e885b1e54a29614bad802e92fd72754a2a77c405f31da7128ff316988447a8d641cec84d31473e030ed5e006d9d5734a9979923054c5d6ab4f295865284ddf4770aaf968b1ad659dc9f2515edd968b512a59b9739ff5a360bc5990634bd959ffeda0a1e25bba7c8e775bff15a92411d025aea64a351b91b5400a4b0d5f889d6221567e24800ce7578f7945c5ad1cab4a33cee52ea4a6262b82c1d4dde3da1e10b422dac9def33a8b8ae0c1e959debc41dd51028b7f23e525ed06ea5f692c507e0e9c442cc93bfa9ce2190feb5fe8c9398adb6b0b15233356e74fe80c601dd91ca92946c7cf158bfe3d986c55ffc956a3b4a4ab081712a5112a035a6f591d1c7f0c605f45513e7341f5c583b3da0ee912e3632f1ce570cf070dd7bdf2c4a89f17b0c7fa10100554ea9346c28f7f180509af9d83b410dbf58b0b238f21335ee5792ed6a3a25c08856aae82c5435f731efa719a256829a2dd1fba8d4a85159e6415ef02e886c5c6a934901ff879ebbeab57c20fa0938063ca57946b7c98fbf5af6069d33537bdbe24faf064c88da4494ec4296471d0b5ad61a51144a1d746d33bfb37ce162fd45d7d0037f7d20929b15da2001f05ba59de27aac9af36ba96d57e48d16a17f98a233606ef5f9176ec657c73feb5f88abd7480bb1611b7dd5c7b0adbbf2d970f4fbdd4518ef283515cf40fdc6dbfb6fc810f01689f02b19a18125616698f3feba57bdc728f5724130bdbac3de5a2cd7a251c2e25bcf8908b5a59d4ab59155f192bfbb30c78f3f056699ac60afef5a87e1a1a6b950879f11b83a02aed1646911233abfc61c46f747606afd1d6022ed482e0984e1909fd4fe53493bd6e199952616d0b1d350a102d0c53897421a7b4de2319044a3429f8f962dd9300a0eb943f71289799d8a29c8683e0c61170483e31d913ece478e0f3aa0eff2c992804bda4dc06eff6df364b2d673ed43e347c115c1f61b0a159d783ce5409ceeb55ed7c2f0c8862c8ab3dc26e40be325f00abd4c950a30e0559762fd2dc9e087bcd0e562a8d1dae63ef1198d58aff6ef847600f1627284394ea453e53f31c57cef00fe243d837016cfd5a150fb062f89e8b3116af0d91ffb49ead55ce52154b59613a96f768852a58688fed595b995dc64e8782107e50a108e946fcae541941af9346fac1c858879ab32b886ee6f30ce3f3dbe7c6f3e4c5e65c8aa9708388d946089d741f725187c86fa55cacdd10948c3db6ae5ef8dedcf16ae0c2b16af4709123a6997cf0d0c945e095f08fc86273336ea04c3517af64ae8701feed74dcb635870ad166ce86bab7d875eaa41379375e191157e5bac6eb625336b4913bb20887a532c26965c3ea8299bd817658c53f80cf9247ed6cc5dfd132277a291a04e62c00a6d3014118c73ab6d57b7302c71a2ff4ab92a8981cc06fa62cb621aa55ed771bef89aafb15df44b2662f269c0f45d01ab5cec3e74c1b9241eeff2767257d1d79656ce2fe1ba1350ee8230daefe5105b44962bbb4d47fed87c6cb86dae413738bb0e325c4ba9b804ec3dd949624ba3563eee50c9b363bd5da4c81ec60124f1dd54a830fd9735cbad491e557fc12efd38c1edc1304e1fdefcbf8e8b4b1509e60e8aad2fdc6d6334942caa0c44b3970849f419e7b8c78249fdf54367c28ff7001385a497bf733ddb01be6b675fe08cabd300fd2a29c694e7a86d7119f41af726336c15cf6f54caa83b27e8cc9af118ce1c0d1ef34af25e9e44509f0ba95c MD = df5f9f0898e0fa1bd9c3d3196fa8f7e6b01331d11eb214f7e5629bb7a1b7eb20 Len = 13976 Msg = 3fbcbd3f57a9912b9717f91e81529f6736c6d06f8bc1309c5e7aad742b51b106da589c85db137137757ccf8d5b4a249481731d8c2df061d551c07e13182f238abf5891caa6e94c91a72616eda6311da1698874caaacfc0c26bd034458ac0bfd295c38354dfb38a02d41db484898df457980cbc722ae6b62a55b1b553a98aeba805a25c6daffa9252a46a939b2de8107eb307dfccd4beacd4b76beb859c1710d2b7fc035b3e44ce49c1149979bac9d9de6582c420d1de08893707bc228cef971952d96066b31ca5aed023b06857b9b73e538353b649ce3311808c1274a098e6457f425bd837077f4b7ca0bfae2c3f1267281574d5631796343802d4c1019c671ee53ddcf7f18fc4e66a92ae9462e352228a3d0fc7474098ba0871ea52d683816b2dd5cb0d0a3bdd4845016562212ddf3522050cd21ed1a06a97e23b6f48d39bf6fe0f1060a9933039b3f6cb6090a622689774533f1053180d8e5cb15f7f161f8501f59338f72026815c77cad6d8d581859192cd56444d676b94e8336ca2d374e1dd8e3ddf1c6928e7ea8f490b20426552ba68605ee347f54c528daadcd99302d23be2f49c3ff79c340243314891763799b7fdf5a114c92a786f53fcf84edd3120c3faa1b68850eb304e9d68d553f85d20335a7565005c6eb694421208263969921cdd2d7620fe7ea376a4d7fa8d5041b0d485c6f3ce8729d06963d4548c2f12f1ef937e242f89bc55226066ff680749104288d293a7d3c38c95bd2a23a6489405e3257e08dc770c0ef9dafe2b0ba4df0a266b7f8cb3c7a4b3c158fdbf9c0b5796a19a13695052d895a31985c79eaf6a642834b72819eb340d943d336e9701c46cd0fa2791b3a187b3c925e51b4bb152e7efed61ad02c7dc61b773b679bfb0414e194ea1c62ced81301307046f3831fe5b249d656495e40279d1026c283ba23706249d6951e3bd2dd428c6cc0b8db7d8886e4dab95fbc9101b8bf33fc2345f0f5a98ef677a0199f566b16a233673cb473576041a885bfe6c108d4d1691d16d2f131e4c8388ae0940b055fcf33a12f6b32ce4ca9c84de0c801f7e18d8db3b5601f95dbda5c511967778bd83235d91bf84335fa718d3ac7ab212075d6fe999a2ebd3fe49b57753c7008790079be818af23138fa477bbecd06cb0cf23c20314d7576ba8f99be79b2544a577914323d14cf6941dc89f85c79715c07f72b970d47fac8704d43f5d1237ab991a270355e221667db11c79786456140bbe523c7a002152f0b9e28920e0859e2d20d4c3c773b3dc98f2a6eddeec95d35935cc3367c046b16e702b627a2c978327329d6bc2ad8cbeab8970e4fd86dcb9718be786803e7531c8d1b8b0b11ef6c350f78ce38cb733757f1d82441f5bb42e1d69ac1e0d9f363ac883905d0ee029c77018a8136dba306adc57e2f78a92a49a237721e1560e1134342fbb4fd997b8f64f3cf9e3afde0c0489df9ae3865435664c5c50b8a2b18f87d57c42705a6e2cb7b40c883c994a4eaa505cb2f25dc9edf860c1418b3bb0379b73132ca6d98b0b74692f5c0472277ec6f777300b551857b9274dfb43673492d8d69b81db9d16e094344e7d25839c24bf47d71e15b86af81169a986c66f6526a7c5bd49f6ef38307fde11f48514d2c9fd082483facce65a69ed7ceafe9b6a7e6e09218ddf1718859c2f1fc80e6cf1f4e8020868a1dab504277c6f2fd2326c1f966a6e557e5de06655ee2101a6d5202ee8fc29d4f229fe7eb5de2a5e297e929388b04da7bb08b55c11e5bea8379587fe65c02fcfd503ea5179db547fedc50561aba3658d7e62c1ee39da9fc4a8f54fecc714c36232aea104dd3a95980550ec11660b5f0eafb12ca433966c5de13da08076c18d93f1734a1f47c597b35967702b23afe232363e1e0668e1cc7ccab5a143da8f346cfa9a0d2a2142ffd7d151b93849589702fb51be9d408267274ba57bbc5b4561f5356b13aed27a780d5558eec040ce2585e63234f02443e6694c54557462adbb358b2e8433c235a85ccdc237496fd936c4e028a9877aeaf147b50b58f1558deb34e22a883f593b37cc21d8bd5d40416fc5cf7c45ebab402fcb6e12acbd9eae98fa24a8455cff53ce6539e2a8831acd7a929d772fa3200d49fc5fb17860a3d86b9037f0e6111c471530fd2820446547ff33305e90374019e6e27130e460ced20bfd054a91e618ddb33456f14c268a75a5ae727c8f30722baf868ad61a478666224974fe6f645bde51792a8754b3ef1f150d49185515200d4cef93ec3f9c325a557d6e53a7124d11960863306173fd0ff7589f79096eb185642575ba7ee83c774e9fda92617957402be8e7359bed1c0cf2955be8d4c48d5c9f311688fdb20b85b5ba9f04c71fdf31b721a0de29a9b5ddaece65adde9d1c5aa71a609ee482074c31d3a7eefe8e4fade3bc7472332f2e4bd40aa5104e84c54621e83a435ce098936bf4d9 MD = 46d6071814544b8de5db52d4b4d22023ba2e630146ef4e47b9b280341985f189 Len = 14768 Msg = 1718a57fe1a0a012daddb0d30069525c5abe69147ea9df4957fc8f7f25846307c53ab9d333bd0c884d00d0d5da409d04ca3a90cebf9aef74cdb60b0b7e7c6b171aa9265c253d91f1282b1a96b5547447a5b6f512a4e13c25f0ab162b5d25a3d99dceb4c3be067875f4c558bf998c1f50729c5e8634670f8546447887c9665273d60f2bb00601093b383650f78ed0e545b95394d57712afbc59e7f8c6ca27c10d4dd552ca06168b6c7ce5cbe79d08104f03435fa575cb66f1b1fd6090685039d08b89f2bac52e482f493c9037cd1ce695d6d4869f377b7a4cd4ef768facca00e31791d3274b2f86ad25a2698e27f5b040bd6ed36ac40834f64c2303689d7b5e6f7957bdbaa1038e0d9b7f1c94b179b5773d790cae245cdc17a103cec6444c9d9c3a41781bce90a878303c72f275913f63e05dfa15605dbad659f6a14fa7250491e1b9cbf1dac01b166e3f33507b26942b2d8265457ff5155cfe6342abd0efda77f62680e5ce79310edcf12755c91efdf9ac5115e6890b37d117b47a83c790687501f05d9eb1a5308902ba15aa6963c2f2e630d1a18786665c2d50117f92f2f6b48b7e2bc58b2b61ae6903c7f763db2b406288621e8050eb25c79fcf463bfbcb5c1b3ab10165f30ca6983203e3bd70800ba8c291047c500e556d097c81ca9531943a8bb9fb46e5799817b192168109087a414424fb836e1614a8f6dfd745a76e846fd9095a36e9efad6fe63c39b78d0cb6b478e3ad9e924d89fecec1f1b619cb55428d6bc73de7b80d273bc8f465e6d4e789c598bfd4a4f9ddf9f9ea7624d3902f3b0da4ea64c71adfc71600ee95fba833499209dc2e8c633721df220f98bc0539e3c27f6ab2715e4cd8e1aad04eb4d0c57b49ffaab232d3c0fde9316419be729cc114c3f030cdcb7be1038f4199f993c3a75142d16a7f90a0157dde1cafc01e7f5e6c3723e4c4ab946ae477ea7db23b5656129afa5e59e4fef105f2e062ab520b4030a5acd83c44c1fbec2a7202c70ea50ef4cfcd95aa15021ae736573b655668f1cad332141ee0281d836f83302055d95a5fa8f117586cd6178d6f2a41d772bdf9a0895e9e53c5f157110fc210a65719bfbbef0fec4c319f705d68007de9ee32de1c91d880c23b4532fed3d9a93f5e8ec7706ace1d6fac88aec1e882f58411f12aa4b247c2528c4c35b2807003d4b05ff9e6e2d7b0a825b65820b658b38e241f64a2b3536aedfe2de896e12e274e96b5dd851ed1b0dee354f6e19b29bff16fe7157d5da5827adb11d310bdbc1c9358b8fcb6e86522fb2f88106e5f9d1f933a6fc49d78e511e0691f7f89dbc1ea8d3e8fdddf063b10e6517a2f2eca5ddd5ecddff96accbb2009f180736a04e69a229063096a41fa81879154da89a31101386f603d4c20cdb6dcba5b371900d3333c955b06bd614a7ec6363b9ae7b461910b6a1a16ab3dc6db410ed95400972fbdc296a05e422ed50e8b8a59f6b0c3f397be04340fefec4c97203322518591a3419cdb59985f704039bed3d6764c99721a3986d6ad80f307f361725db612b5d6c5b2acaf3d7eee3607475adaa224fe842364382a7ac61aa1f6ed13b20c0ecc7154ec51cad406715d810e678c039ebad1b9276155fd2a2bbfa9aa5e4ad9e19e1bf33211d1e55fc15daefc421420239402e46a4a82be12ec0c12819b4da8f2f37dac6c36edf9f0a6df97f7329b811c55bfac153cd746e7272d3b5a11e3feab933e868206459723e88b42e88049afefc5af1a107d7c1c12a2cd2c1e0932657346078a5cca02475f4e08b9b875453106ac7b3543559ac8f92692ecb3cb6564b2d380bee2c94b910da1ff044d57b88fc7d2cb06960e59d3067a2482039fa284d103502cfd4d49fe93a91729916ec9529cff4593f2efe0c4a0682cf9f5cd114b369e20dc939c23155a2ef9326b04a101ecfa94e63d3f58232eb65256709cdc434a6c97d48dff025ecaf84c26c25f67241e8c5e076147e8791a2d3da35e5628f475345e1ed4be0e624bceb90e80c844449c7d4cfc444fb94ccb9596e8a64120e520c01cc24f216ea8467ae8f18c8760e8cd9505cfd09ef327a9b6042b30a5e99eb1d67ac6e5704bb921c280d7cee4e298199b3288eb7ebd8f1c573076e4ccaea7923f203480f2cc1b466f2ac92e27f2dce8597a2d7f353f0e8c42c1d0aafd958929c3b51307f01a581b498dcd9497ba3da29586c8730ca22b613d60426a7fc6cbe029e26c61b25cf80a1752eee87d5f42af18fd60af4b0e6f0311b5d20c9b6af51e3b4e467880bb817aa3203112210c7478aa88fe1b3aaa60db86678a7899a98f4abfa1a933a25f7dd3b3a0a0facbe7596312cfa99f219f884f631f7296c1aa22ce7e859e7a5f6f737c10794289c3187bd91a79692347146fc87284914f5a96351140a02b350114ecdf82541fa550c86243882f468ff5329baf793fef89ae94517bcc9a5b4cce756f63d0d94037bc1f9407259849cb7321966a41f7942d03cdfd74ec1c33a80fbb8470c4afac284d449b8fb95d79bf0908e86392558924a269c16466cebd2f0b0db36e247f6b5e4c60ff410c25df54ff0f17003301d554d38f25b3035700ca0c9485c5b9f086c3 MD = 0a147f33ab036e8ae148061028c6a557e2eeb1a6ea71b3760548734942743557 Len = 15560 Msg = eeb1a4c660be97e365dfe42a4d3400c6e661caaca02accd2ef41be9bf15b4c9651891a696bc60408b0ccaa2b4c2d2cfe079e321a699630b42218e814a9cc30492255f51c85df8042fdf7f8d68ea02806fba3830ce72665603a809c2bc64c27ff2bbc3dc6f73192f91208d5135ab67d448a17c5696003f53cff23e4c89202bb213267fb510ae3c295b8a64acaf796b2227ba3011b1d5468b238a6c7d35317731500fe37a4031d987eb7795de3ae6a4f0698ee3e0966424428afb44e3552b3d7445d28f7a72d099d1dd72a1846c757dd5aa7a1841b83f513082af37fd4d7fc7016108d4542cfcc58d8e06183db8a87e3857163db39bb945cb9720b6499291dc5f4e3d6285d3091511899c5a58b3e22e9efbedd4c4b5748a8a34fa5056c923c5f449caba9e0997e1146cbff863c2d4f770056b6de399f387e2e886968365882c46f04b3ceb352bb1fc83eb72ed79d37162000979aebdb8d66c2e7fe97ddc4167edee397a1bfa3710308ba94a645d7024db78628864a536ee8c7320d9a4b1e2015f801ff2aead4c8466c073ef56c23d7a52dae10ad3c4f048da5323d7766aeca0f242591701d2ce76f5eec5e2336c8dea5ea41f814aa1676dcc4af373818bb3af6cc19f87b41f4f70645339c398a1041d5560687c57df1ed5e8d71a2e5488f985157a3da533c751f9489a29f3e4f4125bddac766c79b289199663f2784de700da92d8ce001f8f488a09102103a6fa4b4e6dc4a3c22ee038917b8e26e1fc1a7c185b69bb18c5bbc59b2c71a9635d18116d7c658b2de5dc9fe60ec231ebddb7cdb6d599af6fc4f14bb5292b4da385d207318feb97004cfc417fa68c8df67133683e9814f5659bb43d6095a96834afbc8f232ee351d9c2e3afd6f96995b24511fe38293847aac8692d15e88893a7493c3bbacfc9461ac6174d747dd6037fc7d7d20bff8ff09fd9a49d5da8255a7bd0d57f70e929de63e50bace08a4e31ef7809965291889ac52deb00903b1c2712d51cdcee117195159e3540a3c55ebb61e40bbd8465be90bb53a0e96647d9841cc486d67abf3d14d060289b26a5740a778a62ba1a12ae9cd2d96ada3824f9ebea3d87eebf78d8a804c95a2ef1b12aa9a0d9a30e9bfeb4f9ac2dad359e78d9d91b9ea4a814a4f0f923384e7e8d6eef137e60513d82a08e41c7defc9e01aa15e61166717522ea0272cc3b7a0c62353dc250acd1d9569e770f865bbd75fa3f1a6d7c3352e862ae899f6051615b08aa9350d81dc934904f2bbd9832744fe0be7409bc73ed744c7902e97008a8ecf9458c2965418c01b838f8c65dd1b5ae7d8e9f3542a6859b48bfeaeb8bcf9524ac8c84c698a6beb346f28ac447e805f3f956186aaf59dfeff009be100424daa4aaf619a2d2bbc5bbb5024e41f6b3c9c31c7b6c2472fc40c4daecf8e18996cdef7cf8c768b40f259d9acebfa9ead3959e2f8506fd0e0c5ccc51c037fa7c9403678b3afa62bd0f72db60de5b6684d5dde7daf9755f010888690d29d7a56dbaff9f6e034f3b4e3b21f79fa7ae2265392722875f33b4dc8f482d5580748cdd6a37198e08125cf810b774bfc12447fc5bf5e0bd1ccea8f0ff307bd37a7b1b3c203e48739000423b3ea7c539a15a61cadcceb504b8a2b5fee6d5e70f6e77cb0a8b79bea76175759803777ba5cebcea412a05e1c6b95c4656c48d0151d2e736e8fa6deea1c30e818f1dab0a7cafc84c0fd25029aba557d48916da3d534e35c927fbaf5afb5b27d090dbc6f436db0921875421eefbf3320b065c41fd7c47000c780da2760c905dfd3dcc3fcb5cc70bf5382dff94602957347f1358e44543c27b39beebd26de91d61f66d89e266fa2d21a2ce5dcc50ce440b23ca936436daf98fed7dfff287ebd2a95b4e49fbedfb094147c3a0f9464894d9c4e0661fd96311d513d93358f30f3a2dccdcd45a4a300cdea79c7dadc92ea62ab30365599572a7c54d3f3a7827d9b079db97dd90143fc44432c7485c51f714987e91f5a4038027eaea3e79d2aeb1b217f81daa2fc480ac3c89b2a57769285c9d981abba1ac221eb07b5585eae04dcb82b2cceeabe39941021d0cf9918738da94901c1bb4e7cf08b090f2c333750469448c240f76f9e01f4f5d34c94d24bf3b27e7048a705efd5265abb4d64ed56c27c7f4c17133500b937ecaa8a8dcda11eac21d62ac466a13983a2c1a139f79eb63a78d03d843be524a1af5f70cf30fd765fd93c4e5b9a1c856b8a2712f97eb08b94da599992a7d8aafae6fae5a124e763924fa99cb3c8e81fa6b9f787eea915aa534eec1387a25eb3093981d34ad1e84d0f2b25fc16198b71fcd939e75ea154793f7b9393a95301a7974efe21135e879c9c14b856cab58fe1358ff31c928df5621f0a550142e348ee6cd078b744f44db802b26b9218c37cd918852f0dd29680ccbca23b459879bbf05065f87d25bac10a08ae4598486bd8c06e63f4a266e47e1fdfec4b48f33ee3150bb5855bfdd96bf878b04e50a2d72dfeffd04bc3959e77c24e8f8ff09d5a47c6646927391678d3eb195f8fa36e2c02fb93753a58a8edf11fd2340f26ddf470692529e6ffb6c0824cb2640f77f395e01ef2facc49e7f8769d3283d2d3fa34e468149ccb9526d9ff810c66d7b67a384ed1e306067e9ae88da43823e0dd3d432d29fa6bdde3aeead2f4ef0eed464b3dd47c3041f2e009e4bf9caabd412eee49d3169e3e25d1951b840b22045b11aecdfa859f5597557c1592ed51 MD = 07ddd5dafcf04956cc36c1ff290f07c1c0e5832cc8dd9aea502da677ea04fe64 Len = 16352 Msg = 22e9355dee8f5bd9ee753acca4e28a5eabd4dc284a47d49549b3928e03d77156bdb5f4b236defd4e7fef405c0d5cf87e0d6cd8e6f78545bb66aac2bf2742ac30901b27ec13ae58d813a5d581f59a59047b22bd2c4d0a23dbd9e075ab5db50ed44222b651ac89d43e4f9ddf85842516b99cfd7142745dd7bb495d9198ceb9ff0c7cd2892a2af6d94adde147aee18495651905dd709306c7245f2affcfa2d5e79ee63489beb47ecfc26579f645353f40d09942e9fed38e5dddc34ea89800922e53274f9c5773a71e6f8e6bd391a7df7ec1c5bd7e335b7c00b01cd1733a10773cf3e82cab3b8ffc2e1901c1c5dc60ebb602457d82585458176313bc47fffc0c7946d0d19fb32f0268876683b66c88eb5259c08adfb5e5ab0cbf4f160e2de9d94e1388485e077b43328364b78d8b4667b98fdeed7b9237fb468c79e7af0d01672124b799d27f9c46f5d3a367327fc2e8536c48ad403771d32d92383812e76c3d5b3f06cae163ba931a40cc9a8c9025f588b7a6d214ebbcb8299835101f0352e3652d1de575fafcb30792875985089717c03a9f65e1f84034a2681777bea8dae2a5b6a3f1758d8b2d26917bab042d3fd563bbdc6c8ea424ce00c88775d7202cc185a141f7c9648f89de055198f24946b7d90305f20338910fab812d1352b171086cb89efe59c72f5096b5b02835a2d3458adac1fc28fbae7d0c5bb05817a4d140c2c1630e0dfe9309b86a4164b6800f08df07b894e537a4a2891db94d0e4173f0ee85372fcd50e43cabecac535d2d22873e5493c122329a068b91eff820cf80a05accc36a81074a71d70398fd13f0334a1087fa8cc736b92f7b7dfb6333981fd86d5eaec61169ec31a477ad6bbe106adabe6994fbbc8928a7bfaa849630e279218f02a14c65bff3037a0f94a447d6f0beaec20a19e97310f6c1e0339700f6b6022882440365508670c194f5b0978aed7e4a5a03eb363e99a2e7e6b070891cfd04a0a43ef3fa66ceffe1cf7798957488a3f9f8287b8c30ea359b86a229b59b76ad603138240a47f3384285c36328dbeab4226621d0d1932c374486b1c86bbd4a88cef0d99f7e3c1ca34c8181193a093b392f6a95f2efad862e49af865793c8a11a53abca6b3f8d71c9688a58c3b244a2bb87cd2deaccc721a414c9c9dd1405a2ed5828b29034821b31fc67f06877d547c1925690bf522825200c9c2263d8bc768843303a174463426372e1f210730453d3b8cf6679671ab92b99ef37f0c63544737d8b0a0759770de830c006c38d18ee7961fe5921f5e3054c238cb38cc6b735376f01c9685a07a547a0ccd38aad5b3f3cf5ad0fbde3cc320b12393c3fc08b715b805a1f422e5b320828cc026cbb136fa3dca23058191d68f0cfbf7a129cfa1f67175db69ebfbbdbb4328a3a72a089a5377ea665f77f1ece84c0e6170c424a68e39ed43383f46fc8d225cc24a342050a7e448056a4fd178d4e4e75b8369bc373587c8541fab5be22ea695b68078acec60294faaa667b4fccd6e13607968daf694e1938860aeaf2118466ffada6602e004bd7da0946e10fb4a5e2efac370154714bddb7aabb7b51bc29847f9b89ad6be1df76e91d4a179f6d42b7694f1ee0fcb4d930c9561551244c602ba5dbb757ce9048d7ef8b7c05471e35ca6c975510ed597f7a35322152b2e8b2c3371538489f350e64b4fee4944ff00782c02ce37b6f89c623c4e5e66745b9a6b4fef0156626fab784ff1c89aafe0a3f462cb7d007cc6c34933e186c7923e7c466c215559bab05cd9e998d73309d94658079e0249e4a2953326b72bc6e959994414b2c00ce757ed81c4bfaaa0f74b802976f4ee82733e9ab69129cdd30e3f79fae60dc1fe7cd8e5e65db0b372dcb9c9df3d6aa248acdd3c29efd3dd7a5552a6c13cbcdb8cdfb5de9e111672174ea68befc769bdeaf6110223af2feb3b7335a83d952a8d66a471200f8b7b770cb1845ed1a17ca207e36c753a6ba87784dc4ae6d69be157ea5f8d52c1293a22c199f5bb3b580def1df9621db491d7f2e4e514fb129d6bbba6658d0f3976fd15e48c5d197357a805abac746448ae28edea42265d78364439195ad28e0ef11eb0e3fd3cf2202cd5861f7125d16d3d35d8f367f1768de2e540c1b40087882419942e6107fda84410d117ebf8ed78bb69449ecb08deba2fe9731de599645b9c9830425c60749239d486f371603111954db14aefcf0e8369ab40ac740facefa70505be43b8ff748abb0850a5fe14be775d8f964ad68e704ca529fbe3c5d9baefda9500bb9406b5931ee5ae0e1530e5ce036fff6091c71735819f6ac96e7353e3935e98286412dc0f8a9f69fe57fe1e05f9b2f4c59350deb0ab3197797bf2310ec9d3031eabbc5e3c88a6231b38d4cdbb8b08f4fe4da44d4aac51009840eed8edd882d012fd6bc2c6939a57c93a6d7b5b41c2ae5f4349d97fefae148a8fb1c1fd69fe7d89bb99802a25dc76acdf20bd71b8705f7cf6ba09acff7961e4aaf372a9d8a66a0788de4cc3c9ed1e2a8986fa7b59b2a6ebea6d546e4673772b151c619fcf0b23f0c7925f400a6cacb6dc08c8e4afda030090dc50307f0ca2b260a5153b879d49fa0a6e5e1b31aba0f6594e8f5a1586f27f8c9f73afe3a5933f10261409cced3a67b3cabfb20a5a995d5390d428352a039d302f35192eeeb715a607d486f97b73ee76200aa0eeda04508da83dfb8933950e1df42b28bb489cda94d2ed3f87b884e2a406b56449aa607459dd03208c445536b896bc3b1333a2f25f0fb4900234fbd8dff74678b55c4c3d3aa7ea53b8dc92ab928f6eecc14067f17726c124f37147558c7a345abc60161fb2a159e1895cfbd13e36c9aa3fef5a5c7fa0996ad5edd5dd3bf81586c9465c905 MD = 2ace8ba5195f54a7c501234431e99232dbb1d1365edbb593a3dd3b5810326570 Len = 17144 Msg = 9ed1f4045de7f9652af2c672e265d35757e111caae0373890681ad045b753c56a9f8a67a54f303bcc732bc6d5bba93db7b5de381078b297af56bc43c3e2af982f8943a8abfe1a8815ad1d63c9cfbd02887615c84b8497fcdff48437a4da0b8ead3cc399b6858f09c2bf69d456acf9225c317023c89e47c6a6a40b3284e7c807681c82a141501e4f582ca97f190dee2ba77a560114405293a7e7a9bad0a695a0e4cb1955f8f848b75a7754ea8d4d1c7cfea33fb6caf538c23851f8371490d4c9a7aaf02e39e88ee02e11e4ad300504a4c65ea5db39477b00ec556f3dcd210610254e9fa0809b513857aed11d8da02721930f10d50b9189ae4874874566f1b9e2e228804369ab404e7b80b2d212b90471f937193a9e6df548b131c8d47e6d60d072cb3a9d5172dc90ee4a02614baa1d144d6927828e573e5edb1fbc71700e8b573b993704d49c768e445d3821b51de1971407b43337d7e55f1a90da92e85fa9e5b1350e107f82beb5025cdcb9db6ef268f1a557c3475a5ac7e4279bbf43db3d1a880118469ec015939cab68802b27b0084ac47ab929692f37ec66885d2f0bc554049fee2dcecf0bb897db542b10d2ab03a3e7a59b5a8ed32d87b01902e65bc320db64082c9c2a0182786f280148fa63d9718160d05735d6f74aa6d6371655c71f60effec9634ba78fb2d96ca920094af85824250eabe8bb43a9ad38604b84419e29b62a9ad0be6e4edbac9a893279f0febc326a9cc531f0812955c824d261b32bba39240740ecb62e574b2a37fcd6d64b024eba013f8c074e4e130deb67789c5686fb739550712fdcba57a42bfbaa6b6beedb9bd277616fe98c77622a67238d8d147f81db6bc62ba8793480eb9b6f30dfc66b7897094cab1168f57d785e0cd76de727d7301f764a30186458ed689fc7252d60e8b571c84924681fa84ba89f3a4773a6fc39d7ec0bf22c8994a7efa68eca887e54b42d4ebab10e588b1af35506c84e5f696f2191d16d0a06bca1ad3df84e6bf65529a86a8035d0228e6cbac8cd5edbc3972689223b1f455e39710da0b41f5c7b627c8f863a2132103ac76b550e79a0761e267b07b9777302b38cad8912bbbe7ff5332f3c3911c8a408a181a44ab730e956b573acdd03f796835ae941c4a2166695c423e70d75e85080919a10f286118fe97a0f9c0653678c51726d852a70f8e1bcc5fa3137cc35a83afe21359674a6fc3edaab5fd5d43746864996adb496ea53d2af0e854893250d807d937cc6e18590ef5de352cc04db779a76f13603824f4f9ff5fd6da0592b0309667d70e47b11f0438a243f4973e8721650f9b897d1bc375d213354ef8cdc2b2e6f4b9c7faff09cf3d5fa5fde9fd2d8728e3cafd1f395ad92b74cd576acace877ee9a6a08de85e978c7e24f0be72f1d5775268652668004e92ea659e64711cd6e6ac66400a566883ae6588751e851a30dbc43c689b8ffefc90ddc7caedaaf4c8a7a7c15178306dbc2a7e9933121ef2c2dba10faf85969c0aacb5b9840e5d9d8548417f78e05eb66a88301fd3a125bfb3ff52a9e1ec6422a06fda0474ce72603451e1675f49c78bb351e2e1fcd482ca2bcf3dd2a7d8e3d8e860b5704135d185fd4af143aebb5533c20cfea857b21d5b51d4cb52a952fa060707acc4944b635409bcd8d90d3feff8bd41eb3c8c43deb94d9564f08e6191f328ec28ca14190e14802ffef122db7d20cd791165428fae2e489a7175ff0e91e8719892486aa6bb0f8a29cb559899e8f4193ad8eb219f73006a6c58aaa360e02d0a9250073dfa538b4d34a7cc158116bcca0fa895d37a1778da928354235f670a1c62cccf361ebcd1f4d7fa1d419af0c0077de92cfd2880dec194583e26130ec7cf916c67fd19e029a59b2c11c6ec5e47f90e03794ab2987a46fb412f5585beab4aa69a9939f3a5da8806a570497f499bc7495e415f1f4593924ea5ee58bc5dffb629bd2b92b5f52ec7a2cd02755c97029ab6624fe7777173cc15ec44d6c0d40b3aa23ce6b266b76b87f70d8eef8a32c59ade786a88c203601dd97df9779a0c17ff9a81923e0ed3daf38bcbde6211002cee480659ea09e3a3ad20c2d5e451ec6b2d99f3f7e1b530c330e970b874faeb7ebf7c76e5b654f984a37522a0c5ed5b4feb25fadc4164b86e699665e5cd4cda0534032ed694a92d4a275d0521c177430a61c8fe0b06235222c41b112d160fb407766498f42b12673f6362d32181f68be5b809674ad9f8e6296901db57f74b63cdac271a0624968fa97c0bf568ad721b2818709e6262ed5dc981d02d2d1709ce9fffd51ed6263d8dd19de0d1beecf3db1ba886091b48099d4b340e6e751f51ddc497f50b2ada1049ffec6ad0ebe682b30591d2113c33548ff7a94505f8b62978869b0f49cbe816ab7b91305ab644268b30fadd1e8fcdd71b1409fc5c7e859b872b34ac4081f7589c8cb5bbd8e8aee84be20c2d99dabb992aec7bbcdacf34aef2fc89535813afdc027b8091b049cbcedb64ef4ce8e6a8a2a2c5280ce7b26a6aa141c38cf94bbaacc791193c4ca144e323fecac2757b3afb6de83874ebf0cfd87d4209df8befbdd0d113a94412b8c02c0bf7c515a76019ab719dd27c4e510cff6c4684d576c8634e0a4c572f6c56e8b37c990acfe55feeba982b1ead799dc9e857975bf5229e513058834c87c142647f5c2abe77993e6131c8dc458ed29cad99277bb7c7f739327ea5ffafd37945db9895f30c962ac61917ebf66fa8c216611cc23bc0d45e60ac3ed809a99cfc27f6070d3c1ab300bfbf74e8c2c381b2d28d79121f9da3bddd677ad9e96269b1b05cd3ae4d105683f1fa51a7886aa30899d8b6fe6e77bd7d760c3990e701c202a7b5045e6d17081b2473b510908c962e33eadd6d7275a807f44384e54baf2f56d6aba307e5574f301fd2a80b214fe08a686cf54971c0eec21eb362c05c93391603e4b690fef7b62aabbe328084de0b8600060779b47f1615be05db0963d667a8f70848e1fd1fc27190df5c57025f9f88c25f1a MD = 4c7118050c64cb293f54c5cc199e99aa87c0a7aaeb7256af498e82d535b994c7 Len = 17936 Msg = fb9de43c9c7860e1a3bacf321b5922ea1d15e6f43950c7dd181f538a60a10126d890725fcd15f6d2b4e152c31079c11296d1386a8f1deebc7fe41cec045601ca00df2a43fafcf0d9c24e425054eda5aafffe7856c7887da50783957d5b32cb51bcb39450edd555dd17292640b05cd69ba0c32f1fa7387b7ff92547a52cde66a5543439ef6d472ec8f99b87fbe96e5dcbc149e42df8d6f0349df1b8cd4101daac1089a08641fa8281b1ccece9cacc4124aab81fe88109e5ab3b10725b6044305038db527f329759f086e3dd721a1e8a8da33769b80c7a60cc1ba9fdb9524f6f771351d54008c6bcfdc208e2fea00b40edf3ee48055fd06c7f85e5df4ddec99f0bea14b3338b2eb190ab6584f5253c6c2ee306463744b40eacc0eca281ce5bc9f3054b73be827843918b1f4abf71591637bba7ebb680ce503b15e5cdbce9acf417ac1f9e4bb74b77e8a861bdc44c0944f0c3f8beeadec53914ccf8e965f665285f27b8bb41f050577d4b51636c7ef400414222473c2542d1202d4f7de6be2d6db3bd3d5208f62fea38bb17c720cec35112824c0e121cec21457f0f11a609adccfbb8d6ec08918f380242dc6e46061e404bc99f9cd58d6c306c0c632e0d9e8c4c1f5ead10a888184ac126c8e248ecacd3d4604378ee3e69077e1a715b834773f607f8e74653a573275fb002aa8c491614958f5f2ac3f78cac61f2612070ca0ad09ccdaf166eae48d7c228b34e7ce4030b779d1c3bbe827d29ffdc5c053cf0f8e5c4272b09626c3e63d4d602567e871cbf60d4a13246a6e3863e1f8a934f81e63a684c83a697a7fed27b01184bfcf80938397a1797c22a66c90805125112457bd97185e0757527302ca1f31cb55d00717eebd8a5f39cd7affc44d41cc7eb0460c9c51a6aff65b37b7a2df2371a0967fd9a5d3674cc3b756626dad5d27e43853c124e5348cbcd1587c30747910468f5549376dcabad07cc3350b1505afd8391b8bdf278a3621613fd0f173a51fae2721e712011731b68a3bc81b38ddccc11f07cd09bd0a24aa97685664512a085dfa5053c421ef4a0c6c3acc1c7d38174576a2f5630a46e0dec05c6d17919a52cc757affdc34b55c389f5a918d56c707cbbc67954993c2e32498a69579b9589770250c4bc8de0bf0d19ff5b8fc69ed26ca7ce04d4bee00b4227cb150193cf73eef858ed7f87255904dfa96c2d80b2cfcd824875dd87d82dc4ee9273d6490f8c1a1137d25099624c3241bd81fbecf08e26b4fd7778dc6bbb4005a52bdea59dfb82b6b41a36abdebf1fa80145fff29f38ffa5b5b0aca5e3dd3fd6cce42190c0e9ae4d996d3aa5e2db517d3f5d437b08f4e0bd38c881ca86bd48c8d146a8f0c17e2740ac75626fb6c752263d74cf6d74eb52644d68ff339d80e3437bfb7aafe8e174f5b6d7b8f2a2acaa0dc430a9b22945dc02be382fc86f5198af91a89fb37d3b1dd67e3e4414eeb2df989b39db30702907ff51df18724656f075dcf820e6c8b3ab49ce500dbee1007b318c386dd190bf5ac3cf06c21768b772fb2490042e1172a5b86cb51bd9c4bf063f5dd5657bd3305db6ff5436a01e9da7aa301b53759fa0938a2116764bdf16062ad7b7cd187fa49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533d8ba92bc99a588fbc2bec3f3154ebd4f68629aafa8c350401e280a8ff1abcf9fec7a5e3982cf5d830f22b3d4619d33c777d07a8e88a61a894897f8176620f2ad5970c5255c652e58b7b650ee4172567523a959b1de68843390eb762d730fe785a6068f28304e43a142e462eabcb56f82f355ffbfb1f3d6667e8d4d791e60f7505ba383eb0574e4873613b06fda4ec6156f3c34610a2e58499be345a271fb673601ae6b16e3be59321daa0326a425a35720c6c03ff00151056e56255174c8825e1f910d51d214e9c97e1323b721224e708d5c6a006b540bc17f4fb72d2eb08ff13db33142db5ede74e2b5d8c95a2e0e873f64fb4d830fcca65734c1dfa799d516e37ca19405847e5dd0f8ea04552f2dc4bc483ccd411bdddc7d6e0c0ee76d9df69a5424ed596f12a9d04420121c0ff1508e6ef229ac5e868a79666063f7122fb8e9a381f6dd05e1836a014398b7b4a3533c40e808cdc10ed9d4838486de72d38659d181569b2f351127971b412c088af44f24e513aa2cbff0152c421ea473d1857146ecb59bd6547b8e6f70b285f1f05c4e84b0f24d88dff8c4cb60d352ff70dfb96b8abde4e087ea28ef0a96ca591bb3c1c7124cbebbb7186ac7a74feefdfabcb9a622147d3716867b80b193012754203155d3c903af8f798e88df378354b543fa607e6271c14976118b2c513443e3cb2596bb12264aaf42b876d03616eeea9d03026450c56868e3727644796a9410dd25f291cf2f765e9c70f941f2b1b2e0f15cf29d858312baf424aac1b3ac04237eb9d11fa7241ae5af3f79fc135b88e1688e9af1aab3a988d2b1906ba6017a63d56a9b2b430f1e8ca2ac5ec7421d58332a206127675b141aa4a18f09fb71df1a0bbfb87e4bf7699b9d40106b27fe0a1f5e9aae0963853bb8937a0e655a04198e474190e066e5e55aca81f7b0690687ed2d85eb5d473806aac7c6774569c31107b2768b193ce079114ff97b5db03db5e5be677fecba7d5d37670c3172d3b5afcf74e812f076f00d075430053ca6ac7d4f3acbd27e655b28a99bd5a4b43ee2dc2db41f8b2ebc1d8a8502adfb13f15ac772c8364cdbf0da4f468da838d253537e689aa2609bb570d6d380f8c7ab394f7c97913255ca0202ba57620d5596b90f7ec950f9f7ff0af0da39f799cfcc27948206bc46551443dc5223458c63c6181ec598fbacba2263a67eff8f187d3d6230c30772fbb4815d6ffdf45caeca2b1a893a1dc6430fcc6698ab6c6ffe38c8932b26e2dbd7dad9f5c3a410cffaf28d6557c49fd74760c4bed047c9c0d36733628e92de1e642fe4b6e130c0c7f944b4a1904d68564014d311563b5ea91d74477660f144642a1c6a45d0874c6c312667773dbcbe6cb493c1083070735366c6cc78a92a5cd4b007324d9893fce52c01708e65f9ea412d45564a68cd50e635c58a0f71256e977e590574423a185b MD = 906c5b84ec1e480195860d89f859fc7d3c5f67f585ef8b738ffec08a3c07a98b Len = 18728 Msg = 58067ff7959a1966d37fce5cf06a8dde6e1f1c676e91b02ddc4bbba5e70e0549b4bcfe9953745360f2ffbf38506b245075f5da6da12d462f8254af96a9094ec43f25a405f4e3110c3944a180afb129b7dfe293c12b0076a80406eaf65e6d9a7861081a42622d7bf311151d3af485c59914aeef69f653661fcc2911cded8310ec832e0858839aba9ce33bdb70072f1f807c21986fe86d3e1c4185cf243e93d9a80b6014504174f68f157f8229d0f761f37f0333daeb982727cbe1c90239e51c346364e9318301565511a7ba6e3625b07b851b6bb3e61a49c9d207aa6fc6c00219f1022d03308b03753d7b2d462400379ff632e501c03ccb89bebd1873cd6eb3de1f0489ce3258257703c581b97fd11be73a104ccc6346d5f0f8ccbb173635560b5430a49b70b0e3e4ca4b5ecf30e087dbb97d461db6809185e6fc3d62e95e1328f7502771d2dd6543f9d66d911f75a104db417bfba13125d0f114435dce3013be722ab9594026d41cfa2e550634d891e90923956e0ca3b95981de780ecef57e542c87035aa2d258f8341bbf3658508012a9ed397edf1c76a9ff20817fcff37c738d2eac7ce02a185d0f65532a712796082565113402e58347d1a309b8ba7433a2fde95dc7e3763dd6f3d3b8e968a3fa52e354c5975e4609bb612fb6bf78bece69e47ebe4491feeee8482f977b260dd5784d81fdafd986308e168c309ef0197350aab676fad309541d763f97e992ad4e03c9b660855cef1f475781205d09cf4be0b7592ef292e096fce5cc613a93ca8e7ac1b99620d0c7ff6e8ed72e02ad277da0742f8d32b4ccde0dfe9d9c7613adbc659c5348891b57f78b22560197c368311947ff3cc4221351d9277cf1a6f99f014dc24c1ec627e730277bc6422332db91d19993e2afc5fd19e7c92f08d12de685b89b6cbfe1dabfd2c901ef98afe4c8c252d3b128fc84d45ebf4d7f88ff96ca6f318f7bd4e11e2604fa1c99ac42c077ef245b22b6b246de47ea19341a381e95e73d064004cfda66ee41348b26e4ae2f3ecd9bae33d9f565fdef97166585ac8d17666884f8b2f6c5b926b18ead9d9639d7d7f91c487a78afa8562eec12ed29fc25331d0f5792598c8d31fb6ae97660dde3cadf369c9cb7046ea84580c8797b28392c8da9ca78ed0291eb7ae78376f5638a2cb4c2d8479aae7a6c469830308b5a7cda201af96a9971eedb96cc23a63b13f387e089a38309f4f22a98fdf11a41d915c43f298b73451fcb8ab8e3700c1b354762cb53a659ec1dff6ba377b43f85ef2d7350a02998d955517e46f213b27d10ad46dde888d02b72c8b5cfce21a840e2ec6dbd457ae33e5ba841aac2b3a04aed4eba7e0ff2f1ae3b769384c9df5c58fb793cece1275b5a79f75b4a1bf9dd6814524616928cc35dc0308a2a319763b782fd67473bd70816f7665290c58d71c1cde0720d37fd4e21481f2429cef0c643bf9f77341d33f35b1c1fb0e38716643c6020c7cbc7ee9ae01c6ae8e968938ce6f988f31d4de2230f3247fcaa2a3dbec0143bccb80906b084853b5ed3c727bd877adf6369948da01b7f09bf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c8b80393302ca8803a107c0c74d5717300882c0f3c581626c7a41ca8776a3dde0f5c7d029f28a9bcd3c4daad2ccf9d604563f95501e256d6e0dbeafc304386185701d7c201fd258d8526464b013831a8bc8cf3292095316d5af4f97352d3bde812408a5df31a9a76e0ad25429c900ca0f87b901812d1545eb877deaa69ab33b1d3812b32fd11870d58c21e4059675ced6ba8568e43372e2f6becf10def3a860a1d4c30ed8a7259b5601d87b0b24ec0e288abcd184c273d63f7bce71a5df23355522a21ea25adb103991808004186c714f1fe5a32a831e070ee70075c3062aa18047374c55933fb7c663a05db91dfee192a088469c1d7d5eab2aef85ff11c88f6c6e0afeb8f95b7845a0c079efd9a94638362e22a33998c35d6b230722a802e45fbda49d9435363cfd6f693c71f475868a085e9f067f751f6dd22365f472e289a25c8c92b1eed8e937f9210e06176a8ad03fa0258f961e58238877053d186f667d744a44d7cd4a693b65735775ea913a52027c1c04279b58c7b5a751c541b163372d671ace7993a251dce47f8714f17e577a7bec2ed9f205a1803baf5496b1691aae6a7e5d9bbb7ec186feee043e923f29ce24fdd5552d49f912bc89b1bf765e6c20dbd74edbcbe4d28a480db40f7d630e27ffb7c143540b1693b246a563082c76aa438c67e0cabbcd114a425e30b9d44fad9583b9496d33412aa34ef82a70b9807528077153c0edfa428df6cc484e7833876dc7861282a8c2ff190972beb5efd2a915af33dbb561a1469892c400453904de10ecf0449a54e13b9bdfdac4dfb4b36d8fec7721b2ff0a44f37c0f00a5fe08d9045bbf88be1ee606b238fae7f7f26de9202603cdbeaf7d65271e75ef76ae89a1d37bbb85f5ee1887e47c98cd049046464fc5a086e25941d1bbdfbd75c133cd5d04b3ace447acc0e7bc137d1e0e7687aca43116f425e59faf3726b13b8d741d36206d594cbc40264dbf6571831e8c7742a8d32dc08f3bdf27245d17e9e259c054ae108b665d9392e277da3ca33aba6031e211ad922844496309ebb827c8ca00de36040ada318b4cce6bdba5286de888a0db545d11f9e624886e385c9b48af23fd41b09e4f40119b3823ce75b7bcfe38b8190506e6090abac1dbaccaf069f072d8567e0f6d930ec948281d74fb31e4b8a1268a70b960995134d9afcccc34763598fdd524dd31681c28012e6a99d38250828a4d633107793209efa928d8af27b464be1da6472209ddfd366b1f3caac04883cbb4a7f60594a569a602a7bbe4ec366522bf5e526fd753f2503b5b8abf87e7ce732903b162d0f17c8522111ddbae05c2b02111a71fbcc82cd605e52b19bd77880a13410a2717606914712ea89b5367a4f1ac8aee3a9f82d6503386c8c04c3edc16da27a85b503859db58c6022cc4a5336bc890cec967ca16462c0609bd1a85f021e57e340663c273633da0d396ea0696a8deeaefd3fee81441582d95171193ecb29e0d55303746e0338985c4e1acd4f6305461fa604b24fac91fc215d618b2f9526c9eb4e2b60cc7d3a53d7c16f1557a8994bd977936c6ed64e98f300316283f87b7f7f824c75b51ccf790a43da3d34b3d04c66d24a715179c1e5a8fa5f53ee5dce8e1cafc527da5a5e946e45ca99490d40e43256b865aa0f826ecd9c49c3c13d66524d27440b8ede6e226e37deb MD = 09247dc00c0060232407a4e69050b5112c9f72a65d7b0ff077f6be180c482cdb Len = 19520 Msg = 0233e1cb2016c8a4268a16fe8d3a980128ba62024d1b13b135bd5a94a565b9b4ce8f899673063f6c49b1ed8da3b00c234ea87823ba5abc835b7b90a74fbfa01c41388f888dde3ce1a56f44deb379c8ab80b470e19496afb59f2249701701131f23d3fa8bb8c7476b016922d905bc54038489512321f675b1c75a8ed645509b253b0bd3863ae9e972274a8f66e0a2399122cd23d0aba395dd9bcd66c420d7bf96528521605c6ba95eddb8936d8e53febf2429eed278c597a3e521d91ff1bb07da30ecec0366751098ec5b37d655f62bf45044bb10d083046a6bfeefd00027fb599de63d56a031a5861cdd82897eb3489770c79172fd056399f60db1bf9541247b611b1b4151c5f09134e37d6e50b3de124a5979e046743c9a4ef526d4f83109a943358eacc3597921fe182e6e151e74cca7a37a42f2f818d43b5f56f8702032490dd99e7f3c16c99f40219f6f131c932d4e4c9c804ab87daf85f34a11473628c585b154a205236771c3a9d85a94d3c29d09fde78396ddf693f3580908c39a72837465b7fe66a9db014f56df18de6e89849e5e64311e8e08e84f379bc62d7598eda19dcf79a6d0aeb6acd0be903913704ad6161a7329f43d165f370932cdee2369d600a5fc0fbf67f7a1c07da9efeb005779ce123200361c85ec015a33ea2e9a61d9364070e79f8e2ef7ce224d471dc0144f2d5254ec7e2d9ebd3c96b3cd5c853c73e8a9bb7797abc276a1b76388d139e71fdce4c233f1f9c79c91c699bfa16d626cbee6c707d0471be6e243d2fb31f139b382cf651db907694fa8f1cd0625d83b8c5f017adf72e9a10f38cf84e8627273d1c81c24f4fedfed9f281f36ea0f512f9b7401be46a41abcb94c6260978f44fb4256d2e6fee70ab954ba58beb5875da660a4ef7a868e61d4abc6044e4fdeed3bced3f995859d0f373605a54cadb78608a498d296e5594651ae4dbd365977f7993ce89a18cf4876ce0cb20dc91cc553bd2ff7b2f9ac2d519b8a899600fd83ea7f563cbc57240ec8e5a068991b48d94c2dc96a988d22310b1a07239695832a4c54e278673ace1a8ce6b8d0502b7a1cfac03a998a39918efb36ecc3c6db3393a780a943a3a914924a381d913ae1f9b5e4df492b93e53f6baa5803102cbb55e7826b7346798c3d9f8b4397545f250fcd93f0c0c9b87975f19ee612b3d21d304d667d0828f0cb9268d56feec1c8e0028c8d5d651a03de7b48614ae253c0ea0deeda1e2f92114e5b16b324e97f7cf81b195c8c01c77bfa99977bea3b99fd0834f266b6b22ce3fde0d0aaca51378357a29d87e75b7728b617067230e52d9161ed8092ad579d6ec168bf44c9ee90e6e3df3f97d43dd313fb3cbfd083a7b684dc80c0e76be78eba803c0a08898833ac86192813bd6d8243af52e71c4a4addde6034dbec5829a6d024a5db7e73e7c7dd279a7f8309b42dc0bb9fa9dfef9749a8d753f92adce78eb793e9572fedd2f582aea86d7020da7c93086c2ba0d953a2ea2823412760e7ed77b750a8a2601365a1028c1a616aa716c37d0095e7704992aa3beddc6d4af26c197624f65f3570be450d8eadde4fe3a45801a5103d1c40bff2f8f8f28404d0b3a3baab68efd2b2a973b6f54f6f3755cd5b7ea1c42845ffd1c9478eaaf2f44969206a2f27d9a1a1cd35e50b279d8ac63ad3db3dd832534f713810f52c41842536956ef65aa50804d39282165eefb0fe93c800c174e3aef847453b76a1f81b2bc40cae482adc71a46293765f1bee11c57f43d575c2c2bec2fafbb05931a02024b88c116fbf05434a233ea72e872015e3a64a41a0e757ec75335f57e603c0fdd9bd1e81b240a8e6bcbd9dfecbca0f251fb1e82f8c0e2a9ed8997b186540e0190f79c9e658d64ec2c3d9b8637d0b43a7424822847f5dc43db4d556dc1d0f89dc91949526aaa87e3f261f95bf8d72430514120229c2fcac32d18ef889579941ae26b78a2af0dfc0c5af363ef8432897a55db88f069d146ae4f76d6a095b0593f7958ab1da72a29cbc24c7bbf8e755c7f1e5e1d10357cd87baee19b342717c041fa7b4111e771a9b8c4e7912a5c1205b4f7436d1093a4e8a1e7d3bdb1ee1261e8e24deb2df496e449df5f54de919b2dc29d15f96fe8cc0fb776e7beb84f22a68add4af9d032ec71f57e1e374ab3633d2e6c50328cc964a632c8780ea5bedb16ae27ed0d9746f4db523d9e98dd361cac3ee18ca9059a01548a791f3e08d1ae2ad96ece86e1853278d67a6b2a248e29f39a9925ed58ff249354f537bd501c1e6b832e4a065d9247e308c10e4baf401dbbb7ffa64ff54d30daf8c97c1d29f2ae4131c2fa0c59e287924fbdf28debe06a6d2d81a8717928d8940c6236dde4f9d0547be958f964ea941f31bdb25158e3827041cb86d243066e66f65c02602f96171db7fdd15e1d3edfd2453cc84674ce087dcb39dbe2e16a74cc4d136944585bf4f57c6d1dbad143dd6400d79ecdce046eddf0591233e2c97e2c8734d60afdbffc744fd378902f9e0f4ceb0ab067d33b282977a5c435a5a80d102b1cd3248e46903298bd8c7e86a207e56a42a7a512b6c6e8b7bc5c88d88a840fbf47db1198644288ed87c3b684f439d6150beef60b1bbd8436e9557dc9e585839a5268629aada61fb4cea9089909278761e2f0db3aee9e848bd949b5184d841462a9059803971d4f94fec6c541655381d75447d51083cc821ce8a39f3227022aaed83d1271952a90f494878cfc7d404debdc6e742a9fd9d560b3fdcca606823eb54c7962534c509c6a2c75b048c5605425f7ef28f77739270db7b2adf27076e93c923518270111ca5c231bdfb4e2562d0c131473f5ce8ccf6a505cb395d97282ab361aa47b7800934114e48bbf38744114caa8e5a3fa27670d3a668e0ec5e7c367a47487bf058f9fbf8e6a24c64c5d38b68b06ee907eab666cc26a9ddbaa59041859ed42603e21383ddc073b68a2636c87e0a8ff39e08b461f84d3537b1b38cd23e2df550d766805329a564014cf49650f4819a80eb449ae9bfe2b5f6b8d299720cbe5402562c67f3455d1c3691751aa934dd3799d6e68d8489afd023b648dfa757179844677bf1ec97b0445d43f3eb5da4e60d444735b7bcbe7a2fc5955e85fc88016a1cf29d45c58966847c49b430f4ae63c58b267a4018c60c79e43c5cb3f605447294e0d88d068246839d8b0112f4b91e06765bfe5020092d5788938a931f37a857b31775ee38ea19eac7f121b9e72cdd790ccf060d5df0a471ba822f4afe86f5c28180bb92e228a76003635e4c547169c65568dda256e13b6e81f195031b5bf25a0703f4a18ca6b88e58c9fef4c4ef8a94590fca359345b8f7e6c802e4ff1c68c84c896642becb141cce0b4ad8be0e078b21ad14ef9d85e4b3f0efbf15313320b358f85b9e01ff82b16d118a21ca36aa54b42804f7fb07874ba74e14bf3906 MD = 7b2e8b28951a825924aed1b26e9c197ec080558a97120f34d6e22e341a90c978 Len = 20312 Msg = 03d14676ac6afd0eecd67c8ebbb62ebe952dfcf935952984a1717a1e66a39bd825e0be274e6085382cda228322afbda334661565c8586b1faeac9c435f868d33827ccb57b54a736e89c65021ce1644de1220e9e3644277995e43e924628a5b38238eb72e678e90570c824e9049518c163744be9c90bb179bb61faaeaf717cf8e0fffc8d3ee96a49cbcf664f71bca5df4acbbddb8d42b11cdc02626bca695afde4eb5476fd2c877e4a20bda7ecae77e20786b8e5eb8fa2ed68341a7c3f86cc4cfe99a7c29998ed0d8c4a7f74fe012b941a33e19b6c590365f075973267405d60ae795ae2acd4f791f2cb3048fe5b2d4ff361bc5e98256f10f5554d30ea3c6ad36508d2699f5723862e21849695f2e980438e9db1f78b2278f741c0fa30b1810fc2d6c2d9f9a61d649ecbc0e03d8f0cdf5b192a37f2d0d9f866c976f0c3664c8048519096443831b7b54899b85d75f3b7da9fd65322bd0229d46af3b72ac109ef5607c020f7840cea122663718e5e3a94229126960fa61787c094bbafcf3865778c67d62c9c200b9625c3a2ce489e4e1ec38b9f62f202a69cabd5235d3952cbe34c0046fb9a72ba2670cefc0104bcaa924dfda56ca2791bd2f6aaef41e1a6c9ad255f97308b1295258396c3cc4b3feca92255dcf5797003b5519463f0608adb2f98e44b4dd686391dcec99e82a4ae60cdd122aaafff6deace1d2025eb3e956cf5271cd7b61533f269b2c5e0b6797eb36adae2a2fe9ce93d87e9bca984c44d1b984097d0fbbfa26db3e01a3eea6227512ac0243a53ea68787d27e8637faa28538385b3aba14e581766d7350da0d74ed6680155e562507228185821e81e48ada141671edc2949db6c0cf8b4d15c414b9fbd1ef6488c778cc8d40af7abf33843814c5527f7062a92f810d5082e7f48a439948993b844b81ed75ab0e83380e180702ee06d60ca7915281cecbd89ac55ff2078c1acd92daaaedff6da61f369ecfafa43896dcde8ade8987bb0235755e1a2d0f467a00f99c7c34f42e8037ff0a3098c24c09772d34173b5d7cff83bfe8435e771ec2be03b87e2a1b98a2b4dc7bc42b26d1679143cdc4cfc9b8caa8c18a63ec08bbf9eef65739373e51167c151911ce9770b811667c6daf9417698ec36d013f8ac627781ba033c42301e479f20ba1eadcd105dfdf699b428643e61b0cb8a5bfc5e65443babcf63793511291bb7afce8be9b55e3f6bdd5f066e14839e694d7d481c489391bd20afa56e8aaaeb78da82e0577b105f2a0a421fe9c98cf972920e68508ce41850bf5733470b3b72f6d2f26790c202d1d398f3d1419ddc4689e075d9a592943428f410cf58e36946b411937e103aa43bdb11eac71031f02a11c15a1885fa4289885752c60ec3a2db332ecc80703572f1b2fd9d7dd0067708acad01a17c346d6d0151a3a3f32c76a4f683243b1b530d97fdc49241fb8bcf66bd1c2300e2d17363169b7a05808e533860a720fa8c03c2930e0f5fc01d5267c8b58734c3744203005a6d4c573149d70a2413594b4ce8408786265c849fcadea33886ad458b168ad92f7fa115a01f609e934023a9c840e5c9d8a22eec0d75a28ab892f323a1cf7932282afecd475f9e6a40c61692a8ce40fe881b3d82e0e341f3b824acca52bd6ccfb6f7ebea818adef1af0da89248e0e07a16fa0ec5b4943b52b9b440c61890c3e65e7ecef9f941a0d9509f6025331922e107c72940e2f90d3c2fea35935dca1d3aa1283e7818e48265b7e3c3c7f1e7a6a7dceb0371168226249d0f21aeacd9e711117ca0f16b14023b57835a070fdcea52f90e23c2a9d0248083cb6b948030a02e11e49cd25a209edeb1f6794ed7594c66fe8910d2276366f4767799d1727ed6d6351898a780cab6a459a5c81c02ed6b585fe4411c09ac8bd4e7cc22e1fe0509adfd611afd5952f840b129cd0afd19b5ab9fb83b0ceb2bf1c64a11ad428d73a719cd569a205e59c2284aeade78306ec9d5207d65212652473d3fe08f7f9b3b3dae4771acdd0a5fa2cf99719300374d0669a49c65f565cfea9e1bd14ff5b1dc3bdfde3ab97fd7d5189b2f46811f9c44f9dd7eada3f603e55a8d703c65416bd73023042a4675614aa23f7ee20f42b9d712a52119b5bf8b43257fdfba75ef23aca91c5bc8ea7a1130ce110adcb4063a83ff553e78f19e8669c9e9aca3e86b73dd0520478f0bea72180ab4458f05d678dc0e6229440e2f7fb9b65f79b13322c6d8e2e359f521430e70d69dd1818b3fff3fce6063f361fec1c37945d94afcb1a730b0b9f583c11040dbb032114caaaf582fcdb4911f7369070791412dd99ba49f650d38bcc371dea3a926259758eaa10e3c7af31310d91aba068cb5e9f5966819f636c4123caa0ab169b6ccc62ec1b17be654807c7009605530ca28b0278368a164ec009847e020f4add0ac4046d65d3badf9012fd56af65326e81e02d7d942b0219b52b17daabde7e6025878298f00c803c6d9cf9994394e49551a449f0e72e0bca35ee066603e0592da35e05f62489b884c9ebe350b95b1289f8207d5a9659da6b279c76aa73dd844b6e91b50d6a1409c08b48e4047b806453609cf2420b751703727b912f619ca7c26c68b96828731bf79bfb243cf0cb81fa6f5fcf30ad496a9b00d47f7c36e6699b872b3a8cc76f9731e14cca80800612860fb33dace49f793ab8ee68195b8372dda5215f03b0d025764483fe5893f7be0027de643f183defe88213738f363b6b90b09351544a5e6ccfafe7ea4d91682e6f9f296b70b1ec72ad4689c86531d6fcbd8fc93707fce1154307c1b3e6e31f0adb5fdc7bc81774aa92ec999023b31bcc6b2a0b3aa43020c7db355984acefe4f94d4e3fbbceb39d419e5d8bf35223d384a269a182b44de42b9e21f783261e81a3cb569a540aeb2fdcda7fa71879ebc6cb6a34d236bfbbf5e994b3e3d8dcd8bcb1605e346d0428f1264c3b35282072bc4acc73e87f4be11ba8c5d464ac56865fcb114f562f45d3acc4fe7a7c4acf207da9cf0e2984e2291e103a6ac4271d8e3098e80f48c254522861f822c5a70f5dd08f7cedde6e0bfac5cafa5e4970b85af8c1ec87524db90f2da3401c586667917fa4d9f94e644fbcd97e0d993cb0af507eed259fbcf8fd708332e0517db160245091f118c38f34d823d37c02e50e8bda8cc59c40cdeda7dff1b7e0a87cad807f0cfec933831644b468724e808bb3d25fe8f15850ce513fc341da46089c8452087b926b33d72207b973038bfd77c60f475b1861b8074f4d8439421c5b265e5b2864f6defe07db044f0b2d3b60f270c7f9ade2c061c00c5a8aa2986a886262254790d22a7e5b68c3dff798679142d984dfa6f97c3241b3ed3c4383367798b937cec8cd58991bf2cccf00ed1777af28cd600e029d12d16a8f04e6ac8a10108a1923d28f6e398ea0a889eed451fc83862be4aca82cebba59c74951ba6d3b11fe54b076c17745fd9bde7389f41f07041a25d3499030a442aa1d744d56e8e0e53d6fdc7e0b78a5b00af6f798f688817c0d4396ad65b125b28219eba22801e7d26ef20eb0147b41ef16787ce581955031860d93a0cdb85652 MD = a5e93544e86eb9960dcfcebb6bcc461d82f119cae1947e340c7cea1c7f351c0b Len = 21104 Msg = 08be55573177d70c9eca518c96b457677ce07e31a126cc295c536c175d28a67b3ea50fe35b87fd9de40f3e8e30050a6254fd35e6f5d9a9b15a8f140ac52cde0604195ef1439d4def24a47be312bfc090d26b36ff5a96a520e75f3fb34a1e8e6982a4aa4790c4af4c87126e53e3ea633b1bb4e8447a67a7bc2a4c55dc92059eede2cd5baeeb010bfa35e081a64b8fdaa95a5fb27ffa5398cf4cddbe4b45e9f5d7491cd9eefc5e494255961ba3f4b40d22b5f5fe7685625e9f749be3c90cd27d72e11a8dcf6ae2526c0fbca3148364e4f054fd33f2c19de275cb0c2a1d8fc91d05d24edd19de950cc08ddb83bfa3a4475a60ffb8bb560b0c9879bafc1175d5bdd744413293ff806086f47a226cfa7e1ea70184f799edb5c552a52dc26b66ff45315e79f50776aa36056f22e8e530f951205e1357542ea1f3e977ebe2f40c4e9e5b48808c3bea1c7786235a3df1ee1dc80da03440b3c0d97fa6187ec6740ccaae9d2bde61f704dc09513baa8957dcf36cb6ee6f1a804c6552d1b06ed4b3117b5e3f2f19da056cf4d6aedd9a34e0a1822362714d4e81794b53b266417678c16a97887bbb612cc96bc5e532b3a654e5d3d65a5155427ff09569906381138cc49e3fc2384c5d33c34abd3d617c487b52ec6ee7b5105f41584b7eb5cfb512b8c31f3f338d5236e30398a8ff927e801c8ed7d14fc5040d915a737967d166ddc266f68023a3575304315d6d74ef3fb701419ce9daabbbb5359e1741ef911bdb72542ae9dca1e21e5ef5a2f4e19d4956f014419cd28cbdbdf6cb3ec095385c749236c361a5b07cfeb8f56e2591c724c3b2aed0d47d93908f9c89f1dda0eeb210e8b3cad2c5f8ab5bdbdcc9e8cb9356680fb9507825e5be91ef8237805adaa3173e74462385a0fa9e9050bb25d62969accedaca7010adcf2db75b18910925b9f15a203f3c2dd1ee2d9df94dc4fbb2e5f6b9bb45a4861149cabbbf9cf9f6f67c070460bd0505b21171ca8186ad825650b09604c9fcd139b6cfc454cc9e697673bf06dcc966546cead2e18d6fc8b33c34412e5d5f60384e9da69ac2af69a9cd2682273b6a47642601b9a8c80efed58d1811496c0db8027887b605b24d4200221db92e26a9907b09df8ce9d76d3532708588afdcddec78defb67cdccaf12b49de1cae4448c29e23d0bb46a659456100e020e2753d7e4e2a98121b9b7dcbf0e68f91f113e1efae1e90d9af418894ab88f170b7a7902888800a14c921cdc3356a8ed1e7dbb64ebbf356ea54e9856f7721a4ce770f866c1b10ce45020a2b854d4884631ef6468e5c64ab53c428e034786d72a0ad1750b75a6f5d1962bf2770cd02e8bbf30e131ce3c506ac996a296213bef38dc659bfa8db0e2f1847bb3214291c2443009d9c7906a6e16b3137b196cda8afec6f40f3af215fbca83d78ebfde606df9eb3ff4331198cd406281c29312abcf052e457cd38a1d6ae6fc092b58c78556335a9ddb7c3b0e95703ea81e0dfaf6e7d47d2188ce3f1254cd55d731f4e748a779e4ea36aaf413ed2eaf4f388e0c03faf41c50db32f83ae405f80a499b25f08554f1edacc626f0fd031d40b71e30192feb719a1e079ddf3f184b6a1a5669c71a4be96fe6d6b8eeee76f04144c54e82ae43e6c7f9551547908eb8be4d2c9b138ee635388ce59253e810901b878c4e84a083e29e13254abafdeda5d08926a41d09ad3b1045f89c6712576596277a18682d34cde8157e2382aebf7c66774b6a2db22964bfb919be7495d5d879cd9895767cdd0e6da66988e6cc8ba449bea3d68bb1e1180c914fe0c099124f8e20edabf5b6060ff56fed612d7fda85410736d07e2f5dc0c175a3ea944595339bc981432f02383748181296a0ee338715fa0d414f5426c2a40c1bc438c1e6ed696f5c466a89f9ee2d48e01087421e128f3e2f0f4747c3887effc256f4368de3c0bb879aef72d49c6ea760b52aa2238e757ca424ac31bc7816f59d8910cc127f6755092906e64ea9d1de996ed037cb63905b7566c6399afc3697b643d3aafe2828e4ead9f60df17e1f959324c2299df9a884a9bfdf88e47ba48d146d87f9d945c9103294090e44811f7357bd499f22b9859e48163d45225d297ebff072e029401383ea418512cf1b9b21ec23abc1e009ee525b522999dd098d13c0b2dc887880cee21ac8b3401bb459475a3c30b86152ac48e85debac9be998f31e9d0f184d6dc2d8c811dbc1afb5238caaf222ac2dfd8827fa1ecba5e76412c6e19852b9316fb60bfe0345bc1384bf98e32bc7c4ca704798967d11ac46e2c236128aec93abee7423c388385ad08bf5140dd16929c215b442c66204eb42cb71e9b75d26cd4352c2c92087fec36d318fa831cb4e039d5396ce91b5ed876288e787dbf84890810369a51be9dd1e72dd53fb5601be79e191b4e3005e14ab2e7fecb983439a03ee6a315ebf941e9368f90bb6845b03b31839d72a1946c17d2f194827b926634f11ede19c1171084cd6ec7d80c3c164dac9b2c74ae6533c25ecbec2788489ed9b72f543091b68e56e441e72021c1b28167d644cec6f6ecccceed72454ed547e109aeb1d4be462fb243af7b1e49651988ebbb72eb8bb80bb9abbca3465fa6f5fd61035380a7445949441df04cd3a4bfc6b0b133455d26f4fb6dd01bb50b5c2d8145c3d5cefd4fbf6e6e03e31650ff29cd4f5e0286cbc25d149dce280c0263630f2076950a10b6a6943a07c01551d2cbff20286d0a48188887a3ed74d5b54b1b1999823dec9217c37d308013c456ce2aeedb96df4a62a82be728d47e8c9471ca13197d2cc0f1f17a6bda035aadc05fdb2eca3fd5e1abffab958509a1ab3076049e18ddde31a0c25002af08112c3ef631117469fd5a646d7c3551037abc19d63f1d201aeeb93f08d8b41814b3ea232fe13972cb920f5c90322915488639a100fe12c7bacac21d337902bdafcf420d7b40294ddb508ad4f651e33a4f40ae7684b6016833fee6dbe0b560f83fdfde5e46f2435e0f95577e1e5016488e3674fadfeb7b8a2cf781fb8f1271605b5219a6416c3a3bcefcffa866b114b89bd437be8122f3b5fc413decad14967e78b27e75c912506fcfd3ddf46df98112eeb6612216e0ec743878752fb93052cb1e9d973d6c89285258d69cd2929dcdd00d398bd5efa9c83d57e9c24531fa38aec36fde7d9a35448c106196d383226d886dea124a99e23989d1219fcda5d6bab1fd95cea6e0ab27857d016677ae0bd29487448ee0942e92e23abc8819936a5b7d23cbe259ce5f33d70532862f81cebfacefe56c487ce376bf0b26f5c979098d58dc6eb3f6b1c60be93f61606b8cff670a1e2944d292a557a8b8dd735dc558d2ed9dfaae1e39741244824aafcc4df27b5488ac732f93f8b817ca6c8b2716bccea3defc4b30d3ede961842aaec2436c6f14b5cba1afff321a94c640a7e5dbc9d30425e025cf0fa7e3d89b9df7ddeba1b4b33c234ae422f5e19822e643fa82e48286e952a8594b16a4125f11158fc556dec8623fc96cadc8cfaa66e9f9e5bab14fc4cfa04d5024cebc97452082585ee06fccfe7db799fe0f173408b83427d1a4bd161f65af541b447fdfd458b8b826c2ca2937599ffca25d5add9edd8d4166233d237f2f28c59cfc60648306432fab928065c37fed1529182cff8fc66fb2f6d1424555495435387b20cdd7c59c3f5bc4251b194d1973f0e3f022620f560ce2238f243850bc236 MD = c525eef8b2ca56547565c947bb7e964e2ecae7c9c82c29228b6c932d2ace181c Len = 21896 Msg = 5bfe61888fb48779d4dc6bfbfe891fed45a830b345edced1490d2cb8c82e2adf309b3216e3bd5f187f47e55f63b0ad3c6fe63f260a41e5536ab50d85104df02791d471989cd548c739c75f004f817c0569f42161b918b1f95e27d3e4e20a1b7c0710e8b5c3e688ae89c4a386cae4d671bc389e0b5a5c78ecacca467c484df50819b85d165fd768f6f7a6779addc101a8ef1c7dccf3f48353dc052ef649fec4f34f329963789030c70bd5a4e48e0046d18a06884e8ec81a57764252f9ed05d16531e7644317f928484eb9f20be789ed141560853632c0842003e87b2e3d4a6485483f855e42fa98a247ba28b8f0443e9a19913d2fe8c40bd50b5f713c40b5c57b1ba3c65d047bc7fc7f411092b01a818b1e0178dfb7bcf59e140efccdff2f3b703279ede86264fe7f7cb470422ff1fd0faa18feeea7908ba4a85fe486809e0f8c162ac3a6669d8553c87d116f75b3fb4c473e9605c028150f4eb9f011cdec8af64e1f1040170ea49feb02bbc28b46c36d7cdb0acc0b6cdb078f84ea16eefff1d762bf9c5d7da0a38b6bad35e278949d98d15720ea8f4524b3f129983ce9c18f56db712ea6a139c941d2e549794483d1f6cf1aa10854993a3bfe0ec22cc818ab9c409f90c38ac25fe6a711bd2cf8fda6aefd8c54cd635263c83e9c328e93ee8cd019b0885b4024ada5739b5aa59ae965e8e41603e2c356e882383baf09502a7b1bef0cdf16cc45fba4bdeae88c352e57ce0a1e74ee7c8f11907454004509b4c0a5481b5d9e350f910b0d662f88ceb6c185f90e709a97e3251a7a4deeebc574a395af44c9988369b603eb77f6426f68ee38394cbf8e1b3c6e4ad39041a38d526c13a9f2ecafbf3ab4b4e08507621f2c250d50422971108132460683c11468366249c08a8f89f06cd14573f8288fe7eaad2cc85676eb7f9aba369b9035e75e08ce5d7b7578ce1ee656de2d382271cd8acfbe29f26da66f6e4e431a1e67c377b0f877621b702751908ba995adbdb1dcf5d3ebf97dd847e8e735950c941d51bc1628c0fee43e3c9252b7cb33c0c0f7191101dac25f7d79f2ecb953f95c20393422a65fd639acb4e814236f8fd7f5ea8ec7a0b40bff24e2966620a567dd3822e7bdb97d738080375cbe18bb325c22334200faa05dc7972adb3bb3b4e07f2cb4decdab425b23836ff538dcd7a3b5107a3da255c73f1e9dfaca54baa8ebaac698203bc2d518887d01bb6ab7ec6a4c87668896fa51396cfdfa69997da911c6cc76b5f0475f32193698b63df32210874f9f2ac53165d31a80d1c2f243ddd83b07f5a6d381072f3c75daef97d7a01cd02fce2b16422b968eee27dd48566fcb723fbefacbbaf6995b046f6d62aa8f168ef09b947074cc09310fa6c081fc856fd13c79b9c23853f7dda9003884b51686285aad6cbd1070b56baaf475877e484ec1c5cdec9f4547d22a2d3559e7405ef50835adbbe45e3e20a589b9044024dfefaba4629a4a27fab1aa57b5d771928feb95494289cda65fd445729e73963572daf59fe1cbaa26931cc5f129ba0cf5d0ee375e15df6030fb59b52e4acc70fb2b98097ff287a98c3b9be3c1380b9faf4988563bcdc4854339355b856717b5bc30b04d0b3cd72e9f19b76c918bd1110923405aa91341242941f2a13e9a5a4fc1a9aa2b0d68c222a956f7c827c9144c4b869eac708f5d25283c17ee238d9f2552bf0f0a4b1d516bf019e45f4b9bdc37bd992bb258e8207089522da9fae8ed1fb69965518f048bf2bd8b0499c7a932baa7856ed529c792ed94aabb3c8c524d253761376a9fc5789f57d3e2df629a1dbd5071f07daad3bc85906d490ea174c51f1b3c0abc4307205b081b0397e317a62801863713a4b5a51ec7c2608701f660f5ab5468af45728c0c1688f12b13c7d4e302eccdfddf1455a17fd2870f737f23902fd1d8ab6cafc39bca443301ba53afd79bca3aa52399d5f701c4460ec0b718d6efdbe3187f66cdf16c775183a0623fea1448047138ec2c0695c125ecb04846b032980f5e473eb3f44448d3178c9d8d05b490b5cbe5b462b882f1ad110bd7b5064233e7e58ce07c8e99e0422747aba011c4c7d41af39980f4127b65e6990f6ec165d2f01615f430a6b567261a9a3680f48c18eac62b458da18b88d5d1229578c7e49eb457ac21d824de0405584ae3369854a97e37525d91a9363f863b6d14db0207beba11170f7aef5ddf6949225cc9e364a218d4338c95f35bc9ff8d4332a059155a8aad1f6721f17a21d955e94941bf032c410795789f67424dc82d6c97ceb3589cad918cd1d2117cf2dee46651a7137b6f7f383fc9baed32f46a85b0ec6dfa16aaaa2726f49737ad79ff5e621d02c712925dcdfa28eb6d75e66cfbd7d9861598ac09d6b579774b53dfc42ba5555ac211bd602f8e3d3ccf514a56f9a8051fec26cb530500077b36b74bb5b3f7a0b7eec01a12c6c3afb4fb0f48b1e6ec194367072e0f1ed047a9de21e65b5e20a6223266cefafa61265bdaf60a042a6bbcf76e85ffc588ede10b2cd8d83d95e710a2764c04a0342f4c3a5250b5d72ded9745e9e663fdab1f7ca9082648e3be168640a2bbe28ddaf6c6584c6374b3563a5234c0738440ef2ec0895b515ed64373af039ff99048567e3fbeb1796d1e0f1994ccdb748a15bce157b50ba2449d8ac734f3534e37590e8f5d7267d8c8a2c054051622319d057a01e63502611fc0fdd9bc18a704ff496cf1c87e58c8aec7cfb14e197ef1e3979156180f26d61ac80273f07b83620f9fd66b29e96a934714a5f917ded5fe875369a8924d61495a3c035b7823d0af90e3b6c728bc8780ba11aaf3076b119eafc16abffff79a010aa4675afb187434a99e73cb6cfe96d630464669c7ca181a846afd630513b9475089963822635939835775409eb77fded03ce221ff03d4ba2dd5885b4caba5635471f8bd940b6505459624ed65f02ae0c37ae4e5561c2bc5d28a75707dc6489d3fe7f5b1f91882e218e3e89c6ab07f233088b67b741f07859d122a6a406d893c3970f5dbfb93971624c7291355ff66f140efbeab02134f40b4f411113ca7508a6996600440838cea90c94f1bcde5c7901a36663fa801eb3f3fb8902c1a7c85cdf8e09ef470f049a68572c27c7a6b8a49e8e515fd0df0c2ca67e7118581f4114e0ed6177334e2b5922a48eafe05989764cf8532afdae8be285308fbe21a18da55d10133493462baf6a8d530691675d629f99d271bb6f2c6a32da3b60c8defc92a6ce85b3d17773f1926a1fa8454082fe08eb55b0a4a14c3811a40aacb8181c6140514f519852a2d44cd32b118685b8bd0b55536433e589b0b44683fe69fd7ba5cc50b6ba328826abfc512beedf976d0429706209039c63789d3a2dd278ef88b4bd35723a4a587dfd235c987cbb05fe87e5c4f81b7e3657f43ef77ec54f6ec2327587f87e3a74174c545dd767a3520b9cc2bb9c181e53d5b80be6ed43681bc68387b0cfd2ad4b912df1fd8f2c12fc12d742ccb48b6e756b48a6b0ffd95d56f44c86585ef3fd4f69f69e842626a47482bbd890d7f1e90b970a71ce2cf399a0d9e1d3d72c4eb500004abcba1303b24bf9af16707cc80896d7920fa70b3e9799f5d802c5ce4f6f0e02aedee7fc3fd6f2d6456f14298a6797ab53d2c400f6f192c6b395acab7285b9df87779638377cf9b70344c454c5609e90e45dada4c9124bcaf90ee44a5493a3f559095d6d873ed10a6d5a3984e59e1c16b822ec7d3183f5811cd1052162034cf2b826a5f2ab77094ee801cc40877a80ab33a4e8e0bcb14067937ea7d7276f25361931f86e10d012f307cdf50e07707ccd0b662b75b744bd0cf17a14c21131bd6df0cdcd3653b48ea541215c4 MD = 31600a05842b12ea927796eafa30e6b1634a97f9bb41a2f75abbb2aa921c17c3 Len = 22688 Msg = f573042576d47a37216e1a4e3b45682998abff4eb1063bf3f7d3351e67ebf40c5f05e1d0b07d7c3cf4544e0422771e215f446874174a0bac4d5042692f99d5a1ee679144ccbef51b776a2ef695444606a0b09888f46a87a326836f9498a6dc084aa0fac9f31f4d9d51baa26cbd3246a002f875d16fef15a22b72a5e6c99970081cb806a94d29ec8a2a4c93adc1cb87b72e23e999b1601f6f0427caa8ebfaf8680cb89c2a01633baaac26e702ca977113cb39db26e2450cd358aac7232552def1c1a7a3963856a0c57d5288b3001d6d7b824332c228274496cf01859ca028896be48d0533198884a245d85c088ae5e1b9fb47d8b3ae8c2f801236eb5e8304619e1c73a94acd83500aadbe4d4891773693dd50b4419aff3559c951e0b0f76ece51126077227bcf6ac55c0e42bd3c5cd5d2d163aeb61505bee89c584ed924ef384e6e5c57054cf23c9bfcd022adb41b243e7e8aae58462832f631551c22310e075bd76f313968762c54320ad761203c8d9e8dcc9c7156eff94b334f32d34754a341f5a2ed07f6e3a4b7a8c64821a94777bba53260476ce27baf484f78348d4875c771fc73b71ebf0b8d060b5d3577c54a5e6fc2e322b18a20ea185cd68c2c72e3b7f385ab910a94c99ef3e2fee4b13e6d4d92860b4c4d6e51c34c7e34254b5a56d822467edddfe946b21851137780384a51b786c10c671774048cbd7a45138937f1a746d2e2c847e9911d6384360b3d483186c9eea9270bf3737f229035ac86eccb298e91e9eb351c02a91d39697bd4cfb7a657786cb6d434d9ceb45e3d3dd9df2e5124a13a703b47cf64891b58f78647a9c038499d3cfaa1fd217ccca4ee0b76e1c712ec1d80e1d0bef8ae104ba8d918d07b754784e003a0a91e80c3b4e9a31bae326058da43b020980a940189b557abf480145c68cb799ba370ca29b35329355b3b14cfb8e02f9f244544d75b478866dd76206f9325e3f9b4bd62e8ea57252cb1893838007fe7b52c4ec5780986f3b252069e674b15ca22a4ae4ee6a11a206778c5d37afb4a5ecb76d01fcedb9920f81cd8982ed9c3b57e3bea980d20c7a2507896ee7fee671e47cc715bc018a9979e039315ab85582c75411a4843ae84314e78a5902e24feaf93f4d980350adde10ecfe01ec696fcb76f7de56472947957c94299c16fe4389715b6b19617f75e85ae4866ba6756d6dfd4b8f4f6811bd09b299c1b892a753c6037dca1a64d28530be836cef1760b0f2b0cbaee055888ae85d74fd3f147203391602c50b6bfe5e5fc2360bfcbdbfece247f4b7c9adf263d9e39236800af2d45b3f77067d155763cdec68fe2517e773c50953346bcfe3ca56db8df83bf48e4994d666e8dfcf7227f3c3b8bdf8a48bd8139b739f3739d110e7bbd4dcb34fb8c58e714ef6b418d32d79be91c5d7f1f1ac4674b272bc7a4ee9f4eae33e969b16fa90a69baa9a7ffee6b85380a0436edd42d61bbc398c1fb1b8070f45a846650d3b53ccd99ee36359e6481901c7db99834e6af6dd6e0688ae0da69f88a4531c101a408a852e2f7178ae918591b7010098214d9cb27abc53a85d5bf218ad3d4ed419df362ae2ef18efa23d0fbd084412906e2673b80a2def15198fcd624d857bbdbc88763757a2d80353934de006256df0876e227a76cbd988d4ca7811ef9c012164e4b146f6db1d78454c96b76b25612cff8d2f665b26a188218498941e019dc3b57c7db63b087792f9c1908f91b4aaca491bd10821ceb577525695655356a00920a84211bebb7507e38ab1e50453994cf682dddc6514a3fb19a8f50229fb9666390094f5dc54742b851071644d92bb298a7a9c5f9fa8fb77da044df6fc710f6f611decbf2e64139270eb6569d7f29ee4673ba30e2bec0a6205f0e6b0655769892b48cffa2f7ac1c11983f4823de393023f7e6864a46e7f6e3fe785cadf0f43481a19a5134a091d3bf162a539d9f66607558b82ff93a0b8e0ea6071a2d4090b20901902b7288f74579b100ded569b56685c1b593b7413556e97e450d4eee54fa73fcf7f42258e65c8791475391e5302a9b58671a4c036c36bbafb99dd7a248f407b956140db767ff30dd8a199abbde95ff45552d7f29b816ce60eb33920373890c6135f3fb4e8016bdbe4e98b892c78df8b10732195b21de68ba643545badd9fcc1b1cf9b4c53b8a765b1d38b212f4fbcfc40693e340b076d2e5ab0db96f8e1f8d10948effc3a041a3dd7e6152e46cc8cda5d9b6a2816cc654084821b6c98ff29867241aa5f0b6248c6bfa7b5eb037da377d080521c55eb7354bc4db0470e7fe354955056ff5851b792e18ee9f1d5e1b58731ce627b58c2fbfd7a6a26a0d9e2dabdeaeb7227a150fb14d6022ddd4e87277b09cc37bf9001738d476ddb148bd66444db79889266fe67df15a80e07dddc6db5b1003e638c258e96abdf6a1c84a9046bff8116ba29a8a25428f6e6fbf4601cd9d000e301ad8d81abf015402365095fa5bfa888f959ee1f167865554422a0a959ef54c21494c8113fecd5f9c39d45ca84a4466bea884d52889c79e55af91c97b857725806a263a1b4da67f377ae0cd98b35e14c083534d14cfdbaf3bae8326c77b0c0117286cea7bd4161c9aa07bd011bfd1f85dcd1330fb6249f2cde60909c0a73e48ac28287b7cbda49e8e54ae4d5d96247c5d2fcc68266999cdd5002a5aaf329462081561d4642dd96ddb3e802cc25fdf07875087dcdd0d54aa19a3ef01dc4396b7f39520dd7b4e3bf14905f95589438b00a4d94c74687601f063785ee68f03cdaf35506c7e0b4854939f5221b1f969afd17c7121180ecb2807792782f21099c0b395f04d9f5a43acb9a7cc01265cf9d3e1d7c110b0183551572357600ba62ef829dc1acb28b166c9cd271ca09df81d7f987d702024cedb05482bb0021a9beafb7bd278ef0158d93535e8e906ff17fb3c5e3627595c78e6cb4258dc6f0835f4530f3fb2c01397c5785bb2dc3c32ffbb919bc98ec4415e7d2cad7180afbbbd75874feb704644b65218a54d9d4920f88607b7ff4c68b9c8c9aff13f47cb1d7a9420a29e598a7dfca79f7d80d335af4c84251aa00a4eadfdf1dc768ad6ca15b67aa56f1f1593a7b3ed954a142609c941dc732d746f7c06461e3ba419d8b48ab74e9e20374d6aa8214b8073d240cc5521b779564224fcaaeb7855e4b6f39166c739941caea9156a8eeaea627fc6863b323cc0fed4d0d6833426b19c27cf6a902c630ecb4cd09ed344f15a7ee6633f63bd94cf8ef01c10786851d736351546f02ef39495d86b0ccd8a89592fcebd00b509e62e6c5fb0b470d1205018a86d2e6e1712aee21c21683fa7da6eddfe7cd019605b6602e833c955b5bca3ac487e29f22de7e51ade9bb910e40b21f03f49b877081bfeb7554e580e5d4c5858ddf13f64ba9bc0a5e780072a8945fad059ccbfb74a4d7ef26da8688311f9f8862e6d78ac0455c8ebff795b74deaf82e614acedc16e196e1df7ea019c19eb0a9d049bddb2543e8355ed2ebcd62a72409838914a7dbca8579fbcbb2b41bc4916052723755ff17e7b497b463238b7b5bc4f8c25dfd37c22c1e084c4ef5a433ba4255fac4999253c38306f6ac582cba17f74d90db3acf5af324816ac54cff6eb3d6774de5f4936a0407392417e9caf5e106de7f4ceee7075343f3c1c63881d7e68322d63c1586dd31d78ac74646fab13f7a47e803983359f4e2dbcbc236d001faeef53e077ac12fd57a985aa7fe106e8bd7f6659fb518c53097a5f339c67e7f49604ae00872f6d45746de48cd8db0a06e96866281c42bdb9eb8eed2ad65c1925a8da0668fbc7c5d4fe2b93c17646fd9503c64895a53d0ffb7ed12e48da36dfdb6cd923c3da5e64d27d4d58f2620828bc9401d2479d29cc3e4aacea36afdb813e6b69cdb72ddb9066773afcc7a20bd3a42381cde70cf03aadd685e89b5d3547752cf3cbecfb2692b8765a47e74035467538ad001cfb79a16daac5f120ed2a78a937dde60c4c27b2 MD = 7ce7f53dc2287da4cf28c9fe64d5515e484c9cc57fd81ec76e66fa38b760565e Len = 23480 Msg = 1ba0728993b8f0038cd7afac17dfde8c712842e327187b5f7df4899111f58ea2bc9fd542b94e14e20912ee2315bcbc8e96398d85b21f6b796786e15e2d19ba5cd76d0ac8bb91735212e6a180a230175b9aee2e68bde75ad9c206b005fb67a51636b21901e1a894bc71fbcfab0463765b44ee2c728f98d0e6561bfe6ec308d9369f1708d772bbff86ecfa808b837c61f65ee28f8d72595308eb6ed481cd24de26db43e131b8f43d1a4c8bbc0a69a46094ae7160a0ac526da748a6392660e23a4cb2e0acf6f979d5de58558c0ffc02fc9dfe44a69286aca52b366c3645c66a7712eb936f107e724f3cda01f78386bfbc791402694d488f83fd7d68d2c645e51cdf500634668f08349b9836064c4d022990b854b1b83a229083e5411591267bb21aa7e102e073620a625c9dc0539af4c94ab4e287bba48e532636a0078eb153c02db9cbe26674aa5cfbecde2d80b4bc2710cf53f23ecdfa554e372cb1a62d96ce7f4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b65782e6ff536e89d8d40928b41ed7371365c8080a9647f7532ce6c6d4ac21cfb0c8020783851ec9a7dbc3948f8fca7adf8b2a78c04d898d31ff630724a981e6d4bffed30ad172c2408a9cc7f82d2c96096b40d1b146b91d16942c545212732eaaa5d5d415b71ef61b46f14d7e85521b198c879d6e206b1999a1cf28dd7599f9ab20238504a477f7c0c76d9f9316ff6c98758b4647592415039eb80f27515afa4ea5746088382229b9527e28d650792d0ebcb876fd5f58921cf17381e0242a831dac24f0e0d0821e7d9e8f93a8d053bed4a89b79c0b19d132e308dfb686cad3680bac1a0df0c3c4875f22e4a8af503a482efa0f951ee461abfd2540650a947872047e70ab359a52a3af3e6c80d6d2d70a1e865602164080b5a6d822d19488df764d9e1990e374156552a2596a0772595ba395538afc14787864894ca22f8e4f9d6f76dd65023b53f3cfb8730d4c180a62448fcfd6d7488f1bc29e8781e08e120ff16c84d29bd65575aee78212acac304889dc928eafc30ec645809b16b1706ef35bead57eb42d631478964d2030171434fae464598c6f3da377975008a91cac71365799125828c4f7b42f9de0de3ffe4f200f0ddf773363d7df4b6effd07b13b3091b98358cafc248ea193afac00d35c182c654c977f7c98d0505bca52f73edde5c9e9a905aaaa32ca2bcec15de6903b1a86f03bf95a3b8eb722b039fcded801db84767cbc901b0cd65807bd93e3cae471b74e068d8207619ad270b98b3d21696a380c68de19c3153bacdaef0ea6c7fad623bb46d48544b403e5f9c36e708f571a7b1817eab636ee62a0b4effeae3be08052e4675ed288188ae3d7e21737965d74c405e472e3faeac3ca223b14487b3838db36029d0845f18842778025e0bb0f01996269073163bd078faf5ab0242a6438134c831f8512c1948875481b1a81de3961ba00080d25b78667b8c982cfbde73691847346d7531b283c4d8457337f3d94b3796405f5957cd8f8eb01ec89aa439cec7a5db38dab60cbc46cdf7aca07bf9c153cef8189577f67a9928e5e00640bd36a9aacd6066024e7b75fa3e65cbfd6c7fd512cfb16c021baf06bd967b29fa282c261eb2ed035fa148b929c3a5a0c0590d27286d34c84266b73b37d9a2ea19a235a6c834e898132dac7a202e74070ee9f4afd87ba8907dfd19a25e555c31e752db9171f9580d67192e20a826dae82d43bbd7eca116acfc085da1f9b3b1e6aa61a54fe1a9454aa38e57138953e02b6691ea062a86850307b00ca2d29aa9f2abf71b48e0edb7360fb3adbb8b5e8db801f80aa35cd3fd7fe51cad0cafb34d3b323ac6e4366db7bbf3b1ba8176efea7746a2a218482f8707e076c84759a6a4aa87552d8caad04cc096af06cb11adfd507db73accb74329843ee3e5bb981ab627f16ed9a606be7f2e41d617022541d02ced5e5a2770b7eddc488d8dd033b88c9bb9ae509c10e157eb3c4e778f7a526bf1dfc08b913d32dbf8469c47eef4272dec283c1cd491dedce0cf3eaed8d889d4899b055472e45cfac080389c7da10fa1048441c4b8506016f542ce4247078e15da69543e322ede521c3d8713e5031af1c915e4d1ae170d0e13dc28bd43ce0836ce91d5d039e360ebf5c7b4348ee2ee2425254eca20ac8dcb20e671a733f7a03d4c5ab292f0cb89ce3164e587e0063342fffaa63775d8895505a8d4868148fd343b0e100cbdad0202ba5d4395443692543edd15a11563a9b5ab6a77e4948ac82285f31ac70953728f76faf5e5203cb261cc16c38f681594f2f9748248d484a8101151f54a3d83827e4f8223ffddde3d7190edd789d6b6f314d60d1e3ba9004605c772cc1dbf06dad62c3ff76ce4e5d88d72aa7917c70d6d242c7f73447bc449098f9dc5c9f9a4219ff47797b39c182dbb5a94d3c2a3e3ab28e210a8ebb29a5a24511908d5512400e191732b5c6c41e40530f40a11d200542be009e5b8b648215ff52fbec931501ea5ea7bdcf0be26a573dc12498dbc2c11320eb25434f09645c163270f2e00ee24f2e7d6d1f6f991170c4736b6bcc92f8a4754521ae6c64e6f538449228a26c7b9d170ce34f68448e2d857a8792862d066719a326256a136461c3edc20680ba386496da92a78c913afdff5afbb59edd84eb9c89b520dea1873247a2a304d174a3262c6b0dd052fbc262a0a95a4d6d410e925c6d3129207ba9d7321797bc3b2836624642b75241e09eec07ca05b277d3de0c07c22cb6d62e46d12191229514417ca982d62195efec4b0a9351909d4522ada8fd2d2a52761608a084c3d618035cf05c50a9cf23a38b313ee1b48d565b99e809cb12ac7476ef59e5da0424bd6ed71c0b4e3232840329fc0961874e8631c607aeeff715a55f06a4e19ff6810ddd4c5a26ba13de2f8554f5ea913e66956e2396f8da6f085da4f88444550f8d81d529554f42a3348eb098d9630f3e781c473f107828cef715df21728e97b3aca1dd0a77d57684d84a0b71f1031a2bd58373750ebd49bb5456643dfa10b67760f65b4c4c69a42d2bb9fc5ce73b707b01536961ec38bb98c2a7da9a758b5fef4ce7d68b4d7c79f0c18719d6267c70a0ae14af82236b0d0ba482b8c39f5ee27fb30ee523f57e56941c09da5a3966b9311e3f9c525ed49c788c6f7545b1fbfcad55d3edc2deffd87badeab4759a5aa8a0f44ce65ef9061863ecd6a6ad67e2ed0c87cf86d454616e1bf9824ea4b3f8dd74a2b4e4048c6fdf524840a3471bb461f1db6a16c5005385f97168ff5420a1a630bc103bef83727fc8214621bf67e0ca01c32c34317d36be98c8174d206ae5b14992d7448c68ce6839fa4f7882b6e8a3b0c19e5595f59b867e4015be85fd458d33e9829447b6d4372c45d53e1da34c7d937929016f33e26c1e8bdcd9f15241889402aab1cdf8144b13967fd8fc978cb60e3c64be29a2bbedfe0de515fef45a31ce80a8136ba71f42846e97dfbc1e19fba59dc9e251bc887a9148b7090b6e001767e6133fcd4e458c0330b5c8c89174acde1fd11473fbc8908cbedb19a329c3b7d4a564ad4f5837a5f47f721a9ebc3d483c2512db0ceb0cce24f2c9ce62b22571b93124d28e4f661eecbd254bcad8d46c246ff79c9904b5921e66fb9da69196037a3bdc45f6ae4155607c77d2c981ca774b3307ef84c3637abd9de91dfb32a5bb8c07e37e14ff69f7d43fb25617419ff80520bc2a6cc186e6a70a3ab5ed3fd5288337d2f165bd3064dc799d3c3092b56ce6bb9cf3cd69a0744f2e38fbd8f394c8e44e33466552352addac710ba1efbb54646612d2033640923a9c9c666b08652b23ad8cc3907908b84c6ad63ae7d3023d02a2c62bcab1d7ceedb7ad7bffe8e6bdc5f8381f737c0babcd1755407ec73a9546142f877056d688dd1214a3240f69ff4f90dda08ae5be73c44446b2d346c4eba31ca77b80bfed6e7d3e4a8254069f6e2519d5fd4340a18ec674531881dc21aeae3ec65e98375cde628eb7802c48d798eaf5c99c4917557b4819d2d806e1e15ccbed24c71367d56711a5f4230950a2fe15a720f3e8c43ab7cdc77e87ef12748490ca1b3b8ecbc7870ef688f177b8921c19c0649abee1c1d2cbef9e8 MD = e026d0e1228ef882d093fe4dbb2ec5134dd122877ac2b380d399bff447fc9fa1 Len = 24272 Msg = 9e014421c88bcf4c2611981d723747ecaec70e75b8f6dc3a1ee9d4233377fd6863313bb0c39f7e7beccd39bd0a0616cb30e0e87bef79e08726ff05331b76de30cbb571bf7fb2721aa000b40fcc96e3ee29d275a5fabede2a70910319c279f29f8097d096244b12f1eab3f15be16e171b42a69f3b014d3ce9a3a6b81d4f08a17c27df3f7dd9f3c8ca70edd7e971171b1b23634c842eaf648d67470b87ebab53916b93a5bbc631fc6bddb65000a31756b6731166c9a76bbcde667be49ebdeb70a4f1bdec99148d149dd71644e99ff82fb3dbb9d4529409aea3454a2babee4f607e6464fb5feb8f7928061699ed8e4110dc02617e671e11a1a6afbcc8f6a5608be76a91ba5572c093d414bd3852987b60f791144c506d0cfdad4adaa4c70ba45aa6ab4b11c2d2a7ca69a6140960e42d86cd2fd72654a8822981beaba56648a53385d19ae8f032cd87ae6721f4619bdfec2685b4f4bdf7f98feab437b41a83eb7f4a81862725bbb8306cfceee29be41af9ca3ab29ed183fb96afd487ba2de4fca7be6518b6aa95f22f6b1083b957e8641580f7d90cd9740fa69ac5a29de5946211a925577dc7e703ea7349e663ddce48a8116432271cf2be27713090478bbba527d3694c65c3d971cb4c4f21c675bf4b1a4628c4d5e4248e81fdbc5a9e66804b5003d8fd54e895c638bdcb3ccc67e3f7d4e5ec98ff7732091d0612078cc00cdef3031a74337c40899b90653d5cfa61d33cb657b48e1e45b76154d99ff8df87e67a99d8b9ebc805435b8bc42e5d786267bb8312226821851fb6aeba2bc90c18e94c8ebad262140a7be0779116b9270d3cba12c4ea77c819c985dd5db2e98fe771d1a967c982a877b9921b73fe57508bd99f2c1612a15b293d34aa693c3fb01d0571b488a632cb7586d94113ed1f3a03c6d399b0a4d021df042dda87d2b3b7e22e9475c46f59c62c681daf18ebf92f9e8cbf2139a7eb6361a5d6385e7a2deb5d72a2b6c42ee1e1c3e9c62e2b01cd7584b2ca8c5a24da69d7a8998b973e9596b75c033d2feab16462913c86f4358355dcc05ba1ba22857b6a96dd9ad926d3fe17711fd2aeacb19733e7e77f1a910317ce3fdc2902a9d4e141f5092ecd39d06ba63b5f3fe97bc9c25b7330e1461d350384b6b4edd9c2afe28650870f1a7f72278c41294b875fe12c05bd7d731fe0026123ad4bb2e873fec85e2cbe056900a279f00be6bd3160e11e574e37fe4ee25078d6ac0943d6c6a9d9f31316d862c549a8fa22ff5e8e87b1e079adc74a7a2b0991c33c56674cc3985e6d8cf74facd54dfdd40ddaf647db3aba9462931f4cc413f412e49ae5f271b39ef420c934f03898c0a354e14d036462f4d0f605456cb458e9ec2d3d866fd8e3e3ae55f44dd5f7103992807b2a6b2b12d554f084838103beb8799ea7126c000e73c6b6e06304199fafc6180f56263733a649d877a333b92fa8e0bf405190f21d9762c8f63d24a62c6c6aa4079add91abb0d637486b2cdf92024a18710a84b5f997ab159ca5dea79eb6a4accabc383f643824935ea4117dce0fde32a007ef5188bbc8243b61da23dfd69cb9c084de4b44895b7721168d99cd14c594370e7acfb44be17d3c3abf22d6147c5251bc78bc35eaa268f988463d765c26c69ce8cd36648e20a905f836ac6bb76900e52aad9b1ea221f04ec3e470b12e2a51395d8f8e80cdab2f0063e6ca86098d4ae49826efe6fa01968890103b66d1f8bc743468dfef50aa97944278830f5010b8b6cc8bc0773a6ae20fb572a47d8eba8fb73702329b5f466a285f93e0eed51ad2c38e8317b8aa835d4cfab1b6dfad9553692c028e6b42a62e2680e0e70ce0d12174a8b6fb9191758ea52975767276b38ff1dc13fc4740f46ef56e06a24fb8602c2fe0cd74ea3967fe830868ee1f303ccbb90fdb8317a355affdf1ae19a0a7ed7b5d00708aabe882334f613025cf25588f288c022bc3b1f37ba6d08053e8f3a19767ce4646bde7eeb76ffa7523689b2d64a61d31fc34b3f65958d523580de5a307b313f8af067ed2124d9be0f1d3dbe6d19b8810ff50f086d27bc64030f9c51c53ab962dcd6ff456ca4f0e1896f92da95f6f96463b00b2c96d776c7ee492db3304b6218ea9e093a469df1ac61ac1d89e948b0f7cb82d3feab2b48f867ac26e11a13b7ac34a42a1e177648692861226effb55bb597fbde10f299bf7fffd6fc8ddb2a46a73b97b67387a461b23e1d65dc119366286979add615b926b9272832fc0c058b946fc752dcffceca12233f4c63f7897cbaa08aa7e07cf02b5e7e3e5ece252bf2fe61d163bce84c0e0368454a98e9fdebf6edbd70b290d549ba5577d476af04194f82348d85e9b299f08ddde4ed91675067a1707cbf19eeee675d73387802246af2717f24da7c78fa840457afc4666c26875c4240785093a5efe6aeff64e7136491800fce3d0935ac185c510fdfd162fad07eb15080dd69ecae91899daf964792a76e64ddf0184f3b37f64889727ae229cd993c213b28e84f3dde9197cac84771ae7d2cf8c6424c045d72aca13ecb605fe93c413739bb853a283e657248d5799e113ca69311efa2a41351fbeb973b73f9bdd86f06ef2dc739d83163c1ac4674546a4d903155a8e9a6d404c4dd0e539383b5de2414edc824cac8482aea57a3ce4133f0486813e697693a1b85da269c258a6bedfee59833346992e30960ed75cdf0e8e55d8bdf2122779006bd77528dc07a3a686dfd80f76c92b2a2add9e02519c0039d3e2119f1116e8036ea4924a0eadfcbedefd12a8d43d292078699a24a385b0e8868cc56defaaa755c8aa41f6e0b277adef2e5174d40a5cb720244d64d801e84277bf2083334a809c81d3c954db7edd1bc15bdb9efe988c982cf5feeb7a776eefad616b0a65603981a206748d8679f5b25d6dfa4cda4f806ba3c3f4e011510b98305bef290e539bab322b88c96a0c8917ca4af3a7f19802d78e78786c23f687e50996f109b58b6ec339294e2f0d9d5ff510dc11d6cad9d884f4fbd2b73aceaa7d3ff9bcd1e2707a70c0ea0ee8f99641f238099b01ed7bcb1bdd344ae8dd413c09da6b97aa1d6a865bcd55101bb65df5b648bbd852e3e7a344520b282895b70430e3d6c9bcefe15c2b6b529bf1ca5c43ea4bd911ef338428a65968b39ee898cb9b61219b2edf3dc2899fc9f892bff9f536464b8f0065b922eafd333473604c59f15c34552976e6811d73a270251d9ed14143f997ae02f058b74354f3ce853b76dbddf73fd43a44618eeec549d36ab2a1b449cb7420919093b635b338d8deceea01ea52a058b5bf2985181bcbc3309d2b3661a96c809a019b8fda394bb8f36b7c0a8e2dc2dc6fc0a3a9fa8a401ef6c63870927bc9f3a5aa38e93acc73974c7cf69fce70eb89efad95a39bfbee0b45978f0ae429d1a33bf5326c5e55fa9d72671e67b4036487bdf0c81a04571eb3a477faab5f9bcdb8e34950c14dbd26f1ec96bd0b47ce75fd61ef04b73b84193d9bce3ffb0cb9045a260e5b900fea40bc426f9a328fb96513631410224a6c24d2b20527a4f26cc0af8bad1c80adc68f25fd5c7f8595ad7ef34cc6b60238f58a9a72827a4b199a47e29a8c583a2e385d55a4c332ab609006c2a46cbcff0e0991bc62ae009b8a2ce319db14da669a27f074bf0e7c4df84c46abf170ebc2d38f83610bf180394c0bd97cd7ad69abfa7d92a9d6a4251366c786d4bd390bf38f6fa6b0f3b4c4d0671d743515c0ccb15521881c72edf5a4b1eb0e658f2fe43a4b9143d2a45d9206e44cfb691db3cc21b3fb1df61a51b4a9e19e2587f0ba3d3d0edda1eea656b383ca7fb54378f031a31cf3985f573829c9ffca14616742e0a7e03b0a2d7f05eff0219eebe8adddc3de99f1407eb00a1dad1256241d7c2f931ec993c4b7b9d40df5f290e68344e4497b31dd5f7cad2f58fd222a9ae0b7e91f4ad2cd18b3db2ad739443feb3ac66c8d21ed9f3b80d610a260382ec1d5a1d84cd502d14e496e6e13651f924535badc5579d31f1cb3b413c37e5a4ae021c165e1646287aea3f90a8a208b713a9da89e6a2bee464c3dcea1820093663eef9ff6a8a2f8d780e60465041391c4149a181994de43fa1245ac23a88ee86a2465c4f56734ceaa0b3d18e749e63873195393b59a3adc24b5f3d7fffdcf633edaabb7c8e7c5ece698cebcf82040896792f1a0da46e9c0ad7e70d69f496c0bcaa8ea00d9f0fb58756fc1780052c98a86c69bc8f05e90f77bb5e43169540ce8f7d64a288e4a7e1c3dd83fd467a82a45b9ff7a925fabda8a MD = cd26132e2c223d19d3a75ae0664f7475b478695d7824dad856c19417ea0b3794 Len = 25064 Msg = df753c3c6eb6f4e34dde6ee5388b5b818196c4e7a951439e2d0d7223a2e0a4d304a5d30a4c43da8d4033e4258f3c258d1d81c88e9cbe28695ccf427564726b09c14d3e9c1e33d92b95a349dcc59142e02569139d9752da0d41b0f46198ecb8ebbd77653a0d0c5887f436835001131a4240578f5cc493c15283b8712f67d7f53fa12a302c4158c16703f57bc96c48157b16522313490b45ffcaef9f27f8b989ce146f87b9e19e7b946de719912eba9c525062b7094e42cfdec05e6791741ddc60bf4d522b1567eed6d81446ef6ef11590968f3487fcbfc5b50b0cb1b4028856bd4acc79c8073a82f4ed85e82a5474eafd8fe280d57a0a914d530166d9cb845fac5cf4e4d9dc9f9fb85341e88b0acb8161e462843bf1ab996e41466c48f6985ff69dce7ca5bf1eade8b2502f5ab57e44843d182801892a47df7ce2ad49ac4dbe63b7612776d640144db4bba4df8015992e400a556e6910026aaddd10241529e4bb4fb5ce92498c3cafff892e619119ea269842f1cbbae531d57c407c2058b639c610d35a42418b8ed63bc2b72a10129e35ebc8e560a32f3ee99012db869e7c264c9fc2b1cee6c37089116f268026861d23e2a21a754d78906e925b149e0e021114a78abd7e5fbe4b92289763acfbffcfb824da7752e0478f2c29230fb0d1d063e7ce34649ad50488b72a4255f5b6041cbb5a78e33f8325a3ebfe73b4040e6e858dbcc790696f1b8dc1bc78e6a57f1e6cf62b8248835e993472b952ebe2ee65ddce1a4b2834568dc4778842fd0380d3272f40028d679a2baa8a01c99c91993bd57290c91443b1e293a336a78256deaeb52f40ff9a335f636dfb7edfaf5a367bd440c5473cdea9a0640b6eb05ee7c4347ebed482572fd4cae58dd99c0c85edaa410162d0884d66519e78d76477fe58efeba3a492aca222e77b07ba089b5ae852867d0e69e0d70f7ca9b319cbb6e2c26662a8573781d670429533c82c45204cfa0a7c721c2cc6ccaaed81dded03dd2b214c939579be11e7649dd7ac0ff021442b35c636f05460c762d2adcbd34735bba9122d08614b9cafd4f9bc0eb985a3f56c6f2201ee40ee252cc0fd8a84683399851a3e56f610bfef1a13aa9433edef8a45205a7b1cd8b711901f3bc308501fee3dce8e2741f5c1d0bf5169e9840e4d293eb0344d840505b117572d1d68e541e15a95e42448e3ec794a1dc0b3b4d204fbe088791f2ead1e2d48d09c41ab11e09b63d60af415c0861243de789bcc205e27b20ef19820b94baeacf24fd6d9bb4643e0fbc640b076d8c533fb5948d3dfa1d53dab63616412d45cc9261085fbcbb902596be1b01feb2ab8a1de2b63d1f9162f07c79822029e015e2ad2a5f617288200578e23eb6c09c41315eeb693cf55055a9acb598200471add5460d7d038bce96461cc539a9fb6edff1793c281d3dbb6817e1d6c2968f46600d1366ebb636e3557008d3b64bedceea4303516d4e87370ca392799c0428d2ef027be3261a226b000bb39a1f2d3620f29e73c7b3513057d5d5550aaef94f9bad4e15eeb67fccca0881a384eebe53098b6c511b94c5e7923635aff655d682252d5848060787a494e16a5f20af8fd2ed175511a98c0d0b7ab04ce9e94b3c5ef3e1b9a8b5a3a228302d3e5d09cc12244028c13c0e03a71a85d673b94fd98b448c5cdabe7a155fe6304e66138ceed5c5a7223936b58614a3280b5284969b53b1531133dfbfd7216d19b78a1936625b3586a635a84c9de623e5e151e259fb2653ec816da31363970b610b12e4a2d1030263273ef71fb58c2b53db0a490693637acd3fe09f0135116f8abb88fc3eb57daac127cda9cb678707d66ae42f28de9bb4599f353a15d631081b4b64c6868a1bad352a6a46bc2e67680213680b3d474f8f2641c3eaadc16643773d2eea06b97d6813918d448e649dca4b570e73b067ff69c7aa1547458131c043035fcd2bee1389f10fbf29aeb49a8d36c85fef2ebb1be2924ab1d67990140cf3206fe682726e8161f7686c99a8fe4f48c9d4d414ab35783aa6220eb6689d680c26e7dc96f0eecccaeb2193db9c397ef5edf5d8eed2cc99054ede5698953e8fe2895005d5e434eab05d7325d108dcaac2a74b5429ac51d3a6a74f447c8067d33aca20f8cbb6a169a6c0c5a93699384123884dec61a265a673321d6efec4a9e0696be32be502e4a802a7918478a80cd0bcf365e8135f68801f81a12c7bdc9525f2d10f25be334f4478847f4df3cfaad7f38b2bfdab2deb0ef018730390228a126bac1d6cb3d271bd6ce9e76c447a92d54bc21883b5b85d8199691b8ac8512934385f8677626adc81544a5275e73375473a1ab420bf6940b67ff6033880c2d319fd6de2bc5656e02ec31858e1588492bc42f7774b14cb24ec1831b293460218220f59bac1ec414d143df6534524d8ab82fb0aea6972588ab0f6cea201a49978eaf295672ea09443d02946e9f7b8b9f059d6a77612449bd293900f6a2a18e375e35bc370392fda84f1199c859fa0a331af4a6fb2bc07ffad02788673631f9a8f998f467e97c68e80e58369aea3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad83dc6e538736763eff646f0f9aa6a5b028e575de074f5fe5de425dab8e6b73f0662f88d49749749ae7b55aaba9cd38deecb3bcf6f3ee5a6de5589b70c637b82aa6aa67451847f5aee60295990350f8c6c18d1d02449b6bf037cdfd09bd033de2ab16b4adf47620036511c7e192770cf0103c4009e49ebaf83c682a805d172aa0dd3a1615121f1e20caab99893c8a9ce43f89cc13ba3f700c5cf3cbdd8dbaa8eda4e036845a89168d7e98b39bebd0d22bb8396a29aec6b5b5ff3487263435df4f68cebb02b4fe31d3eaa0bc1e8692d44ce117c151a87ab0798df507653cd0f65091cd4e9808c49779758b5d1bf518cacf24ea7a9590a58ae36efcf2a18cd3157887a5974c3e246f0786203d9920aadd3de8793cfd4e8d6a780a11f1e30c86664eb21e3d283e66e106872805a0ef90341c948db090cb7a79c2cafeac32a4310e5a7b00e934f0d217fddf6c5c394a11f9f792ee7d56edb6df48148aca963c1b3824481242773db03674f6b1eb6a1977515349644c579d88c392517cf417bc8d0a35821df1f90b4769f334c2593d440866ba21b7c59cc4374d29ea9dd1be0ccfac1492e99dc244e0d60301664fbab30d60b382ae8f2c480ca79445b50a9215294749de3eefdbcec3a52bc56475e84ecd67c7d413530f134ff65bcc8c469bbde3035dd0e48f4b9338fff4e88572cffe92a17c7facb84e0b486507e6e92ee2ed4407d7cfa2241a79870ce5d291ef77a9a2395deb4267f01a3e191ffa95696e8e957c3f424256506af7f386eb5093e9384655ef819c07fd277b3d2b7259a048861f891e938acff64dd1dd5f9c89072c94c61ebca784417e1945f7b3b5fb7b76bf2757fa29433414095ef1f94b06f248a36abb4bc6c0bd7adae56f402b43a1021ff80e5e6c3530b088e358db628dfd464f7a5424471922f951a3cf593cfbbbf390d9d5cfc42769d4b1ab398d47e7d02d7f3d13d09057190366c63c8750e97052f911d4d799e287876cfdbd9864dc12051bfc1ed60b4249a10198e051cfd7692641e934fd532f33d2a1200b831f336bd60aff9dbe1fa15bda0a5fe33f218b4e7752a91dc95ad415bb385d4dd6e2b685a9368eb911333ef6b769646dd9aecdc64e1399b6c41799d44d1afca81a142b058586f19955b1dfc33e07efa4a8df6779b26c002875f048188d2d4546d61c5b9673e26f6715004d6979ca47b3331a1f10ab45289a654ea78b855a7f4f92640ede7a325248d6885091709bb6c002c8bf33418657351a9a80d33c8af4ebd6530b85a25ee06622b1afe32a6382f49e520d897d18d6211e3a9998baa3ea402b511c34f34f62e980e33406af08f4768e1ed2bb66e1ed85f998ba83088eaa7918c6079376eb1ff97986a5a30774546f5a96d57004cae389311aad3b2d347cbc261a9549321b61bc9402cb613b8dea068b21e05160bb0257502a3969317ca731dbb68eff2fc86e5d59bf6ee9513dfd64a826b906819d9014de2f25b51d4d7502c200ba5c76d89002502656e2546ad7b0390f29367056d6eb61913ac6f8912c546061e1090e350cd4029d4af549febe13c743f88933d01c0263b74045ca2f15523f42caadffc52dfaf68d14ca3ae0fbb5d92aeea9d4f1aa816b0bffd99b0f7821e6093ef152723a9cb45f7a082ef8d6bdf72cd33b5aa3c79102f43e2b74199decdd20057d0e227ae4c57945582e2e9653a9b16eeacecdbc5aaedac7e35c35cbd9adede7f83bbf36f8b0453d61416a85a17821885b3757d203fa2560a85c4b4c10 MD = 176b0c71e213031a29f56009aac7ebec591ba24a8b162d80506b2df8f59e11a2 Len = 25856 Msg = 6d7262476da95db63b322c5193ea05030923c3cbf0f8e8b17bdee2fe227c8dac47bdfa1c1a236f07ba5eaeb79d1d7a7731245848c39e93d5a1b582a97b610da00f7d6e9b06203578182a8f42771dc7a46b2f0da4399d778e4a41452d896769410ddd472ef849b9f29fbf5659eb93f474ff6c6b471a9a9cc2bfaab2f31437a87989030c3cb946025b95458b66bf2707ce3404f9992e400b5a49175261e478d22fca17452d12be189d43e3b7d0bc800a99531f3f033d34cb3f2eb0abe0c0d3f04b19427a68c859049ef1c261ffaa4704bfa4e4c6eb0e21e457b69f47d972f009b4beab3457a6c0cd48e70a115b5123fe276f7c15ba6aad5f8c2b09aeb2c0762554017cfa61739b7b816ce24f4c78bdffb9fc0fb5d9198043c5d31966d5730e4c1229da55eef6911733c972a43ae9bc0f5d92c42caee34398eaf8f4f9a8535f87d680efcc66f84ba74547e3978d6ac936fb7bc304a3909e66e2e0c5ef952712dd884ce3e7324171369f2c5db1adc48c7d7bfd35c41fe738b697d3b2ce02b9ce5711d6de2eb899aac929c0077802bfacebc56142f58ab1ba8ff01be32059cf3cfc5766072a61c89e6acb4d0a76f522d289c2ef111e4bb6cbfad5ff816c013203d4434486629595f6206d198e33ecb7a55e58eecbc7ccbe14fe2ec6b43b62aacce7bdb7845ebdca5af4f76dba365044ce7270a8977974913da3e3b9a314e4fe3f3eae0829a73f2d71ec5191b6078a92f4cdf3639ebaabf6edf1dd20777feff803e0fc809cc48587e41363cdab2e0069c078c7680715d9b7ccf102435704eb5ec1d59165063df59f5a6e1669c1331c90da7ad6fffb0f669a83aa3b696c2c40f9202653ff8e9bf93f7c0750ac1f9f45d1e9db066fa232bb68ba2471dbde7e5691c9da2c985d65f82df2e5fae0eefae2f295a3410223053ee818688ae2d48396ee63f903769a235a326310fd4b55ca5dbc88db6efea71058e4467d70c476c166d7978cbfe26e5e861678913f357d991df7678b75ac55dc7122ec6b09c9edc22f150d994a24019ce6a1d86faae88dee8a6bddb93e5456f0f26cb13b3f3b610e5a716c2b8b847a68e19b2bb225abae520cdf906fb03ed1d441883df4f860f92b4db05d476a4a0147dfcb1b6397c5084c0b1d28b4b5b1ef11c83e399e1e82dea3729d87f7cfbdc0c348fa4e88ea7fc264efeb4e9134f7d82eee584d4298e738fe30ff9342a226dc6385f06c2c052105222012aa0c1656b3b31a9c20e74ed72ec2ee9d2831cbcd80affc751e54d0f3f80f075ae3304117a829b6d45b95289ce8791640efca33fad23016510c0a333cc4b20a8aa1029e81e11729c6a5540e7d8faa0fb08f17c0f5fa6d3b4bdd5516469093926c8e8c15de8305db3ba72de8c14bde41b5b1205b0521efd42d393e6157853b08c650d58f74b97b34fa09279eb1439c1417fdeced746f3c47bdcacbfcb8cb31d2618fe5f28da9029ccd724b1895a06cf09d1a835c880bdefec43506cfb189fd5a05f4c5286f7b217b7a8aa03fb589d63d11b1ed928a1e5d5f0925f7c389e7280679267c1762586139cafa2ef95827636339693275c1cf3fd45640a5be8a0e394087ce12a9b068493e856afd2fc7a29acaddeb5bef77470ec4712e18a9fa26b86ff59490c49fd261f2738116ca4b2104dac7df70e7f2ad51972398586d22562efa8c1ffd5279bf31be5be880b02acc27fcbeeb77447c2a91b434266ef04ac7224b1418613a84564208074743cbaccc8d9689ba7af05be655856c7f611cbaa11cc95526c46409c01b393d4568011b49be12f1f280d2d7082571934c39d8b90ba4dc17f22fb84f2444bac68af53cbd6a41d6be3c92d23ab989e07034fe0b902d43ec2124a91ea0ab46f26abff563dc589d4cb83fb7d8ca200a3acce0b99f883080613c633b7e427ca848f08c6d5ebe3b5ddaa6a4f7ccd1662fe86ff7727be73ce4a43057ecc07ec1f22622986715ab3a06ea52125a9695b2815021222f87f578f61bc5a9c4cc9c9fadf3c68cea70ed7d22e38232e91f5f2d87dbaa09faabfc0d3e2fc201cb8ae4406016a50fff57cb2d382dffacab4d76fec9f1d153dacf42234448f1060ae39ecc93f987caadb28c72d1309127a909244fcffb5fa9d8db10e091cf186188bd116ace033464fc6979737453ff4be93caf45225f1db2fab7ae6fac2a00ba4d0286439a9c7386f464da59a90113c175cc600a4987d0174a4c64f61dc371b76298457f7e2c0dd89e8bf74bf99f933155a37fc6ccd9437fd0807a9e6d013303ce699645031bcb0101c71772ea9648428fa754a034bf3d93933c378e234b0d44995bc1bdafd273aa25fe83f6064efa9d2dc226c107a085fb9b69e5efc70bc823cc580d110db7cd7a131984fed52f71ea36db3f51d0e4e45ef0edcae8e1a82c476e47c466a233a31ad20160b2dea274d0b3d9e57714f222649bb22ea2fa8a0159870f2ce7f8afbb316a9c5f3ba90dcdf7aba6615b5d3407b6a39e5b4499190f00209a8db99691de68e4d4cbc1bed942082629fb2632115afc109b98f747bd1ee53fcf31070442d4674790ea6ba66f9cab2d4afa001cf1e5ddea902ce38bdef5afef965ff7cb2b65d59bb80662e835a287c6f1a810a23c6e023a64602fede45d0735d75eb172b3595be93365ce0c951e45fc064b7f4c5bbe1308017c04f5371e951b7a775e814177a038eb4fd69af6d68cd4712c74a2b49db75a4ec8892c3f0000a868f226803f884d90c70ea21bc09405581a93182db0d3963a338be71964cbf1e4871730f8145409f9afe95b175a1e588feac79374b72759af980f45450f460fd8c02da57128a37d7c8b2729142e3c2c81c7120cff3262a8c1659acc36a63a038bfc7eac71e33d50204311339ca3b829379abaab57874c2a798275a376936f740521506e82adea2beec0efa2362159f8b84c089a0320ad88ded8e8f48d3cad0b4f18ec132bee71b6ece8099d6b10e6410cc344fe8b634d6af94d3ae4010bbc7070ca9ac2f50e9b9824a4a64dc1d928ab3ce9b60278baf476d0cab59d5c66634a701ea2a36675307a9edd0fdac2e2e7df4fa5a6cb518c69576e389f4725b76b4158fb4bdf088bf80361798d6bf694ea854dde5b849e4175b3d87d4109e5659dfe2f4bde9e63b9badc75626628e457fb443f7e1e53e841e0331883e30c23d8bf29fdf5a307fd6540ace27ee23a1494e0c42c6c3760b5f3727e3430cd786778996acbe1e24360f9501cb0b74bc90eb162ae1c90eed490c1f23d376e46743aadf567a0f7e37914dbb3d4e8f3e7fc5b1849aa17d28ad7fe122a172624972822df99cb841fedd29f75317b921c00fc822f5d5f261a5590894fe0b50b3a09bda9764e3c7f414a768b2d91b9b419dcf10b60667650509528b8deddbeed97e25b57dadc629a45408c606d9d3858d2c3027f122b969e5c93c71328e9dbd5256a29b3730be7dc13183da49c1b9d852fff5764ac7568162697932395cbb4cacbeb5045aaa3704e931ab0e121d4934418d71945980c94c397e9b76f8e4df0d471abf895e56ba8f6ae8d0e9e6690c09c759270a73db8c1aa95d05980793537fbfff3472c8d2c34de4abb7e64d216cc952e798314034197d50996a2dcbf4c33485e0b68910baebf0e50ea29bacd3060372bd47b13526ec04bdc81b90dc95a8ac2743b814cc5b9ef8ca9633628bfa4248b55eb7f2d9208e114f4dac69bfe27e4722acbbbe625156c623b6ece36103bbf989205b8e82bd7a5393be8f30cc57aea5e69023de69289df98f052196d29bdda66cb6b4ecf86a3b1c198f566ea881d4390172a30d474dff034af593e5470f21cfee96668670934b0b4f24747bcaed698101d89bb3932dd46405fc966744ea22e67d23c2e3a1d52481a3327bf0b9f6e91e46467079b364c8ac3eaebb8532c94b7a97035c9cf2bc421fc42ddf65ec2add516d30e3b85e7f363c637075d7b709160cda99b61ae9953e46107b1133d815a0dae51c5807cad9c7a502e657c748461d1da67b41d60d0c739526aeb3e30433fe0b2c8d3fe0af00d7669b74c3ec4ceccb1d891ca266c39e8c7d653d2a1c07122f72c1f81dcb6180f0119ba06cbf5b89aa8d00f23a45a3b7d37f5aaaf617471ccf9233e1743088d6ac0691fd94a8fa89260c9c907beb33d5030b757caa9d5ac058fa00ddd5a89b8e65d60ce0ee318087d7ecba6c09cfda9275b25426b9f6a8a9461aa731a4ac0ff4b8007b0ecc01a3f23adde919567c3e6cb604654da6bbb744316495b183a36cb60d064abbd061cb54c930b6fcd478a5c04e623735e3650d0d85785aa1d537185eef682a8c7e0a7d2c0d85929b163dc739995c2884128b2071ccb674972bcfb93bd996690547442fe4625d1a789e4409354172d7cc9686882d71bf6205f9e5c5f95621a49aaea75a1a82279d19df13f24fb116c353f1ffaa8d1ee3b172b211a4f3ef9a5bd116bc823ac765b8f34b3608e572e859deb74f1e0d1ed3c17206cbfcd7f050fd2d31fc4ec1bc97fca97522b393013829b1490d394a1c0030684a8d340222f6072372df064bcc5eb680ff5288e4e6b6a16 MD = 36423179904261f57bf7405853a319058065857e67a510128baf09a68c30b987 Len = 26648 Msg = 3ac3e86e6d6d65ca203b850ac36fd596e8e01f214bef8e390fbd141c4a9b09cec4c21568fc454fb36c43a6f50e61810b1f77a2b8238a503d29fbb52a50fd85738a4ce0c6a01d7a1c7750f98f91ed9e6bd6ce28879599f5d6c6f26b3992ee969715ca123062dd2c2ec7cb447d53fc76dd964c7936a804c62b6d0afdf116548562eba2734d486dae11e61a506a5c744f8ae6595c6c64b30b65a6ab35fce6199bfb963ecbc65db548ec5ca7e5fcb53f729a4e5d9ad1d28f0cabf93dd9ff0a231d8b9e04e242a69d41e7afd9cadb6543273456c0fb0ef97e1026ef28b2a5885c5639895e806a2d0ee32c6917c9b0746ab58087eb47cbe26961fd0fd488936aaa8d2ee1b36ce6f9ee74e011cba823eb9a66a7684446af93394559e1a92374b8f709912d6b6f5d12273d2e305c30dbd1bd80d18234c06316d40562ee104aee782a138bf6ee5178819f863c4d3229812eba4c255b247c8f7324e93fbd6fc7a9b42bf344c3a3dade4d409732f0b55bbc0b7912cc7d7a43dab0103819d72f604e73e2f1e31cf4d1377ef0b739a24d8e356fe21aee70a0ddecd77f3c17c2b9de85be3755918948002d1d992f79e962899462ddabb1bafc126eef5b3b62087408f59c12667593082d6630224819505c1580ec520e40e5f8aa08018b7e2130c7a847155b6db8c19a218ac27347415ca3faa116298cc179fa6c6114f74d7dc31c842331fab2819c67a442d874771b979f00a0e74a6b5dfc6c21223087f09e48da662ff9d77df9abd77e367c0d1fcc88b8ee25689df33bf8b591f25d23aeab4768141674da16477653760db526867fb7578ed79f0b6e84f43d847aa4b3d0cd4930567eaaecc4958541556f8ca7f55aade2a65f967a225f796cc2620c1f9e2bd599f610a4f3d108610ae3060778b485f1c3ff6455d358f50eaa12519e4f60ee730bba7369d883ca9117e87731810b290b60618fe2ff586d3b5f3eef612b5e3dabee6c4f018423039dcf2c6d0fab426e8423948847e56af088f30ce55d9ce04106abd24e75def8da0e99768eabdca07be3735ff68c6cd6a67ece45db9a882d210ba8b516cccd4c786adf90820cfd6e79b0b78b82b77ee3b6a458b17821d98e06434edc4f0e3b65053c0840f23af7f58f7459e0d3d202db4982fa1765f9754b18340511a2440f8ca8097c4f863eb07ae6b5c02692e4df0486a11a404a2a46ac7e68361ab6753109895ba285e51f1248a5fe542566f6ffa7968822f5cdbd32f8616747c035a98824d1b9e4a9b8e504a6f5d47da5f80f490ba0bf78fc99b92379e8b7a2cbc4e8fe25a8aca985a6986ddbfec1a36def37a57acdcf861d542600753ce2ad030d3b7a5335bb5adf58413730e74c2e46f476fb3a453fb222a70cb1358470d230b8a9e5f8a16e5d8075e849edd9fe86f8afd533942f9766d139741d01e9e778196d3b255a134d1b30a6938b5afb5d134bc75b36d0b36009f4b3652e2193d10687d3f823c1b4e1fcb6934ce5be76f33e07e511ea36fb210351bce8cbdca9b5e64292e8c777acb169dce31a3f6371486df3b0fd380e2c62bbb1fd04dc7b541c7f125313fac32245c8683f06818f15e209d8d129089f71ac9bdb1dc14a46bb8d39bfbe82a2ec3e2682234e16938b8a4b7b7eef9d4332f0850a99c527fb8507907c107a3ca83b2adb00d5b9545d9ff70b2aadb360cf0fd17870b19d3fd8805fadb0ce3049f5f80beca94627c8c81284a87d2dc479967e3d0a36ec4c10c97fec6d3dc187b2706b0ce2e43d4179ba2e5bacdec5ccf37fc75cc5c2127ba2b7c9d5578cb1287e00db52441b84af6f1c39a19fb43f70d3713155307debd1fe88a743f40366bab58f92089ab5e118b2d77c810766615a23560551d3cf3ef72b26615eca0ba7e66004d6546d1a1d244bd13f216e5ef432eb158c773721d59431773f4d630d3e548546f05e43b1007c41f4caa95b03bf9f31960bf0e3d9765119658839476ff1ab2f3f284fa7e451c89c27644257bd8c4affc1cde35f61ead6ead78649fc9b899363d6c54f1e1adaaf64515614e9f421db5c7e1979341ff9caacb47fa60cf7ceb62bf3118532bc61daa25ce946991047f951b536d9e97d6ad668e6bc77ffed87b98e7e521a6a30aff15e2f6200ef79c64ce44e6d2d06e107a1255485e55be37e479560d1364edf8c9b9eb20c6c7498667d1f31069a14b596d4ebe62218aa437906467fd6ff6731bf806ccd2eafafd3ef340a46494a9a60e016c284da377374419eabc4a8a03c8f1249cf680ff428932818ac767d65204aad10b316f66b3fde9eb8cc17913f565f4b9ed06bf8616841dad20da7ec122edbc569c584bedb95e957fcaf61d7053b0a332675be311ef643cd0a35c2dc7a4d7befca01b67ab0fdfd36115e88c31975f9928ac84a02545a03c9672db096c50492f5db6d957211ff8201a0e1769da38c933072d1f5b32b1de79691fc57621adc889d431407ee2724e081503e11adcd063fd48497a88bcac659fb31aaa187a15cc5b0abfbf53519f37f7eca7f433abd6d67486b224cd35addc0c2ef40754f840cb1f5ba2c489010f5c8c0b5acf38e9b487252cd7ac7d402eb84b172c5ba00e874b53619aee64734b0210ebacb09ef9020c8bb53a803d3eb770c9163415ae3f71d37396f89b9a2acaef33181e66ca6c47cd14aa4b3e61b3c09c22969bc3c40d98ea1c765c5a8e8a177a7f2b10406fb5ee4f4c969a35af31e290d432d3f485fb64f59a8a36b9a633a91a317f22ebe3586e09cfe498046a2b96055a556d16687b5e9c9a4d0837959a0865168ee6b7c9e66f92eb3ed539171343503188d7b7e02fee3578394132c13fade18af4ac3287c23b613aefc2425a8b8317d647a447816bac56d0c99259bd9711f5fb2b13eab18e8a0b3b81ff9e98f6cda2c51c4343c0c1118720884c0aef32dd3903ac9e5ebbadb3d7698fedcc56d79bb78a71453b32c2a62ce4000ed4da85581120f3abfd1aa2418c51840d4a18c0659ca2d11aac3bd2e2ee879b3b3604112b24df9add4452fecb606fe8de965323c3e88ac6440550944012a7e451acf068beda9c0ca2d30925ba1a3138f24faa843f11cedb41d52569565fb165f2a823fe9ba8e2b38d1781c9860021feb8c463642faecb5aa4aa0ed49e1c308a9ec613453a16404a0c80712cc7b8dea4c2a322361e262cfeece291687feeb1dca67552df22b9311a91bc3bf1e7aaa3b5804a6b9ca2fe40227b1d3187742d91d6ba34471eddf831bfcd1966ab7e6c3dbb7258b3ea26cdc15fdfc883d4237f6d033a918496d469ce940f2675abe473f931292c7fb141eb1d11ab62fcb1065aafdcb80b7fd9ae647451e871dd85c2386291154443845cfcbfe23e7b00b08535e6eda300bd59b4aeaf53e97a22cb90400655b74e83d60069264c397f345538978e909c2fa1899f7efc2472add9efc71151199fa9d518b4c6ecaa0cfdfc1188f6237003d6e10bb77bc74e248b6764ef32df372ec4abdee28c7f962965ec680ee822066a94e032a50bbd3b6fa15fbd611b0d58f54d7cab32205bab2f5589db32d426be30f823a0d0d52a66c47e276bd53067d97392bbdffc290d338f3b38fd8d409e22176f1fd8d33ebb7ab38052f2a4197b333a430e1fd91d00c9b9858e2186b3e4bc5e68594d24cedcc1cd4676e4664cb410b9ccd7dd2162e2f83ec2fde9a7b4b6f7a67254603e0c0ae6623ee7b38430beec629ead8a9d910029af820cd878b9716e602b95c4975cc25322d839d2966bd810d53703ba863df4f85c314f506248a07b1be2a1ecb9578f928fb0f1e41564bc3872345eef73b04dcef55f1a040cd8c0c84a45ed4b2c72ef1ef947844a79a1b7cdda05239bfe9e5717eb7a1145c0e05eb07ba3ec6259456d63000a85884ba9773b6d37f6428f6ecd8daf00a99836f5d6de10ab23c4d825670924885a1ff3f2572bbc2b5b659e980d8ac081679dd79fc5aba9ca37d511b9787be73f96941b02f3f9477da787b4a08389c08acfa91b34b7a3c76f7d25ae781e35b89ebf672951ca3e8fad7f3b5a2eec151f7b366c8a6b0950da29883906d7d4b12934292b87754665f51956c3078993b74dd1503a9d89472d5286cd81a35f1898b97e8833edc3f50a286fb2e1354716eacc3b91a5dd360da3d0e5d1821c746636da0c4112a4f452959a1f08087bede21a2b087f20b1f7a95ec5e528dccace5a261b3be86a555ceb82ca85ea9b43f481efeac67d5dc424c6b8c20327d446b340e0edabe28d67842c6c1a52cf2c15e172b67bf4109f8c63c24c25ae731b08c9d6e1d1cac41e63f091bc39f42a3d7a4b31185f2fdd78633b487381658f13997878b35827017fc328b7fd89f88041d988597014c8387ae0f1b5d965b6d0507155a2eff12f3f241da30baa8ace65cbcc2f38783d5bb619ae4d96e83320eb4418e7d1d22d61b1cddbe6193dcce44f5dbaa66a8b2968ead6f395682a8a1234710885a2147d6d1dcf76784d41c0d8a15a3d947c13796e2b25897f961adb394069b8d58011619fe79b75b03430f72a0053cd6fc9bb9dea1b97b852cd2396d49390b24df8736a7883c462444a95e046e0dcd29effee174b10a008b579ff4d92b2887d657795088596dcc4ab1cdb1ccdc747e5b86b15762fced1031e08e88fe201b382928a00bc557547053b079aed0d38479f32b7ec2b068aad30030689ae4115945a7bbc410646c385bc9ab73 MD = 54290349fbb1e8327a65b871f3fc2c6d3975775e48dd1d7b2c368142bcfc8c27 Len = 27440 Msg = 9a9667955c84473adee8980b59ea750bd6414a4541f689b2c06a9e5c439a24c45ba259814f80cf2b6d1b65779e8476a33d7b50152935e83f195cccc5305858e2d2cd2d08b564dfc63bcfeeefff07f8f9add82ca318a002da865429de4ec3c1a1a61fcb70b6b9ded4f10c1bbba4fd63d3cf61c73735c03f4daf589feec565c8c87fa01b017906341d36dad422b6ed1efa4b1d0718a81c085f3b73153fbdc6d3210759060527d34869b342016d5d609336c815d5909a3cc3d7d3aa74175d6c4c72e35172c2e7a984800f4b8ae5c0dd294eee4f1ae533a9da7e1e07a2bfcde19984be904981e20e4f2af3fe57cf08ec480c67d5bc609aeab31cc591887f36ad241f3e1f718a3f8d112e076151765c155836d8afa549f887b8796f500e9ec056530a0b05d42527ab3355f27f5e21e5e1c195ece3bbe874094f5cc54d1d669266900fce4a589ac2f21b675d5d6717cbd7ecf1497be88437f7e28e6e8f9b1dd56542f42ff7e73037e9322cef0555a135803f12977e126768d9d8d8131e720cb0d9d082d5136831af18e06b517e0e074b6223bf7ff523d7303899005c03887b4c4ca48169a6c2e351088eee2ad07c91370701c2a8e7021db79a8dcef045c7b2d04525b992b9df8f4640a27b230486871ef73fe1bc5c9781248a1c0c78ec15f8654dbbf2f952a67cb54886dbe42013302bb847e5605dca4a9f8dae809b015c9733ebcef3467cfff4c7a9a0d6142f0dd583d47f953ef083c2522dabf3028b83d561a7c685203cd23da4ea5a335b365bbe51d351bbfe20aa2f63f17b2e559272fb18090c702f9c07a073931bbc633fe533bb3b241d48f227dafa6186f63b1f11507f9a067c1ca387655d2d4a37d151937ce9965f85c270e20b400634165c38481ebfe11d708f5938d4893f516d50754de0046b6cb917a1c40a5c67ee5461e8ffabff66b9162fc703351f51972686b2fba83443b281ed8db31e770d1a7af2341e4168b24334a5f4d0cf49eb84291b10851da0a599a7ed3d9890b97e224eb6268d26224c219398e988eb2d968040b897d384711989f1beb85ca849446c9956c534a254bcbdfbb1ac11d1f3d9f3310550cd28ce27ea290806e5ae50e762227919fbff268b7e34984755c9c43d45c5a9425c50e058241575301deaf5ed6ab3c82bcb83c140cb05f4c13b1bc849dec44d756643cf339f7eab3deba461e0ee12eb028a784d630e376e23aa0e268527f698f2d44ac241c42b52353623bb47550889a62224f17dae92ad748ceb0779862333c08fade108f9e61321e8b02cab075d4a2079d0d61513de5abcc8fa92ae6412c5e77eb45512a7759608e893dc936cd9d87779c324b3a5e31c044683f0ab2a8cf77088a746e737a182f21e14f287ec44d8b3094702dfcc699c53eece48f83e59716297cddb0d0f327fe7727b970fef65f5dd10a29822f03781b1a823c31e0a41dac5926f3d0e99f037f0cc0ff2b4dd05d5fc781d0f03791674265cc989a4f40cdaa260d594723ca34f1414192cfd1eec201828008f0bcfce1dbbf209c11266811b00eb4707bf5f12725c32e16c731ae27f3a08933fc05a272377522b93f1c76942e71a0dbe7f6c0646ce0eafdb9c39af9968001e48ac82e92f63647728c77f8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d81eda10ed83a04484ac6f7e73fac3b7e93a3b724902510bd19d07b7b270ccfa47aeedf95885c0607ba720391d725076ec0260d815f096a96daa7a5eb0cc188ef35e67749f096011c66a7b589c2e83776e505938e5aaad0898cebc9ae36e438961c9c1432f9301d10b82db5d9e63df11f6806f055694f6b1f97648ecd8fbc062195da5c598971816916cbaa892d6b5defb2f2ccde753f63df63da9d4ffe931b190a66f7c589a256b2ea4b3c9f7ebca5702b90d12f64c3df5258159d3c6aaf9f06e2098e7ee20bc3709b731425c076ee2a3baaa552202307fedfdc379cbd59b96e858bc98d7af4f12d910cda22dde263a44b06f04f8fa7046d5ef91378ded991db5bb44ff93ba5077034dd369fbc482966c16e5b2c9b97fe273f32d8d7b57750d4cc4cc9ca0c652ec2ecb0cea345f06bf807a78df32b3a1cb2e8502ec22a7b1ee2401ade09d47e8eaa214b4d3660214fe3837c2fac26d98798c31bbf40252c228b1fe737bd7d364eb03b775960f525fdae9fb4e95d76bc6761365a30598ed4855ad17b7beeeed6975ca2fc9a2aec429ee1c2166210022be393abd72c154db96ed4be9e53a40fa59037bea2ba9b2dc15a04536c43ccb26e23b88958597d4a2306834e1867e8c8ed62c8f8315ebca1ea58a0bc7c339a6ecc505738a65f986e5c75eeeab05ec101f43497b67030932e04c13c640fdb811e8f92f92089e76f9fabe29df830e138a2042f2d6128d82bbd59bc61b3ece389aafd1025a9c89908c6577519e25e975493637a116221fe89372f729611ddf2bafa5ff3633b2d1c6dcca958e90e02291dbc593fcb1f2349b782cf0b63e6a8b01df7fc623b3e7e19a697e9b095e6e63e9b0630a3e402f661bc8881ae509a16c7b9871e86361a8437b9115fa8a6d0d17fd7572ed0e37261efa02f8c83e695efdc96930b87db37071fb0215265a3368a93d8999dee50d72e9b6b613ab3ac40fb9abd040c8cb3fdcf7892ae0c12147fda24a6b2c324b498230c2605d1662b0101a635c069bd45d5a3eb68a2d3d5811389d74a8ce99b961f09ebd9039ac3e941cbab06b16a4319254c2039e4f0d6735a5f56cb0d567b7ed3a7df8a43ddf370691f4f39be5746b75693be0d5cab3e72bc2449311f54ebf41cc79143ace21e48dfc63ad5ce77eda8d13e6eedf24b3504a19f5785a9291381622fa80b28f06af70d8815e2cb136173fd15d7df8e1ae2b3719929ce921e1cac0da8cdeb9f500207592c88699c73caa041e2a2ee185e6e0694da6714c47b2efe85faa8e9f74b0c002d7c3a7029df4fb7076b761f78600185722ab85f268870fe33ede0101927b168f03ed4025a9f1841b679fc7c9668c1b97351c4b8a08d0b347d491e65ed2c18c90a3bfd2417fa4ec6b5d4db0c5abdd929001634261ad12728ccd509f25ba46aaae33b5ee0483a19cc6e44bcd7ada96f5e7f42b0b27c9dea63895a4abe4cd5ce94e3069f3dd5a5a0dd489147e67572acde5a9ddf63ae397f6c1aa088d1a6086d0e72636744a6840c80ab8223409c61b733f7ef6a4199ed0ccbe96f6c3453866ea0f81b5efba31e843effe1f9ed08beb9e4c000f8542301ba095c8f9eee3994fad2ddf62d6cb5bd319dad7470f6a3d1d97a1b9832a535bcb0adddc7c507427d392d89bc7c9fc2a73b271b04316253e1407c727ec03bb867173fd3e18988558752386435f29ab325c964b258e339023815722c7b491e924a1647a6a3947859fc6e7bd7293867717f03dbda3a2f84971c81e5b1577557adadd64ebdd68bdf3822b47f485ff60ee3fd1214fc70bd4afad6ac5c69daeeedefd87edb824219c5d9424dcb20a0d395f0e71e977ec3349313aebd5fbccb59e8421237775caee43324a360e8c8b4770682844eedcafb3d67caebdc7612f461518da529a9b3e39430018f165ca6638b68801dcb9d46e07fcf07d7332ad31bac2fb8d77bf9f0aad2c5584c97b12475b7c4d1fabd2f5c39a3d2b2b8e7026709e28aaaf156ef79c946f911230a6ea9b1a2215f634b2b73d05079b3d723873686ac6a4d3ae114b70897d4145c971c9ce0f58711a09d1af26b2fcbf27c0d3fa95ab2d888fc45ef12316d5e493f684267ca57ffcff8dc8443d3e7d057efcdb4264c9bdb437da909f30a72a09914a2687137718f81b530efcdd02190cb778c6e16250f7c660736e8c05d4ca1ea22701722efeb420f1dc0e5f82a8514345d72f4e2adb8c2dae01316e3f0a36926b2f8d5e2b96c1d6279b5ed2ca8ba637ceaa6cdf0ac3bb585506a1bc28b2001330c622d195f9c2a60103690d113698589635184aaea435d50a1607dc7f86a70fb78d7a42fa72470f22c6c544f33398345139a9e772e76c323191fc658fe2abe643e7fc48c5aacf701137fc40fd0d3649641aaa5be427ceee702cf7ddf6408f458a581149940dbc8730e966577b2de306634a821e9ecfee682a2972bc3f3ab19bef6051cbc205aea3265d9c1f0a003ef9c35bd985ff5a4b4de42a0576c73bc357d7a35655ec3d0652460715fe364eaaa208c11948825155fe229128942ace2517f763776e8f2e642334786c7b6c43a69da81cb9ccc43faef75a1144aad65c673ab3533d7c073448846613f82d3899c32b25c14399319fa6d81f0ce20156810a6e9fe5211500e913f44f7c517a07bb70f906413f1456dbee0ed5f6996e27b67ef2118bbabff8d766f1751400e876134075ce2f14f4a08ed50a1360d317c6773583bcc982d34b69a21a6b7d7f0ee04ba22fe1ed5d80ab230c584bde17b4bf3dde820620e205953a65dd971b2433f2df2695e60e816ee322f48803c0efbb8e94da7b622470bd52a412998c6fa92e1a283e364f051905c5291e07cfabb39290f6a9ee6536b761004148fcb00d7623c2c1799f91539cebdd8ff96614011be072fddd4993fa1e972a8c6965a65703db89253910319c8597a8d207115563811bb0f4d51b52c12ed63e000462d3eeeaabd9ee1d56b4225b8f9399d79818457baab78631e2363e6094b726aa82dd27832b316696d1ad97973a4a41db68d1297424131c742cc2c44c69227abc3406b375b02c3925ff725eb13e295493122471f30e40420c597ce54aba0c76ca04f4f53b0126d05b5e970a41f1ad6c9f1266c180cfbb717b06b934040 MD = 683712362407cefd2968ce6373cbd86c1a6170493c84025be740129120d327bc Len = 28232 Msg = 92983501a4d7583a5201830266c37c908640b0351461314b526cfb68cad97bd7ed615248fa5756c6213bd9eae98d2f4ecfdf6a452f2e68c9687210b53c74d83575e08a7ace9b49b21056cf377c64f80669c884742e93181c426d871ca2715081733e68ffe94a39e6677aea51e8f0e1a09d258629d7374a2b2884e903c577eba32fa2713f130d2e496eceb4a0f4daf105b31bf9cef4c306de62dfbcd46e2fb283f1352fa3138c31c56d7bb48d6aca301bf3d464ca4bde521d37a78bf66340ac09011e2991b36e4941aba8727e1067a7cba4784f85a53138d0f104dbd16d54e21ea686e772b95c7fa6717e77dcb05a5dfe102e4267c963bfdfd61d36cd53105aa82a95f2afeefddada07254a10104a5a9a7d1fc6d8811def322f1b2352df1e1e90d372d1ae1afa62c6b5c47380f9e0a788347362409307d1b243252bc8d72636bfea460cd905fa1f52c3847b9632c44bb17d519f07c8c86c455c64d49704cfa81cb6382c9776a61a67788ce9b9859d4efc9fe10495e809c9d4c000a9272ec27e8e8171b84f37a65aeb1d054550b814b950e44d1952bb71ee48b8202fe11ca7c0ff9119386b0ea1e7c8fa1618c594d0939792ba66a708a9e5878cecf02b9825745630573452c43fcae457e8e87fe17ae4b8f25274fa9958b67b848d736e68e4a47ba453356c21290a297ca240e667b9b59b4c3dcab43427670ae82b4013558d57553536c221ec07af7db06da562ed360d28e8a3f03ea2be021effede08027c896ce2d2864d9ef80c2ca3d71a15b3d98f4470dab6ffeabc48e9e12fcda1fa63c68cdd250a2fcf03d49f769d5bb391d8872e0057dce5e16e214726980b6579a92d53b6ed704f2b8e64fec7dc27c6456ae90db164295c5adbf9b824ca0fd8fca71e5fe47e412230f22d991c05f6a45b0b1552089224d9b36042bb603843631ff82a1ffa5a055f8bc99f1ce7cd50f42f23aca97a6447d477a58ccf6d555e9a4016d1026d23354d789f49e8bf74bf3c4e6f0f529b4d1ad334164872a0c3b9e5098d93a5c15c497293cdbe9b07bea9c34527ce0bcfdf065c653cf633aee5dde9d8c6e2887b57ba7579ef5d8254ed994f8ff859339c7ca2e687742690ec4e430f3a4d5e190fb810bc777eb76d2b841637ab5b414895b878f817765a08ed5f71dbaa9b66d602ffe4be38f64c89f034a8f203bb16d92014e117919df10a36bbf2c5a64b8d5de9919f012ad09d875751ba2545b23a63e00473ab92659c133cc64e53b9a8420f180fb81bb9b82ad3a58dd247ddbb2c574a29b95a7657abc27410dd0c516c256832ecc86481f764fd8f2b79b028407d41c2d72a7aca0eb086812e276619f19807be9b38820028ec7358cd2914d1ecada1deaf3fa319d53addd870c5e75fc31a5c0fad80eab0b711c3b6d568dc571a3e0612147159c255bb46de8b3106bf6b3cd3ca964a05104c756d0df6a18d24438edcf1a95805600ab24027cfe15a9554700d63d7fc67ab33a7ede2836b9dc6134094f1c06c4c8f6ea05838c16f499e19447760050098ee2709a4c91e3f84b8e3d3cc970c26859cfc05fd7602335a16143a9043800f0f55711b50262995d8894fb8f255ff0f47052d73be8404c612b9ffb2f692eb60417dbc6d4e8e37f71f93b18094b2fb9f07749d4a09d74b9ff9e6165e08b2a9bcb5d353701e65cbebb074a39b3242844e5d57a6297de439397627029c45373d7cf2d2f0b43e4147dc31a8b08939694ba5bf2ad272793f702b1df94eee3a9539198f08feaa3ca54e5129bc42db48ab942d836accb58a4d62dd67d945c467610f2ac0f1e7e2780641e2ff0be501be9e105e6093ef732fa293d8da43a1cf4a0f32195f0a46cd9ee8c4fa2834118d299522a0cd32a53be7b37595fbc4cd6f5114446dbfde95fc1fd14a1f4bb152de08454dad3fc398603104aaad32d933152af4b8b049db4fde693433bacff01384d90313dc1ec333909a2a858715fd7d6126450169a37ceee5099624552b9cee121a72f7a600be013d9179a8ac1bae06d3d179a0f253500db07f8b9e96f5044cf65b098ba38c207bd7a5968684ca7759ddcb0729f2bfe106c1496904d8a2c2bab2193b224cf7772def44e5a1b998c600ef51620ee36fac6487e5d2f992bb54b1c5b38c6e1af93e71f50e0b8cb30d267699333ec23cd91ec184d34ddf6da536ccb1d871b18607f2f2895f6c99f9ae25356bbee1d66792b48838902e48c206e555f6e68fbf268a212a0cb77d6c05e22eb7c772ffde1c030a4323bb18a82846ecf8157c3ac975163572ffb4d275604fcf984ceded2b92d08c6cc6b2818008fbba2d9de80772ea32cc87e2c5f048815d74315c9e4e519451b76fa1f4fd530c7bd960e0e87a4dfe4642b356695b57e181b93d86e277e2792d27e64610e0b38b6dc72c9ecc07bd49e7249fcb1d78161952faf75c790e50b9b93a5b1384d0040e48100b18213443258c0ea79160db259147d5f93dc0761eee8c7b28aadf4fe71d812066fd76946249bb5d5579c1f8e8d1e6c6ddab3753bf802d76e96c6eb4bf21af94daaf3a8cad0eeb9d43c4cf55e263a649ff456c0bc507029a17e8d1a2fec329c9d0bdfba185ed934add12c78694bf1cdbf86cdd2291fba2712e90a6af487a965be3aa28578f7e48e29bd478ef925ca10933b1e91cd8c69388b8044c1e0ea05bb77de44f332c3983010a8a22054dc4d93e4b853e7efc004c3d2eb43093d3ed105919fceeb8de97c802a3c4717c39702bf79a874bbd6e21332b1d10f2851aa92add5274754d29119e73f1e3d598e7e72fc1cb187f4cb1b1eeceddab1086557d21a081bb7184ae5f5ce16f98cd0fdba24b3937b967c1693ae5951af308fc06d18b4f526261e3a0a9a9b78733d625873a04aa7afa83aff714ae1a4f894a7ac13ede363ee9d4eed2b90b82d3456f9e6d06f2b20f5c616cede7becad5ce5376f71d80f191b2390aa6e5d8bfde5e27cf0fa18bcc6f4f7f8ca01c8e235842c2652b061a0e056c1ccb8fb8b7eb02ee6d3be192367615543c83c03b92b0418715e9df810fe80477eea60fba2f70db66ce698541993b8bfb26e6c0bd62fe2bfbac698706e91c19562d2ea962860dd267b9dc6d381a794db4dd3a242a857972111468b4102c26be8756d9ef3a720e8251ce08fbfe30dbd511bdd26cfb609eae77dc6bd9254f745eac0a1c33ba69ff65c56973d40c72cfbc824753fdb88aea5b9072e778ced9918414a57a395ae45cf7331aa167db66c16e97184378ea7af8e3eb56601575411ac951b78842a467a3a11b501639f3835d55b09f0540f9a726e1f9157a31a11c6c98f3ceaaf22f6a601deeb846bcdd3ef01c6f5a3df87e9610c04a3e7a5fead1f37d6b4976ca44631ea84da1c7830110262d43b831f1d1de33293f2ff4e2aaf86bd138b6503d8bf83bea88aafd0f079d7c02be57a5efabd5fa6778688e7c69f6225eeca3ebbe7e80444f50426bc3493d4e373fa6fe245513f31566768b8fc061a350e7809ddf9491d46104f6a8424e86293558349f52762ea9bd99e8909f26b18b61c9daeb1356b348aa4736270e9ffea977887f2ddc877c8aca731d122d056c36fbf42147fc4d5b3da5779f5c8ab60d2b8860e51e24f18412c692b2a4abf4f832aa06d258fce0f00fcd1680dd3919483be24214e4ee5cdbde2c6917bcbe7dfc0ad6729c8287aa285b8bb4891dac4226671fcc6d167b11fa497676daceb6f8de2c1bb7be594f015a8d8bd2268256c92e298b607c277dc955e13f3c6a4f37fe2512e446d651959f0d3227efd7cfcaf6d5efdfaec09c48db8531e13a54d2b416576bcab062e00ddbc6d60a7e1b4a7b83a44666e7c8f97ed0eec806f118edadb9eb733984e2991a300de58dfd6f86dad81fb9cbdbf3a3724218f00ae124f4975157d5ab24e3e13d4448dd3cfe53098b7cbeb678dbdf3ee5979a56878b078c1385331faa20d56d09711e4981f15446efd9e7c8e877fa302b49c977e77f4f2884bdf39db0f93570e15ed4a71766f1d38a88516db520c30bc5e14cb0b50e5a3e6d741ffc5a2e92b16756327247cf9a13ddf052114966c84647f69abd6ae8c74250402e9800316b830e0f8e47adabdb9c7cba80502fda885423e219ea937ef4d8cf9a961d3d922e8a37e36e73b38c34e1c93f52a6d2dc71d9dc4c60b4a93181762dfbece88cd16a1b976a4992f3d1146856174f91dced133bf39df5c826b0fb8f0ddc9986586f9cdb8f1ca621d92b18b4a5aaed8d989cfaeeec4f5f81967da1a7e1c532633add353e91631abcfdfab03b3a82a306a06c878738d8f47d72e832353c4e3e2b9e9ad1b940e60da0bcb05980873706a99ecc47896bd35b1846912bdb9fc0233c1e38e0d0100df599afec93190e209ec2ce3cb969e7c709ee7bf8dcff6ec378111427e117715378e4421ffb5941e7c20eb95e6bad5f1c676c9d9fe4153bd0a3573af850f4075efe3d0dcad0e5c4f516da0a71ccc8145c1a1f25e6cfb189703b5acd2acefa2478fbe08d6dd23309b113a11c476b4eb9fe9872af7e0e48da1ab6a8752fa99e6b4a089b2b896dc582d43f10792fa5a5b28c591394c61e6fa0489bccbd878f553e3a9ab9729e1211b2b6ff94ab9b2a71808dd25e604f7e8a6e726143f0b2cec33fc328c7fd2c5dac3be1ebaa2e2a6816c66b9adfac8aad3da7308d8ad942064cc29c394325a4aef960dd69cd7b5ddd29d6ae28f3e3f838dded0b972db1a5c466890e52b776b7848dd412207b0d95f80f43edf35771289fffa25c1489146e67b4d591fb917aa58cedf818763f7f73474b907380570e8c511769aa6c499c0c8eac3adfaa6dbc1f167e6f68f1872b6659734f07669f06a3dac9959f24cba2f0a7a14b4fd5a88584bfc38c7c18eeabff8d0ad1e20c8be40fbb6ac872c4abb3bb2158695b03ee9166f761e1da52d26b9f8066bbcbe89a3110719f74fdd25658dcaa263799bb8c5a464bbe020c45ef04d6a23b7f0d816678567bbc2 MD = 76e3a0221b6d29a43a0c2929baaf46ab00b85571d59ef2b3f0facb315621f4ec Len = 29024 Msg = 2e523e9d8a5532127ec63b220838f11b0f8a09e9a317c1e4872d7fececc1b4b88060076ba769b068087a21684c28ecca22f3e12a8778763444e96dbab8bbb005d79e806973b2ce1cbbf8e94901075a5fc0000cafddc3b1362d6360b738d8830e3cf4f0c0759956d69c28dbecae3c0385ee99d4a12d5f38924984a20bf480f47ab64aa19735840e3db5f23f7adb31afe2b6a67f2800b4d3efa0327add741ccdf14e88d9173cdcc0fa0d3f5c1a104d261e1f0f566bdc2a4cf53b562f554112d41d0b97e168110a32b5acf57bf5d6f82fe231bca1934c296a4d21d90a9de2ccd2a3f55d01b13d742d159bfee432b49a94d6f595a8c7d519f49f5aa153dadfb08e2e14c3801b468478c2e140dffa339b1ba17283b2300162b392ef985237c128d26471b1a8cdb6a1dd6586a5b475d9648debb16c09f5576c6fcfe7a54eda0e9b64ed1310bfef143222a69314aaca315bb15eb83af3405fa0effe4aaf91eb51710d7202c60eabe9a1102c0f740a22c0e951a091d3b936a264fdc621a061930f11959b47bddd27bc556fa002af1ca4107633594421a301a7215fcf735f07f9d2e5c40fe9db748b15b607a974ac2879a86b2032d70af8c9f640dec248d4cb4721546277f00a1a007c2c9ff06e5376c8102ee0d2547802b518274247a8e7f4a285c6367a653118ae7a1f011cf78c4ebad1293be3c25207ee944053059c80cc3485a309c14f38b6bc96f7f3d6183ff77772c3f90a2a80509cf2f2d9a52b879925a954a3f3b6063c52591c3ec6d854ba267b63e1f193e925e5bba49bce5ee4a49d793fccb9a285f29a4af7aa933fb3dfef7473bd400577cdf476c062293c7f35c37ecd4cbb1c9c20b9f1eefee65545aefbe65a539f891192efabadf65ecd4093bf3f66eaa02b330ddad66a046623f06e7259806bb4259fbaffe3d31f14191008ba44736f11d833022382d482bcb09d697c534dcf2ae30a8e4ba49aa5f329d5dadc165aa4b52a8247bc7c92418f0435e53f5e2946a7cb3856fc796a4fa50479524c3c854e35290924ce4c0e0988289e2be6017c97d3e4125a39e7abe6cfb2e2b8333e5a3838ddb0e1817baea14f23c28397c5ae8b583680e12b78c5331c3cfa54b8a54329674f60c5fc90dcd38bfd87347a3027eadbc96b35f9b320fb31a9a76d04f8a7e86a86ff196813ff65e4bfd788b9cc4f7c07a6b99ccc202409b901d34d3ebfee3ee88a7625ec8c7e20047099c579218f0881d4545fcc483a245a4c653a8f837ff38964ae31b184c3cc9018b534e5b54d58f45b22c620b2c813bc93457d1fcac4cff61b8e85df83353133bf121d2213f23206440d18f1e6389f88de5b5e151f249ad7b7fd699d0f3c16936e9ac85bc0e75f5f96fc9f666df09066338f249907071bd341e52413b24045582d347cb64593a7a859d6a1a8ce5aaefd9cc919d50cd51b93c02dff6af3a9842b02c8835b2b5dd189958567de91dcc0f620f183eeb5f762bf3cbd42ca5ae09cb4f73f2373faafa7a953f039313fe090f8c7efab0f8ad3b8febd7d355a704b559a137fa52638f0efb19bff5ec95fcde4ac9aabd95e14d2e5f84c551f43bc5376855e71519b6f877248739a20cd790b85baa00d5503da5cb056f02d4aacc760c91fe1fd6efb26def817e5a9c56616023bc9e2fe662765dae2c0b2edfcbe17db140da30c466de65c49c6f81496bbbd1acd81666455f23bb243dd987d7ea1362a20faac841f1a36692cfcb4c3dbf5f6bb058c36296b8be64e9b56adc5187cacb7b58c054f422a9e6d6a61229fdc3b494da98f5a33ed1bee14b2d2f6ad1177ffe99a6bb553f7c4a6d0cb9e498ee0b63f388235d86c26c9d96e50fa7d1eb3bcb9279940c47a8510d7fb175b3279318d5fe45823baba5dbe31c33c7649fe447061db78b33baa3637b854163fe34915e931b9f3040807d9217d7b3fed62370dbe806c006b21cd5061d24490f366e4d5f23e201a7ec83ae31b46fe2108d1af56cc9d42f9117eca1cb5ab344c1fc334b9cf0d7f9739043bc3d413b3aa6e9d5067c240c52b4c5b89e25ccd8a136a002008a9273f30dec3f2c1736c04a1c7ce0087c9f25d5ec5bff2ea7ec0b0ad7c278f0ca712c9ae150e472521d958d0bd6da9ff0939725924b2ed7b410a0ce2fe3f6b0bf25884d885ec223605e318fdf6803218a9a06ce5103c62ded035087a98519b4eb180d778d7656b3d4811aaf11a128317d1acb3ca3166395c51c90a3cf164071d0d132c54b3810a8211ec7774d2288447abe7afd030375a3bed4c7cf1b28097c02e98ea36bf49e74d89fbe74ec6cc1def5cd8c8beb5b8adc3cb48c56182ad337e3b9778e4a6c4eae6d7c663469d0536560f07675e67ef1b3e14444d540af4c3a05d9940260efafc9425d55125ffdcb7c5eafdf276efe68af2efc97c92f25c2f6ebb25a9c6a0f403a198b11ab3965788841541d3cff4a5e328855ebae2e1ee5f307ec31b8a03b9e8535ae127b8078191dbb95b70311f320f28fd8b6f0e7fb13b2ecdfbfe3cdf5194f393eddffcfd5fbb12fed433641897f53a80d803dc75adacb0d156bba2dec5eec86a5ea9461efbec700b33832f86dc7ca636cede156bea98fdb15bb885a61cdd1c08baef60125c0d3e0900c75b12078eb346f468810871e95e96935eacdf5e4b35958c1810828a07c51fc469b0632212abd9d20ae7f549851ba88415e132941f5c38598c1f168ec04a7605d0f62234efd416f12a10da7a567c0eb846ea46c541d919abb255756f2218354e64f5f6460f7726d832c55d0d42c8f1b75790c5f998f46109f4794835147685248d75885f59db300f88cc290933497807b29b54380ef538fcb95536e87dab8e11b33d7f87b54a5d1f96ede4761045cc32bdd39d8b8a23c50b6aafe8914700779c3e1684c60b0ad58fc2f2375cc10514c0e20048f9f5c831be6d50053859bd694e96c83f254364bfe776a1c9c42dd1793788e9fd8b352aa39d2b0036e39b2a8bad231b57ab46a043b019c443b53ef1232116576348339144310c86239cf58e06434ed77561fa068b7113214c38dbac3905f6122238d7473c0179ac736a4f3301987dc3404d48debcb2cb818d54ec4be46c8fe2e3630a93b295d838cf56915fa53219a86179186f01fcababad115a164bdd498f4ed2b2bcce7692f3de66a35b1a9b8b4e7fed530280d51a6955770b5597e08ce00a8cb80bba2b10a549a46d6f875b3a7d43b0dfdf61c880812d8fe850effdc09ec09905c89b3cb916b718d8e214f88dfd54c9a64ecd5a46bcdc60d94f7cbd4d911702803b9c32f40dd1c9cafeebfcee955c438f97ec15d2e20bf2c79965a79c81b8ce10abe2942b543fbf2c0931efc40f00238101e5808dbb614e9877d34413364a059f6298eac5b1a802e74c11577631ea7366d5e123df0e877b3631ee1a1b7776b014a6e4bd2aedb49be10fb1be6ec4c23b255c078731a52481870fddb31d0ee4d556c0ee93c1d00c91049a39ab138f2f81a6db8033e946e1697558c9977fc13b7f4ff8dff7f42158ec3734d2a7cd5cda4fd19d73af71ba663ae756d94cab5923b3e695df6e2aaa3fb46126a43904f16bac8ee909842fc95afcc44f365c079e467b03e11582cc316af26cb9d6e9201789a1c50669398d3a66b8f68c074ffd5749de8e22aaba407f81ae3f32903f8996dc345e3dbd56f1d73175645575abf34ed7e570a1c69eef5c2beec2dcfcc4a8360d6f41d62a64c566643bf6f2a8fa534996968fa68fb7418f10bcddfe3fffe3bfc45a5619daea70b0a61294aac7c384112efbd478308c9fe2d91f78df8478a3f8a8fc864df5705a7da00326c6fb8fee6e481c2761cfa66f1b2e207bc8f1b851aa625db7bca27eeb95f915948e6be5f9278cff71a7958b1a03b6c5ce01ae46539d9a85d2ac0a9d8bbf5a51c64a404d0d06a1ae9893a9c509621a185ad2e4aa1399f77dc0665554a2c56bbda542a14f92d13031866d33dca30002210583bb6df766214c6732aa2c986dd36417beb774f051e08e217d5d564fa414e7b85b5a1669cbc1fab15731acd5803b4b0505a9438f4e5acf530a4dbd7718fb725ca3ea2dd0927f90851f145cc1c54a7c5860a045d89045fc035e2b9882225dcad7a4923b94810215cad078c4c506a9fef617c40031de4a1b19bf2070d88be3f813a37bc71c61f3916ab3876d4709ffd9c9723cfe030111367c7654cce11a3403f6ebcc59d2f9f90c4c1069deb197f515b8b831c7b7c2415416cbee340499f9f36ac3ae791d13bd8f582f469f697833bbaa33cae1b3e7827ece051630acced9d0567249b06575e62176574539d97460d3892930d661387ebb8c6ef6493e837da3a141c48513e81dcb8ed28e33675324633ce38a2e287fda13384cb306237e8c74357848818d340a9488e64a157ddc2975aba9016f6f82418ebbe878f0c388af49f95ffc2a3c2154844cdca16882d81410bec3bd23a00a5935fb8a6b8d86688e2cd53d090b8877a4a3c3fcbab2de10903d5d78e5d122dfca0fe17ab468d5e8d024b15c96a9dafda1fad38dbe7ef84943037011a2025dc93d2455ff7c0616ce1d397502cc8e987cf49065d9d4513a4ed56adfd61b3db9905a7d4062ebf1b3e31f740a78d3412cbd446d622625b50be6ef7a920f790a9efbc82188ec28b012ef7bdc5606d24afc853a9ab0bdd931d3d8393c7104e3f174d4301817e25ccb9dbadc7a42f3f132729f7e1e39e6174efbed5ab765fd827ba3e1396bd38faecaba0be854b6895a7ff4d2b701e3e80792e9edfbf354417d2f93eb8c21a63a4736d3ab47759b0e32bcece58d4c980dd28706a0c3f92819fd96acb9d042772a4e974f63a2e2d7cba46ec1a1aa063f9ba0b5bacd5bd0c7cd2a365715aed72da8ec7396f9a1a45408d51fdbceb337c0db98a36e3e6a801ba52b9afac5cee7b2fc49541035ebc4f80df056a23453e70315e3d988b999120ae82947ff92d77aed6e8cc125e1294aad211b9c7e9a301fef91a8df7207908d7ee04bc7cc447298c646de433dc3023c5a8d7e78d7c9f2e66e96103e92f0f6f95ed3baa0cba3464a25cb6661c0a51fa4e79a4372158a4245686d437d523b735f920a9d5d6276fc97f2464da3164d27893b8d8f12a0a3c843c35f68 MD = a7c4cff2f73c911d7e3f2f82b20adb9cf2caafc9254cf5997215a11046846d0e Len = 29816 Msg = e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d3a4592d24b200f689f25405d690a0bcde95ed751e227a1c54dc94c4f4f29399c6913186defd9fe53bb3db7b622915d1c271d29a8efc18ae175dc74b67f6cfbbed17620c4a0a8eb82493dbaad4321d832525551c0fe9605864439fc3e8b5af96ada3552dd47d4fe7eb3ebf049b400a396d3cef79ef8ec3b3b22aa8bef5b3c5c28ec1a55c2cda661ce5f0f02925d76e8d01050c24cc30c548877f5c9d2d8594b806febd27b186639fab773979027cdcc6973a35ad1493e77f5abe360eee8fbeffbcb71700e125cb18b21de584cf84b79e8638e683570c9cc0b263cf54b746870206874d885a2cfee080717eccdba3a17d548db948022f77c5151c833f265e9f578aebcb1e7af091bf9d0e7fd1b53e0cdb9895085bb460eaf50924ebfeaa1c6a68a0610a43d23505ee6e416303fad86c41b90b6e4eec4578c8e5298443b1247acded639598ee5eddf58ab6c2f40ae732483c4d4581f841a3c95fa6c68ee9fb42ffc870077e2dd28c7d78db1a22640f114798d748a586d9fe7edf093d30a2f54566d822ba742f3483ee9f2ac30fa4a46bc86535c21a0692db31c9ed52e97ac704ab82e8290b40f976b18422682c3b3bb45317e55c600600dcbac6af9219efd503365f2cfdb43195b77ebe5e740896598d7037627217e38885525bec953250a3c38fc38d82ff4f9dd8aea43b7115447259983a49ad925dae47a0d010b6d37bb7c8106676635d19765ca9ec45e9d2d41aab4396e7697fa2e6961ee9b8816d9f857370be64194e1db3a628ed1a38d1b3b6e50ad3d8202071c61334ff408f715a91782911f31f52caea67843d04f89271dba93687a87c3538d1217b97453b8f2b602892279fe00bbf6ef35432b2a3858cfd6a8f18b4d81e667c536b383300079076175455c6f5c959d5ec01848fc43b63a0ab5d0da9ce5c994c3b7c5896877b0847b6d83304eb2c2893b4249918d5149449ee38ecd3c9703fa51c377eec3c6a1169a9a625e61a94ba4cee25f6ca50b1ad6d959b2cef43e9c83ba82521a099554a304246c4c71ea37d45ec9e1430b1930d90440c4448e829d16441bdd75028bcf1402322963451c8e03351e577d8822933367bf4c97d00d0d9a39b7a06876511c52dcec200ba7e85918990a4a82e4ce4cce4affd32e8384f4f9df7d24592c8f4344da7bd9ad5df69ffbd3b541bae7c76290f527e0736f925a1a7f96f0b1edec4ad14407dcaf30ed68942b46c48d58b2dd63af60fccd5bdd48e560298dd981103be361b7b27be876bccbe8e55b63013ac62ec2d2aea4100dc542cc5f8137b0a41d617ab4e2774d38a48854bc8fa4a80524d974a47e6157cbda19096056354250f932d726f40d26dc27b3b5f0e7b816bbff4b0efff46af6bf8e526053933afebbd640c03470a43d094e3454acec0713055f6ed70a9928b590e9d51960c1adad8ebc727d06dfa3586820f3791624fa678b4d2919eef4035ee6f38a7cb167f81770b4b055c5c97440a0a5d86c5619f7d9f4d0641ad28e64b76bb55ad16b0d82040ac4e29299b47ebd5ae5cc7495536732e8f10724dfedb18ac5362b5fb93cb33c04f7f07aa92a29973ee9b5dafb59b33a11b7fb7d3c9b549d9c7ee76fc17af3860552c3561eb2dd95f3b87de7afb241b9142a266d1320b3b899967449ab52aaacb5df416d1fd50280225a0ae0dae97b779c52713e890238a56385bc35a0494074bda55309d519002072d84610a383c83b4f38c436c8cb492ba353a57bc8e91da7c5ace2706809403d8c3917be330a8fcfd5e3089ff8025011010919624ab9aa0d74fdd4ebff2a289f17856731b1063af9d75b23bf4030b42024aeff334e414d6d739f13c2c206210dbcc41db246fd3082fda9ffdfc9dcdd20b54a3e37fe0a6f90699a853dda24945123ff21891a79d932eed48346bb8e33d95be6c0b3809b793ffff714a46f0ce731f33e5bfe54019dd053e4963e3dcf1e12bf886cf2fc7cd140ddbda73ea8478476d587b3591d1ee426d3e2220d77250695893b2a3b9b36e15baaf42554ae5cd1e870e411e19c5616fa17d50efc921b53286004e2d58450105a0fa4782ea9d3384e6d5c5ddffa349b15c6c54253b6366d94eced7c09e152c503b3d68714c0351f7173f77f9b5e3ddb3f89baa55a0a00bca0d6fde11fd7c56a203f923a4e1b08f01a2bbe5f5df1fb3f3f08bd2159b700a916c63cf75f903066775ade7923e3d7120f3cb8e56ddaf52ddfead59d97e4be9abc63b3a710341b21d1adc42cdd4027ed1950eefa1242b30ee5d80b025dbac3f85c5669da7cea0e03f5df4b3bc25982e9ff0c66849651be4b1a796636f361962cbc466676e9db9274ad997b8e1b576f6e8b1a2a6c3f2e9d4a4676ee22a100bf9ca5dcb364a02f2edcbf835d0e2f6177e48322429b5602d8753176abaeafc0c7b2dec0578de90d6ba3f444f8a148a020b3b0cbb4f822f4f833a222a6c364c835d531995ad80b9dd03114855530ac3cf543dabe8a6aed2d84eb6322e6470941916c6410c52c5009e5eee7ed7aa4a45c7bfdc8a3ccdbfdd504073a1d7324e65264e140cc9f73fe763243342571e378283c47442180329c1300eef0bb56404324349b8d76f0945e0e4096c5d442d770c9bf8a14e0b057100f01084da5968568de8c0213b5c177b8f9965060a3f366d4678c2f01896331a1f28ebd18833bd99ca9f17e99321904545fbcdace3a8e7aeb292c9cd3c4a2aa99e430751bfc4e2629aded77e994002379673b9ad7401afafe38263b523874a93e0c6e981cb9d55355110755c9847ebc71399afa425ea0ce55bc0273468ee117da93d08ee462db4869fec88002aa9cb782fe6161d93b27de38dc49ab766df1dab3a0debf3b9e65edac9bb6615cad61fcf5de19376280b712efc0824dab7eaddb115c2194e8157d2a68115b5e9e36d673120049e3a6d45852c19135c0ad691c023eef2073b5702ae7e3873fe092ec0105208d79cf6de01386f877ea6c44d54638818063c56857750c6726e850fe78ec9869ac31627f4bef96da992ab9386a3463213773f3ca7164813a15e014ab819f153386fa04a3bef56ab0207c0f50d1ed6c673dd763a367022ea47daf9661b02065c7435b1da3e12ceac13369d655b2793c9bba177fbbe054fbef86db3ce7ad796e6d0add15455b9cff57fb787610b4e1ba05d5bcaed98564d16157ee70071fb21a6c03065552d54d8fb8a0315746802ccdecb74d57c7fe39964419709987aed1500e57614391f648832d491ce1c2be625f9a8852e44bf2db34def3e71e3003e0f8992e7348cc6794c4fe1ec27d4b158c57556f54bc2e0a5391780edd69cac6e6f956afc6cdc9cf39397348aa91a82db19c6694da4737eda8975992d9e11d9fec3d8d03e13851d740c9d4ef5c87a2afd91815206ced3043e22ccba664eef034f9ab86514cf22c27b05e683a61c501430cb2a93b9216dfb60a3a147205f80d30152b88c29064226691df785240b58d9053526c0cd52a0eec26a87d1f44673a3948a5dc7e34f5fb3ceb334c5f81bd0d3fb5e0a4bcbc91838d415e4ed5a9a440f79b01cbacc00c7e53c7442c88ad474bf73b459a72d0b307426044cfbbbd15e71415279b75bc1375502cf960f54bba0d61ec67965797f961b38d4248fa0723f635bf009400b171a6de233a2fcfe37e1c25d02fdf939bc95b87cf4000b90f3637049f720076278ed9a3b3efe33efdfb40eaef85bf4d648cbb662f2640215eb77029c06625fea4d2d847e400c2692299405852527cae78ab4afab3dc505a7b0c6a4c27c54dc1b2a56a73be561579d9c0e618007c5fdd618cd0e8654a788bee9fed14de75bee6d86f56cf4ad72395abd8f8d201edb002a79915db4d5900dd40d7c129ec60c0969f9865028f6c36e61f493f2d5e8bb747d039e07972ef2f77f81bad34596c9df98d885fb595fe9494bd7b83d21e40bcd266d3fa6adcf54e819ed57add2d839b362ca70c8f657386c60dd68c6949f306cbf1d12c579354a525bb6cf0cb718c0476045e333906b554a498c32199e88cde5bf79a3ce8a0f27c89d648d7a72d6f1ee09b139e5a80aa4657e5a80c0a01f28caa0296f2c40ab91bd577d1f7186714329d7b2f139bdc3ca4077cee13659f0f58df992d1894d990c932266f18c7296387d42c1b5ba42152b5dbe6feff52c7ca892245c774ff155ed0c86c8a015b7a4467ae343e3e1c57d3c2fcaa3e9778830b699d8cccd0aec70d76bed08a7b7d639f18531dff83ab87a913925018a580daba3e75f9a4f248f784043cdbd74ed5ea5ce3ea6fc8f4fab8bbf0c461f3ef11d5c051d511b7a276ababc16c13d9420a1a63109bb00057b1f2f1a1ba64373fd47a03eae35e6eaae0ed6af77402f81ec5f89ce7906a0e75783d336d9de14b5b71d36c51c7672fd12dc4a9ec7c309dacad8eefb0ee245c16f5a2699e9560990b8fe8e3cdaab463de063950eaad242eb26be345b2e0675101d3287b7ac96a8819d6bf51a7b4ce739a125247372e6615f9a6ff84368cba5500b8d8514a6286804bf0629c280c3cc5cdfa19761b287eb84907eb96841aa5d0d94db8d455873de96b82d9ae95db86c33e6596c6e0c3f5816a36ae61e4b3b02a5539d3eae561162c3f372a6d394835d4b7fcd01dcc2651d723da50cf9e7f64cc3c242e7c401899af90b45fc35b7cd05ffe67cf65297a1d213d9bdac7f9a5481c56b8d373afd34edb25a48097429edfcedd4d9b843de6dec9812353303e4de5836b9ac9b57ababe18c8ad93d037d7ea8819563d6451931e36b417c3f4b6a1c16a4275182ce9f670cf3f77a258824f7af57d2bbcebaca964d0a12232faa6c66637a4efc9be44afec6653abb4166b2d167dd0742003984f39ff0feaa92a59e75c5459b0e255d20cbb47ccf1d2f23a9a4788d9d871935bad242bc5172f6c162a292729616ed8dc3664d872f003d436bd947e6100b8823eecadbc8c52cda824b7571adcaa722faa556f830d514fa4a8bf85c73094fdba89345c1a2c438ac6ccb76e933932f842849065af64bbbe4ad8c7a2cb0e3b462284acbaad6d916eae5652f4fc09a207f9b20fcdc340d759af0efe74f3c39d9da2777d4ede17e481490aaf73bc14a1a83c7bfb2f29694d27b9928b82a516630922a9cea013f1e6cc7d2ff7723b22d8e2f3297c1348a7c43051ab97544ad135938a63c839b5c43d56330f517ae1fbefbd0602b90288c2e57d60 MD = 977495dc59e74389b65ee1a7a33295014abdcf7916f9e0d1ca39a7cd395e6c41 Len = 30608 Msg = aa2a95be717ddf5d676aeb0065f400e68855c23034f057805887c9c6f3aeab57d77f0040ad9058d939223c9ddf9bcc386637a7e2fdfa0bec7be93e98eb792c2e4848514c850bd97ed0c7060e1845d31ecdc0d7f3e7e06b9429ec0f94a73b0a2c86eb518d03d6aa73b6c211fe18d85bbe4458190cfa8abfa1e9f806612eda8e7818d2c8a82ed913e173792513e83ead40536736d53fe04f3a4475e9a88840003b86637e480efd5cf08d560af58f5d11cd8255f7f5bdcb6288c1cb8110be53a89c59083a13ac28ccc78ec0874d151fce8d5a8a21157c3142b3e8629642d7fdcdc41828c6b10f43ac8ffe1f66c3836a2ea7626e7fdc85fc35e241a2f0e5db24b9da4b2ae8cb3f37446f63da6dfee02877432269d8f3df12843d55f456a2d3b2b2077a78690945eadc90475b65a73440f28b23e4f301925d77edabbe9121c68e01732e7910122846bc1a31091565889ae7a5ec4599afa7c3551acb696a09bca0ee45ee95a78ff0322c34aa4c47e1e31e9eb906f692a5252e68eb3e5ea603bdd0c0a64334f427a6957306398cc1c34db45ef0f75da68a1485f6898b0410b6d206c1bdb4bec1835159dab966314cb2ce44717149e49d077db0481c3ac26fcb022a37b3c99bd44af965a975b9a3b0566fb61d6583f23ec36796a6cbd4028ae956246baf0a34f525a6a12861bb4bb55837f2abf42eee5267da2157bee02b2ab9d4dca5da00efeebc61f59ea6f38f23602fe06345d142a19ade38a51ee6a517e2863b2d5b323586b63149556be9d8c1155d698c81f455f3057cc3d6136ed7190d74274a5b286f84bc1f8593d9268f5820cb736fcf208f104fbbab33c4012bf8e2a58945026b03b1753291a118311ab02881e75558db58c021a4d6045a26087b08214a6677825bd58a7255c74f92e391d685ae8444b018ca233d2d91fc66d66c28f050f5e3f5ddb8a2e7ba4ca7d250c3d2e1ae45ba2437f7fc909821d348fe91e91b853a6d4df321669aa67a4778cb0dc39dd1dfe2c11d0f55a500fe0754e6b2f4a8d07d3e1104d97d920297570cbb3952bffe9ce50e33dad5824b6ebf12f799f0a218057dc977a991d7b7ec0117880d26511dc2eb93df1f253163ba230b990d860e471b53feb6574772acc16b209952e85a159a1bd98aa8ecba2e2a5cc635d55ef64407e83628ab496ac85ebdaf58cf3fe3d06c9e679d3bd323960592cb31ba1f61f71163fc356f3fc7f50a204c2c4ed4f335809cc57ea182768295eca3f78472584881edd54569d0921a0ebc807d954e922c1d3c7c97a2a0bbd92093d5edfbfee21f9ead4bc062a5d21eb2b8d2b46e56c89d8ca6134f05d5f885efafe97de66c0764b1cce50f23668feb3e3ccb379f949e701603120d94cb376d4a67680e0f63cfff02712c9871bad168fa72f16ff0af1b8d017b023b15277f7978e3d9073c8c43d8d9c5a6c41749a17d2e80cfc42b5048dd95356a405194d991c34cc4d2368f6ad87ef0ddfbdbbc0612218eea9f161e2b461c5ad28410b84b9d71cab1d6c5134de5381959a687bb090f1cc5cc667bc2cfb1dc11c26f193be085cb84297bb0c0f2e85168a02be1edb15c674cfc8320e339071e83c36936c69d3119a3b329c13f63ca0f063cf4b2fb06e24a4c025ccd2a732e2ad75cda2d018c8aa34ed848be38a871bb1bb567c18c10870ded675b4c3e84104836162ac793b476b0ae1f407052c7c79cce91eed849d834f756b2e664c97494c0c878c1cc251dde8aeb107a9f36cab3fc485af0bdda65d251b06b67dc704ba1d9b40a07045ed0ab772c335c138cb81c21b197d539e6bf4763221a457ddd1221dd23546537e7d4c3c099114f93fb9aec5430d1041415ef7d75d548e80fb8d1fb123cdf412c673110ad5b31bce92b770added8fe71611fc5acff17cb85aa88e17c1283204ac87f079859a1b09dbc5575e041159e5077feec8b99d3f1d2556535d310ed5177fef18e5927d58a0327143d011c4b766ae0aceae7a01187f3a6a27b5ac1751e06d46b13e1a2d6fe7b5d641484b2d32d2d458a3f35b468f465f8b1307786b2dc93e34c46b66d2e8482e9d5caefc75519241117581a4942cda5d611d3bde31f139b9635754be934c29636d99ea6ac39d0cbdde4c3f9d1278a3fb95503926922698a77875e1699822f41eef02e4dd409da9106731158de9fa0a03cfb1e998b5534dd01e23fab10af21025cb9e859f14d9d101532bebbe403a753bb64a337cc300c2fcfb6b87dc1145e540a875b3f766d9ed5a4a43a97640c14d6df3220019e3b55ef3b7547033d4a1db392e90572c5e2663e1f68038fe1116fb5f2e4136b83efb897cfbe69dfe7c915ad706f65a8726479d5ffcea7e9edac2e5da0eb0bfa1fb59ab616f2af685309acae1d8afa250e3c4019b0789649dc44b75a53b76811c43582c68ba27640f194693204bc419cfc026f95fbd66d245f63b128a5e9b66713e7e755a84e6cde65e1c1d5c083ca64be3f3ec71c688b1dc9819234f1f2855e71356ecfe776d1b5029a4d15cb71f300e74b6429acbf7e7abd46e12bd252435c7eb65fa1e39c634969f6715eaff76a15e9cf462a274bc5efad0c1469c1997f059ed35078072f90200eaec52cc8848e0848237b65168defc11b49a27b4a2896de5424d7cedcb0c6bd532bbf1cbfb9dd5c85006a56f5065ab37a9811dcc690394b31135bf2deb09595f9e5d58af007d68712bea97c3d35a52b5d7ff90ae150c4d0b83763a087cf7b3e45759f1403ef181c93d6af4169ac4d9d3659be8204fad8034c097544623df61ad853723465e000816ae0e25304cab27d97bde8debbfed1577ef2074ae8ac84a024e80558807b3e5a1a65e90d99217260f434fe8d70cd4f41c3899040a59ba582addbbf1cfe21100b24ce39ed91411bdbde2765fabdf6a066bc48b6b2038be726f58705ee397224190c824b7f779a0d42a83db5b31dfb831abbb7e11b8cdda8017e828048ccdee918543a944fc6acd549f4c07452fb5c55e2645f85e9cc3186b6bb4694b922c7ed6d7e5fbabb18e9f23646581836e089976228883ba93c08019b3e5be9bbc5ed9facfd5a156db8e1e2ac1f7d17fb6813d5fe8afa68d646c197337a2ac5cd30807e3b53c23ab45115251fe2a809fcec8b803c0e0ea3fd871eb613e14bdf6a0d5117bd1410a14b6c044816225154d80841248f143d538b774fecc126278d1e86afea86a0dddf8f543fba0361118f0925d5418c502f1e0c9205b9af9b565557672d654cac724bfcb417f97c21511efcdfd855a8242c6a0d51a09b53c350deb1193a166379868d00062d94f4e5a89b4f909adf6712edadea50d10032309f7f9807568c6faa82f955c4f10af220808a6de2cd4d3daebb803ff9f796ef55aabe98cc1335c5b1e0475a7b02c9e8646142d430c03db05a4e578ac784bddfc4fb221fd1f0810a1226cd8a82c3606c13c37b1f25142f5397feaa474418e377e11930b9b36f1ca16def126286c35ce1c13f89ab1a49709c0a450ee1ea24a66c4c7d60d2daff57200771ac8ef1831dedff3df5149ad0c00e03c9fc074428851169a04917d311cf0a8186f24c5d7321e5203753c8213a8c0e26f5d813cca50e0bbb2a4fe51656f2c56e779a372514176bc6c41c4237e73320e6414983fe1a8fbfd363ebc72f3f50e520cbfadbd2f65ce6755cc51f698763eab444b6f45309a8a224f5b33a882b77fe3b0caab6f19a70e99e79c4cc106b8cd03368b6d165f2d75732482cbbababb6552fb200350b60d1e9b4a3b1b4d7341c55c635bfa791569a438de3bec72450baae8144b1f28afa2e6b5a5312862851a10fff3437e37fa5700b9a40efe96c8af34ea24d365bfab6b4e2e2004dac7e44a94340dcb6118b7fe6f3d9f8469efeeadeda3523e3fdd53723f50e53e984639d93b42d97c0ce4f467da0ef62495455c0fbb5ac71614494fbe9f611966cca52cd0eb7380dde56358982a72d276ea60bddd8856aae24ccc465758aae705ddad64368e0d2a77555d8c9b45b25b03d107b71d3be0242b4f2ee146507375a233268a130b59fed0c59938781516b852b004f2d9bc405d788437c7927104ebc536d845704a9f25729be0033581e512ecf01d1718f3be7c5155aea043a1a472f74e8b3e543327c7e541fa95dc70699057fa1bcee3c8a2aa3e295d1662ca9c32bee3061dc7ae380aaf1daf9774cce85b1d35c5be4123330ec8690acff5d33552a55d1289d1a31b195a99c7b1067cab9ac508e5903aecbad1767b7e7307a4b4fa3124772a7bfa191a6e1b098a9968fa76d8dd41ecd60b7f1ad1c881ab9d256454eca0fda9cc9b7836710d3ecb35781d17dd1ba3781e68ca1260b8db1fc13e8c855d396baecd6e8094edd62e1be2945ba45c29d1df19ebe3e0abb453767ad773b80c588be0845c7b5d69dea123a9a4fd46de7193c7cf7d11ae3a22b258d1d86213826323e8fb4bafb86e8d5f8b91904b24ea5ab3d949049ea1966bc06fcc29a1be46c4fc6d3a2465ce834b2ffaa3408d67084cf7bc8e69d0e346f8456076b278e2e0e1de1847d0e5c63080db18e69c0b36c0af2918a695f09cd23009d6d45c2fa7d92491912c3677c9fd94298e628d0dba9bec0f979a6f45f3c37ad377f00d0d34b8f4dc7ff13d63ff73efe2041ff9da1a206972df71de19119f406debd1ae5bb205b8888b9ccff08f19f9ce2126cabb7fd88f199833ccb21ef1e99ddb7f28624849da5d5c37d368a2771bb48e7ee6f81149c6ce6be92059413edd2cef0361671f0ac1239bc930115f16bb5df32f37d9f7fd7757ff9ac256a21083e2ce6443b55ed3d5a2ef5bd034ef7d4392f642a3a55a7c087dfe4e99f16aee458621aab5932e297ea201f49a187934191942be14a6614ce3080d0d8f72c1618ae28fdd9e48b79624ea789c760726c4a7ba7dab712235f76ec0d6e08b20cef0bbbcc106e81d20a12f43fd5b4c471eb4533f5011a262fd05136d01ce7645ba233edd5e2d7a5a92d30775383a0421888c876e62f98eaee2fc39d636e03627ac827c0d0f583c4734b21448d04087dd8cd5aa115c6a1f4e0c6647c41c1db40ecd96dd137c91162b2fc8bf846e76bbc3541624eee56d3c89a2caa7ff5b8dd84445e6cab94cdff050aa9d6ef0b9e2891b05d75ccea609cda8cdb1c04f9c388b103bfaa9c5284bb2fcceb78a555a8ed92ccaa1bc784646bbf3b4a2fa7c8727b3b9d75be300b7db4478c3a07c7bf882943fc9faabb66e2cecb28025bd4dc36139884390e132a2998e0cb0e0ab2a3cc5a09c2a6d914ec6c4492d58c2718bf9ee06c5a4210a23908d79ffbdfd7e2acd5ee78b167fd709f515baac65027efed0d701b82597c59a2abeeb9b14815f4255585054b5bae3afa4272876ce6c4d6ef12311a8eb797c611834cd26daf4b53c79b8c23e2ea51e MD = 6a5f09b3e0a8ae5d795f2dbed00ee521aed5b0875d2e487a82b2c687b527c278 Len = 31400 Msg = d7a5688c0c385edcc1604930cc73ba22678cec50ccd3fabc02ff5073f6195f6dcd8296b579378dc98a54834447d70abafea701e498d5c3fd70219e6b66c087a22f5c0b46ef5d898f09679ff23523e2fed443d28481c00dfae966c221dc9369e6a43cb1869530baf6e5a18582bee0a9b492684777af1e3f7c13d7a4dd811b6e01d4296fbf943a89c6c70a1d3c0995c6a5df1e48074976c34b967b2de77cdffeba682b2d3713035cc656ab50673fcaa399646ebd7a7751002f1b5b4386f66782da084ad3383b119cbf3b8b044d8708a758c95f8e1963365ef04a7dcf04173c602a5b8f4a0833eeb27a1db222340ad53aa9b5faa32c32ad4555caebbaa706e5026f0a0178ef242204bca5299365f0bcc455d046e4fb0f3e1d2844adeab8eceace74bca846373633fc507bf73d286042ad25c34b3acd20724e2f5fc9497ef0d42e001a8d9c2690ab01fd46240ac582f15ede36118bec8dd04033c449be433b2a89daccb763065b127a8aaeb9e1837f503d4bd0a1c19e7fe15cfb1a34304df47447cb792e811dbeeed1c05dbda9ab7fe7b3333a02c22c1e2b08510a9389e6443bcf9bc9fbe0b4e2c96d67f8384c85a93f295d1c3c78de9138adfb3c6db05453058b1266256612ef2ab6472a33b15926df05921c58c9fb0190b4c257ca8ddf485de2f7f5b4fd810c9a142798b4c06f1e4fb09ae55d9fcd95b9836e04b308d14cc83c1421b18c4761a0efd0edc6610eb818933d1d53e19a763d84c7ea2e097086d0012f8f23fbad17c4af0bcf6e7c801cc115436d4277abcba41e94b24678061ffc9a11ea1232fb568ebc9ee7b6f90b73d29d737c334848bd74b89f03003dd93ed46d82d887187945877f51dca5c0f8e5d49596f32d3eb87437bcae866640310ce1e34a0188976f0d365eee5643ba8f994e6474793940451774918ae27f6a58b1aa65300f209624d523c23bff99cd17b8c872d5b75e3735ceb49ffbc053a19554b859fda754fee1c6d714027caee2da69ca278154a409d1c37e4ec9c8ebce2f1d912879732eb5ee08d9ba09788be21ed5ddeb3ff9139f611b5a06bba14eda6f35bf3b6c1bb5a493c2b11e199936b32c238826d94eb4e12d01d02f9af484ab9dc4caf99e47f1b3181de8a6f987b93f4c7c544015fa8eb77c9b69312e68962b01f138c9d79eebcbc44005bc73eb1c6cc508c8a1bca6a90a9811ac743fa68b40e2e59315dec8aad2e05390c74d6d6524e1ee6cb196f90ec0c78c226195556bd48ac862447c6e36b2b480122f50b49e4ee657c8d96a9cc4c35234515ef71e3fce3fc12ebe7938985188ed125b4469ced21d6a657f0236d3f98130c3d42fa90e164af87eea9dcdd799a4c218b5f133fe98ce50ca0d2470444c9ba9002c039de094f396da32afd6fb704f28aca41ebb358741307fe999f21ea3eac68ecc3ca3bd3081c3cafd79fa0dc0d347579095a97b89bd330d7d286369e5b4b0f71ea262aed23ea6d7b4c1e214707646a0e11ca4d8858c81fb2f9b6c2efc428ec388fc83ba62706888bd50351868814d10007c545564f441d169b9b474cfdc89787414adeac860306681ee9c22903c862d537d62f90c3e9c189249e44346c9c9a049b08945ec5627f86862bf38d0ee178243e676cd66b1b9571114a3a3495375c26f99bed3b69975c6db76456510e02894398137d75a97c11650e29a9dc0c0b5674e97f59c0f73415840f0d7ae385be2ed9b144e21d136dbddb67a70389359b3164e71d6a9dd2ab33700991c1d30a56c14d26862b3b1d83035aba6ce7dab669457d7f108010a07f5ea8439bdb9e006ef9147451c93e4c3e7a5972c5c72ee2f83b251dd34ac7c522cf93398618a30c893ed617224cb503f29b6e3d5c12145fba6b024fe01b31d5383ed747db19909327faf87b92163df961eeef569a692981425d8b81c181dd352204cb1b254ed518bdc5f23e0bc61780eedd836b0b2ccd0c029b375ff20f288962ba151fdf38ef21cd1859cb09ccf02f1bff90e728ed7d348dac7c46ec23a2368cd71bc273685d22d87aa5af169b46785bbdbe676e1bb8bf45f9f0b32a6fe8c102d4659f8c4d9db052655c56bcd198e130a0524855480df0be1c0b3137346abd675a792374692f3eed50f45e56e055fe2d3ff32678f2fb6d787b425d9d2186801ca1dceae63b9042ebc5f4229f480c23c3f5276e439d0fa9e7a02c84c6a7eabdb562f7623c455f50e04cd24fd08939f6776855ac3fa6992a9e1320334e47f5caa4165f05f116eaed6d5e1532a5244deac9f2044ce7c046640e5cc4058e72363b7b347a52af10d17ce56243778799d6753e2ab9ecb64a85eaaae59e6811c73a84ad35efd4b0c38183eb01d38ae26a622a468afcf835d5e623163615d772a7613abc931618c0bfa996d0a55bf960066f8e759b43fbe0d2d5a1b2c6a0c02bb358d21be4837b3965882a48d5232f6b0e5cf63dd4056441c1d2eb132fe5dea74b6fcf5da2ce889545cbb2b619efb97dd2b91611add7cdc3336c63b9da4b7f6ff034a704464ddd6ee0d2c4aadc18041304124293b121950fa810a0195e582f004245dd725787d620b73be4999412bbb502e7203666795661805e34a4147279e2a1f1f75a4f12ff45497576f4fa863cfe7fa6137c46558e736ca3760c9540cc81afe7691ea565d567180e005f47d8f439aaedb0c7c93ca9afbd9f08956949a387cc94c721e2f6e4e09364253b34919e01350c7cbb67a54491039f40e108e39b5f78688616905caa5c4c263a1b293686efaeb0cbd9ca05cba1cf22d371eca5206333f12a6f35ed9234c2b2d3719e3e4b5f6849427538f4cb6c80d814ba8d04bf4d9fbd289e3c5028f4679875c11c1f57cb025465406cf8a05bc91da94d8298e4791c3b05261bfb0b25db5585ac2b6038dd0d50a8bdbe6806f9f861f58d45c81c7029e944897d6485537e68a77534976aefd9dc813fa5e94bc19f538e0c4f18e3bd59466b4ab91333e7c1404fcec03b6a8df8368358cbf30b3d4e50c74d1701c6db1ad0edec578d936d547ae31b76b2b431f92d339b98fbb1e755e855b236292233ff2740e0e14a204ea88705dd9093e4665cfef67a8589dc3a7688adfe14f5a26276a808cadecf77262de32c97d65557b5844a50682a13d6a100c044633bddb3e101d1b9fcb893e46e552dcbec908daa8a1f8de606ef305dd5851d9d942367d32a2142b919071e1491deb5682e5793396e8f380bb95d55ce32840f2e03641a8cc865699a8232e4643afb1885dfa40ca0dd43e74601fcfaa4328df37a33767c4d264eb4e2dad48d7fc46ac5b9930e605d50de0a397336958c6ff3890696b2e390de3dc31675545fa3b88e5b57daef24eb53ce1f4a8f92ccc345553e67cfd217045ac3029a044af19ca1d6380509dec0c76094a4eda9a9f6f55d4361f2213c5cf4267ef201ea10d9b6fae2ea25b245ca6e01b229b763e4ba9f022eb25a4d6a4bfcbbb22fd2b95e8e8f3e34f05e66ccb86bb1b71c2c40cb6e3cfe77ade4a6d45a9aa50d0a80d48c7681d63cd8f389dc113cfb03fab0c2d6a83b8cce9345b0030f3a5cf01080ce13283b7d7b02a9bdec4b5e483953e96c9eff37478420e21b9ee0785e0bd077289b1a187e601bd55575ed4c13b7a63a907cb99cb958d53e2be064b112a0d8c8567cd2a5739c72faf3116d82f81f7028f0f88df84c8d0ede73700291356f8808fa40d86ed770a6af194742af6fd13038e0aad2c69bb15c3784d6508510b87c9d667fa1d1149d25563a70130de56d64eef20c3e7401663bddc27bb4f95f2c150a3d91a578d5728d84d934453af3548cbfa78517ad280c3c35def8d68a5b3aefd3d21f89d284813dbf67fc6fb30417263f63bdf4ce7a23bbd41ca60ba49f556b9ee691955a9c59c46a7940d912a235bfc2d90f6c54724d693d1e2bead4b60c26afcd607e9d975ca01a8faa37b65820b7fe5a01d4db9ad992e555f2ea9729df9f9b09249bf8001a5f541d81023a9078bd56792dc4c06e58e74156939168554034f52c5674166103508ba56daefbe5ae2e4fb8fbb2af676bc4e5826655c4d2ce9522a96e9d5524b83235a9e8b496b221896e8bf434f51052ba468c13de392ceb2ec7f2e58e50d59962f6ad5aa98790736d27849fb24df3de45f8b6046141be266049bb53cd860e476123226c044b1b3437ff1566b0f68c3ee650a2c0a55b20f0e82c4521b1610912cb6fab754b5d8cb47879c0d1c79b34251a02d4c100f1dfdb04d432d7f07e80abf010ab0ee52b9fa4bd1c19795cb896016f73be8e0ab2555574f606fef13aff737dda93a17851be65545a81b5e6bb2c544517e2a038f92bf086f6240f4a22cff9d31217d55b6c53770cb98c200c3f61ae3983c3800252ce2cd9593c7151c28cbf8e5b8a0334b8096a14bdbb402391d07fcb3be3a5fd4bb67ada9392ddae96b0350e0b7cb36ad14abf2adb718ec37ee33958a4c59a90306f5b1949d99cb71bd4ead0c6628e844491d6ad9751647243247b9052dbc651cd635df3c0734711ce65418500cdcd078e79411b85cd89a68b1ea6d0cab8d1b86f3cf418abe265353adbe9894f21276b2b5baf030b6836d6b33c5bb870cf153a9256adf660c96f97cdc3436c061f063587c340e2ac94249948080aa5e991296ed34aebfb937acec01395df9bd9f9e1ed404ad748fdf3bb44d5fc242799a186bbae745eb698892b3488de2e971f4452f8c15cb28453e9638fe9a338cc0572b5b7807d46b60476dd6bb9f6a0ec5aa0d1fea773634362e7c5d0df77c8f1c1771ed8f5c064584bc68dec0399e71a1081d7554f1979f48f915aae33f4554732415a967ae8083bf2fa852c1212619ee559eb9344d967265e688a7e83935e1afc43d1768c5ed2df8e758ba2520a90e92dab774f151dab4743cfedc84aff540b64012c0fb69f349172d9e9f54fed05977df912df3c60c6d5d449ed220672d7972e0bb2b86613ae10349a287b683420183ab536ca273d3a608469110222b8492c9eb60e073766bfca6838dfdb377a70ea08826b96622d8665d89fe1ef4c1a295a5ab2b6828702ea3e7228786b3a1a989b5bc329da799c3b544570e85fcf13089ed66424a0f172addae70b7ac1ecaee79aa909e9fcda13b9ba5f6e8cca485d6778965cd0e8e3208b2e3b346f65cba1ee6674c93484002e82168afb67b53433b6660f0f53d0f8b6f2a6f345cecd539e2d8d338381e6884734e75ca9d1b70f5085e5c4ee15ef9e8084e383b1f17f10fe258d89cb6abaeef842bb48fc7336561e46864c9bbf9b4127b252710bafe1903c56d5dbf3477780ac2be0d465c4b9950788a61a7a896a8d16fb724fa532ab3df33204beadb082f9ed611693683eb74896cce3931d2be3dec8d0d184213212969d6788865d3e83c73672caea8659c5ed6673cd5af61f8db2d7c2ee931216de16a537dfd78439f05511e15c6e42ae5bffd11db1d697dcdea5ae422810da69545a95537926b53b3f400a3d69732f94fffc713b3f9a64cc4d23c6ff2c61ec922bbf082af30852dae70479d770bdafa6186fc15cc52b0f9 MD = 5ba431851b1e2be373d818c3c6884e53d82273219c3f1c36c9aae099fa6690e1 Len = 32192 Msg = d2967ddf69ef62a9e23c9118dfaa55df92b4116322f1c9275131e3875dc92faa232b26b28aba6f351fdca8f1fd5062bbf0c26db9da9c57d155202f6199b48e31a17cd9a6892ec0383b220a254aa995671ea098e452452ce65a490bca692697fc91b21e232df45c987c37411d8e5ef5cc64771a4d5393514ca9d4ff2a93c751f33ef47d913db44b3f2b43d54091168ad0096f795ba42ecded8aea93eae040c4ffef6b7f58821596138f6d4cf51a7a5d5c57af3f750fbfa8af44b350701839f806eb3fabe0c4c044fef2de30a6f33275599460f3055aeeea7c2156bd250359f6f17b978991ca5d5de79abe08bae2e5dbad09a91e724e629c3b67fb63716849c5a9e79ba2d45e93eab5d0345d99b03b9542feb34724b3c4c6d45fccc8bd11b16d1577757d0f460af152dc68b6ab25deadfebba5f68351bb6e2e51ee766fc437f71c734aa3ac4b6b7da506839b5708732acb87a8b4f7eff09e33858cf5f14a866aa822459a11355e939696ad940823a51590ace407e8570a5dca42cccba96b44cea0cd8beca8cc8a3d0dd30d2a233c19753570807abe4fb2b4dbd2d68201ee1a2bebbc4720d7d89882f207cce4111c7a52a11ca592e1a090a94f7bd3a25f9daf8a73379fbf08202f6b2d78114b3a8b6eb5bef77ad9b9124b470c86ebb12d3eacf21f86bb50a26df8fea76e05e506509da5734b28d6af6c8c93fb3b4539d29ab86cd7f0c45b0d879b454633d03dde35b12aa85ed6112978fa9704e10ac1b6797cff83bee269b036bf48f30e99d828004f4c457aad1390fc3e5a10c161d241a39fb30c393c01f5420c0e974688404d7a211433e5d5634dc1ffe4052473f3dbdfca9058a6fbab43722c9f1824c7fcb66bcf8958e77589c68fe63ecd5068acecf6a59f505046ef038fc40360f07b94ca9b01b39dcab50e652d9b6f4e8e6785dcb1d7e7dc7e46569b617f4255f2cf90f0d15e9bead4be799165c57f7225980713d60970e577236774b00265e171e97992d78e48284fb852b1fd0c771f5f24b9fa2de243518404abf644f874ebb7f1d717733ac23d81cb222fbe1a5e3f823323f7800b670aed11a889e507755a0a1030e76e0a1213b31d6f7270943cb9d7ecce73952be4f6fa74e8965ad77218b36d0e6a8fa53f912cd9c4e2db251975a67841d735ebc3fff352f3836c11720cf932f808a0b4519e3625a6e7c673fe5b37ff048928f30b0c1fd64fbae35d7e1e2684772967de512417299fe9fb26f253d1a8a0f336eac404c72586a187629d36818d1235aecc460a180f365040e7fe45bd9b9c7b2779f7d1336a20a21fc9d73c517551943b25383881fcf4845e5e29194401808bc247ab5aabcba32475393418df64bcaed69230959a1a5fed1d327bb7ac02d58ad0fde8877770998f4f5bbdb37381dceb49bb340baa9101f4440bfc073dc522e01942b640de82894a76d779f354f438b45b474f81fb8962ff9d93b5f24173eff465bf1e6d2929fcbfb25471c1cce6586fd3df86e0d3290878ee6fad5efe33c5307c1b27f6a18c7955ca7aab06217fc5867a2ae30e7b997dc5004aec35bd2e2afb26ffdac38bd4887488f331a89ce6065f18d16df43b0249509bca7b5dc68ba9bd2a133dbd3228b184b2640b918544a364757b2c7a5a8cf27f869761c06173c7df51fe5bcaddb17ded11783fa724c025fb58d12989225e02bc8b5aa644d60e0ec7636939d3d39773186dd5d7d4c083138e8a7a6b07d9a1016e70bb53d36c8305de28fbe1c15d011c6b8e23dafea3b4f584d41ffadec87c75fcfe616f546dfb348c675d5a7ac317fe4f3b0b510f137c5445fc68dff43718e8d0fdf502ae1f9d243aea36ace84d03a32d3e3443ee5903b639cafc21336e9ce151351e15cbcb925c4e772fe0f243ea936b5d48b883bd70a6c80884c881b431e9e76e85ae92b8016432d7f0fc7fecf7547361ecb9b686eba95a7ca7ddc853ff87fa6fd2d8eb3013c54cd2200b79914f70ab11ca4c6ffe9e4957ef0e67ef912d43f201ac98be79f006062f6712c77a1d6f7d378a7c966baf0d272a616edeb7e4a538ecbbf8f3dcbfafc7b86f1b51ef87d75099d44e1316467d32f247fb7d0c4b3632f8a8ff73a1a949f633dd2dff38b5328b014eccce478c22e0126814b4da8b7d49ec1bb52410d55bfd695c51b99cd0079835a3fdb046a8839a506dc46b67cb02e592bb23ef716b6d4322928e676400dfdefd79e99f5ac329c676fe108afd344e6fb03150bc0b9507302527ecf1d96c41c523799984cc059ace4ac202f9e2eee84d0f2445742779b22c3cc4733f403db5b56d4a1448e49560189562a1a05e2058e9773d08fd0d3ff59f2d112c39e49ac316a59462d1ea9c030e1e85f567bbf227aab024a341051059f1c1b51ec80cacf45091018c0926410916afd407373f8ddcf781801d275714658ac05951d2ff9bcfcbfa3799d7e0adfc9a0ef7def63419ff3ab3fa7f964a72a1d3f2a4ce40068eddf0a7de91225f0763010495828ee0bd19da0e39d078275395321f3f9cfb69ada425629f7dd4ec78c7b35956fce58ca2b13f5ae618b436deca100ed1c3ea7021aed3f12264d4cf28af18d5e453e57ff04fd15fa86032bf3cc7d688034cf4631283631d0e4e0a503ea39840e48f7503ce7bf8e528afda0a9414ea557d3e0389a7a93bae0b435eb7e32b9b6101b97c5e64be1cb30d0d945f0f3ab63de6a1fe2b09aac56cc34cb84b3ed08901e1d8e4d9db9fa59200824805d5c0a008e67ecc91600e681fdb7000557819cae82cf494bc5ba7fb4aa917de450d2e127d27dc5703d35b8b8efeb81e1db88fc6de8b16744f0b5c86a3afd33e67df0d73654ec386c98a1b9882d22afaeb27b8e5aba5446cda1448ae65bbbf50b374e32b88063b412aaed5f6c3ffd17d07ed1f9016248864a49ef3dc5774e1fd70f43ba2aef54d706f67120d192eb28db831492de9adea44f6d0e4764283432be8879a3f9fc300fce1dc59454c07d713481bc026eaeb71f418d2a3e6ee8fedc361538a6c22195dcbc5363206233147f8fdd40be1e283255c52cdb8922341e5ae24839291019f6ac6669c25b867550a222084b2c898200e65ece9ace4a94135d2793d3b1402fc31d50b37bbc3e01a297bf8523d41d66835f52d4d05424736e519a7a90b5eeed8bae1fb2f7b8f5629abeacf6735b66203a1f55e224e16c7c8fb6af8f18cd78cdd0bd07fabee8491299856ebeb228e059a5a4ec78f0cc7efa081acb23a46e7a6b12e8cdfd39a0b58c3f8a995058a3187d569e6b0bdc9bd88667ec91eafc0f702fc2bfb63d0098a759fd4ca15ddf707b05bd5a761d30c6059c2fba88475826d6a67080753cac36bae6433a1b39cf07848d5a67821fa5e182c5aff312cb714b3a399cf97f6e84e14ccba1e16b76afeec16eae5403a5a464dc7d9924c5d9bff2f783b8892955334ef974b9c11686ea7cbe34399e9f21a4c67f3e5bce16149ca4bb0f539e27833fd62d6bcb57a10d1767d7787ca5a9263f8ce782686d87eeafd6e126eec6ee7af2fd753b87139f5baf06a9a5f807b615cd3ea1e46f719fda620ff684fa81e2aef54b5d4e5d9365f529ffa1473c434a92e6424adea188d26a4bc68783f76da881cf36422ebf45a98c10a96ac6a9d6db00033e2ecbcef1a400d58100be75d8a4b5e954c0573cb8be72eb9a42ced140ec0fbc98da46487a995087d5fe8ef6516b9dcc1d5442564b293c1358e5aa330ff1f46ad8e9d8ae5236bbeb2bdd9fe96661bbfff67a9a8c9b8e5a405bafe35f928150b674b9fd5136e0b577f92a4bcf963b82ed76afaa5028325fcb192e24a7772ec6f802e72ed1874bdfa6c4612d395f3da52d24600c315fd9bf4c27ccd8bb3c3ea9c7f9edd7bfc1bc8cf0241ebe872ffc753776383ab0c0d8eb1bfe2869fb40559baec03aa27c74d76ffc8ecf7a69970c8584f294b04ee9a485e302bd630821e7ff050c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a567324b857735efd60f05edc7b7e21d260fb551c8ac95d02c228f065b62a77912471aff236be62f193f8c151b5b152a131253820f4a6948e78a8e6820550d8b10b79048431d9f981e6a648bc246b13a33b944fdbafa49de8781204d9b636115e5df1d8eab3467142cb613b98421be37cf2d0f2991633b7a562ecf1d9535aafedae848392459478b8c4e2305289445082f963c6d5e2e4a049aba2240d673f03037fa9ab1763445e387581cd978464c959b1b5333e7027b649c4da11e26c43b92443c9a5f696c6c0563fd849c3ae0dec65be4dde2f588d882a40dd51f4dd0940c49d7d0a9c5aac1d96864e5b637090083b61a62e150676846f92545ac124002868df3c4f851954e47e0b6c68f376abcb4f6e5689ac0483399e5bb7a2b3ebc8ee859b6ffb5d6d61a38111ab08f02ab1941616c79740dd34261aef8fa0699eb3f1af54b08461c142d9244b92a1e5f73201240d81cd7feaf9c889d034fa3eb761d05a9d86715ebf8903fc2babca4176ad70fda50da2b5d8549f4fa05006cfc04308fbd86a5880b2a4a25d046ee89f239482179fd39d9f0fc528f0d2596c7943e81a1787c49094351632eb9854935b8887b2e6307c34780bdbe3f1d8c981e7acc172423e3dbff5d15e441c39e541031fe761fe19500ded46f95ee74618ed87755fafe06e2e3d21f20d44538ba9783254443dd3bcf7706b6bbe08358cd015d5381331969a2eae952173b245e009bf45b02ea4fb9deb028ec49a6e612f87815d6fac95b944a77aebea521c57e99e7cc9cdf715ca3ea33aa3fc0efffea097b68c765c4aece0313882a708f10dfac0474b083e2ee401a89f677c9c3b6272892bef06d2df961f545df5f208cedcb6278525f9744ecd99739725c0b2bf3137f467f17b80b249347951c265e214488e3cdd071c3a03db689cb88b52f2e9ef4331e1305ee6616ad228ba545d255fd5f568a55adaefdcb1f17c79f4cdcd59f136fa3e282b846b9f6adb0e38423300098e33848dc01637d5c69b61ee7bb27deb8595b5556beb4f4b8118b3eadf9ba357bb45e13c663db3bb4a8206f4f732c432b19d0d248a7b7af3975a51f86fefc8550ee841d337d6bed71fc8bf94cadecb7b3d88ac2211b58d2c30284ecd9d8fdd65ebc33ceebf71e7bd98c8124a611702099be108ea9c49e469cdfb20f6c2fc512ee44f18eb578f9ce358189582446bf6826f2e99ca84791f10c36b7ee07ac5d1f48ae49c55ba806cccc022cfd8ff5e1759f9da056e64f39bc5d2c19f374f6cce7b423c0dba3304c5ee838f07bafc5df314fe6ba232a829f8fd5eb62847ab61a507acbe03856b8d36dcf4b603b4c5fc0827df6c16a3e88ca53be9b190be0945044e1cd30453ce7a4dfca6201a32e6a8c5270f43d95e80ac2ee5e63c7ef6f3775aa325138681c66c69e21a55d1c1c8f4b887109b40bf1b0904afe6cf398ef489169b681810abfdc41901c3dfb0fe076060cc85db03421213b4ee5de256e286ead6bb2839294eef21e9f035263e240c6c5c6bd17b8783f06cbe15de0e6d9e152cf97717ff36c6f5064b21d0b1eff05288e9e9860553f150649edac9abc41e49c02d53a9e2dfc0a9d1bb0b391b3ccf7436b7ca05f0df169cabc591b35320ef7f34b0d5407c7ab89824b830d0caab3ddc063481e3d6bf604f92c0df2d9cda8e3ffb427 MD = d305c4ce0161386004c267eaa17180eb2433280716c894ed4094c2597a582da1 Len = 32984 Msg = 0f5452e6b51540cf219998590995cd7f8785fa40b4f217fc79f07322a2ec5e0834a4261a0177463779dfd958c33c55730dd3759f20167778372688c511967d584572c336d67f99f807c57c71704be39152222d8928a4d8307efef3a606ecd637e9c410825bb6a1da72526aec384ae1a2ff7a0948f425a2eef7829c0daa77d26dc8a4f545b9a3c6a5638e891142c2b66ebbe3f123ad213c784ab96c4125bed9c18b195ac917cf71208182c227b73bcabd2f66cd617b1e10961eab498c9e4954fcda2b27549ec008147535fe78be3b8557020a854b85a685121b611c343da1a9e65ce3442f7500f549e6af234a804c4f04ddd80229f44003b3eae2ce822c4d4247ba489aa2c6179e877df91ae625f5908b68d62a43ef75f240333645be90d585e79c630ff4b68b6d96e21acc94d4bfb0b54a0ee6e09fcbbb829d666b3094c2dc8ea83a8c6f6fe6c83dbc1a209cb530174a2c881f492cccc441d17927205d9bae0389d8fa5919af1945b302fd45f1d22d12b54bbbc7bd007644777760d516e8630fe5423ffbdb6fc77770d94dd8b02d5bd48e5fa4a07aee395536690098e532637a6582459ddead3a999ba7f79d19c7075a5eccc01c8c1e763ab656eeb1f2ff150cb09ef2874af1da73dc75e3dc552a9b6ace9af9851b1893bca046126866dae38c6fa1300046c40fcfd94af9dd8bde7dcd86d235214e65faa39c415404694834c44990e651faac41733d2e21e7e469174b2d7c5e3a4e8c11b751509ccf22d3717ae775fcc38f33d828ae2943448855cfab6b9e5b16431542c0687ad20fba020077f057599c2de13cb6d444473a9e2a0fb7ea4214fd5489f48588c8de0d595d4a830d3fe724fb3dd5e5598615124f6e3e354f6f7139a96e8ecf5a40a811256db765e6348da522cf0c7de2f89514c2abc3ee452e5a116b4f7a6686ed196349b9b0e7223e3365ca1f47451aa0b087206808aa7286b7ccc2b11f12b3d4174aebca9bcf6965c1ad19b6ef06a6884cb5902e74307e7f70b3d51ee59b89ff8b103426e1e665b220c53a1b6d8831b852e43b846f4a12216d0ecd1d34c8b2755efb4b57ebf4bc2c36f553d627936136ab5d48f261bed6759725d1377462d33e765458e520c116dcec858d7087efde0c3d68e000b2557182d43f0af20d319763bd628556e7141cc82bbc0f70f4635142f24c2b37cbd78c500da5a0d968fda3eb1a6ff834aab775fad9e4025ed6b962deb153501e120ccee82ba0ba71eb8ea2de74c1d906d070ca7adf438dc394b7b8ea61c3783ef0bce05114768044ffac3a44b5a15155c108c34e2621d9259826fc6dece5ca1dceae6993b26f1bd90d1e1326c45788a8e447078095c80d0f49cdd57039016f4512ab12b7ebd5b3b87badd68b892ba587a3f43f18137f52060f76ecfa305f8e3e267b83c4a9ee6f6ab2212b7cec65d07a65d9121c8a8dd09452e7e813b946508e70e663c2d30478761b42b900d54c330a93bc2996e13bae407ae973c3bc00ddbf5ab45aba515df6641dd7291f2c29f3be93662b8d00d11592ef44321321d35c594aac12b30b4110bd1faa22e1d9443b1fce9fc10acf972c131ac0cf0ad008f5e2aa9730b5e8faee078b814d4fc4e531b4ac2e931435d41c4a6125f2b1b2e6d2e4e13d5fc8d3cfb9cdc8255270d654fd0596dd48b31dd20cc02d3a420eadb718e6576645f5b10799943e5ed84df5d8c89af27289ef6cd725fbe7c8682caac1f27174da8a436bebb5e655f387ec0abbbafc29b6fdd10b2c8e85f5970b10924e860ca060d7bbe9c3364a75ae0957fe43fab2a4714d60e21970e6c16fd4c44ba4fc3f43c2d46313d7434906550396b7b9b144ca6b20a5d9e5f3a4b1186b4fbf0b7d92c5c62845d16e056a70b120af1f65063b026b1fa6d9da3e492f5977b9d4cd318e8e357b690cd1a4351b8a05ac1d8e221db63bf26dc83e7a5da2fca10a74313fba06d677d5aa49473270a85d94987d2c754da14002905ace6672c7904b867ecf9e9673c293951c16ead5d2ce707a7b4dc82f66b16b177663ee0683ec84f2fd0bc3a4d204abb3923ae4b3d20047aaceada0c352eeb247da617cc8f85fbba0f619b09abce623eef5dba8736e9d2110be7384732c9fdf06cdef991fed8ffa78b021eddef90f052d8b20bf7b6f4a079495c8fda7be6cf83e9835cb732b244861754c03da512959589e32b0359cb1ff1e99d392c5cefb07d6845c9d2d7bc7ae468bc179f48cd9255674390307bf7a149614bdcb3625f713b6d78c94b3a320320c3ba9d79671c97311555c415b9e4d4be44cad30628b0625c6d9ec3a6e6bd6df9ccd2ca627caa14a708bc3f19803d0aef08acc4ab1c7d044eed4a516c69d92bade89716d0f5d08b35b5d979b26b4ae44a21541a08ca3fe78160edeb024fffbcdbab7a1b4b5f3a7b4ba1200c76d798d15e33735ba59e538c926d0c091ee5bba1f199ee3048353265875f325fed51c162a9936d02181562540066273408e7776b8e18760e3e0472ca475482fc7c663f08aae5b395c6dbe6ee49e0c1e456a1bd8a1fcba40dc349561a2a05945aba818c33d08ee99f384e5bbbed616ea29ec1187e1507faa74e8066f59df6d9031e301394c9137176f2d92b3d497c7fe737a202c80c71ec6356262fbd11bcd38e1dfe7f8be2f7ddc57d28ffe30c76983ab7e0f6f8748debda60b71b0133ac264430491a89bcc0a1033daa245da5042a05a5fa7f7fdba09b74f4bfa332626923ce0bbc9f2ec4f24d98cad9430d8189b7e0785b06dea07e5dbb98bc72f12c585e93f6a557eb8a01462e8b32c663409bb443a58f2785616bb526b319e4ae001e593e87bfef307a722d1d2543490f60aec1b7b4034c14acfd244eda7482c97c0f86164548cf9e14c954fcff872552402742b53a540f0cd1a74d8c8538d7e3fec087c3a5fc73a4f77b7036907b05ec8db9c9b49efdcace8dfe736839f34e8e16c5b0cf202775b5810ce1627e9b452e97cac94e686d19da2067487a6f207118328393815a7630705ff23af910646da90cdec3db0d2e66c037763f3bab3cca23008ec282ab554e45d2cfef730c6309ec4b6a3bf313ce5c1131bfca1464c4c42edf4bb05b994129a687fa6168b9239458d1f1b41f12a9443dbd887bad2244f9ac4d4edf74aab65d22ee165332bd02878f3f09aec7705bd9b62974b65e6a39d52bc90cb2566641534b838817696eac6deff1169e74b362671b04191cb0b31fd11dd109db89426e9670d6e43085646db20b86ad05bf523986ccebca113c836387f303dabd75d5aaa143569f311f34e2fe527e41670fd36da34c3f2c366a61a1645bcfd3cab486620e23913d9b8f36889d65265854decd6b67297c93fec2c455f0b8a39995cddb3137a20523d26e0feb29a43d6631b4a6af2ce532b5ccce220db78a0da0b11a4a94b83f2106683417773da0220f9019d5c57effeff632f5011523508c6d8f226b08fa6b7349df69f3b923e95298f286f13ad7ea02d9c3cff818beacae74828ea31a98b78a62aa781b2d76d06db6db847f7bc22429c4f1c76d94f3eec23a5db78925fd93d4e55bf6f440c105d1ddad8ae704b84ea36c4f63d7f66d978643532593d7a380c146666f159f7cea0d620b02be6244ba3e243f3dddd9864759142561498c252efe0a4c390596250d9f0856946c10d207288133bdd59ad87ec92126f310dfecced9a58ffd3ac133e0f52522b8769cfab61117df5c55d6ce9e44feda43903f8510e2aca4143bad23f4be4ce1d774732937763c94a1e509e3365af1d1db3e276875b7842b266eb69fb948e43689dc1fd81bc673f616e9a0b0c789de90327114116db6c087ac7a89e1bf238f7338140fa1c3905266340a37b1d23fe987e1dfa21a797ef63c0eb573b476dca33a7ac2def0df526c87719d2b60e70bb73b51e04dde295e79dac5c6206260e2c3feca5eea5fbf8b06bc68391838667bcc2d1b1973f6edf3efc68a12fc861dc476329f4ede48f4b8d58770548ac2d0fe9cdf95f1b0df47ddac9194228489fdf01e78722907371f5a3d7b3285df7ac702adb56aff8101b75a54beac7b350892043122db6411c48fedc2fa272392dab926835102997108cd185cc01b93aa6c7a6f62e433867a5bc6f1eaa6b6d4416d17e89244e555ed5ee99649286a02413007a0081f33169d7774f538e37a1e679c73b77ee38bcb626ead329e6a202d95fdca24b546328b17a1ea662242d95881f35d118dbf7e508cc2889bc107c69c1520528bdeebba5a6565c7d33b476d190d1c1495635b358ba904fc205583e5c44b4201340992430b032d6dbae8639dd685516aa1842939e36380787eb060d64ca4cd86cbb9bc65237d837c8bbe19f427673dafc454cc03ee28cfadf59611408bbe3d23a153dc892a30e254c420fd08724f5b647c79962c02856ced234b278d07f41b98538c752795d9d48702b56f334d9a151948571a0ad6f5c2b68654164447e2e33560b818e8ecb4d4a3b5eff30d1fc4154ea671ea28c1e67baaad456feed2072e8b476b2a25956e5d0b6c351b0e7f79b665255e791e59f3f229f69396e52ced482a761a4b662662f85e743969bfd317830d33713954159ac0c4f0d31ddfbee1ea637b49df33264f10ed8c414199c129f5975f5ebd526b47620c3a6887371ea16fe6d57e68050b6f416912f15504b02da8a4078b77a1f186405021d84573b2885325033c78644c60043186ddf6b9269ef6b3da6bfabb1ed4064145b6eb2e11232eae82e872d97fbdd3d7765ba90f9afa7a373684a91669bd0e402478eabec0ee7cd3e31709cd0bc52adb6fef0e8093ccadbeba7a153c58add2ed3c82b6be3866a835925c8fc7773283bdb22c89a497920baab490d1b56232ee98fc88e194ee184b542f0d8741487278ef0b889ce42cc70e9bd37d40ea2cc8dbe3f2e00deb687fd0bff7ce82d3060174ffca77cae7a9e840f285a3e5630eec055eae2c7e2a1e09d2c9aaf404f5266c02508d9e95f7b5822d5f599951b88f2905598cb2b4c9a542cc11a7327010301eab91b35180ccd6013e32bdb1f84333ec56751d37644264b717188afe76bca995cb33da350dbf6201fe0d20a26bab83c27321ee1eef4cf2d35e5eb4bc6b62f96dfba760bdaf480fe0d75f30df0e59f537d5f06dedd821c6240c44b2e0d0aba603b76cf55fe80f364a74995ccc52b71ea919512b0891695525ab7b142038ef45f38904f6a04a7d5b9b305c02fefb7b56b297d49403bd9c3654b66236ef26b64fb9db0ff303490b065fa507c1eb5aff33d0ebeb3763af22d04da78ac9a20c8939d347de590d6640bd044d3d2815e3cb4c80801583ad08a5c95d19651aed6ce07abc3a00b72314a6f625935c94033857e74dfee417543c9d682f6671c935ca54a8f13c079bf8e6b6383001f6a437cb3dca95a2c750ddcd625311294142ffa74e4afec86365d35ef6f9b0339bc7281ed53cf4264fcece3dad00cecc4416bf8635b75169a4a366efd1b12282ac7b6895c6d4e5f3ddff8a0fc60794ea0ac309d9c394858a3bd3181bdf050389b93f5dd27b18e7960251b5a655ce2fecf5c643344058f7b4a9735b55875bdfa332919c678a7f85874d63c5b3c4caec5fa59f0008648b44836e12c54f633c1389b90088a74d8f2c322fb43e9aab9456bc9acbd4d88891e840fa3fda4beb0c5b87ad0ac7145cbe584129a174dd72a0fb8e35cb261725035fa7fe390eed9762f4379f2ebc513083a61ebbea2cfea277474f171b6866d2661712cabcd796f0d69a140fcafcc05185723566ccbb60c38dc669af4b302a1910ab0be029c8fa7fbd99a76f9dfd04482a692faae7a MD = f98918c63e3a9238e78dbd5bebe4e47eaeec0ae1627387dcd2a5ae4725f7e47c Len = 33776 Msg = 109317556c21c969eda65a94176d7a11462c9ae18a865b6db4d4466eb125bd0a1783313ffe79968511d214afe5a20013898b0aea5e39b8fa282f137266c6a015df72919a7e483d535fbdce0e2ab13939a0ac74497367e35c5b8e131c66c4aae790e89e2e9396a61b00f1ee778fa00fcab3173ec47218c3db7479ae365a27c5ca516bc0c3e66cb9251cf6deb3bb796910ec55d224035442c19c784c86e9f8d8044a855f201ed15eb8da52048a58442e5171ed9630cd244754fa1455d6bc3ecadea4bde30ee4ce7d1e628fcac30b0748d66a67f4b2798fbbdeb7d431ec7a0185a0879bb555e06afe9ddd3497287ecc9ee7004c5370ae9e84a5fa414890cc49f0921aa83bbdb9adc97e73cad27f599a18cb5a221a3415588bf2ece1028c5a1ff3fc866bde0e189fc6094bd8e591437a9ecca274b3c456c5b80cb43fc8a7cb8a7625f26d060fa449de858ee63726e5721830fdc785e818edf43d7ce000a8c893615687341c8906b2f73c637d3006e78d6e4095a5f86a03d925cb694e1458f8419cd76d4a8644e5e2fa74f32438f8f0d0894492957411c09034ffa5106a7f049c10f0cb37ae08eae2d0766563b7c5a8454f841c2061a4f71a0a2158ae6ce593aca3e9c981fa9dbdb95f8ae2c21535b9f3a94759cc27ec4f808d79a9b080514e7a3e0991b2d4ca056f91f792caba10c8e27fd774242eb171c9a74ec19f108cdc0dca994851a3586a0d4d079c020f1e801bba7a93addfba05fd3feac803835fe76d2de119e7cf10969a7a0029f27a2786a54079dff1a0d1b2253d93e562418f14a351292afbc0b72e1e022b602364f28588fb1c7f77dabc204788924046b2e70db61cb9a315dd18dda2ccd06a1c364823cdd2aa9bc7f644f86e0a2f02363e2e7aae78d8adbe90fa492cc0376e6556f1087bac6d5d6a5a31e29faab153bb4d2b02944cd0707c41241ac7c6a795872eb5dd9a73abebe7704b85e450625a5c47a74e6f80e713da565ff978c66a0709245c4a330ead6dc69f5a8a44e48840a1946a0647fb66be5d38738e49a8c6eb73a2adf64c65bb0c904e2598c84f6c2c129c3cd124a7959b8f4f2880415404694e0f718af0601cefcce775587677564738c7e5570f6bbbcff703467768b36bab21d370ad24e71a4002d1127258458db99a7e2c410f2f21851dbd941dc7ab45d674567208f2e2fb24ba74c48d76a15ba9c027db372ddb10e38ae3db176525d815d0ff3f43613908c57d385351d674063f332cb8e07058ce11c5dfe3104b0a6e8ebb389e0579d4894bd285866882a4d7a57af38ce5e08ca338561774ae7f404d69bf6959f6439bc6de42c32677821b16001de61eed8560d980c6f556990bb1bdcf64f836bfc67706a4545afb29dcbf0b7ba56b38a168bcb7109cdf507af64308e8314efe080b4e93c890b2cd239a7afe3b99eca0a990898411603f2cf949e075dbaed37878180ab3707e336410c433366b81d01fac05ad89aa9b7cb0bd0b6f4bd163ef6eb8f791afc5a746889660d2fc31e67f7d53d0120e04d4fea56f44d8d3f1d90ba670b0cdcfee9251005d783e98b54e618245f89e5a46932dd2b6fd035564978dea4749a45a13c7be950e1361522044def62a853bb7996071013b3dd8185125df00e5cc009a5ecff30f513a22719a4d5ea0ac80d06b25c432f8a60c3f66e10c67b0f340c8d5f5315a36cdf4693f4af3494971f045bf1146d8809e7220853bd38fc419aee454007559d12b491e0259bd07b921dd82fb866fcb61cb7863be8902be02fe1d3b5fa8245aaa12412a03ef3300b8654f6e67abc57363d625f059f0225b344b95b73d14c5c4872be5738a32de9c0ee54ff34ba9d2394e6782af9e9abad020a71f3f386ee0ff311e3ce2df4d45448248e4f8eea71e83e9259588d5af52848fbbc1bc96dbfd7370924e5f4966f15ede36176699ce2fbafdb96864455672df482f8514a085a5880b3024d311a66854e859ef2394468f4752ca032937b8a34915aa73309e945fa6cc9fc5248034348c695674182736c690b0016cc1f3fd6c2abcd492f8d830b4357987393cdc39dc7028d8ae2d9ac65affdf06ad12c14c56ea0656ea54957f2b9ddb9289016ddce966ef85a64b3420d5fba680ce06e9cde8f1bbd8832d1fac4c46ba66bc5d7d46e2d8840563583e69bfebcf18d584b2aaaaa8a3016669bcdd9f98deabda37529e4f2db001ed3d00cc9e392075cc7366082475857a9af2b53badfc0e0aec76350db9cd3b214de3c26ffc4c6240babd4b12dfc12bea27ae52edfdd8142af9046ebba720ed0c8a31cc7a608c5c20a849a9ed62f55bfa1687da1b1795b6b509c845cfa18e8e6bac0e65165361d8be9dffcac43577de526e6497ef849cbd5025aa02712f7fe5e5bc64d76b5c339cc1a1c7f5bde1b17c99372ccf8fcb54f0a55392eccbda5bbb23c01a68a0036a72d2bc897100ed09fc7879c9cb237424195c9d684c02298ad8ccc31861ddd06e2099f72d87b6e1e928963d22d3d40876fe1d0b146a41a5740489ca460a4c4ca86ebd599b7f0746b8c69c8a1f2ec90eb1698fa47f8eaed4810702df8caa12fe7e26e7ebbca11aa2de9f3169a8262c0e3c205a708f0071401aa8de09d28a5a6e590ebeb476341880c37bfee1a501229081eb27772d07b371a5b0c65100f34a25a2f0ebbcb2822865cf22aafafe08d51de7949ec242ed9cee8ce861bdfe2b0aaabf92150b59d173db6a5bdebc9c836d3cd6e16658b4f8533f35155858b47ac3851abce5aa516a2169fcef423065ba1176b69c28416d7101ec0a0252270a2a9d3f193802a084955998eda77d5d42f4ea52f08b8b8653a0cd7d7176f834e982bf5f26cd16f5d89a43eea549384c1b7b2058ea77382e50cce07bd438f28637c9526da842c6b137c008f58c9d1a03d995da100d27d6414b3e616e9a11e725de487df20760bcdd8850d0350a6dcc8c628b4003c1650ec82b3f79dc2bc97f1ac4476975aaefa081b392c235887ff5efa0a57cb86ff788c9da15504fef28636cd30d3d7efbb719a39fce077d6c9c3e327a2ab3b77da6eb4f3f080d4e4ef63b23f1e42295617fd04d364cc695208c4f5fd7641089553adf5f4262d962b0faae480812404344116d865f5328060a17cf7da199b8b55d7b0e03cb69db117dfd65e1ffe0be0f0c339757022d555694056795bf12d6c3ff311d42c2673ce61dc708f9be96c58222aef6c608207410251dbeae1917903ca223b7250fa22366f8203e952d7c7c22ec4933de5775aeb924287dd097ef0ea7ad1a82b29b63b91b76d0afbf34da0c7ad3cef6a4d8742adbfbef4b0321e4798c8ade26f34cf1258c009e047ebbf79c0f4003e622736411fd1137d1509f3cf973a0374cf00b969041fc53e5dbaa1c556b99b2ac5f118f8aa8cecbb6bef940b5e557ed9cb0c19822c3d4b7f9dce9915f1547a1f063983bbe639a72a3561738d66917c7bd3b54400299ee92e98c609ee195b3995937f2b1d4b6ddf3401fe16c8388488e5899aed6594bb4ac5cf0f88b037444618fe20539f529ff1734214023e5c9520a14d3b5a24e628ccdfb12979fef3961c33b6cbb1a494568a628641aa724b49e039aef53eb0a65e0bc6ef92623ca6c748505defa9ef7918168c3f1593e67d1924191f86ffbb5dc17425cad8e5fbf95e470943fac0b2896b024aecfe331d6a9978ba2f3f018764f99276e37b59bf33d194c9197b8aa03da5ea49006a2c89bc316ab75eac08b7547ce334b9e851f91eb7be1a3ee06c3b1e7f4ae129f7c4adba77567b1e4c69cdb4c1e2d9beae532bf2872f6734d7e9e5945d80bdca15b01c1de1e88feeaea92d0e4f1df0823bc1ea57b6655a8bb0882247a74839514263372ef77d6060314b77b99af0f3852f4296d6cbfc4eb418cb93a102fdde500c5291962ea186e372c5105f2c086d37f749c3c83e50ce4e6f289c28f70e3766e1f2bdcc0dd18e18e1aa995778c0c82b024bf3d4940f53ab2223be47da15bed651e80e390ba9c0511c60754b17c69edefecd99545384696ad0416ca64290ef5eea972575ae86d82c719b26a27f664bb43b4346f0036c99fe0816499cb70c43410a84760a7cf5301b9f9f4fe6163c694b56416f100a044fe527f6b7c3bde4452d3044825fdd7152aed4f1338e82c57224be4c843cfe0805a0be775993bdb58f83fa3bdcfe7687da46d04584143b7df0a0f1c928ef55c455c14a2c81853cfc6ce5d6eee85eaea511841fe0b41fa6e26f709f5bbfaf87e5aac7497ac220b22577b344d227090c55a2d6f27745f96b8f38f40558dae62ad89f133ad6bdfec3cd3a8cc29a3b86061608c0166dbc49efc107abc264ed3ba5098d35ace4c767d8502fc2ee8b784e2272bdcfea287989aa44361854e479089d150fcf0e1960f4666ac206174a7fc9f7d82c66fc5c102131755eca4b7c00e56977911fdcd92d4d04598bb6db3bb4a1ecc2ef25bb6d12a90bd0ec220470074a90adbbd8a7c88eba28b8f765b8f3a93e77df807ca5dff3999fe358c01e851eb0a923da69dd5bf7c45a159f932ef6e0283f6a5aec5a29357b64294f14f81f99b0297697441c081b03fedbeebfaba9dbc79a1008e526dd4ab70f1f19a13f941ab188125d07b2514ae1ad986f4bcda10ec51e5d0507ca60b5e4e73152e553a7144d5b83a6255ecc19f5dcc78bd7f360fb89429dc9b48358097d930c8561b2bd18dc0a470d1d6fed0ab912e5dee4bb6e148c9d7ed18c0027b7f9791d1ba6fb4a9af61ae8ec5064189f93d66fd2f2842d0c57856cb6eebf6443e12fcfa0158bd40d1403c5ee8ee9e34b2e9de20261fc222572a0e3e46d1f722fbd2da09d4df2edf1ce6b8a6df95fd18fd1efd8e7e371e202565670e487bee5fdf5d94c7da0aefceb8da882f5504477e03622b0edd793e1258b4c9021bf0c441113d90fcbce3e955cca416c1f04162aeec40d06aeceb0b40179c9ce468385f11b9fa3870217202bc80cdc824585638f0df3d546852976bf18ba7487ad65ca916011af3eab2be234afddc081f364ab08c04e320d1b785476fdc5c358d0e63899a0f27283417cf35486b593d7b3226b1c984b99a6cc5bc88003143cbe4b755e6e30ba94114f7ad1efef2ccce00f3f125f187472b03224414edb2e573497a3baa3a1e26a553fa61c8b4b8be257622b3f34a34163b5c7625d57e89c99382ff1cbce77028bcb9c9f219b2e8b7a9a56675031db4ad33416a67b2fadb789558ed0004322836ee0d0c68fb3fa83dc255683e3db12f947978a51392abd378df93edef6a636ed9a3196acb55a520dad84dd0168950cc5477c9d0315fd79653dbfba6f2d6c16c9743a38c240e2a7a1553564505cf40b37494fe93c700c74f90ef57c110309547fb36741a7a1017db769c386f14f7ca0d7c37dd95df5dc324b88571e55260272a8ae454bbd642b46d8619bbf74ae93602f5ca307f805e123d52040fbbbe4ebf3bceb60a173f8c4858cc33a685b08dccb966b4bdf8b3ebfec3e6d4faea5fe3a5a24e1260d7bdd61dc4d152c3c04ccbd45b575d4da97feccddefd5dfa1b3a05208892611ca3580879d81bdfd851288c950f502da73aec49c8b51e06d7f6599d7a15230c0722190ba5bc3440aedf4cb658feda8c955202ea3771d1395822c394f9708879e9fd07c5e999a4df0d13be33654f7ce2dd99cab762399e5e464880d0e6c249128adc2b1f8c97f123bd9588e9042bbf9748b94b9990360edb690f993b8932ef3eb1658b01d8dda573850cb2c27dba2a139e578d760b90a819892015bc29e9016428433154139447392e2142a5172345bea71e9938196ef4806e22fc3a0f0e07eeb51c25fe86e360dc817b42791b8f98012ab376c503f87b79dfbe569f84ca894321996de979f377c443c3b928d125ac42f1c12c071158c46aa69c2cd2ce4510cb336113fb33eb14593fa0b099810e08eac2eec4e48ab358bc896385bb35a623eeb51d1f MD = cf17b0770212e87516c080aad008d50cb5481044626a325be730d54a66f66662 Len = 34568 Msg = f60c89481488d65c26a6ba364c5d602134ed1afad5c2b037609bf82873eba67d907f6609cf6228c5cffebb18f2839e55ca8d1386ce0174685237cab6b65f9caadd1d05c2e07709c004f129f4eaf635bd067a624e52de9dae44141e02fd033f0fc32d8ffbb18f2253adc82c539b7ece61d0fe30daca22d0111e781a95b1a038b32bf62b3ca9721b89b3ccebbb6de31147115fa5b39c95b79ac8ace6f63bfe2e9ffec1020e30e79b67fc428fb7c8eca579afe6e86032fffa502af8abad01e5cad922d63cf8aeb74af771753fcc146333ff94db2269f328413c2da391436d1db46b817d00838baad240faac2484b90e62dfa6867a5746d83364b7f7bf3fe66d935c02fe76353088d84a802e66661fb5db23cf2e19b095d678d2b13a5e29d39f10b58ca0c7990319071ee9442cfaaf2246d3f61d26ff47ebb98e04b5958a9e79d27d09ad1b346d2504c31f369ec9cf1c4af50399cac9c4df9e9e96b08de9aec482bc606b9990d7737a41084ce65ae86a8f93ddeb2d98737ace0c51736dce6b47c77b79236a34a7cc0fa18ece293563d5beb46e5b76f3be83f2e01c455ec13dcc4ac13c1cb5a847f86bea980392e3a6257f619d30ce630cc4b120de70884b8c19b29691a0a3751dbf37240d3446eb1b2279a152b45c6fc603b4d6813a12f3c0f8a80260f55c2293e91b57d7a970d52993557c752d499f5209a209ecec2542412ed40e916407370f3dbe8cddaa362a3742bafaefe4bc7b199e24c207cde8bf7886ddc10c35cd3cfb84c9cb077fc071aff55124a621de8c8389e208ba2784f2cbc76c24b9b0d5babe86e31a3d6f3732f875c201832cd659f99483e3ed402063a3b8283d801d4839c00bb58367c3c3f67a8ab4996e4ccd6ae185b05b8862e59b6923ba164ac34d3f69dbe70d6dc48b439dfbcff550caeb48a425107973d3fb2183cec9b7fdeb0d5621bd20c037b7b8a4c992bc1c0fee577aab3c4c4497db897d5b81fe2683ddaf05507b08a5aee7719e6615231695003a885d920bc5dac4b7385706016dc2e15cd55edb48c3b89bdfbbdc4dabecc848bbfb21eef60225d4afd9e1247994a43f3c4cb3a688233e1a2a829302fda5920e035a611ab405615596e860a20ea1103e76f4b7a36fcb29ad797bf4fcc149da99392d84dceed6748d97ed3c49699eed273355d39ca6c55f9cf42f65029ee1883286fdf2fd4c7b48c5d771dce1329225429af56d57d519ca2fc5254fde3c7483211250124575fec34481fcaa3210869fd7d45eef9ea3cd51ae11e51b56440ab5ae04b14e7b1266cf54bb140d03ac81432e0818bf37b8ebdb6003f82f335eab052185a50d69cabc533bad436d1dae8bf98f5fa947eabd7a528ec0e5f53c31605bc1bcb6b8d54607364281103349bdaca941019bed815a839d807334d33b66309fd7d26bb5882e4f62b15c03c54d81ed3b8d15761bc2360da47e426e33f6a424b9abee4c6d4a299dbed068a58cf1a45597bbc3c03877fa204fd0551a7c379443928539e248e2dff832e6cd7df0ffcbeda6133503ac664dc486bdd5c016c4de9510addbb4af1af968a63db3145a3da0bc4edc90c6de58d802318eeae9696529221c6afb4b08b81ff5021b41f03075cbca7860ff92381443e1388cbb1cdde41df39f06c12dbc85f8a82ec99f9bdb6df41f0de5a8ee2164356a83fc71e1da08630f7fc756e434492d88138ff69dc4eec2c4f3b4b362010e56a4fa2933c0c898a37ea6f6e2f8d7cc659d97b46e7c52bfddc01415497641db4f97865a2a420f5d8449fada8cef0cd549f0a3822ec2ecaaee1b564f92b34793c84b0dd67eee171faf7765bd7d533d2e8188203f5ff6fc759ddda3acb5a07cfe68c978e6564c48a5cc10cee5ddabd19db46ef43428a1e9e9910fe272dac648e3d818b0d2dae50bb9821d1c9bd38030eb8aa809a9b24a1bce73b9fbea2bab140cc0409ce23440c62179a439278759c2e0ad4045e62479faeceae1d55ccdd9463fc64a235e89e6e3a65ab00cd122beee43c23d9232a7b7ee0a9f915a10ebd84845953d2f8d045dc810cd467de1cc371fde74a8d7d7638a5ff239d0714dab2e80e6d321a7b8ca2fdf277970749eac4dba776888fc1b7f7db56a61a7025d356558e929fe722706e38eb30735d952eb8728d749e5e8472415583bbf1cf686b20536183edd7a22de023f7b1e9e9443b06ed1c6bdc885a279dcb02dfa3a33114a948439bbc5a6f17a13594867b18eb924881d0b6c38ba76a7592607bb06a246249ca91547bfdedb039e44e28a78adfe6f607570003d6f09d5142093a98a2b6c69a40d748bd20a29a12c67112efbda59b87b3fbb1edf8ca52c9607976dcdb7cc4035181e2e0613247b442c9dfb41fe112763e4b57027fa90d46644dcaed72cafd2d632dad963df11ba6efa4d9b52ff6fe69fcd269e1c9f12f40c3d2a15b1745b470fc37134f2573b85323aeab336c7bb1ab761d650c66475b4115c484a627519c66833ace6ba63e90519523ceef53c3dee33078c2d2e31ff3dfc0800f4f21930776aea5198c3ec6262aaab0bf198483c889c2912dd5beffab755a818bb6a46ea839c5128f116d8efc36ead1f6727d202107a2e2e095584ac4aa5a65949d1e68d1286cefb9aba11d850ebc040f6a8c1d5af537ea95925da5e1c72698b432fe0624bb1ca903ab77d6533ab4d354625fffe8cb1814a74d2d85758475976548c1cb157a4aeb07a1606de9136bac700a573c4d11b9fdb036465e124a9dee122f182c25ee7e02302de938a951271becc310571a31a4022ade46b42a82260965565fadc8703cab179170bb264c9d8e251d09d4c2c35cce91b59d1c30e39475b96f16c48fa7fd22288ca589e29e359fa388a239c94f4abf6f4cb7fac7b77fbf98d9cc04fe0e3623dd6fe61960ae65bd028677faa03df4511e1435c451962e438e16ede3761b8e1cb0cbb0ee22f5c462aca709abea07f02048ac752d510846bdf3a6fae48a485b794d10947c9c1cc81d1c6ac5a1f935b4b96966248a68865f6b842a819ccd2d24b60cef1f494e8bf768dc324a81705fb868eae1927fea88bef899e200509122807f7aa7afd8ccbbc8c2569de6dec1ee81db579f6d5269880bc1bf9df5c488d0d52210ead4af6934b2b6362e48fe705a976d3a0003b6681ccc736f9ee04d16a0c94a5a290c41d67f4bb0d533ef850e3c6fbb0ca3f41058bf576a14654e7ecd2aa364c0d2e51487040a4ece7f28e6fdfc81213a0bcd04ddd8533268919ebe1ed719edef88cdabed6b64fc8c40a3b8b223625c5c97ece84a004658b6a46faf7e2e835230ab448c8c0df2269928de5eed3989b8fee8d25f3fbf8739990e2fb78da9763e2ecad81ae56418696fa8476de1b77dc37b7f2bbe217ebc718a4f5d5aafc0791e5457f6fb8c266e419a3f6d5a422595085cbb47a991b64c8d04d8872d671bf25f2be33f92e29d6a2b837ebea880fc95f43d3db485f30ecde8934a1b943604789d2ffcf0657b6172a3c5b6c9dd10a4c713776700f7e7e0a710a014b923bf228234daf5e807c8eb3e26cb97fd6c93d6cee2a5d7ab63c2c46e91c5b8be5044fe95d2a76e54ee5dc323412f92f7db6ceb03ee5300125e26328af87ea6b9ae79e129e33fe6e58dac61a87f4c3817ae1e5a0c92d960e44b74a39291357f29a2c082c4d2eec0086a374f542dcbd7fb592abc5f7cd37a7fb050a00c0874a28cb1bb4bed4e4eba4c0870f4acf909230171147a6318bbcd73212ca05dcad6a1616fcca509a1da161eecfbfa295d8e89c86a5e2ccdd31cda3d128b3d1e64b60c36316746a07a0b63ff8c4ab84fc7e68cceb97a4bd65851115c08dedeb442ad3389bb2d8958337d346c6abfc786c48b9c72f2fb4032f503134e7899fdb60126c7ba4181e5876a8a07f40cfd9064d00839538b53b26a559d4082e66f12aa1cbd39668906f3c48bcc4f14f776bb7076c703ff07160ac2d6aa39a7e6a0c5f6e1caf90ce62f3c8613be8a4d9eada12025526cc3eab4c1f314946f1bddf180231cea972bdd5d1842aedb3a1c7714da0a7824d4409aa260618bf6415d50b3c9c51a968431f3232f8099aceef0254ece75cbd8eb03bb717ea4a94a50fac37a1b43675950bdbc13dad6709e09671dbe0718acc9117bb1a47522f90b3e62caa6fd248fad7d3d9ca1b2aad03929ffb4e51c69a78fd81711bddc62f7b33a23caecd7eef00d7a20195f3f741508c118af4666cf2897af6450202ceb21cd04cc389e341934e3c803b6aee9d8db875f4051648edfcc7b27f1f16ddf3203c30ebab84daa29cadaf756f9034a3f703f55153fc1fd11ffa4a23e7a097bce1a3fb87dbe7da2a72e5d88a8550ec91e9f8b62f5eee129ec2e9edeb85e857b25d19da293bfa0a5f7dbe5ec665f23ef0ca605d960d3449de4f5d41dde136465bfc6674d7b30593cb2500ea32f7be53460203958e4815ed182d1eee04e4d28c422751739b2b4f9df6d37223d424fb531ef9a90420f7da26d5c4f49d65740350ec44a47c7d8b214f67edddb2b6d2f366fd161a525303cc1b9c7ca7f60a7a13bae3bd253a84bbc3d1a6dd093ee0eaecb26dc31d28305230f5f5bdfea0fadf48f3aef89d52b8a37d4c3b09be7058552f62f5687c2ebdcd51db68efc2443d89eb23d55fd36f212c97e8afdbc4f028f9049c1e6bfd0b045c76f67e7abb89dc624371e0589137c83c58cc88b9e26558c0b2886e3569670de8e66ebec6b118de519a06584d9d52b4bc0921510de277ee9183506f2e87ecde57ea6ab13b6c984b3d360ac5a5c069ed95f20e8f3e8acff453bd19a9be21408193ca12dd42b3b22b1060a4adc8c2247cad5bbcccb4a31571f0a90ea34efd0bfe82ce8fcc41500e87b160fc9a1e6b2a68ee8c528fd7f4f16e4f8f54e544e5f65b0e3e0906a2095366087e3b130f8324b93fccf9610f4709f258b716f70a9ea8a21e61a711cba729d1fd0289a103d1b9788765d9c9c4620805f3687a6206f3cadb9980927726f23acf78330dca621e92acb09d194f5e0e94af08eca8ada2ab040c69e3f2c019b12b68615bf0199432565da1bde27b451355f97f89c960458dfd3f75d2ee720eaea7a4a0c0591301d5ae93420c5bd6e139f5ea4088050356635e7ba595ae176caf548c1daa714211cf42577bd4ade79b48198b3431831f3ff3cec9e1735b369b7dda27c163602d2de7b9b0345bff36d9076be241cb6c3b6706f63011b61d5803e0e27e72324d5cbbe7bca755eb7a4c043f93fa50a0e7e036637eb81da41b040c9f1497195e60582595f243c6ca45b085b839d84af61d9514d40d69ed867ec21e84177c9f30c3a8d1b9048c6f408aeac23a0486151636e2691f4b4c6aa36d1aa1559435eaf09bd4291d998a39976e83258d9c0b9b48594f9d0de2687a451195fddb32c8e4e6136593885a460a151b021578aa6fc2d3ae65186677c506b292ba9ade9a3f745950e279c1eec7cc04b9effac5d6ba74015eab43f2b56cf7331712e02673a181937dd34291ff1565aa6fd33b3ac7f5981891aa847841643310c824387a66f7f5dac0c056c03239bf50663542a0262816616ee844c2c6b5a491ce7808a31b48b77741321d16313ac03dc69d76be9a59d6241eefec96ea6831fe5196b96a399cafb229b1ff5ba42052bbb6933f5ecc92bfa9c947e2bd5584c19e7807b49569fcc5d2a0c3645632f45c105ea0054663dabb37957690ffb0113eba6c5260ec526ee121cdf2b4d084bdc585e74b303f083ab217ad065c23a3188f9a55ff24399dfdebe5d9c5579142837762791d281163b88a92377fb0f3d59f9c865a966a42f1aecb67ecc4b561134e59ef3b9d56841b5f2cee5c67f335efb14dc6a3a099d0f78b69ef2c7836089f27537456532060d934807343488db298538aa159a518ab569badc4c468434d8f154d38f2c7ef6c44416e6b15a9e632798f3b61a42b519bb7e68030da1d42f98b212f8435822c71058ddf1cf913667d3a6c484cabbcab68c275c879971d9dd43a52e1a04a0b3d37c320b9cf180d755a82f399ab97df8ed91e4f6fe822f2baa645b04cd457ea8c862703e6cd991f7b92f92a16c58f1d62b8747c5bc5a42303375343566885a87f26d93d4c MD = 10e88348b55c5c0683f4d4d3ef56c485be9888bf00806040de25204d25df4ea6 Len = 35360 Msg = 6b1d94bc0c6e45fc905c509ea667853e4b2c5a8848dd914efcef14d95b12247d3766b270bfec0ddd453bbe334474b0c3a177958a3157844b7c0ce7e2c06894d4394d3a2aa01cff80f2706759720d78b5f1131ce64d78c69f38b4584e3abe45abf938f291b9e6630e1f6513b63a1a233cc468b743a4269e71b85031c5d2fc7d2b0090a44e113380ae54818af2a383fa7fa0de30493f4a53e9854638f18f0b857cd5be1609b0e99f891a2c93b6b53045a710dd4ea125cd2e312600367779d1a5c5012811699ff208c6f8cef8aa79094cdb99cdd8f35e95776e23e4f2029837242f0a385c16e534038e77cf7f75f6f75644c51697e6f38c76cb055c3638f5254ce17a55c1b98a99d8091d98f1bf35e0ad091b205323eb99726e52cfc8c197846303d8e606fa9708ce5e758f15323cae97542354d3524ea3b57f95a57146863ab2bfad55f48013682eb6041db57415475d4a6618e11a259485275345f96fcb31813b800953f406a3403854aa972dc89547156bd5432377532b8d161928e36d4f189fd96aebfd78a04c0dec9f84065b7e9cddbaf4c2164cc8efdb6588c64b747ebe1440e0834472479a5c546244a6d8eca6c9dcdb269bacdb1836c9fa9a4ee9a5bcc23ed3e570fb80724e155d9fb746c6ab0258f43759a074f0c8c9d76d95d3ac5ad05aabd72a1c331b0bb6f75ddeaef4f4b0b6a6bdf92f7bbdb9ed8807c73a7ae0661dd0221adc48debabf9745c5175dc9f97f587f2262d8c831bd73308d26f996ae0eab8ee743a70383b8a7211489eb71083a74467d40735957c201b08fa010c4cdb5a2e23a5939d28f2a8eb7730d8536036f61dab2d134b753839a4e74afa7b1ee9a1ee8ba27e492069db4cf88a9135e13a78703681d042c4e88a7d3e55ca7a63746886610b4918d10978133fe677e325f684e89472dc9fe705a8e0889aef6ebd0404625e3082909d3a25daa7b4facfa103d1e33f9086d76e080b9b209ad7dc8e210c2eddc2c924f7a45b0fba76886fe4dab5fca23b6d6dcc7828e9c0c612485953f6285a327b6a72b09e2ef2cbaf4853f3c79177040ee784ce9778d3bd3d469105490b7df017b580e745b4eaf4ddfd90d77d4df85ad9b91983cdb4c3e0a73bd7cd7b34938c3cbac4d1083e0db2a2d40e0e4d8ed0d05c771d20322a2bc0eeac90050320458748de90d65c36c5558c803e00cee08ae50595e23c7b3575de822d5c54877b0e41ca95879f981bcc8df966a34767cf7109739a1b30ef833ca9f0229f347e91587c30641b6572696dac881bc05aaec83dce24f82a96358feab3b710db1d3f0fae7728eecef041bc3331a70437a31a474ba3783482d4b3b7fa7c559c82776f429ac3128a04a89c70b7cdd4a45bc920e9251a0bd3d6950097f6744a1a37eb75d687f06bca7ef6f91355d19f90bf25590a44a24e5a782f92bc693c031e6de1e948008fb3347073ee30b7dd764dd450394744ccbe3cfa3ce071cd241f1d96e34ff39ee1773c9ba7c2453851f7302dd2381c8009e9ffdf2580649ccd0c9c35780075ad96265752fb3bbd61cf70ec4e13dbf690ea40179971e90142a74a1eec08b14ad73e5f1928f6a125ceb691d697adab61f1de6f28abba90e46943661a0d2db8ff861a7006a012a90ad9a7c883acf81ceb1d56a5879867fe6a7b11cf122b5fade044eb07843ae7a9d90d038377f09ba6fe9e03a1d8f1f2a82ff2a3139bc90706b99e0094366bee2a1ce35a613804f0d018de35e2711af324816a67a21b58bc39d7ebfb9471b58ea042f72cd0284ca03ec6689dc604a5d1da2b4ce019257d07ddb7d94c86ea9a41b2f7b2fb6edd5a123983c77beae815275f7a04acd72e884258f5c073f9e5acbfc887a1367bdb9fdf56dd7580cfbfdb5c1afa3c1e6abb1d24420e4bf25c174f51678f4c7ea58790602d4fed2cc2e07af8a3285dc5523fae061f6dd6582be4049ef68b0f347a85de3d1337b8d082fe76857e70e4221c40bd604790fa05f7d06f011be773e8494acbdebf31432c7e6e507b038059b52742bddb6114219c3e60e1204e41150ab03b0bbd67d9269123b49b51d8c3491f11da31dfd263d78b6e19fd54e4046d2c3dfaf061c38bcd9f0165a99274c61ca04a6bcbd6420c96440560264793cde6cd50ff2c5448b5c2b695f61dc55de55ee96f7bbe57067ae856a2d80e50d3ea0c5e87bc121d7e0380785fea6a530abd8a6acf8ebbfab63b4843b4e5f8190b05586040b64425c9e1a134ddb711d3f1bb29a509193709c7ca209bca1e75f8cf9c55631a7224f5b2cc8fac8de0a6b0a97aa7189aafa23cb1b42bbf30f62a88881b8de783744715df40a62fef0b8b9198589d3602b69fec1a65a43ea7e16830db0f6c6e0a312cfe95daaf4f8f7c52cf54e176adbfc28290587b348a9d74c19a2ee46b572d3d49287cf6e57bddc77ee255b1cdb05057fcd1f24157336034c91cfa3725335afd2e1bfb2203355881727311360d1e32fb61298e7486c9be95e141c374049312054e51a6f8632c9e2ecfea2ddaaf27f60141ff73713dae070caca1212793f6e0ca1c51f6c69fa20d1409cfe23c4e6e081e21dc47b3f660b82d7da389ce5dcf55d02aa57129033623f5929d04c74560e7b6933881d94b72606cf6d163e4bc9cdf9bfbc48c9c586981380cc9dc083ea1234ee8ac984da7638e3f8aa355e74aefeca20227cface9ac935fdadefe6b949f396bc491218d94a4a039bba1c66293191b66c057b0b7419fd8c18f54d28dd1cb9881a99e84159dc634dffc453bc30fd8da7ed8ccb667fa83c0219cc40edb90a6cf14fa2d56721d38ba96ef163ca51b8fa84e9e0f671b7f18f7e47594f9e13bc15bba48b60f2fad8caff2e69d3f6560be035a9288496e49cfde9ecc502a1b4d9bccd617d124aac93293788532baa059d48a1758dfb3ccd518f294e37e15f640a670fce9f71d7ffabaf3ac4d7f44d281739b29537e5ca3bb74c27b5d87540eaf72069321a0702bbc965ee2a1fb5478520bc4f504dc9aaf6763ccb6bd045ad1047eec3d7155c31a794513c0250f6ffe561d860eff83043c63767feb746d90c9ca3da0503b9f6cd8cb57d0c939540df0f8195ceba5fa1fd73a2d6a6e062bac657b2ea17ff2e5f3f32d3f1472614194ecd29fb7ff9aba440c45e90ac2f4e6f44091d28e1139b1fee6197b4d303f50cb4e501135cf403c17482149df9ec2f80ed7a8b9c4c8628bc41e1a8cd9a72619e7a20b0e44df3908101756b06745f30762871a54d3ea2ffc0a279b04783bb80590646df763b3d796b50650cd204cf76d85fb81343a0ad45b378f35427752579c4c11f35d20c1be708c71a9e0993862c2ef9157c865bf0251b2a153e775af9756713725bffaad502decf5bcab408ca78015e51881f55b3c58222a8163f19809bcb6509f805fbb3f177d1f238d94ae482d7f534e015783e4d6fc77383859aff14771daab5ede9fcdd5b33a58f83431c733b28852c70abd8e66b81402e53c5c107f3a51e3abe5bfaed105f3d77b7dab973b25e0e1338d5cab8fdb8d5bfb0820d9dc8632d2e8038f34a20bb829a7ff705a9c600953e76e05deaadd4fbdda5b92afd7dc19e3a3c6a301b13b13b9de282463efe74e35532b3d6a4033d7a30385261519a253b05f9d8f9896fa7322be964c55ae223c0ff72368010885c1a617335fabea8f9ca38bf6a96bcbe072dea9a83ca23fb75f3e44051a253c397a3185e4a3d6e2ea4147a96084edb8738f582ffc89cc4d0d346ada3ec83983c57dcfc007a7189b48ee174879a6a0f53a2529c201b8563eaa37f02a4ef6c057c058eb661abe036c21ff9cd9908327fa9ad0be00365cb29cf4e678a4942a5c20a0781ee89c6d09ee1bf232ed53aee5411c1eaf5b28cb73d093dc6ee9cce76f86ec77d4b81b48ae998d6293f4119e6b51346b584357a91c720d764d6a57927cf31ab4a75505b563e70ccd1a7e88b62cb38a435349215a1f19a8308e86b2cff6eda1daf15fea57bc5f009e40fcf79a9bd074332aed3472ee101ab7ccff6d047fef18476d3947943a8a0f5291e00cc04b4098c749900f782bfdcb686314e4b48a6ff48655619bef40c08f96a7d826abbd8c4e5c29e1f0de3b4b40cefb77c87478f8bd04547955ed71bb17b6dd35d3d1650c2b7e5653a709ae810157e08876a8fe01d86dd4d104034fd22e5fbc9992c5c458b6ba695580aef827838fdcd77de67c23dd1f711934c53dae39ddc073f1ed7dea567cbd682c229aa74e032ad54ca165d7419593a256a7bd97d0dd83457fdcd449a151cd2bf80928a8d72e7512715e5d849c7cc71cf82f622779bb7f8e7b0879ef2dc632e172c70474a57e260f8a91c5c4541185e987c0ade59b140fdf91f4d153323669592af0c0c34f7ec83cd6d0310eef005a888400035acb63ce8943267d1e754eead39efaeffd1bacc62b049e11dcf3c5bf8a7b7204ef6127464c1d11cf995d6c31e13d59e48ac094ca4a82500aa6d8ee1f5fec7b152c22cad1787e4b5b6c611ad91284923104a4a32f1bde9a6e0524c60489459fd68956eb2a9ee537a2f016d74ae8134867f35e747f3f87e1ce705e0a19871564ab9f93f4ac3fe06b38dce52df1c257c10bcf446534f60caaae60eb0698e9ea4e16d75073c0dc0e5a8f7b528b8841c0b06f00fd11eb0feb69705f62683d2222d0aab922f512e3bd9a1963f57c58d6fc7b3420eee6fbcd82a2d6e43a8b60b05d70c9bd61d51cf77c8e591f347cfe0259a5edb7a070f1bf90fb24680a0c9e1508c3166cb3a04977d9cbd115a609d24466b4ee2db83c776664b6fb8327585fe0a33bf34f9ee312f543b713efa0bf902db21cc80b7ca5d7528c8ace9e38fb2073bb4ff2ce7a2a23e048f493f5eaea922eba620dd984499bf486cb1041a5618a7ebf739771dbc1d6d967e8c3d0bb3762b7ee19220055945fdce21c52f60327e8423e3b53c23a66b6411f2845f8b8028c69cba6a72877127d6c0ce31923c8bad46ea62baa482c654ca7dd277ce647f879a4e19effaa5f409f3285b3e5736c96e96495c91d7c1869f47e306aeb121165a509be66ae1e74ab1fb0daf31a3d654871c47b783fc684d16854a75713147af6b8f8c09234ed5dbe79778b455a1a594c07fec5cd63cff827f29ba09087660b18000286b626af80f756f7051f1762af2e3674033d2be0f8fa3de3ba9baa7f484624a77f26f5cd74f222afd6e4c4dedd4b67e4c24c1ab1fdb4a4ad63dd0ed8990d9168187914dfa01b57127f4af4c77a303691718e92ab8ce3b1592ae926fa93cad0c4f131265ea8ff7ebf7c9629b4fc890d3a9f5946461d040e878e24856dbf2a5d3e87c38cb2e5fb04174d6ad63fda925620ba50880a2491f6b8ec23ac9a81a8a1454ac4ca84edba71aa703d8cc0ab08cbe440e8da703a1a145de36b0f1961a24769c899523d369a61f96392afdfd448c905c1a6d010d408e1e7027f1f52f5b3ba2c7fd5d65447373f84b5eec1f5eccec805cb0eeb5478faea04a7b46fefb45973fddefea962960d74cce5b6759b6b275354bb75aec3af4c971761cf7348141fff6e74686dc0b989ac32519e0d48c5def583119f7cd6cd8a639fcf04cbe49b53d6febec7762708384065a7fa2b76835229017bd0e8167a40ea1e2e18cc5db0a1751f4c8054ee3895dbd7574f42bd2a2d586048be62fb3bec95032d60170c0a9564507c27ac9e912ec907ce21d58530cd2e2006bc900d6909ff0f4b6f1e87ff8c2f22ec21cfa0c86fa2579b0666572dbdf4b1345fd1c5a8058262e6ba554a061220170b0350ad34d4f2773c6177bb877c5694601cbaac7f8bb9ceadc65ddab4b3f19d6740b20c6cfb33c730c78c1ac494be5a0877bd2a35f91fa2ff179ab291ee2e366f7e6656e74ee0c806ad060d6b73b6729bf55be781da2e7069228e5a241d1062a1f100152a5c740a2c8697fbe2a5c96ea92a193cd9ab60c75a7bbb49c1ed52b2ad5d01bfbc80880e10e8947ed0b751beae6a67c2b3d951187187a3fa11cb5fa6d026ddbef477773462479e0eac04f9d32a5ad9f1970069d41cdadaf38a33b1afb8c306ab888ddc2d8f281713db3b2c5c8b5fe241f9bd358adaf9c2bea1b2d34dc5d61f0def50115a060e8226f4a653bb600e134c524c2ecd2a48fdc3dec54ef195b4894e7f4ad12a457f81d07ef32a6046c9ef794749cfeb895cde9bb7f78f4b8702c7f5defa764eebdf7878d09dfafb8e37c9413f32839686b9f7bec3a61eac48357d9c74db8b1867c2e8b890035fd MD = d46ef45eb47aa54032fc8ea47150d10334b208dc6b7ac5e09e8718231e87cd1c Len = 36152 Msg = 56ee7cbb745a2b1f3a77c8a9bade1e4934a08645e7d05adc2742ac2ab093384b3a6998c34dfcb71d57d688d3fcd7f86ead7b21ee7c60c06c2e02e9fe92c9f9db1247cdc088ba319253d99b44a9cd1afb2e7d8970c60e0896a8aaad7eb5817677070e8279cc9c81c455086ac46ac86c38e12c26936fe41aa2bdc35f70bec39767414821b7c2a990fc86ec5b1be7d1d56cec13601f1ceaded894d4699d589544f2e77c114212e944810d0cd710c7ef40e177b7a0db77273d80566532cd290165612133bae26364869d13f0476cb22b92ddaba24c9028a31de12aff22c7d90ee2fc19f4845f5d233f96c02111f7528cb4a9af5bce06d76668443929a15511c4a30bf447d780a92d55b53b269f794c1a8e8dac6a8c052b7904f1ab6b173d792c91d6ddb41b0eef8ab242ad8757ba4bdd08d0ca58f055cce3db30a74dec48b84d92a5fac4b8d2d6433c853dcda381f5de0bbc30ab60bd63acd3495558883e77308fbf73fe1691075fddc5147fea98f2247d9707ee460798ddd683de1354e75ddb716d71eb9d162ae67c4c592593c5ebb748aa76a609f9127ccb286a06b60b13581ef71c11b628e6e10060354808d188a0523da65d115c7a94997e20ba177140af80a59bfac78ee357534ad06fb08470e68598bf9ac6f7772a2ace29b6e0e28de67ebe172e3a11ca505c525122f3a54c91c702e8e69094b248655fad827726a107ff8cb733757943d403bfe1e939fec3aa02c549c8d7f9d2f5327bd3a746052619ed55a493e28ef5ec30dba74dea557e371d270bc803ef803a7968c3acb347c1252f6205d6e717899fcbecccd56e7324430071566e7c3e641e226fa61928b31c32adfb0382eedea6f6bc3b770a2e205ed393ea5143aaae25a916d8a4770c12df484f68c6215ea9f5f7eb10d1729023d4f1bedc25cef6076ce33bebe44dc72cb26ffdf0753a9f411eac41b30297fd462da4698df997c610e0d57af08f23c1c93bb09fdc3856196ec81da46b3101de4f12f57c46f62783922a86bc2ecc8261b125121d7439fc34f79b51fd81863699072aeadf4f44059656f1fee7eec4f011ab169e5f009db458a64150353d2ac098361e8e7af00ab96521de46e4789ef73981b65b4dc88f07ed415f2232e7452741a495e6357171cc5abe99659c14831f3ff9af51d014357b5b91a0d0dec7fef1fe1838fcf919a0c5dcf3c963f60a9bef8cdca688ce2bb79a0a5ea96020257ea8365cafd7ac32bf2c528a1649d9a10def88f1460930563eec627025dddf48edd35036a17f3802f88a26492a1e2f2202a79b0234dbdfddf2f8cc8eba4c057972fbb66fb6fd83d27166bff9aaeadfd5a1a02ed51b06c208fa46ae8210b7790035a7cfcf975877e95248856241b5d1021361a734a193c01e7e5e7112d02523255f5f031dec98fb91c4b8e04b9588edf17f7270e56e89c369a8c97e07a29feb3018acba235cc6f610ef3f387d4e6a1bea0e5cefb02bf0b22f9e0e3c282d2cb96887145ca790e852affa64f5c115644334e8a68e5f80d074b988b5123f1ad47516d52151723009f6b60db07fdd927d4d1834d8b4b81432f34f8f466a12109f0782295b024ce32eca6d52aa3f996cbd21de1b7bc885901d1639db4aab6bb89657f4ac49d5fc5161b61beeda9bbf4b2ca7cec416348c9b9ac5be93493c10bac04eb48673334c23a9a20a0cc8fc15d9d3c82f57315f96deb0e827dfc987c9bd26d209de618502010f7680d2fdcb65bbb96a4bfe54b16a016768bce854f36069cecc3ddc9c31e792991ac668006e759ce67668df0892d2abc72bc5d671e89b68c22596aaaba1c37f517624f7594f0d2263d5cf22d46a9484d91a8ad1a9ce445f0ac35d6d163b5e6f3f73e1a791d4f7f5376dc8f041a17935a41d5300820e21f9ac90d95066697f0b6af7479f2f67fabe6a289a71d69f4966301d678b860efbdcb27354782292f0fbdaeb9c08bb6fdd2505ed8fcc1bcdccbe86000f9b3d3799b023531410d21d77e697382909bd5469d10fa3ed2a9891c9e6adb093582ef1c51e081a623efe74dd75aac436cbbe7d666b9034fdb2d6540a86ad133be9e1a545cd68af862a2ffee94f1a790b7646549c9a9187078d5c7f55458f134e76deb9e2674bfac8feec23651cef3eef31db40d207188453e2b27873cb5a971629ae976491bae370dfbe4b178631fa2c2407a9d25a301328da61a92cc11686d928d8a593f5bb52c5f72cdec933e997087851f7623ade1cd09df07847cfcccae09be44d373b592f106ebe4441cb1ffccc5541934b4f2c879152e74f8e9c834a73ab5af6170b9962996cfce648f7d911bfe260e35442213cb421cf95c7d143eeda7fc307fc0b85d3a8186f2aa55f21be2b48355047bbc52480332eb2bb15149e5c41a7eaaee6246b859a9e7922aafeeb56ae4943eb6121253fb08f0e3211ff4242168c06f5427e10781b113c85807980893d222207dd3c2837c07711f46d0bc2d528fcc399c89cabc8c351d9978b98650c1d4a5664d61f16b2897023c8d041065a9f7e89611f8525beb9e5ba2070658327754948caf5d0d5f63601ac77e2a7f71ca39bc016ef4164a2265545e8dae8c0226da55f00e2594f4bedb314ca4c487b625ad9d080e2d952bc312ae4b66f2805442fe802d044c16afbd60cc386b6297b73efc322679e54d65303ebfe53d72d3bd7e0999b00c411104d1b962176c754e09888de1c93cbbad7b0c320fa88bbff4821ab41915909502888e1d9976128d090194eb427cc12143f1c9a52421bc3a7166bb6674ca3bc869af5535c8b0e81a5753e68ccacd91b69f5ddb0083dd4962c8bfc299334a684bc4edc96a7664679dc764ffeae11838dc1e13b2cca537ddd96911e2d4eb1290af92b85d54291d1b87b7a933ae3c0921024eb803620ecdc3fed0f17ea1e2bf6f5451b3736b67277e78d6b5342f21fce4e9bfbf2f89370bb653aec30878e0ad3eea8063be1897300ae1730d73e6398feec2df9db97aa47e0f68512b12c23b6899d2bd2daff46fb33b423b16757bf91ec95e3cd813eeeda139bd468e2036797e0a9d56859b87271d9a2b8d64bb48c745eefc35f2d13e58f1efc31d60a31e1159fbbafb00333973fba1fdf87ca7f55a81da2d897263e19cfc8c0a34473e11999907abf921f993ccc9ed49fac2ddd9f95f157275eb6e81203d890339a63399889798f0ff7f411ea804d68002dbdf8f4a3a1b6ba9a233956911713e7c02361e54f23a1a7c5cbc428c38e840af2bff8db3af7669835b6586fe34df2c99ffb82885156598de6ecda7efd2bd0c6e37e05ddc2b910c915b76ee55f41d4e11d32c40af9d95fcb409f7a7496eaf33be9414581a3b05b56246ea23e6fbd623523124ef2ae765a69bd2ccc93f6949671ea4fe34f45a4f04648221d047a8744d09ae149c8d7f3f26d44daf96286f16071cff105cf115d76a16b1d06bee86821b768e8dc15de19d0e1bcf3296aacc8fa42816fd48a6da2966f74a586f52028a1f4776f305f2ab09ccc0fbd8331d1e20bece7117707c23cf8b94b03c5308c8f6d8dadbe6c312380fd37248130415e083c78e81f16ce79f44387d87feaf793652d8df41cb91031509c29e3865822b90035ed6ee0db68f8901fdf03601ed29d7188f933d33f86bcea21aa3416215a4c929d53609dec5ca9d836cbb4f0884a127c27db5229251a2c1433c2ff77b6737e881db3a59e7132f3962d52d37551e65b4eb23a38679455e9977a7a2cf23df5b6a95c14272b93733d90af7c4838a02fdeafd01fcfd4b3bd5b3ba0d9a3cfdf665ebc037ecd8c79a6f18f6252fb819eac04672991febaabdcebc74ae84d56c350dd8ab9f97f084d53765beedbd49872e5353d6698ad5fa33aff0522ae10cf123a9bdb278e25e8340234bcfc20bcc44662dafb2f3cc40cc45d01bbd033d581f3ad0076f444a875583c937a3427994e3fac59672b862c0936cf57b2fc7f85b58f307425c924eef4e188fb5c3dfa557e874a1c4a037dcb9e20186bb24d9b06b30d4b5fae4e34e0b0f76fd42cc0a1d69c46c4896b5f2a8a13aabea3836b8e42c3968629da2a7e66f0c07886b0642206f0a3a30a94e59351affe4b69ecff601f2d526a3a71060a69fb672b79b1d287cbc2c76d068b40c209bc414724b6b1198738687efa3b89decf1a121015f6b1d80f59daade51916bf98809e383ba928c2612d014ad2005c048295eab0c349aa1bb9fe03e80e061090e8443ba8188d0d63955444572887268468b41692e970655ab1f96aa8eb1ad53fe04f401e222a07020af55a2c659990646bbfbe3ef134899cdf923874e31d0ed467ebd623c148bfa9aa586a52f2fe42ae72fd0c3d415dbeea2b1195d55ed66255675e253e5daedc5f5cc59d4f357ee36a64b7261643b3ae4b7dbda852c40e7accc7f154f75e25072d08831bad98e01b9e2b3534515dfeffc7bddf9a737e8dfd406fec8bd62d75e81996db0bf382ee9454aebf5f77f9055966d3bf92c0f21b94ba4697f4643066262eef1595aa5b6ef393d59dce0f7e916531a7a5b9c28980e7413639b428d0bf6a71f979e3598a29e3648816aba1546aca2f21d93700ab839ddd271cf6aa754a5bec9d4e1a8879e70acdaf731bb5e35831682aa23302c1ee5e96ff86e07388cda2a6c4de65c08f7010d932fd48d4922342e5a84ad5513187d475a7c09a0a6f11e6a7546fea87348b9e8df9f95a85cb92a4ad851747746517a58107124df794ded0f8374ad168d0025cf3edb27951f66e00c8a752aef3c36579c307c321c35dfc08a053b743e8cb9bf112f46fcbbf797ffd3ff8423557b53bf941901d3df5343235a792fd68918e1f06f2f7777b57bd8d44195e310127a25fcc058866ca158049ff16da6667ea7f55429cdf13afa12a607c5ec3653debf29a9b17d9e7efaca90a10f41538687b07074e17928b902629bf4e170e270f2c0cb40e7d69e8d541173a0d492abc95cd8ffbd16bfa27456d2074624b27bf9f705a75cc4122b1a35c31a4a11d013a14677dfa74a1fe2ff6fe78455f02f675164243a57e6bea898285610f727982fa0dd13accdfc085eacd629afbee4462919c272f0bcb01abba9a450f4228649543a9942f39b9d079a1ef20ec5eb61a555a58a986705c0d4c8a1223a1066ce7225f0f37c309aadac19c87c0d835608bb719734fb19cd896b54213a88023e609119469425d035ce44523bbcbc54a93a06e1715a11657e8a5ce29c45a14613dd24a2bdc3e67f174f9ed7eb3c81b63f860639964281e6934417f894ec4c588194ab56b92b248999d1ea1f4983f414936d37eea8b6b31996372b0a8d86bfc5f247a3b9eb32668c37d5d49ce92b8a1c4f601a851b0f3b8b01e4049d08bd91faf0369c20a66222f39bcbdcd55c8bca29be0f3c715fc4619770cb432478f959840611f33f9d42f05c2034715ce63d2ac989bb0c47f96eebeb3d6d553550b27cddae4a577b125d45225fa0109848a832781d04088d7a6730d2f23ac9444271828453402747b809a7e2b48f592be66567b1f26acfa65565b70b29c3fde5a0dee0f48fa3e149e0d08f19c952b96c31fd3113a46fb0170cc304e03e99817e1e234ecadde623e64f6a613408ba9fedcdc824f9ad735874230790febb1bf291fd16f263a8775da1360fc4dded079b351c5ec9e0682637321abbf1a329cbafa5dff2925b89e7fcff4759305400ca39c6a04986747ef8bad566589d9a0549374e297e951eeca89074f5df2a42ce82da06fbe0e1025c5b81c28855fb3fc7e527ef8bf3812a6b499696c40a1936b0b21a9a71ed70368adefaae133c91010c5fdffe59f9dd0a604badd92452939c51f869e5b497aa6d84e3a3ec8995058a2ce9ee1f261a0f3b761f14b0a9411fd01c96566d36a7f633d51a0c024dc7bf47b443c0b672ac9e3a173489b1d56e149e9b3c5eb57a76fa15e5d2a193e27d34a63cde0658c25a1082ce3c6b510b322844385ae142f28d1c7041bde2f5ea0dfc3221191d7a877afcb205973822ed25b15d8e629c9a2162d3ff732c6ebcb6f27c77fba5749054b7b92447c58e8bedc1466707f3cf2f9990c70ff4bea35cfbd33bf436d3aa3e9c78ec661f57cd007f8d5ded3f8f2787dd8f4c2e40e50f6b0b28c1136d443cd9d136fd03f6be823524f27e5c8f8504173fc709d6d220214b775b927209779af6958a616a687a2c7e70991e318276036262c0569643008792c2f4268c95ee53294bebc025ef1b4a60e4d9c408b2f293fdd913d8e8fdf680b5707b03bf9d08d3c686c38fb2e5025a70f43ce65e9b5b345df539f74b6d82cb47f26890a77957bb62b8ba268e04dfeb13114b2b8fa64072e7599b384a3c35c5beeb3583c0c56b789264283b33a8f46aebee8cda286e12ce4e78b02241d47fee8 MD = 982c20c2493fc9ae405b74b65a022662c014a38ef3d707217e56e57afac05994 Len = 36944 Msg = 876804e2e7f2b045cb5f6095fca5411b31efe0fe8444400923632aaf48f2c44c6bd865aeb6e8a8d4b9bfbff55fef0ac5205de8f379e7cef6994a96095e4319747ff5ff0e0b8bd600121e62cba1d9348df45b7e80e85c26c3af94195dc7d8e27f2d877b09ce2463503e44f01eacabe7fb16b24aabb9ec71f8cc085cb26df948f3dc5580a7e7fb764ca5f912f767ad4a98ec2af37ed4dcd71e5770071037ee735af328b7f13e58387daf05705dba2686ebdf8a220121777fbcba92c27f0dfe8a3bdcc8c8eebb83d16ac52fb1588d60c27c589c7e3b8904925a5c363308d773b51ffefd5aa747c3689c4d407ef0c8a127d4bd26b034f2ca3780a52605b27d931e8dc18f1522c8622599b1017e2e5432dd7a77f15ff4461297b7fd29de86e8a7ea0d8d45a36928a631eb57375a19175b0bf6efc534846b24d986cc06678afef64427cae8a9844dd8b419a9adb9bafa63dad18c69d7eb4b4827767a8647c8a8ca5264e040d279213fd5ac0d2a4417e5947192b5a7ef31ccc6a60e6f712648cf693c4b3815c3528a25bd2bed75a33ac134f9c1d445245fd8e580d6148fae11591c2b65382f271772d0941eb0577d2b748c99e7500c207b56efdd56cfa7852a302b47384956a4cec089810ebe987af0e8e47a8b91c488902d2ae4170983539e3adeb74ed451e2815c98ac827f0043930384c335ff3507a347dfbea02be9c172617da42f3fe98a372d453e025b56801cafb39d6d022643be8b5592799ba276b08b4f3561f3e644f91dd85f16ba64d891d3ba30bc0261e4e8e1d6892bc3761b60a29d936e5910b7ce1398364704f0f4fc57e1a3a967ac932a31a8cb3d0a2c58888dafe5ded82e8cbef8cfec1ca1c37c6422701ebd99d0f88b63147f37d78ed43234cd5437d70a6bd1b2c3a81ef9a517d21eafcb7e0095ba136062cea2946238657f3f0803c06afa102abc93d3745e6d4d32e6d07604c281ca0edadf04a8712b2a564c28c9fa17e4824804d5c57bb527dd465c552d0e21f7b956c4dbe87b835688a13edc12edd9cf2ff5e2957c7473ed8a435a832a8478c2e72067e9d375606187485b4e6501776420179dfb7fc960665d0f2881f5d0908a5c550c324ffecff32f33eca34a9ebb4a5c977e3156e0443b5d930e78165831f821dbfbdde37e99b4894b3806492c6b29eb5ecd5c8923e71493b75490158622b33d9c7c13185d864e9c76899deb1350abd653d2a7a0f81197056441f07bc12d64b87fd7fc74035e66709d2590b7bb3276245dd43824c9896fbd801ec1d07018b39b6b53bf81d8e9a70ea95508368dd932dd661d379dfd1842c3f4332a9afdac47ed4a3985c745efb67d80612deeef0c880a55f3cd91fc86b91da9c85463cfb1c9b603d175cdb0373ec50c9126694a951fb2129f228a2e9b7bd5862567b24eefe0fe7e63b81b828ae5ef332d1c2f073aa1dd84685d0ffb1e31f372928a10e22e35cea337753924b05302df7c36c68cc4b3939598a6a9cbd9827d5756e504f335702d5a95d5b0fc713106f7c79db843faffdd2c7627de0692177d1cbaa116e9cd38248bc40006749527046356788d92a62dc231490539141297faa906e6ce2cbe35ba1e0d1dc6f3e3dc020b71f0cbe38ee54b8d5a6b3f5d21abfde682dbb524d010f7fbb85475e024f90bd7602dfc9d7bce7f26f17f7a4a86fb8dbb75a9523aca71e30a0dcf9da5202524af6a56a728369066e5556971410b2eb21029772dd476ff873453b3c5a99f09577bd99355ec84d408b2d052acab76ec74cde46ecf5c9a63ea5fd42b7654694dab23f30e8d5130426e76a862b4f190dfdcdaefb6bf38ff451474d65c370e4598298f01ecd7bf00819f1726c0107921adf11f927685d26d4b0e5ca271903ffd92d7a74a58bb9ebe3aa37f929548adf1febc8414d7aa90ac20dffd8090094f57e4bf541878c256301483943408e5f4c77b43f2bf00b5dc836a8f41b7e22ba71c36e97cb174734f1fb8464053426eb56dcb904fd9192e1dbbd2270f918e7dad142f5b085e7557f152cdf46a396a6b5aa997ab85ab4c9eba1cffae4e54bc88ca06781fe167a3f4a593fc96fa2ca9644a44879a7a7dbf8c1d6e9a2ce84996d266bbb93ded1425d5d1a8ed32d77527e2ed06426718979a80ad794aaac4b841e5eafc99bb16ad247fdf5a47d3eb5c0b6cabb6711a45400602d205b82ecae9e849bc8fc0a34379c77c3571b27e1d287e8bec1ebbb9ebc12b9bf4d98bc3e223b184463cd7fd5cc137523db5d83d5523a7c61804c94ef16230d27bbe6c6ef4b0c420efcd86cf48cd9b8c5dee5e177b93afa5973142e03f6b3d30d07c0339e8d64aa51e087423f1e51cafffe3ef1578c1bdb0d16dcf78bd247c3c59dbf72ba6de6b993db74a003e51e2458a5d313d32f5fa702f7f181d53d5137e7fa3f14c17104e86b3a0af6f175814d66624cc9992778d6c1731c4d7e9c52a7eaa9b98a521b31cf3e88c4c766444dae8fa006931808e9f2cf2497cae673deac5438c953dad11fc694442c9200d5b5d05b0b9b00be58358392990e7abb5857adab03e8f1da470176f2f8ccd72fbe6c5b4ef164831a79edf1a22ceaed5bbe503455b792f4bec19958d11300076142c3a7e20e0daabb0275d5747cb783562a5ad8faa051dd16f549d4b52f70b334177e3e9a9df0d7fe666f979ff4eeed1900c9f3f07a900b7136857325aa996b16b0de87ff3db8ab733a3dc07b121b8b32e6302ddd92e8003c29fecc9910e48f9783772c8669cf85b7e252d89c70a7de325f2fdf1885d46bf633f849860edca12523da94b6ae90071af351588a8d2e5675b01b9047cfcfaf2de9146282d10c304df67b490688c4a03ad1bbc8bbc419a49bad85e9d1cd344a51bdd5b00613ddcd809fdbb1fc64b7d18621f491a6b1e419129bf1345d2accadf016beba9653dbd95b646e881eeef41b9b589e5bd1d3385458ffd0083064d37a87a821da9a0d80d43d08b613d464040ed8ea0b7fd3a460b6fd6db4edf1e7f31086e6b198a79d575eb3e144edb38051fbcd5ade8612a207e16e5a125e1830a6008c36f08d35afe9c93e829d8e32b08892e72f89f7255898443a497ac129db66eaf62d4120daa192b46b61227de870f244c4ec905b62448c5fdfb040cf9d44b000633e25ebfd0efc90990166254b3e3981d4f6842b7fd27eb4cd2326c1f9190c1131ee3157136481fe65e7fb1cb194c8ea95e1c7dfd49ec9b381167f50a3a4e56e00c1d5eac43ecd4e408933dcd2011aef9642fde0e71607fcaa0eccf44394d6a75e3d962f65fa2910b769b2ee130fc9f1447e78e74db4b3f0967092155f455a3d88d5f48daf233fe6491deac90b1d30a02f18db5b7f17583fe4f0513c3d52ea913f0f739dd6468c2f63fa6de600b5f96cc48687a5d1aa5f2af3e2acf18429f252ef6e95d891e0786ca6939ecdba768ec7936c206f0bda534261dbe7adba572bf2f867cdb6586d8f1e6f8e0ff89ebb6b311a2e181f8443bf26bd50a3f95656d1e2087fadcf905a5ac54d2e33ff14010949d730e12fb1630d4844c5644cdea59eb08e3a987ce04345e1ce18ad39b0f3f37249391e1839b4b817b6ceab10b9cfdcdf081d2056be94eb0440b1de30fbe0c43aee9b217173b56a2581c0dafd8e3236ddf49bc7d581dbb4ad63ae399d6b73c61445db9dc405e17de21430866ba279172dd23b1181e0943d3d955251b77609a38ecd7ed57846c58dee0cb23fd3bd01085f3f7f7fe4414aef456442b917a23ed71b03f98b16ecddf499c9ba69ce346684e27add75652a5c35454ef3d246867fcb3987d001183e974c85e9bd96d39f16174832d9948d1264b9cdb3ea3fbc79390a7ab7a6da04d29e1032db30495c53ac3a00f5f85fe48fe0f73f419a440221171f4f11c298653f3eda111cb6e3f0f875579d22ce39d3f95d482a5688a18fe486743724c7bea1db05f4b12cb6091a041e0a8d47afa503e536570f8139bade5a03a3c37f3aaf434c900a8399b22b3ffd12cd41d33133dcea089e6f50220275e81b18647f7ffce1fa498618d24fcceb49d01a6b63d768c76e4078ca31d60aef25396caaa42c29d66abef1d164c360a480f27c6a6826b66bf87a8090a4da568277eafaf69ba3b8c9245cc85ddfc178e428e65dbf5e83af330f1340632783580886ac5de8b49b1c02ad9f840e91de8832a81858dab592a5a518a732a2487591c9a809ffe18d66e64b6d13cf74395f21089524d86d1bc84c4aabb2c1ee7635965e72607b81948b89ebe945e52f14e7a5ee568866b6ff89158c4ea298983f27d82f6c5c3b49589d896cb8a26f8fd2ecb95c92bf8e78bf7963f26813014011e0d9b4fc69c9994801676641b5e926e1f2cdcba036aa02fa0dea058e60a6768ce50da7b8f5a101e15b96312afccc74d08e45b4258a53e62dbb0a4e3837f29c0ea8f65018ac5c03c300b875cae3a40a1d03c3be892726a2d9053724ebe560211591264691ea452f5b9520aca806ea572617ca4341997cc96a710342101599c640521003cb2c16d5298d714e48d309dc9a2ecbdaf56dc0ba8092f0fe5b34e9cc0d5046000b0e2ba59b6e2cb333e4ad0ad7bd3afe0af0bcf689cf82d213bfead2eb102ae407fd0e014f9ba5a3ef982e726d47ba1508deac2e049b2b65d033175b581650f818753888b4aa9e78d27a28a3c952abc8559438a17f9a7d22172ae9c5d2d73ad4d30325ac592f59ba9317060f8a729280979dccf15921da7f6f03fcb2e9e75b02be237fdcab7e79d197db51261f0c00c64577d3ae3fd5d6063e5aaaa31bab240a405281aa2a3c716657538477f5936901c59f0728823af23f1b9b8e06d6a74833f01ce58563cdd2d1680c3a85bcad5debbe9fc200ceb5a1826d53116ea9701a4843ef160ec6c700bb3051cddfc2ce31bc96e68ec783ca8698d9fddf3b127a3c9fb2559d96f19cad7c46e0c8d6b65a972cc50fd7dd300df3bab808420c9049f1b2d1ccd6ce42d31bad2225b60ae5f6f094ef6837c251e48b90ae1ed443a1440c1a18c17c1558feedc6489d100cf007d08d6cac290767e2b083128e1080d41cde3dfdefd7fc9274964020b3612d5321a98ed338162cf08d053a8bf281449718dab7078484f49dd897a34105141c9dc8fe119998a9a37a47ec0f80c8a0ff68ec93fdbc4c0d8dc99f8488300eb32b2e6250ae564a3dfb73a7f77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc0184b9ce9e76ca27311cf49566484f202df67d35558add045d580126876963832d7c5373584c34238f11e83bed4989bd77b85a30acaefdff5d88e61cbe790fe8be8bed5794e0a44f9a3e77525fcb825df714ab109654d60e5ef458a7744eaeb559b670c378bb8075fbaa8724e354a2c85811581b3d05d0fb08a24010d16ea9b0a807c2ff2c64315b5a5d01f7a26e51c540b8499ac948538d049c87a0fc6366a25385cc53d96320ca5d60ce14c4a0f71e581067d462a6c78bfaea139c1eb54f5202387607a741b489afbad4c37072fc99472198132ea694be9192ce4f5eeacb8a5c29a962bd855462f673fd4bce6dc8ffb5f3c59d58d022ee729e9f00e58c4110095f4bad44b76a1bdb9430f60718c3174c8fd7bc06acd9e245156df6da231badb2e2453163605d7d0524550a43fc56abb1fcb4b561c32264b100227a6635c029ffbb8033430795501d2b53d0a99fe7818f4246d3909c633a5e66a5d4b14c984c97f1e3fe0b347a5ccab21490628be0638c6a735dbbbf052df54fde4ce2ef0bde238c55d9e46f7468b5bf7f929548a717507a259a0cb571051ec4b52a22a781a64a95c00bf641eb3e855d7c1d6b5ca665847d43d3a9050e8a80cb12b598fa626db5130bdd683147a4e391f37a0c514317d078b551ba374384c46fdd366d7216fb0b0e1e9763c8f0637765ccf29fafe8f3db75635968d47aba91b5fef5c8970518f58fe1810e8c4e43e8e0efcb4dfcfcc34e7b3536da631af590a75d3ad2f0988c1b9c3ce29207c90bdf0a454d3dc2e74dd093132e3a6c8bfd694ce34db205351e2440170416c1ca8503ecb4c29888105a0ac4e58bad77349ac3ac7675915e4698b9805a2dc341b777fd8d257085d7e1b1a41693935d0d7f9446d0fffc978431c08166eda6c10ffaaa74f681a02d36c11c4591058f72b5d3b29bbf6728ebfe605f25f9b8b737b3f9e6112dae9bb72d1861953e23c614f898bd6a819442b654393c4c41a3a74db51ef27c3c96a64c444f493e24d682695d377e5a1f70911f0f26219f4797c02d9ed0985c2a1f0c1404cc9ce54b04099c6c16ba14a0e25f4fb68dd4c5127a48fcf6769e5900331336f4f82235bc96a5d3ad9e3c400cd1f26ed1d81e67aa3688e5437acd1cc5b905db9d3ba2d37e759b36a937cb856c2794a3e86ec72d18b1c80e0f43ed4d8199282a85fee66a998736efe74a2e8bc7cb8a1684b797be63d5509fe139c6943dbbc54c36a7b4a016b6bd23ef3d2efb25a51ff02c1b56 MD = 8e28867538bc2c6c94d3428f05b1458f428d3f950430b09238209efe6bb267d9 Len = 37736 Msg = 6b9e10c9dba055603196cb2b7fd7c54a3e8d10624aad1c342e2d5d75a271f1d952068372e1926f382e0b27e9d628d513fa15426e426bf670215fa11c5b3ab91bc509650d4c959a21399583e3b4232756866d464323ad83d0e75bc954a0a0e76a4d0f7d4525901c43db9ca9c421b0023c6bfbe487f55a0d7d07879dc7788ec2f1718094bf736a3ec59b885f3225b7b0ed3029e6e3c05cda9f094de71bebe993d5b9c472263e0d48cf02c26ed5c92077905d5e12fe8d9a325d76146df8019aa241ad43df208f60828b97b09e5714d3a04d7a01328163fc5fdfd543f807c389375bd665a3556d4b331fe2bbb65d0fb8724d107c0c134b6aa84eae4450ef389e9a4bbb93856fe0b6a5b36b4b8092c0b837b8a636695d4ccc54d28a7e3d5968c2123ae4334f13f0891e70bbc9c29b31b935b6c59710066e0aac92ef5987ed5cdbe950daafc7eba6ace77d599b45236aa4b66df407cbb7b90df8b7683df5521bd265b4246db69f09084803cd2bd1d071620008bbee601836bb80687a925131ad90cf8f4ad7e3d72183882aa0e02e4a50da5bada2b498d0ecfd8bceafc061311bfc6f08d553183af706f1195921233a0ff3118532c13b88e4bc62108e2feefb6cfd8c484c4b1b70927ac9f980587948b49769b7f27e11e724de4e589f48bf36a87d6f763726b522fbc559f19decf81b49adaa6b6b51e196b64c95cb6b719e8bd86361bb1f4caef838d1e92a3945685cd51c1dcb23a3753ca1ef7f93791351a20397a83f8a25ce995384c1ccdbcb91b261ce0afca4dd9382eeae56d85197a12231008c290319ddae53c828fe0ce63bc6f4aab92976650410a47060c17c6356b46a8857a10f90a2de418468e853fe2d40969871781fa5908dcb1fe77781e138ffb7164fd138f2e6d224a0c7b3387b30c74f807b112903fea26ca23122e8780eac1f93bedf05a7713104038e8743c50c03284a1f1d1ce918f68ee186e83a8fa262abe5eaf3fe170ba4ea97048bfd44899d28dfa5c47ebea43239c430f4fe90baca62f51c36acaa7cd3dc4373e8ed606e3d5825552dd9ea6bfd7533766cbce21f8b4cab9bcf96c98b65e5ef21c59c82858abe057781b4d535004b169f79fded994e71efb1e745da02030a83574b9010942d646752e798e7cae2c255f4424719f0bbdaaaa4a63f47a75455e85da2537464cd52342f880c88f14ce3d8bdf025ceeb798ec2bd330e764301cd047bf16d14bd138f52568c982074e6b58742aa1c745331952144b739d19db17ac0f960645a67a723ab0f1ac4171957404bca99b673f08af8ad815949be7f0d65051e19c2ad29301626a25a19d5a9488c0a9ee47a338a2dbe50bb42c5a7afbc95b934410e74cc5770aa56751ec2eb60a2ae07b5f01de9c1eff13c9935f3f66712c58103d11919c33a2175935c46a948891d4b31a197d4ef94784a87220a1cb6e5124e859203d51c7c7245db59caa9a74941b282140a155fb3cc2e341354e9501587e2efd99acb0c3c850f769fb4b426eb0086d0d1df72b857d730c7903925deaa0b876a2f46c23984421a8cb66e926d75440d42617cb4a38580976921219707ad88831e1a6f814b5b91b044245e0b23f2f491014b4ba3c747afad414f74087425e51f32247dd1ebca5a17c673eee7f067f8583417b206cda44cb878a19a40cd1a0aa3ced5d87ac1d785983b2a85ed7ede38aa044e1ba65ca5400135a0fb07b995df571cb4e844748dfa7bcbd28ae6725e9bd19977ed4c1d5071d0a1d2ff25e09c4b82414916f7adf1a1089df2679b77f00b141a1a90beb7afc86de4c10f61eb3a396e681cc85a130d6287da1283d1339b70bab0c06cc5d3ca2d1f25f5918482748e61b7b667364fe8263fa9bb46534e67b00c82f0e92819a7892f8cf5ef564c5433a4569e5c53088ad379337318e8715cb452b9326fb13050c2e542498f9ff2e1107f6e5c0e79e7fc537d9fc56157448364d47c0e6626c1cdc2896f79db271b230d392779e47093458c93163689696ee3a8d9f40d365073246f633a0d39b67023131ca87c48ffb56d6803c050f8e6988469ab48b647f7ef5fb3bbcc8e131399e8086e1aeda1f0f57dce14c49a1796696f8d90a19101e3dd8675d84d84d0073d7ad678a4555609fa7ca50f4b9c4c408aabfed12727cddbe39f9d03e475d85a04e263826f3ad1136d72d73c7cdf00aea240a2b501ff11a8acb41284b9eb93d4982799d4a32779d5f5674be380ea9ca65a37638658a23612deccbea3f56d693c9e515eb567a1b6193b64e94c7e4586f15a97288a5396a5e122f088a8c084c25cc1699c6fe332f0a5e77099bf9f7928574968d80b1b65c5dd1f2758da41b606faa7763a4840618f42a09443830b0de99fcfb35d4fd796fdce7e791682a18e9ddff8802089a6b6fbb80ed7cfe1e9893093957f9e9fb0b2b77be6eeaae80791efd35d9036793cba9dcfda412521617667f943d48342ce405aad008ffd549c49649e7dac64622bf4db4facda2e8b9d5bf59a81baf48258c84e2c7463f50e883d650702df928a9aed1eff2babd066c2c0423ef53ad9a577d3fac0e9727b5df2f558d7912ea83ab22bcfa800bbf4fcfb2db6ac4a5b1af452e8c83107c5788b02faa7d6d5a38eba9b385412d31283936e2bb9ae2626a0b7128f1f467763d2dee2d3b8cc73452c527c9c17054bb963744341b30a32a15136de5067c8e154739fb708f581161c6a4a7ddd7e4910b77ee7a3f80c8915d616b8dfb40980eca14115ac22c5bd643131e9c885f3a5cb14ba33b6d72cf377cdd8873c426b334151268ae6a88f47058b6779821cdde324d901a2a3667b10028d7de91e83f6ac886c09449022bde8a232f640d628a4c9c20d3a7a932d62a85c1eee27adfd12b268fbd18cd018b668e32fc487ea33af204eb84d04adb547822d881488103a280c890568aace13e28f6f89bb95e6c468af6fe221881a8593671ed3d65670c29e839492b5e6b49ba924ef48c2b4f3643640ce94a04e0125af1fd6081bd7f41bdedf31aba088a73673f10a75c02a3999819912d6b19d8b1e0172fe2fcd55c5cf4ee8075611d7d16ea8bc69179f40dfeeb283e4ae3cbfdff7f3283e4ed3160a665865bf9df01c5acab04eb336463e0de82fc6ec262afa2738ec083d6f1563ec666320008825a06ad2f36f91da9d6ced11612ad1456197886a54dba4997b839359d6df731e99a8270fdae6ab0c8c11a4f0b0773c13cadd2c1492691ad5edc026c61b6bc067327fbc08cb7da8d3fb775d0d8574d4994d163bbe107a482a5360ce36998c8e6bd96c4f452ffa3138d2e43ef146ea42ded388dcf035d6d6a095acb230b809853377b6094f6f26ed42f9a16f235da22dea427d383369446b3f9becfb3ce0ac4ec6f2a611adf1c985f958f6192b30613ec6843b770e148eaf104d68d0e2793b912c348490e71faba065d82a649229f21d797f0ac00a9e7a4c1a94675aabeb7ff56e2398ad866093e78f5f8777dfae1c710b1d343bad70d1e7655633c01e9f402393a92991111b4b017ed6537b9a29a6e28544001282f05a2bfa7d122bc4fb46c3a3ad806310ba99983a26d7974c01591aeedeb56a0e87dfbde0ef4dc32368587ca716e64c0ca44651cc355bf47c9efdbe4ed29c6edb9d26481f962bafc54f40f6a5cea1748c411ad63bed27b9b2685a79ae08fd43709bf972c058f6183216c4daa8bcf90218f9dccf8f35820f76c737f01568201455e71ee3ca1ff425f027add0b5c8381e383456e3d1f4b61e51235dce8bda4c0713eb5d4445d26fff89e8c27fd6daa4f2755a4ebb0814090dcae495b91846ca44310e803d3a59adcd85c3cd9012da87a356d38dff3c7cc4056a72a559c594e3f437b74d75b09cf7b86a1f94aa72b0275c6407db5675142e2db735555899acdc3fad508e95af8294e8c263e176fc45cd43255fff68bcc491ae3b966f5b9d76004c1c4009443ff5ce8414f97a9cba7fc0802341c3de187433af7efbb90dd7db96440cef872b69ddebb5e94827c3b4474a3ce616ed60920c5e5907cdfd1351c1e54e03c5cff2342034a2c8b8b293f186b19ff4474695317458d45e750118131236938b2aab40a9a7f17439b1e1b679223ed0d73a9626fd9569470b598ec223b4d13b2b86e1bdce5a6a52c49b7ed1540539f81759a5bafe55dbda96e36bb98b91fe6d6c413a12ad21e665f2de4f8f8b15ea3e3a0b3afa3d9df4b7887a62a6538f0551d4c37ee74ee5afd44ae21d95243c98cbcab71f8ec156fe036985393181982d10ed7475e3b78c0bc85510af8e2a608dc64fc71a1d92663fe9bf6eb9011f93c0d23fbde6aff200436999cecf20a26b0f584fa2f44fb9b7008f149caabf346704be50049bf307279edea08543f3964467a954b075ce3d2f881def77d412c9fe42fdabb25a56fceb6650f29ed4b00dd3dde0e559643f26b821bcd967fea3e53fc1b6d530ec80db33e1e6157f4aff1000b8268b058a4d7d39119459d4f21a9012cb1257e5191aace659c993926d87a6b342a2cc1cb09e4999a1ccf726761ed25fa639ba38a8cc75ee1420f43e05f1d7d4c17d33069cda92c2198c3bc55357b40e9b528693633d40325b14beead9e4ab4b7ede452b17aa609bc1feae1a516e3d08f286415d1016149a75cd7b00b2092b00c1ee8cf4e8b6bc0ce047d78b370b7633f3fc75fd78fefa0eac72b2e758085edcd2d48fc7d9a5adfdc0923e81cfd56578e6dda9dd639ef876462cec0793884dc5f8b9d60db01f3c56a7056c65df7514c012506664999e19ba8c22b0c82b31fea47cc5ea2f36ce70ffdec8e89d30928bf1c07e33fae1a562c3c67d8692e7ad7b62a61f5293335751e1ad043a938ad5d1f4388e9807045bdd773c64f6cd90a1cce5bef096a36f65e7e25be1ebadb4e6edb2c2a91df3cb6991bf350089e1eeb8f7170c5f3fc6b19e3beb32868255786cea12a6f74b27fb778684fb78c636c99806dfd895d463c2aa54e5781c87f29c10cdfb2b9fa9095f2cc5acd4f53634e9e9002469badde46b323ab676ca83ebe979a0579acac002be315520099f5f441654eed008f5e2b072def64874b9fdaa274f6b0d3b9f167bdf2d3ec9e19dcbcc1780d7cafd6e6c2f9f558f81ba107d961e3c3405564735da8bc9898ea6180236b517c3fa904e02c9bc400d4b8ff88b1795e6052733e9a5888aad3d569e378ae8b8bebb4809bd2de68f46798d3d99b09556f5e55b1aaeeceea480620b1323ed4ce81fc59cafe274eee210da2f0a1a73782712dd8952be9473a1eb01944b03b3c80ce2ecdecbe65f497b4538183fa45d29d1e5f3992440257e489520d98f0062c6eeaf35f6a5f0765f228e9b32235ef50e1c153173d85c25796227cac2264284ad542caacc85294299a1930c640071c390cf4b9fffb63c1ecbb74804375af0a0e507045249b3b94a5dbffb92961c044f17b42e4426050597dc0fa1d82071333fd6cfdd355376c71614436f36b0c140220c916728ce0fe2191432d94d65b432e8e873605cd3187b2f27f696ff9b354dc3d52f9d53e01af92bdbe8996bee6b162383bd34ceb2dffe1cfca019f53dc052badc5679ce456f725599f8893ba3de06780f730193d6147865fd099f207fac779088cda2a0e356761fb62b50c46d542b70f45e71b429fe109391f8d189493fe6cc405ec1d1a4162d129a49970f3217ac929a462a3892e7ef2d1f36573784c3c4f66ecf7e6a6ff9beb5ad1a0522dc6db26769f3d427f8153dbb118cd832167e3c9679e980712b45519058654307519f6576ca2c188a45d121c6cebffc83e9b97335c97470f1c243102c01f4f8c67bf4ec4723ba9e686063c3d5be9a6c31e4bb945ac638f5ef1b3b2110128dcd6540b67062dd660dc931134c7049e4d044eecec58ed8fdb8751e75acc4f1f96aee8a2b185061f60db5a029e41fd764cfc5f1382e58678a618ab338dad108007668409d0d981632483595ecb26bd0e312bbd442f940dba89737c2ced2bebd699adc4a5276c263e46350f8a5dfdb9c29412e7f344bce9c1f0283337dbd137afe7d5190937c56b2d2090fb19d92f8a3fe0326d9564f8b12b74b76ee8ec359a685c8cff9a747dd6ac5e078a819f4484e2a00acccef2afea5371a18dc490b17a8c7225f6fd8fedff2859096c6642d550374e1c7404907b0be691672e3f5bed5ea8c3407da6ccae2b4dac26ef1c564a72ba64e801baa0c27c313e88becdb031cd39ba5d120acd270178c1e0a1283c2c42f86eede465b61ed1efe386be0440372cbbe1ec52ae03f1083624b7112e76e3675dd6ae9a9a42f8a35f2ad1ba576e6623abb47eae050384b6026f2abd7399085677269a92ccc9e8472b7efa225bad371885bc7482a43e6a7179ebac14bc152376c0f9427b81dd5653c14a7084657f2291e6647e7f10370ae0e934cba55c6dad6eb7a936a33ddfdb4fad27d56f2976c1162a46ed01bd6ffe8aecc4f9edc9250ea4e7c0d7a87553dfa16b9189310c069b1bddde50a9205bbdc5f136c75ca6bddf9fcddab609acdbebef79121c7881b109298d8539d3cd7cb128a2e4b48069aa98d5d651423568da78805223ffa42f08a3b595e61920396581295e6931e7866db2dd9dcf0cba1dc21e1a8341b352587ff346a37b7f0ce888965ea03ec0008199b62d809e9616504544f488e5c7f MD = 022aa46f368252ce0a7b2431d55ac4767455865dfe65d2e372f4e82691a14cb2 Len = 38528 Msg = 2c97ef4f65319444199df671deaee966d19628052359f791d5810608bf1499b3d7c3e6fbb064be7e41a27062e8f3ebe9afcb2246cd10b5b070cdcdb4b92a47cf089c163c7b59e20bb10ff573d4d55869d6623971fa7c90b597b40354195106fc488a46bbcdf84812f14a4d4ca93b7a0dd0c1352eb387d2c8d29e6f8fe5701c621ef54020ae2938bc8abd40946f0c97fe2352de24ff18c113aaf3da0e276ed2281245ca1226d4f93103ce96f32e32f8645a7bfcfce618a7bba61b0c79e6357077ace2ad393ee1d498e4e71613ef94e566faa6565e706dcaeb4f7fcd772bac3e767534b13efd381119b66f8a99b91aa52c8d3ab5f0a60073c92b85e5b0fdbb844ef4a49dc96cc1f8de00ceb83095ac82df9b9fe15d8fb9e97dc4961bcd644a8926b1983b819165d00c4a6b687e8a32c2a7aa3ca24b33807630a21b3876684196273579510f760ae3ce1db0642ba094aeab447bc0639b3e600a4b7a05521288f37807b0a81a2399774aff0473e0dfba8e14f0c3024cced9f032491d470a6908e843b0a3084b9efbd5a87bcf5c45508daa09377d31aed43b6ed1246ac94575a7bdadb6bc384af1164511167ae801faf349b39f0f1533b64a220e62cb52ac3f4eb9e0a36202be24d40ead5a6bdfbde6d5b53ab2e276817bf053128da7a9e7cee62504fefc2c503d1c7aa3ce0b09201a1c34c5f85e1c402b144b042c65979d2b55494050f47fa746d5cf1cfac22dd3a0ae0f7cf8ebcf19cf9e500dc86fe4765c856dbd20b1c36c46e9563f67f9157d80758e883af256b36e75ab55e82c581c6b5cd9a3f69bc046463f57359c1687c7c058f81146d97ab81083a4031404ba345fc4d4195a1a3dde4dbf1a2521834c586a3e973ea50a03cdbdaf8240d55fd46941a4a847d59604db6351e6387fa62cda8511b138deebb99c7ee18f33b1a56c6018e39b56ee77dbe690dd05953de9eef21ab88f2779e663cd5a011105323e4bc4ec6bf66e2e258ba7dd4bbd66e3b35c4a301b7932fe62cb085af851dde093393bc62301b61c09dcc5518357d0fa6b3c8acf22b681f6c7b7f485ac97e4420afe6dadf30357408995e9f56e1afd097b575affb5903de97cf039e3062b41e00c6104a9c34679220e80bacff25015984a7560c9bc4d8e5deb3e807cee541d42022ba5c27b10424b0163e1eaf83f3f2f405e47341f369bdc7b6871594d5ba0f15224fa0104aadd42c807054b6931a457c5d9b549c6938ded9438b3810988f1746614ab6d445c708fcd34cffc2b6c6c9741af530f99ac8b199e74effc0c233953a4c3600e246d24bb76b1e6042839be781ca8c88e81c8bee601e5ccd33c749f1776f9c0ed8c27204d2d48f46b46dfc281be8cbcce64314ede2653f30d83c34c47437d731165d08dcd59bf9e396fa8a23a9023d9d82c2d628973860bb2c857686b7218228395b192c361df8e778ada832bf835c4b3bf05226e5145bdcbf3791a0b6d927549061258b8af706c2d7fbe90dd5f8928670701b7152959b15eeb718ab09bb3136d9e3b0634aa3adf61369ceed72ee8abfdea684906618b8e769a87e1e16442a5f64773c5bdba04901d96bcc8a1cb1af57c5284ffca63a1fc18e70347273009d2ede803bddd47982768896544c4a0e7afec269b02e89563a54eba2ce30967ce43596933151bb9bc4b4bf7e08ac7131781554ef67ae8619b2e1ffb4bde0f715a9f42b14bf6ff7939a4ccc676c3328e7112c0b1dd8e532e0f429492a85fc1b7758fb1aa938712edd7dbf6df6c178e78be0b34399766af638887b3688b8fa89fe6bbac3b53f1db7e5d98ce2a0dad6139c613bacd6e2b876acea586633c964b9277ca3e4cd25be39495825e8fa0ae363951d35955a80560aaa945156c029b32f9ee656cc659eeb0984542adf76c4192df27f319ba8e1bc48be10f666c27c6e63a1433408f30d1ccf03680c348ba8fff950f1a02e268963a753daa8449f140eebfb1ddc1909f2dbf0630e3a96cd2c004c3d3f01db67e9d4bd087bf74eda931d2ee8d0af7b1ee2a0f41fb136649fcfb2acf391f711e17597d0485f53f3e96c11b316f63ebdb64ef46085eb902c98068f7220a4c06037df25b7900f5ee26021650ef218fa4f44aa5ebc5227d86d3a530f5240d21e54bf68f6a98bf66898c335bf98f69372ae5e87387df0f06f94eb57bac3d0c4615e0cb5834c78cf1165772b69f7b100386978682a1beedfd6324f670a3d6cd639ea84476406f2d3e9f71074fc91ade9abff16cfac1ca8409cc3cb13862551a1f898da81116f96bf42bc13a4fffd49aa5dddae202706b9cd33d7e2dfa7124b922dd7641503fcb0ebbc32f53dec9110ecbe93c2fc23409fc02bdd2b4df59a97215a24a555c424fde3d6ea39923b03900b5eafe9c63980c6d3f55208c0fa14e0fa0e1f32d5da7eca31f340555473bb4390be808710d21dcb7320c50feb1d17a566aa158117af709240c1d3dd071f3eb8174ec42f6e759e1a282ea4a52ee7194111cea6148dbb9102aaa32344fca5e449f98fc94721ac783f6d8f7f6d0ed0a06065dc4f61ca975687da17ad01d7a06285d2023e62fcdf32b7adb3c3dc0d72337fed638ffd30cb379e59afdfa81a8730081b466207329663ff734c00569d3458fc02f4d64b62bfcab2a3dc49bc27d2b32d4fbcf2a8756a729358a8b38140af776160f0c0d0d2fd7661331d6992920b8281e9e65ecb37b3e4ffc86a6bc09a3c154c61e7be3203fcd12691f3cdefeb9a2482744304e3ec1b41b14d0187b90c72b919905a5cc36846517f4aefc5089726ffcb6963939724f90f3440fe95bf19ebe95576c8fb1992627dd7c8720d91171a9ab953c8793954e5a4155eb2246734f01c9c8fa437b8f4c9bcdc951af60e0ded7bc8add2246f0e59b6c100eca235f037d93b358c810611e4a4da2b5b2cc3ce282995e211338cb3dd9dc3a1de9dafde1b85ce22e265a57c5bbc6d15b30076ea531a9d9b261536e7d9ff99ec3885295123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea572fc0750c52d10f15f6ebf50966f7f8c714742f5de877e928d8efe53db92ec60854a5c133bdef99c9e012cd9c5d0110e49665f928059cfc62d402995ea770d363bd03e415371f2f9ab7b376fc2dbe4dceee12ce1307588f5bd054d12fc46afaaf8f61467a6968b9cea35658f17f3698cf450317e493b08a5cf56bf679b5232436f5484f2afad21faecb84db42fb72da2dc3c13a6454aed5ad6ad1710425a3373e153f67ec9365498258c467b94879f9318fd3a15bef595896580ea898baf31d1017cef689dc2a1f92719f641c0f53df23d2c1b2910fb9fc5fe7a805fd1c1abcf4247d64ca7c288a253f9c3a34f709724bb314d7cd5ad7a74f3e29effaf420fe3164d519741c677085ea4351c9a9a29cf05b5377d978ba42af8619ce59ea0ec911fe5d7d5263f0bbf8991c11a3cc26435cf106f97b126ab6c7e6fe09e0a5eb07da1a9df82bfaca51c774b0e389099e51d59eb5c77cd0f0e9df87620a58cebf9fd5e21ef3c688fd1c3aa4862d440811ada48ae948a35953c53f91cc38880c93794a7c67d4ecb69202985126589d70873f11dc29e4ba569b312f2bc5fb3a086e7d81100105652c90ed2ba219cd59ea08ef63bdfe03876ed114f67dd4bb346a5893c1c772ecf991ffc439c0e6f3431d9da5e454ef0dd44afc58ddb081e03fd959a354c844f3708ee86f0bd3153122b24d49daca846a679124e42cec54d223fd7a95803cfe8191ca52d5e9022ff1bd5021c38e46458308ec51a02b58d6faa87fc2518e4b29fd25ee45e01a75bb9adda01ffb48f1bbbe81038c74211d8ebe96073abfc61c4cd1f4a1c977e85541944a4951da50f26d84997ddc4858620487b43ce8c86fd8ef64c68ce78299ca4946ccf4bf46ed72e33e17034a041650c1becbc7d652d2a69b1e6356a6ea76fb5c1a2b4970286899a652c43cdd90a40f4cc9a34f0c4638afd66793a80f95c71101772eef6c69098e3d2a68d19dd44ac62d12047d908de71b2ba71d2a286cd433c1c59f8fbbef187a302ccb6992b94f9eedffb6f96c0d28111f46ca83fb57e48a236d44d066a4dd8408c2b4adc525fdbe13fa806aa8b042b93cac625c903f413eafd5e55b736fa0d54c53ec443d019a4e276a2c794a5d7f3c0942ad5ced0a3176ed664cd7ed37a89484463cd802366f78b2b780cd5cfc25c20e6e722c1ca2fd5a668840edd9e63eea39056a0e1dabc4623b48450fe5747d72d4997b7325eded13a1a488454163aafff1f73e909547e1344a8742e6eeafcf75e22c8eda0ed548c92620ed862c9634fa3784820672f40d1767db41fb7e9463f3c08d7409e14158a37e663759a36724049014fc17bd9991331bac08f59d0b8013f726f5a7a61863ca30dc2e65adbec144860f756c7d1db5afed63617d53fc6ffd0e5ed85c6344b266c4ec9953528354e3a0deb6adba6ac1b36666123ba94f79da8d9ce7d222ac8d9ec3fd42ca9a9e250867e784817c67fd690c1ee3d6a6ece4d2fd4ae8aeea383b9ab476ef738ef77cdc6193aa90ccfcb1f76af39ef753bcf80ce5cfa49bc4d006831fc169f63577a187184aee83b1112485054e0945b6a5ffb1cd93e33fb65c34818c4578fa9804db3014751a02348e9f3c6795ee69da903fe83dfe6c42cbc40ebb846ae327bd8774ffdb7af4b45c5b6a431732130ac46601dabe78094d08f0dc5a8e987426aee9b21df7c345423161cdc39d8b40d17e0d8daed769800877c9e6853337f19f7310deb2f0b6d453bb8610e4820a3f650f6f2b8d11399a1a1f357365faaf233912e63fe54cbd6b9003b37acd4d15d7707f73239ff3501f2c081dcd226b69d29d95521fdf953fd0a110d154a78616cf97d600bc0b0516d7e53b6a3ae30ecbc673033bc4c852a4cc2deac6e699b574f0841d0040facff48aeebf0203d06c3ec662658b77c70c5327dc9a7c78cc639702df5c5af593da50ffee9ccf70120c2b9c12c22980044ab6a95827d9526817e7cd4f99f624ffad93ff8edbb8c8d176f80e2c22fd27a894341a4699c7bc945acc187ddebc1465d026527683a45534330fe5588eefb4db72354151f92dfd78b3aead1132940feecc6fc04d9c7d5d64cad6e83d0ce76ec46d21e71f4ef25e3daaf552b29e665bc228d811bb2f2a2989c3b7e184a7cd9f8c0c61d458a000270bc709d008281a41086cc80c6a429301caa71896d464898d5ad85bd0a5f73ea0099352eebcdb9809e921a77affe0a02c4ffd63d1d64d0380575878a3ae5c94106095397676bcc8fb8ccedc23250e39f4414dff58326924c2ab1420141ad6eac13755242eddd5925f1afbd1cf82d6469fc82054f38fc0d29a7d94bced916e28f9b75c7ce09a2ddf7cba30ed46be3faf760bfcca6c955bf64ff561b2f4bd2b37010831aa5255cc959b95f6984f82515cc1336cc98aed41792a3d026cf24315fd21515d144db5bb9e04d2d43ab4761535c867f5b9143f7a41737aff50aece3463a0bb6624986201e0ff9a533b3b419223d2d02102d3320f3872d7e1c8f2049151c86dd641fd05a645d415f904ad8bd10c2995770c8f6f07456e7a2e3b848d33b0df8f34d24246b3b4ca6a51fbd1fed8da13e07f400f9e6a4fb18b71112d1222662e4b094130cc2f142ac2e0897140b173d9d6c2041d66414081332fb1b53b675dfdc7dcf58f40224f3c44301653f964c1c3a1c7c17f6f93ff2799f285e4af097b942b35562749944c4819c80b40d2f7aa186916e0fe626874ebe741f4821710aa3aa09cccbf908ef3966830ce00727418225538c762e7c8871442a566561a85d1384e9abf21bc172c6e5af1c95b83e2f2278eb4e073a5bc20ecd4a54329616fd8d65cb697137638df1717926319aa4a20703c1292f9454b27b9c5c9f4c393d6a65cf279bc5e66f8f4dac69b030191b3894585db44bb6e7e84c43d99dfec59c225123a6a97ca335f53ff8f9413dde02517ed94966082c95c1f55639e6d6c5b3c3c4059118e1e8675e5ce9b06fa733fa9b1b28fcb4d16feede0b35f5f060a404bd32d7af60a240643908e1279208b54453fda9f03733fb439b0285a64138fb1f8d322c3a274a25cd03d891c73edefca03aaaeebc43ac5934975fa7c36fac4554a22675c9c32612f24d505df7ec96647ebd8769c990a6f45241972ec5c256ed549a9446e6cae2928483e4b86211cb77304b27ad9074b066fd282d8d35efa58d8fd5001219b4ec1ef4362a337e54eabf8562001cb986553bc5c9a7458c5e349076f00e59cb07cf32b1d27541a50c70a7be90b5599d3c01bd1c9478da41847080aa69f3908339f8584df77a859ecef9ca7c659bc6c40c4295921736ddedf8e5e88aa16458cac1e40a49039e519412f2821f4f47f6c68da44fa6c055a2fa31f1329844e5151a463ec3038555485d5ed78947bc2e6c0d268335cb3e59dbfea64ef963b2ea57fa3d551d3dfb23dc2339252a664ad389106d8bf28fefb7eb53fc4ba77d79d893d2fdc36338e3ae8fbe0877fffb69cbf068d90b006532f443927a73b73618544b3d2e065f84dd49c566533c7487976c148eeface9dbc6939752c753b33e0cd1f0a1349a4cb2268a3fb4bfdf129b525877eb17ce0964091a38ed597825f5c5d626a7a80bc5417df43131a4fc749739059d1 MD = 5d1f1f7c14e34f79468bb5de195a60f3b422c4e48757facf1df01d1b022e6764 Len = 39320 Msg = 629b37b9a056e74959346e8c40aeb4e2073e97bf2117d2ffcd13237a50edadd981b09ba88b6f06acef371876c8427238536dccd8aeecdb43e03d78041a5afe153d33f4f49b5becfa0202aae9f72389c43ffe1be3a4c91046f5a3592a4fc98dda9b0c8bc8588361dc9b7d6c0c53b9c12dd2dacc08891537b1132d0d1476a120d1a524a84a494d2cf9c090a608666de21b14e72771e738192b43c3deeb174a80a1626192a2f62217fb7c239f04b8a5b3380e0e7343459a7e5d8c4d12d7ba2c75f3daac93f9e76be887d41ea029cfcafd29c738faa92ca32eeef6b3f2ffe8afc66f16eef177a58e6848d269f19e35458899474b02c923bbf08789ddc68c283b3dbc1d0df543b7f55fe37decda8c727c1c2e9731d4cbb24a8dd04eb3d6a50338a083f7f3e786a5069503dd90a31b0cd98190bed0b8d861b8ce704c1e6973000eb86bad860f67f82bd14efb3b93728dc37e68c412f518b96d78108b04c91ea7254d1d46b0b40f37cbdd6cded6f3ba7da2dd5eb2ddd5b241d15657144f3ccd80e52740ca5720a5ea4d7f068e4a0b1a62dd64198f1b9ece814c2feeeee50ba814b70d7d42659952991b80c4147d23bbc6dedc4263b399960247ca7c21b07ed8ea01c87cb5c1683ecd9ca74d775983c5300c0c80378d0e304b28f0aab696dc858a2c21e42b53d5900d38be4abfc5735f29cfbe7c129145c4e5596920b4816fd67da1dd5eac032771e2578b62f5a83ab1388fb8defca7857b5640fd8523587df44ac7c79141b9a808d361d83e20ec21e4e5b4c34dfdb7187c284774820c034f077905a626f15d9e7e68be6b8548787020b8a6a7711ea944f0e2d595be76692d3693c541c4c5d752fa29d70ce075346f8c3ace2cf3666552ff0d5129e269745ea91f6e6114c30f0ca59f1285f7b0086551f2921a7bded38ad03025f895ed0b2c89a568cebdf5ee14a651d89d7100dc9c96685b38b08cdc338cd3b8ca800b16ddfead1a5068635ab126c7921bf76e985a8425924f3b7a66965a7f72674aca7eba2fc0eeafbd143c2c4d8aa6c8300124e843b09d27c3b05afc63babb979c33290b45654bb263107dcd42217e6cc5c1688efa91e688f134a1abcf0ffb211e4c001867259923035f03dc2e1480cf5db64d93d251d33a6d1021ecc5039ace771feb28be8741c8440ab8a138ec16b8a1e9b941f277ce04de4cc4066d20006650b4d3857213a969cf1783648930a7f0386195de828b3eb0edee7143f0ed96b150119e75aa513ad04b914b6c48689a40cc26cab3ac168b04410010e976f2c276204036418eca5cc4617dfa029e1d596e02413f08969f1cc98389884126b8ed7f674981314705780cb9e5776eb3d54b4284b9db2568ae5bc65a92c39329c68092ce32698cfd8af471fad0aaf8ae1bd886fa9688514bcbafc56f22a827a7a4e178fd05d59cd7e23abbcd477be8b87468000be12dd5677f808c69411f44c7db7af99bcaaca7fe94b0b2d951d285f86a637960a1b1f9e35137e5f1f71033b1f2b2dc5087d8f69a28c01dc7f69718978432baa1defe05e7ca3a96af4d633d8e71f0ebc64640d1d227d1c63e3eb2e9bc4b3b8875a0fb419d70f2674a4a00a886e19eeca20ecc7fce184a73e7320b409045e7ae84f090f52bcec7226bf7d0bcc0c923a88fe8644ab78395ed6ad98b653bfc9ef277d5a568b969228db95ab9c365b1e7e733daf078b5f019fc6e3c189fe4f8c91ef65822e370cb6972dd7ea4039c21527036ef5852efe83e679b619b38b3bfcef8a880efae777b06977e687ac58ea2cc0d412c84208ef26cf89a52fd76d1db17493655f511f7015fc44522215162bbbd84fc9b5d2ab9970b75131724a266d40ad847df1a5418e6dec3d9b383ef41f58d9e0e43c9b7995e83a7adb6fa039930116f842747be01b1e95be42387e753d7a423202cb11156cf3d56113966e3937993d495346598dbeaea530b7a1480bfe96adbd95ffe7e17729f4ae7a74f887c36f8d0210e5a2acd194874f8c11404aeb3488ee2e3964704d0124ad6099f3b7bf0a72bd0be10bc00c76b8653006eb947bea403e2c063b44670ff2086663d44b82e0aad4c4b6d969c7bbb51c33d0ae8b391e70382ff4c0c05dacc92a0c611eb5c78881e3abd5b00c8bea09cf182d0d819b47a566aa738996897e369cc3203788f568945451dc141ac17823185d6a8d3a2b0c3c441c011a1982eaa6cb1b0fb32785175eb137286a2710ec9d626427a1f760c2c15af53be6dbd278b65f84be16340f0b5d84cc4946b3f2bdd547ccc2e05bc501c105e662745fe0bec1a48089d510ebcafd4991bd2e43df72672307faccd9d05fb7ef3043470836137554af117440b3ccca7a280285494f90dfaea60dcbf40b230271932cd3875b1d3dca60d38865ff874180efa7e056bb9f8b25179a623cedf25d376fadae3fc8428770364e65e317810f18592bc3debc050640ed1f3406e14414ab26343ba3f609ef009ff0a13a94506f8b14fcb453c957ed6c970a95f49daec537675f00567d09d0e61e58deef1e6c0f63739916585c1e8d1295fb2c886b88eb86a39c90c9b598d98b31e55372ee3a4b2c258f7e4efcaf81cd6a5f4c34e378f3f35b6b7160485d657a6b34c368bc51cf6f8b5e50ca13a1581794a5998c9dd58b17ff5a06dc9dbe013e3ab59322e128f8881574423c398a6c6ba57c88e1e354fd5f2fc6e5714e31493120e63753f5565310646fa727f6d15b440d328ee76c4dd7534d5071d0a26d8a1dae55445e71305b92f8bf141fb40c913b4c66300f8146a57ed885507d52b9503e33713eb4dd6d9e8a32d0fd85f992aabbd38600ccdac5f44c61b3e5c9d7ab482d60c88af9b2548860b343e7ed400a0430432075a1c1422046698ac66899c9be65b6c9bd8f689ba5a0ea9657c82fe93a530bb40320ed51d5f7706866bc218b4f7196034b08889972d55936c1a901a6b97eadcf3dbcb76b71d9e6eb4b47076667db9ef3b7d79ad48c787fa3aa026dd90e2da9c089e7a7f570585d71d89b93f183fe2229888f17d33f04de6b9566ece6b4ea70367c3437867e1d449ab31c8fa34063d0033191782c1704f60d0848d7562a2fa19f9924fea4e7733cd45f6c32f219a7291f47713435a0e346f6771ae5adea87ae7a452c65d748f4869d31ed36747c328ddc4ec0e486793a51c6766f7064826d074514dd05741f3be273ef21f280e4907ed89be301a4ec8496eb6ab900006e5a3c8e9c993621d6a3b0f6cbad0fddef3b9c82d36a0407972c96d3d88a2d082ad9cec520f3a0570bb672846be0d6b1f8ae376969c87424e5ccc21e44555ff224563e77667ebc9a2afec7ab445fffc39d73000ae380ca9374dfb939429d01450779fc13b18ce341b0e6f0d9f99cd37949f456d5b5158fc9b0cfeca337d3c977309f8838b6c0dd043a09beaed00a0a498adcdc5873192c3e2627cceaa89c010f2c418344da9cd25832c151888c3a0ccaec86e10191ee38773171da8e29585083770a4dc691839b9417c889f562af4363cb7d057f96173ceb8f38a5fc2e9b307a9d54783c6017617e6569a88417cc56aac439ca20f42692318be6bfb31cd7193b0baa7324eacafc4db83f3da30033af164347af74308ed0bfb3f67851988e736b4e96cf1e8600a4987cb3c9d0a057c52ce5211607dfd2910c93f270461633e771d283fc67c67af2f51f51dd9b9cbb21550640ae4a56742b9eb865380f1a69ede5440c8bbf307c7fea3cb3d97249d05c354340c8ba38f638ec7dc9201b1992ef4bff9aed733897a3ce41345df33c29de34188c05e5fbdb218c6098c9089831740c71a99222535ef737b96dcb7ce84a1fd7f29ce64c13957de50d4ea3461ae804bd46d33a5b1524f2ad21cab29dd293a9a76dfdda6b24a7b69ce0654f62160929b4fb82167c02ac1ea506d5a3c48fa8f418e71952a1839463fa66771dcb1e275ba9ec40e7038036e3a5d5090f8f73fc97a2fa9a0fadd4fdfea42bfeaf1f97c50302b59a0c903267ea2618ef566d3400fcdc14da31ee7d16ff208d6663ae1754b835d3e7f7907db18aac4ef328dc2448ac3ac26499c200a1ddd62748ec15217903d9b3d54882e6964dbef3bef76ad9561e358fc377e6e411235b7600a8d32a844e54f1cc7ff5e1a8bbc483ad3277d79bdb52d9718ccbbbd75816f6381a66b719204e0a47fe58134b5d638b487aa1839c6c294be928ceec76f4af2459c15e3baa021b69d25427e0009af2870b307681da391f33b4dc8efa72817a7ce02e184cb96c439cf601f3dc6b0d17e37fe44546c7dabb3d4f287a6a5c770f8c55b1234eb9d76d102d983a6ced2c4a4d1106bc3707b963d5229d2fb0975dd4cf451b1dd63ddbde6fd3876a15f950e000692839f6fc6dcf87c99b0d61a59e70c218ac4667c7d24e089240016c22439fc9e2c95cfb285044b1ceb291f219c159e15ae56b77ba530276e452aed40a5cdfe6085a83b81e197a0f8c745be6665f06b98666cb8ab7f6b237444fb0e1f4150701546c4cb24021c5edad30d9b31ddffdb725a105153305c3c62c97c61a71f4cb98516f167e20f1bec88ba889eca2bca576a31496abae38bdb027bb3cf22684841789e38f704311db4ca22beb07879d945499320eb29be81661a03aa3ed643cd70b686a063d28fa91d6ab4b8b785ecb50ed72a9bbce8e9c547730869970cd962ae067532939452478f2e177d9c37aee51bdc9bc5c53f8ddfe4d533f6c30c518f633213f56f92a17f72e0f31548d7e7f1d32091a3ef76d258a7082c5ba91ed4dcf70009f1e014a5da2f46f289a2acbe629d6ab23f20d4dfb7f7d39aa0308a8ad2d239ff2ecc6185df2c29bae091005cbee384a6a041a2dd843bff26cb42979af85ca59cb51dc26a17d250f322ff19e9900c3416ce3b29f348dd5477e6c68f2dd6fe0b898db97f7c0889854658d3408c5d8043aad2f4ae4a89449a36f8a3b86af51e346ebe8ae0e23cba8e5a89f5bd6dafa67909b3567c09d2d8990a0ac35b7adc26e9f151762cc53bcb34d9bd4cd8b50de89ddc7948da59a801199c230dbf84137cf0bd4d67ad4c8b263f68fcc2d98c00ad79ca2cb10f629527e1934b692eb1238a1178ba44a9a0b63177b14f3e07190f5ed37cd57b644b20b2ba988abfee2993b616cba0f569e84456a45cbda9ac85c26174997c8d213dd20a6c53e9f74813eb6ac55d0861354dbbfc8d114fe90ef7a11f24ca27cf8e5f3197bf6b6ffa8497b40de8d7f97255f7a58afb770ce775983500aab7e029f2dac7c27b8925aeeadf750745e07c0f100d896ab636fc8b2b90056dd007ae8397d51cf1675411fcc210b6bfa5219820afb8f00386f727be770699cc5c639ac5c379b68d4c753dcc5355009fcf41558e7a1f61bd33629666a0227a861772aad7bfee1ffff293b107e6d4d90e8de9bb3fb96b6400841e506cef0e2f04c9dde8a1d35bdfae21577493c3b5cc74a5c1d31cb4c3813442d45db9acef40ad3a4b5c0c46e87c01a1688d5a32215e3ae070a40db35041c1352bc6341ff036e831650dfe62bf8062397007437b4019c6069f36fbfd392b1025cc92c48f36981f78d303606d057338b314e735e5398481dff592ccdba7c887da5ec95346eceeb9d53c461bb0e5dbead5fe371ab93527d3321bbf6a95c29e8f1b8a74c88a38c11e1148df15738542e268d6ffd9405b8b25c9b8c5bb73b13791b2f8990aa44297b5f4a0d538fe0d2f873343455abfd437dd6a75ada9bc9d1bf3654f4303dc33fbe845ec306b98a62b4100ee138581c7b365defa7e1bbaadd01ffd37779a7933721eced3f8958a78bd78957f7042cd5d8823edee40f8b30ae07b425a3fb7c56986c055fe36a01daa6d94bb9d6579eabd3d815efafc2af0dbd371fb5da24206febe34a315f2739664c3fd3af0f81221115ae5fbc5b998b9492f67f2eba924851aa2e380bf32f640d0481cda2133f5ba7e68b98af87f2a567c7ec7edaa5a438ae3bb35b3a400116213835763d81e0afd2eee64d43a56c80e9b47f8b542bf885c849093066d63ac4358fc179cbcc03a3149744ea134475a2acf1362125ce0db4523aa633fc264af2cc53cc54e76216ba0f682dfb98d59c8f23f696dcba0c3258be98f0e274a09026582cac741ae4986905ea17fe3ee95faae14d181aab5724c77fdc9fd86ae5c8e36b82e873d0b41744aa95896e9ff01d9a675d3067544f53a5187e09724966539e78ff16b0a35101b16fe308c9167a84b228bf864f5f452d561b15a43c8a82becbf2e9add6fd5be653b85b0c9a4cf8f39697dc703f26e9307eea1c16b3c8fb69007beb14436935439036860b5e9dec08cc474c94c3459c0b7427f9c7646f10e0b0866bf082516d97eb4ccc8b92a3d422a7b9884a5825edfcda37474ccaf773c47074f4b900507551e97db713b2d931dfdd6108277a525fa305aa8d0d53ec8472a4fa0dd469d0dd000f4bde2a5bb8959ec1c054b2b665518caaf4238f8bd8d379e2782fd91b7d1530c139aa35d9cc7ffde979e65278b964282e96a34a0f26d148ad61d34d919fae52a3b993dcd98f417bd8d045ad5dc927f40524a4d32a711e7d5a59809878c318f42b6e2375b77b8a770475eb29c23eed7ec30070a17a220b869dc1c0501d81e583cca9e197100bdb9df0dd5f3e32655526fccccf4b7ac438d2dc3d0aeb0c5684800c0f56c76fca854f22791a714ae6df9af6ebf917a8c227009a1dd8ffc1bb86777e00eb6d234248191dcb9559683ded3955e086cc90c6468e5c06a2d4ea1b5be87711282ec6dd747a4757686d16d51e809e3d00a0af2b17da966a0120c20085419bd28552e7269ae133aefc12d346e41f4463ff5a707b3b83edca7c5a0615831160a79b9ff0a83bec6734d8e129fdce53cd07cb406130f208a6aa6ce70294e5e64a12d35c7fccd80a568b775e87844dccbc6b0cf91de70be7657c5b6e64392e2edca MD = 6025dc79681355ec9f3886a74b39dc4d1d2e6c77180080e9d296e5ca7742d04e Len = 40112 Msg = 2c9bdc9d3e5cf09addfcd9c3f24f6bb182d76c1d2f3b3ef502f4bdae674a6bdd797fcb01804a0aa3b887e4a2552cc6c8c37f30a032865e8c52bf27125b1225775104168f862d82d360ec9fb45c59712f537b35a2fdbc00deb399a47d799ed3763b9287ee57efa0515c95cfa211beb40fba3543c996c36c12aceafb98c8d6bd01c091e4c7fb76ac4634e83f137c44d6907e1322bd0785ea51c61bf50a50a32a416669f6c17baceed9714fb6b0a4d121d9297f992758e8c2c387925a7b19eb645db8828585de77ae339a31fb21914edb1343e072af8fd63b8f79b8f2952c98b17e3b4559ba2cc1337b37f5d70d4ba44d65529e73fcb6369ede24f584fd90905acc791839096e71c6dad105121cdbb9bff8e02165b7d4ef33d70fb2da5e4dbda66ef964ee1aab6faf78efc874f7487779f374d00f87f2eb42a3c255ba5e6c05df8d43924194eba3367c19a6c5469ac5c27f97153b1517111369c548eda5f4524b50e008f72036f5a30fd707ccb0d98ae4c4cf57af094b49ee52a1f13bdced8b34e05730db65954d3d58b25352de0eb025e9a7ff340a967b1a86ddba6bab5f98e0643071b40c0f934d8031f21f78411ece17a47392c0018fe02c010a47b953619805f43249bcadaf1baedd4dfb2578bc2675501c91d4936e886c954895afd0cda3eb2add631e7689ef0b3ccaae8dbd72772c3262f9ee55fe5a6f22de1e34dfc64b3d5ad9cad9720911bfd8d2ff5917280763d2ae91b54d289d5d3033aaf18734d6240c8e4696a918c8f139ceb7318fc62043b96622d285d59b5e45af018ed0fd8dc7c9649ffd249c5ec9e5249ebc2b3408f46ef474ec05eb9a98ebbaeab2c20ab84f18c39cb5ea7e1970663e7ca3f55a079d79be4facd354e336a9bc2e0566439fe38213076703a7420e4482198df5216766632e7bbaf9f6be5e071d9531c39089ac8ebca6ba78fe20ca055a3d23326f6e78b3aabfbd7fbb72398e45e7dbe1dac0d1c4264257506afdcd332daf0db42e66fbf19ce55e6b8949eec59decadc9078a7bacb9a2e593d51f3f556238f283449516a66bb344c74a89a5358b6c4f820130d2cfde900d4926cf47f463a07ba89b44f2597ff2179be57b8864782e6914aef9fdb4fbd2777b45550d9797af4f2a19bab792406981ed4267bcdccdfba288f82f25e37a31ca3119f9bac6662c1711a8418cd916e228c749956c25f09ba2e5c61871e5c175af718c03760a38e17a652f1f99b76923b430e24cbec54bd61233fffe0a413a66cd4585ba68e97594212f959d07b3a1f6ce31f5d6da4644749a7b8d27177f4bcbcdb4ed68b9ed850eb377c403fe5626211ed06a79e930453ce1c457dcc1285e6e56c6aa53909ed117d943a399a526606c4b17297e1309b5f79016456430c3da151184a5c31683bf773b9d1aa625adb8a1fe0e1a2d7f5bfc6d4e793f098bd82789a5f5c6027324b8f5808c1174a6739486debc26cd56ad8266c4f62d11fbefad92bb22f657ce09255a501970494fff5de5942933a8bf88aeaa9a94f7c5a791d3f7fb111b094fbb6c6e554a1f6e48d97c84c75d2a04e373ea00775c866db84503820ccc1e6120c1f7f93429072bba89572b2061f42aeaf69e320354c0515594a5f9975be8a766a32cc398be0ec7cd9758a4463c7762fb993006e7868eb8a7051f2543c460234cea759327101d8ca88ce6b6e3f69df33ee50945cbfad9ecd520daceb9116d1cf71d393389271dc074f068289c984d27dc6191b756b78733086d3ebca14af9dc92c4df69670bf4ac584948c31b286f44fd96302331c581d66875b4b6a275eba94367d1fe69c58c987d21ed4f08b1ea93c80a4f52042cb01c1cbfa286649c2bcc328f76ba365bcbcc0affbf940a38a85c6647540d76f4fb4f4dd371f290c6a08d89c3366477d89b8f286c2659cac790e7ffd5a91a2f2649b5223a8ac3cefc34336d8c79c6d341e32bffef8a68f0658a7bba3ab441d8ca8498c47b53c0c545ce080871a7a6f3a08be6b6105387231b7e61bf00df4c19e6933e5a1e36b31ea9565282fa28cd7efc7a097657e97f0bf054e237ae910199845ef00dac9a628030b55a03af65031d5e9adb664db51751ecf4444acd312a01abcdf505ace79794e3d168b219c40f78cdd2a6af791d199d1747cf1fe4298df864c89769a6841802c993c3b7bfaebb36510ab078638a4b967a33cddf7be0f327b6371c6122dbad71eae3b53b298ccd00f22a43ea946577e51ca184b11bbe2335a902cd17a95320894faa8466e0c40e7db91ba52d93146332057a3dbe4a2be7cb4511f2b0c25438f3ffce795f6bc04656adc31e68e801d8243ea4402d938f0591934cd357f646bc570239dc4f52e63d32d70bf8c31c929d63ce09d5277b52462e9a9cb732cc92755c61d1f55d1ea0baba3ddb7967b6317c98bd9044d48cdc724b62e7e869cc9e2bab23800bb256558796e91ceb7c3e453b6b1420d45b4d96518ff417ac257ed3a5ec502d6875826c6a6de3b494293d36a383daa3cfe546e6aaa357124c8e6b99adc6f1c052cf2b4f2ce7318dbd973a6b7c8917007b990035472e93c20fcb1a5909e10d2012e8d86595addd8eadeebd4e8e24d31f21a002eceed9b10d3f05137982e6ac37f0e711166c67ef9eae554e46a0fd17e80821d471684cb8dd2263df63e07dd6ec33f45eca7bbd6da706f476bb7cbbea437a45ff2e7d2eb019020e057deb4d9427253948e988556190fef4bc15e8075518bd340a89f428a2a9252d0d316bffedd00cdb56db5cdad241de7da9bdad895f4f1a157dec97e19575d4e980e6273aead031051109bff2c9a1eeb6c41993e810d0d910e1be2c029164566ae503e8a7920ddcddffd978454d9a76c8959261cd7083424fbd677c329e60f5d7c4f276eeed70558baab4517c6613bddba491e1df88509df7994f4f1ac551f758a61a99b603e1e3389a03103f1cf50c157a7cd9c75f203133fdde6d610d1da51711e319a7dd49cf0c552c7e357826aba19ebc122cfdd94729727c9db07fad473990b5bd6a828e622e65996307818fe2a598ba54b76b6527017f91a8af21e925e9a8f84ea7fa9ae1c752b0875d4018f94af1dd6610b0aa19e4ad855705fdb9864de31495054e5397fea2dbb1ddbbaa37b7308c12ded49265fa83c0705b1b06b48dc872572d85a3cbfcdf81ab32fc2be515dd311ec9e004526a89aabb5881b6f5d2df785fc7a771c4e890093b020b854b8b8033537bdbe7295d47ab02a539b39244b18f747abda4cbeb3edd2af6ee9eb142a2fa7999cd2533fa462c0be94be3d30ac51f5deecd26282d70643fb5af605f61caee58cebfa5b56a0d939fcdbd30ff4da391e3cce2de23d5ae0644e856b19c118177b7bfb74ffad4244a86f999816034d44bcebc01b4040c812bff36e97bb27a4efd6017c00b496114b78814e7bd3ce8dfb7e665349012f96f3b3a4872a5e7c3b9e8197cdfc1e93864446dc6adcedc904c3cf270825a96c5029ebbc5f81784154aa0ab971e5923839c58fcb9f59b8855a441bc84f4fad897c2bd4b5684b9d0978a8dde0f84bb3f67455afe92c60c875f6e300a4a9059209836feb1a31d7315720017798c19d0850ee6b43cfc290923d53270a56a605db6efe6cab753cb2d99cd35a746b8e67e3ca007cd7b9d247aa2df7969558b6cefe1c65a8a230e96cfa6d1afa30b38f2aeae44300d861dc2474da7c983e155baf8eb421ba4be7e874182a5f87591b746492123eadc242508596c52ad261372555e1a8db0825049a56b75739883a0dbe835de65bca21c5d0096470baabab187420bb7cfa18aa117f935c9601537004ce25c2d312fc7376cb1e725f84aa7843f8ae5092f772678918988c496f9f878b33ca455afcab33dfb233450411455543f36d65ad6b9bd9e5e5f4ab03dcb2dd1b8fcf7a00915cff6b15f660e0f902de9324ec5f0ecefb6dc278365d37c1440d3022c3c5464988129376c63a88a47950abed8991598a17bf894fbbf767c5b98463ad35bbaebdc32a034521566d9c0f6818bde3c0e025873ba4cd142e065289df207fa3b1ac3684b21511a638f2583b91442679526539b06ecf80dd55b5e04b79f12a8c6bc17c4327536cb346d9519448c8b7c8ca4b3f39c543fb55f2d8f754e1403e5e3e70d7951648a6d7246520901b00d2409cf49e79dbccad3ca9f2105ca1a81b97ae5cd0e0fb5f509046383db564a7167f4f13eff71ea416efdf93c3c9379342d74fc800bd33221a5d20c5118ad205e4d3550b9c381a64a8fe08307a111f9c548b7754ef907a1b34cc488e4476dfc7ddfb534e3bc33ba903d5b85abbcad61dc132c985e5e12cb5603c22163f0fea476245ae7e471f0ecb98056465015cd7b2094bbacd9c55c78b0d4b41df69cc8e0f0240db0e36a21066e60b90f1c35db0d3ad54dfbe6b34d6f69c682c5c7d1337a94e8b7d608302cce56e66c283aa33de0d1dec8cbaeb24d7a2ae11461fb1aa73809773ea27d4a7b0d1a1957d9d0e75dbc8eb516655949c45f9b2e5239bdfc8ce4f7da8c5c6740748a6102636a078aa16919641d110e011ae763b4259433014a440817874cf19b810fd4a77622061373ae19f3c716f560b7da2a7c73bc85b04921e23819b940e209621b12794af60a3a543768fabe37f003009a8c26f7dc91f1422d4429ed7f9d744cdd4b552afef75d241acda04ffc39672159ee248e602dab7192449e2ed4552995c258f00a476346e36a29a0126bc249040faa57c9380bdd74b83f62c56790920574433432f8d65c5cd185e24fad13127265c6a5ef8db4f114493d5cfa61d91664981408e93ad60756f5e84e4ee9b42b33024cf84a86ae4d19ea477414eab51d79d9d1537935edaf987e5acc56482efa0f904337204c835b4b4563925d29ae0f0ddc84ff2810a2bceb15e444b0f207e9ceb4b44aba06ba8172029c9e1b474b55e84c34f33ff47d9617628c9ea50eca5f3718a61860dddc2955c9f780976c1455d2cfea17050807a6e40c5cc27bc5fcc41364218b59f970babd407e2119be9278930dad53c475c7521abc5c987a3e277f2a402e8aef81fe9c72123867e8684c26f2b0858fc262460380199309eca2d2fa4452d3fe689d0f363ce52d3b4e90cbc8b95d7ab349f80a22dfcc09fb1718869c29451acd0d772af2e3626686915f95c4aebe95a79f5e9d15ff7cc65745c9cacda0bf0be02634d7372e30ea2efafc34849a7bdd530cbd8746a8d2d306bcdc26f57368ad1ffbff9e6ee6f7c11dd18f306e443c5ba0da3d4e1ba27537efc47a227c68ea0872d3fe08fdd361f4395e420fec76a815744f057cfeb40ffaf9a7cb47cb48ea24c2f8599c4dbd148a6ce83b5b65f66715b9b53e9856a845250eabf61c48da130af5b039e2c66cb88b9cb9a29b418d226355520f2b8b44c1be151a242a5ce80ac1f544c663d0a8f600b317a058e7038105326fa1bc05512bd0f53a7cf76f387a51a8fc27a6d43876f0984b5d19c1202b0536531cd32b962a609854270dea9409c3f81f853438e5df63339d006636acc96a4b48a7f967dd6778e5af4cf433c25f1eccf707936677d9616c54b1c7ae6e023d58946ab420ec8a1fc4951432b48a256a0bcad64dc4b60ef32bba9ac5912f7f8544808e8fbf8c3a5e1d4ca751d4b603af9fe119eabc6923205815e0e748b7e74af9543b0faa851f3cd81d2cd9fa0ca0f66f84f9f0b55ac3f1dbaeaeb639cee3955e5898be4a9fe2c1de50cb509056a54663fa9ee9174f946c9ccd2ab9cd3c1b6d5bd4ce2307a22bf5152dae40fd5ab9a8638d2f5c49113e9b84ba7c786cc836dad80f04c64a55a1e166fcfa30a9e185235783d4d2b5686a8679bccd7b7f3cdde4bd5263307981ed8cb904daa9fcb2b1bf2725b7d2c21bc034641c454b6c5eb794f2e513e8feeeb7fef78e74325e97e484bcbbfde4d8f4e7ad2e230b6f9df76df160103b763f64a64006e2f0533756c67bfc8dd1905fb988f9bd16486f78cea603ed1b0463a6ab6259d0487794efb800abd0e2595fbf334a21fb4023d467ad0bd3824d9536998a94513c08317eee853a1d2004bdd8612ad62ccfe8c524d15a436808ef177782cbe431316945989c851bd7d5392684ab66d322205555ea1e9ef7cb6549b1afc834f90099b4db6a627f4ce3d5cabce906aeea0bd8d0fcabb541cf0283a38c65d38e7cc65b321d7da63d75490affa691dbcbc3f0dea1e2f1000b72174845cf210ba0148b5f283158d1853d0f5b1f0d04908605d81a102e4366c489119e76a36bd8346a588de13f844c204c3faf7418c88fa558cc7465092a4f33bbf96c8030cca2102534cda470877ed64be0f044f0673ef066d3d4e79a2d2321b1d69aa99dcbd1fdee2807b8ebebce6ee2fb05d8bc690731d4f522df0ad44b5613b00f3a13f1cdc36d3b2366d937a6b2b897d678a554512e4d3a469580a72d9a8890b57ab9c4fe2a497509f662f46d6876bc4b6bd3b283b077ab2851252f32b5b87d73b3b8cecdfa2bdea1b0ada98a59c3724cfb6d0a077ffa4fb15b20f3c26e4c7f312b3797a0faba7fd4dbe3de674d48c2c16e9be544637f2fc7fa9a7b468eec9ed72c5fa5e0f39f5f88c12b1c6b0cadb3920d87caa224ae515378bb5024de3fe34efc5782f6ae8186a6a8aee9fe5d994ea720564189892ebf3e1baaf9c623ee557ce348b648f009fd17d994d08809b49ae8ef33d2615ca8816e2c90fe9228a0fc4a2b5ac74084dfcbc19c045671d9a79f3ec144069263c39dcdf294e8f2b4fee1a01ab43f4531aaf88e39260522921a658fe0b1648467281d42b7df3e4d8eb00b67fa7fa6bebe128d65f7236401ffb4f5c592a375a02f7e08b4c198880b7f5d828511e28215f4c1912d1f23fb77e71e56c62042bf4c856e670d5ae84f934fad4fe4a8065db19b5c0cd0f94d53ed1100907cd2b5ccf12fa04134c8f7194fc64a796a0613befa7b8e0735cdcaf3c94600accdef2524f8f6bb9e1153ec71a6abd9080175302e585bfc8844e3c263744ec9b1a3c1b94dc7a268878c45f0dc00c80505903b85343304519ae5825c2c57f101a7e58e9ad1c8fb4e028de42ae4c5e37377ffa13b58f33f334200 MD = f52b3c537f28d89f0df1efee21c70f74df186f3928296d19582d5c51286e98bc Len = 40904 Msg = 18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a3d8279f06b87f806a88dee508cdb536e8539a384790399eaac7b3a24e3631614cacccb6e9329ca6de0a75ec4e3c1ead8c30e722c425e5c1c9e0678cfb4783f676b17587a504961c67ecdeb20c14fc6aefb398056c6cd28765a7157d6b24972dbea0b29fdec0f437a4ba69e4c6fad7159f362d5eb4b76845faa63e02122ff37d80e5145ddada4faf20fdb7e313504734274307ad11a81f83f54841a984fc116c69e91b404dc300e95921393b55a7c52d0454b76f27b170c7f217d0d2480b8980d63727f58c0da05ca9bf7e6c1283c986a305cd134b5604985d9f6c1abfc0c4415259dadc3a3cb69fbf42f7e3ee56dcc7afb0b9381128336ba44963f160ce4a246abba462ccb2bc18f63626412da3677676fffc5c0d8a85c8629068e4ef8683b09bf70537a812196eeb1389e274fc0209954e16fd950f9415252eeb63a08c296c42767da970dd56f80a65b36638c324f78725897b3c29b6f8485f4c0c184173ce1ac48e66ab770d4ac097033b0d8b58d6c900d473876b96e868bc3b3cdb392b3c616bb7cdbc71a4ddda4229ef57d7160dd78a7864fb379c4be2c019745de5885dd2d67a6d284fa63783d167e1ac18d5333f0cf5de0c303fb962f5774104d94398cb9f56b3738399de69df7db06ed32ebd6c12dd2d4ec809b745e6c5318486c583d810cd4f229fe848f8c6bbea34887b22eb368f01177182ac27fe93b44170869574e55e7ec9f729edbd11a2ed81cb52fa48d29bc80acf232e75b75357c0191f442e878ae0be4bd763336ae338dafe3ea9e19174009d2373a4bbab948a84f2f8265171c31383f0691fd81ccd5aa4b3a6c851ddb8395320ecb56645c7cb14a099a2aa3e9775cf77579a27b1e1d1836e23cc2621c8d0a15a06c702007d97d3748c4f85389885d5534b58bec4c12bdb802e2bbb0836752c115a501b76268f561138838f0a16c25a168cd1f9cfebc821bc2e7daceb818537f94fe71f21430010f936f5042dc2b9a233c49c552db244fa54bd2868662a8f79645002897c6398a88f000a911dfcea622d6b2e7d88b510da0c52b269e2920245051328f6e1f8c761551c4ab25555d30e85e90ecf4b74ba252587b24dfb787c4f3e01c0c41c830affede41be46e4de1fbbfd693c6f071bf8042a48e711b1e5bec8194708d6682d1b8bc1014b3b345b5de4dac73f1022c8f6fd661dd7fcc242fa17253aecf6a88ca4041f8cb8cdeedbd1aa1f315da1b15a8387327f5c6790a760282c7d1e69305431b023686fc4ba676357f130fee85bda89e8b6f8de1cc31bd842559908f7a78da9d8f21fd6e83f06fb327a4b8aafc94fef691c0fc5e104a74aaec8151068b640f6c4b739570026c08182e20a69bca2c19d52894d797ffb529eb5ae79a0830474ffbc983c59d6169ddd9051f503d78f397aeb273862be4f24bc9d2f4e1f113a31ac08bdb24430b8a6f8a4ee95c0ca38bd707b1e5ae965a8258cae721bf5daff7fe5ef4f227fd7b4e2b805e171095c4458664c963b743eb05ef732a06889a6fc6792ba76157493b15a06fd531144545c0f45a4b6616d0f0cd6e36fe0be453dd8f09bb259128a2b5714cbd26cfedb7b27ecf3cca6563aa167953aae5ba390673c23e81c21a12969501aedcd53bf34994ef6590c8fa245bc67a4e23738a2d2ebd0066243f54ab9134174563631dcb97678355fab99cbf427b40ac552a04074923ba4ef6efe96a2f2d528ec552dded0d94eb2eef3eb5bb1acf7cfc947bb07dc24260278e4640c4dceb2409971704ce38b7774ec2aaedae311d8fcd85db07e7369382ae6ee4e35206f80c343d421ae59559c83439909cef11ffe98d9dea82da1281a231fd4e497849ce8bad4c4698d9afd65e8d98825c1459e12abb310ca9dcf2b73f50dde50bce21f912c338a706f0e4b79aa983f293a4656bb3e503c3f556338eca99754b72ca0be2521486e5ddf1d0981d166053ec25c0fa25797a92eddc7182d45a47d446d284249a2fbb758622ffd24662d248ce0ef906f0170a1c0be6193ddd41ea21c09e072a7b534af8b82acf00b70d4e23a1c67a2c941c36a1d7f9b70a45bec0b6a883218e765db9c1cc6fcabdef7438871fe2d0d5821784d6ca8dc792ce4f600547085fab1b7d8c733b687f34404625d580fa799c5a87892d6c28b741a7624c9024b40e2abb51378f9dbb593e59d19ab18d63e0db8dea9818254122a191a5ead9da0cd96806675f795bcef516acd50b8d8db5a33d8ccf46298e6d863cfd78cf54df893ded6d2e48b30e29bf77b99efcec1a764d1ce79417c420045e6e4b596ea39dafa845602497df2d3234bbf0bde33fbc1c2b041ee7918a62bc17d01bc64d18ace6a4ea7fd8d150219ed16df2a052fadb1de98da31827eeceeb4eecef5def5675c4b0671cb969b893c631f82fe4c0cff001f51414c46f63dd28602f267ed9df90d05725e754e57aec2eb3051909c101a35eca21d46acc8c15e9f81161a77106868005b14029c919a35ef0ff4e7db8526d8af5417289b3b9f1a6833e1176597dbf6a5883b7a6790741cd685120bf3b14a72cf2fd6f9fd98008e47e0fc65a07a7a3d5ac37ce6999d6500085a5305caddaf8ab4fb03c1b9270b43a54f0e0c0f016ec788d27f4d19009568ed5661dc4a507da8c6804589b730e9c0eb49c0159974df1c987eebb7cf012bdced41e1985a54db546d864558dffbc18d7f96ba87281af4c2f08f682ca3e850e470e27e42e12ff11711d4aa3619d0bc33cbfea36aa33cd643facda0b57dfc2b09de02dee1c92ae8781a331d2b4df60239354923c7f122ad271d0038594586e5d29f69a97df98de800f06b464063b6ba27273ee4a5fc14a0f4c0efdb21e3cea5c81bdf881f59a01835fb44cc7c43580c8608a68b0cab5ad7344d632f133f1c9471ba2c22cdd1aba1a1a38658e8d52421dc4049c304e63b7b6e2b24dc3a42b8da58e517219149f5abcc51f8918a026121b437ef32969500b42bc2fa8b9bd2e99e02026a2a73a9c75d3d6b63206cb0593493546080c9a1f2a9f27aade440d8f908f97bebe87ad969df7c5b8fac96c8528003016356a6f056834bbb048e303d2e41c4b66300aec1235a118744de0e3395308ba6c25c336b7769beedc83273e7d171eb1d991d174a3df685594a5eded76a6ab4a943397afa9c84d478c17712c029bff61657e5be5afeda5e3768d30e9e18560473af9583860cfc14c4b70614af80546e0b6300aadaaf2f278b68e5a46fe91e056ccd1a54f510f807397286819b1c58db638617e3b3981c65bc103daa3123e73ffc676ef731f0a03340b9a0616e46f2c38688d272cb01caa232298327ce0fdc398c43397420f41d223f56fcbd0f464ab0dc31d85e0c326065557a5f242df5227b822b24d1ac64975ca00f419c66648929cd49d2af5d7207378dcd77a8361de48d48e4d618bc873567c9ad17075be8d7b7c197676ea50be79f42e876bbd1ce48f84439f85137a620cd24f82805d6195be020e440a2ce432725dc940265e6527643e0f132820709801617b7199ebf413e2f52f80453bf63f051c399c3af5def97f683d32bb513f87cc80cb495dafea6a729bf9b5c8960b269ac5fbf63a01eeed39994a98cf143bb3c6d6ab542c27b90bf58cf95f04d997abbbd19ce8741129751b57d39fc3f7f99e98c9983c85d1f49ae43ebad67a652010d0c578dd9981f313ad1a54c24a6afdcabae01e6d0b4d0189b7279ad6a9d7391882282c501b02e06b57674a9ac2ebbcaa95a0aa502cd7744ae6ee35ba039e4705386033ea78e285ceb2b521a3bdf8bac0c181c8a05b2fd1611be8f7fb2828de698c040c0723cf37c0478a76579c208c9fb709f5b826b48d6e9eae7e34780573d7c59a3130ac179ae27e5db5310de186b9febfbe120fe42cc617b514e083c28bb29d893fe1825a0397cfb56aca53ba4d8201098e48875d23f9ef837879cbdeaaac7c5784b447052672c418138e3e29559a568de2c61d7df79cbe90057ad0b83507da9b9c035ab767e5f40c2be6fdad136567a3680542d53c00ed61486e02fddf6740bc02694def4c73c7e8208f42b42b75cce06a9097e155d8f48dbdcdf30dee3d473f444080fb48aec852adc18decf24dfecb77027d20d9877c7bd2152167061c469bde43a489d0f97dd200383fa5fc4065db29b573223b8eed9221ce0ea7ab66c7683ccd190999d630cce45de87dce0faa85ef240a43f071b08729632b3e32bf521aec576f0907d7b9c9a69d18e2dc0e355223f8b3349cb27db1557f079950887f3a697d16e68f80515ee3903153aace8ec6848dfe4294d3ada7327c14477954973d40a89150a542afd317b1d27ebec31f697d6e5c1c7d57a8ef4ce4d1d711a64299ee647ea5ed911decbf8c6c928c7e7fb16b144d10baa127e01133d0b6bde009d6df2b2f74cd1e33f2478a705d98732814fa1a51cde16283300bf39174d2a4358aaf77343bd82c7a9a4c368e2e6723912a96eb0ab265fe5335b9ae848ff4658e1bbbd31d69735e6a3b3a0b06937d125358cdf0c85cdce7008786cf3a66a7a65c00a0c95b9c43367b5b9d827a0b4eb1d7360be62b2b9abf239c1fd0139740e937efdac47f32ac173671e337691460a4a528ed1593bd43e924f9c15bb0a064909a2fe64ee8cb32a32424a794544d374d45c7ce19a2704ce79d1737bc9200974f0b474fe328d46b4cbcda5723bbf4472e21993b5cc7e33a5ce47adf8d28363d76f3cc740bdfdcaa9679098e6010c824c9c103b1798494809ba3ab2547e3cfebaafc35ef334e4294f2d14899c3f33744a2bc9ddcda68f2b436531ea577752c065d7d0a3df424a4aef46e0e15d9c3a01b4b7ccdfa09d58c49bf6b4bdc862cd931f10ecfdcb8d3815d0d97d09f1c02b13d167a2ab5826acfb58954b9371eab65e32829ed480bdb5723c0f716720540d91ea64d2a7bde894b8c46c7fd418b51409e4546e91c77bca4979104665b200e96247d6e43d968c17e325a0d7e8866bef7b7eafe49a666f7e82d003836a6e6bc67030e460d4adb93e64c45cdc3783b54f9e47ba89582540d9058910b1dd1d3eaca2edb6cfd3c8181023e9c6142ad73b3d59899ee433ce96e3baec6157288720a4e0c575b9a4b0509508dc06092749a4c0948a827e94271ba58a411bfdb274bab4120249a4ae2d0ad5fce4454397a298e137948fdde1fa75265bcf692ce3acb4e720ea591a5907eed9e54aab49e3aac1a72bedec8b840d4c6e17df716a23f6b542f3c6cea20d05a3a8ad575fa27129c41a56ddc310e3284986a4b95b42da1c65cf71ddcfc532f0d24a3a508ad9abe74c42a1ae39f268151375eca5503970e46d9583798509309022c876805373f8abff28f4a678bb799b5343d5eb78d94d17759c12e018f970ad3c29472ee3fabf3f85d3380fa8f28081b1f949d2faa9da7d24ed045baf1a580fc77597a161f66a69874b532ff020e490d49e2fa3fe317ddd238f433272f6517d6cb44d22f6ed60f2ad992f4f79cc0d90653a6ea7aefa9f00198ab5ad8a14c4c1d3ef51f9ca6909a29ec4b3b66b7e63490bd6f023308ba9afafe744141ffc17a1a32e8b6e04f1cd4003d4c6aeedbf4e826f789c62ac6c01b08dadd7ae5837b4e68577e3c9cd0e149683d2527d27153605392b5aab4b2611cb5ae455c45e4c015820d441514c46466ac7c53e6c420b839810f41245344040cabf94a89e59c368be1d4c8d4faa24cb8576b572c366269d049cddac799142f57363c6b78470254fe123e7af0b0e2d0baf39aad5cabaf0ec1086ed118f87b59a90ef826abecbf8208adbae8fcda1eb6fafb8ad51c967f0d986762c27cf402096e70acea99393c7427feca815dd8ae55d4f9ac5cd0794aeca2c13a3d780e40b51415db45c4df0171d8900de2a82f2a33e5588fb32cd6ab328cc06590aec9afe33658f3b6b320972196fbc56b40601ae7b8a2956666311865c2cf656a6598b82a41d496bbe8b075f9efbca1a9cafde8d7ab626de5211b0afcc158ca39410df1e0c2f334d3e9f116714f3d232cbc6b2c8a5a1269bde1f70b7e24e7047bd59bd5bd364f4e8d1b85010e3207ba42892a4e86312d296f3d4782505a1494a087b4dc061843545601cece5734a6e7a9a5ddd741bd3d2d67779f1819cd4c0b55cc0b9d51e579d6ad4140c6b2d3853bc0b6d85f437aacd635456025411b07c8fa36e262273a4d56113e8d8 MD = 1ca0be9286023fb0b947f07cad056e59cff9d2d16c7cefdbedc33950a9312685 Len = 41696 Msg = d9db535f11ed31c906af44c6b10a631fc6b004c289a4b066e3fcb472b5e61a1b6ce9d7cdd66d46cd347ed51c90cdff9e50f77a7b0c0ab1c69d46745d7620ee10388dd805807ced5a03a49e0dde810619279920e2c80438d38d2b9f467bd0a3a4644fbecdb8230eba9eab0561432e62d8721e60be66992dd7dc359df66cfd202018b7f2ee266991332b1b74df69ddfa235a0ca1d68dd27818b1ecd735f0b04dcc7e4eda3071565e0ed37a5250f596b64207ed4af3e6b501df35d7b3caaff012efbb9bdf5a41f25e93bd52077c925f7e7ca048c5dd184db1738f7e9a7f52c557d2fa26693640467709122afb2be6423a1b4ea6795ccc9f6e1ee869f51a813704be6178e18a145992baf98b96259946d265388ece38aab5212668212a64e34f01f91818ad1f653398ec9bfc403154732ea387882c385996b3d4362da325211436cb488e37bddcdd6fe81f056119bfd2371c621cfb26824a0a707b15c625e28f8c7e1963e62b205e01f6ae2e61a3816ad31af2d3a3c8ccda10425e62fd2bcfc6e959b21e2133dabe345d7000a8984244ebe35e348ce6e04dab91089baf0190c337a33c47529bb206f2678c029ebfac6668c0cfc81f4a65abc5a7a148436dcc8e5ca5de67e02c4f3d225a2bbdabe265da30f96d15c2bb04fc45ca50f123382b2d42a7c10533ae5a6bac7f74b738c715a82dd65fa5de00654913433d1fb62a57aacff00ca9b3e97a98771e907aab3765d6459fce00dce22f99175a9159640af50cedcae8dbc8a558cd6d7fa68e6efafc6e629be1ac22290bf53956742895a2b05c837b7d24daa99c1275e9df79e7d884776b13c1331a9da06461810d13b1b82da1784cf20b51beed6d77a663c58099a2fa484f951d2b0597ee772185a2201517e3b685701995acf3e85cfc59f9a00400fee19786f0bc2b979b637f035d4b81142b246e1ed40e3b578a0a34e99eaee3468b1e33bc3637d549740de3b0cd98c3cc80aa4f25c62432c15b6a953d3b14fc1ca9e76a5e7603cc54805d94b47970a5e9ea306fac77405bd86464697a58391728612486953988d862c83cdc36e93ced10719e17dc6ec87c45ace1f6cb7e85fe15babdcd88062ec0185290015ea66264eb1edc8fdd33265eb03bc7865633607889bd9a8860655d4e2028434c55374cd222f8d31fd64ec0c9bf1a005f4302324c2c71a3fe44de7d4822523b05432460ff5d07690fef4800851d5072c9bb706343a8dec1795dfaf677c5d6627450f608b2435487a652a74d5970e5070ee6075b25a20cda3fd24030a3b2be9ee1a234abb57ce6162d24f60e0e61e2a575eb4e83bac504d799cc3994949112d9936466b0ceb1c6fcec90baad6c974e3645f2cd41c9b6cda1cf736b881109d8fad3bc1581c68afa232bbb7d913bbb31a1c7250dfe1c206f1e29ee6075e4c21ae9e9d2c88564ae8c7132d0c622437494ce43aa952379a9f338ef66a0c4d365df8e1dcf072472c683d048f51ec84c6b7ea500a9ed16a9f960d66802b1dba79a30d1b6db5ac6b679e827b7520ceb1d47f70e484b9e4174b9bee0ddeb1d242708149afe1d4ad3fa70c25dc51118f37fb107f161b72f0ba191153d96486c051d5893d13bbe5eb30452195cbb57ca483a51b736941628dbfa286ed7db4224e84f31b55eb6e51fcf9cc8f60be14fab5216ce0ec52990121b4527d095f401cf34873c8329b7bb138d8c7a60527e1e427adbd11486684c74324b35445f28acf4518b21041a8668c4569b0f5f19dbef17265001d2629973d688d4fbd11dc16c1ca72387401a6a13ba939030fb4841e8b3bf3e074f3f032cc085a8217fb70568ce9e1916400fade57baa34843dc8f6319dae6d8a9407efa0bb918e4e56163dc9929e34770be3950591054fb42c7f42f35d5aa533a7a0a5f74e144f2a5f20b0b6f00f3b52a97c6b9b840aa967d0566f567c2aaeaa92f46d580276b35ea1bea8587159f74e23c476d1da2309463235c48181884f965de98feb5e1f829224d96bd69ce4301480a100cd1db738f85905889df4db529f0e6952daea77846df1574259fa18ad4cc8fd4fb7d42dff264dac04d15e8a7d6eaf5b004a2ee781980f227509115e389d04bfacb888ef24781714804646ff99ab47a6df65b3d540bb86204c0d6c1c97af3bcf5ff8c0646f95be23432334a16dfedf34385300aa8a7d5f3b0f8e90bb932b7515b09e04f4aa264ac39791b0d8c30d7eec523c9dcf2786a15905b307a4f4b9ba78e7d2dc079bd2c4dbc2b8430c61832cb6774713aadf7f546477a5583e820013e34bbed1050c4233530dbf74a51006f17aed9ce9a57a108143ad8b0bf005a9873b25876a57c31e9f13c0cfcc0b983ed620fd64a727bfe02fdeef8ea824445b1f69bd583063880d1102230fd2a7c1d5e291efc7d6977798661d85d6b84108bfe2555b57aa9225b78f0a7ea80edf53701eb30becfd5f6adf2ee8b68ac3af197dd8e747ac604c60c5241218c1081c15ba906f99fca4e6605e9027ccd34fd53f3c0908c880dafa03dfd5033a8349c7d05842aee01e539421bd93c20dd8e61d42a47e9e28fba102d4acacc32c1658464cf53c56297b93d174a340a1c2c20feee95e3e92ad443cce9cd5b03b36a1bd0351378450bc3aeb0523b89dad32b853b0fd1251cda08433c42201e953a04c0164a7c62485e185e498f4a5b5cca7e338cc4767c03649e20f4e30d960f4b141abd3154b24dce08104f3b0128de7676a48a88c0692b4ef8756d38c051c04b2a543b7656e8a3c0058d67c1fa62fe7bb760bad9797cf31db9a93bbff2c256ceba351785dd6608f8a32df9c080aa2b2eb2f08432fc17f9456444b6d51f68415a4605e7ec62caebcc636a9bb34e6ee323fbcc7d31b2cabc5a6ad08534a0d40e62507f13067177aabfc8dbb426ce11c4dff46d0c324815bab13fc51d4b21661c6b5be93f80a40ce44745e9d9776a332ed72f4ac7d12689530e75aaf5850bcf09f9eadcb3d754eb16f75d2d8241ad53bf9e1efe267ad88633b68eea947eda4f45826fe216871ea2c144911f350221f3c59945efaebbc8accb5e0e1c70a517975d996d61ddfc6bc451b3642768254283ff5d36a7c700915d984955a910744e17c0a3660480b3c6b066c858ee9247a994bb5e63bf15e5ad29091d08290a78e840fd34dc129549ba077ef7e1cd59d5a19698114f8e11c7869fbc4d8804b52f60c391c25244923aa029f8d6815c255bd51a041a7cad2142b812205f77d4a71461effcd04af2ede323a862c8da036b46ae8f8dde5d84ead3ac20b3d73a1166a44656bce338a62effbef34b533e6bb222b87793d174bdc4f6fd6c052951336a7b9868407fade6dbccdcab211a30ed807c6d62c49844a05629062492ea5fc328e6c2c5260a0d3d5af70730726254116cb047c18ea76fe4f4e6611acb7eb83938927fddec26f90242eab913bde00a7fbd6ad224506338e447cb988f3d7aed1e0ffb0a12f13ad3ee1a348cc57207e671190896fbc8604236c5251722675380da158d0c14d3da30495750dce61d3e5aae0625f0c845331e54e39f5754b79cf605ffb4f054126990bc70cc33c64e17e97efb2f9a0a55302fb729a6f396ccabcf2a052f51412b8d67affd032c165319157c6e91dd42870bf8e60db8567905247eaefc48a97c8d9a47ac62921036eab6611ed7094501491afc5a16600a7c0f8b771d1b9d5356c734933a27f59aa863744eeedad26bb719e1bc9bca1a7a003a456aed0999f97056d0ecc1e3aa35fb6bd75164c0a9abe487e4bc139f644fb613e6aca73cdb0649baf3b6ebfc2c5ca05253fb095eeba00a01b87d6a1cc9d5fe2af3cec42bbd045372118400f7f87927b57ebe44dc14c2a815c17307a8a7c758fdd143dc6ccc7e2dfabed6b95dab35f203cc0dcfeea19e3f32942f64f9aa7e56fb13ae586685ce29e350116d9390fdbfdba08bd2fd3e9d4ff6a5251a563e6568a13f50b0bf859ee79a79d6a640565ac19ba09b269e384a4ac078d68064d0371e9ec8ed7dbe284ad7ae9098fbda77b7a7c250de03382b1fc03e93c64f9c0c4dd93224d728090a5c8a8e38dac6c8519ee2fe15a7215183a840af6a66c0724f342909f7a04826886e60b7e71e9fa0909af39d8388e970de5e3cb1715a9b6e1564ae9495db467d4eeb0aca0fc6fee9a1266a2f0f15d42ca7bc24e35cf42915fb69ba50a3eabb93ba4cd92327766d09ffbbb7313cc069db5c3c899361d601d07daddccc96411ff0571e6c51d2af629828d55b32810b13137879eb604472be43f8cb9676e180dc2991da34e475d457faa90dd6a17068884b98debad8595ca6d7092d67de0a2c7896170ab349a587e5d7fccfaa0c8f6b020a19e5884a34f664003b5de16094a68dcc432a77ffd62c7486908555e2227548d58828d4544bc26e65ebd763ad05818432a2a3e3857c548cad00e96ab0fe39a51470131f8522533e6eb7248f21d13fe47fb21196692c72b6a1ca464907770aaf6d5e3eca3b4d2b4c8119cfc45d8c4436fa0dfe01195b195b1b59367144017ad0469ef6850520bd21537023a3ceab30e447f2c3a4148cbb02504a2483f5320cb016dee4a061418b554c76da9de3928884d01d0cfff935ca4506f9baf1998d32b7748a93dcee240840d28a5f133ae6bd9128e9248525eae99ba5f4443abf778f6ed62e5e7afa4cd68c8c272bb4331c3281b8f3b4d439107b6e93d67adfc595653ec236df0b14205880efd9caf17ab7a9df16a9385d914b023676fca9514a4b66bfbf30801dca4310d6641ea74b602d6621b8962991ccff109bc5f36a1fcc2e066a23a7dc239b3981e59f625b32820209c2152703014ab11906e73727cbb991c6b696095dacf5584e46e84151376eb9f768c2f85f3ca8e5adf071548cc5913b2a2d9cd18f2a6733b862d53823da74d9d16e287688a4562121f0fac7e3adf17e93479e9ceb1c7f6062d1ecb34d8c32d60a4aec2e29c8d0d82770ca0dd6d548c0b49d11d7ec039c42d01ca55f28dd37231497547bbd1ab79f21088582d0ec05c5e086acff2c604c7f829b8578604dd06582cc180bbd3a68ca9110a3e36c42c6e2b9acb69f06c31e5afce703bb6e4ecd01d7719d4a9478630f1a31bb9bf389faab9277c51415ac70899177b674bd505b8c84f06ab4fd8544c10ee4231921121f852d606f1ad37ce17ff2d60450d8132a6a0de0f6e732c17c74f19070e75f8ba403ccff0affbab4ffa2937a73bc38d7a82ee4cbc83deebd78bf64df2b93195736ac03bc2f5f56050995f5ed9b337a4e634fac1955358be9c7f4db18c988e8f535e2642052a61fbdcdce9ca7d142f6c7ca50c642346a94d6f8b9c6e5c14538f6205b60b40b50827f8ab0ea21bc6748d46bb6c5dedc5983f57972aabea964a3ca945b8bffb00b28aaeee180f3b31ceb04c5f62d57b36ee3c5d8b4091bf84393f2f077385bf7226cc058d4d3866bd047d957a35f4560273ee884f26486247e93ffd34308612732e960670f64623d2e09b29f22ee10592effae0cc24f75b4822e519b237e97f6b9090b77f5a60fbd828b310b195c5104d2a0b6de882c633eeabd98d6bd0d78bc2156122a3c3af7537a56c529db2c7009aebc7388c87de71a04ec261454378c0e185b14fc2775a19571f6ff8a0cc105ce3fcd648a17c679dc8d1489b2ad7f3a52ea82a44c5bf8a6fa05e630aa12cc7ac8f23e1a50da98840cdfd144501d571c21246720b95e367007b29f18e871b157906299058ba566ae1179ace66b28519a0f62631ac182b18534e49c18e3cdf2249afd68a688ecb35080e701e07242f14c64011102d38dfc6f082877a11a7c015a7f4f178dd734f103d1a46aa2f411b89bc5acfb698dc46986080a9c420b00816183c4401c0502c2309a3e61de6f091a10baa28cdf4eca9b72aaf7749c23ffd4f26f095ce180ca897f311161d3419d8843a9ae4fa4a4f504ad676bbaeff3ce9e55876ad86ed910c9484cc9f5222a43959d190cae7a1ef837aed3f3b9edf8f1203363754d247c6a041423c4966b77afc4859f6a33c01b38a6ff671c0bf6b21c1cf499b515a2f93abc7b7c9dbfefc81697b593337a07383ac50797312b9aad83d71180b6ec5ace0774e6bdc1fc5f7a2c71759af4ebcfd473345feaff935a59dd0122ced71bcc7954afde5dbdb60b2c66047e1d2b038aae765780e8c3ddb6259c0da0baa23e6879b6dfcad30d87a35d37a317a0424bb7f4c8b0e3072a552ebf256f03fab4cecf4d828744b41deb986b35efdabad74ed865cec32edc9fb434852da7d5057b4751635c28d4778b5c5af4c54d4fd356678c600d20accfa05557f5f94a8c415222af69a856e2a3c2447b888a3def704c301472183be556b8c319a03cb9a254f60b29bf0b7407cf4f4e7a74d95422182523312a548771085577ea024c97afa6c34b70d1da12ac30aed4c868570290318ddb32e76695d86b030e59aacd471ccd467de550b8b5589e5d71f5c177dba262c2a2ca37a2e973e55dd0e8f8235a722eec1d17aa0bce855ed7a0732eb041e112803447a9bdf4ec0da27a0878e34438424093884c67e0cb08a9ead0fe94d7c4c722ea3babfc3a995a9d6448bb8186e7add09ba7c6417e921240ab8fbf99ffd607473f26bd023d14428b2a1a1e82b4f8d8287006962d0a6302387d1ff0344c9d4949cd995b547ed55c18260d406b30f44794cb253a7f16c65efdda021ef8207303c6fff4156772651db102829faf9d5282b2077421dc26249f0d4cc6ba5a2dffdd3b60d779bfba4bfdd22a2aaac45cac000caf73fab8bb1638f33fee50deb7ac1c137aa3d6c1a8e273181755e05df15946114db513993803b32c4dd9610a700076dbb7f9db11e0c113ef54a4deb0ee02cb4c4cb81b023f85a434d1286941c99544109349e524d48066c46c980471b501162a36ed6f6834147289744bd82946b32a4eb704837f0678d233b99fe024e8fcad4796d58f4fb828a4b6a1c44c355a128fe27dba4494e942fcb9d63cf02efc5df710e6f0f92d3e3ac128e42223da761bfb8861eb96eb1f573cc34cefc314619d8a0291d04b9528d34e7ca5d5fdad4d37d38d0e1908f5fb2e18fc8838c769bb43ecb941f3e4fc1a8aa31e71504812321ede7cdcb2f95a1f4017a212987b835be9959151cc53d685b9757ae14171adb70942d4485a066bfe35cf60669f6e15d5e6fb275bda26c8fcf82c3e4ffa38c45ebfc73ffb7ebec01a6796c41ebe0d85bbc4a3e7ba9dcc37e2cf3dc5481adc1a9b7ac1fc408160daf66e04298564d857701b164f1887b297c99720ac5403fa04fff2c9b5c202bb3104a1ae2d45345d0f9552d8f9d048888d33e88b5fee460117ee9054d8fa831c56d7baeb2bd89d1a128df452449 MD = d8101ed4097b4bde7abbc16cd854e4c122460dbbabf08a9f56f4f2b882f59b00 Len = 42488 Msg = c0a4f347f790b9985d95426bd59a30eea659a0d77d5852f8b61a0a14d79635f25de8d0afbc478658a13718b97aff026f385e5c45537afebd0f19e7ecff13e08bc7085c4c254ea36a332d2f84e64f56abdb722aba53609ee57c21ea95f26f3074856a5fc33d8d58f49be14f75227074ca16fdd3de84f2799b829ad9b8b8906ed21f78a1bf09ecec1f62b94033354ca4f37167205aee19d905abec7dfc5a60e1d01e98e9e69354a9120f1fc96727ca2e4e7518d6d699bb044b7e7f9e0adfc6d393093400e0e2abd5f62a7ab4b901d15904a979c0f98ec1439683bc04894fa98a4668b3af56fedbb9f23b32c7d0ca4b6f3d96f0a56cd414de0e43097622b2f34f0fc47dbcf0f0ca9d2fcbafcb558a1fb620c2e64cd7739a1dda45cfbd7d118b6a16a3faef55bf62c8d4615887ef493577d6b7c47ee0743d48231177a141735923849092122e7389840a8697c5471075f986fdf00332dee4a6103067ea17e145c28110adeb22152917f9c1d34b05e6c786591ad4a373b97780ca290960a662378e34adb344daab29cac89a75e2d0d413647798d6264c0ddd1e7884c4cb97fe17d0c6ee0ce3fd4071e5a099e35250e141dc07ff605364e300c843cafff291bdcdd15f5b209034d9e9b0a84786632e15393632d5d9f36442c7c65382249e3da841d6257d571527807973092bc6dd1278e3ba1fa4a9cef3331a5fcf349a9742c65c2a43db1a397d3c0975eace0c87a31327b0f7f337acbabde1dddf69c9a54a200414dffecfc3df1681ff74b6be2a8aedee5fe14bed5560e80486ada71990fabc22db226ce07cf414c959ce6d468e6f0e1e10063332908ebc6ca35e79f21ffca49fc833afb32c6541c9cb227b0a7bf87fa10b8d336e27ec42ff7b1d64bc1cf8e061233a4fb29bd9a26a9d956674b9d0475d989fd30ae02181a65810f2df4d9576523461d24390f941921651b8ea0f9d6e3cff649c6c84d6814a805faac37a7c705942cec2d0d46d252a7f7ef8d64708fd25870315fddbb24bd13c3314d06d55d55d97a9a6c030dc561b2043af9f27b8fbff79a5c725ac5ee625d4b4b96fedc7ae48791b077b69eedd4b41c964ad785670b41d71384dc1815a2c90092006c17a0201314c6c694a4cc1a42a389f680189652bbb90f2dbe0c4b0d0b85bd2ffb217d97006635df29a9e0a0d23b7e9388cfae04c9b297d39d2cfeff793d155c088463c7d4288627e208bc06d736ec885df50ecff05655fcd5e491f8b6a9433b30bae31102be50475a5bcecae6386c6b7c4348e2c406c22014edb497385cbf33e02f8c3110b9fca3ff1d996b73b276b36004ed0bb95654d3c692c74972c9f1ecb37cbf76828e13d44cc89c47043783e6a5e45b9944c7869e576e5a8dfa7383bc170d0d7fdcbd1e3ecfe7480c1c2a2c7bca5c251a0adcffd663eaded333dbdd28876af6ab83b9747a04e43d19202cc8e929c6ca1c5ff8f9126892d4c7b38566c88110fb882c25ceec6869ec0cb491f1c550decb0ec8ce3ae8d1e0ccc9fde2d90280898ca41a64862c86c2c5354e0c3f86ebee987fe9af1db03c7f376877867c6d325f3a7df30822a0cc99694150fdfaa43770c2ce172e1a0f04a8a501c4d2f96ee2ec85742a833cefc64838bf71d9cbb3e02fda97f5cdc85bc70786544a7ab89e2ecbee3545682d6fe079c3fe05421b2c6266306be9f0a13cf0166bae8cc032617277e52fb8198cb7c7889b8b9fa971742aae649888592d192c5fb59f10560f5f5a7b0ac21739c35dd80f1fe6b5825731c572f7cc4549c476b84e049459aea7fe533fbfaad72b79a89e77d1addb6f44cbbf5e6a65a5552fec305bc92ced3c84b4d95074387c71184e875d413f65c2b2d874cb3d031d0da7d0311383d72f823e296937d8f97bad17a62f29ef1a091f39be8233c01330d5c4c9170fc501b5022ca29f605e6c59220055f2585bcc29e742046432c41475301f4d7eaafd6b024ee8d6c854651f99925ac47d72f7d43cbd5430975299855ecf0fc3b46f9d419bcaeb2c90ae9d71b1509f782d0443c0d603f8d997fdb0f461e52ec274e84543e608bc2a74b9581134ff36e78d86dff07a5d9845f29ecad00324f4d02c8f55d0758ad446e12f356c98f0c9a91b752d019e2ccb2c13d017b6c700ea6347df7f85ceb3bc08525ab5e251d7b0236349ab62b5e3f9f2881c57f721fb87f2535302c25635dbf564c64a11040692ecd19edba25625bd1fdbfddc3fb8874603db848014a063dc84851c6287041fea7c02cf5e2ef3647d2a6bdf44fedf46bd2e4cde87fb31d0063c3fb7bfa2f6861f47536573872222c2a8d44b02932a9c55c823eb8af48efd1182f11281f33fdbb9d56febec4946e325f181bb95bb0f0a9877fd15f98f2c6d670f55c78a06648332bc94ed08d3e6180fbb10cb8ed51103fda434f864297e837f27ba41084ae91f22538ec359b59443f86bfdd55e5fb53b0dd367fd4b6209e1d272ab09bd3f51f20130aa196f6cb5f9686aa57374d98ff2418c02bf2fb7630b0956a4abf95223be47da7359ba77efaae85d942072c0f5dc2144a1987197fe617c6a43824d31d2d66ec7770ebb5585daf0ab6666c8b48b5b3583a123c1925087b423e437395ce3dcfe8e21a2f2843d0c09ea88a0f712b4f1f6cfadeb9024fdd038fa23354e11db347f750fa0e08269a09c8177897e6a0722dd9f045a5dce5aed83736d06ec1f2d6f5a329d9315ee804b3106bf6adf38f670526860fa8b0cec321c264e26a3c35ef0273d57f3f317356e6fe0dcdf99ee077d0db23036b85f46407b69330ef5ace4695efbcb4e18aaed8c91b63c522f17be7b6812eeb96633ed9b29d2a83a624a523d7a04640bf7081d185eed6a5d1f44802de9f118dd152946949fe93a337a1a2cef00ddcea80ebd48b41ffcf37adae300f71bd33b1c25bde5ef462355849daae8e07bfe47bcd038f4c26d7b4415f2719559663fc21148504fedd50786a84d5afad443cc8bc4dc19b5d5cfdee8c8e67ed1d761ad4a46dd9ef922950c4a0929c8f71d00eee72a92cde060af9e6e0e37792af38692301765d856103ea81c318373423d3bcc068884d418e59540304065ef25306d95101d61bafb591a7179bc1ac880a74cfa465932aac3f7095acc29e24f35105f1c66c351b56d4fb0eeff032057170dcce043072cd085f78444be053d27ff05f39eb0a3d6460076aa86f8a164ad99b33414792cc3e3b3798ea4727cf6e7d7a3c3926a294fdb79606fb00311381a7d4a0b1d55349832f0ff90e085fb703d435c37ae0fee2f141c9f6910bacd1b4c3634ba5163b92a6ca2fc238f650b6966e6a1d8382e4d045e8e863f2f6c4f9ea14905da572114faff6de1cf079c17231326071dc721d0503923a74a42a41332c84a3fe39519f27a49a652fbff97c93db0861e80e1a712a332908523110eb2681fae355ea1babc38f9e0c222cde47c29dd8b3aaa0e1a7e7db949a24210f897bf15f9a8b3f38fecb77e91b1dc090eba77e8a9fde1a2e89e305bb3813fa8ee5da84990ec7c11060e66565da4a017730e986076dad056bddc7b8862a4746f7c5e943918732f60b99bc60f991cf79fbdd30bd35653ee7ff6c3afdddb7e78cb1f253352f4ff4689270f6708d87d4b085bc262cfdcfba4b52fee5dba8291b552434be625cad349f0bae3c9d0a05822d7b9371da47f248b6cc5b705acfc60d28b852d3d3fee81a22e01b35f056530078472bb9cffc1711b2d54a82823ad7e28dd516398ffe49d079777f8a705ab977194f4ca71402863cc6d594c35cd2a3c50ce346989e45187b2c3aa2e326fe7f0f98fdbde2b04387f27b3401ddef7d74dc2e4aab9a09ba9d46c38f4ce6182becef7eb84813aba6625b575a59754324904f7a720de5d7441f57c7e0443e50c7494053e7b3e20e125e9ee4af643661b0404779c4342110cde8d6c0945391d6bbde299df4c7f6e071c4e4aa9ceac55007ccecb1a6e7f7bd3c3eec34134188b0f0f3d3e6464cf829aadc543087b2cd18137c65ac81f00ee5796ac1adc5d6cae84dd066b5450a8ff1a5ee17fed985f4c2ba98dbf2be1510906bb37cb212d90086b9bd099359c964414a42549cfb2be255e6677509c31fa2c6fc6345cc6214d1901e01e407ea501f2081203493536c40d97e325c7bfad56e9013c146811d4de61063e520996068679732cfdf694b10b6576a41b7d0c9011cf59814a45cab4de60d70b1e5d123d9e4ad45987ca94adeebd592dcaf8e9a6954fe74a58ae274dc7a902dad5a389b6b3f6aa2c333d8b79f885ede4b6c3fd4d6bdb28dbc1e9de1c14aa08220a85531e520d631982e80fc1b34f736d5156adf11ff19cca0881458c6fd455754f6b04b112efadb5e9228801a98aa82c4d29823dfc33b199bf1cf42b13b87948f6dd253b512dd865f8a59ab645c7eaa5ecd50080bb1215df38157084bae6f211a3542af9a74871be13b9ae5c0277c96ec2b1af65b70d27ef15f33105cfc04e63d7588c988fa01832dd07396f8a1aa2eb5177e5599a95666ddb4ebc4accd4fcb3f562d07474f52a48b6f6c26d273125b03b7058d8b03b6fbffa7088b02ca56b96affb8d39e19826842410efe1745bc031c333606fa27f9279e6111cc289a23960498b19456019ab69c6de0848fbeae0f49b49a28adbc27d104098ef1e4e6be4c564ba1b137aea175df1b6b210187f268d262b75c6e6b49e177c80761ff562dc1a83e0f9409c99f8f5475353d364890f4ff64180803dc653e40c6058441917adf429983a494f99deb43a0c841f7a88e9d18e3429635b686d2a72a0fc27140ad8c6b858549a0e7a171f4c7ac930a4ff64a6406bf6ccca1b184f31dae83590accb26c2a9eebf43ab609ae10679d37e6d0e32cf615f49047f03c6ec6692fbf98e1388daf55f2599be19bbba383c64815224fb8dacf94494d4ae25e4ec82e6c91f306163c33c797b22c0f61a988750383f67850db72b6be5ec85f0cdc53e8289e0b044ffbbfd076269e4de94afc1432d953453c2188c1b8207099c09993c6ba67301a80128176bea03f3e9bad690a9bbe429ec3d3991dff3b4c79c2ac0f2eec936a30f0a9012136c718c8befb56bf07dbc96b2f192b315b5864e7593e4f8984cbc12ee8e9c83aa74430d49c5b4c9b3dd8f394c61cc867941fbeccce77dc404bb63efcb0f95d27d9be904b7bf6d206075cc502d104f7267137640e697e3db909fde8829002485294de3e13a4f470682b0f499b97f941d7bb495e97727cfa5e8647c8a9d02c1221a04c44165f7cae29729a864862222ce03afcb24d31989c96893de457b79e42fec4afaa3af3b615b1a4a584f278a742aab6f96a1aeefbaac8dc8746758e816050c9af7669aacb2c6889d74c7f22b10b9df7e78ee5f0ccac5e45ccf6ec9dfcf47f78f5b28acae37bb7e8d9e5d9a8680e21c46f249680342bbf8db4faa22c3887f3972965859c258b048b5257e652f3d39fe7393614e65bae537ce95c81835da013eef3984268bae3b838ebab90687ae27d26eccb496a68bd82d9102470ea92c84947f952a876ca0c3cb84ce8bd3127c4254a30ec1c5484e0b46ed45856a8ff86fd68e69ba10d7c8cf7d31c1657f62000fd1bafa075ebd6a05101da021d06cd62951a607b1576f8ed5050043e45ff8d1e6f600eef3c788784c15bcd29ac4c24e47a250ffbeafa67b6b1f9ab666f9497a6e2e3f8e15943be156c4453d6ebc22b9514519d2209dff1708194ba99bdfd6621be6a137fb594a4d9bb831410c2af0bfccb66aff95a6dbda227ead8dc178121176abe07d036b3615a14e2badf195deba2082bf086c5eef4d40dc3ae39656af00e50a77ddcc5e71c20e027ea4bd812f40d316905d333a8bd8f9ae7e3b78ffefc90d7ec1dac4b7afdb1881b4e5de7174ec7b0e899e88ae44159361d205e7d866d2467578e47aeb22d9772868e1c2eb42058eb7052cbb4eaa7bd492e0d3718496b5368ae79b5d8d8d45a08305291963092464cc9d886970218403be3514946911da342ba85ffaf331980b1e041c205d5ce1b39bad4211d74bc6c7502959df0a4ab9e5e435b2c1d0d2593d46003b964e9f95e1c0deea22d87bac85d538039ffcb3ecc2211a24409ac201bdb76417e9cb53e985c88cd13ae853bdc5ca0bb27594efeb4f7eb03505a59319e2deba3179381c35061f41a7b8ab46631dbafed6fe87512de469a2657fa5c80a63286d08e3395b00e93187ce3a85d644e4049bf179288a2d275e7b261d0fd36ba521171eb63382e5b5abe9c52f0c75cbbf436d92941ced819ee975077c4847b63f5522d340ab365bd1eac21d04a3c7701603ee2acdc90da3a1775a79fbe3876278313ad73124e7cbe47abb4669e02dda7eb2983a94b16d0bd5a4860e3a6635091641a98af62519be63d83fd1ad462b535fcbe632776a8e32b1ed7224b644b3026002f97f1e204ecbc68fca3f6d4a42734fdc62b2e458e3a0acaeb96dee1383f70c01c52407aaf94c831de4f0286105d2b550a82c7a00fffe5c84c63a40374a5f60aa870a41299be92fef0a845d3ee7ca26c4f11f86f7557417fc232a5b3468940479a9a25920b90a338fb57c7a185af21aa607fcb9a066ca85715abeadaf513d7e0bb77cce24d328248c70390da1e1c3177047548090b66a1b80c757a5eca6d423bd3b0a0eba7cdb7941c55a96401eb593b029b76a4cb6db50a71395d290dbc09c2aaeca9936189cb86c2f519297645225e23985d5490a76ab50a9e9c21062bb5dc07d4f0c3c28d4585808ae80fc55213482f1505ffa03f4b21a04d3e30fcdfcdf0b30f7c641302adf820bc1e003539b461eeb9778e445bddb7faed4b3d3903d9687746565c9d0f8c496835c4e30f238d12272dbaeac424aadde227cc2f03bd61ab19218495a5dd68df219ae29f9c3727c1a418d6f968c139fc1ea3c8f0a335ee21614710f57694cc2213967e1e219e09d82b23d4a5785a127d770847676195073219610166575b3d7a05cfa247e97fbbbd85f6bbd53b19bec6b5ff517c84023546071660cf8f5a454fc0ed55023b03c6da7a389371fa24c441a02fef1756a6ffc5f50f341767ba6b090d99a0375e51b195d1916460fda3ac55ff4128201da9ed17a9f4852827a33710b27b89ce9b93045854ab378c8cbfff699cdc057f223387a4eb6c5ce9173c32cd773a1bb03aee488ac92b13dcef9f43e73da98c1dad6a56d5851fc0427eaee3a6267e5bc3838c0492f9bc01386d6d0336ab4fc7e00579e1103db6b91ba620d30485f153f0bd95c0daac040888504ec4beae77beb17486b0beddd94f5cd5bb88505e390a20323104c9a9ab30b4de6c10e70dc9787940ba4c482b2f8bee54a78cf077fe8839288659c7ba5a81a560ef6e1992ecfd1eb23c3c14f06174b76b0b674e98e9d624e8bf463ca5b904411dff67bc0389558a1235088cf31612a0610f9fd08ba1fbcaba025490336fc0715fc28238294789a3a8cc3917fef76e9180ddbee017cfff12e577092c2c25bd1e6c6347f5cccf9f53bb MD = 9570f18459f97be85bfc8fca837e0891ef248ba6295119679280a136d60e57f2 Len = 43280 Msg = 2d819b81df848a0b7e302b768f4748374581cb60f42ed16ac91cff31b9bb1940b77fd04f2a86dc0a9e7b4b14b9ba194c71b4004f7d95913e092584c1aeec4d4ba19af0a02ba6159559345f17f43cfa6fb3e973c4b03fcde21901d13a28d2a529559aa07dca2b5d3517250e882716132972e6ccca7573abdf5f788da40eb34a6139478aecef5fdb704014016e3a918d011774b266b47853bb4551600748d8637bb76856f88288b8d13ccae0d114f39080085bcda25597ee013256f46cbd89190036c7aca66bef1bdd730f52ba9f84432cae63c6854018a4368e4deeda570e94771e2a320092dc2d1e4eaaff2fc28ecf90715445175e439ce4c0fff95afdaefb68d65a930ddf96161b3365903b65575c31baf5f161955fff923234bbf397b2765bc81f75d53b67fd5c8b06ade370281199ef0f736aceb6f4c94bb4dcad0e622fd95b4081618c950a6abf56fd31cc49164f7a6a723bf28ea4107346059048064b69f7875eb8bc6967cc351d292c5f0294dbc1ce97dae73037ef12b4dea52ee6f59404bab4e2b12b390a5723d8dc129bb3c62e038a5197e4d4ee90c40ef3a84a53e1eaa22de85523abad8c2fb34ace5b9a9627d0f2a8e8f2a396563f3e829f798dd812076fd18e99e23c3b0b627d798c72d616ff78e5c4a1cd6ecaec155bf9bccc01e2b122a546d4093fce7d8c7dfc74620b6256c312123a7aff55953c85a05b38e5c367ef6d641d463eac4ed953405b93bf739e7c36ba05d1cf60005a087a9ef80b1ef37e30d0bcc1c23d46f3062c8b2c79b19e4a5aa34afb6851f618ed71cc35fb591b76f672f9a452e92c7f9ea74b56c28420d685b7512052913f1e3b6c2f163edea87fc7321b147718ca28249be2392154eac7bfdd61661389a313fa520dc45b136143acf86c3bb832e6939fef99fc1e89c6c610fdc4f835a0ea9f330daf66da621067acac32419d9f496b178bb8c8418b7a7b8100c0fc403ddb6bed845d2544327b96d036b64eaec7bb56955787c413c2ce8d19cc9e9bbaca401f309f5f2920ea6b761f7e4088741303fc1f3b4d191b978ca5e14aa6fc2daedf630446fc99f6f4a8afa16c181a76e9eb07c01f54eee1707a6adf621f48205180dd72617d9d4fb7faea5ee9852a3cb2391c7debe26ceeb662851dfd53a61c1bed3881d82a5fb19b29cf5fdbd0e14fd7b6e5608740bac9d20a9da301883fa874ed1a3a934b04a708fc05ab2c426636be2a0a70dbb602fa2a3a5b7758073a4cc4472ca37b28b7b6663d354ac221e279d15d33b5cf8b690a28bc67a3e818c09073c415c776099e681db2064587b57ca1771607384c0919803357682f9b02f9fde92c7dab6d35e144952421a361485d35171f2e0038763ae4b2d20621570f0c1a8e470e5949f5a9d2375a2d6c3a20acbd1b3e51157d1bf3bf0ff6ea830685226fcbdc6ed8f0911e9b691ed3a8f98692c2ea3c188001406d98b18bbc5c8fad628506b545304c5167269436bb6086c237cbece02a48ae2dd0f7005923b5dacff5e3a8983c6a447cadfb216b8c9cc91cc26089f430756a2943646427c895cf3302121a4efa8cbf5c17a37685ee62aadc5b09293ed1101f7dee6845be53045620b298c39f28a1a737cea5fd4c8bbc11492c4f3488b620b472fa8a0be76b0b57e02dff0a526eaee356f9891d8808b1e6ac5ab9129886ad114e8f531e68b8b0bab99ace593173bd5b01c1d83d001049114d10d02b36eac01e59d44ae709e4fd67f4218e1702e0d5f7804e19c77d498d7a74741ae82c8a5fc3ddf2f7cc9494fa46d8ecc6ab8e5cff9f1ac7d422c75b840969ae21af410d95e82011e236cf72ae40af20fe7f9d90423b185492b6a6ef37a773e76de93c1c67756b57948e8426213bbfe8bffaf724a6b3c21fd9ebe2adac3adc4784ffe65edf5206ef943a79585b20526a8f8463bf33ef604d3429423cedabeaf5f057077c046739ff6aa477af65d8aecef985aa09f2d73a0928d88f4502e3e61a395b671dde9c4cb09f3245d3464a1b3d826594acea5498793f60916ff1c918dde572cdea76da8629ba4ead6d065de3dfb48de94d234cc1c500291063c444c7677e03028ad3073193435f7525aefb4ddb16637197a6a9fe16f39bd4c8833e3cdf8c78cfa6fd0d9315c2cd66a2440ba0593050f42f7a519794a11fa447349ec06e9538fae6fdd2f4d8c0ff488dd37425838bbd39c0a72ed466911b4a88e14c993c23ab4bf1da409e03c55fe38d6020247fae1009f03626fcb54bf98c32912f0f70bd398c709c3ed8bf5754fe4bf5f6e47521b32c672e2359a8581f33ed4d316c33ec4a830a4cb3e9340046636e99deaf8e6d0c6ace970c31683ff707631c39f6ac3646f968f1891a89479dd89f55c0cbf119858bcd7ac9cd1c88e7cf390630f7042695b73293a7b3e7b4c22686308481c8ad84560bde4175edbc59551a13fcb562419f820f3af5fc75d01b15ca32131938b2739431cb5e710362b45fac4c8679ef11cd25a7ef5b3c5c22116c146353db6bafb90de6490708850260b697b8b68ad21d8566a3b9c1bdc3330df50bcc2d0f892cbe89d36124839b25c522845f753234ed300faba10fc5d3897576587489fcb9b1ead0a01a9e2a6f524b6a1b4aa9b73d0a37e666ae2d9db3aeb2b8a26350eb24c7a5a9f47d5b4526115a5803803b6214fb00b47de8038d8d2a2d8392a26824f2f557de7790441cebea5ab2e509147be248f54097577adc86834d9ed038bbef4ac46835d25d41f7e466b34168ee1a4ace7a7d545d0478d4c84379d3032d309454bb4077adec3b1d390ccdcd353637160118ffb677f6e6bb7bf11be8d38aae5a3a62476caf4318d71364101ef3e95229a3aae52f8c35addac6169aa6ea561f8b2141e6db816cc26d9af7e5fb4b1053c9dbb8968744cab379d2395ed5ed996a6d33e1838dcb6f1f27f54cb22de5b2213fd1cb7a8649bce2e0c7e2cf3d875b774998c9884b3452194c4dece07d68d7a6d3ae6af9f440132156cc9a55a55ea52e6678815bdb641f9726c95dd8b07d87c9cc9a1e7b98d4d8572409e758d71a7e770efa92660504de80fb92290191cbcb7274bc6e683bab126e93a754409964ef3a8746830f93bc95be14cfd7c2e7fbaa89113de228a56dc94de9ce6675b4e4ff5f1a85dcc04b334e38b9a9f08579b42df7ec4402239ec305dc6ea5a75ff041b6ce0fdf26e0f71210d63248fbb1109f5ba24dfa57c2ee55cf036c559e6614231c6fae7be7d75d00e480c6d380ae74633c737b87686b5cca2eaa2905d3f3ea343a2a3e82aa0c46a6d01ebe7208e36da9d852c012bd87b2ca2bb9eedecf6c381917e8091bf4e979abdf98624f1abac319382862c3df7fb6ffcd180308193bc77dbb8f556f4fd5c0b916d6fa8f3e9a3d5a63dbaac355b9310e1cb0b0aa39c65f062f096ba64238e1757fc1ce5dfceba5156155e03aa79feaa220673dedb877c75c7a3c93e7567ba589213f26dfdd16c1f13b7c4c505e98ab61e226f1f81db5c928a412155a1104d49d0439493d68815a97f83a362b010b3af369d616f4f0e72b12b6723828fe3c3658319880a0269537aea076e5f618626001bd5df208ba77b6c1b7434579a28b9263af4213309dba22df3c18a2d72c04e533e7a5cd5d01cc32deaf6f8474875ab26586214a145759e1d2d207b5f6c4599130ee94f11a504e6710a7dd3d42340f5c07bf1c6c75dcd83d2e6d2d667c68c92ca1da14a5682c651d00a575b80a311459f1611ac37ab2a1fe9c1271fd91a0bc7d2db40c306f1f791b56b41f3cf507cf71ca7405954c631aecc3cbbbc15cf59a4d7d8363db56b0f22ab9d9c3132b3daa6b3b01c42b1277adce4c9ff3fb06eecb64384f03ee46683812d11e4983d35b0b11eb0e3fcdf574c16ede9702f3b614b78a0720d3b166cdb39b478a99d516e95c2983a65ec31de4bd9222b9cef195edc78792ffbb6bdf69cc8cc3259c511b70047caace0954b14e0b03bf0f403dcb03612280f3a366d8c4e9afecf8383e0b786bd2099028c9d93b12895ea1401e7fdeef247a0573e87a6474ca6b0a56e60d87f9f347f3a36abf323aeba775b7deda04d756273c133aecd3d3a6e764df8f4a2716a60dff627f88bbebf341958bc303ff837d30a06ca45799700b090cb982e9df2ab403bd4d505f5e8d67d509a616225759643c39646de33cb1c1790cce0713379de6d0344d256aa488100ad7ee1e6192c3d2f410e4dfb746008fde6c0465f0b8d7021d6d4845d11445b689094d25e63a278eff2cd540fc3fc43ee13245e6a7e941d0916e27f9bd372a21faa7aa71d9d6ef6107951dd9d9ad6496296878d06153411ad541d3895693a01803b7ec4b63ef8213b154a6f2771a4a5f5f15856c457c40a690ee333dc3b210654f43fdfbac0c486ca77056d3fe0ddd612a4253027ceea73d6b7b2e5c2d1ce0ce8452c4c9dbb5a93491f117c3950f856433f6ccda2d31dca70ef2ae30bb577a1c4bed29fd18730d3216e0d00c64a7aa2f2139d73b81cb49ac205a9aff96ed44174b1b14de8dccdc2fdf4469f4945db48b9d135c6fa04654144abcd912e566a8862de46db55f4a7ef39425c9c44db90c404f8d44bcb12a67a6331f55b1d1480c3298501ccab9755c46dc8bdac3b6441816deae756bdcfde92b838bf524821ddae435680a65c1d4dcf05f7f833bf88541d5f37fd8c34b49426ce409a1b21f6c7962ac331dce9fef67b8c608ac723a04ef443506550e2395d92efc9f41a4d0be5174a4b93e4c7c4e6667b92f3db1a54a8b2c4d4dd5928f6a183c7358be42bf9acae4c5035629807a3fc5dffb1f4061de7b55e25c3e99b54f665df239fed411884c79b8184babd2fa5c9ae1743867954829879d397a69bdcc2b58214ceaa2f1103ffa2501071b9b5623ae66a2716e6a11fb8a26ee6f4ad069d0f6a7986af485bb0b30b3c470c10217fec9178eb39c07c05b252483078616afbbff2d256711f51018e30b6b70e430c454b29c3fe43b94ddb0223ffe2864b625553b5afcc7426a98cfdad5fdeecd4ce58c329cbded913bf162472069bc2bd8540671d72474cf0cd996dfb883d1c57f021011c011b7e72283d95d6fcbaa24a6c2376b4ba55400025dd6b85c040312f1a44717af422984711b7c2bd32dda9745f94eef5f88511c75acf82e6a886bfcc952990b11582ab25141b57bf59634cbe081b5c6bbd4526d8c4c62098a18f1cd30956eb7905ca4b7ea7eec137d0ea00a9de0d2b806913e3970c77e1163ba7dcb4df42ee1d2557edc635987bc129e069aa4a00f8ce8c7ffc948a5b30e9e78f74049f741527f4ba069e45bef3e5c4c4ec41e48d30c0b7f7c653d6c68c7e25a47724b2610d24046f2a6970a8c61052260d0336185fe14c19d5577a60705d86756aa7c0a0129bd4f5bdaa2f1c6edb22824060a728f2bae934ae01ddaf79028a70a2f032a7d1e9d6dc64f2d9506a90d6583aecc03585b7fff6b4f5791a03079224c4b090eed7a88a9184b6180b25ebee1630fa09d48552f0ce8ea4f526aad73e10544b63fb705280a3a17653934d46da4ae72afc7c7e367c2a9f92aa5bdcebfeb1b6331444587229814fb6248f2d3c1b74a1f21093dcbcf2a97c41312015c054878f0a3a5fdc8215b8e3e803656236221215e1deb12d60e4b989330229e20ec01023333eb498fcb5c912ae689c68bf9ea1977cbf6aecccd2e95ada95cfcdf1d1da3730a9d90a6c8a20305bdccacd52e1b1cb154b17a75b3d9775ba749836440a442fa4f4339d3c135ce182c846fc7a8ba1156e0a4dc99695624e5526f9c76fc9fc60e2b66aedf5e1ed8ab5c3b772a10d2dfac96583dff96ad8693d158addcf91519f8c68d569246640b0675782cc50d6870fc9f540670e3e484ac4d8c205fe00e2200474099b3220f4d709ec4f6624886ab8d23209db4f705057aed915bc75992c96dd707df0c99288833ffa63dc7683378a949456c937c17f343daf1c8dc0baaf6899d6b906354b5a395c1a669bd1678bf96394ad9d5172335503b34cd659f5d919ac2f31481fac186df0c4ce20cfa5c689d1cb74e417230b3e939e0d42cbcb482e96d28d42e345119580721107cbbe75c061a1532a035465556fc7f44f70bb5b1bec7903631aa6f444adbac5cd5022181195aebedba086d03deab98858f346a0761f8b5a3540322effbaf752cde7613c01e05c1e75791aea5ca6eb4ffbcdedb6a19271f845de87302b4ac05e960c0c4025c4220873f7b1023626f5a1a45b10fc32f7c543f15006865bdfae3fc24873c2d1c3a8e37396c9c65eed3123ef4570efbeb20de3e44f40c005ec097cbef74842aa614955f0f0c5953b6c565d38f75e0f8953b45e7b26b64bbdf27aac08c2fa3e242f9bd6587054fd6026bd941dfb68ea475f40fa4260e7a7f8756a342c15fa13c38118db26afc86d419edf8f0acbf1ee6d374c6dc6a855532a0750ab858ac871fcf838dae7f9c073644744a48be3b9ba5f6e3f1f64477fdbe70ae688c17c05c75507845c1908ad9e5cb2856b2dcd00acb2768195c7d8c7b0940274425c740282503173e54637104c8f630a494d026753fae2bc575dd6dd6fd570826eb30d7f3173089ffcdc2f791c60cb4bc5760e6e3e9d3557da92bc21681ff7a9646192bc6331ff5109673c487c957de276455b85db1de0eca603132447c7ea51d9e4be4a8611884fa153e81eeb81dd46c227643ea7f167d3202b56666d81db0425b8faba289625e44b4edd6ce7aa7be13f88d30923bc4cb3ff78006877c24c38ee5ab28bb9346aa76da466a30f93dc5a45060265dcd301f79a85ab9ac50db0888a56702fb670c9119ee13e61b1c2711a891b9ce541da2a2677b0a27df3c89a4b8018de16aedfc3ab45a1af198cbacc9a7225ed07e14627c91d95af9272878c2a662e36f110e5dcdcf852434aeee1515276d17d3e498b7d47f2b10d78dfcee88db313351f7b07974f2d7f857656eaa1eb2d9ae7f8c92ebd2bad7f56817a0341eded4433224bc9655a6b86001c531b30ccfcee97e80eb44a0c947d155cffc92ad37b5dbb8a11bfd98729022dad720780707b49275c8890b6334e16c45bdf94f5d6f3ac58b75b3f666dfc7078ba2234136e0f46f0f6a568746840f8de1e87db5550dcdc854a86ec8e774c5d7bc2e2355c1e4f449f27039026e4038fed158710abe99d5abbb4333bd42b9f35a148406fdd19b1de7c6e119c206f0c385bc15be97bf9bba37674de91ba036b7573cabb6818e8cd71334c6e010341c1aeb4b284aa4819ce33401ce7a2b28747a98dcab19291f3f8b93e3267534204da4f72598ff792c24ba6a30cfcd3503faa5e39b8d193cac3c9f307d09c076f40ac973f26dc45de7b9a6a09d56ca8158509e0121589d045f0c7db2a778a91ed5dcf1255caf809adae50fa0f06e595650ffcfba17148cc75e368be10b791873ed4a84d709671d762e2f5d30d01c62fe138e9ed525cad0ced14233855117f5be64dcea4fa19d823a0b1ff919e56acdbfc885751cf2815061e1b8dc6521572847621a8c56cd57972d983e4922d85f82e2976dbb552741f4c8b521ed4a214399560e8dd0b3359f4499fe13b61551036aaea9ccd8496b12a44a7705d0fcfce2313390bc1f30807c71c46427a9b9f75f6b6d262d34c067fd48304ceaec43 MD = 8ff4c479d1230d8dc53493395e89ca712533b80e1b97cb5af448e0e78fab0f7a Len = 44072 Msg = 7bd0a59d7eec22eb806483b0b95de6e15c142344252201d531fea96913c35a9124335fc11afc3eb2dd3b3304963fdc28088f367d232ec8b9d61d1e8b2622797f7dc8c52144a7cb65b3e5a846e8fd7eae37bf6996c299b56e49144ebf43a1770f2d96bf05227431cdac6bccbeda20333a92ada5d629e92ebb31eb1f4d92c9bd0adda536b4dcebd9b26ed485b4912f6296c160d08781a99d6a37a87b7c3c21b13734fe10779b9429dca128bd6f38b275886be0d3eff15e6941025549956932bc60dba8379687f88a12ee705b38f531d3d938369756a292fa093bf971e04082474b79ab9159c79e651efdb34757f035e451d2690306bbccb889899ddaa5ea9bb8c1b7100807840e20c675f96914534510b7de81fe4665950b8b95486e2c8f05788a3dde83eae5d125d3fe4aa9b643eabfd50787725dc8745bd5060214bc5546f06eb21de948136eda0c42afef87eaab5971f28246940bf1103185d3b49f67e88735bed6246a356da93be62f23cd701046544a7a623357949265bac4371beb73a4a60a101b987457f92695d32dd1fda1ee46b578ae82d3e649394cdc83790a6db18b3ed3b61af8b33196f5a2f5dbb7e7ba0edb8212c8a86e9e77e4248101eb6015aa0227dd37e809bb53aea46333c969107666a3764ffdb4f7e529a219fab7d338cbfc1578386ce2fe2569e1602059af5944fbe0c25dfb41bd4dc46034ae954f82b8d7a46f65aec462d4ce62d2eb9042fe414443de3bc99c59755c66b863ae5b5b3839ddaa06d33a4f27842ea3dd95a96535e9d3b231914d31259aba8f62297f2b12cbc6126306c92de8344db93c916cf8e89298268678ddaf2726669ff32f435a0f346a8dc46dfb64dd85c8fe50ab141e21e69b2384a8d33a42a772d25de83050f71cce047030575ccf20a658630c283eaa8de38f7149b7393dc5e40eea7bcd75922dfc60b078657e85acefb1bbdb30c24930785496821216e129c63de011a232a70dfb87cc6dae30c9d2abf0a141b511c77763583b7c6b38f67b1f4688d138ed0064d3630c36b9db613ae3fd5d663e93eb09ab85a85f4a074462f8112ae4160f63db8ddbb7fc0ee8168b9fc0377153b07f8f58c1245237eb928758860e71c50199192fd617e636bdb06de521778a7cd049b073f6f87dbb4ca992478d7ba1cb2a6ac7c43e721db8c4f78abf0864db425b1315030b6d095d92522ace0ebb9cb2f19d8d51fa11c81c64b387345d47892cb9a36510e8c91ea62553f7f3f1148901c0fc12e0f23c10eb04ab0f4c0868bfc352c149a37554e31d6e74a3c01ecf9041fe4dff780e3b1dac0ea8c810f10fa38d8f3769c29a58814ad37fd33d7d33dbf91259fb22365516e7e9725a8700845d14d6cc6c783f1b20b5bd3a3171f78a8fb166e8afe552d32325fdd16eba1e0e16e09047fbca4ce6e6e7956f6564721ad7f261c2c3c94afd6eecb28dacaf31f7f6772671bdc2a901fe67c1e4171ed72dd9426baeded6061b1cc7706dbb7022852463fe125b673eb48ebdab62eea80f09bd2cec75a8156e75583b9f3a4405da01c92c82f27cc1f347bf72b9b0920901f6ac354cdfcb8d6b5348d2a7bcee7440b30c5819d8c9d9b101b80d5598ac49943ecee7f4b4ec46e3fc1413f0bb62c73be216712a8de9b65e2ca216e6e0e471b2284ac94abcb649c0b9e586e2ff4706b5d70eff1fda8560e40ea415d451e18742fb4863b7bfce9de8d2e3b4e64f463795db1d885f8545e029efe79386b34c962b00f23ea484df4a458f352462750764c3346b965256d03d1719921866cecca3577f6ee177d48f59bd37045ec0373194262a1fb06017cf7f95d3ce2adb690ab8adbfe4d49a7786d13a1477eb665e6cd0a807625ff18ee9af8a64c3534d4eaddc150a7da073356dbaa36cb752beb2621f30115b296d84c7d4e015981a24435e1877a660cc6cd6ec1de088eb1b2efab889a79233993cc211f67e2e7607c911c573bbdcb7e0eb21aa01d8b03ccf20001916f3d01134c60d6e1d4cf784a3a28089f5caf4a7655adf506e752cd2f5fb8a2bcffd141e847430865232b7eb75185753a68a365ae220d8856c9e43d415276196bbada58110acf1029c18b8d2069460ca8fe4eaf8dfa5d4f2043b3e6ab80c4d03e2eccd6360d71a8a04e64062dc7c6197b7c057a8e4519b3f3d3565be6512151a4da0d2ecfd5e71c5918498c2813923612607c6937a8cf413207200f5a4a1838203b2fd436ea7bf5c4bda081c7d346ed1e59f7fe128bea916b3db573afd215de40c0b96913b1ccbf63ad1d79556d4098ffb72cab9774f80f10058b2b3f9fa6ce77191e5fded245f3c674f4f579680be427067ef43eea7424c0fd258881f947834392e31b00b2641d6d93db68ac4a253924d6535a9152eb7cee62f92e2f75749726cc9c4d21d8c3a6b9884555569a191299956e610744da6208f59a8e90aaca64a134ae48aabbd12a3ad0a74e10ce540ac5c2148a2946ad8ea1236e2c4dff958643598da003e2191281fb95b5635d628c69eaea487fcef16d375b0879cffa72867da9dee5d5d207f9ff67851db6ddc101d68e541e734422683c2aee198f01fdbfc0a4067c99122a3b33b2e9f983a5fc259c1ae69e9c5cdd0a3011736e13cc83ccace698f6b618fc60af5c58eb627c70423b2f162b536f6dedb38d5cf9e6a09127a2d00ac6c55cfb04c2c24645db97c9f23429675740f2716d271cff4f8034c24b330ee07f3f54a2922e83369b47ae65b007985ea4ed9c74231b3eded178ef83b1ede19e829ca69f93432dae7e4f16dff625fa6096a1a3e289f0717012293751f623f6a96365b92e72911012414a67a55f3fde119f15df391c5733579419b2a98285bc95b41302ebda98e90696d227323585a1f640a2750444a022f9d9e2d816e183b1f7d72d2a6415eb06ffe17ecc2323c7e4630de02bc0bd8b9edb55ed1e168d9e65245f2c8603ced7f872b398ccd4a457240c695759fac14a25809ac0fb25014644cfbe99ac6750103be38fc8bfe321b3df36e560962f0a8c456e1ae705dec70bef3e77fd13fb64045fd6c8770bcb467e7497049446b9f3c27d0848c7b480596fb3151daf432c5524c2d1103c36e96d179291397b1238177d4af3b6fb9dc622d23ed80258b096be020346d970d7ea100fa7aa068d5f25d02d2d94e7fb081cdde3f0fbd861f2b7092cafcc86cd4539d9d72265fe33a41fd84293805e3eaa00c51557e502537009c0f516b6ca9a355524fea149831677627a6e2b3a7c4ef9fe82d7024812b5bf0b700bd6ba077ffec88bf682c9379e4fba41004317e4945e8291b95e898c01363880c17e3abfe72800695f75697e43a363c69979cd09b76e197c2ceb2dc0be8c1d8dc66bad665837995789c7aee9af091b65aa4dbe6e10af4f9cb226a963561726f17b2da69d5bb3ffd106180dec28e72dc8a31d60844878819dd9af90e6507de1566032aac75a03a06064d50b0859c4374a249757eec7704bda13c458cc4606e92716292e66ebcd3770268d3ac0aa36b4749f1a08f0061d2aebe1237587af688addfd6fa61e797701aabbbef197a2b521d28333f84a8ce59b4dd24b7b9ae51962f59684a6309b77bb5aa4d8d41fcba60bee6163aa50e450196a678aef989f7fee1861f6a35fba65a11a627966ab9dafdf12ca2793a574e321ec018025e32722a880f03431fe6ec77f6484ff0ddd812917fa2e0e48bae715412d40c9d31d14a80ef9b1cbb68f20f382c38cf85e282ea8431efd764e03937cf3b895a65b990056addd373bb5a4699077a1daf3bc0dfeb3ecdbc90df8020270c61880c4440952d4e195e0f2c3b0b124ba9a0f5fcc1169c281bb0113eb48cca714c792a210c0849966ce6f8f45468006b8168abaf2b5086a8e574646ac4a5a667c302bae36612e2a99e1037fded86edd1ca1ed83c47b42f27f1af914af892455790cec67496db7fef7786d32d4e8d60e44c69858a5d6b210e080a9ec5977c2fa7798355bbe48aa8d0bff0d46ebea4e20ccff2b983b59ce4c3f22d95c5eb8aeac147ca70a09847e6b43df543a787f3fab11a607c0e9670feb077bf7d313ae5000bc24a1e0bf93cbf03ba3e27c0efa3303bf65cd6134a0ff93b5f695ff0cdb4f9efb1ac67e4508ebd25fe7388a03fdc0c132b8ed07b17a05dce71d242ecec205bd3dd975313e5686883d13b6e31bec5179f819d712c464bb0d076a22e0cdf51b0210fb4eb8100f04783fb3ee25ab687d848c032c20f1e3a7ca937832c38ed6e7f400dab3614e94ee28e4325eb036d49d776aff4c90ce99248c0791b42585f9f51989f233cb5e7abc10d729892142c349d92178c900ced7e9d7f07127b557d0ead918fc4064d442f6d66503ede763b70b102c0a11ff57424024da811dc158fe01b93a4379bc246016d03a5c0d70fe2249b3072dc7cb1c4acff9223c06f81dd402306a52404fe364a494a39c585c86979e482f5e5b126253f1cb741c63b81af544e525b3247e75c318aa5d4f6f18a179613621063c63ee105e222cacc48fe4c4423df8e0a6e67ffdfb77b3dfb223b36a3b0378dfec1df3f25d83c86799fdefd392b1605548065687b58333d7b20c40cca4469325facf386c7876d3c76470b0a5bec5d8ab786c8e02ef5379c1ff40ee2315660c82e8e61ff15751eb66a486bbbd1f01de3db877aad2017ee228ea500ff006e8316127011f2342cb5bafeabe857c4bfbfd9698b62177845c096703b81ad60143ce6b459eba64f349c11da7769285bdfa934099b68685f0815c26fbf7b3279d1f3febc51d7658c133983a5b4d574bfda45bc62bd74e6fce7556c3138d5d7722c0e27d161bd751353f6d7076a16841738fa391dfb6edb786ae85d5eae77e473aef6299b8f851f0d7b3ad7aaa213a08c7f2f72e15d3e8dfa19375d9f2949a1a6dd13ccc4e517aba2146c493364b41046394e3057eacd45ab7da8349cb232553144cdd8f16b5b61f9a5f6f64db6e11b6cedbe3b27aa014ab21da4a9fc501d4a3c688d14cc283a893bb63fa69ea2820a2624e75bf8a5c3e638819485670cefc6f0d3b949fd249a6a8fd0af20ce2f7f259e65315872e4fc5f6532de9087ed9112740cbb3f2c67654d1e7aae2e8665c0b4f93804f93e6e92fe60b7ec9201fbeb76f19bf9be00fa817a103ca4966e4d2eff6225c807044b6f0b52982453803ee5398f09dd8e21e4d8398c9ef9212deeaf4effb5e54b6b8479ce625ef09aaabf68a575dccd76382d50d2ba2915976c512ce8f86fc38a1c209a8eb990b73127855a00cc9f3340edded38cc36461c0d27c8e1676dcca8fbf27b9957eb6e0dea098a593bbd776b2e7fd48b1cfd743640879bb20a1826321fba2bd29da59d56abd012fa66b0efe95cf959687050b244ab5509d4ea0ebf40778989093f500fd9d25c7e28104cb33b04caba7578e876d3b82071be79c9fe70adf11191bf633c03e81f2a46bad977dcd0749626892d384ff16a81c35bc24a2f2d8154008067a8617788b5fae8ef944b2a776af043878d35e1b3a8a7e29048f870aadeda44c5eb7eeb398fa90d079f028d53b7671a8fdc02036c64c0b0ac714901ee00835f166bb8cd9245d5a9b9fe9f7399f9ff80beab50c11534a2488f39bd7bbb779041c1bfbb99334705316f497e77aaa13e189c819eb54e96c11cb128b228a382859f603dd3c89d21bc56aff63c04164b874491e5485a7909a19faab4c3a336dfe7ca7a8cadf620546f6be48b34935d677f97474cea2b051bc853d4746e75d5ee1b456922b68c7d6d92f3b58f04bff0739b73153ee0a1a33ba9dbe6de1f0b012ba4a2b4766a05f4bbcb809b6838f46ffe4f7a9411e848b3f7ca9a2a5851fd69172864f51e54fd36fd7d94fead2dab3c7610103c8c6daab7ceaf114789a3a74e3efb0ea380e3dca4712da367d47f7ee66991d68704cd224f2edbd3a6c880a35111b1023824b31eddd5602e5f649ac9ee4739300c019359ba96b543c0bb757be21ddee23b903f5e438899b84dd3fc36b4ad6aaf24095cabbaa4dff43dd8fe9ba1e1c9112649d4f566095eb3dbb9302ff9facab6778285b29fc7c0677697987cf0dc242170c8308eb5e603b3617ac32ffebdcde86f13bae90a7dfb1ff37dbfba5f8b6495a381ce84c39d4d29779f21b16364e8b7832348d96b45d4703cf1e0be5e6e0ee0470d0b621f9d8fa8969cd84ea89eafa64c37dbee32ae012adbaab8037e028793d3d073c11a753f93470a53623eb9873732d7c0920114f58237fe92142ed76312c252940c5492f18bf15e2fa6a65403dcdf79b38f57191628da63fb8af15b25ffab29e8be5ea539f52e1ec9667fecaa199a941110953907814b7170b2560c44bce6ccfe5188fa7d6175b2cd2c1be1ee700ccd55e05be33e2e03bd8e44dd7943dd1da221506421304330b087820ad245729e7c1e590bb62e718bae909cf810b7d2b8400e5580a7f73d179e94e2ed4c5383c826c6f535105d0e4bab44252670f5203f2d21bb6f0d369172e381e903ae7d463253ec3f68805e56dc5a0597e8f890681adfe80c7faf72f2db15baef1e77371c4599fab2068486edb621514fd0362dfcf3ceedc3432d30d3c8abcc6f7e4525887a5f7ed79fab7b3561a7b3d74cb8026122708f7a4a0504a6c42c1304a386ad1d592ae52aa453afc05733b9a8eedcd2275f7b698c04b5430e460d4b393eba523d6a72ca25b51ba9010f7bbf4f173301d1d335f89303bc805cd6c5c167a06ea98b16cdaa533271db8a02e64124564905d35636a909b7895124eeec122a69020768f691e22dbce4dbcdd9f9ebe33c9d72be30f4176aa0ba19f906f6a9fc0913106972761e3fb4e30e4eed2d2be62a9eccf4fc04b0204fbd6f4bb77c1556f120490f22d0cae3ab0b077fb4f66db7c0cb791a3fdf0fe51501b58f68c2d0b5c19815cc703854c40fbb4bf2e9fc4dd26fb20b9044f98303b1257156938168b2fb190b13f323685b6372302ad49528c0a7c0f8e9c3dab62684a74713d02e49b8fdf19d982418520446de789a0d57ab0d09a6c59934f915a800059b59a72000424ad041ab7b8dce791a4e79c30cba310205a1f62110db3e12c3aee28a711d08d972239bd0620a2a046e40b8384b43475a0c610f13d0077be14021b148d66bd009046a10998ff3f140a353b85c61897a7fbe5284e3faf46bbdf5fc8bf73fa3024b622224895e01b0b86a05feb1b7d336ed7bf4dc140a2899e355add7282538fc0b2bda5c025489e4d622c5ffead6d7092dd5d68916862a630c0f94275e2fb439d2b2013bb6ec130a145e22303a46fb6dab4c66207de7607392546e010ba7ab583ca51527f9bd239d0d7c89445280c6d0f0402216bcb6612810f499d8b32564c39375a4c54d20421a3c1e9980b5fcafdf9771a8f0556bb31cf2409622d74196f891942e7843bdd50dfab4a189c7434cf60b315931ca8fccbec0c8e1840a54a883919120d5600e72e4f3cf5fd418dcf490c60fb14f9e8b147a170e0a50af072fe12ded1a51146aa24ba1df12d42d325d4c527d5fce53f630fb4f808f3d47b1839dc118797fe38ad98e7f64692e76dbdd952b0aa3226d5998aed4b0de8e56ec4a15f593dcb65fb78f39f6efd1378831fbe7ca2829e04d1db201612f76e87f2ff9e625ffa288eba939eaa2d1c973c3fd4ed0ba56528c95bb139f5f4ce6c002f4f98afcac698c09b87ffd0dcae087cc763ccc7635cb8bb9da43d549a9bc9994c3ff70c43a90344c6da80d923b84d804354c577816e3624bc3b94f9ab666f9a7154234272ac4f636417888ca9444e90dc MD = c4558c7ec68df61d6bb65238397d49cc320a8c213f7bffdd4a397552d83ec20e Len = 44864 Msg = cb7090f7a465782f680fd44cbc558107825c9e53f24e4140ec5b68208cfe33e8008250d996c4b65f193a96395e348eda1a62210ff69764e3e6ccf9c0b66841d6e6bfcec0b7d817658673701d594a3916b89855f5bed8dec06fcf16fb4ccca111252ff2f62f28040b56c14a42d41fe8820304234d6f9916a0306ba71a77b3ba6166daa5c2253ce317322d0ceef83904e7a4b0735e3463764ad0a895655ea4f48e51c9cd6bc19d1d52c1bd9e6aed22f60d42a42e7133bc6588f88ec6242a27b75f8d03533a2dd21b84ac7be8feda6225bc86e73ace942f4b205026239f02c46b9dc39020778e6344759a6fd3f1e77ff8bc178081bd804191db7f77941e0f0478109a791b6a0fd9ffec34a0458d3e03d9d49f7aea861f7c9d812e8902e8786e4780bbc52b5ad5bbb6b32216271804762fcec3da5c709867d8da04655346668b3eb5cd7c3a910b91d0900bd962db645e61702daac1c4148aaaadaa12718001e1c67679a72f55d7e4b54c97f2dc1e8445d98385f200cbba6e7cc4c79842de70fa488d674cf1ef613accaf6f687f298cb2fece72b801cab39ab4e50400b0a7dc5e2ac03e766aa7d21e7f803b433243a52e381b9d06ac0c2696bcd90951a2256c93d6d8a62a81c452153589a28bdcb5f740ef30aee3e9d83cebfa687d93ff9e4923b29d49721e9008a957904d4967c8a9708bd64c58a0751c20d85909cfb15b9a9628d6cc5529511d614b5ee485bac1e34674d51f6bb92cf0bdbc76540c9fa488729e4ddadc8b50b9c57abb0e45bdebcf4b13f5d0261c45dd4b10850752b1c13b417ec8190d2ad5025e4c6e7393588d9206cefe0791b1080d513b4fc9a9cff9da8a2f1031f2ef2723b32a41bc7673ee57ff0eb76bb361bca857a59c431ae1958ed619edcb93c290424d7afa91f7f65744bf3ce9a59412abd5e5b6341caccfdd7eaca4268ff68c5688b2a562991cc91081cdbe5c5d3cad1bbd84d6defd688119d3943885242533c21c6c14417defd56137b1fed83ab41b5588bb6d648e54e091b4163dd03328a11c26032e5fe57800928ef46225e40342a15d13e38c767bd28d4abb1bd06305bcacd0fd5a8377be33eaad1d540a04310c466413a01f5ee24054bc0a3a4d5dc66eb940e40277dec957b2bdb43b514247608ec7430ce4ed93132f338c030fc8739e8d9e3f8d01c0a15233e5427fc0454c25bfab2b90a5cc953166d7c7dcdd4d12346e139763eac64f0eb24e4e8720b64845223a549228a2f08441cf452e8094ad17a5c773ecf997da717a1f60bd383c43a7ff9c457c3618acf307448e62c1444b317ae15b8ff8dc4a65d2810088d28046339ef986b497d6d265025d28de6605f5693489d7b7ad3ca7d1019cb750b42958d14678a0a413836ac478439d0c3781b2a71de970c9e260fa9c50970c7ea7e0826941411ab272c77af7b21d7553fe5d8ad37b26ad2e5def4bb0079b8878734dcbe3d57d7c487b4c0ce6f814361a814485d6976b174ee792a0f46ecfb1a7e0173b274b544fcdf7b7277992506acb89dcac96b9de349147f10350cc5c1273b6e7da1eebed19a9afb3d498c7f898cddecd06fc29a78f6047b37bac6b693045bc64b1aefc71654368e61a2be035498848c09bf02eefad21ad8010f0911f9583bb37c7c0c807b805edf8011a252e04648f5d745b11de183e4202cb0587a6c8977c07243d95d89c560592914dde0c51c97a4b98231b9b571dcedeb3d1952551e7c47dd10bac0c989e775cd3ac53f6b81fd3330f32914ff22819bfd13d02c4b9dd5e41d51455ca35460cfdce20cc15c2ce60bce26ebe2171c5ea4b2b3118ad86df11fa383ed73af9b48c1e8a8f9090f63eea8f18c1e93a5d5e0a2acc961d054357a45003737c856e51bf6610e3e890ddd73853b91259c13e5a4205b9525af775ace0ed3d9a8ad31c856c7e67021c3dfd0214b1ce4857df9a215884fb4f17a8a6468d76ee9b4a4b8ab95d0d97d674bee12544515e4d2bbcfb1b144e9b739c435d8d73961e5e0416405358bca945373c0eaa91da71081d7fe8b0400ca1a830ee23e959f3d6ca005bc6bd2633a439afde0ef7c3f50f617551ea48a26513d51cd17fc208351dc98543a55d8f19909922cd6776a24941407a59884b0402fbe2a916f9804905fc43dcf6649d5a16764dd930a48df57f0e8d75c04a212c8a60b61ce2198be20b7a1e4e9b8be451d45d3c1c304aa6863e7f30aeadb832e2a64b3bc060684b9bee9f43215ba2993af84d5033f5e3281b2f9b126d495be6f0fec358dcb56d293e56739a9d5d3226de2d4e7065a6f77b7df96a19fabbbaa61d39d0f5b70cb08b91edff0b0ccac2f205196984fb6c0c077445f42e9c2c5dd830007afb9a8bbada5e584a7fb4c9db657664a5753d6eac33c8bb423a9dc4cde6f2faca50cd5a127f6b425cdcdf8304e7fbb70b2973d55e6940025b2343aa91362bd0c7dd98a240e080513e0cd31fc5e05abaa189e5c8ab11a5c347d3d7073132a2297a8a438bcd67672df7f5d8c6a6b85c14717ddb701991bfa50f30a002364021aee940153c407be77f8f8138a030d7c96d83ee9cf432525651ba24e8c427ca6e071ee557de2183c7ef0f9739d4eaa6696fddc2717d7ebc326e5096f5758c3752db21625298f9e9d0247e1e258b5d8b04c089e3a23384381aa5da6d113beeef95d2f8a04b934f14cac7e40042ec0fef61088f37773dcc2cd89e5e938241d35aff95ad868df6ab6c7d7f4a24d9208a3b49f0f5a837c4de013200e7ef90adc6e058cc48fb5fea9559b0f5b772314e56d5841fc51d2cef4320f1747a6985a84ce9671fcfe9089796432dd133d2949ff927da3f077d9ce782efdda121e9a759efddf5344c37d1243592babac62c483bfd9713f5c1b2d0d323d8bd30e35740e93624cab6c6cd02bafbae205879689649ea8ff6ebfda310dcae425ac8c99b967fa926ae4b4693e3806f002654536ec6f146764cc9c238a42aac957d12d99ef144d14b699bd371bb9f19ee96565c26205d9bb4dd361959d3e4a538ecb51d469b6035fcc24f754fd43e81e137059d79ecb270b171db08eee6331f95705a9d7cdbfa5e9f830f341574863042d00a1d4d711b4ed4d0609adf253ea413d0a96029f83ad29e728219abe49fad772a0ce58cf8bebc87c16cd414d82ebb1ad6496e333b491b5f58512bf96cb080ea0db4fb1cc9c342320ea7c076472aed1248e3cf84ec4fc14cfc2473e753e1320140aa69e72c53683b7dbb65ebba5bc063ef1e8c0253734acb28a1f75ee35c4a268d9537d36996b70bd74dcb5c78e8be7693a3ab97b7de4046a273c144624650c0ba1e6bcac7b3b60ae308fbb2cafa6fb1fc19372a62b82a243340d98319cacc3790ec0fb38fd2eea06b91fcd3f8b95a7df12935a29a2891cda3b14501500d47f2d7a82a750a1de5363593d6a94a4c07433b7bafe9a856fca9ba6d0fa84f3a495b57f9c5fa7dba25320bb4921b07dcfe69a2b6ace6d46bf320401d3f5e5d7758d9d788e72933d136feb39c37107990c859ee833581658ffe9afc68db0dc3ecfed421fc98ea738b9e00f5f4cd72e691ec79e78951a2a5e9a67fb7f7ed9ccac3c2b4fbfee025840fe7a29b645d289706f23355710831daa2723739717cf3b7212ce22e36c8c2af86984b6b93ed1ad41863eeffe262164de1eb2a4a7f91fad530c5c4824b57aa3c183a622f2a8830e5efc511ae85683946cf97c0b2c933996b1814c3bee696c373ec5451add0335211b2a3062a0221830c94006238f66ab8c001a248acae8bf69b2b6e7fae2ef868a18a82343b0096dae957ae76a6ae3e3f1d12f5b9124c402cfefc1154f9ecde5add9eec03a927cd2823402866c29bb816ca73977fb967bd4be288c33858b1ed100d1768db3b20d0530379f6985563df250f4d100369a8083c90f70f9391252e72791c7f24ba93a744d127a07626aebc5534c8e6ace9b62be850707acd6df1a86969d6b746ef2758e4d575ae66ff25558c800ba3e1033b2e366a1b8e4eb4bd64db246c9ba99f85ed1a5789a9d2a66fb4b33c3fce0c7ddc170d2521d27f2e3068b2f307b0b695556dcd9e8b1921e435e1b3b18bf0942043f057caaacec6a2f3bed41ecf80d3983ee1e7f3a484bb811fe272241890e1b418c1fba1dd0b8cdaae6e2bedeb92696fe8504f9efb740845d4c1dae00d365b010290e1f2e3103a9c087e9da7846ee1e3fcc2ede7ba7070f8fd86d22c936b6aceaa67f105e46536b1a9f81496c19da1bc2240a91506015b614137414fd2b576e5b84d13210793eae13ae37700cba613c201d06b720aad314949de1192f19fe70cd34b2f907421bcf36348ae2ec9119ebc427d1b44ebff5a78bd82293d19ae250ca3672d98549716b1cb2ea068e467a9748c4ca1d4d47c3eb6442c7198716c98add1abf582cf7e5fe11b9d37f6442e9eb08847e56aebae45cb86e3d1ea2260a8b6051f6f960c5dff4cfa9e5a1f10f1e439de75d04e581cd87e2caf317d5312bef1e6ca841b34bc5eba1137f12c7135e3d735de48c7444e5d98de9879972d0b40241db41a5b6e23e4f30872e5658e840351358b361ed7cd3ee243a79181d8d2981852e51a9ce31bf9be86571c129065ac718783839c3820e12104e361837bef2c952c666d27ba2b05e433ed7f7b9e6146fdd3ce158690cfb020c855d2e43eeb6663533ef9441cdc702eb83cf6e8e1ff39bec075d627066311a63803caee4a4dad497075a83a31b5a261bd4c6aa080c7ed7cf77fadc6c3636e7afcf732e7c79d68102b146153203e0348e926c1eca441cbff20f481aaee572e65bb39f318dd6401802b210bd512fffcaae5d1e51475f6390ee2dd3c1cb0c7b92f1dcff3c9b228df6119a790092e81f34e5855bc601a6da073e541c564313c77a0ccc31c4271746a7b9cabd7379d4b51fdebbb3017bc2e69f4d22804ca983ed07f6d1d55ca40cd0a965d37c8a786e57f7f460a288382c2fa5a519ae1960e532c96abe385aa47bd277903524ba012d8e39c104a8bea95b0bd6c09a0440fba05f3ab2b1f962bb0cb29ed3705486c69abe71cf28343951c8018f4a341157ec5db8d8798d86f93a08078baa157a751b2e6f2c693be37cc40bb75b8c6863c2b565d62f29817f82a41627ca8e850509816126b639c034fd729e83b821b75a15e9614dab4d3e3193abbfb9e7eb5f82c88bcb6bcbbb45873fdfe8fd2184a192d5fac875e94f344ba0936d34406af58216bcc5a4c9684c78b87e838a242fa77c675c13f545b9d42c3e0d970d8067f771887708683bcb3577fbd0e6c13cad39955eafdc226d17be61c07cc5cc047cc5dfa26cec3c9f5ea1037e799b28d777f86c304879a3abe3537aec6381f66913f13ad8e0e988608d1fb9c4db0937810a346f60c884efaea733d5f65453f30ac80a01b07598e22be0f1f94377c963c5eeae2d8492767cd1ddc01182b1a46885f360c2adbd72c05df4d8508ec24434129f96150058d6c1a1e188ac262e0bcd5730960c450affa98333233e1b5d122ef387bcb4586e1e54bb6d0e14350be277eb1a3a3d0b00a804181673305daabbcaf551628a1164c5bc7adac0c853ddd11eddea9dd36410f476993938d5ea3d998e74672814bfbf655f6cb53156e73640189c5c616de4ce7d6792f5f47d357843e01d438dd2b7d065b40d76e03e8397c80ba2da057b018b9b5d71e736b4b40d33763c7104529e6a5f50d9ba4dfdad64d15e8dddfa794efae6ded277600b0a4ef0a77e7a1c02d7cfaacc5dd9eb02b93fe487b9e2c0f7217ee852214110fe9ccff3fa3fc94561f892e07d066037ec5b8b8a1db382f9632d9a085ddaceb9fde002c5f51cd900fe753688f96fe7c528f8da2a971738f44bc7decf588b6adb877889ef1e8233ef46d23d1ca806cb1337159e5e7a317f421f84bfb5e8afbfe629cab7c7dd0c6460c9a409142f47a49295366a8e3daeb0836ce8bf5484b4387a635b2ee8b707e4f6054f4cf7f5beeed3c1dfa14267fb8708a278402393355ef8b2ae51ea4321301f68485b3071e914475b75e5137f846d725e97f48bbaafbdf1a638c314f7d4c06d8133c6664a32bf7db0ada869eaf5de310fec4f25518fbff5ac8ef5215baf2030ee761101e5484ad76fcb5dbe40ac53c524c9b2690e51ef6534256a77d4fcda39eea3cd8bb98630f4f7639799073458bf3bd4c0cf2792c6d0db708580fa5a58b920214e7c5d692c46d61ac882a51a778fc381ece053ced0b91114e8e53244266f1193365c478d775d9a3572f3b0cb1aa74a45b9151972979e6367071d2346cdac416df793ee5fbca992682974a0c2cca63eb49805df0a75e1410b628133eea8f12e1614bbd85c66ab7d075e8dfb8df7fd2f430c0b1b03063248567dc9ea8852fe3620104c8c0fffe3a8b7749827a9472c7a75a7cd5408c301d7fcdb4fcdc055f408106cce8fe702d2b3ed1e2bcb9114b4dec0eda5206836c07e52ed9b44032c92f26bacaa3a7dfa091d1ccdc14de1fb169ab9302ae6cdcbfea9fd3724e3ed315bb396327842315ff742bae5f134f864c25cc321d74d961d3cf9404a8533db2ebe9a24a0a10dadaf1dd36bf923f750ec58837335329b5d84dbdae09a34aa595f1c349b79cd135f51ed2d9499e23b87fc49ad5decb57670ad8bdd4298abbdd45d25016f1054e9a302f5efc92ab4481a0f0648c7aae8559bf1ad6eead852e4f8a3498f2426c0f7251cc8687e3e02c363af2ed4551233cf2bfbb10e5ddbe2c622bc0a4c3f0f99d26219c54638465624115713ee9a953039ad164739f015a3c7ef21d7b7344d67f1c6848cf76bd636e08f9165d5ecb6662b9bfbd08056184e70ba5f325e886283dbeee77ffa9d602d9f5ae89548eff83e1b74f6dd6ff4562b4710decab0cfe1a60737ad2ede51669296efb712b5f8dd209fd4a1de576f41c2b19f2ae14c5f4d16fa2d601a010c7c1e9ddaa77e8bbbc7c61f177743e50b7dbd4691ce168fdaf78f2b5c8ab20132f319ea981429589d5a972fca01be877d6c738ca522eb09b78357113197876d796e2d23a497b39b12080c2878bb9ebd19907dea55e3df387973075249112a94346fb0cf8c9c9dd1ae52adbf801f7504847c44e6006b539a954938550f71ec13e86a5d54bcbd588ae6ccf45b8ca7d1ec32a251165133e8ae9f6832aff1547c7b29d08b49b15464254fc958630aef25d298853ae1a4c82ef2fc72aeb99b132c286d44b315071c513f4dfa728c775fe1664aa75ade97b266f630db05086948abaa27397d4d2a5fa04775b2bb3e4e64a505bd8b4973966d5136d113de12e86f5b8eec2132689798c1cc3b94aadf1cb7e13f65a38f371d635e2351bf727fa4e1bc25208e8aedeb72464c1412ba055ea42671d772849fb93eee4a37309a950b6a6e3b68f3df4372569e2593af713780b3c55b878ac223e65a921a06099ef99843b20029d3b81fd8d04a074eed58fc2f817e4afa5ee04a2140ea2122bd0823e8184831e7b09dc99b59ca6f8a3ee9b9b78791dea46137a8f67c46ee31dd5e9a5752913f271d18d7165dafacfa269bf6b520b0652a346096d28748df97cd1ac3828d2d866c6b81def6766a6df336f839a4f74aacd04ad3ba41dc5083e90eb545e6126db63c4e8137a82e7b2129d287090375c0e44b070979c0f60e698a34c687eeacd23cfb189f7797d05244e2abb0db5d26d3ca0f0b8a5bec5ec2ff1fb1b70028970b894d6c252562169067d2051e272e74d3bc70cadee700912eb30e181f55107b7a3987bbcab7836bb5f86c811782d40a413a34c76f91ba17a233d9da67ed32b49ebc5e89f8a4784a238516a24564fa31bcd1bf73c4e2856cbdf0077b193f0bfcf98016492772bd2c798c64eb10541d9596f16572676fdf0ad2561b7cabc1089f0b33638bdfb8ce9d287cdbbe10b6aaa07047eb25df80437caff48a41b829b53 MD = 7ebc665ab5e5a1babbbae9e86bd00a09bfe68c4ca91b9f0da092c853c7732c3f Len = 45656 Msg = be105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081b0390d36fc5ae158fc65db5870eece0fda3f72a6d55559b3a82c24a41b3df6618a44292d374640cde4d31deda28975bfe4d980e5d70ef591f68a35ebd953c6b34dcf0427aacc132761c31897d55ea9056c37828be5e379f7ec2fb42aeba919be246306ecfdf342ac9abe341db17753289ae2de60a6decd2db2a2072afc47d5cb35879743d7c4b6a5b84bd949e0db5c719761fe2cc306d97b716b98b3b233e422a8c31ff5e0455559e2f36fe10792aa288b3c48b7e36386295113cd8db5772c0ba69f06cbc1800812413d5eaed1a527959efc26c9affeba7e7921107fae1b97ce57a4b48a227db816fdb10f78e31bb9fff628ff29cfde5ec3121dc85245250cb2e25992fdaa434baf3dd7e807e8fc4ab0be483aa0ea0b5b4143905cce219f72006f4606eb02daab22293852228650c1ee1ce541f6a88e973d350136bbeb90b30128f4791bd24abebaeb5bb6936520060238867bf3b36efc020ff8bde14a01b6fa33ea5456c19b6ebea8c87a202e7301343bb3505eb0b371d7fafd5908e7f96336b8b0fd6477d6a1758b08089289529acb4df428014a66dd031e9972f76980a2fce0cfde0d9d034128b9a2c6b01dc4b91195d26ba2278e2acfa2537077799e5b93d2ce5d19db2835205d1e1e4493d1464c3cd4810aef333f83afb4bc50bf5c7644b735e44fd84f65a29d057714928129c56983d3014b5d04676c43bc4ae2c1db57b78dda783d7fb9f9a1de38eac3dd4ac44565c74fe31561c20288d92c8bd67314f95da75cb1c1196c9231cb8cceec9190f804c6bb5e623ede980b7bc061a224c2a62db2c3dd1c6d42988797c25ab7e773a9e8390e644d830157550bcc0d2dd7abe586657568989dc4da6604560f4432b3819786109fdd187467edef19367f7515dfee2739fb3d913a81597a0e979d5c99a79b1789b41ae57fef5b916f85a1e449bcef61d93e1432ecb4e561b497ca4b6d437c52414e0cd36917285896a29a0e8fa311791bd82466219c94210ebad1e9777fc0a10013bcc87c09dbab553472d92ebcdbd8c87275162261ed22e5a5bc1cfe81f16b8dab31adfeeafcf475e3312f7030d5e6a8b3102b382a78cd000393ce4c719617b1bf736b38e5139abf59e0f79b27870b8244fc8ba91fbe88297a5ce6a778380f34f78be8721fa905f83b8719f8c87ab01fcc4120bd6a46bc26b2214c58be5ebadefa800ef4c3459ceb342c7ccf3c353b48f4e8d0be3098d2c055e9e8a76a908076715ac405f770c95fead90a68ab4016c364f885f29c3d30bf08bda2dba457c9c60322f1eee3b1f41b0595aa0a3c24a758c37926a3d3bc40eb75a4623e9639fd9459df7ff8b19083e82e6944ff176858d1ba749b17009d690c44a6101665c084a91a9955688695df8e0d5bc18d659490f5f0efcc96496912e91dcb94ac3c74c7cdef585b898d4970d5497607fd4e31b68b0ef5a16ad6a7a54ba61cd64841dc2cc7802579a2eb339e858abfff97f9c6345cbb8b02dad0df89fa8aa0be329c801c61740797facbdcd2657a4091a28fdb7130a0bbd72d5f9a26be6f5f35b176e8006174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e90272c738aab87e8d80107242f1aa6c800b0077d9fdab62ba4deb06c92462640b6367e0252fc9b9afbe95ef5405f6cb28c2c321e4e16276356b751fc828c0b6c9b4805307a6e8cf26f1e0cffe32fd3fb3b7f17d400873bf43d334ebb29f0d52c0606cae64928e456fb49192c5fb2620bd552be85fe55794621f8ae8fce9b0be7c117d40d08532a3069128e62fe0fa14b224c2d1a91a769c1caae7962b8b4350492252b8b0016e7e77f20728b066f1821ea166e7cffa594ce00feb81b3064dbed42d5d84a769aa2e3061ccd8ec0f950f6f4578991907981d38a9072a27ed3860999d1e230b506e38cc5ada75374d6d03309b884438e48b83a310bafdfea28bdc05ec151270483334a867c09c26a2d203ef1e169793f3dc269bd1777babc8c097a5b4c2e16aa3918850f31fac3e927c9817479401bed7d26caf65dd31b3b26f19f561b80e4f04f1ca52973833e3aec526259290f10de336cc3a385caeab01ffd9718d64f7b1eeec7129ceaab1ba6a3434b6a98e0425a851dbe8e37650f639eb5cb6924a3c27c3da034303f7a42737525a36d6eba98ab9bc0227d1aab729ccca2a110ad85a151652f74ad1af89be9897ed22b55a6fa189edd5739d6a4fba3d04b82d71afc00e78dfc38da222e0f5208d9406cf3aa50e8b6fdc58a145893bfd338d7841311c784de90e980002384f419bb55f8f0d182640aa7d4377cd0203afdf206e03fcbde718072f0675cdfe319e5ae7996f52079d4c363ec0ab5138b5a750079b347322ef69a2ab357dc6b150793391410aaa11b8008b975c96829bd6864ea96c5d24e9d5a54419c182bce01064ce58e2cb65b51af0232d73d3c1b9dabf139c7dd892814e7d73e1271ef108e6038384fb3c25604aad9557a2edaf0126d457473c514c77ce34ba97c2cd13aa65b7ebcbf6c759b1abab4aac664e9b006f4872301431a33bb97d80b440f7853304147f9462178317d25bbba24a61263608ae0cfdb204375bb4ba4ead1e38d631358ba764d9872201333180cfabdfd12087578ff682339946247dad18b6fb77339e900bb3a9a0c71c62ef029b17251c5e5fd763b1016a1989ad2a045da7d9f89893b405077efee2b7c5c6e97b28bb682e16c030b3bbf268a4a351ed026d3ecb0eb98a3be6a5fbf561f07b7e064d0d653e30846f851e86e715ab97ef9d73a47ed4746518c7db227fb9675f68b2e0b563fd41b6889ba572155b1a3e548557a584a858e714217afd020c9ee51217a02e14e9aeb9047dfd5e83e393e7d46095bc6ce8eb82b689f205fd0a0bcf029af7e1d891ec1e7b826296b35d9d16e7a59a53a81480ca9877fcb7f100326fc2b3447b2f748e49566f81d514179a3e06dae1f5b6c9cd210261e78d6eada739db0732549a1019ec1d9be77426b01fdfaa57193d29672518bcee4f10c650decfa3fd3e08a8d2f359397de00e8ba5a27e4ac08c74608b3d23f0639fdca8984d93c60bc3f1cc5bbf2342ac280e8366a69c70add8360c8459d57568563b85f28828a9b960ca8518e1dcc1ad0bfede71a0bcb455691c8e012faf94630ec7deedf2e0d79ca0dd5378ffe82ed72849dd6535417e7ddb8255701314e5fa260c13f9226ed81be0b4c81a5dc7f2d0f98a00afb8ed478d9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714ca87a44515a61dde3d0bfbe8a3c90492fbc0b28e5dd19ec0a5e0cf48f368e9194d7d76738b52417af02641b95bc34f181ea0d7bde23bca6f64f134a50b2df513c261a1caca761224515a8dab6362cdc49fba943b704cd554165ed66fcabf8f96d1aa92955390047ce91f2c597b16052ad7546471b883542122803103c29c1d14e3ded56dd72e9ce72fcaca2e035b89dd5e24b50b0b8dab5921fbb12b835222008164e6de95b04ff58e03d3a39cb1c04eac922261e9ba5f5e9d27e3317d60330c22d353424fa3a21a9c40d55487974ce14b332910e397e4c3ec9b53a02154c47a50b08753359717e8c3184bbb849a8447a27e359289b4e00b98dc6f020f8e5aed93730f6c180925c2aae0a332f43a0ae45ad9d4513c8fb5a84a51b1d1a8ab6ad8539168074758604abc30786556e44549ccdc81e78c86fa2c4991a8997d0a78bd19a21daf44233be36f8e37cd4d27d7da810ccacfea49020a4f22dfb40d4a192e6e1b8ceeaef83d2f3d606dd5177317291fd12b74e63481c4a37bb3cbd9d8a08ec964522fe825d870be4d8717766497c7e1d00070f0d7edddef02c15b5334c360a422f9fd705a826a6aac200eba6aee197f6ff63eaab1aac89a5e74bd09fcd64696cde0d1e7f4ef7ebb12a51583f46e906127895874403d172df56a9b7e8f7da319cba347af936420380792d643afbdef0f9d1638de02394c325e0f61216b0df895a2bdb947a484f16a0185cb79eb40680317496a587613ca100edf98832e2bc992f99cc130a6c654b976da6fa7359abdb44c7f67642a51336f7e57bc24274ba8aa26ccda0b18acecaefe2d3d5c1d1132cba344aa918d75faa92314468514e1f843c0ca7e3788ad0bc2fdeaaef9106869919215ce512e0692559371c21645833ae83e122836654b449e0c9f4f1eadf4e4aebf8f2d337a679ced560cb95857a40310154052984d1c298890a7982d544b268b720d51a8f12d7cd8d14186dbb9c8c353ecb1a7cd9e741d2b20b014b591df91b0601cd63220cca4b09bccd510fa660e1c1af27256d7f7b1ee43354f47e526c8a5f03a156f97d9b70d2beb0e88780045d1269f5cb4882b6a5a5ea39244ccc53de4a8e1b9a1b4b93636f848adb2e12c0d2b95f4c1773d63b8e80987a83cc71f63e4f0a01d89060f84d687422d10945dc683efbf3b1f5655202faa5ddba052a9cd3f7df1cb761a2125546f8427322ff9f462aa4b440d61542299d7a2b71ffe08ec5c97534e095fb2ba49077b0698029539505c1556c1ed0552af07d2b4fc379153b4e3511fa34528961ce59355a2bac3e7c55bc9fdfd67dd12e7b17a7fd58df775d0c857aae478e75b5890599ef2c6ea824a4fc5a3e0604ff5cc7b06523c6f8fc548dce38a4d49937c847e5a4cf8a59dbb479e94e34b44d27dd5bb12f6816aeee4859791483e65a17c193601ea24d541e555deb4267ea3f91d8bf80cb744fe79360f6ecd3f482b95dc8f2dece127e46b82fd76a007fafc484767c8701f0798d35c5ee91409eb29e5007eec77dc52319f2696fce4e250cc34adf192d9b849d871a9fc9cf222a7df139a30e84f36347b4142cad7ff5010725293a1ed95fd7c2bd8a150d0d403fec9a60c7da7bf895efff669f1ae6bdbaabd06aaf14f51792f017cf4f44b5638605820d99db15540325e22feb3d696df8fdad546882e8895c2f7d3076f52e53a6d28f884198bace54f045b9379e71cf6507a4318af01a7ede88d7f4b2a9e0d8485baa18e89ad3303059104aacc667a9a7d09e4740e6f3bdc0020d642ae733ba14a7bc07b667c64041662b2b723cb1c4666081e0b0eddb10a9a607c807378fc0b1beab9bd289fdc72c217ea4b088b9e84bc03742028c3a3d417bae6870215cb4c8a8611d6588de8c9c92f2fc8e33e5dcfdf7a6b55f4c780d3189e88b8e2e025c006dc4d496ead35937c06d7d35c49f6a250db883efb4fd4821d89e7a89e5e9800216be0a8e3943f4a5b3d86dcdc34e586b0b53f2d94c31b6b871b97e88cf79ea76ab360574fc96268f731c157db9596f76f8614c469c7d1e9f5b1fddb3721b610232130f71bc33b79d091fbd6e2d2a77efdcc9d75d2d474a7e9ebadf335835ac51b53f6ead00846f767ccbadc8a728387dbf73dc4786f800fc4370ce30093194093ba16a4f50f016c3d4072cb2afbb7ac9aa47a22b2ff909c1502bf0d10c75e1d3cd214d8034df732b19ba8354ce4b047ba42d7332b1b12d76d0d28f3fe86b5b5672a75d6735b94f5754cefbd78b409f3ab60d9583938733c3c84df1a22879c93b321be42ddae772ee8d2ada636f0313aee7cf51485de5e54f42845e215109f529156528f9accfa499cab6681f01fa28803f5befa6983209c3455f20e4ed82a5c9246e72f432daad00155aef34c98ea558c699b7c7cbd568c6dac67e14834ca2c3661c0945f47054ca75feb5ca4f2754dd8572f1d37e38ca0108a1bfd99ccfb4bee45837167afa62a0f38a03071c2efbb883cce4f139c2f71bd7d82c5abf72a262a40b428c4ddea02995e62116b7096391c891d94a85dbb6bd4f530dc074a03658b01b73d1f486d30e65fb571da822540e5da71806e9ebd08f79faaa3244be36481072120df758c6f66bafed4578e096da49f8e94cee5a0e385cb64ad9b5356bd9caf66767dfbe408aaeeb2ab5aeaaf09b946a94441a913661006d36dd516d9db4e891b908321f087236985896d2ea2bfa47e76018f8f610b16e08b765a0ce9481712a52187be3e7550b9cbd0f6c070f9e695697ed0df266d1ad70139929c117e76ea878be3f71a5db36e1a14905696430029e7feee3eefe68c58b92a274acf08ee6f5742208330aadbe4d4e6b2478f2571ba960400150a11fbf437ea809f8e51fe1f88e6d5d90dd73abca0b9e529c81bcba5e840eef81179ea27f1dd2710ebf4268990dc7c7f0e8d4053f1f0a163dd806eaa5327e36ea288c7627b9493354459e81c03b57cdbbf179d593d3d6f8c3c0deb066b1b85df29c9244229835d73441dc37555e46f75ac10a23b06f2b809601ec16894ae5ec003a57135a02bde51579a38f40bfbbcd33202ef57d3b30371e63d723f7452d6b7ecb84ebb64109e65fb79c9369a6dfd8afd68d55e27e0ea4c3ae48df96eab763d317c0d41e9c426279c16f4ab95ada9f36aad04ac782ec50eea9e6534f80ac5c67e6b4d77a5a90dfcd5fc3bc1625d3aa31659fdc148df3c1051d5a860b5133dca20007fbb2c41ae7c25b40f2694df28206cfa114b1e84a8172d24b80b0a3756dec2d6249af220901c07c8ff39b1b61ae1fb07ff987db1b189b90624a27bf9a96ad346dc757bc84b62f8958c792d745b6e2d0e1947cad8b0cea1f47eb59edc9e04ddecf7f93d9b48c784b427738c9c923b9f76deb79a8c4e7c546a16b2d752ad134f331794cc2c10d018af60a7439127c0becce096712ee3096ce18d38a9ee6f3ca3b3abc68c0d2c1330d1c882d6e4b494078aaf32c343070c480552a5ab125ce787d9350d1190f2f769e5bfa4db19a13c063aab3b256b32eb722007884f60ee8a483e33d6d15a1df33035b67bb4a2760f275754fdfc09ff2d77cc1c6f0b5cacbb813d38b26feb059d005c5d75f811bbb4075b4d29db91b458c583e1b863680ff1af60b43e21a6326b76c4152219d9ea9112d0e41d38a4fad3e7c227f2ec0590a34f4326d8bb3e3cd4e0076e1e9e8d7b4ce632ca6697c64b455b113fad09d7d766cd4f00f080f58d6ff890d8b9fa8ef63dde0b50846d582e239bfb995541313cb2c60ef334176e9ca31cead592b260e3ea76c527054ddd0be526ebe57a26b448fdb5ed4e01e32be2f4b98ff5175aa5ace94ceabe57ade77d00986c749a2ed374ce0974a1f878a0090b7afab7e667cfe9a0dd0676fa01e9fa0c4ce7f713de01589a5d3f7f764c5d772dcdb58e5e4e3202b78382e16aee66eb7ec0f8bd9598e05cf91d983709d2c6a5f22e4ae90d829e9073ecfaae38d7e0f9cea119689df3d30a50c7397921a07e2def19157862b9480b8c85d81dd232ea8d7249c4687b836bd93 MD = cecddb12b508e6cddcf3e96635abec8bc6031d588b21a4a4859cbdd79aaee47a Len = 46448 Msg = 5ab7074f7be12272f9f47fd8900dd823ef716b676974502eed9a0bc038fb5ea149ec615a15dbd47c7d7bb3e37d220b38a66f0db9ce2f603d0681bc72cc39b56a8283d4561fc9ec9125d6abe0d33b70f89bf15c40d641acd9b7e146dc7d6091e2edc38aca007115b6d94c9057f921ae6bb6428383e971db0ae800d083b4379c1273f6ab3e209bf5f581268ad0599c6e99e0a9a80b708896d8812883f1d7877b01fa625e3ae711345505adc0d45a73588bff6df45ed14f844c6a9f87ad5018d9b76b51cc47bd9a7bdf4d265bea64701348fcd78e06768b4e6d8bad033f85b25c3daf091dec0afd729941dc829bdf5948d8c02f9e8bc5079b44cc9c1f30e01dac9aacd378b23603c08dca165e6e33f79e4432bd4e73288a14d716b20506c72072d64cf60520a9740dc3ce1b17ebc912be9339c8c44806db61304f39da4ca48556fa76bceebecb1803413634d49a07724fcdbf9a2891c7c329576177c987de12ff0d126b581405b64811eba9bd0456defafbab79a3d7d20a145232b5f741dd901617074c6dabbd18843bd4c2fcb01f1f6723e5ae5da19178cc2bac3a8f0109c642213fa7550a5c0460c5d8c7b626c8fd3d5054807d776bd4f6eab650b750ca7e2c31a1c438b94b4383b9e1ff16efbb402587e2392be1c8e83d95373d97b5887e7c5215ea3d41f19d971ed6b341925eb0c6d276209168107a4636194a59b8ab8fd98983628c29b5d941fd9e2b62971b15c938f87cd493ac53bcd443bf22e19b79ebe0d3754ef901c12b5d23af9f875936d5c251961feb023b45789de41db9c0045b5eed68ab3a3c1bfd464c8720e97fdc937667b698f77bfa89290f006fc783f8d10bba86ca73cdb05ec101fa0e45f7cfaa5e2323673f7f5732ef815d43934a1cf4f02016d42c1e48f7d42a51912428d7c3826d27b54b771be5d2db41bfa67e396d14085ff0ed96ab708ab0d5d00c7abc86e82e08aaa4c90e4cdb05f50b878817e3805baa473f9da070e879cbf48855459a9a4c0f6dd1dff80f11e7c150bece7eff3aff3f01a99bf09ff86e7e241d213ca8a0b184275a20a1d67d6aecb6d4ba36694cde6645b4f863a7c1773589554667570043afffc8f3d1482574c06450b306c8bddf673be61dc12d4b7d374bb72c8e50c4ecd71ea1c24f0d13ee8383ba20b8c596e9890cca70d2dc9f66cd91cb3c7b3bf49346ab70f4e4ce4fc17e3a9b6b1207dee616e0e55a5e59c41c3f831adcf5bf962042cfbaf15833dfd3f9b27afbdd379dbd54dec1442c4fc285d54b2b75c384b47a14b2092073e3cd0e3c12df38e0fcdc568c2fe5940564a28bd70e8670ae33558b047be4ebfc8721598e83528ae5ffa29905fad9b4b1406b158cf7b4337e74823a5953d4b9bdc6e19b392d5c59b2e7f76e0968260af88c250a3d2b3c28fbee426f5d6160f37c4917be8337840d115de3bddea15300a2f0d85432d5a6b6ec4a9d1256ce10ff02b7caa9b5ca530ec7096f6ecdcce8fc76138ddab31b7b441b2f9b0c8dc16c4617b90344160d50c59f92a2691e126d683d9e4c840825423c4e4645434a63fd3082f7c977f029039860a18596199a6babbf381b3a781c83054e37a2a0d5db4a260d18242a8945f4f0d1dd1edd068d6a2dc48a04e44c28c707e3a9ba0b7552db8e7ec51c452b8aac36bcef77272c12f056143c0e6acd7094aad444966d73f039d19ea5bab01c20b2d0e77e985ad452878e76f541b4401d7556ebb13dac17dceb5835610554a42e8e281a3387604674b63db45da6abf056ef73ee98b7b2a93f798a0ba006170ddcc9a41fb64e1fcaa106cb941d443524448c69a6a00d6571406ccee70bc3e29d54eaaebdaef581a801fda0dfdd243b230fd3a0db7246afb7084b8e9349469e9ebb79adbbc3826d27bb25245c444ca636de4c8155b66a77c2be9e31d5039731563cfe09e29effca90f806c0d5fbc65ca5d98072db1382a5db8bee1f76e1bc850efc0229fae773822bdf26da10aa9a47b82af6dc373195204a97c1bf3e8abf800d260d77cb45e77c40990fdcd7f8ce4eb7f636282fb9abd25709a27bf4a7a70c9de0a55a1c6162a0174d492cf08d6c58e968c9bc8c53cca24a0a16ba62df7d100452543ab6e3ecd6f8245a3423127b4f97a5360215a601786ac1a7e54edb48738ba6a18062728d062a46cc5a3a2f041a09d80560945b513c0057dc628143101f7a011492e6b64e18f6da2708fb8b0ea18727bf40cf19c5d654f33d9ac3bedefb198d36d90a5936f4a408f1a530cfa1cc59baeb099089642faebe53f5dbf4b9efaf728ebd98004e837cfab4999fa2c583c6ba11239d53362d56e0a5dc938ea9e386d8a5a756559dabc5d5f74b11ad83ae174fbaf6be1e43b99380bcb5b134b6bfe4e601fd0e002b55c9c443254d98e23595a06deabd9294bcafc61ee9fe8de96b12c42c2886a9006aceed1f8e1d0aeb0085d6b2676158301cf0db55e1424249d0589bae9187f725d01d7813ee47aba5f7321811d571181fc39fe7e90445faded4fd930d9fd892a171fe8ea7ae94241803e38f139cb6796a97031160b9ce5eb1604bd3d3b943237c33b8576434cc1d4c0adf633f24f82418826682446aa716c95d888487498e52be0095fad1e9b73d4af56fbb1dd5fec1316b0e621c7e96c92fb1fdcdb2b682c670bfdb9f77351c2d19addbbf361892f7be3944d8715d641fe946f2d7db68e7289a58d370dc81c595c1196b9911537a6ec5d6500cca6fd9c20102afc98ac7851f42b2c5928a33781b4b20676e37f07fcf51297a27af1bbc577ecf7bcc483b235472b7f93009b5fe6abeac16692e5569c2671a0a51a8ccd7896994a0089b2c8b6e314eb670df6d1f2822a4c1af80ec00ee119147b13ee7f0fdc93964a40e028316885f467a96c5a2fe7fefb06bb41b0cfc56767b70f8d5d05ea6a510c92625d4f47dd3ef77b6235193de772bc3534c54933fb1ecb55ffe3f5209c2eb9e6dfd46af1b90fa8fc5f1f29046237adfe4e6a15cd22be2a9f9ca0481f9773f4c6af3a0f0677fafe94d964e9cc0dbe4e8ef51bbff19caa77451a2e9957eac52faa56dac5e6b8855aed57a2d605387b206fdf46a231c77823dececb433a0496ed1a7d430a22e943505e605578307102d6095397670e21bba2c54112e056837d9f9f791f563b8899817079f93aee45c9a1f3f87a690739c986b107a1fb3dd5cdb991d0ac34a1251c40cc0b0aa89f354446a8347c328d7e4641fa88e4fe507a1bed9a2a961ff43d2020b99a065bb3be0726aeadf95e316d96673a4b48542efeec8e20dd5992953f6993c1bd78aedc4e96b47fbb8e4663965e58d8d568b729c2c43dce6f531704ba3d3c8cdbee1c6975578283f3a785c486f2b95ebdb271e164175efb673f27e32c3f6d737bb34efbb0ee1353ccd196b49de7eb444ab22ee6617a74103b6a4f8103d4b90e237490f38faee987cda8e3b469c2711222e4389939520fd58260f89edf91a1c559be9cf1703e77687c7a07546906dd60ccc5498a5a22a493a2bfad7d2dfaba3184ddcd75f1013fae3fe17c152a29a288bed1bc2a5280b4d332d2f8ac6d7454cb4b7eace1808bb491ae5bbc671baf53126f962b09a0e0c33ca94744bd2c9313fb03fdb5d4bd5278eb4e6532dabc0c5196558ef098c3c752088c892c2fd9db8a5944f762bff5e9fef3768a99d089c5308d0728a7684998e3ef33151964f3b20a6e94e84e13c8b6b942dd383bf9137e725f0affd9f880f9eb59538786fd08bb16936a4cd260a44d2a61d8eaa3b4d77c8984c780f2ba385efadf643d1f78976b51703b819a372711d4d9003e6b84545408a6c3387c3dae4c74d9cbc22d381e272d7d9f430ff7bfa95b00d99fede7f8a9523d94a2e0e37126fbd110934aec0b931d23ebfdae32ec77ff81cb8bc57052c108a1a23ccb5c1f82f26dd94cf2e4fe13a2fbd81def791c1264c45c8e6c8df15f9e8b728295f807e4eb086c3bafb3544d517dba305e2afced1d5113145dc132b986439bf0cb57d8d16829600bfbe7ac84ab2228b174d8dd7c7bb075ca139ab58342727523e5ebf0bcdc595b2a41f2757e02719a2dcdf35c55125b0afc287ae821758094888034ee2bca0094032c543d8e19f48501b41ae7eb73b92936f6f259387206809b04c33f82b3c7c143159d632934138fe9e1a00ec4127377172981772cda7cafd7ee0753762c075956982e94f3f3670122b1334f6370e27af91ac8c073114ba8cbc681c85a8557d2ba2e982162ca578f68bd45083e01be8b795508d3afa8fbd1e308b31cc47231b3ea336ac6fa4b7d91086045f7d857304ef452e20f372425d1ba3f2bbf38551d73635106c42ed941acae34b66cb6e4103c16bee501adf5321ebde45c2e2ab08397c201fcc775063c38b6c536f55e3ab6b94cd3822978aea91f6a62b4f81006fca762c0cd3f7154d5dbae7c181032cd9c6cf35b2a052bb3036a4c64c68b8ceaf118d207f89a884796fc11d40a5bd90f49bdc6907d134ba4c975e0451186f5bef9629c61ff773e50f8107d676e26b5824732231ddbd23ce673d8a2ae2648ef158e2b3e49524407f391bf4d90b40f5cd90d50957dd6d0840a9ae92fea656fdd6127c91438819f89b1dc6f0f0a8c743346149f9a1aee8cc583974dc4946f5a45244ec2daba1dc8181e30963e1f5803dd8be575ad9f836555e4017d2d269496baf16bbeee48877c579b46db5759972cc00d08894c565608d9ae51dda63b85b3b33b1703bb5e4f1abcbb8794e743da5d6f3bf630f2e9b6d5b5451105ec2db32fa283d937ee75e531abe16b597a6882244fab27134db4265a6d3ab77c5b879d692d4e1ad1e429da4fc9bf7a9f6d323f0ff5dd1386996035158601cdb770d3a50e980c645838e4aec38aa82ded4c2b517ee644542172586385843ccc3dc89c8a7e97314e315930c34b633e0db9a3ce7a0f8573617a75172228ec4e2b75cf4c8e379f7f20f3c198c835e7e3828ae096192077dcb3d7fe26f17e22b873f5f15e50d8052885260e771e118d3b34e7af1caf5021f2d3e09a027203cbfe2e44db5c52ce8cdff33e9c66456cc7979d464bccad2d08584a2ac533f4484c91c2d8e9c104898b07f3b3f7e0deb62b9b142d6310b305bf7f7efcfc2628ca2915ca38a926f6a78432ff0cad713a7c2db8321371932178abdaeafdcb636fe7e5fcbcca95f899870ce38dcf2991f93d42718f7ef3cea8f451ed2693af763a5017b913354ca08dc6898c287208bd8b581e4984f6662d9a174638ba6514d9286112cd55df19d913e48eaf478ba76e717af5c2bae0353a75400d500ed89806bab97bcbfd4ea9ecfc5f80cf6372a22f3c147d5f79e30d6fdb1cfb95ac64a57951b7c71781fa59667796046f14cd657a5b9329827a655b583beca5ac0b9fc9bb9dea69428c68c4c046269e00d4028dda50956ede14fd8b6e085d9ff5b4f07147efdff6cf651058a4c89f9217199867b9ab99d1b4d1f22a2bc0ee5ef530fd38a8d7f6e430b497a16e7f5f95246e25afb2ccfee6c95a09b40c15fd473cf82c8c58d6cda5f8f3652b97eae52bbb3a00b2304553026de5aab5a958290d3f72e4f8c27cc2d09a99ef53bb9bdeaa4e15d01bcca524d9253d4bbb6e07fff57f49dcea903a84e89810bcb643f29ab55f7a0a48d26cf2cf81996311e4b5c0b47ee57afe2c807252740043cfcb9fa7c151ef25c60bed3b5a05b2877577d239bea0ce258001ef29a2b0e12b0cace39442e7eda91fb3d66d0d13f13f32c1fdc968977c833cbaf7095dc12bb8f9727edede63ee0ab27499065d5edde0f64d98de66c5791a60a2089fe84758a412b6b1e5e86878c12ac8a5a5cf28e1132c6524072dbd3c31b871c45bd695e042e4e43d47f5580672e52aacb9d714a34c31c33fc221e13e8f90849adbad3f6b3bec85718389d52f868e14eec119a48d02c2c23cade7c4087a8564fc8de0c651e5a604ef171a424c7262020c39eb4b16cd4bfcbb18e3f82299039d79f0f5bd2cd68e0d16812b41f5dd1d8c85b2d09ac91239cd3b91aad00551978893836076549520e878403136a41d2d1eeb9a7df62c6818de2ea6a0fe393abdd0c9d3c5948197eb2194d2c092ffb8fd339e7f27ffb935658a04d67ac526bae2e09d60799a0c556962ecb76e0931472a651ecf8319e800ac6b7e9f7ce76668a3427e9810f98d640816f07c7dec013e211dfd09f3c7316059fccc603bb770ba7b70fe0910255d3a63a8308094dde8047de8b9bd1eaa3dcb0ab8aed74bc7ce36d7f68c21ebc0244ef8a14d6227314e408d3fc567581565b71b196653019ad754553db981283c5b18339c77afc998bc68fb9db09734ab319b17b9b36211a334995fc106954a0c6a3ca0f46fb7d066bae4357cfbab38de3a0d9cf3f692e0736e7c643ae3dcc5b2ea22cd439618f04db248c7781731c920e784f762a053e27ddd841ee5e1d62fb2534114f47b519d903b1d2df983b98a05a277d3805123bc351a36dc5c70ffecad2e3e14919fe02ce0cdc7d58bd1b0f00f237c9dc78990c23bad0b192921e880e5e36048a5744342b1e2ef5aa981967fbfc309d2c2aa0998f3fe7771b664fe810f1b5e2daa88f9638602ea39dd04089d7a19860eec432ca4f08712629ecac0618b1e9e301b4e8103dfb64edf90e955ddc08f97aebed5487aa3ef62584cb3cca6dc95970c624568a8117583c85f922cb545ada53eb4e10b8ea09fcdef4ac071d595f8eeff2a0e2ec4dda93f90a3aeebc85bec453b68f6d4555900db8413716e5229c0eca4dcf931ee96f9c8a50780116b85d3ee21357741634fcb01b3213700c11a763679f5a71099dfcfb591f5c64c3365ed068cb4e2b13ce746e6f91e91d786ea91430b0e88493b1aa39cc3f8e1ea944ea024da61d9c256d21cd1d2460261381c9aa8b4822d5a56ca0dd4d77b537b22d295df96c6ccf32572b578bb42192c39130ace22eb06b2817076f439179b8c5374268d4e5e2ca23d5b9942208d36972e805a29c2b394e02fa0677165384a8c9ac5eab47d92897e12ff30b4aea1fb407cc7115210765871d5dc67e2d867b0fa8d2a4afb80fe63e53ad02446c20ad7a6a869c8cd98ade1d5f886e0bf2f209f549f23dfb9050c3c560970ec7ee7324c3835ead8f2c7b4918b2c227a7cc5ed4639453501838646736f2343e1d3aab2d973a9bcca682a45181fd5519d923938460713f068c16137b98f0cdbbcdb6906fff7787235a43cb9c5f28876b29605ac2f5c8fc87e19425a7f441aaad5fcce993022268d732d7b9d2ba1aa1461fe979362981d3fa9e19619251cf133b5be38040a9238713b7a6369c9abdead14427b88704840c874c0c90e5b781508d4a621b1ffb622cfd6f190aa208f8ac351f82e15d8eb9ef5872d77a472f3fa8ccb4b383d700c79fbde496fc8b0bb32d993963ba62d009c49298e1e761bff165201f3d8011c03b277c9e86d5ffacd6b72618300d3cd15ad26047929fdb727fcdb01568da7544a40d6224525da8f24a90034653a093999662e80552695c4dd229a51d9c58aa93ec9a96fd605c2be5f5005a4b323b1031a3bc525d890f8c5ad0c026c041c359b5f91341b41a9a338dc05150ad37a85aa06b28c7d49f5714a062dc5c84bfe329b3b5c38acee7de66f393c90ff6c8ae1aeed4ee6ff4fc0a9c2771c36ff47f80c39406f19ad52ef26c1e57b2bfad4f14f824c855714409f0cbf8e3be8695e762ce60d6e49851599cee16f252875b33a39b492ea6f54c2cd04a1aa215c9f16050f31f0ce5adc8cfa594e44ef29087dc23ac65ed2a2595ce73c0959410618f5314dada903c01c4f8d5058f52d902b9b25cd281ef2627a658a2d672a3f776f726742a994a31bbcc3cf3ea1fe551047a1d15b6a31be52307302334b8b6112fb243398c62220c046903c9ea9df1a0be50851800d659ae4241c0be816fb4a7b547102ba73f00140321b51dae105d0f59c6522b571f91c8abdb6f3d669f8701303ef7112437cc92e17fbab8dd8011e6fd61ec176388ab7c885da4668a511667c7205eb4aa526ecec5087a6220f5f46dd1abbba3cd189012fe50c903968d4921a273afdde299ce10d8465ee21f78f0ecfe2b28993dd726d2373b45da31590876eac251527313d4a041c0cc028110ecaaab6999bf5ace56035ba680b404bf3bb0c792acdc07c969c529fe2d88efc6d1f001ee77dfcd0409ef9119e258b6c6ca15606d2842 MD = 03deb53fbacc9e3701311efbff2ee0566c27355b6f30a22848a5b8618f6c0d63 Len = 47240 Msg = 86ffd5bd3bd1cae10706a61d247b2257b165f37cb53ff21761077a2295a9111ba6bc4b5b5f6ceca445b74df91fdd01b2b611b7cfda75628da54598370452383f72b3508d07b73e17b21e15b2c3884227ac2d6f8a08cfa7c7dcedbb7e1d3ae511734dacfb3d9a0763d5a1c5f015652ce01a20e154473508ee8d66ab9eea4760b930f2264c08fd91af36a9275d1f5c09028852d6d6a08fcc2a411830407362f060320b882871c822245e9f019fe8561fb87e2b15b81ac53ca27f6b120cbf74df2efffe98397ee303ead4e91c5e7839b828851368a1bebfa07fcfc718a9d663734a21351f2439367c2820f14043d8ef1a7a24729539936640e8b9940cc0c019f5dd2016e494aaaad406cb1d34f50f5e8dd7e4b06529a1a06306c63ab4f8857cac0e820bb12fd82555ad5cd7c21d25705b674c35a019f05652017d21d8fa2e76e206d17b4c9dcb9045455b86b063230bca51e4690eb08971560067b1426ec3eeddec94ce7e878bd4edf55191c76e101924be34b5769773d7b52b0a53b9fa4acbe7e9546b0f9521d795e6c562cfe7f481afd5c57fa276b672b7abf06d0449cdf7462598bcc76e948385403f609075d72bb4bf1e3058f45b28a6a8a169ec01535942c7e8286ebbecbf042a47f3d2c1c2ff7aa3c73161b968e3c849a4ad39cbe5d925f8cc17cb2331725bcc66835c73bce54baa49e9856ee88a67b780a3b34e8a5f35dfcdf1a74f6c86d34f2378f732cec56dfb2bbf8bbbe005c91ac0b121334ad3bca5721fcae6a5e2b2db073b6ba6ff8729c0f51d3d475a3c3699e9414d212d1d00714407fc91e26e4097993280785713c71e306a61bb5d17f85c85bafdc13c264a6cca1205f82d12c7ac61c6fd50de518f3f630dc0bef27e568c1b84fabb7ed4e1bd8ca8acc28db68d42e75facd59d2ac94b167022f92059975134070cb6fc100f8e1232ba980b42db7fb46653b09b84bc69d1fa4f13ef9004d257aafa5abcc31a04e516f821ad9ef98e4f41bb89e049b1c21d130eb5670be5380cd88e50c8d34b498cbe2b067db32f95405aac06755ff07e8123288791b282aadcf68e40282aea858f901eee8367c5bd1018eed261b0c1c486926630746e22514d6dc3d1e2ae3fdf77f69882c6a3022d46e24893ac226cbcb2c98e5918250e55e9a5f5ac00499180ca57606a4e50300e6a2283f25f9f3890902e68a986c08fdd3806ec7989e22a90131b3f4d23549587043f6796810e6f65a52abec9c528eb11c1f96fdf86605036d7a9fdd34e9979c19da1bc281a5657667b265660dd436a1a0ce44886fead4c9aa06b62a5d60526e3bcb04a4f336138b89988f917d7fb5620a1303d17f9b066e5f5c8356bc382e316ead4d9b4d2165c8687b96f96ba37f54a0946173a8051e53f5f2840cc1df7f782ae7530fe025d0af6ce2280848edf91c1cb8c9d96997813cf65f34971ed4bab4e90fb18d6c81e8930f52af48a5cda70ad6f6c99d44f0d36be8f9219023b6847a318ce59e42e41225d8438924f2b12da357d4dd19ba7f89733656b78260d3513a8cf56bbcf3baf1da503b6237c036e19817e970f94ab217e5770e72e856d9a56863cfb0640f74ec22ffb0b6fb8ecd674bafab1196762713252376e02c8627f5a64e82601de6b075824f49f3eacef3232087705b7bbd4cefd4b4269bd97f4cc656b593d75529ec329ab74da58ff136a9c927ffab3380a21256a1a3e27992c69c0c219aa2a4398687bed0524855a6167fa8199f8d4870b53f3d946570877113fb393b0d3e85a62df97122ee58c65df0f94fc4e67e150df4aafbd4e1a28d9ac348503a422773f0311c541788536c7974bb12c24b0a33a8ff0a141bbf14f650331803c7ffd9e9983e54da2696c4b2991049a39a539e2ee222c118a144344c6211fea66c8ce2610eb42765e8b029332d420984a596b6514a0e546c3e178d0a20be40ca808fcd84d4212899d66b0d58b6889f187c7aef65312058912abf8bba2cb6a2e2bc6ef7af8903cce8680dcdbdb5525ed19776b5b537f73229ff82acd6d679798178a0fd4b9dea88d4263f06bcba3ded628f1085dbdef1759935378cdacea559193ddc4b036333e0ef897524e035b9af2dbbeefc4396ad9751641498506598b62c74576d41a97e698d1a26c4c2a85438b5b6586586ef9a1c04f4c06bb24be2154dc4c8d090b128875f50ea42ce827c0e7d06e37e105a3578067fb1538ad20feadfa7a7117b1ad0ceb8b6364b8e74bf94e61626926a571e3fe86d6dfc44a880cb548568ac6b66f5a43bc2713b6ccf8d60a36c783f0f7692d82d266cc26a3fd32b6ef6841debf615ac5afe418ef42373f627828ef07a3961e54763245285f8758f61738fc267789f5b88d21dd2bef0f1c9d4f0a143350fd9cbb98c3b090262e66bee64f246783f111667d67c9317b885504e2f75a3ca6a89001619f7627a2fb4556873422698ea19715a83d44cb8faad2df5a7629e94f9ee36cf85000b579f5db06206f5cf43e9f700e352bb6bfd37e7c76de10e903f0e77b45855eb50253251116da893cd03bf582994db987d6ee0b3910974b0252348c42d3324ffcd5d991d0cddc0929c42eabb7fd187020d88959f2f6adb2dd9ec0941f6025ad3ff8b243fe754f778b9abfc7f684bdd7e78d4b71907147cae0af3f07f93286ffe531874384545a5cc91895532674657745bddd5af9c78d1d744d57edba927ece564900974bb2263e4d075956311637d6a32fe61c1740a832023fb04f49c835a1f908c4493ad9daa87e2eb2d9feb25c7e67ac0fc0d026c091f04ef3348e1cd20038357c6138109f1fc45749e37590fbf7fbfc004d0ebffcc3a742c8a571d67d737a9acfe52f9e9d2d8748c57c7ef73dc7c5e760cbb855854f90e3d6a9da3d608328fd66df06ccfb592fcad0ac01314a782f35d743b62e83bd12f8c648b19aa0b7a827e856a5e2e22b24a50f7ce68449929fad0fbcf0921d96944b3f8ade35689863e0fe53f428792ccfa12cf31539629b7f18ad3e4dcb7b6080a2ea784956deadc1ef50dddae5e9e39686cf1a7797bf1d363e5cd1b820c6a63dc66f19db452a7e2b1e85fc426359d9e21b9ff7f2e8859f2ce7c27e16d826ed337f75767a497593073346b811e8f2941c2945956f72dfaac9db874c503cc2bfca94a4950face775bef73a1a30bddb9eaa7868f9d77ff3c575e154444e94c3a36acfa68083b4a7abb9320a29872a3d7ff6d0b12d1055e97898c3d16cf82850227bf6203fbcaadebd5fac5deefe7640bd66f9c838043cea4b9a47a5ce363f92c365d2bdd8a4d6b334172cdc6f7eeb0be264ba5422997e1ec7e3367872f122b10e902b2255227f4f964b7c2fb6edcfc77657ddfef3b962ac73db57f45e0f1ad48b65c9fabd1deed96e6262fdcb356b9bffa7286db44b2fbcd7eb74bf9c7a6d23c34a73eb197f6c7a41c4a7eeb43c07b007bb64496d372e787c795381341863c73da8f39d702f3f5a99d813ab7beceb2e15fd593c2465a706e9efbde32cd346e881e80fbaca15afa0fd086ddc282b5e3cb2d4ceece3bde18ea6b37a8c8e925cad187090e730190675f6bc7f29c1e3a90264a88c01b12626393c2f5226623def3f89aa3dcea8238a000b5a0f3850fb15a9b6e25c24978bbc2e32c90d56aebb45c65cfce0173d1b856ac44be6b4dc5be8592de804fd9bd1ec9610eb72c67cf6a6691ad03f6af4e93ddaa9f7cc436eeb6a3953234c33c8e1fe995ffc4b1ed3d55c504a8d246dd775fb7943c6888d0d93e572affbfe6f23a33a5ea6645e05bc40aea4749b55cbeda7066e1921e43bc13b9f2bc9d9e058b6ffe80e6d8a74243d1fe38d20629a2a3e68a8e2b36ea6f592cbe18d2a23bc9788de4fd03dd85423615a4432d74abd33d39e27fd9a169762892bf3c0594358d3a126b8cd9cb5c8a92dda19bc20bb848db333cce655827f2bad431debde9f7cb50ac16b2d1589965eab85aa52841db9e0e60ddfc66c1926f807fba73742a1f2e4ca95b0172dbd87ece2443e1d8ad822d67516a8c4684253709d3cd8cb0caf8109e98ccfb36eb763f8da001e45ba54881567346e09d067d03b79ecfad0c433f0cc708d0f2a5fe0f22d9c9f93f19cf9b245c4517bbd2cef6302a3f5536df39408d4667fbaa488a0fb302f0be349b9306a0f955415060542d56d213d2ccb203a91cad34c1648726048ac9b2a5676985f761be125850fe1c8ed23fdaecc11d38d5355bfdb6c3fa4869f47e9e636a0c1f09f10b0ac13fe4be975cd3f2f7d6894f5151e331403b1a67cc9a92025c9eebd49ad960ad106fcc80d3312eda785f8ecdaa1cd36df25c501a88e7b48d1598913d46857f87ca830e29cf19b11002de862a4bd09d12418a33c74b5656ad12c994bf798f881953fc320fe750fb221bd617fbb327a0bcb2574df47080e8c0d8a45ee1c0424ae0414dc0a9b8717d9f27d8ac987c7c9ecbc946073884d1fb96dbdb583aa758186b16fa429dbf15b8d5bb48cca71469e7ce0ad8e7fa14d3ff6d90c129209b3b71184974304277a82d644ac8e0adf75a0c41db8278bf9d0174d39be84a3a0866f5766d6e024e5e935bc95abb9103a1e78cb5cfc521ff89e4fc5751c323fd9b651613d72a30f7f071b4836fa3464eb07ce9986c238c4067e8e66756e45ed1b0a0436f3b4b54f5b9cdd810fe1288e58f94937815200018b397c3922fce436cf4b31de6ee43e6ce370227009a7bd16ebbb91ac37f4d35fef97c245620d38a15b417f62984a65ec7d4a931b0a961a850b174f008ef0d9659a6008931eea69b628b497c9572e535993f3d78cfbf468631fd32b3c708d399bf55cf5293fdc9efd9e6c201b95d7303a8c3497cbc50ace3691b8cc67c4141c8966533211ab29ffff2530c360398e2318d0d37bde4e207588c88edb8972cda9b8560c67534c19b54326ca28a12b9b547ac7982acf807e85e02c1dffab610009af2e503bf508f6e8510700f6e65346ece8d94d4da6426b25c7252ce1d37bf563f654e75601c906bfb2329bd53599d713ea6eb88b697b317dc41b85280ca7f4e0163299617e769363ed0d636f98e595f009eea38d221516b65f76ee7d5bcd44a8962e2e0475f7e3fc8a021f69161fc9acccc1d4fbd8f763f8209e3088cad62ee2feb26de6ed343eb11278996eb72fbb6ebc4f137c94095f6a90fc13f060a8fab7d7251fb0ee14eeaa0cd7972484fdb35f5f002ab85d33543536f65e5e252cf04ea7ef0c0981823a100086e2338471f9a7403ddf583b5d88809af5db79224a57d0f978fc9aac63690b76ef4244c074d46de46cfc04366f4474456250ea5eeb79645227b70b79a0c4c2f7797eff3eec8ed9d5f747635751d039bea38658e1f59c333c660403f021935e0a8c600b08c36d159a44891ea5ec74f68d22456cb45209643e9dad2a18ce1e063890ae1126dfba46bbbd89dc282678d43b4554cedee80820e1327829f98face308ed31b89e2abc97c0c81146e9e823fa4f767d2567a1e08fab8e2ea89b4d861d020cb1a97a8abd2e32cfe704ef1bbf90511c86195863dbd82619974e07eef5dbae53f68bc2e903339939d4bd43a592c0ca9e3854b8183f24da3b7ac4445c3f45952bc7077c2ed7cf7b6ea019eb70e5b041665b7b8fa7559a4e5da0b25a7dac843efdedc5b241812962d613c2f162ff883edbb739e6f865630ae5d2be523b86c0312f316c6b0a496bd5d9f55d5c652a7149651333c4f3b7a6963dd693337d1320f72b59a4b07077ba5ddf0d953560ac93eb6c39143180928c7bcb74d7052a9dcd17572d17885e52418150240f833ace15ab58ef823587403d40f97633d02c6aef191d776bfbb92325c99402764eddd81f1292fe25d9f007e06d2ea24e9d6ac2ad86e4fd48116a3291bd136f709f3012dba7802ea724a3309d8ad1c2d173ccef2fe5138857d359c7abe63533a57d1bc36ff28b46ad1f88029d204c9c635b3a389ebe14e03f486e2a9bcb6315bff08635037b1b10e2d088c708b606f9ad5c9ce4229a4ecda97892a28af403df630059aec0cb9952eb4189c506d567a0567eda3ce2ff29173d6cab79a0ea7f573bb67c77cd696bd5737a7446bd04d75b07c9dd8807780d85a22ba2f504343d46ef19d8d853ddfb612081329058cbbef068468b10b88a62e181bd605fdf5aa773273153187ab0b0be9a60aaebfdb2842820fccd1b1ebf90f1812bccff58e523a88a07d6816969f1b38a1fc3a1d54291cbd8f48cf2609eff7e4b7ccd1c985c1babc0a24a594990280998c467f907024ea13734aedea8af184f86b84dffc647f645720b95e941adbc886b597d3abb7b2171e6c61c251b7b412edbe833f10b2f1c3e4848a1797a4915f8ace5ecad1b3373058cb1bf0fe389e3e1f21367388f9af55ee96354511ceb9b2102719e9a4cb4ad23d2fe7ee6286167317241d01c7913e96dfe6398b84e1cb6cb16047a497986359460b440f0118c33e6047a58e7f11f60322e5154f83863cebd90a66801c82f7520dddbef77c791b1c84fc7e6df2148c2762234705703484bc0175f500b6139d38ef27c72c172f8489efc2f634e2f1577018114d31ed753959c53381aaf6d2cb9a8469eb116384a5f32b2bbb57a430ee79bf4fa6794db0d1419ed38af35148e8e34824994c0440e604a1a72c5ac86bc7a0c23ec130338fd30fe8d68f5e57de9bafb4d850306bcccb2afdb5c7b2b1fa6991bb5f5bfb115ac5215daced507d1c4a5c5505be62fc90dbd299e81bf413755aa92531a53e79ba0e0247d7437e237a8b75a32d225849257e9800bea7a34f64f1737a465b8edf26344f41d6204bfd81c58819cf3a84d40359e7bc99e924d831e46d351ddd40b417de44d639f22e6dca8f00436c557d2fa2c44e381a5f1d40749a12d018a9089b0742af7f7337b9f6ad4e7a9a7501b5ae9c64380da087d11a9598e0f5d75d5ae69d27db98026f632aa29a539989cda2e348a031a7dce204b92d5773f0ca589c4911e445ca7807ae6c52e927bb0b27e970500ed7911ffc1cce945c386b722951153e1e9a9134af105e36c16399899eddb81b167643fa448dad732daac06f5e2ded5a2d3656c8c42d52b699a39f7591142d224daa5afc39cbe84232479a02557723fe96a5b5c4c559fc6af844476fbd01620e1af020867a7c017a009b52ebadb17ba3f1652899412aadcc63e22bd85149d92714c44f3955027b931f12757bd58136e2a3f119b6b614094342e9b7302c421515b1b3317577f3d915f4498c435b5af82344d613bda2aa71683be774077c8e8842782961db41c48c8b16ad01d2ada331ee5a80a11e755288b3a557dceee083a545eeb36acb5109185b0cb9709a5afe76cc4b8d4c49dca0b1be25a76c26e6b61e987bddc6d604160f1e2cfb530ac1b129159e687fd017198ed02372bc700dba46a2a604e07bf98fd34d1dff13b4a09feb82c98ea631d32172a22536183ab404a00d03c5523dafdaf75056114d2845ef107c637c69ff8f6cff9cb16e39e77809cd200b9b869b759bfdc05bfe69c640334a6ae2ce3589aa3098383e878c16c84e209423f418060927592595f2f42f1e00fbe6cde09370c230defd531e794933464cc1e36b611dd9219bf89abb76b33ddc97789b400e3555c23664659f9bef37869441d06e0c3343ff38a1d0946c033e3acf88c188f057d38931060c876e894393b98c617873f6f834b1c9ee3a3e9f8d8fe6afd7180458d9ea414aae726b97f5d20f1a1d1732d9645689d94a0978d8aa608f46526994a8c759f9bac1cd0dabbce6177379d6b33af6d933485a8ea54f23312bf4aa1a3bd82a7ccccefd03ef2507245510fe138fcc4e21409fb6364e8376964f337496545771b73d0fa6c36aa473316a8b206a22edc8e33457d39ccee612e45b7b186a98b74b9dcce555681aaa7f81aa3a6757172005838109492ec11796cff3342c0353780694fef89f8e79978a89b6b75956d6f37286a91c6d68af7860ad890715fd2f0a413135b1db92f1fc32ddf27a6cd5ece89e612f19e6d6f4890f019f6c6cb485ee79f7139990023e58f6e2f00c2870b36fe7a7857a1bf63ada006098cca6d5f2a51f5b1b186378993e453d21e502a3d509fcde4ec59342ecdbc34f27b04abdffceafe1bed6bc52ad1cac412a8d81ebcc473c59ed84d359752ef621aeafdee8f7bbba0f612d012ce454aa935c7e3ca5039824bed42052867e13e78ca023b9f3850cbc48c4b3d863c9a6bea84a2f898c157d5481b520a776625b35e4aeb4824a223225323be3b893e76367047629fefd6c773a26e32e3885cc355fce2ccace7959bc933049351839a82b121c62e6037583164432f0718c511662c3adacded4ed960c74e77f308 MD = 0b6180f72608560023802ef42e0d80f862759a2a6b107667d7819e07bef00b08 Len = 48032 Msg = b2c633e3181ae5fe7828707ed5b70e0460088a84465eadeecdbcfa0e9ff19bb165d29a0998c7545294892bb6ef297c6e0855d12be3d757b4345e92d0b9814f66cd01dae33b4e72dc504dfaf53459f1017a88a46af52fa2d3cda871fdd3527fe712da5b3aa6b925e3d2fe44024c4e5603db296d0a246e7895c122ff5d946d147d5be586d5841057b1422370a6e01094bd56c093d41a9dc0403854a4b7a5d9f46ed0abc17e7b59ef8cc945e8a998a8917710d67e8d7cc4621d59c7c9d4ad9e09029bb375fb339ed5bd8feb13d31b1d377934f29500f5e945744d02d47d55c53983e1850b1556e6f18cbb9d59eb12776d0ae89d42f42b16538d3c8d2f7845556e37cdaae994893a2b4075e422bb24bf1a73545eed30c65273af4df1408d24568f6884a9794076a16b23e746d609fafc28fda2bdfc7d6fa68d24a8b571869bd1845c310a22e1c523997b364ddd9e3b367eedf742d8a3ce188a327661292a51cc355bfa564b3e1ec89d918d81a0429075048e7e76e96a8ab35022df7ecf40ef528aaf07145e2027995fad126985bca1c2a2275ce0979a4b7cc83c0a93cd911c686b9f81ccc24f8b9dc717ed8df5d6152440ffbc094bfabb7ddac720288ae58118c0729007df93f0dcbe164775595695a4c65fc4776b5380bd6f0d48c56e03c56971715b4b1db4ff5f2af348aa1705c8491c8f9cb4616d42446d54abf3e1b5916466e40b23e4795f2df5f717b399ab571b2bd76d489310aa1bbee570394bc18d0f8713c7149cabb84e0567dd184510e922d97f5fb96b045f494808c02014f06074bd45b8a8ad12b4cb448ec16285fb27670fce99914f100ad6f504c32fa40ab39beec306667f76f9ab98b3ec18c036b8f1b60d4457a9fe53cbab23a0ee64d72d8a03d6d8d67a9f2ff6eb1d85c25d8746c8b4858794e094e12f54ab80e5ba1f774be5c456810755ffb52415b5e8c6b776f5f37b8bcf5c9b5d0ad7e58a9d0fa938e67ad5aaee8c5f11ef2be3a413628ef27f593a779085da6e641c19e79dcc3e1961ac53f9a573860cace8cf79ca99d3626ed0097460c31bbd460b8fbe6d57a6c2c662846e2f229298f443215d96d3506dcb3f2faac57e24f2b78c8e38961aa9da1d84b22e13034b5ed0242077fe78cbbc9d8df540491ebeb4c0875f7d9f7b0e0a6cf92364d97c7806477315f08af00df7eca4a35f740bb1ab68e44bb410e49ff9bdab1f360af7e338621848efc2a4dec5c06b812ecdadc580b78b980672bc224f1781f0cc2ddb529b28fb019d2ffa05ce22cad6d6dc6dc2dbb5648e9a4b6b60b68363dd4fca908ed7a1048821585b4cbb19a9ec7e29b16f636b587799265921d407392de76a7e5f95d51c24a4c5307934aef0094f3de295c1e04d992a88ee2d51aeeb29bb940d8c7dcd291f4effdf55e0e88776719f69fc9d1c2c3e76fb924bd67d6219f4d0a5df369014bf468dd2a868cf577b0bd7ac6c9d28deaca406ad450b7e8445b9a6ae1e6926c64db5f76f3a736b465f456e15ad6c0b4a2bdd32a7e197b83af4339f9012bd982610c2c620d2aac53d6c48eb0b86b0cd57054905e8e823336d6f8a42b383dbed1b5296814c3ab5e425e83cd6f5c11277ef800f09d82156f803ffe5177f396a2d8f5958b05a383bd0e41c49b83d243910f9e658c6df56d90ee6ea6ca75dfb1360696f31dcb495e492645095174a78cea05c7d4bc3664d537dfc784979b3927e8f91da498cc1185a318bcc4b7e84847830028e1188d3cf6d4e2ff3a116eac752c2eee2c748e98b42b543d791725312e0c6d260d19d90a4cf8865a19f046b6037ff6ad1d49894b4472773ba8f7d1fe8ad6db43db48b0394203388cc68cd9d25d750eced97052a5d0f8e03be6f2650cf882a906be2d9966708587fba27f8e7e0d7bc5d803916134c42f2da2856f54e8f19074e33820fb0e431fd32b3020eb357e24ba3d0e154b84a895be2436e7382f0070bd7ddbcb5b8d5402d8901219668539e06a726b8457f1e8cd20256df2752bafb3e11b1ba541800e0ed6cebad186d9cb3f451c9e673d192f25e22a8d19a27b49ca9e5f7a173372db747c3b8ce1d2cfaca1e8a039266176c63082a826b526aa893533bf69c9b7d266d4276b1ab2c0c358b8a381ae4a4b77589d7032cd5d9815c8745fcf7d05352b2abe66d1e6dcd75149d42445705b71b7509d393ee38b7d69821850e4268231e98193c91473b88cf61a94e97021d27a9348e04c310bc72cf26091d5b1f8a9349a15e4bc8733ee683e256b41863537acb79be737cd98894d6cde614cad65f2c3b95221cfbeb9e6ef7604d7eaec1d03ae80d4127a493c5a55254607342ae0e755d3c0fb513f882a994a235b44366bcee67b9c02824849a2bab842041adf0bff7155dcb20f6e0121dc272b75cbe983e1fb243e37fe5f430b04825ce86f2e59c38ccc2fe658eeb7854ea967b8006a07e5430735133ce2daebb93ff124bf9d2cac2eb31518ac163d9d672d7282705c6a5154913b34cc6763dd5f3d99297aa02741dd8736b99798e6029c4fd665aa251dbeb65e9b0d3b7160584d07cf972edbcc0cffd50f6999db632d746d0df20c58b475cecbff1cf88562d5393b1ede4aa47d662c18f979315217a686218388156ba12f2465b1d48217edec7a23e16f6c9ecdf5e8bfaf88ec9175e627f9c1c853e276335dc85dd466ad63f6a66eb1eaf32f30349c557c192a1e2064f04253135631a63ac1407d9d24ba579c34782aa18cda469add66f9aa885c99bb65b7b1f98aeda3adf57a8b8f3ac35b35aaec9653783463a11260a29d65d134520eb668fb607b10f560e2f23b275cc16b8018af4163a239dfe1df0192611092b141cae299857e50a9a9f65c1158eb3ca64a98b02bddb81bbfb23e810a089f3761a561a944584bf553274123b27df32f6e60f9535324fa9bc90a0bbb64bad194dba017379c5788715a6f3fe38ed5090c2c79a6f357f7ce3c745fc31b52f66c2d97d85817f211985757f86f06171ca17578eb1e3abac4c7704a39f12b2549a3742ea4b0c4f6051019b4494b15eba330dddc3beb73fbfa6ac9c31f12658c332c1af8ab9dc908a0742af7d850ad6d075bb7bef28b498c271cbb7775b354c8317a648e338b8eba82391dab2c0c071bc76695a9957a25fbc971c7cfe4306399c2f2e377f316a08c18c36436caf9ed885205fa249b3493bb6ffe7144d1262c51764a3a1e60ab88edd2c791432b96bb33359e47a87a470d5b79174a7ed311198fb9d4bb19e2d6b2604eaa1728d46eea9cf0b410adc92e1d4c7350a5c6406db5b50c2708c31004b773faef88704bef0635f1dbf7bcfe562e1eed3f35b3cfb88b61eba585d27ed1f2a9560c47b1f8a3989ee77a4f5e905bca4355375cdfc77df506e6f4b4a065ab1e60fe94e76661091c28101389fb05ab7c4a39dd9da2de2a9d247c8937b58b1c754b42fde9f62b9c0b622a3c5a2ae4d1aea419a67a956a3aee3b2ad7719a4592a1b8c1bbc1e9aed8d0ed84591266b44afbd16306663ff24b62cb6063e4c73baa2e49f952f1c9615c272accfe5526ea83ce62a48202fb1cc89555bbb313b4c3cf657f68680c1df972589a429094e3fe28a0c85cbdb36f203ee05a9b5980fb747f01b98d4f834fcdd7ffccb3b4543665861d8309fe09f4d31afe4a9dabbef3c4356d98d69dd9e754d977226eee1596b7488f232ae779347be929b6213e1046498f138de2b7726d3513794bf2824b7d79dc90193dee73a6a1360d2dc495376b6ae89e1920410f59d50250a9dd25886323aeaad5b197abb3d96e03020625a6cbbeee67bb1dbee325bb22a7bc8d5c3ed02b5b4a09346763f48b0dc5e35483c0ef9becfaf44975a0696de0e904917ad15d175ef7f434d24ed14c91a0423e14185fa870d2551229c99d43e99f02782602526e263f57116ccee284a64c9f317b3f946b26984e363fc12a03993436afd23468a64d7a82788b6690c998055acd0d89163a5a875ff42c2997f37c3331b6f3da0846315406c8d29874920365156f6fa76dbca959fafa73558fba0f26640c2f75a9c47e366490c6f7066465065fa705fd03688f7abfa7a9e749bdde884e4dd999d5a780ac2c4eece4beb7294389f264fc6fa469540e9a34518e7546d360ca86b90475f52fbe8198f40610ecc734d001480b16e3807820b726a686e4924c20bb45cea6282b9ba76f9794f81bebd0ce6f527e267a8a7cf986d92a59343f50deebe28cbea64a644ed561b3d3333bfe5c039e31699adc9d8337db9272c2551f639cf1d7360be688d67ec51b38cf221df7629dbd46c0f15a4c5ec07749fb5e283d43063692a59a79dca05413af4c58a03f00d38a44895323b3400a31656bc4dbea7292135b2fd0c7d00e71359d372a258172d210e9509c9a56a02b695b7013daf9b017f605e713e34efdaf09991c212e6d1d0bf9bbb3181ea4d3967772c4e585d9602a671987fe6ca81280081967d82b5073f3ad222d50313c7efdf461c6946d08172bef0c7edac489c176a994a6b99cea2c3b93c32bff728bf6a4589ef1bb010459aee66528437b52af157691653003888a2645f54b6032f1cf4c2c90c2c3e26c8c25f5aa30c301912fcee7a60ff5ffba32464c5ee81d232c8d37e8ddd649719f4323954214d3e7c3c81585391355d20d993e1f66ae90a38aa4fa05dc98b64f1b031a3dc340f0ae790c7bc7c12bea2ad143502792eb6544aaab251c138684cb6e308c57b44193c61f618437e4a62d7ad3b54f0d5a4b0576fb042b84292c4f8717700c8b8b9347bf356ba14e0a0e8a4253636d395329ebcafa449fe6740670f2a535fd41cfc286fa498f6592a7e1ab01fed23d23e424a2a126e0d4ab9a8193ae75f6d102e73bdc17ca41437e54bbea4a24865155a3b7a4aa1f7d7c5bf33a221b28374a57687ba1983625cd8986e9d27b72f43c57085f7c46325ee960149c96b92a7babb7ca0e91ec2bb1664cb517fe2658a040a0988893f61e19ce7075357c190b38878c927107940958902065b2c7cb441f10bacabf763a11427dd5ab715cab28f2607e482f8d205dafedbd2f46b9eac3c52f1e1590bd92da4d8a281dfc82f0224dc8e551b69cf1a70bd17b68405f056636fe331f78b490d7bf75e04313b978858f236a5592b1b86410edd3b73c319b99f8f0a22ee405a477fcc386c1735ab4b14af265ba3055c51333955e72a6bc2ddd6fb8e3ea6f2b5e59a9e593ff87d1353415d87ff63c03b843085a9450fc592cbf1fc960d876902eeb3b7e9083cdc76a8c542801900245f261f3cfeda8b9b328ad9d84a16fa6ce86bb15d0f4c4a1a7c538aa63a32e2f9713fe7a47f3007b3492274d7d3e165c50f637ed9f3958cffce5b76d3dcd1710718d8720551cee9d6809cac4359f6313a20de0173be6a695214c873108f7f1516fdf7a7a99f3c9acc7fff686203dec794c3e52272985449ddf5a268a47bc336edc7a76ed78f03835ded53907efa208d9a9f7ec920a8da94661af23cd8c7253c551fedafd649aa0b5173a10bdd6644ed165db4dec31784b3b62bc0d9f49c2d8f16add352eff6b9996fb8f0c3c76ed24ecea48c49a40cda0c95cf122640216497f81860406abeb8978065489f863a53188c1d10f20bb06508cbaef20b037f51bcc3099c5f8fc8306c4c21b18761f34fb2167047c23f2bac0f1f71677087dd7d673e279098a53da9809b9534639fc14c863444399f8aa4378a5ac0793d12646efe321b43d4f644a93b3568d81b89cbd4fbb041ef7232438fdf4442315aed3baeeb678cbdf9c806ba05e243a698673a6e795110702480323b78a5a096b0608cc594a52307f064ab634669cea4c08135a368de59c49bbc96c3bb4582b125b27c3963b48828a2125a2d6693b0dc7c1ee5f93120c3f4c12e9ab012ec8e88a22d3594be5b6228f61a3b9ecd289256b58772fa3adff7077d1e6389e4616f261017df5d0f635910d3c37740e3f01b195105032eece29d05b6d31cd6996dcb9055b9a11dbd9516e72356369b11b2f42d3adec01caff35cf75696eb2099d84bd05b5ba45b30b741b5cd1b9f35bd38c49a565ad24cecd8dce444aff8ed4b6a96ec0845109fd0918283b95adb98514834688fc36146095ac6d468666cc819ea55ef46be0c7205ed7f58cf5b114c33abeca0cb5f94937041c2cfaa026f366a222fdefc0fc05a3791e33cf7656ad7cd29934af47894ba875577def2cd28c1a7d8cdc3128155e1ce46543719c20ec38589d16cf1548943b85e8e08280dc0f036d5d6a56f5af38f32d47a521db82498c5955010aa3b9ab76a23ae56340b5f4b80e1f38dfde2c1ebcb03ff94eb90d5dcf413b53d0777ef9c046d80cefe0f2b5bedc3cc82a363e87d029b88066b92481979ccabfcf04fb17df004ac7b6f614fa7e645088c492390cd3d63c0ae8605a6d6be88d8544d0a08df95b0d9626d48f1b8d12d4fb3d76bdf64e5244c962233169c2a0ee44d06f11b4c5b39af8de10e3a1417444b00368300c963a6d7c62862c1f2252878ef034c134baa66d803b4f951452152a27a4cb319841db1074481dbce60179c3c432d631765ea00f9cccc525ed3561ffc2a0243531e7d0d841a13e6666e6833d7506a7d502083cfbdf113608b441d720216417ad51eea81f750c8cab1a581b5f21ea3e3e607de9bc979706dfe22e0155b48efa2c80cccd708ec87d1d68cc8ea34b6c1de009f612cc86ccabfdff406ceb0c8f50153718ad55ef83741feaca69a461faab4c672754a60d20b9f5743f766a99c3cdf9fd38e44a27bc263508b848ccf6148ad610783bc39b41a558e961aa5edceab86d3bd3feb7b7e0f7ff5b3c88978858113f9e6f14bfc19df29ab75d9522566293d18b40594920806dd14acdc59e9923f2cb59828bf510a4263d6689b37f86aa04b964248058e218fc4d6fc26c4c9906942bea491e0df8e2b4a39f8c91a0fe4f7f974ee700719d1927e632d1092c088e79b3c9293754fad8227f9acc9c411db168fdb40e562d821f751e2c7008a7881a17f56eb9548486f2f42410d04fda758e555f2c110de7518a6867b50607596837e383435011f73dd1ae337a2e28c79624b92e2f8574398bf88645852971bc596690dfffb3ec378fe2c5203f3cc3b2e013390d26e2358e81c83359e540d44abc34745dfc2b4fcfedb4bd6ce8828d06f3d8295eba9dde60e3a803f78df2ab8f0110129fb14cb91ad7a60b9c0ea5f14e31f21ea5433ebb5b11e68cc0c7a563e3d897f017c78eb4c2fe5544100a0dacf33aef8d73694b78d7ad2212282adf9a03a31a91589777cf329240db7b73200c906f3efa3b952a736115d958903007ba48e1367ac4b98e64f463d75630c2938c905f4ef9804f725771dc7aa4bb7fc4413e137a20fea6391282b3a738c280bec99d8bbdefc400b981a47184aafc528bcb4dda340878d60e6468322ee7b326383ff2650a618941468e536595cfc550c4c5128612b5a5c184b70f4fed07953b665c497b92d34299cfca19292c87b91315ab06a7949d08012297026d500ccb38ef9b0d4005d98272abe1605c976749f1e509a4cf1843321d6e90cc3af66bc7972a98a852d1c8bb547150b35084e2ea75b94d775d3c3c966edf10d7095ea93ceebdd1c52465456fb796949ca5637f3d271902f8f27eedc78deab3ad78d7497d980fb2ce155ec42224b23996dbc1c0947e7aa6a3ff3ecb27f317d5da0a2ec12c3b96c83dd61cc955242a9c1c640e2b92f454c4f2f41a793a26fd13c73d93a4ab31e98e9ec73dc97b2e864897ced724bb214dda8071806c9091f0ea1f63c4688d238e725b69204926bc4bcbb38c8b407f7dbc53b6e81f19bddc99c52d4d2f813478ec201e4c62ccca45e1a1da1db903527226bd10d82505046f5e317b3a339353ba88f431e173c8e863fe479602def1c697239318c260b316b2c4bba3cb8ef34d60fb7b40b8e1c2039ee84951cc6b705e651962592720b8675f53c01161804593f4aa31c5432b4cae4f360397eafd238c64aea73c77036978bd91eb6e9cb5eec9fe1ba43a10cecd4b0d7e22f2def26fd30e29ee4d52775abd65f599f5fdae7351d5d63f09922ad85c421703ed28e9d9c4ca31840619fb10b7e0f55851e4c857be24508ede47edd274959742d15951e5c4314c14f16e1d000aa717a2fce292208162110002b286600660855c59d0b90873dbd01d899f4bcd0820e3167187aa522df7ae3f216262e5944b57bce13f8dd63612741a595e05bc32f6de0f3a446f61268d6e98a4c821f790ae84e101e64ec39d8d9e77cb0ae9723d916f19c1995fd20d7c08a92764420aae12936526758a550ca5b5d2692655636a792ca2a1f6fa29355bd2ed03b721832f1019b5e96dbf0f25e36096be40d8246c268d56560ddcdb509573d0e4416f15a61f7e5fa52f6b565bcf155124eaf02995220781581e666cc1c151f123837926a5a947cef43b0dcf20d14a8e57751be777e431d012d935521b57f3ca4c0dee3aa035ec804 MD = 71b950c0085388ddf90444c0918d72aa700319e789441fcd2da539c12a32ee19 Len = 48824 Msg = a053265e4f9b8cb00d88917e4a194567bc7c32a0542fed397065eaa252ab946dd1cb9d554ef09380ea0cb501f67704a1acd99ddf1c49453568b6469d34867a54597ea5ded9e2074a18dd32b749221a1726d46b33e4a41ff066394fd0b1d449bba034e400d8b71097ffc3b1a92964ae51933644a59486a1f0d0b4ae42afdb2c2b0eb402c334b8d5ed0785dadd7f83e8d85cc7d23b1438f3bf10f00afb17e5492b0bc8a82fd32d7fd798ed545d34c8f133e74fbaff4c023ee58cb50c04d238c843ff367e4d9e5e35da1ac1c8312e7bf1ea9e96a7f9252baae8aeca5c64c71cd2fb52c72b247d922080f5cadd5f57e40f86e8633f3085fd5e52ddf9a123dddb8fdc6c4358bc5913685091d03cf1964b748e2c802aac56be83aa8008834afebc266db572ac1e182734d2579b8ceed2f7488ad4b311757eb7407901c0ace01106bf36961cd051a417ac8fadf2765ff531b20347c59c94e730be46c7e9c1edfd0284c075086b5de32bfa0efc9ea24be641da80ed7e7210777024993a4b6d7aacf89b92bbff264bbfaa43d7ad68b7ba8d6fe9892ea53cf118c19bfac2ad568d052f2c35d1c9a9221fdeb27326155eb5d20307a67204a13fb1694bf2c7d92431f0f1602f1d2e9beaea0d6c69d1703e429d445b6021614a0329b15b08b195806b55845e0a09f6a4ac0a809c411540006cd67b0e3ea385de456ae1f4c5e8aa12451c314f4dfce86d6f667f6884594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf1872407568863b1edb26b4ee022c6ab148edb081306cce98decea462d90e90d60ff292071a3eaef6c12792abc20a7984cf5e4fccd6e8168f852d88ad0e2dfe2e274e90d555977ef86b1ecf8f4dc4378afa1f3e68cab89f05f477eeb3525b7e8d696e8208a4f972cbe0f4b1c12dc06c6cd319c57c944631a031921e9c3000da9cdb3bb0c78ccc5418288f8169ea68e0d162322c30bdf894084668608f2d84d802879b613b9778ea864cd986b10a235a62ae53baadcc388fe63ae0fcb4d35041677577df8c4c65fdbe53b90abf1758a4c7bf65b81b496debe216e13934a9cadc75acb870e133fb5467451653bb997184a79d4e6ea2bcfe70a3e1556137375b73d234445d62d5a3b92a2bdaaace16d5c3aa51f82468ae55e6d2a323bae4066bcc261505ee39b9c3f2af0cec572018ec2979e2492298a7d9151665338d649d63b11a57e26a8b68c5c89df034a2d8261e7dbc582baf582df2c5182e6d21df84a9e85503c21b83680f039ddf9ad31ec9d3891abb8515d0ca08bd8006b9c07c44a73980218f4746430b6b56e206311c8773133c143e9a2a0583c6f5f5ffb06364c46e43b73037ff801fc771006005f7eb66e4ca6a40878b66cca81f04273abd6c674d45cf8d33d4a8b5e195429097da7a14c46bc672241d76492ba73a19a6b2e5faa02f708e82ed42347f6bae7e2febbee67ac72fbcb808bc631635a0bd3c6956e42da8a31b6e73d6046a9a4f1315523e42d087ad068d74c18233703cfb440b478dbd596f1c3d8eed8d6acb2a35903882918c534838e9880b0f480118bc05bf405d17eadc7938650e3647a649cdeac5133c77d2093b156c24701e8f3ce6c8aecabc0502f21aa721c169c8d2b3c4692078a959adf7f55949940f7dc3ae63d5ff6c124d49bae7d2e98e8eb6f8700056723942fa8c1b4ffc47e1532d45781974dbafc7b8693bc900e6fe0bd9bf896bf9e2df6e21157b31488d95a3f5bca2f2ed6a1a430e077da67b409849f9d005ec9999f19498f32184834437699ed132d587d335ee17ce8968891ee4b0ded2ec6a7fbef71e25cc152ef693500cf12b32a98b3f88319a6366f573a86ba94f6e46cff47a797391495d19e9a367f4b373a95841d59c7261711c378108b49a164c1c023ef500fba311032ba39b0489af50a0c9f1bef81a329eb414fa6348ecf91375eba556131e25cd0f4e6ea4b032ac6b1ee4e3212492d692357628e4ad08c16c5a7273c63b44dd24876990e6f15a716b2b915f27a94115f6a74451b06d5436fed27fee6cffd595bf756452885266c7f9cfb8acf80e8eb6721366bef2103a1f72e5fa6071e7391345e027fcb358bf76bd134113bbdbe383ad80c3b7d01c21456f9bcb0ffc7bd8205fd199d68e8dcd465efe14dc9999a74250f64583721b71719efdda4436441b83b54fa4284278f8ff85991a4fb9cf41bc027dd36c01949169a6120f4646c96806ee622f39f6a1a968d9eb39b344051bb96c1e55b8a510ebf531e3535f5592286fb2122352d391464a03fc5a5261c39c0136e0b4b08516e6dfe4768cd58b28c487ab6866bb01cf396daad4667239922c5b07ccd69cca2eeaee69d5a4f10f12a2167f6be1bca7e3e899777c435cf3f9339087e8a4c49be05fe9680881fb0ad82ce4d6247c9ded56bd9611fbdb58b88119695f3e066f21b5ae9988150d3ba303c9b8599920a5fcaf1e2b225914adb0b047ab37d6e5e784343dc672062ef8031ae05bafd4b31dfc7675224f9ed8a502112321b6b62772ebe67537cee3ce7c51a5db9681dd1e4d1534294142d30e86d729169285e8b6597e51beb643b2d40db62d212f77ba4a7d6d6fa251a3009e99568289c54c7478e467ff8109797d28f45a391aee38751ef52fb24819192b6f26a8a3e283b260575acb7824f9194bb27964512e9d6d1681fc818283634d5e6b75f4148b945fb63a05d542114ecb255ae3fdfdc502bda35ddc8b69bbf5e7a079cd635eeac0fc7e082baae7aed03612087c4cc647e7d12699db76ee58988efa81781d0869cf31beab1575ef6547031aa48a7a331c1250a61d426a9ac214ea726cbc499a6e88a5800a0b5ce09d7ad9451656aecdac4be32cd1598ef36131a41320e20f9c63b401cb0d548744bd32619c4628111a605c32bf9d670b839eb764e286319897af1beca89c3a1fa22f3743261c48cba49e0ce46769b609d2df6dd1e986f30c13ba850f1d9f034c835a5126eb81fd03f3cf22a22c1d8caf668d1c942f096e9396ecba1135fef8356ea648b2f45b90e18d5c671317a13225c9118c55bcf5ec53aaad819cf5a16103eb7be3904894498efcaba3e02fddf09483d185bb9934b377d665a455677186dd8241eb68ef127032c8269db07db90d241a37cf6ecdac0b25a37ce9e69254aeecbc6029e1f2bf4df477341f2c071ed3fc18aa311760473e85975a19f77e332358204062a4588128fd933ceffcd7f288450591755e5beb93c13c67fc2f34f72b48374a615929424875a4a8d6c7f51f7526675661eac58251fe1a0c5937bb860fe487e4eda76ee9f68330df9c35678be2c8c860be64a6f3c167b7aff9b61bca17569a77cd362e5e7a4fc14909ef37201652af17537306262b219dbaa5555daa8ac3f86ccaaf71891c02de4ee59d6dc45beda5e3eac0ee03d757549323bc880db2562729acba3f5224c41056f7e70f61f7c1312c49f265720c2f62a43b92a4ddd534b1183bfea1a1d9bcddc9087327de33f5db5a39b2745b13d15153b780ba013c881ea03e249e5e8413d00fe0ecbc2357b22bd582a822a63466a90a5e2dd0612f78f4287fd33f716df06e9047f8d718ab1faa06ec7b773bb716f030f742f1e5f52cbd1ac4b48bc2dc7c41b5053f7fa57765df533fd47b02e408b02c4b662275d8cd00ddd66f8a3919dfd0e4e16abcb202ab5225425a37e40365706822426df91e8346d97dab44bf6b40a386a5219627951a8ce5beb6b2c75b54b94b437dd959107516768010c23a1cc74304170b16ec78da14f97c8ff49535fe123d78c06e7df6ccf81ca9470b94729e37c400d143e9f31272cb418e0634d98b03a687b3354d18af7433bef827b3b6ea0730271b26074eea2fc1d85bef8e8f2214ef39fd35b2bd47132388cb1f812fd63caf5690c52cd08bd245089db7899febce7e564777922fbc5c54cf66fae427875da853d82a41c21de3be98fc670f500fb8bca63801d7b435d82f5b74c0c6e428f285e79c5d2f6cc7eb9451220607ecb65b11f079dd6795da0d1af39b790eafdf83adda8464dc16b2712efbb49c58b9073de6feb1132c1ad4857e61832ea4d0d49988f43749320806fdf65e5d32ec002be8a19689a90c8a4bc8c46bd5e7708f31bb7efd5e141889ea175341c3ceaa084ae4ac81a9a9f12f665c52da39aa59341b72f7bca0cb75e38648ad6d8e7b7a1b8ab76d87b81ac24f4ecb927556814a06bc455bfaa678335c03176dab673e447f16eb4e6f5f0567332b9dea06d573284e3cbc127f1722393d890df9c1f621f07d1408b5034571c7232458c4535d88dc55c35f84139cd26fce3fb0ba77e22b675dad940c091366cc666186872697c94e6078b71a7edd8fbd564e8b1897d3648f670819ba4a70ed5d460bae9b452b3d66ba834b3a8781610b1fde237ce773d551e34e1e278e050c62094a596878c0ed0daa0da34df83150416f16024c3167859618a62cbb9d79cdc4f8450e5689fedf29773e48bc979465478f1eaff23b5a7c444f39cade3e7538695b2555cd3e8f1da36a3dc1ee2d53a705c71fb2d4cef2c344d02e80f83ba1543a7a11b6356118af64cb33964a81151f645e41945cb1d7617fe3aed6715aa4291f9c32baf6b8449b53e247503a5d83d34a9eabdcf0aeb25edcd0e155b16427bf010bb0e8780cb8eb57f6a276248744cda0cd8612fa8b2bc342deee842020d11fc60db2c923241fa75a506b9072c801154f34f9bee111e9979b56feeb27584b5058eb60e360ca1fd54339cb278be862b13e1b2d690d0895e2ce8038132cd23c5a9dede3c195c4607ffaf7eac2d7af0eab54c9499ae638d6adc3a4c58399574d467f5a63e82cdb8bac66d2efe9bee5ae0b7b8876dad46855ff620accc3d4af261be57c07e28bd7486571140224a851e9d79a9edcb03f62bae093fa765c47a26ee1b699f8351c803eb102034dfcfdbc68199854a2a48fecac583ebbebd558f8cda0dcfa5e6c459e169802e9f5f825eed3d85ff2f13e2ccfd3704b9652b67178ed613ee7600c70f87822570c25a189afd11dd6c0f0077ed3d82fa2d3d388f9ec732bc4a7269f04570a58eab5037d8fc70aefe506c886eebf639e2bba98d2581a0a075684d9ad69837741a32bb716a0fd2756740ba043e25d1bc3cf92c61cf5ca58fcdcc4a1bc064465e56ab86af4251ad05a6b18a1c7c373a9a874a588ef3ac605123eb0a55645627d4d28a2449d84e7ac04b275f299facab455033904d18ed5ba5164900e028da46680c3326c9b2729645b326abd42ed2ae5d06597624d59be1fc237ac034947d3c88625b00b7674ab9f67d13f2748065ae4238007cbe8044adb6c9d4badb1d9b74d68346448b4d5340631783b5a35ac2458563ed0672cf54197587fb734c4ac189b2dda954cdfb18b41c010a77e90464eea6f863c5da0956bfa8cc636bf0a28be5addfe8d3e7e6f79f71d7fcbbae23ea141783f91d6cc4c8fad125811760ab57133818892471a79c6d04eafef37b2fbe506785318f939837757f21f90824cbcf8cd205fed8f3a363a765d865b1d88e5e2e078a919ef6ea0e9a13202fa0b58a31cd2c26de63d660e9c8e51ee5693ec645f787f29dcdff30dae32dce89938b7d4a5e76f99c47a2769b6c333ce2ac167e0267595bba8f251308eb4f7bbb332f0b55bb630cbd16d03af4eba0a0d1dd080c1fd80c247c74f0f7350cc8c6291218bb005e70ceb533f84482d1ede9578e8c06fad410fb57f20b53dbe24a2c57b2c102c6d220ce29317329d1b95b84d8330ae53fe5f83ed198accf59e6441ccb87b0891590e3796d91e9414e0c79f1d85d1d2d3b78327d8dcb7db05b934715f9237fb46925395f06d7b3216435e9bedc8f3b458a254015c12cf6ad4d73a3b664f886fb5e09a2ed89657940c0dffb4a592bcdd4b857b1c6201f901cac021a6c93895ee450a8b0b379dda435c0654f32e2c57d412299f7dd3f35e294f3b8fbb709587ff5edacd33f3ca2bc670f6055f6edeea211756692e952e2669cb112d8143ae852b681609aef66573a5aea5ba004eef9e4dc0d3803692fb784aa60aa2002bcab8f8cb87e68526b6d96980db1adfb6a99adf776a8e9db0a17c5348ee96400e3348f0f0f50dbf6d0586994d5fcd038f52075fa3e1386bd96a5c0c1a85b34ad62f5c9b3d282564b299a2bd7cfa7c75bf330c55ab0128a9f49c3dfd82979e2569071c801be7d77dddbb545d7774cf3b3094d24af992065fe9804aafe9eb02d9b103b127f3fbcb10d5b3c402a5956d5fc8bd80c6f45c7993a05ea8a9b84a856f946a43182b2da82884c91b336e24ffe871f53f4f04262a4f007e8273557ccfeefc86f9dc2d4316cad14581793aeb2cdf1285376f91bac19af327fe962a49895ed09dfcfa5f05bf00a46e1d5b71b09d4b93b58fad03dee57d61a244999d795bc7f8f874fa2b3d48d1e58d18617b3cf934dbcd7091c35b3efe30387d0418d3ec325bdf8865f8b15c467cea9913c157e9a3d41501a437f97528492ed1600220e5a6e39960c12d2aa16552cdc9faa9c8159e65d56b6dc87f320094cf6733c328ed2c777025993470bf384d7ed09d9c5924307654d575deb71c90f9626808c3b3adcbffaaff72744b5fc75644d58403d0bf5ef0db6842e267dcdf612efb646989cd8b649015d6558329185669003844f68d32b9b24b5e3a581af5b27c49d11f71f4748c6a904c3fdfc43633337a40c99337b3ba21a75150527ddbd6947ad64d35ca8f6080975d9a29d926d7eb6b24f86f64e9db70a4a18b1dad98b3beb5fc599bf9e3c819538fce270ff128d8fb6d3b51bddd05e669d852805334334222c9ac6c2678ad7fec6d43a20fa0104450a2f903e9961ecc1f7d0f4417b83d67eac7ae6ffb57f5f8897c6261803b7675954b994b911c0f6aed192931a02bb877357ec76e20878acd5246912e0bc841b4f0f185f25d78c108fc33080f97958eb82a75602f3d105246705239cf58515b49891b24c0f4b11bee745314a6a3fea673f234df7cf9fb37aa0b28c30d0eddab7c8951de7cffcf04647c02b5be6d6fe8efb443ae1bfc4f20434a5195b0d5751995181b1bf025db66b13cc6531e9cef3c76992b33d4ef14f4575654198057208ddb5d0243e20fdc281edd2a568fd9878a4ec973d8717a539d2f57b9b64539e6ef97818dbe1b65da32f387b326d9cc3ebac06ba304b8441302137409d3c626cf2712ab45f563cede6c7861eb2bc41c1cb414a8431e73f65c0b4ad5cbdaccc4e41e9104b04e81f2eebef49459cd1872296092a7dc90683736a01ea387321fbb2cba5fb458323f7a1510b14785759c756ea78291f5c160b0aaa9d506c54387b4afe4c3e2c50a630e584af5a3f88919cef26f2b8d17192209bf0eb8250e75cc57768504b77d3cb655c15409d039735724bda2d6c4c90078e97eb70f29e930b54b88836b5a0a3200f8571635f5d0991e20d826cb5d93de28f8ed8d2239dfdc0b39eec840f3f452099e2278c03b4665366a4ae55281fd1bfbdf1776387e77e196c8ae3acbacc10698f02b63f4c9223d66a91bc5b358901fb946015b9b2039a71ea1d2c353abfbb5779679bd17c8ec8b778554b03509d3532ad4b5259146ad976b6b614a221829c66c371470725f2db632a8fc8d21bd4f1d15323aba63185c1744cf64b67e1cd4a3407b05624db76b265cb71b44bf9b8ae64408980459bfcd907375e2f1b0df83b3bb0c537df0f73143c05dbabc57cc0e177dfdd7eaba63886bbe04e3e2ff88be5ea48f06a7a24804752540dfdf3177631689b90053d02b160eee257071b53f0e0cc5af27caacd26e245208959495c50f4d30e51b29e140fee3cb7f8f86192ef925e412bdcd56bcf6b8105ee1c3cade9c2239292e5336cac8501cbb4b09727a0911ca60d098e82f259927eacd5419e992ff6e2c43b917f0fdbfab80a9e2094ec6393f426913aa52812f5f536030ca0e774b95976143cbda24973e77b3fa26d0b7030a5f8e26e44e94e38041a23d2577d56e771191d99cb1c5409e477037102864d8f5614ab9dd4ae61b515e9c64714933d0dc43da63d09d68229399e882117f5521c6eda2b4de6ffd409b4f558ef8af1ad98cd444c9b0c596a5e41524c46ffd134446aea0ff2fe463bb26bfd5a100cf11f14e6dd7f38452d6315b622be373c925ab3d494b8218d2a0f2ba542587d2d1a080ebb69cc9946bb12ebe2905c9650c13bc7369ab26e1613a4f1fb64c26b6de4fee2c569a342739ae04d611bb5c8ded66e1afb4c9d1d1b8bb391c8e5268f31ea7a3d6f6d91a87e4551b6bc354863295a581bbd2ac6c3100ab187b844033d3b82f07b43d6265fa932edb45e6d82d9e2b58035d6c5ce049609053023f1d719cd46f828dd43cfbc96ec2ad2b23503b17d807d15e2ae2136101f4547a68f109979cf07d28626fc63c9e98f7e622c397e6c43b5285b345efc10b5e82aaa6c5e30c36395e4e9004ac9a4b38223f8a392953167bee9cb08d5bb1a557455ca2a0e743cad38fc70602972d9c2b97fb04bad9a5f7500d69c8c33e78f7660556048afd838144765b6b716e3bbaf8bde5374f8f268e4117b6a4ee825f2a MD = d5ebd0d3d544e46023979d06b666f35758b69628d95abb808fa65f51f03b81bf Len = 49616 Msg = af08305484d04608c43ac58d68ed0bdb5db6044184794af8fd6e90fea5894021dd3a635a8e57c25d6a574a6e74c0b576c2e2675681c6967b3b62aeb3550ef43fdc3c69298163f1d8e13cb4e10a31c5203b130208ec0b3b370ed3964d942531ff32740a6765db1c9eb353cb8d3428820051ae9bfccc307f5301290e756bb64189694c0dbd42a68bda6702571bf98d363f8b1cfbdd291cabf899ccdfd3e0aa6a06092a3cd221ae86b286b31f326248270472c5ea510cb9064d6024d10efee7f59e98785d4f09da554e97cdec7b75429d788c112f007ceeda7bdd9aabcfca562a78a09d39db03123fd722b8869e3c61e2c36469949481a36da9989437bd4edf50bda801981f163e8d75b0dbb542bf8e3d0c7f33dfb223c009001a7b3b81916bb094390c42c24a47884fc8a0410f05b2f57b67d8d9046b2ef4a8eab880c29be09326da26fe6da713758ef26ef1af16b3533aa3c14a3260d376c890b1ce2975283f9b13b795c8368b9f59b6ae8ec7fa7b9f6ebb55fae40a98d98895d0ec5e2629fd1a6c27d07afe974dd99dc6e002b9f0214237fbb0c172656311807ca408b6cd14cb6ede752c0720c6362e1faf055cfc20dca01d36719f235e8bd91cbccf2efaced7a0454c855a0c5397f221c37beb86e6647e22529d99b8101e291afd5d959a71668ac21f2efe453c246f34e40a6c75b9035772cded690ec2f0f6dd2f57f394469fb5beb4cefbb1c9072fc1d95ae9b3e2e0b5756e08160cbb2ccbcd1a6850d095aba8a2d40e5a3a4265ba2e6b146927a8251f93ff97a89945f82d528536b536a6b2ebd4479622c7ee6996e562e0f5b955f71e344641289fa67ca6d43a6929aec0db07bed50d5b3f16384d4c86659451308039c00daf9d0527e2bdbbffaab5202c4e83c6461c0e8c02fd67cd9e4c4ed780e8f89f1a880fb3104ffb6f9da160743334e756616a4295fade6acf743c2b338e57e33935758790a9ede658dcf532921bb5bcd5efa0ff424603e0bacede344ea2f483f6281e0b8639e408df834e33622cf889abb8654d7b2d9550f575da700e03e75f3fba2aa67c0a5ce96a5c566ccdb026d63f84623528f8bc43ea31d7e85cfb59ff7ab2425d5b627c0f632db2e4b9ed662cfb1b3ebe31f09f4000c97da221d072ec11d90d3a098a6c0430bf0da3102ce1114645a2f17e5a67cf9f0776a843cb59ad6af734446fca55503bda0db2b8b5be1088c936d4f8813b782fb16702ac3437caefd45e8375695f79ea455a189bd026ae2a70a17285ac44c41890fbb6425333cc0637340004b1b109a7ca9ddd9fc5417592028cd00e22aa3ac36cd8ceef6f763a19e95dc202e87488d92f7e0aaedb36ec29479ef87c2c9463960da65199d2279c8fb382d15957cf7ce73da4a6af5c2e9b570680f1b5122ac5fa3a0e482ac26f7bd05b4b36ef46eb6f3bbcb8b9898e500b8509d9c3a31c96ea58bdb7ba8988765d44a95ff8aefdefe83c74614c26bac5c3191652772d92fd5a165c4baf9e6c63cd5367671f7cc30470522d48656d27b44b7df693133abb8a9b9ee06f3051b55e50655b0ab443e2528ee5ae150f461f462c177143a2b4e062375610cd438aad9170e24ef1beeaa000ca5dc06f4f99e8a3ed514e0a298249b0b6a8b60df3319a22b43209c445594637ac232bfe2f4ecbf216925792b28c3e9a9efb98d7452ec539a4bd512a52781b1ebd9db76bb64e105c3041528044ba074879b680d1436976ffc9ebf1cbeb2f69de84342b5eec7fff08c2c8087fe8f4ebe3ce4334a6f4cbf59baa25af501b66769e8950517edacae01e548e4135a522339326097cfc603a8936d0d15561e7058c87555aef748717fac86efbc44a832c287f0870227c909f7bf8c159a9a559f4f1c16fb8cee7fc4f962c99775b678afa0fd0fce0eccd8be31308072374c5781bed735fd4b6803f58fc725c6acc34c37433ad8ac1a49759ec998f2a997d684c62cac5ae156fe75a1c74c3403ce0583583db3f3b7b108403a455b4b0218e37deb2cee0e3e2c0c354824647cc555f7ce80d4eae9676f93a90f28fa023256dda35f143ec86a572bd3671b925881e1147e5fbd521241b266108bd8e7a0a0ce3f859096f1020c54d7c07d31686fcfdbe623336b8c06bd061a274ef9b6bee3eb83953e09b7538aa19a9cf8fa591b15b2d74daa53fb4f5fe70a5db6ffe9b5623b4472a600e4356bc9eeb978dae6f2ea12726e32fb2254a0e1c114525ff31ca239fc7e67012a10263a4eb66b57947fb35742055be583af0662d8ebaf9e656d2a6406490f7edb7c507f25044ef4e42a181dc0938397a1c71706bc643d3fa31f71460c42fdfe8ae261051c339237488a7eb2789958760f355939e5ee79b84ebc0d5c78fcb0f4baeaee689ec4e39344095dd1c4a739252e622368d01af39ccabb6513d6e6d6f5edee3f162728a19d692f4be84f1da41981d62c30155a1951a9a5ff08a081be769674f99a4fef6aba2a74af62729d27c79c19ca1c202c898b6e0461b7507df5fb3717a47163798d8dfa722edcd98642b3efa593898b12928e7a4f038c810c1bf8523eb6181c67a86d7ba010a3ee6973730ef20f04b0ace2ef70ee7b149cec8ef27a52a51ad52a49ed00671b741bc748694c97931a2b4be932c47b2ecc1e6fcd7e120bf7d62841c0913b6f95ca0c20101b5afec636658013dcf77d953f7036560fbbc334f6804ecade8f0225f219f4890daca02ee5f9da01627c5e44cb5cb0c70bca00c2d86791c7496dc72298dfb511c4a42423a552ca2057e5a5c41c1e6f8f06df5d581868bb24567a47322ab80228b4e3e35af10ac0ff11a5ec999e4fd31c956e213b22ee3b807a16dadb245d4c5c72ee661b657c6efc444f8b1bce6b8c0e1bf905028472935a48d62a742219f42b6326350b5f4224b6544509e128fbeac22f026134b9805320373a8e938098a9f42a2dd8a16ad672abc628f1703a7b8fd7330cde583eb1db60c9b6afbfec23ce652c57b953f4b3d95b1e6dda5f7f54dbcbbc9ad4d38061cc9a74cce66fa175e1fcde466fb9a964e932c1761ce564226f0e401edd3d2b2a873bcd0fcb196cf98509d47c6448d553f2c153f441d8856eaa1d521b6ffb9b769bd336d1d6439b19183a936c2f68252bb6854a4ad17f5f942d776702f5a55dd09aef46c59074a87f2bfd9f9829be0536850d18ec54605f3d69baf38816b0fec2d4fe815d7233317620d15d72fba0f21eeeb7547b431210b4df468bfd3ba4dab7fa6f5afc03f5b2a8a74451af1dc7784f6422616a160af0b50eb894f4ed078e3a7be04843be42a8712fc5108ef888043285bcd42b45c19b98687fa2e1934f95c4d9cfeda719908f8a1ad21ea524692282b40531417acc5dd98d0a3a45e6e36de184ac9fa8ae65d43df909e07419e15f9a8f99ed4efd81d412dce6dfb42079931b0cf4f2cad53913176acaea9e519717f468c98ca676987acee8a3e79ef86891cbe3376b702690c8a0b093a16663e0e82ae03283da4e66de5820b00688d736e69ea7e28e5b2af371649b02b97eb9654ca87653577d1d736b59359990e4357afdedbb94cfce5ae789cd5a867749ca8ac1e7abba9be14c44ae4c67df3b43ab9b6443aecca45c2ec38e65af9d8f5a2fc7c472f0c6b5b9536113ac57ef4a19a21ea62ae1d8a0872f3e0ba7eac6562251a2d0e4d6063967db5f37f3864861f8a17b302e056738d1d4bd6e1e9c8f5024c8b28397dc079b6f4c7587ac6389074322479ea779e6f1be97a84234455721e40d6d4906632950521f6a8f41801f9e9bbcfa4e31cfe66fb010a5047375cc3fe298398ddb1c19fc92dc94bb5d6c7abc64da19cb5777c3e768b83a41769e3d0ea2e1adee605727f4b40c8a985a7928d530f21ca282f23e0d2b06be75983f5812a77240d740b4f1dd3807c2a2c336b87d82ad79404edf83457974c81d62c97be052d298c4f6a5f61a8186c37712359819cc64b63105805224f69adda560dd36fc578afc53fcbaa34142e21361d1f6563e80906a015195193004d175aa1ceb07cb07f401f0cd6397c5deb2191f8ce9615041e8fb1dbd7e46db36c11697e1637cd0f6b63027d321323cc76f6aecad9f480382b6e002a3bc79ab1ed236fb68d6e4a2963a1d65c88400fa9f827f75be7878acc592cf3caed01003ff9d5d411dc5fdc489080046f7fc92a3c983dd273a1581c07cf50f482949a89a8b8b00057ab1269b21a8af27fc0b55acc7fbfa9d9af6e1f32b6626a1cd89b1c32513b5b50a18ddab028470953f20c89a3d435e356b8d1799535eabd5e630ba027edfe4ec467da188ae23eb1b5bed79e07c028e8b2648a147875715411daf2ffcdb3823f7aa5010a8871f7536bcc1d81416b1f20b55da0d6239d7e99fde858206dcc4e973b020897f2fdfa553ec3e61a99fca2f326481ba9ddd69af3e93346eb4e5febbfcf26f9a90fadd021f64c3a51569b39c9cfd00474f0484cca9e63c348ba95df1dfebadb2728aa001d5b0e220ec2726d0a769b621fa21a1c87e521d81ff796b41b9066b7f8851c12b334b2a53923a6c51ee4513d913c75929084158c584e89f1204cd194066e2a8e4a4bdfccbac262ca6de19b9db40580374e43e6e7db07961f93fba47a382bfcfd49663e9e79e7cc026035218b6f47649229ec3cf1906ae7c5de6586727603bbe71a4e76235eda0cf75da78a0eaa48482c8a45c1b360bfa16b68522082a8408fd224cb306352e24b31cd007e2f4d52558bd7181b34314def9a998a1ab5b6289f48cfa514673b48b1371908a7f541abb2397a2bf27ced5df7d8d9d41b10890414d083a3c93603556590a787aa686c9b89bed946ef947a37e1b090facb9d071b15f3a88ef8d8904e90c7e1453290b76cffa05e33b983c223d6a726c2d36319b7cb37a62e4856cc7e59612e09e5760a643e696fb9f951ab69fe4703f5db6aa81e5e27e64b62b79d2ce9e8f59d6b214ecd6ea0769f57071f508017905b8abb9a99f548ceaded03ed9f67e4a0c76d9969edb6cedaae7aac0521849f33bb895dd970b824c71b9242a320fcdb965093e7450d3f7a03ae0b484425346855de7f584bebd0423a5ff97da7f7d0573f008412c974312c5967b1e4c6a1b6f95f8d15b5da52652a8d3fc9bce16c0adf039ee922dc6cb36d44a0158672e032dab78ef37b6dec9e652a84ab0539c7d3fc4af46920683bedc32c23df393029d194c7a9c0b2eb02a47a77f64662974f52347cc8ad13542a08b979b6b602e8c3baaef6a825623edc9ff1de5c43dae34db01201e35c0388812cd4932242eb82f717b0ab51c9944dc2b653c57f49750509141b410d1ff8eb88809ee22e2cfbe70d0d23506e555000fc11269628013ce5cba7d9a50d9efb67872d9ecfa41c3afd4dc68e4cc5709c3fd1d9f5b81d12366bdb90d393ad8013e3c55a5cc04ab9b1adfe6a79071fc382f28b36459327266c8080f89174b36e49488b30611eeaac67e06a206ce943f50901704fa08f0de2e40a04079cb1e80fa47c21d734524a9c647cd711f05afbaf3954c94d8d1499f0a8f2ade47bb0140c2c68cf765dc23332b16a8e658cc20d991bd4dd57958a91f8c021c4b8b6dbff0ce9f4dd3665d86c165593d743c989425ab667f6963e59bea1327e90aad69970b8e409923ed3fbbfef58def9d32e17629b13f65a3213e9e89408f05be3625131b8248d37b72f92f266c3323e3f43d43503386a525299a3d6794a616b8be26d08b3b16a14c80207ce229d79ecac9029823b2fa9261e5aed52f7feb80ac9de54be519486719ad2c11bccee9a4c449e7c13ea009d1ebfdd3022b62edd7ec5df6e1b3bd4cb96542a28a10bbf7da62ff436aeb9b12c825daad50f5fe1b70fa86c23e619791fca1f8fa42788170a42951ac01c504c40991f4a42e19a2030079a0edbe9928c6c57238b9d77eafe29679d99802556d8c0ac2e44e1600ef22facc24cfeea4f13998387a57b57da7cc25f6ff8e090745e9403b2201954645f9d4849aef4b2f8198e977466a690009abd7034bf472751e5a4e6d2675184436f602156bc250934a333da115487ea035f02e314771db09675d89db6a0f3b9542b617f12fffab6abbb709687f9842c8cd4790036a7c9f4ea16186f875366bb3f9a88aca5fed98306682d11fddd062042ff0b0ec3d7b5bbf6d14ca66d081252abc4beef36412b36edb352959c86768cceea9e57e28f48cd61ad5c888f485f4640b2e98fed51599807a2c7688b7e3a39d79d1b21bc58eaf1d4b3305e169ab55ea76bf2d5f3b5c971fd4074d2f34dbcef061e6bb579b903f1f7eab06f29877c6388f7c20970f5e5897692411dfc7962750377745b403bfb93715ac505f1961c1e8a5f40738b9a14a71ba2178fcd8c969575b0205a39643ba0eb0b5566964ffd5456aa535a6d2bbd959477dc728f0ebf1504cf56fc8dbf29df0c0649db3f3a87d094e0e5083e304a1988197a0c698544be59defe8764d12e1a7d528aac14e02359eb0addc3253222fca091d7a6847b8f581ce4ff44e524b317e5f7ff213ec837b6032f22d44ab8ad0583e6dd87087707abf5ea437b393f1e9fedfe8f82e57a2db085579e83d64a53fed92072f91c02147e8af7b17487aad87a3d6e2416307f6b0f198a3817f1707cad4c488042e8a31e9b86133176f8ee4a707c4fa526485e5b9b66d1d8dac2b390dc8264eeab95e28dc88f46abcab492db4952a9f9fa559f631b15336612729af751237fa47c4b47cace4d9907b9e21ef2cc69850ada7ecbed59cdb9cb0828ae19d5d89e8afd315b3b756a132d89ab1af9c366eabf0eeb69601b376aed040d755f2f49cb887670a549848bbd0682360f57f4f4e100ddc501242afb4eb54d49792f291d0d862e2fad5cc55a9d78eeac857427b971b591341ba14ec06d0b2d0342f289fc6d6c6e97fcddfe7fbe6c133402b8265da2c6705f403f4e2ed0d8ea6456111890f1227ed01932f8a225cb3bf7108bb8897c1cc36ff766f4ee7e02cd933ff29e7ea390a6018cc57b6adc7bac1c3655a4e5089dd18bc97e06a87f731eb885ffe3718b9f2e53defd4f7fea66aeccfd7eb3184d32e4dc3def4d03dc1125fdae9fae0fb0355ded96413b8a57728b2feb6eadcb53c4428adb2191a89cc62a884439c8001a3b7cf73cfb08332b89896c8a8d5aa5233934bc2b7c9a3fc7797481cf37faedd19ad39b59927e216f92f2ac6244814fc47b029ab6692f6f66124c11d5000a7ede38aaff746e65fd2b750c16f9f9ec703e70f44d034e1ae07f78fa60e0fcc05a48ff494b15f7856e651a20d3d91561b19a0252fd9a94213b1d95c6957793e62a17d6f7a8c495a61d2769750a8a01a9badf1863d104a40d284550f7d8232d429553a4fe3e0ab08fb1784a55e492248c32159970f2c8e4a54e0191d7536a329e440553a4346eb009d361a506897be5d1c1456fc1886ebeb3565840ac2bd70ac0de35ca32b279fddc2be862d120cdae421076819eba7f99fde75346bf8bef1d700ce9f1efe2b1ffd0601869fed10ee6a5c7b0b74fb082dd4daaf88958993cd478762bb025eaa01eac1bf6a2d5c6c8f4c38efbf91b93fff1694751f2bf7d45959fc302ef1af2cec33a038cf59e248242640b602f4c8b7e3f196566693b6092c9ac9c77961823c25440c1e14ba016c5374fe9e64128bf882e27ac3dd7156aacd968a8908d65a4043b87fcfd8a24c2183b4ece9617f858a42659c6e02296c21a2b9b9057bc499e1cded75de99c725003b62763769a037d5b8f79585734039164290cfbd40c0e3993a7f88cac67d2e90e10a34f91b0935734d24d0da8f3a7fe133a85920e63fa9ceffdb1304ed58cb5c2b28a3aec42ee0eb7559e8add49c932aec5ccfd0dab57f0bb47cbf1d8cde7dba602a4ce91395dc96c81337afe1db054bd34abe3d9ca6b5c7cef0f7951362c834369b9b0877b28b0dcbed6831156a58dc8eee7ec7baa7f09bc5c426dc1faa4d71f50908bd6f297ec8e754d4d20def005585b4bc1fa31da1f02f62f78300094fcc41df2058784f2a50a0c6181329cd9e3f4e39e0a5e49c6c5d7259d40a730471dba3aa7c6a01b8002d9eddac75078a85025eea76eafd98923c251536d2d720460870d77772c9e8a2c827e80c6815aa47372e42f96f6c86c624be21aa8cbae12edb5002ac030f5584b8d291b27cd2a1675632dfe2a3b00b7aafa40ba9988ccbaedcc798748b6083286835572913cd0467d8031dcd18468b22258d3fbe76cb4448852e257b8c5bf6005eb694eadd7357cb452599133dbe8a5f3ec04a53a7f4ff8e5d1a262b7660229f14dcf7723a53f0041600be4f94768d7443e397f3cca831d2dd02170eea0b9d77231eeb59aaed7194d32b09fcbd1d0913ed7db52935439fd87d8c749057bccb0af202ed0bbfbe6110051b188507f081b093e53e6e7255ade1c70fcb4a3ff23fdd1a2f78f2d93522e81447468315bf9bdccfb0803e146cc091420287b7035a605ff3db1bb987f05b9f9936306166d89bfb097617128be79c69670b36416243e12627bc41ca6c5e5f98fc7e52ca5bca168dc99c8f76595475dcae905383ad4d16a22e3997afd6fdc386c6761a089502a017889a45f40d42015d91286be874e485666fd969d4584d1bcb7fb412b68310ad2aef05c6f6082eb37eb739fc0a2998c1e5652244d270dabcf990cec95eb682b23a4555af06ea7900b2795b60436bd840a1b69ac514a1154b73a21caa6b9fb733c824005a9114cf6d9b6ff3554e9c31762ddca94725898b3bcc1c243267bf5cc647139c5 MD = 740e25c81e510d27735af90e3f8091596092c8136edb60f4df910f7204c289d5 Len = 50408 Msg = 9ad432e59a7f71adefb66e0c10e1873b5ab91c65624f8ac38a505d06d288c1f5f1a63a57a53f951347151f96a298147505ad5a5397af6f06ebb3a1f5d4117dc47b208934ae4036447b1e109dfe33382c778e14119fd445b83d85d945f480c2365fca8743608b3a89b459aae8cbb9d9aad7e3b16524c6f222a74c6fbed9df7a91c62c9d4e60278b2a1a4f5541b233e1354e359918cb8e608c5292ca282c358c1ed7cf311b591c0f6fd4877a6e5ba83716040b33f23e33753d65de524b948be025bb3aad74f173b0a00b897f386d20c39520ede9ba25bd1b7f09b96fefbae85eee99f5771fd0335404e6dece6791a46df9cb63223a2735399866aa89db4554eec09a89f9e49f64e5e48e0dcdc36e3a1d8c2cf64738eda2b7d1a33908d8ded878e5e67d998d060e4a882a9ee613adedbb946c2dbe7d1f0c7c72e9ee54ae2d7ae4a3a459c1e0ac3a6b38e31a8021f5c22f5ab291f0d1647b72c35f52d525d9441a43fca6d8a73af0303ce10802b3efc3612627a945fb64f8800c2eecf4048b3e020c17ea46a8573681db4bf0d69242f73a40f2fd26c5c88a8e947d441715ea6f85481db072acac16465f495a63869766a0ef3d15f9f5383a85a475e3a81e9fdf893d367dc67ae197670e05cf115796197c7c2d7a27545b0f4b843e500de85196f73588dba9dc9dc1cc31a4d648cce617b72fecb319aada11c97cff13b03ba99db8763e518398889d5e0f51f870ae30683750a24836bf5c48e7d4e0b5f7df4ffbb2487e68bd774b3203f232bcf1c51b15e62776c1e55a8abd8ed30abd4c9beab8cff570a6bd418e89a4206faa34d95025abfc91a790450c77a4c2a5b3163822ddf6c43e96ecbef8a82ae2314a9fb276a06d161b829e46897e12e9d820bc7fa1700ffc0dbdb2b532997b80a0259b17368f16be3bd87726aadbc190cc8ba8350c7c01e608a578f0e4648142e3c291d238f98d3c193383ac169598ffa97c41250e06b6ca54d5a435b50f227023a9e7a923e6bad8de1a29a275b47e7d967bef164d1815f01cd5a04d4da4485187630765a05e85dab216d4ce71415d54bb111acf71b9069f862ed200552ada2e387757ce566ad689bcaee9fab0421cca41c52a1923f27120ba67a41575aac04f5d6d41abee11952e256ad1ecdac2a328502087bc0bca3ebce1087d56542be2fc1fce2bc60f5caa1114d2f46d98c6dab60fa99a80d04956b82399c4899bb5287da6217fe56251fd7ab26fba449258a9bba7e8c92d1a779f5fa7a3e377f1507a1919eea4d18efb77b127c88c3b6f7ff88140657d8a935d02f896ae41e8ff05c01aa0be02523c5ffefd9a65d018d744af4e00a91f60e10267ca174046a46ddbe2c66517012f14877ba833cff0a474adb66b123b1577ac6eb71e53e35a72e2dbc8668d840932bd7ad7f81c8d52a7ebc5f5209ca3c9979daad83c721ee51b060c5a41438a8221e040f8367a2760e9e79154b4c76aa1885bbdb46c9b794f68827681a1adb3d4c524e2c8a9782680310e1bbc71ba1707118faf32f6f67d001efe2123ccf38667e632672e9b3b111c48086a139d9e3262fce1893921acb161082116290b3e8ba44cb1d71152ee709bf77e8643819a431a0ff852b337e59ed8ed945c7ca6b64bf1be4a3a5b17b7cc650418783265d7d397137d12877ec8cace94fffb02e5824db705a599f332beabe2377d47ca907c6940cf17d19d3f7ebfacc608fca510cb195fe969fbc1eb2c987a5a56fbf14cb28e7f0d6f98ddc12e05d84b5a664c6eb8384f323f69ad8a291895334a9d91dfa1c9bb932d6e2f4e0122bceb9b41df487231f1a8ceea9f56dcb59b8c0233919270a25d2af85c7b2c1fa0be6e749545e6208cac13bf867f986ef6f42b25c8d9ad48a1cb9a7869a9a4af07489b8c6b6890ebd2e73ab9453599076308d85c615178504f6eab569da1fedaddc13b8cca2f8efb8a0ce66530a99ecd853f5d4f08e13bb133ae253a004b82c7ac91161bbb8227773c82df6a4ec4f2ebe30281a5c4713d92d6f4cfcb9b8f789ffb1ff4e24549a58771b1ed72a86cdc8706b70b079ee9c71cbea672b27556278953d59d88706c4e55af01d822448aa3ca74c8c41c9c312176752ed6979686d8ae3b1ad8b644d46b0681da67242c0790dbb79b748dc93193ca83f2c3200709d3353b566f14ca6743c56ca4642068c9ebe2579ae3012ad2653d6e5c01f8cfc56047dbf22849090e20b8fac795bdfebafc09da2bd821c9fadef9c0d257c5f6a4c70ca454ccfe09b24807b2abc2a4f8c10a76cab81c95ad92472600be8f30858d4fab1de523dad33904db1cb8b57d5dc55f51aea87804de83e8ebb7876fe08367414dcf0df4866e8d9c5cc15735ef36b041c30f63b11665b309716c95c07ef81ce519403509a9e29458b128ee09a28a69f9f474519274490cf2e0a75049b1ed938338fac328ec38388003dae7fa3f61d8ce0b65dae2c69275eb5ff120d42268b463d185211af7775f5b795da8d06ec4e50a306a6668b348d53b16d06d27787467cd0d67b5a671a7f3323c3b9b53d6b978f38d0c5dede474162b2ece9f0c5c169408142ae99603d1db4d73fb264a204b79d347d22739011e1f03cf731e487658235d0d5524b154fcfff44726b37ff37fd0f089452c14b14cd80b204652a66d41fc142071cdbe0d30476fe043a9b8f85f659379ebd4469c08298a4acfa4edead9087577054e86d5759b0565da70bed7f220033f4f88966b59faca74967ae494292dc737990ed155d4e300fe7470593740ea8a04f6aecec6483311c7243d55143854548bb67566345407a6d5981050c052a96ef06ab0b454dbbca86b005606110f666299e3eb0f1bfeef400fcebb6d1b2f47f82a32f411be1c7dd787b22bbf34b4493a89a8d892b2d88415d79ed676f0dfaa70dbd6e4acab135fe544c3264a2531e724848da4b8a0edac6f5391ca34e66bbc1e2adee64fc4c7481cc9baae6e8b8e2667b21bb7498e425094ab2eff6fa6da634940d364c0b14021c23f1f2af20ed1f04d3ad97a0d23e159cd08fdddefd834893b443dc5c81986d320cd7b049f57042c1c444f53cc08d1ad629287cd7b2382153a5fa2712fa5a2457e9c54a33d0e2ec21dfa06ab4de41a369b705335dd2fcbef8fb98cd0bdfc9b5e24d3356f94db5899988285eb5960c5dac0cbea7edba517ff8279824a3ac67908599ba3d06b64899bd5045479b824d88318cad2113e2d6e2d5ac80d476dad442a661c282e8b54c9af1ba9fcbf32d75e18ec969554cd6ed96161cdb42f1f5705ab937d4bf1bd5120bdb49804238e215c818456bab152115f83ddb1ff6a186cc47528e79581c70397aee6faf40f96acdca62833ca8f93bd097b179b76602095876f6d818c4771143568faf755ea101de56f20554c565a1bde3157b4a279ff7a5881aa74baa9852903d438b6ae1cc51f80c4b3e3c86d6dd3e68de5230a1e7cc23e9326e7a710c9ed07dae760870d7d58b48d2b05c73e948c2978081136b56115428d2a03d9e507054b63501c6825007089b2cee5d03099eeb0d809a6afa8741d6a57feefda8e051cd755bc13dacc1510071be5a86bab43a382973009fc5d7e7fc0daead432758cd8b19a716d646a86e037b0b77920175950a79bc563a53e46e64cfc36da670063e1e318b8518f671987205a8e7e78dda4a028ce10db33b196f815a62928039954e075b9d8e7e22b97aecaffb0dffa63ec380c16599a2d20345d23c10ce78ea7257d6d631b58e51ec7fc3e8866c52f12f8c35b5de7c81bf2e9be7e33273e8e929f5fd500c7cc20a8731a83def8589d5292e71d8a038c858f7dc32fe6c2568dc18a2fb477256a1c3261afa1e7aebfce8c804c5b85f50ef45fb8133dc02557129eae9413b07d5b60225a64a18dd0234a268b9b1d360577f0ca6257b0ab9868a690d237f99317c774e226e18ab7a5ab978a7b7c69857befff384236908e62b1d0ffc0bf6e083ad5e1d88dcd644d76803f1e1896495a9e9dab112159e650cc5b18533ed57bf72fad2e6e57d038368bc9ca4c2a92c49db7aa7bbdc767b9db1e8e06f5152126483f78e30b4b930d5c2cafbe7b7817e2360e3df7a4fc091216a071234b0d4a79e3af5e891633beeba6a15aa512cbceac0deb7fa82e88e7f8e9992df6beedf97cb0ca86a7f9d5f9dafc31f1067beb5f290a969815c432a8733c53e907b77fd53698d719c51bf9eae346269c6a1da071621656afc7ccc3f58bf714cedf9c8987af811d3e6be4693c0d6cc6855860b2ac5d1775ec44b004754903250405d6d4b6ef55e51e22bcec9561575ad158ace8ba24f7397816d6bad1b446ceb201ce280bfffa77e0710b499ee5ed29abf2690b40bf9ceb7bc4a8b0b0d5a956015ceb4c2ee65a1baee13949fea3177d39afffe3e934f0d21cd78cadbbb21407189d940ac6ac5b19adf9aeb45da3be9ca316d7385a8dd93884d6ec789a557027204c33287b5ae7b80741d35265ecc8cf12b057d23ed24163db492fdaf4c6a3ff40f22f6ff7f6e542e4410eeabc851f5eae03e8793b090f9c48b9bd9b710b97d7a116f0a7df8b3cfd6b82c8460a79a9919e99f3f4f93c2b2bf3adfe83ba2e32f76a40de98de1ed632c58b6a2cf8cd50b00bfade0c21727c5805ad5a5977375ea6c4f861099ab99a2819e45a652d8bfa021cac12895bb4ec6ba64139e74f2c022dd7c7e1c4bb637029901602b952bb91d0fa39f8334e0962abfdf203f3eb1706d4ca34c68fea25407b52a8c9ef0f63fc62cc29f7d1a379c76233472046f3ff51e3c5c87833cf06f267862216d10b8d2300bb02762d020c01d66fc9f8a80eedcda2f2095f78110e6f35550d5325ef40eef2ef4edf0d11cbf94fdafef3e1e4e861597781e32558459d2de6efe7b46285457f8f94993a7bbd97179c707ab81ef8f54f7cb86d044eb4659762533a460d6310f1c35d0c7ce6eac475dca7f3f6642572cd2a3563db9962afbaf0beb4a398e2378eb530a09afb5b66b0c22ac8635d78be1ba8802f73e15764dfb9babd92aa0aa29f8a95bd5e6117661178815fc7b2f8c2811f213794cf9c6a4ee4cebddcebe43a6b6d14cb8ec026ade0233422ea0bae6647b7a0e5050a38ab4f9a831c490577e53c843632f3c2912265eecb77940ea093b49786a0903b330e2a035f42a19dcb8c58f7825a550d5face7ffcfc88c66d82f11e85bcffb0a967a2646ec97ac5ee91808ef81ac7c499835b07ec87c9bb95e23a6d1a5dc0f1e68d98c8cb28432edd86f9494b98e2f1f45a406943cfb89b03858bb7bee2e9420b112a4fc386ffaf5a07b440db46938366de13269b5ad1ef270b5980ebd2d52b7790db6bf06c1cd1c4a226083faa65d3818d37b24bafa21280e2185b19b41118cc9b20afca4e3730add4e2f1d11ab67ca4e642bedd44a5cf91886c98c0fd29847a8e9e8dc9b3bb46861e6fa0483e21d96187b89ee8905950e98cbadc8a148b08f1f9a9787713358dedfd2095fd8b149447d00dc4c6493950e95d8798dd90b210c35ad6024b13226135dfaa4579682b17c86dc6d32ea5c24a2189575024083b367f20a8bdbe09fe7b0e646131447bc1ee53af584c6a5c9097228eae8505d192d485e9960d688e4635c7f9e9dbd72c75927a13468301c400e25cdbf1c9eb83359568243263a306862c032ea8c7aa00b27ebc3816399d72af9630ffc5715da3bfd3a65ee27326193ac840612267558f053d9a9c5bb295ff093d6f789e2dd4a97e29c0f83a9e3a2cd084f04feb4d322dea3985ae6b9073bf8a4248c4e051d90b1d02289ebf5787b7e40c932967dbf863de1d1decea55cf3acf4f5d73307fe35ef8f77da0c5317740e1a9b9ac3cb5f0d75d32b3e63c74f10734af2de2132a7c0bbe6410ad00ae916e65f6d446be4db3eee424f818f660919b470c2abfecc40b97c9e29221e6415e86cd7e63677115ca210f5e4af39ccb196d92c0e46b41ef3a9997fd629dda7c3730949af7ad09a0abf44b693d1493f700f49477eb52970e6177c51f127f71c1d3d257e70185cc70c20f04b04eda6086e0d6c89b902470a418b8cdc2125530b48d0293fd01605e08b4a7e7dde0e3a6fd217aab96835f4332d8d31e80f29d9bc6fb47b52777eb22caec75414c939ecbbc5b66ba132541a34d2a6d33c623e7176b86f857f0e584bf49e1ddcd86f78a4366e711707c069a055575ddaa1c36903834b8bae903daab78082d77c9175d24a26f6d016b4b97b6edee43bafdfdab4772951905d4bab7ee018837a9e068650c7d4845bd070c6936c17a3c7b8be4e26b5b1f204fc7a01dbad04c990a90048f80188419bae028fb88248ba895e06c8c7a6635571f2e3e6ca068b7ba1054763d4e18a54171634bbf298b85109097eefa03086a35ea74f0351d3f7c13319a380ec4f21e65771ccf34996b091d022ef6cb83c6403548385007bfc8ec4d04fdc474634961fe42893dec66478a1650f21e618b3439edaee4f844d6a99acff0eb95fec76312645a1512570ea58aa503adc06c67b6c9c78507337d1035fa149bf0371e6ff3a240246ce6f501198d41a09e874cc7e2724b611bac20eb02aca34c882243ab5f940a47ed1656cbf7f464ae60cd732a2bb5e1d99eccd0c5a404f4a92fe21f282b6a3b2b024afcedd5629683811d7fed172733450d1ffd4e7ea5913853f0f164db874b4468df47e5465a4fc67c01d3af2928b839f30016d41701016090c97acfe48dc33a7d5dc820af4e08fdbdf51eded64cd93ecd37adf4e1a9bdb872f61be7cae03b63bc411e4e94b05a8fb361b20aa3062eba0801333f83022ea656e1453b13210c56a2138acd8b23ad0318f21da103e72142400747025f9cfcc0d925874841c2ce89cb6fce0be70a78ee5b00e2309d52494df1b449ebfbec808e563d728ddb37ea83949028a85ce756a7d6288037d3ea0f538982cc6adc7352657a83677a4402f8ca9a3f5b11414ccec626d378352c20fbe9941d3eed75c3faeca2b2069c10b661d548c7b5e538ad39dfc99c5aa71a7997869dce22125c50e29a6b23b071d5c4ce1a3cb3c982a77b304b3aed781c23565aa0f3200647f49c91f52062f589e7b0962fc2ae267812593aaf073180e2db69cdcf50bd6c1cd32981638efa5642dafc428c86f12d340da9c1519b12d5b9b706597822f0b3ff7c6a498bf344534b342a5b9706376e54fdff6cf9830c170f2ace9611e6548e6e54e152c4f9fb6cf167ad59f5aceb6a4967cc860d3b87a531cb24fc5317635bf8011135b50f6a13d40a07c62f0787a19fef83a4e3411000effcac048232b79d1ae59c5ab2a02ad8717fbc1889928694a6d9d76232102fca9853c64745d4abd25586c53a6468b83b485d5cd9bbca82b41ccb1a1660455162a954f62d0459ba8c16793e6d40a59cacc7174c823c3be6906047de6a044d0f59b164de3e444e8e3afc116a6bcdf332bd8c221d9a61533cb9ffb496b58493c4203f27c0e39c3f715f7503dbae62ee24edf622428ae1acef8169b5d58167b60a46b10250c562891e79ffa504ada5d2fdae938c5dec23a599973cb00d6634206c4da588f04c3dc7e01b1a9968021d6df78ff2c4c236bdd9a55bc727b0dc506f44958b2041f0948860a3444588242ffbdcf2726001e2f6b5bd5fb7a1624c62ff3dcee06ca85afd371ab31b3de78c54290886b0e2bf8994c62c037ca1943ee25cb25a23c2a5d3de4068bafde708b33061f4ad3cc13d82ee877bf794acc94c45044cb7e3c6ccf3ce50e53b6ad56e212b233be664900e778a8647ac8e2773cd01926778aeed805333d52aa4f08d7a7edb0948b2c6b3c4dfef2f0982c7a61669ae638d0cd3bb624aa54973980d73dff49670a5a2d1b0e31482fe2c2adfad338ab20437f4f094d572992a8a75302ce14b03f5dd37242bdbbdfc8039f544a15da8a300f2b1842e6c4395f4c9dd071d30ea9a0549d02c692154a231bd828536f75bf7c647d31ccc99361234ac3fe0c9315bdf2b961e591d56411aaf21431fb2931d36e0a1da1913eed2a466bc0e5bc584f729d52c62489ced3bdc44ffc782b8a354d6dc8b270778dfa1b30773d8d6768e75309e875c698c487d5d8fb3704ccdbaab5e068e4a668fde1bc4936e1fff60c03e59f4215d3a501abe150bf6edec465b79431b05d4c4bd7cb95fa6f5542528cccb2c52a4f5497cb65699361490cfd6d8570c769c26a0764df2fa9ec405e61306941e466cb50586bddf609a96f985d3e3cd40a5bbe0686e94611c0734b5c0d40021a65bf30cfcf293d0f1a618989ce1f0345624df72aafb127c3a5cd1e433d03c1c6aefd27d9e44caa3d2e4f3ee83757024d370815dd6a03abcec2c2601bd9c2cccc29e857777f1e4e07ad3d37bc7f2f6273f155c1289f26f9b97d19b9ecc8c54bb43d4769b088e551f5fff11c0d90ef4b3ff8faa31136633b0c409cd3bff454670751e4048de7eadb8f8c3394e451dfe43ab5bf62a3180296507211539b44b7474bcf85d1148575125ebdcd4748aa4656eb8e6ea6e32b4b340c7a41e489a035150b1ef3774f48cd21e9f885de41836ec8dbeccd19db58853dc8c2f42c90f018f6cca6f69f46193c2eb8a62501d7c49d639038a6619288fad90cb1f1d3b81ca61418cf55f100e108625430735713561c4f94d8bf2610a1f02e61af0282090d28977601da1485867ae444fc3889fc1f33b36f36e0115e8cb0674e24ede18ca9e5a76fa44bb1ddf2dadd10743b3e9a0829b7a7b8d3c9833282aa5c787b9748d9276a8a20716f110b707441ff461ff6f94885c6c85ff7877aad1f1114744d4586340b4fdd14f727bb83d25e041fd417dbd64254cd4b43734b7bf0f85ea0aa8c9656b04644fcf02ae85d1eefed8f0406941c19d72f60544e8f324296bfc75724f3d282f8bbf0031f7c44817d215e57c90e6230d95566d3 MD = 90df9cc3a3b904415331eba9cd52750c2c5cb73cb91b42caca7eee3788fc2b30 Len = 51200 Msg = 37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0a3365e3008072473bf9d6eac13e509c1619956e12a06fc696512da091a7d40232c675e737713fcf51aea6c0316c3bdbe196132b0943df2b013860105ce676fce7b88d0a167d7ec72c588b7b6465a83c9ea1d748d15713455e5d0e901c3cf646a38a09b0002dc5ab1687f350dca35c1a87cd404c0d529292082f77844203d86be0bb8a9d970a9af7baad8d050cbd9e024788eca91fbed39db930398180e393d949ad7e173d9c65498339a6ec670d049058653ad48af45cc4cbffd30c3b54cf1b290052b1864bcafd0accdf9b8e2a163134d2c982c1bba4a3dafec288e3cfd0ae1934a6f0e39122aebbd7a586e48d495167620708664d31c740bd868c1ccd5f0e94baf959e81502cb00da87330cbf149d5a8381e9eb519a8b97acad7a48c5b0c92623b861064ff1ce8455f32469381e6198c7b8abc341357d6a4c85f7fa517c4a47df728ac09a6645b0ca77df7c70cd4aacaf19c280949919132dde7993e9181e647e964ba99cd6bd10b893c8d90187a5009a23d295d43bfb4cc0e583b8052ac21651b23813bfc9912ea0c574e152f42d3f1975309588a4705196598ad93e1ab1d82954b4a18bc56e55039b6837fd893fa2bd7c70e21a5934dc2e990379ec6e8a2445dc55d57940a14e5164273f59cd58e5f6a8281e11c09536ea22821c98ac978537d7a02220d1d6552aee168a001715834596baabf7813e1c69949b23eb4b86658fd51819eadf8a13f067ca8a791cd1d53ab69d0e43f18bd72d5d93322cc1c36fbe33121f5ff01905328fc7c33d452a86468663c77fc80b0195ec1eca05a5daee339042b4f88a1f9371b472c6c5168c00e984937a134b282633dea25dde7e397b907b1e7d3d240a593e747007990782cf944fa078a7118fbfa793b2604fa15b82453209daa64475d0e95e2408319e8b5ce7460f4593a19e3831a9b363b1c5ddbcd273995fbc61ce7502b0233b1752223352e654837181d01a929f49faad422c65b8ae416ef81290b02b48e222c2b8c3ed57cf0494b928c1e11ad2da77baacd427785096aae1cd593cc356e551bc390cd5765ea41be30cf0266ae2e97d326c417c91e90d75f1f874555b88a14a7c5959a62f23976b77a4c754e35dfb7ddd1700df85f61a62b12a9eb4644caa7f8ba036b9f29c6315ff96c3f7148284ebe3239ecad50641f397ea24b46e21655352a4109b61479b9dd34972779f2f1a6a1d2887b8ff88289b2ebda2efe995668879bb93c4ebb3a585ab336f70b382205ac37c383475fa12ebddfb95b157172261597d2cb0f24f254feffaf75d224a3b407eb54cc7c8daa5483e4a79c347252d808a5f480a35987f6f09f6c6a73bd5cfbdb76a11ed78b86442b810cb703a5dec5874e8721af62e386591bd39d990b3521505e144100601b46de3f50752911ff37bb18f377de45ec4c60fc4ed8ea1717708d2d13fc9e1453a1c4a4db9e4fbe9b74cb8da14ad50c8c8f2ec944e10ee8e82ebb6a081959b0159f043a15fa1cb59bc5e035f7623fbfaa99ea0a1d81ae8692a4019e5a5edb3a4886c789675039fde87222975e86c2642eb0bd48408072fafb1a88507194c9bdd69f3418376a4d9e68c3b83b3f800605ff1dcf0917a6014b0dd77708b583ce3ea632746fee0e01a10500cba90016b4a9072847d809bb0481ae25f74f8ef290c7a087ae16f505fd0da670826a0b1174592d184e3a7e8622a5c84a30ab64aab75face50b96b217e8ea335c0605c638ed1c59370bb9ded004be428f49a79f74ec0fb296b3758f0b6b41930c7e029b55c8fa73cba7dc926151d4043c6bc8a716d7de9ae0cd3ef3ab2d19b0c813eaf12eacfb641d492b0001b2f0f699bd98e4581fd44c0c817646bdd77a71d8ed432f8d422812751a2f9178cf1800ee689ebf046cf9b161f9a7ef0a106cbe833398bf383288661b426fad8d4f570a8293629ee06856af295a58585a81f87f130e6e08f723234856e874bd0adbb2fc9e676deab6b9f22faacf12e875d1259ccea54f7294be02a16f34c427b51a33be8a0c460c4c07d51a2e7d5c0722a9fcfefd21c265d5aa2c57ae4fe95556b5e1388ea9756a6afb0856fb8fbe1d2bb1838be7a95049848fa9545b616badb753c453f266836eda3c92cd592bc0925690c42cd6667f866717827ebe91d0999f9de5f5fd6cf77f63737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267de628c9db1ceda3c78cb2f9988682d641d068023f96aabde4e10071cdec2080f616ac30c2725ad3efe98a69a56873615a3a3161503a4f22621986def597b66641d07793d97cdc9a68f85fd3890a38928462b2fbe2bc5c509631438d2e344d1ced9e2b71748f1b6ddf33a3e597de3af03ce43d305b9f5acefdb2b71acc645d3b55fa3848484b7fa4cf25e71e766702f1003950bd2f45b304052861f6748a8f38175f1e96c91471f5a54999cc9937191b6adc9de0d2520d86590cd4aeab292ba9ae474edb5b8caad6ee095c9e74c0f5e5c9387559f946b2dc45da7fa1d4c2dae6973d5984841682af25ff7ff29d9721d6c7e76776e8965b6c681bc38e85da15954ecbcf20d7448204d9a6a477781c1564d363e4c634c36fbd3c3b50b332f1643c415d004ec999316e75694a8b98e2591678388dc6624058454ec3a7ce608b3f222b8bad5cef77095285e1d2ad746c557222dfc30605bfadaafc4f292e931a0f0d49b226d99d708247879aed5b9f2ca2fe6fb414f37373f844e13865524f206c54487aed53781834b3f6eefb248d95ba21bb60041d501f90a97a19dcd80920df7d84309148e3d0892e50687c86a45a1372926e00f200053f5f436e003e35bdc10fa99d9328853bf82d2091f1f087cc37678138ac0027e73cbcc99f7fe37939c98114fc7380c0ad1a26e3f5ec00bc7eae77045a55c62c18117879389c662837415852e7a2d01ac667a226fedb2596e3e137a83daec2712a65e8cec3e644e738d11bdfe9b19517fa593546373fddcb9e681fc97d1763bb9092a456cc0dfe1aa0e132387d105e3ccb7746ee199aa7af00bb96047310585fed40219dab43f057220a41e90c5f89fdac4a5d6b207c01d5ad4440c5ca29eed292c6f7000c58da111eb4b16e31efa6df3f3aff69e6447ac406aa96a9ece4b5b813bf8b3a499d09cd0969073468513355d6c19346c58480feaf470e0d45a13b74f2925488fd810e0f74afb9e82a24cdf61586bfae68dc92ea09b22d8c8f1ffe9db1e7e98892b5554ce2e15fd5f1cac5347df2eafd2a8d5f1aa8746b9403915da6d418c0b5a3aa8e09d6b65f9a49c3b7a5728e9baf95471404fdf64eb05da5f704dbad60ac9ac106cab2873fb1bc9023ad95c24852337a703d9cc04d6df7de594c3b2e4fb9f2996e0418ec8698a4c087c14a2687717f97e228e75afe295caae2f16513f47a45b4124a7c5ebacbacc562951233bf89f43ff85b703ec77f168c2278fbe6e57a0e7192125f4642d73f2f227d806287081bd30149b9d44fdb90029667622f9925b7826bd0343bc537c66e660f174b447860e1bb8846c3edcb639ebd213a4695f9cb471e188db7a859fcf3abae49569e676dec857b897627cb0bc1155ad6d45282d430176fde4262da2d5f41ff890ceb319d73dda804738456f30a3d68da41554d4cede62aa8549b24e211e76768e6b17379f842a24a449a0ba3ea73cfc72624b5afd118fd7e76a7c6b5bbfa7a6b6c97b97dea52decd51cf35a8e277140ffb2748777a1e3cc3211f3c12be099d0316f45023da6cd200339a718c72a5ca172903922e59648d08dc67f173788363c26e5df406391f107552925ba91b9e569f38101f5eef9a52d201288372abf6532beb4af19fa6d81eaf473d40896dbf4deac0f35c63bd1e129147c76e7aa8d0ef921631f55a7436411079f1bcc7b98714ac2c13b5e7326e60d918db1f05ffb19da767a95bb141a84c4b73664ccebf844f3601f7c853f009b21becba11af3106f1de5827b14e9fac84b2cbf16d18c045622acb260024768e8acc4c0ae2c0bd5f60a98023828cdec18ed8dc298a306c38d1ece01509f3265b5f8cbf441f0525097e8b48234bf69f65cf402c7540a023ed231ef95b222a900ea4bfaeec02c6d8b3b01648ad7a165237ca6b557b1ce287b0ea137f4ef54534070ee793695a9078ec89bcea389956878614ccbf917b61f8427b7cda870fdd92d2d297154262fc65f28ff1a54b2651afff12d6f36ee8c906107bbda399ce5e2cf0a430ad0dd86520841757126bad725bf1593c7959f16221894f5852ddad3172fef866b3321755491fd44fba009b42ec0b6c4fb9e901d7eb3b8acf70e94911f54c538bd0559c5740042b6df4a07c3e00bba0934d92a684b39592a576331e5a44672a227ccef3e595ffa1146ac1dcee0a70baa9acfd5c132b361b5ceb519984b0ee00cd2124aa8acb50c9e574fb19bd99c8fef5407faeedb28b796848bb372beb3f5bde55ed2cb140b60a53bba2df471f330208b09ffb8eda04315a06d693aa53d9bff8939ef6f3a68de6e1975f79f50b3d484665e4ee71124ed794be3a2baa7b5b918e62a095bc5d46e401a0979641fe465640e8d4d43eeba9d0cac76c7b86d22375123b988585e58f86566fd190d868eca08aa1e66932d6d3b14ecad3efd9f8cfcf2696ed42eadfa642324d941602cbaebb8639a00a17542afda32117051e4fbf243dfd255a559c49ac37c265827ba70b0bc618882336f43e1a6a729c57be478008cae6c74840bbe828c976ac628d7b6015bcb705612c277bac0727da645480a0e14fdc497956aef05c89d30f22c2c96c6dfc9dae30617e6206fbd957975b8ba0524f563289e1f5f09bdb6fd46fa6117e78e854f91d71699fcfcadfaa7d4db8fcb04bed08d68d11677b5085b295c1d414cb12456c84c669737af6c33992a5a9149fc7f9330bb291d38f6bed10318081dde8fd178f02eb0e8b7d022c8b63fdcc867546035775fcf7b32c8fee83df7cbb28372b23c71459b9566a7f64165da0a3d0e538a3dcc1b6a384f75f0263dc10e0924a0ef2ab459d0a52b7c112710c58cf72442253396b8a25d7644be166c3e7828aa62b1ca1f32f620ed969b021ec609fe926958a03cff21f08f7c8d3d3235b219fb0020a51b97b60f963ebb58f7a62a5b41104c0b28b58cfc81668825f87064e401c263421152b8790dbc99b3032c9615187f29fcc1a58e86364ad45524b5358fa2f0a3296729a3663a585e9aa922f534fefd16fb6f96cd9895709c5520cdcd24c8d107e387e520de055a3296544ef1c1ddd43b919a4ff139861f06ae5280d5aa5aaeb8f7d74ed6ea56093c2e697a30c29c4ac145aa99a372f1a03ae72495f52a40cfddedc12b6e9115aea5ea516c5a4223a8d0a0073c8b4abe3c6188fdd6d4ab627c9f4eab468fdc2a91945274ed18465a368f291a0050c9d638a31944091b35a8fd26a1ff65e2d17dfa32ef3ac412d8293b276849ad9af71fdf272363f771d0fa99996e24510e7bf731a7480cbbefff7801c0e5fd0a13dd8278162ec1687f85409a203e82d2bcdf7e7d1ae5509857c42fce80299fe06182e74a97c0c624ed5b6246e59781af9407fb28b34f7024f42d36eb92bb95f72cee379ed363daf2625b48e60d0489b23dfa57789c0dd2276b4575a01c2349171d2a58bcf29e659b868cdac1c30a02a160c078b6faa7e0696711d43447ea2108db3d34ec1bf9cfe802f601212d335445a4624829f8a600b18e9b3cf13a9787910f2fb27676fd809e7ea1a34c7306e766b2e7ae1bbb919cc888ea931d1eb2e27c6109b9a12c31e188a196a98bbe0b24cc315791d26ef01b77fe06c3011ac39a8f78d233b7651e586d14dcfc2636cb713ecabadb97374ce58498f8b2e557531793fd9207fe484a4e147f7b826502cd3785251973b23e2b62b7fdc74a10fce9c04f97511dbffe3f2c46887c25904b99df69e97b416bac18fadad67b71cc320eff8def185d41ae8558cbdae6ccee38b8cfb2bfe92d0aa99815b3ca1d115f21493b13adeeafce81a23c6b1bc15fc8f2b171284e6a1fd65c351b0c82b31112f022ddaa78dcfbac9f203eeef415c566a00c2c933f06ff18ee7674aba548592dc8214b1af8e929242f87c81b0cebe8106b5267ba39c5b51987e38858dce1d1f8d0cfee2bd61d217e5a5d41bb0c4aaf0e7b0a8c66e5b0291e4d05bfddcf8861bb31b32ea5ba80cb02472c11969b3b02a7f7bc025feace44726b6382012544f1bd1256744f4b1b0ff81f7b9f7462c5c92507f1316df228ec5c0786378b871e69479c3e26f232f5d6a709d3551d08f0ecced52f8158a2c40a234af448449c1cb1a1f6f5ae56171606582ebb9a5836c454eb86015ae7a4ac87105b371bf40d49b1134a037243a0878953b5bbd6ef944ae7c345ec24e4a0e8496b62d71a6381aa52e5bdeedc81784f45e0c75b72a8c9898ea0387a47153d7e3a7c895aab58a1497a5e794052d7457624478c24d44c7e8932c887322b422478418af64a389c152d12c7a6803e0fb0050dcf2b9d65a35a53b9845b9c3835fddd45dfd12e28f8845e03686b3707ef6003e7c1cd4f8d7406ee0d1cdc41d7b56fb630c1438fe33196e53389f1ec1540fe789c6599c0b589296214d831a86e89220ae97974f4d112f4c98c726027d0c9316d1303b87a43a86cb8b800835a677abfe1584e8be55a624612f56bdf71a054a2e834e35105a19a77f7dfdbf9dd2850ee44658ab0eae6e833c855bb9650eda7f8f4e74d8de73526f12773b2bcbb1bd35639f8730d8cdd6d64f496abae4e1f8cdc96148894aa691683515bcdf37ba6caa0cbf953c752a7b9819e9f834ff39ec8f6d8a3dd8dd5a431d47c7f74c7a633ff73ff507009c5ac9431cc588ba0c6d226edc17c94a0f14d3e8db0c7ef60c3293878dfe513f96b54c61c88a90aca4f246d6a5988f5f785ce0655f51b85e55af03e5772a083bfcf0816ebd97a4af416fa6414a9ad47b7198e51d55463807ef4f0d9b7c06a0a84762e4e46c8b39147a4bdd594b8d4d40b36f5e6b4d48726551890d040d229ee70ea3034d45b3c28eb80d686918fe6e219636b8f9b7e6fc08f4e3bed9bafc778aab274913e9cfd570732ab3fb434c9ba0928581232580495571e56f6705f2af05b56642c2b93df65c443a6caa5b167a4040d2438206d2cefd3114ab466eb3c9eaa5e66cf4447c89c493a2eee0b0ea6e7329b37c90ec2d0142bae7fef265ae3c9c053e44031c0a142bf9faa728e5170cdba59fa8da361d94d887d5d6f58b409bbc4bd4548990653a04dfb841fd784ac9cc4cfd34c88512de212074dfba30295badf22f1af2522c5fe1cd423bd8eae429d7a862bcd649ab61bf0d3b55daf4b6f0f390c503d7c1bdea453b5ef145bd8191802056bd9e0455a404b6afe5b25977f02f902caba46f988d91b2350ebe4091b5584d4f938a45803984a5291beadeeadda488dc7ed2dc4aae69ca8ae0bd4492f9b297c3fb257de986c1615d44dee59e1e14d34af9fd7852b13fdcb713dd1a03d341884a30ea1dc0104d63a31d291df035d317fea98ec44f5a86715014783172e667a748f162c5c26a8b34a0f133d89fb971bf6e0a01507efed010cc7f194b5e87a77d56a909d65efa0d5ccd6da9b5eb1d73422f97ffad8012af43a2905a98354b8362e9c459f0044336348eded53660d65a38a9efc42be13a6672790496d875a67e0078dfdd8340dab8547be140ca9f88891b635e195c20daa8359658785cbe3d09ce8a580f009324e6550b0196e305889262f28f49dead77e6f5a0e859c57d53c935a4c9590879b6528eb2bc3230217b0897cddfeff405a6a54b2f50c58311af1ede4ea0660b73037f9a097d9d0271b45e325bec666cc7cb65ae780e361639838d10fe79907a0da0efef85d2420a84e905bb33116789526a9a88319d460f539586762ab172e4a7f305f7ae36cb88c96d91aada0b4dda3418c670e27a5fdede39bd8659e477cbe08e645af927843dbdd67489b72693efeb3a7be0e121fdf5580474ca028f39a035e78d81dd212679d0a830c050ffd43af6642d60d410aaf34f7a5ea9cb2e12f21672e3f4e0c00ccdb05758e74df3893bd40a5d7921e2e149330fddbe0a2dae4210d50a3caa60b1b9db685f7704ae2d7302b18e8261052b779139747f462a6610a37252b170afbfce905fb6f7fb8c2b6100ee231507f403fee88ba5561580d4de4cdf600bf9e9816c9da1e1d2b91a1d966d04cdb98d3be55fb77af2daeeed750b8b60b494accaa12441d372afb3d47e7395b9e0e867595a1a6c8bff8638bcb138ddcac2f3efbf89762b68ebd77247c89929620f1a3cb8dcaf9632fde0996b33e6b2621da25924b4e2c8d6bff28ae0867786919ad763e6d79fc304a06277955795a7cb17186fb6bdfa98a16189544b228f3bcd3698737ff55b6185799459b796a63c6a61cea9d20f1e296d62f474c43750b77944e5f1c09072f019dbeeb64e9bc8dec4605d8e0322cdd97f56cc43084f5c983a584855654366fd5659ea23c6c15e1d7da51d82c683aa477b9f896563a5134c64e32814ea88b7f7af760f18bc91e656da92b72e98bc03f1c6bfb442830305529d681dc6bccae66da9b2e61b9c97e2397fdb92f7f6369b470529c570c2d3b329487981d148a462cdb992d792e34dd233e1c239657b8da0d59b804566cf81ad5f0a7a0ccb3a8fbda673887c153d2e56c484f9230d752be52c1e35bc9af5a7446237fc072afef777665c264c18e6a3c059fde2e8368f9bb898f1cc8393d1bf18b1757219670275f0bbc7deb0248c68af929111e19737479bcabab732d7e033aaeb277eac05e185e9e56b2450beaac784dd0308b7a5e8ca1f2fcd8852ddad9f7b7de264478e1891a391aa89964dae5ad0b7a829c2c9209db346ceb26c1b967cfac82ad574761443be3f0a910968239d23b11507ab978b3ce89e22b7d7283736b9786544ab4460f MD = 33b6229592ca719e4e46f35b287617fedadd3b7c38be3c8c1c9f446d2d9085b3 ring-0.16.9/third_party/NIST/SHAVS/SHA256Monte.rsp000064400000000000000000000210571352416253600173430ustar0000000000000000# CAVS 11.1 # "SHA-256 Monte" information for "sha_values" # SHA-256 tests are configured for BYTE oriented implementations # Generated on Wed May 11 17:26:03 2011 [L = 32] Seed = 6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe691 COUNT = 0 MD = e93c330ae5447738c8aa85d71a6c80f2a58381d05872d26bdd39f1fcd4f2b788 COUNT = 1 MD = 2e78f8c8772ea7c9331d41ed3f9cdf27d8f514a99342ee766ee3b8b0d0b121c0 COUNT = 2 MD = d6a23dff1b7f2eddc1a212f8a218397523a799b07386a30692fd6fe9d2bf0944 COUNT = 3 MD = fb0099a964fad5a88cf12952f2991ce256a4ac3049f3d389c3b9e6c00e585db4 COUNT = 4 MD = f9eba2a4cf6263826beaf6150057849eb975a9513c0b76ecad0f1c19ebbad89b COUNT = 5 MD = 3ddf05ba8dfec982451a3e9a97695ea9cdb7098c877d0c2cd2c64e58a87754d9 COUNT = 6 MD = 2cc3fe501e3b2e33e60407b0a27025735dd04fd7623bb4fceeebae5cad67ad4b COUNT = 7 MD = c534802a459b40c792e1fa68e54ceab69e333fbeeecad65fb124d2f3cc1f1fc1 COUNT = 8 MD = 8986e95d85e64822287c78cb7a714339431332182107109d57827776c6cc930e COUNT = 9 MD = 72361401c670d07f1151a95e2ee914665c2bdb1228581833c7dc53b89c01c927 COUNT = 10 MD = 124c443bad9d955e084a3961b079c43c59b5e0d666af38f2f37846e85369a618 COUNT = 11 MD = 81914b78674a2a6204eef78ff51369526bf0c2e121cd364eb40a8435479dda14 COUNT = 12 MD = 8eac9d963b44021b70a527ea07420b03f51a998d0d6cb73ad4cb7fc688b4d174 COUNT = 13 MD = 0427263b4dd3ebfcb7871939dbaca5ca94e794f748c02920c9759dfa554ea534 COUNT = 14 MD = 3e9d754f2ec273b0056c2fcad2e891aaf9616fe74005d36cbf5ccba2e037b5b3 COUNT = 15 MD = 986b6594ed96a819e49edb9f65db2ea52168973d7e18ae9e0b8869a8b5dd29a0 COUNT = 16 MD = 117578126a35176a00f8c0cf999442df0890737be1880f06e6a7270959c114c6 COUNT = 17 MD = fd7f5574788d8ef64b83333ffb62e4cd3311e638db0c514071c19b84e9117afe COUNT = 18 MD = 19db7ba6e3488a9e935af33ffb912d60c9d3b98a0be1d78e0b374dcb5274a7fb COUNT = 19 MD = 52519e6319505df7a9aa83778618ec10b78c5771bac50e8d3f59bc815dabfb1f COUNT = 20 MD = 434d7795fc7510af04b613e120f7f48e6d613ec056ae9fbc7c869b87c1dce63e COUNT = 21 MD = 020324de7f6763be57bc4a6a0960258ea401ffe40d68f854e82ccfa9e0612ff7 COUNT = 22 MD = b87c7fd0ec4cd35fab077b64d00917ad06aaccb095bbe4603466644ce6cbce18 COUNT = 23 MD = 01abbd12b2b476b2d540d0c47edcb56263ea658a8080a8f08dbb313942562f00 COUNT = 24 MD = ce95bb2bf2d5c91402e13ed5271615607f39e0678aae776d18a78351b90b5838 COUNT = 25 MD = b81af264b0bb485f6656be91478f7b96c324fe262fcc366d9ce3edd44ccb85d0 COUNT = 26 MD = 9e2ad901200ca524c91373f7b5eda9cda142353e763862e350314f793a0b700d COUNT = 27 MD = dbfabc7124338d6845f083cb1bbdf7b4060274d8e0e98d08bb7ca3779059b45b COUNT = 28 MD = d93c2cd61f5476ea08d85f741720ab2ce5c4e38cd8254758238155fd68ea7723 COUNT = 29 MD = 232d9c3b583e297439c859150738e1b1d530812d63a9a2c1cb8e40cb50a2f27b COUNT = 30 MD = 8b9c858bd135138d9023a0b5fcf3f12ebbc3b7f721ee0b44be1871187f21f506 COUNT = 31 MD = 05cedbd568ce9adcf5022999b8f3a28995a910c572375186da5febd775d62b79 COUNT = 32 MD = 24282cba8f5dfce7e423a103488a9a924080d549853c699159d27816dbdbe5d9 COUNT = 33 MD = ba6e3c38128f93f288e781af8a13e7ce5120c2a43a6d1c0d4edc831247350079 COUNT = 34 MD = 706fffec5b69f5ef5465b6a8663c302143af743c6b7cd5fec9f3fa9bf9b2e285 COUNT = 35 MD = 6d32c55c005eea65dacdf0e90f436943d0d0acec3c2355c36e2df1a86d1a11a7 COUNT = 36 MD = b353f425293db464ad814177ea9689f43054bcdbaf75675e918b78a82ca97a50 COUNT = 37 MD = c3fa9993130b3c95d9aed30243ba902035933d18adf5e21d2567674769062e81 COUNT = 38 MD = 1e77e07988ebd618740c2f89a7bcf0ae2542279ea8895b39aa70ba8bc37ee00f COUNT = 39 MD = 063927892a0b095be7d21987ff8157cd4c674c1cd01ab9f0834824e8efbcf938 COUNT = 40 MD = f43054c280f05371cfbac776d43d6001f71350d898677f035aa8f7e5bd7b3fa3 COUNT = 41 MD = 2427934b28c7a9c2b18a5b7e996351aa567523744f60d54dc35bbb61f56f6fd4 COUNT = 42 MD = 3633976d174279161e13b49e5866c144ce8c1d17ec1901ad56a02c900273fe11 COUNT = 43 MD = 5f9788660d82c80155a7fea91896be3be2eb6a7b2ce963f3804cd09da5ac0c8f COUNT = 44 MD = 097ef57de6df98c29346e67e7f676569ad402f7a1c88d1cf39ce2d44fd706f72 COUNT = 45 MD = fedcc810c74706a27fc0b6663ab2f9de0761089682dff1279fcd91312af1b8e3 COUNT = 46 MD = bd5d61fea8d23089f3f30266b1daa636a352e49476526e71cc0735cbd17054fe COUNT = 47 MD = 5ead027c03d7a55c17f0c783b6d77670cdb8942772077d09dff9a46ecd527bec COUNT = 48 MD = 7a06eeea07ca9eb94a98a5e9f00b7efd8de9843b6aa888822c3dccf803637732 COUNT = 49 MD = 44b6a895058ed3f31a5549407af8f788631f8a6eb8c0a5f2e15facc9190b5672 COUNT = 50 MD = f8a58bff4b54aaebe18fc3f0bb1d24974a125530756dd4a0f15628c35c02ea1c COUNT = 51 MD = 3bf2ae5408399aba59f42e5bed35a00d038fada16013ffa5da9e8b7207f6012c COUNT = 52 MD = 31d33c0275986b06f6dccf570d1064c7b36e1574cc4371d4bba2e55321d75397 COUNT = 53 MD = bda59cbd65e87a57df3f03c89e4d9511de71da05e2eee0560948696b37615f8f COUNT = 54 MD = f431cc1817569e92c8ba11ec4741e6dd2e361156575af7b482587ed78e9fb7fe COUNT = 55 MD = 1b3b3789a32165f725167da6f5ef89d95de5992783961440fce67b66c3351ea6 COUNT = 56 MD = c9873a09c079ca7f477b5601519ce51896c2a35a28fe05fe8b13e990813c6634 COUNT = 57 MD = fb16cc865ddcf513be298c7d514033ab3fae7a80b285d2b43e82363342e498f4 COUNT = 58 MD = ebaebc261b327f8be24026e32099a6b15927c54dbe390b72756f3f6362ea3b3a COUNT = 59 MD = ae5a4fdc779d808ba898966c8c14a6c9894107ef3e1d680f6ae37e95cb7e1b67 COUNT = 60 MD = 5a4a67451c197b038c540878b6e7bc6fce3eea9c95795d611359703d6cc7ca02 COUNT = 61 MD = efb075aa051070a6b2303e026f81a5262a6e64eabb270ec5e13fc6efa3529f6f COUNT = 62 MD = 8ff3df1a5cd0840bce61520f1e5645ce272a37b884c1750c69a957134c1a20d2 COUNT = 63 MD = 8fbd86567c20dc3ea9948dd5ea6f5204028c4ba258c35052994e7c86de2d7701 COUNT = 64 MD = 670559572a74e9af0513a3f9243bfbfd5805b837705faedc3c480d67a92bc124 COUNT = 65 MD = ef2ad8656fac9c593d301fcfac77a7815d50b42526d3a44e1573316a25b05904 COUNT = 66 MD = a3484a7a6cb5c941e15346a3ac4e09e99a5189cc96a87104d196af3c43cf995e COUNT = 67 MD = 966851a0ef41f8d8ff970f4340a8dae8eec4f1999f5fd4f6cbcfa372fbf85495 COUNT = 68 MD = 8e1559cd4431febfa15662a2ccf2cac82f5401b2657551480bb0e3dd2111032c COUNT = 69 MD = 5f535e2e7351cb8caf0070166218238a843c17472cea2f5911008be5d7fd6ba2 COUNT = 70 MD = 86ac4ea15f10c264b158058f5c13a36a87ac72f840071bbc45399b36823a5709 COUNT = 71 MD = 5c0d3fe289b2aac7d1bbaf57f4154b8d10875cffc9d8bd2402255ed1615f1d5f COUNT = 72 MD = d7d808366d0c8b76ce3e7ab80ea11b4e2f8758f9ff404a3aafbf5b0cc191adcb COUNT = 73 MD = e0768536856d1d7399667d6fd2c32f72416eeea1c40a313ee6edc910a5c3b786 COUNT = 74 MD = d670923731b3e598f5c4db4c7e57fe2275cc6c49b4bf67cb91d520846aec256e COUNT = 75 MD = 2cb0bdcc305ef3b3d6b7265ab62bee555c524102679da122424713a9a01d69f6 COUNT = 76 MD = 5acdc323fe067a4b915ee521ac8eb81bcff4e205d53e4e7f9a69d436035cc5ad COUNT = 77 MD = e634c43558d12c2a8710f2d6f10a86411cfad5a014e6b6cc159733c8ccece283 COUNT = 78 MD = 4a05f4bc3fcaf50e6d0916d7e7024b0ed22e9a3c413ff4bbcc0922d2326dcf6e COUNT = 79 MD = 17c9d6029e15d3fd84e6809c5ef8a279a040f49ada91601a3ba4572cef7c08bd COUNT = 80 MD = 1f21e137da2427536758409f3fbf5842589c5f587f0b9d2d10430f840faaaf45 COUNT = 81 MD = e3d38cff8a8d7fc00693dca5e37b03e7b10dafe4926023e26d937106ddac6a78 COUNT = 82 MD = cd749eb05c67038fe837910310b3b4cdda190f6235fa970602f865bec1b61a1b COUNT = 83 MD = d596ccddea01b4ae29b68b0e8a191007f0c89a1016c380b49786f2d4fac4c43d COUNT = 84 MD = cbccb1ff23e33c59dc4c858093c9e215c3759acfe6bc84ff75940b59b25a4e40 COUNT = 85 MD = 7214c134e9a963d6c43969d3ef44ece825dd9cf35bda5fcce92a6b9d0d3fd1b8 COUNT = 86 MD = aceaf5b775779621319f9ab5d4d370a3359cd6553ed2328cdc9dbab5b68840fa COUNT = 87 MD = e8123acb0a2fb62978d3811b31676975542993932108ab14d487ad7875ddef72 COUNT = 88 MD = 660202a436fb05c3d59be699734e77c9750c906c8597ca213d064853ecf8c9f3 COUNT = 89 MD = 4752b0a5ec3f1fb295d5bfa98fa63a0ba38a02a4c1e1f73b0c4d4e88a07e0317 COUNT = 90 MD = 1e24f1467c36b051af3241fcf8c2c868b86dcb8e4669931878018e9914129b42 COUNT = 91 MD = d1c3efc99d9487e147282d811ab932d4a24362d09ac909f4854e783887068891 COUNT = 92 MD = 7dc455cf6f8b2042b6f0f368c44f18a080e5d3912ce3cdaf7142bd61ae50d02e COUNT = 93 MD = 4b991c15789084eb1d6c1d7ce8f0928df4d3931c0c22c571f375849b9a6c2b71 COUNT = 94 MD = 8b78f95a007cfb0bd054a1f5d962cd8d927665f79a5ce9e0fc31105e57b8460b COUNT = 95 MD = bf305423849cf773fc54206d8ae3c000c3e8b359cba8364581d1f91b0a201032 COUNT = 96 MD = 47006af96cff3843d3ed53bdedb167490d7bfefd93ae3e9ef473cb53aa840fc0 COUNT = 97 MD = c53cf5026162021fd2345dbad7c53d3a3df47b5bdff8cd34a0ccfee06dbb7328 COUNT = 98 MD = 3326899b575f93cdaff757f8ab7c3996a2fe930450d5002d4575f4e4cc4b4360 COUNT = 99 MD = 6a912ba4188391a78e6f13d88ed2d14e13afce9db6f7dcbf4a48c24f3db02778 ring-0.16.9/third_party/NIST/SHAVS/SHA256ShortMsg.rsp000064400000000000000000000240731352416253600200300ustar0000000000000000# CAVS 11.0 # "SHA-256 ShortMsg" information # SHA-256 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:38 2011 [L = 32] Len = 0 Msg = 00 MD = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Len = 8 Msg = d3 MD = 28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1 Len = 16 Msg = 11af MD = 5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98 Len = 24 Msg = b4190e MD = dff2e73091f6c05e528896c4c831b9448653dc2ff043528f6769437bc7b975c2 Len = 32 Msg = 74ba2521 MD = b16aa56be3880d18cd41e68384cf1ec8c17680c45a02b1575dc1518923ae8b0e Len = 40 Msg = c299209682 MD = f0887fe961c9cd3beab957e8222494abb969b1ce4c6557976df8b0f6d20e9166 Len = 48 Msg = e1dc724d5621 MD = eca0a060b489636225b4fa64d267dabbe44273067ac679f20820bddc6b6a90ac Len = 56 Msg = 06e076f5a442d5 MD = 3fd877e27450e6bbd5d74bb82f9870c64c66e109418baa8e6bbcff355e287926 Len = 64 Msg = 5738c929c4f4ccb6 MD = 963bb88f27f512777aab6c8b1a02c70ec0ad651d428f870036e1917120fb48bf Len = 72 Msg = 3334c58075d3f4139e MD = 078da3d77ed43bd3037a433fd0341855023793f9afd08b4b08ea1e5597ceef20 Len = 80 Msg = 74cb9381d89f5aa73368 MD = 73d6fad1caaa75b43b21733561fd3958bdc555194a037c2addec19dc2d7a52bd Len = 88 Msg = 76ed24a0f40a41221ebfcf MD = 044cef802901932e46dc46b2545e6c99c0fc323a0ed99b081bda4216857f38ac Len = 96 Msg = 9baf69cba317f422fe26a9a0 MD = fe56287cd657e4afc50dba7a3a54c2a6324b886becdcd1fae473b769e551a09b Len = 104 Msg = 68511cdb2dbbf3530d7fb61cbc MD = af53430466715e99a602fc9f5945719b04dd24267e6a98471f7a7869bd3b4313 Len = 112 Msg = af397a8b8dd73ab702ce8e53aa9f MD = d189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c Len = 120 Msg = 294af4802e5e925eb1c6cc9c724f09 MD = dcbaf335360de853b9cddfdafb90fa75567d0d3d58af8db9d764113aef570125 Len = 128 Msg = 0a27847cdc98bd6f62220b046edd762b MD = 80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c139bcedc4 Len = 136 Msg = 1b503fb9a73b16ada3fcf1042623ae7610 MD = d5c30315f72ed05fe519a1bf75ab5fd0ffec5ac1acb0daf66b6b769598594509 Len = 144 Msg = 59eb45bbbeb054b0b97334d53580ce03f699 MD = 32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288 Len = 152 Msg = 58e5a3259cb0b6d12c83f723379e35fd298b60 MD = 9b5b37816de8fcdf3ec10b745428708df8f391c550ea6746b2cafe019c2b6ace Len = 160 Msg = c1ef39cee58e78f6fcdc12e058b7f902acd1a93b MD = 6dd52b0d8b48cc8146cebd0216fbf5f6ef7eeafc0ff2ff9d1422d6345555a142 Len = 168 Msg = 9cab7d7dcaec98cb3ac6c64dd5d4470d0b103a810c MD = 44d34809fc60d1fcafa7f37b794d1d3a765dd0d23194ebbe340f013f0c39b613 Len = 176 Msg = ea157c02ebaf1b22de221b53f2353936d2359d1e1c97 MD = 9df5c16a3f580406f07d96149303d8c408869b32053b726cf3defd241e484957 Len = 184 Msg = da999bc1f9c7acff32828a73e672d0a492f6ee895c6867 MD = 672b54e43f41ee77584bdf8bf854d97b6252c918f7ea2d26bc4097ea53a88f10 Len = 192 Msg = 47991301156d1d977c0338efbcad41004133aefbca6bcf7e MD = feeb4b2b59fec8fdb1e55194a493d8c871757b5723675e93d3ac034b380b7fc9 Len = 200 Msg = 2e7ea84da4bc4d7cfb463e3f2c8647057afff3fbececa1d200 MD = 76e3acbc718836f2df8ad2d0d2d76f0cfa5fea0986be918f10bcee730df441b9 Len = 208 Msg = 47c770eb4549b6eff6381d62e9beb464cd98d341cc1c09981a7a MD = 6733809c73e53666c735b3bd3daf87ebc77c72756150a616a194108d71231272 Len = 216 Msg = ac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937 MD = 0e6e3c143c3a5f7f38505ed6adc9b48c18edf6dedf11635f6e8f9ac73c39fe9e Len = 224 Msg = 0777fc1e1ca47304c2e265692838109e26aab9e5c4ae4e8600df4b1f MD = ffb4fc03e054f8ecbc31470fc023bedcd4a406b9dd56c71da1b660dcc4842c65 Len = 232 Msg = 1a57251c431d4e6c2e06d65246a296915071a531425ecf255989422a66 MD = c644612cd326b38b1c6813b1daded34448805aef317c35f548dfb4a0d74b8106 Len = 240 Msg = 9b245fdad9baeb890d9c0d0eff816efb4ca138610bc7d78cb1a801ed3273 MD = c0e29eeeb0d3a7707947e623cdc7d1899adc70dd7861205ea5e5813954fb7957 Len = 248 Msg = 95a765809caf30ada90ad6d61c2b4b30250df0a7ce23b7753c9187f4319ce2 MD = a4139b74b102cf1e2fce229a6cd84c87501f50afa4c80feacf7d8cf5ed94f042 Len = 256 Msg = 09fc1accc230a205e4a208e64a8f204291f581a12756392da4b8c0cf5ef02b95 MD = 4f44c1c7fbebb6f9601829f3897bfd650c56fa07844be76489076356ac1886a4 Len = 264 Msg = 0546f7b8682b5b95fd32385faf25854cb3f7b40cc8fa229fbd52b16934aab388a7 MD = b31ad3cd02b10db282b3576c059b746fb24ca6f09fef69402dc90ece7421cbb7 Len = 272 Msg = b12db4a1025529b3b7b1e45c6dbc7baa8897a0576e66f64bf3f8236113a6276ee77d MD = 1c38bf6bbfd32292d67d1d651fd9d5b623b6ec1e854406223f51d0df46968712 Len = 280 Msg = e68cb6d8c1866c0a71e7313f83dc11a5809cf5cfbeed1a587ce9c2c92e022abc1644bb MD = c2684c0dbb85c232b6da4fb5147dd0624429ec7e657991edd95eda37a587269e Len = 288 Msg = 4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a36774366000 MD = bf9d5e5b5393053f055b380baed7e792ae85ad37c0ada5fd4519542ccc461cf3 Len = 296 Msg = 03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b89550 MD = d1f8bd684001ac5a4b67bbf79f87de524d2da99ac014dec3e4187728f4557471 Len = 304 Msg = d0fefd96787c65ffa7f910d6d0ada63d64d5c4679960e7f06aeb8c70dfef954f8e39efdb629b MD = 49ba38db85c2796f85ffd57dd5ec337007414528ae33935b102d16a6b91ba6c1 Len = 312 Msg = b7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b1 MD = 725e6f8d888ebaf908b7692259ab8839c3248edd22ca115bb13e025808654700 Len = 320 Msg = 64cd363ecce05fdfda2486d011a3db95b5206a19d3054046819dd0d36783955d7e5bf8ba18bf738a MD = 32caef024f84e97c30b4a7b9d04b678b3d8a6eb2259dff5b7f7c011f090845f8 Len = 328 Msg = 6ac6c63d618eaf00d91c5e2807e83c093912b8e202f78e139703498a79c6067f54497c6127a23910a6 MD = 4bb33e7c6916e08a9b3ed6bcef790aaaee0dcf2e7a01afb056182dea2dad7d63 Len = 336 Msg = d26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2 MD = 3ac7ac6bed82fdc8cd15b746f0ee7489158192c238f371c1883c9fe90b3e2831 Len = 344 Msg = 3f7a059b65d6cb0249204aac10b9f1a4ac9e5868adebbe935a9eb5b9019e1c938bfc4e5c5378997a3947f2 MD = bfce809534eefe871273964d32f091fe756c71a7f512ef5f2300bcd57f699e74 Len = 352 Msg = 60ffcb23d6b88e485b920af81d1083f6291d06ac8ca3a965b85914bc2add40544a027fca936bbde8f359051c MD = 1d26f3e04f89b4eaa9dbed9231bb051eef2e8311ad26fe53d0bf0b821eaf7567 Len = 360 Msg = 9ecd07b684bb9e0e6692e320cec4510ca79fcdb3a2212c26d90df65db33e692d073cc174840db797504e482eef MD = 0ffeb644a49e787ccc6970fe29705a4f4c2bfcfe7d19741c158333ff6982cc9c Len = 368 Msg = 9d64de7161895884e7fa3d6e9eb996e7ebe511b01fe19cd4a6b3322e80aaf52bf6447ed1854e71001f4d54f8931d MD = d048ee1524014adf9a56e60a388277de194c694cc787fc5a1b554ea9f07abfdf Len = 376 Msg = c4ad3c5e78d917ecb0cbbcd1c481fc2aaf232f7e289779f40e504cc309662ee96fecbd20647ef00e46199fbc482f46 MD = 50dbf40066f8d270484ee2ef6632282dfa300a85a8530eceeb0e04275e1c1efd Len = 384 Msg = 4eef5107459bddf8f24fc7656fd4896da8711db50400c0164847f692b886ce8d7f4d67395090b3534efd7b0d298da34b MD = 7c5d14ed83dab875ac25ce7feed6ef837d58e79dc601fb3c1fca48d4464e8b83 Len = 392 Msg = 047d2758e7c2c9623f9bdb93b6597c5e84a0cd34e610014bcb25b49ed05c7e356e98c7a672c3dddcaeb84317ef614d342f MD = 7d53eccd03da37bf58c1962a8f0f708a5c5c447f6a7e9e26137c169d5bdd82e4 Len = 400 Msg = 3d83df37172c81afd0de115139fbf4390c22e098c5af4c5ab4852406510bc0e6cf741769f44430c5270fdae0cb849d71cbab MD = 99dc772e91ea02d9e421d552d61901016b9fd4ad2df4a8212c1ec5ba13893ab2 Len = 408 Msg = 33fd9bc17e2b271fa04c6b93c0bdeae98654a7682d31d9b4dab7e6f32cd58f2f148a68fbe7a88c5ab1d88edccddeb30ab21e5e MD = cefdae1a3d75e792e8698d5e71f177cc761314e9ad5df9602c6e60ae65c4c267 Len = 416 Msg = 77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc MD = c99d64fa4dadd4bc8a389531c68b4590c6df0b9099c4d583bc00889fb7b98008 Len = 424 Msg = 45a3e6b86527f20b4537f5af96cfc5ad8777a2dde6cf7511886c5590ece24fc61b226739d207dabfe32ba6efd9ff4cd5db1bd5ead3 MD = 4d12a849047c6acd4b2eee6be35fa9051b02d21d50d419543008c1d82c427072 Len = 432 Msg = 25362a4b9d74bde6128c4fdc672305900947bc3ada9d9d316ebcf1667ad4363189937251f149c72e064a48608d940b7574b17fefc0df MD = f8e4ccab6c979229f6066cc0cb0cfa81bb21447c16c68773be7e558e9f9d798d Len = 440 Msg = 3ebfb06db8c38d5ba037f1363e118550aad94606e26835a01af05078533cc25f2f39573c04b632f62f68c294ab31f2a3e2a1a0d8c2be51 MD = 6595a2ef537a69ba8583dfbf7f5bec0ab1f93ce4c8ee1916eff44a93af5749c4 Len = 448 Msg = 2d52447d1244d2ebc28650e7b05654bad35b3a68eedc7f8515306b496d75f3e73385dd1b002625024b81a02f2fd6dffb6e6d561cb7d0bd7a MD = cfb88d6faf2de3a69d36195acec2e255e2af2b7d933997f348e09f6ce5758360 Len = 456 Msg = 4cace422e4a015a75492b3b3bbfbdf3758eaff4fe504b46a26c90dacc119fa9050f603d2b58b398cad6d6d9fa922a154d9e0bc4389968274b0 MD = 4d54b2d284a6794581224e08f675541c8feab6eefa3ac1cfe5da4e03e62f72e4 Len = 464 Msg = 8620b86fbcaace4ff3c2921b8466ddd7bacae07eefef693cf17762dcabb89a84010fc9a0fb76ce1c26593ad637a61253f224d1b14a05addccabe MD = dba490256c9720c54c612a5bd1ef573cd51dc12b3e7bd8c6db2eabe0aacb846b Len = 472 Msg = d1be3f13febafefc14414d9fb7f693db16dc1ae270c5b647d80da8583587c1ad8cb8cb01824324411ca5ace3ca22e179a4ff4986f3f21190f3d7f3 MD = 02804978eba6e1de65afdbc6a6091ed6b1ecee51e8bff40646a251de6678b7ef Len = 480 Msg = f499cc3f6e3cf7c312ffdfba61b1260c37129c1afb391047193367b7b2edeb579253e51d62ba6d911e7b818ccae1553f6146ea780f78e2219f629309 MD = 0b66c8b4fefebc8dc7da0bbedc1114f228aa63c37d5c30e91ab500f3eadfcec5 Len = 488 Msg = 6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0ae5a3684e6e460811748690dc2b58775967cfcc645fd82064b1279fdca771803db9dca0ff53 MD = c464a7bf6d180de4f744bb2fe5dc27a3f681334ffd54a9814650e60260a478e3 Len = 496 Msg = 6511a2242ddb273178e19a82c57c85cb05a6887ff2014cf1a31cb9ba5df1695aadb25c22b3c5ed51c10d047d256b8e3442842ae4e6c525f8d7a5a944af2a MD = d6859c0b5a0b66376a24f56b2ab104286ed0078634ba19112ace0d6d60a9c1ae Len = 504 Msg = e2f76e97606a872e317439f1a03fcd92e632e5bd4e7cbc4e97f1afc19a16fde92d77cbe546416b51640cddb92af996534dfd81edb17c4424cf1ac4d75aceeb MD = 18041bd4665083001fba8c5411d2d748e8abbfdcdfd9218cb02b68a78e7d4c23 Len = 512 Msg = 5a86b737eaea8ee976a0a24da63e7ed7eefad18a101c1211e2b3650c5187c2a8a650547208251f6d4237e661c7bf4c77f335390394c37fa1a9f9be836ac28509 MD = 42e61e174fbb3897d6dd6cef3dd2802fe67b331953b06114a65c772859dfc1aa ring-0.16.9/third_party/NIST/SHAVS/SHA384LongMsg.rsp000064400000000000000000063304451352416253600176430ustar0000000000000000# CAVS 11.0 # "SHA-384 LongMsg" information # SHA-384 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:40 2011 [L = 48] Len = 1816 Msg = 62c6a169b9be02b3d7b471a964fc0bcc72b480d26aecb2ed460b7f50016ddaf04c51218783f3aadfdff5a04ded030d7b3fb7376b61ba30b90e2da921a4470740d63fb99fa16cc8ed81abaf8ce4016e50df81da832070372c24a80890aa3a26fa675710b8fb718266249d496f313c55d0bada101f8f56eeccee4345a8f98f60a36662cfda794900d12f9414fcbdfdeb85388a814996b47e24d5c8086e7a8edcc53d299d0d033e6bb60c58b83d6e8b57f6c258d6081dd10eb942fdf8ec157ec3e75371235a8196eb9d22b1de3a2d30c2abbe0db7650cf6c7159bacbe29b3a93c92100508 MD = 0730e184e7795575569f87030260bb8e54498e0e5d096b18285e988d245b6f3486d1f2447d5f85bcbe59d5689fc49425 Len = 2608 Msg = ffd67890ff77f344ad4f067df2f4ff1db8f541c7a2bd9ae9fabad0faebbf7d00f0a71d568c3c66ac3c57d84faa4894ab2377710e4b4c4dae0f4da1eedc8658dd0e2ee2ffac8784515206f2876eb41f98afd4547cbbc68034212bcf0c8e4a7d1d43b3ed15c621f53bd8a57cada80148ec4652119b5af3da84169d81dc69d394c8767d662044d36272b77ca04abff7b6b0cf3bd1f3919a04a5d8ebdfe7d6e844e78fd576a68d6373ffd5d384e51b5e12ec32d5bb0ac685a59f4d5d12b43b533580750345310999cfe91cf2500624fe03a65769f86a627a667b5f3b42cb01da109e124ffa48203f1f3873202d35429f32e8263eaf9bce42ef40f5cc96b591467d464d00bd743a1b0af4c1a743fbdd0846b9879e092371a5e7f6f65937f9515e23820e60b83bbff73926f0cdb9df5d02e82262cf2e8cb26af6a64c2a4d1fabecab593db510281799 MD = 1396fea95ce0c1c1c224b50a07dd7197f1d62b993c7fe9e1cc1a56101920d4b0fecef587fbcd56b854c8c9da95132f02 Len = 3400 Msg = be105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081 MD = 39cf9206d78cfb437000b100661753181b5f262b539c208b442e7a022cd3234c58751621ff0ee9e9d3607174e36aaa88 Len = 4192 Msg = b41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9 MD = 0f8ff0eee8ffdefb8b3151b7664ce9dcaaaf3f7af0b1e290ee49ba211b67863f63fa71202a534c0c42444a52bebf6c62 Len = 4984 Msg = 52a6741b9ea02569dabf96ec0b3e2462866eea4a635bd7a42fad04f8e1cc45990f48ff2b627739634860f50ee8d7c0555bea883f197cae77b1305c50be891906164f9a474434dbf139b76f1e3e49155e2dae8b43e1a7a723ebcea31986c1b94dce82ef752c1e359c158dad22f4da4a0564849c5ea323ea2f434e825b23bd4df69eaba6bf027e6ceb44aa5625f2d387d2683263994739a023237aa01f7cc5fe8af090672dae9cab672ed6132c207cf64ea28087fbb531f188f218a66c7920f3902bfbd9c619c018963bd98c41661cbc007838b18dd65304e418f13b4b02185690b6b2a4922932db02d47a686bacfc04705320885690e602c2fdcd08c3fff34c12fb7d7199c7391d335f8250b3da65f4279c02b55ecc3412a70974b4dc58faff9f6126e8e4dc1f06b046baeb1fd89db4acb9a4dfad73835d1da4ade89ef67597be5073b07a4e2abd01efe7e2ba8eec6d8714ceaf4c6b1c0bab36414c12bfac3bf8302e726307a36baec4d4dc89e49c4741134acc429e4743da27f9873f9ce614d46a1dd5a8edd2373f2b488296c3f4696120dfe097f24c2d30df9b422e756d4ada64098250eafe4a3d8e0a7ce8113bfc6fa25490535172f237c6ef24e53387049287b92063e570cb3054e37187b8ba27f40172867fa202ba7744bfd66ebc7d6a853bf758eac571e39ee59b097c9eb91377a4016a23cd44ac77c2d1ffd1fa97a63ae989d2eb7447ba11a9faedcead7fe780f5c9e345b980f1bfa6ee4814d41cdd39f7383571d93a771008c8c585cb56cc975b919aef50feb0d75ade594131563a0bcfcc2981dc9443246acc38aae284ea453e233728790512484469d95ffb8be237d70d5825659b45d337cfef43d95268 MD = 45d0bc363c4e0d5c1993570d7366847aae64ead4138d93acd843f28d3f719b02871736ba4905532e27f4bc8b5c2ced85 Len = 5776 Msg = cc990092fb16b6311fe4d66dd5c472215e807f82e71d34f60e58b32aa351eb5eab81bd04abf15d8a23aefc745878a4ad56ba631f36bfab819d22f9708586b5c240885917b9f2d6b0fe313485fb0a78918888ca71a739d72d069a7556cccf855192971ef2ae80e84db857c5c847e3b775fcd3fe9fc2f480a353a76e01ff9325b3a99752be12025a065a07f966c36b2900b98145d20f586e8b8c332e9ca6395b918d6e3ea26be2f585ea291687f80a95dbc77be83217ce688cb725fb4d492bf09347062ac74387817273a465526c29c4ae2eaa2ee661bc384ede651e3c71d0ac60dd455e542159c674fa622ef0a92e7f20f6f56117758ba47a08dadf93a59056a15a1521728ec08b34894ab98937838cd92843c7ecdca475b83e6e85776ed3b8fdc35dbd4911249a5a27444d449c8eb382cc7eaa8e1d6d72af87085a125301981d2205780032edb98ddd38334962b9bec3e88d5024c0506508eb90a48cdc82bfa87ef49bc07983b175b20eb4c1106b7343865802d74eb4146a72efac0d91bff547e0146db06f4f49bbaeae16d42f0b9cabadc707cf4e01497e250bbabcfb1e01a24f4c38f99bb74b07d901a1a94603ffa266c2a933489ecaec0bcd15c1a108ad60d38442c285247d003ced9f69ddba65d1b8312e2bc4f55f5b2c1d07450be6bf2a74a4d534b6ffa94fde5b563b7d9895dfabfcdfe14b6dd27391e4d670c21e00a73b953777b5ae959cc7340f48ac055975470b047a646eeadd4108cb694d1a38802f3db0b20a9b0a8e005e12b7f569773b9546e52198606e4144732e5934402f5c59858a0d3e2ccfcd90c3a7b1dd2cb8d89c96c9fc6eac2746a30b476700faace4bf550bb1d8cbae027f4a165eeeb6e4f564e1fa336eb8dd9565ba5dbc38af79c06b967dc660df6dd5d6daa6e5af70c339f611beef20ed57d69267ba7f64c65c97652e26735fd0d5ed9c5da16fa8c01c4d590c5e580db35fb033faa4d90da91e11b3074fe15c05aef3d9ba4d23620fb9d895bc MD = 2d24f6afeef2af38849f29ebeae7012717d50f5a31561ebb9e5760b83766030d1d2394c8eb71e030226ecf0159efda87 Len = 6568 Msg = 546a582d46de5b45d3f71166ef69aa0704848c0a3963b194f4674a1d9de4a9c3a6195de4c8669feb8fb9ed6a184af46a1a88b3ff2352de1f246b80b33028e5ef816cb7dfbcd667437539ce9df64d15883ca4d24b43df73ae8421e00dbbc45caaed4bac47aa987cf59060fe2710dbd40a75c0301921703aec1a71b250c61fd69df39e86441a13a6a8e514c42fee5dfa98cac4168f466ff97ef0443da7daa11b709a4d8bfd95afac047e3e67dd19394fd94598ccd53942790f0e80ca387eb2f2caeb41049ba2d458b362c7305a18d99b76ed249a14825382457a0fa12b3aba2453ec603845caea705a999567ce73a3a616ca51c874aa08dcc83ed70aa996217ab4a79371249459bda42c925461b3013862e5059d1c38cb4e4162c24dda1b4fb99524c3f560888a073622a43e395f5a180245296235b403a158ecb7b1e550adac9d6ad60e202ee316bb83b56f81ff150f9df2a660e6a7179db4e69d7ff2bda11a7581b6018c0fcdb1d957ac2d5f1c9ce5dbf562dc5898710afe575e002beb94cac5714919ceb2b1a238a771c1fb3d566266554721b20f78b0dd48e179b661ef853442799d0b9ff5af817aec737eeaab4de31a3c761d949457fac00e35bba718136afd2cd46e5f03a15cd9058a10ab0370fd4d2822c1b02dc6fcc7cd7b6346793c10aa4c071c79413f70cba450d809c6915af5f56ec5eaabc68c650692d5c578c8ce4fc07f407519536658b10bff8b5c79a21a8aa252cb771f52a3a1c33aac7f7e4bf6708100dcf2a3e5881404acba2ef07ec4cf068fdaf799f5888656ba84f52730a64458843533f99664b583081ca2be96fcace1a59f94fb1e1d9e937cd4428b2468244bf508461b21f37ccf3b3b21aa91c9097dbba2b60f7469cfc1a924cd72d043f8a17bde92d12d3e52326c9f147d1734ce20fa6cc69ba074022a68fd00a4db3fa8a33d3d7fe5624b1df2c4cee1ffd244e3138a842a6849462014e2e542e8ee641c9964b0751d6a24c7586a52f2f86701309e92724c3e18e80fc83f66fc08b1bb3dcb17bcdc43ead136ac86b3ad3081739e083abf93e5b561b98ea60894cacb4bf1807feb1c1d8d58543642777c6fc6a3139bacf26624c7b904ad3f5273f7e51c2101c4c49d74f8c3073dc428c67cde98789d0d93 MD = 8103d79f14895bd39e568b4c8cec9a26f03966763c3b2a65174a5d2829ecae097a7c6971dfe182fd2a7a9ea6e329b6fa Len = 7360 Msg = b8727e619a77b72152a46d80efe1c1ad34f131b83e8f614967bd1b926b599482c9f1f13b6cd809c78b796d06ceeca6ebb2c7bde82e3701a7974f04fbc19fe7166709d7fcccd0d838a3f2c1cd2cb8886fa18bc0f3d00960050958c6193abafca45962398b0287abdb62b673bc536cf2a0c8e443c06c2e08c986816ad220d25b9268a51ed056240a1a8f6e8bba8a3169e6f17b4d374acd815dd672f710b90e8d495c7a8fb310cf7d5cf4c10fb1182f77a9e2f7e640b10f5127c1d275ba4f971932fd88931c77b28d0a57580988468da351640216c3eb1c02910f49edb8289587b4127832f3d4f2c18a81da80275c7475463f41e6a83e1b1c01878166f28c2f603665f174206fbaa2453af07d76a20b76f13b5e5dd7f33425e1f21fe84fc58d2a22bc9c628b9030b7a34942075c5f7b2db8200184395191a79818ce7bba1ad870dfe021031d7f7c880d787726c4ddeb2304b5d161b4a257298ec1342818d238b7d5992760bc83c79de98d38e2936284de3ec377ff312cb1342bb5f9f65236d4896cae567f51e6397fa0512c44b2376de8cc129a639939c54fd7bbc6ee508ed56d0ce9586ac5eef9b59b8cfc5309a4cfc9186ae397d20fbb02fa9d4316fa2262ec1d10d229fee430c741064f1880f0d2078893faa2c6f6bcd5fc2117783839a48d07ec6fc2e610053ef986ce9900659d2c8654868c5b38f0514510ea1cf31cc3d83245d43f64b9a1a02dd621e06f4959c07977305d7b1c7efd3d3166081114e65507e3aca75f282b7844bceff5b7e52d49c9c29f1e0de98e614d4e31467c67358dec8d9d03c1a6cc4ba601e0debe814251ddfe7bd7f9e84a06db2df3de1a5dd9074a0d4f5a7179aca3ba6d9da56e65c05f1ff36e8e2761d873519755d6d540fa4b8a296cb457e9f207eac7ce52add8cefcf6681e4d7f9b60301554fe389456bfe212aa991a5b40c7009ed91beb652394aeca26331be8e00bc6912c980c3fe951534c57809265c452153c692a7a7d8f3b0004f656014d7600bc2be7c858bd3fd8269efac9275dbfbcce2d40a606dd62eb770a9e2f0593a6689a4d4c3826f8a07be472591cde2b772cb3d92635986de4cb9d45e66532a3b86be95e25907dd75662142f3e1fc1b735cb4da8e27f37155f04f91d98a18d65f43030c638776642a8b63e3d6f7dd7e940c023033e2debbd19bd13fb7a8a20c1a2e0f7ec4e96e721dd9fea04b4dc28aae234bd5000e7bc4d5b1f744556c9f2a009a2c73a2e950b5c3e44a1ecd7e5bde0614fa4f8f154b3ad6d52a365f2050be8729f2617 MD = 2ac3ab5299ffbac1c27300859a92a69a80f510a1f28b7054f131b43af74a0df5e298a9eab77e49ca81a578c309f5aec4 Len = 8152 Msg = f6b1cf75b5cfa4ab323cf04ff13b7a591b23d06ed25f3c04c1baf4c8f7da913cf509c2a5053c4224ce4d0723268cbdf2277672b285c493731ea81799d353fa8497baed70c59a4c99b7b950a39470863a69667ff67c9ec981ddb41ffb3d63dd9d034bb79d9df1a95214083199e4efbd770a7a5f005ef5c877236674b6dd1322d0624487f6344a43970ec014cbbd114af2313b7b98d4d2779d1b477e925a6ab165dc2ec74133ac01b0cd6b6003c8df15f3072f3988863cbe3aeadea6575d7072a49890de474120cbe478907d07ad6006c2b4e002971b3b8597bbb352cc8d2e4ed5bff234d007ad897d38b8d39f139c06a65fd63f8c3cd7b4fdb44febba93ab2b3f78dc31a42d5b23c1346aca95a29cfbe931975630901934b2fd39dae916f0f32becd73d8a5a3282f9952ecab00367cfd151adb14bc008ebfebff98621bf038ce1436ac04b363b8c6c828c3bb7de0568a7e7a0b6a573acc22b2218562a36eee0a9a41e22af6a7d2a64240d8573da7fb0b21df6cf05520ea1804d1db4cb22b9d5cb377acb7e9e004527a23810aca0dc8d3c1939633404357144699007ce2b6a558e2606238079cdc3fe25964429d824e98b03f0d9fb322918c09dfab6f9fa0b473c964a937da4eb8e31d5ad8ab42960abe804a49b2084f3803c12e22b1537a3921bb1cf813cc7628c08d90848133b97bb9b44dc106ba19a8fffefd0cde98a3b20749f1c5686893ba7cb5a2ce70fb7d101ecea20a0a632262f535d4c043f99dad88e88b97b23927dc5c17fa3d070451664231ef8b397dea0477e84df38dd0f88a2b3932f56db8b30d03371f46afe8c6fcf870aedb1084e0fbfc98b10d18c924d6629e80551761c5daf6957a71c8135e32761d38603bf2a7b7f7c9b683714ca320c39b0c3d3bbec0b4aab5a4450c0e77b55f9a44c0f8419ed6edfdb6ed33d613e7d2b13f24373a4428941a2546d844b3e4197a3c63e21c36b763a74aa0bcffc7a9f4738190b66eb0a5472565fdb950934d383f87cf85cd1007ed48da4489146ec5bd548c0925c6a6c93889feb01bbc865f404ccf6a6ffebb16ff64fe5f34ce49e9a1c6a6f401dc96f2ec9a48249be30da8a6447bdaed0b8882fe8e2f472c881984265c7af7d70af1c0d7e8eab1a65ea9a7ee990587a98e18ca7f26d592fcdc3e03cf88607b11fc47919ee84efdc799eadb9dcd04f701e0dc5bf5c189d90235280711dd10044f0b1913863afd4f8c3f31c22852e2bfa2ce53c606d0d47ff91d780c81ccd209fac1e69532336e4d40892eea02bd3727f8811f8706e71dfe3e1fae6283ca4f2281bb20b537742a7d913232b1d17e6af67fb3801d8a76feda4d962bc7bc67efb4804167e1ea7fba46fab4ddb80929067194d026081602cfaaa42b80aa80282c56730f2ca9efb8863ff97b807b1e2f924ff46191c52e1d38d5c MD = 70a597d1f470d69d7b7d495531c3182704dd60db5c73429fd7108c8ee22d86ed5822adfe6352f28f93023f46cc8d60bb Len = 8944 Msg = 102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c5 MD = 81a031db32d465202a2aba19ae6072148f3fcf6fe33fc8a843c0691cf845f9cb7bbeaaaa04ce2f1476bece682632e20f Len = 9736 Msg = 98afae971df98e02fc3f503d0b12176c2ed77f4e7962de7194c7caa2646cdba8e763b13260f7390db5852d9a158eda80dd09269ebdfed1441750fba2a7dbe78069befe30b7fa17c1b23df576e4f8117624b79ac5b9b2bb73c29f1c14d5cbab70e6699c7b6a2aae87bd0eb1b8c17945b8c989e4adb5a723685e5c34df3466b0de250c93f9c1ae89c59ca06848f439fdad94260b3cf804918ab22f4ced0dd47d33ef4eec9404af2de4189c220ec55fc1bd4f37175cccf28d4188be6b25a73d9ad80cd7ae327a54244df9aae7f17c131950c06311f47799a0f5a6b4996f4cc890334450e1bd6cc6f5670771c0dc607f8eceb15300ec4220510ed5b7deb3429de6ae5f618e1c222c28990a9ab4b4bac8a7a0e8afec2c75b029f4dd6f43d9d2e524b024b1bc37e4af454dc9cccc62d219ed2c2d1ede9b5870af108686cfca44c8d3a05ce973f6fa77d5ea0db00fcef098e7db4a48dc2333896bc898a18b6ce06d7ae8cfb0bb41abab60d89eee85e05c6d1d1505d6f1ab4d22e585da6b7da8eefda1ef45af9d0041746c7e442d36815dc117432870221cef64a6b01589af67b59fd01d868e201b02f98346c7152b973dbc5ecb79bd795c617735af11a6298f7e7c90da59f44d7a37632c97ee4f6b0b42857917c166fd54eb821aec9668f10991bb688e88892a0627d9f0d98283fec6b545f08dc712b6ecd5addecd6c7711be3686e1a1d9f6c2a51c8455754c58edafde234c97556aad0d662208bc5a7c9195b502817c15e31a405c8be5d111773fad0448139c3116e99de70620202a1f77755559d38504f73cc0301728569c88fcaa70dbd00424bd7285a084ae61a207cd485fb35c256ddb2f0be050a56cb4322c8d6b050836f60751aed9c13be78bdd9bf51b37a6c41937fb0bb45de47c201dd83e3bee459c6f9e8dffdae84e19ac48e764d10e38cbd1b2a9a6f4676deca9f208a428bd0e9d57272e5fea1f7061cff1bb7dc95f9aa05bf43fc6e795c9261759c2a97c9beca1754d3db8538e2826ba7f1e284a5355ad7fa6c852d6107f9032f910347daf661092b5c1f15b5ffed1369b194d9e12f0590770493209ff1794c17bf92e75220453760ac2f24bb77ac80bedb2d40bc3f30bb9f9cc4ec88b19998e86867daa1b4ed0e9f249a36bc12574011cf3a5da8fe62d5fea588e5bdc0e075fc3bd0a65c3cdf0b3155cec02a2863de0d1e4a8539d5226bfeaf6da09197e45fddaa8bded41081b9b1d06b55a85268c6fb38cc6bd16bf5ea2a2ad1a1c6befbd30724f7e8cbe87ba6baf4ce6b9908bc7776bf3e56221b33dcfb98536daf9ebd6bf33b8368862d333e976386768eb3f58c0a021ee88e7b82b10d886168cecf9f874c7edcb2a5473f0de17d120afbfcaa512fb1fca788f55902ba7b9a2796ba28b15d3f627babdef57113d1ff9d534b2183524f45f7a4213d4e9cd25c3eb9f6cf76b02d93080c4d0d24c8e2bdb24718117f0c2a897d528785f12f3d25f28afe1a53ef9a0d0c3929dc855b2fcace29fbe0c0d7d4459d3680e996ec0c95f79c489fb566353eecd4edea1f5529a5658e5f25e52ffce8cba2b5debc4dd11ac2606eb627ae6f872e4211cc4f4160ebfce6ca47588ed511ad398ecbbdef1b22c779c8f43742a99435133dd9b1aa55fd18b5b5cb977f2d2ea66d8437282a5b5c9b4affd040ad83d4b5cabac8d2fa89572d9dba392e6b45be4bb12ea7979 MD = b31950d784b30bb1743918b99fbd6693b30fde41b0b9c2e154425f048827a161dbd4f3b163b5ea8b8d91bcdacf22e84f Len = 10528 Msg = af4ae11114072bf854a76a1b8b673bb7cc9ee8fa66f0d4cd65c51af15cf9714d62d653865b3f5ed1792dfa0502603cf5534e0afc256080d90f5d93bd4c26f4a3bfa537e0340035fbe912afbe4d1b348d07b644f73a0cb58b074856ed544bd329cca0d84627b2791fac3cd26ef402ea2af0bfde132e5e3b8b576caba7fdced48693af7de1bdbdf2e4cb95aa3c7f7b2872174f1f7787bcd98007b3d913cd18c0621cbb6dd97d8968f34d04815177f0b40d834f504cd09059121d042a5b4e915e676daaf155f07ea3f33a709dd564c857a43ca8b9b98e4181eaa346e4a408a1783b9066517d9c056a8d9ac347efcc6bd9df4b40a2e74b371ab0a063501982b1d4868dd5d57a0b84876976e4c7c739410265b70153fd8edaeb0c1d42b6df44273cf16ae1c574c565c02ed5bb658632b29adf88d21324e092bea421cb5e21d66d752331716892500ede84c0306954402668f4c79a2c84c8c75923b4e68f05c1e94ac5ea6c07fd36e9a9153e2b1a58e905354d7b43e444cee1852fde7b93b38c05827f9bbceaddff5ce8865794c2bbb8b7c991acb4848d7a480a70a872b054bf28e4f84e48595931d165821353a7a432a4ec6962d553865564b09019b32f10e2b93ad90af89c9956afe6af7b50113ce134667da68e9b58e69e3f343a27580e7e224ac9d8b4fac6f55e34b596744aab4cd0fe747fc7a22ab55c7e0611b472771acadd71bf64bd089746173d6da59918fbde7ef7f668b2254b0736aea943c7723f19ba79c7f02b86c3cf56ef06cc45ab77c8acad125911702f082fd407bd9d287477ab88f8408d690161bb726bd2978e47f4503fdb820735e9c5311f35083dc1414c76465b3d2ad8d9640c6fa49dd7e6f3cc345459ccde9902a804373a0eef642e00e45df7cd4cfcd440128db7174dde04b61f95951ddcc601186fc51eb5fa39c4fbbd72d4d939fd795d9575ae27409b011cd8a9965f4be46e7d3c71e9e7a8698aa6c930fb4a3a0251235dce90b4fa487265283a6478711ad23e31e2a48b3f1c0967cf3c73069733e3fb314166a8c10bdff9d7ed08529791b4c517c157890879c7a7994144f798b9b74bda7637eade0cd140ad6c89d304719c79b5b508c94ba94ecfede5770485bc557c21140b629974d0a2725fefe502e112c2d567c13250d4264594d01314a56346f7ccc4ebf8396b6287ed6d436fd7099f083d7e89ae5e20d57356ab201141d71123a32ddd9408181157e73f8c58cc12cab3b6a36925beb8e5bffa1ea7e2a1403e6770f8ec1e4ca4647a287dd28a29241c2b087e677db9c2de934ad0ae6f0dc5552df9cc1d7e4e37e35878ce1dec36661cd9fbb68e9f956746560c6a40a0cd8edfdc07527a9c56f717599fda76663b01522357f4e3739acea7700993625d28c464db62310a60ab0f87e6644ae4e07f1d4672e3df70e11220884909f41e8e688f6a94d212d5b397a5bc6590c670424be0812f68203cd243847249d4357b1bd3167b6e1f9de47b60e23c40ebf52174e7758ac0ae5e4f2c7623ecd831fd82ecb2821ed110793ea24fed91dd3d80ff5f9b02e98f7d42b2d9f4247e5ee9f439e94cfadc256f4feb0eacef42a64e0e12e9afb027029d746cbf02b0b043c4c3aafbeba73bd302c6f4a9bf0fd801e64863fb6aa6cb83d59b85c8ebef0bef8a12dd08d5b1c54192876059cf76da58ccd6f97e150d5d79ef5f06dbf50816ca0388d8f9533f02d8e6393708264bd012c95fdc58f80c654cb16af6df6a24593df7cea5b7ad797900c885829d0ab74397a58b15735bcc6c63e4615dbe906a5dae2d8c4c292b88b222fe134800c4e2ba4f2804abb58674f92850ef435fb003a9866e69d3361594 MD = e35b64497f34c095a1135e65b6d417d69e8587fcb53cd700d10cb8a1c0ffdd97144b6cd1221b25169ad42d1826d10bac Len = 11320 Msg = 542c8de3e29172313cf43085df75b41fd77a1eb8c9a4da1637020cdf008432ab26b2055cd49d9fb2a016e31a0d1f1ac7549fda04645a2cc9271fed8c07437559b14f772518f62860bd4aa4c92f2f8d86cd0ff574d3cf7ebc9502bfa7055deab37b6bace6b68255621ef6393a4b8c5684cb3237af20ed181709124ad703b9d9de0e6f6d46b42b6ee148846b146c20bde8d570675e539a41030bb756c5073f8a05f2c180ed1cd8ba04c55a02ff97d209db74314f2872c042a82459aa181cd7444eadcbad84f67182f41be2c6a5d68a84842fddb5b68746632ddb600f79476951e1c9f4beb348dd0ed8d5827fab3030740c8edc62af9914ecbab9354d9092ddf7e7cea379211c06a6d978a4f4bcaead229a19961ebcb1122579453e2c04041b7f884242a87779d3921f8eafee7e56e7d6575974b085d628569007e4747ea50c31ebaf38115c682c19d19f0b359932c7d86ad5dce2b1103ec627878feca57e9654399ced7d79eff98517311f91b64a356ffc15377ae9673cbe674ea85d2296a2329992c9b37619221c1ace55ca7da41ae435a2ee41d4e40a8677e3958f9cf619113418347dfaeb902702fd14a7954a5c7f3c0367ff1b8e906680cec04abca4e13a32b696a1ad6f29edf747c5f1a744e5883ac00c7c656eb7a6aa988f562aaae4f5baf457e838acd6b82032ce705a989b475662447f5b8a658d1cc86c7a8d100889f45bdf1a43aa80cea54898ec57506804b97076d2a5ec8364ffe6be7f8ddc3740097296ff75720d78af118b2d457433068a720c3bea9cfa737a7aed2ed318586021c1e55e770b67fe66140ffacd0ae496f2f16d83d2a0b002b60d614d07cb533263d13201f07d74a8f1d98d1d971c62fc1974017207028f59db2681a4d1fe10fef829e6ae89d11ebe78e86b5c4ab19780268330cf2eca7ec0104eb7fdd7b8760c08526a2eea0e4b8725ca13808ed26a6a42a66264f2fe647e7d0c6b1ec4016fa3bad22549ba3ce54c1e06eb510d86c3019466fff7f8a82bdc4be803d03ee1e30c36337ec6a264d3558b245d966cd58a8e454a6f51ebcfba22a26ae8dbed61b890a5fcdf6f498cfdea95acd01956c7a7597cdb1a3a717cf998a91b82077b88d7752fb6af0a58bf4b536427aca0716503aa629f697932b6d0858982391c8d5f2803fbe855607602a5d71f1d58f465b684c91f20c2d8d8852733692876e1ceec9384321a3b394c5ff3c0ee143edddbc213fddae68e1d08f1e6e872939f1fe339013efbd5c85d81dd1d54fa96c5227b929990bb7736116c03f5edcc4d1e9e774e587a7f9f6493be840bdc6b2a558dec2dfcc8eb5d207cacc23c8a9ede592630318280e50377a4ab5da69f695956e4d79b26ee9220b6267037a40610ccba7fb6ec659856866959ef6fd4e71ba930f0e3e5fd49d7465fd65f6813ab4ca1a770b287eb0afab2a37833c37efaa9a44c79b9126b23e3598256215f72bf77e48ac3cc08fb1df80e8bc91e5f8d213cd21047002a57c2dee1896c5f24aa8bbc1eca3eab797c1b79228a16594de7a4fcbae5216136a86fef64dbe1c1bda15741d6cfaaf8e1584aa47709258b9576cb10e434d0843d48723e6ce07cee34416b2e9401ce5a4976f3a2946ebf5d3d20dea0d8631d10471e13f48000078f91710eace1c8747ab8be5d9a0122ac774fcf24d61fdccdae5d129a3929a3484bda1889e3438c62ff3618d2b5478eb480d26ae6d84005ab05850c4e34ed3109cb192024fa44b56192cc6c981bed199f21cfd96ccec3487ebec9f4790e571210b6557027196cab39db80a2f8f37b2a34014d04fee1310c0d8031b261eeecae25b597f0da6a42d6b2815ca23a657a2b3cc954d3e43810b821f4c42f4efd366e1270e68885124e9f942d6854a69b71838020ed2e65fdebb682c18a518a63bcb89e8e4a206f3c186ca686aba184bae89ac5af1efdcb55476df8908b015c4706f590b8cba0e10e29a6b1352d6f1bed67d8d61df1285c MD = 5a39dfdea913fcbcc5549e23b310c7ad76f392fdbea1ac188d529062b9961a2e32cef378f951c4d29eac03b3fed8e662 Len = 12112 Msg = ed665d3f73bfd785c59814b4ca1737b2e0eac248b7cf08cc665ae6fdb8f3ae2ec71e64a7cdff2d48361d046ffa66af1c2973f153c80e02c2dbf13ca4c3d117e5ca9b5787fdfe84443a299b7589d60332af87c2bb010ff11677556dfa0155d0ec1e67a0a8aac4c6c2f746418d206f1b3c9aad9c470cdcbf11610de2c71b86c18bea0aa5d27d5ad90a98fb5e81673adf82126ee7c1917d52f8c2a102d3b86cd30a560ad0cc1dc7a76443d05a17053e384b3e500cef37f89416c19a34e58110ecb08cf1886034131618214e9d18a3830ce146dd7199a7576bb2877fe2c71e79f5c6b14634546747106d59fc8f4be812458a539d7f8989a2c1133bd8733f36afd794f0923e7160697cac1363997a7df2c98f8d179e8684df7d82062e4f1671bb78626f5c0d7fc784411e7909216b092b82381bd33757401887471007de1479a4c278562c0946439d4908b07891e735c656cc2559b0c56654c7aa80ee8700f3729c1dce8a9a8d7dbe7bb5e3384fb6a9ca2f95d53273989e9c25f37e68b5a38a2eed9bffff281e1deebf6c38cfc5a00c3ff4d951e5e6988ff7896934ffcdc6e4df9f3810121bbfca36fd74d7c7596d062e8de1c1fa738ce26ddb55c83a382fa98d993d294cdb392c9c1d16e9a875e4419ee1f54ef9813e3e0603ff62a15ea78240c3f27434d054ec2b089a96f880cf6297da5c206b77744ccbe9af2bbda7f51701059e165263d7b2e8a4480541e2f414215f605ed8bff7b4c375ad4a157ce30fd7478a3a2efa8c25ddda675f0a021bfd45594730c6c08f1df69040e832433712cb71ff0651ff39ee119341cbdc4a0ec50aae5abfbfe2032f6d20b22d9a66bacae46b43a242d8a7b58cb51c723e2194157947e1334a8d1d932f0e4940d74b34dc2a1d9e3789ef9e215729417cb8ef7495980c24b4f029a3f144434e4a715c6df3a5705aedafaae6da79d8f810d21d77ec71e56a68371e5ef0b5a60872eeff2cb55e4abeeb3b734689faa98956151165c20cbbfd7aaad51639891ec1e1d89e3bca5c95115ab5b187d6e3833b77083406c16f742310ceb49374c895bfbeb6a060dba7379c61a5cb71683b50579b34ee218fa4fa25532d249c487bf24c32116d6490481aa729942bcce80af725e91fa880d4b3334b6a4e8efb5da91dae65706d0e90462479da0a3860fd5860ed8a53c8e939a209dc7db958765c5afd2d7e5b082884a93f5c9b8d5af5502e73f7a658b825657b6322b6f7ecd6ed967c13a65aa678137a529694a7f9528893188a64b4defc024628633b8fb0e2b76681a604f6afc8e6c04470eedf7d404e9037f0ecf1a435b50942e834090e6463d1f530c1b68bdea483ff32d1bd4f874a2cb86f6796719a28ce98f9caee6d2298e0bef70423a282f6cb6a2464cad5ef236f8350fd2cacf1039c12dd24c434e6ff9ac544f6c35c7e84a16d8ed08d7840826180dbd53abf03ed7c98de6c16cd764007f25ebe212299f50cf0b73c8fa0410e0b9857184811988f741242c7699f9a022f2e8f86c25a9af215dbe8d156b6bb7074b10eeddf0a78918f68525f47121ced1b5f1d73306e4a22c31669b76c20764fa4b4467d86126a9ad283565c378ec3aad26e51aff2c4712e1e8a821559483a54a48a48efc5913752474996e6c27b56e15c44736290c6d7bd2e1d7b13a394cf277b195c6c24efa763f5a359236e419e39c2c7cbb392da4378fcb89bdbd46efc6f314bc91c2c948272e479e93ec648635b0be1a0cb816a7e068f442b92733d8ad4cf07d92664e9902a1db48c5d4ff96cef3f793cd2e5dd5111efa77363096942005c34d2b354549930a73a8ba993ba839c6777e5ef449b813e25cbbb741d5ae998e0bcfdea853e642f8af52e4919f46e0a89c2e44a280cd93738964bed37774a476486a2f47e10bacdcfccbc656910f6e2b044810c189820a430f26af7e02a2cb3ee7a09f8c73063b27da67f270c74e3cce1e4035d9da71d2c16c662ba9edb56848980791fe90827879c6dbdb5898afd6f268ab4643ea19978f1fa795dfcf091633a803c916bfecef43508bf3768b90c74861eda4a83ee5c30c975f8087fd2a5f80b629875d57c1fa04e5fcdd63268d7820a89be36f4f62efba62127e5b1e95aea030ed6f3b0 MD = c4d5e18acd6e425d4a1f03c23d7a48ccf313c4f987b9a1f4b4e3688c5ee4d7a97a3dd31fca20e8cf159e1feeb0df4e65 Len = 12904 Msg = 8c9eabe871c6e9511194b48ebf9e9b031d8df7b9e1cecbb2d88bef792bda6efce1342c9ea528cc89c950d0418c85027f984f133ccf9f830c47c1c0ad938c92e045dcb677b042cab0f3f969c1331c96b427175e75da5cb92aac57b2c29aa3c7d1c07e939b1c7aaa6e9576c5363ccd1f4bd1cd1e8d896b36b30e340be0c887d5775b020931713a366db9af2cc730ff64eb9f599cac6435c2507642132ea4a0847c1d50616235e93452668ce89c95192e3d97a320f8f42224a9eb6814d5b6579c850f50e355f2ee6dc8a5f540def68545e9c494f29cc09b2665758e54fd8612e43d37ebd6332fb3a9757dd27bb5d8aa71962b1259be51068e2c1c9c1ccc9d3a25499f078423759faf01f60be248c5f07aecd6069f872dcc25a8e97bb46d823827544f8d334e4b1a49151888bdc044bf2795cc590a1ede56b37fe3116406bd72b2044d662cdb398c3d59ec325444de7f413615f1e3abec0b0059134774c0d7528e01a378b7f3c75d547479efeefd1998907abab87158dd52d3df7f062bc2573f82f459ad1bbe7ef6560fc7a8d4138073dc06c295fe4b3b95f6b83134d335c5a1588575eca263e5bd0bd1df464fad9876ed85356fd0ac8d3b2f8d31bab240aadfd65b011c920b851b3b63c8afa5f3eb0a8b9d1b3030a45cac47068581100c8c63c51f042734dde479ad6c8acd1e0e00987df67dbf665b2f4f06ca377037c0f694ec7887f4d0028c3d2a952e8604265f868c396204baf88e8e33824f6e6e856dda150f916baea105d17a86bbc49d62913d800ed3e774a301d098d5d365fc837b9d068b2a7415e3d59b65e6396e33eb1d26211cd750db86117efb6ccd3c2ae1a74588965af74ff08605b35db16c0ce98ba8360c762738c645fe25ee44db40c8793a63d52adca2efa0752b952aa67083642a8985b854d38e26b9de04412a865f7ae55ff2a10b5708a9559633ac03a9e12e16e030a6bff4043b17ed56cb1043cf31ac4495c86db5652b0cbce23f6efe2c74d304b54751e3500c811c8bea78c13f27f8d965a5e8062bad026548ecccb68cbbc9bdbba4f0e79b215d314ca64746d8e232e70b43659085b89f590dba061a288d60d2eac3854a0d0314f54008661bc1ecc0362ea7cd9d99d34b5fdab204722971000decaef952cd390f301017bd8823cd0c8e77db06738f866e4157daae06b6f01134666d3248044bb5aa63dc34d4260b7cb78ee6fa5a905970c52b3cec1df891fb1003061a74d9c26d2ae25db449f1307a781ad08f9cc4d5b9b4fee0a70017dc26696883981d7524a17a35a4232dadc46d9bc4a1af805281b1d57accc5f83a59fb0740eb938cfffcb86003b96bc9814dbde63362414d62e5c1f2450a304b8991e0b13147f50aa0cf1aa5f4a272659655d1220f1b2d4c1e8a4fd107a2ce412d0b3e31e39ea5dd80272e11b16922491463131702d25bc5acf7c53b699a89244e4f7e4d00f88b4dc68b5e6be21661bc2200ea8cb291b3ff34b489f812fc483a13e606ce2d5e8fa49b84127d2faf1907e8b2be4ac75f1c44df4a05d0acd0f3cda557407b14d699282699b00d3e3e31738f04f81aea4581dad4409f8bdc1c71232c2a921e5d6b91239052a1e4baca91463f7bfec2c349c70a3c1ec1f04ceaac84cfe8667db0225fdb00374dca495c21c81fa1390af976d71c3f6dd2c9a4418b3ab6182362b305eb999fd11c8693fbc94358fd11bc35d1995804b43adc8b2af68c0a423193111b1da494a777e241af71fd1117ef9e1e64f506b47b60f2aaabd5c1f3eef8d8706cde460841c4a4fb80013f7378397a5d36d46d764baed2a9cf102298a5e0fb790114c523286c9568776151a6a75916994f1cd673aa8b462f9b90f722ee51c2d3e1a96a0ce3d87d319b797bd12cb53a7bb8b789d3235f14e4193b88b852b3f72614837decfa6f24fef531051d90b7b0aa788bcebd3b93057250fa1c83586e601ca38c46eaf69851768b7236b15ac53fcf9782ed597c8de17e48b6fcab88eac65b95aa0c2f5ebdce41672258b61249ae921e832dd06db670b30a5571576a8ff08bf2c719e3ba456108912bb15341aac69a1475d84a967679b69dc1c1af87c6a855c3cab32c9398d3730f738ab16e504f90814234ee8036c63209e034dc66f5b4610f9b23356f1eeb29ebe42af721a3111b6dd18ae5b25c1dcd579c14068f86dd56de22b124d93f73d32d65db4ee20bd3e4e10a2157b452472f8edba7548bdfebdc3847a42256633118dbdde3de3af05f93e4d5436b0f7e0c01b68737efe1 MD = fbaea1239fb68417d5fc143c0a2386ea75d5ef93affb80108e6faeda4eaab7b30ad620538ab0589a91af34b78f06dcdd Len = 13696 Msg = 98607bc257cf734d99999d757454cc0e781d32d38425d308de6d395d83cd6a16bc3b1769f24a1627c3f1139f568e82c0eb2ad77db6fffa76ed37f5d420f7f074c99c604924457bfb4091efd456aad3dd5b82de44d15cd701e28f4cb9af8687e3e60cbe2992c68a1138019adc1fafa9afefabadf07e4552f3e6faa6d6db8316a93b1299d2e7d82bb0d2ca7d7f57a5eb7cd02fae4964c0539220026bf149f5850ff136590dc98046223673ff85a794818d259648162cd8c228b92e04d3a4e4bc5d300066a0e1c8c3ad8d8487b5b685522a1766e2217d9287fbd806d7449259a2db1ff92953d6b78a9aff867fd82d7f489ace29e63000f88a53a6134d0cbb5a21d1e7a808f050558431b3004eb6b38b4a277166bb0c5c11b47a4bdccff2c9f22086af956c3df9ab97b9d27a5c17f1b0411728a6c97d3ae5ebb7eeeac3bf61268843a049be0476c0ac7c837c11c38ef613b31d70784b427d1851b7c3923b2d003f50e24b640b729dacc0ef8fd5813365a943754c303d1be02491cff1a52ed5872ef59c23c81b93487dce3d3a101b8806eb0f5bc2591c6e16f5bf5efc636001c33d7af75a50fb81cb09ee96062a5734e0c15ef55b5bb0e22875238b6a339958bd55261a776675e52e3667227a8bfee0fb147a6b9e9ec1201d8a047fc57fa0827c5c422d02714f6777ee83081e9bd83360caa9e6148b17cffd1eac6294ae3e28083c165a84d952aeb01888717ac3acd616cd348e43887998d118615b60283bf26adbeac784054663e09cbf84176944702503638ab5feb123a0606c92b0545f87a923069c8a5ff32d1062706a7cf766aa96567d03f256851772de15300c9c7190cdfab1021e4e20b54751e34a31d3db2c70adcc2080f6be1d4f7aa35dfc673bb4df4a3521c93a97a38d535f4dbf676a9dbbef960ae94824dc401c6040091e839ce6fad820128b1e9eea4f2e9bad19dda6800624e8b5b27efd4cac9202ba2712efeaf2e32782aa7e4e672e965b8353fbeec6d9bee36a9e96277c1282ca98ebb056f41a9e609ffd7f5c0bd6e0b6ca7c8b1e9550ab2392733203d73678c12ad224790a5a50f1f4ede870df3053d309fb56ddf55335cfb4991b386500bb0ff84538ff379a420206e38331e92439dbc83a24d4efcaa20f5978196f2e5995db8aaab29180c2bdbc5f451648339bd8f58fa0bcaa8a9d3b0d0878f3503b274c4d696a5bd6efba0746867c6a5cc57b7a4ae795e808cfb548ee490173829354298f1ceefb778b6a68c903f14716a5ae650157816e96c4f811dda47b5fae3ec674c62b9d5a1b5cba2a6d5f0b741edd1ae14368cd17fb734fdd00a24e807b4567751d1fde3f6b6b9394592131bb1b75a93838a0dfabe0e4a2f67fcae29e92af1d74ba7e1b740ebfdbedb6d1cde2b67342b0078a20f2ec1edaa283a59f819a84d2b8c5d3bbbfad607c7eabf746b296e1cc93d9abf8b4c829dd2a34b9eef03ccc6d8a67a326e9f0575c8f611c04f363c63127d58dd0b81b0d95d6b99135b42090d632c778c3ba7eab656700c76f6dc72b58b524b70ec78ed2e9ed3bb2dd95edd8f5f80fd9fcf900647d50af81efe768172984edb11ca9c981c0b9e1a64f5b4caab223644f38701d8b8e9096d1ec2bee928cde5904602673220480d4f4f2cee410f5fdf061e0e57e277f70de3fceff02a569099037440534bb9c8b3b242db65e11a6ccdb975a21cb403838af53fd2c4c56a84eb9d22e10b65670223fbe6ada61b5add94d790fecabdfa1303096e17a73af31f5fc5d880d9efa688c084b10039605f26c6d90670dc60aa2a08a8fe2b020b8ec468261b9c597b06c13bd5387f9a4085dcd6363cb4ec5cc23cfe4c76998fa78c28973662900477f64fd865c368435c7d743587aa175502a0c0667c4dcf8aaf79905f7f24086566f38938cf0876cee484617745e524b0e2e458d3b10a599d73d5b03348f661e6d88d01df796e17879959492de964798a8dfb6ac87332a432a53eecb55c4039234d314e3efd7ac727eb6a7f9bfaae724c54548ab73b3d5bd4a403ca580197fa85257ed2c9b395120a4b169973e2399b60e69e1d1291a0dd1e10c2bd9de174229701c41422346364a9490c0b38488c7182b526a67ceef394594c0a5ae9645b4dc352bfa6bb086c4baf65b9694b861d810c308ccb58dbbc3e20d62916dd02c3e8b4a8bfef06a8063377118d283033734677e94ed038c051270f4fdd65fb65246fc5644371978bc7c88add15cc88d9043e506fdb799f3558eb7f0965ec96d4136f8025f8b2d02c27576538d1cab7df76c51004b11beeb339f7eaa3710f620817447f6e3e476321bb8c90b55fa74fbf11a741787e2bc9c28ad8fcae7d42df5986ab1d9d8293a2e4eab497c30de6a3108b217f1b814d92dbb20b0f7af92b514107efe534742c2 MD = 916864ec799cc0ccac4b6a806a8c02ac72fa2c3c9abce6231ae7a240d9f2f26b819a711de5480aa334638cae55cbe6f5 Len = 14488 Msg = 2bac4a034d7a81b57495ca507b34097d79ea19f74ee305ed7c6b7ba839af7d6dc2c85aa5f1f5dd3b1228c446f3c573e83aa6ea75fb62f5d88acfa2338ec5f8c65725e612721a7a3e7a9f54b930425921ce27ac64994fda25b61a54613e0b235295ccd793f772c086530161f35d3322f1df75450a4f331b9aa7557878710a64d821c41370a88418da4657d53aa020362012999fb0469522000688f6c14e482422a61584f1aed8e803fba897d72192fd76119aa09da6fd561e7ab9b684fe4fccf6cac8115e31f699ca19fc8f120911dfbb8480321b96f31fbeacf29f09a9a7c21d35e4a1fe586794f5495ca532802344b612543c703e00e5a6433a9b9775d6705f90711e1a4cb2404c32cec181ad529430641da5e5c7ab109fe89a92778d663c8383786ffa355f04997d5dcb45b92537f122e357c2597d087143186af217df9053b5ff7ce63af64aa2d10eabc7cc2495c1f3ae394f1bfd36e4fbbf0c4e3cc7d395cf112d2683007930d7eb494f0cd816687f8733d436b300c0b99460d323a86d1278b36a013905f80b36fb8d24a4c823ad6f752d98d227cfcc24a14ecbf509c69259ef1bc1848b31fb97466090ba7d22596b810fe415e20cd1e5edbf7cd97346dd1acc28ac8b1c8bc8a2d5a8d9777d7d341ab2c1002a6b1d97a380992ff86d55ba6253790b773f6e39feaf4f4802529a0625102c34374a6ce60763c62d797f5bf2d98af6256f7d421854dc3b258483e39733a336c865085f86b99d2cbb8531c04d287b88449c5c702b4b6556b82499beafed74c803db2c603e6036b524440cec93f72e15ae26665e3b8c5186480b1b9515fb8acb2ec23ed6d8a43748aedd97478ceda986ac3423750fbea8b51f6091cf9204ed259141c6291a2fa7cca3795a3a00b3f6c486ee1a1d718a73ca834c84d4eeb0a6c074814dc0cda68e2b493fde2bb6f11db6847dd3bf2798b9adbdf77b0cf1a9bc821fa95a05b9b4f44ce958aa83774e2443ee09d6c1fa8f82461588fedf62943755d9e2765fa5ffe217caeb47ab0b7215550bb9ac8db218d67dd22795b50b1c2020ec5428365a2f5f7436213b093a06f7d324b6dc8917dabe3a3efec9f6b2e77ecb9e26f8f3a1ed744b73221007ccb2d3a48128ee1ff07e41659f32210a209d593d38816efc40e12884ca154d0c881db0b26a366ab607ab68e63eee26591de7b960018c13baffb2830783227b7f37f096e42708d9b5220a3aa563585e4c716da71b43706e95a8088dbce67321caa1d28e22ffc7c3860a42bf8a56985349e3d62a56445408f6018d4f8c3b2dc7548e6c9e543c9bae9087fcff7e5ed78db93cca4bf94e616743d4e7d05dc97bf685c666d16224ab243b61e00367c43d930544f311eda7be15e6e7be1819d98334c510672c350020acef5f95d22fd1f1ec93c3f6841897959a4502bb30a6b36d0c7c3617b9b31721cf144ac474bcca1c23cd817eac63680b7ccaef851fee9f620312fe1f7fc5b3d71312ea14f2f8fae5bd1a453192b6604a45db75c5edd7e58aa3ef312786541a6a0352072e53c9a87544e1d9b73dfac97a7ce25b23a34bcc0c737c97d6d7469501243a69b99f191bf3408c03b9b515e9c2aa466a4648319d10fb1ff7d579856cc40033d75edecf9c8837828cdf03f1094b566f6ad7e470a1c0c4411acb74f7e7dc1ea61bc519d3735cb32b3cd02e75703d08c5237d80f21d42554bc961d1864e7106f9fb95580de8963befda353e8868bf49b05ce1229e5cbe36a3ca3f9719e8aa41964077a165435f583630b53c1437f99f98dfabd55ca55df0b3e50cce97feb056e3b212fec3cbde906804f92f00261495e572829e143f460ae2e4717eead8abcd4a180f760fc93c6eed1fa81f347d38b0ffde0e87ae73a30c978d15b0f9bec22f313b15113185a0772d496b1497848c7a4eeaf8971389997f3caaa16cacf81d0202e4cdd8114733359149ea171383397a3b60e8d629c952ea3801bcb8ebcde5d124d9ded297571c2f7fe9cc2f8fc166382c06854dd97af6d5f35b0f9e9e874221ffe3f208acfc84ed60efba65f4873c3d8aa678030ce6acc8d57f4125ad6c5b7cfbc9ae80368093f89d245bc0281de310be066800a8539d4c4637fb5500c559698055bc441e2970d79c50584814cb82392eeffe4d960af1e8ae49e53780d96371f64dc45c4d404412c73b5805a0d942414428e2f1bf53cf25757ea6d213f2a21ac57a6dceaa0c363285ac0400b58e4aaf677bbbf40a755f8a039ee72fa2563eef55a460a41cd76fbe3d6d04403933c30bfeae325f5ebacb9fc0714f54164e5e750f9245e68de7173e5944ffcd1610d4de738aee39a56838ec15be874b55222a36590ec39ae486553a40fa9db0326da6ae2dd7988ac6c8d0fa684f361c491acbb99cde82ca09fa513b5a5787f077926006945dd75ba922bb5022ea05cdd87e698641cb2b7de38b34c80f226595cbc62b6b10e354b336be2176ac589c68ec952b26ae9d66bc5c83266ac725dea818532f670933b69a55e329f56c61a2f46ca83a204d1cda8e5b284ea8ea269b2f45 MD = 5077b3d65d16446eeb06f10c73ee1128e29060ab1ca255c6cfec53af04edc2a665bc5dafa937164bed9d01d0316f0ffa Len = 15280 Msg = 03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b895505fdd1160e184d811fce7d3f60acb3faa474a5eb628d66cb4ee7bd5b57c64a5e165a1405d4a28537263190aeb5b4684be61f284ef7cd969b21e7160d0fd70d84b1e8e3645328cca1e267502ddf624ded1c206a4782321d59fbf555fcb1be214d8b12b5be043ba265e6e832493826d3729910e2817c6b69ac4f8b03c6f7fc443ce470018f523b94d7a63ccd6d7a829760ff79377950da19e69f2095e84d11d4c760796d34e7a9129ba2cd7816f106183cb1c1cf9b99fe9cbd6d5e82dd2b8f617181a74f5b1f14ba165f22c8e24611d46a52731164d25960752c8d51120dd568cfca723e7e72fed9cc5dc5463be4363a7e5405a361746b13c26f3597237e8459369d72910b8dd82042013d66a05603d8ed29120c1e1ab41519b7ffbb8e080cc14a9d210d7eba30fc0bfbe3a0ac15db2e3b53f0a1f71fb4e2ef794444be14df1f702bf5fa64a289eb8ea0609aab9e5ca8ed675a1b88fdfe1bb8259bb9402f9be24bdc69fe49b1536d4e913cab4b69e8e777d596bf505ff00e086f7e8f90d293b83211157f8a711e0fc030c058f80300586f213f23c9a02b685499653e3c8876ffd78c50f4c36c5a318811943a3df4438a47cccbef615910892145c85bbfdbb6278080d504710d98710ab640a589b822db765ac558c3f5300ef2f7405e7726d1cdd1b0fa051fcf494ccc912e5167b91eea8f3da4164e0f1a584e2045bd1f044a615f7f38ad2c3bed334234e5945481a83606f7f0ae8c012ff39753510df3ee80707e4e293322de14b31013ef04dcac4f2c621c2367fa65f17f72f2eab7b2602479a2c0445da020204a9aa0a3196c93845c150cc4f905b7ff4a45a18b40c6e3a6fb8168027300acc078667dba4880d1d843b45c4dd85a81b9e2a3c1ab3fadf378548e97ec19d0de45bae80d9d28c5d1cb51b49d366c553db1e6f1d5d31ac41a29431ee289c8ad2f5080b3d2b420883dde249a22174b824667b5d4708b68c5c22a15d6da43f5d22a51783e5fa7c66450712ac98d58ec6e565bddb0144c801f760b6b3ad1a3280c59c8f00c26d090c6c424e2e75183d575c7fedd09239f173dc03da1bf8b3fe59838378691aad7064c0389db67f1107d3525d1226430eb84ad1b4167d94962a522402dba636e139d4088e072d00e977a290a734c45ceca5ef9f1b71c1caed3ed16fc0bf9e5e32edc60eef94793ec7122cdb045b9225fa41c80edff3d0e2ddc3402d662c3bdac813a198014d8382d462dafe1c9078e561133ee5a9a49024904006269b2a64f1ca33cd6f6c39331337ee12bf98da5ee648a4baee208dead82e3d8b2208c201ec60d6b25bd960723b193e3de820422c6ed87aa2efedb5c645de4237e955fbfb13b483b823f0cb2640a2dbc43f5bcfcac6381f5fb1b7240db4c9d8724229de38aeebc247915881386bf94c0d8df2892036921b5afc27e3a56d1786a4f72c71a105301bc76bba8a9104471982998c7817050bf4fa97e5f978b8efd535ce07be1e60a917a07abdef1753b3cb8a2dd2a5957dcd34a64c986e6ddd794c8d9062cd98067e3d3a860ab7b49f66e98c0f6c1783e40062c8e1e84b6b23df731405e4a4f540d815fd5748ea4f3288fbf20801d6ca83cb07c71f7f975cd446d233f4364d1f56df2852b42091d052408923e039eb50a257aa0bce025a2736d8f2502600d0fc90bafd9f663ab31e48b61c875fbe5dff89ccd3fcb61c9cb492bd5ad564e9337635921d4d363d58235c133b864d3534be7f510b029e7366eb2f1d9228749980748f8e0ec5e9d288c6d57f6f8871497974cd0ed88550afbfb4571f23b31eb9bfdde4d75a6e4aa04ceffd213ff594a0330bbc2cc5ed9279b0f750eb94dc2cf1f69b7d9488af2050ab861a2233357ee26a6a92d357a22d79409c63aa6d0d64e82f95a2ee21f23289ae7475a9d3b0f7b82679972a180ce956778bd88437ad904771b39b0dac9e49f45c9f56dfa8cfc7ca7020155a8f938db85dacf7a0782476b5c5ddaf18b11b2d38bdf004ec39f8b5bf4f47528a44a0e349fbe70727bbd9dfdb31fb2737b9d0a6fed94fc9f70e948b3fccd697e3c099b1ae5825524085369260c0f54b944b277ceeb9a5eb28b00c0ff4eeb52c8d8ae8c0927c4c1e1460a259ee77b36354ef8776af64d8b3a8a6c60a83bdcd59af2af3d89b7046b4cbd385fa2a601eb7a22d585eeae2d2699f782c4397410466722924c0713bf95c8c67483ebe821c8fa48e03fa463c795535afa584d683439afd0ee242bde54f5e7fa251ed52e596328299ee136c79b7bf90d29893e88a733f7961942427772f01cd0f09cf8d9275e965d7827003a173eedb696f39765e7a9b0daba42f56f8808e9e33d8ab18909ffc75ce27dbb4bd952b3cfd913e280842f6e272792bf3702c4d1998274b9ae7feb3d908461a27d304bedb15666aa58fb19a1f417be0a5e81a8667c55c75bca07955ba0d45f603eeaaefe139568596fbb1ceed9d121615663281af42e1f226c2f72c3f638e37f1136e0676f1c956a25529d97410a694ebf55c851a981c8a7f55627e919487a5984c384ac1c627a672a40004db219f23ce9a80dcd04e77047062a194d7289a07a1a0f004eb3fd83dadf020974b59658b665f86ccf8ec582aa0ef9cb63aa52e27b3187f7c1b MD = 8f4d27faba49fe0bffa92f430faccd1990f9b745442d455a5c64eb39edbe7c9d95749a644ca8eeab63ad183cbc739c12 Len = 16072 Msg = d4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854192d3dd79bc74771e8d298687eda59d75df716a424590bb377259e59a3802c1485e80879a8cbc16dad52a498f07e82176877b471cf215bcd03efec62adfced2e2058f9eb849f0a3f33d1f833635d3ce6067ffa83eecc3f70350c87c8dc47820cb2231715776daa4d42f59a1f209f0eacfeb7f2c0c9853c04d32174757989731403f16bdfcb5a2701a26694466f6b81d119c6a311a772dcf1a6d9bc4fcbe949b0da6bfb32c6900bc21acdee8e97e91cbd1f55155ed2bba69f76d968401c908b470038d1f4b237ddf773d2aee1e24367d9d80b5190908922770bcc802fb2a6c1403e01f50fd576260a751cde26969eea8b0b915e8d2a04d9df2c580a03d75273055a6e6d6978766d62e8548545fc252e3c828e443fe8535240a32510a6d0bc2afd1c2643ece25f3a679421ac255cfdba5503ab0c8d119f150336dc99ffe80d6d904ed27f7f5d581681412c5ab0fe51163c5790bd5eef0fab8eae25aef6666dc526b61927092f898718b61d97cd2947cb5b46e45f9cc8cc9b4bd2a756739103b9271ea44574a11b1794bc9b6b6427076019974ffb2ee5fd6da06c0b995eb3f8d1fb4c1be0a7fb364e5d1b4edf5e3eba5ddd147b97fc8ecbaaf742f87f9f1273950b0824018a8501b3db9bdffaa1b7884b11830d3eee0a5ed9b71e17111ff69d8ebd1c6aaf0587a5ce7703f6c516da98b01cadb0f5eca3dd8248c61056c4a99e437a4e93f200484a27971d3a46a5ee1317665a0ac6de9f702e12028a5677729d3cab6848d263111647a5af5487373d20055751c3b8ac4741637d9c2e1a2198c202b6303058162a34b50782eb90b20de804575c84d33ee375acf15aa3a9a864371c056ff48b01dbcaf9275ea86700a7939bce41f5207cbb378ed606910cf61e2112feec3b740d6c019c6b0b33160753485324c9bda64f16ad939466a249f10eab6d0b71ae19202400253d5033a5b1582fb2c1bc846e9d3eff4293437c6a837bfab493c4f584234cf01c04f6511ae40071420de2f47e507956233b64c77693af396ffeaeb7bdff2cf80927c6347f8a91368b7103b3e04e10dabff5932c7608f08e27b3f79cca9a0c4175108584db8a54a51453e6699c814bb29d27965271cc8721621c674eb5de34f2e826feeb37cc91e7651c54bfb8cf7107463b36e36fc6bc1baba0c67286b2eb34e8d1f80f9a3890230635155c3e22cc0040973b8479ded6a487a7dbb343fd7b2fff793a980cb698828004f1ea3561a2c615a56ddf95fc1fe380996fb6f6a92a0ab4868d2f962ef22c59f3b00ea6743c804ccb949cce08dd011ddf4a26a69d41ee8f60b97c3e88e7481c6919729842e2576e73776329ea5926e6df34a95cc10702197086260eacbdff4ecef5be13b5db730204dfdab08bdb786402f5e71ffdc66fd91cbcd60e82bc7879890c9a20b471fb90e694ac6ad1aa221eb0548af739c45c58cd223345f32edc240426acc528ea17a1805e7f5fa5104a9d521b37ec5d4bf21cec81e6bbe55952d8a60b9f0cf78ff1bc3c05fc98f05319674e10980751a158afdfa196784187031cd78219fd0aa8ae698150ca1c98bcb6060efc554ffd0eb799104aec85f0fe1678ff55c29f497d7930b80891f387934902f8a616cd4adc3760e5448fe9d906b474864a44fa9c55789a47f5fb26a320fce176d882871e51ff8ec85629ace3e90599d52a4416ec7ad32e97dfaebcd6aaf52def58418763b738aa204a5fd7f8ed306e52bc6dfc1f32b374108e52bd067b5c6dcbeffcd5ff54093d55e6db70ff5c5e7c66ca64b31fc640f51aca90321dd95a2a71655b77dc719bcecff34582df7cb649791ad443d27ea1381e5a1022020d17eb4b820577e05516e5f53844128296615ff47663b522a1ffc6820779959d5fba38c00ea3dcf54aa10b317f812acff186463da4b910f6798125b0997393d6166b9938d0dcaf029664c6ea8ea4d1aed74e84be6c7f5c354c50df0ed8a825957c54971b9159f7ee8288a1892e5410078ee1a3de985da1c963937c068bbd52c2d79ab9d219c1bca3563521742739eec25f662b04eefae899067382ff7c5d2345706888c330bd07085a92d01441fc73c89205a29a38ff388d7c187b61712e9e068fe48b579ef5df05d6c835d14445a7ff6fe892073c139a8d0fa9ee9333d8cdee7c364af62a104c8211fed814f7bb93503e3482b3c3df1581054e64ff8a04b8e37e874d099eb75667545d424323073ea34614fb06940bb151a731640c3d5a66cedeff1df6c091069ce70dfac890d1b0e1d0ae8468793e76e63d7776221681df98e5c541275947630a1235880906c0f2f0242aa54138206d260f4b22a9db222b27d8024102308075971dfe75704d7c0bba8ab1e6f99a5a9dfa64d3f10955e4536502dda6f10fe5452c4f8f48632cae03264a6bd0f867940f4a86376aab4c705e39aa7ff65bbc1ddab2f111894c6dfee31bab7feaa66775c9ffbba016f5886d548a170fbca800d13d0f4babc192d613b283f615bc6c61a6d5ff4c367b50d0843d4292b67d3fa3a9742da586779d309678457457cfb01fcf3b3481202325ed5d2248639cc38a6d4c89f247c933d5422e3d496a6baadb67970185a18796daa89f0a84d2e815f026638348789d7da2d6840a772379d65602a631d9f6925ad9c7f2fede27c3fcd995956b16822ade6cb23fe6b7e6aad988b8a5d21ac66af9 MD = cb7a6f63e6186009b6857157690ead10a5323917ef6035d41bc71c224b5bdb0ddacbdc2a59e6ad2b3731678b1848ae66 Len = 16864 Msg = e478a0f1531e1a79150904fd08f340a34bcd0693f4a836fe01d5ec5f924b5500554ac2c0413efb1587e6d64dc5b508197d793a4bc73a60df42654638502a6bad83221344523598bd11bb01d320e1d5be624e32fcf00719510f900c0d6055db8d5748bb04eeca987c9bcfac177f3d519be096132dd9d70a5d50a0676329944ca8b903e1897ec7a4570d6b00a24b9322b7e0970867e972da0aeddb7ec413b16707929cad5968f263584fd725fbeda9f01a4b9b3631889f3261cf8a7ab78672d3b1c85b48fe16137e86495b42aacb4764cd07e8c8131e28ba68dcf482c5eaa138ae4588da00eef49ce9e43f7f384f3725d7fec6e49513d31929fd63bf74a7044007ef6b8ae55a5c668a06ca052ce040dc40167fb340d069f8ac1b1d584f256491c3b04c8137c11283709845fc0ee5293111395a5c9bbbb1fef71c6b76dbcd88d3ea6f72e77d8bdf9ca383f88c67c8bbcb514e9e072f3d75d414ea9541a2053aaf851426e3401f8b592cad2bdbbdf0be53083d94de82bf7b210b6be3e02b3640cc9b86b09d07e7de61120026149bc5fa703eee84061ea78c8ee2899d7cfec963d434af583e5a4aa05d5d63305d86af36cbfc48b5aa8b5e70c3a32a0a3ca4246b6c587666eec1b098f416bd93de08163c0c493571f04f4def6756387349a4b1203e10c321d4c5818fcf44f895c1a862d2da2e9dfe00f4dbd122019a20ca86d74af2637ed219ed264d96effb7f2beffbc1ddb266a503026fdd9eae3859e8d3fdb0305a90c1e4c2059af01fae9946634ad0bedd79ae21ff73dc8064fa66cb128d1b9ffcdf365ecb873e85ddf92a3a8eb5c925b7be6181754e97732cc88e9acbee53e7515479af901400fe30c47c2ff8a572b9491d064ceb68d31d0d8a1b7e868820b161d7d1fe9915a90321f7d54c278395239a7fe4a9ea295b260f28539eccc34aa5355188736ff0013bb77a7eb9a5b5f80bb2ca44c1f9f9f6373a8a7f232407986ad4a8e438990fd04ffa35bf9ffaa564179ae86ebca0406bf89799e63417bcd3a946c62e729fd8dee6f211df26acb9a0f259bfaac1676683102d3bd2fa2c4ac3099491ad4c0ab5f3a9a8f42875455b7642f73940f8d7d306280459899ceb193033c5f3abec600dd64023c8e0b54df2acb07d3d778a77efbce725dc5443dc91e2cee1d36e7a2c4850526b73500d4ae60be3f2b2999fcf236cf697aa7b17881ba083f1183f1ff3cd298789dfc0a6c69e5b845e82ec5e68d5e0fc62ad463f761d34fafbac66023f06298984f277a74884643aca94b9f0c96fdea28fcbfde42e0164da0a762b4d975a17fd6496bf3959ffedae3dd0477d7a572f9025eee72d392df9cb235ed6258431bd8e32b2de848077c087bf1ee02c04f79b6d2cfd4d431e0bbb77504caeb48df4e1e2f52d1daf4554a36e5866ca25eeb5e9e1ade0774d650171839828fc223a094ca1b5f1c4e330ff5f0b11904e91c0fbe396ae7fad749779e59a04da089713d9c6747ae51b47cadebc05f184b49803304f313ac237e03bdadd629a4b1a3aa1cc17034df16a049a5a8105002b44613ebbf65d56915cb8d98c228364617a336b4b06f535fdf84128dc78b2476b4615f906a0c00cd46625f9f77ca66a0570abf9bc5cf23bf10e27fdca67b5cd2d01dbbd78140263739b4e2483b273b32043cad488e1a466b5f4dea08d17b59b5abedc10791ccc6456445ce1988e9147983cb783185db0be32f28d998e505bb7d8c53f7d717ec61565a876b99ed6a92e57a39b8ed398c14b4e505c7134d94f2b915e2d89c80397808911c533fd53627043c09d7e20597d16f25574afe67c38ff6bd1cebee773e7ada8c570d71dcd651646dae6da696a8c26074afddb0effbe39506549a3349660a2ab0da02d660c5928473a9d2a1591978373771e7e132b8ae32763c7c01834a8697b317dbe41d7e7ac2d29ebf78c9746362024001f5dc84404d8136f9efc14670afe792e1114f7b7ace2edf8c735444046f499cb46549e94a54abd6ac446ff468b1e2ddcae4835702f4dceeb257a5f2ebbd91da67b607420cd67a9dfba60bdecf6c294ae1e4657ba3e5616ec96c2b2b79eb6fab947e9149384161ff709b0160352d2f7cde875253fe0e50b25a4760384f672762d31574493d23f66da38a0d230a8359e60943c69a41de2f7bbd6fc1b3ccbf7da2ac212cdc8c0cac7afcf96b81dffd5d190ab05e994fd3520d9b4bdc288252c6ed7808277dc55a08a9e57fc91725f99d885b4376eb589c7cfa5c721bf100df9795df50f09749aa7f7d1573925d6d169fa663739c0afc87e4b479691dc7b8a4645e4a9224d3b95c8556d57b53cf25b2d815bbc75a72bc343dee8aa73df72a5fb1893232109d650ecee9ddfd89e6e08cdb38ecc52ebd180ffceb08930919c65013b92eb7606f0d3f90887780a12f1dd32d924ee385348099864c6bd31baa2d23ef60a89870c2f24d9ec53a9b36223e4423a48ab8fa93966f8e853cedd222bf49b902385bee33b4d72e22afb3b54ae24e620208ac0b34b9d05a27e429b90e0d4005304688252bd56ae3134f50ab137a507d1d413313a27b8a9d970a3d5ce68795685d6ba3a225d457323981f884069708b968dce4b0574becad75078f2a26deb836fc001501bc224abfe7f011ecbe98c5cb7734476dedbb852e2474a5ad594337159ebc72b0595fa3d0b102432186201607cadfc1b8b04ad28437da0742f8758068a7e9333a87dd01192740f2ef17ad8812d647ea0d596a534421902aa77ee622c4ca2eed0cc23ad0fdbd24a781cd918a511bf536f843aa95e2644f86377705acae57f5f6a382e991f2d535e7a6128c9b671e702ee6097bf8e39250b08f5b647c89e3c6e69b5479d29d21fd29a8a0ff39b950313873056f2acc1e5c2ffba68310dbf02a3350b16bf15105d2e425d359f3cc53c0fa1be1e47a007aba6b18e2d208390f88736024209cb3035fbd9a443d58149ba7d MD = 082f8540fbf6774f3858ec103c57091ce84b1479a791f87495c44b3e85518993267eb2ac0cb44e089567c562aba69709 Len = 17656 Msg = 99ed7aed36a1fad487d81b5c680a44e508bdb33d4a560a166b2f0ab7e6e99ef194041b5518acc6a47ad69787128c3c80a8856121d9f92f7cbcb312dac668c0b0eb4777ce06d185da7beb0efd1b320adc488e8dca590a4b3b40e35b7c69de3ba2e6df15c1cab8405ed23f0a264ba3b5e02f00bfa09230673d3ce56c0698f418b1cdf47d942a08ff18c7f9126a69884573a702800b4b148969fbe1cdde19525ec4e7ad38b1ef6ac8f0a242af313f88c37ff6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583 MD = 34136970bcf300d0b2553a049fb7d598acf9febaf3b79ff79264bf9a4b0b27474b6fc7c27c5b19f7242b7b8f594da916 Len = 18448 Msg = 7a93d9486444b719f5ccb8915d64b968832eee56542ed5305a956855914697487793f59e6347b21b17eac91898407a273e13fbfa07326b8130ba07530794a04ffb3f4d83f5d05d4deb378fbfb2c3864813e97791224125a6cbd10f56ae8ee7dc2d2047bfc2e6a0f6963a735050f6c3132b36cae34c60ebe65262e8262e3b553735bd4c197391635f437bdb911ddf1ad0ae855bb82e99a58beef6f98b30a4d0a73c9ec55ab0d98ed11883304cbe8873c6c45b94d86ff33bdbc614ac4d5ccf41756a4c184a20c709923dd9db47def9b73e9342dc0bb877951f0344683359c691eae64eafb16c62bceadb05424b2339cc8046c19b18b12b9b9ecc0e9606d091a64cd92cf0573cb38f231a90cf1f354f9cd403613ac8011936a24afb9c8e68366ae36a6f450436c06b842101e98dbd460e82f2a81fe351494c71a492e393cabfc4f9c29e157f0593365419e0f75b632309d13d20b33148c1c654035bd3dd9d339bd40841c7914f34dadc29b66352cef0770b09515e798f8b8d938fdfd4338a9bd9bd65e1c502bda93d647a09943aa7b53f7681c28985cdaf88766fa54f5f39fe65fc0105769af6fc49333464f2db9578495acafb9a1bab339e45cc36aa27516427d903354220a335e4937e4ce5fc41437d010f84fb04d121b947cd184f547bd6079c93f9915e6b5af8ca804bd567521dc3b276e61208e680c0c59bd5a4ae5e5aed8cdbdacb1af7756c2163e82ae2710f03b427a849ee93599a075df513fca3fbc1f2005f581dee8d28e04fac4c36461f25504b5207807fb331553cfe0308f1be6b162d11a12ff9ab144f6b1da42b785711ce0a6cb38452966cf7607adc98f1add34088760c17c0d618b6e0c59888b0bfaf768b7fb7c3b60b3334f0f005754acfe2b83918029fea161c5cd52c9117955ee88ff7127a0551186e5615e9e867a52c7ec5697fec8d2073088a73d8f89ed03ca26375ae6411cbc805a3f6ecec35aacd90b1403130aa09f6c488e25333e60861c6382edaddb1cd20e164bc8179a900b901c2e5b838be4ea6389e4925acb7e6d63d574a1e4dabff2ae8e08e30f78950f8b741819c6a91968c4d14d0d4c9d812a2ed08f0021cc808ed03619582ce9e41939c763b6330ea8aaee931a1eaf41333cdc093480fb2d091711b2df8fe67b07c9197a83c97f193d116f53ee1ef942ef1609d3f7bcc788b41bf168de02d2887a8fa8f20abbf145214cc5a83bb6910f2f6626b55b1c2d4c1c1dedec975957aea6ed76e27b16403f0fbd6fe4855e2d227e7db141d11772f39b8d65929dec0c6a2762f1b03760d25352d3ecbd5d7e141956fd37fdfc475f2bccfb071f544367278670a7efc2142e2e8530ca8716aefc503345394e3f2448312ae730d74ce7de831ea707f5cdb8ca2d314467c663693c63bde623b70c16a4c03fc2714efa51f8e98a66a0669cb71cdbc19f631fa6255ac0316095cd05c71b35761d470aef0a4ce7444fffb6d1a7bcb6c0a23ae7616bde024844fdf49e9e122d5878308f9d8920f8c6b3846aeef3205ab8ed6db227c54c866cf3cac2491400046133cc4188573b8a9c41bcf75731de1404d16a045b9a1cd909fd8aca97b18b572b0058c521ece3393f6b37f09cdc4c8f5f0ebe528f82c576c9e2cc51fd0f0a92104e848f1cc2ce712aa053cb426af23901f5d92145f7ecfc0723fe0d0b751441bb7ece03bb6143cee881befbca66758da81758f4f161e9b55c319e60259c2ee2772193c79050e9aee37fc816a7473d19bbf3ac421469425f33ac3bdfeddcb0f0fdd7845f2e0a269dc60b0d806b95bf49b80b51ad41769d4617e444f0c6cf40f999f10e1f07059117eaa40ded89ca82ba16dec77afb0240f6938a482732ec6568e60eaf9b9dcbafa9cbeb3792746e1dd772ee9c5f93a4d40d110ec407d4ac84cb5ca0c76964d4e8d004311933ddf8e71e36ab4eafbdc6dce62ad237070e98359d883803ecfeb9b3071e26213608e3751aec953d0fdbf0b21e4b851fa95327de6bd334e3bacdd2b4cb643afe1d97b65e4a0f5d05d460aafa11fd87ec5344e40592d837c53754c864a980dffe5f0cf9f928093327b20e6e1b6dbb6b3bb9564541cf01a1470715f3290dfe95b07ecb26ec3184e8211d17b2ac8dffaf8c3ff9d3f95cea21d79e93fb988537eca2f174b59df2ecbc706a2f0113ff44b53c5bc218b2e8fc0a0562513a399bb755445b7c3e84e8bb50944db6e1f83e251ceaa1217bf4efa1ea4ef6d04762ae17501311541a379f7b251b2c41cdafc71b570584aa7645cd964312c093abca58b27dadb79ee13c6396aa638a523cc12681f41b8abfb01c2f23a4ff540dcfc718232e62b2af2bf9e1b8710bec5aa7d2e91364ab27f381ee70d4607325c13bff68e402e0a72742f6a63ae972c6dda74b6b2a3922f0c894433f43360cba3068c9c76f6b85e979cec90da89446ae5db3914940e21159c14f90e6ea763a85edeebcb04fe8e11e2937d7a48c01e6175d454aeff1d004e7501c8e0424a17b1d4c264ebfe00b8099b816a8e75fb2df765ed4eeebb7b36c0df79361139c684cf4fdb80642da33c300a8e3c3628e17a15fc50ad3b8fcecb5524a4cd091bc0b2e81550c69e5990246c77e07ad92b1a0ca48322fcfc44bfc8f38ba91431b0e3aae56f4abf024a6f78a729a2acde444fec8a428ec09ba2f534845bb093efbfd473afa5f1f1f6c7e73ec869fa5baf3c2820b181b9837f711917efdde3d3ac123e152cff6ce6e39aa080b77f100eb3da4cb2ff88cecc1079d27a1c59685bd16fc79946c5e426328943455cb30d4d52e864a95e9ef324b682c964f31667b3c49f1706e43e8037495d78969f4c19a0f42c170eb50d5012d953a5dd5c5e0964ef6ad764eeb369a392dde67a68945b9001700ee8eb1b0f1ee1b50fed3f7775f5b997afbb4b6cc6f273d336f99fd1fca4e17af03fea1155d03670af9d84aad4ee89f04614e5b1c0aa56050f1b2c4c2365fd12661c99374db1404c2cf4133f4ed8c93b4576a3ca7f55a23d1ae9f74df959bb021886e0d41c4868112ffad47e0a3ae04153ea6dfe2a7abf41ff6ae81ca60a8411ad85a731ed1d14865fb8b0af319c36ca19772b97eaa215d965a6e8005100c106ce21d697e6b9ad7465358d19ea86339e3f25c5dbe6540ccff4a6dd4323c1d8aa2263564c2fa39ca3e87a55055e813f846cfc241347180cea5571b12b43d733c552520d98f16348db918deebbb514c24548052e8634767df1300f4a01d9ca MD = a6f88871b9f52e19ce23dd00fe0162dd6a6bb39d66cdaf2ff84b55aa9ba5aec9d2d352b374097cb35f0e1b71867a3f6e Len = 19240 Msg = fbf0045f3bcdd6ecc9c0654cc6b8ef9283107787396f19aafbed9b75e87744e2a574f12e0ba865dd1c59e1fe3cb1f4b09e6495e5fc936f668bef7c182e21d57de96ac97d99862c67e3d7f1336bbffc0a464e3108b11dd14003790600e0c4bc57b019b3d54f2fd2920680bf71bbaaaca664157476c2d6e63e4bd360b76828a178e0cad8bd946a00666e9d70439439ae8ee10285b99586576b4b45b4c52c152ae963c55fbdd0015eec01752f2e5e36aacaa35d8c5994f5cbccec1727b0965302b11f52715d6cba932ba85222bc81674760946eb3dc25eaeb6b1490e3020ca9cfd8feb93626ce5e482b4c7a717465942e5a9b7c20ccb22e5f4facf91042f8e13a67e741d59f5fb524f5d33645de728707bf9fd1fbb0a28ace809d9ad5f9c1c1ea65c13377518786d09027cec683110779988ab36d115dc3e007cdbb5baecf1288da76d743c2af9bf3042e8a1beaa8db2cec436b9e764ba43eeb26a4cae98a9bbbcfed75627c3dba365ad2b26d9ca1ccc9c3b240b567d4f490348f9d49335a262c4a0e55fb079bac4199f98de31f62a2f826bf7cda6c607a7deaefed0012a7798256c1bf37e92f38bbc98d64a6fd5525601b5265370e57ffae1630dd1810d95e66f8eefa3eac63284df3757fddbde01caaad5345f1d4214bcbc039b5b9b5589a803a7d4f37d79e439e1e9926b1e86d517de1aa62334726267beef2bd0a888cf8772356064af347505752e1a14a05638a82c13f0523edce5866aa433c3411de3ff4bb6267a187c8181f973537cf9c2a906154fa75e95182a835fb147c5ed8b4369e0b87b9611b88639ff67d3268362a2bc1a2c4fcaef8a8e090ea4dc3b16677a71e1aae46b538eff87e76a1d83f5aca224ab483e09a6caac61e7dd65a554290581bf1c054c36565a1652089727990753fa591216ad434ee2388be978971f465113e96a32cb32a5224fcfa1e47416090487a4184e285d8debe75b579972e05609c2f134116ae0f1e4aea0f46a1bd53840670cd9690d4e0e0618e6962ceb3fce8c095708059dc9d31dbd864eac615f0b941303c3dbbead55ed27be23b742961644418b34a3f645bf49f6d03f3ff72bf97c1629663adee3fbfdae328edd2b7bd3ef161e6860e6ed1cd5e52f34794fc49874dade4efac09a46b416f445f308696dd8f18101c0f248825df2e3cd0cdda15efafb92dc901638ecacfc63d78d6bd77a9e6e53af38aac0765ebaae774f235ac38ad2f79d9f42384444c901b220b85e50abd6e6bf5c72ed6f34a6efa1d4a3494cb10b7d007cc720f417f77e64418066a68dd5eab090dd37e39c42180b21e00570e9ff83b3bd377b6293121a7c545678d2b0f5b0217a6c2869d206b7e1bb6c07c6b249bc15d4f5b01642a36668fdad1d7bb190d7908d824768928f6fe405a9d8c4965476b558945785a325f29891f6bce81c31e17c2ec21d764a267070952bf0e102ca5400bc95ea4731144fa9b5c5efce3d733e52e2ae030965769a25ee54d8a273f5d486757cd0c188e8ce0add8d1e94a1bf7e934d98a09870fa2d6275d6f89f866168b527abb38af73dfe4a7dced1b1f590f2dbd4246ea9f92baab4c004f92ea6b7812b27b50b1a286e70c71b0d91cc85726b9afae3d5c46a75a29b517122d65152de471a2b3fe57904962f49cbe74afdee293f46397e6e4182a594ae9e3e2d12bda0975370da73858b0ee16e8c4a93ab5ebc572aa7b11e1abd142f4c0e83a97762a8aa8828535aba8c2b7c0db1245d3a6ea5713ca1164a529f8ec99e249bc1dbec26ef0cb442f1a4627c5dbbed1d0e177874fbd0d82679859466022982ff1ccca4dbd3759721decfb88204dd928d0ccf169b75ab9f6a2220564a5782ac25f0c64717f64753687898f8dd1007440cffbdc3996d117949eacf3f9c381e029904652d6bd5f67b8f659cadddfdad74154d8009ef50a6f85e29cecaec327028d0ce05d257f107721f2c4742152c54a52e8ca2441dbed09f1f65cb82bac51d71559444d06cb5fed990132540032a8149b123912c950622cff63521f1786e7a8ea01d8ea20ab341047ad0b3323886a7e455a8d90df5d5121d7b0e8e91a5ad0bd338c06fc1c267729547db7d9315bf5d078482f672b08a231a26585dddd2ff65e1980354aa1441080e7f99e0ed3b430525b65855f545b3da1880b90c5080d40d3c467cc9d580ee75d29aa289ab19a034b1738f83f035e0abcb029736743fc96635bc835bde98be4084217be4472155605d349f1d1df18f2c94347958b3405e058062cd772fbc4f0c859c9c6d5bf2d11c6b821d6db9191db0f68ed5efb862f06f8ef1a1a8436bff1e79646aa163feb1dd7ee471026c0d1afd748a4367edf83f18c3b1a66ba4486d1ab2218d0cc9b5660809c43087a15e154690af385dbe807875b15b423ddca21765d25c6a2c27a77c308eb9e259e38c8b40dd863b3db48c5b1afa371b9b57396ca44c6d986bf85542eb902dfce5cd08eb50bd77b2846a7c558ce0dd8910ae4efb3aa2ed8e68a64f78ad90a8e6d7a853c41aa31c34de4af0e62017c7211a4c8341bd5854b29ecbe68bdb12a3469c101d83f340ec3887c06a7b99018c5a24bc56be90ef2bbb7ad3badb1898b582af9e96d96ef950442d8549b43c3085badc6839e059d9daff89584d04ca9548218eae8003024ef0de4be42efeae275bc98deabd456caafaf546b41d97858ae3a9b5ba49bf41a4366d4f777ad9434866ecc5be516c6dd504333f919ce1cdfc1091b16c545ca1bba987c4b9cdd2b0264fbb205d86b3c1da7f4fd05b5b92086b47600e1f4079a6d7c2a43815985969436ebb1a32ddba1d4dd491a58bda16b95af0ab285d9e84c59b0a4906355afbd3225c430ff8c6edb4819cbf2bad88fe754dc4b99ca1bf0c9277f8fcdb739628824591099df9b2dd3c18400edf3ae8a7b0b61c31d776227f71f10716146aca7dfb1f956530c051f7189467274cae89a0f0166faa7565896bf898cd5b4d85785aa232d1fc64e704c9ee786a9ed082ec78c7f14779d2da34409ac1a402e35e204d1c01ff25a6c85bd40226c2cc275271ad8cd92c269c5eb39bed1e33c3724f42c3cd1f4577730eb794083228359d97c9adc33096371e6d97ec4400e50376e3506d49dd7d685604a888752cd361cfcd55080f9a1e21f57141a0541c40596db4f997f6eeef8ecc54cf3fcd798cd71a6d842ad6681c8dae24515681c2de1bc33e7ed268a6144142797c18659a9d1c29e307a49c3d29d094d1478d418706e113ea80bb23a5943664ed3fa0f2228ca76ad83003d58bbe71661284a337eb634fec437fa09c6fe7b4801a9a77e783e3ef59b7ada726d653068e62a936c9626bae98c3fc215767776230ac0cfbba413b7a730bc12cf4af8ff67a4c15b67a8e9883b MD = 240602789ea8f91535fed9ce15b79d6d3e6cb54cdd4cb55326ab03ea76e0f89d42202ef229a55351b13a1ec143c29711 Len = 20032 Msg = 82b6d4fcee076404ec0e88251df98b0fc80488007c8f2d7ff774be4d47975d992fbf8873cca4e383784938fbef8bbccab1fa9413a7e997dd08c1560c7e9b5990850dacdc14439b998052b99c9dca2716268a120b5fd97e06f8b2420a355e54cb4c49471e0f0e12afcad413f26fdd545cf05c0cd2ed8769628fee8c31b40bd6b44c1a6223022bd22b20754fe4acedcb02d717894f991ce059951e3c6742c865b24c2904d238c2637748dd74599e211572a364926aaac06b53d1e9589628bd8b2d161d3513f8fc4bf90ab58a3b8ba2b9121cea2e0b6a9a93b80cf8eaa5af14cf8d709ffdce8900141b30a59a71bc973f4c0a52651a1fd3dff00ef2f97c1cf2b93b235765eb34f745448054aae37929308734433f7f1292d8639f808e03ba81d29df7ec7453410967dbc46bc5790a80122a6366c5228b000479874ab022d0e9a11cb30733ecf85d014ac291f01bb6c3709f5f63feecd145ed9b8df767c1a552af21214fa89fa01c9bf8436f35b1c61bcf4df0e1f3c32e881b2f7b2fbbc882e38212076ddd55836dbe4d0ead9b2382afb99cde88aa91e8f1159f179cb51fafc4a4582e08daf4e779f0b1edf22a5932a8b5f4f0012d3c48aa63512ae45cae741e9d5c5ec9a5651568bc8ca6e6eb3b1e2d4cbdeff484ad96d88daf7bafb95e1919f3855e5748915561a7460232e5b28e67045fa408b5cd1aa61b1fd4a6d215e5dc303af85ccb5fef8c3b47c97e21a4c97d6842d4e6ca831c3a960bfb70b1bc2190dbe5f27d34b62a12fff8c371a5fb1898fdcf4a36cab6e3bc86dab9b65e3c165c7ded15648d804f1b7bbfb7b47b9dc3e04d6ccd9fbe50b85571f4d620df7b09699dba29b9dea4a6ce38056fefab74127cdf8224c9ad38e32ce1c11a553e6345dec3b4f6232d0a7754bd33b1c93b664c953b7a185d9f56ac6b5da94dfe83db11e47843434b849a0ad592af46ea355dbb52eaba71039d925a376e1436c2b4cab4a342cfdad9ea3ca67840e3f6fba040a5dc73acf762add437bb9a6a9e4adb1a7742acc0817468d895654e3588a485f7535a5eb77123da04891c6c134d3effb2a2ea3b7e01c404561dc5440fc68ceb690df53442a9ed290a998569770b45297a7dc279712272c89e87c0abd8765cda801bd57bb76569a4ceaf1c1bfea007605a4ff3ed01ab26bc981b7d0af861bb5b23c421be7d6e3f523913090911d32dac3a62a41f976687e72d2025e9d74f52743a510282fc8c163b310c75bb166d5f1502fcfe9899193e5143e0dfd0dd08c92fae0a9f519c8696689fe388ba773744a49a6629df718df302c3a1d4487253c794653721b2c52668e06ce1698d9af68560eae84c7c858a4d0396ac2bd8fef9f4aa4820af2edf3234ab7e4b41bce975c952dbc98ff83fd8f45ba2490d09e9c3f9793f0d724c5273a1d2bf6c37d0ca7bb98053531bda063e9112d1bfa2629b767e093345919486b1585c168b7450a7cffdf43bcc18aa4185cc310a58116b7cdd2a630a11358ee4b401516aef1fc4e73a3cb67c7daef15a754cbe345a83acf5bfa68eaeb986c3d24343baa5e161b4f2841eccfcae0335b8d6bac4390e1fae6ce399920585abbab928c69eaea962a930754d40a5a74201c370bd4800bc0ef84a12ac78f9bccdfb022933056d8f492b09d46e1a5eaf91dae30bfe5471ac7712f814874771a8130f130f32f7cadb3fc0e56b2c600e0f184a806e24ef74258385dcb1d107548fa67d56a16a7dadd46bf22c002c1c9f1001d80262d822f1715ad860b133c08cbaadcd31a9849efec3f648465c1955f8f8710dd1afc2f4d0d62393ebdb547b007151880eed2763a5f0074a9b479914010f926f551d896df99d073fe4f8dd4098fcba355437fcd28aa3c78193895460a29f8c88f773d695550d2d63b5d075153ca20f5c6b4dabf696245d7497e9f441c3ee87e01d7b5075ca70bd87c52bc504d4ac7985bbf7dbd4afbaf2ac0d301ebf4c45aafd31fba014410ce1337cd1741448621f39acff3476beafaeaf5f267ce325ec1d6999bc6d7aa32bbff0428a2b4d800c2affa62c60e3ac49b807f393b6b4372b09acbf8660b0d6137f457f1d92b865f2c160114504235fd1393b333f743a684a964c092121bdc40c4abb9b53505cdd5c0de35513cb3fc18e58d486f25d7ea190ebd3e15457a9536048d9fef40e42d1913510da5e5a3eb9ca3e5953731987cb4731c9aee8aa7d6d55a02711c873702ada626f08ed5c282ecb1252048b515eccb58fb4d7a6c440f9357b2d3a9628f0ce7fbc89488a77050adbfd480002ad098e222e1ec6534afadf460074e228d4caa7c86ae500fb53de344027c2afa0d492f7d8358ee2bae7b307d15883724420049cfc950b9a0999ba9442b748792c6f00f11ecd8d93a24174591daae250b3b4a8946564847c7cf1a2122bd662c670255c633b1ea241d20044bd741f1ae63c37bd794900d7101c029d9641ab99fe329fad34784f555413cd2c1b1cdfb29ba9524c32f1908cbcb175b308ce5f74893b84fb4e1d892e342d50335b5e1132d6c1ac5ca7a53d2cea02f1ec5018197ccf537d4f9872f3b64ae830616582dd22014beef5c0ad2f3e01d81f5156680237394132b0fabeb674fc0c15be21d06c0b8310bf1f65508d4a69fba7e90305422f2dcf4a265c4bf9f0b360a9537790e675c4d8c8e37ed77fd8893330bd3d3900ec14c36eb9a65fe5b3d8ad9127500973e62c6ab048f38a2f71cb4862d3ed4a64f457e64572c043a244d1bb7842928439e823902057acb1c29c9601e735fc8197d15c007858933f572b085204ad274963021110c017919463e2532764eb5026c10b8dd9ae73059a2cf1e33add6ff5a017bd5eb337908b7b38ca688284fbd3810928513890ccff9e4a1dcc3aac90e6d17d9f72412eca80ad69dc3edaec6f6bd998b20fe7c56a6a91d9372a1c1919e123bf32b5824cce5a731fa03df7474e0278963131acf6562cbc00c865a6cb11cde002fe903e3aa3ff15829fcda13ba17fa42a2b1e50cb962f67e857e5a16b80944e718a693c9f5159dbb960579f706fcaa67c2a3e9beb3459dab96c11d4a06f1db5315ea94524e14e0ced6b41ba90c0cbc6b5b5f954ff37945c9a8f530913e4505f6d02b921715ac8f24549f5ba409d6a4bfd55b745aea8c736b34912066cea15934bffff982dc4aed3ea81d9672a0c8f7f7b90e034a18edab12d21b79452865498f3dbe5710027e8f8039b5788f61822a858f1dcea80f1b41330a0a87b6dc2f5b78e21d276948c5da9b920d6e74cc60b0fbbfd132ff2da3fa4e34c4e8366a5e03844562e6d8efaf72e3497be4ad22032fccd3eeeca9f4f62ae6fb01174e537fe633c04601f997a9dce9b88767a332d7fb6b63bd385305b0577fc515a159181357f9fb2d2545b1337d2167b683f15f5db879d7c2b264d031048b1b98f2f138a6ed694e9ebd47ccdae82cff9fb6021812cb5aa8a5f769d516c69b66f1a8a125b92ae44301366a5b0e826eb8997a7fed85c8907ecd53dc94cff2234fb61ee37fa8750d70fb2 MD = 8e2dff705dffa8faab0e5e06375d8a188602a9084843866e4c991a450de4c4503ecbd3667ebe432b353df3181f9d9726 Len = 20824 Msg = 512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923ef MD = fa6f2bce66e628ee4638b8658e0cd36ca630c71c7e1d6da2189b4e8965a73573fdd137d23481ed07a8405c04b1c9e48b Len = 21616 Msg = 2ea36a8deee36b8e22e1e40550d7bc92aa04c2179cf4e419a103a1695a1dc103e1c743365b639705ccaf0dce30908e29c70e8a13b09f314cb9a8e6fd7641f09e9039731760599f25bced28001181f63bb2e91deb70840f0b6bc1111f28e1eb18e3ffe478264eedb69aa31de41e335d8f169d65e7052be71f5f5409179886193981237ca1d4cae8800dd7d4c27c2d2cee9933484e971c1f513c6cb82defb7e2c813ac25d99353f84abe9334e256f7c920e3b2b06a4de02167aa0e05a955fdae8f40a3c6698b7385de55de278bd21a9eed9d22848150fe53295344d8d2f1dfe554b10f4799e3b1f70279c19506181d111d6f8bacdcc8fe1f61dc1519f1ece5efe00df88fb1c495b77fd242649c51888c7700f60fc3dc69ecd5f08ab04e6d9735fbfd6788f955a82b1d096c7d92a5e476c4f96a977db4c5214e35a986319d7e1d6c296219b9bf71bca3c644c8333bb737cc01f02b54799d2894537c81e2a42110fd38f42a382979d2dbb0d42dc63c8c3757c18fb38e5376686ff30b8aa8a9087774d322a4bfbc46d68b70239592cfe8dd2de14f187469da49a7bd5c8acdd4bcb89aa1f66d969f622e7cae39e6e01d5593150838404ee4503303587a67974ec43d374b776e05fb554476111f0af84e5ac1d9de531464eb618e4d6d6a0b4f3fa86c1378ad8f54f8a57f4141dce7228980cd3f0da77cfda793c24ba3355c3ccff1aff5d1a1b9cabddc46a4e77867a6f64d20103a3c6163407137c6a3e444a824266da7fd5ad2b073810368abfc71cbbe4b22130f1ba9dcdd805685147faad969cf0defa5e0c34e411d1d55346fecdb09023b12344b3eb1a64a85529f0c7518c475f996713c75ec5037fc332bd9c21cfef9d4d351d4062ac4562df3ec958fad5d9f98640875cfd2c85708ca3742dad7c6b853200dbfeb8e5f2cb731a221dfe05dd552201393b848d006a9e201b31c5388c722bf1013d4279e5589d469b94df9ec9f8f94399f1a9590ca4742303370da6dafa77803d8a83baa580da4eb64c13f3186b78623a0dc02312e4ab36dcbbeb29df74c158e175113abbdaa69cd2a23fb551132bf799ee6d7dbb71afd6082ee243f27785c58d7b6f7c80dc7eaba135b767fc96907e2a2205cb5ef1fe8b060e8787cc792170a20bf2e29cfcef0582852f5d834c22506b272d8e85dc13c066d94f67b60040c4bfa5402f78b26434f70eec388dca6e38ed9c4959b8969c009b2dbe665793504c46e5db95ac937ab48f31827b6497e07221cfed9f7fc7d3d6236a38f619b8dc61d83c29c791269f0ebbab9688b01b05a698508ed243d677bb801d63a984d741cfd426bf37ded24d9dfccb7cf2e8ea6a40c1bca1949d48d42b41c5a2f311752cc0cb141068de3d02fcd32fca4c778c6adb2e62ca48f4a595afe8e19b655818f9ff3db2a1cd27bd5ba5cf26e2f80457a3c04ef17d81d26318a3d5ff9172c14935d5ac50f7f743d9b423516f7b77f7f291baa3d71fb1cf07f9b1998e499dd57c7cee879d9759ab18b8fffa57e86ecad3a104bd82456b331aa563c40c18591d391b946fe6e476c600b6863a8eae2f05817e48fc916310b6f1a804b5f78236f0e5ae81c5cb83d13d1849709262514b307275f201731d44b3537e4f1fef0bba0928b21119b9e9eb78c5fe2982716635c42d248a3ca5b869c086949d42313954be78a2dcdc407b47f1a0212b9b4a51913928069c3eb7e90267218769cd9c8f99993c1d4f9dfddc59402d7ef13d3ba7d027d99882681813a10faac34f225f72eb22096dd3df2071a1ecc44404f8f3dd64e8d856e74944ccc83298d4b7e11887dbd16731240076dfb4401b3cf14ed166d224aade3562dc78ea6852383e7a4642ee2fbbf39ab25f7af2e288b620bf72e8aa43b77ae7352dac8a298d7a4d5e671894b59e21b25558d8005c934c2dbb46b74fce84c99750e6dc19eea0f75f2e098d51db74480579e17b4f16c16b72d2cb67553d9956a016668c2c30134bfe399c25c839e4d30e8087d94199a9908a968f8d3d197b8eac264b3133867af4a5319d564a39565f2819ba768a6da257ff66f17d79da91fe15d0f36fc26a4e6dee869bb36a524f48fca607d78bfb522e2bd49fdc9e09730177d6fdac5b53e43434a905a1ab2d362d06a5ee80b8db2f8faa5ff90f1c1ea5553c88d85b50cbf2d4022969c57f22b177a0a9dce6b38590f8f5798ba966929f55fe670201554af0c9f188467378cb37b58512619dee732cf697a1c6102ffdc77018020942db4944726d361a500a8f3f631e800afadc2c6a14fb7946f7bac8b45023ea6c74555f8489efc353dfb7074f1cc76337a20f29ceb0ab607cb4a98bfc629c709a3a55f6276ce3a0917700abdd2f2a4c8607e9f3c16631e7d5db7eaff6240c4510f95f95b398036e41ba79e57036b1ac64b11f02f8b1f98fe0d09cbd4810ddc87f25c4b6af97a98ce31e755c8eaff7f35221f0efcb109cb93c38a62c58b5ab8b236437e171e8507cf417a569af1767c1ecdf1212befe860436780d85ae8edffdac292baea10692bf033a6ca547f97b88833cf5045af83fe17e134541b018e5a077e91266c38eead38efb4d97ffb2bdc7b3e00c3d158a34e1519eeff913c0771425287eb24fcdc35b05decaaa2cffa8fffd5cea3575210f747f8f60043021feb9226be309ac5fa6a5e6695664562cc7a1de07f185f0492a2b5649380b9bc9d7100e27c1e57fc11f54cf0f834f11c6944dc485c4972d8f1f766460ea77cd04aaa936e0adde207e97d82e45e3d2c65999645f3ad5f1735f49d6287af9c13a8ee3f53b2b094c3504aab062b0da981a523185ecaba81d783653db10dbe8806aa51d74897b56c833dfc27e2ab4e9f7544d07131b5cad8392b0a7e5cc28392de403a1b7b03638ca938c6981e4e684792aa684ac69d278cc593ab09698d46e322d172b2f3df001cbda872a7c0fba5ca5f40b34a236817c403241285e3554ea25ac4c246b814d54648f5c6fbd29a4b50646c781a5200e3a87c46069bcf04e4f80f83f07cd3892a30d1868b3d5b12a3002a9781615b4bd361b7624ef33781500dc775c4fe4b254702e0c58814644df503382a94c844332e173cdeb33422b4da080d02087428d273e5fd198729f4328981168b7af7179f3ef19424fd079985ca12669282857377f701b1ea4e2313a9a6a14d24fb95dc764918469af413a3dc67525c8dfbda33fb1b7d83a1a7abc99a958b645cde4a99a298b4daaa5f0148a1faf1765c3c1b70482781fca458691fed9f68e39aedc0580a73ecd9bb087890bccb163d650aef32456337a25c29041c8a0a605348ee9c209621e8ca34b521841522ea371130fe82da17c50031e425c95a1e9a3bcdaa89fa2eecd1357f2fa42b954795eec874f167ef8a539b8c4f732c43253f2391e92decba1acfa2033ea88e22813eeaf3a070ea6c050afdd33497502e657693fc72300122f4099a28a9d5b3a51a0db1f87a221239d011ad7059383a04276814760f3b3e4ec2a8a4563ad4a407582bcd41cbb0e73f339133c986fff4abb33c2d6786f6ad27ccd349f5b74d692e84c0c6345ac1716476b218488593850d511b6737a008559359b3106de9e70804e5f3223bf1feb991e09be3531d9ef511492d494e251a3e7bb3708127984b8b70c5ed6bbd560fc6afba751c5415c54c9ee2995b14ddd371c8203124898c21f9596ad62822529ba0a44c674bb236b2939e668825f290dcf560e91e82fc8c105ba91dd5e2d1ad4a505ade9af9d5480dd2f81b21304e05dcd22d566022e962c0b847261220342fc6ddb7b836ad25137d0f944a8d03 MD = 88a7ebe36ed445be23583ee13431e6291a08ce9a42b7ec012cad0fe205bfa04d84303e571f0df0803c76d7fca5a7d8e6 Len = 22408 Msg = fe6f4286f2ba2ca82b6c4221cbab60711d2ac0f8d75963c29cd9b3a4c533668861c9a5057a0d6e339bf037bd8e9ed4376a689ab2ce01c58e67ee1790b838c2341a64884501a421aa824fdd83128f8a75915a984187a37b9cadd1513baf70c52d3026336d0ee90db8e8707d9cdee74bd298e702cd8aa54e93766aa9cc32433618abf9eda62a43f903d63b5e2f7b0fdff689f91f7d6071061ccaa1666bc919dfa094c40018dc1aae335398ca656f6d0e8a6b77387a906d6bdeb25ed242fd5a866bf26fb2eaacd7f5f1686f0766446ba036474895eca203448235893376556ef421cde14c4522e094e51ca85e5981705ca124567efa1e9a5baf5c0ad2325abdf16b2d041550c79e53b6772b1766afe30b740a883bcc8d99760e2ec9f79c92b045f11bbf57342279fc0c81e07ab7552e755602c6138b776a5e46b3aeeadc87adb75a9efa5818bcda559143b0cf71fbb862f012f8505f6274db00f3a2f21bc11d104ebf9d62251b2728ebc4815dbf2ae99aea4506386fd81fb5e4f78b5881c76918778591bb82c9ca3bc20c3d6dc76829e4eba0d914e460d3b399c653653520f7977af8bcab594e2956bf24ca47b140e00a9b2d572be583f89ec868e05e605731550220077ccf30ae4389131233a63776d2a3f369c79bc7f63e18e61c8e29f17e19b5065a740ef9bfc9c9e1fb79ced75305abfaf82e2eb7365b3247ed3cb97845ad3bb19edd3e30c6af27976f6050a7e06b5a4beaa9c5d81ebdbd933daf3774f0d73d29b9fd865e2abe4a3c5531542f83cb59ed298088b4172b62d2f330cc6be6606377951d0f0a53bedbd8943504f8a5ee4fe89bfba0d28a6fc90df707a0e78f1054a2198401bca977817416b18689af9de5452a6235badd4f994c317cda6f53aeb9b22c7c83fd94b0e516c2f0026a079ec30bbdfc6ef57a947b9589d7a38c9a0439b0b84bbd537c33afc98039a12417b990423b12740ac70616f2e75f22c4ccd87da3a43ad849c9c6869238d38a3e46b8f5f28eec6f812e6c136a335d80a251f32c93d891fc64e332127bd207e740fb6199249dd286e3158f19055519e4ab911def883b98502e323efc8b371dddb3a07e25e0500ce1b6e638d1cc35db7769f51d6e8bb797fd2e1fb4ecca4d5d961e9cd5402c8fe1a985082de2c6bbeb6063e3bd50a333d52aec105a8941fd0e3a09572f9312429b06d5e337f6fcd090c821c4c33ed9989b00f16efa7cf7307af0fc3953c59951801f30df1db2745a14d72c01f8df34cc31a7c4a25a6cf4cce7e180aa0b7fc9a4d91d1d64a9c03842bdb40b0024dcbcb8df46ed12430241ba9e351c121d69ab24ed2725daa1c85071d488462b0fdc7944ed06f5287ce6e5e3e71359d9522a46b70666cea9ce71c2cea07a66e980887459a20e634bcfbfe82e09a3be67726ba3466a02a339f86498406bb3f2a14188b4dd4787bfe2023653824e0fd32445d3c8ba622229f3e649dab17b5b72bd188341ba24989257def22dc9fc7c2079920bbff936eeea3d62c78e081a996ea4ce2124d6816a62112b9c7eea5c142ecc23ba90ed2e8f6d803286be2d8e956fbe2b0b641ba624ba78b1db4fcdb6ff8486be89417c922d3a251f2f71071f78fc73f6e9096fdaef1ff43758a75a5265aa102c20dc90a9efda92f16ab080176a9e2bf9621cbc67f31bed87ba8e79776d29d035266810bcfed43170de827fbc92dc4efa1fa3e9935735cb67aa0c126f3f8830a044eee41382b0696434efed58193e44c2c8a9dea744f6f6a0d02a0d80044f97372175f4f6a2f7a19413ffb031264c7519043383eae1e4d7fad3ef52f3e4076dc0660528ad863043c924bbb18fe28f4ac67b4bc0a65789d43c5c64c91006371904baa6687f57e3b6cb0f2ad8bc758e2993d6f87d21cd6d5630128f5b1e936705cbc6619cb63d9862627b540eff06d17b46bd43a2a56c16c69c9e7aee67b21f98dd313dac985fd8af561042399fbde1a9a8d73217785b0e8a49a72d6b318ce83a01a443806ee62a056e77fb42e5c3451981cdd0c4e2c3dd0cffd6aebbc549495301c77a007ff917cc7358871219408535994622912dcc09b285d307c46b10cb4ba341ea1515c1266c2e5aef90835b2a64b7eb32679f9d1ce6a54540706a09f48bb0bb9ba57666df4d64263aa36a3dbb0da564072c825f9e0f25d45fa60c5d4f79efdc9699eb0fcad7e0647035180ec09a2958a9ca1c391594ce296e4e9734617e2a4de2dabce4707369bb9a2dd3f5c2720c702127b6540bdf68ec744f54b5b40327b5874f310e5887c6d3bf72e41a48fd1553762d97d80757bbc57a938b09cf6eafbd8edf92b50a7dc055e7ee93a6daa30ea9b0c209ec92648e5a870184573a288a0dfe7426000fbb1fe91a8827c100ccbd1cd8d052b8336eab56a38186c87e9a804cdff53618eeabab366128ea9243e0ec52f43ebb6572ddd85fd6fbda84222b592239490a252fb32be5c3b622422a4761f30ff48c1bd71ade1d2957c9b2ae42dc39155aea4e5b3d699d491b18f83e69e5a82eda0d01eb8b853aa37d997baa49d3367a0f1ebbf9b02b07fa3d14dd05af3f195bd886403599945b4d5692069fa704c47150ed9591743acbde055d19097f39ed9dd63eff3dacd52a2dc8fe7c15c437890105a104abf15e90fd5b3dd3d24299ccfdbc7e678c2d0e4f4ebc23049208362d3216802fd08f5efe6028fa34e661286081728ea0a9820872b51b4bc7a0dbc8590c6cd33f87b604be0e52dd63cf42ae4e33e0b6d11c158b3a6ccbbcecc6a5b4b598ede15b59ce16780fc32e88154ff3411bef3e236e4d5f4f7ab6be9c8dcec3e8dd82f4accd3f5dd36c6135cd3eefbedf40856dbd26914b5ae7c29bff7bbebd9be314525a6b71a1782c163a58d489d8d0aa8b8cc7cc4b1803bbd9993c1add6a75b389448cbbccaa0f57c984515f870abd61eae36be9e28ef1ffe2027cf294911f54cb126a46b93f3ff6625ce165501a4e6e88bacf04be75cdbbc51ce68949fc40cec0041d939e2ab00fc80a30704cd02ad84f591ba547953ef56a30a3696571812a5262cd2ae4310bade5d66507e3f6faa726077854e5b6edb7b985da1a51b98a6f6873a194f41df8d5a007a8b37d5265e3f40e0e9a009f81089a65b422749c02a5e980c25834b51e91e1e723fa82ae1495a3b404fe0019a3f1f516590b35e191d5bfd158fe0ec326e890bcfb675ad0aec51a4282094decfb78b2e1f05dfe52e006d1ae8a0fe90db7e396cf5b7f6d80dc7941ffb2414fe030a8b90ea19e36b59740075f80122d5d7a88d96869cc248846bb0035ba306ebceb86f2e5965844d35e8b492b638f417917e142cf4dd5e5af93923f2ac25e134ad31c45aef4129274dbf07f5c5b0e8f2935f6b94b302219bc6c07e628f352a45091719bb0e655875fb97691388f187e377ccd27253a3c29787820dd7574948b97cc8dda3492a88b5e9e26670828347669967072a692aa7bab60e70c596eac2ee72d79ec82209306373306ea134debdf8928e7841361f4791ccb645c1e0923f7085c3cb7e2b99e60b31f2100a327c4225ddd3843b7cea38a95629eb30a6c7f4dc100de259c8552029a0a7c92fede47a5ae5a6d99d9023e15dccd9dfb67c04b97dbc1681df7ab3652b49e21896d99fcd1434a8e6dc0244d84bbb3691a7b2c0c3f1f49e1863c53d3b9c98017cb38806c0ee653a1a6b55d583ef7bc0bfa8fd94cac523d514ab4a7afa0a05b6642a7bc1ec55d1db02e00d5e8ab5b918a81eaef92463f48c050a4cc546d02d517d402759a5c7151c2ece9b38433aedaee99d6956775ad10378057ed4a8ab796306b90d2693dea97e0c8b820b53eb73e3f2999f352a1633dbdc21430175d8747bcee9afc12ce909611aab44302343f6686187c32db322a785bfe22bd45503a90c045681b1d792bf75d7a2645f37d0efacb50c77a8a90ca69181ccabd5cc9971846 MD = 4e7fae296c6d80c6508379f94e01d80cf3bf9e057f579ee91df6d0f7c1fb85e4fac45194b91d0b1a9bcb756bff848a30 Len = 23200 Msg = 8a981033d7b4eb4cc9648ba26ad9679c1550dcf32df17fb80ef6b299440f7560fc057fbcb79e8e4446c2fbb9f2db918bfb829f9f44574c504c302bb460770f200fcd21eedff32f7d3eeb477abb5a855e76312938d58cecad79db953d713fc7c8ad371d50b57b79009b28986d2d1eea1d70a6a1464a5908d77f3d17bcdf30445ebd8a9b6aa2fe11d443c1161bb1ee69ced02a304f0a8448d7449edaba11122fed260fc5c50f43a20120fee80bad94aa7b7e03fedd7dd553b4b24805bf71ad2f7ad20ec1e86213d290182637c58bd6542b617932770b16d276b082c15166c8ed0fa8ceb75b0536498815832ad2b17d0fe763d6f5a61c0d6c26259336fa582d10b39099d0a75e74b0f1fe5beab9895185b66b606ef01883cacbfbc48b41afa2416f72b53353d795afd4bbf79e0279195ba06261c6e06741946d195de9aed4f0284a366b0ae7d660ed38339f6f36eb9f3cad2e1f24fb710c711467a677ca2ddf6c4cc5037aecc59e1325509b85dc46a9cee6b8e3b1cb9faf09c9cde65e1c2336b67d05c5ade90b17c8a3f932077cf200b952e8f494d757f005933367c52d1fbfade6dff9cb661093b5bb16ad1d9f576ca6f9a79cf6a702990d7b816fd5838740fa8e3be6fbeb3cda82749054f1ccddb43de4db21ffc40970c8889f47b5a8c482447d02d56601f7b3d6d74d6fa88beca2251a6dccd6b5d23edfc275378f243f4d34bc1a0e342fa9e859ea36466d64ecfc07a346e5a402c7caf931ec86887d5f6872526dd98cfeba3fb4b7332166e0458b8a884cb490344fdebfdeea7eca3d8b9da547e27e96f592818f462d47bb865f1757d06980c3d2d140d9d058657deb2db275a460447c9c9976919d0a0195dea268158384936564b7b9ee0f1f84c810ac708c70d175637b38e563c6b4971c7177456daa85339d726811a6a42523d433709f8fb31c57751bd597adc9115177c64477074c53a993854c10ab96548ac9dce10729752933da03da5516ac0b76cf6672c78a71d83d7024cb7ea2ed9300ce94676f00bfe050babbade5467989504bd76afa9f21fb365cd84d2236b2c9ce0be16aa1bc9829f83cccb80fe638722514a393dbed65a4de7e283ac50dece03da94e52630609ec7188bd619d9eefb03e515154311d44bb7bff9cfa2fcfa3bf93d060877e86191104c716125515a82ae32b6a17c3d6c7295606bcf52825df4e18a7a171bae3d080f921603201f46ac85cca75435ac1f5d4b7bc119478b7a97516579878dec5362198bd212967e23e72f055fa40be85d6a5e549223de62c081cd307cd05b4d654dc28c4e45e50882a10e8f48275b7cb72842ad477593c2c052b98e0c97e02bb319af35d2e3b838d398a8cd1944c0d3bd25acc8599514061a78aad0a134d911fd5413fb18927ca9b70c82411b82c877cfd0d14850f8bbb70f6225aac33d829a849bb55e87c8aeb57d9b3f8df767def37fb874afc61717404fad9e7efb28991fe94ee7d2990cdaf6b7b31506157a80b13d5aeb612186a35c3bc989bfa17c793cabec4ff9c4b56de7f5e2b73bfe213a4b9926ca0edbbddc4554348c0f6eaf9f5b4d024226a388e403a8b8aaa22a02781d03aa84fb8d234ea6397cf9c0ab4898063d1f52fbbdcdd9c4509343db2174c6c01d64a0c99e6d66f95c117775ffbdefc80c9216eb6c1acbc47e0137496d1eb2bf46c391fb87e2b1b92c8069b1c4a6031b2c18f27846e6166e9190e96f7566a8750075fd03e229bb603b4864f6a2677e7a2bf27a24c6b6663d3bb0cedfc2c3348beaca367535a8e078f8e7eda71198be5f8ced1263741217baccef7bfceddac36e565ed2b1eaf6cd7df5dd58558aa04f45bf375fd6d77fc751d5bb65594f13f186e392565c8a89dee9a29759848624adc7338fb6d15955d1bcd6831f777ee53b80031345d78ce891469fa455b68c7c565e9a44bbf5823ae33650050ed9f5e4fdc4453005b57a79911f4d92d15e163de56653f4e3b5daa56868c28fb7e33c89d4de1a972a78dbd33ace2cd1510dabefb798e12ea284db2bddcebea1af35bb5a4d3803b72884198c1aedcdfe5927c5e86940d2408d04fc14bfd294d959441accc35c90fe9489cbea9e0891685e4eecde570897e91798c6168b0ef5954a90a357d3d632fbd2dc5b95507927ade4e599382d5ab266b6c2b197cbee5173f7ae1d81fb1f7a3d880e4112bee9e13d617e536c38b1b2680f15571eff0b28e3f4fec1e1a5a2c712088234c955c56ea5689b94012598086b64f32f2290cffc73a6f538ed700aba37f8fa8f4f918610647eafe39d608834cf7d0e92393da73c819233fb1bc6b1c41dcdb9b90c1eb696f8f83dba77660cb822abaa38d9324b79bc5b3d80d326225511eb525a9549d132e189c79145c29012f375687b692b072482567452ca2af71dd2f656ec61af6094ac87d0007ef2bcc5c05ecbe28f9474dd52086af967218a6ecf6339d6f7bbef3cb896d9709972ed5107ec46f6b2eb1f04ca05a3dd10c666d875b67da2ddfbc78ba42b666a1bcf9c3538925c3059bb602b48c291867d6616db546484f86aeb9411edb9e9657c6553f2d0e59e280a61e2c16cb3c67e03ad04f7e9f1f2104507df6ff3b6e4fb31e0af1a7f6a6f364b9b0157947db53c29e7cbaea4e347b2f2ed03e654c6db83e2ae080c827551e373b3565e5e74e04976c2e57023ccf838eae7ac159f5e5fa7f539f95998aad8d839476c66393dca1e60baccecd4f3861a9394228e21e1c3cfe010ed72007f865cf2b38def933ce5238e3bec65370b63e0838f11b09af5ba7449df6ef67877cd1a46a4655b2b06c41145c2ee79d88934234114f41d591ea63d88d1f8476f083f789b867d493f0fe9302dec3dab27d1594b42e24434eaa1197423b513f532c53ff067d6203a6dccc738ad144479b39855d10f538c87ce3186c0b0d54c808213412a3220089f25c1e07359d7ad55ea22bc4d1d0537968254609ba6defc69db97058e90d090f7f593b778aaa2d2d05a24ef27e263cfe1956e596d7c2ece118da4ef85fa7453c56b96cec126124f79720370e9f5ebcfe975f3b3deb7411c2836e151a8e587bb97e66f98e532829da1d032f41bce29b22eb2991247deb2711e55c0ee8fc89752dff462a84d768027e9e357cb35e19a1111c9b2e73158ef575478c818733a0f941e24346f7268a788c229d668b0c6b9573329c5c533bc74597b0e6b522bb07d09d2e44970ec6f453acb22337f24f4041f2361661ec78fedd1f2852f4df1a24c2e8eb3063f241105b8554af350fae006b342ff08665539986b4b8b884e6da6196ca21f1f3ca1f4558c01229aa0bb113dce1251213e6550108fe6600ae60822516edd96e8fbfe6fa1104f479dc0de0e25ca220645099049e2ba73c12ba759bd708f61b8f7ff920994ffa0188143ec4d3b31f29cd84a4ebd8b75442d6f04cace13590ed3c0a9f5489da4a413c99c5e44fa8ff4738f92f8f1873af7f35980e3daa6561595d79d90b327a9bbc7eb5cbc8bf04ea838af5637ac42860fb15f9e2d79a5f1166da14d1ccfcf7957b37ae78f9898f8ae4acc16733469e0fbe605cf10119ed491c9b23ac1f4f18e1854dcdf3fe1711847286a56442049d63d1fc0963438fd5b18489ee958c93a627e2aa5a655fcf52833500e8823068ed043bd3485f2564e0f0a58abdb29c306a0e9b349df5a51b192d3603d4e883d8559b04cb610d3000d6af8887d72bd68e293fb7d5ddcc5762302a7c75afbfc6be9fd035ce9b96ebcc7f9533698529c315ae623e746411fd0b5d230f40c22e7e81914ad4c34022de2ea34bb0160fd4e92ec01e39f878ed208069c0f84a555e3589f4b2ec9196d8928f09780778bd53d23f261baf4b628847281ca83e7db077723e8faf8222e6e18e587ac53e76d6cf06b2a902a8546a09fa6b3d84e9bf1aa0be082ceaa05d77655aefbed95ff7a46f0bed117b2cfbd799c1b196fb02fadd01a04f910a4d2a938b7fbe9d5e71e56d5c6b5a262d4428f35f2562edb68f153fc3a07b87b89271807b842bdff97d277abdae5fafc1f7c30484ade60b5c9bf8890e46f4d69c761a875ef1a04b548aa513bb5a6676de4eb4532fe2 MD = b77fd3d5f25b7a3c0e42c707a9bdf225a8e842582308a73526ef4768f497f47776c4ea0ac5c6d1933946b14907e58dee Len = 23992 Msg = 003132645e3026f6a2b9d0644c16e5e4d1bf8b53a51f0e1b999bd45a67d193418b1dc1ba55624c4d3d078c44763f760dc68e12e194892fa343dd550bbe92fb035491fa51c76442779f3ecbd7c43bcf1b4ce837d492065361888bcd134eeae08f0394c573dbbf6e3c716677675f915ad60dd6e276c620e21f11af26bb3e60aaab3f2f0a66b9fa3a635b88773a6fc97d06ae5ffb0d595e44a38550474bb77dc120b069b1738a9d0db604aab3981b6ca272da8c6ae27248e1b58d77180be0c78db5ff4aa2e276314efb15d713cb8b0130e33764173d3a67211fd12b8142e2c87734d4dac6fba43d67fb35147f1ae8108f216defea65d9426da8f8746a3ae408e563d62203063d49bf7e0d6bdfcc5a2126f42535cca476622b17ab5abb390f0e400cae29424a68ddbe4c45e31b2a08bd5f24073fa340394dc53591e65c888a62f1f504f76c104e82cc2c84841b7c1b6ba178ba1459824b8da1ca531f356f7e8c5ee77f9567a016bf51e77257c80abab455b9e7bcd4b2d4aa299e980e2f351314f1a9c70a1d42e91db545b863081b0e1fe1af3540fe18fb2ac37809b9302470831105855e743eef23600efeb1c4f83f34ae224da7bdfce997d9214d2a2182be6125c1619a56db4f59bb0aeb47e5ea747b24dad6f9fba5c678d2620d69eb98243497a602c5aa6232472c01282f5137d57dab9e793e9f5cb9561601f17c74aecb86ce7c11e7581bbf761cba5d71f2278bc1ac38de7f9169eab80dc6a06da60cdbde320b3509474e1f6df4fe3113ae04becf8d6eacc4b91482261f7bc34468f97bc52b1a1731614379b41a954c1f6f149530b8098b13ffa5a928b4e60107a1bfd3c221735e6a8d42f6d4f847579c1ca1396b93d125764b63864734d103c03ba40c5d7cdcb3b9b392be54f4dcfa939df1d208888d1ff48597420a070271761df14e1ea41ebe28bc7cf8bc781bdc0bda4c8790fe072495958904fa9541f2322fedc08e020126be8e48cd95ebcda60cbafc808a5d05da626381f59d46582efb59e28b34fc4c9483123e6465b5baff9f2848e67e0c50e962d7c73d7e830dced98316d698fbc9af8030a5e6b73eaa90ca0977e1f475b0fa9edaa20322b22a7ad495d2ca43683e20bcd1c77a10ed65019746d29875ffecb51c525c6f133d75d9f5775e8fbca9748e3fdbea49fa2cb2f90ec7a1348812cec1e6293babd88ab7944312024c8b2833a21238577afc635b2036742cdcb6161cc7044588dcf903b752c64c062a394b42043cce56369ff8261f1735bab986739f6e7c908a2dfe0e3fbc870eb1504d7c6b5bc5872ea56954dc9eb9f394f380921f5f58f08bc47015157a8d414de64f22744fb64929eee4df4544259403b12cd96441a04fd1c9d77f0233e1cb2016c8a4268a16fe8d3a980128ba62024d1b13b135bd5a94a565b9b4ce8f899673063f6c49b1ed8da3b00c234ea87823ba5abc835b7b90a74fbfa01c41388f888dde3ce1a56f44deb379c8ab80b470e19496afb59f2249701701131f23d3fa8bb8c7476b016922d905bc54038489512321f675b1c75a8ed645509b253b0bd3863ae9e972274a8f66e0a2399122cd23d0aba395dd9bcd66c420d7bf96528521605c6ba95eddb8936d8e53febf2429eed278c597a3e521d91ff1bb07da30ecec0366751098ec5b37d655f62bf45044bb10d083046a6bfeefd00027fb599de63d56a031a5861cdd82897eb3489770c79172fd056399f60db1bf9541247b611b1b4151c5f09134e37d6e50b3de124a5979e046743c9a4ef526d4f83109a943358eacc3597921fe182e6e151e74cca7a37a42f2f818d43b5f56f8702032490dd99e7f3c16c99f40219f6f131c932d4e4c9c804ab87daf85f34a11473628c585b154a205236771c3a9d85a94d3c29d09fde78396ddf693f3580908c39a72837465b7fe66a9db014f56df18de6e89849e5e64311e8e08e84f379bc62d7598eda19dcf79a6d0aeb6acd0be903913704ad6161a7329f43d165f370932cdee2369d600a5fc0fbf67f7a1c07da9efeb005779ce123200361c85ec015a33ea2e9a61d9364070e79f8e2ef7ce224d471dc0144f2d5254ec7e2d9ebd3c96b3cd5c853c73e8a9bb7797abc276a1b76388d139e71fdce4c233f1f9c79c91c699bfa16d626cbee6c707d0471be6e243d2fb31f139b382cf651db907694fa8f1cd0625d83b8c5f017adf72e9a10f38cf84e8627273d1c81c24f4fedfed9f281f36ea0f512f9b7401be46a41abcb94c6260978f44fb4256d2e6fee70ab954ba58beb5875da660a4ef7a868e61d4abc6044e4fdeed3bced3f995859d0f373605a54cadb78608a498d296e5594651ae4dbd365977f7993ce89a18cf4876ce0cb20dc91cc553bd2ff7b2f9ac2d519b8a899600fd83ea7f563cbc57240ec8e5a068991b48d94c2dc96a988d22310b1a07239695832a4c54e278673ace1a8ce6b8d0502b7a1cfac03a998a39918efb36ecc3c6db3393a780a943a3a914924a381d913ae1f9b5e4df492b93e53f6baa5803102cbb55e7826b7346798c3d9f8b4397545f250fcd93f0c0c9b87975f19ee612b3d21d304d667d0828f0cb9268d56feec1c8e0028c8d5d651a03de7b48614ae253c0ea0deeda1e2f92114e5b16b324e97f7cf81b195c8c01c77bfa99977bea3b99fd0834f266b6b22ce3fde0d0aaca51378357a29d87e75b7728b617067230e52d9161ed8092ad579d6ec168bf44c9ee90e6e3df3f97d43dd313fb3cbfd083a7b684dc80c0e76be78eba803c0a08898833ac86192813bd6d8243af52e71c4a4addde6034dbec5829a6d024a5db7e73e7c7dd279a7f8309b42dc0bb9fa9dfef9749a8d753f92adce78eb793e9572fedd2f582aea86d7020da7c93086c2ba0d953a2ea2823412760e7ed77b750a8a2601365a1028c1a616aa716c37d0095e7704992aa3beddc6d4af26c197624f65f3570be450d8eadde4fe3a45801a5103d1c40bff2f8f8f28404d0b3a3baab68efd2b2a973b6f54f6f3755cd5b7ea1c42845ffd1c9478eaaf2f44969206a2f27d9a1a1cd35e50b279d8ac63ad3db3dd832534f713810f52c41842536956ef65aa50804d39282165eefb0fe93c800c174e3aef847453b76a1f81b2bc40cae482adc71a46293765f1bee11c57f43d575c2c2bec2fafbb05931a02024b88c116fbf05434a233ea72e872015e3a64a41a0e757ec75335f57e603c0fdd9bd1e81b240a8e6bcbd9dfecbca0f251fb1e82f8c0e2a9ed8997b186540e0190f79c9e658d64ec2c3d9b8637d0b43a7424822847f5dc43db4d556dc1d0f89dc91949526aaa87e3f261f95bf8d72430514120229c2fcac32d18ef889579941ae26b78a2af0dfc0c5af363ef8432897a55db88f069d146ae4f76d6a095b0593f7958ab1da72a29cbc24c7bbf8e755c7f1e5e1d10357cd87baee19b342717c041fa7b4111e771a9b8c4e7912a5c1205b4f7436d1093a4e8a1e7d3bdb1ee1261e8e24deb2df496e449df5f54de919b2dc29d15f96fe8cc0fb776e7beb84f22a68add4af9d032ec71f57e1e374ab3633d2e6c50328cc964a632c8780ea5bedb16ae27ed0d9746f4db523d9e98dd361cac3ee18ca9059a01548a791f3e08d1ae2ad96ece86e1853278d67a6b2a248e29f39a9925ed58ff249354f537bd501c1e6b832e4a065d9247e308c10e4baf401dbbb7ffa64ff54d30daf8c97c1d29f2ae4131c2fa0c59e287924fbdf28debe06a6d2d81a8717928d8940c6236dde4f9d0547be958f964ea941f31bdb25158e3827041cb86d243066e66f65c02602f96171db7fdd15e1d3edfd2453cc84674ce087dcb39dbe2e16a74cc4d136944585bf4f57c6d1dbad143dd6400d79ecdce046eddf0591233e2c97e2c8734d60afdbffc744fd378902f9e0f4ceb0ab067d33b282977a5c435a5a80d102b1cd3248e46903298bd8c7e86a207e56a42a7a512b6c6e8b7bc5c88d88a840fbf47db1198644288ed87c3b684f439d6150beef60b1bbd8436e9557dc9e585839a5268629aada61fb4cea9089909278761e2f0db3aee9e848bd949b5184d841462a9059803971d4f94fec6c541655381d75447d51083cc821ce8a39f3227022aaed83d1271952a90f494878cfc7d404debdc6e742a9fd9d560b3fdcca606823eb54c7962534c509c6a2c75b048c5605425f7ef28f77739270db7b2adf27076e93c923518270111ca5c231bdfb4e2562d0c131473f5ce8ccf6a5 MD = 1c471b3e2b5d06a6382569b12bd43c6ba3c1c7e47ff0aafd51d896fab41a58e00b14250aa556a842161df9f649327f64 Len = 24784 Msg = 2b23382c218197e4c48025da42212e39effa3e73452f40d5299de360705842d4a258c30dfe6f3f92be7e646c9ce9583494489f70ec603f20725122930510bb7f5618ed51f05d28c27682d5ab2c4bf41ab95503a52c0522fe3cbe76c8d457cba9cfcc7da10033989a75f23e40fc304912e78932b90d063299114ca6a7e713b87a93da3ca434d9d842423868d2147ea045a54cf355974bb41978637cd7452ecb192cacf203963830e365ba1b0a7a1f41db7b061021d3bcf3a6fa6bbe01f68e4caf22a866652e36e7a567e21e9038f974fbf11f4fc4c84236661ecc35cc031d8363fb38627302bc47afcf173b0b56f681cd90ff79e77ec3c4846ceea9e173c1b75e41c3acd51db3962a25c03823dafdaf7adf0f5631fe28e6266c3ae2e74e6432c77bb10d3284011d3df247de81cef5482a67b5ad4b4f5ae475a716a7879ced3ac732694d3241902411bc13f5cd39c89204ae5a47dc79400698a4ebc16966441886ed55347e5a46f3cd0e8c45ae245dd6313e67ed8d85c194b7eb22f934b451142b34dc8abeda0dd19a6d1a95cd969c5bd99f4265067ac7d5fc052115908cfc75df8f661699c6cc08a06325afd2976d6b22575577ee6039128d7952dd27f82d85c9875ba1b8286bde06771559642fb84c37f007edee40fe9392cf1c1b9effcc8a12a324f3c307d19cf532525c2b6765473ef2bf8ead2100a03490e695a0a9c1cde16c27d4616ce889941a4480d1465ca460e3e721d40b26819a431a14d3fff4965f69cd0c3a5e97ef0cb9548cfbd586abc44de66f0a06587dee701f60df084d2db3227e62f7e5c6148497e84a531bc9a493b72440f81b7edd559f5d416dcdb5d9071fa3a040095d41253a6a8081200ed6f4aa095b455181eaf9593c7f255412e380e9a28cbcd345be172c40f72dec3e8a10adfd8a9ab147e9022524e1aea74e934807e5ef144a64d381f5d477fe883f080e4868939f41b925988c7d31b1ce4f318701d290f077a3c88b1b8cc89cfbfb981703b23ffb0bbfe5e115af35d5cfff056460d339f660eae45f28d2b1b04d58825367435657174270084822b6c3b4445708aa4fb0d10f227122a40dfbe286400de9fb83a05a6b280f33ad3e7b2285086e9b6aaebe278c31b5ff15a46ed9af9a820247dbe5ad115b0a8bcd6c4e9b4832934425572ba1dd01f91c0501d23ed04e29c5d4b1ecf711c1a9372f12f5d607aa0e2b65b4bfe60c7984a1fb8befb8ef434a5b296e7ee17144345f5b9a397ac9582779b12c429f2180a0b780aa8df016632debcf7b63133bcbf22dda6ae22f9724265692277b73220093861bc6738d4c951a9e4c3e6334773d2cc733ecb89f78f652e98f0d330b19e0a63554476a389ac1589c2a2145ec2b842a55ee86837074b6f45b3047320e0d0821ecb3963a9906cf300cf08bd3e56187340094a20a4a934c54d3fd3b4025075f4cd5c119ab579ba8ea1627e4d3c4202e92efaca716d6dea0ba7a7f5225f80ecf6e150539841b5e32cee456930e3471618b4cbefd6fbb5c9a6e783df4a82e2a40d1d7075e8f8c5956239b05024cdb5a08683c520cdda21523b7f4bf8a936f6398bb4150f1925393fd3366bd985561e60b72e9f13b28331221df168e7aac65c2c0757b67585617140d446b04bdf06f1a52ee7b22f417155a7e2c08312ebcb64ea047aed4fda381e5709fd265d9e7ad00c6271a6e9f73f1f520e7ef300c8a0a10207802204641390d0c8cc4655400c29f4d64ec5ca2046eecf157f6147ee00a0e29529ed29df7e694cb52698e970457ffd0ec1c7466923546d7c64264eb845d52a11bab72698e3083933be86708ba13293808d03e53e5ed0bbc7afea8bb3face4721c508912cfc1e14e8d697810ec9f246b003143d2c43f4487bc506955d99fca829db69e007f3eb6e391164a1860a2f8531c660a49f9d3f820d4602d231add0ebbe604399a69520a3a8f156486dfc5aed7a4971b214a502f6f0a577f8cca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeffc3805ff15ba65de4f8b0dcce44effb227807d951ce98aa91381e0add5216903d9563a747ceef99e6cf95ed5a653ff3808a4b9d54db3490b44c6e7b671a91a85d01bad138b02e340c7a41e9634e777485e9e897f64ae96a3f66e8adf11e985ce86e4f84cde7ac56de5f7c79f2e7dea5b7fda66e3f03005dbbf05645864673d46544e8690d5cae25e5e70e450e18beafa12e4dca37eec093af517eee2b7a69395cea4e2700f77fcca87abef4bfc95db9c8e5a455e7f47334a3f1284eeaa2c3b355ca4967aea16671b081552f0de205ecb68874b456fb5f671f381e0dcaa6ca69d94ba0d12040aa3d83629c9d014bfc70f28185928cecce55ac8e27d4d46ec3846fd51d0c5dbd9457ab8758e7a2ec8a6c04369f9592b00626d15b0a4b0ee2f92ba0d086c16d016ce7b05654b4f9adf90875118a656f2d50011707901982ebb387f3a4a49759f37a17183957ad0c778f6ecb780dab2b4df30e05fa81e6386f38c0f0ba3f37287a050d6d97287ae53096c391d5f20fcff73977239ca55c3657d1fd1f781f48e28057f136d890c28cc254324c8fff3862136861f956c321868cc66609470b7390ecb6ecfc63572d071312e0860efdcfec88c9f6108ea5dd30f55f253590cc6038a66b2646a24565600d17f8c6bab37b7640a45eefad11393a79e45f2bb92ab6e595bdc69cfc210f9f97ada095fbebe5062241c11e1cd0dcae029c3f742ced1e9ca3f6f486d9b5d6ca981a007a396bb5a716e7462642aa709377d0ea974fdd3f67b75dda8da1c75febfaa742fddcfc925e04df158e86669af2bfc88b1c8cc2c24db9399d38bd205509a49c8ba64c662435d47257de52ce04d2c4cc488c4a634e5792d3681093885e2d7e4106fef17114336ee5349f0da8563b6d24496ef0898c8b2873619c8cc7225e70ddd88c34e50a60bb83d3581ebd3736a217b74ae8fc23f36460b06410a44ba462ba2cd87b89adc5a1935d91efd550c94beebaa99984bc972ee47ef088e87e073c1e286b2f26a669095cf9d2e7b849ff51f279116be9ff7d6f45f3c95a5b6590e652f4ccb9849c55dc27d0a46e2dc9dd9a681d0dc6f293af0dcc3676f0c5a846489eb9837f6b388f003c0a8eecfd786d0f9bcd2212692135f2c1707fb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb6ece06c01e54f4bc1dbbc9592d1467c6539c26c8cfe06cff51257e6b6a06952f415f3594876aba50ad2834095403741505b16784225ba3601cff4033e713e9caab6b3239bd5c2c1fcd22382b617f18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a MD = 4d241b96609427aff41b2d90417050e2201b9ff5d7cb32852ba2f51178f7d4f6091c89a004c1a11a90f65d24324e1772 Len = 25576 Msg = 79cb0302813f43ae79a950e0167832923a97743075e4cca8cde4fec1bab5fdad754453e172c0c4242b4e2ee620feb4d41cfd1ba9b90d74472633fc0628af404c5f31855ecb4a66758f21bf15f467ca9ab08d88146934635475e51147e402bb83c0fc5f2093c773c92a8bcb12999dbc0c7fad82188b41dff83f62052cf494b67b1f0caad0d21e314786f519881786d25410c6d05d291b315b0e11a05c624f795b04c92d159137e9182ac5721d770c5497eb413b8c4aaca1a4695ca980361a4b4cf79bb298d7fae2639e659e79c016890099848b4df7db76fcd9aaea3f76dc767681eaff00ac4f66516b3b6545fa8bbab4a1f988473790fa8ae56429422c7f4000291edef6181ebb0a18b18f292d552fde8b07f92312b3737715f02f305feaf213789f1422244f2ab52d2de3cc625b30a4e015a888902d2aeaf1b7c4b21805d3d6f5d66c2bd7cafb7b32192ad7a185052e278d5b1fbae4670c0221af705eb82d722829adba3a777683b0dc2cf1f0bbf5a5e8d6db9097c17204cf97ba1139eb460e99019e76533ee3f62fdeb1c359e54931ac58f0822fac92fbe07fab3eb18668d3d1c709082c0889fb358781f5e3eb4af9f97b619d8b8e1019be424b9ecf71d9e957e1b417cdbbb1bb4c3f632e96b53d265aa7f88ab24d3485f04962da9a95e177b3b9674c3c41a35dfb6e21167b2c6ddf54447bf1acd34668fefbb8991bd8caa56eb5ec4f8380a70acb7c81569936214d71bab37982068ee971bf14845823da9d0f3f0ac7aa6205ea42d14c96f9bca098387168cb3bd05431d0ff40425b5f5b841ebe885cb7ce0424ead5497da1a733e731d2628fdf18df67a322027c2c729385239a2fb7b4abede14bf142b49bdd2262e543686c77c678b4739023dad146cbc5a73ac780a8e30848eb8bfde3ef48b533db2d440a0ac16740c6b06b0354c14a6f3208185e9c5d9d82540d44b1a3cf347f9bf9bc12a0f3f43227eca1a0bccd5aa94a6be9fa9701f4b60eddddc6c159e671ae0d992c414367b31bab8f581251419b79cb03fca1b7550d9f6590cb50d0142e9bd3a2fff69907ea2c56fbd45d34486f46912f0bc26707af910b2768591b06e1eab1a134c6dd1d00e153aebca560b74a392333cf03f953c36c396844e32204b024115c72baf7f11cc20b70b7f3bcd656dbead7f26b558171b6561d08f6cd56c3d05a9d62d9d0cb6758e6086d4e30ecbbb34ee5190364d9e3f9ca0c5b9a04434376f42aac2b4ef3092a4d4087bea443a14ab823eed20ca23ebcfcfee6d8af14589f47cbf7b85ab029c1a6dead4b00212f268e5b19e03626ad8856ba51b7b61229d2bb4aeb89dd4cefa35aab86fe2ccf8dd139534235cbab56e43f0a43400182df97b86e31a5bd0d845ad26fbbde1195e4d322d410dab17a61581fb4647a78afa176a6fe7114e43c106e75f2f3f395ba5cb2b0a52bd6d2dbf76c5f815d6d04e098f8edc352df3820ba65aafbd746a1881cf84a903c31141540a96539d6218b5ceca4f5857d0da303abc9db540fde1e454d2c5a5bebf3617263969aa4769ff66cc402260b9aa60c2b0b216fc342c4f23a16d747cfdf25a03888bc6689e6ee2e58489be91f50b35ae101f6ce1118fe07afa08079b4c1cfb9b0d9a132b2ce161a68a2f6a487473a776db5cf60063b9643ec12af58d238f793227bcf64e5d420a1e4f79cc10c28464a1750348c695093903895ed4cf0eda718d699ce66eba313ad137213a6769bdcbb27faadbd0402fed5dd51c0bdd887e62f1359249e8ce1f7253e38e5bd8d4706b2e4dac3589df6defa216db31350afbdc023e35b768f37d4f0ad74996c19d5cb179819fdc6fdd73be64d124bb6210d32b44c60fb54be4cb3f8a84cb81de1ec34d289dee46fec4b1e83a867120e134850f1d7f88aa2dfc99b2477e8c937ae3547ccff52febb31fa8eb87c958f84ed091c600cd292c7bb55955c6171542248580eeb449dd613968e936d0fc34a7e79f7a0e932179a2b1a99a888af0fe24577fc91189fe6f1dde1ac358aab1acc657dbbe37592ee2b36c43cdc91aae9fa0a03c9d73c5755d982dbfe7df896c29ca2c2fcedea7580cc5080e7395d972824d8b369e83db514156b4c2c729d18e2429b1063c73221f505e11742c8d5c1f3e8185081cc0501482dfffcde1c627ba247ba2e987833df745e5152f490e16f73cf30a2bc8b7a831ca9a5b2bb842f052b3266e64208d7f6256008f7a6996ae8d0608971bf2e8682b612c7386bb1ed00a58b06fe098004b031926fceffec567531248b8535bd10483ef0cc5497ab82b238db043f97e7a453c07ceca1a8908f5ebea19ea6c43eff1bddc91ccfe77bd8640aa8c77191459e28f9a7e836488dfbeba1612b9b14bb3d44ba271f700228d65d467db75ca2a2da77059acc5688ec8464ffec982dce3bb10aff913d0191ba63e712df3cc7700740880cddfec910b4111003c84f249ac743b7d190de483b3a69489658be7ca37bb8a235f9e85787ed8938d27fb6481f66db925aab6a0fa9afcfc9fc6fa541e4072a0ea875f0c896a0d62497993760062061e2c26a491c82217db269ad59dfdbb27e158ed980e3e4d4df1c789c3936f6fdbdf03155e3376f995a4b0798421e2f849cfd0faeff711a918c689d1224909806d804cef5a02a181d50dbfebac9c588856c0e527bd53adfdfc54f2f825f3794429865c1d1e9bc24b846ac769b549e90bed79280c86906dcc7721a567554f391bae65d337124b43c6f250496c14d6fec36c3cfc01e259db8507b1239726a8b3774ab324c5ebbdb074cd32c86b61a0147f51a0e3b0370c71c83c87c010109c9307acd2d331f14f92e56396c6f02251c4704c2971802b24bb06642a3d5aa997321d43696113c99d658953f0b792bd487946aa5b280a054f21b04cfcedef68252b588ccb50d3eb0392e12ce53cbbb910cd72fa9a79b67bc8406625844446c2d2e92a079d150acc3eb57d4cc8a8e3ac371b85cb8bd90de53c9188ac64e2e9500cf60232334010e39b57ce323f9e92ed17fdef8b93e888d8188fa83ff34c4f764fcc81ab42449ed7a5d4548b9e8052125fef20b9370aafdaf8b5355ed3e301cc27f718c13ea50cfeeab590a789f099a26b69b9e309c1fb54398cc0977b4978c801e058128ce3d3ffd69613146651e223c6f82b777090e3da7780da584dd24cd08a22902db1738c20f5d04c60d846c40cff04f615001a01e41f3bd34fe02fc69c0d28715140f6be28c50ebd0b4421a7c4702a9a1a3cafddf7bd084bbcc6b4ae81278c7c5bbfcfc26dc0bbe5723e8515e0d6d388158ad4c08bcd90c44d66034d0655a9117b82713166753246442bd386f87f9a50858f2b6226bd4fad60429e2ab20428b15f3d8d93b95f3c5fdf90bf8361e6d983e89e162b4f28af97a3e0d7d00adf660c65557751ccfb14a2d3018b83b3a93b82cd4c27846b8c3af376c552d58733eb632c4eb10427b575bf9cf2ea1074431aed921dc22602546c415764a193adae4366229ddd23303ab9f6bbe93db21a210214e5978868ba1dde11c44316a2e4aae875d6d75e279cd76bf8ae58f8d11bef8ba9162decc4e944eae55be5547bc2b66512b76fb699c437f625e2c6cdf60ffb121ac26561d326662d2c7cdfdd96de5d23ed52eb78e22cb9031f07c70fa95cc02fda68c28a1be7fe1f67a577048c8e0bbf4627cf17a95cf6fd447bbe506388fb4f7887b9b7f7a4893c17745f7bb5685e81bda47f0547cb6e5f26bd3112ad2af8fb659ddf8e0ee2740dcc580da5a9d3a235c4679fd4560e8ba3365aa3d8fea945be3219987eba385afee6cef614e2768325fadf96075c8cdb6413c2ab05d08a6e025e99790c920cba9a07579d4bf7c78decb17af610b3ccda1c1f83ab4bbb44de625b8bf5ba1ed5ff69ae7087ad422d0ef488c8348304450425ea2c18fd177f1348a96f9309c93ab5e83ca839cb6a3da2d80155d5c0b69be62be41a98ac8d8fa93fd8b2d56e29915a90327d1828d87fd6018b925e6c5327fc989ddd9edc860d0cb26a043169a87079ec405dc748054a04fbb81c32e8528fb3f687f3900f895dba4acdc23b8ece6e8066b6c8bbab7942dc30f731f7c74d19a8c022db10b810183e63848b584013c20a9a364c69b5bce0b84bc9a2218bab8c57701f129558b2c315871eae2c10114174f12f67560948ba25a6bfbb2497e62e2ca0ad389273d9d4bc300cc90b914f334c06029815289525a0dc4a0b859e8595b4bc8dab9c9bfdc3bef8cf6a8b26063e1c33606d0b663ab9b646e901d8e212496c3e00ea1833a7167a4be6e13f510eb86223c934bd7491ecd2812d3c731514bfdf9fd772a9dd6e539aa3e3eb7ca4a1489a319dadafc643458215772a0899f56f6b7c51e3a5ebabe17c8b36e7e783664530f75e3666cdc74a417e6748fe034ceebc3e00aba0f0f876bc8c5044f49fe654c2dfab4d570d86719d266e17b7c383b43e6f74393f8fcc59c701d0a1183c79fdcc74e5711508093201980c14ea6d22366e8b2d2 MD = 1405434caf2b81a133c800119e1016be5f57ea1baf92d681cccef9d27e1a954a2df60748a19243ade40d0b99554dbd81 Len = 26368 Msg = cf2aa6385f84bbcf589e9beb147d02e5d56de17fa8505dd38f371b89de2fbb4de65ea280d14efd2ecd8802416d6579f44b217c8af3317b3ffcd6837f78f3bf568f1c3f2866eff8a246a70cf0faee4c3078f3fb27c4bdd53312bf50812bac2280118c0396e610b4110a22406084c18283a30ce7c0e49c769817170df9be02edb5b6d7783319583a65622227f9d28523d41393c8bc1c77635454093f4efa9f27dcc4252667c670918496cf4724aee3380a11b1248332f6a55111ba70e8a728d8dd849d949bb7ffc158ee502b47de83c80fe58e857deec045759655272f8d4808a03e684a35b2aed3c7b1ce58cc2b0cdbcad75172121a7e4baa2a00ed8b73a5c00c3aadd09f8025cebb297058195d2779232f2374aa7cd7bdd716e3496422e7070bbf95af3fe90bba1b9c5fb1983c7bab02342b12adde74a5e4a328c32263b7e68516486e7fb408a0cf53c2eeaf8fb1784f2f92d48306fc0ab816f4e32dfcbd646088ed95c6abc687be96c294c82070e9f2687f4294bc18f53dba7232edb5a089855badac7b94ea77d2ad872d4ab56105d4271be548ca706d5ad6c737cb58085ddcd7af3c08381f78f2df38419d172bd4dbb48d4408f7ab7af7b11e7a2dab9fe94d461cccd45f0b930675fe56290e775ef056fee73a0a7224fd949d847c780a34c1ee1be547d056cff7b700f65562edacfc57965748cc6c7452c76cdc2185f4461e19d50ec955a935abed67a88bda34c5e5fd7c1b98054271df92b40a829a03284e0d71cfc2b4accb0b5f5af5333ff5b19591d9bb947c9b248c3d9d970981dfe1371218b09ab6069bff550263b359d779f25ad4c0a2fb2093420f4e0a1d013179c372f23ab9235fad7016867c74f08324e6a296b12c4879c8e751f0eb25e1a1f9d97326f488c3610744eb0fc8decca0ba58af4716992c4dcb644caac38bead668605fdd676d5eb2b3651cc5ce5ab4d7442fcb0d78516f44a2a245a519b6e479ce427c3e19d1bbfab9b9f1cf164e72d0c8553c135dbcd90757888708750e973134661372941da3e21f2ab1562823cc3251b14a7f5042323ef2fd59fc5ffbcaa7a1b46ba060b7de11ef9fa6818d428ba6e42b3f7ad64b419179eb02a960e547831d14cef10309343131ff1679cc1177d38bab612b793fcfa6f639cb36ff34d46cb06e828d07796de7eb344a656dfa57624d19fabbc086a42870cffcccc5503a0a63aad09bf47150dd27258a6ef864f4fa335d5051338888bdf095dd9239a240063db000435058a6bbecba1ebcf6b717444360ab165bad430d7d73b5b1e390b00846685aafa596372843db4d76ef5a86e787085532bf5e9cc11f51ce504b8351b787bb26047a93cbcd327060c569b70a8c073e95cce8015d81de176e98fae4eabc078fab6d58b62a52c4619fd0ee356adbcaebb20c5c004cf4c3addeb1771944becfce3210c6691b5efe9652c0053c707bd8f5f51ba5c132c3d5fb66c24a8c2766e55e03154c146899eaf8c1bc3734e2153946a6214baed6961de94df3fca35a5c532966a5721dd7ad8f6d34ed0a858950f6c40d45d42d0213a160dd6e14c8a7472115a3e8c1ed313ff5def27a08982dd5155971b0caa87ce56b465c581a62d4d0550c0105c0ec3dfa2534448cb9d3964ba1ec1c8ab4860db2838513dc96d9aa9ef9f5c924f882c5832655724ba49f8b5b9f6454fa1b2f7d23ef034a1f1194f15a14b7446fef188f85002bc4de5165d5ad19ab6228860b94dfb9aa494c13fd71abaf3cb70c2f1465a6bc9d816e488b3ce816a88e3d7d821a8fe9605789227bf13ad16b6d2340e00d8e6192f322127b88b59f431f6188fcd6da850fbdfec8763bae822caddda8e24fe6f7f46023369b81bbbb645fbb30e19169979ec4d58c5615b0ca67be61f184f55687aa11983c55efa372f39474fc9913e326f5b133f68448e8b204e9d8a22dc585179c4eaaad109914ccd807b3758c24f13bfccf428f669cfd41ec766a4444891cb2b25f810f3348b7d2fb00a121228c3bdd9b652ade65d8988005ad3e5e3307c25dd48b44ed28c4348b45c6668ac4126814baba136ceac6607538d57d7861082022ea1b1ccc56d532009ca32938d88020e8411724bf5b2cfe2a6e384e1b3653de08dc57303625435937eadd12b2c89c0d6218c4856121d319a78d1cdacd1ab2a3179287a9b2fdd5523a15bd4b80fa2fd58927095fdaa5835af27eca491975eb1758f4f3aec94654c511068bf92ad8002066572edab04e0368152a8ac284afc7e3d2ebe36801688959c2a68f4738c8d997ff8e7a1d6d831ded1878a46d98300eaf8e5d9efee5cb39b757dc115b333480e15eb5365198ae978e014f5f73dc61882292346d99fad82f87d78f585da383bea78bb5ab9dba363af5da9904fcd8a8fce5e8569861caf532704ba9ad760e1d5b918c741e2a5a83cecaab3ddb2f156e34a098ad677ddc8b091aba1158cdfe6a1f466bdcda1f00fd1bb47a232c351a1cf6faa81f2116b8037d2e2cafa18cfad2d26f30d426a5350ce85c51333f366f180b9b22961053e7c35654aa6bcfd88bbd3bb3e14349e47f18ff6a37555b599dcc3b2c0df97a5df0355c333a2d2cdc379323bb88138c03698926853571cac62b9e4d557230a85b5bc05674e7ddfebd89bc522f2c2b372b78c72655516fd2a6a1f80bbd5822e276b1cb0ebeb6638ea606a090b6d6739283363ac7839537bc2188413b0dc7b970d678c04abab1a724bd38a7a5f88dd3e4342a4ad0b709b1d05e67e1a6ecc8dc99a23b06d310df92082aa63a589e59337765dc600b98b4c65586c64014036173a6037f057167480a8116d8bf7250427b913fd5e23ecf9e5c95c02dc64dfa9c67df20ce25eb67f5f8d8a957a0bcb551937bea9c3a3204cf5cd63525db1878819e8c22afce0bb9ed45560aaa43fb768d637d8db9ceafde50af610c35e73e251701f530ab68970538d740625912fa3affd4de50b5087d05283b7e6ee65288aa66786273495b58f2df98e1d8ed7380aaadcce85c174f63225fea7483bf84bbaf76ec1a12110f1629e96f8095edd0546ea134e1d9670a2addfea38d7248e5a2db504366368bed99525e4364c0e1903f2de3f512ef2ea39add0b4d0f6409de04d7fb678e07405ba81447fed682511b098f79f5c3c4f2817bcb91d243808bd5a84a7f3edaacb7c20d17ab871e03c6d97a3e6d1e3c833e0c954e951971ef553357dde5b2914e788b8e0492c6846ac83259dfc757c45297acb00f210ae1d8ef61d93834aafd140c1cf48304a350e0dd8e701d8d87a45987c993b53c8dda64e2c5f602740d6427fadf063b0a06c98c8f55859dc99825c295cb07e9ef8aa6bbb5c976e4adc50faeca3a8ed5abd7389765ef610a82718db24a1ad45341e98b04f0d42085e8b946d2059752f8f0fee528e7c4cc0ac1fa24532c1ec29a3a92d2681c4dbd8e2dd151bb325d1c4ddf6318689e3c8e458d1b34cdc5409867e26ec20ec09e15a682f57790d9f4b27c83ef197e11c06e65eebc03489de620614263a51e642ef076f10d017a82c4dc2ce1882f93c9b6350fecc5daeb3a7a2031615ac1c2906516a5810137a0b63564050317a4cf4c88abed901e01de2662617e473c6020cdab4fdc3ab9612bfcaf11b1f085be59249c98a7e1b0c04ae908abf1fdefc860a26862c3251ec742dd9aaad5b0b8c65ad85cc4e5e7615f5709d2c6328a5d41ab980418014916b10ee05ef81c4c9a03f9f12ff74eab1a252c102a79e8f66c152936e7393faf8a66b68d63c32bcb12bf5ff67cf88a34c45cf286778dbb4a068a01047a8d245d632f636c11d2ad350740b36fad90428b454ad0f120cb558d12ea5c8a23db595d87543d06d1ef489263d01ee529871eb68737efdb8ff85bc7787b61514bed85b7e01d6be209e0a4eb0db5c8df58a5c5bf706d76cb2bdf7800208639e05b89517155d11688236e6a47ed37d8e5a2b1e0adea338e4a5c475241f2520bbfb9786595cdba6581856142afeba0777f6f751689dcd05fdf8af79191d6290077cf81682a321e81549981d32aef36cc3627b7105a2d8d10121db8def9b451408f046e03396b469189c596c6c0e143009132407528c7b2ca6b7d52e1807413f28fbf06ddc9607abea97367c279a90d3a19f8d8eefc9187b473138d412efeb73eff6a109fe2f902303b0abd705e2fdda354e24623dd7353f7b14531a60b3a854d686c55f08c1e250ec7f26078765cfa63cc5654bbd35560baad7c05ba2010c547522d9d79d0b72c80d5921881ca16aea109bdc85fe61ff426f021d2227469be544315afe1b5ac5fb0ee54ad3360463f8591806bb61fb95863019a60890f2bb99ac58c55d144e506c3999fe63842d5f638ee050569850cd49868517795fa40fe445ffa55f1844a69e45fdc8c3578a91be2a8b65e1f20feafedaeacdfee3c8ed5789ac778e87dc4d039c77167d508acf6aa45fa3d81f978338b5a155f3dddff865efc5b865f373982ea59c73fbdfcc4ceb94f386c361763a69af4f3c12ae67a58200f1e47fdbb93c8209d46dc985bdbed374edab1e783a5514105aecb5c5ee695e35b79836b10b8ea031c56060c2ed8994bc847d53c43287ca914ae467c4d2d83d267d201503e9230ba5d6084c17ca31b1d47e7a0dc61d26ffaa95af931bc36 MD = 399a7a212c1e8e51e644df1339d2e02006c1dd8e51a0c854217532c69692bec120dff30d21869fe26a4f4a0d86ebae3f Len = 27160 Msg = e881e908d46879ce673e7e64f8d90cdf5497953a9ee75df95a0b2f0dc41c4ff8664eaf31e97565ca2cc85d5093e54bf3a216e4e6cad34e098288d5c69a98df38cca12293950214c0439aa3474ed32772ebdf95b0df42f537919116ed647980894302aaf57e156df7d43db911d1aa87a65a7b0e5d863d3acbafae5a4cc9c71931f3faaf214cb958b908370576c37252d51471b9b866ca050c036809a9728b9179031099dda8f3bd4c0612f13ecc3472484449fd8828f43e43b6468bcd06cdd2a99ccdd0f23acd84f9f755e43095f7ce47108c419473c0cdb8efd148802e93c309e5b8bc28a94e960803894615c6c34e19a0c1efa5f0389ab3d78fa98992e74ce10759c6469d7ed9c151357eb507a0da081d706e8346638e7c960a14b2d9d0557829385416c066366c0ae1f6d8fe975a5aaf2226f61e498f5a53caf2c1ac57c61774ded05eb70d95505516154656afb6587d5d7fc620f386973755ac7fb282870610d2a0e72d7cdfb65b5a43c6b5f1d64ab0ace1baf3685c796935a8b4945b818d249c2e79c8b9fae64438e822c463a3786f94b49c40b0f74911f25028f9ea9af4d8c5e0dc30ced02837356c202a0f0329e39f6032aed4414e59120ba28a36bb8255d420d70ec248c45cdb38898ffddfa734544d45e6db21d2671f40ecef47cd80c35155330a9e4901dcb1b2249d342038893be39c8fcd7e1b63a159cccf25b6364ac4e6b8cb69bd29df3f43bbfabcac250add8b0152b34272761ebd0bd2d960ec10b63d2efa2b8b828c0e53144e9d6db6e1c1ab3ad794541fc820d471a16ab1ea40afc15d3eed9b550ca54bf942df4a323370ad10c5789c6a802e06c5e4e093770035da0d40b6d5e9878c91307d8b2ae32b70f74bc567029bc6d1bbd14243eddd78d2f005a88e2188244c8f81a8a9f70fee4bf3b37e6a6ef9c48f5b5b649ca662d20d6b0e1d7d67780b6cacb66b3f98ffa788070f9988c8cd9ff34e2cf2f2a84f336eb4f0478c8f0265744f956d57f5fb7cb09d29bdcaf85f8282fc0c934edaecc57e3173cfc2816e5aede2e857f8f64a954a1cc79336e6f793c6cec2efb72480b0c44b5e5d282504115ecc75d02b83361bdeecb2c2d77bddfa462a18af356e551cc96a7b98c4630cb34f750581f7840536f575b2f3b29d58e08a79d47bd0a0b13013f79029a024cd6748455f1264e1000d161e8fced135b26d1b24bffa91a3dd142c5866b7c44e9056d2a44d2a7a826fc9c95110fa3b2c31c88091a1d57f5d21f19cf7c5eb36cb9da774fa9571424f9a919676fe20f8681e1a412a42b4a3b7c4efe93b756d00813c83b7af0091c331c88e06f321e711d3c18ae756693d039910359d8b3de42a5ab512222b562f050e43e8a03141f88d546141f97ce01ba9ec4bec3f51e6f9ba3d4f7b3dd65ff611d051c6ec9826fa74d24766ff066df49d96be3b58f43953ba1153e79019e28bee5d3b5073919796ce37bc22815bd971e581b14b6fdcfb9b31c0097da45aa999a49f49b0bc825e74a46a069d08e3eb398b936b430c71f7782831b96600027ac63c7cc20b50d4413bfd536dfe1b066df597b6364cb81af493a64cabc92c7a1ebabddef08cb5f00994e2da3b6e432c254c0fd1588ef942b993b3f927cfb1295d1e2fac1958753c7e265ae7b61407bddde7fdcc1a305a4e0f21572074a01676fe9a9bce869a1822679a6d622819ef215b6d688fc45b60a7bee59ba9db63e3cbcbd5082b7f7824098d972333d7a483c0688759019e3695b58e86867ca441a18f8a787ead4b1a2359b9c685420cde4c03cbddd70cf0ea80e047ad21821761d729042a053b34a99c79b1ce9a770eeed1504e16ea97019ea991b00173a17bec0d030194a6bd804d18d33d596bbb27fd9a10b7da9a8b1a7b992e922b84c21a09cb84495e681c782d1ece270cfef49d3330accfd3f0ce83a9d721b5d25cce3ae19a14a32f543e647236d236915d0cb9b71a8a5ea7f349844febd0e19f04ab249b011bd8af700c8c43e847319090e9c3b2e0142cfeace465955ea5de39834320608901b187c66e37c9bd96e1b09d75034b0bb1008121886da4b706734ae17c7558b82ff35f5e4daf2c3c250e9a8e96c0ab22c8a3d75c1be5a47e5d6a7726406daa190b69de3e8f3a93ee5d7ff66b3644f9adc3dea9658615bd3c11896a5b764e7f31fedaad701e212659a6fe6b3a3cd55e3509779f42b24515778a99cb880661fe8a710d74fce0ac0f076951a10590bc0241023660fd86bdd7ba306141b3d7ee50abcacbdae8bf2273800c4141d31a410c5916e5959ee9c4298a6bab75e6d33d9c1c73dc873ea2cd7d4af996f3adc2aba505ad4ae52bc5a43371a33d0f28e1950b66d208240670f352ef96185e9a7044f4ce2f2ff9ae01a31ef640e0b682e940c5105117594613dd1df74d8f2ba20c52223b045a782e850a12a2aa5c12fad484f1a256d0cd0872d304e885c201cd7e1e56d594930bb4392136fb4979cc9b88aab7a44bfc2953751c2f4ca57a8924aef0b92248a45a47052fb38b86ff8c6aeef9409f976314300402c7aa177f6bae841073ac86540cefd17eb1dac7b5f971eebbb41ba2cd37a507cbf48b42994e73e9c5abfbb76acab48554576e7564bcb771363b9ed40239bd66c0dd768e90da7cc358899544af3b9f09facdd1f9d47d445db4fbb295c9c47d0929abf3632bb8d0fc11360493eb08b745b83c8bb9cde3219c7b1fde4dec7defd94e858a293390777a38dad00ee5d80521d5cc221f17965514d3cdab64310e1abc7694c44871097a27159c7f1c67548f869ba42092793fe8af062d9f42611f069beb002828aacce0e9f0a59b2437245f5a50ed0d79bd86e3535b69444f4457bc5ff3f03f32a981b1aa101dac901eef7d873dce6f3ea9124dea19a622f4a15f43eed78c8fcc35cff651be2b38c7e45deff3aa70d048068c2e5b890fbf9741dea332dffea25f155eb6c642f7c9315117bf88defab7ff9b9b8e8ef3c9a5a2ed7de512526b005412d7f9f1e4aae6362dc5f52c2395adcb32e8766b9fff5c7b6be410757afe2f11f4e2c7baec6c183e3f0f97c9bf693914911aeddad4d76a8c83ba2c459ddcb90083262909a164e5b1509baf46fb9de34281dafcc3db79593bffa8426904302688864c26c64cbbd8f72814448b1f5a33bdcad0aa0efc0eb1f2a65558c9f720fc10c7fbc7d9359876788f205f8073c7b2ee34a3ffa37fbef8183f6a794dbdd4c5020cdc132aa424499d4d67070d3f0de73b87fc036aacb0b814938eaadda07508c51e9712a1e187d8cc2992441aca535a0d8a82bf4ccb0d78506a6af561e62b4ec1c5d3cc2733e8ab6eed491e8f5dc294cd06de3a2f23fcc1338ba561c1d81d1e5ec8384aa2e46f4bec5f339e5440821ce1c4b77cfdfda61a25c0e8f6e5be740004f16f93fc3a463fac48f9cb51bbba7ab389b68e9ca1330b8ecfdbbdb5e0577c1b0620af1b7e920f186f43ae6f169237a9208377f657ca1cd78125bd1a85ef1b0bd0f3a7e9f77e44979eb84d949833da2d50c53ff16793d6669e6ffffaf764643c178e824cef2f65909b00b2a98ac5eba6e024ef7718b7c0a4ee60893f7cdde017a39c482eacd0fa6d2fc4e597346ff37c994a8e6fb45e63f938a165cf5d8215023bc3017677878b9522acec44de5a791643dc24c081af45ce46d99b94e27c8d66a9abb60c987ca1703c5fd19ad0ae05dea685ba54c8d3f089deb1317452f3d0acb3fd6fd857d9c36645869c8051921f3b89eb5612d0f2ec94c9d13159f70e643a226132c1fcc37adf04c853ddab2e5095b5b603e2e332bf55cfe0a22a17f6d37abd7e09b2ce644d4342ce009b24ab1f55f38fc6ac47bef336b7878dcffbd3a5d24efdfb9016e4c4fac73faaa1053115e1091ea95845bc109d4b6df92febcc60ac9b8510441d6b676c5bc45ad796e7b8a2bf0ab3cf25559cf4513bee342e098e6f6ebf51b62820bf02c60517251ef69300dffbecf72fb021a2929875c50eb3b6838d53c5ce822b5322cfa9e973e7862b642f9b5db9abf6260fd62d94cad1f26150c0e8757572b5ab354059d8a937be0a34798f0dfee04e34a3e5a1552cc0ed163ed12667913fe650a4dfbcedaf57c6b7da838204ac17e1d2c6869dc0d123cd5db586b7a50b32e5c9d6757b2f6d8fc7babc161a4bac98d688e083c9dca242b9be1da94037cc93db9e32c93da7cc26e99c44f9ffe9e7ab56de59a2ccb18764dac2de006c23bbaaef5822a5ab5bb26653e4d8f6dae64498895d99ac4f4769d358f06054e073bfbe4a7e0ccf6c5508952e1ae2d3534baaa6968c0868f9a72ed55ad10b6c472fc21813985a10299db7fca1c6c959111f031ea6f30fa073d8c0b308eb4812475dab01732f73308a39a6e3d571f550bd6a3648e01b141a64e205b58bc97d0c880762bf92cabff73633bc91f1a2ce80fe352b6c6d8b819f75cee7220bf01423b334ce9a97f1a62dd693e3501ee2bcb07d87cad274cbbcf74ea34d44afea731f70edd9dcaa2c9099115f026684b827aae268fbc21e642fea96691e61a03d04c866396acbf504e50490a1001c4aac7734d4e0a68393dd4040f52844c206742de63e206ab19d000d36fb60c7ba99461417fbf8b35efabe59c015e9a6af08145840a0aabfd4cda971f7f9a53e88980f661b00b70a9b7b90e1349bb32c6fcea7ec9f32e0527dab85770f32774dce708ed6078b26938240da4062328fbe4c81b551cb9fc90bf35f1e88454fdedcd3484bcaa5434b375a6e24dd128084448c49c4ee8c8d6dd28012fc0d62f8e2d3e049cfab MD = 4f20b8ac2926e6feadb98e36c9eaa74b368ffdb545a83323dc0cb862378175e2adf6df26ae3bb1c23cafab91b6f9c198 Len = 27952 Msg = 58f70bab24e0a6137e5cd3eb18656f2b5ccddc3f538a0000c65190e4a3668e71a1b210f82716447f6bffb1ffd73abfd0b00a7a61f978932c95eba7e9adf8c402517b2a4862e74ee4afda25905ef59e078eea71b93ad617c460d2192063c48e19af7cdf039bfcce299316b706763d15b83d9547b1de4c95b06f2d6eef8f72f39e02daba919bfccb365fdbefc9e7ba2bcb063287b0ac8113d80a252cc0f7aafc7a93c0405a2a904ef35b5056417915e82831e9b61d6d1e9c2479e2ddfa6413b093aa54fbc70f605e48ce9e73d7f3f654b706e45e62e9ca357c038b08059f5517d28ebe723e1413031d02eccef11f047861cc4806e6e82ee8c8f24836496d19391f89272d28ff51455a3d63f0f9c3e85b0ccd40371132f2bcf08c43ee2e99071f63e1b7b5ee99c42de7c82b6055a84a05a14ff1784b8ebdbadc1aa1b81ce9c6d084df9591f6aa12c2aceb6ba66f96d07f099b8651fcc637e874e38d1c7b27ff546ccbea49aafae30d91ed4c4bad5525d02af9254a8ca00950a1312da3b31959b401eddd667150e0147f18f5d679acef00eeb0f7ec64e5dbfa494aa9d42c887df72d8c976fb276b0e15cb28ecf3a64d7183c0a23beea5d54ec55772a384e3b1225d7f23fecd732fc7c120441bf5745841ffb4dd14987cf1d30ae00d85582fcc147e765fe65474d6ceb8756342d3a179f1d15c22b13a304dece3a2ddab62e913263442efc636a8fa738a5f08fa14aa2cf1b71b156a6a7c53ecce34659e0bcc30c84d895606da8bf566b52197ba3efaebd1ff7627d8af9d8e53490927c5d925af7af8ae1530c69a7208a781a20bc910210348f1cc64503057c0e295a6cb31a1e9dee425cfcc7150dae9ffe3ba5739867715f212959612c16ab6095e6506dbad7a348e84c842614baa7b1ccc432516da588aa95cf5f66dbd11934be7e5110dc4cb4c665fa12b1ce76b4c9cafdf1dd7684fc1cd35700da7a006f918b6a9726e746766e9faecff1ac087deee02e089f1ccc76bdc409634770695480e4f14937438d914a7fb0e26d143aa928f69e9f1fc7449d964e2cb13425d57107b15d8fc957e9ae62ed4774ad6fd2e17ff496dfe6e0b51aae5a0a112a010b6e31daf492668d2275bcd2bcad3a2699ccfcc25eef7bcde7940ed1e9acb06cd5f20348ff7a954cff8d621457b49b9f5713a6483ef866f8a2b4bc9912aa4ecef9a587e1c56fdffd499f5c9d60b25844d45d866f7e2230c7ae22c29ccd328c8f4030c48e9098ca06c852b0531fcefa7cd753a21d659460a4d28528c0616cf317723bc238a61de0d0444f6820dc3108ae2a9d043b3c777ef6d785f4ef18810ace576d8ac55027a9c3853d8cebde020a4493e2b4b24bf2122586cb30103899591db66f231fd6deac4752c5229c6e6a89a5dbcab868da2ea599a5ffe30b0adb696a59e8952c806971c5758f341ad4910c39caff1a473153beb9fcc916c8d670c11e0681e9d696f080a3b442c94f589e1b682726e2369888e6ef55cfd02ee480eaa286e226035f9d624bd886ea2242ba3e9abcea161c56f5a4a376bc19277b326a5da1b2549d24969e23a9059e7bd90cfe374ff0c0e3b4c3803b2836f99be4aecbb61e9a7c8b2d03bc95ee64ed4266bde2a7a9e3e772fa1a022033e57970681d9417c741a4b5c20d4408714edf5f31f47352926994b17021b3ba5f73a08f4da74ee76250d7032bdcbfe4f8697dbb82da37a1d12ace885d011a71748577e0db73808db86e1a5daf97b5904c5dce3ca197b8fa30d09ddf0be1c0ae39c6044b5caab273914477ab9866ac7635d3dacbd5527ec67500099ec0ea2bd777db51b916736d00b579f5d52c722efd7a73aa5168330f6e69641badc544e556f66f661052f7379cebb69cc3b4e3c28de5e445b4a063f558d4a4daf4621676917e28493a585d9baffca3755e77e1f18e3ccfb3dec60ab8ee7e684f5cde8864f2d7ae041d70ce1ea1b1e7878cbf93416848dbfdb5214fde972e5780cb83c439dfc8aa9fa3e2724adbd02bdb36d2213c84d1b12a23fb5bf1baae19772a97ef7cc21bc420b3f570a6c321167745f9b46a489ff8420f9a5679c1c4573c626334b60296a39134f3f1bac26e51659f7c74521d79594e604767fc1339b9d5592fb96e0702f0f910221c0f417d83ad2ea3887c6c287c55004ab60418d4e64cf943a62c392652612ecb1a2ca6175555d8b618709b75085fd6eb6c18385f87a929e6247900cc72d0763512995a046f6787fc4eb71425a675ca72b1c1dba043f2d0615bdbc4baf74ed0aa2ddfc60c78ea22be50d83d03fd9dc426ac856961c331d8fc72dcedb98ae42470938551f719e79144465b80d6b6e1ac5186ef4a68ae6d28ff9104e391d3985ad06b13628cf965bcd659c9446578496a396684e67dadafa8b2e2da0e0a79745a12dd126394c16c8bbcb0a8f079ecdce72675cea66a68fe405d8ae6d7ec25800c7e1309bbd81805e63d7583eedab9a20962db54f0f68662d847b4b0a4fe7ec3595c3280d21da736b5a3cddfa55088a3b934bf9e2de8b0e358b986c1de092d4527f365ff102e1509e034e2467da301e8e0e34935c6098d8aa8fb28a0eed5d90e608cd20fddd20b864f39dc3fde9acb7864b8a3a02121c65eb155c3d53a2a2b27ea6fa137a1d031b4eaf9e35330ff8f5b2ffbf267a8f80267590f7fe92cd0cb97afe4fb00c4f12e9b9abe1d08db98f49a27f46113c255eaae897083632b8e6066953308f1aefdab4345ceb5e9472ea33c36ea152bd601253a2ac1f8cb9e2e929c86a3ef92c7bc4fb5d472d17bdd884349432739374ec55c14224b05aaef760b42697dd96b78f5c3f830f29a4803707dca35f1f3bf916737425b53d386852f7060250aed052772ae143f9637d722acf9c6f6916b4c07af5dcebb248aeac8216cfca48f54e73ef9b912eba6d0b0a3055e456d4fcb65186777bf2c05515b2013a520cd57359923538cf91b698f5cec43554f827238932c552c1e953d5063f5cec3d388a9b9a44048ced1b7289a62672e85ed1d44dc5dab4325f2dd15b089af1b6f1ebdcc078ffb9f27a2a62b194a7b8d9726260bdf4bfdf70a43eed59955b6c05107540949e2be224175d2ba359d8f2a3203851069e58a39821aafc532507385109936a8a426f097c151221d15e10dcbff8a239ba0b4bbd3357e082ca4014c3454d949f142e2f8c7523f7e9be3a15c39a5c5e6f3af3ff68bcc77e15416f1aa93c7d1762b4b9e407a9a46ce7ec462e43ccdbcb762bc0ea42bef0d2283b1a6f66c0f88a6a0e7e22f77416efa0ce2ae0d9b1f767f2ef0aa2e794549b4029daa9685d406bf963c372d88f0bfeb8e650c3f2042fb24a0729afa3e77327d190185f4a6bf54aa567524a2734f42874b7505e291df5390006b6672412cd0660f05bd769977795028b832f60105feb78d38205eb79d87a9960297fd4c0d2c572ed3dc8625a57d98532de792fabbfb649ad9e51b5a259d59a960b40225c24d39bc906a8b11f1696921fecedc26184274bc7edc82421ea08683ac45eb95f23cf20267eded260244add8506c3d4dc5dad138508ef93631951a6a0fd31f6445ff6c487eef132c81164bc14e4b1e3669cb61597682e9000686fca7b1e5065a65a08dd6fdf767eb15e72b241df2e5aaad1e0e661840bb66447a1482b903083ff7263ff30d8e502a67c03549e8e9fc7139dabea66051d531947a4a424fb58ddaa69a69e8d63a36b31fa85177d5b9c953b4075b62743ca1299d8d86319d84fdf41703f3fe7f86814ce4a867f80ce9b618c6aecce37c89851508bbb095c8f7c055f569c47a30f79abe5ec75f12b601298718d6f96ea1c1ebbe7c0cb0b7fb973ec5e6d5c6a71317e7d0360d210efb898c695287ca4e0a6b3aeda2896edf5ceae00c924de0cc4d6dd14c14829534020a46861cc927c9e10fda682239d355137a0cf1a3dcfa300981c1f89f2fa4cbf40cbfa61ca5f8294b3533f7a325c56049cf2b3ebe87fd1c6ddc1d9e801b341df8155f91fd2225b47266ad64cd532d49266fa6b98d58cfd8a1054e045f4e2e7037af8e0e654996b37e29b07649cdf459d1e4e32bb85659acce84bdf3e2d17b0dd961b4e7fd21346d9707a4f4bf9b00d573b64c5be78983e01ce2d132b4ab013c05b339e26cb2e52ce387f1a7d6c33b08336b4813c1fa36bbb2a6f18b7be4aa44e32e85c85a0492368d31ff57374f8c393a8d3e19eeb05886b95887c4e0855d6f9c590060712024d5bb8d36cb8a46daafafa4983617b3d28a5881faa68a95020358bd1374560d814e9624ffcd76b10fb3bb36bd32e40c8d0cb8a8b2f9221c80493ee024cab4d393ec457dc023a397128d86cd15d5fcc27057005517854f23c189774c9d2c317b40f6f020e296ba00cb8537f008e708dd62b259109111bab0ac0b2a89e460750b72b3c196ceee63f522e3f728fe2faf664d64eb6288670ace2916801d632e298e106cde66ebf3457cffeeedfb5f769a6418b6ddd2644de88220f3a1928060f509026a6f18a06d09a04aef42f3938470dfabf058e98d8cfcd679ebb470a5bc808630f29d3557235666eb2e1d980221dae0ee5a832d6becedd11c44e23d390c730c824f8f4477ded5d8caf3a7711515806dc93b87286634647bf2465283a41675a4e0c76fcd68662efdd08607063227099124dd8b62e72e08dde13b2dc94da32f5532a46258918308dde32e66dfc3211e51e786b86254a082fed2699a989e7a4927602c926e5cfd0b81ec35ec852ec966b7fa7f36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa MD = 3dd340c35dd5a88967b66a5602dccb8ec44478d76662a1e328ad5a93ba16639ef7da57b175c9bf6fa2b11e006dfa6ac1 Len = 28744 Msg = 9216bfda38412a0f70511159dc73bb6bae1f8eaa0ef08d99bcb31f94f6be12c29c83df45926430b366c99fca3270c15fc4056398fdf3135b7779e3066a006961d1ac0ad1c83179ce39e87a96b722ec23aabc065badf3e188347a360772ca6a447abac7e6a44f0d4632d52926332e44a0a86bff5ce699fd063bdda3ffd4c41b53ded49fecec67f40599b934e16e3fd1bc063ad7026f8d71bfd4cbaf56599586774723194b692036f1b6bb242e2ffb9c600b5215b412764599476ce475c9e5b396fbcebd6be323dcf4d0048077400aac7500db41dc95fc7f7edbe7c9c2ec5ea89943fe13b42217eef530bbd023671509e12dfce4e1c1c82955d965e6a68aa66f6967dba48feda572db1f099d9a6dc4bc8edade852b5e824a06890dc48a6a6510ecaf8cf7620d757290e3166d431abecc624fa9ac2234d2eb783308ead45544910c633a94964b2ef5fbc409cb8835ac4147d384e12e0a5e13951f7de0ee13eafcb0ca0c04946d7804040c0a3cd088352424b097adb7aad1ca4495952f3e6c0158c02d2bcec33bfda69301434a84d9027ce02c0b9725dad1186ddc785e2e282eae23d4be7a8a7f62e390edd97c0af1ba5165900828e0630606f83d4df5240e1b05c307ee9153ff52c3e316f75acb9806ab9a24b5e6500d1a9bce003c7d8ae77065870ee39a8584734f75c5c36d2f958e93672f3b5bdd9fb2e0d56d6f7dc77bd4d75730c41d87d66d8e2c41653c9fb2f910b4fbc20ff0e379dbf6cb0b7d4392f0611bb7b9a2c3bde989f1d4065081b5f02b69ce7189ef9f14961a643b0566f46c0ebbe9ecb2a0018f46adc4ce2f3e671aeb6ff17051449c2e19277e259e9868efe3200f82d4866906cf465ae4633f902058acace8ef55a26d6a0762f1cf41b821ea3070a691ddbff72ca6de7174ebf8a97a094601eb8c797993a058c821c9aaac2ad4567e700ec90963b3989ce8a9665e5a6e09e2ce50e8fb9cdca7d21b980735abf50732f97f50e57e57cf8e49e3a4e6ffc43bb42008b89b8ba19936451696677679ccebb4991b328478cd6e1e0078eb71f1259e671eb1006ad9741d27ac21e7924aedd12ac4f4997e00d865f068ab12b9df0fc92df99bd3406b81ae4ac06e60074eb20be269a1c273d6399b46820505de74405cf9013ebb163f081235bc4778de6f63c264eeeb546be23837a8b84d6ce89a0280549e6261f33d5170700672d71e93471d39bd9af86f0c1c629e714deee0389b5dc538ce6cdf4da3f18408b726cfa4a745e83c7655853c2f43b116cb34cd36541ad4374b85e35748bdf828e00df989cb61f9d54614b85ab703680d90e6b77b75e00903a154054386fb54d0b333a52afb9af5efd4dc0d4efdc94cbf64aba6f146d6ed0498804ff9a6d32167fa41db6f7f1863f1e6568e0049bee4940e2ba37f0f2507a3f7b2c961ef6ee5557bdea1409e02cb4545294259e309b8f5580fb50d17f4df4688917a64abf42b01ffb30185a280b552b9fe313f12d4504808ffe584a76cfe5711c66ae8208d78d54d680226d1bcaa800a7d649b1f4435f6e7a23aca07b5eb3c5bf8a1d6985f56382fa4ac0b74db3137ff4de2565283ee68bda1bcc87ff62e5f2ed0281759954c926b0f081dd208d3df6117b356f3b9030552a373665757502652f60691ab55e34cca521d42356917e0f882e0854a0dfc346d51688dd601d8fb8e11432ed8c7a1cc1415f463e32685a38c3770ca9fa8625fd853a223451c4e45abc9e8d52715117b11ff93692568a58ee5dd6b0c39b2bded59502911eccf3b6b72c8fb6edf64b8c188b9043a4357000aca1dda3561529346b9f10640134326d7a8b387e049df200743eb4fc0851a1d80059fc42c5fb06ed2bfdd409702a097f018359115adabd0b3083c7ae133da84565c0a31d97bf5d5f835bcdffd000d161e89f423f453f3502fa0548f8794bebef698072924fd495123e138ec5c57b22cc9c298446582dd29e1d3dc9599f1ef52c6813db5f52cd369b88df76d9b4db860598ccafd508391e233687c95ff9294c830de55dc3451bca520ffa16da22b473b36af32559d9f38038c29db96a1bfd6a99a79f6a7c9b42b8dc300dff159398644c9f37754351bfa1453dca2a067c0dd7c6e18c91c9c9d49aa09575903a8be9e0378204102fe42fe9ef24a78bb39dcd0c91384754696543e835bceb6aa7704b700acfd3a68e15b6d29d03b06f0ff5dd719f185a32a9d2031a01f2b9eefae51f7c4ce53088dc6ad6e3b5577f446a1891cf270e2fbd29a4b4a8abf37bbd835ee89d644ea537996812a5ee9c5e9c607a9c4dff8652445761bb3c8a1bab270f42393be788ac435371fc919f4ee8d771904fa65f1d4c78b17d991e22f7c2ebcd3373e05d0fb02c893cf72f4debb8961c0e4e40ec3f88bad67cc0f61cf44d5c6bb74b132b604b63a91d94d780ff1858ce28faa61d69919b24d3e52ccebdb4f95922015cd916f88941884832cf05b2801684e75e6937f18a2b07585abea0a45314284915ec9021fdd121a3c99e7c01bc73b696d26607131857abace8734975fa3b1e84e6ec686241d66e19f455de706e64128b9a8a6380c64925555e6314a44f2c9937384efc23e5cfc22d5babb998f6764d382f4ce9c5046e08e435349ed9d2670cf2929ae8016a3bc240580679e61518bb1ef933e65a6344cadc053e446114890e298e46a8654f98e31581dcbbe22ac9e0b290c605bb535bef9f3706a1f495e1015e73d8c9d9f675a8ff61b4dc17b80842957e79b4626511ebb0531433eec73d8b03fbc7a8d9ff408870602576e13d62753a2ad56eda090543c1e1ed76ba38cd0fbc7ea9d1efda88061b158508e93b56ed132e5fb19ccfb48c164c08e7016b3e03ea84e5d18618baa651ea7a0e9a22641ea2e17f1925199e395029ed114eceff0c00971234272a66edb7676ae47e93088e8becca020d9730bff1e41061ece49e8ca13d95565d900b50ae04ee4700fdb2b110c8a708b098fa946e12f975763c7b0a4ed105d493ea1653b85b6a92bbd2f13ae3ddcc99a8bf7a6b372f2ea8754743096c19ea1b6479268b68c3665429b3526067c47131707b3e88ef9126976485551e8b4098b749fdaa4c31e56817b50f44d63ef55b6c824c9591fa0157aebe874f9e1f0db814aec8103aa639f639f8574710bbe8d1a758b43e0ad8d8587afdcd811ca9d9bed02d7906cb282987476e1be78471277a7e8e4286482e8e9f78bcb8982ebe2d23662070ec624a4ca1cc70dd94c5f139cc6e8d681cfe4daca32445d90328ce807c4332503fb48f0bbc45cb0cdd39be883dd3c0955081c8bafa0a53bf40bf5d7c2ff3cd878f2668ff5d2fb73a3f743bab556ad26acf7712220a9750dbdf46ed68c4f47c97393c6a800b06dfe629e9eb0b89703d58f842dc7a5b57b7af3d43e0deb1c1a9fffc6b06462c479f812b2f5f3160a06bd049796a4c72c802b9f95aea569ce7f0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7f877578e97e18119144cdb77f7ec5c11141b86b2179e98eb5f2a04b61026235963b3288d41ea53e011646758ce005d595ce05ac81cb5df71be3d3fa6560a5729b284794deb31a9573b340c2a0e149d245cbf224335cf5f8c9e0b89ad9b31fde18df33214be3fec483bc3b337e2b18439bbbfc6698c737f03a79dc81107257f479b063b2be29b8579b81a45c5705e7a6222e92e834629aaa082fae61bc16d432485c77cda7ecddab25b3fa81de0a3e765394343d88e794529d72ac913f291b33ff23ede68bb5e55bdcc3cc6875b08330ba7d8ebb28aecb9674d365b41c11935628b72471fc0d55d61b219854a0916c61c15ad0f5762096e228d2582ec578e3353f86ba045b6ba5965b5dccfb0115409602acc98103f58cc223fff285edb7814dbe031d223c496b3927e8f8bff9b4a629f8f3c6c2549623c2e0acd34dd765d40c2eccdc40113efd2b0b539a180d1813aa0eb0575dea7ae241096968eb250c71fd0c3465d27ca501e8702e3f87bd980fa2ce730998382c5ed8e8c621e25903d19cd0da487dc123effde0b947a38dbcf080b2bc3c25b012d00719439cc7d5f48968074ef29691343dd7e7b540efe00f7ce055ec9d7af4d70c38055248004e46ffeb29e302a16f4e62030f82b9c176f7fb2e12847c0c78d15a085782a2200483ab92b336f742bdeb030ba2a220dc951ef1e69334765ebeaa5fe46a4549abab2312fb3dcb2eef0f82776e4bb40475dced0796324d0ae638ca7458d82a9d07a4bddc812410380ad6bd55878508e331b0da92b98a6eb83769aa3dc20ba31ac883ac5ed0f096912a95e423f3c9412b94a37029cd05f9fcc6e3c222dc7f3f4172ba8710474dced8c2dfaf494fa2cd6c233736334d3f7f471919cab9f4cd5fbf7acbd6a77076495d6816675bd78c3e2341fea555b6817f25a28dfc69a760a4d3653a037ac91466bd9edcb4d247fff3cf954c45f795967a26f7a30fb860c37f2ba687a600dd92d777bb951022fd688eef71b280af66c8e0b99d1b5d3ccd707f36d33726e00a9bfc0a52c1f1e4847070018bb3edd3a6a3535be7396d5d29f1f5735fcb1e8efc7a44e408f5e29d6982478427e2f60ad1a0329c7a9fc8a012b2a26fc0a5f5641fc8529322a35a9419286605faa231bb746a1ee9dbb0f78c145ce68a9a6a3405e100a5a6545cd28f0fdd6bf56884197c1b4b68c26f1f6297bb3b3262418a52faecbdae8bf284e2d4da1bb9e0f60b25b312deb0c4c93da25953e826855a88eab99f59edb2a1bdf41bf45de04727a9eef7179e875f6e8e2f279aee334249e863a8755fd3b8d65a8ebaeb3e6f9671d2cdce76054cf0c39371a8dcb7d947941b466e0b4a011cf4fd2b382b17c86d69284a9fdaad72375ce00253b5df98f3cda41b60cda2e64da218521a40848b1a722cfde1a1e1a781bef6699ea2bfe2d55b154b2738f503d9523e8be7a80f184c2123504a586c5d6e5e4910001fe3577ac0e16e37d9baea3e89c24116de020070faddda208a88045bbf4a8e1ea9e46742939 MD = 478f747486422a451f200e63775b2fa32b2af6f88524bdf14a3b6bc8d3ce5c610efac145f76391e7fd55c44c09b883f9 Len = 29536 Msg = 4a09dddc5a9f00ff888b1b52e99b952bc9fbb6444c4d696a55fb4179a7ccbb874bb6c36031f479331a58348ab4e1c77f0790042d11787f66ad1595a4badeac41781dbbea35ff0e512ae74322a008993957336a1227edf580e8c561a290e5ff139be6d062b0e947c281e34f02f33890bf7f8ceed8d7d55322cdb5af5d71083d677ab907b0e8d9aceee7f26112f598367a47429b68695822b3268d86bca76feda4df3c6abc26f8c63d23bc803af05112d279fe76aa259de99bb9f4efa779439732901a006eb16d1c18ffeab4622a8aac30db67898653cd30414f93f0062eacc37955f9d1afd36136e541240572ec6c8dfa3726dbe53a0f800faf1294c10fd1fae1f882e665d2fc9d0db2117c527e1f3c9a53e274ad238c5f6ca318e0c164dbc3d23f5c467af765d8f91a5a20ea28ca4176f7445dc8566c58c0f14ddeec75f1a7b4f42ff9d48ac56f1041a7fa22329625f8edf39d1c1bd6f074625b952b893c2defdda5085dd343ebb9ee9f10e3e3aa6f86fc983c93baf2b1eebee70d67e9e4ddebc3647afb1908d35eebea6c13852fa78aebdb43147ae92297cd9c4f86de103f106d145798a63caf66fe31169c5e4c566b8363b986a5e3cbd7561f6272aee8dcc7a55ea81bc0050839f01c1464b72a03918cd9a6d381073517231b4e11a1953b7631ea746cb08e643f88527055d7f03664cee412e2577ee7bdfa361c4d013fe487da5fc373befd4ee0907c325608c7774c102d069b6e706933a418d30c140d606068659d18317b4b84ce41604e90d74fb11c5c89e6100444dfe96a7b382428366ba3a60b43532fe5930c4a0427b84745fbb818a4ab8362ff2b90d41db877b8ee0e53c714dc6a42a375103e25c8c840e292ad095ed210b3227e63fdbf7455e411b33f73c1cbbfdb0d92a2c6cc1908e9acdec2d8bf43ff1f363f288e6c5408d426c1305019f89a23ac528c8a0002bf6b2d48c12dcfe798cdc2d8a82e2940d7b1b5a0ee06244b4242071e9531c96b37eded3670af97a423e64eb0ab86002009a346b7413eeaad015fa75c84642f3cb698731199071e63e791622ff93ef8dce7d16270f1a074041da2127622ca3b5d8593474202dd6c0d2df787bd59fd195cb9649032c5d3c93adf34d2d2370cf4b6ec07f12f74d88a883d3f44c2946b6c89c78359668680f1358f3d6fda8bd16330321cf942b6a07fbe5f9222a67231f84958574472fc4ef5df75e46ff4e5c28eb1a1f9e8e292de5395db18a8d1bbf7c685b508d9bfefe6dc1ed9525c8a0e867f227fc74676ce3a0ff7f8f85eac3764dc2627bda0b527efaedc02afbd03cfc63e6c15ad9968335bbacbff5bcc9dae214412f49e22bc6b12730039221bc7ee2ad175abd46b1f89ea5cf938687b0de7d6063364d4e63d85f73472c6d3fd3e3359422789644303988efe68eb48f265ab2a286fc187749e3b45f91af1ebebd068fc9969f684aa7c27f0a6026022b90bc2c5b4b051de554956a4c8e002926de553badc223c5c27f200b75faedf1f5969f450b1dd5e0210a49ebeabac40ef0ce5be3c153ca11542cde98c2e54af6759e5097328de2e1b2d19da38a966f42b4f386f2a4b9e6ed78375ab171ddd192141e9c8d5209b0950350fd4bdcaf6666dbf462e2b8730eac973530eff332f65769adcfa1fa1fb39c9afee52f31744dedee277c5e7d0da5f1499cdd9ed7833db8dea2667f8b4e905af231d1d829738a4a64334fa072e8413df7d4cd688f5d1c28fbc2fd7095f4ab42a1906fd1353bbffec67e39733a9164f53a839cb79b1f264a3955e12faac078f611a10b94e51b339d8d8ee62124a785b98a1fa8167b47c07f2ff1ddf72a308de7dada31bda9b0a98941dbb244d18937fd5f0f9c0fb0759f4a381d408194b35e9a55b27e96039a66545beb4a48b1b4d03331e9c4fddb16f73dfa4e95398ac76f702ab04ec873171e716433fac755c8f2ed9b24df8b4baa8cbceeec58997ceb451bc25a3ecf88d51682d35c602b3e2424aef347381282bea4697e9d072bdbad540fa516ab15a55302eb21cb06fecb64c9d9f2d75b3e30b1f2a631d72d5b377c30ae4b8c202568ff582ce7e65bbc8de97700f24bd568a622ec05911147b210d64f7a3e114a8944588aca8e54daef164090a67a1b232c839ff50a24d1c2dad85a2515f54c66cbb7ed1f46ad8d0100c4f8cb5d02cbc0e42977a226559f4b102e6645e3f9a42147343b7a239e056a8c4a807b7724e43b4a384877dcbbe02cfc63891686c3aee68669b25fd4084473fbe766159748eafea91080eabfc03b051a28313b50ebc34323a8e004ea44c0b9da5c184e3fe756979b42cf7f21fb065fd3dd0d18d4ca97b38972431dd90c00a8a1f92579d3a8ad729b6f72a9b5c4d889d4026b33a4e882a432666a0f22a69acced4f0c2ce4e5562c13c728feddc6383f7528ea1033de1ab1b8e5b35d59ace5a306ee3adc0625e720bf1a30f32c779bdd41c0f832f413d6588780bd9cd09777a7a927300b99f2e70cd7a9490b045189efb45b141078122c0528c7f72249fed7672eaa9a3022c4cc2d0824dfbb17cc78e36767cc4d3261b244071bee92083b7b4e11e8c7fe33240d2dcafd4397b970ef54b5779f2db57adf91cd0d0270ade5d9e8ed6247aa3d99307b9a9333156bc753b038fafb4663d62a7ac50be132ad7689a43b97a7d8c48ccc82e1972ca8c1485c826c727f3bdffc196b99a8f94c7975f12c66f9571e4a8737f04a797ee64c6c5057ca6e79529c7522f0a554b942a45ca6de0a17e3cf420109303faac8425fabe58ccd5f983f0ba9ed8692afbfa9c0a321359f73bc804d92c6cf3bbb87318daf62ae0fb64a65a022cfa9cc1a6ae630e1d6cf918d6fb5cfb4e729c91c4a5858bf7e47ec131e5b1c784fe6cc15497c77816e088ad56bf43adff0dc625d701b43849ec6fcf67273b302f4aa1d30d9f1270a2d7cd5dc4fb0317c6a5381ff96fec0772ac7bcc0e564266b448039edaad8a204bb991d12797e2622ba2bb2632d77620fc8a69612f590c919b5f59cbc2aa79ae98ee9cb0877a29b6b66c17e28b219aac6ff00335d118e1d76df66d01ce7c254211deb6a3ed8e1f3af06b14fc0b36a0d351450ff1fc7b0b63b17705e9050cd7053ff1a7525fba0e176007791cbbfcd0bc2cf1563cb86ad15bef49ea2a6f42d61ea9903664e8e63c748fa910e9a15c7290875ca0bf0ecd7ae8b0d4e46d14066cb6d8212d828dfaf27a03b79f0cc73ecd76ebeeb521058c4f317a80bb5afd41dff5520e525358df7851469bef2c358b2a97df0f5c0ba68f985fd8b5369831d97802a1bd6e80507b1620e0bbc8f2f229d11beb275f25f8be9d994fdb1ed0b8b87f064c9848b07db7140f5781f20606020a29979e84160302a508695a3ba99bc43c28dc05aa8ce87cb9483554340f79fd1de96cdc9487cf41f9d3ad9a55cce1e7f691d86e5abb98b04ff0019b57b653015184f149561f6565e224a30434e09208f768c83a21e6953c1c3244c024a29df8f022af4d9487cc54a620d4fe9f8eb70f85d635d1c7b5e8096934852a607b5fc940ea2c5114660cf88df1c7f1607e56e3e903a69b14cf98fe7d1e4c41d6eb9f5c8a05f2bb9f652e37e1bf04463d577a6e6b16a300d0ddad02a219226d4d986799159b89f5fd2c38fbe8b11463ffc228975238b468c28630ff1e4d8d168c2abe682bd37765f662352becf07eb26e666a46e890623bb37328dc3ae117a45c4aadb112d5467552af2aaf33a3ca9951ec4763734734e16b4c9d813efd487f85a03a5c13ca7d8cd8bd216f05f3818271fbc8d73c84b3c2b2b898d672cba70fcfd3705176daa51151312152ac082ad4973cf3888b706546505f1fc21d70bcbd028c5478832c456e86b633426f094df78956d25fa833d4d60cea3d3089170fefe572f0b982e9e50a3cf25e27951f735310f26d44daf488d8af01f705fce6290e412e4bfdba380e4d3e8daae767712350f3b8ca206adb08b6014b572abf059183de676d2a7442469f53301f6b2d28e556fc4ff3d9a011dcd6ca7164871a9dcfb584c65f2af82e18684283c69b2f6b41cdf160f059c4be8ca2d21a260454d66c0bfbf228e38e250910d42da65fb463c01d9b92c7861e09a080e1efa68ab7d7efef0a94d03f7e4fa3ffd1d7c7a00637e9aec28e824af61ba1dabe98ebff89c9e0c87b5460250fd36d9e012832446b1044e82efc298c931c171732bcfd4d13d3c8fd14d9df7c8adaef532bc9ee352c165a34a682c2343e33889f0503e55a9d1e2df89ecc552e378bb287196103599070b2f8f3cb57293f887edaff17aa106fd29a20e0d4ca225e0f3da391997a9ae147d59ddd7def55de448030e79d5455d01694dda49a4740478d180d5c195adf65c2498c2c41939f638f17098740ec130a12a597b0c6d3703a2ecc2f4288ab0f660a982ca8be4aef1590c9cda5a6793163ef54b6cdff779a7e1ae0700a8e76142a4649e4199d1c2d3d7021e40a77039724d529a2c3ed3aa65c78dc377ed4c2d5fa9fe51e468511412356a4b67e5c932d94ebadc45a39247c1c7049ee6402973a1d3df341f81f32140f6bdcabc9fc2fdbfd5a67825a8b3d05062caefc85c0fd2bdd47fbb5f713868c49d7502cb201e289a549e0458a8a8e2761d193c9a9b4fd9080e686e10b08159218c1889f0210b11fd5e19e76b3df1ecb778a80bd97899e514f411b2ffca6e80fc6510d6e81d4a685d54a2b7b9d32f5da8e7dfe4019e5e95792814206919606e999b166fff7f2c8a3edab0fbe102a1c3aefd294baf571e48891cd83ce9380770ada061bbc2c151f61652cd0a5d46f9ad5e2b2cb93f4d499cd934e67f0cb0b4458d07bb50ce8e3b4a884f7f89ab0aa7791ae452a33deb6100fe22b75d2fee074bdc535bb56f2048e5e94310f046e83bc589db239027bc15034c48d36ddf7a70f20ff5fb5041321b56ddb059b4bd4a17011f5228069939b6125829c30797d071e68c71f2b7d13e232bba29926d6abad9ba4ffbc88ceedec4bcb637fed0f57a8a87f659da629baee0c323015370fba4e45f803a9d89a525d160db15ff5054e33b54c2103ae70cfee4bb9cfa2575dcb2d77f74910f8368a95cbd2b263cec52a504eb74376c9ba1c89f837c5680c28a4f13988181a71085d3d7204b0b402b5b3a679a81220816f67681a965b8ee1d90e439193baeeca7a93fd118af179193fb0de4007d7295df77932b9bd MD = 6c3a8559da6994c513896859d491b019b3ea9dd74b8c39dc983a8a0c0a277c6b9a68b00a82772f48c873934690fabb3b Len = 30328 Msg = 3897c9713083c6795f60326e10dd4ca80b2fca125ebfc0815d1fc444e84350fdecee68af2c6a7c17427c8f40e09799525c502aaa6c1251302e13bce56b8620bc1c13dcab2d84d90182c1b4fa38fe1f912d338495c2ccecffdfa22083382b0d65cfed6d8eba39a4df2715e8c59d7aa50e85c020fbe8565a967ab63745d898dfa00e6665805cf1a7583a6275c99973f5706cdf45036716639c06364a54d2375e14e0650aa89a14a815c18fa12db351d560ea783dd5c676ceba8c0aa1d8ae6f526a4dd3a62ffc0a70bec784b51a747c0e8608734e9a8ddd6597131a84f8f5a782495d967f3c0a3bc7fa5129f8b7625d6889cdb8c17a45b3eedca34e3bdc2e49b75a1997ddf84d1074716966b42d075aaa12422fde9c755f3230448e0dade1bcb94588be0a8b4cef41cc16232fa3ebdc9ec86dc1ec29a54bf93cffc24493966850b1b2f44d1c8f41f4b36148b342944c0a54585435485dde0ba7dbd226b5d6b54446a01fedd39f6f56cd50bd86318c10b75d0bd1ff2226802f1ae1a6fc3c280b5cad592833d903df2fc3ee6af0995b926d8c8c2193df87992f3d18260d4f15d2618ee5f8675643fb473c40373ba28738f389e52a39a60991d1b7883ba31724721c904d76d171e82a65e1500dad739a6c13fb1ed6389f32d1de3139cb04bcdd53525c9889b85379d3535a25d290351c95938a3d0cdaf38dbf1d5234bf7965c8ddce9ace1b66247e60d74ec7702a0f931a3cdf4cb465ca9fc458c380004a3a6e7957f1f813210b8038ba663fcdc42a8965d6a252b5224bf249552b2575bf64568db4091d58323006c3c34994d3a5ae85dd297b58f9599f0db4dd332c05200b0883ae8b45d4e1bc9869bc9fce6817c210eafc10656752ed786eb8839c9ab4560dc10d1f786e75d7be926b12f676608eb1f4190c81e7545ebce0aec27d1bc46eecb1996cbf0e38a801a69a4812e4c93bf0634615b461a81a60718798d76f987b2db9191b219c7058e80d0fe92d9a9af155a04cd307bd9748ec880aafb38078a4594357d3a701660efc2f939e4c801bd76911f3f081e36711e88f01ac1835ac11f7b6193d582362f3c375ed0f797e9416b31f02112bbc609cdded323a0f767beb8f7a28013cebab2fc745e7e3bb7c4cd5bb3243e00b2ecc12530a65ff9f2b2f5aa9f74cc65b418be9900847c21b628c3d0ab37c052c22f19ad04e64a3d03c0e85ce954c34be0e484aa427d6569f189c76270876289381195dde21f6cfaa92619585bcf2f46c382b798d085c445186c4a79a9bf9f04a318a8204ebe22b36136fb157d404ae6da97c9ed315a13739954cf9ecd3cd05581c8c32cb14f15e7ba88202cb454b09ca4783e3fcb56cd55e2b7b93a417b910c5286995b904eb11813ae0b069778fae8afc886e924f86c6c8319a9d4ad186b9993f67d2582398eb51afd2e2b9d29845b5afd2671d4db8b37f90f1416768fca7dd48d01230dabf95f2f1a0c044bf2d755448aaf72316c8448c2ec8a58244e383992bea7cc78f2ab66ce6927391a418e66dae58462e127e20f6f567f123cd03f4d3d0fe39a7ab9ff7c878f02328ea1f410bcb247bc5a9a4f0c5cc154ed26b24a3951f53705897e7000d8e01f792fa0b2e338655be7143005b019a1ce418860d37e600334a60baca78430f0e18563aa354efc73539b8485c0ab349c2da7c868759cf5be4ef497b0f0773e55faefc14b15c46760a1125207ea4e3c0505887d35ab15618af869b448056a4f73ce00deffbed417c1d713d332ed297e70d88bfd54ee6861fdc37dc7ce30dde2dedd610334bb0e6bfb67f8aea363cd9a64390aef42aa16458b32c968a01d4296fb9b98d47674d3f281d6393ab5d89b0e53898dc99b889faab7c8a50d8a2518ea5eab10c95176b549f9946e0df6a62258c36c9d02abe474f017e7c93cd8d2f14b7c6e5168425b22b0d7350faef266e3e83834a121105826b400228e6d18c14c48d967e327c57ccce58f4a86841595605b267442ab455e3575250b6d14c65a9a410a1a3e9e5775e456a6177b23fcac182022cdfa17d76121a1db04fdca6e195bf26317dc2284b13962905e461504358bc591842fdd32fb6bc8b6a1b9048c8801ab88c3445ab9c90cb7f2718fcdb8ac3bba17596c91d49774683c5417498e214bfaffbeffad73180ec530e3a0b4a69a987c089028ac58dffbfec0ae911fff7f6b5f1c6d66a14d489ff8c03731604a5b229a09dafca32c0f32fb0823dede6ced1046835121ccb4b530e144eeba6710987a827f8c510ccadfe9eb6726292b3304bb5fa90cb98625f8720d237c942f95cd00c3fe46be5fb1bc615e6258388d0e50cce911e286743d8cd3eae0636730465345dcfa7c9d027d1f39b28e2c655a3b5bd5a14285210d47ecc6f900259c0faed5ca4be8a0859b8982e3964f053839668065e6bf6711b7f192dbb60745bb143bcf0e9f6d5500816381ff68298539a0fc58ee47ed0ac11ab70972a06a463ce479a97325ed0c866a9796dda6a22ee207895fef335fe2b79bf4cb3c56bda9aa06f4ff989dec399fada23c0ed05d64b9f38a0fd9478c717db25752993755e27ae21a2bff55ef5ea4c0ffdc23839fb939eb7ae34ce2f7598bf44b3a09c0d773380c65d917fc6afe4e5b1d019c2efdbeda65d874ba9424ed5ae84cec1e91c6fe69fc746162dfe39af4c29646d9310bc823e92f2e92d999bf7304d8d3381888c67928a26f709efdb7209de8167b482e77aeebeb9b6631ca325cb07b99e6d3b17dfe179c4dc1b7fdd56a537efae2c2fa4fc3e49a25c52b4b088091a1aacb31b577515fbea6b6a978682a79e75eb03fd3b30b79b76800247084871ef78035d129652b5775e4ffe201f1e977addc642d6f33fe01cfccd7cbef48c8bec9b4b72071a9d4957e92edf00f054fe32ede6f0a115514135fee8c702bc7ce07a4b2dfbe12d7f5a0253b11621414a63306ef41546e98d634c427cebfaa841f7024f50ff8a15206fe0647fa9695a284edb2797baacb71ccdcb922ff18d000358ea705e86e91aa71059e441a3c28217479be278e5bdc7260718b4a9e0a50be98c9b76fc99e6863dc5d59a9e0913033fd7d8653fa16060d29a9d7093c029121c1a7e29d43e699f0917bc4f3fe54423c785fa7993f37dcc480dc090959a005dc48afa508e7f5aaf348d76cbcb3e3c2bd7da69e61ce5fd51b1e8ebda56751434076576b5d264a1fce5b06bd6eb1de563995d8e74837ec63835b485187f594cdf10325c1e46f427cf45060438478926123396cfeb70c6c1c9fbf8f610b74e90a5057913549537d26f7c19a7b8868ae781cd0d95128ac6d64b2c3ca58ba75dc8d00fc3031f65358b26b171bd20502810f9904b49b27a85ee08ef09fc50f78ddca6559694465ff73b3a0c94af364f6c8ac0a3d75193e70bef466de562294ee7b570007d2e932a84c8f4b60ce3c3285d3b1e2f39177d7a61c34ecd5b3fdc5471397537fd39cc6ee41c9cd761c38e86040c5d5cfa0138db8e506838f0fc32b23551ff23a01dbad5201d7a9619b6610f67e5c451a1798bb19a80dbd62efff3103be654ebed4225053fb5d51cbe23026b90af9a37b6e640a58e39f1ce9cb1e71589debdb96c11d5a649cbf791d7743a4387502835c1b01d5e7165f049c27ad56a292382b2a6f091614746261ced10d13f52b2b6744b3eeb854beb216e29c387b7239beb00224822de4010abe5875f8f06fbbb8b1cdbfa71c125b3cc6658f2c3a37d3040cb688251c43c10ce152dc93c418a55f154fa4b79bb06a53958d77152d641c9c83a0104e4bb432ed6d468b69f9705672e442f99c91af6a9af6d2fa6fcf9774dcc767438a36d5e520d49be8e81b176d98b15024d2b87fda778cde7fb88b425a694a74985587f9464b99db9b9aa36e49350effbcd64aa2487da9f87d6c0ae55bb68f30952c99cee4c23f7e19fe2cf587cc5f9a3823f2a72311e0c98a16a900e7490853b09bf6a72f29380bda9f124d97e325c81d483b0f08d8b3ba1c34f0159b95383671102912a3f5060d53d9edc6f80de3f1e2cf7e3a4846b542aa437aa3d72fb1616d25aba1e19a4beb1c5b2a0226b12cb00f0656c98fc0481bbacea32c287ce65ceb48f8d556ad5c2daa7f617fb251628b18a93f2d4dea0e8dd432f43f0e015991a1f68b1d7182c96d74d2fea0197327db960491e5e1385b117d1cf82d06617d97f7bafcfac0cf15f301d28c03da9aef29edc51984082fb05f2be939969ff1e4e87302a8edd2f6c486e81a842b544d1b1ea64720782124c0cf5724030c394701fb9a6a2977068e57618e07618734ee4df246273132aadbeeda856a1eee70e56759d45de91709ea314b6a15be97fb12fa7d53d1d65423a9bd193d07d7cdc531878bc76a825e2bbef48d02e1f5ddf53fa2f845d38a5d1a029df3f499b81aa4dfe4f9d9fc6fbd0a6113aefee8a1d9d1e8d9fb92a8c7be0c9b140332ac4a65ae25023c92a01ba414751149a4963d1c1f82f20fd0ce08d769c7a1bf7d9c093f3fc551bc67d210a3e86f6fb5aa7742151cb2adad66bfd869b01ce9914c057ef7d8256601e02ee95ce4b4a19b67083b3577ec4f4cfafac0c57e0f3e211455163015c9b19581f3000f97e9396360c5932daf946966d40b3c7b321321d76d2759685726c6ffd3eaef6c7071a9a62e4be44e324f8ea3a86da61b6add372ccce8c3114ac118a94c6311d41ce274cc35e7a9179e72115bdeaeb7f696a1e0a99a15edbb3f2d191a51f811d6ebc02d4e0e354c2a42a0a427ed2acccd2415b0d68b2b33d6c2cf6adb9b0669f57b7f25b41dc157f6cd5fc9706a7e7edfb1ad1a3be6b53fe4642c60557e3a84b02a840096faf856fdad03d3cdcd2628decdec9f2253306c74a1c8ac2071f0ec879783505f1c66c3bf503155a88b9e652ac738b25247293407ea2890b51cd61bfc40d17784f87928bc656ce1993c63ae442c35f624491c310ecbd0d09be5369d7e9512e89125cbf0553b2afa0846028ecb9b58dd10bf65ee09c535ce3d51aeeb9f22bc461c1acba54a6fdff18e3ee761216305c9c030a2c57944dbfc21e8ab80ce6821f27e4de4c1ec72107a839daedfd631e16e8b435f41ede947ece220b8e79ce408804045c3d0cbc040f790c8b5556a86601e0a5e080dc820fe12e68063aa8b14c4720a88d55c58f905eb3e76976c4ebf065a95e71963a86a5300b79e18240978ea4a258d95bf248ab3e7d4fdc17f036a48c6e6752ffe0f440b28cdb062fea89eee7b29ca8193aed3ff5ffce4c0281906abd5549e98375d3c7b0da18db094d8d54577afd6255468833cc62eb21fd20022a3f868ba0e9a22c21721cb8cad712aea83d1f026fd8bd206f0bce2fc3d1 MD = be2da5a9473cf79f41f123520e48c0b37d0b78af0e640f6f85892fac68489e29b9992eb38215cec107a29f95cca5223c Len = 31120 Msg = a63c48f1fb7d0b57fc1c832a1176ecc6f3ed70c1b3de487affd325f5a1f9cee648d40a0b8b31c0bf2b5c5dcd98947682b7bcaf06e353dbec32a66407f944ed7f92b337255c61410404ddb43803477d046806bc1ed8b8dd4dd36f0436381aaf730c4197e677f6d74d0f084f165a794b748d3260b29af697c86a95ce2c67625aea3ee6f1f7e3d6c8c2d543f80da31126fbafaa636a32f351828080878e8e04370bb10b0effa8eb5c8dddf775c5e8f757c155d58deda79953a69c97fa07b3e78effec16b7a7cf1bddd3af8d8fe8301326ed071ba5e401cfe45a4744ee3de0f5a7ee7771b2975f5091bfd46b0e1b844ddaa74ee475f6497c4dc608ef2ad81c15c9ffdb82c7766071c276d3fbba08eb8dbd19b098c3cc868ad71467fe7781702f3e5a9fb3c0eddb66b62334a45b576dbb1568b79f580dc0e0c769ecda9de0e22c4c284b6b64a3d617b5ec80cdb8b012bf2bbfeb62fc62ff6668f020eb649c7df23c9168117a415c6c09f93ee09ab9e3814744d34776734c0401ce8a99945d466a56bc7d0fcb6e724df973f644c91de7e9b11ff7b790e7aea2d92eb34df4cd477ce1d212cc1fd322a2cc8231610d8226e0b079df1b10672e283936216d4d92871127faafb03d177353cb4d759f2e91a94c8d7a14d9bf9ad37e690e5e6367540e0f6e5ddd23efe36e483efd4d66f3f1771791491d5b6529a58db1dff2950abce560ff22238dfbdf19696db93e1e254a9827010f8207cabbac3b59d1636dfe7113ea22720a562ab27e9f9faad22f8c46156628f3cc47b5f9f171a80b3b510a1ca0971e7519e64405a5d01df89001f08bf5ba4d1e8282f08a7b18e7b601abf865954d3d52d8a6117f94e530ca00fc19c1400db7b72c1f411852165ff93ee28ef3f9f6c532cffc59c955c71e48ab89cf91ff46afe7528871487f5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee75 MD = b236f326dcfab7c5ca01b0f0e172e77c53ff4e9c3f0686b0e60b91d7ffe134810dca596fa2ddc11827883c1613f74960 Len = 31912 Msg = 8050922bf6bf1a5665e0a71fff730ade4e2942646a0750846f0c47d22e13a3aa23fbdb74a8043a27677cea0c159c52c55eada28d1b6eabc1cbbaf5a041660b4f9a691a1f723fba13588f0c9d7e0b05a9b59709dc99aebc1e09021556db63b474cde275b5be3645221e5f345ba389cc923d32a1da4d8f2aa2122ccf7c63d44324a4b014bdf3b2815da2358bcceadd4f89ddc5920e9dd99e55cc804d9b437f6364071a20bf787b16cbcc58397abcd135957d970401f253bf402046b43ae22cba3ede67c144b759ad75851265ed822b26bf05f11e39b5c7366af6c52fe2a8a5f0b911e01ed31714ee61b3a937aba2b4cc0e5e1b08404cfbaadc3746e31afdb1aedd88cd60f4007380993f66d83e8634cc8a6e5deb9e21b7c49cc911fb6a49179cb32c76ae2fda400c251291702e9473d13b1effefd99ac52cb4966e9d5af4a06142e322310d0e41390b137226013638812a57483b7b21ec892b85a5f2736614a593961a1115023fb05529502341d34c845eff82f80c1df3830a7dfd213c083b12ac2ea775d01f01180b3e758f75d27883dffff34d12f6a3c35868bf523e40dc4e97910f85c4cd511a33392791269d8226b640e3631713c4f11d2d34afff77c1015ca99a6b7b75f55ed701af51db9b3214eaa99c61a2de1eb562b4a15d0916b0d4015c924c7d7db68bfe8055f81c3452f6832165703cbe78b52ee55187e483726e90943d53504f5c49b19d60ae72d0a8738a9285b86b1b9b9c89a88b531628cf791038e5a57e51af42f7401a9a63d7fe3406e34560ba5e50107be596e9296c8e9a8a30d06d8fed771bd851c9e579b11ae0fffced91aeed5db90d84bb72a5b6797b056446d1098a7b7f5cb9b6b63cc7c4207dc5c572d1318a41466d4216107056c489bc91f9768f84148c5e2936337fc69c8926142caa92a14d2f8873fcf401ee1d1f20f80e5d665a826f29698de642e7fb2a0724e6c1796888cebe954dd8d1092ccd78c2384776c5720d02c0e2dd79eee669503bc99f4ca9972df5f23045486f9c9dac389ebb278d8c6fd2745da18aa4044ce9a2fdcb742a255416d0cec2cee71397a4a26941e179779c7fce28b9dfd1fedebaa1a9cd5ab4d8490a784fd7cb3a39c24848c0610c52dc9cf31668adde3d7b24ab7ff52e650e5816b732da0ca730b8268171cca410e0627814944806f1af2428a5860a75fc024ec3074697eaca9135cb3566b59156ebb237cc90ee4b7ff0a1f18efc102a89566256e1fbaff89c255bba4d70a2b1443b73e102518204f0c99987502a2ed673d33bd92c9a4abe86b4cffab2d5bb8a43974e7f9e202db9abffb4f3d1588d0022418253d26b8fc5ee053c934add2aa6bcc9eb18874516f31a5d9b3cfbce5530fe68decdbab6a7943de1488effd2148d1597f1b4a7086739a4aaf66ab4d3adee6f0ff84eccc3bab4dc109bf2b8faa4c5b8ca095be5b04514b1ad6c86e6b0bdc3dd0077def0d9efab315adec75d9fffd80b2ada162987da0ba92fa69678aeae36b00104850e426e03a687b915d507504e787e0dec5bd34ea6f5f84ca55213a8d050db474c0e446043a25ed3e50a7abdad659049e664ddc96dfbd005b85c27d2172556e73ad828edf48da8d53ee3426e7f3c26370b2aed72e9247f79d97e34559598398d5855363c9dce2d662948a68c4b64097e63964b71a1d8cc510fa08059d20f4ee0ad6bb576c6cfb52fad21ed3f9a4501c7f6903eef1d80813563aa540555f35b894103efc2f8f708d8d25660aef347d5bacd010f14e68264ccdb84f881a6ad292f1c062a49b9aeed08a0d04702ded24ffeefcf070783483ebf8216b4f64da3807b475aaf32945c2e672075ea62e34e353c64e46cf17c38d6b55d49d08cd23f2715c9e9c6a60e69919e592e90f78b23501b352686f95abcf6577603936abee8e8a4aa99b6cdb13edf5553e482e95db96844697f9f48a43b644dd42d47b9990589d0f254c9ce0441df33177d095fe279455e08d6fd05e21de93e7fb032a0e900d343aa0145d28fdb5be1ace36b81a0c9ae121b12e9599dc94dd380729c4838408ea2da887300db7419071afcf07821126c08a81dab6c5ba958b3de5dcfd80d2d829888d19b816f75e34c6ab2e26cedbd48e7bade8b65a724d286a1581279f12f76cbbec3057cd3447f58a3eb87848a300758563dd16c06a282f6d24aac536bae34e38348f81a904bb5d4cd9129e982d574028622c4ab028b31a9771de68d03128289e047be832df14f68f18b0ec35d13568e5175ad472248a7479bb8085041c32965dba99dde329d13bb16c17e39a15174a3c01ed46bee3fac7943035ac3ae2af11e7f54de5328b9cb76441bc373d8f997ead906813defd908e779e6230fd1ada15cd131c80c96ac3d408381249a8972870aa613fce5ac7e82384449ad5b32b503c9db28a52e04de32c2dcdbe8d63d240cac2f2e8c8cae97e414ad143ed05aabdd0ba422bbe4fab771a45611584e7b77ee787b407b5a7b8af425ba2f1f96d0f5f8ca34055454019fc48dfa0bbc2bcbd3f415922f0f769dc17b10758298d41cfd1caf94bbb6a6a0fef125cfb25c94b5a0e82c7ce591099ca24080e6f6f0b2c7291061cb2a2903603cc115ddec7fb2c24690644148483afe970d1b1471715958e39e89e13cf793c8c1fc052ca26ead792db466ea427e324d07a88907dc61f157928ccfdfd7667d60f56a9cc5bd72ac63bd1eda7fba7918105ada73c72009a14d9da3dacce5c0eab041d283af23d1d7065f956606978315d0f76b815d23b192c16eab53b04d4b01410bfe62f2bed357ec79e0b589c3e2511448235ad0cfa1ec3b6c6ce193f750eb9abcb4e09774c2549d75c86d0f25def364b4caa7280b20d643ffae2d7ecb16cf43bdbda5a42fe4f5a0b91537a1a5c12448a3270f6dbe7778628f38df78b1e7d6c575e15a24d683637caf8fba462bd10b497d033ba8d2effb1f84d39e8a910927a74be7a71c51e5c6bcbdfd9f069f58d1eeab26d2e12ece8703474712bb53c5ec71a9993396885245e54d298de9e99c9dc093587d1eba5c43953e5ce413df634aacf6bda79963140881c6d92df8f2e698469e61e4695ee3585dd2d9bc9a1d2b6bdf991caa2eca72381790d6273aa07de9083408aec902a9eee36b884159f6657792fc7ee55ca5b3fd3013e822b8dcabba8ebe1684478ef72bb0722f1c575058954d86abff2bdc207e53b6d6c6788fb63061a2540de9ea153a4b4d97f59c154dee999f6aa1a35701e408e46abc849fe775084a87f2b9ff4b413c668872312b8caafdaf8473cdfe9e56d8026aace4f686b10b1c7adabfb3e1690c24ca3e1d7c5df0021ec21cb0ba3efd49799f3d9e7adb0bf382f46e02ef1ed942ee24ff68ee08e82e55ea4554712a01e5b1d118bc152dac46e3bc568a9c4cba662e5f5e1b6bd4bc0cbac495c20cab893412c8e545aec6bc8fa79b395fa0b133004b43023dda0b9121b61ab5017407bdbd054b4b422cec62533559bf8ae5956d99ad9894d622f392f7b2b24c198f86c608f024f2ba79e8c61cf7be911251428fb8bc26bbef2dd4e415145503134772cc9d3c1983b57c021171549157ffceffc2e6e0b5208ee2f8b20345cb82f68311f60552f3a63c1d816bdbb49cb85943132eaa810c6abe29a6224aaedc70ca2bad6dc79879025544affbe17fa55d2997c7fa8c07f44284ea255c71b6507698268c596b7875400bd9d2ea0b1e75ee77b4634f14da3550ea0dbe8900c4ee3b675ef6e17959ad0763c4335fe1f7d41249812f54cb62973bf77bb9d17f427f683fba352d7aa3eb0067ed1a83ec738a71a9e672323807e2acb31a5e5b7797cba428229066f6bdf5d31e3dce7eb3fa5eb49ecb7610e432dd4a27d3f450702b9a982b7e4eb473119327909a9977bef5198330188117554951be5a8fc5d7f066b4eb4fb6b83e7b068fa4c6edc19696ca838568b5dc6e15b606af5434171981b0e1469db3162d9504b0f3c71f8f05c2e364634d8bcf3facdfc4c61eab333eaa71e8511b5bb0a84a73bdbc9b164be9caa684c5e880a1afa02e53abbfdd616df41192b3d397cdd820bc7fa64bbc3d6d377dab513f7d9ce87b097a053fb1e9cee5f8a715cd50b6e5a145be5adef8adb690cfa0b25d6b0612c4da027ca70e128a078eef1e106cb4f6557741805cb1e2ef5d042c8e473028540408b4b9fede25c9e23c3177a4d50d33c3bad2bfced1253e2784178e07b64ad7c2fb56644c086ab2fc6837c7917109c5737737bf3b3fbecb74b62959a3e3b4c3861bb0259a74296edf7cc7b7df2af2d4ed143929abe3f5bfcf04299826a1ad3fd9d08ca2ef0aaa2413deaaef97e60e87bafba0a526a51142bdd5e1f295d77e734182b08653b234fd1ef8a816c18fa707619234dab56d5c7bc8921710fa6d70884899e577ce5411218a3088d4630c037c6a43bd715f231c9377a194995c4ac9a6767df31d69d887b7dff014d387456a0d5e7502112daf9ab2526b2036c458d1f45296a2222b26dfe8a39f12b8342226e2c38fcc6325f91efee258828f397ed29b644dba2b1d2661db60a44b2e738b7e2424fbe30f52eaf0a2aed1844bc3a412c3340802e345c154b99d6987db4b68b9fb06200fbcb96857c43f3cec126ab2da924b3043efaddd02a9e3558d67c4a1208ef3661812645c9d8d1b02838e37917233302e45fa5d63b1d4b9d0277be61efb067235c5bb5aaf0824cc8c1165312722cc6b68d0aa5b3caa61a7421bbfbac8928a0cf5df5ca347e1b1da415e3f615d32868548aca7b14e3579351332da47852c43470e2ea0480e6f5ecb8831c5cd1ce9880535a09a67839944ecac3475953e1259aee97a2c50ebfc5129cb549e7f4a91fb7397762b83c220e95373e937addc8df3c6ec8babc3c5ceb27b718d737fd0700658d5f4010ff21091f3d119c99645e339198029c3a9862eaa4ae2a5ecd397ced23a59e3c512fdb263522f8bd258635c542e0e1b1c0b1564611d8564b08586f586a48a0a1e95ca4e88faf308fbfc1c426c8dfc2a5ff05ab8fe7cc491689d842c4b1bd033b59f412c27738758ec895adba8bfb31e34613d72a9ef06f6bb217bba4929932431384a93694351434c070471314b9cbf4265a6d98cffb459521b52e8a7553ba63c68cdcd76f4bb91c37f024a2fb91ed432047d36cc333483d492f1fe8e2730817b38b220750e2b09fbf83caec992a027ab46aad19414ef3cea8f40442528db7d98afe1d58e170b74997a99e7275c8c7e563415f20a294d4b3c19260195dfa2623bd64333eb99c29a480d043c72a249a2dbd5a7e156fab77a71388e7f05d5eef70bb3be84b11bb843aeba62f4d2e93f5be13246e5a10f938f32f45d049e902805b1513b0e0b26553773889c586ebbd6701051db4813f14a5326567cd9879ab654d4b5a31b1f41013d40809ab06f9f76ab123c4f50d327458ef665d346e97b02ac1de9dcf115f4241fbda84444fc1e87d28cfb88460a39eb08492a4a92ecb972d534f4d0d816c726a3910a825b3ebf71ae29947072dfb0a388c8abca07b7de7096c0de651a4a436f9264ae3d3e5d0a9c078e11ee1b7b12d7d81bf239eb737263b96aaf85fed8ef67b3e09a5b36808771a56679e98a05eaeebee907818747fbb3 MD = cb16838296482187bce81d180666b720ea763b9dd3bead81134f8deec96c98bab0e938651e6c11e6fbd76fa241cec784 Len = 32704 Msg = c0947efb86d54644087247f9fd95133a94075faf6250a2cc9f20df5393edbe1a4bdee20e90e877781a370a7f00cf9eee7373fc38acc54aba23b0df3f020356c9d95ee18f9352e042a9c4b3949592ccfb8a7a08b262373f02d8ec1abff7c62415d2dd2485765cab2a1de2e941a428c4e83fe32c266ceca82c259e35da5a7f51859e2353f8214efdb8de59548d15d7af3dfc780f9bb22daec0748cdb99137704a2a5f815f07b70017554f19d80d0e8b58328ff5a191b4179472c7fb2020af366f2502412766e09dce8e7716c22bea3fd412a41b4a991723049b43f6220283e9fff056ef391e263b99a00a3687cc54fb0ff6c06c651fc06fc4c769494f8539fd6512da0604abdc4be11054d3a95ce35f5465515371b424604dad946f094745d346e318000a8e87513d760388a75c29ef59c4d38b00f4c7a717a451c1dfb74c1e0e077d77cb34bbee174772cff2587d0d88cbc35d93402ea6ab522e0c4353913022f696c7b73cee6506eb4f141ac0714c59b0ad559924cdd1811d9588c4bad9bc4e16e09a6f15a37874f7e4ef91228b1e453a0e0d931139da218d04d1e44b7a04c80ed74a534d5f7af9e3c0ccf60d4f15e3be41e001a3d703152708621283e6cc29450761f44296fefe458f36a9df21a5bdb3f577754b49fed4621cd3eff2c454fa3fed7bd2a3ce770a839cb73d16a7502bc1a52e5e75e71fd7c4ce81dd268741b375f5f26edf8a75972475c9104244a7c65dbd8f3dc25308a7c57a065a8da404dd7dbd6029543f6d3cbea6e6d3f07e1f15eecb1493af022bbcfacbdbe8a6af30d0cda03fb2b071e06398ac8ae89fd818830b3a58e09a691b9fcb107d27f00d4855cc4afb7b52b6519468f33fdebee7369629a7c6a5131c3ab8bd046468f842ada5201a2de3e9714357a6177026cc000bd7c07fd871b7801ba047041c5c2de3e3773f9a419cb3372815c685c64145c6eac0764f18a6e63920ef0f8c1f521f658c249157d1066e7c926740daaccebaa055d8a18201e53dac0ced7d28e7eb3b4bfa35bbbf46a169b5f4b4ab628e1fa920ff98d8b52e9d1c5d1233f6570098101bd033154d3cfe4377e1967cd9f4c48fdd2a798254f93f00c0e34b2192f3e91c3980a5449e0e9d6a36cb852b8d7b4ddd19790344edec5b898bf2ab75692c4ede499df4b00e45df7c7714f93e198c2c2f8a6dbe86ec927324f2c2cd78462449d4a08ab9ee3a6d64c8bd706b3aeaa1efe5847b13dedd660651a9c63980b6765a7df2d95d659f0fadfd8e4063989d46f99dbc23aba33ce195ae259f6855469d015894fc67ac98871b794e277add9df5d9c685e9de7a878f9178da90e23c5302cef32b865129d37e4dca91781980594920ee665034cb59ea9a604d5d3fcc783223bc1ae9b263cc5fb57fdcc4a8077b8b3f73f1d9372c006d00f30246c97c32c5a031e7a903f0efa5d2f7a48fdf096166b605acf76e033791758f8e0027c1ff17b4e31646be47b9eb36c07d5c06dca755f501fc2d31e74bf268b434fbc34459b2e25e2b3559eeb78a4178bb9bb817b9c3acf7640d3b5eda0a4affbbbc3469bf21a8f19b175f4c651d936f03d18b31154a2e5478f9e2c04e439cd076a3e3a8bbde894bea4f46e74f1f9d41da9fc8bf4653f9b7af85b0b23528eec4fa556997bc63f3cb9d5f9945d20adf6fa4591928d97bbf8f7c333dbb1b44b14bbb333e9d5d3c890f28cadefeaa69da66f58ff4f42b2bb04a6384d2216d0184d33defcb500ad2a9751113706814a70eb642c6e4b7c7deac8709fd26bb96e9ba09f6cda82641c0e59bfabc0618cd5cfcec107050ca4c1ed4b3b3fe93b04587f14e7a6f4da69e71cdf22a37089711061556e32ec1c20466f96f161bb1c5e556ab2f3d4734477d8fb3064416e059ac0cf8a53f54c035ad416af784d6f952f2c0581ab3e7e49f6b554546bcde35d6db0c07559974d47b8338aa0ba4b2e2fe0a6f789f82b3e6f4e47ce54218ff61a54a7dd1d66621672a42a74719da32070d78be8d2c0e5da41e75612376ccfd0c3b66cce8a639cd00c85837c280b9c6ce27da38265edb27b442aaac70536d498e0fac83ac4398ea29bc30449cfeb7f3b0d3ab56a4965db49027d0a96c766e777fa8a83c9d4ce80b5a9c676846d2494b478778b4b8612a76b02493f2784e4509598cd6524c10cba30bdf5a0d40ba02300ab9aebcb25da600accf7122144985719422b36f393da833c60ba4ce2b04674462e0d9e922da74c4de9ed482d0f6a442c800cbddd521f2501187c405664fecfaf8a366c49a660b55de095acf2ee425ef5dbd8c38b07c5e6a670a445d72fb07b63467f1c9898ede16139560519e808ee9ddaf710a5bab30f54ed98230d1a44c189ea4f78260c3619827d971a4906a43c4b06d26cd271d1e73219c1a2a12ca3e949fe0d469c0922a4e833c2b42b4ffe9028e5cf9fba3607b8697b878a3b6eb33bcc0b234fa1989bccbae33e9b66cbfe325c01577006103dc8209b53a282e65dfe3a99f85bdec089d721157397a3828d690ee2d3a85e085b6180028bb31f9e8a7cbb2ef432fb89d20e4452c9708a7d917f660ea90f692449c9b1379985b99e20fb75547f9b9ffb5fb94c21a8edc2c3f3ba8d0f436dd06eef48dac2e3e0f9ec09c49392015f721f1820600b78d8f45c9c63ab6d078a3aee3628232cd38c87922b1f3b70e2461efce58aa997a1f7c75173c1e7ae5f2e50ab04afb5fccf500a98705396778a18489aaf414e4d8b13e4a95f1e6a5cb220baad4327b8ba41f62b04beaacb2e629d9a025c8b78b59ef3f26c4ac05cfe67291ffcd9d653ef904491e0ff6a021ed09dbc3bd6b14f5843619aa21bf0e41de81128a1b005af222403e4341adc65cd3ddf564d03fafabde0238454baf62a409ca07ca3aefbf4db65face06f74819c5122c0f41cdb0a26cdf02578a0e1a57efeb9dc40abd0249a2bbf3f5607ef6498eb54c8f1e1b196eeea6c6bc4a01a493b33dd2a7dec460d6008eb40149972d1bae90077fecd47f87ca9f375a9e7adb0512fa05ce28aa5ec47c46079bca2a37b7af092587b4e2281488301cda8d6209d6968affe0f059443b9f4bb26be91f5a46198a6d4e7d2c5d3eb1c33fe31f9f742dc75688863cb85a62ef057d18b05edff0727aa87d4f9a652dccbf661e5d1a64332cc4686816afe762f6dd324b27cf0edc44419ebb32148a08618c5a324ebb23104d3d662d852635633c3997ab555b2e33164717b12f8212f8f892e3c8fb6bf8ebb22a4b7d92058a8c488276e142e8891c71f3db074dcc46241a38c8886a102aece4f1df0243342f05a2219594f65f65c0dcafb16495db6eb54ee8d319a593023d6afcea61a29c6cf7d27cbc6d7aa90b47dfe363700d95d2d21d0aca24b4ddc803ccb13445b723888a60fdb513d5acc3d802f5b7d4bfe3b9a40e0476509dd5c469937a845489b2cde5d50b47300f52d49bce4e7638b3ae6d52a93f9f466a623d9446bea43620328131b90d3969318288b9ca566843f0dc340576230dae236e7daf6de45a948489ed95926d54684124255a7f75549e7e5657e5fe19872fcee0cae090566f16bea1593aea9260d54a1ff4a5731403f165051d19c887d77175a06d4f387bab63d4600d4748e42557515d3dc330993ee3add0d0ca5cd6c31d1f95ae26ecbbd524d1b050e535cb6a9760c548dc3e6ecb1c5f9eb61f436f14dbd5a9d48a357eb700ba786c3c38aff93d7e3f5c1723f972458359194104b891529ec329a59a2c17a099a0a773d9f898f0b4b3c29c69a4fd061fe83f57271b042b82cbf39fa32dbeab750f4ab3a00e10580909c39497d632063d33718a35ff330d89aa7ba0d8ea74ca57af9c23165a281e8529a52736f6dbeee422f602b5cce8a1bc4609cfc2c900a54667e7ecc242aaea30fcb07ccd6ebe651d9d18e62fe9e98f2288e454e8332ce34a1f71352c2f5c6313682ebce4a5a414ef8c1d5e2bc0fe7ec3585658d291be2d6bbf8427dd8a08323556650e040354a262d74e9432b8f116a89fa50309497f2ab23066ea5cb974ff9eaf9e9bb3f098b87e66f3adcb398900d8431a7c14c5378326585fa5312669715759218a7cd436fe4c2154d47fab8de45b2efdec7b6baedfd020b980e537ae30673e3604e417f71bd3f1b82fd577c6693a46967ac7a5abe7b670baa4ff560de5d64525317521a3b81bbc69e65503fc387c752c4f7fdaf843e231ac3907ea4c38ad553538b65b027c2d6cad2287b8f6f929a209922b715b9a5c49d566865b34d0f358b0422f2bdb1010e7cd0bf4fe7e534ab5736c54d49d942aa27e5403108d56b035dc7669faf81bcc1710c8233e5aeee695b305816a86da5623ee2b06731f71ecd402fdeb311f466ae2c0829cde5373052c11843a9bdd14e8b36f1217ebb1cab01d69fe3d361939f1322360e848318aaf61d41107cf6ceae63c4731bfe00d0803f85ba2e873ae9b69ee838b8ee2bcdaed1c46d6716ef9025aa5bfb185baf9d4ee4d1e11734ea515dbfe262a1616bc0cc645adf8ffe04d074bd61fbaf2e23ed67804fb726631c84e4e4a5566094bf8c743c552a23a8e309fc2b6af738dbea4b5a9053aed4a83ddefcab95767eee839b46b827dfaa8de6972c62fb705deb7f21a893823aca6acad9f573576544d57477b46657628d339c2295f287e986d36f2ac2185fed402140007fea6f855afffeac3dc5684554308016c958a4d52c3a16a1478d51290e6239ecec6f226949a48ea34363ef0a97eb1efe2713b6c5e676123f9960ea806db414e9db8024836999a0e775b03034b0e9e5434fa2423e2e1dfe504841a085e68d6d91cdabea666315d1f34538f02647b35f80a392dba07ba8277dd49df7ac1164a08f2360e874aecf9e61227c8381b4be0a20a343f78f479b1a32bed4746576c05a1c8d4db350a51d728bade98ec9908061cdff540a6d2a6d62f967939b347f26f6c45ba0bf6cfe85db0d480e66505390e2c2f841a8cc8c958e4c8f49c0aba30f03312f28813c13af445071699ec8867629ba3e7b372ff6b9f8a66665a94d7aff1bcd68438d407ce04aefba69bc94a196930e228f5a09e1313e91bd85a96c7f6d8d03a760580ca2cf6b4593bd34472d78bb5954fc65dce4a1cc88c50845bb18d0f37e6d2d66131dd301fc9da29a5292a30f0636210f3b79722f164d9c02abefdfcb981a092bd65681cb7f28d85339698c0abf56bbaa880828d2a4978f64a15cd091eb3e623dd8d5521437d5bcf37e2aba3acf271acc55293c53ce4370e04e0859d2d26ae7009d22da68d114deff934eb42bc037dce91545332efdc1df0a044ae1faf7fff61885c77155b5769cec1b5df03a2d0960856af493c0ad93285666bcff96d69e2dea452bbd576f7b952d78c0f4f2800c4425a8afe4c57857fb39d7d70922c8a5dcfa3dc824ea698456482e3038f143b0f64e70ef8c89c850b638fa11952b78a7b1cce2452e8b2e213ed0cdf44292f2b80564362c11aa284df7e820053a1d51241ae6d4fb60b647f2ed3bbaa598741761e00b6b0e1a8312801eabfc2a5e74dcab96bc888331f82149b00d86cca0f12c4f24a8a1ddedc11197b918e0e988ce859ea3c26f5538cd54c635aaa4c202b69be021d05d3421d09005559360cb3f86e68dc09d1be9dba25cc8fcb7b73e2420f0b585f71fa94d2e285952c01e67e94a79e98bb0f0c99123a3f273a910998bbcd54fcfa14b95d65644f45f135c181c65aa425382907d0fadb4b318e3635ca006941f4d43739243d57076c901bc845f751218b6a67d6c9 MD = 00d3b9396a09d37e126ecceb86f5db9e8ed94065646f4d3d6bba15e8318ca9f6d07e363d60dd863ec28ac2378ccdb515 Len = 33496 Msg = c17b3dd94c4f9f562edba48df48bd57800425b2477a80aad5ac69f6af2d046657241600ed82d823014d3c1236c732d441f5f9ba24853a8fa0609fae6da09c95150bf9e2ee2cf5b6919ad7c1ef5689c0a8fc63b3ffd96be1b7642b77ab6a4672ba41a82a133dd31eb868e5de757122bb299a0c3625c1856f8f2975f90504829dbb67d91cf93fe0d9da3a0ede45a1ae1248515bc752f827779c130798f6e9e1549ce0e5521c9daf667b70bb37ec528c7489b4caddf3c7b2a862d368ddfd94d365e34f555fd9f1af4310cf7381d62e3e306236e1e084cac76077cd124e859fe91002f5b19ccdb660fe3e88b022af7f43f4764a2975826bd63e4f728c511b659301809682af74665506694ef9b0b4d02e3f1a711a1379455f905e664f8c4b7051a8f08430fe4a8c0bea0584c8b2a2cb6d5ee34e2c30d5c1c415291ac456925ab574b751550fdc91f627a7bca58ee5cb81f24533e864247bc42b43f293566c8f2f036980576a9702842dc47908cbea4afc97d4c4d713e1dda04113a034f246883ec37b83c084f678668af02c7ae04cd44d9e066360c69a6219053c8611b0bcd0553351ee18e5974dfdcd9f5964727a01e5934ea22df2ca936ed60326b2284be212d1a131d902e60dca4446826de8fe2e65063203873edf0c42322c04bebf5057f83cddd189736f224cad6a29efba45e43c75450a14f1541713b7fb926ffc768c65c36c4f92ad9f4605679ed2727cddbdec5efc284fb0d65e53c616727e463b09fc13d12e9d27f2c374e148fe9e875205e521cbe0a003c24c92eaf1073242fa5b1b9ca0d0f16906452bc8fd10bc901f66c76c38b5be50945c51a51fd3547950ea54cc5ff947e746258a7d2fbb64fda25b03acc729e32de9280072e7693d3fcb42282162e9f9293eff218c45511046875d1a51fbbfc7022d1a3fd30c2b552cc60d164a5e359db56d2c8164f27456f13ae78c0a5ae9c263ccbd5043e2bc44b6cd859f95a65e9e023d581a95ab8791844974c924492a7dc9648bf2540f7e84746e4644a1efe782963bec5d9ce51d68861f9f623e5b1441a971009671f6f48cdc14e975dd7f42e3f7f563eaf913a8446d49c1d7b71519c69a7ea5ad3c1db0d6545dd9c3c6f9032a9dd6592328cbbaada03486aa3cebbd6502e9f5a6f0f835e973a581befcc1aadefe7b3696ba71c70cd58c584a2e6371b5894f8b245f1ae64ec0988bb7cd8dac69a04076c60cba4ffa639da15809f0c930742ba0a5d50a647eb183525ed7917a6319b2a421bde9c7fed1051c245e38465e89eb009bd12b12e1dd026014a991b743c16e594a4c94c182b44f035fa99e5ba8011a1586f211841089925f6991f2c5944dcfe0a0175fcf0e63d8016a7a978b95904549f7b6323aa36dcf8ace4f3937dd0553d4b3cc9f432a963c80c52fa858bfadd9285e7c2198e2fff68cc32fd980768e96c005dac7b04f91e92c005765457eb0623b2bd254418796c3dfe8c258220940051d06a08db8e60d6a4dac7042c46b5e5cfcf0573ea6d9e893fe9f9539befdd02b6646dc45af965f3c701a18c5780dfe45e84c59654b826c03636816f299dca5761636dc8416d91ddc3dd99f71b2cf16997780775ca1f9778e98c2c617551e4671a7673fcd8116afc6017ba2bc17273de4354d2f893ca7b1821940311c734b19bab458648660e7ab966570911907beeaa2abf2f07f9e2590aa6f60d67676ebb59db77ae94358c497a9c449091d26fea351462248a428fbab54059524c9c268a0a71b5f3c88bb25da8cb875694cd76ede7c9e4bc69b7f82581b765dba6af84a41736a65eccb1a840acbbc86300cbb6812810effc8ca04622d6d2c3af5fe8b193e6f2f3f688ef977aec34aec0bf125a2d60b328eedc45a0391c5a1bd65d8fd5dfe16c43c4e48ca791d2fee174b7ea887af77839993fed2ff3bb1814598aec170e6f6e3fcec9d2ff0fc5e00a87d29d68ee5528ca059ee21bd71bd1573fcc47a0aaf7be8f1e1d07c87c2ca4d102f6722413e28b823be26a8b6ea5508c900de7983be325dabcca74295e7110ddec0db0e17107680a42f1cea73ebf5c5a55341526479a6bc8aeb6614b3ffbedd74dfea0ca8e2a880922b55699d1d2bc699529197258845802fecb1555a63202662db18a04f4b5b428e4154986af47396258d43ba5f509b430b4efda701c7e1933950eb6ba2b0eb20f8ff8f1995e849beda61dc3e7a79146fad60cf6c42847f8e58cfd6b12b99f4a652b4894f768f3aab188ecf85ff484d7066e09b27852f568251b66f23428ce46d3c1ec7bcb55fb2d5705292336674a2fff83ce56b522f0319b4931934900056d0057ccee3bab03ee8626bc8c93854b168b1e432aa221a11bee1e469679c7ab8695f8d0346ff475b3e7f28d7b9fd8f0545246507668d66eeec7a28d43eb07275a39a9e09790b7b8452271843882e79fb0fd03dd812ec9c071cddeefe2c847e3b19574e45dc67d346cdeab8a0a633ac1f4345dd2941d83006da9d952ba371046525060c4cf38cd51efc3a9853b6a5abfe69e5d17f75d8b94ab029ba01461e9b807137568350f2f77987a725f11c1ceff4fe40a94f21569e6f0812dbf386e5aa19686bcb8d7722b0e2dab0efed58d1eebf6ae6d32cd6da65c07ce96996e85eb6ac8503c9dfc8a4a7e77fe864ccef9d3eaa5a38cd7cf8ec960b790de14fece2579651afefdee7f132f3e19e12f462a7463226b716c41a05a59c76f0e1a2f728f37358b08c2f3780f8a4aa72791834b89c036af24da6bcae2af00152d924b99b20cff4c64d2549dc4f5624e6059ce829a68a917ab079535e8c92a274363986a14618d041a175917bcd950b6956f6ff730c3434a10dd0709f4110d5059775f0e3f9ca55c3077490e7f9fda88cebbaed4d239ccf15b43086d8eee703675b5e7adbb2710fcb0dc6ea993adc96c1124d33e09320bb39220e2893fc81c81a2057a6d0e68968ba12d0e11826de4096895255f5c16c939bf5edb868e08dadae54f5e79c2c9feb20c52726ed445f508daf3ed5f534dce2ae9e43c8c041470e9487bdcf75fb01218f832e2e70f9fc2106f277466763fe22f199a4dc22755a655d2723c106b8798666db7a5a4bde215ca3019ff9b4e55cdf056685551823346c68b1ac6eb70b5594374c805ce6576b4de24b1d92662f55614a8369e619a1716e67c5cc2b1f5a21d58134d488d90c367f354d849303a88474417ec6e19f967e05aac21778983b6ac4c542fb708c531f8b1c67496e15f776627ac720ea1268d6acd234f2e9ca159cdc83f549a688c282dc2846e096058297c666eb0c622a9ef7de5eacf2f11d7f34a74dba539d46d10d0cb96afead6ad0550a8668fddc40bf7e04a088ac211adece9f7300adb75f151a777021e816ae775ac969af59daed30b5da585672fc4acac73fa466cca739f537b6bd2a215458ddf56d714cb4c098995ba9e6a4dbd515b9baf2426b14cf5007e13520e25ef8e27ad1714dcfa33fcb5fcc0dcbe26b5e14222671ed7c3aa239a3b39d2bc8e586e3e46b7f5f8699ab0e0a8370889d95f9beaa7618f61882c26f8f0b393e6c5960d5912fe2172ffc84c9101e7c9d44e03a8da946620cdea19269f074a3e93b1f1920079b44152a607f9516f97c8a66de92f9a4f3e7922d0bb4a19e6c67bcc3cb325bbe3a0fc9e459ddfa75a11ad071e5959b342b141682158bbecf7eff1984d22f013b88bfb60c3d3251b2a1b1fff499a4eacd38720a7c739a1a3a08d49ffcd88188f603de69f0af1f435477ec697d6f5350d6c87c0e8a9a623c34b672b09a22bc8b8447e6464013f737e19024bd6adb2365f747bc632afe669d65f463dbfb5542614ca161db69005cb7d096e56c5b6197b295329dd8ec1439c6444f22a28ee4a5a2d5bccba9d9f8a23ba7d8c8e6ada7129f37059ab03c703e4f36133984c35578d8b6069e3211617a4bede229ccfff046b4635d5d899a96f680d20d1303473c1e7b43fb63f4bddf4751095f927fc0e1867a809640d584fcf5139e89399e78ed18f3262787722dd69c03908d9d8f7f0f645a454cdf249a26bc60022427b6d70cfae8d2f7a32aefcbeaabfa18957ca8be62ebf7fd92e73888af0e834a680cfff036b4b108319f8233a5d2cc7d34b7dc92f4a83f0506adfea76f77b87874e1425b4eff66c5ad4073b260107e17d5d16911bc07710fa4d93b175024183ad8d44c92c6115aac80ae42acabdd95950349fcaf0b923479e8099c3d039c190e0e668d3b1ea3134956395da6eba299614791f5ef75c10fe06aaf90acfc58317e700872a8cb2d171898924315a207f0091d39f3478d2c59bf874b96db9ce0f7e8b85a9b805e07dc96b219819d51663ff8eeb2634bb42ca883d85e3d3d87bee2f941ad664639dbea405d6fa7929c45efbd568bc4607d5a82b9d877e2672f5a790ca691716f0101a6a1d4d51389c53f75c2cf36952a6b2e6eedf1f934dd064c20bf41a73b6f2621b837c31a54077ebb78a5c343640de030c38cdf729303aefc707dcd5f32db2ba4958ea28ff7802b325ee2dd22af8f8eda3702db748b7f7be3fec48419e6178412b4f2fda66c884d4c9ee66764e633b9a3200c807f8ca51fab22101067c3b8c1e49d112f1e21847762bf3d1c7a867f132414f668d42518ecba610cfcd95a3357a2b475c127b5091bfd466346e43ed60dc58c5cff42d34f758a520793ef282bc7d5a17d5e73a59abda4bad581224ded2c100cacae2c25bd4ca36b9c9009abe694e5dab45182619dded1832055c55208d09c0c6200008ae6d48e24385bc95418416bc69744d47796e21c45b02f3dd9ddadb212199f5071609fb2f267619ecf155fc00bb2a2da661a89dd6921981c43b005faa43fd69c779f20ba7cb64c0a6b82429b0082e604abad18ad63e10ab12e449bfe395140651c16e9fd2981758cb7d38c554b7498f3c6a320f4cc6b01bd07ffb20547da671acd4c6df37f6568a6428daf774324362825b1355c194c17906f45fad86647a55e09c42f45e4eeafe77a052e799e0e4802673bc83bd0f0b6cba2bbd8b00b35958f6ff2906cf069c5b0fcfe8be4a29f3922f9c74c2c69f559df60b5de54ad00b22f5e7c53c13883249319ce4a410753a3fa6bd843a66ac69b4c17e86e1ed25585ce53b5cbfb13a7472e7ef8dc0722c7f3092be3412249e0d58246c81a7701808aecee337b731862c7b38b02c3bf8b68b0cfb86cc7388de0a3125bb97605b13e2bfb9c69e4b1cd3200f2dc7093c2a7c267ceaff94841bd228e8cf540d34377daf38adced8a3f88819d4cc1d6cec91e417286510d46e64e32e25271f2e4a8abe37c0b3e22fe8500fdf721f989d73b45728b777a1d358ec79e68f370441cbdf3e4200d2eae942a9cf3a922e21e3f81b3e1fd2259bda6b39fd16cf06ec8ddebb6498a012cf4fd88d30f2dcffa188a34fffc52079e431ced5d5878d9cbd5baca89a00477b77a9d3839acef79dfed29dd704e24a7a6520aa486b01700261f35d2d48449d16cb3f5a1475988c0d220a0e3bb33ef73006ef2718264c203fbe9d18d3d42a4ceab35896c629164258f3771e0476a0d0a4b0e56ccf6d2f465bbea10520a77bf9ff183eaf241e11c2875b63f3b9b4d27cdd494ba2f4aa738a5f48464d9e29fe4e5ee037ccb3bd50b3a24114b8e2d49aa4e3ba69f01044e0935243d618d5c27df30ef58c15fd6c9dbeaf8cd3930840c1f0bfec877faaa33e0a3c99978d4cdbbe90173d85b38994be8bb826e8acb25f0f0778c6ed774a2f55962531d2d58bda8bcc82a269cedf9e7cc1c4f69b2c68994b92162fe3ff7950ede016f3ce171a29aa4f560b828d88f09f08dce4343bb2563f38a211b03fbd6ecd8f16c7d57c822ee3c29b5f16190bf4ef0a07d8fa0019feb1a223539d60a1f1be4c2e952d2c4a5300cd5a886e9af0 MD = 4732bfd9941893d6597ebd157588b7438daf1df027172664f8452d019cf90bc36ec890c143016d38c2b8f763dda58f39 Len = 34288 Msg = 5082eae7be7e608528be6e38b84f35ac404db9e67d0f431d9e9f04cc006dfa053c441808637ca1148872d57d7f35cfffe582ae5260f3f3fe28732a71c7f5cd4f1d666509a6dff2b100208d0da73a4cea048b66b2a6ef9741cf35c6f532d0e604fbcf1a1310101c0496b0df0fb8c57314a3502a2fd56df98e98cd207fc9660dcdde697e4d2875e7b4540a13ab38400d26cdb941f177d4df8b8d23803815200c52cf1bdbe076771a6a4216710bb112e2c787aef51f138c12e3b5202e489d64aa3ad5cd77f3827e7fcd67bd4054aaa3baa0db178ce232fd5a3c18aa71d6e99bae2ef9679cafd5f3dc86cbe5cab1ac5b5d58d0dc4f615b8f7e3fbfaa930a822ee1d542d2903cf63cfa3c767755483ea293986ee586c516aa4893b109da0def830bd8b8f49bc16dc3a198715c2a41e8e02308be1a7935ebb67ee0f6ad8f07b804f4de63b60766c3ef9841c37a91c5327dd64fc7646fda631be9d09780f91f661863904c001a557f27a9e074bbd1fca5e1741692a9b2db054151099b69627e802621967abb1eb329d59a1d8d06340dc874c50425d388615a907e330a4f104c8e98f797f5cd59ab4960349f14420020239f90c28ac83a94e97137f7ed1c4cb019d5aa3bc620146268303f0f14597e5f3fc89ff7c9720f9b3a4a45fd4bb75ed2a845052bf49b96030dad83149232f6f0a359b84ce8b7519fd58471ec2c088edbc350cf0f872529b4c13fc85798b5b0fbd7b8a469f18146c74388816c98f724f3f25ecf8e88a8139d0b4ed5802dcaf3a9644f2bf5ebb7383c0bbd3d27986c6741bed7ce51fe0b9de8734273365a590921d1841499df416d25b58a6fc2334fa0eeae239400f1360fba81836a21264a388ca6c129fcd4072eabc959dde8728818214baae9426910b13ebe7982ea9985c9126c6d30c7d2f0c2f6d091503f5bff14031bd595bf6f83ca99b18c8239bbf304daaaeff2a1e2e6732d5299906ff99ddfbca80a5f200a77a4f6e32534b5957a300de8b137330ad18779d5db65215148c0737ab2110d43d2857bdaaa5e072e0396d2af1ac62454974701e3be97fd6de9fe511736712d217db6502085c9d78e777f528592691dc821fbee03aaedaa5469e27d09fc4829ac607f9e3d1c3dccbebc31b5f581e6c66d57eb67be0731d10eaeb41fd86e5da8ec63278db7d9828ec5bcf522844f06c64b215e959a3e2919a4a2bc610af37a53ea6ff84418235fc6ab5d12c1bc6591c66a689e9f21b59e2b1d2c416929f265d2ad6a38ece7619d1c7989d2bb24294f6dd312f1aedbd557ae81338d5fbdd5e7cc3d3e30acadfd043736277b38440408648d09a0ea4f061e4bd8a1e66c4c03c8eaa3d128adf15e5cc0ea1f565fa55f8352a033f27a05b1b9aa2b5d95b860e4d0d3e60d68163bec6d5e9d59ab59cea089e0157a3187853cf172814fe16a80e0c72f0ed83710140fffba58bcc24e4731e2b6f3c5a33858118e4be35f14aa355f74a8241cdfc3022fd97b2232e2659978567b42fb92b6059658df587575a205c9a0e42ec0a6568fb4c44a04a354c64bdfadd70a064428143517d3e8794b777b86138b37acd5f2430688cf05f5619ae5ccae7454cd02b70d5592d29b53df541cfe954644c8b3bea58dedb12d114f09f0a922f72738138b795d92827aeb795f729aeebd5ffc8ae33db2bb9984df663af3ddd10b8c2fc1cbe0b7df8b8c2960c004c0e5978f30a08893dbb92e1347f05676d083568a9a52a0c8ca4196daf6dea05ad9447cdd4c3fd63072b019e132338401ea008029610f31bbfe804b6a383927fd4ed1164f38adf59bdd6801f68678ed1d930f32716d40a740bb635146d9ba7c7485550af0dc320c5c86a98f5b2d07b851337a146ba42d29e069b35176bfa9c847e89703c5201843fcd33b6b170d280e263207cd1eef1de0217038f200d44e32ffde61a7d8eda5c3022ee53c3210231723f87f0693375af38e39baddeefef0e323ce799e302923b4f6fe70aab51d3ffad0eda966d0622a8bac2a01b94827d9023b22a891d5bed83e61aaa55fa71bc6e0b57a4f96df59d6d005acd42f14364fb8cf41b628d0920d87c99c490010f4fef05b05373dc805a5e92028fde75c139b2d68936b0a288f09bab93b2738f98f305349f82a04914de1ff8504428827a605888d808fe0e59c16fdb6ef06ac69d4a33007b9f0934418d039bdaa6cbb7ed7d4f2c770e95110a07a784a20ad0768aba1b01eb25191e850bcc04f804327688e52929dcb4206af857e55fc36e5effefc70fb154915a686dcebbbc3f08e75edb3c59197f962a6cd326ab95499760c34af593874e8037b25a4a653a260174c152e76163d6211da6f8f86cedbb2280811aca490c4f6e5b8cd9034b0723aa455e9e7ad4a186f174a9f8419bc18e7c3889ddb992a8bdb81058688dff9bee5fe3770c6b254af863b9d64f96dab94a10e37e125802f54fe9f085974ed570bc9ed9bb2b4cc5d8a11467cc7d6c8c2d549d2bae470a0c6a4c9096c4d3ca7f1e34e3829b897448d3276018ece0373296545d7bcafa6421805a386d76bc855f0cddca9888959620b2e1f317c8368b609ccffe5e348adae4cfef4ddf2ba003f7b52db06612de06e000672a1edeeeed88a90ddc4d7b96f2c8b1825d76442cdacbbf8b3185bad16b09343d9188a167b23d33b493b410ad204fdd99c3cd50b15e6d74acca71f10e170ed6cbb5dfb03f8dd0d55aa14c941c07dc9cbc2d4ef1ec233f8cd8f7b545e2bf535097f39e7bd4e4f5f646815166820e01876ff665782badc460b625ba3a0db8894a38f74f64d63c1f2f2eb07d186d9751161bcbcb83fe728e88bae10b4ddd97132c152d6d1ba217bed869ab1a1a4d584dd145f9cb85e2f6107d5dc632e1d0df836eb3027200c6fc479a9dfdd2fc9fb55a31752cfffe67ccdca725219ba685f65c9a9912e8a4b34e6bee1215123fd33308cf3fb1d36dfb5b65ae97afdffc7b7ff1284ddb4b8805a27e3b9c9d62448655cc02fc44d0551c262dec2bbd6a641fd0f3a037c8152b3c8d011b63d34dab379226653142913458b1a7f867c6b56df19dd68afd75dffea66286f62e633ee4558caa6e7527709c2f72565bc2785b8a8f3b1c50e5410672f1c7926442c9b0807e89ca974e8008ed1f0cdb7ec23ec73a473d379aa5c613389d2095de47833cfff12df97823d8c4b795e589e9ed86830db828aab0b58190b0170223dcb30c4ec37bfdd9897b9e3e8c2270f415baec19756062083b7ae00969dde0aee80be1606b7d5dcd23dc4cc0cb4343ac9aa0dbe4f1ce8db2a38c8de7d670409978b88f1c6853e2570fbc6105f586d215d145d2901351104c8160c7b6767cb696075f81dd4abe000985927778bb5ba0b262006c854aa68e284d7e49ffda4197072c57461d731a5b473e04fc935d304424b567064f182d4bf8705b711e726d868f5036687781d738b2817a7ce07bb310cf53e03c47fc53fe1f927ec9accf5ee9710b835555e7934cbdf87954ea9742bb24c6128b2a77b909101c6ed02551a4546ec6b4994314dcfbdc2b68210c306d87b774645f411adaf17c7692111299cc3bcb1a40a0b9b9f2ca9f62ed7ddfc7a22b19f75c453646383bb7498f08ef183524386ebe084427933d7a677fa7dfcd7f09aeb770b9749a3f6c530dcc24354d7d92193c933c5cee2cc8ef81755b86c25298084d384886777ef7c22bbfff6fba13f9f01c56b98e8e3df1814984e56f46db7a9911195ed67e6572a73bf0f708de96e05f868f0c3388254bb23824f1e3bb6815e3bbaa890f0f814154a705b79b3b54d9b9f382a0e65c913c04d5bbfd9ea086fe6aa552437abb60f85d05549d9150fc4a81fbf824318c0046fb9ad064fa86b698b056a71ab3f2730c42df642575afebb76a0855e28f86e100f90ff8c481ee857937581f7b45554601988dbafbc2a8b1a4b49112787aedb1deaf9dab88cf486214721231d19954385cb098df6d02fbcc97042eb4626e10f14461dc5f4e2d14eb0ef32d74da4a6fe8823da93815b0e9bb12db49b21cd3a13de6c2448a8145d46ead3cf26ef1b318d52692075b6257230b8c9c7a9224660ee61a435eb3ae84178b83a21976947ddf6cae506bcfff50182c78ea29eb058fda887357837132725ec036e4fb224f05343d7deb1efc3956399c7c26e0232cab64a376916b39b99b0a9b1b582ff88de3b7c639e4c9669cb417d9eae525b126535da598637e83a058bb7ab58e207fed83ca7556bfd395b604337369a7733b7f12263d4d5025c59345e1eda9e9651eca8fece958eec61001c10cd75ce0411893624ea929ea0995eefd0e625d1c765bb142af80a4f4395c0c6514a4591227ef0fbe4797a293927b3fc891873379cccd4e5682e9ef5275e0328adb38d2df901540a0a1774bdf48cbe2332bcae1a3e0d9de25f7738cac2433108cd1235e8b0221d293dcd68a3f952e92e73d8bdc0d4b080d5b8dbc0143cccb22f586e240b7069b32125a23e2471009be3f3768872873ee4841a621f1cbd81ef65f7d044dd605f7fb96b9ede86841f3b0c5b9df7777f3e31b92e153b2a6ceb4e71523f7ca8a98be7bbb7c931115936336f5256f219e338ce3a9cfbfd857191381d10c3b4b2727554edb02c1d0f19cdead581a8619edbb425cf0b1c4d77f5fb162fda64d445e4a62f19ffce8bc6eb6dc8058f9b2c4f913b9d422381144620b24e70572bc5a727a5de054cb7647ff89c35c925373b742a549e5a8d31383b193d4aa8301f6d2062facb7a3ef08e8267e599e7eb857655d18890def134a39e0924709f0c49b5fabd2e5c3f7d80f31761cd5c28888cc639ac5edc97f6933bb717f02a1c94af857b61c8fb1eb26f7a860edee654a554116ae35ee84d4555eacd6c28dfe9705bc6ed76500fdd85c60a16959fa033e9e6412e9f101dc78682972a2f54f6cc47555e96234f00459d8c8d111f98f08cfd493cce08fde3cf60232a1489fdd98ec1a337bf914c351ea3c9eabdd3523f298885ec9145aca32b7b3f8ad4a2aaeff7874f38afe8cf18303e850963da54f6d033a337c17fa5c3a480dea1b2a1e3a0ce416148b04f60104217c9d24a5b267b4aa6aa07a4dd71ad02170856f5ae3054dd97df5108ee88851ed59c2dbc7f51385f88a243848897c70de7c691e7f31a73ea2fd33a00eecedf8a210702ff6e5c93d68294d3a7a79f7b8d991f3ace952865beb444ebe077bb874fa311395c4fcff6793b879f5663123049d41c3af3bfe39321cc3b4bf0b0d6e33502c2ba1b4a33c80e5c838ed8e4774d0a41c4779e97d163da1fbf4478c2a75c03e7226d84890f715e8c908a7751563c98881fda17457c3eb356d8bdbfd5b65b83f93a3adf31eb593174b77b79d23864bb50354ba5f26c8d72198e9f0e0f8c467be1110a736d4fe84fbbff472791a32d3b410fb391c627b6e00fead0ad9bb086b446afc38963c4867f0a71d7c9b322ffdf04b4f824e83723c5e1f339e49faa84f6d11d4f693bd19b8a091313a7633a4270412c04a381243ae937b2c2fb4403a7082a62945b1eff8f395fefe308c7755eb79f80bd59b8746513b72d5439b14256b4f8867ca734d5ca52b50d3036075abc79c7b70d8db6b10b0d0c6ed5e70feffbc0e392ee94a4dbb49db273e0774c71c28161d9db86a262939ddc7d2f4d8592fdf5958dd16b9799b5e4ff2bdd14be43d99614ef0e8da510678cd06048b33cb4c41bb37f0f75349836ed433d0d558457697f88ff90eae742eea18f210a615bdcb8fae8718ff7a45f9d8127af5a81c735db05661448e58f8090a6c2c85b9e0b934159d969393c0e765468538babe2ae6695f056331ec6c653b561105b25b47460c7023172f58b9b66c16a6ed9e7be62710108ff66fad4b341c59c22e44fe9bdcbb2bb9691ab2b72b64e4f209ff85e0ade86140ab4c4587fd4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854 MD = ab4cced009cd42ca0a92339d0513667901babdc49182fa1d414cc91a48827429ad8cb733b93acd82e0edcd30d0ec568d Len = 35080 Msg = 965dcd60709712fe8f944dfada3235397690bef28dc4f8054fcc348f37c76abb9066d7db379deab7a29e61242107b0d9645aa27f3eaf4207a8a5fc40099e00a9b52ce784b3c6992bc3c06ea79f7a937f82d7b0cee7f0c798930a605ed5c6e3f00d9845836b7ae603f9e2baabdcf1a8d2d7ed2f0810f14f6117e3a71124a7db39a0923801e7229be74dec8e575fd5b57b6b8569544219a20a3c181a807da9af2c77030926b0247e7ec5c632d3b08f83214688a4db03d0873a0a9201d46834297099d101194dea58716c58ee485785da6d71dc29c4de7ec8998a37a4346db00fae0ee6660346daf067478b0adedc218107f36b4038588b2bd0c3f04ac915852a8ddf28800b245e10096045cdbcc8ca4296d41b305ffb607987bda63cbbe71b42b61381995a6edd7effbe6f810ba3e7e3c21cd643604e637965813fc3316cdb1fd0b2d8f717acbf03f069f26cf2f3e22d35d483bf64d9fdf51316a525532a2b8884c514e36b676b67856ab4d69a4222e894040aed922596b33984beaa4aab74467a521fa57e254b7265c89f092a170fdc8ab2531513b9977d7ed4749c3e771f225964e0857771c6ec388b9a4ccbfb11d0bde8457f0e1d66198a0dad41561492e1ca003fcb7ed0449ca8bc8ce6a575908ed5adca72acda6d4f063753e3bb0c374e743024bebdcc2d4b5b615f20df0df4dc7b0ac938157713e99a5b4dc895e7753000fb77a759eceac1f985fa42a24ba58357052b17707cbfaded8083380b2bb34e156a20ce7db8e1c62b2d459415b80c4b10a9d658e572db65a8aedd7d45625b715c83087b4fb97b229963285d61db8ffb4efbb3429ee0ced772ed43de6c13d4617c5015f6f776209cea2e8be7ad3c975dbb05aa1fc04e00ccf4469da2a8c786e61ed930869e7839fec697567822648d37fdcea4357644d90bd6c0d3122005d9c8ea2542756c452c0ed7a47159e8dad752bc5e87cee64bc15ebf64cd76fd5535ce873c310988676395c25fc4d22626df76a1be3d3038ea208b57397416663f02c29e26e78b1b66445a32d0382a04d10b6a53f5aca395aa5e5b4747ae39844ca86ad6eb4a424cc83927cdfeb3abab62c5f87b0bbe712512e396379664287f038f8ed89444784417a9c23bf11e9b436174e6c10959e00faa1704ce2f7f2c7eed1ff84c29bc732adafcf425b16243f3577ffdccf6673a7cfa636cb519e58ba990c16fd8b0997d279a9985334765ebe4cb500545dacfc5938b2d98945c808d2976dbba2733c5dc63deea3d0cba11db3e454ec6d3bd79ca7de4de4e1201367c2627d7a2dfb927d8052e56e459124d5a284de1081fa84d90618ddf57d70ef19ec72a1befa94ba7bb36124541c15700b1ca6c7192d1a23361680f977b8c8e983d350611692cf02dcb1d131f1ded9214294d29662d90b41383b9f16d81d986139f98461fd711b0a152e3b84d4084cb7008d90d29a104e5d53f7ebbcb3365004a0c176faf03ff93eb96af8a35722f08fc96959f20b6d63d61dddcf61857d90325ceda0b28b39fa2f4e0aa10407b9653a01daa67b433aec49fa5fd29bbb6dc988c2c0aa1f2b099e4a277fbd2d62260b344e340ed4de2338378df09dc1e1817c6676dcfba75c29462dea5cc5860303631d0317dba54890e81d2d22797a84531959eda50dd18b0382291b0422b446ebfd32c4f8c552ff1e7c697c780e3c104d30d19bbb69246442e2ea1e187d2eca1a4a34185934648e2645bad063c47d11ea537c058286264441e8ef880c3d5be948ca9f51bbb1606243047fed7824c405c4e1a7cf8cfd3db79af487cd51dbd240e20ec31582b4cd07ef19270827a78778477be33e4d36f13ab8a661727be1085d60874de860c7010b95045ed4e4e56dc5ec72cce655bbe74a257efb0c0ce5949b5eb49e2eb850a2d9df4675c85236bd8b4e76b36c18f476725bdec2ee6741dd773717427cfbfa38ff28600a46d2441d44c7e835140989252fe64647be2d8e699d843fc937ce1c29e80ad19af4e765f36ef357d092c9e279ef3f55f7efc233bf6ab09e9103914f0c20f12b86472444d6765b46045cbc88fb4cd18e61f7b7da556b66a43854d80b463665ce8ab20b494d076a234ed673f51fa5374ff46a90dab21bf0f13d9014c96e94e34ae6c9feebbd8eaa802e8462bf5da4fb2b5dbccfcd5c08fa061f69da11ebc8f42148f381b4ae6886dd120b0b303bb87790dc62d71ab99eec433c369a6d544f12d21fd3363c964199aa97cefff0405c57211ef1495b615a4239328ac8442e93c9edd9cd8edc1b965d692e44a38801fcf45c83fc8907d9c7866880db062ee14373c51556ee2ba4d34ca95400886fd736d993a9c9389889733351a5abb695f2babb084113f693a884e1db97872100568691670efbba8606c9d3752f716c01f9860a17eb691abcbd27b780775d0ff1f668a65712189178c857e1537cd0991b6c11eb8482dadd0f4938283851d6a7ad4d5972e451845fb94489e77d2c2db01aa10ad9de95fdbff3e332ce53d5987aaaa1e5918f5be377f011fc50329bfd63a85ebd4f7693363602f1a4147371270b72ba798cc88faa7c85a71ba6447ad4064cebc5c6ed1908c1c51b089507a2e6ec8dfd91bf206b3dc0127a64640317262a60eea0eab28609f5b2c5ecba90e97c7054d1cac3178d31f50f1263140f1f88429ccddb056768ae444468ad1f9fb33c397fdd91131e541b8dd3e58430b8d25ee1590fd0a17c4f6a300299e61e949ecaca67776139b55e5efd199a6434a10e3e791e3b2e694198c24b65d00442101a8c859445d7a17d0a70b548777fba47f19b8c54b640a787d34ae8f681a42482b5161d9ebf40e4c5f6f568d923431c2e4afaada527b3f69f8d68bb3d4522206cdcebd4ef4a597e3092516a54143ae4b468c03f8805f4d0f935a01492912ae05f10724dfe8d7dc83d7b194c41c0d3ae8ae9a0b465c78fc1455a8597aedc1acea9ee4e0b44df1a6d5cffb1810acfa9c4123c00ced6e2f141d47a8db6daac6e560dd4d38f6ae5dbd81fceceab478739efdade64c153eea5cd56f43ce4be78b210db52a73cd9082e92e636a51d609de06c454f414e455129de1d75f7c3b2d7727992e63da607dc8f2840e5e979fe5a49d4021d3ac853a109fec87e52b6603f2c1ad50e0b5d8fc979f2d04b10236962e2b171b695c1e754a2a9c85be24f3f164b5f1248a4c5c9657b9ce4d49dbc3a4e378f14b9f6cd88f2a0699dbd0af0b7f35cc0cb147e615d1700812f2106970952a4b77b75e23da0f17fa8c910513d636cecea7ff00cc2b384b549efaedf663f36d6e50698ccb4d7d79d01dad449a7b9d958369179e47c5504e651d6dc7c8c44513a7256912aa5862b74ef339748a233df3b3fb00079d0ba3e20335538828bc1484bf9ebdd90824443b3db73c7f2cf59c512504c2251626b870f58eb5175e73e7277e626fc82fd8ae6c6410bf4cc81a4415a22d66defc3e175e04d19a5cb2104666ab1a87c6669d25b28da7c9c3a6b9bda9f21ef31c957a4915f8a60b3f6cbbb9a8106d0bbdf49b33757e2362cc0dfb8d73dd7e71c62b03d5fe99b40fa8d39ec9567304059422f95f1d002e924f47083edd2bf5e9c404014380aea4ae7f30defdd69d867c3338e03112db6d62349a07584da32d62fe689b1c02011df0accba6de91569c79827e7732bdd78ad9634f20612d0ecbe45ba1f9e6ee58c8de17ec1cf3ef65ee03683be7e984bc2d00c5ad7de3e4347a77c6f6442cab7c4d7fa9db68c459942322d0b957dfd051fddd40fe4365dadde02424aea473a13553dc48dfb3d935a9e4de9f3ef09a0a5fa37bbd889d7077d1a5f25e124045384a82fbdd4225bbec6dd840be13d9a498aec6df2595b18b23d772ea5c6a4129d88584e6514ae5f1e7a8a84f15803b85e4060f135e6ba73e46b9ef1206fecea8e9acfea58a401c038d22fb148ccc3ec3542f261e5252a811483dc37444151049d3889b3e726cf17a45a27a950c4109e852f0b208e794dc8d912c9618fff82f94fee100bbf0158ddc79f2cddc7b25c57c45135cd907786a39894d12041df05211d37fd823eb8417b490d89bf1c3c19905955ecb9a99457a9d996add428843a149b829c97f4d02b887f21d8cdaca5dae0da99aa7538544364227499fda263945c316a97bd6fdd598df068949a17a412c1beb8f9a0ab3bdc4af9db301d2e11c660756c59830e345de4336e37a4eb9b43ab8c2044ac90bf74c6c6170aa34a0322b9ede46c596e79cb33ceaf5c7e771ff006a96c25f97743cf702dd4844084bc5bd0f18f3ac0ef1203e518885d676896ba7bcd092827dd9d2ecf877037454c91b44e26a96f5a3e91ba80a795c5202e93e5733d63a5b811f0254d69968e422047ce7a03ef5485ab7d318ef2542e19479c03759118291ae2f145725aa413c79e332ced0fbda4b3d4391b789f4fe2b33213b70b5e934cd09f1501c6c125423624e8422fa090ba953759cac5f4f5ad9e7c9f529cfc716b69c4dfecc33386a42e32db90ba6d05008a4363e20f99c1c93b859378b3011f2f56e2c658e03864a4107681ab05db87311396cbd3be0440d00afb949be5f318e318774ce8b6263bec7d3e8ef3aa6293a6b190162249bb0f5c9d3d173e9e48db213f00f81ebdb378c7c519380d00a8b6fbe4cdb7504b2479c962d89fd35488f2842b0e3c6d5f36b7d0a8852149b1046d8b4dbe43e02ae70c90ec3ca2ec9129db767cfdae57134655916800ef4c340c23ef3cd020447169546d99f7a50ceca21262a56db25e8258ee84b42ad696f226768232a1f11fb721dd9a0c983a96bf9823e324ccdd0624e4ef14ed519b9c73f9e20edfb22ab444b704b0b47cb82c92628c728b99a2c06380e3eca41382cf41ecd2cf947f31b4d27f663c1233c220fd97b89b3a52982fd6a3495658ff40c1e475e55ee167aa93c9117eb6b65bdd3669ae34b7c1962196f6c2abfc7c6339f6c43b76374709f9c3a0e3ba9b01335dbf6f2c8d72b1c2d3b83c7568499eedf2f0799421e355e4a3e6e28ca6739378e83e66892f367b7722e610222ab8310df0217d1654ed6e763d501662cebadd8af135f85a968d8f1193b32a5f5fe2c321b60c3748aba0214d2aa1a50c9fdb5ff80d388cf75fd27d20aaa1e3936433d5f7b933309182b5fec7f05e26f0967f9b3e90a8ad05f7cfc622ec34c454f435d9ce7e2901877699577522d814a55f020fcd2028c10cdabfeaa6bcee551a7c635f3479402290e3c4dbd346c1e6a135fd3e22301b7162854d6b1aa1210e5a6946d6b83f2b0c5476c2fc70b08e155ad7db96ec450326ad93d2c7fd4d8f68ab474ac0c8344c37389c0e29cc14af39589127ba79d372694462fa71dcf68bec7392f9adf30d262bc3d010f443c7a7cb211e6c09697fdbb1cd9f1ef92850a91259d8de0eb70e3b627c9f75dc866e0a332abc0314198ec188bf94dade6dc06972b485626392cc0e73c966a752f25c4919fc16975b2894a66690d098922bea3f761a35213cf4db21c830c22fe81636d6e80baaa35f15360cc3c7fee2a4d122ada4f144950b7b9ff7d8593e6a1c60724615efe491904dc76738eb6c4396fc0e3677e040285f95aef33c994800607f93192c0f50ec8f50ed483e61a535d91af16c775dc46599b16cc66d775b6d44c21dc2a2e07c3ebccd0c123cd13623fb9c90b21bc02dd74a7d7dc3d38a051b39b676d51309c2e298f09877bca09bb86f2f50a9edce08f7f248469e1737b194dfeb32b2e4f1c192b48a36cb4656424db411b5a665cdc24221b05b97a1070d5477ced5fea12ef4a99fe85b9f6268c66e6b02444a0c46063049342142f98e64f4c1dfd51ac027d891aba97b56896ea494e46f610759dd315ce9422c42892454d02eacb499da52ea05683c1aa333ce494bc0b7a060c6d9d02272790108e86f49811ea3f8fe5866b55f661ebde7ea0e311d708986d8ebf26f2b852713f89fc5df82226426aab2a9a72a25cfd9a724b50864844398f2218d5ad291fae9a407de734dda4ba24171b25bd017ddf2637c491bcb6c743b2f10214fa21962f69dc90fa16e96e910353e072ffbccb7acaf493107bca9aa01f22044ba348bedcf484befe64ef8cad508401ebff7a4eb4ced241338a2cc4361edea7e06e479f9d82618e5be79604f852d506f687e40f7679f85564b3834deff64d713c24c6415b5c9b887a6787e0 MD = e1a1e25e96b2ef7504b76ae5adefda0114c7d4a7a6c6796745ba9c9d204864156b3429fb9b9aa1908038f7928d48267e Len = 35872 Msg = 7af760f18bc91e656da92b72e98bc03f1c6bfb442830305529d681dc6bccae66da9b2e61b9c97e2397fdb92f7f6369b470529c570c2d3b329487981d148a462cdb992d792e34dd233e1c239657b8da0d59b804566cf81ad5f0a7a0ccb3a8fbda673887c153d2e56c484f9230d752be52c1e35bc9af5a7446237fc072afef777665c264c18e6a3c059fde2e8368f9bb898f1cc8393d1bf18b1757219670275f0bbc7deb0248c68af929111e19737479bcabab732d7e033aaeb277eac05e185e9e56b2450beaac784dd0308b7a5e8ca1f2fcd8852ddad9f7b7de264478e1891a391aa89964dae5ad0b7a829c2c9209db346ceb26c1b967cfac82ad574761443be3f0a910968239d23b11507ab978b3ce89e22b7d7283736b9786544ab4460f6aa5c0fbd228496f8fe37ce24ca9775123f947e2b3c7a0c6737fd1634548f8b34f8672e706a296518b0da3803b82f6ad828c8156ef4978288e6d4d227289dff8918eefb5d58dd3a56fc06e726fce5f8d914b79cf5a7e73616468e1d9f70163a5d8c51dad666f6734e205c5ff0f1419bafb3d17971cf0fa389e7875cffc38ed84ce34e517e2d3bac68de3907143dd8cfc666a44f55c277376e4a5f24daab5e35b19e22f3a703e34231862b70e35b0201a7bdbe63042aa48e3ddf83e9b2800aff361d7e45f393a3d122a8a221f0a153ddee197e691f801df47327842019fa1b7144f1ceace644e3d5c6b64baebed944b0e40a62d60a3b4a26a8b2ee6c7372065858ab82bcf1a039cc985f765bc04b6b2734211a2e56e4bf7148e20133417062010bbb38eaa83dfc2211d4b0cd87702dad58ddf2c677f4f480ce658af9168db4f7b8a16faa6c66c172cde6998886f012cfcc918b530fe48fc1b39dea32651255c8f9ee8590c0c3204b26d58ef1414390eaf9fc5248614bc7b0930b8d83bfb6eae14a03192247cb8ef7a7520fbc48d34e9b8b6ed61b2e9352d9e72f035188e3dadd237f98d363f86414d9ccaa2e0037a26ddb89853fba43a7aa1a88ea105311bc1910c49328a7c2463f38a5dceaf9d912be74acee4ab6d54cadc799806490c8f5218c72869685c1bbb34e8e1667a8403629d1698fb096e0985158e184b2d4821c8300f9f1a1707f1b3d85e5f5289df5831c9c4fd805ccce413158e1558f90d598ba18cb52de0a431b2a693dd7a24d7160231fc065cedb26adca4229815f582c00333e7728a0b5b601f673066c69394c73c9e65ba750446254989f2a86a68d0dd99adc8de19e0560864e3dcff1e1d3df247d9a721b4e8b09cc08ea54d3f9c1e38b3d9d602c3a6bab0e8e240b26a0cfa208ba76b4301e31957aa79e38f7cd7955abb7dbae56ea7b2e1132c048692a6f5d870d35929453ba9df7013567709625dca17621c8f032963224d88cf847e3453a25e2318da663987bb7824a40cce859d103150a2096b75f8fbfec049b216fd3f06bd61515e4e25dc732c747557b3877eb56f0ff75a8cd397f48e9a1b1a434bdf8df553abbee347cf90f3ca725ea1b227403b66c18a508a699666dfedc4eb645bbe6ec2cf010fe6899934f0422b7e4cc039fc1ea9a29ee49568ec5766b6f791dc229075642fb94c311659ac8ec6349e732919ff56a95d2743f389c92ffa501a8a3fc4361351c9bff08fc9c7fe35a9f06697fcd171a7779c9dbda5fef098dc478ca070cb846d2688ee8dec093982c78ac10b0c5ca1a5d38bc850a9bf509685600bcafefd5e8ebaef52972a39e8b574b3ad0db1688fa9593cef34fbd2f7fe32ac2e47d49449b96c3b4536eb21b2d49ab4522653bce2bef1f638ef05ff8ed8cb741e9d5c58eff824b6eef1978740e920d5d7dd5a2143e98303cb0b2e10bd2a37000257fc11f552caa67650963439fbee5e64bb2f5f5a34f7a9d110ddcb2bfe609803fa1e8606d0475404db50f04613ec972347383ecea6353172847cfa815b2d8449102980c8788108c11b2e820f3802c83a09de86484726e3d5f17263664a860bfb2185c7e354610ad49796b43b721838d18989fe6f20b00623de27cf83d1537741b39923006ccfa166d7f14c73c916301150a26fec38bce483d4030580fb7c0e4450cf5cc7c6b4169f64a8135e46e4f821e58fa1669833c31e5a6ecf04cdea192c7f8e39df6cf6b1a6c521d1a5f06ad82ad0ba5c8646fbec1cf8d0f3b75183df21c93f83f1667fbaa482c64eefd09118549a8968f44cfea7a436913a428e30aa4ab44802a4ba3579c024fe51e5ec3fffc6ca668c57b2223bde9d196c4d8cdac0cfca127ea1720236233230a42f4e5dd6a9e8b891577e51f2f3b4d0517f54676ad99305bf8f96cd38f434c60d74fed4e5247ce7409dba72120b031fb081edc1f09096898c172c7ec85cb327555c028a74600f5b5fd16d6de44d136c53fa5fce9a1b5b07afe13efc2e8336bb44916469cb85287bb69ba02ab0e26b200093b378b0a26ae5ee94d331b29045eaa1b82c5832ba50b10fa15a90bef294a480f4f0a5794f4c8d12d8f4049cac681c367c603ef0270e65308ea38955a4145f9bc41e3f3e488865e357a85d33fe28b9c9820a054ef5eafde20883fdbe2075b818ac462d47b5a6d728b6f724c0af0c2923753194944c6ce2edb703d2428f3e19c1536e57dcbf2e4aaba0e9418be69dd40cfbded30a531d7c19452af12719f8e95c62a1a5458ea92632bb879ddccc61234bbc18aaf73384332e570142b5e52a8fb280e4ffc9499fd286afd81efb89e27caa62e701a5132a70f3988ead361c5c758b56414db21896b86f25e4ad2f44a848ef9253c05a1c959931addb1bf0e51702af8bbf774624183fb4c5b433c22539f0e3f665cf5f764f18b041f0722c69e19ee5c86665ce95accf1f364f96fa551fda4e362416fc48e05338fad39c32cf45b1f6b53f009193dbd07621bdc020fce270f8fa997e78baceb491808e7f4a40c8a3abf9512ed9452baa822d07977b410819a8e9caed1df6a3a1827c2905bce4f4ddca3da5d8ecd326c60b033405554d1b3c28abc14c3121e684d596aa15cfe250c51b2841e71366548ad94a4cf1f448a3433ee98684fd6620c450751b96cd6364c468632f4196263c5fb3ab5842a1592695b34b1f7bc9ebd8c9bcc28372fc8eb943779577d0bd3a66ae62ce5fe2a4a82e9a4e78961bddd896fbe024eb90a58cd6a811671f7ad0ca5addaf5a69b8455e42bad919f34b8056e3c286445ad80f84435cfe8131291600a1565ff87faccca3eb5d1ad53cf2fb8d458674c9d832849f89c8068ab4c4d802c27f3d4fa7a6809eafebdb557bfa96a446af735c6e864a052f53f12bb1335ef845c21008eb8eab7819cce240b74a99c36ea54ba522bcaaddbd64860b2f5ef00bb3869fca534c9358ae68f73ff9ca4c1444d0c44bfebcec4fbc658ed3362dd6629232b33ee6c98067f828e4fa4862f7bc5099a6f70a6e5885b3bdd22acf8857276d30140bacebbccd7e727018acfae1e61a66b8504dbb36a42ad417b90057bd7fc9e78adaad9b8eb1c8af62422d7a53b82ba0c3ffcf89cdd7a9122827d3824e9430bfdd53f2c23d3b5f48831fd4ca955a0ab08fab98c26644b9dfcc1d50f1538e2920d41d82461295caa39b58a8d3eff53ffce4fdb14c4913e1a3ca437e8c13953d7239e1651155e4912a7294b17ba9b153ee8a9d2111be6daac6eb40653cd8cff21dd246a4094e533d44cf7cf8ab0ab5cded4832f0f70d7a9bb0f7bd0de7e867d38968f54618440755587bb7844c5b2a3560e86426e87d613cc9b6617f768c83651fc2955325812b61d03fee5e44e53714b130ddcccb574b157aefd5c2d20c4c3245aacfd4174be5e913e1c98c7ded05f047e942ea87e45faf296cc0dee1b0e9c164e64bd0d8eb5d768929ef18ddbebc548adb3e860669c69140f3cbdc8dc0829ae53fb04f4fa9bd8f9ae109094e9f83c5e2cd77aa2f31a743254d9ec3bd8341462e7da75964cc2abdaecfbe68b7d782cdb788955dea832b4e4242e09b59424c4ca968d7f7ff9ece872dbdb73cffafe2f371d541a81fa67939fd99396c4845cb34bdc7e9300865d1757f719c8d106fcbbf787a2391b6e3bb8cc01c533f74d4e787d164840d676a5b0f0cb31464d15f64ba353fe223988216d0f291d31bc437c7cb4f05519405f592de3d4dc7c82ac6d66b0eee2663abcbb48cfac1640920b5958b9e73f7cfc84da16978055ec103ee485b6c4d995bd805bd484274ac107098764c26761fc699bcae3826a58157441de310b826e112087a598c317153389c2694984fd571806188e2d4b0f3d793d69ccf14583fa6902170aee12f8202898da817f6815a940506fa64c47cb8097c9fb333efb66091de0c30e7cea46d610c296527ef24cb315d725a5d90f4bbbe1a88a9372738534903b2022adcf8fb17c859a7ea0aa0f1ef918bf0f4c17fc69f7679c8054648df7707fa2d9f9194f4cdc506b48bcf5d9477a73b0352de849f54975b56c2d44dcbc3f3cbfb7078de202a0c16d630c6c47c70aa68dd9e6f6d0f8486149c9957afe0d4ce0fb2c2163f47d7a4735202783b70839ffcc401fda1ded7498ee2b059d5e653a0ad9bc0f520307b950373286c2b3a5890de01a30f88d4f7eaaf702f6129a5e7718dfe8f9ce7a4bfe8b080ca2afda09684f6dcab2d8ab98970618d3ff812e4394a97235a93fe6b4ba460c0123b176be6842c9c41df0f5438e48b8208a4f86df132b3514763cb4dc6d1fd7c2626e363ef97688b8fae7f6ea94d1598b1f04306b632c9d27e93b812d8786efd2e73c74f5ac592efba2142cf87b3e61462615c783051c1ec28ab2b812aa09b8853ab2df8ce169211edc1c03f781fe8414581a98a089783e86d338e6364516c68bc557c27f49350394e146286249702667fd79306e60cf70e74b448802e93c9e393f91ca27443b5af05a48e6b35261cca3beb83b271b906a566b6c1a02e6f9a43fd1f7531f52fa7ba3bf9adb850d11fb69f46df5852a596f76abf618b0fecc7ce2450ef9e1f5d0fa3189928331fa2f172d36f10be31d8904aa9599008771338cd3013f2b09bd7d6b3c30e65a54aa07b4600ee7fadb45bdde74b0bb6e10febd68749f1e62e11a5e22f65e0ced579d3a57a4e4c93ec86356316775d3bdc7e7c8746957133e128cd1d622595ca8d53445855e410b3454d6e0c1e55d887c26cce34503f1b419189596e932cb7c09380fa7a20ebc2497eb20fbf490e03025a83eac6ef6d777805dc50bc09a1ce1ab0a9fdf4248aebbc605c1f64ddca67156e68d72368480e4107c8bbf10dad603fac7656afa6ea1274b3f4a6e223b08a26c4c69d3506f767025df5a1f4e778f7974f8e0c92f132bfd93f21ad2363e9f69f264345e210a20a24d00c0aaddf291a8a619a27844c8b7a53cb8c3a0ee59c33e65a87d514cd73801028b5ff043de95280a941b06ffe1dcc4a21dc588bf0f2c765283b58b28690502d2d9786e148df25e1f02cae3a500f3c2607ba0c82cd133c825a07d3a4842102e2a75baa2c49341d15fe0229cd8a8a534f46ce60dbc5261aa7b69250d20c4f1f995da870cd880fc2849b6c2a10f4b5972da6bf5b7e1e54e73b0685d62469412eb91827e2ac4d999b978f12b7ebd5b99228ee36055420c42da610876e82e121b7aaa08007b2e0f930b4a19bdb4677bdcca9e8da6743159f734f9d411fd4be1442d3bd5ae7c5885809459bb09b0920eacc165a548834430c42a0745bf1024644589e375d8bce8fdeafb043f8011c19681ad90d4b7110f33421005f7cecf4c2d98072d532fab63bb2a95f621c1467aa5e3e58c96828bd6e3e98d7244c199279fb43b760813c63d5fd7fb8bfc3dcd21af4c0fd5553b725f9532f8e8c757fc5b5d028d6a1f15abfa4e6ba2524966246b354292f7bb3252edf9b6f8b5f9c2673bc83b7355d2b5bb1f296e10c573cada9bba3015501307bc2663ddf37656c1785d83a783d5fd7472005357cd7215ec5e57b0cced9b073c0c8d86208fa658a59e44e1df4566e9c27f627ea13ed4aa4b3e03bb51a225024fc287b31703d29a1f4766956b2e95122021a9ddd2fb69ab57e8443c66c98a9eb38ca98d3a1667757f125700a3a5cd112e074b237579ad93a2eb7da684da3826e7b96766f23df185457d8aa641519b614c9ecad201401cedacc6349c244aba558cd745f2e7c0ed4412e776089ca86c8cfc66ad5bfed53423e5f6fd9fed918d84f364c9938365d72c67fe9dba4e10dceecded6743d6af8fd0eefc3cf419452e4fbbf066db4d833bc8a511860dbe31592121a18d0c11359c7f1854776b6fec191066f8a23caebf77836aceb3a565705daea8018317471dc688f27e315829ecea6154fc003a4f6 MD = 6f07c911878a86e57375528b8cd2adda91e11217b8c944b20fb1a4fdd6ae52bfeca5d4f929872196a6f17aa1af942034 Len = 36664 Msg = d2948aa5537ae4bbe587afc2d6e7386571c4d62f6a166ffc7cb83dad50c1d220a1115a609e2a21188f42554ebc960c4d8a0088e3e8ccbacde9c80670b29a46ca975611a781503d18932fa2210d4321b27019e6d8e34ce935d59dbbaee4467f63fd8c36e4c59441a2387720a39098807a69367577223d041b8662e4ceac6e85d41bda527e329d349dc842573c0f3d308fbe7fbf266f481166453d0a3ad3ba61063969ecdd90141ef389b7ce5550da39d7b71d4b4e90151a005a56b45921d11ae09f618c69a7a0078bc4ff0d541d16a43c9b38a1584e4b26d00dd66a935d5cb84995e9bb8a3feaf84dc0419ca33c9978a5b4f74aaa71923ebea6e5b4505102442b6229ffa81f99f821c7a604a8750cbdf94883cdaec19469b26caa1bf8c36cc56d4f4ae32b105610ef1f56cccd92177c22a004b2cb06f6af94a84e26f37c4243f7a474ec7bdac9479f11787c795961bc0704a182680763184ca3f85eaa442bc7b1a9cea4004599a519e5359c1394938590bb82c4ef8d81adc3a2d14983e2cf5783a5819222196f3245e3b4b5050954dfa50fd000c760f875dff00171e720d7fe55e2b43e4a1df2f70c531e4eb6814dd32e46b3be5848717889d4af5e3fc4ebc10fa69031de1acbfb547c9af08ec3266813a952870a0d94bfaa950496f197b2aa993a3df248d8a14607a75122f59986a73c80d6e245760851287c27a36761d5c0dbe6e209ee1f1de10b1c6a6c53c9159692136658714c7637edd1400d07eafb0bbdf1a8ff3ab7e7d34a230e56101c7c40fba92b70f6578577dfdc795a3bf9cd9428a5b65b9267a624aa046569945a63aa608c4db23c5fde1be8e4f8146a58f362024835a560f802dd1506962c484b71deaa02f3a6ac2c282aef33e5c2fbcd147d35234c660b33a5057272ca2892b64fe3bf5445d5ac850caddb0f69ed5821d8eea77e2424fbdd34a4a99028e3db65a5c189ca6cc6a53432ab96c1ac1ce81ce9bc42a1e46a98c15ac3a1a8d9e78c1e1a80efab900100ff412c0790d5d71385ecefecd3b5bd4aa6bd68440204bc0baa5629d841d80f23afe23916c60ca741268c908f5dbfa77953059e79e6d2e8c2d102c42ed26d77780cbcd8abaa7b12dac56fa6128729af8d91db6a289b6bf5175ac657d8a777c165dd7814ae8347a2462b3d395d991c5eee28e7d6396af66b740f49ecbe081d7654ecbdf2079a9bdfee209f5258dbbf3a04e0d0e9959b9bd040b6348ac83c871dacff347c9f379d50386b3cf7eb953bcd38813eab227684aee3182e3ade8dde3ed5df84b95ca1757d8dd6be33fe0eb79ff0d2db25c942d68cc5fde003e8414a61375456b127224cee5627ca0b798f5c36959c4c5e7349bcf34e2df1edcea1f20f3a25526de9004a2cf9270b894460511c90a73c5e06d15c6ae66f0a0078f5ffcf461c1ff4888496bee09e26b447c9bfd947bb512e6c23de79f58cd345ce85982ac3ff664eeef6592c7154c6946b12cef324a033d58b876ba8e34df3c3b998e6a71997ce84019ebaff161091329682a5f48e1d8b5b4d442b80187713821f7811ceb0ac009dabc3e2be369c2f95b1626d64edfc01c998a44588fcd5da8bea6b4027f006a3a1d2aff8f138be49c5a5fa4dc9a8033c2656ede148f72ef1e500ba9b3b426c609960a82520863f87cb58926ead29fbe57a6e6829497249ff984bad4b910ca7df8c3cf791d487e690aeb472f897d7aba3cec85d4312d3efadadb18b78b1b780c7824ee46394a37d0d76a0e212101add1f294c14572c84e8a32b1c9e4924acbcc1837eb6c4e942caa52c0329e49f5a570193e2d48e1debfc881a732ce77152267498b4b7db5acc9701d7c79097ccffe2f01472e70f6f72f305839e7e7a20108589c8d82dd16fa9aac87fd35f531f714694b5e49303a98094c16d84dc29ba50a0a71cd261cdb042cba32c0fde3f21194b967d202192547ca865e00f8d1cc67940779a8a9bf8a6fdc43ae7635484595db99e750ed9e3f7d0f798e426db7cccf32da04ce92379d8435c34b7b70b494fa65753a397021f1ae3490382b10c7154252fcb3ad54079ce7d5a3aa5f349b78c5dee5e11a1e56d461d664dc1996922e7790ea06b373b20111187f3b8ff57f697e84666c715cbf601e6161faac43ab80c5691c6e7f85c952869ab08f8c37d2df8b12714cbdcfae2d6a62021431bc75a4c2482e6b6feeb019beb8e206d280285381e591027dcbb584ac54dfa968657312e4ca7a7e133308bf301f7e420143025de99a301e3ff5580e7ab6553abee34653a34c8b26e7e735cb712affb18704d357289cf90052c128334c130d38839a41df845afae68c6fb9b6f857f0f5d25a2df7d56a364974b3889b96d75233751f081f1e72344d4f51171a4c42dc5f81a77498667e826a04310b9ff18feeac01c60baac83eb1cbcf2fd06dc3681c7f036149b1526657d29fee23c8d2b91d129843bf0b17fd0dd27a50781a24345bd4d63c0feb2fae4123963f63aeb0cf7807c70cb4a89459a301ef6770b7b533f4e1888c49ae64b2b8cd85a93daa225f89ec1c756f1bb3b11bca8cd94cbf1ce3823588c6896388204940ecb024439dd5bd3fe73250dcfcbfc2acd12a7ea8b1df9e41559f41a310535d2e49e8ca1389beac93d5b80c54e5c252195adf88fd2a6473857d6b050573d86ed61bb771928c96b258567ae41bf55524a0986cfe34cd2edc727ebe45e3592c18e8e0b0bd390cea792df7ff9aaaa204c4d3086740e8309b13a8c80d76c506dac5c717492f8f81266b6518ba7289724dbd113932e37ffb45d398f7dd2a33234110015df52afe8fd6f39e67301e20fc9c67eb89647864639b76b37ca1d2a6251b6217f359421e9f78cc4a31f4f019977d7fd29780524e20288798c50002a682a6368b95ca075826883ff9278d9acbe96d4f66e1fb1395b75970a96f5c3cbcd29e27cca3ebed43cb81d91ba64e60c058e86108d7592ec37fcaec75ea2ad3418b4fa07bac236669e4f222323ccc049f6c8b5f49061f26600fe9358eb40078ed13572ae91cf4f5230955a5cd699ad8a19aa294a7eca17cf3de30f6445b519008013131b584f53c17af38de5dab1f6f7f79da9b9609a4a4e7712ea9375eb2bb3aeb6a5f6172988da05cf826537fee3b9170affe93db8d30b35f5ec8f82c885cfe286f0e6d44537c658920285f667bbf80157f1831d0cfa2ffff3ddfd74366f7ba5ebbb94998ba7acfba5d5ed1ed3c8db3eee482f097e07e25d748488541c30df7e4dd0a86de322b5776ec344b72c508b5535cb9407f6414bd8e0aad629611124f514f5c95935ee0953579432ca599c30ce96445b225cf293f7a0178ffbef5a7292a8f39f636954cf17c70f615d42f4f13277792b5f9860e1431a935cd2ad53f0de7191d396679c304c26fd767bcf9ff6084234adc892d35e43b7e6e5b78343c760d8990df7170e5379db261c29e8e768d85e3b89643395327fdfd7d1b159741ea043d1f49061f261265052f97175126f2b3356663b61ed847ffb30c8c9172c1e271b0331682e8f81dbec49b55a5e693287294fec5605227ccc71b77406a6b4ef7cc9f56c87642edc2117d2f9ec8b34da77a8edc4bc087d44edab357a70ec54b828b3704cf6ed17997f39b76d30e4bb8e8018f796755046016a0f71850fd253a2b1433b79bcaf92e17ebabeb82d5245772ce136098ac7c5decc07353bec40fbd4a1e0209ce194e7dca403b082ecbb1cbc026b72c60254410199fa47440e1f92767ff1e55d6e835db17c7a5475730986878a1f7275e5de04925c5070497d5561b2d4e053636a633d898b887437cc22ccfd4d6300bd3c4f54ba9a7078f242ccb0ae27143257dd1ecf8b5b95d670fff03648d2a0e2460e8e7aa0ddc427e6646ac79200f54ae0cf9b5be0730a43c912590b90a13fe1b96383be6eacb345ceeb19ed87e7eb62a749c229af5b4d83e90f4795fc43a6c5be4316674990a59951e0c06bb5655e4453527b81219cc85e7afda11ab53f3f56fcb72fbf5b1002ec184a47894301b6b68df3aeaa5ebde29c21e54fe3e31d715c1cc6b60cccb43306ca31958f59445b81fd3343ed8d46020488ce3838ac66a39ec5799397c4049eaf109d94c521b5b66d4a1a2292d6bf926057c046603ba13fe5a0d7aea86a89acaf92972b73c0dc2d411db034e162b1f97636c460a5b656acf955e8ef86e6cac5cdf72642e0614129c71dfe5f2159a49f0ecbe06e4d460e52a28bb43f7b614f52d2e853c2552a6d13c5f30b8c9ce31eecf2c11e59a1124f99a8ea4484cd03a1b9870c25911a43e7510446dfa49826a948e9be8607e943a4e9d21c9fa8c5f34764b10ca49877d5374d4cbf838d5e4dcc1bba6a1f616d0092aae9c6cd91ab5ac9b91b8fd8bfb408e66d6406fe31367e10cd2e6ff14f7472a344b693d729c75fb0228c3ecaef18037b1b16c2587667e1fbc60d7204ba48c05e1ffe28c456602b8306cbc1810eecef7ebe289b9a463ba0176e1f1e61882f134ba38c309c02c0e5cacda1bf050578f377bd633bcb88f8e0ec2e2b180fa37293f339275167142db60eded6e05fbd0438ef828f47f324e7cc006cfb0b16f15967dd4796332e74f0c6d5a332cd961dd8e66e74746a1a015089de91559d7f5c2bb89137a27ff90a513caa837d2eb20c3c247afbd94a49097b420b06027651cb32ad986f13ddcebe974012e67eaabc74771a9d7f888f8823af1d1032ca3f9425b46f7959b1f4b7780cfc9734feeabb3cd2f15e6847e2dd373642767c74a05054fa25bc5b436dbb20f695c0d6c596b74c95d1451fdfeb522e56dac54eca408e3f4cf8eadf93efe29e9e3615329b55b88c08e1db0a1851eeee580d830f92c856cef1108a4c672335da4c051fb148cfc7e4724aa792b9bcb96084023a2695dfaee93394240a88b1bbbc482a65bb93adeb3c1d33321f8cd6bc6c21e271fd9b2ea07858ad4181be407d2dd9ce70b945972d7c4fc5021a5744fefb79d4b1fb6c5d3363a9826819d07881134819c6112634938c5128a1e9e3b187f3d2018188cf136f926e3c213a8803d158de32f12dfe2d28546b8397f6f8c3603e7591690c8df85deeef02f44cac8675e2e04279739529f1bce4fe6aa85d2290c2aaabf1ef6eb5045d73fd6ab705ac739b9970e44db3d1f8ad06c3a466dc771f69b877a29a3af26dc844540ae35b1ad56950e5bc221fcd440d17f7cc9a3b6a1619e91e0373b9569e18a8305c38767ba3364cc8885aa2c4ddc660c56bab43a27cbc83c89de3b38aa133e8b9e91f1d75e3e9d642d15d045fccbe29530801bcc85939cf9cf653ef367e034c1638fe1ab09f6a367b1e920d4518dfbac92b046e83b67815c3982936013b6f1b70d23e33d5dea1b49af763841ec90f5a505d1c217c9a619d650bcf5093e25e9fee3d48318ca97698c8e4373394e838521024b19c5b0ddcaea8d5ab05957aba1eb90383db7c07d1292c6e77e04d7b41eb300b2ba8c717d191b780271daf0c6ae1f8ab56fb4e009ab0ef1c8954f18d126ad897f20d68c1288fb894a95f889f5630d4be2b57aa9cb9753877d6572923931a32526e93e712c9eed4979b94c93b665375c369b936e416c03006c6b19d47ac4263c30701ec139cf63213648419e88291024277e79ddf99d9fe51c229f4004529967226211eca8af1fb8f6cf721af9233a4c4bfa985952b07cce03088d6574618f1e831b92641792556941bb589977e8182d0a8c9970fb294bf3c7996ed5297579cac9292ab8052db6ca9d985f8a92ec3c5ee9a0d7a5417c601ec061bdefc202ec046af74568dfe5b64560e3116ec8a4194a6fd3fd66c43e6ba783edf545acae5853ff227cf7264ed6723227f8c687b4318813a2555601d3b116988a9f5767bc3121ec272bd376bd99d997d380225e7107806b7889d378c0f2f454e4369571c11906b861ec9e2fd662d3f87241f2cb8f1ddbedd2f56f97aa83c97f7735905961826afa8f39a7d01de409da90a8c84d42e6f2f14e429afce4f5fe4eb026d89cf1dfd708fb9d90f5e87fd3c49b3f135250f55e3c56dbd60704cc0b691b84ceab16b3c39a3382da1feaa8da3d1e8f44891dbb8625693bc1447e78894535c9f3023490c8f4c383f3ac88e175aa76f40c402dcbf32311ecbd33d68df0798b80d630cfe95fcf280b6e2a47dc4ea35107bb15f5893ddbcd694a63916ec96c9923f8c56d3fe07fdd93ba17abdbcdae1954e1790985beb6183bf94243bd8c94cb3dcb3e8107039d50b7680329726b215c460ff7ce440e287ecf4a6e41dca288ae38ddeaafd1218e2de0e86b5532afb38675a700d846a4c95dadae36204eb3cebe9fa1784e10d2e8d1aacbce939f23cb244e3732abf00b0f5151953863a638cd88fca655e0688033c86f728b791a3fdea24a40fbbde2b970e655afe390659a0b79ba6d120b2ac1d58eb98d407a268c74ace444ca9291288489245ed61aff501f1d63561b22ea1064a1136c8 MD = ae3d50c6b6dffc7062dcfb7788c60029a467c40b75e37f0320f001c4588e83024fe4be1cace1ebd8b1da1744a920546f Len = 37456 Msg = a882a12a0f506f5fd7046f4e7ff233904923350d8f56c51d5a4646ed312b9a252f83dbc759124c5a2e288f497f2218868033e17220655f0196dab6193c58293ca105d467d96e9d3a18ce6858808e8a113608803fbb90e26d7ab5923f9dc4390e258ef4d23a6b4a45bf7f62452a3c727a93287b3a0ae134a92e5e4325fc77b3e1e4a8a3cf22123bc44bc2e5d72636b90abe1d382cb55f3efddb5d3294ff7a80fe06da49283a6a59fee42059d51c844506e06f21dc6412e8b1a93bc65351d486adb2ac4ea3297b8a3db0202608b32c00b920a49d14be031b0cbf7f662c988daf3510a71a09974db7c7da4ab4389438d16aa746139a6b39bd5746b17ce57daee2e0495215212ee9c9e688266b2c67af9f609cdded3714bcb7db655a6f47a73e07f48536a8b59356a6dfe33db4aed39a54e428ef92b36195f2dd4501a71abf4505baebd9398b719c38fd1216f5848000d73e73066ad6f9cb55a80d2e8c266cccc67aa4c5326d6ec465873d39977717e910b6a4a9dd688566c783e669863257d9317cd782f92132d417c48e2f034f405ee794e4615330ac6f32b5f83bfd0827772e07ad96f86f66d735fd2b7fa0d4a265441f5ab434f717ed7d876a2b596e85aba5644e8b9521b2d2a77b3cb1d5cee6090fa02f2ce8856de8904165c2022d197f7edce1e93afdbdcf5583ea4e0c04b34f305f8a51d7a25769532b1086600d8afaa1b58f364ecd30d527605cddac3fb2418fa494aa6a167d76ae8c9401dbd58124f7377ffc3957b2ed0558bce61d478be615b774bf07a8861a89ae18bbdc4fa50666acdac26264ec1ed7b52ff1c6e4e546a8df531818221b5accd7c53bc9419fa7d75ac71133bb867085bddf8711de686a3166593e034ae3405f50c3090c741610338a6f70132627ebf7b9f42f65fcbd599992adb832e987d32a6139ad0bb0b3476085f9676a6b779815f096722a078c1bc6ac780e0bc6ae1b15514faf30bc1e5648908e7ea153207ec8acebd7c9c87cb9a2fbe1c9f8ab0121096a2f98e262fe44d1f6563e1ea6c7a5f6331ee6a804363a14c911705f5e27ececf2fef08868fb1ae5fd782e4a2c171688cf5527308662a6035c308baaa8c984a832e73d8c97bedf6bef1dd78dacb5d867c5b823c915a70659fe65a240518ff22372100955b7ef9b4b126cbf50f04cf379607161dc78ad61fdf4d83e8921203d47faa1db4b9036576daf8e70f9be8270a8e7a569cf781dbfd789b2e6ede0256dfa11c33cd6e9391ab90daa72f2dfff56dba17fc40cdd9f28cf041b23d455458b26009db35e8ca3ec1776e94ba11b6cadfad724f9f96fdaa5cdac3a7ca649299eb21059c84b3f1ad56f3073857039717eecd2bf9000f5773db9cb3879cb8479ae86861c0305cb46dea9846fa7c603b5d09bd7761288391df97ba73ca2accedcc48aad11edf4f8d10eadba053a0a3fe1abee317106f80175dffb886f80afeffae6a6cc5d0d818d606e631a5fc5a6b69c17cd26d9f4ba1627fa22b8f99a3dae7c1fc22a2beb12549e04b3eca2d001308f1d2000d6643540da4fd67e0178bfd40a74c610a110111330da8677f9e4837562c4cf058fdfd14636e80021afa39b294bef9ac6e703e493c1f8c2048a88944cbc15c37e2decf6f2e5cc89ea2ca23b75e8972694264cf59cf76451db7d449c7e4516e2b2d7140c0a8c035721a0fd0580887453c28674aaf67a281944fba003d4a6d115ebb6de7b57d696540e333d6312d48f07972e026d68f34c04872c253113874e456ff2d2aca1688c66f80be9bcf274ef2b5c477ea5bb0ad6f9eb375a8f068f945888b27805b0eded7729538977e90f9ca85af871b9b766d0dfb944c7837467ab387b1e59ef4b0bc16ee731a6febf4d9f64d66a621324b041a03a7df57624b79bcb9360fcd33c6a11337bcdc7b83cd8ff491bc4d91aca8f3223b3086bd1df266cfb179de91749b3e4ae2d50740d2755c43e702f5e3671acaa506f0db1fa6d5c27ae4e00a9253b8e43c744e235654a6ff72a1cd37acfe0aeb10fb5b5505b9602d4ce81aec363d9a235660aaa93286bcc9ff768d7b44de03e4f48cc27cf5a22c07942f9d2bf3bed98c273c5d115be5314c48c9c64951939048de3fd8cb661d83d20f2fb9226143d17f2d6be7e4490caf06ed100a1a499b3a772c8900c8ed78122d0c6d2167f5593c8ce773ddaa6049808a6aedbb7693615d007e0cdcede24e51692a6c5875268b5535d3e890dc5838403730b77cd6c5829265311fbfb2eafccc26d7a1b0d28b46b5fa814ec3e29765789ded01a0c3668b5525e4464ba07e2fecd692a1dcf87a17f94b5dfac965843d944eee50d9c4ecc82fb30624e34ef2442e08e9e13f6fa97b79c8e89123cdc54d2d9ab3298a43cee58cad251029170de62a3e5bf45a906fedd1c3bf866583d0f0af31da0024c8935ff674bfbc8f8127624bd7573fa11353eb7bfc216f01401de49384d1595bebc083e79a346e7915c5551d746a37b560ebf0e2a2dc9f796b2285650427a971f5dd1dea8e21ca985d6e3b1986138119f19eaa90884fbc506d754fae404b8519af4f7a89e116454fc08880ba9cd180214df2552ffcd93a08df9ccfd9c9cb50b540ae261003806311d7bad28b1922d96dfe7d9cfb71279d1539ff7271f115b0d7826f9d4795de98811b6b8d159b95d1725b96fe9da5a95a07f513d3f166b919e2cd1a6c8af8af7a1004113cc494992cb11de4d680daecf543998060f28b33e07989251044ac617c311a524e1284ab3fcc8dddd14fa150f37abfaba5dfef04c91e6f16051f31a31386c6955da9fc5a8f0753e86b549973d8ffa01c1f23f2aa2813b763c77528c2e463a150d7e55c059ef3e8aaf12a23c41a55135849694692822c2aa4d3e0e27f436a332b394f346ae434b48c2f4ab0d03c1d61d6910a5b6c6bba014fb6ecff06c50ce47b1e5205c8f33c50026230f116b2bb141d92a19186493003dafce3ff17edbe4dc6e39850ce406d43b43677450622a0b293daa9998eaf308abcf27043113210c795257c95d95059f7f818883d3ce070c5efb59cc3d4023e0e8c541c6b811686fa7c50995588a784f57484de3a1990bdb677dff5b0f4f6bb17cf7e42e8f62f934ed2f159103aba70b48007f3cc2a97ba1cc2964ed16fd13a3edcfd8e3bdec1c84d4f8446468e1d9fcdc11e6383fe8a28516694f2b5b3362ddc5b3e48e4a991887e3885eb78f12574a9ae34a7d1f3cc7b0cca48abce5daa1888b0dd2d73f4f3764a2482b317e276a1c0ade73b36a8f31497641db4abcd819cbc8446865a3f8bf44999e737b3f09589ab56b298329c829799caa0b7ae9170fcf03c06fe17e7bf94e51f3fd3cda9e69ee22f0339563cff768c746e2f6737dcebbc4e9aef2d8c02dab51b0921d55d0e73dd9d75a90208ce33d7e7d276662f49db89427ef41baafa382213bfac6ba8618b26386661c68e735214ab7a471bf63c3eef9e2f8762b30a2fc4afefdde11a8467247671fe244c8343bb25c1fc091b189847d829238342b7341535f620e601db7a80de04c8abb1729b43ed461fbe0c837a3a86f852fdc885f78c4c8f3fdb1cfb37a3e5bb7bcd6bc5cb3768832c9b48f1572011199042b2facca26a076530ba58410613f261f9c9f1561e3de59d216ee6a1a10d1965f2908a25eff4fb4ba77877193fef4625b15a89ce50c3fa0bf0dcd80c25d1543e7dffc8b5dda3d75d8fb5dc12b9ee2331949c038687914cd38a2149d937146694554f1adee3cd28155a20fbdffc871600141cd3312b3c3a9e4dcab0ab5d3cdd02190d0523aaf769fda7186ad380409b3ba04b8d30a41b6fc6cc37b0f4f0b1040219c82c068ba91990f72a8d9fdda12f2ed9a6a6179ab538e775f6af389a27981f07fee3fa1e68b359bac5e8877d3f4e6410cca24867a0426aeb961008c1f6f5a3441fb190db9cc3c27279103ce7617575f61bf665a35308eb9d8497c800a599596eb9394d3bdbc755aec2793294be30deea1336d1c643e8c3fc408b08deca1f8bd849dfa1c7ac3aadd020a7eb0dbc1cf97d40d83f59098e9e88688e4d94bae4c521400910f774aa15771200c8dad1766020335ee0d40a56c5e25af608fb2e858fca4a6a2d53cb72371425387e54a4e9bd63692f68bfccddf46a9676bd5a6b7e6643a7674955174f8d37c8935e338cf34bb730ee5984c78084b1b974ed3b183bc31e15851783fe7e82427ac60ac0101f95bc490015bb90eb113822752b35ab4a30c9e347fa68d7abb0c4ca34e6b2c4bb45b300194fdcaf7a046e6febc9a29b2639d7bf24746c3943835f156474642172b66bf47e4a5089c9e8d4f06d7b2a7e6c48b7f7bf180699c294421ad9565cacc27227a4b3a7cf9637290c626ea235bb68e7fb2b5c57e08fc54e4e1907ff14cd1703768f5ddaa27b5e6f652463c15ce8b88201d890b65271b81bb3be74c125190ce4e922e17561afbc067fc4e16af86ce7c17c7df0a604f617a71369a45ef6070090ffedc2ea8589bc98dcb27c0190de5300bb9a00b94073606afda91b2b101d9e821b6e86bc96bffc90dc7b7827ceb3a6ca5f9b2562cd702ec1d30b5db7fbc33352dc23b16e1db8d8892f8e7a400a633fa8d91ff334e472df5623fec07821ae7b6da28bc77172eafcdc267a06dccc83aa16a886eea23e01fe926101f7fe2a25b34d1f252d594eecc61451bc82709d9b628e4e7e6c2d229419013a9378cc6ddf876b928e77a80a24b0dc41c4818de5f0f58a4b5510483abf9b1cf141a74565126463bd062ac02d39697e773098874e4acf952fa96f960ecb0160259b27fbc884e6afff4aab4420814c75527f2c1f2eff7d396bf9de68e76cf85557ee5f71d0ad6abac9ba9da69c92d67b740ea0a810957ad160b4e1638d1bcc76f8d9d22a45d28d1eace46659f9f493db4c7dbaa49b834507de691d08483e1a4fa8dc14a760baaa46394699f0b10d013f5c3acea7187f78571584e5b9a16a5e39b8739b5be9cc6ecbcf5faced6a62aaf213c451222fb06129a6a6d00a3126f4efc82edaba296e370a0f9e23b27e9c0d9e13a8e6a839ecabfa223d607c7fda9abc586c5764a8368f9b5a9072e2760f85bddc66f39bdf7ab562e8c71b82d61bac39e9ca95ddfeabf4fa30c52eefe933bfcbce7d0c9f78e129de9ab275afec50a5e2dca81a789544f3a132aabc5d30af28327a699605aec655e788ade3761b201441d1a359d6f488082ad0cfbf9ce4e83b9c509b2470e980d5f86317f957faf073c1494ad87ba4ebaee18b928d319e658663f1b03c63a1a7369b9a6f3bd8044840fba3fd1ad91ee6547fd391c9bd95ad7523ce1742406fbfe43b9f320f78bf9e085b9238a561db1e9550395bd9939336a446565eeab9bc215b72f20f08bc8578366b648becb861eafe0d3d4f5155ff8780562ae57a121f7228bc3334ac060e5d57a5cb75655f3be1db014feab567331695edac4994fbf238c881c3615df7b2b3f8950773b3a8c179c8c6f1cc7a59e66a41475b09afd9ecdbb76e3303b3040b2275a3d9053c27bb3953e8c35304a072093f2dc7944f3e67d171dbf2aa3fbd801f6b6c90b8837e51a6e8c1251d08dd8e69dbfb7277d78bebb0844592b35886ba115659cefc1dff5d2913faa788eb536412a42adc32fd54e10f6b5583bd91e2018ea2f5f44e604d065641ffbb3520c4bb8a24467534153bf034936656277071ff0dfdcba12deeca15b51f3ae0904d83fd36e8d8de29b38391d699028a9f78991b05b33546293df8e3abe856a838d623a1af4e5c67525cce3e4be8b481741ed9ee1c6fdd63bec27bf8c159bd828d3f263169d14ba16c759e6e2b1ee6eb53e7b6d0a8702e7a6d10b5dd8bdfe9f00bfd0e24ed1e112cc69256a9fa883418ad47a27b3080a30aa2ad290a71e7668133943e04af91676a0f37996a20c106a9eec34f365b0dd594fdfc57f80a0cadb6a2a9485937b798d984d9d9273465e90f96feffaa6e742099dd92c53ebabc49f0c780cf8b0c1d300bf5fd9879abc355ca443f463011503e89dfe4f3370a72a5d010df1622931eb761a12759d9fd85c76a6528b57fba2e69f5637754898fcc5bc52cf8bea87358b98b34cb8fb0b019d850782fbfe1ef7b4d6d06de7baea125d6506a824b95134790e91f6ecca669ebe31cfbd8e7ff17a34341486eeb0ef52baff257f02f60f967e7fbcf957313619882407ea8a03fc943062296cd0522d22a333b83b6eca4ac262943d3b415905d9c303b7f138b1c8ad6e081705d5c92eebe1a9c5c6b05d8822edf41ba6f4695a463779e5bae0b2dc2eb8cde73b473d7a163d08570710d6541de7475e21b78abec8ab2c9b2cca2dc07dd459a0f46cd597097cf973e6d65d331b17370f93d1e4b8c7e9c4e0313d4bfd048a554a1a8eba0f2e6923234b491caf84466a34e68b9ed0abb7eabdb083341a2aa469ee94f3146aeccb2f6e1eb2384fc13c88d8012de18edcde463892e20f9f56e83c934ae30a2eaa69c45d4759dc9b38c13a00ccffd47bc3267f5cbda30415f220774124a8c4e5d20c8bf6af862e1c529d28b62f48a01ec6563d2e1a0d3d036512c1000a896b16cb7c2b433c8156597797f90112526cff4e382ab8916adff11787c3d9e4cd274a MD = b59b1626d9b8d6ff9a35bb5cd69d29702dca9471a3140e7c2106b295eea3193a850ca00d15469f6d355bb60f48a284e3 Len = 38248 Msg = ef0c5e9abf77c9945949ae11a756e68dfe2b1438a38d40048e22c2fc6d6d62d7ec00bdcd34eceba9b17d5e2019240d61aab5d2edb3d211a955a79b318bd9d27068b80d6ea0bc3e684a2fd226e427d88998b76664bd66388ca1e09b3386ec8971ea9e16240cce0bfaabc9d0cc11458f2e509b9644cc30fdd7f93489a76690d103fb199f987f0a99875cb121baa76879775bc72b35e518a8afe60b2f3834acf04e2291727101583236e6518d97ae77df8d40a5ede11206803eefce538cf7272f79e76e55589aa01c2fd00fdb0b2f5a0997879ba3ed5ae2ceac9ce3be4bb7ebd6add21911f553caa09ba255d5c030f93fbeb9131704c694da2175b3381e7cdf2d116cf86eef33be06a2e58a415bbc3cc92a5d740fcc5c05ecc403a689ad4feb7cce3c7433ef4265966b2015e887d80bee02fb2654ed261b4cbdcd25789f37f70a0bcaf62a9c89a5981fdb6092ea8e4ef86f1b91ae102cbf42355b96ce9c3deb20f19fe4199f0f6753e59fd2062ce5ed2d98461de4dd75da15543662534e68af06a842a7c99fdd9410e6f2d30ef6e6d0d6a60332c0fb09520e41e5f2cf5ac02c04573ba80245f91217495fcb70f097df3ac0db380813f0117525f0ad0a6b4d486226134e8b396dcbb0376b22f5c10203a30f559785cc32fd9227e0facb2718ec673e51002e2241a523d8a04165112f2257baf9b7ffcfd800ac703c43dc3628015cc77d28b1a87b8ab753858e888a24259fea4f003ec3ea010c278cef0341856d89e8202ddd742561b5d1a27226d2ebf5c3c7e0db09516ee7fb75596609f0381a36cac1777a2e46126579805606918c780b7833ae29216e9cbf82290fb6ea48eeab95e86e507ee7840f74a6a0f1700d98bf26d0e267daf107a0758754d1d8bdd32f701d7a260a0fa1fbe99cbaaf16783c26f840e089240010e876f89c2461a0b00c83e903c67dc6507101eb0a082dd44c89170a0f57a9a29fddaf0650752ef86c88f7d371f67d1479b8e41afac45a2aaf30aab6d69b0edf9cc94538d68de6cdf1ecf4642c7fb2020419b9b1f0aa47814f63dacd9f1bfebfeff26316973432272680a1229c29c697dadca83956839ce1136acfd6d1a01f4b81a12f29fb31ba0ff38b279729bb5edce149db3993170053e38cb059d3f2198a381dd1f86b4e258c4057ae4b3cff25d702a777390f2e1cdda713a5de0fd99585fdb0720c4d511ca7f52a5dc53bbbc0922640a7c13290988a4745d8eeec1d3b42b9a03aeb0a034667fb4d5c8d90b8da15335a915a64041b5fac6b6e10d285b2cb5236501f0b2c4cd43808d42ba1be1966133e5d8b0d544d66bccc92cd29dba328b2badd30b794d5f695a2ed27d895258fac3434dd9546d8a660b26aac5ae5b55fbf7408a475028ad6fa65ce0a9c04a798e8833ed764a3612781631e35cb6c917a63abfa05af40127b5097a05c54d44787ad75a201e23293f20528d7f0e537de8084a9dadacc1417ed7d818aa36acdac66e55089e378bd130ed649bd661010457a0cb4d1ac34473e356b6bb56945b77f3c775d1a068c0a8c83da0ef71eb5bd6e6fe21507024ea1315a009c48354d5a67124be47ef188e3a45afbbfaea03a070067ee14a36484e99864265e6c90ea7e0def492ddc2cd20e039a1fa3097509b6a46b18f8ce5a3de91a5cc4f7490184ea18db597f5d40d453524b3003312488920181480baf6de2676049c2b00610836731df632429b4f47c397515274d352162c0b466936f24d92c123307d1cc454fbd00014f6267109c4f5f21b65786313bf088095ad935088b00d7227da2c22950b42c4b05823fdd33966d57fbdb049f3d02028a0c252aa060aa571f0b6b1143ef135ec56dcbdaa121170a1dccfaee079161d53e65bf7574c1f43b319973e01b92a43d76708760e7cd9bdf7d11fe6cf19ed5aa2d4bee400c14a42b611003583aa32d7266f4fcf934a1e9947eb22da8e6cc262960a7fbb0f1c283ceb65663a1278877a49de274cb1204cbd02897d0c76d831bf9de622eefaa3459cd3854dbe26aab4a7c24233501085e073b84a92ef40f2b7dc3af62cf25bfd1eecfeff2b3438c726ea2029d87c19f18667e99ce9155532c142edc912679b800097de41932ed1447aabd3f3ab4335d98b04170ef3f12c1efa8e36cd67b141e2b747f1eafa1088a91c775e4e10381cd47ad2b0ff58154e1da01896718151e79b9f57ca59d48bb77b78e74f77abbd0748d24e580c69f433c56e6c9d6413dbe4f12551d82cc6f2f6223c45f83ec254bdcd3df17cb4ce10659cc214bc0383b1c2a9e5b09bc235e8cd33c34e18d2189178c7fa468f66d8fc6c0a278b62de5576191c4d1e85b895cf9526aa5a01f002f5f0cfb3c800b13f0aafa42b4b32530d9b50def7d6468e8b39e6815de4440715e49e5ad6f0811254ddb8e129de9b101083f25842923e927a9a49ca5a876f95c5ffd9eff04a8118bee80047cfa01d8402d2861ec9bcde92e87337782cbde51a97ba4bf58c507122d1bc2e5e695a2a3d59097498f9c0b6de5957280150f235041f766d01f78ce1cf31cc9b8ba347518a879b566d5f3857f341a8a3fc43cedfe0a1e6a5abee6a437c538bc055fa02142a230aa3f276ae2260360a33cf819e664ed37d9e59cd7326c8bb9c3553da14f26a9fc9d5cebc7ca6b3aade3001a6fb489d289daf7211320c22de5082ebcfea7cea627b6468bd3e754c14a75129006ff75a25d961ab56115429305b01b4481d04182f71f846d56deec807f7ffac4a6703143fb35d5c08ab9f3a560e6a13df0738723b5fd9efb185a385f932a411c17aec49fabdeb0aa57b5dd4c40d04a0f1437a973a87b1d9be0014247d09d6e022062369db5b934db8db1086eeb969d22b5c5ae591abe88b7777b111e7c0109dd8b34902460efe8bcf7547df4aa6122df9bc49ebc51f167b6a671adcee07d9a151ecbd91ef6a855b35c4743c7c55962ac8ddd8186963a4300338b1f3d443aaa12a2d01972bd0b0129833262cd84a5e4f254b8609e31c1a2fde6706e55ef5fc03bdeea5808fe41768735bbe3f02f6e301ab8fc42ec6aaf0f1589c9a2fc2b1565fa9cc29fc800713c333a8dcd170ddbcf8a81523058892c0fb0e23dc41c3e8420b6a200f59a0dc4d9975a4e282a671548ac776131cad55f2c36bb75da9c71d379d8b94b63666b62d7195da7fc10854323e762d24d2a9771ed0fda18ef640c2bf8c6a94bf0146372be230a3f52b3af8ee9a2094c8c60188adaa307cf085c57b326e93aa9a48c3d1d141c2abf31fa2d1e21473578f7549dd07c5a0c422f6c9a948aa9340d87b6418a636c85cea2cd461a533daefd95ef716e5a9db0186b7c1cf5ad6f5e1ea27ab7e2327ae315ac1444aa08ec3c856f17db8afdd2bafac57426ff15a18185fcc1e64c0ab00c3b57b76df8c6bca7b58bb5224deb63f38f433c00d94ca965ea9d7117f17275c7e9ab9f0a291815b637f3b28fdeaeb62380f0bcf2addaedd2f38e7492f8f231dec7b1b26268835f33b3aff46a65ce351274d1dd44a045d7904bd6b09f8a124d177c70d9bfdb9102e4d0c565fb0cd1468714f0853ddc17cd66987d0f86cf5b2f3bb1f0fd67aac96691373fec89f941534b08549d2689d7391e838c788eee5440120d3a04a3feb3f3049024705e54a5c327f7050e47ce0e827eb30ad2001086e8633955d8bbffd81204827ddbc04686fee0890cbee8d443104fd1ff07245c7790f8dc495ff7d4bf2958b55114f8f76b6c4167709751c3fe4b588474fe42fbb19e979f1f839fa6f1a2c9d2a8034d8edc7511393980cac2c89b63756f9fa214bc7c092ade2afa9cf4e31f818b900933618117a66f609af92768364bfbd28cd01e9015248e3e51df5256226900a3721083f81c571b210a91a51a9baf1d7f47576144853638a6ec96926199331224d24ac942e8f445aa62b2ca195749df8e1cd00cff2007e34a13ea3d6e4e86c6fb6f0cbcc74324f3e3ea831dcd35c048e75363a828ad4097120e03dae4070b2610927ce2eff58f2fb4e92d269ffcbd6073343abc29f5885ce62408f12b8d6a394b82c2c623c5de0005a9d76df573e73018067ad069c0883bae9f210baba84a07958907edc97db96fbe70aa7b3864e7bfbf134e6d50d5e73b52c578afcb1f5399d4ed73e14be3c782c787ced7d195641651a1dc1a46fe4e65badf3265f6bc2ef6f2f72d290fc0b14308366a0926ce073bb4f94c5fb30165bfcf347ab591458326d5ef5e4d7fdb1eba6ac4a79aa1d97838d263c7c4ffa7d354770e76280583f932671d2dd501feb7eed37bac11a97d5e15912675d292b841299bb34e45ba3e39218ec8c34affef24e72ca1a2f6a58161d8db8c7d10d5fc5648246c2b94183eebfb343a4734e0770cad5e7fb0d2ffae2a8b97db07062e3bbbb8f881359e884ab6c940b9e2190c5e1849505dff2b1ecc6135ad5c3d3d063c1781013a93ea702c42929a8ebc83eb6cefc2e983b68c6aa3aedf0457453cc6c813ac25df6e0139aa385e2a01fcf9e56939201338fe7a4bfab7908614478bd4a7573f4eb7ed694c8d4035d859cb04621ca06bb5c5ff7f299a27501ada6cb39aa18a45630b39ac0f9c01208ce0502bca4ecaacb672e0226c4ca427a8f3db3b7e7d54c34c237951eca124262edcb4f685c75feb0087caec7cd6d61e19a5bdabea055fc3f147d6e14a625050a6961eedfb4f082e7a4ce463c200673c53393a8c45ff504c3abf78e391a92ea5dc56b79994ae6d7f0c095711a494fc8a3ff77965f734d2670fd286df283c662db864a681b9ab35e59e054a7e8b58400ec526a3be686c8b1b58ca285e79e39ff02307142dd01008691889e630e016d8d2ce0fdf1f006f2370fded88e7eb6881f70388292643a3901162dd52b109946fde40fb56112704436ee684cb02e692b649422f0cf3782d72e76549b789709bab380530301b45f5931efbd61c37d228e3eec644e61cd97559f307153d3e7bf234ea03f794c6c208ba87252da10f18f3b3ef790fde2acc45eb3c31880b5a9463b3fc2497aa99060661b14acf82111ebbcb5341d81da4bb63d0cacceb4a6522b4d0744e5a9b1c79b62fa55305e8c64d47d62208e6cb120d98b1a5be8621e58dae325c6b868fd783e2cd6a2917fbb40d617a64b5820ffc2aac36d6f1a1b9643c1982bb6264ad538d50e208b24de265c7cf5f2230f411eb7a6706644b843a6999bd679a1b3c1e17fdc91788d8efc661e15a2e646184fa676591ca57b677cb7d0b618a007e560aab3d1514f18244ce2ec5ca8f30307af2f653f129b719c19427facf92f573f99898b3fc804b98952356d9e72990851d2022ac50cc8d5babbeefcecd2882e26ef065c946039f012aec618779a58b48b6ad72d8765ae0667d715df024f4adb3fe3b9ae6ba46f4a74b52d53647aa29618dc06e3f2b7cb9217fd4fac69c9d80ceeea1c07122f15271407d3c4d1ae173b8ea829f4937da1f74f8104db9fccc031b89495ed444acc14750941d36baf27035151b8c5f611b1a47324cde320e283d83165cfc76e81d4a11c5bf0158ef8429c155b2bee772e8b28273b13697985a36ecdc0122bfd8eff4b7e5286f1b813fa442f46fbb4b33e8f00e0467dc516309f64024615917dbc8c822f9f4efe737cdeba2387b0df169c4dbd12d9558c937de866536a328e6b851cc38484e0924dad306c76afe3b43df237cb435643366db81ed455af1189438310ae21c5c463a32fcfb9bd11fcea75caed99f66fbf48f199933c6d870b08923108a09bb462d9207edd404b7074d87a70dfc7b068323aeb7ce61d2f74a782e419853936e354792215199ec62de404a89e7ed2e5e23492a7eca7d5001a7f8e9596f6c6a7d511aa348ce503a1bcb3058cae4b2a2b604ed6b363292273caeb923353de07430c1302e430c03d62af6a41932ad55bd564d97d9a7b1a541f18842459babb49bcfae1199dbb4b9a7d78824f588eade698527cfdc98edc085675c1bb55460f2c5a13f434dd86e7b976aa938549642538d8cba1edcd38eeadbe853cddd2805a2dcef9d50b302e1508d2a80699e225ebe11b32d0b411e3d2c2bba95df24de42cac701efc03220b6407261363e3bf5e626dc42a81f7342a28d5d2649d9f140be746e1f5e1931fc95532c55f24093d78194d88155e0da0764155a749844ae1422a7b99112e51a5c2492a44eddf50e90d70fecb85ad8de342bcc08eca9a6c223156c909e32ab54090e04c2961fe715e7919f002edf8fe893a1bb50d6a58a953540cadb90e6f447cbf9b16f74df9e0ea5574cfd2c0d8c5eea6ce91a79b3758f124bc982ad58475b698ea2912f45a16392d01fc9fa0b57aa02345e4f1efcf11881dd716d3ead2cf8ad74de11107b787a76a51f4de0027832a3a223d50da785984b9ecb858a102b865d536dd85fa6abbd197e5571261a7760945d3f968eddba773838deb0dba7cd6d42d558cd64f1c2924301c71e137add9b9f0eba79e9c6161d1050b2d7779a991524a0a6d766824663bbd97f3af04b324a8a5d9d65658923f29b9150e3a71218e7cb5c5fe0af81bf974aac85ae05b4fcd71ef1ef444b4f695fa1a0bfbab337d049feb28ccf8517b396b823df639adec5a92373b8fde33f6fcae9280746e3304ba48749348c316cacc8cde59740f7f11428618a00787582bd9c3ccf316d7f2611612ccb5ffefaa73195509bb52c641472bca0dfd09d493fdb3e623d4419ce40a8e6b6dd150f2af0cb650bec3f11286f66cda71a2f54a79f5216231b48 MD = 757a852bcd6479d42065467ece8db9489f081568b54fa7d505ace1365ce78bab67351c10aa65fe0b8ce42291ec9d2132 Len = 39040 Msg = 0d15d24f2d46d3d4473b68f9695da593e74120f1a1d753b484e541e154b45d35a80aa7b93657189650334029af082e5a700c902a5c731b8c6ce22d768c26b137a026440bc51695edd9ee12ac3d1bc141d9746b60616f004dd79537f15233752dfd53f06e62ea1482e95326aa9bfc27f02c60fbba3935caa0cee6a77b2b436fbec878f40a963b5bfc884ac34a5215280e71b786616b2b412c58bdc43ba1be6893087c9806e8723404bebb32b4e9cd8b43ae63557d7fbb2c9a7d02d75a3b0d2954c549248ae1f56542948ebc11e88b1a39ed4bb035fe4c5591459d28ff829677a807c6e0c0072db65d11aba789d8b99b953557deb16f4582bab976ff53fcc21d37d7db14cee582f1fe3efb3b4340bed7028f6f291a5a107cbde076a47e33f9e1aa3c7007dc005ddccc2164c268a8029626017bd79847140b41c3835ea7afa48da93f6d0213e2244170c5cf821f98ed9fa996633152bfb9f6ee688677f6f629e7dbe7ba4d9a1241e6912f25c49199e7bc34530f7f714967076dd968359492f2b8e93c40309a181a93d8694cd0e53258b36f4268091c6e8604661e0fe1a90b65c77a46e5f33b7d1912ec7a2eee44eca84d016a54167cb57eb6803d65c25ce7ecde370e92dda4c8a42a776ab266d64e3f5293d3bcf0b9a6b8e564405122d6b0eec3c89b3037fe8125a21e41bf7fc2e0858acc8689ddfac99a59ba2eba473fedd33fd4f5a549703003438b083f83312ae3bd558aa12667a78dd929108a7abe27021a0325db5b235ea6d566c719b84ab5bfb2d5e7ee1329c7fa2f59eda8037be5e51cff32b8b53f9276205684356736088232f5a657eb68b14721f3cdfc2a9fafe30d6d24269feb55dbeb04497bd71cab95055dcec3f84beede789fb96e37520d64b4f8040c604f2e3d00181dd35225275ef3b4671c80fb0525fb04b7e671bb88d0da46d9514194a504253909251e790347c4a27a49cca07e8674cbd24c2203a79047ffabdf8ae24298230f1359843fc7b73fd10d322461e267a99b0f889051f30ac3cc829d83608e61c1434657cca0fc162de62bbfcf66b832641d788203cef3a716556773733710c8c97da7073ec329cb568cd9d817d8884e6bf91423c5a22fcf07416149a48e50330164405122d1d6408269216542dfdb2386d6eb511df42feb603879075c8ed70b33a1181ebff18bdc79250a4e99a237197f5c06f552ec7c61e7e4b696e45f2cb925dc37545e4cd10702699c7b644a27981d346cf8adb49d9b65ea20dc8428d8a3a0bca6dd47092f29e7dde0d4ebfe30082706254076711affa1f5bfc2831261336be96c9fc2512eaaee28dd4275e7dcd166793ab7f54e7cf765ab9c302b4451d0500c9184174c54f3e0f29cab4c2cb25ba236b244717149ea77b4be0fc2e62fe115cd1e738d212c6a84e523f9b6f73a0fa2e595ce34020c40a0b92d45912284d083d31a536df93b78a4a77c12fc6dfd53302dec3f842a4a60a862f2bce01ed70462c78d0efffb0b8506e0afe066b8829012b6be7eaa108db45756145af702b0e57a507f8b8b5023fa7339c2493b00512f11291373eede5ca3753e9b091df797db9217f9b2591f0b3db359bf37c56cf396f52ef30697b94095c9c190b09b25154e74c3026bb1914cb88eeaad914a25ef2f866c671fefcbc0f21c88fa37b9b3b1a6e6fda39edace6dd2cc91953f1353cd618c8c76a63c3c6423363ae185bfc9f44bb16de3331dfdf6f234f87e28681c1693ce352983c734b48edf804d84f59165a69dbaca12c2466f8290c7703690ab512f1510879ed8da399cdf02471ba3308c1d718d602411d261e9a6a67450d526069c29c598dfb6567ab5fd67d63210d1f119f78dae4f51c9548f3e3b905e7db6be42d2fb642fabd1ff42025803b2859a1d03f563bb7ccc53cedc2231ce49d182ff89d85af474fd7351a9b77cd5814ab3974134b68f94c8965938192e36f719b354d9028c4f98f563f754e17c5488a745e73d7c2f337d8ebd7c0beadacf519d70429a19367d81dbca79a94bff88afe478965d9476ae2166eec0bd5edfa13fa4e25334e6038719f7cf6012bcae7adf48732b0b463208669751abb63de2b4aa78300e0f2e987446909b33f6fb3131fe1c5f2eae580b4a366b10c75e4f8e11785f83fb93bca04cf2f0557abdd12fb5f5a86327ad93ab7b7828509c1e5b88bf93a203a32957c117045d26bece06500fad34a89f72bfb7a314173cb05c2b7bc6e189d78d37c6a3de6420368593623d460d08561e64a4dacaf180f98e81850d2f4c5b284127d2efa9fa81ac5a73ad9e62fc6c942aeb09baf9f9abb2bbf632e601bb621d485f434d7eaec7b0c2d6ae1a6c64a78a4d6fb8ff3813df8dc022faaf4415e4df2949e16467683c6c47242e5a6b2c02610e5877528d2766b2266ca41000442a956c4b73dd6b10260570c6f506673cc541f50f0f5b021e864a753efab03e2f7c689acfc35f928ecea6c522cbc5687c38518bfa48c19ede887d33ffc23806be21803a3c9793e5ca7c75cfa1783f77d4a2ba5782e92c6950b472ea16c54f5ed96304d4fab8216bac789a15abc31d9b2c4da3e20fbc466c5c515221edcb9e5068881df171eeb02d1d093e20a97507dd6c7f35b20a87b4aeeba94461eb9ccde353d9f2180900e831037889760156a4437c819851d9132137e302713178ff831f829eacd12ab87381480ea2a11d2e9dd8449bf347e62833102ea50119fcbd680dde1f72a43cdcf625d210b22963c599a1ac146e1a988d9240b2da1ba1df9e25b44da36d1aa7351c238bc9e0943de341a89d363354560ce7cf59e8e7528a6a621db874c4bad38b8a855980556c124f3df4fd47677c8a6bdac609198eb363e9c64e08d8a00c28a6eb53267c38384ad2348db690351b9b73122cacb3384dd3e3fa51231829990f4de593d906b2814d34cf7cae59c3b8f1ec380929ff0ca6431fa62ef37c86e8ee4a204f5a66ebce823db5c8cfea39dbf49ef36668453348196671eb5f4be0822e63458e91e40aa753b48e79ff8ac00d0c51ec4a51cdd5bbbf8003924ecf5eed3861fc5966c8389427630498288280d4a1cccbbdccde18859b35052aaa4e29b3730becb7c1599c1e6710bd2b311ba0bb1bd837c7c1c12730174d1fbc5a11685b462bbeb08ae05fcc7984613d029a4847e23dd87118bf2844998ff84f4660446e1b871a4ca9a5a827c68799d3834aa2025ec357c2b91e44478bc439eb5683e57359e9a69406f0a0b6b6e10df79c72d373f7315cc38c26a2c354b4899872c172f267170d8f89096e01b25964b03559062216518e7a7a216b3f5c27915f82631474afd9f5451b373c9020b846073648619821e996f16955c6440be5f9476eb1f28098f907bfa2c42fec69c65d0287870c5c82c21b30420bdc59c9b568591ef3359e8a3dea0407f6719cf64b4eac105e30f69fa4c63dee8bd406fe61869c7a710456ed6f461c33162a282e0fc40aba15f5efe2573f22541dd7d312affc186b7388312a55c5100d6b811978d965266bf382ceb2a22de75b090d496d6872d5d740e8b6a7b80de77c3f9ff53e73d9070c41001b764e3992ed969def77548fdca8214d6ecd5fc6a96ad8ac47e7a3c9b58648965f98230a2df10eb04d993afc34c45edfdf0414995fbe7fcf94db32dd39bf4d6d207fe949bf4eb76dec39e361e5153fc593b59d2d10607c306681e8bc9aa19bace993689d51eedafd53c11864f8810b281246c32cc43717f844438c0fe013797c3f3c68afeab8be870a979fb074f20c2fe2214e3b832d984fb788e87d13fc2e05ace2b0269294ad349a2540eb614f88038dac06045629465c46b9c2af3c46036eb7ed09ab516aed2c8ad1c5bec780c8cb9b51b32f44146b48793ce34c63d840e0e9c53be63022c7966205f4d0af6c14b092771c6456d44d3ad87a13fd8e9a2d82c8d20e7e36a5839aab2897ca20fdb4dafc850a4a9352345becdb196ac774117dde7d4a1c6cd96962eca27453231aef7060e5458903766ad33cc8bf3a154e36f8b32cb667d8a7c113adda5414bfab0e9b47fe95caae2936c950a7cb168110e21ccd481b0884f7d2d8773afeb4fc9959823838c2b59d51df65b1e106a511a25e11b63a41a678b2e5d7d0293cdce2ca184ebbfb93f1d7d7aed1e6df3890cfecf2fef669f0eabbbe4238430fd4347a27932658afd12764a4eb327708297ec3d7e50b133cf07b5405312455558f63cb98123398bc44fe4d9fdeb3edc3a018f4498162971d08034e6efac390613512dd06dc9c028bb41f99afce79cf7a67066a2b0c280a730227aee0e43c7b9c8ee8b9573a8a1f82e93150be05afa59444ef2d66cf88f2a5a4917e4538b89e6e618e66757425750aaadd7bb3c97bf879007b46e012a8d91db7e9c6843f5e824078abec46d2948e8cc1cb207563054e906353bc831db0464202d68c853e57ae7899e854b49b00f26ef4a24aee1b763243341f973637c9c27c4f01da3080caaa808deda5a61990271a0c0afe0538f629f93d86dfe0a91bd4336412b76d4ce0ffbe1c61e703926db7f6d1ad46a204acbd1b44319d6bbccd04cf0ab02c24e9c0349c0ded23b54fbe2a6c0a3029adc5c1750f12c8d9beb507dab809833f3da094d1802a3860a398ac06e2813eb00fc45dd93e6ff299c1dff3df572934faa0b9815fd439eba6b5b55fd5c2fc7de1ae49a672102257e75c81b69a12326b65357cb165ff03adfdd3edfe1e734495c6739bc7c7eef5a0ca77e27b9352ebcf87e5304c6b6950276ee589b26a5d212f674604e6613eae754bfa4b6853801d0968961f79f97ae80000d3d1a240e85af3ca10ca2cc669167d70cd04a5610290c110318f61989a92e1bc850df7287cb988f9b736c080d8f56143d9555b45420c9e889fc92ccf311872a8e485d8aa810497fc2590ca17f213c9cc0486b288a65948d7c6150127a7405acfd6816e4f5f04c7d9402074111e375b1237ded1b1983e680590ba082764d342364448e09e7e81c19af22de4f8c62bc21d5ba6e1487f85a61be4026b57d098d1e71723572047432c472201425351b5a4f5562709d6c3f4a920a9334f3f5459b0e9355afb5b2011b1e6b8e2b7ab279eaaa312a672e2cb541a1cc996de6856dc86448835f3d972b4f8819b196b87b0ad7b2e756e43f4016ca0172b73405940eafc00f7fb6822a6f5a81fb5ee856f53acc09e69c6a594cc06e41ab7129d9a784bba2669f681bc229a69c9eda82deb7b6120fbd5f5c04b94e88d2c55ba1cb468c767bec86c6731506be5862b918d848d96444ea044bba0c2db4456edb5e52e7626abcefba641099732c15e57efcac1f211d39fb4fbbf1cbca7b19f674921900c2f3060eaec38ca5eb5a8595a0b0f2b129b76f4f862f345eb147b0fabbff86391ab9b7b7d8674fe0fbd40801a2d824855fbd55754c080a6b7ea4baea25f912d6d6397289cbb1c2c111231da809d4ba324fb97cfb05f8dc489f0c88532701579071cca6e2fd459ddcc7c246f74a293c1e5616464f4854329c7ef9b9b443cabccc9a1dc551e195298a8c3c148df85822c02f6e61f097bca5cdbb06bf8c1097cb01ab976e551d230e50daeaf6ca78f3f6be182c207d58949e52bf8e1a58f20b0ac622b4027b0471a4c630797e3b605f306eccda32541f6e84d2192a5a998c96e490ac0e12224c03956129420b6f232c585899e2f7f350cd11a23455e0cc24bde0d784002de9384b48a821ef3ec455dde7122be0e209a1129d79bd8b4d7f7f0298215734a64e7dcb4711b6cb78d96cd65521ef6e90d564e1b09f01451111efe7730492062bb06106191464815a2cccb83aee50c684f530bcc3a8ac1dac21fbeef9e7d11f1ebda68e2756978b532d19f600fdfc832ef779067f1d1a7faf2e278ba54170ca0fd492b60a2eec53e458c9123fc74f4f0f5ac2412b72d8d57aa4e74ffda81da17f83da302a23bf759e3e5e9f5fe0c564967d910f513063c99f14df9e7b92143fde49d16f1fbbad6ad15c4eefd9c0fb8e64fe69d3a8dc47d69d0c7509a78610efaca51cd5438d129e3e211e9645ee5e06eb4ba1006adcf166f4ea2c23f9fa805b8b1401054deeabaa253b42251ccf6968a9f3fb484fc8fcf5273c795ffb65deedca1542719776c4f936f96e1ed6faaa4e2175cd0d9016d72ba471e110146ea9211a27459ca8bbfb15d3e9d6e5fce6ad11d24f9ab3044cfc551d38f806ed6b6b9fdbd88ef90a04ba8a9c8b210d0719ce4e4ceff8eaf4e1e92bc1e03286def292a48f97931924077fc1f16be1168e1aaa6de1e54c17ea6c39fa63060532718abaf9b5f2d67f9f2ad74662fa7b74ea5fadfb41be18cc6d424b4b5129047c3d9a40e9ef58dd9ec3f55d9271b574bab45f6560dce8e37af61ab9b91cb794c6aba7c10f8c581cf94add5f309e3b414a64a04d5923d440960d4bf1be36305ac44449b7d51d7f29018c6968ab58ea85c683b8e22eb72e94b02b5c7fb53e31bad78fe6a1d5331c665a1120066d2241a6919a0fb06bf756646bc8d2d048852a2992f714fb8a4dde79657187c4e09aef185df02b349b64ca43fb7e358fe2bb884b69023b315ece33b6b6160700c023217f6e5e71eb379018a811a3fb0b1e31ea84dc49efffdd449ac2be872456664bb730451daa40cb09cff530e299de4598bf6a5f26a99380319212013d76425d84eedf94c60ad1b0323edfcbb2a876135075608430deb8e235b81900b16331105f56d1bfd03a1a918a03bc548c9d6ee1e9ab0bcdf115bc7d915b6c4f7b71cf194b7dbb48d4ae87e9a1ad1f6de8ff254bc4dec0aedfe53aacf51a7040042868e2c9d1f0a23bdea622f9a97d7a403445ab827f23a955a3a00ad163c984e40d9b176ad2265e8e50f1d7f2775afc3ad32caba30aa9401af78911a MD = 46f2afc4632e2121e7ab844474534f44c4ad9a13a0b59eb86918aea1e16bb13f8e753dffbef875bc7818244a84e4e33f Len = 39832 Msg = 60615f98c276b805508690a34676899bf8d93a365864d5f2bea207d5e9e92001418d74895e530183ce29525e1314a376ec6945e6d640449dd12648b56712b900eb9b26e3ff67e86758e7028dc6414ce26e8ed1545a46754435f8dbdc4f3f85a3e8f13d4eaa99b4da77286ad765e7cd0707b0a527ef5eaf0d708288f3a958cd13bef9817469d1af03b25450e5faed6e0c3e378a089a703c200c2b19a27b44d977f819bafa43f71f0b91d37d5e8c3b77199c8c489f656462a6915a5490cfedf1f81bbbaf8b41f44d199c0db9eb24b93058a815a79357226ac785790366ac3a5dbeb14629cd69ae81565c6bcb34c94fe1efea3b6f8d78939caa72efeccb1b1364f04222f068c50e03e958537de083e5d106ea666734d19d3f78df24d868226050b654b6cc055dfc1afb182e95985a6349c631ff583169299d5855808ee5cc096739716c854c37610fb42565dc0357b19156466c0a2b4920fc735b6bd8e91ef7f2a120abe2e45d232a3b065e1aca81b7f1dfb11745cb7768a5f1794d7c1c22103816eadcac76d72cb3b943831794e15eb189fb66d1b9fdebe0f9378e4327df3d83bf5565aba9ab62f255653b9a0a7d8c187babc3759ce38ff4b31e96f5b25d6719c4ebafa726e3af2f38f3ed6dd45f2a6fde4995fa1c2f3e2b48b5cd5a64a574434e3422689487fab189750356998f21fed95d4429e2ebdfcbe0849c39e6be4e4985b726b59c9d2bc17174e41e0113570d957038c8961e5a1da214695cdfb0db7390fc2458e62f29a71877f88db6f5b6e43a09d89fe0d19769b7ec9d89f8840509978b82171944deaba506a76a5d3d25cbefb18e78660b7df74795a189d941b252c4edaabbdde5311541a9597fa1f18b09dcefc219d3d4f60e7995dc2429efcc973da9020cdc190a2c13e97692271bd2e72a4bda4bcd34eaf77576b52191973a202a47f4d1bbe85139444d666c9ac2e1ad014d3fd6fc343ffb64bf964ab83fe435b44fe7d4255aee84fb5e91d5a0efa0a3887e59820adbde606ef9e66547f2b21e034a43dbc078ca5561a26094e1a9f710e86590179c32af6ebaab0c3be5b58c223ec06faf3449cbf49ea3397307f8ce3e488b4d5c5d3f9a6f715d72943b925a8b8d37d5182ad5daa8d9e98538b7e40d73d176f61af20c88a9ba987f38f090049f1939dcdd4a25e0bb3afaadac9b769cf8abb0f51906a15f65bee29beeadb772a70a4decc83b40c373ea6017975bb56315fdc1b0213f0409eba4c62e7f1a108dea88fc6d9fa62e6d1911a32dc19faa4b11ef2f91fa453f6c8395c9a0b4dea23bb2baccc72b32f8c4f4d64956f10e5b3a36ab84fe6bc15a7275b9755a53a2766545c847633488a5b24e62dcf9f150d219ca5647613e5b5b02083751c2240d92f4ecdbf5a7824f3d1e6ddde480870e17d1161b012139ba4c038638e541f1c800ceef1b5dfcdc30c9ef9a6ee7527cf03048622039a62587345f35e3ba40807ac8dd96af07cb0bd3500f1d3d6fd7979d2768f68d7758c9691cfd5e6157259accf00729bf7b7ad8dfda653e730377a2be0418198b449fef090bc548d9445907668236ef75427308fd70d945382c9a63facd3f144226e35d0e099f3d740a458fef855131f7e31c66d4185379b370a8a4fa8cc72fd9a78cdc211f73835a3050fa100240376de6dfb90ddcbb240d5a092b654897b2784f0234ea532963b23ee10f7000eb4900d423c84fc4f98c6d6f25c0e40a97e549a5ad2d10afa925a4bd6297b8873aafd7334f5c43d7f6f9fc39652d1fd9af107131f68f3c3bdb115a343a5b8fa015b01c8ecd3d901d98b5e23f2f39bdbdc77a1b7b432115fea86ff92bd1209e516496f46a0433df9ec8074609ecab67bec76c6d0cfdac4400f686ac2a8fb18ca40fa789515c06d8636f365020054cc4e5972e8f6b8df87049af9f99badcd502a1fe2c03ca3d7d2273738b2a0be0e47d392008aa2059cd42e2b902e8622053a84f196c8a5e0f6266d6be4ef952e73b39c24842e6b4cbf362d2fef7c2abc3f425b649b144933a7b4b9536c7e87e8118a189f8236aae4a31772164c64f1c2d8022de74415cf426917ab7c53d1c1615445c9519f45f963d5129d7d5b6b63dc6bf46d08365f8063c6b9a4452fac0a20d8813ef91feecf50e1922fd38102096f7783a935f654153e2d35445c444faaad0aa6e9d4a863a512452079b741db4b02675a52fee895e62818f50c10564f2b7c67214a92ad77135e7c483b773229b12bd7c30ad1a1977bb826835c0fca2d25057aaae1a1b38b826bf363c5b1c6afc4422568314ca5cb6e74b26ac4a9145bffeeb18e3f904f037ae1471da8e573c00cfbfcb456ce69b416d46915c68ac97e348ea865c4dcc4817544e3e06590cdfce3afaa21ebd551e40d5da70ee2135de66b6bcbac11e5d8880a0d56368c2239c900d3da5b810012ddca86e8d097e146370d0c97cb9759ef8991b12a8a7d485bb6bd1ef9ab86cd1103c6c6cae5685326e271f7a96ec5977df8b4c6bd76b941884890d774ac9daad0e8aac3b9c7c407546b62a35ce03d2d0877dbc49b65e0cc53e12493f7d91617d71ebed431f24b7c635437963eea6e8913698f1150f264375332e0daefab809297f89b9ecfef6f10e81f7956dbc7ca4a335047535a86b410ea903e22c8be7da9a818c979e0399f63373f905b9012e0deccce8d01349d60f79e9bc4f21f6c6ddb6be1c10c1f4b6ce1f537251b184632b55426c8815bc0eb49f3b7fddf504fc1966805fabbd9af482b8698902bc0fc407c6e1ba27a5c8bc3867e67412117d3296930d80f0fabdfc18e8fc679f4168f9a828eff7352a3488a4b834c579db290f5d23afa567e125759b955633b0aa58a91761b54e380cc919ff7c6b9797bcd03c7500abf799d8990810a9bd16be5ea77c5a5b7be5bab24f18519ad415f61d3960e6104c9d0d48e35d810b7a3850c51d1c7bfc89e442868e2ca2fab7641d642d24b93dd9bf4b9ac91bf5a3d5c0ee47822e812e267459ef4dfefb845caf94fb7430f56d9987dc3414eb755915d6204c9d5d75d89bbd8555563663200a1ce448d62ba28ad51b47808c74081584a46f3c374e5ee231e651206f7be3b60bd394b51bbdc97bd6a314e4f85fb6bf684f627f18ac44332d1742b96175822ea5fd2ca80a8f7128e148ccca2153873f0a02827d081d30b5da7ae286f3cd487021c2348b6c49a2794131f699d0f9847db2e3559fcf49284f7f34b8f0ef2b3d64c74935c5099364563c881ab9cbf9b462a81a654b34da37e963704c601b366af3debbb7bea913c0a71c72c092dafa20d433d03aea0175626ccf54273c4197d603b03f40de1474bd542719718cc7a4cebc9c2d5ae5fcc4b3be0b08d0ed27f6897d83fe5a8d115c6445a6a5b40f59a0c8032c584fa2ee6f31c85fb5cfdc96f98c4aa0208c336a74bc63e03e12835796168f287aa18b9e1ee4721383ad70554be6504fcc5e38e563cd941f0a12508a2dbe4adbbad607d678d5a56e99f1102e929f79d72a59044bd19fc1a9343cdeba0eca1b8c41787d5c250b47b9202326e777c0ac826304ff63683bd3c8e21895aee141e982360f57f9ce8e413d3fcc1949a150d1969fe892f7cda8b0c13d2fde304d2c9e06c221fc751b677c3f1f73511cb957cf5c058b23cdabee42df6c081f06fa9221600d38d498b39ddf0ae7a0362866de901cbe771cafa8166f69972bc1f9917b5ad83edb472a3f3851e5c0db303451ebfb1ef134e3636c2621a6e8212dd1baf031b67e93bdf26641bc17d2ada70a2189f8a9c748e2b1a0293fdf8571ca561cf78e41f4e69eb9d1bf07e9449d03707fbd6f06683d7f63ec24b15d96a3ff50609b59c2c95e524727ba1aa33f34ac2f1391487efb9b243ff7215f65444036862de17a8124834164113bdd8deaf80a0f840c6b57a9e8380f6a273142b6cfd6c12cd3d9c62edcd4d8374838ee6e7385d77b36c1d999ae2399ec3f0f3a16d847c905785fd90ef1716a40ec1310f22d86519f18304ef4744ca62670e19789e3f0665fd8f201ed4a82e4d52c56399fad734399b9a1fce1c31dfdc0c28f9f39793b60e2fc7b88f3706d0c9d12e9b29d7bb6761022fd2c8922fd68613d019b4e218f7e37ebe3b447ea9cab41a5b4c3131fb5b2ad592a27131954adb1ea1fd2f064548906ad10ce1240758868ed9fb32921dabe18681232a8308b955ad0d28e45c9f34af64bec1d7bfb626dbbf393cc090a8c64f8569b9870f008e801f7001578d8d286b0cc5eebaba2c920e1be7654d862326af52caf9f92e0346e516892b1af195a08dc384d7ecabd146a83563294c1af3699b8f13591378977eeef2a71a71215f3972198a320ffd4aa1349c4add4ea7bffb9e9ad15b486713a3286458342cb5306fa27f347167270f3e3da0fd15c7b4df59230693751a822e300bcc2b2c9ff5bf9fa975121ab4c1857a2df3f84739dae80eb332c83afc424dc2139a8e583d9b6365f19ba1926b5553e17ff5db0627725088e9dfee11803fd8b5da6ff04b97eeb23f1543717ced4ae100be3703c72333af54114e739d28d375a7babd0f6b419822a77f1cf03edd2ab3546338010e8f675afcd40f073268959b045ef22a5b9d004b2bb978bc5c9d6d416909696140feb5f9efacb20775c1fecf4811bfdf813cbf82283ef7145aa09b219b1b4b8302e377f2b8f5a802dbc797790f8d669d70833e6e498a18c6cda93cca77036f14c8c055dbc5698167d8ebc82eb72c96f2ae230565fc254e120a09baa2996c44650727b82bb152aec501913966db79c16d9e7e9d1fbc8b07a4a4349d505eb05c12428c1758e95bb0a8ca6a43a7e8ef667cd6087de20745f5ed30cc6d4a537a269b0f600be9f9ef1761b7d97f686c07f68ec943106368c0695a1433a2f6f424246dd2460e654f8743ae3e61552ed16e0231fcd10d0a5d950289e30cd6fcdd48e6191f90874176aed5ece2946d71b55c1a04f514cc4d623e21eb01aa51b26b42ec1b5be21f04fbd04e8c38d510c7948c9e6626a0c6a2f32677fc14bedbbe1abc96e32bcd2e363b960e2a95b5e796db6a1fd425d784b19cd8553b809cbd868810771ee3844d4bd26aa536adc97a76066f1edd575baeefdbee4a37d9d67f922fe92d1d37d9e4bc4cc8944ed55221dbb2160be05f9f7db41cb2d76f84feaa677e90f96c8d209d0e073a6bc1a112763e4af9679b8305a9b4fbd08d511667c67cf0c29c9b47eadec79e2a8c3d957cf0245d83c26d86308b58d5b1cc7b02c44c5922d867181cab126f7e23861126e41814464facb4cdb2cb1656f1254bde76b472815ce9616fe3e07c33bfe9fad9fa6684b1a7772fcddec183ebf918420e01876fa8caa405b627b1643b5a18492322640c1c35c22d0b470717f154260c15f74d86e5ac278383d91dbe017ca19aa6fe8900e2750e4b0a7e1449237cdef88aba7f7ed46bd4595d9a7de022b2065db9d15e0990efcbf84fd671adeedd93a5e0ed85be01943b05a7ce6a812b74c700e06d4b9cc4007bb34ff2979cb010e4729ce308aad9bfec06f6f76c07684f5422cf04ea10e841ae0a8f550ecc1391620d334d60ebe94937dbcfa7eae985ac4e41ba4ab22c8a4dd37c92703f8285f96cd4288f26f79ccadef2a6426fbdf01615dc56a12c46066f7c77ddc6b27683939546012ae33480bf21f9ff7982eb24073b51089ab0e3f931198ad5db000e990a4bf131930e492180a1404f9f9cf7be0a2f4e64b9f88cdf3d2b342f3f90b142b821645e7a009bebc9ed642b37466a1aa98232ef616ba724de31f22e46ed14fd4795fddc2272b36bf566e3f6d2e7c8c63fa4ad0d3372d976aebe4377839d9035131a4c3f3edd161e9d9e3e56f5298a3d6736fb32a2b68a213930b67f97fab996b54ecdfc21983a701d03d1b00064350caa99cc1431af3fd0e839b9cad6bd077ea87401976d3ca70d1e285c8697204fb0644d8e1652b570e23629cbdde22cf079674a75959452c241fb8c2d6f3c0630a53ed2cfbda861b3f1cd917b2d2cf30b037c32987b194332bb4f9fc2ce315e8e6794c9ef8e854c7f7c08f1263d1987cd9941cce8bc7eb67ee584e3bb2849c1cf7400839bed8bde49dd62d98b825a53aec76259f4de3704fd3d25f88501d7a86a570c90236f2e8f99b275aae99151ff250a589a3b54d4b7343ecd3eaeef5daaf59d03903487dfe8e587bbf5eeee82e2d6de9eee2ac4ca55ba76c536a7455e21d7929fe43ddc3262b3c9903af9fe7f971ab0afd651829a690651b860fca85ba5a6f43c0cadb0a8959af4bcfaa945aa94972cf5d33e32d7599e7c115e1d9cd8beea1e628a12c9b4e9f1957cb55b589653a2a01b654f39d3bfe9326a7e887757d5f79daddcfb6be9e86e2869ebaebbb56ce3b68b2d132c41f48d311e52dbdc4b7375de6885c63baa19572a0f1e11c39a48c0dccf7b186e94afe0e4c76b7640362fdb7d4d15119d97e54326d6bd0314c76fc08f52dfcd953e3a8ab9d048e627ba53aee6a5fb5c2615e4b88b5b591133af4a795abfdbb124b13ce14cd34bba171a9756a71db90459b6803dd3f762ca84b48141ab50ff5191902f9b0a4b0450730953693b0ecea8acfc5039ad457a7dac997cb01dc0ab2d605d7b0e7e920347eff9206d1f13bcc79459cd3253c000c90fa0c55b0e896fa3157bb7c21662b91ed25c86b8cfa703dfa4416fce83f1863b228cc3991a15cd61256d5e4c6e17a633beb5eef2c943246f5155b0549a448b2279902ff0ace044d614b4e703e23b5b252997d1a198729ee52019276b2353703d995d43085393668067e4da8f2f4838619774c73bb9bfe3df94ee4d88ab88d5daf666a5369a8992ee937fb15481b8ce878ccf4827b98593bd24478b139f6f4c99153edf01ee4d5a7f2be7f3ea96279df57e29ccfbf45e1f1c62d778c27b7124d67a385900cb593db0a5a02ab7e8ff2749eff6de3f06b3f66bb4f08eebcc38ff4199f59ba9be27bd31755ace52d6b9eae356c8f4577d21ba29af4546160e114c3908f92f63335349602f5a47320be26950571297dba42 MD = 9a7e7f53e213c84fee6961a65064a3c426c68ce6432266158c60f7a3f87975386301ed4c89d222eb55ef6efd7dd23ec9 Len = 40624 Msg = 8cb8a7327c0f73a1f97bc61f5a07542091f034f10afbe4a7d70c8e560bf58983638c23db2c009e25606d787513adf0a20d72c5fbb99141363ea176a9ebc5c8bdd8c6ab9fca65ae3858efb9604c11924e4ceea653ba6f07c9d8dab14630a71115338fc8e620e5acc427290f48cfdb450c958d6063d53c3e47eee0c693a2426e73bb0e0018f4299fb01644059562b20ec42f767a92d4a1ee9ac8db3dfa083fe6bfb96cde9d0fd88fe46d6820afce3ef75e63d37c477d4520a9aef29fe12b4581e175d0e7dd399b844774bceafeda2807c379c9efec9ad1dc5ce84d72b2d4fd48c13763a541391a87c37369eaeb501846d9b9825ae8f1ec289bbd1541d4c90e4247474c9f2fd9fc9f3fb196a8dcf6b5bd896a2645a34b3f0e4e777291afd322785cecb45d10dfead5a4776cad3a96a873bcd6dc38856f71955d5c8becabb9def0e670c3684d148b30d80d13806ef698705843cdbcf6272bc5b0b589d93045ecb4ce19a0474c4088b8c4bbb2a9dedf2ebd46fa21585e3915a730c993e1a63df4ccfd307482772b887550c972b1f41812616f43ff95256ed642c3e2d28a756a9d3e5afc66a2359c3470657e7a1f176beb64ba658ffab38e179f52466e5f05949014ccc79f2eed5d34b0e923f37bae9e62cf0eaafb0f70617fc4c63e8ee5bf8275563dd747ae09342f3dc600044e237a1ea95558685cc5aeb7bb05125aa609fef30a947685aaf0eacd20e25dd61eddc7c8fa76b8006a183f668cf90afb294cceb23ab9ea81ab0a47b76027829076444d07cb5912ebc0d2da353d886e99f6f1bb5bed937b6438bf1295057bb65bdbc0d38423e6ae51e65c48ccd89c855b965e8d962c0c7356da77150e18c8435fd7b923e60a05d359651c51d2641c986a90fd0c0afe0b187e189a16cb9ff56fc3f19703d6889ecb2bc47cbcf0eaf0efee6c3500606b79b4057a90de74a5ea83b0b2c23cfca699dcf08be353cd7100d20eb36d303f7b3c8d1288c135b02f8fc64da0a396ff6bde4fd043b9dc12013489f2ec0f6550373debcecb96e22747cc82c345a0d888e0556cf273652066a2745bc39f82673ba6641861ca75af82f489fd392922cc3e0be77a7fa351e7725da892a9542efea7d09a5bf20dc762693fae81d8d29238caf67ac39e5be4f9dd39b874cb947bf23cbec5fba91df5c4832e2354c7ca56e5d3a9f78d7824861d503f8c4a52e6d10aa377ce41af81659d79ccd0be2f99d89b022a472135859f1d73760c5b65d3980f84039e752cc181b5f21e9d0938c57e21ff8350c7fc0797bfede621f12de238ca866b1cdf4766b0d3972e737b09d8b24171bcfcc6f530d7cc6797b152d29b190052b62fc629f759c11003385ecb5adbc100db3268498bc50b8892a5c77b86a37c90ecc174fafce64504a5d6f8a5d1606a55eadaf3209dca46f9dee698502c3f05e716b92fe1febe281c1d3392c0c7ab0418f0dbb0a1f04f4361835b0d7a145362ff3bfe4006844931ff72397344c32357f1f61fe7f50bbacb698aeb6e21c6495c81637aef9216ef2a55accee5584e302a86038de0437674a6b9fa80026ccb87bb15961483ad3c18d9c8d4dc2e24ef3a47821f0de2b4bae69cf8db011284aa774762ddb4467e7f2c08fef04a97d12ea9748b528736705e7775ce3555e691eb7fc7113f427e2e66937d9f0b00688793e67a49a5e3259eea8ef8e51166c6ba170905c9c5a774e47ab501542ae6e96da75721661f09f567e695efe2761bfa27b57cc73376c970c941fb5bc557e462acf1653087c9e2eef2dbf320706d5cc9014d40d6f75a91b90545cb559999e21a6bf9787156a9545a6851105335fd117d7067bdfabc79e799bf0e8eb578f9c85ad348f9aa7bca487ff0ce5452d92e225c9b8c5bfa2adcb4562022ad440c7d7e6a0c654ea49e31a7a7b3dc27e4050878afab4382a0ea8ade394f0b8ecafa2fec923dd8e12766e85718d802f1d06194f9bdc7159ab2a48b4f8a74519b0fed17fb1a8f2a19fb7bf6421a88c91adf94d98ed018890bf9ffe8ed91b97a3bda8b3c914929e25de786634ef7ebb70ad947df202ec6273d3da4a8a2964410d5f47ca69768338817b42f3765f52856298621af9520f87798463bd355e03d9bd326695df6bfd7a5ae2a1d7b6e5e682ee0adcb50d7eed60285db6b72eeb8cda19c36fa6a94963bc08a11f9375178d2c59518eccacce0894f6ac6dc8b54661cac98ecd6d45b35876113316a71f68c8fa5b18d2d265e3e39e6b0cd3729713251432f12a6a332e3e410b152193345e1c6569dd5366b744f0d50c0b924512c6394efc96e11df00ea7a56cc3bad8426c1a05ec0b8aea1f55c2e1400514a0d6d430f36cecac091af9070baccb5cf6d8172454781fd3dd1cbadc4bada5f52641c18e7a3a6ec5ac1261eeec5198827f43e3ddc994a6e8c02dd8af6cbb5a9e35f222b47bbb99c88754ddb1efd1b7c5c24456a8dda82d1433c133beccef9f9a60465c4550870a4f2b70c1126ec3a5817027e41829490ef0a875507cf4b0d15435dce2b391131cb3f8e4b062e1adfe6ff98d10ae04ede9087ec8b38c7ca5bc5617245a71c5e65d81803f2045f0e70ecbded270cd291d37b65729d14fbd44ad3a849b38126787594241ce951e0505733f80966907ee4d77a4a2273e494f04205c2ecfe027ee6c7c70ce31835da68fa8359f578de0ccf5253df02f6efb9a7ab255463106f4d30c538776068fa75dfc3a488b8433ea5daaccfcb1d0c7f9380eef909b4cf13badfd6b10e9abfe6d83b195d2c5ab1f8718e4eb6b6789eda4a03714a86e92535ee7a61f8799907432c076377ede4a95397729ed04a1d954905b89ddf760af91c1089d0d75f65265798c80bbb755d12983f0f05e52c13d714ec28da827f1d321149948a136807066b450878ee69cdd61093ebecbc07624e8328da91f9492cba5cc124f7773d868dc65b4e12db743cdc00b890b91e8113e0dee156280d7d3e78459fc07fca86eaa5b2012341493cb30cb3d986d6d3422c776c3e250986c35c54140cf18ad3ea3b35755f0e6dff69394e701c53a9a3f3b8fa7668ce9a2cc28d36102f3e805b128224589e97fec6a4d78a7ea9819c563cbc514487d945c723d90682312fc92aa6c75ca3e6465c669594a826a99815b3c442641ec2cf711e8d48acb2394ccd084d10c49e5ea4efa7e37890b0441e7e8334511b4c413785faa9e311e8701ef5bdaf6744912f382051368b2b64a19d3e8e33f25e152d99eb231fb11b6cfd2ca71075d3c4c3808a552b38d65f89e99cbd9c6a2c15c3ae7d0a6196bab38509fe4ccb475d2c7d7a23f7fe8f60156943a463758107289ceb6c4a7cb707c27dbc1d4db4cc0b6407458a6f92e331364ad83c98e01f8b7fe90dee133b299f2e9a3d101094ade755a9084724afdd52a875d0ecc4a7ecc102f13b89cd67948be125b55fff3292f9e5abece37d1d24ca5532523c4f9092b09afe9ec7e0c8a2d1c1654b9381582148fd5418e5e4a361a123c986b5a164b6602d565e2fb526f97bb8a42833fdcc05dc86edb4d5c00b3ce0fc8195de22ea03daa442a249b2494190ad2873c7dd57e4bd66beea3c781b5c8ec7a3a73f3bec1e25e80a929e40f92319873b55d888c167f4870fe0a1769c6ab36c77e3615230b249e0f657b5c8fd461d3023f6ed66d23587cf28be8c21550d58d24572cbd180654f734e1916b01e54a48f287d8edf52f7812850ad85e110ee83e3557c051ea2df3e8b59ff4a6124f2b78c9413435b0854e779d1d5151e93b53f86ee2898a35ec91e0f6032d844d7ca5c0faddf9542bdf5c3aaf15dc340a70991a35a9e0bc67ecbf8e6abda48c0fe849d00bd0a0bfc39811ca2f96d18af14928323df07e6f1c88cd3fa821d233c63c882470abb2ef144a1fb4b312f9bd4a2f91cecc68bb28b06b5b7322d26f022cc3c12cddd1b848aa6fd678ce0c9d41519e664e75751f6fcfeedac76f31b37d9028b55787d52972d263c684d4f634bdb400064fcd9823aab79ddbbae1e2581c9cd5b53313487ef438e060676c726898fe0f02314964507023e2debc2f46b545af45515e148e21235a4054af08e391597c15da915d4c3e3681784459bbe163bf44120a26e028c8a6931de3ba1ecc5775dabf0ffe9dc235945ca8acf1fc34dbbff7a6402c2aaaddf49fc3ce2722bf2384766512c76f68eee0220e893374d395ee368cb3ec3886c973ccfc5454b92e7dfbfb92738a6692c2c05e14699cca201ab08d3fb5d5be3f23ca970216e1568cdf42c6e1b2c5f7f249ab7d54be7c40bcf2ad7839c6771056755faa8f965b6f6cbfff64bd40f8b7e9fc080c3a08709d0c864b63f5765ec34f26b963ff53018840a898419fbe911afc427c975ed81813916e00ed0d45eb6b9bb05e5fdbcd92159b219409f37c3d95abc56f8b1d9db168ee12648ffba5ab6dcebab4faaf768bbbfea3891a731a4cbc7aed577400c9faf1650bfca92b161d4e4aae63c0d4de3cdfcda6ddff79094cf3dc32dacea2fd5331a8c32fe51637cf81b1f3c14ef67543f59ab409359fd9bcd0623e50176ea838ce2bd074b0675b20ac773373f18ecc2f91e8539139220c2ad68f585dcaee4b3a1b609c71877920cf231cd5f25508536e2938fe1c86da01057ac6296a758c66c5ade9bf9cf6d609098a1563b2f5fdab7e400f2bf1ab1268eb319919fc93d37b79fa19925d7b08748e55e3653c30c924de6acd55c72255942aaf9aa28aa25e09b58492cd49808b03cbfb2942f4b205600d1e0613e3693e2362292d7b9b2d868206d1c7b8c7a3d837310e398582d64cdd98be4beefd0c16872042e3edb491d794ec663afd8e516a7f5be3a6c55d39da0dffd0013f7a67794fc39130715d7bdb82e4c65ef3d415dc5cab2ff35aea396761b0f7c88dc227f0edea8895bf0c481cfc7e56c6445f6d884fbd57a1eec0716f893aa9f4728aaa07d2038da62f3782e66217abe35776c508d8e0ef34c9666e4ce51b4b27562a8a189c8d34c43a65c8f2445f4a48b5b0b8c878e44b1ea3427c99f5d17fd3d13834bdbe060292791d66bb23a39668e7a3c561b0061fd1e4eb48d13bdb9c8c5c2a3661b6fc6b7353d4f89b708334c655b6574f1ee4c1f106d74f8d37b845b35f770baf17eef3f963130b2dcb8c89e3987f0afb05fed5fea18cfd1879f5efdb63b520e0314c20871f5dfaec951e2a3318443cf005c2c04d1d82de2d72f31f87014b12bfc39275cef12c64525db68a476dcc89c8becf158ef34f6f16935e4928a0df5da82f50681380f4b3f995f42e92f16e5def61724a16cb492c7e8b85f142cab86e13d5147c07374d863cce358ba85bb045cece5ad2870e06a2cfac18ac68078cc08d754d361c8cad47a6772925fa0528cdf135f74352241e4e847574defabfb3019f50790ac6097a74c1111d81fa763e52f138c6210aa5e69c2788290d8d8bc18da427067e96366b8a173ca1244c377761495755d0031bf6283354a3bca2d44ed156399405ff9bc714134a428141b15a95641204e4edfed35f325b8360bd21a1890038a0457482339f4fda802d8d8c5e5bcbe971e43db6f4cdaf1d369e3f0c6ff14c84a99197b22788176dc88d7210f930fb5e2b3254ecd0d0041a4bc9cafd10c685ae0e9edb84297b1464aa35b1f7c1917cd07f73c5f90e22dbb31187d36c2a6566257db1b2709fc4c16fa39aaf993e09caf10d1d2373f32280a8463cdae2134a488b456eaf201101a8df2330dd8dc50660204282dfd6264bad4a587d53e77201b730144a43eb23be2543c7acce4e0d13c6fece696da82e2abc29a6add0f4ad183cc468c8f36a3e66e12e0f52f4426cce89ecff255f62613c37b6df62c4925afa43a8916f3ff5c778470e48b7e2137a73036b534b278d65fc9a826110c138d224566d4ca1ac46558ed16522600a299ccdde0a794f5881a2e87f0cba5c3950c9230f72e904bab47ef71ab31adfef0d6a1b743abfa65507be8c3fc66999af829672b96a050cddc89a6d7d88a07c03276908508cc4e4bf580f54673fed5d9646d09ffeb30f2e980b3e4e944641e8e91ff0011d60f78efa2b2bed8fe9c41c8005ee1749de85ee7bf4d106d97c7d9b035fb5921567e60997d97a9404547c5aff586555155d07c0fc0e0942c7bbc206d45f1027e2f20ef91aeb91f48ef0749d56a6dce60baef35a8acf3d7ee9649db0fea6a65f00afd0b1e5ea089b6a5e4b5838899b567754d6ffcaa0f417a9079f2dc4bede93e8f1e9d8ab5d24d530ee7f1017794702f2df21351e3bb3a9a12514e1d9102f632658a8e1bdad9d5e7d317e5975ee669808be70af07f7f2a14c4dbd519e331f4923549c41af63d873a9b7d7a8d6515062137333a21a5e379b14d1e701a6a034b27a66429cf3084cd130f1f962ab6abb1dcd8de8d2c7d708f39562208664dff64b961e2a481b1380e3cd60722b77630d17716f1ea5830add57486f08346b5aea5100dcb1c79a0e0b17b993d077cd02acdbb9b7338eee623b12a868fcb02ca9677f353287b002605209900c72bc1ea230f700c6c6136c6588c22fd07c6e2b341432bdb00a85c6b2ec25eb2af78ceeca2fe5e14e44c78f9d6cf2594615e2e99376f814c5b8bd596e3ff9158fdd5eaff30024c59e4e1fca725e0fbf3a47a2da3fe65ba4f410cb5d0ad3ffc99b7295f4b54830483730809f6cb296cc1d80128fa208ba18bbb13424012ea651ee75e73f796e94c3b9aa9e911521040a605dd67c5254bfda9d088c60f9c68958f945b6f2b7e9ded2960ace21e42ff3e4c34f5322d930c955089538764d3225493c7089b119505aff4cdf93d46215d2f586d31d15af4353229ec5cce683e7e69d2874d3ece628a5944e97942b07992db75b6798b73cf309cdb048ce24265e59ef5dc12a18d6d94b5c3bd123885d1060a4919b5aaa1ad649b0fd6c90d1bd0c0b9a4ce3f0d743f8c891750ad69ecb221847c9dcd740b1539f76d6cfc951b0875838666bcc8ab5fd89ee8aa331b0ea34b10b74aa932da8f17779ccd0ec369946ec444ab711a5b55e2bcdfd48a97122cec78a229322b35a366e54501e5df2efc114485a6474dacaa11aaa3d59c2521d56c82e4414ea945da8e070f116b3191c9c8caf25d24a8c5e5cc32ddb54f0c632733f7259be6f231bbf7a5a3048600bb82fa2033daf272cf8e7d1a357d8d96ffa9a99e0f MD = be87bf6e103f66527b12a010e50eb157524c76f0fa7118ef8f0659f3a8734008f973bdadfcff5d84cfeef0914245f47a Len = 41416 Msg = 7eb077392096a265d703e730e8b65d65c5eaa03f8fcd777bd933b4b0af8c5ce3d613085656498ba236a2d505877e18fda45a2916b74828007f9c63e451e978f85d2cba523346d6fa86b0b7422f6aa65a7434b61f8b015f345aa9695481de0be69a6155d2bf75cb944d95538fe86251a3c0df100112e0643ef1c08da746535fd5161ba08103bfb29916b87192bb4e5f010dc3ff6554ce7e47cc4b9886a930baec57c36404060ad2306683dbf6af16199be5484af35ab1f67774b05398b05d6553e7bf6906d1407482c75d5861cda2c79acfd6bb522b7314f57059838665c2a8334e79772d6a47e0b6c0aeaf7c1cdab12554d5182bcffa20ea48acf3f7d048cab412575621db095ef5dadfa9eea4a71e65faad2a254f30627d85136a94f8d515fdbdc3cd8b2c6c36679b560e5f6def58814cc6b9e9b2fb22d7aef5af05e552cf37d724a613635aaf338d7ca679809ca5a2cf898d1e0045a71f4bb98bf19fa84189e6e2a7608aba128238b938e1e4944ef00d5c6d6d42f53a7ee5c9c6002fbdb31c7465991ba873a77b23768e42a1c19a928da8227e7ff3231c038c28db9c7b6d17081443ebc66fb647d6196e42c009d3b1d7d675f8bf27aa202d6a792aeec9b6a32b596f79eb95870dd90ca18948563f74744c2b840a7917b3ebcb80942d8ed8e8639be36d1fcd62f6b5b5efc0418f2804eb740fc969d1b1fcc61706c262b4190d3b43686e6aff8e2af17e1f8fb39cd488c4b5e870e317c12445b6d35c9522c23b38b7c624d51354d015cefb9da7658c2988767d2081338f52f111af09ccc01a99e460c53867f2fc10a90c499324d1970fbe2197824a0d63af508e627111766b50c6a62d522982ce1336a2d21833ca3f61ee1dfe3d468d8563ec96b33d6b2cfb8766f2c51921ac110144f75ed5db38ca48a0d27afa7d9c3c954d926b15e3ca14674daa563659590f025973b572240181eb5da8d361f820d26df9e852a07f38fc180238a850d96f0e3cff7e9e96160eac73ac07d019be028d147a023087495efbc10d028310a7d857dabd80e2e9ba47930716573bcbd72bb6b25846cd7149255b8af772af1ecd7a32021be1491517947dd02200da1e4c82946e191ef1078673629c47eef321533fe6dda2099bbf35deb4f5586a76bb24ee717147f163f108325a1f85e019c23f0dbd92d961a0911d0b7e9f40fdd649675993e36926ecd6d748893a3aafe7a89bcefd49494f2033d60524f66322c4711daa43eb0827545ffc9f3816edc3267b6f69ef2c783ce24d68b2ed21483f06db4fc9c9b1ab5b63337e1daedb26849de5c1c6db60f091af86dcfc234977be652e059d6d5eda2ae0fb65ac35b06d5a168c9bcd091039b44f8639ca0c957905a9134510771a1efc955eb93313bd4bad57180466c062d90f8af68703f22ed57e9a3119092e0cfd3948058399912b47e52a3205794a7e5a08287ecf911b3b138fff318871dc5d0149c297cbc8f722ea6a5582a4eeed8d4409f0c5185bd0e5bca2a2ba9a2ec734b295cbbd97a78dc9baa4a0afebadf2b71d79ab746a495854571e4975582937ba97832b1ff11e9a4941fcd562e29ea1236fc02132cd43fdaf6c6bbd09c94a7617387ca964e01568ca07d8ba4290aa41fac1461aa84a31051f83f1c61ff67acb721de90e346d743d7393a119f8fdb71c639c725e7ee8fbb9cb25172b5fe59f7df3cf3022399e23626c6dc0b82b31ae788787aeb45bb08a61dcd947b670a0a2d5c4d5bbad187d0b1fde1d9b5f8435789e8e0a62e6e7a8c4457928e92dfb2f6c1b0ab7f0777c1212bbf12b9cd8aa10fbd69fadf4bacbda92accb996359a798e497f0fe39470b642180cc202aea47ca2167e2f9cdf9af4edde0f9b41e021de5f1909b31fde76d7b21b49884ac5c006cd19b8075556b3a0b8b272c0182f0051e7d5036d8a31d4b5ff8a07cdd8cf77ffcf3b8a1aaf4d7151985ca8c09f8ea06496f1de77b95b24d19908ca1b531836c856e076c1e1306e880b4104053e6bac870af40d6a33a6e1aafcfc02e9303c86e0c2cd00a5b18c15a48ff437167b526f49a24012dd7fa185b2c9f834c006a8d2e9b145ba3e96dce137a4da946cecef732d0b8a711a03d7ab795e71f2383ce9c54390eef5e4e78f5bc1e888ce80f97f42919527cac856b5ad7f48fdadaa497bb87ef02d56314a300fd3a97327eb27ae7827ddac6260eec8162507efd9aeb2db36fc4d856dbc255b57dd862e43140de96e40439cea7c329b701b29ecf8ae1f94bb5c078b8eee1f5dee5ffd1e929402bcbf8b755dc562d88c35c21d69ad30d614d01ebcb43c3f8ed41dcb8cc8b8d3ac84c669d17375bd3726f1aa50ea49cf7ce7ffa4eb741838fa4a70b0a3b1085b61fe1d5be6729df3d5081e4462e370e28a9ab49f025f8552f82d719fd06c13b3d9754ed232ef80af488c2610d1f995127589796d9feb1625eef9baf9915e6d456986c57d352ed037f84fa3a01c7128c7c450c881228b4d1a753b975e750c77b8a8af0bbd6bd50f366aaf1162b0fece7b0d6d1c7a28d49cb8f16fa12eea0ab5660d6a9c03555690132646e9e91df6d8b4a75b0fc9114b878a0a0262fb6ebdc8d60e25f0ff7047f566a193b7a3d20dfa0d2896fcfe8a448ff615a0573481ba0491217d95024b1dc1996301e5137b8884dd17ad7e7ae2743895aaa5e87ab1640b2ffdde12ac544c6733f13e0cb8591b1bbceafb0edeb84ef3d14f9fb12e7c603efae9d3d45e1a4868cec2949913192a1125192c288a7a3954416b0a2bd05113329a7bdb64a80bb648b25da204b43a2a279e28ad461eb6c7cc5e8351c300ce1168773a714e1aa70a798728e2fa1c1abfa180affb01fbec7eee913f23112041df63299c11fb168ab99dd5cad3c39b594f21850591c6b299c31d81e4da80cf6ad1951a1759f63c154807f6a9f10be2645d2a13d01e1ed33d38eb991b04bc5e979c80d142a5b9ebe54a5a925cd73d61da5e2da585dc74ce4544db4f582e0e6e5684a8e79471c0b66915081139d2c29a19e6aec29d695314407b6f3d12b3016f264e9fb5836aa52c1f4c92fbe780560ba17b1ff38d515435cd4119bad1303fe1955eb7c3a5ecd1ad76557dcaec7c42370f900390ec00d2b33a4a5d711a221456121993ba5274d0bb1cd43b069f03219cc2a9fc532004690d15dbbcd86405194d3b13b5d24f9f1ce5612d6d2795d17ebd593d6c92cfe881b3fe99ba593555c9375ed190d3c3c820bce1e556b66743b41941ced6e85219a74842e8d88c1490be951bd7a717758c96922d70ba2b69f65c10fae2bdbc4d04642a816d99e9784243f6f0aa8b15cb68b9159273fa0f3455f16502fd9397175522db488c60e9d6e6f3cd5bae9f673bc932b7bf5388ca4cdefe65f893faf147787dfaf6b9d015b6fb6898db7866845d3a8de91283f8f52a1deda42a2a566363eadfda1a9a79e5af0bfcd9fe7c72e59639152a1aa9cd18428f399036453855e328c329329290e215753b11134f37137d51730b6629779c2caf8ccaab5903515bbeb238bd36e78380e3added855458688f0220d53878b095efb31a3d7fa69ee241947b948fbd05287b3cf83bc1300c73fb1ac90814869d83ffee2cc6a9dbe74d2c4de0b3455ddc780821aa01d2d0b4e08026d456de0a6916626fa94c1b7839dee4dffbf2dd9727b01cb09d499f7c793885f0e8c87e4c3bd681ff3ad8bdc4bb1ed11273583fb30b591eb2761a107b8302743eae64dd943c4ac2658771770996945badf0ed54f9b2fa78f0e07d0d17f9c6b4d9ce34e12a93fa8e6b371f318df1c9eb7a1cba02b0441b912f81787e96030dad89ef4073556a6e4ed7f2ead39af543e73f9cc63222e844d13a01164b41cb5dc715b98e7c5fe62f687262db4576c98cb9c51b1acd95c7fea0d8095c5d6076416a47d629e28e31c446042df96f69972cc7d43fbcb95209d066d041549a3b2f3efee5eb168f2b73b54e55fb4d39bd84a97b34b0b6e0a1d5438beb5005eb191cdeebb8a35e697dd38bea2c75dd8cb8ba8d3cac171028c953de77f1df77384465a89988a30a5ace7acd815242b34ea4615f71051cd07b14ad2993aa95b36a023324711d9622496490037a900bd769c7a0a884076600c0c808ac45dd1bc0679caedbd93e22ac1d893cb53fac784fc36aa0efdc7a9ea7df2e8ff0f65418a6195afd543ab5efb2c082a66c376e302546d489bce1266bcebf8e677c0fd5356e67834917fd48a63b199af7afcaa0dc61d94f8298fbd3767c4a30bbd8f6291a1f3861b9ad88c0ef5010185707600823096321b309924867b9675bb18d15186ec1763a769d45e471f88d43edfb6170ae27ce9345990e4ee58dfe597122d369d95d0857a76f9a7ed53b7865e213359e25c201ed60d0d7ad9801f870241f97e605f9d60075acf154c221b9c45dd7455a2ee3e4772b35552d291c3be9f20dcb5597a0c87c08dbb130e1b339a887d0f76e74915f79cf50f19540e7b00c0272d67f3a57c615878442d8daf8de5b8885b4a09dd45a3a74a911af84683f207dd9202c9428b8111a300c1454f89124877ee5ba52b4bd0340c91f419ea9d16f8ac711234d1a86b9eb6577aef8bc3b4aac44f0823a3a701c5e37811435b24c3f52c6112e0e3518551faeeb6c6d4bc216215e3fc1fe6d5bcdf47ba1f0f2899ad9fd5d88137f82562de190d0185bae10d00b54383e4556675e2b1ee59d7d38a185b215de9b4708298857958e786ceb0bc095af45c3b8fb7a162aa7b7e27dc74b8a99747b8e0ed077b0a9448d55460c9d2de4f6cd16ff667d3e1a9e7e889b3c7e32db04c7b47ee02aeb002535769118ad6123b13800c19f591e228ba1587ea124c3a04d2bd53d42288284c1efa5f61822a27869ed49a6acf4fe6bf78a17cefd24860fd60db8f3fe5bbd5c9f21a81c13e6390ba456b9589738261c6aa090355966c35127d626491aa9e3b1483548ad11e06e05edda187c680cdd5e6a4b8a59bcd2c28dc8efe7e6a0fc3eaa42914d4e1bf8888ec9e12dbd25576d5981f3cce22e50caec42bec374973b1470179f7fa93716d1cdc2d3c1c0d8031c3436001f79b8c824961bad8298084eae2a4ec5a66670228feb5f199c3088f7331811da4bc6602219b2de23ebfcfa1c5401706d892dcb040b10281986b33e1bf92c9bea18703046ef691088c748758f4d1d04fef1a452a58d62a63c47f10157b8995b964e20301ceee23b43de24828ee3a592e0a6760ceb5c0c60eaa694d993b686da47b47d678d6046e6bef83627025cc1a37a704901bfc234df8c6d41ceb73d1c9e661330dd7f8bbc9a60dd296ed1019bbe3617c63a0a0503a98862a2e9ab9382315933e09adbb96dde9154a35fe41a586b7b6294beb26ea048484e5f315700e11b8adc36a78a30803ab9274c0123ef2332b21a5b95a145334432f820afa4ce61e25fd6d90b73381e36401cce5c76c7229c4107c5c8bdd2e623b02a8c697843291042e873ce7d1b6f5b8ffcce78c6ec7d3091f1785ef05cdf6f29aa4b69bda9622c9adca9f9921f9a300c8ef75ef9a45d760aa01c5f202d46af054106b7594633bfcf782592998ec83e209cee15f938eaf714dc5ad4378b446cabb765593663c55049858fa479ae200b33ec5ea5acf04b3a186cdac41cbf012d85d40f593a4740676fca8e341cc8cb21ae48ed17fc13a9c87c194337b711a47afa60adbe4f3ccb8dab11cb4c6923f008f7764372d0eb2b27aaab3d35f0c855db7222e6915c888e486420eef34809b846783e09be0fbefae108ea72c7af2e3ed955e363d94874b22303c09e32a1c04b65986ae703a3d53d7e009d87f4dc8984fb0c6bcb9efd485fa3eeb983105c91d0edbec0844a73781d84f98e27c55f2252cafd82c7e9624cbc528ed3469562c46f64540a899a67eec27d5b83f8402041cecd91f0ffc15fc8f2b74bd68fc999a15254c10e9dfc678153f08d45a26f082e208c307c1a2edc03285a8e8905b5ea709e446d9569775b77f866f99cce5afd30718f43f0c138c14687c4bdb551603d787ebdc06695132b19db66064f2408e890e95f30129be8f6d9377c42221bd27b021846224bc8d8c0af21781c284b81b297af8361ab514564045f0a83980a148a569467fb0aaacf0081f524a3edeccd418aec833c828a57f10f28f7eadfc62d54bc1ba8b36ce4ffd4d67df30367aef57fb4c7e82b61ef278641b9caddbef825c07cd592b2391e7124f8e16ca55e3a00535c6938950e27bc0ce33b0bc6ff4805b5dde9ac6039ff2bd92d4a18ef9a37f6a4c9f9fee252db1f693dd5430c685dd41d287f7e26333037d9bee07d4ae24edf5c44a0bf79f5b3568797b0f917c2e09adfa6c1916af1599d0ef3ca251fff27c462158605c4bf566b4c39f3b54fd4785fe39cd56c953921635f133198d4ba69ac9e84d2572a786d65a26ac7ff1c68ce2c1155e39810d43093b3683c5cd3d9bca0f8d9ad3e13e79f4d70745460e64489085118149b428a2f34f43814fb8224caa7585b3e41e7d5952a9e9dc15f153152fc8b2c8fff9222c64f09cce0fd4b6538c9a653aee80f0af704132e378511f7d10fa7da7d4b6a669cebda6cc9e89562b10eca0924bbf14e6ce4b96edd58425ead498d6a0608311c5a104f5ff746c7e4db7facc5c943f6699cd177a7dc62112e8fb2252451bd4e0da7c650ef919e4bb35e2335cfc407862230d3351f5b2be42e1e53584f87f22b012c16c562bf798897e3034b6e3e8f0a42d0f2db208339242703330c35cf302fc091079601ab5ee6581225d7ec5f64e892233752f07b163ae2e55a2a1c52fdc2117da2ab147ad5cdbd9293c28f4e0d8ad7d2a980d76c4a8c246dd19b4d38e44cbd98eeece35766a5900c55f2a0341256dc84504e1f7e5b84b8439f4510a86a358d8bf342b5689ad6972771516638fcb668e235a40ed8d389650ecc12adca19e646feb993d4d5f8c89b8cf1c62b83521142945f6beea33a02f27661e96bc778c5b39849c986c709e463e2dc38353c9ccf3341d68905061659282565b193c70f3b9b02aaca14665390b9d23b91ce8c63570391a3e89c2af1f5cfc0e0546df167b1c5e4e480c6d96035630415b83c9b2d137a2ecd6efa37523eaff2dbb9416e078dfae400d1e349b83c2a1f7295c790856a5fbd5c056954c29c8f605cc85766773802ad05a7b5dde10bd6cc5b10b994f0c47ce959942fa9c87738b56e69f600401ba5e5fbe982be650c2fb2d61158cef8899757cb03955fec37739716846864e99dab35ea7f9313cca6fc7aee80ee67242279b2ba3ae39eb64406af5e01f3bbfa25db44db5030059c4007cba845c186fc MD = 0310e51ec82c5fbb0d8a3a3e520a7a0f77504e0d4744f36b4d87e9cd9222056f45b591ff4f0b752cf642cf5859ce2682 Len = 42208 Msg = 65c656bcb7edc6f994dab6479a4258193a5d4e9cbfe2ca4b8b32f4bea4d38cc27021d0afbd40a0f60455e0faeff61e2118df742a14e6b0c1b031b3507aa6171984a3158264efa5af7ff1e6568820c1cf43bbc96b8fba6607a30433e198e2a4aa28b4ecdcb5e31e4d8c1692056ca98a4c425b150837463446ec153c1704717b9de4bc1e65b60252f7b42caaaca377c1c09d2520a8147362a614ca969ac839e41b402374c671358bd67e9bf7f63674ae53dd83b2f42f27374ea28d0813ec24274cc551b3a7ee650f1272cc41882c86982b89dc92948f4bfc671ec55b2a76198b57faafa6af347828d21825500d8d97c9732997892f3cc8fa1811d9578670ff596467a314874b581b3ef90feb2b618e8751461e5f6d3f84768a0233c4d0e1c0da9d9596c4d73beb33809cf3dc8ab1531bed67d8dcf89f69bbe4793a6aafd24353280bf17f460c1bb7bd8937e9d384cecd70142dc775645e104ffe5611cc4a700f2d511a0d7cc7ceee204945dbaee3e7e402d585ea8f974abcf31aef80ce512f55d5f07b362274ee21ce638379c2d586aaca33480bec3f1708f7546d805eef686c476f7ac2e0196299f25f5b8db8629365f1b5def33464ac3c843539d9242d039dac5681785dc0129bb2c634dd3792f65e9ee4b06a100ef1a0c144b953c712e8302c2ef7214270e672361f7533e86e97ddfa4624382846ce7bd70956b5f0a7006dee7e44853632c665a7f2885573fd5e292d65a32423132b17ed0c78c946f3319b1bcecf6ce20d9abb2dc8d40b7f48348c5ec996f7a97ef0ba2cd6885572fe6404daa7029eed094abdef27c11fb455ff4cb6f86379648e05adbceeec221bd082ee548f44e2002ebeb3169ab757bc2ea9b25c7c7472f94b5238c4dc0ef8ea7271a2b110fe02c385dfe5c9a61e7d3cdb180678dd2faa13bdc0a26c29559f87eb1b6818b296c4dd15939a31d55e57df62369034a1fee958ed3535de5c28de99436687b1fc75f1f7e6c31b76aedfae4acde997b65248f670e29a373ffdf17ec8823c49a5760351b80158b1bfb90a4928241b652677749a04a4d8f1ba941748beb184f41ca8a8abc96d38a2347f45f21f6db340ad99ec9dbc3cd5ab74aa020120d826d13d1bcdc8d1324d36ff87f96fd7b29971733f17c73fb17bad98c6197499fd09283156d87179597db745598f89fafab5409ff15ddf360bb13e4c71c668cf2a174120e1336c69e9b26b317e6d082d4eeff4593826af48535ea7b83271a46a6637633145448148ead39ce87dfdb41ab52fd7cb9adafd1e906c31069180f113ba51d88c09757abf65c89095dea65569375d2f1aa1e1925fcac2215b165c17722c4ee65ab52d1e7560798f5e2acfb2c2dc614571d5a436b40948c2e24a6dde2ec714d6c3d2d33413e6cee36be8e294cbad2361f6bd89b0c556e65bc0b41b0eef908cf0eee7d18540fcafd3e5a046c32fb18bcbd1e1f9ca39b8843320ddcf6e5f919e7b047c8ed9a5ac04a6f4db630794f082ca2bc95d4ab9380a93284befc724d133c12c1972f7e9fdb5a5bf1fa128a373eea72cfe1bf9ecdd60c30088e5e1e65831088f47e5a9b5f8aa186ff768ed0341b9abfb079d9f7baf6f0bd11c17844e2f8299548d4fb5b1a3cb472be8201f5c62c91bc16c49040db61db3c38def78035d0cbca47418e4840801791c7c318658df0842a5b689ef4bfb5302fd65d384aeeab9b8a783a8fed72f32f76a3a03ea9dbf5c67d06cc42adc85fa41a82b2d72f7df6fd7844268cb511e470a3caafe13d30aafd16916617b6a5cf8b9eb6864088543185f6439be139bdf29f8ba558bc9a3c9e8c9993ccaab9a8937afefa3e00f011e9b996ef1139d5c7abe090ec210d3b503ef978867668216139d6edb64094e1278e0cdcbf1d0323df5f0875d79f7fab0c0ac835d1e9dc78602143dd834478f615acf43a2c15b9ae65aa6b8d203a6063c0807d541ead744915f83630e99029896cb50421cea1e9dfeb1c8e692e787bf02e4e8d45b527cbfe031d129a41da23258d44b1361f37f022e003d57c8ad00ecaa5b37c9d4def4011b80e8d7c3488f254f7ca8ff9864e8931d51ef539ade7b57dc76dcfcd316a8d2e954afb592a1313924cb4f4ceac6c01673abc52430015fc63f3cbfb58183fef9f2b60e0a3ab0f1367fc928427e9f6f54da17a711b39e14027bb5c83c05ac5f40dfaded20e2fd35e3077f1c2b7d7a5d15f89b7d614b3e02d339e9e0d88819346d5842343db311660965f4114d0edcf22175422f5d1f68910021e1edd33253e349047ccbaad573ed704130f0f25a4f963ffa11a64d58a42953daa4d8732ae1d69c8c639baf6fab30e0413ca260885ab1392f12c8791d7a32920d3a8a01994b732e97ff8a93a9429921101f0edfc186abd5bb4c7e289773148661aceac4a61a24c6ce5981a0acbf8ffa54e11bb92d59ecdc47c7b1a3ee1637f77f01df067ad5502ed978691ca0aa7935b68bb334f35ddc157a8c473349eb03ad0e41530d3c045e2c5f642850ad8cc198dd24bd9a3c1ae34afda22a1ed07be16fb7742d231530b8890826a884f9ebceec72b420312f176a41771140acad4d370622a3558e2de0c50c7ec5cf00af5208f81c44c642f5dcd7c391e2732705ea6e3bf6d6b296ab9ced7f6649870bf546d78684da9614b5f19498f31ca9d503d8efd4db132e85b8ec98a86bbbb7eef351a35c518178f198df078844c7cc00cca121997b64b0a17b592e51332247f2d3fad4432c3e541fc62d9a5b2cecc3ee8bcc6b547bd021341d6a174066861e5cbac9d203bd1b12e76663b4d8559176e766e237cb865f6784c5a8bc3eadef2677d2470664ab1f9b91a009bcc964c1cd35856aecc7421a6bda9c998312b066468a43fbd62e9f52d5659ea81cf40481b01f11ecf1105708157dcac7d58616f266dc356eab2840bda9ab85c73b21dbdb07ec32f1b06e6e324eb776ba1b60879c6eb6cf26ee1c3767ffaa80ef811a91d6bae50f0090a92f9efccec8f8bb69ad6b476039ad05d02b59c0abb4a756a6cf7ab152d1a1f9884156080be90b1f692d67d7229c8b5a0cc599d2f64c77228c3dd0d57b9f5c53d54d625bb6017bad28b29807442046539aad311fd36ee74d9582df0ca7a2ba0756fac8dc1737cecf6de207c00dec685a418a288e8a43803f8946b03f1f02427bd4f1927275b48eec0165bbe8c72979d6c804870662f2c961303349572ce67d1816d9c8071aa0426bade4bc68b8feff2ff8c45571a4a34b1951efb43a1476f146e65b70824c2273b637071329289484cc99729ab699808cd0b622f9d21fdc286e0a1f94ca5462a8346775c71261128f1773b65fbd86ae16ef25751e05973daaf64bcc3bc97a89694d07d7e00aaaa1a9774d36ab6eb65871dc678f2dbdc2c4fd48710a6e6605bf3f69ddd467fb4a695854f09d86b170a42301441a2de1ea96abca448334893f2bb0f0b31563cc8a9127172591f86efbbab6c583bb275955de3ce68cdc951a6ef6464a4f41dc65b2429b26b2ba0a8da0c3b28fee1c220d4bc2360310c09902db4789e07901daae0aa33eea5fc2c3f6a7e79dc94be526e5166a238899d54927ce470018fbfd668fd9dd97cbf64e2c91584d01da63be3cc9fdff8adfefc3ac728e1e335b9cdc87f069172e323d094b47fa1e652afe4d6aa147a9f46fda33cacb65f3aa12234746b9007a8c85fe982afed7815221e43dba553d8fe8a022cdac1b99eeeea359e5a9d2e72e382dffa6d19f359f4f27dc3434cd27daeeda8e38594873398678065fbb23665aba9309d946135da0e4a4afdadff14db18e85e71dd93c3bf9faf7f25c8194c4269b1ee3d9934097ab990025d9c3aaf63d5109f52335dd3959d38ae485050e4bbb6235574fc0102be8f7a306d6e8de6ba6becf80f37415b57f9898a5824e77414197422be3d36a608085f51a7c5776f5135e3d50349ecbf693d189fefa64b9efdfc3ac283cd6357f9bcb5f2970175bdaacb7bc2c8fbce745be06c4b49550ba9dbe6ddb1603d05bd0605247fa5d3073629b53b5deacd550ea27c0b392fc196493061d37bddfcac39bf8a11656e9aba8d705ba8e2c32f1f02df886bd5fd7c79d18de5b28e479cb55288b413505bc8fe17f1572b1dfca18ae5556e14ae2cd634f756eb0165578dbf9be40b80acf7fe406a4f00584bf1b5372ac6b58c2e487f361f3dfa369d6850297a73f90ff7cdab2fe8cc1fb7193cea924785f738e2dad82bbd859bd893048491729b1507bd37402b37faedade258a23ad025aba1485e615456c0384de2b68b7618dbe81e69df6db0cc7df2c353bf8c8f39283b6bdb4dab6e7f90682d18e8e555e1b8daaa7a20746f1ab7d78dd9ebfa0df7002eef181326c89c58a3fc823612af41a475328aa504a4a72b0473e1688b359e300ea19b696401319b6422cb08a3e0cd41305d07d79efff659f20c06afb0a4a34a5339b19ad386d3db21366feb0998f8f1a4607e2293df9cc738bcb64bfac98ac1850e173205f7f79a73adcd57c44639483a135a3083d1eef5310c7ca7da12d9182c9518b96ba3215bd3ff8fc9646722b779bc286bff6571568381c65dcf2ef2b0a27552bb8536c581bab213da5a7a29b1ebe1754f6708d87da8a32fd85a6c8c4d9f154192e31168cea06be5e516fdd2e9f919ad454b4a68ed08f725a1fc59fa216afb61e9f5c19f751d6392844a70a2a239cb4d082c98c7072cd424353585b0eeaeae202b4dd5be179a5f963235711d8d168cd0e28b72575e9ce0b81c965e6507d28428d14bbc69489fa66d79985da80d27c4e58ed875be75d1a36dd28f727b0f6f43d8767fe4157aa5ee84b4c3b4c6a4d609d747940140cf537291c191306767dd33bb757afb3710458e789e48051dd6b9d242a75ea3a2edaaf4e0943c36be93c4fa4e68ad4062bbe70cb570a5dd02354ba4a44898eb493340a0c6b4f0e3e5258efe1dca87821cd012efc7e66d8b2822f3f76885c336a832aceca09e4fd67f9fc3b58615aa0ec9ff41be3c69ffcdd4324b512c097e14448e485f2acab96cf264ebc723d48564fe8c0bee6f65dce3aad5da385b2e1a02a298bb6eb1c4be35c2176f9973719a132f28c9f6ed84a58b10aff913727e379046d47ea1d216decf7319d7b3019758a7d038147e4320ca12ba0350790e64573ba5d3fa8f083b9b889a0ebc8a3a906171864c73daecd4bb18eb9258ef8b9ae9734419c78cc09d64ff8b4876a5ab07152eb5d85093671b091c49bf7add766c6ec5b6185e2197d6db92eb69ae9bbf56143df35e334e2e5e248b38ed4ed95b6367a1504236f3fa525fe11ed4bcb30427cf1da360a451cf38ade45dce4d59a71a6494b739ea6a649a7278ba3c39a205d6a64c5a622c44b61505c60cb4eed4e5fbd62e6f71d10b6339b3c831e29ddf30fd4a489ce523ad6f8dbc9eea53bbd1a4724ccccd6c833d82aa743e0a8a61d102062ba0cf6c32e2780d42dd6b0d2ce64f3838fe758c89972f576468c8762e1e158bbad38669d28a5c1e29000353ca7952981b41dc745caee5dae4c6e0384b1cd7f8885f46507b0b883aefb547ba0d016b2c6415869664db22af85e6e6635153c5c704a273c294fc88de075bacc27d24e56fb417f8854a92824fb8374f69c9696b81c05bb342c8c3da81f071a6ef834a4dcc8b97a6a3769b61260c368fde2bb445b33be979338f0809c13b85caa3d7e820ed4b331573612c6bece2632c12e0dac0d5e7ba3a17402f731659068c81b394fb2c8368c99792ebfeeeeb5bb8ba91337964546c7a8094a0b2ebd972610bcec72914b4b73772944096b6877e9a27a554dbd8f26ebee1f50245dc2d67fca481f557306f9ce386edd0cfde375a550cb5b574be524f7bcdc9dab841d54593de65a5f20a04885256f802f6b07b5d8dbc1aebb09ee46d35a6bb8066c76199eb2bf26f85fc240808655b5dd7f7d41688c86d5e3bc53966810f2299fdd732e3471fb0a88f914eaa7a347057bffed213fab4258352fbb1c9c269a79dd9fbf9a05c2c18f77b73d4de3c36ef672b4fe5b43801cc01b29cfdf58e38a2f27790065f7ed393b2e5fe6711a2ff2122a6659f95e523d93fc7137e78591ebd3e734df98f4398d9913b9b65f3530fae10bdda602776bcd5c40d09a3c0976e4ed8498033ae3f0e22e8f8f561e1d0caeea7ee08c7f7511f3a04e0ea0e7ceda9e06666d1553ab5863840ba76db6b80b37b5e939b377428dd7e990f3f2efba0740a5f57bbcec36b93522edcaa430f077bdcab5aec4f2c527a2be6d46385cb744f353998aa10b6b5d83909ec0a393ac9667b24b0867f9e6267ca84dd11936acd8df97ba616bbb328b7357875111e7d4b25ef4110e43928dd48c2e985a3e86800c2bf9c0c9c301738a2dfe0f4597354f11ca18718a01c8a277fbd8b7aa4f541d280001138a51e716a3da0d9d63dc8407fbd2a6d24248a00d58f02e1089f3a66a7485381b6cbc74041ea20c9b7489dce3ba9e279c00c124b6bf94b90cbfd2864f37e3254037adb02343ac8470404545cb955723368a145b86f30f00131395fbb4bb4151ebb2cba45c5921fd848fb9c8a7d325200aa8e84d633e888b8e4ee40d8146c84282a6bf5798aa28fd3f298c6c5fbd2fa87f24e50336e627e3e33866c59e219f826fdb30d1bd7cea0e09d6673adc9b9e42fdc5b484e834168f7c99c42af494f0991819c71bb4188fb74a5df23804b59977ec52fdd85f707a17bf39a64569e6e00de7282c3c66c63e816a87d470c05249cdb594670885e27e0416e0b21ce661996842cf063cbace1ff2d11cb6eaf9bbd6cebe539b1b41d247dde85593ba544b433193d7fd2497775b94e7e43fad95396702705641197a87002a9d61ef2499ed05f14109bafbe70a1aef15a618c17e1224f03367000b1a4acf749dcc6f649f8f082fb42be5c991cf8389c12ce82e9a8e3620704c80f80863dc414f5eba804c797473540526977d0ebfec553c58fcd3f7c51a8dce6ae82c1a501c1dde79838af270468961236c930ff5a0379f10340f93f867f4b566e36eb6538a6e1653724043242ebb058750bb194e2bd11db7de38acf88e0bc91bf2b6810c15abccf15756b5b9b552baf84bdd76f217897df5003588ed173cd2321cecc1a4443ac9fa39b38e5763b6481e66e16c08ecc98974a4ee6ffe8bee97526af8bf439f84d51721411625bf4f77a3a8af44b930f807d9d14bab537088e124e2c2c30faff1b7f016e7974c51860f2c1a2f462c6d7dc0cf90348315517478508f331533fbea392c208d57f4a1c1d764c24ab98a2ac27cfce8913e6cb319247d7631fcd50cd52173471b9f43386998f0aae6e7faf02e0208e14a257f20dfad53a1a5c21e681b386f947ab7649de71a7bdaec16a546291c9c834780771f2eda7c1778ad35992546c60e90e77d58a125ab58458fb2b41b9060d771977b396e749de0900642275a1320be4677b7f2018128 MD = f2df4b7af9ca9da652b5027a6a68ed91022eda553d72f61e2abd9ab46038be92141d3b3dac6c0e2f87db9350019d9f1a Len = 43000 Msg = 24d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f85f27a673f4e0dfae679689456b6542eaf6e2126ef78df9ac797d114a7441e6d1caecaeb5b00e5ad1ee20249ae42ebb34154936187d74cac809b3a7a9040081ad540d96fb8308251c242f630b20f01facc933a3f73793394fa99f235b8c0a5ee5aaf913b7d664cae7da22c9187a4ffcdf634fc0adce6fa18de9ce08d464c5db05303d996d32aab8bf4098cb458894bf2673ec308e9a40b01d4a9eccc626c982a674598cae20507b1d27ffee04b474f31c8b97683c33dcc1683cafe3836a9be223f7cb81dd17ec8e9bd0c6a5e88657254c1aefdc19139a7219406fe1be78a376183b020d8c91e56f95db9b877386b1b21f924400b7c1e03e8ae66d4bba0986bafdae9b842f16b19a95c8dd07083e1b462192326a8ac7647357af069618759c3d3ec3068a572ef7ac35f919a949050a4ddc8b399e248c8ddcea0aea354c457a597628c18477332df0d11cbff2a8840535bafdd81ff799d2c7bc7a86bde801a7ac1e406b0721dbbb1511745e579923729a376a8c448667c9c0697e5aa45e328ab1a19a5186c981259551c0736cad7bf8e7fc41d4b0538ed9535ba6d46d2140b9e6aaa71397d0bbf3de2c617d8657f5feab54142fe7e16787fd2d54829cd3c4bbd793e72f9ef9e4ac7bfbd7fb592b1a0a50e9621c5fa29a6c2a3937f397e826e6f0e7eb141087b3c5eb6aa47b399950827526bc289c398fec6719918602c0ffe1bf31235fa12c71d698d3575bcc15421d849672b301f8c09f403921e84210a832beea1060a53ad73520d0513b754167321ba3366a4572d4db22324968fa39c8306c8d32d5b1453c880fec3288b980284686f777bcbb2a2546997f78a68fbed88144952b1d39ce1a35b2816bd22d641df162eda708f7a14a68228b401f7712419bd38c39a5c35808d4b52a7d96355fa0994c0044fd7f5aac9639e0304244c6abf695ed1f1dd25580db8461e84365f568b49ed9e208a6d8d4776c18b9ad7d6e600808422bd3db590ab0aca22c6833a7dee9c7c50e99228e4a82259f5cbf855c1676a705e06662d50efa9a75ba8322f96baf737c1b4d66fd872ce2de89f6f1222798feb2ed43fd5c262fea572312c86ca75c1e49a883e89912fe4060d1f245532c058bc3a30b0f40b8b6f8b0f6a578740a9614c826eb2c03666cbac0c52006618c32bad2921a1d456f26523d9599c7a21dd4137226c1a5af0a0ebe78c41e98cfd0a7184a3b0fabbc92049337908e4a6949ac86d228d5ea0e664ac7f35f2c810091e930a52e4a3f28c9c8184967f1554c2675eb529d667da413a763bb16f863a6386f707dbc585c1c8ee77ded9c518ccd2cc6bd8df511b5028aab1e4a5c0095234ca0743e95b866fa59f9108eae1d656ed51579fed056349c43dc542bceb3ba0a3732a8522af8f464a3639cc70de363a3b7f8bcffbfa280f3c7a1a1d9cfa036cd908c7962ec8898ce03bd6f014c11fbfe3dd6d33b03950e8b9ea183dedf448fdfe11483fb6ae5a8a8e37cf3d7d947b2e0ef46692b5c9c41d6313286a58e2f49c39161446626aec887db18e7b535f31cfe34adfb3b1b26df5617fb06b84cbee91b2a09373d90325ced4317a72402829ea8b693e5f4dfd32badcb61a091bb71e2492362d90c481efa3bc3ffbe9eaf94bc72dd9ec5e31b1fab2fb3ecc0cc2af6c9d01614a63caed31515d6479aaf9d97faef220527804d6af27e7a1303c23b9c04326a852b6944ed31ede275c7b16d1ade602c8d7756f75385fc767ac60e6e0025f2a93ad4fc9acbc5368110d25e9e7bdb88459e21c19947da3c416aa42b3291a3934aac3f6120fd63722a9f2701925976ca059dd36ab3e663a063891a8309ef0196d76fd7517800814357774234f93234a80522f8bcc78db6eb454c95b08466d47fd7ec1937f063a30c803fb0832384a9949cb40e3254cc485f7f3ba23e129770a0b4a7817f3aa54d504d6f0e56b1cf2a3264d78065dc109c8f69cccc76450f7acbf638bca1a733f491177b983a14704ae3d5f3fbc1ddf927fdad7671138c2d673425060749d69e1d4166ec0aa7dc26903b689fdcc0daf47f2ca2cf3c70587faa8bc9961dd239423c03b446c21a69407eaba531affd4381168ef24d8b275a84d9254c7f5cc55fded53aa8024b2c5c5c8aa7146fe1d1b83d62b70467e9a2e2cb67b3361830adbab28d788aa5223825e938d02e911ee89968081761b4d47d81b1ca981ef75605ca6ba92004a5d3d84654fd995c4bc39c77bf5b3292aae801c7e696565fa329380f78dcd37e9adc874e5e6d7546065c87c3a1f08b0fb070ea25c84f70709226ef0a588cf580eaa8cf9e33fcf6544766151d9e4ca3416c1ba11bd55a790a4adb854b892e28942bc51bc694209f0f855cdee622e3fdc04454a11a9c4bd28533b385339954cf20c4bde657ed7cc1e056cd4fadce4b1d14cfa864c29b980f69f34b7962f7856bdf4bffc9b2be66216f2213d1e50ee663a76473867441c39230f00fdc5a223480f828073067757110147ded201c534a7400a96260d03d531d62c07d2879a7d6a133ff60b4f6a1222078d0a594c439dbb0b914e19e46cccad387cb2fe84207003eeb2898b1e0c00dd4f4b0c9ba6d313ecc293d6d9948aeaf871896748653be45dcb64a2bd1a66078902094e60b87b7e808e96982ec6621559a8db8f7ad2f4bfbed0dba767ec7f106f4750376f2945c4c09624fbe022fe361706f8935a7252ea6f25a102523c5f04d847a62f92a239cef403c467b64f65367bb26ad9b1ee5d4db8f33e1946b10fc90a2a969e8fcb5e8464fcff447af69ffbcdd4b9cb46ed1dd0e06238560bf396494e17a5ec2f4bbcce57aa5bfbf2beb56f55966bd0e3189b5c3199192068abfc6aeb365d823acb5b95173462f2e750ae795a1e0a4f4e17ded7f1c168de26814a162bb045c678f244bfeac39c922053920026941eb25091ee2b6901aefa0d1c873454ade521b1697e36197f9043677069eeff212d60b12fd43ee18272dbe525bbacaf54c6fcacd711e0eb8fc66e824f3c2a2eedc1c1399897faa16b3ce97643ee6684ce6fbd32e506a7aa1cc6793a97129cfa1f613db0743f45f0e5958c881f29491b4368ce0b3b64729c4d19ce57f0f42caddf963cdd6dd5091818032ce260733fbbda3a95ff8033280b4b46d3a104e9c28e57e62689295f2d5f2b10314dafd530adbb6c7cd65c7bb33d3dd5f2e078f946e4acdc637c50e8990e47440391b456023a0f86e9577945fa7b4c4e92dbf72ca0f809fd5b7e8b75356c93260a7616fe9ea8fe11464b7c98e50ca03a1a5b278bb81294d377578210e9c3383eafc47ed5ec3faf94fa7a107d5c3a6021f428b01d767975e51dcedcc09d595d14584293e4d4494b976dacdbfb474bb589870a3bebc377d5bbb6ad418e39782b316fb9fe323f0cf9a207a9851a8e88c6fc3bc970fb8552dcdeabba5b80a566ca1c5af166c713d1e23e3038b7e21a39bc01782cf657a653b1d562becfa1c96b615d83b274ac3ae02df25023195cd1a6be21a6fc76070cc27d28458048f68dd1187d50c4d0e89a810347cf30528f9c16f5e22d019711a1e76760bbca6c89dade18032bee21831dfc8cc415280b8464d388cf7603027f4b0998042b62e36196dc89777bf90f86aa98eff18ad2eb410f23a06de7ca5e59f472379cff115686ab119362a7ae44f8289f555697f89bd0864f6546e91d54a583686db09e9f6d01ffc65c4a19d265e18157e57ca260c239b29efee1e5c68c6de03462c970d4cfd97c420fba38301d4a9c09c8ea15d309827a5a94c6418badb8f31e3d6edd78251609cfd2376c8f113a61fc2528561918b5c5c94e7e6735608fa46d27284d5216c18db3cd4b1db6ecb9b87a25bfcffa96d97d355590bd8c4cf9db6b477e282b4be0f2372a7db36e54cf89c9f036e63e2bf789e4d084ad571afe805ec6f8d6cb6b7e1fa30e55967ff185bc32ad1505ac8016d11fe8e39d6071a67b8fcb1ebffa1fa0fc3fa35c2fb16de239fd85e5930e3d3e3d2dc533f76dfafab4467f794c800f5071521119e4cc6deee8729f2cf82a0a77b5588eff22475c0113cb0990e324e295662680151e979cb2b2d924759bc88dca21e66ccc86b640c3816592ebeeaf4178c30117d646db9f357d793b45e6b2713e692086248b814e49e45d4213d3ead3ff702cfee6c2602180339b0d2640af5cdc754e058e99722d9a26fb408ffc9a413455ef5ecdfceec899ba87c19f1186f7ab2db81093184f86be2d87b5e7cf8a321f5b915f115a4d3c8afc858039c200e9b37aa5d0b970e100bee349c8a4b6814fc7685c283c4644265bdfdd727ab9e5dafc425f6c8b09f044a12e89a24d184640346596e2d6279d2e124dd6beec5ffd748f6f2c0d8e4c44f96ff88e6a6a5ca2ac6e3b88b465651efbb92db98d171c0f5c73e755db4c9fa4c83128a14984ec5d3b7ed07ac7736890365766ce068259e53db09421fd4c6bd959eea60a67222f3f966b0eb4428797ba86f5e25d52b57c45bd4f5cda9c1619ac53ae5a11ebcc8d10653ddc7d4e2a5c66949a88ae9838eff8845729c6df330fe25f792cfefe0a6e974ffc211f13e21e5a084e4009019418c63bd0e22fef2ab74624580418c7653a9dfdb1c7e0b83a465f8919f2b5b55061768ac26f5bf383789f4b52caa86f6459ea1764b50966b73a3dbf0486fbdbf431d21836b89314c7b9b47b7066f61d903446441bd3e144e363bc5316e5239b08efa08e33a41e7a7de44e5db9c04afa6f31792ce009b27b4529a4ed58f5751e1505a993c21d464c2d60359835c0ec2e8bb94a78ba3fc23265f5bc34d09f388ca3dab5d0ea0b51b35f9531d5ec4f23e06c3582d0b25d5b92cc2dcdd188ccb60d38d68cedb35488d69ceb0abce7533938980be9dbce4bc3c3013b9f6b886235c75e61f59125e133de6bca87f42db5745f99a5474218f142ec8c85faabd64bfee59ce3b964499a9af2559a7226c65e1d7df76964ac98382235f675a6397c6d598d7ac4a0102667043be1c391f9bb357bb938c108c25506a9c7c6716abc82b28de8816c723ac431bbe097adad161321d83ce614fa2c574521ca84e310ddee00e41d3844f78c2cde050affc08d24d60c7a2e88c90391a6dbd065b9325e43ca41a45428b2f7ae65582be1a265fbcc0cddaab6a74aeb9a4bb2ffc1ecc61d961e5c16b7d71f39487785748c0702bdb6be7cb0fccafe7aee4db0f506a5071480f039826bcff486016b4f2a34b6019c89f4d0d429794d7736b4bffc5b6c5d0da74ac0309b9897a681489d930038c860eeb4c35e653d9fac1988c65ae8ca30ceb333d9676db87261711656f91914c1d18c083c95d79c5cdf40d2ac58d646e8214db46c7109b9eb7f79de64a2a6d252b60cf724c3a820ecd9529a5b3e4d69edcc1dd3619498236cc740a7aed7d0fbe5d91589612eff51b862f8e6ba5474b9a797ca9aa019427c5c026f791cdfbf16e10050c7dc1e05b62642dac0b1e174c07f4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222 MD = 2b73f1ea458d69bd87d55e2c055936222a83d927d4c4b1b059259633ab0b14d0ac62ddc4d04d6a6d2c878b0fa1b53fbf Len = 43792 Msg = 64c756b6dd40859a1a0fc128f33f3dd0e4efebce0e47a0b77eb17352b24566aa598448615b4ad94719fe302bf60c5af2169544e66665da50dc25714800d162ccab6df8100ef48d15f792ef7d5012099ee89abfd57796191cdcf2a4dfa88c150ce0e9306aff27e82b3b32c8c4093b91fce366254349c3a3460680d4c0b45dc693825fb61735c933b26d4881a92a6e3c358e613ddae5d5c2f4e237c8932b2bbc88193953c0b8c3b7d1163be3d3ba93507172f4d13f52b2bb4ff9804aff16e040142bdecf0d91feb9b1bd73b6ebc19116d71585a71d9844d97ed2c120ac7c639a5f42b6f2a5c7618479ea58c2984852d690017e891ac07163a9f5631343659c1290e529843162d35f522552ce8355bdd8c3be453dded023a0faebcfeb6cda73f0d09d9f4c586b3e9164f7c9a453f3ba6399d2448b12d341d9973b6c70cee1d07b46f08013c3e98963d6e7250ab12731c03ac7e13d5eceb357a86da16a12859bfc1b6834a119e49c1dd17ecec945fb0a38cd25861969cb615f560ad8a0dfcbbcbb768d23be03655f077c422ca9b6762d117b729ae9dcd1333cc89978dbdebd1b0080e6b6322972ba6800bda771ada083936b3885735ee9113428a2e9e3b762a11360fb53c43216958a8477a8ebd182f208c6feae80981ae3919bad928011c2343b3f54643ec756d8b331f795ddcb2363b6b34d7fd7326c91994b43dd7a94e6bdc2457a4f668f3c6b2c2fc5d810428cbfe65bac5f42d3e7039560eb3198e9d525ee99f47e0533cf363da569d74cdfc3ece1e5a3b687239421cc022ef6a3b8975208644a57e25a17212dbb6bfc584ad2d4ec7abaed6fcc7ad48857939564a8352e57cd0544c7ad1d15469b54aefe2ac05d52427a6ac273a1020f8aa274a062b6a025fdacab7ad3e8f8ce6aac540427967159646a9648c31294abc1e3fc228e228fb81cc7f6c47580b40e53f95833ea5bf74b0913d9c861d473a124df95b1d382e55a51de8c6d3bee2f4e7cc521531b17d76e58fb9c0cf8ef853cdd1da814d9dd8950c47ad53dcc3953d60d97172c62d3f90b7aac45da2e6cb4c311259b14493b63e59e2239fcd16906ed2ff8a2856596456996ae3efbab52e77deb80d879cba45b60075f2071f18732dc096f2a28cf68a3d2d587ed3718a906b390b5c50b0621590826b8f265d59abeecc58417db4651fb8c5fc1bc551d7af8ae2b4ccc91a3b9452724b517a025aa926288bfd167725a35e05be3121f61cca7b3e2ce54d54975070328def8ea88c096897da9c094fd8a3916f176565b8da7fa0dddc2c49da15b87e45bbcfb0ba6e2b2a8c9c94d298ceaef764b01f2d24813d90245b086b25376ae14e5d689ca281bce0697a7def0ca803f488e0c4d4c3b192cdc422001dc06cb62daedb40bf0b670d2ec0dccddaf5c5612d3e520cf910ec0dbe1fb9b9de262648c7d9bdfe745f7eba6a253bfb02fed744e6076c4e0686811cf5a99a8c28e1148154618de8791949332709208c13823e0dd376980e89af112ee8e43d0d8a6b87fe37d8c39519c34705f9ef2307692a6a4a5a0e7dc4ff052cd21c7229a47f30212e06a1f79af2e808b13739abe39041fc890e318617d2f334a514b5e8e783d9408f254f725080e20eb3738b33a7157365285472396db223b9064641e34d14c196903853fc5c305bb98b436642d8553924c6b153003cf9013a744578a15bbe7373dfa431de24adbf99b70b2d61edfc0dcbd2c966931c2406397d76fccb89fd8968dbfd7b903045884fb55f73095e666bbaeaf0ff4a71dfbd26807f309a5e3e5df603a893cb0594301c04a4c9b1a020dd826dccbf9ed46890823ba2a6c65f1d7babf53a0ce71b1661bf336f83f369b7cda2d9b11a18ca7b2aed0da5d1a7f2f75ceb1f26696cf7487789b03444370197c6acbd428130ba63e6c754ed53e7b0789c43eff21bd510a6fc0c09878d051e5d530096f5978f2adf4e91cfed7fee2e0d9436e621a6a80dce69c6adddc0d60654fd3ee54ecf8ca239dceccd2ae823b212ff44a0399c6e250b4b4a2bab7232502b1fc836c29ba1a7001c28eb2a1f30e34517fd9cae5f901cfa0af6f1753392824c552cf9d57e76afbe86e6986f779e480078b24a0482a65c27335dadcf678f234517edad0c0a6432e1a796536f93b436d1bc0316b0882948ff5f0eaf1e9080a981e27aceeaa202b705e8c8aaaef62b66353c80a156e2818a0ee85a73e7410f8baf4f64edd5e7dac2a7e4fe1cb2115c2ca7948b784c244795b269f19acdeb845019b93c78724e44ec24069717fd67df10a53eb3ea24c003d2a65e44921712a78d4daa51fd2437d98a16d8342af57c2ca8baa56a9555382ee7472fc3e86738b199d7ad45ea80571122fcd445d44ed0bd5b64534008721f213a0169000c42d06b0c344ca8df0b0e844d42755c924de809bf1ee2b491ffc793518194898c1e7c0c6aefd2cb4928d09b7f9445d8e39724ba3a56be38e052d3fdb4343cb0d67e9e4e2c570a5d975e4fdf204ed05b569f391753b8506d621fc6b8d895bc2679d7a988d7264db0683fdec7d5fe8f5459ea77d9a1904392a5bb025d4522bd4af4ae3044e1da07642a31ffde170fdd446bfd83499a9b026919b9397360679aaec586d52ad2ced1f96bd9458a5a1f64bc1b4cce1fa52517513c9ebe63d0d0eeb26ae5da73208137e08baa22651599a01bc65cbaa467baeceb8cd013d71d0b2406534fe2e6619da3aa380928f6effb09f42ba1fb7048e90d7898f1dc259b52c51b2d2970cd0c70afb6cf8acba83fd01cc589b0f31bcf2bf3b8df7879d7d2546c514706f6cf97b6a6b6d0a37d018ba553108f0e240f70f03a0ccee86f76589c64594f6cf74679bc330ad9f7df8b59e737559a1e10b3b4d24af4f5a63f89a477578394cff4ca491ddf2349dc45be3112541549654bb1314e90f1d2567c7a3c91b070b5b471d38c3805a0bee5520297b313dffb7837704cc1b683e35d78d087580991209ef0fa99b740f397878701044601064edb56898dd8264bb74fe7152b56bd7573f3e49817f80bac62574731fd47a638b1e33b656afe6a99bc8239c08f0a668e1e67df447d96e03bbdb9350de9447dd7a334688c6aa0fdfe61b8d35b28df7f6b8e4f537841004911f841b30d5ea8f273b1534067137c5afa5548565d8f62726e523eb3bbf8c0b0dfa07553a8d3f19e8d6aa455adebccfc1df5b53540392fea26f89aa2780b54a1e544c89978dfcaec951dcc3a995a3f6bc9c183f29bac943125e00792450f38b6d363bff6e5d871672b692f41e1f520248e473910d8603c01dbb6f9f5ab5ae94a2a7bcfee8864a198a0db422de0333bb0ec0549027eea83b6c8dbd65f0394e2e64b0b7cf2d8fab7eba5c299314c9ace8b637a385a07a207da7dcd4130f643b215b5814bb6400140fa9addb8fe6fa2753e85248b89fb2d44e75b09bf1debddd3530a7bb08b662ec92ff07b1607c1d0bc24b182b714d1f2a757e12fa4686cc9d328ba594fe4a3b9bd06673934dffbac0fe879134f8d1488bbc6b09d95c2e19e1df135b88e74916899184f7699d975aaecf45c54c9454b560e9e49e2079ff2d120571d07d09da781e9d019e1b996b843dfc2dbd598ffeef0fc590d8b7e6218f996c4d0c5cae26ebc2bb866d9289a4c0d54fe680442ff67d021818bf87ebbbc7dcdc4d180e1c54f6ddb5bb6eb4b56996de8e1916f6bd65e79faa235b76cff55e451d1cfb7a9b8d22d75147a86a64e38fc0826d88568072b650425ab56ddcf8db3bf660bd8775f9f51858d3239ddf3a32e3f38bdd4bc246717caa65d45558ecc62531c2671ff0bff9089106e8336f9507afa91a1dbfc908a08aa8ebc0148cf9a86d94e900295608b60fc689fe165a1c978d6bc35099dfe1cce405948294c045077ae87e908cedfbb396bd036d2ce8f969e3022e7fc14af97cf1880a21bb3cfb6eb4f4282032fec178033f1d3e5f6351061a3702b21e52773819fbf2a573474162838290b602d0818dc0147f7895114ff49bd0e7ef9a418488c424f717a32a3f6d4f585d5de4ad647b3304d023b83c18bdcd9587401c5d47f55acdbf7e332e1f16803f381ac0db92c9c6d7b848af2ad7e8175087ac8df0e90643bcf2e20a9806e57effc9f77ea332ffe054e1ed6223b2fee3c7923bd3409144e8ba394b12b31e63b260b7fb074d6ca5e845f01db971d18698c34ef6d7966835af8e3cc232c68f17822aab2e41216a44487090dd9c5b5d089d0c63e4813996630102a24e5218818a57244c9915675163679d6737f3287e0d5c6a7a0eba73425647dc13f85af21b429a1843436b664c8bad961d32a6215b1c3ca53b7a688a9494e7e539c7339c85c9b1cc37352c67804382225bd69d8e1dbda5844d3274c7b5a74be5b9c3c35ee8a70608d1753eb218134e08c92cc1b7eb78ffd1593ec772cd17d9a43ef4f3806c62ff96b90d8b8f3a8379110e3bf8e3eed6b35206a448d3036afbe96e63ac493884063d9604fa460f1c6b05d20c2b5b4e5e27d0fd6ede31802a187df117d403759582c41063721ebe658dacbfa543683299c412e5a473d66cde9729701854f44a1bdbf4d031dd606fe745cd7b102650c20df2e2674cee08ee0fe2b3936f1564e0a078957e7622554c28fc32ae55be5b28441a062b7036102e4460e30123fe9d5eabc36fc23b29427ab21ba1017af1d389c6a247d817353655057983633cf6e6edc523494287da72240d08e31b89a9fe1019f46d164ad2c18bdb955960c3e786b57400eca9621d2c70bf2dc0a689cd26e2c776408f10f5fbf74c1c2fa1bfb8c6dd43c3219dd4dab78652f1ff478345912a589288e871862ac2e276cbcd3851ee8eb7d2aec6e6f95c8f4ebb6aa87ef9870e52af0ccc756e9713250cf58d369a46ef5a965bce9f6263b339f5c77182d152b63f3495e125938a139c447789c27b1529b377f25a08fd14199d06df4a98b5394ba68bebcf88de4aeacf871868e3dca5634ade391527b3b6ea01567ad9c68d83f5101bd63fa63721bf463e9fd3a2a53cc6a831faa4066a934dee4d60c9164179db044c1ed9888755ba8acfd57105be237a54d9fbb2ad0bf16beb5358c090b963260a868a4435b42f0522a482eb170fa2a6d63f05e5227f196c80d02b663bdd89fdaa31e329b5a8f7c596236ee8dd800072b7cadfe56fac5377352ca1651f9632896db5f12f1149f5256fb6601161fa87077ee1535b9c7ce7b493cf826244caa7f2da7b7cff5081714b34c4210eaa637d8db3ee27efafd61c4c21219608b362315f7ae94c407a37b25f6db57a86c0a52b2bdf582448b2a13b67678ba5fc734716f8d368289b9853018aa2f03021aca6d90a8987120facc78c2cee7376e98c5f9ee76f61dab8b1bca6f35cdf0e887550cf5239e3b9eba62f57c43d42d27507941351d63a283ecd5ce9c422e9db632389542a77d4e085a7c1e457dd618148ebcdbb618e5ddbd6f41a11227d765e59bf3bb1baccc25184b7657a0c54364b0b40f2e03c2130bb272fde6837f4ee60134f4d2f2bbf15d291de03630b2c2bf8660eeac80d171d8fda8590342b0fbaa939dea714a5d9352c542583e57deca74f005e9fbbfaf68a2196ff19be26564001727131a84fa08a277493cd498a1d12198237f8032b48e13704a45f4e4f52e9306612d335529e7d8a9a31cad75946d31e93a2dde7c994899acb7c4b2cce8a1dfdbec87501d65b741f6d0660d613ef5426dca636aefc63ea12948fc59fcc864532229cff55025ed8ac961a7890dfa1fcf9054beba1eb3c6c6607e6b6f071cfc79539945979fe2f12fabc75fb4be6e2335eb599e508bfa77760cb880468e4ec0defacbb6bb5f35688d18820cf504f3d611f94990a2b9f2c73c6897d994d4e657d0722161e51095ba4f8a222dee74337ee024b524351b454c861e8ce5be7d6c381a744af589467c7cd39b1830e57ea5a43d082cc79c326a6def991823480a58d8095ba8d02c836226a5a5d4b49ea6b2dc650e01092ca1cab1e562ba10b5ee24be29a2bb805339df2e524508376e6ef38e04c0e2578acbee9ee3f5f34c7cab6860e7e4039471dc5c1a55f2f337d949d04f98ab41311b135eab77dd541520c49c46e09a017b2d0d51612d3a561463c9e187ad479e34723a936e2d934d3936cc2906903f35a2d93f67a94475817b82619fcc9f0059c00484153d51825ef7232496f6733e30b9fad50749385f05cbd99373950a60146266a26cbfa054f9fd7a508ebd0621630f2670a8c775316393cdf205676c015eaa0cf8026b8675beaaa0e248b0d5834d40d094d4aa87a72b41e3efbdba204e88f56bf76ea7605f0d9d3b5c8d784dde6fcd8db40378fc2abd849fff0513e3c233d308430a19ea8b7723be21a589eb9d4b23b240cda92f269aaa669293fb12e6dfc1665d7d2971857bfc8dd4295c3b3a5fd1e2ed8bb1ad456341dc6cb2d63a36fd5f0a99306c91d79c863ed69175c9501e6693fcd63902e187d975c01a3bc62d1cfa6998bc49c7fc594f55cb764cf25927304a013595ac9578dfa75f12a24353af3207de8947805e22b64705306862cfdaed799d125e26dbc6d3057c34903e25248479dd1fec57979959a726685e771ed9fcb712f508ee1ee241f4aa089c132c2d601406f8beba131da7da917675cbe084dc6725661c8ef96bab198b071c6ed32a537afeac25245b303f75f8f364cd9f6c0b1e26ee0f75d5c38cc871a897adb49bed233692c622fa718efdaf5791f8b6000750a9e5682f4e7a55a61075946c3b028b812144f8426b31f4c6472b93c9cee16f8320f4ad37ce009426c9e6a906f0febd39414b51ef18222f8432e7d0dd4470924a2e94451bdee6c6cf10843c1a50d10090391e69a59ba28dabf504df9fb14e1e0a153cc647fbad7c0376c6c422e529d44a5b2695e26043ada2201b168d8fca61378756b7489ec512688f36e7ad2879d6bc4a0c5d420075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5677453555e46f179391b82d72a6b6cd059ceb2eb8614bb81ef9255ba74baf9b8f9ef51110c97f783c77180e3f828b957802930c5f9b2f68b9c2ca47161bb9cdb67139144978d4ae7857aa2bf96b7d4b26882f50a6e8bc224db4e9c6cc2a1d1897b891dd44852710f38dff2544c3e454bd97f0aa02dc7a6b475a04693df932127fbf9fdab670ef461ab47788862e695899bcb76717e8d2ba333c9a9cfffba121eb00a37af3ce85c47a55b3b441fd64bd3750c4163a905d75adb72cd066b3e2ed66265d5ca0e092f28edc34371cd37ef9330eb7460f559353f3542bb216c46fdb7d9b2dee32799f86c4c2698f5b2300930940f164facaecabb0be27a0948fa062adc985be1cdbf3c7a8a2c43ba16ea221269212f17142f203723f912a44783d19535bf53ae49a385bc6f7e4ba6438cc1a177c8c8a27501be1946308cdcb309e661aad0ce31e36e5a99c2c4b8a3803f6f4586ade7d7194f2cca3c2fef98d2b3cef70473d552e24844794da59298142bb3665d77979e473ff3b3cd9d43c0eeaa10bd0a4f6ef99058cac4d6cae26c4877156cc5cfdddf46f99a3bc123913b4d16341d860da40e33c774e3 MD = 50e223e4f32f90fb64ffbfa33f0ea65841d75dfad19d0eefbc67664b546e60f5564bde3351b3d49df2ac3613c15e43db Len = 44584 Msg = d62dc41bef5d0526a8e594471c457daad5afbea6e2c7fc9d29a87524ff273664f65b8ec0f65dc2b9904c020e8e949c27cf7070b352aea49190b399ec0fbe1dab3471e208598d2e7e1ffdd5e9051665e93a1da087b0092f1b728b946d374c611a3776a7393d75b23ffefff320a9513eb7bfbc366825610504783950eca058697aa872c79ccc9eb4c2d45a46fba1cf905a0657199fd93d8e1349c4b3b4716a9f922e6d29792e8f9ed04a16b5c11618c49bb6f53374f32531128e34a70cd30a6a2c7270b5188bd0d631083c27bc2fb24040779f6b2e9ba159c7ee91133beec1320e1b8253c00aeac6adb5d4863215276e11f35ca917fb3a6bfc12e4de8ae9166001d2acebbbd364d40cf9e4b96cefffb5d8cf34d5753877d077a135f241ed925acd3ff5654f0fc66a157e76a8b2e6c07c5bb62fd8917de1f001448a36a821bb893a0965a9c5e699ef91e9913b4c22f42d634e5698b3f0fe3361a3ed9206ae1c5510d904a0657f63cb49e53e5a81ca222fb83fb0fe23b95902616565eea5bb3a271656db307603af65021884ed9a07d3ea223245f2280177c3c732fa32cb719f651529f14242990227872a6bdcdf008ec669cf1e5d0bf0e2e05cb4b547c1f8d279d6f94ebf0f6ae6789fc4fb0f98dedb2b54bd422515ad21bfe8909d13cf775bc91e6ffb8d269ee2c0118e3d6e0dc84281ada5b9348b61bcca3371bb7f3c16c3bfb833ff96cf5c7f68a62f38e286e74c303a2e8c70b8333b6704fd157352ff90c16bec62c051cc43d62650f4514a6280a0c401c2c3e34c270024dcb6d857574d39fe422df5f617b87359987aa5a262673912c5631453d308fc5cb7a39494497f8e3adf671c046566a706b0d1c4d60f8764ee23784a51f164c37236e59151fab028e768181dc4ddd4dbf73f01982e906b871ec3084f25cec5bd2e0085b5d695676fcd8848e07ea88a75f2ee1307f10e980c6b4c1b0a1791b2525abe8bea6a402dcbb3e5004c7aed10dfc0650efb69b098599d67b9636f63b4eabc17fd17562389a46227474bffd5ef7f294bfa5bdc9ff1d87cbbeb42746b52ed1eb4e524e3680362a3f726c55688aebff448e00f93022eefcff1b88f6fd214c3463c4af85634236d3cfda4a0c82dd506eb06c7fed602d40860b02932a8bf82d4fc58357dfab2722df5e0c9c59bedecbbd42ab712edc76d8af5a14514675b25880ab0ad9a1607770b98489d1c17ef7c48785fb8321f7881dd576b141bf4cd844837ebba37f15eba6debdf298d865c0c149f4bd346b53e96694eb79e30963e277a4ab2643dd4ddc4bcb84a74012e5b258710960f37f7403695a22dec3c97d697880cacb49207ac1c61c534865e59154e0995e975eb2da7e8cb1a7405253dbc5bd84582b11fd2f44ac2da43688e4db10f02f4ec0b4b9f9a35737f35f1d5d119fbd4bcdb64cc7dddd749c11f21775258f0daf646db3f9542a3f39917b9329a1400e23b60d3824f8e4a5d4171b903b2327af9639fedb056c6bcb430c36426e2d6f16c88b9082791302b6521e13919b36634c803a147842b4f081e0ce0fa98ef8756d96c8d0ba48cea03cb2a16a8a09f1da7ad9ef2f3a55c050e9af417846f0b4db891af84e2e285e559f624b90e82bc7e5911fb3af9f9310f568eb21008957c539dfc194797c8c748b54ed77174a653b2d45de3225f6af19668630c7291f18abf9082727e323d993c9f3b0ae7e1f4abe0a0f71e512fdfe6c1cd82cbe6246b7fba168b81d1b92b42e9a02587c35d540e3143497471713f56b90c51b713cbeba16bb97f0fe636790b763f7414acf0aec2cd47b9ad272b748aa5ad3a97a28d593afb00c6e468b00f3c0c05907a4aa3ea10db34b1901d6765caae38a4343a739d909173c8c8fd30d51dd279e280467df040839098e6fb2cfa5efc36f7578483a0eb569bed834dbdb3f5f123d0f04886a89aefe5d67768831b8db62f9ac627c7489572ff9edc015f910e908bc391f7c7fb6644bad30b0d72b0a005a9f74acc477ed50c28419dc11e57aed83a242afc47cfebad98f66a9204a1df102e75aa1b0a2bf24c9c408c3403ed1ef1b75984fe0f0e725006a95b9e3ed69200457cb0bb1835355be5017203153ba6028acc67a6259e43558c54a8d92a3801fc777422557986e6618bee16d65d298d333ce39a9c9369a6e5b25d17edcfad742d4ac5c99036044d85146d4253e1a01dae5408e7876155e328012d717f351e32ba48d86d155599b1f00ae8bc25ab869c985aa21410954c4145002c7d3a657484ccf913d68be12c5ccaf4c64df2c3c5531cd619eade3935096438c205c36695b28be4dfcb9bdfa4943a5b6fbd632f438a5f51d4319a54f784af2f58cfc5406b041e91a515ed59eba268c64bd41ff9ea898c533db1ebef7cf74c6f54a5e6fcddc1ae88cb7c2856e8ce7dbdc25acf29a097c962bb317a11abad6380204dcea1d2336252bbc8f5df835fa1c83c161ac54ffd3e08b67beec26ced1de8228f263734a06376dbc1fbfba49ffb7021d1a9d7de0415cc9655f00aa7fea131c43596c7ea51d87c952fe3b233d4b43cd953236635f17336c48828f2442918e26d05c557dc8eeaed50d9540c1847f3b5cc64317b3c0f82cfa6dc3d812cb6aa8484c95cf2f29fc14f7388f7123b40e16162cc7b1ddba56a1ea518d8c045ed7e9e7347029d14cb842d680474cb8506a6ca0452a854fafa53ac2a06a0b57815bdb8a14860622a5b5c0c96157240dce3697818c06028815764ff9b6c3e6aae788e5b76931e481c977076658399772a1d52f208dc4da25804c5a1611359e7cd5c1a0d5af2e357d2c7e9f23d15927a55fd8bc03a6f15c967499f1ae5c39a32be0a8959b52b57983433ee098694055146cb396a184060a6976e1af08e43a8556aca02c4ef0723122b23a841a8c99902e6cf87780819d73fceba5dadc35d2d58b8e4add8704eefce9dde3e250b79f7971c519b7374c0219ef57691d8eed7ce418f9fb31ca1c862d274add93a186fc717cf989de3c3fee7cbf5ebddfa767a351ad9443c18e83c252896d8a10a3572b08be9edb64e5d9bd1ccb45e6a9ac30e0aeb7d1b6f55ae74e0d8eda7bd1ccb495afa51980d3eaa5f86ab1c1a5f403d5bf4ba636c755a5c363ae85f6156f843bd6e6cefe1cc3a1212af701466e5754c289c91737f76af584bdb62d6509327039694eaab0f18cbfd7bf321838924bf583faa77959b99dd0c7b6c4d39ba9d30759c737a6d6c1c77d363fbc853cc43a9c966c575b10a066bde8d95b270e89b9b0096b4271d3efdc9fc926f6c6b776bb807669591af12e6e1384bfd986222b6f10b4efef6a3cee646e0d0f616b3d2c3767a07c3d577fc61c8817b4d07f9b016b8008afaf1e764fd78e7e538cd1324746a8a10f749f1109ea721e62c081cd9e27b4613501fd2486ae67a98de9973b7a51ca04bd8f40695c606805443a1b3e643bf45b1a7884ac15618ffb29082bbd17f15227e0fde9cd5006d068d3adca71f600e652ba7353818e997e0fcf591d3bb2adc7a72440f9c1675651b58b8c1decc62ef0e4bf92d85964aea833bb6cda3bdcdf90eef1e90efa14c75277e6557413570eba8d745781780a299523a7a3f141e90f548bd45687bbeae2692c8eaa6b8a2b3899b98321fd821182db3c0eaed0c289c578fa3629f2ab4c3ffc4fbefb62c5a52514f566929afc0d52d1094aee1742119a74a6a1d3ee3cdb28825e21b9083a676cb2dd9929e83a40021d07f6d2335522f6ee3da1d4b8d4fa4491e44173ba7ce47809be854873e16c2915b49cfb935030432c1bb0bd11283c0cb15e88abf7e1aecf7024d57ebc75e430619ba7ead5e7cc37e4cd58ed559b12f9573971d25f2d18eb8cbce44d206c4aa0872991f07970492d7ecf04f614a21182fa1197874ea3d544c5c34c344e390201dceb05dcdc7e499c709d3f57ccd1aa422053642b44da4673a1f467b4a4609cccf95c5dd09d86502d50b47292fcae6fbf509b624ed054fee0a7ace15eb1778d7a52fa14ac2b1cdf28a5a14938129cb44301460c528f9861245d79238303e256827040c4a013a64936c5e02da7ad212a85c8dfdce6d1191fb729d5c8d1fa358a8de7cce85cd5b740d0580d8a722ae024e00de55e6c235b7d01934f2bcc32f59be5100aea52efc4388dd2660a182a3e55ea46e30b6314d41bac2041c6c21c86fd309f6754f2c051a2b7aba6071a19a0102d0a556e5c14177e0f675a4454357e40f8cc8eb2dd05e411e66a2a1be877ca0600deb8f1c7af9a16b3cef51f130c5fe9964dcd8e721f0008a2948eb313d2f08a0e2a8a203655e07821ddaea15f0f8069a189c042527a19f9749120672ca9d81ebd84458418956f14e209e385c8cda4339316f378eeb5a656c506ab92836ac55697627797fefcaa6f6cda3036b0b52ff9f36bc38ca74049c32c6b7cdfb8a46ca4144bacd649da36fa3ac5112ed754780f3afedd082cb858a1031600b95cd522a9cca631b999dc7947d46112f88d2a3105e2569c75ef6c7772f1bcf389b07b8bba1918b2dc5f7205dab224920e42b4df5081f98e505ffb0adb60b6b1fb84060c679209bc991b1951156c863aeaa872d771825e2f120ed2a73ce8a9c87928132924bfff9b8a5d50dfaa5c1c5a182ef2be0b7bfafb556c91c109f1fca37d1d1166940b70fc1a86a725ec194d9c1136a2f760c7667f7509a6dcd50525df81e39f49180cf44ae4379ab86d1c905d60600218340d17280b56807f20aabbd9221c0b45332cfff461d09a0bafee9b3a702b9e94d7a5938182e3cd1c7f4b353cd816e3ef77e3faa50df223942707b4afdb09e6f1de3942286631db39337f18571e64b7ac58da8ac9530cc5e654e0732a0b8b69c3aa30c9694fb1395a0faedbc45fa60500587926dddb910f76cc015d258c10a56eee149fd089f265f346630611262b4a9fe948355ef21f5ec9ff02e94ed73a0867fc5d1c0abf65ff998a341daa0c94f6bf9da05cc951184254603d9df2678821536782e4545a9c54c14d8a891b7d53a803e849f3a9531c48aa9249f1ccc75b8e95b22e8f69e5f603eef2deeec1f2e7cce15b8da07b828bd04107907b1a71548ec36ea853a7dc139b873cb9a559f7d1d3fc69e3c9bc69f7779c22a99077ffd3c040ef98f78ac7657a3e6da3433016a26ba98604f5e873dfbd30860dd861cd89b1b2d778e1af127c3e5918145ee0b9c9e26d5239bb9c3ab50f82a435c96464c6e18d98b0887157c8368bce954ee86bc8d6dc312a71241907ed270fa9da0c401bce35b5d8727e01ca112af3ae99a3971fc76aa52fbd2ca958e4721ae280a5fa18d64fb16926219b024cdb19b8c5cee64f129d40e1f62266287418786863edfd1ea8300deb2a08adf15800b34c69b6b3d776e886c9c281d9e71a7e8ab3ea20c3bd928b4dc6d49f9527b13062e1ec079a3932d0d94f88e76f154618d44d8a0ad87653b5d394ec52fb15e6de8b11d31e03e4f4eacafbefbfb053956be7add9f8c5d93a4441cda7cf4a3c778f9e4495768b7b2b9ade573d7727f2770c375d4076f636d4bb1ae9bd70fd0bc1b83f02d9ad9b6c457585da189a40a2796e35c453f1f44fa18eb17183c4ae1483eccfd4e63fae28e0ef440cf7b594c40b06757b8b164a642f43c7ed9146b7e70c91d32361894e417c7cbb5861459ed7aa79790b6c405324ec5ea0b67c83b4e3ea5beb76c236f63686b23e54dbc6b96dd61bb2cc6e0cc8f25753ee849be82fab9b8f7b578ea530887e045f8acdb59ef72c71b56716d7f65cfea803a07600829e9eb1054e3d7087b7e1079152bd9e99f40c1ff343ed3e75e550ef82c2a159484d72750bb3350556355e10764531fe44f4f38aeeeb57bcc20bec7eee33944f0b38a520113f3bf0469123d360eab1311a6a81271ad5ecbf65312ffa98abc57e25d0a556983a88bdb34bf0b4f3bbc1e3a4d52399099c22c2ca05a9d72473bb5332a6019d034dc1ca36d63339a120ca925eb559353d9680738af9d8991423fc6abc49385804d16da23bb079c5fbc251a9b29ba0a0196d8c2e027e3ab4ea54ff211d0ab80c0f7df2d25c7b230e6618fda64af8885e4f79bc7edb034ebf095f4a12ff9b1f4d75abe7d6f386cd67627d0524824c7eb4225387c26f49931c13cb53bcbe4acc80e9d3b32cbb73d76593972e90f3080266447374b5598196507c21a28ae3ca4e4ade9deb4ffec2ef9d5bdfd06807cba1d9286219b4047bd6f0b4fabd0a0a7a230fc65306bd37e464533dcf71365b07db8140a7dd3b0a78c371509f19c68cdac94423ab8c011168e43bbbdea778474d1df31fad35d6d608ea56d1b73f2d058cdf8c98ffe197f5b0cdbb4895d9aa56ebf7a327eaca03f1bcba25aabb93b9eed0a44d78d8bdfe7f6caf66867d9e492494e715fc08e04ee804c1425e24ce09b366d60b55be67b0f8ed07a1d80e5bd12ab87ac00e504f1413618e517e7b3478fdbfd34ab239753bfcc24511cfb098dec3d70145d1893cf02e637fb76e376da4284c2a8000a27d1c158d061ad01cdbce9a6148fbe7fc506f737b2408afd1e007bd8c5a5fe3a1d5cdcd9dc9417babab2d18e78066a4221fee9d2909a9d5e3220047f0d11ebdb015bd7f74ed0a44d57d76c9fa662aa8a2f209f5ed9f3f52d3aa4a322a2d610145c387b5b30ff9ae32c94817fa589c67f78d2e3849532db93bff321698ddab50eb55a90ad890842a3c24fdad67d650648837d7beccd3f97b8487545fbd50722f19429de9462d3e4b6a0713d4d37ddb10ed88a303d890271c35d92d98182439ee4810d2cb9c248c8434f63738bd9d811f8005fca1fcf63b1dc86b2a3a29d78720f056e43c4b14f3573558c44396e406c2f8266113ca94a9e2d4c3d6d072d8de79ba7b4ec5c38d0756e3c5377fffbfc0bdae606cd391e9f81db369bfd573a6a43b0f047ed295db3ce5b8b22d6848af43622b5a6c5c1364aa211cd341b3bcdf7ce7567900ed52ae08962cb6027712210352f76b0c27afa3349f59771915bec1cd21394f51905a73fedad8374336dcc384f28b18b8c0c7142beaf1eb8265ea2c195b2ffdfd463dbb944613bc8c2218f54cd35ef9feb20a4604868ea72a1edf4ce607831b70997ce34d4a97cc39c35734cf780b654a75e997331488108cbafec2b7b90b1e37e498899e7abcccd88508008152e9112876d5a64bf766de06c4d91c02e2007cdfc2012d1c38fb64e4f1abf706f6a054154f6ef1c3b1b36644c6eeb75c151bcdb4ac473c3b07ebfaeb93d376d4d5a9c49d6a05e82ed5e62fb32bb03337b4a577732deb356f8a071568e5ef0e5f626dd92d514b17d1c687b0ce7dbe0e0a63460087a16db74e21c53ac9628f3c2b3f7508419f9f0f71160090134778a6688365ff6eb13f104b51aed19994047eaccf57e8869f821d7156f9241df370aab6979dda84d7e00edbac4c8065e51f4478947ee048fb94e056ebda034b0c267999324628868fe0d1939406bd9ae0103bf3116286251e37e686471ba4271c1a9174d6074fd033c226f79b65efc51f87b3c0e89b508781ebaea41b469d3e8dbd90cde559d6fe8df46d7c44f2ad50fdf64a566c91c60cc1409724bad334fdeb9fe628f2a6446dd908239603256ceb05ec7e282fde5d0146a73e9cc85a31e1c032000a80851ebabf7dd7d96896a4dfb1cabdaaa4e99c21acb00350a633ea8676047ce7116edc41abb5f8cae79efbcb9c2187726e4bf9da4ddb93f4e708e568a787cb4317dbf3af185104cf02c6c82b2f716a03de6dfc97b48a5efdfd31a8e4bf4c69a326450b6fafcf9a6a4ca6907ae64ae3d387c82ae67b5cc2e07b56ab9747c2e68baf4269efbc92182117a6eb375b1e7375fd02fb42fcc37e20c3e0740cbb7bb061254cb5bbd9390c98065 MD = 0a53523921e16516ac76648367b4a285bfce6b711b99e4775c00ec9d15abd092d5db3ddfa3560f3dcf47f44031e91155 Len = 45376 Msg = 7f16b90a18deec135d32c836063cde963fc4e6daa1555476619b2c2cc71016d2e2d8b5557be835fe476e23f4606d8203f6a81b9b42c2141cbca3c4508e1ec63948d04c0ed54bb680ae7464414d29c8c7e527bf4e502b211c49589608dbd9ac3d19c7273c104d9920fa0a3226b5b6d86c73097af9b2d8a2fe6f824a5b968af165be85eee71337036793f935aa7e5ddb7a0715f6a65011c04b95e88852a879bc3a9dd24817c6511edbe20816d59166f9770b14d85c121ea38a2553f7f4f7ee36431f76ddd511e212064d017dafd61959ede6cfcb24e0467243868b3f496c318708ac385628dc3407703daa114135be2463000b7505a2d356fe20580959ef89d611ade15b190f8d249f1bcd7b92979c8162c1937e07400b76445b82fd2d69404be7883993af9236911d4d3063aae2fc9971912e8f32a237fb9c9fd0c2ccc09c1011a708a7f24d7777723d9c6f9200269418d8a3508fb19e0c8f540b013edee64a1770163eea2997fe2451d84a51d76299dffebb6825538ad2a4e2fb618ca96524824d2b01a00ce04dbdf3ae9aef51f8d04f6b3e80fc71417463b1688bbd0b63c4d8a50e981be0988dc58ae40875552f62ef87f43f1df40c1b54291a26d9eb2652a4e088aa638b08e5c27e433beaca517747bba44e8fc233ef00b3d8dbe930f7f76b6561df81f7787e3e3693dc569aa436e06d18545ac5fe17eeb56c52f3c41edab79e61e17c0a2f7fc01c9c92c2ac71c8410716fa87e3b5bca6999c32028ee3250ff24f555cae7711d197250635e8ff55f2ef67e81d069f05b1c531231b768efdfcc9f5e62aca965cf80ff8dfb73698047c8fd3c52415051b96a3f3cf4864668c058c193aed45d587bdecdbc6507e82fd664d2139a5f82f25dd99a9db9040b4fab2a184f9ad097cbba897976309a8066938931beea697654c0f111df2fcf2c06f8b71fecc72fdd31f4276f45de99c6c707bc8878932daefb8b37215ba9263d21219644f5b450922dc12f2b95df843fc39b6532eb54ea9149051245adb5c79320be3e33e4d2d15b019a074b00a3f83feed719ed81804ec1efd718fb4fe621d28837154944a3309c6ff75629f0dc545b9b335104c5a5b8b53269c1beacbab38fba24c2019fc5ecdacb618254f0d937276b4881154245c6efc345930c6e93fb0f48ffbb09508b64aaa65112688b3aff07d17f509b61e0d7d604e31360e01266f5b73066bd01943660834e9cc11a723a9160501603bef78a1c99dab958bba685b7875f6b891d50e0a0d4c277eb490f78389a6367fab3fa5c07d484fb505bd0e5e92be5201a2e41e1f02d553a6371631681d211bccceb89ac3c578a5fe44b1205ff275a2adc9ef7b8b2ff6f6ab63e2db3f1b9f38b06c006193e95536d90f3fa445e1c36f24cf9e2e38dcd897f5009cfcf0cb4716944cbf0216310689ac2f0fa4faa5d03fcd7c983e0c51a3beecd6ec9d6275423cde379e8336e5b426e06dc8276586c39d129786b3f1d57ef3f8ac78c57f61b732f8f544eeda4c8696de8f12366ecec40e5aea0f96ceb291bf814ceb7c2ed7cf81484e5b4aeaafa5600d5d97d8fdc3fd1c0e3bdcee8a2e05a9ef7cebca571eb2b0380a88a04d56380cd4a1fc15faaf934e945394c30f92023aaa0520b8e27f87472ef075f7ed8968239d21ecf54dd8b12c55fae01d4426aff81aaf344db84276cf94c9ca57b1905d2ccfa60d81df877d3fb9f768051131356da741cc92bfafa9cfd15d2ec981b23eafd1f807c096031f0e2914d3825efdbc21ba85938de00d45cf4d744a53453933340ddf83bb5b96c0220b17ca9d13d06b9bb9412e4804a6755770d6c600e56b6644ea23297817868801c8c9f45d19f36a630e3e48cb11c05ff0a24a49d54a91fc66d08ba001b01c9e35c9f2faca56aee2011f44871cf1a42b214b9a7bdc5af2202327e1915e10a02b46755a83ecb348fbfd561b93458a9a0273d38c061cfed8f80258eba3951d5a56ba33c838cc180bdce01a8a154ec6e90c6da2e98f9d1f89ac8bc9727fb0c191481b6d06c0716e3dae32d25ab53d8bdb70972078c168a34e6546e33dccb6e28f28f08adac5e39b279879e8531a1cc3b65779b6034184746f4bbc0e1633b06a9a1fc2f20dec2b8911c33fc33dedf255c3e89cca50baf978348574b3c35ca540fb55180c67df501e42560bcbe0d5c8294a4c87c629d2d099e53cf6380dee9d4cfaf17a42af465a44047a6668047ba52793aac210543110bdc997cb07bc92a176de1c70fbafc852e29d57d70270869137e52bd6129980c1ce29bf7a8698efb7a6f1fd83a02d0e3fe05614e601ed9f95418af74a32c267ebb34ddb8b1f68aeeac479bd3a97f2c0292577da1bcd436eb72dc835a6da958d97547d148739f6763fb8bf831e49c685189b48d0ffce3a9a01e3e80d7371dc9bcd990192f53b08f0c06a0b78b61e70051529111f196d99cc7b4b31a8375f5d38936a207c5d8f67c374c3a5c38a7fbae927b719eef1102aab2c4eed2e7d0be10df3af24fa479cdb9863a9d48e22d26ad9572ea9661021b3e01cd262c7cadf2fc2f45053363cca2c179605e1fe0780497cac7409affd06fd1253c0da99a84211fe9e35f655c38121e714c0143dc0f21f7b2e7281f04029d0eada019bcf9e9c4d69fa475482652983b1e5c0b573d58fb47de510595162f0f410b87bed8f3556acac0f6cb7e3a92a1a1c12ef0cc7cebecf2bda37d8fbeac5302bf5181a01f3d6f66fe68d65a017edaed1a234616234e93a2d14cd4716600f4de39abf694f6385f3598593a7e237d807779d76fb6c8f77bb2a9bbbeec94d3514e2ad58219e0acb6a13f664c5d19254ecb70c9f230c65d01bcb78ea153d38a14acd39ca8b197211254541ea0794afca2739f696216a405c21b7b241049aa9baba4f43ffefe522bdea966c0bb55416a07ea463433dafa782979651a7020728e82b0ed5de952da23982ae81b116385040baa15b8ebf0323ad43125e0659ac3e9364b2f64fc4177bebb53687c37369e410a3d7e75fee8d3b42efd1df454fb272232ee4af3ac5cb343d4ad68729140e5a7a00ef0e9e137677aa617bdf4c2d414d00514c0787e17255960b3588cb41503be49b90d93376e55f4d62b963033b8056939591061f5d34665dbefc929142570eb83a634e065f037c93b9337552c0981542c25bb4e88438f0fc2cd2ad635e4a5b5da60f780016f855e530901c2106b112769f541acb9da77bda1d60e229df51ab3ba73d5c07e2eb72a98d78615853f1d698f5223fb0efa88d5f594e38cb0b9684ba049504040d045c4999954adff083e80e8c6d2b80c364b0f3a743b8312b3e714287be77e0dd6d9a2b1c8ce29e258dd0422cdee72161036bfed0e769438674f73bf661bd819b4bb4b9de082e7d3938179a9d1c7a7d11ac46e89de353ea665ea00d1a25dfd18ec93359a6af386576ab4480a6d0ec7b1b87ca19d3df7e0c1124f320bbb3e4b7000c9e753d29073c220fdf5b11a24602c6bd7efa3d82f392d0ef78dda1b2d41a373f7d746c1fa3ec868b7093a4398ffc5c76ebf1a275b965ebe7b8aa93cbb7e47c8859bef939155bea488090283ecf5023d99767c960d86baa333af05aa696fc170fb8bbac1e6473956d96b964580ee6640f0cc57be9598e55fc8618beea784a50fd25d34f77981ad1233b78223055a6663fd27180bb43b533692588874066b66f7a256ea8ebba3ae492f634286eab7873926fd5a07c9ec88da39eaa7d4f6728bbad42f48123d0ba17e14f563fb91944d1306d57a3d572aeabd179e568c083887dbf03cda0c6e582b239ce442fb9a6f2c9405461506dc851d51c3fa00f3ac2befed8f061cd7dfe7afdc1fc67c0175a6aa3ebaa5a70eda79853ac77453b662db2831e9218d2f0258a40a26027ba7b3d94a758f9aacbfc186b6ca8a93bb4ebcb4d57bc705b76c6619ac20383ede48c58581db0c8b8294322b26a385eea4273a575c1d8139080a8bb92cc0deb1f07f3b29f4c1aa0ee5269cd5593861cbaada3c113089b0121b93d395aa6e72227eb58534f7dbf08b30d17213d30b76e13bc252910752cc474e92ee6da98bbb06b58614452f8c6886f24f5275088f6d95d39a1e55250b3e4f3d822c7fbeaae1b5516b98c8e0558a88b5daae677e569e700eabefbc3e15ae7044dc2e6a3e3eaed4bec0633edec9df16d81df669b8d381f649725754a6f47571111b64abbcc97adb7a4f14256f4bcea7e583bb0a2c98c09f10a7e5ace44a2bb81eda5fb2ceddce4000421c0b066de1c26a967cb76e18d2e100a70b339a6949cbca63702dc8ee2198ed53fb5e58a2a0dce3e0abffd1d6215275ea38772de45812a071566b5f7d1d4c9def22adca8c947dcddcd9521c53447a0cfc0de6133dcf233d7e72f9e70d09e19e9e3257d08e252ba4f5854c8202a4ae1256fc1eeef81773fdd54657e4007fde6bcb9b1b0f29eb4ce5b5204dc776da85428573601585e99b6e205113fb09f7b98211dd35dad25f782cb64ae441224e85f9f214882b898df00aea23bc808c0a097ddb7956c829ea23d663559e83978936c5474fc59555ad28509d2e9019091f34bbb2efec5b9313e66f36e0db0349130e20df95c6e78caf8adbb3d25d28f3bfc1d822b16519a0852673bb6d2844a96472993586fa96810dce18b8cf6234fe54373f955e6f66c4866a706b6b14cc5af61a9ae383df36f550387436765dc16b851b6ea55759d791c038e1b15b1f0eb0605c92541cf32d3c1f709a97578e52ddcad4f1bd2cc2f07aab084447cdb5805c0bbf4c21c2c50dd7b3fcd865f3926dc78dfa45475f1925f1af5f14793356d5a080b8f4b715c33d5ac633da1ccb0886ab5701f5fe6eeb0c9955a3ded01ca1534047e0389e768c5037bebbfc465e4f121bae72703cccb6f8c4368d0fe6f9f39d9dc9bb8442757ecae1160bdb5d2dd4a47b0cc2307cf8eb9f24ba6134284bec292b9ea1644d9319220954a9e3dbaa37c25bea87d3498417541d59c6c81e92e96a7c3f48650a4ff9e9f302fca24c63f6e030d019c52cfeb8bc20bd3448245f79f6021406e3230c8f8740a99a9329db80729c462e8291c95e2bd13d2040e4122c305fc5737b0269488e74a0fa32fe71631de0c50c9802546647a152112ed85b5ecdd7bbf4a932e6b363f191a20e24e61d36b0d55a7209506f8403a49d8e7b8bb0131c7020da2ef56eac69e41881478a2d418eef8ead212dd8659a9d1bcc38239ea4907a7eaa7125c8cc2020c438d0de11e2dd8c2fa5c44d4f70b8b41284b8d398f6d643748683e86047c6c03b915b62498f2f2394086d5f2319f082283457ec2d8e506398faf1cdb3a3c05af52741b752aaf65e7221a6a401d5d47fb357a00ddadf8143526425463164af4977771e3dbbcab585409deaec4a38c7154a6b2b991f6f0b6b477e98d2681ed62438ed6b65f362ff4065e9c4688ac75adb53eb551e69b13163de96e6f2d616e773c01693e0780836087871add941e6124a7654a71e484aa5958e498a47fa0155a0936f320dd83efc55fee2119eee396feb1833bc19499fcaa8dd02ed124242a3432973b07e925bb4b14f978a2a0e15d625c004ee8fdc3532f6516f9a125d7f52c408a0b99324f2e193012e921b202fd782f444c8f27e8f510671cc1b9899fbe6bba79297ec0ea91583ba03a3e2a2cc069b2b7fc5d1bf12b761c4b4dc45866cc1928cb5e5f9bdc2c2fbb0b34a01249ec5d6dc128fbe0c73d890a0b67689a13685d12e872e4cc0f47c73aba9ff07140ca7be9cb96107e507370bbc5d54d588eda5f01382db45a692a483f1743d550f9a2ecad3b0f45fe761554b7df601c9abf6a487d2357784dd41dd95389e7f8b65cbcd8417b5b4267206a5c84c3d07d668e60400c11b7d7ad3767a2fd785500ab515f662ef142aec136bbb1acd7ed17c6e3036e386a167a837951ccc54c539638c0d4befb078c31159f507ab7857f93c1a69cfb88963c08d684237f336eaa6263916409302400746a4571e02b344d985fbf730e84fdf12aaf3f25e2d044220b36ac546f56af681fc80f660b924b20cfa916d0d0b507fd8815929e1e2337823ab9f9ef17f4128ada37e576227334c0e0a693fb69a21d27c91065d85ab4b09496f3617c2a92b42e4bc0afeb4d5756f5725f1f3b00d4a53896a8a019bf0c151ec8ecca42cfb8fd1e1d6a550bb6c519872ddaa0dabdd109f996e62caa75b2cfe977ac1e8a2fef5521f63ec01f8245e53dbb21001ec923af2f72d1efd3a32e47bd4c3c439c71be24fe7f42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438332e67758e279f9de208a3df70a14ebc8698011946169092a8c05c12c3e9bca04805a27c4f617b6b5612564f862c49fa39341044bad7f85b4bdbfc5b6d572d1f5b1f5756d883e1d92a39f53c6797e1a2ef05bdd63ab34e98d4872b35a55a1e5b7663cd2ab1f39a8e6863c7cd994bde5cb1f550f74e125cf049ab32c8f45a59fca0b94e21631b6e33187a152ba6b108cf86eb10ce7f5ce80cb42f593be1bfa4abe2092063756224704065277d163026a476d0478454f9bb941cfae8b6f5f1c810433b8c176f2f86ecea0c45ec6f2f0283898a3b4056519d2f8af62763b6588dd2cb38da66daec5a501d57b7a03b186212c802342b0bcc5685050a5e68ae5cba9982e652773c006943e22ec4c001520ffc3a207c6dfdd3ad3f951ed4ed6566190f712e3c7320d37b6e4079b6744a45d1e7e7cd5a2db4cc6b05421bd21b62dc70da9ff8df810bcd58793f20d3e69d596f7cd8ef1593b721587e15e7a0192d2888a2142d84ca8756c70be70b643b82f6b362146ff6c98e383c53156b86104eb02910d9b373751bd691cc4123b09e81846341a33645f4c17bdf2c4b8fcc284dde1acbf574f4ab50b57e66544e0135236b48c38e2b4a3fd85009afbd3cb988b319257c70574f94ac5b567e28759d28ef132a8edc354cd05c2181877558965908c810cb5343cb57b930e1bfc681cda06ee5d14a953e95cfd555105a7bccabc2d255a45fa522b11dff9de7ce3558d9c5264704a0c22d6b65c9547ed1d58140ec9b27a9e16edb490d05082f567de409bea1a28d376aea17bac28693938d5e9dffeaa6e7f8b656db5053da82fda70ba5b4675f32b9955ce0f547531649ab4a0a22483a264d867baf0d717ca86bbab7f4cefee4bccb4b6d103ee123d19a352fce7d3c4b2d88e5320d6de8546949becf3f35f09bf2179504eebf165e8a2f35f432394e41c550dc633c983ecc8d3fbc3bce10c5ea9e457a09c19d716c0aafb2817e7e0684b64d72f685b5fe4bdbf4bae3e988033b86fd0365d20377b519c3b5befa73ed7cc828afd330ecad381c11c3afd8c534f573e637fe6917b2a27e134593ed418a92c2899be28567d5fd183ddc87e2eedf802ea81ebdcd01a99903466ae8a10f652c6e173f0ccb4bfd0197210f53512b8d447cecc08a48eae4036e042ca55c0607b4927ba2374cc3aeac616563fb6ba6c5a9285a264e20faec4988f794b2674ef790f75dcc4c4ef46f663db0e16779840f17f89957ef9e5848d119c5a9f70a0ebd2a6563c6341a09c897f5aa8f7fc2f0f3f6b6525b570a2d8005e916745c8c6fe2e8a43897d5f82841a74ffc772c9010faae282c3b6caca01d4cbf93fbca3798ed347b8247192f7a63ff144ea154290caba717d0fe18cbdaa60d65e3482751b16675b3eadfe70926b5050c4713e0d60d8f494ae5ac42b102a3b2a1af635d23e4d61214176626cc54c022fe90d7b9df3b2cfd8b144ed2a4419ca23c9f5252f557c47566b2e4c0c12e0abeb3d1f5c58cbd0d29a005eaafedbf1a45fe5a1ff00f32b8057162629c30d91d42f4b173ee25bcb737525f8bc3d4a3a403ae89d21db89e3a MD = 9d7af269d49bab3b400d2b66254fcabe81cee8bd8d0d2b44c3393bebcd776402746773318ad6509fac19c1a538491094 Len = 46168 Msg = aaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b69ecaf332aee17f05f53206b660cc643babfe96bcf194f203d64e91f215c5714c03ead556e2378d0af8cfc439b3ec0ab87504dfee182321c5cd04b034d474343551858b341eb5e612e7507cff14d615cb6fba000e6521e3c4f01a0517f64dbb170a037b36beed28a2637c87830e2b23f8eea6cd9a7331c685d1e6f707d5b264459fed2beb3d5db33ddf9c7a61fa4b93c594238f0e9cb3288cf4f41c80fd32ce5575bb13de24882449ce48dc2873c803c5d2e8daf77c26b85edbe9dc1ff74f67db4df5d96c0eecea6ab20a13230510f25e4d4f27d18c1cc45ff900bc314e78bf2b6b15d331570c73f52d48b60e28c6ce1345cefc293705fb14df0133615d4f42ea6fa397aa97575f8d929d4b26595a15695ef0ce7b1762bb11f043e82cbe23717cce17ad544a6e1ba874603928013b66e51b5d2523a7c382ebcf4130ffeba5e976f8fa7abadab126ba653a067fdaeb10fafd5c86cf6298f0e6de91b4675047095d82b4863ad2b10f47c7a3499a20f9c23f677779dac26373b7a0bdc8dfa6776f850dee5670ccfe43e52e1469038de7e916fc5654e261a389b2b81e04d538b77aa1dd0071e923e95306fb05eb386c2604162e41ce52aae9b18c774afef49197b92872835f006202bb11d10046c5664491b16ff24cc818a6799980bcfd9a4b98b98d80ff845321fafaba229c1236e6c4107d53c0369f355a405e46fca752c12ada456acd785dce1280547221c3e978151ede5c3432647b75a46f4c7282aa9cdeb9e4b285a18cd0e9ea754239e26994b7fb58fbd6b6a MD = a4d92c826cfae13d7a80653023254365415825a6fa9810dba593ec73f6560e0bc87fa9e5eef2e23076ad5214605be3d9 Len = 46960 Msg = 44abc5349f6d499111b5d019672f2de1accb5c8b4959c0787155b03abc04324812c006f6cb8fe7a414fb0d35951ef6c351fd6690cd17ad40743d28463aa30a9d80385cb8373343bb49ee82eb34f83f63f8660a0a34691bc18c26dbe14dc1a7e454bbd0622c7fe640763736248ee4912b6bae4fdfc778946380b8d2f13f868f8757f369dcf09b5799647e31c6e90b7382717e3ef8ce6c9f8e1a9c145f56194cec51852f0ecbb01e30db6a7cba8e956dd0d17edd3d916dc5aa207aa914dba3667d0a1c2ae107e6c46ba3a31ee9c5a9077e5455369657a18c1f5bf99af7154b63a0495e633beb64d0b483d21f3ad66fcaf2c2ab51ec6a337f5693c2eeef4e3acdbfd8f3e106be53ca72449f889408103d95e32a3425104923b5907dade6cc972b417d84ac28c9da3a0caeb160e1a4b4e9cf7e78e92b920c02a519d1e0c3d98b068e01b9cd8b5422a9ec89b1af08f28254095d3d78e438a3a38ff8668e6ebb3ee50e2b394b15a6539f799d467df13aa308a94622e73a49368ed9f3e5bfcebad75029c5ad2eb00994a21bb219d384c43f8d1902ce40140fef4cedd3f67bcd207fcf4795bc7f43c30d3c3a8fd1b8a9d77d69bf59eb8b59d0f464315f40cb52335debd0650f45b51de7f43efd173548bd852605121ecef3d56d5e0f616cb6463d9a2b2cfb4d88f05f4a5290c4935149bc804b52f71113c96683c3ee9f21458f845d18c31f1f50dbd15ddf96acec14941d96610dce6c61c3ca5d1935e3087f1651cf38fd9b2da65ebb4922b97dcb861128eeefa060d6c1c94b25eb4ef3c96cc3eb171643361e91616435a461fed7b0a924b17d7275f839c32f00bea0970b147f9c5f37fbb79b1acc154aebf7f8b999425b0694ebd57ad499bf181c9399768030aacc258fe74b488716b081e1331849c51316bb734703973443958c8fc0b3b7bf5e8867658ed7237baf8eee89779dc91b95087a72943b8c7a039f97fcd36ac11500bb85e774e6b38e280cb8558cf0202a2905595084ccba54465cc3429b42a718d88c077b602101a9c85469af39b856dc1635e175df5b29aa56f79bc9e0e470b22d24768b1b2f14b5d88b88fe479d7418a6bf994a6d93e2657996a4fa69f824ca49ab5a7e6ebaf498a0dc9eaa7f4981c51fcc0935f619ec6bf862683b0025cc48724839bc1e67aa3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb887908917ef0d33f117b614fd291e3e91736b15150e650db9bdcdb56317f0f5ebe97c938bd691fc91401b42576c606175e0d5c635103612483ad51bb78f33331c93cdae11c6389ee98470e19e2a6e5e0b7af88b5b41bd33c236a1766b265611b14e2cdf91092aa05fab5dfab9ac70bdba097d6b6fe723f88f79d9ce6625811413e24130f3e58e8a5d7c8993903a8f07e9540b6f5a4b8fe917cb242b92d4dec6aa17b3a81fa38ce54ac09db70b1bf2c302244b9d02b52a8fc2f42a96d67a92aedeb52a4ffe8a4e388e3f406b1299c3796c41e5ff506c1c71f9bb94161a60c8541883502e76e4f90b91c11bb98dfa27b18f73809d2cba8c1722ea0ab446cfa641be4aca4c70f7b8e7ba0ed6a8648748f4d382c47d7fe5a20aa7473377430d54fc3ad243b2d50db15273ed18407f884ec9a0355ba92f3688d1ee9bb867f762fb0df2e361668b6c0cd62428898ac64561b95e55ea2926f563f461ad408c4b18c3fd5045cc727c5cf2fb3385d28d2205a74b75aa1c034a6a5efc664774ef2776d353babf2ddd8e278b4809cd9b5279124b074dfc964185dd9e70672ffc9774c354979a1b2cb0ab14fe450ec78bdfb5b273754e1303ebbe954ed8cb2e7f8c18486d52571f70f2ba6a747aaa3d4b3ebc2e481ee1b70907dddb94bdfa0ca6d7fd4d470b5994a2aba372147046f5837778cef1896caf509fc9f798a55c91187f0919094a084169e44e7407ae48b9da90cfd9963e59c481ba6c31831b59857d8c26f6dc97ccf06ea4a3b774bc1a4ff893ab9961c60ebe4461add07da459af7f073b2ae87b0d6759f38a858423227f8687f35478a8f565409b741eadcac4d8c4f730fe547d336fd1d9eb245e6aca132c758f53036c74801e70a9613c1402c8f464edba4926a6d07e5faedd2c1979d1916466de2b9bf5d985e835e2520a7b47b85659a6eefcce52098cbbf813b996835e5c623c17bcdf361e0cfee91535971db8d65e0a6c8914bd1a69fabd3dd18bef3a666ab7f1579a6091e3edbeb01cbf119bebe32dea55ded858fc5374d2e9bfdece886795def48e1f8575eaa8494859ed099ed15891e6956c6c4faf64f9899a17c2cc3f1f081c233aa3cbdef0093fcf77acf60ed389c6a241fd6af4d6db3a8464bd3adb9d9756c17b92ecafdf178b877829fb83e6f97d6b1fb4530c12a083e58b67d92357b32bd0a8fae047bb9cb3ebb72bb518d909915ace3914dd606fed255569b1ff948222b88a85b08cccbf4061fe582db6f3e38cd61533b5510870ffac8a6bca589e2fc3e1e9d963685ca9b95313586a437dacf646be4b3c4f51cd41e3f2142d14bbe096b38d9e01c2b181a628bfd474a8bf8f55148f28b3be85ab3b30540de11d34be24973d7d938114709048ca7454ce01b233a751732188ea3576fc7afdee5951f0f4f3c31d208fcd9efe1bfcdf119c8b3d1767cbd38f94c89079b02a8d5db2599e8e30e528b0d3243278091dbeb3f9a4598abcc7f104ca69e7ccb22d65350f96f27bb76c434c356154867af4b843cf962e130e0b7488121460f86c4b2c7e574e1242ef1f18fa9dcb2eb1d64a76c705a7e33ac561052354102384444b8b4074ca266b3fc84fc4f3abe58085e79f4a8320a087498f4cde78a659f8a4f729844d52577f112d90b21f49a47cef93dcd131498f83035df0c0661e2addf315af51ca2dcc05cc1882cb0aed912b7c16d566f769d5b559959ad207c0bdb9996ec4b0d3a5af85d74fcd179adfd41795373110bdc99da5b4fdf11b41d33b17feca11a8500025879c9a1a9eb86696c8a0bf99d86bb20ddc7d5f9ea3fda1cb7c8af13d412987589482c311694dccffc50777b4c4e96a4de11a81487224709672a5aaf18347827033f190597f3f57369630242bdf1f39863cf52b98919c89c480b7bed577903994ed51cb9be8785064c38591a52ef569e076742735074f347c2f28f69024edf3ed490b3a7eaddeffb0d46c85cbbb54418216013cc9dc23b9e6056018cb9346faa3cf85a6abd55bab43524fc7458d220895a40331f918025f2b8cc7ec2dca8494dd0728d6c968d69d44c59520baac490740a9e2cf6fc4d36f734cc53c5fd38d0ac37a5c94816f361edcb3a658d221af86acac05ded3e87e31e5ccc3ce08b64ba47faf8aa67bf0657433a6ea3736f33ecc0035d626cc8aeaedaa94276bd179a5a9362e18d55ef64ae77025c9858e2adc2365ccbc6e03b401ebe92c5bdb62268263138070e9d286cdc1bcb9ab0981cf73d103fa1f80206daa72cb1dc5e662c4cc183b2cf8aa81aad6483ee8f88cb8e8ea1f01466722cabecdcc78edcf547a5c6a11d9ba1ae010694dc61f3d18d6db8029558839fd1da9ad533f1727e0ec51f5449613b33d522acc1a81863d73af919c18bbbf59473866452214d1505f77909742ee119ec8c975d926c29c7271df82469f99cf31ae3da98b2393cdf2b6bede4a4c63fc03250d999a57d088637b2d5785a636df469bf219893e0334944c86e4174a3bfc6abbe63f1796f57398f762b86215db182274215f465cae2dbf899a490524bf385cf21c0f57cc77859a4f464ce3d4d0a24ca29023ca63dae1fad5c1b61dc237d9603276b062df9fe5f0e9a1bc13cb5da44c8e080c1e3dd077cd98c2d3660ceb06ffe3bdcb40b9b5bc222f3baff7e3ca46ab9f50c249d0d818c03a6647e8eb22e8c06db907fa400131b987dcce99025eb2f03c32ee530639ec5c2375bbab4526a72b39320d965eca6d3c5b4bc10011620da3cf743845c53d1a28bcb7d6b8043d6ac8adf0841ffa5a983312512f34f91e824cbfdf4726f72acbad6bf341160eb0592032ba159afbf7d92614b6c13ea0da3674743bc4fe8349267199f3a3cd4dc79eba315a68114bea589ec9421e25f0de54a2565056d551e254feaf7da5e6a7c95e1e1096248bd17b3e2399bceef1d071025fcde5a6b4493d7cdc135aef680600c4d53937f11175f1b33beceedbaa27dd683241c45ba253a1c7912f52285b51b2f566120579aa1f96de702a9e8b59df68b0a31ab31ea857585da76a2cf8c770281c5905c7615eb7b0e849bb95a606df5bff3ac07b97cd3da865a62bb209b54aaa5f37784754352588f84e079bd5b70ffe80809be46d19edda0714dcaa002cc97fe687d54bf838516637087778c076579858fc13b549944f356d7be4dd8835d4f1dad1839cf56e2491cdfe71f30e4a9f73b23791b8d2474c03bc62ab1347d75346639eea02f4e08453e1b85ed5673ccfd5b4b77bb3b139ca8a1f529913e51a2fc7a87472449d945af29bbfa7e67552cf0786063b6f8d72b214bcd216a70b064ebcd2de832c97948fb7249ab2eedd96875151ac37b40ffbede7bb6a8a9561a4996d086185808be809eaa4d1e9b54a10e0fa3d2fd949dfdb624b45a25da68efbf8217387e0092096b2d342edb30262c7c04c711988f8a41af88a8203f7a23b1354223bd7fc8fffa871ba2775779fcdc3118d16f1ab8706c199eb9914c0510ff593b687d942dacf252de67bf19f52340cb9065340acbfafd72cb5b25d217bb3a89f267f1618b13916d0a065ea92e43faba2ff518df26844649831f76780e7ce345eba4d15e7dde58241300de7b81d95a7b2bf3760e54a7071c7a78eb9465e09a2bab9165e18277a7168de9c7079c4df08d3902e41ed2cd904a05e9fdcdca80cf99a6d057a1154a1ec2df23a0d3da3c4d6ecb85eb972d827280ba05356a88d7e41e51c3ff03c2f01f978b30e476c80ed1ae480ee4fdc1403e2f0b3d1b114d50783850fef48007f43a3316a41a56e2401dca530078c93a9153c37e04274874750c6618e3b0bc40b0eef405ffab0ab57a9221610d0f7ff5f043dc96fce2869ac011261e04bc0f29c0be78dda62ee8ce08df61f68721889fd78ed8ca89c5421ccc26f6d4f48eff1fae1920123a1e97789545fa87f1477974d1b5569d3d580196f39e66d215a2129ed39f88281de29d518a766999edf9d9315927c4837a035b85d117e499fa8dc023dbb22f93e42340f562d11da0dfb11e31e886b121d26f9665df040e9115babe4b10e174fa0f4948b0b8f6a54148f5bf130a328adcd8f578b397f3236bf9a133713dbdf6af01cd1b3ff7479edfbc30423138bbd038f02d48fb7655e16f08e9e6329c9833475e471eef985458e09c093e38ee931fbaba7fadba04acc72ee5fd3d0bc810a947972fea3c36ad62087ae90986a658d7c68a750d5bbd88333ff343ae693aa7c7142ee003c23ca3489bdb583a96fa6d870102a5ee6d2b58b3f6c355c0e78ede2b51981fd20e24d68b3f3fbf58065551abee957ad76ab89ec807d8cc0ae31f2434746537fb7c89c798471ab6e8414195c4e3c57c4ee10fdaedd795eef308760a70f118b0d699c5f6fe67eeb741d449ba50850522bb4c7b8da3daad66ffa42e016f5c251309e283d52c064e391b3bc83fdd46f6f6b329863788a5619ca762a1999e1a0cf6ebe32df2bf969bd4cae45786c9adfd60bcf4da68eabc652870a06b437bbf42a523183ed017bd69e2d77a722fb42e9b093f2ac28268842a72f20a058f96b068d615fe30edd2df3b0bd74aa2ab1b4d5258c057f9247091140491fbeaee5d91e1e25b119eac6f7071b830e153897d8eb5c7d6f8c8bfa167d465d6f295d06ee8405258def2ac4c15c0708adb2f3b396737eee989cbc4697cce1f478a90e61907f6be95c2b76df73389bd2ba47040fd7b4b267e876cd3374473895a1066900a85978fa87967520f6e4ff6b9b9d12b381f72171c7e465c9953674c8540715ea1f5853df74f8d08e30a85c5bba7cc6a57e84f2939dac2c11e2e1bc15f975bb27dbc525208d192f320acbda287eacc8efb4a34e56d297cc12448f3905f61802c0c6e8154639c038126c97a05c4ef4bf990d9c5d41ce6dead4a18a131fb4b893bcc7084cd8dfb796383f52d77e941d54a970b646dcf9f63160e31871eb9b1d1523c56ef15ee9c4efac6945a617b7f02e29c43a32afbcf946bdf0827bf2140e31fdaa632d60beb0ec74d4b836ae1f32f620f37048437d40d4f3b2105bbb85558f535d2d2867c642349a66f2aecb34ae5397e4a0b11fa591810b0f0936cf57b8d62cc61409fa69447026093d37f75d2bee957f1294cb9db5f50cf1b737b4f300af91cd62f9a20f7c471ea4dff9b805706e22ac0e1ad0cc74d9fe3f6083f4bff5c1895a5d1fe620b4628c1f211b9991467c4653db6bb59995d5eae14d4517255eb51c554fa44e04b26877624bc61f6a75c00a5cc2ae026ee290d7bec6a3a38c043252a67eaf62233f02e854a521d4f8c5e175af0b0c40b221b3cdc012c5225cb0e134353369abe622d8e6df77553fa3fe889035feacf6cc1be5d4ce7bd41bfc2869c9eab5f9b0b3259179ea0889e8d4e75c62d4e2b7ac2698cff5d047f817d634741aae4e88f9f30ed5a95ea1e658f14906f3750154ea27601937afbf589d519ea72d67443e0f0fa64e7f218a941664ec2d4b01a1ac39373a6aa3512b1d35d52dac0cffe042796db5a2021c0bbaaa93987a735e0be620beef6a3f9fd36e67caa82bbf5c6abdbf7703793b376c809de815947276872b282448c21581fe74bc99d8cb4c682ad66a94577c305bf40f76c92a25502f5ca3d7d20a1a2de0f657bba88535bd0967b6012b7a52eb6eec8fbda0a1d21573d475b82e00198da2013eed6076111a296b840ca635a474599c28fbd44045ca2935ca50a1f1683fb16851d829750669af7c69146c4e1ad1054c00b6cdd0267739c8c92994a4af4bf373ba066c48bcb483e38da0e58d5b0c59444279f3181c228ad59bca6de295b752699eff8fb8dc028de8173879bc102d3ccb14c9aee2d0d506a467bb9673c28db5942849fc8d0e5cb5d2306490a1e03a982b9e3066f4ea97947c5685751fdfd5033a7d6e198ff9c9e3ebffad9206743d54aa0935831711711ca790af74ae949526a4c8f650864651ff79ad9ae7b1733d58917d616d13ed69876b3cc1f9e788d7051a2f6708399cfcf1c561b4f76a86438c28213a8cb0278abb1182436e9364a288e3da4ba871a4d3a11744812bfb5556d8b61e4a49b667d9a1e08bbe3a7acfff9749f2299af606ddf7b77e8be92b877e24859c190aec546021227fbac56472f41a929f8a45906922dcec365a9ac1c5c358dbc22d381b9726241d86bd7719f48cf90708f5110775ab36ff9474a786b62e5c01b8103c0bd833901bc651b860ffcc1cf056f26622d37fef38c163764203c6183fa74a7c84be904f626afdf00338be6c95b009acaa2ba6eddfe5af71bc539474dcb761624ef144473a984a87c84969cf3d3fc34b6824291a3c27deffbe4f9e59220fdf55301a5762ed78bee578dad52e322ba7ab21670f5c97b07a870e9feead57d84cbcf4e1d286c234e372db920b72ba9b3e35a09c609d37a80b7375ea8c5ac4392e0160edbc9d00f14197b81a12811eb70e4fac6a25c46536172abbd87e46b15b0f8b3de71d8ef0da5ebad819f245a6a9a1620c7965b969822814a812ce5b656576c25276fd41da14c4450438b4a599967fd7897228648bb5c5990440847f2a80ec0e6943659e06cafb9e021f5f8841a92e14ebfd76ad13f77721960aa69c46d4f8d748f55c8dbb22892f9a75fbd8e4073883fac1587c486fc41427163e9902882285b835ebf64244f85e96e3917ccbdb258b7d67d5b9734637da7f0f535ea6c5f28081ab19c1e359d095bd10275c3e4b7b933e96f64cdca355db669beed37ab2f1316bfeeed6e689973bd6a5c860847fc40503f7c21dcbafa880a46216e0c678a6fe3ed7721d93fbd7b7aa497970e7a08748953241148892b72f000dd36dd13e9950c1ddae7f32d8177301a54474add64dc4bcee7b1a5a730a5144442d62e42d5390bdb9a9e20a47e0d6a26030541f489de13fd379158b7a2a4f36ae2da7476d5b24fb126b306471b948572345f8851fff07e88a42ef61d19e8f9ff4da24422539764091fd4f887e2a31e6968c482782fb9e7dbbde8e259dee7b46be3dc21d7d76ec57de6629be95bbfa18600c2d4c9a1a0ec70e56dc1e09a37af5b35c671f9e99f007a0aea44ede MD = 7fcf34ae19d002775dc86151d66094e11a187478577687c4ae76ce6e2c8666036d095c3a93c1b4332f6967a65f699f0a Len = 47752 Msg = a54714c1e89bfe9406c536069c79f18d1ef2d055d3e305d921b1b8b10bdfa9aaf8ca161cb696df78be68e821bad5bf7d449b7f4bf18ff4378ed7ffaba9593ce95473e35725edec19812c77e51aa86a13b7a05cf4340cb265c9d307a48f3ed2623fac42193d886d9fd679aafcc6d83b79fe6730f9a440878c5a0b9842c374b13d43ddfd0a074faa3246b74a0bc64f7ad4a15ac2014914bdd4cae97a2d4fe521a3e86cdad38a2beaf8584e1fbd20f36f4f29dfdcb52c709b64a0d3740e3a776cbcb5c2a21ccf02771c94a6f1b7deae620f1d6044bd543d68656433508d8d14d9af32471c8cdcbe97c4822788a408679a3f0544c3c0c9616dfe9f70d4514fa3afa5e76312ccbb459319ab3aac2aa40660056af3216794c6f258d8f2c903880c37c55d7f4a847481b342964524f1bc72fc89d2d52659bc523e9a9721f64a4137b9381b018e5b0d583e67cbb2b9a25795b6f4c8529a3e49ef9bed646525cf810c7c25a953a4f990b47eb2d3e733e57e56d56ed1d244c044844f79c8261c3a5073cab590db5407047cb949354e5a61389da31e77bded85b4f9a3654acca432b654e90f5703682d72983854794df5bf8d52662d417b5d35a136dfda73bf855fbc97225d8632a612e1ef43fc284ecea6855e67c3b7745c7913224bffc967876a6924bdc4a6cfd85f596b2168c9b8abbf29a7ee066210b2f913a72ffdd62d72fbc6e3026e3e44c4bbe3f31cc2e4f355b280164321c9b8265ca8acd2fb22770db9d9bc3983d6f833cf85707a2f016794269293ad3a75d2824adb1a7d2233ae214dac98a92af653ec4349c884d9a97c2fc46807757aecc88c6db3d7789a933b765e475d9b8c27bdb9be37e482e8639af0330958e408b8000d6a38cc0b8aca84d495b0f557d1f09e60e856acbc84b8299d1b7d70400d60e4ccec72e17e1a5ef3039af1462520da5eaa6aae0879d32f91ff26cd35d1b06dda93996aff1874d9efca14123a4da16c655fec47e10300503adefa0091e11a664c2819270c22bdc3dff3ac19b8167e2e1c47152a1da031a38c023f1e6bb672d3a15415b1f1e420a22d440910a7cadca8e9298e5ea6998fb1f0329e30aa99e13d41df351197a6c3004086d4fef1afe66335cffeeb62364101cc38be3d38d28f2b9491204ee5b0ce648080b4ec7d0dc1e669ff0eda3bbe6f1b89da494dfca9a32502327f70c2496a5755fc52e1332e98b9eb826632187b438890e1e469de6645b3f389f98018bbbf6027c055e5fb5991652520adfbe0b3e3cf48143997c6509f5ecf5f3784ce4cf4075e966600bdd5d4717da08c3d7daf7778183df0e19cb0d6adfe7ce087cc4531d462442d3b61eb8a655dccaa01d6b7280c6a22b14f48ce1529e8a89d8efaeea0509c92519dcfe3dbca2c6ab04ed3121d12a58d23e8b3f28258f5ab16a3408e6602724a7b2ff005ee265243452d5c0a80123044eeb4c36445c48e4cf2cd866eae724d3252f8aa98ec04371f12a559e57694750fbbbb616b87f51954da15b4d79e2996147f00e6e6fce943c6bebeb2ec2921dbb8320676517072008c7581b20f5eaeb3b6a94f8d35475fdefff2805067c140ca05fa9ce85c27c3a9b96c1c685e17890ee079ee85cef5ed709356f4199e657aaac0bc85a1d5d5707ea666ebbe0ef1430d5c96e4b8f92d1c614b9121f6d83e56e4af1fca8704a101e51a0cf89d6613631af1aa390cfe177219ed4c10cf5f745cde9bcc728430b4ff48dc064aebada6719c665af56b24dc7900412ec78d792e14014b6a857fa235f20eb5fbe9922cd1f6fb845021bcb4a4b97e11e050166f9407b589a20c5fa34d609f6d93de782bbd799e1334c5e7f696b9fc2309b35489d0bc631b1c0d0e7924d363cc773087f19182efdbade7d332db01e04052f62e0e07bb71ca7f93736ce1d2c29a4fe7a5c8769955a364916ab09a19943063238b48648d495e73a376c6ade6249ec20cbcf69447383501ca93b7fc8a7ebbe341557d0cb9519fa247ffcdaf95f1a179a5b3c4121300572b9b369129da08a97b5973f62ac7f355b186f6cb106a916b1cbd727a198616d28a0a3c84489499c1d272cdfbe44096474b694306f7ea6cc45259e160d026e06dc7228bd9823d98cc91944bd362aba13e16f6cfc78d9fea74c383e8be607ec7f28ae80cd8fe5f6f935fc7d5c8cd907e02ba378055f910744218426fdbf01334277a66a7c8e58185dbe51453204d77945be0343ffa64c570f7f99f5e00a96f8dd640a345f35e2c426fca82ad2409e94b1130f4f5fcf647485b0da09d75b3193bc584a7cc9f92e70e16b71acb1c2a6d0beb517f88a4d61d6236fd5014823599a7bded7b2615a83a519754e39550d78c3cb2ecdde23a2dcf285070b4ac6f577838852326399dc9ad73bb48e5f40739cd462ea817e90622e600710fd64b83433d55e7cfb0ef7e1dc9dc4a3c28ce8b78b892272e33874fdee9546082bdda071e7068a999222e02cb15f50cd7b50d22bbd58665253ca35f89608be6707142431399d8942883e06ffc1a24c8c29397152aad8baf3637247c4ad30dcb82fb697f47410d7025dbec0ed75ed248a4ca56acefc70acf092ef4ef49cb42d75f623903e5ef6f0537323a27856b68522663302e2fab698b4528fa00afd092d1afae9916132c661a0791b2022dc94caff0650fe515e212ac922e1ef6a46865831ce77002f97f5a793cff3ce6f8fee827a9d8da17c6f36bfa9a47481b4f1d23b34c16a80dc170b3e87f85c01d0e94a381f9c4790d6d66de3c027b60b5d976342ae74328809087d930782a26ed9613e4878a32d30f30c4d13c75d24e0d69fb00b09674d8a3914d3419cef6569fb80115ff0129d2643794aec09955fa6b2835f00d01b3a0bde9492c6a2af1387a9ee89db209b25d56ab5edc91160b4d163eab6a08cf076818c3042aed3324b5c86d4fe46848d45c2bb4abc37795fd2d58d2e5d76aa87918fa450494689296b3cf50bf52e86697b82c7901cb39be3183770c6ca0fb360f98ac97d3d4a4ee4f1bd96dbf4ffc0c0357a123eb5ca138b138bc15c72b831ed3d076e2f95069f058d62cecd7436ae22122d2d9eede75ac85326f157ee2ca0bcda99f4efc727e40b8cb10f68f96fb8ff80106c494b97ec1b35bd8331a2c97a30409710266a1ad8577e1cfb370b077bc90dd870c64558420459a3f982270b48e80da3227be44bc679e02b04a01f9a610f29c9bd8e61b4f7042d6eb6c1e18e77549022be48dc574903415fae3cada503425288b50a371a65ab3f925d6978bf900686ba4625a8b9da54101f6a854b93ccf31679f9e22c052869fea35fe1431b2d6e4fbe4c8adfeff51ceb0ecbf26ff338a1f431ee7eb711c9b0e91630d1d72d9a0c59c353f0e86613ae1092350c915fd0df6a3525687eac94209d6f72b3ab638051335ddef068b8d0885f4e584c36162ffbe6e81107d95242296a1387ff46595aed7ad25ff1c754964bf5978829e4d2a08808ef44055d9f4e4c0da6f32d2e7b94219ee5598d9ac5ef699202573e1401cd143eaf30c981d002f8c69e46b5da46c6adfdfb5e1c49894651a32347f15a201020f6ac59ccdcb11ac0436df531b0575ce33688d0365a2b2594a75edcdc1daa143ecf6b4197c4aef022f2aa81296709e151c7124254430827c32d298866d52c43ae37606ab2e0262da152b86cf564eade8a3e2c370eaacca73d9317cd1a2713292fbd20479695b32dcbf22c3b3e1086beecea3b20cde7c53e9487be2d7e69fb2f13df2f6acb8bd26af34f8a5e5c104a0d0a79d3920a80ae584859612c0c4440e00afbf246ba09008fc7c93758d7eac143536b6a0d4d1bc48ec9a6c54b3c1c80c665b1fd5dfab3c9e6aa0dd7ad59e678ec682d72e51e0fc43ca8ee4f0d8679475cb49fb53306029b1a2a7bdfee3ab9cd82b93e92cbf5d319fc66ae52d583d0e10d9803ce48547bf084b991a47df2db5b80b71d2e246d0c224873559555bcb9fa73608c8d106e9676d0e7fde9ef2aa19f70e257c980cc2199ab6f727ae089aaf008ae98962ddcd87a69360f04b44ac305dddb6cd963cbb9dc9fab937818831a7e57e2b66de2f7c897c81443896fcba62b1202caf23fc41b679fc8271150318ed1cb9d7468f277cd3b781339ec7425d17bd7e8f098974decc71645abdb4a0d8eb6de4f513bbea57cf1f3a360a25401bb747a0e8c20ece19477ad94903a487f808a2a78bb4aba394e37b555464f91b7faa182e3ec4fb2f7a905c03582b2ee100ab81a9a311a778bc79957996948bfe0e58f8cf9af698c18a0ddf8b8e1d9ad6793ed4934412f69156f8334f0282230f522aae2b03402cacd027ca19f4c1308dea28610c779fe217eac81e7ea3170976d28604eb818a0118d546e75490ff382fdbd1f1bd43a0b13201511eaf7e39845c16d5c0b71cbc5d2c1fd3fce56cc0f9e3d4a14b4eb0fdac0922fafb8a9dd1dee9a780ab36ddbf89103834d27390eabcd25e003966c69e1bc5d52d7cb607c85d440ced8d11cb79cdeda8d331a70267c923005681ad8e6b468da2526adcc4044a96cd862ef0efd370ebf517e129cc1d68ff430beccd0f4d748a12cf8da3dd6fed0673b255794fb5bc31a967a9a0f6f6e18eae87426b512aefe4ac0dadb459f08dbd85d8cc57f508f7e84b2d52b586d97bf7c9324b325decfdc2f87492b6406e73e28b625930e9b26a3764d0a50f86ad7f631c75cec73a79e74c7f6d03529ad3e89e0db7c5ad319d5d477bb86757fd5c35f930b695d5f0bbf5acc85eca3070063219943fd775d7af173f184d6334f4cde5e28c5e660288986e075cb0adf7c9ef997aa7625931e3d2e248c4f6604f72e8d745b8d60af609fa9c88c1cc7550ae7667eacf8811885bed048a051e254f7f95534b3d85495a7bc8c5548118eae22683e2909319c92349e8c62c662a7bdd23bca01ca2d2ead6e7ea329624fed35639fe54957b7d47a9b4ab70576c832aa1674507df6f27b71154472b7430e5f953efcf03200f1c54c3a51d4a32a191fa425218d0bd2deb76b4cac9f7162f35258251de385ad85fb71923289ce68cbcb369ed1e43dd6385f0665157e0a5a8551d8a66133a6a5dac3a5236b3ad9ab56d1cbd3f3da768995fedd0f2d92c4924afa91537575379266ca316e6a7c677a50afee7505e468557e0359ab43824292aaa93c8ca90c9afbc08bb0f3cea2fa5e3fd218e286a665d26708f6ba05a106e42aea24d29a8e533a6e64ae33f65304bf7ac4d5bd04750178d77c4ebbc28383ff4239d4c5c85ef2e6c70183af80011916a814af54fdf4cdc155d9dc3128ae3c5c9724d6c69112fc7970decbd6da419a0c3e2df06ad18a1d4448bdf9baa695b2848017a565a32ec27ae248f13a83791a08a39d633f2dc9926a567551a8aabe68ffa39ebb237d27075391fcae5b1a2c1b948edf52627127afbbd5ac6e9bc3acd2265826a2706d801dac16563db8ecef1118366058754a28d7a16cdf9b048fc580b1345bd5dd12ce87ecd5e229c49a269d3c60ccdfd7f731acc3726b71634dbce6f8ce8adfd9fb66d88e572d1d1ea05702596471731b26f6918a8cfc8c38abe797956d502af795ed7219109362177e1502f7d7fa9cbf47dc187f22ef460528c9f4efb72841a660c70705a8b1b35fa1d4f1a021c4c724e856c419cad0395922f89190329fbe76ea87e9ec76046b47aa1b60eae86c8cec670b06d2eb2bc09548e7f00f4612ebd991a4ad261f07f470055cd320725e5886724d63330a7e8659f91c82b5881e645f04a1c35aea490969321dbaf97626b48368a25bc2bf34f507c20aec3b6f3eb277a203cef38e240483bed2aade6a321b53d8ae730a7feb973f12377f0971e050a3f85f1278713560600a100537a51d078830d62b72a30ee7509826cd9826afc96485f840521a09b77eb25a6c9ddd5403910f9e0773ef1b500c925d5a7ff3f97749c983db290efd744036164389795399fed38a79b6aa9d8b93bf5fa8196059f4c431664565c6ad114513d81c82efb835221b0ff4937c01d4a66d82290d024ddc546c341180b785390dba247a02c6ee5fbb44b32a92b9e4d5b52b797fc34041688ac851c2127802360ab76fce919552942afef87e5d0ab3093087b9fec4b0e153d7d463c9938ec0a2bc9a3e9ca7b1a15ce19864522ae508d9b8f0a83889ba8a18bc2edeaa7c423d0993b0f566cdc247248faf7b58b4bf32d1aef4e8bfaae3b811a82626e73558d3d530ba48af6c3db07575a2a1f4531fed9b9312efe670c307e93c58d1026729219014148cf91b9a79ea44207cb7be8d757205c9126fa3bed609e935618e8a49a2b4be3e56b6545f0fdd6b9760053f6e86ff6786149d8c5dcefe2f5a5cde0710d3cd7fb62a799ef1eed96c85f07f5e597ebe48e85b02c3264f208f26278376453145090a7cb563f99368c76aa288a3d4e9291a4e5a31c08ec33b79375611402d47b5cab9c1fc3becaa05fcb3fab3a84742ba6c56969d0d1de7898dfc6d0a0d5f939a35329eb09f317f3b8cf06d82c44707fcaf6f94c7114a18a53de3d0d03642815ce9036764f66e9f63e8be8f78904ac56a6417d92275a9d318f98c35f6437cad9856aab09bea0a9729a06cb4f784d8f77e1addd84192a3a34f4163e10ebd7484b6fea70ec7e28bd307348992922a681ac2442016a700ce05d2b5f9866c2cb083435176d67b6868ff5725a38cdaf97eabb1709d18c5388f772dc7bb7aa0e9b745b7ffa8bc28e43858c3f43928346a8336d61093631eb27e73caf738523fad0f38af499b0442fe609bc810b8d930f62c28aab4b16a3607018834a4ee81babf1ec873cfec536c1f7824ce0bb1344334c00da9cd55b28d9ecf30f5814cad84c86c91b0031b3e06bff5805065a0be0daef5524ddb1eb097e21dea77fcd12a30317f10ee838608a5685f2af98f05cad2bd12a3215e7b08e789942156782a8c4f82dcc289b1db67caa11ba124186f0f44f7ce5caed7d90feefdc881fb93b7483554fc231c2e89cfd8e2b17f5a722aefc6e78f0b50d7d75a30a70168e1dfe5d283f063bf0049ff9572a5c712172cf7e0fae4bb1bb1cee46c3f2df56293ad54efae0d99f2e0a4cb7d0a72b315f4b9248733a7f92a3c3d9eba7cfb1aebab9c72c42605056b37bf6bdb12d21bd75da75f471389cf937a9454b97c86c880741dce049e7f3c84700a6f342e3c47e2bc67f6b51d128503d773a50da059a4bda7b1d52549c4b5eb2416341caf29fdc4bb7b8935b2cadfe7ed4c1e1baafc25ff90f916aaea7df7ebbe5358f938237409b572955d772b26bc269e0e67dee6d2c2ca441119e3137912c9524c5e3ba1610e54bd99a0ccac0ffd1dda1486ce9221a3de2332d6b62dc00cbf839cb03c2c3b6ef3ed048435d5e2272d90cedcfc96991f27371a75e61553261b77b893bc3c69882d61748c452143c6f0528beeeb5caf915fc0368bf572a8eb579f3e8d2e5a82065bbb583d7d26ab58e08fda310d6ceba6c28ef57d66be47e91e7a7ce124ff0b46296b2e0c405e9f5988b93857f54fc3cc09c3f5beac60a68bba8a124412a26be3f0f1746d21218645435f34a8156dde7d803fb5e448f24b6fc65e9d3a89dd2a5c5cdeb9f4a227f6b8caf24dc5f04f7247e0329472defbbcf1cc685c28fd17dd1bc7936d2745ca77006a02e216187d5597844d3feeb0e561be3727fd83dedaeaaecba01c798e917dd8bb11a03ce07fcf08f6f006ac6137d021912dffffc1aee981c395366fef05718e38aef69f0abf64f8b2cb9750826b8ec854dab1e1280c403169e3497ee9af08bd6d2b53a0d9c49e034220506f7719041f0cced1cc846b853a090ac42af0f699c2c3174606e02800952faec06dd198c692237ace3669552f083b7c44f8a764ab5ac5135c25b042034ac5c765b004935cde335f15a34941b4287bc83a6c7f71c3d20d7ff481bcab3c80beeaceea92711d3fb6ec3697a6c9ab27347f22faebc669c4e6edbdaf87dc12d375b95a71fdbaae4318b2af87f4457a611ff17d386eab039febcd0603845d0caf849396eac8e88694e342eef8c45db87278dfc7899ac837efa69e6c224496a091661a12c966831c81b10d836e996adbe7e98a9072d2865d2091e25e804b21651584ad4c726902f6b5dc82fb6de6156b1dec924698b86e19df28396bb20a75d0b87acda29a42f0ab8df033b55b3cb5cca0ec87784fbef7c487e3f4021bf51c59d6b31bc38586c4819686a05fcaffe4970d83caa42c48bc03975fb2c032bd8d870cc7f81de897073f5bfa594941b22a40a02cec38a308134d99f5e604aaa631eec723e3102816212b3ad5bf1033f5ef6025525cc4385fa6090c311e6dc851a1e792517d58c866baebdfa34223363dbc6bf99eacc570c1dcdc7abbbc6a304266080acb17463e1b3ce7a6eda310acfc19ca996c4ccad0d1302e41d0506866eaf6c67d0b61671da61fa MD = e796373a85f5a0372d9d6ec70acde59b60174d4298718ef9b3eeb0222fc6c182f04706a2014f8608592493c3e7ecca4f Len = 48544 Msg = 46ce506d593c4ed53c82edeb602037e0485befbee03f7f930fe532d18ff2a3f5fd6076672c8145a1bf40dd94f7abab47c9ae71c234213d2ad1069c2dac0b0ba15257ae672b8245960ae55bd50315c0097daa3a318745788d70d14706910809ca6e396237fe4934fa46f9ce782d66606d8bd6b2d283b1160513ce9c24e9f084b97891f99d4cdefc169a029e431ca772ba1bba426fce6f01d8e286014e5acc66b799e4db62bd4783322f8a32ff78e0de3957df50ce10871f4e0680df4e8ca3960af9bc6f4efa8eb3962d18f474eb178c3265cc46b8f2ff5ab1a7449fea297dfcfabfa01f28abbb7289bb354b691b5664ec6d098af51be19947ec5ba7ebd66380d1141953ba78d4aa5401679fa7b0a44db1981f864d3535c45afe4c61183d5b0ad51fae71ca07e34240283959f7530a32c70d95a088e501c230059f333b0670825009e7e22103ef22935830df1fac8ef877f5f3426dd54f7d1128dd871ad9a7d088f94c0e8712013295b8d69ae7623b880978c2d3c6ad26dc478f8dc47f5c0adcc618665dc3dc205a9071b2f2191e16cac5bd89bb59148fc719633752303aa08e518dbc389f0a5482caaa4c507b8729a6f3edd061efb39026cecc6399f51971cf7381d605e144a5928c8c2d1ad7467b05da2f202f4f3234e1aff19a0198a28685721c3d2d52311c721e3fdcbaf30214cdc3acff8c433880e104fb63f2df7ce69a97857819ba7ac00ac8eae1969764fde8f68cf8e0916d7e0c151147d4944f99f42ae50f30e1c79a42d2b6c5188d133d3cbbf69094027b354b295ccd0f7dc5a87d73638bd98ebfb00383ca0fa69cb8dcb35a12510e5e07ad8789047d0b63841a1bb928737e8b0a0c33254f47aa8bfbe3341a09c2b76dbcefa67e30df300d34f7b8465c4f869e51b6bcfe6cf68b238359a645036bf7f63f02924e087ce7457e483b6025a859903cb484574aa3b12cf946f32127d537c33bee3141b5db96d10a148c50ae045f287210757710d6846e04b202f79e87dd9a56bc6da15f84a77a7f63935e1dee00309cd276a8e7176cb04da6bb0e9009534438732cb42d008008853d38d19beba46e61006e30f7efd1bc7c2906b024e4ff898a1b58c448d68b43c6ab63f34f85b3ac6aa4475867e51b583844cb23829f4b30f4bdd817d88e2ef3e7b4fc0a624395b05ec5e8686082b24d29fef2b0d3c29e031d5f94f504b1d3df9361eb5ffbadb242e66c39a8094cfe62f85f639f3fd65fc8ae0c74a8f4c6e1d070b9183a434c722caaa0225f8bcd68614d6f0738ed62f8484ec96077d155c08e26c46be262a73e3551698bd70d8d5610cf37c4c306eed04ba6a040a9c3e6d7e15e8acda17f477c2484cf5c56b813313927be8387b1024f995e98fc87f1029091c01424bdc2b296c2eadb7d25b3e762a2fd0c2dcd1727ddf91db97c5984305265f3695a7f5472f2d72c94d68c27914f14f82aa8dd5fe4e2348b0ca967a3f98626a091552f5d0ffa2bf10350d23c996256c01fdeffb2c2c612519869f877e4929c6e95ff15040f1485e22ed14119880232fef3b57b3848f15b1766a5552879df8f067c3e7972fcaaaea61f421fe7e6966e5aaf179818feccd7847c46c7dd40d5c70f4efca2cf5d236fe6de8cb5cd3988d37b5aeb9f7b6cbd4e41e43294bec2dc0b321320d942bbe78e4a71954bf40b3f290afc19d8881b2d87f6a65304f4865d2517d49266f39d5ed379e2472984e32338ae9e888b6892854b4ac88f61a714bedb65993a910b8bf0081c398996a44a9cc71046220042592b62e554d0f1fef569f6c46800a2b20d05f3da7c42dc7cc712a0d7ffce7f3ff989947051fdfe22b0c43ede4bcce00fac055e5cb55c4135e2ed89acce744f87f905a993c8fece3bcd397a584986944bef580f4aebbe0ef723954b37bdfdb941e10968f5c0bba970d52f74dd6a16068d5f66ce4b27508ae91373ae1fd34f05963afc9a3f411bd9e94f0ef213b7647efe8297650770faff3439ed790d18537bad8a4607185409a5cfc33dbda2375844c6e3549a27cea4b3ff1d6c76a895f162af5c4f7729ff6a544ab9269d33f3db9f0c070337534936ef7348596b99511204c3357eb21a4c272f81ba30596ef1d3d9f8780e0232ea98fbb8411a2187549ca7129f3d7f9243287e9d4dc3bbfa3b2a38b4bddbc46db8b31ff59019601ba77994c321f4a839eb5589c5fb478980d9c605655ed444abbb6da353bebceffd518f13ff4409f3b84c9697224b248ca7d1918736e35f4c95fcafcef9526d98d45ac86bee8ee529b76ed4f1dcc5c38c182d71084dd5e6a2d38262ea0fd4932148cb0ae6b789f012dd5af5e01af18a517af550ced2bcd00f0c566c3dbfcd955303ab3fca83bd9275d317e3aa0458e2a2762f1522ee1e855be87eb7102fc4ddf6aa024e6079b1341b41ad8497c3813448b4e5a84cc8856d4e110429aa8741d2d2e8d91ff0c2ed3ccdcd25c2f17ff4e60cdb1ef1948a78f0b02cefac55f0ccdcae62379ac285f91451228684fe5f3a62b493e3d74259807648e448275792ee6354c324a71deb5e226fe6d8b1088cda0e08863b459d602467dfde1681f9942ecf8ab1a82e4b1ca3d0f1c22333552e5c54d25a2e20eec4ec2b3dc561a4831e158919d4cc17923f50859d5d70f12d6c499bd8b7c4517db0602a2a3f32773d5a2af7c9d6974a3b7ceda83d60c6d3da6e284ae34606c0924a09cc6ef490e26e6ef582615c12af8dfc03a397722ec1a35d81cbbbaefb5575ba6e7ad08e83cd6082fe92ab11432fd2e719dd743cafa3cf61dd852898abf96d29179a1ab2132059bfce906d9a34b05065b8be9b655161a7a1c2e0f2ac1f92c4bf8d96120a49c3a24cece270a2ed1b519c67aed6961ce47346bb44e0915e09c0a357d4813e2c9f8352e0f27ccf74591bb7ae15eb7719127b774d19bcf07047aafefdbe2ef6c49a43f9332759c9d351f6dc155ba3af4fd4065d02c74c705e33caf708bae3d91a9d2c686ce8ce3912ea2c3425e8c6e7c7135d1f61b659ba2fb467b7ff32668f359184c8139fa4c7370e04e665251cc687b5c9e7f24faa75ebb4ca656a8d80c11e5c9440b0b3a31a4ca4c51a5e786cf599a390da3ef8094a9b1a3c2ad233f917dbe8a4f9cc8c93db5893b8fa964a801b04c6fa22cc1a3ce146ce032ebd8c9938761bfc1bee923cb164c525ab97041ee1d10551e7241e0ce1f4b76798b60028cdf6dfe3cd9f2d664577215458e90c0fef0747db50cf6a41f3adbfb29042f76d7d641ba33766c5d83f998f8c2712cc1becae76e2865468a3be7acd2a40ebd931f1c7b78282cbc25b46d2f716409caa0981cf79acb13b7ff9eb62ca19ce380e3cd0279ac9d6568cb7022b413acc0f10a355713881f70d160d216e9cc562b1fe56c38daebf5a908bb41cab5640f3f165af119c9bab835197a509a52c7725df114772ffdaae370027193c5b1c70dccc11f65c588a717b8f698a4a0f62763e49b0d6848806dc942fc9b009417c12b0277c40dfaeed1a0850f4848db4260cd67841cda22d1a929aa3d73f2c675e6d968b0e5541a5acef511aa05b7a9d617f15f22ef273f8ff1871e6bb8f4cd5abcab77f2ffc2b46af387f78d5d6b8d1f9182241dd0ea0f09bb64080db68129249713b8b47ff4598de3db9effbbef058d81f26ecb8e8d01dd7b42ff7a19226a622aa4937be2436a3224528097adbc93be4dc487c254aac889c5968d574d42f191dbd090cfc34a76f6199f34dbaf5ec810796b1788efadb38d0ef10a1bbf7d6f321f1a49169f63f058582444324d40032289788685ac106355cbc52e4e0c4c23d1890424f6d34a76c744640741e3fae572f25f6d5f167d588290954254a009bffe9e00acc71b486ac182d116711009ef603892346bbb4ef381e1d3eec61760b3f7c2a2592db3f85ce5781dfa466dd771a8e0b36432070fd4d224239c28dedb807b9b5bb29159d4cd81b88d1b4839fe2c8b7f258548862a6d01fbe6d2d362c4a5e88cbf317859682d54b8c101ed20e860a6688b0025b5393c8fcda01b7c4fc6a4dd1b2f5e695f2cfcacfd3c36ab9f10ce7831367d4010b6c3da1de1de89f25c0da7cb3ea1dac78ddc18fa51321a2111b68f7dca453e252d838f612eb472f6ff3107116fa4531f151c1724c28caf4375c93a82b900566f07fbfe2bd905cdda2acf498234ce58e26d6d3620f29ed172976727f485374f6ac0add502937af0f859290d92209852adc12fe47353f1373b0120d647a1428f84f2197259c06c92ee14eeb1d5a58ae6ddead4a070791c37093d86a400afba8d6a16bf74a5f2531a37e870d4a1462e6bff350bf8bcd4885769c6f93f940317cf66a9104a7babd6fd524e6ff4a984eb888e2a366bbcf8be1ed9180907964de2cc2723ac624f4f60c2b9b12c8032e45a930744d467f5483603d3bb267a6be2940a0810f46aa57f78f0faab4705f1e6f431f71f767c0a65789ce62ae226a963b41fa5eb88b1f29e980e81b740045aff30dbea148d2640b30e408ce1cc9ac333cb737d2dc9d6db3f3681db4f97f9c2afa8f73cbe98e55cc36fa5446a26254de5328bfa523857a3d3ecd183eecf54ed7ab52a7b981a3793090521893ebf749dfa81efa9f374a300ff23a4080f46a42fe2fddc331b91aba816775bd7d9d8f757e64205087bdf475703634fd44bae760e7adb82dfc39faff05e2e9accc6133bf03afb72927608c33aa3245b750e67390da4e6c4fe2a84b2f062a384c48deea0fb5b069ed45c61951030ff4d66d1f17ba1e3a8090aaae1634ca66e904b9bdbc4ddd90c104aa97a3b7c4f5c9c2630ddac6fc987c571ef462f59abf853ee6a5b161c37644d61e7c334d340b4de4fa59c49cbc90e90e0422375abd5d9361983fd234af8b7ccb691ccffb9d7a07a2faabdd25a64c4e1c25e09d4b7d679bd5973326ace9f7f04c522182a9456980652aaa2e4701f133e949d49db020062601ab28b5b2b8e128bfa230513f75013e9653ffbeeb17aa20dd37a93e71ef61bb4f9cc6882f6671ad8e21f446a5756acb9b3d5295fa2e9d9e60b905897732a1e22631b6a60939d1061f971268c38dcbafdeb04abc5a8ff234da959184a831ed23ee33a0172a7a26bbdccc35bf81054c70c5748f3af582d26bb394f439ed336e07106b2be478709b552c880354c8241798ba50ca17b14e65ca537ed6b02f824b15f29e0014dd65555b7692242e7e3451af240ea35c783dd2d9221be1f05464add6fd97c7af409f7f5524b341558d7b253b6b74c110319542208933bb014522bcd0991d27be88673fcb9db302d2db42b9c6f64bcd3bc49fdc28ee8d0cebeb039f8d2ff7c8489f05bd46495a0eac52d035d72f5a6ee518a3c978baf27db62d517f9525ee53556cc1234e906f0eebd96fc2f77d6b4d1717e93098562ab56bf252836ee5ca70eed7e39669dabca998576588ac484411d9a8b83a1128fd5d122450d4a2d553c619c8b240218f0788bab6fbae81f9ae6331b35a0e6a9a331db1aa9199b95f50fee0277749fd17195259dd795cfbf671eb292115d62b13939c526c5efb39ea8bbf4bdc7bd985dabab07db427bca4a85550c8d832b7ddfbe683fc52fe22acddcab261d003164241b14a2f234cf30377223b16c1f8db07b9f479b844bb3599a2d67f2ae95a2bbbb2c8c77612322ca0cc9f531cc4b16a31b785278d2adb5d89a077cdae10c73e7896c5d05b691f8d040d9541e1caa38be35c613583eca7c1033f7444f62e91780256710ce5105c3eb6a4cdac6db91867a6104f4aa272678a8fe7978d09290100e05894241cef31683ef70c3dc97b5626013b190ef3a463dfb500a650efeb5fff9a06f6bf08efe53325701d9cfcf6a5ef7d45852b7d6be2e9fef26a34b15af39cb9c75e86b2f6c2c6f275c7700e144feaa0975c4648ad2ecff126abe256600400c402962021ed0e4a2d70d16108bb9b41f597650a5d548dba17023102e6e4db52432164375dbd12e65fc80419f1d5d01901ae6a1cc34648d2f6efc33b6acdc1bbbf8b91706f4c16c30fe5283dd149379d4e443127826da63e18562b35e805fc63bfa8e5755e846208c52f0578b1ff18f263c284d1a3aff127059d2f996b73d471cbe027ee324c3dde090e626f98dfbb43c88e29c22df66fb4432e980ff8ff930d6b9b2182f48bf16d64ea08cd8ed167b60612e8a328296a0e5c6f2d3e99917f61284199daab2bc4dc5d2bc0389bbd6573a4b58b1c9d30285cd8cab8cf5511e292893a589e5f13ff547d395058c88bfea32aded8d493f3f2c73da6ff69356702cb17ee2675182be9fc4a7c80d71c23776e20f7997412590f77156accb53f7c283258c6ca07df5bccfd4e5d1a5aa06d1bfb0f6794a3224cc993e780e55b7d369befd6280efdbb8bee7e1142e48c5a5231737f96920accb466443c4f1202f77ea52b197db8ffb5a399a81a94a81254b800fdf6ec5a5117772fb19b3f1d52b43d8c0ea72e91b4d48b13a3f1bc2c979689d1c2fed1b61f0c7e6c038cb8ccf5bc5999bf0aa161c5202ca4961e2039c126abecea1ead6c1cb1b165619722e99017bc1467ca40f0d9a16c96a9292a96380e08999cdfe845f110f861f445e53acece4c452d6d72059960342f069b410da556862000c7ea0946313caae31d698854e7f3733a7d9e6aad646db9d2fccc64b0040fc83f601b80c21a638657a8179acd6d97e8b5822ee5bcb5fd7a38d2356400228adb8132e4710ed5573e786c553adf6522eac702893f6e5ccebb5ea7e3d53eb7de9fedc3aba6d26afe196df38c2e32d97bc2988717406d60c6c36c023e7f11ccf55dac9ed9e5b5df42615fc5253f6fd08ab84f9840af5ec9cfdc8b6cae292268b65ce548d7f75f3e0a5c756886353e53371315be6c55eca0d04ce36c9b9d199309e6c14a0ca4798f3d54d86619d846696a1d117f03fbbdecb05c9b8a6da19d55d641682ddfb3abd8c58faf4745f0301a0b1c6c666d6779b55954db4e8cfe56b705b60179baee9c23895623917144a36e02594df81262c903b27ccd41617cedc07f8db5b4041bf57771f05cce079d486e371cddbf5bb355dfa31b96ea52e20a792a0eab6824035ddd65a781856ec3c72193ad4342ae24c450147b61d1c8fa54e8ef810c1c846e7d5b4dc1bb3f0e7ec790fc53a809747bbe5fede2547f2c8a7417b72dff598b24fdfc118731834f96f0c15b57349d1681ed131699977be45b110e685bada6a1ec84c59a410cd999d2ecbe99010e85fafef67478e8534d5a35d4d4eb533d8b2e8fbac0ce3773c954fb608f9c995f498aba848af916b07ef4df6570295dd8909ad648f496b08fdce8d9f73a4e674e722d7c3d5e826dd5951c236bed09c1a63e4e86d669dbf68799bd3457c996b304874a0dc9f7fc33eb1a39c78f5072c6ce1cb06a0b28834f84893bd428435bc4a9104b36d15d4db11996b29478a34eb579b3294990387704ae32cb8113b187e3649597bdfd995f2f8890f152ceee84d6ce8922ea0ca1a05c2c1ed302bf1a01585d9f966af4b218f55f905dc93b37fc71f6280116286ce5a127d5bd20d686b16bbdb5b0075fb0624ac71e5ec065889ece18182f958ca02d19c6ddefa3fdfe7f64ac604d5ae59c2478e8c35c01f4e852355ddf152fdf45620e32c0d353de88538a5127d52d2f7d46c5e906bf52916000eded071aacca646bc69206cff7212f1526d592b046e45baf7af370f07ce4f6903fef18a5d3f403308a0f354d596ef8ad805f29466dad3e49de2d88554794b4ea738b98206d062d99a1d1d7b43f6bed03e01875006c322ffb3bc0d6577a4aa2f6d1eb11f242a7e78e55ff736c72c315008e28fd440a1a35add7d3e25edfadc79da0340a831a803bf7ecc292ddba1c788ad1b6497b0e0e5947fc8f35d33c662bc52a910c3bbd3830bcaf41bb6fde1f1f8af3eae20e41b5a2b2f01c561c5a1cd657b5289e82f378cec5e6a5768aa87311e93aed4f636bb818d4fba1cda30178d13c8a2148c083e81efad9154b96dec0568defe718e454bec396674623cff821235af1a5925d362f2744cfbac3fb49b0f76059ffc6f8c370ace07a35df0709c0d49b31dc05c1d4f6f28912bb6521b1e9fb49c25ee0068176da9b7e9389b5fafdede694ed285425e485b3e841ba70de136a2f702cee78577755adb98ba940947f74226000837ff0a2eaa89a74495197d74dfcac9079b50a1b26007442c8109fef7439de3f9fa8ffd729526f7b9a2aa5ddab97beb20825650b547bf6e36d8de3f4f21256d00339182c4897b17f3564d1cc8ce8eebb23302fefe7058994211f2837f89510db379804495161a6a7a368e14cf8d784d3523e2f6ee888737d6b2e35608daa5389c42f8bd54b97981c6b9d9d07f84cc7211eb72e315eebfdc8d322d316ba396901316474793f21cd05156acfa2932f00ce0e03f4e051166f9ae163ca01862a986c06a189dc34e78e8b29393dc8d2687801ab8a4922c9f0111e1e59e2caf96529f2cc4d90a732d022d63071b01fbbdf74e37bb5f59fcf632a79116ce2191bd364ba0acf528142c6d30db279f04f597d3f9c08eabf006a5704d643059495f55a90ed489197 MD = 1a93eac31a9802d78492522fa021b98711d9334434ff3c45d8f3b441e1805e08dfc62237b1152c4b392ebf85ac39a04a Len = 49336 Msg = a799ef180d0ed9be2eb02583263b70211167613373bd2da4d8a86167b7cfdc689ca21ac38633b9358e4835cfcaaef7f271d08e7740883c2e1c34b48af80d229af9b46c3bd80eb78d89522ea31a60fe7fdd55a53dc95c6d8e1ec73368485e6dfc06f66ce9cb46deaf65f79666dcfa90b09d1e2fecd7e2caac268767696f6ac6760b91a233278433836a5ef780d923b26df854b4eb32c15a707b9fd7f634da34f04fad9682b36fc0f1e2b0d859d9846e9e381fbaa4a2a225c367350c756056c0521b70d13f38b08ce21314c259a4c5cb2ba3a6cb7eef2d348b30728c50bb857184b705dad07eee9f3c46b33ce8018dd2fc82126ee1e0098eb21f7de1ed0d104f6f6b92399f4dd202e9c4b4ce6eb98489f91c8a2c353fdf3b1e7c7f92b61e9e62f97f4077126d04bccfd24000539453fa0bbb378be3d25644b98f9f2811b6d8b30b3a361b93a52bd5d8bb7f5bff5aa22d18a54115516217b0699f062a689c66498ee59dad89bfef56ebc59866dad318280923cf52e8b6c98718f6db202299ef2c68c89cb55c81fa46ef3ab4a94dc75ef5c77d09c9109815d2adda4793a7751b65832b5cbc73b4f1adce60faadbefd1c9c39fb180232cea3981094720a5ff894fbc556044938207f936f8093f9963ef92346e52485b4211ae1296c830db2e9fff61890bde5128c4a01bae1a6163e529d94d88254db005923b5e0a9a2240812075f6323af1769c1fafe97cd5c8a1c01b1f6d61bd18b7c3e651d1d95f9d8c939523d8e550167a6883893ee8adddf9a13dd5227f8c31d92978920c876adb05d278898806fdc5d2fa7acc7a761509c1f4fc8afb5615119a92e36c7c995e9352ca4527823b867826de6fda2aa9add4a127e1b15679ea30828c91519083ad3ed9f7858e65e7acb5dc80fd32cdf7dae70dd687d8d25f6e2727931cd1e6dad93621c6a41e919fb2f77a9e8d86e2f52e896e7d5971dd7b336dd032e07dee135521c0c43b58a3c85bc56763bb26f8060b645988d11d0651bc6d32e886b624a1b38a2d8cb5ed0b05e998499ce0937bcf03e03585792abb877bbdb6206a0b192a86c7be6cae1c35bcef089786986cfc94aa85b8ffdc2b8b60e3c7e07714fd39f211732a008e96b261fe6eb7dd6d03e91b61dd2a5454afe482a724285911fd15bd1604c6d4c1cd1f997a5340edc908cfa7cc5f202f8d285571185b2452eb9b2acff7053b46022fcbd8055eb95426ec2eee3c7420fde0156c90c9c53ad10c47e7cf26ecfdf0aa4f458201d9979d111e754344b4a32be80788863dfaf26fee93db2f3834655134ac2b4c026c52251220313b87b93d461f6f37a5e774d19c2d0f8364ad7427e43bb6db8a798f7f88a481f15b47da45e900cd089458cb5ec2220b7f03f914ac261a0fd4b1f9ab863432c414173790536116a169c5f457009e78280c81adae78937a07b576e548ecb4676747f3c983fc6acb7cd9af5cb05d6d99d5da622d99f3b8b64eec3ddef049859cdbdb75601d9752b9cfd6d4f46fcbdbf1a5572a0b7fd4026935e77b4939f3245d926d10ade5baa54c0affcb5ddde2462a07014dc9b8600d0d6d35a3b67e901d143b6b6a0544ecff1cceb2f6fb831758bd8b7741eaec4e450d55656ba94696ec7b3754c608d394bc867b7eec40080170069317aae173e527037ee527841a7dfedd06c7c91b1a486a23a1d21fedd50728afde70fd3ff7cb3f6a5a437be972cbd0d43a22f7de717e846ec24b063762beef039df19d78e0770abc67febd4be7f71edb31f4b6a581bd97e26d4833cf498f3fcc7238100eb66ef5743875702dd286156c9ecb9a12c37c110903683d07e20e9744fbb30973f219ac2c3c463901db0f70f2d10626a8af408c5d15196693d49382178ad0de3b1c1d8b3ef3ff8c5a59e9ae286932d0c9ad91665922ea54d599e48cbeb03ff2e6acd10f46ffffcea9e7ab1957d7e01d1866e53b87ad399c5f9a4823950c5f0be92cdac4bea0c59472fcda6f1b9d8c8ff733b2885324a581945e54c354ef9c7dd50491381086ff524811de0bee3a969df8bc9fb96619bcc9166e80f858da96cd1cccaad5e722fbac9bbf5c7c4a2faccb9f69f35b1b0ccdb75843534f2b6dcc6e22fd7e2a9d0548e7d06dac3ca9fd2d9d5dc453f9fc7e76f0cc6552144719bbf5aa1f91a2cc9e75b8a8a563c9a8139787a64447f284df36f9f55cf404365ed3e7f49b7bdad06ee08366ef09afaf13791f2b6235f13ebf9c376592bf8b73bda2c9b509933f52f747dcadb3145b397d50c83fb6a462a480053d9f9f2b0679a6a6ff4dd27e4cceb7ea28df89fa68d1a1ad1765ba29c330d1007105dabd21c2ba6f0d219ea39f9e2165fc9eec4234f230fc813fd52c8f7e131c762aedec59e9695977f2c699846bd439cc4e42825c359badaa10a02343e6d6c7b191413f1b5823f4d423d2c6a79240e41c8035115af6525ed6aa93a47d058c80b7bb6d3be2997adf86274bc185bbe7d361b72c959dcee58eab4038369744b4e5fd1bda594c17ee68128faa008b4349b63055a185b129d59bac8406402f4ee055f625012db46dff2d1dcf760a44c2d6db0d0e3c481181a3243ee87667a16e8f5f47898a1fb8161dacfc6928553ea52fd06c2345735b80ceb6f6d000f3aa3e2260459bdda5c37ada5622df4967c584b524b257659deb81b8a258fd4eaa86283a1784ee64566336b5b745b451b895cbf74693fd050e3e1f0194d9a2b7c2d1d746d399f3b6b823c4205ec96ac9de1bf576c46596bc6aefb339fced72c4f329a5c922e94e5d31619daaab12751a3ec48ba41ccba6f42a6ce8c25928e00ea1da2e4193e750c058c93dc52ad565db512c190fbe1ac034d3321a1b28007ced557fdb4095389d78a4a72f005c76af85bbbf083a36f754f6ebdbe1d4e8089bf994973736a54196fe9ba7ebdcce7ad491e4f9f393f5d5e7c2dac6ba6017a5dfbbd5accc944286dfcaa427eecaef565798536945ada93afb21269f1e4d456cca9c9f1cf60a0b9cda5564c3c24b4dadbaf19d8988f79f9b018a65a1881cefc1cf2457846dd85ee8192743f7e0ee57c5714609e72802677a9d770e8a722f85595fdba56f7ebfcafd0ec8c830d5249c420d0e4eeecd4e8f5e116f87b6871584781f3b0f3aa300ce404db2680b197e89a800a2d31cc33c85ba1fec77c2116f9bb26fbadb72954bd756386cb9e3185cbe7bdebc1d0db47cc9131b764519bb9e09ace3e3b0a3b00174b3616024557c5f991209a2a31e1b5fe7fd96857649e0117cabfe3e154a7dc234cc4b254dde9ff7a82f13ff0bea628660ee13a291cf296a535411328fd368fe861578348ceb0da57a0780499def1460b24905461e05e2192c19ef6966db0c26e7335b1668074ff97d5fd0faff88bb7f5aa2fde871aab4ae6581cb3b50cdd1cbe68a763365bfd164208c788ba763d242c8906022431a1b8aae105730d438446df2af5c141c812c661211f9840bfcd35b9a75de6bf8d0814e6449f5d24786fe7d99f67f40e2d7db7fa074d67cb3b0391a3ee7cb2e096a805a069339a841464a8b5b1452425f3049218a4991ce252a9e1f245aa8f0fb44934e2380851b5802c317a47d6780f8370ffc0df4adf0e6c85ccae9331a5d54fb248b39968ab3d238f2930486319534388a5fca0aadad5f161fbe0c2571bb9cfacea1c7499d0a6645438e09e342f799d162dd3cfff32c249031590b96519449cffc223b1e4e778ad4507913091e10af8e03e4e5592125adc33c3c460a2c9fc1e7377d33891183965283e4be6c2578dbcb0817318aba02713bbad869f58516bbdcfb231f1e88d73f3c68516a80eba8a504c9e4c019204b054627add5ecdd919e2dd1a47c4316badc1e782fb5ebf32891e7c3ce1f88e677d08efd3d2854b8a8df363581c9ab3dd703652e001f01be6138d0a0338e6e8f117982b5f6bfc188b4f5a2a13b859b70943bad14531466bffaf05bc9d5bb1e9c9056adec7b2ab7c05e77dfaf424eb8517aeb52a5a9149f6a4e6ee5caf5243d618cfe8cfb2af7bc120dec69ba367366530398f26c62cdf06fe3fb1b0e42382fa05fe79c8c969522d03ba9cd4c789249f7c6db18d3107f1e13542b481e1d8589cb919848fb4e81a0ad706666e08939c7a22d18127452c68d0707760965179ac035ba873ee1a34b99ec3478e32108c853f4aee68bca7a22a1bd7671db9da0c65781433adaaa3561932f0077be5847cc9371e4acf130271210a939954b0249b6d430c439a8ef855200d86cd95520f6b4fa7c36f1cf5fca233e5cc956b44d82dabac6a5fa261c139b879ac2244405762ffda64e5b92a3d3b4af3a9e4cc3d9ecb07fb57102deaa50ac8bc8a8df0760468c11727320c7a6e474d7d530ddd631d7c6977fadda3f24dd1371f499601bdbf867da534e07fad37cb24cbf298087efe48b9697c4e6c416196efea11c5dfdd30c31bcdb477788a3fd1b725ad0eb455e837df1904ebf09f885fd76509a3f29efe2783d7cf7d61da2f60eed3acf648b18452c4cfbb3d98d46a36d7d85ab7a3c8d1ba9e0bac7ca165ae81b11c18d82e5a7aa04ed3c8cbcaa7b022d78a2b895822538552b074fba0f3653be84a193ccd187129666c541defe2022cbfc4a5a27a752a8f88104e83c64cfc967ba3d6ab8db312f6f5e487bc704b075a77cef0897289fee02971639b7b371a9a527078add6f2040ee181882fb3ab68b6e8f033c6a72678811b1cdbcb277e675055f826c8109eef7a148c80fe22c9cd48f87297e280143f794859dd9b32e78dbf6d850986a37f7d40744c96b2246fdc17909b4364671afcd096709194043b31ef805d496ef85d546aeb0bf3d22063402b99b45fd4c302578fefa8203d0541fee977c90d0875001cff600fbee6806e9f8cf90515bbfb92f7bd3a4ab21e9ec399b43b117ddd83307e08baa22077ab58a2439ad68ba0799385625f9e6ec03587ad58b37dc2748bb4218ce30a410c09e9f056626fe90ba4cca88745ec7daa3457e0dec6550455f355af93c28f482d02e932d03b175884e4070932d67c076401f9da4d5ee06a0924dbcd263f7b5e62fe1f0fb60c180094a10a506ef9953377063544ad62671d17870e254b4214aa3465543012bdb808c2439e24409681296aa9d5c607b932450783b55f0cb3a4552a9f503ceb35409897328b2db2968612c5549f07624d8908627f9a23717a7186cd14dbdc4a5ef8da9ad79914cbdfed16116e5db0c605b491afe583178180c466a32dbdb8361f27f453989081935afe5cd55fd5683bc9fa06761c39e644abe41d3650bd77b760160e4ade371b13ef000d998ed0d8ca81a590408c8436c2e41bd20ee6a5c1d5090e510812578b52873d50e66515a87a15fb56939d2bb00414afadb1583b40990355e4149ab8785808fb4e424b6e7f546e4581fab7f8fb1121e9d7a90c48990a3433f0f6e0228b2e5c832e38a8a1055e72ca38fa42b1bff1f511787e6c93773185f29d374a5d6cdb691d194de577e3a20ad4a41da61fa6ad766fb7b6dfe68014ded9125e4230c2671910370b68b8c1281fa9ecea4b0a564c8e4abddbcc075cbd282f78f32f6536db52a6aff99a2c46f697923ae99a3a77d624ecb2749dbfb434493df67e79c26f3efe25aa9fe39a1b165cd7b3a3f976b2541f9bbd0ab9d6307f2b4bb5888710169804d64f86accce89054c0819fd187afcd69a00624881477a8b4a0dd98c316d2f24c01c7355b88546a6995cc658b361549e943b64a724132b7ce869537949e4c53beee39345a9707ae829dbb7e8d498cd087cbf505df2408b2604305ec626e2bc342e4ce0c0fc1aa64862177714188be6b2b82eadb3786a2a35220563f9650184ac02dae44e4cde5925f6928c60ebd5021bdaebe56e22fa7918c65b0b89609bbf1200f00643f855f42f4bdf4065baeedfb259898fe48e7c085f55a3ae0cb64bbbf4ad3edf58aafc17b2d6506b892243bff4b88a15ad276958677471d3e9d28c1bd26c09c7e2c14b246f2a884641ae7e23718c501f2e6a3cd9cf973805b751c74f19d2035878d7cdbaa2bd097935bbf8bab7299df4eee3711cf64278cbdb90a7d659539e29815afe3afc02366cbbd74de62434a63f750fb08289eab69eed3b88321f755c93a2c74745d99ea1a97a8cd82647121b77476b45bae90473e7629ee2f2bacba12f43a9433bd9f6cda7c849420b9e566004dc62db16a224333db2576298d9bb0e64fa7d8cad6b8f3cf04b98f5f6a8861690baa2db3623de672a72d17184fab816dd2db05e1b0cdc520b6af87e87d415a1735897b09a0c7792061ab98a477c673ce053fe61f54c72bf61ace4362fdf7983553cae05a2caa44689206c2760fd3d0327039422dc98c6d79b97f8d76ef9464e9edd7244e0ccc8f70c1a65d361eb9dec09c32e0b21706d3d01a282bcc5dff065b8c170f8e4a17a26076f3318cad62e6a110938957471ba524c633e60b4e20c6b5b7f268c2ee71c4613a55051ec3b52ffc54c205c460b52a9c430686dbcbdfeb1cf7d0f992fec43f9b9334a297689a03faf1291ca06abbab611b0bd3e6db24bfbad31988a484f759350cf8d19da4f9a8c36e2e96946e15709ad5a895d186d788b7d335dea387f25b572a0958d880ba677e533b3a4772abc170fa479347d4e08f3b7f8dc335109d8d2b77cffff203c6885329b7d1628165e60b114f96eece271c6d6087ff0226e036d67ab390903603536b760a238ca02b2692a228666e7b957775fd8c59b3d1a39f83bb1bd15d1f5a10eec59bf86ed9e5cb2e3639cb70e410e77cde059af019ce1158c3708cfec8b306049bd418af337b1b0654ec8d9c0f81b5aa8c588a600749d27d191b871e39f77ed3821c4bf8b7d55f4384a8739906d12a268eeff1aca2fc2a1b45828b63790cc08601db58f16bdbde0c4ed64610d1e68c196c30977cf3cf635ad00f5f758fdc1443a17a08415976e28a3bdccea876aa23aaaf85447600abc4614129cdfd864ec232e85f2391898cb1e4d223d30aff043902de55bf45d376945920379ba36349117d60f37188010694439b131ddd73db14488107d18f741a1c69f6a3920e30b74b49919eb9cfcbcdd3cf1f1473cadb19fda5210542fde97da4ba49d47ae7f57fb6c102c9c50defc8b6afe58f9f793ea53c4145b6da363c897374a4321bd5b8899a0a3bda5beb73de850c76ea6791a4671943758260e37524d3be8c253c8183bd414fc43b441161f9870d588f94bb1647dcd339d19eab9a380ac08b15a7925d03f2b626524826c00005db15e4ee9e9a2dcc1b1a0b5a37b5ac61a3286a22b14f43f467e8892ed399da479d35533ce33b0132409f985d2ecd68208fec8c76865f65908b9247c0bff371957c3e434831feab566d51e16f39eb548fab5de46bb897510e4aacf3c492d6ac37a0ba1cd831ed1380c8b64c57001658f62005d8c8f0ffefb6cbbff703f64b7374303045b58a0f22f8795842df2a565c9c156cd157d59e28cf3752ba459158ae96552928a7e56cbe05a9bf2ccd60b348cab31838de107ce2a3b5eea4510b0845e3362c2c75ea0dd0f1807170ea493604c82293732648a106786e1a1df10d6021a4fcc1b9e940f9410225f878fe8ee678de8965ecf726167d978a5e8deb3f6a2820ce7037c99038f781c1dcaad1d6cc8d541014091852e22d4830425c08482d43a1d5c20ede81d3dcb67ba3702acaee2971e12a3453730d00d3884ff210d1b15b6d383ea7f0bcd1d7e87cd731d31156357e212fd46e31a0dd7fbb0cb8cb81ff56cd206d68c7e83acf60ebff5492540c9ac3fba9503236a2ab95f1021401011e1e09b5d5ba2aae17ae67f1a443303b163e8895221267271b545d51b76f79f81699691e0006e2b66f5b43b64d65756d7e0b15172181d5af13bf1f04b532fc0ff0b1358476b2b8a74abe3c61822228934ce8b1aa2f05437493d4233284c352eeb34db40ebd28712ab0bf9c1bcce2135486bca676d3067b1ea27bb001aa8c433c67542fe55fced8e6aa46a90bb10dfc5936713aa295ec4356499c109cb1f397a114b0ee30e40eb4843f3bad5abb0bac4a63eeb656fd2064c48f1f8929216215c7c3483918d24fccab7886ee2f7245ebce161b62bc9408a60f7cec64d1804086537c0458c5b3f8e9045b0fb5b35d21808d56e085f9e10dd0df18ece9bb58f5b2f045cc925e0e73d336f3bf490d040835302b2568386c97acde6c055f1030e961442888310c6c2752ea457cf466ef63d05f9dd2549fbe0f00b27f2010f791845bf72c207bf6547c2ec85b2ffce6a7981ac1b5cf8f565edb950359264299022e67b2597cb9454eda2e773cc1aab4b311dbff7a046186d465337a03fd3e1d0b4f4f1db8853220e2a91ca0f01846f99b34dbc0f55a1457a914a1be848f4cac344fd9df502130b09951beea801e18dce86be1ad2cb7eff0644fa978e4c2b36e0696cea02a39f91cfa3adcfef3b96786211db76e2905397a8d8011502c80bd8a088cf50a4cb6d68d8ecd408351d37d1fceb123aaf42a3b1cad0ea2ed63b0b029c39918c3c07e0f2bdb70b122a253a0ce7791ee0993103dff4b6124f8913ad572bd26fd738e7bec1d6b8cf683ef2119bba524e035109d864aefe15f18be05748e80996dc3bc93b58cc68ad84d3f25300fdfd2c0d372bb602621f61bf6f3fbd5a4945c305a54b0b19f72d01f299b472cf2ae03588ec25111bb6a081f3a38033fdd7fd50ee25db9297ff9c893be0a MD = 55851677287615c9f5cdd01c36321a3e4ee0adc7aa8db055a7014b1eb8fe19b09d643ddbbbef874f8c80c6d1e30ab22e Len = 50128 Msg = 879a4e19effaa5f409f3285b3e5736c96e96495c91d7c1869f47e306aeb121165a509be66ae1e74ab1fb0daf31a3d654871c47b783fc684d16854a75713147af6b8f8c09234ed5dbe79778b455a1a594c07fec5cd63cff827f29ba09087660b18000286b626af80f756f7051f1762af2e3674033d2be0f8fa3de3ba9baa7f484624a77f26f5cd74f222afd6e4c4dedd4b67e4c24c1ab1fdb4a4ad63dd0ed8990d9168187914dfa01b57127f4af4c77a303691718e92ab8ce3b1592ae926fa93cad0c4f131265ea8ff7ebf7c9629b4fc890d3a9f5946461d040e878e24856dbf2a5d3e87c38cb2e5fb04174d6ad63fda925620ba50880a2491f6b8ec23ac9a81a8a1454ac4ca84edba71aa703d8cc0ab08cbe440e8da703a1a145de36b0f1961a24769c899523d369a61f96392afdfd448c905c1a6d010d408e1e7027f1f52f5b3ba2c7fd5d65447373f84b5eec1f5eccec805cb0eeb5478faea04a7b46fefb45973fddefea962960d74cce5b6759b6b275354bb75aec3af4c971761cf7348141fff6e74686dc0b989ac32519e0d48c5def583119f7cd6cd8a639fcf04cbe49b53d6febec7762708384065a7fa2b76835229017bd0e8167a40ea1e2e18cc5db0a1751f4c8054ee3895dbd7574f42bd2a2d586048be62fb3bec95032d60170c0a9564507c27ac9e912ec907ce21d58530cd2e2006bc900d6909ff0f4b6f1e87ff8c2f22ec21cfa0c86fa2579b0666572dbdf4b1345fd1c5a8058262e6ba554a061220170b0350ad34d4f2773c6177bb877c5694601cbaac7f8bb9ceadc65ddab4b3f19d6740b20c6cfb33c730c78c1ac494be5a0877bd2a35f91fa2ff179ab291ee2e366f7e6656e74ee0c806ad060d6b73b6729bf55be781da2e7069228e5a241d1062a1f100152a5c740a2c8697fbe2a5c96ea92a193cd9ab60c75a7bbb49c1ed52b2ad5d01bfbc80880e10e8947ed0b751beae6a67c2b3d951187187a3fa11cb5fa6d026ddbef477773462479e0eac04f9d32a5ad9f1970069d41cdadaf38a33b1afb8c306ab888ddc2d8f281713db3b2c5c8b5fe241f9bd358adaf9c2bea1b2d34dc5d61f0def50115a060e8226f4a653bb600e134c524c2ecd2a48fdc3dec54ef195b4894e7f4ad12a457f81d07ef32a6046c9ef794749cfeb895cde9bb7f78f4b8702c7f5defa764eebdf7878d09dfafb8e37c9413f32839686b9f7bec3a61eac48357d9c74db8b1867c2e8b890035fddc4cc433cb093042e90c4dba5786d67a427b0fc9ae76a8a2727ae54e843bfc39778ebffe421f7ac443621fcd84cca04c3c429d7799d23fdebca164fb0624fc0a9293b21b029bd0657f545cddfb728707b9bf490c10c9450e6cd7f2b89522fc193442e8b293e7f8cda4c94e1145e25354c2da5ab09bc381d98806d8adbb9dc60d6583a8ec7b69baa5baab3b92e982ccda5e7b1a8ac328bce81a155f04fffd208f2d3e39f0448be095cae16c876fbcba42958acfc30f60bee229eccce2e9abd347955be4e775b43044da53291960f7e4336fefc28208d34f70be736a71020da7dca4c3f1f9974b745bf5e9ba70429a1356f5923bf034e9373ae09280d9d18c63f7635ca84d31ba7281208b66b3a00f0f532e5c81351d0b3de797315542df91d13fd80f500ccb68f35f6521760bffbda0d12333de784b9f2b1feb3832d3b282b75d0dc5335deebdbe9dcb93329fe90c8e78da0198e1450fc78ce58f5fb4d4c8def80a64976920219de25ac9e298e564a0f15dacf89a93c1dad48c1e240ecdcc0eb9d5d5c558ecfc56d61babce1d7c2d9fe4b41d46c8bd1f2b9fe9cec90923f50e4778010551d7b6b22215223e5734cf54f8e53dca964b8f8496028595cc60aaa84cfbcf9f7c6bb7796e5114796d98b284d6faf3cc2ac67bab60e12cd1800b55a26d6426da022f687361d56bc8882d3ffa26fa2693acb64a69a68eacc64cad5dc554bdf0ff0bab2f67a4ab0d73d07ddc7d8feec06845a16486100febb959cd2ad9a90e1456be68751fdfdbe4c26c0ff2d4b9dda8931c1131ca456ed3f5cef324a6135d7a2744eda361b96bd6fc856beac84dcfc65c5b8d19fdeeb34bc1d4a8b3f33bb40abac5c21ff6da65cd6b421a2a21f3cd020a279e84e6b2e43a6493723f8ac91aac56687053a6ebd0b055cca31ca752dd44e7abcada4e3a0b8a2732dc303164984845557ea53894b567034a8e2721130a74390c9c83fd2e2f2252da6beeb1b434c6cdb5747f767c1bd9bde564b259dd597a497599e7bb3559ea2db2a9e1d262f80e37b0db48264c0af0cbc5ab271559d43e5f0c4b6e50f790caffe31d715b16ec08cb6d3a6811ab8b937411eeed1e2f82a9c3f93981831ddcaa12944f071677179dd0151947ff42a4aa01f2b26c3c066ba1bc65eb861d4f4572aceec809c92e81b390cf004db8b95f1eba8f810c3686980f9378eae7e734d40a16190fe13de3323351c478e203b7c4d5e711e235d65810dc9159bd0aa675905a983cacf53a3d33065c1b086ea9e4dab8d09f5e4fe224dbeefb31ec5925b9824b797f28af88e48b12f9fd395973e9a9afbd627cc22391022f1c27003a2ba9b0c3030b0a76ee8142416f92920b266e39a3f581c4f661488c863b6480177fed24ab7c08dab135bc617a08019bec8d1a937ac125be5464f181da9f0ff457ea2ce6ec2d9e21ca253ceea40a73dc656f96be1e6976f342f333ea159151e462340efc6c5ef3652886aaf4a9be0fdedc9389c275359bea29d8b6ce1e5952d9a0253d70155732313320ad78706cfe28bac29ca8696cbd2b72d92335dd3f395b79845e4ace5f810a53bbee84e15c674268c47777e158033f83bf22273a8b2ff0551b1c907ebf087af01e141fe4d573b54c61c137c43f96adc6515aad1d845b229cb01c4c0fc0f1087212c85261214a08d06123f0fc6a9dfda15974ce6e73e678b60c098568a8613d415fb224408613c35b8b44ab702141b87e9d179315a0f77a0bf7894471bf829fc5cd799d694df76f54a8cd7008acaa65c4e7ec02fa53b7b103394490124f7cb86723c6c5c5bd1d9325806545ac52ff8cdbfd9b2606d44da40799e471339e77108d2b40a53a20adb735dbb534445c69b52ba7cb041f6ae2dc7de00eefbcf59a2da1ab9044b1bcd163ec816444b8120f691caf24a62e5f9edfcfd66c13959c0d99096c5daa13dbaf20b23a1b7df0bc1a2f16dc50131cf9a8376343a6e4a7dbf9dc2f3650e046c36f75efcd82e8d5a2b19081f5f453cf81296ba3ef646ad8fa867c79d111ed34bc3aeb0b03408c4d0cfd13c5c3bb6f313e4804f6a24dae1140db03510447d9c31038096ea4fe72414125404a0e4a6e297a2e89c32309b73bf721f91e989aaddd059057817863a09a8a529f789d4c589e7b0282743b418e3c657fe44756b47069e56b5daa4618203e2facb9b83a67357a8bed7870b29d39fed21e4e36033a2a4ff6f0a452d8c4fa17785a1570ab430ea4f017f21f50c4c2678825be526ad7e3778148b3e2f410340cac853b0ab989ea04f2a778e9dc5f3061cebdbd035231a4c9cd9a12c063a4d8041554b4ec2ce1d282dbc6923620158cd3eb0ed2b182f0742d240f4a56ec27ede9f9f00780ccf2cd06f19bc96ee28fdda4283f85c4c3bd5c8bcccfe20b59427ca2a180bc2c6165e3787e4fa4f9eb742bbecd795ea4dd4063cb0e016246719c8c17552d5c5ab2e11cc0c809ac3f036d7f0822e3e6ba982091d532cd5271fbde25305d1f6e71880f81c618f267a9f122e06a6ea6a46cbc05ee91805c3bf3c0af4fd5007d7ad9ab971973b5325f9d7f3a56ccfbe92023109983e740d6a53488b813ee876f08f9e320edade9f01c84735ee9160fd5e3485d8157c0b963169c1aa078633a1fa13bf852035dfa5424c79635a230f39274416b687202342918934010871c61b2cc06b1d7656c318701ccb0688803ef475b7802f4dd97f9533281c0b04701445312c3d7541bc0d6b13bfd899ea3754a1c2153eacd9f655007edce6327c0fb2b28fad832742b4331f958c1e880fc6f4e3a4d3cea9cc056816dcfe2f11efaf05d590cae8adc9fdb8988e27f97b59ada41c9679acc094951d3af6225323cfeca230fd0ada7377e72288661a15ce6869c6cf0f8d556bb413d90f22e00ee2ad36fc572cf3d512bd1ef541a5b8e00bbc69f17d88755515bb004fe61bad9ec8f81c98ba990c74f609f3a566c5aae4bdb64c98aa99c8184909f8d65218e19f51411bebcdd9bb16a80f03b76a5e56904ef67040c8abfc3b90314c00f5d3229d1618a38a23579656a30cddafbed8527f59ed837e6a37982b65c1a85433b2f6f481df41e83dab149171a3cff2f6bc050e491be4a611d51274442b6c448e30b5521f05758a8f3cbc738e648925848214c9a702124c320d0182b5df265677e51422684bccd59a95046973cf67bbfab2d83dfe20aaf54d37cbe3356d550e834869e1d7e2a67de24c72efac250a2acbd6e5e7a8f7fd25e5fe08124d5676e132c34d0cf89aa0d7e8bb8e62a235def66a66b4335208b7527ec81cac581b1a52f8fe242044b43a78206abd8ef05254b378dac9bd63d3380f8a1e9ffdf03bade8684195b846cfd1e32bf296b1011b19c659abacf268d81dc19a69f8a3a028b025e3460831695e058d6dbb90757ee08cc39f71c45edb97c6fd2242bd19e272af700c73f22846ef53eb685e4148a4432c1fbc95a67f3682c226b43163ed31aa1a7b4643ea0949e43b81ae331fa72bd3865f33bfd9cff439ade2b2ae637a082f8f8c233e6660fced2af491d2822d7ff219e69728c4bdbf2cd895c022626cf0835d4715dbedabca5ab098c5c51f281b2f556a4998fde4d1ccd0c44f25b72265362220a0a4f6565ccd5b02bc835d3377fbd74edd68ebc1e69a3502b230f836e0c86cad5611f70d0ea588a6e885b2ec30e80e08c51124d1683563c5bbcc9c16edaaab31a8bb861c6a83d819cc54b69eb064682c934a2f9fc0feeb71be61294f066d5c721b0a2a10fae8b7cffa68eee780f1742eba4c7289ab874abb2c97164ba570fed31f6639973a34a62dd54ab2331d3fc083ccb0842b623efff698c6e999656600d948885b0ba2f831d7ff62a72e0f7fcbc02d1edaf19fb679b8858919b4a0bd110908c904dabfb3d942db594424b26204686defed78be6e567575463d29e1d69dc6e2b0ada10af80af2fb970fa3b066f8e1018c423d38c6f4b1da96ba75c35315a768c7dbeaff35456cc294604783ff17ce8aac6f9bb97102f247e31804afa2f72efd87061506dc2714d2d9fc7ca7aaef955ba8cc209accdfbb2fc3ec632156d0d23366c2bbdc8d1e8faef01abf95fafeba0719fe78675b097104a19e2da2df31158cff884bdaa8aa31b94f718cc95fb3c12f686cefa9ac0eb86924a3a0aebc768d7ca9cd417bcf38bf84706760dc59ad2f172c9e12dc305df5bf95a388cf7f3f8e850e08394a51786d92eb82d82969597850cf187e697885cd9a9d04327f87fabd2894df9fc0dfb7d057194a5f4b1f37118ed8527efbe504846ca34c2a2967167df9c6a9e179ea959c53922472abdbc4af03c0d2b0ee1658deb830f1fc67ad31655b2bfdbacfe280061aeeb79ee63f809562212fa0ca8d01110fde8c15b4cac9f7df2d51685d5805c21f776a4064bb09692c71bfcb0ba98befd60471029b305ea9f8533b868ccba544c3d4b313b1cecd9ec52b099c4c0c57af9d3b474f758e5df0392622a1e8adccf2ca7f386557eb2baaceb59390e61602f4d7eb8558ee35466f042e8d36fb8f1b7075ef50d1c1b0c2119bc9f44584670c4428ada1bb7fb5b67b0bd4f1a22fefef32689d92d589801f67cea09226816fd211e1fa32e384800ca892a1e6901030d6bd151284dd0a099211da0203b067a102e29649af7d9744d77c4b1de27d270250750de69d74dd9dd8a44046af8fc1aafd3ad8247dc64244a56a87c16bb5eec4fafea57243297ebd419393e71bf119de5f8f0a132469f02fe507fb04e8f6d20924be8e4e2c6767f87b74377bdf90cacb7853be7e49e54b6714b8f780f0ac7b4f6c392af29fbb23dfc4aacd7d40fb6ee2f62d67fe44a49e8ab3022fadf94334f83ff30dd843912cc3dbbba854067d70c5477098fbab4473fb5e87e5e49957a9942e70a9978e85fd552f3b6aa896b37ad2eac1c40ef421563965aebcdd275643c3a6468098f7061ff41d9e86d35829d7ac6ea56b90a5e7dfd566db36f049db9dd735c91555039e0f3145497f7ce13d21a23170123936f45b5fe0b1d6b66734127f6b9cea643aba458d34e0c6fdc889f364d1d63a512dd3632941b70e98060c4bfca616724f12f74d784ae90fee548ca764de2c468100f181d2384f513dbcd0950f73ea4f6e12b1a18315c69cc73bb1b812a506e93156fb31db030f40ffe20d9808636cc459b095cc2e13fdf000d495c00ec4ea84fa764cedb4506b40571c3fcf77e332938a82f037d9d413cc33c5a539a9cc3b9c4505633fee9ee7f1ebd1c3a5ee71c01f88f07d7f36c49c63c8656c9f84199ea1997ada82fa5d09b8169955b5dcad99dacd8f79fc95640c79476a587c2e3b7837704d2f61680945158fd94269b2e51457d0c6925aa630c85f291af529f8a05cc05202be55a8223e9c8028364c11b6e4193b2c42f3c9c96497f61ddf5373f6b0cec72213ca4b363abfbffc9dd769917d8155270862708c65a626d95363309d18d53831dc59b1c3ddf197cce5963b134532b75d5f214af8502c43d40df3bf11f9563d98546e8c499cc4901faa0306aaefaffa25b3aab9ab987cd5a47b6f6fe3d6d43fec28832b360bbb417b57984cd6b15b6616a2893d04b32a44b10840d38135d1d7a3d5322f278f4824567ae07e054ec7b3a6a827559244b7298051027a78aac16d35d6e6088cbbfda14780562ad51c774b6c311f83e2a1a5eca8d24ed5488a4589389a3937d4064e40b50473d3c4bedc95cdd9dc58647e691680f860746f68b0b412bb863dabe2acab2573c3f9328a7a3b420ee833962f933faf5ff1c85bdaa5666aa767aa62f5bb191f6ab11bcd23d2a47f5cbdb6063996b08a657d41ac34962896ea57de97a3dc331935d5bbf2ff7859cc2fd7502310f611b8a56d90cf2b05732df0d17ab87192819981bc4a2291cdd3cf04df827b6a33eba09c4d06331265cea6575eef53e3608d16babf46fa7f659ade8800dd7d99c2a6e8b68642867f4993768a7aace87de8ae276d5942e90cb227911615b1b82444cbe780b3b627e6337a45069f43f4a57d6d31f634ce5cee45f27d2b78bfa99e1cd323875fd195db95eb68584744f6fea152cd01bc39e488939409549447d07bcd452336e5355ec3e35f76fc0d106dedf6f76f0c7a260e602d84bc1e02fabb21d8aa7d2bee51f133ce5ee76e4b36c7f7e0b37e72d9034909663d0be44f38c834b17b87b2c5a7ebaf9952303bac48a3a0e12fa1c1636202e8e0258f33d39286290a20d97825a7bc9be6e1f7c08a967f8d9ab44f9493b2fa832df6aca93a9883832532f8f868f1d28d398694b970d0b9f25ff9fe5904966e6ca1f8eaa0deab3eb7a53a5c9019e6cc0803a89d62f967f193b369248b105cfd19eed4cfb75a5b165b0caf7afba3270770d7d088797ecca4c6377a68b7519714ff66f2d2691818b8c1ce0aea87bf13236c1886dc599b8f422e5ea6114a42d544919cdb8912a27484a06bb511b0a83b9e6e68440f7fba2068208b84e4c06e881a8503076a5073ef086b586687230910d6dc2980a87865107531509f29b62f3ff52e3c0edcaf26f8c2872677c14b5c337b59ded51dc026eff7f5404d76a82f5d6311aa4a769b16222178586146961c03ea4c1aaa05e37a0f7ed0dd2841f2c970f2c3c052ce80dbebd3d360cb8d9fc312a2475f87c75ed90f585889a81242981b12a930a02b1ce2c6281cd21f0cc4dbd041c00ff6f89ebe6042f0c8557df415ac41565dcb32abc531bcb91ec45aa1d0dd373abe60002fa4929d3e3bb8dba3bcb51d4fba2c7bd9edcef03cb963edb34c89f13bed6b848e2616e595363ab1be17b5e4f9d85c4d13e6ee712c34664c75a9770e381f61dc36bd7daa9a5a6396cf913f66e93ad34cd62b209dec1253dd757224fcb3b6fb9dc5c5375ac21abc0144c3a1e1924419e1bd34f5f500d5b5371f21043b3366814f97f7c48480e9bc87ba299e03899698b2259eef150ee0f2efff40a5583b80ab4849afb5a66b69dd709c3d743b33a4f824abb37c5c7ae6a54e726b78c230a7c23e37677b4ef5fda7726769d4f724f180bfbc3d1e59b93934f934dc0f07c74e7e980db995cc952792f3a84930d5d20efae9d376559b6e6b2a76934cc89743d738cc191095cded7a387adb660845df5faf498e09a27feeef1e2d3a28460f4af4796105f6ebc14358008e7d2adbd58156164558619595df5768a375e8f7ce5108c8fd40e718255b6373951a021be37c94d873af18af7ba416926ff3197e52da969fd7466b9b888a0f1a351ea6591e359e6e3b0e89307fc1bf33f92e341a4b6c2076a5a2fef65953cd5cc5076203e430d53022035df930dcb3c5c583c37c066a38e5ded31ba9263d20c3eb70dfbcb3e2cbd6cf09e14a2d4996b05b90421412793255f9534c346dcaabd81ec779e42be004ba78aecdb3d39cda8c31d02a630e0dcf4f7baffb189e70b111b597cb0aaaacf263d54e7db6b24ae1d1cecff6f9479c424adc45b2d636c3f309664e4da0ce9e275b6b856bd347d85ef9a8ec32475d994dd091c10dfdd548c417a7776c36f658161981c0228a02c9a49c56c166cdbea93469428e66efe853b6c4df9fb13db05f4126deab4c5b81a355124ecc0efcf930b88d551a583cfe893db99523c74 MD = 3565d79d701a8b0dc31fb0d7eb545dd3f968a7e23b8a5bf09695abee2f1c8370e6d4098b234189c38bb0f3ba2869397f Len = 50920 Msg = 146629e70b37d8b83ee828e2b001cf55630e7c131a50bb8963b3181fd500870e9754037122d176a04793d9b973e59c7f32b54868f24663f10a259435fa5e07bef4ef139b9c7d1ab20d46b1581c57011fe0ff6def72837659f113db27c9fd04383521a08b03a58e9998eaf9e833bec8dd76d335d2226fbb682266361ecb46462362d1f469deb098fbf065fa904182b760fb18e6368a73fcc7a404ed42869f942881e7555eb60601811ea1f979cd0a975177b8c94533f5ff1d7fd748ba8471b7ef9c4a0c92120f90d2298441ca5fc02f57f29a2627a45f8d13bbc68eaf4d25781fbae4612c7a320f9719f819ac7f0b491b75a6450465176e5161b8094867219d60e49c9b5476da4477f6e4c847b653ab4407c46d03ff876a7e7997ffae5ccfee5c215a04348f6cf91bc92f97c28b011e7bb1dce84cf9154942094ab908b49635b87906e2f14c51f42a9ac3ce46877b6a687ad6fc08db2bd2471bb97f7ff5dd381ff4897eb636f1fe4d6f87b5fa302a57b26a9af25f2e30ce32b6cc993ba90ec0379bc920a9d3b4de2c526393071176ad0289111278788c06aee36b4e63579095a875af10f2ae035e6e4a3fb294afc833ffe021a37c44a63f61a97ee72088cb7f1b8a2395ba4c4444bb5f0358ca9486b25276b3ef9217e844f310edac99c3274638e30ef82937e159bd9a98ced1471af3a253b03ce37bb9dc0d20a0e5f7900cb1a687568266f640651902e45cd050eabb9880fed397f781ce57e27fda6177e28a0e7ee5789a11cb307aa0d049ef3860d5dc0487fcd514a9e3785d73d30001119717d1a125ec10e881867a44df5885e20815e731fec55897e319996217fbb501a16a8774d0857c0121e59b296430c2da1beb32e623904db496e19f36ef7b1c1a6faea845c08cdd7dd940086521a274afd708ec8db15e7b68c37976d5a3a8bcc5cb8c3dfb3e2ab9c46f3fcae25ed325c904111d0ef156691c348826297ba920687bac4d8092879a3eab89ea8663ee5c906ab1cd512ba19f36afb7b818bea7cd6d48b5e0bb04ca075357c7703b7719a26cd08e053da766a520fdae338cb6c94d3afa50fe94dc1c896b39a062e8e37c7ec5ff50ccbcacce0440e6149f6ca93826395924b0f361a4a7ee1bbdca75f0417803c0a02bb683014300319105a0e01be3d02cdafdc0dc8be944c3c5afc9e38d188ed92629117526eac7a8cf6c0fa39b09693d19eee395f8d7d5f9611ace078be7ce1289ceb6c86681fc1173dca33ae0226b528a8a45d414fa098739126ba3606c2c3571228dc4e8910935285d43ec11b63e34d4d9cce106d94934f49f88fe372f0e08882e7eb3d5a155dc94f8d702574b4aaba0e36103f7fcfbc73bc90e6136b9dd5573f972db543a48cd5fb448c4d96bf67f96b1ed840fec8909b599e314859102e2dd8b4f868ee34ad2329a7c7ac09dac775d4a56aa753059c20b16f05f4d3fe3776cedfffaaa24c3b1b5b05c6c336ad45c9eb686be5250d5b9e4491d8ab64ceadec826687fd1851b338f00d0e25b58d4f600fe6307cdd563b8e93853dce73f7ede9a3e745f2b8fba206892c1235ff1150d2c29d7cf0f466d85c2ed789e09a0063e8a3e0ae0dfc90940ea6c157868bdff69c93fc95c402b5ae91670751943f8ecc73f2d114c16bc6e5bbb98b6299e43fbd1804920f8860d92ac8dc73392bece9741621373e9f7ee5238831e8a7e280b6f0ff94dc6e90c727d96d0fc9954a1aa6f749af91700abe91ea0eb047bbe2f9dc4e9db56a277f8e5836f87178ea61514dc2790e6e5d85935385b9a547033da826328cf699cec73eb0cfe5a1efccf42954624ece2c5bb2a580a313a1650235241b2947c909c8ea40e800cef1bca184fb4153155f59fef46dcfaea705005d7be621bf48bd28aa7b4d54761f115e0c965fab11773285bbdd449724de60c7697476d0511a3384e7dcac8c9c50615262aabee839def82e16dfc25d92344518bab15ebd8b46dc8d1580f706e00d62284824a18f18d710b1947e8fa973431282c5a4f64fba3908cf982ab549fd90a44e21b690064aea0ccec93bd4f1448569741ed1e5ed8a7b58caf42c5fdc21a4a83283b312f45c725cc4098a6adb7275ba9b2aca963d68784cfdcdf85f141893de83e2bca2cfaa1a714ff9fc99bea98e76367df19fa5d0da45d66a214ba82ef8c7a0c335b7fed04cfaa0ff04ea11565a2cf49ce95acd5ffbe3e37d39ae0ef13df427a9a0cb184b745985ad35e479e5436f43ec146ffa626797b35ba3ee9eebfdc4671aa07492984b0e6c6902116ee2e48da2fff537d394a7e1a4a9e295fe9b92e90d7a971cf4331b99a3d6ebe956dba838a05d1e5aef43374265dc983c947ca7b2896e075cb3a8707bea6b65d4d83c28c0ba67f241940a804a4558173b070ba6c14949738c6754e4359e8b128c4990c0e65fc5137468672d69e1c0f219bcc51a85ebb16e5485e4e1474eda445841562afa1ee8e47bd2c59911b99bbb612c357d80ef1a4a2d75c4e23169cdadc15618a17c663807b079c25de24b4cc5a9dbd93a32a208a97fdd7181747dd9a16fde34cefdc456dfcab3c9e64c0558c34c522ceb2bc2f11ee413772990f982b1ac60572dfec7b9ef131768cccf764416d115ad0accb067ecc2be5255177b5d611f72ec28efced5b8322b1b6bdd1c9342c0acd613a608d1c5b4447f9e6861de32319c506a51783ecda0454e5e0576cad9a36e3490482ac32c313c6b50145b69a77b33404cb4225981d62c9e1dd9036f3df1f054fb1394b072c21cb2349ba6942364de285a987bba875c177725b850d50224d993de98d52e4bdf4bc0967ef1f2587703750e7ed2d6409abc660023cdb0a8b4709d95687a9119e16023002ecbe8993a29b2f2c7c631402a71e727bbf866a4495bbec9e2e38d6f80f0660c3b72fb7826e76e8203d4500873ee7716e16f7b872bf193d698be87bf3652f60515a5bf77b5930446c37bc70c1f689268247173c404d899660a49f47b6a2e4fa56dd2991a6ed310bb873aeabd75a6c56605ccd3ed4c875bd2a8346836a4d8ff4774680cc2cb1e205abf705faf2eff9ccb05c000556b8447b7030c67836ef97175e9f4af1352da9f9eecda7a53a3f964f19509adaefa35e98dab1056b430f642bb3f06e48e8eaefb129fd7ef4d6d1aca6433f8205c6132bdc0f10eda7b8355ef81d3fd4196e6f1df3038d702eef2da49ad731a0ce058f130fb8556573beeaed45459664acef4499882487679dacdce4f37d2fdc7cd1a07ef87c8654167db479dcd3fc064892f2cd3835f24a873665d679dc3f1e5955ccd46004ada4d91c1e6a836e7aa2377f001fcaded70135b450e1f39d6c4eabb69e7d0ff8d13c04c4ad2803be1620bfdff6f908c63d73ef4f266c2b67bb54bb1f9be1cdfffb04df9ceb1b246cda6829da5dc2b8962c8afd2f6de1e7e33618d1b64d6862c132e4b1cd5fabad20ce62bd97bce2a3f5ad2da67bb0a7f0b9e48335a33b7b95e77ec4c47e91416881f9f7c23f9bc1918cc644335c74260e90cd7b2e0fed802f19e78c5ed80a431b38630d82f982c74a0381b8ecf943c60810fae90522ece1f9fe7624c803511b8fed148d43eefa5c9501e66f197ba4efa8e272b60303bf04b83f32744a26ee2f8c4715604e458ae83b2efc5202092009b4ae3dc86ddbee53378324652b696ae9daee6d6ceb27bbd30533cb49efcc3e7cf51b64098ed102343d7352ddb5f54cb0408b249b61bc1485b8b85b3d27eb86b033d2ee60ad0e821191b7c6c52ef21ceb87c643d4fa2b1d661f64b514f38f800e367be3b411b9f651fcf68806df8863047746d0fefc9d5edf01e0e0b89be0b5fcc5bd4cef03fbe65c46d89e8610dda762d8b4d603b039605625d3e40f6705ace3aa4030f8cbfcdb9a3707122f091c736d72b75aca5e28aa3454e6ca039e27ed2cabad97b7b1e35d739628ece8116b4c8d0df8663b4e91c4e256c1997b8a6d013d91ac8914fdd9f24f2de6329871f2bc2a701e013ec79d37c6f30b595e71006f8023e40ff7f6052496c2e6ee2972db4aac64d234bb13748a4af36d12969c07bf5b2bfe3048e5907ab01ed327825a4b7f7bb1bc069a783d45d51d8ecd0a53ab7a386fa1f5ef12a17c050953e68b716ce1ff1f837fc33f21f1ce3a1792a2de14277eb97664d4c561b3fd4b0e322c0166faa175d0a71faf47159f12af674684694e95cf2588e046f7a601abae134d506152c77d4a879412d739af6dff56de8ed377e5795566f9dc8cde77f2d891d6a7846fdbfd9a260baefbe56613ae665244792bd681ae0808d148e1c9e836b5af4ef7db43be678c6dcdd9a22ccc659f8aee84f1d0aeda75f66b52395d557086c18de31e69885ac2a0b599f7695fcc0a6fd41b523bc77eb5a9f3d36d9d012e0cf2ac70beb3231bcf8eae646d85958aaee73e67d57f9545d10bb0f206f0b417502bf2c5458b5651bb1d02628be8364894db738f0204e0d4d003ecd88bbd35d35955a90b3b58eaa48f37f7bad9fb0aadc234bcbc61326fd6ba78edac846e4d0b305617692681a8be52c3d795df24d86242d861167b720cf19754fd977a6ac467db188408907055440ca9e81a26cc6a0e1cb1aac4d72a7dcd707e62c1f419628e64813a0f008cbce1c5d17372355c865a56a6deeffdc48b134cde64517ae3ee29d27b80a7ff3da43b8623bfc4943af5eefa9e47be76a6fe6b345c4d70943032df2eed9df814ebd4fa56871639ccd07e710f832b5ac93a9e7c2fe06345cb68f4597fbeda29c7fe15c73ee5bef96485eb8c9e3cd3ea7ee633ef4552f0f9a6f3fd3ecdd87f63a0de2f4a4525002be4c003e6aeb187971e14846b7e9a3ab3ae3915372122d4cd28f4ea2a732f24f7d4eb8d2847ca8f89302b5a99e3a08a9c69a303ec82842090e6a60e0fd0eb7286bd6d52f9716f32e73c937d217b4d27dc61979104f8e6add3625d62a36541320027ae1a023588b9d9cab3b5aa4f875b9a1e7e85288b30c1bf2582af8b391aab8d9816acea9afd6c8963f5cadc65376cfe26c1a8ff444aa57cb67bbd72545c26539a0dd25aa9b6931c8ec08361c746a33103c6c2322a1da1319db254febff1eb7db4fb52fa699b76bdd47da9de7d9a485b3df79b68458ffc06638d3cd781bf42316f48f571e2955d92bc9204fe8d1da3a35abbfa4a9e8900248f763ca6a2b07397515c83681c8a8fc3ce685c6601b5fb32e479a97f3cf4f3b3a9d41e132babc5d9e49fc48620645579926779c1e04c9a30639b6eb028b61eda3a0fa8c52397821cb07a8074f509f7dc91f723b533c9c6c45d88128568b9c9c2c98fa365925ef08b3c537ed9a363bd13528121ea0114c8165ca85da506e33c93debbd69a81e7574b1093875e3358ee475d6b3c0a5215e84fe76316b9091ebe7401fd0b0df61a0187b4a363abacd2d49f3b1f3cba2fb46d97872107687a51988dbbbc0866fcdf3565b1e9da6716b8b5447303e9a49ed9a115c24af65b606413079361964c981e3a0d8dcfb33a79f2da5d8d810a70aa6ccaf22346ac3ac33e750a12527d67d4bf59a8d3bcb8cede678b13120069c6585531552f7df1acacc906bdbef88560b7aada5e0818afc84c01108e89e8cc4cb27c1e6770588c5921ec104922bb76df49c80556b64a61d3cca7b0f57aa0fcadbfc9d8506d3d47ea2d8fd9d6c304178b93ff21b964bc96956541b4706d92c18f8725a937ae95e807d59aaa8b2b39310d9c3878ae9bd516b61fb86429eb25e29b1376d744bcc9385723f6cb90e1c48c0c6d5c505ee2fda8df02f208457bc129786aa6aba11e3fff831e89840e6d0bf0310c51f2f1c19c16b817d8e8efa6ce5cce949b6d735c610532ce3c1d2d587825248301a68ec01a26e865524c4df3b444479a3f65e5ff96110d3cf8dd142871f28cda52b45d68e0a118f4497b87eadca9898378db1c8e45edbc6fa30eec68602112172e638740544eefcda3bec613ac533c5730164391d85fe66f26f6dc9dac785d447cfc34d1dff716f74a5d32f78d09091f4e5f8090b63033456add0d51bdc0166824c78ba1ea62347a24a0f21de89598e2bafefb1447284df8560da60bfbc0e48c0d0cb53adb58f25f1bce2f0d23bd90a85c3bdea4f30ed990d1cdd054ce4270b72113da241ba1f8ad16311050a84a99791c5d4ec922ac8216c564b3b39e0c61f1472320e51305ed6cfc0fbe6ddd035d5ee2ae750a3cc8ed91191b76b0d3e860426786b2072a4c79a5b7b160ec2cb2815e96747befa92bc509b53a42d3d59c15b36a82b612c73d455f2e5f1f56fc1db08220f88800d19db08781093ea50cf0274b3660558c54a2f9a249612332b40d90d16882c2c61de5561165cf93ade1ae3f13b468b6ff38413d76f0fe9308be4ac953565a54c8f3cd61b249d66873ba9c0411cce102f2dbe2b7e40b7f9761819c0410d3c7648ebc1b766f1564e68000841f4f671560eea54f12f3822c59c365cbe911c5121ba1e1983f52b1c2345b1c2c37d56b4af97afe4ff4ac3d4dfeb9d29e1f5d1684a088c80c646205387c8c745cf5a9c2c9f41e4ea90615252ab1c830df4ffcac631ccbdb3f8da7f90de39c72de01d552da7a62fd26ef39200b987ae75420f771f7b6f381f8612a768b93127d79026105c4b3cf738e571d1737db565fc63b554b8a9787210188f262f8b476fcf4a053c1d1c6ec18a9e8cbf3f7a3e401fc471e2462e60f2520ab07a79d6d51591884b57047dc41553e484a9a9318ad33c0ed5ae3c8cc14f41e72722bc2e72afbad568ef96f1c5790171fa2f65361385ed8d5127004711df6c2843ad8af4a894a7bbde74491afb532fa16dcee7ea70deb0da64eb35efcb293d68a6794abbdf6ae4962c739f5bce4a4b0d4fe695e11b540270814941e955b33202b0249ff68fa8fe0ed36c0e26c6a4d0102135139c8b7c7eea56efb8b66a13e6a1012def4741c5509053dc1a2e7d194b448208d58f39be72a2263d0ee940b1c7ae09f3bd009e5688a52e2247b54a0e3934d2f0503bbea07a22afbfb8f4a22351844b248db4edc312b7e2fd1b6db60a164ba47a182482b911f633f64b6ae6cf20ee451ed5f6c8916b62e2cb09aa69835f03671491cc1e6ec697536f3abe873b923678712a28b7480f10ce0aa71dad009ff6ab4e51a4ea4804809e991b521bff31e76599fedd126d8a6c053a581a2918459fe185dc419ebb584c75e241e81d609c8b8d17c886926849bf28d8a1424610ec599a599624746f3e4569f952c2f4261e9d6f691bb79fcee994997427088cb0f0ce364813c033aa2315fb4cd28548b654977d0c6ce2a317c676d78b4ddf754eff6865cfe9a73512a3389a3b35a17377caf44680408a34c98cf0738c7a59986174b2795f6c3bf12f3b27d762e09a1d00de4e4c531b30dd5a997bfe0650f95e8edd37118530010056576e235287e19de82b100ef37158f5417883c7675621302da5609ecfb998eb3e94661e68802a8e742dc40effc765252496a2705dee73d5d479b9a19d8d660a3e5eca29336db7675b52d4bcc6a207d57a90527928ae639809a6bcaa8d0feaf5dc32e4c431951aa0f436eca8e685a39e99e20e52760a62ff33d8e41a0cd5ba26ae9d507ff1bae6d3e5465643edd6bae92908508cb4871483f96cca809b6336251c1a97dce2338e68850dbc2e3b39c03d9e7fa39872a8dabeb0feda7ec73cf169ab17153b81a393e789f998c85d13561460c482062ee43827f0eb8e550eb77e7ce23f734c5e6f79c93a964692c1f7eef62653764647ddbf284fdf60b3d0873fd747e01c6fe70bb2963d70701e185bed6b45b8eae95bd9d2581436fc0bbb10a7f142a58b16aa0cc0c6f8f48fdabeb3f3dc55717a5fe97d143fe48ebadd3ce8595378fc49e115f746e3f3af1059339474d1bbf98f2a6f3be738374327a8c482c6964150c35fc93f9775c41c8c0a0571f2d40fcda3c95baadde992f0bceef0547202324fa1d3225a44e4d0a96d7da2d0f07bc77a52cd4d2e6acc7e1405102ee1ee5fc2454ffbbfebd1c9aff22f149a45e001597c06a6a25b10496f297accfebf9de787de382a0048c08cc8736b7f6a25642d5c3f59d5f9a560e8dcad9875ee51f331e976f4fe821583b6a0998d1e8103df583650a6dbc181cf434d1ce89b5c2d90d76dac00d9b3c6bddfcef11e627d75c40a8e4c88488894ddb13703d5bde6c6f9409af9d65c23d0b150aa0699ebcddfb4ccba8f787cbd42fedb30defa5e1c929ef5e7ccfff640b810b1d8468a3ae0c624174195f218de10b529b12ad0ec4c34e47feaa1f82899015e8bc03d69a054bd8462c9fc7f8d798283253e53d3e914128c36fa2529739b30ed470857a2eca81a68379a2f9b4b0e1d0b464f067de502afd8c3bcb33e57d5cb6f6c0721d0504981521e68abbfe21a449005599f596076816c9e98c89155c735377343287c7bb776b48f8bfd67e31c9dc3fae4aad0dc0e2bba3024f1bcedfe12e7e542d801df706f01f39a912dbe838d199f86a59ec828034420d7bb2b90d8c8f34a9ccd0afc12deecf30b036bd4ed97035b961bfda562ac8cd9278167dee5dbdc1ba753e2420d4ab7f653d0cce6c94003c7c96a88042c8c06c1aad0fc38a3c024c0f9194241de3705861b65ab34952cbd5c673db85514264492c846533ea12a4fd31899859bf428582ab85e917edf91729215f22938880fc895064df7415c5ecfda7c313680eda3224cb1081a061732d6014c2434ff16bd0570eb5472f133f2274f9a9ccfc1291bf674ac1e9f6aca655a12805076393e928d9efe0630bed668e8ab0a28dbbd4507372afffebc2d67cd714e38e367776e34b377a4bfcb1aa24786553151c4d5b00986e82314dace8dcfae2d0c69832a342829a385fd9c8526027306a6c425baf8774824cc1d85be9ad07337415f43d21ec152aaf84c4f9ee02e4117e0ec78dd9cf4fd793165478e1d9462e59e4143ff8cb4c0e692383ec84f1f7301663738ae0be7394e29889aad947fffc0699bee131c66e6fee MD = ee6f7213ad92981ac82d431bea13e18259545c89b38dcd3a20906801e1abbcd324ba466f78385f84ba81daef5c967896 Len = 51712 Msg = 5670f3e8bb9d9aaa95f12f71ea30fab7622f0a9f9edc2821ca7d0968763dc878a1e4931417e6a4dffe9f72c1abdd298cba9f58e05d1cea4cf40758b5de121dfc8fb169dbe3201910b2a7e7bea51dde1048ab121f60d28d167eaf8c94d47eec51485edf05c753e385dc91f52f81f8018935db9e254e05f8c891fe0dca008a1dc0f3735b596a88e986a2e603dee6767b40a8b765bad0be13a9547b4422093d9891b97847a075c7135b2c2d7b917da0327dcac8cfa58e04c603f0ae976398a0450cc1f60aa28f16494ba3eec411ee7d0f88c29545b02fdff91c8c1f6f5454b90c7934750c27617f739f2fb24626e015faa8b9a62da15c57943e515735bfe692d61f397bb5f7930979a0f7ff6997fb71dc26d784f041bc757faf67dd4f6af5338947f9926dd9ccbc43932460952ee8989b4a43b6f758f840a3b7f539271d2aa20f399b419c97b4a1bac3dd5a32b14f92215c26c4a9aeb7c1e6a023f423a22de94e3d4811aaf7f4bfc4774b77a8e9d76854a4a7376d0aa2fe31b01b95adc0a510309b2888ffc2341f4af6963e5f9e29211e6aef96ad3660016d3102a42c3e3a1d9c9a623003bf1bc73589e537c098edc566f52569d0f89ad2806903a908e5951a79831f911fb852c16b7860eb319eca5d148e72393e19f87754a1432da87d5e0eb19e8631b9738115d60b31e11b7a68f00f7dfe8c5e6121facf20edb876ce3c022b33c09a3bba4fc95d8a7da1e7f27086410af0ed9a97be62db3027d0d99fd8fdcf8af4540b5364e7e73c6fb4fbcf8a27917d71e1598576b85f1719ff39b9da0785eb4be5930669765e6a2ca1c1d85ddce71da8f204f1f203421eedccffe5e928359dedd7399d067fa95cdff09fd792ac2b33bea701a4da4b6e8dc8bf91e9ad69c7e901b267dee209b05aae2aff92d0a04507da88b966d599caacd461588dd0d12317affc8493a61c5bacc1d648d3c0bf1ee1251e94fe8bf43ec23939bc9bf769326f213ff882f9c09299417ce2600a119c09c7f0fb36a564b2191fd026d9cc38da387c022a7484fe3d6a56a53501559ea8c6e78754d4cbf10ef7adacfc11f74604bcebce8430efdd446827d8a980496f2b62ad6908a1a4a43aa50b57a709209b9941942a6d80e1668fd8dd9da6a48f8b0b2342208065d9841f6b6259908aee407f109f9e4d2a02a006059f7c9434cffa3252ce3423e81199a390da381e5b093ca07135b28df7fb93923696fedbf9b0c58636782b58f1f5ecaf5e9a7eb8461a97e2ab7eef93af744719b2eaaae3bbdbf3f119698f894a2d842c1bcbb2c811c9592f08a1dcc81a14c584c2c2081441f88c5a41c9e71db9606a0010945db585bd8b6ecec60294ff8414bcae46a1d755ae99a8f7bfbc7c0736a415851e06e76a9f35874617e760286c3ca8bea0fc92bda520c58373950efc593c51c29035c688165d61b8b915925b72462f3af5a2af42862c982d0efa3a5f6e399e0e1373baa6cb0de66cd714946141393b69701994acf9c2093db8736bfa20a4e3b3cf462b8e654cfda9976acc027f1db39436ebabc3a5ec00fa98890693148408f7eb3981068d238eb921a1a405d5fa7e03729f5a4f33b165aed7c374f3f5e1f42390d124d7eb9882e29e418234ead986fe4abe0b174a1a209f9caa1de269c4917ee5987cc926b6bf6d36d0d05567c1b2cde6cf25e4932d1a1510c469271834c6521315f2a3e7822ea210d8f531f3bbeab76f5a107eb6f4395a5b9cc18cac397be541d0ec2fd506b7c855e0599037ce16050de833ad5a7766b5a4b78bd7cadb98819852d333994943282c71643ada021f00e700f83927bd8a6d139f30d11c23066c40221078da53b80bbe127ef6855febed262ac6e9c7ce8bcbd2db19424a18abee60c809c6412d00b7334b0f8de0ee6317f1ee0686dfb2531706f3adf2fcc2705120cd28e476de0175b2a47fc892b66fc571d51ed81a71c899da6f53a8d92a3ddba9b8d49c206ea58c63a6366d44bff83ece6677a71d14d49874d8752e8957fbd6231174b4e7e6d2466fd89d449d12e4cb2f2a79bb93a35e5efcb67a4ab5519088b66172f5754d72e9fec21a1746b61db4bca78cdc22244d319b8fcac50521e63a882e35276fab6cbe37ed16ace6b389419f6719d172a18b5a78edcd6620cee433c40325128008a80d43e0facc261212bafdf286632c21ff20bd57ebf7af6071bd9065aa7d4e6d0e1e4a232c3faeda9f6601ce3d5af8ad91cd8f568c3e59e0771e14de2c3281e18638733f16cd2513178ed085a47e7d4c29a818711805c755dd9f7af513f7c26df8a4e6bb1e3e34c6647a959f25966406aff88030f712a0c78b88e733c795b9184cabcc1fae5982fa6d7276a2276c54e30b06ef1b912d8d3f6821851eb0d40dea6a934df42de7b8b71abe9b1812c6f6ec261a8cbb4e2036c35eb17c40377b66eb3aa490c103b07d0553a52d884d6df228e67b7f9797b2425e5482f421c2546e24a528be0e977c7aed0070547b4229efa03473f137d2aa5a1533da1447bb25ca9c9165fe64531356760968377858c1955af9480a2469d125f2e102043c88b7255be8a479499e3dbaa956d2ff07f7ff8e601b43f1e5c2ef4cfc4742ed8893d2256a902d5648e0c14e8cd0f9d3b087a97fba84accf0247cc763b4de1f7b1423d72d07348bee68268b92a5d24dcfc7088136e1acbcb045e2f4cb8dc294941ffc2b595773dd9adeafaa488e69a42721b64f086c7e70e7271e1757ada600cc0312796c28653ce24813fb6b054a42c9bee05be09714abfd4e7ab9a8931cf67b43f35bc5e87d4c6d3affe98a98d8ac2fd52322600023a07b3285363eec7be83a793b4d0716106e843dd01f17b7b942e22b0b5cf7261000e959ca177b086758720946c7904fe325dfb710e6a2f050a95926e54636776e4fb05ab5f7fd7543b9ca8aa25601d459f4c83d5eeabcb123322d3f6d887e8292df688bd53226c1b5aeac63da62dc71e97de646f695b5a8c58fa6fae08e5fb622529a83a460976c2189802b5b8870771603b25a94622e15ac148ee00ae25ab0912baec8a01dcfd31becfe47b2316e726438a4eea4faa6a64b632d65390effd063dd1dc1549420a5093b6f5f5af836e2688f468994a98fc927fe0b10e78e9fb41ee970143e9e3a307e176bc8c2376a45777a0fa200097a0cc637b069b2cbeaca36d33e27da768d33eee36c1a8499692a258b68ce6394d5dfaab2b5e617414181201ce08294d799fdd041f8db2e78c3fef7260a653bc623b04a01740c81a944877f390f9b1a1bd11cc6959a710c6ffb4270ec4d1cf537f42d287683438e4e543bb8ba03f7b6cdd30f3650b972cae98f730740a94c2c44c7b4cab45c2199caf11c4112762f17580043a425de66d67ff12f4ec5b7894d870ed5b53d773d3089cbb7ccd4ce879864f968a46781b3ab8db0c5abedf04ad5794a0e5c646cecef15248ca07385b7d65f2edc9bb84befd6ad5ee4931bdc076095f9dd34db95c731e79c09506124264db1011e1e7a8581d4594bfab8e1e3455b67aeb0e3058a32859ba2cc713032696b0510bb8130d700211c187671d29e9b3258c927db74c2d5668bd934776338e7bac5fe23886db8e1496034f65260766f91f3e9b072abd82661429fdfd77c9027b97df9e488a393abb9c031e8df1df338d6c380d96d0d228be25a672d15eee0afe387c48cf654ffd5fea68fcc7c6dad9d9d421f011f2b4a9c863defbab72c92f6c58dce7b760465e6849dbf1fbec20df431fa14d5fd88b8deb96769f73fc83f82dbfa783e7c346e63e81040611acd8cd3514622b6aca7e5a8e851967114443eea935862547d6761b495a8a42f14e2a2c167c09921910b59a1bf96d596d923297488220d3bfe1ff87f19c16ae831a3f824e1f418a54f159d4f9ba1a80702e787e736d1f97372b09b29f0e4f50b0573f5a45c5b01c03b692919090c9e1005f3c2890c0287997fdbb23b979de325e4f52396236fe4f0fa8875848432286066fa61f0941e680c79f3d62a9a56a5c76489ea90f39d42c5e0c61b1899acc766ba4dfea44b9feb4af59b8f7d55a9cd4e18b4e31b498dab9d92d4724bb5e70b915470f11abef1b1d3873546ba7601ca48560885ab719b7006852623a4657b558ee9f5d1ca4ade3c448343844857e91d44c0e74aa81851309f4c2da7a924d445addf6f29499b9feb0c8e58d0dd97ea36a1ddf3cab7aa398da63c6d66d0708c4c7c992f601f1dc15e9a1ce7a4b0a26fb70df1905e50a3dec7d9fa67e990e4fdea79cbc90e914ded078b9372888803f41ed7c05fadf9a19b7fa8eaafb880dec3a033dbce8d66a87d664fa68be4ba3901deadbeb40219001a2571a1a75c26ea57fe294da274f5b9fd0b54ba8651ddbe3356ee413023356ba549e2a3d13cd9743554d895e75dd4fed65749341458590fe34817fc4669e520f76d7a55cfe33f28e664b048ff906ae3a3ea8bc79850b2aaac02b944894e9eec7b00875bf5e7ce54d57e4edb7dc55e04e0259ad994e3711af81750be5b59c91a9a93b81ae5a2eda4ad3202c1c454f4df15a8f4ee8c792add52166cce4f13fa27f0a77b1711ad3384b8008a9065d7e5debee5387b019a367e44507c08d6f5b8b0f7ac5ed4fc7f2671906a34dbf4c69790365ac40376bf2a5a3975ecd275877b322a22c1d928914cf7c0efafe8e3998070368a361c7e608d0dbbf76dcfcd31c827f2ab4298087c0d83b4013a5ba4c9471b19e3fd2a6b16c51546554d65209d160f0b965f962ea7eea2043f82b8cafe41dd5b0887b1cf6a68ed63002a172221eb53bf748767fd9d66df1c0b1764c8710753945864573da3ff129c88727a4458be9298e6486217d51c9775e447042ffa1dfa4064216f187bee114d6eb4e2f9aa1648223c1128efe76667ac6bb00b53c1ec5dd9ac3d8e025abc6610236005d4ae78f0e6168030f83ceacc29f1d0def690f8eadab117186db8f07d6f37124747de6d094ed603fec34e0041692738136acfca2dcde35cb2cd2f10e3c52a4a2bd5a2490de72b1b06d3a34d43f47c443d32d6e6932dd36cc193259425ac6d562800a2b38b296643ddabd52850665183b0e15ed4b77501c5e97224f0bfaf80e4b05b5832ed90180cd7ae4c380319578512e8cffb072def068ecca5cd1e28f56479381b2dc1b5c0d4a96d80e2c887eea6d7db92e00ec30b9d1615307fcdb34b63e739942a83f4f149b76c1bbf0d5c9797741c501a3adee7f833ee5d9f4ad8f3416ee23bbfc0f819ba862c65236de1d2a57c3d800017dbf4a65cba759222047dbb84a48a33f519bad59a20f5c656c2307f54b18b482244b235f50c20fecfc05b00ccf2f84d9ce444f967dc561e44782173920b0a48f693b1159145e83bb0870bdfac701e5324e258b473d10e71d37e3620c8cc6598e15371d3b60a13ef80d31096b78e54fb299e668542817787704eef154d58359e9f0e64eed7cb6c709d3ef9c452b0449c1762eefa587039b5a754acbfb440e2e06c2f1ac58b0c3a65822537f7229855bc7aea52622a1fbd92e54a0f8e721905f4f53ff3f6244f1644bc205b9d8b7910d2c09f417b4c028b85c67978102b430752a6bb910f47f67884c7aac52612050e8584fc3ca412ab2c24a77d86d324417f701d1c726f7aa4e9ac214f053f4aae973b348b945b228c07f614b0ac4611b6c6d3b4ed089510dcd2215567bc3789f8536a6bc7f92f0027a7609add68f767f586040aa7c42ecf00da9ac09f2aad7454bba9772bdb9e200092fab63e4d559b9035778ad7558ae9b35b6f1f50010f8e56486ef331ac06f6a9532ad36db9ef21194da4b1e60d381556ed24be14bfec3c6f72317c73eb18187450879ee64f229ce337121c7e8bc4c68e08422967b7b20322d1775f6d293ffa04238755326dae63a0aa5626eb31af71ab254dfdd3990f76f2eec73887e6fd0fdb44a0b2cca5d119b3efd76dc69f569b40dcae87c2d4430c621297844e94cdee6c2c6a243f784923afa02c5d9b3558c7d186fa63bfe9fb37f2e57ebf3bc3210a39435a15e5656515f643ab82d394347bffcca81e454a968e27ffd365d9e2a4e7b531f72468edb3652a42fb59fa2c682c0e064e23dd96b383739a3c04a383a80b8270a7cc3481b2a5ae36925f896e725caedc32f1033ec09c587d2f182326d8ea03780279d2c1f13c0496f7100bfad19234a71d2230a34c5d58f1031cc33c8617cac08db9be1eedbcdfdc8ff7fc220441321f6313e074c52af79e8e8f2e355df93ad2b0086109068c628ff393d4a488fe497d8b62bd13b9a9b6edf7ebaeb1bf12f636ffe26600ea4f6f1998601fd2ee2dcd6a1c7b1110983e1967f5bedf3228096f65f3e437a6f75a481204d9583d9264506d8ce976fbff7c8184fe853a27372118d8026a505bbc517ff1cf8bf855141654e0632a69264dd991cd78bb3a115b1e8505c1f13aafa7b989413ee48ab9f1d85d7b25ba623001c9dcca0add697102363687a925711357f6f688f97f89ccaa1ecc964b15fc99c9e194e31b7852d6db2cafd62e537e174b9e4a2175b9601dab4e44ba59c982d3e4a58ca120f860b334564369d827cc3bd113f6b34a2ec81d840b385fb841bf7f108a169cc1fa1d86ac37a3cb2cfee5e1a6fc7ea6cd4c0c5cb2ca2a0f1d1aecebac03b52e64ea03d1a1654372936545b92bbc5484a59db74bb60f9c40ceb1a5aa35a6fafe80349e14c253a4e8b1d77612ddd81ac53990537b0c30018d63a2644b3bf85a55ba8666d08d874a95eee2019f4bd433f11fd05b6b33fffc5d6279c34f2d5c55ec6a4bd88541749712d10152aee4353280beba598cbbb3df2941842d169857602b15f17db3aca03ce7deb1f3e2458f890c9ccab86012003c89976e2c41fb8e2b8a4413b0dc1d9e8e7d8e705fa9ce27c9fd409e0275c54996f6caa42b41c544fa928b2f3c7f12c41e5c56c910860ca257cb3080c24e440470e951a2b4a694206fdc41a05b1d3ac55efcde2891078f93c50ee33f724a1cc55ce9d30642e0d6b4fdb01e13a726e3f6e2e76b1b6b9ea5608420ef168d09ce10ad60b53b70710b6716b666f5ab3cbced2ca4b41e0acc0c8d37b9aa929d0dc65af4f67eaea7e7b0ab6d77b2c2d1bf042caead1fbce910239e3231ac500cb69428c603a5fc63a55516444c8817a53e7819eb692454a0fb690826116acb6694c5ee9320a1913e4a672c4dcd6d40b02b875965715881acee6b5f65d17c613538ca30eec6280992377551ec72c8ea6d16904faf5e22d0777998f8740a47bde3131f742b7c7fc1fa0cfe2ba2d52181468041811b7829ad9b2d8087f324633e1aa4444cfbbc3f56f02b601df35d1d81d6e909824c67c395826aa07245a8456e267cb71fb1fddd34ff2349ad7073038888c166c7b4a58714c7c1775c0e1e64caa10d1660f0c9efe88185295e8ccf79f1f699d7c5e6a9fa97c5b273899eef47d014c5b0b52a98cdfe21b17da5bacaf75a8ae2db0154ed84bb16ce339f7aa3752aec373480e1f31dc24a48c5178cedf21ec02cef0e71f8bbeb3575260243d36317b1e20058995155e185ab7e3865b0f0db30e89241e05406a4ac37c9667ce79832e056b2a0d34bece84e6a276cf7ac7a0c5796534002780b73e586ac1078589b1901f5a9fe023b69231ef55f399549042e9ec6b08d6aed20d56bf23ca4d8bed216915f84c4a8b8514e71ed6432d11f15be90fa288e7c1bfd45ba0af9a81082d3d818e4a199594b1ba6d1b2f4cd3d873538b89129d7d89ce7416a21718eb23d26c9f335aef0765c4ee8d8d68f8d2d19c939803c32dde2e87554c6e622bd20563158dac2fb4ea2746170d1c872e7425f781d724be2153d772dfc8ac98bd80d668a211a0d1528401bd9cb67196d6fffc098612950a6224ac187b5103c2b53bbd6a7af4b849af1e1cb3e750349cd7bc7d5c0b0ffdafd799d6008fae1be7fa4ce2f005fd9b9eb5ffa0af5fa30da21bf3d177769705b667fa7db285a89d0f76fb6e82abf6f1d84a71b43a6c76a2af89ec1fe230725526fc8ec8b7c3073142108f89a8d4a5640058ba80db76939ecb09ee9026a26894077d9ee096b3937e89b0525aebe8d49a1cc6232d1ae5c0a7fe83424cca33416a61d172edd7bb132deb3e8a0ad24f493b377cf4e37f22c66551df317a564ac4813de25216034551e571a380c0e671cdf0566275c993936d82cb0501435251bb7ea2978683a1b8134f22c57ca5adb727618360ee08dda17ca375deface47afec0c99d8555d397c2213068dc5e1b1872135c55ea6c7e5b4bd7255506644bdcc1fd1298d09cc53f946d825e3a59b7a4a81142544e62f3435f69776448bcc3a101e755a9ee8f77897464688b062fc8e6910a8a9faf668518af0badda3b38f48e3b0a134f43b072fbeec0636da452b774a96965b681e99c41d7382945324b46ead9cfdc075492301d6fec0374b9650bd57db894377a6eb16554797a23e266435d6ab30050a5c747547451b94e99d95e6f7a627680dd585ce9933a20f4a03c723c6a5e30b9cba22137989c0549ea2207c91c018d213f48f7453004be3610104c2e552bddb11ac5463d492577f51ec19078ff20589724b3391ea7639276a6a449a9c79677c537a32eec127871eeac4a90d58029696102297acc65d15e34d84ae3151e488f6486ce53ba612f8375072f81854b87200d7c1e34d4f7d861df2986b116d59c952daca95d2ec1953d56d3e2dafebde42cfae6f40fced9e35df41eda2c259a1d297f0db693cfc0540fd286f705b853aad0b7c76d6420887c93022cd7cca7c844acd71e88a003c9d66b9694feba28a965cbd2b1ccca60801eb197d7e21b33dc9d9fd473920a616ab6e101824c30f62b8f6eda2aa4ab155d443a03a49b805063a282e591652b7f1f5ff0b1e372327756824a1c9677ae957c878d0417669463e9ddf688fc748ba3545c2b061d031742c708ee3889d82d876a433ae7a4d5e004cbba6b3d1932b3749615f09ca37157ded97dbbac7928a061b321b44cd16bcba9a5c231807c423b697117d1e41b3f8ca21a4b42f6e90bbfaac38d9992318aefd8f47019e19a057c0861fc4f5af8d02e43160c04865dd3c3c937f14b5629c5a509346e64eef70f0dc7e51de98fa0e5a528393a80f94c1365436cf75a174ea MD = c966b502473611899aa80eebef4c206fb2e22af4386145cc1e272e2d3ecdebf1be7c21c03a47710957e82cfbeb290a9d Len = 52504 Msg = 17450948986cda4399d2aa0cd697295fabf4bfd9cb1fd703356f7e8c64c12cd6c61ae1b5708e747310602817236a81e668bf562b94902634474cb09d3f0bbdd1cc2d41cd833ea227371d584f255eb6166fec076cccf3dd6e7dfda6a0835b80760fc64f1a3a460c69f653603e443a71f4a8c3fc26da11a4b9bfc9891d97771dcf782d3323fb6d59403548686ce9c8598afb8c5ae028b2211ef5fa819ce5273be4efa916702f7a32b5dc4699607ace17df518e4c231d9dffa407d6b5a6d43582bb5d83208a3f363eced3931aa2611552fb9012f876219ce454dda64ec2cc679c5ea80478f891692695027714ba0465b3e7a26086619c75793460b1737935872ed5ba7147428fda9112523caf31cd86e2aa6dc01f6cf6f1654f76414d52785be3267915b4f1a053284ca928128d233f864cdb7aeb2098d850aa089c04d5fbac605bcf37e88c2b9a934bf18566596d5947d6d3d51104e8f2e44fff0bbf8a2741507ca31e0a9b9a7979171099d21a159dcf4f3c1ab9a14f07c64541d6a6fa64e4598fdc1343a654b582b9f0ad7f5a82d0c3bf00920d7d36dea194b845e2ac1b5b239e645ebb36c1195738770895a01cbdce2e0682322203401b454aa09b28b26f57b0224799d2496ca09c8ff43b754b2b96a53635531820f5dc5ee12ef8f793e89dcefe160603547504ed1fb7996077e1c32b78f296e5f3c58dea643822a0248e9cffe01229504afd2c340e9ad8e908a8fec9b4002313e678d6eebb0641abcf29fd4bb0842b4193ccc07946e520986648ef86d2a8232a5fd55e74cee07ca1fb8067ba56b4335e97aa67c2aee098f6f9893d6aba32beb0c8a5ce83850efb090f5c8355bbea6a30bf5fc9192ed3698a2a33907d55e61b2f88b0cd24c8d7e76b7585f923c56ef73e71b28f85ae05badc5f0d92c8890b632e07be045e7f85684f94c3702c5d870310166d610f16bfb47501e0e9523febbd36ad971b39925ea53ed4de91796c7fb62f1756e6bd4e497fdc79743d2360cc52cee202b9bde9abc7c09d9d0311d89c3722da36c7993feb42992e913744d2f74a7e0ec986f36cb3f55b57c96efd8b27af71c9d4acabcfed263587ff7ebc7fb4ccce99b22ce204c058996a2a7c436b6745a54bfa3bfae7965237ee85bb934d4b0047eb865092971818013f88d3ed62a62245c76e1f8e702fee27caed96d226030f706c0c9d0c0e045c1b3cab1b02572a6dd9a7f9fe6f5000248e82fdb680f12521d1850eb85752cc4c70ca5bfd8b313d4fea526381a671511af3807ec4a596f95df39c524c7b4ab81187525f208fda25f0ff30744f39b96af8de2b37674afcc7ec5d1ba2ff81dd10d3e83a802e16392a77a0a9f411331292e7d7ebf248750dd7f69768c47970f51bb91ceb86cc2936960d5525aa6e9963130f6728750f31b070a22aed8063507922ecaace39a4ceb9afd9a70c5f0f75943397154a896383cddc189d10a0652a506d941a4a605e0faabf041dc6db9bce8c3ba76ab9f6ec754d6181783bea26056444d7f5c6c5a2f4f10cb540bbe6bbad357369edde84530e16480544d5284fe99cefe0c2ac2e168477df159654481719762203261ffb405611d9cb88462087dee0b5d509636465c7227f4ca9f7c8561a37919d9de5225a56265bfcccf59b77ed18e0df53532f35c5db3681010d3020b8600960db99c24a153e18bf994c60c71d2cb62526e4562f878b4adc24ff461ffcdad07367a1a3b79b3f563d75b2391e770580d00d7ea3fa141804869c33d3f8ed8b2effc9678d4af1135e9deb8fec24018985078d89dc3e746caca7f1139e56945c6d2c8a5148ab1ea07808804c4282c5a10ff3306dcaa5b06d8a66a90671dff735d42131c99b812ad0eba6be4f03e0cb3664bb7d9235d5cf05e5ec4e73123b20ffaa07463650751e89019e2c01f7e5192ecd89fc61e576d91b076167c44a1317a0380551002d2e01b5001952cae53ab97392823640a131d79636ec7d60e10fe202c644db8efb55db3b313eb9139787b3ebfbd0b29832aed060bbb517af9fd68b0b9bec6b4a8191b503dc36e842d3730d80509bf8d26194cc60dee5bd194c111aa501248a9b898b96f5492867c162a6d119d80a9154f48bd37ee6a4f806af6795b73e14bfe9d9ea86f9bf3dbff60cc9079ddc460488b33deea21d194ede918106299be5929d3b578df7889d774b9884b5f6a477d9d5684f24b4c96d4909ba0674e360bf8b1d747ab4d7ea6f1726d07ee50b78c399a2d96c7e9c33c771eff29fe8ccd5c933d24ffa02812edc28f17a609ec4a055cb59cf3a0242a3504df901f469ce422c1124938080dd9b0b31135fd1e9096353f7611261ba8f6030658daeacffd0ee0fae7c07b334d47b24baf4477acdc20be6a6226a8aae69b48e4115c270b2bb229b9040753c284c14514bfcfa0252d7de355e049f5de5bae5926af706e78b7526f841daa3c2642eb0b86d933f1380302569aa6f788167683c66679d3fba91e7424d49b059eeee639581a721df5260b627a90fcbbf9f3c5c012fc06d3890cdf9bec22e2c6168d0d20bd5820ea369f94f2e1e17803a5e6d7f7c18fed1b8124594e1817ab482d712625cdc85c2500053e480ef49f6b26700b8f546a83086e8039ef4afb4b283e3bafdcebd38a6b1be775e66452d95ee6100eeb3e446f16bb90f013f77658d2d35d28aaba123208d4c6ca328484cc6b8f5720bff18607e2f2d6fa30aff14ad487561f039afcf99ab513a9d0e1f2defd6cb60f6210a7f3e9aed2d6e9d6f497a9c4b7019c110c37ad476ea3260f3597a118ad19761e42a9973a151483ff08d5cf05d06ec8aeb8729d063834c65eb56cd31daced606cbeaf784f1e11b3aaa66bb0d562b51de69a41067bf0dd26630ae52fe655e9b5ae946c09383e7ced4c45fffbcdce73003b2a195613391acabe9e86f40d089cea366c65c69026a495666fd90c397437142ed0622856615c27c3f8d8ebec657572a6af234ce14737408bacad6ea3146fde3425c1e9c01a4fc215a241641edd11e371c53ae8a61093731e54d3afb4ff9ba2eda29f16eab4342e161356f91edfe0c12a470336492347a1a120e22bc9c62916bddf802c30dfc7c067d4900766fe707022bd12c254ffc250c6796f7f7bd8b6ae1734ebb63ced692d6d5e733b81b92f850d9ffff953f6a204d0c6c22725d7c2ed9c2b5831697da6c9a92976f1e9809c845d581167c0b8553252a1809f6223cc39bf5b4c2a3100ef299dbe11d718f545d2748dfd7a25b56a6dee923164ab4d2136f32d4e1d3e07c0d1dd94ea379a779a13e59a2accfd5e302bf7014b038bc49059da19b466eb02ca36cb3656afe89827bd43151fcca24364d0fe8733e86e2a6806c6c935a3c27249dcf92aedac8dc76d22ff7742e5cee57711778c92afdcdf36e26b8448504ee6ee48e9eb25b9e495e9098d494ac4ddc4c541f499cdb652638b611b0353090ac125ff1fef8564a78419c57f038dd65951fe06e8377b986947b407579eec1a60a16f540db0931921027deb472e8296bc2d8fb4e4ddf2c27c0c6f49c3ef7a20fb08490c25c6b563fba193ef7822cf8290a7d8f05cf5e9c125120bacd25d93993456317c0aaa82b191d1da4674a8db265161883dc327b710df0927a4f561bf0f972bc7182ec481ae7e23ef84def92bfe88db0bf1b9ebf13e145221c6bfa452e0bde9688504bd18a73b08122f19cc4887a184e2b0a3ab0eb56f7da886939df5a8f31f94372efcde38330f00a9b77a973e25ff9aff12fd85f33afc2a6913a72de4e15ee8a2fffc38ce009929993a8cbe9ea09b93317a4bfd84214e15f2a26852110307b45d1a43cef52e46fb52058b25358bf969fc5c2ebbf49cf3f997e24a18b9c2aab5c9e05bf73a06990478cafe417f52899db43b1e67a1187e43dd35d4d84bcac83b8df4bd480943ffc381dd4eb9f89edc9cfd998387362e5d93472f91174365e0d3fdb9d037ef40fbb6e1cf04f51dcb52f64cf9f671003912564a31f75c3d3e750dadc24d5d58980d6d3d12a9697b529d1806cf0fdbbbe32d0b7aef702d95bf054722807d1ee1b3b544e83ab4ad8def0b90cf9b082db5970e314daaa3f1f962022ed086f802f72e73dc67b9af27b1db3eff1be0a7cd79df565627060b5fb4c20c135c4846801552d9a25022017ea3b1a79150324751952665e8bb840ead644973930a46d13cd8db572525e65408c00cc61621026f408406ed676fa736819472e93c8f05309f9e326cd35d790f5c93372afbf2c39820c2eb3d60b7e21b72a1d8dd6e4ef5dd0ef1c29b3b6b7cabf099eb36913a185a68de6dd65328b705d738e5b0a6beab4f21503652dbd443a24b407389948b531e8f32e958cd36b8be45a62403747297ff7d55f834232c809ae3237a94645b165d0a7cf8352d66498d44960e6665ff4e76596f72afbfd895ee5ecf6ad79f2dd4be70f914ebf23bfc0b3a751f29f9b9314c6bf94035e06d06250480bec39378008b4943b9edba3c42a0bdcfd0fe8e34d2da1bafeb57636e43c77af400f8efce3c7bf9e971daf3cbaff63502ce34b1f6c5b7feefde948730f15e28a5bbe80294fae91966b7142d7eb66446ba616cf3736c5e7c35947dea697151a3f25a018a60ae5b1e280429c5d9d88359532517c13f49461a1d9763fb8c563a638665e5d5b5c95a7ec9e39c6b4198cbe369a3c5b9cedef75f0471f738fe1280edbe69f58318fe6fc1b8cfdc7c6a79b67b6a47e73b86bffac1869e98315338bdb926c0c0f0eeaff37d61437a7798eddb97d19bfcd50b4eb8d81077d763002b594c4c24d8cdcb409e087fc8f6fb718793bf3c0a96f4d11dca194eb8254ca98cec1d8ae09d781362b80950dac26678b98768063e26395cafa6eb7dca125ca3bfdea38f9e8f6e7b88e9e680f37d4713061f08dc812b112276c7e53a182f218346a984b6b94f3f48159c268cad781bc4ffd3380b8e25faa705b59d103ccc29ccb3e5279cbb2d592dbb574fd063536323093c7c3fbf97747ecee8597ca289e3e47a1a12ae3eda5a80cca3d8f8af9fbba1a4c32bc590100d0e44e8c0fbe3d8de6f2ba0cc679ea6a1d5dbfa4861fcad63c5750fed59a9f032da0a2f6a0a6b4977c12b21bb556542cdb16bd324a8d50d1a12dc6b275857d8746681349b14c34c4e8f0b0566042d1f4c97feb6d439c34f3cfe5d6d703e443940384c90fac76661d12d4dd462d0409c9cfe072dfd9131e44afc6aaf4e97d99324c3bebcff8edf1a9e20561728566a6b3d580791075bcb5cd291a67918e18256a09d7a212fd797f7141cd6362d12e4dbac3a829877d5da295262738375a7f9243229e155f23e1b57b15720b9f7725a8e781a0aacc5bbf8da48c37436cb57986c67fd96d3ed2ef3dd1483d82b0e1135f41f8b0236775aa1c034590b0bb07cda9fa08cfd1377269bf7bc076f01d75c01ad00e20bce135e6fab9377aa8a9b844a5e7a6ca6ad36b18e27f67657d6f9df3809dac379fc0023acdce4c3f53c030a61f953f105f9925c44fe723524f2dc07639afbb3ef18f436f3e4b6a26d887d8bbc20dbcead9120935aebbde8491df450fee0f217dddd3624df4377b765f86164a335606a000c47d32a6017f44690e968747c3c83c8816c69c989a66781246531d1d78037afb39ea85dfc3eedaff411aa5ebd596c31ddfd724d17d1374174ef8fa267c9dc0f3f9b9f40208138e7c003933834c7559c2b7fdad48e76ab196266baaf669bbb90f8a5048b7d9d6a708d35bf7b6314c489f25a0fea4e05379b85716f5364745ae78761948a53d1f6fca43e8bb2d8b02d6deb128e08e70b612a46860a28e1e22e755457abe753cd62cebd748458f62814ca4e3fd1baea07bc583e1b07ba5f73caccf7ddd70cedee3279218e45d85bfb0f21c448777ab778ada7d4b704624d97a450ea8a928592c2ea8e88c22cdb7a9770f6b5b2fbc2efdcb99b92d07ccb2cdc4f9394d46acbe2d9ff715bd6b5ccc28beecbcb05bb1de3b274a600fddd5f8da021279f51cc4a4e91f5b403328d16d446dd235cc741f6438843499795a299e081cd6f527933ab369941e9274bff541066d07fe36e3ce67fdcca08df4e68f4b5ffb8ed66b13d594b4e886320a9a90f175a4d340760f869090e5d66407e9d0a7e885814349045cefd201dc487d1f6a2499fb8023155f0f87fbb91e453bcbb45baaa3f9654ace986bccc967fe53b84a837b5a55ce9a3d30f3462ec05817f4030fad3e3c63f5d951b1a926717a16ccf9b522aa996a8d10b37c772e03c723cc856afa3c9366d38d4e69710240e44dc2406396d1951e773f5ecb98a031b7e7bc0215988746966a53593a2d441d658104e535e0b99113df34fa88b06b9052ec2a41b88f059d1a459138cce4d4502539f9b0d20748d4704d564e5bc87969c0b97f0bfae8a0e01be9b0b4c89e9a214bfd096be31368a85e490d24eae7b10329d6242883aa3e56c0e01995d6637dd8ff559cdc0f0d0053055cc142e015fba8b4cc7f60fcddc94832b133a39d3c68bc6bca1acdfffcf81e8c0dda71e35a3f9e8922fa7b0d8a28fe98e465a6c6304016b4e3ec045be838511ce5c0799bbf652ed160fc405db843c01b011965f848ee2e05297849cadaa734dc6bdc22b24b56a0b40fec78956f02d6e391b6a9dc8b5a4c84232766f4d82f0ff5279434cd07f83c59b634eb5cb74d87171ca43a1a016cb85959612182edb7298ea1517697f9344ae9dd3b615b990c1de0284ae059b20db9ad538f441c1e28cbd0627cb1b52bf3118b0c69a23a1c27de653f126341a72399a89a17956975683de3f17badd2a51bda68cc2675a0498613cfe8638a7be7979e71b563dd12f960c7eed6b832946d95eda7a4daa43526120345aca51eaf7a5211312cd9e3beb2f8b1199a9908a38d4a92721dedf5a2beb1f8f01141e884693b3a0f88e37116a919428ec488f6a80d2111eebdc8318f164c38f7a19dada3bb3960344fe84dc2e5a9c372dcecc64bf301b1450fd120a338cc0c83e42238b47836ccc70c5040696e917cf06a2d3e3349d4bb9f987189872b17bcbc6138505ea819c7f1448212b34dbab52df7b3270917817723e21035e3f71790c9a048bc4954ca97da81e88b4a890bb6540ae5487463f02dfa7417ed5ea5b2d0d329b8451e843084a94ae973d32a6bc68b2c2d6b1d3709254bd6ec77a03bd2c30185f2b3853e35d88728ed91f939c42ffae4f256ab9ab4a63f91f99b52c45eb27c3b5cce258cc0d99ba25cae61bdfd37cbba9dd2c795d9fafe2ca5231c453ee56bd3605da775bad10e409f92b6befe27233694a7192e6067af2f57d5a5c85aa4f7d5652ab2020906078a1c059e45af472de1409d486f31367b22797b96549a3748cad3fbef3996c1af093ccfc158f8de0e42097cfd6034af898e72db96f2e6e5853a1199062449492d4467b7c902c136f1e2580bdf08521902fbaabe4ea926f8d7ab89cc9ecb0ae8aac306875b48f295fc479313976f71be0def89eb658142b665a7a25b5f34c2e44e0f7f052234734457fb245ccc9d7ae4d3f4772c8482226858b5c410f369578640af3cfac3cd2c8b2b8671ae279b56d47b91dc4753b5ae55d75e57b1ff72b316a92ba32de91b05b1a06ee4d15070ebd62e4f20057921cfc70b28c3072e55bcdcb00c1e683a27e700dd3de38cee24233114b4ab2e9fce6b041b9d71da251c5c1f7ed914715ef8b8be0b7ad8a9a9c0e52f544ae58a6cc56b553045c7f28fcf7a293a1aed11fe96623451ae2aee2b4a1816179937e0890db80272a72e161274fe400d581010c20acbaad860412419cda62f842807fa9dae3853084b0f105615cfad1f19e736515bdd67c71885131e4e76c2c47fbe9e51b1d5901bb9d0a604b9d7b897e8d94b54917eb5475f5e82e0d77017fe26c5954d1d7600d27adba1c469fda89e4a4e1672b598da80bb343a076f7c755ba682a738fa03ec561596c83d2c29c75bc9ae6054ce121f99b76f043c1f822603855f9bbb51639cce126be5180a435bf7ec62f1a1e4d4ccbbd877a627ee6a701d4ec33b7d29805863fac1befc0b34ad993bd0910200c6290da8b4e86fe41c9cd186164d278a41683d53ff1d9238e2056a3f61081f28d07eb8ae8f94bc0981f149b7bf9a607c8e1383a88fc8829836ab927f7d1d9f67da12e3726e70b8667fb9aa6828ead1084fa35e7ed887733318e638848d9a2bc2cc2eb77dba460902ff3a1f22b80521356c5ef55f42240e1271ff84d4f7456a438e1a5c56dcdc57e5eabecd6cd7b2f90cce8d71d23565fa3c273e9ff925e605f1081ef9853afa4b18268bdfceedbb01935b77f9601914dfb924ebb17b7d47a3d42382b6933e6a8ca29de97bd062e6e0d4fc66b68f56f767924e4ee1e0692fedf5c58dbc074ff3c38b3522cafb9ffc3fd79aa0cfea54d738ce8faf58b250658a5bd7883369d45c98dcd87df3d60ac4c5a21b6e6df67c7bfa75ce553e789ab2230e42bb4342376eb29c6d411eea0c081b3f6918b83d34ad5690f389babbaede6017ec6e1218dff1bad3dcb775bd0e8ee8b66ae6d746e533f326e593f402f6b1e87dbfe9cb7634ad57890d271dd9761fd50d0820f399f8d67b3f8ebb15d5d9f36448a27394e19e6932c7e7d841c6ad838a4e290d33bfd35e93e3d54945bcbf6b7b817c5695e385eff3945414070a1c82ae81b7f6c03fe093e51ba284ab4010e2d62f37d8f803510541f93c21972f2ae4e9ac9923c1a1863d19eeddb570e835201d5aba42e2ca6a74c4fd85481abd3e70e5d9b7dc5f6e2c23d7656f24bb3d94edf70aeddc7dbe390325a818d1b83ac2ef470ff969c22d3c0ec6873e19b5c696110c48b8edf169247c0c02dd0498301d2aba57471111661dc68e5c33dc860ba353051b03bf665394a52014bc29e326b7e6e4b8891e75a13713d8ec36b45594247c8a8cb6980302f2480ae59e87c0a5f8ee6d3aa7d61567f2bd4c4030eb4aea7f5442a2b9c1f000a42b727d696758344809fee589821a3fb68b915f07c78f941ea3d665f48256d51417fee50711d35b0ffe3fc21869abb2eb465051a591491a6731eddd50225d07a8d359245ecd58a2b596d7d83ad5f147f9b6301ff090a305c4c63013b3eb2c20ca29294258e30f92a2996f2fd80c138648a3dad0d20ec3db9c29470e0723eca8e1df1748dc9a21b23ecfaed0db573af740d5f56c3251d1275723d9d63213c42555beca3dd13cb68af2ff3dc229fe8e234a132afcf7a2f66e5c7c8e741e03dd218d8eeb29210ff5a324f3c30dac493691cc2721860b4959 MD = b2a7c12abd0703108eb404f4d038e82f1223f0aa15db525884b7d239e3bef60a5248a66f515dd61f8387e475b4a0ec42 Len = 53296 Msg = 61aab1e599fffa75f3187dc3c0d03534dd62086688e340cc71103a99144a62e047df5ff90f8b8a26b83fa5762520caea64d3a1d785f8d68badf4ca3366f489fd392ffd797f6b614574c2f7e98da6fe000c23df99d164a7dc7379b9f18f57c51d6020f42e90a5651a4e2adde3a169babdfcd92973122f9907eb257099387bfc89e43cace0eb4380ec6ffdbe2b0971e76b5d7de92ef16296533f8355f30869178aec0b8d57384c9905ffc6028a6cc66b50569786921504850a9418d1c9a828ff66a014005a1ec997ab250a10c8727130b410b06867271d4d72156e4de1bfc09a6529df6bb345c16427095352adc4791ce1b24ff775ceb6d8d3e70c2f04f63ad2d1aff43728563ce7c1d4282f000ae6191e65fd9b84b3d50d77357ae0faf59d8ef059dccd82f94308c0ae120f8bebc00eb25141bc5b7d85d4a52541c98b63f1b60c501e9388d5dcaf6ebe985a141010e2e69da3c2c3d5cb15a4dfe8517fe93f316bbc42f3049312c4112d42796421de7f0272ab158463b1b8bd8cf7df9d2e8ee955c4d054bcdaea2ff22298d243c530cc4ef7e21d66ce3ea63854f6ddaedbe6c51490511e7a536ed859c623ce79a410b11155cf4231bf7ac55d5e6eb27a974fadef494db804a6a5a88d416ad5cd67851695b3fbedacdd6efe73d3e7c6c90bd2892d174a8c227a9785d8baf55008b697e3203aec84a0d1213ac4dae78163de76411721d2019e774d5880594da5f2384f00fb112c71d5429b5f969cf84b10b944bef5906c7f3f46ce0ace48f93e5396b4566e62431a13d9e5563241a18c974442e60f8ba16ecc8f22810aac8181f378cfcbc052b7e9223e0608e0f06bacc1267aa2ac3bf7370ef952a77cb06ed89a84a6483b0b1244c918065ce8d1dc135608f4db15c8f840cd2d65636c7947aa0f6544b625b5db95d10fee39910d7e291e91b77793592cf2d0d3639c2132945f1bc1aefbc7779b4303ccc58924ccd957e06acb606c161ab5e192553ce401de5f8641ee01697ad9b625f79333e9357303663a387ce8284af2c612422afd0eab11188c0aae53e61d56ff38611f2871d69776aa06b551b7440f48fc324eb48286df984b0deccce2f08b5b35363529a78a79d9623ef1edea91762ff82d905085f430d025fca21d96d8bdff991a5d330015135709e81a06eab88d43ad3cd81b3e7f6d86c3e1b88f2b5f54b40a157f90a401cbb7470a17e2df41be4cc4660e5bd6aefc83ccc31568c90db84230308386bad60bc3c6aed0c9f0b57011e4b41a597509468fe9aba3f097695171b572515e6b1a3a412bdb2d05459a0a5bb62ce45d4119b371c2a04971befb88093ee4d160de57bffa219a16dd077bf6f2e2d955af6565acf3feaaef31664bc3d1768cecd33c1404b64ef273985edd9b9e0fc05396077697db45d17d79b5e26b9202748801acda703c5aeb2c7f714a6127e5ebc75c50d2ddf2411edc91d647e9148da48e3057306b56ee8d29da6949b0540e619a476703e7009898f2c1ef02a31fbd22e7a9649e5dcab2e153f16d63f0ee2f2ab2a074911ccdf248a851299c037b3af879b4fcacae614dee900ba61e89bdf34ff9aea102e320f834e788ab9c70efad2e2e9847e3c7e368bcc9713c05e489ffd756bb14e0a6c3516695b09e8a5245becaed9f6cca0e18aa54e76c569d671afecab00df5b2cc7ca6e69b0f29ef104314d69d0f94eaecc8bcbdd0421c707b389630f1ed6d01bd149fbae2ed755114b258592831e6c9caba45ff6e3bb70589aa6f1200a3a454e053e3ec5194a93bc559315c754d8bf10eb7ee23a7a14fe4f7393277c577c1339f001b84cf4bee328b0248e66cabaaea22875f3065ba0b962ead876828b1ec2661e5ee8846596cc0ce7344fff5926c3a6cf23f2e8fd014a297ce15ec11984fb68fc805029d074a6cf675cfaff84cf96b56c036260d2992909963850b68750f6a8f7207f9bc9db1be6bd08eff5d1f780546b8ee1fc70dace99b367ecd159057cbcaab9d768b63c83f964c2bf60c54118ea6a30c21a4c68a33070da93b00314d60a83a6f80f1a0b876ddb14e9dee32ee90dd493b348f9b55f944b1ae5c12a019b192e9241fd99ea8eca9c69efae9033492537221616dd335c0baea34393124e446ee7e655b28a3c1276354c418e60d0e1d70e666af27b75112d17fe3d84607d6a825c2d93dc7f82ab1712367fcce9aa2b89c6cb327a58fd276f13a65433a8f165ea07d29cc9ee50c123dfb30b087f018eb3fceb0cfcfa3df7582e15f82f305cdf0c677fc1195b18fd02da4c73bfb57993ec1d204b18d3aa196ec3d7c9b5bb122e7fe77fb1295a6da75abe5d3a510194d3a8a4157d5c89d40619716619859da3ec9b247ced9840a16891e88fdf6b07d5b6602e253416615e35eec34b980d4c9482149ad1c6e4c266a92ee53ec37c2caeb4a927f9eff51e8b216515e2a5cb6c769742b728dd7d342ff1a820f48702e49276fa0dee0176f5ed6102f5e5c33e61ac94cbf5eca1e03a6fda84484bba7dc42355c96c8c28faac177d4effaf90d4c0a8f306f387b4bc2998bc59b79ebe6b4fc3d99da05eb71e957bcebf7fba6f3d0e1e4a9a3ca4864fa64d1f7efb780349dc168afd65d05c5146acedcb1280deb5ae5ef3ec1dad7739250f8c9a907239a82d7dd25f098b5911240d52f834bd600d260d9773231d37f72a328c02f2f7c1e4887c583927da5dfcd21f86dd72aa9372098c9dc5e97e29182a58866eaf732cbd819485223d67db62c575f1d148f2c9a2cd6e8f6add3acb0aaa041424229eea61ad58d190b69e41f172933c7a2400a30de615d4c88afdae4d2da7adca08b57b9f603bd60b1ff832076de9cf3e905e9011f83516655f11435e29c5cbd6ae7160b55eaffb07f5f02c431bfc12a51a87216d582eccd7d6201acc22e0f6c0a03d2a41dd37c8fdc5308103114cbf342ef4c76eaa7550869ca4a505ad8ba71e6a7348d38065c8830a13d0e5c25e1d724a41f29443ab59f80f1972a92e28655689de3cd8ccbc620e4124bc59b392c5d5f8d9538cd83331b299e8f4053939a9ff6ac886c036ae2e15e6ed73dd799d40d5b7354aa6bc9f803ce9bda9c83351fd7fa9bcb73842ad952077d8c7ff68e006f801d048708562cdfd6ae21460c0e3c86db3353e9f655d3fb47060f92e25ed80c37554ed88b70f538a9a00c44d4671a33013cc9d64331f76587d30b7e8151856be6e1daa4dc607e94af3842a0c587e066d47ed44252076e172daa264cbdb12f14f78a4ff3e36eed7e50406c62c6b8b7a7bcc01d360b1e6099a35408037cc4fd90d01855cd88e16b7bf47e3190be40c77f21cc4cb956c0f4744f995aaba8d41866db53963bb3031f1503bc3a34976837756b6808d41b33522f9b40c44d2827a81e7e03b7444c1a32d3e5c02e5538783012025df98e42c0a352ee13edefe405d44123ef63f13b6fcb3d0252b6fc89b8d9dc4e72c8efb3af0f66afd87e9cc4b8c45631e04049684a13dcc23c7a30726f5b5db8711dff5748bdf248581e59b087a1e5109ef654bbf232378e4521f9dbe7dd1da6209fc714d3d67e205b763090b9937627f12e1a1db14fd7cc34545fac6688a38149f74ed39781929fa92e284c97c192e0a190a474cd9242e6d2ba6bcd358377b2b2cd9c7ddde7b72d09ed49cc6954c0a275c3f9aa8f240242e7fc24269cf7219f24c8baf8ed2f7432445b9cf9777389d6367021a53f2d9f4a3bc193a0e20c29b26690af2e0f825216222128b9084774e2ac3e254f25d49f6495b2be2151e9185242ce83058b08d8416be7f6f565f8092f9fd60c8e89428cfabe76af922fb776e67e2a3f67a8e88e1ce7540c96d7add025d7dfde4cb29fed737fb66edcc59dc9d8e34bea3baf4bfc0d5e117482a48e522c1b02a370e9124b379e1a01e55bc49b8f39da8c69e858ab7d97c636a314c416ad35e764e276c32daee349729739547373487e2ed89b3822d55b1a58df7177a40eeb35298aa1db1b4018ecc9d9a674daecd7e0d6721012e97b72b5e42001ce85b90694f850b2829d5503aa0c92ec4c5762b0a78f1e8f0f89d9a440e14d0ef240144eaedb1cf0df3c556e2c45ac5105723d997c5ec45f578955b963584ede0b5d898a28d9d6a41b7fa81f1a7b0e1ec7b3e55b074d4dc911715978c5500bb940657f84adfa66165defb6de1bb7a09ab9a3c3beef639f1566ca4caa0fd16be9b9df5e02e347b48ece12e775d7004a0f04c93d89dda8a38b7d1a9617e8e459b59f538dcd72c7a8549673a4aaf75ef4c3cfadbc86782541727fec9f87f98fba641a4976ad03832bafdc97534723d986ff43d8a97b69e1621493c5cec2eadc773f514a80693e8123e9c8085e12027ae80b88d16a3157e4ecb7e22f8d8f62d3788e6ddd13cbcacb7a48844d2bd43d48032fc5206970eb37c9a493b144b8097ba599958b97995069161535ee24547b4bbdb3234e0cffcde1df23cfd4590388dce6a7f2db749c7761e1970673af5c658cffdec9e2bda8a4ea187bbe1e353987fe2401ac55139ce8bdc1181d6536b2a312b2fadf64e331185b5af687194022adea45f0ea81da614a85a0dea24c201fdce6bc4d8f5de563d33b8fda534de285a3a733bad4e832b246bf6532beaed56bb80e0720ff542d067a929e704941842b113dd4a7931184588475f85c9815bd5ee19479ba57d122e2b8696f00927d8cdd9db512014f84361cabae41a45a0840c0fc7ffc65c05c2cbe32c7ead255896461f216d40e2fcab2c4637327522910c658b4d87767627eb36493b4f72dbbee727fb66801185c6a5e1856cb95ad30b4b7efaea6d10964be1f9a81387e5bec33200192b38365feeca4e22abe70fe947c7b4d95f1f493eea5d929a45c67a20fe0d5ad2d00413d3cd9ebe88754a18d80f07a3a0fc2c74d2aba47d9a6279a4b4c7df84d305623ea3eb89af3169610a21a991c7ec420327e3e85d2712ca2ff9dcc93f3a742be11b32d111bcb7e8ba5858afecae05e131d70528ee2bbe1d37fe2b7a92d840c3ff3df316dd538683b497df9a7ea2a82a370698f5ee07d6ac4006035480eab35e1b1b7715230027cafe2d48f1de622dad913b21c7c3280727d6b616cf7fee666ac3483164b94f061ee59d073e724910ebcef932270428c9f04a92b873e65fb47a9628b47dd69ccc00097bace8d0e3ec654ea53c9c377699963a106aca5abb37fdf24162d92175c40ee83dac7980af3a9aaed3c38fc38de09a23a3c04b538d6b757636deff106698abf0477878f82765fc5e19498a3efb497c75e14b6f5752c961705d9b7829fba457b04da35fadd9091aeaca4104003b3eadcf4d5eaeec87cc529f3a0aace48191a2b6a4cfa628309e76b38b4c95cdca3abe8e3c8ca269a90eb94160af25c6a4cb1d61e13fe4ddca908066b0ceb7ee24c81f415357b27542eb1615561b7b46e1cb1840777684650389d862ff39d2f7d761507716428795c1fbf9797eb205fba51c33d0fc260d2477d4df46bb307f615e80f29df9cf7a21c2bbc3ec6f256e4b8b38e0a1d3a107b2941c1570792525b126b16624726102cfa19515fc9bc81cbcf09bbf21a299ec85e4ca0b7ead9a6e6dcc7d2bb914a9c9f60b325018891c79d661df1feecd532414e66931dfecf2a20dbc4ec3ba650c381b5bfe12cebbb53e1e7b5d9357c87f56f6157428f2abe079077290ceb6c80ac5c61062ce8da814b1fb99a1a9fb2860ed900e6541856ec64bf19c0d9d1cc2280b7cc50af3e3d2ad8e044945d44761ca60891dd72bd6aa26a33274ffcf7ae7d661b5e651135fcff21aaf06b4a2db18fe5827e0243884f2841760b9f1c65fbda870f7f0cfbd6ff484f0825e688614928f2d12d1e7080ebc610102b78e22299810b1b970f15282e4d897f4bcec0e8282ff67c08f8a0ad27c4ff87f1a2f63672ba19c70e3406337255f899caeb99cb34ec180c755a7c18ec693865c4e4ffa96dcdd99c4c4477ffb1a9c3dd0a05bc1157a68108de0aabc820ffe0310b07a68371017421b9060f95d59214d374e4d0c278a758f8aad1d6c5accc227430d492cd68a012dfbd4477fcc45610046e4f7ee77f35c6654177a518791924b59a106b8f39f0da5cc1c4563c683de1f761106e865399f3d60bc4bfc86e2d0e7cb186dbcfcc3af5222b4f555ea791af34b6ed47aade1b06d37080cddd72520952ddfd889709c58bb965ad1c686b98a144d3afb258070228e4d87276606fce3dbd863c1aeed8dbc3a7d5a652659b9ce0ae221e569ab6988092ab6363584cead147140c3add21c2c576e5029f5a1fe393fa0901dc77d3233764511b3ccdf1eeed78ef35906accc3baadfc88ad51dfb5e3b1f221ebf847ec74e33262a8c84622bbd77f7fc3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db27c84e8331c75de36a663b21ff97d67394602cf58230446bcda6da039073f5f9562202932d9157aece28e97450fa3c3c0e29db48ae4b8485ff12775acd6597ef11e7b6d6a283ebdee7dda57176153c0a3a8fa901acb3826b13b879a6ff5c1f38e579d9a2432760f03204fdbdd1815c6ac3f234950010c467a6194f7ca8dff2534b68f9aa81e48d8f273f60bdf5b713da15020c974aebc12820a567404c69c7babe258533e153980841dd6cf6453f08d4b82f7f6cef9d0f091dfd6fa67c71f5fba8400af2e3fd36f81c7f710b627191e727eb2baa60bd14a6e881b6f39b910382b449095bfc39d0eb11862b41b007458deec59fc430c4787e2ac2dbdc3c3f86dc4c90fec3aca1fc3dbb91ea5dc068aa45672f2a4ee23b80fb5f315ca4d0e5d684ebc859ee77be2f7c95133c94060e268a3bb8799ef78ae4aaf07da801fc2ca9090c4fa920eff6d134189aa0a9137050d8d6d1fc58e34b0a0978d84c58006c44d548a77b0f77d487d0c098a4f15b279fcdc31c30f137f477937301c83ba02d50760b603e0ea1efc9ff278db7f16fac89c58ae7a5fc580f93d5596a9a113df84267defa70a2e0a10e0ba7ea684da367954c98d4c9ded605154ba673307d4c5591273dd6a160c680ca72ec4f245aa8f158ef67541b1d346d4262e4cc39d44dbdd340a2954eccc60795e14f2c7aacd2d23b1a80f6284bf5b0c1b79ec5f4bad4a97f20a7b6d75b61cde6c35b02d9b8d372b25a703b6fcf9c7809c62f112f9553910b53a7abe9711c1c33959a42d0030d6b651bbf84502c8b1b80fb200e18f85d1cee663cf4e3b277ab02d4779cec1ff314b9fac96187f76413dde31c4d6f5853a5beb4d22254a3e6d2eb0c9d519c7427172764186365949a1966fa7e2f8139d9b3f2ec01a4caa9fc2c42aa56114f841bdb33e4370a77a8af64b2cdc054fd1151c0015845fca4592a2fb03a4c4c93d433e97607bfb74c8806be57c98d3e41834e7280a609aa7015e355aa38ea6407f921ba542aed0a42d7525ebc6a2f4bece44213f741e73ecc84da269722bb180a4747d664da7973f90af4fe574c311e5dd8bf5cbbb8491a081a512b0d9438b9195328c60e92df74ed8770f5bedc3d2622b528956465b9dcb14afacb83e9ddc7b3b136f1d7f0798d8ef158dd6996ade3ca2e005677f6a3e7568b399080a024d467d614f2575fe23e5bcd1f3dee07fde7b297f9287cd7b1da767f90028a63a85fb426253fe35da407e27f366f92acc7928a775583c9854e169f8c80aa1780d2da27460a432256396a918c210b1df17584a060b7e1149be33c1036adefaea43ed41faa16949af60ce707787198d672922e92d892c8b4681bbb97125a6bb63a36ce2bc6ecbc93a9b8fdb2c8ba9152aca800d04378c34f86520582842876d4bf6538ca20ef23c2dda82f12013e6d291c11abf735cc393c7320ba61108ab970904494894cb0529f2e64fba396afb4b02d897066242fc301caf23ac14c13ac10795f71d7aeb2d19f0879d3e60d70e08e6d5a0ebb92f5d945da511711ab35b73ac7105133cb791938f8414867ea14892a681dc75606c0e46f4dd7cfd09283736605f1a32c2775a1f37a75d997911d070a8a4f4ac3f4138ce471c0d59cb66f6918b29de83f473af4550b6207f3b6fcf2a56068f983ff503b5c02d6c8c46b5bf0d9595fb0dbbf2b98e427a0441aa036c49176e564246d29682c5d7409e645fba30e76c16d8fd3e9f8176bbb2e6b014d05452a6f0b13d1e1abdc0e131980bab1185e775daeda49d8aa75241d27634eb22d3717407ed0d22b6ef1814e98125e0e991fe7aec539658a2863fd30bfa1dd18b4fdba140ff9c26939f35380d6199476dde9441f712bdb60ea8a63b0578550c334ff8f545eed472d8557f1548414f28c2f31294a133ff01f795ed3f69fbc3e4415b3037bec29c4dae995e723f282fcb1358de3992bd467f84d37ea8df884fa3ddfbeb315284db013df43a189d1e2177869662f873b8797adeecbf3d0e29e18f31b891a9aa3b7bd4aced7bd0082b0d754334059bec2d80382c681ac89fe561f262198a686eef630f240d89602858db0e73ba2ee8a423430297cdf60f39c5b7129ba73e3645a87bf9ccdacc90a7ac73873eb047a944a2a91f47a5badc85cfcc3802e816dad76fabdccddead2a2a30bd2bcb9fb7a473b29cd96377d0f52b0d86abbf66781ecd4bdbfe4ea192f45ceaa241430fe6a2da5c047614cc9f22d287ceb5fba9cdc8cf45f3a978aae4b8e2e40810cd863c6a21a7c73f812b8f2d22448d9cde377ea18464db2373810c3c6726d9e1928e21c6ef9cce7cd31c08dcc54ca9a98f9af17195b07cb466ae704991b6fbfcbaaefd7cec410175312772f960a70c24375a9000a931bca679b97aa6089e58a96c6f3855c1a04871c4d5354a9e5e9c55fdfdc21569f0843fd62b911d75e6d630d0573a1916c18cbab3adb998247743830a0dee7a7df4bdc9a28c1c7480945fd80ff06b9092aab396273867aa9dfde7f885127ef58c454d8a08628574d0b2daeb51c23481de65a74e48fca54aaff572fa9792d94f3eec1ecb2e3733e50e472eafbd53fbb6a2fa4e293d83dc3e0269cbd2681767503df016d33c928e8fe15c456d7c2e29f5856f92712f55754f3f60dac81f2890bf2e591fec5bfcfe39f2f8066cb5d827072fce5a6c45f8d6450ee38723e54ebc65bc30205cb3fcebade92359f691da5cb4491f8d64a8f669e816f9ba2de10f530b8d7c006c6b1abdb16de5265138bd2fc37b68159f7fd7950000aa5b2c3cf6bd774945a964abdedc0e264755c6d1090afe6cb3d966f321c15473fe52691d8862729993028c9dd1b18cbd50cf9d8544542bc507c1002c5e57ad18fe872cad4fabc3256ff32b667aa2f2da097a1e7bf874132d6db5b75115bed397b1e3bd13d2fe3494e0648b3161180a24783f91dcacd47e4deb9dd18bcf5e8e97204c637899c48b8eef3df2240f7c9a44a7073dcfe9db34cd8c619701139fa6c051 MD = 4184e0941a1fb27a613f91b6ffa7dd74ec65852fe63e108b94c8ceac88193620a2100d638bac1667072c40d05602c0fa Len = 54088 Msg = 7e0c3106a5a193b751a3bcf89cd628e4874687fce195c0196b9337a6390f4c0b5bed246cbd79ab944cfbd92c5a8c3531442798a552033484de20d4f9b92065d2ca59b632f8287c854b8899b94de39eacb7288ee0491de576faf7d85a5128dfbb137871be1e570e73957183083d846a3c276ef017908bdbd8053dcb30cbccbfad7d71dc79f7ad6a4473df207ff216a1cbde2446b1edf41e93481d33e2edb60f92516d7fcb4ad397e22dfaf68733424c40227019162900b78d0bbd9ada808ed751d893e31de1709d330be98f89cab071823c7aefad0c58adb09645877f4bfb1dd2570c8fd5822d852154d573eb7d071b7b746b53e05da408e330de833918a6ebfd19ff0b5df6b2569352e5281715ef4f12116bca16e68bd00d22b01570ad3748ba6595e01b05a618704b4238735a12172f5da1deb86db60e18b5e2c58cd3553df182f5957976b2d4a288132b6913157aba9e36162cbbcdcaeb2e9c1bf552a8d08ab949b2dd137d91105181875f0aa3819c1d52fadb98770a6ed808a014f2d90b6d52b6c0b1a2b057a2eeb4d6bf056232bb221b132dcb5cd889fa4bdb4f7b90f6829566465cecf22e40a6d39ff0cdfa9700f4bce88b1e253b24db90540fb47498b2c981cc46b9ec1fd2c2076b5a2a14b853dd5b025b577a3c27c4fd94bd662ef9e3382edad7d14531408a77c165e3589b9d2321e7063f02e17afdba22bf596621fe2896f977fba66d72464c2979c26d4ac40f3521f59e663406cef0867f55c319ece2e1b08e01b7d9513ead2bfe8dfccdb2e9bf388f3c4e3db17fc7496322ede893ae368884a91f80c3bac3505c0dac2a4df9e9b23be06003645766f2d5878d96ddd3bd08c1bc8767b101b51ffb0a266b7f86d9196354478e089ff6093c4e4b2cb19ba0b8ad019698045cac21444c11982fdab7f46e5ea9e683a09e17003dceb1f64c0420b142f51aa213d0dc9d9a16b7453bacccc4c72f14bf9f87a3881dbf2d962f13c933454bf5756e48da6fbdddd2a8f2e028cd56801fa2e7d8353eb5c5a8788cf53a9dd3413164b43da3237e0df042477a90f0d5450f16bfba5589cf892b84abd2fb55b47fd7562fd6bd1fa34e1afa81a28c980a25ec026e558cd131b2bda2d3d195c5b0acef35253cb2cdf44a57b8ea82a52abfc9bf4d3dd0617fa4e967ba4e1a8f538f707fe8df960a943ba6af64c83f620fbad890e174545df9f0d630b462d6716918759157a50d4bdb3e0d2ae764044cafc4fb65a55b0806a8dd202078582dc46e14602c6abfc9ff0cc625d12706f7e972a4da48813915e7f433703fef78460eca4cdc590974f1ad8e9b96ab0df640c4c1241c405d58a28546b96d96ff094adae4858f1f1c0daedec98509c0817b0862020a695521fed86a0438c02c915560ad268a21868bd22719254c26196cde774d9f1f6b90b674df1d987910098ea2b111f7223b963e0b85e60ab794bdb468b40cfe2bc7f80202de2668410636dc39658dbf1485581d00efcde090fcb4435ee82789f62896eeeffd0ede5b4aba6562a3aae729a6d311f98e570f9d0507ff0b3a26a64734706285665b608e839d0f6493eed529470f003d890bffa758bdd2b6d392bfe79391470a3e9858a159e8c4895ee3f2dc0f15d415097218759cdea3a6daf33b9feefe83c7b04a2d5d76a26b172c11a609a7ec73c93612c3d17a73592478cf8235edc00004e1fb478a7fd3ec5724ff5a7ab69cc7a1377666819a83de78d5b0fc7137e0a409fc320ef01f832f916f3574f5e52eb6e435236b4ea31619ea181d111d7566591d2778ea56fcbb1b0d343b5e43dca92adc57a338003e34f2c26a9f29ff4e5806898a544385be829a129c9a7e2c42150acfc67c375f12e65147f2bdace16bc093964f4e81460ee194e9cfd93e77bf7b3e06a939ce32c8331ec2d9ff028973a5e7899bee0c5f94dfefdbf48005eefde2adc9295f67430724417b46ed93bf0f10ecad99bd4c98f784942e34173a57a15241606e78695878c0a3ba6210c74de70889496e42aabbdfd86b2ab627477b56d3e1129f0c3c3ac20f2ac754ef07faa295a6a445058c8ef6e45c19a3379322c26e7528e5a148b18e19bfe94512b98de9bf2c07448f5bdbe1af504122d086138d2ae6ea67c1f48584e74b6a5d0247cf638f01ba936780684b412dec5c79881860101aa04ef3aa7d4b80b490c3461788b90c0e055b1561fddaa3dd6078ba01f7e326fa92c1c0d2628cece4a4a066937f923f3b30c422686436dc46e59f1b5979bd766e08e9aed2fcee34c1ed1beb217e972e7182f515fc6408f452c5f925f86696085f49ed4713131a5f35b55d5c2b4b70e39644177684c4f8f4e846ad5f478618e2b39ef613fd6fb77527428e4118afc46693bf51ce6a4dade3efb2e452aca1e90e544f2c99f9d76e7f7eded42350723bbd5138cca415c7d0c9514fc584907eb19428a4b6616d15e78324cf5a883b5c7ef2b7faaf80edfa08aff566797f5ce6197a19e4bdf3c2efc98c005d46fb4135350dac4c23ea5aadfe9cc33e27cb76a1c8ca0e5968d8612ebd9ffad2c101cac408141a75506bc4aa5a98a321f8ee4877688cee49e097b09a6ac6fa74f2243ed29d11e8be5d8a93b7c3ab7d55147238309ec6a3fd4cb819fa7908e88d02eb05279f0bfe6f73d02f9de1de3923a2dfb093148214bdd5c30317916eac6318de878bb40b44d0b9c401235d38bfd3cabb176972c729d1a341d6ba5bfe2f3e5d862cc68418a22858ee6f13dfc1f7adb690d57a5f9eca80ddbaf9a97ec25768f96a5d9fb83a00c177d6e2340e82caf98be5528e840ddf13acb4d6ada3c20d28131380e0f87946e13f05c34d93821efe7443f56d891f50d237b9d48d72053ac5d307ff4febde5cd1d802782715cadd05973128de15d90505a7505b139293c48862d040b53a702ad969556b8a3d60ed561c3753abd045e7f42302d305ac7495b9e8f6add98d3898401a87023db34e38392cdddc9a646adce7d455a42c67b193a08cffac858a3c8f50151fa70a1e9ca4f6efac2c747650cd25e1d337506c50a8847775a77fdc86f54f7fa5c1b727501bd48c2bab00b100a3f77304f239625cbbafd1df0590291eb48683a1b80d7574841c2be3c108ba8144a5b26f3eaef2dab367c1c62e801a0ab23d469cf3d4b10fc617f65ad7523cdb9a77c59c8478c4d47af56fb18a175654d9bcf31edcd4822acb0a131a53a8dd178cb4d5132a5f7f51f7a10428811d86040f4ab0addad491cc7a40aaab9fd0453c01a6095d9a2bcc5a12b2a8b37b5951203e30a5d3559e85fdbb00e49321921d52e3938a013aa452f6b37282dbe09460b24db7fc17b5f807c57691e85c43b80d6219c47f877492ba2dc227bb2718965ac12424da0163abbf2d933cdf8d6c08bc728b811178afbcab07271a7a208b27e856abc2691ac57f543cfb49f1af034cd38d2112685a52ebce8dca93e84ca10fb278cad8d1e9443b6ffb94004549724af9b8c3beabb8c7e7cbc694d92d35c3155f2f69ad3af749a9b77047a804e320cbd7fd59ce0317757849bb6b36706357039783708acbca3a8fd5a5fd8b550675961563cb8a9701c466f07239f0d95dc79f047dc7b7acec80b670a29cef6138d9755af2013a90fd1c7869f5e45092ab79b24c24567c06e584e6316d0d1d5004b42e4eb3e3261594e5775c4c559ec0d5d70317810621013bade6bf10395d49ef6e8a9aad5a964f4c872c707d75228e63475c0e9abdedc4786280c49307f774836f51e6e94cd165b06a5c4e922b2422de3383d879642978230d7ae5fc5e32fa47204bd96da3208045f7d29e925eeba4ce02411e26e41e44c5159dcc55285703c3e73f1c4345cbc89594550786f8c03db91c5e88a7231151e5e2b121a64caeb6802df757731c1a6427aaac3175e0eb1429e9a2bd060b4dc60bdc7e8bf5b27f3c055b3931030e547d83a2a0c567feb453a5d1d5664b8319ccc06bcbb34c4212bddad7ce52fd05c33a32e2f96b653a621fb63cbe2a7c72bc8b8af76241b2e4ae60880b7e6368e8adc4bbd47fca757c3fa3e29226b2a3c27f2af4e809dc30809d4d965d100c4d9f5b42a6dff98ba2ac9104b43bd5a6c75aaad283a6892cccfe25ad8c374ef4b31115dd7c6a3155f1b2a16db19f93adf12285aac199aada90468fa8f300fec4a22823bdc3dfedd16c76b7046326286f280257db3529338e844023655220e92323cbcc0906a5f6a71ae11bf151395b9574e26a8c67bfeeefafd5280d31ffd7ba3ce259eaca24147e03d9145d033ef5c7ddaa04e6e0c1a1a619ebe8c718059031f756128799c40efe3047eb70029fbfac6c426e112799155bca6ba9bc909adb2f5c0d3f09faedaed0a814e951d5c27eed2892f034c4ad12b5cb3eb4132026815c72f028977607ba9c732653290411fd311a83d1774067605c234a51f551114b6141e7155a947afb099a67741f18f2032148fb5b03222ec6f9da79c78aaac3fee6d1db4d79dcae39c024be935c98cf5765bce3d400f2690d34f9b260f9b3a465922bb2191dd60c3c691912f7070c0fc2a47e2485963982fdb486dc626bf41d470e5656c16e0bfacbab824de949fc1a0c8694a4b6eb7de05e228ce11607f6946b015aad8d9302e1b02e6656b14af158fdb5084daf2a49ebf82510a8c4f640729a1440a1c4b5432ab19bcd15973173315cd6e206b779220b93661c19b45f5a209cef0f19b0fb573b979abf72e327080df39428b6170092a8f68cb71c2d6bcd043939cffc978ec57e29d24555dc533a548894e44718e9202aea40ea9979422088399b8834c295155931ec66a6cbde906ee4811da0005955f9372abc78de0bdb1363bc43a87939d036758f2b4df8ef92c3cf01dca9177ab77da5f135a1a5ef870c8045084004a27d7cbf649a32abafc9bb11bc284aa774d01ffb3e5dfd1515abdd58dddde4aaf7a493d513be3e2c45bcbf715c096bf66f284503b83d7278a5cfedb32dcc7cb461cde37f439c57c2daf435b88687f44d9245598308dce914c97ba459dcdcf06a0781d4879c3e66b796f787aee4abcdf405b1c144d5424b33a7386a12931528141247ceb4c8ab5451a04f1b1b1e7cdf33f1f4e70ec8787e1b678da7a5fa800dfaa9a839cd6ceb07d921835bc7dc0210527e9431a989856c143203c3dbb8248564f52b7d9b33076996401cae7ac5464998d31b09dcbf71fb683021267c760a79991d5802e6c20661d226a17bfb814f734f1911d6701245155d886f3950db38d2e24ab73075c4f0d6d3fa9a2c13b92674bd77fcff2e2c08a13d6375621e90b87687a4d17012dfcdb2e3e590288a15d1362a1666eedbb2c2874ee8bc0ab03c924fd0522d2883bba6dc480f0ad7283c5a9fe01dd60a424f7bafd940cb9acc88cc44047d53c29101823c4a9f90a1b4d7c89926b5d5bb2aa93c0125922a783b1c703c6d4ccca404596aba33beaaeef88d240b4306ea695a680c657c07620ec49f852151e81f38a46a653e4993e126ba0775dc80379d7c9b35f4c324c7fac331ba14daf978d4e439dd7bb0d647bcb1c3ecc3f62571765cb5b8fb0366f97afe4914244fad2574128a59b4f82001c4f7dbe517407adbfe727098290d8ac56a29d356bd68b5178629608719fe70ea7f61c99a78a2c69ebc24947d86c9d85453ab9827e70d58759291830fb1ab0d2a775557b2ee0453e138dbe8111b1f98cebdec6030ab26df6720b1bb9885e541e8343c4bd6814e67cdfb0035f9eff8115b2e54f218109b9217b9f3d0ca9b95524c3c7f6ead3a684b8a8cf943e00a3a8c21304b18881f54b9aae4be894ffda4897f198488e0203b473f7330da6c75cf514b4a399828df399c4b2a7bafccb3f82ea953b561163bada214390bc245379da8ff05863b9f5833832012900aecc37b89f17079c0f894a7a63265f4c214588ed965e79ac9969228b551246662543713e180fa376f2d321299c17f52a481e1892ba77add0ab496027b07e8657faf16aa807e7959345e1ed4c4e8108d2e33d975e8ea46b8c6a26ba71d6ae7f529a36927ac127346d8335ed76fd09f0d29d3483c5659d291c4071901e3a1a87f27d83772ae6472662353fc01e2a1b4395c0837c5bd19a6d1cd8ca9f614d5b36942f88873ce9dfd21dc67ff3c6482d77b917bacf867554ae1a9d92270fa2d911d42a8651253e59ddfcd16706f3e9b913a8ed4b2bd9b33472720958c56dbd2c901ef92d4378763d808bc095682b91569df1cba4efca0db230df968ef9000ebe37f105ee0cab040390472e8b95c1b18e8d003d58a9dbf7669fafefc5405b1a168fe6fb48eb317a3453bb75aa2e7accb94760bce6d88402c9e56f5f6c29f361cdfe6d23ae8da04b586165207170ab657f839fc4dffa66b244c88a7014245d683d09e029bf527be9e83fb0d9823ad7fe499829df949dd8787fafadcc3dbdfdafec390c77dbd838f85c453aeb5cbb8509901b7b77b5216de7c31135ce495568ab74123e88949d4bd92d287fe051914719eb742127a233ab62c783bee0d78902ed3d1bf2f66a00491ef34fdc53114a72a1c4389769fc22f58bf57da5ce68d760e7dfccc62bccaf953c1721fcbe0c45ac33b2ef6ab9239df0c5c56586c16dbf072db49b24a35d09d4b331554d7bb32168322feef78fa90301a2bfe1ee7466ae7a11540daaf77b9d6c16aa403b36a65c1b4fa3edea780cd0cc955d692941d4341e45469aa592a8d8efc91a796259465449cea732afecbfa5a6202671d3d446de883c04d8b0ff755ac45cea674f6e13b88831b273b46841e022d593728a862f0c2c68073e69b861818e4492a05eefbee74b3b4e179465242eb7283d0199e20d5b9f4bd6321c37edeba212cbab1d48786ef73de2a4cc8de6dff79a8ba59e72623b4579ea6a65087af7a439cdfe072300ce30ac1891c92cfa72589ee7b514b1be29a354cc3db094b944094c320fa8e9b8737c18486516ecef845ec809d6892a71b55d7ee422ab86f94f45ac90567f173ffd3e050a95322836948e884a8058373d5cc85adacfa239eb87eded6168f635e7d9faf4c7b8a76950114c6232292e82718e787b188b2137e07c66810dcdbab04078375a1835f34adc992ce849576876bec8e24215ebc50b789b440a2deb1930fa8677c7649382272c7aa47d0881928e55aa9a525b77fa2f24631adb2a47ae12465330af4567e0a8d05457b2e84e39540692052e71963d1d74723f869b79f5eed48cf6842319ab2a58b49b0c7103c952222db738c0fd0a40d93746aee9e86d2125823de8a62f2e2635fa02fc2b48cef348bc3503f1e2ee53d320a496ae199053b9d17b3f172f0646f8b304048f83b6c1dafbe3126d0e55a0e2dcfdd04093fbe0f209431a1e8fbff7017e32a8165b1d48593b55d69ac5dcc298ba970e59ddfc736e8809ec24c7a7a0e099f37948256ef1641911d313aff02355482483425e3e659fdc5437b27d79ef26b4eadaad7938476c038b9a60331c6db9041ae1a2ab2e420684968f5007933c444d7d5eaedce5d4d189479ef8e5cdec348ceeabf33b4883230f655585fc8012b9d22f77d4b704044528ca43563e913948411444ac8519c385db251cbcc2ccfd07d175b8a7ae2f6027407849f0b3e2df64af204e371f1e6d9f867a576d00d665bec9e483a008b473089ef5f560dc5f493a45971b4b7fc30be08fc9a82f2d38f73f39f08b567d2fa76962b7e81f1e53010992ed4e221da408e95597617bbe610c09802e1223621d97ba5a329494005a8183159759838f3def2a866815cb2afb1ece5af1ca9f6dfaae8bd3fa8d6818f255175c29cfc82b0d492470b057a5f943c9ce28e00742e733664e7e7424f3cea6f636c5191368977e9157d3048994afe777a9688d7a8664745982a8340dcfa7e4ef71fef9b6fd5b1e4244fbd93dffc562c2e0983e77027c29f2c8efbeaa741b38ab5948204cfecc78e66c79a2e77fc02216043687af2f74c0bc71b3788d59cf1ea44d5f3127d581faf84ecaf6187d26c1fb74d20d656614d5211da1f629190a0374dea2b0ea2a1230f25c6e4743807faeddb2e9243c5ea2d3cb4d29cc001a7283977d91140654d3a75f25e22aeb122165575eea50b671c5591550b94e94d68f1b86bac8cefefe6cbaa92bb4f591bab271d2d964375637e2b199f8ef1269e5b637cd06b866467f44077aee555bb9d2a950eaa2c53c8e198189c376299bf1c09e74c4f1ce6e8f6fd00a2eee51a1c6028c7f095bbbc4d0bf385e1c88f76fceef9e3f290c994c1c48b73f3f9c288c68b2d278b9548684c0716d8b1f81e6e243db3c1343a797737f82501347884860047bf1ca653dd3e0cfd897bd46f166b8130c0e7dbf5357994bb54122b1234fb11bc680e0b768126d716d5d412d67f5459f0a7bfaf6b04811e349e0ea170d9d14211af6580a73d08f379814d33d56211f5a4f0af7741ee781f8c8e5d5f3a7befdb6f1c8ace8e18cca950154cfe13c6899d752421fd22fb44ddeaa9672a17223d24fd38e3bdd21a5b41c01a3b3c39b3a6998bca7c07b434cea1777995cdafd7a364e48ad9141c4b9b03f31781b5ee314f300d6a285e9fa0feb25a854d0eaba109e54b9bd59d13b4753711948631db496cab238d8dca8c47bd5abc55f8b7b38957ed5bf13d1e605cd1244119b278a802e652f7ba13122332f1dfc572ff8e6e9675c53b167a60aa4b9813ac2f6d51fc65a36dae7922000b68838a9c63c85c85d04bb51592f52b9a8ab04c7a5d1f867f788c447352225aedf15ca36ab0bde89f3fc2040eeb1546d8200317d22c30ddda45891f6cce7be970d6627256e245fc65ecc0fc50ab417b0b1578bcdc23081fb5d48345c17495753d1e7f3e8980c75e7fde2ee30359e390db72f682c2ca0f14b72b60ff9bccd8c6fbd19a512b12add7941df5024e7e624ef23e67b3a9a9ae8389540a95225fada353f89bf163205e2f4cb2fba15aa1267df581b295bb494b35d357674f7db47ad5ed9a69675933422e51a42a084f4a97e58f43bf71203150f33c3a6174d554a82570bfeefb36d2c19c48fb697e54021d4d668d768e00e923836c07df4e51c5a058856f11f422864340dcc09f4c914f207f2266bf3682fa2ead0cc6c8231a91c939d3b3ba9c44d630e3b3fab6bb2fbc08416cd782afceebd73bc47d063c573f8a8f0392d139c54af04d75b1951156ce3d5cece7a7420d4488f33b3680e131584d21bc153f14cc6aeb46cbed24962d0f2798499e1637678ea89f1af81e5ad06379b8a743ea7582bf8a965db74b94dd062ebc2b04b7d6034f9f0508ccc8ee5be8761c6b24bba30fd03304d216f2518d3bbb923c2272660a12d4eeaeb866e6fa70ab15b1c09ae89a254f5ad2130116663734e021ff3031a35cb121b3c7e08ad782826b2120708a4b47475e07b5602b9081036f85a3d77df7b79d68c1fe1e2217a662e5624b23d24bbd81d91604f8d832a18e070e1751932eaa00897d6709f6e564b34d1d499d08c20f6792aa08af6575203f6f646284bb6fbe434d9109874e6745de69f923c474d8c6605369ca6e1980857d71308c5a3de279cc7ca5ec8171 MD = 3a8838e486476a517a6a3f4bf10a0144296e631bcb1347f812f35f46f796977984dc7c1936c254f9ecd9469078a72ee5 Len = 54880 Msg = c775c7f17f600e3f6f4873019bb0b6056af515a0aa3b7046d4a7ab5991cf543f7e6e85b72c5d0c6d6cbecaccc97a591355eff2aba9e28db827bb49ee82f10fa581c37230ff29da6b370ae2943eaffe5cd178613d51cd1e0d0c588dd4be71f0db58da5605ffadc062589283020335ed0765f82bfeabe56a700be63db34d383f068b1df9de35d1067a57c074bd1ff66e3d9ad71898be10bb07adcd2235382d4451a2f22361a77ef3dabdfb7f6e9ad9c926f67df0b0923757fa79750400863746e226c39b395f9ad0ab12aa6abd7dc545e903527bf130438772f847abbc3f408fe19ff72a0c650ee514dc37fe51cfa42baf49bf81009f1a9397b0a9de126c2f657793f69883bfc37a3ea50903d3985dc39f4f2ac988e7a6c3902b0467a914ec11cc8c28ad4577a0d751f48841eae0d855e29dfc1c2f11cd5f86f1c10c2b3f5eda0711f530fb958c4474521c803fb0fd299fbb9e429d2479aea08846963df56f0a50abc5eb4c1f7108cf462d877a0fb487ff3276037b2891f9077afdcc893f06e8d1e000a4e11f366c8b58231f4206e5b62a88ee277126fd88e24f4c78b7240bbbaf3b0e24619cc3b8d01066103f9c78ff47486d752624a5a35a8d9d606fad67cc15415733759f0034c5f75e221ad955aa7ef75ab6432d719297be574d58e10063297c4498c52fd5279394741c7bc564fff91f1fb26f46499cc069e2081ac8bfc713733b1df8542adb616f0ec809698e45dd4723315379150bfd17a6565e6a8c42fcaea588b616e796581196ec6dccb9c655f8cefb97cdbd25784f0b02ccd0501a0cb6eba2a97ef4a1a00172514ff6cec886b988d7e24b2933569979d20b01f1986a1273337793394460c70cbf55f0b6949b12b98fdcf9417cc27d5890c40559043f4aa703c85e9ec6c1eccafe2ac15772ba8bc9e92ee1ee4ae28410029ee56ea6b2e7eed945e50c71eaf716d574719ba90cad21ae800b16e3de3509f142a81ac5ec70af7f9532698b0370570ddc096983b8ff27a6797da290df19ab24575644ab146d54bb614d9f5d36e0f46e0990a846e60a4498c2417b990db65f6586f8d49e53664456513c942fa9ce57c0a40e423bc054e04d035f87468f978b7a7794b1e7d1e4e7180c09324984c2e7cb548c1eaa6b67648ee3ddb0df8e41992cd135c5ceb56ea5c83bbc5ff2f0440c57c21024db12cb36210ac5ddab313eef433ce0f79a288de630855b057315dd2e2b95a53c15db06c0ce211ff6f3a114f787629f2f9551c8121693f00b141a14b51076504ea2eea2695fd0f1e2ff054e17c0e879550559a791430c82591d27720ace0d1b42c87427989abe458b178671b9b57977523367b2cb7f991ad7d6667e932d010d00d0951bb7499422d8834c07442fbb9f0c67a4722991e2bf6d87fdc0b9f5fb2e710278082d32f991b18a7e9820f656fb6ce9376e11438e79037714c0e4eda2877ba54675621e9698fe7644aab4d2f3935a00492eec5b465081efd4077dde9f1f070326ebbed41342a78dc7c76a8b3a6dbff5023b23a2b14dcf37641cea9099fffe6241f1a91e179495182f76a9e8d2938110891c1ce07877d597ed8795cb392d460bbf0f8bc24a98ae5ea440dab2640d8a99075941dd42d77c5797d1e45727b3c946c7cdcc895555dba94dab63b197e1c0d8a37bf960b873aabe898141fb0a996d5a81b4d43be0d3053f5241adad14190d158609ab3382554815ec1f13808ae51c91164b0ba0921b1269dc8a206e82bd5897d78bc11c47853fa4e733c2af50a1bd31ae1ada7f1434ec6f130d24bb8ad389a7bf8aa2e4af0975b3a346b64e04d4388370aaa7a20d2679991e52225ed465878d668db65364ebd48a48df56254e8775cf8582dbcf26faa32f25e1801d077a3c91f31c65300b334371fd870cfed4c15b5d152bdfcf07b750785243a8c1cb1b8ffb8fbf17454fe7a9afeac5409f418ad474472b1a6a57656abdcbff0012ca4f681261ff3458d511f08d382158d13beac85d430cf367bf0dd846b89df2d7a91eaf1f9263243248b8ff530f23bd5c6aea1d613255d490e6b5825b42a5e5da13904c6a49744f9b4ee5be499654d7087891bcc63c8f24ab7568504491a041e1aeae283bafb81e5a8f9f15b6f63b0e9d0ae88dd488414a81132b2a48cc166db5227f29daecb9f739b5eeece45661cbe2cbf578d53ff3b0da6908f8b11b8dd31e180b388e27ff43fe65da2b19df4c74a060c2660f882ebd7e1e06a2c5a78fdae3385b3ea188106b72496cba9eb986739f74573dcb8c78d934db2d10cd98a3eace297621593876d55d09ab81bb0b972ea7adbae751725c6cc548862b1016526ba59464cbff5fb9eb874da069b7fd050f80b3f54ae9635fdefa0c18d9d84822c531202e22da245f14b7bc5158dcb95a7cf12f1050db870b9899d0ec036b569d613a76db1034b0f2b7b7fec83770641ddfc4c911e06e05e7006a3b089212694ba5883d737c532bfa3e4dbc0defbc29d79fbf2802e1ec067b7f37f6766c15a9b3fae21eff4d80bcfd10429e2666082e0f24abf5ea3d9bb1507ec6a83e7bbc3d5dc911c1866d038b85955d4b1d869c9b4dd64fd7d2dbc42fed63e0fa66a54f4dd178decd10c324c11935686cfa36bf991a1d7577c1a3aea7da974d94f8d4150398710eeba6372b86425829a8c35dba50fc61e37cbf7da342a083d51dfbef5785391a6cc24eb15f0186666aa882e5d5e77d0a628fd551e928c68e403e78de5dfb3cddbffb12190a5b70c7f1133eb558862580ba580907c980d41f559e76896f8e2a21ce3dfa5772bb85e3869200b58b577b2bb37e65878b7253a0dde6fdd8d565894d62310d54df4a4f23f3cdcfcdb67f077415aaf1b97728ca78a1bd16b3d6aae4cb437e53f69b3055edff6bb3e5202951c1a783b486d5c7c10f66ccc702bc82c00239cdd426ed941faa7115b4e5127be27b32b2b6d4ec7ac0cdf7ba1aadcd17a75a0cc699cd1c9e36c31272dbb5d49d410b7edeff8d0567501a1b30179c5291203b8310a9d17178219eaa2b2f3eaeb8f6d753b0989768b6f85e99d6c5b79218b40d68540c1c344768a501e7b866e8f48a4979d088dc5d9041013a532ce7d7d2e9388139cb94ad36943fde4f7f16c97884c8b7e5d7422c1db26bc650541267ea4a249768ed23236a2cd30a0a8b379a6d6cbbd7978db31c84d304057446218b865c3a71887ab0e00eb8cb4ec1e5afa4facb8c9f90b31676ee2c35be6809fd8bcfa9e0d9427b222a48c08e701c93682c4827a2d875515283824664bbd3a58cafecb87f953ef7634a40cd8438c29f487d7f0b654af16d518869a8fbc25e23b83f0511806e23f65a88206615705c1039dec6fc3dbcaa11fad0cada609cb18a6882443d492c9a80ef2b0d14a9de91ef2296458492f7484435a2ce65fd1173e284c1cfc344974a9e0a7d315ea84c0a43eaee252accc4740fea459cd038e84c33f344ce2bd876dc5793c4b4cc7a806f147b2e8e7653e9d67801025ea37bebe6869f536afe6c93f7b47249bee68742676bbc9ea7f1902e158a632139672de0e6e26f36cac26ab444bb90547535385c9a4f95859922e95dd94af6ea57a3b590f7504b34180239a26a76d32c0440f394b1c8ee2d8b92c73cccc2a3a4e0df7dc3bfd71b977943412512ed241b918f21b454deafdca6c7939594f95399fca3ec40e67fc7a5170fea04e4276c6745ab2b822a9ac1db124bb32ed9f7ec0fd1786ad1155038a71aed9c09872c9159471b77c7dc030a72f6a691cf44c5574f8ae55f3cf45354e4aa66bffaa4047d39c0676f4a112173e87a5e93427c6a7da14d73334a2a8f04a6ed01bba0e2b8164fd7187ad572fde487c8fd234e2aee454c42a84fc3600c31330e46f8c3ea4e46e2b5b5ff2ea79e4695050ba8baf65a969a930f196f3dd3c1d533bddf2b63d1f33c81c6681e570d7f5b5c0e8a4f87b55ad1652dfa166aeb9ed185efd69ff64607a364d41c6d2a507921f39030d58607783ae38c5b7f8e5cae722b6346e94bb76960866683e3ca711a2ff21804149a58d81d32b3a273522fdbff4da198cf092b01bb0e040548dc774ccc822f6dd36cb162c27d2a39ba5e6b0bbf1532321ad9abb7fb24360a630b6bf641cb5bd3dca419fe70ea7a861c591828fba99d7e92623e736af285fafdfc5400d7f4279ef5e9999471a12af361eb3f19fc316ae2fe4dec1d4e9d783dde5a3a51d3251837e7e3380c0bcbc2e650bde7c607d622c82741bd9df050983bcecb26d38088b804793bfe4e8790cac9b277181767bf4c97d6e7badb98316b5d95f71e6d25428e6e7599f3422d17cb034fc1daf4621670b7d1e7eac08e687b09fa882d07097e22dea1a420d144894dfcef41364542001690e0e85632191e50a8c723588a7562fdbac7058ce1160dd61c5aa233f24da7c78acd92041a827b70a3c272a9dcb116a66bad643f5be9ccf0cb578adae3cc330a0d5f8efe6112a66560b41d27e605c3a55a1c67422806ee2271b0a2320106cc68815d844ced0ec8b74964ccda90b99183eedbb99c2eb59af4762b9143324598684e901bf4a8c108ecc59c26cbc314a7c78eb40055573df8ef4291ff155fcfc292dcc0fc0079728f8e3b22d301655f2ef9a46de5768ae8319a3da996b171ee706e93b4cf774768842515bf7c845fe34da297cf0f06affc6d7ed03dfb1e4ee7cb85dc363b62fcec1037ba3bc95d9ae52d49cfa2270dadc2d3216113d964e005fa5e1d0ce8c87f465b4e925e6193fdb0f576b4aed4946e828c0d5af5d68c0d8f2581bfff7fb1b8be8cf105f0ed2e6f8bceb1aebabfa1d984bfca21a99a9cbfcc76772bd7a8268f9ccca97bb81437dabde08325908f3fd60f95de20f7ce9fdd0513c7c85c0a2dec2742fc5c7f7fb5258f527381f6ed734d6c36d3bda91a9a4f8324f9fd564ed1b7a81774100dd5b038494d0a2ab5814726e4c93162852597fd8bd296348c1b17d8677299ff2abf31fb33f8ce8895f2c249bd777e7655989dcf684425d4c71a0937ac7cf2929ee53e56947c49035de9ec9f3f674461df1ab5ad60a42e45cff3aebdbf5c072f30eee231b6000304d70dce0eb4c20a8aec54e67fbd1739ee6c4d0e50e73b6040aa832274dfad83f1c9076f7f62af595b43ee382dc5c7cf3966d032d96e41862bd24b080758ab5134fc7ed8db9257b83bae8fb39fc1dc778d842521419a95005a71ef9bd26921f533381b0f088de1af92f3df60bdf87eba528ff4e36eb46056334e16e3bd5937f75844861ef09876c6c9db884670b4d31ff150e4814a03c911203369e9b17217e00aea660c79fe3e86462e2f6d9e3b062ed08c9e02bcd1f9b887e68fb494fae638b0f063e28d05607672b47fde30d73d6f580eca6eab6418d3d230314c503acf85b41f26a713f7051fb5341da00fcda06bf19d0fce01064dea68d9f7bacb7af8517d3f5763f31a54077878b4bb216859a904001529a5fcc086b1a98805ef02892373189e1f15b776b82146ea3850ef8db1f70085877f919a2e15688d35a219ab84fe71a1e2611592ba1a67671e83a9670c346507f0770c036bfcddad53ce0885fb86140bb4bf7ed193c9a3d475a2df0c4121f7426d75b422c4ced191665a18411073c7829d17385bcd98c1d94694daa7d8287ddf0561d320c1f30ce1762e8e044b2d53aea6518c57efee8b1d9843df5e5ab0c185c123af24ead456448c32b5f9351c8039d655c2ed8232c749739639594e2089dda7a39057c8d77762ae4ed44555a915c8360b22470dce3e04df752ec13ce29e8fc2cac0e1e26536e4e76a3213333adc06cc5bf48a1829b8f7e5c808beac5dc842177e86e9c0e75c723c6e188958399b98a22e7fe12cabfdca8c770d7727f9ce9eb0a82997ebc3b1b3b742cecf4b0c1b29c06a0c72d0bcd424dd6b8615341e7a4d9431f214ea63fd505fce9c0e941d245f2cf9e3658cc406adde8ababf5c3492f4cbff2988452d08f03cfbca6ebcd27ee2f0c14ce3e82b5c0e99bdf39e26a3df3e5efc161b858b9a3c57af9f164a95f05b14ac8f146d599bef16ed77da1ad429d0540e00f331e47adcb7d3642fc6cd43729ea1f31fa2b78ef75c00909ac02d3855b51f313bd19f7177645062e0b9e13fce9887c12c0fabfccf73e08306a117d3738916ef19ee2647b5670cde52aa3bac18094842653d9eac1f63739b4844fbc4d2d9db83b50fe0c440c7f123ac214252f7facbbbf0b3f9678e34a31f85313fd11bac563538bc35afbd8ce67817a65ef91472f877f5f922f5c4ef5656e8f14dc3f60b6f4cca7d8dd2d7bfd224bbc2f7681679b7bd9d98831e6a9c7689960b8b610afd0e1292db50f334679f70bffc7568a617f0d40f1782aa2841ea01ba076375008a1bcdb95de6db7c8c34a44cdd41c16c558b0574fe8960a5e89a037a6e3cc57fba7ec6668cb8525836790889ecc13b0f3a7098f4d6ff098a986edafec77d1b30961f45c2ee2c20706e56e39fb15e9d38cf88d5b6264c6d7e5a4ecd6f9a903dbb25e691f50dab0c6b3bb37fb5b480b18e1bb903e376d7542a352223f570dcf3c770bcf426719edff1a67822f47e903dba26ec6ca24f0a863531d225b7cfc907fc7d87b47ea06b61acb68d158496f40a63f80a561c374cca4856461bde42bf3f0456311a24247c5a4173daa08c8416e0329af90a79b806ea0bad674d914e26658403a06e408537925be5480a34d15d87cf13a3d0e05a9eac253d1b02f97d663f278abef8fc4906d1a015bd9da60430c6e16beeef79a47dd93f0e4b833e56e79692f571ff7efa50deb80a229f07a5f96610aac4b16d1e0b390029e01987611231704ca3cdee1f7c824ccc6059823c1f3006d90c5ce450b0931195c00afc274dda67953ba87541f48504645d133c520ae96800ae3905c3d5b0195ad59ec72f01571fda21d93be71faf87d90315606e215ce1259190f9fee059c181051f0d01977142223da8679965c77e3339a61419ce5017529fa9e8893b54b1113ad3f92675f07576775c21e02e97907be60f80da798cb28ebfcbf9ed4c6990125b04b025059c62ddb73f9342e2e566b8f499ce3988d95be2d94054b17d62078d50f85d86ae3db15fe597e249e97aa7f24a8923be64ffba54d64e225d3506bd8801f726d2d79a0a04e9ad397dac1efc31d02aaaf275c676ef9c3e8b7adb1c5b0e564b3390ea7c13d5abc9be6591980d7e6ec3885c23f637b81458b68fd96d8824373bad484eab77d91333998901b281e00c9be885d756a7b926e3cc2496c1edd48c0ebc836befdc180a32f3716532016092fbf0f3f7af6cf9bb29f4c17adf31253d0d87c7a910eb9b760ff4a623e13405e82bc830edc92e80b97057efed91fd203280379f70d54b694113c3afa587c3d7f77399c41f6c96570a011c35579df9cb53aff3902807a48a5183891451ec55dea51b8b35f7604b8594246c1c20cccc3089e1e424396ea00790aa6d5e91d79323db6ac50ddb6cf61241206f2bb0e61f57ba5f32e20bd2e5e7e4cf9814cc1224ad82a970d3355a3f07f73f4cea70b39946cf72045206fb1b32373931be6963b2848021b3106cf0cd6ba0c72ce1c6fbe307b16082fd93b1ebf1703161e4d293e2b1bf17b74be8f74946230136991b85a4a24671d66a18bbfd2b77ff500f6e6a5e3b25d6a30c11365aa068359399d81a851d78ef2521ffe2f8e834eb25c6a5afce2a9ca5a0dc4f77a98257ab6a6963822e822e209aabaeee84308f3d0992df2cd9870bcbd6410a80def3d8aae492268546d9504e5a8f8fa74a0c703c23fa84a7285959916cc5aa1aa0fcd37b299b87ea7628c5bf905508d4f283bf319c86fce963a8703f8bf0970d97a43067600cf07b657977bb6286833f249e64649bbeb0ba317c371d5a4939216cf3d7b4b26ec8febbd34d8cf8a967ae8764471d492b06e13ade96720258f91ec7f1b0aa4647773c223f2f797b461ceac3dd50a4cd54672827d57588aaa53dcb4fa7a493452265fd40c305c913e60abb8111684050c13c55a06abca57bb96ef1ad1c99b5d684fa09bd6ab7c5e71099e86909753bfafbeb314ca453129d1bf5588958785a22f79e2742392eb5204c313b22cc60dbf289de84d48b2317375338c889642ac85002b921773a50e1e5223a7a5562126961f37b16df2712fb71eaa10958479647892eb3bd037406905f1b1c6ea9d4722c6ec22cae16810908746797e29c09a321f501f4c48fef390bb6be3fdfc729676e427d581621a0f1846852811dfeb33b9cbb05e4fdc2b4cf9b11930b955669db7504ac6614a78cb0b87534c980254c450204c2eb3245cab2869823e957ff9cb58bddd8c071504e30ecc193d6d4badca899f7bf7229bf39c81475f53fee6acbddf6f588cdf4c6ed576877fa10e0646c4eaabd84dfabd90afb8fcd9276233efe3afe7344f567ae710f73bdeedf6ecc021e7c7d999c803b44313dcb80f7bc233bb6ed8094a090b3e33f56bbf9ab4499a9005960870f708cef546894492981c38c3809430136397b4acf5a9ba2dc2b7466dc878ed5a24374144b565374733cc3f8a99ce5121f28aeaea6c48271daeb05439a4f2e0bbcc09db9fe4f2e8a3fb3ce87efec8d50c426f517aedf9aef0e4cf34723f968b1c4b1ace9559d4d12f4af8a42f34264418bfaf88ecef20ba3de16e77a5dcd665024dc4ca93887d994f9f89f309de5926fdd6e5e1aee44fd16b31088e531134d6f430923038f54fa99b856b65ad61f3e622348cfc4f61e97cef6047f8f871248978902d9fe424dd7a8989177c6843690a0c351f593cfc801550db8738148137c4f5e8e17a239ba99490170897e9073b1b32751758f5f8a643362f40dc15a5e141f2a7485f85de367045bbd958ae31ec923b510fac08face8ee5b82f559a73b368f557dca07940f6a620f3e42f0647fff76d7552a2f4875b4106229d25016f20b2847718ed8c787caea83bc39bafadd7c36f4e9ade3702ff121deb04caf8ecaba7169187b71df94ae2520fe21f08f8268ea73952ce4f020c6a737e00c7df90c6bf3213937dcc27c3e994ecea3980ab4ea1bbe1f4f3bb1905c2cd481bac23e014834d89e6a215a87a4d076f267bc52bc2a503c4fbdef9ac9da371f5bfe8745ee76bef70dbd468dff0552fe33146351e2511155ef1f08921269517f357ed3f61e2019e44fd755452a8ca550595296ee6d87e771c51c8f83b231005cd8e5ae39d86ccb092c625569525e53d22ccb5c11a7f358f89b5d8b54f259cf1f0dd920f663825ecd6b034fe1bda6e4ee7424bda2d6beee52378904ed1a0a432e9a023215088b5a97d6644a95b38ade0bf808c18a430f31e861490236726be6f2470aeb7e0faf45d1332d4e6d7e32cb90811d71af360fa820e3458e1741a53fd3de965419c015a9e24b06645165c732e7d70bd4faf6e6db638424af78d1dfd63a255173cf62e60d32e6959229af719c77c27bf253cdbb521a0b8f6e416842348de6e052863f49fa29cc85e2dda55790a80a15d4a301b696ab412dd15a4ff6e035e7eef9279d67f72fc47c5c558fa296e2768081d0db012e80eea7e3abce22629bf1216e9bc5688cac97220779b579368dcf6501c4a3c1a2ffdaa4a91c2cee4326cb21bbc8ff7341080d21eb325e05f911dd6b5d65a1217b92cccd2d96b3830a3d3f97e89893b09fabee1e1066d36e66d7683b9c9d1d4740a08dca76ffa9093f4a132b MD = 7dedb138a250a3ff4325116aba68c7b45f21b6f83e1f381ad1df4e5b4606e5ad365728f3cc83a2badc8cd25bd45a4289 Len = 55672 Msg = b7bd0f9a64f3f398ae90ee77e2ba58bcc82ecf1f838f3785b8fd002ef2eaa730452980243248b21fcb2083e417aad657b815f135cb158403107de7444b10a4efea943520e7290f0ef0d9df3dc67013f5e38e9cf25ffaf25d143959fb016064a5ec26b7f84b3d104d65e389ebb5b4177c8fc257be06e78a7b0c5addbbdb81ef3894068d12262dc0c472650957ad1debd605d8aa01878453454007fceca21c4d922a5d3fd840a0245c5f87e8e8755396e98df91d23ab7855a4f7693df61ed88799f65256b0613f46fb7373ad05d7ff209f6e4d398c3a6c987e7ba82842175ea3373f0e590450b22d8af74ee01899c992def2fb85a5fc0725bd12eb45365555ac534fb9d03bd6a0e1f2334309888458f3905f2c8ad4b8f20347055a1d3b9f66a7d46c7a43bdbbb26b196f77b1bd60554b9cfe07ce8238d43a069c1f37babf399ea4df793bf2c78fd2e9f3155f1ff567a2ea17b5db184256d3e01e5f1b197b7598aaf0df4042c1df1e4906439c160a370162f25d39fc9f20d5bfd54552c29cc29ecee6d4d815734c5720f229ef0a696c6fecd6286e9817d9488a07f6631beacab7f80b7f8dd3a37c8658fdf1e063d8aff5700d3e045371293429fd9dd68e2c32eb10a509e6e41a17b3d870c0f78920a89ad6ddc6839477baa283ff6034812ca542fefd996bb0a0c6e48893c1bde409fe66068fe871c5ef3199825467045eb0c9c5aa5b58a5a0fd312350ad19b9dc5a5a61e86ace584da239220d46dbce8c81467bfd066e1b1af8ff771808f374dadd639465b89dbf945878440c1be41b7367c56ddd480255875ad8e9c8ea75744458c20663bf802f02d89607681ca9717b29eea133673cdc50eb667f489cc74384941ebfcbc99d2fffec3c730791535b0c916821e8ac4537db734e4380661269005920c8861c1c47f35a1291d2c2095e8e65dcf5e25f45ee92ba3b3d598f7e6c226e70287b0026ff46ebbf68b1f6f404696ef1230bc8638adc87d374b96132d6519db5e791bfe3e06067ec008d773cd4057450b54a2fc89220a4bef08a22572ef4ac970eb2a07a71a99640624c8b0856cb3fa0b286db9c8ec8d7a5b9b21b14fd7564c0a4c5ea133a8a406495d87b801321968a23a91506073be930d81b9492ca3b8dd5b1b1e6d8c4692cffa1178fce927042b60f9a252e84e1a20654abd4f81daeef813e60dcef96af23ba8ff30e175b210ccb7e41533d8d22c9d0354c256f7e36516a51b9138039c5ed3d66534286f79ab9727986e75baa66283583e5cd1f763b7d38f5a4d5b43311522f2e1e7140ed451452065128af641585de475d152f8c2539942f0968b20efd1a38f03ee470c589e414308a5f624297a972899e45c8495c4e2609d015a351f00c01b39ae33c08cdf05ffc19d49bcd545c9a4f8fa511344884958ae224af8552f1327f1ab5cc3d7b01dc74e6cf838bb565fea3187d33d552a289ba25ddfd318a91735ca6a449ecfadf329fda984206208e458c211455b4e072aca28288b6dd02b46a5326f6db9eb2520a85db76ffc6fe9d181392b3a05a5cbaa349e16c01122122c26b82f4a9d90b220c2fd2b3e351b85b1e3e53a23c4e2c4319b82bd207564fa221ada2e6dc286d16dfa4a8951531b49000174d295018bad5b4f54602f034f4fe301f6f149b1040f82cec4365bdee5c0465a6669004416c381c0a1c44e33178fc96cbcfc50f1bec8e9a108d6a050e177ef6f2871e8150ac33fafe94e008d74465fbb9ab4360d0d9a1d2176dee131b4cc85b03991cefcde18ff6da951d88adbe0009f0ecd4b5b76ff87b09ca370f9d65a83be182d276407214b7a509458b3b4f97667878c13659175d3eef8e8e221ac9e73e952c883c32c98ae667d79e380a5ff0ba5939520d3d3796c3d0a03b741ce04d0d267d866c2b4db92a29e771b8a157d5ae9b16ce5fec396cb1b4e8862c2a12a1509c5f132cb166692cf2210533889d0ce947f67f57ec83a7b1a34eb772cdc7adaeffb979a44e7c6194ca6da4d0489b5d1465c3ab1ac77f0f6aa6ba15708b6737d05872fefe89f76a09b9b394b768b892d7fb649bd304936b85c414e94bef5a085eae74eb5fea404c33c8db1e11705b71d913c197a82c2985a906447b2e7e08e8ff0aa688f1fabdcfbbfecd8a06e9eec4c3b4c2e6c1c6a8237f7232133fc2da9e5b73f01cdc40d7ba49647120bd5ad8513ce74fd2475a780eae13c7f9a64236f41bf13af14845f6d78400af285f4b81e1edb350a16271010edfeee9748c8685b0e78c6c4d5c8f83ec15dc70e91344513b7e20ad9c3992aaebba0d81ce1917309b664d6f7940a8e4c2a3009aac02ceb02996364e0bf545dd6ce677784d747c9d7d413b29bd1d188321d77217b953700671ddfe1b36bd12025a0c34b43ac63d361e205f83601b65c7d1593ccd582fb3bbdcfd7ffd64ba827f7dd34d1fdd36e36245a9bf65ac61191799d066a6d1be1e37329bc1dadf141cbd9de4c9a07dedf588bc8765b8e718bbdd42e5f6896b2739e23b62cd9cedf2682482e6b01e6312fb12496059625a67d480953ff65d6f938c25bef7aa29d77cef1df3820a83d8ce7d67b5dda14d4d77eb6857876d0c2529a0668505606be5dc380eba60e0b6224904efc7a5475f076f88fd5364647dd512fc0e5632f8485e37cc609d27399f89aa171249615382d27834a6507fe298c7752886fa2679aa8cb8317c65801e26571a3f3801b8cb9df4ba75ce157fef45437bad35398aeb78b584f1c8da129633d2c003c9b953b998b65cd6da6b0d936c904c1282da06579a22c694aec386a9ae44c5eb2d37d9245b6087dc331ad1d7f5f70fdfd7a741c4f71ba4a095e9835f7ff3507fcc44f315cd3a621141ea72c2c8c0ed9d9b66e43a79e7469fe515b2c18e288a480fa74993d88c16fc6ca3995dce330dd335e096c107d0d518050dbad6c32a9acd5c2a82a6639dca251d0cedafed9798090fdd0062891c79945f9945a70743a9961c93465657b6a715baee17c00e36b5c79025ca24e814599a5a83f83a40b9df2cb8ab3fac9a1fd553ad11be981a568d96207f9b100a009eb25e927d9958d56316963a13af15207b675c3d8b40f74047fd27b41b2cd8286f64d38d7ccc35df5edc20086a68b001c1da313a25bf8f3c0c850d8df3823ad3f539223d9cd9c11ff707bddceddd5409d03392cf361dc89104b43bcfcb1a194b58b8b16a86cae2dc571ed47f4318e781d0fae9c663628c89561517454afa5bd6bf6ae9dbe2a78260a5a9cfba152152b1e9b89de55697c26a2b2d0ab6192ceabd52d5325a577688f10a3115530bfe7ee141f316f5b7c4527daa867de9e0b8ac483b83f5ad8d41dcd8ae3d0e12ccb952590336bcbd2def230afca7d6a746a48bbe9ffc989d2d0f665db85522c1015ab5605506f70761221f5948187fb8f3fa6e69a9c685f2dfe90ec75101b92651e791405fed2f99fb642db1b762dee490c23c8f7e6b22744ad6bc60a0ca3b0b656acd3f4a72cc3ca2be355c710c5df3c502df794973d9eb17de586ece371036e4ea51a63e1e36b8fe3620a09d9e62ac39c43e6f3064111eed09ca3a02d1a06f777005bd6277d5d5b8d7d4c663a057d8950f41b85bc831d67560fa0c651e5480c603d1cbdf07125b78a63a15ec9ba33f80ecd09ef326a3db57ead02c1fa8923078ab9d1add565311e5ad3ad76017aea9a361d3672007cef53aaf35e157f7c346367051f083ea01c0a8f3bd52e79ae0dea579325c09f21aecc6b80f743591508ba75bd596f94d85306980a9d0a7aea1a53039d5c5d76fef87a40c482de2009fc77473115468074529cf5de897cbda59c8e9aba5eab106b58f7cb3c65486cc1ac144c1ed71f89eab73829160ef79a7700d7ad68812c040d4cdf5b67331487b2843c04b5237d09c1ed52b24fb22d99b4e3d8bc267872ca4b406b81c350c51973013901b26ec19890519721f9f7715405b20c3782b8f1cbbbe056dedf62cc9a89cfa5b3953d9faebca05fe893635521e007dcbffba73b80b5891bb329ddad734d3c0c9abbf469c4cd462786aa7a5bbbba31d4a5ffe7b2a1eeb714af2125ea3c53d2d837b547a26338bf787cada0f75a1aec9e9a1deee977ce06ec3353d0056e2420931b1f8bfc129578ed4b2b7bbab58874750cc41162aab9d50ce03060818144a1b7b53955b95b5a0ed062926f08366985f26e8113908358cdf126555bd10e1bd2c076b1297c95fceddc6380ff7255547db14fe35a05ca214e23862126867d40304800057bb86af4926bce65a18baadfe82c11495934c789c23e70325514472846b8c1b4c0ff32e7a908f3bef9b6af4241bd635195900418e68c84f76c0d045a929d3c3d9db3963c7e3e83fb6c85cb4206ffa66a93ca184517a834eedfd33d4d805fe00e6667fd699e66efb98e7b9745c46d6b12d8257ca4d21bf08734f94a77ac9b5da5bf9ee105962ca767b3fa8bd3f67111d8d74499aea242486ee001b47f83b9f5a20dcae986d20a3b849195216319c54b2b15aa07c904d5bcf4856f23bb82465871d57e6f63fe5a2cae8bddf079aab4779817c83f8a7620ceb679a3e0b244baf6a3bb2beb3357c6fb342737618e35d9179e6211b97972cdfe335132a40a37a240960345f56b9acb17b3d833fd2727adbbbc69390e0c8737abe980bdb619c776c6e7526f167323c102bc33463bcb0cacc450b18095ca3ff88847ac87cf6790b30a163d09b6f08f536cabbd00a5f05140d219bf9ae918e97af3dc2933387a1fe18a8107a86f5a29fc8600c9d5b41da224557607ea809f20597f258b4289d7c18cb8d666cda816a0271f6a0e47fec95ba1ded40ee1f4c380fe9ab247385bf7221f2584cedbe9bc7e5d7925eec9ee8a0a53ded25933ae0c67e4d6e0d186f76ebe0340fa9475acc2111a23f2effdebb61ab4c5ef6b3224f06196a45feea10494f1e3abc67c0d79be14f7b02f8636aef4293f3499b97ff215eaae937dc3290c006a3ab666da15d916d650ae5a461680ca927d9b5fb87f8dc38f7714c9039176378373016a33213342e1bf6ef1b410198002da7aa00ca350afbcaab8d0244ccbb0ea271d3f1ba220f8c3be728434b5c1dae6e043191aadf320fe93f011a9ed74f2eab15a53f83b2a7f08b879905c7a2221bb29950966d1edddc1cd4b1c18e61a7411cc59475d3ea86c0d57b494afcfa30afc10d11f85c1992ca2d12a3dd5b924cb0bb28a97bf3f23366df6e40f8338dced262097c9dbff9d941e2a3e1574e91c5e251e7eb392bf33648720687f8b48284ec5f35986edee53aa9052c7318af879a3ea5a96398c21518d055eb2533c702da657e386d5300063e6a5c585f07c69b542e8117177e027f606452c62290b43559a588bb03356f846cecb0ccaf0bdaf67a18abd811d4315a966e2f3f87f6c2428814446563fa71864d97c8336b0e34bf9466ec95598398cd4255b5fd5b4f3a52ef1b7cdf948c4f3467d46e3399f71d1f2b7f0cf6f5727f01ed81aca9a682648c1720f6d09ed151b74509687443aedb3ec6cbd3a2ef882d1d1e5adcea71778819878d7be18ab3be376ca07f9f701ab643edb209424fafec4a5e480c69c316ee20c7c8d3ba5f19e0db66ff7b5c2925f856289c757d1bce02b034b306cea447deca603bc60225eafdccb990245275b6e7a100f1e0fc5dccb876280390c01cf29f3fd94c1c61e4105e32f0b9422a5cb6cd49fc1912671c9356c5c2a073e734ff7aa6ba659c81a5724b3490e49c8ce60bf079a57dd365610a24c48bf277ecf356b7278ced10076ff80bfa2378fb1e1c9e99578183eb9e33196a9c0a62637762df9eecd64c3e9e4b8ae8ad31dd278b05570f0b1a9421bb9aa86f74c756012f8783761a20e9eeec40102875407ae879a91e9cbef8193e649e9f7c754b3717bd6c2889dcf32eea9956721479dab9069111dc8698a1780b4048e6d9c61d6e6ec819b71d58d582f94e9598f4e28601487a447716c09f1b4df89f66ce91c661cef994197bb6514de2b3066b10d7cdbb77dc4ad9945f7a68cf33ab05a3fbcc7afef8e734eb1fecf86e6fb0d1af81354d5b612ce8489cb8c9589a75ac9f2eb920c86c1af2b4bb30e9652b9cb31b084820bcaff18e79a0e3a5afd504440b5214baf2fe333a20b1a4898f8ed0fa9a938e9c626ea1b2719282639d8b61b32f8e66b245553cf3752ad040b341568c754a8e291547453c769b1e6dea6492e3530b366f891a3c07fc4d3d779beb3653f456d0309ce1e413d1e33e2a5e0aa1babff10c5986f43c5dfd4372940d3576365edfdc17c0e68621ca916a02c0229522ba6770d8038c43ddc033f701d2c6201cfd0c3b4849fb334da8ce2b5dda5777028e95eb54ca89596f8c465524b2483bef17067429ffcaf47fb5c107a3724e4e4181a40435a19486fbaba313677460d096f5f50f24a9fbd09f3793883c51b222c9dcbc44e35155d3696374b931e2b8e6f9df0094a01136d096776b36913f29fc81e70432c7a27347a1fdded0e9c2f885001c4f8c05fd22fb4abd729808045be351e9a556475b97eb8cc00bdff9ddc8b593f60b7fba366759a451cf360a67f2df212cc738cc4668c510f6236ec8fbce7f9ab35cf32984aef28c7aab98003193f8d9f69061bf298fe016e54d05bee4b5eafd9c6972b9ae9fcfeb812e47502ae83762902b5886cdb34187d7b22d435f23ffa4f95b83d27ee1f7a7ae7fca641a99a3a242bea58bfa7df249127a6dbf35c1c5771259afdcba1d72aa49c7a9a2c94e44825372d1347794fa46dfcc4e9a2e36445f2e8c7c3f2bfa49da9a2d6d74ffae23ea0d6e63eb0ea2616485d0573c122a8442971c746499218321e9da9d41836147c3b6dbe317854c2f8d4eb0100ea9478e0a93301fb1cc3928667df6c1701e10b9f397e0d91fa53c6da880910176bb32699d6bf0048f8beb41919fa8616b98637f64f8a6ce6d361a239d649eb3dd0f961de56785ab679fdfd48997180699b901a3fc21544a68008d575442fcadac6e19b3c8ce179c9fd1bcec38ad6f376248932ca55913d378ca3e13b462d67749a0633230eacd60a1e72a8e8529d57d2e0fc02346e90bf3055ed55ea70b529a1e6d1da20401d07ed3a9d3c45852715f65d4318fc71963317782f9411586989d919def0b2c5c487e9fe15c9599716c656f608d780f31441537ff52c2e41cd1080cf780768f435ce96c55700a30ceed17b57b7de70879d528ab9d89ecfd122564f64479ea17fd3445a1ceb52906b11dfe9deca9e299393ff13c2346c448b3bb37b74c8170abd4f91da814d3fc016224a1907db874aab8a9f9525b3054ad46bc0cb7d7410f330ed3f6e8ef738b0a282988f7f453a2243f3cc6560bf0a315124f685dad61cf98f4e95ac9273ddc0a4d543c381a2176ed161fe2aefc2eb966609dd5139588b8c0ce64d0b383d8fae717ce44bdb7cbf7ee857bd5c4f6919f8a78ceda41595ed394e46be10ecdedea8bcfbf28ec93f82d0fd47825ffc1c15c67a209004dbf8d27fc7d271342cb23b5dcbc4f712f755121394a3d5cc62467f8e72676cda090babce1e3c0f1b7462364c428a4a6ed277dda5230f30183e82b7cf14b3ecba2938f9b295c5d00d60594ff2a59e94f8d6f256043cec19d9dd5b4ef6c5b8982bb92b4cbbe3126ca05d21f8cf59844f57916f1bcf56cd0b77cb3ab59429c7e795453d15486aa44d6ad736c150f2ddd1f18e488f54f5248d7884ab7c25a574638d3a08d3f6b0edfac37b122a15f60dd55d2a0931338c85086296281339cd30847a23f909354a71ed50954e939cd796c1f0f14b91f9a15104ac7c2b0b3f05aed2f27f8835828bb2ad88d246be441bfb1063706a3205c82b1aeca33ed4b3e321d77cc950e97d1932b3d2ae94daaa37bd591b23ff91e66575b379a7de0026ea4bfa7f8dcd8573677488d476a3a93dbf6ff49e9876222a0dc356f9f6830e068f8fc4712978aa03faea94f4e70d8a8d27558b442a58632f25868dd41bc86ed1476fbe0848ccb7ad482770ba6c3cff06e43085c26630e5944151b09e94089325b66e5f9b58444eedd39da49b72bc87398a736c9fe87a29c7e59777cfdbde2b6230fe11b0d469d03421cf992e9706b3a39e80b8130dae905886da4bde7fb388156ba18cdf49c7dc2eb73fd6da4595f4c374fae0e26248c9b4a99c9540dc2349cdaafb197d24c8c31c1860d6350af4db27c2447f8462d3266ac240fcad9da7e0e9936d5010f1f735baa9c52fb553adc72eeaf00c5fabc846f97589da6b10abddf7997ac9413ddda458ffff4bd1bc2b5967737ffffa99b2abdf17b9c70ff1b991864195dd7474e68f959f51a310b0f7f25fe066c2dba90cb58a4d633b12ad6bcc0410511531139c67eeec7ece08be8e3286a6270d897640f4996b18bef9a00cbdff8a3ef8eda689cdc38bd9351041789a6a5943387a7dfa097b154cbb5b764717e703b20120ba1911b1e1e370cdf6218a796e3dcc252c8234adb061c88e9c954a39315cb670aad4d448734ff9a829239342599931200e9436bfe10a6f298f61c59487919134154795f5d451482576f93533afd82fd1908a60101ba907a2cb472a577ae32a0165dbd72879a9e4cc4c0cf0fbd56ce0d05eef414cc4c03a90dcbfe9108fd3d96f392c087ed7bc481334f946d96eda2ca2d63d6ad470e2605a3036724e4ae627b3fb92ba5772faea80be28b77ae0a24bbf72ef3d25a48221857245566f109cbd9629ba5d50d008549b4425b34ebf47c68cc19f58eed411e6a8ff5726018559d37c400d71e973471ec9637adac36f5d35915ea81e6e8424381b43f631942dc031ecdb06888fd14991a198829e878535117386a42e43393b8e72fcad39955e42315e572011b27e8265aa5ff76ef97571d299f61dd8fb67ca624665e68e93bb625a4740f4ae0fdf83f35a2623dc97d496017b097fdef5a4535bec3c3ca10da9a3253e250eade688b0d32787a257f1071416ad5d3480d05358c3fadc0a2161cd772ab97fa8a1d4eebb8d98f0fd7183a16e9a975df66f0a095d42f8c1f9804e7b70c33fbd8d1a6995e67b24fe9fa9ce1827f5cf78100a014ad3414c7a653e12580287376b168802f2d424621cf3714effb2c0bc582be2647c5d578c81e7cb5bd7bf0f4714cf6b3faa0721c6b8a36874bca183f46a947892325dfe2f64eba8997f08a3d52722448e0fe1fbc96e39efddd376a7fe2c044d18f1579dbb900b6649b271ed783eb9a46cb9170af0b9f187e8d894b54018d5c0772dccbea79fa184eb167d5486a7fffb5a29f8e7c31894b13430ae2450bda3832b6c3fe979e05874fc1fad61a71f6fc9e4d71a1ab6f68e0c3e70058da686d7f5a42123a6a90e9ab70b3264ad4ff173808b34fd0c52f037e9761b4d49b810eda87fe11a6ecb86e2db86f3459ff7bab5cfbbe804351d823ce95996e7f11bc87f1c2d2076ba47c5cb530dd6c2a224f7a0f7f554e23d7d29077c7787680c3829f6b12a63eb01a457aeadee615e6c5e24cfa9d60ff98df84122235e41300393c1df18062fc9ed77c9175cc7078b4719ce9c45cc8dcc9f2587177e6c68e27fc50ca2a13ee8a5d628769fd0264debdace51916c5732ddf97b5741de2072f1c93286ebfd332301443d0ca2b86ab8d290125a398de4a3a015703e5bd318d3e08862ad157c81735ec03bd7ca7622bce1ff5c450f1b1354a58b9ab8afedc4203125ec0ba9bfb83e30c29b846189ecee8c7122ae8ca461da70c45132b89e90dc663a251f232735f809c3d28f227407b254adfc033caa3e8974483a4920563d5ce22da4442c6389455c6c875467b521acbd0e4ecf89ad2806328fcc6861b4f8464788f0370fc5309aab051060bbddb MD = 0b7356b6057490b828893565407e4dadd6e45d8e75399499f74ab90bc917d5b48b0b125ea3fc87f45ffa12e05aaa10e4 Len = 56464 Msg = 6513955868a263c0facb87b9283d87fdd02760e4fa437b896b13de28786ba0cb192f9f263e5e75bf664fa7526d3b2073a5fcde752914ec8b6ef1902d1b70c5bd1b9feb6bf0c7be564aaa85f3d8098bb35e69d3e0081708c8fe6ab31e3848b19d94ebe3ee25e527ccce62876610aeb10521f7a7ee3e53b88a4105afc476fc4ab3ab9cee7986c1986b1c011772be3279b0162cc36774d0e517624aece77e927a46893973d2bb62fa79590f9cde8a9ecafe67938d13519775b987c1d34ff71527a0554adcc26bd1333fb0127e731bf98e3539b16eba7eaf52b5d9f3cac38a8a3b07385890113e142d05479424f91a4bac9eb710cf23a22062567f673a0ddffb9dc45aeaf787de35ce13461cf8382e9c0c810637161766f38fe3a1a58cf39d6f351fe28879ecf03b00b0d63361f700f5962651aead5e722fbfa36936263e6defeb5ff8ba7e071f2faa251f5fc700385d32d4befefac06ddcdcdffda172b6f682a7cec6096ea11018b4bb482b92197dddc8d575ae6705ff03cde0856ed622e13051b271fcb1826efe05b7791c2b0b777c406f9f465af4d1ab7aeb2a26bc4bd501d154241caf72dfea8764dcbcf89dcf4282eb644e3d568bdccb4b13508bfa7bfe0ffc05efd1390be22109969262992d377691eb4f77f3d59ea8466a74abf57b2ef4f23cff7d9e9cf1bbedd226d2c5386405a85dd1709355faf926541a84047c9a667df2d41c6b371c3e59b601aeeb99d0157ae15a90feb6f7a631fbcb7ef126484ee64ff41766866d90956aaa5fd1f8838f4da0743ffb9e9e97b0870e0183224295767ae9d45831eb9ae917a94e40fb865c6ac2a6e554b6f6b5ea206c7581189021729c3bbd08e09e449de587e2ff4de062196e78eacfa507e629ec6c42b4af38dc25dc7039403a8f77f8fbcb82d894998ba1cc73b63513d913b31696d0e49044add66312afc6e7c5194382fd989179babe4c051eb14daa7525d2c47287d863bb7bcc58a98963904813c7a1a68bf3a34ae360410244e10fe202cb1f89d05acfa63050e4bb2edfdd214ec9814dc3c6bb51e126a7a5d5b7ed2894e94e6211307c0cb3aa2fd206027557b194497aa8d268d8a2e66091ce99ea50c1737985b32313f5ec226075799401f2236f22b5a2de53e50de8934e954dae6073b0ca7b1ffb3c6ac300a02def5c28fb8ea1348719b423830a736962949be26391e967cbbc809e71208b1680d0239379d973a677751a81b781d00a57314d2e5e036778fdf17ae215eb0cebf884b1e974ec2da10e1ed9158b5a489db5d629395bb16f269a28b0af5b0ccb461d73ced3f5af174cd27cb986067d214b02eaf9ac61834c9829c8ebae4d6b1050760642f9020a78d04df7817d30d3a33bc8d5832e796144f83239f387f2f123308ba3d402a6e59a5407f8fba1124218968efe9068aa33a16b3de290e152844b0fe4b44e97e628c30187e5ed9bb3b3c683ddcfe702fce1a91bd32d8a64760dd2150a9f765fccbb3cff552820121c0ff62b3caf52a37753a5307b81a8b96575fe6984ce15035f864d75f9275caf533cf1b5330697f32471dcd2be46b38827a21834daa7f22aa7713d8bfb4c681a6224fc4a4a3d7f9c0a24982723e57478c57e679d9594d77dad65566be4fe0efa50ad62120abad24331521f5a32c4b03246f035cd3cfb8aa37848de3a3ca414f726c16934fae65893a2e4bb91734c325eb2dfc8ec5746d44510041e2389a843baeb475bd9a329d83164c3b1f46fe5c1a312356a216edc7d0b7e7f5e4c557163eba7277e288bec1cc87fd54cadadf824a96dd960940a254d9cc9a3e6dd27673c3263491b4a3c95eafefc04d3e1b5eb2419cbb3f56eb2890ca1f956fdff88f29535269579663e8e0b7be2378dbb1028899b34ab70d7ef7081c11782ecd9ff7a389ff8f3e2a5173d47e83956c36045151bd6b1a918f6484275a52a0efc951467eb16e14b9c2f510c65ed0a48befbdc1ca173499537f44567b0f53ae272584f217742ea85f02b73622f315cf7c3b25ea4e519055713f86e48fa5850e6994d3910a4cd1a8926c106a66b5d374a1dad5214ad71ebd7f42b4c4b1b767202b899599d395c7a3f861b9142e218a329121540d6c22306fe24b566d9daf8ab1e1667372e009a108f585e9c9d5c0ba97cec12b051ecd65bb2eabd445b00860022fcdd5c2dbf2ce662e3b5b01fa1de502bf1cb2bedf232f4dc8d6b6f3755c77bf6b2234f003fbd049e704654307838a11f6a6938129ee1d86556e86ed7a16423828062981148f3702d47391038aac1a23e9e136028b6880f338d5cc9a1ac0400afaec2c0c6a27634f5b0b76c9f00225d71d7f22a9703d2a2307aef09ff3e501b63836a4e8914ef58e0f3e8f1cd3f03daa15b2e1ec84d64984264c7b5581ef07b874883cac16706e2d557f3262b320b20b474eec4215ce9f953950f5513158b28044634bdd56362dcbb2500931fa0e33794675aa50bf707cd4a53ed729aebc92bc0c2a6ae2fd0ac4d7ca639c112503327277f9c48efe8661d0fe789935468548ba507002536768b3eff1fc4376d0ba2f85703d93533f5aff08a990c40a953d1509a5c6baa521da8b62cdbc97d9699d8b30a3a3cf541e78a4fa3b09e010176eb8386080fc6eb8caabdeb21711cf7c27e602a6dea0f7f859e414276665fc497482b53541300698c3a5b2438e39bf64e3c059ee50e0b579994ce4f318de15a7f9050e888a0e135e50099bf694882fd04b9ac4ee7ce7230e913feb22a3a102cf66cfa2decddf0b55fa37ea4fcc85a73ad9e5c22be52cb713fc4da53a99672a0c484320ac7f3b552c1cc13bc398aaac011921e02b1c39e84614f691af5c9911fb07fff676309b874d5225fed67b7fa4bf83ef9d6074974d0175bb4f058faf51283056a2c06488284614e6a20d076d37e2a49f586090bd3bd2b90c1bb185224df05c07a41f9d89ae82ef73c3ebaf0bbc06e5c1afaff3246b363989a657ef8a8f0fe55378e84e0880a04c6de2d6e4d3c7a8e1f711b31e5521a891847d4d21409ab366fa9fcee88d551ab6357d734b4de12503901cfe64d815a63bbcef25cd0cd7a75b4d97181fa0824ea75af22534d28f17d53d2ff67925adbba2639a563527ec482ccced6835ba9ed8aa4eef81541a27fdd14ed94fddb6506550490d731c2a3f0266090143dd64013549a1d40c0b8d42437255974ee502b41fefbd96f0c49c56829182811f79056fe0dfc44e29dd94749542d1e89821b33f57bb31e553d0f6b93539b9db7f9b47215807569c5f4cd8254fdd545b90361058b95d666710c3b1dd96b92f7ed8a681dc274ab96d30dbc0daff8c5d5eeb74d2a691409baabc0f564a23ba43f9af3d4de6db046d2f32fcd71c00da4d60fe80429f9c0f621eba367c656897a7ca87d223d7cfdef260da42835f1061b5104dcb18aa26145a319fbb6cd5d1ebbb6fe6d77c258234e980ab2f6e1a9aad14cb5db7ad6cbbe9e481d110d0120c210f5840efef669ea0a33d0a25ffe4fc06fd20a2f8794dea0a719df2d92e9053c214222a7dc60171acbfc48bc8a134d119ce8eb1f014c42cf0b1d47976d0d755695a4c07f3c89cb7a3bfd5a47a0a80a65019840f210875f13705c3e96c7f5d9d6152446df44f7ebd3003def8dc845ee8345e9f1f1dbcb9d347fdfaa73c82a978548c99c0f1c34e1edc2c4edd42b73613511e4e6648ba364f9dfad75779733192bd79bab57edc813902a9b3e65f0b9cb410d8f079347941c2b38ce85e75d98c59069a259ffdf39eb84dfc9c88840a09470e0f43dc538282d92344bc40e41e2057ba7e78f4e1911cf908a56758443af248a331b6e4386e6fff6792b18336c9840b63871368dc4d7297ed34b2ba3206ee457ad0a83565856fa1faf766b9d0542dd07c64834050714601461afd42b00653a9ff7cb6544d60187d57f35a49535684637f67573fb0b4fdc1bdd8a57650a1d8f29b866fa552a6e0cdf916fab632493e20e72ffd9baf710055aeee49c99671d4cbe99e12cd37925f3068c2c684ff94a1953e2ee5089f4e0439b3dc68b0f3eedd7264246e204eeafa2121874c3a1dd1653d0ed4bbfaf2a45fea472370c0eb8169a295a9d0432ae9383cbde50a4a0f77ef84b3c1d0d75c0c99e3e344007dffd1ffb8e8aec79a3e459fcf886c7f395700a708d776c2423dff48b312be864cb3490641f793d2b9fb68a7763b8e298c86f42245e4540eb01ae4d2d4500370b1886f23ca2cf9701704cad5bd21ba87b811daf7a854ea24a56565ced425b35e40e1acbebe03603e35dcf4a100e57218408a1d8dbcc3b99296cfea931efe3ebd8f719a6d9a15487b9ad67eafedf15559ca42445b0f9b42e7089cfbd62154160cd19aa086eadd12e6ba93b148d0cfd4da99fce7f5fd5606807f6f11fe97c1d9cacbef67b12cb56fde2997450255fb610943fc60d5228e84fd7fb8b572cec1da85e2c24862dc58bfe04c539262e9ee9a646cd3577efbaf3ebc6dfc5ee952dec8bcaab5db227611738ba74b31f10923d18a6904246a0522a45bdecc86b8b06304dd785c9856868a3b3edef0ac233035b6d9bd21601ccba3564a568bc56754192f76f008f8958a1d678837f6597ffb9eaad0fd9d830dab8bb50649cc938bda4b9907966d8465fd6598e666aec27dd7b93e0e9efb15c34156412e4d01597caf84e20dcfdcb43e6cdd3fd7cf8c9f93312fe0f115ac90c4198dab10b4ccbfe0404f8b0820e9108534fedceaf7321966a47d2426e6247c8690bc235c35711f2d392604652e0511d10244f08e5211f84ebe0b77fea5154181434c7a7f33a0ffd9f682ded34bd340b8314a0b3084ce84d1da557d06c6d1785aadd8f0e833eefa6d04f08aa10eb625916e788d8ff3aa7786760573cdd00b99693ccc2725aa8d675ce0f9987ceb3028f3064b17db233828e33d762cb235061d438ca09db62c3eef30270878b575d3c353855c0ad0981a116e8d31e8627a638c5ff9e0c5282d65fa7d23a7bbe91313ad49880606dec6b2d98ed1c3374d14966f3511272dea228511aa7341c29657721f3b7ad37c743384e9dac7a4a9e0a8312e697ece388aa02ebd2ea2813d3bb761c1bfda6edc2f6312bac8cb50b0ab89a642437f5095783ac555901dc07c57c7750d3d2322b66ed9eed4df5941dc2c4d785379bf58953136eb8375618a1058ec2e8a39e1899bc11c7bb084fe129ce17829da729b40e8443903cf24fa6899ddb9f0a13c921decb48f3be660362d63498e3d3fa4bf93ef3fc590814564d66944a56dfacbb15a29c7b6b1eee77e0cdfe2e4150ba688dc1a724134525d2d4e0f3c22e8ef5ddbc8f35937802291422b534c3e63c6ee73940a8a4041aab2b04a0c12d703f7795dd4ba07660929d42f237dc3e18be9f32c363ff6574b030c8a54e0672651cb84c427ee50e6bf8d46a16fb008620fed4b0f3d1b34ead2e3b137f92cb79524a426bb1d10a41e35956f257a8a785462595c99333cc46f6bd55735912172a82f49d58f3eb19f90ee0a9447de6da22d15b6be56930533796850450fc79f26d3c404f7dd076191d36b257c6505fa0450bc7dc6c3f714f08d6add313316d642ac756e2410f171395a1fae8e298b801d63a9272c6db9dc8a1fe5e4722be9676496c5fde0b7a780e4997dee2ff1c9c05bea7e3b55c055dc6ea56bfeae66b9e2fb27383c945d74112216286cf84a5b1b5e39ae32c94875952cb25f943c7022a984d24e92d56ef1a2805491b36dbfb9f182e5aba5fd72838732cb533da2e49e5b703c6ba91a68aa956dd93c5a06be60f3687318fd68eafa332f54c9638810a7496baa31d7e9d7099a69189ab949c2ea918d7658a1a1fe541950e334ae4290b823d5b013b7ba36890200973f69ad69a14c5043fd5b2f492bba75fb276668f15b5b2cf293c10203b36cb2d99cd3a81f3f945f8079526737eb86dd01042471aefb5fffc6347c57cb135afe64259fd0501ffa19905f5ff0670e1f14a97d70e31632b2cccf784231f9232d41ab7c26acb8ccfe0d1811bc41431de3ab38d5d433e37bf3f262c1cb171a6d843b2412f0a395c100a87c22ffd058a5650f53bfb6fa8341842f14b37f7dbb5cc039726c863b8386b28a3115a324040f13cf6e9da19d722df3c179cfc7ec386b91cafaeb7ffb1ea88410cb6c3ec2f1e5805a0df22c933c9bb367f6794cd92e24597e42321668a380e5dacf994b239eb33b3d964fa0724f0553711f4276db191187b1dcb311eadeba6846a21f20dc66e294f8bc18a5c12615447b58adce4865bdbd042f00cb180cbf7bf2e7807843e70e3df9d3ffb4f65e2616e5373dbbc7b08369e3ad8dda76d9faa15e044fb9f0ab9096ef7247569853c24b5d3f54d7cf75fd0eeefcbca86da31668f69cef6e69011420181b81f30da3744231d595aad622952c74813fbd83147d434af5e1fe2394036a22345222ecd9a6ac11ae729d6232e63322df79924d9aa9b0c9b3c9e1a6d0d8e58c511a6ebc42f3d96b0e6e37fa436ac3686beccf33a22641f15af9c169542f22c4f65d2ee28bc66aac8a0af314c09d5db3bb1bbccbc76d7760600415f17a50924a989cebf620a8c054b5bb672836e852935188f37c7709b185478b47c5dff7c4bbbc5c3e6d8e158b01f601fcdb12f64295a3b6fbcc3d6590de95d1ef5cd17f2a66e61d9ebf40872b22ef713c73e121be2936184e41871b85eabf7a653d1b7143fa8a437571d4981135e67baea93e0525cc9d3f6362e0961128490751dd0a58a1d52d806b2ba6a2ddb99fa3bbd1660b0a0e2daec3b6e66fb315b6eb2db32aafb4855436d8235342013c6f6bfc8305cdeb5c8bc8e793e4f2fc417da86165e8e10c9972d9551f56fffc3cda46d94499a84a361c1057a078da5d1a21c1954be1970a702e0a5a662e375f1964c6ea8cae44973973379c632e90463e37c9220b913c3ea7da3c60ae45728a70836e98c1900d52c505811e32528f57fc24219ffb743b39befbd2004e395c0ec0da907c9a0b6d1d6767af65b4a151f2f27b5d87b2072e6c04277da1cc763e6c98ceff0e6c6d0e57af0df50b608772b7afa1ef41b5d6804645d191ddaf88a42446e4ecb6bf214b81fa6cf467ac615c06923c59867d4edb68c28eb10c7dfd27b68990fc0e18e4cf3cd80940031eeb887028bf2eae8eec9a4428b34dc6ae202393af679f9cf013e3d8c6675a762e728274f18ed122513c3758d6e3ea84b6ae426c46dd69bbdb3b33f6540b96396192d4958b3fd39a7aca5d176b94f9df3e03ee80de76cd1330c72a15ff6a95b54ec8f9524456c87f41f35620354b0e3e9aad9271d4a85c1ba74450a83708db824c815b2bbb4802396d63ccd3e27a9a1b5327d8cfd806793d953f222d897ada18e15894925ea8236153781bd2f1b81ffe0def1beb46f5a70191142926651503f1b3bb1016acdb9e7f7acced8dd168226f118ff664a01a8800116fd023587bfba52a2558393476f5fc69ce9c65001f23e70476d2cc81c97ea19caeb194e224339bcb23f77a83feac5096f9b3090c51a6ee6d204b735aa71d7e996d380b80822e4dfd43683af9c7442498cacbea64842dfda238cb099927c6efae07fdf7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e222d94b582f9ae36d4ca2a32d141b8e8cc36638845fbc499bce17698c3fecae2572dbbd470552430d7ef30c238c2124478f1f780483839b4fb73d63a9460206824a5b6b65315b21e3c2f24c97ee7c0e78faad3df549c7ca8ef241876d9aafe9a309f6da352bec2caaa92ee8dca392899ba67dfed90aef33d41fc2494b765cb3e2422c8e595dabbfaca217757453fb322a13203f425f6073a9903e2dc5818ee1da737afc345f0057744e3a56e1681c949eb12273a3bfc20699e423b96e44bd1ff62e50a848a890809bfe1611c6787d3d741103308f849a790f9c015098286dbacfc34c1718b2c2b77e32194a75dda37954a320fa68764027852855a7e5b5274eb1e2cbcd27161d98b59ad245822015f48af82a45c0ed59be94f9af03d9736048570d6e3ef63b1770bc98dfb77de84b1bb1708d872b625d9ab9b06c18e5dbbf34399391f0f8aa26ec0dac7ff4cb8ec97b52bcb942fa6db2385dcd1b3b9d567aaeb425d567b0ebe267235651a1ed9bf78fd93d3c1dd077fe340bb04b00529c58f45124b717c168d07e9826e33376988bc5cf62845c2009980a4dfa69fbc7e5a0b1bb20a5958ca967aec68eb31dd8fccca9afcd30a26bab26279f1bf6724ffb08733c9a2f4575361e5458fe3fe5973150c7f4edbf6535c51f1879858f285d14e6956001c2cc3d976b1baa05e81f33eeae9d29448f3900fff95967d7727291fbc1a4cff7fe8e2835e47144365a2f218d4c95d7522e824fb43b66d4727ee570f8303dd6dd310fe7aa00d1a1ffe49a0285a14e69a72bc5847a5bcd59f6d2f56c92a8bd1f3218b5de6c46d96dd345e4397043336ab4059741cad0f962d53d26f763919ef38704347ee52ce4e240cc9248c5a8c154f92a6c0a1e4177898e0c0ea3e381700e5c81f06bad3980c9d90728b30e5884b2e728b83ffd13c43891cdf0f48b0eccca13107e173cf3296f0c742bfab2c8f9ff1e7f0075dfde7bea7101825bd29001b15b4e31f41cc06b4c4b91f0a24b70ada40f9bd92e4ee7eb29bc35476c429bbb5e8589b094b547b30c16ff2b2c30f5fc4c2b1da6dbb2e6be70c3d7948863a8562c32618e7baeef9d190f0a400b2bbf825201630e00c451425a38770e42be3c6e94e244001b523e85ed9441b3c16433bc50231a532fcb9e33408a82292daade613305cfc9e6579b1a0437441ae1a30926c0e0822adb5143edbe2a8769abb1e4da812d63507f27aba5f7787fd9ee30964e1efa690975fdd8fe3d9905343f7c063709b99d18583ae6c621d8536539c5619ed4b10d539219d3d159667a3d6b61b913274adba5e409c2f73dc77d6166ba01958cb50dbdb24dbb037c1354d9b1fb53db8441ad6da52cc6c585c64c42f786dcbea166c88c5901f5011020339da5b18d1c8b4e80f43e1c689da4654e8e6ec48996ad56fc63e8cf2856dffd84fdb91ccb32b6c204bdf1413f0c1424f2a82efb6eaa2af5e7c8f40dab71163bc77e5ea574da913ca74f8143a07d5f75e724da84127584d439201d5614ec6d4b799428e43050951ec71d409c338de0e88a88d4070b6555625efda730fb254fad29d38a4184515d0902abb1a37eaa32ed6b48bdfcb0061730d7d62416b4b837f146b10555c749335bd87f76f1c84ed004e7e8fabdb6d434c0223e368fd821b0886eb12c899f94c2b7c70cf31fd70842cfbefe1cf2766c5880cc9a3104dbde3402e068526563e0858d4cd8a885f153059e2edc8713851adcf3357eb5fe465a4cc16a2b3961caa8e64cd86719bccdbb92f0d618eba9497c4cb80b6038049e3265746a8e24172a5a8f86f83cc93cb2ae658833479d1c5a1d222facc3399049d3187c4015b4ee0971cbcc3ade397e56a80794c4cd2de53d69f7caa82c3d39efd8d049a9366e6eee8b357d0eafdd0a0034f3d7193e00bc49df28296c1fa559e6a0177d0484a31250135729e236366875e1b49f9f0ed7ea26095dbc86f22488c4c57886c0751560c486ab436415e801fe1ac48ec4a3f5f74864e30487581d3f10a55de78b7c17e2c261ac69f2a3446f2f5cae0528b1fd7c377e6291cbc5f1f530ec422fb42e3d00b040c4fe1c82de187033cb9349ad50e169a256d4e2b06533dbf6bfbfe8fff75334809f8050193796671cb7c995fa92bf559d2a5e6a9bd983485141288865d942c5cd96912bfac3518a83fd18ac2e356e81bb778ea20cb16c2c8850ea10f44567ca6444910e9c23e2411605f0eabcab978499a8f647779f46ef087995112fee3ad90124008671bbc1213f5cf2d02a7792c4944915b960f5bc065e258a177d16247 MD = b19abfc62aace1d49392cee8f69fc6477422a647223742cc7d65da06cdd8b86cb8198c3af9069dd4e8c3a4a6e404d9b7 Len = 57256 Msg = 13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb409299c2ffcfb62ac0d9eec1804eb733085dd050b77e27628160f9bd38233b970ac8391a4ce67db8769ef2bf6ed0492d098f9cc5cfd35162fe6e428cd2421a4904b0023590547ed5bcef912956a428803d68b69023b41bc6907ccadb2a652ba835333e3b5680822a9cb41527c0311cd5acce65db3b874b364073dad3c9f6345da537335423d4505f1dd5c4e335dfedd45faaf2cba0b5aa591539ba9c365bfe0f5ca52ba681b7b21b473ae7823c1662245de5a58ad9a700d817b7b25df9fe516763666c5cf7916e0623ccc52f5e3e446eae65c6406ec4155a4ed50a3e9b45f50dc1603e9c0ecb4dc9b871a81022bf5b595b149d14e773b088c37c0968a39ab1a87e7deb8e4ccb170c0f12d64d10026f8e6bd9722fcd1e9b0a7d92f80399644ee0a3a4ba5c3cfa94762e98980fb06d48b4e69b8cb9a82c9c8784001f36060a955f36bdf22b63c08bb01fe9367e8b69ad74d54434d9fe057ca8e1afc62a71f64bca42afdc264b86c662eaeff8c1285f68763fbbb2b7591102149b863507628f3bcccc64c0727bb20b33959026010fb53f612ce84e7c40b7f873ba6cb3f4613d2c0bdec3e63a7bae23cb2ab60765c9d5fbdea4b350503c62246f474b8a19f768e52f7fb495a4d4e0d6d3b048e416dd256494b004ff5ad47750ae480a009fab782fe1b81f16d80db2ebf3302e053bd30f412c57c3a4c3905f42d8c8915eae06d5d2c990ecb2ffae8b2cd2b150b2fd34f95c4da2d887b2f882c396ccc8ec6d8fe8968e0f04ae413fd25f193b963384874d7ba0972bf05095489a905e97f105ce1743d83d4d55c549f14d6fd6e8cff7547267cc41a527c5ee1a916d85e6b79e4bcba05123b0eeb4544fbe7d8b2ed07e24d0e87aa52c73388b5e6ed54a9d845e8f6d769fc815c035e6547aeb61507c437dcfc552cda91ed1f57efa72b3a4a17021638d6a346514718968486061361c6bead7c8fbc0056ebab3e0fde9cbe356fa8917ad5b70863290c4f3f18492c8f721f050b71e8626ac184dee3fe59742ea2550ef9e19836262b91f5d3e00fcef578b19a25b6228f61f164c0e870c21aaa718fd55274d75e0ec14230ef47ca79182d1ec357c70ad5c11d937aa9e067001d3fc18b0129f4fe717ca576fde9f9c97c11cf172e2ef1d3fc88c96294d7c8c31b7f8296825b618612d0344e6c312e2ea5c94b1bf548880898d55f2f35a167e209b35b9e5293bd83574e670dc6a7d81709b60b3859be3df21a85cd1708d7b4db8c6da4f8ee5d5974b359c65ba9c868213c6a97f2d7fa741ef61cabe08b05401df821074cd232d5e8bb74cabe621d8ecba24969e1dc87dafdb00c73e238948a37f15ffaf09a9eb34dd441fc8cac119c74dfe5097bf3e0c30cdcc7adb29e200397fc8ce88ab40b62229223d46cc44f21bb39cfef27aa9fdccad0e0c1c828123cec7e3a68719b0362f579acdad56710af1d646c938b5d0f78b630fa589962e5a673faeae35bcc114634ff4f883cf110a509d44d9f0da7ca376d7146babcdb34d0ecf710f19fc3bf8c6f978e5529fec9941f0dd55a25075a894f268890990d7a3ca5f73f0bc42e589613d6ebda12dca60cbb75b65d77f83b0ee9a52252c456105a4d7fd7aa4f488703b041da7f9e37306f6da043315cf6e608ab819689a561a1aa21f57d45b7cec555c34cecce128ae34ca4221e4e7a8fd6272350679dd29ca8bcf1fc9286940d9decdb7c953e164459250d5f9a3d272fa5eaef761807d2839ff30c09b9b54aa17b6957356658100fec78f7cd69660952bfb44e872a700b92e1fcfe81457a6206d83bc52bd2a4a62a27c8f20fee5187958e23eef8014f0467293b3807d84e60ca5ee4b3b45c9c3f3f95859a7bab982864bbba3f3d5efd436ce02e4711e499dd5859e4915376b751bca04f4fb523a2725cb2d7cdeb76135f107146ba13fcf52e3d63cbecadb37e643df2768020e8f8ebc9fe0d0976f929adfe8724ffa283e8d9e5f6fb3417956a0d1fe6abea636e140b5907da70644a98b6838c4986321bdd76eeae02e6259ef2b2ff075fdcd1157c37666ac0a1380ce90f4beb14ec37174b6bb3d363a15c32b0dc37cef2d61e81aa169e914ffa6692b32eb43e27a04618cb4ed221adc42fe32d0f76c815749035161f4e05e91a749e5f8b58fff240d392d596c5e341ed1532bfb3287d2826daa258c811531c5fe66276bba6aaf52c6417e2ca0bc2b07aa0a3e17db948bb6b525bea9774e36a593091711629c9a0e17c0a8b5f203a89fb66b95ab5c5c53fb09bb43403e5415384e79dd7516ec695fe800d27cc8fa52efdbbd553f1ca7d35a51b6dcda3eef75861800a21c3c24c44e2147250a8b6bd2fe024aa95c833cb2da755cb3fedee6fe98d7e48e903e0a52e1aadec9e6a41ccfd51458b789f9e599845df6ed3489035975756ec8588267bc226b0de59879d5f27af730a74ee668305ef2cbb504a40c2e25d8e679fc7202a9194d1ba2a97460e3f7951aa233b28e1e731a2531f798ca24b1ea94c80474a5c2cd365227a0fc844954d45dd0c1c51f0cc8be4a8994cd05e42091bfdef9f216af460ff89d057808cc979e43587f88e3a167c783e663ab85167ab7b1e263531e178cc1562b6152b515cada1262f561a286571b1870ed9b1161c843b0fdc8ff85a3a833b4fa3af153ccf4701318acb92362a0a4514eb903736d111d0557b25e13faa14c5a311bbdaa991e478ea02bf92fde4b4876a9504c71e35d2df817a8d890c47ff68ff9891e81224f49cb22fa878ea25ef1cea838dfd46bb45bd06633d5c3ab4a189c7a0e7ca1128f5d11c7a2cd0855e486a274fb2263ac1f8fd76bdabd75550b99c9db313fd30fe66baab6aa31649fe2ef3a34207fe84fa5b1534f25f86e6aca635e457bcfddc15d5cdc189a1d6c2a6214de11305d29fb4fa98d399cee76938d5da3df729587d2fb16f015fbf8e69b6bddd633b224f059245fcd52c80755785e6fe0d2a0f79be7c9822ed4542a9b9d063269c12e3b03112cbb5bc130acd2c044815c458d5edfabcd88dd7e2d1b53d63afbe1e32d0c2aca6fa67eaf5c43b713487b6061bf331dc31111463a0e33d6ee0f2084c336fe2f2cf6067f44d536ca1b7045344dc0dc1bda9d03b23180daeb8e8d899b86d179d9e1c8c5a6a722ebd47dc6c8203218c3a2967748678b0a785c5ebd1e6d5786e5ef8eedc93b01cbcc9ce452ea6c384d4e799fa9c6ae6f3575ef05a6c8445cdeab3ade6efc8679593fecf61b945f86e9e76a9e3b67ce0588396d2c506d66bd603182765244cf3853ae8a5b29af424574f53b3b331111768b2c9d7ac4f61ca395e08e01a18b5d6641803fbc84215d9c74e0b51d9baebdeac6b64998094cae360320282563b8792aab1dd3c135d4f8b4730fa0ed7a251b88c240372d2755649d345a168aa1b36bac1aed0e1143ae5bb5f8ecc452d95e7379063030e227fb8601b0f421d963647b151658b855b699cec68cdee8f5bf410de51af0fc5f10255b89fd5811baafb3f18d25c69834967c980fb64dd67d34b630f387e6634beabb2c5ea5ecaed48f88143bd19f7757ec3e02b9fea1549341a525cbd47c2d4ebea441a7301ac0d00acb2d48a14b1d65bfc954ecec432bdfecf635968919211193cae28d24490e55286484db1d3252071804d6cf099923083f91a57c2f24093c711457380be0610cf23b611dcebcdee5fed7cf8bdc0c03b7425ec0a44d07ab77606ae7cf6c49819d6f380c363b5288a6792a8947ed059593fc46cd376b29cf6869b4dc7ad0eb36afa844cc4ded5a19f391e54a2cc5ea9f45752f135c11f23fba93da7c63be2e48eaa345eb8a6a3e5a734ff15b62eb24ea74b503db3cc8cac213e7c510afbe7a7ef86a25af163c6410cfba340410e71c3ec9c5a86dfe17191f1c6b5bdf895837a17e05ca6119ea3606aedb978c5f423962ecac0811cc87471f7c2985331715cd79277a1e48bafd1a03b9b8023d7683e2208472090fcb9fbc8adb292c52817ca5ce98d307ae22fc7ace985b5e5d7e32813e392095ae25e7e128e3723685f01625687c186fd9796fbd30f2cc91359ed87d85b5bc933802e71cc03a0b8d148c69b60f794f3d12e6df4bf16f11850dfffc3ebd9d51eaf38928d61c88ff17477cffc18a378259a191d38cd9b834202dc8262cae9ce48428e33178027653be66e960aca25fb8aacea3d3e8af753d4cdc22deaf1f587f481e378a683bab1168b8fa12e01f99fa1ae14467c73d4d32f06335ad2fda79291e1faebc108fd041ff86d89fc6c98c4f90219b189149e91df40a281a14a5a8ebee71704ed7c58de96a18aa8fc567e1bff5d8d16dae9cf1053f1923aec6498dcca05da4c824a7891391b6996844c340522f4c0def86fe0cf3bbd850efad8ecfd41d2b73b361fb6dc65ca8cdb4ada34f1127c578248137e2ee4f8fd567313b160b4b230495f58ae00bb3356dfa67d0b903c58d3a96080e1cfee385da9ebb1a0c7a138d80f9481c8be97ea7a1c3da122430f2eb7acd814c622b6003881bb1f157285db00e64c2791668a54493966e3039a19426605056b95b7eac5106667d899f1d12d5d760cb682890105568fb8bf49f5d948716a7ed1db0feb0b77d0785aa8d6218440274cbb2696aa8214b7a9924fe6cdb56c15ab04009b4547d1586331bc8fe5945b8292a1f83fd53f2629c008900d750db8cf105ea0ca681eaf56ceea6f9f9bc20210550771b51fa0ed5e828eb4ba5da5d9df556e264de1d4746411d11c85c281c6492a582dc6f86becde77a1287de63261cee0af1b76411dc2f8b2a25dc2e8782aa5892086b5edd4a721f5cc55d8bd27c326289dfae3e46f1d9d47caade77c09a1ade7dd07326e9faeb1a37ce74b30fa807db3b74f076a3ce6ca37b68753fbbacddaccfa39ad09016616074f3765e01f1c2e0887726140fbb0f818f274a8f60001a4af1498863bce5fb7779fd089492a18bfad8b2f71e74ffeaf520ae056e97defa41498ae6e754b0e2e9b0b3d45ea9ff8caf93eb0c9eb9e3268796c64de5488da517412e5c6540bf3d3e7fdf82c32e52ea8a21eb0c9bc6afebbf5937cafb5b56425740fc91e3685a35fc5047bacc0ae3d010ea7aa01e83ab6026d1c925b8b881f986adbd2e6cb4c9f2ad8ab4238023fa64cb575f702ed81eae43674306244756f42ef239da050c539bd895ef65e762dece42ce6423d3ad52fc9e816f1448f11c58d676383eb858425806d9bd2909afd937fdb84f6115ea8d73c08913f82b9c1d5007a182028c80dc53bebee917eff331c7857ee9d4fd77183b30e5f85ad5319f0148dbdecd8a6c6ab188ac39d6a0142fa56186fa22923c3b7b76ffe6e04f99eb96218c1647b804339dec0b770f24fc1bfa193a4af3dd213d5c1b3da535a0ba49351a1cf0192031813d7343696984913ded3601a0f0e40f6805a609fcffd07e0007bcf435ebcad99ab9a4bcd88dc7bddca73f42c6c0b1ec029e9fcab4e7e8cc5a338e7aad64bce5c73a08de8b22f567424fbc67820c4ca254518fe79594ef8b9de119171f2d003e50e825124cd11777b50e35d79d7cbb17a644fdca67afeda5123be33354ee9eca7dea86bee14233d47e0c33fadfb70835409f71daf2dfeb0101667637154e9c739669b04c131c5468e5703d380f663be2698b737ffecdef87b28d5a8928f50420e28c2d22aa077f1a3163dcf9f7305a086a308c215220041f6cd61593558cdeb9aa7c83aa6eadbed2ac0c97a55dbe6f8e8bb54328b7812fb1796931bc66bb302536603d4a27b318789c94f6a40ab7815c144221fdf5987a251f6f366b2129044ece61e06c9cc496f54a22815ec6c4995a4d01ad06d40cec63a710aa0a507f611bbaa7f67796863e2ffedfc13c588dbe707e186fac1c868d5459731700b9645074415907d3dda11a0f00f23da48ab9f886eeafef5794ad66de7cc104b52581d741ad9f99e739be327d97847dff22f14f84e6efb670052a7eea5a21fa915b7e016a44a2361d72858c620cbd0ab6e9dccc52aeff4b5d37a4de6139bc80fc2502d3d84f8a65dc4f9d32a4a7c46b2fa72376d88e083688f2c48c2962ba1e5e49b55771157faf8d99af2c2db0c228d4246d56ffce320057fe32922c1d425c1f9040941ee0a89a96186280e36fdeca0c276372adb5a430342295f850b17cc3a7c24b92c8f62db060945f38b02c41d83e7aadd4cb8c874e862795c47f6891da5ea77d5a55a0377953d54d5c7b2e12dad4e3f284429b02e2b5d6db00a088a929ad067ff3af26ee7cd7a2d5f22cbe7a59352bda88f82a3e7529f50fb39b5aeb39faa9f865bcd0794155c59f04aa24a1dcc91a0fead781638e494cd9e658268091ae5691b966e6005033045299dfa8aeebf87736b2c6e898b67fa5dfa0be3490ba32d6f2f693afad32db2896bab292ca0e2a0cfae6aca6057433c6cce9b7cb423aedf1c2242d74a66eb3f9156e0b291ccec79f00907304d350cb7846c92b34be9b466eaa4c1b7d138c253e74bdd2b6cdb237f9f3b7024a2ad2b083f54900b82d64a717517445121d1498c15eafef810443e2e2796441c031834aaf83701f9db71e77b260a7937bec8f7448794d4bd2ea0731213a9e18ad11ea01c49547702b83501d087eeaedffa785209c6d9eccf1a7888a80e06d6f5bf1903e89d6d4dbacba8203e154473be8767c0685e3aa5b25624e56c510d92e10fafb67c7eb214966833d900589c5657c82fe8dca837ae1b843dffeb974eb3d1554b5e6467f36a0a207072c3bc66c5304f3921d35f41544f073c5e824b4aa84b2264621ce3819caa86d6b3f4cb345eec7f1c11e8cdf836e161a887ece781fec2e98348227bed4adc0deee3101f7571c0fa311f898ebcd45715fae277e67505bd3d4096f18ba6f3332821a6b203babc622310c1421c1fab34b6bc14afe2947bae7ff4c526bd4f04345807653712647d549c43ad8ef08129fea66495114670cf2b3448692e6b361c443018a52be61352fcc8422adc9691ef09777cca389c9a5e97fc93e975200c9a0722cdfd1cd937dbef3984cfc788c25909ac6d4a824f61c8993b6fcc9766231be1b2afc36676525680628402bc5182f663b7ce8c8af9779b9363449901c82a006852269ea547f37174c5e87a475b6455ac2c1916bf053c260b16bab540a071e60fa3daf565c88bab20e60a8cd530d6d5476bc55f9b1d301684c82ac7d099ab4b4c0a355e14729b72194562b1026c6b13ca196bfdab8be3db84fa1d473e1e368ea207be3f2dc09354c266999d4b58819fa89765476cdbd7f3802f2aa9e5a8944ea62ede2f3e4d13c1b0cc07880c9fcac7776859e36ba78ced0ad9ab6673c35509cce23d94b2828d5768d85537e2ac97299b2eb24804696326897c480344e8e93e9ac4250626db70645f3ddaf35a098734984cf6ebd38c0b3e80996916e593d15b74375cfa07e25d97084f2160df311b87033590556599d5a384b38707e25e9def0dce2df6d221b56df89ec0f6eeadb48f408b370b171d62e41a5d3a5ca7a3bf77abfb107312041847a49f323c04f9f2bbf4b023738481237e95f8fb9bc20db673f340bd054413e6b2a0e2dd86be8046ab74471e352a5fa7e19c09333bbde7036258318c13e4dbb13d51ec5b9d77eb30cc63a25fb6651350aba11089b2e7ea26c16f3ff62570c5f8564c2e14b6dd85319d3774907de156ce4b29b157a7fc61b12f9cde93b0845d3c8c042aa1893c08d9ac541038f21b74712eba3e356157f8030b55afdd5b7c2bee4cfe647a7b2fc099686e17b1c97ff6d9e4b749aba58717ccc34df64b7ce49c9e27bf6e08033556e15fd9fdb35a8b7878fbc55612bb063b5f05da74569b3a39cc9abb99f2c7c93651f12c24863bca53cee258d6033851ed3a318f9c974d098dea14778aa32f77e95bdad94ec2d3b9335c26d65c0593f6b7fee4d1c175f8bef3772367b291a0bdda7f6b65bef1b8d471a137e25a925461061d7e45959b24e725145620a456d1f7a42d3156079b51a8992ea3f15422003d52069c6f8b4f680e7d121b26d25b19d1b0f5ab3ebb0844b23454e987cb4d1dc8464a9d94152b28817620f0eebf371ec89b5957643bf0f86dbdc4771a426c13ae3d7a1067b5b6ed0caaa165eced432748cdd8c47b2ccde347bffddb2d3c17686bc1f5836f0f7b2bfc7513e8a5cf27e9deb2f460f7e007abec955194452ad7a26d5e4d64fe64c07bdd8008f7bde75dccf7052cbb4f0826a8a8e87020d69115584f6cf243aa685f432c35f12179b85d572e1ef2320507b3602913ca0f65f158d06e98749e078c802865115ce47dd48f0ee07ad5739e612678d9c1dfce77ee3ac1675b54d28a33db7224acbcbf4eae9b5abaa356de9f970849275d21dc90ca03a1b610139f9710e9e6c762812040c8eac12922e7016d3bc157be5020c825277bd7d7612143d28603ccd9dd5aa6188605e89864165aaba1fa3afb455cffc988ebfa37c91e6db115e1bae86799bf1a98652795016568cf7c1b596aa75701d260dc7f73b25b7bb742dc275fabdee9eb628104bb6544aa4d2c9d3988f07f6cf431d5ee07a7790c599f8b98cc149aa4ef670216581a44ada925f851d2ab66af938e60ac6032f78e1c7e58959a3c4d7ebb2840c3179ad5d1681ad548d4427d3834e8f56119cf478f7481cb94668d67e5c338c591565188b40e5d8c750a5053954ca40c72a0e6e97ef62c6d1b9d728a689beb1917b0e8cdc40070b67ce15f6a556f723e7772046ddb15e0b591cb962575a9e1a3bca3db259fe2f6cba705ca21d701c5d3d619c2452258412dad6d62c99b719f1df6ab8320963a5234a9c41b3ac8a8019515148afff341b04dc4ff62c7588795b05c347b3f555b0599fbb8ece578d6c7dacadee90ebc46d08e5efe10df2b50482363db4dd23bd99363f36099d285f28b1d5de546f1ebec0477f1e5e751926038ef940c6599d84a9e1b4737bc826e9fcde544d43f2a10b5de93144370df1c4bda7d73444cf6b90258386dcabf75913302cb26182c47b918c1583c9327c82757cf35781f7e693cb58433bd863d1cac60bc27681db8bb43a94f3fe15186ad422869d018fa7471f1c894a5dce69fe80e8d6c9281714f055edbfac2990b081f0b425cb5dc61b9a166affbf742886278362da68518af69a659253688da3c466dd119ea6f48f1d86819f03cb064d82f4dc1d5cc878424932ec10994eb0b41ac4a3233c554d5073b367a2dd969da5250c9200a71025a7d55ff351d9871c2d7c414bd04600f072e6cad05bd547c0983718adf20269e02161ca803c5b3a5974b085db0203d1665e MD = a14ab54acad289474c703cd30f01ab844b8955e1e4a8764884b994c18c3f4812c0cfc6a2b762bd77b4e44f940ff4b245 Len = 58048 Msg = 693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe2636 MD = 511ee3ba7cca58960e5e3865e895995f988981d8cdf2a0fab5acbfbbaa0b2b5d92b3fd5c920f2529a5739fe85a8d94bc Len = 58840 Msg = b3701aacb50f918b8a79d8681f79dc8b6abbef0cf3386ee993f5a1567bede254794b028577dde83f45c67bdf9873c36052d04a2c03bbc931b0b90038d4e7e672a534025498ce19a527da09d6d268f59164a6a294775321c03a77af6d7252d901bf92e4c121c96be7ba1d4af4d642bb4728a5bfef56eac0beb999749e5e14042850cd6e7319b5282a86f806e2abe75daa273569e3a967ec52b38618739e17af10df4d6913887c969912d10447594123e1e8bf671877b2eea4b2a663933c4122e1f4799c487705fd59e6110dcce9365415f3a98238c8b30edd3d611ca73f7ca4c217bbd1bbec38a7958a21e91962b03a6dd15d82e8a5529325dd1f0d56b0af7edbd17ace14f2fddb73876760d5cc961b1209412fd21477c7a31848fc4996c2f955a91f5cfa8e3ce01b634d39a82fd0402b23bf509e200af0807944b228f99c5b5828104315caddffb6a93a3e3c9445f1e1a83eaff4cef357e3857bf79ae227ec0bd4b64b0eadc8806cde96353602df765c1f26127a281a44f5c6569247574af69738793c8d3fe6ab648cc8e741828516c310de42db3567fedec33b4dd863edbf24d9c2dd39891dc7c73a3a1c031b1f1a3e03d007bdfdc3cfc50493eef50bf890d941f7f7bb92561ebc71539c24d596caf7816328c98914fdd212c73e455954b1def78252ba637af66cb87b2e4db8d06e1311ff6fa6e044d12f743d057154e76a5c83c9b6df026f98ff971a9c26cdb64ebd3c0ca2fc0a399301b25f0b20049a037b6e36ebd2791f4c9c9698ac561b30b21b89f28a7510dd8b73559417fb7256c3623e2fb83ad0705a6b3e5e2786aa27e155801aefb7f91601aae443f3aaa501f43a7e1ee7c00d4c099516d2d45d83812494a9ea996acdce3cd1e7d665d4a584dc2ab36a3e0b3a9aa242a75d7d84ad28c3008dcb4f3795ec850ee6b436217bc8c35b677b86c45e426d997768e8a2300206c0b326dbc6585824896a452e3b2eb4f3f421b98692822bb2c31059de6015f934fda36103be1efa616cfaf114c7c62fb31e6a8c081ead3fb9e8fa99276663f497dee6e690c7efba83dc1f20b2704c234a01c95cd20fe765c92ebb918b5b22da758c031b498bd480d403603acedbc77701c4c691ae0e38852cc0dda8d2e75b95172e826af8afd4349a0945a731b33f132090e99362c3a98828c4e845c3b3150cc5edec3a63def8be1e1656cfa39ebddfef8cbbcab6d54154066362d228675827c7f1c8f253be4706a8501c1beb4447c3b5e1c39f74ed09d20ec4d5b6c7ab2cce64619efc90f7c9f480e21ef1d34fe8a7bcb6897862b207ea8710c85968259ae9e565f7bfe2328671edf2e4ba2164a5734a3496be4acd4585bb6ec423d580a960922759a31117876338a9f7df9e2d880fa88271daf2e5cb89f007507cd562621bb3cc4f10e44dd3b4aa2edec6125298631ecaa23222a39fe06f02f4cc2f74cb03907f5e6e257d724a89aa21d9457bdd57f331b230a4afcb708088387bac5deffe716610259a4e6d0f1d44497ffe4f60d471e1283b3fb057236ac1a5f114c5d3f59da9ec9d0c69cbe9b025dd1f077628c0de028cbaba4e49df77d4c2962f5681d15d717a3f427594c28874652326993d0583bb6717de32ab8eedea17d3c4b60078f9e64371061bd081ee5a6af22460a889a83540b973048417152a2d0e9d8d58d4b92fce9c1e03880e2aff73f4c872703695989f08416bdd6237bd8bb0808492cce475a32953d4c451848a0891dc789df2910b0c6c0f10bd579bcaba223642b447c4df4b7e6d368a324423b131261938a7e5b6104da69b2cde887a40cb8770c92f9f964d0534d3e499b1f4f73c70fe483cdac23213cfb333df48f5a7123ab6d66bbec131257050d96e1422611a80ced599b657fb265000d8422162766119bbe5e369898045e8587199b5d878331e32e8a6c19cf2eff12c25ef5ce9361fea28fd7fe816c1cf6591b502dc3cc2f014d2874b45ba9fd47cdc22ce40b46eb376a42727828f7c2aafa3ac91d176c9b72955bd7088d98a3eb7bad6c817e8a68785d86ac3801c3abe8e375f2fdbaf15f124648ffdd31f3c966c6e49c327b06702df6cce3b2ae781f3caf5d4c2440f2c07cea607da6eb73c4261a083a8ba32378c4b075b77c815dc312a84153352bd985fefc42cefa1c712ac5ff78d601696a18d92511a5fa2d1d0e0778d2a6b4ee2e1634f650624b478473a2d1b6ed283052a6d7cf412dc0041e76879b7195180a58d7ab5329e62eef1625695b52ee54ba75c95d1954bd4298da831f8abeccc2f2f260bead2fb8f995beb675d6dd683b5a3be6b59dfce3166de9ba3bc10abc6a4a73480b7ee2595fbdd6ad54eea6c930821d858dc77a2d9ff5c49278c8f5c2628363d40e22e255a5ca0680730d5fbfc8d4b33c52108cfb63c2e392332d009d40104cbb3333902c806cb6d67cbd588a88c475618f1385eae647df301747ab9b77738654174b8c4c64087ff5ce6931d7e4c3dc9bb14af56abc17000271b3575b9d4fb94526b52743b51fca84e4bb6c166175615145216bf949930e7ffefab44c15e74de4ee1b019118251efa5c0e77d4833b9c18d7315a25135e430efb7812eb85fccce9d9f7abb2f1baf5cca0ece580ce990558c3e5306c9ddb564613d623b841d2ae9a76a57627d643d7823fd125a9b81005a7b7c79f3e6d9cb0abc47f4740ee1b7b9d50def17e3a424ca19545c8bdb433357c1f52e718f704daa689edfe03ef29ac58d4eebe149258bdb15dd53f4b57751d4c6711b89aceb63cdcd0acc87fd9afc9538f7f3c9972d9b317d5ea09c11648159f2b8e842269237fa53526372311f05b23fceaed6b5057b56baa0ea8bd853ec6fad913ca5e3adeeb962404ba8c3cadca3089cc5108bf555d2356bdacaf08cba9d5fc6bfb8cc84b392629a2d319ce3aaf0fd28df7f02444e2b558618604357126c701d1a85c95fac0ebb29b016a2b29622853ca52c003c90eb81bb4b55b8fc1c63485ff514c38501b4d5b57d5ebf7ec9c0079ebf1e6e23439923d01bb236c2020a4f54f76ba03fdb0c18063b11da916b52ed17d45d35428ebea28e327ea7f3e9e9eec3c9944ad5629fede39338db31a3609e6f8cf23be19ae166bd35c1f2d5fb898b751397a78fbdf4ba152ddaa9a79973826e91e46a488f8ad725cf83ffb1607190337c7aa1b41594e865b0ff2e3b761201dc883ba9be94425d8da6cdb6ce402963c3ac471f8e9105e098c5af513462c683801c00df8cd18f60bf62a6ff76c23a6eed4c0608635ad1097913f3fadc84167023f33af6fb6ffc4881ac17c2ef0e2b177b04bd467c977fcacf43d21179058a308db5f1d551960e7d9c2c27e7824d84c8337b76c02171988d61fc557f540caa2b860b2d64d66d4f67d889de5677a7cee8df5a385e9a10a3b9f8e7832ab5c2ffcad69df78bd41d466efc6b44f716438fdf45480c082e9b28b65cab64fbe34f10734412563291cd7bfbd27c62b2a64a52142eeef8a6263ab0eb55f100da28da658f9a12534156a6777420613f7071e39cf161f30720ca17c2c2ab6160b0ca8b87879e47f5a06bd0c143afc5e317bd37f7dda8013e5e6257e6a225a28b63128bfdc1195644381872e1ce474e5791d36eea40c9bda7493625a4f38d5d89dd48024fa7d2ea48efa5b5607fafa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086b MD = be458f1d393877c0c12100466a1215955faf462b0de86618d8417af9a278316f9bdf2ebd1ea1d1169232f43d67d36942 Len = 59632 Msg = dfbbe12e39b516635f3500a9bdc68b8ebc0080059209fc0a5e5c218474c90b6ff5bd063aa4c4fe6ef44c379166ac3e4a11651fc682a7d859c7170e69c7cfff88d5a6b8e084b287d4bc0cb4e40dd36cd14474fe023c284a27f7be751ced9ae210a4fe5ee681889bdbdefce06a5d44fe6d7bb58684689439ba16d9c0668f329e508d4b6215444d21cd83a523eafb06dd63deb11f13adf48f5c4bf0560f55a01990b6172b35750901f0d28de62e9221effe97ef3276b34f3352be8c9fdfe6eb3d1847e9210ebcc5238df43e8ffcc89e1e85cbf7257623ad0de79834039eeb1bf02f694aac67bf886feb1040881d4584513fa55262dba51605620171ea130b391c1e43c1340a295acd544f193759b2db70754a874f6de093030a20cabc07ef4ca82effd621bda043250ed9530677b7ac6270e51e56f37d2bef291ec7e1423f5c7ca4c211db49cc4c5f62d5755c41fbfe11759ca0de3723e7b10522f0c28ca27280cbb7fbca76577c63986b08a07d27d964cf97944eff7bcd31e655cec5adc0949cea031b570be6dc19f8c5933cf4e24543c4ff8210142de85816dfe8536c42cdb848d1f9e8d2247269ca089e976ed54b969efcf28b3ee03d0cdce7c6d592d022bc2e471ee791b6483c555fb219b3a8f245a3b56d27443cd6367f95f1b1e7119d90e48d11ba11476678e2f0562a8a0243391c537a4cf0ebbabf4812f05133ae451cb2cc5acb1a7dd207b9e31232bc8b445850fda2620892f18d7f864b1b3e4e2249e02c8280740096cf22616e9912ecff8b89dc6cd155dc848a6c198b79d09a3dfdb5d41043e679baba6592f3c751cd7cbb0d1860029f6e7a9c56f137d2b03a9d217aed8c7b399044afc99d282544d5c2ce26d8065baef3dbad8739d78da7d54a9e789e7f8f35ec3e9597aa9519b2add9ae1944e7454911afa44517f4147d134d5af41070e9a236af5618e3c30c62fdc94131868a293a70ff69d9b315cefa9ead3f396ae7f04815a0d9916e39671d6c9a71b5c3776d47b9d2e48b36c223e51b72348ed56c0cef3218064d737f90aba25524ec26377b399431fda2c8837b0835a5203a7988a55e341fc5931b1ef1d44802441fd451b9d7a8239c6890e13e29924ded867dc2235ec4bdfeaa8d9df06006a7b897f84d91eb9eb0a923b763d411da7282ba0aa3efb78afb99dbf284f716834e6899b8b46a3b1de00c1c6492a688b61cc71e47b26f312de07e6e725c6dbf68fe3c703c0dab91cebcad9bc0f41a56ce54a4f95d770c93567596ab34acba235cc01c63ade0beb3594b74e7f3139942c9210195737a2ea7acc1c7d961fc450a089bf0b933b60a6965964a4a24778c154f8cc638b2443e33d8ccfa4220d5783c1397a0bbf515f77d9aa3150a7ca659970a9cdb2b425ca200819e182c9abdba8026bc14b11c88edb5a27cbf70222a6a909f5928b64a4ac4d6504007e0f73e74a0e91335e3cf9454db22292ec43e8b25c8b9cb9620f2970b7dedb9b1a65ee00c6203a3e99837c394b5c5b04c4efa4ff407fefb0bb364cadebcff11fcc5f72aeb8f1d7419197c9c150c301bff557c003e1416f070b5c56ba75c2e50d287eba479efde8faeafc5a740a70e723123ec256ab8aab2ae6f4002cd26247f1a3262d61e49effb8ea03a6d7b5005bbc9fe7347e2bb624aab29fa18b8df86a6bc0f83494366f7c0a33405752fcdbd00af2f39ed0de5e5bf512b1e34cf52ffcb9f6677844e0f9fe7d3b54b47c5e7e048cbfe659f53fddc1987bcd2df7c4635f8ad7f660fa90a8f770869376ca366139c05b21fe61ccdee6134253ea02782d034cda17773ba1f6e78299aee6b3312000345959148d01bc49e42af8cff36cf7988e716d237eb18e5f31e8e9bccdcb34f8573ede04fd7b005d8989fe18412f5d8fae424a0e3a3bc9beecf8d64180510a82a770337839a545a171e4068b823bc9495aa14090049d2397424e171d618f2b1fb391fbc6b7fce6b64bcd94622d1ec555e222e34154723668a05d1eb8e7c2115ffa189978fefe8dfc65ab1a64b854cc55f34b94aaa0477cb3a5aa4fac999657a3e9888f17753685f46e011aeb9a5a58a9fc9ff7247e8950f8b0ba3c50dd78689c10465f2ac111792eb364186f69bbf4c26c746d5755b47db86001675e59e4be98fcf69c1b593bd21bd4589578acd62b4fd18d79abbc553d731214531d6567d42b0dfd9871a3f22b3c4f33149fba556692ba2faeaa28e82aa965777226a67e43e2d1e006b647f0df109298083d3896214b84ff6edb11e9cfdbd88f570283948830d7225961aba488293d0bf2e99e3505dad0515ca70de6977ac9d0842983471b958c58f2fc45799106ace3771d61ae6eb11ae9daa6734b1c16d7ff6c043c1278917fe875feac0c940970d2d751196ed67ec31d7b41f893b8208140714b046319b5105554e155ca0bc2173ec61d2bf2c7846760b111f46d06383468563672d58960ec24123cc93e52c10eabb5ea2fd6dc7286581e8efd1380ce8fcb6d8f1dc6422561d930798cd62376d59e19407b876fc99e6806218943b243f1ee498d5bd1de832fe92210072dd863fa7a72a8b5810bea2e151a721f5a0548e9355ce9b364a90a94d879a8cea1fc18ebe5549b64503b54a3e3dde925e3143df4551a0ccb1b5c2c4f2ba99c49ef08f628533180fe7178a99e58a30f436b499391b2236ef9524258ad5734731f41798c4e488c01ea714e597be80c4cde5f200a5fd0fb98c4a606103defacb5a555e85bbc39e686bebc16d4db269c3a8d3b31e29d35f512c38311f37f6964ec72a8bfe500abb397f1ce7cbc2a78b540a68bf9bd0855b2556c75e072f0391f801d967aa8aa1285be1a34ea7fe8630a07d0cdd209ffc4b5e925fb1c0f2ee31f08fccba3271712df519e6bea70a389ece8827d755a01e77236868f0f388a0bf5ff9694c3d0d60112fb04fff76eda41d07b42173e1dad4269d614ae447fa00826cc81ae47467571e322d45d8baafb1f77387627a6d5507a1f4046d55654ff5c44083464c7f863f9a26182f131c594972398b52b3a01a9d314fd9390bf48f69cb02b2544a0572fece33fa777643f253d8824859e82330801cd66917cd9dc243e1dbdeaea7ae347e027f5984cad882b66f7545e0df9d9f96aab33b6d6408f16b4cf38ebb2a24d3a57e35c0bed682125c803b0a4d61b770c9250bd8a499dc24c854714ae39d0c575d897bb48d64eaa82c52fb1f0a3619aaffd309c62532c16144437e9a8ec611c98d6c79bf593ab74f0e2fde0d7d266a5522fed28f57f761b2c65f4107246fd9301d7059688a21920cea5d0c5b10f9527a19ec91baa1b2611e37f2e3180d5e0c94f4da403788e123e9a825ac912a767b1fcce56cd06d296cad7d428b56b25c53fdfcf558b5bc4211ed31cfe63732678a4f23338b582225286881986247793056741c08c9698c0c05206ba3e4d692922a0f061d17da276e3d562b3b9075cba4bc003c5abbdc6106a68b3fe9cbf5b1bf01695dea38dfe6cc548064753c68117e2daa44345594a4fa9d3595e8c61df7b8b76410e315eec60715ec128c8ea6b18753791ddebf1bbbae912756e9fad5cc44f5080750d78f2fe627a41ec9afb91587d375ada022f910ea2b67683492a5982a635e2b79a54a893333b07174c729a34658a6ddc2a6b4097813ffb511b415c333a86d62a5a8a83db4e016f2d5fd7cc58b8815968b72d6101ff0f624c889aeb5276c3e951d0830b132d7e088337a3ce21f0bc9be45afe78ca66a559ca038f7d7ce59d7ad2aec6b4e74bf161dd866f061cb8aca3e36846de5d62a2307e2e9798fef154290127cdf7c4441be980ae821ac55ad21ffa61af28277d8684cd7c6ba46544887281de216a46805e2e01228562a851bd5e8df98fdcd511c2d53c4f44465c39bac5b9543982ca9b289df384f1743257deee02827172d2b9c7904f49e9f5205b5bb13c0caeb7ecff0bc7cc385ed5ffb7a75d1c8efc60ace035447aeea5177e240bb37e89c9900a269829ffdf15ee6d1bb71a2081795cd03f7c6043900e43b21e1b5af53e42a1ceac2e3302cbcf4406de7ea3b30c809dc9020d823de09e0058c42b06349c824396ea6e718990d37d697a7e8848829aca03d28918ce52dcb3fe90bb43b147011bef7bb973d8c0dae0e19a3746557630581d4b4fa2796932f5001e4ca1ffb0578154da9fa884ce4e151ba8295c6e79d9ce81b6f19dd386493a09c73f8f745afe2a5381918e123b9580841ed548f7e00fa3bdcfef89415c78097826348ab3b95d6d680b3fa3157b49c99778bb7a865b4a6e3dd0c9f3573e57d9d7a5ac22325e0dc10ec1ea75e31ff346e2405c9f9e4e02849e73f14a99be6121a4d006d474bb77cbb45032752f9bfa8ed10028f6a42ac09d4c13f61d6d5f1c776c3ff5100f4433f3f530983f3f71f8180022b13e4c941d0eb35b58ea6692e2519a4fc763469acac05ded9c22b7345468ec3285c4dbfc705f80949a1009ec6b36bb8a2e5ccf3194c73ae1aece1b4597f7f1ca0728f6d65316206a2a4cbbde1f9d5c796a5b1d8b2a5f28a750afd0384b4bad23b5e901b44db91f4699ef10ea680bd9883bec960a141eb3c922366a8ed6ea9b0a2273a118c8bed9b459859d93ecf8cf40f39fed50ba8c48a183f06ebbe34b37d7dd5739664c9dec2df99eb66d16faba3e21d377d1b60e73db066c4131c8f4000737125f3f41ecc33dea98ffc86e6806da5725ca2f6f3ba1d01a1886a3106b8022d01377165111fb4ebd02de585be751a0040548ac7e9a7f1b4f73a362521844b53909156df2b3f0eae17ad67f77ef1719a90097db4c814837071c3c020680aa38c231bea89f29409ce85f7cb04af5c3b1c6962c5e51a6b99de1609504964b3d280c4bd778cf0876cf423f459d3d81d402dd447a9836613fca5eef52ec89ce79fd87a5f4310ad7e01c7f88a588d819e4876d8a070b63574746e016fa1c6980fd43c4ee9973cb0e28ef00ca2125933461b9f7d5563a50ef6c8e15860f26be19137534643bb38811cdc166725cd60747d804fcb4fca797901c2a5faae6adefed791c66d55f72da892b3e212f9d2c9cfab412ecb74ed59fefd2863ef434f487747a93cc8089343adaedafc140869bdc93824e584ad136e2652c3c24005e9d0d54b495e6142d6a119d71b0b7538d964ec8df21cfee385e078685b6bf4de829f9f4a37d43fec0a7074743cb73d736ce5bf10727a42fc8cd67da8b80513b560dc5dac3c456aef75d744ef06aa75a06869ca2a6ea857e26e78bb78a139a671ccb098d8205aeb315fff13af418925a716179643ac4e457b73efbc41dfafb3fc0e43d638abbac99c120f681cb5ff5370be18aac4f61315b1e563086c3b0e453d6ebca233a50d0c17d530cc9e29b209e2a8938e13129fce6a0afb255f7aff611c34438131d5fdbd89ef8ac69d674a4ee71bb1cb9ac89b78902ce09d8467291181a702fd9a0430e2dca944de8135702b66619ae8c0e2af1c0a913af842c9355c54101e9dd7fa4e86f74b879cb25ccca648c0756dec2682c1c08130bc0067ca4b7db7c2e94e7f00aec21d7a8999a405ca73816ae3885ebd6f9a46ea73280a91e4e5e4146a685bee642566462c9cd4c39cd0eba3d1fb50072e802791a4217a313172df3ca78d55bfaf0870120d24b6b026474845bfadc509075a6b4dd8537f533a0def632926371b98538107b59a10726fc1de7b3506846b01105b459626e19f069f5eb17699c7ac25eee24dab64abb17f24f76bbc6e57d4258a3fa2660267bc9d0e724d1850ce1760c1db0b77ec4f165f5ad93ddb4d04ec7ab15f8bd04fdb530744746097b1130751b5b369a298c3481649cc1a1b0b545c086b02295d75030b4c27ab1179266022ffb0b490b3d2d1f0acdb1a2a03100fccd7a171a494dca78d75a1618948167b10729b24a832013fb62af609941bc4fde3f03cf523feec91818a99dcef8be92d7ab25f4cd8a88cd6419784e381eb90e54a5a22d4ce210e888d91f6666ccb063e08c8e274499cdd5e3afb6cee18fcda91a91d3d56ce87a8535c94a245288fd77661bb0ee423965b9f485e967382d50bc7a74273c54bb824bb949a84c14a5fc39d2e93cae38d1e6e6114c9eab9e6fe8c50eccfae676c3be888deac8424fbc3327a1658fdbaafbd7e6b4643500a6d00c4f421cfd5865a975e82e1d18ab462448cd6c21391b2b2faf38685d5b0ac3e621a7aee47d0683d57ec7046117ebba8693a79d9cc6d11be5e367a7986f2e883acf8acfa4187553c00fc1cb474487ff4bba22b0489791ffa70ad0fcb5efe066167c550eec4e2977f1cf54cd403d1496fc12db4eb549d268fb8c10c2365bc4e021ae82f71d9c9752f323fc94ec5ff60400343db3534c16ca5beda3b28a415088e4dcb112c87243674cb425bc9c3bb0e91094d698b32cd3a620b61628322ef7b2c88d5bec6d6db23756e65c9ed03ee99875cb1279454a9d8f126bc4adce734f005546efde8ced6845ba313dd638f7e4a4c83d9daf9a43e8e789755bbd9fccaaf4138fe973a78fda14df3b15dd36f556908062b4d612a72a420e7937d25689b0007bded5563db39c174e4a812e4a9593ee26e114775ed2e61109ddd5766338d2b7f69a4fd0cff702df80060c43f4774100341f28fddf55b0f71419d1245668a77d3c78957dced8b2e00cf413b8c508d29930a36ee404adff46a5b3a766908792e285c052d7cac730ab4d8b43e72cd8bcfb94e442c46f5a45824741c4b7b214196a9b2814593440e093da31f9799c5584b9d97861198fd9085c613ab5922baccf77b506368cabe4675c3b8eb0caa40dbe5686c6364de6a8dc279c14f6807d9019bc9be145ec92102946da081664d47fce4425643efbf4482566505703fd189c8c9b985fdef37752ab064e2476c29e0a39252dc8e78e494568ab16776a729cf09c8732c85e3bdc3a50fd006a7e8e716b835c186adc8f562f3a6866fc968b7b5ace1203b130102125df9d89408a02eee2316b6dc06a799b440f20ba6d14a22429a5ce83a1112af6a39b8a415d25ea772cc7d5a6702dd789425b56993f615137eb981f2b2e6de6bd321935d116ce8faa99cb1d5ae09313b098a39c7bfa1903172f297672bfa2ddf56fdd12b0e4006ce9b79fc4e39846c8a1b57c44eb0388425252ee86e2bb5c7b2fab5bb3596b582cb514ca4ed91d9560cd3749f25f025b9969f53ba303c7f748dc83299a43033239ad2fef2dc3d72b76a38ca127607cef72de94a56d5e5c0fb18c65ab39f6522b0e326752e40c5b5574c533f64667b9d06920afc0484afe025fafe16504fbbebf24d569ba044b20cfe582abcdf1fd6f8ad6c0a500c652047badc784fb9dcbcf4b1816957900d8bde7339c82ac9c99f49b563f22db5a1c25d82653beb376df0a6b427679045c6d8937f95326f6b8b5ff7e720c97d48601d8b443e4fd4102ade69c5e6593008952293ea1572750d8e9d6a094b97270dc9b737ca0ebcf08c3c0ea6aa66461e21a2ef457c608e22f7fae10ae38c65134c051acbda7e8a29f5cb08c32c503642d816ca13fc1f916070f6b43f3f893a294d3bcead3d36c26591fe552a134c31847419386434f98016c1aa9c71e3ed1e5157945947bbdd6c8eaafe7c41270140cc3fd2c3a1ea97652c333f2308985e1973b43845ff1b1b8e8b86f3057230186a027f6af230e7a047890cddd16c26843477aa4e1a3f279a32446d047924f538b80e7d094d7af3bd2f1794ab2d055509764582ff5e6ea5ff5fa1a9595ebe3f0a30d881d55de7d59624bd15d2bf3ced92e8c584729bf35ef51e8a811b3faad636dd49d3f9a9e057d22e63d57a0f77b5ca90e0f7d058381a2276e73c72a14f8263c447ba9bbacb3f1955f11dc9a61f7656787c25401ea4a02e6fa023850e150b39efbb80e416115615a25035ea0b9df8e1a88254eb749fbac2119d7e7d0d643862658e6bfb471b646c1c666503c657031126dbcdf8e2912e8665c7958127a4d2832ea6c408d55031c6cc1cf53d60b75f8efc6dd890f0e2c5217204afbae23da14753edd235461784ccb85b2cbf6024d3013222bcdb27fb473c403d1550c9986d53db4adfa824da2725ea0954b24e062912cee1c3000e427c7ed85b106a611bfe52cea43189f600e07a6a0fb33db3c42768da9133282e202c904144e630342f1cea34e5110145f178733e56918915c896ac5d1c557a0dfe1e1983e2dfcbc93d8ec316f4c7389814b7b770c538bdff793d856069711f35421bc2a71b4563a8ab1d867bb99b5577d364ef0843ef02f63fe69cea60cf3e2e56eb33b4d95e1f5ae291db6c1cd5806a9549c20cbafd808482579803e9b6007ea05613b2037428664bb269f005bce3fac32cd98611ab5e30aa5923b3ec708daf8a240aaa81cda6544d47d90f5c99a3aec3d6db7d3041c5821fb4e20351430c497a1cc2a33bb1c0ad4f1ad2d109b4eb0ffe0f71faff07dc034a307ffa0078a5d2da07e0a5186a9ef7bbf1fd3ff455e1a4dc9e43046544cc3a9195a2a1e25682d411ad0fb8033f69bdf895026006c4adf5c64df8a34d42bcb05daaf2fedd27c8d687d6f5e5e17749846ece883d2548788a22e239df9c47d5eb1738181cda31a261a44a3a339b5b65d6856337dc3a2b6aec5926adc13b9c3e752507bb00c2be36fcd0d087ab1933e63aa51eb9472eb3aaa2d4e1fd50128920d6f1df84b47b14ac2f733284534347f33936c5b386e7296134fadbd0950955a394e1881b3fef7b2d82f536d83501deb55aa021d09f4fd5b62b32dbcf96094aee395fc927a9043de17ebea52b593c4154254bfab59c4dfed20de6aba25df8ae2a4dd26c51faa4a1efaa364627c5dab9f722a0180d84c8eddc657d11f0f2c0ca7e56a237403bb6ee7f8ec6e37283c58cc6da05427e60aaebfdb85fd6615b47e613de36f39c74226dbbb3d442b49be302ead4e342b037da3e5d90f3c29ea2774a116cf8680fabd066c9a0ca2c96131e658b98a3de4d11402e2374a39c4fcf363d9f894f5d3feaa820d1dd0e69bff55dfbd0afabdffaf7c40578edd72e1ce86e08e5bba39bd43891e5fcf30ac1d949880ee2a0650c61ef4e098382f53eabf706f40c8d5deb779e76fb716924fc891586e4e9f3372f2a04c6846dbb6695a703e6473c84e313d0223cab59c7c6e1796341c50c318b0efd3b14bc5d2092fbb615f6499c2a9edb86cfcc3ddc96573a513aa0fb73e1c873809e20fa7c3ae13780341e445506f60d42aa0ef9215d3fcdb8a38bcd478b56245e34d285f190bc13ae68467e8ea0546fabbdea2751a4e56357a4ea82b0b79de93d0513a7e5aa8955e8b9564070811ecb6a0f490e93f4b3c3d648a563d5ee058cc61ac9a68011b1c6d53036d22330bee726a811f710d310b7dc94a5b8dfb7f6d3a07adecbe94c9d2e1ed4ce7cce359a8b88912c2af0cc64051192d0c9f59bd888732d385e49e3b4556bae06869a191c8137d180ef5a6418761f490fdd40211371e93cc1a7c75f5d0263c4c737ae63aa90dc70f78e762592d2abc14b3de8d10f57a8ae5fed8c4702ffae20f7d9339bae7f1f77784e6d963be160036a3214333401588bfc7ac0230a12f5ca80b2504a8f17a7edea79673f7b6ae3165602ecd0eb39a2dc7f94897cdd04e0c8480b2ef7b5201dda37558ba9bb37df02f5f5992f9ac52ea8d08412d8e39c1624392bf42a88622846462b025b610efad0315543d8ab6ea3f7d79281c284a440e63a5ccb6b70a4713aff42f4ddd7b8dc87f068115484fca9d17c05ffbf28e2051432e4db43d5b0a0bd4ae488b883fd2e2f1c782c2a8f37ea3fa727b35937200eb80b0c4b391f4c5cd80f57e673cfa498d19ccbbce232e70b48403ec617192402d9ac1c44d6b6414d9236e437962277c17358a9e805d7d3b7f52f935f8136b68a80fd5ceda002561cf3a7d3a3aae33c5220385cd81ae5c4944d5c6ea720f6a04eb4e6136f216c5571034b6c51367cbcf2dd242bb5a9c4824a58af16c67bc2a9f57d4f8bf1e15a04f3cb08f76ac254bf4ab4045da73adbd5821e11d5e31b009828e3200a9c67352d4b52c7bb15d6d30d02acc03bd5569485e4a868f126861a368eef41d9973b669621a071017bfb616dc1cd400d6884565917fd9eb3b846764bd0a89a400be553081cbeec11c3b866a82f206d1b874d8a1ac4259963c1e37e9f9517148620ed664ae4b3223316964a86f5ac2dac5b3896909229434968e398f9864295f5fddc06262287f9af9c1c75cfbb7a69090ccde3832a1082add6d02e224a3306d3cb3a9a627e435bcc7cd2504b28900a7bc194d9bb33e240d63331a7e38af25069b18d8cc79fee2fd3df4041c2e5f8f648a216e0ff56a7640da68f6b02ee8559ffd85f431d2e905d0cecefb1fb9aba17b8d8da61193b68d69a5771e2471df60bdd6837272cd232ccbfcc6609bfeedc53158b68c2cf892d7ec56f5f747cc04d4d4a889ea0bb34da6634a62dafd6896894a5e2496deae8fc44d616e189677e900690601b1694fb9312b3a3cd0d081465c1b20604c83202df1014738089d200c9 MD = 033a5e38a60f821bfc35c8ef32c48453e4dc3fd7988bebd807f1d579df4360d488d097eac9b086ff1099a447a2ded1c2 Len = 60424 Msg = 5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee7570fd4a3bce0ed79110bf9df409a8a3dba90afaa52160fcd04836d66b3e3e44ce4fa19c881a930e99f22a2ae28470a2d9bab75281e02c7d9a06af5a14a5e2cfca85807c6dddf1fbbebd1b6601a97a1aae8673bb69bbe57934900291e4d95d16d1d943f1d2614f276938395a3abfef93c2d5e73e45f9b37608aed683c124d6a14c1492039fecd618002c2d0d7610f6937d6fbae2fde3bdfe7d2ad33994cc75f9a1fe14bbbcc7ad58ed619e879be2b8a4471c95b07ac12c98fbcba2ba461a64a53a5f7220123afe6f969f35d1927e5d4d88a320aea2db27cdea58eb0ebd56c82d7dff543b878ceee365ae9af2442c0c17a8cd02e65e78d723b39a553ee3c8cc1ad4a660120407a73ec05574f29834ed880f62e46097e16424bc5989519fb895f3a61b41b072f15107115d6bda75dd292a252a6d23335ff5586e5c2f4fd86d4e405b279d1ab79313c7bf8f28b1c570e88553ec46371c38b246316dee4178301d8a5b921d5abd35160532b1537f6f35511fff7216a438b4c4766e526e2e66492a570d2468766a1f8249d28b944d5b748d8293828672711d53708bd4581e8a009e32dba42779a8987e1c07e791227175c33675e53eaaadb986bdf2bb5419cc9ca1a02cdc01685ee93204398bf506997f1cc10f63e554d6d286e409cf092814675a2b69929f4d745bc78bd0406601bbdcc0adc7c32376d3ae7b6d3ad820524aa7f25af88fa82fd134653934ce8c1cbfd2d68207cfa21a8c958ce1ec9d40a056a591b5429bc5175fbc3395cdfd115e8daa87c6364d0747e9d1e1c686e7121820a95dc5af7d9e0c053d5a2704959ad00dacfa03bb06fd06d2a9a3a7727e3ec591fb8111a8ffda16abfd02773f5dd278281f58c000c22a5e2f64fa09172a6bac8fe2232293e7213d3945510ee71e5e60c44dc8866c483657e84b0d76ddb341d703a86c7ed9fe1d8a985d727365a0e990ca7c73dc6762caf9e5a605752ce06a4dd69383afe30c7404ae8d8b2e1fab190e23f5804a59d68e4d0fbd098f6c7a8b16eeec903d18d9ceb4641dc5c87f0796e4b5001858aa6d295a4cd7424a05494f3b35fabdaedf2cd4a0a35447c8ec7b091a6ae4638fc3ef4428853dd83160155bc39207308ca2cf2dd2517c3ab6ced11ab629eb88760a2486c0a338f2c9e3a65ab6ec59115ec888825257dbc51b8ccf70c2d95bb096e8d498298c0eb89cf7c4f21c2d3989adb9207b269eb9117d903eb445647d0275c6c6216b2a0753310536cbfe3cefc000dc5fbf580d60456741e58d48b199a79d0ac3ca8f636deb1073c58e6301c3dddf9b0cf7f08b178a5e078ea4d2a8f7c6961e933b9c2186a7c2aa39e35464fd08d25df1caf4022508ec4affa0eb31de88e668fe1b9a4b9cb0ce135a71d84de46b628bd4e16e59d3e69872012b9b3498151752cc1292c9f52ebc15efe1f7a4c12b168b7ee36578694deae75ceaeb996b94b142c4ca8b83d9481517c2dab951dc7377c6b779e2472f646b12d887e248a02d3aa2afe88d6092265f839905273c7d690ca4464becad6c54a2593daa892a7e0a3cd95517a04b67f125c03d0a484eec355d8ef5008b956a44182552fae6254f503e4f7efdcd299fd1ec367690256d7000f2ea8a41c7e46f5d53dfe0200422592ac96cf2421be383ed3e4d0b3fc48253f25421ceb5a983c4c6ddedafc3e80ae6be6498788f93615b6ea26dc6c12f76db320a9c8905385ab1a83eb9878c9cc33c34973bda8c3b8b6f7ba1fe6dbb6e2f51e99cc283d87d517d2bfca930232737a3b5eabddee01d49063dc268c9d88797fd3e93fa83d77e517276a127712f914c6569e6864d33418469dc8d13a2bd8495265a75ae53aa4540d6b2b59a1459e2ecc97712feee2fad22e17f8a68c0156c101564cd45b9f8da08f206be6adf4823fe1607f68e8b7a6b0db44e42cdea8648f2138520277e69438f0e9b46fe9ba45c6a95431b9ceabc832b2a723cabeab81f2266e5f8bb6aa68abf7299d4c0101793188e510892d49efb668d13006b8655f98856abdc6b4457b77e6527f1170547d2f0485945d611c7dda5235817738702df0c2d00559fd624d0b6306d236b43dc20d90d845bd269e131d0366a082db469d796310beabde6b3df4e1c94f525937f86be23f9d1eca491fdce0c715bffd732ec0eacf5232e3dafeb2e6fc4ecabbbd80a84d3e12f8e89814b89ed949953b605235ce4e5885aa3befd3e71249266838eb7146564fe1fe25922e823fb49901b8886682204a2a9df881c666cdd6ebeb54a925621a9c50775c08bd3f5cff31ecc661c1aad79f884bbb6508ea616081c17b3a5324fd90cad0b5f8c32aa381f659145ed5bcf6d1251fdf0a19e68f8e9e67372f791361b5c7b6bde30ed8b5d56cd34ce0211ce0879796edd187efaab98868f2e90591f983bd85fe47cede0671fbe7ba86226f371b465d626bc16a4569d62339079745278342cad197a18f17d03a0307b158086d14b7cfd73964eae2281e4293fb9c817e2cce01e27315705c889db19f12409cf4fc725aa6bac0f5f36cb7238e4583fb6fe8d5a7ab3a993657039d7ffb096a71514afcaa7b6083f01bb037627275fc076f5fe038968ebb25a9c9bfca9607344a2488bd2bafdb2c8dad8b257bfafd532a1efa74312ebfe9e2a7438b3e1aac4c7bc11e4a5ace8b09033b65f7dc825c27f7d131183dfe7ea3d1d2197626d369018ac9a40ab441e0c81537c92500a302e8e538ac329b602b8797dcb407316abdf1fba092a4c4c48ce828453d3384c7922476a7c459f60e46f389099bc4ca4b1b9c42d8727f08a0dfc7a0c63ab9d58a8a5920c10204ba5361764a0b49257dff227ef4f3bc1ffc816a05334d3a1e7f464c0577f6edb974ca0b9e4f3444afa8f133088664e7fe1cc0ac1f444cc3e7ee9557a7e0cbffeea1fc95ba0d1706d9f7bbfdd77bbe7e9fe5e926845847508cafe24dbeffb2b12abe45a0880846082ad6c9c35a4962f88be48569c2e3bf78934fd79eb9394d99e4464fac56c533d118c2a5240f73e4ee38a51fd6597b3794922acfbb3501ff22a1c67529c4c852fa2a37d8a0659fd6b83c84030cb683224cffdd5533a0fe39d3e9bb50a9408635dbe5c2dec90b019aeeee2de96d789011fa32e3e2988b92903632915c9b58835f0ec1e011fe5e6db40ae3ef3d890e268934d1bb024a634394b202e503708b5430fb552c2cc0de18b494b46479dff5caea8552ef2ec9b6a5b9efe122efd9475d4e3a05e389a118b71f04b60a18e2add1d8544cece2a6f41d724843d77c362b1319435ab2b32f8cad55e38f6ca521b4efb53a2620a862ba3f4043a18f3307852a349fca1633bca88febb996f8b92da989139f5546fa7d677fb67a8096aede03e702a7ea8a75e8fac352ef733aaf66da12760c70bc53678a534745779a3a2a25fe0604229c143501ec2dfd9aaef25de5305f09fefd4da1a14e754ced167f6c49b3d13d08a779115c6edf7c73c24c8359572100668633cc2ae5c2e95777e9150dccd6ab13592f0e48cfe9e49510f86784eb8e883de3c037b5adb2b35d5b01c4d09da8e6c90da0ac7583cfbe8517a08b1681da19eb925d84a00ab733551c53fc40aaaa789051684c512f0372ba42bf6e7caea63df61e7633989152d1d5584a1bcc785dc91fb1009e6a262799bb2eaf7235c6655cf3f4a4b4fdb61827648b6eb3d27b5550bda8e3f33f0daeabee381b36c06dba0f5b9153994dfd799c69223c45015813b7f0959ceb3e4a0b21fa0b6d3cab08f6bd93812d4117dbe9b989b93d5fb7630b675f2395f6f67fbf8434f53ff4542cbdf042507c5cd9e60af71cacec648330bed76fcf59a6d5f35e4b45a1edee6a4d724fde6bdb3d02803fedb899b3e3f345a09098f5726b7b694a0f927e019b4bffb614ce5fc472305f0af5d40c4e5e7616531b71325ac555261519a206057b7797fbf7a888b29cd1b6feb80550f6448a2738e07f028d34d1de3221fab6841f8bbaa650e393400d654c7daca3145636ae0cd48818f2844a9fd64391132be7f7e6ec67b905fbd74479642a3c53c2e895601bc86ad56eda671dc2abef81c2bb85278192b8961ef2f27cb266ff9de917f13ef867014ae3ea2aba17eda5ad177947ac3ec9b80a992d67edabc65ed8037eda990732f3d00e4e06134a8b4c1b96abd003586f3fd9e6e1455ab4cae2988e97921cecdebb0b2a8079a7df076b43cccd8ebb8315c88a84a8eb3261e7135606dce8290dacbf62e50bf5f639e45bcc26490443333feaa2ff0efa03379d79a6e8b92d4bde4f896daa4b2b7d1f94c60b3fb8a128dd500ea9b26dd24baa708df1c0d6e1f3f319a18206e86aaac4ab0287759715db05f8ad155b50048a3ee2b8cd1b9096cfd09d8056774e340ddd99c9c7646eb2e8319c6e6c3650213d6976829f4590cc2dfb6dae4167f72824cee3645188aa08cee4adab14efd888e3be9e83fefb31e2acd7fc93d9757da77e1d1a6aac6ec3a7fd93ceeba5e473dbfbb2ed3552990e8abafabcd9951c4c42785c91553e6365e0f2c352b8a5c09c6b03cac51f40ab7114d6d830d7eac8ed89b1e20abc9e22eb645cf7eb8a8ae0cce69a7ad88a3faf24218f04fb277107cbdda951c8f93209dea28ab5fbe9cbe18fbf0e577a3ea610723151e57e309e5581cecd306ea390a4aa2c0a61f65eff3f5f54fdd52c851a7bf5b4be0e2c9be93e89cdabf26e34406ff8516a908d428b46a658e7688206134e293c31f398b1d82f5e6ab40c3a33b7e823b319d6034cf6b40f3b39a60d2a171387283c1a553ae1b46a167402651a6d99c6d1a6870ac6c7f3f46c83021069ac488a195af6c46fac4a57617a698160e7f15c3d7f4806588582f07d41f14e6d2969cc700d2d68e88e6d80dc25a5f1af9d8b5e47227d887aa5ed8dde0518197d3503a8dcd112d53e0eaa80d7043c384f24c4479f2ebbf395bf90271f3adb04425582b9b0353b7bc8b36dd1f294b0e7c7e43892960277fa32291746b151be8134e183798aa82bef210343feaf659862c27254d9dc3c35eee878ef7724e83722cd8f6252dcb85881df74b9517de5675ba745a587c23a6a5421258532ea7cd96b84b5cbf016d445d63c9e2a94dea28214eed4a726f89ba9bc64c57504827e29cdf2db1cbbd98a787ef0d63413521b8d3111b5d631efbe68aa3bcf3b568d7a8ccc8085d120854964de74b3526768beed22a85fcf2308412b800eb954c35bd086e9c63c85c8baaf9f6740cc020b930b268c2b48de94e29266e065fa3db58e3eac982c75a71eda1b8cbbdd66cf7a619eddb012e7a0e1ff40bf4dda2872b78513726a3bb7b18d742bb14eb34a172e44d85740e7d292a4ceca792ac3ca7043e0ed5cd27c7931bf194ea1925abc75a1cd4647b122804047c19e3909bb36d2e5222ae0635730a40e29f2e2194c54677f5b7703834b871665884a835d49140705b95a919f5484850536b6d755f09869118fd93f29db4da168734dccb7c5d8793026fad4d90cdb512eb01915eb0fff0702caeb4f374a4a6ddb2316898bea0ac60eeb9a4ec2e8bb95053688022ac30eadbdad3bb81e2113d83818435e5c0e1169cc77b753cf608bdd032a824097d23dd9cca728fe50f8207d09b342af9aaa82d1237bb088611ce275b31ca635d4b603279a3961a67227f6c8ca9492e1ea57e5989e4834511a76561b9f8d427643d704f3b0e44434e4490d47e52cc2b9ad9e902c876da1427df53d1b22ed157687cda9eaab286f2e49c3ea76f3fc408b66d73909896c95d0ee122e10e7bc6dbaf2f26858d38630f6f53104d271839adba89a46bc1ec56080fd659f89489bd9b817fdd6ead47e48338908f2e6e843402ee5703fb0b1f8cfd72e6817d0dfdbd7e289486c0d3880f34877c41b20c2bbbee99fc18a93ed870247f3821da4282cf6eeb95a9e3c5a2ee0ba43fb042c8b6d95c05a36bdb21be0c657ef5c176f8befa5311abcf3f4c3e89f0d60064446bcd9331787285fa7d7a67a9b644eab9fa594613e3fd7f3c2f04e6cc66e7e422bd17f3563b91ed6f1ab389d6704e220b0ffcbb97a9b44142389b0f859c1db842863d00b396292ba1c0127bd6f43af4d4fe4f62c7abf79db92dac0c05c0ca680e8ee6c230 MD = e9bdfb8b069dddf2bb86059553f9b337e869aa0162ee8885cbe999dafe2185bb411aa8c06cc524e4f3b08dad667c6904 Len = 61216 Msg = 8246bf7b81b287411777df7ecb53a1795e54b150ff3dd584be2bc7b8437889b6c0e0f9b324e2a5d49269e0f111ac169885535c55dedb4b308f3b0f7841c8bbbfc956df2658a05ddbf2ea78df22e42e0debd2c85801eaaf543afd81f83f5a64a287f09b5b86b2575c2140cfd266c392df7a181ce1d232a8f6a6b946c0a3f72d65e1f552da14e13a6206b30c514511ea16186f8178b87adf20bdb78558d767be12beaf2f2c6cf5aef2898d58e52795ddbbaf1d1fa61b8cfcd9663e67494172beb0086457d8f4b65d169214da14741814d4266b1df2632ea62a899814194be0d648a65df56616ececd50992bb699462376c65a1a4e5f92985190f0bb3535c78ade180e22f5f395e0638d64d2269ef3bed885407db05434442b1dee06d7cdb03ec837e3a2d4ac4d55145e28e389eed6bde32dbe5ebddaa4985f7df5f691e324a3a3688af18af21197506139c248ff7b9b371e282fbf297fef5f5facfd0c0c812400386871816b7f21b8352c10fc473ee144e512734ce702d3bb2187ac9eb0526a5f1600b5408ee28ebc3884321c6cbd2a8cf101cbef89e9cff361fa67d26514d1209fe83f50c2e828cce9b6b811c652d18ff07a9c0f88a14e88af99c13f9144e2f52483722abdfc9a7ac7581584eabc70be31f1662579b5c9eb58ca4b4ecb6f2a3d4276e046c69c5e366fccdcde503682a853eaace9c383ecabfc20588889f0117978172c3d7353ee9021a960968d7d71dec4dae294fcb8014b18109b654384332a440898674a9fc608bb626345f8edd8b20356a9ef8bbeb2392b3f667d9e77f9d024afc75cc2ec6f106b7c3755290421d2adc2652207047a06a3f15c29d157fffb98913ba662d66447d07b6f4ca45ce7a112c2a704e525c32410daef02a2b0901d2e3157aca0ca200f78d47da4f15484add0cbd1e0bc9f18220050918088fe64b54424ce0813543cd7d31bd4f67687a3796632984de3dd0370e0f6d63bdabde84478dfe11120e115516db627a9ca62ae7451bb4cc4f16bffa141324f9d3e6b854b3ac74380501d33dca737c8475372102f21ba71be6bc877339f97401d2a73e65a186f67be3745330a1e154947a832731a34b4a9c2c97f04985a9a6a34058365c1805cb0233d157d4a40d32d334f3041c6293e474a80fc125000b0109a76069e421103df67d7fa8d1dae05d692aed7f6a36dbbfcee38dc4aeb308cf588e279fa3c38f927f4ae60ed04c401f7de4da61c3280b21d06377bf8da58656bb7e159f41066b13c4206e50790016be37eb2372d13e0b53a2b2377b69de6ee058fe923367f28a08ee8a7f3873004b83c0c62e7a3982c39d6d5833c0eb67a9b357960621bd90d5b9240d818c6754c5b640fd6541a6fc1c4659dbd555bb471e17e1ced932eae7346d8f33dc15fc026e9fde192f8ebeb3fc988dc584048086b4561e2f732e97ff906e5783f89bdb142d86c3a1f32b29af4dd9329da793e22d55b735403cdd6be1cf02a3853ee6ab91e9b2171d1bde90f8f5526feca8cb8b43e8814e899d070f94db729bc214bd15828c6c01160e709b97de4b6d39ee7420d054fd9393fc732a209a0669c1e3e9c1eefdfca91334a9f193ee0b530ce1564cdd83732ae5c2ea658ef605320a143356dd24aa389cf5503bf40fdc4aede938b5705c2a3b08583468e5d6b921260d607d58e9bed639b92f20c228047a656ee40394c76cef822419da2d21685b9c383bdd65347faa73e80c490620cc0afbd820df4eac7f6ddd9061636fc15b0bf4fc8b1f0fed36ddd1eab05dc8e17c23388fb5f1a8f3acdea003d3acb29dda57b7c017ea5bfc2b96dc27e3050e525ceca3fb6be0a9853b6a54e5385dfe9d2c676ceea8e75349a6fe1a086ce9e25bb48ec485095459487438809d581e5ba99b649bed06bdfebdef3d15f315b04be4cb30239359f7c1259f71ac95fb95d2a96d76cd25f915643e4d7a5551a40352d5eafb498f216ee804033c6134e96d6a85ebc488fe49978eb50ade608be289fd165917bddf2a64d7cee9c225e2e94c2c255d7757e0bdea830b6c90c00797eb569060ab07ed3c7f9469992b8307c5db1e720bb6bf331fb74b26bcb8fd2f8bd0652947dfb01f1f6729bf5b9e000b43c14a523caa4a5f35a5eff041809d6a85e131ca55dc3fdf9ac59db7774326572ca6b8ae3a7b7fccc85d7650450e2a1f4fc6c25cd3ca3c947641f93834437c5147346f6f4b50e6e29f86e82d0e8a2cb8af2620c509d12fa57b82442cdcc68a625e11777bb851080a84c94e71e51d299c6ea954ef3f17a17c7131867ab5f3d9f237e5d8bcc9a86caa3dceaf0312efab3354f865c0bdc71a8020f5c80a08f3f06a9c599a19c57a9b2c933c13cbdd2739e528bb5b22ca072019507711c41cee57305314c679f6f21bf64ebc82b18eed5c1ab4993efcb0ff3dafc85f69903b0b97ae24bf64c6a235767236f5059d6c6b9a3abe3b1735b5d9f8aa5154d856ab72374bd9027ae7126e33061290a377c0c67ead0f49edb722bad973b3fe67feb54cbf6e388412c48ec3db1cac346527d2298ddb6f6ac9693fcc6970b6061d70a1c1b8810bee33455d5cf51bca8a5195eaba512da546b23353372f0a21140394b7f8a9eb18e7e652c962096b353972aa50a151097b86b0fda823b4a9becf1f523f1a1a14281832d318fda074b5eacd4c4b0715d8b7d2cbaf84b77eb653e07b93804e936402291fb09354419d12456c642514260322d10c32301b1797a9ee1f3dc3bd9d4370c1b5d18290745013f156db24ef0bf0842c7a6cf47807b688a2113a508ebf193888fd1e2dd8c1f58197939791c14c09a58b1e4617f6d47ab8a45b706fea824e2328fe80db55b1f224de2c82b4b172b54c94fea8e3bc084a009b05c968f96d4af946c0ddd62fcbb0c46f2883d4e8045b43f2247b9ef32a902930152c82e20875828d4c1f648d979729f18f813a8d8a65504b98a591c2c3b3fc0a958006cedb3885a2a92cce979e101a0d69662fc98c3a3c48601004525a1b3ed28caf3ce46ff9cc30dfee5c776781616bbf19f9c49342ce9086a23eca7730ba2f03a06c4d4b211dddf74b55527b53c4b29882e0a526e5d0cc12458953a35937ca013bde30f7194151f82d035360ef0c8bfd892e95ce8b08a30ae02b1564017c4a8e68dab6fc480035ea7bac9fa0bb019df51629bb129c40be785b6d37458d5258b20fa707e1152131d61d9961c3216a9188111b407a803ec4639e97e2cb66819c76188e4a2eea6eecc3fa12bf4f88100ebe624a4b8e9fcb5ed490f13d80f4d1bde16bd7a86c2ead0fb9fc5ee1ce58bcbda0f1ff05d762ae34d21bc371eb9f0a64fcf1ca482248a741c00ac7f0c7f8344535a68195dc2fb1ed652654a594d0f338ce90ae53d8a2242be10c9314c3d24050866a1a24256f9a31959aed0204ed55e25f31cdf016a3ec7523eb0b74494daa83992310da3b8b32aa6b5dd6b0c260f809b7bd6d4865b3c6c68f8d7739e1d1398878bbacdea5e941feee5857d6568fa456df1ad7824c3a7bc62bdb1f8a13c6b4072b183659ebf38fd52773b89c49e42170de3253c754a0d41e01bd4a906895e4a7b824f6729610e3d81c97402b22c53601bceb283f034e9676191c427367a4911129c533522da706aed7aa38ab699cadae812fa011e4aa8c7579de4d5a995c82ed86e537203822c1006095e844a7d04c2136e501667c1d7dc42bedb46d842581e2d56b480540e8da76bd41981c62c9dc02e3f594655510300b372fbfd6b2685498203faf29cc6119b7f895905e25ef24f88e46a137f6e96ef1a38eb5baab8bc4b86e49b4b364f5486c1978173075aaeeac41c27003e712ff1e79f1e044f5f899eac8719ecc900c2d3c26d477badc6200c6035048f2b1f1ab3bc13f86991a159bd5359fb79bd90e92d02990f625e17f23edddd8732cdbf03af08162f0e4a24c9222bdbb4549c6633dcf2994dd990d691fc9d54337d8ed7573e4c341664b1304457868ad91fde073f6e22fc8743de688bc03f677dd1e6fea1fc08ec42ff6f7a47d803f5de3e0ada787b14214023af645c243455dac27eab6062bebd3950ed59602e249b3831ab765b7e36a60d1b8c506f830ccddee1be641f0cee056debb36419c458e98b8d286164d21af9427ded934277392e0e922e9f3a55078355324a10d135117f2cb30a02312121a984dd4bc3817b49f4ce7627d34ec5bb8583c729e622eafebab045d8ff2ce5fb2548bc3f678909afc0b2e06296c8f94aaa8e1ccb5a8b60712a9ab81dbed48af80b028d30d5e5acdb0030634760354a5550b895b6f47740095d608c30a7b4aab8a956e2b8b513cf6c31eb914ea610436c16a7e4753a72d437b18634ca6039afbdae9a3f4f8b800bd3e428ed00fee67eef7ae06b7ea31ac78cc59034437ef014678961055dafd6cc92859cc8d6d134476febd6ad3ba4bb846918031d243a647346a82fd77bb8749c3894abc768a366475de81f2c54d5e1855d175351e5490346eba97b18122be5e5269fda6b0f0c19094a0e1e5b22bd3954e94205751f115909c70bb769c980a751fd15ad266271a8e7b4bc48dc5da10f7d9e269df93a39d226692d892f0a4d354d1c84987beb5ab26d1e7143023e47f069dc438140bf090b3722ad54ea4ce81c41157b20ee024da223f7db817f7d187894341753fe263560b6b3f9af2e19e7c8d87857daff5fc11496c13988a67278f4a726208a83f8157f2f7da0fc6ce9d2d77da5a92b225c3b76201b49cd09b70010fd32ed9974bd4fc30be021c129452fa4ab3ded95f97033336a565ac33bc3344a10eadd0542ee3ab8c69bfa91d5a454ccdb91a3bfe7443ef8d0130b0f9f2f9c0c8cae7d6260f36cdd0a0199e3049ff8cc995159ed6e30c522ebc1c906b6449dd4bafe5d1571656cbc20a19e39389072007eed7ec300de5c4e37f3134d13bab03f466aeab2d6dca0b2b50c6608e41e5724c6d690b541a56ad72f27884739ea79a89974a4af1391af7d21a29fe699922e863bad2e58a31e776a4bcf86998b6c60ad3eac298eaa5cff6810f48a36bba45ec137c1a601a7a21854186bac98aab8fbb9a051d7b62d6706ffed72d38ddccd6e5235b4a664b1e8b4311f7c48e8fa48b16a69363dd9ff785cc121be0a607f65e3b5c0169de6745ae18dbb8209ef0c94081be3a9ca5ea2e9674858367d33161645586137fafb416106d6970d6e3f5433865aca2d1bb8ba32ccf1fb6cca9a335709d693c95c37bba3ba881c8ec43e53afb2b36740a07ca80ce45a85d170fa4990a7acc22b1010359b733ec686ca80ad50f3925584d70efea053ee71f4eec7eb5bb54786dde5196190a7472f75df9aa3dfef940f5a4e1410b5822a5a57b2a77b20a9436c6219b7a25bed5da1ec81e0e9a50d151f4163f090b4f59aa96a5b0d8b880a0ccd584c7f8a35bbcee84b4fe7e138b2b1efcab739012724bbe9bd566e9eea3e102410ebe58bc679374d2298341d0396e71b66c651b474a61a95c1234f17dfebfa2b2c766e2976cc135af3094a1fae10210ca60fdf5d25e01328064023a8d16a372d2b8a8de5df1aef9c4cf19e4b90c4fc3df902465dc369423b0d3b80a4575f33c46e86d93357fc288b810fb533441bd549d02c0b28d5b834293683eaacda219c6b95f9b4a489d65a934fb20369408b489aec0ba250c543558d22a7c624e257bd9d1261b4bbdd3ff26e09771d500e99c2cb7d2fb0682a9112c14225b79f087833c3644d6debda9f8c563ecd677a16ddd03633e6a9d16e381880256c139da4f97b991c1b34b70a8b84f660238669f1bdfd7570eee31f189eb3243d097e8350521168aa699d9fd57a78b90e27de8217c0a6f3e4a710b3a23b9f38098c6cf2831881cc8fa72d18d3e2e438a938f464f16c795bef8da741a3a529361b43536dc5c3493f4c5257b47e6b33dfb1d54c852747c0f7f2211b2b9551eda8d2ecb64780d8d43b5109a1f54d6a0428c89b6b5521b93a62acffd0d3efc8590ad0e72a325cdfbf3b4e2b905db965b1ae5de9c5776957222670888cfd1b7ef7c685a11390b23e66d99436a7505af4e8dad24edf4e768834bddd4993e9c0fc467671c8f6f5197b6770b3b95b6faa8df638c6393d5cd1f2ce9353b19a4c48b6c19525bd68d20b1d3dab2d32211e10978632ca475424f3fd7c31745ee4774b4505ad020cddb9ffaa55e3712f9cee25b805732ee7b829552eba229fb0170d210d6f289725ca1f7f995ca4201023527255f05494a8ddfc8e0d04e16643a66062967a826596b264f3609e87aa6268dd5ef7c3517bf939f106fed8f8488817339876c454fdde2b3d03a6a7e880b4b20174241b14455750b9489ac2d1c70bfdd93b04b92ab07a990a18c215513385a3413a4154079141b6b7db574ef8523daed3b2e6e54e3dea905ecb59435c4333c12f1a060a95e056e07f27cae9e67a9bceb5a893b569e6ac85ad63b2de54306d702dabb8bb59a2f54261c64c0026c0b4b1f17471c5f85b4efd689a8532f37b9154bf67ffc2cd69bb61223f713e33a5071d09bf2783640c307c22d836dd94952dd376c731cd6b94f7d112ebd0f09798015480d11b6a476a0f666e955e5ac20db160c651f537aec558f6c653d1c3cd2a41fcd962d4071cf51a60ae6a52270655baa13080c0ae216b5d66bf1ffa343ecc376a85ecd7d65f5e0fdf64cfb8cedbfdb80947ec1a7d4e0753955fa8b0ae771e504218c79d5478d54e57142df8bead76280d7eec69419f19f9f74a76abbf00612b07f49bab0e142b645c5f0da873154f8922381a43779f33af20e21231c265553620cbc1676f9b90d04387f73e888dfa59ec25ee2fabb8b4f196c903e975006af020e0e178f589d610c13173316b820728cfaaf0844a963e5fcd61b439338c12f79ce664564c694bb449edfa17a89be664414999f7c0923048393eabb78a42ddaad94ed275b0b4622942000457ac2628aaf57462e0ca473b496ed262ead5df2b887a8ca45ddee5d9ee4e3a2a77f2db3e4b30dde3d5b42f9fe1d2af7229c2bb9d1ef51262753387e371c2deb50f2905a7f397c8854d1ab60e900938421acd52a2eced8295623b153f6254706c739b4fe602aee6dfcd6a64e7e2770f6b24525ecd60a85fa59b72184e2e5791994be6148916ca9b5bcd2fc6cc47a09745ecfe1a8d18da0c2b87550b903450a4d40e75edf19e9f6871d2d7561c3e2a527abb2d205283d71a8fcc70699622d44c9521e756d00871c0ba64fd9d583458e372357c0ace20440d5ac140acc06866db652ca6c974e30656bdfa1f0720d8d0acb4e24734407c9547150c325fbf836ce3bc8520c070ccb17cc508982dd68a0620bb382b276a074f6a3703e1fce3e27af813d201d6542407b59827056c19c68de20dada46eab3ec6e9395ecc0ece23f58af399b6758f677d937fcbf35c4b2cbc5324b92f8474b1b046a4635cffeeb6810ee422bb1893257799146dce78eb1b361688f148e356de800500c8116ab62892066e238c5a0fdcaa28de93134c8a107f8eb2dc6d05e233ba96c6e385b9c4e8ad03ea02a694460b89d536c24e41a8aafd3e3ad12886774fc48e7f4c26778b752689f046a661d6107b30c571fbe2b75923a77985f7cfb691325e8268802e8a6cb30b0975e84d40ba029e033898ba4699a74cf741475c0086988988df0f39421dc709ae06f8a11636b4af686ca132c6faecb14cc9b3b5e5be4b91fb0630423336d6f846805427b73505d77db4a1e6c8eb6856e255b967e6a6dffa4174afb3ee1677697b58972bb4238a98ab770740cce9beb0409bc4ec83beda44f4b0ba18c35b0cdfa5161e379d8097758a4a6dcb3374345ffff262ae3d94aee49d310beb63631bcd6c4f75d5c3ead0f0929542009d297db869001f478496e26ba37bf1a63ecd28b5394b2a80c7b0ab9c4cfe006b8a67ff4c242b5722e943f93ca00827c3c607c81984bf98b32970abdb11cb35765bbe4dadba0aa6daec3a77f9fb5c0aee89915e7ce7036cf769b9462f99a35daba1aacd3f82f49ac9fde8d3064dee076109f86051c8cd03c7f8e8ff2c4d1ce595fcac1284179f8f9aaebd8ef3f044c9d5c7bb823ab262f9af678e5b33948e79afcd30921df05201a77f4720458ae6beb73349289a3c6bbb182617dee8187e667383e6e05fa5b2ad8ad0042b7d864a527fed2fb7f2bf5dc49cc523feac3163586bb12d71eb9047cfbf4183050e7ae621ba45edd4c6b39fa297b5213f1287e3abf2e572bb24587804bf6432416ac150a8d0edf1f398c1d7d1a386ae149d8465fdc3916540ac66c9d905889065250200546e45da98eb626cde4aba1913bfaf60ba38356396e633c3a91c5f2be4dfa58bc0ecde1639310de524f7bff0b0fb716a5deb51fc225447ec117e387354cd34395ac7171358fc3cc7423518c370d362f97537679d77992ba99ea5a4f519a036bf9ea791807ccf6789c27d451fe7da0c848cb6f6d60b075782ad2d352fb7eb158518e8ddbc190d26b3024ad5546a61c6a200d480245131441dc97f6991c3f0690036154c44b247f2c9ae283a0f9d1d39c87e3a8416eea989c17006a2b9a26299d792b77da8dd024434029ff3bfd46ece6e5133730c47d281243d6d8115f7b420719b49d256fdbea398cc1c92d3c4d90d0a2669eda2d13ed2ac8e1e75151867b544dc36faeda8ff895e471887e9c2ee7e326a4854492f60f6c0ee940f55a8efa0e7c22957cb43277dfb202e437073018a6da959378dc6cb5607eb68a0461dde7bc0d97b697e70d8ea05d3d875f649c4ca22400717df1be078f7e0f6e874db96be76aeb7a085968665e4de716fe9bbaaa5d6dafc75bbb342e8077be9485086bae16fae68bd6f48b26a4eacb3c1d93d25b611e683c1a211552bbd289a306793ad7d1254f8e099ebdf7f79cb09fc2362c86369df478c30aab9ac9f539441388700ea153f02eaa414701e1cb5de7f86b105462541b245e603c2f314a961eb21d547d0cec8f11c0c4716be9df9bbdc41ac5ed6fa9a4e8f10a11397b3767daee202d499c58f5df530f835e984032c9302b9478e506596b86f072df3026761fcc79449dd900ea416c0ac5017456eab24387c51d4ad2005624faa649d77e89965611e19f4a4a35de119d7f7d078a8b200514a00628756250d410f7a0f8a769e693ce4b77779fa0604db0f8f9d942dcbd7fbb6c58065747029d1aab0c1b09deb88b99cc4ee868f16c252b799e70e7a62eb865733e6de0771387000bb4c90cafb4475baa4c260bf1ada3f64a9356e2b11eb8f8fbdee478b92c9aaa5fc18918a681cefa2e98b8f268c8cef9b3011399c533885e4d60f387d6f5df00ef5ae49589c82860a05b26831e68ae1dfc102d76aa152f7db1ed227597155deb02a861eb21305e7348bcf928da334c486ce72ee0276db53f6eadfaaac1351c51e2d388823662771d6de4b84866d1af634caf9e3f06e3238acec7028e1ffc251cd502e1c290057b4459faeb4a88ebdf57e48f03fa0d1e80481763c28978137f32245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc3049321327d170d4bde314166aea193ce99b032c8665c3ad129b58528ba87c58c6539cf47e3f53a6b890a295cc08e658eb547af9052cc544a6ce701833e3ed9a61632c5c54e080bde7e46235df060c6e354944746b51326d9ac61e3edd4fe10977d46aab4a596a92b24b0d6722661dd54de61a3f1797ad90651ecd26e641191e9043d271dd0e83cdae20feba24ad7d369bb746a9985499559c350760fd6bd852312dee307b646eb74222a09f6440bcfaa54954546c1c8815b6b5578d7124b14ce0ef2877a41f7de804bcad974fc45faa00f8edc01153ec693afc380cf000365716241ba7e58453e86c5b702265bcd7bd25526d6d169f58b89f86135fd892ca1947593251ce376330ef7b92d1447ea7bc88f24dcbfa533f9c6aff8406b930fefc0afb06f5bcbd3e4a14b980245a9e5220b235195d2b14138d13a50482107f5787b78604144f6a47ac6281b28c16a0697227b75aa1275676f320331f625ce246450386a43dd4d311c06f60c489070950395fd58c287daecc7727063f281cee5dac457971c30b8c1f3e81e3109bba5da8ded13c1863ac61a6718ebade33df17f02613daf7545209e27f406521448f01d5eb124799d32223777acdbd9725f1e3c05ae537af5226b0edfb21739104238a59d699749b177d78c21b7a8ad46f13d620b33ffbf45d1835a43abb9ada6ae67bb739ed6f76712cc618bc0b9f208fa353a3b79aa480c5a4eca7c6655757e9664a708d6484b690ae8fedd4f786f5f83f00cbe07bddbf3c3b6a5b26b515a3f0117b1839c550f5f6715aa40ec4ceef4935520bc659e41a216a2350c43172492f868210d756509f0323aaedc209d356e324cbd5c1cb742c05bf9c0b3750d9b1e823f3ecdebe002c5723e52d872d40e7668bd2cc6b36fa5f598a58fcf899d868ca78451ec852fc3862f0bde5c6b573fb43e90b623b22d34ebd78dea87082eaf836f1fa291ccb811da71889a92918f90cfbbada19ba25bb5471f9918037927dcace3f879e546e4b769419dcea06fe4cb70e8fd35550a60f1b479b1636c64f2d6af0af81e107d1b7bdca632c1ae8abfb63ecb66bc7a72a4b0d8ebbd11ea51f66533ed05d839f9c627dba92fbce56c861be26fd17c31628fb95b80a56ba4c99b50e09208f188404b810d517c076c9ca3c003d927bea36389d6e63d51b9c35349615f03eaaf26dc14521ba602ea6ca27c6d4a134ecaf7fcfacd212caa436e78685e5848915b3b558761acb0a7ad0d077bec5e2430e856b64a67b3549650cebf MD = 4d7909d8e5613249cae1a82481093c7b3260abe835294e5f72c6683a65bb0cc5142e6b8a21beeae531e7c3fc8238349d Len = 62008 Msg = eccbebc347859d4c096ba63c585986dee7899de826fcf7fdb61c6976209fdd62c6aeeacb1a47a83c0de0c27fcb4dccaba5e3d75f4ede43484b00d5e9a57b099be111aad2317a9fa3ec0608833c838a521761e6987014d10eaeba00605dfe8231233c525ff6e62d898d26a1cf14c467d9244bf21bf2674857c7921163b0efed2c76760bfbd052f8f7d887b4ecbcd80b4ab6e822713e9f512b7ecf307a0618f595c109fd2d2787a8f4b5736a609a871facb4819f21ba849393bbbb872ec73f4073ec3b4f7d644ee6890c30ebb518994b08055e91b3d0ddb796669c3b065b2d76cede552a73ed6d5abdc5075e729dd5366593c71fafe774643d67bb778b2aaa40ae819eb5982bacab98c840eb20900489cb4504719e660f438fa66061439d7e461cbc60197386d58122fd23bc465beeeb43035cb008b777fb940bd321b81a702f1f77e17d8d67ae86644df8f66c655b05d3b5190473417435547f5be0720a49a3c09a6b0a6c340160659e06c41b16137f86438194696cce99d8e841c6f8d6d14c060e44e79a5794b72dda964cd9d6dd006196dd8971a04cce2730cefad1e4d0cff9b9b43e9f362f34c5e7f0b6310d83306e94740a1445b77d493d47a5889e0ed7a1840534013b9c7e34af5c2ba823cbb8b4269040d8c3d74d47f9f7eea26b520a07577df34acca23e821822d3c8807e403b357753488374e7284a25fea9b26610321b66a30153081cb80c89d5188d646f0ca7726ae9eb56f2f41a18fc25dd10922ab6066baf3797bfdd72da5920b044ee2e66c9ad45644417b35019119c531938f812a674dbe017d0f9315e896952e764a958c445e35708fe6ed47065987c49a9a3168de60db650f615335a8b7adc167a8667ab5a4b2a684e2d8e651fa0c0678e33a905e8ce2109da375f1987dbb497d8cc7ac51306472db0f66640683d873d8eb1b554a2a4890c246a9de2a61544322583785b999b141fcbd3444867f53991522421c33d1a561f7bb3d5fc0faff3b10ab34bb51492fb0548cb10c645533e2c8194d59ae1b5f00b871cefb0ec3128da2e65da1bab7462a8cee6b20229dcfed6c409b821b5ffbf97f1acd44662244d773aa10dd586c7b3d1062d12443c1ae256c38cb4a0e27f2c8d616b6a069b0fc94ed56dcc2ace16554697a718d4a59450762524b05e8fbd9db37e629a37bf7a0428a8d3ff64abe6b0d02b5dadf98dd2b1fc93da95a4e5427bd3f1984d23f5ed66cc5ada8ec944c12c366755b7fd1c5d6eb1b4b549ba0c952fb36115691066f15704948a61a2c22e3142f5991f2679bced5d31bdb5e82b3e1f1c77e2d7473a0d3f96feec61364cb627ba7d31cebdcd7798c8b1fac1766bc6b5d5db06801098ca864b3f0774cf0bdf7667a623ab093f17d6b9dd7556abf3b458a834894bb2a8af94eb00e483b32734861119799d54f8230efa5d355ad0ec906f5b2b741f779444d13ee889772bc73ac07f7e3b8ee42023aa51d842b72d7de364b767cee6a58111a60ba000367f137b8a7b7c6f6503de9f1187f6a5530acf339e84919f8785999f791ccf51aaf7347e4dcbbb1f0af75a20ab64606518af090b858a50f0ea5f0475b3371e82b9db52cb7238e4526408bd2de0afbe8aec6354f081904dc8f77bea1bbd25359d4d7294eb5f8a9f115d802f4f1832b71db970d86cfa602f2f9620721afdaebba94d0523657e899363dca5d70dbbb3f424661cbc0658c09f2daf98c4f9dd9959afa1dc27c136fd6950cac1deef31fb1daadbb02947037945cb2a290940c4b0b6b6313fc788eeadc8e00d1a6b7de2d2d9b4007346b56453c810ef1c69781ab97bc6e5762b411062591c8ef8a74037ffd04cbdaf3cdae115d105e6b90b28467d4fe7a5c87c7403e4c40b35a5babf964cab79faaa323ee38907b0f84718d8b2c4db22597fe2a92ffbb0b5eb68cb82687f12449fae5167d375131b0b10b710c556c67ee9e18469fc6fc523968802121661acb39401c0df17a29c4e085a1159e7fab9043d378b3bd207ac5c1f4e88f606ba22d1c1eba82e19d84b4fd86e4e3a807a5cbb3dc81ea8198c0d686f0285b6a2521ba30eb631da3fdec8286194953cf89c56abd2de663739c78f506dec20db51f0403364a8826df37ebae18d130ee5b82950dce2bf8b709a7ddb1b005382ec7a5e3988a90bc46f9c7ec9804335e2c026e8f15756b4b4dba47999d11281d3718762adaac7251e66a1a79e0f6b403952aba3e22317050901c082707b8abc3af3dfc545a2a43fb9dc6cc1e195ec7d3a25b020ca480cfab369545f08204f4ddff9ea4ea8772aa0bd5864943a1bb0340ec09b2852cf1cdbda9bcad90ac84b7ceb0b10c77e313f925163f1e74fa89eaddcabd58322bf31efa52088b81e7b659086b1b9f671d9cd5b9d847b84cb449e2fcd6fc7f9e120327f3d7ff8c4eb4285d3d7744da52775bb44ca436a3154f798030993d85237fa06d3ca4080c41a24938b07db349a4810f195002827b792ca7472b79f6f55ce56973373ec8a82522a78013d6fd69e7daf579666bc18de2fc41ac2001bf6cc4b3bcce7600a7dc43c5b1a7da2b69c786e5cd58f2586a66dd0ee733b0b90d47d59b28d36ba22c15380bf62465e3aecf2c21e53c7640e392e1f4e6527018671309ec2c26aa9bcbef7c55e38a698832fd221feb9874cdd3ae7c4efd9cc098335afc27353c95461dc77b34185e37917cee13502ef17057a0f6167d6b8744c1188c16ecd299ce498839df36f2f4628802fe7a334ddbfb66d2264af0de865f1b7d22d4ad92a2a80ea1b2f2df02017cd46bcac169c6cc7883fdab8449b53e721fe7bbcfd9e3fbd51de0cf608cd3e9e92efdcf734418276a2779e24cf88df44046ceb363024519b7ffcbeba2d0d73239d05f691a52b08152c9dd871f8dc76c2c18b8a638a74460d31cc994344b8a6ed161074431262e7ec503aef6766a0ffab81e3c10ab495085b8fd70658f4d7bf452696bdd323ef054334d54bcec2dc62456bfaf6f5558f7dcdc2a46bc3e570a573f52139097fd94c6200f6546eb39687d9a85a92ea166b8fabf2bb314ac08e42bfaa3850afcf28a390dd25720fe2d856ae5f8bfeb29f30253c46a5c1b62d367d706d646a8bbae4f117f3eb0d78f6a9b70eb913a11597e626c9e7e981ced3723ed0682bef67e916203d69cf8d729812923fde7ce2daa6967c9afd0fdb5c5b496d25c018470903c6174b675a5ac57019cf8af54e2bcb75470ef7afa036266cc4f3b8a0b0da39b1fabe881712dc3925c95637260fe3aeac01c4282523faf6afe9b6d12e7d11c19bbcfd3e9f817b9560270f8e9b49714cf3cc867488208e92ccc29fb8920652686813bcb3272fa0a3c83de2d779833f6df0b13c25001f5cc26a5796b4f5d306f5c108e331d8a3b1290612b859eb46b4d84eb7ce81b4a9cb5031ae840e7f6d96314da15afed96518f0c1ae775d17193857b3e724d1cd454302cbd14f0f575b68e4b5e8096253fd3bc0a21a092b258433b0c847275c727c2ca2ddc8e1fca625e6d5a0e5d9a76ef48461515d540b3e0f0dac34e2bd6cccd5eff612992020935477ceb79fb01351d05a9a757f42458a432f139fbdcf4703d8f2c70f4ef6c2476f8295a21e78f0251c2434b689ba2030a7ffadb3e246363e0d9edc7fef4a29e9fe71f4086a1784115d4cf8be82a3e558c4e64215580881a5fd5bff0882039ea289abb0918c77183e1d39ab3272e7dd2c204d997027ff70612f92f652110b699a999894e68b7ef3d4e35318bd616d4dd1459a7b6a58114b9a2ba98a06a349d2f8b5a067af6f165ffa38020605581d8072bb37b0abf12859777a0a83cc41a521e5662bf0934026a2d8a3ae3cb25edfbd35088a00dcfd2be321a31ba94bf2079d8833a1f83b07950597acbf836d7c9b4b42b6fd33a5810231c02e46c42cbe578f0aa46a474fcc4dd05fdb9da3deb93973c24df610ad87958b7ba4f29b16ad7d3f9241eea57695354b57b9b064ac1da17ddd53df609d16cc397a8c86f7b2c862f5499396da586c35bea8cd618e7fb0bcb1ba521feb1c378f82e66e6ca0a816ecf95621c8ad9e583570799f16e8017b705682d11e79d3f1c6b0e7d20b5e9f9f0492e273ede8f0621daaf3b8383bd885a6b65c5944d26a4c5909a441cbf9406c930a15126e51f590d5b43e9f304facd647177171f9bd885030d64643143832847fa71685b1b156ec46d681dc65ec267739c2e9a1a504d506335ef45e4ee41df0b2b20e5420cfbb7e5658e5f83edaed6f66ffeb71b06dfb754bebd71ce1c5abb6127224082275ca4dee81917a25e0aac6b4169f6a82c19fa55ec3170436a382e0893181281e692e61f79aadea81c805850d4e2e1383c76c9f552fdb9eb3464a75fe354c3c7e748dc257eb63d1b958a5b358f0c0f41c49076a19774b73c176ac7e58c8aecda95e9079f8bcd9b6375933587d447c96b30d1b0e91e3900ac9fa4f028130cf6207efde8cc05537216292567d63928b80b2dd4e94a4bbd2eb319bdd0960b5d68300ef200699fda69aa2cdb728f422153a7f7f48033c46389f6221fb9cdda1ecb8fc25fdec6afe4eaa5fd0fe64173b414d84bbb26340cdebadc55453c1e03a388a635a1e481b9e56d80164d236b4273740275b34bd9798139dc1fb8d8251cae3809d562a219326e6adf051dba8b42c209bd22575182befd6f8bde051e71897142312e1ca80bcde28b0955fc2c1fd9324e7ece31e7ce31a5f4523c945f71eeaf4f92bc3a66c7d0d426956562f8978a46aabdd5bd6f1a760d40c5a7f14ba490aab8c4ec365edbefc5c609cfdc9090da61b6f0c5646805f0b5ed6caca643882416064e4abaf0b67f49f1ed01d3948a5e35ebce39b1630f3612429db71de7ab2d53b0756412ecf613b322a587e264e26a15c18c9f4ed0a4cab4f90f53e2987bf0f65ff0a4e874092193e0c9ee839247a293c0e262773145030069080f7ed67933706d46a996567e3d8eb4d08231ad187c3272363fd5158e83a72b3e465d4231495450cddec6e4a3cbf607400f6705d37b645e1e63e2fdefd0fba80895084c22c704b31ca0d4af38615c609ed2be4d1704cbdcf18b2b4ac75f8087fd880a54cc21240ca9bc5a26aa723449437881d341ccbb875612089cc3a3d813937bce0cabdc14b60b7dc1eb58931039e45d6c48e227c5d5c2a52564632264f350fcddd4307c6947a861a65de12862bae81dc80e86aa7d50bd90ec22047fb9afbc97c43bf876944a0704720ed2c6ce34d5264fa49dc94470ad81d756460038914cb8fba4625f1835bdd2af6e8be2953022034d9b9608adce28d47181a648745077fceece1c9a87831358c90d9b006a4555416c640ded3bc1a625353483dcff65c4c037e975bd44cace03595c7ea4bfece54cf69e73eb50e3abd0bcdf8d223c29c99f41b71c3be265446edaebb534088f6892a69b56879fbcb08352f310bcbd44ed06a6975e9ae2fb0d07c83bcd52d6b545bee6fb34466aa54aa9a20fcd00e52fa582d10adb6eb8f48e4a9bbd25759ce7133e222e7bbc6435d0b024960093665299905b92110bf6da4ec3dff05c20ddad377d02b5bb3dff06e933551659e893461fbba0cd8e170f14d4e01f65efc91b704917e311715fbd710aafae2137750e82de613b0da0f4745ca74ba49e4ee2d8c8ce7b4dd21ca6020cab81aa1737dd2a812c2da4e2f838c8ea3c4339fa0802981f1e33cd783b956f425255e388c96599d9af7d58de02687f761a833a1989bccc0bdebddc645c9277ba8598b4f66ab2bee4cedcd16f3df80a58b8781f7d6255f6e77695e526de419dcdbbd6c8d0aa591c4b00c89907395bec3a9c8e64862082ab6a8c4882405f1764046b7c89b7f6ad3474fbdd3a465328a7743d52a3c422a75bed76423e414d784ce72b06620cde4399eb06671fad39d2ce9e215157c807588ae8cb1f73aa3808cafe6110fc5fdf90bf25c712c39c4beec430df06eb024cfaaaf5013cbccb9d3d50a2a408b321693906ad944cc09417d11aa4dceff80342225e9a9f268455eb8a908c7a7a20e2099112fb149191451c2e54829178e92ba553f8322b6974b9a174ed144ac1c0224f3d6686be6dbfffc75ae452933e491bd5041a540c71e8676d80d8c29b9c0b52889273e9085d9754a7eb5c9d58bc92346fb73798d8dc5a0f9e42e61ff3557d037434cd9a78ddc1c44c542fbb68505f05c3e1c249071563e2c21f9794c88a9fa56098c603866ac9cf1339d03538a5fa1070185d1d1d9970b1578b6fc9b197edc8fc331fccc77119e5aae0d0a3403a0de4f2cf7a6d92e52acbed1ac1271529e1de95981d4ea2ad3ca851fdb38e256904e3da7b8cb2fd94dcc2f1524e1589ad1666db3c5111ae6b9c77c6f50b4e4edf79ad85a10695b4051116f2a6694d759de5f21b944dae4148c3e4784b2a7c22e9d6a292d49a8e6cd252385faba5177f88eaf0f544858d11a14d6ec48493805834a643609aaaf57e793ab7c6c6840bedda9ff3f6a17b26861193875a25f903453c53309d47aa736f561515967b78b3671f7f6b7e4fa113151630be9793ad6d705d77daa7802b70c6158bc26d5f157671c3f3d81ab399db552b9f851b72333770348eb1fdb8a085f924095eb9d5ccfd8474b7ba5a61c7d7bcde5a7b44362cf9bb4e02472e759c2baf0e183aea740181158e15929bcebda0c28adbf1a053fd1cb8066d1ab82b90ca2e3022f79dbe75d9ab9ca7f17d7eddbeecddae98ce502618fcfa499d096f00ea1d36d40532198c4fcd0ce9476de6ba9ab2234cc10cbf2a970096025eb0a47f13e28e85f45619a75be07b4414fb8ad6bcb918211b19f58cef596631c03c606dd024a3c345583369968c5462da94ffb4ad4818e5f74497cfba7df752721b275f973a231668d6fb45882714a008c8a9d6e505a1e5f63b1a6560c4a5dee4cb6dc6e1b968e9ef50d5cd9957589640151dafec683fbb885c01e07ae40e5188cba8263828f1d83944675452838cbff0e8cfc23bf66ed13e25c2b37152ad34ee9a6b0012ef6a4be720049c3c422d779be234904c26abb18836e170ec76ef0376c62ae70a931ecf697241e7cf09b777b16ff0aca57f72f6e6fdf28b34e76047c1cd6c4d77baabdd40c9b3d98340b71ad2006869c06750fbeae95a74f32a8d7c402eb3a5e2ac7de00d84bee3e18da8eb6e32107a3584c24af497adc09f96e30b82487572f40f21921031e79962570963f6739d306d4e536ea47750e0a2d2fd9ff8c93646f459234df96fb25c9e23651efb53433ee03a60d16b06d86795552984242f8a949bf0ef8e498c93bffd892876fd4fc6f836bf870dc8d4c8d7ffa4136294c9c6ee338d02dd51172035f8dedff66cc77cfec964428e4e5f96944a3637b5bb469fb65373f9b5d09ddc5128bb0827da68f9b520cf0fed5c05c62efd8202e81824697f845c3092289f2c9405a41d85c692b1adc5366b758265dc2a922e01942bc1a8cc4e9c441cc9899560f800ac9aa1d3295b3f50c1e1420e4cf99070b02476ccf20f0abaa09043fbab6aa87711d0fca8e54fe7a4cfab2b5d9d3e81109b238994c9ca413de2a72853d2f37f7e09b3579269fe6688d12d9ee2414bdc843f1bc4c79480aaac66cbd720a0adf56be0cc132e2be9349362f32d1addb41b31f867b8c3e6b47f7cb968d0e0a8fc92e73385efbaaf82ca4b11964695d6f9b5a063b1e61834e868255728c6223051e0667e7b2de6697da02659818bb1a1af44561d64dd3303aedd4cdc660753eb6056702e165e2fee1c4eaba74f6d1cd2274fd9620afeb2d75a474995bb14f44e8a7d8aced200f5a1f13e41874a5b25fd042090fe1edb06247d4ea23f928f91be42be1cdd58b6e6398ee78e762ce66b66c87f132e1ae2bb8faa5bfd2676c7aadf2ba0acd5f4d06ff967e2f8f0418f6bc3e6a3e69e79b6215d53e7a0d6f26dae0597cdc14540ee0175fea9078222c69578d14771bbd5c5f631fc8a33ed7fe229e6398de0a7b7802943c5b240b86b1c771a3ad24af29982a88216ac3cc689b59ce563799179e31765c75f971aef75018f1c65ccd8ff4f7c96e234d611feaa687587b8093a483e1445952eb01ca3cb165bf3f49fb22e62346fb6c98059f25c6b4231a9c5617f33172711b5a5cc81e7bb5c3569d35d0c6c1a819467437b4e1a4e9197bb26adab6c80a8e176d080e655711e5528004015e7cf8aff70980c6e5e82e21e5eb5553945013978f4d8f06d9ec800d7d19ef1d74f93da4c87e673dfa398923a26fa1ec556e9674cb21791741e30a231d917e8cd1e37fe201fc7581e83f0408f865d50cc0cc9a0d13124ca867e3b70f7b0f39b73de0c750eaaa30fa77a3a6b630f57a1a9f12274aaf489223119590b9dfbca9047f981cd6cbb122106e0d771691491780b8e84513e6ead2ef08a09c0990c055dc61b5865ceb38d32c97248010658634a5d3f4fd500221957414aee4e8d842c5a8a9dc0dca9368cab4b891c88df2d75af1bae156e94914621afc646e3cfd6a82ce20b7ba080b698f129afc577382620fcc345559c604ecc1498a6c44ef486113b88eee94ff9b62aaac050b36ac5b4fde9e08f80dcf7ad03a69846e6ee7014f00ccbb29a3958b7ba4ecc1696c1ec5c74ccfff747aedf5e956e2b311f20e705cd2746e0ff0b322de033995bc01b30af2e3c7e16ea806bb5e9c1cdffeda4addae101771488242a9b052fa4aadfe5171f72aef7691a00315589580d0dd2e858f70421c8a7d6228681c1699a8e36ae241fea9ad858269cd4bffc7744d55f4a6cfc8f1ed8256964fa747d97d77074d4dc331e96ad8ec0b4aa57abc61200e3695e5dea4f1207a289dae5c220e7fc0b07a3fb6718f35758f646bf2fcb00fb1fb3a19dbe3902e921ffcc4817ab488b79a51fcb5c98265c5fc02e48e0dc7e3e64c7db2e736327245845333de68d7599313ba44577aad30855a0c5977791063543046fa29263fb63c5e89419d74dfbbfd239d5dc30b775d5db16912d4c8f159a4af7d37ca3a1fc01eb58837e32634769dd3e290220447b6f40a0357ce80d48b7dd10ab2f1fb3b589492375ddb073e521a2a71259cee8701f36cc1708d2b20c3889fd5b3c7eff94846fc7efaaa9e66171d30326458509e0701e08ba438503dc76d20c68274a0c257dbfb45577b73128c4dee0e957fb2f490c76d493df878935fd35cc6661f96ff4cfc9774bd740fab7a536bebff389cf164ed1be381f42a8a55625cbba9f15716f050d9f472bdf99aa9d6b0b3ebac97fd4a1af242b955ee8a70c3278f91116d710b80c8abbe7fb946e17fc34ca1032a800bf6fb4c2c424cfb779ec52867a7607665336c82ebe2d816eaf6aea06964dee26f2a3dea24e4cd45339a3f7072ddb68fc512ce61400ddd748be279958bf73a8b3e5ec005e762f8d06c609c4dfcd9f923f4c4f531042950c78eeb2a154ee6c6e340398d83bee55604e998e4a94bc3b099bbf2e9d8805dba76b9bacb07fc560a533d64ab4ef1956d4a74e9206ba8c4645be044b340fcd2a2ebd5f76352db718f41fc87224cc899c808d3fb577b5b049cd02b615a4fbfaf908da94afbe0345fdc164649fb678b1aeca7cf7791c1acaae06066f2e6ef131d0cc4ff599a984e48793be3523d85813f63903005d624e3deb873579e60073e449ff89dcf48627353ef169b4bf090f331b42abe4c2f8f47caad71c80ecf7f894bd0914c520d26e9a8c51136dc1d6f291767dc41f5a3e7219346c37fea3b3f3c5b28f7d48af2ccf97083937baccb0a6b1a041080a73b15b9640ccf44d9ad2e9f9b2e93fd21fe3debd3b203336402490162142d440bfe01576386fee1832b36fa346acb8fbc3a5f07f8d9cb26abca1432161f9b55c9f49343b83cb81c91c03e944d64085106ac1b950880521c2a2c53485fabc17b8825b4c48cb666bfab712fb60fa5b30ca45e5adc2a2f00dd892fee896442097ef09a4a24077d6e907848efa8a2b4328841580225876f3d306fdccd3e4e6bda25aa5a3ea950183a58a14c67b22d19ef8d83a0fcb846c771df8439d9ae44af9c395e6d799c900f30decd857f1cd85d50e3124031dd91c004b07151f8236f94b883b3dce245eeebbaeca5fc202dcd07bf51974088dc8de05f6cde2913e3f6a494c852ae60eb93323f48d1b8302e319fa3a1baa6e8fc64b2e8db72cb1337026799d3e3ebddd7a66f27bbf8c198672fad6499227c3b863ebb08c4d63ede67bb642f6b0d9b40525027d90dc2204120ecba6a0278ca68c2428527f0b28a5ebb4823bf5778c771a2b9e4bf06d9dc12a1934d1ca3639657f89997ae28adb8797bd22caf60cd77570f082d406ee2fdf2314aefe4468ceaf0706a7903326fce19ee8008694eb4b1dce3668bc40c888ccb1a392729b19acd1b71deb490d6a1d7255d7b3e53e9d47fe764fa85b3a9709084a28a7d54ad3648c0451dcfbcdeebd88510ea56d7f8d6e861dceda3760d451105126279cb020861c7324e52ee10f4db214ff6d85c4561f53091666d7300ad1836b2eca4f778b72218819ac5903665e7e162c74d4a961eac3dcc8e6c134a50abffc94d8540d7ec939b7a28b10916e505ad90843d08b4b51770d48c27beb2d8d548a1b0a50fe64ebb3964219ec1791d3c6d23562e0067cd3eb1f38926dd02ea9bf9803b8aca6e86a2d889ac122026b494096164aa99760e27e96fadf2d6003107faaf16bedb373b50612ff2978ee753156993d7383bab22dcfe911f121375522033766ac9a80916cebd9f1ab47382a2c87500d6614eccae65daa1080efa28f8ee8c1c5f319bacbf23d2214df237c048b416f28aab3aa25dc863e78f6ff5e3c97aeeeb1c801ae7dd578afcb3d74269eee132af1aa068f5d40f83aaddbc6b6c6dcb3f29ca3d8f841873cc7a73edfc453b58b280afc83e8dbe422134197dc48c8de9691f90f161491a7d7fe1b6bcce1bd8207fad71aa2531c16725cb6c3b670bd1dd52159723f8ff88 MD = 7ac9b2b81f25cb0c96971b4647943822bd86d0006fa26049cb9943a09dff78d287afc49831f5c5e8b225a25e0dadff44 Len = 62800 Msg = 92e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4cf4640c9d01812c154bc534be492065a85ac33a2efc853f7a3e86264c781218f639c849ac81fbcffa3058b496bfc94a582e9abe873ddbf056df0582aeece0302e16a35f711e5df88f489576e60c2d3e1a0e8d2f5a50fd7be5a651b5cd6bcc2bfb733f757440714edb79c3a3369714eaf5e2e3b5309cb387307cb4e6315e9fb16638e2b43e50fd7ae6ac2c620fca46f5f192e5778f89c7bc3d47743e602b216c764dd54456b4ca23b8ca16dcf70c8a081606db9e027fffc416f1dae4e43c1a01339a604c44d6a0f25ab9ca3978c6aacb6d270d510ee62544c3602e0045f7521ba508caf4911d478fd36390a01a5e6ce5fddbc2b93d26ffe74a7eb8bc09c69160d57d5d66c4f086a12baeaf39643d99ffce0b43fe16a75652b531bf3eba109e78cae25fc765b926d06a84712ddecbf9c0e9a0d94721d2f1300c638daedf3c420c8c201942fcdff0c699cc1ca4107053d15580cabce70d9a2755fb683501b445c4241dd3fc12caa928c06ef9c5839570d91a955e87efc117df9ae199fba7df6f4799c3d5202ee11ca1e55150b9bea0198141c5dfcdc1573102e2fd68275925873ef3f966d4d98e10d7125f69a849fb1471d1fa93b9e635b03536371ce1a0ee57503ba6cf409a394c724e7f8bb9ad0c2950d21bc470e5c55c229d77ff5302a2a52678b4598ef948991ba2990014713d22c74d10b81d466efd711fa557a209a93a67b20a49e37e24bf7a14960ee21df5c67d48c1b7e692975acac4a96df93d6cdebcf190ea6ab2358636af5cfe4b3a9bdc1bce160bf350aa3cd3956b897e255158cd3e2e83481ce3b6f778d418764f992d48e4f7fb6d080e6b3799d3f35949c17241a0cc5ba84597166779e6a38ce45681ad944cce7c432baf9cd8caf2b33125f2c12052bbb0b3b76f2cb97be9b4813a9ff1e5fdcd478769d0ab5b36cfb466e3a1f4c5a8eb88f0ad89ee40793017afad51bde0f240f75f30950b2901d3836f65478397b7335984df2c5617cac1dcf5175db98b136fb350e8c7644a114349d411ac159e65db4bf5b7200b4554e42cdce08c8cf049a1a4e4f92e60c7506a2d1e519753e39b2a85cd9b2cb6d201e02feb70a6df177a1ff2a2cb92a5a7a48f58d48cd2e46d42693093f51affc7b7ff0caa307359068f32c412c6bbdbf2f7f9f17e2923724440e173d02cb08d2b6087eca186bba3c7712042bd5371abb130f121a49253a2717fd7770ba8b70906e3c1f659db4564620631962ad87bbdeb37bf10cf2e2a1efbe59663ccd1f61a6028f5535998da45dd38afe5e1bfa2b8a8f4abe586656f8eea5c65609c0f376942176b2a292342ee42eee05a6b6eae44f04ffdc9529fec9947cb8b9601ca409eb3986aa452e6450699100e1a4f4f670acc30fce3ba4467e81919512c856ada60bc933be95b47aa36e8857f5015c894b2437ff15c46bca9236830ff4bb057cd5764f02720ccb03b2539377b224643ffe45e24245b7e707af13cf7dd1a09f9e12cb39774722e88be7b930d4cb869276e472407dd09ebc6a1fa9e5632c218b9de87b1706a060737fce2ffef393b06dcaa839d10648d1427e8e79535486a65fd8b0f67645305e225bd0083c589d3a6ca7b41d128001081fc15602a7c653b792eb16ddc59759644bac97d2a7785a7d059a829c935fbbabbabf10c6413d25ddbb5184918381ae2b75ee702f9ee75e00cf1fbe28c209bb2499e44944be3d7f713f8884924ea8810c279e137fa10a1a5e2fa3a1522d22921b33bd69fe7d2bb31aa61c91807560749ee737dc334c6501fdbdc2e699432ec2e82ec6ed641c9c8342757a25cc963e1b5c1b4844faff9cb767eff9f87e9272e023d18d6e160b144281241ddbe73fb5c7bc5a4bd82748f5bd153cb5516299b35c46c26d4674c707835f48940e50c05c2c482abf2058a724658e3a917bf5c754b9d988031100ef0ac815396947a9c6859b77f32e97ff988d435b5ffae2a8b9db6b5488db486ad172837bad0a0242c0e6a7d449f6b99cabb4f8d5236e3febefabe3304b5276e31cf337dae9f2e8cc2de3c3d595c40fb04f1fd8b40b77ce3fb76ad4054605073a3ff167bb96b045969c0192047cf304caf14285409e941834cf8c903c1f6f93b0a8f1a5b629ceb34269c474e95620334d40b16133433fc83b8695ca5d2dfe86e6e668442319aabc5035a0feecb7c805d79be0fee4aff738e47afac4d1084e6b5d76e9f5aafce0cb307e3b9287184716ca9155d0dd2b46f4a02b30224014bbab84e8eb2cb639ed6a73a1d8d2610e49c0c69f8479954b9b85ff05da5522f9d2e1edaae04bdd673d048a5f1d30d2f03c9e3c34f14ba597816761a96dffe22e3088f84b6de578eb6c43f4f47d2085749c299be020d97685851378644f650608311b5538f88c115cd78334108d33c0f1e4ed762f97a5909c130493e50337173e711354f1f4a24f322b4cd811a1ed4dfea3445b81da327c41b7d554aa3de89e375d0ba804f6ca8ae1b42b51967fbf64f153d8ac754cf2a22cffe02b0243fbf369715eaef083574d022e99210d6b2cbe807314e9887478aaa437cf97aba9d3cf6b4a96da330efb1e19e700c6f4e8a7a3129d83b319f546ee5e0bee1b04f4228aa3355eca4b0e08667f7a0cc3db9cc2bb3e1f9f79c823cfe590e8e6358ca74aadb7edf0ffb71501cec94417a82fec108f4985e2ae11a47649036b2277c127cea10fc0f7daf5a899af7df1bbe4705ae367eb7cd7d064dbfc512bef3d42311a211d115afdfc852d229113ff53e93b6dee0d9a40f971505ea4c6510191256ae2d47a73185dc4f4372f1c01c98a56ef9982c8bc9ec221529121e1392ec8b1cd167b318b85b1d4b14b2198fdfcd99e0b623421e8d2bc30fa17d66a4ae34e47d62967eae12f749c4addaca03ee5ac2f2d5c84b1a5796240a55734a9ecbb8c8814a03cff1a82109c2f6322ba6b207caab3ecf6f0591f3ed0e2d3ef28b5041dd316ff6cf68e0a3054ed70165ff939e5614d980d569a20bc624112587f2a797cb94bab6a69b2344e46f38919f96fae511338f22a6cdf2a65552e96f315c37823bb2138d7b12dacb4f2e012802f44da6a01246ff09bae98c45a29d65175068cad59463c176566b01ed911a0fb6a0f5a7aeb9e75d27b7ef843c1c154f6256a2364041909bc1ee40ae67a36b8ee2225bb1e12e5b85284c6c57e2c7397539f64d8f25c184638162bf9a6469dcecae03e68be17b88bf3301c8cde1abf21ec5b9d19d2b1d2561e13b528c8ded567343cafdff57a85853705f6baeded026932e269728fb5c5ddd0700604d8a36bf69c9ff0ad3ebbbb28808edbdc2843fbe1d9bc605f83c86131e1b3951a6024c0117672b74d044be7da7233327d178ffa302341f84d497a42f6d466e8c5c9d3802c546d5a3be0bb8a3f8e8ba0fa26518bb8a23bb7d86b4bd9812af287b3a0401acbb8e85ff65e7b20bc38009defef193f0ff8d2256d43ad9385580ee8507dfafe54066c3f08c81b39d5013a9fdadc47729a79dda7987d200f67dde49128ad54b979df618defd80c341e6c820d27787cc4ecc786d4c67233bbad4f3c08a8c8fdba91b670b317e8deadfcfc7f8c724e29a46b44963393bd6916ca0e7db56d5b56a0300e12551d850315f5139b8437b7ceafba73642a6cd920bf52ae222dc2deefd8d948beca6d3709fa9b546e9ae45fec354ef6794fde300b03bba0b1e855ce29e2f218eea9936963da64315126f4a0f2e39d305e0a546c78827988a56b9293a54d1ed12a790cb69123c42cfbbf0525832929a38af06be909ba10b8852e15e9e285b413eaaf458922654fc9b6d982581d7478d2788881203f2925c2d9b63c1b520b5653a7b2ea6b881d7b7a2aecf8a312541f4fbf3930cc794e0d4a0b8a91b2847c7a12fa2a47d842cabbc0b09fd4b10256617db788f72858975b90a3119339ea27a3d45a7c0a49e2eba53ff038a2ec7de9f3df0a0e40de4da3753928f1dd3c03bb480a313e9e5ad8feac3a626dffcfe58d5af62f2faa58d8e10ec61591cc136195eb4726e86065957255627f9627c5c9ceeb658f73a0227ade7ca9e177ec6a744611fd93e01d04c8f5252ab047c788ab1d498fa350aeb5b40a3367252aaaabcc5a309010dc10b2b3f590059d095b6309f6d9d7136d329d14d2e7805900a351ca30ebc11622e7fa16d22a85ae41600f56fa30fe582fe8530df6fd87e5c052f6fe6897f32c6b0f354239492d5c8651c81285c347d9ff1c421fb4e9e053b035f5f97fb998cc0af31ec689905f305ecd27dd28256621716b14babb311c4b76c8e92bc4e5346d893ff1245184bdc2212ec9176fcbbbc72d41357f6867ae057a984b06069f58996c4266ec0faaab7a73e30641bb2abb23692b1ece5af2184a32009628834c77c83ab6ea7e4256bac1dda689fc98c706cedba54b37e174ed6243ae5503e97104826ae9e65b682d5e50b4d5ae9887251131eb3c453cba449fe615fdf21897a1a140736805240f93287f9ffcfeb614c95cf52e5c975d43f5925e3f8c17d72c52b09afacda148973c8bd6f588e4d5b0285c710b82bc1a0d1c873306b510eff608c4fa576755399d6e1adf6c061b67f7c6924e094b1de3740dc0fd22258793a33850d71fe19b8790cc37f159f0eced4a3890d4ae12575a176de2251839d692b275d6b9caa8dea30fbb65c555d5e3e625d2cabd7074d2de65915d333f8ea84d9225e92ade49b92c68d046c3d6219ae31939b260e6ef1af0fd3cb4b02e805724c0dceaa2c13095844a8f3d6551607c54a2e1fa5787edba324cb46b145bbb7dc8cd1f6daa29ea0e3b136cdc325e2ef2cb414fe509ba0d2af2b28d02e85d8c86aa2541e4b96ef28dc151ed85a362c9b8b772f8050013a9d7e2ed4afea49a900c395808e25906d69ea78485dc40f5dd1899c65efcd32b605b634b62b0c199527906d3c8d8f18802bb6e39ca32838de5ace29a091eeb57ad20046b68ebd7d040478326f64b1b79035e85d02f4af3a16fe0329c7b0dc11f0cc036bbc1e24fe5e6024ed035cb4f4055027ef6296809c6c84d0a1c292bfd17eba68abb0256a230c033ba6dfbbc05848441ba0a4d2c5e64ab6dc9b797fbe7a8e66d60e7ae9b67574b56663ebc9fc6abfd96d78b0f0a3a1175ad01ed4c101968796f69d03b3317bff3e4d2e0fd091b2d3d6c57f6e3844543a395333bb9fb1acd113705f31ca02bd1565970e3316a7b8ec05cabec7f2d0871d1b0ee11660f645d4a5eb5ded7853c31ff3ed0c3fe46405732c253ca1656ec227c8a830cd4df7e8f7130f9d2003491683b1f62e1b82f320ce147e01e6da478ec007ca28c8aedd1da5278529b0b40e3dab645b7eb0387a9167857b167c99837250a11cd2efcbcf6d43a7f50987d3cac0fdd7c304e44e22e1a547c7824dea49f73f5f45352bebf65e3a5c06438ba8a428e3d1d7c7a00b1297ef21084d3f15c1a3f607ee5962577a7af20e61e1a67ac5fbc4193fcfcdb9733bafdce7803c611501db61be477d588249d385aeeabf9355c40878a224519e6c554c400b222b186a9657375e066534365246889467bd397b0816b6a8cf1602266e2e151d3bf380ebecd34f759e0033bf1db1e1bb5f8ab55f51589bfad7022fc80dbd23c4d47ee1bd8ab572ac18389f45327d56ccda0d4f2a2635ee4044ff6c7bbb6132a9f3b3850bf86668ab7bf4beef1a13b06fe12e4e04101579211ef40067ff820973a37ab3fbbf4ff919cf1cdae65cd9b64b7ad5fc14966002466ec834b3618871cbe9bbb2b566d7ed9f1d97395280393209b0ea9f83407f52573c65508869db3259cf5ecb6275650be46c4f235a0e9aea508855807896d831fb8eb29c0da0e314c45c4c462a74631c91c42be2268f64a8c90cfee71c21d467da6e975f6b8d08dfb5986b6b34ec38e84d2d13bddf8bfe321c43ce1b9768dbbb9de3fce3c9b9b35ad38ca481a9654c37c1b0effbad88d250f035ab6610f356f6ecf5c96e50aa4a4ec73fe0d2b06507d19454a7e5b71047ccedeb7e0eaf4babe06eade64927ea378338b905a47276d17e6f2224c326aac56dbc6c305c9ef74441cc123cbc7801e0c1cf03fc40171f1205fa204cdd21dfb4fa05c0a798027f87e1ae2db10e6875afd03424aeeec6e9322fdc58087ad1357d3c6ff0cd0a066cde88ba042e8921d00a770e2402f6a75a99c4bed241e35e3686fba30389facf45b0fd9ba29c73cb995b7f050cdf9fe3fcaf8c4795dd61ef6a38fe4901c2af88926509f70ce1158d5909b1c2e32f32a257dd4e20a9c63aac58fb0f08f3627257dc6574774ce7b790977cd3edb1d9f70bf189d4f016e2b6be8838f488e0508b64a91706c26894a1fcdb1cad2e7fc53647541de460e41b1f4d82557672d07442d884e586816bd21af8ae51092b54db377d08ff47181c57bb80cfbc5d6ecbb6dedbf236be5b5a886bac9683ad8f380341d69399c5bfc680d480f6d37123dafea9947d7374f93f9edd411d1a620033259e7a7f5125fde87db0757f047a3a0434e92cac02710221fbb6dfcb7ef0264e2994905491317c8c369786f3b63f5a5240e7cb074c7d1f09893ead27171fab90f76c4198c0afe1b993d3dbd850892cca0aeb9717b95ff8fe2fbfd4b94eb73402776eb4d54568d7787cab9db93c2058777b3dbb63b2e13408d57f7c09897f6caa92e112928a2404d0d966f41be1cc855e79245d749dc97b2f63c7cba03140f8922e0f8258f6aa10c9924d0788a7555b89edeaa6d0e3e0777cc2dfec05afc283c2343e2daef1c4a46b8fa8ff87f68284ffc0d5bd01edeecef6d80f05c069cdb3408db73a1ce33868bfb9bf03a1361ca5c8d82eca8f22bb28a68e9f3f5ac92930161fc2d22a34cf03ccf6d93c5ccfeb69ed1f3cf700e90e2e92cdd6c15a369da34cd4a61d614d511e9a2f3fd2432ab775757c496adeacb187c47bfeb44818f3b4e893ad4248948660324d3aecdbad487468d69b4bb0d26adc44815d3fadd6f10af4431d6a687236729b3610b2aec1660cce177bc3ffc302d518c83b8b0fda604e77ce3fbc475028fbddd4094d43cfd8e5b02631fa52e641194a37e2bff98b07277a1b5b616f9425a4010d6fe5223d67a815eb051731a5ee51e2b59904f051b03e0412b98068a8f5150ecb88a1d474dbfd064e3f422467d324e62ca7827e94213a1d9ba042b8f260f50cf59eaae0ddfc8b8a3726a5b495b63b608355602abc23c5cd9e5acfe9dc2eec0473f728cedf91fba98e03656895603d57a2ebc77c317e841d032d4e83cc26a4fd2ddb4227e164f46b3b1eadc9d099d3d471b1defd5cfa2114b262e70c2c11c2ff0a9420714d3b1fd926bfa35eae28a5ded7eece34a35f44bb9440c40e63b7f112f569eb378adf24fa382e6faf98d75a7dbfecbeaa6f7494188f110a10d9e0d73fd3a1cbfe0018aad757b23a44f46c9bb90ef1d7e52902ba368c1be49bf6541c8d8d85e75017ad59766c952ca62bb00f9bad46406f37d15d1a74a8783622da69050b5d68b43768dbe1601d6c5ca66b5f2a843322d003a926ce2dfeee69c53c66ad357175b3c80fd520199323eecc65326f7bffa58ef352bd59a1656fbc4740ba8ff30837d4326bf239813f78e5046531707bf4f0337193c9c3b62723b810af0db32e6bd69fdd44d7367f6894c7b83504376a582c47e436f314568b31e48850091fcce3799c32622f1efa579e1f4f9b52cc32748050b401e25568d8c1c818ed54ddb7b64854978ca0fadc55bf723160c335b99015d848bd3e8ed457fded264c96f5d52c6c4e758cd2d10ca81f4ac54c007ce9f413660a32b1c582500bda1c36786d108f0d1235286fab7298e52e7526b1a9a8e7a1836127e1045a0a13176073a14f4f2552293d291c91f66f3aa7a9b87ec2e0b2e7b5b565765243cf3e2d5ccbbba37a38641af75683898073453cc7c80dd1789e0e876fb519b828e5b3a376066b6f780e6b6dc9794c9ef8ee2f75381f09dd58f13e7ef5dd723cee959b0118eb5bbd33ef8eab1d581fd546261fda648518ef68f39e24b0a528e97e271ed0a94433949225f55b5abda23852643ef4b3c1e20e90ee570008d7e4c4c0e3639791d79afd7df7c905e86e80ce04efb34a8e9d1042b828909a66394dd79c1193de376d39fedcac32312f335f9f4511a7645bdf4a93c8ea727b30950c29fbf8d52e05cdb8a2978d576897d6e8b4fb1042cb8350370aa87c252ad0b1c8c2c3e1520d62c1beee97e26131881dc2141035ab066fb880ae4026d02fac552aabde143206b60ff3ecc2f377156ad295c76ac80b9d86dfcd8878309c132e4bd9eb32d99c9e6a8001a30107c29ba5bb0bd6f31189192f8cc59e39e1b05dbc5a7e8aa978b85fe4dc8d1b3d676a4ba1a1ca4891574e01d48910fa69833595c049c1912a38afd08deb425d5c5c96adc64b7a252ee482dddc9c57a4f25c5244a1e149079c63a979cd74c570482c6e4a7d83c476b1fe4b36af8e42a2bab530f1c7eabff4e93fcde30d41c15ce71f1ba92c0f504202eed492b52678feabd5f6249a2cca60f8154495b318dc2a237fc5523db8c59109fc437c562ea2c0ac06cd65826e1354b12c361729c2bee1e29293ce1646cb6bae6fc179fa6c67eea48edd3de77a42d7fccecaf2d50710890ea2aea421810cd9d991751309aa70927db64d333116fef2c14128ad21ae7a2b8ef53e5cc4312de272a888d1ebae64b31ec646d0c80beface8ce79d07481a3cd4ad36a7f691dd98f61fd213b0840ec5a6f06ef9a1420be0d59bde5e43546347a2a865a94770eb6e78ed869dac82ab08e58bd711b7e1f131dfd569370cec6d4371655372356cc6cf2e180883594335757c135f3db6cce95e5bae1acfca6c92c0ef68729b46d1fa4b8433fa5d5d2228abd92b49e6147f7ed6c79a557102517e406b26557d026cf06429a5be840ecc0f0c9b38399357860c3ba23ebbd35b377a3273237eafee8a33997d01d7a0048d532820cea0ddf65d2bed89efb05f2b8b2117a5f4509c71c64e6bfcbcd839d5029f7f1863022e7781486cdd41d58d09c90d7061fd6ddb228dab4c375b32a9d6a83e81c079fffd618f0c4a1ab99de56c7d99dd45b338e4775cd4caab417988a00acac0d787dcd34ac2c205d0db6be0ca2550aeafca5430e6b05557c7240f5eb796decccc213b3879e914108e1bd217a93ccc752e872249072497841967768493d8c505fcba9da5955e7d0aa0ff62e2903057c1409e25a54f3635d020804192bb4d17fd07d876a3139f6744c7ea90ea05bc9d036453f0de25419abc7b02f311946062227bff48a98b285d6f4181ee86701e06bc286cf64c3ff340a967640d89b5bf1e06a783a6215285e9dadc49de5075f12f6bfb3dc887e5a7c2479427e353a5b5c62a3929f1b300347727c6a6d2d07db271936b4aca19bcfb89e77fc32717dae0d50d9f46cdd71ab09fd6bf3d7e7efdfe67b2e7187d6a3c5b223988ca4b3edbccc511586e8cf61896ce58145233c48d218c5afd1b74f1da43059e5da1c2410ed630d5e305d1a870337d3c6499953981c859ec2bf833591d3fbe865cee2ec71aa982dbcda11e56b82346e43e780556a25f5af6d2032b087bcdb7921513d3295593559376c4d59966f295fff082269435430a0badd0de788c697b41f49771e06640038d8ce599e8f30df4d0292c5b8ad13fd18b1de5c031b59f94069a0d6da4b31c273a6e97ddbde2f1ee1556fb2692fca26bf590b672bc9ddc7c6073ca38bec2a42b1a9a301390cd2adc3ff8531a552df713eba4c758819bacaedff07255c71b54a9beae52cdfa083569a08be89949cbba73ddc8acf429359ca5e5be7a673633ca0d9709848f522a9df0e7900045d97c69063c8abbe80bf208fc023c66cf84a260d1244a29ba51bab11c95935e829cb68f3598599886a2678e0bc5d8bc014acdb59ee6ced6e1512f3b470b0447e1fbf0a99c71b3a75294fca86fa131eeaee13c34c17f25f086d8fe890ae87150e68fb124b539378cfe5c27c4a214c6732b00646ae32dde2b3d61af26c28e590e02b07eacfa8f43adcc508f8f2d9114de07f0ecc46ea365db5783c791289d29d3b916cf8ed6c4667e6f2a8a446cc69bb3b86b2bddde404b7577a7ce54877562469c2b1a66f4891e933942aea10a05c968cea7a813bcb4fdae104639fd79a7a0db0e55e5b1be3dea70bd2173116fdf2c71bd6ee80284520ad9b40780d879c45405922fb7ebbe63489b8d4f6e0218c3436307097226cfa7e18cc5443981f22c0a5aba2117915f89c7781c34f61f9f429cb13e0fcd0ce947103be684ca869d7f125f08d27b3f2c21d59adc7ab1b66ded96f0b4fa5f018b80156b7a51ca62b60e2a66e0bc69419ebbf178507907630f24d0862e51bec101037f900323af82e689b116f427584541c8a9a51ac89da1ed78c7f5ec9e52a7f441ad5e1382e083a95224f395dbceb69fd87c859dd1baffa369ebd48248b142cfcb2d0a1df813d178f8147148223312135bd8ae4c3d05d8ab68ca9681d9610e1df08d38a4ebafe8cffc0e04ada33be446d35c93b852f4c97005d2a05dd8d88649523c7e2ae61b5628de504228c73fb9a4cf56ba74dc0e5e8bb192a688bf8e37ec70c92f226fec961e0fa9ae3c06c4eea7b07596e400c8e4790c990da506089f71dc91e02df1aa251a10689d6a0a420fea1727cd8889ab07a277444a1544be2973e64515a013ca8fa7712bb4351a5da9c673fbb2f4df2b44a27222d05be445626d3e41541b3ed43240b251772fef7e28d7575fdb9b69d007f39db3550b6d04d6b835251011db4db96054785aacd20a299721c2cc0ec22fee104a843c866792f2ff7b5ede06819d8190c80ed34e6aa8087073d2f8a17091537319040b7f4c6643ad615d027bca4a275c8d93758721de621dbdfee5f5ddbac4b679c1263883f5454c97be41d40dea172e2594c5e99ff3b2d970a5189e91f2de34fd3a2154b6d674578ed100c1d4e3dd70209128e82dae774e2c6404fe15dffc8903dd81464d706d48a763c3a7a7ddf6ecfef7230 MD = 4a86527c19095982e491c56f5fad57593d827683ae08f0ce40b607a49ce25222abb4b96762596e4809574222307e2e47 Len = 63592 Msg = 999d4df7f8667ff969f27d5a796a5d2516d59741a1debd4d44d766cf86ff6c8e1c00573c02bc1858cb49fb53363ad7f2012187f302529ef373e9578f8e0ecbca5a7767aec42f9c37f196d86cd3aab6cffa8472f7ad259f7c3a731c138a7f44faf80965976346735c82e1feed783f6285a9073e96cbe227af407f9da3a3db3de8a1bf393d0a8a068f2730541e4f8343dcb5b1d415840e9d552e14c28700a8205afb9fcbe9df81bb9a888dc2467dfdc19bc78b1cbfff336b36ab3b7306cb715419aeb403e20ab5fb444cff30af2d35458c869bfedb65d8f81a60fb986929bb41ed6303ca72b4ae2f541c8f869f85b435759beb63b0dd86acc9f45c19f944104f9dc29606df05f2bd939f43ac5fad01fb1fad83318790c4ef0a1066defb44f7e6f37274a172240b0fc97e258b37cea4fd52656952a8a61a29a75c22cfba51f96eb51ca581733a818bbd603d096e1026a5d56ba7ac5b4610c2667f97d57d919d4fac6732902a6eda9b39ee910f4e9a0e5a72664529e8982f221022cdd68b2f6bf1a0fc22b4dee9a0a603d02c861d95e483effe49b096c5feb26deccdbb2d51ebbd59827dd7d9d25a14e4ad13542428318a15dcbd28aff506d844869e6dab20a6199ea24be06152914ca42d5063ab7c7bd6aca8a87b794fcdfd5e9748d34dc3236e380495b7bf91ccb80bf9e999fab84dcf7c0913903dfcdd8a84c8d4d45b62ea25f04f63443bb693bfe1b9e9e058052cdd4ca8054f4224bee57cc1495a1c2784a48c2bbb6f1cea6ec9ed14551f0f8ba268e62d86a0d2edf6780e29af4cd9387855d442a720ac54e63ef8b3373e657136d8103f9e6b33820faa04a90f91dabd4e9f92392e3f311d8287ca3e9624a3e0719593865698ae0991e225e8701367df8fe98cbb58b4f46ccb0a2b5c7bbb10ffd90737acb50f8bab028a388fdab9c8c5c29d8b6e2e673d6a4830e3b5edeaf6f7f897c356c4b9128fec090645556b44996f2257fab740543e8161b9f2f4999bef56ab012e8a7c8bded6c757b3ea1124801ee0b808fc288012fe0677bb98b0481079adb7dc0f413dbf492cf280a094b1a4583f764003050a0b4885e3b7e2184582eb03ae085bf1715bcca0a15580da302da4a75849d6c13a53e648c68fd9b7da6c3417ae5977726fd9e78b2ada90ccec438b8028cc7d42581260b5e7eb86764ff6da4f7f776aae7f62225556b6da522c0c9432ac70fe72ac6f3f361071ef3deb4a6715e80b3c8be91e0666ed92665537b34725adde63377e93093207cc1ef5f88d63d0b2bdf5f3f4341a26b7153abb565e2cc1f2bdb47b15a6491195a21b84bcea54e7a5349ecde9cde6fe7ce8606ed136cc6f45b6f725bacf843a829cecd48087c4c489193f011010f35403b2e054f062ae956c71361db536441796619bcc8b8c3ace2613de76b126c891151cc057fb0a5a9d3095784b4e04100f999a305327223f6d44cb85161436ee1e7ace0a5e395859ed59cac697cd61718a52eeb1539a715a09aae83bc88169eb61fa6fc650f37232efafba27e97974eef08a0628b32da0130a211309743fe749c45ca7fa1771806d09fa0ba3299b660faa09899c5b28d7f2d971f4f50297d78fae6a20b09afbab93a50165423f7b5e5c1e97201632d34080dc62320a5bd1614687ea7fefc1d91a2b2a8d710d1361855eb5fc739d227500447cbb764d6535aff5b6a56fc07452f7bd0066d60b8d95039cd7ff2939135842c6214667c8090ae624a56396299baf67d18f543d44965eff9eed6aeaf2ebc22c8f34c9ae82309a315cbbec9c351e3994f03e1f4ec11406a1ed5d0360d193fce6261b0df283c02bb62360072ae9e535a6a1778eb089f1d31310919331ddf34e991340dadcd4a3069d04fc7ee84fd9eec56da26a0ca4130e7a8fefe1051ff3ff6ddf09f8147cbf730f84f7177d6ee0ab17db257b091b64fe01f3e1b7859d7c598911e02e4183feb9342dba9b924ee3b3c773698950f5caedcdc3cedb586174a216312c450bf246223386abd1cef8cb4ffbbdd65c883a2f2109871e162773c5233bc855061cd081f434173383da737ec7dc42d5bb5af37ae3dbc838309ad95524215dc336192596786169bb775dc7e6639189cc706e27937b6b0c86f1589d0eedef78dda0adf96df6e003a97600fdea6b421a24416bde6231e2de6f210ac7d6c5cea10d0b7e55eeb6d96d66486b1c7126197e46f7fa20ce4d68c35b87575d97f6e661bb3e344001ff75305bb5452c65dd3b3c985ac2f6c1162445b2ece86938c65e3f4d0278c38e1bdbd3ef853636add8d3dc84316c6723d53febdd1864f2a17e5fc42c1ff2e57d5035de897fe840315f07e771469f7cdad3e13d42d37401ba651076c05d49aeb6e7a8da936d0055d9baffe4c75f043ccf5530c44ae5c09d6bc59ae07184252621275e4e7415297a8d30e45bed4542afeaa657075d15efce9ce42487a85b3056a75a7fc2943f09b9350aded44dc002dd140d7c8fe42caa9c350cd7f5cbab0f452ec632be5bb54819b99114d84e97eccf33d1c8e245f398101e83dbb1443c6dfb9fb5a0cb313e8fa3010aafee5894a78c303b628aea2f62313f91574379d6f081e36df1707ea1865df5c0d69fd37ddc1cf493720f39abaf0880807334d44140dee0374c36aaa7d4517efab272271b3288662122f79c2e289bca96590abb44061a805ad9a41d18218782ff6befbd3652d76d2c98cc7a7f75f4031d2e5098a9ea3eaa20c2423fbc1705ea18289efb96e311f3fefc153b673d1b155b1d8bd236935146cf2c98795a5cd59f8d11084a028e3fdfdd775b46ae2816e6994b45d1b4aa5b3bb0412f31bc98ff88a650b41343fb6719123125051ce0ef601ee305fdead665730b298ed0a874898cab0a2abc21d19488e451fbdf780aae6a340b54bea2c075d5280c3dbfe7977d95e36af3af64b9cb169dff653c8c5159eb21ebb97ca21096494e11c56541abe28a97959652d45a16aa8465ec841e5afacd2eadbc9fb36dcdb7c660ad297d55c1520fb69b0f395d7c2ce0a81720f7d098f7a376e58f9d7f2407d9227d75653f21d793f38b4d5a690685faf36f76df593c51c871bdb428efa221cc7fbeb0bf110a006b74ed730027ba9b1a6c7bef9e9dedc3e4c3cb771c654feeea9ef741547285b5de6249ebf33ea257873bc3f3fb46b3354197973e408834547aa8b092ec0b98de35e5281cfb57c6a18b89cfebbff9968f2513aa725d01583cc3c4710a4f844e64b924106ee01a2c626c7e283db2609fb9d95f8b7c3b77c48f0e1bc3114484ac2daf488c49692ede80734155539c23d59ba5a4c2c2a2937e33a3d52d0f94b3bc2262782115603ce4e5e8fbde9445ea411ed00ad8ae5afd9012ca19386c07bb852b19dd593a8beb447713d34c67755ce928a4b854a72a5c0113cb0f6a9165410f311b9fbb20b2e408203bf22536f321d7a267d7be14dc59da1dede04ee476f0631ab1e5cf309fcf38c7aa7ff46888e21375628e9f5f369b221a7ab469ce026d88d023d71ed01953da54a6a33e65fc47a387dd067eef01cbe1f1b8b245b8d0638639b99f2f69e718f8ae78868d9417f791c22066e32c0490208af0036908a978663fbb628a64d2c799bf684f685fa09be50d72d7567e0993e6cd69ce5d2855542fc9704bb827a208c66ebd27582d61daa54f1d81604dd67b3ba26d3caa7e9ca0e9be217f401c1f8286a3c135e467205ddb72678b880135f127f14275d77446049c081629aaaa10dee146baa29473a6cb8e5d991e5702eb9db3a231a06c701a27518e976f7f383fc3df40f195f0babbcdc7f8fa6154b9c326e69d82e6f1dce1b21038ec79463072da8977ae3781a4260b8d2bd47d078c8435c9ca7d6eef1f634cdfee5c7087f972cbe6d439afce9ab12ce8de6d99f8e4f57162116a61eea1689ec898307ccbfb073dfe3fd9265f0222d9e0f90fdeb02ae083bb5b90e674cab850d21eb1c4989ef8d8daa1d7c4bd4542b97e640074b6c40b12dc8e38260b021a0905682471794a0f4581e07bb06fccd975c9088882921c3ec7cb94aa483ab158716a5fd4aaf367122cfbe60d13fdfeafb4cacbf130cd98434a92532e758a3f383108e90898905dca345199d514f0428b1f879681a8eea2e14239b50cd5811483f1e8ef0763d794ff068ae31bdccf02375d0a52820f7da1df57c6a18b8fa9980058105a1a325075794aaeab269222a579175be53a9002fd063243fef4cc8a34790f8a10892d8466ffa7c6d93f5f72931af58039f250061d1e7bb7b68fb3aa4eb4be5efb9c7efad05bc5d954ae6b4533e29e8334f17a116befd92bb0a46d93507b0c92029b4a3a1c534def06bbdd26ef98bb6bc08134a94e40f5a6d47b21cda094a1300ccdbccdb0b0e710d6aede9a2e06f341c4e8a6582eda77300a5cf8dea8c7263f037bf93af6393a45acce952b59f2ef0c276ffaa5748606d13a8e1a50cede43c8ceed2c0954b8ef9570642b60d62557d4d35e5518860a4a924c5aaeab7c9f9fd2556b7bc334f3ad090ab8c7c10e67d2a2affde13acd2eed7a2808dc7519d4e365803d0eeffdb41da8631292d7697f087da393c692b1bc9492b7e0ce380d43b68937aa0e1517c1e77a61bab4295037a26d976a2ca99b7ae9e1df29a97bbfb5c14762fba3beeae2b287edf754402955487a73c83a05f132946f892d98c799f1aca6e979f471dee126d8f0139aa25da2a1ad1ff618301caa3d449e32c1a302c11eafb4692ab65b85ec745054afd955e6560d843cefb285ab8b6904814c9762ebbf69ab166c15c995ac63f703bb6d78e90ea288e1e71193fc26e5a562622b223838dcb7c7e31790da0daecb67e5e42d727275142f27d7ad67b7c0671c2be8a8703110bec3b743181cb85cb6ca56c8de4b2a8d116cd88b3db2e60234f9ce555d5b510ea9530f21c92255759f7236a0f23addf365e121b6aaa65ab4f33f73fba9c041dd61bf133a0cb68b026da8acf5d10833adfad62bdf5c0bbcde8c374460f569a985cd4fed15479e02090ab4e04ee37dd6c5b6931d8ebba9b386e629660ea71c2f0fd44bc23be4a363955ddefb338f606b42835f204c2f47e8b6eb5d048d29a27e8260fabd32498d56ab4e6e252c407b9d2d48845c9f20af0275821a4463e1c33ce658a50384e0248255c5ab85c25b94118ded48f812f6a7aacc93aa4e1a39461243a394bfb80f30909aaadf447c4974726a59f41d2a19f888c107534b3a97f5a7a22b0f175740782783e55089e372e366cd76cff271f16a435fc45e63496596a40ad75e33e8dac5f0165f467d7d3ea895bd2b23a06ee7c484abb313bdd10af2b0848fc83cf345df935dfe0b48d5168da94260364ea961d0f2afbcb98259eed174173b965a01e88eb760abe6117060584764fd5225abc8543672c899d96a79fb97cbc411b4992d9a04264f1e00d885d2192cebbd4dfb8519f7fcbdfceb8b1337c2a8107e73437bca24b7d0fc3f94eec3c7a110bfed21fee7de568528e044244e9db70828be873be7bc1b18c8f32c02f3f9cb55a22da69d8593870666df1d1409cfff9456beeed3b9775a0dca4728282956b3a2ac3611c9bdbd972afd109f4b2e01889d4f9bffac08fa7d99496111ca2f8660e02730eae955048fd7379c513285da5b095c7c432e9cf08ca38f696f4fcb32daf55943ba67161276f75aabbb2fd8037fc2c58940c13dff8d12e288c81fc6022acb8b9507aac88c5471af6466abed23fcaed2ec80ceb2cf8ad08be5a6a2e79d574904515c1a331d312d7ef0d90f8de3dbb7cbca8bbbc4098ac4d1aa9040f8ac69560e9d3e1f1e6b16130f779cc180eb23c4f74ee7f23b5596d6fefc0f61bfd669dcefa13721531e0a0ba920382b8ee2dcbc9f9d1ed9df5ab5ee5905aa6d06c45ec2f087ce8898df16fd951334b37f710f890be2b8da77c1eff429ede9cc931d50f059748cbcb65641d11c7918c31a3fc31283433b5ccd314cd0b7dc54e62e8a484d7292f725752a936f847a6dc228f5003f4fe831c7a753d56b4bf97423a1b34cc38209992c9c0314bf153dba18713acef8b6fa2182cecf91ab2c6cd0ecb33f6739d301fa37f58bcdaa19eb872cbdb7362501a194f70a4c8979a45ef0a72bd79e98aba1a0b04667c516d6ab5d68d4133fae7904118d2272c3bef9f75dbed222fbc6531115fd584204ed95a6c2337ef7f27b634c20ace0eb4960745e9e9770c985ac137ae188f3c293159e0341f5820b55750aa049bc0a5c23495dbc3b9ccd73443232048ab7de8f797839eb5f17a9f67382b52915256970575ffc38bd33b0c94141fad69af4e352befcae86a6ffbb61518bab0f0b50c5cdef8c98fbabc6e27283bfb11999a6c8b36b8b44fb9d1680f3f9793579b4a3e61bf2b67b2c8dbc2c171296a0f40d345659870c4573ccc4bf5572329b8f9687930369c7ebf4ec7d5460f7ac0f90800855ed1a66f715bc72422ec4a0257b3b65962c5ba6317b4e7122f439eb461479898d162d83a30af486cf27f8aa1b622ba3b540d03b95e83e00607ce0398ca9811fc67dc64a9079fc6a2fe81437c46fecabb9e4d16e5e634192d49ff5802b771f32c7caf0a3088b5d842a18233169c708e369c26427d616e18f47067fa769a5db2a59a4b07651689e3e875f2a7f529507b58f82944e4327a55f825986968f5c3d7044b310abb43747ff10673309c7ff6f88f1cc66cbeebe156a4a3f1335e4c3ce6a50a0172b7921e12e8bd545b7102dcac35946e4861f04ba186a602c6cb20315814413cddce84df335c154697174489fd08d9b15681e201bd2a865dc233f439a1deab33ba749e3057b7a8aa61f3c78771655710157323bc1fecef62842d5ace6a708296874e30d9f687d1f04a9b1e4d9fd7b71b13ca47d3206a2ba1ab1ba668085671c5d2cfff14a6494bc8bf718b54dedc5422c00bc0df850ed5ab9583698f021cf3520b5e5b78dd7850944f1bc125b4efd8c7a89c2149b46767d0d1f936abfe2081cbbf9dd88f12919ad3680e4248c88e9f9a4c1feb9a14e07cc1fef1705742fd97835df2f8cfdc21851698ad7136703522fb18fb82594d266eff6ae0c9197720bf2974e22ea390b4a9ce6f8de067528ffd6a9da377ffb395c8d9a46b835b1126631e830ffcb2d6a7737b4b341253c5dba97958cc4f05febb14e149d641a4977b2de306c0e56624866c9dba24899460b491a7c8ca7a047502ddc6b9d5768e709b7a078ea97b45f0ee0fb64ac3b8a1b9b750666c228b63bd098dca72ddb4613303d20c792e20cac22ad7556bb611f417306035b168f5bc3d3b9f9d13436dc56540b05254c3787d2ee95deb9b6038142fdc4bb647023b668c159d9f09cb15337ddeaf89a00dd4d58d860de968469d8a6a077d388b82df0b10240240c4c94d33f33a2a12f961d85c64ad51ff40fdb4bf3c3e6f6d0d6f53027fe36832e2c2783f4befba7ebf63f57a5abbd46db3ea102b3d0daca42b2c39f501d039d5c24b28ce0e6bdb3d7088bec7b63e0fe53f902266d2e1bf7e935df65b7c86e1ca01c7c168b14af6cf9b5486cd3da06ed652847dfaa457126ca4590a9e16541a502fcce487cae9a7b5be3c0ff3277f7bb18b4b954f17da4ffefcb2093585e42e389acf04a3b1e4687057b39cb22a47a1175839daeca3e7b295fb0d54ca3193a7b3d142a4550ca7b39fd66fcfb2ac95997827e3e14bdf0bf4d22daf8fc4a00f018261dc461441c01394d8a51b5d34c5af4498de3af53fb38124133d0cad5792e604dad05c59d7a9f2efdd17f21a39646d0d299d3a713c7ae21c3a2a7dfcdeebafbb9ad369ae64e1fc01322d069240fe4d52388572386bce921b00ec363bac65d9272069f07a4ff479899648ab2de1ffea94644b74b3243b0bb10616d7d2269dfcd819e883561f5e05e9681f627582f5af443b33b48a1c2cd97ec82ed558f3f0853ed5f394ba498b1ba13605ced1aa5c25f20bf2b425ba3065c4b598b1488b0a0cdbe30f972f650845217e9042facebfb91e74fce60e64c24b236ce8fe296246ee2fdf812d2de851fd1aa0435139767d033a04a6dcbcc27ef43b4c940e63f033b3bb1a1ca92e49f4bddd49939c1628308ed519a50ab959a2eb4cd32e8490eb5cf7fe2126adb9006d01e9e90566295a66a660426bf27c70fabb089f1cd3288a2f257983339d46b22763e0fd1d51eb837c047c0d60267eced2cddf1ee37ca37326c6bdcec81a6fc5c05e23045fe1c54a0d0378e9260948b9c7ae30c127039a2ce0462b5258878cb1a44b407d21885f04863df754223d62d845d6be343bfa651dc84e52cc6987361c5fc5c9f616d80159740e77dce9154590d9c1d7c6a6b39cdc6b29b48b7f7be45c6f582fddb43364af531f6ae1ef337979f01a0e170bd1c9df2562d11e0ed83ff83f7cd2b26e3cf17cafcb4111b90a66fa2529d1a3bfd7449ca3a428f2ac4e71866cae5302c9572047e6acbadabb2ca6a7e58bb2db5736c5ab42583cb7bc21417d6357314d3a0479a7943e08ab79fcb0f9bdba324c56629571ade97ccbd3132843b021fdf054e7760244f9eb128a0d0e761a3fc065220d6c8632e289ad65768e8fcf7909aa9e52adfe555aa29e4fd017939776fdc46e79935f7dddb3eb07ddfca83dd6f4da7ae879d251faffad5fe874d8920a4ad88049a273eb35abf31eabfb2377b63fee7f1b7244d73532de2eb8aebba67428100bf0226a0784d2543e82f28809b15b750f6e2fcc31a3ec9f20b31dc3512f261965ff9b885f35b79cdbd57b5c6032c7fcc042eabf1dc19d6efa7a5a761e95b53322ea66755ed2dc2b6b260e0717c515f4364c6bb3d808c5dc0070ed4a5b62662bc7232ba782e6b08e80f7232e9ce2c5d9b5fd0b411d03e644d7393eb6b3ffa931c74c539567ebc534a1cb43297c16484bd3b751cd492d8f67e335c751a4d80f03a7c856d57a5c8acc4214f68e11da2d99140dc7dee8f01183b8e92fa19a85f80fed19ddde46a381a3e656b5c30a98d66ffb82e5ec78f62d46cce5d00d218404b51bd33126396b4a6a0312e97ed2ece32f0e99248c75aa331f939e411ac65cb5a198670923ef1e357d2cdc3a07e740c454a1c31c256b76b38ca1850b40f56a7b440757be7db436e35bd8150ff4d43f0a8f79a3254dc6f62efc7b2c87263b57d61acd27d98a454fc484795fe3dc0632262dda8be86c14a3160d95175d11148f46a47e59d2effec36995950f4e1419b497be691fde16d108093e63b7f5b7fd8b5d6f7f5043056d2c42fdcfb5b7337b50dfcf99b16ec4889f68ed7b90d98162c67ada64cd92610cf4d12b6de5a7b0a7718ecfd10322fbb7d3c5b9513470f3e0eb3f83b30459995ab794bd1411a8221aa0f53dc3678332cb3fa0207915648604441be9eea70104d2ef2e1136cc20fe6169d397d56117f04f4d789147b62cbe297b807b7c28113a01f5ddc66a67babc08268a7c8b7249cac087bfaa61892212ecfc1db6effa02af6486545b1396ddd17b718a4a5a3da108ab78f5ca4b10fd1aab40343abebf7deb76fb023dc6bbf2d547e5639fc605b6508c9bbb8f58e0163c00d274656ccabb64b5de67ece859a23dd9dca6db537ce228d05a61583f78f5fd7a4d4ed57ebe73b1adab05e71ce25481bdc1b48b8705bd08034f97b3534e14e563fb33f9690d1f38daeb6ccac9089237605f1d2ed532cf64b1e5bf3f38c20b8a7a76b44fb0391680aa09fcf6711ed3d57def6143d28661c558b7583a549742331a4a5046f8b5022fa7913708a9b7a1c2431d0158e3634cb0643ef3633b104195cfe0988d87136a8c601bcb6fe74574a47c427ddcac6bc89c60d7011860df921907c3ed720fe6a81d4003fa9a9e4ae4f265fa475d72026e1fdb3a01e84a47ac435e7edf92d7715388e3e47517435a4b12bcceee49f8c9b5813fb286416c0b088b307bdf7e9275e525b827ab747ad63fabcd2ae320852437870aeb0eb25a7c3f873a457d83a556e59a29680e20b9613b143388c68fcb945c87d94dfbc97a2da99db8662a40a486cd5cd4002daa636db5f27c72f8d620ac9d0a0745ede56f91df5547487634049814c4349a8a802d6e48bd04740a9218ef9194217d45948f4b59347386e1ec4a0d5486c79195306bd56bda68066c5238afb2acc46ea3657dbcafb1a98bedd7e958f50b097fee39935587e11394ae74f49f78ba4c7487c6af583b6375d20a65670d8ed776dfe61a5841254793c941a8d1216c534629533688b094b044f3b833478d7a529c1c2d411f3adca464feb63c52c7f5fe3e17a633be58442eb35b87b00f6b5032e5cf144c5ca5165e03bf7ccdfe05ce1180a9e15ca4b1b2452d83e96a232998cee0634b9a85125afafc7615cc476d2d43da7aa51fd05f677a30176dd0274accad286333ca4d0522f1cbdd11b5a360bbfb97e451dbc5a3ec6457607570804154440a695d4a08eff6d8de3ee128a672f2af4581883ef941b96a0009b0d9d29fd82a12c038a85d455f26b0361483d53659d56fcca8a7ef9b4711c66d705a72d8c0d5ee1246539ea7c451fe3d1c55940d6a14734043a51d232de217265490f56e96cdd8da16da5189bee0f4ce792c777aabd2fc66e9c5166bc6617eaede1beed3d2788f821aab1a6db76a5054bb67040087a767bafb764ff7b8f669716d39b39afc7c6e94d2546db636448d8a4393be2185f841b709473e397e4764189298d8468d3fe2acde54a005c405f8b9b240fa704f4c16e5839675b37eab0afeeeb7e1490d39a8148f2a75ded9354e7d77ed6d5f1c1963b10b026af832b7aabec1f55334e4f01b76655433a3fe38eb4014f77b5094f694c3f019a27a42e3dfb2bcffa27cad09b94d01508df79bb75bac0a0da8f7425a3678e32a90bc27b6268540254382dddd0df2e3adc93c4a071c0bd78e7ab5acbad55a54d3da2049b4fba0fc14db09fff086227cda9a0481cea909fdf8650e2caedde2b593d3593156eb90313ccd547bdabe364d4564c2cb648f00fdd9fc834a9cdc9c95f910c9771262dd900baf14e9f212b8d5acbe099f7f3a9b57b1a5979f0b4e02666216f3738dedd3890fd4adb2dd2024964f0a3b665548338c0df4cd9280ae9eb76d5a69bf10092c9cc7e2817f0272f40fcaddfac8ad14541b5d6e97bd836adbf9795f8ec24f31434bb25d52a6f867c1b29eadaa2eed3b97760e8778888a2f44bd249af52591f2b2065db983b3258af82f48fdec117c3a583cbfb4027c0b586362ed911f419ec9f35d386b872c206911c63843130 MD = c55c7d5fedf6c5f93126dd90b6f19720f56f791590d42903c78a778063b93ed5174502c6b76b0d2b75658ce813e867c3 Len = 64384 Msg = 396d1ae30d314d107565a956d7ec55d02ae9b7dfa3d437d690ce46f784319f9fb46ccdbda10eee88f720b672b5b8b7578fcbdffb914342b30451196295050ba7b41cac553b1944245097d1a68cdd4f7c5db336c9a87445e7b3657e59434572010125be93227ad64a477101daa282a5a55b48c5313290c8da65b07cc4d41a5a1463300c60a05a2c63a6564ff641d0423c5233931c75be53f4e2da1b8b91ab4d48a2e59ca2fbe1cfd833f0c1e2afefada70a1ba870ba276f9df18c6397c221d20585eb78437c36460fb7e4628634066e504ba90d1749f2a33d5c6e5dceafa372b3d5eba8296b821972f9dd37ca1a3d0e9ddd85c9f76a48783ce92710199f5ab3ba5a8c323e10ecd168c3814a97a7bd14f88756e4fa6551750261608561dc6d2083dc772068b29df558db78a2d325ae08c812c46707813422f78bc0c28cac053e7423537a919bbc0dac0a6b4768da38737447795905081a078431f0d183584a97f6f6c946a01172a1cb1802423c0f81db66eb1ac2de402aad0f1997ba2f2763b2721f818e7d5de73a1dcde49a390bb4cb05c952ab79728d9b020c5e83776379174e64225910c7425f0af1ba574618f7c8b9a8c61bbee56a59c3d2ed364252b34ff48e55b04196ac99fa4b2b824a7c725cea4f211a95e3ea70bc33ebda7a3e3ae1ca65c19af8144c6f55a4e0212f804f0e008709b0e6b2356753f70078066d35553ab00f1f1d874b6983c4803fdc6cb366631826e6999b72c6f2e5d517ce28cd34aa39e6479838d00fec73b4e13988c8ed7cca22c396e6ca1600c712bfbab62a0484c6ef1b516f04eaf97924112e1bb62ab165a24fc5db64dde5635f78b26173502f20d1a230740e81109d77d6a36fa5a66bb051930fc269a60881624b9e6fd19d130f35e41e8e175c9ba8563980cabce71374d4965ae200f6d3ebc63f66296b75985ac3ea0106470400636840ad7523770f79d66190845257ad68315df2d76a5f26cb22bbc324c500a99356f512b803dec987fdfa97f08650febf4cac2ac1f5e42528fb5f4a30bad8fc03c76098da84a2a766f16b596ec56a2fb9be34f72e358afd3af5df80724d15637a64882525cd4d13dd5bbcbc46372ba61e2ffd3f6851dc16c9b9424b32a73e45bfd575a2df076774b6e3f3aabf031dccb64910ecb5725fd99dee9095b7efdb099bc12ff851597632b7301a0a2252c80948b174e45ec09dac7d3dd2454a4e7519d6d0bf0dc3ec04b5a9eb38c3b74bb3c69e123111aa621df8324e0f4333ec93dc38ab2ccb7de7986453bb56bfc61766697e125059e381672685c84f77baf0bdba89fa7e19c673bba97f497be597dd695cb159d8a64f44049c3b549ac927837b1b9064bddee8b8f3ebf33daf1d72c64505ff90d1df38d47bc41f99f921c1cc56671692f20429ddcb93783efa4f9efa81ce2f5f43ece4585405f8407367d1f4d506e32c2572d20bc807d6f4656364a0a51e0b6d37b59cf918c68df011839f228161bfd95c102a6974b0d508f7420ce0395c5963b421a7df4e71a752da5d737fe0de7241a1c67b2056f63d22b9d2dee3c6f2e2e8c31a4f317e6d0e0dd6dd95337ce6c30dfb7c0b57f642d5e9b1fc21d1d4476ea56b88da1830228aca0dec4c65dde27be5731a2437ddfa6606e9a91fd2e9c3c542b45191bbedf8e3318870e23d893862700f880ce89288b82069bf1e0c8fceae66a65ebc433c57e0e94e529de40a524057d9ae0b919d5293e0372867aa4dd0f2b94a97a3d7a6a74b9b677bc682e896dd41d9756b5a87c2bfee5dca42d2ab3159e5a7e48da0b250eaeedcd2a43ea96e01d716c3726cd73e03f1e38ff6ad3259ab8fc52ec4c5e8ba868bb43e8141d74173c198826aef15302992cf5dcd6269b1b061ad5b8e6fd04de619f7a9a3b3f976fca66798990acafff7782b1e0d19d99f3003665534c6f372d441adfa53bb9877642f8cef48e67d13364bffb9fffc088cf21df802fdf1d88f16abdf19d9813bab73030e6dbeabb6d4adb55116eb3080e1bf566c4c3319070e75fe95ed7d2e6a7af0cbf5fc4580fdaa265c2b1d19e0c9045f56c91a1c650955b9e3d56087eaae4ca52e4983238ddbfd67e894b6d032695f9ac6175302fe65ceaa01a9593edc8d8958d513e9a1fbd7353a0295c95a4eea58384e5fe12b0ba3df0f0118c1ec2d9199d2675b1807f27aba6552343efd5dd4590095a8abe0b54cf2b28a2a7ed70442e5db8d27f79d994af4b07f7bfd0287adc9bb44fa996824e76e5945e879478a27d33bef816eaa19d14ce53272eeb1f3ff1031025d930d7ffcbbcdd9599a86e7c8ccb9347065789a9728ca1220fa51ca51962a78da8115ef1341d6ef86cadb42ad391e04fdc44d4323f129c88d072c332cc26e4e784bc99bb5673b2f75ef8dc35f8032092e73723cfd10c8fbc1fe885717fec42b40da71ac6997c64030f2e594650bbde80d5b2faeadeb6f54c5c8ae5e9ab2f6b738145549b8393dcbbfbc2bda4740874ca262cbc1bbece87aa04be66f3d44ca9b6ae2bc9b29b369772834a7c08e8957dbf471909cb07afa175a7177b2891d097fde2df0c9446e12ed7541a06bc14df73d0b71c46814fc6cd0fc21ab5005a57b0a9bdb37fc91d200d5aecd600668f32d1bef48b04c6ddc074f8c43c8713a44e7e5a9d5da5c9948fad6d9bf2db70be5c21da9e09c714581933c15be173cae6316b810042010e336ca9800ff50a6338a7eea3f1fd0fe2353d83e9c7ce0daeb68d12ad84f5341f70536c42a7411fd674a282bbcef931c90ba9dfe2b646b7379bddee30a9db9165e1e07026008b7e1308d8a8725372ff3131eac24c95eff2edec8058caed89cb89fe704f9a9a28c7c15bb6aa784dfeaaa34e7cb577f52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d MD = 13189ce20ec85fa2c86f0c51fa9de0d0678e6ab13aba4ef0856b37b2daff99b5530b258901b6297c68d542513082c115 Len = 65176 Msg = 44bc2dba269c39d3638eace048f7670fde0dd7e71d3ccad05dc981d60db506aaa7e4c0e9e37e44a12c966e125009b1b17ba9ab73669bfc47ccfe59e41ecddcc677079e73d20d88037b4b66dfc31a3dc9f8e5df1d948bbc56b505fbd3cd49cadc9b6ef2e05a10ae0038f6bdd209f2b65e3d099c6d0fd4b2040026902b84f077f2fb61e2b6e2515da14bdf9a708a59c279325d09ec403e855995a94072aa898c137f27967fd4963eed9c4e2643af170921bf294f218d91de5d5cd63232a6ddb0440f0a37c297a8f9ec138b89d2def3345eccb495945f9464193ef58ff2e2b48c8f9350ed08934f35a699ddeaa580b7eb38414704ce1f10c094214d7e3bc5d5c7fbf342dfd830529a24148e7145fe29d5b8062ac45633ce99d6ef272894b70a0a90172836bad67bd16d6ee44839be129be503a5fcb4059398e88ecbb5852019fd57e74a1936ed9082898d2894092a39e5c82100d471fb2a65d1e8814c9669cb47574cefb1d5dd5a55815ba1803ea9685a67468275147f5aa799e3911550f8e891992c61261e0ea1f05cbe99315fa265a2cc5b740725f8ea06496942393a3638822371e69f9ae92dfe22a056d2f47ff966ff491eb12dcea32ce861dee0dd8b82c3ff01c744cfd4c525dbe8218985a7ec4e06f6c89cb3684dbe7eb2ab31bf6090fb35c64c3e4738330d907e427e9b820601eb4cbaf03f30b0671446f2556a1b28d3cba6bcb58a7e3d5f494a01dbbd780f28b6323bd4598d93cdb004fa74662613f3cb8b61d01e0cacc30c33a6c574f1ce6a6d8f95708ae7bf985dd40db439e719023c5c81b88d4c47e0e324786647550c701a4d0eed59a7fd71209e71406dc801a9270165955fa4d85fd502c0e6be0c91e1c453ef734f331300034a6f3e8a2f958f9361558e1a7e25e7eab6c76d617e256674898029f2f4c9ec0dc14fd716869b5d886698cb4841f8212b28d222b91490a731d70838cd52e9dd46e959329b34dcba0ff77875705517b59f402c2d4d34994b0325d1c865b6397db7abd578a0a1204f2efc3bb41b224a4a4fe71cb7a5470afbf25b21004486837167f00ad0ae352fc3ef5e2aafd0105b884103e9e84ab6a95e07614108f12c8d645e9e41634c58d0bf5a038d8f178710197f7ddce7c3e83f1d491f7909f40e20fca59ec2580272cdeb76d4ac7b78ef33a2113e3ddd984493dfc17e102bd69603e143d9d5d858ebecee4bb9ce9c7cb08acefd2d54f152346f4d756450951e2a00bc4036c20bd72bf671e19b3d1aaa32de424d31684c781e990e6fba7f705434dd35a59cd018069ab21b41603f1c8bddf6a90934c215926cdacbb769e6e3001b63f379f548286da1ea9572f21dcaa51a9ca9371dab752985fa2c5358cd17ab475a9fc428726295a664867c371f4d834f96eae1d46994c4d1c1d84d6e7b33dc208ae08f1d96ef0513e99768198ccdaae6ad150e404499ebb8f778ad953a601c0eba5fe1bcfcf6454e41703d7fae71a445a9d2c74b86ac26a263b379b450c6f279b4c4c2edeca0dec134b80350cb62f7d652c813dc75f7fef7ce32bbb2068ce6c93eb63a98ad1557d28a17c2762cc82eff70a0fadc5b9ffa1f009d7a79a4db806621dd52a5887c38eb0a3783d819cace2aca0284317ecfa383c19bbff072da49b825e211fcc5fd0a737ebd4d5ed99061be2994bac427ad7f89d9d491ffb8b2c828116d8085acc254d2ac5429f0b6436f235501a37d9d61189a0ff1f88ebd8a851caf25a52984f09e6f5ca21e76f60b7ec016ef47442a14f61f2c9afc85ca8b09fdc5b38ace97b271b4584f34d8e20f18ff3407af0214ee9f7ef976a6cc27dcdb341cbe375d2b2e5308670473fec278c44776f0e29da4169d213b2efd4c1ca784277cefb2bf898ccfd35069e4d1de6d0b01a552e8ff22b5786ebd6909ebf1118a40acee05daf9f56a7edc258e377d17739389d7ca0ed6f2b6cf46d0d392ed4477e676623898c291ae6fd3e17a19e99e8666ea258fb407f6e1ab9d0b622a5968d280a0f451e02e87220ffd44ae606829cce290e43fd8ffe880698bc1bf997da42478f34b5a9983004ec621f734f243e0cc6f43bde36204f11c73d89af0c9a121f43537105aad0a23bbfd09a114b9c2ec0e76ca5782395f393c304c40ffa00d07ca1f34ea5a030b19f01a7beb549c2c751a5dee5c244758e76808ae58f308087d2e9eb1826183ce097587407cfe82cba2798e7771d17336242963c88dd5e8dcaba91a787f77159a1cd3aa20fe1955e59cb26f2d4092a5431705a96084ac27cfbac2fb4f8aa4a1b97991ede216aefcc38b4d6ad7716ec5c5e986423fe880af2ad202a9ff4bf10f714a37b7506ec45fad96d2e63fac6ebc05c134972d5f5a67351af08d506965470bb44e6f30ae6366eae5ca4b2b9899704bc8960ef291413737bb140d098d0932cee15d7f4b7e93f9c4a1bd0064ddf7cadf25341055283d077addf692f45ee3b604f9ec4e69845d0081f2316fb22490b2080196061fc956bf44a61f85d785febcf3238344526bc8636affb0ffdc156d110f844556181e9548de41164c7ba95f2de588abc9cdd9dd0ac7f1c118ac5795cd3cd5c86a08cf018890d46351a87310ef2050eb45a377a3dde0efed22e89310d0d71da7a8b784a268a1888ffa258a18eceda2cc209cec22c5fc22ba855970e70028836b7aede481d05b8421b1bc987f0a93a6d5c280e062a865b2b2aac797214777309b477197a5a904f1a1dd33424d335c868e9417fd6c7061c65df7faafc68c0b4cbf760c4617d9e5f697e553328b4e8e677ffc29e84703398642d5b961dfb72dfe5f718699dd4a46bc8c33e4104143727431637d4cfb4b351be9adcd5572af256e049fa73701e26f6a082eae8375fa50d22b32dccf912e9caddae5ff328a5e3bc5356836c98a8ba729913e7834315a70acf5cf0e191096b8639ee715a02cabb72b7b34fdf6812c3721b1cb0ccb7c4d192818a4dbd3806acf66bc19d749627ee0c75d6bc267edad6779ef3d30ef5fbb946e1b170ba5e9922adebce50fd233bfffc263754ec3d6f57f5ad3fdad48e08a2aa78692653654f511f227b283e6a8565c4315bb69b345eec7ebe6714b7f0aa320fbe27cb22fc87dcbca83e7fc2bc72c3f73fca3dadf407f8755af02d13ce2eec191b53dba374e11a28f5bee42499a27f07a9f966beed29006bfb7180926725354928a3d45f7ed99dc69342e1de92930b67f86fde289000a8d52841cb9e6c1bb2025e6e31b17adfec27f980f55b37a30dbaa3a3e0857d4d36435a074aa24d70c6e735399033e96269cfa0ef9b14e980da52442c3a50155d4d391938aa487bd3086a458c7c714b1fab2011f54fb6388b15d1526f2812e8bf5228ee3c56fb77a0db0df7ed32d4305624bbd5188f99953024aa56f3563877f1f98531a8cd25d168d344c4b26fe709a47b1562ffd749902eab6faa4f315b338387e09bf4996219a97591449280145798f2af33e1c330a9d50e73f4d935d5bbe291cd75b6383aa0d12695f0041006aa924ffbc084b00952a1b269af37f04271adbbae6754261a177e8aa54f7dac18732ec78da14f3a1e2b335bb331d1ed2be5335a05e954ef8ade000651cb6590e431dd1dc75ea7ddf983f85ee3353d88ec9711e166644ef10775142e1dec528ad4671ba75b4134f825fd7f307c21d1502ef7d806326088d70a6d19668c3adad6639368e89c016d352e182674d07043df4d97e42d0c76c90e1e369e440f3f55203c4753761c17b7017c348c9092b8fb82d2f7c4ca571f5602bd62014b295257e4a8e359c45decb8d98b03101845547ef759880862a4b2d651626fe0e06d2c59805407ea57c3f8d949e4e46f803aeb24893bc90d8a67e9b076a7c0bba84d15e0afa81583a500d49ecf1458e94d15e5a2c5144b72a6331c7afee7f500174bb773bf2facc43077087fd593e11be358cc70475d8fa64a78d3ac36bd8d4c91db79993b453e1a8ea8fd02f9ee1d85f76617f36c81f636ebbba7bada92e9ffcc8ee4b7a0a33a0514193abea87d5ea5ddd040c2c12c2f930e7df12d3702aba80bd871558ba420f2754a3a196ddc350a2b29df64c1b68c4927225889f88742c3f44ab7f958d2939106ae8399b685210143d56c300aabacd7da6b36477b8b3fd1fa58212994b9023f5cd8afb61f02b349dc555fdaf89601bd7c9b22ec5c98f360a273355cdbc1ed7bfc3b06f513df5c32494c22bc07e01b68a24496ff084b2dee713e7d197a77c5c5495821ed11659c690f0c6d69d5245a77cffa1ad60aec1fd9eb1c50c60d652ba9e8b298f4a45ff44cb228985adcdd6f597a2e1737d12679c1649f690910f47f984eccd4a25908e45bc7132c058b659a8c1543246af774ac13923a1e5901b0322ed0295d8c8c0afd24b27e91006d779c9e45ebcb05ea41277ee87ef91c7c22f3dc313aac09d9d09f1608bd8fb1ff6dc5fe708a638f26268c31dbc081e9ccb7350ed68348a0aee45ade3e4240b0bdc2a72b29a1967d379f4afae0b13147900766553495abf797d0a0bbc7bf8c833510c0b2d5c3cc369b15d428abc38f9c527e183ddfd44e651100115d4987ab9fd1c2930409638d61dd24b849717a157e8095bb373ce1b87fa70d1d21182d266d2072becd38f342855a3687ebe6373b54a6e8dfcfd02072adc65234a5c8329571bd8b744ce90593f7aed5937e8ead99c531e1e6663e22f585fb69f869ee1a7153e58784219e1cea5f578c9b7fbf2f9936be0b7f98db6bc98eb2dec8dbde57327a54f13ed9ccabce22c0c5e07e1c4fb22fa7d00be63c6d573e890b367a3d7b615b685334d40934b7c8971c02e80a808d168bea0bcce59a370bea89b1d36ff9768dbc17e6beb83a2fd736e9834c2e548291d6840fbb4b94e17d53d4db660a43fa77bcd9c4e86e3eaed52cd8e228dc5e2b181468784ff2cfdf09517703a0710d55afd6f36fefafb4ad28d5449ffcb8efef1fc1f1e5e95fbd88467fdadb215898209cb70f4842d13eb368ecc72d36389c672f7baac91606e085ab1b8ac2571586e3d4c977de70973f5a0bcfcb0a73dfe60bbd8e0da2646ccb5fadc11149b03c5c07de8ae7a2f75638f997faeac824135f45509595024315f06ed51cd8e1cb317a152077b9265582ae1a83fa80e6c5775abc6f0edb593086d24ba77b7c1b16998384311c86e909c11145564b37d6d6708ac98f764b27cb33f37e9b59656610d8eaed86e5bb5b8286050285697a18e593420528585eee6191d66037531f43587422a9987fc10e5e45fbcaa7e1c23d615422f7d011912d9244ed98f1e514433bffcd50fc2752720b8558162420aab4e837a00a0d5e8c55dbb1cb91518beed659e04d6c1888da1708c8cc6d80b28e0fc8c23bc4368bab07bc6cd2e1dca4098d30aa15637420b27de484ab495423f6bea16868aef22577a3a2eaa5f309e9fed84ec1c7dfa56b86071d4d873204d17f3200aec932a6b87cca3d9fb75d5fba293802dbd72912e5cf531187e2a01967821a4519bff7fab114ebcb0089795491333cfb3cc5e8430bf8d26fd8302c1832a9d80d1dcf5734abea78f9b18eef7f1b8747a6891685cc6a8d159693122e77ef40ebc74f69d90b05680248375a2835959ff873354b9a057e068d145ceb2fbeea01d5e2133205d46a180814e65dac1eac07b01fb5c78d84a30fc967aa3dc863bf47170c0d9a662726650b0e631be3a0cb491edaaf2ce8d095e32b1eff8c60fccb9b3f9383156289d6f97b93121777528fce955275ee345fb32b4298b15981e0bb68a02738359363082fea2197c2dfaa4612a405ae8de8b88762a0638417b3b5fb59f925817d71491682d75858c0752eaabfdb72bd8e8e418f03b51ddc597ef307c99b1cf34f74b2ae9cb3a5c972e0460a209c1827528da1369901161e913c1e7d52167c023e16262cc80f788e6ca98700df7664708c7f4e2aad14eaef5173aea86dfbd132dbee1a0dbf6b6f0c1029781b66eae62d9ecbbeb78a510ab31cde0a2577abab098b6514edcd27e7c6ffe88fa6317a2bb30c0b5979eb46040e55b3e77129b6780acf039d398bf58143ae7f345dd9a493b556b6c4ee2a7455558e9d9d27de9ca69b3952197d7634aa068e560c9ec9eacc88f1468790e26c8d2d3a03b19620dee54f3cc910260665f08421f58ee57cbd14b28e32f7ee8d8f09f9ea7ebb687aed82ab5be127cfd719c3410be621ce8cac2ad66014bc73966c5a50127710fb47592d141922b6d742c0b0d1ae907bb654387d4929644bac8774fca4448568eb3092333df71653d8e3eb379a7c9ce3397dd26aaf3c9a0c15fb497f7ae3121994b149337d783475413509c6101863fed4641a916d3c3e943c4c5a415880b5a9a433beac470ef591acb09cfae6e47e24f3a1717ff78aca6a8c0517e0a1afd89f8642831c4f4de23f87e125346373440c23a06794f2bab60571b002ec0ac30371b7683701ea9772e54f3123013a476e0af10b6d6ed34e89eba9d7cbb1d86cceb6b41f3adbad8e30197f3b26ffcfc354a7c82d036c1db8ce8380e6a2d0bf0f82e508c21f280c849242a469a17e88998079359fca2b368bfc63935758d7131dc873221b54658c3d22073b47130c191c89e5a5ce120ab22a8c125db43e23692a17e79c656b22a0fa67cdc05dfc36e5ded973b5528bb9153706065c87c34445b6f9b8d44ac3cdef5ecc0cc008ed6d7352e7b9c0a78784d413e2c5fc4c98b82d46d67d66260ef5cbdcd75ab6e2374e460b3d1e7457a61c7343bac7c97d2f0d844c469bdea1ad08caf7022e01749a27d28a52183ccd67de8768f6824083e6a2ef59b29a8a281e95613fe4fd5c3a66a8ad32cf4d86733d4964e61e8c0e1b5026c2d1b3000543e41a3309e84f13ae2d3f3aa6fd04ee0396fba03d9b5b6e8e1bf7b356c052ec6f9e0594f794a9c43a6e5a0f597404dfe91553dde215670e667a94155b53198c159cf62b8b6283ea89aa979fccbc93d88e38e05275e5354a2f2c8a7d41f3aa80c0615a4b37ea73f2f6526670634f58647d623fc26bb35cce6282595fcd1aac571a9ba0988f94d08a1af65505df94b9003131b09225e823f78b1c7f413f30856b6eac7787e4ea5ffc5226c1e474453c483427e13656fc5152136b6aa62afddc5a47043d8dea6348d656445b70d3a9688910a5504351783b5a95ffba1312bb07903e43613f028841a471df805f7059b45f313a7c3db7d4689d8d39dbfc88f09da9beda810fcfd1c0f34f68bee4ccdea6472067c389fcb95f8763ba4ee6e0470503334a2b74a4c84d2f496085c56b90c4bd68bdc4bc826f96a4a3e19156cb26e4395602bf0223e45cd4fa776365bf28864e749d0e4a0b8f9471d85031c0ac08a1b871a4ca3cbfbe6670dcede64a4a0e6166de95feb6da91df8b7b76aea90564d40d20a0cb88eaaef07f5b547cd79e9afc82f1292487821ede3e07d5669469e3e1b3ed77317b373e817d104b95b21f86ae4f66d70e30947f271607fd08074bde512922a89a9827f5afe67633df5e6f39fd18aa201a46743b30afe64df1761deca8e98aa575442f6cd247f78d9830e03d7f7b3584d74dc3eb81783d58c17562776f81600e4013d00c7f1e3ee97eee24f98be39375d39ae608afeb879de669bc070b6d5d33899b9c3d2cd5a6b7f1caa006d8ee3e938dd26d0b02962f9dded78d240329dcc5c02ff6a7520ab9798f6ae3ddbcf7a13e6468cb7b2fe4cfc919435856fd235935726571b39529f1cea64352f6ce9c760705e283c19e73d2b03441900840067cf31eb08fea4cbfe9f7d4f89fda7448f75dd0b41886c4bfc2e3ae36d6c0723f928f33b5c3d40f390cb5a9df0d014489dfd353721c2339252ac3e5a79f080a2b448a4fd99fd95331c458838b3d03c5eb89e80c90e13f723074d189285b578e760d44c19086929f16cb80f061a24a6eca700c7a951a33e68e3bacf72d9e37759c577f376f1a6879646caf8f16cf5da5c33cc12bf329993c8ae9b6be1bda10360aad7a2fe9cdf348b73234ae0f36a611424aa67f3f81d7bab2f97f5c97817a664d99c6198503ab937bb6c0dbaf5acc27e4241d02ded5980792f577411536ee7cd186f362c57df9f01e54d4969bbe28500543a54555772299b7683f0a196ce4e0430f82ba3f7f76e53bb6d07d48d353304243cfb537f93fe77ccc27161895e646fe9de47e379aaac9403754fe3b2cd53f178f0ce0fade28876f9bc00397347b0770ac992d5251fe32b860c277e74d16d2f19fed47129874e00c41aa4119eb0bb845d631561427f9a820cdb998d196a0a26cf0d16623aabd97ef68466d150c20bffa851d7701af15a005d8aacf8eabfb13e61c59ac82976af5657a14c61d2a52a4eb43ee0e8f39eaa0d40c068a72ff9eadf99d06a8d3f0f5af2af1a61a96c80a0db49d039b316ae12117e25d683303f3d713dd38e97c19f62b8c696aa91657bf30d2eafe9b7cb481a74df62fd7234ba335c16790cd0fa4d4d1264be310207c0ad4b2d84f8de59944b9f2b1fe65d85915308ec67ee1e3142a567503afde2987455ff0cf76f0e0abb2cf82a03972d69ed25dd87483c6bada5f11f53b1161b61c2749094af553124e546e8a4b71ac829f63244aec2fc9eb79fbaa235cc8593aad091668d55b22ef0391fd860e377180dd301a32b7d389f97588757be325134bbc634e9bf908fedb6e0412e272eb4045cad1b63c422f75695f7e0a8b58b82e4dbcde681f209f356be023454c140db7360ab06ed425942abf9a54dfce481218d530d2d96ed68e6514fc57eb0f6c2f34f5ff64ca86cc920860a8957bc11ba34166cad9490795470c6b254a9ac8e5c057fa2b574fb0c1b99cf11cc854e05dec6676bd5a0d75e759a9d30d53dae50b518eb71110750e8f7b56e5695601b8896dc689bafdbd364746bbe0f71c0200576347b14328c0eca037d4b210d6f8b628a80014360ccec52f9ec11974fbc6975466117d23f8b9c78eaf84eba5b3a075a61b91aaa13fb8bf2ab237f1298b8f168cea8a7f4618d64ba522e6068a949f539c3909b19eef1160a331aeec6733d20a6b61013c2bf19cd5ae42867751c25bec75a0b6cd81935f76338d947fc09d25ef6a5a2438482b73f1e47ed4c27de55cbcccb35752fbd4f94c5636673fc81ff132243651f82d1ef22d02385f8c717618310c1139f6602c857f85ccb590e044ca7f039619004d54adf3622f9529ceed24d5ae2afd0c40f27a7c3ca10e07aba4282292f9e7c51b54fdc19ea5041f08c2e9374d610f1920df4ebef563bf287ca680c95cc25cdb29a8782402392af091900bc24463eeb1923b88d44a756767f5d46aefbb9fd696fac78397576c88330bccd3033da42a49e7af9f48a666853a89a65ce249e2e3ad012ac6a7e8af9a5ad9d1f56693923066c394288893a7a734baa4cd6d921c1261cf5ab7b24092dfcc8e57d988d0ce9f8ca8918b109cc93bdafb4832ce0edbd179d7cfbd62f986c72c9bc705d69fa9c61ff9205d7d1c3bb191ee1933a01a82af499d026e167e1bfeef7497f0ec3ac452b547b9062aac8fa6fde59036606fb10a55918b406948c2d599cb5321164c9ec3d116d42ba5c8359a738435b1ab58d7811257d2bac7d41bf99fe2711cf14fa977f7e8fa147af9bdfaa74c724bdd80769224527153aeba77c9765c8a5b09ae750d9e20a37726bb9955eda0fe5b73510ecbf003df91aa6666c3b1bc0751dc0371e3387058ca1578481acb240266f955108d09fe860b37627976e6736097c4c930a75b3a9263d3ca5ad7c4385704fbf71c53e6a4fd16d239206169052ea3607a21a87af1e8fafe2c321b7d60449be7d192befa99bd4b0744ec01cdf3e9fb4b90d5851c38b4f5e1187e443b3e53c2495f143cca4f3f1e43204cd699c1fb05d2a7bccbc3618ecb19198fd0a2251ceead0a014bda380b171255b36e40f20a69821957dae52eff01229a077f36b708976f6cfa6abed699bc015fc02747f6608cf680373105d35e3e8a34457e5d569f431cf25027ccbd73837ca8e3903361c5e69c56cb6cba0154b9ac52ea7caa9659783224b2f1a85f20e3f0bbae4787a6831ce01784fc563b5b29258066f89308bfbd5b9e8356b63e1a741a22809ba94720765e4d045e8ee3d9f372373b50aaf04a78d5aa51d59accd8ba3557fb3b3cc636b98351ca01b88d69bf1f01e833571f72315ce2aeecbaadd40cfed67e74a6963e2cebe0368457aa82d2885afe0f2bd8df8d3dd1eb0a8a33a502b328aaf67b599f670452ea6500ddadd44abcdd529daedad314e2a6cdae00b4321eb8d12f2f62e2ee493456223869433ad2a2068c21141ca95ebf52948a9799f17e21b19d4754a129370efa2a63000b8ccca51a3a5aaaed8697a28efda46acee77dddacaf37a132be5a3d470c15243f30753088ebaed5e5e14c46ac678fecbb7a8a5722f384cb40043f69dd35c33886cc78cec30ea2179e4fe9164b70a1aff8312028c508b35531a132ff2d45f1cf5ac753ea6911b9026f28fa9bdc978e26fd91dbbd033d57b19ffbe177a79b255b23a7731deb936808e112fd31e05aa9e4441319ae5e2fc672d39ad76decc3e26e89e372d3bb1243ad9c846d92f718996a543b6657465ea41b7504714c6d5e9d7bf611bfa6580cb062ea03c819718fb12bb6814e524c28551e1caf3b8d89b9caf5e0a8d5f052e152bb5207994ffffe959ad37b3e29e03b7ded1311b2cbf2640f7ee21f426c3c4e9f398d065d90e303cb4a439fc2489306732af0c2636217ebbf8962fb81546492ea4fc38691a6db2da6bc8f455728e4f7d93a4e47c9fa7acf7f77fbb40f537c5ce870be1eb1dc38dadc640f22795556ae04ad840852ef8b7da3fd04df68d3d40b0e4ed5255abb9c99c0c35bbdb5685887a9f72a8a8adbda74e17b26d41a701c3bc03ca130d8cf76f8e87ced5d77bc6b232d99aa450e29d843ac64da489092a55da2bc9ad7d8824876d7d34ca85ccc2eff0427abde29741578595c879377c61fff2a612a70b67e81720378e224c131e479c20377ac792502819cc4c75b1c84ec8ecbace8921f0ed298ffd0563931685c21fbcfc64679c73fdddb3001e60b598b8b0b025dc26ecd8c4a217c117c49e9d695f5eef012a7c52e0b9910dffac0be8d727d03e26822454f141cce9c546730e43454e38dc79fc94d895b09a9dfe91e52e376142f29c5d07b75465a6f6815d8158b9d3007abae2e1ed5956d082bc1038c4c9ad58c5de62991ec32a1f31dd249eb1a4366f6557f7e328eeccd735505188a1c6faa929affab32e76637dfec28f0c55ecc0ac24b6033f903a5ad63e20197ece14915da577ecfdf05558e7e59868744c7bb6e03f41cea02e2647f5269633c2529dba9bc29f011e6b4951866fc7757d9f3763323e5e1fac089add5e731866fb3547bc8b068d01bfa738958123b77fd0550a0ecbaa77bf0b297f6236b01079d180fce156fbaab487ad0c6d018ad04d1476dbfed20bf3776696bb1fa862e535ee3aa36f24295ee11f84ab212e2a7ba9f20b917c70e73a0d6558385cd9 MD = 43e98dd681cedf885992d37e500247fef6beadebc6d90eb05c3cae3d808daee1a483087606b5b9774903ed672ee9645b Len = 65968 Msg = f6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583727b11ac744586132f83bfd8d5f28d52f044f255987eecb0e99f8ffab482568f7505bbd5856b05c491ff62a54bfa35195fa7b15ea9c5a7cea52d9ca827b51f134c535a60b086e690e1f1e416144949de1772798d87e5180b43551c3f20922719dfad15d65c5dd07f07a16cb398a770a7ffed716b9aa6e66fab5f374509e217a8165b14bef0b96c9aec57230540dc527eff60c27f4bd0b902c6931444496d96c9d9a480a0d66262e8765b309372af986aff129351002a3bcd7a38dcc348fb4d8310d28104752059718ef4bce597eaea74e74c0d6a227d12d7b098b64b6e54e4dea32b3e7335bbfa3e1d6cef841853efa29f5658511a91e62851f9cb63233f02e27af8e0757efaec560909f0f75bb350fe10789b8e4f2e60c943a44393cf864f987d808e90b8a6d7c23c14e8c6cad1b59020faffaa281c27c170e14563daef7507950d714e4b8765889cd4fe7acc77c45fb823ab2c0f22e418bef8f95cac431937a8e5b136a0653cb213935b9ac86b2873c13cc79c6b0a3fd717308805ad49e6319f5175d01d080447889726ae287687d4218d7d83a39adf0562d21ae646cb81fc6399e5a52b386650e22a883f53608a8bc25ef368219b6daa8726d688dd8f95a0db052a3c33bc09d40b92a9d4b1f1d89e8af751d34cd490cf6d74e572dc5fc826eedd6c1d9b5d97dbea17b0f5aaf11a18639fc04c8c0ff17afe046f2ca901c2958668d2d1cce3b56e6703c62aa627f7fe34a0685c491238b6211d9b3fae3d2cf58aef85df2f160d936a9c12fc0d5c185ae540708aeba60c88be09913251ddae4fe1baadcf2bbd4754db2cbdf2475824335dc8005fda9315fabe0e7a8dfca7efaa7511702a27a20bb9a2f9ee95bce3c492868042627fa1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e7612863f035b1788756136d8c012a92df808348c1e0a0ca33ad68eada91d3196b9d0ba5f739aafc5b8ae0d1d90c23d83be5b4533984c3c371579004328e12bdd4cdc42c060a03083b60af376679c96cde9c25f00e35949713f71b45081525cbb58be882a7376840b960050a9eda69a52a0c2eab9a7391d99e046149b5f79ad7a05fff265542391a581158d7fcbea325c0ce54e278ef59ef71f7e87ee685c06617a26ea38aaaf41989fd310c0a970473154b2f3123e94b6d225a3740f440550b7e0bbd76d1e237a2e17c142342e3ebf1aa2b142425f1e4c741a3c45c79c7c71c55e4621ca578626ad12678ba2035e845f1b6ba17e9a9c472325d261de18c753d31d502f18fee02c5eb74e54d4d0d87c48e967798f971591286eec301c5ff0dc2845606b1eba3a74892ffd03903cb2911d342d333efd9111cb1e121a491afff60efdff3ca6349be676a1fc029feff6aa25234635517418af535dcd872cf0fa88cb6db40a76130b6a6c36d4b7c992acaea9df39e990a6b3530a52a3df8e8aeb7aa8be073e580092e8b5160c8cd5cdda87f1908eb6c53869e536261e8a378fd9b4ed18803e11a3394897682ce78d478a1c455cce03b6d5434d2000c6f0efa8cd1de2a2a8736ca307725b55bd32b7a9c355ed6e803a2c2347731009227a7e7dce9fcf85064530a9054e480446d41c9a8e1a30ec2cc2efca7f404d69ba8eabb5e421fbe8231d245c39c5a89d4f3584c3f25358ff5b03c773f39a214716963ff9178caff485611265adbdc14a60bdb7cbf7e8abce93657cc6aa6bd2cbbff803f070c633d1b67bc06b691fdd3102d47c5ca5c172825f50d56aac99a91f3c1ebc43f6b8cfa63ed1f61773d4427abce29c1b05c7f442442c9c08010dee68156e3599b24acb9ba3cd7e11d5c3384e174fe0b21ee07b37cc619747b2b0e9d1d352359baa656eda6fd51f0097d309d59a830dc9f8f54d887e578fd0c569e27ffd3183f1e8ef01882953a08cbfeefb36cde7ee079cefb35ee2764b4a451f209d1b72e84274d2ccd05aaeca5e57fb589a38e14a1511b4f5e18127955e37bcec51b57f2c3654f417d8894e651e66e1662864dae89a5f2e5b38e2d033b4a5278ec354bf1776923f2ac83e9b3974f58a6e09d83b913f8f432d8c8edbeef396484e1d7f9a70aa36994cc902fd0d060bddb7641c6a0daca8ddb2040bae8ec313077384bf78017a46ecc7035bdcaa7fb0c28b62b9d12488b2e333c9e3b3dbce234c47229bc1908ccc1fe19dd4a0d985ec21302b36d69e7cb63df8029d509db9ceff101f9bdde68bcf1ae3bff2b160c0c8e2efe61be3422fbad349d8c2ef9b2f1c0817a34735cb1d58c515933f7707da4bee10bbf15fd94ac98d6e73d9f79ed6164fa4d5282f07ea6e08be3e425b98787e2bdbd33eb22b74e853aefa6ad06e56c3bdffddc534619b19cb27eb83c3d945678298568d430056210d5396fee1d3582c386fe4a6ada2d861f699c08b1894e610db8e6c637c20977ba3a36e1c94958457a93d12540092484f715ae5e1c38f06811f063b4ac453e0fffde7ab4c507b814ef9b28e5697f994ea24b2830d2a934bc13448eec98360d9b3036674167e4ef8190e148134d89f643bf7ebc298b7675dd7049cab69221029a19e6af20384d690bed2ab12772d4c5e48d34cc909d1d5e5ce764a9ab0072b79d1b4394c9acbdbf2472cc16aa6fdc72d1b9e1cc1e8dfa38bab7199e5289b7970492e1cab63bb25c5bb039cb049afd977bc42a4d1be4b9af678dfd3b15946c1b713f55b37e7bc7bb22341850de9ad4ae531a52c22117c82cf3da73e29ca71cdf537f03e17ad37a76186cdc4a90d5ee21e84b1fbdc6cda23bd00b12272038263d3bb060d743e926f79ec8fa1ab3d2a68cbbd4c5b2654cd4469cbe5c9b78ce34cf9a9210f7520379ca35e6f643b0179a693e260922853bdaf7aa52b7a1eeefa500e08288d43dd8cf686e2555483e2b3621ffdd4e90bf0122a99976b7ccfb03136bbe102cf05fdfb44cb8329baa8674065161590a8f7b4347e6ea78d18f35aefc8a73b991de406eb501946d3ded519897721337c1713258c73a0df7996b2749bcc7a1ed4bf0882c4e019353b08307ef45fe85e807e88cd80d0d847173e33879f0bde939bfc98f8edbd72574a80e120eae7129e84247d34795fbde650579f1a624d79a0d61ebdf1d0afcdb4e68d1187d4d548fb70521be0e0e6f8c40a2b1db64c59f3506d6b9ef4d47dd255f879e83918f2317e2c508a5b1b2e30e92e00d6e2c5f9f5a8492c648961f12841698a8dc02006762ea066f12d94ff0e5ea51ff22635f327b250a83638dfd178801f0929a452d9be14b5dc78dcb1203a2a55d0980a041030756b293d8ab6e6691b043ee36b1832b23651f949f2dc5b5b55285bf0179a18b9f983f5a0064ff8a419ff70e49fd9dbf99e5d0689f77c7619e8050723d460d369477e55883510cfd082f7e853c7fc9a3c54c24b6371f83a1eead31d59cabc09e96646911d9d6232965fd6ef596ceb38235e6610fdeaba6f0f637ce5b97f1781e05ec1f186c8aeea9eb783cb1e150d7d55c6339d7fe929dd975be7a76c7dda04f738d9bdec3e5ac08f92e6c4c94aca307b94103912f7ad4b5cdbfcab9a4c6b5ad6fb753c7685d07912f8e72483948a1b3ccee42ede9bae8306eaa3386972344b24af7cb74d2776e0cef26e317379b504417e99c20a5d944b3e91c49804799b9f895cd87698acb6bc6c876335c283b3b432ab163ebec5c86cacd7471191e90a1daf0b70c1809af7d493c0ae76973aedf3b65e43ea245cb0aef7c414ec3948e88e3bc42ce02d7ba0f1eca3373d1b25c988759e080d61a9b5d8c760147123209dbad88df41ac6d61bdb1e3be7d175ccb03d18734df0a0343fb4c6b42de778f891692c70b0b97434cf5ad28da47cceb70bd847e5fadc0786b7089ac748985f592c63df7448035e1c2436b0a357844e6f4022a9fdf717be26839deba14eca01cad66f9aa1a441ad1682365f84e9321c7bb9e3e7c22ce9ee9c0d3b624b25c685d3f7570500adba88aa5124883840ce6163dce3a83d829cbf71bca9a6ccb7d414fcf7e1c79849b81861f9c6d2c846a044b013e99574df77582cf7b1602cea3bd6ce3ed68872618184c2e2e4e63be1efeee9c5bf56712dc1e25528193874a845f2d034fdf294de5ef55675486b99fb058796592b923c52c38475b6aad5abd838918b4120ab08a69793a318b90aea7b28363f39f6f1db38c56713092ce0d9625dda85ce055bd6a374853334fe6b3749a1236dcce81d58c50eb2b7896700062dfcf6484175ab04bb3df48e32e035874db877a77ac8bbbae3e88ee99e23de3b235d0c5c0438429cd839073a782711e36fb45a76ab60760a79992332b02722802bc745477d16caa5e1b1e7c1709ba65297dff361c776f34f6e6a9819273c73db2d84c99316d7e828beedbbab81039ddcad7f6bf036d3dd91aca316276b2a795612dabfc73642462c5735ac7e12299d8999dde9ab613fdad91a8cc4e2e4b9ddf8c0124f6c44218cb994d1e2c48dd34f624341961bae81922ea06dcbd4fab047c92073a309aa3a62d75d08840459ca5a6e93f29ac78663af98268d528516d95ed21a47e026cf556e8f9a24bbc7ded668b6723a1c3752abd61f9435827c9efacb1a97d4314c1b3c5be8336bae9484be1e40c65f44f47822b1ccd2ad8341fcdc36a97d64bc01f6b6cfeb102686f3b34c261679aa3b856290e8a6c93d7c5c96474588b63da9d0c88a729f199c6a6cd34628407163297276bd23b55f2d9556d603a3be28a7213ef981ee0c371783884c75cbc498d236441e7009027dc4f8b523d7f653bdec4cd5f163e83a50ddf8ce86a1b8acd43f8882c17342940c4bca04e48ce7505b53511c19f80b324d37f2c7ea9297000ff14ab4c68c7774f20a36c883ea1dbcec23589bd707fcfb176d99f9de0f0fc63031a263978450a81949618b67b9419f57a58bdb945a669d94c714eecbe2c8081f47b8169b22743a675076d4f8c1fa0284211063b9b7ef21ae8d8c2e1ad16bcdc47bb5553a308c31c6669b2c9ecaf1ec5bde0fbbace73f8e4c06283f31a5a01e0714c1a8dc743f961dd5f81ac19bcd65c426b16cd7b2ffec567b11ab7a250e02d05c0398e9b8367053e3b726c9fd3775a73f1dfda1dfd743b3346efa5b1b5e810799a4acc9c218c752d9fdd81eb8d725ec727cf671386e9c4d7968b23e4d37a39414cb6de55a8ea401fff5b92894547c7b07f6e0b1836dfe0b92275d8a8542715f15a161a34a400e489cc450505957823c46b242c8897b72d5c6d282a78927f250e44e126c59d50d0ff99525fcce87401877d9a41e1241ff935f92aafd218d2e50c8f908a94ef6a93e5f8ec195bc8dbdf5e1928e1be667ad2da38e5cf4171c2e450bcbc9c0f24aebbe14d7ab84eb1002bdcd068927cc94848cdbef20f4327df919f3ebdf1b0d7ada7560996b3023b91556835d1caa8d708d964edc7e65395897b2c981d220672d7e4c8dfc8a002c3000aa4bbed00cf1a4cf34467effaff55411fad4b72839c70ce02be2278f5ecd1ccb9f6d512cb5c0d8524f09fc2a3a2e1a6ed75eb36bcdf6be07fba64302b1d0257c1f3040b80dc2b31fcde07f886eab52b633ad9d2243bdecfba222776c60fbf41d11deb0fc7dbfde3d98132f9fb436a3f2f50a9ed605e23ec50a9eec54d51731b55cbdcb816b7e01b496ea33fa7295b52905bdde0e7a2d5b6c1961c94277eb844dea16b9ce40c8c38db1adb41e119131634b0e84520a68ecf8b9b537beae4193eca230a26b6565cccfcfa3d995faf2bfa8ae45b82a1d599872d1e05e51e2df099a6c55ade1401dc582da15cbe69480060119a9a41f1bca08e1492b65827b8e8c5f30cb02b73bb856afb94bb1994603af7571836db86d81e44d09de75dae116c444d6dbca75bdfd265d548db4367a42610d9f1b3e7e7946d3bff841b5e07d3f5b5047cd2da42db5de949323fc469706c5d08bb93df8a8e37d3d009c4e1cb5d1f68c69e952cbf5a8255c5e54b051051783c61da592ae621e8bd208366716f29340fe257762727c9ea4be9d6af9dd2b3d42f73e26662810c1a583f95829579d4edeb064be84212a5f03c138abfe747340aa6cd486e1ef1892725ab94abc661cca7baa0c07e16167b2e96e1760e89d44e7642cc80b2a8ae45a9b5e315447cbd9cfbdf2069aa0b99b61fecb23d0dee106fb183f03fe6a81dae0c79749bef20f3a254c923bbfebb22e32ebe3424509c622456dae6ca7c85d64ee9f0eeacfe7b9a993d19292bee7d289ee58bb5d0590d6fe8a0c80ea4d6da4e94acbcafad04b518de3f4f8f2debea4125dec5d5d599c9903959dbd673980e1d1bdf2d36209495f4edb5cce456898ad324650d028895596992dc76dcab42a99830fbc320bc2066c5444b21c72a49c7751722c1ca8dde25529193299fb0493566908d3eedc43adff06e59de861daf389d8aa274ac39d6c5e19228749e171e29fea70dc0fbcd364a1ce88c63cfa52c46b2db4e96063101a3ad3106e83664540fd6e0e829e95bc53d913f3d41f255338a6ba581b696f7f1570bdab8e5171c6d4f75dab6aa24e44a42f3eef709aca2777c1e660656acf32848841ba90baeb3ec715200f3f23cfb47c2bb54442b3d114a84418926e6d6b71900ac6071bc7baf340df1d02a72a00540656e1baf1742263f4b7bab8df792b84617fb458d87ec72e68debd4c4abdc96b67372a1926e5a55c82a333985f97f7b21e6f72766fe9fa36669968b4d2e71243ca57f928880d43467b90ebfb97ceb745f0606a2987103b5563988704e4adc322553cb4b0c0f4e26b06044aa82e265383fedc0338c8f973d1876480022b19c4513070c57975a26b114c89b869cda7b3b5716aa56ddcae88f3f984bd774c32fd18847b924b5020c78174a69d041c5abf227093b88e68376403e280a42af20056be79e385eef975dc03a7e46142c246601424dda464179aed4969e19fe5c38cb88d3632042917a994de0dc96ceb68737cd1b4d2d2b78ee10d0cb72e156e67dd09cbe4ef79c652c5d65ccddf26c7b5eafca249faa84f7814ab96f3ef6e8e87fb33c1aaa34b8b54cf89c310aef89d52b2c9cf0bdc8ff37b39af2d46ad110dcbef1cb7b1d5e241c2d2975cfdbd4837e6d3c9a02100f06d3f5a001ad8ee68b3dac0aef4200da6b047d3e76fbd947f5b1a56e65db4ee31836d7e88a5d03dda485d76cfc220d4ff9f89dc614477bb06d29642074deb2fbcfeadae2e15571fcf93fb1a6967d9b055d730f4ed2254bb4364019f14b9ef4af7a5a6f1dab4941eaf5d5db3632c722c1021e52473537c1aa0d80476f4e9e7c74c42014f74c8b0c1e36e2a49a55914cd98435073db1d166384f846ce9125fc2f229b65d0e59ad290d18e0be51736e61d550518e90dc94a1b578a70afd2b55608e07a7b7d13722314e285a88da10b11a3b031e58ef29e42cc805729219fe01cddf0a5eb5de798cbd47e1aa84c2b1fbce70f8d616b70e623fd69271a2de0f07733b9e45c784953f1590e17b4279dbb1072dbe3328770e7183779c2eada7d2b8e94a30177d722ecbd29f8427328df2735cb7df900eadbeb460118ef42315fda8a8716c2e38158ab58cea6638e56d9ab527a5b97749d9738d8e3ae78ca386c4492957af1487ed5d8ead07e44acb9748f8f08df8735a78e16f465a32329f98db3cf44375450d77fbb9ab5eaac765a961a15fc7090ec10a6cfc31060b9087cab6d681fb5b4a193409c91075162934028950cde757941e1c9aa6c6b4b010ec7acbb86ab5dd8e3baffc2f74d1b2fac7313489c37580bdb21deee17ffcdc5e4e47ae55172958abf55a476f310afdb69fc3d7beb8d800e63d8cde4ee524fcb31dbfb33f0fbc690dc6b1600add7772e71e29076246b554a800e7ed416ee37dc9eb219ed8cce59b3e4043fa84e2adaf06d2df3806d563f86dbccd805ba5beec0d373ba5a4c74b4bb7c2806b6fe9140e804e64de3eed8a68c1c19c5c1001fdd3f7726c8c3597441704ee05371e49511dfdf1488e5d178f222eafe2d4e10c46b2132d12a70da56679a02330e2229bdb69da6bf8bcf3bbf8b11ed82f6f513d2ff2dae7ec8a9f8a38d00402a2011f49295ea00ef3ee95633da20cead09fe31cf032c90348ab6dbe21d6bafcc6f866e9b178e95ad897a4a5e451935874eb19145dee783fc58deaa9b7ea3f721e4c9bf60a4500e0054cc3fc835c2c919ad565cbbf8232ddd1a6b8e561870c13167210e69a5f913f187255cf713e5336a0f34b9bab9ab36dfb8a3ae9c539ab505e1d8833f80514b870acec97545481b825a94d1c98946470a1acf33f497e87aa4383448699f205fcac50fafca35b4276a78becc70d0bb0867293644e74c23b916567e826f682ef6c2a12f367c49f002294ffad137f6d320fdcb220afcda13196421fd5cda4543b97884788515ebc652c7c99008a7635638d4e9d9acbba980439583fbfc309d2650f35830c51d82fcc04dcdc79a477f0cf7f56ca453ac2132deb163be8afcd8a0623b03a01d1a765bf3c242e9af9fb3bc06673acb2758abf093c1a88f2fc35d7997596f10b6962eab942e123c6e3865300c323d964f46ad840acb3cb6120f9679995482c7b71814b44a9a24090099ff2eb25f5b4df4fe91b4eada067b5d67ea670d34260f49298f3dbe0d60978d4ae77fa0f57e373d09bd49dbf3ee263554c10d9e02422e94500710978fae303cd487eb7dfc8d9d53ee9b0b8720dcfec45d8431f2c5bd6dbf15e4f37e28f61a35be4539f17d70c75d3591c193 MD = 4cc9b319af23213a45f5b8ec966905e20aa06248500cc2bc736b171c9fdcad3d67493f930753912d82125e8bc188e72b Len = 66760 Msg = 5ab80169184541393a6975f442ee583cd432d71a6d1568fa51159df7c5b8f9597f2b025c5b2897344f1c844da18a54d757aa6782f057448651282fe702dcfff79afb2a1c78ba22d3b41fe4f55567cd3ac5a5b0fb82ab273c152d26e94824d6609471a030d9c3872052babc74c74d6c6b0469dd0c8bdab922866faa86ff59269c53d58d20e40b71230f3534505e03d974fe3e143e73ada3438a35e1448f4399b4c16f1875035986e3d4d776138153bb5c996e7d17a2e98da40ac6f6ae61aad5afc5866ab69d766e688aeaa7449a03bb2cbf40422180591e4fef6b0f49db5682954663aa6b192bd2ba17b4f26c10dc80eb57fb88e476c4ff4b1f6c559f660f496f2e4f011de13e5ae2657e7d124ba6b3a149e87ae7eaf1d8a08411ef376b9cd244649097535c77ade75a8f70beb329fb577d4f3db245a9505705a2059950c6c41cd06e9395f2a074d1e031f4f9b02c0114da78fccdf0b40f768966c14e7f55c7ff5a331d6b0b7f56a8deaa3149aa796ce04aaaddc151dabe08faa649dd5e1185f6ea255f5e0fdefc753b434e3909d6e5c3b52e0814d2e305123faac5ce57c1a308688e7ef566830d40e144734e350c14c6014da651da968b9e40ba5eaad02fcc3ebcb4a5b97936320fb7f5ca1296e3a0f0174cdffdd0bcf9b3e51e3bf73321a69ecee0fa30aec113eca59d780c9422324adf76daa21e1df65a161d8640e760d9338659a5e46eeb57de9386a8c4989371da4112c0c72b812b9abb00640a54b40e02cd69cf5d227ba7ee69f680c308fc06aa2667b8f55fb03f7bbc10ffdfe2e4ed158956a021303aaa220f3628904e2698c274beebb32271db0501927f46f9ba1d73a4693fba02f009846e8ec9b3d0d9d028155f8189dc8ea74172d10cc801fc472404ead5b0fe646b1c6c458bb5f8dc56e6ef92a1fff5cd4a36f814ccec62731231932189898e6079f0f2a5951d2df9d104ec9f739ed5f76dec79a2ea3a84e727a1375584cf19aadb0be9f41073d6f6e988f3cd20ede5d4b76cdec48c3ad0202d7cdad0ed09070b3872377b23405d9c477ceb66d0758b2bd1bd10c2db75ace5cdca63d8edc0bf4b382fc682f70a29b393e7beb0aabc30c562e7f6e4fe7281ffaf94bab6ac7bab3284487c51b35ca20374d253f4d74c3d6b13f377721db9b8377ae2c7b251c23288c4c8432f80bb3053934492797fad18e38ce87db362d3b753d6ba7213051dbc149fb4026686b13b6d98456389c8652bf574ceeff0f347e81b6d26a323ef15b19fbe16a13cecc52b172addae6addfedd6b74aeb471f89db259e42d422838317af1c9f507fadb80681af1155b65e400950c338fb67e9a5e7cd3e6d7376b07fa7dd2675a1ee77a685a3e97f452c206f1bd9f5a79dc5f0011b052192d6a3485f7230a404ccd4df2076a4ac1837cc96a5bbced90740e5b543eb59e2536c3cbd9b0d460fdd3fc726ae5fe0819c9bfc239c5fabe7e8934bbbb6df37fb3fb2b772dadf99e46f7939f0b88803e47ce04f49ab8dfd9cbbf37c85f27d2bd6b828881a677f88ac2c17b1cfd7a56b5f39a34a8b6bbd308201ffdc768f3ba1ff4d5c4316e953bed1a389a316743ea35c4363526b4563e1125af6f03fe5a136ff7fcc5cfad8f288ef665d9267169a28662a9f1b6bd1188bd817975c347e345731bfd75a38aee2937fc4e20424576e86f76fb4ea0f97519d4dd85f84e6e16b8f409e2baf52e38a5aed7fd58cf08f223b9a834362b8f09591ee0d9deed997bd4b968b37e0cc1f804bc2d7a6713e563ba2c9f5d90a0a855b163337f11e8f19b028ce176a8316ab3ad29a7cb375702531790047e44476be2876a7d7f77879dfda8331c3520ac51f30abdecfaafe28749a1ad7e9d3968013744fc67dffa12c5293077c0f7cec59f3f8240a50fb6fe9dcec04bb6c4594b91dd51e199a981d093a8002075c59ac47c207d79791036f16c69dc3153fa8b38445a14e1bae5f30a2d0182f6e5a66cf00f1d6331110716041ba25d28fe48b7764238f7c372993a08bbbc1cc1b6a22c9281be9d3014fb3e7fd201acf85fb4c54eb2fe61516bcf3d126662384890c1c2f2f98b913e2bf595aabb0f2f691d499e08bc35ba514a8ee470557a3d541c0c1658a00da823fefc05ccfb534f42e10c28ec8a64698cbadf1769b28c93ad018a100c9ecb4aa63418762fbd55744d52074c414113d8ca61c8be46a220a21be84399551a4de0917551ce19279e07501941f3510ccb6ed3e754c1504fbfd1667940977d3c1cd0aa6bb0f6d361b56e14ddc203621112936ef58808cce1f08a555b88f4ca2ebf84babc3cd6a594221361479366bd7873af65336e7c05803c35b13723968515be628810fe56d6e86e5cffffbb02aa6a732a7e480d0342522a3842b41a67f51ca2d4de10fc5fb08420b3b5ac42c1700f9c6d82dd6d86ca8242fcd07b744d6468f241826340d77991c07f4cf63189598e75de389997eee6360ce923333932182436113db2d2a87a36d7288d878f44ab0f86e66a259221de971168028572fd5a76f7abd7a5b8b8fb9cec163d0464d9afbc58eede286609faccd8df371926967286bb7918e3fcf144ea87b02718b830adbb725c5d4b1c8d82fde9b788965de5a87d0de2c815a6399c49306012699431ed345c99af36bb94bd54cd59bea51fd14483724eaee2bc7a4de1708ec59fffc4b6509f0e9c904b08f4f60b2ba1ed75448dbf742593f3489b9dd9cea0096302d15236c222ec01d5d06f0e2b97f8176626cc5a9ad03fef5184d55ad3ffa65da44007104d3c66335fd476c2b6048dcafb5d4a7c6cb57a7fe01d3c8b05136434edf91e03c9c6d4cbf4fc513a33da26af3bd24c4b733d0c4bfc4e1c95ef440b90e5e4de39bd27fc749930479f2a808c6d2e6d1df236d0bcfaadffbb9f16fb621b95ea91dab1c7a6d45858a119236087addc1704973ed75335fb1863d2049e327a04f17d0d2d0e9c93385ca8cfa7e1de174eb6486311b89aa3ef815a56409743583ae2ecfbba64a55a4224a1ea3d6b5b528b33327d39dd56ed9022e852524c5d5b40a624ccdf3188d17c98d7916e66c4079b770a0d3eac52bae7e357eec327482b1d236ea725dd0e9ff0a191edc13ae2dd8769183da68f55b3faaded54198ecb71d94311b413d0ff6ca6251626be507d7d56f0a333fbed2680d366f4a9dfebb0d57ded571d317223e2a40daf63ed0e5d8e10f6f517c42e8ec87af8b2189aa5bdfe10098607072c41a7f442a4ccd7dd49b9be6254128ab95533f54970c6d424bb959a7ee79c1e6423639eab3d8b03260aa6661c094cd4f8436b4e4375de14d071412436c204fd838fbfa82fc2c5f94f68fc130b5bec2a521f158dcd0b86e311a9abb4185f672cf24e621cb87aa542c22b64ca19941a142fb3dcb8ce78e6c84f297b550c05ec341828f6012dae5065e51b85952dfb001bf7c565d93005284bf2ba580cfafdbb9c5ce4206075a6f1ea2200087b2fd7c3c6131e5bf7dafa71f46224eae3ca90fdec284c8a407aaaae5ae0a1948508718e9ee986641bb49fec4c072fdae16403daade326dca92302af3c86c7d2b99e11872ae2c5284ca63bbeda4aa3d00eb1a17966f43bbda458f51d187e3a6921dafed6f266a25192981812269147737397b1039fc553d63701cc20772fc202c5a482a47edee684f5727c0eb945e46c17ff7a9fe0bd36cf6d07d0dfdf012745abe5e31957b0596b7e1cb0da1acf426203d24576b244ab4f4b504683db5c30d9dd836a5c0446c3ae347efc9fd19529fe3df65ab09cc27bfedbc57933f0a8a76763685f960d07ecf52081a785670161e8cf550174279f6e86244eb018a84d5296437a0aeefb5a9ce7480bfbb3637ab1c7c0d682ead9444c8c2ed4325a8ab3f90f87a3b28d54a99a2cb6053e524d67e3441960243b3d17ddbb023d48201e43667a37caa19aa35baf6d7258b989ae32bd06e1dd318fd881e9b8a7733a92ed63607e59d71d3e6dd8a35282eab4810d4208b62034ef0d34eb372e255c50da7e7caec3f7b16fa13c873e82f0a57761f2ff8bfbdf4da7ded8bb90c385e2d21d59f719f21842dfea97d247a6c4704952e5d1107e2510a0294c5bbc1fceec0786073a69b3c571b442072088650432747c6f205de6fa652417193183eb0861383a0faf66ad052638d013dac768bad53e0617543cdc663479d0c6a7adcf3b2bad64f9bdd789e049b1bd4366cd56ed40f01966d572087265e87bdb2301727031ae2a4ecb86ee5ec368301f2d62d8a65bd1dce30cca1125e0b941e00f487daf5b83b495433985887aa55230974d96ec0e2b78165f0ba0888d34495ed24a97fe91732b568cb9f66557b04afd0d5837c74144148737fc5ca154a1bcddd4cf6967bbc7b71a0ecee8fd42d0410ef549643fdc66d9bffd67ee7a1e47c1e37d9f9bf1c1c87f67313f0359244e5fecb8e9c45dc7d7ef451712fd1bd16f81fa3581d4a48bbbacc85dd6f080e372cb1ebf000028ebdf7da1efc5328a576123a9643fbc8902eb65c2fa59577a6984ae2c7156bfa92ec8ab5ceb4a35d19665d079729ffca70c9fd3df7091df509ccc2f9f35b2aae679d8a3fd7568adf878c3b0f0c76a3c07921e1ea627463109669277fe75de68e9b5598a0cf4e64205e4c2ea98cb6723af7db16d9f8840f5adae1dadd198a0a2bac8918b11d08d9d02c1aba7f9e7605aa9b3a0e853f946d2455cb6faa106c1005f9cc9cb95702566f6f9c60e99811b89fd1e33b949e32270d857a586f4260929e2174875203e7644ea735b4802036257b1a5b20509af9a786e89327855623fc64a2358af38a147e0e517b27cbcd3fb6ccf2f64f71cc377920fd9a5f949212d7ea0a73fa1670161e2efcd13d34d5bae715ea692b409898065c42f45305acc99faeb8a467534c78df1107dc5753f01450e67f1846758677f9a94735b460fc94ce233b6b550275991b5510f11891a2f86eaf1f8823692c73ad8888d2f62f0810edd8112d45cc92035d8b96b3f37644c3bae04a3d4493e107bc8a76609ad865ca693dc86eac1a18443ff517a97a9a7c02a01a8dac1c9e4aa0812f9e4314f58c3dead4cfa41a738ee81d4202260046af21c8ce68592de0dfda95d86f0ee6fef1c7cd3d9561f3514c4b9ff2e4ce473364cd8f7c58c90af4071285157738a35d1d049ac8c82cd93bf6fb12883e1691c923528e94ed70065056e4c9773534bca88480de16c6793eac15832f628c738270615d20a884e2d27e45cdcd7e27a7a569ceb901981ebb862a0e6031124e899bd1a559f037bda5e1e66a3a1b8adce5e00932099fdd4f78622e680ee227f2ad306575b577c2f61da7212ab63e3db3941f1f751f2356c7443531a90b9d1417730294490c21cadccea4a70dce90074a269514fe561685248381cc57d2dc573b6f64e6a5ca78cfc04d6ce099ffdb681f01f472444af3e8c5dada66eaf12a71dcf6e9f4f28d07424f0e628645a65ad080dabfbfdd6a4612499ea189d8e301e45a9e0417d5a037a2e77627d0a77ea8e14e055966202077621e6369bdb824ed3f52e945f7c5c0949218391f8815c5401aa516540db33a2288c2bdb57aef3366d3445d11fd294aa8705fbbcbe53736badd4482220f1ce3b1c6c501f73a149ae950bd6e1a9096caddde2c62bfa0722f73b99add65f2b3c9bfdc93c4b1839ec7ff380ca0a26a94adcf2c1ce26d226d3bf520268c72412e58a71acd9a66d0044712e9e0795be3898fd6fa9faf56e37ed8c9b15623d982c31cf201c0e7a9b7dba4bef6a76ca9840bdd9fba332dff7c2d826bedc8182e3048934b421c30dc938b4d7ddeefff0dd4821383fb65e2d9550fb55625faedd2c1f537fd2c3e0a920ba9bdba1318b50b4d92ce2e2ea67286f68c0e12fa5d2959b07f879240b4e94c88ad820e23b0033467a469e8d473315ae928e91cfb6d3f35a43e1ea5200f316e830d16e491548dfbbb3d735e8d6ab3f7956ce2ee79a9b3f8e5b759a04aab879a835f08c7ec6499d3a0c47709a9eb7edf93de680225910c162d71b50e112850331209c442856edb4eb0efe154ca7406656ce3f4f25fc1cc0fc403dd6913f43feab793c5cefce1a6ef74065eca5fa2cf3b79241639b8ba686841e42f2bd39d8b03ec93a9d7d35ba11862ae2bf4e9e65dc440f54842a0c955923f7926d0d092e621096fdcf7793b4e6bf55de54ee9bd16927cfe1797a89d3820055950e28b62c5b4c6bedba88f0f035cb48c2742efa5ae2855a4e0b3409474845bfb39fb748b9e518cd722556555646d28bf4e7b6c2e78e893605020095d9f517be54e661c8bf469c46f4da89c9ce60fba7de752dfb5fb658ed6c26853471d0a0d9e0adcf3d25c7025ddb9fca5540cc6e23e6e63caeaca21d07ed3e6ceef7200898bfbaa8afd3b06f9b8f3dc10094d3548776018ae2b59afe0aef145ccb532e778359d59527b0490d86787c15d2b2bbd55cf58fc09f62e62380da6efed46e42142316c83eaba6d904a8ff236ed382cc1829cb5885ed9bcdb5f01515fa102ea307ff5f5a4a469caa7c898afc760ced5046765f2482d54898dce30ad1f7887c9b799f9a5262fd7b029caf83cdd284d98d86cc1bbb5e5e5190bfe020699d424170928c31792dda292a8ca4505f2d4330cc01b166e5c2919efa876fbfa79648636b794d8a9754e48f6a75f05b7a2d52d855deb0a869567418215b184f5187a2ccd4576a0f747e2395097f190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428f9cf9eaace7b568c49e7be989cccb403b6adc6f1b972473caf53a27179f7ef1c07ddc446cffc4e3b77a6a091d5b24a651ada2ee84a628f1bf0fb6bd60fe60b0f5b5cd859a92e70aba5a9f963c3bcb68a785dd75aa92896fd64497f98ce9d0f885c1481ec465ae56339b672174d321dfa36fc6b4fbe0c836d730787bf9c63241072cd68058dc7d4eb9d96b3b35a5baa3bbe808fd071557ef085fb2a546382722e054e35af66bf66cc37116342d48082d776b0ede3aa4db11002ee115e0a40206a7d608fefb988c38d71ee2ac9a2e9d056c8562d93513a425452a9e4e579e6574c43cb1ecf6e6b12b6b2f7b252acdeba3e1b38f7e54e655944ddf14af298bb3e5dbd578b566eb07cd061f2a0e4daa76819d620f1e389161f690b91eb8b4f09fe2454cb7e8c9f9f2862e8a89f88148b036e63d4c694eb95bb4a454f70bb8616be2970f19e7aea803ef4aee1554542d3b3c6291c1c005a295670f1f58187252ca7f57a8f9427379ae80e1b646a234cc89fa890c29c30bf1b18617949c5f91491e10fd86e079c6f364c3997fb872a1aaff09c008ced2b03b328a74314e5183b8d93fff456a0df789c92fc8a6c546394d3cd2ae144b7f90c39afcab91d88ec826ae54e350f07fa3c14e3e05c8078d5a37b5fdb9bb0a4a3c4f5d450412e577ed26e00830260e3f4a2e6676c75ff9c882deece3696995a30122fc0c3450dfad511e30c26c512ddd6915945283eb167851b7541c43bc681a8dd2e9aaa2c8318f9290f30c0e5ed9ca7f3b6a69c1d5e82d35658e00bf001c2140f3b8b8e5e5859f3003b95d8cab9c96faf45b1517bcd947ac5dfd4951e10c57b8f9ebbf6435467ca80ae63f6dc3e0b37ad4e8fcec1c746834f5245ea2ebc31e5459f516a433fe78690b2c1a283440b06d519679b551440f5def85a9086cdae5a19867672c6e08430178dd765279270e40fee6241a17c29d8591a3c11900be6e3f39a51973400e4cfff88cec630f1e3d94314a8470bc7a935a70013f5b33e7e87bb240b60f567af6b2febce4e06290cee59d46035fdbc6a13b2f206c2562d214f596ccb5671dd8e0d8ffefe831102922a3976b294de24117a61383d02e3a17541b5babaff102a28bb070987efb9441e96cb42c7ea16c749729c19e13cc1622268b85600e63b15277f7f53911a67b65738f87fc7c20d6db8044bde1af95838d1c94887c49058683061df25438b8121e61aa677daa12ade063757d00fc010eb2a6e4e972e87d1e9ee680fc7c5ca714d7244be702611d7e1dc14a634e9195142d45eb3cc67520c61069cf781405f9d02a4bc29b3d6997c40e2a12155cf8c830678a15d6f977973972305809bdcd36f08248ccd8810c27fc1bfe8b07aeaa20effbd4036c7e5846c55ebac905cc0ac4d2699bc9436fc12492d1bf13cea62e25af54c42251e7afc61610698100d1575a126ab526507c413424ba0c2abee5ed5cfb0ccaf11ba7e69b9841dd1e9f602b3d2ce035827418d4dd2e5f465e7ce0601d6f7e68fe4e41851dc86d860015fb0f048e749d5c42d824762c1bfe2d6d283f0d59442eb85e4703e322fde4c429046b36b3825d22313c88958a9aa3f6242fd2a364d87cadc02afb72347d89d93d0ed85a38b3d562c3b8a9b1e625c8672659b355feb5d35d186fd4517956d5cdb69cded58a63c69c7ecee061ab77ebfed84869bba366e334cb7816e76e2469004a10d73f252c813dc701c51b66fb8f0bde7e6e4adf55fcc35df64bda8f60a41f5c1d69fd957895d530d3d045951b123c9d6e296a2f2db087444cdb71599627796104ffa757d294e140c79a76a27125ff999a23b00f388f0f12ee5e62593f63bcfd8a10b2f8c4def08b5f7c353b782ad35774f5a2fc10e8b95e7d4d141ab6d94885ff35a6d4b9f46154fe0df7bcaaa1465ba117c972416e246b6c100cfab708ba9ef6e709883c75e24245b844a27329c71a80f28a0e348fbede2d4fc3959a6271ace39d419fc6d3c1e7a91392898c14d418a72e6b2c84be073b4374ce57db870c3447e0e567e38eae99aaa867de3ff30bea7613e3599c899be740f783de14d6e8d9b62a7b9d1d06f6fcccdf3b1d1964cce4905b9911f662cb86a8709a74c0e2a5e190f26a9bcded3965722092c2a2ba95ab686de2e22cea348ddc4868d85a2ab2008ad138e090a1e4885d24f57b669504b370b36746aa7055517f1775655b3f9b9ae63f7cf7efb596c9c054e983cf5488714bc48ccbe9a5bc95e34646a84e61d13545a59d6e45a8ceae5e28c58867a99f895c29c9ce74fac8bfbb5d631dae51e1441bac10a02cebdaaa89293005a9e4c850245ba4dae6d0083369d55131f5804a6bfaab7d3a200f6932d3debf681096815a26c2b48d99d6099561467781ae6d8b01452c4998a973e8fbb091aa4c364f592be6076f43086d2b5a54196c89438a11989db6fc4833c9e869b21aa70e757fce39e4923b87dd161bf694d696b55f667cb666d41bc55971c5e16ab23c4b78983f08a4ebafe8625129feb6068c925c732adf32fc1eac84fc30072d00b07f9a395a1ca97c42d142bef3d73a01c4acc530ba7784a77b4a40d9854f7b7eca1764c37dea54dc9acef8aff8148380c571143f9a13ce6eb83b078a542ef894dfaf62d738f65984fe5dfeb4a54b44ec156bd3f05838829a6c0b539f1b3a06db77a41ee509c509fe03facf6d99cfd0bc1b198ee3635a43e2fd17bf7848d538cb1891e36d7edaf8b03221d52b3436c9696ce6af994a0d84b0e20ca5b67ba510dc38f56ad0e6ac98341f6fca8e02f4918c717fb0727aa6c79cc136a0da120df1975f4b1fcfffce8b020240f9f694adcb8ddf213c1f83ca7eff01422b43aa948d85020f7cbb289523a2a121fe0557a6c9f5fc979cf0e3fd2d6028abcf83b3cd271db7bf0c12dfa5048e729f312aca943f4d503f6d8719935558addfe83abc0c70d9e6e64877a382a02ded155de77bea7e0c80852842a3418951174b1fa921f6dd3225f1ac5a12a289197730becbda1e18bbf40557d40f6c3bd1eb99d08f8400deceeb7db22a8b7921d9a75dee3863a391c4213c668bbc97df63a138953e60bee7f8bdf6f4699c9afcd7041966cda71f6bbd9e96ff0a4949068ecea3e8363685ab57f3d9eda7b47c8caa03dfb2ec22e62920d2a16bb023f423abca78541783f97b6543b30865718253cb2d3d4d24559c3c6653e8471ddb1dc9532b024352c78eea99140ecf134260e4a2e6aebff6cda62826a8d81bb3dd4a5a0d76ee30687fba7b6bfb39bc41a58cb1c9d69065e3e9987eca280d5412b8fe78432498c5c91b00a0765fe05a61296a3db873aee96c37e7a2c977d47aaaecae868ccaae5e153805fc10b88f24022c8e0af72446b500372826bd1eda09ecf6df2752bf7b83bd451ed0f3ab92a3a55d6c8bfe8ef4534075be8d1d739a8c795614bd2d99acb121c0dfd1778f9743bb0a9a43470a343e9d623f58530c727ca088c3ba95ef9e60f349ad70150b09aeb3d27bb3593c82e1878b0eeb06701e55230d70c1f407ed3d923e2c3f6474662f3033957ebd7c6ce68f6ec1e79014ea905162a045e098f5919f1cb091ee72395fb0ac8be7ec706eb8257bdcc0988153d8bc16e6d8e40963f77a73ff0a0b7b0fbaa5bba3915e8ee4d0da30d3f8784c0678d39898dd66efa4e9a4c25c1a43f535ba9fdf910d8c4e7bbb2e2c3c01c7bb6f0b38765ad5f1a234e2be864c55408757e9ff86b8bf0e25aff191dc797f0f75fa0a4b2e91451cc7907d184e641d6997f2d3555faf285caaddfe95c010c2a7f233e09c2fc0cd30d644035269280527ad72e131b8d8cbe054a24cba55967f39c6a9489c088db0d634cc3ffd950c9f134e749e0520ba2c41a97966602b7ef72d49c68cdb374ca28599956d6a20863da4e164845025e7cbf91fefc637a03edd0b221837ca3a8214c74b3c2628ba2973750cbf1e9346d62d6f3e51f691525a934bb61ad3f980b28a03e02ce4c9b07ad2dc3700e75f0209c31c6b6c821dc056bc779c5adbe9b87274d3eef443cda1dede62e6c65903c5f71f995d8bd32d68b7bb073b34da0b303657afce0ead951cd9e8a1927bfe322122b56e5b3c7460ca020183194538ee9682b50013e8acc07000a400c09e315a921106f40afad02842aa4273cd1882f449cc1f7d472eabc049c7731907a9bcfd974696d2d34391048124d041bd0b42ccc886f96fde2d352518a2e852ce2adb9bbf47d7735aa3118604164d856fb9f2c89147d5605f80c36f5b3776369a9e27a568796b6de795ec1d29e30ca76b910d88429325e731b5f0ff8fe99f3ce3702bbb316fa52b30988b4a810fb030271d1d8c4add7d7cfb292866352de5fe3f4d523d88af27239c37699ea810bab828da8d3518ab4e8a2276e423d998ccc3049225bcfc9c63efa0df2179ed8aae97e745e7134a611ba72e1bbec8ebaec643e9cb30aa0bdbedf7d50c2d6cefd1ee57f8ebb5b74eb3674ca48412b5f9d464f94564ed9514c227d4af5af7f81d7afc80c438639193f6a3f2fc4c7a8b72ae2b5bae0bc70ec60393fea6281bac050a7baaefb89b22c8cf7432bbd170a9e4907bd39a0c57678e04c4ee401002e924f4ce2ec1e8a6fb3b923a7459bf7fa1ce2ff8f98003094feb4a3d2c039f484ffbde8694e145218b9ae379406c630203add10545f67c77185c486f2077124630f80c1765c45a95443537a31f4a78a23ff228334173d50b615f83dd640135974cb811f329f1a56cb5b9036a799a4ccac7499a05647e9940ab6380fa7f3865b5f3aa84cc59ef92326084db11d7d26c0629f2baee377d55b16716c468da832f2cb64de8f56e14bd60d537235bc26962cee8abef7022f686d814d7c28afe87fe66052092f0df179382742e708ab1e5ad9f73d3bc1dcf80a91f45350fe363ad5fec70b12751355e9111de0947213eddc8f26be8b5599592391178ad00f49279c03a897e2a990950529963261bd1c198215231794fb60db1b3391fae5 MD = 63c337417fa6fe40cb3c6ae8b9d9092f4f3e7f4dde7e583d94f540383eebb0c5a80daf3b4690861c5b0e5b0d29fc448d Len = 67552 Msg = f94b0305ee16e4dd360fcbefe9793fb765ce25974eb2e172d325be7633fc903980929808a4bba77ca1f9864d1df3966b1d22b44b11ce5f7f11391d8a661a1af24c4c1397f6c87242d3d1bb81106e26b35e1d8e5ff5c689cad8eed9c85b2d03d2e3e23d59ee258d5a53fd3033cad339b5ae277a7a0282a778b3acb9d71c1e9100cfbadef793ba40eaa9e7ae0a540b159998a8414441ea01b427db8660b1d60da5983ebe18ed6fd31b5ef5fcaeb5fd0288a108ab67b9e7dfa4bee3080a203cbfe8c4d5a465052d8d14f991e4c8f5904aaa53b08088725f8870ff2c077e7337eef2dde65985e2dab8fe02222c001dae342635068852753c4541721e4b63b2b1e3ea6bdba6218c609a0001109dfd333e0724cf738b6ac9645e3fa0229b62e391e7f9f41b51e10ca57b437fc2ff6842270cceaa60507b76c11b91109ec12310bf4047020e226c6993a5ee04a21ae84f538b4a4d33a02b8539c3604afc834d402236fb1c1ce36bab115f2a1617b52664a9cbc040564322fdb6a0d3d7a2aa887ca4133ecbad5a85db06f01f3f899ac9881116590c2f0109e61ff8133efafe7ecb2c1d3795295063005ca1f406608f7ac473b23c3828a288495c1447076a46d435a39e0f05f88ead22fabad2f3055de11fb7e8934ca7ed462d543c98bb5c4c35c2efdceda082d90a49c883e08fdecca5a1c60083d116abec9af1b82ee137d6477bf920faf030fc227eae43476154a36f528642364edca421981acf300163adb267a9b15d7c68bd9ec894442ef2d0ace63be0f6d44b61a08e30b7cac6a448991f8ee8d93fcc93e6263062ccbec8b8adb363bc6384500d67db69b1f11a514e6136f99cdec8691a3d61bd00241e6d756f7dd203d26fe648c0af4cee8c5190ddcf9eafae091fda638bf8775694786970baed919b8bbd947a75b2df57e396e95da900b807a26da7d89792664d63f1421055aba76ed695e30b4c8d2cd43e0fe536b8031d8df1d959e02bd893cbdbb382bc0a5e1c63fb1f5a630ee83b4ee4e40bd0c450e52a3d8c77e20d7205b942e6b0de9faef961418581ea836a12ab1e3ee393958e18c5d0ae89480607c400e1b155dddd454552f2ece00972bcbbd53445f6e8f266bf46f0661779de3fd986003df8218cc8081d547e0026a4863eb26e20cb35a480e194e6dcaadd5dc44b35e7b2211274e24aaab06368abe26fa12c13f8ebe374838699fa39c9dc4b3b22f4dd3759185c3914e14dc3a0fef21fee2a6df4dc5b2718b63c73a5fdde6f4f67aa2bf4269b0e756daa75c531899c3f2d93c23d280488e67a659b47cd4b92a621411a121303503f5eed6e91a2b2aa7764515bfa56455e96d9fcb848c18b7ce858a0f0b9a5b8eb3fee9281507be3e26e9d4b8054ef8870cfdcea13cf6106f5be14aff5106622a71c2581f62a45830ecddf6979737a34873a8a15f4053625c5d05e567340dda94b7e0ba2154686faf43b33938d7e7fb16b7eeb66a212c74eb3c53d7db07092b6a10fa9dd25cdc9af5d619fb1059d8766e44407c5671d9cea8945ba0cf5c90eaf6f74061b70e6930c10e62eab29fa19bdba34e71b894e3e620dfadceb8a73d8fe7e582a423cba6e78d774e56941babd1db4f5924e51ce341c0889ab03b795780996611e3cd271e15b78b0ced49508fbee9c30104807c50682419d2f3ac458773a7e37e9ef7a32751ebc44f0d26d0a5c99388c6aeff35b3dfb82dc7179f8e35cf8008393457c25b0276bd8534c10e8678451b2a72d5db660ee91ee78a99d5fafaae2ed25251f731ddf4d13002bc7cba518ae49cfe98c01f7c5377c4cb0f9f3f9baed1ca676ac4441ae299efe55dadb9cbd19faeb0bc9628be73c2ef67854c8c08fe9b91e226bbfa6fdc92055b4913fd6dc586d017a5c01a3bc68ab7de7f8058f919e6b9610a40dd332f3420e2f3320dbdb34491c208d07c7ac839ce9e72cd3eb28d4db14289f5550b770ac30ad0aa53124753741e4a49c7f1f54a8435f375a5ebc52b1a352a3c0a6f20805c3185cf7621de3de7aaee8e7547da478923662c16fb5e1944876fa765c4d82f6d057723df63045e7ce66a211cd2e3bb3de56f531a77b492c0d7cea9efa2ea8265d5294a073c465f946f51a41739ae1022fa638d18c765222f94cbc6108ff403e75f10a48634009bde84198a0cc2a5e0d8e0e72caa80fc31e14cfb8e60f2713e51d1c1b5c4d0efadabe3364566244797b0276ed4383ac66c767eb2556970ee9c45fbb1004ba9500f9d0b3c58abd52fbf594c6ef65a3b701c6f9894dd8261c8a8242b6316a313de2c224aa056563baad224be6c15792965dc2d392769546b9bdc8cef5c6b33a6e6adcc4fe6a0edee654ab2fbfab42d8b34264fbece9b47e4d4b3e0c60170a5d905ef0b8993dadb63cbb374837f44efb7478547b81ee5e5640fd8b03e06c95230b87a50661c56c7126a96f9f37e6a28543c6395b37ccbb57fa9958bc5b0c7c1348ada4b8404c71990ae5fa3ba8c767fe87f5bca1f8cdf208e4e74c3dba40e8b6ad9895d61d18e4b55238822470e0c4eca7cd8457ab372cf264b11090e6500192a30f1e66df72ee4e656aac637979e2d90d163a843853909be3bd4bbdc684ee3193dcea7270a2b7ebab4322ffa9dae94c209885318669478dcad4a6ca4123d81be3c59f01b7f066148c8b8c00ea4a00ce481b0e657fc178507fbec9c14177e6d6fd93e61c9ca423527009916f23134fe6ed667c280aa24c6a6c435ba9adc641ec470e66ca0705182bbf86da533c7bff1c774278820f56eb65f72b058b6c5910e52bfdc813e05c6a29e1ca0fb41ccb38f84f77aa7c77237cc98a3d6e6e68787c470f29b3ff0ff144d43f9dd79aad4a2103dbcdb91d2852271c8c423e5a886bad9c5d5bd0977d0cccb33fc7da0ed642e3c4840c4e6e0b2a16e865031f58b479ca6b7c59c7e210f52a4e4a0fc1177ff9a5c3b2fb107508f56eb47c45b76ed4ebfb3dd4eb3fe8b1f3872dc93e34be90b89089ce63a83c08f95a093bd3aea7d1096a99cddbe0b249500bd9221cda0af2c7cc9d3e0cbdcbf180006e0974ad08911b3c07cff05347be52ddd9bf715c038b6e80876cbef828add0886b4eef5c9bfd699c0f42f140b0fa4226b5060561b144f5d5d0be41015d22311b88730d6267fd3bb03a8ea74ef3e3680df661a0921d06a3f2ff9e5c7f723aede14ede9668747ad8a00f1bda261a630bbb233709974eb7c2ff9c73d91a6ddb4b0144f85215cb5a8995175251702c617457c4ef09174c40982630a57e7b58ef92a3f3290812738796b7d899d6d332c4ec0a61f368bb208a6e8d429c144a3a5d0bf1e1da820674e7472ddc592ff73376b9fc83aaee2ad17c8b5c5abf622e1c0dfe109871869ad764e320abfb2585375e2354b17c620c67fd39bc007832d005e7b22ba058dd76a3e5b4b7cbe580254764743b74d18e0bebf7bed5bd2f4ad8fdd371687ff54f41e051001bc681087e6970f2d8531138cd645163ce184a73ed0db981efbfb2a3a39692107324368539a76ae754d6a429fadaf370cf9a3275b73b812be9e7f6a346ce8f2ce86b6bbefd093a99d685f3293b55c52d02c94f18e09113b77e802815cf90309ca2258a7c7396c95187e9640038deaee18d3009240d17576dd511b2c2e9e25da7c8d9fa874356fd568e896075987c99d69854c960e8d436951722fb723acefe96821023a71451bff214ed505103386b524cbff59519d096766b3c6bec6a5bfbb1fa516da48e90f86b419e9a5c23190d9ed0f8f78b48136159fae66afa22913c40552440455a1a8e0a3c23a85e9d2767024d87350a1ca67d86eca860620a79aa8bbe11045320f76b172e04e01f1c6a61c5ebf519da3d90d445680ab5edc91a2bda5ba12197873075da3ecaac6646ebe431d1c809c254d94cde9695d163087da874545bffd638cc969a95fc73fdc3b1d68c288b6f8c098acf989fd01d8c6ea80aa2d2c806dbdbd3b5a15a229caa3cc4211f17c3b2fe03a944bdab43ff30a4a537acfd6e9f6d174eb935b6c59136592dab32c7fa3ae1eb419293e177e016517c19dafcd7305394448c9fd16cb969c1f35e0d60b76ffc6857a3636af329071e339773f88b2356fbbd1527d29f7c0a1d1e20f70983b91923f55e746e3f40cbb2d498c11810de3ef4c13c14e2e642e314b7db3aeae580fec322ab1014e48f2ab766060a85f0cbd32659e9b028ca73ba4fc4761c2c652c74f1e7727d84697cecd2f2c89766b350dc3a8c0441cdd277587550d9e6f78b2543554b9b04e75671d8ad7fc6b0e4dfd723d7637510f887b7852f60ecdf72e0d33396560fed6534d5b7f015e89d27fec76ea6e42465d26f990825fe9751c6eb9f0c5d10b480258a105143bc16a5569788864f19fa88831486abfe31c2821a34ef955182730550e08a6e4c7d381199338233790addc032fee734630255bb97442c971bb335c30dbfaad6b65f36291a591d3cccbeb65607b3226cfb77384465a2bfdb62abe00385adda50276bf835fe91c16bf23d6e922bbda11b6f9b5365abd60e26cf735d0ddf3482a647a8667d7064d686908febbcc6a4ca0966738e66926983430a12952944dc089ec01e69499658c45651bd171cffee07fd8909d28e41e285f8ba906f9fdc2cd50137d5e7e098f7f3a3dacdd9faff25bfc180640527e0c97b0f87f6d2b6ceac519657d6c98b9fc9cb35d6ca189deed0591bf28c117799a7cf4e1b4ba8b743e4e427c528f892d355b5d3ebb9be4ef3783fd4878adcc79203e87e1b97d8ea625df77a2cd35b3d5b231747c1a4b25536a4d8b4e865505ef3652e6732e24a97549ef05932e0d9d35fbb5a570192dcfae0dc8c82bd255486e55509d00635e606402f398a7f565c9e09a6e7cc538c248519a9c308add3cf85905ce1823f97947f4f9938d5bc3dcbe47f6b256d5e99723d0891e50c6175aba41b011e4686113c49a9635704919d0deee9927b04cbc1ae6bd61e5a578116cf2baecd28e283aac6ad7515fddda57f0c0470a35357410cc057aad88bb1b4bb23627347681edd6a1af3dc38912aa1eaaf6e3c27143069839049ad46dee1a26e8f908ff744c43c59206305537db12ce7de7374a62555eb2d078907f0bcb1f436fbff2d65259a4a80c14418ee283bef7d815c40a6f08e6e130b5edf5e8ee7521c4ff5731a746aace6e3e03f91fa8f92b48171c9b1dca59a3b85125d19ba4c632673bb899d97fa0d936f7da0c55b77bc94c4fa374e516019af5eebaba8aaa8d05e4f999876f81213904e646311b3b91526333fb206b78990777c32ee93c4c340ccccd6c82efd7c66e466ddb1fe6a1e4671b688615f77e6aa99c92e516372645c77d0bc404c10ffaf97a12fb213e86ef77d361c6ce3f7400d1f2c29f99f1b55cc6744912958986296b2e6a48dd89671cf539944fc1aa05e61108c6911cf265c37a4119eaadafd6ec23c1c826bd5daee77fac948398bda0a4f75d337bf7bfd4246371d2bec5ba6ebdc3d2d1273931daf977aac704abe0e0a7e55e8db2b2c07cea02752801763fda18bbe009cce99c87ad6dc2c03573ba22798b8b39d7f69accaed7c97e45278695778c57d68a36f4118dc27304b8a8b002942a71cc5e0bb54fcd73ed3a1c52452d74b5d8cbd1b9ef25152639f8e09358ed826280b9a78a9672e0476f0fd99ee20e7ab8b15e55ead41ece0996315fcc1b6fcec4668656fbb4d261c2cd541f65e3c5040590026932498b32dd063288cb7df5c3c061b6eed796fadc8666ab403fd0cd9b3ce35c9e28c5e6ce210870fe0a070c1bc720cfd196c338ab02e97a0e952f94cacf29d15746bfbe0a661b7112204d3f31791245a1b1b02877b8b444bcfe66c70d2ce1e54714cd7d722ccdb7777696fbaf36b49cd1c0e456ad18659fede3fcb0cce69a1cc01b45a19fe58db8a0959acdef909649d44ce62fc5c25be013ee77fe947cc0fc74a2dec6de10e9f8f005bf226d0725e13bae2c305c1725c9c1666f1cfe6fd4e8b773ef59c73f410d184f8a95b20ae1d77a7d2ce4dab7519178e42888553064860ae70dd6f5d151497bbb6394593c68b113227ed9bc035deb9d005abd535eee39017490cab47769428d0200baccfc18f28846887b8a8ba94cc0136c48535be0962dc53ea1bd82179cde9bb85587ca71005c41d036d0c0c21964c5e3a5efa7da11d2216e086b91da9ce2f1110114381f8f11bcfcb8094346f60d70475282d33930a141954b392720e73c9a9159ecc562e32b10546b9e7396471cab0ddab75e9c771d7e4af6b0a298f04df0bfac8be2e9a10ad47dce2ae23ea134eebdaae7ba6249a96ff5a76c94813c89bc02957c11124d5371df5c190fae88c8b3bd4fbe67294cc77f3bb9c78da8408234f08137f08b4c77910f92036c74525a82b33585f55ff50a2463ca5bfe4c90c9f4001c39d1a323098a750c54792eb26cd405f8e8e584b6f408344584570ca1c381c7a31c6508656bf6b63786c61c1d72404c0651a82616e792f3a7eb3856f801569dd23a0b0988214e298034d3eaf7fd2febea4acdc299874d488dfb02ca07f60b29162d34550fbbf96582d91309d6802b6c215eb6c8b345af99543e56c45623e7cfeb60814970be90f0cbde14073d8dab5327e803c70895227c972f94d4672d9518ce6e72753f8bad31a7ce4741918828278a81254bee085e58c3395d78bf459b8a3bc17856e0b596cec3243d6787023a5fa5b4aba5f811bbb46506113fc33e63aabfe4136ce8cef62e8a6a56e7627e5a7225ed07839b43b315f8f04088276a65e0c750c435dc3a33b78a2b342fc87ef0f577b4b9636c10dd03fb927be0304c4ac2ee921b301f79e8103ec155df3d66a650078631a3defba1f4f96713e682666ac7a22278ea47207bbf14d72c4415d7d32871ec10e35886aa7f5ed8b8f9a24b5e756e7c7dc2d7a0772a98d7281d06451fc53350d7908d244ee9a871cb98046d8e42b01a9a68458c62d9574be9a86330d4ecc85ee649d16717ea72dcdc501d4f72b623974f491546b741ccafe1a4d11daad5ad50dd6dc9b19df82a546ba07153c456155d0cc3cb51fcfa656d9060c48e0a365ef12d7adab629795b72ea07952cdb9921d67386dc509c79be1f868ab1e46b75599a46ff88c7730472d2e803ed3d20f5c5bde3f0cca52e36433034711dc3572929c6ba7a5877e32ffceed6140e074d026d5e0e9010d21ac6714a1ac28c9d45a84c011869ce4a0232761144b66c1da835a54133f34d69fa90d4c7a9ed72f4cf994cc3b15c6eb048d26af4a4698bd2eb05fa01f488d6df362bea237250654c4d7288a935b09e4d3f76480385bbe1d95df9d81ad0df519475fe3e080499d81657aaac0c1604e1634ea499b8591c12a39997cbf65945223c029e2ccfc1385fe576c80376d2c7eca50ed3dcadaf1872942656421eee78ed38847252f548aa413c13514b73ec87f484e88a8d3df81f965d8ccbd71f10e8f71c74112d030b7e308cb5bcc08dc3b3bd85743f27f3b4bff252155ef75150f3f45a4a0137936a02a249f6812f1f08d98c293a78396975782b0488862f603f4849748ea8ff0114f62b162e44d3b22c6804d293bc3e09aab684f73ed7ebb62c548aedbaaeefe67cc71f53f55e4ae19efdac242871b25ed519b4acb0dac8edb8872d38465976be11d41395c4541127e108e690514f12c375101e9776f52351647ea4e6ba5f4ff264cb9c4e13bcb2ff82f838a9b69aebe21b184749f9bda79ba099867b9f16c82df61c0e0f7c0eacd3056a36d2b0fbba3537b0b326d1aaa226fd7646696d267bbb36240d3c65b06b3cd8cd55ade8c7ea374b77d6c07732cf8dfb8369229cf4d734b5920e6759487aa78da0198dc6a61852c6bc46a952ec6c3b0b4f6349b7087724e4d48612cf3d67ad9460f704c30cb1325a1c77440d4e24a8ad38c94133d7b8065479f8c150159eb97dbe82a5667241304606ed22fece756161ee0fababf9265384e0fae554579c45b9e720e2496d34e74b1a1cb8cfe3daffb9cdaaeb87d34e86e6a801117479ecfcc999663db45428c1b9a48a87c924c1de25563f734ffcad3afa3d8fb819031d293d33d73a6fdd895a1264bb229317b687352611f56cebaeca50200b5bba7989657544d84ab44fd30af5a922ebb623457559abe6c48716efcf68ee087ee143de3c125b0df12a51927ed4006675aaedfb3313560272f704cca4a5060b842608681794d4ccc04a5944002df8da42c9ce244ae2c31973654be204a4e6992de12dd3726d40b92a9ced744973f102c5cb4a6d27586170682a42bc49d92e15bebb2a9ce70c3d37b28a748fa53697848107e93252d4bfcba3ee8fb7fec24b25c90c9520f01218ecda9b8502cdf64ab40718312047f84c7fc90a99519df0ac2ddf6de40bf7ef623d1568a58a0e238935ca64a893913386014a06d635a1d4efb264479daa9924a7acf55a4c61f05ee17e4d75b618a906faf4a97bfcc0a4ff8437ea3228a94e3267b0fce8e0371f08d1e1f2e3f03c09f319be69d2438f01c0e842f3b62b84719910ed8ead1785e4a1d9256d07dd5a3e7870e2fd9260fd52d9aa57f33c0ca8bdd941b74d0f48caebba75ad1e89d41fa1178f06e744cba8129a38eb7b4c52928d7368a29aa7fa628ed315ed89c28ae8fc40d27ec961e9fbcb932271ee5f73de6ae7f43409dfb309685c686b314a58428a94d9cee6525274e854e58feefe16e8d0a772e00d3ef91be2e6bbaa9799c2a8e674037bf0ce8bafe34ff099df90825e4952734b374e331688e2ae203f3950a89a7eee1a6b1f0c1956f4d22452cf6c8b4f4963b9fa75f785e4d0ae60aa9198be0116080ea7dc3a2dcdd418b3cb032c1c5d2cc2c0e95ecce671414ae03c4af155d4c9dfdd497ebc79827e22ccaac4476dfd5d2f04666119b4a8b4e22396be010c601ad41ac27f09694f439ed3948b551caa5af6d90415747d059c22bf3c733e4e4d79933ba57587997ed4cb7cfae0bb84deb6b8d334e453ac12678af780030fa7f7768ba454dadd768ba2570d603d115324f0f3779b763dce59c7697113d5fb85f8822c097317618d002cc0294728ccf3f78a253a8a139960361c6cc06a649874bb3d02cf62c3ca3976d47535220c64e3d0f2cc8093650cee51d70359f6575d00ca078e6ab6686e285a5a04d573806faf3bbb680e49e2fed51797ab9249f6bf96af625d5fd06dc3c614fdfd7ede0d53b2b25466281015e5c101cee42dc7fb46c2d5edce33634c619f5160ad85a40ba79abf5e75627866682eab0d3b7102ad78f1d7fa7f79d1acde1079f2b3ae7823d1c3cd29e441f55cec6a6da32ff08cb5ccc02028df979dd78fd609549e4dccbe68ca6647514b2971e920e4412040c88cc8aa38e97d213a850d3c89e6dbe81463e31b15473ae2574df4de8967bad6489ae30c9cccb68b3a1dccc07629eb01d18cc74254aa0fbc313985efd7776e257f78a283c6333a4a0f0a450e48be4a2fa6c18bbc9ed05e1d39dd12f1590098b2efae9d9c4fcd76e24be30c828be477c5e68ab6f66e6a9499c391227f8893f9132b951ab293fbdaf8533099a9ba5d02692340cf9c4dc951c6710e4ae6d091ddaa85d4d0632d3ef4d0c76b63005e88688def9c3bfab78cf407c4ace2c3db8ad4fdb0d6252a961753201b0bff12e2f728b89df592be362619f230e59093040f6d812f21af754905544ac08ad44de219a15dd0d55a433415220a4840bae0e46005e9434fc5dfb09996d54a70693dc66080f20ac3f9165beabaa46d56f819f75d4c7aafa90ed6874499443b45545f1a7c4629be3a05c3f80732753290aebab7279fd9c6c5f0d62786ba1bf581fc2e58cd4f496dbff6c8a30b27e11a76655f9e8f7e6b2b4f026b0bd097b11bbee7180bc42af59bbe4290d757197c9780a25527d576c34f7cba11bec2a0c810449bc89e0167a2bacd7fb92f8b75ac2c37ec57ed9a076696079e46badd73b565cb90aca9f563c56d6614adf608caf46b14b9b45a5daeb9a14815968a717f0daeac5c409a20cdf2060097ebe56f87e9b6af8116f890db50f3e6b67d983f21353d7f5500f903f4ad27358fff48204af0a150d8dc32c42bb1004c07588e8708d0a4ad117a412f865b336d5364c8bb72adbdb12790a3781e5e58e07ed3b7f9a44476ce2818fd03e180dd208898d1a1ad756e3903c0c51d01bd505c836bbf077215264aff79a71194b266e79617ed6339ec3560f3e9123394529918cb8d0e20f0c725bc0df8b9e91e64833b127e9680c68695b15e76155c34b2a59d9db41fd6beef0799ea22bfeafd1b94937419477ad1b911b2c9f438e76151d863a07d8ea92ad14e5d0a9423a7af5c1d7931947ac1ca183bddbce01765b8c4d3f34a45b518c3326c8de5b98f9fb38aa054e15ccaf63e0876aabdc61b6799601ad511a93d962666e49511ff4e43883bafdef9fea278ac2e54a22312cf6d91c80f818d1482b1b303491b05f20a23bbf3be4fe1e68bc972ee484ca3529dd81071347113242efbf78bfc78382e2dc0cd273e503fa0f17940bcd412b5122147b3d02c2c5a348cc5726581453f0033ab1a6ab25879aa7e08843e8a8cbebdd43cfa89593bb8d246aea2147a0a6104b6334212acf1268f8be7cbd7de2346d2411832f14df7b599c728053d492074c81009c2d3a092acbc95a7761d416ee3dbd26a1b9c6d18e6d798c21a34713fb0b6fb8f2b121fb592be35c8117356d7fc5702b3030f48e7b33825fd6f9e74a0cb6db343d9428cf26f10f6ba2c7e70f716b07c8397be641ca118194a63dfd60c1b38e1c85c097aa1983132fe35933234c9948a4c382e41004713cd29a57d17ca26b5017d31cb6b6bb4ab7524bb561d196b6fd68d62d3623b0ba7dc2b930abc73846e8cd2e90cc1b93aec579e3c4b943d92aecbb7a6423a356540a0c0baed3690aad20e79e0423012a18034eb26c829e9c5cde46b80ff4b87fa7ab5798ba9089a106be0d2b60018f06ee3b79c096060d68b69ab19716f289b21b2a4b693d2c4f83ba8be6de8cafedb19933a2152b8bb6c49feaa32061623f77184e91851dede43a324f1bbe717544b382b470ba115ac1387f94c45ad88f015606ded1f4441c704ed5d253d3f59abc9210858bb632bb574cbf61bd4d64c0f8d84da3b2bf98001a450adb372601687cd8aa709c1174f5a089c5193601eb3c4c845565dded03e30ba93b346fbe7e25ad0cba3b4bd3c152c376fa84d67f564c24e286ebfa866c0b6b01cfa3a2a4521a76b7a7af3f050018e89cc66946ce8e38a87b49ffb093bac161d62ef178de678f0060d99421af1990398192922ef67a4802d60467a71ad74d15afc0e69b76a3cc728fb8b298d7f302dbafc4c5340001c4577c21ec8826aaf7b014ec49b073f018f5cdacd04d8778b6f9aec6cb03f30df3d2f30656fbbc1b075a8d1de462de35bdb1a01db8e7c68ff3b904fe6c41d7851e98c51d6da7e612c43aa3b87d56be5a01cd9373300f9d2003433bd66f97b4508dd479ccf935ab777879dd26dd371b462d722b16016d12142cc0dbb49eac935888ac987dc14c1432693ec4cfccabfee388c7f26ef3a83051b7586a02bf297b845748a9978e95272cdfb2de1b115a6e185cf56fe4cd69fcc0ec3272279bb575bc41d1348228b8ee4b24fdb67376ee73cdef232ade5957804912777a8bfaf988e88f6fc2a5575c71787f46d13dc10c15ea8b7aacc55d1bc3d5724e0b96a49cbcf18a49da6ae329b79c37b5b9e2bb5e5d5876227c02a25ccd4a55e0acb0604719bd7788043893c9c89d9574f5cb2c8c52fdf84222fbf0c3a7920155e541f7a2a835a153c87830e1ac65e1a80d5fdc3efcc25b02271a0ef85893bfd43eb1325470414fd3af90821c6bda637c8905921b648fe58b12c6c6a2e837d6854068d70679cac83040e9511f0ee66216f22718cb914de0056b66de696064909172cfae5fccb6559104eb6595 MD = 025dc380479269ae1739ed9631f7606fd2927f71893ad74ae864d6af7d14323be5fda67b2c456fff98387239b8eb3a13 Len = 68344 Msg = 0f49cae81c8628d290d4813a453132162575fd2fa5ccaf339069ff060679ba5ac4561d7fa6fe827c69c3405eb644ccd05c9b24ecded86d512dafda76b66dd13e9f3049cc4e5877982c39a9c2a81272a77e4307b339bae976f6afc4f96c919752294016761e7c4d4f5e9e850e23856bc312d46f2ac05b6bc874d285372fcd56bfe9ec4c261e524cc889599cea3084014ba0b624fc7aa13a722e80e4da070954ac689db28355c3be2c34d4b6fcd5f87a67b150eecf6f75a09aad22ab87fc2ddb422cbc1136cbb5e9a2e8769bef1cc71f41cc0c954ca8c0e369771ea0e8172131a8bfaf31e6881117532ca712690dda38fe7951e01a2c684c0616de8ca55fcd9e07a9e0da3c95c08e6688cfe512af190dc9408898e10357239912c83666dd1a6c8770b5d4dff9a996048456da940a6ce5c8aa17854b3673b04cf14668d297eee14f9e98e679bcb37955a9a5ba9426bc0a233e676ffecca63a453dbfe89197334788baf0daafe7c87d807e224cbd0cefc20384e01ea2cdd60bac7d9b7f4ce5cfe4594d25762b80cfecae8c365ab4c3ef569005ea5ae042ed69aa3a41f5ab87ac01ebde9f839592af0c065949aa2453a20ef148eeea6032d29d67fb1b125587b0e566f5c5c894225226b16fc406b3c5f2314fd65297c9a56def0a48909ef3ecc5daf11b010fd13a9f81d6560d340920c609d1358029c3a3a6a6bba908602cbfd226b4d6ba1ef4e17e679e948efccf6c05dca0efde68f835650ca4a7eb21a907be12d8b159bea420d71e31b3ae28adb199f3e38cd61b0d629267eac9a2a911cc73e6853144b789fe92efb63bd47e4af86996c392cf0cad331500b89893c00d17d8eae2e0e4d14c83982255b26ac84f485d0c688b31017eaed61f349b272e45efd5661845a1d495b7cfff38a2d7cc63aa5d9ff9fe63c328ddbe0c865ac6ba605c52a14ee8e4870ba320ce849283532f2551959e74cf1a54c8b30ed75dd92e076637e4ad5213b3574e73d6640bd6245bc121378174dccdaa769e6e4f2dc650e1166c775d0a982021c0b160fe9438098e86b6cdc786f2a6d1ef68751551f7e99773daa28598d9961002c0b47ab511c8707df69f9b32796b723bf7685251d2c0d08567ad4e8540ddcc1b8a1a01f6c92aaaadcaf42301d9e5346335922db6c19f3555fcdfdf5833bcfe13f6dabbe0c8f7e41f1a16877a7bdcc06e093acf062b4c6dea828161991cfd4ef3eb3bcffa76f7c5d9cf4bf026c518bd645aa75fcc7890214ddfdbfbd1626663c2538665cc3cf1f6e5cfdc868b2060d44d1222068d0f33f984fd35d6876dc0e6881504a7df80af1f4b04117033f57dad3218f3ecd35afd9c99c2d71943a5d27e4d19fabbbaabf7e7115531d7a6aa38ef1a54623825c0b6b3931808ed8d7266d41a47b3c9e62692f641a986e26aa957420eaeb7130ca925e57be6127aee3c428ff68776fae95848f5e2ea56ba0958a250150e39a40f7d13db58143be7ed6b2f58eac18a754da8e08cfdffea860b21e3be375c3114b6a5483d3289cc5d1367f5d7fddd38639980246299d08a6ff66be0377c80e78a89878cb2122f0c03e6985cb337c3c8ec5647da20be457d9d549d6261ed62a32f118ca7e2ffed4502f0672c95a05b82370b64cb6d74460d37ac2131e491ebad2ad51c607601abbd81b93a2c24418ead6d4041bff2c4bb8065875e156971014ca45da080162051bea9c77a2509214293b57e457e57b58c1f516cbcd698938dcac5327ed06965c88ea1a490e0eb48607a384bd8cf4350a13220e3a33b1801786db4db201518d7f67592d8e22273bfd1ab1e32627b5e9ce201fd747b0e92c3a87e9ae0ec1aca7ec4bda4e9dab6498d7b6e8eb84b4b51a138d30ea8ac15addf07449eca4ca628631aacfe61df6314ba480bb067fc04c46789f27b069e19125f7c09e920a780da8de18cc9c858f07c4f1fc9adc6db715ef7bfa46d17bae1684aee13a26a65718704ffa32ca4af262b53e7f1ad5d5159c858c0320c61663758a947acf231ed41d7d15e3a507f4bcdc6ce8acbd7b5c783aa9276e47f6e0be18a836e1a01fba9b874fbe4985de094adf8c9ef9f5455a3b8aaaec701efc612a8a5e04ba5f653009d038a7b077a50f28d664afeb54cc54ec073b39dd383efe15452c9c697fabe5aba2f870acdcf56cd36bb5c9f54e68e3163aba9dfa06473e2ad3844c73634c61fd59df97933857a8d719d04bac64a37b369fb9875b1b9da7c7a005c36cccdf2b8b7f8e8b081c4449a04b54c3751a1483b990a89464eabaa16855116fb9fecca8b28e65d96ffb33d5db7aa3bfe3e134a33bc81833cbe626d1a94d47cfef7bad701f00f5e15f57bec3c5424d9f8d5c7c4029a078f3e4b05aaef703095281e5fa083d61df614aa43d9a0a1cd2f0b5de63e10fb45b4353bbceafde10e695f5b02ae77a3b52a7c67348df2684a4420209740c5a7e2fa07d7b1b4acaf16018cf5cb87461f81043374768f986f462120640353896587699d67099064a1ef649835e3b55912298b22193067fc7f67ccf17251fec4ffdc0adf33ef068d80429a696372c0174455c7319e8b9e845f554f7d92aacade3b88e4b582899f8f14b6ace9c79f2ee77dacc1494aaebb9ad9b9b2aa0b363e3fe234ff089effe2d225f4a1fea893893384d6805066c146a5b33bfb62271ce24fbc8764becd7a58bf7ba3819250765862227c0c303aeec80db682348c2c853e77902a1ac1582287bcdd6c558c056f24dc1f466ecf0e5bc839aa3764106398db1d28c429f7871ef93215f724d410a6740843dbad172a30ce93570194d6147e40ab4afe9a4aa197368ae9ebf652b944d05055e4d1eed59662828489cbc5875ef587bf8074a1f0b4c42a22f1d3ee4771c01b1f08e33e59b50d6efb7711c70361831b4ef1bfe3ba9e2d7c88b0c4900454cdd267f0eaeefcb456bf82726ec3d2af71cdc1fa84fa487cf9e6e2d1d02036167edbf643eee607bbc6dee222eba23a6f4707df42cacde277aed2fafb008626de5c9f94aaf80ec2f4e331e3308f4a84ca8e306f729944cfb7d6a796d75baa1cd5ee8608cd0e4e748538214c4463a4f7e7cdaf3a31f9475963f8cd7f0ce9745f23bcf91c533b8e66964a17e7056d98ddef8cee0828f3bec6a39dac7d43b2cd39ef4e5e96e584b6e150a3797a1cb70f7c095354a0fe8e915fa14cac5724bf9bf0612d1e3f2af3ae2bdacab0ce3049ef1e5eab49cc5cd3a96c828d35d75617c8cda3e0a2dfcb8f5e8c5d4725abea292209151b3552eac8ec3571e8afc382c23a18daef513e6f60ae4e01a33fd8f2618e85572c81fb4f77430194e682e44fc9db1931e39223bf6f87b8ed65651feff91ddc4c64938f34e8961a130e160266339118ce42cf5862c3cf114a1501468af7b6541b4ed4d64022cec617e9d3e56e08465cd9976fa3016470a23f3b7a166a654037ed6fac981c2dd14ec8fd22541050e12e7b67dacd445b50b3f5603857374aa5cbe951849c6f1189fa4dd56918f4144ad6db3c779ed2af598b940ba3d19bafcc59387bc2abe2d6dd11cff611f9c15c699c239db0dd5468717443c5234b3c9b9d280175d08d1d85b4dd75ea83bf202e26c77813ec54718f82b42a15208fc21600826dc8140ac726f8a468382632b89469a1042594c9d22b739472830263d629ddada4fbf8e988bf90afcf68611a32951a70ef5b0e051f442c5c4397319020da1cf2cd96e2f40a5a6446d3029e3e3539217d613dc3d0ffe39554c4da15de4733a59910213cf1f2fe5cb09c8f44676a89661081541bf11a0e96c41ed31614f43c60ea96256da9ebb460375197bb5d788cd17177277f3219d017f3780b9dfccefc362d872adde49b8358211aa06ae8094b4be76c3e5559a42e002afb08105c7e7b0da90bb6f46aaa732cb72034bbd0c2ccbabb8822062f623239b1cf54d9fdabc1cfa748531a02c18cc4418bda15dc4d190836f25afb7cfce3aad01b775ea7fed7626f6988b77688d70807831be0d6523a1b9dd36e9b0819493ccf07f709211ec4b04994dd338ca65be1502f7d85847835dd3b52e74d9a626dd5f5bd5e4135b5909f7df2dbf60dc4203566b78a6aae68143457984c7bfc7f565e8b62336da968441952aa0968c0892fee8f44caf81ecadf0a38cc258cf4170cc0d921fff746e1e60511e4f0f26f9e8ff214fec4979b459c462717fbe84bd298e127204946d4c8814a03ca16fae0aa482b3d0c00b0ec8155d06ca154f7c95a01abbd8799c21bc41ad26d8105eadc56637f519606a9da2711904f91bb2035544f05e27f77d3e27ebb849a3445282b4ae7d89ac65fec2ddfd96e180fb5ce586b8bd6e0306ce1f39e6b48d1095c1e952ddc1d5ec292dfad50b4520e45cc66fb45bc08fdc1ff5414cb33065928d432e2a74b36e6b227ec2123aa247a598751e48aea82825ab9940ead19a67bba35ced9623b0a7abfa67a53ffc3cca4736ef7dce31d2cb7252109a9ed28117fe705594403b483611198f0098d0832d4bc0ac0aaf85eeee347bf1cac33652dadd6ce3be935be88e5cf85b80c75803e525be2151870b4b04feb1b33e126dae34cb017db909e62024c21f339245e33d965797f5cecf3285a4437beb80e6f8e1ca69c69a303e6a7d7df306cdb18f02ae9573e67ffef2bc1d408532f11fcb689be01c34bfa09b696f0e6247706b2d46c576ed12464e9bd8706e368f6a873a2d4b2a64d454869b63535a9259d22b8b2010cf35b3ef5a25482d91f9e9ce33bdb76e1dd61dff6ec8d8e8e6f596497f331f2ef2d033b18e196bb33031ca82c1b0a7732ee27a26a5ae3a9e482eb57ce2bfa46e766f2a537702b39fed60ba2eadcd7e08c20c8150d7b628c1d2801fb2d28b505dee44f03b915bc0420e192128446e9b8d9bc6cc14716b04123aac4da1db10938bbf143de0699f125836cda816421e907000a3a2c81f575d0dc505b7b07909ee666d3f6bd86c371a30dbe0b77f1357ed5e9525be021de5a3f3261ee66518b1d17c6d28f28a15de586a8214c7a934a512b7cdcf765919a06980c27a724656b2ed3c53837a7bf2df4d73bdbc514b2270910a1ef354137f123e351e8ac3ca9f778234a4b15c348fd479dad359fccb6954f8d40d53dfe7daa5626ebed253687f9a40e3e555203a49385e0e877022a085ccba941d43823ca8f496bc17e3b9b6637599d879c15f03bb757a8d3e915b70e44246c8c354e398566a4b9bbe215f1ad7b40d70e698710753365fe56d301fa311503de0940a6c718f80e19c163ddc3c68b01c4bb03cfeebbce56e9597ced7cd9960f08a13c6955ea0d3091bb47b896182f436c77b4170f734fd372c42d02c36f90f1f13a73be6c636db22c91d7d0f40b31aed828c284fd077f83a07f2e685959cb50a1bd2bce93ebdf3bef2c5b4d640758eb0fb776403fdd260f7b73c746c6010fd52113adc052ea2c73e4721b576f746ba2190d18735d5f0c1e0b8640c490cd2428782241bd31c81c04124c5e149bba337aff10f044dff3f85959a1e00c4127d1f0aed42eedb9ed779381a26eaf7341781cc8aa45dc4e03b3676cadf0436076dfd5cc10be7771c205cb3a5d914e7c7201307cc2616332f606f24c90b89476221781d9bd3784e1ad8e514463101a40b3985d24408a001134b69f023480250a933e99ddc5e23b9217d9d0a79e333a466d034bc60b09db75258e18957f901ea4301fc8e10f07c50b69afee6cf541d616090ba36d0d261de53155050d5b2fa8cd6381b4eb83ee49d409d8539a4f841839ed780d1e2d28eeeac0d20d73afa7eb0b942b050609def076611ca83996422636831230e35359750b3aced9ce633e0ee929e664378921e278d7439552b1c4289532a1b5c367ffdbd0071111265e3d39ec8b7a7988ebfd4662d514c1eb885247df61ec43c7526347c18f635c838aec969e22afeb0017bb44bdc258d50f0333aa9b7abc83f5facde2673a8c62eece924a86564d62a7f6a2061006d778c30ab17b51e4d91d574884d4497153cc6e1278802c901b88866efcb1e3095953118512df89070bb8f524d244ef9a82420c3ee75e1936e202a4680f70bf32a60e005c9f00cc4b1afcd577fd5ae21fdf6bcf3b250cd4b26a7b0acd25692aeb85509877a006a118cd9301274e40a96633f0bfef7ab3e56a7b99be8384c4ae9cc0c1e2be5d1991d6ed22811e0d1bccd94578e443307bd5c8dd04ca7474aad3ab1d0ae51a1d5f23ed42545b428216d4dedfac471f8e8b2b32576535863f43208165d3aa712a03dfc594ce997df55648dfc734ef6cdb0c6f12b36408a32cb61d865fc337adca2b4dc6ab3b43b6ad06b043c6b7e41060252acfb7a84ab2822c5222d58396b44600f6594f415fd5f34c9572a4de2ff565ffe3d12cda039b8acc48be8dbbcf70e6a961e44788f7c10f507dd42950d70131c12280d9a13c468cbf86c05112e8c7f14e16d15cb91264493bf3d11db5e41e0e946f4488a6fc9bcf2c9492e730eba3b1199e86567cb9a5e8357cd147b75f3342a05385ff914b829d3cfb9a17bedfeb6c30806dfd78f36c3665a23c70fc4f28160c55ab070931e33c164242ab64cd876bbb44ec1856c8a179f4ec7a602cbce5d201fe1e68b6b7a6f5e4f1f169c9bc5ef6e3736d71bd402dfa0ae2f3dff0ae51bea6d446ea41e4b310cb910e1b96b45a54cf9457ce5664f601cd0d0fb5f02e562224618c5552c1f2d5f5a9038772be62cfa92f12f8c93be5d668f437a9d343db45a22d567090544b8c8ac1377606e05fad96cc06b7bdcde2c00120d18541f6c97049be0d04a4a7a77cb16112affa243737c0f49bd2db23d608c117470fe44e06eb419e1ad935c2ecee9312fcfcf592d3b54f2e3913ca44a7f7cf63ff1061537bfeb155e3b7ecab042a585b5d239f311b6f6b03484032383fd3548b634f630d10f1c169d266716cd57827c59deda109f7ac3afa3022bd0884e47718d9969085ae0b9b644ead6b0d492028d72422a32250b6e79b598111bb60746191cbab90c23b9564cebe568394476985195b8a4c850cd3986e2b25d659bac9397ea0570ccca0d7472d8c27600bb69d6313a8ec4539154c76fc0fd5b5eb792c2868c062acacc6196a0b1fe9ab798002ed4e741235465169a8cc6b5b557887e556d69394176994a3f5efdf630be78ce0485128c2c5b5aa715666a87d6008cb3cea5081b5f60bf1bc1162345f295cc2819fa42ac59d8d07aeaa532f047ba42d790c5ef28cf09bc7aee6eb86a3ace00a2c18d0e4e364d64f66ca1a67b7505295e3e6894ee2ae1ffdbf9b123df93d7b4c28db5cbce3c3986ce2de43b760871cebc39d58fd7fd7a27b38585fc127843670be11d01c8f61dc456a0f5789c5c80a17615c54672b14292961475b7bf528185e36e2b56bade7a9c24584dd44b0ba2302054903f4ae0dbeef818d8dd12dd22affd875911106fc08cbbd675d4fe7056f92f78cef0dcf6968b5e1557d2c95297339ebf3ef766249004818dd5f143252f6b07e4ea01857d13063cac5b4f5f7d6fbf5b9835402897599219f106cfa5b49c145e4b79d7f0fec1ce18205b9921980ca1c884e4a1d4229db3f9a280b692891d7376fee6ea8bc633717513e146dc3d0e994a17c582f560dcf88514cc5c963d34070681c9bfd29dd86ed81984eecbf6d5f474c3407a08ec87ce50ba52183d2b605d61768ace41d03134c593aee79d401341bd19eddd8b003eb3e125ba7fd3ee32d53c3fb2ac75f7de51a204d7c7bc93170fa77e3643f8465227cac95dfa06e01c0ceb5fc9d0db8f204411ff8815a67a71ccb872b243dd4972b85227b52d42cb9c72e36948b1ef00a79a79e64847d760b4076499da43b66400e43bc3787023eb3485d8ceb7e62cf6e4b36e4b80d4ebe04e2e205626c9f0309d19dc1ee06906d964e42ff28fd411dc682d43b1da434063b0cf903a104d3739a7e7a7bcb58e8810adec5d9749123a1b9276be9bbd2971858c5a28a83f53d7e9a1cc430f3047042b902ce60f6c07024f040e237b91edfba0216c5e430c547ecb2b462299192927848c145ded715906e13d8216d401175b5e1054b57cfff5884894d3caecb8bb5ea622412993e15eb47c9f410d37731bfd09e9d1a2c8928d70fc8ef3a06c9764061ad311eda544ae977ba9e97b1870926d5e1e31bab85ca2e5616a2447bb4db9da5d1f24fe8403bf3c58fdd9e4e971e138a51e1361bec6cc41e1c6f4253b442337e776f8e0d2b706ffaf0ba0df3d0faecb9979e54c6e5970132815d1cd7f0346ab447afc48f3d72c7de843bcce85a241a285b225bf299d24d59ee75ba4f9138aa0ee8bad7b79dc86139f46bc3755c2406a0447635e82fa5105a0bbe0403bed75b550398b1cd74faa7d3e74fdbe2fe8317e8faa1c8f0d098b2fe7f40e33aa098e5513f523819e991ff7406f1fa766ac8b4ca26abfe51a4349b0df3033d3e5f03b1ca45ee56e22514d3e3f958097ac57b470c709dbd55d200344f0e10fc5522a02588bc77f272500b8ae9678cf1363a2437777f7eef428385e38b796e06c811f8aa524df2f30f91fe8c4ef99698f2ee4cecd3fc567b61de49118bdb2545df5692a9f2a0694302107641da567de8f60c7acee88e2d49fa0cd62715dd3e9fe116f6882e5ce3c993f6fb11542649c889ba37457dde0c415534b48bf227c0fe187cadb1cf29696d096b13648613021ff5200ab95c93fa4bb97f69a7ea60b349caad3e8a9db10217ae9648a236c3b1d780687b924b56004f70157fe2c4301f6840d4317d5f99b6afc8a021332dde5ed773b7123813cf2535c01d7ea34a410d42c2170ff0df8c8d1da0b0267f330d0f07163858137ca571e5f2bfec54423884c1979e5f4de33090497eefe0ef10f8ce4fb010d48b4d81ec474d25535c75c08dcc0992a9fb342dc61ca985d6e98b46a2978b6a0f09500a9f441b743a23ab7f2f4b5e1b76629a2c387c6b9990d66d9f94c7ed6c8ff34be991c2a2d72a11ab1d7227df604ceadcd5ec520a53971f7eadaac71f3edeb307c5caaa2c74aa8e3f435e46d48ab6fbc4cfec87cfdc722a8615ee7f690984af4c4753e5ff7342022d99fc9185c039fd18c34001025ca9614d8268d812f50751e117335a63fd7ad53ec653f0392b5f58a158eeaaebfac52b9a9a1fb86429f10090dc72f0a23adb6f3a736b4c3af3af7427370069d2df4def37051b09a5cec9231f3e19910351ec38e9474d8bce3fb1ba72077d25fe33c917ea6c64b11e0b182457e72f24cd6a359913eb00973e37ee9049716ec8b81dc20a7c77039a1709656a007cbc9049af3ff87f068c56d205ed5f751dda3948c5bf30b5cdffaad7ef385de2a8c9bfbf4691bef641fab2d1ce3690bfb2c960f65448f15c1760cba8e61965c4115c987657b4544044519285bd5289ecd944250af2e5b53bfc2ee4d01691ea705f8003b80b2e2025b699dd34f7c8b4c7395170cbc61fe4182572dc98a62754ac3b3ae8cb89898c6d3fdb7d27a72078177bfb2982f97de6bc39349d48bf640b414d942ff8fa4cffdf881e59a6f3e33ca346473877b28823efe17a0e2888cf77f73c95c1878600e144396a59f803986a34433f85f21ac60478c54e17802af00195b04584c0542c9964fac7656700c7699219eaf93b59c1ef218cb7a097cc4f0fe553ad61eb8d589107713e653912f9a18571507a9996014db0dfbe91b697750badcad4404f580d30f549d641b760b47ad5f37af156fa0c87ee6569d225b3e95bb6c0c30a35ded1def52898e12913835c49466f47b8ac6c03a3c7c24c2c473369c8db80a5e5472f03d1b78a2ed752ebafab13376208d4a92b97acd1e5137bdc9babc315fba7baac074f9db60e084676dbc101db2c8d9c496691bd9d8621786b5b262189f3c35fd2533882246a0617ab4854b9628c912ad61b5ba22e189f666810029de574805f284d5310db2b17ec125e2be2d4695aa6d8b4bb028c81d56d5b2107de306828e2365e6aede33784ed348610253aad3139d5987a85c0ab0bb3cdf8fd8d72b6010f85ee43c1447895449826c92a9b3f5e0b572f60d4d17c896346fcac51b446540f9c66a83506d59116c7a81f98ff072943e5e13497c7de96a34c95dcd3fd00680a032c5ff03235c28e4772da186eedda090816c075aab87c9b692b54bb55cc872743aa309bd0826ed1a2eec251f1d9b8874636ca1783f181752426ddb0c492f78ee347e5dee6a3de0a5f829eec8fb30ce22aa91b255973ee5605ef3f5a533a01686b6a44607e805a5f0798389051631e4539d77b4635250b6895ec426209aceddd647d17ca9f0129f8219756e63dd136d6fd29b1221eef1fd35b86ad70efd0031455e724c3520e95fe35e7c1955ee69cbdfd0587621cb974bfe0254a2b0b8e8b36c61034f49e8fe499ccf04146b9889723c1d4c3ae376b5053aa32df3c67cfcc6a3f600e058b6c5ff06d199ea158a07130d2ff2ead78eefcb74313354a0b790fd9493f7c9d218d4e2ca0cc9f4d4217700bb7ec9008e628c014333214fefd769caa6b15446469daf974ed710df37fd3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf2004b0574fce90376a8f560cb58c0168cefeb4718e69b8db3029c313b54d7bbd86a936615c2704615d5eef2f886681bc52ea8734917e15e89a33ca8ca66955a27be538364824ccccd0ee8697ca2e78eb88001bf5d80c4baa281393fdedc7ab5545e03f3eda6cf25e0a66a3ac468befdcb869f71d29b9630721eea7cf500e84be2cc1d2e1dca87e0155efcfd5c326ed772a4ca3154d2d64e9cfef8c6b98e7e9c57ab17a87147f769cf7b1907d08a67aa426d2a8440c115637783bcc378df9e15275d7be984c9ae41739d37109deb49e4bf3238d112d0d42d965fdef9df6ed744d675c267c4aa0cf5a637ef7e20df86254da66dae67ac82fb6de5b7b049c6aaa9e96673a9bd73a404cbdd9ac705d19cda723c4182ab9eb25b82a7dfad448198c2d4b21835eba103ed78f0d171b96c0e82d1664ce44b31d2cc6938cf374c0a121e2cdb1882bbdc9d1e22041c04c7f94baccfa6f849e30074dc85fb0ef4eccac72a66640d16ba60d0156b99e3069e13e4b6d190cc29ff8518fa7d71075c936df855f5cf6e7873e86d719a24ceedc8465a3f9b96411afd2a2fb4943d50d4dc5e464f7f8fa51e54dda5a142372820b30b2cb56239ef83687a29797eb263f4240631754827597ef9bb1932f84387560adccca6e9fe3009ce0fa6d79162c94117003a460428e420cefb488530cc74e41c25da827745baf4aa25285d80e0f93201d6d15017f6ed9a3128a436604479518390a6d6bec2d90a69851e59a19f6c5d80e497221833ce41ecddccc51b4e0d34cd87d22214d82281989a097a98009b0a10d3ec1a79421ece4e65229fd64b88e45685ecf31e081010c3ce7a3eb8b72dee4e0f40c7bfb45785d259364515cfa516bb0547a82ed53a2e57acd0f4a8156d70750145a8500cf10f154488534e3cca1267a082dfebc1f930e0bfae5adace021742546b4adeae83c0839189290435608de8c22ef8c940e5dedb7172dfb52354691273121db03b7850a9eac954cc2c10dfbaf49c914bf4887ec46cced1ebc80cec81e7ea9f79165725f49ab9550a93539e5ab25c17f83f499717fc02ffd32e73f80d1d454e9dd198c6f02be9b8440d91204485fe2b3293a1be62b9cfa80fb92232009dc2b992ffc59a3938daed0ced622c14e9f3199f84396b21207578f61aa01128e3e35efcf366361c3bfd61c9d54f182848cb8193a37923dfcaa4c12aa5762bd28a17ad404ee321259fd1b50f37a05b0b3cf7e1c353e95efb12ce4f11fc0cd899fad032e174c4c1f1eee86541970e8b4a3108b88337e2930f8372414080ecadeba0bd7e750793beeda3b1e10575f22f41cf6e8477a22d5689b701664ad68e1244263fee5f79d87e9548bec6cf46f39dae6299c3f525022ff6081c1c755f79bc3005c811254dfb6775687f6513ac7b7cdc852af5a0530965d10122d264ae37f23b99f6754af6852ffa6d746a56f MD = 810231a63c06bce7f411f1b8ef106c364564a4b90fb9b9b275c0749ad3c83983afe2044d1844d8ef76c03a1acef7c6b3 Len = 69136 Msg = db321b040f8c684bf2fa16954f6d63fd6967d8b6355f1f95c66714cf090c1e03b27ec07b76f16baf7b42970a0dde12f192e09702c079a2990d95839967bbb1692635623c3f725896baa8fe0c66bdb34bcb68665b60946325fe056c33953d0cb81ea128d0d0d8d70897747421c2d4f111fb486d4b7d77094081fef826f95ad6f881083bbe93ea8f0efaed20d389e9714d0cc9d6597feb3df37eca4ff9fddab83139b3c28eee7229afcb5c2ba923c5de06e531c60eceb8a745ddaf98340884596c2deae6c94b364cf4f209bc2bf830de456ec867f0d2a6ee3e86f6fc60812162b145f5cff61100a1e3573cfce270f219118fd8e189f47cbbe662e6a204d2797a06691ba49da896d087e33d1255f4d2397230a75c619a04b54657c9b2a862544a7581a58e4678c080e57c53270dea99e370397efffe2e0485654ee556d4997a790575dbb47ae94859070bc86390bc0fc11492a5f2ea1645d24b3084b411dfb3b0be2d053fc063f505f479e2ed68d0fc7b6524645eadbc8f4501e3ecf4e69cc697a9926b56a14e8e29b4aceaee1c9028b96bd5036bcd86aa868e51653fdc387cd5cd8a5522a412dc70508e278d35635b222f8ec940d4de5d3cfa6039bd7a1b9d1333fe0aca5117a77fcf06e3f33ab05c5eb83800064a2b710f4efaae9548aef1f8e1d7d37730c5b60139fb6447b3e1f4160fb9eee4b5d4afa991060ef0ce573f2de1fbf851ca85d39c9657f4b2295debf23afbdb039f43dcafcb6c9ff5957f51593b54c17fa6bdc4f8ef01d95c238c099943e4118a8fdfc3cc0414aacd248fed25f5c9752a4cd752be4be15b6c29d615b4315ed7a20e102ba645e6769f03eddc3919415e7945394596b3dfc40bc3a3d9ea0d507473a33edbe595ca4d94bb03e53caea6c295184d65272ee35a607a5b1be4dea13124d6d19c32fda875d4d338d2d7bddfeaa54d797a1ac4d56794d566a449ac3b56de2f31363584683786d3f36ab14dd41ed26d274b167d9d31ce5d2c3cc280052bc837c7719532f2dbd2439e7473666da644ffbea1c4622301379816aaf761e7f70b75f915fa0f2ea9e1aca0b9c41092c9228ba644cc7a501ef7108ab88f57c904ce7130e90e2404e9db9661014d542bd0949946fcd5ce0ad2354df12c336a93983ab4d5b676785de2e8874913b5392003c4b2089187643a6319d5b4cf8aa32dfc77c54e44dd131fdd2e09c0b9a5c859aad75d53ca8c46c91acc3239693d098078ac2c055be9fe3422d8a32eb9c508be0df8239070897c9d3f76eceac2f3a47253017260c3424082f90cdefbdcbc0138744d8b254b290ca01a3e892ea1557decd79f1ec94391e1f3aaf2408fea33bbad26fe1d7b231100b8f24d936cd00a9bd74aaeb8a7a57eea6e7cb45352abd13f076c3461fac0ec5fcf11cb920e15bb0719f555c962afb062dab9779fade73f942c8e17e00aea6032ccbddf0c7b3910c79c20bdd8622ad05121a766ab066524c206d4ce2114681580973fb18b1b04b0e546130e6d0edd85c02a8ea6ffc6ee29d27b8582ac7e03b55118df6a96563d446801156f10d09278b5ddb86223564af6cb75eb5a0ab283e5ae37e432b694ae7359b46f084a0f0f513b226cc0a01c4132b5db4c7fc216b04f9ddc9830713d1de6bf476a02a2341db757e1f1e8fc829a859895f1185c14519b29ef418d52b95345a2a14c85a1a5845213029003c2ef1f997d8a224e6113307157582870de7018370bac5db8cdcb0ccb766d913977cb96136ba42749587b137731ff95029fcb3364004fe7c4b10e7dca880b3cb1a57dc89e6bca4730c9b3c358becccf6b1c306e758c7230d1d2d79ef652c2d894d36f7de084e4cb2b3c2508ba06a820d2dd088f12b4fd8106ba8c38f8db7baf098a087d81bedbfb643a38a9461279ce5f6bbc5fe282d9228bf09713772c1f073951b08f2a21951f004a5470a3e929223c4db2a68efdec5b89fc5ef71c4b94294cb0cf7d83b6fb7f2af5e12379939e648e0b542cbd2d1f7428674bac8f42c45d692fcd0d3384f56308c2478b7219c2dc802e09b8181b5bb48fb7c4f9771995ebb8571308e3936c12c239ef7034827bd2373d381447ce8665e77733a87dd6f11a62af07353aec46d581e23f9a67d6b38ddec04b06f14e89cd572cff7f4883bf338fc0125ee1966df46d46a0d0b41e51569b3fa957bea44d34086090478127e77e66109d497f99c7b7adec7bdcc3613d759643bacf58d7b9e4219a4ec7cfcb504310290ebfbdfe3e656a5c36843ba75f32f953e63564efb424cb63a1c9db76e4cab593ce8843ccb948cb1f3b91c4f89fd4e9f895538df5283b2e42f1134c308a5a7bd4466cb80b1fa6f9bcf0ca085de5a590b92fef78f0fc7271bfa66fcb012a3d8d76dd33c4c45ac81bbbbff9acdd19eb161e1cd2d0e81811bd6228a300f2adb91101faa410fe51f65aa50fe45b8123efa3afc4c43be6646039b4df77920af91730fb078944c1ec78de014754bb50ebf95df5908c61f0c8a60e3c34b52a52f79f11ee6ba808151395ce57d111745259516f77e6f4ec112c2d63828d236fd08f98dd618ec90203ae96523014e32f8f563effbd2fc2814e783b610f538b0a8eaa4cbbddd8b6dd92a5c3941278929410c8093650d4bfcab194192f6aefb3a2942e01d4e9b1363fcbe064b98865e54adc99fb3bb73bb36f41680ff71bc763e0e805004f0d8110d1b448c1ec1743a6fafbaf5a377ace661806dc64deab45656c94159155d1b00d3a58c32253497a9b4b76f46e5122f49f6c09d9620ea1d080eda048fb0ebea6f522bc3ace16a5728de6544e81b23614281351454faf85cf7b0b128488a15bcb9033ea960e5eb39443729da7d9813e98c7b6e60a74e8e0ac1f6ff4b37e373088a513e9bd2a53fc46879859e6bfe7c3e745fdd10e19e239ce34c14dbc26f7c643fe6ac1996a1c07f11f0091f37b0c4c69698f193b86c5189d82a82687c80aa46561e17b1115e25cfed4514db655176186fd15c67702b80581d0cd86fcac975357971f1d0c75cc84d36e33931795308aa6c736e1acd6e389e2e7d8750319c7598068cdb274d00306dab5506dfe82815031919b71c14b6f2b289070fc8459c240479b933f306fae6a7a714de253652f3a8f21eb7e9ea78474bb913d2167b2af8f16fa18ce289af6391a69d5fafe8665d1283fcf112b3249eb04b2e9ee946db6cf544b0566449903fa24668ebee72d499b65b5ef305036e71869bd196bf3d10187685701106cb3fc35ff302035f6a20322ac4af2e6f5f986835378779f6d28b53fbce6b5d388310973138f3468142cbcee66c5813802c44cb52badab92e8b8fd80b7c0c9b7805b543ac84b725d27159c85fcef43305fdf643557225d4c4dcbffd0c1ace4c43c790215862b811e18a3ca71d490e1d5f492f48b41a034d685a7e3ba4273ae03a4d33e89b5f80ab3d01f6f3a5870022fa92525404feed8377794d2c3a2ddd17ba1b12e20bd7ab42236d1b266ef564f4767df1edbebd6f2770adcf4754ab2f234195afa61067928753100bc7f000b6f24140a08e47c1e2a9f28c67057a0babc37f617cbd4f8bd0db4abf5b40df5580bce9aec0ae36a8f27b5b8996ef10dbdd48b1e30c902fc0d0ce58bf9c3963503cb4edfcd4d611cf192c4a19e18ccfa82e5387bed1b727833cd12b95211a428d456abcdf7f8e6fc0c12d1cd1d946fcdd29547f395eaacd6f5f7421c48c5be369555ed4bb134f871a750e6235d0a62f0758cbf70725d397c1c327e9e25086dc70c6f1d40422921e38cf30a8ba8a32ec93373a8d9ca9da0d47028cd262f013743024d4296f3fee8ba81a446ed44865ac2d4f20b16e6d16944b87e379db0d9a712409764340cdcd55f4f0ba1317add6e411fb0ef0e0e221d36bedfc4e9eeb7429c8bf48b02d5ea7138becf234092cdf3b0dd565cab8ab8431148f17df332c4924aae0cc0e8955143ae9599d400d4807076d68b5ad4a1ba633d1f5c69a3c3271e826f880ace9638d42a9e10bd5a881e6dfbd2f8f2719c5006220bc990e2eb096ead9810729c1ec8aa129fdde536f5ce72a799452b6bc3a4b328d3e0fb96f0920b34ef4bff3a76284fcf61a7547d64b908e2f2190ea85edbf2b74148b1a81be97c7d3de2b990e6824bcaac1713151d07b614a71ca111b5204b371baaba01b43749f2497ca887b5fb246a47d529e868df05a57ef7ee8e109947102aad1f8703a3fbfaddc2d5052dbd6416fc889edd8d697cfd4052fd08b66e6daa36fae7244f5619fcbf5c47f394f0923891d87bdbd3cfa384b5d4d465f0c8456d07381abfe2782b62b8f1063a33bb3737cf6fc7cc843602a3a4267d8f06cf58c26410c1400230b99390291bc05247da7b7ef28a97e6c822c0d6f0006c40aa2d0f162ae38ef8a64cf70fae8d6f39bc036c660ccc2442ad8a4514d963e6e5824dbde62d88930c036bf6fd25642e2f413b724e63965bdf0dc2982489b0e43f7e3e3599c2b836856f9ff82139a9e47dfe08f5009fef24070f5323cea9ef4d94c78adefa907c5fad116f654490637b6c1cf55d4269e06700dbc44cdce1260b2d84b81fd040dbf6ca1263a52ed29ada42c38712dd69700c139a9d7d14d85f0552de5162e279dee425990320a7a856e9471a487c9946a7fb8874671d4037a1234bfddc0ef9e48c0f06cfd83f77baa090c54abf033da88d1ca790a89426a5f54d5f08e18bdd28ed60b4dc696865af7fb7027a741093392b57b717eb498fcb616bd727e94056ee09bf79e73e043b2ffc4647d3f009619e88950230b5a64250f065fb847b972cdee9159b18e07cbfe41e25dc7dba587082acbcce04901209dea72313441ff7269f94486398d636ba73ed3d099f5a63888ba0b664bb03f5aa1a908e67925dc80eda1242198fa89cf38771741662599470616b690c7c97b8eeaeb28c3f94be73aa366ce90525df1534c6b3b34aed3e52f2ad15bf0e6fd2c19d421506e272c95ec35ca9276f80020843d8bae3ef699104d417a79fb1bd3f797f7dc2e5995507f220f3d1e39ecb99dfe9668eea4bfddb14df4628f03e8e63485b08c00fac65fe978ba4ed05db2c2d01ee1838b2a6d2a2e9dbe3a09cfd09c897fb8a176e63c938b6ca1703746ecb45d61a95bf214a0f71eb9095188a3657f5cc25acd0e905aa3db5a6f31e1a9fd169c635862b217eddcd82c60596a2319f7251a216f267dc2f93fee7e143deb6662139069285998964401644db25cc350ac88c3a6f85d22e81c4f755887ca8fab1f6975662d470b4cb510fd3becaf08cc07ee7b460921144c7580ab791d060b4db6f48ed9d2090473b89d53b568ff67ce81cc8da901f0c662ad59ed7a348ef2c0b15b493ec71e08adb6ed0444c7bc64eab2a9972a837abdcd2c51a7b67ea3baa6a6e4410f7d048c4d48a69b54896494a3031c1454fdfd6ede6afe86c84c02d7620045e2b6544b03f4d650658f1e965b7a0b9a81b2e2175e28e1c6f72a3d2add7545f6caddfd600416f8511f3f07b03df2248b6bcec047003f49317546c26a4172f05d45f0c8d20136174f04fec550c08df6853ef3290af983d9c48dc86c6f87cd88000069571f9fd4cba0d348e7d667bfea0e77da8ce1ae994bf6ad09aba934f7758566d218a714658ddce6a7efdfb80a878da2ff5c59a3e1f85e5f94f085bd73613405b59e17138ac679db863ddb15e057994cbc27e15de0675221f4eba3a5e3b3b2497e47de21971e0e1e7e623725f3c2a7e19b6ff74127218870a3fd8172aae576cea6c66aa32cece01bfaed925c97614fee37a52a0228bf47d81c868d984b8f07f1c96a5b3cbecbb67086406b2e5dabd7defb57f805678936d4e94746ab4818dc5f50c41e32cf32e7a8aafb300fb91af6406108cfbf5627dbd374903b10230b6a63d7642249c0ab0a20d38e7f953c27219f03383fb497038d705901e96b6edf48abb7bb15d6559c84758a6aa8434968c0675c56b6798cb4e218010cc0117e2cdd938c49576cd09fed134a20489e83587915d6f4d262b9a47056f7215da6e34cbfb7cf9f6561d42daa969d4fef1b5c6eb246fd830224a06a9e99b5d0109030e76594fc1dce79c2be535bfe39fa2e4713e2674a81c423d37fe37cd7a99771e96555979c4501094eda6defe78f085bc600aff35891a6e4b54cd56cb71e40a07f4f064c1ab59b94bafa50ced3af78287b8d6167721308ebd859fae5de9eaab0551cfe3f01e00ca0a9a6b2855d2be828ba42bd50518698bdbf4fba74d8ab44362d57b3ccec44c2c19d67f98fee74d6b124a90a3a617ca4bedc669a962fd49b864a77bd9234645c5c08a69c6b022aa2762d28de821c65db73b26711c63eab2f454f05720b74bf37e47dfb218332bdf9cc365aa0d3fcc29b70d3a9c6819f8f5dd7ad7987b527c5f40f5fce1f84ea9f4b47f2b7078c8d23634aa2a71f54cd01c5d1d85c551bb8190f114097ecdcb44ef55dd4b6692847f8d145b1f792cc31a2e5b86216609bb018e7aea3012ff70a5da6924ed15c33a7c354168413a73487d34befed4030d1aa562c4c09724f60674bcd79d3b0374b47036a119b73e33a1a13570cbc625c4a01413b6dd663c1954589e87905aba0bb804991eb5aa0dd5972f3958351e539614f6a9378bc6e2d224fa87614475c2f20fe0659f86412dbff2cf495e860516eb40f52d3110df9f893c027f4d03b2a18f81aba20bd2a5285b7a286b6a04a2f52beab7a68bb5d8faa465178f331339e14cd50d584ce2fd8610f7e3a964f91e78bedbe41c2dc2d97c8c67e1bdfbbd330990d5b09049fe72cd4530a70b34aba0270ddb2597ff7f0caba90a0a138d49c8a2c2473952ea6e2c8764ee1d98c363518b7eb22220e833971263163799d1ff1f334cf453a41779523bd4f9ed58f768582b7a2782bed328a23623521256b027614495a4a490b8680c72fd19be53b904de8f6a03ed7aa5a456a14f8743521008b55e051ed41db58384b347163892f27d0b40b40e0d5b47f0dada517d7295dbeb4408042c8c53f612df861ab7041c881c06c5c2108769a15457698ffc4628f71836cafa94743b645d4873dec5caf96529f8a6fad106ac9b17f5d773cc67124ed7b22c4f1f33dce5ace503fb0931326fec086cc618302d1e83dbaa63b47e5bc670e0b76b95723f6246debdd948e2ce90ac5f9e8dafadf310de326dc97e330c492ae9f2b7bed86ac4745c2ae04d85d5afb324c4b65c26065b7121a50cf02d2bbe4ff56599620e67f17e87d079dfc150b3478067abe8436fe584d1dc94d315c30c252b997a48bb3ed3ac86390ac53e4686b19b0ed31bab35985f6a99c9ee92d91df5b415c33988f5514582edfdc8a5bf0f399c4196bc07605a491365130b4d77d806b861dafd1c965293a272b8b09ec33626ac885c95fef9158cf4c7daf0eda425a25e06295c2128c0dc0f52a545d05be3c2f26c8d6c3906b06e364786661b69ec0fce8b161e3cb48269f0152a4ee48efe539774910a5f921338016d7f357fcd159631780b0a174180826e41b19581656f22c229d13719a226317cc22d25c0d8897faf566fe95ad7a26fb160a1e050e61e779c11b3ba0f40d1a3d0cdf9fe87922e126facaa83ad7ed077e0f962f8f91bf49a4db6a05de873fcd4241649877b04ed979a0224a0b63ff2e323955ca5230cd7d2fca001e64d448f0da12686894535af5557e144082021f0fba4bbf7ae76c0b068d1553c1ee5b972966f8419cd8c2d5a95cfcf7482912db20788f39bdd9c3f68a4f55fbbcd59dd8db7b5b86818f9f5d79f29561cd8b16a204ffac6b0f83a91e5ce9046e4bb50b5c8b89c4bdd3534940fbb8efea2d02ae0231b20ba9ec8fbbf112ec99021af734b0ce04bc4dfeae412e931264e6f33a197a1b22259cd1584cfd30cc9c7d9736aa63f79eaabd501b1784c4818ceebc8c198835d292ba5a780cc12afb87273cddcce4bc9a389294045cd22498d067e592feab2645db78f4595bbb860bd1a598671cc16199ce542704519527cac7f91ac9695150fe585f1b96ba6ac670046f266d2a78ab0fd4788595c64c4299ec08a8b9ca293a5e91d34c9ab94d60caa7ea634a7678ed8ef3763c230b760988a51d3bce91816709308c13efd8e1e97e34bddba971509d79a3e3b7469190e1199bbd20726ff85b609cdffdf089b6c4fd233ffbe4bb7e5f625e37838b093b6dbf385f136fb5fc7c073f4557675c3a87da0c074096b58097db8af82d4ad2c403fbf37970f0f41c6d6fa052dc9eb0eba69747aa5639efd5db47d29c21007ec9485265a2b5c0bac6940c689eea213858a5b77e8f8938cb0c9e299d99eb666db9af54f7517e396a99845fe08ffc7952f019bd192d663de78355137477f8c74023bd66210c26d593f3b2eca08ca0018150570a900a8993c5e89477dfcce5cd6685d7289b394c1fc763b435313b617443d7f2427bbd4fe4d68ad0d937ff1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a MD = b3b87315402171643f4f2826ccbfa633607fa9eecdeb224395b69ddac04d01b1159034fbcde1e0a7fb3c38155ecb6062 Len = 69928 Msg = cf183fb8b2020ced8090b342dab7e400f89ac8f285077e0fb045cb58800d0d0467d671db1b5666e0a1455232aa64833423be68ec082d01a9792194e90f9da279708219de2110cbf49caa1fd5a3d906fcd39431ab7cbf8289b0f1c0909a7a8e2611a59e8a6d3a22729a4783f36b2056a030a58cf68ac3e8f87e3eb716c9adbb5373c668a7a7db53a2c2a5e753aa4159686178df96da431d3c0b8ee043433d0f48be6ddffd77fc45cc3d4bb1be0942f99c8f9593541346089d7e6ca5deb132744c19226b5383a4e23832c14bfc2f2d1d83e18511f6ddd59165ff5d6db1ba95d1a9ac6e747376db112eca901bd5c609ad6680cfc044e2f7a0dab8eba182076d0da5a0d86223f6a9baf52d3f8b1173df908d93fb0708c7b41d46ce9da71a3fc212891de99d2cab17c5d682560177e0b6b040439250083714f0ef6cfbe8410b9cc79d4a278d563f2c1b19f15ee7d0b596f4c7b81b020dd820021eb88eccbe13041428501c9a6857f1a206a4dea4e499884469191e84df52df391adaddbc5bfe01e17457502d2c9e6c43e4c05ea07b359288708e2340464e5a7e2dfb711ede759c16c7864aac68b9a7e7fd7066435d31bfa82241b39d0a7497ba9d43d05b101fdc9c6a059281e553aa7497da7ff55134148dc8575503f26ba0d3b3d984dcb9a5c959a5fdb0126b127bd4fb26301e21e69b1da9fb92dac8dc7db3b7e61508a1ae6b36bf962cc9c29e24ed717d022693f15b410f53f18b526e3440f19109468fe3cb1b02f78f0db1a0ada940077c7570fa5ce24087fa7c59cacf64a803ea004debf0f1b449614501c01ceeb2eb26737faca7e685c03516a497550526633f9da170e29e1eb328db7aa57ba60d5288898aac433726262bc1fd7ecf0db1da91855417aa0c885e6e36e4f8d1b89a632b1d57a538bb6be063e62a2744639290671f2e8a4f213971babe0760270ca1479699b03d8f5c9c1765ebf439bcef11ac49d5f671d9c77b1595dbab86848a6a2551635b1c4f0000f2ba3a235d40997557bf0e767351e5947286f59711f01a3c26e5e520eb8091e09ae9397f3ad64908b852337439be63cdaf157494aa74a46172d985c9522af684367a52cf7989e710f889aab96b28286ef5cac06af916101f30b5ad1cf8561734eff6ecddc15e5bd63eeddc0db0971ebf6b2e41e1a5e046bf8802c4e3860cdc38ede46e6fbb5f8da2b3053137b0142c083ac860c057da2e88a34632e4a3522dd757cc424e0e9366bc7e59120114a63a90892083d1b60bb1c4a90c5ee8f832f25b5536cf426302cc6bc971e531845631a081bf14da6b7bb5b9c2d9b2b62db3130a11ab7d1362b5a8f8b9d61390a72bf7804a2c79a41d3223b114379518e9dd782db0b2b488b2b3e3ab780f05e6262d75780bef1cf77539e4f2caad6fd4d4b90a0b5dd4dc6afc0463cc2ea422fba86493d0ec91639b1b97dec40ac4a9b3974eafee3e985d81e7b112a3021dd196d6d93acf1699b857b654fb71fc02a97ddaa5501c7b86a0951cc1d7781d037c81589350beb18f82f4ee792240caf2d8fa44c4d6de3d260b6e423c9992a7de8a82d59abee5e4fc283b6d0c3b7899199ef17eb5277cac0107d3022b423ac7346362f6f76d8cd86714f1d8182d629401642c30802d3eef9efd8e0495b9b8a58f6fe862b144fbb558ade1daa2e246e0319071012bce6c2f855365ef82e6546a7615dec1d02a79a2575bd219b4416ca8318c8999c0f44d933f73216cfab1563e72c00abd5d0950c7ed868b3d55321b128abe3ca146862a4453c38a22060205480ad536fc5ec8c64da196d5ef8e9d9c46c39051c1c66c4b6949ad67baadc1aab1c6bd2826de4f245cfcf378d7666a386d646992a0478ef82baa9782dbf8d68da02ee0a9e4e286b21b85063c9ce58234aff5b0c5e7d1d479b2fdeba12eed29f63ecba680de7455b7b3c435e9e613cbdb33ffcfb33d6c261525ca108d5a97a32db3247877bb9ba47d4c41e9465ff92e74220a2d244b216c16ac9a6e0e08fb2a7926c1bc5423605b4a0c858b1cad9e9346a39c32e0b9f78ec271f36debe023a724bf2bdce0c0c962671e178133780ae39adf3f46ae2ef77462996075ee89160374a8e93ee337e1a11ca87f3553694604b8fe7ad1575228063d4f66eeddacdc24b206834c2533ad00b0d3460d442759e0e827d53ba4ce922d9db98f4081f07ef42504826c6d5a37686dc6f373cd5b4b5e7282d9ec5a4a3dcfc8ff62d3a2fe035a17c76d08845486bf99aa0eceb8ad25659d380d4d446d32d5074a6710087d733dce7acc8733caa2ef7da61f86cbc4eedfb371fac429e07828a2c2275d7a16d68793432851406494de61e3af03cf49aeb3fa5426bad04b17aee18e2923c171351fae4a07ce73c963768c8845ac8be36dc9bb0a1b98025418510cd7f5cba53597ed67b8f46696a2179d48be6aebc93b34093dba61c487a682f86ac414bbee0b05d906b574816f96b93ddbada5274ff90a5bca8d7ea827e75d8b447e0d5d649a86cbd2681187c84e4f3d8e7c7ec9e6c4f8a7a8abfcaaaac0b1f1e22c6818cf8b22ab14fa52e06771e485a9547d37564405d5203b6334d7d887148cf7ae53f685e1611593bff414a87dfd745c2bda672239cd7a6639ad77d8e6db8a076678a231ccd51a59e12b999b248d37bd0f1ae1069c77fe53087d5267d72e238318ee9b36eaf06e773feebdf1e01d399eb2608b9737bbf42b570b302e61f5a1934d1da93e4498581362a34753ba95c3289a122e7e1182a315afc1d9d48c184a618b6d94eee0b61f56d0b40068b8dd1d82519a926332b2543a97061402608067125d4623f0c8330c671387b0d9e5dd8fd65f5e7feca3354fc19742ab60e6133fd1481020ec04f5676eb3861f4d467e61494ac8bdc46bf1dcd337de649525ba1cc4d63351899ae678953617146de5a6da059c3e139192d043980040084a255e44138e177e7094ed860226a458e1c93e4332dc2a4bfc21b9cb3779d15f26efe500e7f8247149f9f1dbdd0a94b450fa2fe4f793f32bac1f93bdd92bf930d28a3998689dc3f1bbd2dcbd4f6b4fed62815f057d48017c4a944861a59c2145f5fe4054bd045ac56e26957580d03dcec065b8eeec83bc057d89bfffc456af643854e47c0fb653b60bfd044a97c1c61e12ae21e76bcd8c90ee04e0df5de10d5643930b578539148c3a601186bcc652a4ff64813722acd9e34410934999c3a1e2bdc39f2e4817070fa255a46f196849293090c2273aaa0bc828b2c084a086d5d24fed87497fd79206ece7a54fd32e13754d3acbffdb4f8a0442f44fd999b110eda018abf053021f3bbf1bfc6c15a11850fd6884072c22be6239dd2890accdb9fa594cf36bec1f1574c4fb910f0547c082e824d58656ab10a9b67534f103613ac22191470171b6dc7aa38e4c7fcbab74d2b775a6c68072e6a060c55943c3f5fa0da1f08ffc0a50dc1503dc160690529a0a1264df0dd300a911e0d480d0171261a28070b3a2e1747c0c8ceed5ea7cc69cf0a0f768a477dcc2c2ddab92de253fd74b671a9b3c1baa2729e7cb7374b68ee04d0a3829d3938e977b005075b61504c4cefef43011e37a4232bc7bd6ec6732d0e8f72f0be1509f9206f1cd13a010e990f4ec09586b5f6d36f0b207e89ab63ad28b10e3f418d5961a2a572a52e33e77a385da5efc90b70a6b2b72768fc5cc2f50fcfd5ccdbe4bfb96aeda6d1cc9c63566496ffd05c914d949aba4d0b5b7d099b10465a27f1cd957705b23a05898d0ab3f0854ed595e9e633937ef1e41b6ebfe5d6bf1bef17aa8300ff9dacaee99866297893036e2977c2fa199fb671b0b45e8bcf948b70a20df11db50a7f4c5140ee1d795ace186bcd7c6ea9771b32bfe05de36761295b455a77f3c273025c75190b065f470f42f14d6ae7dfaf90a59d6546933a9f960d66228049a472065db973558ab6e237ac4e8a271c0893a758ddd59101b5ba321578f89275d791dbce93024600fca6d782d8062961d0eddfbaf593d5b5654b8e02124f371ed83cf33da628650fbd2f8f852243fa6fb4f89a5a79327d24c5ce1a31b698d68b32de0d1947683b1d64c69011b1c6128c216e77a5dd340fe653bc6742da680961541f59f00b4420a08016b9c70afefa4d9299f82b961af660ab80e5a3f22f3837c85b9a30663ece3f9b9a4d0392711a3aa5058c5a4849d92a19d615e39260fb551c3d1e78fcca8c4113cbca55ecaf1ac9c55ba4c0485320b94b0698603fafbb6fac1e87381389f36b8515c23c7e1b44717ff6f1ec3ac955849bacbdc86e6e00ee148a44dc6edf9c056c22c535cb385fc83151c43c741ef012a823268a832e6436c1fad7f4434ddeb5355d33c068a8a5449606cc4fa8c678f9dd24431522534df0510ac11e554733e17d3fae6abacebd6cfa804a842d526890c70a93f6d08f36a13e149098f97e4410a03485a3462d10b7eb48ff789635477de250a9adf234a6afe5b2b712c43587c94af669f8af46479be4eb3b9b67f18e17bb90f4b92be62692d46fb50a3a1f6781e9dfbbd93aacbaaf83c18f7b1719a504bf45f596c2163ee0a6a60afdcf9e7bc0e96b0bd39cc2f26924767b96281034cb69ea3cc57947482fc8e0395bf9353d0ce622da663a1b773f6374805b1f77b5b247e82ac3a5ebdac6b7c8b0a34b6613dc4c91980f9728c1b8ad462e5861a2907fd5da502fcc867f4bffaa11723ab398a5a931c54e287d5a6b8e65e60c93336d7a903b3d5871a9ae261d1edc274bb043ff787df290828bb9ae734e37e628ac9539038552ec29c7dffb7c916150f2beae5026f0a07529d66817e879a4839670b041ac43314959539d22aa9c518dc461203e51145f6a82dfde2e7a72bc536122471b06ef48fe84ff5e3233ba1d2c453a521073536fff222a846895c3dfe42d23b23b8ff41a7a310dabb0845534bad99cac7d0a5882918c29134cc6e78f943f178a09c40c165af2110e14290828b8161aa7ea828e17d0356dd3418a486c023b50472c2f61dd0f2cabedd3ae4d79b26f36ccdf785ea019925b7ced5c70c5bc867072094ecfcf155520d385708fa8286973a3d25854abfc379458b6b9fb5d01c4ea83378e907cec003247900c69248879539559af0a9bf6a98aff243f4262905b41032d8b4e6711c232c289fe447f61334939dbf8eb10874cb1e8cc38e0a6e6ddf67a51b1640e24ffb4cce9b2bc39211be709dfa2608a1cb5abadf543507a53b18d415a9d7bd2743d3adf25c63ab276879f7deb4825695558daa755fb0c5d857a77f09eabf064adef3761c4a54aaba02ae51e7566844e9fcac17d64ac8ed0ea8d491094695c3530aa2d0d4cdc56655c6a4a54046a179a7a6fe28887e45275018e7329d25239b48ae29e3a34d8087ff9ca51c72eef59ed73dcc061564ef1aa58e27894eef2f3733b2d0d610324bb6c16cf7de04b52b5b7fa85ed805638d6f15f3debfa30c823f1bfddfd1a4e4ef9ba21ee3127e020d57a9cffcc7dee2e9cea82d52fb25e4e45a09799efee5cb34ddaa9bb1e1693f613b5c9aeefb2a4bc9dd6725cb665adf1d30040d55835d4fe124e1c9a9724bd3f0aea1f17b9b7005f64759c39328cc66f46a14a14b8894d9c01a509113eeaf2682597fbcedcf397838b286f0f16803df32b0411ec93611cf9765fedb367c1aa0dfe4fee38ac10c0c56c7f7922c4e86b49fa9946a17b45c9b2fadf3905b4516a9cef6264e9b9671291a2db3928d04dd4b03fe146e7d2bfda3509b3896ca702aa9183700e66779f0374a8cc2d95caf900e2657ca1243c37c51c1d6d4d7cb26df08855193913890129eaf8e2d4ee17a2763d05abc3fb0a3620c4c07cf3aa68fbb2edde9e73854035ec611d9fbd8638b2bb4c8b2f4db0df4373bb7d632a6a2d24883e8aa05c404fb5d18381534612c0a2468d7057acfa2dd8148cbea040508180e706e39f41b90a095faebebe1d0822098e7c5fc5404b787ca9a50ec4d3e2088945b3641bc27401990d5f402090daef511995a3e8c61941a99990e831539324b62ad096866ce5c8fd6121904b4fff7b016e65d742acd81bd77adcd5865de868800cfaf56f9fa2b29ed172396ea90a779303698453432c598eb3e541344156468f727f0b47d92f6105f4ed962b4a7057ae5f1d15ab477a9d47db46c5bbbc61313cd1f942afb7e056bb41d0510192c58d8c07fd15ab1847599b577ddd8d1d9dcb00d1e625f79a6a06372ee6d482208e9be464860ee3441710e1cef6f338e3607673c8b23fc02f20f202328dab1d621005201b545be4496e45c3985e914fac5dc62e4d09fa89b4a99c94e3315f33d60e4bc782c4a71e96b18aa949f15221e6fa2c68c549e0c4e9688867c77e3b75faddf25331635af2ba85321b6a7b906011aa3bebd7fe8d022be2281345c0fa545f137b5bbdccf221335dee926039e68abaf256ffeb9449b20aab0dffe4a5f64f612359397e4e070a8fa01296c1d8cee25177104d76a7c154e4279cb62a99d9d7afa21e84f983041f3df030a115b4b437638cfa3d0fa56e7b66fc76be9e18ff7da8f43db6c5f863efacd2eb39c27a20da6fc867572d29bb96017e0e71a5afe1b1dbbe29575a0ac0ec7aac84c95e85af5be4ae0a14458133252230d687e7cb1b04b65483df2c5685a62601aff85053ba2c509234fcff585fb967c96169bb0725f6d75bbfc6b3583cad1d56cf2f3e80dbdc32398a99911babc3408c318fc5c07d089d284fa6958c5051ef3064d67f898edc17f87d42c157b1c32b1dc9726ea39aaaa66eb5e7396f5b451a02f39699da4dbc50538fb10678ec39a5e28baa3c0d095d51837511257dd7e70c630de823ff82eda9df244cb71bb5a74f7f0aaf948943b14d0b2facd03430c854c516339465d8f052fffd7e79acc89c6637c8eb3e84d416e76a2822c02f005971adaf0171b9ba650a3a5ddec4987f79a8c148f560ac252ecf35010b7bcac12af1813afa3247a1ac2e12d7e60e8b64df75900d56c15bc14942d04cdf79a3edbd42e44c665cac29463d2dfe1cdde1f32e6b287877d71032f700d06e0730270070e44b45de5753abb3c5c022fba938b4f6d7ff3cd0f855f4c887b9d72b35d083f6542ac9dac8eab385468e08fb06fc14c97a88ad0acbb9813e26012ab4014cf2ae21074ad417bddb2b4dfbf2a36da8bd0691695b8db7a752b88a2adb2a18d8d718c9654b62ca698d262a7e828d43caf83edaf5bad252bbf3d822bb6b05e320abb6cbd94e0f675a44068aaa3b012fdf60e2a5c26d610343ef0d6e175cc006a0db1886b7b522652c8a3cece37ea7985281928063c5b26febaed8eae322f0e9c60fbea89523544a4cda39afdeeff903c0d4bf093e665eff1fbdbb27934001032c9409a0061b0d8d37ce9d61e0e17df8b6c4d89ed6c1cf275c863482ac4688f9311289eb6f0ec6b479b1d8919e059efd80fc6fbfa16a7b7f3eb2d5aa82a8f1227005d009547118467f2e7bcd6acee478cbc5f4fa42c2ec6d12ae0efddae9c21565d84c884ae46ac9d4bed763cbafe70103cc08cd1f5dba8794e2410b098b84488f248fc6a6cb36a516cdabf3551b0f0cb5790ba6bbad4e4511fa3c4092f0a0425854ea631ca8146e91e549fa9ba2c5124d478e259c34102c3640213d0bcbbe895df41cdc010d8c8ce29031f7e3e9b1a857d1f0a83584b8a36e7ec05ed87f27940c8c77aff86df79685591469d2325d455182e3dd1c11a05126e07a349d8d83d8f0788b4d673bfe01f6aa31deeb1f106fb6e4c802b45d5fbbec2fbf4caf795bee8662e832d219f865c2fe4aa59322838e14722dd792ea4f2a4ab7100592b5084b4ab5eefecd6a8f1856df9f7c7ecf1f36e6b575ba3c2b0742bf011d0dfbe31155c9fc201fbdb02ab04ec8d0c1e2875bd0aa19402914a2108bb5b826b42f661fb460a02c04278d43c3f7446ef482edb211db281db2c0d1f37bcb26dd96c1c08bedcb4c635aaf4462aa0cdccaa2b464ca40f67c5ed5a55d18796be792343774de48564b566199982ff8dbec845b1b8f0d04986094104685f82b2474f50b15159f7a8e4775d78adad427011e2c6c1cbee2c31d7f4dd138ff2b0761596689df0547faffab522b079f27cb08cc13742c96f4030242fcb6d12b2984beff774ee9d6502016f17bba7457734b5f80e9f1ef89a95af336113fc39c6c29a9e1a7b8ea0b40a060a4432475964f2e71c70073ca198b214cd33bba64c56b6c9eba68564416a1e2695e58f77fce23faec29076840b901fc8ba4dcd55928cfd429b449b58c8afc7c9d6a1d81e7719a172b015f4de80ab6534c25650f0548e1e6b799bc3527caa8b57972117261230a29bafa88a3246110bbfadf74d5fda84a1ae4c54073aa784f5389e0c5376154fca9187f13e68a6e999d042d7cb8a6c970f72db166ff88f648ad4b30b95f6c8a0a0bc00971a68e85b98d14a9fd25952eeee1eef8a02757c73d494a0c6e48e7348ac85e243261a54918f298ef66bb4d3b3c91c5057c897b8d95ade2ce448265d727652f49c696732b00640d3859c83390b25d3c626c9478abda41b1e0ec9a6cf44878cff4beb35c9e3857ee4f36faeca208cab199f0e6e39473bb43feb70f611e6669ccbf7b46e6250954b88e9ec1dcf1a850c10699ef20ea1a60f572444ff6b819be82049cdf8451fbd0f860f1ab88f21995e752d81bd51f06d962e604da7253dafdac6e93dbdba798632a70c0168545b4e090e92c0b54a5f19b08b4894d7864129d9847e0ca30986771cb389a91364f32f75a44162c4401331c437832078d7b6914c24b04294796d1835722d1ba2080fc10bfee16fd17d373d3cfbbafa7061c3709d6c29e8775357f1e6aba15efe88d88e31e61bf0c347f1c57f9d9528a969914c33258e0633e06b8b95288c7a0d2c751d502297ec84e76952f5e5bbb4093a48b076178aa2b265d26dacaf9778b93c0ef6d17bfc6bfba5c96b069dd5a57a1b0f21ce09c3c6db2db31f91096a5fe9ffcda21ab9f37510c836991a8b8a04e3530e29a3c4e179967f372aaefeac3785bed8a895a42313ab9ada63997983d82b2b6e4f5d118dc4cba285156955050874c15790a903354cb461dd51eb2d68293ceb571b64b66fad62dfc7682cd81fdba05073e3bda0d029136667eb786fe000fddbf016217b2e3f447e22ac5e4d9fb7f0b353273b419db0b1f19ebaa9099364564262c7fa2a727f57c7c068667d30a54c3121e78aaf43eb7449ad45e4c12a5d2f6ad4b75889e5778401c924ae3078ac9c1402a812b26be245b8ba1492614df370996f6ca4622d2eb47665689d2d1fd4c8a220f43b11bd9c0d84eeb01cafa32f02185b70447bf2accd6cbabd9b3ece25b924a3526d96e021b2f670a0e874d518cb2fbf4ba29cddfab82cf3aa10292da855e1b34b10077d791e56696c60778ab6b425c383248f951f5efe36b864b7e364852376668c2d3bad37ec009deb826b12a54491a2341bc323a629ab6d00b099613230172b49d0c3c3e7ff5ebaf05b203387d24e3039070f0f77f77c544adcf6a84252bc22b0b8bcc614d9aa4bd9cb5022401825b39b1c20eabbaecef2ab03a3409fce8ed427accfbba8c00dd90d9aa3e5ba5e3cb5c1229fbc5997ccd18cec47312fefb4c81776a4ac8afdafebf490c386dbecbbbd15e1338d39fa9b7853608b84dcfc5686e9dce2a0a2d8b709f675550c8d09cb54fe208566431f666f6a2717408c3c9e9703a732a0d8984dbb7b100480b7fe9400e4a93d4e5f4d533f3709926d29f8b282cf9f3bb314879b8aeb2a75e941143d4c2f42024e75ce8a6f24cea4149a79bacfb38ba6e13eebc6fdae8b534f1290eebd48b47c6d6de83487973df63cc704df0719341a323e0df99d2cfb44bb14bdd1dd95c654b32fe4790ffa1f30ed98e448b1686340affc355af0ce42f0332ee20b337f423228a30a8090b43cfa2ff55f1f5508dec05f61ab1180fa2701c24846c7476feebdd5b2a172922d5cfa0bc6bf897b616d414b53b647d519741c6d4b322ba2cb949ec142f3769bcd47db88f34ab0acdbda6b79bb9f247594efeb3e1dee5fcbfcfa7df43c46b535fcc443af6449bc6fdeece7f382afcfead161163ca7c28c4a6be9007789e357e7229ddb870203d54dd26a5dc18e2b71bc3a91456fd1f6daa87f28d2510f128339a7984a18b3c221cd1f1d74e9c95e317136491fe084d1706c9f81998ab81a61b4f37e386a60cccb772dcdd5751a8f38932c4f4c96a69c771e35bafe2b6b451adf6e164f86f26bf9d36441286c6805adaa866c759920a01647a89ca83b10d9d643812a34734fe4d46a2d4314d79d09b93cab6842f2db22766e60ef40c28e1fbc6692809239618283c3ee9941bda0e384d3030b5aa8be6dbe1bc57b6dc9cf5ff5d20be20fe10e8c2e66100c582659db35f6f61d66c3b0c817d63f07d856bae1a80f521653714049ffdcfc64011bb039f52eec650d4c9b7aa928365d287437ecfea3d1e407f4de021cac1969e3a28d44eb014dacf84a66cc9b98124306282ec91f18ee16d36fd000ad5ecee3a7c6d84540f981bacec5f90616af3b821a7c87c132f613725eecfe88db7b8599f48c79841b9ef05738c63c7041f319e20b772a1a60c3a7c2517250e5cd8aa55473fe5849a577034bde53175145ee142a8221001cd00912cc530aae5dad1396dccc235edc050c205d677772f3492895242683ef11ab4fbb590dbb003aa09ebff9a603718464e5b1577c37359c76280296a0a4e03f181e0c30278d2ec2d0b48a73a9a77a8bea8b1cffc49d4895f476c549978dbcef40fd6c1b4888203e65dc5e117e166237be85cb1ee8b09326ea9a4405b444696a4a7443e018b5bef5879fa39ccd580fd1095b247b8f78fe96801ce9919fd3d1f55f0bfa48411bf1315c84c2dd3d766ba0f29691e062fe722fe0851bb7ff41dadba74bf71b68c29f380f13219977775deea2bd78130849d5372f5d413d7c976e6249bba32138b3b154c6d4299b2363cc01415843dd2a6111f7982ac5ecbfdc74d46ee4662156f510caa95042aae843a223f6ef5906704f0cb741760e8c7018d4773d4ca9e56d90a2e5e20ed58d6e1ec699e90b2256811ab0bf52c884e537547694df7dd233238d51ec9696480d5efc20ae4333069506cae356f4a98fbeba9742727bff4bd420f30426f07105f260e598a92cf06d8aa6688fc54ea097e1a4e9205b3a587a900dcaa3dc152672041be216d1cbc9bffe0afb9b558a3504149b52f8954412c92e921b1557303df90a38fa8270494664b9da8bef4bcdf03e2047dbb269c0b49f7856ed44dc673f01ce5e36c4cccdefc583bd2173f2425aadcd528b361fd6c76334024817b6e2b3f116369cc42d804d48245bc30f910efabae2616b6cffb0d27f2b3d34762bca2133ab68376bdd8ae756635d7cab6f5c58cb291f813c51735d5a25b0ba498547112e559b0c9f23124558096b512fd552fd4a6831d78f5c4af15cea03e1780a800c4adb7725494640f0b4de2c4c830b18709d6842754b695b15ed41ddb2ec039e99ef07a689528f3d6fd4aa49748f59d7392ef1f8615ac0ce5175f3e6338bb7c841859fcd40a046314a1e3569d13c07b7e163cbfba5a2a9cc2d5cc9c76e3e70278b746c97531db3440afc47356c705cdfefa6bdf4490d6c7d320a88286bee74e3ff2536a9c9af1d9c36d5a7554c14a178eb5e908b53825008e7e8fbb031810d2325fec5aeaa40ce6456101e7079111fa95ef20c67cde89e95d45ce908c8e1800f8668e04cfeb70cc2f317742efc4d1b9bcfccf931be299f4e82cf19d838f418d1a9cc512bcefc20de94517139dcb2e075c6531f902f2c985978aa54c789a41c8e1690def421f752e1c126dc362127b560cbef462d27d9d4de3e53627dc4d7d371561e504f0090e9f302fe7fd0d493e184670835afae189a065d340ba3f177869ff0dc6ee372af2f3be04120adfce0ad082106b5bfccd131f85cb317e1166b7e436c3402597f3c6ae2e2578875a1f5611582528e058aece2ddc33a4dde3d9b0083538dd2582f1fe30f91a97fd1cbba45d211528828ef51f5dd1b3076436def57872c4ea8898b40e2eb739dcd698317a068566f6ad104e9b21febfd5ab7af4fca787fe14a949a87ae9e129c39e4d0f4bcfed911fea7d09a60ccbb08c1e30aa3a07ed5ad802065dd914ff60f8ceabb39dfbd23a10a535b4d490b14bb736e86d322c0b41a14d5f228d127a55c8e254bce52cdbb85577cadebb3057c7d37012bc79867a790cc5d4b52b74da9ed073a889b5d552927adcbcf5ae7e27db7d74402684a9a3377725d78418be98a28bfd47a89477df6eed4e8c8842dc99fcf19de129c7f82e237cc807fdf9525ce777e992a7e5a6fa941937a MD = 3d71f08e52812bd83b34694c14eefa3ae29bf4084e608c7832d23edd52d33972ec3164f40477f4c45ae52d147268ec8c Len = 70720 Msg = c3bf9dfe9d6c26f543188fb45729b771c726178cff1b9a185e3faf96e7d49d033a4f1816c2b911c32f55d203278349d738e4a48a12bf1f37f3a31a8c624e6fcd20ce021c5ce69af726b3ef02268f04078e36b63b4d2895c3864ef47640df3ce55f858698d3bc689b0f7b0e3abc178d08af647526191da5c1fe8664dde94fad51ddbcc9138e0324b6d1f6593152e18fe285b608d3df67f73b45949248c566691b84bbf615f78375515669f6714eb7b09ef77398ca05ce323842c0a73f3cec194b3ac9332475030473851f0d821a5f9843ece54c94f51affc1dd51cb4ab6a864e7e92fa8ca704d7824465fc7ea1ca1f0d94e524db8151305ddfe9125f29b63f3f978367f8e50277a6c81704b33be4760690403c2becf81ed948dc6debe53e56d88cf23ddf87e5ab2541e9bc2e467178ff9f640d42f8a2b5eee72391d3746f67b9dd641ec9160aec7e3062854867edb26940c51ab91adda01f495320be3dc5ec53f75d7d4e05fea62221f5f28a06d59cc3f2e7d6e6fa2567eaddff8d04c7ee4f276942cbd6ee4d82a17528767ba9b5a2a04440d464ed0677c2236d593fa9252aa4a1b89cec1553ec8cc88ea385d70a5e8ea36495ab89fd5a359840f7c74826e97c4f2362f631be5e349a7cec40f5404adf9ec79d33477679c5cafefb542b4015feb017b09dc9f952494987c335baf3d213a4ee5d84bc0e60f33a0bd63ec92d2aac831a084b2481532b7443cacc6e919edb445d59283e21ba3e440c1b1fa82ab216168ecc76f7d2fb7ba925657da6a60b970b790286745cb01797643c5f5ee526bc08fa8fb9aa8a958a369115d1e9bda2c748e5fc37c52c1d1f9298ac7653d9031ed8f1d47bc304cbf7cb3b6e61ae24eefcab08a8b4c6fc4ba6d43dfe0d0d72d1bee4e90d45c7de0944d578d1957a886aa7a0759a75e059b64dcab8a37c024f1d0cdb64cc902f72d7e1c3dde1f5c5648048a7913403a7d0f784e49d3f6bc8ca4f992ae984f3706fa26f34df120b1525da504f0027d693de89ecc0501424d770d3d431dbb8e81121134d96f0d43df068d36ef536c8772afee7d5cc75e46f94df545eaedfead6b83384fd78b7cb06dd89f5f548a9a85dd3ae8be097730274b7624b98e05a9d57ac1381ff3898490e3325dc73a7cd4a03345a008d8fdc010c85a6240384d042d3834d94d37516e0bca7b8d17a9136200fa3adc04d3415627fa617782efad56de2c44e281abcb8248a91bf8f6aa368bccbd80655a012c3a9468f42a28bb0de90fde5a1d6256e00770087a660d43cd982d017f03b16aa4b3809a7944daa45503e9d7dc5099407647aa6f009f047ec1d14a509f7db117920a13195a8e3fb36ded949e3444ce7176881f67156a8263f87e4c31489d030fdf88746cfdcd00ef3def37bbc8c1a8f2c913f67721902ff95be75a2de2294f5a7172cc1bccccc461ae50fab7028fcfca553058288cdab448d2549dcbd5ea3c01321342af2d52340fa65a06194975ec0104266d01be0db958460c3c9389a8730b09b2ffaf8a26f8030e538369043ca7a0bd3f5c8a1ff4e5329d58600d672b9c80dd962aa34a11b745cf8499309daca7ad67c14e4b1856e1ddc18031c2d53a5e699808ec13d5db19dbcf356ef47b8d9533ecf56acd0ffa546198ccd6393c9f61cd21506d88934cc8cff8ae2d4006a718373323d9976da9e7c70c8378fa05204eb460b6d48aec2b69293136fc99a6c2d9c32493c2319b2b421604ef3e8e9686cd263d824a9f4842a7ef61160389c3a57fdea78c4e24ff480c566756517c5998852ca0fbf6510f57272b72976c97c519b391a458a5f703c8ee8f1f01d84cb4201fcd716a0127a93394e44bff5c4c14e61de3033dee320e728fca1338fc8711e44212981792a97e9e9423d496fd2e18d464dcac84525e870f980f2b43e5b4d7ae9701fd4ad260f660cfeff5a677c73aaa31848874f802d867b0644f69ba5b6e44c6a5894be8d37a40ef509675f29fe0322be47d5708a6684280d367f3a4043e6e76032261fd8b7007994e9f4c953c7432fb037473acd29f68af635b29ca38aff64f25b1d6390e427d77f2f87388285c7348e956120a0fe5a1e61c1353557e29a3fb121ff0c3e6566a31438a32f4eb02bdbb9f097a4ae4a2b4cd0778b96c5f143c1fd252f8c49a16966f493bd1010bccd8fc2c77f395da3e6a0b2b70a33862d88a666e343563b3e9c9d80df497d612248bb29886c71378218b4991e458e00fdd5575edacf1c9b836ca14969ece9c88719f85ec203ceb46b4df2e3fbd218dee8b64f757a1721d316762cced1fbc7af31add1f2f2c9c46cc5d2d633fe14667884b8192b4fd0288a7e359a81861a999dd890a2569922d4b93853f8f993a0f95648372ee0da7e732a112774f214adf20cd25f142a23a38232295db5b53afc3400a9d00b469876942a75c836a0fc4a5384c56591ce30c04f501f3ca6f7727ac8f03fff38cd185d2e1412947a0ebb64209e184095b33f0dbeab909d3720c8c10abd613131d4c896836f8e1899abc07ffba1417caa89bce032ad13ec00d1bc538bb0b3f2810e27b756a53ec12ff8aa124746d7764ab228ec5dcd1f958e7abba6ce82bedf90c9b433fa4dbb2aa785e6bf95e750d9f0bd018692841a462a9c453f45abd844fba80c90f0d169c18ad3f4dc5a1b33f4370ad543737aaa6a7fa6e781738496cf2c298f62ccd8e102645352fd264af761784c22a77319467ef83b2111eaa570caacbecb0e00bcb779ae948f966d0f21be4ec1683703e854f01eb970651da70ce3f7d82e071ef533a3d408193ca0d03947253b1456b8407c6a7db263ff8ed1b197882646f28a2b0bfd7f3e7e646426a4b895f9c5ab02ea134a7fb66a45b0ee1561e7f9a434d4c6a7030a982d82197b0a6f1b8dea88762dc01caf25f1ec26349ebf91f2a46281407b40f0b5b52a5355c0f71077f1938483e95d86919937414db41d1071e5e002311f23ec0793d1844f6edd3f488940a0a515899079dedba4a1fc06ee27d751fa110948371e57fc3eb07a8dd26000047cd9db3d575f212dc2d9ed098565072cbb58a01a7c6a502ee5316a85846ef4735bca90c535a20ec22e4dfda160b9e3d4d8709a17266c3ace1a4ab540bfb5e501cfcfdccdc5f3061d3986a44b1ab6fbeed4014dcabfa4667e3054e16c0ee530346b8215c382c295b3970c87831dbccddf208341a1c29371a3d9e88553dc7d948fa169e222f6813c19a9580dc5e45bb82a606efc38b9c9dad3898e07a4b2df5077f3efa8888bbf67b3f2e1adaff9147954f63d03fc1fb80071a1bdfebb2c8b1281e59c0f50dcfdb7070641fd9de6775fe36465cf686ede9122b4e0b113a4114931f8f75d18449c98a755f1641c16d4fa5a3d81d51a11adeb5b55aef54ab402631ca07a383b6d4c9b095468779714edc72dd419ab6dc2b6ad8fe67101dcc6cf0e866ead1756b16e2ca1941faebb6b0244e2ea85b8efdc892634f9cf8d2666e79a13d5f880e6bb71cc1497af8fe573c301fdc35e942cd98603ff0212edd41edca45958f4fb67d607f7b6d16081a1e9907cf3012cb381444db52291f3aa42592e9bab7a2aed56bb914e1cd40b3a7d16fb144726489da9a730b8542bea591da05e0eaebbf2dd3fb69e2dbb11e800d39683768ea56ac8f26cef9c18225f50a27edb7bb790e5519f619f15260d8f7b51e2aa021e00dbbbe82fdacec337db579d6f37417a8b8ad0d23704a2c2397a005485df4599bb43ed174a72cef9bed6a45adbe21e5c1e5be184c17f453428304667eaa3cf76471bd2fc57482b3029e9ed675f7c50d0cbc0ea337b5f7ad05c3aa418ab97fe3836cc1403d0eb51fb2b7d894f5456976d1662714adf35c24b3801afc3231c50540cfd16ca31acd1af261a1e7f751140a580b91d476792a9f96e1dd013fba1645e2bf761bc143d38e09c4803741c2ceb0e8d1d24c5aee6905f40f7ab678fe7b8bb36637b55d2ece624007fdec9d419f50cbe374e321fa224016317985a7a2fbbff9ec9ca24086c67edf53a06ed17690d34767ff0092465c37447063d592519fc9fd792d4a32f1c4ca2ecff225a508a81fa586f90d777a1fd2c6f4bf0d02b16e9107337316fa17ce2e74a47a7ae3a0f01d2d67ec71963e73f9e3e41597bf6a70ff5f45f56c62a2ef92fbf9c0d351e56eb526335f94b7386194e468eeda9125adfc4cd53bb530372cde09f74d99b9802cd0da11dbdea413f08b11aad03e408a2e6e170cce5a2d808ffae7c5a835e11832548f2ae7b7247529c6b2cf462b9340fa3f091135c121251fcedd8d590d9156862b8ea50b87fe07122e0f02d50954f01955680df854d4cee4423274e98b93e2323b1fabcfb6fb70b6a9706907404941949a7c27a07a0d22e73f30a4df16ae633e6e8964bcace3581a201c2c63383bdc72f48f88b49a96c92fab1d45c315a981b0aa16f759d17e69487c5c74715af168bb4de757bc1e356cc470427e1ef24de592d90c8d2e8e934947a37869ba0c358e778ccdbd416db3b3af74e77877146237ebe2b44dc449eca01f7fb832c5b7cdf6af9989e2caefd745f7a1545b56e3b01ec4ad5660a26b4f17d9f763f81ac482476b5c63eddf0c6bcba4ddd04e43c7fe4324223aed515d85557bf2c3e242991c29b1bda306082c35ecbf12a479c728154e1329a71d57865603105a1e19c4a063468ba49057ceb7ff514f271905696ebee69aaae7183e4d89c99d16bdc428401f4300f97305b8158fa15c04751ab201bfb3bf8d40058d1ce84e2c0ee80cf7e017cb18a4943b4faead85ef9100df294ae05f8cbafb0ccd5a393bc42ae719b8ea1484dc8d3b1f19eb23a50eb6047d56afeb8f09195f57856e45376e520112f3c5de16539cb0d9a032b8a8c45bc71cc199a6ed3d93b60b3dc2d4eb316e7f1f31d93d2a86ba3a926cec3337166892e2f371db21300e46537ebdaeff1566a96af88ef9687bcd237203825df90ec5adfa739d50d3ea735955cec79a1a2222c718d34cd9773cbeb1a0ef5afe97b35a608ac987ceaa74ab3539b84861e4618a2154477ba600d1762d45b8dedeb80d0ff3bb7e951c4ed59d2228c1a8cb07d987ff44de8328aa40dcdf88e475c40525cdadb41931046815306a4a7350a02892ffa8101fcc271e93d70e92fd867925027ad89e22c24ca03d4e54c655a6a8f295dc65e192be6b03d251038a8b7bc6c1ac00baa021b0bd9d53de27c4ef13ab0ae9047edfc0c2bb020331079914bb71812c459be39f621f0862c72c6eca00701b96613b31303ee1c3305f60e722ae420c8933c58e24423a886ff3abea6dd3c0cba5d9e3006a9ca3ed60c2569b3cbc030bcbb17fca36b7d5c68449eb6060f663c21d56c073f742ca289c4433deeb4d7a25fba610bf5f29ba69a8b136f92ccf21a906bf18b35e9a1e1eebcc3dd7b5c9700320fcc1942600af1ae413d2dc58c8c22869fc34e7270a66745543beaf2598ae4d429ada7213a57d813f5708336c470de64df45c38dbfc6cd5e28ffc8dc022f9aa6968a380af7eec45c1662023f1b6cb8cba91d8ce01d7f6e79b99409a10d01cc29e4e63e781f4c30f722662d66e7cc4c1b8baefd02103cd528749d1fd9c08dd3ee83464ce1270cc865b8016746b01c02e5057ea66c4e8b9bfae88f9dfec3306c65002ec5ee858cd53835c832470ad877b895111ba71ee81d6193cfe6889ba5d01dda044be8d158f1df2a3f20f06e8e04f6c8eacf1b07def3ecf4e29bffa03ab9897f6b4188910da8db13bab5db41a9552fff7033609fdc9a0d8a7c20dc778b73286ed839162b0754bc70ef63503ab6c2d4c745eaf05d6d8a33d2d117979804b78b36bfb53a25c2afe3c031bbf7a032e885bee04842b70e4f005ca5d2c97822d1225596286d07ebf4e19016125a18aa30a324b3ede0333b52e3865f04ea9e826a7e4a00151757dfde565f2128c00a9925cdb7554e516881206dfe610063719fedff92620dd18c1ac6828bd741e20c6c4265e528ec0ebd5c4200134067cca7d7d646bd5075241b294826a4ad003884b020fc1cc33980b839423a6391ad9e97c6bdb4294fdd779b87cd934816d63c09e12bf0eca8d94fcfb47b8d6dc93451d7e8fef874a4b94463b2e158d4a95655129bcdf4d33e2dd48a4a8869a05bbe7edebb24641e13ab233a370df7e8d8e31c252ca1784f17b9a76e57e36f99cd8e8e12b9c8878401059c5580bdf0e32a1f09b83020ebdeba0f40f28906ffc8a336f81a6155e344f15b086c2c7bc452116ca65232e6dff0999139ad4a7daaab514a556c5e5707ef693e0fd496b1e2b4235e6a69a14db5333ad1e9f518b1e0b06c2b2e7eed3655d1dd010b256c1afc97d456de94f7d01bf51253da70604e4276587bdbc8aa9e5daac15692e4f8f1426bb9086b3ac30864e4b499a395ddad407bba9ee5e022d9afc8baa13f89e9ef84ae25c5a8e18f7140509615addbdd495b2ee716e54bc2829cba3d73598a9b6013edcf21101fb9850ee74b5a81b8ebcd030e827652622613d4fdae4f897da9ed7098f9ad295bedce410728daa7c39582c8a8f13fb5d9ba27c911918837c982023b3e59cc5d0c78b7873ec308887247152c7cd7d56808eb18e9849bdffcf4a028d45c53f133d7f6db320cbe76bc5b8cee9ef89aca11765571c6c501993195a0dbcc616cce4614e493e1ef5fa7bbc5d399a0babe902ab875cce16187468e02f09593ec28b5fc69de9c07554b1dff67c780d211a7ca1c35c884b9d8718a5af31be0bb6b0c4adf3d213e22ecf53c0fb7b54e93cc0ada7e74ca33c09874c730bc8f47b34c8bff57057904c504d2a4551c495d76184c43c9fbf744863ff57fa7e5c7251c3f2c360c69228a5e3b87c9782bd037e9a4e0887741dc418b2d682618f55013468161a167ceda296f0f792dd16d06587ee06c2b1edce5b53fef615d1c71b69cc2d1c0a3e1acec8c67df2b4409364859966953ae1933a01a24f465871ac1672c219ecdc01289f60de95912ae883e0295d08e1b840ecca7eadaeae926ac8afe3be346fd8862fc733853dbc3bfc6dae1a7aded384f682e4991b22160de3a34c8667878b45f6b7ae09647f5b30a4da352099f053e52addf21b95b4660f05c357216619296d7846bcaa226256510a51dd0262444a2505835acdc26b86e1f7b2367d62f33296356659dd68ee95e6535a0e8a7ce49e8aaefe86744b4f5fcbe2f85362041b8c09549eed6bde2c0037aa7d307e90d8395d4dd6dcdbd768d714ee1b1498f49b210efe76e01d2b23808c3543aba7452601e50c91c6c90fbfd70642a5e3e6d97bd7ec5b779ab9f8dcfb2c1c33e8cd44d8e06c11b9aa059a5b48e7071e27155cc198ed92288407ec5d5a6088d64db835f6bd3884d5f25822441000640c47ed24774b57cc1204d1b0b08670a1b2432fbe867f928e6e058a4c83199982f9ad36daa4d87330bb83ddebdd66a48e5133fc8a9210c2570b4b63c21f49fa896cc0b825512689e7ad6af446eae143783b83e53f21571006342cab2c208a6aa0eee83bae851fe118701fde69e1e19786f69db3863c3cc4c3721029318fc333ef068d861c48aac2ec8a0c63fbc94de6e10ce72e06eaa725b84b5fa67a73dc9b9f3c176218a2af768b85974ba5ab0c79b005cb1d6833807c0a4981eaafd4bcebd818ef974a9c17431ce92a5d0e8e08981c67af49531faf11e4f4dfbd77ba4d6ac1237bed593dc872c73c2c62de7a288b4dbcfd7b70b71d2c6cd3dfe77a2e766283e4242cee8eab4ab6080523bf7854996a8b1c796702b015ca6eea2f61371f1945e3521bb095a8150ed41c65578e740b9b5d740bdf085113274d695ed4de30d830a96e83485ca819fa29dbf34ec771290ab96dfb80d2e970abf9c23c7a2a92e76cbdde2c5deb91a0a08ea9944d28313bdc276f10f3675e727df95f91fc232b8e20a70cde98484df0288bee0ffcbb9d893c2fe211e0d09a62c6d5a62501d1e41575f05e61a17dc251bba8132d02879d5b505a2ec7ee138388ad1601c0323da6c3921f3e7c1f92da0d816e7eb608941af8402fbbfac63a032b5b43d729376e57e29fbc13f9ba8d7b6ba1649872b5ebfaa93537f271104c0194f7e48f29b76ce0b8c650459e1b788fb24313c928b29327b657f839f67352640caa8193885b402a8e2d623c34ea5afd2b91017aa2a6948767cdfcf94f975316d99ca34a0ecaf11cabfc7a5f82ce3cad1eb0b811a63af70403c0cb9b452557fe43f4d11c82ac879d595c201852702587d2cbc0f8fd16c385d457eb85a0c5670494db9471aeab0b97de75ddcf6a781d7391089f956fe100f120bbe621281e8910127873b1586d84f1836e38ea938d2d59a18fdf52c343b632301344d6a5d9c70a07f4f644499afa93906fbad295575b214b890796c3e6ee2f4c888b0bde9d29dab976a59349db75654da2e9ef3880b1b3d71ea0c8356fb0d0bc42452a9c13b6697127090420d8fe4e012d50a944ad37f78d753152e28902fdc768f99aa7e3769d762ea90095389c39f63874698088f4d6b5b7429b92daee9eb62230c3c7b4715f12b40df071a3580b72ecdf95b5b9f036960b5c0b0c0a7b9bd19a710dc42eb0988be1be3a7cc339adbe701897abe83301799a060a1ac2b1dc60f544e065fa3a2e2adc43487e3d470722eda7d52abcc61da68cc80082aa994aab5e31a473c0170b37ce24803fbc8a01e58b15b9faddb07465082a550d693acbfafbc1c1b7275015fadeea4c86e60b845171e8a9e2f4f9ecfe36b57183a89d4894f47b9ff6d8ec36ba351c131d63d176acc8ab0faca9aa6fb83ff0bdac0ec8aac272e8a6fb7bf355c1fa423ccadce4c13fb7e3521ea3c9e4dd4b639f5044c5d7cc9d8e3f8db76e595556e53156f94d4b52671ada018b6132b381978036f19cb9fa9cf7d07334642cbf718c59896113fe2d00d70f1c087743830a13c927be53379398abc3769bddb54772bf1c2abd3ec017a9a35939c315fe940e5fe0eb52f438e1b8307e5e94e1dc348206e203b4d77b5a8a05201e63424b30b4042f4a5786a62a25106bf3c67989d0c8ea13daefe4163ccc85cc949107129d24891c0c721268b706d3f0fcdaaca4616df217781570790697abc563f56b3b24877611f84d9f66d084ff77437783153098a757a5cf808cff120073533676af0d055475d7903588bdc71e678e4604c485728f3928c51e3771660b3f2cfd3054a0c5aab071e3dcb6c5f6b728a6ef399aa8233426cb9e5162a2ba548fb5f1a21325f0002a8eec9dd83139532253192a7de0d21e87540322f5db3764ccb7bbd3d5e3addf4af6567fd649ba79bd5c6cde5676a7d3c28c9b97d86405c25ffb02cb802325cd7a70c78b98559eb1618b925d0eb2cbdd413b0fbbf3854bf6ae466f93fd2d7f5422c6e7c8069d108476a630af8bdc66c46a2906932e8632892363aa323549e4fca8be603e096936786476f1ddb73c9f0ea71d292972aee10225185ab00fbf7c4c7521d7f58700381793c37aed791a9f455fe12084a54780e91b2f271672d66eccf1b6f7f669ab3fe96b5576eab8bd8ef0f93b92acb19739c76f6ebb6b48d7e3048447654898b2737555f38bd95e6e9398dff427aa7ce73223889ebbb7780a027d979accf3fb5dfb43b76761c45275d6c478d48885f07e9385ce87d202eab7f4be9079d20079f3ffdbfa77a1b27c1a80fc2ca25d45f4a68575a9f0a6558626e04fd9aa1f76fcbea9c687ecf3acc4a5b9c963284df36fa5307c81a2dfb7349fefb9d8f55c5d6b041f8bc58dfeb9125da8b1852c01954bc4bb21be662631dc694983f72431bdad0e89b21b246be14e8b763efa7721366f4b4eedc80223ca66cd15359dfd459fac2410c3f377e12c60774af82bd154dbc3821367083e7d8aba137c58314a410a4f8edc47b45009a330694d667e01428e2fb02f17e4e4dc79c083a5731dd1cc077e9314c6c5758b4da7a9a7105cd194569b1fcd85c5baeaa06164b80ec85b8f9d217ce0c690ae0e33ab7e7f7e2e07f23cef15133a148a4c068300dfb19aaf32d4219169d17cc53a5b2532fd395a6c034613db29bd371aadb30f9d40e5fb975cb4641ad76ef180b9cffe0b4bc84ac8707eefb938969832b3b0ee84033153d9b546d35f522657a930971c528eb364e3e0ec6cf6684e9d9c060406fd511e0a3ee69156a8017f17064ab9694ef1831284fc9770dce06cb01f4fb7414f5233888e979dd63c0c039760ad3fcc4999bfbb756c87e4b1c978388236d286c42df836916f7339649c3a407e01302c89b1efc67cd7c4b1be4afa9d8e625cbca20bf57a0e171a6968d9ab7a2aef9573575f9b9d62e657bd4b8c7b460b7c5dcd3213b3bdcf379a4c90eadeae2a1e7588fbcb4ca7ee4047f2a0b7839dc12bdea0bc6eb9689a76fccc23f75b424738d853bd1f894cea8d9c3704f298097718e51d88438fe1387c47d06b2aaba049e2c7bce580dbf41c775e73c16544f2f7eb7d2cddbbbe9271f2833faea9552ef8c648abba18c9074ea496901d390ec0074babb505fecde10c80b903359ce1561c8c6608850fdbed46bc4c7561967edc70e079a046334438d3cdf003482cd77f7cdc26bb8e8d990fcd68860ad4a31dacf953eed5e982acfe8c8230272f80c010e15c92ac1db98cd3aa504e37c08972996c4c123d35148b9b0046815731c2247313b7b1c47abb3ba2a71babe46b6f060c9072eebe74116c77f7c2ec7b9717890fda938be9edbc2ee58a71a6f91e7e5f6b2c6e8941eca1d4fa399e787baaa9794cfe992904bde4ee021cfc455e21de071f09e7ecafe7ea4d8c8d812e3fafa07b92467092fe335a0263256192fcbcb68691ef861deeab175e95bc1314b0f12418497bc0cebd9747f26e6d4b95b9372e6228a5f326e8804e907d8ffd35b4b75bd6d96533e62b31d2478dbb60557ed970254bf5d50e83b0b769accbe79634487040abcc6fe12f48248827d848da34eca15664a5d5dea9827c738a3b784119ed89db25781cc7b025643da38dac2cc1b6ec7eda7e9a9d413dc23680a6593d49eecf31b031e3a19811bbef6ba034540f8077241548cd53332ab439f4d33292ae9369c9b5be6c76ce525125e6d9875904916ad07dcb1509679177044f8baa492f247f2b9ae85e4e3a304d677c024e438a33ee0b7ace1bc6c4ba361ffa966968b3e83be0c9776131c4f5d73d95e1301a88ac2b5b741b869234ec17135bbc18fa2428c36fa8331f2854e719309940d6e7e545484bd378ff759f704266dcc55f04692c3f60a1e33d3ad25038c7f0e5e7b28b466d60ffae2e78eb8fe0a3e478e5906a3cd83c1a51667026765f8b03980c8161f7c4246085baa2018e194fda9e53a50fa0b5897d4340d038a2b4023823ed5e4f9f721e5ec44cfcc9b814f428ff504c409f00d231827365f01b5fb6f84d31503d88a2d662358b8c2b54fa193563858ce582de9c9ed6a834372b892facdd816013f87ad5d29e205c10a9f2476992996de69279712c068747f3185af3ba9c8494b93822a218c8b2745e0025052c5335f72b14f9d843dcb7a50e2bf98c8c52e3f61890c3c59a7beadaffa1bbdbe67001339c53865a4b1ee1566eac8f8288c6458e164785c7c27e7098d9d4db51ffafa4282296467eac95ac63fde3435b18c253629ca78f2ff79bebb6d6e1adf0dfd9c7dea32464ccce09c1d3a1173ea1a30cb57d93f60a85a098033add0f5a3fefb6115e084606cc1a42c7ae4492a7db916d12e4e17d1d52273e612ed5a80ac7950d2baf3a445507f60767fccd9aa79249ad12a17084f11cf355ad99a8f2e40e3aa7bcd920667804cb2149c62478664d35945eba2653ad6e6ca58e843d36119e474d6de5a1f4974b0259141431740b94bcea9e3aed317acdfaf5adf67cbbb9ff22c5e6daa735dc65017570ecdcd5bfef46767926ac6880c3050fb2f74dcb02b735d7cec019726dd9323d07580de5a9e73b0198884b3ee6d7f5b9448f98ac1750e74dcea0def3722ffc7b7e5faceaf2030453a367b1fcd59232bc0bc745a71e529fee8d81e00014f0c6f58009a12dc1cc073441ccc8e9747a24e0b1a63c044043c781b46b06e17aa3fa74b35fd4f63fc9ad6c1abe774fec1934ecdb35660ba4adc6cfea6638ddced0ffc0bf682d8d93825ec2d745a67464f7c8aa337ba904731704a0d87b5e3d35ff3da14d2d9539e77f830020693da1059a4ae06180ee36d40ae9bb25b1614ad9b91cdf05b4f243604982ec9c33251ef78c20570d4c1eeaf00dddea7a112749e28504418e072ef32867c54ff4aa44336155b4d7dee81f68eea848f37fa1998578ec5d91912e2f916761b2f0d0d783286b7b6c287c5bdbf8f763929fdb6b9f45c1758f95b52fdf6544c0b399d6c0ca443f88b21190ad38e233c723b6377722d0e8a80216a31424b7e80a2f10b16f02d10204ed5bc2e6206dc95b63003acb086f130d1edb02e5e8ce7bca8e1e07ec1115df7584ceb90f7ae2e2a7bb458d713b6a6b2d4cae7ba812f32485378b813de159fc65e1321e30 MD = 6a76b88ce50bab0682ee7cb670821ea8f608e7d70801e7785d26f9823455767914c5c87f0054a576bdd69938a6e6d9ec Len = 71512 Msg = ada7dacb8b05165188a0d2bab906f0ac3dae9feecd398acd95f74fbe42ad32445d961314d7a79d78e517c1f10e1f622081ff52e6ad417ecb0c41659c3fedcf5860cabb4e9438997fdff6b9493de80447ee18ea7311fc9b8d74f77ac1ab21ce845f4bbbbfe93e722f1f44a40b6eea3ce82a034ddb21f049dd761f7573add2998e0222fcafff438f504d096980cbab73cdddc8656607a7f181bac33dfb6d87973ef0566568fdce5aaa114ef0ed79b512bcb06d185ee8a9f942e7eabca114c8305ed2efdd310c683a04111a219da3907f7e4afc5009ef7ccbe8a59dd9acca1eccb44ff64e5154979727f875e4d76fc224db557cf4b141aacd3b9ee37c66b60fd30a10729f11fce6dadc6c6721e205d5689a76f6ec9c09bb690377c48d150125ad26bc6bb8b92dda69e915f9c0078e51b285577120126d350607db48f502d2e8c3d0fce981910efdad169d32a98e32bc6c62a0f5785d95a20b1070789a7552df7bd278f5e2e0c8d60e2da91bc4bf18a0fdfaf98bdcc4aa89e2e6de5b65b5a9923ef3d796c3f082edf5f4e4bafae16984cd150839348ed473f251cef93e0cfe8975fac2d50c0765cbc835f319313e4cf1447b780968043ae7a319e85b0ec0794d86b0e0b8a56e99f7f0b68140521cea6ecaf3ef03606e056d5d05d388bb1a4465dbddda4a766d45f9d640343546c46b83c746152e04145c8d88de38882f628459da495790674b915ae19ab402f37ef6b8a33c94923d3d68d08c6cbe6450e064b2edbb00946152a6a1788eaaaf4392b396c69d1137f13251bdd2770e2308dc0af77bfc7d5d4ac8ac5605e2be421d47cba498313726093c3eddc0c7cfcd3e9d9eb0ecd575f30cf6ca02ef5f97c568e6666a82c0ab666ea157b6bf23aa6bda6c4965a70b905f8d24292c9ecdde3f0eb7ab71ea1118ff06a9c6d238554704c391329f166977a8b79af15c7af43ab9f602c34039ed24fabb9eb0b991234da0e35483e5a0b6d2d6709f491aeb9b543a080fd660d81c775e74c640f13456654721fc61c0adb948f2a27c59ef598cd3ca2c250b572d66ba33196b9b0487b6360265d3f6b7a53b8202347a4a622c8d60714a8e8aafa293958191d3ec7af40a69d8971f6a52f10428110edf44fccc67a3384a907cef9e6aaf51c64659d9e11ca5d2a029e519f7dce12418f36e43a1e24326147409a089b4b1aa9f0e0aabb8b293f766398e95208b55453a00f1c114c5e94491825849ca39429504722877e095da4fd2978d4dd4d82d7b5c4cf5fe8bda3c99a7019272cbc10b19ddb9dbc6c18d23e2cc8a0bc97c8d11cf6620a1816fe7e52d3f3bdea4f314b43e122c4a1fc36116b93d5b30927e70a84740c41dd229b58b0842766565aaf9e40c8c139e0a4edb5adb0b53232f444a9beed28092791f0cd73396fb4e40583a438c31b6fe0fcac1985020b80d2834e291c9059c28febbb371b52512c2ba659d7ac5ea5c93b79fdc772162d21506b80233e2bf5f06ea64740096d502e95d3aeb31bfa04e858935f4a055bbeb645037702940e91355c581152cde9015eab03deb0f8339d5fb0ef5d1baf41249218e19f51aeb6cfe3c157c5f9f963d91ee3bd767bd189f371dcc453a6e074e357549c559afec2e68e464bc1afec6c4bf1c877025e386b8bc144d8ef8649459f78807a5648f4a199b7439a90ef4740de79d1b71ef28d66eae081939d443a61ad7815320de620d14de151dab0227aaff51987f408b340fa75320b6ac93b442791d88b29e8ed23e0678ef972ac03f6f8444363c47c1b0394df585ae51005e725e10c7ae873d85e3d9b2292f8e0ee5cc830a9fd9ed5b445d47da5f898fe2ea3db1f963ce44b3230774d4ec6d3fb5c1c7e5e9fade991f97827d4ad5cdcd00ffac5a20879a3bb855afbf265fdaa67d7a6b902a6fd4b5d752b0d78f0f04752346c542cd599bd514c3e5a2efabfd292db8bd6d142842a8491cef3df036b5ee1366924f4801587a8e14b00579f75e318f25c764f14ab0da3e9e4897b47269a098081b6ad8a85a93f0f019d00a6c86276967905e0700a6b37d80c2cd24eaa7f37ad4677cc7762786000126ebeb32fc7184262041a070ad9bd06966c788c7f74f80717e6b5b9249bd87ece13e64704879a80b80f702c24cfafd013b6e2830e11c74886821dd25489e4c5c52b2bc4ef3a59cbdb766751f0c38cdf149a84b4eeec21cc02d849456aa9319f7802d3df5845f2ae5cd7843af74bd08e1985e3a49a5a940c2d67eca4ef903b46573982d8d830e182bcb13b2990cf1767831793e488f39aa366bf6c534bc56e64f33dcd53d79192f36b8210c065c3dde5f1bdf9d7332db21c2f2d3cf317cf3775dc9df7d2eedea37af9c89971ded070a3e5e7a9ff318f56c1175ff2e6dc0442f363c8b6d8867e8f83d7f339c0746b8c0bc03308ef0c9f154c9fb612a0f10b0d68394c7ec726f7b3a896a0762ebefb9c98110ebb091cc35a1938de10d40f49f33ebd97a43148e0bc43b64ed33f27171ed3690924fffa82b1b1632671d27f5790f17148ebb974b005ffa76cd55435347f383880db162e83989fbf2dba4ed9aa732ae4dea9a232fc3d36ea78f11081da5a50f02441ee111c9b5e9d525e8b96c8f64598a7628dfc1bae840ff1baf6658f2c983051fe0a4ad426589e42e32b4f29a6dc0d51aaff4894e6518865977878b9528869a863ed4430c628326dcc905b430148a35be758a0fe7149d4532b1933ef88ac1c8617f995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693ce25bb17dd68e214ce1d67d8c6a9ab904f39ba6af2047ef608d032d2cdb71886b62b6fad0538a0569a09b8a90cae1acef81c760a9975f52b998ab627279f7e004a6eabea756e6ab05b542a5404da51f621c02df69d112d5d74a85179c8f2dfc832f658185692aaebba07a720d8b8b6d0712ec87725608e544131ea12d83ba3a715cb5c7dcf2cc7cf5e291657adcdb226916d30d359e981d7a72e68387eff31659bf6a16109c52924f0c25e3faea3aebe28854b5262346cb04ea6b534e2c8f3ca6d7e0d0e2be438b217db692000c11061df7f033e68c9b8a5dfa1b84e2d1d509d336b8acb5e125c417c7a1e44ceaf41d75e623fdd9231ce7f022859cd8787b0a894c5ffdfcad6fd98c6aa65f23ef6aae84c36e77909f314055e4180fb178d7bb13995539396b883809e702671781db25c5204e258f597f4019cf7151e06b71a81cae3702feb4056c1acd6490aa5acc0fa17d31ac27da5d539634f007f7b8df3e0eeb53dfbf0f7de2397e3b705ed2b3e8b44ab7601c9a61f775c5329669f986f964d15a23ece64836e089f56aa772393d78094de5c022239812f0a791a9a5ff66a900a8742ac10ae69a6130f406c1c27a674973a1a509f8d1f837cd6e5936af1255f9cd44db381c5dd1a46cb11f39c62c0c7bb7284daa7821b00b2290db242c68f61d471a80a4132920b407063352daced22096fe2c9c1803c4fb35bdb216edf703fb9479bdbd85b50220ae77f5a566df42d87177c4476ef49188752970576a290a1543c6d4bccaadf07ab19ad89a00d9e8f3f5399744c380b0237f88989e379b72dab396884a78506612bed35ea91f4b3f1390c8281cdc14ab6ca34f9d23ccbac8ec927d2aef0568ed8934a5ea6b38afbfa7c28809281f3cddc48ed2e0b0900386ab3ecf4f030844015ea1a71e58e383d531091d9cfef365e1bba0d715ad380236a73721673ee77e2c03844b6cea86443a3fd2dd5619ff3c31b277b0ae720b235350f9f805fb2973c8186b0758a8b78d3934be6be701990c585971f41db7b003574925d79db054c18fedb46f640bfdab6cb03a2da23e6772c0112e15d5e69d1edce01934a0f6dfe3ce23fee8019caf4b4f22d4b73a38d0ec036a1a9a897748e23ec66293c24741571d3ba905d3d362c94b0cfc8cf1896bf49cd4b5f68af239da075c8069542a2f97f795514d3d38bec20aff30136a98af18e6d19ebe6cefe672c1230149d907e122e7e17622b044f9b1e94a0def27eef0b58bf11356a1a8e548e6ba53a9e3790c946870962adf70ca0570adf474ac050776f6b3e263cbe5acd90272f60de5f60848e3f31fda0d5496593b7b7248597329c9b18a5a4a3e0eb38f8eed66ea62e77accf4b99194ec58f519943305dec2a1fe2a46e5098e9a9c7fe8f6aa34d3ecf5caad156499ffdf065cc335752dac7a29eb1511746eb544078881d419de3ee6897e45c064778f67d533e279b26845e2638716bb88f832dcd863d6a1bcd19fe22b1c438039d8a8195e10f3eb6b341f8df738abafc344abb7a77843da139d8b52431b12cf653bfe56098a8405101fadef5da6506883c27486dd5c7607aeb065d979f1302876ffe6c05ff6ff5131998598ff2681707af011ace276d994feb8c3ca28451805dfb2e5cad9fcd25a50201afd545fcb51f95c27ac6f6deb1c83f539a6e66d56f21fe39fe7ffe2b97aec41f28f05a8aa778f751b07dc981708cf142c122d006967a81069aa4a6ef14d768d80e08b978b6bbdc96041a28c09d440940f8e7474cbf118b7d78431f8364c8f516a744eb2faa904d79bec59b0202978d3786e5550fb08d2486df85ef4d4f2873c03dcd77184b9e51e225a8abb0652e870eb44381b7329854091992a0b79d9febbe16cbe59a608ef0b982e8df308fb0feadca2a53ac0dd724ee6c91ba2715d764f87a65be1cb30732e61db0c0eb48c6fbfc10c1545709f49b1d21aac3078075e655b3c388080ab220513e26d549571885e2cd310b1eee97c27f7f0745bea62479c0080ecec52e37c1e32d72a6b3864da44a4ba1016a83679ffad0cdc7b44f8a261ec06e15bbe73d1e8231bdbb8f9b0e6019d03abca4910d3d775a27d251434ff458240ae752fc6c3d17942f9d465f02c238a523c632e030a1df673bedfd491cec567c0bcbf2376e288b9cefd3419ad2d18f1285a77e3879d5183d31a0202b99140010984a035ee8e7c49226e5e7142596065e88e5ee6190e00c24327322af6d763e27daebed3a8580acbefb5c9f94a41786d3530aec221ccaa16666ef6b9e401af90af9361893eafd2a6797bed3e4f75ef5b70f9edf45c69bc14af49b63bfbc0617021cb3ed31c26525d62196eacac5733d53e3272f90355c531704ff73dc874482556bebd2dbb3c18754c2694c0fb65c44eff82f43cc11153f16c0a401bb49dc204b0f65305b65183727a2c1607b7323f4d3763d85c104cc6d8f4e117725abd4db2e30a9707782721d97e82590d5a4d0334684da5c36b48bc5c9d6ce3be254369a44f540f8f8afd821eebd1e44e7f169eb914a8c30f4c9592e0e8164b7baee0a45d787b132a596502b724833e27700f803fdf1de6ac4ec3f93a4765a51751e56c32d0e848448dfe5236db2ecd34e7c8463d0a155706cc543d9d4de3873da8e24fe8eb14258a7329cf12522d17f340b16f352817babb4fb70e9e6e18784b3e67bdd449872158c357f7de3c16b4ef055b59bcdbad7836637cbab22a6ceecc6cd644896ec9c23bd9395afeeb641a94c0369438773f16148205e07d0569512dcece527cbd548ea02f2e670902adbf60ebd3ad3c9d552ab245f30e637186560bceb09622c7affd225fb7ba60f45c29eff2a3133db0881cbc09b492ea015c43d3071d5e201044843ec555b3bb42e7d0ae7f3554b05330627e47db2c953753d11fe26538d929aaca521a88e15c70e94a18ec0af038f7f6a295aac729d985f5545efb48a4c2665b2608a9e1d1e900c90cabb384544c0133437e9d19194b7fb963fcbc08208068de2dcf0dd0f3c5651f8ef380321f4e218ecbb58941895f77287685af544a77b39c4811a0d6c5963055477cbca4bfd3bb51b1c709c0e87a2ecb02863f8d713cb91e1b8d2d73d5cfd4e2dca3d35c945141348c2f9927b54fe909ae8b07443323ebec0e7dee3892d6d57095055eba5b6b459fb15bb1d67e35487cc0e070f91ee1ee8e97807d858b4fb467371dd95e73765b0bc7d7de6db1cebf9ce043171c82db136e5d1155eb2d9ee44f0959bda95af6d4014620995dee70d0d2930f643f0d941d13b5cd01fa08490780a245963b90815308a2c25d1792c00eb64fc1d2d12d914e1737f00c0299d270b4886ddd75a29a5a9a7439a42b3d30dbc07cf70d63415728d16a46cec560cfc243223efdf81fa65d2f10f2f9194c47ca89b10b5e76175a5fdab32dd492eb957ec5163592335639cd4f2f9ae6624e895d6a729b5079ee1f45aba911b7fb98c7f8b2cafe24a7e4c94d63267dd686c25a06fb38138dff541a6cccb28ee37ff6ebe284c6d51fd649d930138c286407364e49a478006176d7d047a67611e1909455aeb37076fe3f03ee27c8c736f96418eaa80ec8ee6560e7d568d15a372ccdefb9cfd77e304a52917c970b6e06111df893a482913a144e12ae42c5e57b3f98676cc86946bd8ea18118f053e732359543fdc1b8777ff8aed6af580c9e3a9470aa032ad1405b25bc3127e62ad937f17a896d8218d22c8d03b26d2b1deb01c5f715f169b811b5b9f3403dcb08ba73bf3e4787581c37dc4bdd147c4e62526d4e8c39dbf7862149c5f73cdf2165e1920940fccfc64b1eebbfab9b3114727ad988b0841766b40583b43865608bdb050f6a3317ab5f1e0de742ffb5401fd6bae32f04933839ca24f00f2778866cd08b485c75369e851d7b6b8039d10de30798f68be8e5b2e341061b5154e4a536defad94a97b83ddab1edc4f1ea9d1ee07daba039ddda1bf5b12f62053118319c5eca3edf0b4afdc283eba0129267e7bab1595cb3740ed7d3831760b55ca1dfefe87fe564503d52cf0beb696cc1dffcb44b28a8731be27b1f4f4493cc380ff4b404826985072de162a263ad5ae953c26f93a0001365f37a3b6e4d77b443c1147b2b8847bb808b0e2ffffad8778961cd6f2345fffec2c059ba787889280053b3c7d5e7ec626cd34d896cf7774d1298a2258280e4afb2c79e1ef68c54720e36570c8c27d4341ca523f1821006462546b51539e77aa0c687cbcb50cf464ccde772cbc6deab8b206f361ac7aaf1fd321a8ac0a1f01e6c7e6f47621fd7faf2bff59b881e62bee2089fd847b64ee6ccb98297ba63214c8d3b0cb555dc2ccf1e64df45c3eb5aaad345c5af1ac662515f2c0d6064e601816d9cee7a28ee345f1a4d02e601c63cdbc9686f0f06809bae0f1a197942b307599804632a4dfe850790e91f00b4277fee5ed0fa9c8d7d316967043556e652a9419712292a5765a574fcc9723a7d879a4eee1006bc3204ea1ff16aff6dd23d6db5e536af1eb7bc1c13c85ebad7a08f226a01c6020276c02c3e28cec64278dbdb32fcf2436bf17a3f608e19378cdf869eec34337af3de276e5087a028594cc6685558d5a4969718a5e7b8a996ae7d066631f018e004dab326d3a86fa436e0859b79934131231b3fd615d25046d12b971ed7bfb6cfb9feebec53e5bdb85fb681fb3c16c58785f028567755ddd6894db13f4a1dcd9887ad4a353dc9fad3285153fdf95df30663a89a9d88cd72b42b65dd3e0574add8f28856881defb7834523741a5df33a3c10b6df11c6a3ef6e5c0673a1a66ed81f8ef2895b60a164572aaf5ae6c6510b9721ad9e59bd7384738fa23cf08966fccab18e5b2592a991bd4d7770d9bf01f7b61aff30ebd9b6d2523abb71a13ae75c790eae548d4042b034220e6e69c4807f07612e3f3eb7d87988e1d4ba3a378aa7890af50de8e617504a4cc6ac2d63571209a8ad21c8b472ba8619608f321bab3e991ad4efdef081e26e2242a27b17f0514b361e81207bf035e845f1591f33d3b227c2e052c5fc3cf71e5704fa095ed6ad3aadd4c5cc5aeb7c1e0c09b0583c9e8293a78a0f3465830ee93f800b2ea494965684727822fdbefd95b00c2d838266208b2d345da0c90e8a4d50366e7185949d3d4e7a00dab1052afde69b191791b52c7cb891d6a1933a09c94daa8c687e61324d504e084a313884a524191b8b071606c6fe14f2ad609ffdcb6c6f0d7a0b74e6055e70e6f7ead3ab39dd189d544f03301852203a3a9d9ae6e240d63a3c996a3903bd95357a4a610f0a961c2719d60748df495635bfb6d5459c7f72bb16b49babb6f20d7c27dc6b10b5c3964132389ca19a68294dc358b9aa686ce7089ef993ae9d804c13b71d5c60ba0a096443e33deac8231c1aebdfc285c48d859b4bb4ecc2260cf3947e89af6f95ce0808b5625584e70e91057fd88a583f75f0fb93930176feec769704adeeadc783f4b70d328df0758f3a9615bf6ba247aa9ba20d006c4d76b36773dff6949bcdb061f7b1d041be02297b55441100e46b9fe8072e79a7a63bd628b366f03bca26f7c23359c81b5e0b71d5cb6169c4af19ca88c36e8b2e21acd94cee40274eb941beb8025b8665510fdcdc5114263152d0bee04f43a17a304831367ce21837d9dc7995dd4da7da276ddef19ec2d2d1803ee17113545916629c7297f7d32fa1bc25bcfe3c8688c451c3fca7fd03fc2fa7a2d6cda7f71e8d392821c3e779f9f6c0dc0d53a8bcc5ce50a0ca72044e0e9649bb035885d26e391469a35cb46ce3b1985dcf389a56cb52b472ace24d0786cfe6d5fba4254cc4b494df9bc4f712995c9329871f89cb25fbfdb8387b2fc6f116ff8234231eecbe8a2b085f9f1811677251ddd96b1fa052148cefe1af2512da16044e2167cb28b8245762833dafdffa7d44d91acd946ccc46f2882ce0d561ae3785a867f4d2875e1d9a7c9b4316d4bee7fca9df99b097111dbf2f9ed2b949ea16041f5c3c9d9efcc074c50c21f5a6214ce9deac61dca5bcd34344abd739122a1bf01192a1a4c620d776ba4a6cc4bace168cd5f5a8711f2c324f45d870ed70cac3ea3d8fe6809376ad00fafa85fc8911df662e3ff02679eba513c1a9224eec68a852d1c85da99d4acbb3d580f0159798f1f6560fbb652c77963136928dc5cb6033baacc099983a39bdfff8725d987cc008cddbd97ca5cd5c90382328f5eab46df081fd0d0cc4f0afee55c243010d9f238e5d2e21b660d3072d98f5d10d362dde5969610229c86739e745d1879cdd853ffd14db7cfb4ec403c8c45d2f3630ae2de8a16734931af454435084948390a571df85423fad9816eefc5a97980352abf938fa8e38cb252e8b6cf67a0e57cf9675903f211e6005420522bc53aff724adbc94b53483248f8c4bdeb820597bd2de97c9a2c66d94feebf2e67a0feb741f39e4b661f88841a284120315f61a7242d474e640c0b1ceed6b44b2042abf1cbab70e089148cca516ac7a948089a5dda81e7970a99e8f706946671ffb42bf537fdb94f5c3b3c4c1446be1ed9859a0107b1331f33dbe5b1bfb13c68abfd640bae6ee161869b80518c458e488bdc47dbd24591ae88dbeb9440b4a0f7cd25407b588850deb03c4123e0ee9fef07178b3364c66b0bb1a0e0e6b225f9e80d35a68c5cd26f8e8127650839c959dbf53e4d50e5bc28ff5532aef03c8dae0112347d87e3d4a438a263d649bf5f25d3fb57757b7cad30521c9a3bfa0772290b852aafb4141758a6baf87a2d993769a0c46ceafc5123ebccb0df714c3b5fd1cd0d1f235b1822f49e72ef3bfef0da8e0af684961b8da5c134b609362dffd90e11531cc1c4167ddee9724f0002ebcefdd93aa8602058bc1a54d92174e77b6a489dff28713737b1804f6120b083b39d1dd537df3052d9ee5ef2bf2e12c0d899e73ab84c1bfba3454197e76b35c76fce55c69631eefa39c6f5d71038f8013eee53b0268fa75981c1888bad37761748ea0f73fea682609fc947cb75480ef1d4f2f5c7f2f9fd99f9aebff15b8c5bba6678b2a51847d5cc3481bc9695643cdac32c3347c492060335934d929972ccfaf000a6248c1bcd862075bdff1a976a02322576f74363a8de5af89a360df2b11d0f0b52b8012a53d58a2db0cfa9e680b24a6327a01873cc7493650ea46213f26cea2020291f7d50039a32ffceed5b66323370ac0aebca5b0b066311a63ede782faac7773e8f1baa567a0b10c48bfd04ca14d46ffd63713becdb790b024a5929ae7688bfc0f90c4b174f404d792ed442c21515d641286f565f3b3064812d8eee3077ec61780459198d445a1db57ce9096160bd4b9de3cc92ab4e0f84eb8f85b0ffd47ac32b5909fe027ee0e73f1d433ff11a5435db3c91d91a3b9ed3081a455561b6bb4ea4a024e1bc285a15e0baeaceb86e60fcc1dac512f22b65baa074d6c69f45356aaa80b3a90468500e60fbe79cff826b07186670257c45ed9f7a4540ec00a8728004a1bd4022664b3a878741930d7efcc0a7879af900b2bdeb5f368baece08faf67bac4a8d5e4cd3011c07009a2c8b9c8e38e64c78c6995d0717eec0f34f8c5336d7496378003f6ecbe9222d98a2d1d1d9912a8e89152356596a16e7a5cd5d07a6e01f0ee94f69a600b481cf77b877260a7bfc661437772f4b205606ab8ea29eb05dd755c894f2020846cbee1eb6a52087be04de0272bf7044005527eddb849ebb181840fd18020a4b67a99275e48549b922e9fd390f20a2acd3bc5153fb2b912ed78bd67120bf4732dec3c464893c28086f54cba255c44cea61328dc538befe7363d81f0af754402375c08bd3eff545dd6cec51258ed3f6687260e22bd8666ef184a623b1e4e77d87f249f0aa5cd6299ee25a96ab0074288dceee586d244a6810019deb4f2ea187c71e05fad119075bb59a45a21af5d06bc13c83f77364937438a4667eca1ea9e549c19db1306eb1638859567e5cb30f466c86c7c825e0681ad133a9e40cfc281f77a3b81db0a2fcca81ea353157825842f67264d26cdff2e343770d26fb1045beb88bff4737ff0f17061489c3f5acd3e5c8c9ff1d2eab5856f7383b4b81a1294973431936aecb13d2819efa3d1c78aaba485243b2558ac3fc533edb5b85f8fb481291b0f2fe4f2f84595132a6b62d0246dfd7d598c7c55b5bc050945fee5ee444fc3e69840dd38cb4f6f5d606aa140613f51e60d76ea347fda7380e5da6190cc49912eef3c59f51eac0529166e075dba8f3f18a78306eb06a6ebcf26094719a5051d4e7470dfaa7ae1f2f08cd4098ac8d3f16fb82f76cbd287fa5e86da0b0b6708c4efb89cc2eb6897b55e643b2c49f4b43555cfdaae797c140ba978eb21c8aadb246d3c0ec81a5023c8dd1d01e42dc69667855f2312565bd1bc5a8cab2ff3b8e2b8517f4543c9da2ca9d717d6c5b8c6f0f458d68746f50a2778cc22a889ff49c5fd36e2deca6c5ef8d4d70518454d7e5a886ad675a0c80fabbd98eb41d45db5db7f780749c094673ee6773554e78e45498015cf7cd461c4c5172b4725738185b99bbf6d04cab47b653b1258fb30edc44477f4321b5634d21a01fdb6c1fc2d41e6ee5784ae4d6f13f25f52b09995de63b1dc70aecf8ac3a0010aaaba95e29372c9f3eade94cd06c96cdf930cbeaae2bc382a358617f690c7109d9ce31fab6680f928e3eb56de1df43b186dadb8c49d363ded9d58632e2eafcf376e90cddb1904fb19dd2b62d5372ce3b63d143697605a499322a65f95efd2a3647a743ed62d672633212f5756c4fc0d25abe0b677de90c1b76ff06bd276c823a15addc141063020f17a6792e769ba1dd31493970a5a825cc6dfb6f6483608d68a7a6e238055e871f12354a3eb781f7c6b119d76b386a7715dec7aad8bb01d126c7385a4387f087faec67718f78274cf4a2d7ec3f7c56885c930bbfff1676d8dd3b0b4e1cdf418c086de6f50700b527cfcc2a81d6ba95e30a526eb4c3dee82af6ccc8c5ab55781db15c57de90995411bff6bb9d17394e0d88e498930b597e4dd74217c8d830bec35d82653511892c912cea3248ea43aa8f3d113264bed161cbea659f5e8bba3a0474a8b6017119642f7e6e368a371ed1f290a0e42dc68cb82c96fd098fac39156b5e94f24a9a9124731d4b6f6ce613eabeeb5b55f80ad3acf642d1fc6323f6767d830fc218733996e6724986f5e06a1e79b5082ecc72ed65b358aa21e3d83986c44ce0ce74e458df0fe32f232e0b6b94ad557016b2e6240aea3f502016b44a6cc71fd1bd65d5382a76d9c7ed1d505e75e1355bb6b04ebec4245f8ba0059d70510e65a837f42e1f9da4bdd78dcc988ae89ebc91b6d19204bae8202349b67cf45d22872ee628d7566020f528aa43c938166b52d9bd1a9b3e15beeadfc5333a1eb78aeb2b6f09b9259c72eb82ed89ccb026d05ffc73954fb4fc2e2588b984bd3688cefb677d9fbad3792305acfea58a3a41554bc3814997ad98c139e6d0afef84f7771ea9b6f3c3aa1ebaad7084a2ea1e8f837ff38f3e5c7310fe8ec1b0beb7502d0cbbbac20cbdf0b4bf4a942885d3a337e16157447d844c8d6e8ce101b8fce152153c634af28eee62bb43e191582f1262f85ab6490df88137979c0e6ca6a8808d1a086af6ae20ec5135021f6723e5b3374ed3d745f6a1593503240f988fa27506a487976d475932a8b5ee1654ecddcedf6d3283e141661eb03a8ead2f7bd208e63a21b458c5230790c36f8dfebdffab81dde082c5f52e16cfc240b0d673208155653e875e3165b531e8ed4e0d9d33 MD = 5377572306ef61982330034f0a28fdde93da57c53cd1365126cd496847bc05694fba3d508b55c97db476a75876ff6474 Len = 72304 Msg = b6320a8a22858bd801c666aba0e461fe1d4fba68c1ff18428fb7c20c1d8b0f0da3a01e3a5233c659e7dcd0667f146436adf6c25aca4233468ca73eb3da421e41df6274615e8e3a7245c9f82a84143a381f35412782b7f98616322b4611ccf463920076c7ed9ecd6b431344bf57ebc94c9c949f979365534953def18e693277bbe3028a33a86c688b0b441eec9fa1fbb94c9c4472a25429d96e36f8538b7b9190fbf11a6e36fff41bc2e3ed7a043fb7c956d499805a8d647c8dbfa95c1faf292c02558d41415f57639379193230cce4c2e3c404896017ea7bd9036a73ccd727d51fb44b716e957baba48d0ad9c8506ced1af5ee545ffaa51e7989a45e3af972d47a98bcc967a8463b1da7273a77d4369224eec0aafd3f7cac95d9c0e61220f4713c884810d4a0a25a2750da1ce35e2af92837e053e2ed566f577c24d3fc5194f38d0d570d5c867652ea0e8b46b4f930694f59b817b70c1dade5f93aed9f963aa494ae5189a861aa698d6ca08193aa302cc1dbaebe24a5b8af67d869fca4f6ceca7af39e4c603925e838ef8295287b1288a5452c0fd0be0fbd06a218c7b27a39ae6664a61e2b16d1171521994a1a73bec6232099d364620a1ee9deb11772286198818ad1c7b101953d49894d68119a1d2d65f35dd28796911c3a149bb48c0a2fcff3ec880e9b0159a3ffaf07b6b7f915079046e0d4e2648cfd1ecc3e66a7288b9de31231bd911f05925d1c2dfdb1978f9acfa289a11dd3e30abf8f02f56b885e487985369a3a6282508b572905aa7d7430488dc200dfeb7e8b45e44f2882348e19dfccfd6e3fd2b625b2e8619648b1aa0f2391f3bbd0b545c8d8548dc8913405583a6ff00047778a5bfa583f78333d1b7f89368298993821089e66249d438ea94db5f7751afb5ae6398a2e29721428adcaa203d860e27df895c2a27c6f3d4c644075ebf6820382b3068bf2894e937b4a3795805dda528ab4b56a90fd062a761d78a5d3da0106f7d70b242dc6d2573dd90d8b3579d092693bb1bfb9102ab012bc3e6b38895fadc23c907e6648c709764295abab95084a2277d1e8a41ba2772a28daefa06b649feac8dcc02577f4502f6d171e69174c21bb4e5c0dd9883728c54b945a96e8d88477653913f2bb23d56f42da0bf76962bf3eaa9c58e1bdb16bec0cb3d49f68820672faed9f567c1a403ea9289bdef112cdb272d7ef4324d8e7a653818445532bcbe26f418bd822a238a48a47f5a51926f3208e56fa87237345fb0844930f119b7bcfac7d0001158365aacd8043d44864d88fe561a236244c2cf3144529850a9abf4198e92557bd8570575a1baaf4e5962507613f0ed78e2945975dcc6c30a6f03f411dcd2364837001b41960548c5a828191e93a68f2c9d338eecc2187974e64a2d6227021b0cd0bbfc7f29769240ef195336698d50f3d12ac00498ba04368c09009901b48c1041f539ace07104469aa09f7bea27fb752ad4ad6bd53e0ba5ecab3e14d16c0219174643593f97275d37784e5daa08e71706eb9770ec26e86964bb06642a9b058dad29b9e2bb5b73eb41eae04a2da2ac6ff1ba1eb261e732e7a0a32a0571c40ec4901a0df7c8306287468305cfe97793d677dac3bebaf163b70d1df9875b69a6745c81a0070ab87ba7b1db2f5d721a65e105c806e47bf8034e2665f5582c0e35135f1b207ee74647c3205dbd813bed7b16280c58c2194d8a137925bdf6782463083420ffedd28c2f6ffe7540c9cb735bfc6b0249e6077470bd71d7b3f0d44e98e9684daec270dccb14b8dc4995854e70fa2b644abeeb0f5f92acf667c5b4ef4f2d67ebadab36ba7347fbdd48831dc15295f58cfbbb28709f39870c59e38e790e5abfa58cf698c7e0701402ce00e99e996665f6ad79444ab8189c73fae8e59e5ee7dbe5bd331b777b33bde73a9d6d189dd1e92bf057c2e052c659d7db244ea1a95b4946ceef333babf935e52eb73cd1d86eebb764f528e3c7b94ba26b542e35762b8423329974970b3738a70afccd5ce1a40a037bdfeac7bf77ee6e3bc708cc6def290578b0541c118422876fcc930c3207b0ba95669d0e8268be95cd1b62c8c90c848811d2663d47468010bdb5228262006c274227942ab92248a38fbfc0cd400a33058e6e0f6d2524dddd8534f031ca24b8d41291749edc3af9220432a75c4b7ec1285ee1c44e2375984846ca80acf2fb136b8742c2fd64096cabbaf28ad843c09b4af3dc3932dadf4bdb82e4685674ea083800a9e3a8d913ff7b24adefc3d1764de7fdcbb2cdb3b86511ca20fbc0b88803e42f357b33b3e14e4ac1934ac17d1635a9cd2ee57136a770957cfecf6e464ba2da5383de207cf7b585226130439f170efb027425cfdc02fab12bec57d1a6ab41952e03a0e1acdde1a4c78614bccfff26460e3a182c2c716fff4758397d422d7c9f0f335809bc0a4f3411708caf7845182560ff2128a0794cfa6fe0c8d3a158b07287a1581b32e35abd90ceec9e307f4113ab31d547c0712e1cf614aa776ca3999a27bc4578aa1f90abd5efd8fb71045d9b3d50990c14ff6fe18a4242cadc947480501294a47a058d895151b669c27aba16a7fa00e8067aaee29d181660a9b1fdcf9112ca413b4badc083a3294bad58e3307b8c915e2d89479a9ef4b9bb2c7271d28b5b5ab156387dfbfd3296238a1565531896cef0f281e6741076914d0d5c9d337f4aca9763827a962ebe8183f146cd090f872e22ee2af7f9820c3198a4e6cc5d1d7f9e45db80202988757fef6b4366bcd10c137688bae8a574241f108b977bc9c6485a5f36d80b209b15e5c860c1df090d64236e4ad85512575cbe6739e548040a536335fde0a805e70e57916a18a258054dd26cbcf9b99abc2493ef3856ad966a2f5d8ca9306353fcdd49ecffde3d446917b51447a582d9030a342aff7218fb662abda5c15de9953ce1313d9a791c38a9502fd783524d47dc8c13ad07be169d7ed3e823cebf874437e8a205b27fdbbf3695c738e8867551a918b6e7d9a1230724b9818939dbe8eb6e2220d7d068e8329146ffbaffb89790e93ea25dfdb1cac2e859fe488b496af5504c12169cbabe5d59e25dc0317f20802d6c4a91ec668a5b4a13d2d44b7ea9ec8eb50a544febea79f106460b1630bca9d63034061e35ce3abaa593def2e2124b69fb8e139272e922e7116cde2683a8688418d33d0bb612dbca5da5ab0a1a309c829df1d6dcf636e2bc9226cbdace8066a784cca95d5e04d8f9caacdaf99d815a590afa10b7dc5033d2070856bb97e10ec11264cd5b93f09cb96b0de159e280ff5dc0fb439babc180d7fe8601317626db6130503bbf0e82a189cd4d40a36fbc16215e6a01f0db07742ed7244de4cfee56f86d0356c01417820b5fef9b5ebb9f192441eabe7fe09e68573f67bf4e2b93fbf726f2b1374b4ba88e916933f44ca682d719e1eb6152f2e7e185c4b7c61fa4550e0c92dd6d2a7bafb4004ebcfc996eedca24e41b7db8a17d4e48cfd9e4f2bbdc7d7c882dda2843e1fc3b0498e03864b47e1165b0fd7826830df6ed88436b370cf605374516cb20f9c7903f4a47900461535deb6e99280eb3912eb26539dfa260e8252495ab999f51b6be33638b36da8eea78e986b92ea669884e92d360d68a62c45ae4a1f0fa1b7449f3955723a36397c3d0e4abd612aa2f43d5137530d65bad2b14dbfc9f9321fbe1fee9a7b95c1c1640146140887a667f6460c8ad2255928a8cf18f07ffcb4f332f3e84d7b4c780851fb1f3d748ac87c46a6016edcddacb955a6f7246aa28ffc472111b699e8c2d5e9327f0f28f4f7ab8b65172d99bec635823ed3a5b2722b02a6b3501dfef006f2d4ae50d04d4c9aba6d8c380e304f0f64d6a092b97ef4f1cdf6b08cc9d2ecae25bb7778c90a1b1b7296224b58c918f00efad31ea9f6b14724e021af033c6521374696e14288e8e19bab2f37548ea2cffa95df5dbd443096d00c0da01364e2c7f01c127182ee3b54fd57bce64aa57415f150cd393c8df9479a217c474173eb0817e6f312d3659cdc5f40cf3f8136172bbbd3a49970fc95c047c8778cd591084c764b41ab7b1594e18b0e732a436a117720c56c649fb68b6ba2a8045716e5c2fbd3f40523c325aacb476aad8fd668ec63e8ce2e8412e663af726a2e904d98a07df7884764f3be67025cfc875683592f56da97f1e011b2a6f37eb5fa1fc2d12b3aaab00d55530752ee926b0868926563b8bfc8bd60e342dba18f3272ecbdb9e99bb31461de2b29f3f8b05f38ab4bb30ff05f099aecd2bf8a206d889de086786406dc5b4ae7c24bd28680822008f66cbb688200916c24513cd8e06083e1643524e4eb2ed15861967802c879c767dab7f087f058a9c8221f7731b0622dd8a119af9ea934fc1950326cd251ef36b140bd34b570b7ebe81452c693a435a2ae834b8f9ade16d513d7463660e38a73cc70a6125accc65db54211ae668682ea4953f34c42527b642c3efa5f1246f288a2b2990fdeca2c0915f385b9121cf00e93583b6cfdcc0cb04dcc776e5241d07c1a4ebeb5aa3391f7f171d66eff2f281573dc4979321671c15fcae5eb879dcc581b8b3e8b24ce9f2e32022b559586d107d02545fb4bf6519f48806c5e18228d238fb34119b565fcb6beefacf73deb94ed947c5878af355453f23632506f98bce55d0ceee8c5be50977f8083db5d2419cea629aa7ac69b23e443346249f3c700a76ddf6e7fbda344d95cfcd58a5ffa07b2ee746288f8ef665a25c122cf0c770270a773e96603da7f853cadcd8aa93507a154a5a82badfbc4bd7f279a6c226f6a48f3128626012baaa309d99065a59dc0a4c003a6e94d85e61638acf4a79d78df3739026d461e606d39aac949a2b9f9dbc21ad7814d4056746c3a995508e65a0946618cc74ec13f6f5107c51eca4f13ff044a6964dcee3615c86c36e71863dd917c53f8bcc7549259f208143764ceb1d57038017520c0ec7131b6cad25e7dc81fe2f78e73383e1fd2259500bdf89e9c0411cde7dca01c4231af009f3e639ce55a7e35961529e7af83f196cfd80f279c35ecef62c2e46bfefd4a32fb52ad29faeb5af657c922b709145ef3caaf30d079100b87bc4f7516e97c0b352736c68ad0797e201ab8ac16f72c7494396be303fa3c757e3baada83cb57f9ef6b1336292fadf09d27094e6c3f733c616433b028e86232ba28fc9b1c6c361d490e11836ddf2fba53c6e59121aa93bd43923020a50b294b25cb6c414893bf7d2b5a5737bda7a6e42c3f74fc9d0031ff200d8abae32b3ac7a66b23536e0a9d237e950ed98350bb740fd9dd174809f80be21b68064a103cae24514859f897761728085df226a31574e3dd496a8b8c8de86f05f28d4381d80889c604db4d03f35f13fb6d090e655deb9293df7ecc539b9eb11352d63448b6debc107f62d515bb0525b565a6a3613ae20343c8da7424c8368e8cad6a862b7d37a577e075f897771148806e524c5e55601e352b06ecc8bcb7f0ba2ecfa2f3d61c2c45509d1e4fce8963a2b0937423556dcbb1318b9b072029bee3fa8fee68689439c0f661af0769775e6452f48079e311f2fe02f0e8a89c95e0503c32d451dca7b432fb491385efe2210e7dfad928a7557b65c5bd3d75d7023d491a3ebb77d95d85e186ddb29209d393e8582fe7f848404e2ea37b01347a78bf15bc3d0ba308bf9416c0a6f5f55f519e3a0c1a12b16fdb54a1c3b19bae2cff4dfe4bb62b9b10d4c918d02b42789864294bc043c31ac32d73054ee775ab96a0cf4aef3285279ba50d31dff402e15c141d649d3360fced3e94a46ba5f6f360622e42cf3880114e3846a7158a9ef9556a60cdcb71531f9416a0c44374864d314e502e14508420d3975ec399747c88296ddbce7185024b61be7daefddb8d82b16a1e56e502f91bd2ca3bcd943a0656802676afb7f8d748fb3d15aac263735b89c080016bd748cbf2d7c70d2d65a32a039b1ab7c65138dd0c9b4effba92a19d61585f79ce56d7f8dcc8e8ca8d7cbacd59d6ad2fc6188fd439e012f70cf37d13e038a10435080f6938a5884edb07b5082bdf185fdfd643f32c1548d8e10b7084af6a30ebc87358e8ad748edf408ffba121bc448f3711bc038d42d8eb6064e3b776f6f276b1211b3be33fe2c6e49bf460e2771807f95462cb036da978b2853c75dce2d1ec159abe2b830d6c4beeb3080f17187b0e4b249d1537a0a5c7fef6e5868938b4971f64ab8035e714b5875f9f7467a557ee550bd5a7d1e2b31f6d4044b2260082bdf4094802a0d4c24ed62821597b2893ed4090724a783cbbca27eac3c15b4025a7bf11ff796ddc5e5c0495f684faa81754343cdcc6d4b4a60e537cc87acf02849da60237ac4307d028382f86bd8d2ecb6b58957be38e555a34197ebda62b4d87e6d1665764cb5e00fa9b7c3acedcc19779d525b8694e24c083a279090d162a16cc69c4c969ade8d61a5506787e8e6963c8d374f91fbb2bc04516f51477399f199596a5f48390ad3bcf8d55a9944c2e179e7908a7ce7e7143c09d7846ac3bb7788a7f90407a1cb615626bef36d9bd199b44ef6b2b3e3ffe2f3e5d8c0773c6771bf34d0d1515fa0a4e1b185e85158a31d7025e25eb37a5db6e0581b8bf967fe9eb1827a4db1dd2b1cc42bc2a000f5a7fb31feebc5181580fe65d2f85d6db1014ce4036defa5b4bb4791f7ed90e91d60918e5c6bac4e301a281908f79b40b2100adb5a242da940e1a3bfa87f51661a6d9ec9a0fa7ab27489d25e5cb1ec1ee59b671bd9259e493c3ebfc1aff06824871f71987f0097013d407bca308fc664b613d00a12ea97e1f1130a3c80d92b90edf6985f4926a7a704ee82d13719909ebe09d44a9a0bc11ffa0f0184cd923237b99391a281c5131055d48607d2b7f14977fdf241c0d1a06fc193343ee8c402857476fbe6db747fd9caa303d296136ed15e60a8744a049c3de24010cf64e72306991115b098bd346fbdca7ac5e3944fe2dbc2657677ed3b26d68635bab463fa37a1d29d845bf7d74eb9cb69565db33ada9aa3c7bced2403a708e6018569d32e95296be1d697ccdef349264e086708b64505752dbc1c216c2b13d012b3f7ad06ab9a2d912bde94c209e65b9750920d28ae96c735f8776dfb4f61e4d7cae06a38f77e9819f892f816df1bebd3c361292863d90a4ef6a17227708d94cf3eb6932be5314beac1475f43ff444791e556f52c2146cef73b0cd6873af1506793dca056017cb9821a7e42eff70a0f401ad5e9ba535a75bd3a2bf3810b27a84f4ee51a5de89b518e68aa4b6132e7936cf8708f4976aeaf0f788161ab6dbb1cd4e4428999e727b45e305dc14e5f378486e2b95e50079ddb7c7aaf996cdf062e96d8874690a99c5280160b4d1db8a4531c8e12cf6492b27b72c4f9135bdba35e13b01609e89c83ac726e255745fba87f9c3f1f5b0d84871f90cc1067eee01d0bc9ef911bf82c5822c3bd4e785d84ae6a949a2199a1698628351467ffac98dde8280b6b2545f59465f297e918dae030c48413ec03d6be2a35fe127242fb425053bc88169e5874c2e66d6287c1348ad9ede920b111f40f0db95a6ac1ea71893edf05ea25efb6266e14b2c1ad09f10104774265235cafb88b32b861c95ea5e9d3fa92a61bb1d586f0816129bb4b96df3ad10e45a54c60673d32b6bc1b07eec0ca36c1306a5d4d12e4acd6ff550eac71f78bdb46d9499c779e29c3ce198ed2ca7c04304d846a7356c507a2d6ecdb9875d51807ed120cda8618987e1c575bf84383f35e220c61eecf1c124334f53af1373e0632acf1eea0ff56ff341b56e7a5e85c74a96274dc15e8546d469e00952d429cc6da1afb77666fb3de846f8aba82158018b08320219f4f08791b768182d3249bda6c9b912fb143c9a6fd7d855d0357795ff208c0dad14f92b630531a8c596995d178b35580081802f8edc9b947b02aa2aafc77c9705276adb523b81e0a466e351c7d06ab00e158fa34f3e8a8f30f0bb68a1e349c8aa96093e6741a1e8510ced44be7ea143ac38309fbae3ed6f776770f9df5d3cc723c89ffda9ffd9e954ee80dc057e223862522dcbd6b40c5bd8cf9382711e9dbdf824f3bf215e700b367663c1a3b935b8b8cb4cceab992e7cdc90eaae5d0db4d1b214cf2dd544b0757e0a609ca01622eb370b5651417b9dfa0a123e22ad11c82cd8fef9eecf9adf50b4143d15057c30f8667a12fba1409ffcebbd5689691422f5f24c3aab174946c360fbc3d3d9d5a808cd814a75d2d27daa05fafc8997fd0b5589655a0cb3382df70b27ba7f2408d242f586c466dc177f2de32ff6ca41b4c97424b121b8ad4edb133c00eac0effdf6cf65f34977c8f9ecad0ac60df56e20a4794b9857580d759a407cee1a3f419c5cd6a52ea1509d5f0e51042509b2272be68c8682c393d994b0a6525914a422cd4c803ea1949863302b4257b6b2a873bcd5d75ed72e121b92666c46a99e969a780df5b7b2eaf722568ca88edfd0805abcbb7f5aff607dda5904bbe04681bdb285e85c98cb6a17e3b879aa2e0a2ae2e411deaf0363217b1fd0d2baa99885c271dc25dd6a53de9dad3e3970c19e89741aa4878ddf6939b4f1df18922808714de0650ca2b4b20c3489d01623cf03b5e1035dfd41787a6fd1586e1d6ae5fc0f050509e4d0fe4fbc827e5656ebdea076cfa7248af456ff8c7a5c652a6b69dd2593eaaef792d194b82f94b842ef78df94e70fe274ceff5e595606ac87bc3b147c9e973d8b0eb3e8c7e4d3de22582427d6d0427d04f6fd019b0e5d2c7c87e407dccf129fe96c2fb3b04944b13e4d6be1053248df8295d84e1d4969cb51f1ea200cce65ba59d5ca5e3c05ee17ddf7d373e9b72aee36d216afa6b033724d24d7c6d642987822710e4f33c1daf9497ee6464a05ef9467d6418bfdebc20ab948326000d4b1c08e6782ef5d240e40c8092cc2f0c49fb85fc8e049eba11f79dd848458532bba79e3e0aea681d794d2a3c02c4fa39d434264d17c53387a50a90101541597f0ba8d6a031bdd6981749922cc6e562a37e219bf199c10ac205f806de72aff94cabae36bf950fadbcbb47c8c557a3d4e3c8427b8c7c8e80e3853e8685d8e7e1162c1632ee9d567a05c5e622b82d96ed751315396048943286d35c83c8b09fad85fd7f5fafc338a80de7935457c124f8d20f285a3f76589c0640c072f9a22dbaf6a04811959f1cd42f60edc236bad4a3751cea525c9e6229fc8e08f8ab262895f2b51efd12a9797b04e243f0d7632c69f8cce9c65a194778d3fba4795fa506db049c5276b94ae4f908ec3464ac52a2b8b78f950aba8f6ee5271a117979b74ed696d69122ec1bd5fab5ef3d924811de0c4bd57aa3f0594f0b5089de7dabd5672543e439664d94c2ec964bde0e1d2914f1204f09268e1f6e67fa9b69fa4867f6537655e9c5303e324b24b2843cadf10df3cf5cdf16f64a53678fef5283e21762cdb89bf0d45680ba92db93dea27d121f80c37f5ad9cb5284a68af6168f0b4c331085370cf80304b25035703bd40cf4d02487370b037fd0788176402480168efda856a78cc4d822c00fccc82a55c021a65b95047e08863cb5a4dc4e1b0bb6481911c78dfeaf38635a2e0c0c288c592128a27778127d710fb27d177058964d101bd9322ad13bc66ee7477ddcc50c1a6bdd75a8f266c6b2c1f566c2677b945d6f7c5b312eb2eee47dfdc89c8a7e39966a2b519413f978ddebf51e6793d2aa69cec1344f0a123d2549143dd2c5b2b95fb498d2d35d28f854e647f071761c2cf4a680e0e63d5dab0b28b123caff10efc8d3ac55f12ea3e9ba5954896a9ea6b0709f11ed814913ad08c55af6ef970761843fec775808c8b170bdb145dd6e10c970111ab6cabdc2d790878843bb3e04a2f461cf93729c25e40a7bd4b22474d8dc7594f1d90cfbf9bf44e7bf76b8549728abe1cc56fb2939f5fa2c355aea336d5df3a33dd0d28406a8a87e672c516b4d571d28792e3c60836bc23759bc993a5ce27cb4651ab5f6a8380db425c120f285d2baae3c75c0b270c9f535c833abfa05fe7350fe2311c42ce2171151d1a17aef1026fbbcea229fa07505aff76cbce3270669f17f86906d233b472ea1da5d74d793c49940e7dc98910165fe6dd426960eaed32e4fc19c6219b800546c37bf70dde225ff8efb593da103b8a9a1e683734b3c41500540a0437ecce53b379631ef606fcda6ed9112ef8ed0504a2a305e1b5b43371f36a04671d10e684b8a727f411da12e17f345b43e891bdf586d2e10eebd5826e43a5cf97daed10bfdeb38d236542ab9db1685979b3e2aa85cf15c367dffff8337a6c323d766d942cab065e50fa2711368fddd47962ca16da04d375939818dee91f29f601fa77b9f4a9086125d96f8ad39efc93eafd30471fad73bd3b1e097cb7bb43e38a6df2c93f6021604a09045f9c682b60758afb867a535f64077abb1ac6d522c181d7c80a3457ba216792ccd8ba74d301c213151b137dfe329eb315003ef52e588d40e0c5fc16396e237db13c554a5d3f789f654e13b3b8eea9d1fe7646a4cf7057b12241be25080d26d19ad594732fe23f37d367a27df562cfdd60c306686dd0863176c8a30d8dc619966ee9a076b3b2c1e247ade7641d54b9de2230a7cc7041c3c9c4a0d3553263a4d517c1a1db5077a3a8a9690bef988d0fdc2c055155408bb680f41275855eaa6e957ca5be2b6df89091e1e435a7cfd578e0668a2b8d4576065eee66b225786520de85dc1fed74fe2ea6d8638e1228f39cf0b8065efbe7ca5c6b9ae4b1beea5a61b81ab0eda9cc5125ee74313eba0cb124170ac311278f4e5fb0e1d49bd71b52da2c236750e7ddb91e719e956c27e4d5b85a44076d9aa3cbb834a97d97f973143341884a6f300ffec1383fd641df1628ffc34e1b9adb8d090effdc28ceab5a6a130031a1730bcae7b54a3d3de46c0c72a2591047bf72b3d00a1a601d6775381a226f07b48301763da3b082127d562c7b482472d205e87fe8548c1fa48bdf75ed0999f0cac8997bc83270f49d3623e00a9a2d5d0693c45718935dff05627279ab7083d52d6a5b41500b947d25355d8fe9407bb729928ea5296f96ea8713b5ad1cfe379f2390cf319dd52304f4a28ba0dee1166a8429cfd0e4923ec773c73177075cbc34f5627eb17639267050a6367db225075c5f810d400ea15d7e11a56c4036321a7eeb09ef2aa5dfa4ab8269e58d2db6557702c1d35d7247fcf6a9d6f0716f2759644cadaa05f06ea59cd1122038163908a1b412a68fd72a2119838145707be382cd627538a8208f322b87c970e6375929c4be9c103e04f2d7cee7cff1a7220f9da3738a207dfde95140ebb85bff56bcbfc7688698d2c24823fd1ce87e7c2b53b0cdc814eaea4e250dc344046beb3c0ad292faf9c7b3d9d40f8e6bf374596056c533a93a1f59ddea6b9cdbd82813b1ec6b0dbc1c2349113da26a1c1859a587c1e3bd5d24463170e175b4f85a19dd7c099020f61836fd322be4777781b7c8693b13532efbe7dad0b132f1e2b2c6b2670b4cb3ef1488350348de9ec353152ace6d5cdd62e78abcc503aa3ce309b7fb3897a4aef0399f5a4d3997c84ab9fc337efec643420fb83f167fe67e4187751eb858a2f941ae05d5d8a917db52d9f34b4097596d169cf8cb8dcced9d45538785aff34d7c2a9c420c6c3e67c124db82dadde01e4326b5d3c8f093c78337967596e513ad20f32bdc69d1a08e6008e831481e801caeb983d09e087b7d165f77c8bb215ecbcbe3825d53ce7894a2452889fdc8205b94192e77b59d2d1640041f075b2d7cae6643ca4d322d6e826d25c21161a667e4df8cdd507577509ae770b5baddcf165eda5b2a326db4295fabeede51dc7ffebe755bb8e4475d8d12f5e96269abd0d4e40d73cb966e2c523343e9a6d2d71a8cf140cee8ba91188c8551b84e9d2cf75d47e9d3d5009c5c90071d5e401bb840ba86262c955abc71f4fbe325a0ddc80e5a8f55c36ff95f0e8ce22195d4b5e9b9308411bfe64d312d6e7c937781b2e7db72c5388ac1081f08eecc37d58b26d04d95f3e8cd041a5717a11149f818a3f1284ef07c71f4b544135dcd47688cf8d7c492dc939f174995f636c1edee8e384ebb951808c0308836f781ee399400b265e5ce46f97d46635591d49567a20af9675cf045c4bf9c0a5e7c0336f5a20fdde179f23904aeb9effeb124939f5cb56fa2d5078098b561c2226a8bae63dae000b548a5bd9b7c9975f81ecdc57e64b62168ed81d06ceca638eb88c05c6c839ca3481a90dba62d0e7daaa07833ea013697226b073e28aa94f5229f4b4af6e66a4f02b75a9a0e0a3f907effcde4cc7c5d5a361840d1b43853802d77d380ea4c738a4be7ac03b95b5535db0273e00d1d52f10ebcd591f8de0a6176d8010431fbdfdf8b712e1c906877f52973132f932c3ee4101f6d86dde3e221638a7de0b13cd5d32a1e87ef7b78ce57d11854da48f148bca608b1b9499102475e54ee1c54567df090b6608463d582e339b9dfe713b4990037404831252e925bce00fdbe019300bd260160e12ec5ba21ca205b61dbbc58382a90dcf65a03bce61b5451d0a03986c252c63010c6919e9aec14714d8a52aeede9be1211cf58a66fac199359189136887dcf7719118157d5085cc9b507bec3a5db9294896b75787eeb166a6253e3399610e2de02f9dc0d5a84c10aa03a48beeb68d60a6618a15b9b3f157ff23877b77471c80dd565ece7b2ca0bdd170b38c844f8501bb1bd25774f10dc7911 MD = d3e8ef0c120279753ba4211888c2b079f5913a1d9828500cfc68f29c9b182a8d38608cc7dae41448198ab428231c24bd Len = 73096 Msg = 6561cf13916860ad1cfc43650d1b5142a12041aeeadf6f26bdf1db36cb4d75a50e1898ed67bfd4ed8542f0e208d32f94e69fd3cd0eece00f4c6422866db0713ca349348c2b8b24d92c0c5380e32b6c0afdec3ca7440371d87e2ea26b92c890aced9cacda24f7d9d8db017225e54c8f0eadae8422d44cabe71bf864cb84bd595db4b707bd9c287a5158c957ba575e2007bd8db42805f015a5eb696e9089b655b8c0454d1fd9498fae6c0d0a288188a85df633d3a02117387ab52acaa0eadb0a23d8ec86e72480a056df759155abf3ae772045e9716ee89acf43e280e5ef550207c654bbfdc5f536b179a8f62b1dc7babf036eff85358cc50a5b3a9645df4cc5cd5026f44904d2d827024f41911e2b549c66541bc3bd2b4195c6da16aa04e7d9db3f0a37b2293c0f204111786ef8470576129f481350eb94d64c6907fba44fc89b5aa78e237b5d6204ff97a5acf14454b6d0f88b5d34f74837b490722008ac1a736ba60081435d593b0488cf32524acac26607ee89b275e51ec8f65e00782555cd38ae95b5ca647c2d188dffe86380ed039c737880128ef1f54e44d3853be203108b6856a755995443034e3cb66b0f48e13ce431289c69f6230f21da969b0caba42a7c4a3f2f2468e38c728e84b41f60c50c04226a982f7b10d336791bdecbd6f1dd917a669f2e40767da2fd3a84d7bf15d678522f4d070924622abafd4d460b5f6e4fec02ecdf65659c8592c0245fec3b60ebc95d041a27c783a6a52230a6d256a360aafc5f5e5e17b2c454fedce06f9d730390dd058f5d6100524173cf12b33e4669bc3d40d4b3f386064cddf382d1a5d668ae98988f335a9fd596d871b3377f1d1528acd768ed63e2f48043b36c99b953c32b750542321a29d8ac3a60b1e581f109f8306b4393cd8c35fa1962c74f43b0bc105b93cfe10965028c7fe23346ac89f034b3458c2d9b4d72c24849ba7baab6fa64348b5fc8901dfc3d914061e069af70e21cae6c4434ed53deb7b06ea6562d262fe735197015176dc756c2643e1e29310c53ec0b5f00347f584dde0a57afdde77a5cd92660021cfe33b8af64e535c0dcb93f47900667ea9f38f41db7171d8de64c7bbfad20bdf457889e51885f143c19f2ca0923c1d1d65a8493b39d6d0807cbad2c2fd739b0671fceefeef93225658fbedb78ee19a6c1594611e9e3e1d8113da55770cc32413dfe0d95cfdfe9ce03e7255bde16954e7344855807b2fbf574e43de4cbb393da3d9e4e773c610979ddc92f3081c6be32b4c24a4f553144c7f8697cbb88b4e5e231a4987d7ca71c8dbcdbe543aa241ab84c7b9cde1b8943b764746bc4eff9afc1dfbbf48fd9daaa7268c84e7ca0583349021883eda0e1802b82ac10e847a779de0f8969959922398fa93672c3ad8b914e9f4107642d62848c18ba750ddae9cca38bb6ff7705a6534e47ce5a0117e5ba2dec9d312b0a33d643ef45a21ceee52e771aebbe1d658f7f1609370d1c278d3850aed5082b7f7effb6cff69dfeccc32ac283d0af7001044650b81993fe25ac931db090944ad468854f7f757099bcac45ed8f0cd956202e2e621c1ef58d596951feb977de71501bf275c96923d705c8095e064845b80c35c1b5fdec3ab30aedfc5a9032ed893cbfcd8f737bbc9ff13efd7eb02bf97f0b4087b1232b6a57825f1b98fe68ca78e07b9f07465245d8c637a9b5545eff91667707be56848e6107e83722cbc17b288478ef440a97c56ccdda966cbc885fd86503c9455d9eadb8e2b0d75fbfe70a7f70de45ae87f145424e504b09ae521f3b4f0c55ac0123cf465bde83b7a17f7e67ebd429ad8409cc4291c050f6f36349a16eb9345d0ab8fcf2b99bc4923b34e0c73f8224a9cb866254dd532e995365e4f40833edbe40073da4460e205853ab3786b211bd0a22110f607c306c5c95fdf91b66a208396ab8994448602171b28f8b8e8da97d385252dc4eb48192a683d58ffed02d0d35527319bb08b84f462086e5c61871eb9c23f0d006ce6b29dee395ae858dfc851abedfc4efce3f313d65384c169a928f9c5c94f4711118b86e7ee55e98e738f84f77a4a2c9e21c4fbf484fc8665d34f1a1c7e54e75c7b0c7bd1c6ba81f2409ec3e456bbb318b7831359270619ea77d9a142a8ce9fb365ade3385d293028d96eb4eefdc1810127b60050b4520a7c198115b4e30caeca83f863880c028296a087ce73f9ec04cbf4c63997b760c67f3abdee0fb7afb2e63874634d6de6e7c03862871fb5abbcfda14c257aaab2dc784df8a09f81183abb059a78f4fd36de49f397554ecb7127fabfa06a9608b8cafbe5b9c400f9f6a49d6dd30b1b3472d478849edf9da5ecc467a27b6f664be3008e7489cec06c9b8f21f3d6903cae4b78f04dd18c68df6f10b8ec35aa57fed22b848cd1274a639768dd19edaeb5c4f12a25c1d7d24cc288ab630f57a2079c068a929138742b797ac02352b0cd23033466ad832a47c609c9d2ea8e59fce1ade0cc1d24183bd018a6039930986210f365ccdbf44153412f9355d3ebc501729f015ea8a808c4d4bbb9c193363d03ec1005bb55b7a59b6a8e7572a3aa21663709d8c0b9af82c5a5fd2678c5c5f73930e3a4b09f2fdf768ea100d7de3be781ab58e780c4ad0ea4c0376ca7a5725f686be8c34b1cdf577b4a2195e3e8239fea4c16ae1d4e2314e8c004fcbc96ddee181989d1f943489620196ad53555f3a306a5cdad04daa42e1801e067562e3b2bdeb6516139c6ee13eb68f72f2abc2ea97d24d864b5eea2c2a912443cd2d04c8102ced9e19b0c526963d55104526f371ba455e155defe916b227dcaddd12174965acf8de38b87f80effdb03054af39f6212c55300be9f029ffab0cedacfa635c41d24e7e789de516d35e687a252fdea155edfb7e5f32478c9b837dab42cb312a2e08b625e1453f11c9c84495c38c289bddf218a860b336680e19f78ea86fc9dbb3b6fa7b7c99d5985aa30e2a33b0600c41a17455165405e5ded4423ee5cc73965942e02a5081eed40c578ce07e81cd1c0a64d62e8afefb2a951b256401cc7783a61531d765e6d4ed6a4c8760ade9b9f1bfa208dac3976160ba5869a805561ccb2497b42cc4aecd0af9ebc651c8cf6ab6e8c2d002c9087faed6f2d6b1f851ac965b3033d174c32253439a135cd51a29910e2ef74ea53a9d3d70513428e2a76d0bd249746e7d0b1bf1cfc23429deb43eaab84d45655e14033510dd4bb4cb3fa853114841aae870ff0c25ccf25fea84f12a6e8781f0fc7df9bd3ffee3febc01a495a097602dbcd918cbce1e15a602728a39b8447596885fc6fd831cc3adbcd5abfa089c99a0012dac57512265a82d6650fe1fece70009a1b31e679fb46ad4a303aad0c1b6abc05604d8363faa0a73488ca22ae7a0d6872b084870ef7edd0b53f5cc806d7df5003b687506dcab77dc00874c629e68bf0be50da22874e9ad69cdc989a007b827c9c41f5648633195717786254d7706639bb709551696bd83f6f9c708b9f92de823d973a4843b040c3993d45575db446b42894688c2bec106bbc0377252aaa5e11762aa8742ccec853c3db8036233e87f05430a64b552bedfbf0860eef482e7baac470d260b7eb1a8835e79589ae5bb46eecd9e1176bc7cb50abb8ba526e9bd1aeb70e4aa66b91a1c15dc607ba75b8569040f4ab68d62c331a5bf00be7047eda9dac6773adce5f08afba1b59411fb0e8f4ff1557c83ae5bfb97fe07625a044010842f0dfff46afb993b93c0cd5e2f1d61d85c098adf060bbae85ee8b96d887ef7ee94f02136b003f2df9cc84c185e7c87a636ac0929d49c16a1c9eaea303c6f0522de66c72a20d03ceea31739c6eff1a8c1698720ea7fd7b9c926561e2c86dae327f3b81959202920718ff3bdf14c456c32dbe2f8a86f8148685d747ce7cf893905bd2e404a19d8466f4aa50020dc407d007605b8ee0c656e87558c2deb8042aec4230f648574a355f0bb7429db07a9803320378941be4ad12cf8e658c0ffceea6d0ca5ac939753f6fdcaaa60ab354a20d4c3c1932bedf719622dca26ecb6f59608623641fbecb0d09c5f8ecf16cee903ea46ebfd330135ef2edc7fbff90b7e5a9b0c0b4b45d9818cd862679ba63a4fd17d91fdf0e262ccfb9aed4e4a6f6833dd30f26cf1fac890d1b6bb7eefe3e24433968c3f93be7884e4ad497fefd434dac8cefca05ba120a34840531bf1542c8fd03b1ff90f51ac25526fd65ad8b2d73cc27e12f1b2c24983987d1085c98181fa527732728b236476efe97d262a90b92174471ca51ee5abf86a75db06a0f24a4b5e4fadf330ba09406022272d10f7425185310205c693aec966319de49e30ed4b9fcd78c425a0044b5022bab5b06eda939e44ac59d353bac033b83c68eac2d4c2baf87b2d935dbb5f65f22007327de9b0678902e96cae37a37a12a2daad3065785ad89f76a277984447993f6bbfacd7718707edfcba2b8d3be248b5820e030a342576cae6797802c19f1f01287f840c9ba7c653dce552245014615fa736c22ac0c3d9e5c641e861a0158d4c88998cf0f96ecf1ecf14ab64aab76586934cf52ce2dd09d95e214d1ca750ea0ad1354ceb528529341e6fbfb610745d148c79247a631b0f8cf642319d9ff93e224c7d4d666d93dc7f111f15804bf350f0dbe5d87b0a24f2e8d6cc1b4b4fb7927c419716c71341f1e5ef4c352b24db4602c8b79897a1a1bad446e6948e8133ed00f8ab30780c376f50021da82060d547329a18ed36ee3970378db823cefb155796b8e221df201c5ea790bbf5c6ca885c689b2f5ec0bb951bfbf46b50738604d826cb6373661799c7d2e24ea484299d8c8c1125739dce5cc307c327a3e5eaa879987757ad74b855b1b840fd3ec444bbe0864521b436ef3770434213a58defaa41d405e65870ccf92443f1f04aede48b5e3e7f4caaf1e8ce2b97b858ddd15db239c2bd37fbc41b2c285a3f505067d1b4109d07cddc3780c8fbeb6f1dd31afb67674be6731ed76d97c6e57045d899d3dffe8924cdd2717ecee927ad8b10d19272d555c9c14a118ae105cdcdf66bedb2b42feb1f741505ab87fc33bbca1b5cea7a8bc9af4a05da3ab3eef89e8c90ca35daabac40e92c5dcf9c3cf7e1017c25cb288f90de36da9a44b5874f2b2ed09826fa7ab2cf559fdfb2b4b15c6659bc92fd24eb909fac4eb9718edababb05b2c04bbba5e714dff7f51b78644894f9620d4715a7b339d4eb9f89e7ef229839bea86cc6323257b0bb06d38f5ca4b109f6fd73a4c9e0f6d738b55467cc6d08f17cb953c22c7adfef7379a3a3a15906b301ca47785bff1cddbd6199b77b855455755bc75898a9f5c5a8b851593c4edb1d0adb8c3a64f7f40d030c227e0450c48e30f78f3080a6e15ae02aa55b346a786f999a0991edb2c690911fb5656db89fc435f374f1eb59ebd5a6376951919724d2366e8826fd17da8eef001b14c0a42f1e0db93e44e2aa5b5f7f4763e25cbc286e6abfcfa09c0e772ea6191c3205fbbac53fafb5d06c81781ff5c25cb79cc0cc6abcf6a8a8d27fe6983dd17f6742a789e1533fa03e91c68b3e8f111d78598d58eeb579d9e6a85270f53c8f0e5d818fe499d2d0c9355961dce3d69a6bcc9b0a1424dbb12a01256f5b6d2cbd8fb9c99b121543c9f65ecd3ab33750c6115b6b1f4832b90665a252bfef2794c2cb2623b35d7e2e94f061f43a586287fdd5ced0b43b40d4e150703528764cfc068a4a95bf0bfc1b987fe5d747128b03a881cdd3b13677b6a8b514d9933603ecf193cd2aa765b6933d6a927c4a2bda4a2ddbff7bfe81fee6c55a3543e97875edebb058e753b3d51deb7b11ed2ce978e6f6ac0dd08464feec9e077c7d1084c9865ca793d6ac3d80420a780a32d3958d5f69bb9eda29279f519d86908ef2a22840ac4125fe984ae089022a24512976403bf0d25ba2d611089c289e1b7e761abaa24346b76700241d7a3c59085415d6ba04f2b7ec2f746b6255a916c2558333a634897ef01acd115e9d1ecd5e427efb2341d733f889e97dd40487b72f1c0337157ee7b1791ee55acb7b114dcd244e2ea27b060e27b91f8f87322a490adbdd6c2e09c3a6f97b32478d9b7ea3fd016cb75f39e91023c6fce9a366fa94fa98f91b1a5c8626193a9b1fcc85cb9597e1c0de8303e70191b86ad34f295f5fa85d3f8b00ff99f98162072cafc262ec43cd32eb366168a81c985094b302c174bc319706097b62e7d8fb60b45fd9a96fa8cbaa259fdcd4ce6a6d9575f8798899dd1de9d25d574bb8c60e8d0004520ae86fe610d6e7fb943b233f23be46161c97b3271d38231bbb33f5a17658c5b6eb1d3f234c4435470eb7f016e1b7c462e535e75a1b8084501a210abf0303ca8cb6d8c18c46b7b247ab0a79fbb7a79be44c3d21bbcbf2a77dcf4ab06d1c4b3c5cd2df9d28e7798683d3fb65f58dd8f224b775085415d6b52a44768db5a97643afa7fa7aff15d1d883ef545c0d4b90f2ab8fa7452ce273d5dfe06d499e92cd060b9df3001ab906d0d065db084ada18c3003d99804b181230250bf68d30bf98aefb1c91d880bc6198f19f590eb420b88cac271460baa1fbed832ddb0174181f62048c9baa39042a556e0395195306b77635b7df8d8063763582aee24c7186a94bb055da1d4e7ba932d0fb59cf30745fa82554c4b0a548cb30a8f7d41630ef809086df16dac60825559dee6bd85253f64a0365897132374105806e7809b73dea5b0e931689a992e8e6604494ddc189c5865854f7772e1721dd8f7c98cb105630d1d1d7a4d10003380e9e649c8686001482ab88d66ba1d2b3df5f89fa0443249a1c5614865ad2425ef4e1b84b7aa89e2b668469eef4934f3f3477fe675d568d6f6425b385cd2737a2c2b0a769622f4d515b6b5f06bb0d760d035f41a77d537bf9d0c71a69d207ca4b9d9499bde524f4cf89e9d2e867162f6575a0bc820e41d57e89c3b3fa107be3a3af14f610ac8e7bed17852a5aa1b7628eb2c1d6c0b5298347b7a1e500308a6af020b8272a5e75c9f32dc8cf2511f7f7d1e14af6281c126c9c80ea1742d93d477b180892d3a4e1c829f5392a115eded6762ac38684eb047ac40f25b389b49b628cbe8da0d326db5fd79460a1e53174e8c5b6b5ed9aca0894098ada209d69aca36a3aceb9f18b6a764435c59d6b31c21305ada893325f24a2b11a92c6469f78f35fb55346f67c97f6b9fef1876907cf40803722e01655628d05e6d30d4cfe0838b157a5adaba069c57e176bc5a85aa3587c7aad3c0d52ca3b4d17285d7630635ca9474b58d5a0e8ccdba9bbc1f0d3474142a1d00fdefe6395d1d4161e8dda91458faecdad3f231cf318dc6ae1081ac2e51ad214c152033583d84627b85aa79bddabb3b416b0d20e237cd7ff8fbad61c2a4b35ffba310648eeac94e293a23c880a447f87faef55c54250c30232ccaf5efa1ff41b6243b2a5bc93e7cf17304460b6a439cec1c5534939dcc7fb31074f8f3cdc34f0224fac53d7d66777adcb652bc8110a12d2fa74a3f1680c73f6335bb7d8cb2004601f9f5a25bd3b61bb3a47f228d41ad9975661da513cbaf2e8187edeb534dde2857931c3908f8c15ab4693bdbe3590ae77a1c2f640a0f8fe6f7d5e0dbd5f960ffa260a95ff96811ce3b7f192727b9416daa23e00a8dbee21f32ca34cd793711426eed3d8591843fdcd55087b2cf0509b28227eff7036c5e2dcebf6a1eb1a967a70983494885ef940cfe7817fd4dae9c4cae92afb80f9a5c99383ff16e23a2ec942eed4d273b0cc6e533703a652828a1926bfe9fcc06cb55f7ebc65b2a23c618703b65c9a0255e40ec00b37f98e305923a56c630b18d61e2b065dd07d1468563e1ab973f21d9768a87e2cc57f702c7e69afb7412f708107b69330ea8020053675f1bfc2e4acbc81c5f5625441e1bd2274ad692b71b0b399868efb58c2af5d28b5ef90f177970d56ec8d748c45c72c6dca054ac8d7c0b5fc255d87c54ba7b655857cf3a7b3c6d210a5ae2c17950cc286f52122c16c88cf571b6a9cd724f259e56d00b18ca12253d678c0509a3996c4967d67b9bd35f048d2ee1c013654768efff5e392494891d7d1ee2ba9c0374f7dc4e841d7653ce16a9728da808be31d9ccba68e5e86b1fca8288e57ff2e991d3439c016436188417bcb500edf7edacdcd720767ddeae24c0c04e0ac1a8f67ea301c8c4ec65821fac499ef1fe7b64070671ca1d7d71ee5674c8d6d93c189a79dba96d55128f310f28d278c7560dc1dedb3f0fa4713cac237b0eabc72bec4631e1acf228631d95c131e9daf7812977a2cf9179c1d5a957fa37f4456b2d7e9a25598eefb57a8b20d43be24e190c5905e1581b90fc37427269203c2c1bcd5a06d2a7c1ce82b57282c6cb6e4a825406fd19092fcd99f2929beee828d87f77f90cb850d80726b04e1bf754f048f9f4cdbdb85750b841b4143509e45cc2fca9f62c44e9443207d7885d146ceac1b66b17c85dc730c989d831ce38a94a8429ffbbe606d598c7bca7bbd67c77e06d6e237fbd67dd2289b8fb85d7f9ab74947dd5d4aa8caa4840abad5318be0a637477ba500d750da861758a8ad2cb6f5d6c6eb8bb1a34dbd5255b64d8844798d6af69ac5328e3ed54f93601bb5f3c6977848334d9959dfeb20e424ac6a9b7a7cc56ca55d3a052d09aa980fd91ddbb2e556541c6dabd3667813406dba8196cbbb70300636bf4406bfc0adcda98ced622799720eb18e18cbaa55f0fa3f7240549294ca23186a51b23fb85a0255aa30bea5682a71e3ea30f7ca0e7c3203e89efe4959c366cbe33618d1bb2716a320acafa7ec05aec96924d11f656d7ccd89baaf27e6a23616d1fb1fbdf19d715c96691b744c8a2b2cb1fb40f383494267fd9b507564effac2dda6b14a81437b48b370ec55b14251d36abd2e8c909beb97ed49ca7cfa331c97ae41b5c294a19d2e20c8089243b388883d738233b3e8df2601cd0381d1f4035dedd3126b51403dd78579597329673911d124243014ba85dce02ee5cf10bd17dc4165b28ee1a7c50c888cc53f8ce6ca37d0d8fbcbdc984780337457ade013c0dc53fe7c726b5e9b93d408364093b6a5c2df97f14c330b8cdca1a7406269806624caa6586118ee29340ff593bc6761307aa86aedfa409abdb6d3d08a37d28b717d4f652ea110ded5b9e25bc4fc2f6fd527d358d81f2ccd40d770f71c7444bd49af8a44e67b7ab609e8f443b0481466fb90086a98011e2c7e072122de61e69c5682224a69377eff2c8beeb441e83ed0097eeea716e83f40df0d8e5bb845e1b201bec0809d1d4640a66877b75e23d43469b92d173a1eb790ccb35ea9926a5c87b02a0bec6b75f701de483853ef42ff1b82096ec2edeaada4abbf3a15541680a1cc8fac98bb86bccb3ef2d890dd8de60cbc3659b115934905e5fac9a5e692758abeb54a8c7699bb242d3000760e4cb28f7f0795eb9b62b53ae32cb463302662caed648ecf82f61c9713c8580e6bc78a2c3345cb78689f16cb0c1da2571b196fe7c0641f68c9e508a95983875fdc46976c40b8a26163929741c7943c888db5c66ba17ca76232aea7e4652936714a1000d60f28c3ad73825d237e5b2afe6f408cdef776cbc2a49820cfa0820c4d9b6eeef3065dd56482b993f9983813c1aa03ecc62918359209ec9cf27255b2fab9a889498e1e818f777d5f4c7df49fda24460cada12b8dda48f342d6446ccf808a06f86210356f343917e9a294577750c751141ac6767aa049f23b027c8d0ce8f8cf64c6f268465eb2cf5a864728432b7a6b2d9600c3a5eef434aefe84811139ea4df4fb9e80ae12c9ecda7dfd31aa7324dd7fa8b7d8b6cb3100c453c210857b47c6d18b7a45515a66b890111f385531aff031d8537e5440e89da488a00111b7f98322fef07ed43d7179a5c91306ec6d02e96bae3c7d275301547825841e5cf4e7cc10da66f5e2c4d378412d4263162d051357b3db9dd80e646d65b3d82d0f3af9e9c3a9467021f572fd8ac614167b7ba0b51a6e96a60f79f93095b903f7d191172162f2f7b839da374fab1bf2e9c45ebb16df67d65f739ba9e430bf6d444b0229bd163ee195d37b0ab8cab542a299df3e7fcc270491ad7c5ad35d4d7edc2494170506146cce97ded47e101a6d0aa1041138093586046524f54345ec9e860550c9415bfc002d2c0d7beaa4d4dce985d71d89bf19c680429c637d1023350c963c28b93c7e05783b10e944ae6bf607ed6048ba165c2acdeceb8ac9e57bab347e631ab5d223e3786bed04d45865222b7fa67b1235851cb20c19546eec7b68c766ca887c447202f565aeb6e1c84cca1fe6b19fda451c03f94a2fa8b64fabd48cf57b5b57bbf4cbb7d05be6b526a755a9c8899a5b6daa47684d346de73393584dd47d798e5f2fa48555fa7c969bff2b92ce3756dad6b64fc8be308d4ac2bc5ad0aad8cc6957adf6289c955fcd4fdbb4a19fc2b9a2a7c885e0442bef2724ad44de20943b2fccf62a694c3379a269c357a0e432adfa0968507a882e7bc681ee7c3fdebaad2ae590a60e0dddb15c113f7f55448f1929241f185c3140196e00086cbb8b520ca0cb05d4df899aef4571d8918a68e2e4781f74464fe86ab169c9827a1acf623fdaa5dd1ba665721ba3ae15f605f733f82f23f0401b55b32bfd05e4102354f42e209c9ee2294c6d1ebff37f168f9a883c9657196f881f236f73dcb7959fbf0fc1bad8d29331e494dee1669c59eff9eb98f4e47a3b5eefc2661375817157bbbce0ef80009586d5ee44512ff728efbb63f493f1980d646c99f624f9cd0b10ee027308bdb150f0c88338567715e95588f838b9a7fd4b633faf08f08f20cd9500e9624db66c2c37655ca339668006ea0ab34daf2e305f240f0c85bd60041ead9a79950694b9912253806b4323bfe576e69b19bdadb9af6c85b953d49400661f64bbf47b7e20e77b3bf77ab9d75af0c1c7b9852a4c21a50649bd5c7d529d0eb405b668f49d2a9608c4cab6e6a9d98d925313794035eea7b9022086ffc2617c342672d7b8185e069297000911c2c526b232b4de458dab1f4c58ebbba40dd619676ef82b1018459fe05ba15a8149a622ea0da19a827fdd7488f525e2b25b844d14864f4a44c565cabcb9b6907f6702e9008ce3973f300e0e357ed6e372d3f28105157f1e9c4649edec594695534463e3bc5683bbc4cbc5551b9e06a62c9ea81b00c4918d5fc4767239e2595045075078e81489f058768bb101fbbe1228e32e85ce3b8c81d76676bf6bfdf7a99dd952104a6dfb1d4459e78ab03d0511adcb0d25372178e14a55cf3e4a512988a2e1f013ac0ae32ad19e6148f10de48b047ecc65021e5e9501b80c559d87f6d59d48b2e9d49248fe446a81538a1362667623f3acf9dc458444b8b26e2e466778d63520fa8aae3383e8e8d01343f6878b49e30a61e20035985b7d4bf0c337835a95d1c3ae9806aba0043dd5f1e65e5be2c5e59aee863536b88d2e5f43250152612243226ec541b83ddf94185339f5e75334522abaad2151cc23f474cf1c4ddc76c4b4c5a0d8086243c21322a2066032c7dc51432d1e6c8dbd65f614fb70c32a82c54c35ae9a02b298f5e27a47134a4424070b6cafa3bff3719b5dc631e80a436b6b32f9fed3d8af25c02aa8a828592654fba72da802c289d10d5013d94dcb2f1bff8f99fa4a3162d26b13352f0f35df3d004e0e80041c59c503f8815967adf778c88a9e08c9b6d1883dc4a8438f8777c96028989f71756b36c47c9a1afe59a26c104c8f92160f062d7f66894b6ff7f7df615c526e1177c50a9905e684da7638de1dfdf4fffae309aa7a2061b1782c66664d13c553acc8712bcabbec00c2adc2b539c356b73ddae0e8731bb7dc72cfcc486a7477b70910777f9fc534f480a646dbaac93b22a79d95ceb57e13342587326c01a8f203f1f8ddf05f4c46c9da08cf37b8352ea800d430438772fd2158fd9fba59d6be9d2c27ad655477abe8997c62b1ad30b4b10f27b731301ffe0bd5d91b1abc2761ef8247efc5c46feab785a90931cfe157a59d3c347ff9ac9d5a62c2ae7470c3655fbbfda9faf85b8ba06538cb9f68719eec72beae152a426376c86061b0bed152579ef3e5eb3864160a02d0b1e3be0711ee56532edb0b08d7c8ce5c3bb6ee79ae3ef4d1aa80ccb2145d251ac1e619cc391311a3bbb9e32781b63e5e446e48e5037c853e01a1fb6c0d0094bd058ec3e89dc46a575d97fcc6e9a9df0d85c1143ad87919e3f0360ebb875d186285c40382c6672b171c5d9c0e980a7812059599a3b69c786882274dc60cdb78b1487120c23a661a8a01f30c27153fd214cdd42046244f6974bc5c00b623e27e51567b63d18327005913419438e8b2b5bce364f14baafab6afa8be6fb255daf0ebb7cc14d72914a42c5b2f7b699ac9e8b2512f54dbd00325c34d33e2e3282b9726744a7bfbb293d0a9dfa60be4b2ee359d1f1b911e1fd37f55b3a4a070263e3bab93dfdf66a80e4a7ba98c8aceb88862265312ef3b1ed28b10e3faf282d779a4211f728a4092ecdb48c1cb415234ff38f4f7fbb75a56681399e41b2041c24599311deac2b0f9954bb92d497895afba7fb012bd32a54dfedd9bbef172d46f0be3839731d0de64716275f7f077c2b123ff01ad42a5428dfab3bc7a632f6466314abe942efcf35be8e82527a685ffc0a17f90cf715b599ec65ba41f58a1183021968b1dc98d176662a470c355eb74669cc90480329b1306c89dfcb5ba0e1954418f9139eacd710e475fffd5e4f24b2a7ca306c86dac974f6a436c4570bf8e5afbfd79f079022adaffe179643bdfa994aad63eb00ad70e0013139bd562fca0cbb6a7ea4a5e756953f2f2877942fdb82d8c2a533ff264a0a22ad73270780d772dd9568d50816e57ff885ad11be193a07c8b66 MD = 6486d90890cc9b399c800127f495bf67f692511b6f26c08c53aac308d3d3583e7184bec5ca9d17905d5b9717d43fa0dc Len = 73888 Msg = 6a39c81281bb2979ecdde0401331c432a97336783cc657050a40793117a9d3a37c807875023f8a93efe1aa6420a0b4ad5803a9b2d818ed9e30feb32454a7b567f2dc28170382efdda11b0ffa1890632b3f2d91cf09ed3c4b57f87bae106a8a917456c042ad0bc121a795f5492287397306f8d418f6ccacd62735ba157378bbeaa9f5283c28626925ac57469a670f9e4f546d5bd5c83da5054abd56a2a45bae3a3ac1494d9b0f4db25667e8350faffa85d1920e4ea6c88fa26598399dcc9bcd49cec209bf2e9ad78f4dcfc56241f0b5de2671d5cab9f6d27323cf494e12be7fde0e0151d80b8c6e863a97c36925583722fb129993284ed641296870fc9f4e2bc3a2850ae2576d795dc5c5cc91e471e819f77b40ef1c5904d3226e94f19ad33bbe31561a233dc362dd9563c724a6c3318ac3b6b427bd9dc2f3b4e69f732cd31698637d6be4e31890ce53789b6892d4783f07cbdb8232a4796787da78cb7dd82419e201e36c71f36bf8a60d32a6d12f26fe6ac09f4aa4f692f844510741b469cd0853ea6c0510dd5b22372973258a59a490949fe7c53a19736e9354341cfa0f792e6141edf5e85dc816aed4462fe6db59bd2e709a3d1d9786911beae7a676509054b20d4d8520fb1a9ab216930a0d3eac4ce039a2f874f83229851b082551b77a40ee5676fde03fb977ebf842ff260a07075104e63f68c2defd78ef7fe2b2c99fbbbe244fa552b20e7502813c565ac5d1b42ad84e59217ff4d69d6f3425c210688cca80c0c49bdb7f5b9fba6757d0f9711c12bec290c6b6db7c9ca21036a8133b7db971b1a4e64275f369a9ac4ab12d5107b2bc2a2a80f0fbb71c91f95c8d5a815433000a8b597059030958f47624ead83db2dd6e7076b4bc4fc542d8e0996ea3dae234b3c21cec915426cf252452b76e85b92677aad18a860b41bf960af3d607d76b159591583e87ae6915289c621c7ba86fa12b20b8fac1b435101922c41a171379ab963f35efa1d87a31e6267da1676f7d557319548dd5124c3b4b7033c33a55b2ff9f16da86499c002e460acbcf9b9f8b4a38dfccca2aed2c4a133c6958d766be18995c708be6c0a4112f8f732d7d03408960b8493a280d7d4458cd8e61580f46fe6a5a1e87df0d0de48bfe9e4476624519d4edf363383ae832046cc9662416f2bafc580d019e4be3af419f739aef8341027dc5f1cfc03b141bfe6142f0a3436953359e64818a42d07839ba1bb94e2fdd4d428a6c062ad9ab072ef422863d6054d1ff734c8f0bb97a495b97bd29fc2ec1010a828b8edcdc52ff7c6d91b15a335a3d4121edb4897a89298f7e827062489426bff777f1400cb309d013b6f86286249ee3ee6e776c4ba621bdb69218e745ffc5482f57b7bc307630122fbae3bd1f59fccc23f8611df57937cd8814a9f2eca9e48d735466ba1243792a09c4fad3c6a25fe607b2f90240a975a73c30a9ed063b8e760a9688a178c0ee00e9fdc60d45a7d018e4c5c784f3dfe3331a10a23f5b5cc8eb3e44a4d92b98967d178dced1630f564a0058530bd8c2885a69d91b50b3b59cd4558743caf3717987da9b9a88e783fa64a5942600b5fb6c0273b69d88d6ed11199886ecdc97f4a0077c4fb39b9aaac34f19a1c7c9533197147ecdaf4f8cad2fa24f6a2777e1c812e643d2a070442db9f1a4a6bed07a0d1279d346d90d9c9dff57c25a7c039795d70a784ce971adb3e43390cb947cf136e417ba4aa32acf648821387f74e88205f85d62e417059ce54dfd233ad034825515d87a01960eedabd3e6fb00968e6abe7cc64bc3b193da6bfb38a718fa62f312aea35d923921be19e69051066b5d17686b2c79113f8530ecf6ca62909a6d0d14b55fa92514cc0957cb0583b97abe50acce7935f54a426310479d9dc739bd980435f6a7e4b075980c8a2fd8404b17de32ac94c79759323e80f5989fe85eba5c89334f9ff5948631e129f49ac466d18aa10d657720f4bd88e408a2b21992cc214cb952d98048659d7eb23e0f6c54551aa1f9d48db8a34b08e389a51c825c5baef5cee79cae557ca48a2cf481619c0a56dc79c95086ef4487267f88264d44cfcc2b7bf632a642310daea0fe36cac65708f7942c09b35f10cd55f233189fd2904396c767e19197eea291154477d05aa6f69d53e501667c17a217ea8d3aa38f06dbdfba22f297dd1a29dc93ad8b9be15ee974bcdc7dc8ccc2ce147080d37e02995bae5c10addf9b1c6b362323bc52e3e6a924dafac801d97718f58bf42d5bb4b28daab6175992595e3048cb8e501ee6a8fe56b22529382b9f4a6244cf8e602bb7377ccf203fd7a0473fb995d49026740bb0b24e46e79648a32a02a2fa3fb5f11222ccaf14a8d7f63f623289dec493147786dfb5464b42bae9817ead5d88838e2916415fd9dabae6ae5f5bae94348c4f544a86ef0b9d6409db167d6de0b0f28866db83e6591ea7f5fcffdb0cde273aab0bc24e057f2526bbe0b3a8eb6c01296930383b4c7abbc6ad920a5baba5e7c4b202b7e0fe892aae5a5f1ea72ee7c151b8eef6119a26fb4095d6488294cfba53eca2f0e3e210f6246ec220213e3b3991fe0addacd744243d353181f9ce46e90fe0533700b9fecfb17d7081bf244eb112c2ebb5b50bbc7fe4160c7c6761f0bb1f167e52df8c3afe7d11d10928e70a71fb8cf946d33e76545ebfcd027556b77aac16890a2762accaafb14d80048f55c075e59c58af7959ebd3b8dedbcbb4826cdd69de2780443c7d6fe64cadfd2519e8a8533cb2f0c34f8b6a8aa5cf108338dbdb96e3719439d25ee7363659b9af3d2fbb60411d3f25407d4bbc8ca6eccbc30dcd2502b0084956b43c2c734ce038a9ded794136144a6120a9fd6f92709950a4bdc9ea2ab877cb0c8994d6b4e1bc5453c23761a46a64eae788e61561b0ce8f5dc308a2a2bb7dbc8e2242387271260f993c88ebf940e25fc0f3fe40a4aa0cd6c0af07104f8406d864905352d9e6c10ad29ed6468122334e419dbe77d7c6b4b571b45d997dacb3bd347650bc67dd1de4948bb817f898e824fdc89f21779156a9e58564c4b99004b95226c2ebb8aebd0b5365a6c6ac1f61723a1728e400847322a094c5188fc86a7b6234125728e5ff1d93bf1ad938204fc4ab0bd4260f3a9ace1764e71b6cc06571c920d785550d8469da1a8cd60946038aa519397df00e2dface685323dd12761b1b7f7b0cb9afcd9eaaea8533bbeb1d32dcc1c1425f89bd474a3181f86d392cf5bd928543b3273b1a6ac19c78bc99fd6ba687f419aa27b911ff330bdf79aeea90442c7ec0fe1e6d6bbe123b2b77ed448386fe5a6a7c82b20961ff596f9ede4f59338fd00ae6ffd510f96ec9a29a2f531912775ccb2305289c26e8e31f5961cbdf004f21980a45f298c129f0a4800ad9aacd9583a25a399d28a2a2416515b3d0803eecdbeed48b566199f62877c5fa18a71ccb57866e9a805d599dece7705f0dfb43db7785d22a6119d835d9b2d867c09c84ab50fdfca26298d05e5e0cd5cdc49eb3bd7ce38fbdb300207bacdc33ee41f99998086f60ebb4799b460d4bd27aa4e902e5648e69bfbce2f739ea5a64f81d5cc023d65157c1066e1ef7833ad3001f68b5f5b6ecfcaaff00c0f33ac3f81fd3249cd1535a3decd8e4dfd5583073d8a4ac4160fc95c509fa08122a169f49cfd3ef8422f7c08fa9ac7c5281e4f3217ec51239b99e0f3f472e576f610652e672c02c2a9b4c5ab981d1a31b6fc1c9686d0139135223bfe7fd1c8d3d1a72656ab2f858d49cb95f682018e79f016749b51de99f42dd263e3ba634f80fc8e36d230b1d0436b9d76507fec2c851e95dea942bdea36cbd0df0c6ad18465bfee1d0cbe58e9ca5751ef215687fb3d88a0e3281f160e3d574537df5ac26f6b61ef616a1dccda0c551089d2d079038a75600980b1900ef31958f4c651df17782cb88c5614b6abefad02cac9b56a4c522ffcdb19c0d4f13e59329d2816d08475667226376dbe625da64e3c6fcd04df7ffc9dde5c1489bf085efaba6c723cbe4b5844b575ee8b093d891d672cdfecc3f7256b9caf7458813871d9d4fc2dcbcee04a57c37860c6a7769e96d269b5cd00a4f18d9c7ba9e93eb6daf7723f0f26bb1e84d2d7a78a1645f22de2058c154d9f6caa2c66297ce3fe6ae17b1c9de0f58dec4dde7a6c3624ea987e2888ffc814a739966f831fb2efc93cce8e5a7e67df4c31efa3322e2a989e50d991e42896cb20f2ff7f7ac716b4a814e857b54a6d8d01d7b0488a562f1969028545a071461a127f2b83d3886fdba2da78ffb469baa7b4c5d9f6074a0d4f5496cb6b4441a2a886c863a417c9840bc076c6ade04416d46be3b1d433738ce366f5f32b58ff701e83b4ee0acdf41eed09d01a8abf4149bc3019820b9539747da80545ae65157923122d16dc7d70052885d0bcbedbc91a080a4f92c2b5058cc420af081cf3ea85603a1b2143afa501653c5ff370bc455260026d2b221c3d9d61d8dc869d88e65c7d03645866ecfbda4c376309c8e81bb96b1e5b9353514b6ffbd8720557ae71c52175f1036ebbda57847dc544efe9b517d26801127cdc95ca3b265bce75ecf389f499aa6a82a5aa42b6166eed0d4779343ce848f2c5468576c9cc7d291dcad470a07677d4cb31d361890b454b4988d1d852a516795716813a4cd2c25d78d17c42ca14418b70e7bd7da66331a8cc3624cabca755f15ad4f3e06d3e10b4ad8854c71c7ceed59a4fd05db4261c4abed8d9d321f6eba0f509422ed31a5174e478c2c73eb568fb71f275cb5c5ced7a46f75abb2a9bc2cf513cd6ed266e6ce647272f09d8c795441c57128d460e8c808c1a0e4a7e9dc0c596f517e410404952fb1f045691bb5ffac406116c1944e0a4b9c95d47c604cfccebbc6ddd379ad0002be8a7761198ad639088d8307e04d32ef58daf7ca9d8d62a781a409e4383e937fd088231016666c9a964d1a11c584c6567ec6cafd022bc286696f8f1dd047c419909fb4f092e7472362262869c4734933870fca9e2ea6b0eddb9fd9cad23716428737c97d0f7bea7604bf5a9a5d971fe8fa1c8328836ca240409b7675aeab0e9d2cc6cd2ffc92caf4f66f1d0e017ecee950636126a10c1b104108f1c8d612118be9e33c83daca6d42afbbec4f4088dad7227af102f7f38ff0556eb81ed8fad381570394133a9145c1a92c44d8ab53d824d8c9cf57f8c17542e623460237c3a93fecbe50589c75e9046b46a324a24e2b44ebe6389043d46f9a7bcd37fd630b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f550ffecdba5ce7e156397503c6a836e01257a74ecb6dec2e5683c49787efbd317249a4de7d2840a0ba2d40b774437109082434c7f620304e381a444bd3d3bf23ab6bd4929b244892c56a6e7e2710557770dd400711475604967e9bb737ac1f3eaa7b762f3cd9677e20f8e8a107984bf1f188b254426ac81918b8b323dc04444a178471fe87cd062d73df97673b62b941332f72f7b112ed5565ce72d7e962960f998baf47a58a8b686527621aecf6082ddfd9673888c62d7f26cbc21a874f7d54d99a1752be9860f59ed9300041dda17e9d8f7b5eec0ff06102b48a36de5261e37fb89166f97deb9cc7fdeb63639eeafb145895b307749ec1a293b27115f3aa8232ee05cc7ec3962788997a8979c14d6eed3c9d7d017d9f68ad6f211455bac0fa9a435bcd76f1c85c88b7c5bbaccf319dcf437c0502b25c1ecc51c166c5300c1260bf7baf0990e805705eb440244ffe5263761893319c3baaa74079b18edcf4942c6a4eba5e2760e8e7972f6208c91b5351dc5a6eb6c2a5d6e544313bd746e146a54dba389e3e97ce96691e6780c5f268407d2ae0baac03682f65d14ec9f73cf2746fa86ff05ef57e24dc6998b6ccea5bd862712f65e3bb292cac42308c766b5e41d801a87d0de2c23af8f83dcf656bf3c29215a4deee37e185206a29474bd853b391ab2b6cd6c66080c6b39ef619ddf7a61500874e55dd58e1ca328322ffe99872a19040e63e09219d4d8302516fa9302bf41820dca11755e9b08284461908f72710972f13cf13cd3a954eb308ef3566fa3647b6b1594ca245dc4376db219c367ae7a73f1a104d2cfea7fef74421ea60bbe37493f405e3059c565b9f08a00d1e122daaba24891d05928a79172d8e30e8150487fdce2e46479624b448f61dc27798ea87e658c3ec229d46a95aeabd70c4b0a0673d675bdc30dc5035b8cd202509b326260cdf452349c8e4740aa43610bd35bffe9be6140d8716e2c539b4319d9b0cea6f73e0972843bb6bc46d82827a9b4c69335e73e14116ece04e11d3d992f74a3d4a65844265d81de380cdad2814269ca7eed0384be0a30454b789539f6ce316289f28f3cd40cf975590704cb04826ce8017375ad952f70945e8e95c0c942818b2560554c023f2d0c8dc9f88a37d6289fd97dc041400daa1bcc87915a7708ef7e35744cfa4750771444ba189881aa3762554075c82501374c04181a7f869dc5cc38a2d8e009ed721d1c7c076e789b13d0037008aadab6c2b593a483a87e8dcee5bd708b65c062a89783842774931548596280eb71d7aab6e8f9c17f4dd535456b2271c724015c850408470b6347a54f6f0107a0b582399e46b4d360081130d3bd060b2e83533781f3294925833cc783915d58dade810fe36f436ed84fb91cf46be6c1240c2c8039e5450f088cb8f89f60d618cc655a7a20c333f84a9d434611f833184a3703c3274b0a0d16c862b50d4e19ac27d25524c0c2e51429693638d6d27995039c6f7cb4a4e6d7f2ceb09927c986a76fbe278c6e1ef527074c08819d8b38bbd294c6196c7349d40f1828f1a963ab8ef671380d6317e2c566ae30ace0a2eee149c8ae25d946c1a5de3d426afc9d06b76ea41d445a5e1c53ca1855174a8a0ac9eb909e3e658feca1e29683618bd606d53acf3dbdae422076a402dc5d35d12aca0a950cafabcf097caecc6281e1bf5a5ced4b1fd5f9749d8277064ceb2ce8ad66593e70161684c68ab537762898b94fb2f8b04a29a655c22bd59b1d4dba6131234a057eee3031a240787024e21b44757bdf8723255f765cc72229c3f148bb24854f727fb483560b527afef53ad3f15a1c144851556f46bbe8ff4ad77262671600ec2df8f57a8280253f4c7d8f7d307c18396c5b4660577e05bf66de4d91e5742aa260811d90179f3d27e1147c51923a04b17b9754cd2901a205163eef41b6cd7704d29eb97eb5c70ee745507e0b9732461eee9c1d202be54242c18fe41c7b905a75fca84560cd761edfe1c80105aff360c45dd01be3d0976b1b0127a86c745b599837344e10cf5ae1846ec1a1ca4cdbf96411e9bd92d7a680d04dbcc8cc619d08ce2ad93ff94bb40b771503dce41e8a5450c33f9eb7818128052fb5a1b6a3b3cc9a4ffd9774c33fd12aacd51ecd655d262cea481bcc6ec5c54bff88efb5bb5e398f0f27e12db64ce7017edbe3f0e1d2c34aefa9d13c0fc2fcf755ccff3428fab40ee0dea98ea569b1be037ec8f8e499d05d5bcb4b90d52713b9cae84ccc7cf7e0bc8d886d120124d592e3344a401e10c1b6b722d7756f60cde5b77174e917f433fa3dbb884269fca73296a2c450deb60c097a4721343eee601db3eef4149a6e225aa9fe97ba305fcb1f8630d3c5a71833981dbea557b44e9eb448b746d964d420502ab827c404dca5ac4a6504f917a5cd1529efd07a700fce6bde70e9a217b4d27d687e950a57e1bb8b4bc5b475a0fd3cf327613ef6e2806386ed8258f9238ead24cbc88bf79a0d911f12c98eb5c37d07a48ea94d779c6f12a80e82115908c01508cd1c69064bcebaea27e6d0540fa3b1cbd82e88570e1a4041b9f6af4c3807be7bf4e0a8d10d839d7f03b445bad60fcfbb8c678c1f982070e668468f4d41b3ee00dbcbe7c22ffabd303ea84b74c72fc5f623faa55bfb002908a1f84dc6b6633839da14926453629ec021395dfc5372192e374e70768737dd1aff824762f674217988813531f879b68153fdf9bbfb754db62ed98a19dd3601afb98b288c92854e625f684ca58f9e99066f4cab5e3fb7e81073323e905d993b3998694dbe0b14f366d7504559994fbac1abdbef3d80a85cdfccdf2a8498cfee4af4a34371d081d50988cfbba8a61b9045c1f231f46ed530766436ba510f58af5666df8642837a47ccdc4d1c2d2670cdf52a461ffd7aace77701ef8aa031a1d2de5764a29a846ce0134a3ee3519afda8724d3e05c314be0643fe5007dca05a0d555ed914f463b8129f6b3badb093f0d42fb3408fdfcd77018fe20ebe70cbefc35dd5a349fa920a73a3b7c9e7c48218b59ff5042ace15765d9d35820b0714b1795a6469dde79fc277d2a8500df7e5d3e1457aef42f87d2a9f0e61309a0a3b6db3dd73933d760d8e93aec5649cd54f90cba2cd7884f985023a560dc0d7f47072f7499b95e5104bbd5b9a877e20e71ffdf95a55164d4b9dabb3f693894140844fa84145086130dadd3418771316a7f769eebeba6f2869476590828b106288b7726b36f8513e624b7cb1bb1caa0a923673105255d982dd12fe546c6cecc837ba79a4ad3e06d92f1dfa5904d0d969207d97f2b7cffc090180a47426b174ced7edd3e9067eafddf1b2f49e684bf7beed3d472a41813d1780f1168443d15ef2e3c20facf542a29954baf9f657d6ab6852f61f1ba202133ad614b2e93674f1d0d5f78b64dc1295a7b286690576195b11fc186e5b3bcb24df7b4c082790f4e3f548ced5a54d76df95a5b5c020257c9d384344d34d8164d891eb1794d3c5e98bbc96d88ce2abd806cfa8b99deb0888d847b2ebec771537a4ee9ff7d75257bb7fb35aa50fa179cea1d2361260da71b692cce57e086c69ec1052146d4e47c8e33655feb4ec7659c31729d840a762f39e5334359bb591e1dab148e30878089c1926311d7881b5ae4dfd52f9e4d00920a8a02a3d95729c3f8bfe4f8639d33933a5e5c111608e0409d7bada354f89516b5dfffb582bddcfb5885dd27871ee3e4211eb82851d6fc5dee8e62bf50111c05636d9343f9f45c0f658667e345137ac29f5bde1e30f859fa009f5c4c3aa37ca53bba2613e9048f474649ebf34583df76dc9c38bb5a78dd5efb360211b9b39f3f665021eff8f65fea2457cf202e76fa48ff692dc7785d72d306dcbed8764b6c1a0bb7ea9dced1b34226367d32a8f4b37f304a250931b0ff9f4917f7671972cb805375ebe5149d729575705bf15d06f26599c8884a2e786b0bed7216874931a4b766148b917262862c388dd324f2b39f405f6abf5216bda05f1a728100ae8fdf086b1c31678f29d64f98134c951204a259adb930e9928885e3f7a1a19af19465bb8a13473114f94a45bd8c2e0a63ffe3f8a93c44d74ae002dfad86de1dba481c18ed8334b5a8dbca58ce7fe04c8dae4b657b7b63e3e5cdff9a63a9a150b0b4ed67b9f360bcf4d63ecef375cc233919c0e74cfef6d70c57645d429350fc7cdfc0ef19ec330da0f28ef056f559560f472bc7444e63796687197072cb55e9c6d17ef933f515725337a3061c87efafb640754e8af214929c64071b1ad916df35930dcd2f966eb1b5ae635870b3f6f4d70c84c147726fe955f614a66346fda6712c57b33657a6936f5eb72d7802d6ee19b4426ba257de483a4629587499700523a443f370c125e0295087cf5cfbf865253f9693c427c875f25b2f7a765ad9c6f304b8d4045b53608a8abc844527c221a2b56780d46d9539263e0c5490129faf8853a09f1aad99da3b163c955b0c9de9391e9f7bfbaeac5c7ef5aa2eeb482a898b99e29ddc405d18e4fcf14ac534f286928325cc617477a6a18aef50ae84e21ba3de6613709b08e02c42c2eaac2727c154ebe1bb2d465ddf3804c501024e2f2f792b144cfe4703fbbbf296bf376ba660275fbb9088adc6ceea6c138b0f2f798bb487d48fafcab5313a13570f8f8ad52bb5e69b9299301a3c60c9c134fcae28f8fdfb8e23aaae854951aeec23db0c1eeca388690a8957c2f14223b645f254a43efc8e2a51187add0da7ca3d434477e8699c4d0d407faa24b53783dc0518a755255848906121b72443e56f32b6f2559a6b463e6f7ca4b2a950e7f01abe9731a475ba31a89bececc1b4b2a5b3c60c2d9eba496278061ff6b989fb7258b6967af7f5c9525b46a2a11e28b775a8b9ba885b1e4ec20e2519febd291b117e373e08b76e2eb28fac6a5fa2679ce6f9d826ed395ffd641a23ba531bf9eed67587b6654da990592d136dacb53808018e6b75e4a044fd528546297c3dbe1dc823ee27191f6b98501ec4d313bf64a3cd4fbad2f5f897f79435d78f0189434fef71b6b9aa977fee9e4807c31928b41652250c63a9a91e9230141d136b694f2d54472593a21cac394b9524654859ed0998f6ab50871ba277300962de4144a95ffe8e85de8915b92160ec62e227b8da23a8acddc218b7ea4d9bfbec170b821a8cf52c1cc1e5ec6f50e4340a623eae420d892debe1e2e3c0bd7ad405e7528a6a5c420b33654008966bdf57640c16a4ec6f43631dd46f08ea6fd47bf3769cc66179ec1111f221d1f61d5a3cb8093600a1efdf34bac4478f310ab1d8feeb749dc688fb28008f11af560b5bcb4e81262b2938648a0cd8f0de5d371ad3706f5f77633478374664970a7fe0edec6d9b6f8e4cf0da4c5939f45f369d15548f29e7bcfe226a262c9a3b4a3a4215875f7f9890d2c04962ea0edb7983e5ad43a54293d560fdd9ddfa5985d74ddadd846a562998824fbab307802b930eb6e788f8e1eb28516bce43f8c8fe1a804f4ccbd748ab1025463429f7b76e179db9cd0bd02f781e99144f426e102d799d496a45ee7ca55f834cc0ab04da2b6cf99566b57754c120ffa267c1a3589a5d6a7240d8f61b9fed640a65227411ebfaeaf3ba6c34774f944cba1ba9e0c9ce2fb16fd56d394c212290272b7490863529387bd2194ec0a8e3480675e06d8b505538eb32edfd38b466ce4c1a8aa05e9161aad4b5a50e585676bb2e7c4f92c5a839c88c5d3e8b06df21e8213b4cecc4870a09a76bf6bc67e1b46dda38de97a05f4128fa604a2bdf2bbba44d95a2bbdea08c1d9bfdf6a014cf0426b1b276c343fcd722de43f724eb1f9ccb79307557d4634fae59728b0188aad0ad5bf1fd5fd607627ce00c2fc051432c254c15ab06cf59bc8488d29f29ebf97fcb81fd5db383094affa7c5d9453a1fd4796f4b2e11f7083966d126195e64457948cbdf7c077089f673dc75ddfccd3cfa9189dae4c073fa2f1edc75e1e91b1525ece09e44a3c50fd0a02625232d3321083343cbb75a6cb7077250c7df1239f1ed7e69429bceab233f4d2edc92209356642845258e2909c5272bd624fb20e66138c80dd46bd24a4eab449ca2141c1664783736f0507373aef91115951d5d49ee6f90755b9bf5c9177c4b177f906be4d2aa2abf35e781d1fae3ebb6212d0f8b1ff89f48df138050071b2b477cef53242864c887fb3a9b4c2f4f8360d1137fd37d3cbd2f69bbbb09a4eeacd5a0171dffef0dd8374a31080cd7a49fbcacb7f54a8fa3b1d2ff7bed1a795e9569f4f1109cae0c23762ab41238794a0871ba01b818dd9645d8ac3b5fab0bd4b0aa7e657624edcb71eda4abfff89ea9862803da1264ef7b3fea75e35ae5e4b6c341485c95be34b18943bffe1876cd29e089902849564ebb68af645b24ef8b6d97d55abcb7930c2635218496a5d78e32e03b68d5a61881bf88d0808b05f28862f40fba6f22cafc923b2ff959ee46692c4ce793c771cf10ee67f4d15b471664fca197725b1e8c8d5e641428303ae9e77fed341ae8f2a684afccc460b43182a6a268148a6af50145f078791903d3e88f938bcb041e71c3636c81e7347c0a5fd6be0f2f0883ed50afb13f05d3bbff6cead0ee535953354e388c4c06559d1bd47cb75f8ff68d50a2500981615e3e079d7e9fdd75216e87708877f6c9ccfdac0a21f520dc5b72641eb2610534c27633a2d66621d96557af50dd9447d7a08604294ce01ac0401972ed5c1f9427074acaa4778e82262df6f518be4d06d9d91e6d5886e014e1ac6ac136d6adf6e236a116caeb80c8057f33a0edb409fd7680af2dbf565dd8e7a74d9b22a971f30c57655d3db9a3bb1d65f6faf94631f2579c208d8744bf2c7b3aaa46d95cd5524d707de824695e2317e6274964fc2bae243559d5d8d86ed9456b690b82773fdd4f8bd1ffa8831bc79a0aaed6565e60f98454424dd99bd2a7ec4472324582195ab7af49e9f19041704fda73e9f6f5389a1fffc33db314535d19cdad034b06ca9230e5cdf0261838e6dd5d5eca6c481c5b9e41c4ec8dcc5ac5730d03c6bc8bba4d6034455a6fa167f1ee9c58c0e1df7202a91f2da390494da5a30c5ac2c0975153efa49970f5b53859279d47147d43a358e7a3e6aae41596c650d29c407db4f76b863db17ae0db12e5326a150f67fb182501d4d749b0b89bf02368af881e69145fcd0875c0589c5d5fb70ba8f6c88f38319ebae9c81cb8c6eac3d57de2c93e10f56b0cce89847e828d5d86ea14c7886a43675e026e529f7e7eda21ec96a7bc53f60951a21f8c0be737cde5c1b08d6d182504c70b8477f42a720d55e6ebdf6a45294ee0dbc899cbf527af30171141c6a99d1cfded52b640348f0677522a99d14f58e3c05fcdd3451424aa6dd3800c1c857457098e20350a039d6d92179cff77d7496ff918766101adf566a6dd4516f514725ff2d8361cdaff64e9ab1f8636e647c59b94ec0a6b8726638ce21da886dcbd5ed9c0b2db943890ab23cc513369a605940f98c5d31b60e936c42a7bf18456eb01707c0359c5ad1e3cc3fc95eabe3d7b7e720d8a1797135c36b585df673aed0324ca2db5f6d6c011dd7044d3f25d350f4b6cfc231f0728e92a08fb3153ce286e8d8fdbaffbeffad157d2aaf3946f162bc2a76c77339427f7dc649459fd688f9405688ed9b03ae2c6729239de181c6636adc865709a MD = b0181daadc927c25b4a8b4f634aea80911d31181a379d3d4689f164e073fff0f268f518ad3e131122439edf25c53bcd9 Len = 74680 Msg = d91a18cec8f9bb63d2bd0501bfe310b08556a4635e38f3d71ee087bec41f781d4fc8e2f3d36f961bcb701073b134aa3eccaf0fc74a2df1488e4fff09cb5011ccd28da669284591b65c9defa997e75cc1752367a113c643ff6abbbfbcdba877540a724c79f00313fb2c4b8aeb9a84900027bb9539e48c4fc4592dae1f1bae137da17ebd6b533283b3e482c981e294adc48b7e81d7e3067e6103abb67ab4ea4b0f3cbadf8778594ba62b4a94b2969f1bd5497413c338bc389c1140be14cde488d1862c9b158800d29caaacd3c8df2b41fb08a534440c36e63f2bf1af368f25338c24deda5caaaf805d09af6e09e4c289fe701acaa487fdee10f8c86f282234b208c1d882a507efbdb0ef5c4dbeceeb5aa52adabe29d098bad821cce732ad996f0d03207c38c647f15f04b9592ec42f1cb9deedf91c108fb05e4d05ff9c58ddd06392c0b15d11408430f1d178a3ef143803335c62c56e6b3a6c257ca0ad4d873fd117c0085c0d60dfec5ea9936376241448d22ee06b13b2bfc85138b0aeb11f23213a26687ce432685bf24b93b782e71953636b5d5726efa73b784118e7af2de419a2fcbb06be3b884456be5ee73be4afeb8d1bc0d2d0a7598d42a0c1a06c3aea82f84ae842c205a770320ade3bc8a33fd7f847f12239643f86595c922113cd9c23e316d77819172ea82d38f9fb52ac2fe04df7d78f88adc0ee627d72b1ca6f64c60c6a70f0eaf983b2ef4e996e0088e9ce34315c63e60b448c080c4b9ab9a7a9311a4d9bf15e3410562157a5ddfbbed36954ff67e47a053329f01004220afdd42db6c840c59d4f3c5e6b5805906ad657785668e15c6d23f68dc5918592e2f94b8288e147b2ced26e90745ba1cf7658dcc5e175b011e6edf3802d98b6326c2477f837a298011a4510b6e56761e247cdca169e2cbd4c0eec93cad02b7f49cd05c0576c131bfaa831899665852d1004bd88343597f0540ca73e325855c82130258f66ce3bb9e4a11e41f99dbceda3d6ae80e74dbe317309a65d826a1b7900bb0a4aee062258092c92a0a6341489e1e42a19f68ea769ef2d725680b1877a2f963e5bb7bbd0e1af72170e67d395e91357b8bb2ba25c7e119f9293f5d2a0b3f6ea492889964e3d1f9a34f3022248f58056e1ce4c2ee55a21888e7aa8786e0c9cdfb11b2c3fa352a1cd72b740c83496720a2bba22dd48e3670fef756349fa6e6b9c009a675dd70a7c3357c2e96e61b22f9a20e875548f032a5d3cebeced4bbfa94abd0f0498f34cfaf36d7cc5bbd832002f48be0d3ec2a1b499fd440c0d69e99f1071e1c99afdff61363c4e9b58a0ff2df12aa5b141e7a54becbbe78b515dd29517a3787f08000dfa234b9e35ecc1fffe074e062b0508f6387efc3e31602e64d286db3cee8d015d0de322d55920441cbb9a3c4741332c7ec3764bb0c6e3e485a086a295ddcf0ad7e29d495cd09c303dabd17dd2bc735c2433fd2da51181881f453f7eeb15762263c07a499962078d4a17d5980d636c9fd0d23a2c85dbe321190ad8faa65f2b52e9f1a2a8f6d60a642a47cd156200c7fd6ae656cfb9ecb0b75b377a9b2e8196a151bb3cf1daf64cbcc783e27d38592b7edbb8789ea70c9153cd144cebeb435e17836770a9ad88769d08133c56f638412b0990c922b8032efb57e97771466f2bbc683c685ad6552f0fd53e022b0663b10bddb671e254982ebae1fd22b5a5cba799e684498bbf25201b164e5d81cfa222263f719767e4953a9553997640712178b5e6853ec5cfc0f0c8b38974e2b9bf3d85180a6337cec0f99695059b991337461851896c8f6eed481f953870d52c80a92f4ec9fedc7ce114c48f89b848f1d5bacb0dd6fe710476d026a2a278e390af0e2ccbf690de54c232272a6df5d675c57bd504b41af3f9212fe7c311b5924d12168575d940c3c02afcc84cf87bca06ce323e1c6de99eb6b70e6ae1cb4e6dcb72674136ba371527e019aede7372ac0bb7870f3f4892f9a1ff14b5e2196cf97396a968f5e09d5bf1ad32e1c9260205ee49214f548c3d8d23c3ead2b04337c0ab4885039a94991e8559ef6af359515b164ca906438214e0a5c937c93191d649dc4ea2190c1e53e54dacf75046548a39eb88c63cf4723c7c8ddaa4a04f4b721c6f71aab235c6f438b06ef39ba95ed324d5c421fa4ea3e0e944bed961f0b832c2ca7942d6fcd4a49f16668a5403c154a63cca62473b5f26ad333d7d14fe213fc2572e148e498f8aa3e75d65823ec337468860302ca3ec3652c11f38bf60cec0a47d58c8e10440cfcb8c1b2c2d41ada18d214f33b06c933960552bb46cfe07def1a3be06d8162f9aa06b68865df4c7bc01705e14db7f9c575d592a9622c014c1303329757a65a414a9ed0c1b1b3f58b02cdb577bb5c44fb7d334e589ea8e3c90e99461bdcfdae7656e7ace946e0aaaa596cb000f4723f482494e2133cb50c974a42e2e87df5d3fb4777b77995f3d03c2c5a923799885d2df480fa93ccdee0194ea69587bb3d7f6294d56cfd1f5c0ac2f43db8661b0d032f757df444df8502d1942ada640522e52ee77759ee5387bed1598cbf26d98ee5cf2fe26b90e555f942a3562e17fc44c9c287d3eac7c30570d9c4adf2e4857c598f7c54cd126eb0180f04af0d1df12171b02e81bc13fe63a56ebe3810498f53f2e2e35b9543ec21f379209bf3e09437919a23e73a4d6610e0e2beb183a067b4365c0d5d50afde3a20239fa37f0a45f59dc300aae1ee8a9b97e83e80c9939f0b887d52d09ba0c5570290da6c1ae596f9eadd5d133f71dc725ee1c64c4e9da5c88da94c6bb2e122073f43594c342d07932d4b81d6cf71fc238a51de6aaf290c89aa72627552cb84d91abda4ca772b088fc990375c0e593a2dcedaff7257b043bd635b3d83d7da6e3b4952357d307a1a1e444db62978b2470f80cfa1e9d4eddbd24ce6262dde983eac3fb393cb1c94dced21c6a6b5aaf7833734b25e37a31c4566cb85b4c9b37f76ba6254383a77f5916ae6ad8186f1a37f337f259ce25ed610f963cc71ee131ac6c455b6ab51ff3708260764df13f940ab82b49bd68044a5bef8aa2ce61169d47f888e5d65980eb3818d188f07f32e5998b37987a38800f5bfe3132979ca1447314570aaef7323059e2e7e8e949b1d48b734326b7c60206084571344b57eceed6ca9a141b179d8a7ce88bde61d7222a8879373c9d9bf0f50bcb33ef111b5e6218213949444229c04931a6b180b2eeaf3aa4fb22543eb3a50b9960ac126e5f6ae2221cf252ff3e9c67c51eaa6d617e2b46fc78200337b4deb1b5deb375db57ccdcd32b566cd744e47facdd11516c39665789947ed20f5a67a529974c63e7ae51ad3e4fbfbb51a36138eec92e535c862713543883ea4d0c0a8efd71bf041ccdc1fd6b6e7366f5c3db3b94cc489cb8cf3822644d787379348d143756537f011ae4766071bb964b0c1a2fa6cda853087b5f2dc1b9a5941c39b9e0e12d51fd1efe82be2741df73dce7e5bd2ab397a1d5f265dc74665276bd83569a02de01a5fce2627dc8c427242fba058d2a685baea59b12d6843ac741e47a2ceaa350aba0222c4d5c49e4dbd2ccee4346add33ca103e02dc4f91f4b1c19860276cb6d971518460b02b48842a43cec6590bcdc84a27428804ddcfc282fe50fa2e9821c0d2d679664191098a5c3061b33155e6b79db82dcd11a34b8a4a3cf7dd2e9d04554109686204666fb4c56b2e2777a9b686571b462e9d2093d08a060385b1ebed0b5e52d7c0633bd9b7f86c9abf76a7bbb8e8f9223901e63729c4d1ea8053253a678d4b5e2df881d5f867bd2dd7c8b074d3d5ba5878da64b3fa7d3933597ca98ade507b51f73ec8f2fa85c55dfce854604b9fd74f7aa11c88c735a4748db9193ce43a3b59b8a0819f32f51da1bb50141c94c9e88d9ad08e3414609c147972c4ef2dcd33dbeec84c6936184eaf8f9a7fe853c6667965f32a3476908899c9446d1fff6bdd6f060079bf8871a0cde611e871ed27c9b9788381084248027ad9a8522dfda890799b039a208e83ec935b70fe47e5609ac43f0c132e1be9923e471914b78d0605921a2c4e2acce16a866c1211b8b103420015e761246817a06a8e01354b41f6a53f0ff4d63cd7fca31d748fd362f4726813b9cfeb79cb34c5860b0b3437911ce7d6e8e7f2e514483ecf1134a3c5045065658700329c99d369f76a91822b1ecb55f0419ff4a226569621cecb136d850fd28c0a32a71b78761655193ebf843f94682186678bf262aa31ac199da2baeb1337edafd1d964cb8f4315936d3ce1780aa6d143f909647db5a9c46e36c23bab0cfe0104584a0727a188cf65a79ab15c908a85e6aefd66bbfb57115921027e494fad6c94506981013f5fd90c68497251b89bc60af3e877c1fdd20946e6d3d14a7dbe96ec34c850eccb20c8f439d9b2fc0553080d825b16143f9312d3e2c70322f9ba06588fe6f53ed78415b996cbd1bfe938c28ab4b5d0273322d47ccf4c526756184175cc35ec9be6e255c909807d11e6b59bff2599347f7b09b49de6e46d8c1561cec06435b5787bd3ffbefca813967061dad73f65918169a039d3d41fa315ba1f04d50276de58f8c179e80a9323c238c6359f7cbb95d1a18edaab116e9178a6c88a000179d5c1f0436af09de22c09825b02d4580bafe4954e2d802951c7397dc6d4edfbaf2a27f4d2394531059ae10f78e9027bc64e3ec73698ff7659a2eca1b26c0b5b974a0f78e66b726e8e0efd12d84ea6327c0f54aa00b37592f6b2e6b513b5d4abb2b3ecfef887e4a0ebe6923ed1ba4c26ad51aad014f38f09a985dc2a5348c656920654e9910538629fb06505fd9240c2dac3b5bbebdfb844f28a217409ab7d06b5afbbdb4869da3e1a0ad9fad49d309174b419d00dde6ddf523e4b14af5455168e1e9646773c36ae0b34657fcf01980d1bc12bbef3862c235920dd9eacb9eb109be188bdb5e2fa0cb3fb8c177585f3b030798fdb255d8fdb77c04d748a62ab7f5f86f7a38cf48104d49ed2543080b005432b9ab72bcae5422e9b1f38d0d502dd497d578a54e76810cdbcccb8b8887986c475f0c56f64e901fe1fc75e1897bd950a434cf4a6421bab0fc3dfa756139cbf44d7169878a1e79556dcda46ba110850f2573c55098b184e2b528fb291a8b60944dd70a2c0088d66d940cc954dd78f7b9257aa3df738ea74a0d7517d03be421f34e79376ee1f2710e5fa12cc3c51bf8f7a931b11e7c21eb8f0c0d93924cabd4ba583f3875b4c610e1d47415e1e2614f71bb8036363bd01859bad6ba96d64a429073115468016b7c8dfe6eccd6bbb3c6ce624f7c4f3804f55220b9d3056128331ea8d7d56f51497dbbe27598c9d87723b6a786c98ffc264b20459e250673ad6f0cfe7901b42ac8da138a72c3e2c2172fd3900d66210e9ce26b316ef9c29641bd017edf215c17505d3cfd4e934b00f9b2ca28cc9b2bf6d082dced0f9761514ce6a52ff17c929d49ccdf43ef51291a87744674abafd63d28f31a806b470a2c36b3a119985c7c461bf0a3653f44a799273ced7e93ec496a0efccef26951e5b067e99d44ba0742992e91316a25b6ea0443d3674d6a98ad05e967a04cf0fc1b64485340b940c60d1eeb77305a88ed1de342025de91afc299621fa3795ea92d4d13fb8337f13e1055eb869493d523266bf8c8f775b8960e6a61e7e3cd53e59377db5df1e9e19a051e0fe30241c6acded1e89425caaa10b0bbc47ba5614d49a6df21391a71f3c4b1a2c269468feb806db8ba1e5b5de4847c16106782e5b949c9db8bf967909632987cb965dbeec2425588b3c3e2900685a301cc27e6cb166a9f05523b63a647683c144b853cded96718ba8c2176116e88d7f75e495b71f32078e53a5b993385ca1ef1ff33e3e09f6339d699b36042bb028d7f4d285b7ace0ff9e3aaf662b8effcb3ae5aee5b8482cb4b6562f63bb44a8735f22f516156058d94990a886ab6d4649ca1d5311e4b32039fcf8e6682e6bb8b64086b510794382ddb6dff8e1bade1962c64f498a6951bb0d9ad6290c04a7c838a1a97b3a8a5e46530eae063f01e860605604f818f12be377b6795e16e601c042ab11ad5df1b88d8278863c6827930389a4c2c883214781be7967ef4f7b7f881c8548b54156593db31dee0123d5e7eb26d5142192a3af7e2b0a2a427f6c2c080e59d6f9ae5f4a402e246ebd3ab3edfe7e147f6b0f1f6bc006914ac16e600d29604c41e36cb7927c3bb68ed97368ac25db878d0ec03c813197384dd2e3002cd1598813d9420439db22fbd7bb979d2c498356c5726da3fbb82525bddfa7f490e94235d345faef48442a1ad0cc6ef97650bfaaafffe0fce03cfa80214f83e3415a637a0a8e5a1fc69e9c3c0274bf259124d7abd41ee0ee39a75c72028a3c75480a04803f1c2b3dbbd3c088f31c54c885ab1380bb3534210de09423e7f89d53ace36d6ffa5734f030cade272d2af38b5bcfbb52edaea53e64cfe9ba58016d2575cce66ec4a73fe12b6b3e40380865161a761648f0effbed475ca55fdd0d7392abacb6a5237412b7b79e28fc9a1c7110ca8a6d8b4e62fed5bc6f0e3cff847843576d263da126771bd94be383ddd0e12274f208428e6d759fcef06e7645ce44e081f67e5ec62533b59b5ab8fc888b7cf31f962f96397a2af282c70b3838539f102f2f062f19d9112c04b3ef8f24b4092cd35e2aafd6f0e377e2dc2ea85e7b517b6b0005d922abd8291c3fd06638b55174983240b4ed3769d6f5171eee42af21ca3c51c58369014f53ece4a2a64cf51c7477fabbcd07b784b6c36125336955d9a5ab0a8c56774440537b8baf7ae9dc31d3779ee124abd7fbbf55a0899f5dd73fb3be13a37ad3dd71d0d21d3d0896d25a3aa106fbde6102989ab2be9359a59b1c9d7f5452160532aa73f7809578db3f5d51fb1b5026b19d21efe2a18b8ac90b370af6b6e05396adb5e4f49efff3408b03bf90c32a2224115f65ee33b959518d5aa32a1f97580db559cad15dc2a14e1e142d65e7cffa41c61aa5dd5a64efc68b4b102378bd4ef2b15dcd94a728a98c615842847088d790241a57b700d673b06cd3f8e9aa9b5cce0b8a964763773382ba97a7f4449de19a942622850c550e9598ba04859c79ab272aa8cdf179f869b9929803bd4d563fe67c08ae4e662ae8ff77c8dbfe359f6288767f1a9bd0f371b85224ffe871fb1afd4586a41af69d287571c5255c5f54aa7657d6234c52b073076003437b9ad399655869acf1a4f5f780ee788ca701e1ab7b3576930ce676982f26fd7681af27e5a81b786ddc587c7ca756aab6e8028e8c1e782810e3748f07b70ad940ff983f254df87d90e2fa78e07211234b274ca376e888b242dae541e92776614bff3d6382dd563ebc0c72324a6987abf46ac668905fcedcd3f81fd56608d15b3c8886db24df9d859a61a8f2e315200a59bb5825030db07068460b93a5e18390bea35bee32db3418d2e98400d2fd45072121ea21f67a9734acca91c2cf3af4c87757a4e6d45a85bf0bacefa340a95c6cf4a564a5922cecf2448e9aab0b9b8ccb0fac490934e3f744edb3cf2455a2cfff7c4daef9fead1570db9a0c97828db3602faa32a077fef26e22050ecb386f04895e23b16563857c7717f4d1cc5c97d1517f5a47f2c833de044faa92e0129865d1452f5331e93a87cea0a6cf93c0424e64a6c371494d0b24cf1fab45ab0aa658a1d7787da4b756a03f1fb8f033d61592624ded96eb2e0d2a97370f0d74492047bfbc061807f6612e903c301af6c79805121be19f2194c2592342ded482f78e99f49de10aa2cde1998a9e183722bb530f3eb9a67533a7b0193de620811e3b78b60822123dbd656048f5ee772e00d9cf19acce44fe698e61d3abcbdefc903d6706c3f2a097a0e665a599d356e7d84a93892503c4240b725ded369a202d2026e3f1edb69302937779173df6bc4af23627c971002dce607a2ad1a6fbecfc161e72df4d15f365dd402306abfeb13f95c4143f586c87e4b1cf52e5c3954c51b94c9e38acb8c9a7c76aebdaa9943eae0a1ce155a2efdb4d46985d935511471452d9ee64d2461cb2991d59fc0060697f9a671672163230f367fed1422316e52d29eceacb8768f56d9b80f6d278093c9a8acd3cfd7edd8ebd5c293859f64d2f8486ae1bd593c65bc014bc49c5d838bfe72575da60a098fd936c401942965e2c01b14708ebbd0756934ef8da3eea94f94fb28878024409865de16bfd64cbf0e58df1de3a73ced4eece8f5d32a374c6f2b8782d9e4b34db300301d46b275dab600e909b37d78fd42c5a2013d85d3f75b20cc08dd5a337b4046e15a0ebf31339a76ed4a7897dc5b0171d494154d5134a4231d2cfa472143d088464fa0530b63fc293062ab7cf3b0fb80051102f72b7eda911f61d9420941d462e380842460e68b7676d4b4a33b89a15eb82a7f09bf505ef92749c2c157ffcc655d7f2299ee35990d05333c91303f938c7222f1fba933a1d9e9376f4ba9d848fdf8ae1439efdbd55b8fe0abcd6e5d3297a7acf45365a36391c9dd37475b55ba8b699fd16af243a0c06b7f7ace426d0eeeed2b0e977129e4ef3d8da35af91291cc04c6d2c3a1f78bfa2c62220a58e99910972f993e5831d610d8db4bed1f797f0e7eb5a0da5b720757373b4a081e4d61ab5a1d3cbe874597c5103889741b04c2e11bdeb3f59b4da376306d5b4e0f22e8fd9a8661ae8affaa6a7847f496984f1de280b494cbfde4d0c59c6ace52a7e4afa5dcfd9074dfaa9e8f756c15bb03a2e06131d9bbc3efc22fc3efd62bac751d262285e541b7f1e0e4929c275557d9caab0ba3b0a153dd8010ff8f11ebc1f336dd0249d01dce6e3d0d12610c4c03a700ee305adbee12638904e70ea09719aecc34b38d406d4ea109788d488d5224e7f01a8dcbadea760e57ac08e324b63a1437ddb4c4a8b8bf46f0d771c72d10621912c0627ac92f053a7656d3b100b1a9a0143884948b9886ac6d8a5e615dff11b6e3705cec904436745fa5e5dcb711defeebc5b1516b753b6dea01a1bba286da4ddc9adb95a59280489e09addaca7f406d2915b99fcae743e7f0edfa1a9d30124a78a07d1a6bc279239bf29a4fbd22749756a91bd42c6736c70c9fb622a09360394241afcf753c9791e411499001d3e1e9fed036a2f26d9a77b7a764585f292a96c3cee2393469521000c62a302aec2ef17c5bb860cf72e5666c9593101b59f7ef77d8c2fc3be14f3a7c81bac4bad3b23a698c1fa2160f8e3fa5dab10e77be5ebfd8cfb06cfe3cc55da1e489b21432f22140f1bafb68ac1b5ffdf74c97f6beb5645144392ffdc47b063b5f058cd98285429d1d38c139d10343df6bc4411ae392898bb6db99bd20d6d08371bca96d3ad21ac87f17880c06ec87c4b8c69e56b57cabe298065eaeca4f29249d1dbc61c47f167d87b5d441b62d98386eb2043cbcea27f07847d355396a9c8951b72a49d7c2c206d7b22a8d774cf1b4ee25172f6241aa3fd82e9c42e6bf874c30077777bd73aa0edf8aff41c2c120c4b78e4bb13e499f1b28091dfa6a9495c7b89d388e1dd83af01fbec7011130a1e26b5c1664a938632cf895dcee3da034964bd6c1ff5187014518bc163dfb0201887a1d0bbc5bb4b2efba235d80c858e0426a42b83df0f679984b01617ad8bbac41545fa01a9e34faddfd50147493352526a46f8fec84ad1044272d3d2a42d42e879a825822194fa772329a961c46bb7fed8acbcd6d852171e35dae0ddec1d1e4d5bd23a845255b4536ea7156fa2b525ce17dd5d5436ae9faf03ef2580ace3b8bb61cc225067aee50b68552db80e99048cd0e1c5c00be6d37f54ba8a020d0876fa369dc32e8627f565ba3dda862ea0bcfeaac1da627e831a55d141f8ad3613c2d1804d0765d8494d2a0c67021f2a51b5ed4e848681b80cdbfb218e55c74f8c0309e8e5d53f849b532205d98ecc2b3557206332b067e0098037eda98b9982fca06a156c1402b2a670144e9d67d559d20b6192d4405a1f0270d2dd98806bf5ea03bcb0eaaef78cf00cc98fbb7382dbb3377683701da39d80139498651e85d0de93c760688a663703900a6f399c1bda5d4528dd11318a810ad144c7184b2e3c60b853ceec9097de67629d9621c9e77d5a9b3f48bc6356f42912ac11b7f1af61f9da27a181a8d1a7a2ec4aad7be22fed30a3836e7b9b511d643e921f4cf7506630610c822cba5eba3e95db5c4dce3b516ac3bcf455c1c12543bdbf98de4559738eb6ca19f7ae8440c3c4164aa17753d28d65b18553beef334ef7fb2576c312b29a3f290de96c8c61b7e3c5207ec4bf9823f02bc77b7823700e550d6e1b59c349dc65f1070addbe44a459ae85ed9dc6cab4ccf262d7d8a5030a3dbf1ad5efb360dc90e9ae63e76112118e9a22f4eab290c660ceff6fc6bc15ca18d7d2ac6d2b202329daabfb73bff287ea509f9e93c913e3168746492bb1ced74f1e3da9bb73b038968ca5db6a1e0d8dd59aa3f081547b9255e4de6fedcc55b8485c04d3c1d339a341c74509b2c78babb73ed6f49a9af05c86ae70e9f655d3f56d59ce336893e3ed9053338f35029369f805e1b1c7e599c70fada3bd2c946f1725dc44cf96fad59dedf71675d9164d5000b76c2ff17b9e5d59a920f579d152a5d7af0eb13451383bbf7c96c1884de2e7371c1e77fea528a6cc6a8e99c453a327ed98d3e12be0334f6eab5c7d29ed7ab606fba090d8ab5f29d0b796aff5638b26ce603b6561efef62624a10b0a43f3c46d31e998265d56a6ece5ae041f3493229e2cff047c0c694fb02215a63e18b511e074bb2568f6b71fd2c191356a84dbfb891ac978f2fad49a3b8fae09dc719e1c70b4b93133cb49e5f54bdd7f7fbb75b5b43c1db4395eb36e1ec9b4d66403013c746e6e3c156f9171bac0ed62bd4ce2d9b60d4616ddcc9843d04cd47c634190fa81fe34b69c48204b99ed3b5fa1bdb5eff50aed414eb8f5b3f695876c6891dfef1000c72116e978ec191d61f6cb82615107b17da41aa85e2708304846d2882082b502701c43c80ddbcedddba8a94f77b544ad61bfb01f24257ba9916c4f99054dd76fd9f871684183219b12e5b9596b85523b5414ad820a27d77ded7d1e4910b8fdc56f564e4ed67a97f1a24e7a44af39b6f7af13617552b68209c6c9ed2cb54cae9faaa628e01f3ab86df4437aa5d54ac97eed5c8a6da05a21f9b8033a987581405b06789fc09e4bf96ca35528d15041201d995076df757b3daa3b996530d3ef89841d4e2174c626e17a1a04037bb2b551703d9fc55f34921bb7cbfd1b6a52ffb0a769874c514943e712d2c0a8e96f0fb403348ad4418057628ed3becbc9753a7c4155c48efa7a2b90d3682b77cf07c8ee3338a2423acb0398bc0d5ed4c2ad1832ce6c7647e4eb5675184494fe80ff7966ac94869dbf875f34bbb34de4da8d217abb382d25851f5cfa6de2adbb93c88993cbe2a8252447a2bd0a701c6a9577decaa42349a67f88979750dcd62d9bf5721c1d9d77972d8e769824be3ae4780fb898f5c86c2918b99ed24dad9ec2fe08db561e4f85622fbe536c971839d0f6a7376c3c92054c0514fb41d0af782a3e752de84a5341f49f69c180ddf889be95f0e3caf51a957db93d155c668ce2a1d1bcd2292e634ded1113399b65e9bb1bda5f462babccad4ca99475889bb07ee85c6270cf36d9f9aa194d2412cb664e573854c704bd12ad275abda46cdca49d6c32e87210f021e5ca1c7a397d7af8a41f3473eefcc597259c411b1a5f95e3de9c09b16eb4f6f592bb9f2cb232011b6cd2533f466a41d49729f12f600773f8a2f6257fcf1197bf70fd15c756d6da38f90f291935d3be25823eef8cedcae35d9b092a960bbd6eda110d14ec7fe272ebe9240a8465cf9734676990963c30608d27539d86ad2ef8efe37a110e95db77aeadbf9c133ec4697bc73888edd3ce77f1c853d2d44bdca26b78b2aea0412834fbc74032482948a156221a3ce64d0b96460e888f01304d17d7314522440a6f575dc6448195cdd2db6df88d3131e05e47d45a7006902306b5adbdb0205c4a074b3f1b3aee8e94e9742dcb0fea33666d09374c98fdf36c8ff8696e723d6b98867d3a3691fd8506f308100a20dc7d278e66d94561c9cda54f7ca4d419be046e7389b9c8f8232bac8613af465e9c71bc58cd54e578ee6145cbaeca8ef546894434ed4812dbe3f4ee290375f0178eb38d42b914ad3cf060c69b0b44efb34b9cb271146fd49bd443544273eea7fa47b512d2c6a2fd2c644ec0241ece86c251a1218e9b8b6ed668c96768c183de654be9059f528a65c5be7d9b0d55a1d4b0ed291a03ef35420a15e9a01298dff3e70fd1bdff093567a7639fdfad4c8969fd62a714678c080eb5601686c6464d88fdf801a478472e833ff808068a6fcfb70676ada92ffe5e2546dbe2a3fa76772e28b8fb61a188f0390de058a82b3bef3c7a8daf30d3c2a2166cfdd0503595c723e5b7216de16b05097fc1041d164d826ab81c1e53e9559e52662a6233fe10c83ac3770641ee59e76523fe8d0dc1f103d24da69d7ae7338d89e0f60ac7ba93f4b3307d3c55fed211ec990d75d2b4d30e03a9b18f2e33f91a0d5bf55c83f18bc72dbb3e1632b9600f003d823114757feb6f6ad175e675f2ae5d358cb9d14964da1ac24e3660948059308fd1513b7a343685ff6ae42c23dcb50a1c30b56818bb880af4020f6826bf6b0e0e9f58c039bc69d7d5f24c67a3f3e8846e95d190f5fc6b6ebf0e2391d679cee94820ba3b4a651fe59d0c31419cf4a36cab1080e447b3fec681d6f5a62a4bff62ab29e81512baa33fa32d1512754b6023602565fab45ebc92fad117fd98b276fad5ff84d62949ae3696b97a82a364b9391c68d31c92692f6478a0dd10b829b0222735f307048e9b6ac655d3facdcd192e3e4f6af2887fb1ab89aae777ff2e55793d51c5202af5f56cd066b3e34b010a63444d9fe4fceefde8bc73b99bd44cb15076d77daa031c468d33808ce4b19cf788dce7e49c66536eac7f7fb614ede16e58723b7f0d236df97c7e27d17777fd8b0f56a2cb616b298e5741437f5b92a8e6e1adf26be21267988b0ec1340434af1f575002d6dc61fdd779b05387d868efa59c8890a6914695ae6963d0f7134e3e3ef1478c7975e12cc4943b243223e74234d9909ac1c3467 MD = cca52ac605ab74649fd6c6bc13da780e913bf742ca25fdf24b0092170ec4909514027d8dc1e3036105219fd5a2f260b8 Len = 75472 Msg = 89c1c6a082f5058df81f29804be8c212ba6720a534a0c6036a4a1c4329d664ede7acef5e9cb8916dd325524e006866b7148160424f7da213554018ba8581265a8616de0b2272777e586cfae0ac423f00c2dd18b32b56cc787fbac758ac0a8f108d86fa72bf2b9f09b07b8afcf87c3434ed03b2c171322c7a0f4091e4477889562585ab5a19ecf15502da686b8c202c9dbc7c9434c91aaa632e5ade28fdd4fb73769a598ad8bc55ac7712fef40f35118158cf28d4da152e79039116ea7725ccb0a74d6ccba5a4b35437aab3612ac4ca29e884d4694d2ba006b76ca1f35c73e655e1264ce528abf396692aee7984d43fdd952402bac964e8507174e70b55c730aa4bae62a008d9fdba351a1903c66d58e587361990f7c9eea05a2f51f90a2892f60e6c14c4ed36b908c4039bc89797fd88e54281b37f619b3d9a274587229ef48351e8cb1881cb0fc83e6ddc90a05b160fd7d0a1eb0835d57158e42c7b46313e973dabf065699fe841cbde442288c08bc28769e3003a4b8582bcec6f9e1dea587bfa3ce97350ba2abc91e03b48f8cf44e91a94aeb9bfad94b9efc974b850d02b77af23200adc25bf81bbfa29c8988f29ccbbda6bdf3c63e85e1903a59186eb9dd284e9fbf2b5e78dd86fb5766b0f0823b390c2803a5c736bb9612069f0684497d6a215e4f284087e09d5978af9064218e5c1d45692c4e70311f0aa279f9de202c9312f42d4f191795b172acd3a2446f2ab779855af1fc69ab0ee294964cecec4f458c07d5ea38965185af6a8f6121b974dda97e559131917dc82233608a30ec79f404ffd5943f82c86c98281f477c9f11311586f5748e762ded4225653c3acf1121164298c78e7b5ed8956c1fdfc59e64445635972683863fe0dad110cd7af2c94f2876bc1eb5ce897c5fad1d949d2602a9d410d7218150283554dcffd86205f6e0b412abe4462adcba3f71750053c460b4279f11f028427b7d388f8ec790672e98519cf4c2afeecd04bd3fd29d89f80305b936f40ce90bae0b0e9f4a258694c4b8898c033453a8defe619ea2e6c04f5e11118ee9f243ea34713f52be7ca52d7dc3b44663b3e1d78709c4e462566728f668c8fd602aa98ca342536068277c7fae6c7a8292cbdaf969b94fc78d771f23506f3808e320ba517ee0e33eb3d08d39daf544972cd69f9cdb7f7aaea0c338bcf0a6e7380f7ed6d73bff57443de257ba88009b1a7e7eb02060eece1038c544546ba27f11318f9f9c4ed0282772e75c904a10e673242ead32ae69c282b1e7d28805e4381af5fd650f4c15fe4edf5a1c4975a8cf379a60f721f882f07ca8c563d663eedacbc922c7ae98331220ffb50744af3abdee6db02e9cf3ccc06489c868be0a24bf9a27aa5808d7ba3c544072be206b392aedfa86a40204a9bae0e17b61ad7d185f0cadfe769c6f1da54f3e3da15b1e46aeeced7f07dfcf9c58682c48df33114c4199a899a3d7e2c01578655041534cc5a231a2e3baa4a9272170d6db41dd8b330fd7b3f67059c753e56642651eb78b38bd72b76f4cef25dc9e718d8d2a0b2f6f023d6cbf6c80814b9daf51e6b9e64e324916976c2f2dba2f38009ce9085a9242d1311f3ee8eaa519c6aa104f736dfa34eda3cf84e1defa9186a491796d3a4870e569680f75f6a730c8fd0a2a0bcd33a31390cc23f5715b95e2b417b8b928a65bc73cb39bb4430c433d0eabe0b3727f1f436419e3ea8351cf04d58c217cb45075ef21ae8df44e48a39b55721e3afc310c0594352f3193818f458f5b3e385bcb51d5cea530e686e0e46c67f93ce2d8fdfbc2b7aa605b104f693d2821897c8d7b72138a243eeb7b698808ccbdb74b773a511334f641d7982fef44566b7db9c7e54910eac802739a470128ea1c37f5857ace6f92852e2779a7740380958550a99d595676fd262f621dd22546a119415233a64066e3afdb535ab9e34d3c5b019108257c9530147f71328d9678f8e5df8bf98b2e18ae2153b39e037c02cc592d2cba3fcbfc0d47d43649a5e4e76028208130efa12e212d30f905f32647c1fa43bb380afce1e15ade2fa79da918935ab4d07e36122e094df3b2070b8a82b9c8d5fae619680d58a7eddbf0d74b92fee7fd084611198eb2fe0c7d35af115a104f543a58dd95c4dfc993b99a0554dcff7a69870ce32fc6aaa7eb98f670432461f86f1814da1eaef32a5047278a4d5d316c9adb573ebd7c7ce621b3edd1a8783b4e67028e916b321f64b4031de8adaa2149018399865b0696334f4c7055a9dbe8dbdc884a95f3e4c0e33f8be1a2fe3a4b8a2e0e685c80fb8319b4d1227edfb6070b4027cd4a513d94304340174ba7841cca80da2813b7c1cff402d078bfa2ad2267224f7b40fbb2e5d66fae2345321e11649a857d5e680fd96cb9c8e78aab07b77a039df8fc6bdb524035449a12467ec602eb8eccaf2a2c3bfe3a38f382517c22ae6461baef1a1d56080491e0452d1ca70fe4549a6876bd6403048f21192e61109eb559359b9f0f5d888e149a508e8e30e625856b1cc629fe15c959f4c19a6cfda586d2fd846317f55c125b2cc6c32a00402f7fb35ea0f846c0c927e30e4de6366d497d772bfecda9fd31c41c1a6396719852d207809faeea7ea4678071816377508da73704caa6e7e67cfdfcbdf85a11494ffadc34fac465c9eb97317e0d7b2cf9c3eeb1a17f1a3ba254472343f9cb7bed6778a5ee7acf251d0f358aa62a73c3b37cb27b8454ce11ab485e342ed080fdff49c9f91f7825c4f27fd1006c6113d82818a0f9201409067bd9a1b3e1251133f9576d4a4a8b7ea1d4bde8273359a1d6c24828cf071571869e7890170d5fd2aa5620e12de21d20685e59e953bd7cc45c1c5bb8419bd18e1e8db5c7c1f5f96bbda026b3f898b5b174d9d4633a5d32e1b490f3ee1560e0b53ac401b7694d7a430a71e9545eb0dda853e1adc43f8514808cca71289ef8cb9d77cbfccd61866adf0d25e950a4cd0d8b720056bac7d7ba37511383f662c5ea9d322007984f1343b6323697278f6fbdd17bb05f8587c77c6c8e168ce5e54ad63b164aa29676768d5f164e8347630b76f0cd6c38d2e3c6d396b04dfc65bb1a070d70b65e569c42b04025b82e4eb412c18fe3be63116078685c442462f44896057afdfdbb4714ea44efed1e089c172815f55b017edf823e9313d634512012514a09fa7b19e684ffc3e4d8faa2bdf0bdfcc7afefec8bcd9c0c53c2e837679cde5d4112d92ab340d5a59575a87d22d546de8d3ed42ca4b7130ca2b6ca96396c9fb7a6c3724e4bed1e72985fd1f879394543ac9448cfb8b3363c771e55ee13f607d1a188e0f50eee2ca353d3e1b51f915bb4bc5cd83646567814476614bf95cdb933d7dfafcf7ad8a2c05e8e72339471dcba12d4ed00cc154b1c9a2a818b2d682676a034293e2e10f3522efbede4665f5abc66a901afb88431cdf5d816c15939d1e2912307b1873ba0c13b88cf5803be58542e55b0a3aa07cea0d0fb6ef287c74e302128a5da14cd3da60ad180fefb2347e9b057648d0f34742dc200d4af5794fdc7e6b19e08652a2c692352cd59cb02cc05b31ab7bc568ec4cd3f84f25847375312485a5adce6f6ef930b78eef8e1e137309d3c04b22e6b2327aff4427db502f0b7cc8f66b818a819bc29d0704cde532be2e527e62ee57e319599eb3f904fac5920f9dd3c3a88b21d3d04e5fbc62ebd1ca5116ad6531a2c52bf93b654307577fed646a055d4a5997c9e3325ec1541a38bffa8715fff3afa190e14023acea51a445049855e06fde2ba682b1ccb8ab59aec4b20d7dd63d66be709913b3dcb7cf7ec1759088f51f0124923633704c708f7c01ff10af9216af66f2aa1edd7c76b8538a41b9694363aaccb486201323aaa6eb9f6cf871dc8772df3e9bc76b342df66cc7ef7abf7342c16935fae07de5618541c67e2d8c5c9797727df47823abe67011a1083d512cc52f443c1adb763b9d14c69dbf17c8b94e0667d73e98cf8aa80e8a401369e817f3daa5f26f7ac6cd673bc44db61eec9bb4a70673ff8f35787cb81ecb98664cdbd4abd37f80233442c6e281fdebabc2acd262967ac2c41e1e6856166a209b4521708a180ad53f8a42c3f146d6e7241091af2061130ca1512377d0ba4732729b91d060babbf7378e7765505b0031f39ff553c7ad67678d9831ae0e5287565215d2fb1302bb6d710986b4e808a2517e377ec741c39e5af0b9ed17f9265514a37d8df98d3832bf57c21ab89f95e5d02f9fd41274ebdf6e337d01b9777ed7f5ce9969d3b4a448765083d97a5e49f0356da1a03c4a6d5229bcac159c71a1358039320f90728e2319c3126b010e6eec089f038a4eaa902016f40ed0c9d0d8983e4d0f2638ae3dee301a387955954a00d22f8e394f7b9d71ba436adb477a6b28b572fa57d450facf44bcbdab7fdd255519840a5647a7dc6c9f128add1e59a20c6f11b94a6a3f0deedc1169a886cc491268063f883f15953a4cc7347f5754c46df49015a60565be7480810419724cfd60441df5783dad100249cc3169f9521b72ca59d614aaa95589b87455a54c4488673731f3ce4c5794ed1f8749420c3ded447bd2c43b63f319540d5225f51b9b334ec8aa023171fb6b23556243b399fc830a8f65a6c4372b53fe06833cb0e73b463e80f0ea49b681dbcb73c3e963a67725ed8c7946562f3a4bae2c6f627fb80b095ee56b73bf22d12d0e011401fb3e961b15fc756a9a5106498d057f5f0a97f3c3d78184643bbdd4a91388bc54226641aca966c3db37a77895c31b19faf88bdbbed0dca18764907096039023aa81286021d153ca61d639787677f6a7fcf29dab40727c2ca2e3a28e3e059fb1cbbf8bdbc2b74af2c31f0def36d21c8f2e9fd44b92e4eb8b7e5ffc17e7423fce7e85979ad780d3a3cbb92dc31bfb173b55a838a4fc4fb128e381a4f1dae1f7e28c7b5585a85776453f4da1de6e1a6f113cb4d19cc5db546999f1a4065f0b4f55be48cc857d62bc40e8826f267659aa7baa6ca81c37af5eb86756043cbde8d08fda9505809dc92cfd8e01a1857dde52df6677c40d98f4577c1659ca7d3e9f01f9a809065f51b54fe2f9723fe2c9d1eea7397f2d5531d1c51c6ea100b028596bf9f24dd90be14eab58f07b4f24a35b073aeb29ecde4a6f320237d7adbdc43d94f87e08866b95bbcac83dc7db3553a42400441f088e2bf6259539a2da8b5a74065f15e31366b4253498a6fceafc21d3cd610c09894f1b8d273d3cab8e04322549947f868ae688b36f32f4c3856155108bc50a8e7808645cbf620799d10f9379e3018498f2d2578e05fcefc3b34c3685e4940757dca14c8c756c6315ab94c7985e0cecc254116add7e605ea57ca50d576236cb0cbd011c45d1c418c7257c14a9421f7eabb78d09c960c40a10e85422b18d141e5423121bae5cd0ee5646adc3d415a103fb232d7c7a3592bcad0042bdb9ec94c8d717bb93f09df9ad6b17101b4361fa445ca1d90a1784313a24cb552697071f903ea0e4ca321ca71cad9e8d661bad9106743779fcc8d6094c1c5176a474661e3f31c775099d624304c5e50dea8782d014ebf0f69ab7b282bc3d9b8e817892f79d5793579859f6332d5af476f1ad671e356ad1362c09a0045130b08303ca121472590c70bf8d60e15f15d1b2c1b5e4e33099e422fae928f7d29d993f73936edb86de3aa9c66229b3629e86a7a2c88188ce1f30a24c7dd3c3082b5ca819fa2fb6a18f26ebf4ffd813fd9c1b3fde0ec773d7a5bd9f69ed28d0bb8303a83c28dc0c8a14d71c938cf568fab79660bcae3d0d13d294ff9a62b087b24d95262544fd440a145525e933091a1f9801f483d06cbe494fbcac2704f14eb7301b091d771ac8e938a9ef3f1a9b9135e763e27c9edaef43c33d8c58fa758e90d49c3b6ae9bcffef27da61dc693334034bc512ef3d1106c7d72089746dc4b006e220a354c16a51e389f0620a49596d536d2e6c23d8996d9e336c8ac584641ae102b0292528ad268f08f4dc0fe296a4ebf5a6d86295f88a907e29769168df36e9db52b523450ce6b94aedb6345b713f948a363ef29cb8c764605f372140bd6be616102f98410ff92af7e3d8c1dc73a716d4e4861c16608be48317b4bd3584209f5af27fca433ec8aab8de2afe8f2244397dba98282b793dd68c59d5ad6fbebfdd50ff8e027422b90135e793329a097ec52ac05c5e028a4703262b823815f2af68a03f4287fb4235f61505fea725adbe8185fdbb06c41b1033f797a3a74fa95808f1ba84a30126a552004150a359986a3636799b6798b5002da7a42042476a2285eb793d9cae576fdda0a2726f5d51ecace53ce6caa7df7fbbdf5ae15122bd75a6378353bb295cfd5f9a304c535a60aaab394f82771921f5a347c2cf1c0b2ab9347de0b0489bbdb5a099f3c696784e0efbdab959b61503caae86e3d0eb283a56f864993a8b2b03016743f4c982dea17e63718251cfc30e66a445c6cd05a174b4b795b5dbcb02b5487e403a3b5db5e464ada6b354094cc9324d2b71afb39f613b3cb83c7a52475bf1ab39cd0670249c279f205249aed8bc9471e1ee5c3d4a87544e7437fe66237e66b7d6b6100354532f02886a17048e70f5d70e45beebc97065b471ad5150bea50e6abefc435e6d90e49d8500a854976cbe485b7cbc0445a4d83758a65a583f58518b9aa785c896dcae3ac01ee3e51b38558c6f9d3dd2e5a9139fd12a01c5cf1f97e411c0c08bf7bef59fe0cbb001415d246bf4af2b9bd20980b483422ee19583483bcc4ddbedb9be21958e10f7ee316291ad8fbb6da8334c853d17f5c9f2ba0bcc597259be3704649ae472f4a0f514cf0619eac8eb4131f88c04344cba4165408c06ace951b0ff39c854337f945e122dea78adde8daef497fccf834de916bfa8ee0922077ca2d3c414ad7ab9b9715203a59280053b36a3b03d67ac023fb9f0cd5b2c7bba2753a78de4b6eeabf876fdd99f2f0946dd2266ccb7945673a2711f373c35600b3a0ca41da138385c3ab43a383f17f3a85bba6772d21d29a7fb87746cf7ed78009d15f2fbb4fcffd4657432a6ef11e4349d46cb2af6cccfa6334318f6f61c6ca438b6b8af83c7ec1c62fe0cad17e784f18b0ebd7d8b67ed7830ed335d9f8ae3fcf3371fc27864a73b1a9af1d51d5f7de70e5a63f1f9b72e26dccdec275cfe8612b7df4ebbfa99d739749009a56a42741e0c71e510a88437b61e2b6cde9442fded6af86d227030241f57277ba56657149f6e9c6c620096b333dd4edb09ae1cef95f6c8a68044ef38f4ada8705d796802711d23206e6ab448a2037f60311455041341981f5cdd9fb8c05d5b0f560c3be99c004e28bc4ca89e0d770623dd2db5e56e35af003ea3084f8b4f888117859a6f29fe64acd40f385e7b212b4d9561033aaeb95772aefef1a35e6b77ed284e4b3c1f01afd63f1c2d30f5e93606e21809aadcb4d69d3556235c4099707c12cd16f986f075cc84da4ebb82b76e754aba8ddefe1075a85a1367233ac1ba565c6cc54e66b2ffb62bb065a82a731cc357af587e1fb47cbba69d83a053cb9ea28e921ee2c83195bdbc08389ef50588179160323144883300a05d3f7a939f648931a6eb5eb3547f09c0499146ec55fa9a7f33e29f7774e19cd0b9655902255432cc12f269300304c1bfda3648164cba74a9913271bf60d0babe1abbe7a946b5c5e73dfcac46266d0d3f25ef4b7cd00fcc97e3e84f25344680f3e90bc98fe8d16c0a8fd0cffda60216ca9186f724ca43cad28fcde0afd88c16f68c1baabcf4ee4dbe7038795d690b04e786c1f618239c98e1ffa9cd6734eaa54f6db330395355908a48fa526f58d0ff1f6c6aed60c1635b4c9944bd5531a75587f29d030deb4e5ef77fdf033a5b992ef8ac4787028edf3e9cc7655980b50d4d2585a0cc40a620df8c7daf34c65badb9fcac216a08715a6658f0d649f0a962b6b18d8333db6b153ad1ab328c1c3e55c9b3d5bf3e79511afe087b5d34adf6efb7b3720fdfe52173984e6f2fb443eed986a48febac5e18682c34d2c3c3c082fc79b49b0c7966b283208c3270544351811757436b5bbead8c18655ccf9d3037d1243c7242a867058dfb125dbb13255194a4545708f5a1f8ceec22814b6a05fcb5dfd15e7815ee02d9506856d999f0d55c5724358a1f10e176cdf4a9fdd447b8f2d2fdc778680691ae481787928facc41f564e43b9831150cbe5623caf81ff55ce2647150848b49a560ba656ad9d620826c95aeb5dc9af2d165cf4a2271935ba920337b1f15d020517c09d2df46a1988b9d9d0943d99ef609f5a32442e45efcf85905601fa50f7ba3a8f85732d9fd92c20ad39a52299dbd1ae06a5888bad377cf1f62b6eedc99ba206a1e49021e3aadca26f1d88d4747a698b88d4d708f814a91c5c3f61916ff7a3c51e45ec98df9580884402a41bd0d40e7e09479a6bce8f3e4feb1840adeb12a6bd2e2def5a3ba1001b567261bf56f2a9ceb187377dd9ae23d2cb40740ae4f59438f726012e9ed744a0cdf42787addb23c4a71b1806be7b41ed233f667003a6537ca4b78addb03d3562d1115e3c7d9762a8148ba3ce28fe7ee81b9b7da6f02fcdd15b69f2301adeb9a8884f6ea6702f50c21f60429cbd3ec30addde20765297e88144c2a1ec84bfb9b91d39c08d2caad459f1215c392543f99d8e8fb9a6d2e78ed3894cffdc95ea1edeb654bab95910d5b6b156586e091506e75937afff1726a60e4f8f75c7f666ce5f7c2ac5f2a06a3d228888a00111bdd431645d6a49ca5c187bc11269744f3bb38496424affa9bff3e39e3e9bbae44249c2d789524c9292cc62045d44ac4772b4952c24afa91b17df411a00b1632bac4fe4db44cfcf18cfa90b43f86f378611b8d968595eb89e7ae98624564ac28d03cddd9814499c031b99bda46c50ddb523a9997068bdf4dcf1f9f8e6c9cea1b350aaf635842879fc7e84c14f3f51667cad6e1d6cd936247a83f7e185e0a5c6449bd077da19d42fab0150606dfcd99982b9efad85352f122339cb872c2438f9e9ea26a8b15db586b7abe6df26284f3f704e1491e20212847d195d33011bed044a4794d0dfd73345c9852e89a14d1d20ed75c510adcb4643302e952c2c4f2dae0eb902398f0fb736889510a507f2aa04a235ea730b153317e57d5cbcd64861bede495829e78ea71f9de5757a7fa05eb336966b03266a41c744109829278ceffd61fd7ee90fdb6dc9af7d435132dea1f452a030052651d81df4ee33bc46a5413340df5dc1307e6ffc676364724834db919e5c21c4335360df9e1f13bd5c1bbd2722f7dbf87200177f6da1be25e82a7450c1d1278773f741d6e9ac22749074cda3b04be1d8fce8cc1c683f3bb23a49d4fa6407289511c5e3ca7e9c46280b3ad86d92e658a7f7bef5990043c260671864572e070d373345af8304f76923f4f4464e6fcd26ae8a0bfcbfdeb73a7997208a2ec8d8bfb502000bc824c572ab742b7e0eef0a3535de554856aaa28d43f1e7af48d9822557a57d6062860f4909b366ea75bba36b841a2741260b0da2079ef73c6e0a0e26654444171ad1ddd685d82df14b7ba3b2e267064ff6aaff610cc6d897660383ac2609de96b6ad3501660c08fb57d60ff199ed7cda902f80b29c8f102af86be99ee31ad247fec421b2f67680706275f110efd3104aba41987dfd24295ceeeb49e3e49fa891bcbba8d17b3f1cb9340050f62d424b073d8850aa78abab940f2aaa6571c1e9dbb63dd2463e8e653c951e358d9a61b379e1aeaf21554d1c3c22d1140bd2a71c8fb5f0a8f9878ce2624d77a7bc8059d2096d58becbdc3106bbf0878fbd4e7bc914817c31d29e601b9323b4ae6b2551301dab30848e5580f07941f524632e6278d2e28a76baca349838e17d5282d272531f61de0953076163dedcc2dae6bb86b231a0c27d97542de2b74d799ceacfe4c575580a55033bfde6528b97ba2c3a0ffe9982cb50538475807a3051938964ce0e89585b7184397b013d141cca1ef625e572524ef7d4a234fae751ad4048d958b4c1297964c049043c0740f814a436eeee24d6f27804f691d9687a33a90f75ac4187920d369db3c02018d7d4a0a74195a117d760ddc9c8b5a364718ed8c782ef3d425cbfef05bed634d8a157740d604086b31c3f2e0d5fc8e343ff64d556464c2e594f3698dfb36f00b0662a9ac0db1826616f3871b704f11e6cec5ea6a60ae99e36331b3913dab20d06edf41aa6fa44088796f3b0afff58de490023559e15ee1440d015d8887bc8e243ff5efaa905ecb48f5a17f2dd9826aa41035cea25b18419dfeecd7f28ded808d0641044b0433ab3df834c402917830bbcbcb06b2524d3347b54ea35da4b0b0513e4b100a2fd548ce1d93ca17bc3968822f4c8e285b702ed7ccb1503860989637646e934697b62c7fb248d1dbbe588a9dc734b562db239cc4b1bf6ef146179a9605462eaec058ded972be7bcd1c580f65001e2d0045da25a4e0c34046d9b036039d4c12913e3fc851cb7f387a5aba7f8e7663557f4ff621eee65784777ff510f688fb1fac65cd917f29058851fdf25360969ebf3e5e2a4a093f069c21bd4883e574dd863edb9492b817ebfbe28a821381fd4acacbd4c8e69a673b07c4264d3766dd6de6f7043764a3049d03ba650c3878f6d228b658648008db7f47dd2f5583d12f16c23373f88fb69b83203831d35aac3fdf397c5d8fbedb284deceb5d03f1eae682a892bf8a7c794948e1ea5589c29214bc7d9c589cfb97ba21676d13db19ea901bfa832b5f93517a58b95f648238d132147574ee3ebeb52d8437d1083d6476c85d48835bda9cd5bb3d26f5c37ef5d00451a1b462c780b9eef0dec58ecd5a05dbb10321d59dd17c8860ab4c16b2b215080e92d97ad9da2c7b01eca93bed631e56d1cadd0d1be9cc7e5dc6d0c2dfd626a9a5c9327ae833735e01b1fa84203836d619f01386d73e3be9af0a125c58da6b85b1a57e07751524f4aaff37fc0821d5b6042373c752474166bed58f47b0478a18bcc81a84f307b7fb5804f00807b871832ad56c330fbd838217c9a60978a5d8df119176980483b2de8363a13c9174a0d9f8766b7e71d968a844470536046dfe456aa230a50c019bfac7abda0e57deda16f7870ffe2b536765beee1b51f61850f8226ac7308c19e9ec9f4df8f1ad7f83b692a7a8369e941637021f66c1d03d7743d36bb8cef725032074ba8c8b14af44557428f2bc4e13eb98986b6619f525e7c4f82573d4ffcbae32e272033f1006826ff6bb4df3ac6b5df6fc4297cf079a18f7fb1886e6e86611a053250b92421dc46294bf38714c02e3fea8457a6579e2916966c56079639cf3d55113f4090d4d80d9f8a530b9bf63240c16e49c51bea7c775d5acaf00d3d8bb6e66ff5b17f42e5e328d1dd531491484abe2906c28584241c9924eb111bb91deb80f27bf537938a308bc89747cab8f9c5a75e9686dd94a96b1571c2520ad50e46eb42d8f201ee505c91168bd00494cc1945b402f86b4491ce98ea559c20bbe42dee081492247bbecf0263c1d4094d49af60d451ff76ba66ace937aed5a7902a0a53ec38bcea645cf1a6593f3c220af8edc0658b85481eaf6dd1ffd5e7e57f6544e0954b5899ceb22b449e0ff197f3623c2c10b9712799f57818ead0b823ad1f435eac554d7ae349e3a6da39dab0320e056d7de1ab5c53bf3786a2a932a845df6f94d85f85d5cba88292b6c3deb5ec84ae4b530e1a2e739511e2cc683cbe6d2e304cc26fe7f2ae5771d1d9b7e7ed4c4da18e3b45a8e721ff6ef61313bdab4d93ee4c12905b18b3df172bed1cdca177f044fedc903cce8786b6881cb49fb80f96115d6fc7c99002c7db6797fba41998f50163dff6be2acab152619252c92dd8bf0147811e19a3c497274f815b299dd5e53f84eb8017441509a8491bf62352d39726d2f19c339621d862a9534452755647652aa9342d648e1521085fa7956e25a5e9c6674900b44011f33eb4bf07e844a3dd1dc01ce9d15d5d2565086d07cbf971b0ea8a2e66444aca44d64dd2303fc7820e25d94033d5ab691d29bb5061af7584e40703524e8d668bbc39c688b6c3066a600a9ca6f4b6a0c26f1c22598b63c165eee579bea1d8bdddc32ec6e67fb92ae63b93b05812bd63ef8506e58f6d2f069c344c9578456d7747c17ef5f6746c5a7b078abe5e77321d78c6afacfbf05a6cb22004ff8a2494bb521ef1fdbf7d23bfb32cb56dbe095df5e699df1ea3fa2e1a2e19d45efb2595b184434f83498325811512dc6682b28514bf685de39174f1399886865bd42fb782689660329d6cbbc72922c951b259f4a18e9af2a4cd47ecf079d1e09d1c2c44568380ecafc2222db978c243d554e6f0c5d89766095d5967685861abcddb0382545f6abaa5c08bc381895b119a7240c2a827c681b94b94aac8bd9eae921a9cbaa583ba93baa091c544e456fc491351b27102910a5d9fdffc3930f0b395e0df337077da3f96691b7a2d1219cc8a40000749f25fcb9c5f21a7e33abf807d35b437dec43086e223102b619a0e490400350b577e998a1f9544f1ed6273dff321030c17f1263046d65a200b049c3a605bd804c42ea5108d482f23803174959fadb4fb42862204698be0a151d92a694559d23bb78aec258f81ca84c32e2b6d28e0af4c880b8ecbf44a8af65ba0229c5c0309f8591bd690cd47fd5edfe1fe2e37c3dc471009d14d8e19406652e1eb9c4d606683d168cc1beea2b0f7fbd2569f735c233403085352e002ea3a5e25ed31bf78d12348f9348c9b9acb99408a9c8a85b56d5a888e7ca2920c70bba6f290225a543321e65777ac7b38368ad69036b514d6a002c825b4044b3fba2e53d33c39c7fb72c5d209fe433783da12e46c8ee8c9c5a674ea546342b3a4b1de8c4d593cae7578573597301976849d7b92a70aed4c8c65f817a4f12273423b127aea4ff4b6cb2b1f368a74f5e141680b0ac8148b4433c7d6779bc66d332241114531862988047565fe6934a11fc4240c7157138959c0b35531c34aea9a4aac2414aa67a3cc283d70b4bcd7e3d915b7c4f2dc6fb0343d10be6ea4e66351c462930fde582929406b89810cc584b73a0b7cb2e08fc87db1c85955c4009e00984da66054c2854753e6f88ddf654c603d067bdcebdd99db25c26e0fad02654ecc54a52c940e7dcf699805ffc021027d25920b9683c0eaf7a0e645c3e7527ee36a5ed79e27a2da698a68f800346070b5fb96720832a084792a1c269af85ab168795585db94e863bcbf3e18b7c58b5cb1c6f9f95c7fe63008cb4c58bc6a80c8850220f70e6346e2710f02ae4dfa MD = 4da010129dd22d2daf6da3a9c760e3ba8a68ccbed9b59c8525b84ad72ec04be130042794b8c03a573ec41804c9de3eca Len = 76264 Msg = b78acb49bd88e0212f862f96ef28e2f5a6c7fa0f715b9f3cd79eb4a0ff6eafad1f73a8e93803aff2014263bf208ec128a01a39a9a0d80763489dc06302802b27e683535e7575daf08b16903e8f7d44abedb7db5bc6b19f3be657d941f6fea1f5f2fff530dea50923b54ade9ca3bc168573e607ad4bac0ecc971625c143b1b81d2d32b5e5da5de39468257460c315ddbe1ceee5289792fc1e4420cf6b516119a97e63bc07d063104a8af07b12594e425fcf199e53122a133ad6bffdc788d56ca0ccd9311e2a80394d04f41a3bcc30ec6f74ad5ab7253ef8273338d85e51d7580b01dd3db04f7c06a6bf767a62848384f6f2f340da369456ed45d687b7122d85f104b70847a71f1e5ca2c1c20fe90fb1fd33337946aff6d395f2e0325a34a09c5abdafb96a9a312a77941c1bca639b1c8a1eb52c83f62a1725249d03d020f8454f140d79a29079d1007fcead1c5af16ca89bc0821775f8cba8c25620a03dfd27d6f1186f75f1c0bcfe4a209f8c36d74a5c929da38c922a9723b454b152f277ebfa3c19c46d25ce9279dd5a1aa35f165eb0eb95b66ab78622a0e2dcdf6fa92d38c0dd589f12946bfc7a20c445e73d764fab8eeee4374bd615263439d17ec9e8b732bc1d29eba75fa207fba549e238bec65564f0547db6e017be92b1b107ba701057c2b08980c4712b2b56474d1cb9b86ab753e52fc35f6dd16fe48ea492e38dea37d558e859556b40eb19f07a1c262ae4d844139c92b044eb411216d4a8ae07eddbde5f6effc01388512ce9f86ae9dddbc120c3c471102f0c3c049269d082a5c24ac60b42f96f32ac64777aee8e6899f878cd3ecee8e7f4dc69a2498b93c730118c73a58dcfc88f532ce2ea84100d25e30735c9e37f9e5c05cfd5856078e67181aacf74760a35f426b25683e4793f4b43753eaf2bbf9b2f2c76838c1307452dbbabc1c226311c27ccfdb98b335165d1c0cbd236cd2f4735fc6795a8cac84d2f679730d5c5cce7f1ee15f54b9c1ee9800310d8a8f2580a351aa9f41ead44663e2c7706f77a63fd1a3403f00b456a3220b44c384bc1c04df931448639e602f921b2522a6d6d7fc66a45ce941356bca8797b88da6863f17647e74135409a8a6ca1a2308482c7a7aaa9ca7ec7aaf89db352fecba646ff73efe8e4a7e87af4652986a419fc7db064119e6a1c73195294bb75e81d842fbecc1ea4d17e8730191a96985f167aa54f3d6312ceaf7fa98e2928a8df865c69c8866d4256cff9ab34311d9e7c2ee644cdba08cd9e3fd39fd1e462b48b0f163d4428438c1aa128306b332562a26a28a05163699781d55746464ed16196bf9af35a3b0748c6fcfb0ae6a715aa7ad0280104c1ec381f77f3e512eede76a59fd0d33446233f01e85a7fce15573fac6bcfb10e5bfa7721308fc3604cefbd63b5a025f7d1fe39746e2dd94b0552e9df4003f796b9fc1d2f05132956f16efc750bf330ce6500fec7955c5e84006e6fbb59ad1ac46458f2f000675f1c64c1fc86a9af3ddf899155a166d057a28d139beabdb663c1e378be0d2873addb2d52853c95be9452c51907aae76f0bcc35a9331174041ab5bec2492d85205bbbd5875f3fd9067d50a100dd8b2222c42b7f9800db878187c87ea05bf92054b0e3e3ca51387d714001a6ae9cec1fd2c8e7f349caedfd13f120aa79bb1900f8f57cdf8224cf87e6248c5b8c0f74e5656127192259f2dea4a2e8cab432342df573ad5216a0ab014c72194800fdcc7cc5d4137a8c7490321be04667bb88f2b0316f9fc3f08d75f28d73d2f6732d9cecd86cd59df0e56f0260f46208f585fd90963479ba77b3d463906cddec4e688b3d8870920ab47238555b266535caf0fad50b0964bf13da715b3da862b2f7764178bb27754a42e49334f4bd7776a29394887735885b2cc9f3e27c6e8ad1d81f67a55bdaa3e4000227a61303bf54e53471b0c4010c152a49030035057cd0572ba5ca4fd2476058969db3a03e6656fb9c3955d9b51976762249be50b66137de61a2f17f548747b1669c6383b793054d93957f9e99d605761c6c23b5c9618fd48a0721d3ab8b20723ccdbfa4b66fe741e12d37fbf46c4a93fe15384d86a35fa16e7b63331e7c7305ded8ceeb822286404da884d81002cd3592eb04fe34502facd5a7be87f482c9d11464994165d36ab3a0ae6f1d33c117c59e978fb11d8f885f87323ab776c4a83ea819268ca5ab1900a2e9ffb2a6d1afa9ebc0e14f8789f0214bc5dfabec6b9bb460a17fb68bd11d911bfe3c7fb1591d4b410f03bebb66f15beb08b64c9e9e279b06a1aca55f6dfeccd3982e6d9b81ea12682cfce8014d13732da2c680d386d65b60c4b34369a9421b925dde62ae739d6527bed4b3a066ddd2da3c1730d44b2f5c37af9e76f0ab73e51ff553473054beae476d9309e2dad7e0ba7db245ea14ba07520d75283e9b1891430995056a4fd55491e342d10dd18905940e9ea55b0900c27b843e4099a2ba89c641ad82a4896bbfcac5e9f36a727caa3196e33a6f5488f678bc03a64ae8e0347044a2a8262d0756bdbe8e5641e637355abe8aea701ada0c125fcb42999412fa08bb7c5e3761328331743be4da554210d52e9a9fa4867f6a11129ffccdced943584d448b204d73aeed8ff7847ce626a16a8d1b4055bdfe7a3d7f86bc30c0bb7726a301192a1b523dbab8cb1e71c16a52e38416b5c9eadfa35e4e886a088f42fe3b64bbef9af057996097bd9bff0f968a07ba91e64833ab4c3b27adee9e66f6415f397af5bbf70b2aa7d3d8e16ff833b09dd897bb1cc0e9df9db0fe303a6b5ea659ca4713d455f558571421d909a3c82e6e852d1c8cba21c34c94821824c60296f3be29312c359e8c3704a26b1439dd6b426a5df1df49dc601079418fa3a06a7af3be29370cbd8c2c10496280dae1facfe02e2e225e94a01eb108447b00211fb822714e0dbc1549a2aa8b69fea1c4a8c2127aa99751c4f865f6e892c68470a8ba4880a09c84665d54cd73c0cfb2096eac9ef6d4380000699da8c1335674b68de62d9227caacd84eac41a86ed955d9d5f54d49b9eeb2717d2e8f3d30151b1a57a69850ec807b92a610cdd37b06d15c6405e71c609fb03fbb80730290e9c0c58d615361f6a73abdecea3b9cf03c70b9a3453416cf344391abfb1cb85bbcaadeb77e246f4d253280a9a151aad46578191a1bfce01096b18fd60852089a75228e5d67d41ffae4a804649dd8a62f6832a352f006212bab4263c30ddc9a54fc70fd08832b1b04cae770a5469737092de680d22d1b82265d4032fa7483159139dc523f3af00b73c136edf50458066b9cdcd7223803ab0b93f12704a30f215914aeb68bf4ed9650b0dca3da3fe1bb5c9d5bd1cb7b8643e2359f6768044867b5752d507319e865a27e22b9de5ffbfde518ac96545c6bf3b12a901daefdf58fac44a2497f11aa207115505889cc6e740df5184d45457c62825c0c6f5ff8e041476955c83745fb6ec55caea762ee02c9dc1ce51f279d7f385cb25d85025ccf248dcc8ef6241ba2f7a73b83cff12e7fa45a755b3380cc3d1f4814ca881f918be0865595facdfc69641e9a19f7bef2acac90e9c4b2db3a7ebd4c6a9aa03fffdc1e3aedb1fdba51165d3361b64852a3528a855e66c3bd4f0aba739c16f4e90e8986b27a2c2774807289ed78a3ea34aa39e641bd8b8fb073a8bfc29386ada5265cbff5e54c9f82f3459154c82804ec6d2966cdef793d3b0e2274433532f2fbaf1b720b175a8e6c10571c70378cbe0356eab530db78f6e7883e80fd6b61ec74118f46fdf79d1bbb416fd34aae194100cc43797268d2e23a49c58cf81e5cc397b480e4d26c5f6ff6ed575ee91615b56b36fe5b9c80cd28beb97e3f3d346c9eec00b6f39260e6b1a57bd5645555c942cdfee102b50ab3f1fb403342d397d7a5fc5ef81c45ba7c0a5155b28d97557d0eac8bb517c5edca647847aa3cc22de5024e340f07f46267a281e2b583b6fc794493454141d5135baabd34acd613e0e0da6bebc45ba73fefa0bd8aa8ebba34040a07944f29eb63adea527101b8cd960e58d9ecddc0643b5e2d8db55170ace4678892e0a57612c50a4dc0647189f839b9a1229e22e0353dfa707acb7ab893f4ebe8bb910cd14f21b8fb8e77c4f19db027e0cd685d60212e0d920b34e96b774bd54f0a0f4ce2ac5f001b4411c19ac2e3a03b63b454eb30f4ddbac959673260d370e708c32d5030682ad56a99322972ba6eda6be9d0276b78b3113aa0bbb5577303d83c1377c4e3227e538979dd49b21dd8e66d6e99bcd9a2d6bfe872af9b6313d54a2f68f1e5ce7644ba28188aa08cf42587f2ad7753835b90eb5b38098c8d9b2f64672b655cf84cc335d0de03d607279ee4810d32946f8927bd19589232dcf4594e6ec299d06a8d44e908330f942b9e8b26a2f69126a715e45eac3c123258049b31cc9755ea2a1f0f01587f758201423474ddd05eb233e80ff69c4a513709b43d350710635242ec6ca3482afe4790f9e0f7bb045fdf19e9f0ac6fec16e7f8ed8681a9978aafb9dba3f8619c728be1acd8d7c3f85d5663ffcea9af892aea2c95c03e3a9391a998d3fb272a3e99f8fa44653b7e151fbe1914f315e38856e9ad953193406c41e9e6bebd582c763a34e5a7cd4b72c36fc0410fa5179453608c84d621a945896217ab8332b5edad1fe7aabf5831296b1304e5d72dd74951107ab83fdaa7d054bcdbf00a9f63f74c0eba4f7250122b73d4310c56d37e8aea305c51b7a3b66a3416dbbc3b4f8dd2b9d054deaafb19fe457aefbf73de34e08686d95828c3fe999139c217fe8959045e2d5f5e4ea36b2c47cde805169820d18ddc9ad47983a6e8d4ee36093b94ef17a2ec80d8468e333de395c1e627476be767f846cd922bd7dc63fbdf9bdab97893ecd761537a0497b78099256a8f343caa7da2864b5b03b8ffa72867d4c3401cfea6b4aad7d24fbf2485a2ba9a34a7bca135a40257bc5272d8083f73bdde7102e2374c036d36b6d40b5c78287dffe71354f8c561f89d622cefef06ae5c149353c60767121b8e80fef56ce3181bd83e684b2fcc4c37e6790fcdc247bdbb4bf036337ecd82ebc2f664691dab327da8f2e30f40826a1a7fe043f9eac84be26cced4b00445f9e5ba602fefd7971daa554cae2795af64ac50dfeffbd052fed7607655c501981f105e06860f027082aac994ee1b941be1f241bd3b5cdbac7ea40d30e0fadd8e9e74972f925206fe0886ea12ce74a78d8af63bc450a372a074515d449dd800ef1b194b247b3f4c095845a20e74b935ce07bf243a5658fff488e437f9b5e6d2834108632e685f3a5919efd8cf0872a6a7ff55e6687404e9716167829850acbc12b548c893813839b5f48d749eb32761dd1ac16796d32e98dfa8e1286995b3246322e1609bf054b2e791265dc39c61d03b010a910c9b5e7406045b10b4ad82733f2edc1590da3b0bb597c27d86eda75a885c384a11f31ce5ad1edc22c1c0a2126e8140ceb86a73aee8af69bb2ecb82678bd2547cee03f1539e9d6c46d7f59967b8c415735dc58601488024ff0560795f0d0c640eecf464269f2a13644074f1dce59f63ebc516fc6e9cb3fa3151d414abd6b273e851eefec6796dda64426631d8bcb9332038835b5baeeff43a5b4fdbb1ae6b86f26518459bf40dc82e26f3e2c306bb8cf900342d3244dd19006bf857da5ddfa714729bc30ed7b3e6ab34428b048b4c775e6452f95a2724716cc9f70f8eaab7dd36be9f0085ec063bc1b37cb4051315fb37ab05483b1f6d0466bc758b365f9b3140924b8369f9afcf59edc8e62d66be206c1e74a13df360dbd78d9a54384232a91a36c7d423c755aa5c284fa7e44beeeee605c88cc86da4fda5858df1fe1c2550acf23c7b191ea1d5b0ad3882928c4d6e8ba828914453e272baea77eaeeb41b2bdf0ed200b5c53b573fc4acfc9fef84a7444ebd39196ec143fc047fc872d4bd4499d1b0ec5e86ca38efb4d39f743d3ba1fa40af0baf86ea77551dce12f142b3a2c385ffc77b27f680aac7d4f2773d196593c725906f630416ac7b8b50d3c7a44d4670e617767169385743d87d11b9c7faf929474ebfccb829e867df0b7f2b394e08da8e66b62cc868de7106c9aa77ed6812ae3ecf088aaeb6f329f2c95f3619acf30d1e3ba320be162799875dab4132b8c8a0329bb3668dc8b409eb15dab0ec6fee50bf1fa514f14c190382c17add3ef101454a382625fe64134ff27458605ca0e0ea999924d209119ef6207e8113ba1ba7e7af30cb92a894f8423170410f0f45b324d3318820af6e9dbc891b27ad4e3fa1cc890b0974345f4b2bcd90fe85ad694e46966f39c78b69ff9be420d371a164d73cff4f479249cef452f15cf58adf11999809dca08f440daadc5916ef295c9231813986efb590e7dcffc35d8fe64d477c6155ff233f825f87c61284e29b26d197e2603768a5b0b4e97a6b1a34609e12dfeba1602ba1ef697ea334f21490a82af1a69ceb1a2a523d040a121c4dc27a7baa7c1688217b313278b9eae8edcf8aa4271614296d0c1e8916f9e0e940d28b88c55ddcfe6b96f0c25b525aefd5227348217af179c912bba0058dfc0b7759764318d61a4a73bad52211b4ac8e344f0b1dc81a5a639606d28abb0f8f0a581ee6b48c2ef8f59fae87598027094e721ffb2b023d78703cae0a4f1ec6c06c4deb81e207af9f86593caf6f92f599b6f75aeb7ab82c732723d20cf818fcb8bbbd86efd5729f3785082af56d2d64834e2bc88213d3307211b33c808d90f79e7e10b8d995b647e77b1341005a3bbef09e773069fd398f9db455b30c146d019b3ead49e72bb9efd8efe449793ea349072f415c4840d4911d9a6ffe5b979960d782fe01c09e65df3269e20a07214d4ef188f212c6e58a801a4b6be6131dfb5c79d26aa80df6a15e1c71754c530c2114d531f31b8bf245a2bb4eaf33ddaf7b3faab65905753b54b5be9005d6050607e5dcb3ab3f4072ec41292aa5ad6054014f91b733e1a176682d414dfa71c418e7072d9581458d6a67a38c6ab31b451475d6575c610438afc40ccd31bde53849a9c3f25fdff719e49e100b93434733f7bf1a232e4936e3ec509a89c3b4fa0aa13561509a2c1b8de779d2ce2fbcf7d306c8641eb4543f4a37f4219e8b4877e228732971cdcf7a907ce030fec586f4cd4876fb6f76eae6149798e73411e12667e74c637d8032dccbaabb71c3de0906c8c6b22940fc74f4ea15243571dee8cd42e5a6569b3bbc09e579f2de4401acf46c866534b6cf583273b780538079c3351b2a6b4bf487d5c887f16dbfaab6da8862927565fb76006558879589876adc2698bf818ab0ebe5e2591b145c1c86f88852f2cc043779d258408d491faf3a9a6864abd25bf6f0542002fed0fcc3f76fbde3ac5059916138d2d4d0855c1f7064c225f64406ee1c8b482ba287e8c793a7efbecaebab32b4999abc58328a0094a4fd84a9c1d2c2faf0227b1022694fe208e68b53844442fd5d799f2d36ef792ec1e128cb3009970fec789b4f8ac5836bfb69f150026ae8c1eb3725587bd3b3c72336ba6478f198e5e8103267a5448cb6e64298c84f664c8aad9cf7e0e780d5e632c4e17d83d2ea034ab3e9615d30924b323729c3528097df0a6fbdcd643d08145653461c38f6b8f17b29684499cfbcb348114c4af3fff1496a7a1e27d95174d8f7aa904c7fa42838e43a5618416b33758e97a8631a2d814f3583c3f72d0540ba7d9268124023625fecae5ce63c4a1f196e93e619af507079d45354454aa1954250d3767863bc8feefa4c21b574b4a7274fcbad719ab1e54fadb27817176d9af9d8356185d1b7d76d78dd4e8dd0f3f3289909a675c398095a2968d7777cb078667d80d241705c6165cd298a76384e2ca4b313792c134c0421b03c1a6c61b45612a87b70b529f2565e61f87e79940c7a2107b1cd9e7017fd2cabf7e9feaebf5d83bfefe4e8e5c3ddde9c12d19dcc760429fcad4ad4c33f1c048061eb364b1ab4432ca4d5e28a151f6fe63f2cebc9d4f343face99d5f50d8b309942c91b210d85da5562ecac01314498a7463769716e6ef869db62a9ecc96f385c622bb616dff5cea4f1d14d335f73e247f09921ad8b9eceb29d4c5992bbf3a53389b70d13da2ea97f182bcd07e7d4d32e05fb1b6674ab4f3bdc00ecce2b3cfe857e182b014458f250a0a235641090f5c44d045e8272bc036d5f266a876075cbba0af415c6669a327e52df8c3423cfd0728f5df2ebcbf971b0f065dca7a3c4953af5f4d54c881df071f48ada5e68b8ea9e95addf87c78b216d556549153c51e26c07bf7179f209b4914e4b28ca2774cdb2259d2d40b09a9b0a57cfb9b973453dba07fef437eb8507462ac87d60a82a011408d5e5fccc4d68f1be4b347b8fc82b8bbf58636dbcb96ff84eace10832030c2e06fc0fa565cd0f885280c343da013648f576c803aece760f839d5caa0f277866e6bab122c1421839db176df99a19e55772ff2ae007eca4f39143f72e85bdcd2672b9d55b28d30c6b20b73b851838c021fe9c92ee0f3a800c4048b97cddee91d5709e8238e4a87185ea0933cf9c84500e60f5071410e192c35851ab7c5fe14edaa914c1a13cead2f101b560c06e281c8762b1913a5009627ea009d31752bf8b9fe5c1997e77c1b4162d62c73ed54aadf2ca78384818d879a6e1153b3300afd18beb4d12b7de54a15c36b872321b1389b861f40527b0795ea4e320ebb9afdaa70685613434b9cc202be361688586aa3a42efcbffbd601299de6ed0e992a867957879a508de5050baebfd02b11d5f3748f73ca52ff370ccb3be4acd3fa4337f234990c0959bea09f5044c4656e4ede4393e0f2b9bb227ce33ab3ec0f5d9974adae2925be354d01f5cdf98d25ec17ad7978132044de0cf41a10d145111181eef41a9471dfbf24bb974e2a951d19b4c38e9276bd94d66ae4c864b92279d480e97e10777afe45ba1ffc7764769b75cac30b8988352a12d0c1868cf81eba053b0694065e9b8a6791a1adc0439c219ebe2e78b3b4216531c33ccd200a84423204c8ee82966e14a3200323bf24805fe303684ea7a6fce6b1a6a914946d1db2d972a2d61bdb6d2d770996e6da93cda6f13f02f5dbcd421ef11f88f5709c257c6a0916f3187a132551a2ff7f992dde8737c57126d6a37b8e9e826ed83b14462f623cb7ce2f1efa9cd1808f56714f2d81253b452a1ea613a60873cd455a61fa1c6081e7bfc6167e146526c8f4096455154804f1a82a51a505dd6826b56511bbe3d37d3940541d27fc8afa5ed0a829cfc42eb7090970329a2e7bc3fdb0d180061649931f187f8f82e5b1afa38503fc081e37d5fdc686d58d70624bd4b03649531411482b709eea1940878b29897357987401c63277d496d98c2f342e4be9ea3d7df910c11148b9559d6b2163469cc8eb65fb1c6995f00318c241217cdc82cf2fa43f919252f379b26ceb06e354d6cc9b84a25ce5995fb6c5c3369842fa9784a437732ef1be25a7da3f65a02c2cc7df032095ec490a7a1e6aff8e0d032e7e8735a8226d61cb55c0177589819046d67cccfa246f0651e59662e796045fd0ce634e66cbb185031a5f04afc53fc23b89225341fc49901808db681c0cf29b9a0d957903ddbfcdedd9d11c6e871f4463567c30c87bf088b58a49c4fd517c58d2929a2fffe6dc9ee41ad2e9126dc47956d4c6dfde321862c2b06e140be1e61a2313ddedbb759c8aae63b0d53be7a3d39e7aaedaf3ad1590c831a4dfd85ce45203f7fd3ce6e87413853b177b5b635205a2bea09cc94b7c952e74aa72e320db82edc56487e2ddf7bc01075345e18f4361fc2728af9fabb2027e0feb97bcbc503f48e2a0693fb48c06ba6f10cf8ec9fc9b133ac37e072c5a4b2f59c498a5add6f9be064d6b6e1ad56609c8bc728381d1f3806feda2907bd9f1cae8d2006e63d424b576a7e8fe5f386c87aad2c98065880dbc4d2397cbe8b578c9339069578cdc42b7da5c6c5120398cbc9be05f05d3736c2f48f1e7fa117152b2d08c2df17753f64d97d78016dc5d490102618d746a288161e9d4fddb749202003631e8dcb1df91df35b5aea00218240d74c2ef6c781bdffca64943c080ac2949db0e0479cad3b7f54a53629d200e902a79a0ef5ebbc1ea4814cb7459d4041af8458d1b4930d4db283c5d265eb4852ff0677827bb73cf32ecabd7e9f7dd5e6983fc4b97db72577dd0821f64754e3055f7f4b503035e784c42e1fb3f2b0aff978565b604a11dd01296c236c7614b74a49977f41be6ca6188f34da1ce83fb8c27652848dc2a71e32bd3631fb9b33ae69e5d8791dca6462f8b76456822731d688bbbaa90a8d83ce54c2eeb56a5ebaafa95cc9a2acff26016d6346fbac578ef3956f16319d54add7ad5f1d168266b0a154d6f262b502b96dbdbb633264215ff62fb8ef840fbf2b1f86bd4abc0b5c1d6eb07adc22027e258c30e84261702dabc79fc1cb0a277507902603fd0fcde709fd06710e485919734810126bf299227a4e2db0352baf1f4911d75abe778fb07d369de3103e837baa87a360674ba7a8d47320aeb24f6d64f789dfea165c1b5f8001bff76b6a484dd23333fbbdd66269c21ec2e2ccde2bed1be287da8c26379b1b46b2d5a6366f37f433060bf5f9920a4b3759750a40af61bc031753a93dac0c55edbfa64909c2e0166f64b7981efe3678a62e8ef4ddc169e3d4d77cf309415b36de2e92dd4a07f143cf97272dac6f9350538956131d2bad973d0e7ef4f3c030c60247c0e9630711803be6843c0badc9db26b1f5ee69b4d4e02606803461ef320e3f5259f5bb8ae9d79b98f64da280812108f0920e272387c67705ab3abc980a157e968489ba58214fd7f6a4e9dbb0632bdf8c55f9c1416d521854268e6d8160e3a85c6a2ec83860f0d748b7971d04160095ce67399dd62f8bf13b1ab8da73db81a3ec326b4df34ec384d656e0d14543a810fef05625aa747aeb01af406d3523f6598e05c9b15194cfc4e7aa4b5d3b912c3a6417d6bf84e525ecf00caf8d91e14ab08a0bcf5c1ada1d80c4db602aaea993f9480543d52d2996dd4e5a8da14dbd8692276b05b716c7b3a1b610a7a06632e537f1e224ce6ee9d5a764c06013325eb1e6ae4ef3280d049b0d0371a9272ad52adba8d502120dcde8307a67b24a086dd39467db2218c639ddaef327ed28c43a6bcdb5066409d27cd962d8770aae9791f5839a3b19f00a0d7f6ad05afb09fa08b0f5609ed21b879fb024c517f1a7a6731d9d8f956016a1288b2be0315c3495e7ff3bf1c5d4b0f2dd735d8b6fee9dffba56c98e1280f4533308d86dd5970f5d816287afa2f330dddf2cf770a889f8680fa5efdeda00f0e8d6ff59bd6e3404197be0c1e35eb6030e4de2d9bdea4a20aa1a14f8c814687427b877961823bc7a938081d1d520a6914dce9eebb95cba7e8d82aaca94e941e7d9827876c81cb6d991364e9fcd114942640a6715ae276078d8f06f4e8a8011b1c6db0be41482aa88dc454e1313592a7f19aa453fe272c477550b6c6cf102633ab66c36c5437d20f13c568a16ee1fceae365640519e666fe4ca7ca80d1396bce971dd03029e34a17b7811088ea88bbf3981b561332a2be82500ea2b173665a628bed57a836dd0b48e5a1dd26587c78486c370afcecee8b7a4bffefe74a396a85f67fca230f878e292a823f081d4f8a5ffc32e3208d2c665c7ce60280aa2524bf432fb83f18655b2ef2bca68ccd649aa0a4b98f3ca7dec79f8f7b7b1c37ac11550e87a25af608fac0eabbb442cd7e01c112156f9fd19827b9e00aba285750a90db51209150cf4d5855f09d8c8b1de5837b0e0f4d87ecb2f420b2e6023ad95644fd3496cebe19b73f2dc11946d0f18165b0da6bf5523fa26be8d50dd9c9efccb81f5a84e4df86f6e8ffe7d77ce39bdb4c184d14fb44597a685d31cb301aff9574a78c90dc9d6032db312b7e35ac631dbf1b2faf6647846373e78dc50e1551d800ff9065bddfed92a12d53b67a12916c472147e73f42068515eeb3a67ba22cbee58d2ea98f8c773fc159272952006cf36b925e618d1c2807d5da69147fa9da6faabb30055a8e4461c31f717dc55b3dd7b3d63cc858bf32113c1478b72312a112d7f05c2027cc9c1f30e6f75adb0c4c43a755a9c2a9126ccdd102a8396ec5cacff4937ca3fd2ec9a18f1582699dfbe15dd0776df787fd1d611c0dc03f69aa9ccf8a0e5635e59c12106816da511210444db5a54f11fa688ff5a59d8a741aaa613a20c8b37fe6febe944450c7bb4234bc3cde4519b50a3b08b2f51bcc7d8bab5f383f295a28083c1654a92b114f364d9352d4c1918dc05ed1bf93ed4f05c496e0ef6e9915d9533f6279220f7fb4f5440fb61e7f804123ba3245077ddbb2cb542a8a3580aa3ad0edea2a3464db938702799144e9ad793b35726cda32382caacc852f1c46e2f2862ff5906992eb93f56e190acf65e2dc11b8db5b93732d1c69e53b07ac5385aa7eeeccd24801785d466f364a465de512ac2cb33bbaaa832a0e8993396c105b09be10b81a591a499882ef197831387fc415774333d73e02fda39fd4ede5e32bb8507eff8d254328edb2d50bbd195e789a5283d36c7397723e2f0e474d9d35bf5e3b21e95533e5db04dd0952418437983b6d36ab0e151d9b94bbc0347e1e6fdda488e0c09a0b692b840b72362bfd2ba7506d7a1240463845a84e9ce3abf0f74e323ea2ca833635e01644fa01a309a26c805b36522a8d503722f08a9bfa9937daaf655151393bb3c2619188f9d33204b0743e52b1f572cd3aa9a972a593a39548c406d49be4a24a980ef90568e1ffb93bd31eb578c97d1716e5823c499f967b62182813f0aaf4612cc4855794f5f829d5460449eecd3796937f82d1cf46f850ee54d3f69ab6b862442c3c67c638a6bc4675f6f55d2a27b2781fb2177faf537cb51f0f65e02e76b4a9ed261d45d190db5507ffa10b07d6d48f6c18f7a1032e677f22e548093bb7bf23b04b615be93feccca52435418dca629e0fbe597c69127914045c875e0401eb7a1db41c4ea8395971f66f9a47e48dc66eafac26590a861a3b6e7d0a27b2dfa075db6834673508880da3e7b66533a766c7f5e944800e12b2be084fb9ac6cd646dd936f93eeb933e367539472e3a29eac71897d9d399c3ea96379da7d345b70457aecd21f2b5b43d049af7fb7085bfcff33127018ccdc9367f36a263c08a63405148f98c26544bfb9795eaf6b1e8348c6d639ca9c80f7985435823ce07177aaef7323c963e69b2f05c0092c776b450b6b23a594139f15d6d8f36a234fb5f35b695e516eeaf4891c1ce658ffc438c7cc55dffed6646f5dd35cf3c9e3731c44cedc9fc18d3ed8360d66b3f22f39cc3113ecd5ee967739f81946fe488532f0928bb1fc1a3149dac98a4bef80c4bd71ac6998cc1bde34440e3000dc8f0f7677041b4e MD = 3e82f9f2941e2e8edbd0942f8db71b923cfd2c62cc80f50e7064385616c954eb05bb71a0e52d5bc73154d24ee01458a2 Len = 77056 Msg = 693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe26369d0e7aed9de3c5f221e06a69cbf62b5c8b239c61b639d77759e17232ccdfae188a98f14a3fd1776723b944ad872a5d61ad2c3771ddbb7059b5cabd43c18724724ce16be07547d02685b3fa9d7fe830c3f9f8c9e02b08e3e9465758a4077dee0d8bf1cef965ce38f9eed77481dcb80c49168f38f4c7aa9af0b1922b9dc54976b1f0d104db37ed17a6062c9ba1c52259bdadf96ef6da29fb35a1831f75237422252288f3ce142dd5f676ba554463af7fe5653e512d8b0b7082bc311a764a855c33ca1e851c2415dab1e6898bb3dee6e689e767cbe303da609daaa405e662048ba1909ca00b8e2d8e9ffda226375d50f673db7cc35e691d334f14e4c90e927a16381b092ee57bfd5a87640c0c160873186ae78320e8e65d5060a2fa4c36036e67c0146d16f0120ea433c3cf279808d9b235b686ccc7a2212198fbed78a6dd68e50122d040757ce7d569c1f45d07850a2e9dee8cae43c4f10dbfc8c534a547f0f8c3ee3b94bbe01056f2068198a9a68df26a389eaea675557c9cb08a677c698f08cd20b5fa0c67128e963b81bfc894e968643bc3b436dcd6d6f85c45fb746ccc7de85f475aae3874e41c08f9baaa77a9f652a003a83d22fb849b73fed7d37830c0dc53f89cea7dbec24e14f37197765206fe0e6672016e4dec4d9ebbe3e1b4423771a5d0a8085b798ff20876ccd9b96eff2e2ef5fbcbe95377d6858607e8498a4b6efdd76650fc2cb2d18b8bb3b7698449aba8b729e2ba958dfdcf662b2e5f90649d0216bf0a885f95b346390e78ae1d4c3d23b5e5900b9b978b256437fc1cddebc45d94997d269a9f60e088c565afc06fab47f5181b01eefb492e86139aabf846acb659def2ff66389f0280c0c695f51dbfbd81a8ccc61523fc93d6a8503269df1db36e74b13b4ac839542ae7e38745bb3f2d617feb8298756ffb5cdc66dab91ddfffda450201cfb7f77d8d2303ae36b2f43e9b83c05c005b690f1f9823ca6f67b940a5372d797b6e9f26b15a6f32526aa699399e927dd33cb17727c5d12b1327741fd83479cdd953f9f69f75703a214b1de642b7ab0d9c8010da7c49b6242dc4d8437a2330226ecfcf965e5d4cee2abe20ccbfb55133e08e4ee0270e1ade46a6ad5593eb98a3c44be7adf6f84b77f52979f3b782cd1729d033322ffa4780e535bbfc2c76f975622d0ae47030b7fd0af5ee04320567e2fead86789cf7843393d9cae14bab9dc3d0de00e3d3ecd6a7f28b48a7392666bce88d115976ec181fd7faa1abfb72cbb397c791512714f29e34514e83d2cd14cc6ed89a7ec6c04c6b3900090341b3ca6d3e4f85d7758f510a58b1ca4108e2b73b18f7ea8f945d68404153ca912756e31a4ddda31cc4473b12e6128288e04d98306e50c933e6aab4c5785bacfcb4445ee24cdbb4c91c23fade67dc400164f6ffd4f94cff12c68f7723658077edf06383ecc4b08085850bd5976376ca549bc6334f405353d53bf4fb81912bf20be49c99613dc4cff908e71365604ae8288da37ec8cbce8e244dc1860882c2e6ff97d8ea683d7f69ccac9ffd6fe8bf642543762667232378a605de61dfc2af1b7011fdbc2a4e4916a77a1cdbde823d05f4c4287456cfbcd9046a34d430d95859075bf458cff78a9d327844f5d9b72c923d189fb0ba57ff79e685a926204d27686c7ca6067ec1aac714b00092890df5d4a748c522be445620f25c26a1d9a8820f467cfa0e5f32115cf62a39fb160efe93db5b8112871d2895d3fa948b8371d3173d64d7b79bd427247fedd579a742b0968159bac7406adda12f64d92d45318149fa3b274a5a2f55e65801be52643073a7404b5a8a0fb4dd0cafa4dfcf486ff46b2509d10fc3c9016c286edace7660b08cc03848a31c818f9efac08cb9b4b3944566d7bd4eff2c957c983c1337055acd0eaa286c5a905c5d1eb9c3ca32b086c9a163acd34f35e077df50744fd338a734f5a623aef693caae5693b28083646efb45c790fb598e6b115df71e78ec38ce4b095b32f6c14c55eb0c319796f5f9f592fa388b1db63257c9bd354075c82d577c12725c2c01e4847a093a79f3ce97a3f6885ea621ac482c09c9b4e42eaf3ecb2ed792aa38ff83dfc4155761815665ff8fb7e3e8ef84f970384719118beb93b0c821642202034fef31f7305627d78c91c64f6c5a6f866cadbd000fd074c35591b4b890cf7355733b2a796c60cd9734e10117a4028af9ca6a02bc3c28d17eacf35964bdb6713c154c1561b3875bdf8378a9d830ea26273a306e4248218a65bf601fed93e1e5025ea85b78afd4baf7a4dd275abb1a2c56e586695cdcc387c0b75f6e1abc57b8ed75d96586064ed027bd98e165eb9885cff2f45bd0a017b1d7bb79aeb4dd20d04682679a5360fe86b7f73241c1686e17da8a02ac673b24eef1f4344783a1451754afd861a666eac5ee7932ae35dba4ccbed539c5e956f227578a1ba24fadcd746122b62449bf1c73166c20908bec408bc5fa200c1e988a4552a4b325e0acc0ceb303884a02149c7975f7854e89424c3b352240eaceaaf32e286a8639fe44260f937bd73b9a0d70c05343e752f886cfc657741fc8c03335cc21051b47701d081e49b22a5ed951a22ffa77d1039f5fd2137319470cbddc5905879dfab5ffe06de31dcf091d86893aadb1bcc8c948765c0ad13840208d4d66c3a059acec73355e4657fafcdf6b5c3e24bf3a560cb9727593b8fa906af82d64edb662b85594c3e22f3e5d8c0d4e73b87b6d180234bbfd25967287c154c6245c6b0fe0a657293301861b1d400df875af9a037f54a916bc75fb45065b44bedc5525f3faff59fc2cc3333665a148310b2c69c996d5d492596caa7a9fe4a4a9fa5702acd849c5d357311ed75b3626c0dd36cf06860c1bf77c138c587ce6db4f296aed81a30f02775c5230462787106f92d5b7047682e70ccc708729c2e851780f97cbb983d678b0e22f4fcaf21c6c04d31106098fbda19af28e84339c736eec54e5859d9f288f4591ce64ade47ea34847f3a55ef847af6995726cc0300e9a72a15d0375208caf001339583524341e0397827c4bdaa87b415e262516a6413dd49e052d892d8b40a70d7811abdbc644fd6ac773175d666beaf5b1997d2794bfd8f2e7eb20efacaa032a91795730bd7cfd69c8730ca80be92b011bae3fdb908847450b26838e7755dc0f8e77804c9f30cd3c8f6270e41f5cce2b6c4ea3e9bc00e84177c4fb3174aafa6776f26f56f7c7338a242a8c38282c991aad60f079a090858c35afce002c0f24d852d46d774aa9f8fb8db1a8cdb0c05576e6cc6fb5c59ee4ce4dcd442426ed240a2904c0d7223de438d4e10ccb3e82cae91d7a68c3b294ce MD = 66e646adbcf608c86139c62ce5c1cb76112fc0aa7c3f83ac24d3e6f7c5c7e1a1b6db310df87f8f9a0f84c4e5658c6fd3 Len = 77848 Msg = 6bce5b07be558a6ee9f68910678bd641d0a2dc8d08dbc844b7929837fabe74bc591942f8f882755d119f2571a1c665d1621ed176fa01663872a59790e9fc9ca28ad80e7bbb53b197976e91a69ff8508facb2beb629b0aa7b7e02f803cf94f43ae753e6186f91e72464abf237c8e93e8397a5cbd3fcb03b14c5f1e415154f238b58d2f3587c04be0d5f9e73ad8360d8b409412257ddc8c30e2eba835021f5d29dc69c5cc24b74df596f8e398f3a27c62aebcce8ca33c2e76ea0a4fc3b5c4ea87917fa4adf42a9f1107ec56f655404afed268f48b26564513e05f8785e2e214e263534e535ca6a9d3b73893bb839c03b06a0d26899dd77a98644ff1e4200386bac0692544e4c818be03523c50e5023137c43dd700602c2964c45fe176e3859a814745bc0b22eb4620aaedb36f203f4df57f6f789823c0fc19af0408a6a404dad6566d950e7dacccabec5f8b6e9b9fd469fa069db94f324d2772d0ca0bf7edc21a7c3522d77b6916d0662c46c7ddb04f15d2b7c8dc48fca70ece4a980f45ccdade3750f7eea2ccaf0e96d858135cfd288997e75c79a78c943fffd60549140eaf82063586cc6a241fe70cf841d99fe2fb259819fb39f17e9f4ba6079411f94f9ab6675751f9582bc3da16e096632d0e217a71c41765ad2f22b25f53c7125bfc36dbd93adbede33045586335b8787aeb5608a37a23b5312ab8f47a5f00c2b2910e72ea549722a1de1ef2706c4a621fe6e350bba0b281340ddc92856df39b93aa8c0c093916200a81ab38ad08aec8629d63d308dc46521c25081d0f14f21585a52a17c45cdb7e83c7948b977f6804098b5210399151b0502cc5e485f89ec8ff1d83268a445986a41c457bce5508ad7b2d3898cc44672486619089786d5c1e767001a8f96412e0f1fc4879900e034d1def71bd2f79e917158fe28c5507ac8e7249302f60408a05e3e41815ab2eda4b886eb82dd1b66a1083f4566dba4c22b17905891a7d7e317e00703ec07e2c10213117564b516e7c99683b469e069f30fff141970a9f51abb1be0d171a678a2776be75e6a63d26632a28b14dadc89569e28169c460448f5b3993274b8415bd92b47706d3bee352e03b4c12c60d7eb33001900aabcc0b7bb28e266b568df75ae452f136c805e298665548cc6a4da77d25d5a380b7ae629b6417ce25a2989ad68edab3b21e0bb95b5800b54a84dec157adc742887277e882c27f1102ba546eb514d444d56040e60047b60829b0416ad75a5ee36e66b8ebb6601c957f2811e17af8a81b2d1935f74bb7fdc7c67715f2709e150cceff020aaacf88a1e7568191acbcfebd25b36b4b822b305abd43bcf6b7fb823516b5b3b3d4634becf7d0040daed420815bb95171480406677aa0b6e621f51ed2d2357e85c7bdcecd1d2f19a405d0b63e4bb578f701f4d8449b08845f230d539c7dc8a2eef94199d8c3ce42f34625381a5212424b44503e987af5b5b04fc6b8c89619c15ded91258688381089f4542ecc2b6a6dfc93b8a1c9b702bb881c93c70da7936a51192f0a5cd6e6f2c674fff2ba14282c7954909a5ebb8a1654fe0706c22eb00e77007da0c23c757a376c5b3c6ac8d63e501b6a80de152656958892e09ca80a1e2e480f916d254e076b2f28545495eef3ff5cc91dae3051ecc820b9ecd3800c29e5344744a42deb3ac051d9e31e27ecee05ad1e9975b987497b7b0e942d5330a24a79c7431db2c774d568d2512deb6a9cd160edbc9b0d411d1debe37f009e0227bc6d021510608d5628c8b436ea5cc280f13cb8cfa4a819a82df7eaf5e3dd1b1ab9a28a235293875f2915f20cf9f88f2af375027b19167bab2a2387a14d7cc60bd09eb2062ae85fe054c51e3bc34b4b0b56ce4d277ed4d176a0e34bf9a419ad7b8fd63c262fbb719a3a5a9b5becc16092799d0b5d3c6fc59b10db9a779e103bda45dd6b1bb7a966dd584aebd5ccf78a60fa65dfa4d843d299087105a3821ceba8a118d14f891e9a3a2d1a9241ea5a02e747ad0c66d8fd62f0e6282ff5f68c5787100d0149eaa7a621374e2118cb6564a5fff7444bc4f8f12338755bf761dae9c6114e7d9372c0f532f56a1ad2f6a64a2d71c9099c12d327a07ded1c106aa52d16234198a4b7f711dfe5d2e1f8e2a91dde4b96bf0048f8511934f402e967679bd7d48af50600b68698872d090315ca4a48ebf4e6f0ede527cdec3e82dafe9ea08b939f1520037bcdfd67ed128a16a669ede14813e66835f66f02013e7d86b6f5b1fed27b9b26d3426ef67770e65ba9f74dba14c8694e47475d25007839964ce5eb54d99acff1599e7db170b6b05b616cd8e4ef76f216b5b518b390c2a7a3cd0b885418f546d95b3c9a374d4660ac49552fd04c920947fdba323c56c04045b3d1197b250d886564a754e681c28fb4ee2ab32a90bc27587bb13a3db6d38be2add13f1862561d2c02692e4da29d960bbc67f3526067c4dedc448126259ef310f78649da75617d83c0ec96eb1459fc27309760c64ff77a318beeb78447650e373d5aca3fb2b212030ccc2f2d7b6a5a7de7339c14a41daff7071a3de680d845ebfbd94096ceba8320526247b33c4119a64cc705cbf13cee95da4194bb665b22a59f8c3d9e1e0d39724e5980eadb90c206ddbc3e3adbc7bea4721f5c716c803cdab4ee31b4150cbd6f3d1c5b52ddbbdc36169d860fb85088996aede5a707c9fd11b8799d57684b777dcb154779b744d0aa83e5ada91b69e4fb2147c0daccaadbe136a8f1167c4c002464eec5ddfcae37daa22ef5a579764c3041a78e7b2fa551afac06dd6fc580e009971366de225a8a5cfdd3fe7356f836df28a7af06a54c16f3851da2d1d87c8f93ce0d9b18acfc4098036f389138822d5e52b2931bd20164435e57f1cb29a177399647e31c00f5e3223f7b348d9286a8446c42eb191a57f22584404aea3d922f817c4cdf46d2c9ea622e6262d6f9883017b1e3079d02c22900b3510e8d88c120f1eca6d02776fadefe3ccf53fbd2094d4ee01d88f60fd2716b6824bd43afb0e41163c0763c820b395d070c887ab07c5860534cefd2b60b73cbff15f79af6e3f1467e342204687d71e4f9c450b2297409e2a81b9cb179dfa8b8f4bf1df202ccc127a87c73fdbeb4214ca1617d508162aa4c4ae42ff0efb178a8e57ac0f767edec3b5f03dcb6e961cfea8a7e4ed47cdae203b8410a3f7c336c224df351097ac9dae81e54dc9e6ce8c6551175559c504f19bf6cbccbeb93e81b9baa937ea6dfe305b472f9f432ddcbad02d2e11236c031e9d5f4b1d593eb11ef9b67f58a6dfbbc0526d96da402a08cfc7a4b4c15322115bacddcbac7b6d67350a8227404bd42d741c5de2a7c9c599f3d21e700cefd177d052d815202c2ea7ef72846998e1369a75407ddbade5e6d94d7a032b9b01607ea716b8ef227469b873bb260f0871ec4bea463749959c750e0646bbad1590b76b0580e6225a5c06e3ea6ccfdf3701de88fcb7f2f306f65a8145bfaebe23a5be891419c8766febee707c0ee6a3ce9cf499d31915a2a9fc7d7a336b44266d475d1ffc68c7b20a2a07a75028d521744716c596f70a1e26b5c740f8d4e6ac9a7e7c74e5f64ca0d21f3acf8f420322d20c2c556ed6382f242a1e1dbb82fa1a525203d1f649bd0670d4703260e5d86d90f21e918240079d4b616c57a4fcea363fccda7e57eb83ad8b518f16ec97bccc5501d4c1fbbcdf2f44649737ddca1cc907f3e9c33164075dcc9c80c45be31705c942362d00d328aeb73b88058b74fa9a52d019e8ac3ab0dddabf2c84d44e51e195bc2d1dba0b4ae34bec2809d982ea73c9695034eff7e5f75fc27a9e7f62d22861789fd850efad93a9815e8bed7d561a13c877f02322107100ab515985a603a2d47c76a7eb04ba89790111d2efeda558d9f577656f44981467849bfe0ea24a1697d298d2b3d4d78c62752b2708583ff5c3f636d8fce4e5a83c553fd541df104e5282efa1cfe66d630ce493d25f488cb978d59e94f18a5ff52624252647e4be10ac92615b68c2e5d72056311b1e44f46ca19a96e077bf6ec2cefb35394839ba254d0cd84aa5f1a5b046d4ed496ad5dfd5e54b0503b6097ad9dce157556b676e55def73bb4affa17b62564afa66e81b5bdedf2d546d5f3eb00f7df73c4d8f54067075c72e2ad65a2b066115f784fd3deec6196edf1fd022900c7fb71ccb86b9a256f42641cc8bbad68b0e0e5083850c22ae840354c55c09ca1f53f39b63352e355bfb1fbaa2882a2a4acdb299e4f82c93f2af7959e06b4acaa29b3b3ca703183c09eb21ed3f445e82d02091482bcf05cf2d0c3f5313766c2e50a5ec84f9890e22eb54bb5e05589e7cb59728cfba822e10c82ac3d4b115f441841485e8fd2f76867ac86a91972d80745591f7a523ba1c256e7bb5535bc269c0c76795ed047ef7d322a6be0c674b9b065ab17c7d09cf46595a8f725375f43308950fab15b1eff8958d701432f82b54af1f76259baf4a334946c699698223f6a5777d23d7880b0f4a25c50ba9cc5533db2e4091a5b6a37951adc178ea22ea1b13d9409ec6e958926d561602e54641bf1701b13f1fa2737f2eea00bf69babf16c044fa8a587841287bc8d3a85a08895cff34488c5de522bb2d95f4db7ccc1b805744fb54f0976d3801e89e5a9c8594a3d0206718050149b3da3c1e3b77d967ce3553d3bd43d925577c2fc698014fec1a46709d509989510fb1470d7e0f655c86e6fc03f1b6b011fd5718fcff4cba0826de8f6bc48fefc1254f31131197e24210e8a81cb0cdbeab903f3ea1eec376616fe4e752e25ca7227b00a4ff7495e2b112b6d27e68fd476ac6710b45e4f9e7904c1602d3488431ed9771fcf335adf941f2de15b998ca0cd7f6b909697074900d41ce8c7d559b229af11fb3cec334784d47caec5ebeb8516ba763a37d2fb80240f79acea1a805fba31e6663c2bbcde25b6809c0ce494cc7ae6efd74017138b0d3c3f763f09e592fae85e2877f7ddee9f4fa272d98c70bc208a402f586c37b1e2e3d60c6ead7193105be20897587ebd1a2748fad3ec659f302ed00a28db4f3bcc8ca6361e0b0aa92513d8cf41568794bdc4dcfaa30b5cbbd45a0730576b4371f2c017bef72d991e6196aa451ffae0bbb0b0c43bf0f13e5a32974d698e24fb9b7d06916ba31a0738eb6ebe32d94b727a1c736a8563a7f1c2726c0a7c750f600194e77c04c7da3a40ec227e5e17512319299334a0a4345f3bbd62a632b33358eb60ea40520e761c7d8b3b51918015dcdffe9a8c535aa06e0f3b008953f199cca00897451d1df59439f1409e92bc9e8616c410d9672df4088413ce1ca7d647a569b576f32c9f5f89ba45b9cf2a74f50704a27b82a5c73714e46e54c5f50b47c98e8f10b3493abce54ab02f4b21502049f1c165f1d2cd717a75731bed0737a12257bdeceb3a96158f2f5a297a3ff729322748558db9eaaa22804baafda3035b970b689205c85c716fb16a2fc44b1217aced60d4be21c4ebf44c1d895b92177f0ff4b78b67bb34d96d1a09c9910f48f39e8a3169ecd1033bd8231241719b1a147458d35e7bdbc55471b05e80495142c4ef47e29c7f9250a3b64b5259a688b523ad80e393a7f0b8ea63bd92db54daa792896c9cf5df2c532a760d045961208fb3a2b410b355c1b4a32b87cc631a722066534186fd7567b3d800b150c90c2a51cc3b3c8245ec176288b157359e04e05547350dc93ba70b18b53c7f5f320e6fa276605f60d1d4ba6aa0de74f51678eeed3d171a8c37dedf2cca12bf591ccfb72bbaf966d2df747273f498283353df629150e1aef87a83ac941e6bb8660db7c9939fee9902f83607258ac8b917dba205e8897b12358bfc3afbb92db3ac8f2e6f832e274015a381402a6c5770ca38279f9befce8e6af2b35107a442f856299c6fa36e8ca33669bee627a22b9574f2d8f8518ac069bf380eb960e690cf8a6469929a67060a8bd153c1c7322e703c8f1cd7b3633aed5de47739af87018070c6fda011217bbc3c63a999af2646484b995a06688125606c7e559b9c907c5232d9c061afa5d50272a728368a855d67c998fc4b19ed670b138f10a5ce08e88ff5251b9d1dfafa2455263860fe585a13dd12696f6eadea367b9e1020eef72f7de431741b0228d46a0c6742deb3a62595af91093a0ecb9429cc33bcd3a3663864248534a40738491bc0f2ac795377a635689c4473a24e4f2b2dd67e88965beb8ee0a9c400d43143819850e0f983d4c53a30bc82e4d13f0285c610bd056fe130423e268af7101ba9e2bd084426edc36aee2e772b5344a59580c068e213d5fdefc76682f05063fe638756a242c7394f7d978b58a789a388ef624367537a70b9106681485dd577e358b88ca741a60f7de67e6ee45e4e95f1fa7376937902e91c7b67b7fd394cf1d172bd879ea98915578deb00a5b969c2e69dfd8277bc73e82e19122f2beb7e7cd198dd6e0fe139f6e45a2569221ea4d372c0468f98859414f8d0ae1259dd33beeab2616982537e582c3676d0e3f6c5709a4b97c4803a2e16818985871076335f24a991a280661fe43807245d71aa954068273849b6450995d22dddb7d71e45088763b53e9082e6410fb7783a53a0dcece33a7147c20ced3af1a2ffca363d33611cc915683b0f9917b92cba8c1142621b136d8ae62df9a2ade8d233e7b53bc311eac3f946087501103f50327e34f7ee7601a9ca4d7d72ef95bfa3c136dd81bec1f93aa8007f1de6d2a809283543264aa5b4d47ba53de19e9b7cfff0e03575eb1852146bbf286d1005fc41e3dcc6393c4f34d7e315f2ad756629cd090d468014bffc3b8aab8cce465244dfac9945978d1c8a9b4ac6263e3d9fcdf554e4960bff5dff954deb32a9526187cbcb9449a805b6bd07fadf60fcbded715e198eaf7c759b640cfba8a264fad9cded88f759d46bc2d5023a89294fbff91cf2a033193c3e213287de09656907621e2d2ae7fe8389ebdb7651ec089f096ad69830f95ab4229671ed3c37021e40a68373fb8ebf1d25d6d64a882f855465e9a738130bfc4be9a22a285e5901ed6f4a03a74114240a082ece66277b28d6991e98bb8f8f87685aee641f8c98eb3d5af9a7b145a1b5b2fa99ccb276f77a8d6db0b007edae81753f2227ba0e1c4775ca5976794f5bfb7ec2bfd616bccc02e2ab48f805758f74d95ee67be12b0c9dff871278e7a76d7dd42a4af77a4321483b198d769d6e5be7fc7fe0697c2c90764259cdb5e494fdc31df8df34c6511fd501812834b8223963466cbbf87359d258a6083236565f3456c2f52897e22fed309da9c03a3cd7526f1fec1d31aefaf7ce935be802275139bd29e9cd27b625b5e17559fe8e13d6cd93efc6af1a16572a5d711c98213db03580bc9c76ec2a7a9c71f35b8a3a2367d3571ec318be91b8918fa811e99c82c44f28e2d5caef2778cc677e760b4656d18c4414ab0022086454eba003847adcd7b03c025e713793656d4b7d7129b8925e1fe13946115064a49cf9c2b910c3352f7f4486fd14cc588aa6a65a158d9ac154b5b6f65bf14f8bc0914274fd367f7415e5c9d57b5bb75c2fa0ff7c2adff3cafc754cb1b4482767005a4d1f959eb781d10a52579fedff899c83de4b78c6cc959e882ad317bfe1dfab20a22c4aef7344ab1567743373acc51876cb2fc6eb2c0a8215d9c54dfd83da0b0aca01e4d1b9a5eb2e9094fd94c7faeca14f90ddf61b11ef45dfee1eab184266414c082bee938cd87f561fc7f9570f612df1d6868ea2922f40c6b55171a5fe05ecb0a8e7eb08e1bb2d407d574964ecbd423a69875bc775882d1584b0f634f630347f48df73208cdc63d716752df7794807b1b2a80794a2433455c201e3cc122f414052dc2ce4758347a153eb4d169e4ca5de17b3371101a77f0dd60ddf763a493a7b2da6be5b84f801289a8050cc430f4449016e95457bfe33c52a9c933956c747b94105d28ea282baf454fbdf1e50da0a7bd9a3c938f68e7b062576a71d4ef19280f6c11083b56b9a8bea25a116adf522fb05187bf25ba17d562f62c22a0a0f405bb4a11f44a6f9c877c2c63fbb42a8b251ef96527c937d6140b0298c6972697ccfe36ea8d95e756d4046a66015f73be306fde4f6dd856a50491093afe16f476c66ebf05248c427b06cdd8cad2db5f5dca199cc101d18b272fbb868d09ae7f038a734efc69bbf56ba85ee41cd0a6220c6aa2a144845369ceedd0e709a9dc4ad091a2633abda394bb213e38e69b4e802c8a91885455bc66fec777b73b2f1ecc607482a83aa0b194fc19c233929342de30b27cae7b06aaf7496526838c39e498359b8a6a96b3847a80faa160ab4911b0db6acaa023077dbf312f53b8873adc12b28f2046b9568aa9ec3c424cbb3d399c7f2be1f9d6e8c313388e85e2b6a253e089b7faa92d0a42c7b0673b542cd038e58e7e7918211b0997e21b437e9510ea760dbe602e6c6f3b485ff3d3138ab28e409bcae6877c2ecfb1a04e0308ad071e47c0faf722e1c5d2b06d7ad0076f54a82229a9b0d4529473f505bf4afd58e55dca4606364347dea7744b5488ac1527150eba837e6b4edc94e684b791e9334c27920f6893fbe8fa38188c29838e46aa636ab0f095c8bb77a0eaafef6e48c69c0a237f8a96b95fa8f3119252470a5e6f01cacf69ad8942e63685e9cf36988d6583f328e4c508167b6704107749bce6e58ea348670c095fb8b44cb4cf8154f23913959e2f956497e21244690112225a9e5888ce6157d57c5fa8b3a378e50a8f77476f41938e5b7e6d73671e7826b73409fdefc401178a235b923f3853c825dfa07df4b5e91659148e08f0a354fe07fda8ed5cbb9ea183df3cff63e5d8b1334d5545ca6d78d3ea04b451559a101e81320bb53437b2ac4f2a644eb63e7026bf63063d64cacb3d8ac980db2a5541feaf5ba2d41aaae58e687f621e9a94d29f26bb23a3386068b9b7dd6404d38763150ee4fec884979fde5c58d6dda5ab488115a04e35d9c0d9ef0daaee7ce582ebf81c687010e6805a029741030a5bc46a82e8cce663ad6e8733d8cc8091c4ea452e5450c73bd4f7ac91a5c2a7232182b10b3cab7c9b47bc093eb5ccbae21620171e433834a7c45ff012044813c69b58b4806da6716b2d5bc84630f60dec4db6da5e657978f3293bccea3f6bd9532dd8dd9918487551b2a05d00c702ea2ed030f75537aee49c982dabb0b38878675d6594aba92bf8cd9c3c2fe4d46de0184201069936430802858814dc0d387161ae91823ebcab6c5d3e81c9790581704727b97090edd063c375dd80e2a8f644d095ef2ed8bf61507f1e13b223c6f82b29d5ccdde2dad1886dedb0885b133c6332a7d0e2e02dc835b1bf54627b953c613ee0ada6f569b0d650518383abe8957d1658d9571b745a9c7396d652f6ecc8c2f4dcfe544f2718de2945d91b6b757bc2ea3d8ae3b14f82e563391c2c1c5a27c0fa3f116e66af5420473f23b800666a052caa4821680bfbc0df1a98265259c3dbad6b996dc24f0d1d38b1f5d20117ea946c43a39896360f8f65cfdd0a3f6847838d06f8dae8a29e557c22c201f42667f1177e2fa1d26a48c185ad5d204a120d492775b23e5036a24990160ab0400e8cbbbcde4ed582f53207bd478b00f8c39facfb5c57e08f67936a031052757b2ca354dad873bc5e7355b28b32f934d209691f771f4c99fcd1fc4743861bba1c2d564cefe140ce9b611e626dd42a344c501421393312a33ef24761e00bc906897d10146aad3874e05b1687d3cf9077ee440b52902c4c94bc450f3a56f60cd379986b3be980cd57b3adb8a36b79be883e31c9144a8f5cf6fb46be4116f949b9330bc233cb0071df8bf58f45835726dd92c5d7f696c0c6427273cf06be79f2206c43af9cbda0b884efaf04deba0c4bf0a25cb26a23650affc858cc0babeca8917bdc9dc70fe623e04556a3ef8dfda059e382d2ff6ee0ad9753623fb06de5df94f83317435045266a236906e85dafc681bcc4d416e7d82091ba2c94a572ea099347e3a6a21d42429b00728869d7972100b48f10510c9006874324655b696da925017ab663c5720aeb72ffb2d45a48324f516e222e6bbcc1e0a4c61c32afe550b2bb44e0f8f738d1e3f16d10c874378cc629de841f83b2d52655ae33dbc4e572d4bbfe90e2111b5a0ce2472ca6a3e9932d945ca0a4c326d2d0bc2956a736e291f3a9e450afb1ade5deec1a510f67d2e7be2765224ec86d2d686ee3cf35747130a80bb2aac2374517c2655338634e87fd205984638e021a5755e44a37f70bf5c16a37c609ca3095626fe48e5d32b68d45dcb136fed2ee92d34192e91b7c7bf4e6a2d4bae8183bf3483ff0281a0e4e37444bb5095ece0c8b4394112cd4263302f2fa68fdd04c98035bab0eccf946542a8b05eb580ddfea580ac5d5a20ca4cf8488c94afb5cc7f339ff49a6c9958b86eb8c93aabf7668e67dab6f66d52f48b01e1aa8115fe82acc0bb5843eba593e54eecb6d99bc4329af80a7f93b32b6a273142b1f42880cd590ed10f35d2bceef2c98ba0c3ebade7293f582ebc9473d42872b2c8765003568d072940f887a611e9c9dfae7e057b2e44240cebfa78f1d997ab7b178ef54ec450920a1412742ba3d1352e09944ff6aef28f6de0d3c76e227bc4e3c7c47f2ac0aa97beb30dff134db3f4c1d88d33e5103b68c432d1e9b257dca43300a0575ff2a4ff8b44719225b696f0e044ef1711fb2797590c7c47851fc235b2e9abe3b50145b0baefc4942a868210d37544654318bf0574945b47af22365eaaab6c8cf496969392de906deb67803ce1921384410f0a985df2f652f7093f07616d6bbae3589d905d365c842dff965c53c3e5dcd38710395b4fd5d1267ce618205831d64bf064906122b143bbf6cf59713241d5c328dad1b8d3812a0422327a2f944546f405f379e8c816115cf530198304afd7d89b6f46baa581c759a42b13d6482f74a640503538501356d7a4c385d164b74ad988d882aaee5d0eeda9d9cc5d9d78c6294985aa99e3307bf5aa8f85a378e2968f961b6bd0d59e6988da458e0bbaa7a644c79ac255a9f6e67eb09c024068b723c26e42eb7383cb3ff1df763f2ac7447bc1629563b3c9ec003a5df3e2f15dbf5a39b854e9dc1f6cf7f15f74c800eed8ad66c38077fa6b9b31f05a9b0ffe7f80a1be1b5a4c54d209fb50034812d655eaa4fc9262e573b989e26a4e9c6faff58461173f5bfe21c42bb2d672f904f32402c74a76449566d840796ee2ffec4be853030dcd5fe68b1c59844a548f85a184a8801a182d6f1af34860c5becb6d1c7f73ed686d6fecdc031cd97653137f269d65373220255bd93027fd378908d968e36e89f0c691f85aa0fb1920158cd9cb96c0525b353541e9b767ba8bebbe1a783bcc3e6d81cff24f1c7eac1142027bd897423a5dff630993b18ffe8b8ef61794b01373a64531c2019e2dfb11837d4d95ca71570028b99b1f462830fd17b8b8046acd9264bbbe51b94f916ce88006364955d8110c553fdfd59db9baaa310ae50f9081026f8b7e85be5631685de0a4213e60fcd14830fcbefddfca035a82f686fe4ab82b8f5c79475adc9558394b60f3ba1467fd7d61f81ede33e473d4b2838319c2f9758cd6b880d30946a2446b41950698a0ff73903be9c1c28e72e26ab9c4a81dcc482da242167204cbb046e54fef6a152f3df264ce05eeb450684a52a132f386b90c3b681ff37ff6ace8076492e92db39d21c285b85cad30b2bdd51142b3422349297fcf58fd420672b44e8e136c99997011aa9c01d4465e3dd94b50a530dc1c0307be80f41e025da47be50bd95ef4f033777451b2570067782574b6d0920a9a700ec323fb3d0922caa49284eca987df6bbae64bd1cc2573eb0718eccdbf14c516a7555f76419d7e6d991ea155339a8fa242c933691afba91fe8fe99a4a142c47f383bdc6c14079914c151091be675285f77e4b07f2bcb329b31ef665b1fdbc0332b3e43e59d8f9a4784f26546a85fd12bc1016b1de6dc36e748b3fafc2029e0b8e6263ce9c47caa8e4acb5cdf63a2b28d88e60b4a3378dc8c9712ff8e8e724d98d3bb6e817118f0727ba297ecfe84f40d345c390ffae54c1184d41a1a50ff2e5b58c482b48ca9957a7f40bd78614ebf332d2b9d73236caffe79c0f5a74e18ac87df0b1f8bfd78c02fbf6d778874473a88db1bde7e97552ddcdd9f383d7005efa6cf56ee0caccd9a17a1f06d261fb98e93a7f4a5383ce8ed3218398be49e0d1e3f906e974182f04bbc8e9346594aeae2dcf77d99aafb6d1888925694a5c07961db8a1bc1326528faa6ef1cab2add235fec347f63dbbd2bd567b2befe87be91e201252414e63ebecf5b2a54439fc0ac2d4ac7c3aad3686b4d55e2386f93809dc639c9533a65f6faf365a903b7c3dbcd737e160e179be575a7dc8a8e8fd0eee5380cde6ed8b773248e4cd2f1ae9b16ce5a118b2b523a1d910c8410860846f1b15e00cc3e99e59f84c7960fe5d1315af6098a8de002b8f707a4d4dde97ffd6f48609ffb8b22f56162c7cdc7a9c88c8d8fa87183f7cf1e5a1e9654597e9ffe51f36771d31d1ef2a005b67861033ab499df614fd7366373301f0b8cec0f0d5080fa9bfdbdbb33e146b6bb2047bccfb2642f5aabf06663bf60522a05ff6274fbe3a523cb1f2f09cc3abdfe4ce09c308dd8c6bb0d364f7a0ad2ff1c46f8417a08613b2763623f49ba6462a884946a054ddceeadfd11b84e5d6e6e08d74172c77ee406d14eefb49bb4acede151cbf0f5fb57ed5804e96a87bf1ce7174140bd0465534c47132d55a6c1faa5d039edf4a99d330ce3a9262ece39c4b1710b5fecd9c59556b13a83ec13e936d39ec6623fc93e5793767530cacbd24e153dbd05c5eda7946c384b5b3f893448bf72809399fce3abca3bef70062592a25ba4e09912e91237d604cf1c18b1ab18b175eee6c9ea9617f8579f4cac8481a8cbcdfb8599740f66db3c4e2d3d33558ff1cf98c4993c5e8367f50d2d8292a849ace096302337a509c4084ef876b63b93c6a70696cf9a44d75d3bc27c52f40e6b4807390277dadc09d99159e48de2630d7a25c1c234ab4efb2351459fe255bbf7e5686d635f04bc4c62fff6594861d7e6537350b2901886d701601e00fa5bb8d6cc2bb9bba15d4ebba77aaebf71d89f049ab63bccab88f4543e90d60564ae0cee4579a672068e993ef029077fcef2c15196190b7a4ca49f582408f418e7f7bf29977abbf0563fa5be84348bff285547b491c147233d148fccf9f100a04adeda6e0c55809e59177b21acc4c2a846a93814d1d9772e447fcc9906728205560a64a4ea337de2d6bf2251b00133e2f2979d5b9f8723052a8e5fa593b403aed32465b57a3b3b2597dfa234d8126616f2c67d7043f3d40fb6e84fdae8df0b0589d3e688049641d0621e04b46b1fe3aa0fe0e03b054711b4b235a41f4c1a20713fc0ed05d06b174900244fb8b3523308118acfa42da8635ce41f665b098dcc5abf93851425e346fa399a8b27f6d1dd96c06e50930240516f164c9e7865619628cff3b39d4d265549d428c1eb7dc469bee4346ef0cd3763550e64545da9be0644388881888e5bcca09b75f8eb90545fe744842ea3d6b5217795108ef21ccba514c1fbf6bd31aa3466542a380f77a84878a9049a9465e1143b72f8561f08b1fa0134f41a257d3c1303c8ee893f79eaacdbdb5fb9acc2e3c30a6fc3b3ccb3978e74581af6a6bc39f4dfbf6af463df3f MD = 1a8b75dd663038289a4fbd07a51bd53c4b6073a3f0a9b9f91350ebdf095b89281398fe773f755df77956b1a57379507d Len = 78640 Msg = a1a05f1a7861889d2fb94d2b30f710ad8d75136944cbe0d7c243e8afa58d6a47c6b4961c7751f3ae09fffe92920e14c2ec7c913701203aba4629d8f786c726d3e128edff14a66ecdfb3f00435445fa6fc556d3f9218f88ffe7fd3e1c0b5429caf9e4acebd8c8c2a20b619c67fe038c5b1fed21d82a7f944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c8101a6bb1e0455c4feabc682d82871580da3f14a24db13be76112d842a22b11564f30118ba11852be899fcdfc4560f04742a2c28deaf915a601da734c16f921868c106b9ccfd5cdd2cb6e56280547e7faf72644d02844a86d9bda98c9d3058adf5355ca53d0e016434ca2a12f46ae551284342c279a366ca49b7db96a4ac2a5c7315ace4f38d9d48669d72f809e06c0045646e8e29540cae18d4e459bf2d31ae4a2a9d7fd8c2570f2cf6661aa5fd3d16709f8fb9fcdf64bbaedc6dddd7f9942ae33cd87dd3f45843ed9fad82b10a7d1b10ba4d4cd98b977874971d2bd2597c59a41304e6cb6cc76b105ef038164f57958c7e524ea7a1cd6ed0cd9d4a9a9511c1f676cac3aa73cd10fffcd742ba14f10e4eb343c750692d232b45944215f57aec422ed21b574f92b9214109aa87a1730dbd21cbbfbb2be021eec8ab1c2dc1e062ee04c3f6ba483deedef42f78643d061b418f903fd02f0ef07f1e8adfc9406aa964bd465cbba8f7389edff0b23832d2bf42c73a4e77bcdd16480fd893d0bb414b0a24025642b5e71dc9c8f562edc6fe81288f72f5981c781daf633d402c7a8cd04a00a0eb37b93627c778e68f6a42b2e95cb0e03b1b95058d1ee163efc4c574be8b18c72482fa0bde01b76a4297ee188044f22b28e870adecfc52efa880e4219f343520070bc18fc9dd4c29825c1155cd491cfbc4e8f597c4b17e8c71481ebafaaf1f529fbb55e970c401cc57a1f49458d3f8fa18016bec9ca52de05404bd6858639e06f17800425b1f9cfbc94ee0fbaa4b4cce2b1c1cd3fd402793589c075240b87ae4072b08c21354e65de14b1bb24a17e11f05224e756eea334e85f845a13a167a93e8bdb6901fcda79ba680ede2c0a17f96aff94af9770b1bb9e401be7ccee568bc9c1452d507f0a75c21d6a0b39550edda308b5888a00ba57b7c9dbc0c858d0a062c1a24b85427ad4958337b4c508bf59490bebf4a72529a3c56b58578e676281a9fb573628dd9830a5581c5d679bc5d6cd87cc9667448c1a6783262e97a098c9ffdcf89fb3a6def4620a6c778994aee090facbc052f55e45fecfa9b87c7acfd3e4e4facaae34dbaa5bf8cc95b379d70143d36e14e29e2c90fbaf7787957c8429f9b1d259711e0acd13c1912a6db1dab346a01806aec55395fe80f41e8b2c62469eb213ceb4b8e8c6f9e37ec820d3267129ff7e1800018fcf6802c3dfb5e0c6b45474338ce1abf242aeecd9d1756446b56e4ff4bb9eb91da7e8935b5dbe504dfdab66b636705db3aa733c26e8c3dbb80a73f01083d372a9b9c0c12f1afcf1547d1408103df944a97917500a70a4bff6eadbae65e336b4a06fa10ab39a0a2a66dd1ed6d615d4f75038ebd6e90b80678fd115c9496c31058e5409de8d5d6e8211783c617c50abfc2454612f471bff88ef47b2df4f717adbefe16bbb10c7828ed0e8ed267760e6b9a27637c7a9146a9aa1d9236eecb54cae3192273ee28afeb721a9c1a46be90db666f8a03e83976a0323eff7e6b58a5f02f000fcc876fa2b8180252a49ae3b8988ce665b026b1776590206a0d51e830a50a7a83cf642a7a1747905a7a4d2eaf2976549c8a1d4170802a8b79ec8ac11d74dc4e26836da05e90678a5ca445e79d168a81d799b331897a6a47d722fc2b95e20d45a2f08b1b77ace0b9ff286c56aae83234bde6d1c8ecd9b71b2ab79170c07905279c1ea4e1ecf21ae5ec10a8c3fc26d537f678604fbe2878d01bb42fd7c5c02dbcbf16a13be6eb7ed6cb64e375be58da502b58460e2aec172e5120c0a7cc3febcbb0df6b718d1d7253432a04b51607ab48048c6d4d55affbfd75032b29ff7fa81e1a81e8cb08125f26fc6cf3cb2cbaafe6281ebb546af88c052e6658a58407cd7ba30502918052ae159f3198ff29f94ef440151a6a8f50320e25502f62835fc0abf372a00a1c63c5e9d482db98354cf038f37a71d9ec3e55df01c998aa2510eb76b3d0aa7f05cf0e694266a4e0773cfd7cea54a7e7ab4a5d416bd97bc391a1b5a38b270738621eef5f92e5db1d1850dd86ccaba6ddf1fcb2fc0b89c0f6f09a85fc2280a17d5cd6d2916b0768983f11f91e42885503e9ddbcd888e04f8b6a84c54721e25f961b811ec976d533991505b70ef4f29ca0b874e49d8be610ca26e6dc4d2f5629cac6a63bcd5b562468c2b6801d89f163fd89499012bba4ecfb4d4832d6f5e3e76386ce9165c192244c6dacbd12aa8d926382e52900c121c96506322faa1b9181a78280885b5092198f3f6dd4b6fecf1218cbcf182f446691517a2d3b904868e0dfe3448876b15ded775f832fd12ebec9648d8fc467ed792a07d1c0be512471ea52d0a2f97d8cfb864df576342be162a091f0ae947064647ecf327420b558b3884a722343398875ce582bcc4d8bc0c47fe61bb3f211502f73f1c5d0c9848c36a30df04ece724ed2abe2270fe1ba72eb4faa3726451459e0f3b4b45c2186670321e473ac02ef861a073111c65781a0dff6266b90f43f2881e56224a091839221ec1723c3487ad756c98e127a19a6f2a95ea2e078695b651930413f257f42b598eaee271e06d9e98dd94152b28ef10f506d65bd660b2fb8b1be9a2d72548c777105b1a842a5d565c71f92f8f61e2ca0dc0db92be24285c75076b4160f792980b323a7cdb98e36f30c82c92cce311d4c5625e4527576233dfe40d9218554e179662e19bf0a28c43a65ed2d18c32f8ebcc59d2f59a60fd2c0c3044f765b4f7c0a930d4fa5bdda47e3d94507e15c814598315de269fe755af8a8aa5f3e19d1c1da41a891a85a0e869571739fb2228d0a87a34c45a90411838fb41b51a14841799278e727f06a2b4af9345f3db19cbca7312154a0424049152af03d6dc66f096cd940b258a475995bb72af129065276e23fb65c3a5b3a86d77462f9fbd616906258a2f16eed01bf81765b12aadacc248559674d5c1d7b319212143842f8c53e23b7a58caff2980784ded0a80a55932c56263e0d4eb08ab00eaf0ee08b55057b769d526b64dcc1d82b98909c8f9e2ef81e4f4285583bef6d13f156da1e145daf25b2af77d4d2059a3f4ca3d782de25eea47b7b9dc2e633ce6980f60f435f5642f69fc79649fdeab689a112402b3c0178b253f23ed3dbdd3dd705f666425b769db20c9fb10984fa92ce40e4bed1e148fd0e7fae4ed43f752127285cc66232482621a041b15d90bd97d9d1213bbdf485e581a6b7b60d3d83e21f903219ec0c51460a04b47c8d49ba2d71fbd19e389e3d97d370165fc6fa90e888e6804628101b6536e000fce1d679bd5d66fdcf8807fa7dcc87d23047a1239a29d14c355e672dec6edb2e17a16082ad66bbadb5f55643fe3490f310d758c562ccfaa0ced6380f41789d44b7140e5e6754a2e73ac9b4a182d23682e9c047fda7370883f9d7ac4ace1ccf4dc383099451efc2b5454a489b716f1e86a2489853d233a4fe9eabeb65fa24194e233678acd5fec41ebfc23bb934d3f30723b8704f49887617a5981ce82c562251bf75842e5a4b4f2b8e77b48331c65b0e5458fa7a75fe25d8f6e7685bce7c935d7f8855a3489c0ce29bb2dc82d110fea11d6f5b5bbe5d5a4979e0f647475c137b4bb6129306baa34dcebada3d7c7886cb6647be7b8d6cbc7117caef34ffbf4bb20b49e484fe6dbb740fd9d73c9bc898911726496048f4f458b6ef7aa85e6ce20aa787f200977cfc5d4755fb0894c6dffd1855249459bda9063f95c02dcc2d818b07b9658e39b110125c776d28d13b0016511c789f268f84849b05e84ab1c8d03e132664b74cd29c9b38875624b8eea6e4aac26d0719322dd9b0871b887506762ab418180138a84bfec1cddd85b3a977700c912a56986d4b0d6862816d80af1c57d0d5a8f666fbc245e1902bd229321bc15dcfd8130d0a8629aae041833a8b69ce50a63d1e3c93ac787f1a679382523bdf87c59ec7dfcf88335d4784520c6106961dd3ff002337af9d83b1ba5125d17fd370bba5f97685f6366be071615cfb9ab71da4152484b173bed49e4c927c778ea402f814313af47b37bbf33138931fce3a3a61a812c5c7a1e25c2944e1ee0c115a23c614f893e3bd4035c8eb5f1a964a265b51df535042e1120299cbc3e357affebd6bcdd4e91b6458c1a6c85f5728b58368bde36e8be9da55ae3808c2c3211197b7306650a465198847d7f0beb49cb85a48eddbebe08635b3484c2465f732de2df95d08f12c8784d7afa18a0798bcfab2e529f053b6df9934b91e4634e552bfc96b3ada41e9494c4de14dbebf6b4e249326b94a2c74beafe1e7f697b8f6495c71f50f05c7447519f2c622b670941bdd05f3e4100184e91fc1bb1c3f7892de5c307f23b00ba3d195cf446a97a17debce1134f46b574d2890dc1dd765fd22db680bf1bf04966f2766eb446b8cdb8d869ebed12f82b83745ab3bf67031cd0c06270c332b29ef113d344eaf6fbaa52cb3f615b3de7eabaa0617e52c2fcc72ba27423a2daf469eefdba8016bbc4c87c23c7e1cc04886b90e357ce2a95c5e749208609dc893832c73cb690b629a6809b7e7dddde1b7c368cb98843b533f0e59fe702a3eea1e092004d420747a5337b4747dbc60ff715c4349f8d5f7142005ab652647247c99000209bd75459d2ee00f5fc5c2ab00bf7acff11c171ed3466bf12ff36057674c905bec4f0f85b2728ba3e18998c8cee9459629cef3b978fa67b4c39f1de0917fdfb11452973ca16862f6638fe5bf4f37e41f5ad410cfea84217b8bf225c6e47a188fe98eb47252588a924ba052966df180f2edf71868132cc2ceeeb421114784617ad3ca0f30ac892eff028487570e5e409848ffb08cda3a723554acb8caa1e7e2fc3ad0507d994574c3f1032b0a1cc74d98d5b4824427f5583925a393f8dce9c59c86661e6201d284687fe5e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca79877613f162621cadecc72144748ef4956836a9aeb4d392ed4a576e640211dd82a57317f04418debacf06b1afe330430ae23f2b524991dd7e3e82d95d69eb223505e9f2ab37e0ace29ebf12e72b85b84d3304b814c2e4a8d033ecc906fd7d81dad05f0ce7e1c16e6f827aacb4f5953ba5820db9bdc7d5db29501ba72967cee3b82d5ecd6feac30ca7a2c0e7dee969b55cf7e39415ff6b5ed2bd99d98c4fe62e18456d9d0afbee6ed327182b2cae080cb8bc0db3e413ae1913a3eec9f85bce4c424014e47fbc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26fbd71aa6f84086401cb7d632e04d1b0aaa6e8b2126aebfe72baea700a66c67b529a4ebd3b0da8d7b87af37b7d542ac706b64bd1dc99b9831449dfa9181a1748aa56ca31257bd8d706a33a5eac44e6f45c19f2648860fde85146cb3f4aa02f007fdb2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d2c89a85b02f9bd2ba3293bc5d3d4c1ddcd61e9339db8ce0bcb55cbdd399a854d4e6a2b5d54f3fce21fcb0a35f03f3e2a99e89d46e17fc92c29f1cb5950b60f11d55fb0993b6ff7a7b26c1e17f33659df6c9717459d1a8450c221537cb232bcb10792c0767f15b463a234fdd4a56019e58f96df9a9a34075ddc0becae26b591162d28e25ce78c3dfc384a31d5ce6686224a0e7daba073583dc0d71d5776e798268e4c9fb33d7d9a5cbcd7428136efa87fe42779e2777f81d6b6ae6fdf6872d8ca74247ee4478fd1697602b63fa4a488e4a7085ca6e6018a1205b869aec5fb59eb25d80755ce6bec0dadf41779e22c2d3ad9daae5eb6a179d7f71c932c542d246fea91c26f99b8f22eabd4ec96b6319f67c3c4f574af06580fd20375c2dfad40400b77389a721fecb6b6cbbefee958e755adefbb4f99d92ea1df9498d62c26b544d0b1f03f1f48e18c17011418434b0ceade8287573cc1047566f883d2053e8c65816872c469dad998169d764e8bb21610a0a6e2f46067e173af56be1c309dcc8965c34793187eddc2fac86c078b340eae3983538ecc72cd8301d7d21e75ec7d9ac5ebf612f4dbf3f20da97fac097afbacf240628d498bd18da6a3463e9ed3a77fe90707abc49a2610956936a3ce2ce5f1130697599f5af379e4e1a2e671f95320194003c552627b04db2f1a55a2f1d467e4fc7b5a96863d2f04b96f7db80789659dbe71c764dcfcb62724b22a4c71d1f5ad4b95f9f5b8b7974d54336b39a44f36bca8d91bc3afb00fc16f868b9655e383b51a6d9c8697689a09da7917bd79af7bc026c32837849ff5f03a1ede464513fa45928cad0fcc581e7e73c6eb0b2eb01cef62b8568803d251fdaa038c25e86840a5db799259fe8f0cf645a44eed6a5a0192813f0d7dd3500c30e9bcfefbe7ea3e1d1cbcb52cd6164db77b9aa829d5b613f0aee1b5df9d210cd11fd19b90e9a1dcf57dde7c50fcf4c7093b31628818cb38530f25b676084e3b2873cacaab979603742766518c17316436adefe2d2dba25901cc93790abdde807d0e30f51699d099e342dc9ba9cfd60b85fb5f91cfc5415f430eb3646363d9c217188b83979657878af5c9c170cee9a43d4a06d7467fb23061fd0ee048a348eb3fb861dcf73734b6b169b42da6b97516a7c56e1d01b1fdb6a3c02b56832532e23d163c68fd236e0da0c62546163b7f4b0b911ec9c60228d75180922cda909f8f595ba38e73020d739e33a47487fa112ab1d99e455e1a3d7db264cccc168d97dadbaf1fb91f7e1ad2f5d8ba1fc09e329be0c377f791a2438f0f95609cffc323ab0a39374ecb3d9b11ebdeeeaf8ad0eb86e1773049264243f5b03ad6065cdb4aea2f2273b63de79b18c96dc98cad3843d3fd1e51a2e7a14497dd7cb770f77c157f92915b593e251fcfd7acd21ff17d426b79e062699a684e5dde838a44964f8a527baf789f959f311e5cc491ce1e47f034a0e4ec08083e692ffa76d7e902fbb44c32a451f10cfcd8eda2dd8e02fb405617b95377e6f9cc9ef57b7d27c703299853fe976eb569e41d24ef1d5224510e7bfc0b54896b35baf497a7c200466081405029b05855750106ab8caf649ae85967ccdf10acff83af74fdc76aedcee3aab32cf9199637f8f89e6ac1b94cce88ca236d7daf670aac53250f22a073c7524df9cdb7f7b0c5ba74ea49d5649326f908b6c92d5842f4794f0fb6028a1c9976111b1daa752f65821bf43112d7c00c02bc28c73733c625af4b3ad8ad506fac179f20031cb89a811995c308be3b5be76d8e824ee2697a0619eeaf5e6c1bf469fd9e106653eb7980488b5fb822b7ec1f0025cb487822e7fd7ee1753187133436efb7f330983455cad5a5d1278674fc1c842a0b9c3f859373a5cc9437465fb67cb692d24833bbb4c7888a203f31991245c0444a3280bb08d15755155af12802a41ad6b4966ca921df2be354e66d4fb7047e1c91f282ebce7d5c27ff81cf95a114e32ca2028b26217a8457760680be72c0845ae7c48f3e6be17ce85a9429cf1a36d93ba374d7593e005d8f8c86b30dcbe29ba55590eddc69637f412e7a47fdf571c4acbfd4996bffd97c32a14e4e654ad08ba5e23ee5ec506d2cd9841d7148bb2c6b26fe0a1a84ec6da9e9ba4699ed78f31c0396b6bf97a6664c596364efd8f3d1975269fe9fca8e24ae5ce156dccedcb3166779e0c304f5b6a768d43708d425c710d7079973686c6752321d665e2fff79407894a4395cc4c405afde7e0664da769e5fe1c1dd840f9c5c14775e683967ab63dfeeeb68c69cfa2ed589212fb29846098ffd5f2447fd2d95a9f52642139eb347448f9b996b04bfe983dd09cce3ea9f1811655c91d8c080c59aa2a634e72cf7b44d809e1472847b0061e31c242255e9958d219e6c5fe0ffb48e83c786da97e172a5c8da2104a4973916a2438195638c46aa370ffd06e310292ea26f7f1669d748f26f390849ed795d4b226729649bf0f311b1968bf3531ded22068768c3294300dd7ea21068e68a34a76c6e65b8857d666a961a604eb78dc911b7f88908608c600dfcfc828a183285d387427db9aa9c665cef85c24098c882a3bea82a0e951a312bf131a6d609da1a767bc9b98e91b3ba8fc3befaf17d36e381228193fd50553ade6628c47543e8b93951ed6160c32c2bac1aad4f88ee3fb353eb6a0cfc1aa545cf61c9248e4ec62bc41094bc56c66d815bfd3a0b2d734bb9c0214adc33797218a5edfc0e4ab0da37bec0a8139924e08443724d740a95c2be71cd0b4ccbf7247d090fa9c9d1f38ea7d06a10ae5064ebfb0d84ced444db0c8a0ef794a4ec1c2339a3d1b89e4a9e4942a115b4d5a40ff8b06038a57106ce91e53ea5cd2cbd6fd7171a3a11d5dd3a72cfdac97cd0bdac6e69e598ba9476f4b997a9e19e2b6778a9de17529db6b44e7317228e50e6c2c3b5ef44abf584bcd8ed67f8b2efeb11bfff5541224288f462b3e2226d1861dbdd350a24793f8b01ff931fd321a8b2e4cd424641b1e995c8ff9af7816dbc87328155812d0b7eef6df31585e134b1c90829db77be087b2356ac9020e89724a1ec37801e08689cf9273bd962cbf5f278a45b30b0612dde7bc6f1fd23fff139f634871ba75d987ff1585f497d386c5406e1ecabbbd22afce5415649c96d86e1d030fa8fe5d3a4111f27e7cba0d1a0bdbde663b35fb807bba8ef64dcdadb5b0575081744a0139338cabd5cc9913e9916e3dc48af63bbca050ef7a21f1ef07a8e2ee566a2a0c56dde3c4146aa19265f48c1ea240990847dc15d8198785d55ea6243ef7012ac903beabbdc2bd60032fb3a9f397d28aebb27d7deb7cf505eb1b36bfc4dbcfa8e1c044490b695b50e0974d3c5f0de748508d12ed9bfce10eaadde8fa128d3c30c12d0d403f60baf0b53d2fd7a38cc55dc1182b096c11d1ec9f171b879a73bd6ef1aa7825bc5162cbeba1d9f0739d1337c8142445ce645e4c32477cdcdf37e99fedb9236e24a3d94f0e45ea0b41a74762efe19d27555cdc89feef5b6e533237603fe98d8deae084f69799deac9043e86b830104327373d3427f9f55b0990b3d4c42ac2509818ffc5f122e0648e1eb5cce2c12e7dbbb41e8f21ea7ea48132b51b0b08178658b1ab5e508731f64b9163ae76567c6979f3f741566c99799440b1b29e409f6266a093834d4f97884784d0953a9a00efa81d50b28e254dc28ce23003457962cd090e3f9ab2221b02cb2082eaf832c4f89159b14a91bda267af42b975ca5b69ad8a23380d45aac34c1f8c031376c9d06a7dd0a37126dda0504685d470f490bbec31060542cf8c994f8bf1db7a7d052a2fb2aaad8f172d506598d6095c8abd607046e02ea31773a5f157779085d48edc2d790e580c2a54b98fef5be1a2558d612311d83c96e705ee1bca45ac9e450dee4e19242b5028fbe3b4913ce3a81da5c5ebda17b68505ea7cb62d84b72c962a6678dc15aec3d8c9d7bdc7a298d7a9b094b2e8c524d73acb57a8c85b3797908c4e95080969cd04679c93d9b58697c354d65f84090ef44e5088dbe3f3b646fbdcad8ce627e5d7727c3a1c0f9c3751313994daf60bfd4409201635c674bba39fc18c45be98a947ebb1ba42b180336bbc08d60b86f4792f33e409a0b905cf1543e4f2a8d8843d8737ae23ec0688004f2c69a2da7cec081d9343690303ce7904b1ece79d7b122afd1e1a7d0257dd28634903022f1f1a3476f2e63f45edf841d8af82740cf06af713689dd16beca63311db7ffdf2b8a784a218749250bfabaffa064e9fdd80b52c30dce026110d0ca7c0a9849b0b8fba8009cd966b0bc10e4cd07ef772f8701b52bb448b84db02370ed77cbbe562ec7cb113d9f4d15e3a4a9fc3de26f5450bc3f01e6646f3b1124eefc01ccce2df17159e290335cc317486303cf0822fad98d68ec00ab77c7b8779d3e2515e9b6b57acd0b11402646cb5eb88a17ab428165e7bb409fa892621a7e241a5e31916ecf669cd15d502a2f846a12e5b4563e86aa6dbeb61fd62fa8cbbaec17199a75d4c3a751fbb0bde8dbb6fcfaad31938788fb81dba30daebfea20a08dbae3cad78716cf84d0d813d2e9e779e8570bddbdf6fdc6baade5acb3c4cde1618c494d66d45d319e071fec88b89a8354699fbf325f05aea42d345aabc737d00ff1c69c746aeb9015f514927ae6548bd75b8992853fc79c40a78633285fd30ef191c832b0b9664d852142b019f18a05d9b3460246f7a83218a337b099ed43f0bec2daaa8c2e41dc542226cfe648cf83e3f75188c8451be284b6d57d712def27b02b8a5e675802cf0b6e3d4c707a79887e9e3890b976b7302d48fbd45e6059168e3233d8e2b51d98236bf2a049053c76121e67a47b2afe9d6adff76fa242f63f915d73a48ed416ca34a1e385c0577cef470e6b5e8dc056acd5f274a9fd446b157223d64bbc2372c7a7b68c47870fbf5675d4b00971e553c0f716e00dcfc31c3a992bc8290b21c633050059700d8c684e2717d24fc7f87a8c36b3b6258a6d8e118ebbb5e6fc5d657ec525d799b46c2c38f32e4e9be0784f612d6f836bcd92353ccb7a4befe044e50d707d832f1c1d6fa942ae81685be326e23380c45af9efa60ec7dde6be8766c9819f9df89ab51ea7019e1f275fbad7a581f1cdf57dafc4552a0c6d12dd3231976d9b0d84771fee76e47de68ccc6db44fb2d07d934e5fbec6f1219e5cb68143b313fb32d34ead1b33c45a9b4e48e5079a0768362a377a3d70067fe820f4e50bb12758a4418bfd137223cca3c85fc15ff8f2117e26d38fdef4ccafd10bf2ddf8261a0bd87bb98075b6854c96a76b731c010574cc15ad2101a9d619ff7a4afca7766ebd45ce51b790855b42fa58168aca36b40a86732eae44139546b9f867a1881687c582d5df33124328584546cb78f8fe703b53cbd2b824d69ccea712d36d18ab17bd161ecc6379847ee4ee1004be16ecdc9fba9c33af12475f1a2d3608cfe798711c5605a3d914ddc1817b305cdaa2765b901140bc239b0a5ea1d2ee923a6363366be926fff492a392b663243e4f2a2f7fc4fe65e6963d741e0e3eb8ea5d1a8fca1435ff2b56716a64ec4c68239c2c7cbb96d8884d7768390fa7a7018b787b92ceadd2fad06f1fb6aa9b8d78974217e2919e46045b57a9bdb616c274e03d1500a6b126a669bf1c0ce65cacd213c18af58443ad869ab78076a3c4176fa31b655dd496d78e61b6e4d1aaa82101239ae42a161fa57b76076af85b47fc7e2e93fb1eeaf73c1f52f718a969f69082414eb1f4c98a944f87d7f7b74f1b081cfd2734a85c3aeae5a7f015f896d061e1e75d72ea113d109f4a998537e1a5b0c8a945a09e9ada5a5dfb226b43d3be1b8ca037b58e7f7f90d738dcb1fed5709d0d8d8fcd66496e00f4a70e871f8328340ee67de83686faab83dd11fc707d241358446629a3ca6e8556463507e037a731c534908986aa06b72191c9d3315b08ba35485933bba0444ddf53165c3a63a39b6c14f028036b5c4a3d1164b4b5e1c6f82123e97a326d97c11c5823028289b5e740024d32114d43db32b6833f82c3c763a841877b8c84c19589bffb796d3c469c0d76e83654b265f0bf0ba5d20c538273373bc3a64e786a219414f04f3eddde2010fd61b3325d2b111e8b3cfac72390bd5a6d1e88ecdae9fbe7d1b1f29bf10529e7003a272e800bc2edafc93857b67a889e7008a1ec0ed98ae180b0e1e91834001c29e200cddda06ca8f3db19128e989b5fcf126fb096b1651dac6dbbcab5e3491cd4e9ee84c85194ed01d2fbac1e833c3ae4bc70ff04fa00f8af58ee954cab6b659bc22ee7d2c7d20634417e78d8b3019c5b67241bcc2bf50f23f2d8fd5ef4fd82d8fb706b7f5b8aa105b7100d5fb062109dc3179b7ebfa7cd84dc29576f4865f1270621844085453a10a43ece15f404142620b9f27f3d9fb05c654e37f01e4b4d0072d0c6a8ed982dcf89795f9e063e337f3099c5501e4354153ec613840f03d2ffb1fca72afcda18bce74e265a6f96eb1353156893ea493539c91f7e9d73263f7f5403ba492ba177433e3bb6cd88a4a78d08db60bd1a07b05484b8dd9ee328eef9c99454760274c60d0ea08589e9cde546d25a422e360561d00220b51ae7927e09931d1a5409da8164d94b16f21b9940db4ff09179c6d8d646b1f59993e8e94929311c8045ba3936051e69ffa8968d36a4c25cb32234e86a232495ff9c7f93fcd333f10add9c1750484eab840fe320434de9fd4bba18bab9ffca906b971438e5921c593e8e17fb6cb8fa7e58ba79d8d3311730afa3dad63227245342063f3ebfd04ab37fc9b66be7d1a250f21ac33d72f8eab5737203b15f53c27d277c691bd8284f7e63330fdf5e2cc6d1c4b367c4af0fc4fa2b971bd2bde0157c906c1a56cb14ab387d3c8ccc4c14e86f6516dff4e3d0465d3c959bc0ca669dbff157db86050fee602258a5c91e44778837b78444ce04ef7d1af00bf20151ebd5eec2251002748993f719f34c511604cad117fd3aa9f810c86b38d4ecff2c505cdd3d7f9b600ced325ff2fddc91141095a5aac35d24345add91d29f1810709b93311c437eaa13b9c9e1661dd04ac91b7749f25f12a9444e1b234fb319e1a8fe37aef129302d335fc92ff5dbedda9f95fe228128f1c5923b0f9412c958ef4028a89b5e99567 MD = 8ca103dd16385714893331aae8b98012b40a1c359b4b25958843093a1ed2cd36a58aa0054a6b9e0a18b08836ba6be834 Len = 79432 Msg = 068a639ec92623e69af04c1162fe2e83027dd272e7f72e4adfd19a502b188885d57d6fcd449d08500d86bd210c775f1eb4e81717a3ca9f327910b18deb6ec0261361e7f80a6f1f67b9b0b4deec8dfab7a8c83c5bbfbdf5aaa1e7429d75a59829693eb2674623cef3477519922bc76817892528876455987bff5c36c6f24576587e1dba621e427fbb5eded483f0ae1106fd08c5e2b91cf06d3a7a73518ad4c479fb05e631ba539988a7f1cef964c85d4bac78fab6e7996647fb46e28664dce95587ff1e1b43de8422cab8ed3eafa0b5b0407daf49155460d3e9ca6baca9e44db4cb124a69e16ca7516e3b1a99f8bb7ffb5e1fcce56cd647d7ad0df70c8075585e6e465364bb846cdd3b813e5167a324f5b0673ad014a6841cee176cef1216721a19a31f51faae3a8ddb923faf26df0d66de5cdf52344c7d6a55f1b49b874f03b17432977bc5727a2af37607fb5af7a1169006a4b5f4519c888aa2b55906a873ec26faa3294559927c2e357c7d2e7347cc6d6e713f7d3c484034325970b7aa2a91d8032ca2a2eaeb4b31d8887cc8dc69521d9b2f3af795e858fbaa862ac3dc91683156182f03aeed5fa767124250ba6e6e4995c4ec8ae5e699891126cd52c60e3bdafa5118902b008036e80115ef93bee999651a9e5cb2a9cb836f20a28bf10ad07af7bda573eb8d7586653f3eccf1c18ab4121897988799b694cc5cf197e4eef0ba56461ed176fa0740e5b304115bdf1b43a4a52164e91e216231c2029e272063421ed3cad552b1fe0c7145b1e35a8062ed24ab82e862a0d695a53a1cc7430af1b9574bf2a40918229110dd8c6c750c295b9911034e79879bd631ac883abf1262c80a98de6923993a78ca63dcd434eb36340bbfecbbb73b39cddc008f2023a27d163ea1d64a269b1068a7bfea431f855121839c8559a2247821ae1e77a1f8210b4cfb4e226f9c866a0ab0dafee0bf4244ca07921550c4ab1f7aafee88e4c5f7d411498709010cc11106ec9a5fd39b8bd6d6a288e6c8a536f882e8590c12128ba00e3134d428ffb6cd0364e857453bc6ceee59673ee8cb2fc9de60454952684737eaba3dcc0bfccc65a91ead2c5e285df5b9361566d8c0fc5b391f9c88cd4d92614eed8a36d38b6ba3a224cf2745e9b613e0407ba6c10c0776392e4411aa4cd4e5e2d0045da734fb4d937e389023063bf00a7f8145cb35b6e18694272c12ea768c4d6e9188b080e42c2732ceaf1f085253e0fc108d1dc57366c9592b212db1de1e38cc1afe16f68f08044a7bcb6276650509be0ec4e044a5cbaa863a37222875634af48808001f62a9d2cd252e13d8dbcf2ecd65333b38b3d9d0223bb81ad7a3222cedc1ee9681c6d63ac4b61e5bb71c77f732fb22572b0758e43515ea3c47d12585bfaff802a62459e33615e4629990c50bf4bad95ba408108dc8b216b1ff6532fe73396e6916e2f8772b2ac84f099f83131b889f702c1ec974e1f983a087c9123f0f4697f6576a7c9bacdd114a8cb177b6b04fbebe4ab14a418bd27b3268638def9ec0bccef322acf9bf16097dac2e6a9dbaf67c6c86295c9bcb25448f299d6ab6258e251c727452396fbdf60ef07e2570416522a368efc72aabda27de52de733eae981a065ac73403c1ba2125e0096dd64e84f78a7969539732da6c486c8d6e2c40c6e3b435821cfdbff5d2eb05370d77e73b454a4000c78a680b5bf4fe14242be400c74f8a0fd0d270575187e671cbfc1772520a451cedaa56563c0a90da5de1a12e0fffe2d51828dcc6e5220c1d710de31168f311268ba003a356b4aa47e0f67f3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f19468d40c3d578f57b66e59914486ea6316ae10b13d6a8d0af7c88fc04318fb7abf747acb07f30b1a0ec6daae3dabeaa4c9fae5cefd00ea23308a17b28e4192a1a524295660c7eeb8c5f71898631fd1f5842710ee9b2fd1511c46a2df3e107b18de0e7c28d8449ea664658ffa455154b7cdc91e9a8835f72723849da0e2f42942c279cfdcef07bf7572a8ad4e54fec77e1f476b5d54b1b017deda74920d6b11b20b1ca0cd157fb5a87926fd0f3266ceaaf12883a1713190a5b6aed43d2df3b8e9106dab83dc1b15b1d066fbb73e27cee0dbe2f4017e241d533378190cc51ca34a6ac32c9ba368542420ef25c108c03c92381d38e7cc07baa2eddcdf8b5344556882d3c07f2bf5f561d33607c702bebc41ae2dcedefb5afd074e337433591933c5f115f3a8a6327e0d7fc21e33bc71b271a6ab22518cac5902cd12938f66f9e2e52de02292d2bc52897f29d591a697b3a4a9fbdfe9e06a5327e300aa09dd64d74891e8f9d811d2176869b3ca6b417f345d30b65402a7237fe93864243d5ce88552d586d5e2e442412cc826791b3db6b8fdd3613b26314643b935e39e94460371a66150434dda5b443902c84e4bcbdcb618fa72d1df2f61233a63d565a9293430c5bdcbce7364aba53fa23fd657ac4fb0311e61d497e202a2cf2ad035d687092703535fd3ee03a1f8833ee38dd92f8e3bd8c7b49feb098956fa235a8bc6efd0d911ba82f02847dc92b63159f13af616cd728ef1b0430683944dc5eab3d4b449cb636bebafbc91ca283b12098d177087c980cc8f922a59800f2c8ae75a9a74d2826aefe06f1581e91da46988ddd92f4fc4961914d22b72ed1c390af6ec72c1e972aaaf17bacd88b7d764a05e500a92dd5324ecf7eca0f3493fd59e9fe6180c1d30a521d82f3f26b50a0e4ed080264bced9bfc0cf4e355b130e94ee38e3d4b3ec20ecf0c81904ec7f1a03cda5eab6aa82ecc92cf173431ae8fcf94258425369b4e7e4946e24993a648be7b534fc364f97f0c39a14f87493298f756374adee8e25ea1e7510be769113d42c9e14311f9b8c7a5190904a2484533a8baa246330a1bd9c0d2b766327a0fb8734d0aa25ed2ecf0dd598f9e4ed4ef482ce8ede2eb444ca923320059f16ba8a19b3059d472969de1fd22bb85539539bfc909a085cd3d7fb5122eb24eeee7e4e00099534115eed3824c9b162179352a80c8454396a39ebbe5d5ee57acef94cc5deab182510f8297bb14ed27db8859cb7471c35f7f330e0921b39b76dbbd1a6701a3a06d6d27f9f0749b3f761947ab22810bac7ba746367051f65d98432022beb2728d9cfb27fce7952bba8c447fd33a90e0272076a3bef85de45b444cdf54d7599ea09865d53283060a85f0c5f879188a365dd554144da92dc6be025ec457bcdf7003e811f944ccaf80ca2a027a44c655567622a95f8b8caae3ad5ae195d4752a30db14695dd9ca79d7aec365cddc4bdb88998fdd4d22a8ba8551d53d1b7208242653a5d3c89a864a555b4255b8eaaf0213eea558a6b70546f2d2fada1eda7fb4999022b9012e070c44f92f3a0516fab4419eeb8332f5ac377357522066b3e1c1d3bd1382d13f55a5eaaf137b7a0735d858d1eac4b881a47350086478baa637351a000096007279ff90a67582e0666856a1ae28840206f5e4d10eb848e35b88f7b781725d56717a007d06ddb6feda9916645e2f2cd62aa8713e91d6f9aa79dceff269f13f9be46092fbf6d37f9e0cd2ffe9098722fd95c401deb847f4d5a93c0512e003a49672349c509ee04586a31afb77d5b6d03ff0517efaac92a02c92ae21610d32f410c4fd05c5278b707f487af257ed469c63e358cfda953f6479dd3d2b25190597d182c3b7a2b95d6851a3f8cad277bff03315dfdcc69ad6aa8231ee0ba72c04f5a1538e992f7bdd96c45b9f6c2e9ca733752ff18d06e3e0d91037cba92f6cb87648df6793b4969360a01974c0b38388cdf2d893cae199e558eb96dbed0404a8838dcf558d7832072fac8481aeab55e92672b9cf7ba1e46b91dbf726c0701a5d8239cb616fc475c26cb145cd1f5c3953a6bd7aac888cebfceba802b508b9d75ddd147a9221e08a4b7d770360f90f584db59ac233d9ebd71fce195e8faf286232fae685f08c14972accc66743260dd95fbbd2396a5605cf5da2f8b4bc9b05e4634377938396a8c5e8bf66197d8c9be511202d885be824fc3cd00bab45b69884791e8f4d5428e33b0cc01ec0161504a4ec4c73570e758e8646be1bec31e6286bfbf5f55b6a2b0e221e36b80417a88e3d77a76c4d89e68c9403d5ef1e8815ffc0712f7264cd8571a1a689fa8f872c83d93a9ae013d624664efa7d51ea532a63ac6434ce10862054e12d20ad066e8b299fbe8b9651fd1664ddb31f07f8990d9d575b6cd1099ce2ff093a659914d4acc9b88ae357ae04a3ce69b621daef62a6f5e8de3f42f417b5b94256bf855fc277aa4b270bebd2f5b5eb198ced9278b6ddb2877515eb7c0080ccb408963a8f3fd416811b691a66d7330416bce9f73a9e9a1e5ea95692475e2b7e86d853814d54ab5382f067ac12b3046188ce7fd0de21c57f92016a00fd399d18e14e5c204108e4aa752d6c687d90124a964a16e70b48461e4e06b9fd4799c0e1ecf31adf12636763825bdf175076440768b915026a1a0543b83eac51cd877b23d04ef588686d1cc6d3012a81326e82df27a3e6eaa29fea36f833a9c3360ab624b4e856e1ed2fec1b8da7b46ecc7eb41cfb8ef0675cdfde3e376d191c2a2b592ec147a3b447b0bda9dbd6e5a6c6b1c2040b049b4140e3c7a49d73652453f14d871ef546c71ef879b9e31425f0c70c95e0808c4f3ff5b28fb151ccf3a356647877f57aa5e21b100693cdecdc16779913f781af742a24541caa7c032d61de8cc3486b5c2acfe5ff4e7fc2e372de7f5f259337f372ca74d258da459d7a2591721640aa253b5525cd37c5ea834f118766b4facae3b2e78e332988d52441b9171d5aa9da5c423b8383abac6c53dc7736b7a67561049a49197f79fb5320ece3199575c9228aa64aa628917d70db7fd73559e54c24e093b7bebe2f7ce817e26c3fe351e9ab36cf4a37c4d08120a4a1fa2b5457c73cfe06fb25f93353bc938b1c300ed5509de82503dd6052fda235aba9c1b1e62ed1e659dbf5386dc8f61b4fba951ee8481f29103c4102fe3c1e1603aa9f7779c80a21f620d781c523bf389610151c7417597ff8bf0bb5bc85bdd013c56caef7de1036439272de23ab3e70c8e4590f600674754552e27e741fa6ea42c4d15e4ab80badaaf86f566fa99c4e4dff08ff945d98905fbe6e670e5303ecf76d7590599e220f911b75f1916500578d29cbf4f764ec5aaeca58777369f95f9c8a014c0cd87de262c42db871279315f1294af77363995a9b4048b689a9b2ca98e11c984bad45b184b93eb2f7377c0fdfc92c0fefa1c6188ce6e52d395a56b5533b6f7efe67a2015fc352e80cdce4cdc0cf1a4554679c1dea86d8e36cc60ca8355fa1050d4cbb5c5ba90e609660f3d8fd04bba088fd43f01ee6c8e00833fd2ca6175b3560a5b949e0351c247e09d0b7fc30b82874abe2198ecf5e2df6ea51c80e294517e0b9c351562d243cad20a4f2271bb8e500b9a221a40842d11f332f05d55e06b273d202fa255acdae0aec9612e58c64e0156eaa8fc75b1bd46a55bf6a637e470f02369ecfb584c0847cb7cf9e9d4d6420991323eb5e8e923fbe9a2b7f2051af34762ebe556f72a5c6edc7771eb9245fad76f034bed36a4e19054898cc759ee72bb5028a16b9ee237a4466b51aa0dafd90924d068e8db7f86a26a830dac82f96fca9fa2b99fcbee2aa69dab11bba37e7d0d772c0e6f43d373b09021b3082ca65ad385ec966a1ab8b5d436b94a86f02c5752ba68b4b70c3b493969e81560c38fc484c758b060e7dc69cbc63864a27053e8878338f476913167ab5c389d5cc4102d4cc889a00adfc3a6ebb08ae884a06fb0fa55ff36147f306f84ebb5b342cac205aa0df1edce5f090db29a435ea40cea4159a73e022722c2c1649cc20fb9343fde1b0c23e231d206febec7d42f87125e09f3fb67d1053862fdb8e3f00b369cc4271e479225cbf5580a7eddbfe3b46d257b77c72f3b550c8b850055c22e315109612244bf30f32576b161408913a259fb26439ed6999d2bc6e7b976aaf1301d7a2cd5882d9c4deeed7404a4b227d775299af5e7108424228fa662ab3cecb94e90da96864fb042be26c2e75ebd98da5b4b39ed344f73a06d50319a77da894360d80af3c3a825681fad3e77e31dff1158da93c80ae5f09888b329af71165f54f0da3e6bc4b954348ffb4734e655c3131a5228e4df968352e112ff300b72c7747af1d56d1e15d52e8bab6dbcccf77d660c3c79e236b39486231a12cacb625a087bc97076142020bc9f08226dfb6596709b14073e84efbca8bb1304be25879fb75fbb80255b7abf6536cc05c71642a6c9635341586e8d541105a855a8ae3500d7a36294e9688809ceff51786691f116e6e184c8de382f0375bf448608ba0d160ff3391f30bfdaa8403522fabae3036f4f9212fe2e9637433d3472166cfd7257b6abb99fa9b5e5136f94cb1d32adfc2869f1a851c7ed588bee01ab6733dd073e62496e96a30f29c3b37ab4506c473ddacc8c9f8448c1e545fea37b28fbdd2e42a968c284bb102b41a2737924d6436aeefdcf82e60fa87019e5964bbc23726a0ce2765fea505d6c15b2fb741aff26e5ed6436dcf7bb058b703966a79159315ce5a3ee8158116b6ea87b9f5f935576414ea65f1849a96d99d170711968fb9e5975645df12e6cbea57252cb763e67960f9b1ab4bf5c79452dc611520b73992de224ba310a0dd0cb931bdf0c627ca41a935b57b45c909920a9b6928618619044a98c1c043656dc16da0d76deaece99789ef7e3ea5a869784a03b8a99aab3af86f203e0442099ed24ccbfc0bea5a4c644650925d343ced2e5a3cd5fe94cea15797e34cd7d43578289fdbb332901afa8e297f7b3eba2a9f9c826d489117965807080872a1c09104a9adf7854aa2d4fbff7aa4c14bff1d87ab0abf9ac9ebab66f20ab839cacfc4493ec048f9bbe92f589d81e9eaebcabbac413959520dd7b6d3fee71b27bac9774fd01ef697ed2dd4185286748085e4ac16475863f8c7a45fa715e558c6d976511f451028e748366b4305d06d0b831699cda6af07155e1a4deb1e4e989e909dfbc087de067235cb9be29ea8fd114c262ada44866b303a0129a70168023545081c3a7cd0b9bf1ab60cfb04564c1c48dc06440b25b7d1c3219ae1a67cbf15617d5d960e2e695660bd6799212281b3df02d613e2d31480614249a3f5d1f6c64dc566db243f3dc070a954c1dc53c45f795e414fb0daaac67c2bddf4d6b1d0ce70a8de11a54c5e84b0417a7d1d333fa67ebaf0015f80a02a7ca5ffdd316275b731ed6d417b9df42a8a4f82d4cc08171356dc8a31d60e1e35c9785764ee2d0c09fa5ebc728d7a263b659913cfd21b772b698cb8e5fdcb4e6dcb6c8c94f55abd4a32c173acc32b1c3ea9e9d67415b4857820942227bc01565cea4847722e31b20440df3af705f7ffbbbd0573cd7e1b6981e1bb6ffefbf65e8a8fd62f0881fa10be8e80b75c3b28f73a0bb591e2f5974cce15c84873a2f48f7e20dced5dd7fc0201836b95e24d042b44fac3d8b9637156e82584548c994110c0072328791680ae54876a7a9223d4c460f2f5f25caef2ae5677b73c53c8250ad8aa73896528ce3c3f02430f72a6dfe9175b1584d3c05f7da07528a7d018eaa54f7394b828f32ed54a5cbffb8dbc6fc3f09ee939247f03ea4f86a13e0a6fd608abc94d5cca61e8a1fefea6e6e84eca7a73213ab659d5251eea11e8a909b7335c7713671d545943c7e24ec07a8d453935284dcfa67aa90c40f980c78fd5d647c838bbaba5cdc2886f7fb5d55c8387041c988a72af8de20179043a039877b65b757828de993d8600c35b9cac37d2fe73584a41e9799c6a4cf194a7676df63db68bbec2cba4ac8cf0e800690eb18390ce11c6d8fdadae2835cf302fbab65a55a23193f1396c23bca309f686c3729c275c6e95b976f3cc04043c613ac31aabe5658f7e1def99a9fe604cc359932328aa66983e4a1cf2fde6005fae304b42f2d448ce07aeb6d4473a6ed9f14c466c2c0134b749f5b75349b672619f791ad6370c9316b60c56c5045816d908c5a3f4b2140ef23f210ebdb85ca269bc7df87d80748e8e149f9713e840a0748e2e7364c1cb3c71a735ead953c1d8a08ea5addfd7f4815fa8d04166fbdb54d10dee7e63620e055d099b134f21cb5c2d9c5700a54374b3b0fa051b68460f79190c6d8c9a9cc5b3deedba51c62a6375396efcbb77cddc6daa93a7eebfd0c55973141365b177d88c1bdcfa6ce777726dec8dfda4fc7b14f775fa1f8213a1e63a08ac48d04ffb2fd93d5ec32b590fde8a6d80c084dd57059938b7d49f0dc25865005c74971c31b2e16bf97d57c4fb9115e5cfaf22c269959b1c532d0d543a052282acff80c2204aeece3790b8d24171557b03314851b8ad44485594939111d3b9b6255154e6d0dd468e9f651629eb689458a3adbc354c36dde44570fb6c50ac71c54ed2da334a5432d2b9623971005d18a3378d47142d16ae1aac280b8cfe7793d7afebdc4e9598fac20ef0e95389372b854838b1976437ff1011268c9a231c6713d10220e2b990e6872578ed768de013265d16c265f77f18eefcd1453dc88235a23b817095bf233e4986600e84143f18adfe8f4227f1d840ddf591001ef39345ac75ce920fae3b492fba111422273c8443b30bf8845729c10585ce83e5af36de5808534ef98ebf506248f4c7faccbf9d0f05f2ad25335ae18d33f0973901534ace7b766efb68969b0ab870eeb40db0ad3a7bac29b18c52e99d885f04c2f3d3cf3756a1b8bc43aa724d93ec53f8f2f7faeb9ea134d16bfb215f0b8492298c9cb6bb223bf6e527e21d5660d2bc6c827dcd4bf43a962dd73cd0f944c50916d497478166acee1d1c26e34ba789f2bbc5286d8207dd166cd8fd3f93bb8b3030d4acc9b2aa5b690d2b5e0e55f179bd8bc3e124b75ff37e367626b756f93fd02093c4867577b22e5d5b72e49bc40ae4858591381282e59435baa07e698547b18d19c5c4f3531807b4b54bae46aba43150121ef2bcfa19210eab51dcf5e70d9b206f99cc53c9f5baba3fcfb37d2baf6a9472729add4ff9ec6c52221b22a8f756819c26e6be5eb2101803e73d69ce9358fbae73789c07ecbff5b5fb82174f6fa957a856595c9cb5d176097c92311bb8c32bcd0bd322ac596051dec558fd64dc5e4b9c0f6f540a67c57b5774fbff9a8773ccd721f597c5aa9829d566e6fb6fa63b047f3b6ecf3030b3d0f7b9c0f8d4662f87d59c2422db462f25a0c8743af934092b59c19ff49779651df131294650bec004ce66a9eb7595edec49d149e289f08f6733894aecc6a8a1094bc67e1196f8efeaca66cc1b1bff9a27d86baf1aa8419761147bb7de4527303c0f5f06802f7a82e1d184d4da56ecfd7d537dec0add8fe7c0047f2df39d5cda5f45e30abca2ae4193eca80b4facc4df97c4ef49dbb043492d0b7df65355b1661af33cd2ed77fbf6a522bab7a3a7ef081c32a90eb5a9c38250325d5825f58c9e142351a63937c867c27ca221fdcfd540b5a69283bf51785dd080079c92065748f6dc0acecb697f5d9000489186abdf4f0a2794f0222fcaa156fe6309c10f792d67274f91c99587a0b7b8954e66c373fcc2bd969c05cc221589b25ae9da985a15100b08395c4448f8e0ac6fa2c49ffb10867081d091aee68312a6d282072962c898901d0cabfc2a2db3e3c0d3c8c8dd54fd493bd4ee5f80b198e2b41e6e4bf90da9be7653df489506d7656e2a9cc5838dd04fadf043675667c46ce903378587ade89efc551fadf14df53a62ef651e5386a68bbf6cb84cd26f3e4e58798b607471ff37955c94b5a6c8b46b856a4e5cb70628035a8f77985a90ad90e8ca9263281e96912aae65e71c40bdfebee37c0616d4fec164a2a5d25891b938833c73160c7f54b5a494bbcbbb7cb7fef4a11aa4d7b9cfcdc7ed6d83333b0b5010195701865be2aae956beeaec464b7011ed4ebe647d432d69b8f53253564bdf76a765adff79e778e33c95cb1564215efc0f40dd24e803eb344b656720aa21ee9f2fc6a1e0a20c28788e69f7a09fe0cf9d4f1a887fc1b70f0eede6ab02fe338472f8a1658f9ef9c1929361f4f3bf30ccdcf40148ddd2079fe1e8a084611b2ca9d74c1f827635554b1894a64c788cbb5ca1481fa4a6e199a59482ba7da5cab265b671687ffb2fc9cff2d95f8695ce2687d4919c2442b718280f045c1b36d16dc1f7b0a3e48853fc5308aab52bb44c1c555d18a0501a1c2a313ab6b0e87cf807c48351f83a846a97e2424fd0c23ccf43cf242552b194d877c7fddfdb6be0092577409c9007573c4181880fd7d3951f43fc1200dace19b2a8f240c8082cc8ca72e017d993d66891a33ac234f3e72604c5e50df0612f127365baebba5db49d059309f04f292c21316414d8044b8559467190fe3e0f5de5e35528e6fb028ac88033fab4477893e9e42d18b2c8083595acee07ce330bdffcca214319d32036af04f8ba4909ab922871a64c38c7517f43ffe55263157e3dbdf071146c8cdf41bc588a5099dde8b247a176ba534b4fecc907fd77a72c8f00921deba1c86d6632564692c78b0b5779ac3c466ae99a2903908cdf8081c267afe2183af413bdde91e494b82406da2271c00abd62e3fd084c00563274d81d2dd214aa041537c56ee7d00ba371f4946e22ebd284ac2abc1450812c9f5c96860af2929bf20a1acd3fba8173fcb63c7f6613965e4250a51f74967cd8ce3fa2452696c3b3abdda61c79955f946af9c6e32fcc2774a0543b6e51a757206625e4a2a8460fb9d896c1fc43fdd23596447a0af4d508dd46c2d6f0d2097ccd101744e5b88ade77203b55b3c57c4220279e403bdbb79f61dba15dee204651a7731baa5580eb98b32cd6498a2899171bc61000bd0cf956c708fab7b062e64075383cfe3b25f0a536a36e85c994ddb9ef1ba0a2d9b02394d974d4ce7ec16fb001067f28dfd2226ec82e0cf1b830ce9164cd580ed7efbdc05dc73789a0656b091186ee1089ad07593075b7759f25f6054185402cfff050441cab2cd05d7561b26e5f909f81de29cf381f77f9c59add7e50ea5fe598dc6387dec6b98bff1ada15e03a6dbb0e8e1039a6d5546573b8096557a5bd1fecda7ff16ac0e9a2cc7b5d992ebf8e4d7ae542fd433e57a1f1a704201f5d62c341132bea8a42c1fe0dc172a62295fa3e0b0a4985d7038795878e561970bb57bae0afefda04f44b850913a1a48265b9740a26ad372acbed2a7d9585b61167a3ea11d55329a17d8e200a9a73fb17d6d4d9bf60f47d033f8f461ae61b61cc084e3d1cade03f298692b8567d6f14a991525471e1a8be2c0677d2a7a6a0816746619a48601d8564b6603336e51e55003d3bcc69d050616bc9adb76c009a7dabcbe3e8de1693611ab6ff7bf2fa0627e383982bf05675d0893037dbb11a93bf603cdc1126f6c83c122d7776d2e3b1f31b0b70584c9b9e724ee21f28be1c12ae4e4454fc6829467f15c4d10e1ec9a71f717ccb3bc5c653af81886d85da2fa0b23c895491ecd79590eb23142a1dd36e15aa7fb1bca5001defecc927d94f7bc433f4b3e3b8f9263bd95cf148b1182a903b91bb2bc33270829a554e570e632706993c6b0a59d941c2c030d6758d57f595fbedd94038b63f0c1885bf040b5f5bee4ddd59d05cd24eb2af2e7ca4a5225d03bc8580f903779443d244c337b88b4105b59f243da92d76910d1f88dde1c18a64e522595c0cbe98ae2e5902f7fd2efed23a4974592932e0e942cba526297ba33fe08c0b743cd272d5958e254cc291bddd44a5f32dc228b541b6fa7989659ad11d148b3f4679fd4b4070a9d43eeffda4af3c7947c05d591c22d174ac0d7d643b85e9e79ddcac854b782573b6d66cb8dbcf888e181ae30b3e13fb00e7ba59220affc767cc3dbeb399041eb4741b210a8bc592ac0f443a87429c9c68d299e21b651316d5757195cf5e6cc134b516f73ddc1ac19ad3454c1551451c7214b1fe99754a3ef73f811b21c13978ba22cdd498f5557c220d25fffc9397e3e7550b96e2612ba795d37436f0ebf2aa10634aa262fffe2d0a65ed3d862f19598e3fad933f523fba79d852d086041fbefc1f9547e4219e3b1b82a4edf94e54e63178a1dbf8700cdd6af723d02933481e47feb4ad6684bc0e1d0d52f79e17cef396a8ef5855e21c792fd8f01e22a0f631b9aab1ba2f4fe00ed8adff42bdb311e686789df09ed1f7f79122c0a2b974b05f19c8935889ab92a3140bb4b89e49a529c98fb58d1a6423bd587e9c4435d7ff103103636ebac05b3598cf79408802102227973e1612c42a354c938bece0f06aacc70028e30bb5c22c2da054c2c506dc3b68354173ce1894c6340a958200e8799ba46aeaa1c4b350f09b264f279b7c90db5313c58c9689e7d7da8ac2eedee6b44690e7b28f2de18be9aa0a7155538cb569b2d9d249b23fadd204bc1b18c213a413521f87958e68fd7f21f4c2353460d24f4b2f709269616d1e7b47a7e8f397d06bb4bc719b2e6f2e1bca8b4baf881d6ff4e6bba84f0518b02307d56f47bb99c0b77c637889561fa5236b7813ac95ee15c04d288168cc8bfd496f0b791b6041fd5d73bea5474ea0ea01cd632212a5f94a1b471c04c507e3dcf87d93cf4e2bb80ec76175ffbe5e19851bb8f281cbfe66996d9b3f384efd47d598f71579c664267b5b0e308ed4ceb2ffdbf4d037bde85e871e123b25ecf8e07191a6387d6d53b3cd8341965b72e595dea848a34cd2ad099e9674b5d3853ed5374b52a5e52940858ba6c44f6d81ece7ade97d14c9f0948e653e89584b02184fb02fc304b9e472c73d2b5d04cde72bd3f1085bcab501e415647c18c9944cce7662a3c0fcff85329f6c7cd55d818eea7e346caa6e18ece6c824b9ebb3b649a871d7101335c1f4c8359f00f301935c7113fd7d32a7fb99e2cd2c5ec8bcbae3ee6997df825806197cb25e1f81990a3b07b8d5a3bb1e65f01f4c04d1788ca701e7852876d60dd7dc953e314145ccef12f69543460c7a5ed9e76e357cc3cc858bdcee143fd6fb3b255d00a1ce094349c884d4cfceee64ee3c805a46c670245c6815cbe3a04ccb3adc1a21352e93a52047fa9a01a329841e013339bf16493b3582da451b03fe24dce915c876caab9b7d76a012622d8581f510483329d614ba17c0738446cfb6af2a34961eea081bcd673dbd6179d5ca047b51076f0b6d9a480b0a27afeb6c3a142ba5e54b1b51aae2e6849ab2ce01bfb4b9adb816ed43a38e184840ef934252fae7254976910e1f830233802bea1a2d3ab60aa24f57c0f7344662046bc5b9c809679a0cc8d2a54357c433b5f45489dc3d7b520e43d24c5de19d41bc4c093963eab2ee74686880de07336a813694b594660e6b441ae54f9e3d26cbafb9e72aea45d007ca7edb05b83a57c12e1933051d5d793f8cfb193182f1e8e927dbe8f426c1cacf5534b19e9899392003c4b8e33ec9c4b42e0ef55ad1a5eb846ad993ffdf07a72c5fb074b247cbe0704760abb6c152f5b4717d013253003882c1dc71b3dcbf6f082e1aaba88e795497431495e56ca116269f6dc522d0abd6cd740c0879e7902b4a0b9bdfea334b9e7f3f09fdda085e2ef1fe08ca900f4ecd4bcb90e3b7c622e2da3e5b97dffee8c50e82666bfc5c3146ffd77697e5d99026e60e9187d6421e9ca00f815befb9f9d12e565467b332c0653771dfb48af619e88484367e3f232c6183c635b3822a25cbc601fb7a6750b69381166aaae52e921b0f76a84f5931f33a6eaaa128001b15babecc822b807fb9d8c50c3f006049a3c86e2c0e828b341c2e4604ea41d25271a6feff12036687713deb9c873e620ef3f689ee919f3ff34e46f41c3b875e97e0986de2d289823088c9dc0e6aed52462bad4804592fdc373289603aba810db40a96f5bdeb453a42a3857eaa0f949ab9f2f593b58dbacac870 MD = 45a19bfa408943f7a44e3f8bde24b08eced95632b92fb30f87c04a8dc18c8fb242797dca783c34799b6e99907239b589 Len = 80224 Msg = f407e8ad17daf71e1feb8765a879acd211706be625857b09fb814c7f1add4999e1905b282725ae371e10b7fa7d427601defbf8b164e021f5a24da831b8ec6378bf87c5fe681aa5d0df2d40c2f66082a97f4881cbf9794b9470e4e18b9e64838456932e1623e2644f2ce92ba75afb5833bdfe0d1b2c79814e2cefff74146c32256e5d9f589fa4731ecbec7f90f33a810560c5a58945084b8ba0150bd6612cf6c3ce8c1fac26895ba384df446407468489304750fd8b4d32b392ff0c98cecd5ac63fc9b7fafeb9a348216a830ddf47e926f529165f4771bd2ecb550aa2a377e39689bc6e2a705bd37468344372c36439437616ff97c29b756513be0edc28511b9b740c4c24c498738e23e68c7bfac5fb4a7cb4148e41f4e0be31e21e2ea484893dc86259d042970c0018276610ce93b7a2cfab5c2a0fa488a2ef6a45806137b5e54c659e173281253110a0da1985f6f5b337a4df5473d2f57a13fe88baa59328f9c9be22dfdb7d4789d2f9ef7e68153ee57c47a6f5b4a7adac6645f1c4b9c069e30714ed1286b4f97028d9ae27bf1919a0653bb8f31b4a3aa2b0e88786e5e50009ce1008967b4dc34ed8e81dfdd2290f4cbb291e38f0e324c2b98e52e8702b76d5e65a7a5502712d8babcf47e6e86ea75146b8deaa7b9cf17648e05bd3a4b952ad16994b356348c08f693631cb4b106917ce910233039b2b252786a92dc7b81cfb27758420e5f903c3dac4e5954136dd071b5b91bad20859361c2744e0224f5d26e2982cfdd1ad7f8dc5226a2a13088c87f4bf94262e0c0413f06b35d2fda79b960ca74bb46f8bba56f4f8c87409affd002365126160cfb3236bfc83eda0e761b3704dea2c07bc3e872ded075a6a53b8db6ef41352af78eece547f3617523834e5d5300f4fe167938639a930c3801b467e9e15a0e1652f3e7c759f573a5cc29e9402f8c50445b53fbde0d54b9991302e537b6fbff6c91e29959402ed3d06ac2628c04e11337acecc92e9195ec3e6baf8c0ccab7b79226a39817a500008981f5509d7dafdc4c9d9c26f1e1c7329c7e02d2f5b70d952b93ef6a9ef3299835a42b19f0f4390a07afea7bb458791b37bca5407ee67e36ad6c0e773ba4fbe96943ec4533031d2add56705de2701c1494ca1f5b04e37a0a7c0189448a5517a298d3a168b014eccd4213963408c330ad3808d9892438918f2c16f859176ddd2248e5f2db04b3f85fea89f4a493cc4743960b5c615940554341fed43b4f69ed06fdfd4932bd6af0511b0bf4161fe5d0763344206a10b525b5323b9551bed397bf2c8c2d0626a4455f782c1d0f09ba6cc39445be19e6e19353915fc432c2359db9691516abfcfa67c9666ce7f5edc46caa4d729de748601ebcc3ddd96515fa4f94181a8eba9cc7e82d8a30ed71386e6098a37d4858b1bb384f6e285d5f16bc2dcdce1f0db882b7470a383a85f77642d92d5aa835e4bf5d6089d4e1b88730d5c8c50f950c0c3b22f4de14cc49ff23dc46c6b795ef21ddb1380abc7c837410e1a128311f124c42a582179478c20edd8529f36ec8ec8679612f30796b46bc235a3755f71fb8ef25a96f553bc2669cefe80341c4a3b6892ef7a69990306ab5e4ca0bdcb619587b50c92d057f3ba03ff77f63207dd8c5b07abf4ea4955e7807d19b8f3ae28e7967506f4ba6d337174e60b5ba1deebaa282d95277fffd67e718766941ef20f1a439a1163bb7dc67246ed82588a89bdbd576b74bc2fa3ccf406e4f9db467e5e56168cf587dc6ff2e6007ba394f4ef9bec712b0f5a031d8070c7fd9a36733a5dc298b47a09242b00f52bf737b8e7facc5ffdd42faa01553a1b3d38134dae0e5387507868919c9938c64ecb066b6b919a3f83ce9c533334421ceffe2bc7fee28accc64186c64aa2e182f15ed856899c4bb48b801efea1a0df9c65b8a94d6c9e48ba83789d51382c44509d187520480428e59e547d5352825ac328cc5686ff2ad6790e8375d96e20aa59d861a572b1af79fb43b180f94ec3fbb8bfa4fa1bbf6e7c30efccd607f26759c52da12ff4ca86861d03fff1999d490aa4b2a65db3b4538108afb98883cee79abb2140dc4d9d71967465a796da48fecfae8a3c46f7e7bf2f28d5b452f40a8ab4633ea674263259f328f10f376555c992ffcecd7e8e5f9bccb8e924fe03ac37f1e60b3cbf268f24e3602fa09ee1cf919abe06c0ce2224d0a1e274715257bed6976c106884f6bebcaf44a8c292f7bb403014bb7ffc583f45f6ccfd021799474eef1cd6938d3dc7079ffde3deda4f23bd9c297371d0dab7e1139e0c4114705089411fe426a0a4b0effab3685a3f900ef02624b9fe1450948e3f8129951385e06ed59dc28786d3835b0a8dc0a0896385c1162e128e8e61df33c39ddd66da7fffe5f2bdf9200771483215b47216806f8f18b36e088907b69fb7e719af1d3307b5d6e1a71058ea26055e64500626eb5d34dd460d225848f7dc04f31d2820e4c50b29eb848f96f99cc4c63f88053794d47cf81732e96116cb9e012fd3ced8b56008c6567cff44fa788c52ed84f6b0417d70516e06e30d3cdaee96e3612cad7081b5966ab6e7c9b66566eab86d61fbbb0017d193b19ac480cdd3ab56efc708dbcf187f715bcf8df5095876e66bce7fca047a5ecd5a96efac4c5628d1a6294fc0f33c6ab1923ff87e0c6ddec0a5c6a435319fe166295df486fe7ef59cadd9ece59426407384c0721b17aa0a8e44d0d2c6309043a447793dd78c53fbff2d5f45125be0e7ff58d96392d219e3986f757143a9556ad0dc7230669ddd20424e44c411ef71499d371333ace4c14f254f3ce97543f440310fce37fdda254dac370fcfa9fae14d9549f54a31f6aa377f0cada324a777ac110917b962eb326b861148d0a12138da2eb50710e9afdd84eccd5005187de595b6f2d41e5e770c601803772ec20e7fdab2a4d1ee9cb8611cb5baae78186c47e569f18ecdb926bc16aa362551d469be34673ddc4a11b83ee922fc4e65ee1ca483722ecc303ba2497384d2d9a19fd9fbd096a9af8d11587dd27abbb8326036045719d216aeac90bb61eefe1c86ea074096860fd220644025be071e754937627049a605f4afd39b1bc72fe275687f9b946e8198ce69d2173e970f4e0c103a47ee4160eeef9b7969708c90a76caf243c0040cd6c2ad22385d144db7305f1338e892791b68edb66a2c29a597589c3a2928af4b3b26ec21e34e4adb3b4e952e8de46e37f845ad562ef19d8d273550cc0463d727b9323a18cc982bade393f9d23e02f5d7281daf235f87e2e42ca57f348001ea26d36d0d635efb053a62b8f39aa3c4b7eb4d5969aa664f884f3a117de0067376cd1c4fdcbe14c786051b2628e4599a22c8ca716367fdb90c22b211e36b2248fb9ee6432e75888e1c928f53e04be9f3d50411fe32c86074dd13372f36424df2e6f0d3ff892614cf376731dae03dcf723d31c6784e6848d379753bb1fce1f3f1d78767cd634c640b74f7a5137f366495c9b65a481ca401856fdd22528de6aec63ba714455354d0b343d84ba633c253cf19264016342844eb3ebfad798fbcf8f081f46bffbfebf557326db7fb946e179e99f60a4b0b516d7554a11f9f68c14d0158e3c1453f5e3c87af4c5cac17a61a84ca9a3b5f38bbf5c440060b5cbfb025691ee9c6ce283830a538d8bc0043e6f70239a735db12b478589f72f319eaf61ca8429aeee321065c306db758b09fbd179755919c374ff76f92b15c695f710f9d3f626bac3ca05529c99c4ca53581a506c4acedd11c36e146132446c0a5e86911af0cd081232c8123c1632d43f7a01b4f1aae1066c27e0e864a76b6ab85c79f3467906e004f3c36d4d840cd978f61ac5af9e7adefe27bdbbab917208c67851e5009ab989c1945d2b74ec3a222654cc4b4f2d81abef4b6e55ddf8408e5c3b7630f05ace4c709dfd135b55a3f76f1d7e0d7860deb6671b597ea3e4bf44a42c519cbdc12d7139960defaac7319f7ed89ad4d33e79478d20e7fea55ed672c3d348f010d7bf404508f485094bcb64790d876808cf3aa589e1809c8a6d6d5fe4b8c4f690a56a00bc7b1a9d1ee7598c8945ad91be1b0a1a84e68d21fb1a6d542d642e74e63217fbc675e70194a5c460d50674179d2bcfeca6b874569f6cbc99c65eec33b986af778980c378118df22886db44c14f06736416de9f001f6b4376d82e68fbb2aa18bd302316c93da6cc2cc349855879b4dccafde074ea221fea338b5d089379a53c15e1e748bdc2f83ab3b5da9fa5c63ef46682475ddb51919a17067236c5b57f01c6c452c11c458b25078315fa6ddbaba17fce9ac19a54c8396b72f559570e41511a03eee9ae7168736e5682fe7b6303cd5f086108f0d2ccb077f66ed8122ef21357c343293aeb960e3156aa1496044e5f4c592599a573a6e883bb661dbeba9a2fc62fd7e78a5e1ddc98aa14a28566953f8fe96cde81e05dc8d7e9658f235d418caf6c358c647006c7ea7b48121132e05570dfc13e4cc1f937bba7f19608bdf0145aa5e28191c958b671f0cfca021035893663a921cdbd831f761d949a3782afae0e00672dd9121b907332303420a79ec32b9faeefcd7d02675174d5037655844215a54df703f3573f3968f3b632a022eb95b8571114a97ef794d43c3a8ede79b9b5bd1c49d91315aa0bbba1ba02a2c9e9bdd92ced6ae8ffb7876452a547c495f937705a8a211b5db93053c1a756569ca5eb28b6ec97e28e8f714d9ead68afe0ebe3e59121a4b23554f257dbe5f764a20767cd7c76624032679cb6a9babb496377004548782a81a76397f078dcad73e4f878f107f494aaf4274ec8f93506372586d8b708f67b30bace68451ff43f2b685e67bcddccf5c7dab7d0ab188412242efeb16458035e66767dad7f5895773638237d5588684d40efff6a868e11a7b687c9d474c0079ccbe459aec5ab271b395c2dffe5902e64bc38e76381e1438c9537cd890ec86afd080b48b240a112f4dfda6638937b8802e4bf5805c69b818b6a46f4175af99549c5f4330317c1becacdbcb46f88d3ddee608b38967a43356addbd24c881daee48a9a503e773939365ae0a01ebeb1f95f1d7a4715fc862c6f295a347e2abf4dec25d289ea77ca0fa8c28ca34f5e5e818d3f213e9a8d67f9ceb3b0044aeffcdce7e8985ee8b596f5909e30635d59eb5cd5c58df8ab9cc221f1d76dd0374a6ef2445d4c2dada338919a288c5ecd33d0e1e53b1103ad9d3d4b750ef416c7cc8e24adfe6e949de3174a320bf104137eb7b7282a7afe351131bcc4b4e34670d8b2ca614680125dd7cba5e4a2fee1c48cf8532afe0c26c6ab382c6d73abedc701a57a2ac021355203be2b1ea8167654f12b3c4a30454bd69db8e0dbc5be8b3ee9beba46e5b26c1ef977506c65d830494db8e9126bc6abe99b5c909c25ab9d4cd376e16231c425192b8fac4a8694be15f539d0100b00e574166ba22b0df3a2755156a5f93ec6fed50c5f9525650c6e4f8a1687df8874770a819e9c150917195d05e66e78674b67d72e7fb1a98b8fcf6a6ef776bd7e91ef117f4df4c681968048439eb16c45c1ee940458783384af6fdb3625334658099c2d61f232dc11e275dbacf8054144bb019020825f5fcadbbe2652483416af1c3cb2dc33dca2349b489ba47ad0940e973f500575dd8ae89538e055d8ff9aee7a1f56408b68d5642196fcccafa9d0edf6f66825bb8951488c7e8da3400c3f8083d26c21515dd21b05ef63880f07847d5ac52cf3bbd92f7501ed72ed25c0912fc9e479013e2214d3c890845901602b37233a33020f5381e896045475f2e32c26ccc411729a6c3a28da48c3d23f4a4195f0b3fed32e6ef53dc96196e02fba6d100d0fa9c80e72ae84cb669666013c442443c104e981a205cf0c73bebe34dcc075fb15c6a3f30bee720c8890970faccf7c7cffc9a7b1931026ffb92062bab0e2b32774ec88f06e767b2e1d36d7a3122fe93cbed1b02698c0dfe3a0807029ed307202ab7fd98f30d2fa9092fdca741301f4e38ca1756949745478d84358fad8461d2d38152817e9808ae48859c1fb15c24a11e7bd79e22bc72f2fbefdafb608702ef7a930f7330f0ba69a7bdf6090910d33386e7a30399625ba78d2f3c6d3f45b22025d57c958f7d0d812dc0328dd2b3f6ad77f8c3ad83f0c90d4a2da30ed326380dde2fe01025a8c99fe37498d593ad53b6fa957ec367d084cc3ad15906a3935e5dac89850b7ad7b56acfc27006d465b3f716a61d6ece69548d6504a57c37f2eab998cbb1af14739a8bfb92014b1e45dd17d314e8d53f2301f8d4acce9818aca5c8a8ddad247de540a96fcd94caf7b49bbf39c52721426652b48eb21d84cd2a5733e6a7c1913d946f6d325971abea1ab39751a222795f9a106a9bffda65ded3c8a15a12341edae7ef7e4b20e0177ce0ee46229321061f2703c1047a4d66d40ebfbb0b0450f5de488786c5092936376c1475b4816bef0976f362d00abdac3645062901665b3bd11e012aa5fb932fa227edcb1052495da6eda8f4079974628cdf639244219e1b39d02314f5e0672b457940f13df003787cf5e920b20eb8ae5f449f9edd1b61bba0c8b6ecbd9fee51a9cbd78e4341e16715f7808ed750d2b835db82f6d33eec438d6d815903206dca5583784b2b2f2a53f95933e581490aa9990ed3422e7186dc89274e04d14b2fbdd10becd0fca12863ae85cbcdb5e0a7a910445c29f69b78ae1b5ee3952e087b53a6c9fbc4be7e21c0bee110f07dfdf3df24e6e35434a60be0cb7a09b3233f98b35b276cd07ab05e91b1d7c9f3e08834745c5a316bf079849a21e38806b6d8cf07788b099b371e27ff0dcdc081e76ab39040090e1530fc2e06a6022837f1bb6874865f98cefdb0c4325c2dbb409889b859595b41fafe175049e13db1eedcd0ab240c0ae210d44e7c51255e83d8fdce8afa2eb994c361b2318e5afdead27e00df3f92f4af0ac5e09885f1c8e0f21e2173994889cd1862b51afb9aab9c8cdf314eeca085c763d74e60f547d39936016bb95f2d34b5a0070853b828ad8fc4074c3e54bf25f1c413801ccaafe7784bb092a573672314045a9424ee8c6d8b21ff3af89f763cf7d57f5f142bb16c43da33807ffd7ebdb2ec633fd5c54f51584bcee1c4f44e329f3d26d19041d6cac38a901b8f27f86956fe29f2ad64f8c3bdeb7c2be97bce6fb2a50dbfd733a569c004d14d1c175f91cae5b496f5f40f2a84a912ffb15e7e5bf7b43e12322aa7b202effefd70f53a9cd4470c11f69c1dee732c974462c2e65f3813c0b0e94e620b50f41d13d1ea12f23dcd3a4df585a976531d13e445d18fe13b699b8344c660dd73bb3876881e6efbcc1e45303dd63b2ceb238ec6a2b3004bc95fd7728abb299134eb5610ddb8d61e4be335a415b85b7705e711d2c190c103aa9d7d640554438d592c80c817e0d2c680c31290c45392bf6710a3f0e98f5b73a6ca9543fbba383baa28bd8680c0eb583567e5db93ce676dda474d0864d85501858e25f6b5149002f18415325e7da83d3076b66fca5263e726341602789437170e9337657b8bd149f4eb90b5fa4292dd3a998b33b1060c96137e06c66eeb8a1c0a7ed2789547857a7c0337f59c352fa01a786e0f8f13ede269ce253d8e04d47842faff174a6f33fc517411db8c7e0aef9aba66ebaea08b34efcb7c4d1f08a0927badc52ae32c64373be7264f1146a83080077baf54d670f26e1e12df6b1e73d4803f2c99a8a59f9302047f3a74b593cd9509b644cadd2386af6eefdcb86fd7a518593c4ce1036c786d722382fef2522ca1651e9058dc2c5677641c2a4f23536d0aa3fe2bd66d534e46da1a11f4266db76cc6bc7c45fb14cc91a8a0b3786170951fc4791fcf0cdd7d53e36dcda1786cd4bdd296f0db64614ec4e1835d7a51b4831f65b50e1307916d5d3623a04c11d8ed5d31b7d5603c9e46d7b7ce129f1ca9a0d22dbbe2eb87f8862b7a44713c183969158c24111dae501b93d488b92dead754ffc592819fb498318758d927bab615b0ab8be68e5adf0135c0ddb93a6de2c50870d442d577b5fcd43778e9ac0e13f62ae7d506325ffa38fc267d697da72dfb22eb03d4c4bab3a9d904817ce78056633f93138ce773257ed88c5aa16923f2010c39fa4f38b2d529a6b61c9ac058a8e55775ec7e94df885a31bb1c68e8285a602c2260bb18a54402a515f04c1fdd3003da5709e621ec4d546f7c6cc7e2ff8d9fec6ddd214cdc27bf3ce8a699ec58174530ff11cb75df99f4fa95f2c53df1b246b3e41b88bb9fa7e5d5f9e58a0f118433c135ad367a0397c33ace556ae244f2dde84dbff84f36ecfed70e56267150a056f5c3852e179f6c4898f13dbeb94074edf5717479efe81d92aaf0a075f85d9235357040bb34fa430b7ac454caaa2f61fd4118e01483fe6327b6676c7f8d7f8358e70387e5ba5d429549113f959e57e0963409abd0f4c0e547623b624d19009b48754501b58f10916d6e9ea9277b021a3f360e7eb62876cc79183329e68226018c45fe57329c5b591b4f3338892b763680afed01cc08683f4640186a52b23adeacc1f53065c986c228569a94c294fb5de1076fdb1c7cde673440b2cc9a8f8359314ff43554ffd8f31bea9a66daa0dbb7eba65cb4ae6d1f6bcd81c9f8c5034b9ba259c10e09249a157c72fa56da365c6b25f57c3688c17474996b2595dbf5d8cc874625628c21154fd458830bc93dc8a2185a9707b46225aa1f678d4ce54c7412697ee8d9e3df8ecaaa03fd2eaf9f65834a3e74cf3a367a34e7dbcbc5e9f26598ce69d21c184550ad86db306695437c37450adc372027ba3b7930a5a7f2cef384416fabd3333aa221f048e35c821154e5912497e6701c2fe65ecfe49b05c868ff47f83aa63aa8cb4e71b2e0b87ef137b6b4f66d8632fc1f5e1d1e50482cc80a306a6c483b3776145b9081ed2191cb6bd238e626bc6cb1d3ca3e87b0576eb6234031339d3d318cc571d61dd33fc4873960a55e8932282293534971cd6fd47af95624b5015231d226b7caef59bb1e0de98881c55f906d37a721c744703964fdd49bcc5a3c223e307e56f45d493da745c3745683707d44d8565b40675f5c2825fe37b08b1556608e1775dcd06a6c68180f49ab0084a2b3ede92a3a44638128dbbe5159ae56969fd4373d0bb183f1686c143209a363a7c55ea8b53f4243506b085b114d2dc58904ea27d608665d73b02b1b55f7d6d4337f13db25d6c9c970f9921ea0166e2bd896b82f675b59c09b463b6cdafd01a1eeebf5caa18841bb8ada634f263cdb4f2b5e2696188df0731134864feaa38a908210eabd52db12e245176136ca45dafb28621da6132595407c82f20cad72da6a94f6dbfb5f59a5064ab6761ab5bbd5f57aac83a57dabafed853669ea4af159f6cfa6b1cdf18a60ef40c289450f253306c74442dc81a7a643d35ad232e9a96ffed827527b30f5ac64d04081fdff0c5cf6b830409344a2e10a0ff5142db42085485a81a84d4322f22ea23a488badf7b88df47a6712f124ca0ae0101920d1e0019efbbd9a8a539998155db7c537426eaf93242a9da0aeb3c80aefb2c85668714dc663e20f7c87e308e1aac0e048e6f9a9cfef46cc86a3d943d4e3e30916a259cf883bf8f1690887a85a305c8108c0210e0afed8db0dfa1da32e65abc4a7a622f1ae2b08279afd0de248989390bdf96d460cf8e7b27ad80751e11d13e1529d531afeda1899578ffe1d72896df5b0b866b99d867c39186720b3b5b222495faf75b142f1332fe8e6e0c0a1acf398292692cf85509e582ecfef3271cde1e216030f2040175ed194293e359da92c626f6b7bf18bfd55f70338fd37df155695bec2a9cec1f5a367a4819de32e272139ccaea9857935a9fee0c9d028c5338b4ba113cc238c3309d9601587321cced8078617a3f515a2a3550daaf26eecce88ea051ffe876b78980f100e838a2e475bb2e6d0f1a728ea4ae4d204eb721c8f535b330eca62246c59f1fc931a532d3ab22334fe1b0579b5a79477ff419b1c1df6877307b51c80b853686ccdd2f5e24ee343b8cca975d2acc04b43c27e50b62279550d32491d47048f5aa7e336d8122cf8f9ba602461f9769ff27f7629fbb043e2ac48b80dce41f713b1f6fecb65887cf82c81e21430b7bc4c727442cb03d32a3b766dc18995353ae953a1461b020be5ecc6567bff4ad426cdb1674febd0e77f8c9ac47446dbed75192af0e2ad18620fdbae81526f17185b2c99a3c411cab4e9db0095facb092f4fa91c2afb091056a3cdcc4a91ebff4b0471116fcac65901113290287ba085c470a31399b8b850af49cb08f85dfc6a34c8a200128990e5989f9832c41e4eb974810ef68342414235a8db4ad5e128c09c50c950d528fad63f3a16ceb30b5c0b062af3ad31c02c4daf69087a2742fa694b44ede800d08994bf8ab24c3b6b52e54412591feb5b02d8e733578037abf7cd094b17b0dba8c787e0387694a566b9aef4e24836f93b494da3afd2444d42a9549e0d4e90add93b1769ec6a8e392318cedf41c9d9a2878c13ac8580afb12f9767d1339a70c08a6dad244d95233ecbf7adcdd8e2f02f685092ca5c69a7aa9b496c6b6503385ae4e6afd704ff39fe85deb3864f9d64e8051f32c4dc961581ae48cd354a92d0c40f2d874bb9b0b9bf7a5648d14d021b1587805b64ae0ee27f8f1bf0f48b4e204632ca9b4813b18ccad1e6d4777a18fefe15fc75707ad9f4e9674a3f73cf40112775465596ba099867b317bf417fe7f5ebd81ae8b1e700350a5d5e2079bf6e89b101281cfc57c0c7dd487071f40477e923f7621cef9e8a8c299adefdcd03e2712afef8574392df0076b779525bb0d1c0ef9b5c7af2477fe08d45523d3842a4b2db943f7033126c2a7829bacb3d2cfc6497ec91688189e81b7f8742488224ba320ce983ce9480722f2cc5bc42611f00bb6311884f660ccc244788378673532edb05284fd92e83f6f6dab406209032e6af9a33c998677933e32d6fb95fd27408940d7728f9c9c40267ca1d20ce920db5278679dda94d78254079654e3b69324e446dfe98962cea9d6a432993b22f57750a6d0c4becdfb0ab2372918082fe320ad56ee72618209ed0e78f00e6362fb92e4298139bc7e7cacc74611cd69c5a1f432e56575be76d88a2c6f4c9a1c159dae9b64fb756a42b6d911b8e2dd8f1459f02376d78bd6bdb4f1befbbad4dba7663ae4eda2003ea7542000041ed0fe9875a4ed8fd72d60d319c434b2bd3718b4efb83f280752a018bf1240cc28302ede7fa2ff94c6d2e33391623c08e63959ba94b728a8adf53513521022558183a632e24ad82a3904b47b966c2372a8741524ffa82fe408507423d7aa4344dd43db52482d15b4a03b7af7a3328994965fe1808b1bb36ea90cd3c6aa61122e7de954991bca26d89effad544265ecc312553559b18261bd0272ea7834a51d56f5fc9893d7a289ea87c9a1fdfe76bba2af0c971d1d6ca933a73b1eb51116d372c7e62dcf0636cd7eed121f7121d57497eeee7d47294b0876f9bde709ca06c2f6864e7a9711f7501a51717c4a6702b63734635e746f9dee0b8c83d9e2ba256a46938e05a89574c02137502ed648aeeef53213b1014ae5e845d2257dec8bd33807923d65600b3f7c480146cdc1110a8d564a682b8a65a385da6d0b39639990caade4d50059eda802d361bdcf878ad61fdeffe9148c2a67252dafbd93047dfe80ae0ddd6cf2a75ee277cb3dba96007224f3b50f026313a164a43ca5212ba37d088c9fcf01c6e2b4a999904f05790c6f2b392c528bcbabd2b2f2766a5a65a48cb0cdfd1275430a59b6ad635a36ad193da113a85c07127d8bae8cff65a52efbbe17e6c8502df398ae9847b6f7c4aeb16e1517cb740ac3f32ca5d83a3fa8040371ac6b63f0a2551833dced0d90460a6f60f5ba08330d7c97463768b950c9716657fcc0628c58f3f389e301c9cc212cadb6c17ee1219598e458d1b2ef318ff39ed1779a368bd83cd501492a9df3ec91e6f016dae8c839a564e5134b5e5a61f7176ebb3d7267a6ac174a7dcbdcb01ee6b57d5462719f402e836b6a968953f6186a80163e88a82ade44b60f6a18892e7793ef088a2dff6f90ea6c5628f286a2c3f2d63721fbd5fb2fe7e46c99d3d791e10ca5b1d670910e78e46854772c9b0e965aa19c6c4e799e3d7b4613bf8123ff9f8a31debbebdcb3431bdfe41599e98fec0ca29491f2fb6a73696ba35fc306be2f8723edcef23ad48bfb438368bcfaad418329de177be4065e5cb58a0efbf8540dadfc7d74165408b00d23c1051856ed3358d7c7816bcbf87aafc44621ae6167b6491bfc3fea80c66bcc011b5f3e86d63df81cff54250b9744ed18465c5cea5fb5f312e8a6c17983fba25bf0fb91f2eedddb69d4044a2b89499f1228f389fba2792661d13d3d76c7fc3aa4f04ea5339d7f8d6ee4164db434f520525caba80dd69c7d992467d13108f9ff7c87ed0ab178bf886cbe0e923e30d43b496fd94999728c432980bb1f10dd516b33264b1504f6fa5703a051da11e3632a77c100f136fcd5218344ab699e9bbef86959ed66969edc63c4698467e7f32e886dfea7116eebe393370ebd5342fa8f41afa13871fee6c2592f481ade18b692df8c87502c99a64412c53d656ea6404eb1468ad0c9a655488184ea89af3cc44c8a53d980c55fe2732abe5f481e212369d1fe853ac01560cb8795bf554dcc9298336493bd5e29f70d3572f2b9d45c0a8d2e181edb07c49fe7d5b235125c30a812453f146a69707a5edd93864f43af7c152023b646035c7919e67afa253d018b574a33fa2c79cbd3048d80988ccea3ee9e42b1e9e0451572de54406d2272d7a2b3bcf3a35801a4977acfda87d6e7d1d8852043384e4fb823a189a30c7e9ffb84d417eeae8193934e4e1f01f2d221a1c06623481fe4859cf200013366be1715b824d5958a4d92004ddae58767e30e9c4ccdd6410f57793c64865551fa457a8ea3129088b4f0af844ccdddeb35adf139c408a3be94fbad2ef180f08f35c92cfedc49b328bd2f2e879183429e0a878c02dcb336213f6593ed3f9c5d5bb7adb0ceca26c7f6116d9192d297ce204504317fdd69e8096d09cfef95451647ee67a8770336499140209b2e7677cb02839884196c7943e7bc7ca3be98f795c4488b76a00df4a25ac7dc9dc303afe3c534d8f668007dd44c9c22d1c2c1406651548d9da250ee8ce327160bf8f0ac82d8d739fac41ff413988a80bca4949bf29fa0e2a0166280439adc517828c3fa42cde93023e631688c5c163ad6cc8986e4dfac2f0074b9567112561364eaf4158e14f96fe426eb379917bda5b2b3268d97c1e4c74145cbdd9fca32d054a8178acf3e762dce1e840de45bef55d2f0e20c95c6d94fe4e220921a22d11cb9f894d6a0bafe0e4425b247d89929cfa9fe42a0695ef82d6e024df09adcef5d2744f2658d0adf85d8e4ec71e0300b77ba33ded58d0acff43f0eaa857c28bc160f25c6c40ebeb9391ec4a918b5e0f2e28659fd187b5adf18ea7fdcdd48b6e5dbe403788e8037197c685d6ea8b40c8e9490a953e5aebf942002ce4b448b07eb1348868e018c145ee45807a3ae55231d126bda49c9b1b98d8dfa827c77bd9c3a509ef78de9acd717e5606bee9623b55cc07a4565310ec939d73424f6d34ad4622879feee935cefd31403f2b5fcaa339c333e732cb8207f1770623e30d3dd40e0ef4c05268b06cefed4d524804e534e79ff3afc06db813ba50de726b115cf7235399792dc5d450519cc3689d417a9466468f24899f7cb9f60f445870e05abe8ed7bef3066769222a25eba8b37c536bbea24f6d14ca94a1ae9c80fd79e2fed05684ab5665b6378983700d3b111e3662f89a7ab3e957c972eadfda880e7f12d68340a7c9d21a052e636571484090ec201a155a1d91ace3d4b0c09a21b71f5c771ef5fb74d6fb9cb9d2ec5ef8c6393d4e2ffd35d49333aa710a2707f2fd2aa65c2e8af080f8c1c5d1d9ed1e732d80f0943c3954ff7753e6eefffc6a206708b62cbbe7cc15c1d4461e7e50f7e0fccfcf994bb1ffc7c6735ef697270bd67e215490cef4d75ab89de74acbfd3267bc8da006634d7e5407fddb2fdb90323ac8de4a306d995b78658272fac8dc1632f4212c828df5 MD = c16f349a856d4f9146bd281fd2b1502087f75ef0e2260015e6e3201f22eedbadb0dc40ed3c9e99de9ec5f761478492ae Len = 81016 Msg = b789d22f2024c25aed11387b3e4761dcc1068e5c6dba87717322226971b114f5e93506e7f3b6ec3b2ea19254fc267789efdedfe07eb12419fdf74defccdde19ace0afe981c83a5adfbcc58290c51e769c30487a01a4624d8870bf8332b395d774c52dfc9055396b93cdcb37fd590588425bfad25aa4330b3f9a74cbef78f2e934c53d40315ee6666d917cae0bfad73e3fe5879f5946eefb43b13711799a5fcf6b75702cdb41bbebdbbc6c6d3326edf8d3417149a428f0ae235978ec6774370a973a494af4aa446c4c830cee1969d448ab144a69c1a702845d07bcb54fb3331b36a82b0313f4fa585e99f0b9053004ce35b27568186d8f2e6f20651488c3ce81c823b7fdcfce584080759a46bd1609d9f1c084dd3ed8e0fcc8481482a91253deda5162837e72d8a5308a7c2f77984dfc6db2eb319b75b28ff6f34d88374b7d72dba5ad3cb69f16070d6d18dbeb136bb6180e2afdc4b07e588996727d99cba5fe4a950aa1eebf7ad67571f2c47e23cd877f26c69a3135aed6eec6260b771f67c1a5a40d2bad3081a3e75d9c81a755fe0101b140af6761ce9b94f6ca9a25b32d7d8b47176278aec4fff164688c0d0677834e222ba5ddc148072a9cf2a24c2381825a12dbceb796bf3b224af95c05d1c4aec2fdda061ad0b5ba0e4d10dc40ecee60a09bacc90074dae5d865c16a28346fe3fea8ee58952c9224be7bb770ba7bde98ed261cf9e9b592a0a249534efa9ac3c36fc7db05e31167c7b9ad5927ff6cccab9e56aed9b9f580cc0e6a2172e3917abd84bf22a67b3ba1139e56686aa61c531932a1d4d117a13ff88b4cae6e79a4ff32dc0357b2c407c8a8cb0b87b14516ec52589c21887944fa9697657caa2341cbd3d438dca3541258f7de31198432f912f76eba0758655d7b26b148feae86f46b111bd443f0b1c7dc71366ba05c161f4178e36008d952572c39676bb6f40b39476b014a004353b4cdb5621fbeb1651602376542a883c6ce784f38522803368cfb52232ea3e3b045a724efd1b72c8659cfe352b668d0392ff9c89270e4648f6bf1570fd6918a6e16f3504e064c16107724ed3a5fcc473ff82b46045c5e807c52c3fa15f67b8fc3952cc7fb41c01699ea8bc59a93356131b387381c8908ff83ddedabd3f2a46c874ccdec75f8c59669207efce1e556b6b4fe882f396b763a4c79c8fcd84fbeb8ff9a513e5cbfcf2e24a57903aeea82a04015c88be99828b92c93006d71822cedb32a515e0deb3f364306046a60075bc659b5a2eebb739304aad60e6e6e2e71933869389c082fb8575abe9ba193c03491683ab1c81da237955d9f5d7ffca92f1205d391a8e9e1ad09c23bc939b8a9cf8a02317f988e9898f3ab7b7832cb86a8029205d6e511959fb61009f7a34d286f18ae1656d09ccb39981ad6d8f7494b8eed635c82d11dd002f4cab5b17edfc0a5d5c275f220a6be9c0b325e1a6e046c463af054200d6d15793e68ab811cdf070649f5ccbbd96ae732c5786d96e76b7d6063df8938fa9dda650b6067d11dc97002ddae772e9b27d9804f5381e8f40cd36ff0777828191e9348d448874be23d702e195321c4c68c0a27115a378b246712c7795e8d87e97dd4a73197663c1a999bda759a4908ebf5fd79a402fae7f8f8cff9670b45d30c2a1302abc3913c177c67aa8aca59858c04280a8fd448a9d2304f8831f44d93c1a1e2ed9b53a4c679344810b199dfa527151e4c2d54ad2b50ac35f672aff144da73a8ca88de0d55b07fd1af925f47f23dc754d114fa94f6e4caf7c691a4cd50972de91c0cb927844dbd78d9a5a13ef73099401bcf3c9c971f2b296b27695e61882f38649f7bafbca15bc21153f6012ecfe9749ec4912086504b3f669c6410d23df5fb36a9abf2796bf931f935c44b034c5676dc9daedd3f38899e5b793b813d2920c604c3b09c450e044cf3b3a2890f366eab57a2dc0f3c3884ea9c46361c0cca2e0d51762009aa081b6793660727bd2e70a6928caf4317c0bb98ab7c1a6dbba17c559f2970c702ca9d365ab568c397852aed0fa3af253c61ac2d2b832ee2e43faa236056395109f6082dbc3a5dc928faebe33190421214bbc51c7f140a27f10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e148118aa239c2e73e8310c466af3280dfebb8514d1d0e36ac165338b71634d3b9c69e5b5a911bb05807613b39df365a1622d5536b253e5bcbba4ea071332bd5807e6328130c5ce494771341139f3e1b87eb719bda7d821a3379faf9ab4469f5bfe01e754df3fcd05e22c58aa697b041afa64b9efdae8fee7dd5c6b8a7c255c0d28c1ed77de072202fcaf65c45314368e7d391e15700ae44f54e5042092595d362e2e2a3256a533083b0045a81f45dfdeaf402e7694c73ba5454264a41f6a099eb75087cc6fa16adf4729de9ef69767d03a80d25c6ca66caf5779715e4adec70c6c30ec8f50842e4ec9321aed0091362dc301f30d202fdd36339415953c3f014af4d542c122d6e61e6921dfdf64bbb4bcf5cc77d2d9eaf701809a36931c141e1ef9476fab0c1dfc17ce0017ba4b9d4a4775e848f3bf6022dae794be9e13e68651208f5d9537e3d701a1d6a9c7dcc05e94ee5d4cb8f918c787108994ff493ca0ab13b4f2c6caafdfa489ac7d4e40ab5a6d06346d69b09a4cd1a281a0fee59ed6f37abe1888ee0a7cc82f897b979ee6a4986574914d0b6f1b804685cae210948ff3fcb6b621cb7b16343a758be91ffaa6ddb425a2ad331e9a5ca39bfaf5f1a7347142a3b4da888a15b15379958eeb6ec6069b4f87d14f2f332c62ce187db15e2b36f48df9fb4ebfe107229b81cc29ca6ed9c1fb2801882b4dba2a230cc37742dd0ab97c6fcc44a3e2fe4ee537ec01970520cf316d8506994fcca4a4be0f6cdab2b43979fd9593bd815d805f9f359c5bf3a16cf73ea4f001a32b775817a9b7ae13fe1d8b8b9d629524ee5f10a2f122a19f25415783a86eebb09f4c47fdd8824666ae0dbb022ddab4357794002666bbee7373f65824d7aae0def0cb7a59e5f22b148db010488d23a11ac1c63714de8dccd6553202097ac96795e59bf8141831e48663af92460564e43d949ebe559fc3c230919d5e1bd8f6093d4765c914b967f923f8b149e4ddc50604b8c49ccff18359eaf0e073403b574d3eded0f64310bbf252135f3e0b5c6f8ed9f4dfd96c1ef5176a3aa34a61e914bb01728586886556587d7e6178a1cb8a042311977e136d438719378de9672b56dbeccb2b81caff60b30bff5eff8f723df149d89691ac25922e5fae475a3849453668b06bf0f3270089645fffdcbe99b1dcb50e811d1e8f0d96a56979a5be8b0853deebeddaea255e64f065eb1615880e4dce7e032753f3d946512ecad0df39c8bab44258479741a3cb16dbcab57b867bccfcefc2b9329921c6cdc6e2e5859aacf4547e553fe2c3f747418746c2dadd20e2a72866daa3c80b9f7ff96aeb97f7dd8824678bcbb3f2815fd633054319d3261637f298938ec9bf58d18e0aebfd9882fe8ec4a3f2f2176a9b3ea5af4320b1b5f1141500ebdbe566792a4f69ec9fc5c4dff85f44bd877ad983e1a6edc7d7bff4faa75945ea7361288af10230f665c6cbb2ccfe17325a63f7a027fd67d926440cb956860f983c882c149070061137e2beff716ac35c541aec797974c480f58a25b68a6308fe1fa19b9f6e619446fd63c54f4f6bf1405be6df963dd1acc52cd7657aacb9d62304f39cb1f39d829c9f8f0a28cec849e85811f880ddddc9aeb374f78c2250210fd4c758d487eb771c05afb215564b725b34e161bebf60c04672a9017456f092cb7565f78f92141bcd170ae89b4fba15a1d59f3fd84d223c9251bdacbbae61d05ed115a06a7ce117b7beead24421ded9c32592bd57edeae39c39fa1fe8946a84d0cf1f7beead1713e2e0959897347f67c80b0400c209815d6b10a683836fd5562a56cab1a28e81b6576654631cf16566b86e3b33a108b05307c00aff14a768ed7350606a0f85e6a91d396f5b5cbe577f9b38807c7d523d6d792f6ebc24a4ecf2b3a427cdbbfb0d943c3f2ea7de041e5a7a501b03dc4ff052c84719e13acd280cf23a68033059bf1dbd62d9702a2c829e5c9e54f1496793abfcee5597df8ce6e439fa6a33f605c4efa789b7ddc99c4bf44a0a736e4902ec1f1e0e68069a48ec228fcc77869369e4b0029c111742be41034b7cbfa16688c557348e9b55f36a036dfd98d52491ebe709d6822f451df92c7467dc81b32761e4fa495636ad7258f36d8a46cd3478f594a12c255990e3b4d3eea61202cc14f511b1624e8135a07b84cb3ebea7dfceeeb4210b6cd7201b59ff1a11068712b6ac1624895ec416043b7e2f21e8ab4c1d3e0f307c3ff01c4d4f789fafa15bb094efbafac56e46772701a8403cac21a4ec4c6d778686eeac02fe062789c9c5cc3724c4dc1f6650818f33cba796f3500ec482969d312917fac0ce7157a5670c8f25b5fd719d2e2a5bc63baf0c37a381b32c47514b8511b42b122780d90d647920e8082d624aae1c2f547f1c1528a6fcbaac0368298b240c6a7d71fd55c9a654a708871c562bcf6e22bf69da6d70e2094ccc1fa1de4a4b69dd8b14ae72df17e54e0b9891f64a77675e915fb0ba1741f0911501c513ca6f11acc3785bd9599e733b7ba555eaae8f500b51cb68a526aaf8b00e129c6f14764d00ad05ce323e224896df1531d95f0071508814c8d5a4046ad240baed9b2f4a6501d224ce24978daa88c050ea6b66b01256bda299f399398e1e3162823e23d1a1d6b93b22576bc6e239a5be4b49ca897b4578dda2a60e30acbd6b702101f9f549a8ebb49374c2b537d016c71b1b9372f444422dad9709d10cd6764e938cb89ca49eeef5e923a542f3759bd32188c952c47ba1fa806d9504f692d8629f8668b0fbe14c68ec0b1a555c52bd4a2639751334131face5d1b7b1b1191b160f98121896988c7363d52cd6bc8c0394f2d69f9c8c3444aba16b79c08692c6d1aa69bdbcbdec37801828e0ad594ef6194d064dd51405975f7fe2e219bd2562fa37a27184b805d4f6d1ad40c27cbe1c41ff7189a613afa03146dffaa59efc76fb7fea3658ce0aeb3d570c53fd6c040075cfc05af7d359e787bd09ca4a703c8a3b4aea1520492305bd72ec21477349271b879bc9b09a2cf5caae0959f17d1027225f4915c46f7aa9dde9f5b386d7b51b9deda9dcb9b1505163df86b0830b9ed41888b03f2c89345f0886d010a4e16f6361ca939dfa60ec83b81829d5e6630e19858bc79941de7cafa30f254087d9a087d1e500145cee291433239ad204cd897ed131352ee9b87822174d9b4c19076f0f53089948c5a52e8b3bc780afc390378c6442a3030d5d503fcc08db3b40b2058451f906411ecb247037cb83720df63fcaa786b82296162d8e2a088d15e624896e3281ee0750a9324c91f84c25c945c9c000c51d926a2b37989a1458e3f2a324535e68faa3428781a5b01683cfdfc6fff7d8c6795b73e495e482f6e4ac4c78febd3d76d11cdbad3806fcedd07936c107f698527586978970fb4b74da78dceb3e3337731b7a056280f4dd44d92ab87e0945a631b919c061ef635e57e24f8a430d3eb42682c5a7ef81f9bbe449ea4c442e6d6c2bec1fd5b53ba62166a33a3eca92651c58ac06a89c629cfe96c6c1da5d9df55007b69dbecd7b4bfe6bc640e0c6f630d7d14145f2b14c660e20f8b84b0f7f65bc8fc19d63f1d8db5c2cf26a588060274d59ea886c7666dd544a89d685a3fc461789b226ac697adda373d0bf8e40f9d3e6b84fd9fe33d98b36de1e2471613b1fc9be3441817c88d93a0608476a4ee8bb0bb5173f902fccf81da262a8f79065783af6edf5ca742a588bad410ad5f15667221aeac30ab368aa7260fa6c0079a1d9d2f9854a6f978ae1fd322311b5726b6095ad726b5407d42b9bde9178726518cbf98ea548582ecdfcf85c5863f4194e2dca3754415773390302e5cdd2379af2d5177ff5f86d801e31e4f28508782e28562b7f3b4df93fbfb80d3c56843561568094921c6197d7a3092abd55092bf920641e4fcd9623b28dd426add59656016c53d890c38bbc79840b30856d6df3c25fde0d6db224be15ccdfb4fef20e80c45dd64b40917fc5afeac05f11783cbad00d4c5fa293ffb0b0a35f1ff854f69df05191556c2f449bc1fdae1f2b1c7e676c51367cb61830e3cb3bdece63a45594ce6f0d5fda44e224f7e45fd999013ce2de5325cc71e8be3daebce32b0789344da6e0d1cf5379624a99c85bf324d07e136e3ca1b79bacb1a8a14df79dabac9ab0c0cc650f9f76cbf4eed028d794314ae2643430a5fb0b110beb16a18c19b48fa5635a528586e2250a3f2550ebb1cbaa3707625cfe5aaee74dd5406960174a1c14d8b21f9bd0657973d4ee5b994347a5faa0efac2a803c3a58a7f3d7826e1647e568fd54b844a8ce19f554cf48114c43137702a891355e1313a9567458e6bf1a0058637a43ac532ce3ea7f365fe4838d6ad4c4d99b41bc79662292c74b46ee9d4df30b18a6ce0e9bb9fa96174884948ae7ff5dc6b16bfd74395cce58c4584ad7b5801eb648727f24836fc1fb6ab92643733ff4f8397cca0c749d33b029e27cd01e46c3dc916251ce298f2a692d4be1bef4deb1f59d3dca4a002ee956e3ad2b90728e2313e9652aa294a3f6e9f9016f055422bd474373a635c35717d25b81002097a065e2b842b3a6aaf2500336a475207954407595e905d6a65fe6adf825a38777c4b3d266c293e454c65e404cfc9e154dbb6108f966903391907d6e2163bbcdf842326a5bad72647b654827a4d18feeb6a14987d9b1ef566d30059d4001f0fb04610c3200cbfa2d05183741a4ebf3b39e4c207a9c93c9472088a5c3bcc8ec17826b69b2bbe3d146dc275314b512706aec050d6aaad4c60c94e08667fd80542c59a67073f5bf9fbae6dac32a400dae1d881438de6b3c8fafaf80cf116bf1d33f735b4afc17250d8e0d79b00baba556d359c1ca5e4792cc385bafa9496ee20f5ab7d11ed587dec2cc374b413d5fa210954954eb72a6a024ad7fb63c986e1db0840d521587afb2677c4e999f4ac5cc836a3f14c2a3f02c401803ddaf85d3685fc65d245799f668a4a439abf1ba44ea585a244b78788dffc880ce6c2a99058cc4278f900b93c3ca204ee0c9601343c6376dde3f347ae5e163eecaabd75a6c5186af8cde5afe809e84812b3b14df2c26c6ac56381f2f609ab969dee2dc52707e4d663a566b6094ad7746024834a566d3b01e7480612167f173f9f25861097addc3558240674467bfa2a44d3ae8ee59959bcb215e21d860af39a6ef568f06f0348e834ce3752f619cada3f4575a416d3330bc431987dbb59cb279bb248dd13c4c56f88188beabea0b3f4bdfe8af260a7716f8c3fabdb2cc8087793f0a84f2c4edc4bd0777693f6ad500a5f73412259827f5878a49e8e50f2360af63509cf1f2de7fd9c8f89f7449c29ab82285a9c77f0c77727f4e33fce44de321103dfc572de93054ab5388d0ef9ab28c49219c9327ee42c08950c480b5c5bbd92c1acdacdcd47f3797cf4bddc425f32a55511412f995fe799299c3f9e9548edfa02f36766968138976b51123312b02992c5d39ca5bc854a6816f59ede8c2053955c4603f3b6d95522f4d01299c738ae1b88d3245b651eb4e3e1baee61ad7c7f13221738ebaabac9aaadf44776ec6310bdf29280b73f66d79b0e4e96be75a7d0f1e8e96ec4eea016acfb3019510ec9f1e8b7842a2f8807f2fc1143205b715ce990352f1e05ff13cc98611610ce8ad7d22a3c3a994afb6cb7958f2b33af2ce6399c8b6adf2558904c0b7408c6260d173200f528469fe62f95e5dc59195004ee3165502f2aa987a01564a89a922df1f281eb76dfca74f4ab1e7b9d6f79b495df719927ee791908cdc932734e0d1cc604527835c39d809379a1b526d0bd636c247a96771b52ea6863d7f36895bf9915c71405b66628394f25c0211d1f5cd2d477acebc2583094032cb2360cf3f2195db557327d59f315840a0a4de4cde0897b2389079e07aabc8562f868b50b7d240a599c7cfef1a69bdec0e0aa224ee10ddcc2bf886ebc29ba4bb11b0a052e893fa81e4453bfdf8b32bbc4d3b43a24c6c655df90dcb8e82613e2917aa881efdec2b39def3534664970a7a063fab0e21a4992d4ad83010e386fc68ec7b29fc1c653b9330db0014849ec2ece01fc0b09441e003c75f9ebb0c91483f362b6d336e879358820528ad804fbbdb84e26ccfcecaa1a917acfbd5250a89779ec33b0d1ad999507b77b45a81335d0e999096b5f6c746e5e3c731a7587a26d8cb4a7ad048e4b642c43b8d63afd0114fc83226a835c03680d3b62679cb68892a66c814c5222e52f70559991031b13d64b9ce03f1b33ed9428e83c493a65c19351646f034cd41d638e5d7c2a9305b4b16136f17d897c897f2bd36f13c12de3ec184caf66574a5a8cb0cbfef75d358a12d7e1a49a40ae7d85a07d597bd37776095575f0e9f3de03278231908bd432ea971a4d9819f33220440156a9d5e3caee77a380a202c507cdb09d2ebf4c9a768c9aa2ab3a70f3b01836d8efceb67490c3c38cfd51452d6010a44c03f9de1288b6b9fbbb1a43d490cbda91b9469208818c597c3c7d25af7f529f3961cea4dee21f619fdd95e7186cc1bbb6439ffd11f5aeb5fbde8438cdae29fdcfb8bc35420b2d2e09835bef319c8036d10f395c1365a165764414d2fa84fd4c898921040e6c466bc35cdac0a2b88de85c8ca1339f6a1af4861d9d98d88c5307e153cb95769e11c757ca711ffe49515cc33c7618186b61cfa5bb9d0eca3cb1bc8198ea7e2d1905bd214cdd31a6b760e0afaf167e10f21c735fbe7189521e9fd6c4c92c028465a8c9ca647dca3e9b33307c4510ea1b96b16c1e96d9bd029a73e33574fed73efc5159bd91b12e285d5eb8a3aed3c08ab1b7365cc533fe4e38e46e5e2cd1709f45b5f9756535f1f68639d5d04cfda5f0eb945ea4c9fee1b78257d4a941524337ea4d258c4f7aaa1b9e5b346c9ffd1ee09cdf419125b8fbb10f44c29162efe39b527d6a5cc0ddbb1a1e4940e318307fdc5e0e8b8c68e0a0dd284194c0f208b63c06cd448169fd99748e7a87de66566d46a79888f10414759e75c4d7928f4b5f9c7fb320749b48e9bd576575a8dadd5bb1f213e68967b2de77705517909b16242f45d5aab0d55e1057119096fd1613bf90c5f72090344a6fea9058c14595f7c876d19b2fc0c89ba1c43592682578b82d75abb8a3bfda49ae7a5e66511c107ea105ab7a4c1eb58012974bd165cca32919d31bdefc62ca4efeb942f463ae8af9425e4bf97c455ca9e742bce41c5d05f5093b8ee09723a4b8e509e6996557762620e33baf3cbf0e87a45911210841119a70018d54007cca25f5eea1bbc2b15253c126e301f9f64b97be4ce13e96337687e2e78fbfd4c8daf4a5fa1cd22846b020a7bbda785085a458a9809593528e754bd6301e6a60a227c3899ea082f282000b48f49a98ccd7a9590ab6a6a5d9ccbe64ce8db20a50936110f55ee524bdedd2722973abd9cb86bb073631ad0c7878b2513052d3160116f74b9dbd436de6f4a803ddab86c1d8fd69e1d094113ddb1cf1afb011f9f41ea75af1c73c53950a40e12eba2ea3c771b626874e406b906e13ecbea26dbf4ae5bf1ca2265e9e50a43d2e61535f8b71324b815623e924ca9e18042c9ba86b7112e8bcbb2f867c172143d02a4dc0b6557727fadce5d0d5430773e8781064b71d129eabcb3766855f1e1f8707edf4bcdaccc60399f8a9e57026c20a0f85250a95615b7a40f25132af070aa388d86df777bfb03c0bf0d6ddf8787cd9718e6bde708b9998cad4e91c7d58afc60b719efeb2ac80f4a152ea3732792ee74c809bbb44fdf397b753809b409f796f2e6dfa5b223f82de08935689c4a532a3def047296934d3e794f2da47af57f1ff501212753cc5604880369e3e058942afc771f09173ccc518f23738aa000ea4072f0279d568fa93d4c6b143dcab91b95b847a2a8bfb2241ac3d953e2ae91ffa0709b393044d3b87f34a97c9ddfd5b0147a47d579155d1d401f5915d42d1287e8f7ea9f07a3ff4c7347a6e92ca9151d4f495f00a1a1a67f6cab8b018aa4ea4bbf10c5a04cfe7d2dc08d48a512afdf29ed2d776a4bebf311456e585f299b8110cec1148624dab4230f0e78f776799c9b972e775c9d7cad9c7470a676dc9a3fa1bc14bf97b9c10cf608d31f268090b53cf455471ebfdb3de8a0b95f8fc92a8cc53211ae1c333aed6d52e3237b5a7b90d4ada9d0f8da9009bd725269f218d2d043d8bfc95cbacebf5296466e3e29c2972b6932f83216247be39242aee7f21b73e45526f9a17403ea6b7b05e6b718ee3108d1f9a8139a1efa21a79114b67f8cdd70524e24318c64d681aa27752d4c86c5348c05c9e48f06ed41594785a6e6ad76af764033552876ec5bcab402eaf012bd78435f41ee1c65be09526de8005006a7686a030f5571c392c384b574342a1a809a9e0dfa766ac1d442370b240de420d665d59f9e798ed2317f8031b554222776624419dac7a1a597b4b3272312cb826d6c601dca09a72b32586530ac9202c0079ade8acb28e8966f266ccbcc5a2cb4d246b3847a4ce657fb16dcba4135ef6e9b081369b4e0671ec4610afe072c303f6fbb75dc968b71ddf6818cd85c8713b89a768cbd7c3847c4fe2e36c9bccffeaaaa924e2d050e70458a601e91e5ce96266caaf18e0d78b01085539832d38cc07ded95e880b11d0c181e7d39eec453a040796ce9e54ee8c98bc298d74435ab9b419f8ae8dc81006cdc1c9e86f5e25e578f2a861cc927cfbbbc1bc79b04c874b97d273af94a5dfeba1ceb8cacb02536e69ae5be33428077ad2cf9a68e7c752e42b9ef6dc1d12d611b5df30f5427762573e913ded6584126c861c5ff56b325235e7d5eeae879d96fb9299cee2661be7127051dacac14532534e5e5989bb1be993352dc7b174a4a71bc074ef3c966e363297569f15e7d9cbc1840c339067f29d9ecbfd1e6f64d66ae4c8071e4e63ecf43a2c16174939b05329cf8c5ac3e244f2baf4da5f42c8916708f1b6d8a24f26859b9726cfff47776d1ea9755b8eca817d6a482c16d620643fdb060aaad2c8898ec970ff1582918d8df27a5da24b8146824f5e98b193fcdd39fd5d79115a50b454663205a48d98711a57ea8bcb9496f2c5bc7076cc06ce5b09b27098889388059ad462e0e97acca0b6b152a623f48c14ac44566cd299056c03ccd7df8d38df1bb6a68c0750d4cebac7914b2367e5c12aaa7948d141d5429edc9efbb4ab94b6553c5f05ef7725ef1de16a4c99f3d2e6b344cdf04ab6460651d89b74ce4041be509050690fc8d8de5888bedf5054666d3d0fa4c54f8c65b123ac54bb7307ca478c574d4dfec277ece922116c1d05fab5366fb0304650bed392bc6d38494e88f266f587fd22f08dcb4e31d47b26951a5f2de952d9c58fabfe1d8d1783c7a1183f7effa32f22df84da065caaa5236e3fdb82011f2a43b5c79122931616649c029f42da213c54fbf7998ff6f6428a0df5bad14b779a575f9c3d4062cb88a69bb292412984ad5fb240aa79953a0bc100b66daa3ceeb276e994330570ca23042ca2a90842300aa9af1a5d21cbf8497ec31c746b3a06fb08e04a42d041749e13cb7d43e6c8c5dca95ecf4236efb38409d1726f92d732eca3d018cd4f596d524bf49d038b31c88bf52de9fa1784fe53f8c8629fcfa9050fce35aa42c13d06e823347c6863f18aa113b8e4e542203b31d20457b56003ffccee8d5933d440f3a82007a5d2efacbea46b7c6a845555ec961c01ec20f29c75ac9b43b010f719964ac8eaa3e3acb7c71e82d4c557bf7a95093d6d7a7305c729374af5398ab83b81288459e11b19972667f07e9fefef12d6f3cc939d1c08186cf5842e7fd1860b16d9f8e207d9c4ef6f291ac654bd72c2f4fe3010ce9c77f4c35fbd3bddb5ef2cf9c78cff62a02d1503da88488e30d8ffa1710e618964e400ceee7cc9fd8861f59c79b71e9c1eb0ac86e4bf71a6fa801d5f04be024815bab0e21a493539c96d1961891ddc1ea60e1a6ae036de296b16c07021d57fa51f9a899f7b892a1d099efcfb5e17a464c673e3124564ea9012fb7d9740db360af2d1ff698ad2f531c94614dc613af40900b09b2f9ce0237572aca936fa45c1f4301f86e2b0bd42f27910f5574b0e6765d512a7154f3f15441ab8d7d1a68baffb47c1b47d958e8ff9a97e132e63f86b15c4389b65e4c84c867b8e8de9ee335c7aba671c9c91ed3891cafbf2a4648f7b935e80fc93e61215a705cc300229d3641cf88e03e24e4fc9656e09187b953a0568f48a2f11dba32d4059c0629cf1d2333c92951ec1133cdedf0323f8f69e9eb50126c2b7823e01dfccd8299a2cdeb66664092ad1cb992ad5891adb18b7e913f6e675b93a4775a4c9b711564b3438f65a2ddc9da174389049de15acfc220d40479361dc0be42b02578985d4fa359918aae48d8c222d8a03b858a40827e7539a33a26bb9c0dab6b125deb6343bc397a3c5428c64b88a060b8d83167b005a8488276e03c0edbdb127910112e264408d2e25a259c5f8fc250e45e81d842a1df890af80ca8fd6efa2dc45ab3c6e284f11fe689e861e58167f927de1f9a21974285a387510853102f445a0379345dc41aebafa9191dc5a4b6e1ea22b6b53332fbc3b6ea5763f706a2e0a3d30a7f814cabbda58260d9e741d89293f0ec3262b92fcba9eac7c1d19b7c8807920faf3463cd1e30db639c339ff4948c11691895730926e64f492ac916e5c5ee072fcd6052a795b87ecd6e9108336d3b4dd66fb4a9ae5bd3e184a7c7be041ec0fb13e0ec6263aaa5314457e9c2bda70a6bdb40a6a449f2da67213fb3dd021be53663f0c0d826e55fbd70602316b9c960351f9255a9007462abc7fb75b90644c680c606c4ff1bcf4eeafb90274c4f5ca4714b6da803fb68d2731fe1f59a3922c9a1e428e01e67efdb7f8af0ddaca9e740e806d987f863569488d1fc1ccac33c57606661fc7c35cd6c46c8862d7eecf29b62f9dfdad260c60fb28451d090cb1ad986f4b60062abf26b055a5c000943061da7cc8689d71941abb8e0eafa337945b5db3531d418f1e53e85eb7a3c96d4aa2e7e26d77d50b74ed0648fce83fcf6445527d2d960e6302e4f8e21e6cb6dc76636b0afd89c846176e67c360551336a9f1f3272b68d14905604e8a4aa93d645c29d061093cfbd404055c980984e20fddf7dc4bed141e938e4c75a1dce7e197647cb45f110ff417c348613128e600ad58bd6a45e3165ae5160ffad3458737d817c2938f956125a3cdadf2297ef713b1d2b919bf9dee2ac025313a99052594b8ee91da6d16df24da8bbc9bdb5c368f9fb48187137e19e2874446d16dac31accc7171056215d8565ea5eadae14132d8d9769d2eec241836dcebb74bcb9b49d45528d6b11902eb5e9274bf1bb5de6a83f1a1627d93f0678c239409063d62cca0157d3949fc6e968208a0bffad3845c156acd77ffc5939646edd5c29d2d8338947ff72f5c86c96885338253d4b4c37601c7435421db6e131bae196a7d268d1c25e71f1f4542a3bfccb5c21155f42c46dd79bb7d805fe06c6ee6e77732b2e0f5d8fd6d8fb0aa7e2accd1c88eeafc1f4d0d048e6aa7cdab00b52ab86f3a5d1f4422256b071b38c9280a4a0e12f0572d0714fa4481e4af2e8e82dc14b9007fa895a5f1800be178054609711b44227fd5f389bd7679d36edb545c9d74eb21b50d58b8d455049fe2c2f34ed978a8edd09aa0efe08cb900973200a6c1618c2a77ce0bef604297c30372be4ef59e97bf13eb7d9be60fa5d8b2e301f5fa630267425b2dce07e11be744a5058e5805c712946908324067e6e84c3ed6ceaae1e484af454cb94db9278940da779173368d84fc63df27822df29bcdd5fda54566b8ff191cd755a4234105627372dcc9b97182969c41002dea3f8fb228f4fe7c89e6230a325c079db7eef8341085d4de0709980d42fc309605442083a84b4e9293f2bd0d264963bcff87de30223f2e3297bc41bb286f5d7d0796eacce46f2a3a4d6519ac893dee6462a223d138fd2d49e41ffc4a9cf8db2579be6af86deef5d5eec3c532aba80c3679d475a1b54e7686949b341611473e31d4111d90953955f820853c6a3df631a5bd85203c37b17e9af1b495b84 MD = 4b10df4fbdbcd0ab46f3132c2285a26e1d9c74b1b7565526f02de3799383ee3e183c6d11b9a500beda827873039c4523 Len = 81808 Msg = f8c0fef4aca77c1e89454323a7a348f8baef10e08c21c22fabdf80545e9df716de08351ec3a5bbb6bdb5d4d0845d254a120384700ffb0ec38d6373f9f54b9544411a52d76c2c9da727c0d46ece124df69ac43394188290f2dae6aa126c99939089bcfc288f864a77312eec066c0beb84bcfac2538f007147fa30cdaaabcf1a831fb7db1715f9e9b142c6c39f4690257ddf6cdcb65cbbd847550983c69a3551a369d298afe4cea3dac151024144e823686ae327c368fcee7c533974702113617bd0d7dbf5e54d9f7c189850f44e5d0ecdc7274b84990ada6d5d8749af28b07190bd8c4bf300bd061eae6056c14c350e345d00f101d82fc5a2d9bcaa8c9755aa6c96bb91b01e68ff49eb74bbaf26b94a269436c1410eb1d7a431a03e0d564a3496c42a55342594b384379b28c7c431eb2ad490624c21d937facbfbae3d4dd73696b0a23e88ff8a4957fa9c45100ee518c985d77d2afbef0e2c1195a1216544d8f5c1eaf4b39292ea4a9c40b992ed1cfa8a0fd3b9e4823b83c36936c0c384d8443a5ecc20bdc8f3bee6854f2d554720b9f5db4cbf80a004bf463da5b32a93dc9fedf10e6aaf87f7ecb21e91486206377c924f0a36093c94ea3df4ab215e7b981496e1797990b9e49d37cdcdb3c010aa6bead4d4c7843d312b30f610b3682254c8be96d5f6684503f8fbfbcd15774fc1b084d3741afb8d24aaa8ab9c104f7258e6ec78ea883f139c268811571790a9c370e8b2b0d67513b5902d7b16e01b52eb94a9ef7fd81e0bf74e667534611208fad69fdb51a3fbb72b0545ce48cdd4a957fa7c635e8d0c155b991b912c9a0553ac0730b41f2b9461d0307a0cf87d8361e242ed3c4d501219122f31cc066a7172222e23a7e11348f9ea3a539def983061d59184e215c937ff6237308d8c7b5f4ca471011a61061f67c24a58e9f5c7e1917812cabd7e9f83af94d99e3e8472d6cb79f8517765aa2293a0891259d2b2a0d912ea46354f7bfe11ef3f0546b7fadfd6ebec9b25b6a75866cb1f08534d007421ed4481b35204b10ebd8eec0dedb981554075688c1ca6cac68d33c2402f5966514f46019d4de3a38c44f1dcfbed57c431c1ba3e145e4f7e9c2cedc98940677c518118505d09bfdc74ce8e5c78817db050b6e4a82546497ed1f176a49448cfc009cbe3f6594e4165afa18df4ec6fd34e9b671a2b279a3dd24b24f6dbcb0f3c3a6274cf79fbe311452405172cbf8000a5fa1b85518223d280f40d94f7955c54f142c60363aa92d684ba44548d597cadbd561c4da19ea9b192b3f4797f59f9bfed9307a83bcd21382b5ba56b9e222b819f95b099a3e4f4810f6f20cdfb81ac26363b80e58ace59e141ee6f84e783552552a12091e0bacbeb0012dab7f4743e31d52479e3d7140276ce5aebc9f1e2c140de60b45fdf89f7976c836a5ff19a7787d13439c9aa07e4a2db89616043a8387b4cbcb32828ba412c5baa18ee7a5b1ed132550ac08b0fc60b6e621871663e827ea39c671744b36e53d66f2c8c171ffdb6006e32f00394725992cd5a25e00a67f0ebe71651bade49b3e3baed60514edadf4466fa8099feae354cb26da33b76af792d87090112a299f58d73a493af507ef30627aa99d6b54347a6f99a14fee921c27063884dd56625c0d982994cba8db19b4c988a624121f936a78b29a0b2cb8673bc63da5d8a94b6bdd1cf14b4f86e3a7f20a1e20462ab97aa574e626ede83a634196f495ab99314937c435df3f359e346892af9a6c1b9e74dbf2b8da70a7b49ab906f1b6cebcb07ebe2c4bb3033b77299901b1871e7b5afc4e60af172bf1a3783284b99baa6a4576d0c3b78943ef1b01f3b5c878d5b05b8bad5d4d7f883c83762eaeb0b6d7586cbc00191da469e6d658194d68e21a513cad5926f8761e1ed13f1dc38b9acddd92d8dc9ac2a6edb955966a36f75554e45adbd27c549d45ef191d70818eaa06805437b6d76af367bd053776f108352dd05281b9bbd6579843d7abc7674e8719d72d633f4d6b3c408851d5c00a20140daba0497f73e2279da37954a2d35f9460488ad5c66b37c400a1e7dbc5e0b3747cdcb09d84232cafce848ac273541664726b0929fccf753d307023c3f92356d8d3fa2ff878480a32937d885fb9682779e8a504ba42d8980a58999228ea306eb3db8a6ae4bc610f6294e50ea6f58df7370b9d2a11291514bdd174bf6519968f87dbe3fdecd0fca0a24b516a12a843fa4e8399c5c920037fca33a80822f7c42de75dbd556b567962941f59472d5228c502b941844cb8323da2178a08cd1557be34f96d0dfaad65c99a89531271838adc06451ac206621fd2e7c5c13dddf2bfd5030779941546504a3821d54869ad08a3cb9f9c2ba0ae3ad40df6b413d0007af6d420796445c1b768ff716675904f10b0b5213c1d860cf1b58702f9373dcf07981adcd30af6a019aa52e07d166fda41877582711430ff030be572f6f491cee43d69952cf4c251d582d5078fa762ef099c6f3be1ac3c04bd2b9bdf33e856809f5b22d1cdce13679996e84f14a503fdd76414a5f43201beaea93ca0469f0674a785e91b5bd37441d43b1f3fb29bed77397308692f621c7d46192a5e95652c2b8b222eea5dc16f80f403ec41dff869ebbe4dbcedf9b8f6d111dff772a6f73215c8c456c72a046fa59765d20e034713ebc46894bcf9832b4aa082267501b1a2a3cee1132a6708ef103cf562fcb30475c7ea38425e956d245a609429ee2c1118862c1cc69c8b6b78613327018665bd0a30ae51283b53d37c70d07a84368cb1ee1d6ebbf3861d98a609386f404391ed3b867f27c8dbcb628e3e7ec9d7f6aa00ade9e5632c8f841cc288ab52a1acddf1a469db40a6d85276f413d9f677a71a89c26c4e86c401556488501a65a83a9076bf3b511034899f9d28816084e5b044b9e62508bb7c9417fc520ff41cc6655ff8f67b6f3b1497e951a617b0f9c4bacf1d6394826598b02270aa08c6ec8ec5a2e4e4ba8415a95be610f73739c9771f0020e54b6a19bade3b3e0aeb015953d3ffb6f4794e34757e1c77867069789f658e60c5aa1e4c558698c0ff2741e7c808cd0bc0281c0c0b56d2e1ee43ce8b8016c0599f412d61fb31e1a5f13df71c5deca14fb2577c20cd7ecfeca931e776dbbb5c87cca1061f1e789c598bafaf7b87e802ef5577ed075e6e59e421bb32cef4bba957f83a36c821b32f6818ecc969c89368872419fd2410ae1784e2604f088da03d568c7d3e01b78a213e3385d37bb2674893a8be1b1b96a67f3b85917a97e9019f10040a9a304266086865fb5c35b7ec39914dc4d53252fff77475ef6411a94834f0f942c9e854cf4b532acdd20c5b8aa20c9dce9a1cd80316cc2dda99ea40fc9595d6b65b9e612e70aafc6dc3841fdb2862234bf83f886863bf27d36aa64287476b16e5add6ea1c0ebc457baf116756134e48cd7e2f069854a9fe7a74ba1080b0dd44415f0662107c23b047f358e474290da8b37a4fb50b70290c3046ba5d616888f969edb16ba45f6da7734ebef9cda03cbdae9b36263a2cb8fb853f1b6bb1e4ea80cfb87c69200ef6a58e1fb829bb3f67e21f5f56dccd00e626e9ec51ddfaac7e74d36dbbed4c315b24e8c4c8f6d54cfbc07615463b0c931d28eeccf2269425b160257be45a613d07c023fc85e3945f84d3437b78e3a139ea7c046f70c826e72fbd2641aa5307a888e1c015636280fd7f9517f05348f38bba9abb3252551b774606667d6249b7fa5b143dbde616239d688063f289edac0f2a0f83b41b3ffa4c90b6567da0b0fab8fad1fd349250e4b5bc1fa8107144131aa534ee633ffb3bed9c4786d0ea2b384ae4a59f47dcb54cdd06dd64c8addec154a8b56bde351968b0d5547805a30b0946b509943639a5d489c5441a9994304f33c10b8c739f1d095cb8579a8a6ff2e632c8686cae3dc5144273ee49e1c8cb154e7aa1b0c1e2688647c1bb7edda5554775ab5c990e6d75847d9f36636fb011abfb32127957839e67e89e0a858de7b4a5a5ea50a9d52d598db1a3a71761eea68bc083c85693172136d589cf5f09ab939949e1ef0fa111c3c8752ddaa686e8fc2d34ec4dd902f1937b9531645bef65649ab84e823ae09f46ad4e9a2bb13d137518ded82d6135c7679e8e11841c8db9ca12977ca4cc124a74a4847524c7f302c3d714d3b19f99ed10284696891182fd16a96de8e133c487c066dd4b504b574b4ad08d7ba4e4adf71fa1555cfdcb6dc3ecb7823fa1f265fbac3cbf9928cbc8318c9d8f1c61c0f069f88210c15caa8c82bed59add7198750aaace81cb28b9c47a0bb6b04262b4ffba3d432f60204f8dddff7c0e4eca8670394e64ea7deaa5ea793a84979a32412a6c507cf7b5e32ae01a41236300375cf60c09c8500dc91098a3bbbf8b605af60ef4d498103f0fcd01ec06642f9e227c64f75f4139174e7a5dade190225147342be82c1cef68108681b7c1a6ca7526755b8fc1682c070553b7ec5edef2d9719bffbad9841bcd9017de020573ca21bdd83839d2b5af79782d15e385d45355848e08e16f55fbdc08d1855f4443b5305305898a05b219db01772627e918ea71da9ac5f0501b262fe544062400af020d809dcdf4dcd611984bb2372e1b251eaafe42b56c2e4c1115afffdef4bd0e3725b0f1841ecaaa1d5db17ee76a7e81766d6a0655c94c514339e3657e45ebf9db257eb13a4c4196a387cd2da56195a678359856357c5cc343190a05729c1ffa5469544d5f21e4343aa3195effa7f31c9a9023c2c319b23a871f9e604a6bcb78398dac367114250b493c008364a2194c540976dc8d05feff85da0b06744970fc00ef110d0eb7867455cf2d2b62f46ace4b0e1c0401e585bad5c4fa586e99930e312a1d2186608b07f6b8f9c788f38a1ad61a8db9b01d08c4ed5cc6d6b7e0b42740bb1b1486c3954e9295f0d82543d9aa9bcb469e1630dad6332e0b11eec356cfc61ea5767e4557b0cfe29cede649ebf5e27cc101a2b58e474da5319a5195fd7027b14697db5a24c6e53b78694a9a339560bba784f41f9590a35ed4c0aefd1ab0ec3f79293c969f0998ecfdeaa09933019d1444a888d3836acab76f35555d20fa8a05a78af07f18f15193a7e2a6eb8cb2ddf332ecbf65da0e3a4b5b58c32ac2b597a06c3dc57844f685ac00d1bbf58331c9f4ecb2267afc13688733bb970a528a8bac41c1fa1685b1cbb283486e4bc906e775fca94c577c12dbf782ce3f6062e1ec65a2b82cde6d9b9a23c9a72c42c09a9d12cd229f9fec850b18c3113ac1764410790970cc446f2c579c2e8e749efc657147f8ceaeb89fd28c777f2507a1ff39ce53008c56cd0cdcaa783c5ee5a4ff0ffa81ea0de8363883c670016a2486803b4c90028b6aecc934f9447da8ddf92af2af5d1b50eaad39214faf14611fe38bb1319ca9ce673816bdda8d6cecec1012a5f6362738046204339e91029a684d843403f540f5da1387efb4bf74ab9e6e48a265a97843e4093c2329b266868c290c4c3a16727242139f331e574f6553783f607423a8d508174388777faaa60a1a76625a9ca8c42dcccf307de1379aa9c25978b831139bcf00bccc1e7569894076750edbd47e7bfb939a6069e9d7cc0fe14953985e52d8c749fa7675100d90edd16aba347a4e0a49fc733b58dd9a6a04396179ab07d14c8f779f0011fc116d60cfd9ecfaeaa1ef878bfc39c1491a05155f445346da3947660e2d018b861f7f27b6452fa5a214ac32b697d44998b11db1a764892221d55a097206f3384a8236c1192eeabb3d10b0ea00d8a348690a2477c63483939b4004d837bf4daeb5e434cb8d19b6b21810ae0bff311f44168fb9c62056cb318303d860e3d8795554afe98576781c10cfbef4170633b0d34dbc3e2b3a2dd862959b3521fac52ed2a35fd5ad59dc735dc0561399ba43006c5b1a2215983c33dd2f70bb99f127a69d2e7e8991cbb964ff96808d128ff17675eb142623bf0455d7dd1edc374b52a92b628665e13091598cbec8d10ffbc18b966a548ac41308b7091b0ff7987de88ee3cc01fb0a2cf6d97bb5898ff08235d8345535f08538dbefe765cece2c0d4bc07cd76bc97b154c5d42f76d0a42c7b0b4d62832d7d594d068d939d5a0607e1ef65d213e51b28e146d8900cde09510e4da027ff5a133bb98aa7523bf2ee454b498eb1604145efbe172a47e3693660224902fb8e8fd2e11973d31afd5ba1605bf10cd422791cef336253bac31a31420027fe46f774c334b5e89a54ac3d2742591067a12434a80e884cd953739904ddf010197103b0ed1ad4128266104289d18dcd25822d1bf23504ff4679bd8db71b392cdde27aec597cc01915b9f110cef73e51d0de04d6014df0a32193679f50e325a2d10224cf0d43bf24dbb5174ffe9bb6c3ef1c720cde3c945ff30b3a76d91cfa9b7d39c80213551a5b5bc24aa822a53b4c0ba63f658fec385c4348febb59b0013e6af0302c739c19e71d4951c241fc1614abe3338b1e4324c299b27b15d98682b41f8d22f633ff03f0a9b0f547638a8f42573b1523922b9fb87db1782d6086c524247a67075d65229d8861fedc9036edff9816afd8f48bf36678adbfaaf69811b7021dc709f8b8bc1741c2342bd1e87a72f4dcc74f4b4a66f5110e1635a3a4b09440e009a10ddf1a865c3d5edc2d887cc4f5f526339f52418dd13c46767092e8e5662af779a3c2841161394697adff3c1c23ca942af98acc553fa01714644a02cffd625739c24941e0d91eb203583302a305c1d9dc60da4e76e3a050b888b5457c8cf2f289725c9b1c4c536bc8360d16802343bcf3dc2a111845a5bb09e2b9fb149b41900fbce3d8ed4042398f4f75bfdc05b9061475625b61ee181eb07d3f6abeb2b7f976a7c6417a3f52e300ac5446df34897fe9346b757c655f42545e30dca35abcf4643ced1eecd0eb33c25490f3b0371def1a202ba78f32e4ef9e8f7297eb1ab84a828240b76a7c75ef7e4f130e7896db1e4f418b38c3de0dec3517efe4bd7b13c37781a8531dc958e0dba6c3df5eda2dd42fa073723ff04403c3fe8d0a41043527eb410b3c2d41fdce82608aae8b8a7ad86244cc9b2cf0f0faed4c3653a13d873e88cb53b8c16cca811a854fc2272e29f391367cfcb166789a5d0ad10502ae6fd0f326661001d128c04c1efa64594ea4ed647c6dddf7db46abbb4046698fe056a4d75a2e8c16f88054c03172dc4973528e8220858625d7c1f5aef47dc76d5aa583da709173286938061dc9a17220249b9d9429ae3e64e0513fdf305d67c7a4c235a46f790f5eadba9c0beb6e6e06eae7e441a0cf4edc805e53f6fbd090c3471782de5fcda6e14b6cde34a1c117224c9e29328cd0feb43e50f79a5ebe8b89ca0a3230487581d9cbb8963df282b69dd228350ef5989615a290f4735f0da142b5050c413358e86db6058ad1e799939e04eed07ee4115e263584122a09a61716916fd9ba276022c592ba839686eff64e6b56c12a5f229e107e9518676171382ce4b061422d74790aea414934d96a27d58ec9d2b971b39dfa062bd0d171564bad39306c824c7c33644301a454e8f36d5af5b0c9d41fada40d53af0011403e97c01556c2228c6199fa27625c9eb973120529716f2273f6fb70ef8771cfd60f658e028c2ac9f509f3f51dcc38b957d05cffb1768c4c7477ea4c621debb23cb3fd3f873a6e1f905d897caea7024ec7f494701525e8f92a18b9c932d836627910a7fa2dc654ce6445a2b8605b800412c50180dee84ad29ec2af0ee91f19889510abe77a99a57b79aa88d1be507b84412ded5593267c7ed75b15440e5c5dcc999a502ff81b28d0d87281ee4defba755c139e1abc4644a6ddcc33922af6cad58c95e0fa2fb4a7758887d637979e0780695e5df5e2b26bf2b9fe5121c455284c76eba16fa6cde81291cfcfd523c6284d72f8720e8cd1b90972d8b71964e13fd85f83dcb7e5ccb54efc34b3f079d0e6837ec8258e420bf5941041ada19302d7225045d8f9741bd4d1d09dccaf222209ca96b6be9d8cc8e93a9c237ae1d720b7d15019df5edc200d4415f1603ba52659ccc1aa8462f3705ba41d656702bba3a88e68e7370ea4452a4fd41ab8bc8a439e2e078cc006fe6b147a9befbc2cc4f372019f97293054f1f19914ff1c595ae09f9b7044bbb03622dc631fa9c1867c78ddd1fd11fded748b2ccbdd88d33a9c6725b905bbba8921fb7a07af7bbd396a9ab1a78a3dfb6c8d7da18c379d2788d83ff830cdd708b9495fb80f564dfa6c16c2b52a4f046bd6262e19852b265e6b96d0e0a9d081ec6736b75c231907be480956b203534c9452c8065b5ec00bc10a5f82a5cc17a2adbc6e692fea029152f5cac070d99effbf09fa6d31beff34988ebabd0e40a92094df7bdff90d18d3fe9ae166b7553903342244cb614dee8a2b1e30e9e4ae8fe5e9f8e57f823363b50960d7b24f1f2b423bc62e88b4b498f3c1e3486eefbdcfd7f43132b39105ec20bd6e330affde7ca21c1d410cf29b0258a4058ab4f71673e0fcb0ece2f02bbafa60ed7dd8903a350d1e4e04c0e3a936a21aab7e24c46082e74b9d9a73654cd52d3b043e83cbdd5d6a8a82000a4e873bb76cfdad241d4405d32721c5d0b910469f96dcfc73756cfca1a8e0bb53fddd1981e2249e1dcc6a038ed964f460b421143ab99c421059921b99c091bf04b652d8e7c348d978977984ffa88daf8b1d2447e4eb6d95c23ef5c03c1abc9483428e81d05990e79b471a910edec47fb9bec4e88775777ff1eb3df671fe8ac03a693a1c26ea254ff0a4f430a3c233ea525da7fe0a9fe187052913c220b323cd8ff2feafd0bf2f99dd75b06ca69bff7abec3759155b1d43666c01f2e3182ae43eca78144b620d54ecc84f54affb253b766b8d7aa50f377127c7808418db353a8b84e6ce2c0543ff524976cd4974f5528b003744fe3adf3a5b01976031a8e3c865bb06692d6a596164d77bc1154b92d55056ef68bf6266f77686a137dc15a8e643d95185be0590239afec8e091f3a04c6cebf026371a7140e0d3484b66b6174cbc6c52945c6b9aae7b2bd8ac5e118020471bf43e13c7809f4083f74b6fee914425e074258700db7a7beb4574c809c4e9658365e0c3fe177b1bf538986643b96516d240b9dc69d50023b979ea6e60e1104e9ecfeec632a86cb9c386b2d839f23805be52b1bb1b09e7f912f06dcf9b672d78ea8c98a8e9a5dcc06b5c3b3455ce358900f4bda1790c9a6284438f5a3db9a96ae3467eda97a253c6594392190bcfd60746d12e3e283f8ff689edbf9cac7b0c9b056811d9d1205a1209b747e4e0599206fc6293df8d25313ba0498f158c0ddf8fed7bf2350aa2685a1931dd26680e121eae137f043c50369843f17e4340f49acff7ec806ac8ab06f4f43db26c075fbea4b87e505a9a330892f18ffda46fc1b6c1b1545ce98facae892755781442c0f04fc80db8314b601fc2454f9db76ce7cc1ba62dd84fb419c77d2ef39ebdaec46f56394c0726b449f49cabeacf0accf9332442f392fbfa84fa4777a286c6affc747ea8b3ddb969632f8881dc120d0458947214200d7cb770bf7e9decc0ddcabbb81f82cf9c57cf4e192c838df74ca798588ba63db8407f6f7f991e3ced518394a2cf4409d3807a5d49ef1d8aff282b3b07e755c723f5b6c3c31d551d6cd06f19bcf488fd03c1ef334a46bc5d8a4e13b31b0bbf46c0faf2301271eef8bfb8f1ad7f25be13bdaa924292c9dc70392cd5831a6f5f272fdeb616f64d586966999fd251e95fe85199181dabff1a6d8c32f53d8e9891f2b10f76fae6f60de9e1f0de3aed95eae5702bc5270e4ce29fe3ff0744d00e1434050bb95e5d029bf4c23d4129aae1eb8599b13df12249c1a1e0ef603b973632658c5201a3d1096f1487fd4d310223de532ee7e6fe906c43fdf392b4843cb798f1c780c48ddb6113b393bf76d38bf23fd8b03e64c1d12ac60eac6768b148f8a4733706865ed4a0167c85d242a3b0c39c80be031bcd5d0bd47e6c0be135347fd1747b51dba9755ce3b9cef43504191e50d5b8f490839c95fbb7c2ced29297c3cc5fd50128f015edf805ef83b2871d79096221814787284fb835414ea15beb4ae19ff482e2c53ed9efdb581f6faf465a32909817c53a889f768157f9d1f397abbddf5a55bd8b68a727c4a915b0ef2c3848fb8d468e30261bd326876ee8fc353cbd7867080dc52bec3c3c43052ab927a9d90d619bf6ea993b3a9f400c5ac83c946d05bb084804e10fa9ccc66c31afc1155f30b566b3dc5a7439462250abfa26395911c6d510cd2097dcd0a3c96a459101382019553987d26d4bd59eda51047aa1edf70afcec8082fb51e25b9b38fd10041035ddd5fc6f997cdea82617ee79b244a85ff7fe3fc160d0a59c6e603238b68463fca377711628298e485887e8cc65b814972e478ef2428e54494c96caab0d08afeeea983bfe06f9c73096b8b46efd72cf571e775ea5b0aaca9386dd76a67c07507713e6b199ae7415eb6108e5f3e1eb14fa38fc235e23ac94e59d72dacd9c16f24fcfb1767b971ef6f3581701ddcba7a20b1e44818e240a2fba01154b82d5ae01b37ea70f164960e6c2ec617c9f133ed2f42eeeddb83a5a17ab42236d68c1430b5c9125cfec4dd061e48e56daaa40f7446ffb69ac5ecf02c923f12ba4e1e76c7ba5b7bc4d801ce404d2ce8590a1ed8762b9043381f46a9ad0ae6e9c7670a080df2942e91c542f122c182d6c22f87155ba79c9dad31b8588bab53b0476b79526b251d32a90eafcf1541f1b89262064f8a82cbcde3436b862e3d2e6f21a092dd471a9d8ff6fb71ef82972195b0ebc30d6d84c7dac09d87bafe881e2c3d4f7e300a9abd4e5fd3b0d9cf89bb750412e7d76b7535cc2e87337d6353ccf183bf64d31d6d2576cbe0931666e06761761f9a35ec1cc0ac14489756c568e0c5db3a6d4fe65b7c0f2468432dad63cc5fee5903b058420e815929dccd8c8d01b12d06c12bcf2c6a2251b4e8a60edc937a540a4bcf18afc753e7722a6a208bd7bb616c87ef3fa799b53a0ca90aef1163b79078991b922b942aa56ba8b6e9290bee5fb4e8249e95aed3c7b7aee0bacce5208aeb161b2f7e1d0f7b5b7f385031454f0f260b5153be5481e0ff20b0d6d3c1bc2badea57576f0909518cd678bb692ce8590a19fec8ea31c96d2a2703abee9e9359053c5773c800210f44d6ff939b69c026a739b364e1edb25681ea5fa1e724aefd3a34a4e94fac5e9ecca754418da4df5c4694f98f6a3144834c924f2085fc140095fcc523cdb2c8e46c70002b08844ee52f5157b14fa588dcd34658908fcecd485eb9428709bd67ca6b5a89bbd3b114a7aa99563256f0854a5d2f0459ce41e2bfdd96a47fcd734438138c7958b8d4398cff947c7b48ba44b33474dae30afe5a4c59b97172df7c6617aa2e57697d95c67b756954f2ecadcb019e3f62970aad3dd61c4a34c80881d54d796aac58eb9bc25b554163000c6f241ae4b525db98f594476c7272e8102a9ac4c866ff8cca8f3516e743330d6ea857e84e00aa187a7e66869258b53cbf1ebc62df4ad86de218279373984b82db016a51234879b779f1bb7bd626842bdd064311053fbf63fadfa1ba416733c51b21673fadb41b1e5df69b0e7f01681d318938b8836d3dd6dc8baa7399d97440f6b25599326d17b7ee340f27d713e87a8450a23fa1fbd92e4ec54ba6c216955a34593d47fb9bf5e9f4541eae24848cab9e02898da7111cd319358b3b05451e7a9cc0263050643e1b36fdd18baf7cdc164748f58cddd98d2e0582721aaa8e970af88f183e78f379b77dd82fa6c022612447caef238b78b4a5d955082cf91a89710e6e1c58bd6e2e24918d40e79e9ea23d652f7e3af81919a15f55565739117c17a603386665fee6ca3ac30c37931927ca6a20abba6de2458b5d2b6384b49bf6648af97651b9ca271140229c7ce5bb79311f447d8932fbbfc99c7e379cb0de81c081f6deff01fb7c616a54f7a0ddab1fdc4944fc908f8d0fc5e4f7db857605a49352a2775985b86a2281fe2589c312a131b3c730b7ccc0bee5fc3e56294e36e845c6a749478c2a7bbc4ecb2f21df17889a247622e730bb5393aefab06e7f99d33ea5aa5cb26078369796601c4e78e35b7e63f9d90604a75636c0d3f23e5358efe6b756b98047cb231b2468f4fad89da24539f75dfd90ab4f35fb7323801098c4a6c350679b8a4bcbb1bf89bf0c456ee6566e18b7b51cf0c7fa277f4b1cff84d8e493436ee9711fb5bf2e6b866c087ead1bca05ee15f09e46ec0ca272f96841b609edd5d754437069af3ab7510269f482fb15660a0454dc52737182a10193fae37e9aaea9c34a6570e7ab1526b6aff8ea5e16e2146c8fd275f720c7e01bc7d5e8aa6277ec1dcc2751d1492c0f7024b46fac96221334eaa936e0df1a352f4efa4ef40cd8a84c12dd94d3dba513180e4d984e5dce0f44ad891d977723aa266e929dc66278e63764b0c2572b273a96b6eeedaa338d10842099b382b08946e670c55b872a00aec609c862c4ff5b8dd264bdf729e0071fdc8a027f0a51f411589cba129e2d1706e14b4cfc8220e913b460e23d332be5433435eb0a97240e1464399a49753366f870706519f95678d525f1864831ddcf8574677dda92ef7c56f3918c897304958b5bc13a409168b0d90b60d19e89be6ceb8469e079617be9dfebeab95900674bc78a86f4f9b2203b2950f6eac9a59665804c833b6f6e90fbb8368d4941842530b5e607baccc444becddaf8fa51eb2d6149b4fcb64220f55ae8bac263c96706ed5c558bb5422f9de4cb93b128bcc54b0950a51e7b7cde74af7761d02f7a12d22ac5c05c0ce25bf3522d61689d949ab7059c052fafa412d3a26e1101d6dbeb518ef610c0e834b00eb3fb2e648060d23afc35be787d4323dbdad4b49b80755b4bc2f92b0071c197b5ad3be1eefaa9d59c9724b6410be0795400b131e754cecb876ed6fb64ce1076b2e8f7624e33f60aa57d70d7d281037c06bb0e702d7b70a1ce3993673328aab6cb0d3699cc52cfdb1c56210772083594b9b4f259b51de347e8cb3a56b7a615c0c9c4016eb080bcafcbcc40306ac8fc29349365d4c660ad239dcdd2b23671dbfb73b45fc941e446ef7885d33903e8e3a340ff6fc9a96f589fb5e76462f9b083ce93865892c8a7f401ec29e50a82906f6aa5a01920a7706c21f7c0f74e488c96a3efe2f4b18df04f4eef617b8b32ea2ae62b1f6ac1068c6f132c01935e6b2d9be1516e3c0ed8e8de3e49d59fa45a1b9b7f99246b940eeaebdc1c51407aa9ba1aef7fd53791f1b6293ac12c583d414e4a9eb956228209b367e48f59078a4b5c9c3741bded231f84b8a8200eaf3e30a9c0a9515e99713d0e6c934dc1ef76993aa82061cf67aaac7714f12e25aa8f6f54840a2ae3d84af32481511d300126db7dc612a5b2ac0fdeb9c47eb316541846781e270c8ee5f6731c2e86c94e4482594c7e75d70ec43bfe7250b6778cb2c2fd3d176abf07ca5c051ffb9a17c4c0735bd059b2bd8db81553c94100412dce73dbcaf63a0af58f63f15571f5d03a7ddf2830de2f20d58f8427e71dc6dba1af14294843feb6013af57ee517ffbc5784b009959655c78e5172c0f46f6f0b915d8e30de87208bd2d5f9f6f87521a2c4dccc4627078c7c6107c66717bc639aa5e1c735b54807511167569fb514c14b298d1d270dbb3d05f5b86864788e09508442a983f4111bd065f9f6c2457b49802ca089f3703ace2bf46c3fff406ccbf4d7881b61c467c4d07792c0a6cf321f07781cfaf4770aa9b6032b358097df105045bb04164dd46a18ee3a9c957cc2ada8b30957704bb5346eccfe312ea46e412a77e44eebb6df757173f972d574b2592d866f88b013c3d91bf7ec1c5390a1c44b140be02828114da3aed82aafde8a8d5c985774fcf8baff842cfedc358200027bc536a215caf05a7646dead6be2d3b0ff92c8059c22240d72123b5a1ca3146381326f7cf9c50605b2e414e151aa142adc1bcb22d7b8886dad51ab7e521b64502702bd561e40dbb41e2f80afa95bd562bcdc67b3f6e36f86fd9256311e11782f33de2918ca64f5d083d02cffba209fc2667ca4a141ca60c02a7d4559c7add9696e6db9aa4659dec2a96e20bacd1ff8b1a4a48ad20096e383fbb97fdf96190e67a05877f4da461ef158b263c62a806b973cfc222f7b6e803739ef0cacd37a9f9091466bdfcd533bc45843fc0d196c7dddf72b73a0fa7bc044acc6f5a7c6fb154b08e09c5169aabfa570cbf676e20bb8e99dda850ec4e42a131ce741b7b6c1f702cfce1233f47032fb6aef56e8cc84a324f6b0615f22d2470a51f9f8c6edf7cd1cacb7d56eb7d01a2d0c59264d2000c6f6c9560e7d5c6d9d9212a523bbb1c320016843eee8faf001a51fb16e8c27a6aac8e073944ebadcb61429 MD = f22ba6107688aeb25c2f2465d8fac70a67acc7c104b2ec614c281869db51aada00df0eb51ba6a25ad7efb72744d35cdf Len = 82600 Msg = e4277302ef90e1fd71ee5a1abf54742caf534d64fbca13c9e7ffcae224ef49b5f3e386f68e441478c3b0eae7e24d66b9d95e92629e14a5c7cda6cdf693a42b14ca881f96658ec7b50fc5c21b0f663ae36f6521c05d47ba7cd1335ca5704b7383b13dc74c3e14019b9d556b1f0f47f790b89283e8010b5bcf3bcfff57858f27e9ef2a0580df81ca14b4876b5aaa97a5aafd0b3f40520a8fa852a13f7498155130cd786198117b2a089d834c33a7ff4d1886f8dd3217e95eef5fd2a3647288f83f934f63fd9caa2a5da1729514d026f5c29b82e5251a53d08caa89b48fdb8e25fe89d6941748b8d1fc067ccf64ebb5a89084d1e08121eeee687beff85e9acfdf55f6367b4edd4a28cd14c8818ac1536b6a880c56adf562bf691a2cf93779f52e2c2496a10b220b35b8157f33f01aa94838f15bcd135e584b78ce673f833ea51a6b591f8cb4e0a002a64fc86efdbe5e46e205e7cf1a23789b7ee1c850abb289acfadef9c6b3dfb4977d0bccb819741b6d500dd8e32a0e69b6619978b6159d49ebc1fb4bd76ee7edfa2791b29cac0588c66b505692abe5d4a40b3f9ff92bc78de0a9f73d454fc0f3358a29a39f1e3a4c58191888620571606e621a649f54f7fc91981cf99abc316f50901bc74bd8d9102c43ab96dda17ab61b5074f032f7f73e0877b0a45d1f04095120ae452740aa7b48d252a98be5c87db3bc936b3a7e8dfc4d2ffc6917dfff6842212c46bbbf7736b6ac55e9f33a225e3f8dc0fc3d5082de66a6486e4f64eb352a7ddbf190be06e87ebbfc7d9d095101c6ad43cbc5d59d8b5dc6dcdb8d168f17121b046f2da3203aa6e58f8d11b81e0d500364015975a8ac3a76ffd95a5db5b701e3eee71ad78dd438145543d8b14e2be6776bc6829869e8039dfa903ca123bcffbde382e0c3155d3b2f97c5795aac028ef19f41c6a6aae8c2251527bd4aa2cf1591296806ce807eb81e9d3b7c1dff3b52594a9bb00731537ef598c665c0fa98494709c0145f95deb6c9afce6a610e7d3a97b2fbc523c6d240f5cb97bb6bf3bea5c7cbb293e01d263d1815a5c98da2714d941f8a8f63330d0f0df6bf47b455ea31f9b7680ab8e1fd56f316ea240b83be9336db70952d3fabf32560699101e7c3f4c61507014fa60c0742fcc20042790d14662dd45feab155f42552bb22bb72f2f6142cba000d37fa5aed0d57e79a4c06d90d5cde760352b21bf514dd814bbe1e3fcd45a7905a5b7057dc92d1607bc350e911b1b861deea6b6f7eeef8361793f0d8d7a8f6389ed91605f7d258f44da8944c5c7487a8e54127f8a62834ca89b910c81c9dd081417a936c2717122978c1790bd4ed76d47f1e8fbf5609b8c408f72517826c5df2ab06909452a72a8a64d7a82d6363aa6c134a4acb77daadacfb17d7cdf35cc4134445b48661cbc69c7ab1c8baf0204ef80b8e0125efe43a0bccdfd0f356b62e6c75fea8493dcb0fe9201982bb626a8800ceb05cd3a86c8867e218b59192c3c286a4fb13e5ccef2cf8bfd57e37a38a800dc47802df88bdbf4ba58a31ad91c8a9e83b029e63f87f4551c0ae63369ac860a655b09c50791e063c7dfcea513a100a1aa0dcf1caa8c2847d896cdac02f6b4d54e91ed12f62d685c4d237888475e20ea53d51b322c4010f0384d78ade4abd719ee88c4a832a2e656a0c04b44f2a85dc1078288c7333840e6b18b61c97d304f40cbac0af54bb6eceb6932916b841429ee3bb2b26c6df93aa3eacd337f4b289fe26c782a7abfcdee731d06e55caa36179a76d202622af760a02aaf484fbd094b575789cda8fd5c5d962299d198a362a97e3f5d037908b74584279e2aab6136c448033d4f1082e6dcbd2077c0c02e3e4201fbd03ff175bd7b9838165522d645bd1cf61f4941eef1ce607d3d5d43993d93ce32c8026bf07e5574f2a442467aca785eb6bc26ada011b528bf36e19372c4f11b8aa11559078e75a2ddc49c76cd199875bb7071c434ab236e6d10f8405978fca259f7c34939424eaa6ff3ae444bd7900a7af8a5161b328ba9ed382bcaabde18db3738a6acf44e62d41fbe022f8568f1758ba15b23d24c7083d638e6a2e858c82e88f03a04c71734e8638032a8e8622f5f53f6ee7de86d5454be8fa369ad6dad34f59af7d13011573fd1f6ba311337cc106a85e974dbf9b9c4eca8fc7f59a11a56d3a56aa2bde11c52f16df368647e3a4145cad6a90b96133d07015c647b87a23cc9bbfce9ceeb26ba386298bf7a9a0c6a6c3230ab15a6f32584454da98185d72f3e2b3926f1b3f8de1d80f496b41fb4e4445881cb78c0cc26fad13acf1a202bd6a79fa9eab4bff5572725a19ebf73b64764aa34bab36810b9b131ce4593eb02abac65c9958683be9ddbed2a27eb3aa32c53a3d3c9440173467de3529d9d4b1e16a33a12b7f593c71aa223e8d2c5d8eddb87d1e9a7a91136558772723784c4b0b022690fd2706471662086781fddd3090d87b0e0b6613c0c8f844b97b3e8ec7d00a09f2b75857a7ff8cd71627fa1bd871ab9dd5375ead6582ceaeb5d933826d570b438f011a34a256b0f711272a00cea8bb493ac86d4749be621ee1e4601184c98d3c2f817685824056d020289672595e90e8076398cab5a23dfa0745cc21564d165c9ae273328de707ca0dd2445ac2bbb0e302b2e91cf156e6abeda47f9b290c300b97ca1a230c734a4d9fce3ea152e6a5a0f45d67264503e59a5ca78268462e62b1f0e27241460ca8c19dc48c2d4e08f789a40c1ad0f9d1c32e1bf9dc6ef5da34b66bd1837285d8a88ed05b34e801482c05dc660b0354e707cef44095977d382f82d13f559f0f02d21c003c40b9b2cfce7b621341a59f6e39e4ad25b6ca2871da7de9d6f1b12eb0aed3f40fb787a8c46555ffbcc49f238de2d70f4f46ef3cadbe107d3b5e8e270bc51c767ba23c2c5077fa7b099dda256d890fe2674ded021361a15319a420453a9e5d4c2808bf869b8ed29ea1d33df035b6f4ee14d4aec2cc4d9a3516cc4dcf65c1ff3fbff1f8fecc3145302d6eafcb0ef1eefaffe119c4ff0a61e9dadcff0cb6b76b17e866cfdc0ce9bbf854771afd20c365d0cf7f164fd51e60370edf1d455307089c4a6d2c67823c9cbfbff565cf92b3c1362db38dac7613fde95ada8fc364393d968e11f7e857b4504d15f078898d4a6af5c18766240971a2c565d73dcb12d674cc5b5718a7b2d93f6aff713b73380ec8d5320289fdb7beb695d8dd0fa8846514075a4977ecbc32d2de257e96d4bc89439d292cdf7fa784a11f5af5eda0e46e850f33eefdff9c476f702e2271f6404344174d0e4ef4024aca2c9426bffd57792eac8d4e90277ba080eac362b41fedc3310947afbfa2ef999b832e786d05070f79a6107219ae81c66b128b484798eb91743cbe181bd297f87beecff3df011cb7cdc4656181dad5409ab12fdb12a9613573785b4f48cd21efd2331fa0fd38befa92cf3423aef4a096738e5623fd9977379884c65e30d8b606091bc886b0f4135f319024c18a4309516073a929f1b257204a2aa64cb93e7ec6866e6fadde7b466e10ccde42fc1139f8c726cff4d43a2678f030a322cd45a0b6b2f4bf1e70177daf984e0aaeeba458131270718c907a0fc5f45f66e75337455ff5745de04f0de0ab31dd4f0e41468d2aa81937fa0bba3891bd7f97a3335a9447b8b8f4fb61a899e944405569e53c00c6f1e9c8452f42c963b358de5f55f7b6f861862a78902fcdf13740c5c7bfd1da6e55a8cd75e259ebc43eb1e122a155d2fa5aa7a75ec3e9a74c74a54730b74c43ab3c1ded930e48c53bc6544bf4ffbe11d309e314b5e21f4c81613782adb5f462040e11d1a69a588150b307c2dd57789b0dd8011986d41ae71868bd1f45a1136001334c21b66ece448b6d93eee691cc972f2ecb5dd8831f9e9af001c50163ef642a149684cc72f539755cc0791695022dc2720789b3d679998e60c91de7e3d0970817b7a2ee8e148595e95508764b62874d0e7e441fb56e017c22decf020a002122a5762427aa7253737a1c460c9b34ca5869f837250848feec9d088257bec62900279cb27cae58c99879dbd8e26ebf216ceb3d0accb74db767390edef0e869d72b03f1f3f7820e0f8b4c5b6900aa4cb210fc14641dabc655745eba8dd47132542aa33d909f0edc4ed45d649f6c3923a5cc0446ed1ecafaff9c74d2340b3f69c8856d48307c3b0aaefc12be2230018c23286b9c4ed9fd33de66e31f7e9e3c565bc5cbda7c97efdf568ad5309b54eccf54ad99db2f562db71a5a146910944e40337124ba1cf713a46f060d83b2dee1335fe2f7ce379c40d0da006d7895f55f717b11dfb1b7a490a220f9217f0ed8c7016c4feb3c0fb320c346e15713b3c9562f592e6687f5a74c1e92ea7bec58498882a57ddeec5fa3b3db88843b0412191bc3f54f200480073163ec618292373a0bfb30f339a7ce74e35fc5717f115bec967578fc75effdcc26b857e69e3954b238b735396235042f969628318d03364baf8c0abdcd1217ff1264fb0237a856b9f7fdddd8c35eaadcb6c9d64bcba14a3d4e52d21b903374a7dfb0ff3cb5a8e65730144f57c2ea68812a41fa47a3b540ca5b0df99d261bbccc74e48c1d8101ac95cb45b43ec9a0e528da43baae7c05bffabe06a6ccf8929876b948c92c017b4f7ab0d834163f49cad8ae1a3e07bd5b70d65f85022e6c60b0ae9623dff19edd780fc815f6668cadbe9a8e0dafdad07dfb6526d1354deb4cab7bf3bff5f4c0f1ce5bf94323b617946a75626335b01c3307b0fc3466b1de1f31e6b86234bed07dfa662cace28f4ac675711265f70f09473cbdc7f4bee0aba1ecf6cd55c4d6344aa3384a965c778c0a8896865b1e82ff7f4496715a6464bc9a81b31ae0ccc4562072da394ab9f8462a4beda78dd18e66a5c443e0ae80c577d29b25884a74119dc70f53e310209adeec657d5b4239bda67f67cafe383c894611e055fddde644700621ab2e2fb9e4bd197f4e8bc37e9627d6d235b13fbe3a901ef84a62df47e539a650ea04f1ad5e4b7940692059c7a15271b08ce30d2e5fbcc28c0ca099c27c5f7046194c9c2490f0d351d5004a3c678d1aa7d57be8b58134c544a49d537c924a29a840ee79450315f0599a15de076f41975f1a61197b275fefc7194355a0ae619c2165d1d0393e209901c1455f4d41d7b182627de8a7d9a507be7379e654590e905792dfe928c97b94f1517a133966b530b5b6b79c61206ed7d0bb264fc01ab9ccf2ceff0b392d8ca9d0529b44f06545dca21df77fd3822225a6f834d90e79c8199b22198094f1bda247cd90389dc6ee7df19f25d7228929bae7328ac963fea43ffa94168e629d7546fdc84137661217da4a4429ed79bdec5e3c71106aea32b506b62fdc7ecbba1b5c9b4e968b73d02abc5315eb09fea5d1d84dbeae03c89c633677f85498f6cf19adc864777bed888eebb7195373d9c941f2c1204cdb28c51796e7f966230c64d6012d14cc4efcc3ab2f1c584a7233b1a57241a0d23b303337efac39fb693401ba1f71657d4dc707e9502bdbb64f34e663217445286b08702d096ec0f9b0972f2dd13d6072c077dfb0158ba9815303efe5c7031737b3d9045facd6974a415c7597dd390b93ef33d06847e4ca91c3c954912c951ee55bcb7537a08bc5d464ac5c600c0c70c921246479aee047d0eaad9ed117d3631baa054d1bac36528160af6bf0265f97fa9f72224b122527240fd8540c5264edc2e9b013759a7f47377f8c2ab0f3d9860fb24492463b5b72777971fea9a3f2c4c061f350ac300dabe0076c21063b2347f1a0c23dd3f12b31b071a12412d322f1ff57f78b28378986634176d95bc5e4e286b116aa58fb3d6bb73f904faeaa9e7b6516e34c51769ae0a875d3d9185ac55db82f65613f223828742b6506e5ef0e6adce5e01c8fb7e9c297ebaaa9a3c26ec26e60daebee2ec470cf7d49d21f6c19c74b0b16814ac01e3318ea24d266c58619908e9acfcfe78a4cb07c633ac4e7689999d1ac05ea5ae03c13bb69dbc72ab66805ffd095481432c3ff71dcc63c29a3e8b07fcb30d74dd7e470a7a04c30bba5b9b7fba2c6c37f64dea4a4dbfef0fa71bc775d9a897961ac3317f4f2ae083efb138dcc38e9a7eec7a4875d896b46217a1ed6b24298395e0731f0ea8687b77c627f6fb9bb865c2a031d90e40d94a7686715b5c8eae57d0b8fe7e4d38562a53d8003450953264afbc151a88090017c95e0aafce5bbf9ae31ed5cd9f516c43a49fdaaf7052750d928a949b57b3a3b2b718ce49352dd5b3598c998b89a6237de6782796ef5608c717b620ca01b32c91ec414cb635777937808c9a46a089042f961b77a902125627aba95a252a9a133bb561f67523bb12ae1499887d687c96ef3fd43b446d09f5b5caee914b26cae026cee56c14948b4a7d722dc49e36135413404cf2f794bf6fe7f1f0769a7ae82bd985661e031c4a892c15d3ef37bdcfb45243d02f40fdb51d34bd596a91bb544eca654e7ccf0f8b57409c0658c854244022b72850af2c6d86329973fdcf5cb1d1800b1908e702c01d31614fa1ce8d937ffb269ff790854b5357f2eaa0b1d3635c80d34062d97a8b73a5020a4ac8eeafdc41feb194a3bcf0dd2b6637e3e7a3eb38435a7eeb14fb3fd2e1fae0c425ebcbdd9dcc07b84717d0bc037fc637bf62dc0d4e0d0f3237f96fb39eb84d9e94099a0c74fb0cc2f94a8d48969c103cc784983417679bb8a0f9adbe21c6bb4a61cc7ce15e283b4548b9693b4b37c0338e9dc25525f68eeeee604c2b11a2b4583da8f6e4bfc00ddf93e8f6eca7ff30ec72f2ccd9004663557ee1fda2f4e8c33876339a8f104f1ec2995dd8d5234efca823382a481cb3a38ce0e324be31e5627ba9d0da690641c8ce978c719d43938df70dd25d2af1dae9e5a2e843d56f350c82571538daf83496343cf943ad9f896f69a165f7ea263880f04365ed70e3644bfcfc75288d7c942193e828d17e8d8d1b706c476d0e0039135d30f0841954df8b3c18853bc8f9ece57e279fad98941b0c9bed0b3f1f36791b5cf9fcaa473a2344d019a9e545f6ab4c5389d23a7449bfdd5ca235e0963f5503a00cfec282e9bc23599e77b76cf95bd0a47d44faaa24f7e8230a4bf3fb617956a6f88b5f450a269129056324b6887b1ce1807c70a2ac3fc79fa3a1dbc763429ed23b06f31611ef08cefce0afab1a958bbb11fd4ee65603e6130cfc2a82ab3d56c24306006e777204cbd394cab336179771c02bc7ed98e0ee3d84af42a5bfe5f8f7bf1d09c6c14c1fa027e41887418deaa619ac7e410b632a7fc92fc6a907c8ffd2fda091a775f9b3ec7852eb6fe374dfd86cd3f45923e7354a391229151952f5f48d252a991bf75be13365e6059248f1795856acce5909992d62eadc727b1055ccfc3f271409c1825ee7918ac0b496ca295a9929e93126c0b9c51e7339838db9dcb9432990f5f4d196036a3c29e0dab438f21fde6242eb464fde216fe2e9277c9442d5a4a836eda42725548cb9ad716a48ad5f3ca1e4b384801ca834f7128a1894276b2ab2632874a2bbe4fef8511736d8eadbe720bd0c15db1ef764fe8602385ce5781e57f131ed694590055e9228b46a491a5077227174b143a36261ba3c464efb8111f167a6591b30fa2264d7226d5d269efb1dcb702bb32930dfb925a4bcfae81a88274cd262092c67f893a690cc5221de597d0e84a5514e341f6d6eb816d119a8f362075272e3967dda7376f04bc9c95cfe2d622b6c0c1101b416ec02ee723eb0e62a2db3161aedb05a8ccecd76247b9f5b976cd0fa54104e301e23f1ae4e95c6c2e83660b61fb083fb381484d612b729e4539511dab9da5e161bbd20c0d6dd6f3c34a7d7fd728d8d3f0dfeb2e5e50a613aea617a87bdcdd5d8780e0cd0ab63fe9497f8a536b3b3208886d3d4204bf3e9d1b468578bc06939e9bb9d12682cc8197e7abf450c43efd27a3b3a751f87f2382b49f04541724afedc6ee0cdc1db88245c655233e8b382378683a8f22e5983b0aa33bfd06343d18922fa8fbba84812c3b0e057fe567328b4300895e7e7113707f0da2d654ba59b8d5006e05875f2f65c0e643700c01331dd093297d2d44f7a9271d5af907528076fd5ec9920a55cb171d76985e7d0043c16648a052f7074cce4cf8edcce7a3bb3a5473400a0c0f5b299be78bb1fe0d6a5f4f477847a4621ac634c9e3b9bb5611ec20675bd65535ea838061a5d158d0b1dfd1b938c3fbfc6a7b27b6c2264d128b75aa62a25cad6e7d0d140b6c2653f01f2935c6692ec57e43d46fe7147d638030bb3a8b9e05dc621eafa10e6a19b616bd26c39592efca8faeb953856025c64708a7180ad639a9bad4516d9227104be992bcc24f3b70d2d8b2121ab82f863e101b218b08d261de1ea8dbc1be2a74d812a6d47c1bed18a50157c70da7080892837212dcad1be34135a035e5bafbae2638015737222e4f0ab1a5c1747b73138c471460542038299ba8c74721af2224fd04ac2b3c8b897dcb90a5e6975bf80ff20509f5398ab199b31e22fabdc52740241eae3ad37f830aae475e1fbd7020648d645ab7d3120f9d5340bb3400239369652d0f6a4326a65f7c7ed8552fe2727a250d0e906ce1d99c41b699de34f2ee0686d9d7a5d6a779e2fcdc1c6e36d877ba82a72d674a1e97fe4627c4e19f59be8150cc0fd2d22b84fcf80a3154187ab58a6bdbc023b6f2d22a2a3c452389818d418babbfd980d9501536b01fed1df1b653a951cdaef885108ab59c238e3c91e2aeff21eda228da64968075ef238f65027e05b05fef58fedc85afef6609ffb2463073d4a314125548e59c01a8dcb4fd1f7144a17bce1e85bb83dfdf177b190c402fb16ce8198573856c52fd5202d6e2979631cb2b33914437ec0e123cced3c658137f92c598cb5ca2926c11f67c3b3cf25493d77606fa60d7290430e0e975091644a6ee407a2a3727beb0e49b322b32b612316c652fa10423a089e208b447fc032bee2764a5eb2c9d5ae81f490cf0ec6d3ad433fe97ce56a4ba65d0be1790c8a62e1ee5360255658bcdda6908f2d1939e3344d34b24c97ee1df5fa109fa9a9487b600d2c079b207797f4f6be1cc154fd26549f554bfd9a5637841fdf245ab892f2c5a9409f3483defd80ecddb8205479038ab41205148f3b0ebd18e7fe00ccf25f6f5d31956612d7640e136fffce9a46014315eb7c05c8f52a2d8f9bab3058df17e9938f98c43ff951f8e4e5423098dca61a5f521f65ea2d1031de9aba7ddeb1c2a0d6ab07b36dcd5dddebee2ddac2b5787cdad66d99553b3786a0459a2de122d641b12460d84ecbde2992eb1131ba68eee712f8f534bcb826885f2cc8d4e2aac9389d8c4287356d5968745caae9f25f8fe5b23a44bc631c53b375c0c51765a221e206331b64d43a5626fac34947ed01b20522faba850ae055848ea22d49ecb166fa85c959e58dab6ac1b0bf7af00d081ba1dfeae542f6ac929804315000ea510ede96af8c8dd448fdd51091ce56f4db2368536b436ab8c9915a710edbc0d0f9800ab36631c23a8b85eda4ea920116e35fa5280c6360e3dfd8484f8b2efe4313710b568dd82742fba967e83a947305c91704c83eb3c9ea47edee0a46d83dc347485d0a76fe216001cec04502142123f51fe3ae82b30a5eaa38c83bb265f3b40d8c8c49b2024524566ca365c1bf9ff3efa0ee6568efa6936f5f435e6e36b497cea3f59edf83070232197da509e544181160716761d8333b1fb7fbecdae8f501132535645ffeeb8c4d4bab9d3b33b1f312c5193f0dfb14a823d95e5178eb39627386c854a3e477250079d9b8e6196e076c554256bdd6df8d3439f736d8cbf64e485f3aca5bc21e5ee42a74828b04dcd776877938f1da083c996033176ae9b0273a04e94fe81665ac70e40874aa8482e5d9d25a705a930348ebd2be4dbfe30b8fa11e705fb96fc1903f2d0219c526f4b4fedc327758907534a407d57438464cea26125c74702cd6ac977bfdfc5b5ab6b76debadc86c30b2824a863515747208b92176fa188cdbf95412376876ed9e2d7fafa728ee16126fa457b4499bf4f4d39f3bb2f5c6700bce195815be13ec7fdd802c953052e6a3f13d54488f822a4d11eecd5ccc08ba2ab98ea16d7b7de86e5b4b6d2c60814e73db9fb889636284f9682a6eeae959dbb73006b6c53cff51e80b33f9d31613bdf0a35dfd1d81b7a5782af488d3da34454fe613d0a35f22c98b81fc5b2fdd64c5a8dcfaaa6b56ec0c47fecfb3be1b2297333058b78e6e82bfb743e6f9a9330ef61aece849095f9a19e7480e77f0289f323fa337b3fcf79994f9c5a66dc5936cbfa557c9416e082c6ee48b433e108f14b693b3235e6576d1f9d17b9d200b9b289306a1f03c0ffd2d7bce5d008e95bb2d94fde4be2f5e58b64eccfa3da8e1a6ad008d500f81658b17b0e321c8d20639444dcccc6aaf4e39c1144ab62a60fe428498c7e679ca154e75aee17dfeb0d885f3518ebebb46cb868cdad933d5f0b7eb29cc34e9b17e85b3b1d637c63493933da530c240129e5ccb741306f7b2d0852d070b52be69073d6766c7549eed02acace47bf605230e5875114d427653790c74c6d6bfe8e2fcb2b60ee2d66c9a76ab703b8398524f2f651feefa2a443a62a45ed3cecb0dc1e77c4c14c92bc3cf88160414f837cc0979f92857aa0cc5da15f347a8540271882ff07612ead318ee8f52f50b4a42e6e4669b2af5cd888fa51b5fdbcef704d8a86ec5e083a84ae09a1508af78ea4827627da19443e52c163deb6067b2383097a4fc5307d1b221cf34b19dbff858c5f1f637c2f0cc7155de16feab87ec981422f0812e589778c61950dd989314263afb222d75dcea02946ba2cd87b8f8873e2f2d75ce5f4f7cc67371017fc536d3159778b710954709662363e08b8740860d00be429978642e814217c5b9c2daeff45b6c7d49d64e0649b9fcd02d5f6f250f4c25804650601eb529a782ed189abd45bb7fd887fc7989cd73b004f3cddee4b365e5b72b63edbda08eb2c16032d0fb883c1561319453f460054007653f1a35a7e2914fdf3f479bf1e5dc19d9ae280b3a51efaffd1a57d68fd30f5ff84faba84b469ac2c82f182a17b365f4bfe70a6cea91410d411b1fc0cb617067336bfdad2c0674b87ccfd9f8909be2da7979f2b1077ecc118402f613913535b58d009ac4a8a6b179739df787eaf3f5439ce37b482f7ee3455c5e857f8fc2b1d39bca0d8f7fbbd3be33261b48855fffc8909ffec2a126192120aa4845059e6749b614c05def9a4ddf41d49fbafe3474b20b1c07812ae8f02d8762a904912cd870827d5db096d6a26506360f7fc425f6c852f420342b4bead2e714424eb0f287f077602047f40553d816d6e4e76588f8540e94d33c00d37ba9c63b8e83f393f8321b69c254858ae4a0fa23ba8260e1fbfda49a9b0969f4252aab44f834c7659bcdc4f6be96d9fbc7780698eae124d5641dab61d23cc54269de1cdd19e1aafbf52c3aa37f5f5fcc9ea5e2c310744fb7e34c898733468132dc2c81406e0b2cdba6c5b2dc8f4e8561bcb3052ea5cc401ddbf2d56718a74c39deae8f2b6f21bb690322e41e68c4e97fb437f4382559848bb0b8f5ae0cef74ebf3cc7d0a87b5d5489cdc34f586530a6b17ad266c199cab7623f790b87a7fa9bdbe1ef14a524818def65a2bde728956b8597b1256ed16235198470d130be84923900e82875958e4b082154f45b7d86cebfc2a4e753a466ac2702fe14a1ba9d1b20c23872e0758c751e2a605d7c0b0ab7a625341536bbe003d5e0aa3ca3454d1eda4f695cae6c84f377a84e5f117b290e83e5e815e0bdd7226b47fcb1fe049d83adce034ca6247dad5bc2a761e474ebbb9e2d4950195354f1315e7ddc7aa19432e2678cac91427f8a14a0f1cdbb9f59a63f23de2ea8255e576e4eb423dfc43b14c0448ee337719275e96bb70a5fa47ab8aeef2f1857dafd3f6c3e2aeff414980f918a90596057bf53214b7e80982a57d732bac474ec1b398e715765a9823ab60c9b641b76d49c0d0d0567d0972dd9f6ec15ac26ab308f1b2dc6c0efb751dd9af428f8b6a25ae9858bdde834b7e85b61e09decdc26ebdfaa04b3a2508329a64ead7e6ee945bce62db5f1f533488f55a09913a36e4ce5b2effb7f250e73d23dd921e5ef3cc7c03a0f7388b754b2eb72b901bff86584e5b1f0fb7470b3f113494336a7a338902f8d33aeeb561f5dc457b6ffe8144738b584b7ead8acc764b67394d60bb16408d0899f4c63f91cb2e2af9e7ad71e9fcf1bd24cb2f400d0348162d5e8584148986dd45d3736c8d4170c207a5cd53ff2b1e043b539109558c83dbe0e54d77d6da6cc167555aceccef50c52518c289fca45cc80fc697493e68ab2314502d08b5a9cb6f8ed900f8d92b5a8ef2bf21865aef5a6312928672103e1a76184da8a9397e0f321cfcfa5d2a9bda99c1176efba272938fe426032673535e5f6d2c34fbeaddc4b3b23fab8e49a77d6030900f3c5bc47488d51f81e8e07ef359938a8653323f686ebeff88eebed49f9cc1e786eaff5b89f895dd871befe755df2bc6e151b81986bdb3db36f0e2b9dd89f55c6a69f5ae405986fe8731ea43025a869fea79e5029c4b31412a575dbda3d22b8d2e4be743341628e106ed780885764444063e31711571a7dfd77498568ee004e846f33ca0e1d90c238a8101ae6b9cd571c91135eb7edb97e5c2cb2b1afb3df1fc59127e4db5fca13486af2fbb0158ca97b7855ae854d3822170dd7e8175668347b90c24b03d0b78a28fca5aa503148424361d28de2413e6e1762e1b1089d429490b52b86ef38002ec0a650af2cd5aa2b5e94b286368f736c4273f795ea521547ea488b1d065f4d08f8b01c93aecb596bb2591c1eea0081238187421b253b8b5673910999af0c451eb96130dd3cdafe0a29f838df645c0d9bbde7eacb21214ac811d7ce815409907ae903b51540c94111aab82f500d6bc2dddcdc162d46cbfaa5ae64025d5c1cd72472dcd2c42161c9871ce329f94df445f0c8aceecafd0344f6317ecbb62f0ec2223a35b071476a3f7469bf4d638dc141dc679f9b29ac8fd0c2826e541235a6f87e2b5576a41aac4ae07895c41533985caaa3ff45d2bd384511897cc3fcd6ae22402c864de502ee93d431acb697a9423e616212134e96c64beb2eef41f97aece76e240e5dbd67fac2577c4e4a72558790098e222e24a1018c595911f593892af012fd36cdb3b1967e7241c1a82da12efaab0e75bedc44b1ad62f22808516b2ee4339e46c650488b6f2c684ef950f401234dca53eaffe99d590fe17da1bb88c06cdaef866f1a94a03e8dd93d6564b5c6b4faaa06da14f78e36670e58e95a48aa300ed83df19bfe9f939d7dd613f04e4654b796d5b7a3d64cec72610008b514b3d7d741b5735bec4e15653a612c7c2649ac8e7607a934ed9f2438c3bf255552a20a3d12341ee1c7776decf925d790a597648632e5d750a64f86c21adb68c06c407049330319b5f8e0433aa36b3db533f723a7b2b76a7e6823b917509dfa80c855b2028c6a8d5fe5523e581e7b8572383291fadfc589479ce4663f4b4d031dd0a9777106b0a267f894064d549dd8501c1057869f565d32a85a3443f533aa1dea03689c871f7f56987044212b195ed647591d54dbb30ec7f54dcc2a3497180a802c2c8df8fd4db42caca0dd8d363e8c22d58a6a7c25c38eeb85d5fcf2c0756bf9ed6c4c429333071e11c188613da1fa134c47d268f2a410f2c9f8c116f7e8c9bd0cd0df4b295ad9d567502a8f76aea98385fc948962dad473e3dd82888499ab3451ff50fd07eab1b976f4ccfe298e20db4950b6c5bf8d62d4992b4730afb199c686a2a73f740a1832055674989e68e78160eb42064fe4437fb48a16f6c0581bdb7160eaf8bae295a8de1d2d441d6587df92763f335c08fedafca4f9c2feb5badbdce223121f9bb083c7f2fceaedad875ba799b6342c211b4f381ef77cb2f1fd2e8dd05974ec5df12b897deb7357676f5f66fbaef10756234532a3180c24336d3c4cd19506684fe109ec6501c5a3bcc85298452f5137cf9d24b0d9655a9ca4906de38ddeb0dd9a0783b75346c919d3189c051e423f03b511537b68e54e626cf12a18ad3c5a9165eb02b4eec36700d5eaa5752feda0b230073c5bf9a1d1bdb215d9b5d9b7eccdd916efa9df7f88a2e9c3d4b0203a5d8d67084617349fc9f79e86e480b8584ed91e0fb05fcd821245382d937d98315edc839bd979c0e920565acbb142f32669fd5b5eaf9e61d5ef32e9af4aa63fd98be7ab495d474687bc230b6caac231292381b98c522d437f05b125d25ff1be3accf508993a4a6d7f87a5dcf135ca1b6a65ac5f2003d61a883e09141c3b27bd5c0a4fc213d94adedb6726f3e3bc2059f018c875a2295f8ef98084dd174610e3482b3e003fa00f40a346ec78caa68d92c4221b259b2b9149d9b568a94be873d9051908eaa6f8603cdd0b40942c5bd96eec6dee95927334f030c4fe9f3f8a19479bbaf5a9cf4a067a939e6a6e9343cc9772df88ed0f68102e07958ee87b92cbd313f84f6542fcca MD = fc98a8a7b37b9798aec687fe4e80e30d616598d0a6ac2c4826058a98db089df3d65fc9f58c3c1c518cb46c3b164a203c Len = 83392 Msg = 3333cc66d86fd64c5d8003e66ef2fe43ae6c235efce2e3f4f50b6a93b91680f4f299ad8a13caa15bdef1d20f291d6746e116552f4f94c8579aaec4be8e950c309b8243d221ed51fceb000846f94b08e682b9df3939c3759fd0e3a88cba4c33dc36d8d4678942aed68a95ecb564e4a7c9983c09a341d7b3759c925d25c7a1bca0c982a971d32f7f92c698c581f4500d972b871b96f0384a8108a32cb03dfe71235e680a17881e8ed7a4f1dcd531f802f944825d39cc4e026a1bff5d55a2ca180efc723e812f76a14e2e8979d7a2424d96e91517b55f82a3d8dd8c383e806d7a08ac888fd8509f819e6b46e3afcf97b81825289031313af475573304905e4f5fba759243447301f6706311648640600924fda311d6c8dfbee690dd0b76c5d88fcb5f78a3ec2104c76c1fd342847e0309657b6ee2cbaedac9d6907093163c70d1e47222f7f9e110be39a672c6d010ea8080a6714b396b91ddeb60d6e5984b7feeadb77887923c8da18000d838937e7b362086959448856ec2cd07f549257a6dafcd35639ae0b9e339e836ebe0f45120f2eb24c0041f86d83f258db706e552a2d9edf4c97a0be07a4e1a4f95051c10407e8987dbe4e7f6371e9bfb0266ff5a8637b4fd946d3a39baa8bd53bcf1324342a0a3b7cf7cc75bf225d658c0af9b1a8190cb57aabc954d0c0e7a4b4aea5f729021e1bd8214e83f731d7facd82ae31bfcabd90af5af45a3d649f93e2639cb2691c8eaa0def4722921cd3d00321ffde45d51871f5b8d72c38122e13438269de6ad5f6768ca648ca264ffb95bb6d611fe0e4a7d9dc6a04336765edb3568f8fe3b4cacff1e2dab5e31a4799bc54c9648ef755e628c1d2ee1831cc88e4a9ef915acd6795bc9f112115e49048a46dca9c941fc55dff548807432da27a37ac26f0bc1b38c2271fde1cdb1bb682ee74e55bd7b0af69bdf2ede23cc1a42c1cebca307024cadfd1e3960b9b3636d30af8ae34c26060a3f52b98f16d843e2914c74dd32f807a694d98dd6feeba7db38a7789b9dc95a597256d0dd76debdcfbafed365b32a4d3e8ea9e18dc3e1f079edd501c4d9ec6dabddf45b0e6b66efd1e5ecbf82b320873c94971dcb311ea710f8430ba72718a7c82733436b1cf943b0ba1d217d5a631b694daa29d97029326800f97f8db0d37078f91c6e3cb21e2033e099e29ecf7a738d62eaedffa78afb49aefd46bc9ca83082fbb5c5c9545eee240068e82d3bedf5707a5f5284ffca687baa59467d121c4fafd40830592b401649c1931d72c5450bd93e123eb29f70e3c59b1569173ab935c72d1d98365f4cfe6acc2068b596091c91550a9acfaf04d3f12a3796d43d064b92adfae3a6170a0f51c81ab03dd5c18f61694f4f24590fa0c5fec9b5fa438bf7d7fda9fbf27b03b1c55e86df53abf6ce0f1fea44f9c318b10ac0d2add273d1a260c432c662b4be4d8d366edc3f402e406321e2609615a77087175b68a4f65fb5f3ab9b2e3deac34972f7d98f49bbf44d27173f8d4278444406ac6bcdb8f4bd96595aee1acd449b0f3c4ad0e0b945cd5d21a80ab2461478954d260ac4559474af5a78337158ebcd05b3d65ab7d60543d81a7d4ab6ea10cacc262e4035c4fe0b67bdad701d2707e1959e447ffce924dd27db3e07837694c34f576c16084e5b0a254ca3af0582bf6026c73b47973ac924b02992490032cae987a887932539d3fa53cdfff711b03bd11ff464bb70111d9edccf21191566d8c7dce328c075cd8d6258096c5129fba4bceaee67e270b648d51393947eaa59e6e2b7cef6a3de54b2ca9cc890c335a922a9ee7debc57d707151be3f9381a7541dc47e339a47491469ba87d113581d03dc219368986a8089c0984399c529f49fa4f49bd8bbb19f56dbbb81ee9e15c951fbab417917db62475e340c6ad37e7a82a4fa748502ebc6622f54f2e5d90422dba6d06076102009f373ad7f7964881f45455f730416fca8808e0e427f6b2c0ee8061758282a3f5fd4268906902150cc2faeaafe1ca1ec2cf82070d984fd9576c2430892570e424b34a0520875b2dd6a8908637f9448c339110c021fbc364843af842b74cb6430b459098fedf1be37df9b7a125d35b58ab9157b4c7defbf4c5bf8f109674bd312848c88c91ccced6715ad2d4000c79049934a94d759e43fa9a8e5b329d4a103efa2154587ffcee974f2074974d0128006aff9802a1c645f6811bdf21321939dcff63c6951fdbf576660f1f53735dd2ecbf56966cd2f37c7907dcad550b8ea49bb68491caf7e66e24646b2591097f2429f4de46f49f8251e29d6528567ff6daeb9e083852aea8c301b8b939e875e17638b9fb0c325e1f60c3c039e2ae060e675d44634cd49aaf9e9ed19dcec24f2153995d31689e951713bcfecf6eb44411b451182a21b952475b6c4d7d56a70bbb36dc8d15eea1eb05f50ed79a1f01a0cd6c77a7c159895c1c83fa9adc541f222bba72981d00d4b6588f69b92e962ea28dda3161dd76cd1e9b92ba383f698328df38ec2cbb41bf8dab4d3e31f14693dfdf880ed4b2fbed1051222bb41ae98b96525cb9a98513bad76ab8fcc086b2c99f3f10608ef64b61e7b99cef8d036690e131706b9cef096f3a134d35e3536d489728fde6ef2bf7e3fb517d46216d632bafd92e62857d95351c31947a28ebd8892e299b0273a883bbc1953df01fcd51c438d5d13ee19549b504420929ffc47713eabd8233cb107181e111795de6a7d4e332a423613fea996768d125c5e651eb6143514e0b43e833beb04299e004914f0113b07f7a0ed1f6b4e04b64fe5b388819ce9148f97c846ccae5a52a36f7fe32c662a75fd9ccdff435d12d6113ecccef75f2da2d7ee3996f4ec7a5a4c34f63228b95e54f10f8891452d1f384a719a3842e46a8460c078bcda2fce09405694490c923f6c7a01051d9a4594a5a384030d8ab30983d3156d00a8febd2728dd436f01793584417b2ceb692dd7e5c381f197f6557067d8f500a983e2af7babd2eaed2ff7a866ed84e543db6e52c0546f4b1caf5109f81669190195620cce723c710bbd9300d82725186c188f6cfefb57f9e5dd2f3bfe3678a04e06063de82423bf11d3d6a5a39765adaf47188c666240e23aa6786d40df2b7dd9fe56a8916a8fbe479b47008fe44c8c5490911cc23132f06235b30987ba8998eaa4dbb691ec8955f53a6e7763b7e29ea31c8383d810360aa7b068769b6f9ad9c8201ccfaf51186c62dbd373e9b730c9e313762970a552184f40201c44a56629bd9ba15cb44245ecd7a4ff5de78d3df65e9df076549b9003a30c61634a04f66e0f3df3c3696617bb9cbd799b26e0110e5ae07bd24b98f8b1eb3db6b374365192072d996e936696c2f94fc9976e59b5f720079ea51c44910b6ffaa4748be07f7bed941bc3fde9cae9368278b786a0309bf838e257904963f9766cb50e58ad89130999022c6e98bc199a7d0d65385c8ae0299bcd506f4c76644aba70e9a0427640a265d510ad1b73386e6910084a35ccb0fd5ae9f881f8d332310d5d6d2e4a4eec021f1cd78319f72ffa6d090785d5fdf2ba9abeb88df2814d748d0503c96b19fe6ff060e8b83a51e786b281ccb1e1258ea986d2f65de5889b5b61ef11384de05e320027ad142788475a6000be96044c6b1243b01bb777f1062db2a3014499abf49376fc8d5f88a436be9e0c45fbe47b733dfcdd906450c37534a7aa39b5f780a8d97a64f06004ae9ef9942fc9aa29ba8d71d7e2bc2c1906cfb6698b23530e69624e36e93ee044ad66546bf0b2697c0fa1f8fc4806d67ac2fefc1fce25e5876d0a38cf12e0a7f0a976174bd76901858498189497d82c1a00e94ef2fca935099488e070673c7dafaab68a5b6d543aeb20581ac75599f4a2c878f30a9c16093de7c48e3f71bb2a29b90ef4c439dcdb56ebca46bc0cb0f7b92093358e36d42acb6da68a64b7c57507dd669fadc469ae70eed6e39c4387fd0812225aa7534b605a2f171b08c2c327f11fa6d13f946479de30653b8e8385ce37a50dab7c7ae3729233fd8a53181b088e85b6d3a23333054bb95d94bb531231ede13c703633042a1d8342206c4337e0871a7eedfd29401a5d92a8374b3b96efd2cf98f1fc06164ea027cc227ccb7d7783e3e66678fcf27fbcc22c6c65c379d08f760775f77c81a7c62585dbaa3657952bead7883d36b0fe1151d37a3174249cccdf72464e1cadfd348753921f0e2c0127363799715ee45d044883abd8d5fd1b3010c2aa2a6e02189555208e02da64841ecff0e23ffdf5653cae2645826f6d156413ddeab3fbe9bf8f95d3187c2367e6b9bee8abcd9a4bde628ba39156c8dd5110f0ad4e104ac8bcca515478b5709cef9f0a093c43bd4e901de8e2d77d6ab398dbad191d6ae408d5ef908bf6d4496d6678bb39dccaef664316cccb5f1fdd59b26d5408a1e84f12d3a65b60da02364115eeda62d48ab6fbbef53f467062a735676fec6420b3154d7d96b9bb6b66c081c2a76d6b6daa9d75ca61493b537152b17f897e14e3f2bd209d68b284f2296e93364b7f3cec52293c2f02f39251726633c162110032ced0f5f9c44ea3b772c9e0398315bd9cace4b8b5814433b08e6925f6a3ad10556fd5335b509600026a58d093f739d6c4dd555123864506b8ece5eee6f35a2c93fc544189b791831b38a3cc0b4ef26fab10047043b8fcf4b3b561f659fb213c359ed6894b9f47154906323a6a3049709a6b7a7bdbc073e3e71066a517630928837ce2726bb1c19cd6f98e83784744c1d9163edcb445b2bc9d267b63e7d21bd8c5bf0064af940601083b3e10fd38ee4ab03ad8f996f0bf681d1e289893f05e34438eb8c7e1f01e2d28f4ca48c1ae4cf467ffd13c4969a4ceaf21f5ace166da2545129304c76f12077d4bbb928b4f68a5458cb00c945769d59b576b079adc9791127218812ab7e9765169975825c34946930afdd04063146728e7111186f99e62f3d7d0a7d170ab64ea76e90155b3f7c09aa041f21534af6ba0fa6f336c66f67e306941de864361b8919936f5e4c77bf99f7702d9db7341c849b70ed315cba7cf114ff58f0fd7125a8efa089b9aa6dcdbedb6cbed5ac7d3686c47755b4aceba3bddb2742035d6c63129c2e65d3ef9224dcb8621965ad96c3250d12c31d11a36acdeb944fbc0e58527aa1959a29a675536800f8e3ca250140e3f7ebcbf725523095a8def8678ae58235826e8d374997e8055789947fbd5d3e47f76ac6bf728893a9a55fd2b25d9460e7d121b569536a51292eacb1f2d10b29c59e0849f263a7126e63af4518e0e58ce5f047a94c5e7d0d47f8caa2c00a8b81f15e4cdc2c934e2b786645e5f7cf4954c46258ef5cb5409ae6387c0d73c46ee53fbac0e3ca6bde5d4c1fac2bfb73305707c9ddee27124578888029586a8915a21535dcf74867e8165e025a9d80774b0234893f2c17d00c34a3426afa20d320671642299d4301ebe532b0c9a12345f9f4bf12f53fbb88f53dcb01b989433d0fa2c7721f2c36e46a484ead81dd5059bd9d1c09b88f9ea7a11264408d8c3e2143d38d48265a9069e3ce165b0ba8943d1669efdfc1922db6805113715f596e2a5d67fc36e77efc1cd8d52e4bdfa96b6a84f99f07d8fdd52023683d36c7977fa2dd0e88c0db2fb677c9fc0ae26646526c99ba9e043719419f0ac655e32eccdf451305a76869d36c0527b110c14815c5bdb52b8177947aef6d96fa02192d4ff96bb00bfca02c00893f8282f46afd7e41c877daddb459a93b265881a64b2bb77a91348fed1a8a4daaa15ae00a41ef0663375226f75cff0aa153dfebd6fba289cf4000effd0a1d012cb52166e6d8a5448664c4ce82d40d45de609d97089d3a4d6412b5caa1214cc1abf576760eb1a89f47eb400ff4ac0cb13ef70211afb25b68d563c39e7de2a21584ecba9bd64f719d04357489c16765f35f61bdfa50ed7e629fcdaae9e7b0a56363f57e56f21488c467cda2ba7d78b1729c4b21bf80711bc12fbadc1b732def31a5ca2225d6a3668bcf3e8b209d6277b5821dcdbfb31fdc1b11b5e7c1a4bcb816e6b55686f87e9379c6e27e3a85b70142ad4412996d3c07c6c2495e7af0efb87993517bf8dbf88804db63fc86dad916908a78a0cb1348575acddf9095fc2968d038291309f5b3ccc3793d9694016b00358605f8d349d7235da0f33ea10b1c31b141a6ac28da32ca2c2cc9dcc0adcf66883c867b20756af435c82eb92ab21abba34c44b7e3fdf818a562b32fbb1488a22f2a74b8513a765279cfec80a195b76f1cb4adc6a9e57620c5b7641fe1fa294b90cc5b30e3ed8bc6a004b725940a74b494172c4919053f8b1397671db3a323eb338e945547130db93f23092870a4c5249fe05acf8fe1a6a0058f36b9cec3fae9ae0ddac5f95f8eb2ad977d09d5e94b5796aca3ba9d1f5e18221b5d6491c130cf56b678e37907913b81de6d3a223c59961ee8b1aabef2c85bdfa835be8b2f4814d415094e54cf87cc42546449e4328288af00ef00642077d3b4c26a283952b3529ca5f6570afc04dd65b5eca99a5058a7bda1c66c2b1cdf28480675221af004f116d5eaae0a318af7626f80e9c31a4e7bc127d24e823c80b1efc0c13cbe7baf78d95130a3d0f47ca2deedab7aecf4c66d602f9d180823ef1932add8f8825a35726a7482e90da96c5821ccd6ed867472f5010581590b578cb6b71a46b60510194630cc3bde1ee4dc9fe1699db21e1db6bb2a6619a22a4bec22c3827525b541dd9cd2c4d603632b4fd274506a591255142852bdd053d3758fe60e92fea82143f4cea6fadbf998e128a8811dc75301cf1db4f079501ea568da68eeb84dbdc7aaf15453ead8111eab197a6e3e2f207ac025f9ba14e3430e9a6e33fa6eece716eb45d63ff134ea62ed74d0b21e1c51dbecef5ee63d34617d8ebdcfa82356b4ad9974cce1ca8d06143cdd43e35a2957a3b9bc6d2b4ebe0a70ba4ba47e720596ea1a1090dfb34ac490fdb53c785ea0b2709b2facefc5daae96a19a4ae3d7941e5b017bda8067f8d677b48f22f7b84cf2b125bb86ba4f24be4de92c3b8ec06cab8ec448f27a35019c16f5edbfc7d37888e3cdd282f12726ca04d563eec5c909dee3f6fa8133c70f862d46333b9f5cade59718273a4afa5b426a1ae3ed3f5de618f90df2ff438a8d34f90a025eb4a067b939890c152e352cc7dc0e2ebf320babfa4c6dd4d50ffbe52918d5dd61ce4b30444995039c017435bad943a6cd743ea5f34cbb12ab1f97a1c31b1e271d32b9924745c0a0476b13e0abf03fdea04c837e84786a3ed9e8ea6da37e6761c99877f812cc80649fc1b0c81baf7758c04156903e5dffbbfa0260833a91362fff5602ec373c78b31dbbb7567a657e87b5d94485717be00c73e296ad09120ef446f1e6f935241e2e49afb40648c0b9fde9aab9b8de40bfb2e00ff9258f6f462108f290899d01c5489c142372273fae2de40c42c4c55ae341b6e104874e179068edee9c17cf5412749d8f72046630ef9a3d946c13d7190f3b711c456cc599622e3e3c764e4c998a34b6884c47b642e2b54ed99230740978029708483076633fd3a2629b77b550912b8f850eb677f42c11a02251a53caac229a13b696ce1039e0b9307884e6a07dbab711c35cb2bb33031ca2516ec918b8233283c458c8608e1388881d91d0b2dae5713a45e10521e739835487e61031a1c9184714919e5d1bded0b67ea6df940ad90dfb3e4008b747ab76a12f4bd11d515d75e71008f710c889b943058dbb4df3deb4dc164262873ba11e0faf65b3e5ae2670ec1e877c7f7e5b6ab6190d0de57f3e8e6635afbb99ac62a22870fc5f90a26e32dda8d4d5b4239d0c9721ed7d65953fc220044fbdf380372b74dad87c26147be34215b8a9b7a098c66f87f6b2d41c2b7993e9ea0e9fa168e17a56c0b3b0eb97a9a4cdfba08ede91c1c5b2f0553afe48da454d4756a5f53debc24a7eac341108af8938656343c4d324210aa30da022df0ec0992f3e0b66fd72d41fd80ebd6d161b7cbebe9ade39a5180bf7d6830d70373c8c336a6ddbdbf29d393e978250e70b1602c7cded65274ec50ce1535f89d09a8d2f85c08d1d3b6295780d83aff7672dc7a5bb5b02e2751752ab30e0481c2a4e2933f5f943d770968119f6633eb9d5c657ec0230845c0b48e8714c46e6cf669c3720eddc391361d68aa46000d69f191ced5f041419dcd129aee59e4ce2a96cccdf7cd43217d8f66ad8a2b32320af1c77b28729cf6969af01cd8f8cbce4b224264bd112c3842f1799929b5692c3f3c421ceebda281d0b8d1a6cf77f5d93f377f2a0a60f57291eacace115b3166873fa6168147de9ddca53bab4a6e0f698734b77098432b6aeb09debec9a3176b736a77ea8887cd850afe92acd2315509a3b8afeacf2e5a7baead29edcb1387c5744b1c1b7d13dbe1fc137b2def6883342511acfb17890f4f5d6340dd8e330eef1a50272bd772a62f20925990fa89f6638bfe532419e9963097ba98009b681952c6280d9e100a98e6f8d9c298ac0c4b3238dd16f84ed69bd9be11a3e96b49439b181153d4cf62408415782a874c65ee0acc1c8cda1ec68c956117090a865cfa2270da8e826e002990e6fc15ff842d5b67a65b195c024fe51df1291be67509b97370b20209647ab097fdb3f963bbd90fd368073100b1b941be1ec6710fafd61e18985672ec4b287203ba5e69568bff97d871bf883a85b90f102a8d9cd8af48748c482645ad9a9fea6ebd59ca3a5ce77fd163d2739bf6c5c99ea4dce3f3ebe7794910bffebfdb4786236714b091a7472478aeee87979d45edb42e330ac3fe2978d9727202b575c5d1dc583da10f13852218c36238afd1d0081b273e65db4e851fb7fdeaf601028159f3f1231fd4fa28054c41ec0b574cea951e103d89ac6590ca5f03894d34fa108b04d27381b5e3b62a8d9ada8420670c015789eeeab9dbb2f54933eb7cc3d4d9e1897c9d7b1468a61e474ecc179da8aaf931e4910d7609924d010f7019202b6409ec400f6062f18e6d23ce1f4a119a4dd947c0e2667387852e10e6c586fc564540c7cd47d63406b5738da962a04ea47b2df3af418a34ce2214f35a3a6a9aede4428694e5410a10d1ddff51349e876f9963eff03ced3c55ef9e12ea6d189e7ac76bb317563557b86a18f365e3a96e545f1777344303fca754260a17dc2579556548c7c52937af65c4a0f4481e6565eb02b533fbe272f84ad6495352e625be3644465f3ebcac639197f29c984347009c4ac9a0b7a99ea1a91c74593c398ddf75fb00c3d4af1826d44aaa36a6d0b2b0f08dd147e7e70b9b5a6d43b63434b24f9cfff4a0377f1f7b9663246d14655d09804248841d492e47d76f13e4cb76579123a99e7ed78b06a46067fdaa617f9a7cb41eac0fc84e9b399888715f626cd24692ae6aba25718263bacf92790e6dff8d146988256945b6d3264ff890a986b6d28264e5ecb1c1072c1e108f438bdef0bd29b9497f70ed25c6f93bf623016279b74b739c70fcd7f95002b140b46a31127f5c948c788f935c6799c31680fa6e9f878630faf17744fd81f15853261a12d9662571ad9b15e6cf47707bc62505399ca59b538de8b1867834724c33231bd2b9e42cd749719445e2e925dc71a9a221f5a42321c1c12c2afde9fe236d35f01f388bdb4bdc769b3f5bcf224bc56961d63f05964233154790f3050d646dc93756d9cfa935d3248b418e5bee702dfec4b4ed4c6d2b6e4fa456fc381885c177420822122f2bca05f4daff21f2b017d43b4c64db2043bfeac2eb7dd5b81de4aab0a18615c5942d95688a32b3c7a21f74361b4a445831c48113dcfc70648363ee03b18a2d15157a4d46ddad83e5bca1795590122a6d6bf87d2799fc9a965cabbbabc6b2da86163ca81033d414c5764a3e1a4930cfe858e8696eb102a6c610489e194f74a0a12ce140652b4ae8ff55764ce4b54ad7419ef0c0699083478c34b6ffecba6401feb00470b6228662ebd0b2205552b4c31194ce0ca8d702df5130636b96a5f590e74612e373c7fb25237e9a52ecaff305c0d0ccb89cf315e0bda9fa6b97709db00355a9033e7a3da23ec57b4f0b3baa21e7d9795eb65310fe09e7d87a7fd8e0f1cb75134a66b7a26c863be19f31743ea9ff255069a595a889fea08a12a01d53d8b81afe339d1eedd6a24879ae0fe825006f4aee53bb393106e43a8bceb8dc6ad741bdd659420e64930b818005f705f1c7c090afc7979c3f07533c59f91a849a6000e41825e6049b043a6db121776c29528bbd111f9b5d471de41c713c55b467257e145024099015bca76369ab117930433916bed666eadd9cef616e02fada557a01c50ace1d4f592eeb1935ed45cbab1c413405866ad36706fd81ace76a64e9e0448c949ea190d9dd7de5928294b1fe404cab81aa1795780e9713ca4434e2a8eaaec1aa1026e31c3ac85f0be58efabe51a3d3cfac1daf84f6449e22c3dae1f71ba90aa7cd2dd494d962ec0e8084d44fb2ff532c16bd8012607e6762c0dcd168d5ebce1a2016d3d83bc623170e16fd3706b780437497c5a4dfad25e6d5ab3f82cbcf927db3826f5ad47a8ab1d8d5c418af550182403cdec0c669504b7cd69ab94fccee4ee1f115a135e8996b6b11c7492f604d85041d39dab73b5ced20ef6190d47c480a45d3552fd2a8c5a04f8b856cf951dab83aa97567148bc2685c46228e1c56263c59b9bc6b2d2395fcf0737ce8bfb22f884e62000a80e32739997b6c2569d30f61980499f7b7f180dde89a1c30c4f9b291c9e778196ec9d1cd731f9ceb6f8b69f67b549c3a059b2cdfb24fe1f9cba11a5137aa2c3830b878b0437333447fd7dc779e1a31c69878e05ec8057c981640bd43121abacb9927727eb546cdc52d50cd715ad5d911d32341f7a46b3a90374111e3d3c99267faaf658532eadae1ea7eb3504c1810906812d816d1e1ba76c13abeb017275181c7b8b86036dfd92f59ca34b0dc4166e6a9d00958daf96ab026862a3436c4669d92cbe19c4ba65701ddcbb80fa5f25a792ad35c1a2a22c9d0f9cbdaeccd11403fee617795ebdec30df8ebb3b9239b59cc6da556f739ee565d9d64574644ae8cdd3d01f0f991d9aba83da2be69cfbce354e4ce706c94ccaeba93f805ed27fc9af9f135d413d8277f651e994e8e14c785a712a73ee6c54e218c6fff8d2e017bf91acd6597811968ccc91e37ea929d5bcf3789c818e245d36d27a3d353954bbd25b40429c1ddefee0258af06f913b3da1e8abcc9a50b90fcc020b21bdfcf7120bf5a47fad966c657be78536f108e12d302152df459bf214ae91c2d41a8191c5714820b4144d837166fccae08b76e14d7086b5000bd89811e465e77ed432ea7b0c3afb095aa8ebcaa84aa114c643044469001c55736d73b17468c2467176c9dde5b47fa706116b1949bb52fa28d712bb2375ce0605c34b9968809a557bb4f892039ff2b6a0efcd06523624bc3b9ad359a7cf143c4942e874c797b9d37a563d436fe19d5db1aad738caa2617f87f50fc7fcf4361fc85212e89a9465e7f4c361982f64c8c5c0aa5258b9e94f6e934e8dac2ace7cd6095c909de85fe7b973632c384d0ebb165556050d28f236aee70e16b13a432d8a94c62b3db9e087727e9e65ccd0c9bd77f818ba001da5606a0b9e727e333d9362f2faab6d16ff8c3a9edcd6fbc17c1710325737d9a3ea14c8886469ba1da3f487aa5ed8d705a440385985456e270f120a8a7c453fbfa999f0e4cac20d005d9920445c792391b7e9953a017bcd0a69f48d89edacda7bca380baa374721e552ca56495b58f9bf20d078c6b840bf737405c0b5133453de3539415f13be9bd36ccf5140c33bff99c73d0a87135bec68178fcc9956a552f0d3e4b98dc5f026d392ef38b1fbebe026947773047896fdf43ad8d9ba1fc67eba8a809cbbb7a568ecac7333246d30426e70c8dac550b79a1cc5290ea2d46080434357117250a50926a3a36c2280d1ce7a4176675304876aeaa1ca93d8df3bff94e7af4139f8b7b2895dc708329c982b51f1ca4435face1665b40391e4a61fa4b35cd1549817a50b1ec32732dd294b01fb660c96f39c544595e71c304f93d417aa8c0571171535bbecbd0b10aa8fb3fa818a84881651e0a083235c979f0c21ff815d93c03f5b306bfb34baca213798bcea437a3f25803ccf364e0def5f7bd0053eb9c26a974f5dc2540e7d89ca87c2ef3e7b35e6a8932e79b651755f1447a7d0eb87db97a85a8669fe359c752ee8f83c8619fea327f17f460c15dc1048d86f098faf266ef8e57107018f5fb5d4c3044bc9051d9e2b02f7e03f818c298296ef573318eb181156e74566060d72447eacc30f27da013b2e5dec577cccd34be9f163deac72bd7b16b0cb3481f0d30783b94c60677cf1e0dd7b155df0e3362a393bd498520283bc8e944073e74e01a438f290c5ad4d98a177170058c41a79a7ee975369f2e5955e255b4c2c227023a307213445e1931e0664fa5850e0b9c54a70cb885a756119e942cc9866199e628d570ce3e9eb97ab970cecc34e2c08419c279f1a72c1bf38e34fb1cc29b420e6e98f7c43b8b3a165ddd8b4e958904e16247cddb2babf4719d6b3d0907ddb3dd63f1939fcba21f9775f2e1c7479f4d56b6ad54bf7385740e549d6f18a6b763e5a185c0bb7f71ee607a577ea09b640e369f79bb392f672f4c3c520de65fa6d6b9cfac0ba1c7890b13e381ce752195cc1375237db2afcf6a9dcd1f95ec733a80cc170ad0dd24461a3439f83dbf7a930b7ff030f8b6850cda857f5c938591c1069f4ff8bce826377023f62168ea06ea40ce6938d8df4fcdd395db9f835c2c08bca5b31c2c3d3debc16590a3cc7f471a10a168918a8750810a316a6ee1daa2402761e8dbab56ebc1629ba1e5c509bb90df7b76d17a3937a4c30a94313b8bb525eb6669bdc6bfa056f818926e0ef3e4ed21cf0c8f447f75c7b263f18d0cd9b5185d25be48eaf20c1ae67efab2f6d8539d6c1ea21165c49b584ceffae8b26f229611224ef394788f9bb231434b1911781032ecd00e5aa308e4f70128cad8969e3d9bdea4446fcd9b57efd1f49ce259d2e3faac0edc9f855eec4549f3b9fbfa785d41dd46c1b96bbfbdf3d3872eeefbe49747eeb712a0f60ddcbc1cf41c890551a3c780bee22ddd8d5c62a893879b923d989f3771370b8f8644c01ca288fc31ba7f817b652c299d54a1b0d3722d74973e6664f8c5c03b9c5892f5ab7775e22a036f042fe2162915d62c62e6db970675779f3da51d34cda71565c15beb79c738dce0c410be26c8e1626afd55183addd779818deef00b1e5a1d3bb79096fb07f8978345b041d4758a89dbe4a0b0af4727a4ebda18e6b9ba0ff0735d0bd27040e3d3b50d9115b5bb7bcd0dcd4c4d6aeed09a0ca6c549d73d533fab0600568ffe8511f48035c221073fac5efbda46d4417cb9827876c1d9f4ae5b4157307b809d46c2c04210afdce530986e04bd2591cb8693dbc3afc7389c8bc3e4d4feba28a9b366b6c7b4671fd20921b98c77722a0988a9771cd2d289716609f3f3cdaabea0559e36959360805a23c8afe79ba4e377ed7af2f8726c333fe7adfd284fc5d92da7a9ce10202494ea1b0ddf9a8c4674833f78cdcb210ccc446b207f06e783fe8e2449fbebfd3bc40e5951c739dbcf53d809336629412cbb2b7af1d804176d955e55cf3e6d8d1ea4435944d53a1cb7e7d2b53b6a775554964191a2c694620b442aa6da04395235ac05b557a81fa198c70fcde13959f00ce44349a3995c59c5715fa1dafbb3df2941e1d7faae4f0cda67ebddd5513593ce0b9cfd84eeb05124a389d1427381a6521c444bae666cd10550f34f78508ea31092bb47b725350ab16115bfb10a172a5881c98b035eed7091f8b2ad5aa5e9b06d002a92caeb5ec8e420afc7a73de8ed9518ce0069f6558e18f5a681fccfcb4e4bda7779309f922e55689473857d6b62a057ee6672cb196bf2ae4b37cf3ca7df25980e6578b083ad5dbf805dec47332c02b597079e5bbdacc7a92d69428b03d592bf6bd213cc87c8858befe13c29c49c24b8547e4d16b6b2f06ca971072963e40bc72c698252230265543fa805a394458ee6a3351f8aa931156f5c098da64c6d0925ac7654dfe9dd65aefc1cd93336bac9b70fb68635e989af37c17d367021e303717892fbc450cc1f02a1aa1767006e3daff69d01970c3f164c5656a21588e8a3312d49f7bddc50f9e5ccfa409d95d28337f433222c95c3f313a7104104f5d030cb26f5d91b010e7ededa67f5656b8a12f585235874fababe342054a3dcdd5c54c5e241006a53571644568da65d05e7655f25e824fecf75e0144e7e4afbb3cf87a80b960e3a37bd78bccdd5c3c2d98d02db52fc082878a8013aae0796e02dbc31f7ff7f72f942c3eeaebccaee557aed7400a8c982908aa38a1dbb8b18388fa4fc2c3a67af25f8ed00a08fe786834e8b215573eb24b56a0ae343f3736f537e1c4ebb48e9434eceab5728d3c61cbae8d8a35050eb5f05bb40b533e25adccf6d74923ba76ebfe238715aae04c1118ace786267dc14a20fe2d77874049c111ac2506f03d282757ecaf173b6bf63157153ccf72262218e427551957ad6c18cb431424dda56af1482fa8e3ac9404698ed3d58ca067f8c843be721a4bed565a02a2eacb6f5a05f1d8d4bba285c53c60c7cdfae639aa0a0146accda1eb68cf30beb1ef2230c4c1ce MD = b927381128f052bf16953a327e8bdb5fea57b3715142ea1e0eded78b5c2061dc68cad2956fd5ec7e51dc22ebcecca4a3 Len = 84184 Msg = 97370b26001e364be3c39b545be4dbf49cfa51a58f56e052bc6fef536d7bb19f103caa3dde1d6ffcba7dad645c4b6cecaed3956e76d7b2d736e2f62350d97d896ed3d4f2212abcb0c9d32b6db4ea94618a9168c9e8fbdd944bc4ee5f3084a3a379a3922d136fa6cfd66b1f56aceadabbf6ddd39e2beae8efc2bee0ef53a3ab57f955ebd6fa11b4c1aaf090078c73c763bb5fddd588cb5b526577d3bb025f1e0cb590e8d61f3b6fef0d0887679cace2bfa1be8e5647c6bf24fa98cfaa84e0832976fd9013ca135dbfc65b0b6024beb3386fa3ee09b0059bcd4ac8dca6234d62180444eb7643c1089a9f9224d96bd1c237efb506d60bad77b51db0039725ce4440270c01e7d16ef8e95e55dabbba0b9822e79ddda69fe9db443bf74b63d38daf09a7fddb4fbd42b312cc4b36ec5997bc6220027b5fb5df50e26b46bdf375af2edb4bc080945064c37fb11d3f55909bb660628de9eb95b75df776455f2f535f461edcfdf8a0cffdb096d573fedea7400f8374e62e30879a8beb259b3bffb4c3813a235b4c59853400c1fff37970e5ad4e3220b45218d3b061263ef1594ce2036698e58383a9b9323d67f948baf1930bfbd72c9f5e8ac020671089eebffc23487d9eed1da577b21eeeef8918c94bf9819ed96151596d97132511d03b77f9c0ba4fb502d0bbaab9219cc3780cac645f38c0a0876f4baba1b02492d97f892901806345eb44cb2c1663ce4a8dcb6d260d57e89466a43d2b2320ebf96d63fb762dc341b77122e0e4110b0cec92fe14774a079f1dc59535d5688a02b0548fd7c78eaa72715c12ffbaf242df114d4ca74160706ca36eed3e91b717f21d56aa25036a5e7ddd74bb3296002fcd21885e306b95b9d78e27525d4757ee42aa3b5ceb140a06ea6280c6806084fb608409dbb6dd320b6846b96d9cdf91397abeca4f33e1b6cb42674adaf200c6cd20a3996c427f7e8da833ece50241ad1d23c0cc280452b5d50c5698a08e5f0ece94e4ffb9db39c3681ebd87629756f3c4c41a0a92674f514bd09633c05e63a42544b0056989f347c3534d548e6404aa56e533493362c0d055178fe3e16af5cffcb8707124549554c7cd49190e70341cfa0e7354b3008d7b1d67a96fabb8fed978798a0c944507309b161b9f8dc4cf8fd9c842f2bb469f9ac84b4ca1c8536408c30e689e5f63312369b629aeb166bb4c1b9a08eaf33edc758148e03fdd4011a505ff70ef2db7fb775633dd0e2260e29be70d2d0502ef2d536ee8cd129588ebf765d50cc6a7474e728c179e8689ba2ac365a8190b91617a7eb7b27be29534dc480c17a3ec741d105e33e9d3df8e7a7d0ebff335c4479dac3c852e5377884ccbde224d9c2a3d412b817232e6e1d8aac2c21a76e7f7cdaaa9d600e5bb9814d69f03ceff6146aab9852472793e541051e128a1ba986eca905b944f5e1c0fe1dc42fc38b65908628f088e5b464300dd78c1887946b1efe758a9bd9b21dfa298659b1489f9ec3a0ecb9b0954225dade8264c2acda29843cc097a9b0bb76a1ae17a9292e95182a2557325db8593f422d9636955c357b73220abb874c8a7273e63220fbd7f45830ae091904d172370285737005383ec75838b474a91f9797cd8c765fadf745d5738572cc3a7325a39870aabfa6a36e93900b7e3183ac7b6d3aeb44b3b3eef2167f4604da631fdbfb7079bc63de304d76d6f498a0ab65ae5938ad3ddbb22191a1908a6fb2133a1da536fb291b206143c7899ec41084fd98e2432cc2260d51acfd63acf3e1cf446337389f612411a8fa3c2464612fa4b6c3aee6e4622139e19c80754841e7fbd1253811b1053d3699c91b33dff04c8f33d6f5908eae6bdc43e8e121c6ca432d630c1e3eea75c4e396490b348c01f5a8f71b8cdc65f754490b3a8615b30d71d87c60503ca64339cd30f272a2d316c9867339ab2724dd8924a9d9e5ad877c02918fda84777efe2a37fc4df80b5f9f26bc2a99f70d25e158d3a27f9675dea653cd0fc3119bcef714d84ab3e1da8c0bab9eafb4e6faf38361fa77640efb031d03ff8ec28e0620de6802cedce69ce30ca6c25522f17d083422fdbb5fb5a9af3091bd8f4150332f04b26bdb217cdefef2c6abcd6cbd1ffe842a41c0ab30fe3d816b6b83d81ecf140a7268021a0afd2a5e89df7aea903020e3d68b39dee78538a01fae0eef4026aa70368bd63f17840fb04eb1d035217a29f3b62e89737fcb2aed2ce9730f4ad64cb66d4bc9f929101988a3e78fc4c73a740457a02201303c7ef8f19272b0b55a654d852c4fe0c60dd26817d4ec22181d99b61984b5f0cf55bf242c5d606c062f9eb62ca1ea8e54f9c4af290e87c58a700589aa4097da93b3662f2b9edea9b3c25380a2413c4a8c505aee45e8e537a4fe31ff58685a2723b20e5a8ddb3fe254cf2e2da48e97bda2ae1fa5fd1876f0ee04b967c2707f4f05ee1236b19726be5f82892da1ee8f405e5f8d66cd01df79cc20068366dd69eaa0c40c64355705864a98eef118f5a58b06012e811449613ad5cca3b2b413cc629ae07733879f7ee28c8eda2878185ce6402f7db58133bedc81871b8648c7f95f3aafcd4536d4d54bbbb0d5244ddb37fa8336e55492654aa755dbc86e834e832926ae8919b19bab3a5ecb6a8518c2a92045b41feeb6529753c94744dbf23bfc58e549252196688336cc1b04bb575323000e2368046b80174a62361b7f23f4c786dd2c4bed33afdfb9aa4c2e5787f158125311680620826cf3a734b6a8872d671b94b447dd37f6334b6fcb61ba39419acfaaea8a9483bdeaf80ecfa0e89a2a7d8f927db38211b0005493152973c9b88da08c2b6a0ff3b723c01f6364cfeb905d6b6cd5197c3f81d97daab5f014e7ba832d5d506108fee2a9d44fac6ccee9e399377a76e41c3fc0112f1d1a400de1ec2ddeb50629f013e4dfbd25e733561398b36c41cfadf2811f69d170deb3df66b1d02d29990f55c12257d318c052f5f7242e72594bc18fb1e4260d2c6fa609d4a03ca101a58bba851f84cebea4464f131a8d023777d95430a2e84ad659a10dca3ba5d2f3a8499ede50f8f88e2f7791e5e0316452e05fd08bf02312d5093f5ba5e8be2b760da3634b5b26f8edbe819efe19ce4141f1cf95324068edcf0adb83f64be812ef6243b84a92814873dddea6aa2bb6017b38a312b2182c441adb001739b9b641e63284fe6a9bba5fa6f9f94998aa8b2d652164c989ebdfae4f063775fec6ab00e0faf1b619db14a70dbf6c0847faa03d9658af3a28300594e1f8fc30a3f729087628047fd6d532d70e8a916326a0a7ba952accd52b8930906a4fc8d7c7dfc2a10c4657ac202e97382fe823dab341141cd834583af26be3194e5727cbe8c50a6319d245cb942bb472e8547def7c3047ecd5e1cbcc1b3c9fa814cb938d756b62d72558696e91610cffde5c1a01f012e59324dfb219148fb8b543f986acfc276e75c5453d05b6632337687b82c2ad5d6fb82b7a85926ce9d0d9528d9baafb7d7fb760253b1151b679c22d1f4292026438b4804ec0d892bf7a7cd6e42cf7e1f229148c84de2211bf832872c3c4009debe32099b8fe5c049518283799c5244e1a0d35b0c0b0b87502d1c2f015919eee48f184fe65988d50ef3c53fb1aeea09e596e7363753d34da14d83a2b6145bd620fe64a14c129fcf642499897e4240d6134ff562b2eee27df5a28e66b533aeca7a533f883581d1b7322e26ea481efbb253122665e4a4e11e36726605647ebcd1dad5d08b096fc794605793e9770bc4a68d26a1c9343c78394b0632072dbf2af328cd403231a4296ed5e8090f73d143b9a9d48f150c804ed51ca61bf277bca3384c83b60513e89e4e7b28afe2a4381ff38f6418d2d3360cfa91994950a93ecda92e3f5b8d1803ce3b3961aeec7308015c271e6387f02759b09229e3a82d0d504db7495651a8bc623df7d92db5460890fd5a4999bccd1bde00079c11836af1d52dcde8d0d92cdc025c9dda55c3860175dd0e2fe1fad1da43f1d83bfd68c8b2044f5966f1ae0a2c55a114aa4da09cbc57042c1664c7642b2f8ced4eccdfaf1784bd4409e057ac71041342913ed4eefedf7b9d474aaeeed74ad82e1da97087eafe7f741ac65c7876b6ba10d950e5e692b549470aba34d7a73ddd84efbaa4b8f1199bd3e0ca46d802149f66c8aa5deb3f807614a7dce38860b0a3d50e2702aaf57e1b48a5159c33dcc6c92da875c464cce80beb65d94267cd4a330bc01913c6bdd406baafcee6f1cd73404bbfd8a0bb02970fb38dd9d9ddb5b4940c4eb85d7213c46513481ead799dc30daa56fc7b57a9328a5667033153df96cec2002b6a17bdf63f3ab62d773514603730b409dca0896485bb3b80d12f1496ea131d9bc21e84119c174122cf8cf9efc6c723264cfe69d206ca517841da1c5fefe9ef2febed30be859233263ae6161bc356e97b52d91227186bf0120abdbf97e52bbc106fee89a40093d26042ab318935c54f3176994d09c0866276b33fc5e7d4c1cd65d688566c180268f96e4413e424fc9d7040a6e0210803edcdc4c7f5f6c5926a57a62261bdd2c73b18461784d299e21b5f39699316f7cada3fc6bf186dbf88da0e6926704038ca93e6538d4cfb9a611127e848309095c471f3408ef6f3cb8a67b1a6fb4c9c51f4ba8b1c0f32093260c6efd5ac7d39ebd7f912ba9c5731f0815768e609bd7a252bf72e2a03ffa166c883e089fe44b600ecbcc3bc5103ce3653f35db0b88b82bd5891f703d27b6d407f90228ba44bb2ddec002fcf15c173a5e983b58c707d5b2064d10f31e56e15c76e35dc63085bd388bd0e7d7a505bc8462b4f9b02995cae5635ff9e3ca3a041037dba379a903bc10b492ed6466a977420019e359b9bf02268b563cbaa73d998fd95665ab7a6b5256e76a762bacb3e203b54baabdede01605dca44bf05bfe0c2bc9c826d42b18fa7b72ec3485edb1873a00ae92654cb570f3d5eeca2d4ee7e68487c569ac41992eef058c8b1ba03ec16560d74ce83c8b9d81158a19ba0687b32aa1b2a07c44586a320dcffc457a984b06543a3caf53ef163e0a0acd2f0949fc7e96346dcca9f336d50a2b0aabc37a6ead696bd433296c557b21e55704cdcb1d00d3af1425e8e60f58791238a71131b6cb0ed0c60c036fe5d8fbae39d3ca77bf41f8a7561097ad7e3cd939f8dffa7aaddfb2fd64a2988641c805ca080495ec3dc263a186052cb5ede2a8f6edbed591de6c0466428f5f2be3d8cecd242fa67522f2a322367c2eabe8ea76ed69bc3933b2e0619fe23aaded667bc52c20ad82bf096345adea0df3dbf9c4b1620f60abccb5ed590eb63d2b372431776b8016a1264b94a9a9031342d28b01f709313493b961d3593750ff4d95b78a540fb4f3885783f77da82424623c3712964791b087a64142f0ae24f99b859af6e99d51bcaeaf2d1c002fdfc9f85568873db1835cfe0fceacadd7b4d48b833907b678c8da9aa9b162ffa4786c6bcaa9c05bbba8a27d528480ff5882e8941b3c2d39469cf5c2e3bb7cbaaa80943318756e5eea54197c1aed60438511de4bb9fee7e06b4066bdd9a5b9cfa6aad9f4bb45e1d5a2183a80d573bb38f1d40e28ec0bb85a7b55d5f1e7fababd3d4996171fb5bb5e97878e01feb2024e236bf0a22ded2ef5db4fabe5bb44eff1b2df6110d22f6b382f047ca60322c5e1ae2c3e5dfc1dac412f80513fbffeda0bcbeeb3786f2d6210cd319eb38f408691d6a74f92e307c0cadcaa7e3662930979ccfa15c4433a306716715cd10f85b4dd516f9d175f460d0167207b803fabeeba5a74007afad076b98f564f74e07ce12292d7bf21dd52d1835384f193c3940a4bd90efc12f27a85769c42df15ce909c100f921e68f9b8ceaf263a48f78b05dcbced0d6112c6b2ed2cc1e9944a066b36244c01434320e2450353d30a12025be67bfb01e7f0e3f42e5a949d077844574fbdccb7b646df69e51e60c1bd79a610b807878ef933d6c8c96e88ef9126e50f696b0627ffeaa1aa1f5ed198db94f2ceb1fe17070d621bab3ef71353c9dc84dde3aa8cc488b5043d64532acadd0a74d064ae2e0cacf22f060f82c86c2a1f905d7f0ac53fd93c739e4489d0da3a30b8e050c630f2407a9d83ab802c9b3a6694087bfa43dc69c76c47507178398bae1b5906a4c46a7041c38ea37d945373280c696af78d3cc30c7ac2e888657b49e928b4e6e85cd7b50e5d9177d9b4374cfa65eadc8105d37d621b8b9d5d4d21ed687d8e81ff6ecc7736a836a932e0b950443d2741354232f17ecb2bef6e739ffea2764058588ebb3f315fd8a807ce5c059bfe892972d6cdb799160e4f1a9d77e63d9f64ea92111695a4d11214c6b191e578269b05c81826386768ad4d000f3c4c807586b92aaa70e2f7985d400e5eed685f41c756b3aabf0c604fa369bd6d4f8a1185003480cf5cdfb03224da2d1ad106c7ecb8acb3e30aac0a377b15812c3437774a7bed42d43cc4552b0343d169ff692863c96847759b8fcbcc8ed119c08cdd08325463df7d93395cef730d69e09ad817638429fcb6d4202b5b693cd5cebbd37ac91408b51fe2b73dfbeea77503660c1b487362324b6725bf8094b953ab43b315ab457c722fcdc68edcf0a27146d35d8aaf11918697a6e8eeb89bc701eaa7148f25731f854196dfb60f037efd2f55450be3e938782025e23f8fd8f66f0168503dd407626ce9e06b5a0ea19d57217e6b15a354e7756966ba2862f6b7f98409fea8338cf5978d3d11d158559e4dd1b1381e5a0eff0cf7dbd94fce5f9c4fe70e8864c06e49a3afff3bb28889f21f949024ac74521fad4017b81c4e8e13c0aee875ea1745cf0fc6b97173fbd9296afe8dc9367ec8a9e4e68cdef4500caefa501a5fbe848df64a660e3bac4eadb4ae842c8e52f5fd2e323fbdc68e7f45ce6b5f36ae38b4b17fd2024ff2b1dd822458a9defc78665a2d23c02d073128e4028230afda0f045a9c352ff14f2b44f0e907e4279c1d4c5a27181c5d1992e941ebdd88f87ba81fe40be253b4a98ef174732ad798d5b824879cada8b0560a3cf9daebbc92fb7a43d82f77f1fc8a438f77633fe8a531ef6b6cfe5309e9753da076602b3021e21c3cc17754af2b79ef6b8439c58bcf49199d74ec86944adf7390421c1aa807b7f4571a8406cfd3e0e90225574a558983dd3729c7d6fc670d6298d75f4878d6f5a92f5dd61cf88867d70fd55c3cca666a80d51610c286c0777136c0aa2326f2239121f5ddf59dab773fd11ea91b5ee875cad3a467b7e7d9a625d6789d3926ebba42db9d1c2f43df8769f26bde7487823e11df6f2d45843532071479a8f91d463234b89e01387f77110be0375cc6d8b61bdc34d0f1f9d045838b5d3e4df16e7413fd45933d9f9514bc8c271bb490c71697a090642623709d13293d510ca0af17e7f30ef711c3493ae26143837650d70649f56eb35a70d9ae7977213c5595338416cc71343e41f05c1b31a20902858d17ab511c290f507fec1edb957ac93da05b38c018f513aa2efadf63df16f9ad5dcd243a454fa550d7f89bfd2676d80879ffb6a472a4225a5989978e5727bc46dd895d176691ccd07636492240baf284350438bffabbfae1049aebf7b6c5dad060feae8efc99e68ddf37cf0170d1a94f45eb07993db6fdccb4a145565a7bc5d89c7fa0f773b272b7877f960133457cb83126cbb6982fbb7bfe3f2c20deb41dddf49ecce76885f20be37036b80470ed5d9b49fd9eb680a47d25c708cd9009434eedde9ad5478f04e987ac097c60fe6bbdc8c705b7f544595edfcb83d33ad5c6aa0ca193579d37fbdee8a5b6f4d54888476e108ca8f0f53a8f90cef5c82bb4188dc5aa3ed4e61b776a9adfa787edd9c388efd8fae8262de88dcd440722ef3ed9589d3b05d39ea3d80af2cc63cbf74c9e00c262c8dc0128b3e809cd1069f1a0599917e670ea335bce3ea4fe64279dfb782d7a507f1b1ea04d1cbaccaa03cfb349ddba3f187f50bdaa8415d821215e70f29d9c24961bdb1f149a74b54c96f5d20a74f8a755095343fd69ba0c435f95479daf9c41a664c2ef9affbc39707a00771c2d57a1cf2ed789475e25ed2328fee9c9f1ff5a187c62ac50aaf5abae535c2d0f355bd0ef4639f818efde0d4913e7d217f339b074c936dfd62aa59e5e89756e544b79972de6170ad27d46ef3db6dc8af831eff733d1bbf48bfd608429a2e8b57bce35770394eb4c14b4f4f56978698efb1c6690ee3c6e84e2a1aaef6826229ce63c23e328c923364ff56cd274df0b58913142000c5fdafb8aa5e942c289cf7f4423a98dd5f95b53f4dd12e8b8513e724b1f06e706b26de2e488a030a1542be6e6034ab9c3bbe02fa3ca8bbacc857f668914399865eab3b570b8741b8d0be46e7c699c195a677e13cd4c3bcb29d24a9ffbdf3ea6c25f28fdcfb3b965fe17657057a4f20f02a281cad1e0a79c58de2c98e3deaa9474865a164208f4c27d1d4b970864010d64f3779f62166390b1ff91ec0170e1e42506a3b98836baa37273e33d1f152db6f9c0dc1bfe6bd46afdbd1703a55499182c46b23202bb8f7b86b1e8fd0c46fc8e29912bbaf73f9e6d749d287a7ff8249322ccf22a3205c7cd126db9314067e1e58ceae316fd20062acf2652bad1ba18f7811fe00ca6b4181abdfdd0846bf6726f8c44ae9a70bbc02555df023f4b38dab7cf960853c134d4d6d1e8cb50df81228eb024cadfe24130dfa12dd3825ce30e5676f5d79a1206a2a406b506412b8676b58101e431c27efcdc59a9232e875718461f85da3a39b7f5e4c4f91dbfd074e3968772673aa1b3788dc7c79d9e4af38d2911ec8cce88b7432b851b7e375edafd842bece075009d3876740f8f4c2846d15206806bc18f831eeadfa2a4422737291106d7dc5b5f8aa128f6f794d29fcf996365e7f3bdcea9dda52d052c6ada07facf70d9a7782f0a6707b9063aac220c29df9899b11dc6aa23ed05d9831be7dbe7121258fe35efaaeeb552b1ed435f7b1729470c305bf7f27614e29624cfc101728b63dc3d2f21cabc942c812932989ae5c2d9c5de12d32158cf5ba19e010637318dddd9e0be66083536cf0a7ae47dfa2a4ed93d36bd08a5207ed9a26b5a17eb88abf8e8858e1ce1fd1fb2a45ef36007393fbdf8b6c4d8fc71a5d51ef935867d0c684d7e97f8b6d678b17ff541c9ef40b6f8007efab4f495c0d6d65de42dd28a114534129498d4543c8e6f63cfe29c45080a39465f27cc1fa2747605a89d7c915bc5453b07e8f5e9cd29397655d7d772c108d0d57077cfe87b110caca32ef501305b195e7e638c158ef446a37014215866565fa2cb3f808ecf3f3299803ccc782398f8f34483175616822f81bb121a745c854e44cbe98e8123516072bc517354c9e19ca006e21829d8554c87737c134538182521ff003a5e0bfa1ebeb3f77a3587c74cdb41eb1f1f68d0262b459ccc497d816cc0d11e2473dd8bd5e403b95188e1dcb20b62189c953ca564f3be0e760f91538da7ee8dcd713ca92e7927f189cd6c8444c703f50129b8276167393bc0e617f1205da3e9a5b49db470e49d5a93718c407d8483fafd4b8fe8a3fc33cf3d8b75fc9d489dbc3dec754045bcd03f0f23c5a3d4ca8eb4d189186bb5395a134c6e3fd88d0f3870065757df35787d194d42ad20e31f709d3e50e6130d9508c26dfcea1757f800af9fa3b9d3989dd093ee6cb74a10d9d62e84417d913595bc3712b5e93b86b992b55a401fd01793871952f05871f6b02be353c9434895b200ebeb27c1a7a1ca4b3bd6cafe671b001d342b7c155afd08ee561d56dbbbc680637b57d1180e3190b6bd8582d9eb1b59ef5ec86e8247ac6a99e15178bb6d4077504fd93030b1aea34184f73636dea10799f3ca5603da8d4bbb2f90bd46df8c1d53f3ffc3c0448178985c9c2399d444af89bd91b13e860832ceab4b83127511d8fae22c1a2b394287079ef4f9875e6ea85b06df0e76dca59640cef278a2e07a3091a4fe91f5f27a653bb6921663cf97887a59d2cc6130fe0cbe0515ec8c841dbac4a6d7c9a5128199914de408d3ba47d664313d8972357a0c9308367d13e274ee0082583fad2c007aa4cf6b5f3ba1080895277fc42e5c920c7c22c4a8fd8e3830e1a1f04292817faee2b5a87820064095a9a709eaea18ee82b5ff50de9dd9a029c49020a0e9b5479cd79b2be2057c9a040e2a7c8c59fcd805fcf86bac6977754f45d769a9175a00daffda563b70567cea3f4c4816e26af71c9da8658104c9f007c1e25be9afc223cfc80dc7c2e53651aeb966ed291805c41d3489ef0ae453d8e9e54b47d117a03911ccaff146d89ec0d81914dc117f3fb7be4e0758988ca7787c1c6cee0de356a9177a3b5305cef232dcbac0a59e6c8b5a4636bb42b862275724c3d19edea7680c675d3a6dae3cd330532b14d9fe747b146bab202de909760d7a9813dae1b846cb77f217b19ea6a431a1f66bd9d02b718e8507a08ab8e6f603e3f5ae32b5aa957ecfb56dcf6590f7cf6f895035a206211138d8e6d9968f39c307690b36b902b69ee533a7077180406202604c7de278ec54ed9b5dab1066b3d34b6ea5476a353c944ed95e0a70f910820127cb03201845b219cb6f7fa501f6ad367316f547d69a076332fd38b27feaa7f23c4665d948cfc143e5a6b7c2f564c94f12dab0e04b5150d8bd0f22d469216c4c0a69267caedd0b02769df3f895a0bffbda6b1aa227e51905f3fe5945596717753e8dc5989f1fe7cc0abfa4c4871ce9c31642833be0e7c87164553c83d52e6204353eb3abbdeaf016fe765aa52e4bdf4b62eb9aebfabbd7a18aae5d2e40e9a48f8af681247fd0ac59de7c76191fb028eb5ce0c250f9e3cf2cd3642b93412b876dac4fae915963852b371c97aebfdc2f2940ac89f952f22779db0128514a5663351594ac80df16030174e13fc4a3428a9bdab952539a5978ff0e2ff3e6b11cc06c538ffb61755abe533464cef95e6593a96791dbee34ac2c42e92afed239c14779e27c2bc1b0c41fb6e201c5bb45c802d893b05727b64cc9dbf89ca9a238f630e44ef3be1015c49fa2fa62d498edec30bfcbbf849e93cdca20b8ff94b5332e4541f58112db18eeb68e09e24c00db34a5b59bf9c4c151a1b5c7b6ce40a9bccbcd09729eda813e951cfe8d1acc918253ea507109982e845b15275e732dee3a7160b152c765b10b7a0b6af076b6b977ac7726e7698f44807c50c62c98bd01309188bff27554d8e3e03a69d0709ae73fb0c48f6b841a81ea67f13abda99e6133beadabfe3318676c8a0261a9b2f9a92f036b207a03ba8536b08eeb6e2012acb85b580bb28b30fb19b9fbe8e898538dda16c3509f42ffccd9e8825eda96ea4242ea1035dbd83ef26ff29f6619ab28f3c55d75b647dc4aa76872641b7f6865b0480d5ed0c6c482ebc3e6657fb965fa798569fab8003a3bc356e0bc97b93f15755c17ac52ffbaad55d9f7d68c4453389d7eaebadc64e7339f19a5f45a34658a0fd3ab714303353ebf06996b1256fd73ce35ae3ea9c25dd2a9454493e96d8633fe633b56176dce8785ce5dbbb84dbf2c8a2eeb1e96b51899605e4f13bbc11b93bf6f39b3469be14858b5b720d4a522d36feed7a329c9b1e852c9280c47db8039c17c4921571a07d1864128330e09c308ddea1694e95c84500f1a61e614197e86a30ecc28df64ccb3ccf5437aaac81a2d52950a3c4c0a3a50d3c67f29b707411ae28b452236088a7f6b467b50518c92b17c943531c84f3e7b7f51e25f972182570e9646b60171db950fb9426c88b3b745aa5c29fdf487fb2030413de04af4bcdb65a4434cb83d3a8518d23b27c6da025a6a514af947610affb518e464290d4b18a639cd6ec0d711c01505c80a825c0e603b183acc3756e85a6c5d7853d7b7d78f3ecb3784b1bc1bf692d87b9d41d635d7ab155bef5ad61dd0c4635c27dd90ccbfaddd24371178936900ceb8489bc5135128dd30cb086b15f36bdf22688134a51a51e415fe567922c7fd6d10a4d6a5114d42d45bf7f6825b22b1354d8e88fffb3fe9848f32f75a4473c718173ab8f2da3c67af3fee7bb877ff32ea40025b7f3980d312f27d8a7872fd1c743e62893ab89f25a24f272e79d6d97f829c8c5f2eda9d9d23d246767028d45bf5f8b4edf946e60b622c3a75430251e582d5652a7b78e6a64bb12641cde09a1401c8ba4d9affc177733980e6a074e9035f6d2544017eec8cdf119572de34aec34c40eb2eac6d91f83a0993092ec91f679cd655124d671fcf7275fc904d9f92e829d3b017a9fad80c4b1f09432a596570bfa37d3bbbcc00dc8a50f420888bd7012f03b18f204214221adc2c3b4fb04bbd3c56f616d9083032ab24f48a1b83fb9cc04367fb8bbdc6e81de3a437eb6842ab9763584a21c61e60498476537302711982353bf368c870cce8a7d9efa9ebdada554b3c2c22603bf3d9d212032b91c805e93ba5fd341ca22effab65b8e7a584b7fa80ea635771195bf0a0201fb1bc60f069d94e7f6a04cbacc760b03a414fc0d2fba71b563d7327171271491f81ecec5788909e00973b6db4d45a41da33252f99dd20279b50d0e5a3b3b7f579289dcab9c9f40d17380af8e5ab1aa31f39d011ab238e97991e34e5805906bdc312697c75a2762429c90e0dadb0045c8fc1db27554334f3d601f9a73b76cffa63ebba8239b6896bbec6af1c7b87b9c69257a0d146c0d5c4e8b8a99b43a18633f1f11b6c745ab05c5cbd8895dd96ad89cd87bb9fee30c373378ecf42274dcc02f3ef06ab94238d6e7a1a050a5261520e97de95f3b9f790974910d53c64eff3efc02206c03785732aad68bf0a688c39dd97a8ca6d48a9cf99a3db45ca6b0cb0430d26863add1504195d2610e68e5be77f3382c37d08bbc302ce3abbacc83863b521891f8bd346a2a30fdea55f4274cd5bf1f91b9378922d5b2edb81340ad790aeb3b64d23d88ee1603c0ed6a5134b6dfc69882d5116e1711b4c2a4100818ec9a82a3a69a34b7242c978134f887f644bf8f09c9336721e10cbbca36582eaa26129fb822f7aba8549573a985a59f533d9aa3db2c7a408ac8ed4e6d3894ba4d719bcbe19f92a943c6781fa1a919a035eb9b88777453a59116ddf613706bb2e8135d8c89e4123670c2fe24d068fd928394e7c84369659d1e11033a24a8862063557f6d15ba205a178f4f099d89f97e2581a9eba9d25930190388a208a68c0ba67f2af3eee9641e2076925672d6b46b02fa07771078d6666a3293b62733267c98d985a87c39858973bff094b615d761044629f6e0248548f9e74dffea16fc7a23abb91327722ca4f9b2904ad00f096812af38ef809c0dddae69dd04b719b50d2e3cedbc585b007698969b002a8cf389147b5ceb5aa8182e72026c4df702f93da2d54a2c75bdaa0739b5383e2b543dcbf3f3bc71d5124b412bf82263139a721365bef8eae860d15fc555908d3b2e8e37955f810959a15020c39426cd71a9c696603f1e7e170c1e8722bfca74c2e38ed3e307d23b4e1ccfd3201ea1137bf79dcf7ba0e4716c8938863a3b0f7c283ce6a9c532d8901d4c6f602cdebabe984ba0c49f28734a4d9ec964f310872bd6fe3ec1242abb8f2cf9d9d1cd1b9a552f6e767fb220f391241576293788590c32f43d21e635a2c1e4eab52eed1f6860aa29c8089dd08ccf58b4e9deede9aea4a5e58cd3f59cb5acade9aa7d73304d6870423e654980648a5144ca8bfd7cad7d9898d3df37a71edaf0bc60c8479771f4e9817fa09d78a64d778cc0364e897f1e71d6b94b969d02d3132c8016519cfb8c7db034c180ff789d325674e9ca584b0f9a67e621f9c88c1d8001b270798614b8949504cedc5f0204ea688eab58303ad979130369476ee1429d039ddda79fe30196fa98d198de6d09078bb585e05b740378a2b8296ad82ccad4faea65c32d91eeeba597d19cc5e135f187917d4b1f2015fddbac6b494e933b8cad4010b5794508fb5eaad7d05c850e1024cb9e7fc5669772878836cc173e1f2ce548e765cb28d52fef79ea1cea821ecd2a0bed65946f123e6ef393db7d56fd1e6aaaf1bb6b62dfed1fab1268b900ed8e60f874e5d6630ec95896885ec6035ec9040d36a0a01aae9eb5e9579c0f2601bc8f3b3ae8d16a117b0d18203d3b6cc9957b19bffab378c8ab7adac2a0351ce4c07f7c4754cfaaa5bc5423606024bac6ea967793b3eca5b77a36275a5c730b1e00f862a413164e51f4f75c52b0c914dd301ecfbab193c90375b07728b8101b35e6c295580bee7c9e8bbc6dfd1371a397cfdcc83ddef00b3203b273329d5673b3d9a4be6b26a15c12e96cfe6972668f7b2f950b23204b94ce8b02c382f18b3c20406885e64a76183776cfb69fb6eeff12b914407461eb8c5f77690e209ef89d0285d491d061b4d5959bac3ea6c5521be2d3200e3988191a6b2eaffc128ae5bfe30fb18b3152a4beb2becc3d8689da0d75e6801d797d1d667c189c36629f99c94a46c61a11058ef81849f85c48e9cdfa535bfd163c283f99199df86418c35ee4c092dde77962baae4fa2f643f3cc750d02985fa18a71c7dbcb258a2e3ae07a38cc5bbc9970516f06dd338e998f1c186b0c076e656c40fc5318181b3ad2dd36ecf6092cd9ffbaf6284c628a0725c0ff3ff90ff10be97d272a8bde7333e7a2da29c604f54f2d85973d2499b134bba072af4f17b23a0a109087a9df5abf8217ae16c5b5dfa2029a9a6deb3fcac95ca4b8e39889779bd6e17f93fc849886aa24fadc7a82b27b86e147df2bbb9e6d0db41b045bcc09d655d83c760b33f43167b105a26dd43581c243e6bc6b77f5c9d8b8e13a214830928fde0e575e553868c1a618912714315dbda6be2b34da9684c4 MD = 1b1979f92d62c71c5756924a1778ef10514450677754acd36cd0a9d71d9ae400f556e03f5dd8337a24e8e6d129c7c919 Len = 84976 Msg = 9d251427fc3c6f7050f75c8c8ec5a0ffbedca25eaf22c556e94ef4efe34a7f1276dc254a928672c730ab4ba887f2c77a83f040fb7301aa240276246768f6cd36e11ed9c45e6be40f7b5a851eb2cd2787ceb11435a2ded368fa3eb4fdd232a9f0c631571fcab36d511b4d3576761d693187684793a482e72abbeecd3a89c7bb4a0d5ec8e23d25b694f7cc81393aa9347d965d009ee1b58f702cce96a5f57daa4b9fed54961f8a67e0f71e91ee683a3175e3d868dcc23e7344352638c67f1b1efb622622c2d7aa283d038d8e1d679807205721a7d7ade73aadbe3dda258d6bc1633f515beecf4d9fb4035fa04f9f8b5f86d87fe4170b768db4af5ca54b8933388a1eb526a36e3b774cdfddee0a78dbe1b04f3c482245b4135ff0cbc1bfd93c2e79e89bac671c3b560e7f4fa1d95a4f34a5a59efa82c16975b86ad25509e74e4936834b15c54117e500ccfde041adb1016dc0ee22bfe95d5ac703b989b2193131cbd90d88424595cb2cac2ed4ccd9c7ef118a73ea5f24576b93a4c78641d9ac8f3fd1292d68917eb09a082ca501465aa798ea7778ecd92150243645743e8e880b9b52e62dbe8b993e51c93d7a685c31d00ac740f4ee7281b0829f7b7b319f8d4ce6468eb0cc9cb01b59d5aa7b8a841613700b1787eb564033b6c9b1c1a37683fb289467dd1b2c89efba16bbd2ee24cf18d19d44596ded2682c79a2f711c7a32bf6a24badd32a4ee637c73b7a41da6258635650f91fb9ffa45bdfc3cb122136241b3deced8996aa51ea8d3e81c9d70e006a44bc0571ed48623a0d622a93fa9da290baaedf5d9e876c94620945ff8ecc83f27379ed55cf490c5790f2783faa4631e7a705d5c79852b0c5c410498b580a4dac511f2304067e1d34f919464db6dc5c80918673601a88a8ef41e80ed5d963e7e87c104934f9541f42b43b1766b6ac8d0bf8a53abfabb5df8159f4f8677955cd4732f1c2413e777d0140dc5e1310433dea5ae69e2eb256af1c8acbb8c8be5c7839444820b13c34d1012d71acdb6a3d099c16cf1045c4e7a22142d0a2722ee4734efe67d71d792895c2d89f66180b065aa1dad3238d59e5433010a857ec317a48f8efe577ee8bdf45b6e0ca2c51991bbb8c15775a7df7dc2cb972b74baf6caa53b78755659cdaa56b6dc46662209b09a6cb354027801538a92df781f02436f13e1b531c32b0ec37715802089a0d674ca6efd8a21d4c4887532e0dacd7f336cb6284e1ce61b346f1e1e608255660a441265a7e31ae3af844b50a237c8594d2a56b94a1d0652c615157c8655109d2c8a3bfab74634cc4aafd4972e7956b71911bb3bb11b6cf74c1f22d5fa7f036cc5ad0ed4379ab8b81d72d7ac8b86c0c1208aac578b0061334ef40ed2c2ea76fc5c15509c2ec9eeceb1331e3ac1484ea1e9fbf3b5e1b32b2e55fca01ae87cb074792accf9a5ba1e378d5b6fe7d9a5477cfdcd56fcba1c120fe89fa256741ffbfda5534994a355901a3953935bda87f57de2699ed51f2360ff9045da2d6cba9dbf66fb8e1430828ca03e82523fccd59ec9223593e717b05b25d4561248da35dfe147876422542959f1234f733bb8778b8b459bfcdbaaab4daa3c3a104ec578098ccd609366183240347024c0f6a55404e9d102a258e0fc7cb550599de8366a63e782eee38783858992ae68ff199b56500b50d24e07c28b316f991c80be34f5351bed991c2e9e0b7c326482f94ba264b91a4972c68f5740b3ff9ee98377c700c64f96ca050270aa603d1adc7635c366853e454cd29aa8044c8ee7296cbbf7745fac06e767ac014b7fda58dd3e7f0545fd9ecbc73ccdbbbd4244fd450434cd37485ac45a0ad359d71f32a7ed18d071e76963634bcbd29a55de4867a313885032c9805889b6208134896c8e74cdd00d3511b4954046514db268c3adad615f894d2a464bde333a804c05b196da2628e3173cbaea0f76f1dabe28dc58cab5627e71b2d524bf48cb5e05da294588e880fb76349de91e235b4b5f65bcef61d8383984aa556b96bf78234952fb26e4de7f5b383f841bd61437a87f698afadc938ac26f5aeea9ca5eebd8ffb350be57cfce0d47a697069f132cf7057a6f02a2ac001f1b0ac664c3eecc850f464f974a82151989b10034e2e6e242d9e1938e1beb415a6f020827e936c2306053213823c0fb85e8a7e42d05560290e3e61d26af1af67b5289da77a40076e3dc22ed294c51285b4bd26e77722b34ea0bd03652c6ffc688aee964de5c1290a56afadcf32bfd45a39978c39c8f2d1f5739e9059bc8645a8b6a68cfe37935b77ff225161d2a8cfa63bce20e24c6246cdf5577b3881d0f598b6e4f430f633193775de9c22fafc5eea59b5875957ed7c28a47c367a22dc86c91a2e6e7e882cecd98918f08b12471ca701e2120791e0fca61f7154a6f61593ba4ee74e4f83fd40de7775e112cf05835cd2d87385710942c6b4db584791f896dcc3a4362c7000afa6ef7a005287b42d8c2b0d0e5b8bb2e8fb032ea3c48d01fab116e9988db2e393d34fa9b0c2b2df75a5a8f454e2387a59b398cfd9a62dde49c7c72bf7ebe32297e4166994cbf6e3e659ab22e9c20dcc0f90d4536c751aca0e9142efd6df872a2649e25e0f06ba6e19e8c02d3f6372248513443ddeb9da71a39e28a9a7d0f586c97521db81eb83da6af37657b85f1c1064ab7703a2dcc351c35ec6fe0d58d4b4ec065386bfe2c9b5640a3c47071d521bf8d9db295b668bd6c853cc3159efab21287e05c40ba5128b9f8d908f8e16cab3ec2eef335aef9a9d3d0da7082ffdcf77e93ca737e77af4d9680e0175cfd3cc54a90b31a633c056019becc5c6f21bd815b8d2b646e60cc70b67fc0dbe4efcfd8aa9ff30f6788164a06f81c71232b24b8701c0b17589a32fbe29e823bd7dcad4d2798b6ba89bbb3cf6226d295e8469a0487e9737484506954e0852d1e7fef5c8a8923040311fd6557f4f0f4b2049aa6cd669b6a6339a8f7e578dbc96e224d66f998e7e6d24675b24a85fc8cafc04ed07bd6dbf9ccc0ca661474495f12092153011b8d630f714c2510ddf5a174648ba0769f51279761df3e4b9b76f5f27c91a909dcbc84a2daa94311c4813ce938789f2789a4fcac640f05f1b40b96f6c2c5f27ba11d5073c9b596b6024864f6843e54f45c7d80f31181456d88af470625e6b5be3358cf6a8698a5655ef321838f044746df83bc55b05e8529df0b120aeb1c7b3a5a1409705879f887a22a7b78a2f30186db5fb7b888cd4e8c80c6feea5d8ecb57ddf9076b8980188594947bbd0533091a19b87906e2f727fe3589138ec3652d7d86b0d0455fd78cc5fdda283a00ebe76c5e370b25060498e7c4fc5ade65c829141be16ce423a3dcb1a4a48bd8db4324e2758474ff3c1b29b0f6c6dac38ae048846534e4321c0f91b05399aa7ddd6447e62546bc7acc6463bf93909c237cd511352c4f3f1594403229d0618f124f76d8df3525ec80fd08cd7d6301a6e881ce0d9038dd8577d1614786e4a5428079a060356ecb0bf8192ff0522dc202f8e2f3c2fb5084be3f1c98582e570dc9ada30b664f98dd21c9660052a7bb7ab83de76dbadf3eecf355bd0dee89f1402e8315df72977b0637dd2da47de2d3d2ce9dd7647da5c8be2ca1fcea90ff7ae779e916430c74deec531bb543f96d3e724e02fcff91b3b7a26f0a2154c7f8b9a9b0c6f05fbd4e8a37806b48034caec4013f539c678073d23fc67b73751adc772fdd04e95c0c8e4890c3b52c0f000f2c28aa7800c4d24be33e38d93b7511137c20078a4a62829ade9f26e1aa8d9df6408e9658703d0da5b046cd0dc27c3405902537405b98a5db140bb0d80aa6a9cdc6dc0bdd33fabbe803008eff4db10c1b7be6740e632700b9b47c69809481aefb87b912ee9324637ca2148297273c20bb040ac6dcac37189d849c5ac2904733e84bceb173d6e38ec95529b2be9746f84ef53a35927cef77ed4e108a87451fc1fcdac2f255455ec337e6e7245ae4f71d3d141dca181c77a413d88301b5fc32df9ffb3edd7a28be8a2e1bf8e254577616ef2a5c8c56d4f82775eb9bc835fda7153978ea79cbc72a6b16be01f49538ec6bcbfe9e8435eb9a897d4e00e6f090a7eb32176dce3069cbef5795ad6004cf80a53b5a8cb89bab845191cb5b63cdfd5aeaf2a170e49258c99d5969a13088635b4ba504cd32715adf071b285448b38be799e1dd9ac4d7da4bfe8401886c0b3da4e573c50afaa041d233822e929c8c83778068959475e93879984127081a74a684fc0c65eb160fa8865e2ea5be673f2d3128ed8f05ffaeba7cf6f6a1c944abe42317d8ac1790a5d6220f87557fb2b4d13e18da94966b10a77c9d0d3874f1973fa8be3f6237704c15cfcff5057e84d3b7c5d8956cefc0f649a017ecb4b12a22013b79a94ef2bcebabb525e07f63e58427eff188dfb70647e611eafddd27f6337006d17e39f17e69e1fb99b089d5ddaf68e4ea19b59645edc7f7a1a67b7f5db3d62e4d26ebdcbdb0ffcab3cdec7c753cc3cb4bb2b53686cf3479c1515561678879de760a2c5a82a74d49fc9f7001b41380cc9dbaa93cd0d574bfd46534731d9ba23cd290c413d43613a1fb8fdc0ca31ce711679957532ce7d1f2624ae06086d49870eb217ab0bb4598f93803fa4448403fbf31b68721a1ed913af16721ceaa1ba5a3492617d93fbc257a3c649052ad65d201847b034e37cffdbe0b26bf6692590ffd720564356983024b8e1b67ddda74e6fde64f9283f6755da737ee81cf45741fa5f028266d40837796b78e478ed556c4dbe29afb68e7c8f91cfe2830b1cb561dc44bf52828cca2cc803d27f70da8f1b4c4fdc507a411ae1846e63a94b62de5518109d6310f16c94833aa4d41015b2ffde0c1367ee07d10044d798d7584720b0205b43208ca25e134d78567eb13f4f7e956b55628c331d703583f899bc3a2af7a77d370760002d0d89357dfbeea7d30be4f618dccf637e95e8fbf96ce1cc6b9ff00effa4359b3807c90a71c822ffdc4c5f24e44342097305d1b811dd536e510dac88f37377f42d768f6fd86ff897d9a466803e126ea579347240d8479bb079e53f63b8f1917b6bfe3ece185fca1049a89d808ce6bfb81f966d1ec358250344ab1b37c6ab3cc181f379adc81431e9aacd56be671cbfd1c4c004ba596b89f75fc3e26d830cb436fdeaa2975e29aa947b8744824340d9531735ebac011e250d19c4078d9492a27c3e685c13510caea14a6ac994a7efb6dc756c845c50dca0b511300d0071e981e1d1e1089a3749b88085ec683e1b65b2de6dd85143df23677fc47c657e915ddd0846e92aa4774d42c2cc909307046f67d96f0df50b027ef3cda21da340797c0e700be554ca9793f7d86cdbfc87f959403e0771c21a416bd03f3898390e90d0a0899f69f9552eca22421532e72960bfd6acb5a85aea326677450680a9318dd83dd58ffb9b0c933c6c80244a0573e10f8586081622034bfb736f8a4b7641b71f30e44bfebc396b8731233865b9ffe0c4e76a6d4fb9ee04973f2f327d22c7a2f2243651f7cf742e170a9bb03a8715f67c76ba53c97512d2c644f4ad7a312be81d823c407b67354188737a2a1cef5e8892bdf659f8061a5d152f6049e723f6ecedc566860df6054c47e61f04a175521db427cefe7fcf5d09e058e296386db127df7855a1040e5ca4c1ed1aee5c9b692c3d4e74afa543535fc44c0c20e280d32f8f158a001212b3f1a2f2fe45a2d43c4aaa8cb7ec2d04a5c54d834d586a0fd57a692764419ca593b95792298918b213ef987ce9425b75ccd0c8a916db536d408efa1884d4282984425c353d4712b7b88163998930d5392118e207f8f8232bace3be835c4639210e432d76a9fe454772b6b86d28361ea15af4062a845d5dbd630f22d26b06442e8a2247b0e02d24f3dae5e36246c09c50d2f8c1ab196967a51b67c3902192cda49066478e7032165f69959103557ec2ca11ad90e458bad5752e842d47208a5a25a9958969eadbadbca75c3ddae4bf466f9f68e070a2a03ba024faac51e83b6e244e2699cdb0585fce0c80465365108bd3e4e15cda87d7eeb89721dd6ad9547e12e6aff5445156a0f611d84707670107798a7d528c88c07310ed904cdc84341e841b7838485e4525b74f9aac616b0f5dd2e8b36e0125d87d6b90dc57316978a3fa4535bf5437a232942e6e02ebd199d372981a0bc2dfbe420b395ca9040980b2e80c6f16f26e0c7c1f36b8e7213b4f1cdb0127b86c26b085824f979eced4eacfdfd96acbad61d246bae111a58c288d9e6ecc42f0478b6d9c534c23c4ec6c256f3424df39dfc39246f9b5eeda96f9d3ecc052224fff8e541b109777a8072fbef59787230e1403dae14e3dc6f2cc4fc06c522b1c33ee9002762cea09a489a016077c68eca4e4930a9a4ae1308ab69ac1b1a6bfb728bf40d7221a9c6066fe6dd9295552829acc01aff65238a21ec06b5631309879aacc1160c36c27025bdfd966cfb4dc8b5c34c0397a06bc920b94220c8f724dda46af722dce942265ff98834d5f1d5f7d65b96f4599cad586fd8c5f43110e386f68d3e3aca8251701ced2ec0b7be153bf43b45f42da312c07411383985a46f09fadd4065be4816d7c45f9841f9ab361f772c020cfbfbc288992e43f8aefcf0ee1722a2aba084bae2bf186ebf83006028c7f67543abede43845f58d3893608dbeb4230f14587f641a76e057433d05bae04c6145a125c1a158df30bf011c176e003ba92da9cf7e3d054f7efbd30f016dce6e351b2e51bf2071d1a5805b316bbc3c137ca471ebcc6d2db3bc037ae13ea07a96399ef3182f8a0a821d794fbaa29ffaa4641d7495b01b1a0b60173d9b027c6d2a3677f7605806ac5a5f52e49f053ec3562940bbb6717052bd33de262596292e94f44d421383bddec135b223c8dcc21e9192b44d3458935f33fd013c6742ce453a3bc9dd17f8d6281f6541121e6f5294bd682233f9adacc9d3862787494d943b86d393cf56ff7a12dcb8a8bc870517ac42733173ebb8e5160795f910b401a297de835220b6e0d12560f68f26ece839ee887b8a17f4c064d036f41fde8ea421e1ac14aed921e202e814e79d5a365edfe2f848d426fb0f517ec76940f9c17f38a2574f51017e4e36e45e527b5f4bb03111f8a1b8a9e7ebd5a924bd046a33da106047f9e0a0b56c949fa701d13d15265802f150dea7a29d18d8b4b81538cefdd0a6e4dd06bfad8445a358ba46fc7b077c3d4c1bed28136c4193df21186b782fa1f996c2696450de7078d74682a5649dc44b6fcb8e3522a278630dc2b80c1bb9abe3c56fb19a85c23ea48e6d2e40ba2e59b3c42868d4b786e7cea6619b229ee315ebd9ad87663477d7b1e3f6f2d3640363fdb1f92410ba5fb35e12c769b5e9f5089a3a4493d24546622740ab75684a6409b2a00869ee1376079bbabccbcee437ab7650fc7ce5a177078c0c52600654987359f81be078ab13090c0407687377f12709849deaa72e52f06aafb45ab66ae9ca7a21fb30b5687de1395972eaaf8a6aa3db3cee8721d51e424891990c7f749d369d837002ad33feb8aa22c3f68705eb4872e1b8f85a7f2528af1ac91d695afdde4b8641fe69f5dcb6e8c5c33705d0bc3d58dcc3e85a12adc826b20b367c0451eb0b9238cbf09460027aac3a5230d325ab1593d7fd2a78ff4a35c128ffc15ae184660f1b124afad2c5e83df0f210f76eba2f70bcdfd19763d764afe91f3f45f4d2e365b37a800d7a26bbe2acbdae22de9130da3937575920973ce4133ffeabd4fd0afcc8ac99b79f4e7a02385b113dbe59a03918adc5a480b144c871060776c72c633c224f9dde8b64ad045a754131563905f41fe82262c94d04c3ca1d618c1687778e880c956c8491dc52dbb347e4ee5ae9751791767a4495053ee52b14d70937cd58c38b8848d3fd905382bc2a40cee4d323c74fcad439afce9f8bd9293de764ed039c737e5ac0cf506f1939f22c3efe4c66f9cb2558f0c3e85084cfa7a8fa3560f8d86d7f8a9230a50e66d1a88f85d0dba673ad8feeb0fad9b798b496ff88d3ad9e422094c093471698332d5353ec83084bfe9c107ec37b2b3e8f31ff2ada665c5ca135c4e4093d2b7546f4fb5fbb3f5bbd6240b1f06f6f654c30ede9103815f69cbc5318de3d396c0e67cfa89b3a2b5d656742792cfdfe104844915c9be90802c55c239696776462c9606663efb07095a9d54a711ab54fb39c93c460b23768083f494c48f5ffe5940ff860334367358bf273ff9fa3de8bd6afe52ffe3d685d90714b7736e11ce58a49f666217fa5a3c8a90a0a0dadc1d902e902793d25c50e23c52a4c6743178ccddd231f348bb3e2d3346212c321a762bdb2b24b265096a448a2ad72e3043801e4354734744fd91934fd43c0c7e8d64e9272bc4dbfa7234688709e92b20ac76d57b72a4ce9b45e71746a75bc23e897c40691e9261212b31d6a98c353dd3f0cf7afcd93109ca08c111ae5bfaddf0b31eca377017f277a90517680e45e6a8a4fc873de4b2794fca921aed5eb3c0138eeeff08dccff04c500093491cb5a64d2d7072b511b3bd9b1fecbb9a2bf10935714f57539114fb3dd4c6d2d333ff0d001eddd6090c9f174a6d335c2b304d29c4fec25bbe49a163ca8bca6e8cf07c8b8fed97298021df36cc2708751728129250abea849f72dfda51097dcedcbec8923b1e3ed5e0fe1e9c9ef1ceaee4600be356fd2a6a7d893acf8fc2736c591b6dc1a025377371fdb7a9414208622974738d4666f465ef194ca3d53b2ddf7872d68a4d97037ad9ad44fd418c48274ce20400ad7deb0f5a9f7ff7aff81f90b1718d6c91e835647e9951091e550066d51517ee0aa680df46786f5b9e7dcb18aa841cd91b9d4fb8e72e364d3620c3c9389a2995dc75385e495075101f30a2dfba16ef60592ab4f089e89f3a377404a71dedd3a8a17e73f4c9a43be5b0b5596e66c68f92c92507a3fd54d66080c33588cb9c8086d806e64b4de02e2cd170314d370f77d0f9f0aa3bb80f9650b092e8f6e802dac11eb2e1ba4c90b6562ff5dce4b15e22ab4a223f202055397b35679169e9dd2cd7b41708da5c328f01fababedd5c3f3a92584e1909ece24a508dc5c16a4767f14b5687ce13e341f2b0e043598fae2f0a26a2b8da51741333612811fb70975fe28c64a9a40f884b9bd36f042f841daa2bc89816e58f3c84af3da2e0920540016b3b6ce12d25a1bbe4f9f581c353214d1a08c6dced2bcca2f8467cc637a0d818e5a8ddb2bbeec61f6885225097655f645f67ad6f33bf9afab90c14175ecbc5f2fc7545b2f2d36bf2911563d52e333e9c5655ca626ba33de86bff177879fea02c1a213356446c19b1e91b38a3fa553561b9539c4af77f1c188bbfe54e1bb1ed20c92d0511332145e9eb172f317e43da30d2f1918d69bbbbf7929f0c2cb67e137d74095978318b77171199a5f24c77a3a64db058ae34e194020b4d0a88ccbba99ec5469effe21333a5f7033b8ac779181e74003021db794ac4602a5ed6d10316011755541ca750f23305e46e5f81c0ae260071e68ceffb36cb3bb777bb65ecef40f4b5f75303bd393ab8dd9ce50dd6ec395d75ba43c4dffe62f884e39afdc1abdad7f9273789c08f299a2f75bfbe2448e5059c49eafcaff838211330f9fb39c24b5b9f323eabf35a7c248a574435414aa5735603f719e3bab73fd2de5d00adc8feda08c6dcecde21cee25ed016e5b677f7212376dc9f03bc7ccf445a3880a63671fdd643a6bed97b8e5e1d6eac51ec3756b985211fee8883d53a0823210dbb815111883700a48dde36e25681790c6b3f40970b81459b0a977d1a6ec78b0a464ff8cf8f2f9f3053b055399ac70177abc641342715c226d26db0db18b5eaf8eed8f5725b8bb6e4d3a865ae4a9dea163682d52b586d3a14a88d3d16768cc57c0dd2c3c48dda0c34860cf4cae684778a83eb78e72fe601d6d55c6e3708aabee62bb3d01096a8f391d3846f0a1ef95e273c66b8e21e1eae0fe181c0c75f9e1bd9e102c6f0f666f19f54754106348ae28e989af1c69385b3026563c141ebe580c9a63604e03d92aabf71761729c7b7c92340eecfef20a9a560c9990c312e0f6237e3c41668ccba7374c2fd6dff58ee5677cdd8bfd655f8f9ada687fe1fa67a5497323377e5345ce051b17191f158bd3f1e87ff2e16a3f2243b54c71357d5c4cc7a1a1aa60ff4e875d8d5894faa6792d76a17b8b72a8b33b9bc7ccce8844c6d3e52f3d02d239efba86ca79ae384d61db3fcf59bd78c8c2c2e83870ffa2f6ad21eb4580a79da92f4fc9f902cea0b44ac49498a2efba71759f7330c06a4b3c1920210df10289f6162e6e427b5efc833cd2bc27dd8b014cd3ba84d645784bbe13b7cfac18795dc9ac40bdce6dc5126240ec01a292f81501e4fb625286916923a2ce3c4d7d75e3c9fa6bfdc5606baaf75cfaa9324a9ebe37b04b57cd0b1e6e14cf4eb116a95fe19f0798784fdab88eed9ae5fdfe8be5c4964090a96f5d852338a11d762f239d20f2dbb07492651485ea0293452fe035eec89bb4a15f03304d382024d3c17399686b7f993ab988e756969bedc9eccef60572c99d87c68585b7bb544b10f422b980b2fa3d12eacc99ca9b6ddbd05edf90d23fd335a3cb6cee286a467b74efb767326e5482434db792a99e8046a4ac9a6b1ad4c0623c973fd267edfd9a48dbba0a44479652170cd33abb4add148bff87efa8dc980e9c5186993deb8191d4dfb3097fe7c794d44ca8fac7448b2fce7f2f8543fd63200922caaa720cdb4960242bceabf3ef30c338bc389737927db5531993b2df2a80cc32916fcef912a934d2aac09016160d2cf59a5df1c9fbe887a4cd83be2bf5162da8664f195a2e989810b647f5f6451557aec7d29ea2cd578e99d4bb2f89caca73acceb21ad63800d306d9cba43b842f8b89ccfe666b10b1105bb5a5cda0b384e86853009a1637c82edd9ab4638ed94312ae324810cccce05611f8a75f19b72cd2017ca261c233d8f1bd816bfb974e3a3246811a666c0acba8e4262baf9bdeaa7aa2d1fe3781341864cd175634fdeafa34793fdb2ef4d25a4dfcc69883cf31e62871db7de4fb4370ce36e3ded568b56c606ef6f2310b2a758f806056a45db7c8249621872fd967c8791f6e6ba882b878fd4e2dc9375a1c04b4997dcddaec7939b53a2c85e1c3a908abb13e6673f0fa0755406dc70889afef056ea465ec247d1f248582ddc2600f18ad14dd35ff5d83ffae6d3d546b3feb1eca285d86a4afcd64ba9eadf99a59a4e0c76fd342146f5c4a51fd25d82924d97a4bee3098c83271eebcae353f31556d4840eaa6f479ce8cce8617adbb0ae180e9cfe9a60321586fa775dca0194ffd743962afe0b2f8231b7594e35e66d61ee954a040462f77c6d1752c5178eebbf9c09973e308e657161225c58abf3f55821aa4041c988492279f42283444263ef05952bcb1a7f75f4e78c85f3459af4fb61dbf44a5256b3921dff5b2ae8d29a08b484a853f444dd8745545ab08b21f8b62fa8fa802744a365c9b7612e7da5ea971946b16b567508a2fb284f12f54f5d22db7fb775c0e8a4f81daad9006b32f204a459bb63c99683d28966d79d1c79becbf5eeafbda79944d38a5827434a003cfc064c4aefc60fdb80709e88a149177a1c1f6467aa53fcff72803dd05982a437c79f7cd471c4777c47313dd6d233cf3b9db88f63de4e7a217fafca68c5bd855f01d099ec6c4d33e2914bd346b245075fbb41be28cc0fa77735698c551a433a2f3559f1f761e8ebaaf930ed5ca40536730f5b7f2af61ffb5d5e2e0229c9cc2924dc9c3389e4fff531d980fa8d29ecf302045640eedee7ec30349dba5b56a0d8ec5207cd18582ae723dcac696cd674b38934d2b1e8f90000bc5319137e3389cfc2402d3d274dd247dd5d23d8501c250e751b5130add6e0cf4e5430bbe702bf8453219ce23b388e8deae577c5eb7d865a5212425ba1fb12ae629265023a26da8d2b70a78ac8aac82fb9002890a37d012dacd4268169d80e2495b82684fc226340a7b80d65641717b3e437b6e70c9d3dfee1bb8e4079f04bd8641015c29177d25544521f2071ffe5a0e8e693377b5095549d42ea1736c644203a4493398eb9b011adf95d3a86d7ca7d23a75de094299fb53c04ba8444dc9fa294b02f58684a853c30f8581227412ebf40f46790dbaac5975a6b800608a5b6b6000d5abda2bcba0b79e99055b79e9acdbd5850b6a6369f8154f1db1b16b411f1189695c7c282c725d5478663dc72875ef54d99d0a86f95f9d8420c41d37a49ea2af681053c3f4501ff8cbacafa5f8cb9854eb36d46a8316730b6c408e38ab6e7d3a77cf49444bc3645439df985a81383e9c62deb05930a601aca72debb47f1908f240a245f25852952e6b08e22fea4349f5e79d86992896ad317a931cf44727ad9f6b9030174485184f082f746c5c752127227c3e73926ee1608c7b08402c1ed308a0a2f0f936e4567fb95a3659fe542efaba82c12f96b7040386ec99e05688e1f686df6ee057f8b7852693103df96ad93658b8f5155ef87ee00fefb61becec4131c54f9216cf48a42bf6e1ea62743f88a2a324c36d0fb9b6c0d08b473a17d35a8106fa45e2c55c8337d24dac0e9859a40744d0137ed483166a70c83585fec494aef1e96d8b61bdbd7261dd3e8a8d42962de2c4ce91d3dc05a898ae6644ca47577f2d23f35acdf2bba44c9b881e7a82c5dc2607daee344feb40f046c3bfa2e40bbd63b0c0972e83e4953a8f7311879f98dcb7a021dd206131fb1f97343eaf2418303a99bb8aaff99f0cd4c0e5adde2379f43f9a8aa6bf9c3da1cea9a208188ee7a05be5cb7a75db56d3c236c738a496cfee63fafc90388778faa485f36606abded56d9cdab1abb170b0abf902fb047e0190cdca61e4b4aa4acd4a3211a0a101669619c7cf757704556c37127c3e246579a32512a0eb5a8e1ce467b8e2fe101ae8ad076c910f015a6ccf0f881f492cd29eee12d8a1ea53ba5405a42050c77c7ecae0de960ac7723e1fa0db63d263454ed83b3d264c2cc6b65cf9a97142450cb376f8464a21e4f235d5a942ab7cd597608f504e0389f8dc0b9a881db39fbee94352bde992beb0a8c9f7b0ed6907e849902bf6ec784095bc407879a9ef517b3ab6c8f66c75c971bd81eb7e84a55ae1836614f5bf8b594c90dd5c96f42c3fc428923e6d7afc2b7059e51adbae655d0b6f6bb3157046bc657d6bb0a5a77251e1db611ee8b92dcaf5a27eec8e13b3f8ad32266e1ea7b15128ad71db6f69c96f197aaacf30d1128f47c3d3ca615c96130ef71faed70bd301dc487745bce33a81b52ef6b90d6bb362b0e26d1a1a31179677e4dfdc0945b4b2cb75055654bccc6ffd1ecc44462f162c7628d24582393c693021ed5e7cfd5c4d3b5da476fe9d88213973b4d8a5c445d3e2bc8cb4611d0f7581d7d19ef8dad4bb7528db0d842e7480b15436ddf0d348413cc623ce7f8598a0b22e1402458423e2c1fd3383ac169b72adeadbbbf003255ccc701dfaa317ded30a4d3df42aa451ac660433403ffe02e0745c2ada6dfde60ed9e004a2977ee9f7d25dd4db71e26700ae6763ac048db3b34fd3aca32f68933ead3e5f2d2160c1f25385621fe0e56cc5df4b4b30c56cb5d18677e77cfded32d48eb3b7030a666faed2ee6e27405668e542da743248421024616f65cea034cdb7c567938c1937fa119abf805d58dc63471f3c651c56b8cc9327e4ae02e1e46bd19a817b2f187c6a05f2212028f22066d3be99a654b776f20522fd487e86a515095429f757cddcc771213cd7f0d4c978716618c04433238a6498e3bdac5721d2473d89906902001a3c70372c1ec780a20961e13a5292679a97d2bd95f31efdaa739bc6cdce7d8f6b50273ba81893edeb83f51d9ce89bec2c8618b456baa1e4a576b70b37ee0732c0948e6fd14700b75bc76bf46f6d17574719b2f08a6ba97ccc36d97e5431679123f0ecfc3213d687fabe0b8d3949cf53f438e798b86dfe6d269c4947af0067539b4c8b0950e5dc04d14e1c1185e388863acb00d569286860bb904e8fcdc1cd203090b1bfb523dbd7e760e8a7d8a50d9821ba45ce2404affd94fb317e38de62a2eba5a746e8379ca744ddb578bcf62532b1edfeac71699aebb8c33b3b77bdee7ed371b5c57187e41df1abccacb83e97fcf34c7396d8bff3d32fd2b1ef12c8395ff1dd2264d97d7ee1f5b4756a55e62c9deec0ecb5e26e805c020edec191650aeb4bd1384da67f319a58def7da1954acbeaa2fb03016de0a2f386109da7dfe2acaec363da563f7c4f023139c258ef1df0630830830fd7758f3d9b279615efa62a5d9f27a97954c008d5d3aaa733c258c1e87a23cdd1da23451eee8777fbac178241bef3748c6e6ad160e3b6aebaa597dadb776945e01c564f17eed4b5c1bbb34eebb13bce37d2d93363efe24b660f3785cc9e557dc2e4ab17a91a83d1f085060acc148508e43897993f66a20fbe65d46d3c4d9cf7e2e97e3952f0195f10ae8c20533753c719f6228d53d69a5e3c5fdafb9b039426d8716c2e961e09af9a8eb24a21b82c9b6192069a51ce3fc96843d7ab696edf9d0c42d151f2e2d95606ac14c2a80563c82392b02ab9abe6e3bab8471747ddc3cd06a46a6de9fd0ce4dd8d202466bdbe00088ebbb8ebfe341fbc2395a986df0539503c83bcfbbb28de97b86109ee3f8fc558dc95ef6933abdfd52c6fecd6e108546171b9d998ab91a5bda463dd9f095d7acd02bb18d1fab2c6ae29225b989241b0c2ca794e514cebccc7d7850a09a9bba2bda7a7ef86a1fd469fb059604c5155d0eccd3e85b62dabd64ed86129aeaf0edfa321f8be27c7cff2324871b572bc993757e0960a27bc3634ab1d64b70e77db8426080a0f15eacf3bfe5807a5ac1290568cbb1c5636773f7a751d2c2c99a2a632bed0787cd1795f866c6587cb4911dfb103931df452fd0c0a256e0414e09e035dc601b07 MD = 9dbd0cc2c35ddf97c3940ed706ff7a2cee1169ff64661db7d1a805619422eff4bcd7b3df0703cb8fd3fd060822dff322 Len = 85768 Msg = 4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222856715bca2924c2f44fb62388467d7eb78a510a5571f9f43ddafc591f1b4350586641baebf645d67569621503e328f7f8718d8f2836477c82743b7b1b30675a4967527d08b661dd4098e0732da96b801097129e302eec137f589d3907b8769657c42400a50c113de248b1cc7a0bdd9dbc75b0c601ee405f710292314915e99b102726e44549cc8ee713769f5d7cf7a74867c87511d6ecc7040caaf263cb58df1eeadb966e120c26ab637f5a5c9f32334117ca59e48b69c0a4c147dafc6b1ce8b099d2a583d748bbcbc36c9c0bc525d832f046b30e7e1002dfeb19895757ce3e91be8c802b0c2ab4a4bdaeb2cf914afc9a7bce3ed421a7d411c4605c2923e5471ec369c4c842fa87e2bcb65d3c860a26e424b14bea0879dae6f7ecd1c641eaa8d4330ac1fffe50cbf23b23f9b705ebddac85a068b4b50e7dcbffef98d35456ca4e97d02616b0c5e74fc377f6e3b3888760190c23d899ee334d47191fc4bdb221da7c6a6fc0ecb27077e012f336f138ba8b4964fbaa3991a1c757d9b50f007546243b39ed6314beedf71b956d2551a4fd9ab13b5ece16813fd6cca217369f18bda85ebf4d91bb43b649d06fd3235725b72acb0fdba8a3456407f012a4c01c24eed3717b0ec162d97feca912b3d574637d980152e0be8246c4b77cabfc3ffa226031fded8f668de8815bf02e8da02bc6c78efe950c94161dc881bcce7c0aab89a8407e976e15af0981145003cf180fc81b6c0d46cdbde122e5d35b0aa2b4c2d32d8b5e09194348b4f5a2433306b172ffefabd8088290760eb348b1d10ec2b287668f16932f73ed634582444cb2e107d6caeac92af9b03739a74e7bc22ec8fd2ef9a852f60f2c0facf740cdb1623b30d513956b5e6191c72c3850f35e711c25324d737d8236d011fa814a69f173247083803838f378b9885efcfcb2f67440bd29d88d10d83504a6b48a2b839d8441695a674fac8a9d9c0d6a4bae553ab6eb177e31319758983e30936840b50613f66dd25f4850944ebdc8a6dae2348ba75fd6c7de2d8b93cee141ffa24678db80d80083cebeafa11a934cccf134fb69d4337d6f35bd580a57a25d61de89498e794ac3d74c1f24217fc0fc254512f475abea7e0cee8da73ca0d5d55263a5918f6be31a453de65895fcab79483d08ca1fbd094af95f0ad3ab59005c59d817fb6eb71596663aa0b79effd726be4f82d6c8760486ed0db177c6eec654d0a24cf19d0976aab2c8eacb8d17b896f0032dc51075509430810e0e1fb07c516f68d0ee9ac17ad9a35f00fee0d2e44c75ee45ff782992056c3f9d01366cb6d47e92307d088d96a5c0639fdc4a9fcea9c87787f080013d5d08cfdafb7b71fa409694e81746bc5e91827d23ee1afcfc515015404298aab6fd9e8844478f4eab4840076437d5dc371f721219aef268e1b5b56e2b6042649389861f658fb2716e3df3503169467bb4b217a90d993172135950d885d41dfd576367ebcb3eb578a7a43905dc2618f95c0bdbd86c277896f5becafb0c088ba3772dbc73c1dee8d2ec0d79aed0f8bdf3916f46f6b1e438462d488c3c1a87fc15874adc5df5eacd0eaffc4da19c5bb5f8f95ed1aa6b59f11e1ea90d123ddd1fb1ec3d7ff0d3dcf28a67d31d94aab98168087d145a14f3136d5e32c623d27247072a97ffe2f84fc9d4a84471de98acb0cf232c779c3b4a4fd240886fd794e21293d6cce48abf9dd38be5a2d305c2afb49cee0f83d74ab9e6eb7a1c32a3e196f2d6555eb67eb651a00ea470c9a0d53d1d6fdd78b191cfec79076f60e71f551b684d4acfee3558f5bfeb7950ce162cdf4ba665fa9952373c96b494e8d5b04bea03770b93142534147380b8a548fc55f0efdf0c27a3af2d3490719f3686fd428d34d23c3aa0e4c4186b8d0700d2b9dd3c4a88546258fefe5f26dcc2bc835cd57f7ced31491cea858c186ec8d5e3e52efc0c10c35d31d837369a44c3fd5365713b5c36af20f0bce4ea0a8492a704f4c7caa536cd5ab6a164359b47f77b6f9db23b533cfa64c4c28ebca28cd8e6be6f24129638f6fd600111f68a64f1a9407bf509e26ea786f191df7e80d6203768cae08e6fb5c4a7b67dacd3e81a37296e66d6218a4a3afa0fa1539a160efcfb9c7e7978922bbb0c325db15844d62c5e5204b21cdb6e2950978787a9e285b3b5d2206b7b9e194e7d6c47bc1e212765ca83dc35462638f70cf1aaf82866d908f8a2271301e3fcf38dbcc2197ffd9c67f08c33cc582b492891d69201902387513675191ca614455ebfac3376184a93a752d3c1e3ad3afd32819ec3407ba90f20f1d36ce4d2af80c485d3324e5188bba883e2fd07cfd5e3b95eb2b5313557defcad35991802064dd9729a350ec64862efe6325bc53a9c9b017bcaee6077c07548db243402cec8fb01f899c233d10a27e20c6a549867ff71bf7b4fe53a9d63709a0e27b451936816e29a3a505a2c3e793368c37dfdf26f0657efaa204c20c14f74b8a89060fa543fdfd9f465ee1255e5388e063e62447bc74f1b7225f19c5a604d6d3f6edd6e1dc47e3a60796c3df0ea75de8b2c61e8964329b1207ce78aaf61988e449603593543323e0711510990077ffccabe89595ef86c334d7b8a5620b1faae60ac9f663b4a804740b4390fa3aacb4b5d7b251126557b0441d856996eefc8400c28fdff80390cf8a5d890aabc62cc5cbbc8d19a9ce8fab6b5e9c8ceea59a5e5bf81ab9fb49d2cd4cf04d4854ace17a35e4e2b6023315fcd12467d6113adf801e34d24b138e5643e04bf8109cf2b21a1cd717f1c49bd1eb9df64d0fa8b4b53172fe1f5fe9db047c6ef7f32b2ba286efa71b9690970fabc0f85db6fe5a1c03bb7fdf69bb2437c4bf1f7aa561aac3473fff3ac55b25968bc209e00a6cd079b1646c5e18286dab7e531a5e7579c15edc534bbc0e1c1338593af907b221b2d3a6756204946e6c3e1a81882acd3d177a2d73b427d8990cfdfd70ef5a14e5a733cc3588574555c8f8809191671473551f22e662058a9bb6ee5fac1462998057a00aee07e194a52ae198cb5c9cb1e42255a3f67cdd8eeab91268368fa6a9b96b2248e6062ae72539024b7612510e58272598e92a384b4ebe72fe5589aead598bc16e67aeb8a79e9e627fdcda0f92970c96e908969d298f6d140a532a030b295e8665b726153dd900091d43dd5ca56878b17e9be59490746d027576992c2dee8d78131e97c90f9b08000ef443c3af94137d3fea42a5e8c767442507ffb17973bf9f61e6295a87af5e4e383733c918e48602153cd359994e02e0044d831b597f9d04375503520cdca9fb8554d5f8491d7948e6dbc0370bd2e7e0f9924ef134d9cfae7eb54e3905e99110dc9252d7a80a93589c0d32c8a71abd4beb1c87bb724afca51c4c3195dc9fc094243ad2ee9e727d391d1b5192d3f02d2ac43557027a9accf2fb63d5f0f8c6db8f47947cc6941cdff3534d441ff81adf846b23e64cb691e99c014162d1c1268d0a2ce879e6f0d15f8f24ea34f77f617a61c82e5b248df6f8ab1830ffc19f867b0bbb7ef1d61b59a8147a3c48a0ce8da7cac3a0df0f6793a4282776d447faaf509ddc9d0b1f7e7c608a3c89a9a44f660dc544bf9997ac2e921a165c0aeb3a6ab2c5778fef48800230f9521a7e8b69b3555d33d5b243c5906d89cd2ac935c77d4a8d749ac6d988b2bf6aa337f0db833e26977828519b1881db7e332838ae0ab0bffcbb07b85b0055b6e41927271e07cd297dfb009f280ec984ff329e80dd69cdb91a351eec554fb3bc709b344adb5c290516a5a7c471102f1217b1d3c84a4d9ae2f0c8268b4fdd947a1512a4819bea1a636a5c64e7ff847c2acb9910397e1fe1df855d69bcd112c097db64c0f6e51968eb82097e3058d3787625d09dfb0045685be2dd2da86456febcca7ad0ce4151da4465953ec80666eb9e2c3fc2355829f8fc0d2ebb768f111891eb3c1c3437fa39171be6ecd791a49d4ae8cec7100f31586a103a5b4fdbabd4bd4592eb4e507c4d0bade6d0847ff456216266f3b3acc7524ef3e7545bcf8cfbe9e0658744133fdec9227b31f85ac0ddcba1ed8f46b752ac50bc1ff0c1f31c55bcc59b363f09acb4f8828f595ba96ffbf1ad4de3f3b93a2f1775c975aacfc4a9dffb1e4167b8299641d6098ed4f569783b8f6c37e039e6a34c25cd2c3deceac1f98ad4f0e3aa1f4e4c25d1198bc5151c504e34d335bfc0d096d5135da3d1f863b37ba78adc67f7a2c077cf42a9a1ddaed9f28bfe1bd32f7d9e8c825003065458b5d57e597975175b46d4eb50561128f87d845b02bafe9b740c52044c86146867a6a040a3e35ee94185450d8db99e5fc0e50b8b2539c76c7b872f809b54829a5a2fe5d7b141aad31b26d11d3ffbcfe8cfb88f03b0c0b70b5bb72cdf8394d854f8f7ab2acbbcdf3fb3d08103af432d2ced9f19abeb7954dedc4550074d6f9ffd08a7fa21387c8794cf2c5ca725ba3f93e142af6b1d8a294ec5d9a4e1400c5efc53e6daa442a8293a38e16af1e8888d8675485c2b8f1bbbc4e01a2e55a6949dbba15d549b2f684e99b698b3ca42d49f6b6f5a25d38a5594a6f3b1f84cc52ee4a1b9b36fee48e67d1910f9401879c6feab981f144b545f3b5dc7450aace703bc1665913486d5473e2210ab18c5d68831afb840307b35623852247f6a5f523aac826b9fa9491eb6191c7c5743b7a13fc0de9764814b778614ecd107224b4efc3d4e9484d8206a59976f1da4cad82216349ffc3410a461f2569298843a5a2571f5e0a8e9c9f303583f83bb3bb40ea133135cb157e46c3acf86ae3f9fb8731dc05fa16f7583ab2fdc9ac01ec3094365bee87c7c76058d4b442ca78fffa67d801200f9b1d10e2e370d2e8f0de5d15eb7e0386726397ceddc7ad1e5504c0b62948e625135a472666312865651491547dfc08d84774750763499fcd04a30f009a25d0c0fc497b73afa14277eb296dde625886e3d3649890e9dc836d044515c5af1a6869d2652e691463a9b70f8752f23d05d64f92de6309f5d2f064d0857573dcb925961237c07558dad6993eb8d15e62a69f62122c74c10bdf7f4af5cebea9a76490cc582bd206d1894194e5387961779d4ac1bde94e5490548885e09b51b593bf2272f0dbf3bc12f18330bf70aba9e06c60e5029f404327d494bc2d75cf46262b532098a275f3919614031a0bf8a631966a528ca8fafb36d23c4438d897d9d33bbb6bac2a095bd2096c828164d0d4efadcf80c8b0ef1b41cfd7c4af5e3bdf3f62c3baa7dd0e4358adf5157215e4c48f0518f623219cf1dd300f93dd513bc4af2304741835f5489a065652889974d3744edf393885753d6da54c586f6c0828c70ed64e79bf6eda1aa508b0215a21a053fd7ab08557184c77920688b2093189fb88e19048f3db865f0c84c4d8f27bb9826383f28610e6ad9f88c68b61a33856d1239ee0025dbbcbeb9f42e72bdcd36da4437385a73d70ef29ec24f6eae4ad1dcc6176c43267901924ffcbbd7673d95b1e0fd1d08557477fbb4e7a41aa27d05d61b4f1a3559be90cbf8097be5571fe00741b17699cd8caddd8226f024bf7627425a09813f8853704ffd43f504541a1dc3b07ccc75a4c7b97e50a5baf3cddd4207cc6f27c779dfa908a6d1b19d25d656cd7586a504a2cfa2c8668c8aef94595b0fb6a69637f50b44dc3adb371693fc920dd8f68cad8e4970a20b04e880db937c4163d956f5c47f48b5038b10d96634da6b21f406db31e02cf389355d0e6c33ac851a2eed6baee2bd7a4707c34c662535cf97aa9df3543adda5264670010de0f4c322cde5ff7bdcac134f77d8d95a78ab21833ed85ebdff8b9f2b5faac187425ae3c4dfc61bf2171c676304d7e70cd444492dd83f8435d83ec9e0aa92b6a202e9ce488c1626dd381560cad649dd42e2092fdda15bcd836dff0b8c4cb04925c8a66af6fb5f8802ea9fe5ce14b625c54a01bbdbc0b3a27165d54d78708ce0da3b9ba0155528a829d3c3dfb5e6a4265db334d66e5ed069c568c977ed3cafe58704cf59efc1faf01c9b8834c8759d48d1c5ab66e0a3388c4820e27131d8a0bef5cb4a7bca685cc7a2ebf7cd4fe928f3eb296d5477b67571c23228238c6de7d5ec3715efef72d695826b1692926ace8f718782897cc00f82fb49a37648230d9034f0379ea606f0c385c2ef6bd81e15842c86f3ec36e88c25ba0b5c50ac219959949fb86f374c33b773988a416b30883be4cfc764ef5776c4c9205a9bff901397d5eca149e96d26da1497edfa91c6ac1a610a06dbed3454c6ee31a53d8a9703b1bf7ef916059152942f65228093090b8a6adeb9387aa8af93f2e64620955ff2111afec8bdd3df3d4e8eaa31b9b9202cf4c9f3e763dcdb0e939ce6442a6710681eae1316269b80716ef70f208f4a3397be44f298435bf4f92eb6daa7454ad1eb404366ec39a59c765e333bf9e9906cd552a483d4c2411cf8cc0669785884ca05dfa09e51de385ad2840ad8c4aed1f16d16b04da4c7d47a94d5563cbe4a5e243d638e644efd9ee20f4a438b87c856eae77432f90f3b5e3754b16cfa810520071b35d560ea7e1d5db417a8fe4c1e6780ccd3f02e1e04257ac1c8104cc970129a28bb3d392d49fef34a52ffd91a984bdaa29ab495d80b726c61820cda9f737c06eb5e8e981f4689cb586511c3fa1e4c22f43344d645388c34bf48274b0af6a572ed868f24c95e050e66b7a665f298b07d470568986d74bdfc6080284813e1d607b49c09863277bce3fdb086670deec0152578ea8359a54be9ce94d878c11c57edca06c465627af473a4b878705009c41215f4914010b47f2590eaff841c90704bb72e886a6250f6e5e3374528c5cf049ca0e124779a8aa1d82eec65132c236949017a1d3d39df0a624295b5397329c7d94ca76ccf000df9293000d1cefabe891132544a85ef1177124a3a904862ff57f4a4ae31f14927ce411f900c5c8d4a19c8d123d8ea8dcd871c828f9e009b3afa132d5f3a857dbf6a488303df67edad6199674f90161afa80a972faa70625c0f95f71205132a5bd1365e2c10f9423d1a9aa7b4037ae9e82abe0a3e47205087b9cfff75a3ca0c70812c0c632678d369c3923955d985d224c50ea9cb6c8a34d522a1b4776c478ee8aaf82b6beaefa2ef8582d3e107ac9ac40b7eee5d67188fb2cedddeadab1621f2a31d33bcdab8214cc50f0fcc1a49a4746271507ae355d1af32b6b67f0cb0564d0e2dadcc727ceef0067935ad6df79f846ea8789a4dccab38e2ded461fda0ac46408c02114ea86c77be63eddb8f30ec928466bf3222d76cce53b8c10cea51848cfecac921cbc51a427151b0fcfa800c1d484e9ce8ff10a70e09c6f4c67f5d8f6f7d6c7b84765d78feb3b4f7783c6f7e833eb2ba153f02da4679ac0825192f2d8c50d391afeacc18fafa1059d3d149d472bc556f4d6f28872627ba43af4440df621db2940a75bb7ad5b90630a635b97e5a55895507fbfc3e1b98845fdb8d3d156f486bfb3ac3860f0d84e91455f6390cb8aee0e3bb81e85f95409cb520506e802245725fa730c65600c23b8d697f42effc0cde93fe9d976c31b465ec243a6f7029b96809d669e6d05e059004675d6198b313d4fe478b63f46f78624d4da7ba95c3f8bfb25ebb821e83c37901c5fd0fa76c38868b1ce7e888bce134810324da31afa7ebb196c202910090491e0bfac79c960f55b2e53f8f8988a33f0feb3e49044b3b6eb01509f2c852d092a1bfc303d8befcb51e36fee3877112f4527c60816e0527cb166fffdd350928e84547e25efc4585371598b26f0304d4f6e12d180ddf8be1835cee102c5781edac613ad52367d83d5e4170d6ac7c924da93473e158e93e1d2a0c45e76aa05bb3719e0f181bbbd5898d1a55f80654c801ade4f738fd1baa2f11acdde202c0050eba544b278268cbfe6618ce73073c0485575b1dab64d74e9bfca73c9c9f170c53f91c658001ef2a005bb530f44992e64d480f5d951abc99e82d93d8739a15d027b06ef4be14bf8e33e09823e827e9dbbdf28a4da2a92c1aa836fb38038e5cfeee72b45f3e356a570d970a2dbb4cb1537bd94454407ab65f30ab25e1c8e65cf73cb2952b9cee7022f1e1a3a50a0279fbfb8ee607fb19ebc625fcdc5c402c864786e279e0369a51508552fd2040f3b413c165b7df3f012cedfc9e671de5eb697e6194eaf3a7d39e8e4c5d6f25fc8af0594200525088bb0a4539126e8d468d96fa314c60fc7d24a83a9b73823c9952af3b01e14df264c1f45a400b4b40ce9d6f498a7b646103081ec41737decaa3c54127858b034b5f907b9bc5cb95cf0a8582ead1a46da7f5f862d9241ccd66a86d66ad415ffab1d5b120981ed5c69e66f0526cbb4a0557b26004e86694d68713b5803ad9f2cccc63ae63cddfdc662580485e3d8bee93f6b4f985504322a2a282381e6e93c5d1f185e2b5ab7d21ecfad30816dbd804c1eb9a0f54cf3e688a4f505fa1a7235bb2d7c8e8a6cf6b58d394dbba1cd6342ef7ccce2c03a3dcb925f41ab6aa72ed26d7d5894aa7984ee3b27a06d8c0ab14cfae00cdca028c9296de275db7a96075a9b971536358948c54f210e0eeb2c8ee596d3e1583e1d7f4a44b5f75ed2eee4176f041c3dd0a52a82f1afff65653ce457ebdcb31c412147753d6131fc19b7ac4f0f4bd47025d3126c4b5adb3ba3409ae82083eaf2523c09f1806d897cf8f9494ba3f4a499dc1de8cc82a90a584c4398e15d50eea01977ad07366169a816bda2535488f67e9d8b94eac125f484094ac68acccc28ee3dd91bff87c638461c0a9fae498e31e90f24ff0e2e540187825f0c2a927efea6676b3c219a225e1fb1e928a6ac8ebca0daf00f80f1c09a285e89520adaeed98e3e34f6b4980043fb7e612581a210016ba7f7ad8733f1253046d18073caa522706b3c3202a8e54fa22a7a7e88559d67141e42c26d1c6e0c68e13d7eab8a2a3f12958bd951f35beadb5e3c1c03edbc5661e6d83478d3bfb595d8d834fa43059a3c652ad1eaa1e97c6fc2b0e53a91f6361ca8c1edf1816c8a82d2a78aaa1dbf99b882200415d9186d27fdddc2746ad2700b0b06d3204dfdf1f678b469023fdfa64d9675581ac36e25c9b8cc9bfba0d86af7b8aed04c60fb54b87206b749d2ed28c24631b74088750c1d9a8359155a908da756c1cbbee1ee1a9167a55ec8fd7287e03c5d08d050b58aed4c0ce20bc08341e58e48abbff95cab49ff9a44c7e9f52a6f2001331242b508ff756f2025fc38ef7708495a95d0cf6fa8e3ec538dbdfe7b3799231f4e87fdec1cbeb2faaa3337fd266bcfbf888dcece76bba37164a215e1ff50cdb6cc4615a00ccfdf57e49009d5ba5fdfc2e259e2307a2ec88892c0c3c491ed06dfd3a8868a974ffd21193835ddfb8e834be95b91fd7de5617f603e8f8cb317d782add5d61485e7153f9256437fb19dc242e7bc669d4788793e164502a22e764688a0f490a59d3e2e999710bc22a337a58f22a3e678a0be15adfcfca26cc9b35ed7f52e39a4a8fd50176f8e272d9a02321be3399bf6502f3fb45a8cfa534e762458f4aa5b7b6fcb83a164f90c0a5ea673cc71a50c801e84fe3b771c8fc08366a2f3e4917d91b751d01fbc79f320b7cc708b1610c17cd3655b2a9cd5eb19322cdf910f0a284e4b363e79c03565d76d1c304118a2435437795c6911df95c72170e318bb3ee31af223d697b856e997473dbbd4c082196e12690ce01e61153319d9b7723154365d73c09f61ec0308c80ed8192e56d9cb342cdc70780b83f4c4e10f6285b975a97f97b4a1c0a36549d28a94533522cee20c4d7b92171f6fb9e143bbec3b9ac9c5e826a8e49a27a4341e831a6fd36b8ae5603cee79a6a34aecf405855e7a1e771101e84371d9bee75112c11178ef7b355c97c2dc2d0edf3f1564f014bf2c8ba81630a42e4f63b15629170b22737098f6cf19a7eeb7351b73bd99cc1117382a835ade24108622481b43962bf56a400bf5c74eb3cb1e059f116bfb61236e86433167742e921ffcca5b27f5e73164461c5bcc9ead1b6a65b23fa8f276f3cdfe1ed9c5588b5c21db81415e9e087e6a6a125064715f88a33c9e25fbe6d5283b8802a4faf4031594a6b3f26ff75686839437fb192f8fb8d274a9edec3f446bc10c39ba90af5d658045a999e26a98eeb7acd18572400653fff41cbc03658c64667209420ff063f6ee9fab5c405d98610e9a2915f70c8c0230a43fbdc9c075ba32a2bb64fd21db6de59e0063103a1c85914687d431fce96d6f6c5915c5b8c6162d84964ae4a98e756e29f2d7da68ed02479932eaa776e43bc334b4ef80b6491f6001e4194bf044b49028c7e0274fd3813979747ee1e3461435e496718020c47ed2ffebfcbb5ec4d25384c8a57d5795aa6dcf93b868acd7a2cb6448c34f6000da8b67f519bb5bd878bf233d4f67e8fd24ed84d8c1c3375f8a8f9c120e75dcc5dc94224898d34f464eddee6e056a6ad198c17e8bc17aeea67789753b7a78feda2cf4172ca28ba2d7fbb4cda2f01045daadefa7f4df1638730fc0d50d2ee22d0971b32deb5f6cbc53284ca92338e0e1e00c81e65b441e7c90fa3ca6ce533ad01853da4eccf6fd05827cae68370462a7ab5c7e2207181a24c3e105cec7100951d07c7061168fc6e62ca0e1f4277c1ffd0246ef4541829397d56c2437408ed617f9917d4d125450c5183bed333bca9e4cae72db3651aa103d8e42a0c780f4298a5b3d0afc086b220b0ff6db0fba1367fd78874add7fb9197eb50c8168d16b8a12bd261d553ffcc521d979b26fee820376252e452213d736c21471cf01791b8217e9f4c1400130bf6d3e6b7a3a1d3cf921800ed2ed542bf071711a9379c12b9801a550fba5942e9a5906743c5a906cd16550d0fc268bdecef395aed5baf1c45538bae2d56c411fdd4cf83dffb68f3814a95c1bc8b5001759b048d69bab510d4024f051567e502b11aedd6ecb3661c849576d984082fbff1711513aef34292fe12e0e4586c10979bde67dafa8c25045f8d64bee6b76c4be927c7a81d83dc051c0bcde686e1eb432695ea0a69f42a2d7aa8ebec65177a27b525a89545fae5f9c6638265f157d987d9e7d0efeb79ea0a5e5e78ec8fb6edf5fdd14475a8a6f4e385a08afd584c7fe83e2ab8e5df9be92d83449829b7044c191bd107c3c6369d54c24964170c1e22e6cc050ea6c6b8bc0971c1c64e8b8df91397ab8f0a1f2823c004d48a4d8d6b8705fbdd4e8d217eb710b27c8fa56dc2996819a736a323ea3ca7d5c889fb6ca300c8463a0513705c7ef5cdcb50d8ee3091a8fa7a8b4974fb5c8ebd9bdfbb2a6314904391aec453c0880b1c34b6437d566638b29c194772d9e7e724c4e807371a57107c7ab83a2c4946d3265f3c9fabb2aba9ea625d37ae14834383ea5f6a23373cab496bbdcf6a555fe094913027f9c3c67f0a83c394972993268372925e6f5839d342db3c1eae7327a5bf815d86d8084b2a8b66e8d8ce87bbf28bd42d5e8bebd31af14f9f82593122b53f85f136d6feae3ee592399ea4bd525a05a58cd509609d04cd4f74950b1df5716d35b7b26725641ec17c3230ca48eaafa95d3d6c5854fc033f4147e13478047cf106fd74190b015c77bb6f49afa90975bf61cb8ef94774a8dfcb75d155fdd43a43805f165d2e0a7aa0a64d43b56c234ed06993b77ca69b682754ab0ff00de92bdd2848f3b3ece3fbb4e368a97bf0cc8d84cb32605300d4c39e6343d78336b7e4366547a6adf632522ce92e0573d569d4451d24340cc4b54dbd7ddcd29ff6c4d5e7ddd7a9bba85a00812e19c23d888f9589b5f58d1a80c158fd0ad27ba6cc948359e865776d91dfa95a38c87a2998b253cb4c02e5fcc36d87e5a0c15d2826ab7f151b9d8a2431479f008f9697d87456919245f8d933eb3e5cffc625d194a37e2b91edec6c800506642c9920a5cab9f0c1771a33d15086984ab3f17c839cb1910b68e5be98f19bb09b26fbe31e50b81585d25f3058c3242fd3aaa931ed70df68b10289909a0953ca96981e4a8c3b1d49314c7b9aea1c22597a3c53e279e19b899ee7400eea27cba8f8e876e359ca57e0663e05c01fbc2f99b0f1881aa33f6458378fbf95f3ed61f044a09c3a119ed69f973f744c34339a851a52cc27141ac8791d844ea261cac524ec5904bb3e1937bb36b94d9bf203019018e886a426e44640a33d83c09e3053bb526a36e359d9f9e7e744082bc3bae34f3f1b4e2e662c5c638b43d58d13ceac28396cb94edf417b9a0b681aa813bbbe16ff7399125c637946180fda446ce62cffe3c8f25a58f05b46258e2b6d7c95f08bcc89edec642a3b6cec2a08a2f42754a70417789231570770c83e80f868da391238b6b33937d1013c7a0ac71553f2b1b1fcc0b28302f61e9e65e1d1d562e8e64ec6929f7522086959342abc1816e8d2a5406d46b9385dff4381208480f55296a5f895f91ccd20d237cd124e17976a25f561659b816bef27f49c631f978a97b89c314956bc93caea5c875a03b050173a36f2522787f82a27362a321965ad38caa623153ec11067004c055a636efb406dce55bb814977bf8b6cbd15f897d7a64b68209227c6bd75c26ac9abe3afe3965f401dfa2f2264ffb31cc777338a9470c936cc38983a05778f4d46b70aff93898d10bda687cf4a6b4ccadbde60da6e18b2b68881169792fce567ff145fea958a55d4b739319c8292970b5cc3f6e3bf2e964bd804097bb076635f754c48dd642967e08d3aa306b7f64032dcc06c5321f2e28b5d2a1733186467782bb76c5479e731e8c21352ba6516d6e5de5c4795112635e96a7b966a2557806694ee10ec61342241d86bd713f474a9a8d3dfff2617390eea92612d9d51c04c8f4378fd119490d78042ac96afe08056e05ff429829e9bbbf367833329382f0a76a9b087409e9db028934e17ead3da6d10c5112d3731deebb85c4a4dba42f468a15a5d2615e9bb5aaf3cd8d15128d33adec5bf90b05b730c9dd33ee3ad0cc0e583b7a77fee006a2588c1c5697f7a1b6e9eb467ea8a85e8ad188ed98b9df014efb25457fb557d3aaf49a4ac36c2220366d523a2a1224ba02bccc192abe9875105a1b2c70ed8aa9d566667e5dfc5bb3bc21695e83b141 MD = 87703bdb80194b39bcd2c71c2347bf71962fef9d9b77f637f798115dad973d0642c50ab15ad7bcd9e5452c4990376ff8 Len = 86560 Msg = 90b569513f77fb5833b71e852c8ca03c8e182a5757b0cd6d533cde5493e104e41bde8ffedbb40bcde18a154ccccf6e0984214e28286efbaa485999f055df447a553a5cf5db05207537a27fffead92a4a5dc1eec6d2e441de9a9e1b7a88c607c9a790793d28b262d79ec602a46ef0fd8880c0b23a3b5ac890b1d409fd16df745877aa8ddea803f87b7fc046453f5d0f4957e6418b4d17b748f5c30e7ee672b4af2e4e41e145400be94056f4e94768871849fb44c1ee65378fce32d007e0c7ee5635453d4de6b0c2aa4b51b4996d588e7abec662e5088a70eba4eaf79fec254bd6f257282a739c464506782d5c99774bf91e1044fe82cf89e7dfb42c4ff2d6f3b5cf4bab81d34cbe42db95083ab30be71cd2a19114447cab08e756171eda200d7e33eb6d59f008532a316eec3ba45d896b4041f23036d9fdd824985f148c4cc1b686fd17bab1182d836fcd826852b55a6fd1b80f58402ea8deff44ac39f1a139e72f4a50acfec373d8ff7872c8a65b82afedcd8f974ac2d3a2de20a896ef699a98989ac138bf534eae48376363889628b4fd4a1bf23cdea7ad2af6f9326fea0f5228b51165dc0ee58fb2d4fe42e1af740467f55a73feca4c864c8c47155a6ebd9c4762e93c3e3d6102a515ea6c97ee8f299596f52178cee9b5aaaa3b48963bcffe5d6bf1c3cb27e99089c4cfe9949ba1abedf793049332a6c3ae1a7cd20d996b00d296d0046c16a6bfc6a757c2befed110d9dfdd25353dac37bfa3b3bba5d2ba2b0fac2f070a50bf1ac48728feff5f48e2c0157a8b47382399440c880c482de3067a74b5d28b1e5d26ec2beaa53e052ea80a62133eb26b3372a71ea2ccddf10e1a7cb80b6fd9c8a86da45d46c06339aaeb1e8e50475c1e02484fa1aa034c6765ed7e3ed8e6da96c77655e3e3565543e4326661d8ad2f99bba6a45d47b97dd70d09e6cfc53d78d0e3c968866b6ffe6b050549a35478122384110e1922f7578831f61d337a7e99bd23ef430e831345f935ec2f1b6bb1ec068513f59fe3c4c4c4f73a8c329eb127a6b06f5043d54b12349b708092c65fa788e833c1b53129acd1875f9a94d9dc09d3b1d1f6ed091e4d656018a5d00d8a2af2d2fada24b42df5f80aedae20d509278c4f9e9cd3c795dfd4ab6d049de73a5d8c6deea9b315d88881a86a329f373f6919b25dacbeb6b7aec9a5f606c1fc78289de199942cfc324db488608ddaaa87b7c101968d767e8ca38c763b1303f54b736f5683045510442cd9d3562796d4e8f9ce65d1a7c3c81ca66445c4942c7abc2648f33262f8fa150e37b0d5689e5d6a17860597626d3c70a09b3a1aef0432d22971e03014db62add9174864b8b9ee15f9320a6f263b818f77777fc48e53c6956432460584c7ee1577c1c38b7fae2ff288199be25bf640811541394ad7e1dd0dc0d24d3718834954ce7d48d22546c708aa85e1776966204f6040933534762043239b1c503ad91972c893ffc212495f5f48bc03b6b853ca0042beb30b0cd9373e77d3dcd8518f07784c4a11e2ae7f9e004b072a27b085e59ca201c157c7d3c906a2c3b455c56eba6d41eca6ba62af2df299ae7e53bac31a2c6752e69ecc2c7ea48eb3cd51fd3edb5991bfe5d394a3b33d1cf926c13cd711b67bf9496a85ac001f21ea4e5363c71145230cf7b4ae21d9eaba304bf9a0877145c53e1442591af47f45b260e45ed00538df1a04e516f247005d9a14844c9ce2de2d696cafb04005cde1512b8b56235e3aad3333ef36dea487ec80aae9aade0e8b9bc17b38f3e4d910dc10d6d0b386c553759dac5974ac98884f2a34b020149a53f78f696588cf185020378a3bdec2e28c1fa198ab3a26cd096ee0db621808313f291b5ebed8c96b95940e6e553d9f5cec93871f6eef12e81531eac786f98079551aad81cc4b9a7ae820ddaba539e4dc7bba976829fa3994b1808f1fa42b451a9fb08dfa164a09ec50aceb68b33b5b09427a199c64c56377e743190c44161fbd25d403f2243bdf69d62081ce08a9ca8c48bc54e2a8b75739be62ceb5ef22d50aee6f56917f87e49b8164e7052becfa0c966991637b38df833fc5f7432cb731a80267cffeae97e02759616534a46db3323267184668b0c1fd7054dbdd843df94069a6b66239d29bb866fd4383fc93bca626a031b4f487c64e5bf8c4ac7e1cf6792b1253e4a99fdcf4b121c81bbac5df0f7afa24d5a926b61e0897f8d7a2bcf0fc5195edad85686d8341b63d24666de215345f38d00ef359177d1ac0877885af70e316cde45594140e1ea2eac589f28e615eb6b6ceab5777dfc46a64e489e0fa7ee77c3cb2a28b9a3d51cf1727aabcab9bffe7e6f609bbd71ee56d2c155c339ace67b1803ff2b4c7b7e1230c725133016b20d91071af85427de60d604379e758076a9ce1b2d0796225d68810cd06bf5777c8767c66251f80a3d13147956965fad1f925a933c141352e39e56d6052c8776affa572fef4ef593aadc12a34b31448d61b341eec4f75067b11216954bcb627eacd4e3961a35f95e783a45147df5b0cbbd8b18a02017b9eb366264dd1cdf1309f3b591ab6bad5fb545ac404f776a40c2b388433a05fbcc57f40db61fe0be15a3350af5d25c2bb54293a088b6cff5611cc449662ecf2a04287a828ec0400ee6c4b15364ad84278680d2c582dcd02d8e34603cd5e0e4190df72a5f5380b3481309290d728f4c274ffa9369c344207944a427e12712fd5f262e9402a8b3a2e006cadcb7b41a4ca17e1a563bce6f597f10e68bb4ee177342f949380b02eb976d5e947ce08db0ee3c9d5a8b8a18c0b3957f65fc467f70de8b03d196d6d69b194666f069f683f5a94f2a55a3f316daf762eccd0a147fb1a79dc25220f4a834a101dc6924881b5b166fa1765ff55d307d5df566258d435c56d1a13576f2fc6ab7361b594d13d843be049f46e00f6043bded05dbef3f8ec374ed4d15f940578fd459905b44082f61f8a4703204bfa4974196aa88b79996a97a37125e486b2e2670c2f7e999f3a5186ec5d0e20e74beada0f150172f3a1f50ef559d88b4e204c12528ae8ecf54cde978ff1db19dccf2f94473a2e1b68f7d6c4cbf3b2fef335fd259e120b544ba0e57bfa6d34b1337060cb493ff82de08355e0ada97ae57ddb3fc9792faf7aa81eae59b537df90f314c4a69e8e2751642db98b23e2fae7f5f958266a499b0514ae805a49b9a45f24a5a44ecd8d832efadd4cecb607f8ad62779163f9c8989e9838a5a63d594dc6ce0a48ea5ea6d36dad7b542ced7e3ddfcc3c32a9ae146eed3aa463641981a06cfa2bf8a3da40e1b582ef1a7251b091243b32831f1295e59904da03bc669867fab0f0fca1c8c273af8321e6e76905bb24b840cceeacb4c44bfec2ccd7aa066817f6419b0bb0965202b7fa00b2bde685884a4e543d04d7d5aa2f4508dd70326c6cd6061f091a2346572660affdd5b9b5f8fa456435a368de5f9f49fdf63d863aa15727cec58fd11756d93c3ced3ae7141bcf0b44fe10cda81156b7f5489b699c5d818cf16496088ca6d777efac73d96a9ad1893cbfd370fb695d7836fe114358485d1ecf11b8306ef028f7106208f67f1c08a794a075b79f0fbb72083e287d370bf2c3b2f27cb185dbd5a6e73681a51a4a7d4e93ca7d0c5baa788fb530667d014e4964e02f6af49910e56bbc51675005cc3764826573d6f8e29db684fe56ac7eb868eaa2f10a5f7236602dd6db425e06493ed2a998e07c3f6130cfbccd7d7275f2593b4060e55bd7f64fd67efb9837e66a9b81508c4b68f5cc3cc1a6c86538b0a4244102a3825192f8b94dfcd9f3436cd65558bf693c01e5cec6768a149564f575cfe230e369a769e3a67a989edae96235743e3d563bafd60dd8d5b0dc95600d0d6408114723c725601e459a72d6948e31011d147bd1da8f3179c65f46ee92c015ea9aeef837178e162a96497c6ea9ba7002dc8a0185ead9e3b231e07a2764d5356a800f1d2d016baed155eee52a91ac9a8263e810e0477ccb8afe7ca1c83d1614eba2bcdf8eeb86cf1c6ad1d492b42d58869a76cf695a4090091678e35984495b75e83d66e13fa52211bd3a722f7a045218697b67a889edda375f1f6763a337b1103ad9d9ae64914ebb3771e7884cfb2f3fb84100253d4a531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a61481b7d742c5b390f28423641616d739485e4a2886938e640f1cedb7c317ad7c7d14f6ff2b6b63dc0debee1e38cb34627a6f227ee5bfbd1dc08c82ad35d5ef222bca149f9e16c7121c8e1d6e9cbfe4b640c7197d112ae305bb73e4603415a03dacfb81273f7a55e98ad541c3c66760bb17e0afa1bd7778c25c4d838f225979357d33dd2473e888a8e54bfbbc2a5420d77c56559b3f27e6ba2f73d078a503c29008fd7915dff3e7f6c86c8bc65d08bd91fa929bb81abec583a1a16bbb10c724e3fcd2f589d81eec5980b1a260c2e78f80ff2ff296d4ae9d855f30a5d519f61897b53ed2eef0ec1e27cab5b019f0832f1b1688eaa5f169c755b4cc2f3515230621deab81c3becdf607e2e345505a6e04c6cd37f463f582eb6b4ebe588996d08618b5a382969646fc7085b4c2b2850ab92a7fa7905f559c723c8981c211138100f2e6b165d61be9a9d81fb4c8aef4ebb4acca625f0695e8d45ff1d0fc8a1fb71f36ee5fac00b42876c51d6db7b42e737fc429f2a0e84b2aba3c241658431fd5296b48f8b5b4f385fbbdfb4a2050965473171ad32682c9c47c677cbc75ea987dc7e6632723516e74913955d48302c0e156fc198e2044a638a348884dc5cf1e13635ee96575646986efbda987604942bc6419a27e4ecc7509b775b344d89f1538a43b283e0c7c993f5fb162fd48a2703852c6424e02889aba2175aa3c1ea9225fd2e1cc1b88f8520079bb2e809c9cee078ba87557dbe7abcc99aeb98e189ba9eb980921785b66487cc64148cbec97208c7726b8264b881ca368a78dc556d5207e6c07e4ff0454d0f6bdda5e39a93f9c49bdc78753d1d851f116e6838c49e43a8ab77472fa04327010d8fcdb4462e4d5c1c8117f5aff6700183cf2371d62573c9312c55803eb8dca5d900f5c969a2541871e8aec9624a29b9b43411523409ccb2a067100971ad5343f8ba83e8acf8f840c39aa7baff21988ecb259aa2865235ab1fb1e094e22874239145e1dab7371f1b391d68902e84a5caf02a2628730895fbd6902de73834278dcd2775663167b3f2fcfb5b13967938b34dcc1dada434d6ebee8e5fcc1cd654c8d4eaa956c3919b0d33bbe60ae00b39930792e7f9c1dedfc38f33de083618e31dcd15e47114bcbfb407e6733fb33f90b04905ecd4710c98cbe00612662d01bcd4e0318d7ecdf0072fa0036978b81f255339ab94065cc8e94a0a8f64adaa99c83537c50e4695355bc5259a307e97b2e0c3ff0f48562b19ba8a34563aa454e9ed87f759ce911594a3c0be343019f700aa4ac4b66e8e8608f3d187e4fd15d4f814144b763526f414c7669558d0108012692eb02a7074149b7c682bc016c6d1cf262259a3abcfdbbeaf00cf8e7b2ddbef07b8eaf2b4d17edc3d974772eb7ff47409fa49689852729844d5975e9636b09f6a309b96a46c6bd31fa50483e60ae5f1a7e4444d647860ad6c2f13518af4a62b7cdeea9ea60f848708dc897a6e2e4b4ee62772db77094e0210546beebf2f669a2309009324807100e182ffdfeab2ce91b00dfa993acde3a1198dc8bd9daf98f449fb04fd8588d94693e08d3bc45f17c4ecdc040f138cc8916d2252478d3be342d5fa1f6231ef6562053e5c1463fdceee82ddbac66b0da4daf65b3013f59def8baf4f794c907dbc5b1ee493f52f549b1859584245ab1920859a808baa3e9b65d7bf4239420afa8639c8195b63902b24495b95c4143978e49843d88a92d1feed2eed1a88cd072d6d04ea26dce8ee4b14896fdb69bc7ff2971ed8ac5655148d2e9921218d74efdf17c56b533d0bb17d11e07d7458c4e34ee11c4144167a7112d11f439d71bf2ad82c8435e8a7554187c3576ea6bab4cf566c9c66e8f38a4f537dc93bd75b3620e055472f2d414c0731d4f528bab715aad0dda52fe0150c161adb9ef117746239bf3a18416a347a6945e9c394f8766edc85df408473a3882d2d93a64da5e3cade3c82fe53e6a767d089adc79aa72047cd3d18744debc587fe544ce938c8d1f67521d5024deac399a5c7c50b2310dc28e5c03049728ea590f059ae7098c9666f6834dd2a17beaf9a4ec5dc97157cd39a8cd5d0c7dba5682b6b03634257f0c9bc1d3e3f809aaa94f2354c98715a312d242a46a0f7707739e0d71910675b852365fe06a60cbcf69a27c023a1a3d878114f27d947e01a4e3e389d6460e88ed09bf37156b8d566e9e8c35914a0357998a7a2eb576e8abf709fba23acf8ccd6195aede0f41de381cca74e67e53d2d23db18a5de87bcfe482685efd2b8831b1da788dbb2a97e3ef3e7fe4e525f1f95c0878ce06833da439eb8185d1252a7dd4ac34c454f3d83efa682164d814aef7437e52adcf2216f61a76e7f8e4c400c1b45b5ceb41f78d3fd80e517d25e6e54d3703d1b20e21a24614d90e30ae64b5bddf6c537b08a2217706b5828665092f7b953d78734a2e6a14a77656b574a3b3c29453bafbff802f6504e227190bf807f2ec8fa95a1984d8d240d3640ffded856091a5e5d6bd1e119a6108c1bd813fe953bb7ef6dee2e1790f8f64b898a0cea52845d776a3b7d8727799bde4ec6b5d5e1e608ff38a3cb0b53cd1cec6f7e3b38d7a2f6cefdb764bcc9d2d66031e30bcd0a39a36f1e49d6f37eab66611a65d28b8e6ccdab3f68ee48a7b8a959edb67eadb93c708a4667b995b99abcf1b1c63bab1fe9ca5658d584f26833fc13a9c7773f95f65897d985dbb9aaa306e65c2add603122d6166f878c83b54bb7d48e9f5c49476f41ddfe2ba429fccd2c86451820726c1dd735ac0470c43509c3e5c4c5969476af15a5dee27cac5521171a91186ca87ae4b7f938d6967a9174068e72c18ee8cbbfba37a031cb095ea5ade96bb229cb007f5cab3b84687070956916c11cab0ceea61adb6ea1f909be63d73df96fbfa3a9f4b092dc974c6d7b72d4c7d85d54ca866c1bd96db96e741d637e5c63d697f81a4d99f84496ac385a1530e7e00cf3e83b1aa778c701931225ac888fd2701792fe9201239b09ef9ab48663bf00b2ef2fb7b6a502a401ceaa7c45df1e6ec3a839fbc9cf5c08797d5b31cb579761d6b0679f4bfcbd2b428806ca3969515e59b3b4b9fcebebb36dbe437aeef2b72a009e589ede96f2854b2aecb88d1070cbba9ecce1323c18c56d1a1937f71e6684b821c95a795ae8d9a41a25ed4bbac2dc6cd2491b74ac2b6601f9a70fecc2ed9787a1847b2330e950d6c279127b5190baf9b8f30ec9226bbdb2c3b3abd7c6948af4864faae5003b126889afcf23bc228ce9b79163398722f307e006b3bf11a3858838f38fc6b22746e2d691cb4de3c07bc236edc2ccc1962f89b868cead8d62b2c91f38d1ce2ff515cd13e5af00aeb2af0e9fcdd18bb90f9abeb3a1a4a821193741a3e518055deda6afa7742245053f4f5459fa3b7d57d75c303a78deb8b50f3c782dc40e7425572213fa06cd23d0b1831dcc3ca6aa84359c67b3b624e5328deaf5239b59226f7ab07e746358a2f74e75f0605abb1b267082ea88231d387edb6840ef33a117249f797a7d526aca625f4a557d1e21d726d138411f8772b88241dfe1f7548f5c2a0ea48e7d9caba4fa2b2dd48b4e80e66da0e3f4e2aacb6e26077760a5c5caf86b0f5a43dc09c537a5fc44f6f2b38251e225ae8b3754ce60537457466050fbf3ceeac31f02615d8b4c18b7421a15cd1f6ca7bf8f884c2698efd1a81b8fbbca563ae606ac576c1ea9d8c8af416c3c0958f5703e883c5b791ee36691659ccfde28994c4c7244f2ad982f5454794eefdf0564c654fcbb4970f8187b3baeee54e071d264bcf82fbab5603b04cd7429f8f62da1f229756ddeb2307558ce7ded127739cd767fc6818ddc0ae22043ba661df8d8933be47abae1e8cee145715b01d14c8972cabc64a333ca9d0eefddd16b278a0e24ebad940a1cb9d846894ccf92580768a9a89c5bfb742821a6bac443a2dd56d83b49ae49c555ce588b6d886108704fdf5a574731f3189e9f92c91f987109043dc09c0c245355ce5598394d99cbe1ccf56d20e471f2e6d31dba64175642713c469c2df2aa1ce462d85535c200437327b2ca4b9ba05fa770a606d3d4077cdea5fab544866589c932e8aaa8101dd9ed081e59209648a4231c3f5e5d7d328719e761f428f0dc00cee58d7fdc5e78f319164203e6faf0282280f2aa4c3a60cbe7ab8341235997eab923cfbc17d59afbbdfa25aee7f221536c44c6d2e63518b0139969857be91fb05396b749a29d0a57a25ccf4369a3628dc80fc4be7493e29e63581aa679c7fbb864e44c0ec5dd507190e249abb5383b3e0089f2563d7f46fda1919e8e651cb36cb4b597f3c7bef5af4f379acc13d734ceda5b5a838b1fcd3593ebfe23870fd0330ab29ee1f267807ba601ca90caa9d6a61f2d042ba49bfeae020f414f26c9d97430826bbe8c00793c5ee9e2de24d5a82c97a6f637d11c62d0b5a46ff98c715699ecce0674deb369593f96e99d678333c9096f3a905aca7f0476539109ff30cf09073e75e930a6d73c11b1e7b7dcddfde53e30d81c87cce0b00bc4ad66c82ecd2c4979c207ca014b4c9ce1e513cb0890e9ff90d6c5a04b0a3e3d9ecefa2f92d76a7928f5b4f3ed4df1a8cfe9997c2f743b12373e72ec6e8714d489f9ac7b85762b61f214daf4926693fc22fe3136782f453fce180bb45edd9c982f3864f62e31d7c780296015171d9a618329c3430b4b6e50fd6a774042973c5135920ae6b690d674793b2e9ea4fb6f9f9a7437e911501d0b6b3ea0d8433a5ec646108794441b903086532cd76387787e0ee67571b2c4bc3ac19b6dc4895069c008b8c148015b6ec24f7842087a491ec6888766231531b2a3a68ac64b3b61c5072394a14a14d7d6f47bb2587811c9c93eaf60f046631e670fc31193b781f3d96340ac0fe1a617318cb30956705190e2af2c78fc24c3144345c03bbc4e84900f9c0706f456dfa4e8539e8624386125cfe1a6d873035e9aae0f440d2a596cbfce791fac36f1e6056111e530aa186a10fa9cc6863b2c5c381033f791c31f61097fc331a6bffae4c2068e2f10d15894dac9a8348c3ee7e476d17a82ce70ea8af48842e4fa75b900643e91252c7f3f060aa6cc97f2627b1edd59ac8dcc1a000f0a52bee1b24276637270e46f8e9d16e928f8d197be913233f41091bf94a7aa19d345ffcfd60d783474064db43e142564bc2780ddfab2524b435ff0c12d0130d0d6c9cc576cbe089cf367959c42cab4a04f9b9f11adad248d53ac933a9f0eda5b9b47ef217e3c6ec376fb84d1a4a90bc568bbf6dbe06af022ab6040d3f3b8f0e2aa252ed41371f2d0852ae1f86c9872fa90f14fe19ad0fe32d4e4c03430e5b98f8ccd52183444dceca85c76bca07e30674ea570cee3c995e4549fdb045e7f7e88c8a52397e89d733e68f909c24a458e352a3d2248c33dfe60b5f858ec866d87f5e61768f6376400ef4c6963b571d4d48cac222df7431282cf7e590193ae971cff6e8aebe02981cb26dd144c3b1e134a935dbc59856a31675938299ca2e1e585cee96672fbc7dd1c0ca1638bfc58ea3773c4736e974182f5256acff2c0243f0989df12c6ef185e3bc922bceaa22741e5536ab033d8ceed765c9cb5cb96818df258d6f8af6524ed6f84e8882fd293009a5cd5d971ed1b5b30255742efcbffb78664587ff405f473026579302336a50f9fb68f58f08130b26ca921de2508a6a50ed5ec0f5f768fd63a955f1a8e7664563c882093783a13dc720f85f136f57f40d1d31b10b661fd00603c22b0383ad9beb8fa0ef4d1c0cebf8a8008e3eb39916e19856beac26d47d7bb814859e8290a2d5d36e3e1c2bc6945fc24341d0a7de5182c1366064b437445958d5b7c68eb018c716126c415d6ea550f2290055b68812753a694ca198a8c313488e3837e29c6c43da6600490b55bd60da3a404a8a36f81d6667c9ff3eb9882e19966d5f38b5fbb092b1809fc02c3b23ccef983b7d5b710fd7aa6eea20e9f22e4e86eda8eb8d65b1d18d63b20642bd0e5cc16e851a75fba100a9a1def9aa9f8859e82fa1959338bc0962302c6849a184fc4839c3ec171695640e1969f38bfec0ce32b9d5a157c323bcd85c6b4091872c4dfc90846caf404184202bf7d8fe7e6c0deef2b1b95bb3ad6e486efb39caec68a456f93316bf1739e38850250482bceebb8590c2280f78ad903aee58be562fcea1dfda4c64b6f9e304bf3c6df0a938cd398eea8377f390a8c548410048b3efc2c8ffca5ce13766d16a2d272f37e2609c0a73868243a88a237fc90d9e6374aae98c5f3fd126a0fc89767ad70544bec2bfc0dbeb2b058ec3a21265aa6f8908dfb76e46a1457f94097fdbf0927ca1aeddbcef108efa2826dba93f86be0033f0fc90d17e952686713c28ed470ff1d9332027d7b9f88c35f140ad59a4af0cfebd802a684f91f0c5d903193ce6960145dc28652d50ae3db98e8132f357f3c243df18c895321e30a83becc53d57db27921a5519524d16ab2d4f1bbe9f1932ecadd6151feadea062b80a57c180f325d1286e4498e937d840fbc38eb4af50d2d887230374dbadbf037fd4d2728a713c9a835865884479598bbf7c48c9b6a75a028a46628bda17c09f6a1bfb6ccc3a55f02d59365c16ba1107f2e9e84257754f1701d0c0b978b55ba2f1502124c8c7285ea0f14578b2529532109ccbd2d45308729822ac7249fef69ac001e21f02901a4268b10182b9db6c9692f581dfefc94ca1b7ec646a906d180330b1ccd00c2da257ff08f8fe9fdcfda2149498edfc305220db7ea6f71e783658dde03fdc381866ebde799a40c6afdee0ffea8f717c20df7c8d59d2ac36b8e828220db99828c8ce9a817373fde0ec76dfdf77c3fef2233b11581e85fe6b9793dd979ac88850b74fd07297048a511b5bfb1dccd50af0bffb8ba63d1f623fbcc005c937fb41427c711a4c44da7aa9b4f4cf354a4119fa4fa757f2263d8c2561032d1135b0477070b8f4591d44535d21e7d8d07086a0616ab4e2e66a3eb0bf4cc3a01a44960f5d5cbdeb3370f088de1a9b8459e01432e889bac8dd99b1845fd8882b4ec50b0d8b68c66b65f06d9fcee7866e5c197845d2350f866215248ba99cc71b19378dc66d4d88f15b1c0a1c82214f03317d316dc0f54987fe6d061b0ee216fc242c9cde85736c19ad445463aa404bcf849bcdff3732ff6a0d11e4c70270ee4ada14c69a5672f640b719db29a9dd034fbfe5ac8e9776778938943f2426a1c383b570899e72a4ae0312fd1cb303401bf06dfb6b9084586881fb7473a6ddfd1d4340d0546f4cb0f9dd4b7e77b43921ec4df94d79b9602148d0b03330b3bb0b81e606a4c5616700604bcb0eaa81ddeafad4fc4c654dcd997ef20140e4ff202567f8717e4b39242b87bb0c3df3c04413de11e1789ce22f099152693e0eddb00356070bbd543b368ac6b7a98d01e41e34fc814372aefb06fa169e527b1cd3ecfdc27e4ff28f0c00a6a3de0d6c4361ceb6dcaf9c9b0a1cd7f385224798ad7639ad33eab8be4a000527b57ab26c46cdc811f4f947824cbc248e438ad3172f39187a30b8d06113dbc666623a32fd7a8cbcfeebfaee98d55d8f1308346f6720912bed3f85218b8ae3d6eb3078f9a05d22ffa61820fc7f32654a2a19cb87091012c68eb6bc16ae0dbc893eb6d380e56d2512d01007fb85f288185c1e9ca48d7c328ad73cea3a491aca8fc95bc6734d390798e54a2c664d742a6bf17d346264c374eb4f488c06ed30923d3395ce2b483f5ef45e4ceab75665c0a7b2bc3f2b1f946e5a6f601e06eafda833d5fb571356fe7fa7b39edf890115ff6df861f9892e5d637aaffa1cb4f2c070e64902fde5f9d4fe358d968735fe231b213af50fe7118d08ae999d048b753780d705332f0db1716f3034ea5e58ae0bb86402ebfedf49b1d278b4bf6214f2b16c78931266e51e5226fa5200e15b913e5ba8e8cd32cc675a356b79d7b1cbebcc786d5b17321680d5da265d50acd938498952450f3858dae4c5e9518c702ac0e74907f5b81d1c999aed36cf700d3c03aba602b0289bef24fff894e43429ac32a062fadb7b8451c90fc49e10e5af0e93d3464ca2bfca09c5fa41d0aa755aea81763a8884e814708fb314deda07fecb696efe62a52b4f334e62263f0ca660406dd754637a7429d35e13427b837d78fce4cd23172ff197f61ed63a32936df6683852250e24a64104c4aed1f695acaa1da67c48ccbba930bcc7a4e25dc73269ac715540db3c05068f53f447d2992c0e981f0af3e5d0c8a611c98cb303207a5687b98f2c6d0906d6dd7c621881f6521306cee7a904f7c6647fa4cc20d537cc29a4713e4c4614222e79bea6c89745d553e42690dcaca938f860ea01b05665ae7f6d290124c8f5fd99de8b00dc84f02c4dbac6a5034f5d76de6ff9bbe5e94277b46c51664a9816ef9586722ec8dd9dbd7cf52f72b15f9d2682e76459460046de650c7aec22161f7eae0c047f2203970f4e1db1b86b7fd0ce9281aa78355dfb38fdd815f14fe548213fd9a2705c8984985dbf0db49602a0c569a94c874834c82e0b49b3142868498de779dcb0ecf1eeff08338415c59a85a194d8bb150337461409fbc2c340219c0b215723af67bf2e99fa25c54a7ea9e7e9809a868fdae7ed817648c59d2b93b83f7a0c17ca3153dbff8ff031c125a34003d9593f76539936fceccb5bf05f5106816e1319affe426fa6564d6a286f394696fbbf3656e1fdbafcb9fdc66b3fcc3f7759d6b9bf132d6214c977cede9fbe341954170bb02a67d1f77a5ac57c5187ab87d9f1787604575bc17619e0525bb4c0e19f0b3000818a2483aa5ca99248e5d3496aedc6736672a532d8ae4f3207bf55a6290643c68bb71b07d69e134b6a996f2299162425add1d6ff6daf5bec48306acd8e92b780ad813e1a6b7973165b04a7a9c115220b4f27797da197a6ef71aa88de3c2aebbd6b6af631f58949718eaa45559f654092ced6054410e1a0ca3890284ebe5980db49f6ebc4e14816eb7a0c90ac6080f06aa15ff2d93827e9faf193e1958188f768cd978769db206bf291be4214d0e2c1e16b47daa383d4e2f030f81d492243bff46adf41873fcca9158a01b2355d2525a58100153990731c587b6f63e01d146afca630a2b37b876ec2b7a9697451a2ac05871b4b11ca8cf672355c2de0ee6558f0043e43653afb1d88aef7e0587af5c5bff21be4b2ae7d120bf33103c1f2d13a5d095a7c12ea9245e5d49fbf582598f30336746a92c8ddff5439906e19e6c25fb23a07e55306e77858cce34f09edf6b49dd8a74548862a0f097cfcc54f16c3699dfad8f79c1c5515600c7527d430b9aade6d371d3a82ebd18a31d8b1d82f5ec85ee0402b549775ad79f7b7c25d9a3c164348a65aef2b9dd7550cb6bc5b7cfefc936ed0091304d3b125234db6fc8708b77b1f7786ed0cba910842093d3fac1e86da1b0b196de0c9c0f023897e3793a9ded4361d09aa92bc9f028652ccfb2947f7716943c4bbc7f24d595d1d70952c9a2ced41298bae4a2e41d25e35d4246105bf17ce2c938306d7c6cf544c36abce440224b50f657ebf8a2a061df4fb320fd25e2bde382e6a39d4cdc08dc858d20551ff2906412f825f5ad80c6a429aaa7238453c0dc8ddc7ed83b2db8e042fae4e2e8458b961525fa60aac53b7914af434a214b6d1812a227e6f168eb97253a72544324242d2766d2034478a7a5384b5c39a3d2acde3ac1088f17958b4a53d43072d79643736f4415a421a0f471bc055ab9b3f065752cc0879b55ba7f42f75088064da3d0ae16462b0ce9450925c966a692f9ae802611270ed152e1afc43737e1d64c53b32743f57d03456fce0986f5a68c1c13e539117f04fab711031b3b10a2ac7dafd4261fd77151dd272b641c3ac36ec5287df6534fd1de2b53638e2c63354e88be1bf2d27670bd58740880b2bd65029bf42ea4001fdc4557aeb76432b90184148971d5835ae3105e5f4da37107f50e477fe18d3f788ff7e22ae7e674986e18c916bc155b09301299efe216819fd95b70d17ff739e051bb75cfdb5c1b8be4d0516fe6fb810dc18bae2caf21090d7bb1bff3ee2b16e18b5bb8a67c0e4e17cb76519cd5cf1deefc43481e9d0b31da42d8dcec1871fd03a39d52b6b04336c68bd074a373d959324b020dce921e238d95976ec4e31016cd024aec076044fb1f8ca75f8ea6605b63158fa54377a004aedeb71d8339528ac7102a2da2755ac4aa37c2bd6558ae4b08c1b3b98535daffc584019332017d81793504be8ed5cbb9f0f2eb342e700952aab936f19db214395bef3a75d923da226cdaa146d36adf047826e86cf3d6ba98d064e0f492d896ddf7862d6e7e86b1962765ca6e7a1ae0caca3c820fbb720944022a786b6c8ea71122b3a1242b144a05324045de8acf14366f9a81c28f2c3d7ec973c8fd34bb90fd63de5d3fe7b4ec9616d1da3d0b70c56deeaaad2f76eca070aba79653f1499acb426d2a68bb4ee1715a82533406e5399acfd3cefe789a783f322eab14ab1f0aa047c9d047adcb6fbf86ba776a8116b8e39b7cabd79d1e0e16e671cfe96a252ba7fb5a1783c811dfa823e00d8887eb8c70d90f0d60ee60aa1b4ed6c97a37434405e588c7c411097953b85ede351d4cfc6a11f3bc4472489476f2c6636e19619ce58ebca7b4929b84e9cd9bb21a4d214ff9cc90802931bf13505aaa636e19677c6d7c5c80f952b04a91eaff50de1e52ce44904e21b834ab70d10fe892213e3d2cc539d21a3b592e117498f2822a99c7c174e895669882f6f42098eab83090ccf4164d843d23b0ff22b95edc0ea6c46870b059cd18712386e4667d169d4217fa1c883edcb1585e09c589c525bdf9a91e22216d5effed20458bca47d60800dcb0eb4296403d836b36410c543557cc50cf20efabb0e3b2801930757d91c311e6d7aa6ddc1aab4ce06ce0699375a4c6bf MD = da81f8b846337c2dbf86c1818305516dcf50b6bd9e7b4b91312bcd32ee8e0736e869ec791043a7c67bb853a70f4a9f84 Len = 87352 Msg = e3c137117f3738282f808dd94aec5699fa4938483507f46eee9a3fc48c20cef69b44b0a7c162e0b5f4ec1bbfeb0cefe5d28a15cf42f100f170edb60da5f8dff9ee351ba2149c9951ce58e62d366d02027a9eb940d48e3047bc25bfe15c35fe10445e230b5f2f8b83258d962a1359b876584dcda2d227adf7380a0149992155c405856ee98a61ddd36254d4bf6a1639cbd65ff9fe23049f894e63254c4402099c9973a4447c7bb8c9eb7348f323edac885b9be45bb16d2d8565fad2f34521452168f06e241fc443ee29b299ce262639364eca37c163aa7f74e495b14584c62fd9dbc474925a86a7c984db6f585b090a5c19b499392102bede35fd694ae939ef4e58b65d9515070be365b4749aabde44822321b3c9d3bf1249bffaa30a5dc1ae08488fd136389198c232074e9bfcec1231d4d92d7c6127a23fea54078ec6a7948e14177a7cac6a75f0559aa563387c9aef94a3ae57b48397471ed23cdd0e34c8672216fd6f57daccf5343522fb45d60447cb49de64b21a18eac33debff1bad731edc540517222bc25739a26c6a0d4279bee19166aa44364eae415dbbfdd75dbc38a998387df5a381a0caa82cb8760821de3e44ee31531d611e01fa55de288bcc3ff0ac3ea8b98c3157510e0aee6a6f232e4b2a1d02c51878bf69dc60aaf87ecabb1b56c0a0542cf905359dad13d0c0a7366e0a9c24846fbb1be2ca85692e7fdf32915f666eb0cc0231de1dbe2f8f44d77f10ad129f766a53b9d58e6c24b2d6332eba8fd719b4b37463b456e44b9140d9909adc287c85516821a8eebce36ccbed36feadbca9472b76241f0fc86dbdffd5f1725d86c2986b21dcc5b31eac44a636d3c583bc27537a30fa871212a0fbc8f42b02f8d3799601a77192a5398922ae358b77d7809abfe9cb70542569e933e25dc5b177b8a9695b2268798bb681ee2c13e97c72af0a73c06f0bee1175524d963a47e6a0dc5bf8c1b94ae02e3c9c9068f7723c1cf27f56474355bd9ddfe2322cb03a0b3de8972b7b949d315774e3f0aa0ab0209cf10252c670d52a934fa1c8ece92587148363ead0dcecd3cc055df63a732a8ebc539a4e841d139bb96c98f81d0d90c2ee56c91d0ab9bc2e5699138b5f5b68ef42c15033ca739879d9dfceab094303249208d0ac6f5297aabcd50b9563eaf3acf7e22be7e09aeb2db94f4bc7f6b40715ca42807f48d004afc8634ffd8c47522ba35f33530eb9941d226518352d8823fd5cace27fdc5a8ca540ebe7ac239b0dd60edf705f9cf91cb3dbc93cdef6e6e04411edfd927519b5f4ed14d9896f0dad14ff0bebf4d1810a56ae22bfa998f6c552b1aedaa159350a0497872f7bbac6b94c408babf8f67ae66d6119aa7d5de25a8f04967f95d1d5103e05ecf16c4aeeb9e89706b855530b3962bd5504448bcf2764d14ef6542521510801ea254369ac354fcd241bf1305d899c8a7fd5e56be7b537e27d47c89d4254cb5129d5e85d28b6e9aa8edbb6d5976183903e264845528b71fdcc78d78160a1f0be5208426e8bc31ef5ec008a89e2467f963bfe556138317bebe3936b18a2c1dd100dc73be6fde55678e593579666c2f8661d65f406c030bb74699f6bab313bfc0f0119ba0ba5a3f9f9229a04424a5c56c68d630d7e120f9b5f07a5bf823597b483d706a827ac856f414b2079d6b79d017f3301880f5756827664ac4fe5d55e6c333696eb8039132018072a9e99d40b6259b6464d02b78ed87f29bc031c39178ee8c7d26c5e75d67545fec25bd5ca30df1bbf3b449f593e0443fdddc36e8a4a816a32c1130b8855d492d9ef98d0c094e18ff5e6562d66ee708a89187725f07fad811e6bc9ce9918a6c540ba3dd4dfbdd17b015169f60526831c74740787923f7af533d974eed0a854a7da2932274e3515a88a8466405f6fa5c067fa5bdd9911508d1a12fdb4568c440050475f11368417de398536549c503e400ab15b6e2c7e97127b1e4d68534ce0984919acdcbf303de4b65ebf7ae352b66204a1f084740db74dfd064b52ee718f366ea902ce10c3f184a817ebf95cfb76effed200659946180349d1deb95082b8a467fe473152c59a84b7b6a11b30d6e4ae9f4d745ac2b122ff0787f0e7a107c5a8db20654bacbc9fad8c45c92687686969901935ab17d73e08de31682208891d0b7318426547326ac7cfcb4a63883b6ee6783e2aa0c13fd2e576d62db3ad8f2894d6edc8c64bae629a28510e1a5cd659ee00c53a81e871485f787e29e2b9a14e0daca7ddb8dfb9efed3ddefc932ac19349d0b54f95b3f6063e8c3143f65447f73c9f4f6b812bda798ab97afc151b8585bf8f1650254b55764a59f86339a50a8beb55eb596a58996837422df6e957a99618e5f02479d816fe4a88da71f1d57172e076868fbb8e7e25bd8000d25805b52d1b7c4cb5d981c20808c0e056670b0514e4ab25f5bcf41216e41dfa78a84e31b492f931ea8d6ee0fb4aaa11f8e3704cdabe9cd273b5b3dca473be24d12159a6924307a8abdcc8f83fd9ee7540ac2cd02a38f094f1edf26437340d84c30d4f9c2ff64cb8e010b7923c7d3314160c66196d184f7457adda3338edb22537b25799f3757069716f62375afd21f7634947ad0c2763788d3d93d00d67550c165a9a2746871cc34742f26e012361250dacf6166d2dd1aa7be544c3206a9d43464b3fcd90f3f8cf48d08ec099b59ba6fe7d9bdcfaf244120aed1695d8be32d1b1cd6f143982ab945d635fb48a7c76831c0460851a3d62b7209c30cd9c2abdbe3d2a5282a9fcde1a6f418dd23c409bc351896b9b34d7d3a1a63bbaf3d677e612d4a80fa14829386a64b33fa217c9b26e8453e4a6b28940d88512de90ed6d54d65d91cff97fd0628b26019dad84de628d9dabf42cfb195165a369c22b49d4b012c02bb910b4bb03859b73d07ae949532683d9c3b7774fad4fea888e4c5274a1cce5bff67050b0c461ad510091afd02e44202578ce8ef5fd9e41b66b7b7015d00eb494ada1bc784d2643e2547b3f3c9bec5bd63bfaa8d1e85a8f3d81410b7ee4df15f407295fdb45dc446ff5bfff5441281c3636c12dad178cbe63f7258b788648f0252c92a0a0548c9a400be559e2c9ff4b8b8eae854f313cb571f5b058cb5e4f2d704364e991233d2c9dbd76b4acda7ad11e6e46187fdf705caea568da3f13ffb41d7425a1745af7e2ce33f9787c1d9f9437fc134f07c9329b642dd7799b4e5d6d74e95f2f12a1c2a41a96f60c183a787d1e609c90ae96895ad9b5859ea9b67340bdc799fd339ea75acb0ef5da48d80d741ac369443bef7e815766f9af2ff448163f395c729efcadec27c27f49d69f6462744d03d4777b17f82467bb16f6afe4d543652ff61d61dd4277db1bc18839872d7525f1a62ae35ea788e15339c690506711739af176763d45028052aa284b7ebf6274bb241bce5b77cdfc4a82673f93b2f18c25cb72e2d8db12daab6d7c804ffe8661eab514e5154e39df2658a063b5a02bd859edd94db3eded11ae704d7d04d4281505c0dbd0941616b372223aa4bf18067ebdbd7361d864dc4ce31c62eda5288fb794af3a36e0b5aa9fb34afeacb801cba6daa408c34e2627b3d3d9857638e104701fe9f6bf02153ecc7337b120a845c37a360b5f1e1d1d166f05107cc0c7e9cf682fd6da14011c196239511eab97cb331f5b5841184e2ff1a801271074592738c64bdeaddde5b485888e000cf38e7b66c0d1f57659e746ff855088093af78387b3fc6936c1b6c4c866f9ac42a0943da3831e48c68af349892f79992fb9a8e50356c9df3e697d332b2502bd895bb2f93190ccbbf9537720d7ce04c44a9a7435f5d83aa88d7d42ebf6ed319ba9ccef97591063b4d65b7db331897a702184635ba560d72ceba40bd371e50fae6a9a53ff632b699d264b0ceadf8862047d207e405b1729d42086e2d3e436235f946de61a970868ddb1ca2dad28f444ea2616ccca5f24b706f3ccced39607f514eeefb1ce3cd0e7dc3f81e7e456f5a889e40d55e2f8b0092b2e1ed8bbd0810e3641c6bb049caa6f0298184277afb217497fae227170e3a8ac97230673daccf52e559a0ca5fdbf87b78336464e7c541992bea03a5d0de41beff78462e4fc0f3263f214ad97a837b763ca83fc51040234cc6a8ba69018dcea5e15e9f4f47e734e3ce0dba5c4e539876e33a96b6991e5f25f4b196cf0d8f29e60bbf8c38ca71fd023e698fc12fced8040874d9b7c6925dab429f09667974fbe5caf5cd795c03b407fcef3bb6b347c29418d1a9573d5e97431ccb82bdc9b1ad2bcbabb38f511f127b75e93e9b6d60e0ada0fb560371d59493ffc1a34362e7c63e7a4beef96e2670c355f218edb2acaac71d3c904af899ee04780bdb85f969df845350c025e7bc577609844b3c178d99670a3fc8ac261e0c1af214bbf3e1ba4193e354e7c372334f0a0d3a55e520863503d45f6f95aec4675e0a76952bb07ba4e3a6b2b620824dc005dd6ec9a75218f63428160595e73f98343dac177bea00620a1a04cbeb9c4e42eff6ac06c120d8556e521e2b3b53e21733f81fb382f30b116db9c5897314c7403ee57c9de12126eb190eb230e4995e4ce3b66bf9df6fde2b95027f8f65a04b6069365b0f75b7972fdaaa9cc7201c06d1ba14fb3adfc50c28f6909d4e21b33d0bf545c1dbfd68ab8c19b2184e7c506e2e2d8058270277079228c0993635c22eab69a03b73f6b8c6985ca1cf4767db16cac4850d2ee60a72efa22f1dd81051a2d74ce23277e03c9acd2a161c426110732ff59f74c30903b099d94875c45ff61c080568414848487aa2e87ba9b006a515d6673c4973d9d7533954894b5b6303fcc629cee275ad80f8a24e4ed210a6ed61466fe7d5b1d719dd46aa8df93dd81fe79a306290807e5a9753921c3ff4e06e0808962eb42d9f2fb13a21b329cc0dae5eecafefc5e93959c93f7a404ddd41bb5c85607d6f2780ad619c708537869243b545feb31d207ce320be5d67862a2939e165556061302a0780e60d90bd0e04549d2ea358e0b6a7ab1068b1fe637c258e38f0fb5424e809b2719f6f5224c2b275791f443dcb2c48062ab72e818043c50cc5d0b8d534bf9e52c6210c4609354b0acb9047fe26e1ec88d232197d4701665a1a8d14702b17565cf1236ae8d4e63ca9271a3506ae87f3a7a952096e3235a7ea997ea491528fc035751f11b70245e5c4fe1581e3ac7efbe702af84b0dc610822d53ddfd545a97a70e46c773d2be4f4e2c32ab521cb4763cb90a302019013e5b750432ca89ec4d393a1a421e7bc33d88718c2452d5571d9c9b5c507bd17beef0c9d072177a8927a124f4ea8433dc31f166164c873057ebc65f49e1c6fbdd272971e2244ef0d72bc714fd460ec2b1327353f9aa59f45de9a24cf86a6860cef2eeb460d0d6b37e6394515dde22efe948f57f5cc731e8101d19ac9173c9c8f75627dc73ff178b27d7ee253b3a2a832d7b6033682975d6199111c53e8451fbff5bbc2f423779407a8ebfd6bfe38c4724d49ab7455a8f841f4d73e1252668c0900995f6f60364991e90edad1360b200775a8c531ae2e5bacb5728466ee076e04f699b78b6e84060bce561f25c390279cd161e4f0f47e142c5b9173c423be324e682b4ffab70755bfb9604edc5f7e679cf0e39f24e13e9e3b47b270dc9be1751fd5cc9d1fc226b5384a9bde67321c5c7254cc385fccd676440a342ff2af17b323b00c337d2868a0ffe297324913f062c76d8a65044fec28e123b4f5c8e5c758e4975887955253b59121b10f045d913706ab8c89b4c2d6229d24a356a1c886e2ccec302dfac86e4f768897b92b778535baaf613ae3ce2affd28d9de72fdfccfd573f317b10032efb2a77a9c5211a32eb4de9a6dd03da611d1baef31bb5840fe51e00cb13678afc25277f75b7778e30c45aeaac04b77fff06e3394168f56dd6568bc16b7b73d87c79f8207a04b16bf55d4c030f3651178b49d39d075341f5a6ae2b01a117c764164616db2531413bf712abf33ee673396c52474ac36f3da3f7786631ea7cd4c66035fe3005c1b976bc90f51bc999907e38bcb8e2f4214af15f31d7e2d61f2e77d0b628afaa3a8c94cc34b1ed2dc42b2e66f5c2c627fdfc762466fa84c27326e0ee4320aa71103d1e9c8a5cf7d9fab5f27d79df94bd69c4ab1d7448a85e1d70aa2f5970c108c73d8ca41e60cc5ca1d342f2c589af42f9260871064cbdf7727e2c0a859383bfd41067894d67cb345de5985d753ba65730a2f6e58971463d16b1ff0643f35324db6827a2b3dc84ef836f7b13e57ffa5884ce2ed17a40d17d7eae8ba9212acfd621875586ce3989fcb6f363ccb2b11bb58a09f8db6545d0572ee66a7989a44a226af069bc19092aca7d03dade59999b2ca4e8ed49b6fad3588bdc03edf9fa62b80c55eca910b617f72a0358cf3673f8fc59dd94c2fbda4ad02a01f07cfe9799f57a0a46d431dab20162845625f5eaa5c33d7a57dda05eb77c9dfab8bd03f66079589010d418e199579b096b590468321fb421dee0511299bc4c28b514b6b156a21c89d31f22652e8857f5010eee771e40526662716a7071fda91e8e2a6332dd0e3a59f61beacff2120df9af8e1081daf39cdabb077902d0df593e9c44b605742c3682f250deac74634169cf7d1732e897f7e12128e94426cfc11b781a0ba3ac6a958770647a65361a86d7f9426ee4d7bbf80c3d4c57aef45d65379a10f087f677dbe9c8bd4a94a79642c6b584842228be11ce77e830cdb9f6da158aaff14cd2a27e2c93d1dbb5597509b87c9a03754c3cd9aa6982f10ae82a8437c26d8a4cd198f0c24a288a31cc25402fc7194948c2b6b4227ab334f12f76f800c9c0181263b9e84d5447e2b460258a8f1d88d2371caa45b933ef691ad04aaa23195e47381983a9105ab68197c5f44d68f84f4aaaca85e2f11dae09d27b441ef1298e84186394c7ddc5dac3665e200d4feff2ff2e4cd8204ca06593d290c1db0d82d75b5dc25bd8e81e4b44aaa9274ea65d1a8c3c242f923e64ac9375b16242caadcf3952c64730d1dc8e61df2788960ec80c5e4ee0ea9d48c2e985464d93fadb12ecaaa1dff5842d78fac76e69a257dbd96f01f0f397c5fe43b2e5ced5d577914aa63bc58fd5374d8c36d1f2d02318afd9b903acdcc590b17f8f4179dab52d9fcd9249384664bec47eb90de70b896cfd7150cfed2ce27214dee504d1dca1a15914176f64a432af34d907f7c57c23a94718ece33c347d0e9ada3abc514c29575fa6cc2ae529bd7cf1239a1c1892a0721f38d3da14b3f3bab60a16e482b9cad4160e26e8443763ac8bd6e5e74aff8e4bd869bc10f10bf50af8e70ff9e0a5f49c0ea29e43dc6dc3b2877b81e5f7032b8b2523fc247bacef73c5d96c88f5813503bc1cb8aa482d6c235679d494875e26d467e01a80ff275189cf89d2fe3bdc0acfa0c50ca80206bb739b6a747f8660feac23269dc3060bb9b15850d9e61e36f4445f43e0b9847a4027a8b5e8137eac2176e9800c472aba868f02d6c7cd26f280064a11fb4b5a0878b410f495dcca902dc91d54dc99c7b446875174431fe0cf1c89e3a7a2f9fd21f3bd569f044814cd7217414d853787a9881eb6c1c25ad60d4843de8d8e31e8671f880c2db9f1c7b49ce607b2acbcc4eab9c9c537dc0a713d81c87d2c038fa6487ab884293d466dd61cb9b32ca97619f85a2cef5ee6ab3ce0578c521ba96fa13683d36109f4d271b26006d624021ff162f79ca79f78b9b3964813efc4e65e83c1c94d255877027dca156203315d06d5ab00bd808208b25fbfc1d3c8c050d8a86ac9aa438d4a72dc9d8b3fbccd00b7514103e3fcaf2d21abcd63505f866f6a89a1f35f3e20d59038ad5014556f93cddec58fc49e6f4c84126f8b2e269fa890c1f7d4f097bbaed6fc6a02647f819ca6e898f2c3c85afd564df6c7a1b07472c7dbececf2c2a63cd3a253f0c49dbb71df094bdb661cea962498f3a77f8f9d748c21f1b9da51791602c51bc9992265b9d2bb4ea8100ea6cd5b9df688fc1683246a4e96ba1bc6bcb0e0cef1eb76c028db2e7921f77610080987c7600acbd7bde8cebc5c7c3b84e9a3fa4aa6e4d1d97d6c4ebd6647fcb396b115afe09b5355b65845f5a36ebe3e7855bba27b342ee0cbd3b0027bf8188bdb7aa1b1c8c92712f4f95c751c001835f14ca1711f580278acb7fee2d3a66deb3ebca867a902bb9202226ed516dede1ddcff5830e3dee103886f87d91dc14164390d865c01d68555668a197034697458a3f42c5c69274f13f780e74fbad7477972d3e7e963b318cf8a86d8e0e52e7f68eeb1aa7e3fcfa11c6292a9d12b66e4bd44a6399a2f36ea82f6bf29a1c9ac63e105be6ef0a8368b9f620b2be7ffeebd82570af808f4c07ef22389882d2241a6338180c66e530a631f7e510a0ea8dd168b0258afa034fe4aafa97c710dafacdae2fa9f6d41c0a9dc1f000aa0bf96c0a419df45ccea603ed20de10e70adc24c5671d960a01571933b109faeac757a27cab15628dc522700b9bf72c60397fa8ecd62a68b2b43d6651486c59379baa3711f040f985a71c9e24616c729a656c9028437ca655b776f8e0cf3ea8f8509b34af574540ad3c3f9621bb666bfe564be463f53ed85ad0abd8c68eaa6c97aed1a040274cbf6b4b305febf10d9df2d3c3aa843596872bc8840cedcdd52f7b7df583aba97fff289e9a01684b8892dfa67cec734bac3a2f66a89e3bd4ea780c85aee6d82504874dfb2385821100d22e951fb1187fa979ce74c0959aea0fd0b28ea5d0afe203df402b73f2208a9ce3456954025b18b5cc70b873faf1596cbed55f8149182aa5906bf633502aff854f8ee9c2e62460f7bc7dfc6ad427672bcaddc1eb59fb43112135230ba787b8e29e6fdf12655b9d98d05d064c2b265d717c327c8b094076701a057ca20021fddc565211eb87e818bf91799ec208d583695d3c580860cf0bea0445c7a162df169b019e49f655b3199585378e74721c2038f4641d0b66904aa6665ccdafd6a94a4626bb4ddbd6a4e84236009d0971e37d09c910923b246c7bcdc8b256756367e3064e11e54112a4cced2c3d922a0d12e30265a98041a149e586b2af2a9b110127020008dbd012990fbfed54367e4f92984b4f98afc4e611d1faadbb10c8e8605f63c408f631dd6df7df03af51ae3e49e40d0f44e76df9aa8751403ed1a4f16ad2502279fd0c7b06cd75f6b4ab61e22011702e14f0e4e4fe4fb2f4a035d83308caf2a3c3b908f54ed8ab4ccd0b4044ff669b337291d0aff371455049040cb6238d70ce4ef2ce522b62a78f613af26bcf2ab7a6c594d960733434dca106e783a164f32c826f069a87b19146d701205f76a6eb1074bfa80165e2a420110312a16c97a343c8fa57d6490e92fa99267229de2260f8e9dbe599b0c1bfa5ffc235186a6ea79e8659690d59c1d2320e718fd0ede53de68baf38313e1aadf2d40cf7f1853128c22555e5479f1278769eac205c8d39ab62c20547d0f634968ff9a90033a3274d390eb6738c0249ac4eb19dccd6a564d2f5f6a3bd7ec059a105d461f9e6ae993f8aa844bae56dad9843af0e3c451dafd9268f52404384cff6dbcffc8a138dcf253d5ac76359c58761dc01c518b1dd62e97ef5da78282adfbe9951415ac1281128da8e0615f1f31f32a20d8a0723ccc5298491030f349bd121c8c1f912f867a770eaabca79b4dfbd311c3c27b1a1d420c2c0c995aa70bded46ef89ec59c032d824f519db37aa71a986d2f662bf36dcbadbba0657f4e2797b569610e2d82271ee6d813f01f6db922a5a4ca405d9e7cddc9dfbb1129294b8c27845bea337250c2f721887045e50288ad513acd6a6be8dce300a308e2f8e600bd585fbf61dd2ebe45c4158ab18101c0f1eae789ecfc205d8bb6fed9371d65a9e94dd2fa5322ff75452851abfcc2357025ea56e24fbfb1d4266b34ee900768fc3dfd6c2761f4716c97d6a36092192c0abbc81f832d372be535b5dbd578576e6c2dbf61d328c1f3189047a124ec0643e5161c87d8eff2ece54bff5a1a7a8dc46e2b2c8a6a120c131dd103d175951a1bb3d740565012637368dbd03629f10b2996c8cd1c68a8434fc0dc93aadf17b511eb81ebd1753f096df467a1068086600c6a8909be5b660807c6156f93ddde67d4f08877afd4c0752b0c721a31aa951ccb5dee7ad6cee5bae9721e0022de63b2d3575d6c37eb410739057d845e24c7a204e56b88fc1f81dc437948edee7d42267ba4934210252b6026940c77d27b7880379572cca4e9c4fcd43038914d16f4235c5cac81bf1ef9e0622c818d352b3247e1e2b6be57aa499cea3b6f82c557e449e3f42bb39b4537387a338f0cfc908f69725189c68acd6a2d13ff504aedacbcfab0ef73403b146db8ed4d87afaf57ea5587667e8db4efc13ddff08d523c81c8c621b325c0251907e219defdbdb3edddac9f96076c7c7dc93fbcb369213863a23cd4e3a5abdfcf8064be6c73efb0dec3cf1974a6fb47f3fcb328bc964047eed3bf48f5957bc1b48181197a6c9e0c87474d8366ffa28deec628a2707728017fc7cddc7d57b8814465f7d98d5a414d93d2986bf1540ad4cad010b8739e50eb9319092dcf7eda851bb8096d19cf81fa60f04041b8568ca314850be93a6e437cc521c1bb807d6a4386e26642a42ed8799b2ad5930079b08f586f6aa34989881b828cb7e414d5d053329f7f08c11aad618edcb8de8e201ed002f9cd750552876e67b42c56110ab52a9b29b41dd4f58938d8a06a92a60c103ba0be94ed026bd9ebc132cf8ff9ae71302d2bb5f07451e475f4f08b3ddc704d28ce186169d537f80a3b72f1d03313ad1a551ff53f03b2579f60576b6eb60f1e1dc7b1a379d2495a40431f33e541ecc12fcf70e24827894b1ba74fbb73b73b1b8139f4ebabae1289245472162dca9c4616e8c91daa346947813633dc0b5486bdf9a16caa6dbd15fd3d0c2619282194b4363d72f7e3deb4d54699be4d8412648dfd7a83503e83d63ee0b695ad52eb8884243a1911737b0e6d024e59908c757703e341c38dac86d5b6b6006b533c8cca4e577b25ead79dd8871ac0704572f210a87183c7a3265a970d3365f19b4399ec6b465d23f49ebba5ac169c9cccd61cd3e3febcea413a639caacf43e2f616776173876c9dcf1758f8547c4f5997246a236f0149b5d857364908104699f413b9cbff8125edcb0ffa3308b2351154fc4ea1721fd6b4e91b474ebd7cda8105c9d57e57da25be88b713f8416efa7e66bc4eb0c5b0d061e3e51af0238b7c52bbb76f0b14d8c86a78cb3aba96f91bdb4ce2fef3a25ac337695335efe2b2a869765acaf4cf23aa7c2baad2fc61e6f5b2881eb3ccc0742bcfe9c40c806398eb5fc6229dcdef41288e01d481303acf34be98be21ae88937675d5d613743e84b1804bbd3bf8ed97ef0aabe6a9e89a08454a0f4fad3b734f4fd3ce07ff1dcc3c978557794a0852be5a6c7a4fc198082893df5c51dae608fdf45422b803ffa4f719c979e53c6eb71af73e0d7e7cc10db6ccf8f0532f20b23610918484e69c516a94e7339f87ae734431f9d6011ff5f3194d217bc21e8e276e30f653fcfb7649fda54904f6a04a1fb0b72a54664fa980f690e34f2d2d80a12cb20d216ed7100726d7798e893ac424e6e34a191c704e1fa534a8fb02c09ae7f820407d78edec018c87f300c5abaf2b5d42c384a2167627cba50d0fd19c5f4437183ab8a9c47cd18553402c4a775d8b9a52313785c69451c06e69ee2815204e8ff656635fef44efa7b5eb61762261de14ae1da235f53af639fd5a1664af907f69371e2e29c2d6c47a1c4f40e7415e8b6292e3453126dcad7eee482915d0225f39770c4985e3a4f86312f63b0c38a62bfabd2c9115dfebe0259dde96ba2b58569722bb7602c621e3f9267ab0538cdb384389442642850b36c49867dfd015a50df8c676141eeef02fa2c347515bb25028d393d47555ba9d09b27a9e74e6338adde4def6a438c272240675e69e935dc776314957febde523d19590ccf66ae98c5ed1d8a7b6eee53a798abac2e888c383c8d3364932e9993236e4978db4eccc2c09464ff3ccbfdbab88b60e76dfaaa827693fc722a2675b3aa205db4b60da3fec55b8a1754619fa67ea0eed7cd48750150fed987eddc58fcf9b9ff8a06ab1d94fccbf79a6c38bd5d205fbd44f779d7fff054316a84572cb439c196c0743121cb8e6b13502b594028c75035f69295b7c27e206ce4969fd72491be8a1fa7a696eda3c347003acb0e4f9bfcbfb447a5fc9323e7f1bdcbbd43942a3a426f48126640625cf9744096111ac3eac148beaf90ba06332abdcdb8564b2bbc2878fe7e780df4bd9372e6c32fd168a2a5789ebe5a7f518b7eab4198fa93bdcda30172f1b49b816e7bc3d45952bbb1add10d8fd7422a29785551d26616b208f41bd44b73023430f81b2fb1606121c792afcf3b043002b8811875262991f133b9f8b7320c4a1e29e2d97d25e1444bd1d9a585474c0c50262e2de0e5e9559867a4a373cfc574a295b41f77dae2e381f80b1df95eb8be5c9b07fd5ab8ae49efcb3e82d0c9a568089cf754e3756e260b64af7ef1264e2f6e3e95f0ab4781553e880efe95c9b40f986532df8aa18af5303c4d3036471845ce375f6f9a396961ccc59c808c76fb4f9a19ed2a340440383aa96d9b906a1ee9c4afede0f0366f55e2ab716e7b79811155dfb19ca84697d76fd29827c637670497cec8ac75e89a19c86214312b794f3e12e0049db01098ba18e0553ca255fb7c90bb773cf1f4f296c6110d32641f6bbc19437195120a49c97cfa2d42ea6de23bf79f82f72c057fb224e0e5d8ed13df75b2317dec97dbb4ede549a7a16726242714a17244edc14a5629f8238a90fcb34f25d2b20b072be10c99f44bc1e129ca2a2eeace8dfed05a6b1e814fb21382ed34b94d97582aa4d60fe124a10a201ddc2b8ea11e3925dbb7d74ba2f2b73f4e970bb7cbb43cc8ec9ddf050132e5ebab60117defebb02b8a6a84f8849301dc08b8bc67739220a8ab3e624db285b80b7b60c641fcbb59d8847a586d4fbaf8b258592e116eb86a938abf82016022ec4934e33122ef199ef372ef3df12aef0488e4814bfde3ae8451302a26683292ea6b7ef23a6af08ae646fbd21ace3dbb8d285738fa73fbfdd4aa478636cb515c19390394c95f29989a97c82ad64ab1a5fb58578623bade2cc46674dc9972e408e07d68d1c64bbfca20af80ff5baeae36b6e18c74ae1bb3c3ba4c613339a5141fa9fd58b11974dda8e156cc5990425bf4268ba00984dea24b2025b693fdac0928db82793dab23a9bb455354415d4de169b31d384e8b4bd54b5db91a05cdceeaabddd4737c629f4b8ab570bfbeaa19681dc661ff49aca9714bd9d0368f9155df3019bbef772732ec9e9773b6d95fec1797c51d9a04d042a1d3fc32b23c31871240f6ff9534e322b47d5425e099650f165f1a1ab487dd5c8b6c2ea6351196ada862dc670cbd7cb8cab1554ee606a2ca8efd2b20f3d8bd40579dd7f66718a60ecc1f33bdfd1adc3c57c201b66f28ff64a7f962f7ff0156362eef5fe8f2584af4a4fe64c70f51e9f68236bf242408642788dc2666810a928538e92e457bd96ba55887d54eeb6c8d2d7497f962acadba595a2ede3621f957779c13acd4ada4ef6a1142ef193872ae2b546c1636b11fe7434475f42f86d88f5283f5425f2dc0c08bf7b81af29f6c36364b3e7e69d867d52d6f3bcf1959ae215f141856aca635c4503170bf9fc8610c97819498c3cb8c6a5e0207d7bc4184f5e678035285be0ce501e8f244e95a5918961df6ce0b32969020266274e0e761f32fd63e9cb01d4c09e543c71398fe5d427a48ec870bb48e2eb903d30e4cf24d038157529ef56cfd1a456b7692745b73728d29ff2c89fa7b2c72c0e20dc90b510d2623c6be1e5327ff6987872b441aa69015e9b6234eac6571938617d91fda73f964612266f179d3a099c08345d2e2fb845baf9ad5227154e7647cfbda1606bdaf8439effd388709e51d3ef147e45c7c36a7a432aaccf151752dcb157975383717cdd4b3ebb924cfb63c28599b432f308f41ef060b16d56303359aed1c0617e81a895af9973df92ffb40a643a8b7041f7570ba9e5ec6c5937ac5120c2d8f4cd89efef3466b8bae309c6fe238d6088352d17d2a830ca568e8c0255bf912d97e0f8c76c524ce6deada811201bf8dfd53d08cb0693c7e7b676abe9d9c3c35ac5696cd37fb1a28a9553693702e61355f1da18c519f511b1069215c75fd5efcd07c744789bbb1e208984bb8d38fa536f688cebba8f34a4a2b171683f4a7e6d10c97b1e4b62d6f62525b22d9814c13f98a3d5e00fd8eb0759619501963c25c1b294f568b057bdf114f45c1dfc38e33e4e3e3594297980b031716d7070a754941f04e6924bdca8657c6ff32b0e17d8e60c823c86bbf38e15c77b7b43631e934ad2639f5962745ee9d81317d362340abd603a5b262bd96bce87da3ee8d2046a5c696bbffcb8b119e494682a857d10012ac5a101f0fd9db230ef3828df31eb324f4077a91aa31591ec5de9abdfd32e44c4c960d175a5b2f9f399ffe9a5275583a9f401eb21b6043f7771122c30f8f15e01c7f43a32b8ab9b7ce4bbd1b916b5e6e2f0a506b0661f7b0c9a6c2c37530ba5686dc5bca6aafa2f336bd671b9849ed490c2db8c3537d9ed1226721c4175dfc37f077fc95ff1211dbd9bea59f4f572c529f71fdc2ebf960e2e91ae8cedd5e030ac416cf0ad2fb2ff81f151fb19edc44114e9ec770b420646c8888bee9af7af65769827b34ccb224d1718c7c586d225d0e827bc0d69739d3f766794c1e75fbfda74783a918d37e17ee35e9649da46f9dd2a4d18efb7c8bd409ebb53a7417274280c6e001c0d0a930d8d5f581862b0c2fe41a68d9e74c5f902c7f032ff47d47ea6d4e632a33ac799916b778781eea4139cc4e084aa3edfd2fe78a2cd3a58fa220f347d2cd794d377730453af46ac955e413a679883649add8c274f9cf8f36820a9c19f6919b9d2af5afe5029b74b19257408c823ca847b7b346a52fcbba582dd0ef2c971fa0839c381a01991543883ebbdb67ed0e02ce62e9fa86996e2fdeec9b74e97d1e90e6d36bf900c80bdf38a2376c9f80a54bc8f8a2677dfe61f5b10793b4b66f3773b018b4d54a552551a706f47c9c04aa8b1cbf0513f3254c14b7c6df36fc361252c8b33b3447080aa0bfb11992c540c4cab2003b8851d7d595da71a882249a563416ec29a15fab63d466edcf3784fe9c1172026b4efddca77f014f15219463ac22820ba6a1fa04d7f686003ef24004da67440fbeeb61fc68da14a94f9ab659bb23f457d9be80dd0f0c06338d4b621b25d5106d5ce9e3ffc1aefac77d75f1442c3f5419eb7f59fcb221cecee5 MD = 2714b6e51ac7b317efdbfce1441dce76e98f3198b495651fa33b2c90479c15b8ae7811b203a739d3e809c2e28a4e1f95 Len = 88144 Msg = 19591e3006d32cd4f5b0d74e5181fb61dfc3ae159664bc5db08354f6017800928814da364429fee1484d3b6e12dc0ebb193cd00ba5652ea9e3a0dacf398e80c5d76dfc4d8f97ca3fe64bbd716bb0f4d947170bf616818e6bf561b3eedca348602fecea3d8f247837f632c71e0306970392ddc69d90c0c4ec0e4e471b93bc40abb71a0dceedd8f011a188c03e83e5de8122156bc9bc2bb87154f0fe2006e350ee987ecdc851bb1a150ed710999256b19a1e47614241c95345f2ce41c4dc1f6070f9a193f262d6de8b66a61ef7d960f898aefc10d0c9a37baf0e7176cebe79587a0309c515c93025bad07e5420ff0b9bc1fcbae03bf9bf19f6d15f070753f72054dd40cdf92ed1d5eb75e619dbad5f835e2d0c394a7b27166362225a3744a4a046b1ce116637c2d8667c66d5f28b6596b66c7783c7f7e3583ee942d9263885c198a439fb248f0a14730e86f12b4024bd13df85267814f9c9cf9045ea9bd8a46991e00bf1fadcb1735a53cfd34f75a4e1bbaebd8a257b73505d7db5f75fcc08817a8dcb5db2c7c0dc6272c8e426d1eee8f702a71798d458d432d819673bbbb9f29bd202a612f73e36d494fa8c77fd09bc0f03cc3698c6b13f94cafaa2f44dc0a23cd83734e315336bf8e0eb340ca0fd434bd8b34decf98578cc7bdf10552b247ba5c7f26fecc8a862167f2542ab63d367f3aae5c65d16dc672112501925fded641ec6bcbff7b9a303769830201dee920e4ea0e807b3c5bff4ddb7d5252b6a2344eefd1b8cca8f2f366054923429e84222a5e3467ab6ad34074694f79c301bcf055e95993e2ff351e31bdbd5e899faec8a409a86852d774688a6ce3de6fcb8f98eb6b6be3deb8d13f2f05480a334cb972e67ee3192e2cafa5f4390306b57e8a7c73e8711f1c9047c4b27e71cccc1044bf66207ce089b4f5a74660056930953e3983d311ac3900194d708be30cd094c10ca780ce54f21ae6daf56463ac7d9a2b4e9fddb6119072b647cdafe440dd44cef92f325ffcf3c8e3bf95d8b616d917d23a2c4ae6f5cf82bf323e7d2e1f4e9abef36197ca3efb397cd38c1f755eff78b36abdbd2cbf529a84ab575608eea1212199e3336591a50722a56cbb19db3d475f7ec8a6efd4a624b6f18cdd0d357152973b3887ea9b5d9c75a39c3e2c123efe26e4e18ab8ec56dbc6c36374b38a3bb97085b627a1c29173d66cbf1b149a5127ba2b7cfb005cd11a249f5faf94636cc05dd7f075239ded27d55f29c47bea303e89b10f5a6eac915a50c3f60018479101afc08c02f883cd22f2f980ecba8848bd06142d3b4c623426ebffbaf8b7ad24f7f6cdcd53992acdefafda48d668db072dcfd34b1031f4260a5691130c1b1aa50db35e58e97de94c086c6fe6240f78f80b376cdd7ba808e37f213682bc9b06adcd760093372f55d3e7c928ed5806d897dfdd4f78c026e6f8efbc4eae8cbff78bb1bf3320bf15d702184693c2d4f780630641f991903734d2e6b847eaef0273eb54ef9475f3da033304554f0b4d49f6e628e609ac6e41690e0e85b0cc75faf2291187730777d451035685a92b0386a29db239fe4dbcee0a06a1a527d79411f8e192377d59bdad56ef694840a6aa2619f63cce25ea0e857e694ab70b70dbe00e91314001e137cd7b53d72d9402a3b0d38c23133f05d5b05c82840bea3cbfdd99b48961bf3268ad34cd0aa611c382af55dbff99982594e72afec844229fa27320c804fcf3c1e2c529d77e32487db98a17424cc1dfcddea2404aa1c0632e36393a483e724e1418cdb0ffcc52b675cad9ae7b754c5463156a52d28b312a4cfda85cb180722cad8cff60a26fa7da60390671c41369b499dbb7d942fef6c6904b48fe90957d2df2a202bf6bc27222a186a907d891da7eb6941329f86781e67cb183a661c7e3b0981a5033c87f723dde3629e7059aff015dc0f4eb8f7f730886b2e0daa1a25652e238605424f0f87a5aca1185f77947eb03f4e59464814a8b22e1f901dcaf3593759ecba71db1a566cba4f86b1ac7559a2da25d9b1427690cf5a134b27f6911e0d6bffa831f5be9819569370cec0fa8ad5f5bd5860adc6efc63831c73164a6bc96a1e659eb63a35694c8955f1e7bca182fd83e5dbd51abce7f10a28ba1dddb3cbc43ca5505ee7298c5587edb09a58e0b9acbcf712ff5ce34e22a8e1fe129d8a56698d222e95ed364944e766af705ed6bfd15981b1e63d629d7cd1c0c571044ff7ce9274afd7b6dc4e9f1a496506490413fffc2e3f2616cb6464274d96d5ac753e57ef055ab0de9bfac8a31e67c8a1e944ad1755114b838e117d2bf0e8ace0aa88b9f56c95adbee5dc56144e2e33f406d05d3d8eeea30e1b432c225341536b5065594813071ae25a71cbe0613ed4b9ed3584c1441dd9010377f5dcdd2785870752ba498115a4e36a499e99f000375dfce2b8650d256a26c71e7eae0701afce1fef519c3f57c83c85d252936328b86ac6666c7b52abb2c9e6a50b0859663ecb3a89b392c633f1583d8a6c8f32fef47aca4f2586bd075f74d2aa4f8e5cdbbef8c7c064df8e30bcb111f060cff81957d888fb581994cedcb22bac90a279c8acc15801c9c52fd486e173a2b3e82afe7f3e730988968278a6fc521a92e758c384cf5bec670603a5ec6402fffa5a3424b70728d83baffe8b3addd672aacf4242d37d43eed0f4a21b69b3108688b8bc12bbbd1b05f5a8717d24b129536cbceecd2555c0777c2393bb6b595cd503662b4ee9daba112b2273d4e120eb1b4d52b6c8d6d33204ed1550ec7dc12849eef4fa4fcdea866860a08e18fca76c68b10322dc74901945884c52452d750373afe7a18bd467109a1aa518bfd3bf5d9a5c50cb6e9af6f687f23b205bd6ff8ed0bab0c98999cae924dd92bc3002c31f4e93be08f596824a6a9f54337716cb2affb3e2dacf8aa060771e0be120067d21e3fbcd741813cc956c043a144d7962584f1fe04dd42362272f50731ff65b281608f8e1953c8f2067eab55f3b456b4fa74d635bab2df09aadac096ac1397d6e6c1c1facd4d955482285273620d5590d987902976b437eb4548bcd559d4fe9ba849be481cb85228e65b9de516d93ef068c608226169b2a49bc3d00c5ecc02c86f006cc02d1a6637d92074f2369f789d5238266aa35bb9fb5553e482e3830c27e5efb4aa29fe3949047ebfe4eae86b5f3de5d3486312b2b91b00e1801180827eb01d7e4d37e933260f7d66015c3b7ffdd2d6f503c91507a694d3ad4e0f4bce967892b3f28065bc95a1255192b1201c41b81275e4ffec1e8a69d33134066c5637e65739e12bf93c5f627f69de141faaf197a13c332a1f612d4209557a1e6b8428a173fa62612e1b4cfc92942fabc191d6198c313875363657c57b02677ed1bf3352eeddbd4a8ac1241466bbcb9e8d39b8e4da3b3a06ba07cf9d331e444f266e1ea1d1c9390d9796af5504c7fb160c0b5fa093448305333b5e70399259b8f0fbb23523a81fd3dd03b564739e073bc46d92f6c033599b273acce79347eee2b9cdb7b7ec61b7c3e36efdecbb2a37343fc81b8d68f005f0206ce1a94b244bf5084cf5ce34dc490631405093e551d32a0585c00f9362ce2ba539645f6910b81866e0342304011dc34fe27601f8fd22449c0a4a214973fe743f091fb0f3f57c735af13b5e63b87b23c6ba37dffc156dab8ec1806d930adcf57444d845f3bae02f6ce7d3265ae9aa4e1c325bd5fa81fc8663102c9b780fafd3cf5258c570472c74242ac423f07cf36bdcb1a98af82917fea1611453016bc039d59b67d97384a8690b22d6fe2d599ea28b9eeaa701f5063bd21b013c3504574d1088cc2903599b37a838d05f1968f31db363e6d31acd10647da6bcfe1cc3bb37077f515c28ae4f0583d27cedbd923901db6765b74d997fa12b6a0a42be90362042e9bc1aea6b0afc255aa05120bdba798c122ffba141991c63cfb6b024540e304a2fd60d52781544153605334ad2bcaa4dcc0b461fada7faad3d86ef55f58c8ea6b767db67bdb804dbd0733944ba88bfa6fdc340cdc5f066911c44a8595df863deeb372c32223a65008eb20e155b66de1f0d1d92b572be8698d4b68239729ad67b320da9b990e58e0bda8958c59f9d304165e2e4df9a578249cda526fc1eb91004f3b3f906edffa7841bc1c05d6d77dc936bdadd512604832d6fd83baa489f380198efc52123d1daf4b822ede4ac3a0a9e88cc2615ff0db1ca23196a4cd89277fa888ab51018a34de21b748862462fe4e8248167330bba33ab4f2e5be8b5dbf5782b4c70ddb6bd28d6ab7f38e0229e8ffba8c247b1345332555de0b589c9c2d902e9fc9f90e3669458d00ba66428cf365f7a556e99611fd552b3f72034fb8e4c212a64e92f89e7b9f1f2df79f94009ff9a040285f37a674528bb3b46f33389755c564af7c48f88be2879c45aa452961236ad9334c56673a962db74cccd59f97d3bd5777056dd91cb86ce82f16f46bc98bbdcce22190f8b2a857d695dcb56278b460fb3fdee5b4a0a9257e1e56104c4b9affb7df8f65cf7f01b08e39ff3105bc8066dc54693f1fba1d47da9df8275f69c9c71665d6535fe22ace4aa3a4f70dd5b025577f24d87ebb8d4a8a186db7f996a09a652fa6c82eae8be7886d7e75ef46dc2308faa240563781b419283730bf74a7f020877162b016bdb2e3f1ec1c3e926cf67d6152153ab0830ae447d5302566585ed527b68198cd38a6d9cb6e78504adb06014dc4b590b919b597f1d814affe3a3cff6ae6c32d248549e6648618e8d2bed8511a6ab00cb3be5a80b0b07cd3aeb6110bdb9295f1df1bf27657b35c4ccc70f3d941c472e322d9505afeeed714ea548186f44a789b3f6557161f86d1109aa9def67e629cc899033d7346e3920853adf4fd4f6ef96dd809ee42266115c8bfb1f0550ab59c3188b47866334f5c125d2ae1eb3780870e3b721e86f6e278d9be31ee61813ddf927475a7a02e8283c77943eebd671fafd0dc266e612b8b98b818a21fa87c8bf58feecf31ad932db79c3a9161f038ace27a3c9f544d1ebce408517b0a9646f07c7e5a19bd0b2b8155f5139bf23036b8bd4ecf6576c75af6f93efb3535b79b3bb2d238ed9045325ded8686bbf5e9ebb39ee316f13c4c6aea36c068593788c39e57401dc351c851f3ecc5167a0379b23e15cba5cb1b68b8d72b313b6f76866ac8c83c7b33781104e3e215556e918c44a8906cfe6b9a98ef7e4505e6d0893cfb2b942bd3a689bbc5ce5c0ba602368dfd93cd4b835b4059592022c2fd34c628ef373992a9a4fd251ee3c91c8acd58eb577ffaebc702a316906d32dce104d3b6d19c27058fa758f96af497cc96387f40ecddc7c25bfa197d2fc5f3c824b938732c9aeaf8d8360385444166a03acc201b282da26394ba39e971caf4295aca4afa6ad403e125d9a375358ab41bfb00c1d683f0194413cb7ae820dca254d5c0a19916d7f052fafabf25b910eeb4596f0b0f9ac5aaf84ba662f5978b8cff3834d2fbbb174ed2ba119d33497494edd87f3222e70ec5d4cec3689e5048226ce48f358eb2025dc505d6e40a5136454cfab9fdccd34c087dffab125ee5a2f1428d486fbeb629cbbe40831a378ad65e462297b449e9fdc16860d5f693c21c780474f8e828120e17330cdeb63730c56e5e02a0fc36b5a4af0894dc7be9602535174e091547602faea7cd223e85fd93e418fd5e4c2fa0c12ff30e1718dc5a5da71f7af19d991aff10a103f619a03bb26dfb85381a7145e3a29c3f1e53c92b164c718e5ad799cd0ceba333d2ee1295b15a7a2cb6edb81f8cc5889a7ac35c2cffa3b1faad69c5d0c97e12ef4102597601381976634c70981cf73cb294dde20a6a2b553251aaa9e0c5669498b91ce16732955dd4c5ad274a24c62d19f50a173df661dfe7f040b25771239cc2a39446e3c5d0bbda4686389024a0de3323ee582214e5b66df1927baf6d439fffb8fef6762b98b7f96e7e4114ad15c49099d1116156158d36ee3672731a3512a231b38c98e45bd6b4c5ebcd521ea374a4ef88ff762a7fa8f54e93133cf876994cd65855b67088ac9eb55539a309b863026d4c6edb1282ae1b8b3eea5798869861ff63fe6960ad8e09e54112b1eee3141bbbb1ec0aaedd110c2ca0746d6af39484155cf32c25391f98be45e4f94eb20c63534ff37f4fdd5659cb5e2de8f03c2225c0a9b0794ec9b5cda8ca2cd3a993b06bcc8d11c386020286bfce9354b8cea5c989e0d2db4dce051b4d5456eb7006b4b76fdfc351d1f98a15a288312b3539a3d1c988c6bc92b46204146affab42896db8e5ee84b4c4127178ec0173e6e5fbb0e11807f8b7be1b710a8674839d81aa5ff2a70fe256cceb4d4324c0f8225b933189edf505374071a6a12c079f2ccdd81ff73bda48d26cf261e6c54d2a48067eca0ec3b668c59a55677a6daa8ef3779102390cc4349224b673e6461c86c2673ccf1231f29fed5c1557c8d3c3ff6c2f73cb3a9254422074a5e7c44fa59a4c0e4bd526a1001708e65fec4ee6ea4d0155eecf6e8510de07ed4f31f31a8ed12f5c3a60ae99856ab2c983996f2f94145d7b6083573d7084b2ef20e7155f2ec806e176e62c93e90785863ee39c0647c1cb00777b8723f9c2ac0ab97b8d860beb4d3e8ffa2328a179dbacc05f68237bf1f4a5a23c70e123047db08763de27acb76cb3f40124b0554e2f9de67155dfb71144ab6f3aa6ed62e68280f944899c97c90fe2319f93d36ad11bd9efade7b37f9c45b24cfa8bc16fd564ecad72028d437c8159c72a12fa68bf0b016a7980473c1f723ab9f0b1d5705d9f641280fb52365e8b8b233504adb5749784d578d203730744a534b19bb23aeb8c87b705b693f6fb68e6e454fb65f77e2bd4bf003f50cae057924bc1bbe0160bd6b80954d6bafbbfb40d78ee69aba558328195b43ae79a3705827d8584e7a83ae8858812de4fbb37e75f5f75c1e7257f660be81957107777e8e63881a91157f54c60c1a43fbacbe09d6d168fb6c11e7020e424940663c93f7c4e0b5a7b25abc77cea24ad6d94943620b72ca09a91f6c6edaae9a8eb7a35da3a1a74549d7d1a3df4725f730a55aac52bbe103cf00224e036b095ec589c13e4acebf224529039a53da9a0b97886860a18e24fd9597a4f4896a5b7c2e07209fb3f23032e6cf770a9d2f0b6d54aafac7172e459ea3962cc8c87eacdc115647e6a7b6035f73f1b55c83ed7f05af3298497c404bd04026433187500566b6a1be7deec23f8f33b946f6cebdffbbef48ca4e976f3f7ab56f6f9790886d02640e0eca50bdecac6f4db142464692775e16193e316028844b983b62a9cded9865c5be37954f139d70d57ea6b231402142c10c8112be0ed547c92cfb9bc78c10ffef562a8421bb4a7b7a368cdb2511a1e4742c7f022ffa57f42cccc82d1f52527bb45e0de6dbec9bdb63605b8acb0edf8c55ffa1c95bf2f199e6a232297d4746213b5f478325ae78d6ba847b85cb3ec4828c0f4d2eec018b7d2236a2558874d538ade14023a50ac9b6a42a5494ccaa360d42e4ecfb872c0ee906117e7be9e0e50a316a608e060776c14bdb4e8176581e769f04e7f6d67d6025baba2f6148935fddf0840f8beeae6740d71ed11372526506caf9a4e881fb6a7967b91ed04b962cfa12b6b5e40606857a707c451168a0f102ec4b8d9830ae142d3597b28f9df032a9be88ba5ff517b6b93c7c1244ff48acb52c8009d08a9f47884bdb5268e4a95b311c8386c563e9e34366a6a074e0547d66b3227f5637d5e9d3d20d6821c9ca8edc552e81ddfa85f56214825768b3cb4b5ca8b959f3e058e357f1b65b83f35ab3f0911214715ff2d25b6f99a0ea1fb600e034cbfe6f2d311e59d15d93560b61b1b6f7b5a5473d3864799e72e1c0cc1c833a7fe2d692c5678124998a7862b8e87276b0a19e293a609103c99583b36305bcb2b08549245102f3ff72c5726ea3f5dd78e35e65ddfe7043401a8bef8b8c7a9390f03dbfec780b5e318497e9447393da03b972642b32736179b7db8c10ee81f01b6690a0b3e389a903f68745aad1c751605a6701dd7e6ed3f7c80dc10a3225bb9c3b0854413984bcbdf11eee69659b2ad8edc5a6b9896b81ff76aaf840ff6bdc5b962d435e23057fa79ce24c49d6164db19b12ba89fc7153dce839987bfe5d3ba0a086d6d24912da08205dc711cd40a3338bd8a5137e8931d448420983d702c1b3809b736452b6b52aa417c88bf12212a8e69ece20b8ba0331bb4db220316254db5ff484dee7f6f8535197b57debc38356d3ed9f77520cb1396be3fd1ab486dd62651a6f06afdc8bcc4f65f8b0622cdf867b4c7fe2f3872335808b51380975458eb9949ea5536f56ddc509f7ecff630c810543d6274334416c22ce1643d83772a884ea77827ab741cddb0b1cf86a72f48c9a5a0d0fec1af4287733b504c8d54ef7eda56467cdbd35e6bbf4ce9e4a607df2621a8a62934122afaa4294408256c0c51d4ccb1af388186e8a4c74a4473691f9840ab6e8e3b2b44be1831cc2aec2af583c6716649520d4ae739978d30afb17eb29b3f96881749341447fb551f32205fa717eac0d5b8e4fee9c6541f33bb7f70e789bbcac188fa5dcfdbdc8b4f97da9f0e41af5ddecd973762d3737cc827319ab9a4c657a4e0cd46331c5bbb469db8385bec2599cf109268d4f98c22585366509b64e5e9bcbf2071d0b20f819eb447b0027ff40111127527c290f4ac8ef08c372f5270dd738492653b055e5ab26c179a846581205f53ade8ce524377b66f11b2c7f61dcf53d1a184e4becec31c35965c744553740454ab202a85ff10792fa55807b8332bf816cc753026e7475691527a3487e188aa860b6299d49e0341d2a59b6111676fbad471aadfd62e43dc1fba7847b5c1babc682d248e9696dc9ac8a0f166ba1127268b3f9a26550a6527316ceb40576a96a48bbeea6b747fe90ea205fe8aeac6dec5bb94c7c62c0217c266b827a0d542b90d610f28c2d6cfd4f7cf6327305c0ef312e60fb811b3bbd828204ac1dbb7f07e5178bc642735fd0cf0d146e009664000888b1effab948e22e31e835e6387ea731b4335210b2a8e1d84380fdd78920083a11b20e2e6370f846d81f031dacd9713c54107f3e12d09632c644c540077c6f90726d4167423a679322b2000a3f19cfcea02b3313ba5e59a43f68b08338019dcf53ea71eb7e2e98ddb4a812f417c528ae408b57d8d3da91f756f2a5e74336fbc25b3084043ed4f1ec390923255f65e3a5db38d4d684cda5f3b2ec8bb550a3ef30334764f7aab5db8757dd1ae33d826a7b193b9052f6beff60fc5d4c3689d1e2e08337f70fec58bf78b62ddf77d9a324f8a49b759750350606db4ecfaf14473d9bf208279329450385ff005a295c5079e321606aecbbba22adf8c6fc6b198d662928c3daca8c051177da5f7340ee11d1063b9356985fd6bb1cfacdbbb1c12cc752ce70fafd3a1f4f15ee511206b66f9427983b23e46310391c8a6bf4c833abc6de8c156e755e1b2729e4de1fc1ddf12a0fe060b818f0f1057550a98ff99892cd9409bc1e771e820079630e82ba8a20fc86bc0afd7c2d0085eff38e748c186a433dee6cf24ea2db41cf14ea2339e6827054d442da5743c522511c238cc9daba90a1e22ed24113ae54f19f79ea8519a1ef40cf0f37f359c84465726fbdf7070a1b888e09a6979984a0a7abc4c0e84a05e213557afc96989254f19e7af060c6e34eba990556995be38dbbe0d18ba8a234af95108a118928aab8be474c0e4a40cb90feac2aca8f825683f3e8aa350e48b8c08ea5475e143098da9416eefdfe9d4c4a1e6f81ebc13562ea196857a46264197bc6bfb9cc7ed8e5213bb367a7c404eee2e089119f769d912af30bdec2ec20dd4a0504e941114a18f47ac5bff2e39d38c10da3e2cff7e26aab4a764975f3a28e94121cdea613abb9bd1af4fec8a591b24f6d64fd648d2b75d6e554a0a7c112b3c0b6b0a0e4cd2650e3e4ea2d105008e4f4c77569447ea03b118e4be93f9c99d538b96838e187e066ce9d4c54b22d295719e47d2e59126b43c50b032e25cd5f7b63e3ebad87890482e510c57995841d92248d25558993b1155b252676419c8b2da9fbe207bd1ab82d9204fba6a39d0c1d7f8815e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d81909df4e6df785439c9504631bb33b7d62619ca8c780d724d4c8d3f36dd347845c1966b61d46c019a72f195b3e98b06dd2dae0bc6cefdc7d228b39ea8da4246f1793a215c856bcae69b4eee58eda15d11f0526005549e4e06397a5a43a032af0e1f50bfe2dabfd7a4ae30f729afbde2f9d5cc7152f2372c70e7aa1b0c184cda231da1ecf8bbaf515c125f5b2d1727bd1d45e6e5b4900f8c999b0a8b0d2ad7f0b8daf551a8108260972fa3c06c0e261705a9666534166f9407bb63504dbf1d1855be1395f9c1812bdb6dc4cfef7a03183a671598d96c9f6c44b17d12d4bd647b8331c561f4b6f4dbb334892fbd4507e743e9bb27ab7be73dd8e3207aab0ef540c99bd15d9fd72397a4ecbb88de5577ada89520b9b2298f2f49bb142fd9981890b0640030040d558838fd22845b949e91f2d50bf7f75fde69219f20da66451493bff41a832b3ed3d6f6cf86c93be8c3bca810468881061d14e7f90e235bfb33707eb4e7fd1a53e6a866caafff863b2d5552ad9716580495572430a4b1bfa4bb50750a2f47db35d426115765cf457425857816c74685438b5b5facab2d9a27f55a2d5fb90876cae57a7edc6fe17f7bf374a3b29ec20fa94a4720d5ea3ef46c29b72d1c4ee9f1fc63c935c396dc3c38df495ae9e332fe201944f0132b8dd65b9f8efda7b69256b2943ebf72a2688493312d2623603d5b8f3f7a55ce34c247dc9e08266ab9aaadd4c2fea3535b2e607430478ec8db8c2ddd0510d96ece8450d76f4d2fcb1edafc49333469cc88d6d7c325c01a401dc77cf4b32f045bc17bf8345b84a034afc94dfb2f069a47f308f26858bf52f4ee9550bb91fe5dfdd55047dba8d6020c321fa7d1009cbd2b626bb84b116dbf4a159eb21ae6a66cbdd2ab45b49e6adbbb708613b3ed1f5ae09ea7315498f1e8ab5c8ba9f9fc4eb9017f33fba88769b6a931a497893db7face6f65656c3474558089043e40191fcd32a591709da9fa183e3d213e3b398b245d9c4d5d792f1e8f2f65b078d786412fb90c6dac7c4e468be25ba60db229c460f5ef062064cf161d22b8385fa78bdb67fc7c6db82ebc7496fd55db0ed4558936fe2e39b6165d8587bf4a43fb966f15fe65bd3c9b9a3badc2f7f167488a04032fe0228d287620925670e27a558d7c187b5b96805da715199538f8f3c3bd7f5ad20393ab7d6b6266119c4a857475f80c6645d1e2073f90df9928312688530fb5a7cf493abddf692840aa480b60342c19488d3409a049f628562f66a99e36fa3c37ad0be3f0b97f016c04a5b422b46065a79a889e30ac8d1b53b65d230d4c88190903a24e1fe1ea191c11282ac1dbdc1b0ed49448c0529ee11823df3dde7f0371a63ad722523ef297d8399b124593e76102a322b0562270a12de0b49f18b5b16f94bb70078fbae1a428e4c417b7c3ca5f0d6ff87dfd044d841b53a4f0c3d8dc385ded35a7e03cfd67957a6ddf1e53ce3fb6a0df58bae07bb269e677d8e8cfcaf78837f0a74cad9009a6635c12822a3826859e9fe9979e43529f00f4018d82c3d29e0367b2dbf3e0b1e4085a59eb32533e03d200d79b27ed8c4508e510bdd911f126b8636e96f73688d5cf2e5c625266afb7a2cacbce61c18ae46810b07dbcfb7da8bdac8384a1d9b60321a2c2ee72b8a12a77c46c3935077103873d87d713c89ead7c0a9aaeda1362f6677c33987a923be2bab863e38b066c2bcd363dd2c6c17bbc5c455b1a882ab43407855967533ca569d16c57d54c07a0e3a2c27b76bd2e3d5dc5246dd29467d5476b85d963e3fe084726a8f1155e5238b36ea8e9cce1570b181f7179dee712edb7f9445e9413208c021f36d9adab2f5a2399b12edb18830e76d3f226446873230a1b898e03cce9582426ddb6a41ae62fbc8ba5f2ac4bfb6efe47701d0efed1a0ca381d11b7f4a39535a264300392bede05ad4cdf4563085239e4b2054493768c7eb7c990b874946abbfb94f0d1fd008f87656d9bb046f0e2ad128287ec0ea80eaf0253b30f3504004098359e1642f56cc81cd2cef5defb48e43aa64b1056b04ee4808321c31e3d7e4be30fe2db49e29a523b41211a1173a966c2e7f8b755d675a5992383dc16860d6543e96227fa1244ad28833b29c99e30b9140d36eaf261ab7bb5f980630726d514208cc9023dcc905f4d60c629edc6026796e0afb0159b17ec3ccfc15fd866fde3e3c1bd74fa57a6f2119f672365314af8b2280811a6cae282966bedd8718eae57f24ee68619fcafeedb0ac81e19272ef2cfacec158e3733c52c95add6bae60ffab6fbee3f8203d3d915679122f1f2d6df543501c5b32a333c6417a9629bb5495397927aa81db4393d267f6a38d5d96b46ab8bef28feea0a6fa7b88883fc4583eafed935c7d3560aa1761af966ad2315b03b765f4657c1dfe65e3ff342c5dce648519ac4a68a336d8e6d00e9b66119fba46cbef928a7f5da2aef7591a5dec39af4f99bd24d2b918b8b73f8e030d90346aaa62a64d5d4cf25c2c4220bb72f42c6765fa505c29fb98c20f0cb86dbfd291d4a51834955c897e536430e087da0a09257ea7f050fccf397d54c4185bfb6d2a90dd5914fb16995450fd60031011a27271e01f37b3c9c87d433ef2282e4ea47127a9b1c1ff0a1116bd4e4c12e4a831dad530ec70f4ff6bc6cc14136285382d17f1a09ec601a57527f0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7b22f4ce72c4c8e9316092c7f3e070f817ad851dc4613fcffaea815706f72d903590b464ff7e4dd627295a7b4b371765ac85e6d7c89e4c2097b83c3a9f44a17f480a547e184777d8121688bed5b812e7d7bf6943ab1421d96fe795f5b51da6ce2f1a457851a2cf456eb2be012805cc1505b47cffe0857940e0033ef6dcf4b5f3572b17e23032bcc4b9886ae0a682db73d2ffa25b0d44bafda49597ec7b4c57955cc74c5a3859d8cc7ef20febf5b1a96aac1b69f395e46f660a1921151486f40aac79433ede9aabd32b9a2d718a34be801d724447fee6ff209d086b2f3d5723e9d2abad1ea7779e6f3beb342fd87e934a93aeb1c6bccee2a3d9dde6895a1f6fb94bf8da68076338f74c6fc46564e1c030ab2b42fe53fec2665d2423c1ff522fef84cb6ba9830ff411c9925eb0b410bdc8c062786d690916fe735593479191ecf329adc151beb068253fed53905a8df479700eb282408048c2d8fcc5b8b5513f6a871a8c0eff06fdd81bfb4392acbbfcc9366a91db9ed6e059da742b63ef129fbc498c2c2fe8763d70ea26bf263f1d4f4e801086e7b87f663a147644f78348767edd9d1232ef70afa6370a26c99634646fe99b1225420c52da035da2d226856c28afa7deb698a8bcde6f000b0b26a3c4b3ef64b412bfe02eb023a4b5825d3bd9205c4702396860fd800ec2ec5984cde890edf7fd4e76ad6262e1e60d967bde561c5ff4fd39d34bda4192ad4b33151558ad71df5e172ac69648ea9c0b7d270f5b63273c50166dcbeb89a74998367c3c9d602795473b30ce23089a313fa4d33161ab4e778b7d8c6399ce990253c20e861f3f5b8458f92d2690f87d303abbf4d7014b32510fcdd3957d9704621e6460a466b1aa56f3ff745288bf00236d012072a2c97f336d95c7f40f69660358ac06fa0c6d8077b8acaae442b2df854742da96deac81a92543ede1b7bc2a4082f765f968a96a51079f355e877a47d069cf87b60d7af62cb78699f10f15edc43dd50245041be48d7125b823af8be59f4525bc42c7ab292894ac60949dfd1ce8d9c3605f772b7b8775fe87d6235e353c59d3ecef85b3a7476d43d66ebcd83438f751049b3a6e9bd9968838d89b77c35218689dfed03b0ce381db7fc2143dc02f16fc639ab64bc1fe53415fcd704efc5b213244033f97a69772d1a1511ca44d55a93401d083498a502cb841073a6a6cc1d4ef739f1c5020ddc0d50f7e3e9238272e8673df19ee5199935ba12862507110d3feb114ff0ae810ec43feac029e1d2e27621e08f2b0b41517a9d4937077c5e28ede6127601e88fb65ad138d011e68d5245574f0a6272e5d3a317ffafd66c791660d1828e8017fd7cd8ec273a299a7b695ef2d389cc82cfc7b80f7a15193f2b80a095aabef6a29407457a0127f96663d0c8d8b234efa4c6d3bf6c0492595c3c0eb618d22feaf31c00a9620cbe0ab00f2f8bf33434553e91a2c218e34e1d2d7467a9444209e4715d0e0c8c9128e3e1452db029a3b186baf9dac8fa5f70ed199b34810041736c841fda77e0d78c0c62ce723d6445d2097ec624dafac2215188781c463318950b94290cf14628130e9a72a73d8b64c065f4c027ff005288d2e2d4c801c710984809444b83a6cae470f0f874b58646a32582ae8c3ff459cef79077dfbaa36fa4ac4c383f34e80629bace2a80af3d33a2ce925afaa2be1d1a49f8290a77af7de0bec3cd910cf42407759bce74329875e5ea8b8a1a3147e7954f83b2f142d3847506d7cae913b26ca828beadf7477f539500d50794f375fe669199d93b22f7ca8b0cf0f9ee520b26345ba18fb2f5da14da99d8990ff131acb797a367912003984859772049d0e599d296ab3c4c449101db3cfb0733316437adea07259a42df36d774d208a2952a0eab62447b6e3c8c62c171a91ba9bdf4e872112fd8ff9274ec5ee56b799faac0cde746d415c0e6b37fb3c1479b199dcb072e94814b6718a8020635a93beb16911eadcbc3d3e949ef9fdab23e502ad7cfdc08fc67457bdb64bff6ebf3152ce1834925777a7b926d260b5ecef6028575eaae29cf488de3e3916d578fb3d00b14809579d55fd5625b410c669dd779d27e03c7b9988cec4638155250a950342fb66f4cce6adbab021a29e81aa64a7cb8fb016ddfdc9a2a4ce3dab60ac2320941cf37b44fc057c319b2c4e7a371b5d5dff3cee9c325dc0f9eebc6e3ac61c117e868c215215e39e6502cfc532986814af06e51838efab962e458c3205f0f6526cd87f7b96fcceadc4f8fb872d36e17a49375728268e499edc532b8b44b5386fd9737bee75f93d36dbde3e08ecab0ddaa6f0e1930786ae476ea828ce897b58c65ef7dffe6193a5b6143315bed36d43d262d442ed3e71403c6fb5029046cbddf267d63a2ffc649e97f888013d73e629ede741c99b4dc6a5ca59fa27650f1f4e708e8f0907a8e48e79035d8ef960ae3689ceda0421b80f558db7e825b134fe10cd3d92caf9f98c0bc5cf141d771c3df022640d7124ffb3c5f2f41f7c097ad0db74ef720e8b50d39d0ab65c4b3af91dcd64414c9ef9a74c7da6a90098d2234fe4e42ebd3240614398b4538686b999b644bc0117fc242131f2f5412c1aafd0b3e3b775c4d49d8d64a MD = 312e2d967f977a0a1f7dbc9bf1c4c47a94a87954c99a3a6aa3d48ecbc0764597e1efbd988588395d95cc702fb53590be Len = 88936 Msg = c67f9aa8cf1be3b4377c30c175d33ab2af390982c6a015d99209acdd6ff8934bf825f0c61275676f2d2884b5c654596f3092682895f7c3b93846711efc6314822a0bc99c6fc3503e240e6d2bd2e38d2af65ead5801b678c2a36faf3349d1ce4be598edd1edede44aa695b2cba269200b8706a1bc13c57d1c5dee2ec75e280acfaf34230e94db6cbb3a251d3c3dcc583b6df00cfcd20c1aeeee29b68041521035134734fb6d762fb969267427abf67ee23086b6c047749660dc8a0f06fc3528a69639e93f7fa4776bb9008033f5cdd927562f66af78e33b9cb177000297bb9a4ac2730883d34e8af9b41c0909223bb3336952e6716f424fc7f45a531c18cbad481e5b596e6f5db18ce2e0d7503a27522ef159fcaf347a1b0c2e9acefb894cabc9325aa6a95db7344ccab5b1b14678ff3f74ab7111cd71e791e69f3a48f128daf487d9b5dba5465b60f40460d44d18028e7cb00c3e4411fb7ea4d15eaa594683f2a43e4fad4df06ef0e833ad6057eea34490d097dfa1419efcf19804cac88eedea11f23cc75f9fb4262fac5dfe6de22a893973d89beae81933535cf24f46e86205575e44d0e23a762850d53b5595dcde84fd01991b29f0b44a5485f1e2dc3c286bfde92f71dfa9fc1ed3180e0ed9c4095e67e2a0066540b7697c7bc92b907288438bfac4515dd48e3141dc9dd04182f13efc7eb505a7c06aba52a642d16c72cab58afbcc1964a374882088b144d4ffde4d463ea2c0f65815625e6f247d782436eb81531070fdfef54dfb8612119a211ab3cc882ede5af0ff8c283c36d6bb71140af86a55ff2ecd5ba5573d88e09bd1ec9716c52008db70715e397641853d3fab3d77a8666d01f8ecbabe15db59e0f89b21ad5e41e582c0b30018860d31067844aa87750a637e67f1b4b776d223707c707b18b9591e56c90d9b4dd262831f022779af390889ac02b1bbcbc837e75347b3cadf40305a5f71c75761c408238fc79cd3785c298693b276f58073d04c923fac398b5a8d42a6a1285bdbc3c6b85eadebe0694635033b5d868d61df66fb344ea2eda36e397d324279d0433666ea949e5bc70a5ff4a7adec2aa9f375c09b415bdf11afe6fdb40c3a03dd2287ae633a8135b1e3102d1bf048aa72c09ba8d5c24da9cb37299f8f3a730babfe1d67c8583dc2c57dbfaa060c574e0f4fbae451be0e4943c49fe7b5c6d3dc62626059c4f4bc472c5fd631110a035ea8283b3db63d8507a3ddb09fcfb744bd29d3b84bfd18e50f0d11bb8be4f1332167d4847bad479a2a100bc48d8416adf528db8d061bcba061911cd88026c9cfe072daff66dde535fcb4d5437b7deaf5cd88014753c716d584df0793d77f9abee3f1c213c5ef1e3ec3b7c3952f623b068d71cd4ef8a9ff6cc1215a565a996dea720d1527628afb9dc8415d2271da12c77d0ac80bbd68914e607c9e88cf19493ad5ed59a50357823b53782c530b8d7620e47c79e46cacd161a91a5a90ffaa379653bb19f471fdbdfeab87b78ec3246ff90cee6942cb1fc98ee32316d8b2f23ee6369cda7c7425b4cf1a94863c6347053a3b891e8ea46780be58bf5ac7af996612c4ba26a5d3776e97e6c822c6b19d41ccba75222ebd2cfed74e14afc5c048b703463d84d7589af33c584a129276cf2a95d1d9fd8cde174cc20e4d9c3aaba73a9f034d7d7ac9374ba8b843de0a7984c87ec7dd350ed1cf7168e090aa8e395df6cf451098f6eff57fc14eda0f958465246fe6ab541e5dfd75b00b055f2a3213f37c52b15db3927d957161382c9a5d1a45517468e22349496181d9d646745e703a8c7456541a7a76989e3b84bd83cd4a340aba3f65855e5a3cc59028e4d5851dd2e9f02806916e898d3222e74bb79c9df784005667ab64d90e637926c3b66ec1c379114efa81385e7e145f895d9e92bd98a58ed56fff236ddf43dcf56a7de20516261ef0b8539e9c722c3a917ba0774f1e57abe506e862bfb84d01c06194a991d2d65e38c96d69ec7262fa272d2512fe9281a0aeb2ceeb77a0692fad31618b0cff731a4cb43961f5859ee975fc952c6ffb0bb657fe19843ca07fb0e4614e501ea6e49b54011d4d60b3c84da06f588d4d61dc32086f32f6b6bf77ca8e79c1bf70ce1126793983f6d404c86fd30fd6fd3ecdde5feb8f7f088e0539c6d30124a1aa7fe206e2e3d225fa81869734627844ea45f88425e569846c7aadecda82debe74c13f81b98772a07a31eb0debf2a429fbd412e8e1f95930f727bc83cc8457de749d10e123adcb2ffb1ddd182147c376167f15d44554b5d6d8134cd5d08df7c9551a3d6c4ade459c254b4501fee73ef1e550e790797de63cb74646280f272646bd41ae6b56a148aea1c50c11a95c7b63104e7164a6fc552b3ac993c5b1d94c1f55194c256f7f3c2c1793188d4b2ee4933f819b98f45a696a0ca319f4dd2bd11ac4aafde4bbff89df2ebb53c00be3e04b19f24e738a1e89c3d3dcc2fcbba61d00b2fcaaee65a9978f8f47a4f11205d65146a8703e91d01ffc387d752774d19898c9183c8d9305ce03e23ef267871c306e6fabea4230f992dee28d1abb3035abacae0599066e9c9705cea9276b93ae556a3c04a5c490204a317a1498011658bc020ccbaba41df5585bfb8f2a455e45ad0d54ba880fd8cdafbda71bd9414fc43564897358aec8987ace12f8e33d0f68a01f60d57a6a3188294912a8c4c302017c98cd038a6b990e6626bbed3a9bcfa09667075e651cc3da209f62c641ce5895fb6681862824b6de832b9d7417a6c573f7aef25c306eb54afc85407a38ab790a18984d011a22479038a5619862a71a6b2bbcc8d7c3a8306125c454ce91a38ce83df4d87e48aa75adef5bae5e03e6f5109a5932d806125ba5032445c934fcbab5d144cb049a0767bc0f162dd0e2ab7fe9ad4dd865e1f35fa0fe6cbc730afe2afb3c4ecd9cf87f4745009e86f5e83edf7eca5f61893c9563da7f6660d5f9f30541e5db874d4a5c3ad029bb60d5fbe63e575b597649ff3e90daecd8daf6ea21721036b2a11f78e46ae6f435637904edc4fdc601beaf12370e28af8bd1dfc6d19aef969dc21a6a60ff0ec8d338e8ec9998f77520e2c25dc8044c2e47ee96734ca4666d629247081721d10d5e872a9933e3cdce7d898ac8389aced3d3d925dbd7b9fd24cabbad3b53f6b62c9ff748f502cc083be25c103cd1fa3705f93993e4bd013d219de254e95aa9458b5b3149e7507c2f2215025b9fd9490f2b7fb6e97844a3adcda3b245fb766006935ddd3556631bcaeddf2473db99b2dcaf2ef92e7eb6c8d690a3d0875aec4382ac6ca2152c85d06103086a61d6595b28f8ceaa6ade59973ed367e722ec077c403f4f28f050fbc37dcc587b2c7a616c7a6e2771a68076396ffcb59d1f9b0e30c8b2cf18ceaa101da5b09700dcadf80e5b7900f4e94c54d5f175569a854e488aa36fb41ab7220b0662178ca07a596768528123de3b2a3d944aa412875cedfeaf58dcc6d5b4a033a53b6900040d65f7a4e7ee56d5a402779e04f3b00cad5f79ca6f63ccf2cc0cd223b80ebbd49db9ede7a22862812dbc4b1aa6c9fad07f8efe01716b9018084e2ea7616f85b7333d945c0c970f8cdd400130b98db67cda61d87ce55bd8f06e4e8f5abff22655d5d93328aca4249bbd76e10ac4a9adb7c6c04d64539d6d2209f53f64590065578e7511760ab56b59d34633cd4f84a72a4c93a7e143981755de2985ecb7020b6563f9776caf34aa6b29993ea4e3866c7d73c22c1a3eb49d31f7d3a81a625ee0265e4dad322287aa7cc7554bb50717c35744362538cb59c9605bdcf117e17eac438659fbf1eb183332b364a228439f7560c5d5d96273ef6187122aa80bbcc83763e306a9d1934d0d35f7ac8b261f864b41008892c1bdde2e5125a7151e7ca6492f7e3afef9a190ff2e9b174ed724340aa2fd38967d318ff8639b397f76a87fa94f5ede43929d48d2c5a58c3262d9127d2ac3cb2fbd576887687cca303ec8ba206a8bdbc1c310dc4ea11ff280efc6866b825a2ba2a9b8d2a206d0416e9c65c176280e17bdb581b63b6b103381a874f99b52ca3e3a6bdb3613e5a08682b806fb7333ee7c828f783d61ca81367ab36ad4d6411bee3e2848faa0aef381b4bb33d0de3033f1577a7dd9886779e3b638307de4f75621f50b88881209d21a4bcd74a881cae65d839e19f277e900227c604f5e8d1d83c1a8392246309d4439911552eb22a70eaa4f22d3f0f7f91edb13524edd995ba8b5a0dd9e9ec41351c6ccbc54018a6fb3bf032f343cd03fdcf6c437b564cf58cfe5221d85f7941201a945e9035381cbdd84e7ecc33cca62415bd7370d5af8bdff3979215eb86a435dca44c5e547cf6395e142820859ac0b56f39479dd27dc314199ec12b14b0c4e6c11107884463bdee2be5e188bfb40e122a44226ad32435d9cedc218071742da3767f32968b98ee4cd0381d7d58b4c8dad572b6506e5f5e8181d445ae684d68fc4b233011706901f5d98f4e76d6f99b6fff5955f6ea7b97bbd11ba01d9fa8e171ddc19271b9709349a65ff6fdb11ef052164c93c6fe159be94b26c3465e134174acbedc3fcd2c1ce8c53e997a8d816221a8e0f2391f99b58a4e6a11c14a18e3a5169f7ff402180933c48fc895b2bd5b4f259ae3c5b5848f2f596a2e16da265253c9c7e0171eb0d2bb12d7e6a7c74f563b1aff0b05566283390abb8aaf84d8083134eccf11697313ff3ebb865931a3fd960771ba7078b02c47c0b299f3e08a9fadc6627f8b88fb4770b68f29f298578bb07997848fa309f4cc1a03deac63ca632a1ccd83ede3a5e7a008e7443c51c6bb4acfc4fbcb5bbc87468503eb0185240d5696827ea1000f6f1da448577f049df6a598ae82bc09643e47805721cbdb03f883d225b24d7494683a2716e6331749b85152a8abca427d843f9a623533cc06bf524e2be16b97d14d95fff7831100368aee9c47f97e8d8513af41b97801de98cc4269096e54004299a19d5e806155f0e8ddb410de5141075706f4c16c9e992699d4b142cbcf4474d6fd8db090dc9f055c9f6877dceb1360b8e7521ea562725cb269c56c8c15cac4700a5f9226bb31e050a3f7f177946b4dc3b0b825a505f097a0a203eb21c009ce1f487177a4b5c52e5fac011220f5bf1b0203b57addf1aa63eefdfb531f66880e1f4871d5ad34af2be3f8026e8b778554ee40c882c2ade64df7ee2a18e771dbe10a7acf30a2b0768588187a4af9a2648803087fd1f5a36ab245e30ec12c6a6c036b6fe82d27c1b1a7b69de75c0dfec320cacb29ece96a7e3d637d17c020c8bec1bc885b0faee0c72ef9e8c7f63af537bbbff97548007bb74bdb3ce3ba97055ac86864a66c9a864d67bc999acdf32e28b55d23e057ed5f9c6a1782e0f4e1b8b674197548d88d3aab0e9920ee27e8f21cba2ccad9a1127e9414a2ef9e23834b58412a5ab0b80966767ffa0f20b86ef98a16a96eefc7f25144e807e389bb0e45b6dc25558caf61a2263869c4d0e4079d07674d7091110f901530a10f222fe530689195162b03586630c452d27d3f45650b3893804c30ec838bab18b2f5f6aa83d40de41d1a78403b3ca06fc8942eaada0be7161e9f9bfbd42e93d97f73a3c0c89fadbccae962ab998058fb17a4369a74901f4f9c09b6dfda64a76dd539bbba6711fd69b006470cf9c25a9f303beba6cd2e2d9a98f905eb3ec4323054a6a309f7d179856cffb9e6e47921c6a2b9b2623c3cbea1860c2da059d3e0eb7e58fe31e354be9a42342fcbd20b4b0bffac2f3f5a523edee3a182b1b40a2fd9a2bf21c4c2221902d0521d1e5aff42d9a781b6909fe52abd5267a981e5dd7b956247b2350cb02579a7c80670d7cb85aa2ae8fd28859c0ec732ad068367d450a94d8133f53b85704939147045e10690080a30474993bd578705102e48a2754b7fc50a0ba7d728660bf4b5ef100f270e7dc5f6399652ef91675a0f95443e36c8a35930bdaf580f933c7b2ae761aaa33d75ceb958713b994902a219b008839f549e8a93de8e46a164552ce1ddad4c11c98ab4e8186cc650eac36dbd12f82b257bdbc9b1d2b71b9475d09a8946757be92f16f900ee0b8b8cf3342d6842a59d5faae5a7092edc5f4f3459447fc63cb29fcac51ba26dbfe3c3fecf51b9a3a342a46e46930867407a381c39ab33b17588bc48ff8d3b0c1c779c6a1f8b1fda53b3aa42692e3e00a604f5ba0c3f53bcb246a51630de393d83af6cd18f2a093b3988c7a3d7d9288f5f87fe8a3b914e2c75a510bef37f3b969803bba1a8cf146ae70a931f2d145657df6bb909621181a5220c55afd1f0909bbc0d0f76f6eabfcdcee17320b360261ec838bbb3fa60acab59e50a6536c306b18233eeadf3fd69f873760e45056d36388c678d168eef1da39fe7957bac76dc7c6d10cfd32a77b16f5760bae8bd6bf549be8093ad7a1d5312365c8d5fad8ca050ef1c2972f50a0496ed1a1fa8261ce1a6b10c75f5568beb9befdc689db464e0e38abe81fa0df50203c70a92ffe9d099e416738a6a9ebb55951eefad925ba01c88c2907ff4bff9083a67cabb4c73277c86415e6789dd1c1f92360ed2e9fdbec1c5290a69ef8566a5af31d30f3a5c921811e41593ef7c2eb817d7a25f1135216f2d10b4e64718ce58d6c7abf53600a0dafb513175e80683adaa7642c8847c6883352bf86b97d4a090459bce03cbf9c453b72b4aa420068b6eae9478a5d03e048c51dd7d605e338dfa8020a1b168c28d10e9d4c9a503f6d679a8b4bc5d6114860927a79c6b06cfd6e5fae8df94a8d55b70f7e026df2041d56d3d497675d38a5d781b1cedf22e041bf12a66d013e8bcc01255cffad8f18208a7b0e54f8593f9fb67909fda8c407aed8aa33d1bc5b4d34b73a816be18e441f0b7b7fa9fe32efdf0464cb2eaafca8eac30d9be1b0099d36df35336d92594ec2e2bc6fbf034f100dc929408b6b338d9d882526c767b1417a83fdbb2d4757feb0162528bd8e1a6ad10eb0ad3975d27c702dd81ea869b902a7aa7c61d488f01e92af9df1cc28fac4d1dae15d63503f3e0abc10c9af3c8ba8655d996c8ade8c740fb60e11145757e7b835a4972f82e49b153cb471016a8dfb5ea33c2676cf93cad0325fd1bca69a9c2c27e1a2c595285a36b6ac5cc97b29c337844dd5c1e56de67c2b7879ed9a29a9d5b980c74e1172451731e0d22df5c6c79b08b5c292a88390bca94151cebd6dd65df2694ef27c2c2260b5381d5562cbd030385a35129f3b9238b5a2a08896ceed69db847fd860bdbab94b9c846a49a2a69e1b25756952feb3975683b042adb5b4a47abaa129448dd5c8f9f44e9433b2118eb9feccbe4935ba8295ccc7258b88f5b3d9f1fe0cb1043b38c928c4faa763d9a81bce80390d4670a078652e59b7b076410012dcaa2e8ab3afc3202ec52d1dc593487bda04259b9d9a0a362d05b99600f4f506842b438706d5eec4d41c4d489ef848ef2244199a091750270b511aa15a74c2b33eb67863fc5452fdfd28904c2c7e2410a02472ad7bc05421126661384e6a6f03527356865dd1f7b1f2117d9237cee3c89ccab73bbc3d1d0a886c16c5a27e02dd078b6458f1f7e6c9fcfe9d80878f8dfe5d5e70ac9535b3ccb68ac2af1f578528a6262a42806b262e6117767fe36a2b9a2c092567cb501f4de4e9ec5e8d9effce776b31aad1d8bfc6698692f81507c48351f25fd6293768775ab11c3ab4fa79b6c28300f9ade4ba7b5e707951e30d60a31443a560769296305f09daab5b14fac8cf962098dc371e348600b1f4162507e1bc21806d7908b2623c19af194c938aece5cb17ed267af3d92b5bc44776f6c22593b67765fb42c2f43a0a22ec4d20310a4e4a6f625355415193ac3ab4ca299857df2a12b1c4e8d1ce9f04bc8c2763f80a503caf5e2a6f1186061999a1dc659260e9a5d9b79ca1e4d8b32e0361a203e6d434c9604974716a5fceca6b787253b726f94e55e04b1505fac0b181d485a904514218098af90255c432e837a0559a0f92574d0d9498ed3b1c0cb5be4b9afc5967c152328b81cbd99d799b86814de3a28c4acb893c4dd18f26e061412fa7a5edfffb9e64b3d474fed2ec0adf8321d679fd1bf0523e3068070084dd92e9754bc8023625256ab9a4cc4cd35eca0e9b1a9bcb13e3ef040a5bae92405239dfcc97f356bb0e0018fa034cf176becf8a815810e078cde8f4a25189c55ce8be7b733175e5d2827a255d3a85aa1c53775f9c37e12292d5c678c2f3a27f1fc6aa2434c05695c2a91dfaabf17f600e4549f5b460157bab2410f730e900a9d3158541d5ec9e50d5aa70fdabcf43f995bbceb5917ab4d209e14ed9b5daab2cbefcd53c1f5f56fd51aefb97277dd85ff7dd8c05fa2ec70ef5350985196facee28a4247cdabe86847fdc4730e5a346787cd40d4eb8245419b748c765244f0ad95b34f969ceb434cda75ddb31afe8962e6ec8d9f9940366da974113e09e22cdd49ed5dd6bc2e76abf11583f004bf4cf6713e0766c53740239dd48725e4e92fec638af57ea80ff2f4404f6fc078170f90db5456e11c01e321ed0876e47fd45a39972e9ef4ecea58c43ca5f99ad1b041d079a1f494fa2aafd71b9238e0473e3c73494ac2dff758187a5a9ba9e59df57423d0a958d8dc0bf6c1ae0475afb78156f7fe61f9a663d3a2b50ea2f9475971270974fcfc435e30685028d195b95d483a562af6bbde9ed787d2dd4e8026809dcaffdb0f675aed326520f08c1183a4ed470c539b71ef14fe58724b10a709afe5e08577432296058c8db2a98681a53b0b0d990ca2c46e72927501ec7c066733d40828de4aa67b33a94273c8736e746c0c1e6ababf2bc3144e6e00160306d5b902926874887b70f40313e2b1b52097d47aca1fe2430083968cb40b7c2820cbabdc1fb2ee8f0a1dc344828e19de5085e0c1c12727c0eb3655c7d772635dfccf88db109680b0eae82dc80ed4454166a53d9b740edfdb5441feaa58d38036f347dc8a1581efa0965690082963e8a0eb9c374253358ed4d43ced8eb8bd37259ccb13638f139fe084ff96af62bb685f47c16a60ff39c95fd39d9eff678e1ccc61cfd9e1fdb9f5d33f29be182b2938ff13cb3371d899f3deeadaaf76f5c4957ddadc7cafe1e3a5fb3d8b52cd135bfee2d8004eff6fc4b2d4827a8b8fd3ff35cc70678807cc3f04eb089b11489bb21eacfd07096435487ac322f3bfa492ac722abaf798941d0ab70518cf561534da1cd00b45ff3ab993a03d44ecb84fb24adf3b23131adf650520fbf68ebdbd6f227dde7b539cfd7d44e7b570bc01fba368d15031307b34348cd7122a8f949bbb29b64ad5a67f26e0daa5ae3ef83932e674fd1c8dd6565cfc204dea1d18975a995e5a8792c4f24194a36e89f817aa800bfdb6f2618b28943c5dfa0646d022549a4eef274b25a2d8095da6fb4490e25d8461937474b55e8465a46fe9403cc2243e69c89c574f0d44af57e354acfa7d45d05f27153feb84a8188213f591c4f343e64d8b796fa7ae220730a83879cae7b38034c6471b942779b5758acda3ff222e2248bc20ccd5e20a91566a1963789e311481159ca055b363dcfd38d40f420b6d8309bf3517406538ee57bd79d28a2d48edd279886696b500ff97a2ab2c43eb6c890f2928d77d84676eb2f6dc5f860165ac97869cc6eda8eb8dc36ca5935b5eb594a76e7e75f3ec00a2e6baa352e2a701b14ea14c49a11b6e180edb65dd1ed1d3468113988b29f88f2b618d816526aab7ac767e09878769031ee8837e5204e1401f1aad298fb6367d58b1c3d8fec878f1ee9d6176d8d72e6512df09319a9419767ee28f83ebff1255bb66121c985e9e4b0821eff6e636e7ee8450b1222f42c700e6675f4a288b38a2d3ecdceeba4f872d79b29e0c081d0219f3fc3fe288978659f61780eeddd105df32b4a8b1ed21c013c3ade048e6f01971e22ff9d52f18e3fc2e8198d474770685485bf9f8a96bd58866a25b2feb66aa80cf6a739c9b3d4c51e0140bbd74d3b71f9551353567843405e30e63138dd721c12c4a218b557b4c15cb7d5dec677da418aa330efab0016816c9609ca656c80bad793da823d6595f9230fc03f3b4db3a0ae75fdbbb0b79ee357a377c5adebfe4b046b36c18966df371c13e9265f582f560dd562fe8e24432ec85f166a37e3539740549e1cc2e2f941efca39da5a1fb62a50ca47026cd06e2966d3cf002cdce7663457fada105f4ddf433c96a5532ab1e51f5c940d7341859dda068bd1b35c2280877b32449a6742dbc072e9cd7202864f21943168ca01f252cb003023f5ed6cade2c92fa2898140fc0f731b9be12e9f30ff79075b9b981b10e2caa73f1a162db4ed47d73c0436af09d8471257c53662506114fc2d0b8c6a9fc76bd96d4960cd5e4fff1359340cf8cbc2f7b84949a33977ed6bf928446745c621ebadf5aa51b473b1f9cc42418d810a768af4b992fc8b6c4e89e7926eb0164e98530a1e66734abbba3ce8405241b38d9c08adeecbc9c0f82a73acb4b0f04400d5aada31a54ef8fd13d051998faff61edb7acd311a9340e32a3332d633ae37a280f804768e68240363bded95215fb383dbe73bcaa7e072f5f5cf5f401f7257fc414670354a4b3893530ba67e30d950854557df019b3bc0f534521d399bc50cd8be9b06b6007f9a768bc3629ae3a637ecc1d2a11d1e2991ad8ec1530acf2dbefca2ffae40d98ab474b2ed0b33634dce80f661696857344ee3ac26e9fce434d531937a501dfdf6ec54708f888fd8567f098d0b1f286fe35d603588c6550262b93f3915d493934bace06fb3c1f6694ab14e2dd9aba68ebe27ecd2f0d45d503ed2ee3ed722ebc40f5bde54609eb23eafcb187fd1f52ada4e144e2b65fa5ef750890647c9226db7cc6017ca9f070a8010372f2bfee6fc7e1a8d50e7ef209e1f20444efff1bd60950925537777e44557f25c5bd8656463a0abf8b8ae962e66ee376c8f0b59d90e854f115903f01daceadfa2642e1058a96987be4f2a630dfe8f1c6a9116095fbdb0258cf317129a87625e7111d706ab14003848dd015da3ae2857a41cc60738b63d13fee75be6441ee6f8312b784f43ed8d46fd2adb8dd9bee27184f8c35d4a4155a1cffe767301b89f334a7abcf40a7b3a3744fd61f99875e4f171ecb6137fa52058680011c1ba9eb59a25c648fce7082d9587203aabc61d575fd3c2472fbe2cc5bf2fb5d3d958194fb228d7c76fc1da8ee72d590fab4cfc624411401dbbee1c6d5f8de565c2c16f9505bc75df55823a86b69e7188ff135a2e26952fe1bef9be3fbeeb576e84dfe8b01a4a6738b711703d8941304cb10281e290c6563a41c65a6466afd4972898cec87938767b9c56c4dae8805d04c900b8a7070c7fd14b3d3803df432488b5d66704abef6a500d397e855bc2c2574df746a515cf704de4469f45af0d0fe83380fd8d37d80b5e11a2e5686b7025ee47ce74034177f25814c9d95260775d5fab7ed68ba55a204eb07942a89ff04f70be6d8aea136ccd97e4ae2c517ae7d59724b83a257edc73c7f2a6dd7080ab0886bbbcd0811417c9b45bdde16a83c74035a615738348c8ca72e011fee6950917d845a28df1cbdeae57823f3fc7057e66e43980c8ce8e85eef781a3ed326673460d640a0b61c12a43275fba908d87740f4ae6de802ed57ba7fdde42f17d7b4f5bce20d990fa7c6451cdfd371ae79211030fb418e4caa712bc2cfdd754ef5d061fc282f865e386f2a0f0619f27fbadbd09dcac163ccb8bb2f72ee84b5caf93015a92914fd245673ef83995d8fdf160e0eb59d4c0d0580ac31ea8a78452e6a5a7d4e556c61e48a5ae2150a0cce4f233e26f2d36fee79aabadfa45406c7ebb1c5f5464d7469313caace2dc8a612626af2b5e00dab9cab9f6d853aabdea27577e93a4b71eb577cf5e9f05865b810ab45b237f7cc6d7c2dc73adf18225e596e156aa8a8533fd13a3e7ef50f51c13d7c4bf339c470442152bab929b7381471482290ccf761c04afb8ef038cd1d5ffd68064c17b099ce00bcf25f01b25d8f7e76281203b33e3b49336fd4581c48c2d4f0ed137e56b949beef06930374232dd57a8e550956490f306449a1cf6744b8589968efba214f65a04b500b8b86f98e1ae7dde04a7b129ab510a4cf0b48919eece4124777aaeca05974771f2655610eb3208f3a237c0b8c3bdb19e2a84acff5364361a1135de1683edce4444089fa5e32d72ac930e3c4423906115302c850399949ef8339a4ee4be4e71021867f25cb1e5e2913ff4cbd6b312413b6b74bb30a9a6a1474473a63b9d045832d54cf53f3da3812b0eb015755b8d7a974326f78b6be2668eac868d240856ac5ce37d53556fae7601690cc329034733b12108e01ec7901655d29caca5e78b9508aac2b2a63050ea9bb6ce7dfa938995126be41ff0a6f7d825207cabc922ec3abf92e5bb3b66cf05825ebfeaf1f39bc8418b805b09ee60d584fdf03195a2c1c40803ac151bfb74ee3dcaa7b3150bc5f3c6e7a43d72891335fdd1bee6134d525a6c65e1684ed587ce54614e806fc34f3f2ae91a6c325d581f1505af744a0ce62572204a5eddde50cc508a7bf8050480d3f4f7a991515477bb56ff8b8042c8c64da29cb09dcffc1611b8aff8c3e1b4a2d8ac7b1854d855b73247281ab504673bf98441dacd2c1923c514378b8a0bbdfb75dbdc305cce4762ac70e823b897d38b51a1789297fd1cbd0eed8afdf58905d4d30882b9523b14be505aa8703403f2fe7e80a79ea349ed2d17c91015ab65767419bbd57bdd27a314478ccec7cf51aedea8a938c7981874bb0633319d55a7f725707c3d3da69bdcabb98ec4f13188ed71f6a591d51e7299ae04b0555b9a556f2d00d422c9559ea7cdcde9f0b603b0990191fb1c90df60445038cae4192379c8d5f04aece59139ecc0ab24bcddedd299d4a1333fc080e95de7cb08469d971ae9656967035a027393cd7cc78f3096f4d5324dd6642cac16ccbce4f2e3af9f41ba2592b1cfef5154843c685bd075a7213565bd6bf29d09ee7917ac112319e3f5235c94b2b96e26e4a8559667e975c75ea1b41a7a51db3f794c3f4bec6fa20a3e0c5496f2279d282ce5602f7341f89fb501668c8be8aef7bf2e7ee80c2d11bd245d53c1f88246003324a45a0740c6d72d3dc43a2721ded9c9051aabf7c72fa3b0fea23c4c332f56014e6a40ac4ea616ce3d164dd563328c9ebb5cbd37a3c465e9d7893076a021d19f49fa08e9d36104a1eaa4ec1e1773b946368c46542b98aad8d14fc5fe33e31914ff9cdb4737bf4aad2ab54089a36907ca60f26dd4c5721b83d23e226d533fd7685698e14de28890fbe692719e70dc1f311fd65b41db1b5ff4c39c704b67fbb3a4383541833d847d910784a6e5e694a8835d7f3822d45c1f338db2d61ed9e054cf8cbc2471ae7bba7973d107e76d584bc801362b0018fb034616c87d7010b663f13a75b1a09e34efbb14c1bd2b6ef2b009f3435c620fc0b23748268dc87445871329a811977678c35dd09ef0394f287e4e1beef4d02175d50e0a132daf6d54693b439d6bde9c0fde6991aec79a7ac35d9d617f1bd2b6e013d143d985ac63adb0746f9ce8fe7ac1e9e63e3b6bd5558bf700ad3df8f136cb158addbebe47be1605c395ecb07e76568cddbf8b04724a47f17ee771b4b409fc8340bf0b0008e65810329ed6eae6fa956e55fce6b9fac0c1f61ff76376a4973b04fcd1077278443b78c870a2bfbf6d473856dc96b2f41fbfacecc55b6747485240c5fbfc3d1e3e86e68df498568f373491e94ae218e8ce0abbec39a1af288507e0a3253088823d03018a12ffd8e1c02422142b11135e376acc283c7c75ccb4248c9e37ec7c2daa7872c6b3216c3a6fdf93e1686ccadfc1a687a6b436e1bd3f6febbf197841a6ebaee049bd443b24ae2c8b58e93b66f2d48893708b151d828cb1a60db41cfe756a6df41c1ab16c26e5d5b28096c60e20d8d6998ea7624ea305b16490ee20dc238d7c5646b0b028c97aa0b1615754ebf035594006f2649fa81039ce51b0cb0237bea5adcf69889793d6563003152e25ea54d931e25265361a170f8c57e367983964aea1c02b83e00e61bfd66fb69de3969b1e132ab1ab3b8181fc45ab6d3ac8b2e660dc20e0e72cc283a24cac24e74d7d73ef8fe4f67fd763b6c8a153388db829ae8303f76ffda236a5c83ac245548c2645154d1a0929314a1e3b4a592aa7902623dfc14ec00d6bf22dfa46ba032ec8197759f4d3d2f173bd211de5c42dd27931ad3bbb2cbb5fae7e85fe1b9b45bb28df73812c18381fc24527351d9d28549bd3b4619c99483a9463139c5f6df245d5ff9f559ff026fa4969984c97eb02761d93a0170a9d4fe84528419ebb38f412f701659ff36381cb2db1dc2afeb6a58027fada26ad41b8afe85576cad605326ab56e2c25d07932da99a55b97f807f8bae38fc8562f8c6bd8a57219ea59db949737cd5bb0df3b216fb3ce7d5b2de5e36b77dad36e358750aaa50894c4ebc302e0a6a65c08c7b036d2a3b3ab3d47584edd0b6363386a38506f109e4e2135c4648c2a8296f531e05a4a92dc4b07eb682156c8b3e17a73a9516d0ebdafc8dee6a2e4eae7713fc5d47321a8d2c77fc31e441fd551b3fdfbe23ceec5ec1f838f31a5300f6055ad2a936a9d0c1c856e7781a0805bc54389a8e9fa3860b30618f0ae53b8c072aa0909252807e742ef9baf991bc08298f8e622c87293059acc50a86495c326a7d819099394a760cd6bd0126f9e29715139db12878b49dd2ad9f3605c549a688647a6d3e495c4a04463d3480a120151787031202c2fa10fea96c9bf9c7686b09760770e2015a7ce2f3e6dfa735d91499504b0f3c145e2c36369996e2ee4cd236389566350fb9913176466d0b0692182315d20344db455231bbb2d141987b7eb712b097a7b2fe097823d8671cb1cf924d3e3498ad96642549cf54b5a66468e3049af59faa998c481fb319586cb60605604fef39e6c42f1816e7dbce81c089819747b0e8ce2208ff907a85ab6b91ca0404b16e5180e30a9d017bd486543b71fcf79f9f0d72fae8729300a9eaa9c38ff0b3093e89fc718b369211bb67ae43a697ae090c684972bf637fdbf29097c9bc6df3bddc4dba0e257751401d0ce0679be4032a75a3a237d224bf62fc37c622f3ce3f55c4175a077dd1c76d65c0ab15c684cf6a872a2da8d548ea4c234ab54dbab40e5782615d0bd8d85d10223d5edcbaec4b4fad763c443d3278ee1433d5d87591d949a3d62369dafd9acededd8c3aed7d1f5055126e987e93f3df2badb821b8fa388284c05dcff8a3f90ff82ba3aed2c9a3f31a8935242dcfe375f5f2ccd8095fa4b8c1ca5cacc67e004a0a9245b70f5481de6a351065af58b068efbd9459cb349652c75eb07ea8ee490382cbe2d1f7a02148c0b090db97c0f31e95589f25831b85c721f7f9b434772bc2fd12fb8e302f1ae8ba8627045b9b141d637e5dd9d5671bac5e1088ebedab211ed612004a2d63c724b420536e8f39abdbf67940d516c99068c842fe8428ecd16daa3381a463f0de835a199678974f12d0bae3f8a5db95bc931d19bb2b9adeb545e612001b5838999af8cc70c1082df1a22d48e5daa86dd8a1b8df4f40a7d3351e2617fc1d9eada0c22cd372b64668c0b6ca1288d1f1a47d1b283e4b41d47ce97cc6cfe6398be28c9f72a90cf MD = 72bfe4c4e0f6faee65817e0a46e7b720560d2d8753267e398637ac21795d72f57469ea2a0d3f6ca65d948b272d5b5347 Len = 89728 Msg = 0e6c9fced82669cffe7b5a6f09dceec8f95bc397e7bd55f0e9d10c3036017a348b27ddc8cda2ec62efa8d01116dd70b0fb25f15f91b77d34e974442d5276c169c4eb3f987f249bb1efe94be3d3109fcd9e4e47f11d4c16665bfd06cec2307b888261cc2737d5ff22c6e6d4cc879b0687aa7bcd35d3a3a7f0081758fbcd562ff88d318c5b3cdc9f1e3b4672b77ca62a47e6568a14fbe5b839b868449cbc106621ad02871dd862030e17b12e89f85a95731b878674dc39d2a93298d199d788a76baa7cc656518fb45822d10f2b44dece7511b6c93fbfc87ca8405007da66e37a3e4b4850ecf08a3966244b1d85a85b5db3908a5c5becba3e9ea838ef48b14c6702590e2dc9fd7c1a9ee5ca607f6bf9cb9760ab46b2ab36a0f333f790c900e9f71f9d7566d3c08ce06a2cf4e102d7df9e8748c28f2a44642b0fa936f3469ae2b1fddc2602f480e31231c371a7f4323661ed127740adfe6d665bd29c1ea8c8601e04e1c9091387a8385a70eaba3fc525993084715f222379d93d76d21bd5d28bc49d730584171b04db4ffc0723c9d8d5d0b86759f770f9af0d1e5c7ff2b7008a2d2e59827aea851f82772f6fe97cb36e8ded82d60d81c93889674d4ca9359986e1215ce9f3730d20b53ad0cb143e9d1759379f91ab3cda3cd57e11e04a36e7a666dc44e2f79afa30fc00a9c2adf9e0f8bbfe8431d88976e27acd70e5dca4301346c9d9148f479676e03180fdba94c23a3baafa5f9d50e352ffba32006866bdf4094ee228c262271be8351e2346f78c0561a3c9c301796ab5ecaf1edbf564d67235d529c599d3f6469d754bdd560a8580b651b9040ced5333ca13fd1e8b86c3b554c574941a824b208557ced3f4b5f7d4c11d92cbc692e6f3204e977132b4cbe4ed868c3d4f586ed12a4471ac27e028280a6d1bbf38516b1e76c8b47af3d6372789803967403ba68014a5fa11f87361a51aaa1d89691329db55e81ce4d5d44fa8af1b42baf4143c55c9e032a96d56ea73783d61d061be695343189655e1965b8ce7bf71e073cc7879d35fe11d91710bb9ac8cac3d293b73adcac0ec751e04a3febad48c7ec549a214ba88cf1469ac0ca03f01c978c8738f127246e4ee94076f24aec25c3ff375024d04c5c337fff0344fb8037e28464d05aac21347654b8506264df1a9c80337e04d3b7d872e5a23cdee9ff995f5acb01c9c428fdc854c67b12d1fc93bc40076833ce617e1a0822f1da77d4dd48901861d117a226df39e96b861abb3d9d9ef1c34418efd9a3580fa6da0d96604894db65030f335c05a49f963e979154dafda103b84ba967a965b6e04013baceda09828fd22342e9f605677f9ed11585defc83ae02ef24a486b1b722cf32b875674ebc46c0ec577d0adccfac497fce5d241c2826b67bf81ce5bc9ed2b9e325f08ad4d72e51d2f761beab3690a0dc123734ccfd02356a7a3d20f6bc94a29d79cccf4c71aaf77f9954abf13ab1477e8790ab9f70c512434181d2f0cedd1bca3a668f160a41343ab3b23d3f5aa2afef9515d2f421e3df8ee497762b14108811de6a44b20f859aacecf70cf604d94ca7d123657b9ee2ffb5c9ca75064ad369dcdc24aaa0ffec9d3e9bbf75a5d7c9902fc235bd963656f55067a77a22c19a53b3ba320b8369faae68466811df31f82cefcee945c4969442d744cad00126d9b81f0f2f01a9cc1460d2738d5c02a1f975707daab8871e3f8ab2f7812111c9161977315807b494de36e5b99bdea0a6220c5a44f6607e5bcd1f9be686e7e546d3fa64c769881462cca31a7f1ff439cd165405cb58f7eadda183ca98289eec2ea7cd6047b02d49a44437f94a86474e754aeefb575ec98cf27149f79302a0a6dee624e228e851d4d7f9580a926b425f3d442fa39f546fb558a0f47b5d91b7a5d6237372e16e80468c40a5b6ed4b7fdc9376a8a709e644f46ea4f5fe5e422e59a2f44b8b07bf430f2fae8396b1834a570676ec7e1d8103dab311d0d91bb08f42d3bd1fa3124714af30b7841295bf5c5f04a96d8140c106c8b46c17942c5944e1d702625397b27f974de029c2f06c00452ca29e591a02d86ee1183cd7f6a909b72b58a604ee7dde67b5bce71057f5e0a9dce7118e1fe2f30dd7aab2ed112c28534f147d3fad05db9136a23e934309780d93db4978b8cde145e6980c6bf25f4b26c0ea3a7c49e6d1941f34b2c437f320e0f013b8a17b402da7cc64bbdd10becca22f3e70434bad6ae0fde8c61bad6f95b46014e1a0ddd622a3c79543b8f2d73765c885a11d38a5f2184132fb0229cb2108625356ef66ec7aaa86ae36782f1505e24b546f72877d21aa87b7b42013926d4d75537b05ad1f905c782406931c04d298162f1ddbceaf64084fcba3fe2151d5042799d05bf6dc0e1a1a7b36a2403307f7c77a4ec1549923c1f7f32cf4a985f2cce79b097afaae4e73fc28392e420c20a1bdca74cbdfd6fb582ed2d18c32ab30f843db58eb1f02cbea8bcf908f881cb6f687a42243c6f5554b32cf145d433e2a16aaef7124ea7610ee47b5df5e88c13596b37bd9c18060bc1bc26c67c061bb58b8bb2bd490c374b81fce9f7803dab616e2bfc5fdedb295ba3a4c1f6e5df4af175ec324e5e7609b2bdf7ed0ed27e457e56b0b2720f0c420ba374e7c8aae92861069717f37711835e6add6eeb1233c133ba023f3c5a34b8e468337f83f0ac1ecce79347f4bd670e1731b756d769e58946422a8d06e5daf3ae9be97170e2af92f9c0e8ac9957ff13a4ba8c8c18ff1b047f952f8217d8865b31e39fa5d7a57aedb1389f2d2a6d61f8ceac64f8f6fb5d9aa85c1908b95cc15834e95c0200649598bcf7beb1ee2916275daf4782bb8533b3873ef0063299115281542872324589f9e2a650222eb1a506196d3e12adc726b7e6e4bd63cbb601b1decd0bddb670dc7aebed5a67322d96ffc98b509016e6bd0e8bf58809ccdb16dd14fc0e29d50e19829e73e66842c6727837b486e43c0d81213e1a57df7d32da3eeb88383fd447c578c4e1fb0da6a3bfdb298ee6f66862f856c9fb34cd25e0d43c2a1a9207fe426ac625dea23ea5ee088f68c17baee10dac16f33f26bb0e108c409b5922699a288fd38913e2e388ccd2fcbcf64af5f13725ca838f36917ee88bb004eef24eef20bd07b827c3e49867a78aecd55db1de08e9d842926a37be9058f62e800a9c46537bca79c34d291ae70ea1c205bbccf1a782aaf8f1cc9616317b78e1b8703de7e95184968f899a597490a9042f6c2c723d78a66c536494cdf37da0e43e2e171a09c79dd5327e209c34b40a7bfa79bba9f151366861381a2dfde5d501b94c1427db667dff5534a12a52022cef0fe95fddec97c1b2c353117c783b7efed1d01b5588b58ddc9fb4064cf402782815c4025855d1af1320ba5f038b0805a42fc413ee383d3333b905384a433d54edb5128b60558867532077ee0a5fd2d1bb7b2fe6381284d8cd4a2f1e6c663a290797dce23e1443533a6c90a4d91b244a0b5c1a7b7c3f14e573fb3b9ffa8581603f622aef3ab98ada90ac106bb7e883d85b7b8cba01e775c0eb7430a53bca9b5f5bbe029a9b6de5641c87fc2aeeee79e375808d8b11302dd3fd5c1617785b0f9023556ecbab57dd59a7a65ec9c4548dd31f1225d6f245c685735cf6dcf960655a61cc756ab0a0f922f9b13d2f8243481022d95d83ed4cc83d141bd7de06022624dbce1f5ff36fc225da4fa2466fe23002467f3c7a4a6eb965a742c104e768d9585a017592bcedbfcb122894f5d55acf1252a9cba451d22364f578bc36e3bc065da60d7eeb5341787c68e51b24fad2ada6100111e74aa18da2c666d15c4323359b879b4353ff9575a1a62e3fbb27735028462f162c7c028087e1b3075f50c7ef7ac553cab0090e3fa092aa09a3a46542febddbe25c301e837b100867254fd0bb6227dc1decb9d65de3f50280c2b9cf0b923dac7e5dae1c1ee6190df7978b6622bb77df44ed571557d096dead01aed9314a8e4af1193e25d930c569c19d4bafabed7b03459d2bf2b6d13fe49648caad3e90775e437628613dc1dcc5cd20d6d6de60fcf12ae27d96004db6bf45805770bacbc1907c5eb3f7d10126c821067501437cc150fba69429c0acc415c28f9b4d2b623487a5b828101d596b1bc739705963aa94c9bed0b9d27b55318f135fdf6a1bbf98ecc66ccfd3aa2f7265c79f0f05c5503b047d4834b9bbb2c5d442d76aef1149b566e561f069ffec044f27229a2df1d87fa83ff64d07072a488d57de86059668539e0c81d3f9a5f9e981f1a958fb70a8285d0dc24ce4e8258161585e79d43184393b42b3c0ac22bce9a22d1b9295c92afecdee947877e50b39f94f3e8c836a0530e690dffeaa009fcb5ae162902384c4c99eea541ae9864538fc4366073ac9540047fcedd61ac609595317659ace2ae0507809ea7a61533946133dbd3223d7d7710591c69024fd625932d60cf8bd42e55c04543ee008d5502be6442d54631bf74ac9545074f22c1194a2273ff11a543bb5e9d238940693f2ae1c609eb7251d1c553a4f74c9a9db80d24910e6ce0ae84a23d08bc1dd821588995d99f6a18f66af5801891bd9749316dbcf9ce9d8b787796e6188bf05a4e478b253f81e5bc97d161cc50a2bea79da3b76ddd0305449b8325d43d01c5296872cc2a484fe2dfceabb692fdb8e45e03b576d1bb6a48de804ddb91f6bbe0d7d860a90f8467e5e50360407e7032a32d23bd28630552bcabaf2e04a9c628f7d846a7ce6f8448738ece85bbd948ae9f87764158ac5b5ae52ea0aa4d863bc75ecd0bae98a4b88ff01f9882754de79b1e1f63d864081df166e9ed4912b1b815aa08cfeb9459a1ad0029e9fd0956fd76c33774e8e720dda4966ffd9100a6dba25e2debf53df8d00e08304b4be45ecac0137242096e610ae318234a0873f016ebefaee832120cb4419cc524f582f00005835233a04653364b50a65b15f907ea50d30e5d58ad0fdee6124b1f8081a51dc59759c2441b71e03bc45bc9501c68d67f9cceb3af6b6ca04a2d5493836cd8747ec3eb867b6a47893307c5ed3d3a9d5bd6c15273ccd9bdb90c325419648114b4af9da9e8acaf4e91df8f776f33f00ffae4e54c2627847d799ac5dc29ba7ae45ec688f7815e46e1ba7fcfe2a7eac95b24385d2e4345d82672845c4f3cdbb6c1c3521a66b916edcb33c24d9a2fb822e9783fad4b33be514334476a4fdb7ec13782d0c66a185cf045ce158cf07f22894557695a55afe78c4e2f5274307dea36a03dd121942796faebca0802981eb088f95243f8cff067f5b1d4340eb3acc463a624c190575f5b6a47b808430376f89e6ff96ded0cbd960a28b37a9e2be083f4b40820a7463820cad428a4c29520513633ad35bbae501855ed5d84a70ba1af4654388ceac34a7d990b9c4c05ff9360eccefe39f927506545aa22f0bdf568bcf5013654bf60fed85168738c9195589e2eac5cf91a0a56e375d9b42d575bce136d359216b991cdb780754ee4d9e8e86f885659e182b9bc3952e681b8e7c11a793b8bdc515df85f91a2bcaec3537cbb5b66576581e7d7f8cd696b0c2203a80624dc5e658310e6fcfd4498f3c6a2c349f8551a1068adc7a52615d1b3d71f82e9cccc37de2a66f04e60c2b4be6d3c5f3cbce128eae4491b49ca04b53966bfd46dc7879296c5e4a6cc52b97a7f0574a2dc1f770e45b33e354f2fa27fdd5f593eeabb9b193fc40e7cff49a564a64e0020d0a6a334c12411c82dcd7bbc400f6004e90f731639d348d54fcc030de495536b82d8d236ddd558368e39fcd4d21588d90139ac240542285236404ec08a89d2e59b2ca08f0c3575f2b8ebb26433f0282d9bc0a2cd22bf21865b4d0547288a232162288a97ccd30f9f666918e4c63dc275414af37c2298c8b42758b2ec4f14b8a17042ecfba01c699eff28acd1094cec326a2f2abb856d929e12e9c43a5ec807d85e02642516902863eba0eaa39dac0a07aee394f5bbbbf396b676d5bbe7f2954883fd7caea0dcc0a0c4686ee6c3d9a047681edec545f270207a8653eb7b52f5847a7a92f2df30d6b811f586153c6443842e2774a4a4bfacdde7aecb3379378ceeba30438c125abf2c4cceecb967ca68407993d31e6851ee218646a83e623ed019bb850af4fab90e7fed5aff4dd68a92fed2fa969d0177d89dcef47766e6c76388070f55a7e8ba29256c302a4cf9033831b2b22b9af08fe0a52a1ec547476fcbac2525b01f7cfcb3af51c51a214fe2dc6ba150feb2c6188aca305bfe5a34a65d088e6eb6e627ff229026b03b755ba8041f176dac5ee2905b9f7a029f1a0ef9bc2fab50b6866a1ffa5a63580ab3aca123ce9d5ea109e685c7775fc933f166d84d8424624b6ab3fd9f709042f466a38cdffc9baa793e327752f46a06398abcd0a5a85219f21da606a67525f7a4f8e0c98d1baad7918666d3828911403c40716148feecfe2719b0d993caacfc8904d4c5afce437c865ce428dac7fe1d98bd35089c0a2d7576e954d4ec038db82cf5002fdc66edffc44c4ae5c01388e4fb5b7835335ccc165df71287139250b0ed53e356878812e7d7af0ba8d70e3a3cb095ab859369216738ed6a6ebf098e7d56ac0ee835944abb4d2f96d0841a9a8b75065f7830b1c5deb416dd0a22dbaf83f557e3436b3e0de071388d0b5bcb1267a527f46b9fb931e34c1dead7f38b2c5b5601f0f69cc7c4fdf0444e97c2924a57cd751afe34f1fe2b6d6d0456a58a9d69d514c8704ee4187a56fd6c246cf29ab25a78339e950e72fd947eba14cd6c7b460f1aca5ef5f570dbf1ae563f9f7e9c2dd89bcecb343149005ded8c80bfa33e66708e8701367e56997cd1ad27fe98b710c47a4d12a73cd8aa2613fc2910c16f4195ea7f15650132493521d19beed38411aa7e4ef34273ba71899c798c4549767ddba922ea1600bc51d709540a04b18b86f72244fbaa6866ecf4e19518e1adfc61de65031dde1f2d49cee2a4d0c4a5260736f0bf7a539d5673048ddf5d6a5159940a88a02f019f3d97895854ae9330fc18f6842f1db28501ba14eba8d843e6269aec9e8a7c451335d182d4e3e214e76612923714546bb21118b2a58207f2deebcce11112a3fd0dde8e67e2c329be3b0caab6a3ff9cd3a6dd157a260b6b1bae01d0a47ae924be01700494fc82d3f3ae4847b03541757ec5fe46b7f7a57012d6111c93566e8cfc7092fa969ca37f59b3b1503b659a6ce1a1cd131884d0c57cd982274a1e233b2ceddfc6f95d958a54ddd07a94df6af190ccf200f8782dc9be3aed77154ca7bde3db8ef01999d993799f1e2d78ed239200a9e5a6f42c0d0b5b7cab82916c5c93a5cc491c83dc00193c79f2cf443964ccb5cb106b883b0ef8e91154e04ae7b24ae7229692c4be799a21f116f6832e9f0024931ac5210fa410cb9b7206be6959422c90f009689bc684ae86c329a24742ead1a46d5a5b145ce1876d7b7c484bb217ea79ddc6cc1e776746cdbfef4e0df0db41817081930399f9b129d99785194d4aa55fb8717b910cb09f1845add30d196ff88cdcd16547fbb7bd33250f015c9b48f1b5289003ade70efc08fcebddaf2d076b58fac04e4bf2aa202be64939801c91340ca688e0bf96c102125e2fda7ebc302e6862e4ba9a0f5f6e6685bc8a1e51c1f0e8aae28f60ac7525b6e1f035f64778962dada536bcb2361c959bff9fa1db49ccbbbe238c1b9899fb8910c38ca04f5f472b23884f1e8bccaf1b9178d69509a70c0848d2535adbbde7eb63204af74442c5e36d147059ec918a7afececb726d485350e36571a8f65f7f60717d0d85c6c186e902c026d9550353363c57eac496cc17280653638068dd168a945020b62769feae5d21ff2765c08ddfe2aaa0f5e690ebe03a32a56bb3d561cc74404113169ab196049045ce9f279eda8a3dbaa10d45363bf769b3e557c6d59879a3cb26f4d2344261b1b73951c70aa88b9764304b478a7db69f1b67d53fe6911d114b5c52aeeb362cfcaff23e1d55ec7f3e4a3e51164d380019487dbc8f2928e71f2e4da09f6ae3aee7bc73a4a904f8cda8d9259f4012ed5c8ec7916e62f1d2600400557f1227dd6ff9594835d8ac500f4d9d70864360203456253d7b29e52000865e1e3eb5a675f8a802ea624a90a4bcc313c9c69eb9531005cdfc53627784510c94027fe86b5fd18a35d4aa7d66594e7fb87ba0b0831888243e38979b3d81ca1d4eaca328fb0d73068e917edfa1d03cfa0810c53761c30528028ca8328bbae42eea6758f5b9d165a3699b7fefb7bc20b89f23a481b9e50f87976315d7067237b7f3dd01ed3c7e11e7636cfe2c3c7f6231da2ecf2e00110fd9894660e7125a2d4ef7882e6df7561058e880aa13849ca9fc358c95aad8b99e8444c109e153c53d6a61d34ef68eebe96e7570d4444486408e5de79876b861341e464d71642f65f080df48d42547b1f5ae96b83d3ce0eece6eafaa5810038a691e2a5657de299eef28ac736e68d64acd7fc8c1254bde18bbf3a75f55156ea785ea5d75fdbdc6e271d865cd6e3f9f18f97898162d1fb0a681d3d1610fe54e3b43395c2703818bd33106a7c1642826aed22f6131c516fd0ad875ba79f90e16d80951a2d3e9d7ece3a539cef9e0a0f16f1fead0ae8dd017d7f86fcee4910e7ce040e9ce27111f6e8636f867d1543873ec0b5142e6d7c995808a188b5b7854d4f6a2583a7b29d6854d6eb8eee24f6d42a85cf954654361fa8706067c290f7fb38d7633745a948bc5bbc4f1e09722add2266d2971c44137bb6df4b01dd7d6fd8d1754e2084fd1ada433d249d97a8e78a6e8b488276e61c96ca7cebbed026f3ce616c70a72b561baa5480f173606d35c3551db8bd1de258562b6fc70762328ec432e45132045e5415d8ae3e072c6a1d702044abb2d9dfd0a423e167425a4a45a38a04772bd5bacc0115ee94c3c346a6791827a8c871858a69f8fa54d981152251b2f46cf867158b585469790eedaad9c682ef3767af7e908bf3e115329f3c2cb7f2ddb80382159a00dd467850713ebc40a9c3e0f7596feaf45cbf32b77c666bbd91e7e1b2ed6200e3f8ae16f218a95acdd4cc2ce038039e8a7bbb34cedf3ce84cd939716f72a5c5e7edc9dd5aaa94b8564a32a28b14e0b63797fea2e19165aa4a10fcf0a1d786f2f603be54f1efa6e0c4541ccb5eb5ae39e1faaf04575b8ab9a17f57e4afe5ac8ef784b6031fae88d9fd3ab22dc2e2163072eaf7e39803531e376e73d70364c0a1d1b6d8734db1e1abeb441e522065bfa2d1b0fec50c5167e0f6257750041c69346ee24d2be1be5a5f75ba85c2de045397e694eb351b0f6f07c4eb8cd81ad5504db54f3cb3459e9bfb82e312036688771899dde6b82d03129c8b0adaf6ad561df78e47ce94df194b8afc08ea9f1eb8d52bd2d519d8aaf6f9a632c8883225687737e1102b5519f61211ca71381e705e15db79c2aa1cfab1cc2da16ebf14ebd3061796f37a7e5aff9a9ad4662206c340df2d76edc10c85f9323ac043a625655f739e9638e49809fa882c022fd0e17e28d92bb19e8731b399d3d3779166ecfcd366d4c727902a90b087d03c136b360bdcaedc131d2312ed575803ae9e26f118f986c21208a6bc56e93d8d6a5b1b8ed124044882b1be3899fd69cf4db40fbd22977c6f5f2250d6c36c526b7450077038ca8478e7a380292151ad413c1949d78076efe497beb4013f036f7242375864a894d5732b3b906feb1ccd606315fbc79c5e8827a024fac432743cabbc5b35f2894c9f4134c1179261257034aaf24d16dd17ef42649c4ba80488601dcb03c7a343b88cebec7d3c18e9363fc6faf6684baa68cb3cca6ecf341d0784d0557636fe3ea142783ab7288bed15e21d396b74ee6d1ac51eb9e1adf0e6b94fcd43fda98ce3ce69f005b60272d48b0041519798888df584ef1b3e0e64c5666a1b7ee048d39809aa5c37c3f3560660413b28c3fda072c1b1b7d7cd191923d57cc2ed673c5dc618adc3b72623beeb5c4f12a836cbbe8446f37fd5d6f79669cf2ecb77daadb2d6c4192d6d27b932eb47cfceb83a296a2b4cf34efda1cf63fd1c283d0680c2582ed596a2410ede3a6ee86c783f153f2dcf9a582c3776ca094984112081a2a4d93813ce2b1b22b95fdc08cc172710368ed8f9cb216b9c100fb3cf917dcf887bbd5b4666cfe3ac73289d6f97b357733616ae31f436815cc8fda5c4525bda7a6e8afe35099781f4331e19e57655b786664bb90a7a7261fe1a5c862cf9c289c0a5ca8ba95d89dd4222c7b83210032f91efb7614c06def3ca2fb2becf31bac4a14904696a0ab0e0de68aee31d0fc7a7dbf9e20fbe3f8020072f8ab575a04c736682c10040b911700f2c58007018a907adab532929ce62ceff4269d2e6ee7f7f587788b8f312b6761f964f79f1d6b0374f2d9219555a8ce6f88ed97fe9c45ccebc51e1f94abca6db54cf1ab469eee41f09a827450a8c04513b3e612448cae949dd37542b0e60e985f7ff411b9f0b4da823449b17100cd4f510788a27c9a730d802526ab607a5885e4f4d4c145dd3f4b8e42874f52e8104bcbe64daf13503396472caaa02fd348a4da6e2c40969eee038957d3d492e939a8d8f2cdbea53880ad376c69d77b8b4f73942e631618c0519117e6a7b7ad6eba04fc9f5157aeddcad0f566ec97effced70c6c8019848ec0a829e718b8f0ef311decb5ea0f0ac9a72afe5aebb87d9c2a33ad6cd806da37c6946a18ae7b13400d1a4b9b305100b192878aca65f2de556f12048a177fcb4fc0e5bb58554d4b93259e54c3f263c66a44ce9aed03fd07f3457df90e650dbf9d55a403f135b500ae24b1ef7456cec2bf6607150cee63623e567b743fe9361eea2ed82c29753b9a5ab05b04f884195e77a038e56f4eac55fd47145d67cc8550fef2891d493e67815f71a57b95a5cc0159996bf15e4a5e4afac3509ccc357fbda14abfbe98b7c21d8511963c94e16f122ffaa721210a03a8fb703819b64daecd9bde83f76009d3d7943537303d5f8bfbbf6af55dffb722d7c9f6d3bd6f3c99e9b355dcb0e75b221553878e3dd748a723d2925c8d4279443f2cfe2a6e3e29c877b358d3d177d638408bafa64cacc34cf22f1ae4993077f048eb3043156a3cc4e1618e6f4256a19cc10455844602f901d0a0a9956912daae5ad033289b3c9f148d85a0b8ebcce6d6fe8620321122124e25ebe778e62fc906dda1b0e1e6fc7740e5e935b6b523ca6f61d9b8b7975435bb59d97e94f6d16d8139274e74e0f2efd14f54f67286a177ee51c4c61bbedf8ad1d43213f1823eeea6d62ab6eb70652c4e358d8af3489015db3611f266700d3a17ffbe519873bf73fe1c728f4d7d9f593ffe5d9b41e136cbbf7786e3a194246d164044dd90af9c241074c682a3f1e69c2c128cce653bdcc2217eec42d4126d4a54008e62e1201d2a6444ef37f4b3831d9ed9e2cd663cc92289b20ab605d230fa5ba8628694ad8aad82f5b65548abbe051dbb27404cce47127f7baae83ebbb5a5b39e89f1b03d2ad4f3f0e185a8c1de7c2f2022ce20d89cba8c41927f86b74371e24ccb4c3dba46c83e9c386e1add2da95e709c20e9411143376c8b24e6ae23897218ef3f440b26b1eb6085b9a9e7f1b531135ddeaff3eed509645d7f64869e13eb6cbf71cb1812b682a68e0d5ac773c830712daf7ad57b978992d0370b28fa38d3af018bddc952ff8cd51c133765fb08e4f2d43b53cf00b23f5cacf5e07c7f1fb4497e347f062db59154f77247a9d0a0d4ff192b41c9c44eb32bb860ed6a77f115a2fe15bbb7ed00178de7d3927c3cb689fec5274dab10916e68bd2139db28d57f2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e95569251eb099e04902857d1808fbf03ef6fd2f4e194bb72f5e94867813d9cb9e447247018e8cc1787b1726420a59a1ba940642f57b8bc2a9c82d1d04018c8ffb3fab1daa2f2ba27c89da2f407277181b756675a3eca32c4e083645ad9a323f8a97522d8b0afd1fbfaf4d1cb5c9dabfec0b9c1bdbd5285066bf3e84f7566166c6fc260b26aa6795dc6bfe62f4890b05a6c725ca0fdd91cb9e2da47f53bea0722ade952b0f95f1b13d405c969f387e85d65881e4b25e661a5f040689554b65fe30af0df1a85621de6cbce62c1840abbce5003f1055e02bb913b2e3376e75387772ee1f1373538e99e5422997e23a19177d8ecbc18d0b492466bab90e21d47e5a6c2c36f503268e503160a56eafad5d21ea34a67caa2844f8d29c0671f1e1ce3386e9f40ada47a7bdcba8d814b2e2de68c5925d964fdfa582c1d74a0761159e8f4d97c4e96b2f612f3e7b402eaea323589a385fc2d089f16ebeecf232f1e875ba3ac6280538465110e4686c10f546a28dd2973b76fecfaf19444d9d8926f2da60d8e5abe2b434fe2f67e0ba602945f254f92f6f270d09452edc99ba8e729d330fa286af068173aec73384b9a0ad39995a88617957addf39fc0231c797577026132229dfe5027b0974d1c4f8370399fe1b0afdd89d33aa142d3fa6435857f40a17c23f8d12c9c384b4bd11e4b7dedf86f2fb250b4c31126a1eef77cc25f691858a2d3854f439d5b703600c0d876182fa9ed3a78ff94870826dbc16b0a4b5e0fee6adb4b61df539f6ed6503e14a6e1c9f6b1ed5e528cc6d137610139f39186afcb9de352f046e68faef36a9fe5547150bd45730996f5f6083e475fef6778087f580392a3e2c17db09655f5eb35c7ef4c686f7581b1153e36a25682944d490c07fb6391452198408c8fc39a2aeb4884435ef89bcf8d35c7e2cb5613308c4dbcd01d868740931358aa02070165ef1f58bf07a88cfa119cb994210fb9cc0ec93e6127351d9d227aed9255e7d1a429949247cb46f10a24943bd50c481d6eba08ba427f36fb63b51426cdf22cb3ed81ef5b64129c7108b063752bf4cbe721785159fc8f51c89a332a2ce23f9e4e4adf77da9c4470b5fb9c529021415ebeea30eb4216be502d4a86042759a6044bc22b75387ac98b64ebd0a9b43c5bca4ad3ca1f9f1873f9d17c95ea3ebb8d27515d4d319c8309b527e033b00806aad634e32f35958b18165d384824998e5ed009242df32f416db5a6e3afafb506974c242245754ef6146d788487f9615d80c51a1eb303183b5b5588fb2bede2c488f2c199f526f2e1cfc7cb6a3ab3bead5bcf2e54c8a880f93c5b763190b3b8c9e692b44f2892a8d4b1ebfdf14998d70857b5eacc522c8f047990178cc4495f9c1af2a44cc4ff995822a3b7219cf1d5f5dc41f8903ad56ce378bc1414b0f7fec58adb3a99b2b6edf48ab5a1031c05dffd523900a869ec401ea3a714d13c05becda0141e3ddbffcb3151ea629eaf1e1ea62166a91ac6b8323e6118c0cc51bac63bc367f74026215b96df0aa3fb3e82ba7bb1909cf038836bca19d9c00cd55f3f975a9a6eab7a66c7ab9cdd0b20b27ada016b7e8132a993134a35b0bb99b23c506acf762a85c11434f8f12a4317f14ea6c2b5faffe6003251461c66597cce99223a89c3d4d6e274cc0644bbf2e8e5464745f8cabe1625a64d4736c343bc13bedc92f04913a7c5ceb75cfe56c19974aae5129db767c9ff3730d4eb8e216167f2a7f76ccf90ff526a1d8288c4583488c1a7b20a89a208782f2276a3919a74b47fabf3651ff2e6718f250148cd5ec008d4b6aca90816da77d44ab4c69257fbe1ab0f0d43ffe2640a87f760a8387c46dc2b3a88e1fc6c47e570d116bc5a0001d6bffcce6e3808820598bc270fcf59cdec0e5acf192c4b57a849de24edb13c8b7b0299bc4f920b474a0b9cdfe5589e5d20c53e08bb615c13a9a79a67c25eb3a3b8be0f614cd494bcc128be0f919cf2fe60970fbb2e634782d0d42d66a12b0e5075398545cec84ae753364b3f7d63feb994cef570dafab3ac0617bea9f3def59b9abd24ee3e34d6d2e67f6af710756995a4b017b027ee489a31b775b921400f8a0f9013e602e1df85634944c0b299dc9b78869e027d06af533afd7b1d91190528bcfa7bb584970e06b3dd0121cb99ffd2f897b1ef440b90df0a31f85dad317e7a894584e12a1d0b5fbc83c8a3c33b79420d2d79fee4c69247889b1302dc4f238a5fb755f45e3d7d986882c1cc0348f3f39d8e1eb7c5fc5e929b82f593853d9c5f249a177687bd0cb79e241527f18714ee9103c7a24f789cc82d30c69812c19001c234f1ed0c6661c646afec39f6c2853ad2d49c48eb01f3f225ebad9aeaa4a8791fce0ce3570024cc476c6d8c7bbfeddf4749c630ff5e0b176afcd22075ad8bce25af90dfcf53fdd28ba3c1a7e647f5e6d7aa6de2f5588d3fe6ab5eb21ba6e108ba21a46adc2692dff99c0f12a02245566c3eb8e733b72172803f79d844555430c86a700be6438efb799e805612188437ed4ed0c623436eb920024a1b58848a4c36d31d4a5570972ef3f23cfaa3f15a914122dd072bc31d1bae3afa02bff92b67eca4d3af927655814fe16a86ba74716d52020633b501d5a11330b016e17de086d225b9c3031d72fb75b13382c16b6ed2073673d128c33f52352c95dd27d751b3d09ef80d112c93a54eaabe771f9cfcc948054d69ecd20336fd75d1e1f7d125f5ce56b715246d6285c01634ed3ccfc159fdb9bc8369f6c85553558baaba310455b4961f64a5a687a6b43bbc6a80ce658a0e98e7a807f636b82012ecbed9c098d96aa65881faa0aa0d13637f785360916464ebf75f2e9cf6664af51ba7ba46868bd8ce89f48d2372c4c3d4a49e1d4cedf0e5f9133146aeb067bb4640edc78b7973e756db46c5f787d2aed65465465b20357a0c64a5b7f50bc4594d8516675617987d8575fe09e3923fbab3b7533655d33b0c6a1243e939b0840e5210ac0170080283a47fa4c3b03b13d1b1f4f25502ad0b815c4493444247afc19c0937ffa2f5b9e2fb23c15a262957da1a34ca0c2957acc32a221e31d7774e5a74993dc8b286c680d287dc360d0513bd349e61c1947826b81cd56b16c2e867c022e848c46862304771d37dbf2d764d62485b41dd09b9824a7a85025cc94305ddee1ddf5b8e32ff1e1f302c5d4e250fb19d92f2c951c2c7608b596c6cb5302d981f608bf5ea9d3bec26c6727837b960927d6cfaec343afde1987a30ac4d56e9d9ffdbd2fa464ced9bccbcd678b1db49ed2e11e3ad79c92db7e910d6865b5e4088d4b33fd268e61d125a3ae1c58433d0aaf9a83576ea185ec9c642e761a5ef3b8ee71357e51814d139176a19c7786800b1265976ae4dcf98ff7738eaa5f5b2e0d18021a49c207e13f84d7208e65423deeafd4e30bc6b96e341431b67b9114f393ae705ad5d47cbea37427a368be20b743dc6acea0a0c1348777413e607c16d4eb163e8fa9154a45fde40ab2a1ce8c9c993c89e2dfff7f1ce895047f0f6cfb4251f3df214a110b078d58d2c6c032f04e5d24c4a8003f6d67e5f20e00cee01cec86abe4a82f343983f04712684a67f65d1e49ad86b7ecf6b5ee22b05c35721603f7c2b19ccf1b403bc5436c1fb6fa09494affa7176d84b5779f8bbdf9c9af515903bcf867b022d9af6ab222457c55938361db43d2a7a3242d48a16961f1d4692c591f1ba168d7405f5f37f78230f73f9c0150f630eca4cd679818551d449db82e665d8dc25fc53ebc11293e4e4b7b781397e540bab3161b86fc3503844867e8bf99ecd1530b68ff463f2a7912424ea75a942cc5f87183893be3abf74f63df5550826188dc023f3c9e27902a76abed7801848bc842ce59a0d6fcc1a2d72d409891ae4016b5cab46124691ee4d3fed MD = b1934f70c974749fe74769d3fc2f2f2e9e315f4299a739e77c7317f787d8d4d48a8513c237773f1a3af055b4e20b1290 Len = 90520 Msg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f42831f62c8b48581b458a541550feb6c20120113ad20f22502bc9041149513c98b460238c63f57b51f03dee87095de0cd62cfb45b42e5b34fb5c08c9a94a9559901305f1594ae8e9c834c7bc4234c2178c86782fd5302758f73614d4fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b2cc80a364af437dc10bbd46f56290a85308f3c03b732ea7a0d40d6b79b0865959d694716e18b5ab2cbceccef9d008132f5d3b4d5988ee0796d02e19ecdc05671fa894be4ec06150454b97c88db3420a5aa89152a3001d1c81f1148b1b8895566490f5cc9f4cc2e7ab1652c60962db0865799a82909f4840f2b53531ae6cc281c94e3c3ed80456dbbecb924a25953f87c02eab5fbaacdc2f597b249fedfef983ce2edc87718d99c700d9cab74a90ec230b56684c79bf653226d157488295c6d6e3c15b29044f081401af80bfe10c6d44a77f45cb665d5ff3fb5631add4e796f59a943cb5f8df2e6d41db48a6915e3f771517c87f08fd48ef475868428d6b066a6315f590d7a4791d31db871dd41cdf34d49e74b9ca159c7e8b765fa8f476819fcdc51a5c194574ae623ec08811aec90876a1bf1e223ce73c482e8c33a2b085104b301f7a4618bdbb53638967e2aa996c7b901c0eb9e9a5a2fdff7295209fad666bd5797de6b490be75e8465fcf96accb4408102df9a2544d2d47a72ff6aa570c9023ccc963afaa125a3b8bb220d98fbf70684fde69dd7f9546c59e768d571e7d58b96dff4540766160ebce118f09ceb3813f0fb263118405fac7cd0b6d2c602335f4f182143d62263a6781f072adc641e70af42cadd50e3989ecc7510e90c8a8b864dbf458fd19cb374d4bc1741c22e5124a71af82ae7a8a9492f1d9fa3ab4884097a1c87be5f9eaf7eb9026fbfb5107a37c2cdd89e45583ab58e128b870b01c7efbc77105ae7eeffce0d37382c1cd441b2e6a294c3d2bbf2ebd29afb1e9580fc40fd1708ebd3554a6cbaa4990e61404d9cfde05121f7987af2e1fe17eeaf8cca05244596f78a9b385ea691bbefeb1d47fdeed03a3e1ab879d2a5860981c2ecd9451949e208748872aebb45c5562232d6dda1ba74a4a5e498940579f65f3769d208c46b15a5f9e4a064df0ae0cc6e49a345fee62adbfee27f3fe821090e74cb5d560df3575781766a86fc2634d83728553ced9b82698f7ad5db38c46718e3da2138dc28cfa47407761ef9e2e802e59895cb5622a4d8be764371dcab3b05eb5dc7b51953a6173a5f6f33be8625d2e0610bf921c3b9b0f59d7007bc1eab5bf31ef6d6acbc03353b46fbce335a12d1914b5ece36c6e9779bb605a8c064dfa465e357a27dab0f88e084c2f640a6d8865e1e37527d735bb7178aa959d0c70067a87592217468f2978fe06db3cdb19e79b0a13d8edf1238f7d3e10524d48d362d249c4e5b7a3ad3eab124a40dc2c48d33f09d198942eaa7c03682c010b4ffa87d411f3359756bda0aaf160e0d0727cd3b84db724b9044d199a837832558657fdf67c8ea224f41317eef7f54ba84228519d620f1ddaf68de0a91c6f66ca807e2dbfe5d1bbeee05fdcedb261e1d22fddd564c373e46899ef59b5af8c0ec8d2cfafa6ea76e363cfe6983dad5133cc7fffe7950e7008e042e3ed569958aaeed1eefc31f6e89911f769a245352db215c71100a49f7dfbe0a5fe23f2765fbb8b223e8bf7a7a17d781b3bb39b0661fd4ca9b3a929f3085dd827b0962fc2fbc14c2840d74e592be1049fef24a58d9875bf7c5a598b95a97f353c8dac451bd74ca0789876cc98026455f9f67e0b373bac0cd3779a4013dc009678f7eef8cd5cce067797e2f8f0af87eabde448229fc610b3338dd3edea0a625a5171d6b17406c60cc9e19439df9dcc11403aeb9223b23421012f9efb84cf152f5aaddbe58c6fb511d3e81325d1479188555cf0c06f9a96f4e0bf63ef80a4a953f8ee972b92e22bc42a2de843525788ae31dcf033dfe9a99d46cfcb404a059f86b0c670fa04288a8221257bf8ff2801f17a4d6262f129fc98a7d32d745d6c582626c801b77c8d61da7d5146dd2453ae0092f0bfe45fd60065885c1322376363b0af65b20a589b324b8353e1566e44ed4a1099612e586845826ced14a0746562c4cf221a5924dc8c33d78fd40b3976304c879a0ea7877b4c7dc9e89a95710ca5c11a7f933a6dcbc041fe778752128217664c6510f6796975c623e11d67d9a3dd33f5e0c5149fd38ef44cad83c185d32345e39d00819acd61ea0f69259dfad559abf5f8187e37ae48b9569441d00003b469f1a465df58018167f0d34bbe710bab87af2815ddc1967e0fa0be5a141d7e7b20eb1da9765dc064ae5cd1e83fb8d1535575f345c9ca36af65cfae34f43abdb829245b53dcf8647c4bb7c793985ea0e1a3dedc10b8bdf94d6a17c65b06e43c2be151ffed79d47848cea636c65ecf04c6e16e551f212978e87b3da934a2b69426c7e88deee36e765a859ca209098677839c98f0b9a9791ff11785c96a8e0e30396b5c67d09022e9122eff8bc41f11739843e33188a8496907dda49964ff77aae43a12102b069e4b102963769015fc738565d199f4a3f6ee9d2c0ebbac9d6f6eb7c2ce3956bd3d06c4e35cd4f574a411db70e89c96332e1b11811882b9ce71f61483d5260c3a8bb6b10b30395cb1a4b8faf39cabe5cc3b79057b769115390bdb9afbdb8883f506d564ffa2164e537ae3647c625a5bd5cb7309899d693733b979bb9925b386834aed414f16fe32e0932bb869de2a60f64ab36e29f16d9864f76ad6fa58496c4ba468d6680353b2df99ec675a649ebd943594d3eb1730c1434229ad8de7acadd4bfc2a4d8fba936a6dbcfe1acaa199a360891bb3b73354a3516308fc2587fd3b509953d10647146ece520c7fef34dbf625054849999fd8bd1001a0e463f157642fe6affbcd24e5c0852997acfe48d758f9947d083fffc1e9d8c309977e01ffe252a8e7d2cd9930e9f80948a7e026b55444fd62f9929b36b01272eb1d60ff1e3d1faaa25eecee1a6f91b9c77a7b169e6f6f099e2378ba609824d6f07fef33dbfb00b389a8136acddcb703bb2db95fba33e080da8fdaa6672b77b7bec415e45fa65c8a44b72b5671b7d1adcdc6814b3027002abd43a1a572f173ddfdf4b95cd1c59af87a941afa2d894980a44fba2029d337cef049b300a97180105618c3e15ae124c5d345ca9e2ad98644e9cf4e27ccc0ee361aa9faff3533071770371abc228161b9f9d4218a902ff0c1434f24a842758b28e4695de93ebf6ebbf559a835502db99b914809058613efbe5bd624ebb27a786df593c308eb9e1fc48a8654930d6e943546aa6959340eeb05d86c363745581bcdf72e16a2655780fad9c7062080ca5a4dbd0128ccc3a74c5c631942d62296de0f8f433d00d472fb248a23a622d2cb73aca15530a75b677a8ca4e6300e73bc28fd67d9206a5f77f70c45a31de22af9481a98af683223d5de5d42dae8285d53605d27f8a7272eefdc78b14e51a8b1db3f5f4a16b8b44479de96e6fe536b0ae2f0f877a8ba816a621131762c2bbc8ef9c14261920877e6dbe30137585721a2f13f96fdf241be3b5600ff3d459365eadb378c822b40c12f845664def3dd904c08b5ff64dd2427c85510a9aea272eced0a070557ea49db4afb9d8882d4ce0231b0bafa52724b043ae6a9f9704aae99be0d9b7588d6090d5dc82235cc0510bd7970b65070b89e9db89233b52c4531b4866c59a4bdf7699e91744b32638d8d0a4bd111c965b706396bdf16a6899ce1856cb0ab5a9d5651d80d868249f1742b30cf5a332dd97769227b57bb943056a8549960f85ed0faaa01fa862e401bc2d4792f9385447601b19e0f828847c87b6d683504a779ffec5a627ffcb6e08b806f2b90046dd6e15cc4f64fe7e686fa14180a67242273d2324b43c57184f1e9b6e48f1d3654aac5908c72640e3e1a6e2790825749d014f0d663ecf36dff3bdc6a1bedfbb0a389c8a6ef59767ff6cccbbfbf182efa192302df8ca432768f850da6fb8d55fac03b92a5d7f5acc37862b9e18c1414c0656aaf56adb4aa169c9924716eb6519d1588cc952b8c2f612aa4e297dfbd30221cafa042ae6482d48e3dc8d45cb1172008381e7ed36727e1765cebe8a05caba8a6bb7cab76fce338ce3aa1d5abc7d00b03122f69b6cebbccc3507fddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a87849447c0d9c5c41d44798150004de14d35e95d70f5eba3aae673063d25f5800ff0fe2cf88cde364475827279103c89c6916ffe7f4713b8f2e727082da19b259bf6a02de111368cb2e4f42d58b0adbe9ed463fb6dcbd4e6b54c810c2bf7f483d20224caf91b813ffeff59029d4613e85c5b7fd4cad8b1c588a30b72b67d943338afe674dee020d87f412ba2a55501af85b31e0b25123cddd38740dc6bb6fcac465c8fcbd123a7eeba36e67e0f61f97c8167c90efaecd8883c45abc9aa38806761946b208e3a78eb466d04054a015dc7f5d5fb60baed175d097ab69af086e1fd40e4132374b936369a402ec8d397b12a49aa3fa0f3876bd4e192ebe0ed0673c63ad80235231442892c4ca1493aa9960c03410030233068885b2ad63bee5bc85ad5ccd2e5f7c0303b830f1606fdcb7ef5a936e7aec89c7fdfccbee00c72db5233984eefb6816181c624f3f7728b61de7fa1f8506d52102453bcabb3c3292993e8f8eac3174e6cb9c18897b02c61f136f29401d50c6e3fe87ca19dabf06fbb2fd38e0cf788cd464ab62466fa85201e0af6d5efdffc6b705ec321e13324b4f4689bbe41f7ab7c82a70c9eee112d343cdd051e1eebcde855d9cfa43303d0a789e0aa00164dcfdaa6614d4e99ae851cd22fa5a31b82f15354fbeaaeff7874a5d02a7709e6549666261be0ca062d1d587275412b623ff73af237bca8932b913e6b988b225eb67fbd96097f77900756559230700d8f7d500db21fae37ba77a6dfb0dd6eefdbedec3f5aec71fdd3e7d0c2b603aac00fb58c5a291647c2c1f73618444b9ac8ea657c69f92750c35e291cfe524169f94f831c9eabae01e04614cf669a75875406b7a0dc053ca44e7b558b86fb8c360feb607149de597506b37ac35927edcd07bd4ee9f3e3aed515d7f7bceb1646877a4fd83afa15ab09ac9673b24e8116c46a7aa5c85038f06bbfd08a119936f2e6df0954da1e061548486baa2ce51a7315e2cb56bc5f59a3f08311773a2fe233cc948450cf24042ab970af88938b68a53a072bdc469fea2bec260769970d8c6bb1316d668abab44dc5abee9976c0000f994e28a0e7805f1ab70f1ebba8b0ba1d2d4c1110bd308b010560854757115524bc3e2e3f2fbf1cd2f9b4e3f7efc7dfcaa92b1bb9a723fce6e115103cb4fdfc872b4db9218f9ac7f72cade3a8fca181f6ad84e9fc09137e61f1502bc400e45a996ef365d277a1d4e9b8509a392fdc2513b2b00842336da404aea81487cb72e3fdefd590dc8872c84d2553744329e65db45152f316b6c0f241816386f285284d07365ae6aa226c16841c0d0e315b4e805af1d436f4138bed9b1238df8ece52ea57daf9b3b5e62c4410d503c49e3473317a2cca4064da4cfa83c99eaad6f7a140623648a4aa3401d58618de43e45602e5945a8babe36b72bd9e1feb6545a181e3a8d0be25d1acab5f563fe2e89e205c113c13bee5fa479b8b4cadc59b654c8348be42c0b3d6a07725f3b2b83f46441d48c3d0da6b041f35f801cba3b9b06913e3f504f6db23cff3de0129c4c4570194f0de2a44b7ab22c09870221c4cb177b249ff8fd708338bbffbe10daef45b1971aded78a4685a22c9c0fa2985c0d308ecef305bd7c7a05429e425c6cd6bcccc21d474547fd99b7fc026124a76b2af9d324839e18f95d4c9c04b41fda67726ca241905461da7e99a321c5b1d659eb19510f96ec954ff5b4d2175c80ad0c2e37406c002b6244fbf129e38271ae8e153910757617bce60ae6ebc181a86c2cbad5a387e0f3d2a3da67972ee28bb67273001940694615266489efe86dbe9f2edcefd37b78d3375ee1a2f4ec2b27766dcc177356b8a12978ca46e77666ebce7c5d2dd92e10f41bdfd94b4804a66f77e8e72526a1ab517f4205c5da52b557827d0436bc8af07e058d89099c5e9b8940498dd33b07897e9feddeadd064a22942999bb3847660987ed0bb85f7e2529d5afa86c9b9729c4f12e21aa7d194748a9738e84b3ad9a76a0d103567617812d44b619aaea8c92aed5f88845ae6ca75a108c2b5a7e59d0e1d3ab5c056e20825559de8912b11f47c800e46e36f16eeeb971d9fc86e8da9ddd98d2724fa837ad149d7f632e7fbdada2fa886fe8d6ae81f935e38e9493ae55cc58fcf29fc4bb65fd882f2468b6e658b22b4af9e5de8a059be54f3e2e0f539d20ac713970443a41729254695be727cd982ba298b869affe13f86397adac58d89cfbd5c35b9712d40654859e72910070a77425b8db188ebfe3f7c7378e0b3c9c73dfa13ccc4df3723b3749304734fef6728d5af6c86b94df9e6bf07a599c6d5d57c059e24cc95ab093c2f5cb445381a38befa8cefac350e1a5bd65fc9ae0699fbb36667057a99723828041cbe47d171c5603a5ae0cc0414a9c749e1acc67bfe800ba6d43776f572f99e783beb2024dc55371c82058d2f49ee51a1f7158a2eeaaeab4c4f8167b19593c6152103793944326b286a2698bc9431226508cda12646cbbbe03fadf6d3c250c96237cef9168fa223e67b0d94b6dcb9611d7b9db56bfb2065eb0c81ca65e176cfe7e31349c5a7ee87df1d812a220bcf3752ba4b6b06f0f5cff41dc68c6ed94eff2d8e9c104e725ec09ab949020a08bbcc8a2c9f6dfe0c922183dc43e3f7942082bba12ff7b7da39f69fb52ec375bbc547503963635b393e8420b0c27807f93480198295a60ac6c950777bf8166c0c35d129495df4265e4220540109f2a6f0d120d09b96c44f1d54f7a9716fa2f6e352919fc456c96662e61ca638e2fadc61408a6753f9f98cc92313bd015a101b2865b03913178a232f72a09fbb1338b234cae7661188efcbb17ecb3c928307e3c3b655809c65de65ac2ed6c5f364532f51b55f563f094b13bdac47ad8bb030579c8da9fac80b6d35c162e4a3489ff45ca14919be4445b86dd5f7b09856aa337e9c32d431ffcfe09a5655f2be238ac23f0ad03e268804dcdfe1a52e855a39b761a9ecfdadaa7bdf9d535029a0eaef66e37590f516730d5f74c9ffe8fdff246406ac054cf42fd51145a09bb0d00794874dcbd267176d2aea31754d0787ad35e3778ec3ea90f8a61f9a267eb0d6e041ce87f2debbb0de212520ced7b2accc32dcbc356fff096bb5b0a4cb41513bdfc0e298d4fc1a6a2ebbb748bae412f3c4e4f6db8b50b2e5f2cc6d6c782bba866ad86d885874acccc5c049b122be4fe4fe13dade77b02caef4b1fef91685143feb50145f658d985e0bf88264efab9007e08730cce0d595ebd92d0a538b9786eec9f18126e59107a8692b0b6807f4fde5d3079faeb008142508083983c1a9391c6c835ce5bfc6203345208bc554e1bf05405dcf8bce91d1e3eb0a35909e0355503cce4ca2db750c8608a0ab84bdb9feef8d4f696b22b8f5ade9fba3820ced0113a199fa6721e5f2291b7313ac29c6e12c24a6155794c5a80b6aa22e62f2ae65ec03ae0e3b7960fba5e4616a45824e91436b297a550cff1186d6c87c37378faa63cad32f27cb2c4f81cd325858af9a36bccca2417072b059a596353509c5d8f8005ed10531ff9215453dad87eb98f2f720add711adae1ea7f110b102e083d1764c276f3964fdda767a9c9b9c09259dfcf678929316a89124f1ad048bc559c14dce8e7773c5ad4c99a751c442b73ee56ec694996fb24953f82dd5f577bf2ff2a40ef9af5a5ef730a754c6f01fffcb10751969b44c8977ab4a2df14e6ed7edaaa495d1e19736c4cdc70962e7dbe8b46738755fadd2a41be0427a67d51a147c3275ea7fd3d255fa6c224f8d701f7ae132e065de4baa0a1e3b0a9ba153207ec2d23e96694eb2c48355dfadaf5593be3ab9946e4e557cc36604c718058f2b1da8d1281ff919df8a45d027ac305cdebba8437d1a1794efd8dd83a47afd53e1fa16795a0f96fe02af2a2522d2794ea87a111ac2f0a1d0ac506affc747f065ea1cf510fceda7c3c33c199bf7aaf0f29b015f848d7855d05b33f4c2580a468eef8b2bdf38429631c938f97bcfb9fe125d5a78ca033b995ea38a6512804866969850a22e3495ca10bdabb40dd1890b74968d46344ec0d6402c5ca438668bba458c724045186eab28469d319926a180e1efa0af09968f753f9fb1997c345aa96374f9ef6b0d55a1400d175867f589c3210f9d9d930231dc23a4912c250f3e9bb7f7ee96e93bd31422b92011bf67ca3efca08bf718bb2d75b4e205457d21bef80abe581d07c96f6c94f3c144e8a4eb583a4773a5e1e90ba7ba0214ccca92622924703f6b0ddfb2115f6301d92bd37478a2ae5c8e36b254d9fcabc7a9558ab294cdb6ab6a43a7236c4bb0e8b8d01ced08fe7d4e9c5e418f75438625c4663037a2cd38a501f1464ae31f837eca1fa8df6f145c52b6a3bc44e2573b360544ac78bbeb9d34185ee7afdfa583ccf55f9fd215acf16ec44b4cfc88007102553927fd48f08e6198d3b0dbc9a359d922da294c6290e7acaf9f183dcf06d0929a8bc94fafa5b2336798c95507e2acad3ad66cd7be87e4145de749921f3002edbe83b9f55acfb2b26ef55ba5032a2551239c93fa915890adb76b0680e047ac1ba7692077af3935e695328e5423426cccc774c43e43cc957fa57278917a1479253f85255e18aae4d8c59689e9d1f428260ca527293cab98921046c64c555c0e126c1ef131fce9678fe46a75ec74060168dc79e645e4bd44efde2d1939d9ea16ea187eab78c3bf6513dbf679e57341a1991e36261aa4c93e9df97099e16f8537b52aeb7cbcd4f4866d9382be5d386dadc1ba25122ee29931a447576dcb7df4197c8aae8c83995073a4f3566cdc2a52d0e8978ecf0c07f3c30db229be7f6d006547200f0258799bd4c0e2baaae8b1b7b0179fb988397ca09cdf2130b386a571c31cd45506c0dc9c50ca4af5a00b3566f556b9ed633ea86865227bb275678f0fda058ecac2452a1c90c9125077cc1e2548abcd7488a4f212c6deaaf82baa91a1530936b45b6ecce33cc5221357b3d5bd5120c49420f3c468661c954afed815f1d530b45cfcc328b9fbc662866749c0f6b7bc849653b18530eee424ef167882c50983f00acbcda76675d5baf0d01548972287f6c248689c33053c3f319a1240e69709d206f013b1b153f9129bb9a0d56a3c8a025f289f7339542ece56b32fb71c26cb4397941eaf633d3b52cd4b70d035aacc91b71adf710a83c1b9a788564f2e5ecf2906df740744daa162cfae0f9fc11755891047affe6d39fde86c420f70e6e91f6e9cf89f231cd3362ae90905acd6292ed4b3d797822b1eeb44ed08e2820a6cc3f89e082769b3cfff926284d85e3b885e58e8f11f650cdb92b3710358ed6392c1b157369243d17706838449121cbaddedfff6bdd010d818fb1e425af819b900237f0eab6a183d7352e3957d3a5019d0e4af276431e9577c2c6ea6364a6ed461f14c0a8e3650c06aeb9cde4bd96121084a52c10ecb5951b02f89e6bfd7557b5b31ff94087f532205da94a7d976b79a2e27cf0de224c98d5c0c594a1c26347896ed80f441cc882beb26b5384f99ba4ce9840e5309c69fd427c9c51976c07491bb2cb77260a559a2c4d7e5d8d6cbd2ffe268f7dbab3945eeb970b49df42b7e8f72f78c568e922d513af60ed09692677ac1db72ecee0321a3bb08101cbff1b9396255e7e7f21c6dfef3891769b679e1862de567cffdae9dbbd59ac0dffe998c59344eb06eb5ca7f72979be8e85e05a8ebce8fbecdfec21ffdae2dac2edaac61b590eacf33fe25cc75cf316998b8c024714de05f2c1ac51132efc9bc517bb19f171c322c7ef6b4bccf435582c0e931bddf52e132347841da223f76d88f0830ad45832daf97c4ffb8479a0e1ba71ce0dcff8498202f41bde295473de831aab2f5076be341c5928e26a67c651c967756e7978c0f0f639cc29153af25d47f88bede277d5dc85285ea6fb493606dd5221a4870114ee819b2d74f231e3784c1cbdcd06b60a22d84c79afc39840af6ac46b46552bc5b9499aa8484cf3c7ae03f9a94339dbcba59a4802634fdfa68a0630bada8053540fa2bad51981db2f6d1411e6f70833bae33f9d7177ec79b845141988c785023050117e3c7f3d628b33d0e7ef4ede68385a2cdf5f344610f65f28f16d93cfc2fb093a4736dfdc245ba0eefe3ac138d3c4790660245ed91ff136c96ac1d5ed1004b971c86cb1fa8b2122a2c751d4a420ffde40d2592e1201397a59b83de45973fddf4c5436abf5117c37b0d5bd1fbcba3ae860a866487d6f2f887e9c2a75916936f94e8d3d147861ad6e7d9be508cf1a2625da54e42497a453ef9c792fd0216a5085ecc5d881d0d665258dac520677cb1215326a5b58ed6b371e27c1b6aa85e1cb03abb0a18abaea13fb55699cbf2347af44fd4b244bfb0e59a2c518475b3b7a16f10fb0208573374a5e69661d997e1a5e23af99e7742d182c1be8ef6a78be9dc4ec8d56ce08b62868dd2e246d0bd4adaf4fadb90d6800133ec807b988698bc74544b917029ae0580fe6382703acb38c03178c2b1eae107a0255a5f939c43f8128a7f77386a28e2090180bd069e2b73ffa19cf8293acead707334840e71f2645df64dcfe92b60c2ca9d11dc318544c3404c4fc41f4eadb94cdff630328b0ec9fea29de0aef5c06c6adaff2718767ef02b3b776dbbafe7f4db6f88ac277400ef9c9658f3ad4eafaa92c030e6e4f941c16775fd3c27e4e526c62dd24014b42f9ee0d964500ec19542ea588d61bc96f5ff9d02ca7988750e17b421bd3321d1029e7172ab3ffad3dbfd19a9fee0c9d6027274ebc56c09ebc98e4e522fcf7855e3b6f96c1408990ee7a3c8bb6caa3240d1e29537d55ccfcd80553cc8115a3ec839b01dcc86f212f922fc9e97bd08205dc817a7eee49305a39a32258b4c1d9eb06b52879ceb468e1cf4cf4444db42bbb350d85319d957d1f67feeb1a4c660be97e365dfe42a4d3400c6e661caaca02accd2ef41be9bf15b4c9651891a696bc60408b0ccaa2b4c2d2cfe079e321a699630b42218e814a9cc30492255f51c85df8042fdf7f8d68ea02806fba3830ce72665603a809c2bc64c27ff2bbc3dc6f73192f91208d5135ab67d448a17c5696003f53cff23e4c89202bb213267fb510ae3c295b8a64acaf796b2227ba3011b1d5468b238a6c7d35317731500fe37a4031d987eb7795de3ae6a4f0698ee3e0966424428afb44e3552b3d7445d28f7a72d099d1dd72a1846c757dd5aa7a1841b83f513082af37fd4d7fc7016108d4542cfcc58d8e06183db8a87e3857163db39bb945cb9720b6499291dc5f4e3d6285d3091511899c5a58b3e22e9efbedd4c4b5748a8a34fa5056c923c5f449caba9e0997e1146cbff863c2d4f770056b6de399f387e2e886968365882c46f04b3ceb352bb1fc83eb72ed79d37162000979aebdb8d66c2e7fe97ddc4167edee397a1bfa3710308ba94a645d7024db78628864a536ee8c7320d9a4b1e2015f801ff2aead4c8466c073ef56c23d7a52dae10ad3c4f048da5323d7766aeca0f242591701d2ce76f5eec5e2336c8dea5ea41f814aa1676dcc4af373818bb3af6cc19f87b41f4f70645339c398a1041d5560687c57df1ed5e8d71a2e5488f985157a3da533c751f9489a29f3e4f4125bddac766c79b289199663f2784de700da92d8ce001f8f488a09102103a6fa4b4e6dc4a3c22ee038917b8e26e1fc1a7c185b69bb18c5bbc59b2c71a9635d18116d7c658b2de5dc9fe60ec231ebddb7cdb6d599af6fc4f14bb5292b4da385d207318feb97004cfc417fa68c8df67133683e9814f5659bb43d6095a96834afbc8f232ee351d9c2e3afd6f96995b24511fe38293847aac8692d15e88893a7493c3bbacfc9461ac6174d747dd6037fc7d7d20bff8ff09fd9a49d5da8255a7bd0d57f70e929de63e50bace08a4e31ef7809965291889ac52deb00903b1c2712d51cdcee117195159e3540a3c55ebb61e40bbd8465be90bb53a0e96647d9841cc486d67abf3d14d060289b26a5740a778a62ba1a12ae9cd2d96ada3824f9ebea3d87eebf78d8a804c95a2ef1b12aa9a0d9a30e9bfeb4f9ac2dad359e78d9d91b9ea4a814a4f0f923384e7e8d6eef137e60513d82a08e41c7defc9e01aa15e61166717522ea0272cc3b7a0c62353dc250acd1d9569e770f865bbd75fa3f1a6d7c3352e862ae899f6051615b08aa9350d81dc934904f2bbd9832744fe0be7409bc73ed744c7902e97008a8ecf9458c2965418c01b838f8c65dd1b5ae7d8e9f3542a6859b48bfeaeb8bcf9524ac8c84c698a6beb346f28ac447e805f3f956186aaf59dfeff009be100424daa4aaf619a2d2bbc5bbb5024e41f6b3c9c31c7b6c2472fc40c4daecf8e18996cdef7cf8c768b40f259d9acebfa9ead3959e2f8506fd0e0c5ccc51c037fa7c9403678b3afa62bd0f72db60de5b6684d5dde7daf9755f010888690d29d7a56dbaff9f6e034f3b4e3b21f79fa7ae2265392722875f33b4dc8f482d5580748cdd6a37198e08125cf810b774bfc12447fc5bf5e0bd1ccea8f0ff307bd37a7b1b3c203e48739000423b3ea7c539a15a61cadcceb504b8a2b5fee6d5e70f6e77cb0a8b79bea76175759803777ba5cebcea412a05e1c6b95c4656c48d0151d2e736e8fa6deea1c30e818f1dab0a7cafc84c0fd25029aba557d48916da3d534e35c927fbaf5afb5b27d090dbc6f436db0921875421eefbf3320b065c41fd7c47000c780da2760c905dfd3dcc3fcb5cc70bf5382dff94602957347f1358e44543c27b39beebd26de91d61f66d89e266fa2d21a2ce5dcc50ce440b23ca936436daf98fed7dfff287ebd2a95b4e49fbedfb094147c3a0f9464894d9c4e0661fd96311d513d93358f30f3a2dccdcd45a4a300cdea79c7dadc92ea62ab30365599572a7c54d3f3a7827d9b079db97dd90143fc44432c7485c51f714987e91f5a4038027eaea3e79d2aeb1b217f81daa2fc480ac3c89b2a57769285c9d981abba1ac221eb07b5585eae04dcb82b2cceeabe39941021d0cf9918738da94901c1bb4e7cf08b090f2c333750469448c240f76f9e01f4f5d34c94d24bf3b27e7048a705efd5265abb4d64ed56c27c7f4c17133500b937ecaa8a8dcda11eac21d62ac466a13983a2c1a139f79eb63a78d03d843be524a1af5f70cf30fd765fd93c4e5b9a1c856b8a2712f97eb08b94da599992a7d8aafae6fae5a124e763924fa99cb3c8e81fa6b9f787eea915aa534eec1387a25eb3093981d34ad1e84d0f2b25fc16198b71fcd939e75ea154793f7b9393a95301a7974efe21135e879c9c14b856cab58fe1358ff31c928df5621f0a550142e348ee6cd078b744f44db802b26b9218c37cd918852f0dd29680ccbca23b459879bbf05065f87d25bac10a08ae4598486bd8c06e63f4a266e47e1fdfec4b48f33ee3150bb5855bfdd96bf878b04e50a2d72dfeffd04bc3959e77c24e8f8ff09d5a47c6646927391678d3eb195f8fa36e2c02fb93753a58a8edf11fd2340f26ddf470692529e6ffb6c0824cb2640f77f395e01ef2facc49e7f8769d3283d2d3fa34e468149ccb9526d9ff810c66d7b67a384ed1e306067e9ae88da43823e0dd3d432d29fa6bdde3aeead2f4ef0eed464b3dd47c3041f2e009e4bf9caabd412eee49d3169e3e25d1951b840b22045b11aecdfa859f5597557c1592ed51f8feac556d5c95cabba94825969c306fef29fdeb104955f9e7fdc63aa29000f57d1d41b9d85210448d732ea480a2ca9c785df4492d485405a22d1c8cb4413b5ef3a9d464b23ceed55a8b6d5b041e41724601dd114c80ea8d2b2e3dba732c075303a74c9c22a39745cbf7eb924799fcb9021c9f8c977780572d08130c06d9cd9d552193aa500e735c87c19291749b653953b724ff34b77c2d4ec485c996d0f304901e90d66505eae237f1489fb1aae3b9e2d953b54bc848d536697a3b4a9ae3505da72b678910649e828df7052650de03568a14f505304a178effdca84bbe034963c34ca7e3b84959119f860cfd14bedd58d24f068979ecbdfe8f9259c0c4bdb74b7adbdc9c8401db8b2eddf95b7eec1090baec31002a958d2d1f8496d2357861bcd4c04fdbfdf4ec9943e4176a17ce64a549d4be92ccac51c4ba9aa7a9979b105fdae348c9a98a54e3e583ad5266cda04088edf566e69bcf6a65bcd36c75908cdc932d0e8e122cda101ca2023bf4528e087d201da500c9d0c82ad2634454be9dda0884eb51c04048c8f0295f4c47c3f4a632568076a39e1b8610c49f58be8d0b013fd2253a3a3064b56a000cade9899bc1af75640255827a4b1f7acfd13a659dfa42fd05730862f77d910f5187620d4b02fa661271a1ddb3bf60dc3bd651ae1c6d19eed321b240c8c86e3f760238b6cb101d12d2ea0c178f8bdad32b9089d05101ca8ed76fc030a13f0776c245f5ebe5952060ec952098d6579645e6266d33015f5fc45983bb9c4889669d7e7920165f360937a79b64c950ca9a1cb5c18240f72fdf77a0852beb864f939df3c5429e029de2814c246010c48df03ee089525dfa185391f59e96852339945c6652e2eb9672b32523579dd6fc48a095afa564f3d1c2c2f9a0f586d2e7ee73c422478865e35c820b745da284bea2b007693e406b45d63497e9b4823a9a1738bc6ecdbd74b004591b875ef780d3432a7e587b6f2b1efcb25317001325035be92b910c0780c7123f3da381253403d415e1c285789d24db42157404bffbeb6390fbd42bf1f1ee2d3d5912eeb30615fd7a18f083e3281e1cefc546e511241ad734137f53002feefd59571ace2960d365600a2a9e3933d666be4bd6ce8e08585ede5bdaabbea28f2b9d1f044910a903b5cfa1b8fe00281262b98f6ce5c00f6da095bb2c5cb2b2985f11991886ef496e94d0c4e1cac36e9bb8e77a50522ea22046611bbf8d64c8d340bcae9dae4ea8dcab695bee2b076d390f50f2c93e60273af84a63d9675d4a0677a644dde8b52e15a2a44f2748568db30ffde020d1df08845d597bc31224a2faacd7441e5dad43e0208986d44a3736d361f52d9e3232abc31e954bc5b5413677865897a934bd4f06cd1fe93d5833d05fad40bf888ae17ac2e207bc26783d7045ad3023c6966eba50526e60aa9bd1c3209ae780290075db4852b5b430849fb72bca67d2bcab47ec83577ed4623a9977ded1f157c8bd75381c16a91c2901ef72f285068bd59ad04d6a83582bae5e135561fa662bace869f807d5ebdd5a17b60b62851335578c9146cc7f034fd62fc8c370bc4fe61eaad983d13781dd0bec7ae9437399ba8ba8133d70f2872622d43f2ad5bfb36f662b4e4142e6750684abc6745df69d01b917dd9b1f85ed9ad97600f356ac9aaecc92509a2187cf3f0c7a1f1478b729f2290077c9a1e03c92453c9484bc2b0c8b980865f638c5956fec810f315b5d4475228c6a2dbeaa7cf5ac4f8247cee312ee11b417bd4d45d1806dea1d33cf91f772eee33d313e8cb5ad57d652a2567db3bf80bfed5729b28a59d5dad2829cfb49d1d32c783ce8 MD = 4f7cc474699e94f2576b1286e583a744c94944d276777d4393a5d478de1dc10e619596afc8ffd242f8ff3fbd395e674e Len = 91312 Msg = 22dbba2b1a39074ddac736767ebdedc37e4208b233e03b349735f9044deb9536e1eaa81350cbb224cb90048db893dd9dfabdd3a272f87402c5e72e8760d46cfbbaea02f5d9a4cbf2188590a7270a2c9653ddeee0084b3f5a94f885e22dd147f436439178beaa9ade4a0da46dd40824d813092313fdc0e4648bd0c7bdbccb6d49dc5d1d4506c76611e88f0687c6760b8bc1ab38e35a3eaa4a32d7bcbf13a8272334a06e03b9e279b37a757f9c053d2ad6e62af6fa26afdb3111762b913c52bdaac7754b5be0e319eb8826d7549a43c9e209ee25fd69fabd43b113dddb3faf77051c427df582b18fe19b0ad6598c7230d7b25f8d972b0799a899189b4422a99c5dbc70cd78a73623be3a894450e3b1a6dc6ae5f56e75beb68851eb2b74ef2776d92d68008d57591caaee0be8e4a8e77419b7e8272a4e075e0a62f65514ae104ba2f991e1db9b02c4cc3ef88bbbe2fee3b724d0e974bfcad756539fe3cc654e64dfa752370b7a19614db2b8f57d99dd39de360504f4cfef6a95ac509b431ec809b9c015c9c4fd873c54d2b3eed3d56cbeb577ef4051865e5feff6704722e0668258cb4160af2b329d0a27523e659f93bc656ef66433ecfffe8bb767ad10b41016e3503ec4730c03cb9738fbacdafe3a7915a3833a440aba8e927a9c96b6a0ae0e82d873bdb9a8e210228d1702dafb493eee9ffc8829e778592bc479c9bbaf28b25fea4a132908b8b2d3af0f060f9da85318e9cb178d8b1fa57f1f6510c9e6664a9f0e2a8d6a336bfad32549811eec4000ba0956af16ff99bbb612c831854f511e6dcc7bf52531e5304a772f3ab2f0f78dfd8807176c4acce3f7260bf599f1cf76efada611010b0c9c602e28fb71b2b64108ed45193874a2656ae19424add4c9994d3811aaa7c8ca863bd19b8a0339666604c0777b2286028838cecc86680128d0b0f62587be70063506e8f2b0118ded42188a0706d187d39589721be2737fd263406d4a72ef0ca8f2e7fc943543b7351d6dd15c82ee7fffd48457ea027556b19a2427e931e2a297050694e9e140be24412a20deb720776d8d52049fac178facbc85ac688d3e3dbdb68c38597cb1aaa4f578fcf56d107505081a01a4a90131aa138a82314eace2014da1704ccd3d849c807fef096b6684af8c05d75fc1da4495e55c33aa3cd39b4b116cc52a9d8d53f32b6680827ac9a953633b0d3abb4bd1547b22473d1e5c6f834b16be5bb4481f933e5638c862e1eed9d3e32b9b61fbdecf1d054451beee679243c6e447da17f06301769d43eb575a292526b9ec799376ee132db44de232895e41a5bd57d7a2cf4bbbef395cdcd3f52ca12b4094ccba9e99a4c11e9b53cfdfd08ddbd3f17290c333b6e89479fffcc8c88e1b48fb221960b819e90ba2d96e71d06e8fae7f748ad503388a34041a7bdae6361d57894357c333bacf02ca3bb745472eead467a6370ca38afca363f6f7346fdf5af7a6f61dcff2cf988b7b4351651b1313cf13cd4070fcf46769005b19dc49d2f9afba04138ddda06f2e1db7e5d936663227e9b44c09f4bdf30c411189dc5e5723072d36e004dd757a7418601aa77e6e7162532204e0742fc71690dfee3c94b5008867522d3dd895e1e4d50699d9dd75f60ab7de0ffc65900c0f548ef102d536b7b9d120a13eb749cd07ba710a773ac1e9a67fb11765ad29e97df4e6393808207123d16ae51163d96663306813877c9b73bf1263c124364287eadaaf6fe515bc554cd0f6a0bec38dd382a0b55f138d4bbcdcd8bcb740e6230edd6db13a12e3528cbe378d7b4bbeac3dec701e94225419eb853984a1c1a713a5df15b443c65c2a3d016cf71ec23e80cb270a6c5bbdb94d28439d8226b0605c74773a7f3109678b919bd9fc302a2a4fa6bdd4675beba42e9d9c6c7fef14f944a42d44dbade3ecbfb016e4645a8c6962f53638d63db4fd056f1a0e43a4f559145d899c905f5dd40cc1faf7f643efe501e1189c82a820ac1ac945ec96ec5b6a13c614a866ee7e05bbeccd797b935b857492ed6a3445389ab5d1a46c406f4f138b0855d125034f68135b19d2bcf4d931022f3c09b2bc03ad1eafbff708d6d83cc24ad47f9445d6e55e3365697e0c6fd1f4e08ee1c4b489ce9c8c1ef6b7c9ffcd01b51a1b7c5d1d65e29f3aa88c83284e92cf6a5a34d5d3e679904acf15efcbaf9071ae0ba5f22ccee9c51ff6ad02098e242158dcc9c8e8dbfbe2caeceaf144c8b7a518b9d7ad090ab9cd9cbba8311c7af201e0cf4a35d1976bab26b3fe767201be7ae18bda36beff9ae0396046b768fa44958b9b80c394001112e78e19275e43ec1790eb75345397d6267f4b4f3df5f76105e0a8331b3b00344094e402ac0f748ba4ad40724fceb8b4c6f5e58b6acc57927a685f2ae5cd7e1d5cb51c82ac8d7de14bc1f29730394c7be82496c1e7f4041f1ca9262fc85361158fd2a061d0e14737325369ad7f9b3a74b692c7bb5b75e450122d66086cd493620174d767bf12b9d481eb0c7be3fd6ae755c9de3f6f58e16c857c887e7a58fb4cd922295b2128ba02611145cb0566c41bf0514516cba4e2bd9c1cf2599ae8811d4065fe07a02c3407fa4e7c638dde305aadb062081661ce8980970e61738a0d1b5dc4be31e2250e2c7329170c226e96eab4709fdcf8978f195875435eae48879059c7d1a28f1b30b9f42b7f8e6c1cde142e18635c1b4f0cb54d3cf817f22ad7c25bf6a022501682f6a7da1cb115f2f0204331154e24912da587769755e837e6fa8cda9179cd1feb2ab2c1563dc2f8b4561a421f7bbe63da302daa87e038779a7f13fa0d6ead3d569f3d6596f91d3513fedcd3e8ab8fcffb9f6761308089f2dc9b19de7dca9879a89b715042aeceb1f35fb06dd8a53fdc783a5f22fafd83b19594c60f475538daca677509c4247d743ec2bf975733779239493a754d1ecfbbabb34114d5d73268a44b72188223d187da6f31d9cd1bdffa271423e291ac15180840b3758d18312b1e8e9006e67372f1b1ae2dbba2261e1b28e340f22e70fcd1928343bbd9dfdb2c217af65956db09baa9c7dbc63e1cddfe25fdb92c8c2f2ded33c31a6d20f6d8729355cd9c3c253eebac0164810ac5c3a907abb71913b45074d24a5f13c923d1055e683c54ff17b88aa1a6f0746ce97926b435623f2cc60c6f565e3b363e2f6eee68fb6c0b077a20a26ffca628cd4fa67d16e3e1283d2c09e5a948d65de6e256349b568548bc151d38004caf2496c0f3b414fc5d5cb0aff0deb2505710290332dfddc0ae9486b258563bdd33f02d0407d595cafd61eb17696259bde7d76f5ca9f818830f76cd17780308f95915fce38ce78393eac1582c1b7a86d9ad3b20b3648533e5d176f90d26484fe6491a692527f3c5a04b045db5af2d21ead2c3a4d10a91162f1c1c725c0a2cf8ed2c87de918200433949b0647ccc8412397df8647e4421a9a817f1a0cccbb7ec562ae5c2f04516e5a60c4fd4471b85410ed760c681ba3fd49aeb7cec2512f111696abb7d0a183d932ebb6815df443a97b1088533a413f27f4bbf45bc2e86e3506e159177a7a17e351a7e848f0ceeabfa6937ef14adf8439204bcd579b0d09492ac52f0178f8be0b3b27f2aaa95c1df537f8c24cf651038f50d0ab38c74970cbd6c4a5ec7897c6cf53ee3e2ce4467de8b3b30aece9404dc90aed0675b3f8454baf62465ef5f1c29e306d53563df85b088e54b1577027b344b2f377a50dc3f737292098df5d7151f66527ba9d12fc65e34c504df34761e4a0fd76673d2116f71cc88215d42ba0c566469fdc880fccfee762384966cba9525c2f085da48a8bc57af1f935d3ecfacd7c694841ad80e4b6b3546f3c1869487cd4ec0be381c67d02c05a0881551e09aa9751b3826422ce0da5b7778e9eccd9c4b99903714b51750f8b553270ee4b381d45846407424203645cffe3b95052d7da68da718f67b80e7c3a78099cf5d120761565cc48ce7b0f6b37923654d397bd2e6114f8a66d6693b96c36f05e026c3d45759a7eef7f4a5c82d412e1e9af08142140cceb5ed2e9bf478f16894caa58e91be486de43cb2c653ba0f668d0292057636686dc012ebdfbb7219b26e14443de69e0af7cee388dd4062cb14db0f87d016570c74d35e75fb388b2396ba466a967a00898dd574e0b0362d5d802f4938aac97ce02b185835b712cbf75ca1e97e63f6ebac7721782109de24adf2b2370b5a37afccd9b48891ddf13a7d4c4a84ea6a01685bfcd977b2aee04ea4b28c6169aa09f7b8c8d276f2337fe19eaddd9f1574447e7e6525f7fd67e3b42807e44fbb60e75d8c3e98abc18361c740c984c267486735fefa2e8269fe8f5c223be28a674578e730842eae649342f44ce6657648b01195c1031c9f5e398e507b94b099d721659f8ce2bd07452bc871ab4da8422072eaa7b0c817d744e28598195b730471bc558d899f6d3fca159b45434676af57579b72b39146b084bf1f3ae6d756549fddf1b80d0565dd5d186478fe18f7445527ccfeb3a5d1b484990240c9527e10c84ee128015ace6965fbcb13c30d528983aa2454964de16bad37d6b1a91216c053d5cce54ee7cf6b4a87771d796bb00647a74c7b46d19e5c67634496706044ecaa3b5bf8daf4916c7384119e0a7b38440ae8ec7ba9792f0f1be3f3f60584301d344735688fc93cf44aba409f5d8513ca3533ab5da98cbc0c2f808dd950c604da59c3023d54adf78936f0ad265ad168202e5131282d546fdc0d02b748396ee5ac81756c7f10eaeab59ff0003ee9a660cf5f0a27e41c176e061b311b49a8c3fd1a14271937adc63effed80e0ecf24e235e2e25359a601ee112c3d561e7850e74ac7a9fb16d128a1bef8969f53a5d0fd855056c0251e0b1f1886cb53127b89772ea1ca6dd27277da80ed972e82f1232a73d4ba537118418c5f17d9a311329a61e5d6003456fd4e90ee3466561d3fafeb99c68997be2349a87d5604c0cb2c183a08caf80904c011474f73909072ffbbd36fdc41077cdd8805cba7c93680c667621ff72e366c7964703d01825834afeb546e5c7d2d3d958136e2a3937ee2a01c6c93f0ff571e67bcae3f84c827c2dec300fded9a6360f9c98e5acffff45137bbcbfd3f07e56b399e53bf73ee89bdeab74bc6f625548758d5ae9c936b415cfbaa02c437b46c036d6e03353551e886725c97321caa8b21611a0a007461e0867a8ba37181a1455761b02f596f8eeeacf40795c7a79641cf711b135f19805c4e22c5109d934b1bd7b5195a647911e6a1fe6cba104d7542d2276d6ce0c9231f1482daec90e30e6a14d5edf71ef8777af5efe0667474d3f8e9e265794e29d6a38a2951aa0407879a9f52c297c1542c162947073d9ca41ece7730b7caefa227741f74bdbb6f673327c7aa1baef412ac42aca245a1c151c24dfaa0c8d44dc8721b34f373932b889dbc3e4a7dcf3fca747b00701035bb047af1e4910d18011363036b2417e3c0e223a253b25d5b0cc21149b53f1b5bc2428554d5b01918820956c742951f0fe81a6194b8802ee4d3c00f194b6dcb967f729de14e5c61584910e9c12bb4fd99d987d3edcd3286ff2d1aca74339a85885b4b1111af147a59ded078abb71237f44dc107181227ea0c9158dfe4fe33ed73ee027b708866c89fabaeafc1551b52b19d3c57ce27fecc8f78f0bbd61bd8681b905f59885ad1d08c5831ebbc866ed2444070526a6f15a31a7c78fae20cd689d1faa827c3a6d426b23cd0b8f7db5b4b4ee0039367681b021ff467f97351dcd729758362bcecec3fb3e22193fdc48f0213f44c775f935d6e12793454147b59b494a96796cead888fd3e09b0958c268bb45e5d19abd817b5b948364774ff9bbc6a60ecb309369479bc4b0b385736576bb574d3959fba2f33f08ab8eff705d9161d00e24cc859097f7f8baf194e81e47a6ca82ca51b488339d014a0a494007793aa5201ac72fc3f808d297dbb4216d49e2023f2b0e52a1eb09f0f76cd11987b1a587fd03ccfc63f652f4bfd87fb9c2fc11b0cac1ec607057ea6a2c3d43776ef9271afd862a6601017ad1ab8e340bcfdcaa38ce3568687428d2df60d20ce42dae53b099f87c071ba7d4fbd3538da1e47a101cb1ec2ed53dbc37c32df199ea345faffb6af14e6a2467e5d5cfcef9269152e7df0e5c9c313db0ada7fbe276e4237b904de906fde9bbb041e21966e2e456d595e24c0d3cf6e4749910534b208c7b80a94a7c802700321f6db328a1f765c590aee8e3848da0d2968e7ebc82232d9d0d5f53ce1346683813bdcb760693453e0297357d491ac98884e255a03dfb520880270c3636c87c2e2bd69d9a1b32ed50a9e36a61d140db66de592796b515946e7794d65d4149a694c63cabfd4672d88e0517fa49a3ac50fdf1478718ae1e5f0f623d449be93681fc715469381ecf914692a9678d36b9b4ce6c31d69e8f523c8bce64d98a851b98d5cbb267a30aa5a22ae12c24c501059158adaca8a0bf7d97641abff791bb6545a123eb39e6a09185ab5ef4c459a8fc511d442c7fc7d4dd0a28d5b33159e2a032ff2843227b671fa6388ab7c8d3852a8e9cbe15ce6c661d0f3a9dc3193b9158cb40276ee3d9d4acae62f2c9a4cb2bfc94578a0d1706c99a1119c18411cf4dfb8904cfc2e06a6fc4e8ab05ceea99140f2cbe1676dc4f95f0aa56ef5abd8d8f04f6cd8ff39ad59ef4ff81521c0cd5b3ce926101f7a07f51ad457275db6eeecb019efac6558583e8b94d7666557e09b1b77fc0dae3e64e631c7ced037ab87b888dec2d218d330de39e7d0a90ffc09d64464f6defe0201560eabb3716bd2cac5de658c52fef25cc05f0e8be807f770962178bb8df60d06cc1848ad10e073e09a1b77f63201fd046c67d2af2a35903e62197bf4227da99cd1b76665b780d6f0c0a8dca87c083b526bb7fbe478810f9bc3943448a37d1cebec53cc826d324323bdeb5c4938faf56c44b951d4d9d3bbae40fa6c601addaf1aa55443ad3bde01a11b4ebe816cc1737a7fd39c255513dda061b4ebe38e85aa518423938e276c59916138ccfa2244fda5a56fa37ff429bd98ae28797a085c55ba122684cc3cc5931b18114c59616bdb143df42f8bbffda3bfb0bfdecd8f4cf77ad6c6dd107fcff769c7400749321e54f1cfca08f0bd77d73deee1e1832b3ddabc586b6801fa73cca0f62fc5709b45b161e359f657f680a039f0f74c44e41544a6217eeb48b49a5ceb2e454e76a7c83b8e0208c16873fe48db3f67e5bac3bd7e60b8652f8cb52aed70f5ea69045b8f37a0b34130ca3bdb154d629b758bcf1dd013a58afc76060dc857d686e0c2c183f0bf7f6c0c2656fd50b4e1f9c35f111d81e771531aaeae2935c956817957e08aad11edef1d23cd4e403b45eb99df8fa6db03a32a50dbb5687beeff44fd6cc08db5c185332b6aa7b42f0715d8bdb2539e2490c37667a524b0e4ed583533a86a7551f5cfa0fea2ec196343d928f88165efa5b55a9f28b602ebb6eee9bde5b4e528c9d6549f5d74a56425151a4212f4cb7fa69bef0d58b357003a1b3b45d9373990658b9b961288d97dbda55e90d3b28f386f690a27c2472bd7b89ad533d8da6f946d3c2ceee385904c731c30790364b900474833572d18875878933ff0aa458e1b281390109914d2b88fa2156569b14fc17860f30560ce726bc12f02e5171f9e0fdf354e62fcdca8ab585e97bcce425b6248d8d1972412f5f8dd95a579e710a857dacdee4ed386190d17793de7fabee4cb00d95676418c17e712efb013e1c2b2db6101f93be8b92ec4151b8f4cb5cef3e4e78a080a7fe3e020a962ac1dcfdac783bcf9f691011eeeb9976a1654c71a8f95471472bba6bf588be91820fe7703ec3732de6db7e75c61d4e8915967f749c0c6669e19f27dca88111c39941ea1e32bdf0cd8e617621c8ffe4fb6e1ee0e048e5f8e518715cda9779888ec90e517228b63930eea183906811d1302344fd5f202480555438e5e072d09775a9dbba06915ab0ca9002236c13e1a7d9cdcf411bc236913d1d5c3f88ab34d2fab42080360cf9fc2d0b19d1ff6ceded5ac61438d09faaa02edc61e63da104af906083409aec328fcac84f1bd4c3a50635c49a610828df418d39c0566a04cea1c9376a77afbf92c01650187d86c89576ed21e8461cfe62d9fa8e2e2cb847014e27c14c91ef177941a22b0c538fdc3dd4036674549970d3fdd971d1c582d83b091e66a03bc3647498f0b1a14a4a8f1c91fb1ad50908208101bc5d71bd6448da572fb01bb1e727132a84ac6dde5151903546b770ffe3ae18aa05d97470c7097ddcde3605a0a4efb36ad043c86c3eb4672268b4de95a64a094b685e608c45aa73feac60f494971ef3fe564057906d37d00df39b7466eab4b15a3654bc6c4aac8b310cb97efa3855434998fa81c7674c894c69f3e8e00b4ecf7b0274ee9d507ff21881a7fb3df2f33fc11b0add9db772e1622e2692ad92a8a2125f077d9bf1956719bdc4fffc719938195ed9d17fc83b86f3c2dc180c1b32e7b4aeb4ffe4a89d48b8e39903a21eb7caa6d6eff3da2416c855ca6cdf980f7dfed663d5dc13eff8158ac58c9cbb64cf75fe05c5bb595585441c97515fddda0a55fc3112988622266be3c62821c4ee50a8837df3ae69d71788bcdc321f5a15388b9a78d3cbc7f9b8aa6857e4394b15ec00ebb1e22388234de4caeb87a4794ba91e35bd91dc65d11f6f9d0d5959ba65e1ed7b1429e130b48906ab57ba75d7e7dc7c5271e540cc42db09d658fff99f68d2ecc647233df025696cf2a35309e2744334852846af87c97c27c8cd30af66995f7d51bd76b042d05f661550d9e7157b6db522632e6f14cf6337d8dc93c1bc71b81db1d99cdea54feba0a7d2c7740d57bc9cce951505efef30c87af9a206ed8cad5c4b3dfe1fa41e9eab1ecb946726a3c059fe40831a9583554843c6e3b586447fa7a25d1309abb6d8c3ee8dd906fdea195b15f8010392365135b7a6c1742323df8e3bb9941338932aa98bac0df9ef95183eca2e07576262a52f4b2bd3b920b52d8e9bd5c9c2e74e14ba9aa89ba6982f5d737f451e8c82b2d18372b882fb2b72ea1737245caf144227858ff61aa37433497799ffbf297f8156d0c2ff67c08fe7a5b68237952e6c19c388d036f367102b7cd9ce9051a4b578b595b042fa9fea8de0eb21823bc74b2f89330fcdce67d882580871b98e94c0d37e50cf35a3efa7c01c33899699102e1dd912a33cf42c49d27b9227cdbe603e5c0180744a0c366438c82e2ee7358fa14f43b61f071d3ae08657f5556f799d6a6cffb343f28c1a9c52651985e6a99c314e598be7be920a49386da08ef138a2e170b947b2c1bc02bca783a423276ddc5a957b0291b60b10c0433d22391584274021dedc552a046541a2a44c8b3beaa689af28c8b19fe0f4f2413708e82ee480e2dac0ef8fae0dd8c7ce37712266b8b14b15f33cabdeac1d6bbcfbb320afc24666061fdfe6c020c3bba4bdc09d6a40531b446add04f4d4f08910ebcf573aa5fe265e4c4bdf02f5cc99a0b7a930a92a2276c4e0383174e424c6d7979c0032280ec03dc6b1fce8f539ee5cb5a99095de95ea1203ccd5d16210c19b7fc7c04890feb01f1f80b4d497b22623282041c2c623f1b64609568cc74af5b714d0fbc0a944728cc7568b6865cbedbe9fcba8b279630a1c178c38199c49dfc4f726374ca98674015e920516d7cd81698d0a59e780c9afddf8b3ef0a5973dc4f8755e73f4a3b511735d1a662765dadde604ac9d444ce6f567a1f0fd1778f97a155dea03ae3b98628fd83e3ddb9f2af67ba2b6cfb6df7a5201c2c0f018ec38e84d33ee6a20ea78fc1162741eb2b0322900b1ad7df34cc0db54f79610cf7d63d449fe51f17437bea8a003a450d42258401d3a78ef261b1e5a09475aa665b2e007b1c6fde0cfaad02ce4c4b61c687d06017944ff6d75d5fe95c7bbf4fa011318492c94d97f5bcc175087ac92ca9647a336bdd72a3f0801c756375a4d54cc297361626fcd154024fbde2ec421a2880a97a590fbe1ac0827e163012c4bfcee7b5a19fc5fc1eca63be59c831349eb634d49179bb90cfd9dd0b484cc39d7398e923337a26c9d4ab4973b542ea1f3ef529923538618937bee83a883408ada55d4f46784fb9f497892c266ccd77608f47b758c23f8215e6b24c8252706263a96e92b5fc8b0ffaebe6944cfcd259b6e430669ec4d99db551866279337c615e145f5bf82cb6894b26361a3dd1ec0170f241cfdac9a124e61c9dd295a7c2760b5a91f363754cc673eb1a169f78951f2d1dee5ba32d20b8268c5b155e2bed20ea00c901ae82d847f3bee521d87d480349ebb8827e7bd2b805355093393c46f2789b470f2fc1c37e58f639b48f4c8f4e65d012dcd33221b4f0bc10d4cd658a5b457eae647dbea8d9f2458a571a62d5610f6f9fe327fcb83f77751e72711401cbbf4f61aa0ed5f30b7e015972005cb4db850eb20e0317e09817e4dbc4dae457d47472035859942c534ade19ade796982e8551fbe5fb30458f40afcb744132f705d38b05f7e4a5df71f7206d6316ad19ca7ecdcfe356b25165802a7fd96aac69c07afedbf1465766b7f17ca72a440c944fefd6c08ecc3a8ecb54d96b9cad9d2aa4c94217ece5356cc5c837697bc631a22f37115050c21578114d51111690a1a4135cf92c3357cc5c0bfa0516c033b8cdd912e201d1beff87e7c81602dfaa4670ac84988b7cf488aefaf55a51a0031e61edd1dd577a394548af639ca36050f81ad0fe84d8227206f03348ab8c83babf28ce1267b3c2b78334e89e5985413b230d11295284bc26a3aa15627d49f3d1276d0a4325b933c035d713d6e13aeabf73c1ed839603a2a8fb4731e153fc78dcf3b912e27bea55d9d999c1aba806d55456c3e69ba3e79e6f8a521933a4167b348097888efea9a16aeb07729b22ab8990589d6cd020a2d7e0cd553bd7f24a738e7a72db9702899ef9e6ba9713e58b8009d5b910cf70c817a320bb0a5cc2eb0a313df57c994bfca71d590dbfa4751951176aa142f838b9b63d411e0520aa9aa7c33779ec141f95623bce7b4cdb35e7655f83e0a3e8dd1a3c159ad8ccc1fdbbd4cb138aca8611c658db93addf16cc783528bdf193ffc24c21a29a85c1cf50d0f99f4ea2686db711e38354ffd6e58d4e6929854e93cbacd1ff8acc9f7497386cbee6455b7639740aaab99efbd4d61cdc49d8566233cae13e4e24ada065b809017d0694005487dd1316e4be2c5956ef948f9bcdd6f48c04036616ba1305b06711bc96b75b83c756bda0ab5f0bc4e66a19730a3817467d89b3ffc77e81e50ec720160d2ba79486757cd063de14b81330ddccaa419dba1de6b273bd67577421adbee1e06d8f0733bde33ea4d7c1935bc853d4d266f4bfebaf916a6f010e43a77f40c896f97c4c5d946343f4c8acf72e951e24391496d87558d33c62d830d3eed04832b76be9d4629d7f78ca2d31440a2b8f4334c70e943956ea622f695995963557b8c811725ff14dba559b61f91a8cf039ba6c1ac663b63e69842b10d3190c22d1b32fa6801f78098652ff236edb1587bfe2357c48c75a83b31afc8b47cedf0d58ba7477adc3657576094bde0d16425654632768205fb4ab698f0a1522377d695f473d2155cc57f60bd137fe4e5c71f0c9a5b86ac76d5339ff68da6afcd365cb47e1c010029abe2fba531a10bd0e52cb72327ef0b8a09493e720f3d9223336b7c502c3e05ecf066704078891d3bc335ad091d1a67e7a176da35fdd0c4cc75e933932bf0ea4d9df506b56fa0e2cd6b233773c66d8835a4a0bd66dfc60e7104c0226e9f7e78f3b976072d9e4e212fe4dc9d89a851351d1bb12d2e3e8736bae9d6910a125277874cd0b9cf8efca408364a27754d2f38460d9073b5a07b044e2b15c88e0bd3afb05fed65c4c61031016a541d5c3d6d575a8225d722900a42d6d2630e231369e817f8b45233cef491c286e1c669fe755bfe8358a09d939cb6f9e7aaadf1b17ce964220dca452f0e8cf295db6bc11aad0bdc161118503399296071d1eb1f6d747b3ee2e0132270c8e9399c29548f197f319c46388561f76964b378c011d6cfba664d421576f119897241a5b3c9f9815293e618b530f867742c99055f663d60b4723a49953bdbb3b8edafb7611227dc8dfb609670613e0c224cba1e96347da7cb66adff46aa07c5bf232edb1b7642b19a2fb5c752605a6ddc8abfce4dc1bd2c670c4d6d110b9dd705dc6418c93e7289e0f78bb34174751308b0501a6c572678f12ac39adea5c771f2dff97653b3deebc71d8b6326e6b7841084140cdb3ce012cf89b68f96c1ab1ceef696fda11aaf5fb7675cdeeafe474a5acfb4ab82b812826bf1cf521fa7715f61e7e3b69bbe0c6d189fa62c73044eed5058d7ff4915e4512c2ab6ed639f42c3b37b87a82ae61e9e528b1356ab40f3f358e9261119997f0679fb126749f146cf4c7a2bdb34d90d79cdf4496379fa5fe6dc4849e8d88e0b29bc2d8cc9b8e4a40b95ac7658a2e00087f2a1f05bc479b94d433ee78c703aaf435c88cb1a9ac185fff4d911265d431f4e275cb14776062ab1f593a806c7e694dbc1d47862d6d01034d2c8a34d4c4a9358d5eb342e76e9da995a0f365dc7d9e27953d93aaa54596e319842d5d6563d842d65172018ac6af08dda7a3699575dc0a57a5fbaf9fca4c67eac0f4fc8656319533da81d0d00d19515dd9b53c35eb856e89e2d9f57b6f941a478f7b82b60057b54c766d5165a65f0bacb3b33e2c633cdc9270c92cc6a9f072a62c2b8082e6bd2b86a19ed3aa26f2a030c227efe76164dd17dc43b6100df3f98d437f966b9dd45058d881082c0376a790818dd2056a9fd86081d411d60011177351f204de8a3fcc59a7ce4f49c05d9a227e5f74e4e34067230df4d09724da64ded42d8c5a304207ff8bd119b1f219f09d250769246fe901d5ed1062b1f0a26a56468c7d7d249d9bc0f13407c2fd2e3336f23fff42650c20ef8bc158d4d82b9040159958a5ebb4e03474619a1b562cdaa68243d7bd672c4cd68682137e5fb85f42edcebe72d9fa8dc081d43119a1786f5231cd52f3eacbfe2149dd32fd0beb5fc53bb71f428400ecfba6167d4c43a369c0ad272184746dbd66623d37ff4136fa5d6bccebb37e5a965c5da2cf31d1204278310ba3fd7873f2fc4c1c82f3b41db7520a8aa4443d5a12591503b758ce9191ff89c55abd7b8147898415a458c9223f69946af9532591d98868b3b62f8059d0cd03fec6430218136496932cbce4c6cb0a96083b8eeb945440d52d5c24bafb77473c12773c80aaff33f02f8c8ebb8e12ab9bcceb55d3d42b38c6fb19e6c2f8fe149eaaddf89bbc536e2d35445ca1ea7ec2f243992692d3c6d6da876fd43cd4edaba8227b05a7bec889aa6ec4953c6e97e755d6b59f9d05af816c6cce8b8d11ce82e503cef22944c70cf416bdc6ef7cd69f1320d12f46fc5def1915d66b38220910d1d95a3cb4c0c76e96d770603fb7b340d6ac7c34452a5a764d0ce7f1c2a8360bfb1d9d43cec552250f2b8d0fa181c6730cc4076d0c121d9d94dca3bdb0f6cdaacd4b18a5dbb4efd6c98d8413b97d88ac1222132800461feb7cef7a3d87904893c4ec5ce1603208ea6277c62afc0d6262a3211003c628e9d661cfdbefcb273f4d8e6bca74f0af25d64664e393cda3fc2d2c5b9e7ec25d03f4eff85952d01e0a3e6663f1ef01aedf30f1ef6d1cb2f3ae721a2c1ef78934e6bd73e372e54ad731fd094f53ae17938d710171c2f4505f01c7f93d020c8f531a969a3ba935aff56effc3887030a6ffd91cd19675d90a589e9545e8e83c592a0816cf4b7cc253fae9bd41c9c81544661aab0ec7f6296572cd608cca51f55b4c47c48fad5df9fb5a6acbe07ddbda5448ea920570d463d62016c03a5bafc61a1c521657dbdd6afa863a924c0f1bee7b3ac168524b9116f103132aeb17823d2a2caf92b4516b83c62101a6d10828c00d9e27a46192acc13a7e4b16fb7849b8efffb8b0319898e3029d38701bf3530daff595ccdff097f1170416faf81896c7f00815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d2beeffb40c1380a1330a8fd5b56bf73fd1471025c6b136c6e87d7b3ef34899a99fb92b8b75051c70e0b95fcf87b4e034da72bb9eeb91ad26808dc7e266cf6a0908e66f584014a6b46c0c8210c5fa1291ecc433f0c68f05218a869b3218d6f7758dfd35e1144506b6ff8b60601645749e2ec4e1e3feb627fd2fee5ef4b26828355687e4ef9aa224bebfbf6187229eeea3c9fa2b3f3c0bfb02964f78f1db8ae5908c0ce34a7932e813d72fee4c920c68e7e5ee7acb2798697ae83051f13c4616d057129cba5afd3bff6d646d780e98cab3a829375068645aab4c1a51bc7da3a33bde237607e50c03c8aae448d33d49fc4f3d32c896a677b4deeb94e01945aa741a4ac6d9f8c1662ab7b539e525c827e703ca9197658ada615cec2666d13c6171b4c2842d5797139614b7eaae36563a711778cf0a85bc94476a78584bac0bd283536fe3dbea0e1c3127d78009ce908b83d26e738bbde3ad5053b7b3f7725a05903d796d497acf88e1373e8260b41e21067dd50581d7a72e635dd0bed2ebd00081bb07aae0ce815f908e13781ab1a704e060d40d5499b21e67d2ec0145df16cd3f15412108b0cdaa25727feb9f8dd33dfbc394146bcca98546f83205b615d474b193505a2ae65b70882caa6257104cd33dee3ca13038376be718cb518e56b1fbbe7d5cddac39d2b9a104bb65aa01b7ce9028f53d0aa402d93279de6e366a556c501a8c33f871db8d5841da7c002abf37dbbbe76f61d9b2d60f6594e2141969ce4eb309e374561df5952d3130c1510a1506ed39bf9ea0f06b66221537922b952a9f90fb758aaf41f8400ee508553f4070f80714b527bf649f1ff988f4176780872df98971a146ee9f412d218d24bc0a509b509fda65feb57a223215a20a96d3eddf36db6020e1cdf180d20b45979010bed61203b5c0278b045715e6c8d58035659d8e1aca714985f6e545cbba1482f9c1919367cfa1009046a7ea20eedfed4ff54f4b6e35fb46bfb659cd8a74045b6d62b41df4ae6e536a47f8f8ee9d90a5c9a8ddb3fe2b26a0233ac2b370fad0e316a828f6d1dc91e6c10f3488765b506f4a83300ff3335a1e58890a40a4d3dee2999bd36628e170813ea741e2e0b387157a902ea674d6ff8907ab17b94f8a9820a1439eb71e4375ee8816094e552a9d5d02d6c0c2aa9a7da9d7a9d36998a46564d4a9712fdd8c06f448647214fd4afa108a5dcfa9bd0a3d46718a2497a8abac78dad435188d438d5a269a667bff9a07f6b92e41a4d4aba5287c56f48aa627d7225cccd0b855f171e9c9bfcccc83a22ad6385000fb17071e16a1152a8bbb9e4d2b029a2c585e1d1a69dadb8b50b3ebcc79aecbf2f6afa511da88d0aee20f9a765b7345303fd04ff0a200f78d4cb5fc56a8c4a801ddc40de43ad88f68d7c9a2ba7958d5c3b7d2105b5be419b90bb15d2e2922ee14f77dc801ff3a5840b2123f814f5853cf068ce6c35e2e4cf7d4d097bec46fa5128d035dcef155351eba11f733a31cc63b75275c907185952fee39316d4354d5e5e77e54b5d7d22dea38ef55383e4b36ef4ccbf72a5d91fe49a216b3a26c7887744d15361c7a58488c74d3def8e88eabd2d39f41f9e9fb8e2e388ca6c70984c3a707f0896da3908fecb6e61cdc688d2ece52ccc166df6b4dc4f8c59143e01f8f665c38d80f182109f2464f964a88efc6ca1079ffd7058844f429e9fc7ebaf2f5999615a86aa2b5bf876b37d4ab0e5d7caf56cf84b525fb7aa7151f6fe05ea4fc28fbae83e608f1b7916fc65f68c37e57636cf6d769056bf7c3029073d196deacfbd42cf0eb147ffbf99823bee76ffb5fcf9a1580596e81c43139648fb928480efb68b678e18c0793a82f777992da7b9cdb285508ef27e5e8da02c24c00dd89290e0175a130393085857be919d0cba717705dddf692fa3e6ba5a4d2310e7d4a061de591f640e3a3db77c6a225080c27d77482d6d2a9ad355679 MD = d0db3925fd16e5d96a41eaf6afd702d62f52855a84e3eef742edda22b0b1829e0f1f13669454bb06d72fe133a65eba6f Len = 92104 Msg = 492bb3c8f1ec825b71fce8a753486d26f34fde793fd93ababce5d00ecae3a17928230bf7ba8ea9c88a94750b0e652f8ea96403e573d866b93de54163d0bc51b9760ecd28bcc64a0475f7dd1b02137f90d15fb5e724a3705c14263179d5d972e73bd342857dfd2fb73a0f6801b9bb23d475273da7d9a1204a488fea7760a4ccab805aaf33879c1e8adfc260e2bbc3e4019ca6e34e1a3a402ce107b386fa8426ab4c8b5f5d6209e0246efa0be98e958abf4fc3ee0470d696a9e878d3ce29e14992a74e992994ae3d2fee9eb33bbc97ddb89566a8f061ddec6a64c993767824fe06998ba4bfa7f2fc5068969e03cd33a5917677573b77b708165de23ba76cb30baf2b2ac948233ce731e3ca146747d0a9f5fadf440c3acdb256dbab13888ff73837641350ec8ef6c47a67225f8fb4d5b28a2a84b78c3185b4d2e70c624268584f434d2e81d272875cd3fd86c6a49bac88f80d4ff7e3e448d53188ed72fc7f3f167eec64a323565777e2abde90ce85bcf3e8ab284e38db7fdc1cc73689df5d12578d4b9b0006c3cedd527b120634f96dbb020df802b39f90923aaacff013893ad81b72bcdea4405455c9750a70ff7f27a7ed3aa55c7eb7e5bf343ca0efbf8b2062ce67b086255551a8efa0ae16569f5280523a19a4beabe42bb18291cd0bec2bbc4e345d40b08a2d9e6e04e73f62e2560ed8163a229e04f79d5a868bd42033c2b044e1ad546d6850ffeba99b344bcf9c1928d5f21e444985ded74f744a26e84f0458748709857622931198b33e38ef8a69e97f28dfd802f6b7cfe536784494398131f7d2a8203c0c2285d818a351c889c5c41dc4ae83b7b1edea51b7a6a3bee8ef7871787965437473f271b0abc0e402f761b6add36cf1204bd19ae11c6beec416d4eb60c47d12c34ffe6c65a0aacb5bc56752cd96bd37aa982cc89a21c3ac35bdee6c72d19032627e51d01ec83a03fef87ff90b3e9b12b79ba2e4ccfed381a3ae6dfc96e7c529b7c894a5c36d9516515850b44f153009af1ddcf45efcc4f476affaa3b45044812cf56ff33bd5e68cbeac838a8161a4a4fbe682033861be8e16893d6ab45236c128cc89c3704853ebabbebf848a6b1f6b01be3b164275e8d5eb04dd587e36c37213168b1c491004bd8254ada9507bc8e72a6daf3764826b535ee78376fb44121b549b1c07ae742289aa37f401bcd9c79fdeba876d86ce6f90d5fcd6cb11c34c445523e58b87bbd5d88b2f3d94b6cc451b866f6bc190a21b13b9097f5fa9fd98767d768eb0bc2e44318d03306b279d6ae4885202396a46976473d7253aac381f37345bbe7e3615981c187d748df5955d814e2cf5e0fc020c0b692e716500bd0812e29c1dfedbb8f8219463b2020afa477a3ec4ebbb2f1ea29005d50be78fd47c8cefff5437945e8dc9697e91d34c144f58c2e48dd4e9e1807cae969ac83fc4a32fc44d0b314a507f9bff96ba07a52d9ea2415283321395cf57cb37c610fad7a482c74de9f5e3d7f520bf73d4a6fc8b5be023d774dd9680b6a7c68139c8a753a80d61c9978a493917de0fdc88b93877af9bcf3b09de58ea5ef6063c98f82e81d659fa87bdf862be0e5f589a7e464339c259af46e93c431deecbf3308ea677a957edfb51024818b0022b03765d580419bba52ac0bcff3e608faff524c1dc69135251caed0e8151551ac87635cef4635fc204a8702c3030fa692974e2d9a1ee06f00ed1238aabf7f77fc01ba2782448520100911fdfd50334a3c1d8307ffeedcc59ab77bd1ecff1dc599b598404ef9b3b9d204e957df99e5666ff89d75bf94fabb4b0238171f4274ccfdf97a2195e4462c1ec459aafa1e9a8d96cf09f149dfaec29a63f392c22819109163fc560772c0f93eddff61dd7cc71258f734f52efd7d6e21432abf661e7f230c7b8b58044398a3baa84706ea22ffb71f07bb1bff9ceb3048264a078ba41b66c7b6a3a22cd541ae2ac9dd24a0bfa8ce618718b01c2c8c9ba783ddf5a347726e4b9bd1cee196609b07990e25b18156dac8ebba6c052ab622a7f253243d8718ac10919228b30559dcc9bc76946d368e6eadac3caa5b261c47c1e845fdbad182a2af3e616a21a0b1f5f9aa82eb644dc3ec885efbe57e9d037d9dec22fcbbb524d48008cbedadf6ed690fc9dfb517257bf6f16a94c7fffe2056946476abb0a083c43b773e2dc88680c884b0d96bf65c2af0715583ac5fd7d7453de7bd852a3234042a1034c501de0076e0e60c8a9250657b70b6351d0ea8bcec02ec740398d899f6d44a5c3dca4bd116bcefd59b7bb09ffa87f345949cef359d7bf916c18d024a1ed2abf0e2b27e970a7124e11902eb5ef02f9321ad7b19d5ec11842229675da90eadbbbf6e3ad4b6c4962bab8dd86f16eec01c55c239c7124a5c1432b5b8295b28bdeff43ad3fcb4f7a46a91545cba4c58e2055e6d59657f5ac43fb4f10023c51f9baf5bd30e4515f614783f17106b83d11dd4a8194a83717fd25d1555dfab7b35cfa032b15a4c5e627ecb114083f141c9dc10df508d9f9d3c2ef2f07e974ee20db23935703870f2af3be9946b37ca0aa5953040ada318571202a7c2b5d77c9e29ebf0c07a3961874ee44a44f1ac744316e1b9887b2b8c339415d1f8a600c3040ce55d6049dd8c60b3f063af6e427e8f704a1313637779c734d1082ec9b3a0b81936e591698560239108cc404baa57445416e38dd1275f6666bcb0c19b50942ee1491fc043c16b544865fa8424347d06350091345ebbabb5bc41725d85781bdcf7a462a983222c575cb0650752817e59957fa2c36684fd19a807b35f229ab646cec16489822821c1407092268101d992f7fcaea78343b226bc680a430d28e200c9387bfcdb33ca06961f188e2a460d56cef00b4d2f5869416beacdb58fb32d7f89723f7ff8e5a3bbb0244e9aa8ce8829ad024f40d543911e2928a40324ba072791f7258f65be3d454128dad896fbd86ff49be11f1f85b8019679f3c886bdfdad553fb4b79c1e0527ab8513b47f5e8cbe3835773468af4c8016875382002f7f5545c46365268589f761c1afdacc7703790a57682d4b10dd3e2ba939ac3b9f1ad4062db8247f953a290676f5a7f8d5db44dd8a4a66316ac88068881cb3938d4e9df8c4398211cda430fc1d9ba8aeeb72961446847ba60dccfb4f8c8344a26a8917b0305dea778f36a3d51df859393877d15104acda238a2903332ef3cbe2c768c5aefa9bea3b6a9ff604009246324d59ab165d2a0e34608b3cc5f7e4a5cf145c4c477b79fdb7d01eac1b5dffdc248a7677d6a892845311521c7a7fdc8ed1e1d2003c3b8e919760513a8d9ea7978a707ccc048f6cd90a2d1c06c31f51d395a06885efc34032349bc635cd4b1004ceafcb1c426a2f88b4045790226eeb1084e09e41c4ab157c19d2ec027cdbcfb07b98efecf2d130fffb47835d3ad6eec22a12d1c86d4b94cbd1a64134fec94d071bbc69b2a84d37cb4a572da25efff364ffc7b19e4c3d34ade6965451d5bc0e95299ab711d556aa572bc3c51411428f75607f9c17e3e88b9eb32393cd93fc8ac72fb4666efc55ef401a1dd836f4372970069b1fd9b6e5e02ad1ce9e2cbc3358399879d63eafe39cf28fb5d57f7a4637e15cbabb6847bdf8becd07c1e3b0c8ed58ee8bb51542882a0b072c5b4206085145dd4eed2828c93bd6ff6fad770455b0a1ac4a516766ac2ce62af1c84339f60c29f2d823bdbc9010000356cf7b394258a05c4659c98ed80c1045a6aae78887aeea57d6fd7d75bb1bd6535d9654c2172bc178f01c902d944e15e1bb81a37445d02356dbd90c06a2b5a679f49098315cd0a17ce8487fb5597963a980db0b8fa916418a5754cdc1df841ce1bc4cb9f98bbdbcf28f3bdcc89ff485e7c715842d39c7e16cc9ff5759d9fd862505393ead1c69805465853be9e065f936decfa1ff708b6f68a4172d112a889ebe7fd49aae975a782cfba3017bc3443a113877e958d5d76828965ab38a39cbb3087cbd5280850710e6c223e1f0a105c501849ccedbe2125806e1288f47801d5fad9c31fac54e05e70c5976420b1221368213bcc6fb1de2ab9e451f14cba62411185f0107ef8acd77281218a60d9f2ceb0d96367628f1beff59129ce879144663d32578ee51a3d42da48c89828a809f6f1e5cb83107f61dbfb1da207ee2431ac468802822be3190871c49577c049eef4f3f07b09bfaa37569531c484c99cb07bf331f8d5967aca92ff9b8f0d70e2292e7ea079e2b83725c88975982e60204a3b0dd2416d6f07d8474c75bf43809c430e5a9dcff4434fb399a09025ebfad985545c16e634fdb4c98e1ffb2b02379ec3fb4e908529a71a6a32a22b73a4e0efec2fa8a2ee118aa727d142d4dd30df11315d2421a1682ebfd1f957ed8b425b890432b92161eb5c0879777ba9ddb6be1c169ba2f72d981e677157877f74abb1cf57c6573947acbc0048e89322317d1ce8f81f91bb30a3c039d0b5f98836c92aea6c544992a93bf2b71b8b52e6e36c439c6250b814b3705c5e787976b1da821002cb4258d58e8046547aca7f9efb6a7a61d996e1abbde73afdf10dc6a267c0a93efdf94caaff6300ffed0ce4f17f61085fe759d22756f0a13fc1d7b102e56a3fc789e2edb803cc67e2fdba4788793836bd130154328673db4c7241ff795d6818c5f76402a8a2a3c422313a710af0d74ca4e5f62f7156582e4b8cb177b1d6a27c5fd0e65521e4d05fea12f52a20ed26923be6a12b8ecd87e3649591e24f58ffb5bd9ad2acccd23b806027533972770c4fab9d681031f4e941c1174808feeb6a0a08e08fd05173cd6facf8bd68a79674cd1b93b4a501d1649287993eb16498c8c26827858957d06c73f70d997d68524352b44eeeb3a76fe11ce1a4dba52966022604f91c9e86ef01d669ef50415cb462279d587c02cad34929f5bf87abf65e007e05ddbcd988da75de29254b7c2cc3b994ff39c85a130782ffeb72aa8d7386aa12925ccd000299aed46037f1f67f8830e0027738832a1276e6ec45ac1147e8e829d4fdb7dc9f32960035aea976fe09b055cd9c3644b6fc0b2820c1f5001a8ca30cf348e23504af14a9d110ddc651501f398930296760cd2b0cae6ded219678c10416c5b7d3dc170f185be8f4ac1f6567d55db979b2cf8ebdd9bed1fd3e61b62c5765fd9c7dcd737196fcbb56f1104e6e7172c18deeab47a9d87a768b1d234eca4d0977fafd7fca2169dc136a5dcd151e55f0cfcfe39efed75108e30187854685302abb3a199c2407d922779ab7fec25dc8fe6ca6584ebd2f8b90a0c5442ea84446ef52c29ac98a0b30f7704ec94b5b1513c41e7a16638b98d03b36411cc87cefd981c3fc47b00215b48285ec595aea2d7f6b70b4e68671fd66302cdbd7f8c86d2f08964eeaf9970dafec3edd30d6768d521be7ba8e5f754396980afd3c6896a890ab5422494c4edb675c23891665081dd4fb0df5d695a253a89b590e15c0ed87469284df2e4f316725fbbd58d2afa7c54f3469cd88d1fd15e460a07628a7d6f298e6aeed5fad479930f093b32e5d5b6d09ed83ab6aba90719210679c3ec657d1cdcf5ab4a40c985ad2642d00f0172cfd4b4fe4f546f96250f9d237ea1ec57b0c2e74119cc7152d90517f14a8e184235d5d821315e2357b9862cf96c7924b478c03fe5a0d8e6f0d25f668cf14c94d477587ad98710617e433152f0f9b6000c5379494be6fc3c240ff0948e6ab701aa12d11f9fc737c46a4075a1927cf518efcf6285fc42a2cb8cf08d246e2d49d92376e428dc6810b6bc3fe79b568c92d9af4b20887f4a692f7c126988b4af91a5d131e64927e057a2e4affb92c59f2bccfb6517d33d64bbc271e43a53fa681ad243d27bd2fad66923640f164a682b2c5d249bdcd8bf38274f1ef463f887fd41f8fbb6f968dda0c1b2cadbec04a6c72124eb5dc40b8d2b180fd3b17af915b5a374597e036d38d5fddb7994d16419e9869e9039820e2fb42a9f20a9e3d80c57bbfefd961e72a4ec79f800d86adb3a08e934b3ad7b330f79bb77864c3307e429f7d3487d9efbaa6ac2b2f1051cfc7fbba581d628343cb4d267239526ed2b25c2e3bbdab3297aa1c76476bab96c2a536867f07848316db8549a2dadb8769459a90bf314c532723398dbcdce53dcf76d959d2b0a6bf7487286e0e0608f63e5e842dd1397324e74c8359512bc62e3e626d9a17c1d31fa7f7bdfc7f63e0a39926a36d3b7d278d1e4e8443d0005652579079b317e1108bf654cc5bbd996b76c1c57eb9c4a470761650c4b1ff029e8f6229850b9ab967eba8c6ddf29051b15800629e77335756c7157bca0ca8daa5cea654190a68f1df270674792bc033bb2f9c258911513de26864f61ebd913073f86c3abe18483080275887276d14e690e5de37c9ede6ff1b414bea482a83ab11f3fc02fb9d031e53d4e6267021551338600ec0e675ba440a3b117fd0bd45f386a99ed5590161645f14f77adbad4b61bc8a74e7660f94b5b53c00dc3fdda1b1da009adb5fac2aaaadd0d4abf07abe79234958d5d3253df9262d5e2a1df15d8d16e2373b9507269743f1c6e037f07602758701b2b41e7eb965f77490f063422e4136be1e83781dd42b5d134139773aa5ba2bb8a592621d9d78808a37429a183d63e477abb268d6096dfe03f77d78d40afb1dc5d6f459e24c69b2e8479afea76185d3aa0ba9401add0fbae02a8b590ad84045706e626b976f4074d5e781f7b643aded9f65f066b1f81b7bf001ec84a5b78f8b0195640002ad03ad9b3f7eed0f8ae6199ee21044630398287da5275f6d51f2d7bf728380edafbc478078194878df353feeaa9040f8a68fa9cd3ec454294b7011f32e46531e1d7229cdbada70baeaa448d8e4f8c4378807e628f34ccaa3501121e5f036e15d9e2e3bc92c4ace9d523a1aa4b9d137e95208c6d8ec4629a106deefdde1d99274daf765bef7f0c8e8c0ff9e9a50a101d6ab9b3424523ad8ec15de632329bacf297ad58ff24254c765dbfcbc01d2f38ac63cc615534db0414c261a66feef5efe4626d0a1ae36ff34da4c385d23664c3981ad9352ae0431cb88e198deb85b4f899185f1833afb787510babb6746353678cea50ad37da044de6aed62b5979714d6d3403f1edeb847f4cfce8ec4b36638af77cc3280084872e2b8f380d1e4c8354fd3fec258e296f517de30b85ab222db4442cb13419625423f3b9af81ce6193a5a5b68831a8dbc0948078741138a91a5a0f84ab5ff705f3c5ebb8bd47ce7b0ac613126894d29520bee107b32d585da202b61f021a0df1de8a5006d1cdb2db513cb1edfddd7fc828470c2b6928ae926d44d44665e0e2987cf7dd1e9d6200151f500ea3b85a24f72fb38e5dd6919ff9c486f6a54742f96c6784ff7a70c33ababdc685de48b94694af8ad419bc06a0f6504f79c606ced70026b813b4ec5fc73ed4f6b3f7ff697943303379d959e6561a8904fa0354d2ffd62317d63860a62a13cd77157b7cf921655a53ec3760bf23c8e75dd3e791fdc870f51a937f9e2507cc3fbe26e311d6c38d7652a79e40ff9ea3f3a0b40d5eade5431536f814d55ab4da743264c98e80f42e1cc648887b362b1e267406cf0b71cacefc036072a6b5c5c1337a5b99239627c9d6152b809fe15da9f84e38c738d7ed9711f6592392d4bf12d60c77dc7174d2d31ac5dd00ff9faac9f1a5e660575ec22e0f866ea21a260541d45f55fe18ab89fc535ed9a44aafa710ab018c34f764ece64d4a0d78bd284cc0c6e9529859a8b1882856bdc4d1bfb6f08cf796af8988c2624397b211fc69da3226411a15d50aee18f233d5fd554e6f0bffee925a9e38f7249b25f8f8485941f86aecf9011b30a421597cdeb825ba43a5ac5d0ba0a603dfafac4b4eb6317528961d439bd49cb85823c6a8248fc3a1c95ffac96f2c2167f0560f9e2fb6385be29da5fb5f2aca108eb2b23c33decf9354bd73ca3957a0e3edca2d851882dd6bf461ad6adf5e23c7cc30b4afa93fa9ed9a309fc606bd94e60c8eae96a5968123f2948c1888f94a5c75303678e12cd33efe4bd75333b88e0ce0f5db59338bd42251b8da9ae886ae2d3e33c03e7820ebf5e571d2d85cf2ecb71f925c335ebd46d5962111487a80bfd86bbdea56dab644b10444eaebfed741830d06a9bb93b549bc246fb8d7bb720fdca2210d6885578deecf37b80475e02cef2da53c685f0e6d44a117399f27c50eb8662fa1da047f280daabca2987ea7ff5a16109cb03d23121d809a3c254c044cea2c1c5021d4a7939c2b56333e558949624abb4329aa8de895578b18f094ba3ae0588990d6726b5128c596f26cb72e8b863007a84b13c9415a7a4c58879e5169499fe9dc7e6a34f1221df1688a0fe246346aa8648b254fcccb7d608360c564586456dfab70288ef42678f7fe3ccc5ef9fb5f0fe0604b9bdb66d55a1202b65d78ff11bd766249f3ca847b1d3beb78ff27598190b470f3380dbb16bb9cf3cdc75b485515d5ab2aedf4ea98c39a2c924d4ecd76ed4913b8aed446c5e78c9a981c6ffea57b41d167e7f3c7669da166a4b3e0d5a37826ff085abf884770598d81d737706750337b6d7c5799490dea202ced8df09bc3c6696ed63ffe3fe89c333772324c2f3722efc81590ded496ccef973496acd442b00958abc626f3b2bd320597f0f07182b8c4f43e20068dcac23b7033ab68c1876c455245f281275144f09892e3fbb2e53d816e6095aec90c728a44552cc3081473a3f83f359b3f66bbf55d0d9bcc77b159bbb33752463afe56628033ab39fc5c3ebb96e21fe3a0459ac6cf6288f1448975ca5efce66b47f2d63ac039973c32c145e2caf911d8ee8069db6c3c2bf89dc01a33ce5be26c749c8a9960e18158200621b010ceac199ea991a9bff50540d817cf9e8dceb6e8454dec050ec5f9fc687d4ab9e4ed5ef42513bab837179578a7d30e4119bfd45d3ea962e4065151c760b93956d3df9b1716713d9d6e2e6cfe71944ee1feb9db49c51187dd041e2917ad2c661d4a0ff0e0e724a2bfc1a3fc40c9de09f7a9473c1c7d28d3467477008ba2496983d408e0f02bb072a5de12b3fe1512e7e8a5e26773cb51ddc6c4064881d4b2bc10fe64fba338a735c61ff52464d7c5313b8115fdbe342effc49f5691a8d8eac64b258e9198a27b64b713b5de43b687ae66a74c5f7a4c12c1c652b25c5f234420a8e5f0534efd9f77ff35ef41e905bc980095001d26879fbc528ad40913286143a0bc24b114be95e7f5130befe359e6868fe6dba7415b3857dfa42638636cc4b7c914b62ba849f14d3f179648b12798026b09399e695b7f1cf43b136ade64e0e5888c0f337844341033d018dcd0f333943868a452fcecd68406bc3600d2a53865758eaa58e311d0c979b90e2cd1516ba46ea196757aa3d125ada408aaeeb25da00699121c975759e1875ed0b920a682cb7430aa767104e16a4f9f05b990f0a33db237d0ff037921f0e32e1af24d872b61ff823ac66e7499da62e9a7cd5804bb971ef7515095fbdb6ff3a34768c657c8104732d1f5c1976cee9e208946a242f93493342de1ed43e8b75f5ae0ad19bceb5f11befa7518d1dd2f47e004c61e500eaec58ac1036805dc7f7cb1610fb60af796b5833ed4e2b86d04f684b4cc1aa04e5e0c77b545a4a62920e243633139e69f5fc92bf995adbf9f1830ab13b925a85adafe77751911a94134068d419203c42522b315c527e85bd5d17cbf9c1dddfc969e01f68b0e3d83c7318ffb96a2a2283b8809dd2c0c1111b3b9312ed87a9201942fcd91518586ca2d91b51adcf3a38734e843fe98c2b675bb380495335fe05bc608a7c4732f9bf0e6ed3c678ef56665c3dbe7d695ec470c5ef65d7f473e476fcea1270c6a6cdb7c85ac7c7e174899484acb7c019dd9512a014ca2498e7645b1f091d1c5a1bdc3d17c47fbab103d8aa34c4f571c2b2a536364d3798063c859c6ee432eacb392f3a45d48409b0474d90b4ad02f62c85fcc5cdc0359b0818502231a4d941e0a9cd9498b45d1aa6e5ef2e4c8e66b91ffda3a5ae954b956424cbd3b0709a896213be35598992575b88c66c448fa72063c2a1c021f502eee30700983271fe2b1a1e0b03cf7eac2797d6db33e3da4f95bf7dfefc6d08e10e4d69f75a01ce8c8dcd73bbe844b832f1217735697394e67ffdd6c343dcf5705d6af4b7ff63b0cd1846bad6cbfe62ac1fc214dcf83ae8f246e374f77cb4e53744024e4870a13f47344c9a659346a2a2184255d9c681fcfd513a00a28f3effbf29dc1fb29602a2844aa6bb6f2a64a09d4469e133bd8ff88e0ac921cc63c26c8f75c110fd58d0020cc01dc6fc77a086250bfe61f2c4ae052ed85a807ee288532f9179c8329d51866500796315624279c0d5cb7c1fc2244b6323b3c4c0f3d7dd28e3ccf0594fcf5719708239c0d391a3f80a96dbc1a13af1b8549d96987ef93101d582307855909cb07afff107b2d62c54122825e048381fb2d1e09e106c347942ce622f9997dd7eb085ba32f2e75a3c5c554903849f66ffdb0344832fa3d1da74363596c3fdfd25a3f879a5885b62f9993cc01db68e0bb6ba5291eefd0c177e1e74c30cff6f3ab8103d05f2d1f4398e922d571a7dfd716fd7278e86838f508dc8f2d43a54d5da6080bb26c0d59b2621cf91d4a3e2d4de50bbe804f4c815c22efa1730c8ca1726447adaa3b79d3970dbd9d1005fecfb9b81edffbcdfd484b78a3d4b9e5d691d668d8602468030b460e33753a3f7a35af02bf5d27bf0b0c675c918f6e8a13acfe2622c9bd5c396f63e62718185120fda24765ccb0ccf63c144121480d43e4416e1ecf50d1927d8e5527f10c26d5939618189a9503623f55f6e8db7522bd98fd8ad5268c1da55fd6be3639b7d257328d84d8d64cbc0946f863a648cd2b41d24ff8cbd0e1de0f50d6f3a359a1c730ae428d1a916a373ccd820efbc186939af0a71c7556d8af2ae11d8a01e960620c376375506464017703814d6c0e57f803a4918a5410f71da280f905b4616a3f448e5ef21cb7c0a742b984a37957a7d5364eada70aa7c385e0c127eb3d4a25bb64139377c21406951a2ffaa5a665fc978d5f4a16eb73a4947021f8af2f0c29630557bf6b0301bc57780751c86591dcdb7366f54e991d30a5cb1409c5ec4ffbc282db216031f9486af6b028804963bf0da2f64db275fcfe567c27c9c4175e0356771e67ebe173414bf0bafd61d464199a767da1e714ab4412edcdc72e12eee69b5c81f16283f81d76f0a83ee1691b732e887d9040e7a0c857ba866078715afc1d9da66c68bc00538890d87b83a9e26226336697748165e1b14ce24417a52ada39d50c2762dc1489dd3bfc11dd09616d1e11d935f6547336ac1f51e09040e7078c7d23c0e586bd16f17c53b031fa00da729e45ea2ae3412da4cc55b486b717ea92007db7652e628171bcafd5470e5950c0532d3296b0683d37be8e3e4f8a2619c7098a7976359d5fba8740df60b8d35683baff8dce4e40ebd1803bec7f3caa1bb7f2ca857d5ec6085856b75d338bf76239404d7a360f73c00e9c1f5d7a410c46d146ce79feec9521c7c583dd13fa3dea5d8d9786729669404b7c78efe529d5419f9006b58f815332753e36bda6762f756cfd5e10e855a9f3249c094224798d929f48f3c6839fb8910d3b309d5fa24499f40a11c82bdfbe3f069520c2dc92ad904cec163b9faa1de3ec4711ea93e105ae6f5e531a91870eaa7dd250006217bde124f40e731822fb919eec4b3407c4fb594b448266de0e23cc06ee2779597b26fbb3eb1d0ba1bcea3091855cf81fb08df12467205b55b785fa1e4317ac272f8156764bf273b0ba623760ccc7a54056461c7730cd668d35bddb407b91075fc74567e8a10f39b9bdec1c890d0bca1e08bc41a02be9f708eb23e609f2341967b4fbd68764c3cc4139e05676d099e50d5a49075bd2f6ab4d5a6080c7316150d38b0cf8df11c0a9dbb1078bc6b20274a2cd84b3f6a083e1cef5fc5224c3b95c27bc01656c228660eda59a12d51bd60752d4e7fdfd2f024902604fc09f23ac89e8ca61929b31757ffbaa40823e9874fba202fb3bfbd9022f8c0be36292dbab787b28b606f8a91e658a1173607f927fe024ca27046f390433c06b4faeac56368663697749110401a01d8dab23f4a447533fad03ddc3b978c45400fd0b481dfe52460f1dcf50dc9fbe3a7160435a487bb3672e0a2e95e4d07f9b6f640ef2ad336a778c2200549d791e455f3b54fce98d7f4fcfb27d5255bbb41af92d30388ea61d9c631c9288b10e5ed2c984cf7921ed454e04955095569b006750a105863ca70a192675ec59c1cfee7722e5194b6c2b73d65f1b3ebb91eef2e4e878056831b6ae6238c674645a4e4b870dc4d8d032b8a99d41ccae418237fa28331a966b0865892c2c76c124c50a04a6ecbc74c4101554f75f1205d391f684b5b2f15eeb1b2418cb740f69179c73983b422473838ee1e4790993fbce5bbb31020aa4c584f492dbc4a208c2b96b2b74d890a55b9af98ef696d3baf6ae49f67d818c9d40a52f0250ac38fb74869b8238f37ab7a3770a7cf9d5400f6d0fe728c8d8db5376e82512f5e69b4fe50bc828431042c3d1a41c4c7cb8c109e55fbdd2b16c595fdeaa61456a085b8e9ab55b7e21a39b627cbeb97dddb5e922f60a2874a5b0992ace888e19fb85fc200c1fc0045341d70bfb036c71bb512ae2f5bbc19f444a0d4cecfee5e148e3ffbccfb7b05b666fa838d32e9fd8941f08e28ad113a2eb9d482ea07a136bc0b6d8bd4bf996d3c98161619b9cee02e683f57a1be699302a2ebc589f8690f9f153099a0761de1e0b2bb52ecaeab191210493423f68ccb77e72ec4320a0d92c695d24db989d008a99d2f5f8d77494f3d22544b35bd428b9570e5a86da55766387499d0a65e7a8b9f3fba64847e702bb887a9c45f7b527b65255898c2310d33fd98ce4aef5fe311ca81a6895a2ae7548a2590c829988542eeefcebdba16f8a31eebb8e21df3d243334b39f896e27873bbe6507f1c7ca38939b4913edcbce05ca254a1c1b78110c9e186bdd6c010e93054b13310bf8f74f74c5ee744b18b8d0691bacf0f4573664adc18784e601b03325b6d7fa39a3abf3531d319f7c0ecc64af4078bf35030996e2debb385ff6b8e22db047d6236e34eeaf0fd6e7e914554d0d2221d955f2074dedbe6b5a6246852a7d95d75731af4e7bf8fc23002acff003f33f3cd1efaabbe42eef0c8d7587a176a5f60affeced3535c180ca5aa9a83903f1f62e3b6a9393e416ff332402209a41374f5722cdbea5a6892c2179fe238cc7a9f57a684f532bd8465d63c0b0a7dc24921040824c89fc38c06cccc080c857e95baba5fb165fe03b3d8812e5d983e39b46d75b70f1d5c586f7b120d0ea0d46c3b797357648205d875d0db506155b4d1fd6030c8156388dfbaf97b21d9278c5f12e26ad3c6d2b0047256cee93cc84751cc021e835d218a211489f1529029141fc200881effdf654e53714243197a6083c85c252f10dfcce626315ce65c2cd674f4d8b37f36318d80c02a1da41ef1652d9a752e155526b5f597fba22664ba39265074d43d944e91606088485573b7c018ea55227e557cad1810efac5ad15aa5fc7ddbd4a140c0d7b7dc93ab9e4154d70c5f05e7b0386c1c15391462caca9582c0241599f3620fc94cdb532ec6b04e14d1a18c67f4257b6ab5b972acbd78f13938ec2b0d7b24c1cee906d1ba17e72fde2e59f28891443300c03911737d02f8302d7e241780ac604d54051435d70f7e9cec2f4034d1be1b44fe60fa9d509132d06681089e4c2274b0567f24894f4fc4b8d3ca7d52fabbbb9f37d734147f4d2681ad9edf8c25af835eb71d0a9cc7d08899abd3b1ca55629c7a3245c7be515d5cacc87db2c8547b17bf3f86cd5887b952a73cf1e4842adc453bb853bc8510ea5cb780c5883a20adb73bb66275a3d633ab4a4ecd1f67c1513e4c91a91a50021baf0c9d1e6acad36dec3ae35b0b67fe6619eaa80e695d61e8101385eee9067119dc11e7325f60b4e53c248f17958b457926ef135dcb4e53c942fa5cca3191a30b6b3026a66fe40a3a3261823e1ef7f4955ac157624c20e01d5c67dde7fbd8e11ae4d02125a23e1e9753598479ab9352e13cc83cc4f4bc4e0ce7c4d1ea4ec3726ed058a1550156382229755d704647a986546d8a2ccb0ae5bd6a78007e333aa02eb7326ede93149f033b1bd4caf6fb3fab2a160841daf2ef596deb3249b125b1831fc5506961619d6311b4b32fc4975e79472d7fac285db20778852ff3d06cee9492790f9e7123786a34a9c049b6034c183218b714bd3177f014aebe2598f89f8a97b67224cd44793f2b60c4bdd72751af73417822a258863bc8cea98712af0c8cb7e442a47daae80b7e4386362cebb766930e8a7edeb827111d4db6c0457a7cc3786b47c5873f0df5b6b9d05abf38c46619e9b4cf793ba29a9a93ae793a42395665b44930f5e92f265a2968d197f4c2d78d39bfbd7cc83efdc7085859f7ed896e0325108ccf9298c5f2fd1744bc09f7e1786574f2ee4645632c157e098664b533dc2763821b218efb069ca55b375dacaa60d79813d79ffdf35220e630ef9004cc77230cbae37e5af01f6edabd0fda285dd0f6f6cb40baafd6c09359773858c0625c7fd1db2e9144cbc4db7e134c67b5204d2a55bf307fa233fed49f866ba32f1c14a57b8e054293b57e4b5804f7eb991b61db7c9aafd62033954d80048f5b9b2326fbd27a6f7991d5d426313916501d7893713402c5a76ffe0c64c499ad674a9e1aeb9d48741e84544ed4d159b47d895c6b54459f7bdad8bbeb8332eeccaf85b679dba69f1c19b55974bd000dd65a25f172ed771bd857a393bb1194abf41b9393c935b32870526c0dcf4a86fd86cf385f2fa2921be40618ad0276b0782d93be5c95608d8a77b1f197e6e12ad0cbc40cce2bdc5d4aa8d07f324b194efb80ff4c3a62c4fc6e391f8b2041ecb52fae21e765ec04a14d2b9b1f491b6438dff4478654bac9c77cbf8283d069d1f0c135ce124cfc8026cf7651411bfcbe35ca9253b4d324d7b85b10c421cee5faa02f6ab3d5ace3bab4768fd82dcf758f0c65610b1ede295695b434cbad433dcd902055b977ad271813ea801a2b8e0f40865769580b9e4fae272e34816f56fab4873dfdc6427652040ad451fd838050376b48b220c53a2147367217ccaf30a3164c2e6ac37c30ece563dc086b7cccc2dd83e2454d92db248a8a27e596b4f8c05aa89aa4996e027b23e4a9af4b5f9bed9a95ca29c5bba9e2ddeaf6a7c6c7d7daea6329b42e6015892656e44d84741458d76bab667287cbe2a91f87644430f5782d4584a16c9a909d558034eb0003608bfacb2b053a406aac57f28124f83779228b1653733a639c401a2c4290a654a60e6d7ef20d072cadc94d288defca248c606c9d3d327f0561f8dc20b6445eaf0f6a964ca986c095bdc0f58c52cea23e55bb38a3ebe725c606500425370f105bc326dffcf8784dc1c119b6e579c868cefdba57f0059a13efb4cdf8036dfaa4a1e9caaf5886ec96f9e25df7faa9e6041cabe6324c325131c792f92182010c03c9a9de6d26fce98284481322948b2f5e7088c52f7f1a166798c95be76a9b4e131b2ceb832f0178fbac1ac39e7bc6ab5e12bce1b75066f09da8807bb382e2c6bdde9a79583b3ea0e9b781f5d3770362ed496ec23388bee8bb41e0e2eb937f7eea5c1b0e54125b6932eea4322950ea5df15fc6ee09efc904a9a91117f965197e80dbd534df7bffdbbf99ac0108cd22a3539aedefa34d304e4f283aa243c059cc69a4f372613fd2ff7800c0ebd8b8543cfc430b4d676a9ace9608830c336ce7728bff9b5042267edc456a097701d72731d3a1478ebf0eb08b648f15dc2f306a78d033f657eaf8a87a0f21ae2debf34489bffeca3c12001a8da307189aa1d68be41e8a2b0ec27dfae2bc6bd895fed3524caaa0bcdec7097fdc39b6b3cff024f1c05f4a62fe307d1c1b3691af38a341fa827bd044fd48f1888110e50f0284e344147abcc5ad9dbfb62d63da5a9d4003e4341ad68a20fc80dc830edb54bbc5da2ee6572879a5720c6f212d90024c3fe2b76a6efab7cf4b7d24ea1de2a9821bd35540ded6a96e152ceffe7bf9cece06a61c2a6184f3939db207be244036e0ee946129f70d7b8ef0e7dfcc345fe7aaff17ba7edabb65f25ae52e080a3e245ca6e7fbaa8a17178f6905e7944208746890fc3a6dc2e93676eadf40d0 MD = 425ad2c8b6755836b4525a5d957e29fe7347d03b615293542485300eb39276c3e2a9c46458964d2b3a27f0d61debaea5 Len = 92896 Msg = 29ee4093324142e57be60c9a664da2b6b2c76134413ae4571e19253bbe93e4af860b4d478ec9d5aca5ef653795aebabea8b90cae6afaed5ab1857593dbca9c79570ee790671c471723373e95c25443b41586685254ba3ad61da4e8c0baf9a885a3df579943a25fcdffa8dedb75a7053f0115be4986e091716b60c8eae38ad17a7266e588adc3e77741298f32360fc708754e55bb88d6bbd3a29f5b38dfe3df00cc8bd8862ae7a5bcefa197c28ef453b7781977cfe30280a5ca4bebd3356e9ac1ba367aba4476634513fa3fb204be6ff3135e6aad1ecea78fec4bbee36d91ca62434f114d82d8e7b9b41bcf2b21d5e4644d05777ec1a1fa380e871c8f10b6368e70bee6666c75f9c1dbec8f546ba179b32ef6e66a55e23f493be74fffa544a7eb486b412e8bb563058f55c6566c8bf888be1aff9861fb3f6978539e5cb4a3e521d33e69cd6601ec2cd83ebe58acf9278a06570a316d53c241cfb350cec53ab8d91920a86a86bf5bdfbe8fbd83b254d0620d964e5c0152907947efae7c6173e8bb23f7442d715979c54a300cfe0605b9b8dbc01442a66070b8e8ef008f0fb53c6ef8ad863fb1350e878309f3f23072ab3379bba40ae3e52ba6bb9c8e2e58697d9ba028b6c8cebde2cc7203b987b8056d7bee7146dd414989ecc7dc9f82c3f573e924521cef4e57bc3d1d04a8e42725c93942c842e347f4523215987cb3d8c2e6018b1100ddbb6d65818ef50632053985157eaadf437d4f4e1fabb96ee81f389e8add4fa9ba9c66a641cdbf1c98d8ab6ab6a9fe66266bc0455c9325bb4921bf622d22f360ad7aaa4525e048323f2ae240c5cbac1fb39ab0fe91d5c6abff65c0fc9263e56ddedca10ad4d17a904f8246cfe9ed9b5213918842657782883273a13260a80d18764ab3bff7a83c7def693fdecb15b5476dd8aed98083439809d4cccd3ff753a99d4c482a356b754347663537124ee146eaf88c8b8b00f025ad0fa795d95a9f677a6bc81537240f28800190a0679d0796b27888202ef7717546ac9c51d3d8d99b362e9b46a5daf175c2c2b8e2720c1080ece00c5f106faed0fb3412cbd879e98df81e298526960371343216c5daa2e24cc1b97f11da708e80f42e71c98e46b785e9c1da9c625f2d66ffd8101048676642588949fe3303fccc5a2220149d462bcb31a21751023d579a4a3c0f8d636484a9dadbd2eec42eddfb55988974ae822ea6f746466eae3869563ee77c02d4a025cb6e3481a935fb1a560c1913b06900a6606337d1b90d594be20360bd3842232fee3d1ec0f62d729b25a82c269275ca7d3f9ffc1efbc8a7e686c02f3cf756f68c5b6e20f79f549a48b0505a2ae07be8998cd01d97fb862a208a9edd5f06b820225a2ac38c6a537b093e2d2a87632260e48e2122a283f0ebe235c4f1902f0fa9db32998de820d21dc7186724a6e3133c448fb894a959aef115d15af33638039a9d2de20873897889688725d0ed28f584a3d5bdfb134667459fa48a6cb8ea3efa52912ebc956ceec6d6d18fb7c5f9713ee8a959dd4812c3ed6af77ae3800d65d1e1a7a430b792dcdcf73ece60971f2f74fb53b3c4b0856cf35c1152e0f569232832b76dec3fc4e8d4b5180a53c963d62dc41bf537b367075e5f3c3beb7fc51d062d09b07897c8bdb5f7a56a19c58b0e722a4944bfb97f3f375abe5d8d86ebfe73bae4965d25660187a42f1739f15f814a1824cbe32a96b98534e0df4d72a16c77c192472253685d52a6fc393bb7a9d5bd73f5af2b6e742050d7eae9b4acb00f1b2a59ea4f8894781fe454f7a87e2fb2d324041b1fede11aa12a24a5499ae09166dd82a76c2bb4fbf546817907adbac195139935480fa54f7f15d53994a5f89761c254a702a68e8dddb4cae8e0ae12a90a28fc252d3d8769f28047cd1d35c2cc12c219129860ebd7de16766cbce8ff133a4c741456dd510d0253c08a6db304d583c31710b7c192800054ce2c21c349a72e654b2a4c59c9e5b87689970b85875dbcae98c7e6314d314b571a519aa7b70ced5cc78e9617b8991bd2ea1d7f15130ac36ce262ad18e292c805a202acfc13eb7f1a3169bc81e5d1334d2a4452ca7084a2e43d0794de1a4a7e47ad68e12a23ebed86d1e247fd1a3409d093330b0b657461fdf3df24ebbd02760684aac099b0b53e87ee22bef51d6aa4446b133242bb8206a14b11e4a89361b62870f2d1b281f07a07d150a9d0b71c0d8ffb0b4fd63a559bb78cc55d7b63104896b7659ddb6045aaedc39591f6b0f24a9b8b44eb2faa962726ff2515cdf7b63339a12dab7d135cd5210a19fccfd093654e63e68db5d3ecb3d8ec56960715fc80f87872830163dc038aee0375c3dfa86592ca18bed07d0046b49b83688f868a36ba825baecd186e3c12b97b813aa4d8534e0a0205e86f7ae8a253d211cf12075d690911b34bfab989a0b1abaa9ce8cc366a69cdea657201a18a5d6b1b2d801cfeec53bc1ae2d066f11d20b97751732b16cd30a1f5af4e3d7a5401770e139a70202ba8826cf9641c7d6f4ccd70c10d9efc61a6a5af2ecbd77ae9871e70e826accb0e528e30fa7c84347f7e101e547ecdee0d15029f4ab077aa2f3787cb14ed77077d9806ee4ce1451e35fda908738d5ff7b9c3df4e6cc7c4100f59dba6ffb77add60c1132f575b08437913c1b78404fd1c4df96542fad667b67134418a114c5c549f16dc7983b275ac340680b1f1a94e67b2ffbc055ea607a43e11e2feb273c67522df8a5738ad33604c1f0d802045fbdfce1d0b1ffeff4de15c38e68a4af66047d164444ede15eb67aba691ab7b9fab8c8a9b7a1644a9e175b5f174b6419bd1d295ec33e8ddb244ca37e333bb68810777cfc03374976b6a683084b40bff2bc21e54c07eac9d4ce790da1d1c3751b1b6a783d65bc05e0e91c2b438cf10ec6dda34f8294f2287ab7bc17b9e73a79df861248f231d83035bfd8c2b57ed4e702bc21b676dcbd30196a96602ac6194b41eb0f7dcf09f44ed1756ce7c27354bf42b21db8bd41c4674d7198556900e85feeb4a275184098b840d468e8ff1d091de36a07d4aa86a03493472296192a102e327d8bcd52984e1300473d64cfce6a89814e7078e2fdc93e6765d570af94393cb9901bf522538cc59c385ad9b929e16888d9d843eb39b7db5658119390f1bc11e0a6e37afc14cd66713251c64f9206518696af9427ace491cc88776d61a52134442c72cd445e887c2bcfb298f7a951caf6ff87082cc9e8085681677ca630f12a509b3a7a9f93666d286aedf045d25c4b468ecf0e5f333a9570ed722fb327b44a927daae15245bfb0039e743abeaf7e4911df1825536b44cfa80718152cfbe33b963e54c031082ceb29c4d5f6c693404ad53ad2dbadc4af2d6878d9cb781ff673b867c865803d1685178893a302103ad70d5c8f9fa2e1c2253ead3791391666799584666fd467050469542dcdd5b8d65426aebeefe745364d973ea224c471cbb39a1ecf3da21880ef8bb214e5d5ff9b78bd9be15aef61640d0e87b9f4ceb49eb85291535d7db412bceb2cd9796757028b3ebe875f2fb8e3fa0122df6f9c5147fe3b86a35ddbec22e3241efbf72e51a4222681216b3cde2e8b1b9a9313d1da600bd1593fad210349f8b322fcfd8f61e8c4118e301d7b23bc36ba59758ff3a27f67a09378ca01abe07404b34ceaff1a58e76c2043d48f3c159379d9d712765bee7825cfef42d2489ecbb55a7c4e11ed6d12a301cd2ecd79b317b6a66869ce6935d3dd692396376bdd963172fb955c5dadcc628d4c9ada8f2d4a0d4989e4805cfdf133e986328578153a05b75b6f32ed837b073d42972acedc80fa3dcc2120a9af66c5ebb7b6611fde4dae721c2a3a1f96b52d9c3fa222db5972f9fd9f9e23c1b28b0fca18804ea5a137984dae64d6565ff13214945a77171c86790384ba0e47b0047e1f292ea2bc068e5fa4829d9c3437b5a150f11e8c14ae4213da0c0344ae10399d557a2001b566c871114932f03bb68917bbd66cd646872c46fba6187b676bb0ea077be2e0445a6c591e62c386df74d1f1cfb4c3ea4f2fab8ee2e357f7062af0f09fcf15c2cb49f084165fdda481cb26cc06fcc23c711056482a34405bfcc6702d98b4072dcccddb9ea3a0dfede551fe02ec4ed6416ec1a32f3c19702eddc6c51d8cfb5585cb5ea3e540d648d75c81de330a0b8ead9acc1890831355c40bc4562ce6d57f6f4964e0147850b6d569d33dd8cac339b587882d18a9b26fd01917a9f83102e34ec978f688b4a0988c9fdea360b8f6860da79e67342a673cb7786946fbf5e43fb8be237dde70566c41510c95675f15f22a9d674d5f5fb23b0ecc01a3949ff9d311b9ccec7255e2b0b84fd58a5927c1fc70bb8b5606e423e93a66a9467ea9c44c0e2f0da8e0bfc5f445ced1f8c2ad6b03849472f7c7422cd5beeaa8a606add418e2904e59962880a57e607a77104a71a5eaaaa6c92ce43d7f20ca8858c91699b8537007652f1a9342b6a7477bde9986520780af408454e643f488e0d5326e95a8c560d16208208e6aa305b17d9a1509a65f98e4d48a1eb7d2aea81a81df304878acc534b6bdb4c28bb7fe5102bf478c117775f01b8aac1289b39abe052be632969e2f9a09cc51e0046a139e91daab8e01d38a498c227796f7a7e343c5a50ad4810e0279a1908267834dc812a168ab7015f858698cde2ba5aaf0244449d718bec670e07c34b6c0b976b79e25c7e5d1e2bc5a52d8b40a12df0230a018184e8a51e56b3bea29ab97665d4bf8606bceb946737e2c0f8852d7a39bce1967a757fa2e5c51977bf6fb60eeb57f895b03afcc2bc9d826868034e483d63ce29b7d9fc2b4a9c8658a3302c7c30dd6a36e25f585032dfce4c6222cb3f050118e3c11928e754c34389d547e4673c4c5f922593c6e5d1e50e956e4a6e08987c08eb1f9bcb7f0b229833dd1aa378188e1dd1003e1029a2978a6a14e3fd4bfebee66a59c9ad9a77a2cc7e44133457cb89ec1afcc8fcc6acde89f4dd5541af40adfa87f80a95e1a129299191985eab5d2716959f9a5361f7a0555a500902dd65338b6b83c54dfb90a0f5954c13e81cd74ee26c741adca58cc734c5f665087d7537e23d82649b924cf079b1feeb9b5440e897c400b1613772396f5d55d21a3679a048267e4e484bdefffd0e2e883ff8a0dc7ec8cdc7a8c2b1e04d49f7b902b07758034efeeb1cd04db7c9d364529cb30012df9d62c57bec52a218b2648086947a465bdc8aa3dec9a1ff242928b1792a6772026e4711a05d5c6916bf22916f8a87529af8aade58dde3be5838030d9f08dde42e610515dfbed71c9199bb528439a86406cce70450b51adeab277cced7f36a50ac9e233802b7cca3cf67b72d8f4ae464e97dc87d8ff94e46661f1c5ce793179ec54e29e1cfef42e619529c895664443a8936d6b1dd5087ded047691f9792ebb6be999f7a100f41ccb682f4cda330cecf2f1d97090162ce8e33c8ed80b195ef80e2a60e6a8bbed13ff01e46633c568c09225a95ebc5d82a3ed5c930e5fb4729e5789efe1909a5fb270d4f1bb2e97d86d1ac1658c0ef5aa4d60073b9b73f4da3cbc7a8f5ef516cc66a563cfa22744dc310137966f1488f433efaee105f4352651c18ed7d542dba3bf1130e6b1ba3704baca0aa49e498200f5f0b61bd43d0fc75beb3951db0633760a48cecf605408b268f9bd28903a7b4101f7df448cdadf3dd9be0c75e6bbc8c3f6b08ff244811495d9f4c18acb53cf44f6796d13a64a4e0a599e7abc6ed0061e02fd16e7c4cdf4ff6c6faa53c612188d320a01d1b6f7b6bd3a20f6adf9ef75d49d62d62877a7148fceaefa0c1711c17a430e1037158fb3b719da22c31e76829844a6503cb3891da74f57132c14cf649cb81a2a9c686ecf98671e618422e1d6d9971c078d2ef05ad68cec983c65a77c84ff92a37a161164c1b0824579ddcdcd08e3588ea2408966adf5d3fba570366393882c3d68b5140dd3749a310c75a6efa6d7d038047e90cb9e28a1a00fdaf8c478f03b3ae0bbe3454e21cad6c490f9b943e307b63c5fc2f41783da47c3ec6b2985b6343e6a910b85824698893ac622a46073836ba26a8c7aba95e2357a5b09ed4a48cbba6edaf959106187dac78bde5b7d27c7daef0549b9e7dd5e0b8b7d519a472656318600493a88f12d4e033879290a6e49767ad6a74c3fd8a23c8fe9eeab0ced6826189757945c83dd5566727fa788c58ce0ce4511ac2306634ae0171db9fbfc762acf06b110fb782c8379b07e5188ac068c61e7155421f4f5a9348b7b2194e20491f1e4f21af66caf4aa588e1b18ab04aebce232edebd02ede9f5cd938c882c980e29a8772ccddfba2d82524631ff40de817b8fca9674dec08f9c43d355163ab4f1eec7dcc0f23fe1ae88a3186d56fc15efe2837525b9e6f20ca084d715ff9acfdfb9d97f6203fbca4030f1d4de32309579abb4bb072c9a16e39b170b3984db5d4a0343fbaa63c1c88513d517df118ce1d12f8a08b52d8693a6f460dc4a466af1a3639dcde4a1f050df99b33e1a657f6f68f689eaba3d2aecb944f8e6d2c4c8018e435d52bb3f2617c24b22c40abe76a2b3991aed80ec05a6acf545a74d8081216d3af946989bd171df908a561a7d0130337fd36d93aa9545f48ded9a14fa14b5c2a2f806076860f38a127040d431bd8c8b234a077d19584f2287473be3a1f1531123d01d7205731154397b20c27cfa0c0d1bc527a788dd26b979f9091408b57dfb3627f982f3765fc08de1826faf45535bd1fb6aad9972611bce698e40aecf9ac342562694c2f933418869d236593de6d9de532ce9cbe682dc0d1f37d3f4ae2e1be0f13131f45a3069a17a8ca0fb223b19a9430b069078007cae8092488adfcc578a7f85e4f837dbab617a3e4a15c0c48dcb61716e67c56e703b443a38d1e2ea28b757a1185f109989610f539c296817c8ad24fc9be24d31593bc07c1f5a460be1e0101f6689630e75f8906911b6a6a93cd7140919707ddd8a188be4569487a635ad4f6d3a17ad8f13c0b3eb453dfafd6cc1a52351a2e5d7a55a1d1f8901165d76775bf71d7a5eafc531d056a13fd388db055ed7feea03c41d88ea6a2130707626c6cc698b3204f51cc47c37a03cded00a0aa7935bb65607652d7a70b9932494e9142720fdcf2ed38d011e0adca56b776c5a25e202b86b360ea053bfacb9b13e1007e2aa0fb23aef88704c4cb11a17c3946c40408e40a1c49c99fc93851494e65dea85811b8bc79db18a7d79c7fb4268f4c99d3b58ef98277172dbb8ed244e0205648632bbac33527ab8282e7bd999bc1ffa834eed25ccf33fb3878c1f695b35b8de7b3b6aa43cc256a1e2b767258c51686798d7c583aeac59d47689c6643ae5dae0cb07a2f41251d7b023c0f47f78ad80a944728c79bbb7526e2f3e6ca56b870df40c23ff2c7285706b61b7be480d44db282cbb8c7872a8bbe918166c9d7bbda480a51cc9bdcbd1a34c33282f0fa8abfa7ca80f402071f4e8cdd7ae50ccd9ee413f2c5ead189ccb02cb0e7eb146e947410f4cda61d228207b94d462b3b4049d6658086613cd53d5f1705a480f7e3dab516881c94c3e13bff6c6a4d00fd38a3f8693dfcf985c8f8701d4bd007426143c9e10fd4879a4a327bcebaf82cfabe969144b08f79546ae62b6509d2499cf1b9fa98115c474a6850c607c7ad76dbd90aeb2162a8ab50c4edd718c7140eae99248e64141e9c7c407b273e19d5a84892e54c26d9ad5522ddf6bd5d0efd1d1f636ace6ca2814ed8dc9ce59c36d988e8f010fd7b9f084072bdea265d64f54098577402d942ed2405439c4948a81fdf64fb7346493c1f34e76daf584054643dc17c2a72d27dcae8ac7d619b6af7117463bbf66eb8365cf929f42f9c2d63b2dd41da746580d981607493d5232ca916118e3982bfef172656e15a50394c1b48e8c1793b250ae07855068cdf28b448957c8d7cfd7f1766e414b7a8fc79c6038c26e86265f8991a188e097066f42a5cf87e078c51f757ac00fb52e51aa2c3a3e75f5f9cdc27550ec9d5264754cdb76ba6dfa572646fd870e1d35b1992fd6a84c25acd2f86f96544f4f0051a90fc83ff07670e35202fc13aef64794c4cd2e42d83e0db244db8f244ffa84df002c8b59f83deeadd6b7e3b93927655872f69592694b9318218aa239754c5a6d2927b75d4820be3732fa66e0132d096d12509f0f85bad7651ce1921c4590fbac7285ced246cb79ffd53ed810e373be53316fbd12a42845299594b1353784e2ed7acb2421aa9aac686bf9c9d42097feab4e8882544af056f63a08922cc1849ad0a06c69f3ba1ac01135bfae92410644c5c84f614cf0cf972b68b1a76b8a0c9dd691ee02a11bd85f8ae0f518e3cb5b2b433d28dc552c028069b0248369f7a9666fbdc470b2363fc525ec3e7b3125e30c942ba976155335ad119ed598b070d78f1c929456bf9fcdbb72c5f06812f75a73490255a0f60cd577b3834969c7ac13726d9eb20721cf1e8d11ecbf4201a60df9c25f91ff8fcf6e6ad00c047927ffe9aac350c214713a8ec453feff9b75b89a0aa0a202e43b016d10f7a77b4949f2c6a2ce5729013668baebe94b35f6e7b56b2064680cf190595de48ad4224cb60b36f4def07b5fd9e01f8e227006c6e0131dc57e1034aa282dbd601a20ae15e4dfc71b85db1d72e42719059ffbc6adf7581e745e490e605af5080e15fb53176eb6d3814375a40cdda453fcc24d19fe960ad9c7a560eed6b145da691ee2c5d3bc46f8b0a83e93603eee4cde39f2554b2481fc09b3f67a5fb3a680eb85758acd45f6b34424b4602f807b6024577a2d065b83e1e53a88257dea8db81ffa020686a44c7f9639659ecd3ac23a69bb42f5d2835727d4798474a3be61cc70ed36bd724fceda3166d0a3bbd6693808c5fb341234923a422179ec83b7d95a88cf723432b0e43fa02d74139ddbc6e59c17e18c5807bb95c8a2d6f1706f4acec21152ff2a60233c5d0dce62c5c361cf9e11c453164539c6d27e3a280c3d3cb5a7634772dbe6123ce2784e15d615c0528953e22cdf95a359fa3401f4b9ba359bc335ce33b9bb17ddbb0d81a1415b792ae85ee97e06717eabaa34ccec0b5eabed800955b66647da8b512df79999fce295258338cb4d6132485d21098273a33617683e8c7f4424a0c24f6a1e733282934ddb716e98f6dd44cc9d59363c75103ac60675c0f2e5ca211ef04274a2bd8511918499d96ba54e4c84e57de19e923e4065d52fa1b5cdb0c1fe0e3788cc9d6cd42c8b7d27b7db4cb02dcfef7a0d5d75dd734edc9d3c6e6119ebd3c9c93554b2515b8a8bd811fb50f603b72e8e2d396f788aedfd120b3a637f64fb69c49175ee2fcafc5658eea7e3a4c325cb9c52b88387f93d01ae86d42098f5efa7f9457388b5e74b6d28b2438d42d8b64703324d4aa25ab6aad153ae30cd2b2af4d5e5c00a8a2d0220c61160a636b0c31171307a3d5e2bd52918d63b1ca25127e0f8e6fdfc2328bb11cf6081d716e7e6cb54c1c1c401f9333ce3a2fd3caf1470fcc0cd8fd60756d0c09344298859da8bc53c8ab687342f3b36d02e872949f1a098cc0df810ad33edbdb020ba4286254caf86efcaef6b5a67a75cfd4b5b19550155792cc9448b4c5c59a47ad69e024483eac26571752de7431ee883dc5a83db4da366ae65da380cb734fed6e0e384c4dbf77d803cb0e272480e01569c901fe0d0130307605a29f188d02db97bcb5402bf5626c49f1b2f7800e545ea1ea453f22314eccc4b3ce7a74bab9f96f9ae169aa8974cb71b1c6b54e84514a2c50fb6abc1397261890ad77a7a27e2f40d1432f9223b6dbc334d3cb5789e0c35422abe6a34e1326bac4c9ff78ee5865508863fbaa6a2e8586a261a063c608b15f89dd1b9f8bcab5f176aa7bb0465083e9e8ca33bb07e6b20423f69c3ae3d1fa96ac1a717872c5b907ced65117516c715119ff418da1e64883dd1c27a387438741b4e950f5aa0b1b42f5d7eb75b8b617d0428a8be8e134314cfb5aa9675a6740a8c8d320e0dca4c4eb1335af9222365eb08bf47b946fda53a7a3388a4e06440d12115f49ffaf999b494f76073638f32c371dc47758f2e098dbfe3f322030e2d7c9b615331bccf187a6d2245a28a2f56baf2082e9fe134ce63233f60aa5824a8413e07d46fbdab47248c4c60f310744015ebbb7384c792827f26ae678a5a483fe39b720eb6982ea43784ce5901910e9d88d17eacc0bcc7c4264cd95e5e73e952b826285882b6c9ce27e920844a864ebd6835ca30d02b64e1fd0818dba34f789f5380a34870a3fd236a2bfb793a5ac52e58ab16a63fbdda8a67eb1565d54776643a1d6b64ecea492292cfb7be5da8f26ece83ec836bce991bfb58376380f6734fc07ef92473f42e6a2636ddaa20db670d2e62c44ee0f831252bf1f77b12d6ffc0ab07c50d824c2d58a913e5e3207c83881cca367f3ba533147e2aee1327536c554e5a6796b47cb67c7fc958ffe906e84e0e2cab7ad8500f88667583a22b06597c2ed9594676e06a542ec9bf46c70505ed76fcabe853a336ff796440ce9a6a37a3c12702934621a96e3ab7815e56e15cd4ebdcb04e19f939d83b69bdeef1f9977aa9a60c03aebb0439380537ad25365da2d12f4102a7ec98a101184399be3ef95f4ce8ce2e0d070b238b254ac99e7ea8b5cb76d6ac99d7c3e87ed28a457b94cdd03f61d1690db01edbb8aa532a4f249eac4f45f9a24c455c2d193afa78b6b5855bd5a3ae5b2d20cfc05506b94593c2dff4b10f228a5bdfb1dd44b40ca9dbfbc070b410cd6ac7e38e5fd4cd15b228c3cd1da554d9db34f18577a5c0396f67e20fbd6f5ba71e7a72eb28ac5fc0e66ac1e685a099981b5415179aa102192fe702b3804bc6d3ecb15966b960517358c627cccb175fd5a155c50894cadc2471d5c86c67edf4dc6c18f171608524858fe77fe06c9e1a2b23a68bd92477c0d3bbc0bd9ad2da581902fdf59bdc8f5b70023b34b1c8895af108c2d3f9985c52bf84146cbf5f85832247ecb0567bd368eb463dd0c19d8d84dfd73727fa8edd0440616d304a7c63e870b171cc31dd15cf2fd26bfe802a0f4a400570125c667e47feba17a2dcb81a1a9cc60993ae6ebb10d62d41f88e1c82fdba1a0a0d8fcdb4a04314c05ee6710c7bfefc30c13caf37b076bd5c693bd37d21b68b6184051314bfc5f7e3aee855bf9f2fda73bf5d1d20308a0927cb29fd7248bde023006cd512d8ffe9ee3d62c4a7e6a7d74f089046e91378a71088d8e8f6f548aeab2d2782438e49516c64d65c5a04ef791f1776ab06cbcb0db34cb9247f99df4d7644b5b90b624ac4dacfc37b4a5c6f36806660b80dec09a39c615b3e70c8fa532101a7d7eed76ccab5c8aaaffd6fcfa60f9fef0c72d6bd1f18712fa58ee5224617ce7e6d726037b98a0a0c68e7b1593e191e8206ba2e4dc6d3f6b6e80e70df9ce71599f81a9f2447c3ee69449dc3c475395cca35685544313b6c7184841e8addfb618af66be6cacbfff031b1940979d1fce51826e1ee28f4db3cffe98420cc7fe15cd1e6dad993dc9aba063e4f14e1dab0420c49db4b74782002b2a5934a1cf925420f57dbda07e030a647594358a4f60fee171ca91faf3196382a4715dce4e033cb83b8038aaf7d3e3f8580f5573bca6863b92ddfbd41c7ca57c72ca06bccbb8953ef85d64de31a20003143f9830ebe662d62ebd3b6d49128ec29e4b7693ce1b275934fc8a65b3d9272eb20a48ea64865b5b4d5499ec0243e5fc30dbf77adf93b9b2f845f16605de2121395aabc8b0f03972f7895c79cf7774d22e64cf99878815f04b20e30ab01bb683b1160bf3568ac4c23544ce3e391601eaa2cd47194d6201bc3675a6793bf6adfd2326ae92debec4f40e6d3560c78855ef93fea722ba8a46bec02c83da2ed9d0369672ddced1f300af8bedda0a023638870ade37db5566ac9df12dc255122be5d712e1dfcfb690419cb3aa05627086715a0e573f6da65ffa02d160ab146e54b5879f5dfebc15ff4f638e8dfe909be1ca11a750060035defa9469ad863ccabc08ef46ce80bd77a7f2ab247e0cbd0bb00954ddb2d5ba8b4972fcc0fd9af8aecba6b60e1aaefc62f0f21c7e6678114659f7cab963f4c62f092be1de36306ea3e95685002ad09e6142165fa32b8bb3d6465c1c424cab4aa987edeccc4290c6307ee10422e62ecef905271c9bb78acc43dd00f28155426f822a7fc591070229def210da7e360fb2b4a1eefa6ff0c0831388aaf27c67005c4159ab13356fcebf34ada9b01c03bd72197f30a226c07401d0ae24c73d682e3a6e7e377ec1613bafba17742d02337e37b005b8bcc80eed6d01b63417cc4214309100ecb03cc49222f8983bfa3ab09b29029c4def5ec174f02f0aa38b2fdbfa673347924eae821c3f7799c4becc605c6f96acb6e3eec351b2e11138ca701d2806dbbbf10320821e2fbe80d822be2d0832f49ebc4183fbccda9f33bd7d97eee53612c4d07498ace31955b73fce1afee999a5d827b122512d91f2d8f84baa387b1f5fcaf94c21e8b226c5a4c169e8ba45cd30c4bfdad5adbbfe6068b3ddb3e230e84a353231c01ed27d95b1269b2e4b65f51dc94b65a3f7bf4a734bb4dab9d44dba5b6d44cc7f368c484d45350ef698913af54e95f99517819cb3eac4ebc5f619bc1bdaf7c4651828ac76c7b767478910c43fbd633fb1f6491da7abaab8de30de1711e412c17aadeed397a175512a062cba837d7edf017a5ff4d7f730e80c6ae2f2c6f45f6dc7db25e5383a3472a5f72b444af6ae808d8c0a4bcb371c23578c6f76c070a46d538b1709e1fabf72c344568c1a90baca5b1594470cd13713c87ecbca89c2aa6c27a60a681b49ddfa89d6f5b77eb36c6776fb4312212f495e66283e18a95039104912472a6d8f55b2019350f0fbc78afce32860d492b71aac3a721285a6841901c3b916766034f0413264ae5d1b34dd34ab8232b4e8d371a64a458d3b0ac511e89d81be747ba076502431592665622db4d7f303dbaaea17f3a087f9625c7aea6ddd54894e463caf86e0e3977461ba42276f6219716063d53c44229c21250d6c378d19bd29496e628c6d60b16f98a2e33379b6be9d92a871293cfcbfa1ece55fefb4b8a3300d9f5909d392ef3e9183da80ffd93787c920b36192ffa90a396a8b3c5b18838819385aa61b60980ad4c6edb708b2cf588c33658d4e12a4839504b8c78923a55cf59f2e0b4cb1f6faead1e5809d29cd3864494d54761cf634861bad3846c050d22a3e9ddf6e6f4f375a0e8982c526784ed8ca355f1407e846961733369ad7ce123f7c6eca8a81ece8ace3a36688911ac3701ee3562fbac2e14d6012698e516545bcc06b76a6cf153669baf9d3ee52f9beb4ae1fdfd01dcc2c325e127a29145e932a745a88cd41114918fa557200525d682de0b3a5fe184e50cd7afa11740901230fff04ab04bf2a48410b7debc57790e9621d654ec1938f75a61a94d57518951ef6c931855531a65b6d5539e545aad968dbceff832176d8c146a8a66f362a64ab643aa8bec77fceac2240530989d47f0d215947eb27a9715f348af986bf25b4f3e3ba33ff6291ea60eb3491fe98dbcb02bb28062fda14a275f82a55c316f3ce1efab198f02f4f42a24d99bd6c7ba9056c31a103f643a0b32c1bee82ce457afa533287a03835a21d98d2d79dfd382475760c2e08e96833ebab2440474e54a47fba11a4137f7d70c56a0156fa57d9366245d336dbb053b6931b9b876dec4957a77c2170b96f0da38041627e9b2265c616040e2145f20c12f3a3082abd4f2e7db8c1ea545aaeef2197457eb84a07e5bbd7d946560e57992d536cf493fc1f0afdfbb0f3b6bde42bd4529ddc6acdad60ffeeec013ffe8904f1fb9de729f506e6bfb872c4ffabbac7a2f87205feedbede79a366ca43dd2d5545325f67546faac9ab372ee598ecd7cd75d3eb7fda72df68113d6f26ca72ee921042dafe7c31b3bba9bf0ddfe748e544342931d46824ba04af062e9f3c8671c53c7135330904cac5a199373856878935c7436b8b0ecbf7bd3b44ccbc02e161f5b008998e63b097ed7b0ed37b4c706da71569c22d362e3e989d407105824b642b544e2d98f3fdc13d1f640a2d31cc39a208e25e414716359fbe424303258c226e108d1ad81fb3f1bd75e303d86c63952f87f8664fa94b87d984916d3d536b45c6cc0b87d75099ce7466d5e70367fd27547bf102e0c395da4ed877153c75b2723b70129d1bef78016ad880dd3789629a1bca165c7bffbcd707a33a6486f12753d6e4e8832e621831a7b42e0efb3a59948c5daf99a8c487250bcb2381a53193909e10d5629813410734e325a1d7e2acbdae1c04e4ef7bbf6c623a7a94219bbdd19cdd2362df68bb2a184cadbf53e921bf89ef5c63d98a2c5615d687c780996fbdd63118aa8dcb4d445bd61090f8b8813f25bf013eed5a96892b8991404c926ffc56f6fe6329a3c1fa066b943b4db593e88b72399eb353c5adac39e2270cee863724121bb43c58ddf61ff283e9db49215fc2f24dabb4dd816ba1d0c0a549147c16466fb8c64d526ae0b15223c128dcf14fd225858c7761916b113574e28a6e1940c6f31cc1e4f82f5fc175bdecbed7cd5ec4f5286a8545be54045046055763255eab8891cc8ab4f61c5942989125a07b349f49806c64f3d0ce82097d36385b6717fe155d0fc5ed85bf80a1fed9e3a1c37a6b08d3bb9ed18f839448639fb6bea814c681c9b3200ca5ef3f7a35ec82416fd8301c6a7ebb49c21841f53e6558f5b0fc0bb61de020771e549db586f18ae745f5f76c8dde41c2333892f857b3a7664778d69ba1bd4f97b897a23b391081fd0f7ac7e08303baa4a8898d39f6af2a7a35302e189d7334d43b6056f29673f1ea930ea9609614ad56eab33ca16381699941cb1b15582957976e56c2c3e53f61169a5aa4d40c39a342c15fa716e552ec2c35f2a57a1b0841461a22ed966d9f5ae9eb06c0242e9c23cff435d581c54a3c99d74cd52f2e38794b076cdf5477b963cb50b905394462b5654ddccecb4c90e04af082b21dd9e0870cfddba1e34bb504248f1b7cf996b6e16c92fd9adabf4d60a5473b442a6429f4f3c4173a2d31bcc55c71d52c4d6bbe304c8c3f429869a84514a620943f163a476623c9b21971f62fdbbe8f1e1d0da2296e034bcdec91ca15fed3d8a945383c08cfe499128e528ac9093ef05852c28b5538bfc843bd7eda5bcb970c8c221256c095cd2e61761da01b4fb8a1e4d2d3a13a13875facf579019ce2ba6443c0ecb1f620a731a7b81b62ae13f64aca87880b626824b8117bca6762ad0487d8050e7432d83949ec3c91f609bebe92105828f2559d5f7a7937b93334933d1e52dbbfc8fc254d1f39eaca84b5b9d921c02cfd7d991cfe4ded118e8e9bfc2cd0ba2949d5dd6fa95a95aa0d35386b0fa0e1ed4dd5b84bc9db74f1909f1e509a4617d7f2c25c1e16a30964a1301c3b27b77c8261213a948ac916bf088f45f84f2871cc03b8029a5ca29c00cf9ee893eb0d98d3818aa55e07c2db633e85985a131dd1f2c3de554b43fe5666dfa725da214b3dc8f4388310096cccc57aaaa0dfaecd3e307c5ddf9a93603f7e19725a779218734904525b14586ff0ce0425e4efe7e1c06e745c28ed136f6031c4280fd4061d433ef700b6d1bc745064231fecf387015f94f504b6ad8cd4c0652af0cd584502b48f166c1baffd23f27021c0415157d4248b457c1343c736670391f31a6b166ecf24a9bb1216e223e0db442f6a731c031639acedc715893e5ef44259817542099be5f818236e351d228bd595efbfa1353d87747f588d9d94ac1e854987de927c20bb4aa9d71fbcb8be6a1b19599fad13a25de3595012cadf596ba2ebb60fcb6f668ce996b591409dbe5f60e42f7a07454ca443a4370bd7c76ec2e068956eb88976421b08462d88732951ea1df9b878724342da8793e28df6f20a88e8ac64207357c3292710595ee3082a03ed40c0c8429021f12beefeb411ed2de292845acad511f95b1a9d7e889562d1f17c8afcbf5f3a27cfb8cfc714c36812368fa4b67f55adcaf80a7505cf303f2efcf162d3246e493ebe55bfa574b169a1cc0794e1079e32204a1e1e54fb5da8296e754dadc11ac64d042a45009d86fbc2eb21dd442a56a8e2977f22d5d4c3a3aa8d2fd5f25c08b83cea60e94058e8235ddd050646b02617f8285409ef210b3b99a348810bbee327f3b81f33cd6b80eb5ae8dc974e60b5884945c65909acdc75def6e7d95eaf511c59b68eac109ef55aa155ce19c603ac02bf35fd9c8d3bdf5b61ce356654f7fa9d582cd6db6fbbef781b6c02131561b28e41422059e297bbf40b755aaf565d88b5d7611e485388184eae74a10da3427033b8b257 MD = d66832b9f5d269e35ec9dbe48fb70aef640ba53b60ca7bff88eb092a56a5a7181c63d25d567a25c07a9f0ada0caeb21d Len = 93688 Msg = ef4d163db14a90bda8415c8318ef955188538c3e8063b30c92fdbab79720f74a3b5c0bf6bc87c365eeb23c4c835b4b4089e51bca344518bddefd0cc74c4e884733a9865efa684c49c2bb94eea4e5e9b439a8549860fd387e3b097bc47b4de61dde1dcf9df553f5102b44ab9003f33957a1857fd18cf5dbf5b2094dd6ad85d975449e2dda35b184633235ca5b29ef01cec864e39c4194c9cd4ae5cb24685e29f76e15ea3e40ebc2e9dd7639779d3f0ac4b72ec9220542c9ac0c853dd737409d4a636b4cf0a067774b36f0400be74d1cdf74c9798b6367a53bfed2eb169f93ff172b869c18dd8f6b304589273f907fffc7091f3bfee06b23212ab21c0a2abf1505cf5021e07dca6541112a353c1f3f7a257d1757a306b70c06980e1adb5f2ca8bd56b0256e0a7f2f26a2bcb32a1cf456a1d99814a35cb127944fcf2bb0c6427fe6c88deeea0c188f860025e9310f055be2248cbc266ac23e7157db98b1e86a64292ed1c57d09fc4e09344f1f7781dc519166da9553b9521745b81ca9084c0a1d2e8f63f24f8b93345845209d27fae00055a86ae853d0ca7cb97a79a5da7b8c739cf32bbd871945081b3b82aa67007930d7f124fc4e37903374a6d9d652fb562e1c62116e4d3c7a94f91e5c905f1d0fa8bf49f01b6b770e041f4426829556d21655e5fd4ccb7a9a9e9bf7959539d80a31b4b8b68bd217abb9625a47f2ce1366f2f083d7a0265e0defa9cd17021ab9d3935e475e95ac9fce18e4f2246e23bb7c8c944587b2896d3b4fcaa9c91f2c49d09666fdd0812198e1eb4e13a53dbcd57baaea31f5ca1a318d85a6929333970f6a0174e3f49758894bf847c6b2a9c2e9cb1599520a300131695be6905d888394099e2fffb21f7afa7408781233f85d80d4954aadac2b67f5389732ab0f64175e1633405bf360ae73c4e289ff1073b421fdf2a54cc4057406630231ec92107bf7f7894eff9da31d7da35021953162f054b0f351363b044feb50648c5accd4d8e7166802f19a30ee9f7918e8dd7e0d38a15561f773f771212c6985ebfea6f756b4da98043bd04f4a62ae0388dee0bbb59152043e0ce2941152152cf4de08c31ce8aae0fbe52948594daad9a6a03db68fab10a4cf08e3b448e4bb235204db7e530af00990f58c6242e8d562ed2c7f44ed77f709516fe11aed6ac530ab78057122a313dc6a75e0e62ebb986502898caef77e70fa6d49c60f296c9a1ca84070e4b23a7b1e326c0f1c444f59ac90bf4e3cd747e141cb9f79d92473a2aef066021e2a57909a8fe3004cad2b81fd3dd7ab35b25bb3a41278e2c0050645b02cf2a569b383b9172ae19bbe90d77921b1d88de3b3404fecebdde90ef5aeebe803ea400b7544615caa6ec8ba16dca8e095cadb8cff801be1fdd576091bf2fc201e58bb4d9725ed32b8926f8767c1750191b67d79c1a3814af16871fba05ae01e2443fe7742abc661fc56786eaa0e4a4e4ca35af21f2fe8f06e9ec22aab6effabbeb4f0d19d6054b11dc1cbb7084c8e8d6f995c3e41aeb89c1d8051df65b7c28e94b27ba3d1cbffeac4dc51aaa802a887a1a06aa750a75814a5150661f5bc8f914d458634057430d398aef08eb3b802048bc16c7374a33220b066cafa8405cf7a9175facd62e44d35423f91ad50f603ccd5034bebd429ad8ae37983f03a1beb120a4bbdb610a2c0d869971d4da84513a6266fed5799c13119e8581b8c3e8549215eceb8373636ef84b6bf7ab7e22c9a5b260b3bffeaf32694670b7816b9cb536f3507d398fc294401d0be9233273400b47ee11d2af048f5c4079884d6d27670c338fcf7208b022516619c4b089fe3ae76d6f97c22d347047171092513b20d07e60eb70a180b49fc8d0e618f8071c40a6cd5593e2dba79bc624d664517801882a16040f5c8a487302c811645e1c65c7d5d240b4d94cd64856142b5cb28652048bad69da1787c4229bc62c35574c53570106b178f9f3692c834f8009f8f89acc1f917d8f570be054f04586ea68197d6494e5183ee951a8beba4184ea99413445528ccf9d8f790550ace0c21225063c772df7e5951c0a4d558794aa8d17e2c706c0d9c0634571abcc2e026e3b0285291518b9ba19f66f9fa757b3515ff97fbb96e723009f0d685c1df034dbd38538cbb501a5061c2d04482ac72829d1b25a9a6c31d2f09f4bdf9edc9ff29b5a31738cdd55344a3a146abf36425d8480d715dc0d3d6420f28549dc6e89c63d6d7bd7e4f4aff206e240f56d7045de01fbdc3408d0767112274e29ad6a5a2a325bd8c87ca16e68bcb33756eb5f6e2422913637a97c597434ac0b118a566d890ac3dce7bc6a1d02ec0b6be1b16a17ca56ef8983266762d818ff4073eb99407d37240c982c95385b058953384816df3b1f752ab908083f272faf82d349c98f7147facc7c25d94ccbb98b81cd27ec20e0fcb0be4bd6f52aebf92b46b23d6d870fadc6b0e6609cc6ff48a08c12c95089667f2098be1bb4d280f60100833edbe3a2d9063e69456633405356b69bb4fa754607536e823eadb2a0b6af54e8b6bb11c56a37e9974cac1e496a1ca5ea733070da35b7843ac86637a5bba498354d818e01d1ea26e30ef4e474ed70ee617ca918cd8acb9e3a4174fe1a658f6f0b5ba5d4c2908b9aced4d7324d6de1d4a339aab98a671e01132230627944ae2ddd79be7292369aa9cd66a9644d5bee1d2252dbef8b5b1d5157e34f014ce9af791e1021e3eb2495d8610d02170f48041c5120b3375ae748037b1d17570fc501b56fc786a557fb1bab2c6077a6edb2b246d25ba70d739c2c9bff383fd02c67238725084333431a8a9671e950b0631c7741083c4dfe6fda498f46bd0f093d20a352e04aee1a4713712ee40043a029f5d18f757b1e769a321d51f4243b6ebcb1ffad2417edc6de765dd8f55dc7129ccf3f86ac707ef2ad24268889f61b7d257ba6fa62e7d8d573a3af29285a317426194fcb0fb5061ef330e3977abb45c101ee27cf2f4325a2a13be393ff7e3931605450c131c13a4816e8d30348ec30b6cc99f09fdba25acad19fa9bded4234f6d611010d952d920a82ac736066f162db000f9fe10a9dfeca9f5f5feb643ecb20e1cfcf04bc4293d2b0fc5313776362ba26af94373e9e780e74eb74c106dc524c3df1194b19b8b63d4c68e0b0dcdaa6b0bb0a6c06ea1c5d22ccd496b347a360d525258e453fe87fa69f72aaad199fa57b27a095e49f90248431ab2456a91c7d6841cd8c97816a66ab34aa2f8ca05af56616f28034b1a254cf3dcfac0fada01e521e69a296a0b6f1b7a65fddb423650cfde370d98bd2cb64503bb2ac62b7e6ba3f157a4ee6f046b7686f3433d7f57652cf27bc006e7563e9b3c61493e47a58e78bb1800fed02920e19e9a7c05ca8e76d465e3473311c144b566735f0f9476f0cd49d0b643d5a318c58c02b11b6b030c2fff16ac09839550fd499c75235b1a1b086128cca3c59adb8b16d4ea67aae0aea588bdf76f84f9eadaac829161e3b99793ccc84c08ea35ef9905b82dd0cf4ae59ec77f2e4c5e159bb458cdbeb17679ead452573d598a9dde5920558441216b388285055b8a5712eaf4162601fb5a859e35ba7ea87eeefa30313154f69fe96b2fb98af68510b8186000ac356427d8033b1ccee4945e5e736b8bfe5c8bd3707252ab9efbb5c6c94e8341e2a1ee1e381c47f3543209e3213019ce51164cc5fba72ac189bcf294d1ddde1f8212a7c6c2f74c21150f10f4815ac162f02a405dd5323e6112e044621aedf60352329808bebdd10ed924af79c419ecafa33f7084453c16f40310b318eaa555531ca6c8cd73955f226818f05b3394211d34fde22092ed3be322f3489e8a2d8279a6193ffb2aa87dc58994db8016f4e814690ea01a056c349538320adc42ae05dbb931067b2b1db35f064077d1b560c9fc0c17b25be6e289710c7402bb595067e31c962436be1d8958a5c3cc3657014d3de3c31eca7d76c3e168623621193a2ff799f1a1132bd088182fc6e29846fffb3fb7b7ee4e1151694b12a3b0f7c895e581f6ea86f9b95d37076bf0c2ddc8815c6a4f9e2ad1eb9a0319d3e07826af8811e8fc28dad2b1ed1e8e23ea73ef26aff627751ed83a547a1ab273c19495163c3c947354a5855ba7c6131d5bfdb4a8b254dcefdf02719219357ebaed0e2b44d8eded2315f0faffb4b60022ec691695b2fbf3868aaf5ded9edce5700deed28385ad5bd314c219e53b76bbfa45befc37d675d202c7e8e8af31974f5cc83a71196b03464df923ca55658fae6d0d044dd44748e32b3db4f91efcef2447c7fcef4fb17716576b1bf5965a883f43ec43f3b52dff8cc9951b7984246bccf9b23b366d809133ba12b382f141e9d8438c84d522af1f37a377254e27d494b03a30002dbbffda053e97f259ae423be03792cedb62f5324b8289db615032f036d2e952bc8157d9f5aaa2e162158705bfe5a92aedbf28c0302e76449a466609c7888639cb06af1669c8da86866d35cfdc15779ff37f704f4d6fe468e1539967cc25afbd4293301aca5ee8ebab007722a191a435d5ebf4690c0d7c501fbdf390ab720be70970016c81357318ba1473847520d9f47b4bdd95d4cfe5033acd9b0ece3443be09e54c95f41524139cf25180c089bee5cee7525c0e7ec7891ccbba699b36fe4a283a361b8dc5a3e637e23a9beb95fa0fb4067c4420e2ccebabff77277c3fe5944fb6e988b30f9799752b565f5c0c367b16f283d773c39a30d1b0fbd2d816a0a367a28d63cdb9a9323d17cc537cb6192fddf18e9d6fe9d96075286df11684d68056464935458c80bb76ecc5ffb35a4c35ef4cc51d7c1c32847fadf60da0512f3106ea46858250c53b0af368ec6ac27695364b51df03234ca3d688beaddd4555c05dd6acdbeccd1fbbe074dea107b4405599355a6b6ac7d1c56401ec593527ed344551a2bfebca3742e0b74ea6f4f9517fff54074a1bd066f2105fa99a10c1a296a5a550bae711b4d8f203e1849759531a52ee81037c06b533c2ec1cf6d6d919ed6418df5348683f85fea2bec25a9beb2f794cf01ef730668f62ee6ef7ef38fd416cf3771376988052ecda0fe8a489c3c55cb67b23f318210fd9aec625c4a6f49ba47e3f81da691e46a4f4f97fdce983e4e3734a9bd8848dba0d744d07bbeba602f4006025daa2c26a0f37a60e6c84d394f6cd860e0d3d5298e7882a253dcebd7e44c30287df0d13c413ed3e1dbb2259de7d0a5702fc0b19b14f318607b318de177c0d4b305270ba5f995ce834318bc0c96073e4010cb58a0e2eb889368391b3d6852766a799945e408acecddc3686ae5e87505692a5054cb66a655a391701e4c2455979741e41a871cc89159c32dccca4dae9d43e2fc108b1ed802298d53019e3a5eaad20473e3ff949d6e7fd8d55c1a34285878b12b265089d5108dc27e6f9428d2429327e55cde0e7fc6b86afb93563a56e9703b7a00cc26420358c74ea2ce6e64d16322a4cf72e9045cbbf01d0d2ededea2b2e8453a4e72934d13023055bd896ae9ba8b2ec67ec2bf72c30e9623d4800426b93e292d680d4d603509eff2e1e878fe11d80fdc522a05bb962d036217cc8be80ba3a264a934c4ef3754ca04cc29f380f19fb47b8d6d7b997dc1f1524922ba5922bf2d8a72b7be4ca2695af5ecbc8f04e228b91e912b759f1263cc7ee911341c86f746e954d48e0b0ece1f60b42e900c6c298a500dd2a82edc99114288167d84b0d26b0be039b89cc4e983bfc2eeab09e808a49a440187db34c84c47a6a0fb3438d7268c7545c2847d42247d897b248ffe4ca467d4167936c377f9e8b55f21ad778bf5c5b4973054806e8e248862b101077be6434eb00094013e96b0449fa542f54745520e8c968f86d50d3f4013c50fac0cf6a7143cb2a56662af38c4f0eab74acfb1bbe3b44997f90c3e48313cd4fe4486522db53b03dd7bbaafecc6e1665ce05bb76de4acddf04f7aadb9ec1c756f795e9521b229889ea97d0546caefbcb64e91c2e281b4d84af2b6b81ec1510ad5a31c1c3d9b86957b88406bc1317a3255fdf860a43b9aacea9b3709e1616919c36a4573dbc1e0def6909b40069b2f7bbe67061d4d829ce061a171ffac3cc326bb37412886c5b6a9924af40e61886dfd4222215528e749f732ae0e25c9c40dc61f82b596b92776a9d11fc1337c59b44ba3b800a4d0ea3075fff95208e487975c72e5096afd67bf442597a95ba1afa0cb3580fa98cffbeed10c4be4056707fe6e57c6c301cdf6eefd224b12e39bfaa2108a15958d90acb38cf9fe4ac7dbc5b18030b068f7a565845939928477a5cb369013fe580fad7d4d2e4b88ecbcbd314f26903a61b91e241ddcee1674647981ecee55a3b8ab80de0a297384405075eb25b5f8bd53c292c329fca23f695661bf237fe19e4dcdb54f89030478ec2fb043e3d2ccb195a09db3273d1885e9a9f8e378b92a567e02b562384f60cf56a6d6ebf7f19ecfdddfa984a41293826bfbc99f6b4ea264cfd70b8696632b0006526443d096e16062dc40b81f11b5ad66b83e336994ec31c9a7125d21e2d5a381cee2dc1c37370beb22fdbdf6bef17f605be15ff2205a45e21f74367952c3323f58cd151956f23acd403b16c97ed960ff733d6593759f29af9caba2fb17a634b59cad9f867ac5658fc0734315e5d00a8a8abcf4dc090d5588ab233325b5e1138b16eedbb2170324b90040d35a6867c4a80eda8e2a5f374213c7756797c1f66706341b4a4ab04df0cfac2e38059b1337ce7c30821cecaf87c77e0ca0bfa06897dd90bd7baedb08423a0095f1b5d264cc645f39710245d88f2a3b638f1bf5ba2e77994fd05cfbb4a19eca1290d9c2df0b00246feba8df34d0a28c14731b166db34ada3cf8e3a6f58754451e85efc0e47c38684e524f2d66f4c6ec9a0d5ba6e5aeedc02f55c1412d7bf12e24417671078863a75f3583c4c1540de96eae4c1bd479c6d77167747edee80bd1de73fc47cac8284e0d15d519e676fdeefce67ad99cbc7cacbdae8b948c63eadc776defb9a0a3dcd8f273b1b148e60d79ef465684b0ef65ac6ebb6546b86844aab9cfdf3b2bb417e489cfa81f5b29b326903e6d91a37b1852feee9fe9d57d7fc90ffa2960ce616fdd4d8a36a8bfaa95519a4f3e8506e81b3d08e8aa12761c12b3d47d8cbf0b442b4fb843ec01c8f11aa767e927d34ddec4c6f71a02451cbc93f7b1da47aa54d4f098448d16af1995b97473ace800da97cb8d53f336f63be78a01229108b74d8c56639cb6650523f1086567facd924fdb960caa14c6aa56154b6ca1223e7a57d2a32e0b6045a86a9b7de69f63671c1ff2aaa153ef1fd5fdde7ea6b80e574806608d542b0b470d700d8074946732e2bd757ff80c02d10d859b9a2bc1d5f1b4cb8e6b727627d7a8b6cfb69be186bf9acaec8c8d1cc058b59fe5047868e98c5539e4d4057736760eb14a96c8f1427bb8aac066bd10d83562af33642917e9858db3ec4d8998c7a0a3f21697886e1ae5a0ef898524828ae599361f3f9a59368be2dc0d3e7b655bf60cfbac4f5692808c080bb06e3fec88e7ddc700dd68a750fdd914d02d577753d4be208414b01903ed3281cd988ba932ca84c470e4007cd959f4e0dda0aa195fcb1c23368e216c2577d4d4498a846318fc32c0f7e9fe64303eaae27e2eeff5c057cb562c12270655ba4395acbaa684bbfb7c4efe35aed7e60a8f7c3a2e958735f9204bdd574d62253323287faf8e989c56a5c10c7dbe527b4c0720ba364738112ddf76d2b3e11a1460e81f3aef99092a8c63c9ab18995e5081a67256cc5192f2743d59a4be9ea893c206ec56e15270f70b2acb42accc761639e1e3986761225a5aee86bbede26833d504026c3b474a72615f386b90c4143cd34de7077dd260a940576090b8490365286413d343e4103d1d95a39e6b1cc324ec4f1f1c9641d87fd30c89cba42ef4b82aab733491b54ca79e529f5392330d6ef369de50372be43e716264b54820a69d6a4eb2f8ab475a52621a8e13bcb35d8b7722b74ae6ed2e75aa1d73e60abaa39545c255a806f6e3ce1751e26730fa3e0af60e3c551c2211a5eb8259e6625976206bbaddbb2b50636b1c9d5eb69584195dde90c0174d57385fc435693ee57998df4a7cadba8ef043c9f051359a60fd8a04bf3ef4fa00f90cf3b2bb34481ab78622509c582eb8331f5b2112198b19a30a80167d5d85bd840a1245684daa688fb88a1cae6f702db550af2d547cf12631156052e04c430984aa3bdad117ce656eca870d07563755d3822673acc2752d04352612ec53aa4b7777c1018a153c87e11699b05baedcd73a1e61a26fac7f84b8d431d515f62419d8fd525807e87d46632742850fdbe918459fd128217d78c3bb9d23f7e1c658eb35a5502cbee3f92771970229885fd49f7291157376c8197088da6d19d426b135f9fa5b1e33aa38b198d068ec79bd37e36d7c7f22c41eba019d268da951a9b590a286c3aaeaadc46b555de76c48768b6a82bc9ea48de3d2fd84fbf6350ec1ee71dbb53a31685124bb13a9fe17791e37cb5efbf47758aa0ccacce5473b5001c45fe2102f602156c237704f2d8c8016d55c5e950129a8e3c00fd15ce12ac9dbcfc1722203b59a013556d7b7e629f1e2dcb40e225529e32385234eed6481d0c2693cf855578056f2f69fd66ec87e4314c658fa3e60f6bbebc4bb71f141ef09683928d144bb7edcae7e88e8fe34f7f82f1ac18f13a51e87af271ef702f9b0d81fb82bb95a7fff9f8635987bc0cc3585945264497c921fdae004f44abd0c85d15b5eac0d114591143cc4452b60fea58fe705d7b5b3c8692a10e6a1f969eabc69cda52049038cb1df14a31564593cd65b899d926073b898f9c454ce6fb424f315c9142ef99bb60054b04a9fb30407268d1e820ab616d31dce7cc7c03a063b9879e0343e9b6461db1992333a941bfe34a8f86bc74327b8662cacc82dc4daaf3aeaa57dc5aad810c0a23ce58c83eb828f13b9b35e7410c90078d6de7dbccbe0490c8b696aa471334f6302e9fc0f0d247471c4e116e58c958b477d63266e449f4144048f8414ca59d5e0a6b90fa1fb64a337cc8da703d5ae552d130ebe75cf0cb2159348a8784de502bf7acb3dc930c389ca1311755b9663fc7e3a29ac5fd5d92a15da3d4e5b7675443401991cf137b1a6cd4b0518494956ffdf555c8688f38517b92bc5fc1ace7b1902ddbb13c69abf78a5d6d0f6796917cda4f71fc38da280e9741a8b2842c0770f9051a9b895b45d7de8491d96587ff6e48391dbf9da5d6d3ddb18e5597ff6f986512fdd820b2f1c350914437e62e8a4e2efa8198ffbaeaa7352c97d160edc631be9aadef673556c1c8cbadb25254d82373dbc60fc6df0b9387f8ebad49beb444ebe65268c8ae1ddc2e7cf5d112c191f5012414ac5adde19dbb5eb171b939e3d7d43e13cca9e3ed196aea431d8c3d5eccbf1d92f8237b15d0b9a612a61827f8f561e918a2749e6f82645dc01d2990e7b1950d697a8a834f31691835d3cd509ea37a318a7290a54b1e051f94595181d3ab6b3ec0baf5bb36cab3fc4380427c7beb075c91c565c028f53377e6596ddacac329f6c041cded73a280996335de7337d4f0b354215bb9ae10d7acdea6e3617600b87e91967bdfaec1b638be7b09fc7b661d7efc11da578676da07a6c71ddf7c6afe1e5a42655a8e303f217bd92be1efaa7605b01a4a61582f22d06344811b8709e41d44cbf525bbf6019cc3d8ace83aa7e48f99c613a0cb44994f40a679df3de652c576bb920ade1be6f1befef5da04664d66de9c9ddc88bc26cb63736cf14608315c1899a3cf9fa8d56793d66c7ef7ed9bd0a92451dc379fb08ef436c21a4b77672b54ee923da5a4b5476be57a9eb946b4161fe7956a7ff621de1c74e222f43cde7a5041c61c991770d96db58700f27982806a6cd24c08c8600402b736d1e85e7c91341aa7342209ed65c2cdfc6d4b8ceb55b23b714b7b1d5548d08625efd0e52bb729019d4ce983143391b53fad6b89d9df1eddd82f80fde8f1ab6a174353dad235577f102e958ccd8b03f6ba88fc773364d7d971c0be710149bdea74961a445953e51b68a0cf2d00b44017d4c6a35fe12d05b7a3c6de8088962e8ea5b0cc2ba759fb5e0d6b3f6d95f76fa0f42e0a48ca82ce00d5088733652126de10591297a68fc3cf68578c54749cb819848ad93ad8aa5d3b714f62918032cc631e5994913d3d62f6df2b5fea86eb440beba0b83ef2efd8f0de6317a2c11048a43777f92054aa035bdbb15f38b12b3bfe91384d5a009768a8840c4d6e1105c329c47cea4dd41fcc87c5af3545dea6c578de1c4398ebeb34e9cb12acfe5657657b2b310e1fa3e4e50103ee8819f6a208033a1340009933653e1b3cde597a4f5521d65b0e9eaa417751ff3601bddf682f260de4ec99f3b7222cdc5388876335bca32bc591d2d17eaa001f4e48388340606abf58f16be1be943d76205591fb51c18a943640c401e2a595cd000492c871c355b837f47e4c92e2f85168ea7e28ea8d5d7875c37b20b691987012ddd4984582716049a0db1a7935e5d5f6f256d44a47a43f4bc1ff174295916f4d7d05da02c24620559a8935bcb58d6b911321e6b718e85080e259cfceda093479892d76f1ae5a5e258d9083a389777900f5e8467a28af15dccf902fa28888265eac54535a6b38837f1ff9ee75da2b690c41b3dcdb9e84f52730ac1e06c694adc38c835b852465f82cf8cb5d7ccf32a17d9f889021a2ec5828acb68641bcb73172d1c275b9ff6a24f4c10eb7fe91138b1bb6714a965e71a6a8ecb54e9c93781a312417894024d06e9e22cae64447568dad2f75f280f79a486f98b15e5f735fd1c92d8c8060bc1f40f4c208d1961a8411fdb19c702898efa44557b29ed283f5bc0293284062efdd01bc4ad0603b32247ed1e5efacd667f923f2d1c1f63cecc144a3fef3b28ee49418bf61287b7db6be3cf273758ed28c3f2d3dafe54ee7d54cd17618f6be2bc4cbefc5b01a0aa2cfdbb3280237ff63304a2bef99278e19671ccc4186384d83b60bed96dfadf5f3a4024b3a3a3be5d27ba083d0368d9e1bcabb9bcdf3c145dce3db7af995e924b85ebb6cf2c58b2a6894cb9fa82f22663525b1a8e2059a907f73c3feb77ad78039248e7e16482fb46aa453e53f2bebceaea0845a4764ca14b48d4be198377eefbd1f04e96f6e2d6d23d2bebf5dd3f2bfd065be18c6b959bbc259fc8c6474e75a8e76a415c5dc8f3bda479694c9cf3e1fe199e64c25ac506bf3005d65e3d818aaf252f66ae03d5d08d62a62cc4cc6d7d82a67855d2de4b60e8daaf7d5dd0c1bc532db835187379dbb60a4abcfae61c6d0f3f522b3a60a938bd97e504519b8f8959638d2308472593cc0ddf804b74712f1846b45b658c5f0ca1fa5f21b6083b50165926c709d9798733efcd1d52e20c32124f277ce0bbed4b3a74765c17a155cf0e910d77a9b4e6348222abea9dd96e24a1cb23e63869d472eb88a2f9d2f17f44c68db9db5453ec1a3b38e48e98a4f7553b5d225dd920951239b99da19473186fc2b1a45886510ba6c3a51f6fbfef38724347ab1a4f7aafb7a999aee9b890a19e87af6585dc16c568bff9a5148012b1da5e4d46c207d294c1bf8b6f18dbe4bb5f89d975d9b23f89ee84a92e0385b9f41be0c05ddb9eb2e4dee00146d56ae9b6214db24dca9515f996b63602b34d3f6fa57f3388cd80b6004dcfbdde95e21a329247dc65ef113474ffd912ebaa232d85158e29302e3a3687bcb2f38ee0ddf0b1110cba46ada3359c9841e2116eb40ef4ca9213ec6447cedbaa4e54e03cbaf7a23c00de788cc773c0ee95063c678c5e0f632f86260615e98c7506546b0005b98661c8bb6402fa9982615701c52b0895654dcaf2759a41111acb6f7497d14a90ee20d8d3a1b6c8f171aefc57343fa53f7708d8db438745cff71bde37ff36f62849f795a9aa0e9f25ff15e99911fc0ed6b512edb328538080b1c4f700f99794ea1a64a3bff580f9918b34c329e71691d5bffa8e2c8c95adddcb753e822f79b340efe667891c9464eeb69a0d9c1be5dac6f83e1e79f8a41a31b49b091df963bdd73afb759777df7d77f1a42d6229003624ee4c335de5355226fdb50b46ffdc31276c22325dafc88fd7ece1971ea6ec506a12a3513aea9fe2281741a98f9b49999c23e9426e1cc63888d8d0ff241e10a620f5d1ec83716a46af81cf687a644273afd2bf1a2b577ee4056600ba04e703b3c4186689da021afc37ddbccc79e34d3bfd09122e27d8593ed814ef6c53aa3be5ddeadfada125387f5b8ba84a1080c07eee2790e2e627cb956b660b6a72c02fc8d8fd8bcc7b43294c850c0075d0c552a91dcea9fce8ce6c7449c9d348e4d165d93fc1196abaf483f04eef63b43d496a46e65edbc09224a277fdb0d58c4c5664a39cc5f70d02a1dee703962099b8557dc4e26894d284d3140cf1cb80b90bb7a2945a8cb327c4e370ad5da0e59ac4a213cf8c6c63b7334227afc07a7333957db6380375bc4f84320fcfb780214bf497a2b36eeac6c3200a53dcd43e1b908c31061b222190e8c30602baabc45201caaed11ce4644c9add842f10b796e864524a18aa3100df97f3d7dfeaa4dde670b96ff578975953a2ce582fe7e50578138a517451aaa3e6b1b9401dfc2d5d8d0d4353a632f24a7a8f64eeccdee71a391286bf9fce198b44da65a7435bcf93842beae259e88fa83f9543c09c423835aa05fa1cf16be81778869ba5c675e6308a7122a48705ba030178ed75f4ce42f8595236d22fb7a0d9002acda43df71bb50e619d02c4272bdb6e8ec4678cefb1d2a57bdf77812dde506a5b7e2b004bca816e718c9587a93fa1e56b5b2dcb02ef454d075685cc5aeb1e158d1fb2c3e09d364925a3c548287ff6f483342115c465c08e792e8537bb7182902434d3ef51ee441cf2652a9c01673b1a5ac1fa1380bff50845e9ee79dbec3e78d56ff6e91c482b686c332de9e07ffed57697014ae4482338f1fb39f918c5a23e04f39447ac355c99f7a067b82244a2a45b25ef024bb90baf11e4f03c0e984e3e379254919e306840293f309d633fd7057cf11bf0436cfeb90a3989c929ce9317e1be804d4ec3def9756230f01fdbfc77507b008b57ee7d055f5b9f1706f3214997cadfd14a5a111470abe156b4a393887a364549f5b8171285ed88bc02807951ce59abd42d7dbf2f8f9eba37ce212ca75eb542a2a9445d4f2241ef0eb900fbaef9ed7cbc44a939a9369d3429c8cf3862727a912bef3da039990b2aa5a6ff38dfbef8daf04c6701201a39e7933128472869f8a94c33ee90607eabc41748d5b162620e4f268131a6128ef73d1a93a6c99789b2039a13e19e3227a663ba0b1ed5c5978031b5af83a8ff2947ad166cd5400e6629288c0bb13a4d487d62248a554677d4013b2413f78a546dcdd01d292e3b1b93d090a897d7e51045b347dd32f363f78c13b4085ae7baa0b0dc1e95653c2b3d774ad45624b03f09a3ca9d5a9183ced3440a44c8d0eeca62b70501258d6980e2a4fa5c3b4ee4a8b7d735db132270d789708755ec32672a18d4db20342e40eca99151a0ce82ffa2997487799d52652e88b60d7fe8ec0b6a419ec0f447a45ccf00b1033a664d4bbd3cf021f15fddbb245f78ff2b556a25fb6b7948e5e6ac179886a86191b92a537900deb7fae0f10d698c2deed0a849516e04f8f57d87820bd989dc0f3f3d96c13683949bceb748b65e9d695f1867e618329c923933a0e29422a8c06eab4a0effa633c6501559415083e1afc25afadce4d990d996a0d93a5ad451fa026e851f7928afc877472d77567a1765ab21079a41d38043903d76f5da9f23ed5ce16534c83e462f73dcda6752919d2f9bf2e4baa9a0f944a87230916dc38d1ee0bc70eb6767956fc85eb67dbf6ae161f759389a96d25a6161d76cb9bee1fc0330482eafd1352c1df7456847078692b15fcc69d6a3d8223e3ee5a1cb388aff3ece2cf4fe8017689e9319563fc5451f7237b4fedb2b32ff1fa2256642552f15261cc36a541e9ed985fe5306e47356f63901ab7e34c7733faa3e0f30cbaf3ecc6daeb4054ce72c0d48cb7af0b18c1c957a60384e5ff3096242550b77a3a14a8359e6674c45845f627b7d09ba438a06abcab5b415d92866159ca9b2c176d5c2e89f6665b5da609977827577ca0707b5778e84d73b2ce239b80d8e9da4b1a7485a82a137b888267acae2575d86786fa9975a5fea44c7bac4c819861487f0b03b57c82945fabb2073cb3f952396142c439992a995b9361cc7c44522cfe1906b2c7eb45128c30ff904f6eeb1526f66e823fcebe4421ef472934b04e718483d429c2dfbdb48c7d31abedc743e7288ed0dbb1fbaa277dc8f66b7bafd35963233d0fae3f30a3e5fc10ff1fa648efc69132789908376cf786373b5a292a0c2263080c94f3e70622136335ecf3435688675a00fedcaa381791d041d8049cb149aaffca7be22a06c82cf4f45d967c43f678101ce9614eb666518924fd296f71605fe8ee6bf641cb61ae89e579783bdf992c1e74617e6a0b6b2f2c8cd180eb73f0ec8c236c16737c7501ebaf487fc851f8ec4baf6e1b4562ae917f235df15ae080b8b30f872a09428a8de2fbd2946ac29b1e5e76182128e1b8e04c8ea86502df992b245ac31b4b442ab9367120a06b5a0b2c207068765bb010855978bac22d99c2ada9ad29cf81abdcefaeb839891140cf7c5946650326f83ee66e879cf2213583a608b0bf2ff39e299713792539a59d6f78d09f18b0d1e1cb6d556355db26dc647e0a0a8f23e94697172d5bed966e9874864f248766a3923e81d5b5ed6786b6ee9d7763a194aacab0d8c407988ab65a65109c7dbc0be5341f89b5256d7d87eaa86c1765fb687f53fc42a0242efcc30bca7d8051bf88e0eef7efbe5adc0473a11b51b2b6a789b00902be885bb8d3dfd12c35c34896c6d9e94d1ab8fd42e69002cdb50ffeaddd85134ab246543cf950d711a02d0b4bac1b4ca9726bb5a80a27364801f7e6134e459a5c87a0b6c5555e4304268642e621ed40935f9e2b15587f64149b3215e3c33ac5c1a65f2a58cf533e8a2f95956d0f96ed94491b0791b8e2b5b7ed88352523aabd00754b57ff4f75ef2d2323aaea5d5f7a3398a8f024129651bb5dc1ebdf58dea9a15e2be6c1bd0e7f746af82c64f39010f9b40e8ed74ee45fa855a4e11b491eb22cc8c87ea7016415e76cdcc1e4b971d66d06148ab1541407043cfabfe0deb2002a1bebc8b704bfda0f919711719749f517f4848cba0c6e73597a8b2c37ffe1ba23be5a6bfbac69f67342f0c5137562947fe7253bfb5f3ac82e771fd12694f4099d1bde107be2a9909ce5b185d23b02dc2e48be407b33bf310c9a7e56b885331422993e5f3e8fc6d010e4a0f8b7d172f5ab7d1842437246d47a4d6f62f2bae60439a044ff4c9909df59a586c7c91ffa067ef0fbea590217d900f8bc9dde1c55006b98b699adeabae5ff922a9a110de13730072ee0c7cd7a6926012bb18391c8313ee95dd46a68210988115617958471b2482c7bcb95b9b7ac75d18543e90286be3cfc015989fd85747e8cd0e95f6af09c4ec6a854c9b015c974d091fe1958d8d0ed376acf1590304e686a61b677a9a720ca3d7e226d99dde8ac6619871a79068fd8035fdf130868becf13d127e327de6345f8c5de885b5833a3fce389f44f582285c9a9318d4f76ec3aefe8e3adcedd904761452f23e0cbd0e3f8b9aab0c115b27cef106c8a4ca20131666e93dd84ebcd56dfc5be450f81e7f4c4619255b6876646df5c3913e733253ce02ade79335142fcda0f32f6d0c1a15cc6a3eaeb18f4676aff553f2f08737fe4c5e56d8bc25819c0bae9343e0bd225a568495a7bcea5dc70b9c327e697a838b07d67e71a1945772ae81c6c26a8fd9c561119890bc0e2eee1746d98407c1b77297078f52f206386c3ca7081b5908a2ef828dd20a6d6f3c543971c3b469f1465d506e03fd1bff96e12c9ac1cf4a9c10212175bc651f81f88218c98b8ffe9da2a3ea8666c08de4e57a04e9ae4e9dce9412c455c24160eaf6000baa9b67440b7edecbcd424dc65ab68f3bf00829e124c12cf1aa7e2fc00eb746a8917ddab8ef1d666acf011563c58c99585a79d1b31309e81fe06a70bb61bede661a9d6aeb9d10f34de83d97d4b9da30e0957de6622de0dcd593f1b4c1887f2fdaa284985aa9fbddebc54245a7bc21ee4b2d7ec89ce9e8638931be7c60f77ac35cc5ddd364aa30becac2d9bf3b20e61a1e7f1718c1cb8314c1462b382813242192f0d3bcb80251fe718d4e552d9ca95cc126b1275f373379045dc26865801dd2e3c030b4b336c21576712ab7fd93fe1ee9a0e794e3d18c08c8c50e9dc7a2ca5fe5906f4bf4dc13ac201af958098b26e8ee7a24e1fe1eff3c95288a48cd1fbc110efdd9e2eb56c91b24e734a5f006e633461ef38eec740f9ce004afe9c43b55aec6751b2a053b550aeb6267324f8bae96970bce0c5d753fa23fc5f9f16baa4971b272a MD = b2adaecdced52a7bdd889c2cd0e8162ccb2212d6ecbbcf209fcfe7785ade1f07ff904cf4711db0135b7e47cad876dac5 Len = 94480 Msg = afb60944a830ad6565df306fc86ca403850d7c91d761e564729b5adfb8e272062ff8fd40331a505ae828ddd0730607486a42346088f723a9a6f180f3e611b5cc32f30443e5cfd2f2c79d463b3f7d13d1c455927a95bc1414aa1776d6ea01f6d99ef144d72616dd32ea869438949871a57d8ebf69647861ac665565102a7adc365d38e8835eb916243a2bee4fda20c9cc7b35e3b55ff2b17ac2f2752710440fea551016d0f57e27cf9dd37d0979dec24fa89225e4edf4ad84a738cda5032638fd70c3f644532eb83bfcc869edd9970535eaedae807544fdd4fb6d96126aeaff789498b269e09170714050d98463163a862b8da61161ab4872a8daf7f4af560b62abd66fc7056ef8784fb4f5547d22084b52bb341d18f1366494c719d5393305c39cc658e4288ef758133ce7e79082178b47bf802e02de70b4a97b233c704894a34fb0924ab3ba161a732fd4c505ff104ef2e1b3cb873a9e6acd403eb2bc5f610bacdc48810cb8fdc556d7e77442619b9c3b69f57d0fcc688cea5c92be853e13029b91a00f9d505361a67a457eb1705f7e0a9e6dca025d7424e71846e833ae53910418c27ecc4cc1f74a61196bb9f305fb47c9443dc8b56d39acbc83b82e77c9bfcfb9d7560373ee8d2ad489c1c1b4341cda32a15bc99cf9d4219070b7df611c94e4bc071da98c832e2e1abd0a337995e8ab21adae6edac0fc2edc366cac34f5182b69795d256027df3e7ddecd760bd067a2de90bd1d366bb9bbe7fc5ffeb7fb548d08569de1b783aa42431493f2328ca1a8b071103f7aa213b0faeb193eb3d74ff0e0c56644583e9622b586e30fb5719fa3e178303d6c0c13f55d2b21d2f130113e3aef3fb60d01abc61b5d45355e28687db7cfa47dd552c07258e3ff2436afa35d5efcb09f9c74f216bdc041ccf359041c7b9bf4697c1c2310333b3c9a4dfc0c3794134168ce3e72fbe2d8603c3dac7c6a7407a9682b1142b5355c5f9efdbe54b2245c7b776b08345bd4cd29ed04c7d74dec384ae1a8d9274aa76ef0970d9d84b85500e5353b793e20d9c6254810551daf29595f3ebc1ddab8d19878ed4643a3307127080a053a9a303aebdab328fc5677749070e62f8561e5fb037e077055b901bef86a5f93f250753f65d29716648b8d15050641c9b8c6bb6dd78a4f537ecf15859c959aab4a66d52f5c955da036c4d954e2a8b7525f11216e3b242cb664eb530d3b112516eae63a54f7a96b8f1a0742794cdfb0912148fe4857d50662af18a3a0fb64669c79d78bf45f982baab75eb3cb6d32944fa7753c4154244620085bed840718c704a042b058bcea03bbb6d011936d29cb54989fc2a25a9a52b617be190285b5ae18062e90c835255d88be65451a744cbd689dcf78b390bd93ec834810629ec1859e54a3158bf2d3a0db782637a5a924d3535e0c46bb1f18718cf401b8ec79c6b35f31aa26eb1c7b347a8c1acf7f343873dc825e14042f30555c14f2fae83f4ba0234649ab2edba6812da14af6ef3e1006cdb2cdcad4e78fa5268822bf9d17d9b4b23a8a8d9d56dbefbe5fbc923cef35f5ec956250746fbccbb0fb99ed542af757d3b675b280b6a2e6f3707a8caf6e2ea702d4248e2cf03f2dc313606d559f2df1506211031f2283ce96798ccd90e48383d6161c6d4392a13526787e28e89f03eaefe56668c1c3070f6d25f83c2778bdf3320450d3037c6949a3d3fb05555202aa79e87ccab0c1b5114119c8c0bb53635ddc45caa9b2d71fd300cce0ebe3dfb199b5125c0f3243163cd9000443959cfd2b9d8292d899ca4b3a060a34c4db6f98206d0c0d219071b0f9ff80b2acfe7c14c43d63ae47007e76e67d36ff77852940a5677d97e612740eae7941dce33c1b2f90848f28dd2e1a273f2df74aec293630926c0e0348ff74b5c510ec89cf97a0d6f73aaf08846dc7e7adddf61c0b0fbdf04d4467582ea1982fa48c29c25a59339161266a542303ad3d9857db7dbc7fe70940b72f9e7f3e0902b5b59f8e6bc8fee936116916a139f3b168614d75e7c0dc02d18d0edd251fefb95e53f7f5eb2e2665dec35455e857c2cb85c4f40d741bc3636a8dae1e078c71d9092dd9ffc0d1d68ec204d21adfa541145748794c4bd8c4b57281b4680dccb7ec1d0cebb5d3fa34ea489c8b6c6e6b991347b4843b543f097f512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923efce1974dda201cedeb9b7fd9be061e282a5e519d11aa1daf1d55d1d063b7d02c4ff7b6f84e595fb97ccc30bdaebec3a8a5b59ff5ad56a8ac3be88ee9c605a85ea7b3c90f9fced1fac0c8731114cb51b385f202e46aa2a94c557df7b3ea028760a4a421f656f6f02c481ecb6698c224d34bb20efbc1e49c19eaa4a0b1582509bcb757764efc7856b8834d8e409329d9725774389e4bb2fd9f7bfb2e8498e38bcd602c2a7c08b96239f2c340119c68dc3b4997046e70845a4779cfd58014c49a3d2fc0a2fff4309f3b371e956c3d15a97882b8f6ced8df1e9c74b15a46545eb1768683945d57848a1690cde2b2dda6bdc4a3487441dd39c728ed4e0149e0087df405036316ab0baf56b04fac87f692a59a1bd4216a061af05753d48efd40583c401bbe93be576c7b961612774e206fed836cda72a9ebf906b2490347f2edd498e54b23aab6f4fd7b3f22c4c787e3a4f1fb06c9ec73e76a96c42d58b0ad50f3f05e03c11c82fc552acc76c501c7a8c86f8b8a20f36a80d61cf771237d9f123cff04e6156db4e5fa16d88291da8fe850929f678e2c0050c1f5e6d511f34a9a260194529f12cf3a62abbdc6b9a6434ab417a11f5ffab7dfc4ddfc9992b62251359466e9dca03472056616b3baf98428996b5b2224f3f3764521b36f343ad8efe244071c4caa872578d25dea0448b50a471a08005b8c65ccc96da5a654f5b0ceb28cff5a7d7629bd338d1dda341868786380524a9238613bc81e3ddfa37b5c663cdbaa24cda7bea1abd2b0f4b8ed10eb655aa451379c885bd7b0068b7e303e5ed7bcb21bdbc3988b686fc1da014b40ebc2e578c4da0d4d956ecf7a3a63c8d90129ac81a0263e59d2ff90baeaab977af212dd6a05e82f238103c9135ce289af059927a3421b9c6500b80226b726661186cb8ee2b4e066aca72d396c73790742d4acca91824a526cad48207fcff04bb72253966d2251383b60419ce00ea5d616e6dae1d6e120e4b33116783085979cde4d417073fec9387254e770189ee75aadb4ba19dddf4de7eb24b965e3789afdf9702ba991aab6dbc3ed953f6094bc2979d6b0ef30dd1fc076f09796033968c39b3368ae40a68896b2a2c1676290a2b6fdc555be5a7b1502e93d37751a188fa235ff9efafb82dcfdb10cf29499132977cbf92f23c539dc23b4631f8f82c68e0e4c3d251c4cc012756194bf237e8cbf0046fa939bfb89b3a75afac641e7a3d25c5084918e9eded79226d27db08d6de1d5014229a387fb6a026f7cb248b330fb30e56e6ace7c3f7ad8833eb4b83057106a8d5867b6d4ff3dc9445179e0700e67107d4327585f72aabd09420aa711a8f9353da5c4628d15cd607c2173b5a89cb47f7abb4dc8d318b5b42b74d5f9ac03dac9b4c2c622fadf877c99653634b75c51d2802f447c51824a526c5fad4c69d8539c6537f374a8acfa521e8537fa46cdddbe0027b1ff755fc72c3e5af70bd596e221d16db2d4310ea4956e0a0f52b181a6a68d3d0cde9901ba86240f59b469d004fe8becbace1e8504cb1a8c12fa91e84b0089c7cb764708a314bfd53bd2b1144a86f72d41cebba09947a653e93e5292396078605472f9d50f3c645523e325c4116f95b80e52a2d1e0bf942a08ba9df0004afb8f5e414c075d81b4078872426007fd0a0566f66ea969875656d7ebbe822e3465ad3f5d98102c7911550fec81987cd3a6bde236699792238f630d4e4ed9119159628e44787fea771ed5f0ce8dbe0e680e1a167f4e1d093881e6ef4ec96569064927b18267b716203ef2f194a1413b4ea2c26a4d66aa2d2ae04b1489b8a782e7b7654f93e0463df8f44478eb76d261dbf74f543d5ddf7c7f2d28037b972ffdda16b3bef56cbdd065d132fd1f78d230b49e097aab9e2d75a9bad64290df5f4841f99b9623877e6bfb585704cd21e1165ce9993434a204b73f3bfe48660bc5e0b3d2755baaab187f2dec2916610c5f91397c7717550405afa403088b77a6e4559433d985f7521c78721f11a86782ce2fcec90baa792e90dd7cb28d82223b4b158790509ba616eae66c63a9316d4fbd40a141ff543d9c46bf2dcce5d302336abef27a430313541447815c6857deadad824599aaab0ed797c33ba4a9e49419b3a069445952dbb4192a355bd7823826ff432012a625696af4883afc523d6468c6786090ec117b9179fd0d047f2706665321d55f6a39d9c0ed8c80167753dfbb03955ce273b55f86a73e8cc8a7dcc5d629acb9d27f8edc64033ecf9571be825b0b85c2bb98b5140e317d192b1a09f2e0e332521e4e6aeddea61d5dfbe9d3d8f33ec8368ec3a71582a92756ae2e451a21305132856f748aab76b6dfbc384a600e2deb3cce7cf1f0ae6ecba9b45cf4a8116187efca4b223f24c589a948f578a3f6595d2a0d3d2c21cbf2e8a6f04ebf293c2754ce3f79fa780543046f4499e51156319c92cd7cbc1575f5fcc2c44c0b29fbc23672677473d1b75fb58611ae2624a847381b81c4386836b87681b30d4f06faf2ab50d4b314b8a57c2b8242aa927a671aae18ccac278688eae4584edb215c9419320df9ce53b96a38d4e85a07e07f1d2c6d0f008ceffcd6edd4dafa6df8a761a658fe691ec7307016202cba4e66af24ed0382bfef1837cb31c67e381e4b63ee3a8e96853cd5da5184bbc40606bb8728ecf0086d5b26c3b06717b6aa64a00e8446418ae09105f37914f642af9945a393acb1049b59923d30fe6728a3e99d23ee4a20300dc3ee3871376e2d29ae9b60ff9cc50bcc52f0e0c7582328c715793066c6a92a5f4de505b47c91e8069f335bc73dba8262efb96ade04da4b8660eaa0983c2ade778780e7cd54f007c8e393f0751ff00d117862380fa50b0554645810fd2b43c0c919585b26411710d32443db93b414003a9561e4b68923fad38857fe00147275d66bc1dc49c15577c7d9a959ad8a750050cf5edd7d51b370665550c43b783562220753e7c27659c1296c5b172d13c181f67ebfaece7f482a9f53d90019c71b2a3e64850a0aa092614a64df709cd058098e2beac51462406de0fc573e259182127e1bebbf9d007dfcdd4b8d127750c71baa7f86ad09bb3adecdb761eae96818cf8385ee74f3e69ad844990a6937158d1cbdb209e2f8eaa5d1d82d7f72dfab2dc5c14b03c6a9f377a802c5cde1668f18a14a9bfaf37c61000b72c7167272eb5f79c9d3d231199772d0aa6a5e17803e082dd375c05b0eced7d0300cad763da92c700fa8c020ed433ae6adff21681e92ca36ead7f0862a74abc49276cadaaa54f33cf54264227f972e5e8fecbe7f8c2ddd30e34b12015a02ea5d1c9df53c437f62253d2914c25b03dbacc2cb8bba738fcfc06f478b5907fa120e20ca92f79398e7ed29d5787cfa09b155d9042fb54f18f059f145f2f9cebab15c51b54ab9153202e95dcff5aef7294dee453f00dc895a1d61ebcebf6018c556cc31c682dd32cb31ae4b8122f4bce30fda99c4b5acbcd3757ce16a672870ba60d22386b1f086d4f2a0759176dad5a785af494da4a25415b70f647170bf510a7e02a96e7e8f8bdfc4645e6967bdbc173dd0d6225469d981409dd7ac62a15425ece255f63f06bc5c356e78818c39da9296f3b30b4b4fc7a6b0accd53c35ad4ad5bd59ba689f292dab42356624acbdbba3f6c82310fd0a91665b0b80009686cf14960fd07d5df99cbdf277a9429e019ee85bfa65c08a8f8210e4e2a49ab3687a21428fc82a92a5ba004ef578fa0133fa00871a1e4cc253f86e8e996993f61bf306a821cbf7a6f3307c3ff7fcd53e1979f4616f753d0c1d998a3f77f672c666e1cbaf0d016d01aca639abc45c5abb7cc1cbd0439319d2b70d6be0c574bf8a12ed76419a91130b98c3407ca5c112e1237a8dbedca06b7be7fd195acc0a03ace7be114512a4712d7e309898e2538318d84d431283c3b86f76119d93d1e1c493adfda3a2bb6110cd279549e9c33937c961e1f4b480248a152cf0fe751f208da72c513542def177555c985c558f9cb65a87e0a88b1bec68d7d04344e7fdf0e3502c63ce0cc27b2e2be3e4d8c690a3863512ef67819c43db1c2cb177d0b27950f674da76e8b128beb9841fc5230c7731c0cab83a7d4a506a4d06e3a01a87e25b01cd5f35bef120ae6509f22b544c3f3f6577e328686f3c9dd02780c7acc4548dd9ff9a1476cb8a8699380413409824368be0183a28512efc0e5731f26eb1f66ce6d2321af9878ecfbcdbfe84d1384ea099cefe77a6384f106f5d9e2b4895f182910ed0502d6d561036b88787ee73e404f9093de7ca6ec7605c036e7922ba6c57407a1bbcfbc507d16e9848237f920feb12597e927d3abd743b0f4ae5e46690715cdfbc684bd6cc9bce42e8606dddf6dc4c866981a5e359d5754ad97576e2855a4e055a5c06e9cbf4bd8010469e9cc25f0f57a5bb2bb2c50a737cc433c076729a7db49e9f12462c67a31868defb179afcc395db48f8ef269b9c6db227ab697fb750b42f3859351879e9d3972f6c96a73cd008b231f3e2a71157e44c581d05d63b31ccb732c2feb7b4f5794641da6010a69f78d37d03d26df30eab3aceff909cae87c6db9234e8309f30d21c1d2bbefec396ade5341209a3c9288823913a53fc96b9684562993cacc202a5c2ca49f899191e6e915f07cd6f1c0d44afaab4961c7d317b9daad84352a6d4bcdf501a560832a0857f04c967f97224a7872057a124ea56c68a70d9424bd20cdd1cb8881f749682b8562e421f6a56d77853fb0abb3d669013b5be8484bece14d121097a9d04cb2ed0bee2593cea4d8d81ba43b42d8f784728c69bc150d4235260954bd716e15b0a95612af608a0e1af8865013f4041a8e3ce641078edb4583051218789d332ce80cee40d01c9b599a356fc3d92397b7ecccd372391a488f5146e6cc4771c20aaf645f29463c851fdd2b326fd956367836bede8def4bd7583687d1f0a8939d379d6c031c5024d9a96a4668b4b30052a3e26f61f498980a5899347e161a77172c2870849aac79fbbeb8239d42e4b66ef3766af836b3934408ffd945bd2b90d260e71e5e34b9a08da85d2f2a9afcecfdcf794e1bd4cea236d1d0e2c3464a75516e4fc1ea7ae64ce20eafd5ab1d4a1881905165475f4859355bc2ed6152059916bcc907d3cdd0b3ab4a46c3995a7add9cfe956d0526cf3cd20f3c55ca60cb8094c4e95c84be07994be3b8657fd30d80a262cba1dfcbb1a19f54b3b848e33aa05e2f373c87bbd94246835b27b8f760b624555ac021ce9e4befc4bf817769a18cc54429245757e4631d81c5a6ff6812f2a55ec93495aff38065f7b64dc054beba7cbc45b07e02b76053677e5f9d8592aab7d7ad7b85d04fd374363e89de44d09de6fff34d565ca0ce6abcfbbe2de07e62ae686df18ce001d9ad28cea20baa85cb9677d8678ac65ef1d5fab44f1af9249f2b798153054fb7f77347dd42e3064cb7fdcc6bab95c0309f27993e7f0f4023d4a1938e0ca98fe0b1691be0c8fee8a3d7af560365e1dad41ac210f0fa5545fa97934efa8ac4110a9be10d8fc0b9b229cf0dbd5642f996a7f9581a821da78b274c82f44d69ff83a41b9d9520a6adf32cf2ab5adabf67542abf3bee586550703887f33c0d06b6583bb4d15b4a07364c4be70ac6e72795c3dae0f034fa6dfaa58cce667e9ffd82ff3ffc3ec8725efcfdf510ae8a22381f4646e31766ce93f09bb2844f44acbaeff92f663855101a7cb8c703f90d025d6e5bed4a13fc7b83fcb3384e301689db47c698674099d9b60fed20358cd81e040d853c8a687e579a598c8c809b7cddbb34f7f98409ff05de510b9f29dc63cbc87752c33897650963a1a83ddff3e00ef741fdc150d70d4aefdaa492556a48921726350fb93338f75c6f66ba90dbd893fbc9589e324a4d0f66f748b84cb8ef077cb4bc70a09e72a8011d789157a5cf13556598deccd626d9e041586f844adfa2658d49a4636b9a91de263e3099045be370912f0164fd2310c8436426708282e96e2a7d09961d295b60242846e959d7baf9c68bb4bf41da6a9b77ec8bb6028152f306b71ead15976b23a1d712ad28fad04d805f572026b54dd64961fda94d5355a0cc98620cf77d279509cb3278f40de9e858ea673c2e3c21155254faeec56197d3c691625a35433730c66534b14db95e56baed6367cae78ab50d4611dafd4460289f229e09517200838245980a8865b41510b8ea278f3fe151e4b5c112776464fbb0dc739ede922a09a7dcbad9469b71a004dd5a1fddbddb5873148719a659fce9a61f918f2f1c0a3fc1ab3ba21ae31d8411db41b548e9cf5522e2e2551c8dce5ed97c665ed58827924a2188e947a51e3da2332f6c633c33c49ec151494c882fe7e5637082645f08adabe031338f8a0a39306571b99f3daf132100528ab8d1b80134753eae5e1933ee8167b30544da581366e2b7215f56a7ed6450648dd3e2fd3751122f17253f2fe155188cd2fa4e8e38905b7e38462fa4afd31215c7304445f6c5dac0614c49530281832d31223f232567002572c6113bd6e7c5d4db506e48bc0d3fa12155c053eea12822845f24ad7635a14b4571b3c3ff3cfc301eb6d96c1381a13fbbb42c98e23e87fb5103a78387869f6e44bb7fd3852d259615d60e3699ddbffab4f9f698a9a413262bb2305bf5f45afcd505ede10542c2955530851e9b7bdc708189a6e9819c6a1188dd478d3df974759b038682fc1853bc6148c6aaa4e6972fc605c5f22661fd6bdcf7659dbbf07c76fb16c22fe6187959ae915b6142a86086e6d0dc48f4af3d93aca303141c83c36f69d2395e3fcd841bb1acbbc9012bd924589d326478deab078c32b876cc2df9cd8ba8447475920470fefd50484d0b6166bfad90bb2f7ad655e058ee3c4759702fc51b8c2934108ad80af5c16592a189fc70845fe3850e400d3d782cdb1a80d6f4aa9e68e2d7c377df5a4877b78e98c3241fd4084415f3787c1802fce9b25e9ebaa0c37317fd257bf55147fba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f2 MD = 4a4765fe4c9b6e121007c34b373bc4fdc7720cf3a4631feba046dd2d69962da52750ecb74afc8a5833182536da727bf2 Len = 95272 Msg = 822bc911fe579dca7450e1b3d9084cfaafc2a59720d57a2f4dac1539e412ac5ff0acd827f6c748d23d55b7856d311ba65cab20892440d44c79a9a4ff3918870845be79c690902b75754bf9524eb51cff422621285e489967e71b1365ef3c474327669438f439ad7bc53a8f63a31cb6cc0a3e90bef7743249420a4ab32e0654d63fae11c34b4a35abd42b600095ec50d75bf85591164c05ba307f30311dff1789349dd8b0bd4c2dce4b2556704caf54e6de5e58e9e4597b825980af27e5aef626ae3bd24771c6fcacd13158fdefec29c23a7782108922fd686718aedcad9b5a735791e5cf90400a0d0f564feda62c3733184bb94d2c30f135ff4c16999e4fac3ad4a6fa924142bfb9ac9c21899bf6e60120e3e6e7f509c0b1cb26cda6e0515241d083fad6ad558377510bb719f3d29ef3f946f2270d37d3a473adbc4b9a29b651f12ecbe4fb00be11a6acf9e5d948c7d24c7cc3559c4291d69fe9cbd0f5603e31dfb1570454ccd84d5286cf3473e1c966c08e43b9c9b0610ff6e3e37c187d54ab4314847de04039f4fea12250e9240c77fe83589abd0bad1620a2ea982b085f85c55d3c99c6e449ce5106d87f649af9cdad63ec42a0dadcb4c62eca6c588ac7880c96669e2f4071a2f4bcdb0a0cc9f62f7637e6f799a656b190906940c58af37cc1c6ead542dd173a8ecb1139083b6c6701062e02d0f682d525cfb15c9a904d298bf6b0862842a55cc83c64538178c43bf5d8acab6e52cae72ef3880700243c56132d9ff908f781d14a16bba29e066474fbb548399b4295b15205d88b1fcf28cd0173a1750b851560bb61fd6c886fb6dabaa6eaf67e4f4cf93a0c882e1e187954fcd09d445973c7d3c42614fa663b2034dbb27a28400055888d108039258898b4ac4d7cac194901f10c6ce79461f00c4c05e2e01808de1926f41aa8f45ea5ebb5baf124f674902a813c3b5e81a118e1e8e13d040eff70009a1730e8a6effadb1ecec57e6991cfa94cfb9b610b4d3a07d116cbce514d3e73ae9d5d2898000cd1b98fcf724f998ee81af295d8788ddfe6cf4d94272b19d0d8282fa65013ba65334ca619e9eeb3554eb2c830ab118b8ee6a92ea1f5e28baf98d17415485d448c6aa0baabc99008ad43de2675c31e6ccf6f2960f922bfcd621c7115b1f8bec709df7d748bfc7bbf1d2f64b46a06e75b2ae9158ca4940a0471cbd0b98248806b65f9aa7cc368f7012e7b0d19195db37e28bc3659ab350b5b650cb5099121ea57271ff1795bf74ef6668da1fe8ab0ccfd5050547015eb0af8c449eaace56943b4d7bb18145990c6c550cee80ac4e878012b0d3778eaa04e0319e9354b860ad4a9fd34e8f4c71aa99771a6aae6cfeb00b23f5ca61a323b20a5e9545f8e7deae55f22f229c1ac7f3d93537eae39b3a3ac3717a36afef6a4c805bef1301cd1f3bdfecd5da32511a6cbe27dbcbdac78f7c3b9384b4bcb3ec38e4d1f2a6f9e8a0ba6ad87dd1dc6fd779aab77ca9fe727ce8f5f2cbd112a1080b9a29566e6bbb11ce694d7da614c78daf417ca0e1c91c81256527a6084c276c3932ea70e5b1c4d0dc6dc45bc35608bb71f4efdf2fb5261aa61b9aa9b6c3c77746219dd88976966c68ead59eb62aa3cf6647798dc06d4fc7ef8bd44d8903f1b7b6f8bbf3d6249052f862e9ccfb0d1957f0bba233603bca0766286d17eb9746bc002abd69583643030f68895d0e67e9e3a5c402767bbb5567ae93bd9f5af826e2b63a1a9f9c463f2b125e2cd57ce585e109f312cd7f6652572d304e2a43a132da5d996c0cfebee509a5c65caca2e08dde71bb5b8ee7c741546690a76f522ccae14adb2a480c1ac54d3e3391693cf3523a919f25514148b2edef3751c4f2e57fb62281cdc750e460544028539187988393ce1138ab188527922b96d5d1a285c1c758ffdf0159a636bd60171b9c3f3a8268abb3edf2d9e70fdfb0219bfbfd68217372d7c69c72cac8f6f272720fb073ff279ef9cddf01f8ec24f18a1cca40072f68e49c2cef58ec978f8bdccf5277bf2a6f3c4540b62d253d108412e0c3270d4c1642af6a70686612e5a0b8bc1b1186b48df838ef2ec8168310cc6e806d1ed4f7ea019417d62dd1cba7b598a0b00a652e324757418f4f274ea45eff642ea3e8b372a5ecbd6715ba42345eff15b7ced4e7cacdf2b07e4ee200599038048e32c31f3ea41bb3d9ac79e719f14e9398db4081d5e0cde47223d1489f24cb0a1267fe9bbc80a393748eab5ad70129a2e9bc528cd2243b35e18a7f77e3710acd419ff5a96ac006f4ee08d8fdea22f2bc10ee65595e0cbd2d62cf471ed50989c6926732d8c7e6c8309cb76d40c1cb4c47b4ee0377b80ed6437c8eb2cdd242ca9e8b4a509a526969df0716e2d3fc6e98fe3c37b778aebf191075356cd569d13fbda2a5b97ea8cc6e68c3a3c42808815b181d67ebdc7071f80d035fbff60a297b9c7f25e7f62984485648faabad64a8155ddedb3b03cbdbe5a19d5a268041cfe0b35737668153357a301d67e3d4af476a18072e0f9f0f618466b9d15b049f1911aae156afa0c434968e9798175e36e3abdf1cbce40eb98736d4df41b80380a980eb94004de4eb160fba6de7b07a9a015d2b862452c368c18f747427b80d74f5b0fdf5c0abce366e585c06f349ea47351085e9d0d65d8bb4f0be1f0fe5730a82143a6d1453bd4491f2dbd9273e0ddcd35866ae6ed94d90c60d1a4646cad4bfe34d599087d042841581c27b102755b98087564a4ae614266927217078d2c2e37daeb3d677abfe738d6798533a70626ba13fcd43e18731ab32e16c341287ae33d5cae1c5703131a15e36d60802b3b471d9e44431ef37369da7ce42e7b073f72f60245bd41e2a8c8c0c5203f0055bbc5a7f07539ab070837c3c405e21bf024e14c13d8a88bdd27f920c4b9aa1bef2fa84253b63c4d1cdb8d564ea1678bacd03a26d991669fbd38b51f2a612939bf3ef9d50d2fd66cf993727b61df433103ed856b9a967ee3498205a43d3f45c28f91bf4767098e7067d9ef1a47e70077bc20c8059f0f78c14baef098477c851e25cf0282a96cecc22e550b1b46e225c4a1130ddb3025dda089637fe18e3f72b549a1ca6d1b7f79c816aece66a7f83b7f786e5bd594ff33e7cd4ab9685bb192efc5af20f0056bbcebe78d40e3b250c9120ad8bbdb15c70500dd0ba615f5f9703560a00bf3ae573e9368996a7bae1357e41ffa33d5f9a2d852814d4ed1a64191ede11d945e5f6c8529627b5314e5686e5d7f7cceab89ba364583b8ba82b4ae7f8111cdc21960d21b139dda03979d7895e5f10591460d37a641aaf5f111686ac157b8599d0df9b088bbe15f83ed1f6a54e43e3d868ccd41b1aebdacfb670a9ddfd99e682d20722e5287f6b2dafcb36733c22eceb46610feddf48584e16ae26e616d8aa37b3b127603e1a37a10aea097bbe7895d23bc2099b57bca26aa043706d07d45b18e4722ad2230b15f2eea302173bc1795dc774338beac533a5e1c538db470983c6e2aeafe38dce90b3b97a92ee3a7a01be67dc20482edea67069a7c2a93ae48e924ceb28fcc4d10233f9f54e59411eb9a49b8e52488a75555a865fb05f79f2062b719c28866eaf15243e9796f0d63c1b80e0ff3c058435dad4f67184767abe74f2ff561128f1d533e4d5d60f3d603ea1d3c6936027b27ca1700871a186c3a64579549d955cd4efd8f68e3509a785b2e72dbb0f41078bd643ac5ad4b9f8db46023f0fd7078abe3b8ee9963938c7ad1555ff4cb7612d76cf3bfa5c1f1055281a35b48f86fa3ae454c03eac56ff064cf268b8da20431219b3e4da9ac55714309f5a6a5241e0060dc817562f12deebfbc6a9fb11de594ddb40e8dd754bf0ce9b41eac1068c4b448101fec09d014b01200e94265246365931e2b2739a276fecbebe51690acaaeaee4aed12e8486e5be5036b1db39fc4c9cb415dc2d77ec46e7114148c2ed819c8dbf0b48c0642811ac12cb8d8a27651ea0e856c06b7d1ef84649971b5f1d55776966c3c056ca797132ce5971a3a9152f0e3521f9de381406a2be0c53ae189ac1da7244d23205df66eb096d28b84d80f03d3103f2c6378ff454e53d7c206dd62e59782af8e2c4ee654d5a52fd48734cf496527945e3d9c7440565871f669b9c0f5edec29ef9760b1ed227b779d4c8bdced21ffe6d87bd7e780ca59597e11060d7631cc85ee6a7d9e601f80718dd9c77c158f00fd4525109f3032bd580106aa928fec898932ac8cf4d6541ce74d38cef8ea3893a14b412fe57617ec3628518f9769a58bfe646575fc764ab89f85718a9893a31e9992d91b017aff4ebb9af99b632be43aab2b9e20fe6988ba63dc8ae1a338580baec3f4be3b65754bafff06b840fe31fe5a305e7541d6968cf9fa8dbd6303e0c0a8869bffda5ffe4bd90181cd740a153fd11bad5c0fe6fd94298881051e1ac2a74f82d5c6288f24b6024671c248761765d99393bdaec0443cbd2e6fa11da586266a60aafb6b1e6ef4f276de7f046bc0d83a401980678ef3eb7b935e78a8cdb5a7c3c72287ec34646d713ad0ebf0109600bccb468d827593082d60567406b9d69120604650f3f78f89473a50f0548e234627dc23cc479fabfd993c607c8193714c4ad31d3fc89276b13b1d6575770cef10421ab625fe34c33188d082795f800e4009c7af3cb22ba24b178b1863a2b380c7d62e0981ee5b630cc1c4c651e9aa36d524e50530faeb99c1a12e70a01dab60d4abbf24c6603d14f60ebf34ed6739707365d42601e9f9e579a2ab7515301b179d89760dde9c025d573569d33521554582923c1a99c57e0ddde1ad2faa232b2b8c38fbceafead1c797ff6bab115e243c6a74c7eaded6a19a5328daa7483d0526087ff56f2392d2d91e346dc46a68d1dd93d31b9dba668b13453ddae4d5c7ce9078280df621db2f1b559c1627268582b06577e03b14bb63001ae956ee3a09b1ef46f9ea6d900f0d15a2fe0fdb2ffe603e4927bfcdd31e52ea3af4f6ce604bd4cdd9bb35db5a7497506e24ffe86b1b920ea5ad5f5ae1d780580d26618b2ed55fb1993595496652f25322d48f57c42340a8e2cf6aea252e14d2fb47402d8bee7b24ee31b3be9cf349a624d7672f2160949569568586876b36e06c1e3abd61e050ad40753642e49ec2d2def52e786918b45ca1095a34efd5100bc874f84197f105d4f7cbc7dd269a855eb6f58d3a8694c885f1b291fe45b5c7da771121c4156ac2217bf90e984a30bbd216a12b7e5f1cf999c317d2ec715386d6e1bd5e4bc393b11d35c7b27a38a88cb765bfb14bdcf76e1f7e02c4055cf773856e4057e089b3f74f8bff5c8cd94a1f930b18c6aae56f519f89390f51ece9b6718761b38a4f13bf3fe667b3d5135d9df1707413a262cac7a14e845cd80a70782292e91b52fdfc2f76afc9605dcf2b2d56fc9b3f3b3b51faae34ad53a39fd6e11ff9a1363e7bb46f7b4ceb0a2cf6faf84c1754f37d594c124da37a9bb9916118f0224ead59b183a8d627955a4b6e13265a2968d771a203360703b5dd22ca5a461d77bb27a887b30210a691f7c121bede099aa0921effbd8f63bd24c0e73009922e5eaf4d35e68ba4b033a68b96f54348dfd2c2cd8d58c445e93790ed0fadb525ac41f1c707b452b73e359bbbd2d4e98d6639962fc4965e7f21dac00ba228a7261f874a3c26db5162431439317ea5f9d52637e661cd9fd465940e7ec3a98828be0d9882549b41d0ce46374895a250bb47a635780ab05d6e21c93c90bd2ab77e1500dc61b86dd01622cf08908e44bc770c6e9915d373b773d848cabfa0309cf1527fbbaf10a46e6d8766eed8c56ed3754b06cd856420942db59a22d314c01fcb9e139d330349051b259451eae2277cfc2df7379064bedee2dd46aa94c3e428522042eab63a627c6923e0998c8c789f56dac741fe7c567cdb7bd4ccca52a39fd001970a005dfabb9faad32f876b6725c97901529653ef5660b5cdef3c6c066c8b689765d91316aa05e1f379a228fff49e332ad121929154b8b3b87ab3b71378cc7ecc630904c031e3f1cbe0a76b45f51d2fcc2868e0445e2d9e1dd7f7dbd4a9da6abd6d57d9ff388001e0cd5cdb43108d966ebe30e6115c059e846dd08151e8ff55f2e98c3adca7253abca68b21002e388f99fb444bff3689da76a40651911e8167f44170ce5d661ac4e6d4fae584356443d4476bb817d4017b7ae460f29c31a9c74adbcb3e8d5da7c6e6c072ced80f5ad9a70a6cd5601eb5a81995a70d7a0bbf9e7c2165317175146845d1ba8403a2627a9aac1049e2fdec8ada1fa34934920b13137906501394a8d48a6e9cb00dd8c34e36951fbda557f04945eb1c4fd0b0d44f964d75437aa3ac2f3d01defaff97c77c022e61d8b216070ce25fdac6594c647a8d047bb1ae8b68a4e6f14909e0c9b42d87dd9d4310207afb3ae4a457d44d01bb8006e043b83224580ea6a586b855d3884b0b9da5c75f9140d4e344aa4b9df43af8bb6ca09f8228763c88ba188f236cb6d82127a7e0b9930038c28066c52385207d8be6706b62bb24f9ff4f686e1bc7deb68504f16218ca66efeb21334bc7fb9595de185d24b9278acc732e1d5c252b296ba1fc2a55637c9780c4efbbe471a0c0ca1cc80dd371b2d23d4c1de06229e2bf81dcd6fac182f2be73b7b1a39809bacaa3adbf288071a521d4f2e559870f32c7809d5c0baf5c7401512a31966f7792daa8f9c55731a148a21acd4e2fd3bf6469ee4e540226db4988a187353a72a370196269a242f0e9e27a96451f0b4e21bfcf5556878a2fe6bb7ceb358637a8769baf58631d90c431bdd4d1c32294011e8d1e3c1dbd49d1651005b89cec361ad65dc31250ffe9b6611fd651ad1d73f39c14812c0bbde71441914a8e242edfceacfc7d199910f7cc6151a8a06dd94f2c849e1eac88510d00608674f83516d9cee1c106f4a4185f10199b7346691ed1b5bf711d44fc3f639eab37aa7b376acd225bf4862bdbdfcc8a72445fc90bb3a19534d5a77ccf5090f50aeb15a192f362d004dd2447a52ce441529693b3ba6266d4ca14e4dd694c3d0d66ecddf1ae7941e2c3c409cf69c94f3da3d7388bddf1c87b6b75fbee32fb11efa58029f3f4c4115f7ff05d4b917cb6864b5075dade297191fe3f14379325b5a2b1f02130ca9b7b5022aa4744840ec1253449732724d2061e6abb5941f291d02e7084ef2f99c727bc933aef41aa471721440959fa17b4322b9931f093b8080b9ccc83b878ca11bcabbae87eca6bee618265da50db1f969bbe72e801b64e520ef3ac37a794c33ee3267ffc1c672fcd46507e028053a442e9e2dd2ab5301a37803bf7e6e10aee194333cabdf0a15eaa6f9476ca10e90e7ec59cc23d338b867f097d97d99162b26985dd837423ff604e8356377a2926c513d7f6096aa44ef9f152c07358dd2576f550299269dc0a9d812b9ca85af29131c9c6f79bf93002db56030c73aaeddaa4864d21dfe444487e0a0f70b1b294b2bb673aa75e32fe2e9376c4697f19ea09a3e423cc532d834369b3d6d93ac93611c9b7dd0f3b5d375a8b193be07febfc3bdbd77b32d48bc083c74229e02be80137c57f54361ac1020f2a0713785b694af6b427fd5c4b48248e0180af8b6c571dab15884a25e4a788d3d807f23afbdbfdc5969b5051a1aad6ee7d3511e4e65eb1f5239a65e27f57f131fde3812c48893c2de9fd1d19bcfafe2ba529f6f37f45e59e557d4d77d51964ae0161675828ba30b815130bbd867fc6cbe02307bf2053e22d15f8abebcd3509d44d4a4cc684b801ed82a6c344e683545895edec50b2d1d02acad427474ef2092a4765da7d45c9d654987decb6c34cd05a2e4d4cae1b07d71ddbd96892429a8c38587cb7855136d776c0622f1c07236357120ccfe2453d1d8fb2cf17d49073b987e8558be692472eda601b347d995035d9a9f21ef316bbcd08b67edb1620c6b99e60baffa8ef430009e271a2e1611b6d675bc6e1e978c80d0e4fae5d5fdadab4052671bad44f747889ac2c225047cc338a9052bfcc52ae052be52645b7a6f9d145a44265729c20bbe428145bd333aab1c8b05c61a58bb3dfe6e0af3a266c6938e541f7a888bd90f4a1bcf0f6710dfe0cac23ad6f7b0d20c0c7a911e4b51473126d64562a209a0c4949d28a9a33bd106fbb510d9057bf3dd257a614ec6b865f8766772994411bdbe263d1a8f01f2b28007fa3436c4089513d1d407ffa51aa75be57e1368df42847e87721139f40408ee77f7f19ac3e53a629a2df1cb56d68fde0c80a46be40a996830e2a93509be2894d434e55f8590582bd6cecb1c6c9a93e14415a20cf2d8611daaf53f0ab3afa635a5479c0f79a882e2105cd07d46d5381834b398e67c3a70016e206f157247162353966225208c2f27ef5ece6885f500e546d0f562e0bf4ab5e2fab5ffd612dcf077a7f43b1ac9c15fcc2b0168aa9862db0304441ce0c5659db1fa80244fa18f2f7a02beaba8cfee1c2f6805e8153df26bf1b4017ecceb354b53966a2d5f619122e32d1e118b2d19cf918c68716634240a8b66ba0335af5e213054d07575d1778d3b8dbee7126fb8fc8b1e95af0e396c494892ea348b7024c1d0cc6f87337fc6d0fbab0da6eee66025848519cb8dac5faaa1defead6edc4dafdd5373fd18daf370ac1b86cb614f83cd06566181551b62a13f9173b830521d3d8e909a21866181eeb545b6ef2a09b8759918f95b04f519cf6a50f5ff7060381d9cea5eaf1cb1f6cdbfc01a6c99836291b5237da30dc7e987caa3e1edbf8512a250e71df03c3ac67014012dee406b16b3d33c3b03e002565cd8f0b3fd7e4f317e731d748f756a75986a8f6dceaf1f495e8b99cdf82c42e4c10dce08c92d1d09045bd3eee748cf88891bc15698462e6ef436e2a2fa32f81956e1a24cbb5c7d2dc673c0e9a236e873d4b05d84c5a6071c177d9d5684a4a07880ed03ec5e7cee0457635ae12ab033cbfdb0aa54f13f37c52ab8206511e1ca66c19869842d1efe2119a31881eb65400586a53e5385723f0eb08f223b3c8ad478bb6c4990a1b31c189fab70388e967b94e206901d0d0f9b3d4b6b09656ef05d32b0e13a9e46c9d63f5bf4f8717ee4651ea24d35fdf247cae55dc44c5023c2d309548fa30996c39b19d10817c926df9ae749f19692dfbb5c9b6a2371a7f562c48118d0296f2c40f93c816d64bc20d86ba34b8c48681feaaed3e3110fb94e70a01e605b144b41c27f2c0f9d55a6f77f75b71985b1da4d4650036b157d20b94cf455ed792a0aa1b87b4cbe007126053547b756666985f26eeebe64a9506aa0784fbbf2c2a139b6a39c332f3f2db5f48a301864b6e5e789c4b97962250ff3ae8310b522b03064eb145053d5c201e32feeed5ed6ffad7b7dd86eb8e64132582dedc5c5ffda4df8c97b16433401941a21e3cdff2f9926be692a7ce153663e04c928fd82ec995081dc487c75eca63ae77509607dc12be82cb62b42a75c0ca985eac516606b85fe7c9e1cf15041f88cb793b0335f5e1078430f6b7e6f42bcfb581d32bee31f289e658968f386e6a100270888b51838ff4d9dbf5b7eadb9ffb9f7daf2359f59e9b6b918ad117e4d181ba23de3643cf430ee99408bd1e7243d4be1ae9448d9be41de03d669c9aad7c655a5be60df32126db1d25d7d06a0040e47b202993736aed98ac24d1f9a91394434ce0481749c160e5db5509f8b6cfbeb33c56161af3ace194370e74ee2c5c41a4f77aab5c2ef618b48ceb473dea25e4c76a8559e0f6a7e897e9c3f6860bd1aa0fc3f1b7e5880976ce99b038a8ee4bdaaa6e759aed62a5282b2a0a01c62ebaf80c180c15b94142a3bd686c8540aa89c9e4aeee804a21ecccd762ad3ab87e5f52235e946de03fe9c70963e6d50e0626d9fb94b8b3fe19c4fa24f9724b63e107e1ddfd5266636c460938f1e8d118eb6c3179879adc113477da985722dccf40fccdc15d0ba949aea192d4793821683fa1fae6ee5ea38c584c96bde485940584843d58e78ade9aef418a65659f6c06ec0e5bc833caaf766f8a531b09621c0c93e859280196ac5f166f18711ce55af8d8fb7da9bda7a9d7607a3c382c821bec57704bbb14f6bb9f0b73648206d29448edaf8710f4bc38b71364769eb7ae3aaeb76338998973b462b695971f8b2ec2fe1174a28640d3051f70902cd510ac21599a0b4b48c6d53fb0ff1dd9d113c08c202e90f69209b2b7165f458463a14477f5eaaea95235e40392ce52511e065198b82b4caabcb722f7a5c8cca6d2d040e58b8e957d3f3d67a90f0b7d2891cca991cdf0f0e78cb2eb6dd3936dbbaa076712216e08ed954528d8309ee685afcd901d6865c4d48b63d5c0a8a870eb71ad80a7c2724e21deb7ed39fc6fd5910272cee49072109a4030a8992cef1d5db129544b7382b142a1fa7f747b66927411212a8f4dff1b6033822b9f6851bc3af1e5aba73e8677786776a630b56c645564436ec6a7f42e4fedc2277b63b494a9ba484c622a66e9eab7932915b367955c84416030a739918ff55665d42502eed393ba01253f0a4fc119b9d2cc7c416bb3f881c97654b68c47d3a8aa53b72112e004a39098865af124155067fd18e02f7f486d7040b754679f101ec1a020fb48f7956cc262063f163c34c0b150902e28ebfd6c1f35d6f969c0332271626876d840cf7b5f2cc89f0831fd71786beb11a01c9ee59cfdbb8edbd2c41b8141987c09e439392f9dd2640d2af9cc84f93173dd3db342b0416efc05fc4c71bae7b7f4250b5c0ef95e2e746e4fae379ca06a3b2874c4ea23a9f5292f67528be4f9cdc572dcbe638716e4b973c9a61b8a089f51c9e95a45bddc5affa13b5ed3c722e3d93980e99e9f6efa1963c069e114dad89d08c6fcbb4683a565a29ff8b02a08ff17c11f65290a0e7a7e885b7def03be1b062d3033b48545dc427cbba98ad6532c6754dfb86a909d6bcf28c36caf1e5b72777f51869843cb098075b8f8ca94ac6fb138eb6ccbf8c4d6f48c20be872f5ae4d547517dcf48bc3306d6be6ed62abbd2ddb66909b20c2ac2d4fc99f9e1fc627909ce58a0c15cc163bce7f4911760275cd41682158992783759bf56a7244f1c3afb598d78d74782a08aef83ecf50098157ca05d1ab753553e6a1f804fb8ee302e9333188c77d0a6f258389304d9d0b806be9c239fa4176addef623f7a05a1455ebaa322640ac1d6610e084b63299a2c368351fb2db8a65e1ed1d1baaf733203d056f0d389f9e0b9f694a8d3904f249fadb1080e4b5bc7da09f6b41a766a67148e50635282abf6f8b8d2605413b137b77431098381f54486a547538657520a1da09144c8d787ca3ab0b177f675b99a1c92ec9c8357eee309faacf527db93e1c90c00db5c11f72628e41737e03dcd17770fc9093656ae6d0c100ee4258995b5bddc846f37b761d0695eede63bf3577470f4af97c3059da936f05366a7eac04da418074980512f91a6261ccd2e1fbe7aae48888f53ec246130a165c4d5847d7324c670b26068c83187428b34e24a6af1da133b390d94a95ba12b2a46d8e232ede5f0a7f0ff839478b3bc21627efbc3a19b5eb0dd1a84966032978c33d8894984909d934b842afb2ed39cc8a12bbb31519a30cfc3a14451388bec72d5fc032800cdd61e0d17e5651a8ee8673711111ccb7f918033cb5d44ab5332c3726dd6392943a22f7ce23d3a058daae56d5785ecd5f189ab74c056d58132716953538de2c79b09afe20ab9e2b778e92c8b269f0938982138cfa7b76e81d2b24bc0d5ad8da17d138485bae2c6f8f6ae23d9a5e8dbbc1d600f8ca8097675d8fc51001bc0a1808fc997ae183e4c90af00b29ffde7cb28284f18f3edd35523ef58635d4e4e862c7c32d0a44c57dd464ce7c12455243f4660f43c4b9b9d7253bdcd691d96dda36dea5617b17fb5e2e3756b38b1d628a0dc6e5961deddf037cfea634b891af7620b823e551bd9dec130d195ff8ea77a57b3f98670f2d9520b5e1f22f1e903232acdebf1702b815ce4f2096cff03f2a3ca93aa8152d0b74e56c70413448578ea647ccd775229a0b7b1f4c4f81e58dc2963432954edc0a06981d3403d2aa4a2d276e0d2d9e15d5d7592fdab4245d48f96898d1d072b09bc2df24a7ca98c90a965c9c1a01e070ee120eed466515dc03371a3372fa0f3f5322112f45f5d538fb42bc5e7df4eab86533f2c429c2e4c64ef431b0a06292cca2bcd4998926365eaebabd21a3872b50bdc5bb60ff5dffc08ec9358ce4ba9c0d1ceba0000bcc3ace9776d592152910ce6a4fbf3031b6e53f452e9c24ba5299652446f9df286830fd380f9c0c5d7b39a5fd2a74be5b3e23b6f48cdc148bdb09695b4748a3797ad75f22dd871ce6ce046bd8fe8267f68449bc3f6c8bd8f3a46a8e147522d979948c88ca791d204bb21f84a0244ec97df9b5a3685611ee6c5f3b4802490f0d9315defea16ac4d2e6c7d984c544505f6c3ef62111d214c1606c0a2b875b63ac709f3d254a1b1491627fd0f0cac73da64ba499a9ce58fb0e7a4b45ad25f4d7227c912591170292e8293a843d23355d1a96cb0ea1e0633b02048d8c5150cdc02c219c26c6bac9c633b58861de61073538c832c3ae1a895b58b9932c9cba4eb51609f0cf3a87d9052091f9f858f6c55c9d6a4c5722bf13e28ee40cd4f3a4e02c7c906f7d6110a8f62b390fc64166f84994f79847b450cb56f12e4ae40ac33aaccc4f48cfdee7c20fb0352a4a0c340872dbfaa703b771f82f4bf2edf82677b6ac81a12d25087facc85bf0e9f23de08e6ebeedf919b08532e1dbcc567ffb44dcb239307d1b823ad1968b06bf6d3afee2a3da4bff08342cf4054d3534e9ddad15445f77b911b0cbd910d9e12b09a7e1bda8aa8f294dc6bbc4000ca7d9c4623318d970e181b638851bcda51aad55f92b77e39c321868ccc41b6886aed5ae1d592fe7fa0837676e091213890dc6e0a34e99eb4bdf4cc7dad872b567b4b9056391f30667467aa3e5ca6489024508182acd9c3625e12709556b527d1c53e448d97fdaab5536ac0a143b8b948d6ad19b142b074ab6d2479be0ef430610f6f806d3757f4d20534bf89dfeefdca6c9b3b7e3e963af7b4d1f0df1e6cd06e23864be060539727526eafdd76719b7caec4f1d1e7b29caef9c2dce0ce448e60c72aaece5b191a1a02c0988551691bc866cd4292862d2238059e45a866a5f2a0c403af1d71d20515dcd18368b8fd06155a6137a9632e54fea00e34212eb68594e2ba59b6e7a6e17fa94a7770f255e2ca5326d6ffc6debb6691baaf326ea0cea5e8f7b18108bc34c031d27d84499a3a5119c4297af765ded9a249c1c36d8a563ba061c1661b3d89403c129c8c03f4931174e438033dea45c099646fbd749da3bfd0a1904e6750656692b2dc71698a77722c2e0983e29579813fb2c306cb003f97415f261f351e529cfa594519c3856ddc0849a7e02c8f01865cdcc487badcb22dbb428cc3cdcfd74a3eafe06d590cfeb7d2de170464006535b8897a28895982e806f2c920778a7dd6245eb4557248b06b509462d5d1102ef81a62eed27f9e392fe918e5207b77caa9750bc9ba58610e604b14913dbde5e3364c0e276be5d45e6c2d5ce9aa20bf482bf8602882517e9dff8a05ac236eaa0c5614362ddc03227a069a65dca5b08a7fc47705d897a6c7e7aed710b96e2d8532c23b82090e21b11465f8dcc6fb71fff6ddb8a2e1df9f6573d6f8ddc208429edce18999c2e887a9b4f10f68af93ac4735dc85de4c448380c9e0b613ced8f51e921bc52460517d31e312a7b2a055a889c42ba46120ad9c3f7232d95ae6c68e2ddcd8b9caec334a7127308761a029afee2c30ddd4650130cbf536295c11ba54f243802b346d7537920bb3781eb8f7079ef455fadf242a884cda536ebe579c90964e7be40aebff8cbc14034291efa7f9c0a401c129640fece9aaf06f2bc0548b408632acf36fb99116cc88ad614d21cd7dc49bfc5b2d98a3caec77f54955cb8a19710b4a97ff8b8dc9baaa8137da4dcbfcdd8d711c87adf718284fc8c01de7d849996f889fa65dcafc66d285ba9f143b66763ee9157b362efbe6e0b0392091bcf786c72cb369178ed859668293a35c64e218162bee101b919aaf92755c67b27d4cbe79ff7a52a122851ad04069ee0f8f994a7d014e4f44681e0acdded0f930646fcbefc99d68e3ce2a317687e5891304b294db31dd3e9afbae80f9b43edff5b988358f52c3b3c5d9f027c21faf7b520b567e988444e8039173987ebf4d1fe7c4c182c361953c308dfe831acf6eccb2ecad911cc22b52687495dac4c7a6c3f0cc403cf2c0bb0a0a307dcde860ca851deede54d0b33986b2ea3bce3494f0d2f71b2dea8335dc253d0b948e939b6dad7a5a12501a1e178bc73c8dfd34edd455e3f7b115e089a096af666c4c8345fc4cb178700b63cd6d6991b2b4ee2d9cfa539ea9f4447084b1644a892c922029226ba990210f1486e228f793d829886709d40f781dff9bedb497f4bbfde5d20e85104cea4ce493121ed1e0292037ab17aae11eae54cfc98e5438974507cf01bbcd4681ce1a104a39ca6c36bab59f00748480b392c33a622d374e1a6f71d715f9a3123083b31d9fc28effe08fbfe9ed4540bcb66b8fcace9305e1658164867690af7e41523e93fc771194c6f0659edc54859a0f82e307768867fa60c307628c4898919d83e3f8c81efc32d024cf453467fc24a71fe578c0d3049ff37d83f5c0e906532a5eccd66b80f6e2e67526665d474c616489bda5153e86db06f6ffc7783aa3cdd12a1eb44d65a8abf0299289bfbc1e592f0a9416de8f92b38177a45e1d0414067b31041bd695b995d6893a37c28d1a15f1e89254818fd3314c489944180f04060eb9a4926ed7d2a880dd47f7ce84e79c906cdee66806ee5c4fb10701cf2319d6740b26a17df49bedd66de0524b672ef6f6dea154f9bc8e3c73fa161bac08fb7d936fb3d06bb5bb6bc1802ecfa1ff962c098602279e7859da9e6aed1c16855303552c73a8a0dfdb2a276059f63814c845b3ab2ae6be04f73db94ab58c7564c971a08c8db0843da233f253884f786e6b49da974019c026116dade295f1306b04ce5ed529707f96b98d08a2e363cad4284168906d480ea74f73607ab6d5b163ad2276507171fab1c740539593b9940fa73444dfd9fc0f4e5856bc5a40bf5f136b76d0458b3a5b577555b973c0d93fe88f2a56ccabbc2be5d51ea8ca5a38a245e7d154fc9f540c506bd32486914c3424892b869e0c11ca326dd40b112cc7e2bfc93beabcd645736450c27b142f99da8e3c40bc9f238254ffc97fcf78dff4874ab8bc7acf5797fa5bcd2ba666c24898ed5170e015199731129027db479b47f9ae5c5dec7b4bd108fc89158cc471e2d8086fc4da4915d8ca336bd417c68749a1b35e252809da7c04102d88177564ee01a83f42928340ce852c028f6b3ccc81e521661d16c12b1f585f608c2ec3c4f47b9568f4f10bc100cbc4fc5fbff391772ebf1b4b9fea67426bb1cb2ab9f4b97cad9793e2dd28c1f605c2024dfb31ffb4e55626b9a9cdb56ea5ce1569a1516a0f017668133f23683999efbb60073f3ebf70ae2e6f1db33e296e7ee752cc220034def98e8f0044dd50f113d0a0cb657520398fdc73e4e22afe2e88e9eb23afa274aceaae5e06d349c373f6e81530eacd60a6c1d8cfe4a3a0724db5c23e8e3f7956d40f6f893b18d31b895facc81c186d06210bc98b073dc80f33cd1b53f61cad62bc307a16865ba4df9a17c3c078357d9a113758ad34facb5c49989b30418c6520cd177610cee3e3970de7d7052d8a27a5de0b2c3f5320d1e1f5ddebdf59d8c9196f8b0c7cfdf9b9cc4c958da0225f91aeef50ee484bf80127a066b268244802d40b53e464fae54e04bee98f983efce33daecd45d106ca84b5b3f999d18c2338d90738a5cfadefc9cacbad85f56ba846da824cdae16bde8213945f482478b392b1cd02f8c6fe5f53a3dba716c090ace20ed3935480627b22caad606669cf3e39e3c3798450d57c131956a0eb009450de600a6c5cb6d3ea8c6165c39ba67b0d55f75364f2751a8f32b3a561acbd61dc62598d9d9a8ca674e960235291e563680d76e48de93db5e0d7fa2eaf00ffde98987fc5eeb509c35f615051d3ed2d6f9689e7ddba12b18eb72b745a558fcff3cca65d1a29563613f31bb8560f5a8787e1f2d2a8b415d88e5c56ab9119023488bfb478f51424197c7a40209ace7ef9938f70bfac4399bb9b167f273cc5013785baeb5abc79c8bde73af71085d7018e7be92a37512e46609e2fce6ec11f33dfd205728ad91ee9273d7c69117ff48c4b273749c1ff3fc5d180ed6c0a8af0413458e87290b2cb30616488bdaaf0ebc73a80c1f4e61e3cbe1627998183fdffd23efdab13f5b14a447246a61c64408559626cce542d16eed8357d7a345f84168f06aa957c403c62cf62ca1eaec6d78aebcbd4a8911e501dbc3869daae2886fb209348efd6f9bdda7639d7379a581dc2247ea195d24132911226d2ff17656b772cedbd0148a89b7be300573b09a27bf5ad82b9de3f1f25118108a232969f9a525b1df313fbd63e0dbebf3170222d57ea2ddf06cb013f9267b1e5c0bb535d7d54572ad06d170a0e58ae7c4d1f0e801a6a4d9e6fa34029df594bc514e277277b45c51c3e57c3cd73235c41938ff4232d3db5c6dbb0236676b0f7b186ef2a85fcec50fc241827a6d5387015eb0afd9ff62b0c5f3438d37dbd335caffe29930068129ed169f96c1d9c5d91013dd6517bdffcfa72618478f61eac23ca64dadb1f287f57a3f742baba305b670b713c17 MD = e5010c8264bebfb39e73e4b25e8882e7e158e3dfb56b7bad0520079666a4581c543184970a7d9cfbd3906679c076c235 Len = 96064 Msg = fcdba9ab5284e97b6fc8906d2932cf7bdcbc87950ee50a4e530326d66fdb6028bb6f7d84ca1747204bd38d1b31e06cb21289cdb6cd402f3d70eda799598624869be0f8a7a3c594341b4693ed0e52fb524d88bf15124a88d0e413b4f4ba0a9f0163d722fd25b55a1fa5c8abcb06b204c35561649b252a9d6d761c58cfdc8e5902ddfb046c9a102048b202dc9d63250f6cf2bbc42e4d09f67ef0b19812053bd9efcff5a5dd48fd6f19099c2e4b6bd5a5b7ec3ee8b7d40f1c6918797ea57e39a732026c0e3978a5cef9743da9bd67ea4d0b0a93d71f00639698b71d11708faf4b313e094566732fc550b98d56db9e8c90d01562994c1a2eec719444595b7fc54d564a74544e7ec4dc87a1363c8e5ae1f56fd65237286997a75e79975f4f98a53608f05442d7e48c9c04f4dd63bce114044e120cb89a37c74ec52cbd2a3220748eaef65118ebebae8c307a2dd44e7d4b45d694382489cae66910765fc2ee605ddbb22514dd71dd533573facb962d73ae416f237d84df6c1b80a61f253069a086a77b4545995100a21d363e62b13f0e677f828683df83628e1cefefb67b8d281779711e8c55739dc4cedf0c982e6e959b877586f33d5df768c453aebbab403f39dafc778f18bffbe0d0d82d1514a14f75e2b2eb75a65572d1013a23dbc96c2e1351841af9ea1d641fa98769826bc0851a179f7db023531af05a0c17bfdcf83ecf6671cd70d3751ea9e35687873cb280b5aea6034dbb3f39ee5731520fecccb492a12b599cdcaf72a505ac51cb8e61856c302e47f3770115f280129c7202d0db878b1a86270cb3a83b98f08df769b4df67249e0f4b5d81f6255e15bd9024ecfad3aba71bb66c690895238c04b2d593d4cf126024fd78a826af78a37c125d0858a18938e2f402b9dad82ee77ea5dbe6aecc82db4eb0cd5cecb75625a2a0b20c3e17ae37a186d88c652f4269c3788295b385fd77540c66868f658101f7e12de0f45da10a2117f6c8f2c0e67a9ad2d3892c230a9c00bb4a0f58e280a1437ed56cc29cea1b2a4d6257c9b3a282cc5bd4a860cd32b2186281dd8f56db6b4e1eb299f0fc12d084d0261f3231fee922bc8fdb99acfc2165ac14da7ce91bc9e06acd4dc5a4a093f6494a0a75628317619d0c0b1de8f052af3e0aec66c1c722c00a2d718abd1ccb4960d4ffd96db87554a5521e36a896abbec36bfd970967ddb7a5daee886e0fdf45bccee5a77a2569c27d69fe2914779559e13ff455e784648de3ddaa04e00039b2063fa628b3535c72cd599141561a794a408fb9e983a51e0a6e3d8f493a774058e53029a13ec9b72d3c2ac1c59307bd578962349b065273f5eb02849ea5fc5cff02a8565d430fe0bb72e574fcf6c7cb4964c14db29813cb180535704a4918f56e04af15a3ebae41e41892942fa4e109e778b3ec7860718e3962dd3d964d52736e944d4eba5d2d4070d63708a7c8dde1fb6e40f93387f32421aa02d2cada333fc75a8be9ebc214472653deb8a98844ba4bed705c2c3422f69886ac172e1742bf41fd70ce7e42ecbdcf388e8c800c9dfba19e4cfdab90846a669ee4f4092d075ca32605e6bb043c0a332c506c737d700ec329dbc4f7c3a3e95299b151a5430a7eb77c5117e9318c951ad82b40c903465a7935269a5af407dc251f1c164882d48e43a85c4a52f065c84ce327f0cbc5a5478d6a33651a4c36a9a7da2c2b3b12ecf210512e683c6a4d0a90f64c64c1ec183dc5720c0f80f2babaa06fe978c61ada14e620d057f0c7cec4b0b9a385f39f24a4ebf2b97ed40e1b75d8895be630c2275b8dbd4901b62e705c72d33339a80753e4c595409c5ecadf4417ce8b5bc3345a2ecccfa14cd5c7ba3b9fed0469294c2c651c00ab4f654c908e24e680c0c595fbf76cfee02297bb34c9ffae1ffebf953790b7de028133bcb5bac87a42fe7f10921d36f40f6a4232666e59bf8bdeb00afdcb60d54b190e43d732cb32dafb39caa808ef56360c1f53d99376c750f344d5057fdd8d90ff3f097d5df5b54fa13beec41f62cf5bef7647149e1f6f7723c51bd715f7b0d81b0e352fa30daca9d7cca26fcc560588fd8f369ff91a5f07587907fcf376e32c55c2ef766cddbef184350e307792a0c41db147030a2f3e0879aabefb8322d09395a561d8202b942e92bf5c8f86df49183726a2c73b28b5836e9e6b5c2cc31f15c3fdb0df27c0d568e8afb1146205a88a34347073f3cc6b7e1f9d34a8552078bac7130713ea642aa76e50384873cc6425fa24d99099e2090474f141666802818b892f8cfbcfde3bf40ce916b221fc25ee723e04a59733361a55e1bb1ecc31e58ff199671f3ff8af56aac176dbd55c95ef84c91a3a54879bcaaab4ca59e9754acee898c107a3782fd630217e49f5b55a2f190f42d738a5df1b5bb3959d279659515475c23c6127627b86515686ebcf1cb61756a505ab57ab1650264575ee5bb91f1f799145e3cdf14d9599271a1d72848d68e76a4b1563a7c171550166a68d12402fe957aa8f3283544341198bf56639bbf20aba32de927a26a787f2fab7f40ebd6e103bf4cf1dc19979905363d972e4489f06bd416eaccd4dd80540b88958539dc23566aa0a58522320cffe2933602d3d55259a002e79473ced181228848189e8159fff54a7a9e0fa1e4741666af6bba1fead7af784c191fdcf0690d3113759a74e972f7a10d910275d3d45a1e6fd377c81e784afd94b52986417e44096416be155651ea5acb08cb1c3fc31620f3c48d6c61be1af96e03313969533f77d68669e1251f35ce3f5fca03acb2e324d7d97b8b591b87f2148dc784cc6a8812c74f2e66da3d7281d7207fda9f164970886cc29369032a8e44bf4cf6ef468650d2db8c24ea2f190c2ed56cff7b7fa1ba8208e32316177b145b0241ee3659e2b865a60399d976a1c3a2f911e0e651946951385da8e4dae22ae41136f9561705c01c5925442ca6954ee005ff2d543e89f37275a29359a008486c469c96b32067fe534f51a258317c144276854349890aef724b5270e90945d3502d0354d1f891c9a7031932e0a9beaa56e554b13ae38fb3bd13ddd0279933823c3eeb9236f21bc8841efc746a61e577a9bcee05acb090f6cf79b52f79b249ab8cf6b60d56bf5e6176ed7bf53a1c89129777a1af1382b71f35e778ed640700d5cedf02f4c5b2e22afc190823e41c01f1cca0201c13dc5a936ce779a88ae9e1877e725306e87f3f8b800c318f0cf2f89b95c0d9db021ff409f0f467df42dd7447183b16a24366df19af4178a50923c586af444f7a72e02bd95e88a3f01074317b28a3de557b1c494bd6535df45d41013965c4f168faaf6a87f23ece99982091ba2c370aaed411f69891bc41fb9dbd242a45ad5024ede038ac7861382a3e852d8a9f8f3c0d02ca6f967dd6d5293f1ab6efeb77ec4ce124fe9d4daa812067f45d530ef6d2fe6ba83cbbd74d881bb5cc31e0b3af463f58e05500ee652a2ac900b9a9d7187001935db68f4a9acb4186441da33addce7ad994b44dd74ba387c62cbaf5a46e93a4fe3d956754291f194534e2aded6e159dd7c494fa94a87df5e3fae9dcd363ae5720ea21fa7073142166f1197747fa9c06d8029f8da31629c3a6ddceb6009220a69fc614af1c231ae8702b3a85d6edc2444ea10c7d8f1f379f8357c217a864baf1cf53c60bd393c3dcd525be6026c238d4c0528450c52e17d81dfb6c782775adf73435be87235f8f8d1a832d7c94026046c1899f9dc1cd5b0bbb3b466e2a2fa9f562de76a777e0de67b4b60051bb48c908c6a8b6cb116761b8ff99b8501cfd1f9adfa086f36dc2410b4850cf8618efd3a94442524f40a6dc5e5f896ad47c887f460f3e57e1617e57c629c5e36019723096dee8fab0bbe61b7a6f9ca651c54c5985760a71f7ff6f7346ed97f496597a305fdb0f28960fafbf7b8446235e83a33ee7b8975dad9430340c18497b9f35628362dd276445988e38f052184a5134378fdb2b578388dc4b0a642e5cd0c159b58a5e69b4266602fc08674d8593e05373ccee52dd8c00142a770d8434acc322fdb590e557f77dcb63ae5ecb0088727de2967fd3abcfb9e848fa66de83680b1db5a5a8e4654fd35e6fab357f2b909dfffe5d2e0224c6fcc54114ee81ab8b1fc657db14fb6ea82d287a8f89ce7964a96641817782db2a6f478d5723022f8e67a95eb6538ef688d1d61ecbda3d4c4d4b5d36b3caba513287cb982192f481fa793354d7e3038f7a77d3b6c0954046e2fa215854b63d09a7bcedfc04cccd3557daf0b4a0521d8bf565aded3e497bebae1c7f2104b87f86c2950b23912ef0dc1ee36e18b01f218e7251d13c7565449d0748b31b145ff63b4ba6cfa9273803c8c84907db77a8b4098992ca0f06873eed970559c1240b35998b4897e767768a9ddc726a77778d498f93cf04df821dcf5fd5b8ff9db448b2440a10e078b278d9cdd3e5e297304b5673395d1e4848a77a663bfa011b45a6f0bd508655d798ad85cb471a1ca522516f76d2c382b3fa92d483423f0ac438847557f72f548e9a8313389e85851bde4df8ed08a8becce88e4259710e79233d8fb4b65662690838a8167842ce9875b47f875843633eddc2f8583b50ded8a2a527335b06c60fcee37ae41cfc4be34d55949f4b0b899f70fa4f9abb6a26a5dd0fd975b870c0b55d3b7a2098f383d20d21fba527c9924d10ff126e5c157c6d3cfe1500413cf8f63d9134307ef11d012fba334d911603b45851ef679feb569b4cc0684797c3c55eea9527b8315d6ded3f8ec9dcf97954819193150ae9643bbc872751c03e9dcc3beea7c31c4290fcf2c7002df7d35c1b21672341bcdb18925d7663501e88235429a459a4d1354440ae20beee02b146be104392e411e76100da8534e197071d13b4c62b3b6b8bdfef9c072b78a215c1b3dab1528a9e90e5fdc04dfc94ee5db38149ae8cf56fb8ec4038d4d65c3a634592ed2af293b76a1fffbb3b2ad878debf0374d80f61423ec1f901043017503c4ae1c43ae39df0c5676d07d7502acb2c6830a2dd131d87a01960812fd91878135a16fc4bb607df5554ec52ad0d0a49a9779f70184878a46f5b1d45b2320e166afbb8f1e7ea7fd77c70e41816a20598d84586493400113d0f0f85ab35cb36bfa5982e4199e1547dbd43fac4becf9b2d5b5aabba9aea6596019f403e250540d875c80d77cc4b34469a3686d50fd6497b953f6630c757e453e982c37afa80aaf53e03dce119788da685d11ee584668f08086c5c4843e91bfb196285fe40cde39a70c40329ec09cf22229c3962b6f0da573759e46d8b1e8b0023b71e14723d693cb08116cece6f775dd3004cd901f5b9fda490951d2758afe7aae8e27a196fda507fd38e2c3b2a249e2995ffb51fe5bc4fd298e4d38337f935f180797b90c5858a3133dfeeacca458798d598834b514fd233eb6a2d392d055f9a0659b592ef192e671a9272bdb0588e9347cdd02ec8e3395b008b86b3b842e926f2f9a47a4cf3c1a4004c44c87cdc37cb54f60824ad24c9ca60df8c8d5a30570acedfc4c15fa3f85a7d43f167a05f078395a7a7e78e7327e484bc8b10936c1dc802828302a7b816fcfa3ff5159b5f726e72693bc1ed5cb83bf4c91ef7f434c1e136688bb8a59ec22dff86cc5cfe3c0cee83a1406e3a501f53398bc4bded58d7e8c3283b5dd9c67e5005cee39829932b8631e63226f5eba1acbb5af8acff16c44131181e5cd4dd9ff5a56ed771ade372b815bead86b08e03cb02dd477f9a1d1b7d28dea1400722cb9146ed14540bbb6716a7810f27fac5aa10a8892d905eca420ee2d270a1e16475b572c026c9c3698d045fd3c3652511091004c50779adbcdc792799e8fd03e122d4a19e9b4d55ac3913a73d86e8dffea56ba03781a617435f4e4fab86bbef4757616bcece4932c20fb73614b60d7bed0376134718a01c1c2ef0c37dd658f3f5880e29d74c680b69758154ffdd5d997aa7b1d68a38f23ca5dff33b97647eb28a391d745ea2042ff11ee4bc556943b91606b152676f16f96ef6e8106e9d77cb53ef21d3bb4bb810f74073b4cbe67a4b5da4f72f652778c2d5e821da8a0dee7f011ebdb073c5fe6efaae90d6b9d14bc0a016f5b609feb2397948430270123d7e105c33932e8d318a699dceaab5b642c98bb12f9edc513dbdc77bbe1097670f28f00c4604322e1c03c2b2afa93601f9c67f18174242cb75d05f17159d8668be002eb3478c2514f86ba461964ab140db3808c05f38e3ca1511ae9ecbf1b393d4a42af5ca838dce61127d4f3517be0f51aea72e49eb15e985d2146763c5b564ed8583284192c2d6e0a8bbcfee88c2aa179ad8d669e17f8632c24f255f81f2786314b5ef4f326abaf18eee68352655bd777d2c3d51b4874cb642ad4d11aef13adfe231af35daebe71e4593ac9b68edc60bc5ffe773ccb3898ae3cd434cb53828ae6e84dca7f4dce7b16d3a01a3d901404f15f25962a27ae92b161dac432d4dce692a3e1c2828a4396556500bc0ef26a8abed720780de73c8016a1cecb78f98a89a95cbd218eee868a491642f8533c48bccad1d7650c904c2c8404988fc44bf23bd419c92fca00fd1f9bee4e1631f71560be5432a74fac455ca49321593f517dc4bbe4ed365f48111cf3f50c5ed2aa383f41691985ffc28fd91e554f70109393eb05c4117c754e2a4bf83465185edd1b21fc177446445b926b99530b1e61999d795bc21d4a329bb17253b23f8bfc1825ce96662b3345feb5d9bd933ea957ec013764e4f9e8c1b60c5aac778400d5e4be0db85e26942b3363ed331fce5a1c1329eac9348e9e4827a5cba98c1abf11c84ea70a084db11d83016da3ffa579d8967b5d31bac2b4f077e38df5f8eb10d74d3d65336b89d14474f822b439a94eb2fe6157457d7e71e02d2d6736c3dd3b4ff9f40ddc8fc03dc890b0d40fd7c420d3d1429fad85ab1f41d1ed2215f6da87a357d967ac7ddb3ed05f914b5ce0dd39639a86fe10da2f043aeb8a863998c93ef8ec553d4c3cc31a8468044e425ddbdf89de943c1685f468f4046c5b4bb191a67942d15563d45e190d336fa76955a85b6d27d621688de09596a3fb69f24a1c074be0b3789a4e968593483b1c7ad02bf538fcb374aefaddd249519f78d76951ab994e646e99b152a43d30d1761dd74cf412e693ff8fd4d2663595c04fa11918d989154dff07057ac03472977cf970f3a2226cde88b424a69a81f7c6b7f95f59d843bcd5f38d53f51fa096f7f8b7a608459116fdd8c5f243b656ff19788745fcf1f0cb6311d2a2ad09a82458b0fe7e7326866c56b769449002db36215af2d2ea6cb8ca61227ffa89c874a5226e77021c8d2af752ed482475c539234625e30e0991c24236ee3b6371a32da1bcf8ca39ecc1a53e59410b99da49974ff1a0010242a737bb4a3dafe64de1fb9e90169e2bc90c1ec9d47c5aaba7d41e408894f5b57ef83ebb05d7828a05cb052605929be19cb4bd212966dc63c4aff58075c9662fa3ca00cccf845d5882a974c083336a624e02accdc2c73ac81a2246971e07fd799a66a575100be856aac36ff572c0b3b6c53e105505671ce38f74360bed16629a4c14543f3035ca8e66601f4b3b021de6ebb014425c0e28ba0cefef6648bd3c9aa01c35b097caac089fc9ac4c44c151f9a7a0dd1b2e8309587ad9992f99c533827dc57152ad9235cb3b473d80f6c4f7f7e0559668e38f65c2bf7b5bef47f7f059cd5830addb540edf2420fa6eb9d5b6e9801865b2e3fae502c51d5e2dba191b27771d994787dade4c409c0c9ef6ba36d66e31727f958c301e7207ca715af35cf5635cd5aa1bea4e1a79059b98133c20c692e8e65a630cef21b080c6448f4f59ca795d0b5efd4d0652b5a1cee57a231cc1d484e9c8b444c91066d17a2cc1f3bdaea16764e997cbadfcdebace0c9137d1d01c4fa253f1fa67f57c430fb358a82ea9c3c408d54f2beb1edb96c395c240e8fa528f3a8280f770d7d91cad61bc3654c4c7ba1eaa8f376ac2947dd409740508485e8dd9ddca038dbf67a47bbd5565d9069592cfeebeb5cfeff1b929ee0e4fdac02891a5ed37e566b40d25a24f8cfd62781594422b436ec5aeda91ebcffae6066d99e3c9393067a2beb3e54a9fc7c59a203007a0e8882af206374c42319f92335497ca6b4a1b4fe9e5412d99366f862608cc3510aef4b0fefff033559e651b097f0b90b4a66166e532a045ba9bed08b138d264bb04efca92a1ed8e4d9db44832f5de7bcbd76b743cacb675d356a713e1b62bddc872e13e56f517a551b7f4e253bef6d4d865a041965c6c050df0076f5e8cbde8608032d5f10254bf8a728db117e33de205d667949c48ab3c8ff074e3d1c272ccabb74b570cd08d252059e87d236b9aef78b42a37f57a596482de5639e25e31d3d09e928c4e68ab203af16b0e225ef441598650f04afa5fc30d431437386ae143f8be703c60d194f600c47f2cbac43521d1d5418843cea6a159a518a67ced6c654a9d4e2ee91332ef9b598d9e93a644d7082864c7870015488d8fc94d55f0b981efc5922b92376b553338fb2d560b09ab25072374bf9893ffd2868ff66c7ab0df0ebea6fb0344296eefea32a1abfc6ce550fae559929c0a0d5014d267689339c6d00ef066e3425384f8f69bc2398055ccb38a133ca91661bb2ec0fa69f3433c805d3fda34da3ad1dd76e49d57a99faca9733e13e6ab0d805195126fc4b293a153dcd9ca2c92338bc1903d9f2aa26159c4bb9f4e1f418a4f17ac939a404f8a508875622a17b035687a6e870b01cdcf4465b1342cae1394b5549ccae1a572313266526461bddf48534f394d48a5d2f056d47d85165dc8339d528c40adbac28e2d379866d7e6c57531871914bede58cd7558481a72f2096fec57a57b6748e8ac2a4172f1f45a0ac3eb6b3566d573076c8a3b3a7ca9367d518bac0e0575178b9012ce068c20e0573b6943b6caf52e89d77ec37a3224f1cde06299f06641ef5444cb247cbfc34254e39357c3c986d58316373931c44aeba025596573243198ebcf3f8bfd124546a8c551ee85eaf031a02f9fe586bb82eb9f26595abec9afd9f739544db10e0eb5fbe98c5124b59b0a852c9d0ea29d36bb72ed48befadd227c218af4b1bf3a8656f7552ac9c7b2f028dd1418fdacf5cd21c08210da4ee6f24710cb06fe4f1e16f34213159c966a55524ef0fafbcd48afe631eb97f6e36e86036c04727d8b432452842b3312ba64335280c72a4e2d2043d26e32c75ae1fc4878df3b207699301a3c66a36e755b28f3ee1da1903ef304f3ac1f5f864d6f199f6d0f7af830a16d5e798f85ad0ba03ffbefca871415487d273eec78be18b54bf3aba4c8e1f5cc835ad1a9d9d81eb230b51c317f9e195312454e7b875604dc1dadfb472ec60b41f9740c59a5d6f4b983873ffa9416943d4bb6a5779336570c143323a0b28cbb295716f149f391d5dcc1db1ecdcb64cc2db0e20b86a546596cbaeeeb565f1c4dac26a74a21caf00b43711883502e700a4cca314750c46e542596461d123a5e09f1ed8fdd8833dbdd171ba6342ec42295c1200c237ef8968e5e30a47f7b4d3a372134357327343a928047edf90d9563b7b53ad965b849a65040116edb3a9f991e638403d3a6d8f573a57e559c96aa19b650a101d6a5c086e2f3c00ef7f6386107e06360c7ac24f5c8af4746e3700a2edbb9dced3eee641e8c9ec5ea9b58217c3ac05cb415e12220d9c52b289843bd886e197304653b3e56966aa96c910761d0ff2af46886efd95fed10b16381b9cc11b797efad12335417477ef3faa0ac00479e46b5e2e27b519b4db8615f67783eaffd5cd7520f7eb047e9032bfe8fef07c85e3d268bf13093ba42e4c38411281b4c8a90b35a22c55ad0c220dadf27777d3a8937cfcb7ab3a6a612bc603b49726ccfa4590c2d14b058981bfe870530ed6a87655b390b47af92450569bfead5fe382094e26833ace6b4893bc4bad872f8d6963bd2ebb11eca6081651368fb7e738727a25152d4b410768a6c9bfbc0b441ca4f52c46d27c8ac174078e1e4d40c7961cc15cf4f78f2d5a482f4abd325c0704d9af45848d30dfebf6c88fcbadf47bacff73783e98730de485b1c1bc96f5c2c685f67b6031fb46861ecdb8c7282f7dbd8904e96a76934d269fc2c146606511d2286f4072672879103a8b9b89527e387857fa32f1186c65a104d6cbd305266ec83f7e3733a334c22b0886ca8aa35d464ddac7e77b046b01e4436233fb1bc6541939b7c21c6ccccc26d743b853914921ae8ff26960b12b9c50d9f9bc171aa14c35b58073a52a4cf1a44546d77ca2be552ae61e5b3ab50a8f873701a6cf7853d1be217cbe566231dd23c104ba5e6e495b438b801f6166a465e7f91e967cbb6a6f130c1114b8bb17d915d901d3814a669e78deec388d6c65ba038ea50db75a318ec4e3c219348b6b8ffb0bd2b57ddda2a94b5e9739173ceaf65a76496f07db65ab4437243e6269a96c53c7dbc2bc8e6a062b993593873e80956d2e505cd6c5636f21749bf6cacc5df8b0ab919dc5d3393faa0d2bda6607e321ac356e39bcaea724ed3abdc4c62a05bf8205a8b912429cb037290e603c1f7f35a82a079811ddcd76f7e7fe3afd091d2b588465872a6300f2637b41d761fbb12be15a90fa8ef932dfe20ad1cbc7f010b6a4a67c8a86ab1290bf826aa27013257ed865bed38c7773ca2c21ccf9cf659cfbe6ca3255bf812df59bdced53fefc48c90dd9d5a582ef0cb046ab64476bdffe659f8e4b5b2d9bdfab88c94e6e671d9774e2056a030ab66a4cb2362c3735d5d18e4f511c2d6941842d26f60244310d9e2d0597005e9c6418da0f20893bb5dd92d076c1292efb18d7e4c6d1ad87f532c93be8fd2d2ab07e94f2be191fd7545ddec6964cf6d24b98378d18eaa4ac1c33a52bfcb644e9df7c7b213f7e349ca9ed01eb3e52f9d9d3362f607dbf8c232e66be97b140ec3e81d417d013ce7bfe1ee1a8b8cf81d6983a791c1965bec88fa47281e9b72b877b301c07a9cb985a6e3c023fb9da37e18fe9d7aa127176fe3406bd7bbc7ed4ab3272cad6f8d75a648f79952368ef03bf3359e845d6215671d2cdce286a68eacbf6c256e257b7830eb4603110306e73c42513117bfee5fbe7ce821af48e15cc7e3a9746d640fcb0dd8f785c82cad8f694d79df9b8d74fd5a4999c2a8c81f5f816707a210f3f175235733a8dd772cf0aa5bd62f78909bf525cb6a4733d009a0c392ad36c19cc87e5caf22f2b9ad2b12e8b590a917900c51054c8139ba26472676aec3b8e7253cef9e2aebedc49651fe09a4ced5de556e19e4120620a49380fa800173b1e957f7cfd30eb72166f947bbf76eb83c36a66a53a966228259df5c22cbd4e3a831fa9e26e2a4ad15089fb551985b7765884ca8093c90fce941d285a83d6e3b2526d6dcfdb334f651105141c9d6b533d83a10cf4285d8bedcc434a093c019a4b030b2565b2e06b95de8d5962a98c2131eb6b887076b868de44acc58ec3b1b46d2b758b7483b611fc2f6f35a7cc5cc40be620c7a5fd9e194883b6352ba95bd4812238ea5ccc28f5007a47536c74719e240a8d64e52b432f850ffc13905b847d2f9dd1dc8f0abd673b45921d11405f1202defdcabe8e5c1e4c4feaeb3d68b010e0e4bcdcabbde7fb0517cc1d46ae79e220c9ee73a2a54d67e6da0f26834f63222d9d665503643d13067771be6d2d56711651fbfa21fe9b9eed24e540227e12436e2e6af0567c3161b7db1f8b053b79315c1d92c8ccf8db15d7b6e9e26b7341d73b2e4718e584494991c921fd9f5756b55a634f6a0432608f3f16a967eedd76600d036749611af95d0cb825a0ac0f837fa9f98e485829d04d7bba805b2d0b34706c44680c398ed5feb12e96febbd263f2b316dc0e494dbee326192b26a68ae07ad177b5dbdf7e53a10792f2723f3e8ca11e61b506482c70e2b6c8e674dbeb1f01c503cd22d367e706889bc4a5b6b2721d3450a5dae5348abeb6306ea03d9a5487cf7f3a8bb5ba2481ac9f9a03a2bc98d9bd6a3ae690f480e99ce610435c27058f49407a70e7038094ec24cf0693db7548e224c0d3ebfae805e36077d8b7ffc68adb0e097cf7c27fc2efa1e048fa8dabed6b06e40d56a62476221601dac1a2fc0cfd2e640a5885969dffbd8a2557519159b087210d5184babcc1ad4ac419af3a78183816a399bb5988c4de09363ab5b9f04b3be45e7d153f6c4a6cbf1f1082f67eb4a19dc33bd23d05b76a09f60528aa63a38bca7b29e616e744fadb5656bcb4636af165f3af68b5a74007e8df5738d70651fd3fddf865e5d029ce2c044cbae8d8a3ae0bbf64fd57e0073e427c9154c45abf16a11159230099615d2da3731c2830e74dfb810cfea84275539338540af6f3735eba9fdc9c0bb5943e5cbe6a3ee72ebe47b1d307fb0b41030e57ad0fc9e352f73bd8e3e33f6ba72ad845af82c1aa048131db4fd651056e48b50c4535201debc34488881d8ba500adc155116d12e564e872b43208bf2b1caefe2d9b549c0b305fef45f6ec1f5c349560276e79c13dc25ca0f9340f93f0eebe303809feac3fc335c29daacf58d5c56a5b1921494af7af4642f6c06b6ddb56fef1b83b93cf2016dd34fc2e47c6c635a508c6c44c1eb78e3dbf5961acab6ee7d9b92a8aa473609dcedcedfbd5f78207ce0f9ce202cb01d1cb9c8d8233db1013d70d0b81b13755da7310ef9e0a59bdae5dc627e4fdce4b3c4850ffbca17b535d8f53d7ab3a99946f82778d8f456bcdbbccc2e457ad9708006c834c8b661acd476b341b81b10880af4587243a27bc3692a39c5eb492c3dcd08099e048f237d243e304538fa502cf1c54b6504921a97cd57aa8f3863dc32e1f2d0b57aff63106e59f6afc3f9726b459388bae16b3e224f6aa7f4f471f13606eda6e1f1ac2b4df9ef8de921c07c2f4c8598d7a3d6ec4b368cb85ce61a74338221118a303e821c0f277b591af6795f50c40226127a2efacce4662fd7076c109eb59b18005e7165f6294a6976436ee397774e0df5000b17579b38d58fe0e1b5a2d1ccf329b4fe10f71e8180fc5165a369c705f6150f8c8b20d8b7b6d64cdc0ad69f2b8373e734055a2ea90575c5658610dcae483b50b73c6fc4693a74f363f681444031a6a0182c67804962aa4a7776d3ddd16b2d6a96138c87d8ca307e8164edeb93638986b46d663de9fe6086a25bf9f3f7c7b40631f8be488cccd3953b3960baad82e5420fb19e8c12416221ee1bcb45a7c497cc8ed44e2f0caa25df9b5e23d915f7827b31de58964a9377c4639f91fc69caa063b78d8465e0caee05a8bb7e71532928da23dedc821c5c66170acf933fc5419574b40da8129096f6ae6a38b8aaf07f9f06ec9772790d04f8c1ea93183744913fa68b3a025da4740583eabe1bab7363aea894f362a3a7f3f56b0bd46a0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece451b59118191b309c29884240b31988934ea185148ae0bf42be11c0180ad9e13c996cd00d055575347e31bfdabd430476ee6290b54da97241e82d023661cef43cade1ca04cd20ea3f9e4cdc1c93abd65c7c3d82a71133b4e626ee4642e22ba488e1acd58bdb1e0e121c425d82e0b47cb88a9ad166701fe5a40cce02ba26806095e736992ea99d5f507aaa8aaa2f0d761f8bf3138fe4de83000c44de28896db6e811177b59c33f6c8f3bfe09fed90730f612eebf6fe9f01b9ea80b2f0a954415f411b7f299b274a402d2b5420d69526bd091d64b92e9e52db452597bdcd4841c4e4ba0a55af1cd946fc158c9326a4f55339b522ea57f3e27f5bde84b1bb1de285b3159fa3a0baacc3aaa51162a568eab9391eafef4146b98e72d102343d792d8bf655c67a35aaca9d7d056af31b860cd7517f9332b43ee0eed32698ae190528bcf5a1074237943bbebe5a1fb050a96395c900541978835e89c606cf871868dd01f722eb646f1f080cb4cfb9000c77f8dce8cb7c0e54be3b4592992e27024a544346fff946a2f43871a989bf4a1698d292f80593781297800c81063df69f5594682861ba519bbbd3d4e3b3b9f837b5f9a13fd91fbf78b534c5d976845db72fa559e670b4ed211be21cab732f71377676ef066daa4a4fc15f58e3108cc211808fffc7537183fbbc6c3349f1aa1dde82506694e9bb835e6209ace7fddc8e76f15a4115337979f24779000557b264f3828fed3376dbd16f413bab2d64fc2aae290f0616375239ce64126b27cacdae401d3c6b293c909c4805fd3cfc6e75fc81d1b6381488862957ba3d5cf67485638bfc5ecabf62654db25755479e42ce6eb79155be554d9db354f204bbbb7d61eb9dc6fdf13d10df4a75df4db5590a8fe71710f68022af1d3e8fb36f70bf0de9ae3e2421c8eb7088fc5944ec6c76eb41cf6af7a066c2d69031cea68564474aa61535bed33710a7e7cb262f3a553c0f6b8d78ed5c587fe97df6da734e7d9e5f1f864c3b1a26f6e08420a3474058f59e958b099b313e9f116df47bc1d2a40b72dc6a4944ff7de341e8619935055ee7bf4730e5a927006b75e79378381ac2d5ac662af580892420f29af8d1a0914d5c9b0ae4d3be46862b3e733b9b812dbd4534442c1898c003f51c224b1031ed0f9a5a650f9d8297b827939954aa44137fa333feda7a33ac03a9e709c42190208ae923e119099f217fa69de2466e28d5ee37d01d9be2fa560a867ad6c9cb6432a8931e046be0baecc1f283d57aafd67af4483428d61a94c501d2fe11c4d5552c4fdf75596be97e0168516efb5635f60a781f86a7f5e8ab01d1d69a431c080d1569144d6582ee90675a0c86da43c72f8e6105ef235f15e41360da77f3392c31f5dd7bd1b218b59b26816af2fcaa2f290c994097237c69e9029826bca983096cd5935c26c796084547c3b5dbe9f1338d8f0718a52fb4ab62d6600192ed626663bc73ff772c62ad36d10a336827829c031c93d741cf6fa5f6989fb521483e0cc1b265abea6ae66c17cc3d2ec240c33132bd25c3958c151d4e4f3f8890417fc42cbf51a9a708890f904144ec10bc1ebcc379a526c6ed0edc120327c308618d544cec1f42d78eb25c483707b67b21fa035d59fb46ff7bc2aae9bc3fadb02ed084cb40b7bba284cb1de8b66dd32bf9bed0a963106c66bc9a4e7b836f90b132b11e4ec4015f2f733b1817c6608d47cbd4e94fa1cadf233afc92715f9fb232f596e8807ee675a7e36a167e70c82af820a316f61b12e95f7d513c7359b75d5cfee8ac06784c44315ac0dec5bb8bf3657f932146d8d1d0420b021528789fd757d510308bba1d15f662a53a93b09230b7700cd0e9e0edddf36e75e539c440684a02743db54a3f301e8281f09055c529157b76ed843b50589b2e14744d45805a5d0d7e9a2c329cddd043bcc965b40c25a829393ec2f2e08961d146890d0448f3ba7f9511997a1a64342bbe8dbad5506e9701bd8c480b87b76ee172ee2108817d86e02068a428a30c73c4ef0436be774a0b8c6b9ec1912b2ce9e602693059113eecb68968f4461e1fb596b8f582796b022c50a93ed389b62efb665dc3e200e27f128b37d932db72e321277f2a460e12dd21d7e03226fd0f06ccebebc4e104da8720e6928305f089a1e002ad692983562513a9794363f41efc83fc1433d26de3a03f50022d168c4aa019acab7bd3e21e20294cda393277cb57492240d96044e4109750efa10db79d2af5aee028ed3351188c4a6ddc3a8dfe6145e3d77f3190c4204f6ec1a591796a859c91b3371f7cd953632b99f4243e9f60a0ca41ebed596d188f32e0024adb99fa35dd8e7210c79d1ad775c5489792969d815ce6e63da7c6408125b580e1e413d1e918d89f691b85b410b25ba13c92cb6011232f37c983b7df4acea6e6fe9dbe52dfccf887d181796b3569c2c7bb4527f177a682a838f4283f15b51cfe480c83c5408058f2f1ff61856f236282bbb49097dc6d48ff320301a60863808e683b4b7133bd5fa871a0254be567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba3b7d11384bed2af738eb1e913d9b10f79ffe8dcb8374060a028084ee7fcc9713386d8fd81c67ef08dd741fba45016175cd7a06986cc7e2f9ad17fdcd04dc8bc862161f8507d51b2798f96b41713d73f33c744556c212181a02edf66e8045b420e0022706b33e959c91036aee68562cb91374b1cd2f5b90b52a8cd59a9c10f965dbb91124caaa45aff119848bd354760e7b02b2c459ac32124c7c0319004441dd7ac143a7f12213a8e0c421de5940383c9ca7b005e80ce6799143e9b353e976d2e6a42757d2ace7ce858ba9b1a3215a899dea135685849431216bee303e087f8a46ea23fb1553a96a09f684ca58ffc33ea7544480d81a2483237c795768a7444ec319a15d621c41c4938d1af121e25da2e16ca94b88d87eb7bffcf4f17ad1ad6585bb08435f1197244cd9d4f0a6d30fff74baab7e3ec68a151f75c6c61b8ba219b357c076b73994d25c61188e8ed9c19b87c6b2e3a1eb31e4686e579ef4df0bb0767631be109c1e15eaad4f9282fd5bc0431927405a4f596ec5700f41acd4d073f59fc3e213431e371e46e2c52946c6b4d03a705e10faebf95c025677ec72d9aa595adeac67357d7e21b337ef2cbce8bf55b1f7056cf5d0ce55ac94 MD = df387001cbe2401386ad011b2bb2fdb48b156c3026e6548f7140838ab2383f88bdd44d4bc50fb52406cd9fe8ff7731f3 Len = 96856 Msg = 7d55c926d1bab1666c1945d4decf3edb36c2b9b122f47f895758890b33e4c401a1e711533e9d9035ba001e9f80e21cfd99397329cdbad4960ca945ce0defd91e356dbe8fba907d1908257e14646fcbefcf7715242da4fc6ba68b8b2f4d08023eff8ed9c48ebb017a1f306d1bd19fd118a025aa8c88db7e72eda865163a59c8c9c9f369d90347a3c0c8c8f49c119ab8dfd3eb37482786e212a9a5da6b1d07b227594376b65f5cec53c995197f6a8707ae3270c64052ceb1b2a12df2163e3d49c077270943ea21639cea41e6ac258e47ec835d5e5c51db72bc9ee6b6ffe52113fded472868eebf9001f571630b89d9ff008f5908846bd4ad9768782d0e5adb9a44824ade0db15efbebb0cf9785e08db7541e0dcba0e9e1ebabc78c602ce49466fefdd9301a7c242dc3e5038a0070d5f84ff821af98132cb26083ca553fcd74fd94279b2877973cadef5ab5446583d74859e43cbc5431da8d1e63d916305ba2e96cc839cd0c4acc03d9d88cce9d5fbb32daab06fbbc8b16014d3062abe8d747b2f0a85a27c1ddfdb8e726302f8f4caa3b3a152973b969069855b20c1a4e898ade878ea73f7f97f653830e4a6f2294ccede2ea4a2c3112d2d99eb1806d49b894f79843c71c2cc2e05c14568297407e48cf38f2142f0ecfa34c90f565acc3ad8c858d9063c6b2a4e25b02c77fadd0514669a5f52c8336e8a17a944564dda3b19b0ecd3b2346f78525d9b429eabcb956f04492ba3d3093a5f3ea106b250ad10ae91cc00caea3e5afd05e94446ac9e5d56ce7650aed3f0b4dc2246e2d4f3a34009d36cecdade563690c7009dfa8de3b15e2da88ade4b7882a35b114548a76b6dde0e55f44c71558fa01997bc44b02a3607ba6616bcba0f18275186ca880c53ee7d9afdb3aa53aaeabd66052b9fc3e05fc5ed25a0c4a032e9ea9e1dcf0d62fb568b11faa78ef5c4cc4b44df78763994932b5e6d95708e726c6fa95cef637bc01a68fba34c34c831a8dc2e9d0f6271b584aa56b4815ae54c34290bba98049750bea9c0ae2e664b8004d29bb46cdf1cc188c58e80e0ee352ec5992dbd557b461bb7bff961aa7e002e64e104cc2d668b57240f6e5930a50ea8954287eba432188faa3e1e645d0686ab4d6a022aad735dd4eada6ea3fd19d23837b7c2bc00b38f3aea86a83cc27a3f7522e00c76799ff4c951c91807a2a7106c016b36a4f79a0a9c0d3c1f415753ab1a89e5ac362e46f0b2dd5df2eacdf7499296df8c3cf5302b2196c0fc18a81d4a09f6dd39c027f2d210020b77d3db64fe6a6c871bfa86205179fbb7b7392151acd1de595dcae34e096f54541f49578aaf5206e46e5426e52df3c072e9194f7b43f0b4cc80ad0c93073f38ba71b1ced2ccc7da8a0bd053f9012d79a50a3faf049fe52eb93afcf07c7bfe43c0e7a3bdc7e75a7bea7d05a9c68b958ba08312bc88113d80a1f5213b64a82af9ea09a580e48f884f882a5a74e82dba6b07ec48f47068587f1947b049e64c43cfa8502dd4c315bfe9d5ac5551e8580abc4dbe38e357d5c46e719b30a86bb8e7397e53a305ce1a8fcf756b6cdd11ab04e3d4717905991a1fc35d6808d38f7e73cbfe7cbbb0601e7654c9f027632e8747765e9e7fd7ce85b9324f46df57ac1d87fb8b33ce414391e23e55c30b70898d30e82eadb3d662a92f2fa9bffaa15c16824cb7215154c30571d0ab6c9fa1ad1d6fcdd717bb8df004e01fff2c014d19e9f13404cdfb5788f993b03d554a6313c8427bea750d7af1298a87d22379b750085345f68202c5efded6517e059231580e5786cb4e1009d0777cfba52eca8cb91236f6fef63e1c72359838fff61d88e4601d731bfb69c7387f45effab68a199f680adba082d3e7aa8e87db35cf32f6436e12d53f05814f73c163d945532f0a8daa4d486dc08aa41369f3bcb1c978f5ef78c601b704ecef2cbe555c177d2fbc0e398ce1c937b8de27288a61f6ad56046320a5ad16720342bdf698cce3ad12ca8b96381c4540f502606aaa4f76c360be28e6401bdfd57ad6c1eabcb02c5b6ea2a050dd7c6474a59d59a0d1e9a4a41f6fbb4a13f27587aa07b30b2fba741099c0c6f9fb76995b711b7d5bafd512d7f8a584bc9fb56a3117721be860203d553ac179e2008f666dbe09360b827643d762fc3fce51d9304a599267030ca5eaa1a81133b98b4b5e1402f33e20f861ba1b04e026ffb8c26a3bd6e52edb73902e7e983c8ed10a2ee2f6d645d04c801bd82b54dde4b163257a9e15e6dde233936b5451afe5d8ebae977eae9da6eea7f94070b961f393bf66e3e99d13eea7db1413cb8ae7c331de4ede2402472c77deae6593c8f8de074c0b2896e2f8ebacc886ca3c9a70b16c2084498f67fecb88a29fc9fd0a2efe9c8786cb3e7e025f518a8ff13016d73ae870e34c0946012e817241e024d360ffb4007e4e38d4ccb4469f842b3e6687ca473de0683a231aa002fc394aa3db2b3bfe2536242e6dc484fc8607cac0201eda08e610208a9597da7d7eea5be2780a4dcb8452ef87cf663bd3cc8f725dd9e9049e17d6f7831405386198d9a669407aafbcac58f2cd704e537ce18f947fda92b48731b97fac04ef444fc88bbcc0baf8cc41ebccf077d6c97648538cb39ec8887444d24c0b7e0eb278a88c7501514e014debe1034b0f8983eed6911b52432a56ce6757e33d6187fb500c632a16c370208f2b2ab074fd0eea5798289fe305566a2d6f5133880f072674dbdb2f6f7fd7d31a700738f0e8bd893b1d989f084df35f0bbd5c916ddf12c031a762d96deedba57a6b2521613b3bccf3c75fad14958791f3e1b8a1714a216510ef78cca4a901f4297d02fe286cf0422c45ec2eaa64699f706d13d814e8c961bd24ab8da636c15b92060f13c90681754ee9dcb83c433ff40bcfeca9db23515270d77980e500b0586ec6c826c59055d2d6439fbe4cba612c207ab18b36927fc3e688413ad3af5556fa1fbc9ba082e3e75ce3a3c54e2283a4590df110b9aeab1288b7b130148b06f3de816ae6ec56c22f3d3a9751d3140df90fea29cec6e049ead1d637f50a3c6b9b868c419cfba4571701c8d8e85e176696cfafca1a00dff2995c7453ee372bf9da7ca0df2260c4393b451ee6ed51a5241a12cf6096d9e63bca730283a02de2181d3b5f921bbe6eef18719d4ff54035dcdf73b97ba9c49b6beac00145af50f76cf05d2918fd66ecdf1b11c48284cc51e7636d0e89d743882976de11286032c45ee03c9dc22bfcc68fcf90351d103871da42592ef9a3f904eaeaf7928a6755d17469541e2c3bd29477b2876f8e2c272e3c08d2ab69a437ca36d3d7061a393cc733f85e2ac5b1aadf3d4061c4444d1aef730363f4583ca22083bde6fc263a59ee1419a5541d01c7ff3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665039ce76d9523de2abcd7852c13f7f1c4fb7226733ef9dea1f3598692a2088a97a8fdd281dcc58d5b72d42d592019b20b80d52cd6b6ac7ba552fd5adc786f9c8e3eccb4ef55137b0cecc82eb9d18fb6cbd9f92d88839e9d5cd86c0bce953eb4b18cb0969f483232a3f05c91366d82856dcf873170edf6cb2e4c4ea14f439e5a6a5c527f79fc4d3a8a47385db73e19a5572a2741763edd8e83784d2549c8b71721745a7765bb8a1927b9039a238a7da0f3b2806382bc7a6dc3220f9ea36db0723c9d6f874bcb1159e40d6550649ad5fea82f3ba17cb1f6f056133c14457ab1f4249f39b513750b81280d088861b64a45dd68ff034c63789fa5137d8f1737e4234142620ba501a01a5a7f914a022604fffc267590db1b290316ea7a1800eb6f8afb4e8f91e9b7f7abe42cab9c2f312ab36c3145500f2030a3125fdab6ebe07aaebb8a6a4ec8df39bc2ddcfc88d020e4ea9551164bd1bcb607023b4572bd5c2e19e7bf9b4a28c08dd69d562c15cd3b5c2bdf4e908a0a35e3b84c4665535fa8b252e9b5ca8df3a31c809c64e44b0ecab7feb2ef5c14a0d4de3d5a48df61b90c2fe127349e200fd00e4292cccc337c1520eb76fd22f17de1d01e92095ea4b3cfcd4f0b04bf0a668f8aa4e7578bd4fd64bd7b9341892a87a4e0e45e508825363bb322fbecd653de28b82f03cdca377afeb63571803ac6a864371625e705eb28960ae561b68b0461e2c16a4ff63062dc2c34a27885ddcdc76bfc3c4e947efe7329f91da4288523d607cddd319a665f09365f4811171948cbff58df43209b67fd3ca9542c0b6dbb24dd031112801336eb645eb1a2fd963e9e6973866b53032db01742116126ead135ad8c8d5b71e0ed69fd5a659500fdb727f174b92ef45f587201ebddab43a56ff0be90d97235748e6a4b7aea50e8f6bb4ede8400f4cd56f12d44cc3f7228459c3d5a367ec1947920d894e7ca3d7d2853fb7acae425a491fec8260ebf1e9e736104c7a603ae5694ac9a21c88dc2863c86160b6fec2942b78a2bf0d9e5176dd7c52d4e09f0a3426f39983a46b949cdd95d87da9aa1696f719a3ee9543ac55d18d0a13787ce0721b2cfba2789d83918a8de362f74894bf26738e95ba8459136df8a46ca472442bb0576e82fb871fa3051130c52252e3895406b148cfc8ee1bfd3fc054f727abcd80e370a9bfb0df4dd7b04ef8ad418991ea53ca7c5799e1ec19d2dc70d2f59dc40781908b37c338fe6ceb8c820a9cdd4563db18a4e47fcb105e425724da7470cbae925cabf606b3315f437805ccdd75305b1d5a56f8d30005051edef5701ceb41009623807d23e48309289fd8668be7cf3a8ade07074c3756d8c8c277366763a0882d83bd3f832360053b729e6a108b9e7cb432498233c77223c0a01e9fec6076bf98fb96afad1654ddcc7ebc4a13f71abc29e5731c2236d3909706400f046830019909b1501a33ddfd8c42a6790ea0b0534c663817b01c1789dc53a01657e169187e2ca1c352f277dedb3d0189592f1bec9c42ed1745ddaa89d116a3484f729e4ee8d2dc7bdfd89f1c39ec41fd8be8a9e2a9fa268d5bf2091b45cdce1763822c3f49aab5dc195cc01038ceec482f63e6cff5fa690c7affbfa88af785062c96bf441102e286b8059765586364fbbc375f2ef0d218f72b6d3acc11126c971336a3f7ef79d6ee145971760938407aaab97f6a3affdaefd5b1070088bce93cbfd896e5357df784b6cedaecdbbc03578380c41c350213590271a0c052458f797af2f476739de8ed27dc5014306d2214cf23d9bf6f5756c55a15a485fe4ac3dfed2c39463a481f89e0186da6b7da2134f6090cbe4a8e19a715136eebed3b2ad27edaf1beea1b0fdd68097ffed271953a90a6e9b36704d090fbf17c4ccfa538e3a885aa5b13753e6a2806238700d1d28817840d19456a1ff557466942e60752a612b2cf9546e53fb2b8b4e4f9c3597dcff336c36a560c5c56bf789248f0d01c7c25f8de17e4e96849928c30a1ba970b54dc25c921298a1a37ad0ea3c950ae0ae85abe523d7e005c914e0293392718efc90ad76ad82061ee0aa88efa6e85ef827d3989c88082b8812c339e990ac93dbf8f37d244e9eb122c622a6022931113379d4ad1ad8b93708a6cebd69ea0f193ef39bb9cd3f0ea1969b0bb28a8c182c78eeaf72c8db910d6bce5ef41208630a9e33b3e9d84679de63a88c34ef9844b6aecc8d6f0c5839b49bd29b654cb4516fe5016195af2c88716f35ceb598155eb7bf5c952d4f1959347efaac9880b4804ffaa5cd46b9b8e261a48af9bdefcb0d3892e6f033fae49896fe8db91514d19ab2c56721835eb42fb6e9ee34d25b81fa3f0fb2c50973829ee102d5ec6572d344a12e8f82d506e6197825aba77e4401cdd71e073d3824bb141d71186b0f008228221d641ac3191846b042077b4812112d05a72f80477356a253359f5e9b28a6ee407a2f11d5ff105e66274bd8b82e7ac2d39270b5beca1def8a35b2ee9151063e002d388f9321970aa0bcbee557fe033548c713042690d6a4ca5999427ae26bbe6c1ec7bb86e574f268e9aacbaceb762e6c2f5f96052d4a681b899b84de459d198b3624bd35b471bdc59655b1405e9a5448b09e93e60941e486ad01d943e164f5655b97be28f75413c0ab08c099bd3650e33316234e8c83c012ad146b331e88fb037667e6e814e69e5f100b20417113c946a1116cc71ed7a3c87119623564d0d26c70dd5cfc75ef03acaea6f8c0e3f96877e0d599d8270635aee25be6d21b0522a82f4149ec8037edaf6b21709c7aafd580daaad00a0fd91fcfe6211d90abef95c09ddbd4419f85026f30c3b25f9dffb76875da39e33e15093066b232fa7d56d1bba1f2268239a2eaf4e6d6e390b6afb7389bacfeed1c859adb4b574b95f7027ea122cf6637b5574e4673a02eb82c887cf7336744b012f07bd77b5891eb82bb457b0abbbde97d6ad66ec16ab95e6752afad255436b3861d542ce0fd2b838748ce5040fc531ff8a32973b67bac0acfd5f76359bbf97ee1d5cce3618e41e56c72c028acda4f618eccf05d3c1d3045ccd8fd20b6e4b8998ce08b02e552fd9a9b01c30b369fd937a7abd2343a966d95c62568ec2616998ded063a94569285297abd8102c6911b2aab0a7801972f8a852582e1cf919ac4e06e0f819e9b96011a736d9f1444fa3ac102af89cc3d30af9a51b810d2ddb9621d76c2072a9ca69af6ecdbc84a982061851562ae9b13e1065eb28f9cfcf3b89bc96ce8753f410a77434fcda2aaaa4cb6fc4aed8f780189b458b0ce2e56bbe2966eba4972e67209c28c030cd53f62c561b00a17d36aef72e410b43f6de61d7e7c93c7ada72617eca05670600a0ea9d58b29bea7237ac5e2bc0f24a802b602d374c1fbdcbb0718fc3b2bfe90e92165c25cedcc6626ae6b2264dc6ad294ce502aa77fbe9d57915d7ebb921566197f80d5fb869e1c8510ca7a05ffec85cc34f1cb3d5578ba23cdcebd48141da84330e056917c9a90e7a8c831c701148852f2cbfe5dcb91f9c6c2540008387e1f0e3d6f8d45552a8cf57c4e91d16949a5cd10c80b2f6a7123e978d58e2686a09323ad13c1409bb5d6579745e04cbff2a2e594cf39dcb9810033f83ab0c886eccc2988b63ca9d5a337b4fe93675f8c79484388c7d28c4127574d496cae17c1c891c9d63f44a98c5b77b4bb226e3356455f8ff39a1c6688ccf1de7352d03abe9dababa096226847475e00d4d83defa8beaf70de2f609318d9978f7fd35e5905d4e376eea31e0d8eceb440549f1bbc074cff8f506ee53b79b40f0874d99f9e1fd3ffd2c64e7fc1e958401b405e52c2fd571994513ff58431c721f05a4bdc2f9304c769327f8fabe14dcb3aa2fd28281147c326e98ad699ca7997f03a105d34e9ce05e0391e94f4fd161d458163e617cc84c6ed2137d1a0cc3138af1b126ad6aa987fe2e313d7c3c619fee3e67ad3b6b476ea93002e2ec2bd59cbd605384b3c5dccfe153946a041c3bf36bcd829392e5386f6bd8f5835262758190c006a47908ad14a21429f37957c708c795f585ea6311ab415d59b2ef59196eafa1590a7f7b90f2baf0707e3e97995cac283ef8b47d49cea43dae06056847b05474b93b49b73ee69678e64ed624394b63e4dd70839c67261efa6101472876f349cab59b3a43fd6cbf0e1a09d2a61d71996c4f61da38f06e1c04211927022da3da13bcbef3aa62f1bf308a13b695bc4ba72f13512adb5be325eb5cd2279dd24e9fd05d1af832f611f1709510f46bac56378da7c2e81c2041b72072a0cb541b5005911543aaa62d4a005ee9661ea0441da5389b4bb443e3f65a44012974bd5f54a5c653ad9d5c7f06564bf5a787dc4a0e8a906c3ff21afd6d89b696c0c64214d8faf0b6dd42de71e38dd82849d267f4955235793433e9f333c008a20b327ae2396f90bd373d949c4df1841fc180dbfa6e968860bcec395bd597aa915d4bd03e028e36b56fe01754c23bc03aa315b0b1e6c219b12ead91adcf7b2d035b74da9ed0d1535ddbccff41ccc71d1763038ec19a5f59c92dda8b5f8dd4f0667a40026b00d36714ff6694d9ea2e1b2485ccbe9ff5d8d9372f057ee79d4fa5493e2fe0493efee2596f4f708386db2ae08fe3d8a395c90879a6b0e4dc8a45bc0a1ba6ecafd7de75b99fea2ae54f48ccd9e5eb5572d6aa781f196f75b4b1519557a747801567dc61a405c91c659001818f2c45cd9444f7a8861b8379f6beedd180458463005b8366b7355eed8af59fd96ec785a97e6d2b0a4d21bf9a190f94e1328adfddf74f6dd541a32de6cbec7e44f75c1d6197cbdf1dd2a0563ea23fc154dcfbdc8970aff63e01d3c8b0bed12754c73e9f8e86cd6e73c52bf9d018ac0d9cedfcecdde2f9a711464b81d3ca6015794d036ea8b20e638c83291d06e2f0d439f4229343f4b91affad8f1bc88515d332f72f1d18afeb48c8ab2c224ba78abfbc7de16263fc6aac4995f2e8e7654eeb0264361d86e700a8c88bb9cc06ccf61a84e9ddccb6809ae59f9e2b6be8e187c778029d024beddaedfcc3365cd0c9bf8f23d65c54a417a6415234ad2725805cf2f450e84e002ad692e5e046672234439839b2017cb528296a11e7dcad35d84ae817ed9c632c34703214414e7d83832e90070b51b78248a0aa4f265e60824fbe3153272de428715445f884d3026d3ccd314c40c19773ef889c7a8e96e3935d3349269c11439d97ef491329588857c7cbe65a00d59f02835dbb247f0a99019756aa12badb03f3eeada5e48d6391dbcaa719b0ba0220c6baac80cd764e03257474de98120f97b40c1bf6fd4f789151abcb55f0eadbef28ebe187d612c5b4a77b3a41372023816666c6b6bdde0c1961f1b5259b01c73cc19d892afeb3062fe022039c60739b6383851a6fb6c7928c7512f1030f9d58abf9562004780583d767ff6d2ab47aeb8073fd938c788aa08d13b60b78cf1c04af589c328f0258c33db769c38693a4989ae026ce876395ba7db62170e17a1c6fd967d63d250e4b48d556f7c33a9e8f370530a737fb187744f0e50bade7610cde9c9f9aac80fc4b8940bf3fd8a135a92b41fdd54c61f7bdd46928cb3ef5446be58b78600d1d6ce808d268987074e970f9e39057982691c7ed48e9e6809574c829088abcdb44d08f4c3cdba827003a75376c90a487e36733f432a0f43f42729ffda63f1793a1b7cfd7d290d568ed9934584f9722b812f8609d99065aa776de51f7d70df6c2be8328102620a6c297962cc0fefc78952fc5fc2e0e52b075cd189c9c3d9fd0e4f5e30699b9f392a098a1cd261d390caba4406549e54e6c169fa1ce5f2c3d3c86d23809e900823f9f5b5ca3ec0ce565581af81a55c0220406791a65a5358ea004fdf2a0729c74f42b6a272f87508a0946fe7da9f611a60ec1d3d30122ec0c91fbb3b348bae01456b14f81fe7c7a8f6ee4b911929f7c22f2d55a7c0f4cb23f88e7adea81466e18eded760d6f500d6e0cbdf58442a6422146bd57761e871a800b454728d899a8cb101c781a10967bce793f1e1658cf164970e665418d6697768f8109cecd1922d363eac04870b437f92af4ad78336e6ad407ed0e6efa6fcb9b8c47806ccd696eaa6fc4d9091e4dd4a6a85b2e0a7108b289823dbd6ed406f96797f5258357feeeb88a273cec57a7d43f67ef1a4d80227fa26664fcc1a8d0d353290673930b4e159649ae6652db66a92be02cecd1ef4044e72adf36f7f731dbf6b617f52c35db85cc34b6efed180ee604a7a120081ce684a0561906823dbe65bac59624bf963bc1b2b1dd341b7c14fd5234c85e70a789c1666ebee5e0faeb1327ee0d7cbd7ac32bf2778dcd5e95fd618d0e2ef2ac0dae8db1db1d5fa49d2c66c685ea77a6721656f3cc453636f44cb52d9a31871acdd93c1b31d0de4db316d30f33b9a02b0aa9c54f469fe924f5676aac7f6c863d467e7efaf965dc3ccb2eea6a5e07808ba301e96d6cfa50b937f1e492045c6a842612a8e99838f40253c90f709b309378e99345c6a5f127643a60d566ff7dbe9feb4a5c5fa4e6902edb99d4ba41d153433cf26ce397f0c7a65b389fa3974cfce0e46a0bd595eb4b22c105bc9008763aab1b83c16ca985abf038ddb5d08236afe7c01639d3e1b37f7eb29139aa457bc3f113ebe59a513c5ee241e4ba6636e732250cc358e31edbc7a31ec0ce518f7e89b5a48f3c2535615afd14d20fed3bcb4e1908e60b8bb3c09e2064190d3e5cdaf6794bd24765bcb12a91102a48cdf76f3e446312a426370e8d87210e58c9243d94bc78799a045d98385ec251d790f02f9d2799cdc55b2f11e047e415437a7bf2deefc8d9a669ae732ea6a9fd4ecebc98e5432b7bd182f28760d31bc25fdacab74f93bb76ff0e15fe5819456110efc337912786a17b4627bb79c9469a0052a6e76138aed5f67a2a865f271331c06c9a984b3539d3050d353a858ad300d78a970fbe5f317b3f3662a7ae4091e3cfdda9175e0cb3852150b1913ea86fab37daf19cb177d1db4bbb34debff6500ba1bb8541540e923c32b9133bef927addb3dc6d1ad5030e7a7e8147982ec8cbfde87ea5b2c7cb447cbb9ed0b712e9633cddf75006b38155ed7a10e1605538645f06af80d823b358ab4e7a807f631dd72d18c450ecb7833688b0f2b8c3ddb5c7838eb6bd1de2672d5c4df499114a904542f6cbc6396b893ee0a5af243f22d1542fe33ca110ae4751145c65810923e11c02ea66467939f3bd99da9eba4ecf1b98a89699d34cc1e46247dc75dec39990e9d1763c5838cd6350f8c249f15f2ce513822b66da2ed7cebf8b507e18cd16202d532ca651d4705897a1ff595ffce6ce4331142c0c235a56e7334b16c5a2240f64fc704ce9f8ed33d019e4155cb46747a659e3421fe6b42d67f44eb84bdf3dcf1f31e38886f27e85b8b503368df238e1bb511b515bd59fa2c032bddb31d0ddefba97f8f19f7daedea027ef055a52c61d00bb1ec2668c57677e632b180e339ed1c5931310b9d718af34d70a3a4832b96a04fc702db65785ebf12a18c73753db15deb7d45e6cbb2667d546e72dee3e6d494699b1ebc1d3a590d6ec098153ce1d4c547abf330e8672a90ffc0858a2c27c4b342756952f8d20f68e2d6fdeda0effb5d560365735c567d3436ad0530c6b40e05c09d0b245f0a29d8562de3840a2dd02cfeccc0368e480872e17e1a5919555992cc5a2bbbb8a84f65b20b7160e065fb3a28502f02e8047351e87ceb8c8dd44d634ff6f19d6c752818deb9cf0b8b5d248fbdd5d85ed15465da33eca1518af8937f2fb78654e4395df8c37f260d74def234a3a4e3d2b1fe8614aa1963307888d3ee56e6126887bc950d47a49eec02af0d30c40579e6f1cb7f07364a5ab2bf4db4b9aacabc5fbcc5796053725e329c9a1e8b063fc223f783f8bbbdc6ae5ec70fdfe715adadc3ed1eb1f8d02f8f66ac65cd4d539ce5102cee983928d686bcf895fc807ed50d1b818de4dea424581199d9c17f92620a36f8d3088860c20a55bba9b28dcc8b03f0e0dbba18b999e2bacbbea329abda5b1bc4fcf0b04cd264b07611a914e917b7c972d0ddb0f5d654e9aadc1a51854cfd49f62ff6bad34eb95693968a20bcc1522e9e33f2ad4222d7279efacf010a001b48f835c5addf7d34cd7800fdb62dd1fca7cfcea41887c793fa0fe26940213ddb9e30d6039157a8fa9f8f17a9e0248edcbd6a6798f8ac0bafed655a9117b24d65d508d9596e221736533ea337a589421bf7d8c7795598375485082bef8ca676e275e6086e4d2a120e72ef6b4e0e4433e0de81b6ed383592a94c601d2aaae3017a043429eb3556e1aa83093897213ea954f8cdfb9ca86a66d7c9d6f7eb765236540c5905772f8ecb330ef4d2bae85dee9fd0256030ad1ff90584d083d9fadb5c9914bd64bb42ba19d19c17015e6b8a49e8ebefab4e4f3c955c06b7879d3d67bc70a5c80e5e76c314abb4dc8d2bb1ae0157d394a5a097aa8004d6f4ccde47dc9f0246e2ca09d38f01eadeaa3dcbc2af5f160f7d16ce8c4f02247ced1a4521244b777f73616462072bb5a2eadae3a677ab4a2711c680361465e4810c387ad22509f6d8e39c162a13d93589022c1e65ec2d1ea3b77c5d9ee1ef6d6cb8f02462c920a7da9a41c8339c52921a5bfb2108f82cb80cd9020dcb9feae7c55808ebdaf6dab30c0118218688dff3de5d0f979782f240eade1e39c5349c7a1556497941967d42f67eebca2ac1c8805b7030261871c5dfc32e9989958a4e4ce2197b739f90527b217a806a272d55631bfd257695afeebc21313aa442884788b7096684fccca187145ea0aa86b6cec1a66ab7301523b4018b4fcb33d415d154198ed1526132b28e579013324e437ac58221aefca1b561d38af012dd541b32d892108685d5aaccb7737aa1a987bba2943988d281404d3c5ca57cd94bc981b33ea9f74bc6611c382aef8212b83a088e595309ea68fad38cc4645be6243b2f9cabe7abe9bd0c703f1053122d066e11863a560bc058d72f9a334ff50111b30c3549d2942811de8e27912891bb3c2bbed25fccf61afae04aaed0efb2f4ba3702c540f41bcf6adf5e38d4f567840179f7b9f13c31c1f61c0a0fc3cbfb86c6d2f896b8d5a6a87218c9bc0242fb50fe61a484182f267df3945807356b367ede89d7eed8fb9f79ce90b5f94298b7e7daeaad7cfb2c3c15994e1ddc4e58cda5a9668516c8f06c0b294f0c38bd7d02113e1dfae6c3bbdb5392543fd7351926c3d070eb56b13c7726295eb4c19a7c4495d200740d97646bfd83aea8401336aba0faaff1f5bb65269176c497dc021ae63c3d9e0138a0b054dc17623e5f0f38c203d02c803d0df5e316b9899bd11de14ece28fc8aae0626ffb8f47aeb7b52a6d5b5f9ee7e74d074157b9ab6aae71258e5133a24f8b8f04fd259c2fd95de03084b7f1efdd5e32b682389c052ab680a0713d21c1d319e86b136862af426ce4be78c27e7626bd2475b7708d465859a2c7741d575ef1fa8f2d69409d366859452c90075fb242a894bd478c07df822c6a12fd5e2eea3a91e594652a8675b9a783f390f33034bf84f605c8e796411693390b739c22f3fb647e687da2c8bdc4dc13abc2127a6e0bf6eae7a21fa31bb422b2298d33ddfce306cbe23925ce9ef86b96ddc9e1a8dea662c5cb6990c8bfb95f47f590d1aa655fed50ca2e402299f2da6fe20eed56071d5d293985f771adb4ad7ce824e232ede08caf68a37e4f3f12ad11510791dc67ef4a77aa9d90387624a1c389cfd1e1c703693a465f2ccedef6582db35a7bd6717abf53a7070777a987b0be42e84d41b1470773fba7f80c2a0c7017716e17bec47e202fa758c9d9a86c6ecfac04a0dd1d19ebfef1245c8180c3695123c8d21fd138118e341963b90331306a4dab790e6afa8b4dbf4ac6e983c9b87d42d15754185707d1d5bf41a03a84ba20805332703b6769b2ce81c38e937df1fe473df4061a49779cf4b10029ceb54084ec82698d0eff0bf0976fdf0b305e8a56b9655490478de56219a51bb030618809facf8acf461ff679b27b75ca0afa061901cdd5ad30a2e5a3ccf1e0cdf007e522338112b181489da0a82b245563cee9b7c8fe13976616dcf4872e1bed9e26dc501f4dadde31177617d1057727db4b99a5676c8af948585fb6c0c019998b3cf226268b98afe5fb2441c570cadbe20eba7475afa84d57f5c27d124e665c57b8bb16d1d17f9100621cb10e13abcc1876b0a77c2df80e356dc9a9f42f8ea074389ba4b9a5df3c20fab3e81364a682df1210b0d36df6b6312ec9efdee9ff00712b1852367f140bc813ae496dca279aa66f5f2323e620c00bc737913b1433e6cf0eb5a1e0d3da8a564b506785dacb7e2efcf060d63d02c605b5b740a124c9ddfe51f806413a7f325c103ec4f41cfea7a939790c72c91932bf78bd70a9a22d508fa35401c0199e8e69f0ede420e72d91d5b35d887220d090a99ebea3acf2dae8e3615e26e607a508d06bd24794eff4d714d912676cbac56a44763f5c33bd5f01aa2a7ae83b6b2f3c5fef8051d88dd0e1e7494c2bcb2d741a30bdb3fcd6683625344d4eb838ea9993490a7ca564574e4cdd524f3805cf494aced3b117fd79dcde22682e3966dc60a82c3b3bc4b0c2c97267a2a03ea536d156af46bb301168df96e509adce2dd730d58a0022025656deed06a8f38231ea88d8228536d7cabb9aea0c8051f9265186c5e2d7d410bd89fb274ad39db53450fc39f91dc87181f8bb42098a9f4cc8e1bed3b740c6626ee2aabb94c1233a15008816738ec48fcf869d295c870a2b8dee559977d98d69e2e76a1484e018a36c8fd8d82246cf951c1bdd2a75e417380dfde771c4e07da9a21eb5cc8bbed263a3555b0995d45e23effee7aff6403ad49196e1170f143ba424df2a3e29bc050d41d78b254ec5d4bec3c649345e1a0993e13feed3b6e32bebf3cf1403ef761502c0ace5b5ad89e7c82ff87e421deff7f8455f4d526cbbe2e397652f983d6b86e6b83bf735429efbc29d1bf37396208a74667ba8ed812ce51d7817b975941adf2b911b3c1e9e83755093974523875a358aad2b6e3fa4b4970c2e7d6e26a3f28233d3a120ec21c608d49bf0efec41fb8dcd81d529b347c19d32230c9a15bd8114b2089442286cd51ad12ebf50385692f79f9d0f57d2daf25c21ee2be9ed71450b08983b1c5de03f2fc8b469129255af078357306538eeb5585de871c9f84fccd9aa1b2c1bf72c72bc4dd574b3849fbe421b38fefe3fe3991638ba64b6d0a977153909dddd7e920e44b2fa689f79b52f1bb9cab17f626a0c1a64dc8b3d012ee22227dcc6bd7ec1705dbaabcb42fc36a00901750e653ae28cd944b74bc8f4407c94e90c8d58522b376ba752035a86948fae64d05c4c43dd99d76ae32ce7447ec4f20f31881a934fc1f30ba5a722a34f6c5066652190f7bbc1a939d8a5145c4a59ae0cb44d90dc9fae9879ef3d57dcc7b4b3889bf4dfd12d82a354105adcb623894d643d543788ab6ba054b72c568dadf72c3ded5c856a735b6a2c22a4acecaaf2449805229b11e377cf4e95faab5062a24f18e1bf3e2e5dca72347829016a3113183ad43f2812f85159a9f43eb2af7654808c11a346871d4e300f894e86a9667a5caf03006b062a96f4096a5f2905698c6519e58f4b2f6255481fee8b8934bb8676771a2cd0661aa702df60d26aecac986144e5f9c861ad8e1ee8106695a690c5fa25921af4bd49002abe603ef4efc026f99f9b792ad85f4718ea8776485996c75c2d033144662640c008e10b536934a6b27c5e640efe081eeaa9cc210dc82de9111fd6264c0b42d757517bbe02f38aa6207dd760c13d3883f8a856fd429cd6d9bd50935078172f32752a98dd80193283a8267ef60e3050f4c768a061a32211e7b571c34655143be09df6b0d06744bcfdcde8cd7a3251f21fdb6d31049c027fb19df5ce8e6f8cf97036486c3d05009a4306373b83da2c8c33a918915c89b860b5db4f4d8f33dbf85fd2822379f5c74b11e5b45199622a9ffeb51d49b018be75630200a8df2e9bb91df7465f2dc6135fd8f0c2983166d6adcf83cdb2c5b58f2e57869c78d4dc46ac291907a7bed27f39069bf487d254ab263499bc74f3ec94ebf1fd852626a967520fcc4875a3c76577396bdc98f2b82299ac6b5bf8d12a8a4ec0bb5d493b32783b30658b5182f1609adfc4bd54190dd788b58d4ec6c40bb9b75264874a98e3f3d8498932b3c30ceb04685b4941cbc23473ee53e76762ecbdc6156d85b2b65a54b9a9bbe124ea668f447183e2da7171c3db9563c8433459f0eb885afb0a19f2254fdf52191d6f9aa7fb79c33c96a0a90030694163e2aed01da839a139c94a47e00b69004d15d905df69efbd98feefb46412d8614cde38fb7e8c97d4d478bdc81f9cc52aff96ad54904041c79a8ba53079e34137e59e6918adf9216a5d80eaff2e447256932862f354ff2e75a3b577b9bc225259b09bc5d4268e64d6277a5859b6c30f07ca43806ea7f6f44c6714bd9ca5607a3b406ec59a72ace0ace4ed9c642378e9b2e7608c3313d841b037220d75c02e3741178feef80ce51352f8231dab0ed690dc8d17eccd03138545a655ddc186dc082fa867a8697fb78b6ce3e3629ad37c93091dc238a8f0293d713728b4fc740a6b4b758e985b25a4a75f3a86e1c01bdb7ebd3c07e6538589d8c76c3319a31229ef28f17d3569a92cf5ae6e8631973263a26d4a418c691dd5f5ccb7dd7241ebcae24ccebbe60174c0f4eee279d89cc1a5bc9deb177136437e02d59cb065556b6e132b4fb340bf1301337548da3d5d44321bd370e25b6770e28e969d34495a0b73c059070bcbfefe5e2ff6141fc63534694e827e5aa15920b407643bd1c4cc667c983a771dfe4da14848c5a6c339d11cebc33f85b8c9a7fd52fbe2fb213e28e6f8f95432723e27a6402c88a35cdead581a286f09a55ab0515fda775dab3bfc1779624aaba1322977e639938c554b169074dca59ca8cb2eb73b31b5c5c834c2726e7162551340af909afe9ab43505c9309c5e57912ba16fa9658012d600bef87258955fc14100367aeee9f2cd847521c2f13c1999b663ffa27f4403110d411aa1b84c7772c2e76ab1529a303acc3fbcc203e45008d1895b3cd90c2ad92651b59b1e156dec116c98be568dd78e64bbf6a854e58f80f5980ec31326eec0e46735a8fa7e978fa5166d0c7b135d3af6806c0054ce4c749af686ffbe52c35ad0083755cde678e0066b342620e935b2ea03894493fd0b664a5b502d2aee4cf961ab274c18eba68fbdd1aa85f86df598c7ebdaff82f040d88c0cf6e5e977e03f31c671d65c0c94e123f01cb65210115f087fdd9bb246714dc8a1e7a48a7e319e98f0c3af17c7c886d12d2741de8e1d7834561d93a27e313898a0bf038e6f959a2fa08910cc8bb5d35e1f4692ee267e76c3f4f791c3f5f51b648fc96d55da90a46e5c3eb5fae6e179231cf7342187c8cd4fd307f0a75c4178c4d5a36c813dc76fcd8a50f91357dfcab8ccb59fe900610e3086db4abd0f8ad33208e96b810 MD = 339bdcbad66c73c3ac55d2fb66f3c3ef4fdc882b45493d04ff63d87ec93f402468ae062057e330cd196812fa7aff006e Len = 97648 Msg = 52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d50637fdf9425d4512bda89f82564c8e79595e8a53b4537df60a2f75902c8a62a31928329b9af4da301f84e4f330098839ded8fa75887a7eb278f6f35a152cf5d937e8d9da03316432a5d7ca97642bb670a5740c75a58ac7aa497d58919950d8e3dcfa82390dab89b6eb21bf03450b8fda47a05ed8bdfcdf4a063303db0b8eb23f82ed9a3d3ccba11959f340bb65217ac33ffe501314592c1e39b8838afe3ee858c432a05af30a40f66cbcde2447161db7e8de9ec95b1834935e6e5645e40a01cc1b5a2316d2efffcaadff15d25d41df44ecd1794ff4c29f45eec50a804f488505f2c491054f052402982a564a3a5d35e6b6779e2b63e0b2b2556d0ecea2a2e8a2d522888ae9b2543ab5df3df04090b819d0217be04aeb15454cc6e1859081b30f4cc4682c15a016cf818e2b6912a4ec5ac46f7112fc4a4d9b1f5311597b6d6ac7c45ace7d7536c25d75a7ad1923023925fdd23c180aa6b20057a21c9ec5de7648d63609d36aef0d612cbc4184f4313507f6ca3b83f858e931702461da225d7c2efce6c8e269415e56f14c7740f89a567d49e7ddcb4809698b136a9f900352d2c692fd7a0f12d62bbb7dd8ccb1c2d613f2618bb1727c00a9999be51464db6710cc52eaabddea05fc0b1cd1907bc55cf403d856550df7072fd984146ead2cf2cc9c972eccc3416945c278d780e382a78d3e18b816f25b6572c766891cfd7a9e5cb3ea4a5b53cb68af8dfc5b1cad8d3e35ed9d2195b41ba3f8efbda39dba36b247aeb6bde603ea9c8faa31cca21e378984bee0334fe7ba5b58bef3f46f8803e713e9a709eb58116d6cc393acdfda3432000e8c6db3f1a9f3e8b1941c10db44a557f115bed9c4f263dd469c8c1455e5a02e78fc2150668cf64f64286b10288b657a519d3d3fdee00847cfd6eafe15de5c666aaa0ea3bab5eae3432b61ebf44ab00187a8059c0a7ce332bbbd39eb8e80df5e7030762c72c74a4adb17a102b3050d640fc0b86cdc2b5d3486da096b446f916d160a086903337cfc9877a903094ce6386671c630c87dfeb3dd97ca0bcc1d3b18c8a135d7f08d2b6f17b5da5b5b74c2f50825af6653e740371c810c2b99fc04e804907ef7cf26be28b57cb58a3e2f3c007166e49c12e9ba34c0104069129ea7615642545703a2bd901e16eb0e05deba014ebff6406a07d54364eff742da779b0b3a5146641293925b9e2ebb555705b57ddc9b64d1edc429d9775a91375619585c2d27c5ad905be4d1d21ed6fea636b6bcc783b0eef2a1107d73fabeb519e647caab4072a1e16e1da93681ae7887d456648bf35af63d212195e74ad04aaa8111dd3135bddfaa6cb53857d1a2415070ed0b8684d36611b6f5b95dc566766c5c2f0a5b7207b54fba3405a29962e7a49f12f86392aadd04f4d55e23e4f1b6f3ea07e8967ff0d135e922a7a34360ea08b140d19fb751b9ab4d790ae643f28ab5bd24ee5ed9f9a2117c0984d66a1cb6e159ff1d975d589a69232936214cf97046380e8220faa2a656e54123b87806dcb2ebb642e71f3fedc3389e66417a76f61a0d4d5a996c5c6c7ab7620ac5e7afda12090ed80b5768224de02121e356eb8a958f49ce1499a742f15504b08b43881d7314514370b071d66dac59ef635cd7ac6d408c531f2d13e85f5071ab751610455aa0261bb394ed88a70fb1256e16bbe9f5c39d90357122cb193c61621fd9e8b03d3f15d7507f2ba78e8ccf7a5fff18b1c37ae5fbe4204459c37b3c5ae809720c9f3378fcb3f9ccc198a5fd34b5806ea25af91dfc9794f912c29f6b1c7a1f3ca8f53ff7f26a7f315539ddd31b0b453e2a20a07e18ec49c184ab0b862d2295b923d3c6fb6ef09a09d0f6b6d963cdb7f7b7b913aee74ed93e3df16215f39e1767ebbf4afbb8c2b4a6c363a388c579433bd998c528de3badbf9d1a15830628eed99f1c3e81667d59a8bae53669a69a817b1e243764743f51d620a9a865db7fb67e8c7f34250e6d1370161fe1e49dae0d25e3ffdcfa3fd6400277049d26e9eef8d7526cbe4f073e6cbd63583881f12020dcd9804852977d02d4fedf565ec81310747f492f77e75dbfb121429cda679d66f04d69ebf611a004be268e7665fc78a7c661b91a283547971bee53915667726a10ddf14a5d44ebe03e9c868fe4dd8c294db81100e867788d5e290fb87e675b84af09dae61097cd0fd6af7be55401ca1f8ad1056620f48d0ce84fcb74caed95513b3f7b318880affe070dc3192bffbef50e4aeadc7a62e1805ae13b58b460dc5a460d46df5da621354005f0bde53dd734389455b65d4912a2267bc3c6d3777d0a4fe1e221d86ead40324689260822af67aa2bca96320d9ccccb8df961a07813ebc96bc1bbb140c0a92e3df1041d74a409d3afbdfea136fc7aba76509b94192d6932f96a0f50d2f7cac46accba8d7a5195356ea452133b9e2683f34de736a1161d2d194f8f3f8baf3f753b80cbe0ca34944007123310b20e7ab85355d6f0c68a820849e6dde5d17371b14e91aaafdad97193f78c041200d9c1b8350cdd6aefe7026519c45dec4ad10c191283f953229cc7a1ce7657afce6cb61406e78cfd93b848b3f76c91ab6e44691d15ec1a73481b00e9da65a0426143a25c475a4831487abf8571441bbba24a032dc71e9078a1b0b7ecd9de7062600b20e184f9a19e74aac15a05ef5e859d5e74dba4bffdebc61a571b1b554a88511fac443e2a2badaec5089223d2cca1a5fe38974d24b5353b9469053d4e814caaedcf04d18038e76d55ffde5973089852b5c8f10f0148fd68db583bae3ec6f7d411e3a3fd707bc426ea118f256474c229f1a06998ca4bacd44bbf1eecba8e4263189492009f46dc71ddd835060ba3b7a24e497148d41fbc0462083f87264984ee6e5c6f89513c88b4bdde5079fd180142384ea8bdd347a38fbace0dfc268b67cc8fa58cf63acf6186167e720f9d3407802c0a60563c560bdcb26b0aba2fb64393f8fa8ae5b071ef6c54431a2580aa62f2b61738b073bd5d51e589d64f967ca0cb36e5d9c656b69abe13c6a95a3bcd7c0042ffb24b1e0000a5c084d13b1f2127d8c5d20a26922ffc11c163a01c232feb3f7f1e3d849fa0ae3edff68c0b1e56114322599c74f7207c0dd9c4bef9cb441916a71d6afb7d21ae839059771e188e25a0d8e6f13ffa4a92e8e9442661b89c8e1c7757ab2e3b059a2a9e282302922bad6855f4b8e61ff0f9596c7ca6f26fbbc2b75c677e8b6dbef98a35dd00471fd14110362d4415ecd5e7c5dfd8911a55045f8dc2c765a169d0352903f29f6a15f1691ed5db333dc54c16c4bfd275481d18ace646e1f0eec3cbd59d950370ca191e8e0ad198f6cc4de5eecc8914d40a0c6b4387556190e21014634e4589f5059dbb386a95e11f5ffb15d843c7fa3deeb77eabb77aa0d629b34c66b1b1f0ccab2849f094bf3e1d57415e7bc0f90d0354a2b55e1d233a210441d6487e56c248192d6d3f3faa2a6140a54241da98c7d4da62c1d31eeb981220304490fa9098f7de31778cb1d3108bbabb53b2e723b512fe5c069333404519fbf309d8bd1bcf6c68b90b51a1e69b1d13e7f5477d365f5e2f13061700adbbb9062ea8784c44e01657489b3676412465eaafb998132d1106eb0c42f6fd90767fcd37a2f81ea8757618449993a57f4726bd97130d3f8484bdc0cc3f8b80a51fcebfa28be0aab2ea1c2a51a901b5fd6dbfeb22841f68e924e33ec77e7d4037e2366bf3c5ca76f0d8690be42c093e48229221d6af5705a77c07b3726214a2e5983730afd30e19eeaafd4b60a50294ebe05dc027d73cbc6bf49bdd719d1a2f2a9c51dc3b4633fa08ec39677ba69660553173649aae48e39319200b3981d65b6359069d2a91c4addc16bdce89a32d171090637db3970421b96434cb3ea2d1ae4c68d611f248488be4a4fb0f1f2d4f2fba77ae79e723e6ed3b604a9bf592a49e324630c936dc383a9f316197a09765109f71d4f7b9d779acb597b20bf2b3c7b1b17bb7214cb00c3078269206b28417705bf94765a01424f6a4753b89ba98a36f4673d9c8b8864ce41c0efcbac975deb55c88a6524e7c8131847327a3b1b3d05d6db9091e1ea162ebd755124269ef13563daa522bf9731713d23c16c88c97c6d293d5d59fc3a3e6be5693633bf8525de95bd8db71559a4ee41a1a79868fa70f855534bfdc6bf060b206347ff6093226d5538eb2b0d7549148d8a8c06c4f8412dc2e6038426c39498d52d2c90f211106a0a1467878e32496a87a51abd85091694d8bd2cf6038c109a6e8d8cee5b47175d1b19a8d282dacc7898bcf7c5917617b600a26f5c4763a397524c0f22857d5dcff20f5714d0b3f9c72895cb26d2876e1aa05b74bdd9907519e9325e3356fb0d48f6be1b566006f9dea0fa3fe82f83404922b1e221a15bada79b062129b8084d4e8fee9d9f1a1af44566b1fa148fb4b8c9ec6c6290870c73cad092ff0c92ee456b256685f7e6391185e482a5b2dc60fb2468549b1373eaf108f09ca1e5cbf31f2620ef7a66aca978258137e8c8fdd034e1fc3036b14d3e4cec63edafbb4d600007e95124f554b352ada4966a60da4c898912cada73fd50affb914dd097ff7d1297e6542cabc69fc7a6b769d4815b1b22a311e8305f6b6840bfe383ac80c9917d5d80bf3a91eab5fe972176cd34688728b76153df8080ce27bfbf59ec7e93e669e21f5cf5ada83d20084a86fe80e9d6c34e6ad390db22c98d838e95389945c2fdac2cf10609e97e54819a600f6dc6511aef9330eb7a3aa39a94b90037dac86e61450d4714ad93c1c38b79cea703e740562246319764b1a27579a66292480232be352c26c89f904e94ad4f966e4b34eb9e6feb9f3da16d0f47babf83f1ecdc553c02f056cae9c66df07084810e4c96991b5fe842843a583237e06b2afacc3e210236c09ec1931f66ff5b80572c0ef394f579a6e2153659526e72112158f211dc395806c756a38280e8f6abe0739a352253458d47979d57b813f81b2eb1663bcf08f1299a3023d604d4c96ee388f7428c5d4c0638b3773cad4ffaf01aae2ea642988891dcf81a053aea5d2f2a162d041a3d15777f11cdef774a01f8acf654387c10a5a6585591f66a5339577bc3456113182949e258a6585e2b949bae32e0dbc799d1cfd5f08f91dc36e54f9f374643c1190ee52a310b5fac1b3c41e609d876695b92771a701cbed8bcea7e5e1b38916a654eb11f4303eca74180521e2446f1ab7d7303f07e4065a50dcf4b7f17243357277117883796e799c6e8361c2a3134d528f9dc1fc2046e8c501c20ccd21110d085fd7e2eb4cc38c8d1fc55a9c4a2262f83ae6a6fe36fc1d5ae5a640bf507121ca77c4eda63aec77d8b45188c9aa0b101b71915a88a8a47c84e107e05270e2085b675ee52eb437cff1b4ae58f5333bc92ebc246915e5ce6ac59c6d882112f2251da71c85ef6944098aa9325789763302b483263f308ed87cbf604d94a5b7101c93af743c829a7f98e60a941101039f314f6f0d6962f45136b4e53e924acdda335ff8fc7572e86912a64139f1f64bcee951c8405427c6d70d5883a70d9ac79f1dd50c1bcd2ad39eeb4df59a96d3bf509f6e2775abf966c8851cd42d632044fd30856168b024dc6fa74f804c6c13eea2d7e71503bd4274a412645f184f45c67320039159aafb7379bb1d89b5de414a54076f197124bd40f859e17d2e0ea5bc7f40b204752a09394bbb5a6a6d89f662e2b268ad546ea47c43bff6c6a53dbaa79037233321b9f88e341c68bae9eb8dc8bd7d662903f7a28714b926b43468ef185457d9c605e723e2e152daf3a17f71dc62bcea45365c21e1c9c9f3de41fccd7f1a473805981e25e7c1f3239d2ab26d2e70e5576a3208cd2cf186e09d5485d04c7079e0aa3eeb790d6471c52fec20ba2f46ab5000ad89eec91a646f89f2709210f55445fc80bb97b4375352147c47036f726346b0ff5c1136b2e7132c92698d6cf78aeaa5042b0c8cb91c3cf34191b35f72a1bdf3bdfbdef639935dedbabd1ca11572411c1fa631e76830f834e29d448fd5eb28314fe5a2984cddb245d207da6dcdaedbca59a9b264d3361661b5d651710aa408024bb6069d3b3aa2dd8ec641139e953d4838c2088578901a0251b954938f60ffef37c96565a33ec21d4774eb42e6c9c81e437baeb9c6e3658f4cc2b877d2a652407aac5992036e728d7290336c64b11ea4f0331f725c849b60ed9f078e82e8b1aeaaeb5da2da2e5686b6a4a41066efa384c584c55f98182e3fda8acc580eac90924ee2ec08a612c0c17a2ed7af8be9f92639ed4ad207f290749a326154e4666193bd4f8f33e59043a6439b28ba32147211d3d92a6a3ac864978312811582bac71b9c7da1c5174b71ad897621c0f803c0d019d4be989eee1d214b97861a87fe13a262e9ee3cc988cd6fd24c5d445c4c47d9827ca1eda2f81caa5a5dfac462c4e9b08730aefb6afca935b49a25c4cd328996841d6ec9f56af58b15c259a38183bbde9fde7e917a0ba7c786cc25b2c97b08bfb5436fbdf4bb3a4c24612d4882defc75034fc78f753a4b6def7ee7aeef7a378d9c9b3f4a2f6d5d75fcb6e023e51b4e2c68013455fb0d06c1550ec6199da4b8b8806157ff03f5d19115300cc606ed036d249f2f7569f85c4a3e184b7352aeee992752443d20e92915e4691d8f86b8ceafcf76237e5080ce612108025cbced5bd7f7da7e94f4bbd68d10ce9d10d303027ccf22bad13d3adfbea47a75261ae482dd585681870de26c5ef0dd05da8a50414cba31500e8e8b02bb1edc0e702b28e611ef72d793caf15d142b20e24d0b250da8070e8d96c2f5d9df169948bb3c2f182e13abfb4bba6d2b451616acf8d3f5ba073c26bdfa891fc7a3125ebe77ec6b7b8a7b6e670f5aca495a483ae06e7346e8f2d0267bba3f4d4e9fa888ca26aa6292af7d36955f3a7d59cc481a070e779d1cf3596a51465422e13d3fa41657f4a8f0159f9120cbc81abf338c109b694f6cc8713e8ea93f761522044e3d0d8c69a31645590a73d58206fbf88adb080f794a7df505e01e0603b8837d5ac02a2467f567c7400f190d06e682b3dac5f751639a9007362b1a2a8b618800fbb9f6c08df48713db1b8ab2b51e05cde25dc3dfbce1b12045bc181d8bc492479796fdd12a44d6a390cc43971b31d7df382f081ae3c453c8cb1fa27f734654b9c4e399e6eb4ae8fee77dce0aa7b68b4042a63e935696fa792cb24390d05b21cfea3c75624f9b309e65bca48df9109299a85fd1c9a3fe17b9e130762231979c029dedfae3a59a300a921541a18dd48063cfb86c3e5a5e2df38f06a483f57015fa5694a4ebabec89bbd2f43fe5b466d7073f4c5851c82bcfbe9ca16936ca7941ff8aad0ddab0f6803acef5e9bb2b7bf91c6d8830b49c0b5f8380ad4ecaff1782bac0b38041634cc60fec76f9a24158791bd0f88fc734616feae166afb121df6a949f24c6a02143cd939213ca2b9490e98e0019c01a3fc2734d157a0679c1456c255c9d2b87799ff96e7648f5c7a3b99cdb81787c2e0ca2fc32c3540d855bce09d5af793957eaa5fc08ff82e706ed37358ccb710e6329878d3441910f846fedc63dfe457aa1d2fa27fba45e1859efae362a44a0116a14e488ba369da6c76c3913b6df8e69e5e1111faefb3724310963013c93920f936d4e813d08f64dfedf1484e8b9b071a4936f45ab6aaa754ce90a392c2eb3638f812a09453f177f7b47149c3c13584c6e58793c697924a5de0d1840817c70a7af0f1b736b5f9da5cd22cdcc3972e23493aec35671bd321094c401b9c51376668245777207d0d57b74f09497696eead4c504e2465c9d5f5fd1cc4af77f7a110a99e2d267b3397b4b034efd70345dde9763093a6e72a008de4584789c0916fd1e6665c0d6e5ffebaee88c8cf932c64a170e1a50415c4bdb36406b0f2a0a80871c782cb74228aaa311a537b794dd4e99be16b6a861822722d2530e7303fc3d4b8f3fc61a2be3b03e1db9ef01d5ac4d6a072d7cc7318c989c4d0ddd38bc46a3b6e13dc08e16bfb7191da700f03e1849178cb2cb2153c4368400d165e4d5725a55ace28a77751515c0bbfd1c0730b9d84eb937203b2ad16796983e26fbc227d7a45cdea25ad97c52c1531c9ebb4009615c172b1a99393cd2207db49ef224af922f7b8296ccb66df4978d861780fe7f7aec112f28b0015edcde1bd53c4c5fa22063836ee6319e5281bfc5da04fcce849b6b5183c91405b00e1c0cf09d7ee587e8cd0ef40f2df3d270b68688f58332d1395632f98a39d8e8ec66cbc7210e48c971d868c27016495647f86a0347c8bdbddb293fd0da95dd61de3ad2a9657f1bff52223b5ab78f11668e01cae99a11e1d30770f2aa38bc95a37a24bc27e955b191e017011d53fcee7ba97f339c6b03219924b9e5f62312943636a0d2b31b06bc19c243249ac3f4332e30ad3eac19210f78e9607445384c5b82aa4bc0db79269e0f7f13404385e981c69a38369942d00e0a9c113807d6ae4e212b6201219219d9db5d23deb828514cfd6c9cd5d476b49fc6d328abce9ccd0e9a50901e05e474e21602e14a6919d0073b1e3776fe03335726152349f9d93cff46b05271f8eebc6937f6c82dc6e8ca42f835b4a46696c0a6b0d89d8d2a3a52a2beb125a78b2f54b1c9bf64f351f3c482cd3980e8be900110efa4040fc03ec29b7ad996192d14c26e43b33435bae93349229028be569d69284afdd32c6c34f13c0390005 MD = 1ea47ea434f0654e4c183c7bbc6880577bc2ddab5037393115d2bca4ac5b0fc9cad4ea2542fbea7186507135249150e8 Len = 98440 Msg = 92d9f3841f99bf3ce5b946397f7a8ff2d4395abb3cfc61f4e54bdf8074414f79efe27621daafa31ca07836dd35725f5ffa892815e1f7b623d116cbce4c7290314f239232795a0ab57039611081e8f3be86e514570d9b50bfb637f79eddb7da1179434fa044c17b6f1da4d0b8aa04d47841f424690910b9315c556bd97036b38037ebb551830d7eb26e608abef9f089f6f35f62331d7d79e08b192e654d17a6e64fc3cd2e7e659be62c16970bb6d19a9f64cdd69e900a16330b2a472cbc8338ac8a729e1f7df25b731f6d008629d290da5be78790ace11a94a332c11505a2f338b0a1300dc7db45c20f0ecc169918f211a2557df2b7270d6a1dd6a1076f9b5ef389f78cdea549e239c4a003a550ce48abffbec0adfa07751c3fc0f1ec43970145dc1db97c5f64b84105ccae1a941a1b103bca59a7bda7dc14d298b9abcabd659773babfcd3d5351439c3ad35cae24f1a71e224fca482fc9b99d05ff2c4936114f1477a7bb863f35a54f917d55e61555da6f6eaafde2c8c5736ab0cd570b298dd788fc782d844fead1e779b1ec8315cc10f8557227d49a57aaff412a1457bf629597f03a0a7dacfa2d2c9c7909cf4be0b27f80b03267cc07c6255f1f4b741f17f308fcf63cba7ded23e59fdc9410e01826cd976c05e0865d2fa4b2b2e4ab733457a5c7b3aa83eb4919dc2de3768ffcfcd5aa41ac888af2e24e44e3edc744e0422b34fa793c201e9879d7ec949594c51527dd267aa3ac351d89cd9ad8dc8790c8d67e3c50dad83d61aa9f84f9da6666ea8530efdd3e8d7a9649067e7a0cbbab4ec04b36416cf4712d14fc9e1a2d4f0504556944de4176e7d6f7b838db3d2a585c51638f53dabce1831fb5e2fd7795cbe90051cc8394afa464f9ab7003581ac07bf18df08f0c78b6eb3394f7ac9e81df23efb030d62080dac8b9a7cdfb46d40b32089301fbeb7017edb85f862f8c5b693a894e18dfcb31b18b9d74f7caeda0600afe3b69a25dec2d1216df368c276b93b435f22aa57e0950340fd9977837c5e78a3b4ed1894b331fe1b5dcb0cd59f8831b5d6611302251e04b76a0550e0b8dca3a2793e0ba9e8e16e3fe1e9bfa094c61f6687073889d5288593a8fd893503e2ea22bd43f3c3c453a9e576ca0191fad56cebed9f9b6d95171e5c26fc90ff0213d4badd795170fa0b29c298f673482648a2ac7684ac1bc99c2777807cf8ad27e1fbc17658b53fee6a765dd5097521cb92492eae70fb13071a497c321930dde9dfc7dcf46c9f9f061407fd975d87cd4f34c8e921cef8e1c203fce0b83bc9ffcc5fb173f42f611cf57a67487c6d4b9925c2ca724d1936167efbaa3b9f6f34914404411cd21baa1821100cc4e0d30113e3ae96409cca232fb263e9f3342e0120e5400f3e3aabfb3f1d7770d9510978cc1d6ae4ea9d6c507bf0df248e22f2a02d24a5746e8a6aa4e04f133c1c698af330178a1eb6cb6a4ea9bebff292e857a21496a709044de267ba3a65b6f486d200de768eac6bb36e6e2770a8cc7800b777859fb745c5e17d941b63f18a0835793225bedb264fc1c33f73bb0c2ac3e8aca0eeb478a2fa01c6ba8250491dbdf1eb07b4650214f99313532d026c95fd2cb1aebe894db9371b485b8d83defa8c4891e1f8eda5e0ef83d919a1cb4c868a2931018362b8f0f39a6cf7ab732598f9a6286161dd092298308f23808a1e75018ad549cbf54cd2c61bbf0f5ab2bf819c96f8f69d97de428a059fe127c37509d9ae08d7f6956bd704fbb91319a6ff3cdb979e21fac287d94b9f95d3361bc28da92f363ca1e7b88656c6e59376e477334d24726407d1884f535b1b8a09d799a8c67af8084c5095693209bf10e0dfba0d47da304d5339622d17c47b7621ab6cb3d81dc89b546494e81d40c00be61d3a138205324e5b8ea7fb2f6830182bebbe67448422965898399b7ee872f5050169fe525202d78f35cc21f0b2f3f0873cf11ba24a8069d75ff5ebdd8d526cbc40ec165f2d2c896cc3414a1231118fa203b74967dd7c864f404c61cf8be8c37a401303ef1319c482bb99cbfa6f33562ad483990bb9818c3eedbf95bb809099dd83813fb88045295f8348301fc9b3d47013b853046b19ec149cd1e027f80470447fb9321211591861bedf0ef8dd1d9b2065f83ff86ea0166ee205e99b4e9eb74db92d83a232a02227d2c0c12c15fb1aaa3fb5884e40de9bac51ce0a9c10da0f57b4409cef60c4c710439fef1010c6c37c0562f47c6e000c6b60bcdb90db40c900f5a4f630283187b995bef14b39fb36146b92ed1952deb91aa334c5200a5d74c801cd183ae570e4925dc070441e12d311b6c7da9baba552387de86fb02aaaa32b4d2b8b5644fd5e28e026d48119a83ae28b745579b4fe4853752a23c7b892d4894c42b828c34164ebe164a688d915ce155e2ae64a2b640bea0d7c99dd30b0798083a53708cce78969b5fc5ed1b9061d08b34df5736b612d6acb723a772f8e02af97b5709cde5a4c10f27075e255d3a85b0f601b8be1602d64238d7e1c11862044dd060d5b74141d701b4384312c18e08ad713b10a49fb7c549a40ed426333330ee81965bb3a9f8e158507e254a84055f6beab6e64f19daabab41ef060a10fbb6c2d6202327e771e5fe41048a356e4894d1ac99c2274c12914f58a301d678639cb31627b57cc153eedacff0fd3b47ffafc6fe0d2c94ff087e1d30514df03312eca88bd29a1b004701d4446b03c4d6d2b634273aadfefc647afd132270c209b2ae887b4a596a6cf428d4e69c2638e467b3027047cccd09cd8dd7473ef4b2c2e8e83d2fb67ad3cc036ac2ffacedff3969ad18215d1269efebc09315cc612a255ea4aeef3f85bde91bd086d5c2e0819d7ead5e82a3063b75671a19c5f43d91fbbce9c3030d03908ce56009b0078826d84ebabcda4230a965e9a3519fe0124f0ca9c064b2477cb37b082431daa36c57b182dc1a7361181c86186424ebb567cc20ce2f79451676907f2d24e79abd157af2c21b60932947fd9f9d6478f09ec56fffd341ea04a17b8e5ffc6714377d09f961b5807683c244b2791fac37f7c1b3a2705ffb9f37111215e51cf59efa0cd23ac70412448b5397a5dc4742474846b9cd3d1a6781268dc48dd736d66f2b92f8a7eb57dab2f204c93c8fbd30922b565f562cae8c76193e175efef1136d123601a69754dea902ff61e15c287efee8192ea606c07267574b95f122f6b282f62177a191a6280f0169e7fb09313275c6b6ad2592fb223d29ddc6ac0becbe95217be1ffa2f3c0ce386de3f25f7f56de0e55653b9a04a3ded71c31f8807c3c8dd96bc82892e4acccef30de2d26bbf1200920dc51e486fd34a92f5e3e4a4e36546719b3842920f6f36edd6016268c0c25fc3d9ccd3a273926e63fd5e43109b3d113ae2a7b2f50a629fc9aef14269baed432d42d19628f5e9bd8731f54fd56bcec2452b5756b1bc258e28f158ff08fdf15f20e159b2467747dc5f4c3f476dc588de42cdddaa62a546769e659ef4a11a7d08312debd4a5784b3f6e9492e64448f9c99652912a824633ed6c4439dfdc90fed2e090fe69a069425b37b3a698e3569018c24228539b2f8c574535cffd15e1e553b1b317dde1dafbb44d21c0cbd58efa405924e9b217c1ae48abb2b7e8d79ddeef26fcbecdc43da5df0157a81b955286e4bd737bd2729d1835f243983fbc152a19a2e659a5d211ff3006dd92f4ad31d45a81a65511561258a3cb50c74e1df87577d7f88ef285f8565bc01c37e387ad41362835fc1b1ce1fe169962eba087a84f6e18bba5307a4149b6cfabfd64af357bec23cad73c416c6702ef027be383b4f670f7a862ec098d57d587f569f49e6ae2f106ad7d115e12320d3eb7de738c9f2934f7371e81ce4cff4c8b90e41fefadf4f943865416ed83cd79faeba9cd2ce7561e99e05e9e3300be603cf72242ed8f40596cce02d95a21b7edb626547ccefdeb82424c99add238f3d52ea07b1a428f4385d4ed0fc53e8c8fed02e074fefd63782492d4561d16665dffd32574e2791e8d232e7bb167052493dc33b271c032b88a6a0e002a789a195b64ccee9647ebbd7ba5dbe2be3b487a825ffb04d16d095d70c716687d5cb7b25a886e7455c724fc9d826fda7cbe730ed9dcbb602a51dbd2e9c04e75c51609c1f9ff5a4f49ccbf5c714d4c9b836d0f41e8c6e75cc31b44b943ea08a0a8510ad8a82df2e7d8e5154d756b14de48c387c45dc311436225be612da8f7718d7a2566f398dac6899cb15048603aeb635e77069745cbcc5e0db36ae5817d70eb1e03ed5ab47473e2403df538c1317b399a577933c379403d3fce472a081d2757a900ec4c255278599bf5bce5029ae65203a39ca1c09c577638598669a158fd49a7b6d4565fe73c85fc8317cbb8d9b53336d5f16fc1c76a9f940f9912f1a37b37969045e7c8b548cdee60865b38607053807917fc4b6d022fbf3b0fb45daf19a7f227b19f044f15b7ee08892215d1a0499d1760e5c20fb69d36765acc59be612146d797ea77173bca7805a0aee5bfbd7bc90b7caaca21e06e764bfad98a63da2a013a6948a5a0138c18c26d500c5d3060b0ffbbc9d836182a1b26605a4431fd38bddab638147c45634cd93fc41e6c91aec15ebea150ded64681803bcd3b9b42c3d9030f3757fe39e680b4a869805069ac9692f5efd86ea34a35f3edb0c5223351ef7dc4d4c4b8798c60ef37bec69b10e09d46e203e37807bbc4fbe683654957697d95878f0f3d8cdb49d35e4275bf3fe141e5036be68d5bf1ab02c6e3b0831780efd4b7c47bffdc49b82b8c83023f4f3520f7faa6761148b254a2ff202b620c2ec2c5e623bf61f05e483252fef09db752b6ea0842069636445e570fe73a689dc9a2e3931b3e26519f56924214c55d10a07055ecad0c9ead4e2489699761f954f7ecb83f196c9f88738fb5ca72f4efd3c4e9a5e8661cad362643c4accf36b6ca202cbe5aacef4ffd7130376c8803d889268f64bbfbab243973389349ed2d0355d8df5066542aba392f047198d276a9994bde1cb7ec3c964f9b7f7fb17fb97190986128f2ada360c3f3691eefc0c1d59cbb52386ca64595e12594d483f57073f2d57ea27ff7edc61664da79d20189eefbeb98326ab85a8596a7f55c21fcc6acf51674577ee16e6cb8f9d51cdfe313484f62fca50290eff7c8793d512be4306f3fd1eeb26fe8a9c71438e5926a0402940f981c0ae4de7a6eff3fb96df24a525d1bae4a4dd37c2467c098886520d2ec34a51152de81ef9e5db362160d25ad80d910f213744a2a72c136af39ff64de14bcb8555d9a6a42a0468d66bfb9367c6065c853d6d02461f965fed376dbd694308ea1ea88c8fe8634abd5d432ec953555a5aa3a00ec02c13cb871abcb84c683b44d0a3750d4bf18d01035310c21c276f4fb2f1b3e2255a6c14b479ea474e52b045a49c262583c88e6f613e398036eafb2f8df7dcb0dada10b90e932ae4692f8c558f92229cdf7350dc00a8282dbca4e140123e844286b4e902bcefe2554508b6bab90cd13a06fcb99207184494595d09cb6a4d145ed2eede36e7157c638be416bc49929bc6a16ab3d89f17f57cb31e5b17bcacf2cd6692d69fb68e5ed6e3cc94a568ace80a57c625f5f02ca3ac72eebf6e31e48856e9a7bb8352e1f276f4c718bb3de320ccd117f63221dfb6ed3fd61d16f17c3dc30436742be2969e0b67dd8a48f1beabd5b66510d75bb89607c2dd5d5823fc78db5e46e9df8f36cc5ce316d292abc6f1edafb95a2cc540acc2a20b677cefeca365a0df02e78148e332117bd8e294815bdb641abc7888fe5ee6876823ca7ed5252a7109a78adf544b559913857fd4794f697c901e05cb7a153a1bfd798af83f66f27acdc011d1e26b8d22e7bfb39236365da0236819b73d3a8703d1520385b0ce84623235c4817bada254fd6fc4f63e798077dc82fd74ce3395eaec947e4bb2c5aad241eeeb14a6785bd95f7efb291b7e9aaac255f929b56a2c7657294375ccb32a7201d3ceb5ec35815615d2a05355af73e0ddc754fe7b45144f19f79a298700cde97acdb58ad44adc762555fb9b7273d2c236c1581ca72e141e3ae8cb8f69145be0b4c2e7bbe62034de99ed532afc3181f7d42c4babc18cf68bc3e31dd1fc579cfeb89cad71aa1f51397884f2287b534628c0ee76d252c7803dbbcfda14c83258ec8d414fd4a9affb2dcb011ebc7540eafd00f121bae1477bdd2a964883540b56513b9b150b6a39f962994c200e7460351d9e1b948bf673ae12191faf43284b5fd6cb90463f75231482ea4d4047ff1bee31a156166c19b5e3858e52597fcc5b3b23440a2c9753d71432c7ecc58f9fd9dfe01289f085d374e0de94178d5dc9a1b2dfaef00d3c8bbbc11c3611f90dda02ced3f89c6bffab196ec430569205a5878bb2112a3255a539e2e842a422ea3bfe84b25b76cd022a0a55df6cf7b1a0eb749046769fe30b2ab8413ef08d894d4735c92444015eb5d6b05dd84fe2325620d08740e4396886a1a0a4c44ab4765f881064d1b92468413a734e57e1005d4ece02394b64df08ed9258d4255701304885f51f62c5c731cedbbcef032b3779b17c746e0dfd790c68854a99071f5d012fc64dc07f6dd2028343f109853470d0a6b38dee2eb7f0bc2103ddba13abae2f3cd48110cfbb2e2388f97c64840594a856fab580579a2a603d937901f002de039936f7d7fbb6c1dc0685c3c8a9a4894ae9d954ee30af1040e7be8634462cd3c56b7419ddaa667475257030fd9c1b39fe86d8d2fe60fd8aa4450b6c1cbf3277bddd174ee985d430350c4029ca04728a0c55809879908c81d37f029481011bb03314a6fdc53407db66e48018f98aaf66bb7f580c266765db16be2b642bb4ef686e3ba990375e075e4ed4b56450d5dcb4542ce997cf8e8f82b52a0f45e181b786b778a86e08abdda235056975988e005c1f83b9a23aac125cf8ea35a06d107af256f32cff00c5908e659e23b3985c244564ad5293306af753262725db9508409493d6bcabe651280925c86c861ae84f596bd23cd37970454e8908686022111154b546e1da84faaefdbcabcb56e4d9897f7b18fdcbdd65043467b68595dbd5f61a066d22f4a0652951736ec88bc0d8da9fdeaa1fe224f13def095804e48af9f6cecc730761033da1ed923aeb8d748d4ba2daae2a7f15bdf766b7176eb4f5281a585080188975281fb96136bdc4c89fe36eb84da40c7a713a81b91b4a6ce50869a0dabaded5bdcea99d278bc59986b7abecc0ae17f019b50e28568b20762241eb8eb24ce0aba5d94a812e608b72747ca90439fa0a93ba2f7c43d78f7939747ca80b1f5ca674f3ee074dbcde98b85c97e79f6d58065d278a8bba8451db1da361a9fd6a13b99970b7eae91a2c73d404af6da3a2f192b6276c4475a5f6d18a7697f54edc98a080e4dcfa3d9074a42c346d41fa21ec3606817ead5d82a9e0e8b7c794e4bb14e39317053f3165dbb42ab6796d8a32727ab5fe67d1586390929f2c988fa94fae0b39d0d9c2aee38b2a35517af93d1cabe72b66cfb54f8fd36e179eb3ed83e28f9fd9d9008a9a50ac8eb4cc18ebf929be04d08160632b4f9bfcb9d4bfb65cbade27ddf8239fdff5656911f0fc4da89fd4590d16c0e2d2eb10c5eb9865f21b20c42cacf6ea0a631adf42b385ce2631c7146f48ef973a2eab595016b04daaa85c6935ae9afcd2100742a10253357f7ce9a7cdead28e7426d69f25a3e51ee6ebb6f4ca4bae02ffcc03b50e6621da5f714db4fc5c884c96a1b609cdf8ff80accc768d73ebf8a39a8157601247b865cef83a648205d97aab8991c0cf7fc61d0633e35eb9f64288aa164c6c340de17dd5f9fadfe94c8cc0b8c5b0ebb39f029afb08468c23d4525837732801fd2062ca7a5cd34cb89b6bc5c73d5bb302bf7aa29333e7423aedf0bc4a803346f4e903f6c7090ed378593c32dfd9da404349f7dbd79c0ea684aae65ce925b764a1ce8ea6c4e8f29eb0edc8ae098174b9fea441edce2b03e08b71fbdf1f4afa838c38c98478e2c9d2e8c1d7e24c1d7246bc38208181c90d19d7abf6eef1d745c93e907e38ebddd99aa93c3176b0951c11036d5c3ff65c7679eec1a03069b4e0613e3c736a25c26c1c79c69d113dd1ba3f5eabbcce37cd84275a19c14e8ec9137114a671c12f7ac880e3c7e45bfcb994fb525a09d74c05804ca31d21ef68fe262249343fe510ec35ef6ca7cefef436f26b69e20b013bebb20f4f3487bc003c609b6450a77fd0fffd919ecf239f2d2e1bb72aab8af50e666199e8c5bc5c5d690b05ed616f37789d678d00a5abe9b08b58081d1d4e5acd60d611f63a8978876f6d876ccf60b40eadba0b1a922e818433f186cba11ed97ec05aa0fffab4b88734ce4a6a01429f9d163f3575ff7312b1102e58bb9dc41a2b6e336e8d6d05c364a278756f61dd9f2ac23e3198524342400856a7757b06c4db51a9a227fb464226a0b2310156f85dbf98fe270bf566b93805b39a82a1ad7f97530665560c3ddcd615c3a6aa485d806380c940574ea420a1ee8b5a697981f5665b90dea008b33a7bebf4fbf19fd2b11f62e5a303c7c51f84ab270eb26949cb50529136905771041d098d595ec42098fa269b7a97c6905de823cfdfe6dbcfac5d1e4f94ab613ce1c457d6e77a1d0fdcfcb533ea9cb5ce83d540cbf58c36d93e96a813217b8fdf7979bd16cecc1366262df5f51d99fb473853e962772ce2302902d824048747207543239735dd0fef1d96cf293b1600c3256b06dd8d4f479c16a997cc6657f2c97d2b719f453377706a3e2b166b9b2c0af2248084617ccde4ad94cb516f74f9a038388f772558b4b2b42df205d6b1e7e346873d9f183bdcd295ca5dfc4665c26e4f726567ffd42f7da46c0a3ea4df9918c99a2676dd14dc2c7753361514b2b7fa69e1dcb6f82d4f98e2025d09fcaeaa6f24672351d69035bbfa383ce400e43f0e2f8edaae3aed7bcd15f7d2ae06a582b1fff61d772b364f47c78059b03382c17049804895ed9b1de2e5545074ec4c89a6014dfa31058e9298853374c3d514a7e95ebf0fb438c09ca0fc20c1a5d32b2815d376a4c78c216775dd5a75630d2258411654155344e360cfff630c87e5cbc5c71d790181e77634a777fc43d903353c401b4644ba398cd137992519634ab3ca85865cfba63f1662f7fa21c86de0d4bbae129d83303e44579f706fd0802a6b9d15b6297980bb875a2a0fd1eb66cc883d52a662b9fe7b915ad12c481928ac7ca83f56e862558453830b5d15940eeed82af57d9cd06d19fe429376b9dca1f86d51cd0e9fa06ec10144618df4abab6f4cea5f3f53afc3401077aef6c9013437c6028585581a139b1a07f346771986766ce558958f3e48175161ea5380702991102231641ab88c3a25338a31a5c4e72cc184a827596546c748680e35e611c82dd1199752ee6220c5aa30eef5869515b9d22d169cb80c03777df5e44604cc5834944e80f8da0018643265e73b22745a4427496c9cb51bc850796e322be18a23cdde2bb3fde97abc41443c3dab824afcf5494170d1577add7ac33dc18f85316f213917fa0b20b85481681cb7ecadfd44f5bf7bebe0a6128a1ce3c85918f9ab85582c7a1bc789a3284f266d1fa7ab777a6c1161a474aac9175f6279c16e44dead9940bddfdb2b2180d107983b83859ee682c85a65336c88cb6ac7b7c33a6eb42f0cfb460eef0e1ba32f9203d429425cd05d6bcdf4c5f338f0669ae92524801452dae87e70aa3b7ada925017b140ea987f2882241ad347bfcc7a6479b0d381e55f2b8ccdccb5b9246d22c73c9c71863a3c0996c69f057107a7cfabce2cf079119e26719cecb79003a40681db5b641c294f282e1b4b0278f6cb8cfa506122717f57f41e519659c9fec667065ab7c0b74f00aed28be67364767fdad66717126f17d2bc1b5693436bfc1d6cdc23782e5c9397c30a7e37ff3e6e0ae1c97b15687ec156a7f111ab1c7ee7ef3e8d9c665515dd5b8e5f5c074f0dc5b5c85af424cba3652ddd27eca58d0ba68504a12f48dee9159538588d1e0ad965c8b8123a0ce3e8eb9d85454d4b3d182127e79e43e870e1248de87e7944d9aa358bd877b59559543befc8d39e63d5b0401d0f0e3f0cb403f08bc757894164891d455113ce86d5ef3e6bcd5a46b6fcd8ebaea3788d7d515962d7fd6d23dc527d05404a6eeba9fec2da58bd62ad0c5b9a0a23cb659403f0eb62b8b148b1de4c8fd5c2ec0e76c47dd4f800bf713b2d99fd85c4b15cbc6539bfd9780c6e9910f9c675145e7dd5a0f92e81a9fc1158e05f0944d97ae56d6dd3dfad5d35694537022ace7ec94372051bd65b9c9bc96cee55c72faa51880fe16753c8b054c11b1e0ec3c64755e6b3bb8bd67021c521df20223e2f7f5cce0a8a9c2110b893fc858cc69a46b929f00289f036a67fa2a2193c6f772a9fc33ec7301b536fbf18a4e948d1b6371a6ee9c638f3fce70059d3830ae3780953af61ac9b8cf1cc0b0b40b11bd91f7fb34b5766903b321aea133d8354274bb5e348bd229295010ee5955944cd83de08cce9c44c5971df2786f76682e0e2f81597b5dc92dfe18d1f95de760a2679fab8ad70b7df5b3c0cf51c2ed8e977bd8510b61f466248169ce6630d1f6bee637b799d07b9875e45c06ef4df1b1ee160fc908aad81fc96dd374b974addcfece86a32e6d651ac293303795533b58be672647c598817c691dd653678bf369ee9b1cecbce0607b685afddfe895230964e9cc6bb6cd7902a00bf2e8f4f91b440ad66af2b9ebf630e3a6157e6d66314a9e08529370bc3728eac2a9a3e64ebdf1e00ae153c9d28ee1a10f07817858ee72b65d595d77e74475c5ec7b22cfff33e9eaa3109e5156a2f43cf05497addfd3384a63613830c1196fbdc3e7d3f68d159297298920e4cacaef13e47d0f728d57f1b684ea923fec2e8d3ee360360e6aeb828218bb99f8b17f48d265f1777ac41545a76c562a09cb1c44c5e574d78c3b2e4017fb185811ad3887d4ff426e0b36739a8974443e02e03b2cef34a626d4504641e54b3fe9a4107f22b81af031c836fb66d927356ccfce33ac174b74b29b5cdc0e568382cd348dcbbfd8438b8116482531230f9a24c4e77e58daa450e925b3481c083e9181576796a5d1f364da9a0c899fd397f2f496be73a9a5d9db5927e622e166c6ec946150687b21c51c8ca7e680f9775ac06a99c5cc25154674710677e4f4eec6e474f6bad9b644132335e458a3e48ab292e5629fe0318594acdf35fb16cd2cb929b19c1942ddb5781954c3e58ac79a59daf365af4875832ee4e25ac230e09d181cc8b5ee3c57e25e5f77cb1f7e39029b192337667d67aa8fcd28d96fbbc5bc5e3e28c8cc3ebb7750760d6e5926bf7000dde34c77e76e4831c62136762ff307162e606915c28ee0d8fd842244fca14f2589b209362f1008bf5049f657f5ef09ba4dfe0b6d50389b62468a8b4568a51c63ad1e1233acf358830c219da7b61030c51d502435605f1386e16f0ded03215465d895ebf2f96ea4174a4690c7d90d28c12d0548009b48e5b17ec02eae54bc73866cb7faf69d0897f6ab17844ae74c3e38fd9bdb4149bc8e7c4f2c620bc5cd165009d2c3a0f04790abaf12cc935943fd86ff728299f3f08a31f2f25c87eed9a95d1094da949bb22aa0b6c6ee53b78af345a337a25d32ab458d0ab052952878a8f8116ca44417cec27052b27dee8a979bffa949cf1d7e336ce7f6e508c61b1091db9cc8b531ccf3f4851353dfd63ae0741f42276d5d4f2f4cdd381ec39d3f37f052134791e053c83d697929a8ad50fbf82f3e5f018f2e0581d74ebc378cfd5541060557aed224c209a7e4b24cd65550b499de6f3045833c8850bb4bb917de0f0061f3877079b867e59af67c50d3c0752609a2c65df2f76aecf40e5becb069bbcaf05e359b5997305ded2ee649481adfb8d93bf30f29e2e71c1ba84b370928e1ed3bb60063f44991ef08ee9e8a85dd0709930a83a85cee57924229c81c648427f39e8b768edc3822f568b5f3b92f8f7184c18ee6de0e7222ebf1f321216513e48aa35ee66063fb6a2d97258449a79aa5b6df499af4a106ef85c5a504da7d50adfee490fe7d4dfbbdd41ebdceb070971a1c66bb2ea0d71503fc17afd1ac3fb2faecdce21d59dcc1b4a569df41823cfd5521d263f056f33506bb7284261b0eb341b0f692d17aa2d5e4fdf31a7b334f45dd63bcc4be8b97ef6e4060c260ab7cea1907bc43a95432b0a56a64efea4839f9296e806db7b3279cb1276cdb1fe20ccff74da875037b0eea9c6719dffd358f9faf8eb7cf9a6244d565ecf14eb23330cd52ff45a77e5389dc20709c6b429fb2a1f650ed5ac51d5211f2ed888dd6238b7ab2991e3b8872460de813670258cb359894617bafd648e1eafeb5ad28ea476f40ac979cd1a05bc61849cbf4359e5c9aebe01cfd2f2c7976c8dfe1e9906cf36ec787973bea64748c53cc06ee9581d85524800fec69662383241cde9864eccc0c67fa1495e633510b78f5509072a1a2f6dafa96c3dee1db99954c286416d845caba7a7c15759b85c5d03c35948d8c60f267966e0e004e161c84d44bb716bde52c377f4a44e90b673df2272265168086da6309e2457df947ae7b4ba52be51c1e93577f0b9ee11189e6674ca38cde5c790155bb8fe4987204a20128e11d226176a2a2f03cadce3c7251a8034566254edc19a831e375e056b1a99ee27c152f2c71dc928969dc30eaa5022ce164ab8bf61485d2f37973f605f317ad0ed2ae9bdb94a3be90ffc499ba866a6e6d9da782d0b6d87e76be594a0e3d9ec4048133d90d539a7fad8ad1691abb1d051e6cf4aa7d378403422eb04cede5817c7a045f672033236e45778d3f89a77c696a4f0d534a1b0af9cc46f38f03af722ec5d89bd6c2b7c102ef62728d85c01b03d7a07c2dc5d5efda9b93ad811defe3538e7a53a8535605c601c80bc3adb97b7ced2dab8a7efca51e36a148b36b2b57a32a76114c509264303304d3825fe8103d21333609e3f3cd4d13dc4f9699e6316620387f3348f16ec9e9c5443a2ad06bbd1a4d862c836fcaefb9b14cbb18a52345064dd81dbb0777fb9c75e86b8d06f0751ef91652eba5106e9edcaa9175ec8fa85332d63c1529326dc1932a96f500410dc5b2811d6b485042499af3aa1020e9088d63d44ee5eb00790fa9a53cf130dfef9506310ca0dded233098b27595e6c1fe1b7d5ca6bbd174a5cd25c2ce102d2f931360c0712aba5959ea32617475b29cf193cbf9d3f551018c90941ddac059b280a76e9a1b4782178eed147b372df8fc7b7cfc2667210e2995e07110e3805afb30e76c384ba5b9ca0aafab8a3e2d3e43043d7a5cd0dd5d7f4a33594668ee857c3c59f61582b3b5c385a853f8e9f20713145bc3179178b355220f9918eb598db80b6598dc61002aa6686dca51db2ac7ef346e52e13981c45da5ebcd22eb5fb8311690d0d757097ce52b766b1f72261539ecebc6442996f4fb5e4e71ded97fb969e6621aa0f53e21026748b2dc4f726375963a89aaf206c9b0a3ae03b73627f5e5136ff2c39c2cbb80746b3df2e39e2744c8f119a0238fb7002e911f4691e6e2150600d5b9dc33a0d1fb44691dbf17f50a0d95f2ae2e60418c578e00f77d4b228c36cb5ffe36117589646ac097327e4147dc9fb13f7346fd97a6fb756448b32bbd3e25edfb3a14ae194844e109fe1f9070ae84b1cea2924fc4957fd8f794bd622a74b6fc4b38dbbf040f7926d0729a67370bdb80f63cd0cc85bb61a83bd1c86a4692f52768e2c53cdc226e1ea5206d39ed6d1abb309290d87d81776fab9072a8a3e146ebdea86f8c04399a44d288168d165aa8acf8544107fe8ff79bc1513aa1d50842b6170a49310ebd9415f33a04d5445d2be2c7e27fefab1f88b907849eea2c706f129c78d0d06e16d22e8186d6b6f9dd1b0929dd8bd3e5e89143f8aafdf64cb2328de97494cea4eddadb082f0a86a952dc7c88a613793153b7c92f45063aa826138488ae13a0459b24c7e1730ed8c57706a98ecc95243fe942b4e5e3163bb174b8a2f465cbe9b2b73661b7f35231f082103c86c19f895431e893e6f5cc8e0b066845b73c2bff8eba8625063073069d3c9f921b15810d00961ff29d0d87861763c8f94ba1c2764c2daaae36baffeb3deefb46b648e823d7be4f3d629ad5d86905414a1c371dd25d890a59c3e347344511b9c6e2cc43624be2fce0e21e45e972636794b35c9c9835452bb45859e796655d619f1b20113cdfdcaf999608362db626b285ab82cd3c85ea854a4e7f5f75f12a693be9d4d037f5e3eda3f8f95539b6a7a8796f6a3e33a201bd8830d42d478af16729b96b0ee830911dbc8561f181f66eb00c69435e123bf32afa89e8dfaf954ab1e514533ba2227ce63fb5c2b99af7f47f9b43debb5c9667642db43dc502a2befffa851dd50a1e0fad9a14ac0be93dc14dc2697cb47753b6df7e6a439be5259697d6763b7984b5b1fa782c7e76f12a7dd10e54ae07f6e66a1379068ab2cbb09a1015822c77a67c1c434667ca794750527fdb9ff2f46fe109a6ba0383b82ab6120f1413717df3c3972e81510081505207c0b695ec2826b61def9dfbbefa86b896db7eb49afad13ecb02b562c12da072063a2bf0ea01dfe80f74b159ad18743aa10b91e0195ce34020665f378cecbc62d652a81b8d1fdff966dc7097ce9057aec9261a107d328e7a2fcfeb29b43d1896d090b78035e0cb6cac6d7850a3d0b5a767a163e0271a574f41b5e5c3e79d2970bd7ad6c984e306a458ce24fecd8822971503fbb9a752c2221eaeeb90879b7392d5779251ea953652e465030c9bf5030049d46e178e9a43b51f21490a24a69b7fc12d56a3e775cedae7d88f049fc5fb758e7927844d4f705abb939aab3f4cf599f8f2a04a0c1334bedb8f4571595950694b98b48a53f0cc958c9c6d0e480d0673e56e1bceb8fc0c7127ffb2dd595dc64e19899184431cbce80aa21c8ddf5562803f06058c7e7eba8465a053930011b1b670e24b2c9b21c5e49e2b45a455b48e514e411a0ded39c38b0d27a44cfe33a714da294dcdbcae7bfdefbe650c5bb8de699ba5b5ed55abbbd796ec3165a4220afbcdd515f2282143a657d1e71041c0f73bbfba55857843080c8b746777827b71cdb45c30348e18b1707eec684ab86b5d4a12e59570a5ae3c9c6346c2fd199e602d364538ff2f0359eebd845526101675075dbde2396e3bce09a6d9d050ea095a7cbc267cdcab6f8173ac203a3cf960d305c8a9c84a428a40c6eea42c3d744ac54ece56983783bbdc91b35683e9c4c90bd80c4fb42dc2f81966734c12fd38e14515e57bf7aa4876dfdb7b8dced712cd63c09106324e5023dc6afd28412ab85b3e648a0d37af5a3eefb35d3c776f63cc8f81ff73cf468a9bee46e4cf1330732725bd2460b4b13962a0bbe0e91a2d2864e38e800ee780c2aee38cb2b725c8d9b39f726d3d1b4a76807757af2a239ae1251438fb3e1797a8fb30aeff56e53e8caf10469cf8c7e59216f809006620331e6b7623a987dbe59e0f7a102354de1bec780c8c6c0a371d0ca497529d23ac8040c6add12382b115223a1462b7076ceb898d08c63308055b56b7d9c6cdf904fce8c50fc3e1a51380d629941923053e27d47c89768a68af2af0af23d82b4cd61386c5307e6c659fc31a4c7da60fc4be5b6dc4f33feab291067b192a092da5ac6eab65a4534c5a92566f21359bd5dc69e0a5d4fa64dc6c5768467440dc5d79d468b724cff4e9eab7b56536505d0da2cd622d4af397c7fc6edaf35f0cb433500a8c3a6137d5cd9c5c6a7cfa527c2fbe655a5485734b35e953d90217e23337beab63c5c960787ff61cd016ebb07ba485ae33cc22edf1cec982ece36d75dbd32c3369b9bbde5f697e6590d398fede14af1488f491e81dcb038871279e1c10be1f2f18b6c705ed329bc32723709215f88134b45e50f641e32dd1203f485964210e1afb2d597bb433d4b20d97012ea5b8a29b6069ee7ce08fbf0954aaeac268d48f738b8e11a45705cfaebeaed9092fdd9994f7c7d8f08c292d7d98eaf3cb7120f9c534695e141820d335a4cb56d5f6ffccddf4d89ef5a757ffca678001f92f9f038ca04fbd5faa1d95e36a8d08f9ad67b2b2d21cbef0b494bc5c4b0a83bff6b703363991adcb7f347e147a547e08a5ddf1d03a1497865657d9cfaddaf7a459019f6e7aefadfbfa3df2555ec21467929af0a27740d70aef29de811a71ec2ae8f72e71deaa4c75bd72992282466abad65735a62431fc12f173411d2b8fcfd8090036fcff61f7ad3b8ae9187f61ff66f37b4747cb6855130fdc97f02b5511204bd55f7c37973e26f6df5883c0a530f07c7f8c23d74490af9cbe4996c4925e9823cefe5c21ca9e6771e86e00d070adebd3ecaab6d2673d2d1aa0dc9d71a816a423559a29487c86d32f5ea02c3964c4ad9c4af97d373099302c2cd770ad06c7d8bd11c970161d861e917a854265e223da28031ee38041534d23aab09ce14ef0aa737bf2bd152e2a9e4af4840fd08939f619bd71964809e9d8a3b30e8eb8e11f9dc91cac5cb04ec2d6be3532d123ba8565f3d297e1f90adb671ece27c29e5da327304c6cfb91c01d5c6db50832ba0684be18cb08631dc4967d1764c2d50c1529db3ba3ab0614526893cc0c7a911dedb6632b3f399610b7a98f000f36427cc8223e6dbaed08b25653116ba40098c9e099099d87b2078c6483118b3618777ab71aa528eaa970164c5b59df0440a6388fbaf5d24ce813fb4bc1a8fb71d000809271b41fcb76d8aab4ffd168b5a146043b8acc7be76267b7edd3b9d33af35a28cad5ff94d5cbaeda209f1ccb20b8f497848701fcefb75f7cbb47c8c4fa0900ddc0a5cc3a822e6f3f0fd7a068edee3e7ceb4e2ad7ee3d87a4447c6a235767710a246fce6359059643d337e0b475b7902ee03e9b8f4b8b6cb91a0ff290abc5475866a26ac1e2e7b0833b1e624040ab7627f3d6f8a580177b359c71167f9f78e022f7dc25b8884b5a678819b99ed7406ce2a6b5b69d34782fa44c2e2a527b18d804687b73c9d1b6d08b4ab84b22c20cf0f9793959e8d114168fc9b5c2abf71b9b67291ef97857a0cf4903588b7e69678ed6dc00470ade71bc4265a6640e7c07a6e5ca151b46829fb33b32991ef465f6b3055f792295b5178d86d05e72dc725386eacc2c5da6db1a18dc78e86a371020ea0f6422610c1d8c06a76a6c93a89285b7f09f93352bc9965c9716d4e1b9207cb05f9a8a86c04035c43ec44f3af52514b691b5083657e69b1b15bcdd39fcff70926053201864f5bb22b75e84dd44d2970f48bce9d58dbaaec0b2db6fc7750592fccc3e617a6c8672bea MD = e7289fdf3a44e9636b76dcd8d94a0e91ca14e655067b498fec91789ee7d3f1d929b31cc8c0da83344e468e126ad415d6 Len = 99232 Msg = 619e2aeddb1e23d8db1e5bc3a36fb514d1bf6f2429580197950b48e96a66e34aed2edeac16098d1a947abb4b10120577b6e58069f23ca2d677895fed86a0922f6d239f814e3e567f21951b14fc7b44479265c358fb9e050cb33c1a45e45215d5e867b694092746b18c59c345ef113d2e6e27801acce7f3e24f0ac01a0de635e666e16b0ed22b2555ddadfa076f3cb7d25113ffd6ed8034ff55dd9b9387c2ba07f07905172eb2ba161a780a82066479db431187b5e7cf900dcc9cf1d9dc506ce28c17ced6a724ce994da439dd3bf14cf24d0961df403ecfb1bd2f0b1393f6131f45a30c74c4ea29897d18d041964bf8bf75e3d67b8334b8952f7d316a351e7666200508190d6a938cb3bc16d5a0db45e9c5872cb2351914612a70aa06492f5e5d27260aeb0b0dd44af67855c2e007fb1945ddababe054abbdb7efc00e579193af61ec5915453bb36d4e34d32fdf38e1f6fcce9d8f0b4f454fdce3b9aae8abdd02d6403fbd445dfa9ac3d8da4523d7c029f24048853f71aac2a332de0483e704ff8f0b020c8ed96f7b5e4cb02b364a60592f1cf6b60322a1bc14c57741b0accf4d9333eb29ad19dbb826789d0aa0fb892fbc4bed49dfcaf4e53684cc8cf7630794eaa2423c298305f92445eb0ae7500352a0b475675bd169e71157240be172747e9d3e4f6f8881b7e55e99e05295b3956ce33ed83800a0c967ad27c9e6f542deb1b3f159e8547ab724de5ec60b318b09228ed35ce3559ddb1013da0146bb3b0dd534a1aacf14d6ce5fac7ae35c4440251ea75a4b91e33169874a5a1553bcc5c9932938884d51fcc43eced7806e553ab20839baeb6930c439775a8d4d347f49d993999d3c8a925661684e5be469ece0778749dd8594c6bf15864c5df0128d2d067c8cb80ead5f4b6d8633f05974929c3e44e1aa60392d88c35c27b148146cdb18f60a7145de4043af3f867d25b7cdd5cde70809c681eb890ba2f3709b63a6b9d7ab1cb02b47bea6f03c4ee9915b28f4ed17c7e2fd948a29b700b8843226c3310a40c95d060d60ddf824931ee588285f667c251d4e9992cf8d1d7fd4558649aa7b601a601f5baf4e8fa05e036965577f00bf2aa301b889e557a24f484babc28cf0b115a1be5732627d58b680651b3cbc8388de5a5e1bf9d2db3631c85ebcb53e32dbc4092b29718189f3a37d20d15f7fb67e4a2bade769fee2822c3cd4e1ab2a09872f7eadfaf4147d1a2de2e3b0492e624a75fe354762d1332e488cf6442bb73c5d5de98df244811f745d97f6e081334f9467bc3f616bb398e18da10c0abd4d950456331438e83238aa3a85a1888ff44503294b135d0c0cd74304615e5ee954da25224287f5688d8f63cc922cd1fcdb0c3fc295f964cd44b9fdb4b533663834d467ca0031504dfcee481ca7dee24f4e6bf13a81399e37c306b7a685d54a31564b73555459721de61b0031ad00e410b72cc19af61a32d1f18618e0ba8a335d2007f0cb25468263b3df34148adafec87d1556e9dee548233700c96c3a9b4942fbcf87345d41a9a4ca028ccb28b459fe08ef592f20e30ab6fb3e7252ef50b36a506ce099e3920f6a954caf606dd61c3ac0817174a4599e11a606ba98c0f09a5d85a7a2019f81db3c7b8546da438770040d9547c152922cbda121494894c525a104467575795636a3e474f84291117de557f1821d12d5dd405357c86955157dc0331103fc5958472638e26e9f3fba6a64065ecb91cc69d824236fdf04ea29c9427cd2f19e27d0374de09750f934cb600a82a4ca24689746f07b3335203b4932ad464fea63cb062da0425b45595a8b865d338b26decea74f2dc26973c530bce08bf85194542d4252a8c7f6f5c6984405e782db88c7e6e11a625fda40fbb1ccfa63fca0977836cccdecd72f0948d63c0430d55b97e8998cd017bc4e45cba6bfa8beb9049cd8ccebc7f4dbcf29e7fcbdacbe95d4fc48cdf298d5408d2a3cf7de142397454b7ad8e96849399ffcacf30d241b2b0f5eef6b599b22535e96578c71631afe2a4b68430cd7725b642b9ea17495cffdd166e65c0a01895d8a31234dc0c02b567d45aaf39d3df7a7e95dc5ef3c276075e5bc34864df18fc6daa4a8231251df0704e046d2e3c16187f53b2ac5ab0158fa1207e1d36a93bef71397eef4b13ebd7988c546c7288c37624f6dd40c0b4c3ff31feff62aa8109d5600b1feaae3b04e15d09bb1b9b2c501a0c09acbaaa22f9bcad51e7a725090b44c689bdf2bf1cf1841a60b9092cb9548a8106a1889b9d3f6e6fc397595aa3a8c4212fd996123c2a566d0bdea39b92492e40787c28f9760d7af5cebf07afe37ac9ec77d3532c0b27ded1758c796c4996abb6c96d1a686fdc78dbcd9f10994af9cc94fc6ba8812c6263c43853091361d559509424eb5ccd24de8e5ae832ab3c9e52c727e304a5f272abd1ceb2b1255d7dddaa43040a4b208f128a010abc5a5ad0e2ef84e9f60f0fc11d76933c3016bf089f3060baf5b80c73bb5b3a873c2b0849f36a8dd10b10d6e61f1f404fd46be8fe146f779a4c17e36b4f8e61de2091d7621ae4bd48a27fda5a4758307e3c996dd6e3c3f2225c0f47ee3570317008334aa1bfda9da16a90ac861cadfe37c733d02b73ea5b03d3f29c6503bd040d6163c49158b8a98bb207aff2158d041d02afa2545b2f2c8f1276637840d173d6bab7f7a97c0b6b5817296746b871ec9e8d7146e9e01ee144b5ef3f906339eb9c82b43662a04f4da7088a64cc7bf9022cb63d4064c94613c52cd18335e172e5af37cd13455bf0eaf914af2b2bd68eff581b48215d7d213e80e5c1d0e151f8ec8f688710da159cadbeba0c1ccd6ea03e913b466c2c522ccbf88f449b1b2b588acd9356a19953af10786735dc299ad94a78849c736a0ee5369c77be544bd40e2aea26d067fb9ca4bda6ba90cbd8f1a6ad6e85def99ef9d718fd3db39f1bf2865755b178b6895729ffda12c17e53e974c1f3cd724123b97eed9b5fa8dde3fd4d9aa0b1b42fbb298b71730e2c661308d042a8b9fafc90b4392ee74c22933c5ae06f4bb61736197a659d121b5605aed65589edd9dd8e7e70b247718195419d91db3fc72d066c1cc024ed37b8c2ff7fb8511243ab9e69457566e1baae958b80489aa6a38526244da165dc4464e7961e457f763abdb23f7e48d368331197b37cd5ab1e515ceb1124848504d8be587bf3041d10437ebd53915164556b59106bebdf99115122d99529e02ee155138a13a65ad69aee7d14581735a633d3f3941775acc12a33655632d65abfec5a02f0efa0d02850ac275bbf885c157e0d5f973882f3cfb378a2f56ca24aa490480b21826afa8eebfd0bf7ec6d3b4ebe682b9e519c1b2167814a3bc526369977bfaa905e6d4076c761998d812e599e5f84b61e0539a94290fde9adbecaa4fafd115fc1e640387c6d7a6e60f0444d90ebd3ad9aa5d414bfda3f0fafdc182c45bafda94abc5c490c6897e936cc677dd2ede56098b603e405add50ad68f8723061bd4f57f4349f8a3235a985377d060c0d02a7d9cd841ada0765089964ba03fc8aa27e2e40d71dddd38230a6b8547acd72d23632b7f05c80cee220a83b2fbb8e9e076f01d9d6c5f171191adc3771598a27f50afa90cd8c9c75fd9ec1337e254f659329b9055a202ed4a16f11fbfc2eaaf2142b1ba1423295c55d8ccb96d0c6a7a7efb43c0d8bb4fdc3c3372c4d1e7e959cd7a27b3278d7d386aaf1b0aa4c28ff2bc2187439900cc407277b1575fed3b2ede576048a9702be808ed657b81bd2bdbab55d48d092adec687443b4bbc6b46bace7af9cf3c63cbe7aaf42a807644c4b1c708c9f1cb821deae5395f1669baa27a384562db32d0c3b3eb53d8be1501f0f199aad63632bef01a16b7bb4c0a73c4f9865729e13f5fa9d9249d0e88c07d27378dbc67bee129fbc0965fce50f12f24954320bd75b468e4c3f1301a751b0eddd03dde1cf0596b979ade8206c9c04547e9f922ac0d34751b00dbadab07873f8b780450547efdfc69f569df031afa4eb56402dd541c321ca31c3e763eb49797c68b8be3bcbf6144e96cc2b731c901a3e3a01ac174272fb82382b41a3410cea015873ee8a43605dd7c5d73cb216868fd590a8b7f5ab29feff2b0b71a29808ee0def797dfa9776e3eb963f75b305da2b39c1fef579643052cb742c1e68da86ab2a95911493af80ce1170cb8080d3d515f136cb0faa55cf1e6e7956f1feedce4cdfb2855b5e73c646d2bb45052166bc768556d7ac90674e8a6ea450916bbb28f7b4ae1bf962cc8f72b4e073ab9ca8da757e88e9753480f4c0555ce4a8b72adcd532f11c97a7a0257a41451d1bfb7f763b6336cb129d890ae5aa08d8dbeb24310de0e34fdc36d9ce8701530dfd46d5d7efbcc7432ad36bd824f612f5d40d9070c747ed7e71165dd3c17b720af8839146ba12a31a65df0ca6a3c0e1033b2855e22ded756ffd4f167c4f370bdbb4bc9b0bc4eb32186dc856bc8a90ddcab7415dcc645ce5eb29eaea1059bd8449daf8db6e34d2db04e796306102ee6e11f1628f79971ca3ba9deec3d90996471c124039b7324c09a77e5281df3363fca29192d330ecb319a40063881d8549ba1c039b9d2de8e321cad803337c4476ef433eda11388babad71fa522125f55e47105611ef197c1e8c339db12d815db0afbda04031da9d8cc9e835c27539825d55c2b2aa17c31685b2ab76645736a898a4d860cf1c5e4adcd4d356bb6ea054cf4bf8c06ffd73dfa1fbf90b2599e24ab6375b268cb80cb92536f80845f3a4923c937b28678971fef9d0e703fbdbce6e92ce109981ee2b13ee561ff169ed8b642a9413919aa4049c16973b06ef05433ab5d3bd62b5a7057fc09e12b92e429ef323b687a3113476e17ebabebe08ff87d6a6ac2b2930c9e026227598099ddb2567ae61a107d3220df4bb9f38d04eb1e26bedc32295fb3d05309c437889bca068e854fd2765e85712fe55b071e7c9049e21137e6a4e1decbcc4b6717be09579ae9c9bf2e26459bacc26d25330a982de021f9f47cafd9ebd4d0af96569b6304f41ae0ea99aad2d328595bcf23fbe8029558e19850b4a8797ff2bec880ab593086744328817e86ca983729af464cfcbcbe095099ff5dcdf641b4f18422583c88e698791f820bc1f0610e6f5c168846caeeb5df8ff505cae0be99d03fc84c8d7c78f9eb2627fd14d31721954c112846ab8bd0e6e0ce471fc74b13e371ced2dc69d20b11d2cfad0fe11f1323f5c2c78cdd3a0cff12e79c4d287bb5a3c0c29599ff766ea5bc05a613a90d75a3efa7c079ee6dac80bcdd6fc372c4e18983200f66abca76ff384662b0a956ab8da03ccdae4d8b4224351c4c2344bb4a0d5f839a92dd62c686de2e8d77509f4759adfe298a793760521230bbed0cc331b7ac59e1cf22c3dfe5241a60c84d2bbb807f686eaeffe68982ea97397139714b11000f5f7c0a6215828086a733ed908aaa7b08278c501d204f14cc4f605949f891e1307e1a02c22a07aa1fab4ab06227205769de93084fb70f374c582afac1bcc2c659c8398a686fbcd731e76d342533aa6ae9ee6396f2c05ba8a3fe418c5d2a1c35e7c85b3fc9693abe6a061bf73e12714c24e16e7aaadebd0f4fac348c80a316a666e8ef6179a909b62471e76821563d6187522421ec649bd1cbec8489e0ca3a9e53b466bddda1a264fda5500583716741adbb152b1bf470768539b1f2d20200843ab5719379d57d21522ad66db8f67762e476c204cdf0f384280e3d55f8dd010e88666080d2d722a1ce7cfaff5647f65be82fab3d86fc6d7110e48731b9dda483d941e4148d091b3cdf063e38d0086c9315505133bb7976d3dc6740048966738a89d24cbcecfddf78e07100b8ba9a328ef8532495fffa8812e6d0c84d0c19e69926823ae89727d7dc8f27e2dd6a8fe0c60dd2b5c2a8f219b4bcebb089a66a86264bec1f3600099cde47a56545845c0fcec24985486ae2b44feb027928ecdacab8467a6a13ac35b7048674085f8c71181fb21203a5aa6ee02afdaf82d943dd3cd5c2b7bc00101e9ed5e81e3ca9e781822f59d6c158ebd9160c415d7de9400454f52d2e8599c036bcc8d90e82a329efe67426024ed093c3ce3a6296caf765c29b9d0239472f3110a963c5bf6ae9d82ead84a32efcab56b1915bdde5ea7229aa7943de72816ee72edd2d5abb65cc56c05fe75db75b579914d7d71fc55ce8101e96701e64b4a75703e08bf48d03e93a377602c225fb53df703a32b4afb2d79db14ba84e8a618705122c062faeb5cef716786d5d155d3e9e661105191f5cbf36e53162db5e187c75ec3832689afbcc21cfdf9daaefe1666a48f4b4d99eeb1d804cc016614a39f62df49d873bcc668f2ed6340a18203869a79b6dc852a8ce50ee3a70597cf9469291cdc48b15cd568692cbee394140b2b6eaffe4c630c77717f530daa26ac5dec055ca25a483187c20d21396b192ebf0eca8d8e224d06585c119e26777c74a631dce9c696a0038180c814f95f9a96c736975a8fe6ade2d7afae0b19f401ee163e98096e84219a6eaa814c29477e15caabbb5f2821ea669b713de10fa91de4561d1f05c3ad34bef4462012efac2d73717620e4825a6c5b4daaa6692f1f391c0ed65b25ec983f36bb5e8cae73140f78639eac30c4199b889463d1eba2ddbb60e56f32b011cdaccb6cf9af68de0a8cec482b498d17e6dfb719a3a6ae8f6b0d7683f28ef05cd5e145af20708758130c96ca26de41a34aa0ae84720dfc1f5295269166562bf337486c2bdab75508b9f73f8f9653958fcc46367cd8ee1b7919bd3ab7d472aafe7b4707892f6c181783b5af3f8390d104f53917a9de3154c748ec789c43c9b5a62a48e070277819adf9aeae83f57c3d294be119b48bbeef2e6889aae9bb459312cbb2bd89cbc1a0f0a44a0403f501212758a70445e87d34d800fe964545cd8e6ce6ed677c2230f50b0bf278668a06c425a4f19f03fb566bed98b20559e74aecd90361a6f034ad5f24b70cd454bd746f4cb528b397ce32db94b80dbecdaba2f683ab76418e0a2127642e02de7795316ac415b508a869f7cdf6e9778b4899bef492659402fdab7296f2fa3a5f741a26fdb44cfe66dfd28f893bb2583272b8862e2eba23afe51f8af2f7a21e1ef6543b7044e06d95e413e0578a9c187cf410e2eb7d318b11f06f4f839aaf14e5a34c590a9e5b695c5e34d47f0b2e1f3176a9bb75aa5234f0c4a2ab9304a8867a23096614e7455985f63b5248e8f0d6199f8cf712dba5861409c085685c15dba61f934bd64a24a7d6533241fc466aa3fb18c0800b39b3ea4468d2c44bcb7f7b313ff3f198ed82ba181e208be15025efa1884d3ca8eb03c64a88df5284796dcee32a303fa2f8e6fa12fe0e173f2ba823d1983c1530191d83ec13ef165b8d673c8489521c3b94d9cf8e9c03cd60027ba554f094f2eded8a8af3ae0bf8182ff52ddb036272ade9e2a1529f07958bfb27dff2375dba258dd142260339e00289a009b14166283e1e89d828b02257073e333772169f5721217a124fba83b662c0ef38ceea6926375b56dcd6775dfb1df427179e3463b029d20e64347bf16280ff6b22faa77054e0cad216249bbf6915458ce63c3ab0ad84c7149f9fed8acda46c9a2ffd20859a809084ecdcc5518a3758e80c15cf8f367c2a142a56b856dd162f06c89efcafe060d8f4c7c49c1a44ca56c6f1f19c07335720966f21855d7b1d713753a6e4f70ec9c8ab10a6c922801866abfd9848208c5ed323d5cafca890035ab43ade7f630c0188302d48f3712767b12198d17ce22ad96b42c417c43e020e1105e30b76fec250410b8872c3101f005faf2a65e056f3100f7ca4d28627bb87bfb2b8f870cd18001bc587eee006522b97de1b1d1b83d04ae858dec1e96ca1b68b431f6c16daf7583de59483f45ba6308134d3bfd672a9d11e5ed8ad96149ee29e41822e102c459fd0f316f8a4170556463bba13b82967ebd816fb5d342799541f34480705cbec1efb7875169a4356e60e7b38e36ab2f0e13e09af9b6cae795537a2d9bf9dc0d21de7fb18a57ee78128007bb6f593152efb7abe5d2de6af282b0e159d1e8112e1e3bb04696df7096d6445c39a12dc580880b1bd6bdc49358d1ecb14fcec59c9ffbaa01bcf35aeb304e204db4e02ed8565ba0e8f43703d45907897285ef0ccee16e8bec9b2c74bec2de9664c388d6da32fefb6bb4bb16ce9197f99d72bf383870db63c957ae975bdd0c3939cc27b05bb4d68d4c9ed677b28107dfaaccbbd269fcc6c43089064d42cd6b6b25653935cd4a76d8e429059150b5db8e12ca6165c3b3b52faa85aff1144250becff529e1bf625450cad9b50e098e97977e124c6cd6542b08a004184d40aa60a68212965e929af3a7792781484d99a07e352ae942224c9cd1a95aeb9c48841fa4f433fad6f762d92f7798e6daad659ac4e07aa490381b8f2d3f107688ac5df25c8eefc4154e48796b3eb4523fa960faee08982ad1782f767dd9bb557cec966d1fca9c8e8417ca58ed46f05fd1b21a256c05f9c8807326e745f1b214f379dc04712fc0b69de456fc2818e36c4b67ffcec171162a27a96066181fab2176d48d3cf336f2d8dd247ce79e3cf404072b903b80c283ac319b8a5756dbfcf7919d289b0878b961cc68aa8fd22ba8c39f8d5a101c82b8eb28c9f34f948f2e23be344c83435d7afde6117e79465d78077efdebd1173a2c5387a539c353d1b522672a57aa166dcde9a4cf57187d4af85c100d93e2e3415471d8cddc37171c387026ffd864041208c1a2e2c301e99c904e1d3d00ea1330d7c29694493f50f71e9978154d459ef2d2224b0c50aa0d9ad639d0fca14b29912cc23b990f3083daee0ac51b34c34978b06817ac7e957bfe40cbe5cd038a88eaa9fd526c9caf42301d40b8621d61862c0a2f9333ab48970f5650c64e962cd395f5d0556f802ffebf22d7ac9a75a4f78565d538326537f1768d84ecc1d7a67c3b86e7cf1258272ba0953c2c24cc01f00d59e591494ad81dac6cb4e3f7468bf533d3a02a0563295bbcfaeab1818f0d122c3cfd18b8bacd6e196a8d263f7141d12772a5f0b95faaf13cba6fc7413d2ac08aa5784931437c85560d6a3e0ad67c828eda45ad9e9c20aed86a47f7d464ffad7119e3ad236369d5eadbd895f9f470abc2711bcb25b72ec6f860efadcb84d01ba810cbaf0f9929e2303c54b88d39d29f6aeda4d40f1f29ec1554e363871b50bd78109ce96653113cded56b30253526eff0965d528b52a680c7bcafb3a7a705e5699fd3c6c83fc4483f0d88776274c21ffc01c1c15af0391787eec108ada6542605150cd195adb786e96b3908b55758a1d5c66e9ade663632ce81b3fcf997b011d326a4946f2b7f9b6664f96eae7b4f18264aa06986234245140be4eb1c09ce2b4c3b3789a54760d82e815613ae4f09d566052397f2b5c1d0e0f3f06da56af2c4d8c9422be8702fdfaa56bb8245513d7c0d9c54b0a4ac5968cdc052fef639b281216730e599341114824ba64504104e7e8566b04e0c655d6f22f78919bf04a1e29e8b90514811d9091ed6b2e65b0ab15f75fac2baaa7f627699000f38403a355ba8bcfcf97587dc40089e4db0cabf0a9157cf08a0ff58fcf1988051f52a78e17ee851b34892048f3ba7f8f36ec38bbea69369fe7b8b90717299eefdbaee1f3aaec6007fc92e26866ea57d306ae62f4211c14210b4cfb4847c25b26f040bbba57dda3faee5ba5c465b69a1712f92e8396559fdebe74c139a70b461226af3ccc66e9d75cd38c71443746cfc52376a650913d5d3fc7d815c27f2de71c44a36c0f1f37839473cd4ed026c37e4401ccd1445afcd8aaf01ffecb164fc6aa14c6546ccaf02f0c96c44550785530fc74a4b74538b99888fff2853cb59a6c265cbdfbcbae3b642b041c5dac76236b5544a6613c759d2342bdf8b0fda43660f6e5336a151441a859847b9fcc6856bab73879d61257cf033ef2da89f72b4a2a8477cea730442a86fee08a11999615a28a1ac61ead2777c0e6663f181092fe5336da36bc06861d8382def0bdf94789ad36b03442f72cbfe0a1e0d06431207b6276d514b07e2242294e4755abd5c5da6223c36c49d7b0cdedd62a3575431ee9dfab31108c7f5fc2ffc8e263e216562f49b91a153b34f9c96fef0a15532cd470523cb6d157f387c58d5979c06aa243b0eb617fd821f850dcec53491807d68a3644932c0019c1e0725c69d2144b63d487cf81b85d020afd2eee6aafe7982788663d175b44dbd1b3f2f361b7088d4050d97e838e4be65248e6fc9c032a0e091526c3300b46a40b476ddaa7ee43392001d17ecdc94bd5b8792c9f510f8871637b9e604603ae7c57e60a9aa53f6e57ed2d9459c93104d824d72a5df199aaca1c00f89bc10c236b9dd6f1bac27431ed8e1d4d96dd8d1ff67eab05c1e46a38201eed59fc0aee4d7ac5604bc265533305eb1922be73a74338ae3de850924ad97c508aeb0c8771d5b0b7cc403bf8a61da6ec683b58f24519a49cd5f994640035e59a1ed652a15c63165b62f7ace23396d97954c1ecc230484531bb6014c056f563e4f34257c0799eb2996a999d8bc347a57a23dc034b307920533646580f12c1fe164f56a14d8e2f8e5a2b4d965b1dd812d71eb324f40d543feb90d3e9bafd40bf197b3abaae64bdb284ee3c20ba0bf028788d6fd7278e80a9e20f2e4e27df1badd3bf172a4dc3f12401fb8dc2105337f045b837a44c7ca6661efc800fc080fad12d621577917373eeb79a6905c5be577127e63414c99f6d7f899ff0b5eca783310fae5b2be13bea189013f8704114f5b304618eae07bf7efb0a3fa7c7121e61d762e912cda7e4ffa873ad618bec1dbcbfc66f6cfa6ea480e28825cccd9cab3acb0c5c61e64a3759a847b1cdde2fa0519c5359f68167151c3ced9a884ff117b713f74f71fd32f9a11ff66763f270675f52956756ca58dcfa1220e403d679297fb90909699ac7f57e1667174c4e18388cea72e0b15eaabfc16b094b64e99cab3bc52cd4724670f299948209af7a90dc806bd40e32c3c6871a509019d411c263923d47f6b48798b799a12f85b5ff3f1be4dda237fe8312fcacc89d947ad5531b2d2b42b856e8a40d274556d286648cbc6049c4a44026f8e520db18067fbdb799b396056281eefdbceb89df394931e1899bb6219d1e32df0b1d91e9b50a5156a6cd87773c5c230b8c8c74b20227efa5483e2ca369c0312f374cf3f8ea441a99092305828e100e3645b30fb87547253fc2f0b331524faa4f2f54082dec549fe68c5c180d9fc437e7ae0761d7d9d25b19bf5a54b39ef326a9bbdfd971056368a6f520c801b8a12784903172f878ef199a0724161296d32ca4a5926caa7b99fe420d191e4421cf6577b3d84a0498c7e82a61f50234821844a8b417cbc2971de8209ced21bf22757926dfa5f2e182814f3196751e02aae9f61daf16fe9fa118aeaa6a44da5a03bbecfbdc3f71797e46d7176f4d7464556fcb6c5f360b2be1b1d9473ec74ffe0bca455c7150cfb2d33e0645b1250c43cdd24afb8c20fc4c9e11f05ee11d8a9183ca0cb3687d1476cb90672127a4ec855839fc33fd7cd9ec225f7b591cef93fcb3e3ca67877049acac657f1498731e143fcc677c7cf1a8f2b3c4039fb5e57028e33b05e097d1763cbfe4d887cb3aaad6cab5153fcf2773469a680f9874a62bfc5bfd48865f47a10d4c36f9e089a096b540198ee2bfc741d01f7227ac23dbcc5f624f18c1a97bd4099b826a899a4dec98eb2358cf14791b78890bd343882b593b4259fff93b151617f3f1b4e8c6eab46611f8fd6c96e40826225a9cc56d3fdc7741448496debc701f9eab5e67d51ff409fbc305230db110c23088099a98be5cfba83830005a18e80ae2d7f06c8e93b668f1aaf65b40873b34fcbca32ad151e2afbf5c899f77d289be089df261baef016b3ad55a7bf80f9264ce1ff0dee2a0757bcdd919dcfd9258245726edad21dadefa206db8edfdf11c3aeed97a1c92521d471cd7681db3ff5f24199a69b88bfd53fde99a991817d4e19fa311c94da810e2fbf27dfccb62c2a5a79421eceac0ff6b5cde8384640e60ea7936ef63daed81cd7f98f35f4fd283329312e100ab878a2bff47510139a93e3eb2ef9cd229294ee5bb5662190fcbe90fd2d9052c63aa439dcf6c2b98ffb116e53016409ea4231e339773f2b075159c434a31b3f97aefd4c8b2943ad21eef8fe8ddf3024db2a59abdfc39caaee87745d6e56413ed581fe5b49109a636fe28524e9fce0b69ba756a8dd0ee139bcfbb8cd189b94f9265021d6a5511964d0827071f60ee837a265c35abfddbf4fd94a7183b20778c700a5f25f1e4f5329da2b35564079c91065d22a31d6948965e9e04921c91e7f50dadffa45128fda4b03593e4247c205d97c78f5dedfe7c20455599a17cc451aff3b8ab43930870110e2a905d67a7c210b4cc6b0b23a2c1bb3b2130ee64a1fde5aa9129aabe6b98a43de772683570cad2e6d47d55c53f5d8fc76a8f20db1032bdb8a24180da3bbb82c7d601ac97bf7fcab3478ee1ddbc99c371987fe0eaf9395fa751bd6ef05f22d6345e04d2947c2a21a68d665a7201bd80c113c8d698445af4ff08641b06bf15c60ae64581358f13fe440ecd668df611ed404432a9edd9dda4462efd302743db7ad3d88a6281e0828a17338bad3583dd3375918502f1a00a96062a515458d3be1b169b9c1d8057bfeda66267d872906879e8638888ad8229f3c6662830a35704d15c9743593add114e79042b8f4c05fbe8222304e4286581e20f49496b0fb7f6c32c3446beb858c2d519829d79cccadea8aa37c2bd6a335b8c683b7eaea4dbdc1a0eda6ff501b218ac0d42863ff9c759e0080987bc7cd2ff1959a48da16babfefd8af184a61dd15cf8ddaead89dce5b4b8c5ff1e89652cb5b06aed3feb6b10a39529e14e79159fd5e4122ddcfe7b0a365968834ecb2d27c579247c5c35adf0150a72129514f002cd953326d946e01f28eb79fcde2addad769d0ebaac2637359a83eeed2122b6e48a36c8036d0a130dd29581d297507ca51244b10ff66713c57b2823d8b9496f2c55ed592b60f21aba7c80076c41e212f6df9593e4049f498a00229b3c273124c276e26f067aa5ff106ed49334a48ba88a26b93e9f9c77df6a7099de823183dd8e353f91fc83cccaf6efb8ad9187f144482ed83aaa8797df4f15b47210a0e7a077da294875420e81534954deebb3bcf11841180d6b8da65020359ce1503b047768acca1bd980142e11c2d1adabf195b4e2a5a4414c754d3bc51979b3a8cc836946f44a92900585d817a357a3370724978ea3a25eb30933a72509726e82190b7efafbd13502990a884d340d46f8bd10a105833bea0a0f019c2a4caf9c45ec45bf6c06868d98044b459bbc1c2156dd01da2d8d966fb8505e23bb2c59c4590bd93384609121b80def17e985acb9ba2da14bef09dc742594f342c0ef986f263e6ee32b501b79cb7e9f061fd5e4988a7795fb343e3482b9a3670322de9324144facd5471d4c1e3a1d021b25f5ec45308188f2e275c720dc44636ec741736b8b043d13c1104b976cb3c15de32ded4812142039e2f6bcd6f6418f8a98605fccf327c6a58271416cc80783d542c40f2a9af705d71d093c2c6f60925f7d8280d0b47ef29171885526b8e3f189280479722ef4e0d47af66fabaf6a15f55ff1fefe36d266e1759cb04ca20db2837e3354a838d15939e0047cda1e26bf5524f300dfe1eacd9d78f67966f04e6fcb2d9ac7541f57170d397c8c41255e3986b6d1aef91e90cdcb61dfd9fd096ed0671c81fbff4b4ec3586ca6c6692ad82a90fbd331d7538a0e75189df89855357c61322f1730247e042361ca53d9975d3b7cdd40b1feeaa139a28478fdbf3c6b1cc159ee447012ae837500305a19d2b51451436255f8499df65b8fba10fa26d7578d7804aa467da8e856312004b245a85c17147f464bda46eca720a95bd27b42d6cf76ba703acd32dacedce1792b56febbd63ae0ac820364c48e208f03cea374418e3d58bfd46a1501e6e9bce00c6f7edb979ccdae222ebe261875b2337707353fd3b426be9dbc1906a540f961def7f26161228d74b5c21db84e085b11530d4d78a5c36c961c2c059114c9e026285620f83db46a27c327492537c1d1c5ec1e83950c52716ed920a349396db85472f3d046323aaaefd2c40a13db885e78caa3a03e10497e6f5d01b9d71e12cb164538ccf3489c96f36c03282b4346485273026d1aba90dbc02f3810e2cba15f92278cdba887c2765c184b6a1476e1d87a71a5afd21110d08bd82b70134603bdf0a357c40df89592515f0599767c4356194cf2310d1dafa5f5de44a012991e2d593e0250c9a2fb31fbc7977dfb5e520a568a53ba74e756a128cbea6a86ccdcf6f582f347858edd9d82da6ade4923f83b5ab52f11af76ee0d4c26849418e52462ebf69371e8c2241c0d20e68408d31c334c54edff65d35d3188787ce76feeddb764224a959b48b6f7c4207337e177a63855f0f74c3e048d550548392b34eef13e878f817d45287d76d0627abe7b167d939d10b4c0e41364c1eb1e23280eee473f7dc49eef8f6860e0596e61e280b88b8c4b3c8c22fc07ccbc6182a2a5a6f5c7026d490bb42012467f86cd926b9565b76a88fde73c31e9ac908ffd1e6ca30b59ce80a72e94a22d1999800673216426e9777bd92dd428c0eb839e16ff43ae38e5eddd657156bac2c0776fa16ecb950209f94d5ac6b38c9473deb656adf36f8553a5ae0b3bc412d823617a26ea33d002003925081ba1036e2be9fe4491448df98b3f1822f3a452772a9ec91e4f1fbc2db47f2c6a92663555fbeb9f6811fdb19d7602453103bf22a7bd7885110458018b0e13890894c9cc51cb2ec14a96e88277fa385dc0d2dd2871c435d68573a64824f63c656a8a936d6a83f88a7389cba99200278757c8c60fdc271ee30403d039015543e819da8cc2a90c92256a506fcdf37119ec7f4d417df1ce7bd5151ca07b291170399cee7c73154c44b8b7559c97a43354b4bfc9171bb7a194d34126dcb7a4140b817b2c2b28b62c556ce3fe19aeac302106a0a410903689b0060e894d947b445ce73ffe618895940f6875b5b0bc134ec70aa946f484766c199606aebbbbb58bab946fcbe53bb96db8d5f5e12766e17790ea62188ba1803415aab1fbeed35ad03fb093fa80ea2b9d99daebe947561f92c2cb53809d8c5bc7ed6a96d9ad8573fb616233f5fa3df10efaa0e037d834d587a6d805e7f1f00f0fe9ff3db1c17906f359d2d8231bdb15a6234e5c32a2a7093e8436ffb65073a5f250912ee9f3561ea26f2909ecaa6d9e4f5b0de5426c58c59ea410c95382bd245a6c47f2eb09c4c0efeb8f4fb8719a95f0eb0505cf00ef10914d8cec284f77942e834a101dcb6df6c2142b31ef360b01711b5d43412413f3ffc8d2ef9b7f49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026d3dc417faed7ebf04f5b7073d7d0274e8354433b390306c5607632f5f589c12edb62d55673aff2366d2e6b24de731adf92e654baa30b1cfd4a069788f65ec1b99b015d904d8832110dbd74eae35a81562d14ce4136d820ad0a55ff5489ba678fbbc1c27663ec1349d70e740f0e0ec27cfbe8971819f4789e486b50a2d7271d77e2aaea50de62fda5722c51d988164719a569988775e78e98ab5174ba082c4b3bb8c5be66e57358ef871cf59179fa76f5d29fb9d67237c963db0e51e4435257a1e71926ffa1a58cedbde7467e0943b9d72b93e34c376e90c681aad168b01faa7214ae0b653a830168bd962eea5e787789574cfc32ed134d8a452edb8d781dac75e98d53ded79220272e31941ba32117d1ffd2edd0bbaf6777cea1569dc3d4c5740ebde8b3a05c4ff4b9be5f5afec70378cb2e9f6ecac94655c50b2cdeb8cb5e352b46b02cbe68f795064779ef97f1a2466267f95442e952ecd1744499808add82e7319590593e81d3bcd3c92297275c026d85e2ca4a98f3049be586154299ac21ea857e2998675376836b373b26f19976939144170a5c9164ca65da9c278131dadd4a523da46ad7460516ab816bd8c1687d920684abc094d507fd287457c9d6776889fb15a5cf740be7dc0d3d8f633ca1d39010595549641ffab458e6f9f902be324960f9c21f918cd4c545b8b91b73e93c944ade2f81690a4a92523a36991c79e492693023e1989272da3c371286cc0760a49c5a62ef0b5ea09ffeb835328e6e256cfe04f19df0e56922d805c22eb0c5e8cbee17151bb3e2a3e445a81f4bbf669ee007bb54db014d62a50269f09b88e97c0e285b718ec75ffc680d511b6d1728f7f56c9e73243392056ca3aac553ba3cc377326f9ecfb19d523340fc521ffe7ed7b415f577ffee7bf97ea11168e0b086660df49bc366d7644e4ec4f1ebe9dc2ee623eb0887f59ad1e7e4e6e601cad08f0cd8562609dca37c98c083780f531901cd4dd41ecc8d9f5c76a45871ba97841e5ee1415a97b87bacd79163d9e6e61dbf3437b9816e4f65e44fc8e1f9b9d133fd042f9b7d9682c9bdb3ca4e5b97295130c2eb837794c35531195768c826ff44f2a5ca4ed82dc3f478d6722b474ba51b1b207018496672d50a7d5ad4242aaa21c6e9bb40b3850164a2e591e2e529e0e44af6ce623f0de34e3923d80f56ed5931417a095b56c5c781068b305a7d5a641583eb0d48a0b19e2984b2d900a59694dc2afdbc8508169ab36b6e557d5705b9148fa736b1b6792cccb4d3668f5b4de48a4b1ddda812a0046298360b32bb53654b36d35187c78e14a1912d85a4bf3ccfa36a8073abbc8a8cf6568c5761f06cf2203f1764b11c18de0ee26941271888df8f50ce86764efdbbd76d1843f23f77e8fd741a7917fd3e137d712e9f00af5c9cb7c5b01ff11020176da581d6cef09ccd499b8597a1b1283a550425a918ccde8d8190cd44044a1c2a21c66f18db4b052b6c7dffc73782ffdbfe64f56655b6363a567bcf009743187c59978c120297d789cee23110c1b6eb7ee05947dea0b78d2b9f4c5b5892443d937ee17dcb2c1e3d70d792c27a279613ac63aac31ae2150be9c2cc1c56dd95b2f9f96ced4b3f265d67ef545b0d516aa0ecef2110210119d7fb29c3b701607ea0363000829b25f85ff67ef1a4d2277ab9c7ec84d7fbe70b1ae93af9d76104472fd08d65e4c2c4dc6ca5ec3244d0920d87c4c29cbfb17a33fb3c5f35227faf3786517762bcc80619acfda1dce40f786d326bd931714aa4d8a37bff4140624a97ce4156c1b2b6d1f9468505ba2b98c3e0e144990b94ce4b44392e81e3da12beaf2e2691486d930fc262c58093c27259afbcd86bf1d14659bde6dd4fe49898f1c7cf8a92c09667a7bd2a467b2e50a52422ecaeb5acd0b9b58cd211d00b21fbcd27d9f4c0f0d43b8132c4 MD = 2fbac29e12a3d83304ac661cb664e1240aaf810a0e13775f7c4319c895168f4f82e3b904562e711bb8e0410e328a7507 Len = 100024 Msg = ea4ab388cce26a27e016c76b4888b02fbe1d4b93350cc0adbd35407ba8b5461cebb71c40c78ca2dea8ff4b254de268b429eda90d09c9e047f86709045f9688a371d5b1b7c6658db746a3dbf7499556d6fdc336390748f9396d286319b3e4c47b444c79d31495b51b84ab82c986c802fe0146fb0077b292eae52157a2eac7820c2cc57c7df843a27328bf45834aa4f592fe1fff48a02e34c227faec874d664bbef1e8c39eb998da25fb862e0dde51b6fcbcf54afbcbe56629fd5a2bb024eaa6f95a5c551ca0bbe79bc5a9444f8af6cda20371e5ff40feb0872de91a06b77a1c2530ca3be1f5d4513b4ecf8f3195bcc3ee9b3bd73e47a29a448050c46f4d3f34aa3bd97bd3000d9e6f5da1189c49ca1f464bfa289e28f9adc8be372ed4306176f043321fdc088c589ebcc7e676ec496914dc56e1092a2a707caf45621ea6076a60107c2ee35779062f31e801a9c7602abf17f90966965e6cc61a236733f85999606960b1cf33fd318c85ac721b2238e8afc188a89db4bc270fc97945fd6e808a591886af8ae540601c80bd40b645f82e4ca5aec795cc6d2bc082ee04634fa4c5b4e39530fbb4691b47e9c0736077c981fe8a116c382698003f0e2aad4ce5ecd3d793363d0aeaa0eb758a60140301d36b2d3759a26d0a662cf635d648a276813b2cf010dc9fce0f560e29432a862b3d7341752f6e1cbfff394bbe9adb4c4b8b8519c1cc18a2a7dbe67a8f11bdd13d3022a20c3bda2d8e8aafa8731d7032ac313a08d011f6fbbe2f23228473d6cc7fd3feb8c424ed89bf2f14741a080e3ce09be160e38880935b31946ccf107b5f394f91ec6592af169a18f2177c02be5231f20289c3d8bd50c509c1c13a92b772b2cb63a4b62f29bd666ad0f961b4875ce55e25eb38aab51b46e0328a8b9e8fed3370fa4980a062676d50378291c571424506d3ee09a671dd24de702d8bdf0db80465e0448b9062faf5f0ae1ad3de84ec991393fa0073f87ca82a021402fa38bb6dd39dfb9fa532604772bd29f0a7c94229acee77e3ba52e21aed70a5b89a18dfb6e2b7d88487d97fabffec17b1c7472d3cfa6bcd7b2288f5c24e434a7465b60a26b9b84201df5f4168bfc44cdbe706931c2592649054a19fe776026a00031925068128a1e055cd8cc8d9cc3039ae0f5e0f54eba4eaf7a5c6d38c356c221d49199e618d5ce7902a4a11758c2b92c569745eaffff650b49d54ccb964baa35b4fcc368271dddf397e628cbd8da6add31cbf515f55c08b3390301b2518bb4a643228160c5b8b8ff7d2bc81d75607538131252f8c756b641b864208f7d8d7e1e1fa148626d4cec1732d4038eb70b84c77af90425de860a0158772da582d762e79b077cdf8630e3b5597d6f822611f605c9ee7d0fb35060ac89ca8db6f9e00fbd55b3b34ab90b3c64418660ba3b3a657d90712228ee4c469ddcccc5165b3dd0e9c03470367e3252ae8b9d8b797edb4f895f1f8803d7e0484fb20c68561f4762f77b0838253e5cd2fea8114452698b00c39648331308a2d24cb9e7ebf8cea31280e6bd7f8981d119df27902fd773b045b6c689a7f9090a711f450dd470d1c77c0083b2baf5d135a3ba7a78b26b35e17add70625b08518d9131f3ec9640d12b1be0e2967edcb5011d2b2159509018a51ca21450d0d36ab2df2f46f2b5fb45545ebc73c73fb0a5b9c2abacb09ef8a451a7af32e38deccd00a751aebec80296c9d0fdc7c372141bc650b68cfd01e761ada84f5c78f6b6e10d8663abaf20f95df1ff2f4f19ca699fcd23d642bd0dfec8ef9b1ce1afafb45f2008bfbe527541f37355bb8a488d439a24d8755e7f379142bdfc9272f62d879fee8ac06727297f0fb4613cf9ce4f149363db3e40920361778f594a70cad4831bcf993026cba1f2fb3b9e3e3e19946f3410a87b89b3f5c1dfda1d9f7bbc59495b59b0798d8e93505e8f891997c8e1b5d4a1bcc7aa437344d434c62be449004ce7037cf70c0e6219a206ae59b74aab8afd9da49d12df206d0d15ff5a5adf8df047533b4312b992b15e677a991d1d7641276aec8663d571ace2f405b5400e46f5e4df97e8422ea9b9fbf87a3229cfc68aeaaff0fe0dc4eb76ee6595c72453bfa057feff510acc1b85f35029cf7dc000caafc36e8e812bf26d87d11bfa782e7c921937fe07ed106cb7ecf515db899cd982ef5b91926e892b0357ccf4e9dc1cf24d91210097599a11c2316daab0cdb4a54641bf16a4165af9bad6cfdcff909db52558309369e0d7af3779006519bab5f8872f946a5e292ff2f67d4020b6663f39dbe6ed430a1347a98a2c73d150e10f47b80142190b07568b68c3c46ca8ad5ff4b3c5bd8bf25178752cb43e8c10d13f176b7f6e8f55419d376432c31d30d6ae7a5f6d37daad2bc8a6b1a8a6d1b3fbb3ec13e26059a758329b8b52d2bf0982793f3155d2bbb512d6c29b82636ec4d10c4a43e2cde47bcbd50c409c69ce7d316ec7dc0824ab84a7213d5cd9fa9fbde1a6967df91ddc6d0ce32e26880ec81653ed88a20c9426a649169b6807b30129be2165148dc68de5bbeb65afae28386f7a740645dba7c9948945516fa4432f72c6fb4aba295e9560295c373e674c9be305a0d519edd5e0d9e82be3b6381177338c929bd1444c7f76f5c437755be27f1b95e259a0bbb518d0d648e6ee2bb464e67f95fcfc7726a894a1b1dac6e4903e639bb7287cddbbee33d41acf79f79295063063c29e3a63ad43ad8395b5a9cc666597adb5f0cc50bd5d721001ec3432741d1f8aa138f699f9fe89d7fcb403fd939c1a2476cef02a22c830d722b76a1a8e85cd890d4f34201b4fc71d74649bba227183ba0f49f19e9afe80bea65df1c140eaaadd5b538b9c8d91d5d29129d978bf8064ecd4044924a28af265016273bd47b637f63fe86565cd7f3675d78635bfb7335e1b69805f62b5d7f638c8475874ef7305621f704a22575279a5bc0c4905a614aff43430accf61801cc86f7f287eb4ab93bf7e7db248c7d61fb0b32e7bd0f8af0ad5c8b7c9c121fdd6827b9c6c3133ba535cd183264f7b548945516f56a84b6cdf5e9b683efe73aba3f551118c32f949c4d8bd032ebcfe7856c22b3151f20ad89ded20d464bdd33405af9461010a51b488a1a5803407dd9c08b585270654b36cd70ffd8ee3b5cd118c0fca1d831df994ef460f8ccec6754a0fae13b2dc36d1b41b4585fa244ccdbea79446a95ae43d5599346f7b675f71fcdc0a3b675c2ee228cb1c6e98bf0951a5d8ebbe972103b990f70b49fe8659404f0e5880b70e8371456702fc0d0c61f561a06486595dd2eab189293368a43a5c9b172778145c0aeb849f77d2a9b4ed356c9e9d22826a084d41d01c905c6989437b76e57611dcfbcd80b509670111117e4114043784edea4dcc6c64054c2ebc816abe112f31f9fc93a448364da5c9654c69a12829e3421f88bbae8de6ba6c4a92e34d38f7f74b73ea79d96cdafa465f3c50d6777e202f0e7a9a26f8d919bab9f46fb4db64d439f81e7bd93bb3910075aa912470a8bddd4d9fd2564340fc9291228a7566fa5b5e0fcc24e8115bec903f33a50bb23e3ef543650eccebb2d57c56a9ae1f7a2cef2011600f569c387f7e1254070caaa3060f8676a9eb509336d080f6551373711218a36685c52acdcc02a5782197d87bb5848d213e421086935796a519e1e16b66a03c6c42b44ba044f65f3c9f4dba2ccfecde013661b9f17d4a0e12571b42805f6f52dda0a48d449ca1a60dda9ece3aa7a0ef931cbaab6847505ddab71025345ede8d3729f64e2f15ad20686dfb8339ff5938636bcd736f93e31c7a9470f80c07762205695a2cd4526134d8c3e4878f197e5edebe0a905be57ab05e89ae398bcbaed7c4d920a7b8d57689db670a39ce9878b9815e0280c1be9fb013013878182e1104f1e3ea3d51114565ecd1ad185cfee0ded7f635c33581caa21485a02255a125401924375c3188667f89ae7db1debf3f456f0124e63bc173fcffa165c6a8b753ffa7146882eecd422d3e27cc84a84bfc73a2f950582900342720cef9e3a5f345ba283f2e5fcd3270f577084a0f6e4790e01059389791c073b71478fcf7c1c7430628fec931716a7b7ed0ba56b08514a52123ab4e331a84cb336739bf7180b6044a05fdf9a65fd7ba1fb7a873268145a19d796a11a917cfa322858be1ef5741d22c5b97103d0cfcc55eb86d3fdfe75d0eeb7e1023680e0383eafbd9e4dfd9fd64f3a664ad53fd6c15c23f731d2b2bbd4561ae27e40e81b2e61336ce38c17d3b154662e13189958833d0d9548bb6c3090db6862be3fb07605221c2b36e12b5ad6bab0d874d4c89e39800f27c1bf141a29040a296a3bc039e509d3c33f56227a6e09822e1412b3f00cae937743e692c2ca5966ff293c00acf59fbefca5f2e27ca1c743f69cda4295244e004b7739ce709963e5aca34b58165e6b469d10bd54a8967e5af9b3325dd7a8e8be6c05bfb06cbea9eff7816fb0c147f6d3702ac0604576b531ff0224ecfcc10535a2948121fd62b4eda96bb1f0f3d9c6ce3b9802ef9d68f52fd031b7d74d962ccdb4cc85076cad0a458a081700f53c659dc7058be7f695c5bc33e7f3061250e5ee6c57d54c02c635616201acc80f975baadc1764329925ad40f1cce1629316b80090da79d604d6bda7f9fd753088122e5c417694b6ce3f3523d28988d117112e6be900778fbd04288117a57c21aad7681ac0cb235ddc0be6ce9ec6f13ce868ce973f6ed95d7479005683a1c881bb0b904e1fbe1a0d0db247a71d2a228c4c4420ec5acfa72a705ccc8e0698613a04d92f5f27f680b0a75ce117175e25a78ccdadd301c9e7ddfad6159168335032cd67ccb5a01c5d2df3303a87530a0277f02afcb2fe04a35e5a0f62c671199c535eddefb852d7ba6c3957dc5d9ad5bfe3bf8496f21729e295d82e3b97e8f24d83fe6421d005d09e55c1f94f03b46766d2430201fc15e0ad6abc5c286b97686cacf624e86580af11d0d23c19df6969fe2ec2cdc737bfd00bc54dc0b2ab4421ffb58f44cfdf8c1b1bc5b54bc45b818390de850c6f0adfa2048ed48360bdb8c511860eec5ba6f1bcc51cb34cd8ddc35c23cad4e882df3bfea0ad99ccbb0abbfda707be461622773b16bd1268dbcff89dbfdaf789871d9d8ae80ae4c44afa1571cb20e67787bbe54017901ac65798e8ed6cf63516062bcbf1e38dfd9295f68dc884b9cdaa36da0572ce7e158fd3a05bf53306d7b888738dd9991f2b602464ecaadbbabc05ace59d7a456d49ead84f195d1bf22596945cadeb13a6b85380adfac1d60bfbb0704676ff8446ff00ed0de9cc2da267d9b24ef1ce580bea95303a7fb28094d2d40a6358aa91f27ff89a4295ea70fee5a86ab1232a70370a4ebc724328de3e899903a60b23765811fb6756e360ecefe72c45ee09a964115fa5adbc0dc9faef6726e27656113b5ffd31ddb19cd6a95bb48cca6b6cf13b8033c38982a73ddb90b5a42f3a021de6f18ac183bb88f3b02c95f1829113aafd6eccd0db2bd72d890abc3a735cd7ee81f502d4e1dd6e600848d283f3c8c87db3c273f3281f66410d43c11134439d2d1352ab91807d17c5b999b369a779511164647054fac51c206e250f50fd571c81a5f2ce21e7054cc8cc057fcc260a7710183b0b1cd887c073b497ed2053001c933ebcb2ab9edbd314487680d3f6e5021fd7318c734bcc1ce1e780a2a9c0a6640ae698a1582e69744f35d3fca7a170bae8aa2d3a80dafdf61310ca7712cbb1bd8fa56ee1501e15f9229b043c6faf15671398185f6c0d8017b0375cb484fd89efca8426bbbaf649283483f08854a63bd048aad8415e6cbe4761621ea126dc96c2628aa977be3f6ccb2ef481287e1049be2ee756287f801f4dce9bf88521f241fe00c0dd5d8680e6a8b7f79e631474a9f96d577a5ef7d00cf39ee9d2aa9cc7f06a4b2cabb537411e8878932f823f5bc249ae022d2aede4ebff7a559456c0e10ccfecd8fbc6fc0b7e3218d01dcd264cfc7699f155d38945253a09e526d2b5cafef58accb6d9fb646d7040b64e8cf2cfbf47d52bdba2f57a236cf4a37066a20a2da4ce0fc2365cd75308984eab07ca6c73850bb8a8df560b4c5de2975b59af2700a45fa8092548e999c3c79f1c86d7ac80f8e2a1a3d2d78107d47cc8cdf506abe1bce7a272eee724a56976b18a5040164f6803edb3c29d63be9b6a3eaf80cc1e37b60b02e4d8600fe0c24c8ddbae2e33469d15a4c2f9d339d8785301ea432c06695875d2492cdc32b295f23af9e8c989ce5ec1cfb7bd9f8cbd34df1a64864cede16bcd1a8833821684ac0fc0ca4638a25075af74795729e2d497b7900791545a06b6bae089327b42bccd4c28380fa40632a8869ef20f9ac68768836bbaab6dd64003e52e3474ee3ec4c151792a8d343bdec0ee52092c1abd3d71eab3641dbfe8f718f60b714004930250c5bb870611cbba85919aa6f8d0515f789571ef30711893be948028dde4c8e04151f739c3623e30be147db1b9e50953462cad4229abee7cbd67934194b865c45e9c34270c501aa635220413b8816d82a3566d455397f31bdd184ea4ada5f3186d4f7a392903e986b06135b23dca065456bbbbe0f55aaed6e64fb93970d5f9433711d15761a23237f8791a778feb5b3229049efb561fa7169fb3dbe92470ffad848b4269fd567e21d513bb4af80af582e2d91f7ebf0c6744d1edbc9a139d8dbe1c64d457454654ac0ed71e14be505aad4ae14451784975c644a5643583852cdec6459009819b3c406d6c4dbb2ae4141c29c5175dc9ff5906c082dca3bd5063754cd67c68f97cbe45b87b502984eeab36472da088fa569c6a0d2c2bca0925bbeb74bea35af5126323b8ab2d441498a5626bbfe6bb5275c55cf24c5994ae2cbba807a60ac8bc84b24235a5eef621088c0a5f26f1df1a855c43398a6fe8f68feb14cc35bb9b97fb340bf7109b26f566e795e908c9da9badea87a88d74ad2773d3988d14bdb9ce9f6fe4c5953abcd6db3f6bd20e77961a16f68f08fe70cd8a02fc9a10ea180ca997ed3668dcd59f0d8f1bf4e1df02f9e2e708c520846b2f6764ed841e60d47b6f0c366aa98c73b9e2a90397e02472ed3a49a890bac86ebb06c12ebc7f1efaed6a25d0e64e4d1df19c517fbf9584cf5969645f589c718059ae4048acfbcb924ce00b45141fc9da2f85b118d1caa82224b85fb4868f28aaf1a909c2ba5a0fa27f1ae51d5be6a5b25be3ee5536453773386f6330805b95f36b3d4524506394346e60dcde22698cad5eff33bf56cfdac87cd69759afc85f63afb31cf7d5dfff4f01fa1812d37124d41e21a6dc992f392bd83424ba7b9e2f02a653b5c1b197fbfc202fc040d5c6152e84916f37682ffba334d331d84da4acd93664390d4b502e42b348fdf1903008c37896b7552995c83878f9e73d8ba37fef4830cf600dd54029a28df6ac6c77a59ce379a6c0462a4af38def6e709f644f4cc5fda0445eeddab9d546d4f9d16293c0ab8363ff25b626db59fdedf9efacc5f99314d440a65fa4fb34bbbe6027bb7b37baf9179a300107f9c56a8c61e54689fd9cbd92dd4ef445f6a834dd6ad648040af626e919cdd29353b980752ee7f94260c63f02a1bc7466b217f8589e46d2d7404951020566f272f41e85cdeb5f8c982bfbe44d1659a7ae386b505885df209be19ac189e6622a4de1dac2bf1db4c8356522f29bc48d54c68f8a8405a50afcf9f6d0bfa7422940cc23d77f704e4e75be1623b21332c14555bf5edc86892d2c9986d59384a323fc96c3fb040b05955bde46e66cdee85b4004d1cd9f04b6b279229990854790b82854c93098b6cbf1413bfe5268236ec50e7bccc117a6b6ffab3d37e9dd1992508aad3b5d849927caf07d4551ed0b4d657761b8218a950f7e8a9169c8e2213053ec4a236a11dea188314d24cb44be0ca5425e9ed541f84c95ddc73615dd88f22914d2883e84aac193ca53a2a6b66333ec391c85c484f8f2ae6e86a7b81675603acaee73c3282810538336c7cb89234aa1224075d89bbd8b300377c39ad51103eed846ebe0447d1531269e9b220525da2ec67576f8cd6e9f83654192a1628362ae0581f87d1fd458937935279374926afaed61910c6334b40f5c8d1cb604f405e01848a283025362e246a072071c91836d5eaccdfda536543bb0036ac2058c75eeda42f2d83522ba87538a8464474bacefe3ff33b1db9d0671284a83abab72393e1318ef65006ae8e8689966943be76de84202c9114d9053198d0b6f5b3fcfd93a8a71a212ab53756f4f751f7d408e4ec0445c99054338c199a7ed37b808cade4809f611c87d04e883cfc7b709a068d8dfb1b5ab7604bcda5a3e99e2ac508ccfd2564f466dbfa6c98baf37371fa19c92ae51b7054ad94526c41ab6781e5d3d343f3a2349eaba60a1f1b86ca6a68d530593ec08b16b0afb2c4002ed02f5790396f77d1a2028b35bf71cb20f0c88aab4b7f74950b7bfdf057434c0e6861bea097b62e7ddd50ef5be537465c772ac41e8324331381d309f8c86091a480f77f8756ee840147083c7b23d61983ddffa9916fedd6c67eda594b7eb28d9bca2f1ed70f4f14f67f771705f3e4b15195b5afc67a12fc2872f0504af2af7c5e949710f2197e5dd7c74bf39ecdd9aa202eeb4b003a59ffb3de93a389bcbe0a5780bdfa8b1de2cb2feee556a82a3b608a0a1f0fe119297de33252b78a4564a4210f123fe47512e96936e1b4b4817080e9c7bf62eb9ee7e3411eac00cf2549d655a0126590c795351e3fbf92367c1f67e9e84ae882543bcc57e41e13bac4d40d4fd45ce0328dd04aa979dd73c0629e91f4dc501547a18b9592330764efbc79d58a2c50443c206a76b575c9ddc4ed84ab85245d5d9e3f6dcb8a8c2678d064c1bb8f188b160027aa65aca41334c67557f12540d146086648fa9b4fc9c40f66322be9196bba311c36740995381d47828f2f5fc23a4318bea3af6efe8feaff2951a302bf70c54176954e46c9b6fbba9da0928f2916f941b104365038d732223686bd766b48abb3bf2d310e91fe64b24f22e75dd5f5bd15e5f13bf95f3e4e0b0667e7bebd31f1fa6e84e8abbe9ccca0ef8c8a26693522f7b5e12cb50233a32c217b9e4615fb2ca80d22c1b88010b8192743f7834373bf79a96a853d9245b60810285d9715d2a02f039d58bf96d89b8d5effabff052fd72e58d3e1ddbfe31b214af4b23c3d771101ea4b1a2b53730b702f1633f41ed82e582cd3af3fcbaa36fa4a6718afed46e3c339b28286567e6c53f00e1bfd00fb19b99de069be45f98e1587061d6cb5d09cd57a6a2e4b003952bb4a6dc0944c072db534608dd3cf5fa4e599481cfd1792a0db14e879f3f1524328b6abce34608adecd78faa83ac85b0ffce9a3b3db930b9426a1a3f21b9a47b1fe9d4ea167ef04a174e405353db15a23ce00bf6e72a8a9eb5a9933232c7b9823df86dcc6a937f32a4e0e26a1772b0b84db76d1996cd90c1ae973fc89a115b21d3e0bccba62ebe4bdbb4fc5995185bda797a4b0e124a490b745ca86a203e924028c94a5094f6b37e03f31687967620f009522a3c2348be62511f567e8ef666c785da9dc1fa9468b466c4b95ce13406e24566940b916ff5b08b08d06eaae3e09e323b3f87a1afe5d34a506b4040f9159875df10e32368f8db6b419ea03dab07ad7715b80b51f030c4f8bfb79b796d56fae1e4272ca2dbcfcc39ef487e0ef6e4dd9c908eb4d1fe5370b83822d55539d0f1d19e5f4ed76f806c3d3d566ee76d7d14e8d34be9eb8356bed2e336569c058c638c3443b187cd15a2bf5151da8eb7dc3ba407761465243f958de97a871678903a5bcf58be7d9d95550653c129cc7d093b1953989c088b18df327276ce8a3be65c869728db8086096f5b6c2cc369670afa8ce038e99c60e98309a5b394c2f696b355b33a71573078d706c31c102d1ce96248d5de63e94ab8695aabb8428450a6250f4c16e9cb44ea754f821878e045ae5a945b1372b6f28f796dac0d3e99f1209cfe8945a9a46a68317dcea96349895fc9b79a5d7ecd00759b89cf3bf2c9820bff68934e1baa49f8f3dad2553931910699fab947eff41b73b7f83cc9c4dbab70369691b9a6a48aa5a3acb3a7626005aab1a5e1562df4eb8fb5001c3f1e99135628d0ac0fb15cd474293c9c24469e8c54f9003914a09519d37dea972667c963c5bf5e0cd6a698d06f6dd2b3564db3ce0b5952ea08b09e4d47f7fed405073442c6e287d899ec21269d58b620c4e06674d7b9e51bbac6d92ef20c83fc6466a2595f799439ddebbf7d06d02f0cf6658026c001fff5b3480c65dca2c336cbecdb509a6dcd562c0b397db3be869f7546ca8bcf19e9a07aa0009a0da204abc301a6ce7fa47a580db459cfab0b0400c8e9094c0be9eb4397347d748ef58f82d30dcc7b1507e366094ee51bf69dee5877b808107d5a4c06936e4b9b6681ace484781600647e50a9a741a6089d5e8fce0b198e802b525612f5b531b89d30a2f95daa490574f208486ff5643fa7352e8b0b7662441fba4f8f4570f8733ce9bbe8e60b30314e49546ce9d3e7681c0912b6ff364d03617b80a50c09687349933ddaa704922df96d7c3d9e41f62a05c484786fc11765f77b317ad0e74961cf1871f629fb36a07d44c8e215a85b2d694dccf9e47f8814eba4aa391c7263e4d35f9f65f359e533e3b87f84d671dc1a508c3260e6d867b545dd320875127ea55f500f4e8d87678e32b0eb4a6a024299c269fed6fb347ef30b0d120f652f614b7ad308da80eb84587213525d58c55451c8cc7782adfb9373471e93787331d57f2dd0d43153ef043aabcbfde42820dceb699de68d83956fe000f7fb682880a2e97f2fb97a8efaaedbe6bf3408637da00eaec4931e056adae03f8092090a84903078d800deba734be42bd73ff190436a639d29c65ebce29c1b0ba1a283a3a666fd20b4f0845ec4a3fc80fb65c637da009241b5c7742f667c3b6c4271fe7b4ceef780a9d39402547eccef13efb0e0aa2a429f4edd89e75c43e56a4b48a118e0eec79fa0ef382e8ba4fb7f0725d6141bb21bc1dd52c56a2eb9c30ea46f9404c82f1485828e966bd1dd3238bf4f615a955fc7ae4b6c4f4242a67d5f362e00c76e79873b35f6d6408ef0192324b5783b80f8eb6e7e7450f602d2bb65e7cd0de73894c8c8a36f21362aa657471c9f443e4446320a60b1ef0fd5052429a093e2ee90477e34b2439fd40dc795ad9054eceb49114189d86d5514220660b24acaa864dd5b51884cb877a2a01b7a5b691d99caf720c3f3cdeea98d539e1809cbb886cf8699ebcb5818d2284969af5b8d427364b73d5e50297e1403cf95f4340da5a5b9f5c6f105bea9d7ef717bdbb5e60ba140ef2ebaa9d363befdfeb39b3df6db2ca991ad0e3e66b4af7e8117a76f5bbf4ce609bc8005b3e5ce0348bfb62b70a14428c215e87f3880815ddf06bb93d3a89bdf6baf586db14e6d9d1583ec07623e15bdf0c527cf1c577615f50fbe28380cb7b27fcfe9e8b5e4c254cdc5e6d8b3fbc6f083867437fa7fb62d2afc59377134c7e7abe4dc7ea7f1f6afd84e4ba64d208049e32077beba41682de59433c76668f40759b5d8376fbb30379ee6c47a17f56a51795bd76c44e5b49d909ef5e0fff06699f00b861cf58b99728854f95bf9c1ad8fabff3c4980b3c30692e3468a24134425d8ae8e3422a859eafc629151dbce708be2d3505e56f3bdf0532bcfcebd1ab63378669788dc5c972763d63564a562dcce87a0b8b2afeccae13b3d37b3b24de64c3afb491e0ced7baf26798c9d3fc619df002e1f4d71e71063b2e32742ebf4f9f785344e009ba42e0cab133f0392424e46b7452b38862cbafd20e3478250571abdc2da4b366fc9d8c65c6cf59e841da38c12ad847ad403ee38ed063e7bcabe6f2557b5ebc672a4a063a04b5777fea141387b2dd31b45b4d49a8114b5353f7020b7ad8dd3ba8a7caf6dde7a0c95e91450d2598fc024c08696ad44d553b999b656fb2c2aae19a19b2d6c80bfbd012bbff7e31499f29c2cc359f99f11c10ebed8397a3c5422ec9e4741e6ede312c1aeea5ff21414128b73b14805f88fa63c981ef0bb46d2d73a69c913658daeb2df58ddb087c0c7c7fa7c988859b818ab4c0dcfa446b06d770bea69cc70c8e7466213df112a827cbaef2fc2447d4874784507357ca4e4eda768096e949006587553c639aa64c1f993757476a2fa0e6bb42f6d96a15c481a1157ae22924bafc7e8b95934a4bce607f99133fbca5674c40712273b3af646bb5de3c1cbef2c2bfd479cb31627bb576e944d549ae51ce1491bf71c6c70fb459a33112ab2d2b8e2c23905be275ae77df60db0bf9b1bd1bdc095e536716bf2ad7d39ebd11f64793ddd66fa61b166cbc0670cc25d4693ff6ff220e55c915263e52d1a789e59cdf6a218778684fa73ec8988388c14e2762d61a762fe76154dd657727cc07aaa34b77a3914ae0f4ba8d43e223a15cdb9ebe4faa703386d4586d46a1308cc4b58c1452e09e47cebec2d0a49fdb96671111baba2b9ac9b276922e486da65a3fbac9e27245090f7fe252b1610e15e85e6332e0ac1a705308dc94c8f138d3b4d70eef0e5c6d6bf27313eca81fd96d17c16674b89bf37b5fe87ad2a5c79f534d39466e2087b621a156d7e31d176e3b953e7f59ab10532650dfe5ce4d321daf63c4d5c9917aabe49c8982f8991e592bf1043244409f95fbc66d81fa37c710429908517409abdb0f3489b97f946b1698abd113d711a04886310ff3e8fe0d23a76d823e0fd191b01c09e5ffeaa7a4231c3613988486a8f7301135901cf86ad46851b0ffff81d2c795ad1cbaec3b400b11105a24df28300e93f78d0af8cf668eefd6131bc5b2d58df66e9c6ee6d7d53b31db036d497edc0b2c5464b92edb96dfb86b2715e4bd207fd8fef3a05d05ca3fd8e6adc645d2e38963a85b1f01b562234ca17b72ff293a1997aea0e3c13d958590d3b7c476fd0cf5d463eec123d55f1636e97eb7578f88e7cd2e22adb5f7cda8d422cffc3f35becce9278e3407c3f414e1d3bf5790589366e3de0762adbce9161d4444b211255f9b3c63b7ec2009b79be7d0abd83bfcf023663eada70b056e69f6c8c49a9f3485dd28a8fa5dff0f1037b360c2bdbd151589eee0b3ef7059c3f0db10ae1a2bfbb80f3847d40e074ca464df14928c86197a16c83488a05032905754cc8fc569d37cae05f0c370db6acaafc56ca9a93982a4669ccaba6e3d184a19de4ce800bb643a360c14572aedb22974f0c966b859d91ad5d713b7ad99935794d2222570a3167733a532eda0b0eb17510bcb581e4995440101a00ee2e80c5f74faece679b372ba237bcd2556c75e3ac050d30c6f8b3fc66496e03eb2cb0bb826a2fda9a05f018981fa436cc18383fa4f7a80e200b141086d2154b5719519f81654d4cd69283b5bdbab5642858804dc6ad34577963e3180a71b8e01c3e8afa5e09b12e0588198a7acf95634f74759678f15a13b849499d59efffcb20e38453801e03870e30d9203528ec3b2bb43ea12389c24bc5056e26db1391134d5067324f6cea60d9d2ecfe578b63f5a35f04f6303e130788df793bf8a717c089cc5a1f33ba0fc04eb679ad49c1a1979ebfee1e05d8f54de91f9264187138dbbea085a394d11aaf5523a9b372924f2c061a25a00c1f1227d00ce32aa33b9d6bd3151145da7ab236d663a49a39c515b9c2b9d004acdb0f9c25ef911401cbed78b071268e6d7b7f5bb9bc91e908249a48bae418d34cd397b4d010c7ab9ae9d10b3dfceb05b69c2b28e6779829467587e0d6e3259456d05078b9b7ab75d75ff12a620089321ba75ba545dbe3e15a81838afefd1ecf319ae2efc82c65fc1ef4f4e007c3289d0562b9d9bf329799ae10374d1a7b2b0d45f9f622e6b61ec8d86f8332148eeecfdd97edcc3ac2dfdaa9ea4b3112a576d4fab53417f99ffe5f6e99452a71a9064f090c9f869fd5e12ab3d6663ecec324afb89543d8ea2d2c4b463ae3cf065c96a5f38a7610d7b1c514349d307d361d6023e762cc6da2a9d114ca1a0429bbefc75a01d81a71c99eb41d940753f533fb50baefe476dc085b14406100514179a9c0f59dc034b15ce6d6cf3cdc74aeaba41cfb38e3ea2f038a1e5972b5711e26d4aafe2e086cd97ad052b192e43eb18861ed6e2a27cf6e7d7f16e767020dc8acb6acfd1c7969ef0aa3504bffe75605b07aeb9c2e77ce9f5d832570a7adcd48f197ef7bcedbd4fef3a8fa26ecac67b20d373d0caa9d8fcc8bdc737e9a7e58a5dfc19a00aef6540b1f2776c9bffc17c185df0c46085fb9fceed22798a83f57e75d7bd612239192207567ecbce29f0e3902bc7fd3ae86f43870af6a4739b67117520ccb3b95763544ddb28588bb5df5226b14bf3a06daea87f8b96311b5ac4f3ca8bda0026c6be6803f4e68b4b4fe7485a830f303762240f16f3a3b8184ea995e46d67eef11394ddb8384bfc833493269a05844b76828a17ebb78191c0e35f685149f8c8beaa8115d929caf4da207d8d63dd4dadd43b2b337c5bc266cbc580ebafa5ff35d607fdb0e52de62ca68000dd466ebdcfd6f891e23754d89f8f4198a04e060daeedc8852f7ac9200c7edfc7a6c03e672a054758b4ab4756b481f42126caee86ac4c4891f1f88ffb0cc99c3c7a5fd0dc64d5a3da2b5687af4e5a6994df94c40ca69814be98ecf6e9b62d41c9b883aa8fd8ce9ab0a6b7aa54b56efe7e4b3a2b024657c96594d6727e91006d19e1ba3ff42e569856c74d33e992364f37ea2997f9d3e1c3117633a72c15f97a87968205abbe142946fd9598d05d56c87c4cf17f75f7ec8e6cad82f974bd6ef6ad4779a009007dca0bca1f6d9b8f36e695e41055e92acea7b1ab52dddb1fd76df564ef73aeadf9f71fad4916cda05d462f3004cfd5d51e9b9b1011e8e185c95cea8f72150f1f2f4ced27b128c9293053a2b15d21ce9f42d6834c4e9f0aa7cb200727afe8accc74180ec9d6082082669b9b08781035e1d1e504e06764c8fe4373e5bdd782fa4e7ef50ef426596654568a7275e40f9e3552438a5d0ade9ef1c8a4e0b2a7689a0d867038472080fd1796acb3ba3f647a022a7eae1297611f1ad15f82b69dfdee9241064523631377349d7ee925d8d36be0f0f2cab1ab90abd1e3e0663a09d77a652513a0295c854743d17d8d494ec0c65a1c4c7abaa5e1d7cf76f3e5ad9979c00eb944c3b98b6affbdd9251aa50fb11bc622e8388e14d9256c10f6ab91bb5951f764063a646e19031b2b121bc9aa28fecd9b527eac76eb172028650276fdfa92a7bbd47eaa7323e3e43da0fb179c9cc1c8ec27d7b65a9c1f9453bb94ddbfd21498372c0b0c39103491876e531f65811750abb4be0c2e70c120f986cd26af745a615c996a0a3e7257abaee69e61837a61fd40a5ac4e60ed8e6ea04336021b55d66b92990614e1aedfab0a86475e74fd341741572cdda086e9d5de7d49c0a20b1b4f7fa789ccc14a3f1820e9d896b86e00473465aa3a5bb165ef1aa18302c1e89b658a514f826bb8f87b987dec8adc5148f5804dcef4f1118512cb3c7c48f982c9463902d1e63f9f9e2dc7aeddab4f5b90babb6be59e1f1bb9f996ba9ff3c77e377a1248ab58bb5282d7351936888fc159ff5c6c98862424870bd3a858a3aa1f68798c9f566a7d7658e0773981a32c47074bc9bc525daee07eb2289250c9100adebd2e834d9bd46f82d1f48c497b93314b18b9d7ad752dc40394fbe4f2e4a7b4fccd7e710b5d8ec29334338df882533487fe734b047d0f43b81cc43cc986cf926512d3051a3fdb040c8fbabb0947fab53065ac82e1d5f1e3fec227e64f1ff6478a35e29bf4a367a8413d0090064ce827e6d6bc1bd00044296a2d8d9dee20ca38ee9f23c21538a323e3d49ba979f1aa211dda3872598c94886ca76ba0412999eb04c6fd0416502c1b66def263dee6bf2547d88822e8eb518588d848b9c2ab13d26f45f4ce529a40d34cc48b6baf9ca5a8e76a41b9f8ad09b54128bb36fd159683708491ad6467aff0082ded0d5673ec209ef7fb8423323b7c182139a45b09b072cb0b6a1dc658c7f61b639de57e1d0120b119fc3dd32b555e904a2a8e66e7e024d162d49be2ee076a191df46090e8732dd038ea2392e8f5e12c1c24519b40a41e25f367a464880ca063a5a72b0976b0bc7eed4bf1ed0b7b885e0fad9a72a48ac33b6599c3a5c7465d9d932c81723848310faf78054c0374d8a8ad2cc59773f2c88411f176311c22d6198edb2055bdb83024e814fa2a5170368e7d386f544f8a728280f548910740ce89d159641e677f4e313fa93d1285dc4691e8470433879065c94b2b9740192e9b41031de946e60bcfc70e8b3a9f01377d3586ef00dfccc326cad8eafeb8a22ab0e1acaf1c6989fc5958ed519f2a64004efbc176f1937f912a09a2d9fb8562e3c3ee367379f0e3bf5f695482c74f1ed52057309563092068d3f8417efa10bbd838c929018e7783c3666acca54f77a214b5da4cc0b1ab5fd8d9392d2096f52d868404fcefc657dab6f2ffbe2f942e8e4d63e78e6f89f47e5f9e2ede853ead286d3a144a74be2c68f8897ab18831ee43edbf217e18387f1c7b875bce137d934cfacf896a56d26fbf068e7e4f45b53163843bfa84516995aaab49428431b051fbbdb8d7050cbf9c3d6f966cdffe7a925d9f4ee5398189e2a96d487599869373c5349a8f82fcb23c64a225e8fc090e8ba2ad7c64264f15f0b94009576678835339edc9156cad66bad53cb1551bfbed77c31d4919a3008a1a3aa2007a739e0c7aba47d8fb3a9559a20fadcd43c85da3f14f8d4958685c72f9ae31d251695d9b74c6e15ec3755ae78c6463ee378994ae82987bd1c2cea95d09944dd37e803dbccbf038aee09554bcd483fd78a2c83789a64e4796cb4e7da4b48d74985480b4ecdac6cc6de523192614ded901181ccca1d6d19eecd4704ff694ea349575c369a83baafaf043972edfc7e5952bf9efbaa38eb2e06890dca6af254b0c6f44c0b27b692d62fa7e79fc365838a03deab987fb58629a7e72dc084ae0107a6a541135e2ddce82d1083407b6503888cb4d22cb15ae714bb2ecf6fb564feafd3b263d4a5b23fee908836dd7fc4a75cd68a393ea8f0b6f629a71d5d66def2b03363d9d8650b63ef425528ff364a160dc8a70856cb3e9ad8d99a3c14fde28613b0ffcca70701f1f32abf802d08bef8a3495568fc840e3cc1b34e571ce43962df31d063c7f15c9103301067f05deaf72743da81b93b2644b99f0d94fb81ab2d1c9d1cc7c28de4ea253c8e04cf9d94b9a09d7f7a14564f59c9851d1b3b3eff8fd2de2c1f204261a563368380523085e6163f8c7b963e5123f74dc7156382ff320adb489467779a69c5063502017f8527911149aec55bf44c4ddf53aafcb471bbcc7cb84e219658df5295edb365f05c241afafd392c150079d32309018d3e1ed51ea9c374d50663af12c9f2ba05ecd184b8e5f24450d53c54900231439e87ce260a4ab22e0c2f83800d8b8e4069dcadef74b76ef8bb0171858c621297b8f748569747cda64d7980fa4cc4076d1a26b80f5559ba7cf40367b4cf2df52662f6560ecd885c01204c21c6d65aa6689f34ba8963b31ef98341e6886249221824 MD = 1b759ff129719524de78cdf9bf814d78aba88a51cdd2861ef2b1c7fc3b5e9c73059a5ec8180018d6d4e770b6db1327d5 Len = 100816 Msg = ba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f246bdb1b7328ec6251d66a7824c50caba0447ca49e43e5f5b78648e320aa51dc9bb744ab7d3c8bd555664ba23d85c9b6891d57e19b40c3bfcfd9a990d89f6c121eb3bf2c97c2b7779f274d6ea35334bbc6eb7746060874e35fba660f12e153643fe9a11b7d5c0ddd91c1f639d0bddc0fec07516e68fb7814e9a114da6a10c66771b190f47858ed7bdfaecc9050463e476b298cb72eaa5bd8e0161c6f389e337056a415542359d4e6cb46371eac6cc9d6c69a7face1958e83f592135a28fa093341499496f8cf6282f730cc114f920d527102a0dc0c3d8eba7c9d601795a4d614d41aa549833a04f4e5f70224a466873f0cda96b11902eaf0e7a0a924193f1899818fadf83d1a3a9119f16fd5655ab5f0fc8ad7c892a611bbe934450c1e195f25dc21350f90f0820bf5c86b8fecdf181cc2bbda8ef367916fe3d0da3c3ed4086e4677d10c295d69ba2bd49bd0b5642c16e1b62570d5f7f8a15a0ecf30d5efa2c742dbe88a60a150100ebe672449aa7073fc223f1a94a7a5e4ce369a869ddcbcc573f601f6d16ce3c220de541733e273b854888de8ca2727aeb2f0c2a9d12bc4fd3c3eb3cde620833504ccf915eedcb4589d519867e0d70c63aab5ee171a4d49b31e2e549c396cbced2d02bc9ce4d9a0d938f5f5246337a2a8080e636af3c1c99b9c3d8ade25a1ff5efc081538b069c7beba1e1a8aebe9b8e07d52c8f1d819a31b28f4bd003540d90f0445a965dc1d978d83127f17c53d8da15d3b955851c584c666dc71af02f9c871d863cfa0c265aeaa368ba96799c3bf6f3a114f1adb45ed01b86d3f37091d5c2beabb2e75fdc26bb956d21fd6d41cbcae969c5c95df2b2a71a01f7c34a23be2a1bde41c5208c45d1f469e49020ea903e3e5055475f7e5eb7ab07bbf2478c62a57c4573fc15ddc01608838cb6593e933b3c804bd27aff6aea15c0a8e82f74c61c2808cff407789e701be4a0d6e2e5dba729212fd1751ddc26a253450dca85f4786850dd16bd04e7c973b3a85a8188706c4e5a8aae1981be5598e91acadf65f39f844526c8012aa30859192da9ffcf5b70f354e3d02ed3175e40a9b08538bccb7bc40e31739992db15153eb62b2361a39d6037c29f7cbaf029e2bc8ea79b3385f36fd486804ee397d8ef49cb48b7e750d9dc2aaf83cadf509ec6493d99d17127eecfbeae55e8c5dd392f62f46881086b0eb05533e4e1ea3fa5337943c2a21fbc562af5305c2fe2b7201cb3baf34b6dfb2325e1d52a8a82c62673742a89d5e54912c9a094fcebdf2c75ff61a451dbbd080081f61ebd8b4feb09cc617958346ad80af4e8639ce367442020973beaf9a19b8d0cbb9506acfbb8368768b99685577026f3f524a6e0200809c77b05276fc1bab21059c26bb72b3595ebb371aa91531a4e0dee5f81aab27f183c358c6e04c47057d3f82d557289690f426729fe2007dd6a8bfb9d9509c6b236c6ee58287f53c2649ebe5f2da7bd5c8ad2af6af9fa1bc162b546644ac504a749afceefbea915bac1b9d6df591c6f16efe5b1ba03e636ce1ed3f43f08a513683a3dfcdb964ab35f566c6635439a46a027c195a484ad000d862d30b337729cfdf2b9a1a41a2ad4b90bff97ea51e8ea0119ae84ade4172385830b204a3ff4466c586be4d0b11021d1c9b99085edd00441acf6a65f8cec443efbb4ec8b88f3babf539aeee9c2c541ae76e47a8e7e183c69cae02241e2f40e41d871bdfe7a379ffecd8fe677b712dd58fcc67c8d6c89397f5ab320db4ff72695008abb2c7e879e2fad93f500f7bd9dd841a7bf0b1eeba48e43b8cab63cbc37425d470d9cfaad5f5cdbec430eea8e28352fd16a90fe06249b6f3746590f0ce751d5efdcd6586f898c3ee2f728f84f2777ad8ba6a273a162b0c577bc4c32afdec952cc4f63fe96c4c8c0bf3ad789c641a7a21c9bcbe58605d42dc255180b6dc5b2bb248fca56eaba1748c933a105bc1fccf8cd7092bc7bb6108f5e3844040e4415f840c393c6321081bf4a0b11d4fa69ee96e64e7f61491d6bd3948f58835902f9f0681447b838710e0b88e9ac5e45c61564af5c1b3ab8e1ede2ac7fddf217a8668de4aa6d93c283c715ccf6fc0c68de4a4a6fc3edb08fab9ea2ee325ab810dd64b6fbac8dbf99eeb3c55d598844295a943070aa7e2c982287fca2d0573d0c4afc53f64230a4855bda04853bd86f52e2fcfef83a541499efafd80f805ce9d397354d1d96ddaa4d7245b88ac475f6a91d899c509af9d15bb91e1f7e6bf2242c6b188ab8cd1c39bbdafbcab51be63ff7b443f2c0f4f5cca629ddb737b9a056e16eabf30f1275b9953c04234e69b3b4034e32e98f6dce6c41e7f38a8291efe7b849f8706a8b7192a43f69a99dd565bc97945f67072f0e18f69a687fa71b663f7aa407ea1060972cb08c3146e98883be792ed1556e623c3a8bea457ded818dc6ef26de474aba6fef81ca64e17caa952472c3909c0d2de139c981916e9ee8ece5de78877160c18244dea20b629c6223554afba5222cb9847d78045439007a0c0210420a4e9a9c579190bc2db092d8b6b9c98017d1132ead6e601e96c65c5f74874e2b6dc83f74773f60bfd2b5a635d5b8b7f7ee9009b3e574487560fdf9bfacda5edbbac6997068b7135402581fa109badb0b33465770b2f7fab1b9c621c13d6508fbf92feeb9b4607422c6814743d927fe62eddd468e9f5f3c7baa091a8dae8e163330ed8776e2a14ad225186444cd67e8a4243c1c353114d77b3aae2d4c87bf4e2a69e7acd07be45c0b2806bfcb6de2617ae04b218cf27e9358719da226515f7a89ab05a5ef06907376d631a0014201318c2af29fbc690537ba57bec14292d660f7ff2fb9fa0b0d57ba37824e0ed32a1f810919dcec1e128d4bf5f9d1c9d58bc91d6b4d311913c2d08053e11319a8c6f50186a821459a0b5bb052371ce29fe87ca2fa475576a519a6703337354a4a3e79b6a887b6ef645a6a94765ee8b67a544330b1056d364979a031de6afdca40f87445779fe3110465829d6a587e6ded37e46c9a70c184874a886c5c64b3c1125ead59fbd6f0d403966a73350b262e81fa2800bc6e9986e8f524c8b60b9f5749d7ee983d15245fe854ecbfdf612821bc03d7941fe83c64f3e03deef34909b26ccafdaa4445c9db3b06ce297141cb6f29bbb9cfccc7f34731749a851b0538fd03a1a338184c256f8516d958f29258404d8a955acaf10657281905363727755e97c3a8eac21480444cebd5f56a3e17bbb2d935dc2150bdbb623844a94d9608fdaf98d467498324811bed8aa7e22c5009df0e5ffedacb5f9c67372085683c3903d388ef58b583584f7784c01760444b515c93dc68fc493621bd8061738d0050988bfbc0640ffb63d6ea183eedef6e4fbcb2ce74c18fb48873ee79cf1ac6ca94e3605910345ed28e3dfb11cdd09492a6726829eeb29cf39eb9828c31231a824e0dd90aa76faaf221ad33d735685998969a060a14e229eec01cff2051359211c63d7f764dbefb42644d18d23e5e4568685d14dbacfa418d36c4ef9cf5f9345d449cd806cac95aaa9e46346baf5a60eb64e21b037fa1e9b847d8d96ae6160a4f10526e20e537ce1219bf0f085203b307d152a3ea55802b573c8046f1ec351ccf7186c92e67b160621be12f13ed0245a5f9d432f8f63e0e525de6bd99cefe70c6b1616f9619de1782edd31ef249fe1fae2291529529849a91f22fc6ca5618101a160aeac2c067fb5bd7be640f2ea0470895b08a29b7fad8fc4386e9ec4a2c04b5e9a9c21827f314d320ca87d06490c79d9a5a621c6947cf7c9811af6773e1527d71687d02152b6bd3121e119fb275a75378b763d6051488f738f89fa499e0045cf86da5e651b60744f3e38ae3e1f8ed1479ee14c0530809566c64420984d12239c4e0c12ea43ef00c0c407803b9c0a3c7e328fe401dcc5c827c7d1efffb5ab2fb1eea5a41d6682f15a55e65690276d054ff8ca7bf29078962b06abdefc826be8c4eb3f787afdecb450665d87c84c17da2154399a6406296dd4f54a73fb1db4dd39c622068f748cc86767c5aa4074ab19b6d745c5b2a858ddda36262597f2268b8501f5e4c754d3bbf3fcb724952b874264e487648af177549f2bd78a3faa21623b114379bf2961fd8a77ba8d32eb4ce2b02e771d397c15708858c7187e9045ffc086635bd36cb80b8f7b484ab63e6c893cf78d566a92a3a04a4f8d36b15ef4b2b9d40e01b09936649769d8f37b9f56944fe232868aefa2624972928b9470ce399b8c8bf1b3396da726e5f50e0f88aba27d612f4416fdb2450a546f7d845032e2ca1265a267b7de31b25214f0ee74cc124a16ac058b1733a701777c930d77b34cd9f8339a5aaf08a2ce40c152a4fe48824a55615173f6a736d35e62529c71cfe65fc07e5fe8896d68ef348299af8f9170d2cfc7ae5e069d42d47b8932bdc8f93dafed9e59bdd18cf279afc13c8aa3474c97c84772a5b18679995189b9edd7cfc16ee22c1e2711d7de021515c1a2d3da93edd17944f791e3399672cc6ea938a3fff1409023d0c4ee9a2cf6e8bfa48bbbe5699dd5aba02244016041c9b77c662667fb7b72f1375531a53ee7b28cfc556b9f7f7fd50d4bed197f6b511a3ae3dac787d2053d0cb75d318dcc4a2bc016ab7a40b3e9fff0574ce3f23c23364f5c20f7ee098066dcfd477ec269a09cef800868679b7ededb6eec2408373a968b51b337f9265f88f865ae69d18b7d8e61b4e6a6829aa0ca44df256a3000f9c375711c1837acf50bd58cec8339965388cd41e0c51035e27ac3449326f81e03357416c619380203780adfac7b793ea51498b361449ef1d648bd1bbfdaced2c9752ddf4bab58c9ed45feda48930ed8f4aa4a65f2959d52debcb8e0f5f622e3cefb0927175f3869350e28095b6a68f9c4b268e61f3879dd7e5f3d20f029a2b5864f7c7aa39555645d291cf95f72161597e55ab041cdd2f637a8c04818b5cccc81eb1e668afe2e5fd83f5406cf4aa4a0d09bc651049637319d11d8e2ea5aef9d3446556737fa219028a953ce15448350214e0254c24205241132ed7def69a9ac2fe9c7f93509ddb9e10f92cbdbf04077ec84b5181551cb22267484758262797dd76ddc990cadc14173daa76c8dfe5a9ca4c845377845f7d05f6f24666de5dd86cd1b09c319666aab6382f84ca59f3032ec91391f658f29932e8b43ccec64546b73a9d603f5c4387c32a10bc8bd836fdf1678175c679dcf0f16416915985e6c706d72d7d83c37c91863ad688d202b7805d4d5465ae9025688a92a1adcfc44944a0d0e75bc27418b24691084f697f7d72b8a417cb7845d6eb449bdcf9f82a74a6ce4e5462c7171fd14d562e7816f890bd4b934f0eea3ff56069a74fdb9c6071d3d879fafb59539ad5e1b2d16da215f9475e438696cd278dae3fdd83bc820d48b50678638c3fd090a84bcd7895d57dbffa39dc43cbe8a4a3bf0f66ff0573daff339f74177f42370931d3ceab5876d9eabc23850f15055f417a206a4b1c376ea034ed949c3a2a300d58c0def21e4fd08377666671dceaff6ec7bc10f06b967332a236017c27bf62a5055c24d64f260b901248a8f188602d338e29807558588ebe64c3e23facc876d820edc9de53c4311c75127317812f9197b7b0e3624d44694b62dc606b330f13af91bcf49393f1eb2c880bee6c2f1fd2a22b996140b123ace184c9a38a235ae2304011ce7b7574e1ca337d4277fbf8995cd02c2196ecbdff88b2d1d223e4728b6516347f206217bafd5eae96c04b818dce8fb14cec66da0849d43d15bfde1fb556f96c2e0ac3a01fcef1e713d0888357ff516f09cb8642722bd25596e57928080ad20203bffed8b743d470e12e1bc79ef7fcaf81b9b6bce33794617a1d1d572e898a3e27c97d872b67ef9127626a120bbf79b9db405e12037402a9ecf03272ccdb0768c2b0a675223f2a920ef5df2f465eb1d540e8e40a7cea057512e420428d0933c8fbfae36945d56ebabd6ee1e4f6dc8b4bd838b16df3a1830c14834f8f1619f5a6fb319b2d3c30a1535c55d7fbc342ee62cab82d0213a265b71b55272112163449eadc3587ae58ada315332b3a5797c4633ff0c09381f494be4fe111bf2705dafaef841b40435678f30e8f446a57e3f4965e69d3e6e89ff769d7af7333fdf0ce0132b0b420a431ec8a6ff18a536e2e664350aaccc5eeac75ffdb47b6433ddef8a6dce868ee79f1f0b261e165bc428102b23c3b15f63b22f8ca853243b88fd8403115b59f74699f6bb10ce83d6e7be3b02b4ba5144178096710fbf781599ae58ee9049dc1781d4147d0978d7a32c25d58f5a56f33704d69a91a651ed7f0070dca17d22a36c33de26b572a5984cebff6e2597121d949614ba830ec2faf437d58dc03a6e4671d7087bf8eefd3c40a19b6369fd8446d965db64b9ab8b3701ca5cfacf5a952ba4d5e3a2bbc0b83a0b078a53c0f015f591de8b37a9ff03281412779233503fc981db002972ba9f1818686ccddf014fa04a7ab491d88bc324c7aaa5f270adb6a6a530ee8eb21efa6d056e832ff8c3b9dd6fb4e801d9d453d3891d687a1be592596b81ff20fe70529f3e649df8b299cd137e378606026b3daad4c55fb7a97a7b486148c2aebc5140254fe4fdc6a105f1d8f25d1f2cf6b2e921375ccc398deea9fa02ffc98680244ba5968a2308289ad0a468a023d52b4ddebd3d2e6e5e5da4d6f4ed018436ce8bcd86cebebe3bddbae1fc4dab349d248e86f532c496b48d5f5abf7c18833e0bda5e4f44ed2fe025089e472dd8b1f357078a6fc4a9d5ca8150ddb02c8f370adca2666595afe88382e67e1b65a33c66574b51736f68bc1efe3bb87d9ae0203b95768e702d7188949be6f9ff91b5346489cc64a6af6baa104872738e33a5cf3eeac93ef598dc70a1c48caa5a4e692a8c82fd3c7fe13d404cf497b758836a9483310ce04c543b41199149f7b1d8498f3cc7706175c157ef33871dcc73068930a6fcd41b0aec387a9a86917aacebd0e2f3bba85c1eac46274274674b5439ac0428c29157a7cd3e7d731915ab91d589c65ff41784d12e8289284116bc72992d8f8716d72ea983c7ca51cd28f30741fe99cff5408433b487852371ae9854b19843206e07f8968c5ef1a5175de983ad89edc233b5c2cccadf8be28a915780ff66cfa33cc65de5538e83eb9c17077d74c622d533d9e902fdf53dd40061727def33757e0774b72c85c0e1a3a006d58b343de9877a3f3f5cba62fb76579181a21d68d52f52a5acb27f80ab5bd78fdc03685ba2477b685e508ca3555804940da3e6818f15a2dba73dbd583182b734639c8d99dda3bbb7ce74e120cbe7abfb6ee9f717d3ef8c892f24dbb22496a37734ad1082fc0acfd008405475cfa3923a3deaab96741b5430acee4718f52640caa7cb9db19e1b0c337429531cf12a7bd2e33c9077c017ae54c9107c1713aff3c1355e817034230544cac67980b0dabd480746324648630f87dc22071710a250ed85fc68794ed15f96547e144b8f32cb1c029dfd9c8d8bdc2c8ea964a36c9bdc91e22bcf275e945faab9d6cfd7fcd149d17dba7ec50000b8c5390d114697fafb61025301f4e3eaa9f4535718a08a24adead112225a305009d463c3997b135e31dd3f08bd7c6f52b305b9756b4fa7ab6bca953b84e6aef863fca77369ab7f24046920b36e28514aff4174c8543fd5d40813329d12d4cc684b807c730e722beb07873ff970834a620349fdb64ffbb54d073751cd58cf293e15124b78f449ba11bfc9e5218117bb065381bcc5dafd9664edc94b32c31035e875249ccbb7acaa4671b3c8f20c4013c6648b4a8d61d029ca202bb773fe4282d5d03a0901c5156ce7d1a753b16ea6f510bac91f5390fdcfcb42e10ee746f090a4bab4e8a1a90e828454470e0644b6cf83cabdc3eed4e0f916ca7bba234994dfc39947e421e0127b8a7e0560571afa138e18eba085aa24460b3b7e51be8299d0c0f0456418e6abc888c354e33a5deb519e29e55dde8d223736fa4b6dff6e8a040b544fe0ed4944ea0da8c81f1689f51a32720d544ffa853d18ab75578c89effa2149c9f31564786067b2d17c722bc1ddf985f62c607ea7d82ea38eb6ec412613a125361337e4a0cc45560373d3bfbc0d41ea222ea6861488f796f9f47540e6f0e98b36b9bb36787e2526d09dc1b25e38a9f3040388ad55dff1da39a8ddf58d1298f02e6f15c649f66599bb62b2b022d0a0452e238d60e63dac01e03c7cdb92e90dd89f9bee30afd5a513466b3d159475b36503173b2d303284926037e85f92e4d6c90cd88af2149c5247e40fa76f3d8851c72547087ede5f2a004c23971e07a66225f89da28712ab0b9c26d8a839989919d0073b7be25b040ad006780f836bae6e93d5639b6c14922f84715eb5e110286a341b8d1bd410c1858611bdb82c295d2a8745c2fc1db4e23c9575ea37123ea6c157e4945ee09a384897105d3774db434474ac243b185e0bb1438733c2399ea4cdaff4e9bb8471a8b28764eef409fbf13ad08b1feee88a7f3c1337a3edb3aa92ddc0cf05c82c11c351db91db843805d78c4f550e6e0ac4dd2b8909c2f03cdd01702ed560fb6404f8b50829bb5e9b8366a735bc885f0b87761e2970099021b061234e9aa3cbb8c5b94a919ef6e9a0ef3f1a28040638476cfa72590cf0340ecf4275a49116bf96de95911c5436bbf4c3c1539ade10606acfdac6ac230f62507415d5d56b525d8aba1e06ecfbc35be38b8df212ad3f8dc23a9789a764cf9193696bd2355bef1c00d2a33aa7f8453019b1056403f3dc170a37a149bf44a94843f9b4d95915458195d2d5aab1dc34dee3cec837f3447e728f418875784534fceebf7179b519de14b61515b5bf1a0acefe5f26cc6501bf46edd2cd9b46e8fb35f0253231edcc414bee23f40a04344f66b5ccd1bfeddde70a9275e129cf925479f4c5677047bef79daa79e11645ad7b6ca6a23980d21bbe1409a553bf66e3e93f791a91d37764799087a17d48e7f807173d79de9dd65d8d19dfeba5caa150120cd98f31d9d15f3fbae21529306fa67b1d06be21855f05dc7271b347b9f3697758a2add7d20a01b273665f655b413b5fd48ee9b2d5c0c734c46b96ca2bf19271b970f0f47a75ee9a6060eab23801292de43276f2edcff42e7629f09d8f106da985a0f3083199883ff88e41b04523e25db29df0725bc12f120e396b4261d44d8763df1e837609611ba22afec0012e0977c63de0a19e48da87f326615922b1c483ca77fe16d63a0bc603e36c61fa8400f4957ec21133bb8918db5d7d32704d65273007fc02c0afeab784342526afca6b6cb6ed1f41aabdad1d1d5b097ea8eba20a2afba307d3df7088a999b37e8f65ab48910542a361c3d93d3fabb08e5b20fd7511ef8d766e4d4f81ea8091ea17fa3300ba63f6b6f7427fd1c8dbecf1f591fa209b4015df2e7dea5bdd754af9e7dcb52da965861ce9ce13733f48293a06930a750d99c6b262e5a37ee904391e6da18447d4a68b25a7cb36aa099cffd71cc8b0eb1f593a90ca293d63a3b9f6d817cd32b7c2836061cfce4beece26db599687800b170acbeab29d0a8283e30ea784d4332609a8c061a05be5a9e39236220273ea5dab3b0530bac58d84002beb1d233b27eb00730595e7d87673e05baac0fef2724b324660f3514748c0aef11699718663af4d7eba8f04e880c55aefb3d6daa79a5c42c989b30476ced0f6ef0bbd0e3a88cb571859bd65e09726a9cabba423f7d5296340c9e042f8822d6e5254f847cc09c793fc6d91a9752c0053695ce96967b51b0a28bc1bab31053e7bd76ccbbcbf693cba8760bc4dfaa1faee6801f7297bbca9adfddac59ba4baacb5facdb7db7929930145cd8da205bb7ee143355dd2a84e6dd54ca06e92e824c09318f23d32adbd532eb41e96641abaf4c267719e03720cc00681a7773f6fd64299de64dc40c1a705896ede56f2ae3305185141382a6d5a68b8294a9fdfa0418b40a7b00594398922a7b2875fec34a618399d2eacb5fec99070c02419222df9031e014e599b89a613103ba411af42a6b6dca7946c34aaccffb6d2aea3756d5f528867aa38c536b08f4966af0cba5c9759481d0d173505f70ef0dd44af67e2f6f216675e33afd52adfc9d012b19be71a88224a030e2574ba36b54ca09d6823625a5e7cc4dac9c9679cf7e48990d27682cbe1db10e1848ba91f8aad3d0e04a2f403b714988e9198093f7a304e3aec8f628d0d2cb111e0cf2621d77b6471abe65e76c6cb23df95d5823fc7200b0058965c441adb6e1fb893c3d63233c158ec71f43bf40d013e54f6653645503a91853fb2a97143927b7a9df4a51162de2444ba47cbc566bb3b4d6f149b9b3d476f10c027f5d711e8b5b5325b36fb8515842333db9eb144bc46edc432d82f43cbe989ec0ee182b2bb4ee6f549d45726f1d92683222d5e337ef1c48a228487f032913ef7e9c52aa294b78e4b5325caa51d93cd1cbe1012cf8dcc402576292bef1616ce983b49256dff7029c909a3bc9bd354655501bf755563271f1a902e818cd0bab73195c61971761927e2dfd6a387cd8bade08fb40c8199a28ffe230d2f561d2d67486bc46d597313372d382725e566c9f533ca663eb09bbf3134916d9bd735bf7d613fec978280eea60cb51daa21296fe9b3447e828ee3ed91525d984d9cc511580084772e892a0c1305e932a6e7a00dea0380458e68fcae3eebfa45caf345a395aadc2ca8d9d90bfcad170eb295452474990053a8cb50817845f9de8a8731e6a4c499458d01186ec176f0fa43a6933427e83731684289f7fc04cecb02c5047b03e26e8a417b52951fd7f99dd0b814cd5275a767535b038238ad0ba3ca4947a13188ae437cb5222f56548351e0364450b2d5e35dd07157b09cb312f157607619cc2beb09855b018e138130cf08ad9c5e976d4d9d9621e0f3b69b872c20c71a452240a754f1b97b41b5c2846da08a97479eb0789eeae959dc14eadaccbcd9aeb3e27b55be587cf9eadbbcf0a65e59cfcc2743e6ea65340cca1605804b9204add66b10989e1001f7d9e3c5080178a7a02ccfac0b088b9e745e58900a3126f4822d4ab4c28cbed51faf7c6f2d17b5d0b31a063d6761c4954b095b0efb061215d6390fec75f2cb82bbcbf43ff2516c7172e4599c8e8eb694eb4b7bd6b542b9e5148a090c2578bc8766cfe9abda3723165a4c382de307c829cf95597bdb7fa4dec780e4b85377085f9b1bdb375741601be392308607357fd072876282d005598f59ce216572863577e3403766ebf8aa1ea956c1295dc054057e923570258c5e6365b22d88252eda6cb9cd8cbf2ad5777b161a687c6900db554e3630c86e6d1a0755ed87b4cdc95daaa92449a476604eddb45d9513bbaf7c3c5bf3e2fffd3012c7b4c0be6feefe45be0be50cbb61119692fe80e573c804cd17424bca9b646ddf310cec401dfb2619238c7034687d71e5576f34d81110a934927bbe660f368ee5dfb8c0ab4394e94e5795666f302df9c18780d9cb701815492a72cc33dfe60bbd3062de5e752ea05bd6a127fba6f521b1afddf05e1550d1814bc1e5b281e57ccbbf75a5d8274af3d83d5a45884155721c3cd118fe756d565372d39b70a9c75aa7e97ba7b6de5c5c39d80b3f9373d17387baf4a42b14902c663c426dec9c0e1dc85aef64691ed531f7533e868bd2fb9e7aa6d32272879bbc000478dd84fd2c4ea3704b5c7d4d681da71b8ebaffc3366b7b8cd7245322d29dd767f15ae821a455dfb60a0041fe6797bfbd663d6de91462e0d98b2a5b8ac74a42d3467674ce08dbc3b8c5e075b67608a7a54f8e34a9080d61195994da33fc39d8e2e2b0b946bc38f5e4e98d86e9f618f56fb53e027793d372d8ed047d92e3e51ff3408a34204105fcc6ff67d42d7a113f6931cd45f94a4d7c749ff9b44c10f47e910a6363df39cb2ecb71f00bd564b9ec4e4fac8d929de404990cd4fcb405b07b588aecc6f808e1328edbc68c96685b627b596c37d8012fa1929e26d55f24d1ac965c86dbff30f07e7db74be4d4d77e587cf98cd33e1698ba1dce7fccc200a078f6e9b22159346189247f00930544bb24dfba7eee3930b7d477384051712bd566d6dd0f259a95ccd8ffad8515cc326a5dfff6b2f75df1f5875b4608f1e108c90cd280ee6737d78ae47bcd39fb8e23247a6a38e97d10dcda2926924a2c9629f3c1669fe054c57c344225489fa2cf8971f0ab1b52fe0653fe506587746004f1fe2b0f64857ca7f6516898ca36aa04f7db674ef8afe882e9aa8384a0284ab20340b039793e4d63c85ade22ac9f7fc2d0b924a27b50cb2b2097492066d63b21e053e771687b559d84b8f96f7a2aa28db693df51fde614737b2d07b565fecfd8ebb03743acdd13999e0460ebbd78a0da1c03fdea0ac062d06bd445b00802674bb7de262ca0d4060c86c5ab13e0f9f91c6381e6c71c7024e6753589bcd791900ec7464a98fee0bb4ac1651e647f3f29d94f864065cd85d90a19c95a185f2cd8768c810b15119391f8f07b517a02b8a1a5129981627871fddfebf82d6f0924bf278a06ee2d736d288b7670dab0f5e70ee46f243039b7b511cc4e4a8a2d5029a2a642407a5ebecdfd66d5de20a5d34aa03bb7cec35805dfb353c358d6efeeac216747e626053e366f3f911bb9c5257423ff8ee1b149ed4230faed7bba031f0cc9df0d3087dd8c472c6a3ac20c8b56c3f8c44715908bc89d39462f5baa237bfbfa91f4e7f6242370837b35699f9501eaad1e92d2c79a42312ab9fb510dad8fda3214a14517959e3322e7036af94e9128af62d491fcf1c4be93caf3f47b2db5380ecb9500528e571f7932475e90249f3e7e259eeb772eda95e30d8bce7900a685ff4b42824d9ad88604e153ad0ab3867ca7fb4437ecadfe47c6d635476de2be5472083c435f37ad173488baeeaf77d163ab48871fb40b9a548dc982e7e03077141586d4dc0de14f43a67d0f9c24fe2aa3f691b9fb63a4593cc65be73866766b55484bbeb4e014398bd942b42dd192dc8e186b7f6382149570ff11e4a17721058888db6c566c6cf6503b8e3b1c5be271a29f4a29e085e8e98196601dcb88ccc03e559a30490947f0514b9417001a798481e9924beae57dcfff3aead51f11d635e74d1cdcf54d41c1df8818da4193b48fac85e877eb376fa34a4af6bd04a8d9e103cdd7b4f3bec6e58b7f60f7895e1fed7302b11079e22b2de345382814c4443c24566f4accc453d5b5a020e12fe0384875de90c81f7c2caa5ac803c8d7eab1a1b9852810d904751d1e98cd49adc08a0b3577ebe1447c00b331320df1c6828edc43c8b6a9a0d5a72606a7ba739b5581b0327d470e614833d2d711ab4559324826439f7f77dcde767b0e7b9d016135bbc1ed4d26922e973283ece5603618608a2a4988070db5854f96a672d965b7d794dad665ff3ee4bf8930c33bc1468c93a152c600d1cdf340bf036f3bf432d7c1a9457e6655472c47a483fa7342e91e524a3a3998544aeeb7214bb92571eb697a65bc55bcbd5d8db610d8033a69a04612c14b24cd2307305f32ca24cdd6e1e5685689ecd79be451915ab77defaa1eac5bc2f0080db285408f5029229397c8d411f838b455657e304feeacbb018896b9a3bbd363d8874797ee05c343254902ae1dc7634c94ce7da26859124b1e89aae671186fb8bc15b0bee1b03306e14f11dbd2508406442b85207106a2cea531edcb4a552f8736e2632e110bf2de662e98f5d6000581b2110722d093b88623f5b1c0a61e9d4fc771e15de2657d3a027bea84af72723f8cf386222d6cde321969a97efac13382fc488dd6dc595cca649b98f0b50454a0235784b6ee1e8e3303e2374eeee97cc123eafb116553fbd00b2226d28d52274413b17559790533096213edc8c903e37b0cbdaba623e1e51b44841692aec854abeca5fa7274dd8735b2533f753f8 MD = f9dabb2616b848d02b9dc3c198aa4418b7eae1224c8ae06d17fcd4d767ee429f139a3b86aa4dc0ab76382d8b4c9135fc Len = 101608 Msg = d94d5c206e65ceda51c7c4e2b2758677a7be7a73706d8c20ff40d24cb89b70a0757eba2dcdb59948964e3098a850bf6de4aac753756a6fe8562f26ea14e18a94d69f882b9af9c5d4c1603da8ceda2b0a6bfb2838ad109621989d3f77e60a3a0404990f415e9b1a25dce4353bac7c91f74397e54a9ec7cb74ce71661ab37e4998085294989f0260e4eec15e78cb9cbadc746846b0d2f8d488ff93e3fb05a47ff7e9b46257e8965fb800e10188b2a46f5f07549293d1097a0733eafe4363e6a3caafa6c0a7bebfdf4a192b6592e9fa762b0345131a216485967260ff1a56ab7fb8620ff5b0abe5a7414187d4bff90897e670220f6e4c6fbddfc5dc2da7655cd96a0bd94a993670804680dd943769349c3956d3cfb6da94ea8a3347d213185f7a87b2eb078be8c83201df15ee21c1e84bcbbe3f9b1b513ad33fc5873485f71d2ab85d2d74ad4755851965182aa58a8b6e45af50bbc53bc841a582859b268bfeb0a51687d828dd8041371bcc90ed4b85cb4e32ed76db1fa8fc647229511e5b6bd6f5e4e17d2332af2d02071a681e8c3d2b8f4efe15868641cc259d5c9d94efca6251d023a9c7cc4b122333eaf963d61d55af0b6ce0edf7fb79900c04c6b0d0841d60e035a53c35bdb841a7258ce2af8c1357711d1f39fa3eca4cc60a159c8502cfcb1effb9a9f56ce7056ab169c3a2f22b2f89fa1a9117728802d357d27d96ab4039926a2c3692bf67168378d82f34b866de5aeb191ed7ff7b593cd2457e8ce63753435c480d9620ff1efd61214eef448c0decd96307c14e6bfa0862b5c4ee1d7ec139be535389f679c2dd538b475aff656348aa41755ec5208c3ff16c7a44b7db2a7c799633f1a89bac2d385f43fd51b8897548fb9034cd61b8ea66b0c6171c1736157359d358a02e84f5f7e66961a34f267b99d97fcdcff8260fa8cad0edb3fa8e0b96e45b4545f9f13b7865e20d5bf0e36387226bb131ab7db9a102c151e64bda66c97ef441ffc69c09a327d589e3646834f9207b665d4365ed389fc1c81cd4c12ef370c6d3365b2d6660736b5ea1735cf6d619d876b98888b555ebf7dcbe5bec6cfe03f88352814b5b9790cb13ffe468b20856a969af418b18e02c8c1432a90328d17cb2d9bb009eee30c71f306381336f761f17c5a538191fc2aba8f8e186ad6854261e5edaa0cf2913608c3e3710663508bc4a140533d8d0e1b0711133b992366f4861991529861428a33cc4e25aa80ca67469dd36fb7035268212e6910c5b990a29a612d5626ab658d7574acc27a2fd38909da9a0588a56796bb1006145b09a0d12135283142417894604585d3ffb0fa6580dffab11ce39c3b177e50c2d383f604bd0e085075c3fa4366c77fd695c4bd814e267bff0e3e8ea9d8b1ffb8c9c92ec1c06444503b93792f0b72e146f6db7b70c436944bb726bd8771536952a849b97cddd0729d0e30639bc0c060a17d55e2988598ea23b22c873873fb041ce96614aa57cb09b3583b483e19386472a3d4517cf4b5d41389c09a5142f1769427deceeed0cc702fc414a57a97636336f4c766a2a425f8a7a873655680df2744cdf4469eeb4d5c6ebc4cf9c5ada9e37b0abf808e1661ae3c88c556bc902cacab56572a5ed9d614ecbb54b3c3de947b9b301d3db3cde18b5eb5370ce803626d344b67d8835eef30463bbc61e9acbb82341f70fca82d3e169ac838e68d5d08ef6c37b6dfc0dd0134f7d7f492ab9a879db2235b5bcfd6cfb65d1c4b8200ff88a9ef85b4ae8bc6b4a97dfa8db48e1a7134b1e62cd9bf3d2f01322c0f5de78d8a330adff1d338be61f4552df85605cf00dd9fd265d4ead2c48da691c4d8a56956015a80eeec7c26a1bbf9ecc4e5a70acefef862b6fbd73a389216c83c80df25a4ab5b231c38ba91ec46e8b163e1e660342f482160ad08d5f3d52f49b6f4d944de7789210a667872ba5bae1665d95861c8c50ba92376f4287ebd4c90c49338496c2c712529e43a6b8430c6763b4a51720586af345fd82db441c0fb37f5ea7095e6008f89fb3074cee28cae6b64a3763362bacf8d764f1a0bd576b7a9cb7926ccd4ba50da1ee9cc2f5db5e27062734b0878f7d90f174a4d91b2450e50a5bdaf60a0a0419fd56e850f4e42eeffc5482473b0b45823b3683ce850b26be725269ec3e258fe45ef4d43d13cca40940d80b7079286d975cb177c7249555cb7ba525999024ac356ace48d37c19263c79bbb572696c5b97fded660b1f4945d5ce5bf8442990c5d5c9ef2d5854561e4f4f066a973461784ac5f33ae39fb05ea3127cc93430f1418d245c6915c608f30b6cc01125028f2c775dcad997cc5009fff0117fb2cecd8823231ee652f7b90d3875f19265fa7de0e86c7a2d6fcdb4acaf102104062bae025f6d3e8a5712f0d49e15a1d59f45b3fa639b0c1cb2cb61b17c19b43f786e1b170babc43f6b3d36b004f2d9c11b0ab9e4b1928790aaede17e2eb4d21850c09d2fed84b6ecd7a0120933b4a040207218049af8f3709d5cba7d8d888477d548bbb2cfa11e79e4650c47f404ff3af7a557c4e57559a4d43f7714603ed144502ffd0877a903cdd7b1acd20d8afd95e9cafe8b5cb3c01397bf9dad717dc267099ceb99ad456ed2fbaf7b1246eda23a3c0a95c0c55730a72e04b6af86ee5ec948b80ecd3b1d666f9784007069d5f611388ca5cde90cb147e0354a826838ad5055aaed0de8d8f38cf25bc3523cec02022779b51990784cdbf67bdf8edf04b7e5779b10bf7b1f1d12555a4d2189d7cdf64ff84e0c8143084cb8fdff3ab3fa8571f8b3004dbd99ede708a9254616415fd3fa32f70e8616ee806ee431f0abc11eda1e19441d76ef6af45371d327abd0c1836e4e3887659904606057fe1890028a0a32f664996dc89d217edae02e122cfaecf37599dfe77354d4d67fec182a64d2e77b71e9276ccd8c57d00bd3c212fe12f8d3cfa37ed44ce6c5178385594190fd5b43b35a3139a6417c922d344a72ee128e5483ddcdf4cec0196c8c51439d2d134dd0e43f1e9dfac4790d678c30fba30195c0bad0320f9fecba1dc2d73f05e41da46c2a215660711b3786e262db75c6e7f75d9b0216ec67728e724c9fb3435d214a5db086414ab4509d48c53eb3a8fecd9b744ffde254cf587fb25331081d3f2a26eb9cf947236b6b929a39a8205bf4ba694cfd49fc0f7ea87427fe16a75c333d206017ffd0b23e7200c366298a5850b6492fce6ccee51e6a541776d5f6c8e0642002482244c0d36fce0c73485965b9c92363eaf0be9e54a409cbe2f65f28efa60e1b58e90b15d569e4bd898ef54bd7fcdf31785d3601ca607a8b6b014945070cd2f16edc8d79ea692a1ecf82c7d1535665e1a0399dd728a58f9f397f1ce8d19c55ccb38432b4ba7688766eac35c1d5df9dbb8c0e5be8157c304e73f83fd7f4607df64f68638dee98e60f8d94a8e204a070076163d8fc3aeb45e142f21cdb196033b6691186ce2ed72c2f55c389fb89a0c40c4ac17bdb3ffdb6a0cdf71abbe8a360532905053d213c421feec03ed50be883136dafae4ccbb76bd33d8ea1410831ea16b8ce46a370ce10277f133138337e9364f2b5d91986234dc2b94019332212bb473ef4b3c7c3967e8e3045c8eba96cde47025b62081a4842b56a93ea5add4fb92ee2fdb273c09a759e2bdd6db814ba4a04c52ab2e22c2e33f377117d7ee2eece12cd73ad6d12e4db9d956387651d6ec1e262a9316e67de09c509423867d8fae13d27dd0b7e5f7c9ad4995f7ebb6b922a2a01614776705faa7348ad84dc6878d9f517c4346e5068988b5c5ab982a72d6c25ccd85dc0f2b900455bdacaa63a72a083c5af90058cb2bf0a09dca28278487118e998d91693f5f2826b51708df5ef1d2f5a26870bbc62f598c66ba08287ea204e8029253efb1a67749f9be05942f83840feb18147877e247ebb911b4c7b1b610eba11a700d3304961203f80d2c894d900d8d9e6829610330512d57ba6fde31c9fbedac926c3407f9215c5bac030cbe8b511251e84901f0a72f0bf2959b54b394ab50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a3992b84fb04cb4131582d3f0a9466105f7e2f5bcd8d3adbad05c2aa466466c042fd37b65fe310d06708263b62a6df930adee8a97fa082823cca1ca34a94278bb32b26823a9c049149f4abd22ba5d2ea7b2c16d3ddf14ddfec6f17f97394b52edf6b1f6df4f8508bc064e58acd5ae61b9bb0e4614d4a44f8a33bda36282ebab1ad054a01f5bf9cc7b29ffbeeb08ac43051b278dc39710ed74a778ee1d328db1a0440d0c5a6b98f4b09ee16833d0014308479facc082f5484ca6c5a83db4bc273ce65d9416dadd221ab995ed3da837d241e4e93b7224cbe05095f67a3a85f17c4f2bc8cfeb3650d5182e8fa65f0daa71306796a27ef90f364f19bdcc9a22c8113588d1283e1a7e7e1742213c1e8ce3b052442a9a3d7c39ca96967e27e3179a96ae82093585d3c08db6b91d0702827e10360f075b442ac60da580aa148bd1037d08abc360691ec19464e7b5af91aad4013a2cdf9e09814e801a8cd40b2aeb7d24e26ab2314e37ec22b0529d8e425270140d21f5ab241c3dc2540f8e8416c3722eaa433830abdbcaa9177e373bab05fcb8fd82fc3afa581e34f08d3c07f5f58d0aeec9d7e71866c7a808ef15301251b470a9c455a612c16a586e8a5f1f3efe184a2e6313bd0a657d901319a9f44eb241db807a9474f3f49cbd2c8b8a225859ce5cd7b36e3af8545701a482780086a42f4a1ffa2b30144e3fd3b9052fc9e874f9c3791f69d968bfee7d5bce01dd70a3c74ce6d79c600a5ade2ca28bc27e55fc351e811b7920e2049e53a730d9f3833dc46463a77a7d3c86c2386783e4a8273c0abe9e4c2e99eacef125056f62db44de812114ce17f0217eb6778691f8dfe2d0e5241f05fcbcf97b9171f4de3f0d2c0297f388d027516f8f157a6e1a919e0f474eff81fd56028496c9caf411b0f1af46736c2e421b296d5459b1ac92216b02fbb2a17586ecf312ad3480918e7b314526adfb738855d0a15b0dadc0ad3acf748abaaa482704172a3b5c434bc8f044940f9212073779ffa20fabcf28a04013ba60c18aa8724dd741ad9b738135b294027dea4047c3fa0ef5eebeb6633fd4007b1a61b2e4ed2ccbef808ca1e07924b8170df116b3b258771374a0c40ec058fe0d1415c3abfc235d8a60aa5ed7f7e919581c5105d98717d0613e1ca869c6516506ea482d5c23b414b8aa7efad62652403c45748e37b6aa9385a76ca422d66ffdef09836083f87189e0ea751669a902b539f5f6204cc59348e74d2b77b864e6f13bfe520da1eece15999d172210e47cf0e7ca305c973864590c9bd373a8f6590754353e75347b3c50592eefbe6a6d238bbc2edda38583905c7c1fff28630f58a8ee5a9347ba323eb2963c693bb4a788de2d903895c64ba9bbac55f9267514485e60bb1ae5b18867b4d7321e3aae282f70b29adb93a7d5030f23ba6bce5da9ba8031f31fefa8f229ff92ac792ba56389dbf1ab512dc8c45ecf58d9c1a09b3421b6f87f2cb60f1417db6f08049f38ee2a88514e23e497adff64d210954dac58107b2adbcbe9624293d0b2d13b05e73c83fe67ffbe2892d67778161b51260f6a09452f7577fa31222088149496e02eb328b69c3c9a9a58f24961ab468fba42fe6e9d9cf8ab58fa176069facea2ce8df67b396481438a487607c9f81e9b7ad599d2fcf9c1e0863bb6b5eedbfbe911638b0e0f576a33a8efc6150983201ef845a0b8dbac5dc2226474b39f3e88c4696dc553a0fb640556bd8713b8e2e784b2f1c782c24b489a8e02d5cbe3a901ef270b59ee86b6eb1314402d66508dd1672b8852e3394d0f0459955e71649203a3eaaaad2139108bf772062d8f58ea7a20d267f74cb9381d89f5aa73368a8fea9d24ea23be20aea32cf08e0c114a8f4e6c382f1911ca82f085e2a0b8adde094325563871f7e5d7ed2e00364d7e9df2ca83dd3c2ce4d5b42492b1269329d78499f70f240c70e122a675319d6649dbab7b12221dc7387342263ae19a974cff884b7ca02b57bbbb258b8cf521eae57c2fdc91b7526c8f1bc381e8e47b3989be8af410c9bce83adc46f8efdb724fe407d67b7d0d68814b47aea4273a46fe62ad13106ddc573260bd0d7b1854fd19b80755b45e84ceaa1f7f6a1960739c5a6a43b72cee6898cadfd5ef7e90e230bcf3e3242390cdf34b5e3b9c6e3ef0d9e1f31acda60ceee0160adf739fe4039bbe0a23a855ce3984e99a04abff1d628e09af7aed1863efdba87402204b7c59bca17d5178a76167e21955531f6886293755f21c8bf06debd9f6ae168c1dd42511ebcff51bb4f4c9993f02af7d1703b5543b6d5830ca955369951b650d6386261a117476e7fae2ef28df44823ba700a7634e73b6520374c708e83e762ac90cad5396fd6f83d5d6390f8e7d73d185277ff2f397df863786a7468499d26abad25b4d00ed4775f22947cba12fece53dc29f71bf6c0c43e3458490deb00253b5719074d3a68714cc669bcbdbde65dd3d7c966e2642f501732bdf767b137e6c5554ed5983cba706c11895ae730b772ff0afe556bcbef24573b42875ce26bf1af706e26995cf3fb27ca9d5d22b29895413f71ca9e752bc867178f00d6c8c3cf63701e0338e13b9be5bb4cce558cb14f003ccad063a909c5ad8e4b6abca96807471d08725d15b9d60eaa3fb468072b27a5cab06ca2aeb1a193671ecdf6ce8121c53ed47ef03e96370a601e1742692ea696b1cba843cd4ce7806cb2326b7f37a6449d2a2cd9a5f94341a59000cdfae1523cb9c48b2e4e021cdc63aca00504b21d2c00b08600920b841c403d75f0046db6ffaa431d4c79faca0e15b720aba4190ee43011934d4cf48101fbce8193cdfa57484bef6783955d78804a79b945a89401d6f5f35ba91ddbc2599ceb299e9eafbf7d657170bcec52af99ca9a73bc584d7f6916ffe7fa4be8d08dec3b77fabfb47508c07041e0c402f6c15cc356f6fc690f055ddc3e2a1f453203b367728d7832014f2495e0d56695d560ca9c6bdcdc133a129032681fe1177025b91622401151ecbc598857851a32d4dedaccb956407187f878ab6ec3d989135ac5f190fcd138bcb526f0aed628017ca455fc484d6fab7e20dded57fc4fc0a209a1a0c3a70210fca45576ebb2d72b541802d321a7b2eaa7f087a02bb48ae7a59c13cac32aea0031f0acc1180070d8e5a3abfa4b4e51568bd13d6df3d2d324a47ae417996ed131e501f47a3ca83b2fb5ae1618ce289416b12cc9fcb63e729f280bdc314c5a01ca9f3ff448609180594e9f0cd6b31fc253a167f1f47ce0af82b8b7c2bde4d5c1f4e81276d48ba5877e38df55dc011a2534e4ec7efd4da0d1f2dde660666ac958d747e240c5c5cb97c4f9d7b9d1c00003e2012137c1326622191e007cd1e51d0f9a44171cc416ebfa561bee005df9bba5848070e6e5321ae81f036ddfa95db92e666719d07987eef65a268bf129b3325343ea40511456a46c2c14955194db85fd623950248b1fbad4f9a01856ddf64d5547c6f841f4a5ecf666dae1993a6569c3b74125e2a3e738dc5a13fcf521caf4f2b79c027e2d27dacef8dcb78145064dca8c07fed068e55055a6069f969b380f73bbf5c5d068e4573b08a280cf5ac319580a1444b88323eb8904026903f64786207d57a9ff4de54986bfb5a54c23a6b5b658ef60609ba9efbe9d8ec203d8004141224d16d283319af8449c8cc048b6092ca020b890597d463d9832125dea69291ed55c7413b3d030d7c0df9ff371fbfd010730b61265a9d64e1e76c1dad38d24ffbc0e2b8884cbf56b5a0745ac457e7a7fb7a6c1ad6635893857e337423b711b2bffeaa3fa9f29cffe3b9be5b56c4666ecd80a4028042745456a00dc5dcc1ff7ebc7784530abf2a8d68a23e9d48f5bab9191e59d4ce889f4bb805519f22c9e9e873c4177f4512e673c7028b8d256c62fb60bbe3fe1ba627de3c06b54cb03f6fa4785cca20c39e6f4781531ba76688edca36e1d8eaf21bbc80553c9f6aefa30f272cba12f410a2237d2a0c6578a6ebb989fe18af27dc69bbd6960f86864b8526d523549845b6ce81892396ff7d40f564df38c8ed314510a4456107e11b5e667552dec4b0b2209427fff0ab5021ef466e2e898b0993d691145168be558682c74914c172f2b5e86375462381fe02ec4f33fc42d79acbeb6b6a8eff8b4a747318309f7df7e4bd68ecf7f03ee36f9cc28064ccf7270755fe203552a7f7465189e9ba5766cbfd553c713e82a5280b6c2c8a5f153901d5aea9200340e4aacf9a41ac54d10e57a309dd90a771f8c877dd74bdb1696af08c42570b42ee57ee4cdb34e08e90e7238c47c6dbd1529c5d3b7d25aada3e1f5ba1cda242729f546a5480de26c61b83d7ff9b82b32a89225eacd7c9c25807c8dbac8cf56610e88c875d2797df99d566bda3718ba7319a0d356259dba4a95af9d9032cdad6bc6e42cdfd3c0c7b8853027cee665c388519cf89f29fd5b24cac24ec5c09bd14c38519b68b3aa6ab0028e97e56e67ed7737cebb4b406328bc08fcc7e0dc036b0c4b193d9adbff0be9fab7e3a637e6e14ab27d45e4d198c81935a73169edcb23b4e98339fcb187556c57f43499a9aa4609acf2bdf24665e4433b09b3e85bbca04af9d6b7169e0aed40ff8db2472d7ac5ba0c764cfb06902443006a76e68d9e8bd9625be1710b4f7e6ddcca843729200667ba4f1a8979e12f206e14a1ebed398b660e5add945e1faefcd4f2d3f10762b0179dc54e230722aee26c4e5d7de25449fbe41ad307014225f4d14fc6fe2d096bd39f22115218194892e15fd226d4b96c9fcce5ec535a808c5dba2786e505dde1a2a7ac8a9c148fa637b790276d2b2e9d5bae014fffd3a18b4077c33a2ef5a5b78c9eade28c634d70d9d52985da507c843672b72693d26cc9a4ef6b0b62672b98996a6b40a76d184d80237213f6a96bc838014f9698c1aaef910c672108c2352ad2f42fcd779bbbe53589b2fa489fc212694111c9950723a40fb5fea3a86e8c153e2440b08353fce1ffef3361599b4b09d21b45e7120c9f9127d279b9cbd3f802e5e3e81253fea5e9e73d3b71af03cc567a7732179738e65ee04c208df8594099d0176d1b70057ca4f45b1351d4400ea0693e2182adf3bfb243093b44b7682e8106a918f261ce4abb2e31032b50bbd990a8565a50dba5f43556f21209906888638f8231c0aec3d6d59da85224a9dbf4ce3ea925a8aab64b9023efed020cc117e6748800ace04bea9b4aa64a6669072901331ecab2a18e8d6bb2e91357b2dba3b3bca5ccdf7ecd4cb53c14311917a93ed1909c90984895826d09c6cd310a1ef4716fc0df8110b3c5ca7bdb50643c28fce85c0dc17f2734f13f327063b89df3d1c996c17fb91e641d8210e1ef705fec2beb9f58a391c7d1a38935cd1d13f2c00363388ff5af31481c8702105665085d938561657ff6afd661f218c7426b92ee53e65d14898cd0c78a7e594fcc6ac0e3fb5cab1c9cd667a9f122e5451ce703e686fb0d37827884492e121e859aa70de62d188465445878b41bc2a42ef1b0cf0f674951e02a9ad436d1e9589c09457aceef62f528bda4695da97a5b6c0aed7dd0bd7930f7c71b48f63bab0f7b5f6c8c030ae2054d50e3c20e61f114e6afc796934f32b365a22268f134014b0ae443cded463fbcbc453d0c2e0dd0d6842866a1bfe61de11003d8bd9084931531e2f3c4f46a21225de4d9cd2573beaa2ebcf126bc4ae1c2e13165ce39f20874d89fa3f9814032401874e0905a5c6496ccb490aef143275ec076f02355480871e7647cf5fa8e171dd63f79da378f69a546586dc0c89997be9618a1454d4c3d134679a63fc91d7bc17d8bcd3523d677dc84f0ade4a813d8e94960a1bb87c74c62de26485f54b50435f7a1042886f733456fc47ba2f97b93e7c396180d6d80e06695b38bde051d5a802ac9453cc9bb47e7ed1cfd8324976fc1ea022ec466419f2854679643431f26aa004bb8f752ea5bcae73f5b0e8f30157ea8ec0967d9d031af048c9216758110bc606e86e48a4c16f74676becca30d2c26e49bd47e30f63f038b68a6e0050cbfbd317bd788d9a82175f0094e43c8f85dc28658b592d27b712dd343fb275a88dcb55dbad26da8c8234ccf4032fd67b75058756bd42a27276e34c267b876dcbd0eadcb73a01a5d72c585ca629382e613acf39b1c5ace97c2df20421b0652f373feab63ee6817626faf27c8b99858afd41a98dfb36f068a136bfa3aa60d45077154ba0d7253ed1d87883ab38b6a0928c2415129773a5b68e3bbc99151f4d68080b7dfb1498923f881f9c77221301dbba4ca2561b1e45499fa76953164e48ec668cf2437b931415927a9d4edc3131acf445c1d70a9947a85204566012704f341f14590870b74cfaa3f416c0cb93b8acb68a03f3ca77353951dd045e9e17d8f5ae2c12b8a87795652926894b74acff419d93d95aef3a9692fb8be39d1dc76ea7705eafe2674695eb9e8c756d6bff7e1205fdc27aed45d44bdbab84ba15e188a02206910441c6b6d470905b95160ddd848c125fb2594b86aa5ec658241b08af961fce56acdc5a80d64bccbc51075a661f9c9bf1bf979e16551136ee69a1af5bffe610712a7b847c578cac183fb467d049b3d538f14cc00bd27fa7a7f92e381623f177712bc3d711debfc8efafb1b884a96e6885d5cd43ff8916832561255556c8ee5dc72f29b4e9e2518db33f63befba538c078fbbdbc4a0f5243d7203b69a655294df38331c05cf8fe64f34d5efdbdd38f7782d1827b73cbdf745db4b4f77d3f2ec276e6606bf398f309307817f7439aeee813d5a01415550a9ef9ad4681540d8b55d1b73a2a3628ebc4eb4e133e1581e3bcdc96bb18a721602e5b684499c336bb728484138dad4f5532941dc524bc2eea402d8327fb91b77cacf374539333513ba31fcba108b172abdccb85c26d9fd88f2c97397b3f6d9dbc85426fe8202cd38851f3fc571dfb197c2de2048f5b49352edc9a182946b32aac51d8a976a328342e19b194aa5fe2ca22a08828708030cb65cab6adb6b3db04c89d26bf73aebdf9a964d9332f20f10b5bcf1e503a7efee1a0816d68a8097db2adc1ad10839546aa66cdcb463a13ae337414151a31aa0c3e8bab3ee781b9f3aaa869dc5b1b196abcf2bf185c6f9a92f9082a2cf4fa83d1287382ab98b847d55354e044edae8d82a7d9a330c4344817b2744ba65ef9aee645f4a223fac025ab434fdf7756b27437019824b53c3c8ed506652311e6c38dd40d8ba4389c4df5ee00d5b1d414db6ff0409abe0622ccf1335b473b0ffacca2f2e5a4f369eb961b0602a301fba66dd336eb7dd9b3f689f1bb2796edf1298980fb64dd0a38775d179bcf144a4e89fe4083789e024f45d802e4f1e0c655e18eaa3611906314ade77e07dcc5f55d4e112a5e6e97b2289f5bc74950915ebeb150713b626b989f1de9a0e2a2248da8512b132033e783d04169a140ba35118c27538883eddb053835c832a4b5ac8da031b07d917f09d1e6faa61363a548795ea22c52a7fa4b536093f7b5d68dea7fe57e55dc0a967b36dd1985a04a88581096b02f62003e48eda8a71c8cf0a15aded8857fa0f410a81d133c8cda3df9c051d4eff1293520604e80ed9b2a7b867a14f9e5828ef6743d1f39c22013e6703dc799a0063aaf270df089e5f830efb3c4dcea2d22d88a47a697b148e40fbc620cec457ec2f8e6d8ce7e140eb812b5afc77109bac52017f151210a4f4d002865da2a68dadbf664bc1e41cfe65f6275d0fe8bd91cedf82817d945a523cfa7c2e2122c9452a5b5b12769d60e0b528298cde687e8c201c35301ab703284e069147d314d2874b4b954c15db56edc4605a70cfbffb95895040175443b02e123c6858dd416c59f8d63b800566a62d78e5e1904bb4dbb3f4c5cbbb94ff0b6b71e42ae9a6713dc519457537ae06f7a8ba01e774bb10c6ef46c1ffa640b4bce75145fe83966bedd296e06df87883f16773fa94a5859b6650688d035fc22a6baa9ca80dad15f9258857ef484bcba43d7189190faa131d60de4271006e8029bfbd38557fef8be18df045ba31b80f3283cee6a6810bcb5e5fa1bcb41e5ce47960270f947bd160eccc1146894ec8acf66a8770e91151172509a2bfa084af54e1f7f007ad29dcfce28bf443a3c7020ab59ba31129e8035e3c06e8317b5bf23a2b2c210ae7b297c88b719f2551c5ef913abe2ab0b02da90769ff7bfc8ecaaafd1da6c0ff8c3e8a2aaf271cd2db7015aa4c7a2534c409cc7c759c640621fa6105800ed8cde2f43e8b1554733489effebbb2779b87aea4f3242884aa397c139eba1b0b6e5e32fd3a5486a1aa32a26b322e355e9490b625a6674960557be63cea84b8468c99c38106ebcab5cbb3700b37699dd7183723b56dada2d76eb6a99dcccb1d663966dfa72bbaa93adda139f897d6b28930643f7bd15ef992fbd10b5fccf713147eadcc973027ebd5e9e34659dadb3b1de3ff50a059e2173807b455aa727062f86256d37a9d9c5730f661df5786e2023a3af09f4b8ea2c4729747cea5479ed2b9ed4a3c78fb80b6f30c034c1a2552cd893b1f74a5f604c7e8b572c079d2ea2b00276f4fb8d13bd0c633b1d4c93e9365b2f07517d61b71ea41681d714d9bba347419ae5463a7356d4f7453c08c5a0d925c61d8cf058552f326b9302a4a2b77b6becaf092a006d55539d6d1588d00281b2f9531e55aba0dab3eae933398098a7a85421b529874854f2a6213e4f1b84ccad59469a1fe440cda32522ed45ebd5945728a18dc727bad25ca1f01ace30be165f366664b19abb548a9aae955c5d04ee22da9d07857a3b39dc31584f8897f4fb53414122bd27572bc4cc0adfdf4c9d0175da72a6e6f730080ba4c820f0b9efe823da45489522caa00c39b6016133046aeaa8d0d05e173fc955acde43a92f05694b92113acc157c4dab543ece64c8e1a6dbe626386d62b0fa6489f93c146fcc0b24e9039dd467f2a13cac137b6c56ab31d3e2e13397524a2792fca76ec4e4aa2a6a4fbad64092b4373ab1c2bcda64c7986d5f90566e7e51bd8b5577402d26265366469578933e377c1005caf7518bcd46f29cc215553f6e489824d774dfccd722b36e31f94ec302ec7708aaaf443432ca1e2ae4f4ee2e063543fb46613f212304cc170edcc5b98d04ba4ac06934e68e9e5a9a87798bc2a02039494289ddcb90663ae18a97aa9a5c51644cdaa9a61b4730126c1817c085c285c28f6a733e34a5e36a4e33be6fddf76f0f7f27e51a6ae33bd00015542efff3c29a4e1ca1d2f4e9f8f4cda8b5880cd49a065256aff42de8fe3df70db32989aa830af5e79a2e74d30344e0482185af7a7f0376d56ee60ccf0396d17fc932bb5d33af2749c0b33cd7bed516a066db2e5f9a615d32a642601bf894ffd9eafd2d8250e152b1ca03c58e784fd1200a1b020a58ba65dceaabc046299302aaaccb38c0676bf8bdfa92a75dcbffc0659fa7e2f156793152a084b5d4331b6a70933f658de38989dce6e25adc268f34ef7c1419aaf02830327c5fb95c81b897ba12cc4c5151d4968d137548602458df0c43d24eadd231f2eab2bf3335b1e52ae5cfe455a13ed7af4d14bdf8a021f70f6a7b84ca606940f9e9f805cbf6301b94921f3a09f4170d24ab4f3ef412bbd44678778e456911bfa5bec0d5dc1488d6553d751fe1c056dfa716477ac32e5e9b24c4ec61282e881896e781a1fc2718affd46861865ac8ae9a71c71f3de5996961ace3eafeb3728d63de2defca4a48c02ed5bb6b61e0f3f95953c732cae2ad06fb8f2e2cd270970930b3f2d385df34f69b5cb8b7b636ec17df1e4bfa7db28b8825fe17d4b342bfbb9af5ae10780b9df6ee74478caee51dd0d5da3abd7cdc99b789ff8629cbb0526d47ad4beccc55eb86ce2250347174ecebe3907ec4efe8415bcf9d63744242b8e5dfe3b0b0a945876fe370bbf5266bc332b047fe57ff5eea3b9fdd96fd40805aec0b9dc5a33664d778d6657018f553096be507a2bed3c7fb209fc9070cecf39e4973e5720f9c39446b4f0958e407b2265f29d8524095abded27a689fe96e22edc6bec29f3a024d370ff56559a3841382d625c3f6266a90fa19d6c244dcef95b029943d346d9126162b71805c9b94fb859881cf76b97c00b7bd5ce0df2c97d54d3b9f5c19f0714e4a886a634a165df4976ce405ba3ef3827d85b3c959228d692ec48429370bc94d3cee8914095a0a85201bf66bab00f79fb43a83859806fad9b98ceeac7406c1a95324769d83afc137886e600c2f46aeddc4a4761d862005ae585a83ecb92883ecf6f4d8059e5faa90372acaed2f5743c7168b32980ab7d76f72f7ebf1efbb349d8f24585544b1ef1a951adb18947cdce210b75ffe0b1497a46e2ccfc3fc05ff45857d9d945cecb55d0b053c9444fda2b81bf0a65873806ed6b6bfd76bca4f0a6b40c750cace5927e0ffb295692922bcd0a0fdafad2941848cb178aaf03fe07d9728ca180082406a2bdaea8da02a3352b205a72105159f004ec721f15a45028152a54d9e3d5fe9a9c60575cc3f2e778ee7b4b6a4681fe40aa4608053b1c3fb3e221f1a89894f9b0a3ae61bfb511f3796f613f2e2df2f56cc17e45f79fea014db92fef782ec3a9fb50de7a4c2dbe4bb92678c2280712d3f6b2ebb840a49c6958027aaad316f063ed3ca6fd7c8e7654babc38510292701e512724eb7af981cc6576b8b043d199cbd8cf6e57db67c8a2f0890688283079391e76903c210f58aee85e509c34ff3e467071bb35e33a33baed3599c41361ccb8a129d436cd467f857351d8db40e03c6836dc04042e863601131a38915eb6b921abc96777ca4f74e478d9c7d9d23532b58e56ef4f17cc4e1a14cf897c54afece870dda05bb27ab7407b5e9434735ebf92f98ac373298cea6a34cdf2e1bfadc691a2cf357f1068d53dfd68c457aedd11a50ae0271cfe48a976259e1b6dda40d491b4269d3e5e8a5d116180eedfdf30f74034ef80a8e07ff9d25998597d4ef9a58d276c2e36176f9d7f6a2f6a29aeeadf190a0176a38aa359e33375339c8848a7c86f188ee2b58944ec59dcccb1786b1783ecde6fa95743583d559d305810ae59f81da425c0c357b1ccc3019d23d6425f057fdee206c0e063553288e61c62ab3a8095a7994ccb5b82b5384631ed43010432157b545861fb09bf5cb0bb6608cfd7f6799b40033815161a2c03517a4917b58e504c5d2ac503c9c036ad26d18d7cb0ce3be7b07094151a8000d142574306d17ea2ca62da449b122c42f6cecb4b32337c4f25611159cbde7b7938ab00eb5ee687af5dec036b117148140609dfcca0fe8545cce86203b9f060d791e2038c70633db8af7f22c31775982c536e7bac19607d9256acff2c6feec4be859ddbb0ebe605611792a4d70d8db0fe77731b443c07c9c74b35253e4e383b807c14f5f341dd733b3ead26017428170cdaae5b3f6962fe57230780b3d55b29effe0dfebde2c81ba97d4512ecdbd33eca1576a7f821f08fc4669a9e17a5c6143f73ef329b6f24433e6be0f7f3b52d9cc880628e09064f0281ae64e9f430078f01861f5df647709e5c731741a08085c59ac40879ec86bcdb21330cd0b3f4ae0ed8ad34bd690c3b91963b4e8c9dde8a2d8358cef80d13e89e25bce90ee17417f82741c5fd6e1df3a17e1cfd35262f894944b73c85054e50a001a48fd0f73ee3ef7fec297a7ffd276276a0a9d7e3e421ad4147c7ad4f8663a5477277e38f9570593524f5d1093a4539126eeae151ace1ddfbb2f6dd566cbff269bf17a2f5486bda0954b18da455dbb9c3c026edf9da283fe6614091a451c43bdae3159bd2a834c64f23c2fcdbc069591d5ce46a470c836793eb4b76d3e5fed62d76c82aa24549c288fac0cb1a1a7c9b818db9c2b3a481c986a96dd94f99ee55d3e2c5fbee90394339422164e9b463e592eb0d93da4281fa31242e5581de013f60cf857c122981bcf2a27b56c53eddebc3ed666a2567226e160413581522e5f756959d27a76191b42794251d270a3902971d3a922f72e189b7a1a37d7428fb1217cd638b28e907bd5a8fb52499b713ce7ef310c842f62df1988555122930bf1436ef7f231110423d0dfda21997c5dca3fdf77f692a81862a3b37bed29edaa0723664466bfa87efa7b4868248aba722379692ecf1207578981221372b5f975db098d46fd24fb05ea1d082cc4e3feb52dddb7ddfecdf7283cfaffa5488e5e73553d0b841f27b1a1db004aae696eef30d1b2ee0ced8b1e9163576fb9d77cc5ac5e0607863592725ab36a34777cf136eaf84239440314249de6e19cd88647d629dcaea9d5a52be8395ba4ee0e63357aeb88d3be0ba82fb251adddae89bfb638f1b97b1bf8d9bbb945bbf6a1fb8802643c6baea5ec44a670b7a196cd55ea92940cdbb6827737098d87bba775c751209ce4871b176c3f3f05d6a8531fc36da391832ca609db29df0d05440191f92856c9ebc6613c1502c31ab6ab5bcf5bb1b1d85d9295d5ab1603e0c93c4a1e19746d935a0eca3b6ef3f9566093f703a51e8410a2f7c9116f663eafdb8dcb43b09d2ea438499c3cff7bab62db466fe42a1de3e25b428be3b0805822411dcc29450b5ea18d5e206951039fe52fae0b99711498f68f5b2373f4ce19e005d695f76025c83561359ee8ebf19e8865b2134a026c69f3462ad9eac6b749922f9e6dd689553306bdb65ee155ae70f38439ce21668e1f828896f570aba3afdfc55f9eee490366bca8c9a77d18a3ddcd942d854324e0824a5e89be2c2dfa1470d1006e6627952a002b56c3e3bb37adbe9e7580dbc4cc59f4cfeb7d47d32540ec5a692667ac74477a4d45f83dc6d1a770a8f9070fcfb96e27e4a27be9258afbfc69820d185e0885d1167e8fb0c2db9588bda16207cc0f878ca497fd38ac920d4805336da2c8b9acad8ee9cf6636bc3db1e255d8ec43356dca17b24e5fefa53d7736648c2c6ff083b8be6f0287aadc679121fdb2e6bc95e88a45dcb584772c543204fdb4dfdd13d397adf66e3aa6a3ddd08181391cc096bf7437fb79d0ca8d1b2078e62be3998c64f563675da8b37966170bc9b2b7d6a0bc2ff4f8e36a723257ea9907395f2bc1fe78e9ab15f958c6c90ec5bd68de871ba56484bc3b7af781d3377048287b1c1c69c846a8df541ef2cf5cb946a2ba5a6f43baf02ec92adfe456b003923e61f2036c8e824802e18c6540a9ef4aa773d7055eda3f35d4a0b4c2a7fd5ccbc53638e0d172a672c8ca2a87e49f6db2c0308643be6b79bba604fd838fc583dd0325731a5e1bb90e773480c182e43d673519f0922a16a7a7857f438ed6b07eae41532d19dc32c30358491779e42067504e589c5b6b83cfe1ba390d4d44685728c6ebed45125ecd3bb3317618d0fcf154531212044959fc508c59e327a0921632dc133c06ca48dd9dd01425070f1fe55d8b72dbf78c4133de45074d84b4d9c1b3c9f3a1c4ca98fe11f619adad69334a523f9d7e9afce27e722c6dd4cc46e26295d6b5a4e7dbf5357f6e689571a5dd291ab7be835761e5e4f488b0ff681f5800bf4b7ecdd7c5078ccf812a65bd8dc7899f3bfb739582f16e4da2fb57be07e1a4197079a5fc50770ae97487a6f8e79972c8137cd5bb28af2263c2746337c625558b8ccbb3bf44edb7b692a6df897cfaed7d866a31331bc60a1f2f43ab3b23ce1bfde99f7f8668109c1c22b098da149300a6dded106423df2e693391b7 MD = 8748824393f51c3259221007ffa84d3304f2fef336716733a249106f78b164217fd0dd5202fd2ce0400d456ec121a3b4 Len = 102400 Msg = 239daa03ac02c03bd74ace9a592656eedb68703f510cbbfa8775994ffcfa9cd7f4a13b7ac92aca908250a946a64bbb435399198c8afe08a5cdca29faec5af07d1ce1578f4969d424ad148822a2a8b90bb44a82dcfb8ac935a8a072b9ddf5d2b8c2e6670cd5c4c640811fd4f8f344398c290412f74bb7e6f03f81dc5678d42bd10e36d1b71445882c26f8f68e41272410d74e31a4238e481fbbf4cf9764fee110295bff58aff30230c32754ac355a60dde9b047ad2b15d5094382b346497bdebd3bdd57b94dd61d948035581c76e4d73b85b2bcd80a5676f800b1f029d15408206b4243a197f7bf9f86a969a5adcd6f74d4ddf9ee69591432190cee09a2904981e2142ad7345dd19afd0bee0e821e12cffdb864b6ef249500b71816ad64378827c8da7424cd103ccd0de451209cdea79328cc66fa45c1e3aa025fcedfc052ad5b441d88500a19e680dcbaf9a3a41516097f9f68801238e47821687f655de89f657e64d023927fb9fb95184e5f41cb477927bbd011ff8f82b23dbb9208e501488d9f37b3650e4a9c855e83b81b1c09212a4ba80775b4d0a39f7de16d90fda58f1bcf1e99dd258376685f859fa1ddd68e6611ec7674d80331880a617ac54fdd5c5635a2ea54803131eac2a56bb72b3b7673a11184d6132e13b50bc3206f83b09787fa4a0f92c75cb454ac6c8426ae3fbf9a249f98620f5b316ea990c655412729f6459f6e5fa10ce7ee476053b50fea5223c21c1ce1719173fb0c4fd6403049f8eb3f287083b64ab2ffbb0b3e2ef6441756a212771ce4d9c1a35b88b7f8f81eedae106d7dc5af1dfdd130f5ae570a56f67bed0811d80e3a03b0bfc3d14542aef086dff6feee348eb0aacda40cfaf427d8d9ca8752e097bc21685f898cefb602eabdd44c59c6eca4b3d3baa2bedd5cbfa3b96216a2fb28670314646150bdfb21c19919f6f8158067ee9420772ec9e8274163dd3d69f0694492fbf5d48578ba135f63d37c41a397df4a3427a9c2854366981f62840f88015ab4673b6993e89ae1aa622d679e38da15adfdf6c2e4db138492351974fc8b99b1529e5da8e2d544928ce04d3d769bf1100135b64afb91018a16ec2b9498c1d85255e98419da075f2eec235b89319583d82c258ec76f70b47f0b8ec06c4cf16744a390d845e44594beb17480d036ee38761815a7c3a740d56b5b61ff857ee5ed8f26db80b366598b48c51be39cef6ebaf1ab4c28c50dc90b57edae11669863133cc412a5ebca09ebd70f60ae74c3dcae51cf143a5608d2ff4aa9bc1e9700348152677c6e76761e5c70778b06e11a02bf9f6bb305fd0025584c77d54da12020ded9f66204dbd460881de5e3156a5da693e26672b0425d88bf653f3fc60b5eeed2da590c8ea24a9614e541b10397f291d222aa9964ad88c4dc9ee943b25d2468075b78c23554428aabd1733df8f0428b25671e7048c7e7a156fe5d293920d95422673bcc21782302f3e764cf1bfeb55c34baaa3f8517e3e6d68d843982dbe47bce038a71799655c79431faaf9448b4cba622364d4225e55d035444bbb616afa5b1394dfb663640a137b71e258c56a5a123a8aae3a87a53cc865a86f6fc5aa19973106cb00fe14c578480b9782bb1f1a65553ee49df9d96fc06a833337d2d2221bd91cfd99d1ee1b32294b1f198e001a2e12bebc70e1617b52c4431ba601a9a0337c25ebd3776677bbafbf0d8fc6b3c5d723887a55d6e3dbea0386ad3cea6710888ad02a606704678f3bd5c757edb099eae83ab2af52c6fe1098cc4c6ef5b10f8585aa1da3194e67276e3df0f47b7d22f3d13409ffed817e40f4629daeac0dd9b51cf24a2e16aaf31ea7560ef7e87fed6c8f02c4c9ffb9c905b708058e85d41b9191674463e7b0a7cf879c65e4cd4f55cf7235979011c66ad9511b18810bba5195837770e6f4e5d1c48f9fba2d9241e8971b3ad6e4cc3dd036532a3b28b616f84b73817429d6b11da81fce6034c02e324dfa81272a778695971da401e80d709c2dd233b29ef5b8f7c4b8b6fcbcdf3abf7e80b6fcf3ac4727964116f1418a6d99b74ffcb0c8ea53eca50ad7e408681dfc835e3abcb2e2e6029e4df18db7b5549d721d5ae33a1d1858e356afbac9c33e5606d38b0afab3f9b32994d23bcd06cbf3d8eaccee65168ce8ea5cace553a912687391265c3d87d8b5c2d6279ff3f74a596638c126dc6f1809346d6e08486240a04417ab24ede72986e452700ecf2f462aa477e620f27f40265c0951780a873faa12c777f9ae5a62b328ca2a1ca0e745e41e388a6169cf9beccbc105c93c9075c24a312b4ed14a0aa6ea7dd45e3be7c0123dfb5c6c84f891b90e24d9803116699564d523a9093e87feb41e0d27d2895b317e20aab6e652b8178d956b119a71a1affd33ff7cb8b06107100b132e17446dce794913b4f0968584e4a33911db4ab46e7dce1d4e52482c7c88c5a4b57cb18e4599f515fb561c709d8dcea1e575f9f84d51141b92885e50bb78ee3072655923336a85200e695d0fadf3885420ed1803e9319668fdad7b74307ae524c98393c31455a9d042bce0b942a050be38c31d5dbe79e583c44417ed98093b104f3a09e47505a3955cc34013f83ec85eb17a827c39a4520aaaeecc434eae6071680b141db1d532ed911ee3964b095fa41f85efd5d74b8c5bf5fff10bc0d4e5d6a8795ac5776eb857a42253b697aa772cd777adf133c9f4f65a1a3ebd9b174bae85073672121ca451ea60090b8a9cbf677db25554cbca1c783ba00dcf39dff26782274fba3e69976af86a8bfb705a88c276e86e871ba673401f33d6b729a98aa0247c0ef438f0020142a4450d055e73fc576c61fe8ff999ec6948320be70e74c6e057ecb6be2a64c35dafdcc6a632f14393c0c831a53de0dbce5f9843fe79316a4a5d61882a93402fadefbbaecf529156b08819b6f7dde8aca2ec81e5ec645108c6ef15cf0aa51484b7d65a2c0d47c4944224cef5047421cd8b6177681d7a4410faaf7221caea6281001630c4dc8d1b8aad197072377b2cccfc60f1512e059b1139f10ef707cdba931b01f81fb99d06b865e876c51d6d5a195a6d88277aa0b688197624d53de97d396d3be88320e2069c11146a5432c54a3139e99451afd636f42d818c32d9a82af28b16baa5af06aba4132fc3a6041d6da31f67ae761a109cd3caa58da67794544cd944c6edb075567f009d0b30fdc044fd8f5a4efb65da48a59574a186743889b6ec2895c1e1b8a77b5deeb99bac78609eee43fe580fadcaf8026180896c0f2baf4844bfc89f4b0f277f87574c8c803105c0b725226415b42995ee72f5cb72cab4522bad7855970e120a095caa1a8246d0bb266bd12f7c64e8b48e21722f2de764be4fd747b14724b971e7325ad2e9027e22143aeabe7c8d8402c2e474e37af21ec123d5bd1eb5d38c4ba380c5324ef46c89f30ad59d807ea9f52f6474a4f47b612f3a115f1a7dab08fbc0c08fe50ebd3a776554384912b8b900160a07c024f3ca4d05229411090bce06b16a0137c2ad466ecdbf794dbddc4fb8294d94e176fbc8af1771f2bed28639f107f5cfb6e5454ed4aea52f17ec59cc81ebb7a27584e3dac9e3980150849aeb4f36ec41eef125824d8a9db04428a1be01afd0b6e8b95c7f21fc0d369279ca3075c0c61e4c60ceaf3dd411a33efd44929c181158d79eb6244bb33a08e13c84d819381bab6bde91142a3da97e74c4d2f8c5a7020ebeaf9178abcba70ec9476b108dff457fa9a51d6f9709adb89229bd4f12cf1b2f0a667edac687fc9eb714ed9858a8dc11a26ee3f008dac6d7f39664041802d550474dced9208a736f374f7cce1da767f7c2965573f4236d53359577c629e4c908f1d001e24e35d3c6c631a920218d4198a6b61239ed6619c0b4a158f3ece75ebf96a7c884b43c765be075e34d28bd218aab388ad0693544971d34981bc58d0efaa20f833ed6e0d3851286cb9387d950346ca82fc5dbf3864ccbe9b5bc38386230b0a1b28f3ad583d8e8eeb291b344862c579f8188da3347584d1b2243d99bf1082ef8e6e4648d0fddb00848c65f911be8f86920a7c87710501d537e411e0a23c7896f90dcc879cffa147dfebfd14189d0cb9f7d914b2169baa91d1a327a1583156c8020e6fb2e5cb492ba34dcbcd868aa4dcd08d3b6e4cc0e9cf296a67230877824d54781610d2ea397479bbb76c830abfb5c42fdb013bfb2555e740b9b0db9466ed9553a9ea8ce3dbea083ca93836a7c50e7cc5dbb40ad4c7ecb22e058ef91268706ea70f883a3e9655f9d8897ac8e81ead9f5a23cfe2d3355c323b33068979f29d867d32320584d17cf3973f7b6155325ad6f39b9aea81d86d106f2b60b44f6b3d86dcf930153cf6289f82b380277769dfc99a2b5d4b6518e7f4d2d5e4a11e3b1815cd4cc991ee6c21a4a0ced445d52c031f56bb5f2c085e91856d19da796dc9f6dc571347a1239b2facfa76bee1f8e18d813033e9b6f010346c47e08963c57f9f828236f06f61eb1a5c9694852466f246962e7b4310a798985168103a88adc4dab0569e0d2033c4a95e7e117235a9c5f6075b7bb564b55c85dad993350fad00710edc31e5df1e8ea65abad3cd3c49c4657bbc1c87d7a0c6c3b2a14fc2214d9c2a431bd8c2d2acb1d7f750c4de63cc555a9b5b440093f23c197fc82e29e616fecef81b7cea21649504de4acbecd0bce29e0f3fdc69c0322851ea5717b1858f8f25d4e503a6f5cea2f7b7afcf41aba0d2fa7e70cd0a85e9f1319a55f1a32741b7f68080573e767341772988ba231d018d3390f7fd2b0b9eff8238caa647f3b2df0ba3f45efacbdad84bdcdc73db4e667b14eedb56147ad9ba0b6bbf1de5126c6d2ae64a02221d8cd13c79b3e2b0655704644024bf0df9238a96dc3a3ec5abf7cb1cf18929fd930f9212a816efec8a5c90ea2dda1f5db002d7e93246f12fe7d95fa86bb9bdd456ed8595100b82d5e7fe876f5e06604dc80009ce16e81e6aee9c9398fde3a5ef8dad108c5a9d83b5a1c451bb7bb0692569a5880a302aadbfe7c7ceb34e0ec99661d89dc12dd1dad2e33756962bde222dba78bc6827138676fae377c007421111faf593fa32b16f75d3ddfec8169a73ace4010eafa4ab92d75177f888cf8765a77f8c5a0011442ae59941b218e5eb44ec0ec8e4a64efbb729110bb8d34fe6ada218265a9b7192f46c5ee8d85040da7d336156a717ce0adeb665281f682e66d148ef4afa92faa4b3504a5cda36ce6d06ca0532c0c8cbe1f0c4735595111510b9e22980a5af558151da84241e9338aec7f921e49581ee86d39c631a8294acea4eb7f150c0b82a31b45235c80e2e25a5a907def5900cdf0371865eff4eba9aff76116d43b47620bdc60084d010d13e59923e63ec18304560b0c98c8d614b88541a36c5e0e9b1e02c6d2b9ac58e422bd26be4d95194b4c8a37aaf144b240f1df3236f22afc7311286931d9e2fef4a93181d4267ad6e6111d6b67e1ec1fdce02e37704ac39b7bd5dd41f1cb9949bb11f348fa036860dffc8004c7fd478554fde2c003d8a051f1f691df971137efa3f762da8466d67d956952a23fa5cf7955b5ad7a462e59c681ddf690964d37474bc400b527b35d53a2d1e5b2537dec623ba1eea4dbae484fb8067c0373c22ff71ef27d67488b65a984d0e9b397d836e6934d170e28eb0473e0fa82b6b4327a659a1d197f5b5177d5b7f0bf247167276cd901b6e4b26706c9b944bb18dbf0bf1949ae656bf4a81c7eb89bd693848d466b998a6ee70ca4d7c79d5f75b85f9f5688aa20f19b98f1bbeb133ce07f25cd1c7941217f739c26ffe409c55303b390e94a381f4eacbcc0eec1347e3d55e9a9020c6c719928e55fd7a57af0d3897c77dfc48fe3cd0dd4881d97a8ba7d964493af9b77f52c657cd1f7928d6c67b82ea6b28dfe38fd4d74c9d0b4fc9bf1dedb2f6dacf026a9b7c70ff821adb2802e2eb00a1d2f697fca120890cf8c7d6a9df1eed4c76170a19e587c21d9585ddd4a11263ee8700f952240c6e64df4e928324d347d61488da497a5993d2019b8af9a5a7bd9768c860de465874996a259bb5a21a2b01111b81322430982ac7e6da7ad8f23525db1872a7f04bc23503169a47433ac154d599a8dcc952f9ac4d2e725e203bf41f4ab6d7b50b2e81c011e7373fed7d3257c8c9f6505208dfe1fc3afdad67c9220d1c6b38107d49d8c0fc6119a78a29a69252751495a89a724f3cd4216f94e5e677b9ff3dc130e4f0bf2b4ce9860187448edc63a9b3b150d98076c286ad8fd768e6893a8dcf0a47f14408704ee53adf35d2cc5c5eb357723dfc10cdd56f40e7d1e2f4e4d142f5ba02d8fa94f1cb1d79a1e68c28db9c8147c54974bdb6bb8f5d49f162c4b022d8844b0269827940929caf53828fc77617189af1085ad09b6480f79d3ba3d3789aeef54abd008f4d819187a01859ca4a002de37c366ccc16a799046de749e14b254028385fd7dbf8d2a15255b54d8d1f26cec97065ba513440f097e9ce7e83a460c20b55b5cf044b6d1138fbc035b8fd70437457fc0d08fe17cdd99a580a618a33bbc72828afb34e3a2c6019a3d7f3ecc6d30bb8652d997b1478f207eeb422058675833921418f082239f337c5fbe4f510c8b61c07e2abb4203809b9f6456f1d41366811064b41810b7f18dd8e6b361f36689f0a4af4e6af21574636da86efdb4d479e37409670c1df47f89466ee8f7321fceb0a962af476011bd208003c4b4690f04c3338eac5d184d9bae3b54b98f7b7cbc5a4534d7a11a6cdd5b6d2322a67f3789b8e550ee8b8e47d8853e34bf8b5e11f5361e9252386fab476c9b62f35445e29b2cffecc807ee57b876b58b657b5883ebdc8c17a94dfe31adec816fa14e7ba49ba7e9dea352c711ae1b37d545ffe92712c62411478244b45353b595c6e58ed21da249931b1c86fa4beb3b8ecb697e900c8b5d2bb755b197ea2abe71deb9de1f93b485a69995dc65f45f47248048b7333b84bdd36338e350d4d9f280534c07c190472485a98f060949ffd142ef2df1a5225acc84e5bc4863a5f9f84dbf1c9a8c85e2acbcb548b248af3560467279dc4a4365efccb9506f64d00336369c9be4c4f71f94b867535fa8b6a88acbb4ccd5b7214ebe275885b6c8d57e42d7565a950f664663051a4f7cadd2c1a73f10975c604e6dbe113ddcbd1448d394ac86d919b055ffae2f589d87cc96094c0d3059feda2d5b4606f3c5e0bb8c9bb222a887f17c48c3bc93acbe0f9972f7ffd27e952b8940900c94f4b1d033134f01d635e7aab7b11b34de71217278fc06191b65c970f21a946837cb50fa1f9f662a43a988a3f7116ead7c60886eff93cc5e4480775da93dd0ff6be203cce5736991d78deb7bcefc467cd9d5334391cca305ea592f40130cfe28adc35ad70921c1cf2e5d70a083d42b299359b29ee41932c6794a41c6c41a447a7a09b6970f3d27389492c8a0ca3b953a156896ef4b0be4067dee5f6040d87c6b5d0fa78b7c27d264c6c8540b06951d24fc7c40a35b174f5c64bff89afde9ee81c35fce32c4748bda1168832ddd631b80a52f505988cddd1eca397dd56fa1134449747b1b6c959c1f20ee06a7933828d39bdc4680488205e41ae58fbe2aa093396be83ea3f92d8baa61d33f06dc86bd746d1d83a63ee66242e34e7ea3936ae6b78715997aee8ee2e250b2acaa2dd15209856da839c06d6aa19fcefb245e62766537a70bfeb14c3a7d7a06c02ffbaa8ef9714714b971899786bcf165cec029dac909f726add5d7eac24a3a2a06ba74bcdabd3469b3c6cd6168d7504ef18d137c395a904a06e0d47c674de73aad0eb26413c5a017a734ab60de5b66273b09c1e35cc5fd06a856b487b2f17882a15cf62d3b27249f124f961e3dd5ad8f19cab798a9b8b7ecf0abea656bd178827229b270b75e3c60737c2fe23dc280d6fc44671486cf3b6d8e64f8cdc86a61caadf979c72ed7521c494edb55249e9aaf810b52ef9a6601f8cff662097f38becba340aea8f83ef023023c2b0fa8e655691683fd724b19b61f33e4a8a0e6a909f5f093e38ea9d1b1054cd8814a21264ba44b42e9452f56925158b45f3c9547bdda14679af0ca5bff43778890cd33dae7e18dcc88f0ada9513fbcf9d83511a155089d304777c01a456e10d0bbd14770a4916c856edd4c8e5d2acf09b612d22269e1e9827b7c21b92dc5b755752ed2842c344601fd93827230b30d887b6e5d6766f697d299867595131ac96b5f1e6b81c95ac8d6d79bf5f1565906da9a9029dcc6c706b5441f225a8fbdc5a6cc388906167563586f5f0d88489d39948630bdef23c3d48eedaebe660e3f4a8c6ef5a16d9e04841b37654fa371e0143ae0b8803ae88d8fe408ddb034190fb67099de5b34ba98c9a3c24712ef8cd235321ca0173c9f84773928049e613abf9817ef7afcf806a2a266926d2da8d3e3fb0eac8ff960b3394912cdbbdf69edbf7dd6d2242d341ca28cf82a5fc68bf186044512c09d43be2c73e55c7bf9baac9fb631e4926255471907ccec8793e56038bf69d1fa89523ace664566cd83dfe1c10fbd892e12f81086a1596b8cfc61aa9caae18c86341893afbea77f18f44637d3b8de525fd589237bc81229c8966d3af24540850c24036330db8007e6d19a19486018b2b02074da590aaba9d2c8848c0a2d1b6de4dfaf24025b6393df9228008f83f13cc76a67cfbed77a6e3429342824a0b6a9b8dd884094acc6a54bbc8c8829930c52fe39ce5e0dcd02d9553ef899d26eb6cae0940b63584e2daeb3b7340a972bae87dd05151fd639d99dbe503e5ba3e590340499b4e6ddbe0d22b028cb1268ac6c6ddc62d87fa8dc630de82391e81983e7879d652155858ae9a3b9779e3a0ea3da5784c98517e5f343bc6b1f8fb993e80138037cbd39f02347a4482a49ec09805ce76eafa7531e3cd01bbfba945ab38091c7ef47050e9e25bba6e4c73aa2e9e0889fe28bbbcbc207acce4e6b2c45e8cbfdb9a96a853dffe09a1e07c50ce91042c1d388f43eec71e24e269fc7c405b448c98fda4daa629602778c39aa2d391d05bd44da6fad3f9e6b18c73c56f814968579acea6700f6e109e873e2ed182d70c7cf465f54932fb7f0b122ac8f34ed1fe082a3625d157561454167ac145a10bbf77c6a70596d574f118bcb58d71719b1086905da865468b76336d9fda65f8d5f234923c5d4a820d45c2d23c9c4fb04ea5bb146ab794a3b23e22d4d4029b51dbac9aa04c86ce026e82ef9be97ef7d492c68efe86dac6387672089241c04f72c8f59337fe06891d3eb08960e2bacfa5117ae795d89a63cb7c1ccff00f9ce72442d507a07a67e29a26d877694fd841ea70c9ae22897ed3256f435e36661ecc2ff155dc24e9304343cd00a1fe5960b46d5abbcbedc00f7e0ef5f09dac6dcf665b7f7cfb0973ea13dedc33ef6728db90f47559273ea6d3cd4db62a74994d361d7091534c973f1cb934fa7649ebe3d13c4869aaa85d635426ac5cf9cb472ddc5a35d2e0b718764e9f0dd0d397d4b2c82231dfb637911e1af2f18c658afc36478373e72d25d23f092c310551c168be4aa9767f86bd24ffab9ae5f0779901900102f27b427c0ec3d3c86742f8aff02fde39e1f021205c2f9184503036e09e62923d7a3425a6142937db782fd14ab32d0d3a38db8f4a82d6541afaf4ab481ad4809ed3bae0892c9abacd2d73e378fbdf5d1444e7d921dd1b7ac3aae3dcb7bf10558bc4b67b0f9e3ee6074cb737220e6d5830cdbd068fb7278de62aa5d316d33b986e17d0fc1fb13c42ef9da2d331350086f49b041e7b562215ed40e3984e9f80d2ae92af6da0afbd56eeeaddc18bb8c06ec975652acc0333983fb54531456b058ab3fefcd57cdee8ab6df90f091adfd498182488316c0682a0445072a8e57ff248e5225e3d9a87e6c8d293e1b1c4f2648c4771143b42a738b464db130515227095acc87eace2f1de358680fbc373389ad3c021b251362e7d5d071ccf4ebc9da7f770b6032a3c66f97bf28804460efa9cf4e9ff097930e2782195dd4f8dc438bef899b596c0902c5f217d73a5437d8092772cd2c2bd180d528b76e43ac9143bdd208f8ddf74c68c37af8e0885c1a812a5e5f0618425d6f5322012f9390b94ee2ef6ba068550c6cea9ae8f104dc877f8fcc49c75f8b853e2416ad2e6f45a2c99d60283e8315c783adfa5e754a461d279c19f9ad6c57e751ea7f01c7212bec48300cc50fa8a9fc518fe1cfe993392a1df19fb514c947f25f08b3a59643c3f44f5d2dd8a05392193af319b3caaa165cc702e62299f0dc44c9f15d1f28519e6943774bc9ad1e5eacc489eab094e97e23b75285b8a96d754d0746f3c4d9d52ba9d910ff1e6263703562b6dd3cd4cbd10d6352f6fdcfb9b379bb7be03d4748ec3454bcb05d8ccd7731ba0c79cf06dbaf786fa69248794007693b02dafeed1760a75accf7fd78a6c4201efd48dda79379f310a0105f32aaf18a2a6e1c7027db19616fd44e74a2a9e78f25fbb2ef338db11c0ae1d9789844f25afe305d37a41e8700e8751c69b72171ed539a507a4714f541c2ee664af6c89a6a1adbf5bbde3c39e478f1fa2312b7c3c91c6b9a153ee3a702bd283f3cea805a2624d37e8332be92aa760d606741d78d8104b20836a75456ed7e21ccc4f016a21d90b970144e3031b18419d77cc0fb1fc391301354fcf185507a5db78983f612bee2e042f58d1b87a81799c7fa1cacfaff46585406cc45a2da364e67e132a91c98900a8f9d7bfb14ec951fca55b177bfa2988d32b271bb3fe926765662789a30292c7abe72973969fda11e57162bc5de3c0c5157eea9ecdd1bef681b93b263edff1cc3581b6b50e769b017e6c1f811c75a26470c21c134dad0e5961fdb9c70b668f576c50e74fc1daf468f01df83060b5b5ad0e7e2443de9b6ad72fbd0835b1a152af7bdb220758d3cd90620d568fd3ade2e7173a6cf626a2baba107e9038d998231e88aad0a77b690ebffdc2a2681b64125cb37e5bf3cdcae6482ecab9972b52ebeabc465af5d1a5a03ee9c64281e0e22b5208d359047c1bd7cab128eb1c4ed7905c3e3626ba038e69554da1a0a2cb30161241c0ceefdb9e7387c1218e8deb2ffcbc37029ebdb82c524b51d922958355bce484ce227d915aa3c9843c0ab3a9631552ce3329c89988436a1ff83221b159040ff983be76475750d62501c7563179c5652c502ea14ea925f8dc86370dfd45d5ddca6a08a2a49e60f8caf82e3e2a7cf23f78e117117e98de3eb30999220e2019941c0869c95136bd749caaa5323d718626db6f4be0d15b5884ca0bbf288df2b77d1ae74ab2f5274d95c29e95fc126268637d8132d6f1fc7912491313e721c397e0e98e1126397afaa2645c67625056803e859f34bb83822b2f59aafc26739ca105b48528edc536aae2ac6d812da056b6fe1b51b95632f655242256e2af2b84bd33a155f5cf4063479ec0584d25a969f2ed69202970a35fdf3acba22d48f084d3b4d885e294520ab81fc8a5311114971c519493ecd181c5b0b67c1346ba6aa3cbce829d5503a432e5aaeddd97ba88e81c73c7336a417231b2e35f3393cc42e98dcac725b8e5dee3b68a5687e6e9ae65da9b28860c881ea9cc0899897d48205e01f0cea67202a82513052d2b86642e153f11df16386d2f38e66c559d6df4ab0b1087c0a8eb22a801e4659751dff3af01311c156b57ba4ae3e958b9f8c99a8cf7a0d9c4b18b0d897e11f0be825960d92f9905f20bd23519b4bb14ed21fa006b2a9a2c034bba8af1a582efca455c7255a960159d800fa744b245e81aa069efeeade7c9a5fde063897d20a9e32350f0cb776c913f5278d773e56f1c68fe7d2ec0876df8d14f655ef80ed1682fa39da3e29fa7c4ff07748f4d5622f7fec29d8787c01600afcab144e6607e72d94dab53432bf8f506296a957a0c44c2057433c0ec61c92b68f52cdcfd7c101107a9e2c79622466b7b40c4b2a30fbec6a49da6a296716ebf24593ff0e2696d8ae240abc9828d7b6f87d2e9ae7068794804c45ef52ef8ec050a7c5046402f7f2891996c1faf737e4952694151881e5c934c71c3815bff2d4543e8c9a8bdd72c323c3c8e92c6dc3741038c346394394eeea52c3d0dc68c18c7f62510dc01675eef0db27aea6fd18e9fc3c42aab3bc239a0377e346316aa95d24cb98faab5eafca82a8297ef51586baab9978bf226c004f229ee1049f45e8caf6d2eacdc8165eea6bb344c69157cb6ab0e8fbf00fc3b972ca405398808b2e5a7800cd1380ce21c2ee951031f624257eae9342e9d663cda96cf4917e8f9ad8800aed96588ff686e8bdb6023dae1b436af730d41910cc9b577d344123070575e021e1fd0920100cc03bbe914623ad93c42d3a25ea395ed1019d77e932a14b94df7f965791fbbb11ee0ae743d7f14b94fea327bef9daaadd3c2047e009c8eda3e256634caf6d5834c68de8a08f9175d58f1b8215a45f213e6bb82ccc34f85c31ad58e132ae1f67e3ee473b2dc97eccc409d8c1b09641626314c78f0420ba27ac750988a01a6c6abdc9b957521223b0eed37d7f162c1bdee9cbc0e72e7978d092fdbad21b80eef110fd76a5a4063ab2c4906c02ccf26907410556edb19bded7738c1f561b5e116b8bdde1de99f1fe52d3b547053b65936bf735dbdb33f436acdcc4897d161e7e6a9cffad4aaa7219119aa670fee812358d7af1d2680c3f2ad12d2babcfa24e704eb2e70b726c03056f98089c485974c9ec5aaddcfcc0c925e4e325d8b6267ab1b86c08bf0e45313dcd4a4ffb7a1609caf904ee5e01e82eb258ad47a2d9390f9d1836f92a46cc693ccb2fe1411c944db3440817c82ff8dc4a8cda058c915099acee922ccfe478378ce9b760ffa86abd0d4de2debdcf695e7921f7e41886e3856bbc0c18223fcf08a8998f437995ffd443871397b188b021a8988567b922887f4401133fd3e137790a6b060d617dca2ff08018d715b463c263511104f0eca5d3e04e3628275157f54cceca2329b8503c9eb971118d0b0abd340c1940524dd21fab03e355cf0896f9ca452a2934ee3866a8939adb79c50b8e84fa1cae5fee83df1eb2a94d1d8f7b131d6ed4943587d94a98bf24995eaaec92f0db79a37c17318eb5eb0672b55e7acdb09c27d89e0db964f99c7cdfbe053486e1f0ded4298071ab0b1d796b08ee2c861e5db27ac0e86f2245ac22131a6c69b6e30aba94fa92bab078ba80aa9ac6f6d8d143f30f50b0512f077ea2d7f658f2cf7e697b8a61c6733b99429a95dd61703253bf67eacffe05c7b9747da2d453761d1e9db008f1a431a8f75645c163561f2f20509fb1912a03a8d63e20e826d45a4c3e27f6b52cb48c84ed6610c1af1d5a3bc177f8d836acc13ed83c2b2c706415c967989e03656fda6c15e279fb331fb7c4b1c601e3432ec4e649eefaf4537b4f01255034684e3ea1aafb6beff261d5ce666bab49572908955ba5c72eb412925caff1ff487859c988ddf862e12bedf7f4ad79984da86ac2a8fb767525006031c51257e658a7ea78e681a757fc2c29cec0e6462d7d5b8af5764226497c5dbee21ed4c1b5d37ba2c5411282bbaf5797f2c9cd6bdb66e4fc1983cc5fe4a310712bd063b9de476805473f2d151e7952cadc65af451288d9509767f66db727ed3967704bbad022f17467271dd8f0c89245142b288c7351ad0b07895cea3179387a3d85094f3c04ac82bd9f8138c33b9a691290b58c6e5fd49dd27e7c5ff41586b6067508e1625afdb2b31ee3cf1630dfd9502cc2ef7411e48b909db1397f9b5c6f6ac6d70bf3a47986d01bb2065a56d7086555fd0025065146ca8da7f124692e28c2f0f049506f8461ad1c6879100c1468cab2b068e1bbbf71d8c4dd21831d7054b799f104191ab2f592a79391c7cf1c8ce8a989a43a80637f53b9ad453c16c785b11835d6ae3499953923bfdaf21e53e757d0e52cb01301d1b3f2b4d68fe3983e37f25b3b905b8cd3093759df2f886f0a809f5f8cb2e1ff1b720660502f0276d0b4cecdad6fee21317b58ddf8c08ba2590b8b552ee35bdfbf364b5c4c7a01c80fdff3f9968d6adb2307fec8c26596a265511b629d920f082f5957f515f150102de2088b9179503f4a479fa6c67f47f3c1e9c614437f7a2d0e53a2b757357bf3cd9372e038d44cb1f9b2b1f46f8e0dfad13e21c6daec0ba2becdc23f8ab6f3c7613cd993c6febed7c3c1ec4e3802574c15e6a506ae68520dc3202cea2ae6462f8b769302f68905053b0d94f0ca8cc24c224bc6604894dbc2bde34943a253e1809eb945da31e3ddeec1fe42a8718dcd9f69061c4033c21765f18fbdd8ab70645f2d7d5885f39f97e8eb0c8bb1c775d7aa7c7e0d42fa90836c20add11580dc3d3fca5b4172c62cd18838b0c6c956e58ef1bf4c1fd50780ae49ad964986dce7da96c7ab973d241bf9511d938a4b9a4d3209a3d8da62d512f6830b018db91a33caf8d816d04197ddadb81c2d5ca4fc2d9f56ecacb398fda80aaccb580408b3409cda6df5732c9be23d31b6d6a48206f6f56dec4031d3ebe0492b61024302528ebebfebf0066a9aea46526037f85f4549f2b3153beba02a3c30935ea8c142528ebf1de47ee0682f3647aecab9ce99218705cb09e8278a332c6f5926b415254db10c78e9fab7c1c356bf8b38e4adcc464ebd1a3cedabfe812144016baca547aea625656f0bf2e3f1dc2c9c4d310c650e01672520a4bf79aebb5d00600af805ffce9847e62b086b35270d367a3770fff33fb28047b5f888167b28fad647940cabaae3a4d1c08ea3f7d7d00e326061f9906a2d902499dda652c1263520faffb85cbb8610c474ec4ad46f2368283455fe600116e959b8d550ee2dd363c28d91856d90fdf040a0b7bc354d65f8ae3bc35aeca52d00399b86244321cefb4d87f010689bc9e7a8ec6774a503162446df40ab80b6de5946da567cec4d67602472a1d5d85c684b9fa072009e10b27f84a7447cd6c6897923cdcce753f13b36e9c61d42275357b087757decab06d96eea1c452b5954dcd4331e6fd014bdb8e4000ad8e1f00126aae2d3c1953655e976d9b6d95382d246ff1714a5e3a9137efbf9a95b31acf6438f44340396da7e712be60f6761dddf364e2279057e7b92ebe3493a1abdc8a33cf22e2eba6e01e0fef2a17e75f2e4cc4965e794152d26bc9e3e71259df2dd887168031c4c87473de16f7e9c9b731229eecaf8fe4b6c14e0f46204046b5d46169f555595308f14e5c6f6dfd22e6ef098a4e1c9201eb7d0a08cf2744ef969bcee054eb8120cc1e5692e3d67c7d5430a78ea4ecaa2159ce48bc674347dceb48c7f51b88d2b47dc4348758788d5f69bca4b5d668fecb687bb034f4be71961aa4f3af3275749684ab9043b79d59528d5aa904cdd8b787804ee9775fdee9a48d77fb1682fa8e4e479b10cfe98b07dd28d45e856f84fcdd090d9c8d91ecd88eaa898632f15e4865305c5f32d58ac089a2f06a3fa5b3f6566b81707f712f65dddba13d0c68ebcb62a6b5237462e4acdc6377763a58aecd790e720e54e6f1b9188789c8abd0e73fcd1070059e7adff260d330297f6ebea8ce5aa81d14da78fbc71507ce170f9bcc2fd853acb704c5bb9d5ae52c15d129afdeb8ea46c7340e5473efe4f7590f4f980e6527c1c7e7dc2e1a615c260467370c308e013176dcf9eca37ce7ed78b64bcef51fb3ebd70d6d745f4e5ec0551a32e44d45b68529b981eadf24da557ceed694696ec1d3ed5dbfb4f48bb3a20fd06062bb46cfeae6b5f077af4f83da6e9e3912f4ba172014bf1c17627e23733a730bab04f8140ab7b78cba9c65ac2255aebd721d6b7e7b511bcac5309176dbdfea79eaafc24f8aa3a89fdc2dce1bd53905a7d96ce9be8cae5912e5e62b7384041df245450e4615b26e6f04ebf3999c228d42716a9d9ffa32623c9f0cb3e413b4f4c0e44d43c251edf2455b5c3aed1f192dd5629eede96ee51c901d2b938f33f4572af04fc88be65b1c68090a0ce10525cda7d49142638fd0705684ca323c8ace2e7791d407697d05d522357dd23bf64f5501eec905d706fa46d5ff72f8b5c04961f0ee636724bef103b9073bf2c49c9eae2bd8d09c0b7a6c8756b3aa4dc17e6dd8dd3084508350298f76a8ced6449c1abe6dbb2e71c7942c1921cbfa99276c437c867ebf2a50dcb562a140bee483a1cb6e0fbf69ead5fc44e67e6dea44b031d23332019d5e51099b6382f691864851baa7580b0b71fc59bbd5b5c203b6247523e62ae1a5524f80e57960f3d1235c54ee4f92c89c6d03539acd0df1cc584be23c7eb745606f11e89b8e855f052288536f4f031da246b393e8b8cf22ce90ec1e27e11f55541d61eac3893761b6ed92f64690f333a763d4c1ad7d447f8fc7d1d1ecf9aa3b0bc5052e6751bf216beb42e47af9ac31322e2e85f204b12d9966c0a491aca21c0dcdc65b8ed065c8ac8462c613717540cc0e8885be35615774d3823e20e44d23e09f6c1941ed707e0220b8431ae29588fb6bab6c19f89b23a678df49a088f5750ea1bf1287902a6af3270e04963355304aae60e00b35a6b9b9bc9e6a1a80e03d1f3d87eb68a1d9b509012ab08f4cfd613e3d6d899dd4cb423506894b95b456a199da8b4fec09c686cc17d4f00d15d54261819a11d6bd52e6a0c06694190ca1c906df94e41cae3906c3cfd66c197624fc3ae2b11dbfd883cc8451feedaf7008deedb66a52ff79795d7692f7cbba5734b651c978585e0ea51d682119fc5dc8d208d7c6d5429d52d0b26dc9feb6f9a04b992f9cb967bd450200d5987f6c2dfc486e4b779d5cff22842d31dab4d4dc39b2cd5bc43af5e466e09e521ef7e327f4b239d13189472ccfdef8492fe1ce6e0ab1795daac4a8d95a881f671b4a0952985890f15c62ac2c4326383d2e4d4bb4fb8fc5beb51e28a60742aa9cf74088b6d1819c3460f0320864a4189641bff4b8f596da054c121e535756677a1aa1055b85768521a6fb82c71ca0bedbcf007181de0ce0bad96632e6310b7f88ec352b4a9d807241944b43715261529440d96917a03afe66c3e30b697caa1a4ed6c49f8a02e58b1a93a71e0fee30fd49fb0f848321685d90725152e3227b5f553e150c239aedfa360cd9bba8d755e6836a6d6bcc4bde25c04e78ae5d0ac677248df1181e4fe2e41d65a7c144f71837c9f4bac6fa04e37d7ebf1fc8de1cd38a442c206b82080a745508dad9eb35c015a401bd3c1636c08d532d10476e40e9bf3b816aae57adafcf685b3aaaa67997aa9bf93f7626c8be7ec60011d4155e523e93f69789a5251720dec88edd7cabe31e3645081c35a2237860a0eb17dc5e5430d3f26ea3755a8a8d3db5a01976b4ed99fd4be0d548ac37a2a77566b7ca2838bd84ddb8a5ce33523e0f8c36079b7afd4279748f4969ce442525e8495de8a5460c2d1e3d36b998b65cdbb4194ef3e65b413128dc219ff09029625f5eb03dbbc546561fc5ff3d71fd0f2a95119786e04ebfadd09105f3fa64d5e5436b59d153ff92884718a862a6707e8397e58a5d511fe476d2749c6bd4085136fd39ffac563a1949fefdd8302057d26e225fce7f1f17d713984e8f1266c4c6ddf3904bd7aabf0224ac3e37b0c5fa32739e450cf4347cc10c88e685ed99e05c628f37e55939d6769eb9a16ee97ea0c71b7360ebc57696c9ea0c06270653a33a4e38f8743ae9c69d418eef25e33492b9ed097814f9cfaf18348b741d647d5789295599a082a4d99e9491ef03a7cd192f72c9552e98260dd5726df90e0f0042707950e3133a5155a21f2b6bb13c337b513019bee2ab62f9292d195da310c2ac18c8909e726ad883d06bc429d7aa4c0048b1627cd8386dbb3cebf968836eaddfa89d7d92681821ab51ffc5f31cfa02f23c7d0d58b74a2e9b353774e25631a82249817f869b4e13154c63948f28333b97541a801728e68de13c96f292c6629abc23fbfe44b3139808ea209bc5a45de139b9122584d21672d47b92db4179076df65d936292597097ce53bd415f3881db1e93ed63665ee1c5bd17b298b7172b081820d11339356bf9adaec2ed238ba6118e0931a18473506ee4 MD = d558f26d7e8e293a3911d606e7b7c822a92e28675a8e92389ca27ab0cbe71b2debbf0c360c8d33586c7a374550266db2 ring-0.16.9/third_party/NIST/SHAVS/SHA384Monte.rsp000064400000000000000000000273171352416253600173520ustar0000000000000000# CAVS 11.1 # "SHA-384 Monte" information for "sha_values" # SHA-384 tests are configured for BYTE oriented implementations # Generated on Wed May 11 17:26:04 2011 [L = 48] Seed = edff07255c71b54a9beae52cdfa083569a08be89949cbba73ddc8acf429359ca5e5be7a673633ca0d9709848f522a9df COUNT = 0 MD = e81b86c49a38feddfd185f71ca7da6732a053ed4a2640d52d27f53f9f76422650b0e93645301ac99f8295d6f820f1035 COUNT = 1 MD = 1d6bd21713bffd50946a10c39a7742d740e8f271f0c8f643d4c95375094fd9bf29d89ee61a76053f22e44a4b058a64ed COUNT = 2 MD = 425167b66ae965bd7d68515b54ebfa16f33d2bdb2147a4eac515a75224cd19cea564d692017d2a1c41c1a3f68bb5a209 COUNT = 3 MD = 9e7477ffd4baad1fcca035f4687b35ed47a57832fb27d131eb8018fcb41edf4d5e25874466d2e2d61ae3accdfc7aa364 COUNT = 4 MD = d7b4d4e779ca70c8d065630db1f9128ee43b4bde08a81bce13d48659b6ef47b6cfc802af6d8756f6cd43c709bb445bab COUNT = 5 MD = a038eaa91772d458a7339612f6a9214e6550f78d5870d91fa7a3dc1c2321e511759c159a371475dda7ad1fd7f51ac82b COUNT = 6 MD = 8552b4ea2da9f855fcc7230ac88ecb1c3cb4841cc28e0495bf1ab97d100d4e4c60a1c51949d26723415f560da2951bb0 COUNT = 7 MD = 668338b2e661d9e25b799d7329e55629b62416ee4d42d2e55245ffe7092e7ae4a3da6903944d532c2a88e4632f9a4b36 COUNT = 8 MD = c40cd19cb770b1fe81135fcb9223ffb9ef50340d13660658ba60656a88f4ea08ee3b572680e2b4abbaf4392486ea589a COUNT = 9 MD = 540c154e82b57914abc0452990abf988e46a2f65b40f5e9ef80a38c7431293d5efa31c7c83df5345b079ad4e31b2c8b2 COUNT = 10 MD = e112f9359983e7df9b266f53ec950ed2b951b6d832c8fc1ffed22b4be3eae3d015e0771e96d344672000d4959d2829ab COUNT = 11 MD = 186e69c28033e11b152542c86a94f59a25ec4edb7ab5b735faff16bdbacc682b2ae79b5f5a68ece9fee5ea4530b8a8f4 COUNT = 12 MD = a37c790e641f911ef2929bab0ccbb890627c7e38e1a2fbbd71cd4215de919763c2819c35a0e93984b7d85d0e8858573f COUNT = 13 MD = f1b4bdcfe0cce284ca26e0b7e01f26de21bf4a7a409ee99fee1019cc8d23e775bc134ec7987a6575fa64160b5c7f849e COUNT = 14 MD = 45aabfb784a29d6be30104ae9f3c5daa58e48a9c94f61fed94dccd2ec06b527ed564643573d588ce10d3847361a57961 COUNT = 15 MD = be3a49139a48dafba418bb9e0e8e2bd195e0d239eec77c43d1f0cee844b65f65c30cddfc05b644f9a792459695883a2e COUNT = 16 MD = 3b263277a0d11de4cb4616591d4623e0821da4f111dae33938329cb8cc47f46742c70c09463edb9ff4a0171c4604b243 COUNT = 17 MD = 2be323079381bd13a02cca824c2f3cd18cbc89b0c3319afbf33c6f06f2abf2fa3af35ea9752ffe153d1775a95e7accbd COUNT = 18 MD = 14c8c3ea3f5aea2e74a2f138863accf1b5f563d96194c0dcf08ca816e1ac9156c3f5d15aa5701d93c188c2c1f7237518 COUNT = 19 MD = b9158943803c47678fefafa91c98966aa3dc1fd96f4e86cfdde7ca879dbf9fa9f54b1988a53376f7005df7fd87b1396b COUNT = 20 MD = f4395f88c4dc24b6edca5868fcebd24991ced2e3826c04ec00e4630d7e1f70ee56124a90657a795f446f7db94d8b439e COUNT = 21 MD = bb56b4ed4683fce0d6d412ef84b7985ccc5fe30306679a994c8221c1212ff7f1492512095b7ddd250411008ce9d54020 COUNT = 22 MD = cacaeb081a62a4e384e0082f8b994dcd721f38b3c3e4b5836ddcaaab74bcf2700fdc8b6faf3f4df1ec175a0628728a4c COUNT = 23 MD = 231796f44eba3c8c6ad064b0e350093fcae026c3c03d669c28e5f36befa5f35489bf595a0312c38b9b73b7bb4dad5b96 COUNT = 24 MD = d54559e7eb20534025f8f265bdbdab0e7dd9e2459305288d3ca84190b6d2c6e8ae2cd6f3e51ccb54551d94e9e40b31ac COUNT = 25 MD = d6231b809b70ed19478cdf7e05534e92ea01e74e970fe17e92ec9a67b1b7977c4c485cfa74787224fe326b1b8d1ede87 COUNT = 26 MD = 8ca1d462cc1b16b734c0e4f1a6b7f7d9d0ba9ce8074addc7755243b05fe269afab6618f07fe73089d9379bcbdce6c728 COUNT = 27 MD = 60fa725bbf21ee56545ab24e6f26ec5ec749c4971bf761923c23415cbcb0c02e6a474deb50144abad2b0f16ddbe850a9 COUNT = 28 MD = 8b60fe287f5bc133ff842a246bf161a58b4b8ead5be073c702552d664653e384e28e70d28624aa1da951ed33dcdfc7fd COUNT = 29 MD = d18a080af3ae7e6318dc69298bd7b13644b7ab00adac18b446c1e9a9366e68dade87687b9129aefae9a98b531309f1c7 COUNT = 30 MD = faad832a7ce865cf3183e51e07f08aad6570795f8d0274fae52fc5cb637ce4b7cdb8f8092e2ac4a7c96beb70cb288b69 COUNT = 31 MD = b7bea61748495351409fcf1bd45a94af34e7dd899933ed06d5759fe728f6933781c21f1986b99906c6910d976a0d9c4b COUNT = 32 MD = b35027199cf6467302a88e5d0106d01953b41dfa172234b3e11d3ccad33bda9a836e44f43ae94451e2bea28f0dca7989 COUNT = 33 MD = 8571acd0d5fdd20909e9cd74e125cb9cd65a2e74056eab3f85f6f13e31a5fc1580aa588997d31a0a3ba1a16dea5528d3 COUNT = 34 MD = 3dcf49cb8d79d4ca3f6e06e8a58bb92a7a42d7915b9e710a29d37ece6c1c32eb89a897e9935354db3cbe384a1149964a COUNT = 35 MD = 7b2258c5fbf26780f55054b4aa462a607eecbf7382af941efd75b9b4cadd5b97936a762b9c03e133d7cfb65de501e6df COUNT = 36 MD = c54cfebd2381621fed5cf6b82b3dea25965ec99365ce415b184ded71b949eb8009d91c85c02b30b7465fdcf18be885ca COUNT = 37 MD = 39bed6de0e885dfd51569f3c5dc967f7f551065e87b6e7108d15ef5ea407419f936f5ae2288aeecf98777249f384fdfa COUNT = 38 MD = b1c341b1428e5df6f4bcec533f1b5ca57e02102f5647b82be0986e523fad24b7f27aa29336a3f333817e8a5336a4a3b4 COUNT = 39 MD = 2e1e67546b9424a2f0bd8931082f9fb8951b9fe57a2b61683a5e197017ebcd96592dc47a75d2ae4ab8f436edd5e5bb4e COUNT = 40 MD = 6c84a39bc94af5960715818bf9b4694548dd1f0af8f6344d56b0dc7f86b181d5249172c82572ec8748ff35b6c0a2abd5 COUNT = 41 MD = 576705bec035d07e31ebb091f180cd68c3873ea306708c5259f50491463c68d912080ba9f11bcc983a4b849ca19df008 COUNT = 42 MD = d45c7e9080b6223a2185c490363764f9fb0634f3865d57a15bea438fb243e98fccad4176bf24c4cb7247dd2c5728b761 COUNT = 43 MD = b3021cedd2ba38b69348867729cfe2ab172e4f1643eb4971cde2db002413458a566ea884d651a9c010b1a6b869168497 COUNT = 44 MD = 1cb9c05e35029fe6b114c85a457091b7d9aaf7c95f32447f3f20cd034bc54f87ae85c4013d18fe2a94de8ecf9c6b9f05 COUNT = 45 MD = 1e8f037fb920b836b8f36a1ed4875cf7d61390f68d4843e420b2c1ca702a104524c1187c8eec7bb4b174a252e1ae1462 COUNT = 46 MD = 07c790c3d4948347ad5fad9992d8a0f6603a2133d138f1ff5cbbdc04c39277fb67d45b2e2c8e6c51fdaa6c5883e3a69c COUNT = 47 MD = 98ef381d9b6b4e26ebf2bc293743e1e07943a3663b17f1be52d12ef8d19621263efb8525506ef6b95f746567a43577c6 COUNT = 48 MD = 8beefea2f858f8902928dae6060b10cf6d4a3cd1f91cf1ee5ddef0ee5fc25a8269367c114c1c5c5ab5287c48edc59274 COUNT = 49 MD = 03a6509ad6eb7f009931e596f3dab586de3bd6549afab4f218eba4fe47daf37c6faa360afdd931c5a95544f1a028195b COUNT = 50 MD = bdf7e8d538e7ef418c808bf2dec1242b716326f83bf0a53db81f4d63aba37a2412f6b2bf00957ad6faf8404e4e2067a8 COUNT = 51 MD = 71ad43312ed6e403a5e174480fb14b3c2a3a60bba36611e1c99adf8013d243fe945b947b362b6dc51a3dd96235472f5e COUNT = 52 MD = bec45a229217e5fe28d6d1675dc7440ccb5616c0f02eb5d4c814921fc82fdddb04592ce7af192fee6c61b1a08f6ab6aa COUNT = 53 MD = 5d6bc2d2cd0d8f5e41656f73a473bef1eff212fe98b184386cdecade24c5c5e7b92cf76ea16f582b9951634881f85585 COUNT = 54 MD = 96e3568d30a1f7810404f3be8d2d26e5606da6c3fc064d0ef62298ca327476d587a1e3ef0d6554f4ad529053b7a651fd COUNT = 55 MD = e4df3b7028f5e68753c1f21a556d8468a5d80fb048f6b92d405e519ea9ce44c6c95fb362119c553f5921dc9616dd3937 COUNT = 56 MD = 7881e36eef708df4d9c06e37bfa7af5ce7d41d31a2e4332d23922a518de3e2e6fd4b9f27ee64379afae7ca2570d24748 COUNT = 57 MD = aa12548b63d3a58f6914744111292cfc1f1358f717f1b19fab1a4ecac6292f1ff4b4c67b8a260b048f00ddc83b42453a COUNT = 58 MD = b421b6941b5d7748765a4090c224dbbd98e85dcff9a65a77db0c2a83b92f4cad961b5b8ff76b5513d4a7af45ec4d4550 COUNT = 59 MD = 14e1b1733b16899c4046a604f8e1e777d55649c5357d7d9e3d7a1c395b6275aecf733a598de1d0bfd7eeaa9ecbd7d1e7 COUNT = 60 MD = bd05a1f9fa5b77371005a8073f0f3bcc4cb4e08fde3335dd3688921cf9cb5e97cf1b3052ff74bed8a359d170d2bea48f COUNT = 61 MD = a319d9b3eeee6da494940ffb08903bcd588b18733a64ed435eadc5d9add6ab4f0c35fc050958bed81303409f388a065e COUNT = 62 MD = 6f19824ec874b55e88fe4b1387433dab85415148870bf4a0612aa9c1cbcd9627925616fcdb66d68760c50fb308f628b0 COUNT = 63 MD = bacb435a1ff538d0ba3e3d0ab04b5e8868bc1f84e964409229d7eada4b846b813c0e30d8e962786aa83aac2dacf02d19 COUNT = 64 MD = e8f013470eafd5af84f63d51d51af2ca884789d03d79f8c3089810254b95a6f54fb86c08202cae94681ad702ea29451a COUNT = 65 MD = 374b07621c018cc3935374c2f2f098e661ca0656181f67f55fb80ac36e23da379c4f6c8a3683c2621f874afa1241b918 COUNT = 66 MD = 5878f1ebcbe60aa62a7b149bd181167e5898d08a3627a08c589436f007bfb82c040b26ea9944c6f0c9c4079b9b0e1ecf COUNT = 67 MD = 05961b57507c99d0cb7dc24ae34eddde94ac484129de621edac5b001ac5c0b974d09d24f75504f3be1a3cd635c44bf71 COUNT = 68 MD = d961eb883eecbc083533fa5128695c8d28281fbac23308dd2f504eb079d2d311b973f1a52b45aa6275550e14477a8876 COUNT = 69 MD = a4557f990f4ccce585ba33453090f66af576f0a501d26667031f48f19538b820b84f870579efb554e7550f9f53fea5ea COUNT = 70 MD = 82194c49f24084249567f0e8963c5f72a23bc20a8f522a6108f12abf95b7437ad93673860a953264838a09bb3968d0a9 COUNT = 71 MD = 371dc5573b145f2136eb854591ece253efebf8732d3898bea063fdc3889d07953ee646e533b214f8c2dd66f1355b03cf COUNT = 72 MD = cfc4dcecc6103027232029dd9a19850a6f79b9004be7d70054d0af11c692affa44c537f7cd749f2b6317cafe1fa52fe4 COUNT = 73 MD = 9920b835400795bd3ed8ae0bc12417d58be8c5ffd6eed151ed738c3031e624c74fb85488953ac81c75f395cab74f1679 COUNT = 74 MD = 4a1b040fa38b5cee63f5d308b55502d2a017b349ead5172c288289f42ba9874d0d11c9ac43255580c428a99067495782 COUNT = 75 MD = 93c1cb94d0689301728165299057edd78ef48a6dc7654931ae2bf7ea5bc733f3b724f4c3081bc93ed61e7d739c38e137 COUNT = 76 MD = 8f2e6c868b224b3cd5ac80669da0ba1d7e799e85a124c9e81c6865ebab1c0481e4ed4957a8989902ec565169ac53b7b4 COUNT = 77 MD = df045c9302fba73f9f27ceb0fb70e6ca3897f410e81a2b8392489e40aa17f15ac59cf8d6893ab10bacd8b59704eab22b COUNT = 78 MD = 8ab095f49aa7ebfcb8b1410f42c38fb1755a0560e3638b8b82c7a852e8bce8f4b780015e051dda0d2cbd6d6cb08e30c0 COUNT = 79 MD = d77fdff2f768188efa63a7e29d73b8ade14c1aeb12e77866a57ea12c81bf0b3e1421d1af57fccf91b2098ba02ffb4118 COUNT = 80 MD = fac5ee7450b3fd1ae2152f5d020680137f553a2c210c57290d058f330d11407593d74c9d3d9ac88bf4af44e023345168 COUNT = 81 MD = 39d0ee95db114925ed7ff1577a22eb3dedb8658ce31504bd0f9f8a8f11f90825587203f26c432d216918156ca931fc82 COUNT = 82 MD = 17d22080e8a9f589a80a5ca8291b0479c41351008dffff79ff522779c35ba0b09acc2dedde936b07e260451d35ce86a9 COUNT = 83 MD = 9d75befac42e6d4d544e70477f7581264b5f8dda988da0dc40ef32f85c31b709284aef5f4f0246d20a855eee9175948e COUNT = 84 MD = 3985f0cbca4c25f624850580516184e3d75996d77f138839c7570b4539b90fae8e751d1cea642816abd7f9ebf9d86c8f COUNT = 85 MD = 93cfd14ade34e50deeee23aa75a63a017b6974e23051117e7e6b56b4ddb88f917a5d88d3af2af27da8e63fe130502f8e COUNT = 86 MD = 7ae513480491a9500fa9afb8f64b8914ffdbeece3b3103048e91f6510b64cdccc8273257e275e5b34ec14c4c4aff4405 COUNT = 87 MD = 2585bab1cd98d4b51a1475fbfbe3bca43da2a7be842c5667c98d3b62a9f05918108be94198d96c67388f83c2abebe498 COUNT = 88 MD = 32f67419616e11fea79e3baeee4524c58d09f0cfb42049cea70f9a4a74e0096df841a0cf5177e402dd5803f4b51c602c COUNT = 89 MD = 9f4486d93c599e68e7463d07d5cc9d589ab3a7c3d4d3c2b2d1f81f65b5c85068331f4142215f337c3621d096eb36aa91 COUNT = 90 MD = e3399ed2ac93c6a4a6c88c11bd89655aac3e573493483c81631fd67dba3bb237d46f9e8ddab3a9fd78236296d00dfd79 COUNT = 91 MD = bd9d1de114afa5ffacfbeb488d4846d012aa6ef66ce09725ae7b15e680d719fc2447f308eeb8247ae8e91e34b5a21ea2 COUNT = 92 MD = e1c3511ed2ed26f770bf5212c7ec245ab2ba49e1c09edae2abad6a3ee41c9e25445f5e5317cf7c9c3c3f702ecd6778a5 COUNT = 93 MD = c363234d1a6272d081f351cd68ac90abea09d3eae3a4d64fae7fab251a252591cb34dc63fb10abcbc5460129464c868b COUNT = 94 MD = 6e5f1531eb282a2911a64b72b043cfe43b527d4d557abb9a31a9a632cdf5b5e055317ecb72a517a025eb4286d6f00433 COUNT = 95 MD = 19c85253b3c703fee80a70bb2ac2ef836bf8e14464d2a17f35bd5e4f2b0b3a059a27891410950a9ce07197f5b306ae3f COUNT = 96 MD = eec713a44cb778811795609610f2f9bfc9bba479e415746efe0dc530b6de66d73cb85b8698a8c0c2ef9344a2043b7a31 COUNT = 97 MD = b799577aab5e8898326ed88eb96de38a27e76280ce44c3f16e70a1f96543ee7020bc29913ea0b9a9b9d92ae201143e0b COUNT = 98 MD = e4dcabf1e22134076a21ea7cf9be6e03b099be40efc2b3080b9ec358cb021623ad27d33129bc68fce3eaec6b25aa2329 COUNT = 99 MD = ccde4359f23e64579c5c0380df837ee950928aa82937a2d2ed33d216e707c46d847efa5ca52dcbda551145e164fbd594 ring-0.16.9/third_party/NIST/SHAVS/SHA384ShortMsg.rsp000064400000000000000000000776401352416253600200420ustar0000000000000000# CAVS 11.0 # "SHA-384 ShortMsg" information # SHA-384 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:39 2011 [L = 48] Len = 0 Msg = 00 MD = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b Len = 8 Msg = c5 MD = b52b72da75d0666379e20f9b4a79c33a329a01f06a2fb7865c9062a28c1de860ba432edfd86b4cb1cb8a75b46076e3b1 Len = 16 Msg = 6ece MD = 53d4773da50d8be4145d8f3a7098ff3691a554a29ae6f652cc7121eb8bc96fd2210e06ae2fa2a36c4b3b3497341e70f0 Len = 24 Msg = 1fa4d5 MD = e4ca4663dff189541cd026dcc056626419028774666f5b379b99f4887c7237bdbd3bea46d5388be0efc2d4b7989ab2c4 Len = 32 Msg = 50e3853d MD = 936a3c3991716ba4c413bc03de20f5ce1c63703b3a5bdb6ab558c9ff70d537e46eb4a15d9f2c85e68d8678de5682695e Len = 40 Msg = 4b5fab61e0 MD = fb390aa5b70b068a54d6d5127df6a6227becc4d6f891fd3f6068b917a883c9b66f318fddb6384d10be8c7af0d3132f03 Len = 48 Msg = dad95a4b4d37 MD = 3a2b40f453925bc3ce17d640757ee0e899390b4a8d984d0297c1bae6b60b9f2603bf71c323fd171011372335e5702e40 Len = 56 Msg = 121835fe3700b7 MD = 7bd06a94acba7beb3c5a9b9e8769c3da6691c482d78b1e5c7619b36630eba4e596d11c410a4c87006f4716b6f17bb9a0 Len = 64 Msg = de60275bdafce4b1 MD = a3d861d866c1362423eb21c6bec8e44b74ce993c55baa2b6640567560ebecdaeda07183dbbbd95e0f522caee5ddbdaf0 Len = 72 Msg = 8d45a55d5ce1f928e6 MD = de76683575a050e2eb5ef95ee201f82416478a1d14bf3d96d1fd4efd52b1a28fed8dfee1830070001dc102a21f761d20 Len = 80 Msg = 5c7dde9b3894d73cefe1 MD = f31b22115fa7178e78223e06aae870547ab93c6eb3c3910b0ee16e6106db55935d6c0eb820132a2078ece1067efc81c3 Len = 88 Msg = 967fa34c07e4945a77051a MD = f8f24d81c4f8f23ecb42d76ed5d2b34c9cbc1f0a97234d1114804b5999759f3131c741d5768cc928163503c5f55f594b Len = 96 Msg = 2209112ee779bf6d95711105 MD = 09c54bf533a26c7447caa5783db2ec7ef5e55752da7f2a2c4e360982a94ec1ca2cb6a157d34eed28de978b4145e17ebc Len = 104 Msg = 20442e1c3f3c88919c39978b78 MD = 50bc95b036e0f54d833032a80d45c2ac38b3d29e9c7f72a2eb14781e9241d2a4b8e8dba6ee6f4c9e46a758d5712dbd39 Len = 112 Msg = 4d43702be4f0530319555d7f1a33 MD = 83c8f0bb762801eb26cc5115abebb657c18ff811de500b32b7a568a220a287e900b6c75224fe7429169fbd534cb588e1 Len = 120 Msg = 5e2a79a544af85f150f7a9d209fd44 MD = 8051ebc9cabb052cabe07e4023e2140808b77d25b07b96d2e3c22393f71b116c1a1e41bf62e57f73ff67871da7c93cf9 Len = 128 Msg = e1bb967b5d379a4aa39050274d09bd93 MD = 3b04f96965ad2fbabd4df25d5d8c95589d069c312ee48539090b2d7b495d2446c31eb2b8f8ffb3012bdce065323d9f48 Len = 136 Msg = bb84a014cd17cc232c98ae8b0709917e9d MD = 85227ae057f2082adf178cae996449100b6a3119e4c415a99e25be6ef20ba8c0eae818d60f71c5c83ff2d4c59aa75263 Len = 144 Msg = c3411a0592f1f4fa698815238997db356418 MD = 233ac44170d9f452a1a0231622030b15c104ff8ecaa3fccdb9e9e5031fd5b4220186a8edd032849c8b93dc183a5c8627 Len = 152 Msg = e831b739e8eb9f787f63c0bb071ddcc9f44cab MD = 91722d4b7aecc211bb8a5480c6855f3b71be4647e1dde0380c23afaa03f45c642606a24506e0317bf51506a483de28ac Len = 160 Msg = b8a7bbccde46e85f1223237d9353b78c3b19727b MD = 28ba69dc05e6e29de91924114d6c9fc7612f6d2a68b07fa001df059bcf98f7aa85389caeb966eaa299c79fe1fd1e40e3 Len = 168 Msg = cf391b8aabec6f81288c8b7b92843be23d2e847574 MD = 121e5ef697df491a53d7bae121416aa653d759a37db9d0b993031b18a0ef160ed98842a291e1ba2cea8b998bc5eee0b1 Len = 176 Msg = 9d65d88bffed764c286f34894f991600d1a67d622382 MD = 84b6e0d6a45329daf47a793418ed5dbde01336b4b9468bb69e5da61c42b691e6794e6ed0e8fb1b8e7d4cd3cbaadc520a Len = 184 Msg = bab6ea46fb717f73f0628132a2b96be383774f1e5d8b6d MD = e969aca1b50e928cad29a0d756457f6de8d7a4e589fd41e53a1e758c3b20f9b81b36bf098a49102fbf869651ca9a98b5 Len = 192 Msg = 8853b00e869764adb527a07b073c85a24e6c208ba47eef4e MD = 09ad44e85ac190e2d1c3ceb4efbea10ded34d0de961fe4ee268132c48e38660e6cf585bfffb8f7b00b0fad1514312b63 Len = 200 Msg = 71fe1ba5d299495d2a56039c64032ec6263d437f55e3f5bedb MD = b41a5d3b4af6d4b9c349e0788538e9a0311086894df7b72cf5aaf4091a7e039e4e89cc77a123474e6d1bac438e5e9f88 Len = 208 Msg = 4ebe07d03c93e849b4bbfe9f2d2294bf6ccab457f76d3f99cb64 MD = beba464d7065185587fad89bfcea9635bf0ab775c3eb8c147b5b2bd8601db6dba0590b50dd1068733f20dc68e004a090 Len = 216 Msg = 918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcd MD = c4baf6397a4c6e26492b63a4aab7dffdd0051d8f51938ac24cfd8dae2f7afed1a4aa2430d7aeb0be2a72b21a6c50198c Len = 224 Msg = 97477f7272d8a89e38e796c533e9f8a8ae4c92ccaa5d907ed26a1a15 MD = d1ad524ebe908d7c5aff50e6cb780fd3a70e87c914a36b93c4e35f5b2cb03850b122b480ef8587d4a44f22467f4c480c Len = 232 Msg = 718e0cfe1386cb1421b4799b15788b862bf03a8072bb30d02303888032 MD = 6d8b8a5bc7ea365ea07f11d3b12e95872a9633684752495cc431636caf1b273a35321044af31c974d8575d38711f56c6 Len = 240 Msg = d3b07f0fd5d4cd3188aead8dc8338de42056e2e8487eca51ec37ef2daf27 MD = adcc2e954c91db3db2d71d0dee1f030e723bee1a23816fe003ac5dc862a0872ef51ff386c18be6ebcaa493f32d1195b9 Len = 248 Msg = 695b9efe1809abd5d44eae957ddf9c2cd3c75fae2f522855712a07c639c0b9 MD = 3bb95d164d94595a1187f77fc26c280ffbb08e74ec7947aa3e5b38bec7c6f8115c4d880788c2402dbb3e5b94afd130ee Len = 256 Msg = be01e520e69f04174ccf95455b1c81445298264d9adc4958574a52843d95b8ba MD = c5cf54b8e3105b1c7bf7a43754d915b0947f28b6dc94a019182929b5c848e11441c9e4e90c7449f4c3cd12954f0f5d99 Len = 264 Msg = 98ef7301f957d73d4e821d5873e8a9b5970fbd219d5cf74ec2291b8381181391b4 MD = b2564bbb159c3aeadbae0e4a4437f7c5111020e9ad0f4eb508147a961ac22a01e1a26df046b14ee5e8a49d9ed22b8cd1 Len = 272 Msg = 873ba7f8b71517ec50297b21cf94cdb7a58abbb8829206f0d3f328ff8a6939ac1d1d MD = 7405fdd557d2b5d4f65e9e85f508d3791495f1820d37cabfc8dbb74d7b41df8613d995c612d378dd88337e00951d0280 Len = 280 Msg = e3bd4bc3a60cddd26c20aa86364bd44f4a07f3302825ad0ac127881de4eafbccf988cb MD = 199d5423a0e26438f4cea0081a89e0b6c84ca93f7c3120c8104b51c6edc04e0f6a203bb77d59973a7411a0efbe93a09d Len = 288 Msg = 8716e4b86deff9da2a8ed55baa43582a7586ec9cd38ac3a933156158cd8e5b7887585e91 MD = 0d2306d9c0a8ce57bc7869b439376c07ce352a41d86ab6cf4a5654cccd5c724fe1b62b2c1101c986222f5264ab3fdd66 Len = 296 Msg = f8a503aaa25ef2cea25e31930c3a90db468cd3a862f4a93aab5de2777e82dc905cb03ee23c MD = 773ee958fe93dfd1b73af24d27ddce33144a9249d5a671682a56df30d0bbf92b9327130022075185d396de752959304f Len = 304 Msg = 669025175ea917cdd7a71ff4ec0c45bf1246d2a6f031c00b71de701e17939bfe92128b21911e MD = 9ff6be3f02c7c5d0206f4b944c0843cb68bea8f9b7c8cc0b729503db5005c7cd5cb14e3457d8f5eabf733fca9084f16b Len = 312 Msg = b35fb2262edfa14938a0fba03eb2a25d377974b11f556491a781d0ba2b3c0ff3e42749925fef8b MD = 835b05a4bf00c2594c3c8c13da6c273a0d9efdea0da72b71b19d326bf5ce968c2e577a7d99fc0f985afd23b46423129d Len = 320 Msg = 9d86b45df8d7dae0cf6b0bc208666ee1163a39e6116d6d240c9dc1c3a3c1db1dd3b1c6680fe9a196 MD = a84c469c24696f81d7df4ee8cd76aa584f8c9960eaa9908d3e3ebc5eea7d0b50afdded39deb94fd59323a21a6539e93f Len = 328 Msg = 414f5619f6dfd45853bbabd224cc305d77350ad253358910a74f3a4381a9b86680b3c4068c089849c4 MD = 848d481e3bbf5dd726f625cf6a444d995b36262c9f80d583b77accf1707e3f49bb3dc480a560694d769aa1ce65d69428 Len = 336 Msg = e2658324821ae7b0faa0cdd63ee9efb9fcbe82092d04696feb3da92c82521dfdc98f6b41b3ef365d219a MD = 3ea5d0799f1a4dcab9149a40ab74bec9c8d76d8e392c1e63e080ddec2ec535f80be9f00927be281ec97ac0c882bb0bbf Len = 344 Msg = 7e80271bb5f2cc7ddae4158658e4e8d06e04a39385da0ecac1cb8e91d68a9bd21ddb7320e79d10e3110758 MD = fa00bc0359a642dcb3559656094eb2fd4f63bc57f0d34abff26df5c54cc63dbeb4eac75905296e7fb69f871e134083f6 Len = 352 Msg = 43d2828e86f7856b78c66cfa3d602387c290975afd021a8b76af0918069cac35dec45de3cc52edc4ba14432e MD = 6c9e367e066032ce47ba2575565932002cc786f533c5551656abfe7391e7dcb5f9d9e047adace23d32f8acedfd0cafc5 Len = 360 Msg = 3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f MD = 2b301a14647a67429cc3e7da02c4093a739640f7b47a305251d2855e75e09e60e262b279a073077d1fb6d0f04788f2b8 Len = 368 Msg = 31aac06a59b74bf478617c1637fa6c5593df168b8d58b1e923bf3e3d80e55d7170b16454160ab29ee1f7412ebc05 MD = ddd245c9b29ceac60506fb6bd6e8037889cb73d6ecc669fd129060a8a8f58971ac572d3ec9b44404f81381d0fd35a649 Len = 376 Msg = c10b2852054d8034e07906c7fce3ce99402321a648bb881f13fb276afc224c6aecc64800cd767ed2429db94b95a9c3 MD = a44640fb4ce6dfd4a10290a0aecdb453054a9b54f2583e97bb7dc2b005e5fa2b4fda17b1f75902f51c18c0caad35833c Len = 384 Msg = b1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb MD = 38742d18bfa6e918b888d68d1034e61f65dec0759172c2dbf08cf1e132b217eaf4ec29e15db7f4b07e08a70cc5662012 Len = 392 Msg = 790dbba09965c9774dd60a32e010c50d6d518968a220141dc33e7410f2da6c08ad0419bd9864d5327d2c5c44914b2e83f9 MD = 9174958bc8f4ed4731eced999bea2f63032f52bc8c46bcd903232f3fbc5046f0d6c203d43a078b822fc05101404f2635 Len = 400 Msg = f7b577f1396b23c27eb637e53d3d92460270b001cc612fd3b4d68bcdd09c2d50571ea4350636324cc2428a087e7bd8785f82 MD = 80afe111e44ad9aff9e39c4cf9e6b4c520072b4550e62b1740160a04f8d530612dc098917a556b44977d0e73df518bee Len = 408 Msg = 7370d9b453936955b9c9d336f4b283237986232de007bf412fb426ff5b4093c80c428c19a12e0b187484dc6d5f4746537fb1ed MD = 6cd29159820d34e5706dd867e6363758d312660d4daca8d2abf677f234746e97a0a6224eb054066a0b74e18c70965368 Len = 416 Msg = e8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce MD = 29c408a6a5045f397b56dfb5292c7c16028c63f068e699b86a891ff8501208ec9398dbaf463c00f39af7b2cbe45bac15 Len = 424 Msg = 75d4216bad77943bfe82be216157843b0da0fd16eeee847153a00b43e707b2ffe2c898168081f0bdb3af58f214cf67b920c385aca1 MD = 0170357385a20865a8d30c2df39406903ff88c7f70fa1a7a5aaa86711d64046c432a1b139668ae5abed637d1dc4107b7 Len = 432 Msg = 2fa90c2210e3096caed122b74eb9559977120e5d9a97eeb3f99bcba6c19cf8cf791ac6c8a0a94ae49246611dace7f24eb05673a36b3e MD = 6c2ced3fae94dbd92f4170b63f1ff6fcd8194f60937b22b4f3c95fc9e104b77148f9bc6c16a890de86d9ef1554c96fa0 Len = 440 Msg = a8de55170c6dc0d80de32f508bf49b7046aeea4b975a511b5ea3dc853bfa4b1e0138202d6785f6b3017914a86f824288d586dc0e8bc924 MD = 2bc3b10c148200f7919b57afe1d7db773ffd235e04fec6897dd94f13ad9c437ef50900a40937f82a39daf2aa2b3dfd68 Len = 448 Msg = accd9d05fb7ef3043470836137554af117440b3ccca7a280285494f90dfaea60dcbf40b230271932cd3875b1d3dca60d38865ff874180efa MD = b9e02df93e9254180d6a15288d77088b5a5ce517644109b4e2532be315f08dee43491608a1127dcdf69397406e23d231 Len = 456 Msg = 32b835c180cc4006c11a61c65b03c099510e1d4f0a94b63d54bd6bd5a8ab207ab0f4639206564edc3fa6af03280a67744f68106dc51ee35723 MD = df97a1c5dda6f9dde749f213e429db84f0dcd481d43bf58e6142968d629ecf05b262830a7dac87f67f4383975f3e821d Len = 464 Msg = 9409f9efadbf190b253367629f8f368c9d5ac262e94ab86f3559f9a1fe1a9b44b64e313121b34d43001c430bedc62fc586ea398acd8f17c7cfa2 MD = e1a69388ee6b6d234108ec29402cd0afd74957d990c7bdb544cf11e8eb2ccd170b6b5a74431be70364d7a31b926ff53c Len = 472 Msg = 289586baf8daced50db14c936529a0a6438eb5da8d3d469172b6a06f4ff3a956d4f9219563ac285cb8e70074cfcc152c02593a97733c36f4a9e97f MD = 509e996c1e11611c243021b8b78f2ad90c5a9263bbf35910db7c8ec102aa7c518066fff8ce88562fec2cd6dfe04056ae Len = 480 Msg = 156530cd6ed3baf1fd7232c7ff204f3c7d4d106016afa3bdff3786e84843ec556115626fdc84b2e874f1074e4f7d53e08079ee9fd01f80a8be7f20c0 MD = 7b8a598029ca0ed475a72c0644ac81c63d72fd51305dada07b0ab4a29e47422f59e12643179269ca3d7d10446b372b2c Len = 488 Msg = 30655a6b5a5965db992e7248d24141055e988d726abb8e729dc5c21ffcbaedbc0b1b5fea35b8751f6ec6625517312fff2234014176269b60959723787c MD = cfaf443e95deeb3cc1910771a2c0692a54b18b3633dc5414e71ae08877f0804818f67f7196c52e26b762dd12bb7a86ca Len = 496 Msg = 345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e973f8fbb0ff55104c46f5db3 MD = bfb1d5ee3a0b629058ecc521c706c2f9241c48cda3dcfdba660a2601d832a7a872a2bb840f3b98d21c37e28f9041a5b2 Len = 504 Msg = 0b94a0f43a92408963a59ded01a9338283a6ff1bfbacd9051a0104445c7f041e8037afde3b5a87d22d5a4796144cbc944091d6cc47b5ffd1f997ab1496ca31 MD = 07a045c9590e9901d0598e604c4649554a823de996fa438cc81a634344eeb98e5f3c0c234ba30e2285a4d7ab568f2610 Len = 512 Msg = 93035d3a13ae1b06dd033e764aca0124961da79c366c6c756bc4bcc11850a3a8d120854f34290fff7c8d6d83531dbdd1e81cc4ed4246e00bd4113ef451334daa MD = 8d46cc84b6c2deb206aa5c861798798751a26ee74b1daf3a557c41aebd65adc027559f7cd92b255b374c83bd55568b45 Len = 520 Msg = bfb94dfbe0d9a509b78d164a722050054dad91c9a8e260545d037eb450321aac48ed4459fdd8a41572bd6c9c84d18b6ec339247482cc3ee52a1bbd6bd4ae918216 MD = 13af0be02986ea3176e8c65534ec9f32c23b53c93a73b15c26b9ecbd8a1181ae184a372e9f5e0596cd6606849aeae8e0 Len = 528 Msg = 1c8924a16fa7c602aff5ee961798bd44fe53798bf44c3d6b0d13ef837de07377651c1e94ed236eb79349f86ac31ba151a7e711c5407e65beb63824f6ec39754b58f3 MD = 5be6482851ddafde582f2804071a702ae39bacb688741b7c37bbae99821ce4d3f47d5b097fd8eefa0ef9248a34f5d3ce Len = 536 Msg = 184215145da49db417e8bdd573d6282de073e674c3dea86b6c78591d4947f5655a9d9eb0e5f4ed046b1d8642da9aefa80448a299504160a1b000c9b4d3c62ab69b3d96 MD = 8995cd7fc0956e124075440686beece17a6256b282e7988a0c998f790e3995c974383179893477bcc32d1f114129b496 Len = 544 Msg = ca7a63adf41f4da33142910c967706b5c8a093350eb3e6d3aabe69a46a2872f47a39bbe77cdc1160daa450225b0e8e36f506978ce3ac9ae5f75721ef30da46b28f07242c MD = b89cc12b11e3afa58908580c47b25407abbf584f8e8d4b5631e9f450464c7e53cfd7e9f9d3cf35e587a6f02957ce4c28 Len = 552 Msg = 1da41a0af202b079521deb6109e312c2ade48544d2b498c07e91a102dd4650ce354f3f201b3ecab8e85e21d667959b43d08f4e90fa18dca2ccca8f6ff5e9a902dc8bf5c5da MD = 5c297e20c307aab7f325939fd4e2883b034fd547f1dd17fb6b97ade8b148e06ebbf3ff60cbf469e4933d5f48f0166cb7 Len = 560 Msg = dece42c8849be40c78b8de6da96c2a8d7e940545b9f3f39aa1ca03ec60a85471aa84d8e29f095874f331b90a4c157da9eb048d2c8fd235399672707366c766f10bb833f02183 MD = bb509e33e9ffcc4c01233146226ee9364cdac5658132460a76edf617a035b197c86434ee889438581458102618769382 Len = 568 Msg = 952008ebdedd480449bb96a025576c5f617bbb8307958a010767e0d736ffe5a196ea4467d8a5d3ba1f5476ff07b6410ae659dcef520a2c14e3902f8b399a289f41f5fdadb502dd MD = 9b63d9145bc714a8253dcdb8341b2f5714eb58b9d4b22ce45aae07f51297a3dc9c5b691a8a3cd438dc5bd18be400af21 Len = 576 Msg = 100132c315bfc9c4fb93023f5d3500d7208a68acb4d2c63096232c361a161c4c67c0a74bc3e4d72c11664b1d970321d405401924b3a0f6ce2b1a2899e7caa9a55ce725fc37f55d6a MD = b6ca04467ed3e623dba36f2e0248cefbe134cf555fdc14731175eaaf08e244ab0b15fca2f173a0ec98feaf359fb84a11 Len = 584 Msg = 99cba4019f5478789e674e08fe5d6ceadd698b0757ca39c605457c22c3d3b8ffb797d2be8f12960f099a5606b908d47207b2636a779948282de3661bb08b1b37ee576590800a492730 MD = e5378c7c251ae96f0359a30b3134fd77d61d0db68c42a1a2aac293195a596df42f677e6cb98abec90d6722baac63fc86 Len = 592 Msg = bb327a0bcb2574df47080e8c0d8a45ee1c0424ae0414dc0a9b8717d9f27d8ac987c7c9ecbc946073884d1fb96dbdb583aa758186b16fa429dbf15b8d5bb48cca71469e7ce0ad8e7fa14d MD = 0f75e65ff8494ae28d9a0a2e65959653275fc34b2fa27b9e10faafff07c45addef3b8f25953d5a2e54e31ebe6d429d26 Len = 600 Msg = 7fd9eeb5ff368040d299fd17a943b21d65deb2eccf6128d18a33eb174693538935374c32c333a867821dba08636f20022c2ce01826c7b7e41640ad186f90ed0ac647d47086744867e5c54b MD = 007251a2a577add048b1edc79d96c7df8fd5b5fa0d7264f122e4cb54c50bc316a8bc5f4f9dfd4469e29e9b030f563a6d Len = 608 Msg = 7ca9e369e82186984d5fc729e111a7e5d8ec19c5d74e13b5ab22e4993b05c88ebba6ba72237389a6e0722e12c96c5d6a54515ab00ad80efb38665a76e831abab0fa5cf020807078441585de5 MD = 3ee8c4184de9ceaecd0d3aea16271835f3d45c873358c93a515539c38e819414ea63b08d0a109346793d5e0f703125eb Len = 616 Msg = 5b4d945d55dea22e37821ec396476a4bfb617d2f392ad93afe67bcfda9cd9b725bc4ccdf516a83fd71dbff5a22b005fc61c58e471240bd2193ce13539730e63232f70f80308be48dab7266a1dd MD = df82d242e4cdc2eb40bf3db6a56e1aa0a66e553f1914bedc65c8cc6ad9564b6e85df59f4c443cbe4e0aee05986f7d690 Len = 624 Msg = e865f4a42bbbd0b73fe275b8ab90d3a9fb74ec5070192d38f60efef9564498b9adb716f31d50cf77c20ae4b2e85515307bb8d95fbeb9ad964001ac550dbc60cf213fd8a522edfaf54e5b1b93b2b2 MD = 091fa9ae2184e2268ef9ef23c7c809efad244536e00aa9e8b3a6c228d90e31da051b40f268a13bd6f62e69c91ae8cd2d Len = 632 Msg = 1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176 MD = 7e23472c03431925f3b4559d886e8d5d837b3d39b8efe1b7a91e61a13810c4dbc2439634d7c6ababfc66e9b18e6541db Len = 640 Msg = 54ae030a4e27a05c1ea4a12e69c67544af9b4044cf157dc8cebbe8b2d49f9bc0779077603c90c5c55b891d3ac33b87b65e79e1b19695813718191b3bd8b7e42d5583f7cf1e60f84495b8f869f3719969 MD = cb65f823585773cb8802b6339182f13752a82864c898b445be5a11a969657ac2dc4a3bbeb87ac0abb232a2b124171096 Len = 648 Msg = f73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72d MD = f665c4d17a83d65a7ff16bfce279b58558250d76af68b8eb943753e411a57ceb31c1a131e54bcb7672584416e3d5719e Len = 656 Msg = 1d259612e6867e7d788c71d03c5136864ad6d84f24eaf913a34e69333116f812395288d4dcee6665e6d7dabd005ffc6327e3ca305cab78569d1107a115e619fc90110436317925066726774d1da3639c31a6 MD = 5dcf512e2b93d6ecdf7c3304534554ea79d22392e59bbe90df21e978c9fa3b34ff82e6dcfe8fe2236aa4af4e662e2a9d Len = 664 Msg = da8734414c45fc1d5a75a3cbacadb1bfb523d6fc391f882d0db0eef21f9ffd78b6a1e14cfad09e71b65cf7b05d7e8f2f4bae4e454e16068d65465639c729cfa92738563d37edc9676b7be604ffbc68ec3b6b72 MD = 8b328a31adf67dc7aeb864a359628410d5814a2f0cc683303f61432ce32177e1f538feead7e5000343916c7042f8b3cd Len = 672 Msg = b228c75903d80fbc6d1cf629ff1d14a92ec4bf0e121fd97bd306ed265efe7a5d5c5d8fc764af98ed6f5978f88d7cd8bcd71cbef6a58261d201de3cb15b3161287e6a104cc2cf882d839f1da0d3f68b426cf08ab9 MD = fc92ba4eac9a1bf120a7b6c2cc30335b9615b1a98e55d14854ff872966e71040737401c6bc08db5842ceace14cb7e7ea Len = 680 Msg = c90d473a6fd30be9a98bf442a9ad65a697d4629c33cd517dbbed02710fa8ee991360bc8e557b0a0bf0b869e6b0c3a9457607580edec3859f2060c9c0340289d53a5d755918ca54876599045a86a9bcb8163795ea8c MD = 807582b2520e990cfb74367343268b9148b2519b9e7cd9182edb3db9ae7afebedfe8ca118130e2ef9d31af9081da8222 Len = 688 Msg = 6df8c5c28d1728975a0b766cd7de63bbe7f48c3db3e6fd5a4b8df6e3905cef0351f3d973b4f2a7eed80b0de5b85c877353fb9e930ad2679149ad4cbe69910e68d5500b096c5abdbf27d684fcfcf1a57f02769283d5a0 MD = 7bda57d21a4434aada6758e282e612a4c0f41b242f9c790804d5bee25b81a821dc6f2a0ba56f1b3704802c9a6e153d85 Len = 696 Msg = 2cfc76f88cb6fb90927b69526ad5f03d6bd335f4f75b52b6a3c21e8f989ab0d03acb1ebe07e68a87c1b5607acf17d976e10ac4a3d30a8561d49a5e7ec720edace9f5f632b4bd63e104f4894a79caad2e1c31c736453485 MD = e16670ea837c259e418d3c0e1eaad4948c3457e15b1573056e24da25bff5c66b7e95d24c6bc1b8d6c2b812f64adc9553 Len = 704 Msg = 3f05108c2f33d39b3aa9e73efbad4b011b4e9e9fba409b7611e7e03956b2f3e5e0aa86f68c4bfada5f9223a66d574b08f9dd797cdda8f3c32d8e01921711f4870dec676027ecc56fc2010b496e95cfbf071c820f21edf25b MD = b272bab680f3ab27de72d94df384323f8555f1d17facd2588ac8648def2451f82f9b99c05ead8316fd181a2cfb97483a Len = 712 Msg = 1ffbe1aff0a1e7fa3e68be31a74612a1519b59397e7007ef61fc015f316d55b57be528cebcc2f09a2f22e3c5e4a6ae9612776b17ae87cd763c1a9eabe6846c5bcb347ffc99f10e3b5e64b29a9bd71a5e9b3c01a802715de2a9 MD = f08bda9d6762607519d53fecb0bffbfd3ff2924854833a759d631e910c42ca86741fc2e290af42e94b94898609b91390 Len = 720 Msg = f755d6b5642378f2847893901d9aa91c54a4b7abb97c5c7184063e8f1e97aa2de4ad7ac927dd3cce770c906921e2d298f67cf9844e61bf104db803b265b86b821c5f4d901067d07b38764e3f6c95fd4f28e3cfe48d8a9694a8f3 MD = f85e98ea054455242280854e97c4ed399b85ee7bc5c5fc3d62910a76f3a9600c3d904c832b70b58d7d998db8dc978135 Len = 728 Msg = 773577f3a642c4f13b1cb1f4103e9f6b2da86268a52f449cbb174c8349e3c0dc636ce85c373115a337eee26f7b70ba1060a79a1c76fd186399e6a5255db80f83b0be4a34ba876f7908840553ead380f3195507729d067ac2ee8eb4 MD = cc27869cd7e63695d19082446b068b77dde4e8604f8c0e9ce20a1b71aa9eff1460f32d5a54476275bdee8e7621491f46 Len = 736 Msg = 651589927e17e1aef780690f3100a377f0179b18b31fd5b4418c84038573fc559b496a782beec3dcf6e9faf5aef676e10bbec34b1be5888fda49b91e02890d2524c5b369f8a54175f29dedf8156fff690cf186ec77104a798315033b MD = da846042fb908eee5f5defd1055ff3e57103708278d379a8681f58bedc6ef89670b9f957c4e0edcaa42dfd8cd49df6ea Len = 744 Msg = 678652600eee42580f73623412e9c011cc02dec4d4cc1b79b27b6f9939695bf2185b2012ab0630f317d2e2de95dd69890e430783e99d7ed121c7c8da9ae70780b5aabf9022d1435cf5ed6da6fc6692c050c2b5f22b24fb1cf9135f9cb2 MD = 8a6ae41c9bccc16eac4860bd5fa91205a86fbfd09692578f7f36b3c135d96f9e9001c192dbeda975f7375bd43a23ba68 Len = 752 Msg = 416d3fb7b401fa5e78cd96d479d8860df147eef03adf13fce1c61131fb89cc2ebc63289745bd7db9bef14571a55318496572dbe52b9b349ef59f406cecd68909f364325380bb75f3aa62503c84f47a55aa6b9c9b199ebe414409ff3964cd MD = c5f20542e0c0ac1eb433de6229fe5baccfd4502e2c2275439385efda6374a1d0fc50cd9bba4233d470ad91a3356ea315 Len = 760 Msg = 6f09e876c0b83c9934ffb777f006338c5142a31375e9b21cfea9a7de12998c4ea6708ff1fdf5a8ee6bb67c675ffd8209a10064e2d758a8734eb48f07f7cf3d43b09f1bfdc5d07a52b77079f23cec28bf863bed97c859276df7f7129fce71eb MD = b3c968f3025f87dbd5cd3d364bf673e62827c35889532431becd87cfbe2cc75b7ef45696d19cd3452d0e7c2b69d09544 Len = 768 Msg = 0dc2b226b3431c69a76addc018fcbda22bd72c8ff01ed6549596798bd950f361c489a09c95cee2dcfd6401208ae6368d6630026b417cc4718ccb8b42e8872937de66895fd09142c42f066bf0ef3ab2b03803a8185fb65fc7148c376ddd4bf58a MD = aa645a4f8f602411260ace24d381f3f5dff0000c246343eb528e3dd027cd743815737906ac5c74ea83c2755e56b99509 Len = 776 Msg = 8dc71c84c8772753c86ab6afd80e8d1df9b0d7e8d69ebe67fa883a82412c26738c3399cab95573b4d3c4367c85c81852d5a6564c0fc7caaafe16c05e62aa06cc9fa542ceb35c88fb6ab82c29d5dcd530f807d3f1c3bcb3974421101d1aa6ac112d MD = 12239813097124e6248e7dbec985a6a25f622b1d07295cfcfbaff33b847df7fd94265e439fa535f3becbdb576922ac41 Len = 784 Msg = 3df3edd9fc93be9960b5a632e2847b30b10187c8f83de5b45fcb2e3ed475569a8b2ed0784348f9dacce7b323c6b65071abd8b32d1022b1e12787bd4989d3c5ac329d576ccd7608dd336716532e9b4c7f825826fb2e343623ef85c6270619bf5e3b27 MD = f36590f5211a9cf84eeb0a3b2e5dc1164e813191cda7cb883f3f4a074605ce6780cf2f1a105658706fbd2829db8a2a58 Len = 792 Msg = ced0ec6500cb891e6433d104ba5b1c1ebca397f3a5eeeaa0f0561729621ea50d4ae7ff1d0827178dccd84e4ca06d9891a90adbb7a9f4994ac947cf6296e71d2f49b826d64b123a7bf86f339fa4679caddbdf19cfed7d0206aa5f527a6b0cc00f52aa2b MD = c2c2d7d65d0b9108648e3233d15fc4e4cb62ed8fee9cdd18ab44b8486e2100fbe45ddcf74f46c15eb77fb1c893c12202 Len = 800 Msg = afa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcb MD = cf6ef91d8567414f5c7f0b1f4ad09a976afc7c8327a382fca90f5a136b19be33100a664390a377f8d8a3015fb882125b Len = 808 Msg = 00f65a485bfd381113d6e79bf9e0d5e518c891988c073ba198ac3a20f25c2c81619723e88a3c0ed3075075fbbafb6a7b61d3bc336a5e6d6f08d166c4861e6a3bdc2e49b2806b567e7e821a55cb674a6cd699f7dc61a7054a8ff3dec73eb667f59644346be2 MD = 809c6b5d41da7cd10df90b02b193ac7d40cf2e46c139e9dbd208a988da2b25002cdbad1db2ecc1322da20b7d054e5fe6 Len = 816 Msg = b9ce382e1e82a873cc444248a3008c2cf64d18759057abe8f91c9d87f5dc83aa4eca0c51d30829b9a1d2712da1fac31f52942d77c9f20c2bf6d3751028d7d4f0d336d3dc92b27ec368caa4444b3180c1e37e98b58f25e647a9a6361f0b04cf78d17955766168 MD = 18cd10b3ea907b3770e8eb91c974666e2da2525afe7020b872b3ec6689e5e1cd0059dd4fd49ce44d75dc4c8430c322d6 Len = 824 Msg = 6778d82f3a98eecdfac55ddeebc52476a070094fbd65831801fdd60f837d80d23b90d472c5f4e5ca6273a50f40154ea8fb94013f6310ad18800433a1d379c84bdf799a99e8c7b676fbcd29cc2ed66552297de7a6e565179bb42b70d48299e0925a1d72ca2c792a MD = 71f08d9333df5cb885fd23d6cbb1db84f9b55908d069df50fa4795cc713a18439bcab8daca078356f5c75a619f2f8782 Len = 832 Msg = ba3a54a77d7c2b8ccec6d53136cd48827c87acdd1cd86ad1f56e862642ea2e1dcb4093f85d60f7bd77160738462e6c3fd3dd9d3a7c5cf7e2a1d60f489f84471902179f21f656ce0fff089278ea14441e04e7af71891622565f44c428044728fcc686212a32a5d809 MD = 3cc154f0542d8e3cacf9d79f231416816178a7ef2275fb257a48a2f763ffa2e15a33c27b970a416a057925aa0412d268 Len = 840 Msg = 7eec4f4f491b4eeaeb1cdbdb95e9511c2872372bf64a1f61cda1cd8032729c8beafd1edabf78036d80023c814ad8606106cb4e7f33f214c3e69c0f230e885474fd594f7f2444aa581e0c70ebf13073d89063eb81a43c5f608b2fc99fa1bcf5e2bfe62a6802e70c52ce MD = 2f8c5682a07438043e55f0b7759fe7eea5d9bdfc8b0f89800ebcf777bc05a941ea7f3cac45d4659de0f505d814590b6b Len = 848 Msg = f3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665 MD = 04e7d55b0eb4bc3d3a21cfd2941dbb4dc44706588967186b40da54902aeea97b262c97f75e37ebe3cd60a804e7b9feca Len = 856 Msg = dfd7d792e162bf7a889109550a0fc4c415232af0c0d72dcbc2595299e1a1c2aeae549f7970e994c15e0ab02f113d740d38c32a4d8ec079cd099d37d954ab7ef2800902cdf7c7a19fb14b3c98aaf4c6ad93fe9a9bc7a61229828e55ad4d6270d1bdbca9975d450f9be91e56 MD = 08e5ef57d0c2aa23edfc75cfae39e6bc1a43b5db08b2e27bc9823114edf760367db9cf3cd9c3779755f6d39e219b7079 Len = 864 Msg = ffbc7c47f52e69f5c667f4ed578b46ff4592048f789081f3fb39321d0aa4627a6d4f261905649410a53a301c231fa787ae55c04f615a8f84196cecf2844d23007b44edd892649fc8ed10a2e855bf23fe8afd0b9edbb33296f5a7cf89f94634d9d1a2b8cac3b7f4e546f2329b MD = be10c7baf94608408a0accfbc8ce95e159d08d8ca75dd6c273f935947a7ec3463e10a58d3ceaa0b2198b0887a3a24a29 Len = 872 Msg = a39f202d866e8e96765fbb53b6772537dec043322f4a7475247036d7495c987850cef2a46218d3fab36e3bcd595c0aca5e98b9db14fa484ca8c9772dfa3839f7ac3066727a50b0d5c933d82f82f1220720e8063f08bc283f199c8a4f85c70043df4fe55e751d0d71df36fa43d8 MD = 3b2664ccb555a1b1f3ec996860146ea75ef7f3bd62028a19c26f63339399f4275a07f3c064d34766ebe8e4dd532f6629 Len = 880 Msg = b2c8261853e2218dfa135cb5387810352b8962e94e9fdc8695b41e7dba6ad122d14fdd0d2360dcc039ccce8b37fa0ead6ccc85bc26261d47cbaa78b925c6e380fef1856fed31dc616fe16b2039b1ac85cdee4ce04c0497998b41321868db08e35f358606585e0bb8c3da9a3be7a6 MD = 45b286f49fd05c45c921b7bfdbe2cb024441c372e07394dcccae0de834cd541f13a79dbb3e5078896e88438542bd2f12 Len = 888 Msg = a04f390a9cc2effad05db80d9076a8d4b6cc8bba97b27b423670b290b8e69c2b187230011c1481ac88d090f39154659494db5e410851c6e8b2b8a93717cae76037e0881978124fe7e1a0929d8891491f4e99646cc94062dc82411fa66130eda46560e75b98048236439465125e737b MD = e7089d72945cef851e689b4409cfb63d135f0b5cdfb0dac6c3a292dd70371ab4b79da1997d7992906ac7213502662920 Len = 896 Msg = f419494c3c6d0727b3395a483a2167182a7252f4fd099c2d4b71b053f94bb8b3adf3b51e8460cfec084ce9415c95798fbae4975c208c544645b54c44d2b97f2ecfce5c805be61f5ba1d35dcc07afdd51a87baa990506668cf710e18be9b0ebf943f366fa29c69f7a6616de72a3353b66 MD = aead8688c58c6ba4e9cadb4756b465dce0fb06f1cfaa478197f2ea89414e47e9572034adfed160703c79b82b3fd7ab78 Len = 904 Msg = aaf7584d53006cbf2d2040e51b7feebd2bbf1e9f6d817cd8062a6a9680e7f10464eefeb50b07cb46b14b9b3fcb2caa3b9ab664490115d5919456613bf172b58c5388fd52646a5783535b88212717ef605314b70b8a085024d4ab1fcbe2be74609e4cbdec0730fabd3cd77151d647a3767b MD = e6e79d8c61d0ea9fc70dd4dec1fa432849c3396e717b170badbd87a4c7974efc590ab8c1183a6232beff14534f004b02 Len = 912 Msg = a467f77369730201f2812204fd63ad0d2757be580d937dfeb221a06b21ed3213531d936152a0c1f09f0ad5fed19fd11e80ad982c61203e86b2508279d91d99fa483e2e97a3d6a6ad2548a8da404dddb58344f4bdc1c9ea907088885e4f532d9c4c73cdfda43c3a9e4ce5a2809096593cfac1 MD = 5a7508c2cc096bf65a4d4d337aea22008edb9a3bae869f94e09fb526a52c3368e9b28576fb950f078b7e43b5562120e6 Len = 920 Msg = 01abc90e9180fc9bb8ea67a405073ed6848bf33048076566476c55836bcb19d3e55e9400c5cc657bc7a95f1d703c390f5a8687e7cd7fe9138ea3837bfcadad6258a3eb8d65121fa8319bfde532aec0e694961bddd2b673f284124be5781100f40381b6ff99db92ea9cc82a4372e53924dac398 MD = 96b209d7cb2c2033b38350744767fa5c253e1bfdb99fe8418bff83804df02248140fe3b77b0bfd4a79b51f70405a434b Len = 928 Msg = b555d99056362bfc2bac2a1bbb71ba112d644e50b82b015e5a1ce3d9cd5e90b8b74b08d32119baa62abae251fc0015e400051ada4ecafce3681e5de727c20d47f5cadc663d46ac682022ca396a4b7ed1c413e0b72bd7eec4a0dfdc2a2185abb5d99afd50940528ca75ad89daeb9a1b61e15747f0 MD = abd39f79d72c6cd2e8e130f3603032fe3cef4177c3563930096df1f10b87e79cd4e2059cf1b9f8252184bb26f659a5da Len = 936 Msg = 14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db395d06ae7ffbd67ec41452009550dfc1878eec0df2eeab09e8665f7e59f9148a86b2bc695b36521a55b2302f2e869aac83f14d6feafc9e587322c3c44f052ea1c0578884f84f56307bc6dde31ba48118a0f62b6fd MD = fc9b9a95a8ce1c157720cb63101a7594df24f4cc74baf735b0ccf6abb925478ad507cd048d30cde1c788806f43ed3a81 Len = 944 Msg = 11ae0cbfee7bb3df90ce585f09b9cf8ff5bea69a68eeb6c22553f8ed118c9a61e7b752cc2c94f38766e63e1b891dfa05b23347b617d42fde3ec17eea6e76d3cb640bf8fa46586fb9dd5c4d9bfee04c4649571b781709f848ad7081afb6e2c746f071a551251050fd5df72ee65248ecdc24f2cbe74ed5 MD = 3214b5feec925059149fa852e3ae285a6eb377df926504e2f824572a3aebd2050a20144e7bede7e7fe238ee83e69f72c Len = 952 Msg = a5c4a47a04f4714269d5d922ba4694060aa2df49193720c819fac93bb8787ec55a107ac9a6602f0045fd2cc8e66744bf863ced91eeabe60e7d2c1d80276ecf3bbe91f1757096cf589214f3569c2c48bd74be7f8befddb28395814780a47c180a58b0d0276a7e9873d682f473e27de7275c925ede23b6cc MD = 6bd9e1303579d815f58e8c6c9855850133251778a632f7b312c4b3163b29b5ef6cb9511a08a31a237d9a7604afbfa056 Len = 960 Msg = 75264774af69ec7ee3125e205bd6d1cb8fdb22f7ea6dbe72d1f2c0f7e2205902796d75e379c79b11498615c21c9f52b8761a885eecc69d132b2b48c63bc074c3055ee5cc13f51d6c987e8188b030b837e8f754d40122b451f15b28cd2bdd576920e1de5806593a36d8e1e89b9ef3caefee5acd80b3e9c9d1 MD = ffa9e4e856d06227c1ccb959be558309cc10633173f4b66ceb382923b52b9150acfb08a7393500477a6ee4425a827e76 Len = 968 Msg = 791a36d748695e62db5003a8ad367df1f051c1ac6a21d711823e8e069b546e3fa06ceeaae06de70a1de249e1dffd0d940edc6acac00c4c15504c02d4b0933658005423455f00023b01cdc5b681b6083379c24595518a47c654f5e1a10947df10c05a3d716b2a973faf98e1ee3b675816598bb8d4c2a3b06eb7 MD = f8d33369680524ed6c6a716d4c502de3eac891f340f40e82e37501be1a90fb61d26e5daafe92bc6ef5ec0ae431168842 Len = 976 Msg = 74cd86bbed14d895301d8a54b2956b1c5cd1451eebab620b978d4ecef2cbdf7a14367381f5ee79281a773337740fb9f5853f4253c4b19f684341081d8f561b2ad773224151099588da90e04dddd565f67596c536d64c5b87e9480ad43601397507ad1b61ca0e349fb88f19feb48f770676fd562ee8259f50d0c9 MD = 73ee8d29c30821dcdfa4441639f037fb6ba3a9ca596dc43428043785756608f6207d80b7f78e573174fb9dfd42f0b8cd Len = 984 Msg = 46612e1a4d016c41700a3b5ccb38323353bd8da5b9942c9c9212df40b4bee06be362a15dad62c8b2924d789168b2d325fe35bd5100e1e29f1ac0fa7a60a94c9eee5a70cccbc75ac214b1946a5679cb523b378d5c690751b7a7a3b80d413712feae7024ce71d6295a3d5d16515c3622a052eb862ebdab81ca7fe3a0 MD = cac13a3784225be03d526f9abc1eb50a762e72c0e01172a15d578801089e5c9f26e53cc00ff755909453e2964d7df838 Len = 992 Msg = 1a857c1f105d068ceab0b1e12494890ec196362a48b0200a0d75d712b18fb14bec6bb5b68a33b7e0b4fdc5b77142c29c6d9151b9f884f59551f476e5256986a653d4a468f28141ed954721f2cd02054df0438738194545ed70234173ac4988b7d62812de4f2feada14f68e3b41bc9948d4139f4fb4da5939f26c0261 MD = b75d92b5cd3772846f7b68064a3567ae43e5010099f2b649f35087e7592aeec176646fc8c2629288944261cd35b5fcba Len = 1000 Msg = 9d36818d0c5a008be7904d1917aa3eccb5ef4f38cecb8c4e63c4b2e9b4b091a3bf25b4ed0332445f894c2a4c258b749afa17fad03cdd41713a869f899ba9a085e73fa9474a58db7a950d3a2386b60f79495d8bf73e72acaffdbf65e1989ff9cc206ba8c46a368d8512bac7c7c191d713aca949d45df297b1b6594a1a33 MD = a88da844579f3e3725d00daa8e1e287da4bfbb2d931ebe8d3b16021154be503341d6371d382ada744f86f5bbb56cdcfa Len = 1008 Msg = 4ae50ed626ee60dc5ea556e3ce0d3c18b9e6225b5620814e8b9621acf8f939dd370ad9c7620d85e6d67a229f37f517d1b580acae8df0b5c9d29d756f6d5ebd3b63b554e556469b5b4f8e7113bad1559fb254ca827fcd00425d18b0be7f2b48c2544c48d90982ec624f490be65e893fa93ac9467f35a0a8e1b56d9a403748 MD = f8cd943f429333c7c8d30a8576827f92c92ae18e0dbcae770601b79687bccf8c23e9e589dfeb45c3b9bcafdd545e45e7 Len = 1016 Msg = dbed7612448d46cbe0a384d1c93233f02ffd1c984ba765299518656d3723b766c1658d4b1e7047cdc729459e366ef9349efc40cbd990f2a9a24db7a5045e1dea12dce8f9d9f2aaed933f93031e7b8959ac5e7bf6bbbdf30b48f7eb783f8fe292371a2f245c5c94b4acae160767a20ce7c0ea7723d97691d8eedda9efd1fe2d MD = fb531a1ed181c732311e56f4b56ed91dcacc0dd6bf1eb4a44be6f87dd7cb1ef9dfb0310f4a79eaaa3f32bf3914d8624e Len = 1024 Msg = 3bf52cc5ee86b9a0190f390a5c0366a560b557000dbe5115fd9ee11630a62769011575f15881198f227876e8fe685a6939bc8b89fd48a34ec5e71e131462b2886794dffa68ccc6d564733e67ffef25e627c6f4b5460796e3bce67bf58ca6e8e555bc916a8531697ac948b90dc8616f25101db90b50c3d3dbc9e21e42ff387187 MD = 12b6cb35eda92ee37356ddee77781a17b3d90e563824a984faffc6fdd1693bd7626039635563cfc3b9a2b00f9c65eefd ring-0.16.9/third_party/NIST/SHAVS/SHA512LongMsg.rsp000064400000000000000000063404451352416253600176350ustar0000000000000000# CAVS 11.0 # "SHA-512 LongMsg" information # SHA-512 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:50 2011 [L = 64] Len = 1816 Msg = 4f05600950664d5190a2ebc29c9edb89c20079a4d3e6bc3b27d75e34e2fa3d02768502bd69790078598d5fcf3d6779bfed1284bbe5ad72fb456015181d9587d6e864c940564eaafb4f2fead4346ea09b6877d9340f6b82eb1515880872213da3ad88feba9f4f13817a71d6f90a1a17c43a15c038d988b5b29edffe2d6a062813cedbe852cde302b3e33b696846d2a8e36bd680efcc6cd3f9e9a4c1ae8cac10cc5244d131677140399176ed46700019a004a163806f7fa467fc4e17b4617bbd7641aaff7ff56396ba8c08a8be100b33a20b5daf134a2aefa5e1c3496770dcf6baa4f7bb MD = a9db490c708cc72548d78635aa7da79bb253f945d710e5cb677a474efc7c65a2aab45bc7ca1113c8ce0f3c32e1399de9c459535e8816521ab714b2a6cd200525 Len = 2608 Msg = d5e378ae9fc2648f4a13bbec4b0935afb4f822f5fe0d5063053d2fbd547b33b4a32e7a009ee2afafe83d2ebd603568e4a38189b5d24d59e8953260f15f654ed4f42f9a39299d68c3eb78b09e83779d5718b433f1765d35350eac46493d194e84d1ce1f81c95b59725cab8ab73d369ab01e7967cf73a3acf1789227ee75fdfb6e40f353ff0484486542be053115db2896bab86c774f8985c4dbcc4c078f7b1c3a4c867cdc6580fe44a598673494cc0fb1f6598b1295768a584041fdbd14fa7b90fa6fe33f71b743b68e23f8e7407217aad9440cc8cad28152aedb82388be2de165496d051b292de6303460273a43508296b6237c07804335d2e81229f7c9a0e7761e38a3aaf7799f40fe9cb00457ea9d5b59953232676681fc71b261a6f8cd359293f5b21f0cf3a11b7f49cb5adb3c357bed2aa185d8fe8408192d6d3ed1ff465b590892efe03 MD = a70c75b9b1f0ac2ed2c2797763ac9a6601d95f46889b00fc3ddae4d0ac6923750a108d79eb764e77ac07b7cb5c01cb4b3747dcf69ba3b35c51fb995da2632e70 Len = 3400 Msg = 4f7a5618870945b89f194e31b1aa802c5350326dc691df58708e34b48ce666b021d7c92330a69f1832412d8ac224156c9679dfedb383d9f9e13c21035d3d0002cfdf79b97ba0223cbbc833b0ad4cdd5229f2ddbbf6b650623d6cc9623da8a17d41db8e61cfbe772b23f4872adceb81e5f403535ff5f2ed996a67535994edf12a5f1230a494c946ed500e5280b5c8a82ddff369611afe58a85272e870cbd59a1012ce8509338a368b2c5dbb3ba2adfb33d30c494acca43896dbd8b030482841374055b81812c6f00c9e2bebe2096021feb69418a272aa356cefdfd22074ae91a8d2f1ef599a481c788dbe0afd54aac39672d401ef76d9f83175d177c9b72e2f6ab1e7525533d761d8e3603f14ea538904ed142abb3ff929ed55f4c6b17a72c685c3820b93463a67338756b2b033231a4f119cbb8d35d270a97791e8622340fc02f2093f9b393ad79161eb8c5897e21f7fc4b3ddeec02b736cc3ef04641c6179e825c319f6769f59fa5966f5957e573f9df0a2b76548cedd3e2158433dcb9de63f44f9be2b63319477570e14ee504b23b07cb2737a358154277912cd779abbeb1036f459c26ab7310f43 MD = 713d5c26de17e1440a36aab93f7cd8111cd62fd8bea5099b2b6bf93e470e1eaeab8b925c646e9e67ce01b03b33d2b500b9400e59f0ecdfb00dd7ddcd230cc837 Len = 4192 Msg = 5e0e84419c02ddda289aa126bdb40a060464aa58b88bad2708ab5f1e3df9ee439cb470e28eb627c6fe4904af033b6b01bf3536ba8748fca643c993d6185fd34e455a9dfe4b461cf451c04bcfc689b87748d9870bc5f6b91be004af18961fe90821a7147e1cdb44cae9aa7e6d50c579d068f9a535bbbc6deda506b9cbfd62b8daf744dc4b499d26b18dada371e7183773e73d991eb1c39f845b74bcd9964fc72a91d8fd4b1ab34a120771c4c2d4aa78ca8d4c6ab0ee32d748caf9bd29a90f9e61b50c8068d74638531d9fe84a5fa2c73c22cf20d1bc329ea1b93bc6a37ec9c5e82c886c89c77d79de98df18f0cf29a9316d6dc46b61eb7af7f1e2de2f5ca6c525bef3c996338194193fd85b9c6e66a81137cf5d652684f6b23b970eb58dce248232f6a0766379116edc33b93682824b45489cf3a75326973a5d025d1d57686d665238f8139f8e794435973aa754a41a33687d8f1930f8e7f71fcad34f039c2539e462d9542fe8520214ade7d52cf59e445f1a37a305236d524b977834d894d662b11b4b215aae27123f1dc7a9529d5ee0f41af62d19ceb1b1a71355b22075074b810c57626a097ddb7e8ee20b0dc3e370f126d19fb5223c7dfde471b2216a415b1cdc04ffa520dec59ba941e4a68fb35a1ce5d2e12147951f13b2d41d25980bfa49345be1541cd1385c15eb1a652a58083d0000dba56444fdb12687d9722aed90d2bc62eebe24df9c8b7ae897 MD = d4a3b38f18b048e61686c2159c666469ce9a9400632fd40ac1d6ed33162b921b95ac26238af9fa00a4314a6046e1733fd4fadc6033f3ac33d2b8c202afa5f02f Len = 4984 Msg = f516561edc530bf7aa1a63307d62812fb560dd5da66297298ffb0c4fd060a85a5712fb675cbd0e2d4e60f73a0dafab7f59b6140f8bbe63248274a863e1489f617814cd65fffecc700a9fe47a3965dbffaf350dbac655bfb1018ab071437df19b3e63f79f2dddefc8c61d51796a4bb8b6a027f1e5c1ef51d6f5834c025dc7441092499f9e4f241c3d6a2467bd092aebac12d2e719e354c49d44a8a69d99ee41c95d0ceee8cb99fdd8defa4dd07cca1be9ee8018dd944bbe0ed741e3ca5eb98fcd85f50b070b053aa00ae72c3a2df3f1761d77abb93c9ee73096962e1115f1d624f44c1e83752f7b9ed7352c81826d145a86ffc9354313e90b69eeadfb245ec0d7905951e273e167d82b2a742fe5ff2e9d10629ada127369a73993880ff4c8f3ed4363caae6ce1a658f0102dcbbd73e448a5e6452f0f85120deccbe8d5edf7176ef3b4b16ec8f8e1260c2d7ede728fe0612cd5f3bda31389446cdff5d677b3d5638a922fabeeeec04869ca90ef6c1ccaf38c75cb0a36e379549f17d699fbc3d5d3ef466cec488beac8ed2e8b8612e14903af0ff6a031bf88466fbab4a7dff0bec60a188fb93d9708ad82a3962ccea8069b7cea9b07fa6d5e21c312b6868d023844c34fc09a35d9c1000f6fd9670737a9c2db50e3c5fbb5a4ed826505c06bc1ed5602352918981abec87bdb7dc22657d981b487f6649b6102b296fcc8dde3f48203af10efbacf22a60db02faac291d03edfefd8fb6c41371f79e61f28635c65a254b2293d0940b922d895b387f1b16a81e4758b1a635701a4495a154ddc3edaf34ff3c8398c54a7da3012af3dd6eeed4a982ce87dd34485382bda285ecff01c1dfe5b350bcb73b3751d0f6af3f9b12040 MD = 1288010a5092c66dc87771687ca6227139ce5dcb48a79dbcacb22bd365f661fb1229493c662881b86bf1eca2071095bde47c96b992ee16d3e3277662cdbf960c Len = 5776 Msg = bc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26f MD = 34b4cf4ed7281ecb07f381e9fc3805072238e21ea0d1d2c5ec0ad3b23ea700247b8e9535de9fac6783f955166c4ca9a90f4caa47056fa9f313be75daf27ec8d2 Len = 6568 Msg = edba7d6312144e90ec9eaace7576045a46e553dcb8ee5a9849272de841c8f1ea9502e3760b929c539f9593aa259ee3ba31064ece3483826ce7fc9cd0ed9ceb99b426f6c19c88c0d25bb24a57a0a85a91f6d67b6ceba545b1724bde7d87e7c1f211cdbe2c0c1e4277e79dd9bf2bbdf1485effe19f277a2ad0b3bbfcd956d0fc5f76a044a0a57eaba90dfd47c8110531453126884d2e2db92f6ff5fdcba4802346a9468f03adcd83cf937a9d5c98a7a1f137f6795f4ae47a3771a1e93ab71fbe117368a73f6d36505342bde2620acccab43714bbbec0c7f6508066c910d9d455279cae953a2ddf9c9ce26e1ec2ad9b32f7fb2b5650db00b4e363eca4344fc771f0ecbf60de35f0ee123b355a64ca3d632049e153ffe2b43c56e3dc828e642199d42b441011cc92cf1d14b89d30a8d9e599eadeb9b21c0e1713c8de6b065f0a563b20e4aebd3becc62537a2ef0e91983ec8a6cb9051d233cc80da99688487a92f8d944841c9cb285b926a9958e6cba2f8174450e1c34d4ee307e0b680f02627ac324f18d11dc16b16cc7645e1a09f1e9aed8e14b3f2d285e50fa4dcbc3282ab559319fb67a168e0803b235091245534adb14ac00ec5ac0059ffecb42232e35eb316ba99093d07ac2048385f715a350eb8cd41fbfa2421e8c74181e6bdd993684d24f99bc2d9e5fa7e597f1d872a87d143a83b6e80f77b65b73c2b19920dd9f0ab269fa9975d4bf023d8be2fdd7d92a8d7aa00c1a726009eb258b1f5abb7fc1e5682746a92b181b6962bbe407b399fb9fb3b579b789af9bc3ffddd240fc0451bd5a24087babdcf755fbc47f66748f62c37c309a4f939ade6e793754bc60efc0fb0eccba7176a7d5507f121f9ab90df2a13aadf8534ec664531824215d98b692270cadd73b29ed27d153413f24ffba2db18589ee6319c6a01a5330c274f1dd37a9ca33d939242171611ece68959708666cd36116ef72f0341cb0c9b2c30ae8442bcdeb4aebf3f954784806265d3d6d4f3baaaffc68e8f762d2c76b6ca8425c2a059e50a6c427b9139f55a4f2fc417d5ac681d2f96fea20eef4fda27a9546ad6bcfa1f077722e05613ece1758e351aceb75ef86a854f5212acbc9eb472a76508bf27f4727467552bfef17d9c2b2dc70a3c24a1783b8a85c9 MD = ffcb3b313e576ea5b0a87449749b82c1523947ad019c633401a185fbcb4fd475dfe42289c5413f440d083f73b65abcf2386e0eff39acfafa398a3d6b778fde23 Len = 7360 Msg = 89eb3056770a6157f06921bc153834447c4b6d862d10d185f1c3f984cde5b81cc9eafe8bf532fc4fae3a89f41e14c52a0214fc1ab0cdcdfa583b8bdf8a42e3d3f857bf287e7e6b0c5f74f65dd22ddcbebd81e1eac022404875d105c0f6d1b8cea09c3bd417d6f5b58a7f319f396cc02834f8e69d65f77496d0eb31ce1a7b7e3248203a38ca22e472b8c3ff635bb9bb91efe2d1dba734af0df2f3d5b2fd267f2a794b84fc9e4a7e6d70a82b5141fd132177a86b4e8fc13ad5624fba14a7bb01dbba85e0c79c360ccb3a967b10f21e11ff53b07c9c24865d15a869a89a21234d7093361841caced5b79ef5b9497606fd540b64cc6d6f6b5ff64da767ef7244ab0f8cc6f21332fb2357252daba3d69b1f47282b226a76598a9fd873beb9a20862e12e9e37e5dca33cd356a61ac719c7be01316c483a43362438d13476a1ba56bc0d0024af5eceaf6954bac8cd5c477124a9ae910486deec76ebc151574ec115ffbb8bc121271208f202d7fc8e0b6981976827011ff64d61c8de2f342969bf2f741555dd56e8b0941f0438a8237c85de6066252461319a7f6239a344b499bd8b6340e8e11748ae3d388362365556a672c7ca2f6291e0cd2c8b25a5e9c087c1111467cc332aef16ea84a6df0cec41d12413bdce2379aaec528ccabe8b14dad6a9ceb0873d5786f0834c963594b0e710dc8e6689cfdf3801d8ad4f7592793b013bdb43a36668b542efd87aef3469ed6a827eeee8ce8c3113a636dc5367b7524caf8149a81523231618707b9256defee8ff2c7c7388483e2ba46f9bdf7096c6beed09ea1cb4527973e55cc1a861d8c09039e039b366da0750baa0b2a116de405fdebb4d89aabb5e623ee373b9bd1fdb6c19e24c2fce0c338ad0104921c156673868de9b765f277be90b4fb94bd17bf8848779de6f29a46be1ce0889e8dac7e45074bcfb6c3b5d781334e6bce807b4bfde6cee17fce06b565e9cd0997dc7f95eb0eb9b96f2a627fce5a2f1a417c691d784ae891e5d59299d0822b0a268f2b47e5eb3c49490084baf693bb7996177dbe97e37921c1afea6e7e849f0cc32c1c0ec64b67f1ccec9923aa6e882c24c805a9cd2ed5138bc36a9dd04f7d73e629ee44fcada13563551c445a4929847624ad6998aba0e9bca68fc276615ae2180f0e94f9609ca6b4c08a9776c1f42512b3d1787ae85106cccfe656c168cbd9c141f9895d22aea839b5708790579c8082ec1e40f4436a0d44b5fad541a424cd8a793b7c98525bcc5aba4abf277867293f33f07d956b406fbcef39c897c21a3fd MD = 6b8be942ecd6e8509b88c0ebed80e0e2193eccf212430429e7d3d097285726e85e0d1d22d046cfbf37f80f922e36bb1c3b9e9d43cbbc477dc80eefc783adc20b Len = 8152 Msg = afdccc84f257cb768b7ad735edbd1990b6114bad876928ab1279208574bd513ac6beb32bee9192c4bba0425e32ad0e64221371b5ff4f894aecc0c8191aabed3951823246cc66c7074aea804e621acb2017bce416acd54c03ba6f77d77f9ac4c479b1b39f33de538860e0f9cd260c370cbc920c983702591ea10f94894c92c02265d29dfccc021c8f230b15a3268c3c703a1f520348df98e3cb2789f5289cc89d3f6d58263fd90b64bef23d9709a1c193b8eb1c1e8672f19a603fbde4bcbec57b2c0a4ce5336b084e571ed7737754afbe5f7cd3b29ac54d8a87df981db0029d055632e10051c1fc9617154dfd1aacec39575ce0872be092fc6990826aab703983e56c7f4140e2cd85256105fe97b1614cc713a965e2c9aa382ed9e391550f813d01418e6ea8d66561aa89693d996bf63fd7279814678a7b86fd43235b57e75d7ad038765033a6aa72cd16df84c6e39459b122145b612bef2efe55aa905900b6847dd99faf87598602b78fd199c62021e37a8c840479b2ed775b97e1f8026372a12eac71534cf7e0578f7ca645422a86255deb52d556295cab39912e5afb177b1a0c3a55032b899fba7e66c650e20aac6780c9e597a1972610c3ccfa80eb24b7373e0ab189cb16ad73acd499824dc77af10bada511010532ee1ecfae307b93103feca4eeabd6a6f1ca404e87a32c69d70a2720fa0d1f7a688f7522b033536b6d7c40917532f1425307625cf87a26f9adfcfca94c51a2feb03aee4e6a511ab4b5346058ade5c6f0bb713c8754d0e47de30db1d003a73399f236b1da42517976d2b07481fd8efdba1151f356036d0d0061866e1d87d57a5416cce74ea2fd17baab38a595cff33ea83defb2526d194a870faf5d1941a31e360444b833f11b9d8728131a1b8ade30c128939f01fa9c431cd5cfa34b97dbc848a5e64b0f9774b2e6318bfd9b95157b0db885e2ed13bd9fc69b2f6b3bf2431f91dff9c96dfcd0ffdeaee6739d5a60c894d60ca49e1e45078e4918db72bba5cc199bc759d288f72b77876da6aa4089bf5f6b720d9b85fd227ac7d01b7758c776e8c29624c8a3b0dfb9a568be49af5607755dfd446caeaa9995fd9f54d23371c6073aaf52d6b5c4c3adee1fe2030f9149de96f67299031713e4d3cfae0cb26d637ded5a0a8526fc7e5a4bd93b5fc9002ca3fca5beaaea0b397132a750ac3f82f752c1df745b5e1eb9c9a4e0f1e5436c59cb79515128cd4db343006e633a4177278ea085b9e2c5f21b00e27a2b1de69c775ef443529b13a62862276d0e3f20159d3a719501a2c3424d09ebf011901a5a2f6554c4ea8924de40d78dec7a424324015e1c577322c1d4f6eca98acdc5486c29e6831a417c68bda4a91c32cecb146cfa00881338ea2571bfaf038f8444d69b0cec688d7efb470bfce0ba893362fab4312a9f11778259 MD = 014fd2fa6b05c4fca1a5c0753f15c940b5f976b41a40bf6bb14afe839d83a4676173940717bb7e746a2ac77f573e6744cf0002b78b5b7f664e22434e22d0ccd0 Len = 8944 Msg = 7a26b7f55809d58528540601c87db4bb8e908c3d2d82823addc315c4b612d4be5d952195e329352beaf764140a48a205739a4789d3f20ff67a7565a0bc32e14c96430fe895147279f402c85404289091d175cabd0302fecf02a37f5d5ebdf1106d570956367394568d9ebb2980c68547f24c9d3f865a56acbf77ec6465580df22af997478deda4acfff3c4fb44c9890f1d45497924a11f74f717331c98ad3bda14534223632ba86290286b321adaa4d1998855d1a4806111f3abdcecc16485b0748a915280d4ab6089653836c8a1df75af3e49b1d09e256afb5c703ea625f35c92c90d3cac91b28e32d4b47016c541e3a78fae806ea472675651767911978cc7b6363c49af0ac7d4d29a6646ceefd304c9a20aa6473951f04eb47604c86258d728f9a8e250e6f11ab2e2d621b6c69cbe5ca0e88b2306c9ed29aaf849932f5f752f3bd96d58ce39481bd28d6a98f3a4faaab0cd97cab2e246305d85af3ca6aa8a152456549069a546539212873a1df3a1f9fb433203e6a4e4abf5a49e896e40fc20dba7fdbd6040fca24bede264ed929992a9d1c4974a18ade299de7e443029b5998954d2aa5a0f525225a7e1e00a88ccbde100b54f85458a1c72bab833936e9bc855e5391e001c31aa47c7ee751edd20c2cb566df1403463a3a8c0b21f401698f468e39ce0fa6e7ff1dad570eace997fe8905d544522eb21bd6278d5cfde299366e9d662b9ef0d2670055acf08c4c5d078589dd215d474aab3c86b890d16b073670144f37187020c6ff1dd7297a869fbba4a9d5027fdd7e8cd0420379f90b1223dd8b7b7d06b541b35c5e6c35f218be7f68fe53444461ac2523b1f454ef337873095b6169e430b390caafd2927d8357e744efde83457471f8c98f11de2e7478a8a61ca78a2b630503ac8ab0cb9756ea77bb06ed2bfd765e9c1401d252316eb1391637945a56dc947084677d4db9f3f4a55ddbe5cad6f7d073a5e2bc7d9252a0a8fc44ee56f10e106be4deaea56feae5048fc78edc5c696613f18a46acbbf0d57caabcec0c8467d75a4048ab4f13bc69f9d3621ecd085b8df17960f75c28a9ae38b41833e78b7a77c0294e29b76fe8c209cb243c39753eb690c01f452862edb9419adf4c8460c66031f247708abee0abb8c9965d9dfd938e76481db68df54d853be18a9c4fbedc3f244ddd3615ab44759b712109673bea641683d4d1f95a49809c0aa2b9c5f01c431b9e77d0f49f84be06346cb621aab3e5f605ed1df6fc5239c688a01b63af174a8c669fd7b41611f3ad95c1ea59b480729940bf010366081f6fee1b37c5464d840b38bdc0c0997ca4d617d91c7bf3c09884b6d311ab21cbbfdcad6ca547503fadfc777a1296b43540342d1ad304e304c62cfac1c66aba2d79b1392cda86476e16e4b52d43c2d0dc642c67ff94910cbd9a166ef395ae999e0b7233d44dfea6495d68747fdac189c27f433b0fe78ccb6b72b595e115f33aadb3840feb761cf761ffdc37ba5e1f4997f00d28b42264c98eeeaf0232bde537dd208b3fdaf96db5386cd4719534389abd64eeb394fbc561a87c472630f3d0fb9 MD = 5f1da3c03d633d35d6f28c1987ad25ae9e26b6afdebb2aed02f1719b706d20e5632b2005933db62129032fa3fd2304469928f6810af1742c27731a5beffb15bf Len = 9736 Msg = 8ceddebd38f00406743a6756565ce762d3464435d50bd61b8de57fbe0b79df8f0c5cc66713d5ef6ebbe5eb3d4b845b3f8b2e625dd69e5ada71dac67b1b6f88ece5fe555f44f7657665a56f63c06bd44ef04d1bf6c2b19d9c8c67811dc0e8eb5ec0db71ecf4decfe41b82db11de97bb55abab554ac0cd0728869798ea216b6fac45fc03584b1093818485178fcd92761d6350f99ff9790048086ff42b67807ca01b68f4e970171b1549b50b25b4e46f6ec145f03e953df0c2baf97b27b9af7a00eb272ae88c7bcd68111ba01bbb130c0f6d91206fbba13f5f433c16284081d1955c428f9dc6c2134185bdbcb80ca9b7ca0e3c737a932e55e74c40ae74237dea2717c00a4f4776546a4ca54845cc2ed7654c4fd0a6466b9b227c0e29548b2c2b7ec3a98247361ef7a90fdb2d0a2628d3a9d1d11e3cfce177d87cad7110a014fd610906e1cebc4366c77665514f4021155e42ca4784dc1652d0f3256cf089bfc99991de0e2a016c088c284d9e5c42a0044c4a4232c60f9495d38a7f043c6fb5f5ef0239f1a32c2145bfce9bfb78552e083a8f42c74abde3a6a9e9c2203b797ceb28051f728366eb852a0f554feda15289f2b9d1ee570c89ef1ab7f6a736d09e110f41997910d6503093948584014d94ef3a71f88f372710d6ee9c2383759ba3d16b5faeee94a5daaec3053281fd817ca3db5fbe92303400c5ec42529b40031192030667b955fa11688209652e2967930b9d2a2bdf8b5cdf23dd4e8bd7df3072bba0dfcac29cfe7cc497482573cc246090477a475f90c63758896bd41f99494db60a91e2f2b0d8a32bcc6b7a382fe36b9aa3f91bf8869b8fccb83f375bb8772bea09c5b42fdbb10e06e71a6c659bca3d92774dae93b70270e73272bb7382e193bf65234a6263b146bbb1fc04e256015dde8c1e081969246111bead684f40b00d9de552ab7491ffd2b4f2ba4997a8b153e8aa153270e528eab2269847d8390b21ec53fbdf4badc43a5772fb446ddb02a81798d933827337933230da5ff4b71b581475c5efd1ff27070ef868fb4a361be3d2201313355a79e5f9a51bb98c0007397d1359e2ecce51c0404ea9781800258c83086bdb73e415676f4c055b895df84d90f75ec086646aed543a65c3bd82472c91198892235734a2fcef3e4fd116161ab3e87d9186079916b48544e22304aa4a641b13402dfcfd1c09546e9d4e73882a4fad5e5ed40006c4c7f7f0df30cd756e64d6b3ed781b995ffc443e4be6bc7705cd0fa82e5897da7ef5570ec1ce27d120f91211a2eefc2ff33f87556383380a3193d6040afa133dcda66f4991e458e6e98b96d56776e6e85e38e55dec0c306a380bca19f9a2be56384205465659a9db50822ba642f823ec2a5126fbef69ecbea29cb2900338de4e4731e2b0181762d9de46992c3d5df962def111d97382b42ff5ad581030a4bc4c82dcce2de005cb07193fa8105f8bb172037f709f803fd0e5bba8824289cea07972a99065b50b2c8e8bd51ffab06b9246206509f51e8887077bf4f9cd159ed1fd9e01f2029f11cc95bc71c89139e5e603bd0aa481564523bebef9855bddfd99ff8e4dbaa9a6fff4453379697e01e2f3d463d60bee2f5eea310b1fed91e7d13ea7cbf3b104d3bdecc67857cb69104803df983105e2b2bb2589eacefb193d04091edc5d9fbb2d34fc3f1371b6f86f015c4ce7835905e6441bede36e759b MD = 1c7665a61930433fcc7660b36049c016a7c646dd1e8412721314f969d3661554b97b18fd35945109cfbfc783bdc424b204ab19afaac855c284daf7f2cb333a65 Len = 10528 Msg = eb22f73a99b3b00d6c9b15c8be5cf11a5435d561e398bbc1d3dee973423a18604cebd6ef8ab6291bd89475c85ca89f57c4737378ce4b433f0e09d17bec037043ec3a65d132d4939445cc588013e8b2a935eba610750ce2bc8da8a10d3234cf4e51756d8999f3389f39ab8597eb047037310435d1dec4de60d9211fd41eb57ea90506b6bec7fc5e653e99c6b6ece4222a3f26ea651359805279de1475b76ec57d90530819c5d84e0ddbfee1851f700fa9e8b98b711cb510bbf545479b0547ebf278c62b429a6d50c099429fab8b9181ddb225e1a0ffbed6c2d6c082ec11293a2f47c5e6e04ea5aba6fecdc8d1382dbeed27d3b497c65e1990a3b68b10e2faf85d84ba039bea67a9e69407249e2f2d0f02cf29cc01797c234ce48f2bb080a46ea3b80c481d749a90a9e3597abb777abc443190f0841e003a1f22b22a74f40de42a6a237e0bf728a916722994cf18fa0ddad571eac8bfd1a731e3895003451fa11922676d1078f83c56c9e038831b974aed4332807663d9b2a9b27b65067bc0ef996940dcd201f2919070e72f7f8738baa4043d7b3613ffa2b014f030249fda14d2c51694f999feefedf0a4416a64c5a6289ff8a2afd62bc16d93507a06b85459ebc1515e2e4904a095cf8135edbb2556a09ccdbf8ab4455509b6040b53ce16060de259001918eceaaf98e5d5af934212358423986eb536a7ab0572abb4ea08635fb29642610e9e1663d038e759f403220fdd61f704e2e4ff7c090322d11212b80ab871eeae33036bdb01e13492e650cd5532f1a2f44238a5a4491f3751511c4c357c50caaa9001333cb24a840372115d30083a61e5dd1ae04a4e2fb4ddac0e6809879ca0fb2c81b4b16cda9f539f2e18c7e9a4fe80bc73f9969e995f1c2dd054ae60be36490f6c385fb6f94c2b769047435c973f6ce62938b1c3c700b7db4a584b8f1c543d42a80571180f5533fd1d31cbea7bee516326e5c3451f6155be65bc089d20c47ecc1f630d1a8480123ebe208819b8d1d93c5048f3aa0b499fdf07c70e11314db5b5b79c5c45c19671415c5aa174b6b1aa7891a96a7cf27f3c4519c28573b6b68a065af785202c5ef70cdd283f80de556c1fd04f50423cccd5f884f5954c19c8a4c6efbbb0342ea24da92bd28ac79687c83af583cc8550f812012ea86422c14bacfd5e31070730281a202ca0a9d0470d65d0e78d06cc98cb9a6701231d80160749b38fa1af2398b90777cadac5235ab0ede990b5279f7b0d1632e4ade6eb80c324f16952d310cf1dbcb8ebc705493538058dd743578661852d6bbe90e7ed6749e5bed68e99543e1ce0eb79b092c9426d57c5a47ebd0ab2fc881979124a0d335f3323be9b29794c7e1b165bdd932be8178b98dfaf82b2d73acf44fc7c34d44cceb62707c2ac07600a1743799631f88efd490f711ecd073607a9f42f16cfc81b5d17d29a4b4a84e4897979bb2394b79ee838314013c790382bbe32fa27437306d6fe2c5f7e2a7a3fc4ecc109cbe3f07fa0000635d698d5456db70545f9b85d76ff123e3ea37570d98016224bd8472b99ed4a9638ae675ec6963c76f8d2550cd4a2fc0f200152ef1a889fa46990e7f15497beea32e55cb4216ef48cfbfb420a868564a7ebe1ea7e6aa3304f4b3cecc91865030909c1a15ec0bd884f36bca8dff671f00f898b65a53198712cda237d3c4d20c2fba78b5be4094b9fc7925caf118a2d4b4ee047eaecd7300942fc8fc3d15b90a2c9f28ab5cf66e0e2fdf5257e2aac831b6cda5da1dcc433a1999ac6e510aa7d4c7ad408d5a53e43f9f8495d3eb2c33909725e14b3fc6069e03a9d110c81a2af6716344be3f1f93d8bc0744d162f3718bc MD = 97c433de3cd8f18b75e494bafc3c813e112b2261f1261ea6fab9dce0aaee5e5359f0e763f02154cac1589bb70c2cbe9cd22f976559032923c4e2beaf3f88f196 Len = 11320 Msg = bd361ca6c8d3531d4dc2415db16ff93d3e81d3c2b451113800a1c2814b8be7ae36b7d5cc64d1da003a3a23d7e2feddd796079b5a1b90f89c8bdc7d125827c5fd8eddde40580af36ec6112828cda2c6a690e69893ddfc951efba9be4ea34b4a954c0f01a9ac64e68f7bb018f87a41fad1b4869216037f2fe7d7724fdd33e0bf9ef8b704af66c9fa8ae07dbbf1efc4c2818a4f518a95000f1ea79ef66810cc6c3f1b3cb0fb902078887de1d9b9361466de9baa9c9899667eecf4957c9743f999a13c06cd353151a8b0db4539f857172e0f6efd3ce8199bc27944bea911d34d8eece37d23055243d22b810fa45758b7623d8bb1fa211c8623ec2283447fc8b2924798097911fae03e20f7a9e27d43db498f7b2f9cebab0feb6d134b17882b0fefdae4129904310f34b8c679bb141f6b2c2ec5deeaf0cd1e6026a17fe8d5034bebce4e004984ffb8fb1b75e9f7c1f54e5341f125aed58a9bcc3c5385800d5850cf4b5f3b52396dc3dc708c5f5d2ecc6e06f1886eae45ea6e75dab1c6a7d93205e3789d2b7ccd82191fdf9445b603acb28d661120b3e6f680a42644aa24e19a526e7e92388ee547a00c921402cae79e022fc714a28560b5b7a048939ac1cc971fba85c6cb522cc241eaae94fe6183a846363c195eec5c30fcb36927fc444332540db4c04a8e47fde5035e9ca1437fd566e8efa9bbb0826d3823b1863976ed72dab033081f0be100729dc8b55337822a4b8e054b219879765139473aba1f735f97eb2b26b091a0d1d20114667c0734b1db6fa988f86eea53313d54cbe6077c017405c4a267e82c7aeb776b3884793f71ffd501e7a9f87c0abe77ffbf24f5b16159482505abd72e03a746f5b2d3564872a00635f09affd8a5e22e71a0deb3b9862ffa77d7e3274e72ecb8d95cd165fabda44b6e2b344aa52b83acd1f57b073e78dc64e19e79a033d1a41340bee770fa59f5ecd421dfa38ca58b37484763bae5404ace8ce4d40a8627b6a051617b3df34e79318e5904d0351ae118fe1dfd9458e55f7f9f305c2dee7d0aa735ccf7968ba51a62c55b099a47926d971affb35c3f6f05c1430b79d114da88701387c1416a65bec6a0b058c96b1617fbc575ecdc41e723daa0fc93bd9f461842141b430639964fa648df572548acc78e260811da0754a113dd8b12ba38caa267600fe3afa040b44ae4707075875f6596663f881f39be66b423405e90876c0e251eeb0b02466cd5fa9dec0a83cf34d95caca3ba737e2d5c0599a4df07333644c5763822c9d4229afe9bda8c15c9350b2821bb0f9d7eaa6a4e683efee6e5302c8e917c90caf168eb9d05c260f41c69e442ec0ff067e23c78d6b79621f74461afca9742bcce4648b021032cede871d84af13727c39752ec6fe6af35b200f9d1b3bfb00f109c7bc9d1d0bfa19bb9708b267e278cf1f675c135c678a217caab8821b7026df3fe37f336f35ea8d22ec0896131e6c5e34cf4c3b3be3965ba1d038fe2f8b8e3cdba22cfc8d10bcafa100adae1529c5a006176fad1161a0701c1a9eddccaf8fa0799e5646db4ec8e7b27f587902970d3affca46f7815440f567d44aaf977ea38076328bb0ee2297cbe3b2a9755fe8bb95ae726298e04df05201a7ccf2046b82836e092da94a4eb1c291450121718159468e8a330fc2b1272c661fb62397e874ffcd7cccbe5425af725791001c0c035ea41c8c48dabd206ddb217666e2b688237c2127e96eb049d941b34126b373e13454d4e30478241e3ce4b0768f8e04cce67ee574f418c32dd7b710bfd5864dad82cf3448f6668bfd0cdf9f8a70a3f729667ea6fe7d6b213413591c77ad02fdcac289e708bf34796f56324b1cbab302100c01c22ef5c44f0f249e13030dc808bb6c0b39ccaf4060c7b1734fb7de49ba234f9ee370fdc2a11173fcb0dc8833f301f7c9b8ef4748d6a8a72919e65bc683e5b9ac778ee5d4cbed9a0b528e9ce54130ee4be0fb278c4f849fba4622a3b803a MD = 44a012fccd62e69ae9a2e9e46427fa491b88f66522cdc1f4ab5c5157196b15dba3905b99c460bf690711797ea556fcf4b2550539151f80eeb522fbc00450c723 Len = 12112 Msg = cb7e0a2878bbccbb7dbdd8a2e2791ea2aeee73c909b5d9a19eda01aa43ea0e07dc4d9c787cd60188ce99d208b4fdaabb2d1226537c24349c87908ef87dd6810bbbf0f3b7f1e2a44b8093b4f727db6684dfdd23410397c241b4b706c37cb068f2310e17cf1d063e6b5b528559843cda638cf8717ce63609f6eff872f589a14c24064f11a6496b5650277f4d1513478fc1fb0a18eb6d2a9324fefbd975ecd1b409025de826bc397462acc115131c250c07f5bc2175e09be834aa67432bed672809eddda436c0972009b2c1e43be7fdd99b42b6930486b08e8cbbe4b8ffd48c308c8e7a4ebd9bade3ad0026c275bcf87fe7aa9f767fa8920f96f91c41d9e86755faaedaeda596a444b65f99b7a9e23e8551f51fd3cd8e69f3b92cb4e5a172211ebb15a589d5f9a4cc8c97c2ccbfa2f67343eae0b1d8805cc05c1b57ad3fbae114378b842b350cd401977048089f4448d22452871887c69300e98fab9f9b08d0bdd6d81ed9ad175d6d3fb2d47431105d285cf5bf10c2a7373ac75058c69ea416a401c31d9d25616798ed240d165e4d5d00539b2ea2716c70f75e2607272ed5da4e1e16267f85331909078f9cf80c4570df700c7cd57d5e65be16d960cc34e544459797e486b5d59b48f7bb2822243ebc4f1d0f52b2ccc23f1757300abc991a7d10d20ffcba9d8f16dd23705a9a8f816cd7c26e583f47e3258a89f4aeff43bdad373945192326a9b251f576da6a3356a600c5ef3586d60840a014edf39e1c15fb423203e1ca366a962ad3944f9afa0492508f5b918f6278b8e060e382a00b6c90ba270ffcb6b61bebf327946130cbd55a5188791660d17cb4d3d59e020df70894277f3213ef8f04d831583cb9368d0f238b18136a030d5c5cffdce51cedca322e0fa234ce7ea76d866ece55ffb32afb1885a8ef3580fc60d9eedb8278496b3286fcf8ddd46ae89e1c31f1a6dbb089e15ec79ed720dd88d053283c3bbd28c250c575e9f5cebb39dec30329f9f334920920d96490d22498f3f13365d99393b7d41303dd43637a8177a36bde14f2472dba844460e5f45d1312dc99c024a4913205972c3c903caeaaafe3f178c07ef1423eb28ffc9d2e8ee3753ce2b3e3952a1b2d7a7b6ea4005f9bcfac1d5fc53f3bb9dbd3429f7f27c1ef643894a8e011665a92e375db4758953c1e2578fbebdf2c7ada0fe5b05588fd1f27f83906e1be4ed77cfba4eb41ec5975e67789b5fa03cd6e838d0199e5f84b5b05a55835af44e97b35ea8f075963b22e6dc9d8f3b955247b1d761dc1f820b28b48677a9d124c402c04d7be955966a94ffd44ee1ef17d3c8af2f1c29055a83a97366526a6d17e59d330eabaff079c45c0dc0f529f6a231a844827776ec637eb6718c8e4b8b6813e59024d0aab2bae8e6952548cdceceec84f6840c4c31175cee435b73c3b87fef7a4c22536038f438c33a938253f3f864dd59a6331f7ff0ceaf4d75bb7970d9c8a9eb89dc76dfa04480427e5a42f2a94b1fc25b8477258a1478044dcdc341004012e2bda44533398c9c61683911477c0fcae53688d9de4dfee71c561347a58dd633b6507351c03a9175fbc397555ecb137d26a9b8cde6a6be6ada21246d2acd0b9afac4a223032dc3bb96230d75c52106a50b378ca9eb4f0371e23189aa2d5850a7149cb94f788db3cba4f903f9070849b107628d1468814eaab909bb8539ca35e6984b313d9cd4e224ccd80355910b6d4f9fbd3293caf7f063b30c2294ec7d3be7fa42a253ec8dcf6562228421ff84d1cf5899f58eaf1da93b84cb674fa1ebc309bf357548e422ebfbf97b1ed4af1f27cec69b7e8b615cd9a092c9f21be6b07bfa5b763273103ec85717443bf42c34dfac4e441610ae5ff211618a4b804745b70853976268fd3bd505301053f703605a1664066494d271933c758edc23302614d23c1b6da107a49294d8620f53a12c376bac54d2ae7a4c2d50433a3c7b2ddc05d67964eca1dbf3917474abc69091e2e83a8bd1f8b4024a311b5f3ee4debcd21a83a02647f1c6b35232996ff244623efcf196e03f5c06f64eec2def5de459a2c37824b217f7746e454dbb214ad57e9ad62f32122efcf4cac75133de101280b881129baac549418efb246e6218ca63811 MD = b4641572cf72bed4513dfc2771dfeafc1aa6dbf7f6b740998c905f2f48ae471d00eb0e284291290360c9763500a584bab1a1603a8017accd15c3db7fac25b572 Len = 12904 Msg = 43331ce3faa34f02b379076a0fe38dca551dfd63148804b90afbe98e455dca1088742952f0f8a7f9d7ec0e38f92e95fed54c606d5799478fb380d84494199f7f76faa5b250503687772ee7d1bf24d8c2e314375e2741052f3ba91d3b63957233d56e98ed62d2861459e79a1fa9efdd7f451d891dcda7c8036a1dbf59faf9cb946d770aea6ea71e0946c02d08feb72c9ec4105e9291f517720885c688a06e320a05be0491bcf686cc0660aa7608a34e852895bea5ba507be4dc883baf9e1c30fd67ea8dca94e847c7617118500ddcca9e3953b23e92e27bc1afcf25b63c2a4cd559a4ae7d3da5e8611f98807e568a2850bff341455fd39f7249018c84c2c00ffaa4946e920054f101077fe9e72bd3f102811c74a26a4b6f5d72c77803780800d51061d5f1251dea11e3ce5b75d3e2ac1e4877523dfb7174ebf2c9f21aa627a7cc64b4eb83f4295cf8792ddf0f98dde10bdcace3fe596d358490ae01b193488c486a34b92eb4a0cf1e91427b9dc0ed193105622fcece683a91151faeb1889138b2e88a46dbafaac9ebf5b839089439daf88b413f93a08a0c784ac30000cd2a3270a75d9a732b6dd4c76c3521365ceaafc835f31a3718fa32a3f443ff87aa3c02ec6f56bedc7114771abd613a1060271d09cc1dc8a07ee13478de46b32e67ef318c071db900c9c53b4cb1e68c7ee719ae23196a52b81a669b61cf7525de4b6a46ba395993c57aa8a6c510691f693be7e97ee17fbf6533b2eec58e785c7d9fd6c9ddcbb25515cee742eda295fcb7a2ba5682ef07179113ecb50ce4f660f4ab5a425c86d206d70ba7972d2e0f2a5265ba7e980aa86223003d799d99973a2cb71f3aa1325eaef37a132beb7e82b120cc0ee826f90aa90343cdc0e27504f10c0b4d3913970155506350899058949a0b1edf1c9685d6f41924c3154240e58d7bef0bc51a7c6104d80e89368585edecfaa554a34e76b4494dea47fd25c1e11763aa81681eab26c372c2e4bb31cd36afd4a79604b8944bb287df8302f3c1a196ab85d8a987eaf99806c989a1fbf717eb836dccc73aa64436af499cab1508cd123bc83810be02828d7d69a1704dcd37a9ee3f1f753e7646ddad71bd80f15e0c93fbbbc82629bb68a9bdeb54ae8e153ff1fd64b7952bcafab0699f0c0af08b0622d3a5b17231dc53f4af97c9e52598d6c99826bbaf696b08b6cb1bb1d07a5664c6abd01a7d3e2fed773bb4299c7c1ea53ba7cb544c602117f8bc2cd55bf888ce886b822ccdb97adb394a8c9b5cfa6f544e129ca9f378b3cf7c221ba031d0e9eb6efb040fec0886c842c26548ac07528a0ac1e1e32c19ebda4ce73139dc6c416483439eea62951b5a9b8d8858140b90ef789de2297fab8fdd70f1b3c9e43258e0cc2b97e5b5c700394b913df21c6ef12c9f8ce6a475966883ee2aec77cf8cf608539c392a6f05ff0e5ab8cb3e4d993de98877377b95423e71d078236c27e1e2841f7ccade17b9de81d1e87c652ef23ccd39471bd76717d9521ec59fcf7399e5fb38b5932c364a6639b70b968f48e2b681bce2dbe0747e00ccdef8a9c93c1cc716a72ddc3a53205fdf140862e321d272ad1932bfbd43dd7d871af9898209d1507c73ceed30f6a3911af1c7288a432839f8561e0e975d9d162cd9b08721622247d5a47e0d37a83bc493553030ac364ed30a7d8d1295482794632405ebcfcf7676cb43278577ef50bff2482bc16f80aa088c956911e08ee2bed302e0fcb3d936a30456b09e17564a4bded2a024feaba6a026a799549fb6355e257b2903f607c89728e8019d3f629130fffc77a27f3fa8627fba0523fb498a3a0197c848bfe2951ae0fe02cd199d8d36fecd98811bc21a1740d695c61cce481c0d5fa51337f105f4d4a29b75ca8ea624834eeb09f9be63871003318429cdd6caf4daa8ac85bc81ecabdbb4dc7dbd45c43585598442baeb7a984ac1a64bcf9e0c5c10ba5ad3cb6fcb0db2354b58b3d0dcbd7cc8381d3f1ab880b22d74a95b07acee0ac16746a73859a42d060a83f7b135c23b216eb3d458086f445d366cf9797051cfa61908d7455e15570f6127114e97edc84d6e2b010d340d073934bb315c222d6752b941e3fda20b3539986c8a11cae62d3380ae4ea1020303aab6bf8c19882cdbac8e1854c7ec2cd16af679e961955472baec64447c3bf94096039f91166bf4329be2b6b00d0620328bc477b6a5c1e09dccf9746a06a796c7e76484c9bc922d7409fb438236b69060854b8d7a471631b850f10748a80d839f8321 MD = a1a60fb89d420fc84c2caab24079d75ddca9a4676eb8677b3d64038fba8711203a459bc26259112c64138d4cd1ebba406720cf29cd1e4ac35e35be50464ef1df Len = 13696 Msg = 1cecb230f8c80f87e65e6a5cf1de4301b2cf1ac7c4ae81c478d875d3c9aaeedb92e6b555fe58760840ba161785d6463e27ea595924505226ce5e424bc48cd19b20d41a95f25fbc2dee5d2dd0613552a26ade4d0a668c9770ac904e457b79d044308088f8bc23087f560f588d6d438eb4e1739fe272aa752b793442c8d6bb136029b0a88745ed8385e1983f58914a23fcf570f7e930f216de9c13c5ddbd99c376732d2249730454c7f7bf8938b59039020e9ffc2889aca2117ff5808b185a080f76bf9d472fb2a5cd014ddf36c15ef64f95c657a6631f404c89a21adacf4709b2992dc187623d9b20650be8589dfc856af0aeb06ba894191822e13cd2caa8efe747413713f2ee60478dbe4da832b20cdb891fad803e5355fcb27b8e7cf1c5e137e5c1a7f3c90d1ccadf31b52e66c8b42bc7e1f9ec0fa41b81a139b7df2de50828dc76b82dcde2f632c52bc9f12285a4e111bb3ab701cf932d58e1600364518c44942813cbe8b41705a67331f94f330585d17619eafe1be78b3d3b30f17f529413759f60d401cda7ceead2944ed318fe9f6eda3d8cedd23c20b911d0b0672e481ce8a24651ff73cd12f8109af9987cb8b850af4fa5b53abd763529e748022dd1e753fb6d49ccefb15b3af5ec0184a95a57dfbdf63e409b8f14174c1ec23a9957fc1f707ec44f897c301748326e81e60d0583ccdb5d753fdd82c8421d25f6b801e4b5ca21cb7088561af7d31348767af949a4a3a50d3c6dcd49b1d38b791ed4f8267bd0fd64173666a0425c38984aae45abaa0bfd537d6c87f039c711c79933644adb4cbb9a2cd9d54a61ac4966e7ca1ab3fdcc8b39208534ffc7e55616511d6cd83c04027297bacaa0ba8bedb834169fea05aef6c60e00fcfec5f6036e2ddc385906c27bf640216e2bb6c1cc9819d9fdd72a79e7022d2506769ac2bfd715b7f155a04cce2d1055e972bd158f0d7e5d5b03d5f405f6663b7befae11335af1f5bf52746aa21feda062fd3850de1f4be8e2f46ce8f9a9a28c82ef69ab06fea9dfc9dae9e69fd5c04801558d3a60d768c3b934591d6a23c75e44003358e1cc26bd387467876e567296f001269bbe3cbe360a4b025b016dbefae9a974df6cca4ed733a95614b7aae9d25489693ba0573388fabfd16a668e70a8987394094e020a74e3ff1f5621da0f445876c0e2ac2eb003b31a2c11408ec4b079e4fb9e307c43dd7000281555edcb34214f92578dcc1eed5de37d193776a159b5861166b93fdf5b0134da18fbeb04e9da9c4763e936638f1fa32b4bf44df1ec74e13f289253c834be229d29badda4aca9e647ce6976693122e19e6d1f1b9bb1dd7bebae62c0e4b0d052da0e3aca92c5b6b3f960b492161b8e253e4760e987f019de7fbed28e1d195f4cf79024bab67c2a8ec7e0739554948af873a35dbe9df14f9261218ac659b592995e7720b5f8182dfc18184d840ae53ee0a547c1a2c5fba81dfb9f317082ce92c0758bd5c440e3e68755ceeb692057d3673cfc329de7584c09b3ff6f927faa8749a694ecee76237eb6e4cbf44b7d307115a08a58b8eb4e62def30bee36389198bd58590c3c82211d112ed711330bb83f7139b9ddfab92613222289536395cdeda2f2a3deb44c25e9219bb9ea28b13966037051666c3928865fa74249227ea5af83de3a0a61bd770d6d943b263257f90e53ab199e14549be41cecfe767adb6006e583e63748bb5eaf7e7f236d59e5415dea53da2afcf0c954e25884827394471952496f0d732f24f8dac53a69a644597e4fd15cb52cf6f8ff38539e161591a21151989c36e9020f0f0bcf48c0205a89970a8b67e5aa4f710ca64512da69bbb9156bd83657b21a681c9904151ad01019d1a4ebc36280e17ca4b496a97576f8d34e2671051bd76176490acb6820bc4f5053a45837d5b69660efebaf2b90443139e40dccd1275fbe83bce88e0b79eefd7846923a8de652556714d2f660d2dc4f34fea54f62265218d59dbab4c4ce6e03d7d1f7f88b3c5e05d73cf2d410e445380ac4786380beb859b51509a55cc7424ab51d59fcfa80e190f98ed1b2026d87d6035f0d71f2979a686b4c5cc89b0b74b95c5143ada159e4dd1533f9f6ff16ab0f69f7ecdf815aff2d3f693b8748430c3713963a734a706ed47352f20acf87b8cd82b39e16f5aff09079942e492d1610ae2114c8b6bb6c875d5a1442543a67b6f798bcaa7f163d747960f7be77102d8a05cff274debdf7376014a1733e085eae75f13a9881abad93d03db77277ba2f81246559c65318b687c5e7200d2e0016a72fd554f1837ea6557d58ffd3b2f3c5fef32b70477e94537e741cb9968eeb34a90c8e323bef55d1c368f9f568908297085968607ec5f9762556fa9698c59163bcf763fd012cf9d6e47a68c1b97a314ca7416650f4 MD = 3ed79e61d5843b36b6228023670b333208cf9bf556b1d6fc54e95808dfac2402ae06fb749e45883f21211ff41b28cced38d706390a398afa8f5eee760da041f2 Len = 14488 Msg = 1297bed1f0bd49803921a12a636f92fe2d7a7a7484884e3ba8f0dd738be8591d7a9813d0fe7386ad05c697953d911b99c1979ab1f7b152b1b8677f7ab2c1da6d0b5b602647b854666cd88750640dd7d9a20af67a093d6d27095fe0850b4993580f092d3a9335bc93b77ffac5a08acfa71afc163581d5a486e1ff86fe5c258bc4ccc90376aa91c51c2fe2775bb8b009ec6f95834c282001b4896ffb4b6e00ca9b8bc46841547578e9192a867a76298f8eeafcc425c6c78b9a49d8c7d6098059c39421e7035889dbe3c07eaf8aa09a6977d35a612a23714a2068627005f44d3f262f0905257f74f9f06b077bf3ffae9d8d72d6e3c106c7472f30348042f91084aaa4a44c0d91dfd7f961ed711e5b0b35ba0e99d154387089ade7777ff4de7131393a19432456717fe7eb571a717c5938e4f1cab34a82151884d652f3826c174dba3b9172d295d3f8a0516dfc552941aff56192120baa5efd9a45ee66566babe014ed33628018ac4a0edb59a1332c6aa1d4a71974ff78f23fd97c725fd7a3d4f33199289a94a5a57e18d14091714b7e16690b86648eb67ae627c207676ddc3b8cf88697a27805669aa57a4d52794f22179cd40167202a9dfb6e61d50580dd88b651fea903920096a99f1fa56eb1ff00aa554cb4071d9d0485959f03c1786f6276244786444c5dddb0ed08736d8325c0da7cb9c5cbedd8578c84c5ba23be5a71d659aa55ed0de6e5b9777dddd556870aacf9645c3bf8a03d19231a21b4b8665eddd96f3f873c6153cb25c60b3091ef842ab495a2e0a6c05e325ae861fbcf5ad1938ade6b994397d2efdf2a26059e23d95b9694be4160fe63e21175a1806b007101553f01ab8950082c8df256dde4ebaf4785a8d9e78c24f42e300b0accf51ee72e22d92b4576539d8a1767c23fcb11aff76a1a1b5894f8b8209ff0c466d37dda23daf50ff0726a3a1165ce93b3bb5b80722e32ab1ede4358bf466cf6d66fe5f3e663dbd533e55b87ca5f72f0c11c93cac0b738b2c1d4cc7b130dc9c8a5301eda81a7d3a69737ef2bbcee9a02f2567f37eaef7457c7dc5dca25dd4d635a7def36fb8d25aaa3d0eecfeff88df1cdd1e86df7bd2ec3ba60bcedfc9c42ef7dc021b05dfc1808df19201a6c6694e4dbf69514ef08ad1d21c7b28ba034ee9397607cefaedef5e9d3784db53a21f703a22b50d5dbba3a8e8579074c1a8b9a782fc5c89cf61a047408563c476110fe77acd9df58c2ba1d3e6dde83da718b8dc6cd57cd5e3e988dd2051cb679ea1af16881690b44acf09e54615eeedaad1b11a4f97e53de8d40d82a523083f3dc2917fda7419c41a14405f9e9610ff7d7226c3a3ca221c3ebfa2da578fc6b5c3f24b95fa8cb5af9aa9e99548e4fafd7f68ae7b11d2b00b660aed36bfee6365c1cf21fb60c6e0d11cee6a38ed7909622123aca312581b85ff54413a36c58ab9d7a7d912959917c3416046bce4d8c8c81341a5de1da0c1165b1a435754bb993c461ac57e0199e700888e0393d76ab599b6212e8eac634d3719db6810a2171b67cd967b804d3fcb1352f635503dd56c41aa60ab2747162c52abf633e8a79e8dc6beb96fdbd101307641073064707f397a308ea04a662fcb0392191b61dd885cd399e226f32574b3a3d35f996317eec98e18f9a26a8216c5c45cb292fe9c8b2508ffbf1538c300c1167a5de4beac9a79079430260a3361891f7c314f219d0d72f1508ecf4f223be558b68086e9a708e46162c0bfabf2a6a17f7133847d3795a3072cffb998db9c9ce5087614668fb07845e539b3b2383c8b5ecc37f753f49a41c4e580789857995445f09d01d7df37c10f9bf9b6cf8cc9c357ed9d0c687ca1dba53a9f60d01ec8a7f5ff63c3901e054b39078f4d5658a4d5d565f1280d0842dd427ccb26d29981146f9568fe31b48f735cb878cbe934743f61c5c2fec45fe3d3072c921f126079063d532b063f3b5cd5e51f34d6fa98ae6c778d90e520bc0b398dda62de120c1719c9a918701b2ae3ef6cbc41e2fd0dc9e9a10dd97fa4d52f9d10f6dbd843e4c1abaf07cfc0580bcb2c4e003e64830c4d3358f70b22b313d75a6b126b823a932f58581faf7b68465919139b78f00f0caed619b9a472fdf0891de6bd7080689fb68c4f213605ee73443257de800a0397654e6dc643e4c803bb440e48a9475052ddd41eecf1f43d0ae3048559e216f3251708cfcd57fcb3c5e4596c54644b84552bbc21b371cad685dc0c269e2dab704e2aa1ba0f6f3f43afaaea6b514001672f16a10215240e6d7c85c5a60bb13bed6b1685a72cd800ea39656395dfbb0d9b49352f3a929713544776adae332b4ced14713121a650f639ebba51665033c4732bfdb325bc298e1d7f35408994ea52d1c2b140b40c3893954f0030774348ca915fd6d97de279e33bac380ac2b17ce23e1e5d10d8bf1d4d9edbdd8d23297894684d570e8db606973126f5890409518fa45feb4e0a3f6da8b90aa8c4049331968a8d04ceef973e3e90a80427b81d169f872fd244b31da8196654087195e102555a9756971e16af3dcc77d MD = 838f976308b3e38471c3b4d8e5422312e4f56429b381f91b39bd27aa471e91a6e3ad8e313c64e6987792416c44a2a0e06afdae11a946af8b12c62f57af73cad9 Len = 15280 Msg = d2860f7959d1d18e4ba3a08b56c5b7139aa164880349012fd7bb268e8b641d19dbe2960e1a0e9c9ec63ac84d5fb7b59b799bb3e411c0c0851d10b4406600bbe29a5b08229d41c8cd216f552076c1ad75a3f42223b5b1539f57c75ae7a3b947203878ce7d8d713c6485caafcc43e987ea3f37180c9923a1c5ae69824aea94a91cddc14ee790a7e0aa19d43f196d392b4076e9fd68651e943e4a7d9332e19bca1eafbff1284eea9ce906146bcf9db981bf6f9438ffc1ab1354528bf56733d5906dd9f91f077142586773139cb57a7072b153bf339953d0074dee1c0fb1864ae45381f8414e9eb7fc6e89573b94ad66e45c49f355fec697567248b74bd88303af16d042bdc37f5270446f6aae34dda3c00a7ab706f5c008e90b85e410a3d107d7ffed61fd2fbc1a9c314ed45f5db330ef010d93ae48e92aa860d02bc7db185e465600dd6759fd18697f4e1bb4d7d61458892b0fb5bdeb057bb84f15d6480211e263333c650be952bd7496c91769f057e2ecfcb4841d6ba14b5d2a29a6b23527956dac085e0b28d2825a4f65efdda6027770a709812f1407fe958aef9fe159a845be93c8ba2263a09e77a078a4f9a21bfe5f559715bd8b3e7ea997f0299d179ddc9c1105e01842c2fb14b2899e868cad5eff2de4a88d7b4eb1e178b3adad170d41504e463ab56c427f78ad20444b0bbd8199587aa3698a40818456c191da00005c2271132fc18a2714edb8c60012c8554e74fde16c17601bd5dc58a03fec7a7e1559a2f42703437aa1b9fb0139a16b7cadda459f6d5fa6e7942fa7da1dab2f90543f0b728a4440420d259f5c58c19b3b8611583e0d0b04aca8c66af795dec43d011ad114c14c28874279cc5cc33a0099c1625d46b3e12173f8e9ca7d0e4fe48e04331f6332e3a45227fda98be3d4439e47157c3dc9aba6436cdfeff6f0c4358945d21be646d15caaa4f95f7020570c52fe72dfadb62f3a25ecf200e9a2065f38ad3fed2565ddf797a1b41593e38a02becfc1ab1de2368620606825df8edd0ba322c1bea8f8d11e210677f47d9236cee9a2490b16b587323cb08a885f1b10e1d18da1b6f865737851bb8a24b5972318db6053251f97ece581c5a04ef1b16988cad728fc9c168cae2ea935ccc35819879def2721c0f02b47f885f2a21db8aea996e69bb91c71e367c0b6c015303fe0c336390d2881280d01a8d9c7aa6c98a8eb3ea4451401e0424c10cb722683b23f75ae254d62eba75abb9aa9698e65ba1ff7c9f86d36d1ca6f0425d19428441b00450e9a2ef685d5da1cd4de1e779184db743fc95a461797333808ae6e42fce1e9da5d82f90cd71b54cd605e2f8d765fa30ba801556d58ae5690bf4c489d326cc3dda3c4f7ce6adf92764613e4f79eb440640d87a6d31e79a0b354916a606e2455f5e8486d62c58a5abe8ce484de91e97b267543959ff05fd94ace671bb4387169cb35f6a6f07185754d3cb85969d5681af9e91d6afa57c8c8fc36b5a5c119bbc50691b6e9a1f437abcc5d79a9c1f497e58770fd6c0bda1c367293634eae986a324f05707d9cd807c3e3f80ebd0d76e0a67512cbe4fb01c4eb54ed585fa43ee6784e980cab0aa45f8739145fdd76e1aa236ed76f1af15426af494d7e1fca91975faa5272bb13e1a6bd77b9545024bf5c2518c8d156165cab4af9babcd8491be6af0c3b8af5de16432e44efd5603e9760741becdae091a0bb830d3cfad04864392f1b5c3da094cba0a249bfca53ecf21dd8204c70ff8ba8bf232ddb2051f0f2f9a880bc71065c8924e12e301b725857fb19cfee7cfd2cfd1df300a017a1684f8fe3e2630f6d5fd637b29a4bb005a74e62fecfdce7209b263fb82f92c508d90361a5ea5a001ec53d41de35177154045fba51c91e97b101ab8b3d61b913d06b94d9b940a82a61b543aa2ea89c47a695136bd864ba76f785156b493f1ee93f458c5ee68b55777e5772db679be2184582f1dd5c49ba6b3c50eb46a371c8309f907357f3736acebcd4513a54b5f2ce77f48279a41f255dc689b584149ebfce3673cf2ea9a2ee1664546830bc9fd34f85134ca57a8f0436df59fc8c646e0cad4d172a4ad0bde939befe402666018d85b706d9caa4415eddcde846c85b8bb6b32ba40b13306f641e12fb60821b81295654f6b151ebdc3b3ad85d1e9fc09ac5ca1a41fbf1905d65ada87350ada3caaeaca60a5aa01709a4354ae109795d4642d96016814cb932f7cec78d9910c682246ef36b5e21f06f9fb6699b91bef83434c8464c258c74941f69b971c2124c5293848440453b3db737a57fb43dd75a0fa37f140b6f19872ce766c448531afce104d5a1b29555c88871ead253952a4b7d98e5127ae85cbaa156ad313ad5929fd87e4b91e9d8d9578b576daaa12220932619e488c217bbd79b7427486ecfe1fdde0acd9e0c952eb367f01751c66b22f9b43163bd0a849fa4c44aba500dc96fde9caf440e4355bca4c544ce0ee9f99646cce54bfa7bb871ebc1df4f933e4ba40ab975962ab89febf24d5c7b283252e542183f82873d3a97723d3ccf572adee848de64ac3a90fb2364a63f07e8ca0078b54046f1ac77927b02de6720e5f809a362b3856e86f6f1ccc379f55896d98bb667ec0280b1524983624c6a2c85d1553d1edfdfc455100a4ed76d87587a86790620c37c18ddf5e6195c304dd97edd491e450b7a MD = a163a7136bcc92589303cb15e26bc6ba7abd91b8ed194e2ade3d47f381191dc402e336c4c1aa8c0f9a2ef4149b1e3c2452d195d36aa3b96451e5059f5985ca19 Len = 16072 Msg = c7fb2a67c42197c11457c8fc39a2f974f2577b44bc8e5a5b97d43ed30d208f7e7109dcc165357ea59e15782beccfa2e0747c07b240948b02fba6d1faf54d5b216e5ff32c10674a18bd56e0758b7523050d9edb85d5acc5cb36307e114f66a39144673752cf9f4541f882c683207bc40a4425c06680be52ded2d90fc02152aff57e8770d8a9c5b549d701f3fcb2c9cd17a27a7efd4bb2786457084aae75fbc776a1296569a7c2e357e23b2f894a478656ae03ddf13d7080854b27f9845248333c37b4dfabcf7c1794a29941d2efdd37edf029a5eb5ee1b268389de2e9c1213a6ec890a6462bdc99279e81f37ea9732704f0549d92b7eb5536a5d2ce86c86e2634da2482e3c3cab0395e5c0b3680f19fc437ed8e8f4f77b3161b2e840372173db7f7da3b2a9d2fa5f26b9352a17d3fe7544c5a40892f6e12312119ce07c405c81fa61998c2c3f1c0794c8c9068a74547ddb7057b295db6bbaf3ffb723ac81e0e94704a62543dfa49f789b18d3207ec078701540717e339f6b7fd3c3945854b593ddbd3618711308893ab6910a8a31a6e79b1b1abfac9dd0a71e444ebd00375ef42711d5d04497dc576391be37285b8c5dc4f83307a158c41067b7b50824b8219ccba901e72edc847c7bb31cc37b5af54d763325f40d12de19e4a4a2f04645c1f033d946b7a03f957afba12949f39e563937626fef404a83360da1752fd56e9490e82920ec495f73d56bd2603541b443a380fc6d53eb7e57f75b24b7f162a13df1511f0cdf7aaac41e34cd5e0fb63b321edb77caec4f1cb0d055b4f7ff7e7c02842731871bb4bffab7fef87f53f17195fdaf5b04f31ba4424375b8a1a4795da6dbb2f70c2ba7fd8c2512fa408c541603d2851c8812b1a380d333c6317af3d48f6a8cd6287994e1fcf829394e238e86f03ff532d0c5a1a8d1122854440d6e5f20b32d5558a03c0bc1a39a4bf4b3e152ef9868447b868c12c762cbf945b6598c0f481d0b1919ede98eb9fe88e0a7fcf8566e66b7e4dfa18fd847871ba31035b9af8bc46dd6512af998adce967e9a51e5c9446913b92bb25e8852f23208a593868610bbd43ce083ba83e172fb3ae550a9bc9cf7ce45050f2d6bf785e2d2e0e36127597bf4a93288bae517840db22399c2a4ea9b6e34f6487ad7b7ca849e4cb5d807d88d35a7e19a6910928a6450df9dbf16bfbc79e579dea5701628cdc7538b69bc00682db5584943baf4fe95b373dd0d967ed357f30a325ba99538f4eaafc484988385235e1105e928a148f8467ac81c88ca98aeca11f40c08b773b0849c01c731b46cdd1ea660b80e4a0222767eef8a720544d4f74b941501ef517701a2b3802c2597b15382da3ec031b2aaefdac3d5f6c19070f6f1832519cf6abefe7e6a6dcc599e36a920e2fbd30ac2d80f28e56d6b81e3f945be51aad4ba180ee76986eeb6c2d8d39c1b1b6ddb37bb5050d3b4df64c8b7d46ffc7024b741f1dd390ea9615ff3d01e88ebd4033d4b149a5185c2aa66f894a8d2567f1135e970a07fd842844c5f3c8e1bedbd6a7db7672c8d998f3cd6a402cd1936cefed5332d0f3850d2b5f0775698a1cb27e210ff1b6d61a98b25585d7ad7a127f05c19918f6fef02ea84e0deb6c4d6feb4289ba4ba037a1036e25087655f06a4839777970048f058ea6f91f7e5a917e2d2ac722abb553368230253b47ab9b636e95f73b6283108dd62d488555b9bd12213dc48f3a7f93a3bdff3d666f37e4c59a21292718fae851ad4623869a143bf36e83664b20855daf5be355d01981315773e4f685b7f17f16bcf7726c72f072e9bd04969d844f1a2105e455c26b12ebe2a2e6449c6af03da7aa4a1d7d07d7cabcb6c93dcc8e6633c2620b25848d717b2ece2ffdb557808acb20470c028150ab3300d9412168510e5a1b5fae5ea8264703a0c80718a628ce49c6f5274208e47d18443c8ce4379815b1d7e8d698e4bab929c0b84c0d807171ea435c5787c219a83129fb045d26c4af8e3faf867968b43867d507b2dc0de2db7640848217da7a9447581d93d35a5c43bafabba74a5d9c2b8787bd23cc740374b56476913b768caa2178aa2090fee83bfeb1151f54eafbfc4f80e38626de5ca56e58396d3bbfd9508932ab92da38f0fe200cc3d8dc385712886581c2337276d46bc3d5fc5fdce8ef452e27d3fa30fdf4e8b2cfb82d6f3bd5fae19dc13859d86b724e5328eff541f01e1326ca38109685204c40a98eb62cad6c9a416a80ba0ad04ca1bad832346db9dc8ab05fdbfd44198e811f924635b402a73874a552be956dc16312f471bff3b4473ace7a2d218e18fcfa735a9e155a3c74643f5af58c00a8983c6363f4be5b4826cc870374a4fcea305f44ebde7ea6c399c6a871b24ed3eb9bd6b60f035a2edc43e7e4e2f9ae16f7f2579b2c4e972100de05bad3d129979d90d612dfe6baf2da6434eb00046565a80c8a7f05358952590dc97a669a47d32540e780bbe40832a9525aa643dcf4706344a1f85edd7bc237ecbcf21354d00fed73af078b476973b1d5021d94cb81bf9164440e1f8c96f703458429c349ecd35cf0d6af3755073f5ab4d457dc1735db9b321aca318b027b23dec9275cbfc1a8da810580a8570a1d0cb9775c0109374be777cc337a22e6d6017f34f5c7ff7a15cfece483c4949a962faa9434ede9b097dffa0151e3986a8e03f26c9aed513da3a3fa1abf7456dd312b50d2e886ffc748ea85622d5437b82d93fe1a1eb5fc32d8bf73503ca1e3fe766873da7eb692a5e56fde97ceb645f53b186ae68a064a833f891f2d03318523ed4fdb530163ec71f6d8ce473def0b4c3efaff77e5ca81555d MD = 0a6bd4a3be10c690ba358fd4abe6bb3b05c6e74762ddb16c96122156c6104102a0f4da5d119eae98c369b4a39bc75f86f76b829c7efa5d35b8c43dbce18a9c45 Len = 16864 Msg = 11efc562e14f7a08dec506d17a527d537fe51ea046c528cb292ef0a83a3f2fd43614a0f5b42fcb43a21c1b48f25437e391638f93994635f2c717ef802fec8aa22efc71eba1037e9954e80f63be9d5d72eb4809adb9a0f83947996140ab4324f2e3ef5eca0e953a13dd720aaa44f5960575dcb3740e9b18a791fd6e71160da6cb3c378f1c65aba8b8230233a6ed248aa61769b67201fe3e458e8b3d9ad712b736211b2d680d0e6f900fe0b2de21f1e25cb9353a2ff893111a248af743581a003a7ae260376e8638a38953b0da49264630438966325c203a2e3c44c3f500ed29df2fd54f10f0daabfa7aa45523cb895d289dad6203966e6089bfffca363752d92d293c237bfbd46f9cc81cc84011e3d04fafe9572a0c452c34930433916513b82d4e5f0300f73a2d915d0132b981fb46aa62856d2f286c4636a29b278bf2f66fe6878518284cd58ce21f9bba17859b68439cc8cb9b51ad5597d20bceae47c4a660bdf78a7a626d3596f83489e18489de2146fc9af6eece015f0d9e4f81ca4404a4d6fe807fa2cacfb5cf12c69fe68e4f4c496701c66998f4973a9ad38ce44032b9bce022bd72b303488b7e9ada127264cd8b51299529d3d34741488158fd7ed8a755e599be3bf1795516c02d1872fdc4abf60439ea964749750af0826c7ec89d778b570d0a664dd8e75720a6e46df717ee71c75a4e18bbfc2b7cdafd50cde42930447ca527598cc90336e62dc36b27079fe3e1b44817f99470814d1b8d549a25da6a9e8a9f7e79f3b39b59ec3fd4563ac4369b6e60fbc7ba4d009304aa7ab4397ee403e4fa3cdbfffe6ec208df114c5868513db11e2cee16c8e2f2df2fa6f80c239af3dabefa7994ed9769ac2b88d10a901c0fa40b13364fec0db3d4a5423047d174b89475221c5b86ff96feaca2adf8467f5870ae16660dbe6a1d0d93b52291905a993ba61b8cfbd38c9126e9c7a7c99162623c8f9e48fa48e17aaf816797936934ddf7da4d911ddc27a14d6b6089257aad73313714a2bc915b10e5f7c056f563eacdef9820f369a8b9109bb8d319b60748d4772dde3dfba1be29d57e28295e8764b14c68fc79863f2824375a8a2021421bcd35f966e16081f40ba79d07d676dc8bd135d249ed1da95e264ad9eb6511330fa5932412559238e3fe84ddc526e66a4574d35f6f15d5ee415dfbbb60b22ce10aa6ba354c633ace754c94c5cae156397be34e96d6b95717bb13738a50cd1a54f516d2b47bd1004c903bfedd7ecf6d521667cd00e6a34b2cb38ed9cd237f8494b93e022a06688bb91e15ebad4ab7d4bcfc467823089a57331018560d409012aa3c66731e57f0841d062082be9463337f17c87889a2652636bcf712d111c86b9d68d64d18d531928030a5ec97c59931a44d37f5ba1ecd5e3c9e7334a1fdef387524d5b7a0e8f35eeb84eb50c04622763188d9163de29aa84e9ed6e5056ccc203a57acd93ff8fd9065ea3cd7c27ec6ab31aff804995894ab73a4664c86c628ccf5eba4dc7c6d18cff74adea824d44c78a9aadae759e68210b3986d92ab74cbe3aec703e8e0b00cc3a88c1aed6eb27e84a361c7e602f62e7e166231defddc7d0e6bd31124f227a115809838cb297f227826bc09291eef5e9ea5ebfb59036706f536f718b93a3b9e6d8756806cdca201fb3ba3e7d93439db186719122a457d2d3f161b5ecf4054cd72c6af3af80f85e3b6e9fea81ecd3c6d9365d5c07b4b87bb9514272c8c8ddbf4cd4489ad964a8f905038b5951f705fdbb7a5084b719eeb799e3603ca1ba836dc2609ce226f1628cf7230b0f605a50def2d3198fc36c5132c03869880a219cf4d231e64e1abfab869c4dad713f7f5ab6f9d116f1bf248659f6b0ccc964a690d0f6f8a3532717fa727ed3d13331ee6a224ae4b73f0ccb04b997fcf88533a1f57e9b055275de92b5ecf96614a9fa2025ad609e98ec2ed832ce1e7d7b5019bc317a48f8824a93d894329664f65a0aad13b4d56f2a7db7d4c70404a2c39e694ddb408b32a1360921ebfff060e4d7c5edaae503c6fa581a3907e7e50d7fe4a4ef696ddc543dbc813743b171da6e87be7a519a9636772fd87d9c063a2dfea77f09525eb6cdc6629e5121d3a542020e76dbae51e74e2f59752ae9db6e84ce7b4a343c9fa51fb9bcd3380ce305383dc0617a27b7817e916962c987d41c926dc488f87ead11bab62fb2347b7c1c1d704220ee4417ef382bd443c1ec8caee76b07cdbe9f03973f1a3faddee3fb547257f817a08a1fab1b8d2e7abc8e71aff444d98b0f143fa01d746138afdcdd38c74376b829602b2f8903dc8a01e40f9a3969ae435284bdc6c64348e52fccbe439cc132a4e17cc707114e62f44a93c2f82767fa7931570a75da053b35c74a0b0f535fb05071366fac44bb663bff0438345ebe42bf1411b227b948cc9d1edb4ff69b8d743d5103a18983d93ae387bbebe94fdb1b67832b2166f47c81ad8ed6f993c5c8f2ddf98af9495f36656d7d313a816b5ce914f729f4be0c1edec9afe3946172a0c0b4e322d35647418a4c67fac09741a2404a0894889770be4883fa77acda228342549671cc2adc88fe02a07efa95635995690fd1798dc2c9636ee719af78460f0c2f9bde50417f8b5522ef44650620c16d14958723fb62cea3ecfe2018c66da292b86beeec34b0b7142f7cd18c543aa84bbf321c347ad14c7e70b841754ef9dc5a917f2a0c6f109aaf7b01acdd19f14c95db5e171796aeb177acadf4516c8b1ae82d4e063d7b0fb4aba7f64cd3c1f54cfffb81fe49b95b9c13f3379f19c981ecafee610a0bc30e838d38c317fce6a707ce924638475d687ad7e6fdc85ac08ec0367750abd3e1ad85c8a000c4d4e2973ba622036b9d1d35cc37fa590670fc0243f03a857242516d39e26037a9e86036270b3d41eeb753740eb89fe1b018d67ce681ca87e3b39cbe2e6f1bc05db3ca147862569a5822aa83b0de6a207 MD = ca2928c7468e8e421b00fb128b1c114a983745f9b20521e8c8954a68178ccefc2e81d0f0c49255157e9b86cf09e59e187ad938ffd35664f9a3ddb471b85ee250 Len = 17656 Msg = edf5557e15473b747a819398c9ac1459ffdb4c97d0072c124a16c723b63d57aabf888147d6b7dacdd44ca9f3e1e2ef4d95c0a47b5eae44a122088a1725107b612c88a761e381accb7c6efbda997cdf416c26bb651c0393c96be3cdc9971b398c7d1d5034044cb957b90e12b3b722ec1dca3417bbd4ae21736fd219a3d3069813fb6e032803c00a5ad55474e7047b1fc9f81242e64c57f68874fbf50ca378a1deeba448a5a786a6ba1669abdf48307f2e3ee9c44f4da51beec386e96ccd195bd598e6a713b7469561c5753f024be81432e3e1235d9e40978fa49c7d2c1a92cee1495da9dafca7e035299fb6b7d44ce7be3121e97709d172515e653ab2528b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf3384d8748a7c37c493aff0ddb830dffecadd779ff28656b1ea511c276c5c7eb5eba596d882277d162a461c872f6d3f94e5f6ebff974af224c049c47e7dec886c43286c35cd16394a59522acc14a1fe4ed3d64cdc03f6173ce39aa273f195858ca1d70194559191e98a9ac1b54f1243b5fc45403f20d1ec83bb0c5d11aea09d9b6f78fefc01e0ad7a24e78a48c908374fc80a6f2fd5259a80b1669e5d9d55f72314d40a76b94ab6858f012d8f68cd02a7a0ef83b40a3848bb2b720c61a6fbbcabf8b3ce096518d49332b0519215a8cb42eaba21d6a7541fbd92f65024b2db13bc83ddf1bdee932e2b77bc9e58b9e0baaa0f34f39e95bf470d4fbb11aea73e25dd1d191c9a3a00edd5c5ecbee93abef9667825a113bac1e733c889f8086f6a1a962e30f7a932aa38198509564d828aadfe8c55d33dffa427b86727ad39f0a8196f1eeb29f1bed838801ddb118c778c01fab28b30254cae3023935fd749143f4af155105b7ac7d11591f62a94af030b1be3549160d28a292afcb3f71e41c179d6a33c67344d33def6d578be8abe0d512341d92d0c4c9f5b3dcc31b82c28e19ce50d39ba5d71ec4703d20b5f99bf7ca4429aa928dc9c758d8f19746aa6065bf19eb8b5cf7deed854661218d469bc3a4d9f782c4977c9f3064b6ee4d537e317c02a2b196f3dcde14d441d05e6a3bc2e936462ca5a86db00109750e9c085c8fd51b1eecb624515ee79c8793c5defc840c0b6e1eb21b0db86f19b49ebf538bcf5eb5a8a35703ccee62117b02301f4e7581bbf7cf7689ed06cf281e0523af9c8e7d74d86bd61cb01b38d5c4a24995b215eeba7bb56f5f7c29a5b6e9e865870f3bb5eb36acdfc99b53c05bdcda6efcb7e3a799626709064baf7748c09ef17444559c6b4bfcc0a4ff269d162c311c9ed07d50db346ad038dbe6d8403abf63e1dc6a957770c225394c0223874b3ccf069c315ee26a2761519d9e3d5fb0c0197a57f945b25d9369f11284f831b26412ce6bbe36618c2318db11042ad9bb27ae881770018e5af72b66d31d8fb7ea3d7440cf528bbb12f4834fc6d70550b27c7fa5cb6d7d7e0143d6051e4a5e5c6b2f602857bca36187021d2a3f7561574f35295dc45ffe03d93ff6465479f8c1adb062cf655b31f760d262f4db6dc34fe9c8180a92b627b25b1218b5065ac37a3a76f8b0a89c9bef28fbd12a3b3ebfcd0acbe856c70e6f0c0f8099dbb43b52d899d9ae76721f65ab57d50444cf569b313ab706acd1d758635ef20624deba3b7f346ed08b524203de65f468ef18440a2ee1ffef87339f687ad1ecea1af645c1d0928d1b59d9b31adaebe07b63a6956118a92d2f707cc50394f0e7c2488b6caa7f5cdafb8c68d10f33520fb84ceab95480e8b532f30df6de5444690b181ead49ddcbdedd7da02a557a2108ac25652e38ea393e968977834d2b34e741142066146e97ef5db7e03d8201d131c3679672a2d7131fc69e4a28d4ac5af8e0c72155beb419a2d8b5c969198d0b319a9e0f1516b9fedf4fbbe626093a2f04869b91ca9d40f99ffb11cc6b805e177e9e433f84091564f3ae6cdc295f6719909f2c12533497901d213669835b078e7f4ac1985dfe6bde034f2bac915bb5b33386d2f37e192a75c0d7be016f0e1be8ca2cc3a9e16b4fd274be62d7fc62a87453fa3ae5b9bf6c2311aaf3547d2e0daed5c0a3f4ecd413dace78ccded918b1d57855ce49849bef20960770b33c1f4f5938830d09aecd7a6f871aa431a5e2547f1725f79f6d3335e6b479d0be3a66637049004948c5bbc60924f09360f16412b9c6e76167d219a2fdf37e7dc5e6a7ec7cada4f342b02389202eb714fd29f27f1dfe16763361b3e8ced981f26acf384ce6dd0d8577fc99564d1acaa366de31fc24333fb0728aa669e1ed20b93d62bc07373d869a6919919ff86f97b92e7c971c64fccfaab5bb4598df94d74c9e3f97adf665cc8c968580e8ba93cad0c493864248b152cf6d822608007722170db44f939cdc3be670cf0ba2fc3dc084b9a1a41057f745991a6ddc39fcea7dc31c7f686aa31751328864766145b4154f8e2565090b4524823cdccca13d8556bb4aef6695a19da8fb6dd475962f9d359ba2ad4d9eeb118c25556d6bd04ade597a0982cea700d5afab619d7dd4025fadf3a797c2446fe2c8fcf48e5e399d3bd289d8d805115955d1bd343de38d6681ead1fd73679c124f87738abe085fbd447e65596dae5703a4bbbb36246b34d49a78c124cea1f87aae2423888aeeb5238ea996dba22efaa838ca2fe7ef696cd51fd44bbe1805fbf1854b779e6395dc5850d08900240b7eaf988985da0d6297d06889dc19de08191f7b59fa0cd68237c451afc64741c855922a76577ceceb486f2b05fcd89f2cd26cd6dc258452384a0ff783d911b9fa11f8952d0f612c67e109dde5186ab9f8aa625e4e8475752c9593c8f93c0fcaf5263b3efa37f74a6d0428e783c950dcd02398481d9150ade3bce83c7c6992135e24d2ae8a4bdfb56f2444de8e8a1b7657b0574ae5c6b67 MD = ba3ad050bcbd2febe8989cd0ade135303de9d9a419daaa647f0c89e2d8c78e1a701a4f9ea3ade33ec68b28d4a6e7ff15d637a1a803d2de1ff35b0d4298519cbc Len = 18448 Msg = 8714eb9ecf8bdb13e919de40f963d7118fc580eacfe9acddcf99cf2140d1bfbf5119bc8fd011af63924eaf821664c9586544016b3cc994916d8d8061830146e7a5bdef9cbd144d94d9ec83fad1ccc8ba2a37677d3a390ada8d3f39ca882c1e5d4ca88bacddbb3e0f849c639071c35a9fa545bb070f619720f55601469678cd8b0e8398a9792f093b5b05552c4070096f9f1704f0046ac2cb6e7be1bdf610ddd7b2f61f7ad998367f28d064b684fc5c92e0554a22617c1443c056df15f11ad6ab02a82607451d4d45b1a49516868fdb7030a695846ebe14f1b38e0637cdbf3e6ec442b83805e6d7f4bf2af2348e4f0f7157b2eefe73594a3b0fcc5b0bd2269f88c16bdaf5601c5cf31a0982f8e3677ffe1c225c78b7753e8a9bb7e8794a788061c1cc9626a0e762ac8aea4d4bcffdb47d489ee8da8338794720f8b46a7bdc6a618c0df3b30b6e7386d7755c13983a3458a3cd990c1fcd82d86636c7c4ae7be4f0e9d5fa84eada16e9c851b63a874589f5f55877f7d35ae1a7351a2a712c7c7676a1ccb1818452d43d272763a6e4473abe06e68a81e7081f1a554ce4573a08a85b7c9b229323ff33ebba9e6c41f767d0199e20db93a2fec39b8d73fd602347030742ea55a00d09bd594a5fd8f107ced27084ae71164d655591a7377e732d600ee2bb6050918b97faf09e11afa05ea3c82a813754f030645d6469426e77a27c5155afa61d4fe5d17118805dfa35420f3baf5d638d0b9324647b9c39d556c8c255c6e564c4c163e0aa3ab6ebc098fc3ab267e0dc234dbeccf14008c7bbf7e85ba19e26414bce4dec2dbc096209b1d44bb5bad1471ea0f8858d1a74922942496ebe463ae5bc60ea1c8308416bdd68116acc10fa4f87eb8b77bf71a942261f35243224e9f91e5e8399338426ad45a5fdc180d1219a6516bdc90fae7080bb76f2a587a2fb257aaf608bc59a7fd14850de7558650fd0c008d7a405378ff4ef2fc91844273710d73dc919c1b1167eef51fdb1dd348c9aa0ab202f2a75ce45ca3202a5f21a66633def066bb030b15d4190a29b95a760a00ee6e29305d0f71b5467e57618e550c5b5ad5eaa1a81191546f5155b0a24528911a163f71fb1d02096b7bab03eefbddf455f1bfe850b164f06699d1ac4142bfdb2c4ed84fe7e23fa9708c87eeda07559f8ed838e7b3670b38ad283004ae0b3a6f838c6612ca1b6515f445806ab603fdad340df83836aeee8d91a103423eeb229ebe336b8318051cef751b2700397e50ae03e7604260f5997fb2789dfdaa8f03193ae87ae9385be1866191ee57aad2d9226d0923aea8d7967f9e33928f4753464f981ff6ddc16c4d8b482e48d9a0ae01aaddf794d5a4d1601da346738fbbc486a2445e81d939d2ab6ea764b8fea17c6497e517464fbb5f80ca6045a3677e7f2ec1ce088e54181b9590fdc9c13f23aa6c8a010cba7572ee631653a5b4bee5dfb92ea3c28ee6d2a396a2b9b20433bdc493e1b02c63ff521aa1820beb29fea862b0395400f609f007290479d1c454c667854f811ad545df40a68df78a759f2ca49e825d38762606b2b7469c9db41ad3ef9b23e24c70d1811cfcaa85082a28f911fe8a3dfd61c36d32ebe9c07a460e7ce94fff5225d93addec1e5852e8aa1474373ac164b45b7aca04115e53fbec9817d13e425f5b70ea4c5a7627dfa087fa5480edb86ff1c5b473a2d214e5972a603b23c08d7841da5862c4ae8989c44632e08b81efbe2a32f9109b98bde3e081cf6d7d91413b7d780d97d7320dffc86766cec381d7ede225c1176affb9dd4c855e153b0afdf762cc8281fe8b1590216dfe65a587f16dae0094fe7d5189404f9794c8e8a8245a966a5f87a72450f973bc724bbdeedccbf265fd4c5f58bcab7e5afbff02e344c38cb3ed3f6d88107a13f56af78930ea7733c862779d5fb47d3d220c3e1666efc0ba4bc40fbe40f4b0968b30ef73f8bafdf6aa5d0693e11144109f4dfc9f8d85e0b3846c8f15c97e3b8ff07c9a2aa0becebf8e558fff77538ead2529c10ad19791ed105f14009c0d5954b7969e09b3767802d6d46a2cacebbb57462811e4dda562db5214650b3332b8796327518dcb72784526622b97dc5a689394e165ba0c2fb212dc14c8a2198ed78265a75b4333234e1aff775aed9010050673be3306d7a72e0810d8d541d96214f4518f11b6950977d8c49c5e8a62bd1f1475371037ea9c354f92e90176dd5d1f4399472b546ba574231839dcfacea225421be473d99f8f463dd4cdd3cdafe044e4af77fea91187c16e5ce82cbb2e7fa613da4ed47870f0ff7748efd292cb9c347c269a12214110fe3f252fe4482c96100e22cec8710951bf7071d77482bad15c6e7115fc5954e16909e3698a2e2395f195a7ecb67fb33214bde21d3009f8302b40318413bdd779c0532a3d94d9bdffd94ebc3124e129028db41c19ab84fe292f75ca5cfecb433a62af5c047ae75624259de234aa41b55388f782553da0473ce783ae19241e12a3ee731b66c2b376b37507bc5fad0df29594fca7686cd86debd1fe7f411a02e056b242cacd02daba1e26209d2aa3c26b5940381dcbbf99dca67d5aa05d472616c36c930cbf91d97ad4d75d271e24fb8a0f093e37e7bc611dfd580ca3c64204306a5be833a7161c43680721ccb2b715c9376e739854d9ca9c60e0990c248109c7cc3eb6d22c063fae5814230080c0adc362de7ca18bae32e271a5944bf08ac3475953838ab6c8900625acb564f0e82fe301d7ce060490369a902572e5a2d5bd29a258e2afcff3da05413f7d5c8b7428b2a4e8cc18582641ff5cdea95bc3e8440937ad38d3e01e6a063b2adf79c92b04acbc900b6aeed6e1bb383fcc30dc39144079cf1a798f8ebc93841d502f3243505bc95c10703138a248a2d74fe7445e9a79f94cec1336eb6e37bc7563ff4f73a82a4bab6fcad7b1e0122d2398f194bf4300269542237eaaeb6d44d1af6c892258a2c41c6ddd4ad947b247a35be255d1aa9d8236914cbf53b09e9da086f967d5fe5fc31dbf19f32525a382d4fd2c003c3d8cbcbf7dd1716c5a6657608f18741515bbb92dc813791c26605f46f1511c657878167e5c644d5b453ee2902c5c36562b4116cb0d5c4524a6634d67dcd412d3e7ca2021b177aba71d92cfcde347171f9b7a8c841356dfe54246cdc624377c1e080d7a18118e04e6200c9f68484baed802e25ad76e95a1c4766560d04bfdc08a65ac84eff119f18f08f6a20ddfdc5625edf33 MD = a86c70c2063f12bddf997c91d1ebb57f5c55ca67614f397c1c52a87b0621fc4378c2eeb07732e5eb0fbb4b3c1fdde87e9ed71b50f83eeb02cba03bafedc84764 Len = 19240 Msg = d99f82296f56251e365764e1acf4d20728f89f546cebc6217d918700b3b418a30c2398fac5fb449c2c25ed68b020aa6c3a01ca06c0b80c48179413a1080a14baa7b2d29fe092cc1f539fb4756281242887978d2feb3b70593547d0eca0d7e78c5151185fe7a3256f53cca250ea9ea902b8c2d01818fc581a82b0a729a3a6f8e1b30a528403b7b654d5b59d4071ffa2c3758a7b0a6d842d55a3d9809f39fcb18174e468545b55e99681608e8e1f2d753365f8764b125a58d043ca4497886379343de84218180525fcfed75e831baf8c1a3113a92330063f54088ad959bb62b8c1b61cc817614fd34ff522f3658e0d4d4081e4fcdcef114ca89a20292df882d7f1868ae39b5fbc59570d47377c9fd0226dfb7158bd7602e696a2971b5b67493c8c563a79ea39d320dcef501112777f72684ac4a30dee6174e4c8f4962a3241505acd32734d181c90a64244686d3da2a4fa14e5c7157eb7605bb34184e47ef27b22947cba0c2420117caf2c26d61ac222eb02daaa1d4f8a11c30c86cccf76e326ae5220356f84660c28de0f329536665303bbad366c8965efe47ac956333f9cb7c4b024cbbe6177e77076f574f2b8169f09e866514c53cd6285a6140a5a04a5982d56926640e2d90c1d20e7d435c85a6ec7300be503d54cd270376ed08beb872fb1eb71ed3e3016e1f783eb3aa590bb28033ca6d9da3869a76bd6e0900d1cc9e61718ca470072b6d0c5480c8e8b35c03586b33e1519a4ad493f2b703229c0f3242984a45eced13f4051164fb82fe2f2fe183edc8108409e21b4dd289e27ff8d50add70719f0753b996196bea0d9bdd7e980858705ef35c695919510bc4f0020d46cbbfc60ad853142be6f602fd1eef95f882f478915aaad0ea0fa2f75e8ec33172ed6891b4f2aaaa5304a3d4b5e9ee0c9f6e524f5c3c8d9f5a7b58daf3cea4f81bad0b9321c8b2d297ecf5eddcaf5128d934e273141b7d4b06f6d32539123fb7ada52918e5dd1423672a5cace5b1a191527135725d79e26a9c0cb274a30bfbf6a54041b1559237134d27589045a367dc77adbbdbacda555466177737a61e523b9f18d5eb05aaa438b67e6a4690f70c40d534f5fd66af6ebf11c181ecd6cbdb0cf79966248a68d3fa4f9a122e4c1f1784e7c164762f7b67011b756312a9870ed15b4c630c386f5eee5504d0b5cb9e020f1bbd97d47bc106a0dfbdbb3782e2663f16ac6cf0b420ad6b7339368bb40664560d940076b012a634fb04caca1760698cc623d470622f381836b1b40e89cab6e029ef2efb80e2ce23e9e54248cb839160f65d4a19e6ed977afc18c9bcb15d6233fd1983d152a3f70428c9924213ce765203b33e4ba6de33ea5fa8f814cf510ed7f3cd9f7699f8b94c344c3b34849360b69ac011841683a60cbe1cbfb538280522aa55e279eb337d6298c7bdae92951925080e6451da705658b3de910c8064fdca8d5cfd49baf6bbedd2d69a0ec225e823f7e8c7435726dd34cd590c993c7a4136294d30748db51d545ef340d397d86619d6f98ad71119a347572692c9c0ea87ebea912c78d7e0ea2ca998429b982f0b9d21bb5f6b9cbb30f70dc1b44cc2282a525de351c52e1cdadd4f503fd5278c511464a8959f5eae1eda4db4f16094d5b1000f9e40e7f4db47fccc95790eda92cf261c4bcdd0db44b557937adac3cd55b48b5c3c6a6fc08eb9f18de28ea735b4ee38b50f78ae9721acf57b7dc0d4e03a9d4ae0484ebb15a9b9522fc1f14cad7526c2cb8e269726b75e3a6258541251f6e3c5184c5e6878decea51eae315dc656115acc224818ee9851ace474f51ab71d109080a329d64e805250c721df58f4ca367733765db263271fb37e5e344c640fbc23a60731a32b20fcebd5a75bdcdd63fe9e9de4f7d238f620f4ac9e82260d614ef4e4c2f65d734316ecb6b92747d495e24768188716b4880dc6dba07f360794318ae970e843db6948c9e6d1d2287ee279e83e6b8bfe8a5f2ec097fe8c0ae72b0c6c109ba814a7f5fb09e28bdcfd20dc3e176d6886d80eee1c787e1329032098480ef69d863e8d9bb6233641b8448ee5975b9199f851d6a74f34da88e6cd485e7cfa0811333fe0ad02bc5e8df49d0d812e0b277a70ea662d4fac59ca35b7c30003a3c1710f8735bc592bc7db024521516accbb84511031e286456841a651250f8492bf47aba3114c32080eb361fb7eb8c606ba323951ce699b7672a9a927e2ef684d6e0f7821f7df15b79fa1a41e5a39c85f902e9a2d9024f7d6254cceba8122374a3a22f5725de78cd0f710492c58470a2df9b3f4022b9713daecb57777843a7a0fb04cc412b7e7ffeab1a9b1b3fd82d3f8436cb78df552880b357e53fd70ba99047cc734819a62f75b3bb88e33ce5fee5509d3851f81c9bcdd9bf1b49abb051cdedc3ce75d79eb0ba911d73f2a2f5091aab972cd45557f3ac88cda39fde7bc8de57b185cf4eae2955ab0802515b4e7669fdeb4f08de4d57a52847254956b4364beb5e405e641ec2cf6b44e0074d386e57ae624bf57c48f04121f6484dfda3c39d1391a62b0235a5ae3898b31c62fd196e26c4c5a3158ee507dba2b5b5b990955b36145f3d113cf77d79cd249980e49e35ced9681b92685f80bf13148974c2d70dbbad149d777be3c198abda85913425340c68d964dc1e863233100ccf1582af3c0c256d511e3a8e04fcfa7ee87c36d8f4493bc386d9f881a7a06345918418456f90431163ecc123cd0d82b7cb2932ddfcee18cc8a733e79676fd268d6a9ccc22eafd1a9dacb57c8a5330b2e35806f5cd461c89c77913795f806261da76ce54e01d195dcbfa246a513d65c8a2e69377e050c13dc551b2cfee4cf260b0bb5ad10715e59531958d4e49f5e3e74beccd06a1656c0342cf865dbb3309cdb0a6c6a3105bee3b5f0d74aaad1337994ee9183498fa6994b05122a55eb934e34ac7965d8465afbab4d06f02232bdd591c5a09843f96664cae750c394165f06bffac4e62eba986bdd37cd0d7149651a144be1577fdbfdea58db9a77bfbbfc8a24fb35355bebe1faf2b614eac29e910fc4893d0826bdd3f39ee8d890ff63d2a20ab7b59986619e6f93d2c3d03bbaaa7d4a869af25f2750474416f2547b95491819372a5cd8a235936794c3050424192c4d4be25e53a2dcadf16dd10c5cd9c9b3fa827ec47838102e1703fad1466445e476defb942ab5dfee4df65bffc9b7ba3a55a0971a8eab95084a27517e2903956d6d49cfdc0be9c1d201b87977ebb88476d19a5fa544812ee8a909b053d488738ed994447e1ec5ea21b5bb14bae9638f2f1777bcafc0444297dbb00097707b461162c544c18dd1c2a310081211ec41432ccf3f987e2a7b38de89242793246575bcb1e6b6ef7d95b220bba65dc41c MD = db7e2ece42b5186f84e6c1407593a9b9e2971aba7122b8167b21b31ea5f0bd21ff754e4fefba71c9327eeb19625702b64426acce7fd88467adc3d2b38a861abd Len = 20032 Msg = 1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b47c72b46537eb7cd7726c5d025387933bf5e6984ad3251deae49070d6b70b1f252353529a1aaf1eac165ad2dd6cbcd12948fcb7f5475e50b675c131baa7b3c4a5aeba90f2a65ba9a934ed8fe6cf0aa95ba0b8ca0c98c3d2f7c9cd741e1dc052b08ef703e163a7aa495e72f8b0e307886dada922f35ffbf1294113cc6391c725d044b70ff8cae99d16e3a9a1be512a0ab9b05c774bf57d57b58c428f4d9c2eda7f5079399b44b7fe9c74f02f8191e88cca69212b7901be6336fbc8411e956ddd38429c056b79895b4472c4d68d1dc99b3a28c5a3fcfd35903830139669361aaa758bbdf7cbd1d41f997db65b435d53b2738f88955a50898b1399c2e3bfd6abbec1ac4d754ed63ec825e6430246e90d7ef10e086413a400a053b944ad84ff97a69714d922670f1ff1545cd98ffa495d3d4d14b394bb50617c931f17784b2964ee8065df73a6e4fe07bf420848ffe6d999e24428abb3fdf27c3c2bc9c884eca9f2f80fceed70e06f97c1265db1aa59f8f15b0cc61d8ff55a2bc97fca02c4a1cd60888325f46789db1df47a287e9c1b31f001ef1a6eb1eeff17d58b96db8ce155939c60832d0d59c6f6e3de16f447932b02915b9413cc3367acbacfbea74043b918ae1854fbb4d8c9def99297b72f5a3a9563e2d1a1317b0a6713bcbffa81219e6c582b29f4f07f4a22b068393bd5e8e745041541ab842e7dd35ae30949b2034c1b0509508d62c5ce6ea2af59f6bdc7b78dfc53727726b6388e1ad33919657168815f4397396e34cd1f3ad8a87c596f31dca72dc2a8bbaaa0d3bdfdbdee1de46a5ba15a3c9d8554dcb1038473313b57dcbdbf14d0c495846d60ced3064c4de4c7e675cddf0e4a9e63c0773368c9d60a2ead8ea92b3f56dbf491b7e3a09877fb17de670eed20208a08ca1055e78aa MD = 99820341517e3140475fc1a9e57a7f8b8bb85293ff7ccee237542e729531fe9daeeed96c3f41d87faaae3a7c6ecf308842b2e08aeb17e77a64484f41c60cd93d Len = 20824 Msg = f72b6620e71f7b50486d868eaa2cd34bcfef394b7447944f6f8a75f1fad317cf4f4a95eb75a65b5259f0dafc208981f4bc6ee8b8bdbb4ee36a6e4509116eace39bccdeac634829ca491782b102e37605b21464febc4eea11d83a9dcd678afd030437a8295c0dcd003f6ae475f7439cc5d86715e518085021e177e403a52ff276b2155a2b06fe2f3c64726910a7b0da7e57f164357af1685bacac817472657386cced5e7a092238c6dfb67949bb321876563ab7b589121b066261dee8773568797a481bde0e82cee5d9be7de9dbd13ef7fec8772eee724f6c2a1f62275ca6b998e6adf91fbd24dae37a13dbb9ae96354776250d695019edd32d6c75f8c8c14e2b35a46004bd124506e93cfd7edd88e3aee7d9df2b5810de8493d37f24638d0f7a92b5b857b754f5974fc149030faf3176796a573fae5e08c783d9e874d612e5cc236969de52f0d4ddd32b290fed1407e55362dc6cf90b55e4250819adc958b66b1047db6237f0c9229e0104691fbe4e459e49d579e120ac22a2e7789ae3686c9d82d877aa0d5bbbacd7cb42da4cb5ecdc81a5ac2f10a4f4ca22fe6e02cd49edaba1a2a3807d3a94c5a7124a2a1c02cbf32500c8562b9f1724ccd664ac2f0323dd942fc8aa2f943bb3365c862139acd1d1b2e191b6dd1afc78c9f6c061af9ff47a84074ff1ca7198beab345d8648bbe8c04fd16f16cb1b8b0e41e6ebe9f8244acc98b09e1df7da93302f1f3723f438f7062457ca3fa0adac2d5b2f4e0cb09a0c19f9b41ff65dd5144fe9a77cbee22ae6ec5afb0afa02d5471f3f585092800922aace9b3943a56d036502539520bd999dba1945970d9a9d442a16e958420f7a73c740eb53ce76a748b8a1abe8112b8e03b888beda400f0c8b97086bd0e506f4e9b7772ed75d798dcb90ef38de59d40f022ed0ed395d092a05ae3c651f430c806bc49aeb2cb9552675371481e0bf62278163185a1d2a320098b6db5fad24ca25e234d1abbaaab37a2cf4370f540c7adb69a0898eef712f952df90ce1e250e7eb345046f5e9f83b92d90e8068a308c635a02d4b1015f8abf2adbdf874268e0cda4a601e51216a947565ce1816367bee3c0f528568f9884c1dfe4bc69fe1a8e1fb0cac8447cac9672bb67c27a1742d9af89e57601f01e8ba200aeb9feb7b640d55627b9e604cdd5bbdb660d48fc4e67172368303bc97e29e03b7e4abdf5c8b39f0351794230f6e19324bc1486a906d1bb1bd1f96c7223ca0ccef801103ece50cd56bc68f197c4448925fe9abb93f8b41bd1d7343c90abf67859905fadf94392f0beed1b7c8f92691e6d91e240539088b9f3cc73049b6339c359dbc8dfcba51499aa48033baefde9c35a1a9dbd5e5aca05e046385cf9060e6e5e3edf3e1c8f3038b771a2c77c73210879fd2f9b1ad3e29025b8e6be3ff0dee9c52e0531624e805e54ee9c985e7eb96e4bbe0a621f888cd942b920a0e6b045c62d4dcd62438f7f6b01033336eb9d1d555dd1d09ae2f50351b5bb589d73c0bd73f502ba4926aea7ff5a74191baa3ab76e1edcf4bdfb85f089fd34010c7dbeb073caf13e4e8248847bbfa5b0cef0f432091d33f933dfc7def297b7bc964ae6c9560d7ddbfafcd98f70af1c8cc97645f7c6c77b50a4f637192bf3badda391e5529b4b1d05c6ecce336ea74d2f8390ac8317ac178d89d5605986cfb1f6bcb94706a3e2536e4ad8b31ad646bbfb85e6946e8c39ad224af3bffaa35a31aa5a4768301081c557ef47149037fbed8368de9a04950e809160e7b286f241be4af4b2d57951a7c7753cce6f5e1445665974ef2a0fb289566d8417f4890404bc5b24822b4cf7a2fe28abc52fbefb919ae0629ec0ca75387318fd0ae27b4911b07d624bc6157321bde4c4d1e24d4e8f0faa9a73fadf4daa8b266446f8c842074f142666228d44a2ab5c105b03839d9c393a84f534b8bc4de3183232c41a7f43cca1f967ecfefc843ad106f71ffc5937bbf2caa90ae131913f50ef84c0cc6155ddb943c771f4fb64d106210c941211efec75d3e5f9d35e12e47304837b6898cbd6ccae1b5e09c1b3224de7221c5f48236f3629626e19925176f109d5407976046c4e90ca0da8000d932ad1cdf54e7c70a8a64374e42e6edb6b5d87e0dc69999de2d1846a0d4a16c2a81f6966db6a2f661d68aab4088c53ff360ad74c9bd36406fed7f161d98a7670d5be26931b3cc17251dfd79637bdd25b6bab906f1b2175ce04d47047fec3bfa6a06991c95120d303da8e4291ee3d7a6e70924bceb6ee4f5199598982e99052b29cb4237ff9d0f4b91bf6843db875aca6e96161e20b94414020d995b9267ac0432f20542d91a776f09a9b15001300f9a33a9b6b5f85adfbf83fd73d4131dd98d6dc30bc68a52f0a58db0e6d8f8a69d1d1e8a2c08dc1b5e0184ac4d8c1a8533cdc3867c4b7a0d20f4051a2f6127b1ae5c1880a19f32c269dfed6350090d6563cc1a8280571113af645930b575f819e75d07d43d036318a763a66aa4d5568610925c003d74b72b46fd713aa09bd2a5f22ad5cf27bbd8e5c194970970785bb0e3286f48de29d41f8dc83580185c1d1f77cb68b6884ff8f15e7aa988dc7886aa83953da289fed0b52bcc8e49443e424d1d46aad487482a03271ec22e125f3e3e9ae1ac56677c13b6c91162df4ccba7f78da581704d2dd8e5c487cb4437b4ea32cd15a6ab9f2a05e90ea09b88598bb5e76ff0d7d10186695ddcbdad127600f44fc63712ea59910f18a3801f8d9305d4e46a2d9340ccdc453417c94ee0f5cac35d2d52d75cbf3797092fb9d83621c16db526669d05d6b5d4321fb298f6dc9abf24a96bdf46f6a607855b54acca2b47e6234ca2dd68469c7d1e9980729b54f8506be38c11f32966c554cf588593db20a9f684ea3bb14416abc1303cc319856ddefc83bc55aa7efd3b3e32cd4ad757d31cf675459f27faadc3e48aed75b69680d19d300493b21df5cf0b2cbce3dfc7e8a9eac8bbf1138ee82e4d4f9b6fbbafba9117926ab3542fd6eb82672c37f354e7b79c245419bd284f54c5284e9970faa2863252f99ed8dc26f66d8825305a2659add23219ff6df16b9d13bd0fdb1c9cc019b518b63a864b6f58923aafb55e64c6f5559a118b6b10c37201b5e51d08c09cb06a8bab70a5a53878b923d3af4536b4f6ed0344a6feaee03955b8d9477d8cbfb51754df297f110ac0aceb980458c5ad186115bb3670f3485cd870f241c128b08e851b5a4b5ab86c97323b079ddf3938c37b797d2407068541528238f31cbdf7a57c8725bf7fc2e66512bb266222bade5f01d792590c101f528b99b346d8731d60c440476e365600931512ff3b686e2554bcd603bcc6389cf54a5b6c203c71a92924efc83fc79c438703e89a11fb80980b741fd7347fa7869459706a6b8fe02367653cb11979bd36aaa4e7fdca2116bceaf15a16ab7d8464967e81b50d1ae713814fce09e695e16264bfb5325023591b5afa2ec9080af8bf63823656f025af02e1aa4ed88d632f4d1e1efa418949703cc45943f7336c2b1e632c3654faf76078ee3e6326f62bd0813e875f305fda83a78ed442a813eb4409fe462ab715da21fb10d3b6fc0935ec862ec38b09b920bce52234d3e492d16c089c96b98828141a15af30ee61aec8aae2549a28d47e61417de6409db49764caa4a5 MD = c1d54f9d273a339cd1750ffe36b10b1b9a60c9be1f2f36d238674e894d19b9929ef7be13043028a862c528e79026504c4a8b04a375a66d9d84efc1ee24325539 Len = 21616 Msg = 38469d81ccf58dfcbb44898bc73f80316fb511e466e19e4c4349a2c87ae744b28b872ce47970957a7e46a3dafd2ff7f2b83582c143ec9619b95443a3ad00e0236378e8fd40dd08f980cb7543278383b63a4a74592e0c8d2aa145701b4822a55b29e37ad60a830dff299ba7cd2d844b035dbb8fb5108aab0864e5d0393393bbe1438e8977bdabcd16e17de080f777786489527cdccfae173a6bfc0c04579b493d1b41bee6439d6fc5103bc8656ea7315e26d5e3d655c0fa481d52cb859a8477f817c6c12d82a11c951e9b0883785b9f7b9c0d6bac88087bbbe1aeb6c2e5946f99a1e4395464fffc0c736648e3fedaea4253c2bd6552cec31a21da74c5211556a82062ce61d0fe36b477632f8be96d393bb4bc81099a59f9ed449cae96344d57adfc09295eade7f315935c66851f5cb4ef25c25ea148f246bdb2bd0c3b088597319ca1f252e5025ab52d1795d98aef85e50f9efc3443e1d210d20535be830441bc6af2d0465f97941eaf5e638d116ed1a5db1604ca756ec4710e3bd2268f147bd4cdc36c4103eec8d87ff778ab9b20c3b8eff31e6bc5e14565cd298a7c13fb6d032ddd6e4bb94f1f6907aa7d3a124e80a5b5fcf1201b817c76789506c7f60241d0f3097d6c6901c15bad411a435d4033f493fb26f05f97922b7548ee0f22711cc3850d41adfb4dd536db82f6cd643e022ef3b664e4796bae0c2d0ae95d7e9028654cb16415577b8380f837bae00f9015da3cf754035245f9a208a29fb8f2a68d3db0bf8bad66d3f5c36c260d84467d9580d6849e55d06d9b746fdab92866fd73d41afd607c0e9c50869e1898c2f14eaaa92925e9e2dc2abb0bc878dfb5c2db01b0f0358b8a3820bf52f8d403a1f84c7bdc9da4ddb35fc681ed7c45b868ee895f5b9b2db4dfcda568aee124f52a43bc31a19ac823cf3f8716a4f409ed48d34fb65d84ae8284b3747322c1ce1664bae9f3808858633e66b6a2b8978c255d57742e3c127f9d80d4d50936019b0f57461aea02cf1d4409ba9a4cafcc9509b06342ee82ac6aaedb160f52730753880bcd963eaed7df6f37257d3d13fdee4148e0ff1fb6bc355d9d636c75603cbe288938a6160c08658cd08ea59d6b915d742eb4f4e861a9a951cfa2329a8608a398d870929aa5cb7942dddc5b9340f0ab4a68c969720adb8e3379bbaaeb6bd4cc80005ca2f40086e13964f9e7471982a06d0005a6e439baacaaa1951c8d9906ff860ae31e49a6a3661a70cc91e27eae0382fd52f26777aeca5f511ad0ab98080555fdef4dc41d88d08d063da18cf7df9e34689797234a1fb2f990310d6bee40a693e167788aef9fe73930345e6c0d7a372848bcdb3f3d752a2167c21df52518a9e9be32e7c6a34e73c7f59912ab47e89709a5a807e4d518fb7fdcb64672c5f6d8fe9d3ae29ec2ff3bde5e5403702e91867d884562399c70edbafaf3d10a5444f97b8566b13ad3190827714e79e448ddcb2cf87a366719e6c77bc66206e45c69d5077f9e9bc35e04a24a386dbe2f203530c0fd2fc995d4e053694aeb2c2964cd344b92cae961ec27d1eebb9a19783bff7bde9f4c65ec56c7572d8d778c00f5d8deeec6d3e43b04ec5dbb01bed1e723a47530e7ba509426049c6e97ec6f9296f29a99239fd17a2eba0d5b12bf2fa65f8de65edc5fd2b4ccfdead571341b07cf8331f4b217fb45f2faaa73f6877bda7721961086243574d11c080a2235d98628f36ca67a23a9c5d912fcaeb5fcfdaef3c74cedeef1bffdbcc8c0b4b2d9f0372aaa115883ac22226a6bcbb15808fc485ce9d29d1bafba771568d87b2a06aa435c11e8b1d698af832e6ddf27e792c2d03aeeeec915446c0a6566190991a64dd2468ebb5a7ad19810ab8000b66881956f133e6919e59a1edc32294b03efa0220b718a50fa773d25f36b0df506e5bfbe4c71410a3492981718071936144cdc7117646e703ad6c69e51f67a87c065338491db5f9bc32425a1e4699ea1e2b142821ea7a0e3c29e534a55d2317e8cf1c53163da00e26da42b0268e220561525ba9c47c38a7139d7cb72248998a211905d0cecf58ca9db199183cef9071b56b12c08ba3f92e2488a185ee9a319baf84ae35c54b46bb6b48b3f6c3b37bbb94d5c800fa0a322fd96be2156caa61b90e8273f6ac39f05d1a1031c05d922a4f8a12e9ef72178a18bcc7bcea2ef1c06ea8a305a7e603fc2c44a871295d0442b9ffa2f6e086445775491c90789818c4191866c1adf531b0b56562208664825b6780268d98c92920b208eb1b454a87f364d83e468d7c5bb464e6ed9e7be684baf495ee0c5c9d2e8c7b76a3abd4c8b7c4ce5299e2dacdea8dd7539b695e658407cdbb99f1c084dcd12e1ce6d0ab6530beb2322a44fa7c569369360c0fb26418c87f6b9aec4912acc5465625084dd27b47bcd13feb810a386bb708aff01c54bb536610614a7ac926af60ccdee1108300064aca7b24e2f9f88d2d3607c900d9d45f3e649d9aba1ad315e9eb84c9a7e96760f8884cafb4be2f6e585893e8e4460c4254b2a06bab7a2a8f5e3ca740888809fe229524da5ae93585b4fae4de5b3bbb8335950a2bb389a5723a2ac6d416e16014656ba44369edb379cf777b27ba2d7ab87d864b5956abcc751a5053f2f788226a4d963b69564e21910458b743a59db2488900d483296317fe5b27ef3b9eee9966278f7abaa48cf891f03939b081ff0ac9e49f461790320074992bf8fc61776d7eafc1b2c5d91ca0c31f73630cf3e3eca31cac10b52fbb2e8e30d6f1e403c4e73a22c793f9689fd2caeea1d3a76fcec06a9dc1b4ba5c40fa91dea36a50ea59cf2f4d2b9ef3d768e70fea5f0c1e5a223e86f47aa2b5aa75ed25ef3be2e189a86da47b483413aa1a56089ed56ce04770af9e9d317b25aecc8ec0deeacc0466334b5029c7d3f75526b85b78df767bbc5cac080470ae88bdb747e94a4ab648047cf0a8f5052f0d7d10766f14b7c97f2d28ac59c6d2ad6d6bc8a105add6121ae8f7f625598a85c4665a28c9df18d6391e87391a60b208323d6342ac76076ffb8846b44bc3e288cab57647d2545d1d5804dadab04ea93f85b72985543f79306866bbc382c087987efef74c3ef10f1f4a7495f9b20d22c3b64d8de183668603f008f99c60dc04355f875fbe6651994c8ee26b1ea618b935628502ffc087c84b10f372b77c72c30ffb031206ced2a635a3e2acc1f2edc6f508e22b38821fba86499aa9ad2c215e68cfe6b0cdff10906b17d9fd8c2f18e69327d959144eaad736187310d6067420d04c96ae6c6d87f24d595cbfc5c11692803dff2f2b8c95a8eafc214aca71c7d4e70fb77d7aa0a5465cf6cf76174f63555cb9b81fd6d27c9a056319ba0314a8c51d77bda0712ef5073a6ec6a2f9208ba9793998adbea6dc3525fbb0e11865a38bd4131db9d86ef3bf362fc6e8d3eafc09762c155b3b701104cd14ab4262cb2493ab605c2c28e72dc900c8349a301530efc40fb2aae5d4d7835b4c5d608adbc87723fdfd69db3e0fcf0ab6b449a625c6d6f352f50f463b7c3b51113bcdf91dfba0ae3a760577ca163bb479ba79aea32a5984a4510ac51a9b876ef1eaed25e82a9adab45a817721dd99ae9fbbaca1f3d7e1e8625b2feb08a201d56cdf4099e0f1d019da1f6061bbc26349773c5538be5c0aaf2b77e1306c2c3554e08d5add8eddeaec4a4924c02e711335beb0f5db69332e394e4bb13deb969c4e0b79ae69584b45d2534c310ac04643c3d4be10f27ad9d727692b326bdd6da1213c38cdb5c3c67b6ca3ad37aa37de5fa447b8391669dc9fea0aaac722d83dde8f012f0 MD = bc393bc550a3705fcd5828ea43b536f6b2de8426bb7d0857dbccde4cf0ca37bc8a3c27a93096b4ebf7861843da5e4c31a43fd7155ce8c986ecbb039739ceeb04 Len = 22408 Msg = 02b74a2ca22173be04ee6afd204d76a121cabfc10b68108ea1f0dc4186887f52a287c7ebc788b39c95be7a509b87cf80be4364a6df66adf5b8cce647074d5757ef92d7309b268fe524d00083b5214844ed49a005842f2afa32c0eaa1cc8611f4b17d82e364238f017acf037eb743665574847cc643ea0f07d673ee371d5c3693aff3d0ec6ba73b595f618c29e917b31b1b9effd264bfe5836d8efdf142f74d9bb29aca33f8d91c539b2ea26c92c2b6ffac3c320f2fd732d6bfb81cb7827ede74821a77a153e1b958f5df4d2ffb6ff767ed091b66ec5a8167949a5571271a7285e71ce01cc3e89ad1361c955a6d44ffbca8aac4bfe27057a0b4dbaf0777f29038a9480b8d91164824268c83d52e695567a3ca35035a3f3ee8e7243361bb2fc0f48f4502dd06924abb8dd81e88860781cea70f75189cf2bda7f41de7673af88a2262bccdf2688528fc33a86f5bbf460c5b7b218be8f0af5d46a46dd5023e767728ea5472b6ff166b51e0a27c37204d7d75e9a9825a9e9ea42bbfbd05180dd00e6fefb6fb10156e9a215b714f02f0455c83b74f5f55ede91cbf0db47d92f02fd75f39896fe7f0b43dd36dbbf0a6785532efaeba2cc327b54d6a55fb47592fbb5b608f76d725d911ddd1de29650900a685209693f18b922dbe9561396b54129b21dbbb253ab118ad01827662b815cf60e07e3781b4957676f7a6f717ef6ae1f8b236833da073f5af314efc0ff1b02faac871582d7fc91dbb8007e03ddd85e3f994dbb0671253b83ff59d3ad716c466acc761c33e590fce22e21ee4523c8c61c751300a4a9639a887d6d7f6633138bd8f64b63e5d4b4fd0d3a455caff1566a389719f588f370d0eac5b64f95a49f47c7b28d892325b716cf74e135ceb6ffdf1687a8f64ddfab732d90dad0b6567e0eb9799308764935deab668bf60be5238938cf668f4dde91f5c347218f32c92e4520c4124e49cfbfb92377bc39f22c7ffd01c6c91d1360b2ed4e5140e7b56d2e8f801a81d73819a34aba30e86e1bdd43af2416574c39168cae1157bf8698c2fd4269f5484fabc78ee7f21aa70ed3784d13f226878919609dccdec2d3c8675b290240ecfbf42f49d1254dad6e98d39dcad00e8fd0505ecf54dde91b4449aba62043a75a13813d2128973f61a59876be6b47cbaac83e53c34035d2d98766d024819b0fc505534fede39249cfe28a474a9cffdc1fe5afa2dcfe892e75f3cc6f66ab5cdcd66806f1f090caff40bbeacfd2de7c9247af30c68cde3c4e893fd6f3dd2c1da0d6b208add9ce95b27c88467ad7be2290ca9b4e39436db3c57bb202e8088261fe7e59c4ee29eb7715dbee09d2d9aaa65a11106465a13ba435d600fcc6792cae4815e5e83d3176039bd733b15249225c50a3c52fe626b671f2209311199fa9771035dcdf15b0fcbfb7071fe983b6c3d9170b2fed45346ca18cd3eeec4bfc8740d966b515f208fe0ff9e408fee1a2fd910faf9748dd6accb788788aeaf80024802620f5297ca9e878c6d6658df68e3e08bd19b1af492a65285776dd99885b2fd968ed1385f0245a8ec086dbf33cd903c4a1c205ad0303b4789c677d74876df7a1242396c80708b2b6595dd2eb1f33fd495040e9be8577492ca9b2e1187fa92a7bea8d054c2bb78f8403d3c0c227ff890b4b1ef4405b0571b911f19ed1cb9d26ce1e51d59ec8b14f8c52714c14e1cc158ee4a4abfefe2efcb2579c0d4d15ca7b1c424a8e3c88a68113b7cecb5fd70a4148df8a8736e964188d0d2ab2f6c8b195eb08bfa5b1c5e7b2cec634d50f723a8acd7e290c84a74573bd8526364b6ed315beb429a27b1af55321e05befa03ded50815318a264a2338cd86206fdd772bf690bd7210b14f26ff091a89c71beb4934118e0c1ef5384cec242265570077ec71e67043e560bd6a809b2818f01b750bccad8c9cd59dda967c2af448a4377dd9a8434bdca09bc524e0ce8fdac2626acca6c555083686f8aaefc543f2dde9539aa5919566c9cc2dfc288c99f6c4589136c8423279ca195c2f4ddf598b8a7dbfd670b69708e95abe995fbc8c957f65b4ef3c0a6b1717bccdce9e5f7c3a335d8a350f9c99eb87ad40a48d46b1de79f2999f0a074809a7d8122feb2df52761f07c618c29e2362b2d7bc4ba1150fa3c6509ef381f117802d6f4f93b310c7b9b9e5cffee47bc125d4237a2ef07b1105028cc86d03c0d8bae1c3bd59753085e6acff4ba3edd6da7a6543be6340f1b493ba1aa0ed945856b3514af6a067b33f755eb0a3783d23e1c8dcb50378f11d8cd873a6b2c5c22c13f1f2517619091d36fe45a6721c510779a9b0f3e3d0af62ec3bb5ad68a60bb0930f2b63d613d7d31ed9f85d31e0d7e60485688cda1aca466536068b5d0edf8a5663831e7131627959a0fd215d66204414f489ec40b7d04c7a7fdcecea60bc1dc0878fdde1e2277469ebbaaf7f3cc8a61d6f9baed2286fe9be41af3e9b2c3fef83f3b82ea2c6a568e202b763f1a53f80906f0420e8fce7b2835403fd09f1c973f320828d2e2f4aab348e89cb6f500368107b5a0f0fa5d61b8c0f51a4a131f74fa0a675760eaca5dfe3f7986242cda2d1100d03a5b093c9a91adc4ec1eb6d37d70eee0775aecf455b72d669a5167e9c30119ca7a1767720cfb25321d1532409beb07fcf0898f787c263a3842044d36e1987c29c7ebba07a14050c915f72c6eb4b17c422ab57c60b8938c76e50786c8701f4e7888a0ab043fa755103d8c4f66b10b763b8ea65bb4f3454ea8ea20bba856deba3c27fee170d0775c8ffb9b402f7b411d6d8223d37a1485a657bb1894dc7d1de5ff0bcd05533bf98fcfb8eeaad1f89b98626ff68cbc039bbc0abfb6b86ecb24fa489cd5beb668751457dd4b3355126110a2bee52f81a8cfb9495ec4d0652a3a1fa042deb5a03f3213afd07b83c2b0daacb3d5b964d2eb68c59c000883ca81a97c8e65af9119a87ab560fb464320ba4f951f1e39d2b6b4b0078c0d4c7aa4b7b73b9a6d11fb298b9321f1c5731b771708f26eff2f2235ebeda8a0ed565cfbb6ad814cc2cc9bd9d0c680ea95ccb2d0b14dec26e261fb577868cf6109eed2d865d3792dcca818305f5bfad4d517b1326f66abd12e9906254369a555c7de8442ac7048c4f46d1b36209ab636ec1dbfa6399a56f64b9deba63438520690ed194173cd1999a0e24bf4fccbdd9842a68533f733161ea13551e2341cfdfccde23adda233123539d05171d93596823f7aabe1917712d0982be0e2295fcfbde4868e1f22e85b1f28ffd4b6a1210a7d4b60d8b8f0af7394984641adfd47efd33fa1be0ed9341ddfd4377dc93ad76110ce21b4c1fa2260f2094d1c4b961d85c644fb71b2b06180fea440f4b48e9fc2c43085e803981a0273530918c5de28bb1c5d5b50148fb6ab0302e1e07f83c15520d9541c86b3dd809ede42de22bbb2b75ff18a023b5f7ac77655e4e930038444ac3156f75331b403fc12bf166a1701a1166751302f06f6fbe0040fb8d1f532b4f0a1532271fce7b313584a67a6d95ea2ca297682f96e7270c8792bf5694011cf758f1245e8fabeb76e16a979dde911e2029ec19fa07d354db61bff4801ce6abdc2645c07c115813892b5a5f5172f6288462efc302c1d89bb32525557a08684a65f89f9100333775d099e06835c9299bc1e41eddca635b4e2c586f3cd4e50a9b1d564b109b63ee94f5a3894cab5fdfda8133f5e4c15adffe9f61fa25013141f06ab5f4c9ae31d1f350dea17732955d771ac911528816db2f94e852a88f8ba2fce69e1916a91b86138aa1e5625c1836f42729dda17f35c15395421531f042b213198514922c8f7f780ba3b1a89846f0d41eccc77c1716470d29059e5ba404d3d56bf193c6990c22834c5a92b477a01f996a286b2cf066c0aeb8a96a704b209cb6666a032e8f2013e7d51cf5106ab227a6a1c3455e9b75d2cadcb4162 MD = 6b543633eaad9b4acbdd18958c2f76d255fc32439ebf5b7125e6826da4c2165e4fb7295d2804e627a072d2382ab10d43bdf0c0e5e7ed45f3543c7cef42761f1d Len = 23200 Msg = 126a5b0739f20f4e7a2ca8f18d41bbfcdc4324af38125682ca7def664caa904e79b8ebeec1a21dc242673f53f46837b62311d45523bb1bf23fd1dbe8f23288b45ad745b5e9b643305ee64a97f303950bd8d4e31fe12bcbdf7c0d5011e513b5ba9d1093e418f4289fb5f1f246f4dc7c03e4d57995da2a0f51687975678d15c0672aabfa04b526751731cf5ee75eb995a72d5cbc4076808f51ed5d7374530051c4e9f0a49c2a12d1a1b9cab802996388fe9cb1d7a71ef4f2e6f20071c09d9b0fd7c227b934de81e5433628251f0da2fc10191bf0533850e01960ab98d1d4afa3aa9e976054393a59078e32cfc7223d9ae68de330ca2e5a03f11da610316104b4456389c285a307d4f5aa30de8140fe0987de52be9666db007612390068aa62ebaefb45074e84aefe14726a7ad6cfabf1fbf6aec33e4a9a82b027ac90fc1991f0ef4c13563844f8806cce27c94d370dfc4bbb3f664b40612fa84546ea7715586a10403bd7ca4bad0205a7b1f66ee0ecd07e174fd044b2f6af655250336105810217be04b48c02952be8e34e27c13210159cf12428b10722abef3712964053d25f0eadb81206cf77a41c6c4785cf964074ae3007971ba7adcb4fddd4399e66142afcf79d1cc11b1d14a928e4371f724694bbbe404509fa5fb68c2bde4402a60e0aea83fbf7444f4d2498016c65392fe81fcb82175903680015ae0877e0f57b8aa8df391cce17d1d07cf0de2939a636efbae764d4fb9159578fbe5ee935fe4d4eabe30147c7c30b6ec3b9a661d9edee220f154cbe553c352dcdc2147a6aa58424bcfec3c30acf63eea2fb435d6d96be4bc65f221e8c8b644a76c51273a77288d2833967d9c0c3431ac0bf9c651e2a103087cdce3ccb074e7633cc401c16eec220a79bd5d1112812b8c60c99c013304b9bf966396038365b79ace186bcdca098d8d12df6f3248438915beb22b87630d652c43249d2fba2f41a880bcc9c241073c0a8f6b08622621d6d28631f936cb21b1d9139e7d93dd37f227053fa0514c7bca2d5feecd432472914d47c789a1f3f81c60884fcbf2650665a0bbff83dd44cd944ff4d93237dbdc44d083e1615b75e7013d01a6ecadda10f87025aae8c8d27346ecfec8bbc2b4b56e16cb2df4c5b9850ce920327438b4ee474fc29043c67e133eaece2bee7637a4799a7dfbc8634748abdf5480d7257df4be8a236e3948901407f003712ec4dd0ff3b62ce950d6a7a84a9a2f00a9e6addaeaa9c8831db1c0fc2f4b0f3711212d7e68f448553272432a75940030510ebd074839127d85a47942112a61fc2a2da17645ff60edc1d8a255b97788ae511033e053b291cbe593317c4a18ac3ede4cc17e2711f711a37c6da0929f28b94e7dab1c99a0d6ecd1f0720156903e5d920115fc68e68b4f4bcfdd917d85511f9da97b02868e525ebf6ec377b31ba8f709ed0777a7e79e151f65aabef6c4921fc3463c48a6c584a02240ae55ec357c899a532e86409f9ff1b2b02d7f7ad78c5853b6573576f0fe3f9f288b126e581993c7f5f38eef7911739a420e5996387047c39c648f739b2fbb8a88f243c60e00842727ef27f0fe83093a9da5e3c5521e7c974adc8d292e897278e46c406fb1d2091c7b89b7e1aa752118158c9474cec745535437d504259c12eecd61ced80e0e612c634bd55e175859b76c3ae241090b506c3afeeda10ae80b50966b15ab5d064adb61bdf6b29fbd219ce43953a69b6b2c5681aa3d6c58fdda42e1f0db36496a14be1948a28bde04073d2ff07f11f06727b6aac25ae29a3dee3a329b76153daa5d28dc845f464cdd891ca208bb1f927fd0e128cfbc804938e5ab0ab37cd4b43792c03de9837e56aa15bfecdaae2c0c25b68a8e3ad8e1e06f2f29dcd165e1379243f8bff0b59095ea3bab52febec3c7e956f74d8c4663fa51491b1b9db7b7525aef56c5327c29852e694396ed6383504b10dbd94c7ba2e18fb2035940e8e37ef2034f00173db5aed73d3d0b1f32c73fbba29cd3f3ef1b406af88718937fe227e81e65d32780a16d8515dc320cb31bd0cb5aaea00b173991839afadbddf33fe7bd9f2fc0dbcb896ba881c5ae5e5b0dddfac7a5dffa9a8a5f5a07f315b8d95938d304015bbc94ea03c21f6dc25c90f991ba6806e65aef89f45ecdf4489ca8ca85d8fb8f0632732fd0623d5930b00b8ba68aca4645a46cb51b225b6306f1d800792fd42d42e5cce75bf96a0c5bc11110870c5ce8905fb8981e254ee3b370ed976d583c60b44f289cf0f823fbb6384844ad8f9e6238f549af87d816eae0625ffbece282cdbcc71cad5a0f099bd26e2774a4b50d47b1fd9667e2cb21ed107eb5aa724f45c8dee5ffb4d17e798122db254ce6fd380d9de1356db97f1e6eb5fe752f880ef3e68d44683001f702304a17c829fec89d384f489d0d66545ae4639a2507b8922bbb6a3adcab65e9222d9aac969856b7bb3c688c33d383eb75e28bba2baf6e894b9bd861d38367c557eda6f1f714794af09e5c24a06c9cc4ddeda0d71fa32444d21c7a31d354a22c11d4f190902af0e2fbe2acba59151b41116a4589776f74656dc1a223529b8f8dfe880cf0c84838203b8ddcb5c4898a10befcdc49a980c96b6d1fe2ced7c49a5b6c7b4bab25f8c9731e146e9f8926539424f9f7804c73bdb75e7bde9ce96c5d24ea3350282fb92f6c320ad4e00d68224be20609d5c6a4abd9c089e805fdff426b06249ce04c15d46c05c5922fc7eb50b8748595a2beb02e6321be81928c09e4ae3ee3946c117b430317f938c75f1c796a6b1d2d8f8b12bfb3f07e4deb29f8ae5ef2d4d944066605c1d70a3b4f297806c2241123e4b248da7ccb6daf584e581a0dd09ccdd09172a718c17d1c3fbd8a73603e263b5acacef90df0f118627fb4b23b469004ca590d718875c65e1181c069b517b0b65a4b11b5e83fad3ba2147b0157c342f069b3b32f81427a635d2cb634415f35375ba9bd7babd5f66b8fc33781e3e54a236737f02ba3e60dde8b04d87d85734830e77d2ec4c972613a93f266ae701b0a102b6c30e050aef52213b0a3a001d25e35762be22bb183822b573884f18cd307392eb711f8282bc4d09f96b436471aebb7903c840af487bdb031fc0ef59aabc620f9af0fdd8adb016c874d66cab5ab7529be25610d230d886bccb381250a13cb4a14ca870b093b1f48534b47b7ee128f1e688d258c9d7376a07005780a8b998b26f870140b23da83169bf6e39840ce9e0827ca2e13f4681d00d44850007fbb8a4a2d6633485b27e139b9f6a6e66e5e36796463073da839c00f6222a5c166d85d261be3616d2fa19e3435c12e2cb74fcce4a6fe2d642987242e91fae5a7c19e583d5c9e2ac401e63e88b7ccd5c5cc01d5cc77e22d1208ceade0ec57ac3e107c101267ecfbf7825436c998902a6c1d12f5a35fb572d1c68eb1b8e9bf45eef3e02927b6565162117a0b5950b1b86a1af1810bc6ee8b2dd335f43912985f54cc68e7ffc070d7be4fd640ca8887fc5a463c2c682603f280cf52d9c3ef8954ea0a74f10d3eb2db469de76b9fa8a962b73f413c4b259c35750b73d6fbe8f8d3394e92c8c259a2f8a57c2be04b298c87fb66af55172dfdc07528077033976d36acf950c3d1d9a79c557b12435f83b7d8b14cd4fb7ea7cf2ffba58c3a2d636d1bbfab3d969e075752d10b49093f6f91d153626083c44b76d082f470992bd56eef0bd497a5999b289892bd2ea67d15d10e6c47c0a29a518b6ea5956311c175e91cfbf61d7556eda1fa34f141af9b4ecbec665d83cc63728336de18c23880cd72422a902d8a487749e4125800891c530907cc141865a226e4d586ff2c71ec3480eaf223565900d086e2c54219d772cb0ecd281bfd02f8e736c75aa8e05266539b73fd301665f281ff72c85fcbff212f43b8e4d5a028ba2bdf98a3b6ac6e719328799646ec35aff40a009601b574c9f85e679cc1b05b786d65a60c98ef0aa08bce6877c8464c9bbf3d38a8c854ecbfaea535ba709bffb6346f9bffd006db7595e3ccfc34c31f483c0f878b2428ab84cabecfc862d199e61933d6f7fca235635a1f13ae3cd13228030759b795bf55bbc51 MD = dc0465690127cf6bb6a066a8f400e64582e2540fb2794332533d37873f08dfe7408b2cba3b539138486fb75aeaf081229c525963c0d86efbd4c744f75496cef7 Len = 23992 Msg = 5b5180ac2e0afd84fbe10116aae8ec95aba3c147450c1f9d2bda74a451036d9cfd80b1e52150ce23e8bf739a8fe8e1da76799ca177b666fd76c16db13918c4da7a5f10d23b6084555a500fe26553d364af43da12a4ad0494591d4467689c0c82fa76063a25410563791a3bb8d532ac7d7f8ae26274fae3abfd78608e83972fdca44efce487fb3b956ca760e2878c536b0ed41e5991a4e9898a5929ee35121430a16e589907970c325c7fe7292269b07683acf5bea0b300782749074e2313a3c6195e8321501c6284702836554fd2abe80797cf5b4c300fbefccf6277f8a5c4e533a7e644089224d1d12cb72eb5cd2c07c11f14f63a22fea43273a2325acd5fd717d0e8cad8013a62a613d17bfd651b1ddacb2d581591b572f1bd2f45f2955ce2ee61f07a67728b7f1863eb06ce9f60707923804983861b70603672786704a34fe0e3681d5eec016f4fa66f95d185e348c7b076912c071ae6a865d19561221d6614ddb77b6478837c7263c4f1ad1e8defecf978f7ba1f991bf0d2b5628af8b06eb3d7455c221dfaeca92352e20b7244ac0f87ec44d2d38158610687a9878d45b1e4597a883fe34c081e6d8130938af1c658e03b401e2db8e52388ad3003eac575d0ecbec664d26218f6c9b9a2ec6d7d86f08eceb34634270a5de091c0a41516039e1779e039f324645cbf6201bf23ce34ff190c65f2f0b60f38979920121822a37763139c654d7a3376d8e415b3b5ce18ac075c1ec96a4e3bdb342f1af6fbcf9c8357f4c391e84dcf6c9ba7a6712a637920e228a573a9d5d76e3fba74f8c40738e97b841d64cd837e6791147ca08a77a18331d7c399b5352b1b41a2f7bf7db1bdd2572c71870306898f40915ee9def1d6fc7dd140e397547f08c14e6bf42db57465745289a192bc380b328716f42db961b34d7de4f8561c1b5d4728983eddfba5cb59602b5b838fd204ef5f6a687fb78ad129457681fa7346435b974546946a982b8ebc205ddd66a1a1fd7f23eedcd3987e9990c0258c434ae286033cb45aec94ae9cd02f4ea828eb0be651092d4df5d5e126c7888d13736d614fd4432f3768e37c0a0222d7edbff969323be3ced90587235750976097ebf8e83f73235f34c7cbbc60bcc09fb31213e467a77b7889ebf76bb594b547219333a1dc46a4ed58ef95972765d04f020980a40ffc97d4648f6de2c7fba9eab75365b2b1b68d81acc98834e6641b8ee28c8ad0b1a2008972d930b015ee3df06413d743432ca8c2363deebc252369055c837790d6017e40bbb28afc27d337022dbbd27d1c0ebb5900340d566c09815b77d6900e0581d8a14800c1ee861360c71c339c87c3c58fed12942f2b447e2d393c6e1d6fc68ad85320ad1eb0b91780e838637d8ac0baec2772479a6234ea3347b13166dea18444ff4b9fe96748465f0c8933bfae9c5499af2a339624c5b65c2ce008b2811fd7e54cd2c06a3ebc07c4dc188ca91adefa602c42426d997d487091d1db4b80c7eb83e3bcf6e95b9bc479ffec5482f70e160747c05b65e8e709371d8b9377042228e66b112bade670e4441e0d75936cb40f57a7ae65c83a8861797916167f35b6f7d58dd946ff08c0cfeee184d524a2594d18f4134adcb6eab9fd4c7a4eab3a0ebe19f11d2f27e815ec3fef585e7cc1843812d8f8f1ea8594778c3fbf22423cafe67a3ee5ce6db0f6a5fef191f6e5f0be380cf9644239ce0e05eefaee798e6223d8c01d370b1885ec61f58e3887a5578eb5d0ff5f2513bae1c9eb240f3dd5d5f1fbb3351dce72917e89ea6f54f8051f7c172493f282be71942d4a65285560bca1b61b2f9effc1fc3483a63ced314d7010c6d15d2341831aaf97d56743a97740bb73bfb2c2864eee96b8f19c0c1ac571d32a9f04fc4aaaddba7152cf67216189c8996867924b618e2d909237b79bb54b4cab553185857be33e228a489da568be5090def515364204807453b6f99c642504b2bd8bc5db3e54c3124578ec1dd207d9bfe9065430387917cafac1d7051b2881a59dbbc4323a58cfa94b075c71e88ded90513f551f8c157bfb50ff5bbe227c4deebe688a74b815ec4f639ef589f278136add4a22ed87ff33701d198cafc148f0f3e83b208700b6a16c57e5c04d38f0d4b557cfc3806e60c79029b672c140b4f01ee2db8d555a617668ed83c4a6011cb6da85753ec28c5fc0c23b7f16dae6ead7d676f2d9c40e3ff4abee21097a9724433f2fe59d992825a5701d1c7fe3fc0f2c826a250dbe6377a29d216698b34031034d1fc7e8ef89d9fe019534b5c5ca4e788c871e2f2aa23109a750fb7837456b7d6c1cc225abf8a454dd6c6fc16698cd425b95854aef1497af2f4187b1f0eef93905ed7e5eb5bdae2d6c6a77aab0aeb412575c0163f7fece1e9fbdb34cc48203bf7e5ba49af5201e141556f1788a532c70e8a33b8429ab01de5d8c27509d4bb398412edce253691c8e43f98834dbd15de57634dbb46d625675d3768ac5628f2f4bb42ecd3db7dfd2255b1ce2e58d6e6ef869d588fcab6af56d674384b4fb979f60412220b309cb6660c685a79387738732294fea62cb0c074e83babf244fab2c5f4fd47c4c317500c7ecfd8046b128d21a1e6aaaf1b690b49e8ea5e01d4812fed1450a8a111725c9e3354b1507f3d47438b1ed70ae523e23e7f0ca92a7cd163c3e8d8df209a323e83b0a390ddd35c0981448a2e3a3885d7db010f17bcbc7fd0e2c8e255b3cbeb68658d18d10d15f3564374d4facd74137e98258e443901c109d25b0996db34e28cbc0f410c8ea5979002826bd7352631290e42f6a93ffb59711b05bb3d1753cbfdefdd98ada300bd4956f3db4df1dd7379a5efd4a131e7ada9256f7392f8a71c4e897eac3f1ab5e904b95f8fc983f86ee2e782b4d6af75320469decf42efbd47e10148d82b36438f44921c15c47c0577f74bb1f3b409229b35810a3ac77cf4c377ffe2c91c8628347b89bff9d94a9313195ae42dc3ff5e2d9ee348229b20ec3355cdc2eb6d9ad25d2bf8b19872601fe4db9dafcf70d2a68db3193f23286c120c2d037fbba8e4e08dd877a79e2a6d0a51b07c5b6565239a10148b45c919bef4b240396fb648e4c12af38f08676bb1e0ee3a8f9d6bfb72877925b1f260c9aa02ba31c81967e82af2d92f973a80b0ef421edc4fec6fbe301d1d8945dba6c2bdcaa89448034ce118040ccf28d47684659c680825aecd280cc961919f57e78f5acaf1ca21c3d1ee4c632a64cc5cb560c56e5e60a97b20b338fb09e126fdcfaa11723a65fdc1934a289ed682fa39d9d08f26665853c7f70a65406afa8543bb8d626ec6da24930d8f4d1585ac2b02305e13531461bd2bac781228093022a027c3de0f3ba94e9ead482a75bc42e73c65640272ed1f3e0cdd96b0206944a7c9b0c7e4d20d45c47b0eff312deed9a75ee57ccd1464d36ee1f6e0dfa80f8a5cf6d3040755c0524e8e8f0f01bc91e2f3c04d12e3a5f040b85184e0f15d6083dade0b22b618d931156fca020c9049f15526e8c0d6a623c9b2c20401858f10c3a9d5c59e8189cc74d1852c72c2478b8733f9650126a383e0d6b9f0dd0cdb74cc42849ec1fa272e900b6542dbb340bb17189e2e5e541c7528acafd7de17b110f01d40f347708f54151b868997602a6d139babc122df7f9bf3ad2a258f06ae79f1c2c16f999510f1669a7f8d404953261f0598ba09295b5cf440af766a8a322423bb5c7022d85a7b2700b6ba70ff595a9c1efb758be22e2c8d1fa626fae2da84187f98819daada55b8d6a29d73c2bb9f1d203a8ff56a66af3082b4c3aad1063e4277fc20448cff05ae84e9a2f353e84814b1dc560052a349812241e904b553a7243cfde8c20f672f7aa3e2676a236e0a055c6784271b428ff166d3e3930031435057242790a271279fbc335732a1cb4981884296c424f2e6f3d8f16fd0522db7393ef5893ad6cb82a02642fef76f7e8afbbe23ea721002e32af110ca472bb767515ce87a2b2cc4c50e8a97cb22ecf632e666520bbb6d1108e937b8af51ed4cd83b498366dc050b734d41a8484f9ac0f5d43973770a8c9bccc1156f7b9b278c8e497d4cfbd80fedf1eef40af2d7f97d38377ffeb8e9ff01b335329bbb8d5ac4fe2e80ab95a9ae0ad5561a26674699797e92d25a5dc454f130d7e7c3eba307a4ac3ccc25c0cb5fe092351c80f235fb543d88b92cb233fed8da0bdd8e7876be9a1d06d85209b795edccee73b140008f8c0 MD = 950233b2ee76ce1943d2c6bac53bb945b5e9793a41270cfd8607028df5c09be1eb311ece3fc5f58be0c5e233f42ddfa1b63c61326244a57c40a7e4df6a7e7f18 Len = 24784 Msg = 2b8e5b85086abad60ac3cb887d0b4f2e3a06045a1c75bd60b4f2b75c3e1b2b76d3f22064e0848331d6c9793d23ccf486620b8525ce21711cfda2064ecb472fcf944b475ea6142b30f51693f011f5a20356e9bb10626797c0cdfe94c2147f5013d560777c4262d95cd072c0a72fcd802f7f684f22c18f57d48bcc0abf000ab6c900fa59c59cb6b63bcda5a86c659eb7914550e964d1e1dae1a1d50f4e793288797ce194419c58ea575576f4469bae6eb1116830dc7ba4486f76e14c76673defabb1ddd1f82b8f9c38d1ae4c3eb947ce184979cd94a822c90472b8693fb07412e807b6b8f32fa5f464a715575aa7afff4d574b67943ea1832afd210db13d1f1ab7e633f03991e01b654173bea44d2e28d8a1a6a7e2276aa1687fe5e0d5f6862ea1b61e22d23a8939c305902824940e71429152358849c5494660cc8cb2c3f0772ddf3df5c711e775045d343ee1629503128d16b88e8ef9a44d089eb6508da71ce3c959121ffd44f8b2b026a8e3a10d06d0ffbcd9fadc50d904e02308b83af1464bdc3920e2e8e6ea54652f0d3237bca1054e0a3fd61d1010f44e232af1b4171dee81a7c818b9167273e61716d70eebfd38e2c9922a388273a3bb65c403e160c8531e69b2ca581cb8969aa66ad90ce142f123c07cfc15ee279b90b27df7ab1670021d488500ac40e545e9a3b2401be897b879b9a3569c9c576433d2fdd4f97f3c84e40ceac09fca21093bd89514224624164c7aaf3fb5d329840e8deda2b2e55560dd7d881418019368f80bbc5e0844129204cd49c048ddc58587abf56ac08ee21e6e620803002f64ec8805ce26b72a89b5097819df3d0054ef08f3bc330ac30c47018511953d9abb1d548e74721640b005c343c6a67c85fe48f82eeb0578cbfb62fdac4cd3b88ac182c26e564c0dcdb00c9bf8f91dedb4ea1abf2429e8f2f0d6f7caa060c459499ea33b6c1bbb841bb152f75d594b79d441ecc59d1fe56078c68ed029f671091e790828516bc86370da5e403c8f38062f2a4771617503aaacf2b0760eb6e0ae507a3aefe5f079921553b8df5b42ec7d0bceb22d37d24bb9d483e42619471b3128cbc0faf04fd8fa5245e83a821b70c7b155b561e9dec37338a0b34810522a7bee9122af3a33ed816ed876bb7bc1cbca69e6d8733d4275c11f72a442bc7e1373eaf7e9788a42bf10b333ebc90dde05707aa9a4ccfca6698cd3203f7de574e00063229cbcaa245690677fcfcbff1727a02ec7a0d4eeb1a6ba9ad30c6153dc990ca33dc3e26082bae7d3e3a82b1a163742cb6855f3da0c3434bdb39457cd5d447ef06ee6547504f4ff3f8800502683403d9ab34992895f1be383e75ec51d9feb3e93dd8e79b1510abef3955ea2eb05477be3d10617c45163ae3698f214094b9533d4b442b9db12070e36334b89304556e3eeea14ec518a157c1cedd9ad5a094b47fa188b7cbdeef0d6528a4e6dbfeb745d0225f977f8b339377f0f9af6d78014614f33f02a1d8ecffe8dc1efb65e9eaad168aa3f228374d5c6a525bd594a59f869192df92bc499ab6d3001b6ccd606ff2769a26d54b874f311d758cb3d793bff48a12e2ee87ab88d0d82712c18eecc7b474b350c74615c9a005cd04b0a2ecf32e42f5d18c706937cc5cd3ad8007098261a568aa3ec44d3d37b7eb4c5272fbd98260ae23e3132d1807d578342ed22110986d4caba232a82a56a832cc1fe44ac39f67ce6288fc41ba11d6a75f348cee02b740b1cda81da1018b5b462c8f637441e3dcb915f478518e88e4c3872773aad94cd44a9896e1e263444597b6177cf2e4ee1400a6ac33d715cb645f347e42f1f4d77c7985252bc6c02ffbaa215e9d312d1cc237ad169b4cd067e9fcefbf574de5d5cdc12ba957d8989cf1efd6bb50c97b0e4bc081da3b1d5eccea0f21514d393cc63cb3f4b9f2926d19acfb4eb414266f21352ddd5d8fe31188f92871da812e6a373db468cd988eae34a13f01df63c279f402f20816f618892a7bbb49c19fa7ee976565005a9617ec6c533d98a3cc481c05399faaad2a382600064a219ce5304a65382843f787e8982f57696b97ca01c5c33d993d7688cc88c81d4791c31e51fe2f2a80bc1afa5b420c02650321c99a17bca37129099e3021e1155602da97778a63b0f0c13b49fa7a710892e7e8677b825fffa9f5dcd72d81c9a2d7fd59ed3b6f91601b0bef134091fcce9592420020863ba6c64c76cfff09003a5ff9b78bf82e46bc41f49cc2b8391dc8cf8ac54023a3ce3d38655de53f58134050808a004846e22a1803caf4ebc0428bb349f893ef5b9637830908c368df81495c1a37c6a639f23e0fb2001635d8097bd3584267fe2e120a388fedc6f60fc8d9d53f475b8c87f56c9ba7c2a330d0d13dc22e3958da9bc039cb62937c817958664e683f4b85a17a3a4e2d8928675b4845e23453d30f152f4aae39906075acbe833a0d95f30c26ef3b89ebca1243c7cd08c6230863062acdc1637d4aff5d0a79952ac7d1fe9a78c2c4e14b1bfd40b6ee0ae042fd854a5d1a129d9649c5a2230820930f79dabb27a38ae6c3e545f8a909c0c34c79b6562c92d28f2d133fef86f8ba055d0403d8b3ffd20cfecc88e60ececed1882372c409d665ea9a1dea8f86a9d5e428f6f69d9e365ec65428327368ab99bd8e7156ee8543612275e0422cd2b9e8c20bc94f5446f575955c8edf2b370e95c9d7e9bf602f6848b938f0c321dba787216df16aa76eabab0c8066eb980a866798fd0328b358c371216bd60a1911d11584d815d50145c783ae5856f42443a163ad56442f4291c39efd86f6736d05e5386ec29d1afc9ce783cd5cc5656a82ce3e698c234fa87b1716a002d89bb838524431c60da8e3a46a201bf638dbd5488b4c7ff736e65f750c7cbb7802ef651986ed905ade0b712cfded0ccd37a3fef56702333fe5afd2003235924eebeb1e3a1188ece984bf0f76e14f023a387a4219c01435beb5f89abd16d5d7001a1b2e0a70aaba0a98302922d2caaee5b1bb394644e6fa0c3e4d33fc38d1fc24140c2f1b32c77a269f0b58a130e4652849d35edb53fee2a0d53a185df6ce7433501a8becc663cfd5ffad08728a30c79a577f3d798bc0a205113bc252ff0fd1a654d2eeefaa040d8140a1d3375d1438b4610b2f813ad09aa188cecc6bb02a871598d1a2945c2cd5c0e866233018135afefd03df831fa34f2e826f810898b326d9a273519b6b429b0d7d86832d59c280e291f5b80f78cd31d4c49aaada471e138af854764545e9cfef766f7d6f70865d07b65d3386f492e56c95dc842119efefa200d18b228a8706bf49ad7c771af341c6e0a6ec7a01a8cc3e9ca1b7ad9f8d0da76296fac387beb2158dbcfae4b77dc1a8976f4d692e7378c33f86bfa0569a101384015f98ebd5748aa90a8338b4aa7f454122d0c4e9975da2f50806d9dd8b797eeb9d3423258fa0773232afd3b0fdbcf5744e012db168fd566382179a72c5cc320fe6f2f2a321d873afb1db562aec1d61b75d78f4148cda45f1918c62d4fd5ad5776b167803507f087804902090ea12e270ed82c89167670a25c2bfd36286d7e1a8963933c480269e31a768d3719c3020375ac91ba67d460b86723c6cb9f6b5ef29f4b5a6452541ad4316bfef4b66e7838141b65dc252d9d28a4c7c8f39c167466203365023d462ce42df1fc48cdecb84d52ec50f837ca4e7a79e1acb607b8e9fe74e15c1df020c79b76d02f3c4783ebca96e9fc1485f39c375037191cc897e442041de5be532a128074d040d70a7c39384ad80e3bf7efafe69093b82ec8fb8ebb36b1abec4eac361b90b8d722ff1fc91dd58231727508ae0fa1bb31f3ed2e0ff0736354afc9ed5bf430529b230eb3c4049faf0bc3e784c13beb772b7320778e6924fd890fac36a794be6435e4208251721026443535ac12f0d6914fb74a1d33afaf45f115dfcf4582a0b74c6d1bd299f190b185d047c8c6b9cacf44c6516928497e0435c84a005b46401389c4e9ecc4088716769d0520081b2ffbb2a91fa392bff701fc31d6111269044094f37018f9405d1ebea358fbfea06ddb43669a139c9a8406ef5669499172560514029a9d601f7a9105eb26a3d0cfec389d07ac006b618cd9b641ecf101e99d2bb2f74dc5222f4637f57b595ea73014d968933cb42a9c7743f8fa48518956407b15dc73d667f82ad8345dd775ab4c4e884d133175ffd4ac0c5d8763b15242a9bae5b8f31956018c3b6a998a3003aa000bf38e758c128f95fc8ff2275983353fb3cc94b5d618d2d529403558d6d8d3942b040cef418c5899db33437b9045b56a2d7077a155d4f36e6a5d3b2bb1514d70b0259687db95b42070f48046a0c04c92ef79699fddb3edbdc6 MD = 9b73214f933db062db8f1b46c60c266962c8071bdedf569c0e870c54730a0f97e200d199260a2988a651524a2abf9ecd8dbc831762f0a784f830462539ac24a1 Len = 25576 Msg = bbfe3d99ada802420cbe6471c21633c5bf6e801d3da50263492bb8a87fb6d0761536c8611b0cd3e000767e5b594e9385def53decb58a6ecff45f7e2f61ad15287c864a82bf0c0c8424e1c108e8de2ed58e08972828bf2794d239920c7f2ff83ff8d60d24211177d57ee577a0f72dcc5bd88fd4f91caef55beba13b6861a54260910e576dca84da7c196be64a0ea335c2c3723d861bbe9fcc4880c26b9075bb355017718841cbfe20fa5c582fb6a830b058991af8ac57ef8ef0bc6f3c93092b663cd7a39b0e50ab6a2b9e137776a486ce9eecb37658e1ab4aeb3f8a04f2c75a9b5d3734cfba79a801b31b6049d7ffffc39d544f29a5c49ca742ef5bea3619107bbc1f6e4bccb0bf8f9ab986cd602163375db738391d698a4efcb62a17e66614ae60789738cc5cb6b9e862cf2d99737ad4e7ffb4cd48363de6217b3eb38a152fdd5228f8bd42e45629a6fd818e0a5b0c3f42120c0dad947c18ba26e0e5aa9029b09819d903b7b26787dc72e51b3c42e02376da8822d4ec108ccd9e58d5cf3ecace3c318231b32db17a90a943f9b691bf268c3d6f3445a4c2e965cdeeac8087d9e0455a3a70bcbdfbabcc89e35300ae71f08b250b6a892658d7879aea9246d3208dbc7b4ae85cca0fc297fc0c4fa303be2a7b79a2ed27d89a003ded93aea88a657ea87cfac01abcb366faea071526f66e7c64217de5a72452098eae32292e14715a114492217efcb03ffb391dce11f1488d4f04e4799271469d83c50f2a60da0cca00bd5a3211f0cef6a5d293a2ed5b1506430c1ed16e263f62221b72dac742fd767bce9a1c5a01d433fd9db4b8409c9d8e49207516c6ad05007596a361eab50e058d5f9906e2978c9d0d82c739951ca8ce68282f701f6d6020841fe9e6519c05203b59a0192f1bbcdddc6a134c7142fe6ea80d950603ce186a559f8e91855dab6e8fa2f77ccbf32d9b723be11a5e78661511b5ef01f938f485f3fcd88b0d62c8989023e6583e89a77ed8df79cbe326aa6bac0985888a13be1a632010fc7111244546c4b5d50e44f22e153c238689b2901a80f19ec43cc73cd0aef17d0c3ad4861eba6eab1ac58bd554313c2773d685e1c7955684dd9abc3750dd5969e1ef12b8caf3071150eac8199835c6ccbb5407641cf41e7dfa295b7641f83f1aa6183280f2f9782f9e066286a128c15c868ba0e3c1a433d243730ac34c058ad9813e9ea73ed5aa4d2da0c1e41812171dfb02b9245ead7bcbe1ff32e4190e24ee9ae8bdf5558e84b325404dfba4fbaf584341b8f19a18e0affc553ca24f1af4a11a9ef731e02ceda9ad6f6e93eeec715485d007101dec49c8bbfe8ec59632e23a29e8b42586b8cf76edb38c739dec455bea380c4990319d5c47819215985dd600ee4f5c97f03911630e970f645a0413b39a0031669bf0c6b4c866af5afaa3b83c925a5750c6b79bb838a05f2ecd3bc3a5bcb0dd2de530ab1865364c5b670c70373c920e18af3b55bd9258e4999d993d7979d0776817f934cf4678d3e185a1e736157de7b653cb27b94546066d73266977f8e969ddd853492394b4abb4fc69038445a54bf45b72f9f678f22e71f6eb30e762821a55d147d25a77723c9c756cad68f392a3986f35b3ba54e5c26ecfef7810de24f297aadcb7bd163bee6198b3ce2948ca556b361e3d4e01a62c2ca53a2b3b9556596d0a1be0949a9629ca0c454c106bd7cb3559347ffaa6bdd27321d52fb0aea0b79d990a36272a0c55a07a2b116584416bbe7f7f61056cb31e0bebc76eb7528a74f000b49fbdef24daab896b0370bd8e9fcd5108ccb97a0f76bbaa18ce98a99df82ee71e04a0116620b3e20f0c783c48ce2c77d6a65cf959444c06d1399ada60ac1ff5524e16b75a90802c1e13c729f65fa198f1d937101aef87a9f996060e5cf68ad3576368098990d910a1ffa3ad21bcf55c624b92e8d8df313898cd246c173f3929352dde307a8988369fba55f0504cf06d30e6b5a81e7c155eb7c53c1d1bf0f29ef493bf54b5e45345202b24190b7759706390e779712efac15c689648f06f7eda9d7c559cc30703e62d3a5a50dba5fa10043371835b5da709929d7a161c26a58638d2e6312b5c60c0cccf3ebf463e99f31ab69bed6371e5df5e4c2faf297b2e4acb7cbb3b7549317c08d2178bd6aaffc1ad01ade012d27cebca5dfe3a9fd8e3cd60621ce12a3840c1e62b2edf1352f423c6fcef83eee834d4ddb92fdf04a48ab8fe6c504bd190533870c3cbe1849c3fc06b8fa9ff811cd5429f460ac8e247ecb2ae82a1a2f2b93388ad8035b9b1f1aa42a7a2227b53d426df19edd61ac029d164778c550e151ba85aa54bb69022bafb4e7f1da320ea79f0505297dd0027b201756172b5b6c31e7956610d948e605dfb8ffde87415d074fb40522a65a09e4a438e741c09c3832a7023e8ac18daf24472aa28ebdd838d2b0f552290b722ad596057b972995cdea7536a42128a9d60d5284a080f2692a708f437c9af1bafdc472177375dacaa5bfdebd2782532fe337ae415a63a9669a872718f4f71d86fb47c4b97f6c38cd58294000491cf5726f29a70b30955763118d15005bdbc3889bc60a95eff8e7f04dbd45aa795f6433c259c92cd39490e117d8c57401a7a81257c5b027559a4ce5fef26c0648d843c6954ea130b3ffca632610d4fe96e92fc6d7dd61d830cefc10f45f0fbe380608bd508ebba14225886bc4bbbffa7c2ecf1874637c33121559f3c659bd4cb767278a7c8075191ea44f6d6c4fe31231d70a89b60e8bc279fc0b20dd89010c577a24a081da69e29a0a73da8533eab05870668d2514fd00c8e1740ab25367a788cd84b1f8e306b854b6ba45b80e336f408967b53a3d6c789f742923ed4f4d98dbcfcc115a30d7e4cf3777317d3559a98a9082747dde46845e128f0ed6e34f4ab10f6f511e4a69f27a0b3f203d5fd9f9a7144b5d688e07ce954b3a1e07a5d947b8eae2f3cda6198be5b0768480d410da269326d272b34cb1c58caef4080d781a4400db7bd0ca730b82b5b1f0d038aab5797bb96634e471d87f6552035080983cf2ef9d4bd02e12ebe19975d7b4041426205c579b17a813ad1353d7de69b5d62a45f5bcf6445755b772ca36bba4bcc9a6abb395f3a354aeaa31e684e7cc03ae5cadb1cf0d95ccd7f8c6c6791f1ac957b18bf008e260a0af4a5b7bfdb1e0008d6eaaa227f45cf4f62a4e1cc1649ec02ad141b004f9c7e29217e0a2a6bf5e230fbabd557c4cf2765cb6894b844e9927df705d723e9c41b0f39d71f924829ee181cb662a207a0eb76837f8c1461f9266d2394f950a6c768250457fcddb8e1ac2903b25cea8fdfa3e95393d1c9b6a3313af7688b6fcccdedd149a7abf50445a5cb7748c819a5b5d82801496cbe8b0d3a4b3c2a9467a4fd337cd26e34c0747e60673f20b016914a109a554b64da285fc90ab9811d227680c18f65559d284fb4656324e11bc99bc5d6a71941c107d4c266de38162d878a7e1f70cb04f014df0e3d29ee34121a0b4fafb713d28c2cd85e9a2f7f90cc7e271ed689cc22356b6ab56f1f65c09cf1280f25320ca7cc307c5aec66589802ef96886d412f57721739d183af502ec1363b2ebf81cd6889fd08dee5e989d6d8c220e56cffbe4db1ff94890240792589d18cd3060a1bbccb7ac4140b21daf155df0b5d5c2d3fa9f90bc2057339a64efdaa63278036c14b9b8ff822e9761592822f9f17c4327b1653230d6e5e04a05124aa0852b76d85be0024eb30045100606598263c2c763a3ac52fbbec4b082fd507b7c27b331831bd0321e667e61865040903e6f31c6143bd5a1715a6c3ad1a82acbadbca7a9d8befab6e31ee16350a25735928651d5b604817c363c54d5b2b011d9c996816665cfd00f414ee1c0eb76cad8034b9b6cc5783061ced70727a28fa6243457d8fd96b8e0a99d78f810d3680be625218701cf1152e08fad0b972da14819926306b60824bd246c1f8cc984e0baee6caaad2b3f6a79770d40daaac09f8848586aa346267dc5fe41b528519c6b285f3e39664f92ee04a3dc14ecd8e7d4e72eeab137147e3e8b9592dc434f7671f4c73e705ae5761694e550abbab81fdbd54bede92ab76be17e98f3f77629af9fa0b4d1c1e393356e9aba2f77dcbee53ed31dc674f6959c013f66c9993966a44eac869cb0a8cf6d6096a0bcfbcb53b458711308e733357b181e8da833f59cf0f988daf3bf02f09a9719277dc9ff2d29c33fda29b2691d8580cc8c044a3323124ac6107b6f9abd297c82bd0644f09191f98fb1ad58f0c447e5a9d0525e8a9f849cd4d59824d87bb68b63efdb0f4827a985f168086d72b04eb136f936e36468c47a3578de8134b2be3e5d1e608b5e65bcd2f53bcf425777e67e0465167b49255e5d78a8b3074808ad1faef73b3babc2688b1bcb667a2771bba692b27578b14bced11eb3ba297ad3ffaa09d8cfb2c8c428f8d58572976b343ab5525fd88e2542725f8848586a55ab4267de5192633df17aa6a2f8581c8b3 MD = 096a0d12871ba1ec81261a8e8b5ab587aba950b91580286aab0759586e04630b8a9e6a05a2422768cdf77645d2d144a7f7a3b8480968a809e7fd3f832fbd2424 Len = 26368 Msg = a5422e53975e43168726677930f6d3e13281bdbd13c67c168340ed67e45d15b0093208c63e6d09ed898bf2a8304bd7d07b62e6e4bb7091a08b33f0d156fa60671a5d71cc6b2cff74baa59eb6d7ea3cdab5b201736e3e7aef868ff76c74d631cd5e2c300d25836cd4a1dc33482ebb4a2667d8d71131187e2afcbbcbe045d7d00a5f050f33745a9a34c79978093ba64bdd193e30670ee6e779732134d6d1e68445a551d4e36099cfbdb242369e08948526544bd41c0c90fb057528f9f621ec97a6b67948c7f2285497ec4135b29d6b412a9e678ad933fe03f68938e4e73ccf4f561ce3338731ef71e9fdfc3deb0015c71082fa1b468c19467438b9bb522a79f57d5ff95dcb26d76ddb6bdd16f13b785f01856c500a1ec70ea6081347def4d0d04205228d3ad7c69297c04a876d567e51253126efcef2f1a1b483af5034a1be2ace98c58d7c4ea5264283ad5a07570ee4a30d8ec0390e8048c731f39efb392a4949a04c233a935d72073d6d5566480f62a4a10d8df47c5a4b079948f8dcc5fb76daa31e181cacd4be0c75f24133306b114f760c1ca64469f29b4317277f4c1bf9a92ba333c9a3f45279b3a4e51518093acd13f136f86c9385abb7c6f48bd6711adfbf433eea80a4757780eb0bb507d124450025a392fec24b617ebf24a96ce521a4e866ff2649cb702e622f79ba05ab19e0c6112b1b01dd8de31f688280145f551f2c74402608538bc5e3d8f8cd1b7f5fc6ec1c963c7ecc9359222bd5b9d8c7007916d5c791c4230e648b4e50964f353f1efaadab9c7c77a5ec106fe4fbc00568d92bf15c1086234135e1f949bcabb50110792e33e403c60bc36f9b78efd302d568f531c94b553b6c5d6d42abe837e7edc6f006f7bb1ca10c08ca19593c19a4914efbfbd5e93953d607b78f3dc1fab44b65e79dbccacdf0f2e0a6504f8b9ad4e3b2c5b847933a53c8594849c8f0fc026218e65b4db8209b03758da822845f7b12bcdcd1e8f061238a7ba7d9141c45bb7b0576a8712e1d8a88ef068999ce6f7f6796c7ac80a9b5ac64965ca5e9eedec5de541eecefd4cba5c8769a5b7e12d2ca2a650eb3d7653ed49ed2f0170f0ece0ad32e678f905132d50d30cf8697f79142a3543a4db4cd05847f56ea964d231d70a2bbd8f91c4e5a009d483072ad26b3d11988d2e1e08811a5504bd2896dd5d3e19222f9925b724c0fc1e442888746405ed62c5ed9243f6b1d5ad8315a35cef944ec8c52c314660febc12d8f2eef0041d02066669c469a19d6e2268d706eb39780f9206cf211d1ab7ae54a9ecdabfcbd11405e73920e4025b6335d7133e02fb37ffe07ce89185c29a67563f7ce84e1bc087e3e0c2346da96a794a4620b52e85728466800eef2af9056b8a223974258469d212bbab7b40f75904c23ea608d868a63186c8b8b6771e872f72da992ad0864b8734f04b62288c958a403909a5ab25518bb3af6c63e4a39e17a2c11268c9a1d41bad2728856ed9ae9e46cdc217f14be2f78fcc90941e48c8d89c8e4baa9b57a203fdc8c9518e5f12a5485575ec453d09197d78dbb36e4e85d6c28a8b8ca02813e4a93db463218d5033b7788b7f317902460f5c943e6f556396a76e887b8283c812222e6016a2f4e5ce369f895d20a08d11a7e050b19bddd09cdd7298f3bd0b3d211af352f8ad2641d92842d612bd23f810f9ac97a96e485b5db75f5381aa2ed1a5d63513958a8202f91f0b181c4173d1a856f9ef827135626dd78d3ea1f45f23f4f65c1859d5a897828d40c5f65820b85c5280bed92f259421a084c0d1062ca2b2fde0d7d208fa7e19e58c461d8bab0ab17eb99c1a02895f2dc4be709b6a07ec445f5be88abf083523da663f1e4683473c2e0cedd195e121f696c2c46d9a814f4d8d35b0d042524b44be371765034a0c4103135a7c53bd9af0b91a32d412197a1329f6c76f4d593ed113a7458e5c5fb88470353886c68f18c07e3d524b5b40cb599827a2a43a8d6e7d7d1f6fe6bc44da6b081b2e9d58c629ca8894994ff097d1756a40c91b948f788e5d07ed2aad89e0693d0d930c95035c935ab87e6e5c7f1afb12caa131e5afdba8260953b69aaf790381b50c7105c71f9f573188030977165f142dc183989f164f7a9c1a172e25f2ce688a01472571e16310783cca820042160102b08d37ada6e8dd28d6c8b27dfc2e73f5081b7e94507328f5030140bb2cb44bb1e4bb4d8c0bf89037e057d217e3a8169e874a6bbedb43d3408163dff834be66e3e49a449ac4136661ed20f79447cfd2ef05708751e059d1d32e5eca580898e4f116b6b75a4dbdb20f43c0bd73970a3b5f191a5bfe0e298745605e7a5b06e84862117d006b375bf5c88ac37e266ffba27738a453f3c33785efcdef6a61ce00f3cf6b69da1def82b4063885d43d20f8cabfcaab0a039e08305add8e350cac8789916b198f02f4a67f40c3943a285895f6a1659ad88e0d10291f05b754cc40f08c40b6e8a9bad54bba10b28b2a588567c8c48ff06a038ef3c2a4ecf7342129b04e65d573a4a60fe6f6fe9bc71f7e25c2b381a04818f49207bf64e9ca6d9ba56b72692d372a45131ca852d5c4a3e9b85b39615d0e7fd1b4d0520782ad6bac62768ad3449f85187d3150c5f720323bcb85ecfc0cbff94b75f24ce54e1ca8d3df55ea2cb2395fa0acd992b0865654d4cdd720ba45e93f9243c1d296b2a4cf928aae22eddc81147e3089b0baf9d386553db387147ef69d76ace3b58446b22a68e2d3c79f4a034df196b66d3dc824412da9cf82a33e84bd492fbc583670d153d7766b4aa9713c66bb4dd41ac177c50fde707fa5df0afff98a2ad02d45d79ed66ec3d92ea4f898e92bd4873bee9f326cd8504853304ae4dcca5cb3b71ad1672c8f39a1d60a26a55fd3b934530d94f8c2bb97be2d4f94bff18a03db982df4b6c0c97659e351a1ee35336a6ff2b70f84bbf8d545a6757f0db239debc1307c82a2d9dd865d903f0d003db769e9d634562b3008773315a404ab96a3bd9ea20b22ddd8cfe5a29a98a07463c4c44a5aafd1f32732cdb5056aef3518bb9b96021493e5b1746bb57aad3d066c689f6cde69d26d4b143c2a6030184252ec6df3751f3c820bd4fedd59064e8001a8e2958be9bf5f45b5add84d7fe999ec3e1bfb25b5877c8ef887645f2c39a8c98e750e89b70292bc1e0908f5dec9048db98df73a5ddb9ae3e7ef90b3a668476d21401fff5b01ce595536037fd52049dd66ab2edca0a0a5b2a91caa7efc412494692b0f155d26dac4641e0e14ec5731864c5eea31053f66a247f8f9e7b72e09e76f1f28f546d880a452a774dcacd4842d738c7164141ea25cc86ac7175e95bc0d3a02b0c49e7e86a128bb7bfe9c000a7de41e0d9b55a6248834595a3679e006afd2bef0adeb82b564ed416da345438a1ba6fd03fe513fb3cd94affc6b9076af75403930d6b74bd595a92190f22d06ceb2c10f9eb78f5216d3ef53f2de2cbf7f068b5db8678941aedc65432d14deaf9ce83e3e25eb974516434d2d87b8d4233e0bbb10cf89eacc07df288f8b30e0a8bd652471dfc5f2827bc5b6250221110ab32bd93cbe636154aa49faedf46fb957f9d27b90156a276f0d003323aa406adca70fecc8ce1f76415dc0e345aef9f32617d74c821005be76939dcb0fc93e6701e25ffc9c44e2b1fbe9ecec7f02f5157ce11b9e3115bc40fed74387d1a54290e22cc212a06bd79bea16771c83388ba8c01d4779846fb7346e9f9b6d5186756ee54de034bc8a23bb77ab067c3998e5335c9402e563641f2230b44d8878b6ff88730c626dd8e8f19908724412896a283eb70ef5ebb63e1c92abde00dd2c7c0766f532f0c2dcce67be0731d6e85cf57f523953c8926543d50d47e45c76561fb591d187313db084adb1dab16706988210f64a2a22e359bc731a6c900b5adfe8329071d3cee53c52ecfaebba9d72275903b2525cabe478f01d4282a8b291ad1fa6eb3bde6ec269804c22a0142036efc2810eb9b20c9fab29fc0cf1f5fc24aa0c392b9970badd1d55f4b06386995ada05b293e7f1ed1cdbad3800223f8e1abcf611d7f2505a3d411a0d2c9bd9b0e4cf69bdc845e4f562eec6f8a67b4e137bcd275977ad47f5eabe18be1fafd50cdeb537ca353952cd79ceb9648765e9314fc4e53794341d33ed7a9430100942564f76b803632c021d6961d1a62a49da909f8979d3b5ee9abe4d5fd98a8710e83540f9318ed987bd8c3a9155e3178de7d972042b566243853b12542ef50c2c8f52b826ed931fb04bc2f5448c46d79bd9b4d11d42e8239ba8554540da9928c5fe54bfe5333bbe117468a264bff4f1d977c8c3bc08b0815ec9b2ed0d269d6243fee45d1e4aad3d10002647d83718edb18bbe50c9c3d703f4b1fa12a25a2a430f57aa9bb97b122417b6a3ee8839d8548adb3d802cbc8432c628d6bce7be67528fd14d809e0e92fc8d5f889e5c105cadcb31ee5ccd3be0943af6eef4c4997d172c337615b64b544cdac37c603c03cd80de5379eb948713b3b9e2e9c12135931a4e47cc61e779819c65aa283b105953562a0985366aea4417acb56f2ce6d8d2e45ed3f86c1ae2407598dc3337c05b15b5171dba4335aa9c4679372a3cfbcb62fcc2a0a13e38ccba5dda20465c34513c280d55c21cdf1042 MD = 4cb6d5a4382d4ab1edbff2c1fd938c982fd4270d33c42bafdb00496d860643e554a9039dc1d8ad1a6004f55874aecd7a73830123dedb3b42aa6547d6f4179ef1 Len = 27160 Msg = 4a96d520d8d5a54eb73f8f558e328d1b3e5ba360161fb8444739a40a97a58a1b59bd684e9ca3ec66a3de8add9548cbe07627e89a569a97b5c837251e96f2c509b3402836717d4d72f48b9b60e7bd2d796df36d525b06e41da46650731501f75142673c60c02c7079948eea68ec585af00d075a108d2a4685c20f4e907a9bc9f9ec7acc54ef79fc836a2fa07c0ce3fb4d3daad85d54d066f40a7946fd2e88e30b9bc0029b68299a995eb6e525af24b796e4250fbf18beeb7264ee61439a90ec8e368204bc9107f1c1586ae0e93de537d5ecc026c041bd7e08b8b4c7e9257b8d8ba508fa3fd4daaa054095ba531eec22113cc345e83795c7bcee149f7736106d09d09a0dad98696c6dfe7d9ae8ba012153bc7696be620e6d98ee561176371835109f80648c447de0007b6aa9327aeedca254213eca2bf019a4a0c2476d8f5c8ca9fa01296742deadc69da60fb8c47afa06ec0b6894f80272e7eda066e4a6a11bdac96781c3f9547cc74d78f302016c24876c7d3aa5320d2169bb379963e4b289adf4f8962ad1a7f50c74277d999a8d012ebcbfdc8442d9cd32f4d00673b1567f2a63fd9023329ebf9cf8fcd704f5a53a02c51977b98e2e1f4b7eb3d59b7554a558febd97378403837fc33f26cb7c7c760b6dd333cd80d4bfbb43282f649875a23fae82d1ec2f9ce8bebb38957796d95e529d3437477f92548a29773c5582811fe7599269cd9b329760ca2e498faa8599de3e85acaff23286c01ae723f69b40c359e836855f318c376dd76b6d9b2249d0b8360fb98e437aff66fdc10dcf4c79379c44b64e2c577471eec935272365ebabe66f17876ad9336484b94e2169fbf622b8535aebbb76b0edea8ad59fb0db33d172cfe83ece1c25602038d3884b127d2db6ff6a8494f70952690193ffc9ecebeb6340c9053f74179944619b69fdf7d7009d2f2d43404047497316b66cf700d9a0c2a901044749d2b7f71ceded0814cc4275cbec4e46bb327911b18810c17fc79996f1d9646d031f634251103bf3cf239b46baefcd2ecf918b4aba4f13afd17b7ee702994d390ac4452be84d7d4692a6b519e67ee981e32e262719549d495ebdf6bec389e634c78904bdcaecd88ac41b35f536e1c9c561cff3aeb7dfd4188f57a9221cf058e5a03848fddd357646cc4bc6e3925f9785b03d99e97a37e3a3ca0f401bf518cad5fe97bbf50a6f7f0214fe0eeae24278463840c1e04ba6f07278af63b13647658a4a7003ac3ae41b4603fbb5120ed09692619f139a1372240e02fdb9edc8c6518eea89c82a53da709b010c6463ff5219f09324361fb8e4a6fecec2ebd691ddb56948aab3783e9aa98876f7c3e69b0f29e93695d37724449fca46c5a0747ad3b9a1ca9d6b9de46cec96ca8579a2cb51ec04b2bb91ab3dda36fbd1d081d06bf287c0da2999a12c97614b667e2f9f785e8dc96f5e19c1eded9418d6a936f14d80444edf15e58dfd653232b0aa8ce6888032c0d64612c41ac7e0a9bf1966e006c61bd1412af668411c84d011d1397ee5fc04724d3a25b9aeae4337f3e8b9a3800c32d36730753adf0582aff2badd6f751d2a663d04faaa90ebe549daded944a19ab1dbbbef090bbf685156b92e21c2222acc240f6a389ea8c6ed67dcc36bca53b7c172a42e5be4c98d1c4dd0f5ad7ed26a14352935889ede868319615e1a3e7dac8a1e8ab713cce5bb091d9dd728ab6f262820f52d91b11a75d1e8d1788ba707c2336ad550d8ccfb3c404d8a9c3a52e0a7306dd919fcdf44d9fc5b94d9690dd83ee4dbeec252ebf356ea65fd0b8c7a0d3255a53fc2703044fb2ffb12495a79da6bc7fb3bd42a31b5522fed60edc62bde12be4f8ef196ad0223904eb49006f1f4900151255008a62978366e1a0a906d3b8d95f32e6c165d679947dee07517800ef4bd6515fc9353380f2870932a90490cedff1987fb974959a47d33ffc2322b11e021c071a2743fc8612c79331571c63978264a0168c177c18d5ad37a3d01fce39c55e9a2085372c2b46b136292d9edaa77320d047a3df1889d0548b7af2cfa6d70826811f7d6f50f510dc5886b71c548314bebf8f8b3bf9419a71a20df5b2d97a4d0c62536a8cf958039170d66e056f9f0976b45abcae7cf4c67cf1c97359e4a7f668a458f6f083e881792594ccea8a6fa4115535b2b73207d6ef1129d62546c4a6d3cdbc8d4a9f1b3d0bdd4e4e5c438996f718acf7e6a6ef3e3086cba8b57e64e0c654eaa7eb996478c21e7f8cab195124a0853d16ad5a3f7ef9a91b658b0a1d06c8c06fd1640148d7244f84e2877a7b0f961142797bba6d1ba31e9597066841bb4396b89434755cdabb071b0a51f54baa404369aae245fc96b54dc6b7c8176760df4e515aed4404f5eedb8e4e9af8677757a22f25719b6272b8cd2b3230a61289f46dc6bfef2bd5ab48137b29d322430924a3ff739a09332215f33fa0e082c7a91b6b851dca6b437d5f654e469ad162e23fcf471fdc4de3376576708e483bfb40ccde190f0fa0d2fe8d47940f42a44b65119ab274a8a7f7251fcd6a54e84021e3711bff0e1f5b08816a10d90e7b096134328cbe2c9fc5e37dbd5e999f411ddff3b0cba38589f868a86e7789ae948f48b23b1bc6a222164ca3b6a06ab7d3538a13f463b32fc01757f612d2127a3f94668163ce587fc0177729a4397a592f5fb4a6c46a8a4762266adcefc72febdcb74f04652b001ffa5807920e9024dda5b0e43ea946b576d0b425df6dbd2e9dec6666cdb7a849fd4146825f4e3b16cfe6e59d4e0b8ea138ac2efd80052a9aeaef30423fd3dc92a235615bf3fb90ac9a536c444763a8f9f7551576315e96016d759375fd222e86b9374718e28f4772e78bc38ddd6a3c1c5d5bf60495d295de9fe00e56685b14727cd7563dcd81b5e611e079be5257be74b5215f4d0ff9909efcef1f7823c724f297961d2ef77b6292b401fd7a58e486bfa955afa4224c2ccefec3356f81fee68383e41a8112c4d3f54860dd2653794b49a46965ae5f32a0fb303cee81358acfb1bc41ccc871f6908a497d8766d48e62af30dd2fc02955b3801b9cb971a0c346e9bb4fa269c7991ece31c88a904eac735cc9015c8e031ddb1a2b6314a54660f2b80b6e39e97624e53d8bc26557344be3def7a67a6c9f036e05ea308e90a8bc4989271e01cbf0127a54c20b961038053aa2271d07e03faf02ffc28595b85a6db1f988ef8885e7fa44a07f049b5f9c30ee42e1d5938d776920546ec2b8a0adddd275cb434caba034dabd1d3df39a0387853db2809bc8d8ca5c90298865de4585117a48c9aca1bb6ab2e727181d53f041860f037e9f26d66b0e5f9d372bc5940bf5939be3571cbc0453cb1733a711d52767137f5ffc2bf293bc0f346f88fb3bdaf54e3f10aa51148a33e57810ff583481bf076075515ca00cfc2b8991fbe38f6aa7069cd234f34764e9a2c420a49b90e8e437618f3d1d711f3530f73f0323114371595fc87587d73cdbaf85f325507cd57d4ffcedfe02e842fdbc17c71d1e53edfab2d233ea63467a804837f8f02b5adff09d9d1232817820bc2975dac849e9d299afaed5123a17a68e2954b2a360ad50d4ccbcac793da33107056bea934a2599d4bc4ffc7b50bd294bbf56b0ada4f6e09049e61d108bebec54ec9466fc73b99c3245304a846bc9ab4f66c8637d7cd9f7c981a3d4b6e0c4bb2c2b79e0627ae85248e6ea2fcbdfaf851fdc244ba13c991ed7207073caf0d046035e76e763a464747f2df81cc020e14f237bf4f9a788e6be4f92d66adb2060f5610225dc7ea4a04b4b66c4a1ffd40171f0c2a4cdfed6356e9955403a55f42941cb93013021d01e7f444dea5fe96d72960e4cde692598f7a85ae43852c9e08bc3b9ad9392fbdb4158e02fc3970b51d713e276ec3baa65bfe3facc3954a579fae3a19e57754b1acb90a5a90af7d425818403dd68b5fbb0f0ba0f89cdb08725093a1a01b747be12ef9f1b360ae2d25d145ef8fcde78980f3c82ff896fe6dd76393f99644d9ab3585fdca7436df8946d021d1831b7f41dd4e5e741578a7826f20d5c963284ded95f8ee1d07d8ea988d9cd4708287fa8eba6af4f7b70c7d4e20ce82996e8f7948e9cef473d30e7663e37f8554f5da0079ff8db341471829d9d3b7c1f2214104c41950365240a22bf02ebf5d0342dc3b099400c3d92b65522b7121bb5ae30597690dc6dd45b65ab34958a58307d3555046610b4b47cdbba14de055985b1da5da40ae7810d19d00b37647791fe80e0dea384ff5731494e2be460a9b7f7d35e77450e2adf8805d5ad67de5835b2c5dccafe8440865c7e7a1501ed53a984794940ea192aebdd95e31c168180a5d5d2759475d298a46e830c1ffdd2b7c0c41a2744f3ca7c48664094c1f3fca584d02d37d5b9fe7c441ffd60b758cf3a703f3c74ee02807357baac4759608e2b354a4cb0093b764fe7b95414457331504a4e66ceb686d9c49c632f872cecd48649aca76aa96ac8a801f31d83750d878db18a1f71490144c4a8c840e0c7195e4b346fc3c420d864091535c05ab0685067487acd28f0024017ef8296c0b24699ee780c385929f4e6d7a3f9d30672141a616189063245fa5a22f2fa87c3791505e4a72a5b960f50bfb840d7cbf344a15400bf3d4149d56a017a35c89a55860520c22412c4075b6c5d1f4e2811bda2907bd9941004cc18c1b4822a5554e35397790b818e083998b84d715e935ac21652203092a9d7257aa211df63293e197c2c8d2541d48e8931c51f52e471fdad1a66bfba3d532f02857b77e662c MD = 4018097493d3386e4adafea20ca962c9925bd5dd9c61c1a29198b064fdc313b599e9615bec715f9d3a2db986e64cbac04cb253e8ec977ea45ca8f1c9f802d965 Len = 27952 Msg = 825b192f69fb73b2716fb35e69d9c09006a8a2422ac7e4e065143c58bd146e71aae56d5d6574c39162f034d41b7e9e96102e24840c2d8b59a93de4f716636cb618dfb0fc4f61f50ebb7ad6257f512fc5e4973a4aa0bdf8c45964d304651581f7d4322b33b02ccfd083f7e3791abb3bc289cd2cbc6fddf2c87b714fa82f9275dce4c4262b0f3c1a80c24ea1f77625893807b6420400f6400d194ba10bfe41100c527fe90bf4f99dc5816759c81af5e2cd673cc447db71ab3c3adc1154598c1930264abbfce7cb2248c72a52138e950e29b046f9b089b4fbfde70be6acc9da5aef660ce626711a6fb09c7fd6015b6bd5f5eabb2a649129f8f727c06a3ad59499f21cafb0b0194e4ea6084e2bba08e1ffd91d859f8e7b3769d302e3e32705209fe04f1a62c368cf84d2147f9a651d5d537c528ba054d0451838805d9a9ae1e7346208354386e506dcdbc7fa6b2b22499a8791b575de17bdcbcfaa14d7bcf2511f204ee89d2218591d6a2aa7e633a00c9ca1e0eb6555d8064b4087f1e2b4bfc72ac1291bb6be89310e26436e53a61f0e21734915b9e19c8860321fdc02abd0af1beea1b6d883c1f779b81c38f9ab25b7f1a5d31bbaa9e9abd14d7bbe80c9ae72bb4ebfa14999471124c7bdeb216b3c6fd3de86e5add64ad7683aa27da435e079d28a8ac55127a3e9d7fc2c71130deb9e91c66b5cdd8f4474eba19c03b618ee2b28490b083a555ee55cff73b017babbacf106896691fd61ea23297236fe9961ef843448534a4dff6f7a779a92759a3201bc46e9ec104828a1d87b2b00c4e1c02fb0f24b8fcb340eeef80ca7fe74d4da05b92d91d7a3972102d23fcf484f179352722c1ca2033513ca9f67a4db5d913b21b2648b0d9212d573d81c67f6e86463c0938ac1763b75976a3730981378f8dbbb6d93df7825e3cb5db4bafaf1d7f0b6e0dbb344f1ba1f2238880e8c8d0d32443db46193ffa42f8b292cc2902364e2171c1150acfdca593a9b59aa87316466fe0d4d76b18956219e3d09dc3173d7630bdbff080281b14b69fb73ac91e7c5bd8f95007b400084de8b0312afe6c9779a1c866b844d64b81f36c19fbbb297775f813b9718494b7691dae111e4b60d8db0d1831e6c959027fa2953a37ff329c3735c69d8f4d35274601441cc22aa2761ccb23be067e3ec4606cb1a47a25b85f121a6868db8e6fdc673c08a0d12c9003b174816781d3e605c6ba37e55c9f3944993e9fa7c0b8a34b3f366249a5c1b7e63b91a7db037aed4b3513ae8939ec23c12eeac2c6e96c8df84088f773ba7a88a20d9b1d64e5d3b3091df16becbc9d066965d78862a01a7e682d9c2ebba9b790dbc9f938a1b36ee5c3f3dc169c3f225fb1b06d46f7af33031f28f87e8dee195ed7d344a02df6bce410594c35244c0cae1ea11484f24146aa81f5166d66e210414acc05ea562a3e3c52a0ca2e015dbc6024ba75c8ff10d5d345048e81d3302cf68906a55da6b8736d1f8cce87a00ec214485f09995a98611bbcc9c9425f52dfdd3735bb90bc4bfce4eb5fd1c8acb9be391e21386ca14268f26dc74f2567b4a963c9bbb119f33f2b422aac6c7773f8f15d0a838ac96f996de5ec8f88b198f00a38a51b1e6fe81c8ee371f5070a92471bfe920899162227e064ad852e6d4f7f72aa7dd65bf9076eb86735cc29f8842e8e7c3922bbf94558410d154a78cf17cd8367a870024bcd90083c0a845dd7c609d97484649be965b5303dd832203d6e64bcceb97aa9ded74b2ee054d01b0ed4837d65f830914cefc91e755aee8d5edfdf7f6e2548ab3880da6ce2a911da343c05fadf093934ba6ffe7c4201d24899c8985bb4708c9edf66d872b16bdc23be691bd22e4bc10eb842efca32818fca84d519c2402f98ed49f5cfb0eb31817023e83f8402147a87ad24f798b54e798b9671ee537fc6f02eeeba1aa7ee8ec457fb45db90c907c8282f72b05858cd1214452b808fe1bb44dc643063e839d7f733aaee9a79019a2c78a5b8a4998b81fbfd275e7ac81480f96e10d515c25ba1bcabc95ed6bd3a5029e1b6634ecccc11a99ea3a7379c76cc705c9b24bae6d2806728cd232acdd1ae530bc80f097298d07d814082319d86d25c4059bbcdc62cd889232cb8013b76291a5f51187f2b80531a3d848c031bc3571f81d2f6c8e0c92eb5237ea9e4868634f244e81c2a48011df23bf60126c7baaf3cc99d5226b745f75db229656f2f80766d550386756899a588050b9e16f1eb6f26602f7a81ba11d70557b366eb9703420e1829f3eafdc86e5e114bbf5e5ad40b8eee0fcc4479bb222e8cb34af47d7d4c3706c1c115880bfce6e91ce16742e2f8b8db94c3f976b08d4ba98f7e14135ce98a99718a6f87d2b5b51515b0bc4ab6db46a174fe0b21806cdf66de7cc52920ae7b58afcc638dcb4d4afdcc89d7e2be17aaf816d7141aa9357c2cf6c3720f770f8bccd2e39c0a44180b3b87f944ab7732781800eb8eb2a99b84648eeec536be812e5e918c737ddb9a8826fe6b8cf560b020a9b9a7f599fff39ac5fd5b194f75a7e5865203846900694478967d0b6109152725a798c3211ad22199d894f8ba2ae853ec9b05394c40f8c288c69a6a6eded60e14513a71f898abbb788728edf74cc6dbf9e2fe1ca81bcd84d02540048f608747ee5d09ac80d804baeaaf93538759c7e026b05aa8fcff5bfdf728fa74432c8d571c1192cd4a8761c268b840e40ae070230b899768cb7a28a0665846341aa16cde3615424ec5f557446b17ddf9c26f33f700e550d6840ab82e9629afbe764dba2fc4eeb4bb73c039c36a64a71f7e54a7eebf3a037cc73f8ecb1f13939e06afd9de30f4469de4669dc1ff2558cf7f4f207c8f2e2bb60567213859ac9e3d1c46606c12cc94608856f7b291b04f7445ad52230908462cbf4ff3e8ee6b2c26578fc25bd2ee0a9de02fec37babc17c871fd9174b57ecf4b65288b4f45c5d9e4290a941009cf35b07c4fcfa3e2af3e1684ce82d40ce8339c87af6bede85303f101353a4b1fe69252cd35369991e01ef8ee8e9ae387db1f8aa732fa474e7946c780ae494f9ddaacdf538e958b511556ea2fbc3e05aeddffb03451daee00cf2ef217c435a00bf1e1b09faa80fb98a56264b8e600ccfa573087cf9a724477cb08eb571583eed2f2dd9112176d5ce126cdf32a7a779be2dd7e8bd95b44dd4bd3812d9f20b87e8b23fcdb4b63df41c30ff60ff518071500e71636d242e72ac59f0423705447f1bd2bcc09bc0e4b2ca6c77725991d33aadcfab4034abfcdbfad842e877b5eb6cac160c7b6e475358014e3ddde871881dfcf8ec49bc3406d0e4c095ca4107e897c30697c3d454722de85fb76955f8886266129b44aac63499929b50b23b052348892bc56375ed297ba8264edd482eb95112a422faa96a6e7d2df0dd6610b685c7250cff21fa1d6088682b6a03681c04322836e8335f279cc5dd48a3ae6622f45bc032abc70be9ff9e51f774a15ec9514cd25055b67405a6bac92a0a54e652594d8223331b4f5bee038b11d280d13e89e8367bd14d910c74a11a1e7a1e374d9de59269fde66f7a15ff3d01ee686a81924e7c3ec4be5e45eec5f7ac5bd6011ba66b198c73ef124e5cdc8f502f21d19c56c6cd2296d282b7fd6d895d1542eec55e273e12fb00e1e0ace0aa85fc72ad96bc9851aeaf51a66a87e0f8b8102ba452ac612a85ffdf8437eb55b628bf24a778ab0b2f6a7803716775676b46b558cbca7760046ce655a25b0381dac2dfff66490d6890de57b08cb5b04a0a8d6a930c36a96df550182ae355daad3fdac4cb9311c9f79b93b51f9e5c1fd1fe1798a20f9d29d025b8fd26f12c5a200df8d650d5d9c7007910fb195065a9446f6ca84e7b07dfd1bb2cfd1171e86a246ba47d56d5a8efcb51dd8f664ad738ea8412005ff87cb3b8e03480b20e92f1ff816721a43a8629a04c83dbce33bab30c66930a9d30058dccbb59eed26e31d9fa78c82a03ad7b5dc692894519b31701f23d772dd0c8a955567522af3939cd095d7850003bd69073864a77370e74f50ce43044d0bf6b71f39e35182baf186f6970a8850b145ccc53289cd618761b5cbb2a67845d33bf634fec24c1cafcb21de17b31f1b356e838e5f4b12c50195354f60b0bbe3bf46c8a52886aa8f5e7b1e159c53b1c61c821da1231b10447bfc2e6a5d0447bd2ca1bebe2b92e52123abac3b997ed8d7b33b0bcc029c4e364301019b1c239428a7d7490e8c998498bbb78cae9396fcc6b5f3ce6d82210531133e6f60026139bcbd41e804dfed114c63390fed1f3ea6197146e5e4365c0dbb692ec837b47f90efd98c2c3f7a1013b2d69ad675a0d86d5691aee2ee73afa04b913c9ca0a6c142488910762d0f94f462627750e6ace6aae4738635eaee8e654837f25d396dc8c64d4879664bf50e4be1b3390faea7fbf779b3875f47fb9ae557c9daaa405e08857494216d1abece82b7356a733c368acb5cce0cdfa41f3778f0c37fe4741c03083508930b17e168213965862c2dbd15af242f91377dedf6c899c13c9c430c4ad724f268c0d1f16da00ec0168ae1c02f0b5654aef743dc5b2cb92fbb421bc3427acb0dfd1ec76341979dd1962ff6d4297879d9d07f846ed74dd58b46668cc57c5b7d97da7576bb86707d167f7beb5db77ef52b8060be19ed848540988a14776b01d34c8b855e6e9eb3030b4d0f2de13b775ec6492b5f6220693f0c1c2d217d910662787a9eecf11ce7f62c894a3cf3380a1d36953ff6dbf274693a3bb0523c80c181c84252a0e763779cf6becd97082f9fc6f8ff3f02ebe63e9a4791c41538bccbd7a85d2128b604fa8df65809da94a4b0d299e17912267e1058d098c8f8f6979dca95358ad2f193e93fb7df7f662d19d5c675d69e82f01ca21b51cb4f6bfac3bfe11b66004e0e82bc2897dfaed8361187292 MD = c5ad53c45a03b0e1c8dc5a70031ed1ea16bd09be869d4505ea811ac6ea8fe988d264df3b698e08113cad1908b8710494e31f6b94275544eaa8dca047147f48ac Len = 28744 Msg = dd946aa6a6bab6c970090084b034ff456f2fa9bcf040f78c9359e847f9a5c8996961b2c372ed544bd223f2f297e7ade784ff063ab6269e93885b3f24b37f20dcba1f65de858fe6314b3831b9b632d2664216d2abe70d7d32f72d68ce4906b3b197778cdf25c7f4e2a3f0c6bf553ef52a711915f6c91f1dcfa9776b2b0361087ec9112ead9bbd07c6a2f5b8eebc339e9bd9b3d703a58405d467e04e2528b9a8ac199453322f9aa64510ec0f2d32385621418a21bac264bda7f7101ba3023519a44ca9035528865ac7b480d4630075a3247346fa036ae6ceb221b0da8cd7fee5cd2df747fed0a8aab457570e7a6f13100c35906bc6e332bf5baf6891caf03b938e832726156d291e74c119c559c53a224150107beb7671180c67df4a449515ac5115e0a98348303e6fba6f01e84a11632b8c6d325a6bcb622c13be0ce20eb4b77daccbd72ea9e6930e0a01cb0f48c15a32b04f98fb0a67232379ace08ca23f3c7a108fb8ffd773a4b778762ab605718fbf8660b6b69a6ee6586252cc2a9adec4af09d554de1cfef9d3ce7627c5ca4a8b38d4459374650730359557dba43ebbd6865f45b4b4beaf1bcbd2abc924df74d50763a9371bb15b8b21dc6512e2d6fbfa66d986df6706af91054dba18bc8c16f592fb32ab95c7927e84fd217bcdaac9b8b74141dde13c26e3eb064e1c73195974436388f6c8efd392c7c1351d4b024b99e25d1db708a83c9ae4c70dde32cd64d9816554209e71464d50f049004525a9244df6c374c692173d57569f65e2f260acb3c73e32fe94143a8852042da45c0ce261d3da1c0241e254ae7cadb969ce74764352ed33cfa165ded7ae0fab4eef9c5986be0bb8a4fec3685001dfe3b1a9c9bd98ce0a2bfbe060c3a6ce11822d268013257dfe4e9311e200a5addceaa0cd860c1a033c2369992e705b78b3bb2848e198a4d95ae9b9c268a415484dd62081d4e831b92c210114f66d60759d5d269fe66e6d9ac88efd597ddc0899d9b0180cdbdb45b78230ab98e1431b8d76701171b81fe688ef47471d4831e669297f6fb7c26cbec6e5554f6f1779f687e7fdd0077e33796a781b7f57f22a1780e44b0fcab22404aefd9ad5dfbf97572d970a4ba961308d0a0a138e4fa25003a6b31cdf8dd2897f37730625310225a8452fa26a9f89a0892e4e355a4d812913a33efbc7474b259828efa128ad07ac509856ca15301d0ad79feb8bcc99b73fad3e2cefaf424480b54b1874c49af7b4b7eeb58c34a545f7de258a1dcc7a6b1a3b4026017fc4e62040669786e242f9c3450ff3efaf462bee0687d3f1433ac6402372d3381f16588f9f4213e06beb366362c2b9fb6e5bf477b78f6d11171fef3bcf99dc9c7880c3553ca7358845ded51b76d0afb9592ccb1a5903018532720e93a580e83570494ff87d5da5885a63ff73e9027c305901d66054ac36537a7a4dce0feea00cf0bb2302cc2b0ae890c1dcf4231ec96954213dd01152b585d981d27673aaab28e11c68fb90da0daed14293258dec3d6a33d529f3f6bd262336cdc5123b7db39129b54569303255e4042c4d8f8d36813ddf65c24f6cb42f3378a74f2bce2f5d50b2cee3d616fb8b9111c831b88cc23cea3f192f6edc017bbf895798489488536c62af6ac9a9fd56bedf5e682af35917773a3899d8ac6ab0ce5025c7f1f5503ded239f01cb51005f725836196d28c3baeeba0c271346b87769b55904af594ec2dcdce8d06376cb4db563976d0795c8cc56a6db02a910b37797a03a7908284b8b4075d000198027c98fe8cb8c82a030f6b8e5ee512274225960f9114b86ca0f4021d5a0b975d8dc7b09d0189d66b3c2df1b618d3d04d8cec4cca826a5b1a8628887e69f2200e4b20a2a01c7c83935472f870100eed9a68061e496c1ad10280c0b7b8f1764410d711ffb641f37858e889005ad8e8b2845fed8afa92a8b2bb3d47204b84ea6c0bbe06182e16a0fd1254aa89b4d803c7a1d10d035caa8688ab283652b498d110657c879c961ee7ba664581f54ca1e2b569680f17fe2856cb68be18bf72b1ccd9a47f10ed8caf5a18bb2799e350ab07d441815e494d707be36a8b68d7044430104f523c9b506c5a9087774cd48f67e5dcc0b96517d937787926fca129e7d4ad6cdc726526afba6bca51c12539476d0f177d7ccdf40fc1dee534ae5c38abf78737c27c150ff93e202eb071bd92173ed61cce47f37e7fc401c00a0ce483bf01700997cbe6b7ab4c0a261a15706f8d31ed6549b7601797a293821d84e48b9f96da7ad2ee34ce54887c490528d832080ab7895627be4ff5d216b3e5c2d6c0dc3c38e3fa5f99b47368092fe8387f7a160dc6e19a25488808f6edde093335b3e3560ddd748c7ffa966f331359a0b0b845df8e168c4ca9604f758b58ee527bd54368ebdfd81172112c027ccbd01e267d05e49f8082ea5b6947d291cd1bad33c58b093563ab8afa98a2c66891c1ed4b28d4a15dc834aad8f36092739307afd7e518ab8cf1553583e1a92f690dc5ba894c30ba5b4617faacaf4839c35338d6e2b47ac455017bbda88c8da200a841f28b77b8841a92834630ed6d3ce37625ceeec42fe8203c658fd319eec2c1f9dd11ac0bda931e362d3a104e3e20668464d45694b67b60ead9289dea4b062f6aedb475a8f56bc8996c32c5423968bef66c93a4969d22b9951d24539e10f0ab83fa4772bfb772bc34d6ccca59ed8a7f54a399634a52427cd3c7efaea5def6b8cd99471db08f4c6bb0e36499f5d91a0a27b0321d40646f3d1f5007099203ace9b0313ff13beb5d59661896aeb67a7bf1d8091a3ce9420d7ce04be6fed33d67b0d4589e77b26a3a07fcecdf831c4044c8fe149e4cd579a1aecf222bf8e9dadba09275ef2ba47a46f9cde6abc187d8e8f1f2795ab77589d06524592272566a5d3b732fae8792aa1891518c87b49992fcff6d9dcc2749e0fe1298878715a97a80d40edc6915fd5833713054f006c20ce563b7f85ef6d31daf498403b63d4369db2cce028b5155230c1be2b6812281b526a17a2fafb0a1ae487c8f743c63c4e6b088294891b42a9926f3d1479782591a554b2c9a2aef26017e2e134f86139e4fc588b90528c8fe09088b948ecfb0c8aae5c337ce5cfce0b594c0a80c2fe740237e90f5ce9d0a3011156594d2763850e55c9c3432b284524940f6b62096394af04053581b8af2813ff1f46ad9478372682e589a7dc7f00b1af712d62355942f44bf2258625f1c31f412ca7f09901cbd91df6ae2f609da6bd92bb7808aea826d8f4f908f39a5d1e2cbfc5a59ca0c8e8300e455964204ae04d253473dddc18e763e86206517ebce1426132683b109337313d1ab3cc824d566b5026476828712e9d0d75462739d6b4690fba1754512b60e693bde4f1ef70af1efbd71b31f87aa28f4c7af1fd33733daab1a6da70cb580a57f675135bd079946f0e9018c1b5fcec408eb82e5cd35b270c2f3edb16e6e1dd8b4f8b68908b31ac647199669fc8c0b3b8b97826ca8355189871ca3fce0a90838a87470c1a8a60a0080c3a2c53978ba000b60200d1ab2bb8555f9231219f2ba15c84f1278133ce1760c7bb93668c285b1f6e9ee5f9b1a3b14be2ded7950d7be20a30d1e04bf042ba768b63c25f0e5d8b1dc894fdc9fe86a882e0f559b4bc48eb9a722f6002288631513e7ce1c684f4d803ab2b6fc9fa9b48034220e006145a67173152cf2d426023f9ca4c1a2458b3ecd801ac64810dac36d5f1a794127e78fc8657835455a8993877151c9300f1636ca4b15f037aa07f1d00d4d29c60606c52f1cb0a1701c1f919d2093374e2b7cc036fa38c753b19dea38dd2e8207823fc125f752f41b9f5476e128ddbe65212b55742bf7be14ce28f7083d5334ae330f1e4d93d3afa06ac4dde40885a11d96ae71024ed747036615a2deac4f94028ee126f660b72696e4ed11262e4f91cfe272bd71e15be4a80000982ca86832acfc4295c0ec720b77b439cb28388002f4ab14754371fa296b22662162c051931601cfc52d9598c0bb5f47665a85cb7744471032e77f3687d553a2f921728037d645d55fad0a9fe8ea3c726d3db48651074cd290de6795826f0a6369d94d7883563eefafcfaa0be68cd2576a52334542e622e7f9b8d9ab9b90bd140e0aafaf181e339b3ff602413c0bb772c838908caf497fdcf7d733cd5602e231403617a868a6ea54aab081e47bef623111413ac108a9aa0df5ea048f241e2047cadc13d8f788b9a85aafc77a08c0593ed01cb086e19f38177e41da75984aedc3e86d32c5473c3802ea14415674f702d88f1b9052bc92b0661b7f13f52521b1323379e2f1da29cc00b3be6e2e332c05ba98de48991c1c999648024fa24d3b011f3682a2f312da0c0e51eecc55e5a7c841a7d547de62a55a147e7bfbf192ef53f76c08012d93d57e983f25da51ef22c0fa16811ca732b5786d393c975778c720373e8a7c25dfa48a3af60426c6c20586607f7245680ed58afd02d4a068714b0c6b488a725058bfb572f0fa201900c89f013d1940b5598e086065c4b5991ef36f1ff4789251818f86bcca9854cd2e046158f9e69d0395375723cc9d256dd448cea1dcd54a9e0cbc8494ed3f4357ac1183d4108ab8c7646a1db3c1ceae5b23c3b1bd6c31098a3caf2577d37f5a4cfd986d0f3b56329529aeb29ccfc98ee5affcaeaf1d1c6dcaa3dfeff217d93811a5018366b4d998e1677dbc5b511e6591bb4c1c1389e7d5c3d4d74a8014dd3b4a34e56d8727953a30904fa15be04db0e3e83a90771d33d00a421ddb9e64dbf25b2fac91ccfe19b50756acf82b17d7ff60a95082465170eb026e3c19c98285ebd8f7cf86b4c2c787da0d0e3755523dbf7c9126980dc13f9540cb8a6b8df84b86282fd6b2eaf02f312d35fbc54719ff6fac12251839e6f05d49fca1675830ad6fdd2a5abcbc10d12f7563fe488ce98d9e83ceb4a9572d23b182441983b4b61bf77c89b3fac4af2df157197e37a34b78aa78098db1e21e4a109e645b57200317bb6ac08af37125c62526c8f3f916aa41321d54f8d86744e428d2cfcf3826a2413a4c61384d6e0 MD = 858deb41f50d96cec9a0850ed70b0d96207e6d5d8b3641fd09af5084d65a7c7b71fbb6fe04876ac728750a543ee31e94e388d42ca5aa2197fb006379dc67b423 Len = 29536 Msg = 2522cf92da7d8f153dca86dd249aca300b85697afe796441ba51fb5b0fa92b5f88f176594ec1e2c24a6c44af8ad8be48e68d877ce30beaf3d76192444efb0469adbc6d70154d9e728ab455c95528be7ea62339017eba5e1dcc2a3e2ad7b3ec85dba93d3df7c8cb0f46c840954d31d1ba95710871982bc7a7e2d38a757078ec9b5ce06d2abcda7280c7d08d79399cffe4f99c7b34f9092d785e84fb8ee2f20b93768a859d2b2c9aad52f5c5dfe21050e41bcf1bb269fa997a8b671bdbf4ca515572cf0d000d664b7e325e6f2e1136cda243306e54b0a61194b0a171c570a8c6c998d68eba2a308ddbad3513ce8cb67d07b9e7fe8095b7a0ae145d85b51c3373d82fc890334a3069ac0d9f39271b3769f9c41d539fe2d24bb100c1e011c2145f6881cc99d33511e6d998c66aa188619761adfaf31a5da11c83bcf5094228f39262d40b3302b2790d4a97d22da49add1128bda56857cfcc1a0d902288b1177615af71ade5288b11e5e851eb0b981853df3439473ac0fffb4d37c470e6c55648ef35a0d937ad8680769910378be5cb6a076f6c07efbcb7d5beea9f06aae5af0f28dea8b7b2f96c6ec8461ae135f37bcb93c09d0e11b2bd02740c6a0d5c7be874c991d370dd740485e4d8b90f912aef1e8a0e1383280cda2b77866eac85eeca1ed936672c4187186ad13532ea28f3f10af543178fba31d6f8d041f00caca61db660b4ad1264986ec89747d09981b44737db46f15a5189791086243b54590ba9e367f5ed4bd011d0453ff4da4424d6ba4e44ffe90b747c8b1ca11696ad1485354ef4e06ffe0d580489cf2697159ac212f7395647cbac72d3c32a01483f667c8b9e125d7a54a1d7d23d52c450326adf17d9c03352c17fd31aae28cc9a31d658717cc654577516f40409cdb64ec31c94919de47e531677072884a35fd4aced81b0901aad4f88f41960944ae4d6f1394b47eaaa1f92f11c76c5eea4a23ed7315f10811550a8b6c1adb087d03633e3486b02691cfe577bf589b994317d1fdb2c5a58f8bf26aa260718ba896894abc3d15c8ac24104eadb8aa6cb1d55d8c1df66db529c21159f014dc1474319e688b65c85a79c2117923a6337c532159b6a0c6648c4164206cd6e1c121e5deb1410e67250219fc52099c009a26d7a7bae638ab40b770d2be27d96fb72097ee6068c7b9a24bf743408459403518c9e8ef9f480d88a332ae28ff8a07249ce4e13a4439d5d694ac376b5dfdfd9aae945566464165a2fbf1571f783b50900367779d77f7242888b339411aec814174e18dcd8fd76c361e575df0069fd49fd099e20858625d1e7476d9503fc783bfe81be273b05c59b876bf23594f09fb9a90f6e1197a2dc92ef491981720f17d6c94be03f77c52e680b1a357a9a62c4e26c0f8c53f618bf0e0858de614831cc6ddf74262d7285d7b454bae6b6fa05934aafd3a3ee8833f8cc9b3b643c6ca7bf89a8c437f8168de806ca13adf29c22357bd82159eb373aac540ebb541ac6bc19b18c03bca849248ae7d5ec30356800d1fd51c25651ea74062fcba056033eb7026ef3f85c46f593e4dedd0f1a8746e99056807e4328892a2be438b21100bcdfa147456cc0d9012320734a4211f01e239a10cf1cc879fba546fbbfb82e18287e1fc4ea2790695519632e844ebd79d8f716b2a5668c4b2a2a7dfdc77c54546adaa36d4bf173ffd9c0d898f3fbc8295cad2cc5692238a6fd04f871b7c42cba6a3b56cbce9211a1755fa4380010d709928d06d0851973925c79e0dff9595e5511eb6065dcd1135a113df2961157951f62dfc95b6013e6182fd35dcff403912a4531e8c3de77212f95a3e83b9096a775b5eaa0ef62d8393f5e5896ca10896d43ef54166e3a4ce22ae9d9aeaee396b81371f7b113f32f1310d251b457b5b59ca7f89d13ed5a18ff52f5276d77741f6eff804e244f7be11c917105deff4b4dc35e465407c8a4a31fafa2d54d1fa9f97143c837222b62b7fdcc24be3d493a1a8d71c3c11a8882b5eb4ad62a752deceb6ae733fad33010765ec9d4c2f9bdebe49fe7552b72b45b150b2a7a6f0e29a4be01f1a8de5ee5eee9e68f675b39e3c473a4c8e6dc3ad4968c265777ed3f9c383add6b0e2cebd262d73e26c7ce25442e8e421c5d1a98719de2e4dab3e9310d1227a75c4f2da480d5070e96da66e76792ff21eca22eb412d7dfefba18ae0b04994d06cd5226af76b042fde78a6aa4d4568cea3f9d60b73fac4aecff8d83f6093574a3c5ff62343c5950b322bd218714e4fe451e36f7c98084ed86b2f9af1aa54e63254c3e285c5b3af9d94f5dd4b5aea21cd990553d115ec78e63da467b9e5f4ce3356af7bf4e5ab905177451cc592afab04f9de278b860ddf62b7f5b2fabc098bc7b28127033c1403b149b814e991153804e4dc5f1e50f2fed87a92013684f98b69e8d77833319366479cbd5a59dea14567fa9e6f0c1f1233b1f617d6efe94b59847a20f4075e90348ed0d35188e3da7f88ab82dbc749022a79aae5a8a9417572c1d6ec0ee22b90eaf196889ee9493732e1683839f257495faa0999fad5361e738c9f973d76112c161a4e4b970d672e0c2cb10cedffd23e2fcdb29342063f9cb85f24b11415b7a83253789ade67d65567a5369f8c523277375f066012beb676ddb416d8075387bbdc57a604e98b0f13d205396e799bf08ae2d8a58ef15133434025e66aabb1f9dd507147082cd98a0fd7a769d85a3fb4cfdec4f08e42805e787c1f03e755a386734b4aec132ce5df9fe516188b82afd7dc779e77dc9aae608d0e19ffdcb9cac614294ef5c47e42684a96cbf5f6a78ed22739dfbbf87e4e11f762b15ac93c7a313676e8048a7551bca6495362882d3f4c46b2033d7041e1bb5e164f753b52444060c0b088d3c69665298926eede8843aea16ca36cc2aa0bf517857f0f818fbb8c197343034ec6a2ca4ae2c11b584d3e61cdc62ada6e0b1f37ca5cba6a5a69427cc72afa044a19e98490c2bc4893e0720e325b23f6e0d9adfbdd087c1614636b8b00344ffc5424fcfc81c573170fe6a12c55980952b9ba4ad9c5f54ea35e02b93f4b4bdf6c0b7c3fca945780072ac42e14ce09556e5711482a1bbfac9275db9e120ece12c3be8424575ee55d99730d8b80023b92ba4773589554c410542a329cabd12774a41bd16d2b381b762e87274bd6888b3bc71954ee73f7af1468b9bc375529048f7d71e86cceb6566466c5a5e180c784db053b3a6c7e8aed1360c2dce0b67cd1cdc07f3d95ba6022a2b2bd1ddf2745c4db053b9864fd64eaa7bcc4294b38431baa0d82458a66ac0cbba2ebd3a73299a7c63788f36a793c444bdd3c05b963224ecec53994bd6c207109a7c08bec2b29ca272ca1efef8a77667a52a916cdbf80e78687e3afa12333fc2731d98ae0897c88784514c266a98cedbdad89b0fab5f5727bb63f0ac8347d0a9ef1a57556c6188f2421602f524f0326705e5c88b2eee67c18e0aa1aa5185228db47a2bfa179743ad532029b44f360cd5ce5afe2a8b2da70e8879363da3759d366a45fee430c1607e6177a7ac12f3c3ebdc3e2732eba47dd652ba98aba1a0aa6cba84b75ce067492e1124662296aebf72d8992aec75dc52e093d5ad3c758daff64c3e3eaa4f1265850d2e4c6102ef68316973efa0525c8ff5f4d05f3a44c4169dc77b7b16a4491c4afd9d43b07f3f26f238d55e96a9ac9add1db595eb39ce4529d34356e80895d647887a32563524617bedc65f15a355dd60b58c37997932a662199fb767a27dfb4257cc009c4b2881952f4fda6668debe45655b2c8a2f789f0f419686dc9b89f304129b97caead3ee08a677b7d21fcfa756d42c5e0681299afaf331ab8f1a41275560efde2839ac109cfb46de9ff1b1ff59aa06b45797ccfee9d6770ec8482efdfce9d1bdfd613b5019d6c43715050a2e1791f216c49ae933a5927097cf4cd7dec356481c9389081446defaab7e84659c582ff66c94b209a1f6d0242feb4fc433704f5de330da9cc5ecbcef20209547b1e42c1d9e1006b3b0a3389cbc66797e62cc7b17fa1d7c7eccd318ab7f45613ad582316c9580bf6fc87671df2786f18cd59f837e4aa296368fc39837b1330fc570fce6ed372c04c5513524f55994e076f2b10e9ab906504d7884e79a9d32c871ea18f2a76d5bfe3eb3a9f8e739d76dc523c9c5743093d34aeeddabdc2a8cb4c4ab9ffea22056d561569a96bcae99c100cfb15013988f47b558988d064287fa481b58b1e73666b0b6a2d0a57ca22003af5d2f567fd743d417207b341fcc6dc385a20db47d99d1b7c60012ce2ffcb65c5b370c7fc1d7f7a0f6ad4f492faf843602a984ae6c2fdf1418d629b9dea4a1f48bc40f75e07ef3d6dd67db733fd5157c47968648bde2daec358dde0d918129f2c76c02dde4b67e9c51b6e95b552567bcdcd3db2a7798086aa38ef7724e7d987f9797ab62d666e11adc023fa87c87c41f4ac64bfba23bb3b3ec403c921f7f34c284add4aabd76657a05b3a603b9e372cd18d99e6347b221f2970a77120b7047e41516435da1cd4fe15431e6141621baedce739b0c6ce59a4d2d566e9d1a36170cd33bc1248a55ea7952e5c7829a2ae4a7f4fb0c9b1cbc68ec358bead955baed63448215a781f57d6a863511f64de4382513dbb7bb5c1fd2f83710b36ec3e41011f254098d8d954fdc798a8b173838fe8cb27a641236f61f99bc4f91056d9dca3d651a637eb71da9f6b14dff8e620e7d075a40dd48b12998f64baf4c4659cb610f233aec240676d3e0b8e43302d44ffebb9295e906d5a085386c98abd891571eb0b61e6c24828615c316b9ef1c94e1c9d3e2e14ff4ab442e86a77278641d2a4948a62cab293336b7c75132fd84acae2675d28cd8b93afbda0985a67991032b2afe79ce70d9226f0013f3b924e1239d5dcaebfe4cfd8baed2e98d9a77084d4108fbb96b84dc56173ad084b52bdb0295b5f9b4a0736aa4465f4d48b7397003562d67ed6ab0dbd717ab258a8edb1b5080772ab6d814a68fa9c75d3c6589722b51df699e35ba7eae589b3b8fabfc491545ec87770ff95954c15243f30d2db6cf19672953336a6ce2c154391a76560d5acc593581aee82cf9744a24f515eee3f6980dd094cc8a4e7b391d48b456b00d26fd095f5c1baac688acf52bc8e794a1a9b51886ea68e0cb82aa3d90e3b3d3f481c0432b8ec007d108509d7df6e9 MD = 52e4c7a5283c2c147f07e595e81832f5f31f29ec02b4fd68ea956d54a1f6c6bc953fc268df43ce47405362d3773f8f89fa024d92b54a1203f6d390bb88a73227 Len = 30328 Msg = 8e4d3a26b9a8d496f6946eefae61662fb81fda07d71154e7845ead5cee0a2b9b4025ed5e224289ee822bf38194d3a1c7178cecc0db7abad080485a158019aff870c29102823670f24f413a0cd37a7fb3b973d43ad93275f800e52e9aefd17bbda68ceebde26cd1c7e43f0d36743c4a1c263a581edc20cd868c9df0934319d6136aebcb3449ccf498c98b32a77e034829e44b4114e92c0ca2acd86aa785d80a224547f112bf3e208b878f7108f9b6c3037d0c56c30a3e7876e9fe627fbcf85d11be0829fd4caa9ec8a5b29401ee3d01d179e761d4463e5b27ca77a1c3f06018095e96399df9f8b778ab5b613964804bbc5e4328eea614fbe0d8abef1a29f88231ab59e99ccd10b0c321f4a2596366e8ecb68775ba30a9a1c79903132c70a8e5b22fba039fd1dad4d090e41d08f3d92288081d0ee0eee3940497e5d7a2cc5887b3721f4d510b3f6ac880939bef1dc13fb9dd6cbb07e8ab1ec05aba012446f0b25dfbf191578525b9d27769e3b6e80488a6bcdc46d725ea852368eb5a59e558acd85299955c47760a17ffcebf045d8b45782dd575faad8612544bdeaaeab179bd4bff7d22065718a5bf9f2af581823ebe56b8bf121588690d7c8bfdb97eb2392fde8a07fffdbff5d2f1e0e54ed661053a69e602e3d3bf79bec2aeaf4ebef18148bb7c9ef6ea87f3d9d5486792ab02c903d83e06b1d958a06c4f3e5b3352753a52075da9cd75b5fc0194611889a76b705fcc493443d25ec4614ac36b2ee1464a93edb3924d4553f79456b361fa73a6e4976d8df26364d6cfe3dcc34608136d9b549308c03e0368cbd842c4a8afb7bb0bf2e294a9d737caa83b2dc8548992f113dc21e39b6856fd6216811f566e1ab0cfba54e6c268f44137b16459fd7803da9c75c0cd8b92e719a3953a49d400448f1735ea09a3de4344648caaffa99e11311d65984df8865ec4769f96cb892dde60caadcd87b601cbda17162640c0c462fd7df5d0eb4a0a6206c37abd2edcbc9029d26824e86299350b389501a7aab09e46a66d902fe9e79be8726fd6fa377701f416af18b20e6d28dfaf5262b9cf2b6e147f1502a23ee5b2716cc60ab50124dac87ec9d16f24464d5f6495720098fc7a70f0344bcbafcb4faa97c780e9a18cc2aef20076a60bec4c9240a658036bed6961e1149632a5631999dcba611d817762ac5a9a30e02b27cc8129cc3d4ab1c4e3f03afb09608973b94824e6d4da08ad62cd9ee026a4ecbf75320850495ed34a9224e332ccdcc1c4d6bf559402a79ef56916a71a817ab67bf1afc67aa3c637471b05c501082eb71e1905580c120cab181f915b9068eaf124e5004992740a4783299bc6afe5dfd1482a2116962d9197df2d45a389047d0582fc2b7be0e3b36ac562efcf868a76790cb01e767a7bbfcb0f3b3a684f7cba5a5ddc3a43ac194807d66e08c9cc207b163054015fff231dad73f0799028f92a587d2d34883d3e51887ff6ee9acace770f7dbdd4bb6e4e34a6d2f509045da35368aa982234dc79565486a2aa2cc8bdf1cebb939f710f238a1ff3f1f2ad35a1bff0abc40b2ed1f2e0d3b31943650e1471bab28068692acba97e9f8d3d72fa1cf65a495bf75e64d2766dd004c12fe3fc7f3b292a398b076d192c9e71f13af23b7e0c4c02efacdd41a18aa30a2d71919da4b9ea3919bfee326092b84416ef6727e1707c63f9008366e892f6d48e135e1e679cbb5611ed26420817b5afb5789f07a7eca02620429f6ad3ed8f09ecfc93a8514d652927fdf8c499225c59d4bde30456ea82f3695a7974ea0336524f167762e932b05965d7ace0991d76eb7ea67a4678d1e870de3059adb63db557c0485475b7b4638fd3638ac0926fcb0cb81baef494099b4886ad873dbe01d3bf467a7008433b4872788ad9890b8023658c04c53733fa632169b74a4b8ab85733ea941544163025ab5c32e3668db8469d01490836dc0c07a49037ecffa3cb0a5ab37f8951b7f9c3e18744ee7d9f7ffc5d1fd2bf1a17a751780216b38290a0b4dda9211456ae00eabd02a943f6c93d0c4def87320a6c330745c73ae8fcd9a11d63d463007b84ac61e6d4472afa935a3f147851a82f6418f2b5e88dd29407350c953d2d93eac064f2050508eab1863e5d5bc3166bb086beda6e6cf6bb73a1c34a1beb6817c8ea9263c29ed3cd4229512ec9d6c0c1b65b8d87185b5ce9c12fb5a09ce6fad2408a9d7dc4a58f19d504fc7907bb35f3696aeec05cbea9a5a53a72d3c037cd0d7729ed08b425261794a0a508bc7a5f48f03b474ee29cc437474962ae30e5c80f984eeacc39237f0fa584b6a19119240a745601fa51fd95e7d0e4edf894f8d222c982fc91fca982493038950d2ea26e7f1c44858a51e904fd68937b789379d58c324c8b1ea5be170c5e45ac143a1c24f1118c3ac68c69f9c036df74f7d66fb896fd34ff3cdb6b26a25632617d5e902ea67ab68778a7845c79634f403d05e263884fc2c0b346b7975141871e12410574e7804ad6664d431571166c4712c7dabdaa537f364b8faa526247cd4a998c83ddfb4bd18e5924ac0ced78bcf23ec460b0432ef2c9cb5e4c401d8f8b4cdbe613532c02d31619d4ca2a38b1c9a788a57b249d0ba4e2fd5aa647c942498ea0f8bbbec0ced6d86e06a25599e81bcfba1234fffe101be7a72cbf50af879077af69850400d6643b20623e76574638d39ab2922aaf65e142927c9f441887e66fd2e2790e344304a7f68fa576bbf2aa19f12e9d8df8337e5986f14f094a6ad6decf0b9ec4a43c3f84ba36df3b0d14f90b862d5d1020a278964b33d6898e57e52c6f8bfc0e97ea9b3b32fef5af95d6ab102358db9c71d95960a8eb3caa2b769dc27a0b9bd55774a2322790eeb99a5e4a8f8e571e173101a81e66c18a566bf08506b83284ff2a03dcd26093d24066d45ef290d12e6ba941ee3a4d5cc77494ed2561f1a9be7659bfd083a7b0a92e3f616da0f16f147e21c2b21b2565fbecef94063cec1751202bcf06aec28f7c6a6e2d010179d8d73ae1ab7c29b6832ea6c40eaffd722546e7ea5c06b97ad752dc3a5fa17df0b47f853025d5ccc85f69895b83a80e4b7ba4b2dc8d590e9730346ced1fd67c1dad15495858436c22a0b37ffb1a7ad53fc073684b8b8613e1442902ce972666c9699f6d9f6b50718def1570edfbacbc169cbbf37d7d153220b8398624ec1ca3bc9028d94e878443d1f496427a4fc62997b9853abb8c8ed21b376ce038493d9bbecbb575acd3664ab6563edee83e51868bbcd8254ce07a5a9b67cbf852d413b797c2502903787eef04be152c7fefd43aba50bd9c7aa0613468f05db6b9b5255d0e1c00dd999d549882d32414898bd7adec1b3b878bf5c9c74a7b2b03b715fbf6ed81ce79b86b71aff93e727f4c39e247e9c55acec8063c7b09b03bc5921c1eebfa9bc0e5a60a5c9a31a6075311227e7078f7225a79fc41b86c3697e693f115a2fe0fe109aba19dc3f2b4ec7a206d329063599c11e6fe61e63cb6474c02bd6885c08836cd1158bd90041028dac143870f7092cfdc5635226d41d751e127a7a0fb0aacc91a1e58436b2e61c35d3ccc0455684bc4a413c80fb64342bf8b49d8446ba223a1d61cc9b7bb394fc6ead82f31ca122b814f63e0ad270a9e9934b277dc3f5196c6eb51d3a2e7ee843868df9596d738db10c68fa586295d94e5c3a8adf0dedfad413f069c8a5912a521c19725bce2a00279f2de3e212506ccad2074a209b0140f19bc824ffa78705d8adc49082a551349c2ba9ad40681cbedf8335e7dae1db86556490f1277accf517aa13c6568965958f505098ebea775a0cfe4ad67688d925601cdf30d8b5df62cf9f8ba65ff0f3ad619bd7595d0fdcc8c391bab87be686b8b2032776abdf3ae940fc9093076267e6b37c92410c4ed975a3ec09e0638160babbe5fe34e95d6bf31c5fc72ed5545ecc056115f2823dda0b1e6bbcf0b5eff3a5fe03c7fe39c6ff1ad22793dc525d34e7d7e7d6d057337ad3a3af486bfb98cc04f90b1925159240cad2e28b2df6c386a4ab7f598ce3f62879c41530b49d0236422d5a666c0555ed7dcf2f21964b5db08cd0a6126ac0cc6f68003c1a5d22b2eef81b803415716861bdf75bdb97b8526f2b17ea960c664cbc18e89249d8253132a133fb06c3e2602a061c073db4d6680ef9c1cb58e45ced9b26dda663b80cf3cda8174952f9e0d3c2e08d9fac701df51c637eb6df850d3588fc6fe6dc7f5270fca725f9bd19f519a8d7cca3cc5c079024029f3bae510f9b02140fe238908e4f6c18f07a89c687c8684669b1f1db2baf9251a3c829faccb493084e16ec9e28d58868074a5d6221667dd6e528d16fe2c9f3db4cfaf6c4dce8c8439af38ceaaaa9ce2ecae7bc8f4a5a55e3bf96df9cd575c4f9cb327951b8cdfe4087168e189c42c9d7bbe10ba07b3a8d07697a60e46c299257df0d4613d8cab19992ee64aa7626f7fd6ab4ef482c7d7fac635229d92f5bc85fd8f9c1adc5659ec93ee9a512b0ccd50a57d1cbd8e6a9ca6d4dac8eed8782f38c49769061f734f229fb96c3e3e4aaed78f3c615f53225e9a488e804941d458067b10226f2f6af7866498445807a57add3df10720f87a869fc95932f5f590a1b6ca02af9b33c3b8df8b920ae8afa4992a57a4f549a6f77a7dff44c63b1b3471125876f8d35407f9f4bbb0a6365dd07486845b13218423a3fc93562563db482fe0ce73e45ebabd248e9df9008a3aaf71b96c2049f2bb8569e42d9835b55e5545e9d3025d868c6da075d875002c6ecbf98ab8fa7f0272a535fc7410df78cce31af5102a4b91f39fd571152c8f6320ac75c210f29d9bd20c6d0d11c80cf64d7816cc2df394c816dc2b4afc27937978d84b291b0e8b0303417bdfabc8a275079ea135d16521731eab0ac7346df5b49fd9e587825831822cccc53aeb168b3e25dc23f9a489dada3295dab266069e5dbd37a9a4ecd878627536b5e679bcad99cdba04e05066a7447b2103d139fb75bbf9780148029546e90706b1aafcc2f2cd28c1acb27a0471fb20d7eded565361187c26543a6c9785610ac423501d2e40245d788437cc6c1e454a3f00cd64164cba6ec80943d1e61b10a5f9729e830a81e49468f237eea5986b21e2a53b0c4c1deaf6e78a2bda8bf23f012c065dd65e9c56f7175f7988b7c5b4cc4742fdf6febcf03c0a3eba2e8df03546e54754c03079c2ab0f34c641ab8f6a74f641dcc934101469b98db776f4ff3c9bac9d4de78a0070dbd8d7e6c188ddd3407808a02ef4039ea57ddfec59c8069a280a700ef37319a7adf8b2a1b156963959540111cc487cd517dc9c1f8012ec98168628618df4acb149f92bbfb91ea4e2 MD = bd8fbb9bc746521cba8628670493cd851f43b6f0263f49d3b6259519fbbcd93cac1c7d215425a26a73a3c0f28aa18833a4811e3ecabeeac0917f2e18f7718c8a Len = 31120 Msg = 73dfee3b9a968877082b72fdec5a890239a55eab0ef441cf757f9eff51ed8dc392bda427abe60f7646bae3463610b0b4ada256f1afb419fec6f7f7b3f8ac3806f60c488a96e8c236838dcd6833eaab291af58fb31e4aaf314a159bc5c633cdcf0794816d43e4c73e286ad66ccd30a3e9e964b2f843fe2cf069a3333ca5c972a72d1df8d79a2146169b1aa659eb29bf7a80b867c90617b8c38b6766217cb84f15d06e54d083e968474665e637751e286649b8552d4fdf7a33182bdd7b32468ea158503e60e682545890123e0e52570535aa2e252c069c9bc778b53f52b1bc54d32d8b5e90ab3533d1e0eb55e76c1c7f6d0de07ece1397420814cd35afe062cc34b7e75b67ba4a2d3ba0b6d4c9aab5be98d998091c5e18987c523d6799a77f1b4b5f2cdeedfb09691d373c62bdf469e93d761c6e1dcf67c5ad9bcc7c18ee5c6ca08b218e2b57ba10ff0d45a8ca328229e54c3454d94fcbf02358411d349d42e5bca48f1428b4a449698a994ef84c46a517c3aa6359c48e4264ef65f1f69d77ae26133e17edfc103de416fffb4f2bfe865b434544a418f6e2faca00a165d443f0663ff64080154614f7194057d8b5f1f33934cc9fc2314cf86d4fdad4892bf0d3058f7f37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0a3365e3008072473bf9d6eac13e509c1619956e12a06fc696512da091a7d40232c675e737713fcf51aea6c0316c3bdbe196132b0943df2b013860105ce676fce7b88d0a167d7ec72c588b7b6465a83c9ea1d748d15713455e5d0e901c3cf646a38a09b0002dc5ab1687f350dca35c1a87cd404c0d529292082f77844203d86be0bb8a9d970a9af7baad8d050cbd9e024788eca91fbed39db930398180e393d949ad7e173d9c65498339a6ec670d049058653ad48af45cc4cbffd30c3b54cf1b290052b1864bcafd0accdf9b8e2a163134d2c982c1bba4a3dafec288e3cfd0ae1934a6f0e39122aebbd7a586e48d495167620708664d31c740bd868c1ccd5f0e94baf959e81502cb00da87330cbf149d5a8381e9eb519a8b97acad7a48c5b0c92623b861064ff1ce8455f32469381e6198c7b8abc341357d6a4c85f7fa517c4a47df728ac09a6645b0ca77df7c70cd4aacaf19c280949919132dde7993e9181e647e964ba99cd6bd10b893c8d90187a5009a23d295d43bfb4cc0e583b8052ac21651b23813bfc9912ea0c574e152f42d3f1975309588a4705196598ad93e1ab1d82954b4a18bc56e55039b6837fd893fa2bd7c70e21a5934dc2e990379ec6e8a2445dc55d57940a14e5164273f59cd58e5f6a8281e11c09536ea22821c98ac978537d7a02220d1d6552aee168a001715834596baabf7813e1c69949b23eb4b86658fd51819eadf8a13f067ca8a791cd1d53ab69d0e43f18bd72d5d93322cc1c36fbe33121f5ff01905328fc7c33d452a86468663c77fc80b0195ec1eca05a5daee339042b4f88a1f9371b472c6c5168c00e984937a134b282633dea25dde7e397b907b1e7d3d240a593e747007990782cf944fa078a7118fbfa793b2604fa15b82453209daa64475d0e95e2408319e8b5ce7460f4593a19e3831a9b363b1c5ddbcd273995fbc61ce7502b0233b1752223352e654837181d01a929f49faad422c65b8ae416ef81290b02b48e222c2b8c3ed57cf0494b928c1e11ad2da77baacd427785096aae1cd593cc356e551bc390cd5765ea41be30cf0266ae2e97d326c417c91e90d75f1f874555b88a14a7c5959a62f23976b77a4c754e35dfb7ddd1700df85f61a62b12a9eb4644caa7f8ba036b9f29c6315ff96c3f7148284ebe3239ecad50641f397ea24b46e21655352a4109b61479b9dd34972779f2f1a6a1d2887b8ff88289b2ebda2efe995668879bb93c4ebb3a585ab336f70b382205ac37c383475fa12ebddfb95b157172261597d2cb0f24f254feffaf75d224a3b407eb54cc7c8daa5483e4a79c347252d808a5f480a35987f6f09f6c6a73bd5cfbdb76a11ed78b86442b810cb703a5dec5874e8721af62e386591bd39d990b3521505e144100601b46de3f50752911ff37bb18f377de45ec4c60fc4ed8ea1717708d2d13fc9e1453a1c4a4db9e4fbe9b74cb8da14ad50c8c8f2ec944e10ee8e82ebb6a081959b0159f043a15fa1cb59bc5e035f7623fbfaa99ea0a1d81ae8692a4019e5a5edb3a4886c789675039fde87222975e86c2642eb0bd48408072fafb1a88507194c9bdd69f3418376a4d9e68c3b83b3f800605ff1dcf0917a6014b0dd77708b583ce3ea632746fee0e01a10500cba90016b4a9072847d809bb0481ae25f74f8ef290c7a087ae16f505fd0da670826a0b1174592d184e3a7e8622a5c84a30ab64aab75face50b96b217e8ea335c0605c638ed1c59370bb9ded004be428f49a79f74ec0fb296b3758f0b6b41930c7e029b55c8fa73cba7dc926151d4043c6bc8a716d7de9ae0cd3ef3ab2d19b0c813eaf12eacfb641d492b0001b2f0f699bd98e4581fd44c0c817646bdd77a71d8ed432f8d422812751a2f9178cf1800ee689ebf046cf9b161f9a7ef0a106cbe833398bf383288661b426fad8d4f570a8293629ee06856af295a58585a81f87f130e6e08f723234856e874bd0adbb2fc9e676deab6b9f22faacf12e875d1259ccea54f7294be02a16f34c427b51a33be8a0c460c4c07d51a2e7d5c0722a9fcfefd21c265d5aa2c57ae4fe95556b5e1388ea9756a6afb0856fb8fbe1d2bb1838be7a95049848fa9545b616badb753c453f266836eda3c92cd592bc0925690c42cd6667f866717827ebe91d0999f9de5f5fd6cf77f63737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267de628c9db1ceda3c78cb2f9988682d641d068023f96aabde4e10071cdec2080f616ac30c2725ad3efe98a69a56873615a3a3161503a4f22621986def597b66641d07793d97cdc9a68f85fd3890a38928462b2fbe2bc5c509631438d2e344d1ced9e2b71748f1b6ddf33a3e597de3af03ce43d305b9f5acefdb2b71acc645d3b55fa3848484b7fa4cf25e71e766702f1003950bd2f45b304052861f6748a8f38175f1e96c91471f5a54999cc9937191b6adc9de0d2520d86590cd4aeab292ba9ae474edb5b8caad6ee095c9e74c0f5e5c9387559f946b2dc45da7fa1d4c2dae6973d5984841682af25ff7ff29d9721d6c7e76776e8965b6c681bc38e85da15954ecbcf20d7448204d9a6a477781c1564d363e4c634c36fbd3c3b50b332f1643c415d004ec999316e75694a8b98e2591678388dc6624058454ec3a7ce608b3f222b8bad5cef77095285e1d2ad746c557222dfc30605bfadaafc4f292e931a0f0d49b226d99d708247879aed5b9f2ca2fe6fb414f37373f844e13865524f206c54487aed53781834b3f6eefb248d95ba21bb60041d501f90a97a19dcd80920df7d84309148e3d0892e50687c86a45a1372926e00f200053f5f436e003e35bdc10fa99d9328853bf82d2091f1f087cc37678138ac0027e73cbcc99f7fe37939c98114fc7380c0ad1a26e3f5ec00bc7eae77045a55c62c18117879389c662837415852e7a2d01ac667a226fedb2596e3e137a83daec2712a65e8cec3e644e738d11bdfe9b19517fa593546373fddcb9e681fc97d1763bb9092a456cc0dfe1aa0e132387d105e3ccb7746ee199aa7af00bb96047310585fed40219dab43f057220a41e90c5f89fdac4a5d6b207c01d5ad4440c5ca29eed292c6f7000c58da111eb4b16e31efa6df3f3aff69e6447ac406aa96a9ece4b5b813bf8b3a499d09cd0969073468513355d6c19346c58480feaf470e0d45a13b74f2925488fd810e0f74afb9e82a24cdf61586bfae68dc92ea09b22d8c8f1ffe9db1e7e98892b5554ce2e15fd5f1cac5347df2eafd2a8d5f1aa8746b9403915da6d418c0b5a3aa8e09d6b65f9a49c3b7a5728e9baf95471404fdf64eb05da5f704dbad60ac9ac106cab2873fb1bc9023ad95c24852337a703d9cc04d6df7de594c3b2e4fb9f2996e0418ec8698a4c087c14a2687717f97e228e75afe295caae2f16513f47a45b4124a7c5ebacbacc562951233bf89f43ff85b703ec77f168c2278fbe6e57a0e7192125f4642d73f2f227d806287081bd30149b9d44fdb90029667622f9925b7826bd0343bc537c66e660f174b447860e1bb8846c3edcb639ebd213a4695f9cb471e188db7a859fcf3abae49569e676dec857b897627cb0bc1155ad6d45282d430176fde4262da2d5f41ff890ceb319d73dda804738456f30a3d68da41554d4cede62aa8549b24e211e76768e6b17379f842a24a449a0ba3ea73cfc72624b5afd118fd7e76a7c6b5bbfa7a6b6c97b97dea52decd51cf35a8e277140ffb2748777a1e3cc3211f3c12be099d0316f45023da6cd200339a718c72a5ca172903922e59648d08dc67f173788363c26e5df406391f107552925ba91b9e569f38101f5eef9a52d201288372abf6532beb4af19fa6d81eaf473d40896dbf4deac0f35c63bd1e129147c76e7aa8d0ef921631f55a7436411079f1bcc7b98714ac2c13b5e7326e60d918db1f05ffb19da767a95bb141a84c4b73664ccebf844f3601f7c853f009b21becba11af3106f1de5827b14e9fac84b2cbf16d18c045622acb260024768e8acc4c0ae2c0bd5f60a98023828cdec18ed8dc298a306c38d1ece01509f3265b5f8cbf441f0525097e8b48234bf69f65cf402c7540a023ed231ef95b222a900ea4bfaeec02c6d8b3b01648ad7a165237ca6b557b1ce287b0ea137f4ef54534070ee793695a9078ec89bcea389956878614ccbf917b61f8427b7cda870fdd92d2d297154262fc65f28ff1a54b2651afff12d6f36ee8c906107bbda399ce5e2cf0a430ad0dd86520841757126bad725bf1593c7959f16221894f5852ddad3172fef866b3321755491fd44fba009b42ec0b6c4fb9e901d7eb3b8acf70e94911f54c538bd0559c5740042b6df4a07c3e00bba0934d92a684b39592a576331e5a44672a227ccef3e595ffa1146ac1dcee0a70baa9acfd5c132b361b5ceb519984b0ee00cd2124aa8acb50c9e574fb19bd99c8fef5407faeedb28b796848bb372beb3f5bde55ed2cb140b60a53bba2df471f330208b09ffb8eda04315a06d693aa53d9bff8939ef6f3a68de6e1975f79f50b3d484665e4ee71124ed794be3a2baa7b5b918e62a095bc5d46e401a0979641fe465640e8d4d43eeba9d0cac76c7b86d22375123b988585e58f86566fd190d868eca08aa1e66932d6d3b14ecad3efd9f8cfcf2696ed42eadfa642324d941602cbaebb8639a00a17542afda32117051e4fbf243dfd255a559c49ac37c265827ba70b0bc618882336f43e1a6a729c57be478008cae6c74840bbe828c976ac628d7b6015bcb705612 MD = c1644263ab1ff816fb1774369156e8e7001e1a164abc73f1bb4caede515eb2cf5708b21612f1ac475e00483f0552869603a7120c0d3e5a4d15380bb6d9aa9e82 Len = 31912 Msg = 349b0171e52c9de8e064c642953b9cee4936a32ec7461a1a52ed88e9dfa2976c817725db25f999d47f5773a144c728ba9a262c8acdde5076430d4e1cb2e4a2d8904d9c8dcbd0b4a2bbb71d4a55709d09a1349b746ee67a38443e255d9a26ebcc49648e0f417a96597acaebc62efea3e346a7197112243f663cc63535ff321a4f940622eaedbfe801a6da069c3939e45171c9cd0b2162480a15eea52b49ced66a597980a5396652a3262d9654dce9055a0ae0e0c903663c2bb6fe9ec8e0c3c7248006d1c88c397b45e20bc27781d5b107f935793320f8c4d2073e47922cd89685f1f53ddc4dfe0cf2c2beb28c8fc68e5f2610c1d2e0e28806f0f5c91396d7eb95958eeb68e67eacafae8d8f1b6e84446a79b8e02daceb2fcf596d4bd384866d5d521904f4be8104868ebf81ac85d77c30db77fdcdeada62352aecf6595fafc5e411ddaf083dcfbc7e4a9dafc83e87deba329340380478c8414bbbf12d90189b32bb23152dcb2f7b9fca6f42f6005b110f6855d2f8608d0afaa42265d77d8a965036335dead06ae9f2f77d61bf341cbe376305db9568e1cf691e687adf90cc5e456c55b0c8b448af7eb70e35aa40928c3b0deb8295823bc0949fd757ce30a89c1943d1364edf91754cf36be63f8d8524224c4ff0821864848510b5252cc4e4f8d5a5ee1604ba0de26294dd9b0683bd2df40a784de39125c4445a4b0b7fb649198079f57972ab849fca80aa7c888a0150b92eafc041554428d763e132516d9fa822a72e86211bbd548ca11ab24c0b1b357aa03c7123cc89574815bfc22951ae4cc416e166987381a8aedd7765da6cd1833f486789115ebefa9f572ce290ca3dae6cb056405f1998433a1e07bcbb17ece20e0e78309373a9b8e21072ba0d401675255cd53dff77cace374b14e0767234fcf1dab68d3273143a1b2ad773281bff4af402a585fff3dff1ae4ce4f993e77076ef946ac975c6c528518ca43569c3c1d5e38b0f3fe7f79e53a609bf2e9bdd6afb1024dc0be5d484298d1e202759a124bdf9dd5b9440ead09d2769efa715bce8315d72547c08051be5d6c895727f1befab3ee1d1ab90343d763a57bb8d89ebb3c0dd661a4469c250053472493d639aec46bb7fb8ad623dad87e5b86a087fd4935199e9758a8d71ed31af0485b18e87e13777a05ac13b6ce8783275453f80de4f8c97e1af76fe7cb810506691f6874897257a2afd10a52bb5f02976945b1371b118e1380e3243497a4b1e81b533d647d6b9cd07eac127e2de97d1a39f83c1f57f9e7fd4dbe3e442fa89213b399104ea659b771d69fd4af7291632e4ade011d282c5779f5db469cd0273627d6437989b0e728056c1ec94d35f155422079a8b718236d37fdecb5b5458b1e830804d1ac197e6f1983cb58fde483b4043f6d8b73847989b5ea450423ec5eabc3ad3fd13c3c9a1d1cd2081c380ab31fd31c0c21e909894d523f86ca4f311c6e485a66d0a0b6c4828dcb677b722519f93d2ad8147e23ed28bb622460bdb04ef6af740c587004886ffad46c0f32a032b0b10073dba9402f9c4ff6a08fe5e660a557aeb2e120a24005d281883ff0287806cd2141d0010aab189e518d706e4fec2aef5edd03491ca614a3573e96410a544beff1e4aa0bcfea4e15373deaad595bc7c4f8fd274fd004fcebca11aa9be272009816bec2202c878d42ec4427299f3a3c772195c5bb78f72f2a5e83d5673d3bb563f432a0f49ced56a5f532ee698e01d9845d39870253f74bdd8917af39673beac21f02ceef8d964acce68c88f3a24d2f6b004ac3bb0d7fa383de3fa0991cdd0140fb91b4779b1cca1634b38f4e8866ce99bf6c044c021af69bd28e51fcbaa9a95f1e51fa3331eb6510743a79d08d09079eeeffd14bee3385a3ea663beacd1c337afbd5f888ee8cac5a09a3d1304c8e8af91388a3210e64013a9a79a6d9c0cf40232890481f2d6af04179621dd42371c926d19902620f26d9ae771b5b40321d5ff60913513c7b20e1655807c832ce4d42a68d9377955cf67f9df4cda1b49d90d35221c1bc875428e0441a0758e2899b7806bc2a6b21644d7387882322bd6fc45ad6173dd27644fd8d5c23d3585a01c6d9b5f1a0659cd1a655d9c5ae46b1352246d03dfa5b8fda09391c2a0e3f0fb369f842a2a7ef6e119b872321b186466a2537ff1a69804a6ff68412812a858a1aff541b63a3712ba09797e210ef89c38b679ea1410e092c832ffecdcd9ac43fa4f16dce9925934c0b24f8a537ba99df2543fb75367a5eacc02ff9ac53d163c6edeab5cad790be55bdce39dafaa56effa454ded95f10e9518371153cd880ec865235bcae93975acf34eddbf1de22518ba514a94c4f8441a1699dc20db00be7147e7cf2d8518c011f0d1e4f8856c3ea2983fdfb5c7c26f012def0908d8ef4cbe7cf2ae8d685f149cba2da051cf90ca15fed9b3578697b5d3c4033f14aa9be0376c0ca1f37c5598d6b92abad1e496f1f753e56f82e9c14117459b274b3a4da3657ffd5065a8447546558fda81aac6dad2ff2cba3ed8873955178068b5704cbccf1e8c62eed472d275f726a7670a68ae2d6a763d943b30c616a27aab5a34e254feaf838093e828d8e905b5ca8decc39491fc8b9f8bfa050fe04e5198436f5593789ca8515ecdaeaf2ce905eafb3920b5851d32892cfd4e3d3e83ccd67707eea0c74bc47e56694c7ec609deb0b8d7c739913535a37e2c5377b5a9b40efee6f5a472269eae83a54a6d3dcf08c4ccb000473dac5a9489705be6cf28d1e7e1f2b2c60293008aee6aefa61ba24acd3fab130712ea6a0555afafb11368eb0a27156c2ffefcb0b99e9e854ee7e96d7419af47a297572c9debd3980209d2ca1ed8366d06eec877e49b2a52902a0e3a6063a6e640555b6a0552c25cfe3acc35ccfd3dfb745b5f1db3eef79f926b78763925773608d25feae4926643cf2dbff6bc9c115fa1cc296acd9eecb37c328feca9650a802398c975e3b4a5979d6a14d395c09ce1b4c98e26dbb3f0d87708bb63562d470bb92f03d3aabe699e8f7a3195006ec5c8d6daf6188436ed54ab7364a2e8841621f11d73cce0bb99a2cee48004a4b0745e2e88c909712eca703ffdf27208735f08f3ec83282db01de9813067e72a8d91e9e55a6fc14aa36f745b2ecd9b5e000a09e8239aae3ba7ddbbd1e75007390e05b222d95008b69ec4a8298d5de59136ff6cf84b1f27afa7c062e690a22d7a39b6010e8bd4a65d25b053cea20b184a1a26794aeb7c5c34b9b025e7b3c51f94188d1ed1fa6462e8431ebf75f53dfb30b66778078b181270e4954bfdd921a630b3725092ae6605fffdf332440f5c57ec11abb056b45b140b30551d4f891e89f6104ee0792e4457495d18f56377d1f42533d86a60ecad29aea5d9e3064b24928d390716af0264206f6a7550fbb5039a8425d8ee4cbe7618014c09e549a79b879e36873a5cb23028182cf28a34525911b0ee918443af1eaaab2ccd6a4126eb31d00db494a7c60e37edac78ed35d53d205296ed746d490da7554d0ebc154f7c58ccc8786cb9c7681496f1edbf27c616911226d305f113acd7a6b8b221eeaab6c43a6fba09ba3da588ba033b4931ae4b2a97a52a80f89561014774a3e2f4c0023cc00862b4d1ae2d5b01eb48d37c1346b48a1bdc2da95895efdf89c7464e18c689099d57b526a4685515b0fea530806ef69290d0542de3b16717000897253b6b73bb358354e2a6be3d9b5a4306747a2bba580dee3dabbe1b3297e04d1ba0af5ac27fd9cdd92d3d97dd3ef20140708be5c684991e304c723d1806317d1ce8fefa3efc901d8b2eef5bfba47f1f994d3a04e3bd3d487438867ee00cfc82e024afb2afdb625bb30e4772607509855a330ff0d9ab00545296824554524843b07d4becdcc3576f99f4ca44d45a991bca49931270f7ea2a128eeffc3a801da8d31b590f8e5d7842850902391ffa35c933b84dd0704903b3fc4a540a5b3e8399932561838d51ccbabf7576ba08ffe877dba7c693a04854d557ef39d77f3283fe36c4ecafa1465bc08e5fae2d580eb70d0b3f84c4c99de4796da826cb6d0724bf051f81fd92e42e3d3cef33fcd7d2ac730ba811c9b3f0bb88849ba44eef636fc5485fa8d427d44c170f4f8c8d4df0ce912309f50c26e8e2e8e5f03ac8cbef6af647abe99c29bebd3850a4414a8213254f9b8ab6f3ea2d6083d8d071a1ca521f3b492ccdbe61498a864619db9a3ee1ba96ba55dee8c6683d3fa463d041b434967d9809dba0941ebaeb3bd3e1e44802944cca8ff5528441820693d0df10513fd6a27a6b9cab8de5554e75fddb92691fbb5b11638199ea5f36bfeb4026776919e793387a9647134564963dbd510b69e038a9d8f70c24c16b6152f5da2edcc36ad139195d53ddede6eeaddb3bccb710ec122066731d5dd00c0ba6f9c77ea828db9c7b673d5bd3e471fb7a97a1d4fe25ec51a705003dabe1eb3da53f2e9e446013514068413493c08e94e5b914ef487287fe25fbc6f276baafff360e38171633bbf8726692688349e4bfd688bea7fdbd66208491ecc72724015741b00c7088697b97f8a7577f0d461c86354dc78385cf30bfab0f9a4124e7894faf6bd43101c9fa38ba74b9ff9881ddf1ea51570b48708ee382bdfaead6cbeeee6688b5e3e91ce1e2a014e0728bc0d007ded994c8af672895f1e23149a598d93c4f4ed90da72ad79e92d1f35f50cc9dd0f730a941207ea5dce0c86ae6fa15f14252076837a5bb857378f11b4f4e6deb541e9dbcfe047baec137b5cb4a3b0bdf0758f989e94a9793693abd7fc9ed6a629c3c67f688c427ea4bdef27cfcd2434a93476e65acfe85a888c07d4855958dabaf37d77e66c64a0282bdc7a6842582dbef09ac2407294f6cd9f2799d7bae9c6e95f9357d2074ac9d6ebd7b716b9e933a2284fbed8333bb8963b9f8a7c4a060525768c91a3f35146418c4580438a33d0e34a2a5e8a68592a42efb448db7d4a100fc6eda7e4a704cfe87bba488739e47ff2e49f13ffb859b6843a2a378ddb027208cf2b1d0c98f1a15c38ba824a5f67ab717632617079ca07aa9945e90bc9db95910db973945f9474ed51aac0155139edbf7d78d9b5432678568bbbcfcde0421538e13d2e145169b53c452f8460b5d7b16d78d6ef069b0ba2f89fd07e5cb4b25b71181aaef514eddcc981ad31c4f3cd80dbe6d1141ce7c5f201344857209dc8e2d9e0d698bf109d7605a5987abaa187e6bb45fbdb40c001e010e7780cc221d235c3f9f55dfaeaf4fb811f95a1aa35936d6c14bbb71aaa3c17a837e3e1a9e78aeedfb1fb8100fa80e7cc5e19592c367c6f6ee1954a130cc0e32794108850354f587db75d8499d5cdc537ef97f3a90aaf67542b1cd6c26e5cfd2f8a72535db18c2d3e58afeb0de3480e54529623b948b90f8c6fb71f91555ca01089adf51ad2edb792344716d5c96c4db215984bc57705a2a80e087718584c868b2027c0202fd08209d8c7ba99feb6edd1b712fe660c21eb07a4656fbfcda90affdc5456f61ed13705a4b628c2d9c47923a59a9e137eaa235bc1727c004bfec7df2cc82c15266c21362676f3d900f17a386fa3ad4644eaf5f4c3942e8249ba27a97ff7b1f5dd0dfaebdcaeae550ae MD = 27aa551dfa2fb1c0f4504f9bdfa68e50b4693d9327612a3fe8984c00d05d9cf6d3a0a8d0223ee5957504ea56a228e98acc6954fe35c7a577ba6be19abddc5dd0 Len = 32704 Msg = c8e2e36403ad4ff9f60010cb877a57139ac1463a8522059cc377128dec4ed899e447841053be14c356aab00875c53e04d4ee3129adcba1fdfdb2a11d7ecacd82d66d22040ed1131c45e8d8eea6840a8797bf6d63339a0d32fbe48cdbc85ebac2051c66471a2e748f2b80308603ffe2244bfda3f000d76ec324d57acfb351c7dfd81cf7e0611d60a1713b5fd7747eef6458707ad9fbcaef39df4c140025ed1e63b9347fdacae6ffdc7de10ee9e24858ce27e09b250bbab51b961302760778e4d60f2ea33a3cd078c7b83ae4c533a646eb1e15addc1af1ebf1b0f0eb39423b44be41d00d0aa124f4ea8a0d8a7251e0e141a6d659070fb5b74495ac7752bc7e64a5b9e36552e02b9ace5c24a7f8223e505a28ed47acd14f419aac0f4fc85f896c12de2e5218e12a93fa9445e4609007bcbe0a201ed64a07b27e5fe01ba312a3858e187b7d668c6c06f69c39e9b182854cf3b638868a6124327515e982ebbc15d7a0cf908e43c9381c4bdac85df3dffe298392fd29d2fef0e80937f02da9472889d06b362cb880d5fc80b8b9e92f91bb7af60836acb509b1fdc12bbec4e59a21c3a65435ffcb998cd01d9cd6346c7f0468d27eadba3c6bb099255a1beea59d4bafabf355b086fca5bdabf0e5e7b291211ba15e28f96d0a35e2be2cce53f338ed7266ae5ee7f19168edb11bafa909af59baea0f701152cf8703130aa19cd6534e375fee174b13411c88b785fc237ac1f56e36f94dabf3a2f022ad5a5a7157d6b7241f1c4985f4f20bb5459694fc0caf3d5e0c84866f566cb6681285c2797ca970612d9ebc3d9c8d7b9de4b63eddc86179b3f418e504851322fcccf4a15d4fb5c11711de381a14fbb5681b4dc46eb4c0f194761d301388817c06630ebfc5d8e0f26e544285c46322013d73c3ec56dbb2ed2a1bfb3043659c0cb05d3ae3571e134a8d7d346ae491eca64473807f3e4220b49c6a1aad3d264e192044e2d7be2937129d141bb122a740eea7a3ec44cdf3f38f13ece36fa8d37eed7e9f6d61a0013293c5a25f2025ac051f8b8b7005acf511c6b727bc3d2d7214cef3f7434aa6afee122eae678096a825821ab47288825064a1afa50ee0740df705a7d3cc59773a51daffc09d981ca3875f7ca55c96f80cd36724ee422124ab11dac1bb6f58bcaa45326160683260a613fed9e694f7b63245623d88bec6e55549946937970d1c07b1617c17301409b8b1a65800847363caa4d823fdec976112877dc9d0a942405a7cb0776c5e07c0e249a1217a92d2a7dad712fdd5335e3deab3db060d0ebdcfab90677be858d32d2bc3355ddc28db2c6cc658f496fae124e5b6f74b772e477200d4ceaf118740f79b07ab34afad57978759f230caabe9bc0c7619be9471a7d163302c3c725316c73afe4bcd79890f93347827d8f8ad3ead66dc8987ef40a793db8ccb4990251c44118e5c51c523c8c67a0b4015a968a8a0fbd08ecf0d010d6070d0f1fff5631b1727a028e718e54dd861fa850e6444ef3dd43b71be781ea2e22be5e7862877dce7841df5b8fc366572f12d3eecb1a9da2bf8037b7bb7fd2ebe13b1f505b1c7245d31eb0cecf87ed73c338cb3d618ff33136f12f12f5208799f311d62a419bdbe2135f4b5aa95266cdd2e002cf522aec09c424e1e01d1a54a2b8b11788de6bf71da981e371a5994ecfeea6ff070561e4a6f78a1491abd3e6a0a2c767de5a33704306353dc65ce311f4670c348703db7983319f2b9a19e3aa2e51932bad7d58c40cd9d7aeab37c65cc5ec7e27c1d5de274912e28b7bffa01b8645b2f77880626ed564e7baa2bea99bdedf7b6d49e4105a431be2d8b9c5bfb742efb53fc23bd6dd3767e3e64f6a033b89c0925971c6e8af1bad1e87d5f4890a0ec018890ce83c9b9d336aa603b269d861304190fbe6ed723d56f41d5314a28024573b57cb1dfa268157da9e523053deff9f07982adc7560229a120da39e82b64e25bc209f65960a9e55c233cd6c47dbaf6d62d3910046d555f6e6dd5a0aa018c6ac0967cc2796b42ebdafeae7bebc4b1b4bd1c7c10aa86e61edf100e8d18124286ab1b2040c82bfbceff23813b02799ad8ad3093d543087b0ffbf2cd29bbc650de23383c95cd099e36d37afd3d92063e0dae50c586575bddd9caf95a9b1a867d1930d517ec106bf1cd5feb6caa22d265f9c9645b4c6ce7d425540efc0cbdb890e0dadbfa6b1ababe38aa5f14a93b45d64405559d4e0c13289ba21afda42dc652da2a302d3a725fcb22bcbc3f6364c75b976b09d3b5be49a0e2bb03a38af1168bb027bdf882a0c0e0319eec33ff25c0ba9a016945a80bf105a3a7b337e791120209da6aa36b2d47c70d57d538a60698bcf4d15d3b5079711f856f1000e29620818e4920751ca05b475fef61988090b7294de3cefcd49232b6311a0448a487aacee77ec5b7be816327cf6f7799b44a86c94f3da2d15dde9c924eb0765555ec17b2bb8142b27859c93004defe856bbd6b64a0e9c30213e4187a853a4d711b4ecff5b25880ab73aff42aa744e0a2cc6fcfc1e8ef17d71d2c0c387ebe73e221333a5f750d66edd60b4cdd5faa043900ea1ba9d0558897a43ee192e047cff08d26c0b8aca8dbbfcaf53910d51752912eb6b5e4ff25fd8ccfa3005154da49e588acc9c7ff2fc96877f6238db193b2f47f59073a1f675dfcc7e2cf3d8181c907394fbd5514ac17310495721a9a260ca81b5d7773d5219230b383b81d104337a0c996042a9626ad629a5b8e8038d948f6294a6f56cb5d8370bc0e22baa8297bf65f09060e2ba6734360cfe08634b34e26d1a656aca92218040a0c75ddf2397e5124312bc97b33511b7f79cef636bc06803dfb943d16793933c405184c957d26fb4095dc222fd52f341ee1c197e5fd594c92d091d1bb68ce46137f75d03afd5c3bdabe7fe3ef94f5d466902230ea7d2dd1fbaeb43040fabf851e04f33089c009581a327ed262798b447f0d578aec456c589e1c67214c34f4380e1bfa3629ce139b297b3fb8318bd9cc90e0ca6d945bfc29a3a2126e872056a70a4df2a8c32f644c2f212c5c04d3c7b3c192e1a08ac9c78c33c81bdd9bc5cb1a3b20434ffeece2b353aaab8881573e433caa06ed7597b3c97617eb372d2b3cd8c81e56f3830b7717bea02602532124c226b0a01afecbaa279316ea43e85b922adacf915cf9970ac2988a049320396379aa2c17f0cc6f93efb24e80cb715cb35899ba5d51099582fa08f1ad0391a5e1b0eda7d237888a556afd451695733689aa2c67239b5b0fc908365c891a4d6f88af1aa93bb7d925dadd9a85126b94f2fb67bc5e4902960cc6344b5300a0fd9f3ebd57b8b93768470993b196de137c97f0d97028394e639561c56f5e7a5c483bed23cc5eb481dcf8cad36bfee055d42d5246714c594769b18205c9065f17d74d7c2aa322945bde4005e4ef4782fb44bd08f7e65213b55168113a82d2179951dcd317018cc28e1628a20f66f82bcb734dfa34f8c3ce5fc2c2f6adc14b0aaa5ff1da351025a4e22bb78a9cf89a428f0ae81045cf25f10e65c819a6aff7a012a99379cbf874a31ec6f6a3d3ccb4310db09332719203e68ae281636c74604298d6ca9820e102280c8eebd6fb0bce5f0e0e5848016ae2149be0f6ba49370e56068e9e1f7df25599722ca00c5edc713459cc3e3a3d7e4ce309072d0883208846227b18f62a53f75f19471d2b42682318b8914df06df7c8bb9b00303363595678b5433f056f2d70e3c988681cf0d76f73f1058e52d9fcdf041a73072431070056868e1c3594a8468c49968bc8b050daadcdd10849c9b617264f07b8c435550e465f05b56ce0eb03c1631b8e16cafbee2e149dc4bb844cfb89ff654dfab76909b2064f14939c1f2eecddbc77ed8501325f8e10c89253e71096f535cdadfe6b790144154193116b5074802350372a8a2ea602d31eb47eafe0b3f81e41c75384e49be1ff425284f8f0c114f821db01bd6b6c3a8ece0b4dcbf249cfc8b02ffedbd4e8a5b421ba40ed963b61e2f0c152c3701afce8de7d0764cec143dc22cd479ad05058dde6b28c73cb4a2e8ac7d165c4c516118958f4f6a1fd811c02a08975e6613bc1219721afb215564598adf381e7f3ca411a435760ab06f322e1304bd2ea0d11a9293ef1f2d1ffc76cb3ab0ff054819c5343a88e8ea9717e1c22ddfba4cb5f3ad89de2099df90e056c83c70df834f7f611ab8e80c8c4c789d46cac8134b4dc1e16248c51f851cc780db10bd5e2afde3f41fbfd1756248e7e1068a7c5cacb0e252b6643b14a02c08816e57f4ff6ecbddfacdafe3a7ff051c499bed5b0ae387cb8de0c0f11dd33729e51c62a647b141c3e1af197d18c5195c337153e282724ae3df8bef859f70d6b2084fd14fabb4e83c453e8d2c5c56ee4e3b115eb167eb72d1e42230771e1b83278783245fafcc37bd91e66b7fc7270c58cd167e363fc1880c181e44341e35b4f0cf50cc64d879a8be544134d5fdb7ec1265db32ef5e6702f9080a8b5b2441e4b46c3339ed9a4fc3c508e989cd648c15f191ea0d5b687e6c3f1061863aa4e2aad8da950d5889a111582c19dac4a006027cddcd7df8d26a3c34edadc571247a7fd48700b7441b3009ee3a8c986a14c84a1ab5f0054610aceb70ec59b99d378bdc4e1e00b81eb35f25fdc0ac531c5745556196ec23d1c7c9027998ffd2fd3299288bfc1f90770690ee1d3ae38b59cc0facd80d3c5a1a5c4119c5700ac23fca251d44adb7c0bb7977dab315dcb1b10779c8e4954b288e42a789eb0df4d7d352a202deaf63d97a80766455fdf266a08e36222daba31fac1f6eeb30cf68b43650a271d07d9e3b22b00f238c3fcf0aa6b4a75109dcce900246f9a65d30b0b7f768b902b094d176528cc490bc77cd2e323f5fce0f85483a1f5dea53b6de778384ff380e0581a81b787b19246d226731e172c201b5518a6e61c8b36bd42527877d88a21c25c08c8b030f8f6724bc37c632f3709481be2fbd581be7674ba14b343f99a9b5b7ede95580ce89c169c1b94b8535ddeefb2782a790dbf8ce73ef4d3a49a69163324668fb801cbacba2cf664276be7c89882a2dad7a6d5a19f34bb7da2a340b9d0b8665fd7f8e750e6631c93b75f1deeccf32ab3f9354add2206315b46fc67acbca0a7acbdda86ae23a955ca70174779126dd75fe6a36467fa1a1e15978e26187f46f11f738deeeef86668b15b7cad90f3587083a6d66c68aeda4a539d3fc5259f100c6000fb6739ee021eef7f74975cf61cbeca42b8a907c7ad7dbc61f88bfaa668bf166c0a3bb78ce53f2de5e84c04a32189d9c130656dccfa7ef8eaa2c2c01cb5d3e9c0a4b08f5a78931293c115b182cf985b2b25e6c1452b16b04123b09e875e118303b010eae021e14793e53a8b1c8fb5f68881762cbba70d8c6c659dbd71cd3e893d16a1efa749f373ed3e03b9f8c7a652e12b5bd6b5d62b33754ed344616925a676beacc736598f3fa7b3b7649ee134183d0bdde6bb20374e63c8995ce09a8d80b790789915b77e53cb2ba0b3974327f0a509468555edfb843fba362d75c83dbf07744f8ecdcd8756609004cf6a574781200ddcda0ca53d7e100bf3dea85bfe0c6f5277cee50274f16fc92cdf9f835c74b6ffe90e67b0c6e3dea5189801bb980ff6123980e5bd0ccbffbe600cbf312d706fc7b348ef765e5cb26fed820951d36fa49cddcc5568168d1857e87e51c8831e544d83b12a60cc919351b9c5478377d481d8abdbbe6a5bdec27c0b5cddb026266c7aa071a2 MD = e8e09fc57bd3b8e18b2726418836852cf1544eb2cf28c18f5b98436382d0b621953d2faa60d155dd28c2cb76c00ee93d3de56289b399c22a4fd82f00dd35ef27 Len = 33496 Msg = 9c06316ac709e94470a68650e1d6aeee089aefbf133df90a3eda0a5ee91fa979ee509769318f03f1795afd2e7e552d7a434ac591a56eb4f334e61d894389078a3be856a0358bfa47c77e66761d0d43824ccb663fe4d90068c46415413370307a2cd45457f886350e0319a871e88459ccce25bc11f7064632965edccfe15b8c11681e7bd6a5081e0ed434ad640544d5226f61ae4e077dec1951db597b76d2831798ceb16462971c0ee3d65c9a9cd5214ad78623403bc75ce59ee4748c1a5d7d5363eae04a57bd97d8d7079d5ad6bda30caf9c052dbc6bfc5e2480154cf485e28e727cefd1ae01f73259cf58ebda86c5329fac3b5eb1f1364c8cb724012dd11a906c8bc63e8ceba5e511377596d1b7ee824ebcad1b43e271767d9189f4ecca8d21fa204ddc1b0407b9a646dda3e3d985c665d743ac9ac414a5a0172c6d5af6a309c4426cf283d38675c105765a3773f4c48b02e558dd2289a19d50f6b39fdfc50f71f90bc7ece18be3097a2902f60da24569477b68358137321b45cd10e20d59fda94d12a47db47cc927afdfe54730f710a7aded24c96b8620c2fc9bca4b07c999164769d15ed6c2f0c2ac7e4953625befec3c23d4c267de323b7f462a04557bac5eeef896b8cfc6208377ef77422e36a8e0fd05c047fea7312ed6b778327fd9fd294ba83bb325ef20111a1bb73b19f0042cf77c3081b649e64207d7fc000d495620645f077662a4ba169de95166adf1cb78336e6b971a2c16201c8dfe9488357dea4306432a0d4fb43706408cec71a2c56bb7c5bab2afb98c701cc0c51678043b30f08638f6af57d71e5f0ab1f5ed69b9ae8d6765faff560fd9105a9aaf631e589a71c52b03cf24eb73b02e08a8aaaf71e9bd3eb496916c6603ff42c586d3eb9ccfd0ad6778f51eb8ddff94d92e2fddb3c34d30eeafed645a97f1608ec54fd3cf781525337eaaad050556246caf045948e447275d6c9ca4b33def9c3c91603eb83c4614d63d74399c93bcc60852b28df8f5b20a47f62596399cffde19158c9420c46d6499dcde2a432e3a62f73fc0df8a9e97c1f57410a1b35d2c0e6b765e3dcfb891fcc4846de8c37ed6e07f9fb6b9c886fd33af0fe62ceb277b147bdf5ba18dbfbbc49f5cabdbe42c9a28e99a1d827856ec4abdef2da1a7a3f6d891760d282281f2a4718d1f6b6de08e227d577ca263b56ded663b7067b079a443f563fb3b55a73e84843e51012841b9b782ff5b81514c8604f31c34e6ce508d3beecfad40efd9a74c1e98ca03dbf823cd42b942870ac34178acb90386c8d0baa9c5e2aca1b9be36e488c311db4fadd44d03aeba1c55c1a62fd93b64af68a23276c3c37fc478fff2340ae6aeef4c07d5200e054aa8fbeebc12c2c9e0c9746efd882d9bae13f743e425eb292aa99aae2d2cabe77b93c5f38b09af8cfe3cb5db24c94e91c2f4fd33129d75b50c70004be45b217cd44578781bfde7ab4670f392ae206dce42d151778685eeb2dcab47860394baebdd26df2475d4b34f40cef63ba374d179b611bcb648c69f4823c4370690bebc5d1e9fc1a0a0785ba075bc857d0cafc3bba61c06985e46d09d6722987496c370f92016e593a4cf27c56ca36a00f0b88bbc9b5af7c7d2efc9dc332d32771a8a1ee86af414a68ac35ee7adec6b6d577771a31d3356e8aca8d12b0c4dcdb826fb0e5184a21681593b4a2dc1fd516c49d4bd99b20feda6f25831b27cea30dec1fe875df786b3cb191e31c02f40e3a4cfb7b6c5e45682a6aee9329b0a6c2492f47bd3344a0ab32dd2565cc77f1bebbef008a5503a70de93e7421a0b3f3b717cc65a38fd0595dd4e8dca136b3af82f61b5afd2613cc5c913a64b312ca1bfdf433f83ffe1b18efad752629ed4e73e79362494852173bd0bcef2ecc126ba61359067df6f07d55fd26f270644290e558fe548a006b766c16b6ed30d102112873d0a4754d297f96f2dbf169e4e9337a5391526b99c4c9e37b298519667442f9bbd5ae6cb6ebba526d36e26120439eb96416ec8c89108a189a8f6756f0eb79b037e274c2d8d9962ec8c255f4aae44b1906e9a35b62b12f91d153046814da3de29481a82607559b7291f8cca2f94db12fb873e7569b3932d5dc1eeccb26c307e73e3db8f4e6e242d45554a6ea7fe27953f550591cb70b2c6b074d710ebb285054b16117bddc2224ba8f608549b334fc2c4a09490c3ac984b7df593191569cbfb18aa644ff7b77a99bbca6d82f47c7c21f22f967a38ad6c442e0dcbf016d729e641687e128397559fe49822029821d63b32ccb15714bd573a2a84279bd844c850301504cc69a8dae68c2acedc716a8497ea3d8d303e2281b4d9224e2441facfc04c7ca185913332f51c461a16669eafbd844bd30c9e24113aa3aee9923b4067bffd64fb46e37f8454fab5aeba5e077e3666be2bf41c0d3054f0f29feead5db8d4ab94ba1647d6f98c903e31cf43eb1a89fa5e3cefa023058b28b4193f7e9ae987bed587fea57eb92445ab4c5efc93aa3ea6f3af0512b0b966b3bdfe8d983f23609eef0a05e5c0eba480c3a66e714757ded4442b3e5afa736ef9d5f7e1e2948de8b4aaea33efe4b794ab4de8078a4f49f0eb1a59a3604a5c2963c3ac4244e050a666cecf90ab32467d2d12b9312ff2a7fc533de13b0de79c215751c4b8a66d93221d22632501f2c0e76edac2f54879998a73756a0f471b5ade3e45e84bf0817fe5426f4bf9da6b4d58d66caa5abd2c4923b58a9c25f72cbee68168bf040a653c763b7d32141ce6135acd921a697653dc4e804321870663f1c38682f2eadd61f15d7214be7fb1ab3d74bb12ba295b367d943d699e3d5a081bfdb75b28054fbcc6234dfc97417f02f12f08b531a2551d527c52c4be4ddd63631a7bba0a5e49c0e44f36fc6662703357111c4328dc4a4f838e281c26c175bbf2a439693ffcb4b3736994ded3eb6b8599a45f8446e024153952273981a00c5af0235b2e70e876de9afacf6885e35742dc703a4034b5c9b79c51b7e375f38986841d48d24528798982894f6325521eb04bfc133e9963237dd31241e1aac1d488d61c681d65c6a3fc539e7b965a41a7170bd053471ef318ae071d2bfcca12d5a80fa723d679c9de7e34c1bdcbcdb6dac1477463236b6c92945ffbdffc7aef742d5747e1c7283a11584d7b7cc826bc9ff52571a99a27d678750433c3a9645e9961d5820ab61b2024d3c75321560c58defacd4d8f73fa39b29a1d4d41ca306a2c8ab2e3066cfa83fe35cad2123d27947f1968937c788e9e274bd3d2c029861815f115ef3db16c6c89c67d7eb84520776a9a1ec8d86f880cc1d04e49a88c0c723cde2730184c19e1acd009e27b369f0988c516760a21938c6770b53a60bc6d7f8998102dfd07aaed4f999683c4d74b53bfe179247c5655250174302d52814f47e569f76e55a8c7955a6a4bebf9f1cd5cf8386e5b95d676df7824e9abe5a25bd33697047c89f817e3b68b50a1844ccc2d1c101ea2bd689fc2b2c8053b81e9382a666b61deffbf43de4944ce2dcbb0f1cc11b2b1815cd678d798a8af668e1c8e545b2d331c21c5f28efcdded1838e5e443c1664e80dae6a825120c0db37404075aff25a5bf56d1cdfcb89dd4e831b24c9a12741d28a061d8b4093b47aa9c694943389bdc4e05ad7c2f63ceac2820e1d2d7ee234700140eaf8d637e86d36c13fc17f0d60351981fa62fe6b69c5d6c381d043cbcf4919fb7d6b70a1df2b74dc9c9df0e1f405076f0f3052a9dcd117d80d628e4874b61aa22f43ae460b2dda85558a27abebbd407e80db816cd66cbbb80a44ccdcc75fa9b18b21fdb8eefcde37d50681cfb9e64b3ce9950918d90148e023077e1d39ae4db61b86dd6f1d010680a5939dc1d0e89e26c42d6852473735ecc21b107e3e0a5d3c5ad2cbccf7e2d9dc31d1ea26e35cafc88ad51d9db367093a82002274672c7ea0c3965777120acec72411e56343baf69eb85c975fa0293955cd5732a4276d287fd051fee1fdf16bcdd7042e0b848c0915d704741c9fe65ccb0e70bf620154c1462b9620921e3f274cd509128428286dda516d1258f536da16effd3742876bff801fd36b0be53c87e0a8913161a1488b38d2172099628337a5cc4d18ca1c2b29ba277a4cb3f5721415cc4d09387244e7cdb362fd524a640c044df0f27d520ae650fd2b342ec1983258ba9d185d2db61a158ff127182f41bdcecf7952b0ab93abe0fb46cfd0dbe79925edf1dd644604888cc2422c5f83c4c341cb5698289b4de0e69c6d5e5ea7188f09f0fbc6c23dc8b9bff4d67b9cda35c329ec195129a3a22bde6aff9e0cb583aa714e0b731b776b341b821ea364b53d23d39c221c584738f334e17ddd7f79b161f86fb150b4a5747e1c148b222b87436bcb46013819186acd869a88bb3b763a4c1bc07dee422a6cfe5e06bc7675d2d1119d8447530079c0115fe080a5a53d86df380ad1aa3888cd4b4de3232eb82a7eabb6d164eb92fdc1750d7df62b61321f81e9895d230c431ddb68244fa986f0a490a3b7da704516f75f2bad69cae3e67cdabcd660e731ebc7253964a27546b7db66e092287f9b57ca4647094be291ed17500e7c8d454de551bf3e0ebc209bf28ba4fa0adf680a22c2a0dc1c2d311f9887787ae652ebb4b2661fe2ad0d29eb434dc15c9c5fd8162a791547408e04d18b35ba7eae22390ae54cbdc3aa05ffb90c9a5284a12a2e43b1460a3530defc5c37baac762eabbbb4f0ae2f5d80472089b0e9cf1eb3eef91769b2061247a07614208eb51df23ff24766e2cb2cea411ad1f2c49d676eeec705a6658f5b0f63109dc81a6ac2935f6b36ba83379e32747d2624b3440b1cca06a319a90c9bf2a74a5da0e644008c9a95175e17fb3de36195fad91e698668013654162514419bed81d84d9ab7544871ee4de4196c98878913c4829e6445bb24d4ad4e421ce85596559220706b3a4165f55ecef0221a996b6517b39bcae5909570230488bcfcca32441fcc3fa62f11f748de8144b25093790868eeaf13c272d38749db714afb6461cbe5a3311eaf34963731ad7f73c6f0428c4c8630c588fc7f887655946d70be755b6837fd2b3723d36eec96190cda4a485f173cd9569577fa025cf55a8ad9331d813c0d0c52536a2f5e83ed99e4271c0aff7d54f14d748fc363522d3c29a16c9acbb594e73a90621a648c268a7029c00afbc361212092ae7c59ea7fd1d075b5ad998962063a5ac6253f69b363575ed0b8c2ae03d1769c5e7524aa6f9405a2b8a6890be6f1d83ee0c03d9116acf032e8a4e281af9a95ee0a5e72066efb3fd4e01608d1b622aa995c7bfdb6e2dfe142524fe9d2b6e525045c88b083108ff568c68c976f3221181693d8ee3f8a648109b82a3735cc399a7baf947ea4d6babcfad67ac338fd65a71311378daf9fe385f594c4591f52106cc08e022ae03423fce78a510ab37a78ee3b7f485a6b75c53692429ecdf3eaf2225f724243d9bb244bdb6cbfdc833bd343ec186be307be92397c7c1a1457e96741b4e6e557d5de541032f807b71ca3fd4ea18712a608ccc2f4f08bd6babfffd8517d765be579103be08ab6d938e4555f74f845ed11f342efffab1c553f9070ddb7f58b266b37e334334f23a4c08ec2924d5ccf5bc53b9371c0188806017dfed00bc9afc557a6d9e59efcb8eafc507e0e3e4baddf2e5640e0dca56979aedcfc77c3765ec9492a66c87a10011c2aedea5bce414bf7bbe7ddc5abfe2b109641ec0d557802a2ae571c456b2576c8fabb99e383da34260c44cc88c47f677b66216029583b55d1f5a16ce4d8a99471ea5dff3de572f0fa8e118fb2ac95891a8d0fdb54325ca2d7cd8dcb4f4918e49758299cd369a80cd5bfc2b9dbcafd1a6e7971c0068a4884448490d9bd330fd1b9e2c2f54c96f5d2582fd MD = 6c66192d7e119cfb52e822217591996077095c73a7b957a0610ee815f9000fcdc7756c08cc6227798ec73b651666009378c879e47a2402e8861fd1cb80ec0369 Len = 34288 Msg = fe722fd9a593c85e68961b93864efe0424da67de94d6d5b9d6ceebb65ff85eca1a221259ade98007fd2c5bcbf4c073458265d951e1f944dc1eecb3f6d5f454293c02a5096274d90db98c7d9dd3215b6c69949f08a10638b090c88165fe1321436afa30124e9c9b19a59ec932a9d97e24e14f002c5b6479dd374b9d2b65be8cc2aef2fa9cf9ca8dd2c74b86b20150a413f37e45e5987bcf0c185b4e6f8f5b5f4b10d24cceea6478e12979fe4560ed95e1a60ab75adfb302e53de1de590654608997826ed0a9d424edd3117711501a183703d99bb4b874d90fadc69312510f58214beaa8cbbe80599fcbfc3a41583ff7bd10d43c1aab261d3370f0b6c2f8f60ebe34f342e7b2d2df9f1b208ffb01c2f81ad7e3e1b5413196f88f498e90836f4c065b83834b0b307d94cb67bd67d10ce4f660efd1ad01fd0c0711b865a57be4d8a1c783b4205404fd26e1b80eaf528582fbb1de552974f24707fe24812968bc7b3880dc1d8d12b525fe67fac8f80c959ccfd49ab55120790ea15e772b43d05ffd738f7406bbcfabbec46417346d86a5f81ad109394e8ff82b7d3a98ab1b3d3526f9fb35b7d1124e8f20e1f69a33481b6085ae15294849d96442996f49da36a6be73cc0677f8640662b8e57f4275da6199b775a5cc66d482829884e44da8441a8c880bce90584c3bfd37789a7359c5dd6e592ea06bd1ba5d4d2902dffeacedf959e1bf77481852552943a22f770790f9a613dff04eb183d08c9a1b48a60fbcabed25f0e8e861febcae846c2694a8c31c088c927cbd2db5450996d7078bf8369810fda609b75ad9d854a4dd671364e6ad5e6d4e2c006dda238ac33f04f590e5288a11eac2ff2c6a12e348fedb3c6282166e5d1ce85e9a79d2d8c95a282eff50c42208c3fb06fe39d0221ad56856cb1ebe0105039821dc1bbabb5131597d6cffd2a28b3a9c16f9cf7bdac26df7abc6430dde0d0b248f5a4743fa03ca8029ff7bbcd041568d7544b37cd3e8cb71817c786bcf1c3c74f13d85d55f862f867be24be874d31fb66b096d39d533f9bc211545409ada9f718eac5dd8b0836851bb3af7c058e89d00426d861ca84bfec2d3b832f408f13b01b0d058b4b6a17bcb313208aa4329d951409a858c13d9e269de8dc8efe106180d9dd1fdd1398972db24ef0510fc3dda93afb8f2f1e085ad9b8cbd8e9aedc43f7e9ed6d59701e25468de9c76594ccea8acd5ee56b2d5f6683f23700d5bf3d0b73afb07676fd5552a5ca55fe3edfb814c86fb653839bbd51b3deccdcb9bbdd5882bfc8d3bbf7e8afb9ec260d534d100cd07684520ed59c9cc7d2ffd52c31179bb38e990d9f0c528cf167dc8d49696f3331966b59636797b85e634282a39b86457480937ca6b70d8afac1dbf667b110187a33bdd237ce1924d624274d9677a3f6445a5ab95974741a148ec6c154b0bd3d08c30e64e275ab72dd9a20ce9b31eb2eb160514c2db140cb0d230f8686e4c1116be8df8a09fac922b319d16e2876e64f2a37199d9a19de0e132328be74c9c6261209a3aa04d9fca525379bb4a4a30fe84d431626350ab663e503a4b1b4dc36eba9a9fd5d697fb08a7277e22ab642d27a6918c98e84f0645ce148f638bda88de2814e3f1cae687f33495f6748c3d2d8862c2cc63ee08762699677bf9c059b45ab476afb405a30c34008627d8763df8c9bf4f37eaffe2c3b1a82f443640340f8965a84b490e34527213e05a77f0cc5591c6201656a245b48d0256334195d161144393ffd66d032156768dd87882520d887d1db0ce60991363afc29043469a72a2561d1384ab7641883073e604b437e857ee2f4f7bbf47a6dab85da363dcf50adca72fce7a4ff779af497ccf430fe3aea6213c398549b5369b240db3cade4cf06a3db279e1e1ed9373ca8fd95c1abe271c1c2db713864c8a4dfbbc0a9fd406edf3208c5ce0e9c0557eba934e785d311b62e9eb114dfd746c994651ee0b478bc91f59a7bfa0f0d78875217274be61a25120905d8f5c3696a2270cb4a836be434c98efe9ea487d9cf40307139457ad7a92fd176a7968b918f59e55cd8047c1963d03ea3c2401197660ce755ef56aca22a6a188fc16980f642da72984bd66d8ec660b5387b7f34bcd957e723be1203e0055b5eafaaf15bfe012e991c1a9bd8cad8d5631b2e9459b0a5cbc07929ea1937e67e1464b8c0751f66b0d946c8a7164417b8c8ca4032091937b303b4b75145003a3cca3d9f5954d0d02ba3b6da9ade910f8566c474cabb6d1ba81164eaea1fef6d21f098b32e73c8c9d998dac4e97a183cc5cda820e0f912ce357a083917224c1bc8181498a26a6dd05519211c1571600be45dd3d8f73ab0dbc5ce2d366ac4acb299b11fb477a1167028b52854916d0f097b97e6019008ada0f36e324747af97ce115c489af0a07925cefd6ee2ffc56bc1f62c4d4f2ddb8fda28dab600402b73cab969fdc0bff0fc6da242536bc302fca1ee5b77f6234bddc3d0a436d5e6c0f7351c6acdaa280b26b45d3474335dbe6845ced5f4ab32a1fe1aa54b235cae18689994ef26cbeb676e965a345ffe5240051a020c51d2be96872b014009e9089a6e64cd6797ba5c9e6a9023d265013340798b426f0e114991ff916f23692f78bf6f332054aeda0e08711e448f220063283c35ea8e87cb461cddda5955bf8480ffe1612846cacf723e38ad26db1560747fa39674eb6d8546af98625a677b7cc3f47b8b5fae79ef2bb817d96546cda5e9bf66297bf61dc3bdc2b5c5ecc93b9c8415842e410c4add9d0e950f6a42b945355fea6b5a4f16fb3deecc717b0b5e5873db91a656e0ac0f389a46dbb06f46c2e9e9b6d8ba46f7b0298c22f1afae823505cf3aa00bbc1be890f393aad21d14a369d531fdf68e2e7713338fc2d51315b6ac58d597fa0f191e38a3021939ec916b47bb1247a97529b48d7d396195d9a751ea20f8ea8c4a320492112883624e4b8f05f3ae424dac77ecfab1d65a5c72a5ab41802b345d0df5303fc65d95f5c2b18327278c8a4d94a7a4ed89dd29b37e9f07451ed2f1c6bab125844b47bd4eda51ec2dbf236c43be2760c85db43c154e020a575586af63e1145922184d65e815bb3e7c330974aa9985b52db6021e1c716d391abcbcc9af018d4f7ba5f52c4bd53bdeb52bb54ffca730f6802b3d5c13793ef7e1ccfbdd22ac8a7d038cc57d04b972514af1ad3ab477b7b96215cc52a4d605db5f0eba564942aa764c2544d48d32fd4ab03d57e16c7b8872461e45be3b184067e4ea8ec19d545bafd817d9cf5fc21b1f77575bc07f3331c59e9d2feb60a07d1205e8dfab99622c9e19dd2ac9f6f77a3422e81f44873f3207ee2ae156901f2a5e54a22370c7ec7bd593dd8e60dd43994d25681909fee007ddb73010ac53d4c6c1337ef0cd9363e7cad8919b009d26d6bf114fdf7d50c6319b8c5514492671d0df34f7ddfea658ff025aa1c7359111d10e5907e91b27623de5dff292b98266e70cdba531905b4c0ff09c86998c63a506af6f38bc6fdd448b2114a0e279e23467de9a0f923f3cbdb93a00a898518f50f636e65adfe80cddb7f1ece8aa06e05ad1c8e28f8637c51e793339903a417e961e2930d6ba1010ae22ccab224fece75ab35067ad74367efede70a9d5f5c8bbf4ed0af144d17493368a15e1f65a9871b49b097bf1e2a7e4cf4776d3d26143b1ede1308a1dbc820ef72c6213cd30a619e8e758a1f56808711042ba4a1df36f0af1a94e6dd9e1d4de60a835d32f88723a7836c27c106ac4be525ebf6f21229721a093b93f01d7c9ac137c058285c8997dd2e7eb5ceb6189271609fad5847558906b3f15601e04ecd2802655c47857983e999917e6dee2b245cbc2f0ffa0722fd1b219c763870fcafc2715aafb6fdbdb072cc8ec8c7374dc84f42836501d9f895025a253cbe54ec08388f87999e4cbfe621cd5edc0418e648f2f983f694463f1a636675f0bb1488a03161d46427f8e5ec9ea6e7024b1a5e6aece9180cdcd55f55e54e73da5639373e56f12a56788b998c905f1381c4c31ef7e61a28ed010ec00b31190641b84a60ac4f466fb9ba8d428c9ffec9a3989e8cb687959ce22a79ca07efcf186f09cf6db0c3688dd3148447b5748df1aeef30117178615d337f9fe610c67990aa7051c5135b606aedaffa12cfb71372ebf00316ee6086522829077aed5e1e553b1557d09cbe35f04eb3760aa2109936a2c49e01f6e80d62095039f06760c6516a2169f61594ef0540478197f52526241b92893b51b8fd771d1bbeae4674796b7ebc0f9f448797930993a22192a1c2249d834d2dc7775e78adb31d1e5241408bc10dd233f33d3381f2c061103f2a751e71bf713e20cd384c0140dea652702299793d391ae85eceb743f646cdc56848fae06d7dd5236494dd61e98ab010a8287eef73cdbcec936d1d445cdabeec0542a030b6f95c9ae1791215d6a8a3529259206bd81482c6841a9b3d1ba44c7ba66cf9a9c16e3a4beff0d36430c0e7e1d6bd68349498d240d8dc19755a2cdf3cf5cceb95b764d7fe340008981f5ae4851b5c3e94cee1152037bc7f3542fbe0f59a6d5f3abf619b7d58b199f7caff0205093f8bd1af75b42f4bc0b5c5fb98b56f3d543ee202efee8f040b6fca5a36a92b496d35345ede1535b9f2a36dac8bc872858b6ed3a79538fbe0177058f68841bd83ee260503a4a2fa2c5a32757e5d80c61a19d955d7dce18a93dc85ebc77c32845ecb448cc84dc2454aff482498954432a50665b2ba4a5104c66297c9f59ae448830b7911d363dcdfbbe9cec322bb7e7fce5afc307769f03120b28c3ba76abfd19ab6acdb4c6e5a912820ad9a465895753c1e851937c127d84ad34e8905752ce64ad5c5335cf4a32139adcbf12af3f1dc985ae8b321d85cc3ebcdc3fb384291513b6eab612b7f1f5795971210f614fa7c89140d475e38f8b8aca9d5d9685957d8168c48ade09636fde5e6693ed343181db856dc1c15696480356e6b6abc43e7448334835ea3c250d9d0a2b7c5e909b386cc273d7c6ff107e32d246cf75d87a75c297044be9e89d5b5ffd4e6eb5fed33806e9018ad945a48a83cd4c2c873ad01eab1477313f6762d571984ddf95d7800d3469755f8ab2c91990b855425253e5cb4c2c2f9a6d60ec087c7b884360d308247fb47dca5dced497c423f0a569bc1208405e7bcbf64dbf70fb17ac3ec959f21a336a595fc5127d71a890acca2febeb42022c0a5a6c86438b67ed182611d4d46b19ebb68452f61a53b86ef825376bd8250c0559ca22b31ec43d7c6a9dfcec15737dc903ec7a1241aa6e4f514af2a47f1de87ac8afcb5cb7c7f635f20accf83befe972cfdcbcdf79e2549256aff43e3699021cf55fd8db94e32cba6cf10491be1ce78988f99db62997e5e856d8ae81a523033c6e7eadc83cc23b6a39f5564122a6f27dbda79f4ed737aca20039a427315846897260ec9b25d1ccd5d76c147ee00a84bfdc8b3402195e135fb157579761855654cfcb07dcd68e3b8dc3e9e1b3aca428c07408ee685657b49208c64b4abc46ad5ed50171f5c57421e28dd32077bf206940029530ea24c10ab964eaf1b9b818d5e80098cd8e791fea74a3dc6343bdfb908f06d4be2feb3670665459ed7cdb884a80f1157d0f77ee2fc4944a1ca01f92693dff3bb872300490096577910c9cf185ca14fc02e1386b5c52ddc0df056a814dbd6a3ee28999d7e412f6e87ed183011223fab0f1bc4113ea9feec50cec1544a88dc652bebe6f0ce723b711197414137a1f00d8bbe91874651c55bb38dca659143fa21b9f89463013bbf485f36cc6c5282bc5d7d40025095658a137e55f943b1b437bfe1782b5cde43c5dbb9f14218296cab832dc89fd4f38c53fbf94dd75672829b27eb9331452e33541267f02aac8508c668e37ff17c286e2afb6c9eeb079c552e421f703085b9b275d5b05c0c922efe14f2e78c7faefbb416fb1e6fbdbcf6d7f9f6c438af8447692f0cde5d7031ecf59d0a8018d1d3360620e358e9d6de49ae032c241237aaa0008a9f371adff187966a99f84b7054 MD = 2711cb980cb4fd62df85446940d9c5d0e382912c96e80ecfdcdaf7195f377130d01f1530b429e3658c371e7a91e3a738814ca8c7b1139d9847756f24e9d247fe Len = 35080 Msg = 61ddef57b77c6c122d6128de0b45475d3af8acf74e521a74c46d99ca87111c33b9706083b11417b9401546d4398fece83053e47081dd0ce69587a79160fc009f2eee5173a00ce240f12e75d77ed3e2bd86ceff812e3cc24cc8b9aaba54d45ae847c088cf8c4c15d0c9147d8fe3f97205c4d0c4d15c5784cfe56d69ec6c8272398d4ccd3e7ebbf8904f3026a66feae4e873c0fc0913169a97750aadd0afee90b887fbea687c43d3a90be838c12b8c808d1a086fd05b614bcb00f83e0e2500fc8dbd35a5f691cbed4285a57a8b1dc88e1d410fe5cf3d20e1940c9ee44dd6a1fde1b763c890c23c8f8446d0b5a94f8755bf703d26aec03ba21923666735cbb7dddcfeeb19dd197c0197d5cfb1c6c9af1e9c30faf914ed9ad783ccb78e6f0b2be2a5193761869d748ba2ba0c3688912931db08ae28a9ca26c7f990f922a39ee6556590ad6732560c75cd7eed0c97b1ded6a681c1791662c5bca4f595ec788dcf7e43ecb7f58a4d2d0642a8dcfa9c31b55522219cb503ba60fcab85f1b197dfcda468b3bcd13689bd8726c040ca3f1795f57973a5a417dce0d037c8763ca89cca10fb7024c4dd12a540a44e8142276d68ffd3fc450dfbcf2b8070458c5452ccad0b25a8569627f1ce79e1db072bfd3b15bb5746e4b9579b2b547d849cc03d785edb0ee5bc0fbe2d1f7a08ee394c688784712ed8eb71d249c694870d0c4912a8c4c8ddaebdf747ce7f8a3f10816f115b9d697f3ac0fb14dfe687b56946b77962c91cbb8cc1156dddd8f3aec8465a9fbe48ea73f5cd1fc6687276301fb0d219b0541dcf063032d56111fb7f9ef1d6bbb96d3e329079a790e952a91fb7b4619b994e1542a473162a6212ebd71ae8ab0d52f4abe3932b59196c6e68abb9b92ea6269d4a3beef08912e9c30be1c594a13c93c57aaf864dff0af8aefbfcae27ffe35d2a05e36d105335fc0ca2c2265d80f184c8f3bdf2465f0a96faa9391e659dfa48dd8d61a83b3b3da6d5faa5c6ac0fd32ce65d365f7e42c24d3abc8b8fddd092ef9e2cde27da0bcfec0659b02be7178b93050241535d6fd925567a198bf65f535856288273538996d887080bdf7860c0c10e2807584bb0f826362c0c991814e78debca7413107e3771404fdf6ac5b21bbfea18aff5b0cbc759c2198b42abb5f396475add8f77b15dbf1975545238d544947f1a62b3f489edc5e38bbf0c170b22795020e470f2ecaecbfbc491213790e248b77548187fb213727fc8cf81c5de1940f063b23de8f5d29ccc82bf5e2cad9de4797388aeb90ee0697f19e4291bf683f30e6d6e7ec195723a76f805927ef21f6eac5a4bfd0b64fdb1ccc6268b821a0698928441bce49436aedf6e8c4495280df13a73b88cdb7e11524c17bc2f63144a3963f1537dbbbac5fff12b7bfcd91712720a06f8e39222c555e954cf9d24aaf8dd6bfccb4cadcfc8359279fb43b286d4fb045b328a9919c1c18ac4865e2fa5b88d91ecd2ae229ae659ac9e349f883efb9310b98f0a562bac9e17b00af9eacc3150bd0b8f2d82e4c87226e34d9bc3083043166a37e9331f2ff5776082f6bfe90c2ed79f2b5036751588e8906fbccbaa1b12feb451b297bff1cd941c17de15c2f02fc8f1cd9fa41576a4daedc18c08ec6308b0e005eaead19b2e552cf1375321865c76499ea3358c93cce4426c92e398b02d15357d1b931ed420a2d7378ce3cc76bccaefc6e351a1130beed69756c274ac8a13fddeccfc6e45ac636712622c8b6757ac2a6ce8611e9f66e0f26b610e4afd26937e53868c8995d98022a943962802360543b838cbc9dee7a2de103a30e04b097e0201d0ab366db0e25125b68969ee60bb82d35df96a79951ce2ad698efe3f3cbacf1332c13f75376f3bad446d18d3ddb82fe5df51cb177837466a77926e80c6312daf34366a5478102a6a73aafb5bb6e29215443db36199d95170eba3f7b7afc966fe5f7380b37bae6483cea8db2cf223f38c1624e9feffeb4ce74d28608c006cc1273ade4839462f3221dad07fee99629972dc6e3697b2567ff7268b72a6c00185524ee08c8fe37ddc6c2188b14ab487cdee1f8262d4bb0032c6fc33f5aef770fba921e2125c5a7eaa8b2a3937e74a79d72866ca355c21d3ad7f5a88b14bada16b513d4aa349b11ce4a77d4cda6f6322ff4939ad77d8ecb63748c5f26d26eb7b1c752a8107fef23dd1e7a327628707698d792093efef25901a49c7d9f3e7b8e8583b6ef0062225cbba74233497d93f36c8dfa4e4664ad34b9cace7a509351dd065cb93fe685d50ade77585da410d1271f9a44c09a491fece0696aebe78b821198c4e2112f4597dcba013528027cb890368efa168716bae01a031a28d0719ccac15ec9e9673bbb30d2d76119012baabd25de92a6a9580ecccb1a54d788000267148cc94f1ae2efb5bd5c54a71ca8280c720ba6f77d779bf17831a37e8a91438506d178a8b6a585c9de229858b17cc10caf889f8f800fe30ca5cb7e6464cfe0932cbf409cc72e1debb9ac94b46c14064c42f7e4e53d8b646cd85a4e4f82f66a1fdab8c981c8d72899d46ce230a8f85839b0bc3f8f2274a0908460ab9681bf2099b5507bfe382b3662c2d5f963f4a447539d57d7e3bb5618164e611ebfcd74d48f2118c06891a4b7c4e99a52b4dba244384d4d769984aa4b7c7afe0041e2d1d66ec2743f6761de3d3ecd0c76a9ca7cef46652f73f70adbbb21be7a08c35e30b6c70de551612532274ef1beedb94d9e990c695058b2ba74d7a46d77809a9c2be616580eaeec683b1663dc242079e171e208be62ad23000021832c79105e192df4db5532907f87737b1c00dea75202b15aa9f8d8d9ee9808493c5fe1207471b153947a03be812f55d5e5e440fad84db7539e9d25876bdee78f3e9c624984224092c03ae48197ac6cb7401aed83830f0e6d251fdb0e3141489418565ef3f3a77622ed1c777239ab228fb90946e9d8e32127fbf55bf6c57b85d8480249a8497dac9479931f08dd8801cfcf33ef86404689e471b23ad99eca39cc4c44b4eefc216e6804335dcdf9efa517d12f49f16fc5c35334dafa2f23c9def093822320921f360e0b71b63a253e66c89d5fe8b3addd47d493e41c500af6efe5cc4f16f591d38e06fde2bac5d5e0d182524a3e3580f991e93d4213e4aaedd70c450ff2c671faf0d369eade0982937fb5be72dd0f8fa73c119f89736589fb3ed4ac49592bc8d1e903ce0e826dc1b2bbd3206e279a306290ee293ead5b3ebb81ff508fbc9dfd04e108a8d25a7af9cb307b3690b07e09b85acf68b6342e2fbb4abcd0579f858510736268bac8a9c149581e4f8efa138214d445dca4aa66d366f3cdaa15747b07710aa1ac4c5f828eb9ad2cf9cd87032004a7d1f36e728dd03b07825c5dcdf6ea933136e1eb819dd8a8aa27c3b0c9b56a0440045b981f1b9cc4107b55a51e81a5136192883cc1442572d9bf1bed44b2c690374d73a612889f8e8929246fe893dd6e26552da4a12dfbb4b63380e78a83dc44e82dba0d0f6d6ef6ec1c5732beb5ea0ff9ff30b7a3a3d1faba2591140d91017eed25bd5148326189b3b55c720360517556f14fda4b5e3e916015ab174072dcbac0b5ec075f604dd36a94a2c2491baa3ab7bbc9a10aa5983542745d55b591d494ed5ed493d77f5a509b2ad89812406accb6ef3c9064228532dbe21653ef867f89cda0f58b23083d9daff85c57d18709a7beec172cda5d7c3696bf748650b933f60bfccd51e4635df7237daca619581d584a32f7daefaee39cfd8ce6818bb2a88602f2ca8c7e493209903b47f75c2bfc5ae3744d3f169f61f28adaeac9f30b33a65d038baf6302604160b1ccc00c8b4d2c04f095ade1c76dc3c91a0fc4191b6bc374af7f1f25275f4b3f619994ccfe865849684fbbc38f6d8d32daa404806bb789e46723605730956366db4ce9ffee2e4c0b1bf9fd5e8fe7bb529d760fab94bd5626caf7275bb68936817f454427d2ab93d4bc22c6f52172da92c2c45a0cfed3b4a63b88b8b511c14119de1117d75484ac30a938cd39ec85679deb3d581732a1220d4956b8f5ead40f9a683ee970ec4011a963ca549f59a5eebe973f9e7cb89c3aa664cf8c909a17ee7dbe3d3da6f27450998c561187f14adc8f2749a18ff92b4b1c2e71c807b8238a5e308a98cc1f97d59b834a68a63beabd7a4bf9e5d38cd4efc8f6dbdfedbd7d5f968fa56f62bc013d29d935ee5ca20c1e2a45beffe9ec3f95576e7c5895229bdac0fc2c460d6066e3cf0e97072dbc355af9d50734358fb1e821f5c1b6a08ff57868267d911e952f65f583fc479bf2ed10835a714748ffd234c31d4a7e924e10d4e69f17f538d2d13037e9c42429de99bb31467b8d86a52727b5558514dcf5746ce6b699d6cea1e2def0908d2149e7d1d78e39849b8128171d732ee01e030ea6bcc31d61ba527adaceca28c5c39ea71bd214a42ae5cae128a2771a19fe87021e2116340e0466d62f8c2f12ec8f7a84de574f06ecf0c678e2435b97613aeb6851465a8afd697e3c679399df8fe97009afc3b7e249410657ca6c7b377457a2b9d698fa82ce4e0b26098184ff2e6601bde6a3c9b6ae5afcf647aa606ab1e94f6f14a590cbef26801b8bb29ae23699c21a49640f04aaa33cdce079a5b1a844341091d897c6ee978f9574c3263936d913a71ea0e25cbcbe28943b56b5acd60d0316e4be89f43af58c2c4b1fc154adb898ccfcd70e1f53005284aece0aacb9b83f0a73d3e1e452d508387544f6d519cca4245a72cccd1c2e3d56c14c2f41c1ba4a63c5a53a07c4ba864299bf313af969c825ce10b8f6667c6b63095d9dfc9ca7b7ab509eecef1f2a78e31f0afae6cb349749ae1d5d2bd08f4f31ed8ed14d98f50959bb4d950ab08962927ba4ce691da18428a10523cdc8eb6b5be43c63a54516a1f76c2dacdb276bd5c9460936524f35011b1d64976cddf5424993f2bfa43fa123fcc9bbaee0f256450ff4c49d030e53a0c999c842898e516673635e6fcad71901d27a7405ac9fcd32df0e539d2ba9a1e58c9c8c9f9438644a71d8bbde79a9e2ce20e4d36b9e8e2511aef932a11ccf94420c9c4e191d8ac250bd7ab796412692eb60af862b575c1283f85bee3356deaf38a22f694995e3e02bcebfbe21a1ebaddc0a20d8ef476809ec539ce2de7a65574be5bc8a9b9de2423e1e1e5bfb2c57982295ef5801ef607fcd4942bd0cf7e2210e5fca1ea985f46d0a342cfdad3108e6518c61801dcfa3e8a931d3e9494fd3a0c278de81ddfe98c512a9523f92605e1ceb663ded8d68c0d8f2b5c6d41de2b83b3ab97070b3584deed9d6248e552af5b052bbcb0cfb3b35c55c4d9219e5711e64c9aa2657c433924ee2432a6660013e2519e59f4ac1b781322841dc374a5b64b1e1b346a38b10f469ae98ba543d83b5ffc37c31438b8e11a3f96afb98b70229b7257d77e06260f2c3a11f8ad46812ebb4c2081763b2ff959f420176dab615ebc90761209af4a40be15c7fe2635a4f4dc8a7e1b847d2bc5b8884bde459c1f7198c09f6d73fcc6aae575312778d9e896acfd7c1aa4c5524f20453e8bab255363164afa7124b2425587a077fa0bfaf61b12ef3f0540dc4c9e777122a60610a53d1d75b0a5859c654a8ddfc2ff4860758bf5a6f264bf8bc2baa7551eb7be23bc06978be992fc81d890e07a3abf95d20eee3f6bbbc089985cac96395b473b2741c66bd2ccbef228432f66b906c15b19694dd786c29f06cbc17b2e6400dde4e3db85819382b3d05a4c3009e44f8d03fd2dafa53f308c9eee9a2f552036022321334cc11532f9fcdf9e9ab0423cacf346031d91de2d0cb9c78ed1f5b3253d5fa7f12213a20516e07fdf75431cf6a595bc929e83aae0a9bf204667f566f416013ebc105f802394e202b8c9a9baa4005027833a63ec72ea18bf69fc3d81cc156fae3c1d8df8b3fb6c2fd09fcc646f468b4e7df919ed0b572c6ca095b54cd4c312bf1a518552ded1e5cfd0fe93627ffeb0fa29e48df2d17963f1933c450f35a75239feb42fd6cba0b5aa5fefe6fbfbb026f32e02a846efd72615e9f8d511164a98e38f4f73cca3ef43882679ad790be55501365c50308bfadb9f4bd24d9ba0324a8676293a7b8d47f931cca4d022d923a5ece6f86ef7ce68ec5860d095f5fae9d2ea5b4a6a2cb22f3e6cfa78383f8af57e7be8e0ebe4dfab MD = 73e3a0b552605e08c1ca390e9b8d498fa2679a4f2f29bd80ca7e40a86e20a5ed4a9b8707db0aeb79e251c8c0f4259ecd25dbb9c82de838ae953e712d36991546 Len = 35872 Msg = d5233637f4320cf1579673430ac26259595f2e48d742aba0a59c9440f0712d6fbc4c2628e030c3b452d13a7fa5045d24d07578ca31987db3d2e25e12ea38bb1da7a8bd642a574261d4ba3a50c009504190f1ce6b6d8abac3498845cd67b567b21e9fc394da8dd01e63b83a5f62b886d8213df6d392ffacf793f8111a70d07856a999ff5ff6bcb6138933045393f9461209bfb8aba8e1997837988aa00c713830d1fe3a6e88cb3d6acd935ed55bb4d716d2e1de9bb817ca6dbdd278084380ed691d363c6897a2aa48b741118dc3d1820d030a2e4ac88987ffae0da2f91de5e02816a9cdf62c2948d7d0a3e522d2398f1f25a17261e31f185690b0d11ca388599642bfb5c04e485e3f9f22a13d91d24673bf1070870ec1c499ee25cd19dc529fdb2be1bb6d05e733a8ad270f850685ee3259bef1655357d4f14dd35e97d129fc1e5975a9a559ee10398018f5a33b3bd1837c13bca3b9c9908537224c3e88f7b68753e5451253453d1aa25e1c3e38da358fae779be848ff407e337a5eb70ba21640a197585afad402749b624cff034b637e7a5254dc09e12c03ca435daa6213646ecbf5a9255784a76ff18b4c8da677a377650cb02803589c3d82e512be9333e83c5965021c703b73322e40e69229453da2f90d77743f4ad753e6c8429ca8e9ead0d45129e64fe2afe6d9ebe0b3929c7828bdbe7167c3a1266e7b55b8eca81cb152c420e72cfc62a4b27bf3039aeb669d31398565aa9943d1b6cbf23b559cb686ebaf3a04967da197bf9bc017ef3c8af4e4f6cb1de5c91a20525d08927f8b9eb1c21f0748cbdc89d334c1bae4598bf0c56a7bf95fbf590c5a6bb90086137dbc7a019bef7b7421019f3a76493181e28058eb5075f4e05303c9286840dfb97bf828cdac5a643852f042f940d5c80f4822f48efea9a4f1bee6b3b2f13265188b3a0551d8b0ccc079400598aac66faac6bee37b0cfb369aa39d6130dc3ddfd9b86a57b2aa597bb49dd830403984effa623c6bdb02d57482090f1bcbb2c817a30770671ba7bd39bbc7a00b18777710a82684d5d6699e2452f82629abf93dd31f82347db25944ce7dfe80dd49eb07995c1a7e6993c8be0fb179c9d2f73c03dcf5309fe19f475701a34a60f0fa1d9d54bd45136e3ba79dfd4892e05fd80082facc1997da0bf95c9bd5b3288a54969f0774af292ef58ea3b6bf4d541875cf22f44c4605b11ef8bd65ba42c0f47fdd777b2960a9efea063801bdb20b45f7304b941ebed2afffcbe024fbfe1076a27a8b7883617cfa4196c4a7eac8ee2e85ac65a0ea89e419d7fa2fa33ff00157e5f645c62ab9889723c7af71ef97e51b48cad8e157b0253acd0e10a92f1e79e171d80c2cc770b70db82061247427d95367120c1f0e3a7c590a8eedfd7392615a6ea84773028ff0a62729428b2081b01f0b0c6a22b72fd0bdb5022d68b254a20b04ef6063821c1aa8996abb6d9cac54c75c4158b1f9980baff7f238b2946a223c5933bec4f0221f5c356c32918fb0ab9381383f967c7c1477f8e776a3c3decb3598ffc95ef3a6e60a24b610c0a2969fcaa3798897e9e3d35ddf694f02e4b8843de7d8e9f934b257fa8dd0bec27d6517b6e98d997de8d530a9d5fe2b99a2fe349d6e48865c5a4d5a739943a25fc725fa9d7cfbdc0f205b13a20130722ea2bac59e57d608500e80d7bf7096265f29de32c8834bb7173a7c64918c868c8a8ff31e86c70bd79df852b6243951b1894a99a67f2706945bdd410bbe9d88e1750fb2279de86d5b0bbfcbdfeb1dfdaaa6d35e3e0a90b3daa5b2b0f0715dbfd9b7cafec82de286fd610cf33b5b43217b7e6b33e2b0e5daf1bb61d4fcf2f3b2dd176adfe97cddde236986d3b0bed3458bd9bb227aba4f03416591b2158888ea535e945d72d300fb37e9d672275af7f1427f6a32ee70f5b7326dea54247d44eda554f2814b7a73679faaa3d88979d5ae0838216b261a007d2c9a16c112174e4539c12c525db95faac574960ebc61950345cb88d60b0097de97b3ba01c59fcf79796dead88ed8ec4a0f0f571baa5a60796101467a836ae361db81811d275cee12cc20d31cc71e41d1e7428d0739ae5e97c4a20460779f0b8e60cc101c1f98d49799a18f25f1d587c7b4d6e0db53a3b6e5d776698ed0e838ed8e5b12069499a8904ab9c7fcf243e5b2dd94fa9edf8391eb00441e0e748d9207cef82de370a99386463023a7b4b0841ccc418058c5941632a8d6cae84dd64063866909bc9a0ebd00f5ce4a301d668b8ce8a81d11ed1f6e4138f21622420a6b8920774f98fa104d86bf5ae59e17ac238b999077d23f6bc0a01661aac63a733a0202eaa78078f96ca00c9e9bfa89c974a047c036a2a3c235d8acea2ddb1f57d655968ab87bfc0f41d74460154b5a06a5535a01038a016af5706157486ad8ff660a421f2b916e9cf5b2cf69fa9974abdf2c3a1b869141ac27f09c6fa27a4db313aa7070a7cab6e6afba1581f3edbe0049b450d666bf4bd0f3e0c7f9e41366bb05bc8746d52fbc3698757f6fa84e204c0c7202fa4b1c071e82c949beb53d0b5e63c8ef695dc769d3d86d73fdc0c482d94feeb94edfb15ddefc338a86be0124e555560fa1e69ba307962a5af1e457cced3bb1de9bc785365789a4f218a666999805ef51b618b15318fa329d14bb10e6d1f842d7a9aea078d24fa6e93e167552bf981a1c6f9d13624f2d0fa22eeef6b9cdad290e403a0b0d9779c0d7beb63537a23960d9951ac9b6f45749d30724112b2882efe92813cddbee2d7b24612dae31890e48eef03ad9394f9f669766066a252ca01bd228e2eecc1f935d38ef24e826bb3f5ac448a24dd1a72ef055153b08901f2f35300a4f77c771d5f07b3042ec0081f51ec365fd2c68462c6f77da6cf4524a56c66b94016fb32e18bc56ec30c1a523581d530ff17fe572c069647e413455f53e55eb8fa1de7a9c87482fea956fffe98fdedd0d264d3074126884c961d27f680f6a17c2d6cd0303471c6ff31afff41ac3e9c728469e31944bf33f8275d5baeaf08d59f7494236ad83c07fcf67786e001bc77b28f67bd0199393fd732446edc4094718f4a248fbe161bdc54623e254e1c0ff5fd5e0eaf54d11ce2662172c003f831fbd8288e43ae60999ab1ff6458e06d919ddf6acf68876ee2f2218f68fdaa1869eae69a320db05a4df98248aaa03b78f9e5c5502a471dd513b595d68786532394a54719c03c6865a14f41b84189d3c0a1544b888fe98ca637c34f815ed883cc5ae17621b95e4b152c226cd8f9843dc7106fce8e90be5844c7919b3a6f92b05524f6003c7df1bcdb57098025131dde0ecf9eeadcbd3415533ba7154c3a136d607b7951d49e85424aaa7b18272eb5490a57781ced75f928340c8a5a413ef92f70c6d207848b978fc5aeed9149bce8e34c1071d15b4b6c2579d2a1b6b3fea25b08af967dc6d586d9eedcd788274e374146b322a480ae0b7196f683d71ee9ad849a9e4d41160cf1d528accf692a431ee78c97f103083e65b11e10b727dc908940990b4cddec8266e605974bc0dd4c0e5a703763895c5cf9487189a2159783b3f3a68f4bc0d4e634a0f834c30baab993fea429f083f78a34cc23f9db4cba23bc22258290864999098a830ddbb63d2c3e689ae83e9f5456b6a0b7c9c929cef11060989dd19ac52b4407387adc6cef046c0cc6ea94481d42ed6aaf720239409c4f239229757ac20d829b8b146b7c4ae2bb7faab997fa9ccf478e7dab0cf7a955c6df94ce02a2eac033dbfd630f70db479b25d8cdc0436d5c538094ad5fe183ee261902f3ffaf89d3d63cf1cf1ef71a938983b3af939ef99aafe5a71161834a95db547f23c2fd49c8e8332ae1306b8357153dddc78889ebdaab22077fb859781d55166be5f318851ff862eb21ea3a9012bca8b9be25809ecce3ca4840cad096c531d35ba3168dc6397520c5198300eb56ee58d9fbe10f9cc1d842ebed2f95112dd01fb0f393d9a7b5fd014b20b14adf9428c2a0f941a36059f720650d4cf391d7ee502e4ff1688405de88dfefeb74e73b0a7ab13eddd88405cef73609a9887323bb190620c5c705b9b83c15cfa81bbcebf1e58d54fc1b7255de1be17adbd04fb1e4deeb0e77818732187f6f586dabbb078d9797a452e8a5ba932309c94a478202ea164f818d04831f5de75f02a2a15c2e1c1562d548ccb8b48c80f18d7b7ab497395395f28ceca3d216e86766ed992ab05bc37140643405c438da3b2ff5d641df612b70f9ed9653ead2170afdb4ffa13e9b36357e2bbb277a167369393fd6d44befe24300258e0dc9fdd7dc2f8f415a4978f231f705de8836a400ee21b018c67d343c9e9ddb504c0018cf3d84d31aa041636bf94398fac29a6ff74c820d08a2e3ec7ee63b6579992da151b18636c83db6e927fddc4bac4115e8cb06d29d22e400674dbc615a667f933603dabc10e66d2a88aaa239947f9e29acf0af8be6f42463330d739820a359e1355a1b8f0801c90ca058a8d419c134460b0ca91670f8ce7cee52be486ebcc2982dc8e6876296dbedfed65444323dae1ba173762ad1ad6ccde7a20f0a8b1f54189dd4ee3dd702004ec29846f2743165eafec9a9017f8e69c6bd7fc8571c4768e2e402750acbfff09fba12f3776638e6647173b462e1184007ee407ca688d17ba7bed62d76c7dd076133daec4b7ed0b9f8b8062aa78ce7aa01d898be81572a26a78cc46a2a4115cf23de5483d724855b1820f57e47f958f2353aece0700dcdd482cc61dd6dce56b26808146ca30dc344535ad611dcbcf8a32253b194db23492fc9fc12d9e9d60c5bae4f9f09577117003aa40ca7de2e534749d18b4e5b2e0872ed9a6c0206dea315571358ec3d24fd092ebb1d82b4e3d5592c22de7f5884a8585e35e1c84d7eb789f301d687fc6fe1d9b00e9d4509741b5339c62faa6bdd853a9c4d089f360cb6242289ac6efdd861fc5efcf061343581b0034a0341fd8f4bb4384e3519592f3b7e36192ef3b9e4f9eb9c24ab59ddce950a091cddf89610583fb2c81bb91f4c93f2de4ef2c8c91c1621e81442a15ea5e1dbcbbd3410be0737478c2910e0f0eb6c2c5b897c50a3f45329d32a4aea4f31e48fcbb98a2cedea5566351fa933969230756e57402dc2f41d8dedf5287728191990798064cf9e305f163dea692358c76d786746c2a2be91f1a888f35fda61b1fda865a0486b575fa0c21737c522bff19fafd6c69871ef645c1434b375a694a30d1200a79972a1eec714417641d444b723864d5525fdedd1d95b91a3fe4e2942c477eaf4fc87f6543e675d34639a7f7eb5963b80ffb92260d5d8f0436e53a847b0548516d61ddd268345cae0aef7e8bea24a11c87a3635a7fe3701102a3989f85d025f8bbaa6beec123a0b09987ee90d962c709a49f7900daed024a8c67256fb373bdad21ea5240b77aeae1d949218d1fdb7c874d36fba08644edb6bc78087b6bb4b977876bb951b303e14ab37d3f0a2457699f6ab111c3ebb0da5d7b206a4b165dc15fd573c9a71b842ef20f6a6f8f509e3658e458e5f071f87148afa573681d347c6cf34ba9cc58c678e1d659daa50b778abba1739caf80e6597e41504a59e60293a6c93b8348d3916820ee92a8d3bdac0dce8a4a618880403b071a6918a6db8ead15408a7ca1f3aca6b6415d00a2ce03689b87255a04d9cfbeec203804d863a273c23e82be611fe1d9abb6020a99a645432a814bafaaf35b8b343d043776e5048db4ac69710fc1f6a90834c8f040ad3a45815e05890236ac49e75817d908cb7da2f37388bc3440b4c0d4a5f9d71f4ca917aa089b10950b89a10e59b711167cd55a887927c85704e3c317f0dbe9bfe95b61ad65556bead8bb3bb0272d072960d45f7aa88ebd00754b5dd9fdb74ea7ee19ca905f7ac38a060bbed5acc1e4c8df4256d1e704c2b8fbb33423b4d42e5fc1a9fa5ddd543ffbfe3ed385cfbad07c61e6ea961dd2ff05fee5f0fcfd7cb070ccd39a1cc62908c7271f21c97862f2cc4e89c1d034419d72e6a73a6dc0f5fc61756152d304424575e87551a88fff73400ef383871397c4841bc2ba7de5883bba2619c98c7ee71f8eab070a2bfdda7a6009ecd9c3a21c9bc505fe1734547d950446c5a84e1c60be99d79ef559a83b30b5a83c6b8dc91a4bbc0c22f99af51c31c53d2b9622c6f4491ed402b93a7969bdc651aae0ec70d7fbf199f80ab8b0ac388872143c0e64ece8a609fbffd658ae481b6d00e0e97f9cd4ed1246ef956e77d1d24f47411dde90c5b8e0516f362e50f93d6504158bdeb1fe37e1d5533915c3252d3b8e4f541c2805dcc0cbb061e198f9b39f7f24 MD = f054933142774856dac63b63f175544298a3d36874bc37650a2682201f8336b621cbf9d95c87a9838181c1b5c015dd0c08723beb82830326382b5db51ea9283c Len = 36664 Msg = a2871817b7ec41d5116195f97ecf6e4c35dfde5f0d5e8a17ede6bc6984bbb3633af33e6c66da89ccc194366f1b04afe54cedbbae6e5750b54935a91a0f4497344a361cd7121036d283d1f9bc6e54e0f14f7765d77f7dcf66abb14ce7854c3ffbb999dbe02357f1f03f5f066ae187a97526c50462aa98b032fba3ce584e9b53c07164a30f0177622ddd878601da64b17bb91fbfd8566f9a21215356f5d2f97a8959df9bed143830914591a107c3b4a10af0cdbec0eacb363c06090d477a2e5c605952ec01c562032460c57e06033f202bb3162aa2d0742c8a900d1ad5ac01a24c5904bdd37abc85ef146a468502cdd7e5ea442b066f322313a8a6a627d13cf456413e37ec9c0f5cf94aca200d28266e407d9de8752fcdc4e0371ed9c652a5f984f94882d39423304aeb2b3525dd118c44546a8a77780cb6f823bbda3995055ae06a6ac510c9c0aaebddd6ad558958d9fa57f23892b2b8a16456c6d2080423bf727aec292ca2ae71e30a13af2594c1ff696f7f1b5045992f2ab686e8bc06c9ce411215d5ae89b42e3a582a631e6615a39982575b389a7706542d4545dc02bd32551b2ef11ee59c89f9b162f2c7671b709379c31fd2171acee9a24910f062c891b67b7fa7051d2c2927fc0484a8009d0b5e3d0b8fa7254a30f2fcdc72818db2946d1c501dea9b2db7cc2158404a97611f02b577d43e2dced37625449316eb43e280e4e97b55c666daf107a64f3496315288c84f161f956f617d04c99a37e44324fabd91eace06a13b9c9836d9ee63d34cf760da7cd3c6f57f1081b5b06ce07901e08e9292dec3a482d8bb4f0501680fb65764612fe12928d735844efc3e47ae223c3f329a0c653856aa583bfbf40baf38b1bb2c57d125cf11f6f5dea73481aa2e15b7ba2ae154255f1c5840e44fb679790c4f831a2c21b4d55bbcabd8d7f635ce74e0726ce4f9334635a1a7e89bd037227007aea379879dc96bc2feb8ad0f17aa60a1a1869dba2ab3fd1cb82e5fc1afdae5cbf41840be53982eed1e6f40321769e1e290a09400d14d7db1badf23f0aa4a74839fa20a2e9ee8ac26552418c8ffb3ff8b88e35234f1bdbc49f72270c7ef1a2417f5685d3f4562ee56e9ffbb3a9532c385cf765ebc52aac2cab520ccad48f1fe703f93c45912adfb632329b3eea28b34b6ad824002bcbd981e3d00c20a7b770874c44ac4e4cb71db374bca884eed695b076c2f816cf79e452bd7ebd74751554c0cceb6e748395897b8a909c0c140723e6053a4a864caf4d1dbca0995ca9233d221a3feb4ed240836d0840fe5ae614ee7aaa90a3d51ff684514608183fc06b8a0998c4cb33c5429c06626047e7f19a65ecbb788c89b5ca1a8c0df7c2945748dc05ed1c56d9b90643e61d50f149b3022a9adc547d2a9aa4802c69021100ea65a3a56ba936973a161b7abda582e6a6e69d2361a6fe2e5b0045c0ebb99bfbd62c6146b8fde2f2d50c7332b7d0854549b24e150002781b6387ebd80a80bbebc7179588497cd482f633ebac905470fc17efadce2bd973684085d2d049ea096719b1c0e881b893be3a270556dbc3ce519e094cdd49ae889b8ea4ab482e780ce46a7573c61633a90b0d7020bffe81060c48999bb0edf4202b8a3ed5be2c9d2eea15fd1ecf6b706d0fdc89fe567d2ea082a41b2af77d4cc2aedfeed290c8dbf7fec8933252f5f1882343eede98dc2f364b4d087b0f9c1af88bfc2f327e87a6e088eee24f0f4a2962ebc0194215aff53fcc8fdbfc67bed12a597b6a65b5fda0711ef564d542dcaa95dfdd93d95b4d33158d09103f9e6a11e07dba4afcf57f3b42277895559c21d78955f8e904c8584b5013255fa522025fb38f552b58bb90f9bc48e4ee6079be42c614ae7344eb35b097e580e4dd812c1d0c04b8861956e74e47e9c6ea567a166ec4626aed2a327a05257a887a394a4bdc52547105bf75d6ab8d909b23c80baede1ce5ba91154ca9bbb158c87a58cbf6004f14fb14ab96d3b3f5c3ddf535acfbf328051a19a678394693f6bd5fbca49f3b2abcd32d6e1882da08fa1c091fec92508e4705d14e739d2875dac3a4c562cbefadc285ca879958a04fa9b1c9f738e678b8321a728d9d69e3bf7b97e40364e09020bc8f768887b98922694ba24c108cde2e4ca457e474140ad96f9698074991cf2c015cbbe1724a0739af563c9f11d9f3690d500bd38620007c1d4c2b418f33ef384779f502d77e9cede24df360ab724ae0da8a08db521256e01b253842846b92ddd563cc9d25cbdcc7b8bf61214bda573e5aded98c566f90cddfbe296ae79d3c7561a6bcf0ebb6295f890700618176aac9f4aaf837019c209dd173895b174d5e9742bf20aea7c2150dd9d14b91cadbb82c4e9adf9be22c98d896f1d273a1f07bdc1f199246d884225b319abd42b67e01ddbf1b0a0b86956bf6a6959f45062b068c4d52ac2a0c50d3d006cfdfe4a2d20a46cca802065d7b1c7076eb3a5fb251915053d6b8f891ccac04ffdd2e083e7c54000dbe522ce5221cee8e7f4e243508bea0d9226303275c0d62536f221dd7d15181e8ea74ef9c3effc963ae45231cb4c0f633d2150a3b938a50c7e256a61d759554e4a8d4bf013647898d14b9ecc7ea4ad8fa42595e3ce7a588b3d326315ddd81e187860c2bb28c66b7612f16e1d51ddec1a31f9a7f99ece152bdce2b30378dc9c057ee85a60ec5dfcb9679e682a2d3ef38b4b672ff0107c0472c1fd03338eabf69cc5edbce9467354e8371937fdf80eeb6a5935d5cd0bcb4fea554bfaab088e5565b5378f5d1d4e9a8be92b819e9c96fb40c52c409a79051b1b00934175cfcde1e9b68d7cc55b37f72be79cef13ff1e4c93f614195f4170938c2b9f7f99cab0c1af31b92b28e776934f983428660bed06ee54b507224b54dcc53c355d1de07f1e408c81438ea953957f64bad59fa64d50d647d6b3ed7ffb214e9d1e830bfb811f2231ae6d0089162543b3f89dc4ba8452d53741c4c7c5ac88b0b422986a02ffeddf860850846f066d24edb429df2edb35728cbce3b905ae3972eb084543dc41affff5569525436c92a97ab720f7ea9a2136ae10b8c9274a5d1ca99a319d738f8e08e562e3e8ed90bf5bc3c92b15d6093da70605ea0113c81c36559e0480ae31b284bef2e3d755ba1ac02eb1f240da70b24ffa622269b1709d4959dd68f5756e42fae7cf3cf96432cb6224391c80de16a7b6f3f10708ea8909dc1c1f0302b09067f3cac19756003ffbc90e2752ddca4445625a7842e6a45d8778062b7db247dd48f6ce8f9cf7122bd27b52443b608642b4dd95c07a0bc83240a47fcb7f0a239e0e8b5b03f2e3833c77025a588010fa581baf0e9158803f515ce8efc5b1142a1ae03ad9e3422239bb13e68c2bc8f60fcea25e2bb2844cef0202ccbee2bad7459be78cb0f833bd1ef0cdad5284bc18abeb737456eda577c28d5ad954ea435b5d674a08490a6ebb1922cee1132d0380b7f8b379f608630a9f398d961aa5f3a958c732370ae19a24119a3d0936ec46361c3d8df372cc680c6d4fc38c76db73c82003c79f5c446001f0a143ae258a2d40c002276c3401598516172341d1536ac09b6330caa8fc68599d7d085747cf5fa88d8fa96ba36fe17d81d9d63f94d6819ab32f964054d259340076b38c048285766a2b3c7927dda6fd96dd040e252c605d4fae2087ca8bdc9a01d66dd6c46d46b03e20081d2815500c3d6ad334ee1dae115629f72970f2989488e35dbbef564b60f3b434df0edd88b35eca6e3b557113beb2e842aeb0ce36297de7acc5ed063c8d7030e84742fef6f9e143fbabc4ef396d4a332a9cf1e65d62c828817c2745c0409ddc4ede2a4041e6ae1ea30aa260c5260652d77d9a03b64551ef056703da7f8062ff8b2b2f6a1182aea38de2578c62efce8c70d815ede8dd01835f0eea8f2255a7e2cab6b94610d6c719e2ba4b3bb6d28a2b1e36c96c9c2fbe2eb8f9452a51c754ce3108319ae4e9e2cac91be63569d62275081e1e487a45713638b17a74b3df5109e8a8fd2f35c3e8fc6b8c904124037eb357187c48292603e406bdf335f1a486db181e87cdac6dbff8ef95b1298f62872c32ac4b3652da5a804ba51635b21fdc8ee9f3363bf0ee51067ebeb1b351fa232ac263f3d89c6a60522ef24d3b9f56396982ae7143aa4e846d4090f8a812d43bf32ec4dcf6b0ddfba1d82bff11605387b30cd7a2ab829642775c92eecf7cf6b8d09f586f5a353b15b771d8937d9c1eacb5aef7303c1fcd726afb4dfbf2356a80093da512cbd48c95da20817348fbbd92b7919583be2afbfc8f444788d7e5387de62f352e1035d963530daf063a273a1f00dc3903f94a28c72e600afb47356695af9e902cf2ff29676a61e9b41ac59c3ddab86b18b5285dbd8f761ebe0accfeb2abb13c7239db85896644b8e5b280ecd38b4db42ab96ca2c5f9af0937e85407bb2391c36aad70f4b191dda301c8fd31c85cc29ba1cebdfdc7b63355d0a9728a985f65ad7b15677ec73155327025e773069540a9e5bcc378ac0c2989f014d08e31a756800c3b672bb38fd3ed9b91e4bb747eee645e4b271a5a44b92efef3161b6e438cc687e519045df3805de8d39c10fa5ff556744291ebbaa50dcb640cec39377a2e0653dc2410ada48409c0b5b97a807f7c07906ba8f4b4794ae88927f8f1749665c9d8e832588cec06798cfde001ee27acfe188c153c31069b0ed50ee54a0ddd58967ed0e8e2e0112e36b274bbae2c9fadc3766e80cb179626c3b088594dea9830f5ad5ef0b8935c25c79ce2f288232fa6de10d98faa506f1392825cfc01f30e146ecd58f2e28b1513b4b00f2d97b91fbfd85095ede0c2d98b00b353786e11892d8a46879566b284208658c213e4d7b622379d694075571eb697ab35729c2a4fa2d080b3824eeef172c4fbc54c76663df4865e1e3172f585bbded3ca959427a99cc9e4a461a229a334f600de81564cfc604afd7c67de8655c25d91d9865df1df43fbd821d9684ae38ca5d1d65a8a733b8b0de14b8bc1f1d7f59d4e2cf0ff6e39bef0c5f492aa39f9a258d5747e1cc142a056725344241e537a257389798388ff363014e3356fde2d9f97748296132058c5ae185c3b0ef510797d66b9c9f02678d2412bb76ac021c6abea16c6497877c7229c3b2d17875e581b2e9184894e30edbbad7437d8a4ea0eedda230a4052add5e1a8438f8197417187bf5bb161a58da618fc552d2823214b8eee031422a9accb275a984a214786a4e6b82b0af8fe27eb12b4385f0145aec6b5af1fac98865bf11f3ba2269e9e153960a26b55f760e504d15f84970c1379c78ba3dd9c4af0a28eeed2caeba1a4d6781c04825b05d4af387c84a19bf1946a963854a6abdfef69ebbfa77660d162b2a94366d8e4cb616dd13cacf73357d06a7ae34ae3a0008b9851b8430f4ed7df8f13fc50d5b8f10f0715385eee29e6d05fbdb50bfa4454cd1806012dfe7d5a2457ff704be19e1ee6664d9922ee44479b33a5d521555f84bccf52c3edaab50337f0b5c7de645ffaef70c086805f4b2239cc7b6b145ab93760a67f260c7abe7a22447d2892c6c32e310eb82801a9071eb31486a16a731916c285d45111d85f66ed399fbbee6f9262b4297ba62c3440e410f1109dad0748c8e955986d842b626f9eb962aa7ac7943d81a752298a68bd1c584d5f87647d0ff6ddfc14a1eeda8d3e3fab101abe3791689f7285d9a1ae486d940fbc88183f3448a7649016d64fa97bd7f6ef354325508b16705cddfc6ca77fcb1f6fc850b47f654e7353f3c4f17dce6f84482390fa9a4def8b1f5e200ba3fb0565c06e9444baf6da13a7614028d3dd0e3c620c2d1f375631a9158397f404894ac8f7a26c57aba2542bd288d35c7153bc068717a3faef4fe4b48775e88e92d0a3335b8e61551c12c3a31d8f04f520d681cafd6c79f58ae01193bd5b9b401579178b3557faa7d3ee2f63d09f5c5ba80e66700d343777cfb0bf2eff5e3874542bafb9cd28c0b398dda15233df62f7d1a572e1ff9766e78768f66d95a64891188f72a56b273ae235871f5a8e789e2f6340ae031bbc8daf7aafbe38c65a53ff294d6837577cf09c7095b4622891986c258a20bfa9cc3436702e2077dca3df254f0c9958d8506a4a13af65534a53d917e028d2fef0eee3e4318d23121da8766d52740eee38cb3152e47c3c133ce6e8965cc5cca6394b23218473d0f1d2929f3ef92ecee2bd14cc1eaca5408b46714d53610714a0cc0a7b5533882dfd4288e3000de2e11db054c31432d179a3b01c91b4b796b4d5f15574e80475451cb7b3c81c5737508659b29f9e40a9f044c1113b23251bb42cf0519443c0e21d37773ad8f89cd62204ff57e6239cd5ac54c275d307753e1a8c102866cc2f76bf37cb469bfda7675f81eb6a230b0ffcb5bcfb73e1c86da6f0df9a026fec18da3202fbff98933f910fe46614dbbd61c61465b430eeced6fc MD = 221ca8cb81dae78612b8a7c2ced624bcf7dcba005250e194818805acbc64a41ffee4403672405ce5e7e81751736ef1e7addcfad82509ac4f0f5ec6100eea39f8 Len = 37456 Msg = 1f55a263d748b98577929cddaa865c072e37d444cd9739c28fe0f21d2e33a925ca7fa2e2dea54bd573da1581934c832a010880dd271bf6b050f79c4b171910a71fe9251605e27e8493f25cfc3724b46eb37c85af152268c1eac46955af35158e885ad4083546791941a418567c551759ac5b88c280f6b67cc50cfe42dccee1616c9957bf541a651ce4b6f1984c29d675546d341f4edd0969499a061a882e9ba8336f55434ba66915e3f191c98ee6164a14792ecd69208911df3527e59a9b6cec44a4769d0332ae8da81d9df12ad5025e524921d4b7075dfbeda409acfa5e7cb3090063d463065c0c9a02c018073ebf3c77a3b33d22d9aeafddb0557790bff288e94bc4f0526a9a182167a0470f697869ec508c0f91e0a3b61521b34c4405f6f04c4c40fabaa5903ba516e586299d536e18185552eb626597ffbfca35fe7ab2759acc80f9820067fc8ed538db3d2478d462c2b60e1aa81bda01514339a6644b9e3c932cf592c347e3456d4150344410233418564c05faee0885a1c560240cecf39869ebf6d236577930a6a7ecf44643e1f5e0de14949f06a8f275f9b360babbfd171665052aa0c045b84712b7667238980ce3f56cafe18a42b096873942b6e04321614329824ba9d0451a2cba720f18cfe3e9445e3e06a35f27cc16fbb347844e1f132d6bc27d3ba040e59afc01670a0fe1ba73f129577886bfde4eff99b6cfa477f4cad1d27f9e3f0f710785f9c037df6e1d292d581c323fe096d94fde4ce8cf93ccc3669a99f9351c86195e4463c7c7f2db0e1bb49df812f2ba5cf3684ef857d963bf2f02127408ceeb788ec898e14fd5bccbc22321f3885d1382f1210726c2b3816736f33439428c6acd1d6fa6ad008088082b8ef24a288969f053efbe9b9a88ed638253456d6ac0c9c0141fd7546159076c5cde56267ade845121bcba7e66c0705a1b0c8e3b09d1d1f87ac271fefbc901a05ff996af07c52b4b616f44f8afc3d2f50a0457c9a6274a1e573fbdd254393d4c3cc9fa0c56a428861df0a431fcf8dbdb5625e83fc92afcd9b47e03f9f60f8417f935c966f0e441ab5c272250d5c952b4075588c6fb42afd298678b9b69b59ea9a0244de45bee3f6227fc067ec29d012a267e8086c2d72ab10be29cde339153ab3880ccaf2129e952855797e24cddaee3b98719a6a951361d15d77fedde0d6bc5ca308feec9fc09247e201ea5faef2287cb58984e35189bbebf2e7deef28fad9e5d1cdecadcd165801a3fe3ee553c25bf61d948a8f094213d10cfdc0af581e2dff92c016be10fc70c629c2ee6e42c7f3385f270d9612d8f4211a2e468714ad22fa6483ff8601df5735d1f47b42f28f78a3e8b570c104caf74c890df31ed5245376d58e19ae265b75b13b17582be96566c958c46678657477c3f7f138cf201039f55442f78ee4ed76d8d3802751adf648390dd85124ab820017e58c9a207bfd30e67f471bb0c401b50d29d34b7ca6ce9743a665c36e4d502ac8b04499ab4f47f2caa50ef8ac4a34daceac9547056a4adea981013fbdd18b525706adb9d8108cda22641f10e9fe0332bdea3a9c747ee778bb4c1f188bce800133571c7d3f7638618e3adbe6e245d9673b5127de523b411ff95623f0609acac1fe00354639d6d7235ea7e9fd3dc833d2c770016f2755d41ef43dc469c4dce81f07b07cc76fb8f58a2429adc654dbaf2ff2d54bd15c251d003c7154b730eb5472f0d6475339a2f0107f3ebbd4b016b7b93def6ba7694f786e228f799b2d7c9c6839f0498c301b7360a065789ae80fca19292cd553e72b92a356e6977822d72c69538ce7c4db88dbd5682c88ab550d72ca151c3d695e5fe86a3a1522c0b9a180e0ce0aa6bfa481b5e916f250689fb62e46a24bf84a2742f60d5ca9c0174a52367919f80abf238c7e364d55646510907919512aaa98ea7b28172f12e3ee6d7fb99cc7e38855c10fb1276bd429236002dfaca246a8b8006f0b1231cf02b88b6086c6484bb4160591eb5702ed332606a3be8b061e872a11a51b79055ca0f83ccb3a802baef27289a9892f931f06df6ce9b23efd10ca8196a3e5d60a3a434fea162144d26bd7fd95bd072bacd818c21b5b473307cbf740f7e1d693c0f66e022bb7e79eed20d909e25301c5a0a6fd708a6eea01b6be71dabdf57a4cb9ff85c17a4709f8cc6c8a39d7e1f5a82f0a096d429b17157a56dec171455d6b65d42f004e49f4ed009d400fef105f2da88fd11acc665af8d323a2978a57ec7a4512de31101724e61a21befea034bad09d96e90b9067222641b351cf91b393e3e829f7f68855366e99c84b8893e5753b8ebdc5a227041928567450cbffdf0052cf8810a2ef8a9600dfcf6a2022992ac8ec72db8108d38c7971e5443f5d30ae215bbbccd8ee0db0277cc5bf67e4c647f34744bf2abe3c08843494907c126ef9ea1d43610aec75315cf149afd2430369651fa1c501afc429f31ee0ba14b7c0601794ad91bb6347860bcda9bfc1d5c6eb78e628a19866024d208188459bc60b9d245258c35cfb0b2ade728463e905876ab93b37c971695d0ea70cc9b763c576fdbac6d36a721c269c2f805830aa6adb43a07f5d910f325acaf13143842f2eb91e2572bc1bad3f20568967a3aa786e2922b93318bcd449822e896f7430307a385b0ee6714b30dc8ee67698d535e5a7f7648de6e79163274985fa47ea502a307b40d182717ddf9cd8d871a48b677470dca5791b48b33e54378dae3af4487eca086c07d75b27fbc88489051b34b3a7713f521530ba96b848c2922fb9409d90df56493c658cde081818849b5d5fbee12195f6ecd7cbb0738d813ff9535dc422c8fb44c9bd950496e41b67befb6acdd3fa77006a60ea94f28ae9e385998a60872f4dfb4a3fe2302ab4f38eea75e474d274690b087ca5b8b7d963297eec74d7406ae4e9387d12f536133786a84d6b587f27d273618b6ba035e1837e2fdcabbce104568b1ef5a5a84b876dcb72e25dcd3c7d59d5e00ddacfff4bd15e22da7d65eba3f94d581a08ddcd79fce9c4e53a678ced55af1e8441ac6660c345f2768886b2a263cc9e8abb1a4e736b5e38c69fac03105c6b677f5eda1dd8efd219215b83f8881c753ca83ac250fc4f9528f6ebff115ed4a7756f70bd881c9d6ef17b44e20fdd99d3cd03168a478d001b2006adf54a4164cfa2c525eb3794728925e4f3157b1b5264ba1bccb6c49e237ca8665413106073608a20ecd79ee905cd30eed4b2ccb9dc94ae62cbfc4ab820264ca68cdd063486e6960343f74072ad878cf9783e67319f1ff46892bf3c639ca46737a6b78e2625ee50dcc9eeaed9f06494b54c1cfd3b203346adcf642c18ef8392aa40373abdc6c4451dcd124c7774d10272ced2d10ef68aff92d0af9c50af20597ed7d07e73e024dd66ec06abe3814930e27f049555988399c824e60f9332172615dc17dbe1187c941895304fa6cc59ba64eb06bc876cb99fbe5aabe8694ed4831fcb81d57db63813d367239a29ac7f097a816db91d19a99bd5d065d93b2bf4eaed3482edb27fd3a707c0552df4b825a8a3d0ae0d9ef5bff8af24a834917fd4d81e95afa717abfbf8263f497d8065ea1271675c3c85a78940cad5f79d04a110e5146d7c7425e10d71cf32750b653c38c153a3dcd85995720e8952b874fd36156c7f3a5de765a5849e63586c5a0ba19e5fdb14c433934626bc9b397f4ee3b57f08bf7ae8734f700de8730fa3ebfc4c872868488700bb3ff3c550d8b0ad70859a3445ad809a4bb6e5ea8ec69023af838fc59badb9b249f985c34aef00f2fc5d1369a250daeef300b91f072bd5a3adfd14a1d5b2c0bab8094940f9bac4c21f72672375f34bc3dde3f3e08c9dc8ee7fffc267b706209c9dc5baa8edda909d228c01fc010357cb54c732f97f9b0e668e31f561b0067dda63d5566587dcd8e6ddf0705e040f83680020d2a460b1fa9e610a4a3a41322cf692aea921683022218a563eb3df86432c58877f8bd0613218810f1d5bfb17b273b2c82f46ff52f0efb013c9a7f3f63b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f1edd0e6026572ca0d8274bdaa6870749b0a727aa8c5b7e9442100e0c9b0574559cb880054d9e235ebf168eda4ca09808214a6097fa6c34b02d95b28aeac52d38c1dd53c564530c82af2aa59fe5222df93d2c1f339d204208a5b2cedfefa3d0a09534cfc7f4e0b0b7b04ad750f9758fc30c33aca5fce06f43b24fa9363205233721a53e3484acd7a3cb5e6d160e01860f96484e169f12820a5c558cb53c54f0a26c19e6339d1f48ee074faf18ae2dda85e4544fae0f204404acaabf8494f9fd8c7e7611edc6a1cd416d03e57f606352ccfd3df594d3707ddaa9378accc25a129b60a60589879a2c4403635772ad0bb78de9ed89f1736cf4335ce435b54fe1f977198f0a3068722e9ed3574d1a1b8bd16fb14a52ec787a73b8cb9a0766c2f579c9b11b6a0af2919bf7e5c80e9e344c681b5c3e9aae6904c011003f4908a3fd593931316b3eac603bf93f9ce32780b64438f2b0a75fce71a4e503bc44c27b63626ea0b857f51f45d64aebbd14dd86322c6f7c87c3253029e7dcdafa3dbdd18e5c11069a7456d1a93392f111e9e7ce26ea6800ad342b1594519f8fe07f202de60fc96cbe0b8a4cf51b7a5782a96ee0fb44ca89094297081aaad62a55511417d3423fd90c63b8188f56a927f79e99451a033e1c8337928e23b929b143fac118bdbf1b556cc609bbe1acc969570e9184e9ef6bc30359433117473e2e91c34eb70c4c04e8c67aa5bf51e57f238c427d25d2cffa8571f2d3785e1cc0a827f4e47d28b2a29b02c8b3ac49c8755f7d8286b03c6c926bb54869eb60005528edd5aaf17ab89e7508f85b08301e53241216d4ae8f8fdc7bb8a32e1385bba5b5cbadc99b6828a07ec052c75d6eafc07b33458ea732fe7fbf604d4a7736145957a9c668035bc94fbf131e1c326b43656ac858dd218f82243f968de4a0d9d519166f66b0b2bc62543fe7a385108ea2eafcb997e8a60de2730243aa2414d8c48cfb05d6c92ff1bc5607262a287e4193f636ee4ad8bd14e813104ded335d99aa5b0d535eda02649ffe1db6fb2d04ece0312250b9d4ef0c5aad719e9e3903864e2e5541450bb47bd2f48b815ebd2af54f45c7c52c05c25d01e82e1c055d8c057aabd9b8d586cca01fdf596d9b0079c5a9d72d36ea92c070a56d4db169c88280f47da39e5470d23a4c688d64f91d78c4b5925d8c3ca471ab0ee3d94414a26c5e854abbdd0bf44eb12236314dc13cb05a3d1b5ead6a635c7703f3d7bc4c12d307f5bb275b4237c96c69f24c0f3c87a7f0071d3883bcf6093d4d4551035a403ee30c77f1024164cbd5e943e794af24e7ecdd3ef4f579860063b4804e008655355a922721b84fa1da5369d209c3653bf8b8852699eaeb3aca53004dd79b177940d44e72bd67b516804eb346ba84a5f560bac77e2f4c583bee73f953f3bc57d3e8b90901cff6bced442e8d4802bfb679a95c6deebf0209b0f42d673baa4b8c8cb4718b7b5e4da94bae5cc080ea5ce1f05a053d1d4ff446c265e811ac0430ffcb2d649c897354c75a473e149579446e82fc1c01b4ea0a5799c70bc04f0a53f8b9d9fa04d315f35d42963d5030b85da556160b7f5a952c835ca5003cccc39dbe7e429c8a004c12b22b24c23ef8ad90cd95303980b85a421334842e4dca38f49b41f0b0f8b820990f3c7733a49662c63066d30ecb7640344f48eefdbbf16f42d52a6aa014a59a70bc9d19f94bb1dfe514f285f22a3b4fea7fc16ad54dea726db56338d2a76dc17f0177927dfbf22ad6c261d14d63af904cebc6811ecc5d495e8311e2b078b89eaf26f268267b004d8282da3c873f7b0a43db80b94001f1fafe875ff0a0512f37e67235255b958550d09c8550088647c6b596169da3b14f8f340973eb0cf879960d2e6950860f2639a7578b943900baca8c65b1b2b0a71f0fe750755b5b363fc30da3b5720eb28d12f1fc149080747d20ae907982cdaa088301a58ec6f5d329c4cc1642125b4662e395d347cd46ac38d0055f95946381b2f26950e5b64297dea334d237b8d5934cb27b244dd2f46e92e077192e70dbf5c6640799a4b2aa4a07682c1ebdede460f4898b374e27f083335aee086b9f9bceece2c3c7f04395b34b199b41fc37f077026fad537155a4b3c445517275a80dd4cb728524f4ef6b9b53c06b841b21619e1d6dc9c2dee376c5edaa88a0731398ce0c1f35f6d54194cac764832f43309f9eed89c7cabe59d08355907ada8e69a38656eebb86bebe78084e0ecb8a9bee123f1bcd8fb4394019b3a5ff1168ee3098c252e9ff1cd5f07f1d90c52bdc4ce222484f4109c8761fb91e84003491baf3de4ba817ea00425e12d036918b6f7d94388330ec1e4d9e7e188c9b99cb9e1b37dde9ff8062792e9097eae87ad389578dbab667d6b48dd8e59ec592d4bfd73886fd63ff2d50d0c10f78344d89eb73025412aa9c07b4ce4dddb39010b9f6843a67a68351259d4e22621b730ec5bb75a571a6277688075924edbfb6bd4f59ed4863400f9d702f387a11ea72d2372cd6686de0f5 MD = 9ecb44114c5cec8af0b3a10498d7cc4e0e60fcc3b5bed7d5f7df23ca7269ea002235f97062a6ddf3d8a42e37e48122a8f869007da8855da0bc62468b53b8fddf Len = 38248 Msg = 5f07a4bf880f45f5e251d19d4652878a89a18edca467372c124083097a49e5a88e7b48d733375433e221ed9b4e32fde4470974cede828d37ca8a528f0a32628ccc02f21f8e8f12a6834f316338ade42d7759e3656ce2542c06864dd3a0499493e144a97fe04006b68c83a5dd4ceac3cde238e48895ae17728fdc7bbe84b6022694ea75df7371b8ccc76450f2d112222c504f7d1fa20f5b712d33e436fda234abae9c5e278d4bb14efa9b3a88114c89b28946b813db2caa91a73391245435b38cf8016d3f77f678a6eed06b8852c181c754c49d4a882e8b3ac7858971d296062f37c2a90f7999953a6baaecdbdd9891d37a7133adf13c87d453d1d403bceeb5fe36861b80da5c917439d1c467fafa423ec4f682245e7f25c714be7bc45d64495fbcf6c978e468f3bb1feefb16f00f1b70f7fb9298161eed7bd2f5859bfc2149bc90babde0dde54376e6a99acf09fea4d1de276cef62426759551efa6fe04c3d7c7b79ffa10efb0a0f56a9a7798bf065ca402317138a131cc764e0e32a520ead0745db95a1bfd0ceed37972dfebf0ce7c1e4969bead6b8932ec9e347b39a8f22c5b68a89ca388f1a78511a3145ed7bb11f9329015e8d5a54f74ad02ef200f6241e952be303c05e73186cdbbd365d644b4d15845056f920e888b04fa0cfcc6c397aac69a933a06563354f81d8b956f03eb1324e90b96033d64bc207a6324518eb41c1e9e54421ce7137c3b58bb6224711b5b230c9710bbaa6a64aa14703b423c1db9d569e1d89be2686901fdd1507904cc05cd1046542dee1030ec48c2a61b443b00856dda6205f088a7e66d6be4ef47839f9da497d4dc70ec9d8197b8f94f4fa28ca91a9c730d9a1ac54337e9a3e9a1c8a51f29ea1739cb5606e481f1b950a6dacaab10a68ff547952dc2dde8f21aac01a2cc20db9fd865e3098f87db4ab1f25a2715b0871d6f716e6dcfdfd863d4eec5152f19dad33ac92a120d19f43205ba874e739accafdea02ce1d4ae368dcac29978b2856655d37d81bcd7d8cb13ae58088d4f3fd5cbc56c57467bd991b44ecfe549e0f41cac34eb90666a14ce442e634480031030d5b63e53e82fe2689bd37f4f0544d65c2ad1abccab4e8e8c67f854d1b339ac7c62138ec9635b4929891b592d3758bcb3662c269cf7ff7673e3beb526834d6507058fe62e34987e632068d6066c970790f2b6f487d8e79d133bc3fcb99cc8ea7f146dccd8c8721293e66e8e60f17a579335049e23dab142e8f4caa4115c36ad23333fbb7fbb42763a4f7edad3729d1d38c1977be759c70873931543b44e111db1c6982a7979b449c4c02c53c47c59d8d01cd22648f2a36e319b364418eed2cc9962f9a26c8031edd1ece971ba5b4b1b179b6715df11d0e4b171c03db5bb162a588cc6bbbf6b35d2d02a58cd3bbbdb446de1a8d30053d9fc61bb2589213f35c76d9891cee8974aa95e0cdccebf0aa4f5517429d653152925c0dbf8ced1e7cc14473aed647e90ead1ca08f7eebab4229e50c76ca85df238e15d589c675e4143a183d83c04f7f490dca2a33ca5b564cebfea5fe3c1776793cfa5b592fb0ce826ff91f4f038db1ed72a76601d9c458913ca8ca211aa35e1c44128876ef28429007ef015cc689e8c186bc3c41d3ae19d9c5ec63288cb1fed44d66422a2d65a904ab02cbf032cc8d8eee10953ae09f01eb2dd1585bbccac069fffc72bb11ed6ca7023b65546fdd061c55ab5735262178911d609102cf750ba204de0172c44af141b5a1b8d0a444bd3361966c7ad0bbe6913da0f665f03b48480114d5976e04a29a6b3caaabf98a189bbad8ba5104f6b3b4349970cc45a3dd23a1a4d87236a1e679cd15242f9736811b09792b02ea5847c2ab53e57ef63533fb8998f04a45ab24a882330fa2a6d05f7df682a6d4ac6b0a8349d73fc42c79b29864f70769c3aac6ed339f514d4de11a8728fa12116fb765bfb72c64e60ff8c2c2d8ca0415d7243311885fd478b5f01a0248e959ff5ec3be3d9c5a3e2cc639cc408d18cf97a9a3d3dc287d7e6b0685c6b5fd5862e69e177ec6a16ab3dd7ac436db2de9503762ae0e15bc00396d6728886af04d15105a3b0e226e63ad4352226a5b5d466f3c2ace4c86ebf1ecc70062c7e7c9d35ac4b8b8d419aa4d13a477dace88c73514f02889f5f55e577fc2fabaecf52fef1949e0143a72fd30cd491074cc2913c12799856a712bbd3ad9a47db95d5ccaab3ae8fbdaa7f71115c27a4679cb08e9ef908068f628f0afa3e4b5b0e583e4430ea5e9318f836e8b03dc7f417033ebefc937edfab7830bdc98873fbcc9c65542204394a9bd35a01603029f28e16b9bd05604276334e846ed24aa88c9ea8f766eeafa308ceb2755581c1c232354dde0329ee078caf5c0678a4c35d9fed244107073b30701a2c055f95613535c52f081beaab126578374375a1a117a83084febefc4575f31696867a2b9cd77f8620c481b81617a34656a7e069524b3811416cf94e3cc8144c88755fb4e33d7220d99fbf12bd6bc86230c0435c557cc207f038407dafcb5614785e5ab1c2dbb00daff63eab1fa347846c19090b3930c87cf7cd1efb1cd43b06fcbe05b2ba46aba51a748ac1ab32a2f55f0ecbf66bebddf8feb80f56e29725ac7bf0db2847e2d79faf772df6eebe5d6d803de69e6c1254f44b757c01bf78b87d8ca36592ea54c655e58a82cb689ae9357612f363c858c0078481ff9bf1fd65e285521f731ff0fa50433b43bf975cd8e5b72a7d06ff13c19b2069f4763889b0841c697359676bd6274ee5cb33f978af16b9e0ddc87ec7cc37b59a1530e1c22adab8660bb64f1a0c337f3693c90d72ce1104d2b058d6093265aa9ebc4c8c2b273ecfe4430a357fef1d4a8a280f51dfd88d1e7c7f08834ca69d75e4743996295858e950b3c5c922013d377d1247551430e36d4aa48805069b57ae07b788ae5110919b27c8896894e52bdc7bcd3195b479bc77c9cb37e9cb831cc974f0aa2316f2813bf61bc5924d0d619ff2c33e82351550d4864d98800fe0654ec8da2ea2ff70906238080ad4bedc66f89e9ecea91a9678f9ecc64a964855b9a45fbe768c7f0d57946a17a9be6ee4a48ccbba7278e96f7d5e79af9e6b09359270b638226e2a4b3f5908e552add1b8c2a306a0ca800612e688c974249cc712782a78b1a2c6659cc01690eb76318bcb1a01dbdc274d15333cff38be7d9a067ef337f3b58803d58472539e8494c8019e42ffb7e7293e7b22f92863e909e14bcd6c3fd3de42c4de94de968e5b2f0fb7a4b613273c30e2cc6493aac77e4a111ba06b988586538805306d65ecd9a5472260ebd2a655eec86d9aa4ecc008be97da7a79d875383aabce099738368ab82ce6656cb4c1bea35df317956509f2e7e42cce0f864f7e78cebd62f48407d8b81f5824b14fe5f10f11e17dfdb9f1d75694671da51860c39e5f47eefdefbd6e259d1c2141fa9f778292bd30464214107b173debd30555a20bebf2002bc1d395913496dda74b6acc9e5eead0f793ed58d5eaf5ab01d39a8451e34048f6b0f6f97b544cdc49c8b46ab2b4fed28a25e9fae79e42edba19abf500d3b71bf713840454aac28fb1e928dc80536da7968e9691309f9a36743e068e894bcb1ba58ff730bd768c7a6823249c57a8bbd275247f96316d6ff7c8c7369b5b99f0aa7a7ced2906660f2ee51d2414d9236de5de9e01747a9638a4103bc8a6186ccc5aee70c237dfe7cf1fb12dc3e06561f8541b31d8d67c8888edf30219591032b29f99f202f79a8a40bf44db70898cd2efafb3a64226a7e2d517e9b0b50ef37a580ad5774be2d6bc089018bcb67ac004c84b4061e9df9d03a1c44cde385232a2010f5986f98414fb8b34c528023eaf55f6d949db4c7bbc897375c4d0ffad5e48523f7e879845c5c74d1fa2d3e03f9b650fbc2898c68596d2ceaeca3f978ac6ebdffdbd2fa4b269bdc2b36a16dd0824b0877675210487ac7e17d1d5807c650cfafeccadb5ab54913d909263875522cba6e29aa7ea72ec7df9f3716f3a3ae6a0f4234ec8d028a6acc51b2f279be51a00d6958b497b8e3e7bc4c6200fc34f6a237601e686f589234cf2e6fc3ecb095854ce34dac25ad308366d24402fb22679f4df0f16609c5954c235688c11ab4e5847dc351bbaeeddb43e617254579d4c90a5cd9f610e4b25a5dd0b345138a300b45aaf1aa09bce0acce43054ff0feb4e48a6905758c8785aa0ddf2bede2c48ecd6fda54a0bdd6ee6dcd8583092c10297fc87e5bb5027aa84d0457a8ca555134f4aa16d67d00857fe4e7b5789a21399b646ba2c3009b46810beb40112295b88c48a0655e87f94ffbdac5dace4bf60072591cde259c7e727aac6aa34e3ec981fc90f6cfd508d1bfca180ffc6c64d4ed1727833969d2d586f9f7288746661a35ee96575c2146af5a54636c233a2de289f09647bb78eac50b68b5cef4e3e2b05bc92069152b8abcaa0286845820ed495b666d116c382c78882eae03f20cf9b27bf5f7d401db1b1f363a4700a206ee30ece276885592e01685b3aa708aa9f4481edae341281a4301866570880ad476c0c2ca77557d6e4dc68a5f71bdc3a31b9ccbe0ab5893ce488a23ecc7c39772ce206787391fecb5bcb1209aca91a6e0b6d30a6f19c049e073e19435155a51c83e7a6382848fab4d75ffcecc7f9439490d1863eff32252390c2f61aa21f440bf0df33c221f4dc120c0d71d5d566f86c668915fc80225b7bf5b9b13b2b53a6d3d85b57cced4003615e56194b518ca95400e6685620e727f5ca74e31b497d4df2bece8aaf0695013132bc7bb3c8d4c6c9d48c05d25dfb0b2f73a70431a90699e728bb34fefa7e75f04dc2e1a5b7c9e15c75ec7707a3c8859785a28d14b68a1b3f8aa3ff233566a22cf3ec03a78ae6898a498a245c7eea27bc6509e64afe72625a791b41b243e84645c9aa5a2fdec51fb1e3d7a6575bea520cb64fb83aed59dfc668739532a26db2e933705da50fc01481c977656ed713a506edd67b7b0f9b1411cd5f620add817875c5f076bdba6218785ecbfa296d20814970509871d1c08fbb3c4140d151ae1789f58d3dc04b459be43857cd0d7a8b8732e220a7b5d064a32129abb9fcab5e108446b92b535ec50f73daad6691abaf1761c7d911bd87f20ee219f12603471be3f33e06c7fd518af395ba3f5f4c6d15c24475ec7f0f74f3238c81d42d7bb15202554ff88c04cfe1d8d85b700f943b5a085980cd481203d2717ef5a728cc86bb1c38f0f0f03016743f9a32f1f01f82e66a1f7d1df56bc13a7947e9fcb08c1391620cd5a28cd5e1ac8889d537c934f0456814df310f834975cb65d3475d21048fa44f426fca8cae1563f5b6b3c37affe172c80bb90eeee92eb85756197721b600338eebcb31bad829228c6bf8a7580e652aa7a7187c054cbff09ac6e5a714c48d903a16474af70c6264ac4978cd62b82ae04215d1df7cd0c3e4beba2e5560aca25adf76667ea7975baad3e3a6ae1169bd4415fc7781ac01b50521b4761a9bcac8f3fd709b5573157f55a1df14d1faaf86b691bf6c3b197c1de2622a3f5f3ccb7bec02896867b0033805847045d164f631c853d332445b9c690d0eafecabaa1b35b38d45501e04fd302afa6bbc1506ea28f9bacc6c35d8ef20d5759a20789a3680db0c28e4f0d84fd2468215da2556d7e6bb652f7c9817e0dfec359d6d5e53a9e7d2eda89978a097a8e8a9f3427abb6bf59db160e5e39f1de0a1dd1e15c58ce1c53bd048d02e04412e71d0a8679dcaf2d0014e052a90e4f2eda6ca80cc369c7ab366228e4b8969f8cd82a499cbf70c28f0968980cd38700c515b8c89f33a18d13ce272ed4e03480b208b744be22ed56af1be02784032d6c6b640918e2d386881cc413fea6a342514a20cfe334caddd253df8273026286fce86f68801ccca2218dc02e81a22849791dc7770e45dec7a044fc5865ce181c1603dddce897457dbe3069819d0f98d160f3a6b9ad3a8634274a1b6ae52f4c772485576e3899679dc9cb68133b371a606e94649ca85becabcf2ce4bedc6f271d8c378425586b598ca82764ed4460d7800bc7aa28e7f035b400b4fe5e30d4d098b8de0d09315544d2c50c06159ed3f6b89f55206652418cd722a81252cba76f700e459922a99e50f58642f69533d8a09092076d5dd296179d9dd1c7a0932f2e2bf833d179a990a47f5590db75e9b6fd914ca33a164d36fe8ddaf7c65272b63353dc6f5c151a7169f899bf5ebbaab7344236f12e97ac6a6a303fe2b7704f82a66f24c2e4fee28ac6e6b99726715d216e2cb6bbf2ead87a830c3559400011dcb00837f40e3deb23e4d31fe0dc9eea3dd2d535c72d17b8ae70ab25260c0ca20c79a57dcd84d91b84eb463262274b385389c71cde8824334d5a95750fc19be95a28ce5e15eeda5cf402c85ae5b07f31abba8ad1c8ab1b33a168508fdd08b6ce0ee50c4293f34995bd51e0ff301e42bc8c8ea4be4d3d039ff0c366d9588864396fdae591103c2dae250116890c1a9cc1402d9f4935e7e55e83925fbd47eaad12c62ce3b354718e8e753af261414c96290dbe03dc4750c85aa2fec1a173d599415b068e112739741ff423fded975b37da3c6956de4c20b47a952f16efa5f231af768e6d11513ce848ece5be96d6f088bd145822b70d01b2a6a34ce50ea3e97c425fec081c9923f1f1a3a7bdc4c5b28fbadfb0eece4f99c8c6157db766356182e35d49e79bc8969802629283e02d4a56bae3 MD = bda8abf3e35a759b9444370ca91c0b845a93de37d4bf5b814bad94c6733fae356a3d90c779a4cc9decd5722a07373b8edbc42159562a5eb764962b9541ce784c Len = 39040 Msg = 9c8b9ac56e6653fed43fe530cee77044ab3ceab021f0cb539d8c0aa0d8b449ffabac4d70241bb072d90fda237c422da8b09c80cf1bf8cff3bd2b302180420978100c81d6ecd934b1be802b42e8a70be95f3e8ccdbc4d2dc390f02771f89f9fb372b31f3def2647822a9bc0d5379e72ce5f2cf7f02b764f88bfe2d5d8695371757aaa10ee558d51aec567812494afca21596ea78191fb9b0df10923a0fbe4e989d0f83a314593bafe38ec577625637ba8f40a86c715657b19cf6ef90fd5dc6eb61ba5874ee7c2eb372b3228151241ed2cd90a7b0ce03b56730118406f20c367c303bade8c64a14a244542de4784d28974af756d96190594e42e0fde06031f3e79323e2634e4b8408c2f235f55a39cb54a1f5446afe94c9c34fe5cbd1da77a5aa04d39498e8e90363691dd95879629da74d1aeed9d7896d82b1b06c3fb345b2300ffb42ee28bb092eb11796624860161bb6c8b4aa8ed6eaf902a15daead14b0160edb5bd7803a0bd735afebc769aaab0e799f4451a7159892dd692e930a6d15c89c247de971de9209612747ec3fbae31c0ffefc6392be1cec8c484d816dc759c44246f79890112221ce2e39454d0954b0d4787b54f448de72a9ff38fe49bbf2957bc377694d8a32acc7154e57142e5659818c1faa2e3e53a1b0de8f5e20a386c8a31a6bd01ca25a26f68ce5b617928e9271ba77d7a31723063b669f4585267cba72bc43718fe1ff1cd6e5add6e9ce53e83f740272156bb32c94481738d9ad4af74549aca209d197fae2cff54ded3a5cc745594dede7949a6165c355bca0b0881bb512f5f63ce9bb4da49c5a6fa48effbc2ddac8bf8c2a2f512a88f9257cd8aa742cd8cdf27ba2ef8186eb4bc0a204b3334368f17b85a508885d096017c07e28bd26eb730b58859b33243d57e568641dc930945686669dbc6377c529081e2999332dcba3c5561a54dee6f2fd425a05a5ea7fdd7684a16c916f053cc28ad8536292cc09de94e6d992e159bcaa7c1961d2138bb4cfdab8aa4e277fd0baf491841b486c26621ead3bdbe6f6eafdd7091138e0eeaac11d3edf3919523170f9dc5439c09891fcb6fbc9966c391e5607bb9c20bf033008b08663f8b126df92ef1b2c3487dbecfcf264fb68cdbab74162a35b401a83e4f53931d0f37b682b8f68d074922aa087f1557b59b9a7d6565e9c42e71d9fcb2a151bc3bebff480b5c4db8ed5d91571036844a15d0f67267bfc093cb7ff9b538fe6dcae85b4a92afee1dbc8c88fd4e7efc064698de0a81588a82dd3568cb9b776f8f074be8815a17754ddf0b51ce55f9d98295664c3c74e1cf19eb93b4b57518fb9fb98d190a69eaf9c56a92416d3529d6e17da6a2f612a9956c050ee9210dc2ab8529d5774e87d1836da54bde40b6b7fa094781699f2259e46372ce9176291e86299f4c89b57b74192dd75cb3b09f4b4ee33a1e289e6d98c4e67cfa331c92d39473621ad7a80f7ac6ed49ed4526ba8cd857a0a6675dbb0f3edd69ba587b108add4cbc66e98d098c8f9544271e08cd23a24ebf40ae43d3655930823887fb6aeb6a9af35848cd32517e0d0e31c5bfa1b7b4aee11586b87f431ec80f9948046a9d4247501a7bd152729a3def34c2b4fef114614c4c76248551938b580823fed6496d391bd10a003196eb0d31589e4eab79cc4d480e07f0ae36c262a4aba1517796f45a9ca87ec196667a661bc4e0f472f6e45c1f83bf82c29bb3353daa4965152dde901bc55d7e4b894e2ef4a110101911627517d2294389276ded692ea4a278b533c5df50329e16a86f4f0516b6096971507f7a24ca9bcb83f870715f387167d7fbe031728289c06be6af964c5b472abeb5648ea02cf34f565ca89d649038ab3b3fc95952d7a61179ba38ee6b863224a29a0b9c6fd6b1de49a17c346631600c8807689f1ab85fd07bf3d0579ac0321ec3065cebb8503f4004d0d3808ca552526759a54aefae1bc7189a61170190afe2c9013fc5a423033d2ef197c7ff7375457f3f68a4fb4043bcf9b6d277c97e11365d949c705bd6679c6f0aaf52e62330ad79c099f366f63d78c64f0bbf1a12c0e327c55b3504f1d127712503696a3ded51fce42080585872c3266ef4371bd524b1ce9e645cc7fcaba4d9497b53b34a13fab1b4e593f8ef4a64c1197527f54ea567fb279f2dcd805cdc527fff5ae8d20a703f37d0746e422e25405b76d6cf06accf5567f5f03e054c9782ce77c4315b397b5076ca6ae3d984cc4b39df8dd2839faf85664cec4211e39d113ecbdab76f0ae38977b9be7f3db52289bd9894264fe8d0322c8e6aff2e89b5a8d7e3e4a295e46f944487b969f52aefa3ee8933f2f2edfa05c2a1b2a0e3a6a9efa2a72a1a562fe919e51aa0ca894afb40d49bb25ef218f4a52f6f0c4bb8a23f8da600f346385417bf605cbec9827c0d0978b45894d9d088bc7bdec02936e5402bebd4894ec5b9c12fbf335a8f672aefa6e1bd6eb92e7c7cefafd81561e4d773707a0d325b85c7b1110a89bb43c0bb67be179f3cf87a8699e8d144541b4be1a2055a913795ffe6ae0c47452a0e16973ef923400a774455a74fec09c681f1699391934ae023bb7f7fc8804fef18ef263c010c8a205e14516ecb0511b0b860d90fbd2e1e742d41f8edeebc8f5288d6cf287bda64c5d672e2b50526435deb2097de3132f73ddd1abbc02604ed9b8650fdcb1296b54307e77046a556871440b70dc894a7bc8159cd2ec0175f51113ce715ee6c4767e018fa63e7529ec51cdfafa1958e965589c9e2bbb46ad5a3fdd022805731f561e531342361b404e5bef190bd0cc906a99d56e1c966c66ecba76a89a6cf0aa88b9a7c1c187c7493d0429ee0c8f7eaffa2042853bf9cd433b15733a5ef1d9f69cd461e3aabff3a506cf00d292a1c9c89270866c0071f3c2b3d5552fdc40b973f0f32421642b4ad45a20f67f24a4385ad21ef38ae08b7a55e58e8f01a8b5f9a3339a70e39476176795be9d3c492364d727602c7a72a2bb7d5e85a3582aee2524c33ebaa2a20cf3df47dc47a2669bc9de10f893b32d5451b97d6f148bf935c6492e5463f7137c6a9bff1e984a0379c1d00d4ccbcd871cb79ac0bf65259a4957b0d3802f597f20e62e1a0a018ba659f74d9ad12701f6686781d6eb07ad647543dc61266f323bb6e116271315efd598d4a7483a582921d3ec1f1e669e9c0e66352c45db9629df9af5e4b4be37ff07c2e49d73ccb18b6fcbbfc305d67c69ee888630fff44698d1399f0a318ffa31c3649170cc2cd5b156cc4d0e3baf43af9b58c18b0e24f317c73f47072bfcdf107f0a85c1bfbf37236d623e511e5566d58b53618aeec21e2f2808885c02895923b1011c10ad18485a1a09ee4c2c5d5864350500c110704a375a21dd8963b9fae40004dede32bcabedf34fe75fe44bbae42eea09be21a3e9c8f417a10fbe0326c9c26248aaef00b4377f80a3fce494e0cdef7f06e280c18f6c7c568d6f8ff98f4d9ec5d3d710a903cf1568ceb39bdd8c99ed3062cebc7dad9a597afd29480176f7eb9c2b03660a1d2d6b54a2048869f0c0beaaa7e3332cc6cb21d17abd74bf80514f4198b04da852cac7c0e87028decfeaba4a60c093536d875c0680ac94883dd22072b75e4608674fe159ec86fba06c6096ac17d74b85f4477e869967360ff203059c017dcdaeacf51e7c28a97f6378eaaa2c27a7da390d93efee3f8dc79b6f5c752a019f730fa672f5a44758327c57b18b672aa2bde11bf54689ed70c7cee856e5a92223a4bfe641fd6eb323a36f9b7da0c99b686522a1d419062dc0c52f0f7add95fdaaf113eeeaac37e69c40c1b6a780eff4596e5231b8bdcf7afe3e104740c37cfeb5d6b012b5689c6c12a8f73bb7a226b00648043e3bcb624f79913712414dcaafa4c419146ae908be373a948d369b2a68ef70cd39a5b85b25c37cf812e4c31b8b2857c346537419477a741e4dacd257999576f1b6bf1b16a88c4fc7abb3c9cc1b80f0233b17b02ab24cf3f8df72ce3a9c68d93637c05a211204884a5f26d868cb7f2bdd651013c9692f18a8c52105401bfa05ef3f51fbf72cfcc4e4afc6658e2553794646d51581e6a180c291400e0482c98ba12ffc872543b5642b100af788b3ae56e272ff4bc0b5449acab6585ef45b47e8e0ac286237e0cf1482127d1504f0f043565bd71d225f78e525c6c26e9c10059c22165e438b9eba248e4995346f67c9dd0673f500134fceee682526b3684b8313da010671acd80732a407dbdc44728b62775de1ab0ff0a7251663edc3e56830ee9cfed993182726bd67efb98310bbc5a22d6c156494fca207950590269ff09f9adf52101e5a0699235e53d6bf50adf8ea9d4128c33ece4024787cb642046f3f9715bd7279fee0ff12dbf68be780c3a5ca4b5f644d69eff20a355bb8ac9f5e9171d4a3594c535098fa752a71a21d975cbfbc297079a2dc380760051fdced2925a9a0863cfc13d02758ce820055a3837e396431d5ce760da2ca6d1b74495a697cacedd8a60f9cea0a9c2c7fb098bf328ad5d80b0cc2500e92c1d1012e788389f6fa213d2d0d7b08b35333761ae1ad0f13039c076debcd59b86c1058d6f0d525352fef162a6c1aa6c20c5827a7b70983a75104d9a1a14a795447cf84d638eba5b7acbbe636a2186eb7362ef6df8f512aa82cc6d4208953e826e35307d4b72395eefefc3fca55e0aaf35f1c563ad1108ea6153699731a862080ad4f643b0219705ba544856dee0ff616e5a4d83232d40a21a8f89c01cb3dacf224092c718039cf7e2e094989d0f2ca82785cff6e1af8479b36614e551206f80bd634c320e8010dc6f7df1eb6a535b2d675a92e36f019a1736c254305955e9c3e4246bac1700ba5e6a12a577ce14529836c1e07356894a25aa8a8fc7bbbc103f9e6b395cbdeb6323da87f96350bada909ca2ffcd1db15e4b18a60ed2ffbbab9df320fc6b87a9d3d3c7c435d879adbbbda2e5381b4ce09c3087fd197aaebc8484eb2cfd01fda2d21739b0a1fdcf55bdc84f72d3826c7dce7dff79f7e64f26619d8f758444a83e2897393585fbdc1ba859ac31182c04f2bad98901f2406a610b90e6e4d95f0fe69cface3a28f928654317bf0a4f419ca629ed2b7e50ad87d54a04f8614378bb00f8e801a8d320399c57ab92e6bfe8bc01e261efd65a572feae5a2ced50bb832f6020bd965ce989929acbc2dabb14aed6bafdcddf25866e908a6116f267a46fe2e83085e5a6188d0720af396436d8fb64c5606fcba92023e9753f9e33ed64ba612428a986fd41864e139f8d7943bdea00ca08854164f51b5ffb504330367eeb3080937908d6e72dfdd0072f888635f3213550aedefd97ed6a894d8665f7758ac7a9eb74d9a78bbc9cd290aff062c3cf4ca3d33d02b76af29fab81d84394cb019cfcab3d77f3a1ea81b7a67f6f5e09a6e971fac04b46f0d375ee87c96782f1f836f55d33725fcc1062ebc32e43fc5a429e3c51c91700cbf873aee9ca30668cd71c207be747306cc6a6eb612d2cb237fac17f52c804994eda1f79027b3ca3fe16b30a81d96509f685d4332b0c78144567f997884d82651c10efe97c2cfacfc83f921ff97a6a611bd6615f6b3cb496f4f2bd316cba1ee896155b6ca17fd94e6dda4fdd5d5aa5ca2f20d4cccc4e60beb92372b96aae38b85f5fe86f3ce476a4614f32cf27ead5a9b2fda507a8b21af01482b0bc2c8a7e48da692d8d88fb51664536f161e3bb488449e568ac8af831df99990da60cef4e1e89b981343014e8188c09e2321b4c9cee464086080d9153e1bacec003963d36ae0fe989efacc1a91fa830abcc290f314c4ac783b68b0def8aeaacae515304b67bbf41ae3c599212f01c53b47ca783b422d9c2f844adde634fcbaaff1bcdc64c0c2a7a7496e106c44e7aeb82e0213a740655cb4a1ec0735db4b05258cf510265e3d3fc638bbd802b6f26509d72f0a42f6b4158ffc16d7d4d3e4b3b31e89749a2774e30018769aeb6f6b13b6ac1c04114c64ef49fb92f4ca060febe20f41afc704aebcdc5265fd30559adf471390aa1e2bbc11690827081f5a14d538c7e36ab6dd35f2e24c51aad852c6f2457652a4707903a4778a9cb8dbb93a9a3fae374c6d9b4fac9a6f0148eb4d3873383c2b990f2082cffce9baae070aca627f2c07fef62445128d233f80722d398ba6cde331040681bb7f8c4992ab350c547faa192759625f4e42d1d1fa73dc0f62199142155615478f88dd110bcd214899c78e36709c3ce48541df805df941021f18f010ed0d331e749f43d9c277b8c658df422681c9991ee213b7145109445ceb2c521460324a4c924d266b5fb0e1cdba502cb101e763538a3fbf5580adcd63eddb1f1717cb411a1019ee8d898184a7e7a0b69f99ff81cca84d610b8fecc4614eb0bfe1bae300d0178c0408e8f08a9a065a47b7f018dbd162c604fd29cf119c35309a3af07f6fb6ce2ccea32508d9ef400346c2af3a59a9e0310ff4f45c9d5dcbe518ea61a976145e84b528e8ce5aeebc251d897d6de39e4b16ecb8989d4eeb3756a2b8b668fd31ee19225dd84cf5dea34733d103ba61f6cbfd0211be9a0d90a20b9e6d97c5ec56a7757b0c9e8993091cf2f065e828bbfa876fb9c70e5ac392348d76d1abc62bcbb11f29fbe28d1ab550adbc0cd5c0d9f2a8f379a12fe5563a146390ac9b76a2d8339f95f34b61742b6600ff8d7289a3265512aa68ca43b0d06b1556c60eda3ac5557e26bb810c87b3877321b1668b02ddb753b4e4867db79c602c2ee7adfcd9d94143431d2d963d94db8f8a405acedc61f63e00dd0c9955e51c2f82d620e3685d1c7656dff7087c1889dba302f55b1bf8395bf41b03a271f5c7a6b95c0e97d099119fc6ca86692e85bae0d2bee039a5eba833f965 MD = 64fe3513e438e5e0a977586a1780d30795367d6bd622386b4fa8cc9a91a88bfdd5666a5a39ae2a9f7f2ec67943edfddb42e96e5ab81aa0cdca312f9d60f8c9dc Len = 39832 Msg = eb2d8518ba3168e2431f40ac2addf0227b1603f13d82e12b4b6849ec5f61fb3e705eb53a3eec61702bb78d894c4d1b2bc0253a1d40e095acf8ceca4d95b41d83a0cd6e030a0e681708aefc4021e60d1f84f66d95a068092aef9860ab12743a17238196bd471fe49e820d7418d02f2fc6718f85a284a3a66cd7cef550fe28b9c3a28216ae1ca53dce42dbdf5a81b1e7e72dfa688a1417d43c597670828059044dc5d9d71eb22ada6ff020244f5ef29e4c603f00957a4efc601d9ab88ac08e827d338dc0573035254934e52b3c8c7cbdbbb364330ddbd084a1ca41b7b0e74f9b1d95a6b8a0bf4f8523b431dc6c36d7aafdcd73eb386223d6c70874543b1d25b7f3922da94087fe62c61b0c1f268289cfda58730f6034d1589a813a777589963ec9d3297a80afcd25fb0f7edcb1981c9319f96d87cb7c6274e2da9b08a4542c9865ffa213a8604134883890fb56a1185d845a683bc1605c9166be9ff011a56f2e8fbfa05c00c1e4f8354049645dc50397e1236c138c084916efd34f1504a5e66611bb2c3dcffb3dd9ccccb2ff0e2b67a8f9fc82f7739db06d45c1b260c47c19a9b29a4d9e5f35d4401387d1b5b0fccbf8948bb0cfbd471afd3031d0b99b51906039050c67f6983293d416b06c8d5fb8ef7a7b0083b32d0e2e78cbb209cf4cd4f16fa36f80dd4cde3bd524570deb7db5f572727afb9d781468e4365f36a9976cc61c1d81d15c7860a1df57cc81137e4a724518251fc34fb4133d1bdf2a7157e045081a4742ba44412cb95719ae4d89ffcebb1709d86cdb77974b213bcb6fb7b9d8fa43cbbc41d908432dcd467ee1c65d719c142e0ce144e45dd6f17a03ebdd7ee6bb401425375f3d50016159d8165eebc3b0ba9da46bb184cba632a4b92cf1b7d714b82a67e5fd69bafeba5ca33579312dbfae5d89504add4a828dc2d57b1cec12ca53166893dc13e9ec8156c9863eb815909b76a1d839794334aadb3e2085a601a8badf128924c345935d503151d607e4ec27f1d64da3e01c8230f7de63566c0b75958d4b0efc0136baf751c3de69a7039bfad50ff5b3983f35c81e9c8bb4c798f88b29fd6b8c56242bf66167741e1ed865bd2a341a8e2b1215195960e2c93e10fa45b90fe9fd4977ac0388055d1df6cd1218f82c025f21ffe9ccaf12aebd59dc436b4869ce77639706c6cf85df8fb64969b248e1f54c006c7b88299b38b8a0629ba4dbf362212aec01e63dcf439ce7b43334213a3d7d52c391f6cee1c8e19c0bca987c95ef2428df640cdbccd16b107538458c1f211b9e6bf4bda6cda660d43f97f03237bba8e5d6f9dfb062d025b9f6408e9078e84e6dcc6c86b947195ed067cc5406c10fd4e83a8608c47a8af16b9e13b7352ddb3d464ec0f910386a0319e92f6bfe1b33d0b974d42e1ffd45f8acd5786783274211b159babdb286e276362f89de252d6fc5e0eaabfacad14a6107033946834c65f13655207ba71bc7e0af9fa15480e00bdbe506d214cce0e15501901cfd3c858b065eaabbdaf8dd61680da34176191a4e39512f13232d1051fc24e5ea34b6bbfd78b0c05383acb6fa37d7a22fecf7c48208accc34cff54be47df7686a92fad4046eb500b01dcb8dd8749504345d22c7ed6f7c47fec22d78e001028266c00fbae610f3d099515e494448d0301872a309d7974b0739a1dd7f8eafce9ba466fd53eb87f499d7c76bd486db0e90a3d281748aa7a074ad170b4836b0e21cee2bcd895dfb40c43326fd15e654da8b9d25c4ef4dc804f621cac1ba202bc66b0ab7864282935db7721719f4acdbb989cd1575616722fef55f6206bf934903f2c0b33068a478d5dc5f41c9591f9a35f2fc489ab421dc16d92d88e33ed9322018dac7d4e209d2309ac14d142c88b6d52ff2663ecfc31fd40a54e45e20380da5441e9a7998f9c8f4585fe203552f5a21a67718669a9512c1f19c1d824bf9021be056d52772be82ab8002a99cbd5caca2c053061cfddede64f4ccdb54a8633b0953481fe6589f29dc797249e94a57d4dfe54dd767e0e8aa457caec8de1fc0ddf705bd21bf32e3e510ab776bf2e567fb617e2f33502bf99fedf2088a279956136d5e7c83b9e8d3ddce7ed9b7be77d649aef1bfc4ddc65ae5e3bca3c937fc6f03f4c64fecdd62b73a9e5a5fd455e6eae550a8c62f189953a3af44472e173251d513a5fc043289d72308a7d36bbf1cecf8cf090b1f098d2b01daf0bb60ce2144b253634c74c0437ac195cdfb2304ff23a9b17e583ab7882c28eb2ac90864b392c23b6807e48f79e93ccc349fa52d79d921806e73282a739c406a5937cee2ce812c531cf5fba8146dbb3644899942715487c34125926a37c470e0e4ce594f5c5b1923e8dd6212fa4c66596680a549cede04035e362080baece1d4355652b34466b0343289c1d515ce66bf004b744c7abdc0c72f6e7973e65cbbceb39760166eeb1a0d63bfbffa4b3de3f07cb3ac525c39e2971b95464ba25b2556c6592c81c2317e36e448048786df04734080f6645c9c93fb8a722e10d53247f5d6635efb288205381cec3987adfef2cfb67af989622cfa7ce4cedacb692a4a324b7e9d8d8824d69a727206ffa8e0d58f44685ec9563340a19271f184458956968e72913eca601be450a412f95fcdd4385414cc2c20f78cf3fa231c41519792a80507e316d67ef99f1d48067cba0f17544d44ecbba9c107f985ac030c759e27f019043b1d94c69a5240278991a1edc76a97c1667dd7d8d83b9bd34dec99e43df63233405ced8026852309443ffcae0c039a53e17b93862941a561a3eaa5b2fa43b95a9bdac7f3c4c02db6de8eb39b0da6bdc105bbc6111f94091fac0c8150895e1442f49f0c689d8cc6f50086aefcf3db6bd57b4756c2e4bb31d2115c160610cfadb3f1b4a227d970568f5230d519e52b0955eb272de1a03e834579e24a1cb81feb753d2073789ff5454d7b9311390c1c000afc6131b67aa6693f8da506d9a8d5354f7eeb65a317a1fcf524b748a59038b8bc57ff4c889b794a87f5ad33870979f50a5d1e62ef6bffe14ff4a563a698079933a40865a12b428ee65802b76c0293926e81c051a6c0945d2594644b824c100c368a85634751869c245ead7cd0bcac744393d9190e41ead93dabfce681d5db778fb17d30c335cfde09b0b568fd5e4b03513a72a46f1388bb60e2761eed5bf04304c2f8b35d00a4bb5cf622653a11f9a7601f91d91361f66c56e1d9da0c05d8d95e65ffd45cda8e9be7d7fc5acefd3dc837e941a04151bd55e74f2d0228fc1a9f6441987b0aea14e670fc4c2e02499fce9f4187e1400b64dddbd57b7d87683effe0ffce90ad59be05c00d1acb1e1ea72160cf6d8459b8736bf91aca357170cc609846a6fb8e4e145e9fb16c186aa3de29423afa72d48072690ac72211303c4d2a56bf2aa4f5f29f5ad5904cfd2d01cb4e0d2b3691f98aea3ed6838bf90bf549c4e0126174296de6612953c162b15ff7f988492aca0fff635225f70ed549c34698fee6535174e671dc64a2d32f3ce6e8907c3ddd066006630dbfcab28d33cdce0d7ae309241c85c9314e248b4c17bd287db1ae572b32c874d76ca5800a113c688b1bb28ad66a7475caaf82f0a28a0e3f26ef45a122ce6d1d18f3307e322b379d7aa8fbde4da6d8fd0d4f640b17dcfeb3f5feaac2d47c1ce7381d12b6eec8e7f343ea650e7318dcea64f670e29457b70e50a584c22884fd589fb2f430273174f44ca999212f08a5c3366b5180024161d7a1ad7baa052d39fab57a7df3c3af0528feac3f1f68bd5e10eb77adea47e323974fdf388155c0f855e33c5607ac88c216c1bdfe1108802d5aebe22d2a4d8526d5c201634fff8561ef8fc22674c804d446fea27efef6993a279d747846fa6f921962dba41debc49d5223d29642016d63401b2468ee1a50ae026bf4374938e88eec9737a1f201c5d30605354e7a3d09968d820b64e95cecb170bc2c1138ee3942d4c9db05d629cf2c919fb3f524662296b4991f19f8a4b76afbf9e2af1d04abd75b609076d14b2cd07d5713334663fe8b3dca283022daf7022a88dfb8ff61847509c41e9cec4f22e652971fb2ea1ce59cb17ced5070e6f5a185d2ebd5e7ef0c43655d4d212e1dfa9796c69d17177921f196163722e8b0f96d953fcdaedc958d6af794e5aaa09dfc0ad34b560dd662f9b37702ce4e95214b91e1384feae63b4d1247cfade248b86f689090123a2ebfb40ad9a77a7b7c1f3233f22337310dc99561de776e6e30549dd856fc984627789b1d466d0351a793f87c4e694e2d5a28ad8243f5f0f9605acc83acf7b2dac975f61545bc307a1d66e3937f735c84d43edd9bfeaffb29deb345901ae9269e1d9f0d195ffcca9be67e3ca00da829de84f46dd5980f57a6b4455028283abd392adc27521a95995f0bc54acd7e6f7ce47033a457987ccb19eafa34735f533f54f8158de801f0656b932257405c321f3da2e1cc4a865e212a86b93b98469a7496903388029973f66a867ca9212e58d89222e72bd5eb1c1f809269abc0667824a8f91c5ec86c871402ecbd89997d49708bf62e09214d208ec415f4cd12455616313bba5763019586dbcecc3fd0d06cafcf289db05537d1359d1841e9b76d9a13da5ff3bdfbe003159e339113edaf2b5c07c01b679a2e97deb4a23847d666aee34b6cb1d6b7923a89f324f44d18a2ed41dac4927518bcda4fb0bbc12e98b6f84e2b6adbecc09ea3aa81a8dd347b321b24f13ee923f66802513b6bc4e825e7e21c226259453e8ca53ff1c734113be61bcef33508b95dba77acfabb29bba481d214da5b132958e5a712ea89e12c8347560789b2d77f743ba22897b2d8f03d0a32fff85df0e2362f13e915f7cccd79dc34965bbc3dbc6472e98dba59bace1a0c69a52770dbb701f5508d1a18de3c452d1e45105b25ba54e8b5a20ab6b59f600edfce0d9db9efe1bcc6c6a0f5fdc010c27ada519774bf6d236f3030d4b2a93a99fc4252eb73d3fd0edd5b4f9412a30224b11ec5791314d6ad7dffd3b89a36ce3428c89f63f1ab7e72fd16d1ff062b42da2cd91508ea01b80e49d79c6c538c4467cb2a9c0b1bbf8b718ebdcb3ebfa1f96c52d3e84de1cd3bcc398033f7c7f3c5ba4d2ef0edd9564d92f819e857274d4e638ad3e74ee1c28671b7c13f61dcb579b6169d431114b9ec5da3f2cd5425766a453ea3ba15d026c2852a6469b27c1987e28e3e3f7db2318f5af810253ca065749dd50908aa9842168efa2f58f38e6617c61edb8a3b9d045e125d3a9618826395f0b7ce79131f5eab168eebb42cfae553eb2c3acc53bb7a820c3b3ac8efb2b6f5c84bbab65a4fc2a9a450602763a8de61d82224aecbf6dd23d0fbd665c918a6bbacfb9467870eb537c1a75557a2809869156661d7ad357368e703d712af9c7d10252f2634a046807df3fb93ecf0695d942b62b9f10160867ad8bd0479a726811bba4d36c3afde6ca4c5b5e38f564e7309a17cf4a1cd5e5c812b8f2742bc9efc05f3be8dbfbbbebfd4bc3b0be8da1423f1ff1ed9911b193da469e30615f3ec34f558eaf3cecdcec13462f6d39e87a4b574ceaf3269f278730b19206b9856f8721472392f98ecf6bced3e4e055a62e671b99597c5d05b6345dfc3ae1c76ecaafd89c8140bc6201ef626d8ac67c375c29fe9dc3d5b6f5cc2fa48eff5e155bdeb1f7de2e14d00712eb808b976c382c721862b2c0bbbee007ddb6d265d84ded2a11e184909beede80e4abb6816df3e60e96fa80b68aff44c7d3077ef4ecbb832b6438184f526368ca6f4666df283a04904a28804bcfd294aa8418dd330808be510d6e11b0c4d8366defe325174794f895867f29c706e3701e755d8596b6901f4991f5f97b5fa7b7c9faf469b0288f428cf060e5deacac37923b58009674fc0663765247f5af7c6d8cf51cbd30677372f50c605ce93d978bb42aaac6b8cf97043d4f2585b620a0d82582ae882e70fbfa5c2f1ff77d362fbce2e7a84084331ba94570c21b435fcf8802083c62f0d1835920fcd23e1132ff7bacd6d3167f2bd4660a8fcaa103b942edc11a38c62e05a40fe1ea39a93b906128809cddb100366bbafaf0a19fadc9c589e12d463a3c89c89f2d7ba8c152fb0f43fc8e0a98cdcf4c189547d97f780da1dcc0a5c737b2da8b875225c20f0dbf546e7f4f0c462e72f02f77f9f4b918f182670e384e37177447490e7cf7eab279cb0897443541a8adf230018b65e4f711c1a918494dc0e0e39654a0e5ccfce7a6fd92b3021803d2fcbcfad070bf7b98eaea238d5d485d85a4e34ab7f4b3be23b346ad810d470523dbcac0534e63f584e98666cbe8b0759c44d89bb23e4e96ed4b40a95fca34de11c7a6210878e5eb31aa10d3527038919b2fc0b83e06f02faacb7626cdcd53f7233cd9ad6e94d7b535890409bf882349f8d25630a9f33ad0e2b051a6498b36d8eec7dfc604069bebe722ea6a719512f73be8e395849791333b965d985188500bcae512fb5762b507ece43e86072b8a31dab003476c4895bf0bea047d845931f85e212dcdd71db591bd697adcfecfeb825be42fc6bfaabaecea27e0d640524f370ee88aae11bc1001bf0f19efa6d6d95145e1e3a3fd1273454cdc7d3324181a4053b7b42c85a256e08861a62ebde4b6372f25a96fb3344140aa8434048e2f359cc31b34b9a184ecb69ffdba2aa28e149c5e4bfb7a6074b777899bafdb0cec03a4e38f76e5f3c853ec7c3fa063d317770979b1546483584842709f3b272ef307012b9115320ae12efa93a3f35aee355006f7f24eaeaa437649e61b706942b8d23a01ac7a1e5563d0797cc74d80525c220d6f8b34c923eac3e6507cea1206c1d7a81c5e200b41c4eae19e15f9648de08f8536e8c134bea2b3b0565002c1d992a9e3c202a1a97e88c0bb8e1ca1881f86db16e4975e81a90fb8305e1154f949afab75995669495a24047fb347b06b75a3a73aff137730919653dede5d4b18c57d5ec618b6019b632b2896b423a07f3ecb6659fcf9a5b1f6bb19246d806fb0db7 MD = a3481b7a56b6ac361213e5a69c0e99594c332567a0cd5181992dac5ac6ff236766768e75968685cd44ae68ba7a03c1d1471bdae070deb899cbfc1690d4a69b47 Len = 40624 Msg = 4bff0a260be42b8bc0585e920f78107e83b7c26130e8c4d7979940f4caa37b7bd1ff58514bdb1e3158ed7aa0b708c8242ced8eb1256349649c8a6d743f6ca765cfd5657ec665987e3ce3b88b0bd4096b324c1ef677059bcb51ae3f43048521a30e283996c2a823da33e0203953055ebb5c7e791a6ff541767baebe4a6117719f56a1dd7f88cf46ad048cb993d7c24c7c7328a703555cc3cbe531f2719e4a20bf6ee8582360008a5f78918b81de345d1640f5b19b7161aa3456e0e4a10245b56d20a4b2689163755857949eecb28218f1888a9ec80a2d7d1895639bc0d631b810327df438652291006940fbba99d50575169276746ae7c4df6b611fb76235b10f6d1d257a226266c0753aa9d5dc55ad0bb1b34186d7b808f0a082796fee7a29d499294d16114e7afe452db023c3299719209508e69ac8cfb5fc6fb0cfc228a8c67e4c74f37a0b58239fbf198e957a4b092ce1d37cfb3ea49547d0ccbe2666b44de32ca3fba5c485984c98ebfd9c6f52419d3fa83041420cf8484cd626615cd7d19271e215d99f8ac414612e571e31332b3b5691eab6fe9146c88cd5eebc3398ba51c4372960c4f00ebec2ea8664e7762dcdcf9592a097bae88f38d1fe7f137f71e9cdac20805c3fe014622871b6baa4b11d51bc1048380f4465f7d23ef223155c223348e0828ffda1dceaf0005bd2441ef1850f4cf60719c31271e1965c8ce1e4c39e1352ae84b4b8df01481b9d56dedc1213952ef22c5fcd5d4f05ee07756c7196b8165e4b64eb8fe5503aaac26ffb5348a2579f83d06acb0f39472e39073c6c612658eda3562b8db67fcd95134422eb5ada5b85f21bc023f0d6ad3e3b6adb3bed93e1e5fc83fb1a193509c4d8fedb0c1265abca8834eb3fc8cf420655c5d14802a5ba309f13e39ed71af72059c4ae1e36e84f548a4473855fcb0b6ece40a4fa6704eab4d42d6b81b8d79e8fddbf24898f0e4d0d4372de5f7d73125ff005deb8e659795be2f91c2c841407faae16c4b5e57cafdbfae7b634e96f5ebf013906ec454c700b13a07d050378384a12f2160a00dd7da8f6ca826c6c66f7784a07a5fd4d84d6aead4a1775fdac3b65527ba3f1a7d7bd5b8044cb6fce01e67013954253c6aab32bf91e70e539581835b6d8f2d0a41279dce07d18a4d7e73291a40b65567865106a3f4512bb8023d5a185328c10bd37b8135e9cf1754ec0e3c14492976e2b5ef453c7e785619ab57c9009b0f71abbee83e842cade49fd3602ea3c525e03a63d67ced82a4f3d4fb714ec887bbd5565dee143d32e6889aaef95f3d572457db2a971c3bb39fab967d1a69c4bba652885b0da0c5af1169b1e93a7c4541ad144174a1b1ab93a0e3ba9aa39889a9678fde10c762b1f3a71e821cb3d4504748cc09dc96cbb1856112ddeebd598bd377d3b4398be886a3200d87b3f615e2ca5fd590bce6d8e20b48df6ce3b82b4fbc4fc4971ffb90b83004bd4f3961af713d8ac782b00247c1b7d09fe414349c49d667e9133e76f9db1ceda42527871f802332283c3089b6b4fd80eadffab31b0eb448a7a53f9e9243ec1368b608f6c4941dee6e49c8dda4405ee236bcf1a43602d87a86c97dc2e897003e618e58016d2180280017e38e7f085e6d0a07b3886bcab5660cfc93846b590bc7250a9f6747ccfc7794431b1cc5617e99db4c9ae02adadda3b0cafb73a8fe513639a7397902dad5458147c9f915d031f130f8224bf197a3ac08912ff11feb9313f600d0b71cefbd2a5d828ab3cef90afb9196e41c6ea5b9f78afb9b8d3ec523e91093dfb1f480268e9fafd7cd7f308c2173b54ae1e069831e9e66e8b8940f961defdcc0fa381073faae1c3bb6950b17fb6dbfd13cf5779179d97f71f3ae2f6c2b0a382ee0463557e73f5420ffbf0d40f1d633216e2c3457a1c281d1eeeb9918a8e6526414ad5334ec99e422194bab899d439b9625e344681ec03a82dadaf12e101aa82af7dbee8d736448a983c96a74664c75a9d4b91c255978e60f680abc0ee90db5ce1a608bd40414fe31dfb6ce73e5473df70b1c2021da5330d216e96e5dac35e7d7ecd9afab273271558da24c1a82ca70e8299ae4e029c5976568056c7cc229cad2ff85ce7545234e8f0e0a77dac75cab17c0a3fee2c0667643cbdd4aeed36fdb39c3136cb4f68df248e16db6374b6448e050d5c29c26ac79f7b2df8e46586ea596c7f10f0ca3d8e90d982a9bb25777c6ec6a9ed48ed51e0efbcd8abb05b9ac96548ebd29cee57aaf57a2ef9ccea41dc1866e6db93d4421a1ca7c7d359f7fb03a0d77b6418e3409c1b1822b4dfe99acb568ecc0c52a0c5ddede3015928633001d2c239aeacd080cbca5c65c03c4a0db1eee66469cd7862912b198e2665c4c12ac3b02d999fdd9d9ecaedfe072b361ff7a915b5da4c85a29e9ef07721584537e53a4a5e0b3b34217fe275f870f4d55a034fc4c74816ee0c6d0e11c331480b199c0138d4edc6fa94d5dc9958e2de4e453ea89aa39974dc296443237a407f41efb6de219728895a7c077e03284732ca68107b4050b7ae777fec04cfa535430d429b9aadb0a2cc7a637f915b708639704ce2925dd6880ce6986e1bbd4af7dd9798b2fd852645d782d0a4dc4836873869781ab39a3ef6d552fc504e94747095087c65ce5101f8f19b4cde297384327adc7422a79f8fe853e231fc66fc2887b288731bd7b849a263ed5e953e84616f46f2c9603613d145ccbfc1d82b9f70247e3e073dde63072d769f8e31e422d626e3d2fe3e279f0df78910344e6422532f3f53bf31acfa43806fd9641ae3f5e93f9aa69b2244ea4ae5d2fe10c4db30da913eef23600924038399c569b903a6a4a2b3932976539d90f7efb1dfa4566f0b30c338bc32bc89511e3b8824740cdd0f3776c32fa11d5fe715275028559e87f0f5155911108fd234399c4d1db4c54131e72a5e350b6ad95827c304743f7b2191c87e78ab6048a7b5bc053adde2f77b1298198bc31c02b2ea150bf44acab4e5f49244be108bb0afda8fbe77eb646a33ba338973623cac93a6c74749325e137a2339b052cafa8f93ad9b0f2dcfa4e61032a1c33e99d332249226bf2ab4635e8926a70a5c6114adfb36c64084120833ba81c80f13f1495a0cb918bbc059415eb903c29a065b40d18d7cf998a33bfa18daaf92b41af106edf420868232a860dbb3c474a77642e8c5f4871d60b3d2e15f18c5e6fc7d2172b283d1595da92a299d1e71a47bd49d734fd65f18e1db6025ce1bcaab2d6109f67362d377944d65026ba3103a5c49f54938dc0dd460446c2d2e8cc6cb90f032f8f6382eca6f45e3540eeaab1d93fdd1d247ad983728157e634612c12d6d5223e204aeea3935ba2c884f9a49376817b97546f2082b80771e2ee056c4b90caf641a656c10ab30d3c604f45bf36f22bf359dfb526597af92d5f6c2ffd657b42e7e0ae119a80aa6b93b32c5d7b0ad0b1fceaf3076b862fe8d2a24b5b600efaff7f818405db83de09313798cb388d9695c0b14ab050976b591a61e8123496943335aae49e24a2c268ad4400f9a83dc85a1753435a85eba1cc5cf4deeedb9adb90a2d33c54d65bfc0c608f11732aa9ca71492779507c1167a523019c4bd58a459a3f70f7d4912def56e36f36c23040217dded4695c93972195f4eebca3a2f346a2743a9367c58710eabe7aed61699f61c250b07fb96ceb63f15b329c90d454636bd966bbb8e3f6053a4a28a1db37261ff147624901889cb359ce63d8adda2c3038e7abcd328cf930c82efef08a1962909d1b5031cf47197431b6f8dd2534f911ac2760445f211f2816c564561890d387f85500e67d58f03b0bad7836c17539ac38013acda930c66fa8b60f4ee12e074ac57cfab3861e9f7c6a3a4851fd0b6c445f0d71a5ab4c8d5be06946478e516c7d770bb4458408a5ccbfb61fdb22681f9ea3b4cb78dfc4e2916067bfdc6a9b71847f79c40901b771808ed9352eec3bb20f889faeb3a14a5484ab39b28a207cc4e4515f807a69ab915c59ec4ec9b4c6c21b801681f2ba3d51ca2347f4bd2a75c5319f25901626459394a397b33816c9ce472cc1eb92652e78b65b2acd01f306f0e0bb546968e225f6edee4418f67c954506e11a423f4c9e27fdd54ac1d514b0d676387482ef07bd19bcac79d68160b9b4ff3f983c35dafcedf5043059c309f3f46688fe6315218b9a8570c172657db7ac94aac420328acb49307a642b383d50c9363f6a8077aa01e7ccad83731f0e1f8a4bc51694a1f6a9b824aa6e8cc14947d369ce3161830bc09016e5686f1a9c41dc98f1180ff088e8b96616b814ea98599185b7fb9cc3e14811e8aab8bcf4c2cf1200b13108cacc38cb6931c95a10b4f681fe8f1188c6b4f8ebb6502ce319fc37d917a80a058d3afa7ca29e2aa2d029bf2348a62bbbe7e1638c14881d8806c2ec805227fb9cb44fae3bb6be44a59561140408bfa2bcc401088167b5030257918da624d39e24dc94d496fa14bfc8fce58592931e0ef1c79e685a346985e868e27bc9241d5a3462850dfcf133e4937331945d9c53d8f18f03f3850f181eb0d7503757b467c841e2aaaafc309e6b7b74dfb0d368e3894266fc4a706c3325e21f5550d07a6560e3d9703c134ca6ad078e4a7b82ad6fa85b0bc1ddcab05d43f29d5c58d1da78ac80c37051b089ff31ce2c0c44e9ce3abea1da0f1df28008e178fdefafca493413bf1d256c729d0a9225ea8fbd873ff714cd5e3e8b666f9896dbad89d6286b0a2ed552f9ecd7da5b36a5266f45c99707731404dab6b4c3becc9128b55c8aa47d668a1178633ee653a7c27c056e5f57ee324c6a6e206c10de0b3ffbecb35f89f04343b52b503635a65e1467fca786f73deaacfb5358dafb68db4e93ba7b1580255d78da8d545c3ca5d20156bf71fef958f4dc3434a0afd7f1a5338c89044b2b6f1dbfde18bfff8fe49c1fe4b86e15d2e1f940a18cc8493b0b019542e2ef7ee04ffc8f5c4813be93e524c68e81ec7a184b5070cfc61045991768da6342ad1f434a724dc1a5f007ed2a04abb0b68d7a4df7a2f31b7b1913769953794a42cdaac8e13791aabcc579f015a435e7a0b1b4c899693e21065331582349f8745db1bff5a684e173f71463414a9bdbbfeb09b82c930bc85d125f2db227c4ee8dee09bd3dfd12c3a9ef6d82553b442395eff5e2fe6703084c098d7719295cb1d38e2631266749aed8f02125a06a45940649f6c39297f7945a667e9bf1aa69e901b8a79a237792098dc3dfebc75a08b38d639cd8ada851f324a3a31ad01d750a74e80e76d9a0946a14b51a331e8d15e897d748a0841a9a8b176b7b524915268cc9b6bb559d74c9571a5e309a2a65e5c9c21f9a99da5149e2cf0897f0a103c6e66c8f4e95035699470b19e39f8f8700dd78a6f353050ee880a81569749c7c0eadd9ec28d39fd88cc0639273a19262ff8a37f7f33a8885eefb3f1c703c7fe036598e57ea8fb78d3c39c032914ef78c2a569c9d1adef968c5a8f0883cd6efd30670165cf4380eb700398d94ad06135529c8f300caaecc2a151068e33fd240b6d767fe55e65afa187146481327556a706667f7cd9338753c55c804a7e99d371e21c7a2fd21670e1417c66c38a0bb814078a9f75df4fa8931f0465050dab6278b9e05a09d45eabf2c5c50869fa9b6ec57c9059e3c70637c8d8d01d87873ab965174a883c0c46481d3c76b139292b60028e01148d38601c3b17491098954fc08326e36a9021d530aace18c8fdc0c676136563373cdb663f3405f5a600dff15f190e3269ccbc1449e1a232b77b6671983f28412cb8581f89faca5e48860c287e6ef7c0eeba84097c09e14ce57cc436aecf00205ac95694e0d78d0c5cf4c4fc05cb08135f2022beb26cb2efbac7821ca00b148a29377dcb2e1176864c10b176dc7869b525c73d3bd1503ea19e26472b563b8d0601c976ce59f1af547ea3799debbd432ea9777e86c2feadedf95fbb6cb8a7921d4a48e9a54abf5dfe5c74c47a1be2be0452f78ca96ebe2658333b87e6af974c556c7d7d56eac3ab0c4c4d3b13522e01c1871111acbcd8d16cb48253a22152e239cf2ddbeb2045bf07b8f4857279ea35ecb28bb2959393d7b0e5fcc6a6f8217d4edc23ab6bd38cc17707324b9f795f810e3a2e196edd3860ac2c7089fc1a4c451ef92694dfede1dae2a1cf35a038d20eae87c2ee3f810f93e9f2a844ac711b61308ffd3e4e558c31d2ee93ea7fa08e0354010fd80e676099eea06a9ebce3d5fa0c077152c0f3d5f0ce5646134498da898910dc80e577739a439c7f3f365ac4373bc74a783eaf033c5f41af57f507fdc8d31cf38ecb998fbd7150afd021bd2e4144395057ce7160400b17975f9cd740e7bd8d1aa9c9b5fe2aff22c1f986f45c3fafc44a987b2132215d40c6d340efeb0fcccb1a79e5b3060a757c7f616ce6965a05cf02e24aa7c20ada24045aea3746678a3ebba7297bf0855cc5afb1db7d24baccc43ede45eb58210c2b199ca19798187e4ec4db9df504c23b651a90dca04d868f0ac73473d63c8e7abecc426df72b493064ffbc480a89ea9ac488a775375ae7d309658bdc4eb57aac43e6f4563f452329e632f332a0c924014ac19eb02b93042229df8b893c0c0d2b24305965572fcef03e262863a00a99f95f8c1c9562400603d2ffdd81898a6e7ec76f1aa12731710dd2a302e4f39570096bb2c92bc5a914ff6c8b29cc1b74c62d966ede13989234090c7129bc7fb2d2bad6fc4e7a3c16579d5f4c1673dc153cc1f7f44ec1909c406b535746f32ea8e793082f538ab0cef665130a4d7db3b4f9c154c812b5f895bdbb0e1e0192e7c1d61c69167f64071a1adff18d76f2879824b514b3d1f7b9c6d382a78e019f9143c8dd62787b0f2b42eb945f9c38db420ae6259f7d338db977a846856fef251677e45f591cee93028e900bc6013b3fcb52679a5deee281e2f06792108972295da55329b7cb81f9764532cc8f8228260ab8ce9cb6cd83db1b7836ebb0a433b54e153cc3e54ddc486eb1f86020e8a798e78444b112e4c1a14b583ddbcd87d9d0d10ec8b6496aa688d1180b4ee3fa5f9e4afdf063d9f941dd5cd9a6e9cffb0d83ceda1f894dea88c189c3921e3e82f93f1b6cfb3973d5ae963541969e1ec877d52dbf68c4589429fc7dfab6599b461c8442198c MD = 08b3276cdb68adb64cfdfb6d54002354108ff18c3f901c1fedc48b5a44c81bbce19e2a231a319191fb5b9652bc43c20d80ef6d438f7227e72ed57c7fbd9c79d1 Len = 41416 Msg = 0a268b623e349fa821ad14e9bdfdf61217aaff016c8a024fba348a6d82b4bef3cc8387346db6f5168575df214bafcad50d0c0c41722332d103ee9e68e97a75aef8e3b8aced80b096f45b90e76ee456b3f0e6f2398fb9aab95bbabd8529f84659963064ef48fc98cf77476e65ac046055c91ff7134ab433aeca802decc995fb9cac51d4280590746a1521c2c09077b1639fa164f42b7d9558592837c651b85a1e442e507dada60e0ed7d1d4239fa511847b538106bb7a98600f9a233b4acb2d8865af1f16c7a52c64c33fecb463f74760641d95718114036ef5be39723b353a8118bc8b1cdbf59713e454529b63d31da062e7ea5d06b3a029117cc194ac5e4ab2643ddab772fe17c43ff64d0127a259ec7d99c6f1d0c0353a6dbd02c825ae24c3511a550e1327741fde0e270e38cdc4ebbe1c725569a18b48116745372f8d925be73b444a46da75cbc88526e91dba26462c5636b259c06afc0364d20851635a222f88ef92937fe371054193bb5ed347a5d030593026849afe4d9af164149845c230ea9d0f837c86b89e2cb6ab847feeaeb09225f65a54e2f5f7f3ea73ff941be0f24798e99d3a26499a2dd6e21625e50cd665e02d7c9a0b8a0756045c9abfa4277e89264769218bcb012b3c879c2ff2654a8fd3fc15bdde6487aa88486d82a73cdb969051709a7ce7db1031c39e04de6212fa468cac25202c7ed9be5e0143eeca11581e31390bc34531c3fbbea50c70aa388c8004c93a9c89f5caeec7dd6b3f7729b5170c4ddd268c0a2ce29f38af72e6c42fcb8df5631924f36560aa896363eb2a97c50d32796e656f33308fe055aabdbcca6d4fb60b5ea480925c308e9222cf1ce56e597245637767c02bb52466e2d82a45af71979734b2a4392981735f43cb08875b1b95abcc6bfabb1d3a8c4ae0de1588d91c1d7063f6684210c4c0349086f564d479211272e8300c4c45a0696d78867a3377d2feb317d3955922fe78cfa9eb66209ba0e21e97129b01ffe92c504e840505ab3da9ecbeee1b4cc2b492c9dbf27489aa9982961fa750838feef95307171096dfe6dad592c0ba30cd6aec46c5137655ce955ca22af8141c1e37393c4b47842f3c56f7373c515b4f6aa8ed0e0f5555cd2e1bd70c5d0bcd12d44d55d4c41d4718ea146ada63a9e7efc2f7fde860c1f739f3b35b9b62ea65aed8b7b3e318a0429910a89986b0d14459fcde849d605d45e144e55016e19dc23853fdbd31efd95dfad69bee03cad05cd541e6eaf6b833270c4a3a1f46812acef86ca8da85f2ce81826574cf185bae15aab99598b8104b86042d392ef3eb9b6f354c3f71a8c889947ae5bba68f087359228b76f4ae0fab480f146be6e4c7f88f391a4aec631a127f2a7ef9da2e7b280f83e00e679f5e5d57762756afe3bc47154aff52b27c906f2bda56b4d3be5cd51f16dfe75a52a56999819084f2b67292e9b123de2bbbd1aa7fd29877f90652807023b18833908bd5f877747d152692e0f3b6ad76bfea86cb62596ac7b4d00633ecf27d795c21b8ab5ba2fec782fbc43a1ba0c6a2d6cf56d8beb9f42e6ce220f57aca6c433bcdd5f3a94853ec9ffdafa749b995ebd834eadb7a385f33890547cf02f5a66d3a5c8ab3ccb29e74d6f4fc2f654743d82ddfe9db7e1fd35f730123c76db9527fbf957ef5ab2805e58ea752da5793f7f23d98fce1b2b67738929e5de8a15f980134415ac02ef1b0c92edf5ab107e5dabf7129cbf4fe4474484fa49d37872ea17c0028c51d3d57c8a72064bcbb5d8514c92f59fd1c4a13f21710da8abe077095788b126812c0a07508cbfe1f0042bacc98e0ef3b617e69182b3e09cd840a6b9c7b3dc7eaaa9f15de7397752b899ccd2ab2edb42ccc828f0e0e42f90e917669dc0f7e0ef5eac2fe2c70ec90895d550657a1bc7079643ecdfd488272f4ee35b080bbb6b12edc12a386873218e18453ad7bedb7eac9329a6a0d5f683c27a22d88ae084d763f87754b1541d1d6da07800abd1c45ecc53c7fb065dd5b1e50b5483b8e7cab26d0f3d4400125318f1dedc26546b8cd3c158cd3e52e4ac2e217306c104aa13889882918c871bcbb0e523e03053e49b9a3602a80528f2c074e231a834e07ff5d661030272c8d8cd51a20032a33cc5570e94e1c6c3fb10d912b1d7b743ef01c80860f10ebb47f1fe87a2f431f3718665ad6886c81f3bb74c840ac5b27282a820bb22ed24ba76cfd5df72806ca594b03df32b622a5b8d6ea145779c38454e0b964b0157d2e4f7fac9a59b35413e18db567c48044c2d42af6dd362bba73093847f5486b197ef2ddb609687736e21605025a558cdcbf90de208ba66b49dc905ab62444d9af22d9b1a311eb1db31f41dc7520ad85f184341bf0866fe177a7316f8e5b6b0645024c21f919ac4cd4b2aa39932194118cf90808ef3759344cbc349f5501849be6069255428b71ada0839945e6c6d2d8b40654cea4042c0dd003e111957d583f9716f57605ce03e81f7a5628f5752e8371935f949756af130c6580eed539af9b621abbaccb4a2aa459802809489772bacb8872835196abef07c8585d9e9c50564efa2d1e1b67ad89577b591068956424cbcdd5c3592ae948c916b287770e0519639e93f57d8d564020552f67dcd5cd6a784ad07b377c2ec75b35d694e8f7948caaee35587924eb71bcf4f3332cc17434dbe8abd374f24514c40f0cab79c0c6562ad35a70989435c43442ec9fe1c02329fa8dadf497f6f5d60c8a9cf4b3cf6320ec334c656145fcdf8f2564d08239a0f1df221f0628ef05b53c90cd981d8d3391f6f8515e5da0086dd587a1f19796b43592904930b0453e5b5b08e9bf4062fd525208b283120b20140e4fec28a83e279d19bd739bb65f686d71d93690a2b78b0a084db7fd0aef0e7c43658d9d3e99c1d07e93e56fc2a74b9687edfd34cdf2a3621eada7f4cdb5984e7cb1cc7ae00f4a77c9f9e6d35c84ae7ca32b85d3497d0e029e12cc8fe1c38732bf1af1e41708893900d6c0ef0d5e5ac7d07b18939cbe94918f636cf7d083a2cf168b43056aec47bf2d14b9ec5c9e182013c5fc9f501ffcb8fa88d054225bb3ce88e90b0561234cb0579a1af2d2aaae2f76f17a1ded06101ee66840cd5db580d61d1d920c841560b587502b28f5ebe49b00e8da36f9dd966c5bed038a0bf8d390de0f1d415c2b4b76c41e33b750c9840cb9906411fe0b574962fe63b4b38c72a4d2a7f7cc70cbd49a16ec7cc768ad542caad260d783f81b5e0183a673ded925b902ce67d6485ec5ca85a24c7fc7fd1ea0da9715af110caa52426515ee1347b677746ab4876d4de4ad1a28ec07f423a81351c5ccc22fafcbce2d8af84eda3eeb883264270666fffaecdc66a4887785bb2b1845cd376549487ac9db97babb268e9144a5087cbbdbce2ed445bb2ad98d1e90360060373b42e7fd1e40395b3f67653db0149f10f54b2a1c08ab7b14a1a19bebb3ddcdea3a02710034a22859ed693931809833eb9bb5d45d82812a6f572bf8e498c35b77e9f1ad2a14e7aadb4e94d118bc1b0d343583959a4ab011628392fe22ec9c5307d0786524c5f90809e851f7986a8476144c1c357b661f7816ae3e754eb74ffdc178fd5f954fbe8a0c4606715994bbb4b367e87ca7e0b5a6b25f97250f02c4a1ce68ea6426bb20770ced1d080441a70f380e4f32c7c05ce55f1f05d50ed4e3875528a53c7f1006193067fc84417a32d1cbc9b91e820cfb7b4575f04ff33594f77f4198af475657b6a13a0dadb746434096218e0981ce79b18be9c059652dbf38743a29852695fd9787f1b64b0fadc3a6be9d36bb6c0dc0cf5a03ddbc0cc54c935b9bc285c6d6df0409116125f1b798496ec61afcead2b71dd94caf40910423505cedca79cc20e5444f247504036dab72cc22a094a32446e3314b9fac9cf32cb7a1b7a927e37cf7a182b25ab0f0d6e468003b314a400b5568898813cad498500f4f81c657b1f1fd61ca4177f15efa2b75339936e7698fccf50a8c7460e2fd75a291d48bd3de87dfcd4e5b368ff6e269df8dc21534c5b993d2dbde2b376d2a84b68d365f621346852d3787fe515f9584ef354038f6fd90934726079e171e2566946b32aacbf837d8c9ac4e3800411b66ed549b05f8b81cb29c108d37c79df80184544dd5d73461bee8d6364a64467df5211159e6019f66d918c3fa5d1191ab3fcd7011464e70cd20d4ddc99d4514c21bd2950442d85a75f10467d577bba34407b9e60566f85381e7d3e88f996b53f2bf4a072380469052e0a823a7ef8e7acd408edfb19d9c8687f92e1f0fa69eac16c9cf903f0a13e903904c20f72c52bf4dd495829e5404b0e7402dabd12da5c63520aa58df47070f92e738864d96cf19cdaa16f853f1f67aa7a317b45d94494b57ae23868b9fe9a706cfb37c3195cc3154aa596858de3b8bd10936613c4552e0845a8143cc7a835c682f072a2c9113aeeabca5fb36819b8d6c5cd0dbf5a6882fc50c0eb628409bd3bfee7ab9c5f26a3997c844d87444dd2581832e4a1021b2e021ac10082959fab713f6555185209a7a64b67c299a8ecbfd176698d5151d9a9ba123d060572e68ae6d2ee019f3846b18586e961331c62bbd36ed55a48d0206074c5796e73925ad60d47e623a9784a4bc7cd9d9c0c056c60de600afe00037bfcc2a31aac457a7907750ce25dcf9890f0dd6dd8f58cfa564933087ecb1f4268d9343995320391dda98e9066f25a2fc72b47163fe02e61bcdfa1b6a553ef3363704a078da2368ed536da80f894019439658525470e78e20c8e8b09132b084cf87c648b487f46b81c39e94cfbb53e6c843a283962b2f4e1c1e06f6e4cb2e305943824337a2bcca3ff2d3b52f4c8792f140390b137801af7797fbf54c67e17d3c34df9ae773a20e91a8b314178603a42857c7f2b19e853899fb6fb5af50f1f5e1228654ae42cfbedeace6b870aff0a4d44ef1405ae7e571eb120c3ff7cc8520aed51e7973566b628dc715aa2010751a5cee61fef59946e2d3a4779a0a24c5850c1450121ef89d8208c1e8f011f1bb8f2affbf346afdd314ba785bced2a0daac64a8c42596708da7b6620694299ae98ba549b2e8a15bb18e09575ee43587ec1d1c5a21bdc5066458ff71189d525228943593e32481fb0bd8260928e31d2322619ef00fdf92024a1e4bb8c5147362a03442a7faeff424077b7b5662d371baa5ff50323895e5ab668002fdb600741278f2344b9e52e21fcdfe6e06b4bc19959d7f9cea41e6a64ae1068c0992693caad95674487753313586e969e0c5a7fcfc316ae9ded5dbbd27e23852a40258b572eae968662efdcaab5ac5d3ad3e9b043689469ed79a7a138a929fba95aed3c6b2d432796c6b5595cc70181435c6a1188dce9e259d38cd8ebb19c22da63de557b1beba0f24d5657adff16d944006c0204728f7e5f858dc17019e29149d589351b8d10793541534622b0449ba96a60005adbedb46b0a2ad97a6495dd543a6e79a0f34a36bc5d3ca33f9d236f0fe4d69ad07b9d1b08cbd4bf4f043e5da60d0e81bfe1016013fb630d79183bb9e42a304019d40628b5652bb1828b44989bc7d9ebccd8de6bc8a666d343b3e612a2852d8e9b67c143fd40806e995c4124c1e561266c3d29d036d8c89343f2baefd79ffed4e9c957234cf8835518199c78a50024bff2908c240b1d08dbee4732c7ffc544c1695b201d30e795037325ef0aa182a51704756deda1ed980b9743e63187bf9fc2beafb4b825b845d82f13916163f762da265e578397c506a0f35b3da31bc960573e399d7aa7c51661c0652c0358d8de67ccbdd18c593dc53a770fb193089d270d8c7b42db43a8772ecb9d2766fc91884e5c16547e62b2644696c3da87fa8554441e073d6065dce8ada52e1c02cbdbe10c78ea58b040bd5443d73a21084e1c8899574ff590aadd0b5ce18a627d42f2891097bc66f87fc925c0bcb52d8a9fed348becc803e27f232fbb0544a32cfe8fe0f93d0f078d7c60593bbbd748855c51d88a3301d0ec4f39f64684ff46a86b0e7934dd54a305c31d5f1359131a8ef004f512ce7fe504b79bdf9df4ecd555f4e8b231fd1fd1e7e05ab7e618fb0c1e17510ab413b4c8c234c34c1fb9cfd7dc38c93caf10e30caa6092e4328ff1a5a92ed099fca722f4ab434adc4a580ab6a1b30a78dabd20cbd3a060747702896fc6a2fe234afd5ce1366f9d00bc64100a2cd036e763566b97ea4c4dd9223534d2ed1054273d8ac526ea162449d442823af43cd918c77125e954a0b592d27c866782f35d1622e3fe2e4cd38b283097d3c19e356b7d7591d248b96a3231f66cf0a62ec88380c97d5a7fc5243c1c3fb88756617658960c4d132e7ee53e270c6b0617570c61f76fcb8c93e984b1a670490f42046c4af2e9e74b131bce43e2931b2923824b72daa462e6f32081864760bdfe1ced739d049d14fc8f2671fe1518e1ec6346e220baf5b80c161087148f9f7bb65f9348d94ba43aaa0b057c970f0c53c24efb7d1618d25f6e85201206ef7b26da828c488a588decd60f6f4ad960fbd54d5f3688ad64c8bd70c8d5ceb7d78233cd1e3eff1a8bb88ff3149a692f9b460ae00c8e71612f5746d549b7f9b1e85327208b31d92485c2b893b33d53f41ea9592cef49e3dbe90cafee903d4f8f824c756771eb6312b72aeb3a53be97d17b644476701f3c6822374d3f34dc1c9b460ca2f43ae2297f905f9c598ea4a1423225516f277507b05b85a349902b0d8f93e234697ebca8c5b1ef4073bc660cc0c35b14797dc1c22f056646803a908eb70c8bbe3995c14d7f8c387c1b759946d7af73e2280babf84ea067ab95aca31cbc005784d718969427aff9a3a332b4cbe1771e5eed298a1699ccf846dc6ed934092fd43ce48fa329386d715bbd8c2f18888aa8ff5b8ff2a99adb96acd6e9b96118eb905ac4638d593c755e08ccda8ec9378aa227d5876c2dbc6cc14217b5ba2085b40a43092cabc0ae280e3f53b65a3a78d7a88cfda85d1f88f116ab114b61feba29a0aa255384dc08260073e4a7f808c6f21a73367b4bfb9af8f55c4623375830ad01d4ab60bf27c4dfe32ae2180ea09c7a769f0278cf4e3cf4ebba48d5a0c983ce9c76fdeca1208eb614d8ee9f049e83d15b4504194d84196578697bcb34cf2dfedee5bf4fd142a05914126c95504ef78727299dd54d39aadb19ce617c79e589ce57c54212c62ab4397f4beea3985e721c68a1425554eb5bb64e7d9c71d68931bd858a38de063524c7a509e74233397df1ae4093f1eaf5b69794db7f43d136c03ce6a905fa07fe9c9423c0e8e9c76c95b75 MD = e0c80702526891b3335d5a0b3180d47025a76469a296e823fa7d7228b9872897799dbc0a1252c7b7e89043eff1bf3092ffe7b67870327324cf95742fdf0e4122 Len = 42208 Msg = 50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c923d3f9977eb1d2ed136d6df7afb391e60a6861e8ee3d99579b8515306b4493c8b288b9bae8fc5a240abaf5133d617e3bb56761ecd5b1c54197610d9b2ff0a54deb7cfb995e63cbdcbd10a0058915984b6e7a67206c559e60349b2ecfd53627c29758c61c270eaf7cf51877b5dbf8657fff497a6cfa52ae1d3adb7db5a43fa28e7ec3232b8d268d6e7a7a810b7b326f3d2f7ba2b8c9d07dde70c80435e6339e19686618aed6d3ee1914ddc6f0b0ea3eeec5b9e7ec1ff6910c9f0bca38e13aa1cb1de8b08d4b3c59e58be94f4ac34858fb8aaa52f045ec74108f4cd7a4df7a350c64f3f0b0348a563aa6472303fc7547ca46f7eaac83dbae5008323463261ee144072ce200d9e46d802e9f4a01a39993c5c047b80820ebc536d265e85bfe4c2edbcc3d8d638173271fec98cd2e00dbc253c243c2ed66434329b48efb76b12ca2397ccef9c2765f0b7fa5dbb3705b645edb129312419b0cb0907855769a86e8c7c6df862f06fecfa209241004b1fb5cefc779deb0ee086d92d5e46160b1c4a525ebbc0e361562eb722330dec9d829eafb7ebfcca2daf58f735fc15bc1a2b48e420edc0d16d9eadd053690ed09cd2d360c68ac06f2efa999da96d6eaa1559ec8a899082cd839ddcae3ab0de6cc784f69a9ed0834a8136eb450e2edb709b2ca7edff20613831c85dd92e86f711ac1d7ab5b759afeca308a085cabcc6900a17fd66d839e691f6c283b9c577e35fc900c23a8682b0a622d46bc86593ca98f0a06f8dcb29ad7b5100f0f895f01db79cd37fa1b2e830377f2eaf95654051fbdd5a70db4e9c1044bf0827fdf67c20a9a60a057392f6a8f1267bee65505ef7292eaaa3d7b8fda99ecf4c8b328d9876b66318f638cd4a8563a740aac0ad2c24b163157afbb0bae3d9d042bd4eb1c19a6e5284c469b830401f7011572fd2445515293f68cfbc705996808f10ab19840621f2e1e27eea5483851f62861b764412d4df6cefbc42aa65454e8637c01b5c3471d294f2e0ea33aa2513b8ba1bff87f860f4428259d9c5b17698cc95363db6cfee603258582e3a3e8feb886599d4ac405a1634c320e85ea8ab0dc6bb65f72012f82a2e951d2cf4ab2615661b1dac0db520a3d82499f4e1c5430c190ce7ee24b82faf0e2bd87cef9a780fb63d2fdc48b1452b81292d95db91ef22182c34793129d55d35aee2847766f6590d5e48ebd9bf382be4336431b898ffce687bc43ee1e2b9b35970f3da48ab318feff0e1613d499a1365f5d66f0535058f6e8e1f85936d2d4fde2464e4cfd1b9f2b29791c2dfeabb707ac2ec845e1080e3bed5bf03d243a091383bbe4a7974e04019b4d2875e1d4cd1b73d2f380f960249bdd52b303ae0c425fc298861d20f54f679cb1c25244bae959fb716f0b6400a40002edc7119df085c8e702bd165fb7864476cd732cf00516a98e31c24cea8f9551a255b6d1b88ddc39392310fa1d3db3826fcac26cae5e59f3723d76ad52b6007606b208a9c98c4e9701230731222edd08d0d03878446dbc1ff0bb1394661cec56762b43039694e3cb882a2a2336330dbee1065bb97ad9461650d41f6bec6a61db39e8f146e94ea4bd135f023921f44a8ce995b6971a4affbedaaf2499ad4768ec991299da88629855edea16d9aa189c5a32a5ce7bea6af000d675a986715c0771dcd1c4273b77c87c5df4ee6c9b480b10025d2dcbb4de20c58b4d379a005048534b4cf995cc353a18aaa5135bba2ba096a2e55af13e5197f34260553d21cc33782eacc08c0146f8121d240c0dd06a62d45a66dd5351695e7343d58bd79e78cfc9cd18a174a44f0a53fe9a61e9a4ac5ab371083f5bb4ce7c2ed6d561d03dfb242e6fb925b57bfb76c2952e9b59009a8e1931f2076f3129f90b43886090c7fe3a905eb7d3b74fef4646290941c3aadb08efe04dbdf98e22def1d1150f7f03281ad5e03934e2e7d682c90352db916b18d01ec740e960946032cac9a5f606bb22cbe73e67ce9f0d5630326c32f22a0bf9ec8d2ef4140c0b8cfd7d735f9e8bb59355acc06a2c5487175a69aad10df6522566235c90c565bb4d48f2176c8e78ba24c10ead6ad36b1ec207550556b45d084546ca9b3d85d36b4c1a11fdf34e33927d16f44f8e4d4a9aff40e0c7e96fc7f40092693123dbbee5317bc26d1d672605455c45ecff205bc3750cf136b4c79cdfff54e767694f8eefa373edae1260b7db249bebcde5d70461cd73719cdc434491ea932e853869ab524a0b7a09f9c150dbc4dccd3a67f7af3baf7d463f8c6c28d2685825d3b7b27dd6cf4a51c6fa1358cfca26d37aad0ac31ac1335968eac8ae6a21aab4990fb16d42da395a2d3fdd377de182e5d7e098a8c6ae9c925e1ee13f20be91c31e67eee16012de7e85eda754adaff7eb972827c5071cc0d96b513f44bde7153aabe8f242f62043a3182ffa1929dc8dcd03ac4184a5b4a817d5ab68230a433f0188b944f9cdab70b22c2b5cedb8114c7363956d4c671d5b32e553e646cc7b1601fd046d6cad5c6b940a09583821f63dc6ff0a348616ffe114e3724113ce36a22052eef3055ddb3e2ffaf273632d3267ac1e341c987a0443a3172ffff4d71dec47cea1602ba7cff16d430e37d4a46ed30e0a3bafeb5bd288c9c8b3aa50aed8fb5fba453b4551e18a352f842bf44e5187d5094675e78111b86d4025c98e1c0ed84e5e010dbd24b8136e047dd72bf2848de7647df5f4b46adc77c5aee518e96789fe02fe5dfae8fd93020b20c4e25aaeed2e6309b77bbb MD = 8ecdb553cfbe2451feb4b6440056099dd6511faef2ac7ba92b646c061be2857c5bd09710aa56658d4e3f566850b680b23f2e01344902fe0c83e8d3c8714c8fac Len = 43000 Msg = 5e7d99cebeb23c5cf1c7340b5b5e2c2d1af148a597125a485bf7588a25350e5639cc103dfa64f3d3bbd6bc56d3ee9991ef70cf00ad58f43566665e7a4adadbb8b37da298b3e08ae7efe87a3fb18a21e438d4e7ec532d23a32edd8e2d6bd0f86d7496392610af6b603506560e1ebb2ced9c2577afb1184f595b63d0eaae9dcb3d2522bc303a58fc063437380a41082275c46c6692f0a1e02096010cf83bcbbef06e2613fe5963a7a19583087c43f96b4458b19edd38503ec087be2aa03be2374df6ac26d89459d3f8fff2aeac4b166f22fffa06d8b0aed101d5a2122ad668a01d66bbdd0613c1e7d41b8d13e282e897d7615186cb814202ab28b5adde33e76028655c20cfff234dfd915b1d660ff6492a27bd06fdd29437852a00e1037be6df369c96d77d80076c3b0864b57f1bc8eee5f9476eb7cc2dd958818a97e3d5ee850fb371ea56bdf6ac5629b1c477cee7efce7ef5a641979451ecd55bb8c46a86ba7a51f541a3df7875159b4930944fdab2ae5fd197e35a510609cf7c2aef6236e6411e2bc4ab0d132f410635e31fc729a14c44e327e53eed5f7716f4d7ace486712ac41a5cb8705142a2147bc35f5d5d2372d3323f8e6aefc6fd53cba54318ffc3fee8caef1030b917006b25ba9e3afd9fe6b7c6c82706dfa2652e0a7efb27284484354466fc74d31423b33aaf2285917f7196a7a8f83c465a754eb8491d39895d86508faac46428a2d395c3893567a22adb19dec94932ab58f65cddeef175ab74cae4b3a2b0293f2ad7b8c7321d08b708ece7711162109603afff8254bf0415f31a97b93508eba012f8c64e91228f58816ca96b6a8aff8fc36ae0ad65cf0e4f403c11a84d13d1d4c3fe64618e8e250dfd2206d1bb0b271f00eda7690868bae2c5f8fb88d11a0462a6b13c0611a7f15fe4d7a7adec2bafcd2201fbbb25d43055e818fd62a865acd222d8f64702b71cd59e533306e433bf22916e84ada55999301362be3dbc3cefad9e3d3a2c4904cdf8935e53e58d6b81a5b6fceb466e401dfcada0e721f4e7f87a84a6aebccfd72d4e2cc0af51ce1a1bdef773d88e69d1e3401e981f1638adedc13bdcfdff7a776461cf40ee528f89b555bd9af28e7e531484cd130f2570d8f70b2ba7cdfd332e99b9e5a8b8f0b8017893713ae24d9610d75124d85f5584ae3ddebccec7bfe342f4dcd7beb73432c88b1f791b4fd3974e552d8ab1b6af5d78e8c5561b924c70fc9e540b4b9025e32617813f05e2296b56b5a36764bc39e17d1f456154d6acc4a4bfa9eb16eeccb465444229c04356f870203824ba1afdf9070be845423de8c5827e61dee9772f8dcc39e9a113196228e3be76277b78038e5cd3356aad6d075ddd04064b8ad35857a21ffe0ec80d56e1f9b6e4d96f7d5186c5a1b4395d0e1173ff791f9cc2ab4ff8301d09d8a5c6390df8310aa25dd2f1cb8a9aee1819c90fee2e04353859a71a5abe5c936673ed1393295671eb0f1feb43f3e86a70aa4608b8b3cdcf87176ec36393042322f929ed5bd44ea01a4b0b45d848b3b0aad92c04b8d6fd75f1c4a952fdf93c42730123ce4d41401f99da3e0971d022492c6c230bd6debcb0de27ffcd0f362c77c15182be51b75577ce84613ff5d45ebc602bd526fa153106b609193e8193fd4a75b3efc54f80b52f23101ced4e9c8f91ade0e75c0cc18501e1329eac3b58d743f5ec12ec2fe287cffe48161d6370db517a5104b6f42bdf29c76a372024cde1ebaac7923ad926f4e0c9f2f8d61c986d833147d23a9a9b6805d1798ca1263a44c9fc0b18b8359323e9ebd76921615b6baf398af9f2e758481d6526443728e62766547f4b6c2c733c72ccbf12051a03fe5efae222e6c1aca6f9ed3a08ea131ab34818edd460a40c6903d4729a8a2fd64d16dc17f51d12ddaa22cf7e7fc3cd1e10f9b21b5a9c86a8d0256bb7abb8881d816247f0199fc0347e1f75b752c93f3a650188d18626bb8d995ff957ea980e1fc1c7a3373774b4f9477845b0280551b6dae604d900082a03ed3ae61b0131a72636cf58b2f6a5d77430b6a930aa7decd999328cfa6f4aba54f43d9ac8988b3c780701ce2aff3810ed5e6008fe803bf6ecc76c8afb7bf255c6d5f07e2956afb65e5de56d66f93846abfcfec9e3514759378f1d65a5cd0ae2a3b9dbf805e4a4fb2060049e308daa63f7301856a7c5a7fb0217cc85c00d994831c7877123e972f50637e5c74e63984e19223716128565c69587015214e3a871b9287b524c0e228a580b1152892209ef59fce271eb3989a03708453468f53e4482033f0148fbbba45d030ea5a972062efee3a2cffc89197332c21e9385ee63a9d6815ce8df57452a5e48662a76fd96f35201fe980b1b1f26ccdc17d734741f88fbca596dd9cbc904a301a047b868c1269b7e7e34e19aa2a14e7eb5683b2f7bc93a05befafdfe4d1a74574566365e8faf2282aa0c46acabcc00d282ae62c97e55db5a14f61499dc541972dceeb98509762f340b8602f9418f29fd051273e7311226f2e1c9e6437b9ad979ed47098536640abc280bdc2a6cd2122ac6fa34349ae963f5b0da3ba534d4fe9501d8ee071f5ffa4389049de7347d047f4ecf6f55c3c2d98b0693db660eeaceed9f0b30b3ca5048f1b7d70dd7a278452424faeaf5b486d1da6d5b8e2f12c492aa4f47963041203ded39eef4a3bdab1d42d0e16eba741b930d6c9a1ba8464a91f399f5e9278cb51f6097af1af38efed601dbeec24c0a6b674a8cb94b78b46515f1067bf13fb1f936715a84476d1b5ab788cc88b054815d95b9531ee64864fb64cb1d427621bad3cc4909d442bc6ea507002b16fe7aded864844b32b4bf5cf5c7aa66b24074ae2a270f2c06d4868fc90f90810275652bc61ed0fc5d7c86a63c86b66a3316e196e890ec4c84c57484ac176154b3ddbe700e09c8ed0808444ab7e916b02ec21079f44f08f0b5dd2d5738669b2f91fe2cb3986d91a6991ea24e4d38f3c1090aa85f36ac8aa001e35a1053466597049f58fe4c9456af7a8748bce8ba74232eb7525196ef9ae4d0a1a2b5e7fde716748ae95812c53d91110bdd9b6fb8c2600391b555fc5f62458addae50dbd44a33498588cad2476ed3c8710af4c97a0400f25f7a765045074a976025e81713b677eb59dd5a746312fd068376cee048638962eb48b97ae9b47c60f2b08683025268c3ce8f12e06151973207c9319b6a0785bbfbc82862938f614b5af73107e9479037ab47fafe89522ab6c6ad26e227177b6458a1caf18bc083c162a1f18b0fbc77b0baac19b7223e3df988c8b39dc9bcf4c7ca7ca70d18706a2bd057cef7bddaa397c16777f1763c596314c2e3b4961d774b1801c89f84c79cef6dc0d1333bc99e52891f1c95cb75055c3444bb10d7638c580cd7349015eca37701850127d1b0f04bda7d118c6a11c94caef64597d3b5bb566ca7f3c614080729544d67bcc7b71fe87b295dbc9b372d9b4b7f8832d43c8dad01180e2bc9424e6f2dc109d86408b59336ca080fa60fbab1d3888cca201f89c693d38ca67bc302b05688f164f1c83ab3d1081b6cd2c2f7f70eb85a4500873807ea7f751e73b2aa53954b2749b62234af158d9dba68786dd3c4b8f98dbc9c20d9cdc5d27dfa38cfc2b3b2b16dfb3c2df1cafe96e3b058a2aebc2f71889c85cba5054daaaa567df864786499ba083eace0b8060ecef28b20f1bfc6cb20e86bc1d15bbe058dcfa8ada1ab0ae71724513ae4a64b0e6376396f0295250e3ce77588c794c1eb0eafe277e1164ba16b999d5e655e759d8a8388154b06f342c3e2ccaaed7bfd65153c52dc8c7fd0d1a0ad49a0cba62dc42b63a39c32dad86f9f2197afadd71b7a8ac021660aaf417e9da97d887f471b8a2e5cb08c21d87e9eb7ecff1d6e6fc2335581769dc46e45b14ad5639fe709e6f77bb7d86b7fc98ad7f38b2c7e970c9b965ec87a08208384718f78206c6cb33613fbbc42c3b475a7203b45455992764dae8edc542f87b8a7c654dbdf77760fb5e794b2171b28a47b8377647337c6758180cb072d9a62d356b88147c6496ee3097a2fe37efc431eae078f2edd9f9bd1df16fe8f2dd2179d3850fe02fd69baf8dad4b595a0ed6daae9b46becac1979510e7710bd7b5e10def695b354ad5fc416d1fe0c11a4760e12d493f4e5072dc8bfb7abe7d940c6b35e37908987feb4f30495ff1e9fb31f8e1c16ab10631764f0e181bb6d2ba3936ae4a44766e217efae8ccfdfd186f57155915705a8ac0345597f15ae88facd4c9c3ae5c434ac21985f7427a70f1091f3cb3841a7a509f4596c631a8c2290e679b026a10fd92e43386d85445ebf83b02e58db7a9bedc212268f54395d223315a21071802e3fb0a6564087cf0cc92879a86540aae96a1f84362b191a2a702c825023e32c2b4c79717a40426fb9144715eb58307a9702687311a97b64faf4c3560a51434a0dead3cd2cd57ecd6e8a28ab7f9b7391af9fe4063d6f42c0d6963fb959025b85dd0004e2f567029133121264ea94d1993828dc6644e736d5c53eead2c49ef182a27555d75c5e97620e944f68b6ad12373b8598baae781e4ccfd40acad38dceec64330ed5ea2205e809f925de6a4dfd15bf9e602b0189c4ccfc40e8c80e38ba692c217703251b14cc2b27ddee8fdb5cdbcc5b7ce1c784eefe556accf5fe057ca10127d88a97b18bb67c07bec2acc1f5316aa4330387d06589e13afd792a5dde3eeb2d7891c84d344d0581127f496690bda261cfbacad5f117a999c57b1aa9a6e5f21ba0413f55d53acd7e1f50ef32f72a7b7a962d17fb594db36d6a23574f9d401fd998c284333725dce42f5b248df11efed7d185f6aa67d509a0359a68b98bf77950a83b1f4d22b43b9d88c873df45413260c7e9ef4ae157b3186e08d54d38b2086618d4990d5e92f18f72c06190bc3d1ffec2828b43907ab7bf5d9527756b18d5042fb778dab26506a4376b78081eb7cd97087751fd3ce71f7b4a67e598eed1e7133609471be7d683c21ef03fb0335a4514e2f1cae1ad46f3367ca9971d8786477975f58b3ac58c6fd36e773eeec2cb8e5e98187c55aa3e39d73c81c66effdffb2034a0ce9e1430d2be702afe2b95b5b05b7213f1c2fd77fb46d217f9f21d830deebb3597af9c69b56b6c2f06d072beb4f5b80bb1916c9a406b8694b811ab1b84cd51da6fd525e01fc2a9aede43228ea113b1274228c04f112e9f208b336f4e69a440b7dd78763c18ab71d00fee6dce7f9da6902ef1c03d757767e2fbc033c5c35acef669005826a80e0abc20381a26567adf6dfd52360d742e24038f20bd279ad944bc9bd59346d8d3bd9b9988f33d2f94a4e735b5e866163b1faad0bcd51df708ea34fc5fef43afe2d2950348bebc11d23d266081a0f16486a00044fa454fe1cf0783130734c6352391d1e5df444a051cf151051e245665f7ef2d7543d4646016e4d468332976737f4278c7b54d90125a0a91adf43c3c21775358eb0049057cc5ca4d844c97fc70dc2cb13132a1364074ce0ddf6bb24ba1ec16aa2c976dd93ec5ff16eebb46ff352498a5acbe07e3975386ee23eb4d2cec407e4ac2720889adfccb582ee7fe28c83dce7cbfc1483f20dd795b01dcd4870a59d46035f7e2bcd153783bcd37871f3311165df3a32cf3e2fbf17d02a6100304215f160b90c21bb3b24de65215a88b7e86b870cfcc7ba7e596347badb1c949e17e6992cea4714d5a02918245e82b14af86fbdfdba4fd0232948b7e8b65c601a95a38fc059ab8fbce298d362f17d663d0f829cf9f947aadd0df3eae222bd1d2659c157d39dc5dcd1811892b970c7220e8c3886aa402b950c75d9532fd69b0641c2c483df1d1286a3fa0cc88052ec6f300d161d87157839220f8d833a1882c60d6f21963b5e1e37b4bc0a07601e59c821f09fb418efca01be2964ed898f10d6e9bd5d0170d7454a745584b1d1499ba784d53a0cc8457d8941521404a690b1b3574c0b48382f24597345016a4c5b2e97b929796a1dad2f3a5c280f6b09c3d1e5e68980ecc9bc47cf3209049349d98f133f7bd26e918d4b8f5f09bb833b9f1dd908046261de150c16212ff2cf423b49a4a83ae98ccc7c4f02da75acefb498e2174c3b2449cdbffde8c1087070ddf6cac653f5034716e0c63f4efa57f2fd47cb2b239c4b0711139991a250f21a65929ee2f318c42019513d9f3d16415f8e02258f1ea65b1c50b67bcb45680c3e81a54294d634b09a3c4411ad2547fd67df7eadbd9df7b91c052ef0d01adc035fba953256add73d28084feed3881de0be7a03b02131fef96896d3b55aa31b8bf068e90aa2ca5ede5bf5cb21ccd5e6afb5d647d9647b2aa0949e4b15b56ea50a9315271803bc5a28a8ad5c56d3af609f008c919601ca193322740bbe9aee1713aa67c606e404579090675a0a9274ea4300f5975253bf391584c07c0c55a1d01bb8a94c43ee32b59a95dc7a9983b7024049b9cfab04cb08ec4dfc428b801a6e974082205b6cb812cb3b75049011f636fb4d41910c8f6e071bf09fc5a8a4b8512ad45af8b9fa14fd96f3b9ae8ad7b2f6f88e1582034e18c228ff239c003e2c163ae6cc2bdc00c9b4825122cef65f6dd0ac8ebe190bdb6bc887cc102c1eb6b62c3bea3e405e3b56f611d638ec4ef38732abb193dca2b1d768dd09fe0c50991711c27129ccace43d20c9e5749d113eafcb6aa94f33446bdc418d1b35a3426f9f5552fe372754a5fcd31f216e47d9bb47d96dd838b38d53fad12c926f8770a4ef6561f3bee6c1fb166b85fc7e72f4d3d00b29c0f8d3da24a3a61fe1f42f47d367d073f45991815e0a7892e93da51f32e8cf22f6082ab738771eeb9c7c11447599050d626fae1f495988ca7a1464a532e2a3edd9df2e9119e5ca14145fc3f2f613a192e099a30837740aa111ab38236e6e17ef0ef636144360362e0c27bdefff3804a8d14ff6b8b2fa7c9b625a76163fdb99aae7d5f7ad3f76c1adc66c7577dba6ccb3c6fb3fcd464d5d2dcebac4fa41cba7a60706d9c888ba1af7e586714725b058483433e4926bfd3aecc9349b4bfebed064def162f2997aa0b0ec1e37ba581535da9b826bc49e8a843ce4607f87d115927bf23e09b7fc68d14d4c8c4f6e0d25f3ff8f5f5bb04865c7b292c6c83a63706c3fc33554952bd54b4179691ece9f63010b62332b02141f83d276c02bd0204fdc34d48fd9f6a2707d22152d2c58996ceba2c69660266c382700e2f510f58214510fa8a5f068eaaac56382510e8885a4223a2f018199cb105fe279ce0df7235e6904b2003e788ee4d27a537d1bfaee993355fdfd05d8bb686cebadc379616e9e92d883371a81e9cf12fb0afa0b1c3ecc9d6ad5f1736fa780fc80f16de9d0de555cef8ea32b3195ca155a0b602268e0aedf0d298730cb29fa7d46d735e5a1fd0325be46ecd6e40d56481bf738186d8ec066a17b16f477cd457da1e1b3d37135389bb94e6ca435db0429b530fa43a69391c2cc4d3904f1ebf26c26835069bb31561d8507bb2993694438ca5b1f3a8099a381e2125608c60071c7494e93eeec5bfc29960550bd7952a703afd82f73980b7602876d066670c5441d9e9616f97 MD = 49e91bdb49492471e1474a3934cb235d877451e4eb447fafe3a01f6948e06fe71575eeece2e41d9634110be5369199458c4f2f68ca380079845138ca5c4913e8 Len = 43792 Msg = 0e7c0e3ac2f13b490fde401b38c3a8dd47dcd240b700477c71c94b95faf5b2dcea0cf5baa04385a934a15f83ad60e1ff7496dc780915eaf1f58f025700fe4905a3422b8ec00cabb691fcf7c1df0640f1741ac84ad2043d98259145b377f35a022366d83e8c1454780e36305e357d6cba2db0bf3b7a96e778e9163d32c79d8cd950c023526a2329f8949931e1198c0e6289a0e9d5699391992a68115b58c4889414983553c400d23d096b23d2f2fdcef26f316d9f08c3e204cecdeab69230f63b563536c90174f64f57f52dba27965371c6ac7421bded83c0bf8ef0ccdea87cd4fee04d3a89473d37647f781f222046e7785925e4f1db1bd5e3f24a24a2f5c569f3e1a230c44151fc1a512c8c4a624e5c6c80a96f0d53534c2443214747df77011f805e321a29d7a65fb27086072614d98a69274a771ed32c69c79cbb362e3ba56905a9c9f3c97a3e1dec6c97c1324065ba5cc8fe9904427d99c8e40ad6aab85cb9b7aa7bb7e7e0cb3b454946e04f7909e4a0b412dacc48489e8c20bb8e1b972ef7df8ad3ce4cb155a1062f1bcc4567ccf07e120ea1408e945f5c7957c8487f230bc57056a0c096e53776459feedcb3b6c63e0a7b5826bc69c47f1765ebfa1944deb1858e950b3681e5dfb459acdc05cf4f28c6e066477acfb53f216d5ff90d9856ebf10216f43b349387a3d26f0c042071836bc5336b6ecf1ae2c0f88b0d02275cbadb3a89444a0329b73b90a03559b0159924b227594370dbb11b8dd9fea0fad9686bbf58c30ef88fb7a41da51fac8724b01730aadb9fbbe1f45bb4b0939018b33bcb18e9392c1aadcf0501e892a4ae84116cc624b72bb612f3a7f578957a89d47c20cda66e4f716b4786c2cf56e92c1f044cfdfdb68e6b57f528d99acd055622729567f62a1d06b26651eac4322409dbd0df5c9da070e2994405e77c00da8687674f6d40343ee068768b012ef0fd4ea2bf4c6b6c3d7b22be2667a887f9a121eaa17967ee555b0777bd5f8d75561b025b17bcb2d3555533afe476a2237f0130326939dd67551c84c584f318002d272dee2156ba38afa61d55c5595fb959a2ba4907b75813fc285e3c126f29393cc8d74225430a041417e897133967af502dc716c31d605a11289dc3b1fc49874da709416baa2aa04c4f9d5c143d406f2c4a6081e5907ba45ec34a41a7c2fe52266bcbd23ab4a3721ff7448e128e745fb5a08b72b43a3359a9a26ca03de8d30390bd23dddc88fce455b7e31453538be9b2d852d179430fe1bb6c0bc7bb964d0053451b4b9750bd5db53684d620b50b74ed99bd867dd397a45cca2f9e69f6f6b237aaba02b4316f45081d2ebcc0dc7e672c8cd37a0510540b5364e10d8e2d5581049508eb7a5599031613eaae7def6b2c38599c935c25cd7c6ae128fc7466f2d681ad0eee33e4c301a7c1bf949d175b2ad9a720bac9388a6067ea0d5361c75617779bd3f4250575a683cfb556697bd5c9d61e68d893721420132697fa9e7808aeaf065fe39ae1385a71e4d4dc29446171f9677bd303faf222363eced973a29001ee97bba5d8a093853ba8250e2599878a082a619561f9acd098d9bad9276d777afff6ee2027690f8fa7c5afd5a4a3d07ccc0e2304f596cb9100a064e00400447fa9ca003ed16432e17ee07a17f089c3b00dbcc80a06fad6cc383ad3d750847f7ab3bbfae51dbb87e187a48fbe4f74e98c93dc588edd4c55eb06510fa75420b1d2e673e3ff529393f88cb6f5b00a8cc8792515dc77c3b5d155338a213658fd61ef0a97c373b917e08e53c1b4d768f8eae08d0f5aaffe5dd172878f106ea4421739e7d2a3299a6cf50ca66bd519b3e1d7279173dd1dd66bddaac908e4367f185b1844c98a093dbd5ad84b5c5f60316e15b8fae96aa995077d65c39ca67533a7b6f4ea2780fbe930985c0a3d5a932cc82ef98f180b3b815b3a0b3bf45d150616af35a2928de7e7ed36ffadb6cf9aea16aa541aa9c7bbe48c9b04fab811fd418ecf4332b2bab5801dbc28fa6ec55db4810f306143a71104c529b8c88fca152b369c8662310e4df9e8b241bb0e44c3d131e7f42e8fb1262a2c6a906c2191450e37a067fcb492979d75a1b1b63d54b68b4db90a4735efe09de9e8f2b0176d7530b8634cc6e64c7cb3ed11e0b4a4fe1e28fe0ed974dc6928a7252b475a19678ddbe26c9e8a6c46e2827788367ceb49e1f16b6dc97f2c26e78e08b9f833ce867555dd43c60ef188b3533c901bd8b93ee82ebd5e422ecf2e039bb91c6b03dfd216e6d0702a1b1b18d56e64b0f78eb6e31b271b69ac4b6a89661661dc0a92f35356d8e37b34789200321b167132678b426223ae176f9ca840f647277f3ca7b3121e7140ed4befff48b0a27a59342be063a66c9deff3ea2e599d75348f680cc71657fb0c4ed6460af6394ab9f265a25c4ccd48117aa1fca7df41eaaf94f887d667e7bc72243f465a14b45dfbc42e93a807c100323edf9cb9d7ccecc11453e1880eb8fd98f9edb798a908216755f5c86c9c68db27c516900c4b25c49299e1e28712b005a65448616bbe1fdf263023074f11ac231997afa1494234ba49aa0a51787bb91ec5beb80b7c5ae0de5fda2119f970741e2f3a109718c5e1150fd036f70652ba8e1dbea57f738533683bdc56c613c1a7169238a33a20db141f0b91cd9dd79e9a9ed5dc7783f74700c3e2bf29d5450a2f516919cf520a8cb51e667837099367439615a096e0b0a92f387b0b04103655f318dd63fba67de0ac5b470adc04e3b59cbe07936b5e47b2a90f2f464e3d8fa9dbb216a091ff22e0e11ed7d125556f918d5dd03c5cc4646b549025fa6e25f70fcf693b57f825a1933daf3d5478c6de02febd9b23d2dcaeda190386aece90178db783751198e0a102a655a21b3e1dd811d7248ed1366cce09e1af79ebd546972e7b49eb55d9f8ca3305592eafe02307c500dbd1cdee3d6b0092dd2738eb0e1ef70403c6ab2334c63043030897c4a01026622a8d9f64172ec615d5b71d78b154f238f92d9bde5d3a01469b595b545c9e3ce358ead0fec1bf6253df5222e4f8e226007249ae723bd1acf8694884f71e57106caf0fe72605c5df334320d098a8709b45b8416b4796313b40b5fe9914afe3a9e675256c43a9e9429c4848aefa8ca55aed113e5bc53602b505c6a32215d8eb0f37f353e8bc76d2957837f345736b2a6ae1c6680455e3ed2331e55ea7615f174b4971c2e2fb3428e0ae58481b6c0ca6d30a1ee6f05d64998cab5a57b1600c0e64023799e267ab952926f370ba4b38c29e4f63e1a74782b0f85b6db7c77aa979624c8c017068a2bf7ac85092aa79b726d297db80af7905d7702966a67217fcff4e0eba221566e34eda7cb7d7715f517977ccd0ec925db5b8fafd8c4b399fcf492f30072358c934eb522a6f679964ce6496d5884cd85959fba1bf28cfa47ae8fe0d99bc2dc2fa5e3ee8bac169aaeff58e359a4cc907d7bb486a5782593b100fc7f0332067da5f29eea614f5052a6a8fa05f03638ba93ea1455fade21287ca0e4ce1e57dfa28615ca494205365a33c644119f817b945f6d49d87aa90220f0eac34e797190d3468c107b9c722ae9ccd3c1a6d61ae7c64671cf6ea34d3b05b45b0280b313ec987dd1ec01defac0b9e85dfd2622671fb8df940f99134f5e4f4d8e3cf549c3256a8263c76c88137a230cc1512002fa85f48140a4d83933ce7612d0dd2cabe3ddb1fade3d2c3660c9bda0aa58250649bcf1d20409ac837f1e12aaef6d87580a98075d9da7b1584731f24a758c959ae91749585ab8a690a5bf9d8c2658a5ecabc6f3111eb1ac6c5b356970bf69024f3d47537ab13c36df3c458f2d023908c85c0cddbbfdc57df101667ba9e477eb71daafb8cfa40eddcd972260042f9910797fbc5fb4a76d9664ce27a15c9123c1c125c2e1bdbf9b1bfa6ae8a8b7fac35d8eab67c1a1a8149666360b931f221715bbc31356cb407b71d41c0ac1aef07250665381dbf97c54ee43cd84a95833ac67a01733907ee33a6fe92f0b535fad10999efcbce73290a91eabf9255c9e226e383cb686175f243266a8186cd6408d1889a72b5b7bd3817ba7fd4d5035679ad6f7d015ad63d27ffe16af6c91b3081d04b10d53f02252cb570ac63eb7bc3ae9613718b8fbfe7f4317c05d902c820cd96fa0300b1d4336dac5b78541ae698ebab7666515045fbc39fa244127afbbd54eb3c7bda53587063c424eb8fab6c5e97b241643ae49002fb12f92d8976dd8d7f97b9814d6cb36376c4730dfde6349c19741b743095c784035229cb2741961ab4611a1c414610950f76efe7841267dadbb9ad9c1ba913074527db23d2224dec5c1307559c27958c94a041800d782ca144489ee6e1699b152859b73f73602b89e073273347586ad26f0b11e08161ac77bceb975a6b1d883514af6426f344577ba64a23be2a21b8ef067f0610c6130fe7ab6840ffa10d01f071f38be03816f94a185fa2fe2dc9a769c3c4c817c6d77c76798840dd6b802fcca8ebd3762c1e3b7c9d7c4dfc399a5eca0da100fd67f41bae8f1340fcb2c039531f60e5efb6a3439b9c67ccbf34da06994bdf56cb93b4151653d1e7655c13480d3f196853bdef392f7fe9c64f08d2c65fe7467188315d92362e8ade1f53c2848170e005aa2b4846beadcae4b59bcac7a3489efa3c2938b9978905cc327d1414371b7b64fde7f792d28ed2cdf8d70a30edd6af98ef638db3c0ca0b5aa7c45321b7a6b32c53d94344f28ac92920a2d92ac6f941f4aac6a4a8395b6430850fc5d28a7b5005b5e97684a70976a236e681ddb4191bb5743cc4bf8ba2d8f5d445b45037001a992affd77c7773a2de408a4870419e068456ad36203d092f519c5066c2469fd98dba03ad51ed3015854976770cf5f0ca0957ff43f4d7f630eee61724513fbf548c6ddd412e8ea89740569255d857772feb7f1b3163e2d3a471b9823525abc7543c4c75db39e444f0b771c62cfdef9cfdd3d6e94894e50753851e79e3651221a1455eb3c29a766ae791a1fa42a245c5fb686551d2b068fa05d01ce4743afa340350ac80407acc834676ef16e1f0e25cf253333c15def31482fabbab31cbed6842053cc29b016ff8d31061024f0f4dc7aa3b48905a470fbd91ac03b762417225250b18631c56e62f570402a6d4260e70ebc9ad37e912435dfc8efdee4fc312d3750b48490ba2b99299fdd7eaba5daebd7da569170a68185c8947b0393f7a53dafaacd25eb00c718863a1eab747ddb4182776841a05711522018025817c8dc0a37c97c08852bd95787b9842f3c5cea8e8b2e407272154c2172be062ac4c25de94c3731ab13bdcadccaa8be7887a581394e799f925a83aa7a4d11071a3f86a371696e9e6c0b19241ebb822e25cafa17b868b3a62fee04a4d2fb9b75a4fc7835292bfa12e9dfd07da3d6d043a59abd46b2569724b9912ad3b22ac7e23970399b76e0442f9306762ff2a91daf766b81768d948e6bbde858af9e3720dd662f2d3ef142e75506136cc391aeb4b226a1c92fc0aef41bab5830a10dcd30b7a9ade5a81ea05e13a18b46c0f754400c14f206fae202729500652550773972018260d55f55a502fbf3d276b09a364a0dffc0cd30683b84686b93b92661285f5b7eec8edd4cad906e7b8d8f0af0c13d4815928e88d9c6a4263b686eab62067325fda564aa4a4660fbb710f248a191944b14ebbd6cad105c2efe57b847d05037f18d20193f04fc0f14250142e21303d9776c30fc5468b5071332f628946282182ebbe0ff13d33af55843e2e37fcbb4876d9a06adc873314f4367a822096f38be6df86c98b15b8fae38a21a667a4200388e0cd1543172f19f601b02472f7cd0851fd12778aff466b425be3c4e5a0c93376953258237ee9271d9ab790a6f01e5f6c4c4a61158445c81bff6ad0da781ca3e700b87aa442c706110b790ee50a4f59ded417ce552a1dda157fa0126db5831a842845c5eded337d7b5cdce657cbc6be4f9d5f08717c3669d9e26bd2c7de655ff515c27f270794560393ca5f23bdec5669b00c5592fff93d0e30b5570f7b293be1cf18f17916525750ba2ac2726829e8d11404fee03dcc1d5d7265ea6e153976f05f2d630ca4d5490bd8e3576b53e63e32d1314a82bd18d26eaf63d30c33fcd8cbcceb1d073884f3dbf6df663706891e32f07983a1074625e8ef975a105dda291a1e3966935bc91f691b0537fd097c517978c6ef64a4bcdb743ae9c7a31b3b30845dfe88d8930b935d4f3d12e6e5259fb071ffd8f41be4bfb9994161ecf687b6b29224c9fd6bb3185e9a6f3e1a21eecf7fe30c8478f4259860138771147526834cc592722b68277614058304c0453eab8dd7d53c19b8e62d10b1a33f4221815ff9fc30ca8914d075289762ac00d97cf983544147ffee9147727a7d139f80fe126141e61b40f616dd4259f27e0366128208633aef511e8dae2d76fd35531c06632d9b9cab7796627509511cc1f174670ec50ba87a38d0422aeaad0cec857d021b05133ac4577d1a062689c9bff289e36562547131db8d1883512890825d29580290afa8ac0832a8584009dfbe2c2fee4e86467e5c63dc778009ee723d04aa72e07779ceabb13d723300d74807caedf092d9eab743f746c7ebbb079b66a288b67d6179950b7a27e25f0efdeae2f24b51f90547042dc052708a0e7cf2445e498ea1f7b6e3128c775ea31183af96cdd2794baf654e64e588da26ab545e2161776113e138a20a0fb550c9b26f7d6d8209d150814d7b2e8f706d863997c943d399969cc607b8392a6a1f9798cb3ead3979bfd0230675d4e6939274614d1af3db3897044f2c0fe8061d33d66b9fd99f1ca8ac923d98229d1178afb6cb7f3979a1dbcb1323ae8d5ecb56f44dd5f1368b5020015f760c6cd339a72e151e350d1d4e0a9a90eb951ce5a09dcac67ccb3db9006924ff76693abc85a97559037580270a4e6c454ee9a3c3ad7b1d070834d67052097f3ae6b773a21e05ee4a214979defc2da9f8f5b309411b7755da2235e9fa6e8a78d86eff01cb2b43ffaf21b8e18c4d31b97287fb38a7121ada0572d45e9d7d7479a0b548cb80d5ec1252aaca9e7724e2057badc7173db9ea14509f1b1da2a74de95b649ab90844878ef9658899e7aac7f3db0f218e4a39716c8552120e51139f30d122fdb3ad9f9cdb6df9f9ba260768ec5954108518ba37486a32c01af1eaf1b6ca987aa1b50fb361760f26ea7b624d59be249de4ed63c311c9e82d27cc53cce20e6e186b69bb5587db4f150f2de3ffa0d229ce93125c9d30681b611e2877b71e644be0fa11cc09b76660d01285b4052b5d08ad7bcfce4d0b0f7465e84e7e3ad296d7d834f5695859ddeb5fdccbfae760276c42826be15b0c889a406b868fdd646abb0a025cbbc9d30997c85447e02ea9f7fb949130bc509a9a37fa9117d2293da99f7e4d90e9e48eb20d1561408b616d975dab916488b41c0cf09c414b70a5c51b2a3bfbd71c31f2a0f54eed00260813cd3b8f68506c0dfca76f2c636891da64870549f57a7c39689af679dfcdd7ab05623d49003c91e5a1335cb5deb75c4e83b6d8b024c03083566ab8a01ff0c6d3aa1e0adf3f701ec373785e3c9c80fa8b88714a786ff3619725d6e4ca94b11d076ac84b5c0f333c30da3d1ecb840b9319dd7e03aabd5936fe3ea72200285701d0ad2aa7c557cf13b33e4c44697e9f4e7ee8a5ac4ef83cd83f07a41949c22c MD = b1b2dab94b3db9eeb1d579e65f06f07004b98f214026e4d53b36917808cce2f338b6d195287cbf2430f3867bc1fd5c1a38a4cb3ec741521da718e2ca33c9359f Len = 44584 Msg = e0f3c6150121c7b86b2efd3cae3b9a5ca975a25ba3e09fec97549750cec53bbeb3c76107e450b47a85c0aa05d920b79e13a7c1e16983d3fb6bd615c693fefc351d19bef318c80947be34f43b014f36fd665d958516b2a27833bda44d6845d2aec4f3c521c8112ce7be91c2244d517d414b9d088fd2f6742d96112b2b752325ef505c5ed81ab187222edffb0ae6adf63269710146c4d5b1e03ddb91a9e31f5dc26a5d7162363280c0b6278933f3eb079769e069f415d9c15acf23c00fdac2e2edbafce605451c8188fd7053e89d941a3af2f226dfec8a0d63f5ef9fa581921c38e743a50a6ff5f143acc241700c2f96e1adb0214f726ffbc3574916b20119746d9a3a96b9db4738b96a253b156744e3554121428ecf10f4419c380d8082df50527ae8a259b299beb2e0a2291dd75b695e574e72e32af561a66cc56c552b6b19b13055af341b74eaf6b640f3d183fd8fc3973d9795aba7a8ba71f61b7a244538506389a6903f5f264c9308827994b1bf4ea8f89aed7cad334550d5033796f513f7bc8d70b646e2da7e1f00bc5d310061c533876433c28f680fb46a0ad3a9031470e268f3ee57856c5203328ac48371dbf1dff0dcafa8d6b1df43bc199884f8a2827f22197f9ad14591e7a6d5f8b18c969a553de9a85309757fa5d319cc505c24f438c4c9b3384dcd037263833fe4d9fa883d767568eeb01bb583b7f0b834b5048fb754ebd059826c6f4d717de244e170823ea167359f530d4a857188a4598da91ba4dd661f24f68b9e20d8ac28f82b5e5200c8a7588e7bb2065207c7d8e66b7b60a66424e8c233905992a0f75b293f2dbe2cf21c19e5af72b09384979b04d8e22566f30c735bc1e5664bd245c1fea6468f6a28b0bfc978b512efeddf37db5b46348c9106071626f08df47680a4a0e70f8c61714a94645de3f20f4c87f2927c0f53bf47faed1bec1b9835928f4a368af27fbad5d2dedee664199aa8761552c3a54ba71cd06e939acd4db5305afce918562e1c5c31e65f9ba14f390a96e742b971e3ed1870d0a6b96d761d57c901e118a363300f4df40e05005b9479ceb28be5d9e53943c35b7bd065d91410c4a3451240e49ef50f4f13abea0752fd06bc54cf461732a6af593b671c3f436233283d8e97790d165f419715c8191c9e264fc600214381481d100d07fa6f5155fed9f3150fec257b2610c2cc005a996517b109ffd02fce31f6c91a366733e7f10dfe8c2e10048f2b4a05bb57fc927259bf2a4454bda4c06a20cc897fcb51ad3f48df33620288f32eb568ab3e22894e8307049f884e69fffa856183678e924a4698c30e384e41f88d4d81b90adc06d6e9d7854322ed4834e90cd0307818be670ee3f445385af7474ffc970e4291d3b29518f758aa010707409c60b739d29daba013b801ea8f71887ca9f4d16ea8b6898fb0a005a9f26f1f061f5b413222f6bf030e586ad75579621d3cde2b178b7803dd89c973a6274825437c07f5ec71934a3fbe1ba78615d57d399c9e44c4a1e1c9898ab9ca290a5ac0ff9badfcee283af55d094be17f354e82d8b37c43fd52b8839b9aba31ba026c994364947dc0adb46864d92e3f4b1fac190268bf504a06c7d919a312d0e277485716bf06a1eb6ac94a5c150eea7139b7e9c0a3b1953425d4710d8c0ad028d1b4a381944990f6c540444ea5310979ed379b194c98374217a8f67e3dea59157979258bcba6716928e3fd4171e0c5eca2f3d6164cbd61fd450b0e759dfa9230d55f843c4c656ccdfa781e3d60624651bfb443be896839eb15c461f99682a4014e2d699cffceaba9a3c84e4a5c01b330ae428a19ece1e796f09d98120fc9b7104dad7bb4cc2953858b9b36714d033412d665522f5d6f94863f5c5bc8f118f1e638a5638b9cbd8fe91ab97db919b1f37d9fe54309c55b684168ca512422b77d0a78dec82955d3855eb8e9cc2ba95315fc718906ae0aee8a51d5af232d8bee810476205397e1b35d6bcdf4cbcde531c514b41a4326166d233eecd379ec1405265d9932acdc26a54099c1a321a9b592294fd061a17acf235a8e17fdf967a643939c48de7a000ef1566ffcbc77c702c069342e23c9b11f5758cbbdf74ea827f1f149edea650c80dec675e607742db201ae4b342b63d3ed50447c45871eb7815767ecef1f170763b5b933e74ec1e5af9e201d4b4016e92057472a1976129a9abd1e0eb64535f9a1bf5632685705f7dfdfe631db298af9a2b4895ca08bd15b5c6b3d36aa246aeb2141c6f9cfebe9692c0b290f4daf680e5aaf319a42900402ada8eded33835be3cb86301086d215457d6c1040079a582d3090686d674b529577be56bab92cb3ec87d5bd00f3d43093b948c44b73b201600c9e555b7786641ea1f39f25a4e5180b3d75945080b9e259cae86cb8f8be0caed62221eeda07e1a41390f1b65c77334ad5afdf889448d5a197943110fd8820207664f3aef9977230b5dc73f649aaabb037cbc331964aae7208933bdaecd6e6bcd5acf4223afdbfc96f214e6cd34528454c116ad2f08818d5052fb19e2c71068cd9424bd206036f7729a5a9a163125412fac8fcf309c7b9d076aebbe5252127986b6d2246c66f2a42cbb2ad1b5fd7d41e2a3aa01c49d2396e435983353fadf1e674779e07e00a9a333d8e8164315d5372c5ad7fd6187041b455782e19e2df0e81daa6e99cbe9c655167814f043f6c7714b16ac1a8de6879ac9253e716767d236e87432b8dc6ed33a531d53c81f3cce80ed8b98d1b0383885de331d4b66350dbb661958b6362c4ad3584d07265b4444f6820e10bb6ef8917cf305c1d801120db6252e632a5f9ea7a0b46bc1937e99d5428732c65010b42cd0b621aebfce9b5ce7a417c48dbf228432f61df5880fc9f9e58b8e0c084bd7553185fb466b351d65a0415a1f48db744b0a7bb8258c75412d6ffd74647c86eec50fe1172b52cb24d270ab89a5e44af06687d3eec419459bea326b7a61f54876d6dc65f9b01ef75e0de9311b2af87423814b9d1673a70736baed4424873b06ec1527730797185005827a808300fdfd8a05b615b396be10ae09f115f7369658db0a6196e522e75bd7ca950855ba5d3d908e67fc6abfd7186e61de5f67129fa4b0111b5006f5f4712160d93707d9aebad365d1af90518a84f45d059f088dcf70f7e3d51ce182d8469ecfa79b1dc15afbdf2663bdc8fe30dcdc561743301aae543edcff8c094c0b329c8190b31c03fa86f06ace957918728692d783fa824ba4a4e1772afbe2d3f5cba701250d673405d2c38d52c52522c818947bcc0373835b198c4cc80b029d20884ac8c50893c3f565d528a0cb51bf8a197d9d601c987429f89bb85727ed1a33def4630143362641c681a72926834160ff9ac6d0a44570a9e89c6468d106dd7866304a5a3ba2ed936b75936c553e5ac5319882ae192f1b53500abb7da4e45996848b0930608e8c32cb0d67dae5f76e3f65d35b590999d6aed56337f6021a00f6d0610a44303d84d87bd5bf053722ee27f2f7ab51f43a2514cf32646286fc8611c05ed7e6495459cce45ae37be7556d276f620d394764a93dc3f4cb6382203b8fdad0ec970a579db89b098f9f75136da6319f0b6f91cdb5825a36d759a209a3c99673d2e701aba304165e1de04ec1623cf02af06551c9ec7ae85502b5653d514779940546bde51c37cce5190ef303ed44218286db15edb09ff4ebe8172a1fb6920ade0e569d886bdc552b0b4c004f51642c3229114cada45a0677f1ef8f456621a09e58673f0a046a159c5f57d4f8511596b641a8648e2a41a365bacef332c28ef1717e18f0ee9859a4b59f830fb34ec0e78b7b110c03c4ef3251ad06046c6e2263d3e9ec81aa7a337913468e0ef4bd0e952e3feb81a316ab69b833452146cb948e5216523fc23c800911eeb961311e47362b0a8883e0721e8005f80cd8765d5dc7689dcaa9da51a7eb4df29594fd051330ee6588814069a13bb765cda86fb5d6a583eae64e374c438623ecc318bce3eb2bf4cb5bf8578febe36906e7ffa74797bf2088159b7daecb704057926af55d476deab683577a37472d87561c6c9195396aeaffe92021dbb8100fada41a3ab3a09d1cb18f2d3d125b609ecdbb7dc321043f3facc16aa865820c0e697894f1899f302746eff8248381231bf84591b07db0a2ab293ed995deb1caa9058079ce619bad76e11636b50d60eb8b406b46edfda74b99ffd20b5ea9efb28c2c4c1705be1e8ba80ab2675332733079406d0be0435080989b0b6e8749747a14283c1b5c11a041274e1518a37520884262fb6f1bc154e823854b71845fe877dd93e0f515eeb9747105dea91a680169834266df150a2cf8c74922c2fa3fc44234f9db12e7b7d28c11dc7fc71c6d8e3ab8496fda40803129004121c14d7b905fd6c47b1325ff83fe762c68c14e083f926e0256ff42b61a0f4b17b8faf295c5272f8e5164754836523a903a4613ba8e06f0e7bcac803e3ff2243758de8e00db3eaba1ee954a04620dcb8264b4021701ef0d6411607d6b2b98082aa1fa746f6b1cd7b9b31408c6afb7b58d68a99d8033d10021f5b9bedf5567835bf4cd4a13cd3840303f6f560177b6651bb6854a988c53658bca26b90d55c71265f1d573a0aa2751aff415a64742a066b7eed5adc273ccca2c1f25f067a55d31b3098185986a50988371957e0aa8fc36ec72191b90a2c39a6d5545f990bc805dddac70046d864a8145286d41be03206213d0de288561ce52da1cf538fb03e713406b2f5482967bb88f990b95e3f9c354d89b83590369538fecd6b2331933e7ee75c60e0a8a137a8aad340eef1ef54baba532a731ad01e9ae30030b8c7d95094c083d9aaaf675bd943899d5c1c17e2fb30426c826e4c3f73a2e227f899adfc1b85242539a2a45bb41ac2afe927e0cf6277fe854cd4d3802b041c57ccee35cb7bffe64d77cc7fc0a3f9277f7e5971a25556307db8948d6a2ad156c91c1099441df672584b7421100da65f1404fbf3e33e97805dadf5a184d8d13783d14502f067326f4e9ce1b1d65aea137761558d1b8400952c154037569ecb688fd1d69855c27a8637545c5897f18debae7faf68d18f5a18f2d7be7969e28991f5060b82fd97975f1c5a2d3edd3c578ec34451ab8dc76cb0b7dbb48d440dd159bb572be9704c52a104969c8a2fa210a5bd9a827fd794000684096d9b70886c68ebab80f4344b71f4f8f0f165168b7fd7a5688c0c385edcc1604930cc73ba22678cec50ccd3fabc02ff5073f6195f6dcd8296b579378dc98a54834447d70abafea701e498d5c3fd70219e6b66c087a22f5c0b46ef5d898f09679ff23523e2fed443d28481c00dfae966c221dc9369e6a43cb1869530baf6e5a18582bee0a9b492684777af1e3f7c13d7a4dd811b6e01d4296fbf943a89c6c70a1d3c0995c6a5df1e48074976c34b967b2de77cdffeba682b2d3713035cc656ab50673fcaa399646ebd7a7751002f1b5b4386f66782da084ad3383b119cbf3b8b044d8708a758c95f8e1963365ef04a7dcf04173c602a5b8f4a0833eeb27a1db222340ad53aa9b5faa32c32ad4555caebbaa706e5026f0a0178ef242204bca5299365f0bcc455d046e4fb0f3e1d2844adeab8eceace74bca846373633fc507bf73d286042ad25c34b3acd20724e2f5fc9497ef0d42e001a8d9c2690ab01fd46240ac582f15ede36118bec8dd04033c449be433b2a89daccb763065b127a8aaeb9e1837f503d4bd0a1c19e7fe15cfb1a34304df47447cb792e811dbeeed1c05dbda9ab7fe7b3333a02c22c1e2b08510a9389e6443bcf9bc9fbe0b4e2c96d67f8384c85a93f295d1c3c78de9138adfb3c6db05453058b1266256612ef2ab6472a33b15926df05921c58c9fb0190b4c257ca8ddf485de2f7f5b4fd810c9a142798b4c06f1e4fb09ae55d9fcd95b9836e04b308d14cc83c1421b18c4761a0efd0edc6610eb818933d1d53e19a763d84c7ea2e097086d0012f8f23fbad17c4af0bcf6e7c801cc115436d4277abcba41e94b24678061ffc9a11ea1232fb568ebc9ee7b6f90b73d29d737c334848bd74b89f03003dd93ed46d82d887187945877f51dca5c0f8e5d49596f32d3eb87437bcae866640310ce1e34a0188976f0d365eee5643ba8f994e6474793940451774918ae27f6a58b1aa65300f209624d523c23bff99cd17b8c872d5b75e3735ceb49ffbc053a19554b859fda754fee1c6d714027caee2da69ca278154a409d1c37e4ec9c8ebce2f1d912879732eb5ee08d9ba09788be21ed5ddeb3ff9139f611b5a06bba14eda6f35bf3b6c1bb5a493c2b11e199936b32c238826d94eb4e12d01d02f9af484ab9dc4caf99e47f1b3181de8a6f987b93f4c7c544015fa8eb77c9b69312e68962b01f138c9d79eebcbc44005bc73eb1c6cc508c8a1bca6a90a9811ac743fa68b40e2e59315dec8aad2e05390c74d6d6524e1ee6cb196f90ec0c78c226195556bd48ac862447c6e36b2b480122f50b49e4ee657c8d96a9cc4c35234515ef71e3fce3fc12ebe7938985188ed125b4469ced21d6a657f0236d3f98130c3d42fa90e164af87eea9dcdd799a4c218b5f133fe98ce50ca0d2470444c9ba9002c039de094f396da32afd6fb704f28aca41ebb358741307fe999f21ea3eac68ecc3ca3bd3081c3cafd79fa0dc0d347579095a97b89bd330d7d286369e5b4b0f71ea262aed23ea6d7b4c1e214707646a0e11ca4d8858c81fb2f9b6c2efc428ec388fc83ba62706888bd50351868814d10007c545564f441d169b9b474cfdc89787414adeac860306681ee9c22903c862d537d62f90c3e9c189249e44346c9c9a049b08945ec5627f86862bf38d0ee178243e676cd66b1b9571114a3a3495375c26f99bed3b69975c6db76456510e02894398137d75a97c11650e29a9dc0c0b5674e97f59c0f73415840f0d7ae385be2ed9b144e21d136dbddb67a70389359b3164e71d6a9dd2ab33700991c1d30a56c14d26862b3b1d83035aba6ce7dab669457d7f108010a07f5ea8439bdb9e006ef9147451c93e4c3e7a5972c5c72ee2f83b251dd34ac7c522cf93398618a30c893ed617224cb503f29b6e3d5c12145fba6b024fe01b31d5383ed747db19909327faf87b92163df961eeef569a692981425d8b81c181dd352204cb1b254ed518bdc5f23e0bc61780eedd836b0b2ccd0c029b375ff20f288962ba151fdf38ef21cd1859cb09ccf02f1bff90e728ed7d348dac7c46ec23a2368cd71bc273685d22d87aa5af169b46785bbdbe676e1bb8bf45f9f0b32a6fe8c102d4659f8c4d9db052655c56bcd198e130a0524855480df0be1c0b3137346abd675a792374692f3eed50f45e56e055fe2d3ff32678f2fb6d787b425d9d2186801ca1dceae63b9042ebc5f4229f480c23c3f5276e439d0fa9e7a02c84c6a7eabdb562f7623c455f50e04cd24fd08939f6776855ac3fa6992a9e1320334e47f5caa4165f05f116eaed6d5e1532a5244deac9f2044ce7c046640e5cc4058e72363b7b347a52af10d17ce56243778799d6753e2ab9ecb64a85eaaae59e6811c73a84ad35efd4b0c38183eb01d38ae26a622a468afcf835d5e623163615d772a7613abc931618c0bfa996d0a55bf960066f8e759b43fbe0d2d5a1b2c6a0c02bb358d21be4837b3965882a48d5232f6b0e5cf63dd4056441c1d2eb132fe5dea74b6fcf5da2ce889545cbb2b619efb97dd2b91611add7cdc3336c63b9da4b7f6ff034a704464ddd6ee0d2c4aadc18041304124293b121950fa810a0195e582f004245dd725787d620b73be4999412bbb502e7203666795661805e34a4147279e2a1f1f75a4f12ff45497576f4fa863cfe7fa6137c4 MD = b4e49d08be92b07880b5f9496ef0974a09f44d57ae3dd5ba0dde1b498f09eb219bbf3019dfb28e5a4d79d12c299462cefa246cf4a13fbdc81f719972065d3ac1 Len = 45376 Msg = 3778e7b9d4fd81acf9d9515009f176dfab5c7a4273741fc8c02d5b1ee0a6a17c7bfe621c2e69d4f07683f294d0e4c4821ef4e0854d003170358ef70fc0ee0f5e4f1275f959a007d455448b2cdb4bf4bd066ee1361ceb67ea71db10c888bf238d7c5c26389ec9a2be60c62600724f8efa2a71853d295d499f3cbbaf3180406671ca837fc1450c2d185daecaf8dc181ba053a6d582bc7d60f75dd6da32f09a5f720030887c9692314915a780fc63cd231749b4d8ed1d73335b9ed59cb31ff497f9e80a4852d98336b950574ff44d962cc6d445976793684a31c560fa9c5677946c48bac7295507c2d0d6663fc8e39cc017bcfe18d667842ee29b1efed5dd4be035e9e70deb53445ff66e7d58606d076671c8896524e2ee66d7e8b8af46fc9703ba933a237e1b659493e244a3a433ffa73cc28e863749cf7a7774d515d8fb8383650d5a10ccf590e90ff862277d7cab09e170b481f9e74ef329061e39712139ea9d21f1dcbb29eee7d27980ecd1923316c69aa4605003945857683b22fab7debfc995a49035fea615442c45fb8abbc056540a062b26e4c8316860d3d85c059d8b53321d3221bde0fccedb5a5b8e407a50f38781e862d31307c4b78e647d539cd5a2c004cd66afc622d64c6614c769888c0cd8bda1ec189d60d33516cd47e903251e070066ee197d11c648122f1b7d129205c6635dacfb8dc7fca1101ba10efb032fceba07a0463051049706b374c642eb48191b258ac40bc1aac42757720cacf83ddfdab7647d0568fa01e9a8b98a3e1e3b998c006eba41d842670188a4293d8bb000077f220524e00e4e6317d2122eb3480d5ff6402655932d5046b61eaed645f0fae965c227b641aa451e07a6a63b32d63f3b0fe8506f7ad3489fe9c8e3a1ad659529742d2be31135b0bf801f8d8d244cf5c9544e80b8169c16b42a8a0fc34b78986fb14959d2da1755f18a24114b1114f8b1cc5afe57eef1842c804c7b67a78fcd6226fff8ac23b7fc5a2e9e789d7f95109a7ff511758b3858aff4f670b34a14faabda385298757f6fa273730bacf837042c7605033a73db5be78d7034cfbb6de8f2d5daadbf57d67572628c12a003629e10b8731acd3040557953a20fe482045fde20ce52495124d57201d1d5a1297ea4ee4d289f574ad10e104e754b1a283f2717c2fd895debd258495a2a9bd5f0f3df6d3e0bd9ff47f44d5287cf2f9834880746c34e9a23ae46c69f7580ae67e32a1736920312eeb113dce7059a02872e46c8132ca8ccc421e9e71e58b9547d878914f151fa904b0f958178d0bc0d0e9ee0322504f56868cd23826c0dbfd64066799d4584d79d3feae205adf11f98560dc00d25531cb636385d61319c787cd707637cda32827ff2c9622f2d6fa9ea87034d21ba2105fe57ecfd4a160bce8d6af2ad775963e27e8b347dc9a152444dc806ef368d779888f3716d06c264a85323b0c1576a1fe1e433b39b99b0a3d70741a00e13455cbd9b314d135ddfafed1428c805e3b46f66f711cf2469036949611b5812818bd95c81390a591612f28719a1c2e3e5e05a5a014e0f80ff41ac84a37eb6644807f55d80342fa6fb05375daab727c22395e9a34811fc172313746f1591436a3060b8a8e14a4561d26085570e917d09677c232a15831c519f21caf2ff7d868d013f2a25eca2d3f464cae55d8f594f22773d10d7afcbfa973a12b5f5a8690835824b54bde86561c679ec5d57733422741b7fb89360131b4fbb8f3e60597e4fcb7c2d3d561fba783fd96ef82d034c80671dea24446e8009e3eb3f6c1b5ae4e5b5b78cedd9d7ca9fc74bf7bbc887c9f06344275bd3223c4bb992cb470ff3c2525dfb116d2f59bc5ec6982fb00e47d3fbd057de6529c46f693b78dad7226c401c291064c43eedb93da488c0dee88a9027161fb64b2c9c40ebcf6415253d0c88cd83bd2cfaf0dae9c5c9e34f4d3e9a2bff9d645814c6f1d85adf1f2338491cbfecd2cb11182c6a737d9e718706f9bdca08ceed6cc8de0d5f3ed272ae182ce410027e03bd25d9e380ed89fa0d10ff3c96cc0f8499705c36fc1d10225bced0aca196ef2ad529e18e379ef3458c733a5fb6d2c9ef871227b5d78101fad4611bbc9a308c0b042d2bb3c117451baa38916d52a265f7dfb929d219f10dc1c1d9f75b2459bf6df0379f9a45e0e5440f66ebb094c54964496a49d4eaf69c3ec93f4bd36797f0174152258aec823d886405326ea2c2dffe6c2f6f057117163a959aff6a8a7585d2a083a5cdde84b3af511e4df0a4218e8df10f83abd7dce37dcdf2fa69b578e766b5d407a9426eb1807db7247ec36bbdd87f136e0f43cd6bcf184f2618122a7e9b274c336740c99ec491db9f5f2627d6a8bf411679de7316f81eba6abec612b2399ef3124e021ce243348fa6ddf7dd40c559a36430d0554dbf883aaea4fcb8ec07c4d28aa8adefe5c50fdd213e5b1563f7f441407e40fb76eefed8da13daa592ce3ef084bb6ccb0e12caccf8cb7c58a706382193a956eefb4b279bd75188600e56b756e9d16536c7f10c6413cc822d74b9cf4d43fa3cb5429fac8b8ba62f71c667d50a9f30c0ba782c7dae5a89951d32d95ecd3ab917d8b5b134b0df5cf76124c940169020a6df8789c6b1b649dbaf492e90a75e2e12e0ba4b6813bbba07b78e43a181a2eb3f2c5dd18f760d567f6b21800ae599a15254bb33f0bb080788fb6e9fa054bfd8b22962cb7f0349f6a7d92297778fd25902bc1f3273b0ac8ca1b62ba3e496ce2e285efe413f6250727c82b53b7dabf19f48a14e109afb91917b6f2d18164fb736c8549af9779b0c1225ed4033c443ddbb4c89b0950ca39d5d3daedcc5dd886238bb929cbdceb4631dcaa22d48f55e80f537ffad8971b0ba3a10fba074e248b77b28a06e53ecb73fdd952ae242b805c1943188adb3732bcf6e1cdfe1ebcd979e49380776837aab8798ac0cc9e9b43f88e261ae18dcb81bc44288e107f3457dffe8124e1e172099239737d048049214bd25f0f856cce88881fe7d8a7a54f203c2a1e0fdcdd58588fa225fffc95df98c49a606eecf4bac7aedea2260a2d67d30cfbcc79dea875280f6804b20b3ba92b012adc919eb21acfaf24ea0ede8418e0d0e81f1b5dff32e8afefb25bb6ee405870182640013158f0f77711eb9b25ccca0673886cd13e2c2acfbd9125862a3f919fe6cfd2cadf1fdc2659cc54a69f0e0f3c328ad6dee1bb6f0d3633c80f7be176ff2b4bd23237ba01aa217bd2a76c5710e089a8f1ed868b15e6fe1cbba95ff0690c3a3cb6fdb7c1d1f172a2de13fa328f720d65467398f5bfdb79be78fa42c6e845b7f50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c9 MD = 19cf6c6dc28eb06cd9fc0a58c87c8af1aa605ae7fda192ec6ea3c12ec3b6dd529d22c45ee32a00597ef615af5a8e790d3902818d1bc3d33341e648b349c5377e Len = 46168 Msg = 2214992c8008d66a2735292420127ca9527995bb4857f6e234a8010734a3603dd531a4e2d6a42ce72ea6496c4f6f9f90ad3ccf877afc53edb44ca95962a5b3361bd45ecec7ab82a8aaf709149eb254049f79da1d8d40120e2e44942173417b0ffce50d19dd859e54a310b145924161ad3118ffa6098afdefa9780a85edde7f73804dfaeaa09b489421d98926b5858e356a01864a7444da382dd055ad5ae38808b0f26d6a97534a102d3ad8e08ee6a541531cb73058d57291c334bcc241ba5e7693bdadc14a166b6fce1be89aa5cd6c7cf252d9813ca58da0718c86ec2bcac96631960416414d725a0d64ff7d83a0ad8b51893664a91cf31041c0fc529f7b91809366b891055e2878f0fd66b1afc82e1978aa140226a26b873bb8661d25357d6bc013125c1db3557282ce655db1aeb8cc6d9ebc833b9fbead665c0c74456056d0c0875a9c11b2c1efc8bf43a912b9124c3a4b760e707bb42cca9535808864e4569ca8d87c6ac53398ccb94abe59500642e79b8acb4e9e15a96f492a6975aaefa65b60d422af53741595a2c0c40edd5a567a753fe35c70a9cf5e61345695983f67059695b668c44d0d2b64eee2bac7d72ffdc0de7e225a38439ec6996f6e979b42a33264611d7f832897e51c41e47645767766afc329c289b0375ea1de8a10cddf3c1b894a57eee10fe00f920914526cd2f14efadbf81165bc321396c871699be5d83b4c9b9d782e6a0ec89761d2c313ec726007ee18b0940f96ccbe58a90ccefd7f79f479788531e02afa7471a731046b02841d230f05de526b7163b3bc5f2ece3abdcb0e6f7db31a3a8c72621a0405f8a9a286a2677a0b2db9e9cb0432cc820110ef17820ac97cc04966d75cb4a4df3b70a28894a776e247891e3e7191b9943d0af821fdd1cf54795c70eb86fb795adb5e6c6c2158612c49e2f7062263902a2b2fbe31a64df803ed7d92f80979ec3d817ce97a7001a2b1dacd5c6a402fb80d72872a8fa505ac50c5b3b4440db66352d4d1fff9aa2aa339a35135b1f37e9905bb1a248223815405a907be18b939475f7d659733f65ccb8c4c766a2462d79bd9aef19553484a56e8407f98bc358a012d23409a6e7d1d82717c44e40bb6c22653f213634b3be71cc233262a78aa31f7846f6beef366f830b2dbc489ae16c7a239308878b025e00c5a29015d9440b6932b09ed7d0ada723d1512fd4254ab6f77540f59baca2dbe907acb1a17571ea23cec98ce2dfa01151263c9f7f8469d410d6c388d13e37c080fe8c178410b6d7d598dc416e80d02681563a7bb91cd13c6cd49522c6a413946f16db223c4f654cd54d737ce958906f3afdf5550f72f35841db2063fa62d8d019dd147248660fc1c949296fe1cb7343f489d7bbe10b42c056670fcccb1efa0bf7ddc278271938cf181868cac65dfb5d34967c00ec6a620d1114cdbde72cf990bf856fa456cd62dd5837abfe25749b0371803cc47ff4b386e840b4c7ad115a06a76066a765e70074f0238d7a7dc3c4ef41f394871a5ed9d662978f6aab608df665fb51d1b31aa41e766867d04db02b791c5d3dc959fd27741675a827509f17b861c2bbb3fcccc0425172d59ff3de1129671972fbad542ed85a57897e4b2189f521330ede7171e77927ef512a3e822878c8d4feae82f8727bc4d9bdefd9ac57153ad8c5b1dfae7c3b501a550f5c50c40fa80c1b42795e84e6dc68bfecaa74019105206ace85d710f160907bdffbce96268b2b63680efac8a217810a053c2d0c0126b6888512802843effe1ffc8b6ff185e8bf518fa251c025fcbf26c9fd4bf8edf5e78995e43e34ab449fcbe58999888657348019e1f80dfaf27f809b6c353aa0195ff8419965c88005120a3b84ffada04d2759973c6204899f4ec20a079d53d0076c4f48a0ab466ab7d1455efbe6d37c410458981004366a69a945865dc8c6e626b918fb885350d3c37a27d05d03bc72c958079d0b632615d81b85a0ed6c266b1db2cfdabf025a53be690c3036baab1c4c9ee1069d13660471122cea34ebd4c742e5ee76b34cd5531f1a7cef079041e141556f75337958beab3995a2a2bc74934cbeff501377546a5c2af47d4e18f35a5df82d696d2970bd0cde4a9ad572685781ca7ce74e365a01fc070d5b78b941ffe9038543b88860881c9cc6133b92227c8884e1bcc1fe48a2753b221a25f5a03a79141194843a8a9840d192bc5390558ac77ab8311d23b2c46e33cd39c452b0a294965cec8ea4717600393ae6abf153fad5187af4ce6b3af03d8d792ae254d5b0b1f6b1bc065a97aa01101932a339c05527faa468542923be79b4b06dfe70920d57d1da73a9c16f9c9a12d810d7de0d12467dcf1c2ce20f7799260d83773a77e10ca411b3d77d8bc651add211c862accaa72e5580d72a70c4126ddb0beb16f9f436da01ed2de36ecfbe4da1b5e34c11d6c088c226d166da2c7bf8c357d8aa9abf6d0025900b977b11467ec16dc70efeef2929af8eba2bbdf94c633107be49cc9b15a2f73cff0e432370adaba9c23fa64c576d8818dfed9ee2fa19be9c0a99122fd73ee15476bc598ec386eb0a8332ba96c1e0b665d130ff520ba8c6655bfd0de618308e77112620abc566ea0088acae56ff0fe4e63c7a51df078ce324110a12466f2469054ce02b12dcda331c20e1f3f575678e2a603e28d264228f38c824c1c92296eb9f885eeb5c905d50ce0a971e0aab740ca2eb0106e4a8263523fff18f0708e480966206f3d1866ccd969420af0f37b1fad03b475e7e49f47f6616e4fc5858a9e29a588cb71a1594f3f66c03096b709dd332ef959217d019c88fab637c65b8636c0bda34a7aec4428e6de0d2cfa80cb4205b66506439c102aaf13c1181879e8d977b75b368081901d77d9104645d52815cba3e2c376ca34b914b2763ce667194ff69a97d5aae9a6f79a60b1c59f3f88202cfd57d7e28ed5105ee2bdea56ae8260e46e3f7121abec7df679d8f32f455329d1cdab8bae705bf836a87e6990d58ad4ea3c3a500d4fcc79342f6d161e6ff2f9621bc82703f82e39440ea102bd649872af0b72ba955dadb1fb8758779345cb5886ed95f308afb69b2f1b0ffd05e31603dce3cef9e15ef7eff48b815eb750470ee54dfa36e61c5be6a0d7aea28fdb6b4f18cc36541ada11f9c742d112b217cee22842df3ac4c886e13e4b673884d4ff1e0ccf9212685765971bb42eddab22c99df7d42c45cb399d55b27e23090b543a385ff3ca7cf25f5a9398ea8105cafa9e07f90cc9a022f90a0aa378c85b4de58465ba41c7dae17958b4e7ebb3d33926b7e8d7f19f93f39033c8ba423f77720e456cc5bf6f745c2ec7c1b0bfaa8f1d2e7a08398c9465638482579fe371a5a158e5162777ab918c0410839a6f5081a19b512fc5e391609c5f5d7ef963452d0249cc2b8971647a998599c24e028cf1eaf4a32426017fcac6a82e0670cba256be6b627392b48078aa39cb457480452623c1d8b002eb44ec08e85cb8ad227269fd4610b5eb48e9d1e7a70ed6b3f26569728b589b02abca0e8ba64f5a58709caee6603cbb3b3585cd7957cb3bb35fd302ffd88aadcd47f778776a6fb419be086da243504b2b833eb688d1683d1dcf7739f333d8ad0ccab571f3bd249096139eee5877b22e633bfad23b9e4fa4994a39557621a9656639eb422725d6b47a7746783182cc2c8a65a36bbb45e638ced901a0af2c669b849e81343c2cede96bf2e85555ee040c480720c7304e97c16583b760c7db75180d005e8d5a5ad1f7118d6ccbeb43c498472b592ec142c906055143dee6b63fa4aa686c95a836eaa6164fba231c0773962cd836ea96a7e3d057498d6232462c0603dd92964f48a1be1f41baa50fc478cfa2179f42d8084fe703767e34d612a508bf67b8d677185c06d7695598ed013d0b4fef7c7dafea7413b0ddfc9bf8a31070860ec69e462f8447e3d17146dd472911db68b5e442d7ba1c0688f0e1c17fd60702dba536e7148249ee81f7f5081da4abef8a32bfba5689c9af7e434c58306095d9d53be6804fbcd49e7fd0ee950b169f335edc563ef049e350c7db25e53e15e2b30571f63a699cb09bd5e279ad99e7b64eeb99f0f72b6232946ca2b3922f5cb5397130ad3ce989a48e8b17dd785080b8e93952d60d923d7e20747f40858d9fd812235e55af57eb7a1fa756641db7476dab51f051a7aa408f9fe75912e6df4511e723e434ba3c29f8f5338654c557a59d3d3a59a7edfdd42db7cd1a72deaeb6296077ab92861eade7b93691f697b6030f46fc77200812621f102fa9a8958159e824299ab93a88de0e12b95e92bc5ec78c6fa030062071502e5314eefc32e09815dc4198f0ffff2437a9c3d5705bd75bdc602d6e9f5ca307222885d1b6dd53da7a2fc58f7efd0de728255cded79da725c7c0ab1835e52ff0c336893a1dc06388ddc6bf66ac5b398faa308c6111aa588f153723160ee39d72d82628117a00970807483605c2420b84856f5c4664a972ff8d6f9c50727d76f42b9f6a3e15c878c3c05e335408d90c2f818cd37519c27bdff80d1eadabdb40e0824a58a9363e8d21cfb0bd3ac549c3f6662ffad7771ffd961ebcb1180026869da6cff93b258a5e8bfee5dca243b9b942fbffd752c8e57f8cc7225e76b886cd935fd556da29d5736713a69871c852747c09a575cf523f8a29bbe72cb01c229f2a7404756f8c47551ed79afa909d3b7e0a58c8d9375f53a5d5c1b424ae742383caaf0660e394078b19126a09e70a9d5f56b0110d70354958f8a3314c5808b002dbd6801f1c8a3e9dbf8cbdce5e56a09dc6d92818641c4a2bfa2705ae961ff2a3c5b21db804b61314770c3c4fdecb6bc2c49ab402f95e7ea74316d852510211eef00b8235825faf76ab5c8f964daf2756b7bd5ed319420c533b37543e6ffa346bc5a95a9d7dce394ec2425dab954bfbdf0708cd94ab0f1cb74b541f7cda4d83a3aa534bf9df4cda2124874e949ce710e71b44a94d970ed85cd933e1147843271d08d3fd508f1fba7938f30b5b4ccb8ef55d399c04c58766c94f9d430c3326486148ef1aaa758f00dd684d3c088b3e9c9234ae4cc31dc1ee86135aec6ef23c0df8d070471079e6d5d61c5f89a143896244086c61918606991c8f3286429dcf9f690a1d2e88836a60ebbaef98305bf50996423c8477eb9c8e1229edb68e1b25263c5cc0771d7b65caa4abc614bcbbc8b90d48e45d7b31ccf6f04b52265c5686c9fa301fcad4491d3a8957aca34e4b4a9933832c93a841def93f5c2b7eb3353cb02aed04cdb7d5dbd9232668ededf3c5d28f5bdecf03031abe86c43e659ca08e0454fb352bcd07e6cef981c49ba19b7f8ba939c0b8965fc86e4dea54841d7fc3ed00c27a8a1ec8884293ce8655722bc1ed0a839cf7683e2f301d38348341ba2492b7aa9d93b3fe075d7a7677c2698bd32039a338338186982d7c15a8090d3af91c001b64ed9393ac4635e25f8b8da3fd4bbeff5c15ea214b8df5e976be8be58ab2647d9940c66dbf264c790658e75b87972201d244aaf590770d1d674cc2a41e7d6a3802365576882448a233d07d9cb82bec0f6169c9ecaf134e174358ba60fea59ab4687547944e69b0c7b09b594cda30a493d02c50edef8a3f40d28d7cff73517c5992a5a4b15b1d0c4f4362835533cdd3f4e83446df9a046800db900f6bc3a999904a6f75b4f566e5a2b5cd019d0c2b009a712ab3acf6a852c0280c7b8a36d678bf567bc185656fc128cd83dd0eac71b3ed33b59f3b4c9f84e67fa7c9461600a1507f70900cf35e2b49552d1f8f5dc87455f57e1374e31186dca9090085a94e9da98df6ea31e65ca86d1372cd076558cc3a812d163f0525e1086edb283139e9f33448b7d8dc8890c2fcd1fbf1600d4842049d69b184f8031cd495c54a310cf92b57785861f51f23005e556f92819dc15f1b12daeb2b05d4bfa7e86e6c6d6aa5ce7ce4848e64f43ceafb6777b9525deaa9e7a729cc1c74c053e82d7f99cd9d15630a55e166114f04093bd1bb6dbb94ecaad126fe5c408dee5f012d9fd639ec7272699317f1e477a3e4875ae2b6a48ceeea3f5500a47d98876b59b0772d999ee4830066cf37c6b6400445c9959cf58b19f09afed8abbcdcb2ff587eafa5d5fc921f3996b1419d5203efdfe77b2896da94444be72e79e6a298a4665eee46d54ea5cd7bea64165394152fbb7c3d616fc1886eb8d9a917e13260e1eb19dc1982dc44162f2b91becec49e4c4350825069871df64b9bf18c97d4333f4f772225c2ed9881bb21df42f82ac5ccdd2af3fb6a767a656bf7afe0eed03945fa4068737ecac9968894f7a9b70eb339f3d3376c5bd4c8437fb38b1cd06d997b553c55099fbcfeddfe4c80fbf5b7901aec14f7ab25ea2e16f1982c4724f47c69c63392f10b095fdf85102340996e83f830b3dbbeae00d568286e3b69d2ad0998b6ecc733acf9152386aa88818b7bb45a27788aafe05ee5c08cfd5f8bc1e0698f8e309bd568d6483167e056c6b3264cc8392dad86a24b85a7850c41b3dbd5c3d6b4c7b6e129e61f92927b3515f9b773cace98eb49db11dda47b6588ec07d440f69279c15ed673c3cd6d43cf78457550e94e83ed0275f6163fd6cedd3b2d2408768e0e645557c35c6a62ffc9f67fa90cac21b45bb857435800fe10e8aa360e42de124d46cd941e11f2d879ce978f9bce9caff3dc74693fca705cf3504008da17b785ff10ce74ce0aec377784645d93bf3f600a183d93349516563ebe058cd0ae874fec6961e21a70e0e6c29364d1d907209dbfb81bbd68e07a55bbd902aa3730d9d8dcfa8cc3496b564f22a4a0d4b4cdc4ccdc6416cf24d425c2304a3e4b59c43287976b5900a422d7d95e5f1e4c6e39b55727c337b1b0999e0366b8c1557c931cc6e463d08173beeaec406be8234d757aa4697e854c54566d8225cc94b2e9c41efd8d8af82efe6618f08e71063f9aa69b1d693c088658341ba5342ebe48e880c1925889d9ef8c43e84d11187e8a9cf7a028f1a6c948035a2fd65d854701c0ef8bee0e087bad667de26c91095aea9d8e122fc764cf7b9ff0317c667938c3bb38067977aee74ed53b8eb3d6eba249e3937999b41d23057220aafe18b498781f84ba9b5a2424bc1fa5758ba7675c8eb72f5bce8079cbd0c51021c63bdb6f0735fa2ebd80123add8ce41e5dcd2592a161894236f322d1c2dfe81e3b9799c65845c3ea45b21e329b6620118f11cc4b6a29cbb539d5bd3cc50ad129c5f393a4539706769db6f313ddf380d78b390490d0571a3d3fedf515c08cf3cbcc197411e072ec5b2b5437e58a7d2df7b70d7768be32a161b0046f639aae758bb8cfe215e7209d20595693b08c4a4ff97d57cbdb190385a9f4e2d62e3db87ff2f2de85b950e7404d8e82ae7dcaa20d6644dda8f1ca12f19d734fd07f90f23b87e00e07040310fd6a31a231532ccf8fc57368b7b3b9a70bc69513055d7ba3cfd2eb260dffe8e2fd00ac7cc33b9a18fe9e74c09f28ce0afbabc3f51fd0e615635b7bf042b0e8a7689666d90d3cfcc4827aaead0958f282ead463bfc3e0b98e20abf9324b21e9a566b5c780b65e3a1c42df89f79d4c0b5900cadf379b96dc572d49cbb5d35ad4261de4373b67a93d6867586d65020b02d564149d264ff938b8b3bd5b4180619270b8ab1ed0c826ebf0186ac2c1e19dc03f3f3a07538711b3f8da90109efa400acb5d92e40880dc2dfb7e9ff0d1e10b2cdfb8c58388eae73661c9495193eaff23813522f1ab38d4ecd2c07e5f5eab5c2dfcf83c7b8b2082aa39a97088e9f8a4c7d967e2ae8197140ebe088f782fe698addf26275625d2ebf5c9a18d1c68cb39dd1a1b5b815146a67c057b5ba10e3bc893d16b0f7c1ea8280159da2975d80cc54c8d7b13d3e5ec911fef436943c152f3c718ef7a553e4943b4317ccbfb016251fe7aac940d0332dedec68841c711d22130fcd9f3494d5e43f898aefc16ab76e4da29d9669574c094a0d0716c93c6645ab8c751ffc0128e31b4d898432e9df086c8e1280fd5003dbb4f57277111a8afa746bf812822568214d0376328aba0773fb0ebc119336e525cd2a1d2d8a87e5c0fc32e8ff5d7e1e1f433fe3733f57cb3187a8fcd0c1988a67e11f6982abf12129b155aa3ee477b54dac774 MD = cd200254e5a8cf6e0923e70fc2cf3ce26ccfe07366a1c5e14944959078dfb803cd0d0289132a45bcad2bc290605f33e90184d306f35f0522e3d1a315da594bbd Len = 46960 Msg = a19f65ffdafd6ad5ee43570f7e168f94a8b4a7b7402ac80b5dc7557818d0ce8e9075f51a32042ff7375d2c276da6ca223b40376edff95670fb8365825025dc46c9b09839bbb5388b6bf5c82ed1199d2d9ba37f3f75250e9c88b05e0f4090e54c53369785ff764f3893f3714b30d7cd5ad1c7c7508916b5340c388946717ab04b36f13a2585b03aa6b53e70a614482553e49257c9a33316e390022e506a4c06e97bc8c841d5ccc27edcc00d6804d46cc0dcee76d34ce6f84f1af69554b36cafce29a28b037830af680d608fb989e36948c2c26e960a972220b5fc057bd54473a34869c991f546c90b520640c02adde5949df6853968ac5dff66fcc8ed573a1a10e104cb13d475d810b29a66a66f2aa84c757104e4eb8e719437de24d1c1b86bbcfa5bd9b29e24a31e36054a92e0327a17521d33c11da526862f8a624f9c252f509e563a95dabdf3dee42d34ad065d239d3de159f58559447d56e9c9916fe92e73d2dd38e610a790f8c6fb6b1f68146a873da5bfabab139223b5e1a3bcc26c30cea0d819cac84a4213e457390f8ebd197d5b51ae091839d91d535b36fb1e15fd090f2f266b8b0ed1d7442ae4a501c2f6269ece6c375335e1163940cc74094e5ccb27caa7f1e05b04eef05ab50b4889ca2b0e02415ee46d72b46d76ab4f0d7f17bcf191e4845099a4fdf0d1f466eb7c5c33b3d677a6544b549ff9e71bb5b20ef485746d244a623079af4a75e9e1730176e7963255362a354e80e47966ce7f64bcceb944b16e9e884ba90830dca16782deefbeff2237ee952aff3716d3c1fce9363ec600d1168c09e29632e914d14f665df2332327d029d2aec3f9a5a9b7b1052c7ea587cd6bb51c061cce88da97b415bb99fe88ac2a6254a375320e31d7272164365ec3ed94a0277ee3e6f4761b1cf7c08b2614f86c2183d0bceb39b34ae5a3a80df79a78b9d59413948117308612743470b3b155bfeec7ff412b0e763773f5beab7af6b804ddc98dd7a8d84f001bf4def2ae46094b5288f6acfa75c4c75a7d6eb9eebef39b3f30b453621f1db0c1df87b71ebb5d37d42e7ea46056e32121a582df5cda72a6832f4fb1b7d4e0bf8b9df7670bf899acfd215fd166991c6f50d4c0c4cb317d4e32302898afe0e1550196f6ab7de405d153c961dc1326b7d67071f21143ad5bbad39a05b153296898ac324c2b7d69e9cf608f4c6d70e5fc8008e6de6dcd355614eed5afa4aa98bdb313dac08e126e8ccdacd9e72b83be3395a09a4d816fb2b4810b49ee18bc1527ccbff41c7c45dc37f4bd10fbbf569aa33cc0f506f5330abe2bb35e89b69289ef0c36ea269f1d99326c1d9d50d0f15f959ef15fd3702126bc3a6d7c4a2533da5e9a0222a79ca28ec55c54e6ae075af751e3ba407a9a40eef6d6c20bf70da7f2ba9faa06661edca338ece855dd0c9b481f32a400c41c984ab32539735918f7b74b42b7fc2dcbd4c1d2466351a486bc3c47b33607799e31233d525a1c38ec2a135bacb06ec24b91cedc8f4d41cd1ec3ba1090f8be61c7145fda83ad6e5c3148ed30041dc3ee471bb39ef22c8f1e7bbaa9c4ee728b434048e8d3e1bbd28c905a2c1373876379677b5960958aa26046a8f3a9f82dd7e9b0d5a470930bae92b067ba4c2175b62b52b8a76aa0eee25a26967f07d3b00b19c0c47df8c1256b343b777e23356f24ccb1da84033ce1b7d6c48b3528aa838d9c181c5ab59592723bd69360e0d7fd15232beada7591ea899ac78ffd53a32fc73a5fe522ed35d92a6e2bc148ca31a8f1f969ee9006c691c070d8aabfcfe63b1fba3e27bfe9c982fa97e20b1e2a68f7201612f18eff035ec41e9fe563e59c2fffe65ceb18f17a164c7ca379ca48a7730a42cff8bca872dafe6cc347d1dded94ce846238154c6f1c87e71512356c14a21745480d0248388cd424edd9f2ff00f0f45df7179e44d21c129ee0de45ded70eb0e62437482880fcaf0cc4a2ac92feced939c48f9b1fc89e5769ade5e3e5193f3bee0c7f769170b3f8eef1aae8e00eb3e5e070a8f4267b2bbd122430f8cb02bc2226a7eb74c9303815901bf98f2f59298019a46a92a1134aac5fecc66ad6b90dcb539e862a18e91370baeb9887c807b712ad08de5bd8b7848c1aaeaf234f67baa040985580c8c3cd6f36088ebaf33fe60365430b38129060c60911f4097e334b07b43e625f20e5ed7ccb1ce30ef8293cbb07fefa1199c666c0f5be9c06aa46496a7638b4ad6778fbfe40cc9f6d1eee43a25be0b1cfb3801ee3a55caf011cc73c304f2d5354e6a3805d5ec2cbbeaeb683202b923a58a9e61197e39436e11ddfaac107c5483ae58f0300eda66fe9f0a8839e3dbb9d96c322c645750e3790f3b61d8566a99a49ab630c51b51f91d52cedcb825a04e0704859c5532471bdf5e6731ce434815167824823b77dd63b6caaace3364a150dcd82b6972bb865cdf8403f304638f4767eb066d19a0f737495b10e5420d5952b97b75ec333f99471814741df133bab0f757ee49d62319d45388b3ba4aac32d43b5307cd1d5afa3b07845a2b4b3054e273434eb1078acfcb43e7e5a5e3bdb845c0f35364a78a13d93c58089348e5e84c3a31aa2b0424739cc8dd394073ae6437e8d0db4b58398082051411fe90c0ef5edaa78320829ccfc920ed2102911ad11b117021f9a605cac6102cf8b5a96dc4aac3195c29d9601ec10a9c2f74b27f597fe955a9f8176b5d25ec174f60f92912b0920ba7bf9efb0b24d47ed70f6e4897c6cef5e5bf32d6b221e777688916af53f0a5f2f85a39d9ff651ce99a4b1b03069040d567c77ed4543a90a1e686784d02fbad63c072309975f25280fba04f3b106cdd78a29961e0cde0764b4bf194aeaa21e6e2929029a5f95d03b97db7715d5facf36418bd728889a416b80b430220b41400d3d15c7b7c1415af1782f937e64ee1210c5cac27481205d09c9703376fab4279cc1f0faca830bcc30fcdddf9726899f4f5c0ddf68bf176625d91baaad80a2db04fde5233a6e9a2de2690ee4c6e2747dd94f7cb76d092861a6f6dc1d2f65b4652b3919cb6f4a9785ee08e928746256b498e641d1ec29fb587669db15647191ccfbbdb779d1dfa9dc3c2197350a6cd84d726881b54be537527c7a411ab46be1185bd0e5b6c8f4793bb4fc3f93eec9a24f511f67ecf4068458a07036b2871d4e5132bccb09bc53aea93ee00ac88a415bc21c5118fd4d548c71ca95e167454d7e806ac793fa15c2f12fc217205e459babaebb47bf70c096f4a5e22f6bc056c419adea3a62113b0aead428e7a8dd86a13c1c154982ceb39667fcd087fb45224ac8de9a5d63d796f340a05899cacbb719b313149e899e901a8b7f7ce5ba7f12a7331d6277bbd38e449c9b3a74b0b23fccbb9c9f90fd68beeb0835cf90d0f58ca201712ad2958e8cc7a5ceb7c27f198682fabe9e6506b5a5d18727afd2642ff904dae3dab4178ef6420440b5c96289f4021881fa66cb0bad93b05b05f19eb6c29568795a66695d367e60f91dd37f89f116beed99db75f53efb2adbba36a7114d1d503d9230b483b2436202d826fea1e584940b640c2bf8c0cf9eafb4e9a7c804643d376b592086d458b262cd0a0859381541e24340169e9bd8b3dddd52c5644e31d56ecb2bd4f00387f721e3c9c53a52916e7a1fc15e6e37de126f1cb92a6c924ec0ea9cecf948a696d94804aa5ccb9bc0c2dcded52af0fda9626c5865fe683a81a7b3c4e5b617274e02de17f4f5947c6ae60f6ac5a2ad53004cdd7b9f68e1ad9332d22d5e34e4ed7717eb03f0ba1e5b56811ba9d9f02ca2ac78c96caf905e534c084ebd9e9a3760d9c378b2e6d1f0a14d3c09855839f553768d3813dd9f679473d22f5eef1198e83bac8b0b1d6293b717bfe0e58ca891cc2334335871bd84d8d2377df797c190ed677a2ff6df968d037cb1a8b0bb6287777e14c023b2113e872fe0416fdfd1a6d723d6695b729468ef44ba6ad02e925fbb4ed6ea5ce9c41c09537483b00f6a630e386843221f85abe236832d2c2d5ea2ff5a21b6eb5efda7c6069c49a16fb34efa6ed7c4342e91df441bb4f9acffeed7ad6b9e2eb859e565270f009d2a47d5ef048ccbf477e7df8b7cbbf5d638ee6b862c49f459ac22a4e09238478633def7ce925ceedcd4929837f4deeccdb840fd38e4bccc3fad0061a070471a0da47d42740ea4e5833376e36c134c44e5143ecb733d8ccee9a43d452b2a052038656cde68de2d5bf27ddce9b041cca3273430fec29f80a15e7a1f770b263a02115ff3f2326cbff62f980cd28ee628b299015ebdaa7262eea615ef1fc8ceae67a0785aa65b1e225e446e4ec58b6a261845610f31b51ef85cca5ff467e88928f8ec99e8236a5e1d3c38e6eaea31368f7d333d8d826a0b0b94d13f7875f5be725dfdabe691e793793814e7276a07b02a8b6a7e1ed751a1623dc39cc17177d7523ddb949c185a24fef9df5b4f6d9541c1e8f20a0b58f349c700a9601884f43b91408f3e52de4c7b7428a129a81a64511a3cd3cb9c2fd76900858a72c5d6f652f70f208f500e45ffa36c63397b9afb49ff3015a81881866bd6736eba108e04844b529671ddcecb18536e2c730f15e28f366bc188c97986b511735d2041d4a73957b0f9cb4346682e4bd604bfaeb2a28d8796df55f53c61b1792c608c9fd265d9e1d25284c8a0a3a9544bf3059e99c2aabc5975f6e5f59ec5d5477ee673adc9ccb260a886b50104f23675022d28f3ca4d9b5b8d53e1cac65bef6bc0160590587a920104b85293146fb9fd381f94e843e0ee452e5430e360da8d412c049da19c4c485d6d02e67e5a89a48b9ec32a9fb4ca7bbe61e11c69f4aa7870cd9983081ca89e1deb4cbbea5fa8c1c63a013241a5730b6f2de2eb840b3378a1a8bbfeee60f75ae9867e17fea935d65716c2f3f59e4365009a3fe65b2cdc557cc753587bf1a24568478143e2c296ace53aecb6e428a25318b0e05517df0fd6a8314ad7d6560f2743353b87bf32350b19ac69c335caf89b5f78ad80dfac34c4ceee86c42817a8c82259952abd7f79bb9b761f62110dad067ff98faedc1cb1e79507f16798bdd4efabb977760333c98312a0f8dba078295c1d3b6c2936b6ef07a68372074fcffa66895fcab1bad58f2c2730db750993d465e4472e37140256eca86af0ed74d584f36253742409ee327f8130af7975e617e87924bb219e894f5d44c455623057d95fdf9b5f1719051a41c9a75e2f0bfa58af87dafd2ffed24024229a88acabde6171a74171d111a2af3da69ecfdff4560080b472daa859669207e9f371130cf184f3634d949c1a4e583ac11cead157827824a8f33cd6dacbaecf42d8f8e17c19aaabbac5afbe5c8f80ffc129974d5d0727630c650affa68bfa44d450055c22dd3b6355b3aa80fef08c554fcdbe9a2e6c740488d12c6ce82ee02d486380ce27c59fe1db1e6d2a29f6e50413114701f139c9d1c33e8965c63ac7534519517db2593eeef50fdf04042bf3d4b4fc1acacff78d9066b40b316839177f747b60b2ec2281514b8dea56b8161e8ddb97203def2d270a183b991af7b237777c9095b4fca7ced484a075676c3fcff62fe93fa17a63010782dc1b669b2e91030761d9cd0b708e3d48506980492f6cd859fa60409721824f4c9e7a5e7b348cedbaf4124341062a5541a6ace9776d5ffb00d26c606ff012a91d8a9c4ac04c90fc3f532a5fc5f008e415a927ea1d810e27cd7a494a295719de9da66a7291fe05f73e860769c0b692b26c62c2cb63f4e32467f9e146eedfffb775fccc1d17d354a75e9393a959e12f86efd766d3724d44b978571a9be60e2df94d94ab957a52e3d44884b466b9f846294512f94b72149bb0a59cde93386f096fcc74ed20e1041b45a46154ea07834164171b647b8bd24fcf98d114740d87fce09ba67c07746f64c419305a7b6c0b87fd0df890abe30dc8dff9fea4878ce06f1362323e925d1d27174ffbae62101780bcceb36423a5506ea76f297514de01c8d1c81e1d08c196ca07efc938e71a2f946b0354c72af720a9f1a35c71632a7271e2757400b3cb60b75ca1a3e051b3db2bd053e1a30a0107e1833d9e7fbb99bcd00e123cced9a00554de0c908eea02a4adb56764df09ec8c7e26e4f8876653664f1d477c71c36b0d0b55d9982af8301182e0e6e46370e038e8a2407072aa7ff854d6bb3ed0b952fe4388afc39cc464ab1219796a1787049187bffa1126d045fa49021789d3027d626340371acc96c7f8c62ac8fde3958121c445bae08c1fcef59569026662e815c0d54519a4a2b6818204da7aa5afe47f7005fb27e78ce14271a0d325db65b142a1005ffc69076bb9d135f0386a63ba2504b3aaea2d0f5cc9f4d20827f3c4a62b8c4c568872e1fe976bc235a955e7609b67371aabbafbda890893cfb2b3670ff90921f166c61ab744da1171766d231e0a21f71311973aa1ad344bf26b253734d3a0e7f93e6d98dee8a68c6b46bbff3b9ab85d5dc4cbb2f95b016237fc501a5ce2da0637b77045bbaa559aedc245640172b6d0bf6d5e4d2cbbf540670d3cf9d14e3ee6707ad60796b371a2bd921538b6bba3b703b459f181f79a4d4a45f2bdd93e55f06f2fa7c8b62b820ea45d3365a39c057cef40c3883f3478f2a74d794cbddaa58afb7dec6f64390e456acba5d1103e66864cbaa4f9af9d159547ccd990c54cb81ddb0cace4e8059fafd785756644c84d3de1c9042c1957fba0f36b1b7038b91612d885ef0f8ab8bcb4b333ab0a896343097816ec09c58db27971d246d3604c45cfba90bdd8927aeebcc57d4da72537cf52d7486378fa65c08a89a862a3832acfbe49d41f274772bb2fd6096524616b7980c70872610107af39059678c7ea7e3c464cfa1ce4f2c9ae75ae82fa698528c9fb10fe20ac229c07f0ac438e27dd6e12ce8da9bdf7dba64cf6158e155ed995482c7ad17541a54c4e164558afaba322dbc0d28a09484a321f1bd3d5bdeba5db7d79cd2a7908d23e0e12997ce03b86c31e83e44508bf8795ae4aaf00faf83021f04bd0b035eaf19bce4e70582bbfcc79647f8b81c245d9f681ec73b7d46dc3902a0b4c0cb0cd498a17319193971fbe6b341c8ee640c08a7d216ae5a15432a650b21f0ae5f29b23347023c6d62c43a4c216c2b71d891ae054152ace67812f218810f1cfe4043ac7c1618cd5c9f313c6a592d9cccea53924a0e596f5b1644d7c60cde766b1ed947d5872d58713f3786b3d31c996a19d079d8c1a1524260372fe01706b96f3b58f8d212c64a45d3558ddb27afadd3c786a953d3b0e216e6887f09381e4265265153e4516a2f44ebf9d622bf6d5694a3e4c52ded0ebb5329b759a3d89badf78040ddaecb9f73e8f9b2d43d02bc00171f7941d956113a81aa22244280f54890a9a5ea73d9bcc4cc7d1f2c8caa3246f59ac2a3e8a77eec2cd8778367c9b1cecb330f2ee614687e49f67d23841e66a79ab65f6fde799e4cbf4525eb760b579cf19ccb0f6804292cfbf67b7dd5c7af8e80f28dfa2d1505d8a3609bb11fce6d3fbe4798009c01553d5ced888fd44e938832cffd0747223c1c83cb6798a79b59339bd3c4a6d4c4934bd75c32de121bb9014abf1aebcf29a784dad607f6bffab1f4f4c1ff66b4a669b515b2f8dd11a766a61330662c3793deae13210b5fcb54ee00538296d4be3f2f2572924921457a42d346d47d4ce2e95804c73cd0384c4293e25296295553e77a09886ab23f401cc415301bbec283929a055179f514d54c1a275c9d357d1847c0ddc1bca28b740770e86966b9318c381b3c6c78e879d8ca072bfbd839c06dc8aa1eb8f8b8aa63b2cfc97d45dafe5f42622652aa38dbd944d18c9b07a4a3d6f28c48c8bf62f091b73734c659b29d8f39f54fbe9e54bf59550fa5c48c14abe64dede89b712002807d4db6fee2dea39e974b04fab5daa8cb732823f2d5f85d1e43457a8bae7e54a28d89cc61a19d950fd2ea02b191190cc217a163c085ce2be17b397b23d7dc7b9a6061e1a8e69dd6458548a55da0be6fbfcb0201981c148cc24e2066ee7dd8cbba8e7c932f525e0be216ed896975395626f5c079f3f95a14434490da6610e1e99560106d8f553c9a78105f1b6f8ef8449a3073396ebe0d46e6e7112205218639bd9df3bd236fd8065a0a03d7da4e99af7bf380cc62cabc992fbe17fa5630445085906d2e9612aec40a5c724b34449c1b6ec78faf6abfd68f80221bafd3cd9ab2afd0031e51ee3f782b8020e1f7f15e0cc524e65f010de99e8acba2df0849f7c47ee53c28e142f887103da63 MD = 52ef6d43536b1fbf828b21b669fd459acd71e0ed8c67b97e9a7a79f145cb3a5210143d692ee36db3a09ddbd18bb26f8c50f473919e38e07614b8a0cff6e11012 Len = 47752 Msg = 4b91efb861462b30b26bb5e8c8b08ab8a959f396069c5915b54a5a2c62b21d3981c3e2458670dd8a5959443204a7a762af378077cffc0b909a9e574cbe679dd55260d21d0db77867b664b90adb0cb671c6261d67ad5cf9912934cf3ce9efe65aa8b2e6c65ce3a5d0b1d63df5b5a962eed56cf2ed0885ce234a53e9854c129ed06aff47caddbc0bcb32f5f77dfa4450e0c45228914840304be545cdae4e986e3f80901cb1f7095363210b102913a62b4f7b20e7dbd553c813e250a43f5648fdb0d1ad8e011194249d665eaf8166979944e11e565418863d8229bd96c1ceebf42a479dc54495232783e936fd0e5cdf42c5e0949e8377a337a0a3d4cabb1d49fab6c9aae801ea7f031c93dd22575e45d0dd5fc9e6f05b70607636dc69b5ab2ab85b401a1fc1787061704a9a45e5d292e891470657242db75d0bcb1f9a37e056d5219236940ba7bee988f7b48e3e218e34eb7e9319a6533ed9684be386ca2494fa10a8466c67df30426b837426ecb4015cf2edb853fe37ce7a939c7154f5dfaecf316a92d25d888f1521d4223577f2b308ae7cbd2eb53f2ee896a8112d41796afb8bc061ec760aa309b3d406e265426cdf2814e9d152d528cc79550a39355a91272693fde239cd34c728696756400ef389679b85645d6082ce428da69f59eaebfa0bc9acdd2f3a0af6887d8fb98fbd11af73fbd9115f480595fb372b8835923f1d414cb705deb7ec3fdcf7c432dbb78ef9551a2dfedff479caab3be21b52b85737d0026681d0ada44a2bbf4fe9ab63320e14e2c95365cea6145b81138137c6f9f1c1d5007a8d85f8be7dbd7807872bc497b839f439793d531c12f006e16c22eef31baccf179ba5b144dad986b4f7760e3b4a09f8d8a4a94a8ad87202647a36fde4e66e1981847797834bfbc31784add6a3d1391b576d7a5105b5ee5132e868f06d2b0527dfd0617124d70b7559b536e57655b1a6de5d193135b24d39723e228e35f158415a05cd09ce87f1e5a1137a035ddf59e197faecb2c3d675034d05cb9ee5404fae1aad22252a62955b1825e1f700751913a8cf5c9b572a4ff6eac4cae92420d2b8464fc88edf70df1ee673d48b0622d9853961d2b698b4c35c720389379b9ac9a50674270c96b9b8783285b98518eb8180733ab4c92f7eba7b0c4a6f4ff1b51cbe84a3a766f74606af24e4f9aedddaf94a7de16b9dc3901a9de122e4fbcf7ab44be564b066a91eb30ce617fdcefef6292b80de60fafdf0cd0818125001ddef7794543faad25549a5d79da62cad2247f96da4bafaa785a8b904daa31c2ac21e4ee0f7bdfd73a2d0c658741aed12f2d6525710fca06e02c0c8db4f5bae3e270f2179f665111139bafcd791f9aac715aa1a30ed2cbc151d3ee1d39ec56f05b3c9d9a57ac04e74c10f319b1cceca9234cb3b4162d2b5657d2ceb36f066c7470f545cadab541d63e3d74ced3e1eb53cf7429bd29877f326ca91d04a6cc81fcbe2b894d9b0ace4a7471b35151e73d28d0516242ab7a2de20ae7677583b72dd5ad5fd6870b24d0c0894e3d45be6548b4c074fbc93e6dcde1acfe2c8a784ec6bbc902cbfbcd8c1fe4e73351106bb4a4743a4f64d534dac5bded5ddab8170bf2fb9ba4d83034b8f21418b1bd460c7dc6f388512beb3159abd326970082c27729318fb669b8e323fdca9859c05af329269f452abf7fb662e6cdf33a1c7f1d08dfda3fd81efa5b659994d08c08c3c24f49e3fb2cae07367f1d0adda7ad0189398d72065a5678fff66bff6bd90514fc48b76e04d756163416a516307030be9991c8858dedbeb9634eeb66c4b133c303ade5aa1ccb762121b2258cb614361ac0aa178130e2a63007d77e5775c523626af75b048d795cbc91e9f4bab9142b8a80ead0f199d9ab716038bb6df9553257a4bd9e19e151984d0726b94cc3e08fa26cbcab5313433cf20eeb1906ba020f3753591566b2f4a756f3e0e99f6119e0d6e6c7fd2257bfe93666672dbe525c1865c96257677cc3087eeaa0ec4f0b10bdbc81754cebb1902ec2f92540013cb3cc87a951ea88995d4a094e0f57c84c8574a7cf5d211bcb747c0c59ae165bd3b9b9f165b03566b323da9aa054a2878fb8b44d12d8003effcd6f96ea7a173ad1de6f5770f5ce7e34a738b7844963295f4adb010e7e70d1e91b67d73e11b92aa1823b1e6dab2c3ba857f2c46c36001a35bc875824d8d950f1def361c6fd72b7bd45cbbabe48b52b88d68765caa30fd6ad7e17d6c84fc058b498a0ab0795da4e9fa98fb0e5472fba407365001228e8eb11102af19b7bcc35abd8ee379293667bc32e0595752ec29479ef2a17f53031c42b132f3d00c5339442003a8bda5e9dabc233bbdcd0883416af8a3531c64160fe35e7a31d8ab4bcd111af241c515fe67b076b10fb99cbeacd3bd514d217d50cf5dc0e0517abd2ce988556295d9a2fd7562d24a37633625d24b960477d6c838c478806f3cfe6a7cf473765b8e40746f6b98e00f1d13ff411b992bc5b9826a5657fb462cd8acd9c5569828e51344b2dcb31b4807a9111e99f087239bfb6e8e32eeb0b9210ecb338e76bf11090d2b84cab4b3b13ac4a4bcb6b7db268f25e35a55f35d8255c7a59f60beb2d9ce623e13c3d627c3b15416011eda5edea81f27f646cccb49d0e98046c29538293dfbc5874e8141277342ad145bbfd8f0eed1828b8de3c2b59b5da5503c6318a95cc00808f41dc7858877b21ef5d0110769243e41b39e0a6ebd0c5ce456911b0035994ebc3b128284f9da6c467273d0c922fea23f3f676a1d3edded2a998509d6d06fe1ceaec93acdcd5225b55c12dfde2049f5aeb9a5ab6a27b79f4b8ca8aad533280764d2a8b7080cc923923a1404ef6beb80b5a9bf95fc7f84bb6fb862c5a368ae09a73118c0dcbf26b00695e108a40cce8b7d981ff07c4e2b89bda31c24e877e72fbe52821ff1ed511239f4e1b2a40ad85d2e0e2c84919c94515ed73c8d4d66bdc0d1bd4c9af09e319152df7ccc986df340ef914e19e472a75b7adc2cc9793f17060afbe0fa81dab0777ade1a1c273e067ae8abed761cd74cee383852a0160adc478f93a4064baab50ad87a236cfa84f85442e37164e2d46b54c07518d9c9cdf6cc880d0288f7152994953aff82b847b31625c143abde70ecd33b1ae53e3c924cdd1ef261462c24f25bd8a716260a8f1e08b8cec913b7b3b7b4d1b020951760c6c178c8280a93def9a8ca47d0229865217224916c6416a5b43fa9be33a701404cc2c01ac19ad44b26c292a5963d09d0a49b90939465a24fccbbeccc853ca338c6261b6d93be967362f35a46ce3e06d98fcc255aaadf04b8e572c1637e1ca5531c36b34b0640815f938147b4e2ee3687ca4d0b70149ae3e8e8aa510a860eae96373ab03b82e73e16a2b58376381542e23e66695d3c5ee8e8beacc34905db660bfd7a3ac66f7a75a078d736143a7bd1f2d15f67a788f3bbbf4dc040a8634b77b9573d777235c2cd06fb2f87164ee78cc06c7f2fd8622003757f2df0b0082686a82dcd92ca3c87ef4f15049f05de221a53f80fe67731ae68133b3dfae85d343ee16870b153ed908383ada0a66951f525b35b57b70d5d6694a0683687d8c83d446bee6ffd97aea730abab49c3c80f2552e97f9fc8214e0d2c24f061be09b208434ea9129d1de8929ecdf6481eac807d4bfc4a2f413b6b6edba8ba06c802845ee19380a0b96d041a76f478e5e09c0cc4b8f4a64e4be41e504732ae6dcc4ba407c6415a637b1068076025186731211bc140da7a460ea2cf7a18cdb4ddf36d7ccb9b6021a1098d7e21036abe1838c2153d8cb5ae5db100e4b5f77eb4a065ef727208f9bca38b6cad3008ca523e1e076200448d29dc5c83c6c98c4f96fc4959f0c3b41213b12a365cfb164ebd220a786ad20f6ad50b39b5dd7e7e47423ac7345d8748b60e120d72f54bd6fce50c259e957b955599316d1d919c756ea1a1090721866bea95105ea8dfe8f0deb34397004cc27f555d9723434bea1bcd997b345aa488c6b890f14260829a0bfc0f118726f5717573098681b07131156b130e73b64d550127e7fee3234629cf5ce2bc1d99fa4e1eb68644afeb6d390e51f8a4eca186b4c33f827f6978935ce608128d83e0c1222326ba19d67ca5caac852e83c7a5b76fb40949bcfce8d1fcf50889ccde83b4b42bcb8e4f1eec83ac97119ff32d4a464c7d8c25fcc2fa68d1a7622dc1590b39cedfaeea2daec26da678fc313e46179c14c6d1fc89e636c0a3a120e8b419ffba36e7d6b7faaf86cd82f74fceab3994218e36deb8a98e24413a8e4aa1ec49e79eb5ea4bdbff48c10a06bb115d812f493d8476bd3fa5e34d545e14e640b20f4c4d1391164084a2fa8cfb6d4ac6094fbf59bc2e767bc50c385fd6dbfeac4e93b42f18833eccd0e4b9bb28b403f18bc27ddb00050f5250316dcc6b8c99cf08feaaac8c68cb692d3786ff573943c64eaf0b2d16a392ae907c7501e5cfc0902778b32c36eac6fee1c3eac04ea4122d9c3ff2b5c6b10676cb13d7680c4b7ad7f5285917dfaf367335af6c66d69c780ebb99b9dddad774924a1e1b67a7a9cf8cb83723d54f5f23b071249559b7c97e51f4e7e80c18bce3e955c6ca688090c798b9cd99ce4ea3959cdd49eb01b9d42bde8f4e08a94a095b6533326bd25da96be14010446aa4239521c147f8c7a465889dd4f8a01e3665e5ed2e8c860d079cc250952bab1218862a26644544113f239b760b0d38d2a579876a8cf9a3814610d4cdff44572c74745d940f6c554853b76e527bb4582d5eed4bc296a34b96e1aeaa41c784ce227e9735510ae4b5d5a8c809176d1689972b6839de94b205b4a21d4b9236129a5aff94ba469dd4ec1e06ff72af295b5278d29258a6ce4e5a434f05bfaa9217423ebe16f45b1064808d3504b300f7aa3c381c14b0028b9dd1abb1100f6f23ba4f3485c3ec79aabefb89fc7ed4f41f2bce3fd19649db15caf25490e442cb332448a61a43a986b407e5792516db72e80890f6b9bf2c17b2fb45a6b42960a5087cb5fb463f336b766ac4c77673d2619c660ac39b3860a0ab59530ae48872e4ebeb1f9bd15f9311380d22dab83ec0ab8170c50f41a8ed5c480ba3e6eaa87f7224990dee834ad05f4218861ab21eae37df4b484371b8dc35d039bda38c338f36fbad075c24a9f23cdbb479ef2ebca3ed00221bc5f41034128d0d2aaa93ceab18b84f954d7b2302924d0982c1f2bfa7b52b1bc7ff9257fddac5ad7162c623d900a2a9402951610648de3e29f8c8d0c277a75ed35712363f77c1411a32efda23d602e08f586e0a0946d77bf6fc7697fd1bbd14c7373e5403d0c9f2ae84d49b9182201f0b429ac7107480ea7236c4bb5f89b5652c06dc5a50cd24e7b4bf3f0d2aed448c3a4f9d4025ba20b0240c7ce5f1aad778882cb5ef2f561c4ab44af6d8f6fdb64fa6e83e1c4f0000f894e764bcba646a76661191bca753f740368fc1a5fd9bbd91d7734604972e69e84b3046e9c2a0b8864b1d3868c0acfef3c3f56a1c48b0a37a545a7e9f032ca1a8d04de813114707d1c1b8719c824a798be2e4b7e4de22ae31a503ab969ee2f061aba812e3b03fa07f4f4a0500f613b02f1cc472a6c7db27df52d898906d38a03b65a78e00a672cbb77e3bbd3b23f0ea08f8fe61090cc156abe33f0c367a17f85d85b42314fbc6d0a1d4f35ff612c9713efef84db6b4be82bee1a2ce30cc653ff0933698c4b725f666dbdab3d8c9878bf8b61bfd54c7b9f43fd468a7256b0cbe1b1895b6bae376862e1b58838a5210815ea9cf3b8c4e99f55742f95fbd60f2bd079b38459e87a1c8201bd695b3b54e9b9a5e7dcd064f48cb2eb5bdbea1b20183dba4890d17a98d046563bab2fcf82820d15d8b7c69d5adbeebb41c8c79691f5ac0bbefd5ce532482247b6ea20d25855a2e2f63105de5b018b7c87e90ec8e3688de69d2676b8c4d8986ec582d8d434f8fd65b6b518c89391fb9774b93a3272d565c359a89955df063b33ce21b255b6d08f4690d079bc8301d1a4ceb5d463fec0c63a8b004f4ccf656d2f673337c74c70daee2b0f935ab7d5801ccc6b67cdb5bf21a487a9f31e445ab0c9f723e3b9645e52c4dbbf00038091997814466ed056250aaa06124f4aac6aa88c1490509c9cfda973298b4a479baa703f2ce3442c4e96d3a35ce59e428619a6fe35f4d8f164d321719ae0dca76794c6ea7cae92321d892f3912708aa65ffc5e88e1ce17484a736d38b65c31a362f4e0029a24d37221707fd3bd5f7ee6986711c49e888611cc52ef40f259d3bc1c2f6e0ffbc2827d28e147fbb41ef573de0e7329c2b09fee58f62a12e5664d61f1c8c37b182429a362601a19ad2b78de8f36f530f4d2df2e7ee19036f60e0925923582cc85a633958c5158d5fef193972a950a72bb6bce62ac89d425aacd91875c1a1e8cbae52ac3f5499689202db03e4e8d45577cf7e81b707348577a0170f7eddb19342e5d89af3bcd55dbb72c692459a41867cfe3a6c959127f44fa56120795ece54b567bdac7de3119163a7a28f9da6e061c0acba4ecc50beb9692481f3702e4153ad9cc989e4b3952f110937a1f4f4f90fcd42c4d0652a40f94d833d2f6a3452b9b2ecc3d93013a85d4e004c71536cd4b72b26219a6709f7df842c5e7c705848ae4abf754669ea9443a1f4aba6c1f6b88260c29953dad429909585ac8489826d59ff7da57698229f0b924d1ae9477aef98f67df3a3c6731f3708f8eeecbd9a07e3588e1c11c5a212daa97362e2ece0bf2075bef93434cd21fa66ebee5f14885f73dd5aa2c0f65235db6fce4b38b810714263ef71ab2bcc760136c872839734bd32174aff2b351a4f336bc69c94b3f24c284a7724b3b457687500f643004d8768488dc4faf989e2aa0d26c41f9de66f9af7b1bedaf2d6563d7e4ddd297f3f67aadcc7315cd2fb928c8f262e9afc586da1da212c5a1099b23e43a3e5eba873bdc9164efaed6091123ee1f56ed65811d5abf721296eb60551b3ed8d765322f3720e1fa9857548554a082c1bea9b5a1a90fe76391ddc8c231ce4a390f82796c76cc11f603cbc354f2331981e0cb0aa7a85e280f1706d39fafb188e36d330abf5952a3dfc8689cd8683034c883bdfef399ba13dd28ae96692d799d6066f360a87d491a204caa6b80254c471e0deeed160bc82d463d318baf496ada28835015a84103d760072d99fcb7cbd2eaf5fa6faf6cfcc6d2cb4c2de27229d1a458b5844f53377e079e5eb2aeae536ac7c25cf0f03bbc832b693ae793361b168c4da0470e1248708f68ba40066757612cf9831bb906abe4988d9a534213d30b18d8bce8550cbb517ffcccbca4716c789302093a4a3c3f5da2bef6fb7f89d642029047b2c4b1049351c102a2f95af6f392825bf7247aeb70e253bd4a9c06893da1fafd60cd8db8a89d6bf87d85927b7493e0f7bce81134a0c00279cb28288060af7f3a6ce0214c13cb441ab6c9b68e7e2fb4690605bdaf7fd431a8e7b45e405d63a37b219cea336753ffe5e946159472be632c6cfdcec0609777c73ac1164d7666fe5c3964670315dfd5f67f8b5e21f4d873ce4c30c2fbf5723b413edeef0c6e31e64a1ec7164fa1c78ca903f9eebb66f66cab4e6f48c6a10cf2c36e4e5701875d01c14c45765d8d938a89f12255c55ba0c46fcdd9beb4e5b044ba43cfdcc16430b75e4c6015c15bdc3625d18501d4456001685530a35b4614879249b3fec08765ad7d8997632f7efa35e92fa2917cb6acaa417ee4750e44a261e80aab1b9363542aabae6becdc7976006065fb830321ef3567a565c26263d23a27e105d19e7a94d565054e217ccdf80c180f00451c09b02967534509ec262c96ee7754bf565fa0243638ce9f750ed8df6ca551563be097fcbd1302c9fffe29fe882838236f64fe9d9ba35db5499e90f0faa35f34c7490f25c56f1f71327e52d7919e00ac2e3d08b811ff8c118f0fc8c73e938a7f62a56e4b3cc20b9e18092fc897234eb8374a76fa1587da22a9d4e8e8a4f0738472886dd37fb647bf15312938157282d60f0f91ea32e6b8672e8069cbca34aae29b5466350ab66442be78d7ac78e63d940a1f11eed696b75d8194c3f71afa811831bbe0066a3ce1c77862a3ac5df8ef70dcdb4f9e9d1247844774afd1139ca6a3ca0183be1ac430bbd76115ae214518daebd6d36fd2d3f969e4b2561040a58c03e8d799c2a8e6d1ae5006b6285f353a50bb9425e934763d8cedd08f0b2eaf91c702a0baca711f550d76c60db18463d460c085bf812e53944bc75193484a05585babef6f2c1fc83b67b02174c02d3b67999f4e18ce2d068e5515b80b4e0f61503049362f7e019be52b90ab93dab6367459ac3fca36bd099c073d666f82fb2e19e36ef76416d2e4f2e7acb6d367bbdf8b2f7bed3c414ad74df0b30f389da9d605f39 MD = 398b4e5c2570d043e9a4a037b0a01be41ce56d58a26a6014ad7dc5bb435c86b4f8e1f8d9673b0e4a50e1e548352475af8b1081f3b618274a77182a49a1d9e877 Len = 48544 Msg = e9f1f2cf0b8d563e2d20f39f9f464a808b136dba364a644683d0ce52b960cb94857f1adf43b37ff479f0689aa453cff138136203e2b4e29c107dc95cb32d2f0a43eaee2b047a05d389b53abc763a04958a62a79cdc72a16f6415451fbe09a6872b18b6dcd94aaf856459b22c9c65ae1589e984aeacee6968887e8bc6615cf7b344f2ba19478b46af12c218139e3a98183d904161db8e012f83a2e377258eeb389660410bd8a593fc9cdab49805238947af4025dcf0bc336b5d67945a90074abb294b95d913005b110987cde45887484ae6df794873dfc5c41fb7e8992c2fdce70699fcac8004699961b3ad1e1fce9ec8ea5685ccec5e80e4d0792559816f68613434bfaca81a843aac459a6fe35f5369c48e9191e4a32c70789594c5152db8d4bb02260012a8739cf325ddff2aa42fd67b6ee5bfe31591131ff27d0273d292e6a4ed78d14618ff683e3bbef57f04fab717ddc97d6f1c7673ce7a283b20c7bf3ff6dcff46cdd0f046936f847967e77bb3a1c584f31220a5388d14dc96a5730788b9b601882e3a0eddfca979b56cb57b73200d5f4a5389e40b62a8e33b8b3d3169f565c7bef1bc20d680d1e3ce15d7c29f9c9da2aabac0fc94571f83535a8f0789b3d099119fc0f0d827cf0befeab318de1d5d953ad02bb57a735f050698d04f91fbdfbea9bfad448cfa8b393e74b245d8ac357f231c33d665be51b17bcf67d228d37a80add9ebe59a00edb5e33a3c1036500daa8c274029ff41ddcedb86be58f74589254676e29ba942dec607c5ba42a012cd5c9e77bb74ed03eca64d463ca9a658f4f69b1dfa2d61c644b5d29b92a3bdf85dde81960a80da0c647ffa96498cdc14a33bd5569b656c9609cb6b462efb360da5785c0c97156c652fa20afe4dca41827f3c1ba92d096fba134dfb4ef412b2568d71575fc9fa4b153357a406b02b7ea96e40969f18e215384c86a9394eb0daddfe139c1907f920245ae5f037db773b9259916dbfc4b8031a9abd9e91a39c56a9dea450c1bbd8939b8a96171834761f432975c9919953e468e73901dd5b9fcdc2176d9ee04c604b81adb0413224f0d3c6c435d29e007a5e281a43fba6de81e8318fb6acfd2259f1deaa7c950b14acff231419af6d5ff719641b23b473930a4efd30c7a2a0a58b2cbb69423c2d6a734a60006889871f90be23d22153cce401a72ee0e7a9523dbea51fd24a5e20900d5c876f6c8772a90ef56e2785013938309dcd895fe99952b90412cddb216aec42de9f4b6bd2b86438654c0296e543f85dd6e0127889004c45f09c423eb095e8da78b17bae91e0b7d8b7c54b9d28718a51fa726377b10c932a11c619bc3129ea9cd1c4e77ded730cb493e1eae2f14c57d4b28864a78b478f3010973a9bcdac5c5192e077200ef8ca969fa9c7ad695bc7aea62cfd4f3c38a81e95188d23aba8a5c1620d13de1bf758448624ca46b72643a67d6516b6ef6747be474ffb9ef4a42db4ea54a3003df92086ee5adcf405353185df3c9725ca5dd2d6cf466a52cf295cf2d2bc0fce9b8589268054e3017811fa1376b768e4f5a1b32fd405c38865be9a42c14e3f905e23fbeae319c8b33a410718e7e1713b99bb5091ff92ef88ddeb4f6e5f111b8ead5bde9cbfb17453734dbf5cddbf9b72de3413c4f8f7d59a6038e33c550d8c10b1b69b02be25ce284abe89a6fe5bccd0eb93638f663c5c06162ebe754b4a785d91bb98e5867cbd7ce81acfc0f2bced9ee960a7bbf2676e13265448e1e8d1c9be76f33e0cbfbe2b9575ecf87062eae725ff2449104382f20bb932ea47d5a9657b88e4f54112f4ffbc18b96c7ff6eea0aa5665b0560294cf34f6510a70bada36dcee18264a26252139f90b92b555cf027815ae4455d6a6efd7063812253d6d2228d11737f0a55978544169d4d92895f4d665846dd568bf393b106f682c096913a9586792fb3498ee55185c99b516485d0b6e71939d5fe795aa3d7f764dc4d6f0a5ac929d337deb6a83a56b4a0fc8f1276057fc1e766426eb6ab5efa25217bca165f420c2602859d528111e4db0e598391d49ae76281f8523c49f475601a9240d3159976849ddeb158a83fd0b6016437b8a6b0d037b370b26002310f92423151e510381f6b743a813f12491ece603fcd5eee6a32e3755c1da666bd1f3812c98bb0c1965d6720298b7a71c61590c53ca2f93e1f85d2320ad283e9c12abe16db4ccabc4cc6f42c3c3eaf392f5b898afb671bf8592f90841d9f8cfe15c8b0b8d713a762b3d29ef2e32921caed67253bec683bbfafb6bae5f4d33626035fac935d7ebb577406c40eaec986b9a8bf00529044dcf67bb1add2310bf3f412860e10defc8b0cf5da0fea0f9e5287b9c99769778b842f4586d5d342986aeadba261cbcc0b9af5c1d2df1f762609b7c92d46db129aa5ecb5ccef53ca36ff7cc75b242eb52a7f945077ce1982ef00bc2f40bb41f1f0c69114fa46fe0836161c5e06d1b41ae78d7b3a4f3962a657fc2784aa5118862c7acf1b75691cad34635c183bf6e67db1691ce7afbd75610f406c41d0a4d94fbc16f911e4e24a29b05bce7e7110504e1676fbd13fd6ec4353620cef3a130ecf1e4fa190bf3ef0fe1863b6093c9a6c1c955b8a9f75f211bdf2f58bf57d481384c1794b207adbcbaafb1fd530f511a469ac7b6b9ac8bb90313c6f5bfce0a0a1f1441868499e4514b0c6e49e9e40f293a5ca4af16bce7fe26dbe341f5e2ac914a524c19b64900776901a56649996d9a4618d6ece7afddb7293e6e828a1a20df610e1f92709f69f6bc943e9d9db6d13711d544b5550bd3aeb7455001a6fecfbc0b4ea23cdc248896edcf21360ac4a5c6449bd652885a33a976f66f066f1721eff01cbd5e1f5fc31fa4ba3679ba4a50108672740aa72364710e5bb4d810ec7f42b97f583f64d88358885c66add5d03add80630626dbefcece287c07c1af064f7b0e805b28d118310a42bd971c82decbf5d97574ee4b45d9876c5f510775ebfa639625ae618ea633fd7ae5b20ceafd6b1f3ab1a6aa20aded66810e78f38925e9c2fa783a32c40af3f9d7dda0c635b482254b1d85a281af7231109166cd133c8360e281e5e39bcdd7c601ac47928a8c78cdb3c4f71e97d4d0b1c0ee01dd3db62f04f44798bb3a76492ba15a91b7110cb5e01babe56589a36fae3a2f336a2d1d5778dbd23c03ca8db0f25ff0657ff4bca1252adc38c080a5b8f0255ce3be0bf862823d2ab704729b74e1e275aa305824a566895ed677a460113e2a7bf91f00d0b8ebc358f3035b27fcc1d3f14a1367cd2769df39a9d21c5ee361f1965cd6342cc17a1463d64bacb9b259d96c2c70493e91f7d57598181127972221b4f62bce94e4f9d9534a238ed9fd739def388f26ff49d8131b8a93aa41934762deae65f6908c2eb93036d2291045d5c68156b72599b9d440336989103641985e1b6cced6a91ee35d0381a1a4e5f348fd2b6e326e9347b304c31c436a8e08dfba7318ac936603de6cd415d828e16d94eaf468462a755d3c09d58b09e1cf4fe221ee9b485850a3e88fa9d9bfdc8a1c8134e42c3c81c86238f4709e239d83806a3995dbea4bed66c86e8cb59de96b68d78403a35c9a12be70709d3dd8c531023faa6fc1da94c8b548b08491bc7609ba5d815ab3ed9eded8a92363507182623d291d84355f5c66f62efd995562acee78dcd4f04539b4b11aaeb5cabf36fb9d99f03add20c2cb519343ffd4ead8b3a10c1d24cd42860515eb46cfda726f596a7e5ba881684c0810f24f5b3c3666b2aadce51afa901db991b338199c5164c35154341078f7423c2b7d1abcda2253d19252ff5e7e1946f7aedb4d3a17455d62db834119cbb3ef8e2a9a6bc8b496e93adfd4329761c348e7f2c94ddb5334a15d8f734b6c81869a2796b30b27d57b6e121ccc456dac786db2e7e600a3590879ddf68c19b0a2578a2ef72fc38242b72b84cea1018a661ffb80159a2d3b30a72d0a9637758e370d08ccd3765981043468b57fbb2e9397a03b78034e9e4ae0fb050bfada25ae47925c29b4f095cb24d86dd0b682943347e375c33968197972ea4809a7dff2b7dacdce6c21054109aa8d81fbfc5efa107fcff1883f526770ed5e402b27aca452f8a6a6bea31d23e29c3aed5ed8b729d2464ef6f09e7250d6593e339a00ab0326aa052b46c1a005ff04c7fa23d2f5ea22a548cd23dd329b53bf726a7dbd42d6dcf7d2a62d03f6ad07e91bed6f728003a8a3a3bf4884f9129126e12dfde3dbe71be8f55f9af187e3a35420116d41c03c0b484812881b2e7b359675c442fcddfc8c84579eb614bb717b4cbdad42c61e5ff39c1f0e0a2b3b9fea1715767390b0ded6d3deaba8f3fb1e36d9da08198900320aa810fdf73b874656b2a98cb925bc55a2dd73cd9916adb17d03606b1813cf7ff573042576d47a37216e1a4e3b45682998abff4eb1063bf3f7d3351e67ebf40c5f05e1d0b07d7c3cf4544e0422771e215f446874174a0bac4d5042692f99d5a1ee679144ccbef51b776a2ef695444606a0b09888f46a87a326836f9498a6dc084aa0fac9f31f4d9d51baa26cbd3246a002f875d16fef15a22b72a5e6c99970081cb806a94d29ec8a2a4c93adc1cb87b72e23e999b1601f6f0427caa8ebfaf8680cb89c2a01633baaac26e702ca977113cb39db26e2450cd358aac7232552def1c1a7a3963856a0c57d5288b3001d6d7b824332c228274496cf01859ca028896be48d0533198884a245d85c088ae5e1b9fb47d8b3ae8c2f801236eb5e8304619e1c73a94acd83500aadbe4d4891773693dd50b4419aff3559c951e0b0f76ece51126077227bcf6ac55c0e42bd3c5cd5d2d163aeb61505bee89c584ed924ef384e6e5c57054cf23c9bfcd022adb41b243e7e8aae58462832f631551c22310e075bd76f313968762c54320ad761203c8d9e8dcc9c7156eff94b334f32d34754a341f5a2ed07f6e3a4b7a8c64821a94777bba53260476ce27baf484f78348d4875c771fc73b71ebf0b8d060b5d3577c54a5e6fc2e322b18a20ea185cd68c2c72e3b7f385ab910a94c99ef3e2fee4b13e6d4d92860b4c4d6e51c34c7e34254b5a56d822467edddfe946b21851137780384a51b786c10c671774048cbd7a45138937f1a746d2e2c847e9911d6384360b3d483186c9eea9270bf3737f229035ac86eccb298e91e9eb351c02a91d39697bd4cfb7a657786cb6d434d9ceb45e3d3dd9df2e5124a13a703b47cf64891b58f78647a9c038499d3cfaa1fd217ccca4ee0b76e1c712ec1d80e1d0bef8ae104ba8d918d07b754784e003a0a91e80c3b4e9a31bae326058da43b020980a940189b557abf480145c68cb799ba370ca29b35329355b3b14cfb8e02f9f244544d75b478866dd76206f9325e3f9b4bd62e8ea57252cb1893838007fe7b52c4ec5780986f3b252069e674b15ca22a4ae4ee6a11a206778c5d37afb4a5ecb76d01fcedb9920f81cd8982ed9c3b57e3bea980d20c7a2507896ee7fee671e47cc715bc018a9979e039315ab85582c75411a4843ae84314e78a5902e24feaf93f4d980350adde10ecfe01ec696fcb76f7de56472947957c94299c16fe4389715b6b19617f75e85ae4866ba6756d6dfd4b8f4f6811bd09b299c1b892a753c6037dca1a64d28530be836cef1760b0f2b0cbaee055888ae85d74fd3f147203391602c50b6bfe5e5fc2360bfcbdbfece247f4b7c9adf263d9e39236800af2d45b3f77067d155763cdec68fe2517e773c50953346bcfe3ca56db8df83bf48e4994d666e8dfcf7227f3c3b8bdf8a48bd8139b739f3739d110e7bbd4dcb34fb8c58e714ef6b418d32d79be91c5d7f1f1ac4674b272bc7a4ee9f4eae33e969b16fa90a69baa9a7ffee6b85380a0436edd42d61bbc398c1fb1b8070f45a846650d3b53ccd99ee36359e6481901c7db99834e6af6dd6e0688ae0da69f88a4531c101a408a852e2f7178ae918591b7010098214d9cb27abc53a85d5bf218ad3d4ed419df362ae2ef18efa23d0fbd084412906e2673b80a2def15198fcd624d857bbdbc88763757a2d80353934de006256df0876e227a76cbd988d4ca7811ef9c012164e4b146f6db1d78454c96b76b25612cff8d2f665b26a188218498941e019dc3b57c7db63b087792f9c1908f91b4aaca491bd10821ceb577525695655356a00920a84211bebb7507e38ab1e50453994cf682dddc6514a3fb19a8f50229fb9666390094f5dc54742b851071644d92bb298a7a9c5f9fa8fb77da044df6fc710f6f611decbf2e64139270eb6569d7f29ee4673ba30e2bec0a6205f0e6b0655769892b48cffa2f7ac1c11983f4823de393023f7e6864a46e7f6e3fe785cadf0f43481a19a5134a091d3bf162a539d9f66607558b82ff93a0b8e0ea6071a2d4090b20901902b7288f74579b100ded569b56685c1b593b7413556e97e450d4eee54fa73fcf7f42258e65c8791475391e5302a9b58671a4c036c36bbafb99dd7a248f407b956140db767ff30dd8a199abbde95ff45552d7f29b816ce60eb33920373890c6135f3fb4e8016bdbe4e98b892c78df8b10732195b21de68ba643545badd9fcc1b1cf9b4c53b8a765b1d38b212f4fbcfc40693e340b076d2e5ab0db96f8e1f8d10948effc3a041a3dd7e6152e46cc8cda5d9b6a2816cc654084821b6c98ff29867241aa5f0b6248c6bfa7b5eb037da377d080521c55eb7354bc4db0470e7fe354955056ff5851b792e18ee9f1d5e1b58731ce627b58c2fbfd7a6a26a0d9e2dabdeaeb7227a150fb14d6022ddd4e87277b09cc37bf9001738d476ddb148bd66444db79889266fe67df15a80e07dddc6db5b1003e638c258e96abdf6a1c84a9046bff8116ba29a8a25428f6e6fbf4601cd9d000e301ad8d81abf015402365095fa5bfa888f959ee1f167865554422a0a959ef54c21494c8113fecd5f9c39d45ca84a4466bea884d52889c79e55af91c97b857725806a263a1b4da67f377ae0cd98b35e14c083534d14cfdbaf3bae8326c77b0c0117286cea7bd4161c9aa07bd011bfd1f85dcd1330fb6249f2cde60909c0a73e48ac28287b7cbda49e8e54ae4d5d96247c5d2fcc68266999cdd5002a5aaf329462081561d4642dd96ddb3e802cc25fdf07875087dcdd0d54aa19a3ef01dc4396b7f39520dd7b4e3bf14905f95589438b00a4d94c74687601f063785ee68f03cdaf35506c7e0b4854939f5221b1f969afd17c7121180ecb2807792782f21099c0b395f04d9f5a43acb9a7cc01265cf9d3e1d7c110b0183551572357600ba62ef829dc1acb28b166c9cd271ca09df81d7f987d702024cedb05482bb0021a9beafb7bd278ef0158d93535e8e906ff17fb3c5e3627595c78e6cb4258dc6f0835f4530f3fb2c01397c5785bb2dc3c32ffbb919bc98ec4415e7d2cad7180afbbbd75874feb704644b65218a54d9d4920f88607b7ff4c68b9c8c9aff13f47cb1d7a9420a29e598a7dfca79f7d80d335af4c84251aa00a4eadfdf1dc768ad6ca15b67aa56f1f1593a7b3ed954a142609c941dc732d746f7c06461e3ba419d8b48ab74e9e20374d6aa8214b8073d240cc5521b779564224fcaaeb7855e4b6f39166c739941caea9156a8eeaea627fc6863b323cc0fed4d0d6833426b19c27cf6a902c630ecb4cd09ed344f15a7ee6633f63bd94cf8ef01c10786851d736351546f02ef39495d86b0ccd8a89592fcebd00b509e62e6c5fb0b470d1205018a86d2e6e1712aee21c21683fa7da6eddfe7cd019605b6602e833c955b5bca3ac487e29f22de7e51ade9bb910e40b21f03f49b877081bfeb7554e580e5d4c5858ddf13f64ba9bc0a5e780072a8945fad059ccbfb74a4d7ef26da8688311f9f8862e6d78ac0455c8ebff795b74deaf82e614acedc16e196e1df7ea019c19eb0a9d049bddb2543e8355ed2ebcd62a72409838914a7dbca8579fbcbb2b41bc4916052723755ff17e7b497b463238b7b5bc4f8c25dfd37c22c1e084c4ef5a433ba4255fac4999253c38306f6ac582cba17f74d90db3acf5af324816ac54cff6eb3d6774de5f4936a0407392417e9caf5e106de7f4ceee7075343f3c1c63881d7e68322d63c1586dd31d78ac74646fab13f7a47e803983359f4e2dbcbc236d001faeef53e077ac12fd57a985aa7fe106e8bd7f6659fb518c53097a5f339c67e7f49604ae00872f6d45746de48cd8db0a06e96866281c42bdb9eb8eed2ad65c1925a8da0668fbc7c5d4fe2b93c17646fd9503c64895a53d0ffb7ed12e48da36dfdb6cd923c3da5e64d27d4d58f2620828bc9401d2479d29cc3e4aacea36afdb813e6b69cdb72ddb9066773afcc7a20bd3a42381cde70cf03aadd685e89b5d3547752cf3cbecfb2692b8765a47e74035467538ad001cfb79a16daac5f120ed2a78a937dde60c4c27b2f1011500fb4370c8565bef358f70ac4ba94ed5cd6d66a45e011591e6bc29c63739a1d3f1aab4a3a26f15ae32e876717f874b1b4429d08a3fa64d7593a698eb6bb7dcfce09d9ab61de9ed53c0ce12b0842f27011dfc33c464bf67f3b472a47e94943df8967cfd907fec MD = f52e19999a5773b270b3ac58b152965e6c5b37ebb082d1f7a6d723ca9cca7e2faf4bbcd94ec326f16d350592ca7c3210675ed12a03b559ba66f9e681dff9ae71 Len = 49336 Msg = fe3ef26e61c39720a8176696e1dc07251db3261b7e0124a591f30df0debfcb8fbe2d991d6d57ba2360ac6a3bd93b1576b82fc7fc9495e4f20a6619a155c192d41f786d8197ce6facc47ff68919012fe1490a89b65d526a2a039a209d29ed1a16ca2658e408b220857c97f3c6cab5bf2c784c569300bf1f1523980b2d81cbcb1c673f418ce88a34742ffd473b13e02c20ecfe15d9a5656b7a1367c39985e40eb09dcc0fc25edf134285b7dc301d09de854e28aed176cab7237b0f2f295fbf499814d3acce923825b728cf98ed0fb83d2345d008c3987869d60199362534e5e69d755ffff8ad1dd19abd4c65b91276b1c17a000df736f7eb5c500cc2d42fdc4b876875f088d71682b5ef372ade4ec9a22994bfa4b476cda37d0e70ba7f752ee21e941f67c537ac9dce6397cfa2ea3c78213c16b5448084fb00e4cd056e3162112aa2644cf9f6668baec4743b4e0f549b721a0b29ed7da459af792c8de989014272394d876a3bcdb41db8d75829e49b73e4d5a9e6f895b3275076943938a592dcbf02e001602f6780e2e7c70d7d9298693e16f5d5adef3bccac820ef1a2ae9d47d9a527a025fabf58c7fb4c429040d3e34a84f9de53b4c3b08b46a19d70ccabea88c92a4d00c35aa292996edfac17d54acec8bcea330bd43bb5695526eb26432f9416f0f138b2c2c70c6b36cd173f2507938946df961df5d5f194327258e5ed7dc436817216f17e30fd19abf219df4b806170a0a7c212aee6086f416a0230313de1cee5bae2a516442d4bd537fc1fd01fff25d128001187d6c3a189f6303098d5b38924afe4f9126a63a8bd8406283b4b374fe14c9742090de8d312ff290da9ae020c473b6313fb0c69d86ac28122146bcf96d9f9d1cebbf43face56b36eeed3096025645a91b59910584e4d7b335e4e990a4c019f4dd25f192d509249ffbeac3371157b4fc3ab261005434ade587312c421e9e934996d06da7f58610ac5e2ad0ace15472a59790e421ef612b5e43869cadaf7b4f182243d147b56519a53c35bdbe1b5466eb5c7a8232fe7338688f68a198fd6035a9a906833abdad26d1c091f43567607818aef9a3f92873be499361a3cdb0542d4352a2ed48b4661e790fc8dbd96c7f9073b794af401668a44a79f80a1271601f2f459e75394399ebe55462dc71d3b996439fd30ecd6f5ad2b366b63e30e88bf3b6ab8285d4114d745db5e55ec7431672d18e3e2868dc522fcc8421a7efbcdd911eacd784e2c78aa1295adbc9a1659f0d65ab5e65db0556a5dcfbc3ae16955ee1af6f24da2b0c585a906ccb84c8e15b4d461eba2eed91711b2df324b96f1d17ccb31df1ee7789c087db133ef9045e531bbe10dae96529a87a0593ca32c0f90f3870ddc72a8ee5c9105376bb8f1c848d6013a947000c7405a8ad033f7fd2d44e0f2fd82cf538c97cdd3dbecaaedafd13028e1088d9aa1b8f8e6d6c0b0a6d54dd373835abb73cdddfd7e412f3be046eedeb776e25de07c54e148cf6b4395821c39ad31dc9d963c8fde48f9bbf276382210116eaa775ea1b4b2354c8c4765de4081e48b810c17533dbed8581b552bfdfb92eb2ad95081cc48da10b0bc3284245b5adde2d07d83ac583db0feb5ea5e02dbc5895de77fe66691c78fae637b6d0ebd12edfa536867927fc94750140898d15336905a6d6bf8eb2018e6982aa8acf7f648891472634fc004e02ffede567903e25484b2d38b35c4643cda006a30b07a877a53d3c5e4889f9820cf5d4d5a5af529addaf9a28429aceea1be69baba1400f106c2aab662ce9ba9e999ee196adb3f69b1078152bd40ef1ff62856949b4415c3ac5a2bdc746e4eaad934339b2e563d42ec9f0c8cbd181588989c39705acd336fa98eb9a08004131b4e12c07b1b789945ef05dd98fa1bcab9078e94e67f2be455acd4e69b1c1ca39bd6ba171198aebde306d0870ffac84911d173eb5f8ecca32614d13534bf045a7cf19ea9f74c55358ae2839b6a45aa4b2364e0cf53f03bea517fe827f5df77b26f3d34eba49d287addf0a38d20514e2b7e6059935c49f644585c9e3156f3d345c308116ea21184f83cbf94cedab40084832242f9e102982bbb2967d3f092a37f18e0b8b5683ff75837bdebe2f1c48dc0c24931458aa07e1aea74e9923b4264e8e1559f227f7efbf54f6a2d6bfe29227acc33a908a1aa349c76ad77fe9f7993fdbce5396840550f79e442bdcc68588b0cf1701ed5ce96482ae051b77ba5bebd37fc0e2be96368ae30b6e63186b8b90411e29d171f79eb1530a7f01c9be6784d223f3ecb18511054c417b31d2d77e14a04100906683c1f48584e170bc1ca3cd046e705ab8781f2af9e8737c5131e57b96dfa4281227db94e0c3325299fd972c31093e151b97e65fb4a95f2edea2492deba01e7fbe0c73f92c707a8ea888cc0a209b6504220bf00d432c462ec1523192672e757fb15a118b3132c20c31e6c9d09acdee0e15fcc59d6f18306442682512d22eb10f35383db2b7b211b47c3e16e46747e01d3b91eb75001525b8a90dad15f34bdb1690ce80d685976f6ed1b93cb04fb04318ddf3ecffbecd2e123d685203932bfa7e0b45615f648ae422777fc29a1ab020e6434a50a271e5525a47a29b447a76162eeec569b51c3379b8b7b7300c8ff17e71b5bd9dc5e0089a780fe2114070d5380e81751e4075393518d9890f6d771865a07b745dd2d4dc0c54dd513a5f3def66060c7e0a683745212a251ee5259ad0dd5bdc9817301509b3d7f917a10aa86eaafed608b59629fe43d7e29e3d9cc0bfef8a215154476b3894e7aa5bcba77bf70cde283aa630140da5055a319c39b18da21693c69b7f9e11b96d3a4542a07c35938e4a3c65a0c0194f9dd3fd8c6634e3ffe577207440753b2952effe8d5b74cd47f684377a4cf5cb4788962d948b13690ce0188667f2b95fec7c12ae34422a6a30ff1e536e9e7bcb97acebe73d0e14c6d3efbd21fdfd32240bd5ea7cbfbb68b2578f5fb7c7fc19c047f319530d5800a25cfbad19bdc9a8338d44c191b730f44dc38f908c10d099525d446a9b8ed19ea7adea319530bee3337ab0dd15a40897e47ce8f9f9ce81c12ae38624e448e1b87bd0a691bddc45aacdda03872f0cab191f8b80e2278b775af0e0a39059c2f114c6cd1515ba4bc4c7a9b6240707798142a5f741933dce1a2b4c5d82f61f84677c31aa2105b405a5006e15fba5c672f2da1fc812536420d2fee4610b9e6116adb56371b1a8d2904e1ec40070a9948066a83407da6cc408079963f426cf4501298a052aac473d7629e9557e6b5a982945758dbb8324840e21c56f1ebbd3f3cc45c2bfdbfc2a1d3f9c28c697d402fbf8f709d1ecf4c4cdba884ab0e8b2f094ff6824388e8899997111a5c25393e7e472e42ca9a21593c695a4f0d059f36f5022f97a194a38dcd996ef26efbb90517c2174a6bde6cedb9826de7f747a67984ebe628a0918f43a06359e74f5d6b48aeb8c103eb4bf07e26af59cbe4651f4b2b75a0a1db1ffa4fd48d786577dade5d9583b1ebe3736a8f2658b4776eee98307b27f59fab907306bc6030f962f460c85ebb708eced529951b06f486f1447fddd68b4b7ebc83880cda941a1fbb2ab12d7ce8734907f1bc247752905715f75487d01818cb6869b7d6a1819a44cafe4dd1726330c7494990c1ed942e844777a4e2fa46e40249d370d8c3c148052cdf7578d1e44f65fd5d55d1c064158af055ef53a79043bfdb21419793db99dd5b5ee6780db415c18e9d69f8b24aebd7cb12927e8a9cae609703b8a7a4291639d0ed0f43a88b2a5687aa4b8b15a127e7122e4cb7f5c49a70f7cb346d773233b7181a6e8014b1f39172d4892d7d1f405570197c948b907e7d9818437d8f9f78b1ab6772a1e4c1180edacc91344b1dcb9f5f548098be98e0f2d25b744c5fc95bc61544ba2d9b410e2b29f2f254221520215a7017290146685d4105354e5a386370c042b3879aba2c72dad83af1749df487dbec9ee9e6015b396eb605181175163e36d1dd448585197277fcc980c520af3f6e3a965fef825ff3a5ee722e1807ea7b0382c5e8ce4a4ba68bd12ca69645c6b48bea7bdf9021ed38a10eeaf4d05956d390c5dbe8e772398b80e5d2c76a65c193bf6cedfd5a786964caa80e00dce1f1c4792badc96375799df1ab6a67b419263973423b3da0ee7b049d3a29d6804a41ba2714aa0eb4fc726a48a2420bf5d86b2231fb0215260c88949345ecea8cfaad4125215f3d7e5fca5d006b0828b20c16fa8607c1283c4b2891475bb5b1356bbae5fdd24bba0227c802b3561b427b5ca00ee9e8f6cb6632c18713dc22cf2c25e1150b97ee28f2dd11d7dc03f9fdb4229cfbd82f2193464be9e293479298c3a1c65af8f2b4eec2f82e68e4e5229eff06742ddb4acff42f0f0830403ea3b2be77b13420634e9ff4f18412688a33baae60bc315dbc5082b2f4b2fca521d4815f10581d2c7a0990fb61a980c1639be554d9db92f9f461b3548560a43c81839937f421826797748668b1052099f1c98384ca58cf1aa361faa64997d370ee5f7edb9b94008c5c2dd4af783d7e5cb55b39b0caca324a19dfed0aa9dee6dcc8c696bc8f2623e5388400422fa8f6844ebf5c6b43968902f839ff043e9c6aea9137655d475e491cad159dc33fde259afe648006dd542fcfaf1ea5156066ec24d8408f204cb30c9d3a5101952143882b74f93935f079931aaeec73d0c7a4c7161e6068b817bacae150d4d05a9c8f9a9022dbec5b157d6f8e8831efa8dcfca838d425768730dc2073910f8e65da08d973888b0df8c4d5f175cb7d7d1008c4fbf789fe5d10109d99ee6b7f90599255c140268532817729d56ad92da0a8d3a42eecb05970e53f85839c50938aa83ddcfe808d68eea7b4df87f831c0fed5e600dd82d7d55669262a9a17d0e9d1d43524cdaf1d9496bdf67d958885e5fc298861745470d0723e6cd339eb7ce11a5020c3cb3657a6cf56c46a6ab625fb0d06635c8fdc1c0958b76c35ef81b527a8be892083b0ec0e0ce4974c93eb927ec60eef388c7429be8e76bcb927650a1c2181c6b163a91b38b3ea079a8d936bff9ba584bbf6d72a8e67eec6e37e1ffc3cf91c722d078995b568f96dbad46802ec126cdc2d5b5faee789a2232b501cfc18b41103c9dbcccc1290755243e4c407c2aec75e232688275878135a2759e69a2dc6f2043e4d0d2ecedf005dbc5b21eb21e5377323f4eb146f97c4c43dd80746eac621ebf0f7a54e48890cd89a941c1d784a4fb3a622e3068b8d38f9f566e992de26333368583fab2e430d6b552c1d2f343282b8304d1a6e3aace273d493280e866ba8732aeb36b5de81748e728faf80f45242d948e00bcc0b9b53ca51c92d0a720af413af2d150ed7b8f4aa893b3dc3171e329f566811a06cccff56039573270f88a8ad7b9a7506b87de047efbb62664afac482ff61c67bdca657bf506494d4dd692898f6bfb14def34d9ff4c8c97dade7c6b1c9a59b4ced9dbff6eced2fca45a21067ed7096434ea724438f62b58916017a8e4bdac4709f2c258dce54d25060444c4b76304086c38aab17d93141f3a6e610043eff617cdb5fdf6821a5fb88a7a48e5eb414c08546862a44599e3763657cd03d297b3817a71e34b07047701921aa1ec72e82e0e7de82e8f1970f5d805cac016194b612ea0d516e8d40a2faadd73f43af6ce3665594672e471ced7df3925fed970718b69c14e0d3261b1e60e9cf49473ef7a01b766f1b446e6fa15d630f7bda080b09eed6c4b3aca488236c7713b1709b561fc7f37787728d1891c679dce911dc27f1804026b3402e1019e4ffab6007ef11ca3273b49300cda0277fdd0092da3ae438358141c6d9ed396891289d3d5361b108239f2f2835558eca5236835d7c4ac946d5421ed5bd098e783b9bf32f9e1abd40641fef2c5a4e6ae1052d6e3141365e83282ac3c935a994b2a900b5202e42bddcbb9afc89b7dfbdd66169c8f86f232b58f5e23a8889f5d57ca5fee9f74d003943f1b85f2594310d102e9399994f3bb92b06118bfc0116d83ff53d999c417cbaddce221fea396be5f73452eafc29a68f652160bc0be53425646266ccf652dfc712198044beedb6caf33a4fc209458c356f0f77d79f7c764551b4218befca51e94a9c79d78bfa3a466c0a3129a8ea1434af98fde39f0f05bf70b315dd6eeff9a7ed1db6de38a61ee0ca6aa127c16266138f839be9f3e6091b2827ebca5c0b00896365df64ad3a8b21752347c53cf3ab5a769af8f08349a9e2e0d74a5a9f648d17143c9b6ed2fda88fd6fdca0a01e60b92cca3bd0037800d9b028cdb962042c9da696992068f399eb453bfd3fff883ad42f8679121f7d25ecef50e4685c7efdc59c8b66d33cc349418553309aa0a11baf264ae1d5cab89c4032125322f7db2ed1c9ae9d4fe7138b341451f15151dda592a774008b83beb66c3ee99479d28d224ac48cb6e6d668b22b9894c9e481a24b37399e4fb3e8f416d95c4312ed6b198aa903824e48b93750a088b824d49ea38f05432649ef58fd200020bb68fe2014ca750d4bcdd5de04093b4b188ca22735e3756aa8698e524e848912bf111caff364275835a02ed3632e4476528bcdb9fddb0ff6a13921634c96dca8ca75d95929da486acc8fb427b9526490e28cb7a55ff84dad8d23391a8be963596a31b4ba4cbf50bb9cc6f6499af80401351a0097d0adb6c5d8d245d690feb5bb2acf2f51c065c8d112f075c76c91bb6de6be38ffe47dc3f620a0c825e0495c346898a9ae19701931cb86a31fc2a1f32d63e3c15c2feb0da4d1294096ee5bcf5bc038c42ddc60da5423140eb111cb33d639151a2b0777ec5876d64f983f9877a7ae2a0f5f7daa84beb6033939fe5ff5eed2ecd3eb0f96f8979e3235a84891fd9eaee6dbc171df90e7f0fe92f8dce2c1ddcdb56f1aacdabad8a3c793458ddac9a72ee9c9e25d5297566040acac31f6202996194c4863c59b9213f1090e93d55467cacd4a40a4b5f0908083f692920c8968a8831be2c8ca235a8b68d751ef142646feebed5acc7c450cee23016a71987601817d2e88505adaa86679becdf409c7cb37d0239f49080d41e5c84d82551c6e8abd8214877f1a3a0231ae0fc14748b16b02147d8caf0ba1d613ce3b88b11aeb7ac91c6e9eb96ab9de79904ada5d336bbcea135bb172d9bb1004bf7bcc1a16754810b69d0ca3eee2b3aabb0077ba6c6f275c775e9c1904a1a615165eeaf491847940eb107fa2f93d184178c137c3462440d59af6ab261efe0ee16d8563e51ea194c62469565b1c3182da63fd891c73338fe208a47d0e8b4890e61f6fb5400045110ced182f10ea6869d20725ea3a56156b0e4af87056dbf9f28fb67e5da9f8e774a1bfad6888c63a53c4dccae981713268b6dc632383738aaa6add41cb976b2146111689a117523fd73f4f6cf5a657131f8827651518f4830ef3de5a9d7cd96afbd78c4d6740f0d14a8df97c9cfd7a4fe5ded67ea37bd17bb6b7341931eec62d0c618b59099a34a7444d458a5e1b5d41523744208d409ccd2821991e2751a3fffe4b9e4d2687801a5b09ce16a774628ffb3e0afb00fba8ffe9cf57c9ec3a155c57f22f8a3c9d85b2d53ffd92078d3c94373f855ecd01a8ac521d1abd0f2c7cba9ff1c9a0ca409809694c4e8d0cea4df69cd86ddc3ff6fe2b27973c580e9d5c934cc6f7213e1549768ddb5b781600191fa2850ee3e8502c24a0ca373b4901279ec4ee327c36801c8299598ee3b1632077dec203163481b5017432b5d76cfc8015bed3f622121583d6323363506d87e6a7a80bc4e3c3102b4a084d22acd8e3d8909124dca37f4a11b9df15732eb8e2fe2794eececd128fe176d385f83c2b5bb3a7d23d3080cca238d6066c290f1208b9603bd7ab3281658a107c89b0f5b2c883b3f8a9ac3a88927b933ea41f52176dbaf9f352c4d4be15979f59a4e77a2dbecb5d7ad6aa4141bf5c79ee59a0a81796654d61ecc5f427346c8bf183f629fab31d0cef60b535766d5e029bf96761c0f76ae2fe1209413b26ab5eea9387959829db3aacc447779540f2c5de1fde1f72151e532e4f191c8880c6909b4ff64d84a7a87f696deb883ccead2c1b197f51c9840206790060169dc730b98a35eca24e90e7337bea2c07cb5affade982c57925a8b87574d298afc95e8c423dd1a534649a2a0f7ab55346cf9a7ce3aff83b261517a43898420d48b9db3bc33cafea845507d36bdc5c2bf5b7f17735f4c65ac9263557c859bb4881ddb1c1a4fd2d17129e8e95c1274b007522f4a14d5e99aed2b7a6359d4fcad4ebb376b07005d5a55faf82c3a7d20e6b458f187d7223cea1e377ded03fd0dd3cd6c99e7aacdd362fdc1678ff986312d6f76ad15e4d0af1de7bb543ba28838eeae38e9d92c3e9cb111861f5ac1b50f4de0b34b3d6467a8faefc1e7955dfee4c598270f89b4db200f384f07d5b993220eae17b3477f6d914adf501e435ce678213442f43f6b2dc8441a2607480aa7d33881aace7b5c6cd1d55e71e18cc8c85eca2a907e4378bbfa17601207fadb7988920375822024ebd063152b18bac92cfd88211996dc040d1f52b21cef345592aae5da7fb880fe73f6bcac86ab13869bbd23c2e6255437aca0bbb74aa73ea079a2f9aed059e1138baba7ca8a82e0289d0662b4fe11f1381fe31b18a61860e3b6d79628714b8c8bbb57 MD = 00c0541af4657e4296c95c076cc0b87504e771aecc78e2259b3dee92b0ef30f59025653b8119436a86aba5e7b2155ba2d112532d3542f5a9684a6277131ab387 Len = 50128 Msg = 793d0bbd04099f5f4af6dcdd71e139a2c4378613ac137dcedba69b2fcbdc2e19673caef3081150f0a2c7d9944097b074ad67383d74eb5cf70b116c8b4c9c2783240e19128fcc2754c47d68d6acb3365999cd85d3351c74b7b94422765fe5c346197bf3228383491216e030ac9f7cf2dbf03216dfd6ecec954b0866f9ec0129e9ad4be42ccb7ee1b202b7da1d013b0d811b5e92683fa4ed1a2a25e01bdb3683f4474596364f0515bdefcc0d32b839afd38019a277588b9eccbe6337e414cdf6f05133ae4bf7600dba45e572f2adbbfe5a882bee1309eb28366f8a135c7f0dac6432dbd770abd6f2316bcbb065c80c259d9b5b1d443a0ab2dda6611e8c0540cdd85205b7af53b0ecaacb467093f2734a252272d812d332654bc9b1fd7b8cac80d4197bf60fd73722aecc1d5a85113796788339c686bca9690742425b31fd9beee1ef043d991fb0bdc4d61a15420ea13020287590a7ddb7e59977dcdeb741533f863c6734531366e47551034ad2d2f940a577f1dd7e1ea6018ad2472e143e1d9a4c686d82479ca0c048a5a1a03e4487f08dda74561168bce760b94af450de4027badbdecf7da0a579c53bbcc08d4b926662b8c5a36aa143bca696afd87408061058fd82c5fb08be3674791c51c7d164caab79ad6b91b381abe1d03c8187a4b57aae37200acbbd331fdec888fcf5bd4345f184f4568c84bfd99bcfba989199968f45ef8246f5a64c5e8a91c9691df778ffbb43620e65fe44715bfbf0c49bd1f177a48e6e227faa5118003aa73f4a664a1f911dbe3824085a99aabca8aeab330e5a537dad4573b38978c92dea2781f403cdfb7ad27fcf8947790f7aa8fecca7345fdb230759d8a83da36cd05ac8cc88ea3382c26488706b543b129db95b0315acaec3e74303b770b5c4718dbfcb320a4676ad5e3dfe0e95c9043b8da36d5a65bf7093332bed17f5390161cbe0d7bc6360c105b42587b2efeeff13b22eddd87fb2cdd46e85bf001e1182c3f186957079803a112de4cb63610a5121752253854cd0ec0dff1a207bd384701f6979ac5835ed095931417429d36725ed3c46766ab260f6c650b2b98efcdbf3fe9a81c57c7ff157652905270c2d4ba1007063ef8e9aa91287c8153244825f32e6ec6688e240d24cbe7bf88e1557ffede17a4165faedf469d9cf0a32a24b555662c7ef9c945ed90feb91e2514b39cb3218c0a881b491892343cd5a61b2400886f793e6aa9ac34ec974d28b18b7bcf6982eac60ebc670b0674e2acd697b49bfeb2fb81159fa5579a1e2a5bb8a5fc6ca46aaa5304a3771b15d804f2bef054fc1ad919e3852befea1c0bb74394f4d408d651412e247107bd32e64a23c9e593857f3a5ae253deea5104d8aa6ce108913881cf55d3c89587860027f8cc81b7eeec9e5f44e9fc190320c71d4a3427519250394d4ed07b9174f9e005b7696117c575fad05e76d86ae8cde5423d25d25076046f4392a0a7e56e8d6517fc66f265c5d617060e258354f9dce1dfe9de6c95bab9865ac7c0f811c2b4f1c73e61b0225e716598ea528767c4c23f5ee6ba7081bed430fb64bdc697100538ac03c624edfdcc78d169aa5f03c8127037aa5668b51108d19deff3bdf5d4f28c3ed320cb29226bc378028964c972420702ab1ecf904fbbfacad00f18be90017ee822ee0d547ac3d7d55b6c531951e576386f801fb3d9620efaab7c9141cfb6834079aa760065692871caef8483f55140517e26c3903c9fa0b5d8a8a23ff2863bc05dd29fad50c027e5d77f8399cb29f7d64d8f75a5e7c93274ee2fb5f986f50af045f2e4cbeb6d68aa1798dabb41d3ff4f54068075697356c0628e671f1b976348a887efec83c57d26e1c7e46907f3d92538388e7f40226020cc2110012ec1e7421c0e0b7fb86ca7f4fc895b337bee17e050a1fa33fa6ae10e81a44b501f29096506f1e1f607d7ab8c9e5989ab1c473e1933cf5e2406917be23964938c8b114c3a0fdfedffe07aea666db50a207773be28680d14dfd34a73644a0e7306f13f22397d2499fde0dad71ad12857440c181aa65407d8b80f0a89dd39fe545fcff71ddbf56c6060678c04026f3ffb864898c60b8e3bf45d183601e58fb0c20795cda1aa0f23fbd802e2f3b5ae485157cb7a52d08d16023f6d718de5c1b2469ed147501c00c7a6c5419428cd04ee1338f321439db7128ccf9d217086769f5c7610e8abba90e41ba88204158109ad9bba5e421abbc2ddee9e15ea7c2ff4c46e3dc32616fe35e5a4f262a73caa32e3655c6b414ac306c4c21b7620e34ae2ce06566684246f4668dd4352121071074bfa8fb8a3463c197381d82c59588fb728cf407987468668ca4f1beec933adfd23e5d4b4ecaf9f6146b854a7184e36e841038c8aa40fcc13a654dc873118999b2791bbfe81e95574cad00184d236f90cb34dbb086ee2a8bd79a915b9ee31cc57b3a8b5e4178606da7c536f341b954e8afc282c815c61c4ecb09647f55501ceb954755303f2082bf8e7dd0e33590baff9980d7173d0ff7917d7b6f3d80a1b1946868203dcb5d22d6679b76f011eec85bef3882a5e713e6dd57b75a9c071f02475c67948ece7968389be8cf23bd1ca6861ab02b7afc180fb9c087cca5d20f388cd90b5a2a2eba7d6f932c848322627d0883b1799f62679aad20b16d5fc9bc7aeb471b1a19d5698903b62f3c18260775679102141b0348b041e0fee6d2d56df1ed0e607b64a9cdb37a6bb8a0ebb255b52dab6da5f6c50279fe6636df06dc69c51996a226129430245e1c915803af9266e13bb8d43892df1c6b1b21ff04c7f91df747a8c32b7dd8043630800b690307af0ca8ac48ea5125c1116786efd37f6521108a3cf9b84b0e7a8b0f4e612398fcb9355a11aa14ea1d9276b32f577bebf5fbebc52470bfe81aaee421c3043b54b9abe4b9afa1bc440fb42465e2dd05f2f1d0116229d14b3b44c9c9cda699b82185aea22d4dd6ec494352a3e7682c787ea0cb08c713c4612cd4f3c27ec1cba3e6aaeaf51eb5f0abe00092799f89eadc764b115a5eaaf00ba311535899da3f038b6e8668f4ad9802f1909c30f70cc039c13acd8e8db6fe508845121287baa0e0f71aab8017fe76f76539995055bb559849b5252dbefe9539c3b65779b029944314f580c7ef7031952244b15f235c5200f50441be584b5ecc3dac4b137ceec333c9492ec4e5ca72e111f90be7c8b85e7aad6e4ac9c3650113dc71166b54d3d7b8fe5cdcff5fd6e0e51a9fd06fac97220d593c68d766142516894cdf069e9e75da9b78b301c65a24a8267f278037c145c1e2b7c26fab2072dc2d84ce6ec31847a289e3db51831fe5321be239a1d1fd709e2e248119f950926dae620d2a2c09f517aee57b77fcedcc8ce30e2e5ae2144bad26cecc5db96d2ad1f62ec1c240392741f3c8bbfc9b8b81bd644c2d33d2cf7df5b2fcccc4513fe510eb3015be666f842940d2c467c7c3abcd88e35eb509f4af7ebbf5a9d52a8e683377af2fa70875b4d67e4dbe40e75bf2c5351dea67f04b885127028a19ac225e4281f537058d116050937fd110651c00ac5540f9d1ed9eb175e06b97163fc36d43f048565e5d0c30a069b1235da8ce7a8acf95b27c69b3d1f2cc78fa564c383d40aef1b33ce02dcbcde72adfb218390b678b643eefcd5391d1d571d861394a7740a23778267e3edadff4342b941d24594c71f5c5b27f469919e29d5cbd70c1c34cb464caa59f0504df7a152f8d1f590c40698f6e4ee95490d2da45abf45765c86bccbfd340ab4cf2d460161524869ecd4c5b7b614a71451f05a7b1f08e58fd2fa5d28fbb7f0ad94bc68e7f02e2babc44772f02c72e81e0edb930295111da539f02ae1daaea2474b8beeb98204d237b18c9cd6ac88380eea3f65df5f607452dc18b49b1c70a61e7e1c261a897ef2aa2f14a1dfb8bd0d637e8c4165c08f700543d4789923a662af96dddd7f98f5035fb790308ff399dea83652c43a7af6a7590ba3f570a2c86e571051436d12ff6ae4c55fb74bcf973269ac135cc1f12e70ba8e0799c5fc5f3fc18507164799f6bfb5e303a4b7bf4d8f144a5e899095af62a6659ff3eda2c34d5b6f7fb4a39083786f9b0c973845157b348b94b93b0ae1f3a90cad927c38ad1da13a1bad05892e0b5e47dafd61f3975d56fa469a05b37eba3efde0d3d62065371f6f7b7df2064f0f2e940f45a94d4bcbd810f47a9511de1ce4b3ba56afec9410428a0f95dd7a7efa4cea1a1e92a49b3d446a1ef97db878a216c89a894e1fa23fa72458834c68263325c47bd6a2bc1e28285036850419d6c0519711fa551c282bb9a8e6d4a351ed6065bdb50c4dd63d23008dcbabecb8911e31c9a11849749e4af6822af896ca2cf87930463e189580a4495d5eec8c17001213bae8619fbb6d43ea6aa56d7b237d71dcc6bfca876c71228f5960a556a7dc2293f52874cc431d7d01acd6b1e51057530cdb82601eed97342f0c6194f0fd5de61ef301a053ce477cd8d34f5458f3331285f92e6d437b6b4fc4d0d209df8a3dd3315f04a2ca9f53b9dc887fc34b5ea936e4aa146099a855dbdd61529276d0d4506773a1ca9548caba8906d89d30a512468568e4d895f6ff7ec51833bd5b63ba041dfb49a6485d25056b08ea20ad8916b7f4a01033ace9b09f387025f8f1a56754e1309cb4684eeb110ee9352c165d1f01bf0a171052f311b3940389c3de2864d94dbdfb7359809573c14249ee0fb3a3ca50e179ed2c95bb52643cdfac757f2af7b01df671a0a4bc844e8e8904fe0f4d6836d0a938ae53f60225a6a8115bec3236b4bb0e2de22db8e8e33882ff65c26461fd5235613cb05a3954bb73a0f622031cc83fa306728e23184bcab83bdb9f815e00e0af157c3d607e7df5b2c9e8a3262066f675a9f6487378c4dfa958d3d93ca2ddf666b3d15da1380deff5fa87d213d81d89d676d1ef32a10ac1d6c4c321fed7011e0cdac08384fc9104adc1684144ba685445fb89d4d9177a2bb10e4dec307106c1f1e8ee51943283de5aad1e73312db40054b6a2abef529f77c8a3b8aa89f75b8cc66caf4a478062c77d1c0eea71c89cf88326a0d6edd8e730ae13b7df63d07bd8eae487d0275cca6a95acae198f119fb741ca08e84d10ede0a1dcb01d4692e430efdf0c85ac2e073234cd9072d17f18c7111f4f5295911ff2747d25c6aac5211f35baa1dd5e8ac5b8cafd4a98f187b4a291a4e8984feff9f07663ad7e18ddbf0e6d05ec39b6e96268c8ca20fe67c1efd413e9693be4740865282eaba619531a88f65f403d3dc089bcdea2d8159c9416c6486b45bfebd3c7cb1a4ca4d114abc0195215425a5bb6983f4d15c4710894e6038f890296de65b49cbd2c2d81a36e4c3a10d66713a9121a6ac4917a83443aca1659f1345334d06b44a16baa2a4e112b55a2f132ebae998cc9b5b46eded80c3f7948023f67777a387d3789af4d6d2aca0699141a64d4835bd690ed25f62c7fb2a6da5a98661ee9c8811ff4a16d8911c4c753bd91f19386240bf6ba143bca0bc0197158e3b1a395780a9b3b250d3a6c8812733c4e24940871f45789ce422936e45bbd8b85ecae03e36469cbbeaef9a1a072783e83703e90a20a23fab89bd2979be80f71136986bb7748ec34b2b53f378a51c332f656fb9540c7ec8b779b5e945348f79800dad632c00292f4b5c283c4c25ae4980b6b73acdaa8319a6fd315c3a6f8f66ec29315004a3c0e8a4c595fafd4d86cfc27000f4ddc4573c625d5908c13629c63fd34bb8a725fbf73caec3b7f3e64cccdfdc756eed20a239d1e15677405305a2605323257d4e8163fd5fd9fa96b7a849be423b3063880d16ddd15031218cca0137f1e21eeee6fb34ce1f004c4e8a404d47ea7dc2a9c13fdd6d746ebccaaa20ecacf5b02c62b41073963860348325bfe0621b61ad2596e1966813d9a2a575b16aa7a6b4d5418169273ff0203a9d51cb0af71f0f7841ce9b47b8f6b96b18b42283104e17a4f315ad58b09069e604d60cd4ee3cb0ab643014fa4465359d8d311e3fcf33001ee038850ed15f62c1207c2c452fbb6ccef586f5b6f4a875c26bb24ba7cc9d98cd70b299528aa734525a0bd066a3e46a6a5e96e584b006a2611a0051c2f0d607380c4a902bc3ae0621184aa23d30fed30606298d6b60c9e40302e3d999212574e71aca13a264be01b7c3024ad5bf53ce2b55069573ec37622f8b228b3248d1076304f8c9be551d4c9bc4fb703339298460b3f7a4a43c99456d1d870e974e23ea33309c5b877e13115581fdbb6184c91d2d88c262073936b44520d80bd0196342df08807005c8ea756e64d0d3668a7bc01a3c3079a3c958d840fcde29e393d93af0f26bb14119e8a26dd43b614a318695b037098e80d545d9e5196111daa3ccf7ed5824c5425b57c0da39080d156334c576e2154ca74646debddf296abc3086a45ea1745610747df63efafd7ed007cb78f5a31b581f02a30f4fb7fddd92244d67cb352309b44ea36d2081e35d830594d5b3e3e55df0f3a4952307a61263666a68bd7cf98835cf104d083581513445d7053a0b390123009198c138edb037de25d0bcdebe7b9be10ebd7e7ea103edaedc301281e0ecbf10b13fb2b398601774c5c74ec33989ef6be3e50bc4091ab52aea7cc1afa2c7cc0d4db37ddf6fc909109474fd93335b3854d8ee366f823f95a14a14d1fb463a53dead1caa233c94189ad80050b674997e86350088e7d41a93f9451ecacf96ec5a6b19a1c1e9c56849fada93cf94c4eac9e842428895c752ba1b21c332925886ec9cd96a4b98d3eea618e2530395ebf6226247ddbedf23900fef262a93ac55af0e5934a0d0972ecd36dc376b7322b06690dc8bf9b22eaf7b9c5d9e7c74855510ca8a746bd6509eae012f2301a8a1dce21c3e57bcedeb34bc684ecfe05e8520512717dff2e72aeb3910f7ec3e287c3711cd70f351f67c7afa7ba8027fd8147d192ee8be5e8a8ddc156a1edb497d19899cab5ba7de554b49dede5580806a9a3510e5e558d648e13beb178a384b2ee29a2abee5bb8c93be6910983b8e0c9c7f10df56f7f783a78fce6220254b6bc43d32640ff77682373fa137b144774bf72bd62e8904e18d31fd5e238cd55bd2c69418f2a57a21e9c935bbfb3257816402064fa484f55f1b6e94b2d56384b2a7bc4e157b885404e8d1087d06225bf680457943ea51b3b955e5bc9421ae1996132fd3f1a7c16f67a8d81fb0fd893a1cc649ea79a8f82537641edecaaf747c503ea68b742057b1925065e41c8b6fdb3c5f95c2ba857f322170a1601d26bd95284fa9de658b5204cc0901be8856dd269d72b26ace29f0c4bea0f7ac552f914c656ec0348e93bb4f5ffb3315bd06da03892826487d3d52c2571da7283a71f98951c574f5b5de997a914d835284446f5a46a97bc68f69ae13340f393e9395fc3432794c89a314f46cab2879dba3b8a3131d1c384bcb540ba19d9d35552a42a33551b5d15820ded40ff4b39e19e2097e1656a9e63efaa77153daef24d4c521f574f69f89cbf4e4424ab61779740bdf084b397a0c09e409e911322e8e252dd9fad9695ffe48e6cd4505377b9355e4e44a9b0eb43213512379c3ef82f9af2a13ba4df11eb838bf41e628c108722237be4bec1c82e1c4099d2c515712efda84773eb6d7043e0447ea2c9c9ae5a045ca151328ac0a9f84d31e07a4b307f70e02ac8dfe64381712466d1f470a3ca5246592ab350674f7bb794e14a24a889ab36d5baf0bdde3cecc8475c7125b320729d2dc1afd72e96ed1c1d65a3466be5e318d2badc78d2ce899c8a82de5d3f150bad89c686638918e2e745ee1434dd1cef12ac58e18bb3cefe0dcae58a9bca107413e7a9e5a9f93de3b5a8db2b548e86f590cd05ae8ae3a6b0b863050445c69b525cd1dc3c0f017e65e3a0cd4749f2bcbd2faf5191eaf4fe2818fd61ea0fc72e1ce4d2edf7f74472f00dd824f669ac369c5bedcd4a206a3deaabf47c9a4e3e413a48654fb817049408a0c982c7581d8d1981e2c935cfb5de6eedd2c59375be6d40f3f381dad2f45a1628df672889b918cb5e38e5c34d6a683b5b32cd743aaa0aa77428250ebf864dbf22843298631172182d5a93912dea53b6707f04aaf193b204455d9992312cd75a1a72859598b921869bb2631de5c83996ca21fba63f0dfbbde41e5023dc6aaf7d6d04c0be8f129fad05eac4c809867222c4c622f4677b305adcd4f92225c20eafb6d58471bab044d2187e493e0da7a6010cc61b242f6e0851ac3bf51b81c59d57744f313da004c9cc3fc750de66ae3da7eecc34a3eb48dc38be9dc48e84d7d40b21ec6790d3a296c1e8609c37b8fcb18df72310023fae34869094f7e9b39b3b314c278809c9fc2479aec45bb85935aa39c2752dbd7100a9b1de9bffbb72624b705fab2306f7840b49ff8d3ffedbcb7021bd3cfe3433e29440d52d5c8255df8d3ed8c1c926f0cca3c95705b979c530bbdc63e4f204fcc69cca30b39ecce26569034415dad82a58965e41d8489799f7d5d042f7b9be401f1ba46de926f99c8667542e11e8a9189a5baf4c7f7df6bea36693c70fb5be826ea965d91895a6d8d520a7f34062f850145c02e355ca15c7a5e69d8c7766845837be952edc5b434bb3fd75401bea644559101f8315ad533991ce53ffd94cbe160cd398cbaef85d59b57652712edf7b8cdb204bb819985d88d9866d9dafe8ba605071173c0aed63875c23b612d3c28c7b1d051e0eec2b8329efb730e255cb07ab952f66fc6abae4591a8e16b1b53435b481271cd407d772b166d9546a8554347c6d672e8968d15e43630e0aba4d94f5bdba1ebec3f71c9aa3b1553e929924af472ba0c46f6 MD = da9436bdc81dc6aa3be907377519049371e61a409f850375d3a503060112f0eacf8539c1d98cb3a302f9c125c78ab6e3a3e695575fed3eed2214a0b9e3fc6b51 Len = 50920 Msg = 96bb7a62306a40df8c1d0ef9f11301ea036d7d15e8cd713caa23dcf3dcc4905481bd36f5296692175d3a08203de55f4c689fc69f1cb9141e9f75543edd1b819d52498ef02a8ba93ca72bc14ac44b465518303005fce142a1f0f190803b993fc0d20a8c3b7b000fb7329b415dcc6b3d6ddac9c32fd06e822d673e979f3f655127c9a537be64ee4ceec63091439e6dccfc77128805e0875d2aca05718531a83f38ffc597622d7de64b2b92b8e2827a7b6ab8b2867073555a00e2ed27185989925d3b10b50d1dd46735286abe24bfbad31f6252c556d3000117779fc042fe31d1fd472e98a87d1c57148760acef9f545b8340994ea146afdad751c244e96ac7847fe9c8481c957c3c4f0e1b892d68709bfe19302837158a6ea937ffbcf7e374334dea86ce4fad1da05086445dc563381cf9b4be5b0288ba44f3f2fe2f53b26067ce110f312b0d270a7eb682319fd8d265dadaecf0e8e667e41e4b66a5e51fb2a76a280c7997fdc10341687e0ca30f66ff0b5362eed379b8d79307e0269571937c89f524af7ac413120162e0f6b94f1d70f2e7c75daa87d6a4b9f113bb4bf22a6d934200dabeab46bf266d4ff7c9e21e42f95ec4465559e9d3f7d0a86befe8a002f0d547024afa829218517318bb0e92fc877f00b0bb3718edb76b463f699c1cc30976a22f06f9ee1440d6f560771ca127031324a3c6688b79608b963da156c73944efb96adaefb3cc04c47dd8e554724ad7e2d7275d366bff5af83f6f805ec8eb0a0733baae26f842cde2b286eefd2eed6ab4c24568e7e0070c7aeaddecfb4861c485b9286ae4e6ff04f93d747860fc9924518c04d0c4111ae0d93f8ece766f24d832f2bbf672a58a0fd1c5aa6cc605d46d81de6d7b1527bf3ddce58a0f1764bbb0d6877b3a185c6b5832f32eb3757129ad0b60865222497f8b4d85d9952650aeb2391f701f1d342b45e46f0a33b6671d4cb8b9593d32a0e133f2c6844aeb5a86482263a38bcb545140aee046d6d00f3ab25092ee258f546d9b93519115aeabcad95afa1b6768e465b05aefe8830d9207489b924bf07f8cab2cfacd0bddb66a02ccaa8ee09c3d0ef0fdae43fa22b3180c7460627a884b70244eeee3f78c4cc0b78bd8c4fb1192f8798e7385839a0bc8d29f69a983d33b295f6a363b5f09b8d56f7dac4673adafca88cd705c8cd55dcbe0327c106cbb96dfe4e69b7c4a3c42d0b50af0bc505adbada5216f711cbaf149be93623f3f27a6b93c2ce54fc10d32da0e9a6acd9bff5fc959f2366b3b310e69f52ce3dd04feb1e0eea2dc5bcb64cf1a0495e3225b8383452ba98ff3f122fd530c64c692c12a007c82b24749702962b91e64246398d08f49a4ac40b1477507308ba2d5088092dbb481c3f0c0b84433dee56df2375acdcbff4a64114c44127228fb50d6e4481e89b0723c9d69ac9d8ab2df191846aa627f8da839cc6df1e28662e3d592d122b65499dd8717ec531daf5d96d05c398f77f21b439437bb54cb8d07cb99d175144282974a0b26f0b6aae90692fb88b812f46dd2a5db1cdf78b6cd3e3b045a7829aa5cd14230911ddb2d82d55900626a3ac138d955784180628c8f30bc7ef78366d62a704c5e221ccc8fc0f37549b3f80fc79b59dbd16e471c331b04d56f6e3ed5af349bf1fd9f9591b6ec886e3c420999ecde7ac0506ddbad95b9e30f3f88507d1bc17bb875d12f308c4dbbca43d946e11948638b5b05e61d99b1f5f1560d6266031b38292f8093b3f82db513c53e57ee37223dc45cfd0d74264a61031cc51b995088f9cc91746921e1d29ed02a3ae3c82cb42ff3ba1efabb26ce50cdfa78241de851e62a0474588331859d8ad9959278e24662a1dd3055fa8083e9d856ed24fab5be28caf14a08e0cf8edac83c170e053f20fe552dfbc5371cb255ab99edc4399e16e734bebc2240a3357e12ba88fc772d8a2a981246f37ce2a2bbce2c40ace18aa34af1d5934eac95c2b1f0bbaf07d793cb0ef1f4db87d0ba9d44ca75ae83fa63ab7a889c96332a8d7c9aeba755d52c582cd3e83b80283c8ce91826defff18d10779f817d8f7ac573ad628ae7420e7e66f5a1054ffe7ec640cf5e6acefaa0a0794fe065de44ca822f9b3056e13e5bd5a46e9fd1981c3279be973f1fad68353e867a65bb297fcc6ba98e2dd6fe11643afadef6d37fa4ec5aee89e2cce2115b6c1f42570bc5062887cad08192a682d0b4508fcd936a5c5373b8ed70f9d7bdb8342ceddede1aa185de78a85312425b474c8ec74d9ac20e10cb050a102ef334f49d95c421ba901a8b799c5dcbdf386273099dcf9e6ff080cb6abb29ebf49e3db8af420f492a8f38e35f1f381380f260f9f363efe79b5a7b2b59c49228d240a2ac731b167db37fc23598e781507dd61c8412c96e51a46ac6d89f068df051412977f00920e6dfc881282dde80ad5f4e60ba6fb7960314872b7b446b626bf70a9bc12ff277ab35d23d6525eb7c50acc1f2431116ad25721870bc51da58c04f01bf3436c061f63d06bd9488f5bf61ef979bc800ccfce147875e42cd3ab818de8f5f760f5927ec80cacb5c5fe68f09ad3723f145c3cb5d1a3bbdb6c075ca9a2e1c412fc2a711b785872d65b1a5356f700b5265e7e162c1739c55bf3272d66fc6112e085590667fd4a6ac58861af9bdbf7af0cdee100836da12ed062c1924be2ed4eea8d2fe706bf68d10dde62d221823ecc4d0633706e4d8054f32b552fcb0efcf49b940d875a472a6219bdac6faaa23c997174d3ea4f2f4dd41ecd605a56d906907e0a806be52d058a73b69cdc79b477a3149b40c2a88b7028cdc961a681c9909efc7116f939b990a69649c2ad21317655a0fa08be0d0a8ddf8a9fd798de59219cb1683fd3baa542630bf7ac563391cf3da111aa20eef4fd44cfc130b5cf104006175079700a58913c4f40b86c135dd8c78f62939fb103450527ce1b61c687726798aa32528b5c139edaa57563630e299fd67d639f059e0bad0d26e63177271f3dd006190fc0182007389671b0852b480320b288835f2da788fa5c2fb93357ccf547d49bec4b257d01d3b42bf80c2daabdc8b270f1204aaf4579ee664d9dc1f22a5a96298c8efc511b465f028e6a9dc80c68edbb6cfb7d994ef65e188318de354992eb4064fe1562b01b27a40822e4369b7bd4d66b332eec221a1bb4de2704ecdf8b147f1a3af9186c9c7e7ed9b7a96cd76c08405079e71e5b3fa7d9d36afeaf58add243f0a82fe8ad74f3f197bb45d14cc3e887c1322ea646e1a2e5f736f3f35165752dacd8226a0f2f08aab680521a581df62b41fe7e2a91aa6d67be2dbd3f366cad9a834d6902ee152d18bab9568ea5d4c19947315e11b7f497dd8cb18319840dcc29386a7c49e6d1e1ca18c8bbd4a282db50357d36d2264a92c607651de8d6d3514820d1c4b565efc71d5520fa52da9293feb12491026936eebfa2aac6339b57ed75c0f5eacc07c93da0f474baafba9e9be33eda0518fd241c08e31514903df5f130bd5946f428e8c5e37b164531df0153ac33000b8c6eacab505d1691855b57fd176a7e71d465e8e0535d98528f94654bb832390ce31a3b0d145531c5696fd871985cc7f3d33b242d8f107d4b2f8734e4a5b0d791a39c49b1c37ff918d2d801ef1208e8357715350de53837978823eacee3338e2254617359fc31cf1448406ed632f331cf468095f2044949d03007016b0f3eaf475c1622361d2f4630402579c769a04719b809b17a4aa8368d9d8d13396836cd794106e106a4acd10540f3ad2324949abd421d322746f9901847429acabcb06b20a9d03a2c315f020bc137837a0254af127b3772598791b918c3a4028f4b3ffad5dcfe8817319a5bac476d974c7144e6c1d9e50cb16b2543f7794de507b24a1f2170de75682403306f5a12531b0ff9f433d4a26b9f8008b34cfe9cacc470432a6bfc1c6c9f970e42dd6fa241561cf839f0f1fc19a464d07971ba1cd43603dfbf4de524e81df93fe57f0ea9ec9e46a43a81c86e81406801191e424af5ecfb54402fb2847273c90caabc9da5af541ba2785ebe565cf4281f14ab1d938c49b5655f89eab7962194f9052eb3021407ea6765f05a5fe740138efe90a2a2f1dcc0675ff5043acdb7db89874de56bb52a5157a5df02f7cab4c8d5397777e5e136bafed3f9758a73a70b3293728b2f0d4bdf179a836eaa61b2a68647b813e8b4c7e3806dffe523326fa288cc653ae886ecf21bc675e3d466da3b16bbeafd07f70108905070a99184724ff0a47e7b04ac7e28d8bc3f1922249bf50b0878a9d0228268a35e145951e46f520e9e36a22ff88fe1d2ee476500455872d7bff990ddc1cca23dd9236ae0ccb767371c1666b6f582bb9ecf175deb23c0230144d6489d4f3033c4445654dac7dade1ec0a62f362e072490e1377a6f4a43842c29b7377b355dabdb3205bd8c405a450a0e5e722a0c8dab5dc71030f94363249cf0e4f4041ec558e724b9fb91d0a63a9d67b7c60f0b76ce59e34a1815899f72e81d07f4d465d7f97c9efb9567f35f0d5d6f3a9151c552fc19c83d9640a758fda21098b058a535dc100343219b22e55bbe876f6a9ea4b2b321e87342170740334f6e0fccfd474f9f25e4191697d9c9a42542cec842341681e6b67391e533c5a234a7e5815ee685a132c3f5eada928c554613c120e8fdeef6fcc4c71c47a759c91630b2a3e9ed8880db355224ffe79e0d859cff0b0f5cbc70b895e627bafc8d2658aaef7b2ad6c8cc638ac63b64438f2b5820c0fd01eb0f8dceac496acb8dc0387078f49d8e3cb6d28066bac4a430c04d5251cf6d8d3338bc836a795bd5e5b37de22d7a71a079e331a64bb8273c39e1d1f89262d2edaff87b9b72ee51869ea765423ae9adfe38ce68399c46f998b95457bf8533d3cfbbaf496b3821023a133c9d0513ba9903d3e8f4deeadfa24649a84d1b8cbad68000dda4773ca9e48cede373bf6a75c93de5b365fab9fac7c1655e30912b5051caf9f42b33f2f15eeb793c97b58193b518e8ce1a118c10b09696d690c4e39cebfd21933c45fd9ff7c25f98679bfbacf3214799afb7c3ca134258b1fc0b4818fb92f22b6611aefe35ce0b8761d75b29f9f3ac968552137f66311560b0e8cb2d0718f63d272b99a4af5b079a150c12833fec62554974ddb90fff67737de1df71a51b9838fe08401bbaf5de410f8ea4414b8813464a94950f9719c95ab19b076f3c0772bf591c34dbef2aea0cafe3930c936339fa2735dbdb920cb596ea58d57e6268f030d6ebea5db266c56d74bf611dadfa40d16ded04a56734b6a876cfcc378eccab2de5fbd329bb35fad40c66912d01a9b27c7d0ec215ad4e372015545e23378f0e1704d071b85024f4e0c56d9583251e295bd32f7674daa5d16e147afdb9e33c937cc1ee589227904e043e5900e88eb3ffe00ed3a47b55c7f00312c83d741851c5df9bc9fa4f881450cee5ad45a5b507b0a99e7fde71c5412d8f9eb0afda5d7b3faff0d7d939183dc7a139cee6431e75e628f0a886f09f9dd453f6c8976518f54b7e7fbc67f75e58fd1bd952655951aafaeea3d220805b3aaf00d974b69cd17c83cb86dc48f2a1127b9f12cc3550c503895b26714da97ea3f816a5497ffa2d5d7307a4abdec3a6d6cdcb9490f8b20f2bfc0f072a70c4706659f5f8bb45f5733483c367cfabd2d6325df1cd4502058660dd7ac4520c69d6fe4f2f224ebb37497e507f3eac32b89591c6d23b6cf3c3c15ea81ecc8ca32228e84232d078420826b743ab97c605ed8b9172cd4d5d40555671d66bae3ec755dc90dda181cc7d00816be7c901a187da1eadfc4391aa6a62ac5702f1d7ecdbad68946beba4cfbeb8e008b7681ac34b16d543cde5a6d8f454495a9841e81b6271637f8781b7d6a989c91a3cf931afc21c35ff5223db7d50b2940910cc3d4efe4a439ebb043985a00bb31cd30cf4cb8f62b73d437ecdec11f632ff0701660c01a08f9e70d3b86144b7248d3413b2bb0572df89fc66fcc9ba97ac98e581f0b71f1cbddb4370a2de0a04a3e7ba9e29d2c6d52561f76cc67abd3f475326ae5be4990744f19d7b8770527ca7b8e11c98b735f21f51cf00d9938c35b9da651706291208bb6e0954e4bcd0a7a67d320fadece56233e5edb3a498ca136a8b0b3c8dd92c8997acf18d3907e6ee26b147f7c7c857ade97ace0595fed960efe1939f61991b12502af094f30617d8bed17d5574fe0f2dc69cfa774c2a4ca6a07a88a01fcd902b7b8470fca12be5ffc57a5cb933e26e7a51d90d7925cf964d22a274ff170b1e4d70361d34d1edd3cbd0f86093930a180bf19b518bc14338cced25c2fce5c607f0e4bc3fcdf3c053b577f8236510f97e6b4c70614f9d29c6ce76411d3a1a72ffae3f9363389548084510d61fae1c251400c8e4d70517e7a29a4490ce2723b667edf738220524e94403323eafff33117b74dd550d7cc0116ee8ee9160547ff4d3288226f6a42128a978628e6ea8e4431730106d8ef7341b8e12bacf6e42adb2b3f696ec5ba6189aab0d0841e66bbe3e69baf88ad604d27a82a06fb762622b74acc07c04bb7b8993bb49c9e571981f67f58e0c397d3629b2df2a43c5c73377bf002ec7eca0a4e2b87ca6fe05cabe86544d11b1f5ef0bb8690618fd97175721066099f120b5a2b28d41bd3b1f4c5f8187d2fe804c95e5fce1a9e4e387dd1da5cf408a8e2d35058766bcf4f79e60fbaf77299cfdaa2c6565d10d269c348327848e1279058ed94dcff940d6ca1fb3035eb6b385909afcfa919bd2468e0993e52bc7790ddda20cdbfa996fdb08ffbd171daaf330df9b9225fec68bdd4f9399d73a1fc681ad233a30a5ebbc8a5acae9977ae87b37412876680bd58c43575f1f8e0ddb9dacca7efc0c4054996d360db314e4d3be014bde3441573d66211bc87f7a25af60b7dc11cc9f586898ec1144c40fea113e17860936425f82abff236c341c2fefb26b4888269a5c9c3d9f72ec76f909056df2565606db8339c025f4b6f7f48b30f51fa64e846ddb53f9efd1815660b044e01a5321208d60c7454e16351583a607bb4d6bd1708a43444065c38fecc77e441707e3171dc886bf9dcffe63375a2ed8879d0fbd858032e1b399bf84949dd1878533bc84492d53874c3413cdb7d87417bc57086f1de01890d5e42bfc08744873bd3616155d1c65b2d302fcd1119f2469fc33fc62a41a62e609ed9f4292bb41bd2187a636a4262bd6c4c52019ff1eae33b98c4244d29fa055c20e9014de035bb84490e364c8cb144793e31414cac7700966f8706204006f64b0df94df44cd04f9a8fa342c358bbd99b2f54f3dff3a186f96e11d56d2bd1ea738c9240e5178cc05c11c3ee974e89651c474481216d715bacbde9fafa9563c71ec63b42eaea72f412f8f5a48f1522ce42ad8851dac3ee68f78597db8f24c57792e27cbbc96d88d4046bc2cc74568efe568aa8cdd19c219522eea4e2f680fee01709dd134b47d8487a93b0cc0eb8d6db9f052d5bd0a110cb741f9776f65216ecf763e7b238206a39bb97490d25e4014f67479e659d7ac5f03641f8fe564216827817210158a2448d10a015f781811741f478835201ce48edb17b50e4dff70589e44e14667373702ec1d69bf3e938219890be658ac4459fab2af6268f591aebeb812f464a503bf6021660636727b1253e8144ca75ae88d411ecd902678c52d18f98e34116b8a3dcf35667f5bc01932e1a0f303d7b873fef063e4d6cd43f48be5d70918d3073522ce8cb12da5b4087411484ab43041612f674677aed3e3ca4ba3d5362b00249f2eec8bb8a99aaac34681426dc667824a7f342b0870c0d490dcd17877e34f20228287d6ff6ba130c43aa023fec2d3f79a9ed58619d52a92f2b00d3550ca16a659ee4ee2f7fc5fd295b10c6150220c1ddbeed9ec2e3467bb5a75a5905347dd13bfc2903434d43d0cc25a049f047c866188efafc1a8270e9a529e391df20528f4ce900a4f287bcf3bb4864711ae3ac97f1c21c5ab3a1585cc658a4642bf5a70c600e6fb98556b6d0bf6d6427dafd55ba32025ba0d369873ddfdda4b830de05af3f13812a44e1bbce9f3ca75477bd4939a1f5c0b6c30284f2b95fec773701f3e2b09f3bdf77515255255c35de3a4c127a07445284cb93d7e51c8782878886f90d7d5aa7c166cd04cd177616af6bd238e72b971af23244097ccffd70d26b969f966ceeccb6597e579e3e3153ad527641e6d7941ee9423fa1219c68be3e28596ee64600b2a7978bd5316236f2c23661b7e1d1e6684f41a9273b497172b506f6ed65d23b627d691d06ec4b2cfed561bb213fe233000e78ad23329fbf961e4e95a57bda44e31e175c7138c0bc7ccd19ab0868d224ec0c2f701e6d66fb316049601c9124c63d74e96f9e7e8a8e7694a759f3c469603633ae1da05666cc4c653c7ddc0d7a677966267f15247149f31153ee6abb6f90e6693cda2f5466dbee1472146d59a2cf9edb18b35f943d96fc2c6492f5b5ab5b029822cf55cf30cf1f55324e55db64a7b4bd05340334b61c98cd246c1d1ae66a94a7a926992f8a51e710c3521efd8a97c4f33629896ea484cfdcd9a56952e864a37e160483dd3d094f2d6e494f26da46d465f3bb7aa9ce75a941cc6462c579f23805b4939c3f119e5e957b5b71bd1e5deffb84125c4cfd982fe445d28edb61bc5a24cafb6bbecdb91d2e32af0b2c1c831a9d3055bac1f99568ae8b1777fd676911c39f6479c33b0192e1da6ea5da9d615f3340ad196f8a135d85e85aa59155a165ca7cf54cb4211fc797bdbfc82f689fc5a5fc4103be78ba1453a2c39f01f10e5f21a9d66efa48bac43621cbfa9347e454dbac3aff168a3397fe027cedb3045606b06e3067fe787b8fa74fbac66e00d815bd98bf96df8926ee6f50aa171155216360132bbd27780932d38fb3b1285c240f3408f94e813e3a1f8fd478a581ae187c17dfeefadc120eb5a129de452923704b26430fb2646e183445d6 MD = 3fb5d3d8d7154294799650b12df25c71f508c4b0bcd4da2ad6e57babc98439a1fe21d4ef57c7c0befedca85d517fb9c5d5a705ffd90b1a5b9f1717001c8ef547 Len = 51712 Msg = f287b06cc38a839b7dcbb375f1a5bada9296b6c384fa1925f519a219b0648c3beffc054f7174e12bcdd890d106ee4ddb5fbb991c7149e8847aa89a44f8332c337714b070a70b7a49b16b1d5ccb6596fc0b88c6d7788926d56740b64305f4363030d899178bd5b7bfd18a42606992fb073b05253bc3413ae163eade5dfe2f11fac24fa88c455cfe54d440e72308fde5c299399f9277f98e7017adfadb0b6d2559d682c616fe28b8cf6392f4eece2fbdf7cd2c1a22bf3a894a2b91f2055634da151477d9ffdebf4ef9258a5109e6afe96c7fe67f35c18a9336469eae23040f98f52338ca8d0cab269ac32fe6bc7605d3ea5670b711a57414fd10dd167d4083c7c2accd8209b174aa7ae4899b4fa7bae138fad1a9fe947d74673355135b301acf44563ce8bbf4a0416031a15909a0557d2014113c46b62f1c3c540e8b04fc5b1843ca8fe3eafeb95215517e06348a5e0e684c395a30321172441e1168c1cdce0a87afce5ddff6474762ed288c168c5dfcd9494fea0330abdf47366590dacbfc0ed7aeff3de305d0870dada8d1f7cfdbae3bb45ed308da86cc0c4712ed971d6c8afd6f2c6b3c53de7ade3805bf217a608e56346bff8756299f5cf721653feca6e8bf995cce3207f8889f37473ddbb67203f1728055c7cc1cc2ffee99e21c5f338ee6d498500f4aa719165177326cab9b75d615a4bd1265e89bbdd5824b749f9ae63acae7d8194371950c2f9c881d80624ccbc6e01fae4814945e54e58890d363568220514f9a1be1644a79be26365e4ff1992d3b63e49f2813a912c980b82417488881de9bd8f97cee95d6e5f4ff6cebca08f1bd72fc8fad8267b8361d34ba3d23129397a51c06cc9cb8ee1adabfd3bd40dfbb6e323e422a4860ed34464bbc5d4fe9fe8355ad6958d4796a64c0c0ba4ebce832578cf2e027cd5c5acce346520034d56baa94d54ba8ffa2f2cc8e484a24a4e9ff7f685f902c7923a705dd6da6ad3a9d821548dad44586f92d592ca0aac961abc9eeafce7bc2b47c7be81a08ddecc90beacb5a052bb6cf47c413821004c55cf639ad4787c970e6317e7b835f224549e54cd4b39e798344535e0279df7d9efc91f7c31ad2a1bf770859c800ba9b4122f44f3939ede5354ce7a42ff7573fdea846aa380ff72b36cfcab4d77a607067bc009c01d63998534ec93ea1e5be720ccadbfa150d3d915d563f36aed79aca3f7fd1da3471ccba65b4c2d3602c5d3db1c9199161feeef8bc752e885701b0d152d42eb2dbf2ec72f3e59a0b75b27cc9540dc81424c9508adc926052dadeeaac2721e0ccfd40e2e886491990e761633e7dfeb02e6656ac6f44179e3b3d588f8447cfb0cfa245f645a5480707be2059c3b5049885308d49cf7c6aaeeb8a56e98038476364d2e86fb1d94a2b1b03d6a78082874ac1895671d10df5580bc9bf3ec984f0c43296119753a9b74e72bd6d969e6fef8c8b7a996a9d7e1e6643007dd786b2319ae2f5a8b4549df738b4f4cc6c4501a4278b0a3e7d5c574f9e3a3977fce04b74ac1bf8960fdb3d72b18ab0db719cc20ee368412df23621efca997b95f5ffd620c386a6c1f0111291819cfa82efcc399587ca274e11526266b007cfbf090adb9da7ca07129e1ea3ba6f91d9a92cfceea2dd5bc58921d9a51b192d3bdd8129e35220902371632978564511563871556a9babc022c76cf26f78ccb2cad7a58675a9f68003c7855a1acec9c6781706ff34eabaa446ee38c64ae493408195bd461909f041aefa4dda1088c455472f3321d4f5d2ad3ae8ce7dbdc7347c6a00119457dad87c2cf403d1e2eefd69cb6640e4d326ba83059b763e518a78108cfee996b88574d8869bef6719673ea80da5746fb8e43ccfaff178318c9327a4ef788c74c3708dfec3d959c23c5a4dba14d519eb0b961e3941d11b7ff94b09df9c5743570104ea95eb95880dd331f348e8dc757f55a62968c222a8501d1ae56a9a815667f8a9554607b7c56e6753f8fa92a4d0541c7b25053ace67cb826985ecf1e00dcb32c894b91d26580d7f28247719137491eb7ddab7b2bca019af9eaf0eaa5bafac37c7709538cc8913a3183f688513a85f4714102730d49b612c232c78ccd986318d10b1835d90a0a85b8b1074df8bb3e6baa88efdbffe9fcc825ec4d15f44d883be091f2a965ae4f330e960442e62de4dcba11de06422f68238b93ec26c83eec9521c8133ea129e1da99af77f7a8271bd036785782928e6aad69a64f2f97e102ccfb0a14562a1164d4f069dcecbd2b45de8628e6e15f8b86de46bfc0a111d86d4bf2c450904ed94aca8961ad92a3aee5604fbff6a307bb4f2eb93cfb1b94897e8a9fa3626dadf60623eb035479ea269cfdf98a21383972162737aa590fbe78c9016813c45ec5fc19699beb7c130f26bf1ffa33d12153549e40288464edee2adf68d291e0e405601713f2669eee7123de3ee82990eef3e72a1222579946a21423f965aa628e0aa661aba521077cbeb27ce349f7eb01798e5c05ab9070aa88c9396b97c9a3cd44539b992a87703e46370da5760b4a0972dea6a32acb9579f0ce8217ff7c3f1220dc1784d92653b3b63622ee12f028577e3c8c733665524588788086f34e9f0d4ec487d7576a1c6d7d443f35a733108bda4c9fee450a318d9e6bc741299d4e1f2c914f091bef44ec09c5c50489309d073573338ced06ddc2c12cc8dee8f4b6a828b6efa2ad12678ffa5f56e35f95286a0e44f9c774f791759f2007a8d7f18368e1c9ec3c717ffee9bd55675a80cd4d14d32655369369072666d9f6477cf01eb1d63ec72f0f847589c16c68c2a34575a812bbd842ceb7a955d6df37232e9cf323848a02f2edcc55d0b4f8fdb42d9a2c844b69e5846d8ff2745d942cd48334ab2e6b30124072b42a6ef68f78b78637ec49ebb52f74163e7d12798d59c411739142f8c5876054d86db504847c4543bb3f698231f88a5f6f93a0a94f408a3fb65ff1bbbed50b0ab59a336d9c6ad5fc7090539d44e33f8f8fe0af6b4e739f849971cb32908d88fab83a6aa02be6f2070489a8ab72622c4d1bfebf4e0f556c7689513febcf1362ab6cb8db3ab75311f9e375c91b4f17a90e801830a00678799c0278b045def930935fa005abc341ce5ba9ff458b4f566e5a78f7a43fd85f6f5b9172ccef54c17b58ed8a6a61e4358f92a4809e79d7c0c4a753079a4bd97c863bb2c9f636a4ee9b52b2d289fb7ea0ce358fa444459cc9447baab283729e5286b2e2d8ccca63e329172c12d4d7071612caa7d4d79ce2d2764dfc92e0329b73c967ae39a0f8f6419d2cd5c5eb9321f7e5b8a98cb8ee6e9ed2a4a523410a6542c6b071672360f07c7ffa3c563eae33e8bf85f15668987470d20640ee167860521733e8dbc480d7063a05bc5e3e86c14b28c91bac7749b8eafcf95c4de0fb312433485121f4e70e8163d5f2487bcb6ea199e885096560907fdbd463ed21013c3b938456b434f22b5085f16aaf66da807e8b6ab9e7a38b9fa1c74dd426673905fac07e761d1530a1f608de81ed80329b5485c646e1c2193ae377cc499423f11304327d1bc7163107047503d4ad787233a61191b8624197f6d745b610b0d7c7d7ca7226d44ca851ceee42f7df499007ddf5a7436af3929657dfb9b1e5f6f32be8cff8022c185c316e360b210e5c6761fec5bf61eb103572d27f5c3625f126abba874c757fa4925e695e2615fe507f1f1a98e253b542cadbfb38a5c94d19b2c5c182e8176b8bfb2754d93c5d0bc047ada5d198cf56059330369e1ed1e7eb57e89235435e6c38f72a9529a65cc316418c55224b0b59c34f0e29123fe672e066a2a120e6c0fe3606d6bee20c9bc0dcfd497ced81be1d165ec42727718d7a836f7272d86ad59e0daaca4674d7a0618efb5391a5c54e3c7942f0d5506c2d6b6ee2d68bce1802c81a6363a0648ff141a69c3937ed9e3214668c22982f884cc1ed615d6074a6df08f6c1317133ae04cdbe8068d417751051689ac804174e621a995b65756e7fd0dd3d34c21d64aa61822128710ad5d24f5fea0f5f8daa2713d1fd419d4f0e0b7eb1284e84296a1d8dfb98f4d0208b4e75bc855a67b94abac89483a44361e5e24f21727ef619d66fe086608604d9ba31f9e3a4fc5f0b9b71f6bec7041632889ca8ba9636a6531c2a1fdf225c9d7ae5356261d375d3e8fed534cd21d18455688331c8fe060389bdd4825258d8f8a89ec135b38b4734f5f76cf95c3eacfc3ef84e70f9247d9c123de7be8c6e9ba4c7395dfa5556f110a707a1bac877e70c43da46cca7a40dde810eec2ae9fe05307b676416c3a0f3e570c20c0fbe683023286114cb70f727595ac34a6df761b60a298b8c118b03d031e799045e8a89e8ef413f20f3c1886a8b03dd9aee31441ec056283e7117fa1674700f332dd94791bf22c703bc35f237f210c04632341fbfc185bfe3cbf6fe272bbe971104173bcb11419b35ab3aaf200d061de4b05c4f19ac3cd52478b48a92c607c31667c0d0f584221e2f374c29b35a6848ff0f267cacdeefea690dbd19d9e1f015cbcf62a1819648d258f6e6fc52689bc3eda53f02f9e813723a018d367cfe1bf199b169282fb62a5a6b5097818da6252138f8e28c71364c0f1feab17aec78cff9189460cf30724b18aedada73e591a8e37990dd73b377fe13732fa621b8f0909eb10ee62134492f9fcc0c2c2dcab97b8d28036c5320fbae21ec56f7f562e412550b8745a8cba95c522b4b0929dd9c3180bca73b955a5fe0acd3e713406ac1b9be80841bd0371135c2453dfdf26e985f60b012b7d4c0031a36c25674bd3127eb2da88bd522372f5072b25b77122e6c499faacc5d7be283df32503bb8a676754b34fc050e391c4240e5fb1a10f37d56a4aff54ab90532608431e5fd4ba67b384e66e396336f86f87b9e77f03830dc05e5142804470b4017cda7fc11aa37efef693607a5c15fe7c054feb1746934dae88f6ecb8f83e89c1800271b1f50c525192024c0ba5464bf2881a9502d3089fa8d08125852fc4796ffb011cb8cdbe8bb3407b5b75a49188d9f7600bc711a9aab51e39146d51c82d11d720a75d0a82d22de845b53fc3c05d39396a75ee674017dd5a67e2fac6134db2fba73a29141ecfc672a981f16999711b3880fcff3f938d286c53b6b4f76d80574fdeffa3545a2986c6efe814fde66d86dbeac883006cb59f3c45b9224a9d6e0abb0c1b5330008875cc5f112fe96df8830aef000211913749b38513cc286dc0d2277bb9c111d6969c6d4024ca94f7bb19add8cc02dccaba2fb75aeb3afaa31eb87b71ff7660a6f8028fdc4b6d664b5e50aded550dc8e1e657310e69f526082fc29f3715f9833659af1b79aca1c7338830f076c3aa3d9c65cb0ae7b78416649cfa7b1524d2e44e5facfa606fed1f75e1c25fbb3e62a3c5dc93282efa6f307f0c68f852548ae9b8b20012d9bddad6da120de204edbb6322f6b5752a5d3fde202813fc38cca8fc3bfbb34d2bbeef542ac3196298f83fe37c593bd825057b87119803700db5b4849ee2ce92a099b4022d9befc5c088768c9aad2c38651dab921803403d1a3636e9aa0e58c87e77b146aa4396f5c4c5e7c6469b917f33cb5769fe12d349a778b792272859d90e7f6f896b6316d8ecd61afa46ca7194d73708738a6cc37efca3bfe9ddd7daac98da753436a278587fe3978e63e4d45f998b451886b918c360ded45593c4e12964af4badd4a8c35cc716e7ec658ec3c8c1ec97c0b8a3daff1d51803e13977938b9277a5e0d1effcb0a95917a147244b7968485d3ead0121c79254a0c23f7a7c1e16a89ada8ac358f91881da238386214617b97b9e2e8c801bd82ba288c8c75ac229f00046ff96c8fa41813cb988822c76af955db69940296308f59f815ffeae1c5ee68ca28aeacb38b6cfc5cfd088eb8f925489f467ccac31c75aee588f80e49118047679c72fde38dae60bf2f63add05627f76e43472770c75b4258ac1eeaca507d284393ee6807f303c55bf63f87f5c928eab1269d22857a6a9bb7481a854dc80d90c6d5caf4070695b5981a4525109950aaceb828c1ea7dca436b2593e8bbc356095829adaacb0b8cb7de621c8e0a0fc6be2fc18d0e8818a2c2dd0b3219fa87831a61583f903c4d105495976ccac973b3ae3a09771145931a9e74c19f22f45cba4c492b29b1401347122581dfe2370d3e0359578cd10a355c619711810a8f8c232578671312c0a45c7cf7e81bdd3b249044f3747456c0488d92b0c181dab55ee82f56d7a4bda54975177194c8c3bc01d0f96f29d8a84d12d8ba269a46994d192ef24c4285b9d54abb6dfc4d8f9da4ed27ab373c60d09bdc63606164794f3f0620f5c06f5e0e3aef550501da1872da2ebde1b275b3d590ed560cc9e7c105736de3c01b27d6c5bb806b67e6040a4a460cb923489e7abf168fda47c6eac7c2d096a2dbc63295e43f44271c15930d2dd0d143f9617d5c9614081797c037328e40c883cf27584476b084afabf44fcb2460c385ec65dc026371a134871f94ab71ab4cae22a8618b80f5882b9cedffe936de2ca483bc81132e17a2599c4bcada74f76b4c5fb014110cf698c478666d126c3252cb47cf3438fded53b060aca1669e0d6a850ba63a7f219bfca1c5c95feccc447e20be04bf19dadbfb5e5aaae0f8f8d59480b0f49b7cc8ccfbec0e7d9e1f61fcf7cb72c4e95dccc9e48e12ae513788373066d501ffb10871decad8eaf254304307f5eb7879addc9f5466111ebacc581c855e03352ec5e972ee65ad78223343fff4c6af8638b01045940ede64e45e706adc91c1f8ef6173b770e5148ff863a11a07654858ee0f72a4ecaf01e69796d60b7d2797b20c2daf28af7296973a8d527a88fb3e5462710aa2a371030e9a1c94e5b0470dcb4bd0a4aef232baf8b1585f09bfaf17e45e7fde28037b6b43b797b2e2bd19acab75f35a2f8050081a256dcfadf3aa5d6fa8e1f91f52f6c1ecb4af36e9ebc6fbbb523dda94a2f208665e73aa506e13975d093e606dd9098e735a0d2ae184768361a9572bc6a04143422313f8d976134e15493e1dfce0dd583f715995b4ce50ca0643e855acc26440173df5c23054d20901308a36b2af99aab8c13a8049127d5a13e999612d5083874e75c0103d5077508886cab6798d6609461159f2889725bbee6112563391c8a14d911ce8e8b12bab1212a5a238c46cff512b5ef359a76e730173fa3ca5ce59157e59b35419c115a3079dc404d79ad21341d5f08ba488830cb3e9fa1c6a4f5e6b48972a5bb8c65ebfd0efcfe33d58c1ce7ed8b7c351838a0e6b8ab9fd6c5c002c12112c05ad092d88d3d06d48544560b670fc5da248e0acff931de0e7923d66df46905f5be0d2ab857908463a03abd8558008873172e71069926b16e2c439ba0c4bdc6b643969ff3e2a5e03c132d0503314c6df77b5e0dfd3d03c04f7ea99213b89bdf929a115533b4f9c4ce5c9fdf1d696fc0d7cfa1240c6b557512deda6c5f568fbb1b0fe1fcc054e88c8afb17ae3c86c73b9482ac65cc9a986a68db3a5cec1505d3a033acf942391eb2026d08f4d9100f38ae42b445a64148fab1d25e16428a9ad3d2a3b6dd31d7e8cfc530f8457b7b8442857e7d4631f5e3b07e72ba1adb1dbb1612beb41b07c7f35023c56a02bc4fe2d3ca944be9f83ef5263f3ae2cd4e44e324f10309354c6fbacddeb8e2dee4039776ee22c4935172f9c664794cbff496af7aee1f4aae7865aba33689d71cbb1d0ea650b86be4e6387e1b9edc7c6576998ca27a41ecf90410327adb96db5e8a12d4eca2c3a6511f05de803ed2d6503cb3e716263964a778160bbf2e8e5406d97b76b444b2f86a7451a7aed4db0f02bf7c6b506254463c5cdd83eabfdec5c831cd6097c724f6937eb275f1f1737aef976965ebbf31062a2aed3777ffe6c4f52b7f2ef19a88156ea68ea5f4053a9e893cf18342bd4e28e35abb92f17f54c6201f073e6c4f6ad94e846cd41f807f0e6218ab2fffcd0a230a74cf32e1ae974ddb84fc2b62562bb6c580c37cff13df3f0cc30ce86d6ef38901f19e73c31e3cb08a15d4527e3f79426624390cfd0fc9a4ebb48d392623a8cf6c69bfe2104ea3b2ae1a16500a7ba1e0a30723f0a404dcd47185a29eb47b886aac459a0a43a06ac8da3a38a0b18b5425fe721ae48e736742408ee38592e710ff340db368f7b3f04770dec1d0edfefe96fb2d944516dc2772eb58d67a4bf6e0d1b62aa26a8719e2c31470384d2a370f980b72069ec7bf6beaa47be2093a1b66a68544ddab8c22a0c037a70291f0d415cdb1e8185e3b9dc32e3e60acbef7d510c233b4cb88616ec8c34cebc72bdc569f8c8108100fcce7bb920b8f8ce80fa48dd9342302adc16ea950e6a6ec97372f0b78eb5aa430063db3ca8e810920ec1a2c3028e809780692e0dd7770e950abcdf7f773483b4b61f05a4c49cda7f617967a8b64ac4673bb8c0ded81c253e4b4d3d3ac9b594bce8ab00d7bcfddffe40cba073f89c8501d5aba6ee59823a2cfbca12cfcd6266c45caed4bfd832a675755f540c10ac49cf16e9ea27a2d0d5c6e5de6626cb618032dbd18a436063b74dc6dc8b5b46a39b38c61b946ffa2f7e76d02f42270bda6a6f2dbc294a9bba9beffceb4d47e2a900a4ace8aab0abc7bea48365adbad4f6ade41a16b9bed25cd9c1df33a3ba2be5027b91f936d1fbbf1cb6c729b0c770dcd0f86a8743864d74f92d365d949c6a8028263df53fba334021156423523625b65b12e4b9cd8a5428849acb1029d3e8a2fa0b7885ce539a71532922fa9bef3ca9d79c525162b22fa0017064f56948ea7101930a51ea847a7b3d5ac95693dafcdfcbfd7afa07e62505f816cab35ce3bb18c426ba009b351985641120e143e0af80bf9d245ac60e7f7ff1f6c5f30a8da2bdcc2d513be94ec1b852b4f040b2e79bb33be41a19a612863575771c5d7c2ce6899f0e98a9ddb7b83c8ead011ee8d80aa1c83a23e0b0da7f500b019998b9a9d0a3c73354f37e584638a0621b21ee9c4272ed070657ea4eb5f73cfc024dc9eda833cc0250c0d519b5d4113d06f1cb198c4d33b38c255e576f538fd02023b5dfb66334e553b9e8e34b3a67a4893787392f5a21a67df214dbf48c8ce6bb MD = 1333d76d9642fff25a78e1df287d433bf30c61c2157870e19abec86524bc248c974a61a14546cd6edd382910b9f269a913b09f72f44534797662d3c4409e5701 Len = 52504 Msg = 4b21e011a232ade7a8c92be77925e878ae0bea9723749528fe83cf89ecb9616dae6ca0e8d5754ec6c92abb21108c2f33cdc18c6887c430b72c5b193356494cddccc577bd4c2cd53188f352846edff0c2ac7869cb74bb16a77c0f0f194a7a9477ae15abb890bd0bcfeb0c39381a87f1d05319c7e971c10e9ef687f96450b400e25b4285032892b849fd5db8649cedfb03c88defea063ee144a1ab1f3bf05f59c7db364dc39c11a446c3ce16307d78d50315ba29f5bb9a57438564c8c7b3e367cd37d74b2375a4966f47489dc5448f4979428abd32193d3840aa983d3020a9f29d760fc7493ab2576c90b1934b799c1d0d55e4f2caa78f4ce61930c79dc017c2dea0c5085d73a3b0e4a6f341e9a5061a6658af11e5edf95bdad915ac3619969e39bee15788a8de667f92f4efc84f35082d52d562aa74e12cc7f22d3425b58f5056d74afcf162cd44e65b9ee510ff91af094c3d2d42c3b088536d62a98f1c689edcf3ea3fc228d711c109d76ae83d82d6a34dcfbad563cf3726519b519fd48b51741aa86720836494b7a589c778927047a25d73508adaa401e9a6c0767a675e31c5556cbe35fadc9671359b45e985c3c8af84113989b299ae4474b85e4b5d4b0578ab1e8a2915a8df97c4f52a639fe32272cb91bbfb721505dec46d51383cb8973425a714245c2e37d0577fbe0d66381d9239db1f08a380cf609dc699698e0fada2caeda44d58d766c4f8214b10642b80b8d7d8add7cc41d47108ab7d07dab71069a2d982cc900b331caec317942122158bac6eac9175c2dcba0c04443aa9188832b553f5ca8c336880824d6bc02486a2b4c086665d276aafe3b1b93729829adca50c44466fd5b5cb977aa78fbcf5c0f0da1b09216468a11493ffb39efdeda5d669ae92bee2f2fb250aa1b9cbb11c36c7a6c6dd26cdc3cfd572ffd8c1dd72a13c27a327a34c6b6b3d80fc6c67c72152eec0c8ecbdc1bd5cb829b811e7f29af6d786f4e93dd4c96fdda295a6aa258d7b2fcf291c2d68e0b1866032475964ec0c6f2fa8c2d6a3936ecb187350def4e818507bf157c0e9b33406be7660605af14cccc9c799b4e051d0d0899e53495bb8931a6e2984bc6dbe4e02ec8b4642fc2f1cb5fd5a5520b48cfcb49e1f9533838753554dd98b6a1b8a67409279df477330e5f37367e06247ca5c3ffefd00e693dcc0c9c30754121c9ee88a574915b9e77c104fd2f921c2c096573951407ba9b440423d76bdc6fc978237a6e302cede7f99038ec31500884775556941f1edc30e3a417b0e02cb6fb5bfbe5cdfacf4006411287bedc565fb06f1be987416407dc852254934df4ab59edce476f3506e65be6ce6ddf91038642291fb8e92ba5b1f0b105670905a2c14796110bac6f52455b430a47b8eff610bc6dd721344e226f1fefd3db8c97e57d56ed7acf201a3fe1a6ee7cc1e5598c938185e8cef3298893acaa040e88750b43fa7c51fe44b62e4fb1518c58ef5e55633409bb1e903e36c449681c8ca74da2b9c49b3d1594d3bbe3fd14cf79317eef143671d4acb5fccb7558b293e243623a5327f292a18af35742fc90acaf563ba83b2b56abd5bf05952b6d11f08bf7533084b6fb092eb1859ee1326daa67b8051f2c6510c74625b9425af8feb9063da133e2d41cf719830ae15330f44f3ef17bb28c8648bd5a74b851987ed163cd70cca2d201e0f2fe8a03ccfd6add11917cf000bff156d4af466331488142776e5b460bf6e2ef734a3100b0545280880bb512985b58d3c3a0f54a6fff82ca6a5537adeda5d980fe8912724a0c9a77290a5453e7d30f37f0dc1bee6c3205c1c30ea054b683785dfb4798e8e86a85295b29c5145daba70bf2ad24cfc4648cd108172feaf50421cf0fe25ed51a12a52fb4c67204886992c83fb0aa5ef72b8a70affb30c127ac786c92f5beb76d799cf2cc8cf584e68154e53e73172c72eb711921275d87dce0deaf2b0e43003123bf0af8c9ca2606878ffb7560e5a8c618e3331227f0af7345e71f4e8886503395ade0b0296a5856e086638b06a0647f586366e979a4989940042563e0e327b343cc1cb90840ac5620fac5d5e0d1d00d1e542d2da8e3d3ad63c87a01c403e75eb29c074a03078282cd3f8afc6bf48bdddf37ee451238f12e25a655be9e432f8466b0390996098b7b59d73b551482f8801fa132c6520e719a0a2060e0cc3b50d2d49b3a6e3dd1279e3b444f7676f7968254029327e4fec58f95c9241efa570bb880af83fe66f8d779f6295fd71fdcf66310ee67f057647d6d3cf307cf9520a0a3ff7f9e209ddb1b7d2ed8b50d5bbd8880dac759a605ea09b1844094892912c023a58df17b7f12743629e5077fd6e3dd8a262fc0bf9cf9db0ae03452c222b7eac6175d1675571972339bd0cfa4fe1a55ed678a45b3791e91c7f540bb111e9a70f9d95f8584c26a85d3d92e66235dbb92192359411816b2ae7717f835dc8915033d4017c7404d803fb5864073516232129bfe3f5b54126091a6ecbd7bbadeb2021ef028443e54f5004717d97fe5a82847e43c8eecfde8a2dbc5d822c5029c1c0e0d7de384c585236816f23bd4268c08a29082ca8e8c05f3fd525eaada6a5d9d77872ddc117c3ab5d793c9fa18baaa5dc31f4594a874f6de66eb04b7f4487fc0ef2aa49472c8f206ef4bf396c6087f8229ef196fd35f37ccb8de5efcdb238f20d556668f114257a11fbe038464a67830378e62ae9791453953dac1dbd7921837ba98e84e856eb80ed9487e656d0b20c28c8ba5e35db1abbed83ed1c7720a97701f709e3547a4bfcabca9c89c57ad15c3996577a0ae36d7c7b699035242f37954646c1cd5c08acb4f2a2076abad02a3bdde8a4c68f1a755ee6f67eb0ec2e35a6f39e9d8c288976726b26b0d15e5b2671bcc88989ed079a29d7329dd5f6a60a72af078567e18510fcbe5d8005d9a22dc57f3dee0d4b3345a4f526d6eb6b1f1ec1238a61a5af82e41a924f5d50522da800ce4fbb98d224dc98e9d9123c721fd95bf62e198fb90a59968f0530f8f185fdea5007d873a964c9cd5a53370e3430a308d1fc966d28a4d7375e86e246e031964bae6c2ee6fa7b720bf19d2eaad9d9e48f5cfabe8723d9c6c4a7da598244b9d9eb9087a338eaef411a56bee05888a304b93e327a24d32f8f06110a7ff448a630929c5e20b3a34a9cc130be346069146b4e20acb38d603098c5451d3be4117f02077dfc8e9d4d13edc927a61109a5b68116a96f4f0bf1644ac8eb1b7499caccb713d966d33f0fd39bfbe47d619c6411afd8828338e4ae520dd9aa0d145c9916b77e59a6d9e112110e1d0f4b0b61cdab5b5e52f05460c0824abe2afa0275a6e36910a4c286cb7e55aef75019f7a0090eef6ec2be8dc94f7c674014ea262c1abe379063c5c4447a28e3534dee0da13fc2d1d17af6c96582c9ce2710e568c81d2c88c83db47a952e1015f7b1d235ab984d6b4f21a0f27e82f0e53bc5f4b093d6b7c57edb999007c397acac22cd57083c3923af5fc2ef5a77791644dc1ee6d36ee6547be47bede06145103a48e85bfe520e63bbde66a84188edc809fc6cf2d10d419e8701637b682fa1a969cd2a29d6035292394393057dddd26253cee4bcd5d9510b69da5821e95633e001569ca9d8768f17f23952ee559fb34eeafa912d27fd9d04eb1662c7a9fe831bc98e44c44bd44c5cae66aa4b10f615f39627782b0e9faeefd35d8955f14d1ac38a1a2c60794412c83472a304f70982b91ffda39fd4e80a35ea59d6b4096e7f410ca55c66a8ef68c34e064501520181084c261972bfff3b3ff8b050ca39873afb17d5dabf21fcd6b5c2ca992b69059b48e647e28a180cc974c50a0080c9c1d45b7352b0512c94e4065965a668833e56e1b50b07d126393a3b1810ecbf0043d4c8e7c5e60610df1b1fdb8074a1e9d43d3c81178f2e33ac18febb691e6d2836c2aa3dd682c51704026610c20cbfe4eed5bf12168288858dea2474be9e7387c127683b2c8e75872c2244c0d475a8bab4a8d330aee8c9650539150cb772ba650d896caa701100a97e0122b25db746b34f3de1a287cad81b3c8c384bfba4290c41731d5149144dc5232966af06db7f19e71c4f314a2f9def596bf7f8333ca7c3866ae3fa609e442342227a7f77e83d32a3ce86a59f200029845eb9dd06401ed104f8266b5cb7cd0a0472c4ea57e66748acdaefc62da4e910e7eee7c01dba757fe2a44e6de767d0c491a3aeb84edee5a12ac8f15b9dc340eda7a2e76a1fb1941549f6c3c8a6b73597103d9eb006d79f854421f32e9685ed08ef0322a3b52e63db6077ee4443aee4cca9c6fe9b24d97c3e226b5f05c1f3d8a9e59800328738c91850ae35a96655c6aa86c8354153ec6713ed319ca9c614ea18b1e9eae13cd7b116402401beb6b2c17bcccaab6a3919454bcdf812e24cf1099c7c7e46767d13001b595fbb4cdcd0be85a655c8de7e67ff2fe94a2977fb901e7f6ee07dbaf1f59f70c2e9c91b7fb4a6123af0f464cbdf7d076aae49327dfb1207ae96f8754184765da44a95f348685f68b02397c6c887a71b77addad9773acb7d65281e6f14c96d292708859cdff3d3cf317619ca1c6965b239ce443594533329ba1f566f13ca6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe6915c82aec1768015ae88f5f39e5ada6bf93e8d7b96442cd138ac41e059a1a53426249e02ca464b04ef9a428382ea77b6b729604a4ea95642148e3f01ac836aa58fabba9752da07602806c1bfa7f8d6f8cf47d66e48875674ebbe9261841756e2d6db1e95e09c7cd35fb4bacd94eec0da4782390f0c47f211c524822768c73093039a1123fdf371039e8c74d5d132fd0329c1cf54234ff3beaba8597ce1fbc2601cd2dc692f47af98ec753900e72e551d7dece26614092025a3325d877619d2ef2b6ac8900101ff3b525a4f755d4890cd49eab86d67db43eeb8aad871af8a29eb374a1bc0f8872794d620ff5dbbea75bd97a59990a52f22c1eff8106114b68ffa495a1d209e42ef4a83b091e08a7bce956e04cff7556c874452044e802e05cbc4688218d97a9a21065ef24d25516361fcd7efa1cbfffa3822e8b6d9f584e0a7f29caa521214f8836f71ce7b559809f79bd84e56342b41fd01b9f7fbe99eade92cedba14f4f5c2df2ec32d6297e8d7571a7c09375962a9a08aceadfa8405d55a19649aa6a7a462fbea5cf54b14c7344b20c8098c632b9ae7642ec21fed40c1c26208325052a93e9f4c45107ef4c0889955c6349d790f7c9c37e11cb24dd7d8e9afe26a5a1e8dc095fb8564435e583c0a637d73b1c495b785adf0a5fbcb538196a7f82b0b32d74ea4a024dbe27a19b666eff5af116c45b36b6c624341903b2693f2545badb70f5293e32b5ca2718a5f75a437ce0698a7d8151c3fe0cec4172ea639fee486d4be332b6ba1cecd6b339ffe274abad670448f4d669063e88d70019824fcacdfb26b5934e18e1ba98f9ddfcb233659c91da33ed9f25cb4d816cc07305a589dff789e2c76ecfa2a7f064f85a23e049529c74c4f8267abbbe685b6a838841a9e304fdf14b835eee396f8d1fb4c20bb543c95c828106d85605903b34c76494896b85fb779c464712e388caca7917263804cb09e334baef38b7bb74d5bb452ec6fe0cfadc360208cf3abea67f338dc05009f4056d6fbcffc2492ca0b3db8460d10f0c84a5a5511461a383b8a460b05a7bc7d6c797be77ba913e763755a4aceb461307114a66ae0a78b27a79e07d096549c305c8e89d8580140c2ab141a3492e84ae7f395106935b72fc0552aa050361188ff391d68960e0c936aca6fe63d39b1b35f7555fe18b77fec4b6eb678538ee868312bae7fe946d2f529e70f242c6c1784de20dbd9410f06ab0f19caf7a146e0240f59ca3899a85c4c452a7a3ecad223a5ad1baf0aaae55455557fef85010501a4e1ecf8fa6ddbb18207bc3a9adf14dcfe148f59f71ce072d065c7ac8a3c7354d1ef0bc12e2e88d97db7c5d7a233d94b785aa4610a5ea86706871a8a6e1a39e09180dfac3aa456dd279d6cd7bc8dca76f9c98150aa3ae63bdd03a0109963ffaecddd90418797eec46601dac452b68e676aa74fae3e7642f73f2080c674df6cc46e4f45087dcff796242a3725cb77ce26b43d350130db63a21327e3346556292c5a1c268a84131a5b4861aa838f9632b9bdd35cd3e731f2444160f0e3d58fdeee7b8c5c4e052dff1cbaee5b6506db612a6fb1ecabcb4096e6b013d05a2d533210b7e90fdc66e34de16219735398100481b11e0c1244cff88e4a88aa21d36acd9cf87966bd11feacb0282a1ad5adfbc2c46a64e48fbaa8bf47f607a7c1319c589925868a786c46c693f4687774ad6644fd84c99daa959194169cd7efc1adb17b102656a395e1824091ae1cb3b700173233e6965feb3d531f052541a9a9b170dd08e331d89dd77cc5b23e8ef5270ed6336f781251db1bb6071b778dfe02a4a2278943615117b6fafbff8c06664a3f6defb822879c019581f5607b031552ee0f009c312d378be5c58a7f80cc2eabfca20f16cc3b67e5147e90dd19ea1724f77f114792dcb281cea51b3b032774cfab3f3b915e77db10017381993a8c2bfd26ba02944fb7e982d8615639fb616040b60a1a32c0832009c2296f9cc42f7a67e5877a8b500605156bc3e28352c01c8583cc5500dba75d58c16803efa11c2be99cb021337d112dc3ef916821ee8dcd267c4c9303952bbb8664f7e599b79b670cb1fba094be1f8a13cc948f19b90f9eab07547d44d756611a15a0bca2f0f356568d319fb6fc79448d6b9400759990b59d8eaabbca8a72779c3b293013326e1f51981ac5a21d6882b93259623d78563a847817f49e94c527953d5bebf36752eb853a7dbb5f0b326c208aaa5e773daa56e62d63d0c6df98978c85fe924a76e8e179dc2329f5ac1f2b49dc509c2dd0d4304d1556f94c5132ef097adad02147782ab5e4d5b56dea79e7bc8e14c366191cf24098b81437d4dd589484b64a7fc24aedc1bc590aceac86c7020abc7b2bffcac1481e50cc904fdffab60b5cab6ccfa55326ca77ce20d990f4a2b6106e836d25c8ec0fe7c65ea981fcf6779299f056d3846b78f9aa6b5bdd9624fcda427648762cb4d345ada9cc0b86dd3121bc143f1aa7182da545b819b5d41143e09f0c79051828d232277a9fc5c2f29fd1bedf72c3e4b55045480efb62d6f0f2eb2e4ee81ab2d17476dcd80af6d6bd2a69445ad71564cb4b9f5a76e92bc54973c396437dfd223622d876cbf5e8eac63ab3f98b575a4fe1857c24f7cb57c9a52d3080f321f591df42229a5b48e127963875827cd8d8cd8066a34d99892f098a88fa9467ba4c27553e1af291eb2ab4b48a788a3543d9042f56de7e640cfbae83ece879a631480b1f7c892674c70bbaa89a84b7bc81a31f76bdf35f613a03df15c1c4d8b86f3266c56636de0cc2cb61fbcf61b11b797e44dd03ab9797fc8ec5ca6f5458a65b525fd062ebc162c5b4d03490d6215a12b49ced90cecf0f3be587295e61a277dcef1fc7da6e777db90c30db47acaf7f368c4e2dcd24aecfdd514fbaf7b25d33dc52cd323588a966841ca8785bab0294cc4d82262074dde1cb184206a01132e342c4929adb01ff23102c6194349bc3a0bb40625ef288034cee828a94c244c98ef68b968534a120be438483b63a4499acedad135fac26c9192dd94fecc614c93cdfef007ea830b53e076b3567d56e2dbf49dcc0b1b417d74f6f63b8971249dbf5e73af80a9f7565ac432b9f2e6de027e1b7148fda7423d4f69e6aee1c10aba6c2f5b2a8b38139d90fdf0aea936a632e1a1f9ea86452116917a13419032701d3aaf2a13600b644b86fc2513e1e34bfea7369c234d7b8ab3db960095fd5be1509b6c44dca79a65eabd5d647c25833bc04f37ec85bb90db7f9e4c333eb193fadf1ed54ff8da7b94f5a4702369fc8cf2124a344f84494b9fe44a0b2f9e357119232578afea61158de6cd02e64fcf771b8f189a49a18ef2448c7f615a270189c8c75fc4e943e40e9d58a75421a026b7f4714af86f5fe53b65d29edd477b9e2486362e589077dbad6fa5b4027a0d9ae6397341dd3521f47d704138ed7c0e7407ddea01921a08a0985168838c33ea8488370fada71f9a353ef072de006c521b7a3c6d8a000a78eb460f0b865ff3c97bf499a0eee4a32b1ff662c1eeb4acd90d122e3b1830c64b044cd5294d0c4e1d09d1cdc1761454571d4a43c8fb789215b1562fdd4c92f1e19403602c380f877786963ffbe3b49790c5911fe274dad0aac0bccdce87a501ff03002c9ee7d8444baac88ccaa854018aa17153c8fb49ccea83cc647969f57ad5e9d996fbdd05191bcedf20883471168729419bc6ef440b5792fb908863e2b118b0e63bcd78046a5a6b4097ef387a4b28d5a83476d167f09476c0ee55f62b6939e0bc878e5954acaa18a35f5a04fe13d23f1bda534204310397c2ba7ca10df7ac01c306a8e184746d5f5de3432a6b0535bdf2d9e6a1d731478e67a166e528e1018ca035b7b102462697f6c045295f93a5dae3dfab712f75b2b3261f9f42fab9bcf9ca9135485c96685b0472da822a43b52e55480c509b72d7be94a1903b01f640c1b8a5ac0801e9a530fd777db58999e620dd9f939099ad490929c3f44dbd0b3f8cd0ef867070a45f82485aa943cc0abb4ad362ebe1b8a9791b5bf315ebaa7d0bb3c9eb4f22578b19f77b78d7ad801aa714dd2e4fa466fbda7db1bb8fa558c027cf0a05709df4d246e91d6e9363345e2c07615e695922f8ff98b189bc0b2689263707ea9533f72e78df94b866f55729ccaae67fb3807b355b04d1ea457db21c899449e72794ccf4225377d2cce477220b68030ea8baee357f3a9959968d8a1ec46f46a7a220e4c7c5ed4d3a3fa102bb6ad71d87c358ea7dceb28e5439aafce4691084889f78ed2df5f57b7b29cb887a6d70bc779dfafe82ebf51766a966a921ea309a266a0d347b1514890235c486d375bd566a9301a8c9398acb0d60411d4bba47fdfdac4e5953b5b30c5bce1c7c4b262571bd3d1d67d549ec2fc4e8aaa7c66bbf067ad0bcda2c5a695c046d43d765f131a4fc169eba1b8f81ac09bd33f716710e6a2a71f9258975a02e888dcb26a8697a56b39a162e209cf3d658585d79d06cce8f88fa53c9df89efca54ca22f886f1580d5042142278d4ab154d4497be78b177fd12f48d45b329a0d5f58cebbb862b634f7ea9093578e9200f450c632373d MD = 4bccd0e158f345b34d583f929c0a74d2b502d3a8f4112aeb8a3e0e253a817c52caa947a62a4bf857d1e37b3fc9a5dead09fc2266319733ca2371051a4e358e0e Len = 53296 Msg = efd8212e7ba7985699cbf81402e3f0aef704d3758db890f04946e436ec34ce9c900b4490f45a24c515fd6d91fe9faf93e07ec098656eb1bf422100dc0ca50f1b4c2ed5e6d516d40855224b122b07acfd782d501279b26a0714b23a6bb0c683444aca3ef6c5e4906682c1fa603122d036e798ecaa708ba30ee681f8aa829d105eb366e6896dcb4029c463e243b9f901855447fa2af302441ee117a3622a359fb3ae8b356675d3cc97428f6b826b922831e7c3e458a91e357d2cfba45b5093198964c0935784041cf925cdfde7eef72e83ca9310fc3be75e73f1b5615d9bc16429fd8d68224267199694a50038eb30f9c3223fe8e05065a84a55ce4430b3c66adba07a1c905903a9b8b8a0dc3e094373391a50d2cb91a1f94882cdb49b41aa11e6751017696ee0b5a5b945f9c1f13a832cd74d3884a5a23bb7a03a1968ed754394a5d6c2752c0726a6be1dbf894a1c10e684be81d4367054ddd69eda5d5e30e72b5855837b387fe203efaf975dbdf204ad472b1583e9142e034d8061433de3e5f4b513c3453d50d3047583e706f2c346ca481d5c596895af702d6815e131942537e59aeb99e183e0f17821184d9097be85b01cbe1e5bfbc16e9dde5e01e34d8e3c10726140cc1ff0111f1293f840775425a7aea399694f4b43c56ba469fa150a4a5c218f02a72cedad93ddbfcfa969f0f4545d73933b983438ce964fe21ff581aaf431dba61ab3be0dfc0a039c74787a38e0b096d479de6695e0e8c734faf3d9a5fe2aaff6ccba4b798121c92548a9da3a732f7424ca29c8a222e87527321afb81a39272b8664c7c394aab7833ce06f8423363754bd68242a7bd1ebf83706fcf860af38cb58f6e39948030778ead96bc974bd3021046f0bcebd9120e0f5bfc3dfe5cd465b5f02a6ad44b3630fe8e610f83e108813cc27c1eb79c4dcb949cc82e2fc0be65803187f73fd2470a4b1970d74c1e885c97f12d505331565cdadadb88625f38f4ddf98ec81e3eea6d3cf5cafe3b29ddf9e97c0b3b07beb52ba9be3e35e060ca7a95f045c5b8b6a8c19bcb776a982b8ec2fa0a1ec51b6cf39ec9f0f81beeecfc5f70bfb6d75763076f2e428005ab4b241d92446fd7d662971f01171124d72b570b360ee9e4416d91ddbe03ecb5bbb2267478d2055a81c929151bdb9237e14462e6af84e4d5bffbce7412b5c36412871c2e755be83464c831e8dde6823b5660a559a3cab1931935459cf4010ef9f6f38fb35187214fc78838ff10dde91a7ca6a9cad988580597447ebe2a8fd45cb01e066bd400b791f230c5c47c6bcfbb9c3ff5a21a65df12815001407d061d75882f09bec56bb2e42ce9619ee8363d06fd52124a2e0950a41e80578cb50ff12cc54e2014ee731b2fbfdb93f51de63ae3e9088628dd1db2a2b7fd07089a515969b1a5d4d515bef95af12de332e424cf3aa689dba6ef490ef394ef991ef3755c149259ac6903f4544c0b08d9bb039803f37dfc982b2b346b81fd7d95358a220315b195313880be34ef5493fef942e9def6b689461e5a87d1333acf84b425015554567fe9ab54c4a22a16f7d9546bbf682b995a6ce944e949f1920eee058db95ab9c93f5e2846ada5e5975bf33544c4aa7b6e9492f3b103d9a34f62598f8af31a2d51fe18181f21460821e8d202979eabcc7c6241a4697d8c31b7f24fbae4579e9637e49ee4a7ca8c7cfac500252af573080ceaff6433fe678413e757ee628ceddec41877f2a64d7f276a1c0504c5720b156654579bd92e7482aa68fa93cd3b0feb3dc32eace45527f2bb12670932bc7addd2c9ceb121b6ba14c69ebe11ed0b0da7ed0c487928888dc533d1b09a387cc8469871ee0ed43e4123adb12ed18aa5eef81b1c4fc03c8eb8891c8167219e5afe3aff733e1bba6d1295a8c8cf396cb0bac80e1acbebe610b024bc4915052dfd23a050f7463e9aec3454ff0b2bb25ad579fe0f2f4261efb67e805c5241aead0e3f5fd4278fe03d62af46faa3c9a51ebc348266833e8a1f27298443c47384e6345b61d029a06a6c788c55e1b831787e0cf33c5b3d46ce3d0cb917bbc634ef9f187d8d8f250142edd6d268fb71ec95436ebc143686e395130c37230a800a57a262b0cb58443bd28823896691f78162358999f23e859b4767d0aa8f791b8024b5b9f90372add5810708b939eb7278491b0691bebc63f94c02ff1a4350bf1bbea1c5621d268a57b6302c6bc851095ab0be8cac60f847820cac428f26d793658d2d2ff202bc004adbcd38a7fb0be4ad01e7c4f3c03a5ac0f02c41122256c0e5fa239fb1987c393557a4d373ba602cfca35c556dc6cac33a5e4ca3aa1e146d236b49bca8c8ad5da0927ea6d9ed9a09ccfee6e9235befab78bfd21160035ac3a849692fde7b999313f42258e07cffa2a77a4c251b65f33a037c87323bb770eafbfd499f5b97860417e55a92904fd820147f58b35fcd1c9762fb33af43239e09a4edb2b52805bdd833cdecfcf24f6caa9c75d03bf77cb3eb1da69e2f802f2c492c836b194cae8636f014a13d0d620569c5c47d64e959ff5dbde48f5bfbc461d11a263e72cf792846d52241feea71e9851ad427d73f4b4a16c91cd0dbbbc886caf63df169ba4ded326a5f94e68f656125200e953c013cda3ec9b82756c825e35b49324da514141b1f3734619e0624b57161d8913a3513f9fc451f5d742bc1c0ad996c1acfe5b5fb37c50772cd57982d92649be179e5b8ed78c6b93adeeb8665e77153208e3618d5a29b418d1c88a711b0b1c04ea21812fedbd3ee853c105a1932564f268b0e25f188414b7b33a33ba8f2d1ada05dd70b764df5260835a32726b6d2c8f66d75c49610408b04b9af3b3b814bcc9f51298a9bf5b3c98972aad4d29a6c2656dd73dd0e621f6bef57b58f1285a78413271678b7fc953fd19b30496607add10f8311589fa7665206b4bc1f75256e3cc386a6bb108923f0a8573a6e29241b32e906561d92079ea80f79ccd3ac89275e7817e23ceec5e645d54ed22b651a40afab0f4b142fa94ed4d34ded93feda5a51fa82d1e39bd865a42229ff686010a4b11f45f626bdb6fe401ad92847b5408f7d116e7b995ee928765590ca0d642fcda10b51613986553653acc484d717e24f4a8583e9447e20b824372a3902b79e45e538da9436d0af7f7550b70a2b6de921201d6a22cd44a69c1490a0572fa18694e76e899506e4ec600ed05ac12bfe7c8e67a2cb2e1df8a35cb02899297c6c0f400d74066e8f0a336286f254b1c014c41d87dd4d161be23e815fc6beb9d25e60d3c114f827bb89ac0b467f4ee2d0f5e956e89399e1ae49a0928834b70e17c1a2d56a1407c671ab80e6b43eef5d44ea12c1f28f5797c077f11795382b3035dbfccc6f3ddc5599b6d77839f9e029053b67e70e982e4138b25899ed9bc32812f597423a571fdb1af3d84b3e76c84efa30114fa275c6e6fd43fd9ff82426fd98569bbe322a7861deaaace6297e50d50a11388118efc88ef97209b11e9dfcb7ad482fc9bf7d8deecc237ad163d920c51f250306d6cedc411386a457c7ccef5f3b117bea491a098acca56b95554fdf2620b59b6546daa90833c9f51a5b7ba5fb29faa8a938c7923dc679a7b966a83500f4092826cedad8ea418125814270c6965f4bde8ef54dd010a2e855c5fdabcc5c8569d1d2d89810f026f75b15e474fb35c54c4422e6746d0a48389e4184224941ba1dbef0cbdafa21c873c05caa4eece2434503ec74030e34a1b1a9b662d357b87b6c18080f693e85103c7ce0fac840a4c17d427407c45d94939d9facff869cc8b0a007a20c0d8324e69cb6293da89f84273d2a43087d02350742a7a9c305c07941ffb2472a8d710733d997bddcb7b3885dcde3e0ddf7a51ce6eaea3716176cd317d2427ed1b3b135dd3c46263dbd21ba4b7594d3f0faed5316db8fdd608348df1860ded06945ebb6ce0debecca829422da7d66a5a84e82e1815dbf240912fba42df3afc45a0cc693ec94b095eacdb2c7f02c80dd6cba0dce0dbaa292798c2e2a3fd1dde20cd0ebd32119bbab046723b176cb0a03a6073622a4385fb118b9887a34438fb2e759027e54e334b6821990e855a22ea0bdfda4e62d211f094f60b29bf691edbd546eb29d6d3b443ccba9a17573f9123b1964002290bb0920844b53956b03208ab9d9a336536913c747dffd5fba18de5c2204f1dcb54f4680204014717de150a17f607e54f0b5c8de5e854dae1146bb8b40a5201e8424fdb18c089d361372a48b0fccebfc2b668b0a7861386a5fcdd151db0e34efe58457392f6b95ec14ff45cfcfe49138ecc686d1fd3d679c8ef347355b08d658c0b57ca27030a49c6ad05bf52972190f1b1bdebe55df814c850145c0285bae5ffd009374b921734dfc2d0d86843c2a8aa1aebe56e80f2f802c3ef578aacf630f84adc4357104aa07b25e8309480c6daf64c74c231f9719426bf47de7492b9e6d3d04396fffa2f1d274aae606dca88a884daeb0ac603ee6992a6905956e390683104d17a9cdc3eeb72a5b5e05aad8281d44aa137914cb3f8e51e7b6097fbf4458e6cf896c422e4cbdbcb7128f1966ef7432049d13a407cb27c8b4b7cbe686fff4a5d3b53fc6adb1ed12072b2b91188997fd05750176ba336e771831630956e06037a1c3aac106c64d1592d0627ab89b8e8ff2c4cbf4ab1e6b475d4c5a52f78fa38281dc359b0232e8aba22abb3d0cd05fce16b1fa85a435251ec92f362830b3c570bb2869bd699dc3bd7d61be40ddcd14a4b86515906b20a4e6a60382f2caf4cfe896cecd8d03b1e8346c9cf3ecf23db5f81f07a47fca86f0853aefc31a8efcc8d15bf6ea7498135ef6b703e3a915c648b194c02fb9860f12e5ce1c83074170b81553ca46dbef6e2deda6bf15e00c10d7b95fb83fa66a6411eca9b24921aefba79bc36f6b28d1685eff81f811f7a0c469f7c8165bae3d2df58415d89ed09c439e4bf610e1c506a9f7168fd56058998a075317030c39c611c69458b6097cd2f0a40d33d32e1856da0319197f8969bf09b8b593a6d9afceb98d03bb75128d19abc2c9c1e0dc8b89a387f0671e1494daea840585284a781dcd52bb863d416b391cff67e960738466ab8d83c1d98a40b1d4732b35b0e7fc7bf41ba301351f7efaea63cff37b796db69b1cba6fd872d40d708e10eb6739a4b0d6f2a37486332f24bdf6ea275878ad411a3d7db84454bab666dc9aef74c7d6831cdea3265705e47e3fc19ecc20f7accfd1f7b4e645b859745d65b2880019fbbe6ee88b60d11e06d116cbd42cfa7fd2286852473f0227190ffe32410033b87c277316436a1c05fee5ea1c758d0f97871386561e0ca429624ef04a2d9d342bbf87d472b48c5f42338264bd673887c7335ad30c219452449cfadbb660a82cfa2ea53904c40ec35e0c702bb5947589973ec3f97b392135022fdb697cc06842ae304b48d35c376fe0f376e80ce28c3d9010179dab4cf975ea84b940a637279fce2c3face765508b504f5e43cb3bc4cc39111d6aa543653984015c083bac2b6ae28c4a0b48c5a1413787eee3f986665e1aaa9f057007ada9590f8c6a4406becc73b7340eff6672b71c05ef719eabba1abc416319147f19eef017100dc82f26ed0815c55c122e0b1587302894c3910829a640334c9a92f130d17fb19bcf0eabf4290ec59e8c07b384007063f56e2298b3600dd546092a7c9685b037b9628b970a5e0afb7b72d8b42c102d663caa45b1df731211b0692e034993136a11878e30563071309cce8954343ecffa107ce29dd566b5b132c385ce71830f114b48ffc00126ab2ca8a701dcc413bee719eee2a2bec1607b731e192534de0bf60fadc68d32c920b748062a94061663f500072b09c20d7a391c82d150bd2b71df03bdcce0129f399924f2ebc320cf24ec6dcfa61a08d16bb1d4f7959632f2a895d280f700c9325c99e3732cb23ac66a93074f3b1cb9959aac44864d41bcbc18e022fe30377e0af2812d91d5aa7d849eb3778ed359fce271f11436e197820f29879c4060cb59ad6417ac55cff11090261464945417fa3e574aeb103ae1ad764354e74d6d0583a5182405c600cf1c726c7e776aa89fda34b47d711a3e666476ce0dab2d412d247a786fe3ed518ec9b3d6b95817b539c549f1534f5ed670d099327b92e9c28b63b2ebc2ecd0aa753edace8caea3652ce30774942de4eb451866d7664288da6669d7d8e3c879f4cba46fbbc122179ec25bf5a608b2b2632e66652696631270085e70a99b20f015d922fa051e5b7a4a41569bef7687d22873df1f85d29e906bb76906c5b29c3bf7e7e104136c02d450f2fb82b8a8544c205cad1b5de39b09b5bcb22094f0e364803c09144f72be2e981d73316764c0263531f8e117920185355f62467e1d9e739a22c1b320fa388f0a0ae5306673736a4e39e7fa19a5780cd3e7a101eb00746e2cdf3168eeca17ff8e007a081b9d162052bda3edcde4aaa7779e96d743620e5f1ebc82bb22ac04860c495a40f0a9514e2b0554429a193c5d09ca6a52ee0b134d5801dc342265a72d6c2bac604b61cbfec0592082e70ad93771b444fa54c32c41c1f6665c57c0a7fb96ef99f1968b2d37f90132341e80273b97a44d56de52014243e349ba2984adf972dc487a38f01e02be44b0e0a643ce7364e1adeef27f3958c50facd70178602de93ce18399584766f76cc30fe71b77e7beb58b4afa137d8b30c3b839456669a1e1558e94218b4f6b8cbf924749d0ca9e8f660ff35cd774e46a47956a5f146f5d437175363850e0196586461334296ea0bd3d63708290c76a5ce36af2b54a1b67f8d6bef046709f796b0806f810f00cf53182ac49d2091d26eedf5f57b1d215c9e7cc924bb3b43692848ffb8045eb4ba6d47d1507b6091f1e09829e23b973048bf79d19cee7e14d6c99614c323be3d4b98d76c3319557755c93154cdd37f490b3128f7a014bc28b1093c722965a9f4e3943b4e14fd6bcc6e876e0940e921e624b1fecde6c451e99855809a5350be9622be08095e9e300bac8982b9c3d32b9225a05fa6c983ebc1ed3d26ffc96b487b8994b22078823ebfa06e33e8cf27f8d78e9ae024d0c9f65c303e7415042bf42f78a6ce261b3fe442eaa3d608db6e1610aff014ba850cee1301c81c6c8bf92e2c7072b07c8f3dcd5feba90dbc70fc0fe83a4e61fa6ed35f80c2687478d97972fd21770db66cf25641040c3f56188842d89e045c46f6a3a72002ae10cc65134f1bdc223a463cf41ba0f43bef783a695b4c4bc06832a4f4716b32e775d9c76d3ef33102cabe77b999fa1cc692957f35b5bde3f12a4ff25c3adce3d3182378ddbf2da0a7338195c93db6ee2acd202f63fec7c724f6f177216fff85cf7c2be1eb4c25ab7e19321f998351f8d6f3baf37a72d495ba62c9ac1a7d4da95b1675ab2c5275c205c0328da11765cd59aad843ffce8ea04ff22b097e0f41bef47b732d078e9884bcdd156886466ccc3156ea995a7e30a75439a7f7e28276473a1fb6f0034cf85421d46d28afbcd185ec8c647c10ee74fb558dc32fde7345d27a77a38ca62a2fc0d32a8c5683c73e8af9bff864c9bbb61cb2830ef9d86e4ad15427eb6b7682a94b2f63f56ab9120e2bc77608dbdb529e9c29adedee46bfffd45584d104eaf2ff63b5055aeda619bb18f4230859cc3f78f9f952d295cff4df4bdd2306f179f79c9af2730f47d13adfb30e6b895722feefa6c0367f58daa953b87996ffb9ba0cfb6176519511d111e69a54940e6c560d6d331cbd26dfed5a179ab9452db611bfb657af158ed41c2b6a2f8550fa020be77c1f4d5b6b637e637572faa2138f276c37de0b335ef718e3c4f31f06fea08b1986dbf095dfbc047207d1dc52339d41bf0a75293f87f35dd7a175604a6ec07a1037e994f0e62225e24927ccca10791704a8ad679e8c7161736a37178fdcfa4f67e9d8b8f1013e4950a3f55a6e3c9b1df98cf774d4eec9ba4399a8934bcbb6818d2729bb1ac378e539c2baf3d31a8bacfa41d3af772194ded4ba5a7202bd7d970c7a4d39d2af6a8ffa0fe9278d3cc36a8341d295f9c74b258336cd224924c816424dc3b3bd277bb03df62073f105cacd111764b6e1425544ebb9612283841e85db3c1da74ebe34ec621fd147a3281a5b403d1a80a2155bb38a9cc6f1466df94c43afcb82ebf61eab02d77c4117f62a8b8d1d6491c0d2c6d7cc6b5f2d0644e0fff8234dd52941a1629cd791ced40283d45452c358d1ed1f484dafaa2447ab5e178531252c9b3365a99c7ab26f4bcfaecc3257c74439d6dd8b6ad428859f03c9095743e1e7964dc3e68e4b4e90f3d013e9a3a6d0f28d2279f7c0636aaf50d0da6c0af5f494cef344bfeec3d6d270964ba334ca80d230428d33daf7d12011a4dab60ca1ddc299b6708c4a7edbb22694ce9f423d4761b7c97fb606ec0c8665f2725dc8e22def7b19dfe20dd6ddaeaa5e15146869a53fa839da04f0ca7d20a24c19e9ec31357a079fdb37b5564d265054a7c923ea2aba75f62497151d93ad7b1439d0d319b4f0b3bb0b13ed87bac7dd1b0f23e1493860a580d7e2e04ff08b44dd6ab919f60cf203fde80cf2e5a6f19503a39b4cd16ec0bb8c7c8eeefc0428842a24f92d70adec7ccada6981fa82320cb11db5a34d2e692c5b7ad19d8c5f23dd6ce11789f4285e82c48adff730dd07c8a5c609a10707b87c906b71788b61fba528279acc0b0cb6ba5d51d6ef1337f14d5444edb2897b4d20adb6e51c73ad2e7fee8109402fbb838807d7c4c62bf38d0f4f12f8445f0975bd15f592d5cf912ac21255d992ccb5438056754018e5c01982e8a8aff2f222f0b65b90014119ce7f10464e82308caa8517bbc2cf53db0e454cd38e8b3aed681c81012eb6faccb599ef0cb3a9b5c9ebb6c2ca38d903763e8ec1722d0088ab4977b1892a3a4f62d719b2b82da67f1ef95725e45fe3a431e15485571ca668a63780dc660af1db76b36d0fdb250f18f663f495ac9075b2b897451ce4c5e35788c2c6462a59740b72cb126b08325a0fdaac0db6858305bb54b0cedccdc15dd1ad6bc6a3488e477bd19e8838b1ce0db0564200ecf1a02a2aa0ce605954876c638ea2f0583321d2993dae5d1d5a6090c6d3c68ccd9360498d176088272b90a599c6f8d1f99cbcabdff16b0f6d748299afed99ffcccd5bfa5f42f7c4aab5757fc0d0ede9fbc7a739dca754fdcd92bc7ed80e4cd86f11eb932d9df4a478849e718526f2b6d3567a130bca1cc6922766b6dbb04fa51903a7ca5492f785f51b8421634397b714cbbdbde9c3f2e87fc529d8277e22f47f15090680cc6107c4dcbee5c7b15d793489eaa0f34fa7e1dade7e6947b26744f5b897be1ea4e1985c5ab7554efaa46bb7337952b4a77c3127e5ccd0b9077cf51180dc77aab6c9c MD = 2d97d18d0b70ab231a0ecebed1a686c739914673521ed64ec6e27c1c78e2000981df932439a697743cded208f736164468a1a53cabe2b65b9a0ef10ad42f0372 Len = 54088 Msg = f60e7c7c4f4f13eba990a76daf1e6152fe6ef25fdd03dfce28921c978e65ddeefdfda90d59fbb03374415eed3b5430942d04c71712503bfae984b19f22a430c50d0db04e935a744524859a1ff04ef1415ae10ac3a9b3927401adde1e938cc80b1088bac7633308289fa5838c36d64b626d4be4ec0cf58c425a56cc9b48e54ec8edb4ee01325013e4cfe840bb76b2e6fe4d8b7d19a2ded26edbc6a39eab7769048cda758369773e829a98fa3416ab6b1de4e9fcd2d3350c006b478aaf2309c2c8d54176d56e713109eafbd880808982c719ac899f07c4e2fef41fa9571865001bb0331a80ab069381a65b03261a14d205d41e4e09a651fa725d97291df251cc0605f6890b86fd0df3b6fea2ae4e1404defd85709718a5ff638ef7328a1a96ce90bcd3eafe69204666022ddea18350bf5b7d2a1ad2c68897da6e87eb25f6fcadc1bd1265e2bb35e7e2712fdf862091ac833a55724016c16adee78f7d76ef4a12a1f0fb243ee405976fed4ecce58f9f735e1d4ea06b711a2177e05610056e4aa4393dd64c9a4c58ff165ed0cd473742bbf40e5ccddb405964ad4225ca5bd9c20c908dea087e5bf6c6deaafe0c3280422c4ef6c82116e947da89f344d6ff997bf1aec6807e7379a695d0ba20ae31d2666f73bbdbc3a6d6ac2c12dcfb5a79173dfc9cd2e0d6000e3114f2767edec995772c6b47dadc136d500251e5927f52bacfd561975239ae8260ea4ec65fc284313e0a3f801093e318fa024cf7506c11e9fb2305ff1ecf043df9c0ec930d82e90f80b2f650c411a03e74d70df87e4a3e0e878e91f18bbf8aa7c43dd2c3ce47809508cc989e3d7dd14684279cd2644061903cc00c54e232c8288b0a0a40eb39d22c9dff2e51c400ff9af39bff6b4a7703d7e25e7e126c4f472914ce9cf0ac7f663c06f3be53a1c2b1a188da40ad7816ab4b4113f0126e3f8e1028328ebd5842c42e0c51538b1cea6fc30d8d677e3546e2542084683c332925478fdeea8e39a9756877c1f2e17da1c268485b7ac8cb2f2f5a495cf178023695341179b84a95dd00540feaa53d0b0e30f803ed837280f81ac5824190ae228d654176abfedbb505ed599b7573870f5a43db04ea89649dca2bfd94dc4fc6dc581dd5851ec628e14ac5dee50965a7d1ac837a14fb958669cceb6a47d435a878bc46570777171960d40f4db34f8186992d773bfac8aec02e27e17462d14a3d3ee36731c561fa967cca530dceefd10aaf04a78780f8dcfa32029684af7d976b75f508ca848275877b541a86fe905d1c5a5b9bc76c33271cbf869000f47d231b6719b18a0f8293d4a69cea200ada2ba5e457dc618723980e1bda5952fa7cf7365a78ebd92d0a596645c74e43bc77468b9322f1bf996e36b88e2879e0892019a2973a3d1fa5c2d123a000cb57da0cb3b8b0e462476abc0a026295761469119349668630c4405102f4fe6debc42d447b1282c4b863c1b61ad5dd4bda5561f86d110e844b30c660f4c1a93635f27dc4a78353eb7a7a6703701749722c0a3a7dade4d95e16ccff96b073e784314a92373ff2698130f3254c14b2ec31f59dbc475da90d3919feb29c3df0017f6832334349460ead6238c1390c8c0fb1bc75afff8448f340dd2fa919a3223f4e61132a90cf69879799b00371628ff91a09fadb4c2ba8d398e9c8aab6ebf0e81aa4563dc7d8421f685cc3b59d1ea2f493659408d759b3f56cc52f7e1b1c41460aba6135906db91d4834d99d6446ac464456abfd481650a0e2faceedef3eff9f472a9ed99295b6c85ea85a856fe497385666a783466a671e220f0cbeda5a113cf87c73f37658216ad340ae3366ff4a12f11df062795ee1b5558c50bb86765f6546394a49e3bee249ce843e6fefa0ad1c3c02ee628af9a4aea3fa04aa989dd16159e88aa582d0e2ad78fd7003b5cea89e609d0a4a2144995133df8f54bbd44f7a58119bcdfb9507e0f932adb55e9123df8576aae4e545a8e52ec659819525c1f66b3de589f5153a2978ab5e4f93f10628d11638f67f06bab4bb34caf8ce970f1ebcf2d0a3195964cf1df1e997fbf739c16f041a49968fb50403b34a830f32213a70bbc4e10e686b1b128bb8563faaa4f285c8baa5d3e6831e2eca41e800ffdf92b21d290d7c4b39557c013153061330033ceb7ed2de150a4a630217f04805326da8a267ed0d08b4c586dcbe58f938c33bbbf4d0975e2434cfcae134638f4d00157ad1e64a67a9c6b255a3c62bc02346e32b6b17bdfc19e7f78cf100097fdd33d051320eeb3235566614deb19502dca243b3d8ba0d5ffe0d08d1bae4aabebfb1e7554e489a17b54b27e916e65e6769bda37cc4234c2fda8d4bc0c3460df4fb64a2adacfa1dbd308f3efcd1cf4e99d4814badb7b94516b64f0882948ffbca97324882d58e3dceae09f3769ad32d3d25d5826f37e4bfba993b873eb5283ce79d0523fb4f6ac2ef38a18d7ff65ac2fe62a092eace0c81c38b390f1daf7798f514c47941a4f874cad43f563e6fccd68195ccc145039954da9531e94708e6d7990557937b5b9e1b078dcb94dc8c923171c54058a95ef300a7bd0b5ee34bdcc07d77a5b9d2fdc67e4e682d9081d5129b74fbe49e3d68834dd10dafb41afdc11c497298326e11d766456f4e9253d3b5dc323ea0dd2aa8af03018d053313a8fcb3a5ff1748761f399b97a914e17d0de3bb55965c5b97a7e0e9de44f625f7d3f74d37240b4112b053e5ea1e68c7250c0502820b0062adeb7fc8113a68d0ed0719b2aaeb5a666c4b8f0ce7d7338a7456817763a6743893fef2684177447e1ecbcaa9a45cedffa97854d735db5b739175c1e3a06ea0257268a39117047375b1a772fccd7eac54f4bf0b0f7c32cacaa4f12b0de16c6d7372aff80b3ae8dcfdcf237971cf597fac73a91a7c66e566d7d75029bfcda6c168ba5d5b9d542b6660a0c848d14ff54f514ebdeae699fb19e1501c22bf0c26864e73f933110ad6fbe44b1d45e3f85b0289ae83e315bd7cc93237dc7ed647f4a26bc40ce82d06ef82d3f9abd9716f92829dbb846dd17b716010b519a4cc2616ff08d61de2baf081e273d1f86c415fa2b5d59c47f1e17be1c5c4f25afe695096836cd1b4887f6f91050dfc8e671d6e9485787a55d50e64d4e0961527f3756e7b18e1dc5a44462c29d2e8a1f530cb446fd9d07c348320de5299cd4608ebb727cea5ad1f957dd5cf50314ee9b331138a3b9823cb6e61df9364d8b3af864ef824961119c3f09cf5ff0f0a85fc52d1bfe800acba8e8bd9122811858e752885000cdb466df0f0076e646d45d6015a779505c7fcddee115283486288a7c377f69788a62bf1cd1f2708a772cb8920518d5f8a9770d3138a34f8995dc946bffa0a8540fea8ed8304648b702682e683c17ae31e79f0e6247de63ac30c31b391392991dbeba5a8392727be669253354f31a6ea6a74645c4973d2116f77a63562bcbc8502750a6b1811d66a32bd26bdaf2a793b1690b47eacf35f4445a511155a0c29275ca5bf7e4849db577cafe4c7c9335ba0c9d5c9947285f59dec9e5b9ca0b0da409282ad29f0579c4deb71739bc5d4b4df2b4c89e6c6b1fce20d6a6a0f5d3035974b14bab439c48314270abd81cc95ecc1e5fcddbbce00dcdc4f1228b9b815a4f63064cf664a17f673d982a9c106ff6b0e9feead5db2f9fe535b9d7ce1dae58e23e879d5884cd85f34a9e21ea29a99998e0028e2129b25c80fd8134dceea2b5be71c5cb2626690251d3e31066db0ebdf08b1b46223b10aa3d76f7c85c9116c720a7413503cc1c6b0f74177486b727ea3465a9a17d81b32f874c8e10b1a77323d5497a8955e8402688959bccce106d94e0ea2e0e87802252daf8a49c7094304238d2e226b0fd8ccb59d2f097a1a948549293190bc4d8d69ac4e5dbda1de9e6b8c7ce08ab999e5adfff96a653a5d4508fb5fb0b17d9de588db19eb4481e0afeee0ea56e76742d22cae66b3d9f4f140eccb77c74c12b1310a24dad9e64f589f15889f38415c53c8d22aacb26c901faeb8233b1d6863d19a75ee57d2abf38e9568ea632da18213ee25db930e26f62fb7f56a715b0d58444853a0597c9c55caba706ffedd0ec0cc6daf2ae3700f0e69822a07e22843d954622ba4a87fc05e5435b47f37f190fec46cf87d637f30c11438df64562d13ce471086610c8420f4732fbc83d7112f244514863ddce490f57a009de89512841f667ceb3f4d33c20071d011e1a7e4f41b958ce3d317463793e103eafb667e9fb4f9cbe2a63233b06b943f3a036c13e6c9fcfd97a5d94e2e849269510592196b754828f3fe852df21b25a5bf4ff1450d17c48f281deda47caed559576ee28cf04b9ab9a7af0cc88efa6b29292ffd2372ed336920a21aef29fbf2fb869f1b7f361c39a6852190ad8eefb0f4ff0a57551c3493b4079b27d73e52307865fe089946d26b1816bdd883f9e13a2dc948c88213d22a976372dd06c29ad8f87cf4708327537937e0e9aef3d8ba53fd1050185260b1413bbe8e0421bdbd32a254ea1ae5e189ab2a6d0ed8a53261418c5a8c0f6f0ab71fc89f5764d338a2869f7446cf657d5a481a45951f400fbe4c013263747e19ce0e658f35c4c139311c17647157ae02b09a2eeee44b6d78b9be851d3d112a96dd543a1590ed96cb523b31add47a667872e78ff26524d3733add3fa582ac1888cc3a70b9d0a8f8f3ed2d15d6d60036e7887864d97f711b0b29f358519b0ef3f783082f035dbb90bbea38ec67deb0c558d995d62999fcec456e46f7a9eeff61ece9069e7ca0ee052a31a5dee95653bcd24f850d6c1d8bef2bf11e4536e4470a6de87ce6abff0bff48abbc12e3a5b1c25ed192302972e7cbc49bc56a7fe6ad988567b12e18e3d8281e3ec4b1dd33928003480267e900d8291852828d0d5afab0394fee9f4cb51f25b3d307e25f68be9dc99a1edc332f26b130ff9cd666a9f6fc93867b61cedba6a11053cbcef2acfcc2b8b02eb48f67980a138b5c6e143c69249af5a09b26bf36423ba4599c1d671697d9727a1a8510f7ddc9dc0a7d9f7a1bd05684a576ddc796b03eb0f9756901d2c333c849349e920bd15bdcee2a8dcad4a7d01cd1197a5d9094215df2815de2f9efce9be52a61559c8fd0714f9e68965b510fa36dac85e8ea96ea958ee7817253c2b3d1942557c272be30857701b74579771b03c15987d06d5da33f13d05d1aa7e5e9549f4d063f540784ffac7a033ff6c1fd221546077ce1925343ca637a40bfff780a4ec9f8350c12d3c73731d3eb9ad6bceab19b8d560edc0389fbc95f4e61b969dde8c2b50d608625c5604fafb32c5f6041dc81a1c5bbe4baf8ee2994aa56bbc3b4b75fc32d190c82e16efc1ffe7603f211e020cc31b252807aeaaca2be65ac8e7601c9acffff4bf303ab5fac353e6b7941039f9502b9cd5df6397a10f05835d30d0f27f8e9d9ec7f135da1ddbe4d3efdb98e2685a199fd5a5521ba66aaf6fd996029a22d5571962ff9cde93b026b258761c9df22741a8b7e7deb952d5306ade8579662d5aa8df20a9d43604d695fc81d21fbf0f7e4031fd257de32ec5251ecc8daa08e7750f6a718e7062e9b5cf3cecae16d81895a1e605ccb44ba2b119f6342d18d4e9caf745e61c0607aad41ede0938968bb623c31f726c2635472f7b7b95d24a6cccb2fcebfee0e976c0c8116a5820132c509f3058b382285294a6c639722bc332d8c38ce71c6bbf42e3f8536c69e3113c806e862c598d5f0603ad869a5977f7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d46c0f0fc33dfd669b5af5cdbe2c12ffca6688761e7f40839a65c29da57058fa7594705c8bdc432e7c13b4cff7c47b2e046682978ad08fcc14f32458d4c7a420e986b63bdd19ee0372cfab6c9e553b95d4e3469d85b369b8e7b72182f58beb93b7a9a953c3dc480f04f7a04dbac69b5dc2459a311810146f9a1b80c30ea3767a6764114d440d977abaf15c1a53ffe3ae56f447fb49cfd918b5850bc529f78dfe8121b5d06894246c1c26a77a72e85baf195815a222d800dbc05f882d4d6f77478e475e853859370cb3fe48151d694b8992d9cbcfab13d1e14410c0a683f37e7c163ed413bb44188206e209945f6afa634ae03329eb699452c9007bd6d26be8c59f6ddf24fa3e0ef79d38b09f3dd3b166c7d31359eac09056d597816542bffe4bb33e475dfb2d6293016906ddc18cb8ba931c3406b0020e13f23d99fcdbd70836d918d368c8fb5d7db9ded3f7f27d578636215ed9461556b4a75a8d43a69b4eae9a634ded698e44de4dfedf94d88fd6f2364c5879b3e3b05f7c5623e1aaf417da7c887b93e4d062dd4630f15d7ca87c281d04ec90ff52643dfa99247fefc8ade209ed250343a7fea32bded3fae5b1924d72b0e0c3334cb975a88b57c47e0156efc9fb15e58efd5f57846f4b121b93608cbebafdbc55b8f82f0f9586595e855b29431a12e0cbb9ce22da4b224d27342e0b88890b23707d6a95b51d77e5973e04b7ffb3e39c04c3932cb3da2055107e44f25885d29f898554cc248df311321298c1852c51c24003f69c9a830ccfde58e96ab61619d9aab701ffe44bc28536eb61715eef24fa88613f9a14b1af669aa9679b2ba4aa79dafbb8547bc1ace8abb0a5ed116224ebe3c5b550abc9d2c04b5b04ac3e974b262239c0f3735579e29a49ad5d26ef183e5917a1e4e6343b85f95509c57857c588885962055471f01d0a9dc1ea25fdca9af23f4b7e4d5ab35eac7fbe10604ce0481744e6b2a47cdb3e039628bc97f300a8b725fb4769a301f36dc16ab27edf630ed4e09421edde00f08d1b2cfa043b8310afb1f966c178efeb430356d65a761881c916b37bb6fe27d9b11513ccf23c1b79e2cc8c04de3f43ee372dcba27d7bc54afdcf8de788461aa1766a265beb5e8f8b595cfe494662c6a650270f3e6e54331178f1688eea1da0f1e503adcf7609a9ef1b4a955c834740b896d96ad3b56b2a7d43658d9864eb807104c8f0501ca52f4d307f9a661d5879cf112c2689db2672366514442c7e1983c8dda13604639aea4ca1e2548e9afb3891ca068a8767efd2e5e6e5d572c10d719e7877c916d651a295755a0dfd849a47a6c851ddf6e12d1332cfbf8793b430129ddb30efacfa301fd0b4d10bda629c6cb713f368fdd147fdc4278ca3b7e0ea2d6b10b6f1ef59a028a4672e984ebd69706cb4d673c5c0a75844f6337105cba48cb01fef17067a0a87b99559fa811c691a6cb2e0457636b4ec59449c39a6ffc4f5150ec5a819e5d402b84639799a0704346015fb2837b9d681ac1aaf43c204b43141e71fee522368624982b85fc206a284efe60e6230d375dee47f54d68060da08deb2e42fd7bb2c6e1352bdf220a2abd4c22c003c8a0bf9ccaa7c733c089da0419175feb4d0358af0bfbd317cdd6287ea80efbbfe6de9cb13a618f4bb83426da6043a54c5661ae9aef4ccfa4320cf9e8ed23726f000f6517b7f5bbf9c19d8a8fddf08cea9c0f0b0725b860190126f588a600d295a6cb9f4ccde4dbc27f1e6bb0fc9e854aa084249029cf32eaadacd1ea5d178ac83d8bb1ccd6af7d4a334f40da46be0ce0e63951b265e1b6adba26e56a6ce8197b46d823247cc60ed5a098b06846dfb241efb738ea849079b698fdc6a56fe2fd23553989c02ab90f09299320e76763e3f22f8630a4f06beaa9dcb9ec07d0a8a464eb185c4c6b090c6940b718d432eb3056282eef7e23d4880bf7e3cc2e3999ad947afcf105b836755a888d0ebb33f615f25bf9abd2a95ae0317cf3ed64f546874677700ea88cb1d871538d8908e4e5035b5daf2c4efb7f71dece72d668ae2fb00f72e9fb91630bb43254210e59c06897058f97b75f84b2bb588ee91d95ded5b633fff35e5ce5c48701ecf0050a50c13f65745bf360ff853b3310bf0978d1a9187871049d675f4ccf84906313a700bf6b1fae54570fa6675fe3066d408e513a452178963f3d6a350c2ee102a0cc6a93b888801958c823e9c80cd28c4942c809cae36930ca6b80fdab65514732c6f8ee9624bc338f06f28cd204f7949a3290882822e56ca57e2e075bcc53b9504336308298951b50689cb12c60080ea9da5545db645f9286c1dbf26bc88ad17fadad0a1c48bd3943598d0725a26662fea680c3531c4a4ab4e3154f79ee49181782b7cba1b99725ee463def6c50a52a0f23ad712ddf381dd65e646ef4a220f5ce5ef105e16fa559a7db39ea4edf46dc61de35dfda119b54519043d16a989512fa9ee33929df8a6d06750b886bb2bdf28d42a47fd657f6b6bd352e375a1637c822cf08e6098d98a880a02d3a417f9cf4e7dd93d1b116ec9d8f999dd131bf6bbded5bdc9cfefe62b4bce919704eaa465c182b6e65e8e2cf713f5a1d6f9008c34c90e1c8be78a67b1a01bc4aeb01a75cb08498aebcec2011ea42d32742d366b0fcd3fd77cb151a444105964bdb091b426ab3c1cf373963766140b145fb9a7db7572ceb445342de40a22f0396f0a35a9a133c136a756f215f6eaf50e40a439268e3f247c8e7904712e5e480b69c8f09c6127429eaf7ebfe2f7ae55eabff7d69381bca9f6fe86c091d64cc9a256f2a9d4910f261db2f3e3e790e9926e83b965697771c5ec3e65478d2b75dcc6dc8e489a5774d57b59be486cea22146335f2cef197e7e124f61e83ad5460e73ea3a6b436dbdcb7804be6d4b82ce143907cabf9730aa56368cdb75a38799554d35441d7f046d234f4307371157fae87bf01ebce36f733b57e6b3ab678c49d894d9768980fc0dbb49eb26e06c90b1248b66cba3584871a3d2e79ae7eb35bfff0741322dfdd70819f4777de7b1df794ee3e642016a3e1e165429f1c9a326643ef0f717794a07f4b5db727cbb8596cbde11f912659dc2f109480848bf13d0ef2f0e8586fa0a115c156b66b3da4c5911389219cd3e677963031b2d1036d1b7a935ac57113e928586cf20ceb3d29a98f204f0c2d30a5bc40c8a69e2d8df516d4ae956f646a587d73d39a804ed22e4c8d6c99a7eb437ef355605a0d412f727441cb09aed87cd5e78c7fb4dc3c059cf7b47dd0bb7f165a63fc80b5c6b5f3ca7eeb731e49765249afccf6aae65fdd59f22cdd5d1090b11f555eb11f9330e1e67cfa2d3c0ae5f39a1e5ac2e2675c624e851c14a66ec71ab711a37a003a5a00aeb69682cbb7cd67b27a5f6ac626de9c63f8aca8159dcc5b08dff264c084dc580a73e5f93319d8b7770b0277bced8b94819206231164467cfc0773f6c7395ef1e3fd121adcf8acead31b6c702e820b518e9c4f0d018dde837ad050b87e2187d41f9a436d2e1cf108adf0c4dd83ae07db735eb2ec4fde3b7a6984ae324b030008a8 MD = 0c25d4a35196e3771cff30a7452ab30e68d71726cf0ab02aa016432b1d643dd975e0702f458086d8ef7a35b91d9faa6d29e7458840e1acb02e208b3d79ece077 Len = 54880 Msg = 4064b1cddf29c0c9adb380b2c15250741f89fbc47ec0986b4f39aee2fa459c206bb838b0cd9ab706951fcd13c3d91417642db2b75c04374f62c2c4894c7c722f8d66f13dfc8a703bd7c0bdc907daae7ca51fbfe8befbfcfe53f42299a4e00153af55249df362b40f797c9afc15bbe44aea476a802c0db1212ab60f398bd91035d76f19f73a884b2a853daad376e67f29398dfba72ea21c5fedefd59188cf697c109b18745a66fd3502ea3777b1c147c39cd9b9844d220761a689baca232ad2d15fc1683cda6292d8f96b87104eb603bd1a13ed4010f538cf5c6b070ce45214dcceca527642e6d1ba71a8e2c5d62c7dc2bb23df0200837750187d037e54b0f744649c1e4b1b598384728892bed08b7b7888f1d7f3a3348e8ce1a7f849faaa42b2292014e2eb2370dd05f6de24c43ac68788651d3b8471432cbfd12c945ea9bfcd263e7b643dac606e30d70d1f3aa32698c468f80128a060d8bae3e8880916343e62df9df8965b1bdffd1468d6bb2d625342e0b26d192bab37dbc5744d82576aace5e9c0c7809a68d774953772ce40445f0cb791a9de78edf22960180a51d629c0b8462df882d111fe9c42c21afc4492652ad3dedafff1edb0ac9a1ce8fff93822e2dc2cb42566dcfd7d0350f7cca1150ca21ee02b04fc751a6d5cc70e132a61796b950423efc2927c1fc12a31c6c095fd7e7ee1c276034bd8738f63a415d06a6d5c57ff6c6a4dfb228b6299ef7207dadfc6dd27c7dd6d3891c71936d48e521ca8bc0c63b81e6fde98c8d0e35959dfab5b8022fb63bfa204ed6fe489c4051a3fcf939b792e92910486def1509802b1d119b635a5bda60a779675d6a39c028f9b8deaec89f74e193692d6af2ad4f5e315c06ffe6dff190d5931e0d9ce850d19f787c8e7db3ada713a67b7f1b734bbdf3df8b4649b4ea1137169b9d450a7af201d683574b620bfffd8ab899e41e1db0b116b8c5276d5c58488e307ae72296f0cd3d6397b64d1842dda0754a00e03ddd15bbfffad47b90dc8664ad2517c33d646e279dde42b74b162062221de66c14a98e19c155e56250147d34423a4b6ef6b3412fb28975431ce0526a5f7409343a9c76cabd74deb3f2a699779018f6783b63f2a01237c263164800037dfaedcb282c8c4934c624e2f0f97799374fad9173fcff436d47ceb9cfa3a5d81e01088365e02b1fd7c86c61e3837433784cd52d48f4d363f457de99a199b042a024ee0f6c3ddfb91709f9d342eb3bb0f3af01be12d1fb9c77e686a51480bbfdb4d512c1b3cc169f62f9619987871aac39d4c7c67a1af45748526b4ec0ff2543ccaffb4cc4e16c5d5c15483739edbd7fbb5c7bc8e7464a2ee649e0f91f6b88cf48041bf328344d5d52fc023ec29570c5e8b4a257d2da597de23b7c56986c52fac7800967462b3629f80c1402ca04f0f9426befd5d54dcedecc85b1d9b4682050bb82282bc73cc33dabc41235a8b2aa9468f098d5571706cbf5d715e4fbf55d5ba4a90c92f3ff5122fec27159f7350a21ccc151d8e0dc9dc00e9e0d1af77a769603533b3f74d97c546175b5c23de29c2bde7c8f530af4f05567592bee0f8e187a682f28a3c251b15c645c4400d571dd1d2e70c5c62e06aaf6a086e6d0dca69f83438b4942550e7ca587e4c0b8563949602d5c89c4c2782a1e4aa5c255c73a984b15f631bdb5565aca3cbda03b58cf6daf6b8e4fb170cffa46b63442ff57d07f2c600e66586bcfc8250335772c359ab65559847c2eb174980a73c0ed30170ed0c1a2225ba4c0e131606bfa99ed7521bffc87edb38efd1c8fd413ca359a8d2c29856cd086458d2142e6e76b9d01a00ae70f77087a74cc1e4e2e16ce909112dee5f210977aad09066932f606f4fb3eacd7f89793355297006f92ed2c92b6508d92924df5ad3ddd1710df285b365cb99def6279ec78baf649408d1782b06cbecebbe06569928a61b9d645fee6e588a934b9b78e92c910627f8d87166f8e36c608ce570771cf154f9525f1da2867117627a37256148af55419831b7a3160a70ec24680a49cb760ef0f8c7d5a9e5f89b8dd591d50e042dc438dedb4b376fc3fe181b0d7bd48ffefd8af7642e0c71353d9dc27331f949527d96319dd42aea563e6dd99d6c204ed2484eb7fed1d2146f2619aba3e029fd68a5e2f840fb846e0a5972c6df8436f23b19c4a15d6503b5f07d89f7ea8ba609b567a59d8d674ee52977b04a9d6c1d617f95751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6e6e88e8903c790e2186758dd74a9cb1653ad1e3fb05049c35af3b8a84a7f44ba34a563e65c6b9be4abe43d19023e4fbbce03ca36dd9806ce700a728691098841a63500284799444b4d75258b2b41ccb782eef3f5ef6f5564287862ff478638c5651fcf176b5b736125a378fc98b9295396f801458fde1ecbaac7f2db14fb3c8c98eb367a71b8106c5cf59e34f1ae4ed732a95cee65eb494c1f7e89e1a2727cde68229f1a00b904b519f4fffbdd29238b80886cb818a1be2faf268eda96f2df05fd4b71c0c16435848526031904308fb6a51d9a6b510565bc81466b8f9b844f487eee14325bc38c21c81513550fce7da2ccf04cceb721263bbe6687c5572fb4ee1494f03977def1d309499578a608d2951b8aebaaf3fceaf38d0f4a4772fbf440e6c46d9cbdbb4de37049f34a70e877d8ba72e0c7ac9e972d17c71cdc95f0f8861d06f325d4648699269d9393167554b3d23092ed8b1017318319654b6817a808e0e2ea9a65e1863d53cddf1b3fb7516d8b4d68e437595047fa8a8d5d9277ec0d58e1bac4173833171e613daa94b757500c50cc7359812cb7a4a4fcdabc18addfac8acb6b9373776fb0e21707bd7c4ca27ec12564999192c8a8ee1b8a8d03d1c405658557819a398c31d8d4fb610e1aac0829da7d9e9069c32ff05034ae3f42058bfb514f87b361b7c8c9dc4e2876a7b6d30e558711869bf0603304a2c6d4e6e965d3951c50c8d6389d3f97c8bcbbdd0807fbfd49997b0f97643ea09a7ecba7babc76ba8682e08257d9c16d30c2e5a2e9cb753a8ddf78ad0062998ae57e2b6cbeb76a2955c6044c5ca4d8c650e5fde0a3470674198b845d7383cd2c4b6dfc1c3f7f394951c33b1c8e250a0aeecb0a7e7ca43513b644a80737ef61ed93f347a1833b6a8142228dda3685e2a1d31c1464bd0a8a7f2cb2eb9395cddd3487b913e2d314863bef8a026e9cebe5f3c781247aada08e21437e55e9d545ca6bed6768c7763214de21a4a3c108809d6892a140a8968fc85fc350eef23f81aff98ea54e38b6bc9cd2a01877b9c26c9169fb2673d6befec1a273cfbf941aa614463219ce1dd9dba77e348d863f11d6495ccbb5c2ec6e16ff531ca4cfb8b0df81baa06eef5e28b6bc4ca5abd93c3fe64eabcaf937d2eeff0cd88677264747527fbda24abae4eb7663a3ba1b779692c627bcc097d97086e0709b79efcd27282795b7fe5635956a4224eb3c856837539b5cf9753ab0ae7ee1b102bdb4cb429b874c107d396a5aec43888df490b505c99076c9b188c5751d2c5977196f287ee79a2b30e79b611cbba016efa7e565ea3ecafc933b291fabade6f06157c8edc55687ba7f042621c11d82577a202c80cdf87476c1dcc6c63a743afc283d6621fe2e7781669c80b2325b11d196260c0f9540b46cba5c07c308bb4e073394f2cc11b891094b76511c58bc740eac802d192c5eb267e683931dffc94a98ec2313f6e53cfed9975b42671a8ad49622f738a6799a98efad1813dc06e85738bab472a86402e579b313fa9c5f0b58ef6253d5bf643c8b8a77e52e09045e9d6d050db6ea75516f72056622c3118929a3d25cab6ad58bb5c2acb08dabe37443c236f788c20073c34bf71c62e2174a6e3adcd963b1b4d03e1eb442d7ca8a7271bcb33a903aeeae0b8cf0fc61035997503ae794a49ce9544e26f763b56ee1a051e5e59e7559254b6cbe58cfc82dbfb7f72d5a5317325d5c0b63dedacfa0d04508c434ebe0278e911068965d3e6931f48a9a9fdf647bf633a05ccf71cc673fabc1e109e878ad11ca1f12146e6cbe9794320a1d00327f9d20339933ee55cc1618a2c5ca5ee6f2973cc04439cafa34d9e016043c7d29473b6aeda3731a11d63dd5d3f7e116d1fe06311c876d388fd3df205f106420f2dab65af501f5bda98d9c2a7dffb4d5e2da48ef5b621882d3a4919c34b6fdaf3540f838743b239fc4f91c5ec866ad66c18d43bea45ea26e70aed89bbe7f6ff39982e74c91da64870b23a3bbdbb33290151fe1e81f0174c50bf99a6724f223b4c7a76ddd75651f3f25121a87df6ead1a869908b4f6d6f44e4f8ec1468f987fba67b771344764be8dbcce6a0bfb2085cdbe02a2694e628bd3e174338127f7eccc20bbda9a3060a83a7560798f5850227162629650522fa11a6cb3da5f1399d3b49ab9925558e0450efacf315b1d86ecce1dc2ccb127c49fed96549c2a7c069a387ebc80ade66cfdd0f32379b6734a4bab94292cd4f8a9eb12075e632889c4ab2174c98cec028c384a076538ea8225a7d1729f9e00eb67ef5168d916a3635d6c3623ea9e58d6c95e42df9c583d719e68095d2c0a7e2885127461ce9de13159474134269e3b87aad78123d0c0f8693ef619fdd95897d88bbb419944e02b1c3ea3084e8674db40b80bcf7a095862918bb9c9fcad709023015482b943c6c84c96e7551a100981277963f38c5008c5120f1ae3ffb13ab4307044fd68d33902e8e87dee40ce4374647745b702acb86713527f2db1eb9f4a2860f37b4ffd211f19bdcc9b67c80bfe203a1ae184265092bddb5171b76585993257c9c316c86468069c3c2637054a6583484b3ab9c5b88c3832f975bc27d6ea77df2e9f643deb25d80d35555a8de6f2b42b3e8a4a91d99dabdfdd02663778851f7f8ad5e1629e9eb6981ff27568c9eddc6b5d99de92990f3e6a67df5d9f55b251c0452e3641651ac9c662c3339fd99e228e0f2e1ed1e1281b5cfed64a6753b93528c7720be229e3381e66913938004caf1ebb13b2559a32673d09add5955ce1f4417869074bd03f2c299423323e2441aaa3cb0e4126aa734d93f22da5335774b693c1dad3864477cd6d5243c4b62fc33ca3a6e8734dfb34f3e8201e63482bb8a2a4088f179b6bd2427409b797aa081b8da8b469f2d173bc81c3fb48b6ddc2f6e1ffb64e7a902f9ab4c6224854219791c4395d5863bafc5520adeb7247f903759a2934e0a46f77154ae903bea324c46c0adf097e71117d45f82d5866bea4d67ff6abe90d3e402a8d2d6716e12bba77f6862020a4c2ddddd530cbaaeac2e6235a1d0e3c9cf009324884c8c27995eb987561870a90fe26064df00f49c7fbc8d24f36da975761d4768f78926e4d88bf0f32c2992f0bcef4dff562829ec51251cca66a9561043aa8dea9314f8426ad3fc475d2e0f8dcda505014abab0fabaf8af7a7e0c9016c228e52e0d6866bccac72a086b8e3cbcdc94141f4f612054379793c9ac1fde157c28cba7a90c08b072c6189ac9d2a11a443d09adb6940e953192884c634ba688dc2adfec086844c9fd5126830a93e332af20443122cbc21a4369fb5746287fed5c9f607fae15a165b518f265a03a697277be525e1680e17fe79e5b8ec72ec0bf87f71bb70c8ca510445e0a972d4eaa763897b268f45bf31288a0176768d71f7bf8d250369645d65625c0bdbc04393caa5c2cf2f66ea56d9ec10fed65adb9f2bef9b1ac82fdc9aba3d3c1aa38c792867b6cee829ac805b7610b4e1bfdf83fd0d535059f008590ab85d8d14e81d9e31e85f56cefaaa2e576f5d1db41b4eae1406b255e9643d0333c88af80294bcd936b466028a8ca81dd12e9bf37fd1ef836a7fd351d20d15019f508b24eb8eb152c033937923c5ee74511a92e048c90a2b89de7fed1dd2da7cd6ba29bbd7be443256cdb064a18fc35c5f9b098a19ebe7cdf98c7ed1d19ad29b5e6c2c62cf0cbda181ea836a0dd171fd8419ca99f91fce9240f298a4f64f4787c1d05cc3d96063c6c8f2d6346e733e7e47fc9bb6f14d06a2e877950f95d87f67874c808600a27fcab34d6f69cc5c730831ad4589075dd82479823cb9b41dc364364a625349ba59d4ca6316b22f7657c2c99290b945378c40797d564b5e065aa65831c8d0be90390d969d95b7a0a834d5971443efb3c36a2072cfab6c987b8e5474697ba8660d679d9e61b31f26da5068239b28d258eab9e9ebe003c56c64a597135a438149172aab6a183793caf4f5a4f690050b3c92c3c66d1826fde1a9e896bc6ce7047097cc5f832beaba93df69b19759a34167a4cedd7fdfdcbdff329f7af70731d8e27693e27000943d8981f4b68e60ca1de2092356a99decadcfe7126a4c93e7a5a79ac85cb901fdc3b4c3e0db640c4146b4a70a5a73ba1f7458b1888f4478d215c8edb2f4e795ecf51d8d734aa0c4d265e568ca11669e3dbba3764b10661ebace4c569bd381232a7bcbc8f728caf243227e33ada209b10e29b620a1163bed67783bbcc9210f1580fcc65ab2a06afd5d2485eff935e45c59679b95d3c94a4ea0bc9e0985051ad2b320172dedd7094de8140586f7f48005e81c5abf28501ba72e427c2417a729c28e90c528eff82e4aac9903dfef05641681f1f984ead43661dab1ddf5c730c44dd8f4d8320229625c715c89e2299018f5ed8e82ce5f7c24e56ab1c964ddc873db58f359356c922cebfe059e77ecbe250cf49afc84d1716c9aa6ec4959a096bfd4d7364f18765d145f1c3b4b8682b612c15dbe708e86da96e7580764bc59c32fa01d65c2c368afa22093a697f731a1677ef2a1e5d4c7e02a3646ad237551764ca7f227ba1d8ab35f962bef8ab242a7adaa79ec633ddbabb1ee39848c6ccdd89c521e244010238ed229abbe2ca0fdef6bacbb46f3b30c62b376f934aa8a1811a90768055b847d6b8442ddba86a7a9a229ee80589b1ea02eb6384e6682b57948fb2f9a72145fde70fb47878c9fb08fe770d78fc96564e036449b00c21ed637a618337a12728a8fc5c1a272dc7fa4f8e7c6cfb242596e14a3e407d6ef85d69b528a79d18e7dedd8935eb966512f692acab63eaf6b7e24849c1fe49a96bf9bed74d96b668d3d70000258f62b93b6e96eb7c58c4febdc6e774a7b9b125ed50f75368b7003b8bbfc513939c0884b1c0a0bd67d225a6b7b3537d4829207f0ce197abe2aef6eb7fe771161887e46216ab64b5065669892645f0a63bc3240f3b2a046343e5270310ecb89a1ce9a2dbca7d4744d05c1d1099ed6391fb0e38710898e1fc14d00d1cff4de0122927b05c5db4ccff4e69ccc7731800b2fe60ea2ef5cca4e8de1615938b79ac10b5c8996e30e06a46e8f5d52852647cabce6195a37323c1abf81ddd0145fe51085b52ca8bf49e93be3886e2bdb8412bced396e779014cccd7fb6dcfd0df5a938b823cc020093dfdb7a5a351f2053c82beb6673c1a40962aef706c6a9c97fcd7fcb30d16d4ff5d0cd5b8c1cf6fc9b535dddf592001819e6044cfc039cf008392ee764a3b15476a25aafa6897719659a9bec6e32fb974c4018a91dfb9e2b95d58c3346aa96b61e3ec89e31e66b1cb8852c405aba7bc7ab583234f31777223089e3d85e4fe41ef58c5f4fb49a9ab09dfc5a00419448503d16991505bdee7ce03d79fd34f86233047469ebb70dcc7b1be76b55a9272adb0b639775db56cde1aed998cb510fd99e52df2c99c2a7c9253a2ea8661cdbe9101b25727cfe4bdafba045866a3cfa1106e7b3f1825ed0585702ba595c21184c9677467351f502de6fc1698b017d23d214ccda00cd12f043b97c71c65e41461c1627ace21d48e5a0e8162df1b89df0e470083aa1a3676f50f2af3c369502cd213731410707805bea0ca97afeb823cb0ec1a3bd1c2ce4b548aba404f328ef1623a29feb293824cb82838136fc29971b19afa64ab88f112af28b61af43408d87eafe799492d7bc9f31f6a64b31338247cee418c8bff57637183bf0266f0566893df4c523880dd03ebf0d219fe6fc6ab9f205012177859c4280625952be9e0185e62c8d805402e910f46ff91c62afdad850bd6a3c29680ab5f3a9a21a7a34e6e1ab4dd8933edd8e7d98c536a9ef72570cafb15a011cc548f639b8d565e9ee9e075500af448dc748ed72b6e12dd36d6bbdd68cd9589ac5df6f1a36f91d55f5b05dacec197b8be79ec84beb009257ca9d538ef4ef29e99056865ecb17290470a44d77ba1e207e661876eb0b9ebfc3ae75369f91a55c524d35a5cc2036713f88033d8011c61baf6b3e5f1abfc09c5f437ccfd10d02d91d2505332edd5edd4d6553978d9a1a54661f99eca0af701172b13984ec0d0e88923f4c984aaa9755782e1fc267fc21b3eba9b0834482b506462035beb73cd252f9c4953be82deac1060cec26d6e0e32185320b8ecfe1986321b7f6e6fb3f551d99db6586d2115e094026442ba1ee69847de233730a731f104c9e066280c1a0d3bbad46e0cffcfc156ea5ae3992cdbac61be0af9cbae154f50ffeed9c0e68b95aa761bfb1a697cbcdd8b0b3b86f26decda755076faad23ffbb1ff31fa6ddcaa9ca52059622089d31ac570d91001a0de836968c456a1efe7087cc85ce664c67b7ffd129a59057a1ce27f0caba910e4c1cea9426db866e05405b682f6c7bdce32edf65e0cff1d14af0f4cadaeec64998f98ae0a8afcc24c8edba85485053e9bd9cdd92d37bc2ffc9387757b6c3fc46851c8c1e9a48c7ddb9e709a679308b0d67706eea6a2f905ddd034419d6c0bf9f90e462a0742cf5f368baed4e2a737da2615827df2d51c655d6ffcfa3c36b9ccf3cefa318bec2d30055d7c9dee4afc8634ba28ce38588f182477c9e67f53af02ff99cc1e9e2a0eb7ef1cc13fb302be7aa86ee029a1b4b8e6dbf0824f8f4a5766c478a4386785dabd9dd16700585ae67f293992d5557001962ae20f7b93a318bfeb726ac80f84f90ab784552906d7da5d5f24261b7b14d1f2b85658b3b4e759d41b900616bdb0d466e43b7301e40303dcf33685433b288fc02e53443e1a9d846efdd9606a9a8fd199cc00a9d21b65c9c48d789595be35a5c933e2bd66ec4d00553855600cceab596a18dadfe2d28595dcd4f03f582cc37ad5700aab71537f3551750cef43808cd5a270d2fd7b32eccded71a86cd6ad5876ac8dd3f4a876bc8b2a5c07f359d8b8ab097beeebe36321dbbf0ba80255677e0115314581537e8b6aa7944d5594ffb94567e23891628cac251a4bf6eb1e85bc83d904693aba92753a92c6e6fe3d1d1709844cb8d842d51615c6d99c0d792d9a64c0b0460724db0163b199dbd59b595861286275a6c967e6118a5ca252ad88a10c92dae4d1db80b74dcdb633c1f8dc06b41acc77e5416aa483307d0ea004bd58e4172c4c7e25aa1f60adc4f6ac9acea8692331c67bf005d9d27ee3eae1c4f44852174e85f84b81c2051b6c2c7dca56c7ea0b3a6b521f610c663d363efc3657f7bf59e89725942c27a2dd56de1cd09cea9e9a8e6d5015a6c5a7342010d9a20bef94a6a18bef4ad4d6a1bc291470f4c999ed97d6d45f1cfb8cfd2d476a60503bb837c621683db3a05868808ed4637e055d3fccb9a8667a88ead0ee535379870dd812811136f619b93461f12c28dcb577bcfcffe0f24c7876668841edd40c91a9d98b9f19fe04c246 MD = 7b87a9fb861a84bafcc146831ed9a54fe3512dad25668512b17339175b0c9523596209336b0ed0cde5648faf6c101043ba3a653bde0ab8a8c3959b33aa9f8624 Len = 55672 Msg = 05b9f9936306166d89bfb097617128be79c69670b36416243e12627bc41ca6c5e5f98fc7e52ca5bca168dc99c8f76595475dcae905383ad4d16a22e3997afd6fdc386c6761a089502a017889a45f40d42015d91286be874e485666fd969d4584d1bcb7fb412b68310ad2aef05c6f6082eb37eb739fc0a2998c1e5652244d270dabcf990cec95eb682b23a4555af06ea7900b2795b60436bd840a1b69ac514a1154b73a21caa6b9fb733c824005a9114cf6d9b6ff3554e9c31762ddca94725898b3bcc1c243267bf5cc647139c564f27707e9c039827663b22f6dc3fe4578f6abb0285777bfdcd85b1de599c902e7b933aa826ccc07324d92b374f68c282bce50334123c9a69179374e05217724fb0d85c7eee23f2a524f6c8abf9efca452889124514e3f600d0590460d31cc9368967747734b1a559c10479e96e1d720b7cc766b9eff625518256fef45f34fb8f6fd10105acfe6efda392bd641eaa406204006f1715fb8ee7a81db30f48d88f96dea580beb952a60d271201a07dfebbd568f499c1196cb91fac0dcf16327ffbf940458206dc66e0f4d612f5232e935ad215f4755c8cb23a7628a7a1adbea3d7334f417382a893b6612b15f66082f083e48590905dc2646997889be94a2fdc97b15619d39680717cceb08b93fd2daefd89524969296d0becd0562af4500892b41fff4f30d70678da99e0e43c3d7116fe3ce68f6e63ef113add0c056163fb6ec2bba55209a8ad22266f46c07db61fd12c7bccf32e71cb0cba0a349b9efa6ab93a30d2b2ccafd706069b5ca0d70b6c55fec27ff517f7736700d44a5e2b97c91a810c21f20831368ce1ba9cf5b681f93debbd7a05b9599ab895e7c7dd95a0a8fb3da9fd803af12e3f4e49724fbade48c189a935b5910c8369ffa1379a4bc98ce3d686dffdd3543085b2d4971f5254dda94f224d852da4dff3949d1404dc56d76cd24f33bb7fdee008a5c855d4fbaa2a5da2c53be4eda702fdfb37e7bdc5fd3aeec75fb3598ef5bf209db149013532a1473aee6b555f878ee1aa0e1d15771109e21c34b9488f3d1076110beb349d72e50e6e2a567701caf637078c3ebc8e36d6ff477ad018ff19a6719654a6ef730f681bb2f5a79a62e5bb76ba3ec70369d3249edf7e624b6d1fc39b94082682745cacd7bfccb960016c51193892409aa86a75395acc1a4047b40a6ca0b2c4ae0fef25fadb3c16484bc359a6f93335e2b8814b673fe052a82d7add5d32d11bb2b43b55dd9bb048b3c09f27a8727e016c18ac0991056795d36ce8dee5c0ef9640ffc5df0887c5cb430e346d863aff4da7475f425f21ae7e62a46261bed16acec9411303f405e9187673477dc8c9138514d2ff882a3b4156c6628c2820fadf1fdc26a77738cc96aabe9e2ceb08937712453a114d7ab8acb98f05da74b493b913ca2f079b3f125b1c9bed69379e2076afa8fb3904c9006d312d2cc1d9f242855533b898028f9da2c88eff90e62206bea7c074eb30bdc8ef481145c6ea627dc02ea951ed2f92b50a49182328790cacab852c558c639168cf58dbcf7e087dac063a8b998b84f0fefe08b8268452e688b9d23d1bb1101c7679fdfd484bd6bc53a3f36aedd7a522e20aa1ff485916282186197315ddc897687ba1f63ea4b7971b35d3b7cd760290f49c8f5e270b354a1d8cc57ef286ff9ab540ef57213d3da659486602c6cb2fd3bd403b45311f32e4c33a50b1302117aef36620708e69cb52943824dc586b7f538272304505098150c91b65ba3d50c34c8957f002d4bf033462a19a94f0cb83a90acf08fe015ec33685ac5eda988a64ec1d92e86e92a157c43af131dd3e6fdf3cac932fa0b4835b0e8f69b6c2c0328f05f6a3541456b54b7a83c375057fcce496fe8b0f0d9d1bcb414ce007e352eda442cb05cdb48f7f50cfe384eebe6367364067033175398c9667548bccbcbf1036faf146df9fbb440a4cb0b2095857c336b17c983178086a4ee92cd96fcf634ec9c70fc2e46648b7da79a1c75f73eb658872b5a689969819475f3c657b9bedfdef1f8d169678d64f33df0d515b818cc28dfc98daa451472e2232199c7a92cda1f96cefce4077e28eb8c579dc8811ca6ec9c79c910c28b42d71fa3b0ae75470df7b47ae368cc3ebdadbf56dc55fa502cebe5c37763b9d6d7b9920171d4c51860b07385f0bc5ed40d81fc76fb85cabe476fe330fd6bd1fb1bd0a3c446013fa5bc91fa768aaa664bffaf6b3d60209a6eddbebd47c4f0b304f5667b7396fc8ef807e172d518f88ca87a7e363574ee1166d7219c9034ba06f84cc14196c88e58192be9022b046f77f5683882e69fb6d8b01ee0a894b59073e00a2a1eb6467f460e0ef1d3feb5d7d03ab0237ad74a429654994308dab03ca2c316e93a5a7797ffe19a400dd993f83e7d3a874390db58f4582f92e5eb8b843aa95846bc0ac39d2c9ab520d74106996ac8eeae0899bcc19ac6ca14664db031e49bb889cc4e925b743f49d759c07684fb22b4dfef7b53452fa55112b48a850b479f1ef994af4c9780da3daebcdd4b7f9a94746120bd0aab5cfeabd4f62a74d90cc072df39b4591af77279ed2821ed53ef24167dc4e748bdc8d8c2a255b3e465da039c83e6e622ac8210e5dcc412c5c8a1dc827b038174411b3b7dc4f9af3d755a72842dc1cb0d14c9bb69c3b93a39a559c4a0a30414f800ff30c48109a5e6d233141325f2ed831c737bede92e21b2b4bee3593cf0273bc21abd7f23ae1e49440ef12fb2a2d4ed8a295859974c4d99bb79419390ee43a54e14ed96f00fa1cd929312c11ef906b127925b95153b48548331e637e527ef9e6e96c5f23155b6da86697eb2af1e0d39bb578b89ab229a4dd48fdb2e84c3b38ee8484f792da7e5d8e6393de8ae3a71eb0e1ff11ea129c9ea753b275eb5e917dd85d192142e2eb72f7baa584d6374b831e793933a3e7a5f9530dcd2b1c0c1a4f30dda96ac7a11b3480d65d6c815f56c72105a7bc6cb3ae4b5cb1ae50eec74e139480a64275a7962896411bf400de414154f1db1ab9094deb10f9f675c822a5715fe0a036f168e4a5b47571c9f946a39846d843bcfd5aed7f3c4106085ca0a8cf0f6817b6af677f5277fdff4ccf0af62263236231ce2b056e2b218d8700c3d0a33f918d502425deb53d5504faf69da176365dc7179fec3e4e6a05dd80590eb5944cf77181e4167b2490e5335304914e1a3d01d2bcd730f08675887672c9d3aff8d40454ca53cbed46ff58faf37d684464e39a25b0287bb4acda03f8ecd7d558674142a79817b89d92f51adc4ac5a53d0cc691308ff83ef3281412d54d07662766312d0a89946f147f0e9547d771ba8078628173bacafd549e903f8c11dd18a55c103dce1d5e51ea819862de08062ac72e23d56fbf15292166ead48dd9dd6f4adf6aff92a1d9f378314f0dff8b076869949727950b6b551217809c7b136ccc9056adecd8d59be656148ef13caeda15f04248d2842e32138f370dd1b44d1fd30e6855800117188cfc91d4b716020295f3cd9570ada60dc6f13bcf2ec9e57af52d7afe43bbe4d469e43fbcba0c13257adc8d298c81f152e1f09c610e3c8ae2b5660504c269dd63ff9574a3949f5097372307518091aeb61705ef5fea7c9c0b96509d05668b5f2bd098e725b13058fc5d5fd2c9e76d1c8bc8999b086e1a973a0a75b97cba90f8a06f56fdbf9a7f8aa94ffb65ef4b74e96869342616e3971b12a43dd0d7293b18763e683eeddacd6442a18e372e073993b08b5e26f7f5628619d62189a15cca5cf1c045011cecba744cd470cd22b52b8a18a18004281e1d66b422b92a77afcf34c797660ad93ac7492c6b4bae59dfeb5ae53e324423c8183b661c7d59a6acca1e4c2653b2bf5f644165d887413fd1c974cad3fd6d778df382c425d69ddade3b9813ef867f1bc5220b8d9ebc3c415576762de549f69fca3fdb42c16d4d60beb420a36586e69b0670f6084042e60ab542cd72f4906609174d836691aa0ef4c894567f2acd8fa98de19f6a4fc3d4f88beee95e8479424fffad39b3f90548f3767c980ba1d2b0b3e5e466282fa78fa743bb6835175cf1d0edef5c9f7a0791d962dd63dd6d3f10668909f8c662768c736738b89b2fc41b385c846a9d87496032f8374868df5b152df1b2b5c97ab941f9810758f5203724f2e5fcf232c3133a8ca0fac4329acf4576ba9f3bb5fad846b60b77c7d7ab3e957cf4c97203902d974317c855cf01f417dd3dffd8f0455c1115712a93b72342e353137a686490d0ecf2b7008b92b77202ce16753c2cfccd27b45c903b282adc94f1cc6053fa27a5d217f933c4221db19cc5be9fd3a083a3f0ff28492c8f246430f58a4bb318c724bd2f68f29e01c74b5c50a0c01e1f7c7913725ea5f66092922dcac77d046511d624a5809d77962697b7fb679699de4994f5aa8a37175107bf11de1e84d6438a229f26dac4ff63ce3f46327d83d5816db01df4158d1db4f67353cbf9e397588292830fc1d9840f20aa6d724d083f9d6b33030b9b185820e1278a00e429c608adce86dcf07ba3dcc051b44770945686c4963b4d755975095a741b1967b7f0d86e1f012ac10bed712fddb13e62c8a8d20c622d365ed0e2f2b4c19d71ff2e964c360c8855ce0abf50b196caa3ae15b503952f5f52920f3061a29877a704ee24d8b82f930a720897f008258733acfbf9901146582ed974dbca8681302523872b0246e0a7a5478605c395f27d4b09fbe50be35f9e277f9243b1e2e45d78d58a275d74d83ca2d8f3976fed95f3762f8605db9dc3a7e8fef816ac4a6a661e9557984ec47ed8af80e1bb497188a031a83aea83a32aebcff216b31e1f5bd092ed8ffc5ab83cf217e9c0ffe4b432fa09ee8af19895fdf058e36ea78be46123523883d215c2ab1f787e21c3c6483d776b6ce6b99ed8a55c203d70627a4bf2e4e910e3a7e46631b74db884a5628ff09ed2cddeb0eb0dc965927abc827d98898bd4011ffc6b25796004135a135e0e04d6dc7be3662187c2c34c25b375ea5cad8e9f83a92dfe82ea90382912abfd34d2b5e4e19547b6e929fb99c8e5bb552ad77398131fdb3300fdde56645ecdd4b6f2c288a954e43f94875527ced3d142758fc17a29d4828d222b90eb5f9ef788e6dd73343db2ba003c438662b1fe4646bf4efea252679281591c5e637543c76e570b5e74093f37cd22e6f5c72cd588b67a8d919d0759a9a438189d6b4ffdac198a04cad4b64afbeafafa39e179fa273639d410e6c32b265a21c8e44f3a2d13fef2427eb2af6664ee26f5b93e23cc902a6faaf30c005ca737b8a5b99bde42ada3225cb0aa6f22014b3951fa39d4dd5227ae8abe79694e9ab15f3783eda6dec78a8cac2738700e5f76a4977360e79cfba258fbe9bb48a17f5ba7e6e9912e61f039a3c938d95c7bee24eb5ecb4ff69beb2f0166fb4e38d5c39b053c4142df7cc6250a2c6bf98f0b2baa8fe058636c5aaf223a6479aeb45c15f409b0216f247fa7d1225e3735722ca68c04f4b127b349c610666cdb6945c4d50b27eb1062a7fb13c28ed73109b060dd4dece45c1985e9ae9e17f896ea67709f24e23584e9d46f987d921fefe2c4483e64aa37bfb53ecaf71fb18032be841fb2e5cb37f551345db466fea0aa4d28334874bf775297686e0e29d5ac456235f2ded2355ae8354245e61306f216c556b299d2bf2bcb1c7d337220f6d53551f7ca715ec326e40278a8bc065d9cabd7ca5691130bbd7fd0f7cbb1a99783892a43e6f8fff7146f4561f684c554f8eff10d9fccca37b4e73152874b283a3fc737a4d8f44a43cbf07a78c00eb4afaf39bdaaeebb5cc59aa7da3806bd31418266268520f1b23b85fe2e37958868a0183f79fcd3db3f27e71827f2ca76395fc3ec638f5f5fbc30fb1ebd28d7a065e8dc67c2adefab05e112eea72d3304b4e7acc07b0dd4bcecd693a8b3b716d510ec6439242882a93593b661c441d0f7487b7598d99b3197b89ed842ae7cd3951e2d382a2ae73d6442924a382bdb44bc588de6cbfba1e65ea3fc416319f48e7ec22dd0b12374806aa16f36c83a53dec2598158e07ddc7390337157806298a7d0c150b674ca5afc0af6ad14a87c363fb7e018446ccc8559caeb80933134d3c069804861db6c04f0e3a6be5c4f6e0cb7fb709551c77447197d30cc8cebfd50687783775b5ba4fd1f73463586239c42080b8f9ad986e19c3305a7979d171878f0a94f601b7bf1cdc84839851acb63708076919b7431a0ff2712b4845c4932d8096d48952ac2ded19bb1053f92bd6012b1ab2b098a4e3eea7622ec153308c8d803420378f1c6b8b30a6c3db776601e933c47b087b44327d890a4c2bcc9dc47038eb604ae18de3bec84d847af4e5a0b9c50aac6786a96d8541716bd0d791a39d4fc37c086f89fc4d89b63c76983119378cf62d16e15dfece769f74f69d9691de6ec45cba62971e021debd1188ad1d62c2d8fe65db5e84b20d19d50e64533f6f93df7e8a7e140b1a329f42da8f34d3d5f53ddbf832ad0be43fa72e5e8f8f13ab763630919150a1df958d7366efa2eb89aa4e9a1d2679fbdfe98261d43de56c5e08910a556257fcbcc4f9ed6b1c8fbaea3c8ba729095dcb21b53c2df411eecff3c5607a5a73a2721e4b951f4bb843c874368581c06db100460d54c1228e13b5192734ff2547c8988083cf678d2577aaa422ccc857c62c21b96c3cfa0414eca21ac87f072a5122d69028097493f693b8168bb1d9739517a5f85c85070d48e21d8503bf30fe2259b2a982e3b514ae10a737dbe533887d1c138f48ad96a29c8c8df47375fb052dc5c3593eeeb773ae86ce848dc7752ac0a1d0eacb171768725489c59223c3d3e60f7f0ba67aea359a5eb4892be90ccf123194976e6217c38cd27794da5939deed8f4c5d7428cbded410efc230ba68e9e453a5118d1f06482e7f0dded676bbaaa6ddc1bb0268dae3fe35d6ac36cc280fb970a8e5a19e616ae9b2830ff11cc7bba4735590fbcba5c97b461fb3a89ea8a5042106906660b7b031359d94c4abec8658d8ae9baac1ab03ddca1174f092994e46dd448e2626879cb740a429cbb4a89f5686032799db5927882a627cc9584860041df94b8b304f94ce9c4d2b70b77a6b0ff419c163894eb91cef69177d40548ece6b8b64e01e7e4d0970ef164e34e08df7bb48f5724bea1d0e91bbf186fb3c2f083e7146cf51a209da970076debd595c903427306093b9e7dfb9d17790d96dd5440f518dc36a497fb45727c98ca1636b8c071b0e99114c8e02b02036157b77f5f466929656d8d2f34949db9ae2919d4f2d9ccaec962500941a2d4ea97f41d915abdcbaece42ded28fbd782476afe455c077d8d66d24f748e7889a34e48dd0fc8dcda411e05c9e6753e88c26ba0581a36ac21f8e9f80126d1b04dd4810cad9a6409c7ab96364d5d6c93f5f2840d2f8a438e1283f251da85f253e2490e3523f79bb55d80e1f018b0739e77b90d1bf4f4272fd7b52c8a5c1084d5ff77325ce0a5c451e4378dbdcc9e1ea0b68c7357490635f3da12d50bd654fdb8fde599de54336281f455f619d964e26d1ac363498c3f148ca213a850f9d1c16f562aa1440f1f1aa82652b77ebfb363361d14496d3eed375cb83e02f43705747ba0acf52871c74146c2c44e66eff7f5ae45f5822cf1bf12e6950861501e7e9b6055f2e1f61cca7ae07201375cfaa12e382dcdca1315133bbcc0f9600f009b8abffe83043760a72bf7bcbfeeeb604d71662d237dca49981631b4877b8b8dead6ed02d3d856fddbd91f0b56e17ca16b63badc8d198cefac3707f839105026eb0469fb6beaef44e706a8d64ccbab4e798998a4712a0577ce1281f494caf76c2aa7d940c1986ac6473937a627e9d1c7f637922d662bbe827c3d42421107dbbe18159d9b6b8d54027ae54e037ee89a8e701239dfd29b0290452bbb59445387ad31f23933c0163579f0af4e7698245032658df2244cf48c11a7427fb2953a85aa16a22ed275ef89ad56dbdb682a49bd34452f5d934bc4b5971125e1d68a29504524ca00dfd365bb1d0c1f5760abb51c14ad6aceb545881981215a944d99ac71feeace31b49f1554398ece54e872f30743fcb4e802c0cb1270463509805a405547e71344090f6aef836d8d567836700952b1b21bf453ea5ad4fe69b407326194b0885dba35caf2e7ab16b0ce885cd89cb17ad6ed1265823d3fc84d265ab8ac9ab97cf206e34839c6e118fd4fa16c892bf0a697cde57c0f44112273c2e3636de1c30374bc6a1dac27f5f2b73c5bdc0e5180c37950d61e0e09e99b622c49b942048dda5a3d52a1d6653a2263270021d487f25ffff86cb1eae929a19cc4e620a56d4a50171c357b25192e26a59246d48849c5ea903721de428c71b3882f514024a6b9133fdb8b0024be527de300887a76116be1de9f9e09914e227fb8ce138e3c2b3a7248fdbbe751cf47a6aff45d7a3a6964d44f9429ba43b8ec34a313956158754f1ba6f5408748b66e2f60d02e5a51dc314047b76d66f6571f90dbb26f60061f777dee54c166561e3686aa3683a138c461a46b6bc1a615933d02c70cfa10c1744407938eb71b1661513ae099f5d56bcc668f3f33dede2e17d518f995ddea173e25471b158a0c162a1ebab87ced6d775ec04f17a20da5ac3f7821e7df736273b7abbb098bc2bfc1d32f847651d2efd7e60f82a938e6631c8486dc266c6300638b37d1c353e9bc95e6e436beab5ec2fa1c94c8486af1bd0b8181a619af154a63236a39fcf077792effdd3005fbe98d7a4cf06e99aaa809d5b118fe462a12a6ff1aa3520af3e47be9688b0ec0c5fbb5c501b304018a81d0179d9d63406fe3bca3cb839861e0c94b51cb7e31939c1dc266d55d17148d07b65d918f737ce2f0e1ddc08b9bb6299e4de4931736d2e0c839dc325f263724b212f4477f8d7025d2bd19a41bca6c30cc2a3e49f68d23267382919319a00de4097c9829de3fbe9af1b4f3c0b4b2f8b8db36bb7a8cb2f8ffa84323924d12fd4d866995b34bf8bcc4e65fe8a106d3e0046419f88f5a36b8beeee20e9a49fd89b3b150997e1956ef36191454ef52abb6c5cf3a5202df8706f6bff5bf2590de37c902c7ffd4e6c8ea611288e4e658a8e15fa51e647f9d22583983d4b1ced2239bfff346556234cd22d86b140530696a04446e4cac4013a720e9e32582e05e7c0acb2b4226a073e22cfe7b4c2258055d7406833ba61ec373f5aa566ebf24c62618ace341e01a34866d65cb97e8c7cd01c5389c71ce463d274add4606a2e679d05a37e3cc1e39f7586880f49db50a20d58c3d12659160d12fa5053a83fab01a0923de85573d7a2ca6b2e25eb4138991671d967dadabf93ffb78b4bc6d031c071f2a134069ca75451fb0fc928180e0af351dd746b06a79ca194a5e44287884c1a0b178bd8a4195f111f752187c9989caade171f5f4495d10179e845a5cb774ea3c7e61552f3f66812c0a65590ba9ff84502ce9140fe53d9264f9a977703c76e120c58f9fcf1051a5dc4eb8ecb54eac5cba34cf1959ba75e18fc04013e99405371c4b3605e07101af9158cf4c1ff43ac45abd768e7835a05e06a6eac84f4aaa6c7d64071019bdd13ee99d1aef9247055ba01b81ebd1d3478857f1fbfd07ccd0e1d2a47556c1736ab453a02e5fb293a67328d373a9fd3fc5f0f256163ab9971347aa8103327e1e18a05de66c05078698bb6379be5150c7c6187437ac09cb35dbfe638e234bb63a659366f46687f77c5684ce72e46a8317a27f4c1b3fd2b325a586ac20780af034fc0e0d4ea04109015a7ff853686dfa8bf595e865443e07e30a7 MD = afbe632820e278b633260ee86ea0c2a88735afece12932ef44d5e762168bc28530a88bf49bd80ba36ceabafbeba7fea0ba783398109b10bf1373a3316e72ad68 Len = 56464 Msg = 7a57070de9006a0eaba8e38cb24c0d088e08261a86dac157e8a9ba779d866fb800312d7df1dfe93b243a3195bfaa62c625d31a400c5ff092d6fd638f1ea911ad912f2aabffea2377b1d2af4efeb6eb2519c5d8482d530f41acdab0fbe43f9c27d357e4df3caa8189fa7745ff95f811ed13e6497a1040852a1149890216d078ee6eb34461cfa6693ba631dbefacf83ce5ba3f531ddeadba16ae50d6eedce20cca0b4b3278e16644535e0859676c3fd5d6b7d7df7bbe2316cc2bfa7f055fffc2835225976d9a737b9ac905a7affc544288b1b7d6dad92901162f4c6d90c7ae01e0ea4b5988215474d8902fad0f85bfedc351e51e835747e3ba625086d63c7832aa7cc562119f9199d55a8f54cf2f093c4f3f6ba1be5f0524816d0db321e5e3bba9af9998503bb35158d02b823621b999f3225145d219ec2c33f88bddb7ea7905a52cd1e58d1e41032b9a0d208d84576b78a29df409ae836398aad3eae174c278669a75300f6fc319145f3d171c7f6b1aa7685995a9465232772cecc4e7ab457cb3a28b611f57c2fadcc7c14d2b3b7e0e461c8c10fb08e2ff9a25de5111b68a7a56ec1d5f05fec50e4b7ca3ac02e017ae1d663f4d471dba33c73eb27ba7bd19d8151f3214098b54bd2823eb1be995bf64f6ec7933d5ad6337c71f6f28f0ea7b00b9e3d3677327f76f3d679f812782fd98975942acecdf6372626f1d42356337580ae207408af9378c50edc9c805d059b0c953a2a0d5db444b5fd7c5b0be50d54acfc1d687972a9b7c2a6070d7cba75b155482a2f5d9ca8d2c88fe6d5ad3dadd3dd22b4824e2e1aca793669d96c12e8c2f009049943ed4c77ca38d2028bc29d899d9c66600b347f07652a757ed2e8e73669522a0654c2079a2792be302c0644ec5ad3a37015284f14f31cda6c45cee9923dae3ad504dd72b08d281c0d029b3c52b1630c31006bf379bf67d9203917784cc98787a3e872066157636be7a3d3fc732db501316192048c36a6124921651becb978c0f154324b0312cf3e5e84530db42c6412ef9d1d0ae2d5521635933a3cf869fc572bfc90a94c4bd603e0388ae8ac39dac1ca377f7f1437f6558412f953d6778cbad2261fb9736f224d0b150e05a1d2938e6fa52bc976cafd40930545192d4e947c828531f43f091e8a4dbe3eed5b9328e93e8ac482a0faf16800fe8fc5537bce1c9b8e69d1f586253c06a8a0183fd80552b54cbc3329645d4c5c734c10ff7b740bab9649eb3d72f0e2e448d41eb52da36b725f85435683ab6de3e80c6477ca30da215134988d6bec0f65334d5952109d93e457b23bded5563d55e1433852e47ef8ab33cc725bbd8121e7dc7e509d0d6e5c89b9c59518d6084b20e373152756d8f797b263f12ef45acb0ac8d9bd0c906035e0fa31e7ab021c07b3532e834b9db9477551bdad8dbcd35b3c7cf1d717264da0689d799bebe62c03abd4d7fb5625aa78d2961c0fee6385630b6d5937435b713caf182f3a81fe92bf68dd01e5dd8b270c1df41180c774db62e61e7266279c655b22fea53bd3b7eaab88d03efb383ab961d5f030a8bf8d5feb5b04dfdc1a55a49c52c57e2877bebe587a52e173fcc0dc2a991efc002d099d5ce8b4e421c233b960bce13c88d45f7836bbd98c189199f9b6c5e4d5ff9675ee47fda341af85a31e58cfe652c5702692d6cbd8a131ad32aca6eac6412f825efd2d28545afdfb204de51a594366e1b0a8a938d4c35796376f6b7657dff88721348cf74ca2958937b2861a9e91059f6a243e71626502e2f4bc8506fe04e30b691ee7d8f0ab0ec65606cc4f4acdfa0fdf9ff703e608cc2a171e840b4d5287959326be4bf4f6a21907951836c25cecc97d66737ee4110bc20affd8f1aa4b5eac3be680ceadf82827c8f80a5fb9b02642b0222430f1205a413cfaf458b941c0b5cfd8cfef9031e949269a0328858a6f02346d99d871c9203e497a86beeee86648db680c1d50367e138d15a33faa2e0f8e668344b40a4e05ffad08d092afb1a7ebcb3eb5d642784f0d78d56af3bc2d805dc30da5720f51743bd420925290001e053ba76db90b79d49d8663bae3200b89e6d6874c811565e3495b4c2c9d2486212b894c94240fadc75a124b238c7a3a54c01d6a9a7fa0eddbceaef60fc0d1a669d55098b9a5c3967fb9c8f6256e2f5c996004422fbc266bd6224bc8cc7c2bd340890e064ebcbbc6663306ef40f6b3c4c04d27887cc53a626aeabe1ee30d97af6dbd3e3fe3e77cb0236c48b0f6c4ac1561edf3a7f2394163f29e8262d423b99d19f85d8fe9a47ae62fac2ac5c7368cc0d6d9054b2076dfd315a4155f102ce62efdb0d880f0823acb03a919a822eaba49c784b8cc980c6a523ca1f34e47a7b1c7817d5bbd78ff30f117b991d2aa5fc9329c779ac6c9687543effeb8dacb12b1194db4438fe379f1daf4742fcfcdf44dfdde3837a42529953aa830b26f1afc48769b0c2c92d08101fb225f4019fe469d1df53cfbff4bbe2ea8edee9c75c7d2fc7221db7340c0b2c5c429e17f2bcbc55b1589fc74229d94b601296eb3a94225519e5ab8b424247dc1e85391398fa70eec76f50d2cd8ab5bcff60357b4642a61dc4dae0a7bb78c409aba67e50bb02061e5a4ded5726bf561e0d9d4300b20e126e122b477167558b994dcbf537237b89cbb419fec0166fc557d3f446e2479f6d3249fd65520e82a376491d272e970efedf1bfc0c7465420851998bc888cd9ebf50b27bc4b377a61486eac39b9ee1636f41d81e9edbdbe229f2a78a505c0cb210b095caebfa6b6ae7b377e5d9f0c721e3d933a63c5d40f42f24441a67c5cb84693a3a156291b27623e337ad6a8a12f1638f73bc6e625b2323ceb963932bd4bcd1d6e882b2de1471d0007341d5d68a7af64be28abd52f5140cd84f8c5ff6ed01516ce939624b5903f7f174c9a23af665a4f5c635b095d672f2294bbd508fdffbf0e48363fa3e48d59f9e7f6e5a201f59757568e8d093c6e3deabf820f05c7153b626ff280221aa8fd0efdf5784efceff72b310c9a3b58d0fd6459ddac6c66db1ab1aa5af035b47d992ccdaaea80fc9ffa2980600b361f2a0e5df81165a3699bcd8a9bc218554e759ee1dba984ee8d8000e0a91b68800bf3b1062edfa3512bf1d44b98ea50e7452baebcac53fffe2c5aabcf2fa13a8fbba8a61b429aedec3a57cf733616428234fa292bb44cb426557a6b6398a3e9db8ac35dfbe7d5bddb2147ffa007e865ac9a8baead97e64a0d9559c04c58660efa15ce492683129bb46d3d154062d322cce23a9fb0abd30a0a68833ac8039a0241d943e839b8c3fffe6ac180d2fb590279a8917cd37475aca34b814b851ea27c6931aebb93dd7c631fc65fd2e6260c9d295a1ae69496608a6ebace72f1fe01c5d6db7943c375be5daefc727be877405b6283513d6265f63bd342e531ad464a86f1233e115725dc581279a3fc5853a6b59b90bf11cb87d92967504008057bef386ea56794bd5288dae0ca6ec4c46fa2445b2edee44e507bdb917f79769903624295de805e6470366e906b2d759b1fc570279a1b25497440eaf83cfc0de671464e1d3b02cefb23578bb7d88a7f7ae872d1678efe657b57dabff205422e5c49fda34b477976dfd07eaabd9ee052b25e4ce0b15a1325227fbbc31554e66898f20afac6805ed6810c1e54282ad99fffe5c6169ba7d3d4fd5036ace8c8433cfb0df0ad15722d7e9d3ab9006e08d0a7a21350fb6ce4db055a7e0dc5d2cbf32c10f24142aea96fdf62e0c14815b5501a477b7ff7cb9d7326d85d83c669dc70b669537f43f8728069a092e983b5ccf2586e62c5a42e2e46c9e5735af71466465c6285fd39898a29bda4c5745bb49c11f2757da4791b33b06f0053d5f07915ee8eab1e6d9be83ca63c0dfd043898cf49690b30aeff093a6a76b773974afe57c3dd919122d38b2690753aae1b92d8b3033c7e00579e7eaebf718957016f2aa870c9b462cf88e8b462e9b95d1cf2fb03c9ed6c8100efe21d3a0fe482c6b574948fc39227b6149782b81a189eaaf1862e27ec45176d6be9e26472576b39e662884b6ba944991f0dfdea76c6c727e7008e87b9a657df8aecaac9796084fd5a7b006e22683dcb00b2a28490428b267bd0c173e5feb6f9d570d2c3558e74538a349952786d97ee522c0d10f72a3f29089d5376f1bcb92ec3fd070cc73f9e0f1e15cf82de17d7458be09a1a0bdc77a215bcb10b6d7ed2f0ef0793e02f0286725e94ff89d3f570932666d60a5ed7a9143bc5669b99a398d2af2725f7fd65b21ff448c5d1fa84f849ba354d5c50ba6801d33de0c236c97f669cb219bec2d7a57a47979ef5a254d2cbafc26c9a91e3290d948cbbf9a55efb0f305f0b9f1fe6c523f108075f7bd394bb8f94b04f92e06069c83854bc65e2904ef27468335501b57f69208b99d79fb27bc222c4e5c440a2d916d7478518e2d3a85ba8abf612b6eb1f1867881f55f7b08ef002f6f7a66264cdd8d010de0eee39adf4526361c974da659743a96a77aa238791abd2efc9f42aaab6b92d41e84336c225081b00f9da08056e4b5c05acf56fe81f83f548af4469021909193b05a06f7796403f5e2444f850f5f51c6b66880a12f231ba9cb6f1a4667836413417842840a0814cc3c9543fead6c7672654c096aac22bbf56817a614a6cc751c77e4d15bfdc41cfec596623257948c8a0c83d7a1207d850008f4d34206f42a76faa899c47b2083542651956b365efbd75616d48eb3bde392540f8717ae82ede873cc8407aca5b19307cec5ef72522c21e80ce6788b693c72f46fabdcc7fe253b8a56796bb7da0f860f14d80832f885306d6df7a9d309f7698f1c28da78f13937e6505f39c44703f4e72bb8fb9ed96fcb8b41ee67b1267e3fcd1fe456eae293a430c120bafd75f6a4371b4b13e07c53bcea91b3fb4d4738bc587fc99b44599a4a0fb2a33388eb515fa6ec7b971d6997c933642eadd0f48da7d544bef0afdeb6f12c2ad0ef8d317aeddca72ece8029a5bb0ec347c462b5e5caef77aa9c53fa4f602e318f3535d0db1682544e012e43e35922b5e68a2a13a8eb4c1f77e85734cd60becfc84ca74fdaa240f9c279523fbb6d1842f34551953ed394440c1ce41599b9840d637d0c36e158bda0727b12a694bd9772563efec4104a70ee51802124193327f248108c0e5701a250465296ffd513484ef7bd5a26841888262e5b37e9b6955087604d4e5ea4659612264507d2e835d3ddbe098d45030483f38bf74decd8a9a6d3917b7bae2f4c42edfa9b8da834ebdf28946cbea9f6d7095e509a8cb6e835d2dec4e43a87627e4de9aa9d4f0721ff14355f2c16d8c359c46e658d1cce4c027bb0e2ceb46fa4c2600e1e93767a17371c0e0992bc5cd452592bb21824bc6ed84a52d18211f05ee223653fc529867e5d9cbb78e6d8bd8f8a739d2082cc09b57fe7cb7b487892f6a43df5f37a91b5be373f42967094815ec9b8cd95153e3c88bef923c66711dcd5d157c623fbd68e3f8eaaad49771632a8d6d0c2fa179fdd515e28629c290556633118e1b8911f996a2988047b458657d47a648438d11a7477281e91e4d47c88088b294d9882945fa5d27f4d13200d794c7d1c1c358bd48a62e180b886b19dfb2da83112ad165f67594f3792f951d31f77a79f91db8df8a67954f9dd690891363851d939dd97a539ef695ada1520ffd1bdbf96eb111eac5126482f0a772180c1934cc9c9124b915ecde88d2e4fd4b918868fa833be871812d184ca4697439125a461a8ca337c485d5d947a958fb72b7a3add7e70cc116671e0d1739ab1b8ece9d55a1f452870f5be0635c917bd0f7a814172bfaa2201bbf6bcf7d20caec6ba958dfed540d96fbe0a2f9222bcc125d1b5041614e9a8a2422acdbe8ea774b623b2331473c62ec3cbc842742b8d8341569de9902536463b20947bee4f70ecd04ec73165a0dc0fb34580a6a38f91ebab31c159aa9998e41380bd2f4ebf71fe5b645ceeb9058c648654bbc3e7f4d0e2aa8ba9bd2a19186a73882b4fa784b193a18cf9d2d749dd15851fff010803534e878cde7bd94cbdc0a3606845c1463891e8ef27458915d80af8cfd7c8cd6321198b5be7fd7fdb8fcfeb31fc7764ae0fe279b46daf9511832b278bc880ffbc4229fb214ca9e46d967d93236d4f58633d6c9c045478c4e4e861597c5c9166b8bf68220596e9cfabdbb3e25d4533640eca1998076308de370f92d7ca1a63cafd9fbc47304c240a3c655a21080b8d5257bfcfb7e422c8abb1fea7ea9c8a5ef333ea0fb1c9f6c15bca3c58994b48c4e8e523783fc4191ef3fbbf89d81a35eba903a948a9f91c2a8bfa69978f4f8340ef61fefb79ced1737dbc5a1ee96ea270b315e34f77e847c66276f3fd4e3b44692e725840ad2bd130129dd55067bd5957da10a00c63bdfefda7e6e2741d3814a76fc13a2f2302a1bb7a463a069832e306e69ce867b5a1ca3724f13fe3436e796278f6abb0227cca7e7d5e9128c6f2c7e79f62c448b4bb32dc9f4011310904fd0212b8b4abf3c1d3dfe28ee09d37288d60cc0a3b97a934be54e17b6048b72328ef05af5c08dff84448737d314f33fabedb373c563cdc33f608b249340f95f281911984abaf2c4aa620f6d38b250490e1bfa69f1c1f95e1635ed952966eea9a905116dfa98822de7fcf343af707f1137e74e2db95281c658cbf203f8d4d0042dd95c3675f7c0bdd5abdf5587bdd41ab1e62b399c940b8e8f9944db822941d13f1c6e9c5d4712d6ebc5201d5228f3d7f48f1e081c14db392334329645c2b8a35534d50a11050d2ba2ff61f5af1062db88489333a8438538ac1367cec43fb8fcf8b90c0a11c0240e83a11198ff228597d5a92726d1aeae1f92bd30ef7dfea730922f90170ff6ebf21660bb51b2cde08f7537466c18c4aa406fa84a62e39e1800c9fefdab4c17b998d394cbca7a711834ef697d7dfe13fe6dab5b00e3958c9fc008ad915166b1314533d3cf5da6ca713a9cb638d6e21b3ed9ce4be0cbf4488300d6c21783d041d7a9cfa432a5d828afe305b414f17548d03751018696806086459cb2eccd29480118ff7ca21d7f1a08c0d2d97e68283b56e8dc025ecdea52fe00f3268d87c24262255bc37a3f1c2d30765cace1b56b612760b7c4d5fc629e7eb55263766e4baf6f415d1f47853fc09b563b84fb43bf38e6518ccf888cb9b17ce5331033cb161d8d1f8bf6768a4a72ce02c818179db441081db398e319302a7d233da34238c1eb4ff260dfa3b8ccc23ceebaccb34dbb081147d4a7720c6667e3c1aa932e31dfb72c7c64314b8b571d6c7c6c297abe63fc76425881c1e0dcf8657322766440bfffb7100e91ca9c4a12d15e54a4ca7a2facbbafc79e3f21046a66aa3db360eff323545fe887cd4646110ff71cc51f0b7e8755d2aa7356676d2c6bc954e0b08a09d098be5a79b013bbb67cc92d1104ece12ae97d69a7b40e77cce962f064efc97475f8ae0cfe1faf1b61ac56fe0f0898f7e5cae28d81b490d4ba740998d65b08b39208b1487b6862f5a113231815968a13668eb49eb7f498d473702fc6bbaec257932d6ac57826c9db0355bff3cb3b5ad42bb96615b0d08127867248026b37a0d117fb3cec7ad75e2bf6c87029a67365aa83cf797ae2f4d42e720ed4c48ba21ea08ee6aa3609f69a6909fff6222dbb45172d255146e4ce1c59b48a7895936a86467664252a9c1109329b70c465d78f639a867fa0022cb8d449cc8985edf8fd82435d184032b79314f949af4d6d1a6c6bb50e22c8253161767f38908f4642c79d27a1679e06c309682d932ff3c08ceea7f742a34c2889447d5a77241726f7753163f1d660ef64f05d5fe65779d8a562b2c1b295ae949ade737c06a8a0189d72d968bce96b8513c47ef0d1da224dda8516a4ec6e51f1fc9bd34475b2ac938b4d0fd661150040361247a0d41caf68b2a24e314e91f8b90509375432c6af1077705f1d8cedb1a9625631b07b9353e1c466c3c757a4e5626aa2fa1bcc592a27b86921aeaed802392efce7c026d2b221663f0207962bba769405961ba0eea031e4a3f22a35687477d292b450645f6ca03e879352987aea7e078db5d46efb93d772bd6ae0cf138ade13a431e1c29dd5f6a3fcf238cd26e7e13bb7c3c675049770e921d692ba7da7e458adead4a012709d4cfba93aa2b45538a7203a72619e0da6ce5def80a5eb7e13281c49d9ab51defc800022d8c7b794ece0339458932c78e188ddf06b1ff15ff2f87bc94142d073ace3a6e9839a8539966d8e6bf9b8346ba9af3e93926733d00c4048f3abf512d116ee5c77db99c1b59da57d2bc61f4a4867b7ec33973a0770b79600539a30ad69d3169d583153d19b9b3eac4e5e56e2b1b429537afa0700b48d703e636c83e4b069e2f6053547595df78f885e22ed721a177a20b43b3ca40e06555fadc37d6d5733e9d30947e2bd6f3b1e9de5a4419cf3fa30c089cb6955ffbabbf09d0f7bbba0c971c0cef9c47251ee62494f5301a7d1e4d3bf663b0bbb0c032a7dabd10d342fb3315be0cb5b0ca87a013725cf9c47366fd979d3faa237b58817636498b08b7659aee0c92d1500d58661d3f37a7fdf83e3b88c4d9abb508eb2195e51c6f415f755211bf2af80e35b6c1aac22d43af55ce907635d8bb599ea0986aafdfc4668450e5e49f7b33d28ccb3822c4e7d3c1d33f83c9b6e5e2f7879f705f5c3a925e6c21dbd1732e898458bf53ee0d0d621bb8b99de910a82977091130dbb3d4e2135f0eba3e05ea030de2ba9a746546f5a54c63643e0bc897c16d1e61467d56bb6ca73f0c951b58a85372e3961d943a9647d96662316eee35befbed8a07826726518bdd583d7e1f803f5062ce5161924ce9a5ea1f2803c10a54faa733888ab02aaa5210279ef6e893b9c360ca7996f62073f916228c90ea1e6cb473e5305dd9cf5f45ff00204a5beaaa140513fbf90d18cd1d12f3c6de1079ef6f7a2667c2891d59acd36b2b441f8cf88c78304153803fdf59071a3cb5dc24c374e3819583681d7ecfb3f027aadd818d71e2a9b16bf69a92f51d1f58dcf626d20bd77b22661fd6b7f5c8187c453cd24f0b6a07b50b1833cc387b8b811d0587027b7e9e77345650ed673a6a92dde58628a439d1b4f98e11766c4ae61e3eb14f3d0eff71fab4b494066e306fd23a7fa5ff82768f16feff3c79d7b1b69908a4876a0a837c14b0e2a9ec50d2ada223b338bbee4aca42e214bdbbc1d9855943833771b831482dee8897855549ae6b6129454630dd08a26d749b2674e9dac6b7f9653a60325cae384d67bbc7bdfa96bd88d7879056d49d67c7dea1370a3e482bac1bac4aad40fd54d92074ec551789fc79f36656ddb39b97b78f1351643847694460b1bdcb7d840ad5ca9a0e3a8faee9a3a3cbc99c2f04c6eab4660b1e502b376a3d3003b49aaa24e96e147394ea6c4bafee9e32b8cf41bc085881ad610e5c5ec6b812628f1fd668bc13ca638aae2ae944ddc7d95c1bb841ba804c7f54fb43a6ffdc3d23849572a0f7c1a4284465528c0b762f06ae9cd21da836afc8209e46d6bdae9a8dbd83e59241808a09eb964bfcabc3bc01d6d9f717798192d2ec7fceb8aa3811ea5f7197074359644da7ca7d01cdcc5711fd5b90f9d56adde3e12744126c818b8095e7f0c6a5531a3d9f8850631998e9804ba8038966f77844271d0eadab91ee99856e58990e779421fc582ce9362f5894e74aba90d1324b3de5e996511071247b578d374626ccbb41e5c2795dcd998e96fac91bd5c1233f15431442c54228136e34cdf596965a75e4834f9f8585de71cdabab9022dcd13a166a257cd3eabea5bc44b5fa510629ab53fe8606290707eb83237a803dca44258682a4ab41b03cc0abaecdae3f1d4246d77df01613fb1ce3fe89bd53ef3484e9aeb21a36d83ba94e859b9d7a2784ac2cb62813380a0723408806fd7000c29a6cd6230e8760340d MD = 6be720da8b47b9ff169100d51bc971bc9cf9968cfd305c6bc4b34f9fb233b3dfd4dd0eb59def8f329fb60a32be902dc8aa3aeeb8dd7c1896d0e0bc30ac1a007e Len = 57256 Msg = 3a37e46306ac3e6aee3cf25d279bf920946f6c383af99a8af4f8576567ca97c339d53bcc7e252a9c7356a4466fb5d31916a2a322d039d4f17a314ea05b03b412594f3b796c7cbd1b54a00955879f7ee06e96d853d07a49e98ffccc8592b0b6f3026f8d71b9fa1e6ef7dfca9157a121fd0213b2d4230520f99b22791bf519c4ef9cfbd9bc4be4761dc6de8e03c802e4f93ce1d9acaf2282aa066cfe6a6c86078d8fbcc6630c85ecb12764feb1c00cf05b83c7f6e35e189783389f037ae03ea655437afd6de324a9b18438c2a528056dab3e8eb1821731860c99862f54378acacf21fd26e2b708d4a5442381e7e9368372d7feb18fc1b378cd92e82bff5bb29b848f0ce8cb727a9615cfede37de9e75836b5df9f1546e7944f898c9e8332fe40fbf671eb2ffbc2178a8d5e92711260178240f922198d150319e73b31e9a6b5e2bcbff2d8163a287e8ce63d33cb4be8e6dbe014e3a57e85ecb315bd8c389e21a8505058578817f4f4a1425471917bc8edcbfdf789c0017e78a679da56780188bb3e136a0f8e7a6da0530969f1cd8c4956d9ff6bbd73fe4acf797d5a38b1b933420e6ef2a92f4bdcab29a3455e8665b1468e4e3827c55d2f18b48804d9ecad6a6649cbb6cc7472893cab78b05ec5ee48e77052266ebe06767ce001a1e231c5754f7691802163d7bc7c62f07299910f58610974fc3b66e266228452f9fa86e99b241d2816500763bd92d57452b9f2b027dce11a8435c6d7493228e2d4caf501250ec6f8400065fcd3a78d6a1963f0b9fe7f7eae8405e5ce65d65419faf985f55b34fa69c8d9878b48e3103c8f41941225726a96c552cbb00434915f33303ead85bf40e3758574f9626de8507cfbe5a4e4de2d3c0fc581636c74661c46172912ebd621ce0ea9342c6a6e9c10a839eb5583eb4d062a060ed1e5bf5cb8fc554d0ad5a224925cf0d00ea70db5e3dba2af0e49c0545eddbc7ae0b93dfa9b1d93b37e8a4ad19727ff4f866373ba30dcde38b88086caabf18fce7a2e15c82e7178615753f7b0453681b97be4c7336174968f396e6435542f2911868e704ed7bfad617b78d14a05531c16d77432a9dd6b72ba7b5b831fc35c2f4bec1f7515ffd1d9bbd441ff263d44786f8159dca30c8919c364910a0f5f434c84942a4da40f6da57549f5aacc57d23ecb61dbeca9569534b1de57228e90ab26c566f61f836d5cb999c1def9c5b9c516335f448b4323596a8dd0f4f323be5b65154acd143b8365bc2e26421598cde5a7ae63dae0fadb9b645e21b1a456511cb27d28f55453b852573d5f6a25cdf9fa9a4455e71455e624c92cbbd65eafb1b6b504e8b7065373ea31cd549e52eda7cb96fd1db14eddacbc420085ab48b747f115b2725b52c31ef4f3e6ed26c47f3e2144e2a381b718962a77e167778bf579957a8fae29612c203944901249a20b26c44cfad09e77900a380fd749844ef1b0698ea484695b16e181cdd4ab501419c67c554e8a52b5cd71acb3ea1318ba345536f6f8dd626807c99335b9a0834432881107e4bae39955344f0a23ad7cf745cec45d939f5dae8940392548d92a57ddd34a0cc6499a4cb2b9e9bd8900f82cac85db697eb4a25823ae3945883e8d78a310f009fc1dbff66c6a427324f2d381f2e043c2c002798c5e7b5c3c81b8f4cd0ba5cba98c209abe09ae21d5fd6c571f9e49c31161732a72c00f6ab33b2da67e9dfba391803872cd13ec508a1b57ca2e382725fe6aeefc34d3d22b51bf87ecb4e17a406cdf4f914b128e953b879975d549e22f30e25a39f71f2d67bf14ac0e97608a6ae0b24c3d5f8cfbb990471ca03d58e2aa50d1a127e62b86e5a44286544ea194e8950017bf310b9b843065c6938eed8e5d0540aa0e267f466ea952fb05022cfe8335d1985fea16d6bdc4e88195ef905012f8355d38e2a3d6ca764bf56bda8a3203652eb764b236142ef3d934ef88ca8f8fd1bba2ec40209cc1b2355bccff429630cf1d5c18b0f1bd9d663fc7ea8222b49d37d76171687c021a0518157198dc94d11ba96fc10dd239d3c52221cc05212504d293821083426f9f19fd0aa2cee193b0f1d7d8a8f05ef098b78b2cdd384d4b8c4bf6ed11b9f74b1693eb24a7c9d8fb93f7b17f15821f4bb3e480cf6744318efd4a088bbc3125fd481eeb4ac7b0493343d83e4c4feb9cb0eef50cf2b05152571e76d242581453effd6004644babbca5883a8628a0525d880f92347d01863a0cb8785bfb2f890a88fd013e5b7be4bab829c692f94edfeb3cdf620259a20b701793f7ac9f87b9d1300faaa1159f80cad4f02369a9a2bccd32260e7d6cdb097cde779ccb14a9cc304ffd03367bffaa7561a3f9131ee40e8bd4ac3dad9ff4a8e7cb2c0fc244dde9af4d8db30475e38842c70bf299425c00ae8938989bdb340f374479f799156b38d793886313ec9242b96ff0b402fb52b7bdb894c74e06e567f7b328fd56719ae22f87b5ba6cc6550162bf1ae756330d5e40cb8671ce094dd7ac7fffc8033fb30f4092de6116ed74edc62050349ed1d61bbf29d73e24cdb488e010c701a767fee6901dc9ff1947372d6cfb5c43e1bdf516c33a4fd8573964a11ace474f4bd0c390a98e3f3d7ebee5eadcb604bb27dfb279d366b5e46f34a44be321495bf6644a35134e08c34c39c84b9fbb1144781f54697815d30d75a8bbaec27193ccb00adafb54c6ec388b9f26793c704a88dd65251039af6ff8707cf2f13f26ef4b81aabd0df65db34444da489b3b3f792c5d996b969e9c52506898913de2a82380722d3991817a24907ed176da258f64db01a36f232f4444bb66e4e0b9345ff7128a7997b07b8709c4416cf85e81c7d43bd06b79dd75100ce17048268ebcb435aad2771f916eeb28889593154ed75191f4d2d9d1eff766746c91acade3020da3ef500f185de10e4982832e16d2b09463af0fd6be7f3daf4201cef8bbe18fd30b8a0e2acc3b5d58365d1225431492f81214904889b6d0543f4a311499afea6f332214ae81546931b6bf4b60e43908e565ca5c197bbb37bb33efc1e88f779b47e360688580cf8d01905134c8416c97c3267a7b2fdab7fa4ee698865ce45e2bc5e5ec149511d551308dbad843a2d3c9fa1bcbf674eed1a2741fec8959e28e2150006d20c87b8e3e2675a23cba4e9625f20d66d4ce0132b694a893d1c5cf2f054ffb8b92040821db4b10b36a168ede3314c3f21d275901be184736668af468602c9fef7433feb7b0082593693daad37cc60718d9663f674367c57d518e9962b94eb441cd3ca67746c37eea4119ea9c87719f801173fb8ccce9e90f99bb0645981d0228a607488a24e5e161fb919562dc7e54d1cd36d597e1067d9546f782388501504d067c2c17d3d7179f9d8cf54c0453eeb3139715b00a2647b6612c566309626758f5839947d900e84d32f45083865a35d0ed7e0201d0b1111bf141cbefaba810f07c04d942c0c71b13bfb0ef2eeafaf1cd62d3e5afba0fa16bfe1e2704f43b11bda1e7322f0f967a984ea81a76b99ae9557a7e06e551a8bf4f91abb2c96b8432696e14ed364fd4cb85e6c419837aa4e60e3e67adc91be5356fb0d0b66798e93d99eb73518107e8d78190ec337cb57fb0a0b5762283a22cca726675790603d3f8f71feda835bf3c66355308b189f3930fb4e894ac3c6ee64501b88244cc35ab2d2b1268387d003740493700dbd4ba48cbf2dda7951c057c6fc3b0df5fe4b5d7a2ddcccd4b7f50412c6444bcf9829506ab019e98234af1541061557412740bc120b4560527633ac2f32e832453be0935788a33509fefbad8f082af29a5a5c0cf6e58b7f7145243225d51fb2131aea03dfa34a2b65132e66fd6cfc7e75f9e5b6b5672f78a5c74f5ca3272b499da7ae186f9a8f5b1803cff808befa4948a8864fc9eaa1fa846f0d7203a3cb776974b54783d8d342b75348d75d88b4e1a6c8a63ea0fa7353819ee718d3d540b9eb049827c8d8c650b794316b5834bce5f4dcde19c711244211e984c7a0265b8fb6d9bf2f8b34d9239d29124a854d62b4d7778667c8c92514d9d14ef4d5215c773156a2c567577c29cc8453eb615d56dcb31b478f127d066a3dd8ae270f50c3ff0f2ddb9fc9cb2fe1ea588ed478cef9dc0c2a9a1630c738a0b2823ae49b3f328594a1d2054f0a84da6af81b7c382cdc216737e683a0124c66dc406da4254728b966651e9c438feb71d30592792c017e4b48c5c55dfcf8b21b1fa5deec19f306f8e8ea29db63e5f44696e37c21c0b740b82556af1b83e4fa3c0124d73305dd6dc2b0a38c391c871fd73b24412ca2e8c406815d1c32e151954805400f0f6560bda54213ae3bd9fdce92343a79e02ef088a4e16b854aa1e903dda089eed7b527872f11cd086a28b4910626b89ee2d1890f21c9e482a921f5d65b6754ef22719c5abeb432433a853607b1670128bb46fcb7fbaf6a8cf4fe127d4fde439886272998e28de5b7237c1c831289b69fcfdbd6239106602cb4a2c9793959d873694279c219135a0cbb79b2a3a8134b7c972c9fc2807357ba4eac755a968e85f8525fe776e0e9019c790aa2d9f0783237b7a5d425585ad3de4967c081e5d0de9fc7dc0d27d8836eeed2ab67a67a4cfd6997c3fdcc773147012b81158fb5b534f2304355454e57048c5ed87b89a3f62f8abe2387186bab33bb7b74fef474c04b6822324a6fd0f864fd842e49041c082b0391310a99b40d2c75afbfe720a176648a240567080ecc02aad8f96aa630e7826cc778f2e0defb93c83ece68c4ca4c22d0ac59459e3666502cd3d66ad08138c83eb767da5e4aeafc1bbf2cee316db5f8d4218a4093064bffebeb5194238b605ef1f78a1b92964fd7e8875801f6fa4878fd3a34e296fcd14470a5e7a10fcdf2d91efe5c410e3fbec9c75ddc2e960e7805b44cc5c61a68bad04389f50c05b764a92e325ae521a5ac24307925de9f08c931a1dfd9458df85d25ed1e262f95e64a51983a02728d669c79ac8fc19c6277b08f4e79dc0b721a3cb7d5c8e79640c8f864f58bff73a201045ca3f83bd280d9c27102814a62575cddf88610b5da86de0345ce9e8e52fff3782faf49013b9abd737976bc90f4be1eb57a769c0d66e893ff967be84bbaf7cc6c7537089e11e081582b03526c2d070e57b04fb17ac5e69951b9860fc3f649ea55cfd3ad8f0022c3c4e841092895e27a393c49f77a61f14c8e31856b63af36dbd891fdae3080b2036e43b83752a9a100ee712dd488e5a92c2990f281c7307f1f496e2d914f0e1ebe98cfc17386e2e320cbf143ef32ab6ec6985a55f95b4463333ca6dbed2722d953f8eef52411dc2958662f249de43dc29a7ef008288c3583a636fe911845497271f313dbff9fffd426519d58772a07351631e4b195f69e60e6acb7d5b945fc6a870be0ee3c8db88408f2ce57e170b246d855bacad816e98b832265222695b63201c7d8948177b0a97eee349b8364a9783f4ee4bc5569a153fa1ca8ff16b1015980ab6d7754ca52c5069852abd3526739e9a1f51e946b506aba1fe5d4d0246851622b11ff2d1229672e75caf137e6761c35e36e6a1b98612051909e4c096c45ba54cb58a480cbaef0552ae014477d508fc287a317617d6e254f0344bd18f533e4a700c40fe6734e01291c447d88a371150e0345befc86d1da010c7bb0955bbd60f76fc689c485a109f8ce6aa551e5723c86fac8b9534136cf1600a5bee50c4ccfb46ce2baa19f228b72b5c52459afbe76abb2aeaeec4907750c844540ae935c816c9cab0b141c5cf5f566d662f68ec0440adf6a084deabe5c430bfcde586d87169e5372039289baea1f5620e9ceff223522d57d4dfec2d5f5680c1ef05917370fb835fa2c8363c6c84f083741397d4eca62497af8554df8c0da093e1f470cf6cd58c885fe8d36fb2102f18bd1cc85c064678fc5800808615f1797dcc3a8db40efde6fb7e2067fd284e9a69143fea501a3a13cff7d8d6eda10af1c6d85d4eeafe7d7b0028f85aaf75451abe9f056579cf88db57b693c0dbd961f1b82ce71d38e35d31de85f9144b42fe955e86f5a29fce3abadebbbba41764fd6299f160616766a3f2dfbcaafe99367ff492f298078abf5897aa2ed7ec6aece62ab24e4e813f2e59a549f6947e63fad220a20b74fd0148e859043870ff9c1625334b6c3be788e48632655a3dfd6f35ff00d6f813edce14f4ea34010d45758cc163ac73aefa0a2f33807b112fe486900c7b75e2fd3db7c9833182b03626bdf6c2a41c8a30228db86779d342f29970b3037bc9f0b85785109e16366d740a3bfb31dde5d948c7d8262a04b4160c86f545ebe7184bcea100904c8197624d59b84415f64d897e51b422840968b50711ddefcda6ab1ac785eff2955aeeb44b7bfc7976d69dc25a29e9547e7135466ba4ef58b0a2ca8629691bdd8189838ef6d9cf415c671cab65b53f631f2264f1bea6f4289cc2bdb77eb74dfa19f79e16d5d9f944d090146d265e7ef870053ce08a7fb5099aeecbd44dd64bf1648a877470e4412bd939cb2f258c6dba770207385696f7a1b00e3d051f2edd696a2b85d14f63709e804a8a1aeba8d5523e020b24ab558598e90b5b747b27cd0a34c3e255fbbc4e44ccac9956ff187e67cdeb92ca102326974acb6d46e929e27dc938e427fb59a3c6c545400ae94630a22aa7e2520d68a146dd37bba6f19ce36a3274d470d7a037cb73fec75f3298b3ab5f1c43e52a8dbf4ca9378dba1ce89978755dfa5718fbd2fcdfc0757c6178ce297434ffabf0f84852b6b42aaaf175cc509cdd9d0545d13b0110719489fe4d4bc46fd55dcbe61204ff0d94db9ff9ac439aaedb06a1e6893b810efa6ab0927ff0255ae9a46d9543bafcb5c1e8c1baf3c8fdb43e7e54838d9a25e2444017a47686f43c571dbb83f434f0b6219937beb32121b5f04b46a544209493365de6bc99d4d81e0710da3a8b3884199e352a8d5517afb9d8b59ed316947629b70b466252a47a07e1c4f542728f60e51f06c1ad3f724fc9de0685966bc075adb1905f1f09bc82ffcd8332210f012b228b5225a8dbfaa8ebea842275ab6a37260b35587a24e5970fb393b961cc558dd8cc627d0690776329e4799ef83e5b649cad4259fc0ce7613d7b3db38910553010c97ef24dc5b0278bb42b20a78d5ba5177fff8c2b298a8a930dc9482242c7b9d26aeeac07e46e9d1843e3d10bfe32a2a068b31792e396b719517f9fb3cc74d32497f9d2bb54796dd877e8d8abfaa7023e53a822b6a3d292d630a7e1c41524241038e88cf27d993ed339845e0fea836dfa2524d621cf07c3d2908835de859e549d35030433c796b81272fd8bc0348e8ddbc7705a5ad1fdf2155b6bc48884ac0cd376925f069a37849c089c8645429007e921d4d7e90f7cc6a87798b64a7a14f4bbe4ddc8f35e454a79e5a978267a51862c1b977557f34ce792ce5732accf9fb35c652c65837b89b1b2ef6c88ec4698b0ad9e035b2ae334fedb46f06037eb15f2bfe2c65e3d59c8624e102cdf1e0d2f2d73905eb2ed49feb38cc9aa6972373e58ea44f4dcaa60cd05552f33a44436dca686dbf1a1258c70adab3ecf75e519e28ee771fe0750f95f41d033c700e72b68c3ef6504515c145395438ca5ab19fac83bbe532c06b98a45bec606311b8e539b2bb518dfea19496e12599d75349543b90875d1c5026d7d48253f8fb91cc1163c87e0dac993e5938bcdf7588638e15a7d9c16d21322f238301e43b6a62c08dc157e79950c74475a706d24a522de86a9dca1a8405c8fd225c550db634272ec0decb98630eeb6c706e69be96c8f4e0b969ebc3402e97095aace640e7ed317f4118adf1293b881edffb5ff4d9516b1f88b8a97c10002eec1311501e5efa242a951b79922a6b1fc42ada5405809ff2fd6ef69da5722ef31e02160d0669ef71c91333a8fc05123504d797e0712ae92ef2c2a032dfe50f76079e278799b741acd3620dd68f37c54a496c907fb846d171a82a42036bf7263a315dc25a38c57527c208166cdc40f8d21a60609c5b52fd5d761c488a0a1707b243b772ef64030e851d5bc9e6539f216ef04994d0cadda154f4ff40211ad328708731b5d1cbfe82475df3b4dd95d0d373538e8987975571fa9d69c5831eaa0cf7a463078ba11654e10c6643bd03548381ccb5db5b4148f3b0e7e2250aa60a39ba03a1e487b3f91ae4910a12ff3cb8c60cb445f6a649269b1a6ceefb321172132a2d94d95044f538c494759f3ea26bff96a2b558131f8ccc8984e6b48411803dda9ab2527004c922f38f2f34d5c4ecb492309a9c0c54da2c90d86fed9af6a32e4dd370fc5153b38e03d9ad906f14c96991c65c2f0c599d2fc2cff112c1615958f65057139eb262ce780c672e652270a307dc708d9dce444a91e400a0b1c221325699db4492b14568c2afe26b427e70e586fb7e342b037e0180ad1533c699896f0138841be7d0e9e1763cb5d3a179589571abebbf4e9998e91193b5287a67f0536894d7f5f881beccf52b37f3ecb376576a563f8b83013365b730571b67bdf4740f374d5f6f54328fd2040f489ebd889fd382f02542dacc0bf3fb7178f8fc146567a85ad496b8e3ae9f4fa25e31e7ddd34fda94290876c1405a6daabdc8b2ce9c046096e2293050adbf76878130c30496219591e36e65b1a75cff59763162918c57e887f4715af811b511256e35ef8b5d1b7c7ff0cf482bb56e29042edd9bfbbae4a884a80989585f029802819bcde09c7fd7c4edc56e8ddf2093314417cf6bbc3d3933697c4bdffa4a73b547ecde82d8d13ff716cb795698f6a677529a6d6fe4c4130ab524331d87df5ca44da3a20096b22d8d284bd9248762db3cd6bff686d91bce8117bbaf9f6c438b55ef5aa8e86a85290d7ee10e660ef7ba084d030b3f0da6b41d1d8d41b43c09b850c96c6398a8ecaaeea7159999b417cb50220e1bf706e76c5513237a1a6bb43c1b5873629fe63b3ba72d440b4e0b6577ab023b995d39606fcfa508b9206fb5bf1c08ea166cb70343cd7e06c3e16943577f4a0613c039a436d34fc79f74dc9099d9774b0f9d7fd76bd805d863f27243d35376181bce6c254a068fca8d7626d754ea1000ae90c52a1c5d71335c0faae983be22cc01e6655611dfc19c23a2d2fc98b46fc573e51b6dcda43c922c7777a6d115bcac6696a9d946d5a1b6c2996572addee2e41008d734f862c49f55f86cfe5400c033ca5d9e01317e8ca50aa852cc2cb01606e38aacf2350fa59558d0ff7284f5b9ecadb9d6706a310ee16c8e2f7b9dde75886ee8f1380c016c2ea5bfa385dc6b26517129d7a9699394e66889500379b09df322824868d5fe64b5dd02fdbac2e781ecc52c161ea82cab3e6f4868f638ecdbc1af0517273b4d3be56f497273e0d159290a3f1632ce62de541139eec653d9cb9e54dfe1d594846e27cd018663beef1890c0e15c9814bc9ac1dedc35f6630df9c3b4813d068a1a57e786b9bdecb5674cbe89a15dc133b06d0238bde2f8ef0fc2ec6e778d3c849595bf1ce09d914cf061fcb50d9e10a3d4c18faf4d8a504045d372b34166ea0c8cb4190ff489d41e00f4e5d364a238eda034d4a309709f1f4687f1537d3e918a462f7fd0842727812f72147574ee9c5989337bd4805a37c4987cd2af7988b5a678547dff0dda2e1eb265d31b8ce7ada02659ef94309bace8a21ea127c4e9e8b989ef7dfc00374a6f504cdc263b31ff39ddf4aa6298a970e3f9d9f76cedb68d6c014d0a47f9b2fecb8fa38a35fe32039f36a036d03728365f165b2fef6293261664f9ad7358d1cdebb6e657cb448c5d38b6f90f6d8a8c4fb27e0eb51fb1e435412b71d1febc183a186c91df46bc956e9ed54bae8b014a2f769761418e5a4e5d84db42025a81eac60a17428b38a4d1aa5a28349eb939e67813f8ff3fabca25e159dae6d90748ede4195d54e621cbe5a2d316205a98a2e59c3329352a089fff7328d0dca0957f9626ce85657a926035ea9225bb5c79cacc2e2c9eaf7b154a5f857a23900385a45810a255e0a2fb2046e42fed423f0d200e8098dfdaad6237ba9ae669ad7c4845b8043d154309dc7a9d21f4b3715ca3212145e043235b70069515c60981656de23 MD = 2e232557233b61c0aba3bf10b0cbbfb953974c8931e639b6efafbac76320ddd47100ab406ce17e216463658ec43bf0ec8acc2bc3d076ce08283477c5f6149ff2 Len = 58048 Msg = 0728c948567a5850603cb2a1917ac5406ff16c6ad071441d4a85bbdaec5669aa2bcda45f1ff84e1cf0aff2178b770f9e99a6b458b1c84dcecc42bd29fa35ad3d54a523c732db56f39e07c122082a76e93b33b55d8f68bd8e6008e251c02fe04369f96f0af5ea17de528e4649705ca02a3ce09600d21a3a65ee2151d9a40baac15211afafd2ef3ae4f48aaa142bd5356986f580cae2a46c5c5fd333491093b5c1f7350c3f30b0660e6c44140ba15ddeac00ba9a4128cefd7a9967b02a6b8da64a40adae4177f74463a204adb73abc43fd92770def0a6292c88525ef031dc2286515c0bc3d0e8a7ceb7e129c9f5fb90b632473005cf126d64c0b54195c8efae1195eb85ebc5f31b5aee9b50a4b761edee79ef79c0e46e46e10143d55bd26fd796e03dbbe45d1b697b5c9361f44e9b1668fe84b088f6f62051c8629ccaf4d92996cec720160cce0cc0708dd02111e3b4865ebb76d67d66941764b5ea6b96b83e91c01c45295b876f9ac8cf2dc3a7f832f718d83f31ce1c0ca2849250a64e89610852b1bd76dfe41c9ad3fbdd4487253c1bab7f6c138fa31493a6ac520372c94b7af50bdb86f0409e111078613c26171a64852590043888266b2948811ba9f4485a359f31e243395ece0ce94c130b3a6872344f4d7c3f37cc89ab1b40575a97023682f053112f3af90227b30051ad0ba0c54770f6f42a2e718f9a89223f1b3de3806b83b18c3ad1d75e0f6a207092075dce2d1f2f047ff8bfdd8616a94b523576d86deddfcbfc7a844222732f0850b9fa0d53ce5815b712f203ec484804963a36aef8832048cab18a5eef628e814f9ffff359f2f4a05609d2833b9270e36d98ad6499e8359b4bf353f4e4bcb1640525ea20be11974cd349bbec0289c6603efd4599d071822bf6dc7bb490e64a3907e84305eeceb273b56f28aebf92cb1380c489cf2ad3988331c95c0e7273bb68ce5395237a7ed8ad82c6a33be141c175e97b04750772eb39a3368f7317e9878bdef45b09dfa66c62b1fca624161b7bffcfad202bf4d3eca7b1c08082efbc311aa056ff198cda002bc98dcbe7bc944d29a9c76734817b3f55f3e3d9ae78703a8dc8d80be3008e16714fd66f074320a77c0e56645f2bdd35ecd01cf556208a265d9f141be6e94721dbab7319f348652d7f73d691ec628e72a4dcd85e3a968e6712b97779a59579b4b362f0574c4ab6419c60c46a7ca3e3684670a28e9c48d18f459e9edf9fa3aa31a11cca9172b8b8867b6bac68708e80a92a4208012b9617f15ec4d6a845725d4b1d2f5e72f710c06e64eafb166880fa97c8b78550392ca65fd6b2db5e37a017439011485649f1825c01654cfee51995c6ba5786f6757b210d45ef097bd6bb4ccd927904c60bb962f1d960fe7c56a706b87788996e40e00c9c14efed8ba302824bacbd104c8d06d6a245749c393de7a1ef78e149122c19cd8ecc2bf4083d343c403753f7547e3871ffee06b2901b2a1bde46f7f29ca776d857e429b96c05ceff3ddad426683fecb95d2b9dbe2b6f0cb8f75a1332684395d189f56faa418d113fa70fc42a124282116c96b03b65ba0e2ddd3ae9950f70e53d876874430343c9721e3e9a7ecd36a71e80b7d4a6c98c8cdef251e186eccfe380f2c5ce103bca462b05efdd91038cba354bf7717ce1472740d9477174aab11f203e85e39e557125eef0bbe40d5fa53a0a20ee2d4a278a5bf7f484300aa3a506afcd313b49ead8d722610b64402c10a4e1a1f44e8b16b6a968c68093a5724c288441505bbf5671d869c956d4e6137f996041b28bbc396c8e17e1c522d190f6f3522d5bcb4b32dca839ac36ac4b8022760a72913b5a0a1c7889b8ea541b7a46057dd3bbf09a0a69d4f68c13510d0ca9c954c728f3e0f336f732ce38adefb8a9cd7be719620847b9dd34eb856987138611b3b1d23bed9f4c98b7846896cab692b9e0d9cc9632754d3f794d055c662f37ddcbc53589dc68edcb6c9dd2b5390eb169312e7e03851d745a48130bb016da4f8bf173cb4439ea6b0dd65d0f7fb72b6649d14786409c9affdc05e0110b058f3dbab93ffc11829e74ee9954876cd19721da65d77dd3d58820334736ada3dec872d8a79c507852ff6bdc0a16d2e2f4cc84a95330dd13cc6f95de90894a30ff109f64311b50df0777e054cd166a98ad55ff252df62ca6edbbb15c665a7f28e2f203ebea3f85bc2ca252f736d5c6f477ae11dc4a89d4f3b5e7133b2d2ca50226e750ee377b57964f093421fbc7606cc04f3d3d5d8e6e90b19c2bd979625443375b06d9ad515f03cb171463707ddf8833a3f1d6cb6671e46d257bd5cfae156290d7864cb044046b4d56744a396b8cdd2e66d02718945795452d73ae946260e6cfe75fa5e4d5d0633231c424bb1300b23ce258bcd9aab7f9d61eb3d26c21bf5641050373bf894b52064394b17a06d3cddbb0ebf6631bfba8ac63bcdfbb5e9927a0ab1234a4d0fdde5606564efaa96e76876d0a62595a9b1814b6ef25069b76d14b63fc77493f305e9df4997bb19d3952cc41448f21092ecebb62cb40d24ae0f9cdaa32a9f146bb694a98deb63334ecd917082aeb6e8a2f431d01f1c1a2ff6ff783f8554b4169c774e85d869cf412c17ff40c1df57660050b961ed315fd2b6c512ad8b4e9ce2b1d07f3dd217e78a98fbdefe7ae3bfd2d588ed313efcc45417ead0ec601f3dc0d0498f9724ff9458b802967054c3d47448253407bb8332ff40f51cc3aacf81f7226be75c7629bcf1b4b38f5ff886809382aef5ad0bd08f19596e5dfb12674fd1cebded546f9b489eb59731920d34aa79aaab9ae9d7ebc5eb8cdefa5c3fee8e94fcc80a46b85f21a7e334e5d33cd63a6ce9a48a84c7dababdffcc5daeda6c2889d612a6fbf97d2d54651511e82d7217b567222d4682a758d7dac0edb98aea04f881252a3cd9fb56ed64bf1f9a87132b9c4bacebf6b15a858046421245f86e0a292889fccf00e383b907bc75b1f2be5d68becb2c5efbf92b016bdb3419cb032263f1c4867c173d9c0177927df5187d9563e7065844098e31a27012bbfeacae34f004602f0dc60f880ddbcc9d2e9e57bbd3efe5d77182207fab7d7010bc437928168ae55e48b46331255cef3f232f55b801fdf011ad0fb8fd64bc7c991b376be61eabd97df78a407e912285ca9d717d72353ab06fbf585d931553bebfe3318c57508ec6f3e0efaf57985416a6640cd9d2b7cdac5771041729056abeeadbd8e561f35c3328cc8cb6a4841a283a40a971c0cedf6c3289bceea77d2a0583ccd57ded513ca9848209604d9b9d45f0f9f04b25c3987969d027ebf5c5ba1af07ecf5de4b057af6fcc0db23b2605f42f568871e7de1f5a620eee15fb2543859bb96f8b2c59d5cd517040b6546c7abe60201aebf0679d97870bb875a2e5edcfea455d11af94dd8b92374b7381b72329e91f4dbf26a639b93f8e2e11d04cdf7f47e940f753a897729ae9d6f1ab4d28bf331bcaf773e31c47f161f8f36ea3421d196ec04302df2c09d14e8839b877b208a6dc389bbe656dc9074abd2365323d31c89d86ffa37fc4d8a02d0a52927de98baa2940b1ef7555c8e81225a79b41f944bc3c3a321ed186686d5003441fa7f4d0a8cc8a43ed5bfccbfc81da89fa189edd5c1384e55b1d9b40a17d1c18493dfb5f068bbd58a25f895aab5e81d169ff538512ec0a1f41ab2be9a57dfdd5f68628c12e2f81f9f5c925fd5d73c585cf3d40c3468d77e8bac25de9e0184d8310cba17d8680802dcee0f73d7a864baf161b8e1f5ebf7148aeab59cab915b52b7e548e1b78455ffc15ed28a16a60be5625e16521c34aa04803af48139a3edcd3286918236b48c96eb238dfb295c9c483e4d7ec52ddf6aeefa214524dea596b86f652671ec74f648c8e0945f66488053d3b444c39148b404673229eff102f0949d056a294f323d85d8fa882f73d672b8c1272ac5fd1d001535e2355b176885f269ebff10b598ccee99e5cbd3d892cdb7851a7354a7a8e96204c5d9eec832c142448d37d0d6051ee39a46f1e4eb1a0bf0ae02c0f84798daab52319a2369fe2d14bb6db6e21703cdf548727ceb41b8b7f49a74961953495e318cd9f881a32733ea4d11eecd0f1134a4231cdf5f731b5c33e8f455303156ee9533037791da4a802367fe61ea04b9fd60c88a8ba9d5ae532ef7e6a0f5882df656e36299dc95e47c60aa9792c1be7a82cb976024630fde574665dfeba1be5b2ff6fc6bc1ba5c618312638203fc92bf6f351e221c138847b32ab154a7fd5a5ad5e60c73a1c3945e5ec9412237f318050d4ddb34e523b567014c48c96840d2a992b4823e9c70e44749e5c21ca13db4f7f7764d3d121c3db8bc1bbac2af14bdc3d0d30c11245ab298ef0844b5d234ffe4c83ee29f257577b96e2985c4def182363ad1f89fcbd985dfb8a167a23d916f77ca1849df91c809e571e618348a6fa67d1b21d63f1585e4983131995655bb7a0da782c172d97c4ac981e200b633d7b1050c53337373e8454ee3496846bd1ba632db1f07fd8f1ae0d1f89dcdbe6dc2386a88e67ed179692e50394942f7d64a8a73cf3d8bd4051c329b4089edb19ad7931a1b4c36dd98811668bdc1b7ee33b07d3d0e7ebbaade08d6921436df344d5057a03e04f9fc53e883e4fb33459e4806251b134315c69c693332de1510bae7f4fc795b9126c23dd7fd514c2e5a8ca583e88a783b28cbb2a5df09f8b520ba0d1e08120e814ba3a907e93a5b03853dbed25e07a7c7733ea34740940e879db62f33f116c145d73537d0ee0c926354260679ec1f1c687373f0e5fe4d8a1cd643c0ef4dd41e6f67db6ccb62447cce35da0ee3293d60aea8202dda6eb2f5d568c764a884f6706e6c2aba6ffc7e8494a8de5a867beefefa9fa7bccd2850cc51d3c57ce82cea51b35287a337031744672b875c0c8aa051ecb89f1006a193880295d28c36ac1c5cdeb996a9a91cab36a64c7995cdac0df3e5816aea4f6117c3783d53250c9928dc611fcc404eafb6c5e27a399a5276647f85988f8defed49e92318eba9e25a8c6abaf38d198042a69c9c332bdc2360503f4d5c918d60bca66383d6e0bd5096b3827cb37d67f66c17054415e4ddb8f06dcd9d4c056b6a45b9ed2ae5f6c1cfa43aae06fe01ee098264aa7a80e901abbcf9a505e55f9a352ef0c078d48249b8298e57ea21bf0e423c3bf69002acfa541ca05007c704bc79cee7a80e1107c7b28d2b2aa6dd093b28efe9642519952a4a95ee49235f9924a0ac0aee5b2a1bce47459d70cd6e75074614199dca44561407cf201ad92d8175424cd70dd09e22cfdef961c4be8496f4f25f38edc001544a040f022fa99f6220b737e8a10edbb13ef20ef4b0fa8dc386d617b3eed6ef142ee80bf10205439fa9a7e39c2276614bbe190cd2a022089f2f69d4371b5f5c1a54fc1c793c8cb8ae927cd67e2ca7cd56afcc59983ca5739e71261b2eedc9d6db3ed8d70729a05d235dbe971b0a038e7696849b91c0f55d25de736307f0b6edeb5f06b22773d0af727dd59bdf552a130004ca497bd7a233d9da0a325eaea71faf280e445685ae2e30756a5b57887bf9976d05c9930b2c863ef6331f9f820adaab4c37f410e98967c1d6d56c003e89b0a151efb293c604c2b9a58661571562ad741e4c47e31a02cacb04bf3455c1d3c6c235b09aea82cb87ce8a9cddf1d33f167e3093b659919af590a1704ae4ccdaba5e9b20c903dbd13401f7bebc0c4600944df5b6d5c0dac246d71fa12629ba0ee9faf498e36c3bc655e88f94a212d847a548001e1cc570195cf2e1ca4c911400f40bd48160a02d0b6be6b48716821484d810d231f1e3dbf096789a4424b765215725ad82d73c1a20f481093e8ff685489b1cdebb0b8888f891dc9ba74509181091ccf2159d9cada77e4be00384cca4f36ce097f1b0400181cd93888c3402b72f226654a25a4e31ff77abfb7e8b90fe15dbf0a07e8686c03ca831c33b6830cd0d877617b163dd51996f259e180acfeb3056c15aca04e95f79b03bee6d681fc41c4f90edeb60a67715c34d5a6888f606d36bd7595ca1d449d984166c7a9a3c36dbc93b3988c7463cf51287b2d89c9fdb7f89a70ecee3d3f9dc8265cfeb94f28fecb2d97d420e48fda7eb7929f0bc29d3754eb50d694164e9e3498e7b48eeef599f6b003b8fbc0b53beac7642394e2089851985b7d45103b48e2805011aee9f0e847023f6ca4719b9a9d4137e2ae910580f889da098893cd44dcc7e03ca3a6e293c50c9319a3600a9da00e5404e0375e9850a714a2e607cb3a2a53dc5ef58f924278b647e781f4c9effa1403b0b23cd98761d8536ee6d4fed1d20e8f9e2a0bca9c69e9a2fdc594a236b33d8b0ead083ff53305dd9810622eb2dedf4025cc8150499f8bed84f7aa5b1bd47036475803578ccf17fc46ec19228555ad361a635bedf2228571a3a09dbd4564954a833c96ebf13cf4f5a10362a4f14062baa67500693ffbc0738347d5905d6b9310e9df27c1cf828613d0dca37a9ea6e514f18cd88cd731233e4b74ba9c0af254d0a2cb20a3ccaab39dfbff456d358f1e8c222f4b1e63cc951924afb4a8f5ffbfd2d588e75790ba65da4cf5b1455e04f56a62e7c1e68ad5004b36812b7ec59dbc5dab9ce6a5c4bd8313e9454ecac00b52f5d83aa2adf5534b1da87187e423d133ba4c91835710b8f591fa7783c404af1d76adb2563b4b4e5ed7a30830a3b7a50c32dfef28331bb5a399a814bafad1f53e3508d7455835cf21c14ecc8e8328202f0b8d3c3c038ebb75761aa35a35d0e79d7a1230d8cc5bdc7c22d247094b1f4a858d7d02278d10d3536e7aaccb3da98c238df245755e6480574456010ac5432cf402d8c8509a4a0425cbedb774da03ecb6b5d19e86d8f9c09a6d0381f7b73dcd65b0c51721f1e456d3d39d4dbfd486103f3cd7c47100c1a62de6014f3aeab436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926516deedbf76d58a1d57e63065438d8fdaac1d482f694797c8c81e3e78df55e32bc7cd6e68c848f897e6416c2a99d77be9a5fb0d15f4f6661df87d7006dde10d89c6a5f4c54440cdc258b4449dcac56fa54e0229f8ff6cd140552ba883c36b6de994073537634386275fcd6e513edde7c804c1132ae11185ea7ea76c82583ba0d5c05f9451bdd7be213beb5db76e9770bc5ac67d4e328ae076d58f1084e4f832d8dc1d9686ac53e26aad9c7762f278a6ecb070bca56c4f7d7fea31590df217906d47dfb058c76e7f4e056f6fd632f7d6e3b65e55f306c5b9603d3c8a70182045fd7404763a878e0155d3c29b73d8abad3bdceddda99a9420b23f1f496dbf98c024112a5cce7518f51ca9348ede2bfa765f84bdb82b80214ff070480a6970e79b5b8fbfd86718b5e6fcf643ae87d56aeeb95e3c7a1b6ff393a5714541c5a493341e40437da6dadb43913b6e9ed34d8362f3b9f897dba281a84ba2a58434f33226e6f343b100340f8753f913c472fcca6f79385095eed061da5d84c74629b53af03fe94f1705dcb94ecfafd1b3c97ba680c45a0308e7720ab645a8590c0693140ca3c2a4142a0d6ef66ed036e16942ae336f8f5e4547ffe2d8ae8da94a6df563f89ce0014cdf7ea71abc0aa1d1b4da57f3c548e0ef72d2909df2955685c254912095f1e505a888e82821afb1194ebb2a4e8037297c0aa28a92bc6fdf42a64922312958adf317b4a8ab4a3fc30c895daba00aaa965f71e83733666da2158c4bad86c184ea79af9a6f10a04b7630174a4294df43c62e4b1c3d1c8b2f5d52d6c489bde917292dd2a2b1f49e5349385b0985a97863274ce896f2aa85255f9f285c4d331a8fc874135607d3ced7aa69e703eb3a60b9385ffd10fe59fed0276f036b7e72d04f66d0f42cd71aac5918691dc1f9d4129677cbdaf2c6c752b05326ca8a8419a4e672e907bfb645a158119a91ec2813288b741514b4d26f2b66517b1021f48402d58b1090671bf158452492d5bafc53fd18abc03cefa7bdd332a0c066da464e74ad0dec50bb7e8a3ba0dfc64be6fd331ace9d51a60bbd3004d5df8b211c0fd564cd79d0bb35649cc60ba1c976c8911cfc0db74e028199621aa05c5fe15fa7b56dc75d62225d548581e5f900f9085e9e3b668819b4f9b2c09f22a5a32a2db47afa2b371538abc4f0e9b06401150ecc2333598e494fccafe80ced49f96dfeac729459856e60a94c5b780b614e8d4450389e6748513582c724ee60c7c71f5af648b6e2d6e23cce4121b7478f4db451816ab71034c5f8b4bf13ae1d9d90d0bb2869fc4799f51f9349d022053c831cbee62617d4e22c2bcafe40d67449eb04a7c962bf084d2bab80dd0342b4f78338d4d4f75b25bed8214deb18f2254b3a3da94faf89956f0a432f512783e74ec29b4c045adba3497e8ba62c288b711002ee2821cce68f8df588f76cc9801cb0d5b67ccacd33ae1063cd6c37dc0d1836e988acf63750571891ef618645a1b5bc110cffbecaddd6824c692874cff16b3e32bfc0236b417c9d43d8f624387352cf19114d46d0448d3d7cd1438960c2ea8482d5da3ff544608aaff83dcd1e7f64786275ddf989f262a099b845dc2b0c26a86e7d83a251e3c37f2aafa0e764107b36618d2a5d3481d73a1760b7f3ab37a0283a1925010d79e5e94871b819b5e0f787bac9dad87c5d5b887a7d12565ddfd7729a3b66c274a178377de0fbca607b79fab2de37f1ddff800a376fdd7abf5f4d15f346a17d43e4db085f7fe470102a72fe0e1cfa4fb5e2b54dd2ab71e74c506190c9dd6d87f7ae8eca5190fab12178630011286a38b0a18bb1d0d29802813dc561a2724378ec79140bf8e6a6f4310fdabf606330434ab673d4b6578872fa81d90701779bc6aedf0b2bc9c381bfbb4b3a6a705fc505d08c0e24f7bcfbbf24c72cff6b800f07bb4ac4d828ca138a1ca512cfc59090e70eac9b3119754a3d7c6831c9451de5a29e46d16faa6cc4d9f1b7e42dd4983c6d4192db779012fc747e0f77e32293e83dd44dd170c31e2e25c6fe3f2321c9201f15d92f6700089afab6077feb88946f1fd9da257a1770a7f408d2743e31b5d452f7ea179dcdd8ae4690faaa30eb91e2ef3b764de9fbe6dadb33ff33ed88e0d1df6430147a7e159edebb539751d01efc2255accb5f04f32f31d4befe9f9bdc90eae755a68b7511f52971acb7ccba9e133fd4e81e37a7282dae67ac24e2fefbaa2bfdc56e5f678039cd70509c101f81b0be15a2c70276e85e976941575606d086091409bc54a9d2e5212409a4ba837c6d13b487565dd8d62a836618f647580dad08c69d1109d07c7fcaf912822a6af090e72de03c98615429f8ca9d925576e587b191fa1cfd6fff72218c1584fe5a50d49eee57fa4094f4c57e1339ac0ec7face89e29b309ddcde64db498d4d94b64f90a172490fe4e83a9579ec87b3b1efdfb9f8550aec69ab9bb04ebdd44c8c233f6da5565dfe03df98027293024a0d42e7029345c3a0ef50b9fd0255a4f2531592c3f106e1451bef8fa50ec333cf7f65c300d151500ead60ab938cad59ef77f1fc2c3b008d65ab9c93f594d986c466bcd66d38e42a86125ff32c44217d94696cde1ee9dfbcd0216b576cab6295b971dc9380409adda7cca3231fcf6e8a71a5dabb0473f0fa251bd02c82c8eacb1f1f39ace27ed1c3d42adebdf694c0fb07cbc005856ff0cfd4f96f85c053dea185dd58751c4a25879bbb6726392ad569d739b1600a343b985058ae15be02bab36e1abd7e964902937efce0ee6ff82831608e233d1b774dfe37a7f03ec42c0b7b3885dd3bd8e1f561fe7db099039315fc24279a0f319fb46bfb65ea838b564d53857d4c3f6cab7a9d8aac6a988c724b24a2949a58d513eb6bfc2101666c07fcf6d58f6efbba0c0e80b407837f731c14455c53889c7e8a7f78ea57c959fec796bf992ac9e3599a2dc5fb2d8fa040072dc8c1f2f96ca659dd0d267896f0bbfba72850ddf198c3cc54d7d07cd3cd8bb9e44973e1712be50870b341121ead1c3aaabb8d275a9e71191030c4741439aeaac421d2ad646cb32cf6e5baa2b501a80b1e03be858946ea16fc5b57a1b597316069fc6ec567a1791dcc2f03a8ee70d7d38d7b5576e224b73c55c20a943c48bc613223c8b7df6cdf816ce9aca34f8d342a559cf28a19da310fc91f4dca0cc09823b95240f350113ece55c026004ca9357622e3162d74ba1fe7d2ad9191cbb16d2e6be298165e411f7b132cf07 MD = 3844eff6b7cc4eb3daab90181ccb8947842e8c702858e59089f96dd95600b866ae647f9cd9213d726b4fca636e6166a2088e2be0c27154c28732faf360e30e8a Len = 58840 Msg = 7caec9d15fb000b65233a196a792aa486deec990e7d172e53d112e7770f8367093a1407a39a599822af874bc5a0d82e81b41c2d391769b2066fe2848c0bcd3e07085251b6dccdc8f807f3e3c402caeca41687d12897102e04312edf7b8c7d8567a221fbae26df264bd91a81c43375676492ca154b70ad0ac3b15268c3f636e5b1940d76182d0028a4af65a664a75a4759955d6a203892d0db6ce7a0d3fd6bd76b5a6f417343d35878d76fb223c2fbe4e9babc6035535408a1c0692849f69ec2fb61d1fe5e0fbb3e5f0d8335603adcc89b5f6177f955732abd68515f84764230e856d00d16e53a32bdae6ac0c8637f7af51fd711eab372af84a13ac721e0f8c9c885e3ee6c78d2de2b3660b4bad156647d6897de97f1d51fae178fff90eb14c6028b78229d1f17b91e221fb1c608e43d9ac62e2e7f951cf38037bb595ff948ee2cd4273a475c6b2c0d1df228587ebb3ed3b504920021acb3a19e6764ed7fe78abe0c5ba5e9c56fdf8e76828910a75e00cea1b5a9d80c26d89897fec2d7f383242c709fe5f2ce782bf8c83b645d171f2bd238abc655d8fdfacbd0fbd39df8ae52fecd6e8b00fc269a028fa74abc52a11894e6618807fca462b1b5d917bdf3bb9fbb5f420582b2fdb20239309cacce763f7d17715f7d0bacd8f0d3311f96895d52d8c2a4d5f6a7500c9e6171eaacfef138f15855cd136a9995ffa57e4bd60de624dd84117ceb2deff22d74d5a54b78b47d9825894169bddd5234a92b3cfb15f87e4010228acedb000b35fff66cf6a03285e81b766cfe69fa76464ac263541606d796f32250102342d05e7f3e923d29fdda5786c7a03ff3737a8b26de4f9fa293b94899cb9d5d9b2ac9fd5f28c59d6a78e36d03d77baceedae7a9b9d9623c2011abdb9078a315a72a50992c4f7785d62659af2f306fc3a09345f8703e3b98332327d673a401c6dbb41cc8731d188511987584456ced22dd2f0e1de6874c52402aa5bf9fe849ffad7a76f1b01c29299141ff8302d78438f910b870994f04e8dbaabe0d81bfec1e90c017ab5fb749c1d9b53031d42ab58468fadd96e4f005da6a15c926c59558a22a37476bfe98cb1c5f64b00735b10183b11fc6076614cf95701e6fc1d8031028de32aeaa091b5d6796c307799414e8b566223a389917b2a882070a354573c3213164b5ec0bb951521462af0f9bc0eb980c9482b10a836f82148231177a71b219a82fe5a8731d475a5cd60f4fa93f8ab9f8d947e716f246c0abf27cdf03879d70b716c675dba1bffed46fb0a0490b3689cf72e2616abee8d2bcda35f25d2fc5d4f29bd0caa1d12b9e1fc22bb7f79e8f8604f3eab65273b646cbcbf50803d4cba4cf318d2d62360ad6a36fe8ed3173e64d2ddee93c8aab4f7b6d2a526674012f6ec16a5404994ade36e3bb70b69325eb3d9e86468a6fb0150ef597a6c44a5f61a16dc8ede6b38a361d65474baa792efed5fbac8b167e3c977019769a77e329f2db28bf834a5d6e8318bc95d24f6fe9a1b4b9943f7722ab472d2d597617db0b637a76c0dcb5d38245b74e29cd0bf3f074385cefdc131986c4b4c5a2f21a9e6e241dfc7f52afc2400e578e75646681ddd70f4a01d970bf4960a567057706a9ecc5141e4d8d9eb6323d9811fb60f5b60c5a78259cb016808ddb5d75d37d5289e1c72b50add6191bd373e76d3e1b2fed066f216403188b09ae656b96af9d84baf79a923822c4955f9e11d3e4b02b7bb356958989c74b34c735cf4e3dfc2013b998b007395ee19a1e1cb7dc3cf3fa7f95675e2f1b6bf0ba25be5983d04bdd96024fb7e8d884b5adc3b9d66eca7c0091ffc339607d638171b1a2949af200fe72318712b5aa66a936dd0fee1a11aae6597ef4a7ec343075f1f77d20f217de3b3ea3c9410c036744cbe6897f4ca713144c8f763a20d47556b173b85f27b615fc61e590d34a87f900d36cb10aa50f5702c1adc2608ce284ac4692eecfba515aba7283783a0fbcae75f3dc0100819eb94a8f5653abaec2f0df17f18af3187e1f0de6e9e9f5a9f5fa1c93b103f180e9ec43dc15c48c051a4c77ac0c1769d0a0c56f45a56096c7e86e5d4988347e117552975e687f720e3cf9fe893f1e84514e00470532668dd7f87db06bde1cd6b1d57ebd7ccaef0e48cf7bec1626fad338ea323dac0d865b689a9acea10f27cbf06ed31ebdc9bdb1433664b9094046e6f619edabb0b32a7fe86368005fa7ef9e4bc5f233a7c155fb6c0626fda9178d3ff7319529a9bfdd7bd5d747ee1e44cefe225f5eb4b15e324d41a345229c09383edae5cb2ffd8009cfcf6accf05342504c22bf7aea610ced3752b241b048b1c2741f9ae23722a059fc239259af954d1e08bb5ac97d4d39e14a2da79f3f459dd66013b59cd7cf9d287170e290846aa182c45aa5dcb5cc81b8e620f7d0180939ce9375ea3d7a4ad31fd035dfe4173a0c290f8f45275c6560ceabdb2766e309f2257ea49d56a73aee7a98f0eed6c089c96b3ad7ad3bb9be43bcfbbacad618ce6375923e436ad7065bf32c2093eb28d085d3e6c2428c562dc6ee665e36a031dd0a297e91710c923388041a536393a8b4bdfd83bda98bca3a56ed7c240f57b6ac62db844caa9e51490f17d3e7d262d8acde42a24846cc8e7a70349daab95f2fb2e9e653ce54b2accd6dc8f97c74cb210f634dc2e0aed10b44af4e4b60d93905971be45da503cc0d270071eb8faf4f2a72e9695615460bd95f60b515d4c377c0bf8550125f4c4ceaec83ad3a7006614d6ddd4fdc64b10f60f130e38d752c9df992a2b4026b72d7ce9443f566ebfea41266bb4bd64d544e4ac09c6402d0591e08c6e07abe382bdf40a4edd4e1521c8a11d40ff7d44db43aff340fb12664fd7a86b2eb3e9663ebe5b994ddb63a20d475b45c47ce46c46567e6c2175568a17e25ebed1f5a3b7d176dc1ea9023e1f6ab0982660f59be6fcc579a012fbb3a245fb2b0ebf9681dc252e9c22c91a8793224b7f467a304abae7d8ca167c57d1b5c06a37e15f5e2adf202dc62d17ebe5071c60392f7cf798eeeed79656c84f59cb7277a9c21b1447c7acbd80c5fa3c01824037ed69cc102d8cf80908e95cacf3ec426aaa365a827f9db024f274dad6830c7618c47ad443b29befb74556a2354621188a61c7856e7b6813ab46c1208212ada64ae6ecfa5acf24ba29782500b4fb71dc20f7fc02a1e330bf9aa1343206566eb8167a47a81b2b2e41a7c7dfe0efb9e57674935d3ae35efe9b392d56792af95694c4a81145506fc16c795a0ba9b02984cfce5e7395fb94d98fcf12ae5db8a06e239c9ad439bf42e523e65a31c3bdf356cd7680c57cb32ec983a678c54776f5bd4be57517eb314da34e37efda96debe6359b320dc55d1d4d65f0486219d2ea04bf5e96463c56d3802d5b5408d8add32b45ccf663e891e2d090b32644cc8a649200aee8d3f2e3daa0ba0a576d20781f850bc107b758162e26970783bce31a79745703d18338e674bc59752b8317591b83f63bf8709a4659afe741d332d3ff832c1111e2ec74eb4c438a3032f333cd6198a3723b18059eefed1006b73f35963c39cd3d8f784d4ecbd6caaff035fc418c438228622640ac7b6e9fda824a7e9aef2dea0b59af189d7dd6a958f5b3d751e61510b2e023c1eb6694f511d6dd256a266905ffb3f97d53ccd394dfb5f56b8b297ded9647891fd84bf09e61277fb0807c8baf8f310fc21e535e1b98b3931f39a0ee57670acea0ff96221a2cf69aa67a5bf6252e532aad398bb6bc0870e57909f6f71c99ac7cfbbdcf79e6f9b6c68db43f4925719d029551e0ade4c36094ef5896287ba2af1c86cf7298934c0a8bbccab0e51eed610ff0d3fc84244e14fa08c208e313167515e87109de9d984442ea2a3b6a8ff661ab665c29e9f8fd00bd4bb2c9c76169b101875f0fec645306946c5f4949d730f17d6c37133fe174b6373ec74335f510c557f9e5ff229620b3e8d9d664f3b301a2fe591123066c39a7f0486c1fcf2cb0249196a242119175fec8a93c090871fcf896d366e3ce07b04880ff1db9f396ac714714209359e4c729ac50dccfe8b28754ef51a4d007327d2a61d948ac33c17a2dd0c8cd4d3c0e98e71c77450424e3455a506a5772327b04d00b5d9961002bbdacc74b14ea588d7f99917311503d829b8b7273fb34e04fcbabf5f27c630933cb80b301a3f53fdfcfb393daae3ea32f1e4ace050ca2913f4640aa3e7e3c8f78484bfc82e6f852741de79c249819f637222abb940855b5b80920a0a7fb58336798613c454a5e20f8ee8822d75b9c97396b9dc3b77aa8de4898be71b5804065905052dadf6ab12bccc637c069551106b43f368ed5e0166b7f598c85fda98fc680f4b350b7b47be36e1958fd613121e52631677575b548fdbae01d55c6d390b697e9e54644b428e86b7c7e12356c49830dd6b3002d769af589a0e389c7aaedb663c47b142ce6329b335409d78c62f290d993abc753b096f37a30716a767c01566308d762c6c7438c5424ae95acb1a77f27fcb4338edfc777fb0339a039e37617242bac8ab8d3b62c5c82bed53cd4f2ae67765ecd4570a6e38a8dbe93a85db66915a15d146998250baae2cd3ea3494ebf26951dfd0dffbfd6b75472ed48673cdcb60e5b985f80fa9acdc95c0a868b2621d3dd845b4ef96cb1ffebf8f5708c93d283c73a8f012aa16a439aede13d171366fdb404609eea4815c2b8b344d73a35fb1d707c5104f1d3fa8afbe55b5d8980ff02bd1095644edc62ae4f2463d2ecadb6d17e8386c182fcbc3250f4d16e3f197a916d5b72358394392113dedb0a3065865e5602a8cd3a763fa84e7edbc5c4273a1829277f994509f9b9ab5502d391e7e9f2ab5c3f9ea4eae57b28f5d31a9544ee05951725e5ffa834e679f983c58dcf725cc302a3ac3ec55e1984fc6fd34efce6f815acfdd21fe97b16146ec65680668ffb51988d7c849ffa01e6e50a663da9b55e4f5b7fb432582cf6ef17531d1657c33cbb804595f2c559d2d3622b6a0df5e9a686a52422b37edad77e75b27fcc1d9cbf854c747f25efedfabed65b552c4bf47f700c73942fc7f556571c5d04fe227ce2237f829e8a8a36e82dc4029e052656378013f68f03be1ce1ed7dbb2338f0f4533a7c088a9d0ec53984bdc9cb451f9f6d2b3e1589ebeba208c61c7571192383712ed47ea9d9e8095d782609535892209ef5fd690b24bb3549657ae474fb14caca751b4da2cdc083c25c8f59dcbc289a2b64c459896ab74702300bb0857b5f0adda1a2fddbe502b516c67c33bdec3d6cc0fc457f9b0a6a47f1da513248f65ce409392e27dbbc392db93a5f1f7d655b08ce20d343a6a03eb866b8ee123618b8e70bafff3418bfee5e282cba8591c40bfec177003e32b8cf38ff5034b8b34edd84237aa8ab196c6cb6f21200fea164cacf39735ed7d5a0761a1a34c79e66f5552c0f2dbd05644e6ec8858ee4f312d401fa948a4198f613de0c55db094bb7c89a7f1d4daecb7fe24f1380f7b8fb6c9e6bf171305afa1a7f616020b78c493c2517dddc3ee075d2a4a82842e11f80253043544e09fd93b94f9ab6095ed30f5a9777d8da86049ce321e46769df6b29c3163283998bbbde6901048e7e354016999c14e086c78d9947c69e6154472e40ccdcb41fc21a18329030195a0ddf85e77faf99856f57ee03772f209690bcfb6db8e0428976599548d559539926c2070a834e505802dba853d7a83587bdb535190dbd584114beb5899ee94ddc576135f83af4e3b8dfb74f130fee27b529a48ddb31e07fe73badeb6d537c62842e41a5291d4fbe28546f34b9765d819f632f481cdbe623dc49cbb97c996f3c3109f7d715809b6a371f880bcfb172dda7089a0666523aeea0cd8ca22fe74e255378e84e562b7452658f8636ce37ca968c78993b403b5b3ac54565380fb3a5c87c09877d637477112422ee482d7fc1468031917922fdc392ca3fe9ed8484e2901b2a79d6b5d1f020f37824b275fff35852d2072287200071101b8f3536e1a116a15a23fcd5ea9c0c740dcdf8204edd5654c88ed9f5389e604766c9919f404dc6af270a524c24c73df6424e9bc4d2ebcb06838d01f5bdf9ead0b02d951627651ab50fb17970f6fe202ac42b1fcc32ab20f8a1863cf106af7b3c762fb2341d739d2372add4ecf7cd6d61e1e7f6bec497f29b810eed8fc92b9bfb37447b8178f5c8aafe53e7289da1703c5a19b3153f4eaa8fc08b862a7c0ab78d52104386f068279c114832bc6f16d32a6b14c757d91bd315ee80a94985a9687374f7ccbcea3734774a0f5a00d29a00bcb37dc5ff48abe6fe5982c9657ca4293e1e7f597bed0f69dd16fd9fae6ea77353b1c91183f45b607990066916c767745d9d2b8c7c6f5d523de6a7a60d99cbb59fe46b4c8e62c6ca4820900ad60c8fd4529f60d816f78d680a5791ffb6fa7341e1d9f8c9671a5aaeca9994111b9269b3ad93d3bed3fc2c25c2e850ff32f73aa2d9f0e63ab691a3687159972e602fa1bccef8e8c35c03b60617f74936fa268e52d8c7a7f2f56f2d91ecef2db53c0ab43a475d0467e7a4b7a35a230f3974eefacc7eccd2949be955b59dd8ac4817da1dc6a72edb2f3f45bd6809f9f7794bd6ec9a3c8eea9212b6b84df494b7597c044adc6efcc18b9b6d13eeb7cab678e774f026827c547e024dc1c591a1c35be12fc805ef355c0fb4817771d433b0aac02f820be123a4bae3250ea6e59e44e1efa311bdd8670f1df33934cbffc36a917e8d3eb4f9035fcb2db2fb7c70d8d06de004b47e9b005f58dfeaf8479ad868cf7b1462ac0a99ea415aae14b0b3efea627acb2cc2a7afc122e31d2e6f26012fb73e3bba7bc655d89fe24ce6ee3f41f752087ce724aeb3d91ea54633cd31cc23eb3089928e9cd5af396d35ee8f738d8bdf2180801ee0cb1bae8f0cc4cc3ea7e9ce0a74876efe87e2c053efa80ee1111c4c4e7c640c0e33ed4518c74df6bd12e5f2249305977bfaf7b72ed08007188b2d4bf7d71f8687bcd294cb1c3bc73d9bacda075b9982958d6270569f22e27a4a3330a6172f18ed947ff02e621ad820a0a2f83b34bfdacbddc79e8391ed2b96dcc29cf1b2ff3d907929f9bb3f678406d07ccf28b4e4ea9f6a7b940e5f6b6ceeb1600333412c6f10c98513ea0aae6570997ee16862a54c709212f38f6e0a10f2767fe603382317ff03f5c1336a5bf6ce6a3db172b47d7af003122f5f3465a2328a96d7ea0e7fe2bbb710a43fc50cb2a0d14dc1c030d9f08e2bedca2648faab4f6c293b404a8f39c7615a1f67b11d13685d0394d95e5737bb8b2a365d12359679a9cb92be62fd97b29136a5339519b3b56c13ad369351cb089f4c066c36a2fe61b1d260bcee3776fda53ad83c079efdf89ce27d60766634e5d6c7bcec2ccf4d9812f247b442c972193bcb2ae98ef96ca25de477df8e10efe3d021bc554b16fe7d5b9f9a3d172ff385b38c0fa471d58a532dbe3f1c30de5672f9eea72038169b91ea2eeacfc1d785d3baf20925769fc18b9ac435af051b2323e282efe56a4aaf764d44bbe4e95ca3839071b9c503d4ccac039afdf07173b066f883091d582fa48af3658004e43bd706029f741b8000e64526a6fa891c6498ccca638510983215408b05d9b848d19aeb5fdfca8191a0b8d7427cade16c5a46b5c6a8d697910e6c4762aa1b778dca599426b74fafaf30bee30580aa91c7e144c27bd79ffae8f1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b68c2f5458c40fded975557524dc97d998c0cefd277cb772bd4c1b263b1d0cc824e508bc837a78fe3b119d86557e288740582eac3f559b4c22873891208a5c23c4bd96ea21aa697b67324c869ccfecbe7f9c8b7814f932bea0abfd4a7ec1135c12705a7bd7d669ecda61b2f48f244cf582f865ef3cda2640c404d9a0aa63cac79aa7e3dffa80e2b9212a915e912dd1b307063e500b7aee78e93c4e3237e4dafcc9be93852e2c7c76c7e74833473f038d88407569254de3ddacbcdb7dabb6cc622c4f1a19d75b9f9c3b32480115fa6acb6331bb890ed5bed56b00f1f17a7c37ae3eb3c7fc8a70b49007a6215681c270134454714e1ca4d7f6c093322c288775277d972dabac1e63f8999d64921f39abeb98132716f33db7b83a0e0c9c3a7b3d746563cba5d0a7164c7d82724242c276cacb085d721702d6a023bbf1b024c9d8fb92a422898ccd53f2201fdae590ff892779ae74fdfc86cd453a3772067bf5d04361c2b2b534d395903da02f0a9e432b8810701df9185c03fdda0b1e0db471cbe26f59fcc76d7c638d02ddcf1faf2006732bf7b921fed503508fa1564442d0244f27d4812eab0a366f3c033b936828825f289fc6d7249453d3c784ab38cba361d007ccb059520fa6bd25bb05143dcf27d292f2c7a70e0c6e0e1e3f9d59933e1d4babad3ad6071f0cdd7c8fac00b4867f43f77b4c002fcfca45f03c9d355e32aee87fe061333e9af1668ceba0e740e0f149c2a3c4711e30f141fa063b4a6113af5ce120c3ef7d25fcdef34984468751164a9106b1883de26b587826e8076043871f9bc8e369272277bd3c33b69cec6956cccf0ea3a423569110070933fac054de86fc53404ee1230a77c434c858d4ac5b56e9360b5343001aff3347afa305ca1e498f5a5aff2f9a2d9527c72a18f46c7c6f8c2769243171617c694cab9ea515becdc138a3f8571a49abd3556c3bb05c327d043d4d85631cfd2e3592c82c22ca489a3e98abd91c05e702538a0f6f9cee26160de218f54c75567b04b475fa034a341553d4e30fd2ff9e6f24bf73f31e84bfb0f5d06bf2721d05e9731c4576cb2819f5ad87da0b1069d818c3703a84b9c287d44862a71b6876740fed44a720eee65281a82c015948d71cb5bc36d3830329e70692336ade94142934ffd82b96e307866fe02bf98900c9e4bc8b9ddf7c6f2d75be5fad179a8968ae2f172133374c0e1e06c2221308cca4b8939dffaeef623fbc620d4a4dfdbd067b24cfca7e909e5c91ecda88fe67110a10e17ff6d24a90f3139827856e66a35008dc862e3e113e958a98a5db0c12526c861cbdfdda1c5fca23d73b090963d0e7efacd6e71257b12b50809092dc99154e70abb48f36e333376595b42faf83da20882c3e6f9bd2aa909c3b474ad069de2279251015792dcfcd416a2f73b13503bc7ab129322af07f57b63f265d9813217af80f4d4b015a79ee4fbb097fcf05f1fe300223d9505f940346f2aa65941363ca85c0b87a7007b63d090edeae495539783065cabfac7ead05c6fc6fdd44e939939af00e3e35a4291bd5dc2b79c0c12ebcf4726a7f8fbc1ef1aeb2d33f2b12f768bff3ab00d2be371d5eb95c8cb5d8663f04ae9f737ab66e3966cc7105c71f41bc5d721b6cc7c464b40c1cfe31a8e95470e970e6460dec0f4f979fc5bba96c8cf10bc1dbcc95453672667d9d131a929de50b7fbb61b9db96c6b9b34deb32995dc9438968cabbbf20cae66195ab7b52971df311ab50fef38911359d75ff030428878d2f4ec1bb90b840045f94555bb7d48e38dd229e5dc26ad1a3b4da719b6b71ce5139fa5c1578615458ce05cb2c20dab83548ad9446c6906a7c9fe7ed5c0dcdf0281007f449c4b08a5c4366577d2c1e2e70dac8ed5a8eae4e38c53abcc58991bf8a67d414d9142a5477462294bf3813438409f1040979191f60bb2f8a785d616ee0a7fb5833c54335424ce70d72e35eb9e75cb272c41475407ce842b0e507b1a0d336fa18fa767fcf35ce102c28ac54d4035989b41aff2743e5e320da8bf706d7cabb3ce18da64464da503a6b51019a347076e3328e87b3ac44222661edd9d5764fab504c7db345a8a869c2658c71934da74b5b889f4cbeec102befe17afea22eda6db0a44b4bd80d188144852b7ae4a2203d5f30bdcc9d85c276d9c3c3f40143e398faa366de9ff4a31d4d54ce8be2b473c36a957a75c3fbe38960a35948577803b38aa450c9f211e0c4294ed63322070a740a5155d6e6d0fbda30ea9b6a391da323dd31a9bc72c759ec74fde2ff371c5cd5caeec07e6a8763ffb7141ae80ab75a808ed5d2148697671ccccc654e8666f35f08b84acab391b4506faa483060c792400c0b6a70c204a0cb7d44edbf847966766058654a76827572c737a3d1bfe0d2f8d13cb34fa9918f7f12f1ecb0d5b61ec24e49a07c17cc2fdd5a26de5a9c7595017b047d0fa1b09bbe3a5dd2c0eebf94b94f067cee1bf13c0695123 MD = 6064b25061c48d401846b922a6f28cf06001e0e9210a759b66b4cc6315b18a0bac5667e3edd91563ea3dc002c732d1b93857ffbee08e12939971704348edad9e Len = 59632 Msg = 929548adf1febc8414d7aa90ac20dffd8090094f57e4bf541878c256301483943408e5f4c77b43f2bf00b5dc836a8f41b7e22ba71c36e97cb174734f1fb8464053426eb56dcb904fd9192e1dbbd2270f918e7dad142f5b085e7557f152cdf46a396a6b5aa997ab85ab4c9eba1cffae4e54bc88ca06781fe167a3f4a593fc96fa2ca9644a44879a7a7dbf8c1d6e9a2ce84996d266bbb93ded1425d5d1a8ed32d77527e2ed06426718979a80ad794aaac4b841e5eafc99bb16ad247fdf5a47d3eb5c0b6cabb6711a45400602d205b82ecae9e849bc8fc0a34379c77c3571b27e1d287e8bec1ebbb9ebc12b9bf4d98bc3e223b184463cd7fd5cc137523db5d83d5523a7c61804c94ef16230d27bbe6c6ef4b0c420efcd86cf48cd9b8c5dee5e177b93afa5973142e03f6b3d30d07c0339e8d64aa51e087423f1e51cafffe3ef1578c1bdb0d16dcf78bd247c3c59dbf72ba6de6b993db74a003e51e2458a5d313d32f5fa702f7f181d53d5137e7fa3f14c17104e86b3a0af6f175814d66624cc9992778d6c1731c4d7e9c52a7eaa9b98a521b31cf3e88c4c766444dae8fa006931808e9f2cf2497cae673deac5438c953dad11fc694442c9200d5b5d05b0b9b00be58358392990e7abb5857adab03e8f1da470176f2f8ccd72fbe6c5b4ef164831a79edf1a22ceaed5bbe503455b792f4bec19958d11300076142c3a7e20e0daabb0275d5747cb783562a5ad8faa051dd16f549d4b52f70b334177e3e9a9df0d7fe666f979ff4eeed1900c9f3f07a900b7136857325aa996b16b0de87ff3db8ab733a3dc07b121b8b32e6302ddd92e8003c29fecc9910e48f9783772c8669cf85b7e252d89c70a7de325f2fdf1885d46bf633f849860edca12523da94b6ae90071af351588a8d2e5675b01b9047cfcfaf2de9146282d10c304df67b490688c4a03ad1bbc8bbc419a49bad85e9d1cd344a51bdd5b00613ddcd809fdbb1fc64b7d18621f491a6b1e419129bf1345d2accadf016beba9653dbd95b646e881eeef41b9b589e5bd1d3385458ffd0083064d37a87a821da9a0d80d43d08b613d464040ed8ea0b7fd3a460b6fd6db4edf1e7f31086e6b198a79d575eb3e144edb38051fbcd5ade8612a207e16e5a125e1830a6008c36f08d35afe9c93e829d8e32b08892e72f89f7255898443a497ac129db66eaf62d4120daa192b46b61227de870f244c4ec905b62448c5fdfb040cf9d44b000633e25ebfd0efc90990166254b3e3981d4f6842b7fd27eb4cd2326c1f9190c1131ee3157136481fe65e7fb1cb194c8ea95e1c7dfd49ec9b381167f50a3a4e56e00c1d5eac43ecd4e408933dcd2011aef9642fde0e71607fcaa0eccf44394d6a75e3d962f65fa2910b769b2ee130fc9f1447e78e74db4b3f0967092155f455a3d88d5f48daf233fe6491deac90b1d30a02f18db5b7f17583fe4f0513c3d52ea913f0f739dd6468c2f63fa6de600b5f96cc48687a5d1aa5f2af3e2acf18429f252ef6e95d891e0786ca6939ecdba768ec7936c206f0bda534261dbe7adba572bf2f867cdb6586d8f1e6f8e0ff89ebb6b311a2e181f8443bf26bd50a3f95656d1e2087fadcf905a5ac54d2e33ff14010949d730e12fb1630d4844c5644cdea59eb08e3a987ce04345e1ce18ad39b0f3f37249391e1839b4b817b6ceab10b9cfdcdf081d2056be94eb0440b1de30fbe0c43aee9b217173b56a2581c0dafd8e3236ddf49bc7d581dbb4ad63ae399d6b73c61445db9dc405e17de21430866ba279172dd23b1181e0943d3d955251b77609a38ecd7ed57846c58dee0cb23fd3bd01085f3f7f7fe4414aef456442b917a23ed71b03f98b16ecddf499c9ba69ce346684e27add75652a5c35454ef3d246867fcb3987d001183e974c85e9bd96d39f16174832d9948d1264b9cdb3ea3fbc79390a7ab7a6da04d29e1032db30495c53ac3a00f5f85fe48fe0f73f419a440221171f4f11c298653f3eda111cb6e3f0f875579d22ce39d3f95d482a5688a18fe486743724c7bea1db05f4b12cb6091a041e0a8d47afa503e536570f8139bade5a03a3c37f3aaf434c900a8399b22b3ffd12cd41d33133dcea089e6f50220275e81b18647f7ffce1fa498618d24fcceb49d01a6b63d768c76e4078ca31d60aef25396caaa42c29d66abef1d164c360a480f27c6a6826b66bf87a8090a4da568277eafaf69ba3b8c9245cc85ddfc178e428e65dbf5e83af330f1340632783580886ac5de8b49b1c02ad9f840e91de8832a81858dab592a5a518a732a2487591c9a809ffe18d66e64b6d13cf74395f21089524d86d1bc84c4aabb2c1ee7635965e72607b81948b89ebe945e52f14e7a5ee568866b6ff89158c4ea298983f27d82f6c5c3b49589d896cb8a26f8fd2ecb95c92bf8e78bf7963f26813014011e0d9b4fc69c9994801676641b5e926e1f2cdcba036aa02fa0dea058e60a6768ce50da7b8f5a101e15b96312afccc74d08e45b4258a53e62dbb0a4e3837f29c0ea8f65018ac5c03c300b875cae3a40a1d03c3be892726a2d9053724ebe560211591264691ea452f5b9520aca806ea572617ca4341997cc96a710342101599c640521003cb2c16d5298d714e48d309dc9a2ecbdaf56dc0ba8092f0fe5b34e9cc0d5046000b0e2ba59b6e2cb333e4ad0ad7bd3afe0af0bcf689cf82d213bfead2eb102ae407fd0e014f9ba5a3ef982e726d47ba1508deac2e049b2b65d033175b581650f818753888b4aa9e78d27a28a3c952abc8559438a17f9a7d22172ae9c5d2d73ad4d30325ac592f59ba9317060f8a729280979dccf15921da7f6f03fcb2e9e75b02be237fdcab7e79d197db51261f0c00c64577d3ae3fd5d6063e5aaaa31bab240a405281aa2a3c716657538477f5936901c59f0728823af23f1b9b8e06d6a74833f01ce58563cdd2d1680c3a85bcad5debbe9fc200ceb5a1826d53116ea9701a4843ef160ec6c700bb3051cddfc2ce31bc96e68ec783ca8698d9fddf3b127a3c9fb2559d96f19cad7c46e0c8d6b65a972cc50fd7dd300df3bab808420c9049f1b2d1ccd6ce42d31bad2225b60ae5f6f094ef6837c251e48b90ae1ed443a1440c1a18c17c1558feedc6489d100cf007d08d6cac290767e2b083128e1080d41cde3dfdefd7fc9274964020b3612d5321a98ed338162cf08d053a8bf281449718dab7078484f49dd897a34105141c9dc8fe119998a9a37a47ec0f80c8a0ff68ec93fdbc4c0d8dc99f8488300eb32b2e6250ae564a3dfb73a7f77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc0184b9ce9e76ca27311cf49566484f202df67d35558add045d580126876963832d7c5373584c34238f11e83bed4989bd77b85a30acaefdff5d88e61cbe790fe8be8bed5794e0a44f9a3e77525fcb825df714ab109654d60e5ef458a7744eaeb559b670c378bb8075fbaa8724e354a2c85811581b3d05d0fb08a24010d16ea9b0a807c2ff2c64315b5a5d01f7a26e51c540b8499ac948538d049c87a0fc6366a25385cc53d96320ca5d60ce14c4a0f71e581067d462a6c78bfaea139c1eb54f5202387607a741b489afbad4c37072fc99472198132ea694be9192ce4f5eeacb8a5c29a962bd855462f673fd4bce6dc8ffb5f3c59d58d022ee729e9f00e58c4110095f4bad44b76a1bdb9430f60718c3174c8fd7bc06acd9e245156df6da231badb2e2453163605d7d0524550a43fc56abb1fcb4b561c32264b100227a6635c029ffbb8033430795501d2b53d0a99fe7818f4246d3909c633a5e66a5d4b14c984c97f1e3fe0b347a5ccab21490628be0638c6a735dbbbf052df54fde4ce2ef0bde238c55d9e46f7468b5bf7f929548a717507a259a0cb571051ec4b52a22a781a64a95c00bf641eb3e855d7c1d6b5ca665847d43d3a9050e8a80cb12b598fa626db5130bdd683147a4e391f37a0c514317d078b551ba374384c46fdd366d7216fb0b0e1e9763c8f0637765ccf29fafe8f3db75635968d47aba91b5fef5c8970518f58fe1810e8c4e43e8e0efcb4dfcfcc34e7b3536da631af590a75d3ad2f0988c1b9c3ce29207c90bdf0a454d3dc2e74dd093132e3a6c8bfd694ce34db205351e2440170416c1ca8503ecb4c29888105a0ac4e58bad77349ac3ac7675915e4698b9805a2dc341b777fd8d257085d7e1b1a41693935d0d7f9446d0fffc978431c08166eda6c10ffaaa74f681a02d36c11c4591058f72b5d3b29bbf6728ebfe605f25f9b8b737b3f9e6112dae9bb72d1861953e23c614f898bd6a819442b654393c4c41a3a74db51ef27c3c96a64c444f493e24d682695d377e5a1f70911f0f26219f4797c02d9ed0985c2a1f0c1404cc9ce54b04099c6c16ba14a0e25f4fb68dd4c5127a48fcf6769e5900331336f4f82235bc96a5d3ad9e3c400cd1f26ed1d81e67aa3688e5437acd1cc5b905db9d3ba2d37e759b36a937cb856c2794a3e86ec72d18b1c80e0f43ed4d8199282a85fee66a998736efe74a2e8bc7cb8a1684b797be63d5509fe139c6943dbbc54c36a7b4a016b6bd23ef3d2efb25a51ff02c1b56c3938867c142c41f970007236838a0d51dfce977fd4a7a937d8e9d9a596902cbe3b1b4569bb94cc201d2658ca7114f118a5308ada27f6725b80b9b4278c2d4bfc7c4406657ce397578bbbd46314b1e2f8f24faa83d166eab55a3876176bff9fa17d414dc1a09f301a4c4f79a2d6d74f9d376a9adf498f6effb5f493d7ae8da447aea18030ff3e22e2ff4fbd0c300b835ff51fc07ef8c66b75345c91eadc6dd65980c34225b136fc3be54b1301d8b54acbabddbfc577a28cc0560f04e37e06b241a45508029f1008afcea01026096af26adc32ed654eaa3f6b8b5a4143fbeed4aa89a54669f16ff498ec0d48db7aa316b806adddb0d653ffc144eceb7ede9c99fe915281ce509d2c91fde101a484e4242dabbd154ab7264a8c33257806ae869eb86bdb4ea2452e3d2554a9ff13b0a4a7463bcf088559a7ac06a6925b7de4333f6269ae118847a982cd80e675ab966b1cac47723c13464e90db4fc22a47183918872b595ed2c085b9e5132529deaebdf09a5f4534570581a5746f2348e492fea681215b9b2458493f168bc4701f5203dfcad3a665e30fe7366cb5345bf91cfa55fadc236b0f677a7edc4b62dcf028d316a855146519cdf5d01e9273c7d6fec2c35ebc5f22c6868015a0e27ee503bbb241ad541d969de8241f2487701110b0de6b27625d771c2df0800ed1871c9c6317fd5441209ed1b6f85ff914a7cc38eba3b9df3eaccc62d6424a70a909e85cb77a8637acdbc247e2f93f16ca995da207b93c00d1db872d180bd160c975dcb7316098c207adc572c49d18f809b34a0e8d956e16ac585bed5ba3b169c3596e2e5950818de1f50cf5045a9a37628415b0f5becc9b2ea1af2629b076f627331134a7c0fce5bc600d110ac82f3f558a454bc8abe408e945f569faa87e9055816a6ca5485774076d4a89405c349a63445d318ec320ea6cc3c31b56f244b2eed2ee38ca4d2db3438b49b05d8d66b31c30c1f4b0bb1faa19999cdcb72465f84395f11b9f45dc2e01388f18bae22213d0ee2827c6fa4cd27045e700a3c56ebb044927a78cd90f4eb0f38f34d0d0f35721bad42d49e714fe21473639a54bab85916b064f2b5d238fe34ace97480056d7af457a87a22824877d1c0eea242dc8e28b89f184f368c58c18bcd1b278c6c93faa1c6fc96833d8091432e584a8f2335c53149deb6d8241adb1b81d08fbbac6d9d28e48652470cbfd673a3ebbcc2f674d78994fd4f220347f5ecb151d4942dc40893978dd4f856ccee6808ed1d63bf1406c86abf439c91a7b60746e71d9f585fe6eac95b441d8270822a46a798fae5defcf7b26abace3601c77326d892659308dd336136cb3ffa733ac243615210d0975e1e5447db415b1ecf383b6c5d6d47859578476791e5259dbd37e963762ce70ad743379ecf7c66c7775f6beda33fdd9fb8c06336bd976bb5b4911ff42ad794fe0d7045b7be07c1c267efa0a18f64bb1eeb149dea77de3485c6d9cc5d96983f3aa8ac65d9cf6bd2d746f0c1d246634bcad87bddcde940e8d39c16dae7e4f74e8751007f4e2a2f03d0bd6bb6c6f3c4f46b27fd0b253847ef68dd5030d7397c2aadb0727c5cf8dbbb74736667c5bc101dc880a20f3b8f7bb20c328fb678c0b03b746c0d424c61f8618a11ecbc19c9ce30aa8973d1571463978643dc54119e1ae9a42dd6ba668c0d5fdb3e029d09438694d9ed7739c1ef8707a0b73ef2e9fe439d049dd7ccf1a2a21c2fa3b2f2dc52c1b11d52b630c0496f6b2037be784906b1bd5d62176137ca3f004de703a3db1d05ef3e61399c9d4aa429cf6a63ce79deeeb377249e5f7e2d6d73ffb3fe984ecdddb603c10767a119adab75f935ddc1af82e51a8c75b00ff2b3dd0bafa9b97d89ce6e351a287711df1257da8b3c8b69a1f3bd0e41a33a32429aa63a820eefaf7a627f9c16a5b638c35c97c5c981c1b8dbcba11aec30e72e45a93654d535202dc82051005b850a5dee12d2005a0b68f78691fb0835259d4d2268f6214f2435409a904c2991d05dc787bc6f51e8e2666fc9ce329ec38946d5025f4c6999e5172e183bd9df618f96bfb7e2d881180fa565cd09aea53f64c90f0c17a1f35a80ac3f6ca85ee973c99d8da60d745894990b24b9cad7e450be0e4369175e883bfbdebdbb5f45106e865a797bc4ab9d048882f3b69a15259fa0fdb940e7e9f0e46094ee30e9f41cfaceb5cb5f90e51a0fe5f119ecffd02ed4117eb8ba10acf3fcb7b61cf0cdd5d5c0aa96ca79f88a955eb73fdf828370c8961a7989ff190d582c062b8d26934e026821e5bff28402d79906568da1ae5dbb8dc2d675368a76e91b57dd89f8c4c96d9a3c8af2f1bcb6a867da1d6b7007ffcf62117dc288ec4e6c71b1b35a8ee7addcfd026dab9f290ccf703c7cc01816bfccbd0f56b81cc5fdaad81d954711846218397b763223526d165d335bd6c063037945c54aa11ba0eb6bf6a16b97a92450e9f7af8ecea6bf4243d6c8a2f39177349fa33a3fc3ac02807773481d937d4edf16dfa79bc950f9f11f82023960b3d9bb067f761e68f8752495f8179483b68a7769986a86694887e4720ae909654d11fe767f82d0d626803f8f2d18b6af7b6080a8cb0038f7b7f181041585f84987a867b74e653c555fac392bb9526c5ef559629c1f7298bac4c0329c4cdfef568a255d909227492fcb7f7a3245cd9fd94cfc850d3dc78dfc987b5e0457fed7d27e1047cbf4d1e1aa91836a6b78923569a7d151c3cc0701035aaa6c02ddea96068bf28f2e1b6aeb10da4071a0fba818542e612f85753adb1933d6c65f86ac163ad7519c82b0fa4ea7cd3df89775172ee20b33851ce06903844b86d3e2fc4b3db68db8d68e5a8af4b8930265198fe8615d63d0bc51b49c608cc942fb55e4cff5c1d3aca51cc220c48a531722eef122970b61be3dea99d9dc7bd692a67ee94125a4d1b771f28fc7a667360595de42cdba362a876faf392a5e9799ff3c27b1a8b5a8b160a2d96a848295645328b12af2b124e9b2b96a3996cf2a3b102516e40c8c12982fa099fb61405d0489422e5397641dc4c885e14425157ae34eca142b75942db0add4fae965c9073e2f4a1f62c7bb6be3503add00e019d0ba3f91e82eecb4402161a4c4dd9803db3cceaa4a02879e556fd23f2615cec373e86de35c9478d49213d479be7e03d72123edc977d9e1f52290d7fe842cf8fcad946029360522dc6cad8cbcb275ad2d201e150f708fdca81b6de6debfed64aac4e69ec93f2bf1b5161713d366699fee2152cde4fccd809f882f87479eff1cb60107b12d3fabed45d87af128a203df006cea9db0e23bd6c3b1fd42a1eb0b2809ac1f21bbfe301e75fafeac2130eb774d490c0ddbeb80e5fadd00a0556cb88e8a0d5574dd43608d2ec3cace28d7c86ebc00e1a6cddf44b62d556028c9eaaf58206bd234fad7e341567d07dfa45e42cd34d890efef86314f45624463662c978eb510bee879836242d66edc65fd8e029b9f1a4171a7a7edba284ad4d794fc193630424019c40d859997de72ea9a2fb0e0e40f1eb25e0c20ffc0553a0ebc20dd5a784a804e423df34d8017f0f5e509f4a5ebfc4c3c7d7b7324f3cd9b9044618a017770a70f5bdd556678607f0f45e374f19c2cf6976abd8d33abf822e39687c83414fbdde577b352ed690047be2286dbccdfe642498f9a1833cf20f491185a41fa37354956fe8993e93a406f8de5bbcf3e9c7158dc53d9b92d478b3c2234a29a5bc86414ec5825bf62d3682001f448f850bb1661d81d441a28fb81201c51267e5fb0d1652fee4f7f601cc081a4b8f50009241d85c357a1e32cd34cc809d6af930fd5c465a626d17becfd8fbbfd998c8c72bfceeb2768b9bc42b7335d702d05817220843cd969725a0d5e1ff59400d347917570bc8bb8544b708f7d07dabdf0f190795b115020f9c5cc27b658f25394d6702c4d1f78af3a3bc04373edceee388b72c98f0c94b12f632f409d0c9efb95e417cdab3d75b532323abb5d38d428a4f61ff669572c86dcdd41911c3820619f178c41d33e0a3205d8e5df830f74d3fddb9fea3117a005c8da07027a0401ec7917d96e0d49bf8e7bd7c9982c9b37570be1fb8b2f777998ba038b7c0199c803ed8d063ea1861d315cd4eecca104a41d96b13ac3ab9d3ea67b00d4e5f71ffd10c1211998d61eab83707a5d642b71448b66f26479ecb17797d478ea27a5bd297abe7a1c63f539f1ed7f6e1d49100a9d0a424d82953bdcacd28a13d628539cd3a9ac41168946fe78d5505b366198f93903f46a9bfee04566c1687a9fd249e48305531d10f11196c7a4ace7b1960d63a0dc42f0b79e23162ccb35554d0bcebcc1f67ab711839e2967c35bba95cfb57358fff588de5c4b748758b84be9bd2b4c16e4ebb6212734dede98257deaf4da4eebd2d5d91920a289fed0ba0579cfa9bd09376cc348c51dddb68dd2d8b8ecc21fe1bfa98c6fd26e7d199c032b08298e372357c6868f459f4f7609297208a1b50cc02c3b48e95bf87860225b649bb322e1eaacc1a6fd8f035ca774f3f4e1fafd3d128351b68ea188a15ccb8a583c55afe4e89f24cc9b8c912bd035f8054cdfe1db5e2bb47d668d662094ff57b0f2f77b68a596b99f702290e579b6004e5038a80e2d8c2c467907d91e90278c14c681cf94a8fa46c8843a4ab12b5ed377f5ed9bfd060e80b9d0f82ac3d9a9ef2bbedbf390793494eedfbd05b86c95382743e702d171197a7d7246a236f6ef499ee5ed2f85a0aa6bba8a910a21c7c3f906430c25b1f615e03b67db87a06f5f611440a0cb9ba5c692d48ca0a115c150dcbdfc454bc61e6a7b9ab89d2128cd630136d9da0ef911efd3e3edd011bce4a5aaf4767bbd38708013436c76baf79762efacb78442c86c8cf48fb50ba43db7282a52ba94c42e75c070dd8b4d983455c4f41de287ad2f3c07be82ed38a0c1c2422680cf7aa6d0b39059111e09040890f0d83263c997570bc7f9619d3f4e6f8e5b6426bd13ab47b45997872b94469bce50639241344a6760346dd7cb08f670a2dcaeeb8d491dbb0084f3e6bdd5a6149a4b5de584af0d88c4b6e18a817ae0eb862bca77460242531d7732d7d9b46c9b79498dd5352127e2beb51f22c67f5309c3b28073f0286438959c1f018919df5af5b2bc085a74e19cd699ed48a3fe99f2e0d89a8794a2c992f05a810dd4ec487695efb226fe8f83df94ca14a41ee0f8cd6504de5a3958b988b4181fa2c315ef1ae16637d8265a55d281b15cdd420bb9c2dba01695e7327e426b40c2695c7d1c6c628013c6dcbd9e9e24b48c9b146823fbc91308dfa6185fe99c393209a90a17949fa50d9727a0a86a053c6e889edf809db7c57de17ff2a3a5d06b372bb2a527bb213eeff310ebb95fadb2c84ae75916d32d1e3c4379a8939d8e3e99777e3796096eb17f849d861aa5a37c6389f7bc2fc3b4860fac9d2277fa5e1a1f9415a6aaa5106886efd85913636f0407eed7f21195d365bcc4f24997e3c867932b7fdcacb88fc9cbdfc94debc19ab07b208ee1047213230c3480033a81558dbbe3c4bfe369713e18fa7748ece8abea89c824735282fb28c7a44f39a9fc8cf45f65ed3999e1402e33e8ea335c002a19f78ea28e41ec13dcb5bb68d42d7bf6044959023114478301e5522af78430a0a48e190f1c1bd9e3a89d22d2ba0c2619264065098e9ec4c31ef6e0407aaca194f5161273042670f4f2498195d58e267fc00b340c3a7d8087ef2e3933a61c7b8e735720d62eabdacd237f7fba0bfda3b03c736c121cf9a257db55060b621be5168619ec4182f13ef6a408c447469fc4330040b6241c5c53bb4a32eed095f207b596231ebbe842c5f8dcacf9476dbeb28f763ab94922ecba3ca48e9a8b29ea0af20b3e5d4d48e4965a3232c6bf68a0954f04281e MD = 338a39c789636826a396214578166eb987b5f0b91ccdccf363ec13ad2262ce869fad36cd3eb7f89fea6b8135e2b2b24b9b0a2be7e57db1326c370dd7424e2a85 Len = 60424 Msg = 0468d38487677dca2a631b79c1f0c0e6a11d0ec1064bb190b23f2c5bd775d8a937b729ac8aef34b9203a6efbc73db767efbc97f20c68c7023cf9f3232a7dbefc32f00781c60c6a6a10620ae3d8aa8e85a9586a852f70602be49a4686ec79095f3c39f26b026728c44106779abcdf4f26161810e0370884f2f24aadece410c2b99fba74d208a875b1fd4c3b893b8302347f25106decda3c3fad30b1bddbebf0f4a19d141e9e765a198a5ce0171d3ead962ca6f293168e8ffa5e75d96299b29bf78b075bb78d79dee2315feeab29ba5a3465c43fb97ccc860c4d40ae41e60ccbaaa522cf069c5a09f53a7debaf289c10f672a77e49e73b285bc2bab7c38aa189f53616fa7195c1e33aeddd618ae38fd8c49a7637aa1f837dd0050b7c504c1adcc0880b64613e55759992a8d7a41f39b986275af244ec4d8d535d5a8551f51fcdf3e128933f61bfc6fb7005d665a742bb245f7a387f164161cd14cf5b2c4d5763768a951171c4a7de46d01de5354253e6868bff90c3640600247094854b1c6ba631cb7b666130b3c664fa188c7cb7144395f21083789f457242bace8b142a029e0deb0218756c8e853b361d53a2cf2cd937ded698068fa5c00d39a8f6f13fc554f03451b11742de23b5cc54c30f5244b055957857d5fccff16f37484c49225ccfc4ec91b9ae784ca9b903e6632b0803d1d8601f484dae6a0d4ffad618849c6e176f5ce9b6a2d77f1e2e25fbbb5fb81243a687f3f4d76c1f1d94cb7bdf0975a335dbcc82325a27208afe78ba54112c180ea9521be2d900962728f25e2b4275a530ee8383b44030d6f610454cb5ab2abe3bc709c09abd307636f2b7a9839663191092cb15c5bbb94a694cd3d966937bacd1eaf309a5e9c5674fda6281706d09aadeaeea60ec338c23eb9a6c88f033e789d8f9591f8ac787137cc83a1079302dfea129298bb1106f0a84e25681daf135fd59dc8329d1bd3d1fc4a4887e264598bd61edd0bf9cbb2ba73d0cdaedac372fb25a7bb9500335b136305694f3ff15129026e12723369a88a11d0040f4ef6c9b4de6be43bca796a9fec6c7a6968d08631ff9ed76e006164da12ca7d0bd2af74279028d68944548ee1f90dd068f57875211e1f9041d9498444e73e7d271e542ecdcb8d0720165b348429681fc07e5f8a80ee7ed1a0369863351f9a98d37a9b4601e0f6fa72a903f7e0fdf9ccf26c0c42dc012b100ba0c49e351c7d64a38fcb568e8105250384d545a2d7314c8136f54a9cc6a2efe69054a1cf7e354519b69adcae2c161b452255aa2455ad32ff77a0fe4ddf74a5c38ddf0a5eb570dea8975044fb32c851da19fb91ffe9cbf4cf96a5ca599c2ee61501ba248d42be75d2aaa23bf0359a4d14c43d9990142c26642c6a5b6a8d20356d947cacb5a65ccf1a58f70e27c4ea7197c9922d8f554c3c6f91651ddb32f6f83faeacff7260fa3ef23ac5480c415773d592afda383d8a9b547e3c8e362e21c30dc8b1994e030549fcb8a386083b6fa850a7dd0c353d85e7954b371905cf2f0a5a7b2106a30d1c649c6b0824b62371a39b81a04010c5bc95a4711b6ab4a67d52982e71c40bcf9e3353ba69c0908a2bea08a8a0223566ad2a24882fefed34ab20695b3a5e02fb092ab53f5ec621ffece03a95431f1db0c61978190b24fa0a26e82099d13102ffebbf23624dc1e4c5431aa3c00f83540495e8317c238675877f3e6062ece9964ec46530bbbd20439abd1dd6c17c1b53029b1ac35a0f90ea4d1287ab3ec3e4378811c16fa4338dd8e0b95e46120f33a51b5435b01b35d0b2cb9f5853961cbd510c623832d437571f27d650642a3f58c4bf4fad7a382cd2897364251c015de19d7c144e1c943f1880e07298d37283173c7efbf6a4496af2b8e51f7246f8fddd5727c687af9cb14ea8ab4c9bf6a380eb76dac7b5a0c756cddb811fd476e5732d28cff7594e364465e0d892ee5005af41fe43514f022a96d06be7e3a02e6f543d8cb505578af95efae3f903e4624174b75d5927474afba196e47a0979cfff17aafd779ee6e86e777a0cad0e22cfcf67c7fe7c9812eda2ed7dcfc80fc5fe0d43e1e59822abd90e146fd535103ddb07fed06c3e42565cc8f111a84255291b226f6eef971efaff40bc48c851c87a2693a07d110ea4663ac642eee89977f7b9c6d0ce75e50278adbed5a17053858c34fb032aa77e4ce6ea3369621b0df6d65c733e7d13126b9976c106e647ead5c888968d757a0d9a4cfd98cb07ba30402965affef7419fc8d1ed0fb6a3d96847d3940ea5ca132d1b0ce75eee6c30a0e28587e5a8c98bfd98b672e36b468f5c4a11d9bbf2b50d6d5dab2a0e49fc38c06c6f15bcb2604cac59bb9af4ab6ad4475b27dc36eaa2c33eb0ac581f74441d2f3c4aa18da2581e3c9a55e7bbed6d62b9f97a1df7f43fcf21e284d41ae3b0684dd09cbde0ff1d7b2eb919cb91a7ea9514b38d1187b5d8aba731c930792edda49cc7f9cd4f3f2cede3547bc91e715f05f817d5596e95f9c34f4cedffc2ac284c9c90d65230d912d10afaf052cab0371fc474e748051b3fb07a8277947fe23ceaddb9b6df2e534beef60b2c1b2f1aff5d1a79378fe3bc06fdc970da81296767e9d0b12fd6a044547245036364b3e834386a834a73a30eec05bca69b5827b245d4060585db3f12a91568724ae1d1ce625c252194a59b7a5b52b4824e8c13496333fe256d5f4344d642e0e656f531240612dae2ba886594d17f5192489f74933c84199f4ad5556148854ecdfc113a9fac070c3500be79d4eae604653e04b4262e3ef8e1b2cffdee9c46f297cee85677a0a339a71b9a40b114215d69835e6a88d4ef1c8b19b1a5433e127ce233dd3d729071d3977fbe62bfc9bbbd1dacff0031bcfee4f9f42cd4159a826e1bcf5227e6f7ed7aa4819d5867880fb4003f790d9742f8f2cce69412cc5de116d2e5f9de6b53909f5ce5b98a3eebb7d2afaf5eeb400357b6625589e9dde4e937763c3699661fe5a20ef09580ac412e897a711331b26ab5a058b560b1c0cbf52094269b116dd967235956a3c44644ee58ff29387975157d612eaadb032b7f8f62ab3989bef8fc9fa3ba7c76dd834371b1bc3c211afe603959329a3b66647c228e39e994fa8e15e9a3b0d68124e9e94334202e7faeb4e753f933081454124e5903bebb5f6c93a1ff93caf95542f082fd40d974a69d3f1767d17e78f844ab729d53a8331b8da01d2c04675965b02dccea7826a3387f037cdf72936149c0966569fe84c58bc64a040966147b24e4f813a53ac64ea7cc9894454d0055ab5069a33984e2f712bef7e3124960d33559f5f3b81906bb66fe64da13c153ca7f5cabc89667314c32c01036d12ecaf5f9a78de98d93868e188d0edad59fec34487dc3220b15fe497e82497bb076c157f4265661b02ab44b1f10ecf305096827991c466c0221b853587dfa2e4ab1d27da78eb5f8aa5f1e56fcf285df2cce2618d3c0bbe3160aee1e530ba8cb1a707ceba629431ae691335624da7fdba73ec49caaf38a43a1420dfef0b3ebde7a332f06528e7444ff7181bd490121951edbb207613d37fa5e67a669a41f29e5146a77624f36c0135f6087e0bc3f11880e357d0da8f64b7387dc36030fa5f95b6396d493febacce270feb48500ccd620dfdc93f3e4c74b4bc8203b4f75d0b0bdd248c4ffe372e14eeeaca60eb932c5fc0e21857e9718addf89c424a389380698fad0d72a9007a3c522eacae24819977633b4cfe25272f9cb674890a3ac34615947ff799876d19ac1b849a1a43fe9912bcaf6e1e3896ea58bcb2dfdc4716e379b44052ace1a792ce11939b8c8f31b69895e7849e6be5437ad3fd4da8a5b4e1fbb7992692ffd56d09fc04b7ec51437771b48a9966063dc268c3fdda569dc4c80564317c35292033c4a37ef622d25c6405e141b25e51c5f08b545b8ece776f1efe84b15b7ca7b06b69cfaa611657a206bce6b4d96e94a6544b4ebf71f87bdc6d4edfc0cc4fc0ac9d5f482fffb12b40e4ff8a8a157e1607771178d08cbcf1343c5c3d07d696be3c520ed6b7d9d9955c8734946c6f762011df439b37e603209e1492662d8139e78a10de41e7f577dc1f75c5cd01ed3efaeb164b7f9c87b351437c5721dbd52184bb623750695d7449b03818fdf29abeecbfa48feca578b6cc4afc1338b9db34dcfacd81cde519b624375897ece67bdf3eb20f79aafdc0f2d9dc1c2f716e9a5b396ddb247e022f27b5de5ba861869a8737eee16f804a6751c021651195a31a7fe13c13882b69a9ae43cbcbb5257afe9f209ba1db383576bac8405e226cff64861d90fd159ec28e3218262f250169af1041e0d8249865f4143a6290cabd2b7f5a359122349eb4e79d7a181060bafbb6c0e2e60db26983e9495eae817252ce73e17166094bf2e7bbd6b2c9f5ce1bd91a994bd5c8ed72365e407c4dbb80f191490519383bc4630412c5076066d7ebabe382c4d4923d7d2759e1dc66c65e631c08ac742e3e05b9b3f552c305ebe3f1181962940bf10a50fde514c62228726f16b8c0cb719c78bc9b6a652ce20d5af6c9c52304a36fbcb56107c181a96b26df2862286628dc8333657ce68c1c53a4c266efac5cc494bb71fbc9d0562216e17af90dcc8d7c8790e8b830bd29de46291d969de5e495e76f4f7232298db5b20a0732c19488952406a13d90d24c4e6c51cf01d9b6e33ff041166f4ab56e8cc60b4f7a86689e9a3b4d279ca30d3c9450859f50aa07a3e937978d991a5a40ccda4b1a7a653019b355cd427c715743d9772b572b19c06abc45da7e99a9014da077322fd965d43f0af9edb9850396a7456badbd392cc981e0a173af160093db2e242858408f3c59c4af18566060b4b1ffb3719a23ed0a307cd3c8e8b925f6339e69955b57e951ae0cffb3dfb59097a930d7e1b590646cbeb96443f32a22149d19cee101c57ef9880872271d2b9c29d7ff5f63d82998d575bedb4b9710ffd360c7dc741233531d2de08fdcd86b8b508295d461c996912e9bb4c0479b13c21dc6cf1ab7564872a6e6bdde3ad81d65f6f419be42517e576079c29ca1c8dc75d91559101095ade27afbc7e8aae4e8330273b4a36e388af3525711f5c0e6131fef968f47e89609ab83b4253492c674fc5c488e0d4d46616ceb7dc8560cbd60c946919746a82205d6a759004b5b446ac8ecbbce834743abca15321044ed14697ac84e9995b6014969d0317fb36e27729f9a139d8ec4f61215b7bf1149cbb4d93a5c14bebd7cfb7c6fe585cbf63136338a4e9a22b52c283c56b86cf2ec0e665611ea2d2d4560d746edce9d0b9b0e3b5690f0968680e7a1d1950281dcb61ef088085bdf0fb5cc5f51ed73c1682b6cfc82ba6850f0775d297ad87c46f62d641a192695738c9627594276bc390a2db343600f9e108923f688df290e0369db46aeae748131cb6fd98ec491914c18294ad698977a1e780b1b85a78fa0ff5c482d72f2f80760f5c84ac67d45da44baa89b7dd15ae5c1e6b732ea7a131a83f8fa82308abc10493129e2c9159a7f671a310d02b361c542fbb0a57d02bb64d7647babae21c88235a81b095e359868fe5d4c082ce8b304e9de7dda07e4916743c95312b55d22476a8225274f85487d50ae81f4c2155888feb8a63b4fcb9d090f4f081d0ce6d44531e6d0a462acb1a7a733593a8de5593bc9b0b42e1f5de633821d24367d65e666d1fca3e86053dbcc49145b4055fdbd0392ef2e1d3d4274cee55c2fc4ce825e9094ed265b1021cfd57f7a106fe1088ccaa09d9c6f72234fc08033af2fc8e446adc0e1e1653cbf94ab918dfe2ffbacce773ce1868c86a880f39bcb2ede3334a5a49eff5d6faad43234c774afe969918cf2aee375dc41780e4d7e4c333bd719845d767021df2309b25a6958ab03f460ce233eccf1c76b3c01b871dd47ad7b3ceac0905cb51f6f061b04be6078e764c19af234c480b5cb9b611bbba6f19ce944dfb533eaa2955672751a0fb5a0fb815bfa47d7f2ac0e2a3e375da5d0b970e7da6c24a8426faba0f5c983a47eaba913d7f50a707ffc3a50cc8a68778327923ea697f5388da4c814381e29c5e41f58e1dc93234792f8a105ee632379e6c468b64f6a1028f3ca537ce37cf3ba0f866fb413dd7aa45429ab114cc976f222175b167eed5dc39b68b69e9eebc9ca2667585424daf7cfed16c13b8dc4492c5ea8d428da27c550ae0658420f74933f514b7a89b693830f8448494c5a5c846dc30039b20c202e16532ca132e11e395fbab93d1b710e04ae4145ad0d5a9a10fe79a6f37dbbe0825eb363f935baf2a473863909d1ff5564f24d9753433685d327a7226b519070a770f532c81243f6bac2e053467405708924d0c5a5b99526b62f76fd08f533d787944322769223346496ee905ccc2e655d8bf15809362083a1600dbe31334b1d0812c2ba6b7d02b48b35d877b4a11f3ec671d9d7e9817fa67d0095ed50d1804b14319c82109b8a7d15e8c791b4bb8303ae1cb0caac63599730583513cc987c67923bf902cbb36196ecf7e364c5e200bafcd59dbabaa4565ca4b016b70d50e47c697600c3058f2f0af6aa537a50dd3e6d98e4c82e7b0c1fffbf505f617bc1638f832bda4c27f59dde1d49405bbb75e62369915aae57625c886b7f39997eb29faac7a1ae2597ae521c471bd18d6f72a0e559247bc2b670b4fd8f86cce87eed40d41d22a5d7bf82f7cc5e692f9ad59c13ba4fe452f300fcd06813ad3fd5e338ef166df4e7e9063834f4497b810a54bae8aa341b08c89dcf58d0de3cbae9155c54779f609be3d39ab09ef099f0635396c7bdee0fc4caf5b1f33eda7b67aa7c2116ff9caeea4e906e14d13b0ba42f3cf656fc6608af7f706a49b9eeb26ca2804eddb64a26fbb0a47d07961218c4f576a3406e8450f17177c103490228f1598aad53a59210f794778f32f45d0a783e69652b1b312eb128707fc9f6ff261f5600041ed35cb3057f716c3df30427ea917d03c00c53e9172bc56c42c9cbf41d214c1ce64891584efbfadbcf9befb83f761a47a648d3ca4d02dc5017c94fda1442d4bd540d1747f98f7aa590f50704a275a8f785d79a1978351ff3f0ff73202c4102ae0f29d8c82fc459922a08325539178fdc07c28f1ec34cf41d7371200d8ca73db9c0a4bb231820ff6a42dc59f12ce337bed210992054d0c5954b293cea5dfceca40f87a79fdb2dd4f5837a6521a46209658ec9a2695349f9241e2fb0ffc6c67938a3d98685a17341fb92e93c2dc91a6b98e4f6913fe93df89295896594f08f4b3d25a23f1d9179ac431a31c85dc295c6217b9e4eeb3e362aa7574142f103deca7b3ceabaafd4c77e96c15beff9b85b83c6fdc9c0b479bbf72a0d5f2e5e263c5eba91badf8391e520bc2f6e9b48d2f208500f7fd1e4c255c7e55ee9132281306fc1cc1996e1f15cf87d0d72b39339e4bf865bc968c2438a029ef3e9d8863d4265599410c7101cb270a103701f2214b90e3289ae6d9521e5101e736665d282faa84a91a65a593972efefb86ec73d8cf75f1a4137c9a687eb592d8769a24e77e1a05c6ce337047021dc30d577932cc92819072a6b623d9b264692d7f97741457eb656cdcf4659eb49a12c01906b36f2d3a4c2ec5221a1851d3d170a1eccf5135950025b73709fcf71a5abe5c337a52f81681030f4ee1c6e58a782c8e089b00afbd826bfd69b20472250752917dfbfaab9cdbc9e5ab2f47e60ed9cbb4896bb52ebb48ba100b02278e30a5174954bcd88033b8cdd8b5372dcbc752d895ddb5e12b14ef9a7fa98ee8d3c3b096e436316f4e71a4a968fbbdeb1f4a9fdda2840e073d60c387ccb39ccacb54b63c02b10e414eed2bc706fd0802491f0d357afae8b9ce1580fc67b7d03fed7a3281255387d109fcbab14327c9f5e1ab179a7fc0ba5b55a99472e134bddaa29a9200bc7c42a11836dde29e0a685861756b573174177e8ca36a85b9a8aa0d834c612548b9d333f20211f58823678c5104650630636495bb899faf6182495b27e62c795a9a9e0c1014d34491e13c1438ee9121ed3d46336ac2905a69600045d91e6087527d279c0ab5be6a3bf27a82718a7c24d86010ca22e4e91141a063504f5b89b9c0fff4563a8b1fd0e6a59749a37e82a9725a78dc7c77065e7af1e6fcd304248b369188dd37eb9413429916fc3721410a5baad2eccfef74ac85a30fce0ccebd9623b049937b8d97aba03b7dfcb51933d1e4cfb37d95c4c085f25242266511a14508fadb1b8db7b6f4b01b40dd95ccd79abe479f01868d5675317e22a874539c3266cfa1d7e7106e98d296e41161c2b8bf4890fa1afaafb2f4d38535c6a32afac8bdbd324b002e2b02885cec3a918133da043a591c6aa2627f4915dff389fe49828e220107614768cc51dbcdabbd8ee55581a230986f1bf18f129e95d1815404ea58cc927f9312c450cf721cf74e5259cc317715116062ccaeb09e0bc331b2b98a9deb7b261e06ba2a41de3eafbc61eda8a4177b19f71d7058b372865b1390d3cdce2d0f8d6aa9c6c3697ec73790343d754a11e7149bb269179bdaba0b9f74e03e79ffd437f15256b696b22b21525fb5aca3d4cd83b6b83355ca34fb473de56b5721d27d984ab6f67e6a36feff8b3ad2d941fea2f9e0955badceffeeb08758d1a246534030ef4e2285447ba714935c316594fe1be991d04e9a2ab9f8ba0445cf9a67e0e094577e6755c5deb813134a4dec1d317cd5530f88856de1add62d4291c9f709b3350bce418a6efe967d837b84d76b576a4fac9985fa091572977ac5d49b844c5c9574b42d7d9049e6b65c6672a1dfde58baf714e3826cb3db7075561499901721284ad6a7b9da5f1d50169193f61b14bc99caf82d99394b6ce39559ce4e9af8c57fd69c2cc9cd9caecd3a93652e7db92a7ea0b9a0b8df4aab7353675e15157fae0ea07b4917ba811f9040d262c5a82a16dc10dff96bcf4ffbb247f560a78ffa4f5740fa794e51aae44bb1e519560af6063483e1942ca9b9e202eb9a62507b272dec30a039b80388a1521622054a169b7d0a82550d75cf26f2e7a6bccfba5754ce2fe802f6ff4098bb45e63f933c7b88efe084b0d1c1dff5a2f311d3254fb521a4b4df795d8ea959a6899a945f877a4cd339136b6dab2cc48697a583ff8b050c45fd9f99c9d0ae5a07bfaba6d6c5b365cb86b70b5d9c6611f257ea25bae6d773267ca0dac88fb008333aa20d7571b7523d5bd8170e1ffc4c9ab6486ee3fdad04daa48bc2d5f66ee2dd9d163ed815f6a0bd1afef51ba05ff2c43558960749e62fb727a8c87ebf2b884b4960916b1ce1bfaf66b44be2b811a323579351a1362362505880723f44865720e229cb9b11092d98a160721fe1b1bc2c8f71182e4cd52b4ac9bb567420ffdde2d9da44047ced791d6dbc1e1f97a0cc346f8a501b188c08eafdb1dbc9cf089af5a2ea7123cb0f00822e0f966e547f41ff5a37a00403a889d566fc78bcb9310cfddfd2f97575de728b64d37188929dcbd1e2117e55a8cb0c7e97f3b3a989f9a25fe33c337627ec4d8d94b045fafc9cb8508990419c72642f6af350233c8bd309905f8ec5a23ba8dffd402e6a31dcec95ffd34ca054faf4511f1b7a3dc2694d8133973306864ba4c87ef99674c9ce1df33431af010bad0c200f72da69f79cd9c7be4cd1ac9eb25085772380fc2f4aa13e92372fea1cf30c0ab09c094e3880f84b94c2d2fe580a4ca57a509656dedd06f69e5647d22577847fa6f97f30f1c0397b6b9bcf925eddf996fd031f1b64ffcfb9bd11af4fa1b4f60d570dc4e8dfd50dd5875a2ffeff97d7d873adb3b03e1d5be682fb9eb91e05e112456b42ac4f39f5e88c706c9ac6b277e872c2dccbd6c04c0b6466cea4f714c64cf6749111cc698232ff610e0c50c84a557ee4f2b4db830096f5f597a9c95c261beecc38afd3de233334beacba0a43df9e0c86ae0198d02a279c2a822e013680fd92c4a1ecf2226967e0eb912a7fbf9820802a6748bb32292beb7826b83b4e57609710453fa3b0b55f687a83e41d86149b8e32a6e0af137e124860fdced40e29e34011cb4e6513a7785fddcd6d5041c55d9b41f56fd11e997957676fd867f06904325b8c6fc2b5a0412ba8062cd48d3af51beacb5ced9e2bdf8d0e056b738fa531f250113a29314058404ba6a906a2e5d0a46fa11e412c75b34dd7470e63565efae491e22414f1081c524b2778632d469ea9731f5a784437733e25bd27d3cf06ddad9377b4228f580bc629210176a6edadbf878e67ff6fc1bdc2abc04e21643d48a1c76a70be66c0a51057fbeabd8a3b9c4b0f76ed4319a4e17fcc08f7f8b052ca65b012d06511c286c57a308aa461c0d8c08d7140efec619cc9f8efaba62de7d15de00959a30aee1f59e26767c7a81de1d48406095232882e35c50cdfd6578d0c1ed9c682e4dc93ed4233090893c79355eb859dbd2686794457b2b91af5a782c91d0fc2c2c6e1645f22ee7df3a56ac19379f4b0c2b972b54d84449cd370a899a6dce4a6cfb5c3c00350676eaf58ec39290473d7c09761ecc85fed209ff3d51213d31abad03dfe47786f5033923ae66a851f658b1d5cfe60335f3eecd6eba78c9e93f4979acbeb6b1ce41b7552d7c3c6463f5c435f5682b01ce69c3a2ec4ba79a5a414c575ec359b6f333b9c579c1eecdac8c MD = cbee0413f1f169a6512ecaefcf5a0c665ddbc5f5365749da16dd98a04b9939584004295aae3867f2697c52a28be0e42db6d1d20954e386dbdeec744770fdd2ba Len = 61216 Msg = 41e9d65632f74f449a6842d5e6c4a86ef83791307b92161f74938f841a660690e86beb41f03a088a72e5b8aead7d54edf5d7ef62068f432c984eeacc3449d2ce450aebac727322ef2b009397824cfabd3dd76b77290644fcb16b5f08ae478c82814d3e5d60a984bced413b590d3b8327f7bf6f368bfe01d7e673550233681cf4c3bd4c1c61e51638df3119bcf551d5734c186268d57f61075fed348069b56a6c34e07db31d2ec0ad2a579387e396d9e96368acd5ae924fd34561634bf8355e32fc413ae83d8c6a61f53b12847e1377d0653ab545bf3db082c0574c2b89f1e18d4265e9856907fc9d6966ff796fcf98727913e480b08a6d5df75856e7c4efd9c72ed6f45048a85ea9ae5fc02f5dd22215c87da34d28816eac13ebe94950393026ea1bc112837679cdebaebf6ef125ff0279ff5a76cf299bb73b996d17d6d7ccf39bbcba92c179335149dc62fdd3cf1581b5226fc14e8adcc598e94a1afdcf97756c41459aabba757cef7013a6aad84ed9a46c4bf74dac1a1f5263e91a6e2b77f68333ccf0e940289805f2392f1e4990546d6756e073983b0e908fb0dfd0f356bc081ab65d221432ebb5eb3b61d929c538399bf843695529d87af60830cc2d1b10247c6ba9fe3c7dbe25e283048080d4ce2f8f9ae9d7ebcac5391f5ad60ae3ae3afee3539c27c2ef587d5f78e0be57a55e78cba29b6363081ff5920c9a311cf782c0d6d6fe42ad7203e6ea82bc38b520303bd77a1fb8c4ca2cd5d88842e9e1dd308fde5c96fa06ed05880c096299a22d8ba13c883d7c16f73602783496dc394b8b96824d2df4d447a78a4c75988726b4b9d28136bf58617983a4fa7a60b02c26dcfa4a118bdb1f6a3114332f27aa4a9d00f52eeb6bf3ae375be2e7c1660dc2576be6be107855f03deb50489dd7ac15d0a932cb0e0bf6041908e4c670719c04c6808067b2bc0a4ea81c6413286f329035fbb2e10965086c07d1d31ff14904f95b63f0cc601ea441930e781c38b9e7c1b5409df74342d2ede9fdd77babb6eea9ff5b5f758068c8d1e607b5ec367b70b236be1b962469fb8fa7d517600680021d98b2f5eb7c6020078950420a887e786ba1bf524514a42c5a2aa1bc596a6ee75c0faed9b5bacf54ea653148fe988aa5f2df896d8c7bb90d5758a9edeb3f4a466e4d98345ba47c0c8260f1ef51cd679f51d76492f3c171458d1a34d3a0eddac65c39b82d66a031efd863da5e8a8edc0f90709aea034e947d05598b95ffdce7102dba55ed5d18b4a5f35732be3145b29db594729c438bea5cc5fbf75d907538cbe9bab89bc873ced7dc224236ce59b1f0ca2a33d03cde3a8bd7e9be50dc1e97a099202a603019472d99ae52efea32a1b1d61926b074b04eb1420c28986a40ca3744d4f1641b72e74e34e1aa110c384a87e24b9361756aec770f4b7f5dc2449a37f2bd55ce14e676e3b4a591c3bdd3741bf5a7c20ec772dd85458d09c66d90cf49abc5a0c6a0ddbb9322e1512d846be6151715faddf032e982ecbc10fcf28e311478d3187649bf7f07857d3078e968691c507d84f67a10d7170dbfda27d9a5874160d0070496f48ae6e56077cc7432c5d8a9c7a882ed7671ebaf7eaf6dab3c9b776ca2b3980fe4a4d94b746d50ae31c2f229dcaea9cfcb7da7dae1d9f9efbd335fa332655b3df79588bda05c2d1ecd2712d9a2de92aa77c4f296d09ff12d8f18a00d686474a796249a46cc8a8a4d6fbedfbf02806605e20e75ec33487eee1a12e3b22cfa0cd6271bb8ebe04090c17d4d02e5e4db4c697423d7e3f21dc7b8c6e9d09b676d4b50144089b6c5c66704619d225331386d5d95cac184f566f516fb640ecfff06589fc35cb6ae6164369e8176e810cfdff169adcddbd6246b2f8d214c4656de0d5c4a9e36e6db9d62251547a0fc24a818ff1524f2cce168739ea7a0691f39eaca7eda0b98c24662075ef31ae20597a32bbfea62023dada7c769ebe083427f0d84e7d67448f1f6969d06bf6105ac71a75f5a6fcfc4d543cbb0bae14a6256302e85bec6400f1cf3226a480286d298bb9efef82dd3023daaba74b61244cd045535132c33d7b5eb46efb74a43f00e717d6f4ec0aad7821cea5e5b8705378ef4f4097759a4a10205f6e4cb340a0784e1bd0298db70410d1b0c9daf55428c6bcd1894f96ca106be130be8f02fe033fb8e853f2371077b6be21661b64752a92d38c6bde08eb26eb0bc8ee56c634bdc3a20dc0e39a9f5eb64181391ba86bcf89cdc086c76e66041a1a986c288f7d56a0a40cb5720abc4fbc0650815013908df7f62e589019d32e75982fb678c1306453396580221a0fb124673ffd5d389bfc89f7166fdcadab1c8a0eef6bcc0e165d57dc98ef784b02397bfe7ffb87a9e681ac5b291ae19c6634c3e957da86b867a83b082721e9102c3f4f46c11a83d9f8b3db7cc70853689d2dcfa209b16d72dcdb593680e5f90bf6390aaa83c8d63b5b1993e680b6a684a86de9d3755eb4afce7d4ef2469a3c80e8cd3ac43884d35076196212e6846f83106bcef81b5100d1b4f498c5d8bd08218c425c1e6fdd1fbbe239c2ac591ff2e67dadcb8a7c26d68b38d7b32bc7dd0060496eeb039a401fd017f131fd68e7f52148aa8c05084eaa2ec2ad1a9e846899cfb879642e384c582f9fe63c90865acac5f9e86cf25047005edadb5b88aeee58c2521853f8da506d4cd27f4f004207084719fe0acce49e5d7df9e8e294a7ecb1da9eb246fde10aa39a6822e5c72c7b22172151d20f25b3361e986c3c2cffd2298b06dd9997fcc9bfaac987ad4f8605acc8986a5f3394340eb34ebbe4cc273d44561300d8717e1bf5e06f03e2141f54fcdde7ce0ed4d08f6bde858e68ecae8c86ce5bb29ff4f5800afdd13e30bf38d7b6c9a7e36d5d3b23b1e2c52a3529065e655639693cacf3845335887d25ab731c5f1e5150f75764af95828635d5ebcf11648044ab5b03e897534a0d672d634e815a3e6c7d393dcd717b105127c7bf595408cf05ef67844547af8dc872a4713ba53cbc61feaf8ad617d72ebe76871e3584c6a4e5abdec8aa03bc835236474fbaf67b1aca2bc6c92f113e2016b8a082f42222a46c774d2b875a0ebd331872695d03a9dc1dab1b7328dc14b70254808815bab14022c82f376db91abdd39fb258924b2d72d4e32a037406ff35f9e0b3880accd6fa7114f176adbf64e7cc427397eb3b8a61786a5f0460f0523f75c3c61d53c718560fe43053f7cb71dd759752a1c863554a70b746f0a046b2360e9414b2813809c537cc6879bc7bd6017804cbf0ca40f27076405e52826893bc1cd84be203ae0fda812406327c2ee5f63c114c1f61530685c19c21a4b7d47b3428e6b8265b87bf0884919628a773361e4a536f981e27e5ed1b312d619128ed20db6605ea09537bc1ba8b94c6cee75b0c1b3182c5612e3538bb95ce03aec44e247cdca1c79dafeab88b788e9772e9a92237423251dad468db5b30a01571353291b591182978eb703f8feef01513f8b50326ebfab7dbc8e55752983011890a1f0afe49c59a3b94a0d9206545ba2293131152b55851e46a5f3f3a42fa8246a187e2bf5d56844639e117f5620c013f4737ff5334b7ca95372af59ac76bd24a99f1db815237923959d57e676bcf84ba93880f90c0b58c6ecddd1ccc7c00abf561d137ecaee52e7572e26f0ef8ecbf3506a7e4a40fbe11c17cea0767f75559e787ca9a49f9fbc39af39c8c4480001b3eff0bf0f5785de54de2d657f5bfd676817a32752199c7fc1a7a7838c0979613290b28c71d710191549e2690fe3c008c63b7ad5b2c24e6326465ea06dbb61b4193a982c984a0358085fd6f14ca027ff60ede9fae9211d301194476691e51fc20ff68ae9ab37c864d528ef4861199816dd34d8e022be72ad299a4a1f200f1d53bdcb7009d327c60523ac16b574d67c13e6192fcd8322b3a3175f501141c1c22fcbc132d537a165029af4347fae603cbf22a3d60a34d44adb82eb3f861d84761de0e0b895002d0d25e3072fef363e3ee23adab5df5e5c9d1a134701c4dcdfa1e7a431ea9155532634a6edf14d35f8ec44d5c6b5932943162b727a7c13a55bab53c1bbb1105f9c18f88aaf60e1d217adac9c70bc70bc101bd5468c9abda07efd2adc86f35c458f4c39385466f23622e8e436dfb3bc404b16df37864109f7d3fd33a09b9abb30b528bf58e4eac988a107b24d1b83c0dc7d6e12ef6f5b3ecfdf1438b2018c76489415519168d3aff11d71df862d12c4b92d8b36134fcfa5532caaffbdc0b3d4b4b67cb98be60bea991d8e338b1c4a10fee3d5134e2f8586a841285267e1f51f9da3c3bdef6979c2a729c67504f012ebd427b47045166529f9a6f4f7586b3c9d2ae1542665f6058143c9816f98b2519f63829016a30c57d56ce478b639666f9884fa95bb9497976d978627e7f069f172d27bd1ce0e1943d329821b59b2db7656d276f046255317d0c8e720a6b41dd9ad4a9bdf5e2e46116c590844a66ad139203ddbcc8dbf336df00175d4748bd6f197f268228ead9aa9e524fe5d670a509f3dedb3905a0b3d821668b6ac181d9d217af36c0328301ef389b1edcd62396092f70985a673b17b3c8925340e5c1379519c742fe8f262d8d89f295dfc60a00afa94bada75a058f5849361776306157369479e383ab6e8d23e6eb3d45228e755bd5d273965aba8b2437a440514dfca9251c1990f623a6d140f3f78dc3784b54ac49a792ade5a4bba5f87f56887afdbdef2528c3cc64797a4315aa0fc133ab2eff793d7354877e615c2029d28263eef5f32449f47d0a40e8c8e0752bd4e13874e3e8f6ae30bc824cc523363cb5853af1efaddfcb9e71b7bd40c8eb6a550d7dc6f82d859bb8f16aae5f96170db84b8c3223367c81a727286829536f53e814e5858a9b4cd463d28236b9dd6ebe01433d273c3282ef0db72d6a0104937104a3fa4139d6cee0a7bc8356328d8fd606f8d841a946954c589e31435640da3a1117468a84447e391b2bc88d781b0cee5fd8e831e8c716220e48de74a7bcb627c3fb34b1d888fd5634bcdc5ce90a685f626fd7487958a818a5437f8e63cca9b263dc5f57c508aeb06acc394513d014b1c52a3025e96fad98a41abef118f54772872720fcd83824e043f669c67700b47dde949d3aa760a91a813af73d35caf1e0b458141160bbd25e56b7e8618110aa2c453b58f731f02d16c320c2c358b24b75720bc3261cf84992f97d2f96c08478356f8b0dfc1782ac35f078ac33e05fb6b926ae98bb5b71ed26c2d2b9e6c3d0a131d41016b9d69c98c08f8f0e0f7b07c61468ad1f31babd5f72394511d1f999b79a09472da0eda2957ef6e082a6675efc2faea3c139993ef31dd340c1d8e0241de675ac9d41db3904a9dd2984a953d9bb537f1f2933a57b5a721752446bf61456afbfccf03d1dc478d998a69e78ceec9638407ba1a03e06f8277bf6042bc9fef44e3e04c0c323e96496b0043aa5271c1f369945d50fe1465e9677a89b68da28795a770089a48bfc4a69c9aed3beeafcb8e6e00a4de32dcde057a0e674d38545584d013ca531c481bcbb3c231416b8f2f5c1cb4546ca72124fd37e3c2adc79ca13ae5305bdfb5c2e1e138dfd565cef83484fa1638a166c97dfa2761627e4161b2df6e3184e71b135f0fb458a24e21d4232f918f172676bd3224d0f10f69af8dd19af37d0b135725dd7eae9760a46c0a44846788b8a2dfe68aa2bcf9901518074693fd7cb80a70dea355ae03d711b582dfac0667e4beaa2bcf9d73e3ae2c84b759f3139655756e28f8bd3c04ce3b06243ccef6956322de73473c7b153153fc8552e2be33a8fb5aea26dee1020fca66d8a313bd7bfd7583a83ca85ef9e1348659788785bb7b453b0c73df24656067de865ba3e5807a60a2b1f408a4f585772d1b140bf09694fa197528e98e968aba7416ada5f60ba18a4176b885d373e7c4f6b36e95872cbbc3fc0f8c23a6fb556a3270e14176863b9c6bdfcf4775dacdc1eb09ce4ed3e6ba48edc1e9b6f4fd8820207c3fa1ef58103d25d483751192001913067c5e5b2a5830f37385c90004ed8345230eeae8e9e816793d1a38300348727690bfeca7615c24170daa8553794a3ca94b9847eaa18bce6e02ddb759956c751d90e12040f48fcb60789e1274c268f254dd23de7ce8c10e0c0b141b14b036c90fef2823ad49b9ced69aa997eb490f4e4fc2f8d72626517e5c40078be9bc6c165493dd1d76caa2d4815c153c417506f7a1e05f5b70c304c5658afd306121d706f566473524de11866aa6282bfdad179652219f92e327a28c30cf403103473f3ff94fb0943eeccf8c98612c89a75b08d36b6c02a306baf37ac3f916b758966c6968355e624c5ea58d13736781c7e6a255f2a8ceb661e5be3828eec8eae777252d4b029ac6d79b5831e4c62238e6b6adc5f2bf4cf57d0ecd6d67989df138503333a99dace8660bb3211241a4d98b33f1ca7098c486e19fe6c286dddff5d38a5f228aeedcf181167d05a5cb378a3fc5360d761b7e9115fed2df8fa7d41d418e6fa2f6dd7209b0247d84a64e217389d443360b30c13fa295596b89ddc69209c32b5df652b5577c9d7c471cb1abbef1c8e1ec38bfd7b70fca420f7d67fb7bb3905df89135ee046ce942f60fdc1d90ff09d8d704b00622e4075772722dbc01c75fcb1ed06e66370970973887b6bf143cfff0a077eb97a8aab35e3d7016504cce973e75b9e56219d99b43b58d29d86f2f12f0ef9959d270e8352017800c0183509f7ea557832dd266d00d16281db2cc61aba26b73e0fea326f765a9a8f715cfd3e15357af2e0e893878bf03617893515830ccbd0c696468ed60f49af2bdd557e1c48533cbcf4c67d5fc1f233f23c4269e0b378d6cdd4de8c3d897936647894401b0dbe0b24f3093c7c2f61fca068d74bba2ab829c22ff4b33c7143c0b7d79bdbc0d1f076c94023596340b9e0a093563355ff044a322c3b8c295343ce947eceb9844174f02880a77c8b928490815061a96a9cd7c89c3e057faabbf3c088e2cf51fbb8c617b128f7fe7b813c8cb1046c265e70bd257efa051626f7de371387f04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e404d0c0c81368734820ac976e0c17736836fe4ca76c88524f5e3a5b1c83e5980d003b7a7e08943e3ce1eaa7ec904b376ecb972db147bbf79ef0ce6b756b3a0bfdd8342dfa8df352f803ea675252c7e45e692956d70362290e48577102c91eb318e56177c81414562c0f325229e42c2ed9980b547310098b0fbd7be84f1e021200c039c4615b65bc3b8c38f4eda4c66b42c0d3a3200e209225c8925db4da82cd27e123b0509465f998d394cc1815552e3c8c18cf685e35b2f302312dceaf2f3900d0b5b8008f9392d6adac4433c626ec19423135b670b771d9f2eef506dc55ea1e1776380b8d8d1c77530609cb37da298b9bb38294f624534d03123ff812a554f21debdcdc1ea0faed6c286938dadd6ae5e116127e4f1adbeecb416b1cc28c0e0f6c6d02fcc38dc2cb6189ff272fbf24dacaef81ecfbf98011a3f302ef6c7879d87b9046e81c81e873dbb147f0c6ddebbcb1963d6b7d4ec46835bd93da80f93cefd3ec15187a4bf0892324b03000e8240e2da0c17453993d54e8f79a88a09cabb7fde6fa187d4a5f7de05ae45f9e3c626197a59a921f573f6a464783543bc15ab361f7626285eba9c48bda40f9df693b39980b453f21076f1ad613ead7c315de8498c3fa8134ce43ef9e19427944ecf318a7484de6093830d900e33d7dc6e88b8e1aa30efefa60d2718f9e85687f364e614df30131585819476f3c07d0c7d7f642603b2c265721c9dce8d07641eee381b5d4722b7b6ee5acc86994b65b3662b333f1e2eeb1dbaf9e943265919004635179037c195eed7f5fee9873e587a2f736f55830a30be858c539e4b463dd6034224d334757462473a71c645ff1e09e23e5e8fbbb05af1dcbd2208853697472e46884ec8a61bbd46116f465cf87f0786764a164d86315dc674a0a85b91f0fccd2b8c2b7abc53a5dc623e91538f431c24027911c1f67cab4b9913a755bf109cebd8788fd21fe4c2121527ceb22e31f1c3ca34a9a06605827314c42cfb28bfd08d3594a4593896beef127226023c132e6bb6c2067040928b47cdfb60d635c540bd2a2792966d313e7b4167c0c921af7b24ae6d4fbcebec6dceac006a6d4ce993829f7b8112277cedbf8b4ec59244cd7ef79a7bad09cfdbd1109a1a7348d7f472e57cd69853cf4070c2d66e5ce20f37e2eb623547e154265f167d92a3f03caf84eca981ffe3cb45728d0c10ae43e9b44d09eee346cbe297bee73fb021ece5df72a10ec4df4a85539926137ce23c3a0b685826cdd150e1f4978bc6bc16c4384fe30c94e6600e63328d97d5fa21566b05dae0f33a11f6b906910bfcfea9019fc680342131a9b9cfa9f7e838d29317e26a4ba93b742d48d295556ec7be032a810bf1219eebe3d330827f1f264b5f09080265bce8c14ecb95698abc11434bc745e7dddbf45d35e2ee83cc4686aeaeb44594cd20e06a9c096849d9fec1d6aa615522ec6b09cfc870717587643f43a79f02ea2edd0db63e89b4feea3bbfbf487f1884c7d8c789c304201f57823b527352a5ca2efc55ef5dd3e251647bf3464ca9f6d5162a15d24f27654be5a76123395598fd7584a25b20705807f0c645b3df6757dc8069daf4945fa7bfd9db99fe2231414bac7ddb44b0e780eb35259d4d2842a362ae9e0035b9374f44da26cb2a566d0a7b7befe8f034c0c1c4dc9fe35d50c1422f48d16edee734c3a29091dff0fc915a5789e3b1a8d58482598c3dff2b7e6d9d0bf5080c3645e06ca1a423be983c2598a57f601db3bbba2d73ee06d9ffdbcc1abe5d4dc287fcc2b209bee54e6a3fb22e2e046f165b0dea29daa90259218f68220f29a778173362fea185dd78ad2dc083bac11784e6f49cde56663968d8c1c91ec7011f16301349b632a21525ab2ed5ff115e604d9d9759b4afcdb4ec6e997574ae8cbb8418c4fe4484bc953baa687b0afa82525ac81fa813ac857ace2940f68e8c7385aa176d090e5f7c63a4f306390c3ed5f693afb31263173793f752ded4d2295d85717736f37e8b8a8946ce2e976da50153e0997c1e0cb68a084e309a95aa4df3c2bf7e4843facf8d0f0b82091e95f7ab712ad0a154765227e0ba0d9dc37dbfdd447e76cb81ecf52efbd959be55edfc7d59579a4b3c09b2b523252f0fe5b248c21394a5e636bbc314579a9975c5db7c1f125140a25f2ea0ddd976df1784b3b04b38eb54c2e9cf02e72b358b58f4c83e39a4fe09cd444be2470b9565dd27e7bf1fba69ca87229079517d92778c6c1d0b7218483ff573ca419ac169098a56b63ce7a1f8515c6966f2f85799a53cb540ab72751628417511857f01dc13469a88f14af57f2f6947b93384c0325c8e559be6e2c34f0edad18a769dd5d5ca3879c5a4f1bfe5add743f1069ec145e6aad694846a0bdd37e70f9bdb9d443d78897dd51e83071413cee67631ee60ba89b9c0954cb154a7ec91b8ae7e2656fa63602e2127a9d3f3a975b6b07c1ba7798ee399050760a6957400532a25e114f5d3e6130f870b2d6ab6f53d08b1ce9e6a3d4feb4c7d1e098f195b6877997585161243b40805501c61847603e496ae4c76dd263dd27694867d21cb7ffda28bb246679e99756a20a9c0591f8fadf564b983b88f18feba6a2447d577212307cba16b191f4bbc7e25da6f7e1869cc9497ed7a14b3033a1047ecd67d88d55392dc5c6e71f051470904b9573b8a19a73bf0f1443aba86ee42d3e410612524f50967eb38b736337cd3684e5ed79d27a8b416ccc772cb298016b716dec877956f351354b0331c7ac5a3f7a06d9c781c36c6b386ed030e7559559b8a29fca5b02ade89a1bd2cc7ad894359b76dd04480b8386c289d37acf1e1c72647d743d8fd8ecc71da49ec62542f79379b44bc28d998d3ebb8bf54cd2680330155d1e6380504c672053bb913f7210e3955dca84db13d5fd8413aa3989a9f62d4bc002cec4ff296342c7bdc021fc6ca06eb1bdcda8f0fa4dac8f86c36d7a41d46844b5f1d63c1026056f09d595386744768eb9ff8fc76699a57e0f7cf65f92affb699c5f2cadad39e8c84433d1cc9d6a3d1333bcf7fda78c0f5da8b8aca0451a85ad4a8940ba3d095d51e18d801f7b6c330dbf686a0a397f3abce718f902f5ce976e34e2aae86c3ee39a662528a78dd4e8cca1946e7398fdb80a4f2073ee1116914ae00dd3cea7250c0056ad33fb513edeeeaeb36dd0527217c44541a5d813ad13b1d05d53c37a76473217882a9141f485d22b67f096d296da797dfef74799dc8f418a73936d428d259e3d3874ffecb06e15ac048f3da5b660a83ddaf0b3003f746872c31b22bbd417a33c50bb9dcddd0827a53ba24b587b5acf19481ab0e33053952dde739a33059dffa943670141e4d496bb5fd2364730295ca4d8eda7bf79bd561028052a448c38f1e892ffb1056263d132e387851e8f4cef450fd23df1561239ce3278696cc279289ec1fe2364d02675b0893ace2ad335e59e5f70ba256fe2aecc7025ce2852cf121052daef0ca8acd2b893746818c684de054a41c2c821bf237f8395cee3b7bb3d01b82e6a59766796cfb4cce954b3ba470e42bdde6615f8467bcf50e23b5bce07d784512bc7a3d7304a4f9cd86b3536af3dfb5d636ba73e7625c5efbe9bd968110629fbb9f3cb7c1ddcd67cabb8c59a7508b69908557fe23121f9baaa919b19d7022b868b5a5 MD = ec4ae4e3668035491074838888491390f18c964bbf2aa16f44f76a167ea90043cbdce5fe79fe09c2e78cdb1fbfb8c3eab143299bb7ef98f9787a4a9f94ca413e Len = 62008 Msg = 090d8832d14f33207b3bf973d374be0e88082e7b46fe01251f2e7dc82f563d25806932fa2b2ae731c0fa0958e8ee26514925b54baa5957f158b35ce0c8e4895f7d71184a2c4e01501faf785fd71bb75bf5c2fd165b10d77d8e829e0f5eb94194cacd440b1ee309e45e024f6fe722f89554860fc69f4c093288434b3c3bfced2b2d24be2347108855469a9572622c71652d1af241bf357678109d6c4fa5d6168e6f1e8c7cf0fe050a9f20524f8e60ab344a25ae7102f2a5b8ec38082fe56f43245864b8fd60d5086d313b8eeeb4e72d6b71504c3cb2ac1e58e5bd27c643eefc55af9e4a8de1bc19e5c39452371be87f706b43d38c158a6ac2c3d4d1fb067bc9893e744816b9dbc1da1fd2a5120d8c2aad00a54b4875b5105c4e240fb678403328cb8cbc7f315b87b40b9e9067d0fbb588f71fbd58185498904e56e8dfdf62c19a1f91adb09164f4dc50a01a1ead5ca86b1a5830a447908bc58a11655f840cfc4802292490211d8fb8b67f4b1fecd78cbd2ff9ac1349917062cbfe8d1caf646a983bfc280929afe0b104e42b52d596e8e6ffa9398f687ecfd1d9c568ffa89295f394b3c102f0426f300476c39fb0be444e5211e000ea7f31797c0dfef0b6bf05c2d3f6f764bffcc59b7cde1aefc47a285df0d8a84c18be1cc27c7e58d82213406bc16cd315de08695b35c338285af01d7ba0a79a5c3a601b14a0c17d9d35b5d05826be5cfe958ce3d9f7ce2634ba48aa102b26bc189890b3d7b17e752934ce3defca949b072cb1bc7c89a7ebf92cab58845afc186879746e73785c49626a850d9a74949619ea9e7babb5f58f61f841ae3ff3d2b6352734d351ba0400321e03cac0ee69571a187ca8d041601b53653134a9be4f9c65e8f96ad7421ea280976ffbc8feb9e6f4fe72cb52f69296b6bca4722a851cd4e205ebbc6ed75138331ef2291c6d2d498de4a96d999c30087446c1f12b0ee06692c631507e4045c835fbb4db23026c8acf1248150dfbe57a7448b138122244585f72f4ae7046a35d6d76dc9945871fb1a0cf784c16da56f29e0d9bcf4989f0b430535b5faab113fcc3d793eceac2edc4ea6561991c032e7bdadca83f360b8b82ecaf8fea96493caf1f65005a7a7d7fcd941a2a84873c131a10fcff0f4370bdc87dcfb7d79bd5c77d69694c6d5d7e7cd38637fc95bf4eaed928b6cac7d77f3090cafbfcaf201f5b6f892b9eadfc8e8ddfa803fe552c01a6bf0a522ef0590189e1bb7a86f98feda18b68f31fa1bd745af8e2c8594b361ca3d49f18551133bf73c438967c3d4f0841dbec09f6d109fa8a261ccc340046694f21cd4f67b2cc7e943f29950604c838e267feb44dc549e6c5713e59b8fac2ae4fad7d418b5b8c09945d76c04ed462442c35873e4906e301b5e230b50cc314b44e819834ea95db271c23085f793885f6c9506ded141b41130080da285ae3a243f2a30471ace7219fd49bc5bab2b599145ebd9a0ad68cc9e44e5424fcc7e0d623e31dab40f8dac63a63cc96181fd506679685f4dcb6e2e53b4864f7777d44171bcaf773e8f6f532c072be63c3e81f34b716b165addda4fce195ba39e3a496ccf44f3746b3d0c0cef9a87a1501361b8ccc8949d4c3735a759fde5ed486635f5f7619e70be7abc300acae07921b3152746d955328689f8cba3bcb56aea9e3263769d10eaacdb28731a32b6dc459004b5564e2d94be189c3327d03acb1934c73bc951eb50aad0a93caa4c8b59202cc8e987719e224795a86452f2f68c48ec5cf56c2a9e315cfde6f31782de6e360bca4a36fe2779b773a5e5b17f690cee076c06db71aa0b27a54a4d0e70108a1b9f914e013e49f982250d2dcff012eb9d288d0693d18f4c9f894b90eb8ec24b356aa66b52dc86203c4c56a30adf8496cac2387b21c4be8438fc73652b59840017ff8238c8335c8c4a3c0aec0e981eacfb66e6cb01c5c83068815a406a4aa67737b0bd2ccdfd4dac4076a27f27d4718ca389207cc04f3cefb2ba589914ecd9ef1940afbdd074d9fe93aeb5c2f2ff0db4579b7e06c9eb7cf0abfa0705b7ba7ef63101d2727c3471f1c836ad5e0c9253b28c20380fab051901c8e2ddeccf2e061b1386edc12dd6b6346290f1b6b118d415b5ba16edc03681917de755d4c7d21fcc35422a5061b60724d7504b53ad0d1f4c68cb7327c5fa570e5f8a07443e212c981ac64076b47ce551baf6e2bb3cd985d529d6e55408cb09f6c24d5ac19ea5acfd4875a8ca9275f12961f780640d28b82e5d5ed5e925130ae96a93c8b365da117a22f2cbb2884b9b3a80c47cd48a5526d687d5dd5d977cea349d1fe9b020391a7d5ea031c5025843f38c00608330f9426c4dde5427cc731886fe24364e6a4d089530107388ad469bf2d81db4068d8f9b3df3dae2ee5060164ef25326d480706c506bc5f963c570f3a7198eefb51c82b1ea3e5df217bffe840b1e2f43e91f5dc61d46234bfd07720b8eb4d68c455a7cf6ff71ca1a1a6798c239d61b05f2a36f967a73dad39acfc414283e77120dc3c90acc22c1c38ce3b95159be98f59799207de6693f38e3aae1cde21b030994e5013dfee5b776d5b0eac1f93c3b9b2e8d1abcff9ad2d45e0555997adeeceb614ab030f62f2dbc8b5ba79476d3855f5deba8f4147d384e708b8a0720fea73ff9415064506386fd24507a397118e8ca7c3165b3c3a4c20fb19a0977930ec45fd3756c488c2775c1271bdd317670d8552feadb7c9b96228097bd5e9b3f63b6f376535e7e07ef5c911a2a3b0ce58ff697df94749eead5bc49a951f3c284a211736877c145522fcdf554182e3c4caaa5fb11bacbcb5fc801e35d14639e115e4668003f1f5f096d2c568b4221301a6589075cca3b6268f195b62961187e53dcd839f435d32b8c2bfa4d2654be98ed54f235174f6df484e6ea6a94d49ce3cac24961bad8773b68f0da419bac50c723ed741cd7b6be12321c625935cb6b8ef4831c97aab395ff0e302ecc71d5726b5c83a12724acb61bff16b00a72c20eb05fb3b4246a4399e70a8e8a563f5cbdc605dbebdc747dd0a25a4a3606d254f0f86ab8c29060050d93ec405f676aae7d879e4ad6b55db6b815c24b76d6eaf0bcd7b426aa7432646b86021a20887a474c20b444d43a26e3b716c57ef4e31331bcdeba71ee48480e3e2e0a506031e4a39411b67e76e386917805e27922c3f1748b6dec2f0075175ef00c53a7b0ec40600feb334c2139f32c556397bea2e1ec55a305c7b2738326d31b918c74751ff3f8fa1da93285b5d330d9c053a3d7d58a319e56eba0da1b0d072b6e033b3f55a5eafd1996c5f6efcd3b9faca4ed440751b4c7a1b67e86752077a9e256807225ac92836f7a7b07304798f17919ef7a0fb94bd9a6c6a01b5a178111af04d8bff89e9c279fc2d6392fb8f599c6112edc5747632eb67aba0b1248cffd248ca87b56e264542b0e4c0f56b7cdd30439200d66728741516130d8363ab0b6d35c7426b91e978381cb50fc1dba8e47c3e0676fb5d144bc181888f54e63eff94bf2c054a7b98240447889721d47b35285a56985edda17e97aff36f4c36aba1eeefe1187ab39d114e3946a13bdd5d9adb9f6bae246f37d73ea83df692da5cba24cccfc322c15e07bdfbd575377eb6d93d162b00789b3e1c5f744c694f5ab711dd5edc4e6b2e45cef9941f5b3e3feebbf7c67fd580ea1e16a11c0a13aa3f2670c2aef1007c81b82dab0c0b9b78a96d08b1b84f7764e3408dada75e3bcc0f109d7ac3f7227e4221ee7b6c807c0c439b8812f2842c4d0f0a492a1d2f28dc55dd61aea6d4fc98fae7d710bb68472295e102c37e043d63f4e511c18667230396f484065d72d6f33072b11301aa45e428a5406c64b9f2cd1c3aae1aebed74695cbfce29f2b7f8b66c2a432b462ebb78835008b4aa8a92b40f6fe9dc53a963352ea507c06c8da90a3677570193dcf4062f4b23435a5e673f53ee88afc7833890950ef672d4db331717c1b33cef9c37b7b2fd59c27b1fb797721d533d4e633aa1186264e83189dc04967020856356cbb296cd71d916b4cbe3f466142bf031b2913f0a19ca8b7eedfa3cec6684f6f2f9206225352f3205eb4c5f309124b5d5e887926cddbfeba4ad208f9d4de0b05809299f6c6b6dd7fa5efa3de293cea63724ac9af1786f58e2669f19ec9d42997043f4d409dc3a0d7b6e1415e6e2d1ca40ae27de01b183da205e9e623f1d51ba23eeaa8966503fdd7061c270a346d62ad6cd21e60551a37946df46f0ff96b61a57547247ea8f244ec1802ed5818785cce2cbc23b6321763e3d2fbe4d95d118c1f5bb7594fd60906956137dcce86c85ba4dee316485e6a530eb962f01679320b8e66cdbfb078c2b351762dadd40bf7ffcfd7f97e9d16bd757395ec192dfa7760610afcb0170dc9ebaedb46b91f1461a98dcc51b53b177b5bc0fcd9b8a64d4c1b35dcc6d30a1159100be53586f63caff98d10ae6298cd1e766562de6715de1a9c8b40aea0f0002ab107485ca00ff12d503c3941ff3ca42145df4c4c9cd3497d84cfcb26a26f66a95f1f593e9ca2be845e29cadef3ad292e4aad3db6d2850bef3471f0c14feec14f7ab2bc5dc575012f73c439b7e840e890154d9b9fa09191ea5c20460111e48c97747fc62cc2fd7599219a0a6f35ce5ee1063f0a897f9f77e93c393f6890e7351c0cc52b4e0d82685bf829b187747bf8bbce0ffee6c7f52a76855b415a357d6747842140141dca75e257d1c3731cf0426aad2eed4a2239262ca7d4f078780d8fa48b12a9216c3c1ab6d150b4d4a7b1d888541a5a2616d1f7562454c125e11e0aad7227baf8813db363e4f50a0e9d37079f3360ba0d0e662a8d7b4937f5093584dce9cf19fbf565fc54135d378376066c19cb70a161815c1c5d1d20d96848da7abd42873ace213b4211dce7d1f5ca968272acf894b6082a592faa8a09e2387358c92cdea1c19d342127b2234dc7f37dc7442837188d1b677d9f73d35e154096ab8af933c388e1d7160033ae1f6c8902b708edda81593389d60739ab5a5409caef6d48252486679a9d25c1d6db6603ebee3b6e4173acd9081f014c506330ec76910a9a31494cc6f52312fd3be646fc9fc9562a0a63fa847895082c812d3e71303ccd5fd6a63e688d4452365be481cb74c4e391a3e6b4be41f4a66abbfccf307e4f301983dffdc4b97d6e1da53a9909218d5e359c507deefaaa46874f768592b744dd47d73aed74104ac103a67d1f3e1c7f30965255b8bf192272f2da1ed42071ca1f7b3f6b9fff0818e598ee1066c2dc170534744af78713e9b64dda5a4d52442b91142ac687be2774664dda99123fd6d1468060c4bcdf718c8ae8debd53b09505bcb337f02749f4f9ad82fa7ba41d935a6f1aa6376b30b8775b6445ac89b3eac50cd8d56d111ad6f535e8cc3c8ee4980f0953c337a5236f36c240adcc41e4cc05fbe58181b7b9641399dfde50551d6b7b8fdc3639dd1ffc4739fe75813ecbaf252479daf29d9e22b133e89f5b7930740c7d047db2858ef6353cfe4b7fb2c10acf00f630243541797abe839db27db6584e5b7d18363118c36d45d08dfc507d75500bfb2f9b014bfecc744147f9d5277ebd95a6743952261a6bdf15cb9b8a496544bfe927cba40619230f922c96020c5de6d60140307b3f31cd832e62d1e2cd51399750c73a70086f1aeb06ba2ba6cd7c36772ddab02edccfeebc9b0243dc61cf9b1cb27c6c07eb5710811f8f0f15e36039037cc23ccf773b5bf5dc2845f9bf46e5da9ec5e4ddf767a08c3d09d4e206907b058e853adfa70aa1c972237cad2e4da63b76121964e5174746ffb8f19d7f8368f7c3923ef1e4c44c91fda23c69475a68c9c90f8e2f1cfc715bc82b09aae6cf7f44cc87cd98a8eea909cf2329d092d38a00181cb7bf077dbb3536ce619cb4bb4a96f9c44b267be0637b7704b955897f9678d3b83a774d21816dbc11bdd5620d4748ebd65c3dc64ff87175e55f8aa3851a9e9c606afa566e705fd89362f7870bf1e5134c55412093d4864c33a0c269aa92dbc2a3edbaabeae4961cd1f5758c5dc6f5f084eac3134284248a8e11af54467bcaf6f1272ac5fd6aaae95be9d20a6952e6141e615606e283c691432693ebef51e6a9e69bed2d3c8f08de7fb48f59c5125fee877d5c73ea5006f0f15432a91b91b94bf2d0545a1ebe3a5cdbea2012e791adf04e8358f2c075403a272eee1441d7ad5d845902c51a64b9f4eeff16ce473d6ac9d217de0c0b601cdd331b38a5f8705d7f399a7b06b63ef2272767e5e46a8210cbc0af5e1831acf74ac3ada4d6a61823f171191f9788998d7423b91fedd80c2a7678be5bbfc9b85a13575ab53ee12bab84d95982e00800e65c526727430648326a98c9495b4a2edfb75cb6ec4730275e89c0d027789af1976042068e9c7ba2a3187f54b983195cd2b74226ac87f997b770c6118fd9d8081af050fbc852beb806f0bae52ecfddeeed83a64e8859c3f930ea57922e8c35a0dbad2ddb76fe3604d893c9ff1b8a0e318abd0773026515c8755703d686084a5873f73709ed07780592622b17024a00e124b3d458ad126581df37496318c66cab5e5eeb2bccf70b26befc6ca165a87c6a66289b43eafa49b1e91b96ac794f32f5f554d89589555604d8c2fd32c7fdc729a95bdae93e7528d51d648a370a1b33d4f3798dfb949aef1c5a465b5fabe287cb78edf1ad2a1b997806b282775db2d5c4c32d59b281404cd9cdf7156c83df24bc5f5fadf44075f1f71f761e01e69e9f51dee0ea5ed1edd5c9ae75aa0de24c2478c7113e72e3ece8fed23fcb4b2736f6e8b144ae5508ec4058661287a839c20d8d3ab3419db718e4dbc97008d7b2348315e4c9243998c3e3329f8e4cb01cd9566644b645d92c625c3a6fa7552bf9ffba45e3deda70f42d54b4c52957d9edea85905f8ac9b9a651d5773f464ebc70f1031529063f9fbd610b6b5174377a3f7e2197f5a12bb3c77fe73ea2fd43fdb9c0f3f04ecfc21a57077dc2df0f6a15842ca0e9a1aa1a6c0244e7ed550cd38426e81353afac107553993257b85b7e304e4e8a11de05e426e9397e0fa0257bd46acee7dbd62b9935358ebfa697d8d25f008c438d25353788ded600021eb7bb72d7edc7e55cbecaee6f608c1bd80814f65d4e73d7f1c87316759324814b3400c400dd5a0c9dd633e583b70e440389a49a970d816ede302534200941f9a03afa5c781604be341252cef4eadc9ba4ae0fb04051f2de44fcdc7670a0eed7a83ce6a0a0206e7699f3a61f45847daf3615b4ec0bb45e82c08ef761e9e281b7ddaa74350b64ddc249eabc4ae80c47db223142824b9d1b18cb77047afe46b0f6bb04219e3c8c093dce77f3c67efae1cc138127377284befcd04592161055e320cafa5d2095ee4725922beb365cc8c1ee6495d15022f3b09b796b1ee7d298aec277dda580ba143e262f67110f240e7ebeafefef80df72a69121680954b7775a686c2e99131b8644cc10b9f3b547346eb94fefc02dfa8a076a62bcefe1318a9c6ef27d867c2cbcf163c0a501bd38c3186aef25f1dc26923983b7ea4111d34aeb62b53b1c108040daa9c9b8c9ab9b43024fe813030fc623d3798b609b6b0f20adc02f07c864989a56ea8655c9f4c12cc2d4e547622d6bc75bb867c06d5167a47a23ba33fa0ce821fcc2a11c713d6cf8c09641239dd989f538dcd78a25695f5ec6fa01604f6df18042be846d6dc9d12f920086481488a3260133551e521768b82aaf7f1d270c372daf2acad90e3ea0499da04f2574bf49e23b686b0d71e016390bd09dbb2f6c4ba2c8b3ceefd1004ccf7a01f63c2ce1d0a25de873c81367da69e0f9e7daa7028157f5d60b0254c359498d82060cbb94e9fecf4019eea4f347b35087e7fc5c638ad5dd0e29b117dc38106ecd09079f4cf85025ebc7d1a526c0bdc10708808e13caa4d4c8958c88cf7bdc842f79cd468e8e3ef8680821a286e7d1b8f3d407da77c34d8391c8f5262197066445d2be4fbe1e139d21555f1b782fa7aedad512b013f7184ff64e7b8e571c16858c9e6b29601a96aac429da7e9efaa829288601ad7cf8cdc06290901ff46d957e8047445229160097bd00245a5ffb4bae79618531272ab65b7329d3597e2e0bb5bd77fa585d9319fa7882ed2d2f841aa529f1edd9871f7a978494a5d958bfd1a1907acdba92142b3982fc6565a2378db3c6a1dc05314972fb234b87fe08a58fe8a5fa5ee74b1bbcdb59075da24c882d40ec0bb052aa2b37fcebc90a662271aee16a612e6d0d0c5766872e164182f861d2e69a0b30465752232a97ad702a96b7325a39acca4c88834199cb2ff1e9fad3f062d75d2cba3039f48c31d1ca85a72141f1fe6a7d8df2b922ed791b01e621fc1fcd4e26b66a5857e77d2227c3c8058596ce29e7f535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695cff8db34727a01879acfc8106e7e92228b8140784bfedf0aecf4e5ff09f5def47c3b3e7afdbbe0fa00b63c3d9abe8455c3f1258baa98a0a909d85d15256a4d94787199dd5950cb5ff033dee2c2eeaa02a3af33c724c3c25aef953c178ff53cf653308fb42bb53af9d7dd02d88d7b7db999100dd3510cbe90eccfe57eb043078a8b0c6297db75ba8836266a67310169db12c81638a5dfe00bafccfbd32cb047d18e49b500eefec46b79845817741d18e7bf3bef6fa9b9e0fba730e18d5be9685bdb8d1987ecdce314309b5e71cd0ae57fecffebc0c3273c1141703935d43b039a014af2854b7c8122e9b0000e92676a043a68be0488a45bbd2d2f65351c41841c8e17c291817a49181386df366abf0105062ab88360bdca8fc8b2e8339a897443d0581c25354285543c743e91bc7e6502fe9a7dd5f1e002e982af4499e57f5eb086a061c8cd61d077c30cb0991e31e08e825c7064a2978f5b09690cd0639fadd30f6525e4b054a4e355b4d7c4f6562df81fc522b7f960da64bb94a38fcb66ec2bd93afb1184979d375301069ddb7787d0458927687cb87e9727a69b205361844b828633d7c0a703e44975ef9c43f288b7820cd0de932ae652cc13762ab21c109289db729feb0f836aa787d538b673cb1e63c4c182d3149c38176fa7175df31b915daf39e27a3d963b0bbb6a1ba967a96559357c0dc3222aa7982fb07ebd830fd87c65fc37d4bdb6e5d485108da33ace3cd0f352c7d9cffc31dcb824a9674867d874b43c18a11c6ffba0796b272a8983f5797308698d7a9b6743ad765fd1cfae01c50e6bfd65b61bdcde0cdc70a5c0753f9148ef3b54be82a86b7417ea93656ce4fbe91e6e7927551a0bc3d6e2ab7c0c7bd6c989d5d6083c85c2b09be202c60f1277b8c5e471fca623b812fd05b218d42ab8896ac177e4437fd7c784cec64e1eeac701f4e7e682899a419eb152402346cca50d0486c0df11f7194d4519448a070e68592de12d7579ee56ab9640ec27eee22ac8d97e375532ac15965f4a13e671ddea32c388dd31e18065ee1e5a0c93370bb8517c4041e32fef4b5755e9ab0fc9d9bb0368177c347b00ddcaac262801b999ec1b4f557705643128f4ab6070528992595f8e45611980d04cb5e20dc4dfd12d24aad5365d486a224ce2d2571a5b3b9853bba87b424dad8f215432a9799a3825f064a05b5b08cc2315c66d35ff865a4c289c4921864d4b8e0a1a1051acdd3924edfd233cf6d2e4d41203de759660603e4665d2e0b395056d557c2dced4f56eaa6bc8f073c7435e85d02fa89e7575d7df4bccf83140b1459d91fedd59989f4316f84c7a7832c683d8beae4e3923333bbf87260b8bb42ea6af4e16918a5e17410b121c33b2cfc91f4d5c0441ae1625064fb7059f5884698312f857fce99c1a02e757acbecc04e76b5436c62595d4c7c21029e02640480e65591f3771ffe903e34c27726e1c689e127dcd786c68c597f9a17e4a22ab6569e7f231499325ab617c9a1001e44c61498f2a8e7f889f8f22076412a827226318656ecce2c30389bf39619fdf93a485963bfaf85ffcb297d285e8958eb62dd7a6883f40a7a401da79a42325600edd5bf0c36fa9ae5b4a66460f9f556232262970aad43b1c98b9342d376f4f47b85f4ae59fe900cf06bf70d8df0900c72db3df2347de2a9623921d467da68bdb2292e8e14c079c56919a4e27aea5f6222b5f7f1b09ad8dc8d7150c51f15959aec020ac80323beab98e53549ee906c417ad717fe45ae2d30925ba67dc1d08473733810c2efd066a8c4f833acb08abe8fc16a2580ba5ee98fb820ad6415b23b318df2c8e59f6e79a336792672897f5d364095aadfd85415e048e8ede2e564c4ba8358bb99dda60083379194034117521c3f812d826738b90b8adaed60f78d27f89d9470476f2001320d6807c7a0fba42b055536d32fb1dbf7c61f354414d66ad222cb6f551e838797002506266ed35b49dc3a4d39f768858e44de4df804e7972f5c28412db277979a5af11a88724680600a58fb1c8905beb74b40bee28f67b5f991d06d35f3a63b2361f3c95575fd1957d8d6c7e4ab2f8f5a256d0e6c7dffcd170aee7bd7a9b57a1a5f549ef53fa031168edd3afa268efe60188cc8fd9556e6710fa8f47a9b4f5d679a3b1ed098d6cd857494dac4c1cb16af6dc671fca01508efe7265f85921aeaf35bd1d34e4847f78cd22432ab468edc306c4293d367e33b79dc91446256be2ba4e93d44d8169cb613efb4c7187b7e5acb5c29b5e9af6988f734112b78afe428638ea8f9d4cb7d1302146d23712a44976987a260a6434ef65138cd9d2f6534e819903a7bac2f9114418977cd1f19889bf033d61b72ea3b8e6f30ee21ef3f5573ac381a51c60a81c4b896f94d8b11f16f4aa9ec6eb56bd85739649b402006f0d106ce71038c24f42850831b2c1cd9271a5d310de1d78fcc59981bfd812a82ac0b0d9a661a6445934aef9707f1 MD = fa933b224e0912687b04a51ddbe1383a5c1ccfd2c0c15a3aa8b40844fe70f356afa3a3317175b664cd3e01854adfb1e2a6e20fb2a4720d53c4fa9ba555dd5e9d Len = 62800 Msg = 97fa3fd1e776ca79582bd034ffebae7bc2141db6bd62b4ade507af3febfeee56649c411a2668e265f52c43775f4c0aece4575aeb5adc559f907fdfeb324ba459ec4a5c54d2534e98002412e67db19cfc66bb76c448a34dcccd81aff69b711371792d1ae7b3e114f8c03ac6e823c06b948f67f8ab4e60a41ae435a8c8ef154384516d023c91b83e6f7f97e6e417247f9da883680736bb63731cc451c9f5e23d7bbd319cb93480d3e48362fa442283e0fdf9394f3fc65b91bebe563262777d083f05a171c764e2dc3e16c48b6f0c86979ecaaf34bdc7e936e31212d4f93b91acb771e608cfe88560677ee520cd9dd4aa66630d9fe8000c5bc96021bef80bc432ca4928e9378913674603ec41c69d16243f0b7c18283b6d065af0ab78c5adbea162d48e9d680f31fac3ef0276c2d3f30a100c2428e53eb4427d09d78bcae92801665b41abcb42891fc6884e4829081466c1ac2c5687d288141af5cd7e6d89aa5bbd26699bc7e9c3e03718f93e6304203f3934bc2b76bf91861afab6d91853ebb6517d2cf6c3ce8745fee52ae1d88fc09e62ecfe2e1bcd789f6361ba253211941a09a8b54329b77b5504380ab7f1719c8a231b18e7dcc4e567de7200e923894c8fcdee2a0a606d4a182f58c14a14715b0b640a32de226b7fe77374b1ad5284bc1e8599b4d4d0b89a96688f7622aa59a5290d02759c568bef260bb1f4fa29c98cce19ef7a27e15f14d8982351c51cef24ed074908a8deecdc2c8c6ff2560f2263a87239a58efb2c5fe5a55d7bbdd0fc7d5e3827148a2456ef02e0f7d24c6c55e9b276be5c8e86e523c579851c9230475b8589e6c1cb8e91d0afed91bd61a92bc7f60ec8c8b1ea530a81fae35bcaa39a6468e2cd36f28664263b9d84db1f2c6ca57c239d107e8f3eba2012be61ef90bb40112c239c8773999aafd61a530d5ee02a4a9b865e7dde6edbaaa8605688617398884d311a12bdf6d31282994eb3a74eff6a60cbd7373daa1628a30f611e7d8a14d32f3fd91ccb447a6c884af39a7080cce458b4a53315bb13a1ed14aa384cc85bfcb894012c074a36c6d0756b491f3c38be6d89f0f9cf6a791d6db75a5e36f5160bd27ab9cbd8d2b0274262dd481e4beb028691df12d17df0a40b3f9919a3d8ec0664372980a6a28f97c6587220d3758eb88a159b0585bc223faff68eeffb3a86f756147ad3da847c1e44a15258a881c9e6635d4c5a52f1b4f54122626aa6e38be59059d44cda3d1fc5a483a47803394396f8b1189a9fe251cfa90c3c120c9ba4d9f94e5e740f981f93ce4791094e63a5cf31592a4cd6589fd3cffc456e962a79da7b3b41d2e15c2591aa344092f0c8969af69ca8f85e1b460b9c39a506aa57b1f0fd67a4efb950d8c52194d99b5130bffe2fc4bb279ff3ef7ff60d8362b2ebf523681bb051fd3ee13919ad86acd963c703c4178a5f01a84236c7be070b14afec7ca29f8d8217ece7f57bc96d4ef02858b19dde3e2bec01e638f5955b883a683f02943b620a6d2293ff302eb608fe481711a360fe10c8c8848d69daa4618ae195be2637576f69aa8d611f248a636b8cae2abce7f398fdc3c33e0cd50d1f6ee197b641da963b714b7c232ff511e69fb9c504d1b9444af3bb4c51c5cebb494d2fedf4cb6d44f5efcc084b4ae77219039a03a8cb1f1aae1277c6d17b0cd9678e943e80ae388c264af6dae35744d684fdf6111d90619d4dc3c1dac318d88d019bd83260d0839455ea919af23d5264b0f694966b0ac7f4ae6c5f3031837affa0dbc3729e1b96840a3765f081e65a4524573d3b9b1f99485a771a6f22a43a59cbb61ca64275b885ce9939829739a3a06886b9a8b4b91ec0d74aba3f9f635fc00b94ad7652c833bf2778d6fb3c1e779e05edd084bebf9f85af4f074aafa8335ee7dd3c88d8fb4d59a03c0501787d1c6782f24a78c21964be69ecc9355a5bfc5be7f99287dbf64f7bbe4d8c3c543edb2267ffee2bc6afb5948e8bc7aba86403df9351771964a1814f0b133356d74afcf73d7b8546d569da2fa593ca52a2ab9011744bb3e67ae42afa0ef7c4f40a87c70f8aced770f42f1ab6366c9ad24f19eb1911500d9725a793a74f5f05c1f3de8492d95fac522de9bf52ca7dffd4b8945b20f2c94ed46dd2057c57b4c0629c377aa8af98cc93877f0f2ae830c100e305294ea01c3e445b4dc6a1ad5fbb820d7bf27796e0ffdc0bd9536718eca7fdda559ecaa2b3a590f6001e3fd9c6bfc74d90342a159f0cd5bfdfd230e21a7a74a56a00bd80f44b6047d3577e645393d9636088e7b53ebc25ad7ad6aecf20020c4a2e974ec349f85a54afb885d56d01615ad236d6fc23d775dd90a5086667076ed388ada6f2197329277a887db47bcf0737cd852174b7256c550a88672f575141475f88ec95cb8573c81e108d8ae7c672043bbfeda5626db31fd1c7f3b358a72eaf9d714935c9f6e13d8198dedd18ae4bc9032a65168d79f143ccaad379d3d3dd1229b0e5597a8e1a908d679838764f398c0d0eae4f9e0fcfc7e279300a2e9bf578eb8de7894614c7c928c7e2206970e55741b5f3d8fff8f5b5fd7b31ecd3c81feacb50774d95528fee3cfee41f59dbf63187665a3a16fc0a1404f9ffa92822026eb140bf2ecf0e1b09b055c7bcae561523c7680bfc4de2b7edde3bc1c99770470f85a6e4b35c1112216c14b380d0aaea33e9042fa60b74a3477589a0d2877c95d22fca1165a5231d3f5883cff1289f1c6bd582eec0b778762ab02bc44e600c95c197f46cca100be46a5cea44991cfc54d3732a6fd3bbb7da9f776854c489e9eee3a66c1d6c06930eaa60903900158b3972ac43db667ef975acb28a79bd6cdb494042794dd3f08144074cbed7ac7c127450661759026805ef5c49d75ac070a94ee154652485349e2d8a08bc4627b75aac758aec122ee1a5f1b425982055fd1da4cdc576c90c3cb2723a7cd2adf9302b8aea010b2e72519f23be2c14f2047bfdf40c7bf565f06e85ba20914834a84d4cb6b6b1bcd45620bc2c814795f9565212e5a7602a1fb734deae422d6505be7887d7e184472c63b6c4b5055f615cd2eb2420a55b5c20ebf587f5aa397245c318a2957461f35f207c7f65535ac14401acfb4c0e53d48f13184638609eb71f3d94669a762f099516d8b5e57222fdd969fe5e12eb32db95b807e41f6a427cb9b6569b8befd8d1f5cb332ddc6a9d5d42944a161a43dfb75a61292951d20f093bb5c50913e74393a8c9f6b0f344b529a80af6ec0b1e42b00596e6dc77a0eca5cec34977d8675897d6988706d20751a832516ca58e844310bfe0a6c738dac09a9a674aaf8276ff24a5be50f720bb582309f3120c4a7eca1dafc5d1b03d8a752ec6293077ba1d208440c5b74b8568b4e2547852e8e813bf21fecfcf602eb7f2aa7a9164982863a3fdcd3526c9ab174c2d3c6693000f4c0a62d386099fb26a1f56e0284cda735070d87594043a37d0084ce9473c1d682f93295771e53471aae4791d75510443ec705d5f6cb966d499d08682a2b7079ac743bdb118cce9147f295c5c00dbe0424089d3b444ad15287c8c2530006b864e1900680a03278443f1d648c35253341653a4849ba5480fdb80246f1ae8c0622c2fb3708abb5ccea509d3837af21fc9672daab63d16f21b96ad80ad69e21e62db10451e58c7d58fe3ce0855aa68a967ded781b2c11f1303010c89264476ed5004c49cba9daff88fa4495e087b3d58d5225813c05048138dc3a42524d42d95f24e54a28c80fc2f959180bbe314f893dddcb84627121a5a82847e3ded408e7e1062c73ddb2a35e16b527d092d9e21c445b40004312e1c50a9eea0bacab1221174e72557f1c3e275d78e482e2f404152d651373424cdd75dcca71482034f6fb4e58676d714728b55a2ede7143123dfa5585c65be4916d1eab157e27fe041ffd02ae7c3a58d5fb9e8941964a17a6e8325937c9289e832945d21a71097a9b05ace0cb113a9a4b3f39674b7c6bf544ab53a4f5ac77f4948a820e43ea8b4a5c30614538d6fcba096c2c70c72165505dffe4c539e0c87b3819399c2c6b1bd1da38d0cc722def3cb2fade322ef5b4ad654e5c368ef67897005df3283e4349a5977771d2f1968096ba73c527fd99d880fd2f30756f5e26ec6fb1352ee423833a1684aae551915f5c925f77debd6e5f6f880ae80e559841cfe8bb860cd88c5703d9e9029ffcbee9f2dd267ca2d8e3a7cd987a096dcc3557c5fdf55c6e65ee3397440d0f5f6d6faefded613a20faba402f90e51b205da5e76331c72eb016a9b769077937a02e442ce2658836e57d22b70a13e483a2647a6f3c06d9837e857f40fd76a6020ea9acc224b804094ceadd8ae193f0d9808b235d950f84d1262cbf7ec9242bf4f78a2a2d59677d17e3ce4b2a5a938283273c1141229e51ce4366eabf50826386f72a4cccd4f65be92691fc13b995122722f1f4a84935d8a152dea1813833f54e8a14750f4be72903a1c050e5930b481bf0372df19d888210d0fe4462c49b49a22cd3438302bc4cedd1f3ea0e8b786d080b863dcb73f8d6835a4073e29a3ae9386be138c6bdd8600e2387380ce76f2941f169948480f94e7f3b3f807f3d955c57a3b8b528c1ddeafb3304cb4f5b51d5703e5bd2bb391c727b00662a97033d0ba670e44947b33f462b7ce704643bc32a094ed768ee00d4cafd563eb2d8af948fab6fde7592067f1a156dc883da2d257f83af66d78b7ca4b07c8933b9a2872e40bcdd11caa6300fdf4f8203ba2f941b4e65dc749f12012edb8f35efbf832e7cd7716518a8e2c483fe40564327c2f4f73f26529b301032b5949bd8bd34f8fa02ac6f747da0d6385e0f8e56e14d32e45b9a4bae453b1485eb8428de46aa829e5247eda79b32ff00007b901068ab0dd6bb185c4c0d008d7f3322ccd2f690ae7fee32926b1befdbb01ddadbff63c1a2408801cec85d30e9832ee8ee435777eb1328e4e43b5a37eacd08a5e8805d119eb6551f198fa03cc746315f03abe3d0b6fcb4e76994d09baacb43554c5faf2b51acb4a8d31e8094951cdceda379263b9090f4a28904398baa1f70715dc9e46f79a80937720178c8e19b942d5437890906847abec905ef98575df272b37b976e651cc5537cc4f35a1b26f9968c6396c9972ba984a0165d4230eb5bd1e3c13298a28f9b8569c58ac8c0637fa1c289da0db10b23acb4b21d09d56c0f374557308ec074ee35bfaf99857fb598d78d16cd45e2b75b8f6d65a96fa334aefb7e9a2ba13d712ffce4dfca1087b1c7c04296eaf2ba94c3b540ad7ce428f99d96e5f69e8077e8e3338fc2770a96dcaec48996bda49747feb6b50621f7e51f6da22218e3ad1e60aa8207143ad41b8a907cd872afdc07256efc60ec131b561a91a5a96d95778f5cd850e131700d94602f51a5c74bf998d1970eaadbdadefa7fac09e2614e8049521f38a4a6d0f78fe1cdeb78111c8dbab0f9561961e3b340a31f4763905947ead4c1a1d7e0b8526c841e92d5cc9c18eb68187b230ac828d7595e06b377604ed2597214e17ba08eb8cb73e03576452bb95b76d65e22f2b01cd6fa904892de059e54a31a67d4240d032c706c1d9a9226930f97002166edd99fb077aca95f2cfcbd4ad71ac196bd7dca3b969f04961daa06f8fb8123332415ce7a57944c48f7949dc080ae851fd7218c5d58e17115421683ac06c1da143ff527991cefa7eca87dee4a223e28ebfbc8a81639ebe984aa0ca79d6b5a9c769be839a12a2742c6da18fd5c4e523397a5a3cc0aac06d460bffcd1417ba400f6c26f830721d3b343e6e6695b67832b8f6f73668f31dad835ee57af3cca469e013e0b824f766d60006976a0dc0039775fb397e6286dc05b70dfad7ff3c9aada22794cb5feaa6cdf68cc3a3252aaedbd651c81e97ab27fe4adee7ef1eb1c592be71e93ac89304a9809a9b1ac63ba38545bf4d1eeeaa231ea59a54c739714ca29ab6880c4639a9f005f6c7d6d63c071d290f70844ecafaf02e09e86939c558659fc11949c325bc2ded69eedf3e75052bea07d85aa154d4f94ef24cdc04f51162355943f926a066e59fbbb83ee72ec238f0702ea8ce90d8c36d1e282884499e21c545ae2557f0cfa285b4cffab8af69cba2111974bdc62fd5f45623569f09282ab54e03d53d5d1eeb061cd81b983f206d6ab442c8563e00b74960e56c3f7cd6066f3cea0fc2317c498aba7eaa71280fa5af1f50ab813f74f2d60417754bebd13c59d70addcdb21043795766ae2ab060fbda1bec262613b30d020c6176ab9e4054dde60c46472a03613cbb3b2fab2038f75170be3f2d00e490343e6a7947dd4cd66233975316df7c2b39aea336dcc0c2227de66d007e4f3003d664db8507f01d4b5084540a231aa42ad9f846c9a5d72303c645a2710148beef4f445ba3d31eda3b0ea2eb755622a2e58460cef3eeaf8623955404999f32b7dc07a793da93b1ac2c0655039c97419fe4a3b0e0b99f8e110850dc3c803e57425066542a322fefbaa89f644485cfbdc3b09cae2725a0bdec3c61a5f12ec7fd88d5d415c9b38f212d364199583ae4df35d0d923483ed98440472e77ccac236db0f2b9b018669b8e2c5f54bae4c3c0ef1eccc0d6ee0c322a35af211a750138efe3307deebe523c80e0a9409093264935a52dbb91bf9894f9f2fea0559335f0ca49158897647f583d709e6ee30a6d69f8f37a311a63e9e537a0bb15f2ce513248092b4273b1f6d80e05c6447bf4a007822f3b8a3a83070f2d666fe7b7d05be5af4cfa14494ebea53bc7a82b1ff7c50b1982f92db9c7fbf8236da17e6d3e5ef348390964e3e2dfa50cddcc8c99bbe65c06143a845fd6cc8a60dcd942dcc35f435bf9e09b071662c2c970bacdafe90ae4910c89f6f45982ab2edca09bcb0568bd30b307227e924ee3b9a7fb582a293a8a01936beb3ff72645d3957cf103ac80490e90075f10fdabf025ab1693d1227d36a0d06acb0959bf3f982ef8ac4d61b0cf3fb866bc840082d055a393e86e7ddbd0b4ec0dff1a265581c5d099346fccff370952afa0a442da6d91b8fbbec7e15c41860edced3a07f1f3a2a2e9f131947569b5866773366cbbae2112d47ca6f7096f5e5f60fe31a4997d77cd6f4c5d611a4e8a7e189c03252d7b4cd8a98cd167e9438407209ac6a458078b78b3abb9ddf7ccd25f4985d31639bc5c33ff5510d804a53f2da52ac3b0337927cc3e770fae13ccd35483956ee6e659974a603f2df3637ed8f97514ee6f34bb93f19719257c7637d7824d349b3e3d3b464653b2ee5f0db497941ac20f8a62b5170e46f7c3f029f324142fca24c64448b04e61161dc40a31c4261c9af0a8c550fb4bd47bb3b133ea0230b1bfcf2505691f8b10d380cc63dba7d601065872667286d1c80cbc689c02bbff5c7c65048887d924eb51e01d1f9c88cd536d0e8f4c0401c8aa11a5bd6d2596a8b767ad0ad388274277f9045f465bae339937dba87fefb45803f43757ad3ada534be971e0f056510d3e31b63be100622f5ccb87650819e7a7591c3adf6429d02a9e6b772de7d79facc762bc58f772ece92393da6dee6ce2e037f176fc9adac0523a53889abef559489af5df60909b948a76f69c6939cfec2922dbb2575834f1f6a70a6ccf7f96c6084050e7f8b462a23add5c9400f2294faaa442b898a521ad3c6bf9eb7332a42f1540dd9cca6caf5d20e12d8bdb2064518d448e4e668a893a4c1087cd2edd06dc962203c67ebf6a0e6509d249a2cb673bf78b273d690e52e14f1e1bd9aa8aa415b46f292cbcb67cfd30deb196fcfb1a5512ff764c4a3965ea6d1b1fd88c40662297aeb9972b58cb72aae7333a91b965e6062ae145b113aa9dcd91fa937f08344a66671acf73ad40b5fbacc0fc0a0c3038fb94d1ee45a50942980714cf29e9f6d74a22b49c3dbdc30d4ab5c1a50ffd639118c3af11aff66b20f506d55732eb940f6a68efc631913dc4bf8b9cfd4793e63a8541e174970eb6800d15a5f24316f63befc03314f630942084b5bbcc5bd6a17b6b96d1e0a3f6d4aa08bcec67047305a200b3e84f35a2b26abebb84daf2ce7d9bf248e51c7eb5abe60d83127f1c09a78ec6c8763f95f07de9982661efb58460e441e187f2ce53257c44f37f0234e0c545688745acbf21dfe7387cb9d24cff349c81e91e283cd929b3d6939bb8f30148100f78bd5e5a3dbfaac648f44c5e47df0cd9e612876f4e9ed5ebebcf6802731637e324471c0f4d047b6b0f792593654b7c7262cad710ba6e28aa8481dc083e19020b1249b0865798a24e5bb22595605e3373e4b0e0c62680f53ce51bdaae6b37b9b0ca2de06666626799b306130940027b05f52b693a99bc83c996032b9c015aa3f9d55975577f4a1271a0ddb99a0e1e9a501ca33c131b0a1c7820a397790869090fba373703ac38ea00a9a0ddeed199d97be1801ffab45206710a61e5ed894c3319012ded0ff414386e56b548ad915d80afcc2bdb976d7c8adddca7dfa28aeb694033a5612660c644e32f85c2805651d713660a38914d70f0e41fdc4b3d162ef3acd70659eef6375686bd78130f295d26d03686fd915c1780ad5a67f26932fd188475b89e0fc04db67f87f702011169b40dc408f43ea357826115b29ccce84022f19523f832c6f1acf7156858fe175dcaf399f6e34129193d27d924100e3fdf571ac0af2eff0f0c7f16f034ddb04221b0aa3cb99341f746fa282c2518d840c200287dc40a1da38478039fc459bc9a9eae5935bacce713c4018b991d7ad2f1d1644255ca52358a43dfe7aa7f94cd27ba0c280d6055db877d9a79a574ffa35cf5cd91cf29cfeecc2ffce99acc5589f25e11404b12f8c45b570d1ada936ff38914813c734949f172321632f6156698027306c9773a7b4a953ca195bfe0926c7e17c96cc99288e5843376e946c18da35fdf33ea1a3fa7163f139f13dcc430b445e7ed495a6d53730819653713389352128ce0ccbb8944d060c44fbbbaa81073e66a35faad40734308ce2944e3e1404c22605597e2801a200136f9b6e0f2fb52678ae9a84a74b1fc8b390a3741265b3a9745d972178cf0ac2953e52bd60cb9f8d22e507aba72d3469a425238b26eaec37a22b685e315901fe0025b43255c120f2e3eb39984a1a1cb3cd14771c022ff90d2de32f9cd83c01f2e2ba226544cce3c84a15a2c3068e53079ce3307f2a81748a76396f65e3e49541cb603fbeb42b429db418d5c4731652059215c25d069be9401982aa31caef368b18cc6ea73a88d7e3b0594515063ea41e5b30bf1e3cdbb1ce9653529913b8500f693331d73e521e2add5b632d3653c3b246a8793b23dd88766b201b0454ec9c7f1b491b9736138fe37993d2758a123b71f2f1a34c61fdb7e8167d45fbf4d8562acd82ae9fb849a7ae4396f5a687e675ddceb0afca5dc8da8416df75e87a2827c2fe544d394b60efdb99e95f08a64cfd46584a012d9ddb6aeaeaab2d625b388bb80c5289fc55f5e2fc0aef61447bb25c5c2e4249fea891e37d0074cef21ea5fc7a95e1e7617e750ba0052dcec26ec2fd7f9f1deca5e478cecb06c0fd004aece49b29a6d8011b6ad4381738da0af5db6b3149515bcbf81ca7455c241a256669ee9a15f5fe43b343c754cf752596a7781001ab6139c949e9e79c7ef2b8c9d7c974e80973acb1dcac7f568c8733fe0a25a67143e1e936606d1a00fdd15b7635781215629475c40de146eddcc38799847079009147fc9bc202b933472464a2f5f24092cfdcec02bdaed86b4ede9301acc512201207e651e5673fa3e98086e8afc48af09fb171e662418e5f411cd8bef9b00c6054a6290140f737c3636a14bfb96b4baf50b699f7a265d34a5222db39e1adc231b7a757127b4f1c223345a080a9531d3f9150e6bee46861bcf0751cfafb3ace24e98fd31deabb6740d797bce3f6187a21b014ca94aee59417ba88108abcd3aaaa38c43f7c25d8a39fcef4cc423627ece65b76c811785a04fb1ed058619cf4c24243e8fec5a3234b9f97d15133d01dd00df1fb51cdb7321ec77be24708123abf7d89729372e937e9d0b0b1de215a46edf902271a2211fa5c1d70328ee6b301fccc77d5802c6e62e8d3b82ad5a34b5f71480a6e63b6ef3f376d8a4572a605e704bfad96572ab940d3090c80da3219a4146b7945e0d4c56d5b28289fa49e715651b789498b16406e32f12c685e464bd141e3ed51f4342b0111dde9b587689bdc7e5499439e779a37831c9645d45868438441c4f7103d96a7060f3c0bbd7cdbe5e5076c3903b72d293dfbe8bdcef0e59745f59ec9e7597eaba23cae169943b81f2050608e5d6d8fdfee1f8214b0a84a39117fe93edc30799b70d69e7abd65b6c4bab014a7fe0338b7fde7f0ff2bd71c95816112ca512aedf2ec7dab8c9c5b6e830eb7073a78009e4df7f5c3e19315c358e019d9e0f8d1625e9f9253e0b88d35e6b6d5a6aa5dee470e56b9695088ecd4efe83a7d37359c6d1ae4a505fb9483a34c2d8c717c1234b965b4a35fb06fb4c7c6f4239b219a1464d466265051a2c74d4fed5bf624377c7c107c6425a5da06227a8e65a23488b1fff79ea6b17775d08a4e70b4b337201df56b385c39953a696b77218130e493fd8510e8a6b7d18027e0e4423727297ea1bbe252fc3a03135719495806b5b65e6f9aacfe96c1f45445f78dfc43d07fa590361266d47573f747a27d9c56af3e1a80a7182b076e5464b324c7e97b2dae37720a77de759a6c48c39d6068f18bc08ac9410f08691b7623e7ff1ea43dcd49a6cf9f9f44400750aa5360ae3887e9f211b1feee114c67de345cfcfeb71c0db665f16bd512c45ac57e5fa2c3956a384731c31731d021c1f0f8aa84e48c968d89178005d5d492e33f4770ca2d0a18f5447d854076bf79c852f3295d6cbf2dbb461e13e3fe040c6f22981f4d670124bf5e5770f12949b4d978a681bcf3a9521551fbf58cda2bc12d13d2c3b2ee150de519520eafc6197373e6a52c4a15e5943a5123dd76d6a631cb97a9f6814ea04504f9ffb6e2d97936260151817b4ffe7488b8480428901ddeb90260303ef55d6aad64a31220e0136d7e6d4e39c71e5e638eebbb3 MD = d4292e3e757b4819873b554278a8c484e99c019a18d1073459c56ac454c2d518298050a78e46e2af85b25e05fcff6ad5fed4c436577a90a3107f25b99f1cc999 Len = 63592 Msg = 7d130ba831a68bc3532c78bc6b1a47c23e3772faaaf37974d2fb275e7b0a1677b60275c7c03b098e261b727a2ce7b01c70d8e59dcb725cad7811cbbd78c5d56e345fd34965ccd4b031a2e21496f988690c7c91d766c011b3fad4aaad0119084b4153ae96e901f513bcea51f471f9d7905a4afc114585a06ca06b4b97e0aeb6f623068d161381739d0e1b4781858ea579a26bb0b12e6a0fc2b1fe36e1db2de756229ff831adf55638715c4a239a61fb0c2c073521ea16689c77b7f4f5bb3ea3558847774f7d04a7cb2bd5e4427719e0313f4511c74133b3e138bc0c394788f3da9b2593d84d576d3d85af9c46e55f5dd0254dce0dfa66f67b3d35061749b4decea562d334e395b078c712fa98acdb79d12448f35adf593b51ce4b6bf687696d17ec25c0cb076778633925879e94343c1c855e0915b6b4894b3225c13dcb50a79eb997e0058375cee62311cac16513ae9990b697a8481ee951b3ed9356db11944b53dfbe4b1e66b9e9ccfd4c69e61fd8318c79257a5d40614b97c866a87f533c070427df039fe342547d1293ffe001c1cac3ce3cf3bdc2fc2127e0c49b81bea8b81294cd97cf93700f7e7829e91b60714d7bde637b2f4bbfbcab5d3497a8fbdf47c6500f6d761f4b03175696915fe5f1a3fdd0227a7c83b4026b673f04bbb2e99d68832def5c2edb1690d4605d743848b291cd01586c14e2dcae246b4a838acfa04054af8348692931301c11b721007e647efd897dc7a35132bebf43d1c82c983a95ec1e9303773c3d405330062fe59ca00e87415255db0aede15e4c0251404c52b173028656021c2008a446b26791a94d8794b13dde6114f3602a1043e86df4d0da10e1c406afd2c4d035da238ea9ad55324b62a729e0772e834a16fd535b969b59eb45b5de28650fe02e74c06fd8b19f57d5dbf9fffe3c8591e6e6995bb33d9d762db5c1a515ddeb7fb89df3d1c4bb133e59a49928636adfd428097dc81deebd78feba50221d433ff7fbdb247b15d6992e0046f16cb80926923606136240b3e3a985dbca1ee99ef38e1eb9b93674071971f2486793a52241143865c2f1c593f74feba0976121f6ee8d49bc1bca89587b4d56326564d1bb18a257aff13c5397e2b357911fb36c531a3ca66eb2fffbd0a70b548d52a8e5df9383ba6b0a0c93c58a1df237cadc72be5ee25a56e69d727786f216e0962788939a018b2174292d27d8d4e41901a3dc3ea2c890fc206b9856fe4cc1b399a963e11562ef59975bc8c5b42254bf2ad252dcce376ee9c6321274f85f808fc2f61ed0ecef109cdb6a0ca5074d6ab2af2f7b9fcb751ca442ba8bda5d7579fa7bd5606807f01671a81da3d1b79e5079f683008f7fcac3b5facba98e13d4d47e2c10d1b24ead2961663d3251ae5d2b9c699588b4d3808ba5582d149a04c4baa33b6d1ab5aa6d6ff37d92642bd2d226a46e2fbc17afde9bfbc2a77505168f53f011b5e37a017a13af55e4de690d4566186f1744bffc2b1c3fa20374d8337cc6ed16afd3073d1a3b1d56fb4b1346fd1680d316c7b4a0b035fa5f07b81a42d23c22b2259366449610c6e99f512f65435c6502f4eeff85b50fb3617cead32bdadc184eddcb9f0036b931749798c7515f604d647960a79181d1f21029b10cd6dccf5650a122b857415ee661acc9e2f4994bc3616dc5b4ae5ea43fd4d8b6cc2b1f3c64223740bb3301296e16a68c893538454c6197c72fc392b023154fa11b12ed4ccb2a67ceaf7bbc4050fd4d88c3fc867572ccc00c1fb8661c253b571901738c2612d2fb749d17bbcb147c68669831c904bc0ab03c8c752211ceaeb8c6873645f4c181b9d98cee46f343fdc1cd10bd4a1ab2832f007ee10eb6a4d63a51b44360db619e6ba684eaa4df64e71e66348651dddd9f0500fee67234311ca562918225057993d7828ef21fb9ffa248d90b752678c4c7f9e3136b95b2fde6c0a024dbdc9a91c7c616b0effda69c9607cd9d721011f061d551c659c0598e9d54b47737ccc131a2ff0af4c787d0c42b22ebf36658d1e7d75ff41e963b516eaa2945927c3ea3e28c4c056263055ffec963da143747df338f6071230b4ec1257307fc7b947a682bed73af01abbf7bd3d8904208cf23645bf39f73dda041d13962b6813c65c837952d3db1d987fc4acac072cdd8143487e869e6a0553e5bab34defd7bddd97038a7b472b3f2e006f76be9d1218bf0c471615bfba092cbe5749e4ea69364d7b995e9ebda5c559c23a83ebb75e6294a19494e30a71c9c302757fd1c7770db46ed73e3383c5509a59c86cc9f25c5bb097c383850b2bc7c56697adbaf39bb491052fd1e04624516e1b9b89cfbab6548173566a623e4273924f305bf6fb31bb71c305821b812d5853ac1663638cd70d85b8cfa20110506db810c2132c4af392c52d1af74ba15ad5d97feba23bf548b74bdc91c2e82dc006b57fef6bb16f3bcb09a7c28a0743374a6dfb6daeaf70760222533f659de32beef8d0fabe2cd494d4bdc78eb2c4c33d368fc32ee1347b097ec7b13ad288dcfe7720b88682f51779406000e21a0acdf71acd5ba1f271915d8daa7b16c24f77b24f9b9b1572b0b4538e8ee86f285fbfdf779529594add400caf3925559d384fe1d8e7fd19d5d617de2fa8f288561a1560cd85b0d772ddf37153f22479cbf9d1f79384531654dbce53943c93b03bf06b259d0d868ed2fa48262c640ce5e70a8a7e100f31ad5848547e6cb8509932492d98569b1ef203c8aab5991d534c76d0f5ffcec71d215892269909aacd85e1aad9239abcfea38dbf978a1a7c7bffe3e380c7307a7a14ee4fd13e0b924f18c28bfa61d9f18a15c9559b3e31000b82c6b8d79ed567dd1a81e7c0f7d2fd79c44d730ded84c755bb5f11322c6d56667787c746d13e3dca94abe09241104ab21aead680013bbce626b778d8ef3fde3130bfa57af8db5aa705d4c0b1941408ac7f334cfd475f20cfca5af30be11905e050c6d9d0802d4d16f0851eab7b7ec5bd73bf4cd24a7fb15728b22647cc997be86a45bae401a4937ee74540dc61b100699ad74cbb650ded30c4757928ec318eddcfb4ef21f7e1bc634c8ddde0e14b27255723c2f5319a12d11fed620bda61ed24f38cdd16dd652648b2d74c4564bdc8953b1d463c3aa4e0acbdb2878d11aae55298461b3f1c9f7fb39cba22768689532da93c5cdceaaec548003d40092c9d25eb00690007400107287c9ee6f0a12e655344095d73cc284f279a16222c85891d52ee7e520be23a8b1bd50e10505f1d5dba7dfcfe8d4991dccfedb5b453a72f4a2e94ee57b97d9c4a02387014f20ae6daa7c99f8675fd8bfca56d946d0b1bd01ae2a641a79c7ca6e270197d9b625f1b3abfb959abea62672d4cbc4ab2df5e1c2df38500b83159fad2e9ea7eea3da61b1c66bfc3c546e2c3fd2a3c412c3ce873f1e5d3b40ff4a008a9d43e0ca7c09a76ee416f5679182912dac270004fa04577f54df4d42572e940b5c386af4aa786bf2eb42a9a2dda9fe454a9fa1083a5ef88a6707ad98f189043b53c56cf496f05446c5383f75a0aa1b8e9453cea7eba51368411d84ca3723f71f6b320e53a7380a715840e068424e8f10738ab06875a14f22c869f9618fc416c18ac67a98441a367b8ea1b4042b5d03d3cd8e6fd3411a55bee63235e46333092899cad54bd75c806d4da5e2d0c49f1ee08ca53270b5d8cc4782c260db1a39775c81864af4c7c78f4e7f92935573db893e961821c83aa25dc2835fa1ce1c9e09662842fe1c7c230c260bb1ee19a1dbebf5d52f66623942b039d3522046d12a664d78461c4a5e389efdd94a1ca6b765ed0e2f3126c6187e6cb359e306cba1a4361958d9ca07d5cdeedcd1a544841b4237908e688c7d411f3939fd597be3f4d623d2af4530da49aca3cadb098f39373a7083d91abd0e1aedc1d2a7fea6183286d38167d0784b229b66d0dfc0254f721440eff890e4010dafa9863f18b0f1c37dee2e67c3c7e2c863dff5c5102d4e339a51ddd21227df802f9c5dadf0c0f60f831ddf97664828a3ccb5417542cfbce492485451e7ae2fdd334060d9ceffb07f60089edf0020a41b9d91bcd79d3523ecc5d05d5c59a2798b843d96acf995a679db567227db7adf99a01a6fd46b840ab3fb8fffdbae2b46f2ea3c080cbba96066bdaf64573d7c5f839bf96152f2e7faa1fb2d42b72f701c7a2ce5bce25a6367afcebd7a576f4eae4357d59a3a7c847a1e8f532ed6249a868b14dfbc171fec42bad625be0fb919543f9c5723754f8312927da9cc21d5d0098d68d31091526c79f19d9238686205d7e1312703eab30d4a658ed62380893b2fe8f168be3a3b0a95bbeaaaef48b439c190e0ec4280f24aabff8a833bdc8a037f047747d0f922ef1d7f8715eb99f5de99b36f4ee9215361bcc839571d1b1e4f814ac2174db54e4399a73a7c34416e1be8b4a7f7ffb41d7a052963fbd0278e47be2099813e58082d929acc87d32a671935fa508c8c2099bf0f88cf165ce62215bdefc52daac998d58fc005ddcf3a27ff08ed32b8994f0f56614e4651ca4221de06200fc299f046641881ac27305bf8f6e9f514212c28c66784e490542122d5cd22193ce914b55a02b5458b0cfe742026617ac06f5093081bfeb075c6696d84079844174921001bd6ef746835426ce8b6f7e4fc4b0a781b99591cbd4fab0d77b7f008678bcbb9d2094d760c49042d98cf349b915d64bf480a1c8f2f98eee9f603b3ccf35617c8c7c258b33ff14a9e78989f07474c6551d796d07194493ae9481368fa84530f15422a9694c8d51ea7d03ac091e5c015141064fc29b40a97f5b71097f9e229ba898b69917f719c8730e7dc1f9f35637df13b9d282157810ef58922c931d581200ae9a6d1dd00ef8e2106a7459bfddaa4d09f68ddc04559a6d10770840a25034a81a60adc173e75396275c3b9eb06d0939a85eea16e45386871792353ec99563fd708bc3c93f3d792dc7c5703f918eb50353557ff9321c75abe2762bb3ffb2307f258e479bbe7bca175638bac2bfbd3e58bf7ca7c979fad869e5856466b1111abbcddac19f6e1cd6d1671883beb76315983136fa2e38892f4fa56277bd8a4c9321ce13aa6ababb2fea8ef7638a052adb504d06ff8dda320abbb67fce2ee7bf2a4f9aab6a8440b125c11257d2bb157ee00f878f206eebafdb3c7d4fd041660350a3d8149a528ca95903b5bc39d884d9d4246511f557e93d11408e55468b6193a6bcfae1b27bfb0e4a10cd973168cfc6184d6a41f6cf6f845d665e12697386fa8cf977953b57184a7976ee6b31c252ce3cd90b81ad3bcaf0002c5129e17022a283e7d2a19d8a610857a48ccab39bba4cb255cd737133a80aba012bee1727e1261c169089716c61a275381d185f4b62dc09422479eb3d735eeb6332e1a2f12eefc5f435cf2fa396b3529033e66d57f8f6a23ca51783bfa94704e10aa6fd72888a021f36e550967cb5605b55b78657c9272d93c3ded340d67da6f917908f127a6f60d6186e6cdb90132ee7f6fe32b16fd80bf605324257774d3229ee50e057711a52e76eccdcd95d772ec49c4cfb0b59a3bdb1edb4696a084046e1f34a99c8091568918e733916413be07fba0637ac22f4c375f1c7a0ff05e155bfcaf003da9eeb12830c140a28f7ebd487e4cc713a3855adb095fe919cfccadf11d9e3c705cef5d12a7c01b877ce018b6b8102403c2640ecd06ecba3ba59474396a4984bd015d034f632dedc89501775a9233a2d0869410173c0b16feda7f143accf701adfe004ae84e50ddee41a8803af4ff680456dc07c1950425e9d65532fc29f2dbc7bca0dbe44f701480e79fde60c7ba9f269c059cd1f81e0e8401de79886b803993a3055d4b4dd6b906f1ac37d4f1ad6ebfbfd876514ca2fa57c4e18ee578ea439a1cf6792532cbf508c698349c5c20fe56271a3e487bd810eb85281c1b3a7823638d3dd77be595f00fce2a7cc2ee5a76733c969bbf6c0879c7ad79c9339771fe775fa01e544e7cd1a2712cb84e91a5ff9f651336bd077a5c73a59d3d34791fff5cfbe8f7b955cac14a17648f462c47c1600d58b64a3476e278d45c2126c7c84b9cc7dd09b1e2c5e78e289caab4a789e341992ec46edb43335da17d1d1269b50dbf2d46fd44ddb76cf60c9ab09feab38ec7725d0832e42a76aa76cad8ff462e6b4b94ec7a7a2ee6770a2b274a10dc0de97c00ad299d3773d4e8ba09fbf5487a8dca6498295cbd9b3153ee0a200e67df1de7abe6d0b8bd66749ed4032dfc56e39cc30410b1f1721dc158bb0dd9a172705190dccfa48a5c4a7f542e80171d58afc0bfde1cbc4236b650a1fbf61dd1e609ae00f9314e1bfd691c922f48615f372720455986ef55efac06b7178e96a7a9f25cbe6cd47573890974e13f22b2cbd993e5dddd15f43487480a21759dea2aa47382529b80c29be673aec8c6d7b267273b360fd29073e7e4d285677febc163bfd44845f0fddc9afeeff3d02c300a3d09663c64a1c01374f0929e129c3fc458e35cd71ed1126d78b7c46b7fdaf26255685e1f63b06d7de591cf7ea933629a13f6545765a8891a3dfb3c3d6036e861b52a690695685e5942b1d34cb4ae1dec9ce104f0a3dc288df2b19d92f8a9d9b06739d01980315d4e9137e431bc743662f98db4c85ed5b86e9fc13091d19c8cf7737bdb82ae743004dc0b4b5548ed75a334e1ac0a21fb00644a123d637275cadddfdad166a797a0242a1550dfe081a45855c433dc71b6ca18fd8e0c2f639e5b0ab53dfcf0f1047556843d3af80c98892862209366d86edc32bf1ce41e2d7d0727fd8ba24516217741f16b53c7559aeebc65dc12d1dd8bff5999a40f58577c96dcbdae0c909e586e8e7987e17542ef99bb65e0f9450975fb35910fd3046901cfd0ff8d82f70f1021e424792d295cff52ce6b1490e9e294986fb243794aeb767bacca104ba2f3b059ecfb297f0c2933e39d7e601ee6f2519eaf0129485366426217271fb1bad1a2de4e057f1f4633f113cfa6aced64c112d49c88a98a4762cd4cba1ca2fa67324d78b14a6454fe02a2a90debe0438ad54003df4eac854e657f013cb4816fd09d19efbdd3be675c1caf6efe56e46980b844f3205b18838ef9c04847f4a4581e9a6e0a1ba777a0890b7e2a4beea0a76ff2846c06b8d7ca32a5f8eb80e6f4fd78b1b49273ce7547ad5779a49bbcfc447f096a36396ccfa260f28fb0919157a5076b53506c51a2a4ef8607a697c6e18ad7875d18627fea554066ed6022fdb69af34fb309af37e4ff78228ff6e71635bfa0f4c4dc29fa0e2afc8b7ac3da33fa2263e63d88e488259f70b37b5d32b4e22c01d6094835e42568b9e99fa0623a09867fb65794b24d4ccdfebf32a320a6ce1923b793252f451658a206c2c0611acd0e71496af4c18d41d14ad01c905af6e3cd2d1eca3abe25c942dc6c4dec80dc2d015e27df71ba50ecf37d6da1ec88ac0792489416518b8d266e92a3a6ea678710a971d61cd3459e357bbf1f297e52ce24ae9ca0df303d841523ea313782bd23604ccfe08be2098004b0376c1c0f5e66216a50ca8da07d137eaa0ca0667e2bb90433a3cd9365affd41db0edfe267577be60e8d9a8869f341494b21789da5584fe4a613239b26de1ed4446bfde34ee3165be27a99395346165e4e513f43beedf0e8ec476c0deb3feaa5337750888caa3e682e404e06261f9aa5fbc37fbf9291a1f84f682f507d7a699cf05a5f37e855fbf539064158a925d6079aa0bf7be9ed6cfc159ef5cca436a3a2c23bb2592c8c55ea4cf5fb98a501d16a720f88de8aa858dc871045e9271ba19df342d2571ef6552faf35032ce35a93b8cc3961503f6b6d80ede7a70fd0d26a77c9994697873c02acaaede17e28d925d7f046d239cedeb4d08f4aa3a6650306168d6596832e06654a85451ef43f268eb1265d630200a834b5b462c216af567e6486d14b82ddfb84ef876641f8efe8d62cb6a69d119d72f615a6578bc77671d947fe02ecfb5ac36984f978d2f1ffc70632e74a07cf6de300daab50872282ff1fa93b2301586e071cf223a25a47386d25aa03712aa437a45cea0c753c8d9aa65871865a1200e16fa31f4d0d6061627f3b7b50428cf9c55c122f11ef3471880e8d8727cfa85b7ba208f5bfe16ca945a8518f17e6b734ddb4288f01e6f73712e0c6d366ac4ad10449535bc0450686a88e6dcd9f8533bf4854a8f426810b4501c4093c8b1681ca430b8a389a61b76054d99a1d32458600cee39945c6e9fa051c6160addd37d4ae0191b776935e06a01232dd6716513a61360a046a2a464cdd2d60d20ba537cbe50682e1fcf4647caca841409394cfd7484a70f04a9abf8737fa68673f2c3eeed71a8711b2059a9feddeadca8af4e8e31fd0be65cf5d7c357a4d222831b773c6ed05484e800d29facb7e1e83327ec3e84d919b6ce0bda6dd0eec361cc991feda8d8e6ca04e563912af4e3e74747a896d3a55b00b650065085b9f4b4cf00108b2207f9c0f0426f171ff18b2a4392f61fb4ee4a44c476fe03dc93009be8c4eb9d70f9e7fa48ac6799e25a2251b67e67419f10520376c524004c0651a7c86c138d0c1b4be66c87efa2187b53de2e7e7e94f8b82ccd3bdf1ace5a808238ec7a2ae259d88005ea7959c838f18a200a27ae92584214f2822934d69e9dfcffa3639425f0de4ee920d55864ba395fd7d7fe79c2444ab523e84824b17ebb3c3cabacd1d05778e2f0ce304e1012df2f662657529d333e77c1ec904cd78164baa063da7669f454f6cd412ebd42d94f834b63e6db9baba9f76cfdb62fb12d3712ab4a61046b6deef4df081528858406f6081f11773623f99e759a0e4fe7088ebebdedd4ee5d1aa36796a17802409991f21cc66bb80522c9e78c502d1fe179f82968bc9a96a7811ec994abebfd1c907cf209e85a10712e776d11ae87322917efed3c4546bfd337bd854965d55b71ff24905ff3611312bdae99960391093648f27499065dac88b50c35358db8bfd93c25377f7615226246bbf789fdff1791b38c5a1f7e540f007f8753e9722a9ccaddfb61e8feead0d8504bf18e0c15efb3be39f8301bae3a030dcb6bc5c19f74bf6b13aa3cec56a0ed70cb31e2ac79e414ef77e95b7cd0cfe8c624e75aea8bda3f5a1a6aebdced153a1eb613586d9fb74dcdc2a8220060232a5f3041295b742fb3215c4e662f229016b089103fbdfbbbc6bf96bf0444d0f6503f8a13b192ecf7c36765af4c717bc43becd0d3091c1274085b809882c8b79bf2cd7ee9743f5ac4d882d317ff426d03f20a19c6550678729b180cbf1dfa68967aafab0cf1af52198b1a01130ef08ae1d1cec054a41ba239e78ba7ad36588878605c7b28aa61476823739c1afc2a39e06371711866ba042c860ccded8c717bb43c3a8bb71f03bf235a45f0ba375e1e722fb8888c2d7022ecff31fbfa60c3d6cc76e04922cff53ded97f79b5b50ea9d398efa832a58bc92ddab91be5e53ce1e4398d420062dc42829551f1888c97e2a8919bdfd6d891db88113928183e60eb69c2a9cccdbb8df22692a12e4cd11776af3488963e02f122879dfbaf1f587f42448a4909c1e11c4912f8f798c92b974c30aa3d3330ccb18571a68716c3dda1d0bdb8f561a37990318deedb97c6431e4c731a422075dddbeb905366c7cc72ce7c1b75363c3d2ef291e19cd6930dc0b45ebfad20c3d5df763e2acd1f2802c10f2ea8e8920255a54950542b6ff4644b616a5e8a5e8617778b65883c3aa32c726bceaa3a931bb4899d582fc32f22948c2e5896db84d0054f2148f2c73f9f142deb456a92c1f02280f790ba8b9d86652a2210b0c51b08650f40cfaf96b784809996793019a3e767325ee03cac41869ece467bf372aa98005ff0e209d22ab9395e745344f6c1694a49da30ff4ea38b091fa07fa90ab9e79ee53a6946a31ea807258dbbed52a3df946a736849974cfe6cc63b0518b4d05d074c254caf301db8b196ea9a7455d2af0d3f327163b2c345906a1cf68a997862023aba738ca2ae51015892d62126d5437d701e3195c590ca3db44d3845e1385e585800c625205adbbd148d593cee3401aca53f9126f93cf33a4bd5b592b399b9d14dff2ec1d3a7beae71e4090dd4785362859e7960754e2a51d9bc53b83722db35c1bf91aae31f639c189ed0dc0128a066b842d289624ed648030afc01975b2d4c5e49d926774a304fb0c395f09dcc4f81e73482eae7c45ee873c897b3f8cc15dec9a4ec7eb7af8e8ee25c4092cfecca7bba7a73cb2d392cf9d1fe0c1785fefcb2add8b4faccd6e622566fb80abf11781cd81e8b745b35a743c4b2437563784b91b0ee17e1de479ed4b307e7a096c2c12bea27b42c9a3e378df5ee2315bdc268437aedff7d148b206aa129b49c7c880d72979ed53c12de44a10cb9963eb965bd90b4dd53149729d2accadf074598eac4b7888ad6ecea9c3645b01c84397fe8b04006c6fbef8fa91e64d330c8e413704ec364f39e844b007642891dd34f38d3ab1a17b1de5623946b586725dfc114a2145ed4e2174c5c936a6040c76cc50caf15e790a5e6907b7020512cc43524c4097c4f805d288c46dc7b667d1f37e62202566f18abfae7c0c8a717ca17b0554b2cef600f6fb98b3064111ee72f1cf9a357d67a58ca02a11a216772ea26399bd093d6572a1db39243b1954e27fe0445b633fcd0f80ae707b005c82a34f7b9407bc797fd7871fce9a64d6dbfe594d513842032389f738f61abfb32064f95168a754f9c1aa2727dd882c00339c8fa79ab35a5e07cf50ee3f7328c0dd0e4053ac2e6b34b764f281ea7ff90be847837d655f04b6c62a4e2cb106e3ec14e9a500b2ff67c0ed8289cc89d444705679e53d659dd983fb351f730f6879cb6491a7f731bcb314c0ad4d561037a6c42abe25760fe2516c136a656f8efa42b55880b9a59cc905a6cd2fcdbd221c888dc18eb4a5b8ef04d5ab54b060d44ed7504d516a7a48b6b80d8f948b7043f57223b766234b14f65c473f6e80f553d8b012cf6e3b03ea0842af7475f70dea54fc2c78dee1d498aad0372c3247aba21a65736b419bc0e5304e03183ea0e479bd7f1e825380e0b86ef92c1e2a74e233a650088d760d4fcec132aee77909a296817350605e70edf8d54fac61b1a9377cef1838c2762fff0b2d89196e9fa1b6b55381989f6a426ade504c2eb382552a0267268a96cc445d2ee7c9c91a2d099f5aa6222d9c0 MD = 06b3fe00a2c681dbc14f6e81ae1e7addedeeaaf4c7485d28beed0b52d128cb9e7b295838dad384054a826cd316fe20b8ea1aa35de2b39ae612342dd1911212d9 Len = 64384 Msg = 20e0a77319b72144235b24a9ec5c53c5d816e9fc8e285804b727303f029341486c0904ccbebb379b571ec8fe2be2f44c0c27b0b829ee486dd4cd46dd88e895552a1ce6d58f7d53203f03420f78808d2a76d5e079f2666298e9cb970a9ec985cfe280153993e5bdfb63735c83da1e658a9f8940e9f378edae7e88eb6f4e1e58de1d9d599ed2dcbc554bd7dc035aa4c5920da999ae330d33d61b6c09b39fcf57a961db7aad5548995680958b36fffaf56a4a9fb370ba0b7a3949dfbb7f9ac4ca5939a23f0d23139d25891731c5d1093d3bded156d8915c0bfe8f49c77b45e5f9152a5a716644230debeec39657d8b7e52d4fa94a8dbfe62e4e7612f64eaa1b2b06be6bd862c16234cf380381951ded3467278d56384c932a5185a210a1d14ca9547c3d3ca7a1b659faee3ebc26a7947312ede744814149492e4462dd1bc061bc26ec3865ddec09c39398db0db47e92eb552a1eda0fa5f2d10e3bb825658143aaa497c51badab42bbc3be443de4abd1e159659ae18b80750b18f30daf261cd8bbf8044a25bfe54989b2e9e014603537a04526c3209cdaba3f75f3ca4407970a3947bb314cbaa2067587a01759d024ae6f42f60161ebbca9b54cc355acb0fcc06abc45e05846ea61c76b6c51d6db811d95785bbc6a202d2ab4c6ec18afc853e2987c29c1110cc642c685d4f6512a536b5b0edf5c04e23625850bf57914f8a25709b2ef3a3eb43d91bbfe606e9365a282092d0a49f7d9de82714266e2a5e7f309058420b5a9e65836eefd982264337649e7fc63eb0bae2d29be94c8ba283d4ddfd61a439918491e19a7ab05788b3cd8a83ca472ab08092b02b428a16966a4b9c1c39de04e548597222e2f2ed9d229cf87524cbfefb591e1f69d277c5727c23d971335803c2543cb3acab29baeffa264ce6f1dd320dbef56ebbfb8deec333fe4490f09aacb522bc347c55cd55ddb4e9e65dc3f35a742cb92ca6404519051c4b3c0ff42e663a5e48632655463502ed68535e1d96deab2cb9e7cd2325cab4bf9b4e22b07bc6ce4171ce4f3c3cdedc0e12124c5130453f39a81e8516b88a5e785ee98da81b54ed86b8e44b6d09c9e58187b1bd2168149ccde43f52bd75be6ee1169cb55d858714989e339f8a457cac0239a034e0a6c330740ed8da69d5fd627442e61e5332d3dff1823adff6686d8bea986c282174e7b6a6786970ce61cdd5cc74444d0babd1bc1c15687153fb2321b524842b663ad88befc16faa3d919645341b35a5e978f71582c85af8057623f9ec8e769321914c2caa6a6a0b49fded1d55b848dd9ef2ca88d00b80c88d51e6711b06b213d5f0891580e3c70865ff38eaabdbec387ed1a2926e5f58877e26e123ab5dd51205d135d2edbe3526342e1019a0e69e6b2b6e35beb85460a93a5dba8e37d44e1243dbc8e15b6a02e91702f946df68edda0750ea5a685b27b2647ec91d2b0a8b88e248b8cd5477dec591065aeea1f3390995024711d9041c176ef2a36d0f711c0a93c09c036358175034a0bb6db2e63e7e76fac26194cfcc5ccc61bfda4fa88e0bcadbd900029b4afd748aa1606ce23cad1fb2e2b6261ea6f6ff4494f186014000e9f3065faca1f831d2fc93533a57d219e1c33eac07814a8a9a03c95f2d1be08e839e8a8eec1c9d91c2af17b2c5b78d497f942cafb398056c0f27a35fbf78de192a36fbfa2b5bb9a1d5ea950b8991ccb04bbe333da4b3862fd138d99fb77897154064d14de4ffbac68f6791c9e0772ef2d899e8d275744b5a82bfd27bafcbaa1768a080d6c3793f94518e947a74c8126598cfc41a804aa3609615049ff2c295a3f562a1413148a68fced82399b105259d1ec84b526fb74cc67de106693afdd82f9933b909a8ee9e0d49ccb5b42fdeb71ded0bf5268e3aa610ccac4e53f2ede02ea68c1e9ca4eb74b164d4d1363b95654c6603380386552dc3e4cf530c95135c35afe46866bfcfc900b2a8ecac8ec9becd1c66aa85c297624468c2aaef9bfe9ac937c51d14540c197f85818e9373fc01f4927ec309dd61d236cb3ebc7992102a4dc0b6b311fc00d48280273d67959cfd774ae3f82c31450c0f7e9c1e36f1e89957cd31a0ec227e88be24e25fb56e4cffb9c80ed04968d16e33155326a455f8566bcfbe9d1f71b5a486d64b8bf9585c97307c87e20dee677746020c8c4e18bfeffe4ac5de084446c67126db48900e6c427fdac783d62ca7b5ccd710b5a0b4bfc483c0d00a4314c25d019919fc35dafc8ffc85465c2ebdf2b81c07182928d4788290b475985c8d88e6bcaf703d47588dee3afe9cc1941cd8ecc8048b5d52e26a98a9b81f0ec0f93ad216cc8672410170cbbf99336a92c3dac25571d2c8cb591685332e44e3fd0228cd8492b541bf6075c6fef792ada74d78e758b18701deb2fcb6c1998fae7d1303379a7495121eefed6e7d9c43014e0423ba2656308f298a9ddbd98c47c4ddb63a8edcf4ae69ec1a4810bff9bd0bf3927bb962d237c7184a6a32ef6905dd8b563f51a09559bfa37a365c4a8279343472d17372b83550476cf27a87d2524ef29d922ea9d92f99d18a08af81d900009d2fd566fa7a91a1237cc701173ab59fcfd6d3544d22a87ef2c46f990a7fda077a23e8025e8bd53039044865321498566fac6380ff145cd593b3ab9758c96f9f67e999e4137e8883e46df7254cf282f95e88d3235420a54410c27d28d148595ef30b6b7aadc51422d24463bfec570dff18f692c9d0da2a31068b34dc289effcc87e3cd34a1f220837f121e9374a481de2b6032d2f9a35432f178631fb31ffb4eb31d4fa08478063c4741785e9a7d872d027023dd330eaba04e149862056da47be112535cc9e95da3c76d115fb25496523a80f647119e992f98ea454183eab3dabe5d88b7e6a89f508bff7a4550ac37f4302d2abf19b5b5275e53ea4cd31981c1877940507f4843c8e173037df9e6d4698fdf2193bff6883e0afc07d2679c96e6f8d02aa4d84ad38374624d8812b70448b6018b7388d37aca1b4d1e80b5d67ba17f0c98239622c706b137c8e23f7f40182f5eb8cce8cf15522bc1aec64249a8978689295b3d52a6c9348e062ad4b2004e68214a0e646bd07ca8f439119178962fabc05eca426cfb515abf75a076f1cd520d03afb6901c44801f4f3df137e5dcd05b6c98ef29e42d25b056a8119ab11fc96a706a63d062da32fb5d2df38a13d52011c87838783ac4bcb1de0dccc472701b2ce20a84c9d219dbc98899871c7527a56b7e6d4491d34a9cfbd0275068a856ddb0f2f097c0dc8c01166c012a739c4cc6c4f8f8822b60373ceab7853b0be54c87830dbd1b7a0499394e61e56c040bad1acac29a7f994403130b0e97eb329bb98f3face09e49ccd9eaee24c6ba6225c0f7c955d3ab500146c5c94fefff513e367b335adb9eb4a7b6ac720f2593f27d31045d3d3474042a7aabc1f5edd60c6f3bc20a923e7b4f27c7e486ab7297599475c702f32d981a22076b719b120db891420a21dd69d26dcf762978643e22ebedf79636e23f56068a755b549a1d14da36e1aa15b6ee22b4f159f1e3c3f8c54e0c4f1885b4da5c5db66d11e78d4f6a05d2832852994bfaa95febc44565330ce451e4c46bd59f0984482715b6ef29abbff6bf0b650f03a8cf4d941709a26d584351410045beedfc1eb26bdd2f3a4c286d15edd9d98295eb7b5ceb70cd261835efacec72cfeb5782918783eeccf9278e91a2a80a0c8e730141f07a57fc4ab4244db75f8256e55c5b613a07b11c963c3cc24f66128aad4ba8b7ca9933139ad1b1e1f312c577377ce5123c7fdaaabbfac1735eb099e0496030512df098af80f15d40f29ea2ad5c39ae392154a1d3b5039b29631ff689fd513682bcf90f2cb78394ef386ba065be03152a6b1ecd442bb74858fefcbf0433af39e0da1afd178908e75136f2453cf779b88a8c46b3587ab6579674df69cb76caa8d007eef8fc8001c2fb60db179f72fe06bdf754daad4c61374687407d6c514401f4e8ed7948370eb652588e8e09bb109e595ed1c9aefb4865fd88c860533dabe3a3df8ef4871870400a90752f085a51edd10535f6da11ec62300bcfc90ca652bc817e5bf1459ee6ee688b275127cb1253a9ad09f8ab2acdca6282df0e1525e8fb0227cd05e054d31010ab2dbac478028e6798c635bea05cfd29807ea5f936cf2daa7e6a98f3b4b5637792f0c28afb82ec8f5ae334711d2a78e9771727255385d2eed4ad210c490e3721b508fec7c0240c8585f97b6eeba6cc16e9311825f6ad7943ed1d44868c5e3993a3eeb62760565cee8c618104a66275566964ef77aa969f4e0a2369eee925b941c21abf0646aa5c2ef0c3dbeed7de031c5a2b23a6e9d1a361ce7807c209e554b0920540010d8088cb3588f269fa89d3dd3dec4b103eff2423ac53b49c492d8a64b6370f940f897157dd395b1288f6861da730cc50047f9008266ee6ca315ed8d29138643bd72594394a4d7c74fd94885208912de2f4c38593cf2214f85d09be8ea581f464fed57ff42f5ddd1dd2f4691ee465f6556a7b633af905c59326aea9fd759c269bd119732cdeb30359b38686d8cd57ac03e007b78246928f2718ce29a383ff717d18723c27eb0575d4e9db802425ceb59affd900ee3a50c820bde8cc1553147b551f703999d6cdaafc1053e3658043b977149fcdf346b9171c907effd755838ac06083d9d72464295bb1901f215f4f1e14b8ac7d15fe33d2871b01334e1dc5464b863dbb8446715760381091fc35595a10669faceab379b0dcb80014fe2e423452fb0e4d15df7deba62e45ea3a84eaf3e6a8d9cbd628c3089a120c037be982cb8329661cf031d22c8a0ea09680c08c8203f9fb585ca0d8605b93758d2bd21f7238bbd599c7f016b0a853c115439aa67af4d464e102bdf24e7dc6ed20a29a70cef00ced41f19cc40e7d8827e51765d15535c2b6d45cf2d9298d26d35c64851f4855a71db4018a62ac7636358460a49597433f51d0cfd1d598163db89ee6448364b604d74e7c6b6b012ec88a81a3e95bb7a9b4d634dfcd700095761d769c3b45aabdc0baafc69255a313c9976b75a6ac3cd5cdb49f015840f9775a62621adbce80c945282674a1ab08a1b3dc804a6effad53e46d6de904c0e9586537efd6c8869d652cb0610b1be3b86511ca8e9694de7fa093712fdb556866a520fe7e547416570dc1e3de0e539828da5df1d4eedab13a584550636cbcbff7ea1836ac1850f6244faf22fbd30b20d08e02e2f1b7832043c7849b9721cd2ff393b560e796f19eab976efe590d851655dcab0e73853094429adba3397ee941003e831dcf64d88843717be6642264011f62b0e4c8ec65a5bd2eb517d8e8a39b9446fbcda1e6783b926a407bab962a49939cbf06703184acfa1fab69e4038e88364999e12da04330fefe671eadfd4a8869072fc3e8093032afca1909e9440c9f4cb2e808c136dc010f8a5a5fd9bc4715f62e7dddcee7dadf34da9878671e90596e1f6094fafeb5144aaa84bfbd4792aac17f33946331f6fb3fbdb445dc17cc4f10fb8e26398c40e326db90aed743cf9f6175eb98639c172f16efd6f2b6b412d8bbb3eb2d0b4402062aa9e8ada625506c3c9f004a2e6abde350ed7b0f9578069ee4f4e229eeda9af5cc72074ca860c7a9e9770c3a52424da084333adce6d819fa231b1dad62945e2a92e0770c5c8a87d0ce8a89d94da758ef075d711b2958bf82dcb2f8180525ee2d0451b25d410733697255e3b79f0e723770c8c82adb7e89c19838fbfa24f3ad75976243cfe46b3cec6b45b445b4dc0c125701aa8c8bbdeb2eec39b3e460821e8cd28e95c4c52b16d21fe676143db488f8109492d0a89b66332f219a373655d3db2c2332ec41cb539316b493a3881c9b61340e1b67c09b8d66f77d299324e35ff93aeca5a718d075d7d64cb764227895e637ba9ee24242b342cbc8ec68aabf056f5537687588beeff8e4fb3bd69b5d1adfa236a7a0cc059a4f22814d28364d7696219ff5d83ffb448ea95cab9b614e9ce5fa1ec053cc6884f48232e662561326161682c86f9d29f5f1b9fd810302a19e71a5bf735ba1f015cb615a22a798b49657ba8c6a7c2eaf86ca9d4a56ae0e0a921b4bb53b290b10cf4c46639c586c8639e3641956be73106991a9bf870cc1fe0a3b428c725c666f03ffb7fbbe05401c9341d9c61776f8e130cf85e9bc9fecd0896a20a1d366225f764e2c6f022ec1fc44eb51ff27662e865edca84541e7ed3672107c81b8c6ed5678c02a4a03455089a148833100ec82945651975ec17521a456d69cc8ad0f16089dee18292bd97a693af1d4182e7aa38fb9c6c982b5b8489eca1537d31a9f4ada58309c68f66bbdff947fcaf11aa0ffdcfb94b57d8931c07a3e64a43dac07ea403a202da5fd7c89d1203aee685ff006009e43e19bd66207eb164d8864bbc972dea645224cab7c6c7280cba4fa68d8449f047ce47a07d9ad55f4284ae4d474730a4f1830e98aebe45818aa8513bfda3a0cd0782474a7f91f4f5a9d623a806979577701dfe9066b7ff65a401530ef6654de84fe38283150ec3bbc0574e24a38e44ac09a65e7b84b9dc1e824bbfe521d3388945786012e71829f8b08e9589c635268ae6a89521b3ccc7f34d11fc8926f44af811c94ac19cb711f6a004619e1692215b2caa0b4a99f9a52b2dd872c2acd1697cdc5ea656ddf360fbb93f1b2c3cb01e65063528bede475f0f492a89575b707e5fcec0dd9a51d5ff5022c929fbdf9406f29ad054442bbfdde7ca8ea912dddb72e70e765855a164d63d042af5d3a848bf481003f7a6286707fbd78d3ab9d71a2b5dc5087e4f74a9cd0987e8e57c3fd333af915679aa7c49c59299aea415f43393091affb64f73aacdfed28d63bd4b3d487145524219cf6d00f538794feed930913236e16a1f4671bc620ea1d660758ee8d5537ebabacbd99e6ddb76a40c31180c21403901859406847e62aaa62b64cffa22e3624a5716978940aa2e0936a2f4ee1f618ce34a056f0b9af7323ae7c00866a11f8758b658afa7b6ce28e736d4cb1e72c164773642b63bfef5c0fc5c333f149a2d744ea03a27e2196feca7d271a5846287482710f3e3faf183dd5351637eec5435b192dd630921afb403afd31e8b0839dcc15ba2c0fc32bcc90fa78ff8ccd51960c78e357d5d4cc2c6f469008583923de75679b24f0bcaa8f0e161df9b32ba2fd53da8702d294a98cd473b234e980ab8d18fea094b17aafb20d8e707f4b680dfbd9b4a551d770579f0858f0221cf58f0c1f4166f5a29bafd807ea2cfaa631071406adbaef54e64af5735cc67a432642ee00e65ab2448e2f8395afa01663e522d8531c3415cb74f812bdf5a1882c816b955644087527c0a3272f45863cf512e5bb57869d7fbb8ae36940ba1dd619957db497e0dc98ccd1af454d522bf8ea38d42f7c837377a5c6917b9420980eaae0ddae4e5353a7944fa860784c2db4a3c552b74a7942b80a8696cc30bfac7c40e22ff4d2021a2c2e89230b2899e7fac25705e54a0e879b5a6947dd9efdc7c97c17c92adb738c90fc2ca3a7e6d20755b65c423be389ceac35dd391247517650dd005db2b33e17607d88beb92b7ae8400043bc2daf916464fd50ff1cc25134bcc42a321f01b86735234bb8d17efb273430bbc82d16abf5504172ee6f88738f57c1f40ae24f78e8699de4466349e930bcb812eadcb13ffde872a1ab6d024ef2dc670c3c8ed50617884dc0cbf124bb914416e7b89ef7d3fab8316b9a97d839eb9523c14b876ac6710ba38fddfd87e8c564cda8a5f662fe5829ee4f509272caf62c78b1bc6e5960818e4fafe10afbf749895ce437658b15b2c809bb41cf5a888f0cd65c0396393ac56a928f698bf97d9a4c4518e18ec8c0771d243e02c107e932b0ed3eb5b172dbb94b2cccfc02f8d2340806c538b4a4753183ce5607fa03636db2fdc84722aeb9d98a6ed70d0282aba3571267a189b6aa6eb65871c5dcc59dbc7db8973c7c355ba2a2e94c110d1f4064a4087eb07077e67b0f634fc10bc6ee9b8b8e1a0a20bf47a14f2c8aac75375704995978fa0b50a003096f1e8df99fdc8766eecf34a2a4f461d9991133fd5355ef8175f4c2bce96d833eec8c8118b8edfc9a6b2550947ef840cccf7e4be80bb39216fe60bef79aa5781a6c084efb9aa9879083cac258a5a9eaa3203058d7b8f6a8a4534b535dfcfe5e165e104c14cd85a4d3b91e2e71c1afabf74bc5ef4ef3957fc40523045278cea1cd33431cf6ba18e0ee8b9dd9725b70213392bd83a04416a3e084766677a6acefa99c0f1603f8c9a84b6bd877dccb71c6d2a5659a9e1300a1a461b3de300f0f9435f8e2dbdf021e7774ea4c6e13aa4b296ee47ca87af8e9e56a2d79f00e0a6d4bfcca4ce2fa5e8ddaf5776840a97052b572e06141d95e190bbc38273074314c536890cbafc866ae4f37a3ba8410a63ef7692991db3bcb347115224a14050c3356f3ecedb6cbc2e650d5ffc1acebb4566bbc10acf914c8b2b20f6c610f3303a8d3392f017c96fbcc6c3adc1c2f9d333f8f0646111fe6cf2a4af586eaa680a01334a2d7c5859c69d71de0c90880a7ab50ddb22a4ca44446f1a881f2756e707a1917cb8798566ea58cc2626735448d7540d46a4dde4a9fd8af571f4f6fcb74fa10d91dbf0863603754162a0710efc139760f792134676bfcb9d337fe58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5fe0ac8e8b5c826ff62c1bc7c5745ef0bd79ca7704575f7127f2bc12612e857b1b6307d4af0b1f9b71be573bf06153e1799a6c8bdd869a6274af9749623841b6195b41c02016ea7a12206380e92209cf7c240fda474567da6bb0e665f5cba34263b2a07c65e3acb5e03b87bd38214863cf01fc8bc9fc908113ddf18da34f71c8014e6d2d06dc2cf3e3f50b1b66c4d74579177bc7ec11db00741effeaf32c74eff919effe8b6734dd243736c1fa75801c8250d3b636ed11ff965c59a46dcb746055f970157dee8a1baaea52d77c9b0990f3924e7f31f8fa25827d48e2999239c21dd8369a64d8f7547ef4a587759d3b4bd3c7324b659a5d1b3f6b12cc00ea8abe579d8ab6c68d4330a63f78f76ce5def22ad6c841593c0389d50cff8b293c30fc0d30b4902d7536592cb1124fe9daba3001a7588a9544b5154d4a59479ceef4234679fc5220f898741734bdb874e496aa5f222a4da11c396aae0c6627e26a9cdb0b5faa21287e302c70afbf5a966b3c0b4c2f85b3062a572e003970548216f0ce63cd0528cc6fc7263e09615cd6d772f9d0b6b3e44bd8d90a4bbbbdf6045cbaa256a8568c9433250d892cebe6bd91011cf49ffa07f88d85a598799534f1a3c0ffecd9e578083212875affa522d2ffb11ebfd2a34495b025a8ee5b4236d052cb8e2e48fa12b1d4563cb86ad6369d8a49a43a37f5c4abab7fba56490b2529d3a3f623dddd821682b8d6ab55c84aa69a93596bb73aafc1e55c84d72b3729858d10e0d381d5f1bfa202fa3ba8c187769855e25c38b82d60c683ad79e90f696ae8daf4471a2c87359efa52714b0a1494ea58ea15a3b9640fb6bede446cdb0e634cc8d98691286bffdc69865427eb1a88fa64179ce1837f561dd3bf419ae33ff521a43898cf12c6a5c6163eec22abc1db2f4111fbd95ea4bd638bf7775c6e25aacf34b886bb32bfb0c2cb214225943014f0b6813a7294fccdf0ae2fef9bc5e709be4102573ccf7fa73a4ed75d19ec90bba78c0f5f966cae0d2d040eaf3d31af9a5792bd133c322d1295680946e4fc0858bb8b62742c2de20680543dc12bf8a2e600f192c3a2a4f27a3be15f03700cc174947b23801b20c23e5268632c4e62ea742224296e566bf6659481809ea364e3969a24f98c4d8d733f0c0629f98db9afcc26f4291c3fcf605e0810151e674b9547354e8d9fa9bc209114f7372fcf43187772293bd5471a58eaff55c58ca30bff0ecdc087c117f4efbad40334d6fe4a4efc708b06a255920893e11939ef3fea4a73ca438efa7f7e0844b2f1c9f7011479e387e1338a528196e01624184f22319efe949f4a53c9a294b7188b9d99c0e9bfb51ef56996242d2a59063e0bb536272238939c64d3dea8bb996d9759c423134bf99f8d51cdb4dfed87192fba276216ffa82f018483a4d8a47419dea48012d9433771729237eade06f1b8beccb08e445cd7d1985169047a78cf842827d67582d0f8fc6cd5dcae749e2049b5ea55a2fa624bdf27748fe6d55e33163d89cd345719c2a843c2c5e9e7dd9a36dabb208780398ec37794fd33327f2737e4736e37a04720ddbe00f98180eae9e5f6e818231e0828e3505abad1d903334fe78dc066a5819703a638806087ee94c0d018455f1cf79fa97a6eceaa1211dfc60c7ecbaaadf0b182c311636c4410242d32f4b024c1307d7cbc7741a525d1b4041cef97e901bbf5c2dd34a98ffe792096e223605857d849c3df1e1ba9596c3971de872d0dea0ceb2cbc485ab0ff501062a94e5de4241a8ce8ac0a65a0f80af7751cef94fcae081c2627f67fb78dbe7df94f1db0b1711ccd52e8e3277148d274799cced4a095d90f19e8e61e8bf1ebeec39c3760a6850694695e53670492ed3ae327cdf6dfe9a74c6ec5bf421673feeb28584575aaaa016a95d5002f411d83d11d859400a3f0995c8b872af03f5a20fc904aeef8a72635d53e1492861033bbbf8d7ecafdd3f4d8c6daf6ce32eef078aa633bdbf08442c95fcce4b275591abd8e9dda17f2573b8b12c1d9540f0b7b2f7c09f3b4652946e590a70d0802041bb2c5b46025e9170ddbc9aaf963907f446cfbea3a20607e7ab3ef37573b38f97ec2ed39d999e9fab4f072fc1fa4bb309358ad6ed8c7e76a255804e58af41c208b148d960e1efbea77f1951f11be9a07b01b1cfe945205d891ff57176ddab8618ad12d32c45a26cf9d07bb7b985a35ece2dcd0003769bfad04ce7136c99613a5c2205675c6f5728f6f596b787b2092c872c350de89b31fd2c7edd9ab66cf35d27c2a8ec7db98e71335102d7e84b7bb81a8f924fe52d92c2f228517dd0c2e27d200166090caeb8e43375389f579c8b801cca6d4ca5a82eeac5cbeb433835af08b960d51385c956e07bc4b084523fa8f2e26f1e8a869576e32bfbf371792fc98e78637eb27593f8f480e1f31d64af64af2fe03e9024600b3a791b128f003bc28cd17bbb5c68990faec73f88c10b664f1349b045f3fba24c5f51bbb10259c41a72492c2377bb331b6dd34fea25c2eea8adc461bd0c78d6bad02a506 MD = 8bcf4c7df9b79044ab522ecb2d9bb9dcf54b6e131404f1f2bb413b2790968c2b83c4d34c61edef8302e3129e67e3f95b249d160ae5e0c4d3488079263e5ed128 Len = 65176 Msg = 1e0c4f0f251137b65a35ba9f8a2a9525f240a345ed7ea453cff13eed1044412ead912f23cb77fc839d6d129a895598878655f4a7c9e28e51a01dd7c49e638b5df81f330e2fe3ed0befb86fc638b24a1ebbc76cd387e0e93ee431fb3f7fc64776c85f61b6997e93b618beda0ade663252593e13b26ea23c8263d4af46fd97fde0e5f9c304507075eddf285a4ec49cd88c2764f22ac84d0f85e5affdc15efb3503179461e09ee01b160e9ef87a337ac532eede1024db0cebae326aec98eb1c784726d84133c9f60e9b6bc7bb77712880ae76577689f105566711ac84b3ec224d14d96f6de31adcd5e2bf4cab2bc6cf916687752a3f5060da184c1dcefaa9353dd2f9feeddad9b7f855d1d4d07f7c9781c4e9e036304046ff27a966d156697bcfe94e30c7fe4eb2005a6b08335bdaa7d72e6341a1420bdf4cfdf12f96ad761f8bc1a0aa0539c1f2745b5390dba827281b0ebf40745ff8524902eb1f23e91647f9c2b717af7279a2dcbf5213d04cac41d6cbc384b66e4ec87e9e61df82f0921ca2555b1dcb91bfe8c1ee303a1b31b11b8fcd38b66f575668743a1917bbac32c50de05364637ddbeca950b5acc33d7dddce7ce57da802585bb23cdd6ed4033d6ac2cd68957e2015d71f4da911d05a5ab01b40948268579bc8c00e738cd7dffd354a8262582561b4d1a84dd3134b6f8ebcff810b6db73e69d82716a31acb27b84c2c6909545f280201ceb8fc583b64622801a713e59d9f08b26ebe37c0b9c3b7d7f0e82432345d459018f6ec88a8211e1daa1a74922362c1801d6df525a89a42ff1f697d99ace9c6a60e6f6b4c9a8d0ac28042f61d506fdc67bd8aa7f2a096a0eb4053da32d0b2cd69398b414c1a926e400d88612e2daea191d57f13ceaa9e1bc5db0e04a5a7a1a20420b3352f2f1791bed9527c6cc0075826edb30262cc9bf9b27802c399399e8c9d4c4d119de205bc656a0910801363484d8d8e3b56107383dca097deb78f92d45d43c39b403a42375d4a16e5112ea8ba2f3e7888517e0f016bda351fa6b063c36b8f7b9cbd3fb74acd01dfc3c817c0f6f487d9affb1d57bb87af444c0ea4fb9ff0b7dfdbbff94c3ddd15ce724dd89144c3f11979fdf533f856a62c2e997440b013445522ec71ea57b7104ab9477905ecc403a0aeff0e8c020347558ded271c40fdbd4737ecae77e1807aba625f0003352145d716a871481fb41a2731b2c57695d5aa1ce368b8dc2363d988333c777269ff3f2478a125519892a80be1915735f8c4943cee0898026586b71bf587e53cce897af09e91328db5c478676731e443b1f2020f207355d0ef119bdb6fe75348ace47da44e21a1e6bd7212a4893c748708867cfd4152f72d082d0e306b05c87e4d3bd0a651f97943fac6ff2b105710e945a88a6e184c8703fa029782af884cc6f8b4fc606fc0c28bb2e6c663c32cbe51af82b5ca6e0a0b390bb7be390519e708f47788386f1f84a82efaefb36c6388a78f3984790b338eb784740bbd3360a22c8aadfc981bbdc881b62b0385d1a476d32df880e3b7701565ad6307770104841a027ee1e7394395fe91a08940bc968fbed1e52f703a69aa2bcda939cd39ae96bba411bd8d9258f4070983094bf3e1db4ec3281b895bc554f12d712928a105dff5b78f1bf2eea5ec8464f90b103e2e626c4aeacc94e32d1c9f16e160f103b267b1851f807e15d1855deb2c18f667252d01b053c9fb9b48081dce21658e255c36d854ea7699ce85c77be644b765346d43f33b8a9a2448bf23539d5ac069cfac55506d1884abe269bbc49d6871c56fafac2c34b8c779b5397229cdb4fae8cb49cb0318d0331c1a24682157c1cd7fde927192e304d860a95fff88a5569a75e0dda0d79d3a09543c5fd77a5e7753f94abf990f8f975643ebd9d1566c692877d50ddcb6437f90bb10c10eb8f8b18b9c7add2c8a8198c989444ef07d6b142d567383888753c750b960f317c16e97fed0389533ea0230b79a7c6665e3ea80307982e7ac321539d0b7f29cfa7f085333fe4a8fb4195887aade5bca377230d4b94acae04e9ed1fe981b8f65bdd90d0ab28c7972bafecbc429bda9226e1087395030121778b5cf3d304ffff66ab6c7e704e48de64a81a510bd9f2d1513a735d77e932434315e561f21b90af608007c0fb06c4e956e8a2c92ececb04c2c1e83d5cadbc6de8281b0ccf1c3780ea09e75ad3e8e84242d01aa73410cfa6fc45db95cbd71c1bd7107236b2bd410e53978fae737b1f63e90ce65da4167d325e04c1f93ddbbdc7a09d6f82554539b24db7652e5223c6d899ddaa6f0766503168ad3fda3b522e1bd4fd77721f6aae2728e80c7d08799b1ad5e0bb4dc676f51ebc9da9ab3ca0f962d4df2e7889840aa785b7e9fd0ee2f8a53db4ad9c79ceb864ca6493feca6e8c5730a109281c37dbedd4958230ce066c0231b805bd99e436ae027083476d01634378e17be35fec9e54a61f69bade4a61ac426938339f4ddc55057ffc178d002ac20e2f1b4cbd18ce667aa404fda835761df046d991026235f433b172e1a2f13f4d60d84bc6cc42e8adb2c1f86bc44e15d1bbef4e585bd7b0062dd36c28674b0d60217ba1d406017994fef798a7bafadd6215a12aec1404f6f554445c6e12743184c0979216e2cb0db6afc38a13e4c219498e3ae3eec370675c3782d8256d033835beaab0e1fb15f17d55a42142da4a65e295eafdb2d2a08da5582d43e0af8e8dfd8c2372d7a758d173711812b723ea5fe7cd5ffceaca2bd66b26924422826caf46a9905c6a802a3a1392adb2d32a2843a384f855f92278de0823504d5d6e34189ba78fd21d0e0077e83ac3a649859addb05d529d5073fe0126fee5b413cb6b5686f6607851b952376bc9f8516c9ea86a98d6ed37a32741ec21f9d13cc84278e57326c0b3cb1ab5e508c0ba48cf0dd796b75226b943c4dafb93a4a13bfd3be341fab91f18cb9aa1fd69df97e0e33bbeceb68f9d96c4c52fbbf69fb436254040f8881dda1be5b18d0ce9470fde3ba0b49ef0cfc054a8b0c6b9c54ba8bfc2c8087595d580319c17fd8011c790855ae55f7400932d87521026517a28ed3d786bb055ce60b00e710669f37db1b87aa37225ea608a4383735bc52f9fb800339883bef57c5fd7e6e73568d37795e632b7cf8e6e8b1580ed6efc39b0a0996036b5a8aaf13a13666f810d60acb9f4a8220a662f7d0ab58439b789ea61271dabbb52530ab5823bfa1cb0f6e7eb9f5e8cdd1dce5f9249facbdcef8d5ddd9de54145e11b34dedf39f162f99a651ca223f2c85470b54ad345a66b796f1a726f60bf4b0459dfc9cb8deac6ed607ebc6cf5788860f5b7033136c259e7b796bc3610745f1ea751f2b1a854dcfed18b475a339c71a5b5db67ee3e9e1cacff59376c850ed6a27c42063c39be0990661159f47ecd38a539a8c554dda8484b9ee8608d3efd6632511660c58284c154b6b740b6278921e21995b81f946f51461ebac4129ebe6230be459ee84357b8be2bd3a829de6ee1deae28ccb8e351cc2f0746de8734c07f402c561d0edc85442f3e0d0cca03dced1d9fe85f8b5b0e1d68e1131c7581a201c323de67c3becbf84a75a9cb1128519801374b0d315bd2c97624b60a4815e18e4c2d350b817a6a49725b508f99bc7b973c3cc74235767e54e95a962489520d994db10074d2900ebc496787b6be40a95f20f8f38af22b3f4434eb49f7b3d664a74a47b730318017d53222c5dd0955695441f4466401fab41beb6f28004213a53cc469cfda18cb1408cf05815f056b3a1b31c73659ef556b507f5ed6bade8a3dce3e8fb0bf12f191db729840d93cd2aa1852ea59d914dbc3665322dc93c3baacd02b32107b9a640fc1bf439ac81a5c27d037c6076e1cfe6ad229638037ac1550e71cf9557c29c2fc6017afd5a8184841d752f2f585522db038448987f2f23ae887863df65d4b7ec61b1e35b7f5d13766a236e97abb7efa31ed470d5a72308bd215f978897b79f81b77356d883dbf9a24a546222d7cddd47e8593875e21d1989c26d94175732fdf5af8ffbfecfc4de10a6523357446095ce485dc60297e7fe1a54eb82140c0e7951304cfb54c9df6cc7676308be5a37be402526420430475e78bd2189071d13ba9c24f47e62daf649cf73d009e0821c01a669fdd5011406e1ace757cf79f40969de72cdabb16acf1d30b4e1604422d50607fb2aa783abec30bdb8d57ff2f8b82d200220abc8e23491f211dd3273a42b746bc3f5df115dc0f3b31ae2bff891e8af69bc34a62fa8eb4c1e710eaaf36ee6f4daa9a6a534924cd196f4c8b715276097c18853c36f26bcf7bcbebaed4eeace2d5d95842372b256736f2dcd91d022e98c304ec32a0fc3713ad2df2a260b7eaac8fb6fd87e5625a78145af3a72b1eb4b36bff6cd0497e6d0bc6abca67bb394446cbd1feae1655307a22161578441e84e3e7568b97990f9a3268b3d7514cd9362c2a98d027229a53d7e0a2b6bef0782b94c5b8ccfb08163b01f3e4ae11ae1e3cd71caa26859298113be08f5c0db8c215607774a57d2f28cc0508acb30b578ec4d22254463bfed504f0a23a79c6f562eeb18d38b98066bdc9a6177a8ab0c1915aa7dc45c3dccfe7bba09642a48d3ef0f41267735db7575bb08f90dc99a484cc8ab29aed33ca7e3681c64d2640c30df2e20da693268469791d0c055164590996d19cfeb8fa97924813dc3763e2faeacf250dcb36887a25ac6bb605678f30d896abc16847acc694a2de4cc56a0fb74e0c298d35dc180b145c2917e18d5eee7a3285ca7807beca0dcd3db2a7c73b6ab0208c1686d249a9ae0ed1ac5a4177c456f0fc129e779524562dde883f09da97a9b2b9442ed781e86b3b01dda0124e64f7688b245c15e478164b2d480b8081c0a3293d60ae4a7549c4771646837e6742f3ff9f9a31711117c6bba66c8de9a56824fa852675b9884052399b5154f436d0a53cb5ceaf07af85dfe5d68046a3da10b7bd1cf025933f6e8cf91d98950251b0b3867a4c35581464da603a0db62d843cd3c791482e660f26ed4c0986d4273c457783399d54d0e4173ea14d8f6d05385ef1d05ea900a07bfbfb98db9692e15b1199b9902c9e00933f852f8d6fcbb96af9aa3de19d4ce10a602066206241bf22a772700a846165a6203661763962c8809f5586c69f53963ef6044a6454711f47699a6d054f5f8e917bdafda466c2a13db29c317a29c54e9e200fac03f791802dfa89f70cc7d8d9e994db4a74925bd1e6c5d6c488b702688c60bb01abc633904abcc9b4ad888de6232dcfde73269ed9205badc65ed1ab729e5a8ee1b84ad7be3232c21c542bbf11b28921303cae2c355ee689ad890410fb585003d2b5efee7858ff1b949d1c0d0b3c4967d61d93646506f8e2e073c8e3712ef3a24b213fe83d33742eb3e4c3f83104e11c36b270d7f6bd054215cb9a8362a6b7f2c186c5659b56248400d7cdf101c0e2a6e887b10748f58e3fa3dce3914e340f7dbc62eae71145a2b3f1c294981bd4b0a051f9ee62fa25063411445e6d927b8c9bc2224add1d6651271d41a25dedd4fd8109a5938b88d00fc7f48e4598edd191e549515fc83e5cc255c9d191a2d6360bd186072ae1539b0d43a41743a3bedac1d2d88c8438f27d78e8ae0ecd07837c7e1a4d9b1ef508da816fd67bc30e63eb9efce610629fb86cd7283035cf0c641cc6b3c6de0a471702fe84d2286e499ba88bbbf8a9756d1e9f8fccd7031222069b6846884c5747ecc8f72b4da98fe5b4860aa8969437319379e51f28d330d8d97cf53b1862a0881880eddb9f7bb2535d08be4b368d228d95a089c7ac42a5a15b35d019edbd507818cf551e5e1b7012d3b4f90c5ed0b1c1b397e03eb7cddb0c0a5a9b5b8eb8e1a87c08cf5be00543b4e6ff5d64762b7f8e6bc47aecf1c15b89755fb98851f1fe99a0c1af2cebd5a7b9d55c4dfc22e9e6343cbadc6ad0e9a1aa1ab9bd28fdd4f1bc258e9709d7e906824d506d3beb98806384ef6730eb9347de690d08a5e8ee559078c3f96b1acbfabead801dac16b3d88d02d6bdc7985ab896feae3e8789baa4a7290658c94b0afecf744ff1a55ac84931050542a76dac6e743a31c15676a66970a4ca37bcef028d2540346be01e427cc02a0f9848d204e3f6aa1c339b365e0e7d8a8408be5d6f20508fb1eec4e7becddad03a11347bf0c38edce207be2f3e2e3e28d86e363c9d42e1b16d1ccc2d99c6e196296ff2b1fc57bd3107b047e7b323332e1bbacd03098f5963aa688e766ff264fa61e6fc2a944b024511bfc0f67997ed08e280db27504018051e445458bdcae56b5828b92c3507ee978498a1b1edf6cc27a152f93ffe1fbe142d42e62aefcad36790a7d25d6b08d296d4dd62c08cca6128fc939fa36f68ac1f5be68c83928ccf8d9fd6a034b2d86ec186f09c98d28d4c8b38e5470820d572952ea1eff9226b3a3bca57db2888f113a61f74b7b15ba9eead0aaa87c4bec0920419f768d23be093f0c48dbbcf79ed51c302cc3c8084baa82cd665ca6f95c49afaa2698fc52ba77d5b02fafa9ff217b996d579a3bcea3a397920a9976f425bfdd75c7add489e1a46b90a21fff07e2aaba00c0f759cf8a2f3207de8675a50f12b28acadd9b2ffa390c94e8534879a70b86d1af03ac74c8f65a142a4c2a72e2eb36d1774fdbabceddbda44b740bbc394605c86ce6bb2324a117a135121dc465f17233162c1b67253988a811aad13860023fce3ec70e4568d871964801d70461cd6d96ee9be4cac6f47488831c2155e3e73dc96fce2e435a4271dbab41df989f262fe448c5bd3c7bb7892ce9f3837b8c9e06a34525a283c3881e58a6f9bdeae4a5c1036cd22e250a2ad07c8b567f1221cfa24209f1f26f6a5281f68151fa60fbf22adda2e9bfee3cf45061b06e9e826b221a90025da76e1947a09b83721d64abb472583232f9fdd9be12c1a2636733323d75737a8e48e7960f8530f584ae5dbb93a25e63d663bba92f1c86a75c638e3ecbbbd5b7af5d44aa53389e1fae36b3f439c1d67ffd869073f07896088118f95672f49d02e66eec1dbbbfcb49193ccd1e4bd7a7cccee8e501a82edb0dfb10dd44da29b3a35b0447b7ee24a1bbed48150174edbb937213201900443bfdf2d3a3ceac62ffe238a6bd40956f07bc51e2f2645a09f91b118fab84a0c4a0228de7b1bd90a56807a2ddb67f57a6e4966d93cc10a53649aed1e2ec0a2fb5f1c2f5d671d82dfcd959c3309a3dddd3228f6ae20ccefe799392dd964d7256201626522849e92c6e3721c327d142cefda8f0705818640ddcbf105b333486bc0cf696cb63a3b634036ba8ca4ac356d32d5e01a67b599a7966b670743f0b0c0a817b598811e609eec45d33ff22d941946a2c0935d6373aea1f5efa4f4439cde7888cb9b2b97aa802b8f50d8a3679cab8bcfa5245ee1b0a0a10a0f615c92691fc2711fc71e4c75b17e81c7d940e0cbbe82bb022fd4d6bd47e4065abed573a20f068f36bec1935ecd55ab8ca4533fbdacbc036c2857a915ef1b793620075dd416c53184e4ce02c21e618b23dc42cadf00a82747a06fdf371097e136375ab77be18ef69edb8c114c4ef2af31e3a8189c44c7a5391a85ffbd46e9ccef67581705d9b44ce8f5945559b9b9662b5cebbf9203aaeb95192270f51c919ab63288030e79e5a307e57f3576f8f66e649a96163ca7b288f00eddd99aec2fe91f1b52f1f23c83a7500d954820776a26923f2fb318bb8f0bee7e00900b400526ae94516a6dbc2eb875e07ee3f2df650d28cd212ca2b990c2d4e9434ac2b2c1d1d93ffbe2bd533754ce00a4cf4a7b77a09ca712d9672c586c37c30e505dbed6892370cae18dac4e1aecd0af30b3e6227f525f6d4fd28e5666abbdda5738bec3ab11d936ed3b21d36946f2e6deaba9f6080e7898f6714a0b20951c3fb5e05d19b628dbd87c625e57ce50c9f40fbe3152c915654e73cff9f748787096f2e0f43938dceb28057fbc4bb8bed85f7a4816d9311bc7c63e4b18ab3cea5d8894b72ea2b1a2999e1f0fb64fc6d5a07174f5b4f9de65f2c8cc8f20878c5f357d21df66f6af1e69a33f8ef6a46739a4d2a633a6153f9888ae84e8ac1ca54b9afd10d627a59fa4ddffdd79d81a285f780b848e64ebc327ebe01df405eb1633e070e8180b2fe1ea58dc7f4cd4f178bb7c8476527bce0798bf15fe4dd8735dacb8812e216c0634338cf1ab9497cad6d234c6124c554c8b7f54b88c32ae35fa1a8596499ed4b90524ccb7c8dd8b16c1383358dec87bd7bd205f306e6ec1b36a11da48d0ccdfc8b342aa978d841965d661faa5426369f01b4031261b3eed6c2c0728e13a57d7b5ecf1a9293034dd2874c3ed43c389aa4634337cf1f94f7bd0ce7ee4180cbc76f110d63ae5774c40ef3ae2adbcf8b7b72a869e853caf0ce781bffdae55be57181aad54f244b946ef1a77529e69587a1b1d80d60c5e92e3caef8ee7ea12d5d4458330e241df7cb1224ad87841d1594d40afc17e54e05b80907a99e229e7d9a089db3a22bc0e4827a4e0dce83a9d71bdb241b6ec016a5f5fd2d38f50e04d30485f73378ac36991f6c18cd316db263827fa93dfc3944514ddfc5acdd89fab703820fba78efa69e0cb129f7978c5f4233883e6aa897019228797a0e3ddda8b2ffc98c508a3b397caf112b92ea26d9fb94be8dab5a2474eeee91f165fc50374b602017fd96da16ba7253c3a7118448160fe83e07fa26c6ef07f0d5b9042bcf0b8e5058ca841267e0bc419b3df4eed31b0bd0f98771e61e1ddc5ecc133cb69779f221f6be3c2c5177f4a15b5c7baba293f03c6532a5aca5ffd3a37e7a8c38b81df25a9ae2a76ffe06843cab0c8e05de0625f52a107fc0821d558695f6dcfb5a7ff7c5eb3cab259615d3da31561542affa14c3f129e769deffcbd0b68f1445a3286a2892d73194402c49439841f8ab3cf9246d6286c6f0e12e9b498b4e1d5fbe9fb14c36b8220625d44e3e86d61f88ae8abdbd242e029db2312fb9bc3add91d16c36f980e964c16d944a94a41c72212c364779e02985b87a90ede8f15b3d2205185ff61771e10e3ff5a50d991bdabddf832a6a3d80358960d43f9ed1ba255c812a960da5587f34c37ec7710ddb3da6effbcf58e43afc588d848ca2045e7e856e2a4204cfa6287d23b71988aa65852283269c0b7c5fc16c29283bbd33502ee6f3a0caa43f64c32f8428011a15c0987ac38bfa4aaef86c0e5b48b6b706961fc7391598b59d9a3893115ae8eef9f460f6d8b252de220be4864b6d6458243a3770671113ff904e6ff1efd437cdfc0ac3ddea230a907fa3131c221ead6736436028a61aa349c18a4f91491e547fc609ab7920678c266dc5e01808e4f9aee3ba81381ebab05dd855c2ba45c1a9cc00f9ff10a3053e68967b33c12446b0f3d4a682e8f678a2017cb8b0b50b449c7c52e2a7eb9b858a209fccf4609fcc3affb00f4a8057dce2fe55b9ffcbc42f975663cd8a522f70d71433c10b3da0fe009a20fec348686fd61c0c639841980b0123dcc1928c874c8c0df86061a05065688bcc79d48852b8e72249bb6362ae5e42ab64c7a6e3cca413d396b3dcd1d788db9c5b8b65873c407ddab3cb48752fb3c2b6a4e6ae9d26fdd32eb6c265175cefc29376395f8e4f8d010af39a30c1428fe80c44269303bce134e60093e5bc07238339c48da8e5b229d97bb130018f107c1e74eb8f3b5db7d79ec21b31420601ab8856ee8e29d48e9c6ff59496a527c101ccb8412a8ff33e68798cb0a1663e720f37b29b44caa30b6c2a4044d302d17ca7589ef0fe770c7a1a2d0a66ec37ab82d8fa1474b87499502371236aef02d569f42bef9d13dcf293782205e61b9f97578d384620f10dff8648ae67aef38c7ab172ad72f272a4ebb007c144d73685481cb6580e48f77e1dd46448d4b7e6870a7ca946f19722b940f9517091e243d007f7dcc43594d3b03b63fea7322ed0ddcbf1205f32342b013997dd98b2af4c6a1c1086e383ab8c8aa15b9e3349bab97506395f5eff7096661db233a270e5583acf903c1dbf362af397e3cd54e104aa37027beead1ef36acf3671dcf4932c7028689f86dab3dcb6d564231172c1b3aa0b09e056b25766af23cafd5ff8e32e9b1c2e64ed82254637175144f5f5b270c2d961901ed774716e4c227e44152890e1fe6a08f87dde1cb5a1a66efe457ce3f98953b2ce833bbbae31861b14b229fd4ab665b23034a605395babc8b6cae7b35703276fee1d76ed77ba3dfc5639af1bdf2d648b1b0d44a9c92da77ba4ecbb89e42f25ee070febaed1cf914a92118292a749b2bb437182b170ffe4ae5014bf0ca9f69558a0c063a7c558c82d50a26a0baaf3966930c926c533b9a88a43a8bce5ad3ebed44298a5805a3d2bcc19542f2ef11457be687bf98c1c433c3704127abbf8f1e98b74ff7be099660250748f98a283923ee175f1c3af3285e8dc1bb8c13793f55ea4be5dab6f88bc95e0eabb6e10695793fadf914cd57d67f3a21104590185346548a81afed632252ba50240791fa9499e332cc55ba706d2a7b06d5c09c0d694469fbb9e3cbd9c8a0ec7448681784d52a6b2e6f4bacdd4ac4a2fb72a9a1c8fff48d07e522dcbd0d4846d38f64ec25c59f59f94852feeefdf254678d5d5bfb75cb4047a9c98a9d5e9d6bf67f6a7a6df45d123bfe283b26051801e36c57f4e5693d26235e547ffb3b34ce658ef56ccdd008366ee727ec32eeca3de7c626374758bea133996007472192d0a934a21db5e71528fa99de7c66196d5afcf1448d71a2e443e0e158cb01b02c352a16dd17c6b8088c679cb886602395fb9b943f51f5063280c3accb35cb65854e709c22e560a156c35e464274918bc8923c15733f51c12dda547213c20490229f153afff124618450174d08d17ab079b1670b8ca018823ac30bd7ef1a3dee88a97089e0e5724715c55b1788279c402ddb94cce82ea9b7fddd5224a988e7cf2be01aff621ceae09f95722c2cd1669959735df0223585d0cb8be00edfa882c080f58d01f011eebc6632f4f173898a5a810b1b1ba74f5d7b38410decfdf3af512c3c4f38176f0e391e406c0e089a47d239156485f3e66105d8bf645580f4bdff8236ca18447ec9f53c204fe8389e5fbee624b2e5a495610f01396bcf05164f2a2777961903eb926f24650906a000026f1cbb9eb115d6be0566518cbff6e2d37f80712bc0d21008058b813fefbb6a0061514c805ee424d8775c9a5faed2f4db5e31a603963b968b66b6074d1a0726ba440849f0658bfa50d378665d222596d7449fa8b60face9acf15859c90c0fe09075b646776b79e1b7b82e67fda06b7347d14edbab93a283dd33c71b2c3c22023374ffc47db72a556d8402f1b9a01104bd72a3c15cd8c8efacbca6adff210a1613d029468bff39dff2c58aa639b7c2b598a752fc52356c979bea6b94ba611486a205e74f2a9a14dbd80b29f7d64ddd1079fdb0df24301a261b4b8a61d662ddfe7e84ae40c22e47f39db MD = c9c7d9b0413dd75496646779efd98d505921b9a547cbd5c460450b24fcb8119a769c27a9b63e300402cf04442e900cd496c0a05682f88c820d5a6d431005eff8 Len = 65968 Msg = 8d41b809a8085d72a9906c95931a2e651adf0e7613b0aabf2ada269ed34cc51c83fcba731f863bcdb516d84f6a890b56b3cf1000c894f6ef561ff749747a0503d9d3a5604c2200b45b0c376e5007f85561c04f1227babeef52378fde9a5b69bdf98f22d81724d4b0063833fb2fde1deb8c7973b31869284884ea97642c381ad149f8d8e468d3de481b6472fcee54a39f9cc325ec83ea5c8156ffb7e412593fc733d5708b2778470403569c7c75b2b2faf9660dc4508683222f409665340601281df091d63c5b366c26d75a80ac4071830c2ad2436882c5b37673ddef7a87887b710fe4cb8fc4d409ecae54127b4509c23bd71c71b12949bd9561338acc23fb4896fb107509fb4962bea53139ca0ba23fef34955714c238c8f3d2413f12248218f47cbed99047bcff028299fe81d86283910ae3fc7994b95af88eaf1534d04771f35996010df25569220e366788f574158721ae68c9e8f5fd0c5c24151a706fdefb5c3ff469423e278411ad7fc7aafe7d3b419fa4ea06143897054846ac4b25e4744b62ba8a809cc19253a94b263e294413325db7c6363d930152c4b0d3ab8f0dc6efa65c5af39ac0b29bd0d58efb1cf179bb91a944c09897b208405b75d6d5e05910b4e1c0e55dab4eb2ca24e527000cd4a6e3834beb4ecb13f263507b1520e596763351a39c100acd614040150bfc1d8cb9fa4cc50187b88ad7d696ceb098a5e3e8ccb4ed61d966976eda3204ef39ad09bd7f0c99486ae4807e413554ef64a7a92f2713857ce04514a13f019c1ade43b27919cbaf0920d95eb04a36f71aad735113eb7553354e32acc418b5c3d61468f1b77192ef8bd01f8a359ca09e789a92415cc1e33fd44bb2c79d0c57636903a32d3d2f684118a33c6ed5dd7b3152548be3d2506431a0fe4fcdf6c4ed631cd27ccfd4fa568df6c1ba7058b6cf97f002e69e3d410011e290902695e782ab37aa7b3d447a63bb6e5121fa85cea5ba9acd2cd9643bbfc7e329fd3a421e1b2302b229e0555897b3c87cf77325ce048198dde4fe10e7aa3be8ef1f71c711c2b3c5130d20cf3cfa5d4c69c643005df5d43159967409ecc8563c0d7d34eb677e43c7f4b06679cd95a1424115d1de247f9baf69cba317f422fe26a9a0e975c958bb517e98181cb46f68f12b6d8787caaabe583709f302a4be1cedec0efa2ede5603abd84fa080999098a25055ccc2f87e2675e8dbcc91a6a699dafd51cdde4f83031d2c5d646d22011b9dd75508595604b94da7c6968ea2e25b3504f1cc4dc3e4a4ef9f48ceabfac9d72ae9f5a4128b43602a9a54b9bf3f784c462b745d42e383cc685b9a4401c7f0b691aebe06b640430452e90c9dec267253549864ea86576764d188da3039327f9f194d37970d1c0d8b0ebd76aadfffd757a97348dae2c69855724d91f919e27d790befe9bfdec8a8dfa63e1b495f71b0428be5a9951bd81f8593d346076a80f22eafbb5ae7f3eb1ce6629382e0332404fb43160e83fc3603de7c4281c2f3b3e7a54dda1475122e728a8ae534d924c1db6a182dff0c4c884c4775c1cb927e2462c62d739fd30439b1b1655bb79afaf03e7754520498d27502a7c578aadfd17a6e7997af816790b3e1453c1e958d7d58330a3dafa68f57a62ee8b590a811b65e10a6d2b6449b80450b2d5755551874a2c50b1d696c59a3c3d8f18d314d90f278523527af6fd69b963651fe2980a5a975f9623aabdf5e7e7306aa958220c4506f3b0edec28b7fa84f6a9979c29d9be27ad9f7dd9b8506b05ec2fb14aca91697ecd31a3f191f007017afed0f473462e8596cb24d61e9ba002d13cc54d670ec8e96233f91d9b3c0bb970e350ae0ce6283b9ba7cd42690e0388802059b29feafff1632661e2dd02750768e59b0b7f2027a42cc3bb81204e21e16958e32cddac8b01309782c3bfd9df95d38414af128ad979da9d9424ccc267b80d64f61e98c9d6936ae5b042bc28a7cf412d61fb9f8c8a072593cbafd7016166dcd316fa69d98f4272bf9ee26a756a2e227fe7935ebbc5e68e54e684c7818b986811aa62b9420188d88383154356933d07ca29e8d88f1992854f593626d962a73faf34ca1f99c9c10cb0217dcf32cf7651babd7ea57cf195aae1b8566d7f732db40a5aa2f55764959fe3ee6e66905b64a0bff6c74e1bfa5a5fca784813ca399675c1708fe2e15e71028d4e79c205d37265488a552ad2707b14581d9db260227be5530ae350fe13edd52ab62249f9d43a2ff2ccaad447005279191cc9b1c7ca48833dae3fd7d42156683ad9fa66e2ba26612d522ac2c0368afe8bfa4eaa779d76ffefcf07e02a03556c3c1e54b16711c19986af678ef46f7f053f3abef4e618919bf7d1ddf256367531acf7e3a1ed5786396d38e3814a37c93d91527d3999c822e7e47b2496ff3710591c0b09c0ec180ee16f832152481bd3f830d61bd10928a574141f7e366b91b162f7ac4996f9cfa5f1fc12a37a648849d58c3a1d63cab693c125334d6941b2f2bfde60258c8ceaf61ba16bdc5225f9755601f2f45a450e684f865b049818273ef01ecb102a1bf679aeedf35e72130be0ea30a5233d0e7cbd7fc5fb465b357b10745751abe82d7eab2c304d8c72a22c3702a6a53c849dadedf24298851b400af1ed16786b5f47eff52416def8ac59d6d25fc297a2b968fe8417aac74360ce736daabac3b0f7e1c70227102c15b7a0983d2212d0f853f70b0a806cec03c41720de3dd2a82f3a91903c95aac9860d2cfce22a2605afdcde300bacf78b38add0bfee26fcba289fcdd81f00451bac1545516ba86a8a3bcc7529e1fdd9396496819cf7f6775e5faffd0b13e78da70a789042245d5ef31eab52453803805b1a068044961cf12916e3a5a5d5cbd30023af744bc69971c4dae1fc1e785e9b84cb867333431ae89ef0c36e44bf1db39b8a1287eaaced5173f308e9122d5f792afb9ec1058960dc247fd7ad444a6dbdfda05a418b51d97c84f998afccc196a7d22ca80027c39f3a5e1698e941023c409af8df17ca5fee317c511996aacf84a60ec13aa716ac1681a0477fb8a770f9e9f806299104218c3ece8bf45438b1ba02256bdf2c5e8d77509f94f48204112728895ab243e54143e2f01cc15ef312973ada8f0e067bf23205a091afdbd35d547ae3691186da2995cc8585f91d666cbcce82ad3fdbdb74c73f57900a3c81d0025f8ab3cff04f550269f35a14260f2a9b2bb238fd03097fb76c29428c1abbf3b144e3bd3606d15e1a39ce0baaff69c6a2d0edd4be12929d730aaa1bbdfcde32c1d98307ec40fcaf3dca8a0d161fe2db745c99e30b90e3389a993e7e08596537e47bed067b252dc2ed7a9bf0edee26e3703d5af66df487eb8e967afc03c6ed6d79ba964b3b29e123c9e89839ab00824936e185814db40d20df90c41828bbd33e01f3f338d4c5b35c2392e359d5eda1a728f7be063365df630e06ce550fbeb3340dd69871b09f10d6bae821c3e71be177d6ce6917a7706b4c8a66de34f13609e9fdd10a68570c962dc076b82a6701ee25c0f42b18226a5d27d54f982a95b853ca7261ad9f40a49fcc04cd3adfde36144b6807589a2cca119f9f0f70c865bc0d4febf7168905ddaa3bd83a1e66a53ef0533c5696103f06251e1854ec70d9c7a304cb3fb9b80f3e51e7bb6bd75154730ed7ce80481cc1a5042e018e8fc67a51c163a07a2baed54d036a3ec0ea227478cc339f1303026d2d3b39cb3acf2bbfe0c4f6fc54c0cfe0604b3dd2e7eb5c8db6b5111e6d4b739a1536ebd5d82f33230b4a394f5e3dadc93ea5dd083f4f51f8c355dadd1d85e2c0e3839ec1f5245f4c27bd9519d4e6cae83e9fb25f359ac55e152b0b5b9236d27a2eaddd1000431283cc8bb4dc7750a9d5c68578486932091632a12d0a79f2c54e3d122130881fff727050f317a40fcd1a8d13793458b99fc98254ba6a233e3d95b55cf5a3faff78809999ea4bf978971ee8b64fd372961be0aac22e0b2c7d9de92dfae50ae7761046dec304f9d62fba5b7fea6686456bffe41256026df44578c0fd5859b5cc18492d8668dda1c8998978a92c47dd5f8fae4c4facd1f3290a50a5aa11de35176a95bd46f7cec44f4a96cefaf88e391f85b9a1b913174b2940b81fba93ed1967c1886e86fc62d1e8c754f6ebdb842a03f2a45ce5454cd6838d1197a57af0c32bd193c9dce3347b137466690241d440bb4af1065a9fed05a653ef960123a3d2d20f4a579f48bdf05de62d9dc4c7f8fd93e312169faf62892019b4a3541a50c908cf0e8064996a0236a12d1db9ea6cb12c7faa062ae057b18f530337f4eb92062eb562ecc361c2f12c19e76138059a1bf3650b6d62df372f22a45ddc8a03e22ab246e9e5221e437dacd4eef0e5b62b8e7737c8b4fdf88b42a872270979ffcb9731f80612073b75e84746a65549887ba9265c546542c8beac8f30f1375b3bb8ec3c4d49ebe955d4c17a039ff6b9d914cc8f6750f6e7cc6bbd25853eee9444249a2fbb27eb5ed9eaa9b3804e6ddd44718920dd3102337ffd0529d372a7bba5a9119ac61298be542201924134132a373c6f792266efec5ffd04faa03efb37dcb0e2fbf2ac6cbe41055974cae39f074dbfe006eb754848e8e64d267ff641af55d69ec1c557dfa51d1f220981df6a1ae4867b487cee83ffb7334e2bc72b2378bd74a58ab2a78a2964d9eb9f0a79fccb983a91bc6b252b67278e78791a60092a503587c55f0dc4a1a4c026c3c965cfafd516d3d13adbb715c6325c9cee177b4ada73c5f00f1d47b4596c640643057b2e27d5b2357054bf922fd98b15b6c3f24098c9e09957385bc7ff2913e50beb57cd0cd1ad4780329d52a0ee646208f7f6a237a2483fdbf1a95302a0b6ce887a1e02f0b535860ef7e8dde5eb7910591600f613979d41e1db98ec004ddd415d5416767fdadb8f51171aaa5b4b498f3bc099a2d904304e2d48b309849af7ebdeebd98e06cd1fb21b02bb3e6da8465d056a293ee482b1c302eb7021ec12870c91b3efc021f6629cb16d3300b96d00086a855830b29d823ef71658dbb33f1b422a4ec1936e0154bdb8992a97bb1406ffbfa48f1eefbf32109e6bf57d768b252aed1ee7ae2758667385290a79ef37bbc1994a365fe86231f65d5eaeadb29125057ea6da470a76088ccb9f4b1dc232aefc6bd8f67a3921123eb8611ce2d3cb9b804369021463e4bb37e05e7509d0bf40eecbe348045e6643883405a89376950929dfe8077ce02f1f23680900b4971822372dfb9374c4bc563154deda5607a7fe4098a64316ebbf74cdc70186a481e7b35406846152189dcae89f3f3aa0f35edb8322265d4903008ca591ea6f502da884d3ea105a12a685020c77b941eae644315ff0eabea9b2aca7293d26335e06c517254d21c63d0b0cac1b82df78ba4cd280458955dfbf771e54e73d476b1489e7dac6a42b3e37b28f19a425045785939458b2501a38d0bcd0266e16b08f1a336b503683af3aa94996eb24e2ea56e356f42b54e98a62a4106c9c0c6e0417e5afda0803602033f81cbe812c50d40f4a039c687bca38e5900e3e166087b48dfd3bbe72abce20c2aac8608c08d363e92025d790b556983a3b12df3609184469c7838310ae32236f47b9276c690f1c6d0c3a404480234ac8ebaaca6b44743623eb03b27269109a82458b6d92cb48500374bd60f46ac4a31a48428a36c1400c54ce28e7188afe08b42aabbd9f8e33c154e02bb410e39f43b6d77699190df02964e78f7b63826ef06d6d96a1f34045c2d9d511a43a7937af270fb3619269092fecdd93f9e3cdc7e42694d8953e7ff2e6fad9ebdbc19a0247d357959e3380ef825506d2ed39ebbd567826de01d1abcfa0405526a556d4a3a0444579896cd437c325f9c8bfa66aa3c9caaa33923d42208142ed6eab6aa7703b126ffbcdaee16664e82ce20be9a90fa0968575a101d1b9fc6ae910586d811c8aa62d78d59a26ffda0426bb3c4445758d744ef0c8afd8f08420fea826e00ffd1178049d2b8f1368a5126db0db76be69e2ec6d417397d648cb1d84b2b152829662108bc55a2e3535588b786f63d18251435776e43c7a483713b921bc6245b77cff08398dcbd81afa66e7bd535fe52fc0115de2558d97bd4ff07c4c11c429ed153ab794430b1d230c52bfc2e94a42153aff584621d1a083f803ef6a7f518fb1f3c7a702a1927debff9e6c2fad9d48d1264feef8b5b2f55ad3a07b134194d7949d086f2b15ec7ae458cc753a2cd389f216958a90adac36a04768b7bd04f8a203758f78641c93849a8c4f7398c38785e68062a3a45627c4d2e7cf1dfe36077f9d21bf5b5422023b7d2ea9efc22e23cd3d0829c28a6bb020811946262d515bb0b0063a7051c2c2f01a945e322cb922b043f27d8fd93acfea39706068e0f34ff5faa76350038b5052e171fef35ee12edfb9e3b034076ff1824a71904eaf785eafbb99dc82efc834c4603beeabdf5282bc0d607487ab67af795281785fef6d225e913208816d15dad52546bfb40479d8d59cdd3cd32bbe644fd0446b05375e15731a2479c40200cd059f46e4a484c38bad06de7baf0ed0aa66522efae70da7b29d94c5a2c344f595c63ca0f005c6cc35b2d9d8a383db4b0c6d46a59a6dd8e6843ebfba0627bc809fa79be9645050f04177644056f9f789e4b52c4cec123fa704c6e9662649cf1e751a1b84a40c99dc597b54ca086a0a19ddee8189427c9855bed6b05e85a1f34ba0ae5a0751a337ecc82f19ca3a5c89775279c4ef4ff5796f0cde9307a6d8df849cc4d5e5dfac81ae181331c56f69ec2eecd784e36715697f895f0ff60c46ca45d40e0db4a0912dace3c82b4019eaa8bd0798400a2a74def3cec895ae18947a2be0da6fd866f98245a5ae64cebc87458e2d2c74d80c6c406817bba2947e1a35934dca7ad5853e2614c8467cc5d9a8592ed81491b17f9434492e98d54d8f60a318755ecd407dd79fa6d610e1c9f3c64a2b92d1254b066531136df0ac3ddf003927e1f7c58dc37e455859ae225f9d799ee0e7f2bde93357bd53405385e9df717e4e3e35f231f86abdc5cd6ebcdb393ade0b41f9ba3088f44f855021f0e6231cc8f7c489e1b18f557f6b9be32fd149727df72b46a89579c35e2617fc7b972c9adfb12f7402a0ea96f0a65f9be9e650c8f5212e6a07ac783d6fb2023394816e53f916c974d374bcd7b8229309896ef196ea35a5f465da16dafac59977ca496ae0cb754d1ce29158703c5cb0bc6cff7e74a3913c464192e81495bd68298b33a4b9bd6904dcaeab5ff903b1331522fc89eae7c05c00098b3e82b725d8d965f4ae47457e9b24961735fa94ccb4b43a0a9651fd4f7f924c17bc9dd57b7607d8f0da320a027a9537696ccd760b900a209e16427a9b217d77ccd4de874aca2552bccae261b12d9f1116870a1dfa7f97651b9c44d63ffc322b1f09bd32f03fb261acf2d0e2f71eb2a1a2f738f315bdec76279ad196aa4a50b482ddd26f28615f9465e4961430e86077934fd29be9d569e236946142769649d2acc386a24fb95d596c129a5c1af538e17bf34f8ef3709027cd0b8c50018a8dd3d15d6262c2b26c3f23ff765101df9c9da1743832aefa0fb55f82ab55e771bd56a4fdfe274de6eca4222d826982021c0ab865052d88fc3919627c56aaa50638c9ac47b2663db15f26eb0f672c17f737a735284ee62dd19cd28a6b16e4a69280ab3bad07b61ecc4435f3279d0f30496ff18c406de2ea24bb6f1bd1549a88a13589e7a0968d6d723c6fbef89c9967533578424ffaaa6a50054dab319812a7dcb7d444c4c762a65d9822b314ce4129bf18b9dba96db31b0e1b0cbd2e7a03a09f9818c77c12bc65e8f7fd83eeda9cf3e79a14dcdf4f8368996d1ad60a42e3ff5456d5d459212108aecc6e86092a0362672a47aa740891ff9c6c066a67bb1a10a5648a1fce4b071b1995e45dc6452ad1a85990e8ea31753c81983e0ec92b3c710d51a3fe5e28f529a3d4fd5fd8a469de45a8af0cb45293abe3924017a11bb1bcf69eb1f48b136190e81a2820a2c046f4a987e08a64d473ca3cbaab3972152040ebbc4296d7c2d30d50d5e324a74158915e87e3e66e3f9c13e7a1edd8ceafeea9773ac459b69fdfdb7888bcf068800550df1917a5531c83158eb8767a2934a353038ac5b1ca02dea7c9a324087904d39f95cbfa4b95c3bf4b9c9ed381e44bb4ea2b2cb53364a455debec5a6d12b5859fa2d010a4db8fdb7229ba593a4b27db9bb48a1115328fcdc0cd260b3ef21e2feed1f68d6203f02e147066d154706131853068868958964e7aeaf04d9b6df5d38e4c763dc779a7be405577606ed41d4575dcf33398ef8850f30af0296ccd5ff9e7dbf729b984dd135fa2920b71c081a0d182d41f28418c5993f5d1a69958862a61482157216dbab3da1d61dc437cb5c902e8b3522294cbf3c27239cd0a5792ed645a9dd1e87d6528178f8cdacd50e24871d736d56f316da5e84bd1a5a811abcb58d8139ff4f907fa80bfbb0df78430a6851608aff56099f76d46403659d0f74ba58b2ac72f2cc7af7c77957eaa5fc66aa56fcfe89e687772b92c2e8806daa1f5b33b8b53805dced1727dc234cc2acd1c3ba834895193309d34c445a49879cf51eaafde4aced343e8cc9aeb37462e6c45ae8ade99f627ec0147d82a91f5f2aae8b3b1cab503d74f7af196b89001b0cc6c66dd7620746dd224582e8857079059417407f79b06b11a114939d046e4fb1419cb69a327b5ad0b90d19005ffb49a04e4967a0e04bfa9cb343c4bdc61d6566dd445f50eb4a02fbecd18c4498fe657d55a82d2b7f916078b6c329383eac108ff263c4b5ed21d3a14619792fd128410f22a9fd79980f312813f93da6ee88c5af19618313c86141735d6b4c4c98d760e83dc54515da43e13d637c7e844631f946cad417050da6d0f48b4d920540aa496b1f90b07aa6adf52b1dc3685ae6462fe97f11fd041d5106876816d704790f6f3a3082bc229dcbe173bb5497954f13ddf9bec1a18b87fe66ae6c7d87a4928546b83911c4a8201c4aa9b4a668bdd1598819f269b125ce1d55fc10d810703d9a648761c45675ce1d752fa23f785f2d55b2acc260884d602c68d2edcd2de1dabd4d0a63210e15f85e05980c9622d3a3b6e234a74cb37cdeba23d56bb32c93ea6c64c3b5ae47f34f4c80554c3114c5e4eb9b440984af3eaa24fb86032098e0ed364035d1d290a8336759f9f996aa905162424d61aef7fd531b74375c9c0f63739973f3202484bf354d16e88d4d70ed89c98bd368321a5359fc029bd09bdc95ee04546e591a7072d55c3bc38fbbe417ee7fbc5855b472bb2f554b05f7969cf2ed157629c52af09d94132cfd796890ba0ff3785ee28cbdaf53a5a2284a22ccf4c13b6d87fcec8189e2108f18c2d9f34e6ed32459774147aa676bac5530a6f9363ae48f3b88c5bfb24fc2c677f496884f7b8d64da8c68ad36db25ce2f53b98e119abf7fa6c14ce7b14da867cd9714cc37c6809e44aa795acf0f528c091bd11821611aa34c6ef8b6016c3fe77c22eb3b81c06b553a49e9dcfda4706a95016403e03e849eaeba4f872d1c07c9f6107052c8099c1e3e0330a02d1b0dee35ad08fdc8839bb6506bb7f78eed8e83edf84aae7502915d923ee440e7d3998b7d67265264c0beaea3dbd873c14142a9a632d0bb133bf99809858b3bb88e91c6dec8529e2f866bdc4b8317784ec7a2afb168b8e52d161351f64f8c0d097c9524dc69045d933521c39a09fb9191e15d1ab20259c91d31ad1fdb256d11755df229f891b20d3a6d8ef931d8fb4c351ea05f1a8839e37e1ef5563a8fb5056673575aa60af2298f9ff1e18568ad0492d03af14d62efa0ca2eaa9996e6ea35678d331b771d3b3efd3d09211741775755c67b85dd3ad1ad8bf12b5e72d3734df2ebf400ee40f3ba1dc5131c59ebf0b0d831e0614c7886463df6f62950ddf69b9310388f7e2eb2277bd8ce47efd09fada4d318381da484275ab0a96ea35edacab2aa7f3ba93f0d0361e899482b97daba45fa715eb32741bd5cbea3a2fcee9647ec1b1689e1ea5aea9a64f271bf9a384336488a69cfa94564ce61737adff5cf8fa9d2bceecab922297fee6878ee504ee4e02dc1dda58315da2a49a73a9f1cdd2e7671c0fed644095c7ce569a26a72752bfe1ac62ee74d2979faf7ad86ecbc4590dc68d12e66f367002bda74a2a6494164caaff5d2077ff6c0aacbf4d43b6c9f5346385bf22f4fc191073e27de147d4a4be05def6b7894044ad4672b96fda650e23e50cfee81c1bfab9990f1d94756e62dc995015fdd11e874e239a063b5e1f0ca3f52ab77f0e1a79c5d734118c19eaba700f5da23878209db6eb3f1bef6b80587c3be8d230f38100fbd45b410e59d113400e0d85b1a5cfefad4769e0d3280f58765e4d3743f3d9f624398b95655daad4163f69a6b081b1e3fbdf213d2ebe5475580762cf0035a9c308adcdf5d84efd67b84a78ed7c3450e2675a6e1a4a54d717ecdd2e80aee279ce6fd92849ae545333eed643435fe53455ba60595f6d1321a7f889b9339721d2812164a479309632a0828bd08e9fbde3a2bc9be9f4e023b98b45b20bd1011b3a43e5f7496da63d25163a1329b885e3e73335b026c1ebab272d9b012d4035f83b7d853a200e5870b1fde01356a7597fc86eed4a18afd5d3f4f4c21e266a7bdf5d95c7d430428d5860bd3a365d4563bb0cbdac0fc8a4e8c5a74781b0fe351af827f4746e81f28e1db9be11214878eabd3d8739a73d896aa6c890a15fbd8b5c6c210254af1c07a4e644692c7f1f2a38ade2335dbb7f47a4a1df36ebd56c538763d3272e40086715db8a2455f6e84293b4842be0f397c4dedb75a124b71375e404c6cccbc84dfc29261258522eada844faaad68af68cea607f113817b0b8d8bb788157f4f0f4ac2aec646eecd1754493a6dc9c226d66a071b33c658b66656654e78c326f6004615e5809cceb8449fec7e0a3e572ff2ecd5a9f7d9047812106f67870c304bf85020f8f88dc17f130be2ad285194055eb5b646d5c1f14aaf5a0eb53b4747db6807783bc690538c0326c02a10ca05516a531d442617bba89e71d79a1e0aca1ecfba8020535ae159957f09878c0e379eb6437f549150c01c50263e98a7dd2370a017dd69273417722a832347d2848737c31550ea7ff3ab1064b5b8335125008b797de468cab2526062c1a1ed8cc380d7013736687a86e91f6cced8ecb278ddc9cc7b3991b66c2eaebeb919db2341c0d701379460f960e6a3b8c02547344f17a6098e418662a808b7aee7dfa33e95a3c23384ff6675384047d93801b56f2e4acac13590b9682c7d05a3cc87e82725c62328adebeb867362765ea512c9bb8ce38283efabad2f3ff8233dd586ec857884744110ce62a588e9b9a985bcf6b1f17e77b23b06c43079069afda17152c2148b202d6c2b5e4b0f227c5a5884beeae27814eca616a1145e24d743aebbad757036d13e0e9740ff6cc958e1abeea4bed67ce4839f6fd63355df62a05bea4f081203e2137676cd2b383ab9cfee7f2ab643d96127a586b61606a2c7a44771ca02709eed1e426e2566e7f329859eaac359c12a053956dfc354d6fb60cfefe6a0fd22545cdee0c21c2af28f12933af60 MD = 5169e69bf0e777581ca94e070b47454ad7f6af034dd3e2ed564d020f6557fd908f721e2b19e548fb0c41763fe0abdd89efdacce8e3546faf22f3fd089928b019 Len = 66760 Msg = 07ab398f3a21e5a2fd2c0f8573ad22c683405d768b1d292e523caa503fbd948fc98640b22f2eff94691aae705ee58a5b57054612b4ac5bf6deeda0557c201aebea8715a9e63273b58d1f45b187a698407e1491c6d497bd70955aa275aaf09a9b50f6e1fcc9f4ec0a5185fcd154b8f47cdeb5671b53a4f6a360cad93631f5bba5e51bcb343f3e109d9e92fc572fe245176130f098999caf9828876c237af726138f3dfcd8afd687755a906dcb7fed331aeecc53c50e468f55d3d784c1ebbe82ed38a69b708385fa9a6fc577b6aba2688c6cd3b92a1b6c3fe44a03499aed117839c79cd18422131115c37a409e1dc68975c58b495026d4664d7652e235e9bab0012468c69df44873ed40f6f30e3c2441dee03d2cbe9947ad963e0e781a457fd14c3752a14261ecc92acd83b68b708335cea53089fcda8dbcc9897d32d26b298423e8a18bfcd1c6bad55167b19f21aa104dfcae8993536e3aed41e939e4c180708d1f9fab52ac9feff4b6eb0ed1b7627863cdfd540a6ab2cf0b4d98b4d8b14b3e92c4922acc5a3f0f92e357f2a99a731519006611e98920242a95d3cc37a154953abfc32ff2436ec3b4c0f387b033a591767d31e9b91782e15201e1a987fb611e8ef87ae34dd0f4b3643506f56de8c091822ca603007c9eae8b790c7253263b809557ff6d64679886a92ada6469228bc046f60d88491f3c31dee59a50208aaa6457c599f6bf7223e58c87b5fb2a4acfc3c9c1ad9f196a2615522dd46a788f7572dd2891a6e7575e771334e0e23ac654451477cf71fac42300f03902e9e29d66512e6a2fa463800ee54819a3422100e2ec2dfebb257395fa9bbff16cf4e71c43aa5271bb19bb53fed6331f4543655e41601e40b9e40d46748dc73e59b40d74d52452277d2c783af5f3db2c100c904a384aef2311d64e3d597e10061350df0de4683572bd06219cbae448294ac62a2b9152a6910a22c0e37118a333e0f1e250381d033cc2ce3ee0165082ff3c98b969121f4d71edf1eba0830087ab09bfa0a398ecc56cd5ad5870d1df92942eabc76c845aebaa026a56dd59e1c458d5e1a06fcd7d82ea3ecbf6b3b33a7fd26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2fc0c736c286bed7ac38713d6830d703262def20bf310e5d3f736224e2ce2843d65689c3adfe4a6e3d37ebb3a48ec484c2b39be11a1c58b949c8e4a53adad36e91924e5ea2ed6330fd7d77c936fe60edcd338dd5ebb7879bd4a0b3e31e398ca2f3fc8b546bc4a7c47f81bbda89f04aa2a8164b8bae82f9795283767b077aa2957ffdc7314324768d25ed1e842814d047e5e43b5edd0f4cd665f992d9811ec39a982e9891d37d6e1fa30816429bcc90420925f3dbe1cce037616b9f9b05864e36cf0775e2974fecf0597b39925f98093574440b9f674c6210f762031c1f51c10ea710c5a0091c7183cbaf0effee07b976d9c6c8f5d7fe20f77a7553f938f1ca6692b32e5693539a5e7c2bfce7b18c1f9a8c36d29bbe62cb5f6d0e089eecf6a8f324970672d085d5e4ed6a99e664a5aa251e1cbedd850acfcd6194a799a5d10b18df14e4814b43a2bb81f35c7851d4f79af1d0c457c6669ca5dab1a755ee016f6c14c55f0e6ded8f56fc4ebb1a13aa7650ca0ba986ed06b09d5aed8e70401824418810cc86b3040a2b9ee53c481486a50ae925c4d7735ba9f84490d3652675e85d8b8fc366b52791cdfc5f669eff0a021de1a7bce5f3e5f76b3a540ca11bab2a04a1baba3adec8b4928705b06b1da52c0e4609e82ee926174a9eaf90b08a4847db6cfa378faa57f13de180a0590ad8814088d4dd1ebdac883b03fc06101cbde0464ff6c1b1a255c6147e48ccc5412480792c9112320bd9c8a0ecc1e34c2d7c71d9bd18cf6d5152a1aadfd68c5c5b09c80c93b70e053e4e6700cba9aec157148b0a56d8d6ff31df228568a2656aa308b68f70cf4704df6ae1ff231bdf1c04167a5c8fcf7f03be4bb728bb44fe9cd391da56263253cd69cfa7e08580dab8bee2ee44da650e076138de093a36ae5f4745b2052698aaab67ed475955814834021a5557c9222a76c51705ab87effb2e8884cc11146ab23b44343ece3595adfa581d3e19ce9f4ade5476dc8406e96b8711ef971e6211010999350cb3882662884b7c06ef7d24f59a99d8b12749ab85e56de6816182242d72d1801faddfbc0c7a36a74e5d376ba157ffad3219c2bec0e616fa399f073c8e2387760621aedf022ca43f82f79fdbd4931064bdb0048bb30587ab2e3b6392a97825b75e936807ea3c3e95332318ee05b856afd29e71aac2a04a69bdbb29ff160d26a47787bdbf3b155068dd84251acb444cef1f49bc847652d9c68682bcaa4a4f24cdef82f27d7b3473faf08f66fa8bc36d92e22627b14499b0421746be5cbcaa8aa424f9b8bb013623ebfaa93105ddb2234bc9c855b9c3f1585cce6b816ee3cbd2c7c67073008386eabc8a5625b517ad187a34b4b8f66ad65c773a65b859661f9799226bb3d668a332dcfe3ab790eff0c79eb16fe40fafc51731d9b9c5c4aa1233a8f76fedb5371786dde4bb6921cd499b29de4e495e195a231d3afc2c093640516783e1a3256550713fcc5cacd015f40dbc19f47b7a2de1fa89cc917dbf81265b657665569f79ea6c632393052470acb9c5d2e6dcdc541928180d1e1d501130cc133d5f8a9beb41e2e878f314a753c009c7b799f00d325c16387b069d636d0c2e015754a19340036f403af13dd145ca9842268247853f276f7ba4cf70520af4ebb042d95e2e0e8b8c0ae821e32abd48cfb5be3465ccd0f77e5208ed28a46197af908e51f2b4ad56a3991ee9c72c20b72aa2dd24bd4c9e68cd4c15e448e30770c432985321dfb301608b3dcd3c4e2692238a01d7c0ad0de7f6ca6a59339672fcd4070f614e07a5f82d51c350c519156664ebcac2123695f1756d64908b272ab8599e41e0d9b4fcc7747d5df8f405a3a04948a67824a1dd11b3a5934eb22d951fcf58ee6677603ddbc06e5c4a4bac27dc5b11137e6a5739d54bf384c84b0258bf9fd7436689a1dfc1bbb54cb93e75387714e5902975cf3298a8e7a7b1a85ddc04659a0f75a2f25905a0e2bdba3ee94c1d0126bb2db9825de844f27a8f7c88957a9b01a0f835ca40142a671de1ef80d91a9a64e2dfb8192240ca948bb61a2b2baebaae8682c4a21b69b2c2ebb4a2c4760c6b10a5d3e3ec164e844e49ba13bdf50d4f014e99c2124192d476a5a70b3c997eddca828eef83a04e1c90332ffba98812b2aa6791d083591bfa02ea3d7b41b9ce7cf2f7851d6866ebfe0ad67c24765b5ba00a402f527dd861bde817ec958c6d97c31a734b1012c084a30eb22340ccf544718186b6da7a36007aa6cd38cc751b473ab194454a0b43c4a62c44b9b2e5dc69b1d099ccdb010884cacf68a6928449796e48c9083dca771861d41cb40d898747eb5807c5d69ab64b28b278ba8a328e9ab8508ff85dd8c0ec70a69886b3006c4b78884f565fbfc5d00f007be916284127b35957ba4caeb7dd5d1446b645e311f103f1dee2c8e8bdc00829f0b6c8ae07ace9d3cec26cb4d257819da5c728ba1ee4f825350fb48e14778eaf65b8046c4896c640438540a386e788a3444dedfdc973df82f011a54850731cf149416bcb9a71c33f64876ac37c09ccd5909f1816c84a24ab8ead1d8ff85f3da02a07614463ca7b21804d4dccf83ad8a5195f09ad91b4620f7f368fdd82885b3c765e877f4b0d6887454b5c08a1f746825ce2651a9c6f020f20526ea9757b1016bcdb40d4a6b6f5e12216380effdb610dc9edacf66ec6af5b30654c8c47c3d6cf7bf21fdd0d53adbf851244586833e2a7eec533b97f47a4542e03abee7fef29e722278700e5601a830ce4137d81ad35d149fdabec548e9b9a57920f58945983ce4e0028d8d578a6cc27e027d6c2a3c51a4a1b780774f7ef8e6bb4e9431b9f7f156e0047dd43e9ed0b44bae40ca1c42af39d932a8357103ab0d8c0bc468c2d662ce0ac9676b75057c101c8fa77b56ad1fd82f935f88163e7920d6a1adb5c8ff3a57469874db628717ded8ebdb064245488b8b21ccf6a6f90b29805676a033381ff67cb8cbab6fec4924690b03f347d1d359d525180989fa082f727348b16b4abab59472966303fbbcecb63748cbcc1b674bf5e76a49280a193b943f4a71d8fdb29b760efa8c857d153da7b6d2153be9ad67d4afeb3de9f0e654ce04a567e218afb00bd421ad5f3bff2024d2c859fb044db758c5c26d357616820808801cf2655bfd390b334ef8fa209b15d152207434ee436a701961756251cd2a9504166eaa5b89e9fd57f7b88520b962fc9af00e403811f3fa15a20f7d413e1cf158dfc0b05a5d04f0b63107a3a87ff49bc55431f2d52cd9a9e0b76d8f8cdcc664a6ff4e3ffe7f702d78834d1b60f7b1f6fed145106a9906c6a228f560dab0103813fc821feff917fcc476f2b6ef2882546bf1b263a2616098827e11b7d4c0e3b3c960c317d6d3dfa4c2915e3cfe1a4fff343be0b3228dd169a940285d2116251ff0b278f05b13b26f9c5cfa7534d6013d823738c89525407f3ff6a11b6abac0c2af7b0b7225c377a3775f2c283a637e577d6e2069a12f94246b28e6b757b29ae52f42e365ddea16897e235d1fb7c9b0954c670160eeb5b79d555f5ef98f089dcf988f68912a917669d62ff62054117e3e18aa447325be9035262271abbbc4b0ca11eb02beb5bf818baa0b5df4b942cf9c08c04f6bee53073306fa879382ecba1cc2dc19b3267c1e362040fc638d648df545308c0ff07b04de1c6e087b8d8aa50ed4ec153924d035b460553a3478809f92f6826129d43e6f8091065c2984a558e86fa35e1857c4af4b93d27e31249cedbb443f387f41a4305f8c4aec650d46bbf2ba885c18685f7244e140322036c35fb757ee78dbe0b630c336c31ef9d374b674de237800ffaa67e77125bdca59faddd056178903597b55f6b7f85bab7c3731b503fc189ac3ab767b6c0c87f7334b4f4c6943d3bf53fb883f36710c45b19714fe4f9ca6ac5d6c884af97af86e6cbd9d74baf8bed9773fb2e5dbb7978d199d4797ed8a88ff74f5839a41f978f9ad58af906ec1b2176c4eb931d051664c5d50b2c8034e285bb14c51b46c106f5e9e256de8b0231743da31876b3ac7df4924b93ed9ba71ec88bc7bd8e0a1484566e62bc0c3a6a855236bee02db44a26c4e17ded111397a3e4d3c8a0265082762d92d738e6b78d7d480c58f14c813697421dec954b9a9f18573da7fb58dca372e7f1d03c1264f38fc21901ba47cd2a45f8b2082b019315e28c33d64db9e0f0012205ce53f3d535436d0759b993da7dc9454850fcb79fa4a91020d405be1fe0974839221f2f8abb2e8531b16dd54ba977d44b77a8f212b3d27fbf41c1d9ec0dabd7168bdc09e80db7c732c945709346081235bcbe358edbd527598ff091d7cfb56b285c39379f95558f84d1eefa33dbc08b81c08ae6868547a37a1f107a55bf5a50e933a52cf3faae6aa28ba8d6cfc357acc9f3bda97c389070ab8fbff7f854e144d372be5e979618c51657319aa9a5240278f6b4e2e27e461b68523d9f421910a361b9d330fd003b4b4ac4e7ba63f9bc09192a1f274bbeef103af737d4a5843ef92e79826886c17c59ca3559ca8119963d250e4aeb3a82e1db9dff3d3c951ee2a294325a59e742527d1f58f62f73bd391b1733c6a31152d4e9fbcaac4bb351925c3d54a999710b6411b4804b6dde3d2b3f8a0b10e382b71ed7eefa036662b4d47284811e8bc6a517d4245bd81a0321c2f6d814c820e1184601e1fdd12145c11f81f42827b55a77e420d93c1a9894f3b6fd9be14aefbf0ee1147f56a410befeda0726ba43aaaf2c5f945da1818e062b7d903ff127b49f03566c1184eaa930d69a7e76d7f0d0271af08b2c4cbb4ed9516d7b5eb4ccf3e38e3c953329134f6de0e7647ed1bdda74cc3d81cf7e167f70ee2d0b52acc9424f17fa1c7e83cc97a89637359968190dfac89d14b1b621748f5a22ccc659ab041429256e3e455506937f107e70db810f3b98a5b07d957ae2673df52c244bc0dde54a35070cee7b0090f3e9ab7fdc8432b9a4ddf17d9c713dab020ac5f6e3c91424f3af6354df7d3a33ad495930cba13ce785bc344c2ba2eacd3eda16b8c2126b75ae0b2fc0a8fa07edf3b5e41e29567267a3a71563c38e7e304ce99ad4574b3839d1beb8badb6ffe427f95f8928612679c9744f15f14a26c96d4cfcee423c1fef41760aabdd75d81b3a98ff3586263a108c91c74886f7d3a433ee33f62a8154436e76752442d3136c3fa0a50ba3ed8a33ec1740b9a648d6bd813da48da64c39c74ba595be85d8991f5e97bbd528bdfe291190222ef743175c7dc0b87b5ea4b6c3018ad2414e8c507cc107a859bc9f7e3c2283d47021f27fc94fffd787f991b37eb7ad957444f821cb8d77d460089af2b24779c047cd5df44b20826a7b201b1841969744201023f453ed70a7b1b4b642d4aaf94d7aa38b5f2b18d2d71d7a4bcd54c6cf490d5a15b25d0779891667fb57ea708be3d34a84a9b25e768836b028bbff6edd0a03c9d74131031ae255c972173cc4b7ea186b50b8251bf6e38d69bac88ab74af1ca05708b170adb1a3783226b11cc06ca12adf876cf76db52ec4e0add3cc89d6429b7e87757444599843d143bb3b0ffec89b983caf798ab3c19061fe35eca5ecdea8748ec38d8dfc7049e4e7068992bb64536f99be4a8f109dd3a02c038e41693d31c97d403ee310d7e4fdaf079af10910dcd62d3dfcf32200092b95e123f4c1ead1fdd1601b0c4d1bcf8c0a52e1938e6aa26c7593035f8eb4ab54ea3340288d63f37229a77441f7c84400676ce002b1be5e82f151f01cad1834cc879e5565223530d6f48b0d2cb779fcfb64aa38b6f9a84bba3eff45c313a72fe30c76f63336daf48cb08f3834e29d54ed70bf3e38ec94f492acff66db48ee0748d751850b21c1c913fc2877e32f9ed6572a0072f10121037cc9d6e5ddb369556e76a294658986290d25eb5ecfe51b1bb8ef127987bdc8d309141a4532e98594b4790e96cab4949ec8cc4c5f53b98e7f933e69a46598e8fda82a3e078361df4fbb4cea2eb3598994e75dcffc0703558c66967aa603192dedda6ac6af37a2d2d0f360c9aea7eeb195d968faa762592cccb395c9d0e8c4f42e2064289ed8231cd2fd5321b920cab92c2f6c3103ee3160bb0aaadbc7af12d8391a84e878ed78f9d029a296b0a6941cd249d6177413029dc1cc5424fc9e894689196b9aafd00b162318cd7d27b1d138f2c945228a7973308b791039e26f9ecbb8bd8693b6385fde763b3259a0dae8ba382e27c6b979d9c582a16d9f0b7ad9d4226744881e7efddf34118fb09e7a610d0cd8fc98839cccd911d5caa8fa48b0fc60b743dc6b2c5b84d73c24269328d09ddb5a420c6b6ab2c7e376c60c1161cab0ee1df2f50eb8ff6bea0b9e00015e9e093e428686e36c222e6214de1cf35e6d7e451be0869bbd6fe0e7006bf17b944fcbaff238bc8e09a1890830717012873fc0e0318af574a203a058db0c5f54625c51ab19e701cddba744503a3e89e184b83559ef50c62bff8116a9cbfdce4e315a37a9f9fffb255aa9fcd4c283ef02cf4d281cb5e07d443e3eb07483ceb2ab89bfea3743120d16ff302f0049e003d8df8535a315988f3fd6b30a2362eda10ee3f3e5ed659bbc3531c0476d40d16ce62df6da779f1770916174904119d91dead89cb716e21b8ce2aad0c26637e67ebd42f87324a2bbc5cb56f9cf57f92f7dc1c020ea4e390ff3b1c2f84c95af8dddb0b720bc14d113f3403fc923d2813f65264316dc1ddae79525029d32760845fe82e2f601d29aae9db284594a3b62b7587ac9e518e06840c5aef2361081e29d65865efee0e87fea0984bd308f0cedf5dc41dd223d50319a19d20a596343bef2874da391d5c0f164db2942c57ec1a399451df54495c7f7621610c38da7260de3e84b29555ce68f9d9722cdaea5f4240037619ac2dec20a172efda63958c35ff00d0188bfe2d3baf2a203b652811eefc927bf463354c8ea47e8fb3af2f486159569f32a480412f412a04e85378cac5762aa79700cb4672872b88bfa3106f8df4293b286743d2edb6bf655c2e44516fb5b1432a0b56a07450632425c7a0c960d95fea235db0a81c16d38dbf7df36f95c11197d70d3e233b090da90ea3481d830fe2f54b0c2d8a656a4dc238c9edecdfa330ebc48dea9770b91160a1c06e359d9e98a4c7fe234270b9154def999990f462f8871913c4c4ba69579107a57cd7578f6b3ec0bbfb96e40b13760d7561227d064fb2ff273371c220c68467dad8cc59e9420d5dc91b4f6a682f84bae5ac6c21981fb69e529f6830e64880eae8ecdb4ab40457c7b2ed35a9d951c11d72e334891f4fd91d1b706fabc3c4cfb8561eced3f99b6525fed70f4a6561735fa36c435ca3c764a40b0f4fdbc023b7f8acd86c9bbfee7fa03343a7f41547e3a701b061432d6f9f5da8e2d069e44b81d373817c4b0ee5ec60db98c350f0eb591e131755e6c32fd16e7d52b9fd382574703280c78aee68f68c7d3e2c05fe351cec610ae9ec70ef43ff0fc8d43ec299daf8713f1501685fe34ca29daabc470e763873efe3fe39973e39e8aae7d58c90f992b8252d5783b2fccad11d041dd45cad2ad22f0cc3280f08438f61bb699ef01b67909ad935484a892b922604cfac090aec05332ce4443fe9468c5618a3fea3869e8006df43bd0dd29a6d20707bd7fbd5a394620b08950f2b6a68f0c52bb68f826011d20828ece41e3deb7311c85e1c567a082370d8246815d6aa968ca8ce9e59d5c9641c8dddb7b73c9387af5f4852d597e7e025fbf830eeb3dab233c34cb751243325e319976fe3c0eec412e79d879922bc00f01a1951ff2880ab83233ac1b476d47d257522f2ebf18293010965a2eb440ceb9add90b1905e25e944709fa6c8f236d5a948862a17f6da5a456da98b13246108ebeb643ae87d50d43e54844dd6c1e093383bcbfeaef87b82a6ba712a59ec42c1aaed9dd251ac8ad43875f09e250a5a219af6fa55fa1eef74ec99c36704c1387da18a446311135a51fc7beb81fff62de597201b194191bd97dfb1a92a5ecdcaa5966b60d471db48b3500f7edeaaade049f6613431cc786d5247ab2a5bad38809f5238f90db92cdc62fdd9af9d6f56fbb381634f85e3fc870feb2e4ee23a2ae2d49d9818f6312d9fc6cb8088a69619068dfecb73fdcd45943594e31ea74dca79ac3e33c3772107184781ad11e1671f8a3e3644a981d47a1c2c0a71a1922e40cc90ffb20578d0e1d04ee90751372a900f2ef174f8f93ec3a55b1582e08c24b563e6a6bde3e187e44d41c937508e26941bc5f703684d5449b92c7dbbe17b7851c717fcfb679a8e38198aeae416d0a451386b0f9a01655e34df0609c6ae49733b7f8cc915988b2d04bc8f14b7ace3ecf2ed8803e1cc29a4aca051834b4fdc5a9c13acd5b27e9dac70bcba0e5719b1469dc284997fd0826dd88276b1f1ca1e789b0cdee77b22b652a6a372a26e6520fa7b40c79a1d155603e00fdb5b6129f51461f18cc9188bbf68cbf81e96a1991a4fb3eeb9cd62a48facedcfe94b43744b75154a1d4130c1a1360a4428b39abb868e6d55c3fcf78413b1274908483eb107e4e0a0f9186bcd4204890ef7c101d64b00d3fb4bed83bdcc5ab505a119faea11a9ea79881673b68c1a70def3887def53ea0a6abb69af58a0eebf8b1a872026510c5a603102ed8466bfe83c84cfb71085973d2a7938235c79b76f64dd5a586eaf5558da5fa58440b73d19b112605740c94e92c1ef2286d13efbeb17505a49c913cb0e7177c8def169da2ac405010488075631b983ef80c0d7035b2cdd4e9c3f65b7a2ace231a39f63df43fec57b66ee27f8439a9f66bb302b17e82beb00f8d88d613c1308a97c528d948ee6ba96267d127cf0eaaa51dc29247eba9de136069d7311052f51f71113cf4030044d19ec3aae2a5f330c768eb3a982f80a29b96e95ff0f248726e509e9112c54e0e4ce5f2fe449b9fc2c9d77d7a369caf82a51d7c81aa2c2a4ed390cdd3ba12003e97b28639d2325ce74903f9cf87c59f14cc5e93faa14070c10bcc4f635e5bcf4c2e9efdebffecc304b168f0b9103cd7cf7df4d0198ab1a49f536d63ce740513bd9e05ba93323d6aa19f60f2a56464e229365ab16cdb024e3066fedb73afc0761942814cbe2da6ac447f966032f8c02698820aa87306a4c60a92eaf70146005ed5d88c34cb36bb0073be73c9e051f14dc3fd8f35ba823bb4a483dc46e5fb374679bc910358d1dd1fa5e883b01be45aa001e552e9a1f2198284a62d5b9013e7b57b5b3a28d5a39f52618a309364447ed5f8e5e024d7cae0c8317668a5ae4494346150e225c01074311d2024e457d6d0480f8bd177ba7103fe217108a58ee1bf4bc22a237aa6acfe445f26bb33453fe17ebc238162c878f58cdb22a7ebb09feb53f44378a807dd9004ae2a7df0dad4450295698a768067580cc507a0d8c1c38ae59e394c2e5226cbea6087e7cd87285d5c11aa471380b08de6859cae0d20e120891678288e241d246e3ceb72f9b8c0ace3b78261da37f929b2835e09e95c9d4eb6f39c9847ec251c1889b1ca260e21b6420d7e452b24859de954c84f0dd34c67e7cbf315dc18d32571ed6737d2e5cffbef69ea8b96c4fa6d03506807eb33730ea3f6282bcb38abd2f2ce985670ee20006483738fad97cc09893cc9bef1eba5956418a83485da239723a3b1a09065c64619b095cbc01b8f16034049cec27a58aeb08a0fdaac6bbf047d134fa0b21b274f9797cdea7ede97f4da2184c1cd5e00bd11e0ab889f6be28d7783cec1464cd78f669f88564a4f8b389646e73283054242f0b327c8ef6942a49b7bbb9ccd993b880f4e5189b2eced53c0270d9b740e71d2d557e1161cd233ec6161929dd87ed7bbda0ab60f394512d8d048445720e823df586583ea98355ab761ebe04ec76c30bd8f8b22515dd6b02a5f3148000a10ecdac2527cc0e2111bb80561312a4affeaef781632ea911039eac5787530b0171157dbb53843aae3eb40d467e1baa3984ad43c5244556390147c9b645833837955d8ecf442bd232c6df447768e6a91c3f50e34b5e30c45b4c46249ab6db314a60ed07e9618c81b690844e703a3c476116deff9b7ab89c82cee3e68a42229e42bc0c1192146eed4084eb52b95ae52c0ff0a1c13edea586b36e65370f511f26289004d450c598bedb8a5b79db32a9012eb7df4fbbf4bf29f814163eb04b9b7203c41b77aedad39d8c8a1eeb5d28506ec752e1d19a23ce2e58a83c24f5985e2adb3f9a2231bce7325d6c7acfc7a6a11ae0a9ef7064d2993cdc13201066a030f5b8ebc9ff63d39c245518b84da21365ae84a45053a06be9fc8a3b0a2b8ccbd97ba3afef33cb87ba1b7c771f8f75d764d1b82b4ea4d65586166c09419dee822065a37355e9f14108c1db6ff9bac85a662c86262f888ef838318a650f8d142bcf5bc11f44475e674fbb79e98cf924033367f57d3c2951bcc7f5ea38ba238730ac04049c0275996357b45fce22720f3c92290d18bdafa609fa0c96688b89cef7800974d0d79c2a9be8529304014d136d4d1ad7dffa4216479a1b96dfcae471ea121119a40de49a79ca3d1f7571b3b8fc2ae35abb3a0828de6fcdf083bf5ff96f2cc5fc00eb747063c41e0a07bccc8552f22c9f92 MD = 68c34d5aec130f666c98d7088506e213c84ff3a7e86c21932039242a68b4b78e36b7b3948435d89d2a86a5194ba1b321832ae7b8ec286f86b6dbe3e39da2d2a1 Len = 67552 Msg = a6bfb8320576574a1f41ebef4ca72e04b0cffeffbdef03f8f90893ff02d1d2b3cff01e113870aa89b970685773182d1073d2107b37b613a36e45052a005ba6e04e5f0d94bbbd472b6b9641ef4bb6e72951c68ef105c28f4540ae35593385da2eac734c6695437657bd1b3c5edc67a675d11341082dfdc205f5aaed33a438b5c47093a52dceec7e353867224c2e14b01f7b21f169b94ef30c17a0f3605a5a80cb2229de926f9fa9ee63e2ba634aa64f4dd75865bcb09c69812efa10895dd4846a4b9cc03c7f443daac7f5ce483703c8286e2167a81bd16d8dc01f0c56b68f06ca725413d406c28390ea0624a6fd1566d7c7e2bdd501d447585777af6e6c7251121fb99f010d03c3c9567f8623a5c270826a0430ec6a8d3f097a6ac17a8764ac6bda332b6c9aee457c93c6ba6735f42d53e0f088955fe49dc9b2600921104f5efd2c2a81bcb86b50d22745881bb892e670b00d8d77e6c1a8bf85c1500c0e1ab0ef9c06679a6c622df39c62bae73384e40162c2073b0a0ca9147df55ee289adea6ab32fa6aec0bb25067a871672b0b26c2f7f79bd88d0ade8ef2264fb4c8af05495f70d069fbb5e7e34471b66653604c9218e997807428cad79fb77eff217cb3599f2084e16653480a48d867067ce624101178a0060679240d99094017b3b26d79d2c8948bac723757fd32ffd217fb41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9ccad7f15e3b9a6013e8cc51bc3c01e75d08e17a52ceed4103eff0b697daa14742882401037ef6c74918cd6b97fcd2f9961e5f176a0e7f29de32b3acd86f311f3484e5d38433d2b3d22158ca58e24a2d5e997faf73f9b1c4579c36184d4aa05ce92d97d95f0eb0be557ef8fe9d60da0b1d06ddb32f2547b8f68902b975117188e70eb4930244033f39ae1888d41d051b67e2c3c2fa2583703195a3d0de38170ba494b6910c885ccef52b41f97b6b4dc6b5c9fc4f535f17729f2e942ee743238da84c2843dc503fd62e630fb111c026958d08d1c8c9564638a5c04e042eb7096778b1842c001ffefd3c01dc5025d03220643bdecfca8fc25adc075bf123084b218c5154da066c4c9ca4743247360fc2dfc1ef8db4d5800e21a840288652bb6b5459a804ae5db99b4cfe36ac16b0d38b2c2c70691888bb7c55a1274e344c44dc7867223e49847c5d86bfc5943f24cfedae1a8afb7b52b6af3f4d09277b6e3930f64b5c4c1c094915c25fad953100595cce027bbf5da1f6297702826edc370ceb666cb2c8965a945698646b299ce2046b147aef1f2014fe4d75781f6ec735347e3151d23e58f6e29261546acbc338559b19fa41a5731a33bdb3042cc1dcf7446bff711717d47cb84bc5a638e65481d16f36f71fecb7303aecc83d56e28debb12729610ddf894a8a052dd05223b14cec4a03f7c65f7ce5784d2d9a1a4b4a911f5237a8330fe7fedc31127952ee79f81addf982f17824a870614b80e3869365c35fb29d032390f823621bf797b10f11f17d900f1db15ef7b7cbbab84f0f18f861b212d61ab4e4c4f41a92d1bd15f138e4bb6012b7b58c61c2eee376b96f1bc75efbd0e9c63e83e3d2bd1fae2f87c0cb8919d2343bdf2d65063d6e62bf014c313f9f952eb22adee323ec3ad35b70ee48330b6eda26a8c2700649b3f2cc7ffae4680fb83b5af456317c0a4ce7ed7bda3d9722ae7b04acdc2157a64cad7e25d85f8ceeb2861d359a5d5fa9fe524213352a19d2199d5245eae75eb5910920bd44e1029f2ca595691bd5234d97b8f5a15f9c3fac28c7ac1e6f30affa498c6080c1376da38f0040094b278b67d17264d0e9e26d1364705ea0e9aba006aeadca2afdb1229e422ca980b8c2ec7b14253c1c44bb46aa552e0657eaa6f34d68f3aa162afcc5d1ee913e89d545bb09d837e7ddf07540c363671fadd2b10e50d0e4acdcf968cc010cb47b6f311e9ba6b620d4a08dbee01117a2273d42685593aef73ee9e983a98df52cecbb4cbbf2a406769f0e7cd6b8f5fa65a970aa1b6d883bb1ccb77bdbe2eb60611ef898ac54b471bfa3723e8b1ff4843802d28a78bac10f9af2d000e00cabb6e76e91a57e364a50528e76431a999f3d8fefed53dec1c0a3193dce492e8b4161266830e3901bc85ae5cc754b23ba489ed3bd2ba6dc16f99ec30a0c9515f33f07a4a830e39079c0d9cfca09972506a310a9f707e3ef2eee4b0ee4158544b90712f88b2c15edd4c6559723adb79ce3114b892a2cab967e11408358638a29614c0b88ad8d0b06c14b66d245dc3d09f42597e7c2e46e4089050796d3811432604069db6bde2379a3c285e7cd1f87ea9e529e5c5dd99c9be42c18dfe1f8d40e5ab6a677628a0fc500be2b6e05d238bd661ac74d5776c706f408fcb500352a0b950159d31e3b10677ca0dfcbacbec000c0009b315c466df04d3e1bbcbac086b8c3a2ec74eb4bf5df5c2d0b971e1fae43508692aeb8c30206641dfe6d8e258aa45b2de6d37646f0ab43854746d68f63f38c2f362c096713b7bd2b3d3dd6cea64cc004d1853bb6b149a77c0b516278719fd76d0e2fdabd2362dd0820a441365a1096ca24f0a805b8391c63d05d4e8567b6c6c27320893fb1b63817714739f7169e43e069bc47de660806cf3ea0f710b6c6deb21db4b1693f2052fb778d4d8b7c545bda083e978b5b24eb209ee2f8b4df5e83ce6642cfb43c1fa206dbecd85dfbc1432998fe13a7081e5e0a8999cfec41dc5a89d55150cb2922c9cbf6fc870915739e51847158bbed52c3ef772be9219ecec756f376d0f886c82edd5122c5f749d9c1e4634eb3247b70b131f01fe0ff46a45eb83909ccd6f58e45ad82f611b309625254addccf9b42e6aa947cec23cfca0b95402eb0a0e0d5c3a2af04fcf6c6e4abd414dca21a6ad433146986273e2da952ef613cd1f9a0a836ca644f9de19d6c24abc77845002d9fd48333a447ac936518d1bdfc043380fd26316fdb5f6ec0f05b5dcef92c3d5e16498b854fc3db9b6ddbf098d4bdeb2c45305c2420b7fabc21be7eade7ce0e76c80071c0e13267a0540ab0846f758ced00d3bf13c84e11f960dc72d6bcb11ff235a7ea991109cd3c9823862324a1955dc08eeec13a7841034e23cefbf06bde7aef9e6a5057b068eabac505d78ce890e8f4d04fceefcd04643a2307601b54b65b465255992ddce7152c5da43410b10c392e36767f50c2e886c558a0c5a612542dda7250d5ebc5b4567d5bd5ab488173a8cd2fd75525e049f570432f7f291b245d3c6cc0994a315d191e5e3ebfacd043c2623b0702a7bbb54abb70f7ff0cd5a383bca04945a1764df79fb333d3a62419108dd669ea8e9bc6d10740bee7d9d85e1c0bcb4f7d8a2b035c622959a9dd03401d9080949f1326eb230450d8ac08a9b0a08a3c47b38cb619c215ff1484b9e475441ad80b730dd38edb031fe9de21b0479bb871b659f1adfdc32bc2f906b54e151ead2b3308b7384e43b40c46d0ad929f78270a300371893bda04038ba257a69c279828afe2a7bb960777b4843614a704b05674393284ce30714f3f20ea399496d99c2ed68367d3e290ce972660ff8423feb73e3659a3f388135de46d40a38e81af09cc4b5d7027d07a3932b203b6b0899dc9d6bbfb477fbf5ac081c5385e0ae932617f72e3491ddc2e47f59b70d29282282ecc4e99e7e9229207a5dd43918039fe43b6e1b76b2c62176b7e574aebc0ca28268d42b81dc67e53a3aef9f51684f05d21112c4c4eda0ee0243b89f46ac1ae1871984cd8517e0f3a252bcfcf358fa8e97a0c97047cbd4ef2f29b980fc7fbca63708bd16d1b9671affc9ab3348716c02dbf17c6827d3c8eda673cf5ef9bf59ba3a3c65508e4a6321f9a8a38b773a0e29480a14f58b8ee5af0e29e48365f358e639bd65c1e3503cd139f68e4da83c46ca84f5775d9b8293ff1051df3567a423f0dc94a6b1f95559f267bb53c205fd7daf37ba8fe881393ba354f5a7bd275921a0cac80f6af7e0244c2b00da2fb3071c9e0a5f42e0623b4364811c2663ce9abac0ac618733067a04a62bcc0bdfdde28960a4ee7a8b690e150a3fcf436e84f056162968f8534ea961c91227ce19a9142ebdaf6e1e33bb3c175d3815e62870e15d6ceae44913f6f8a47e86190b243f27727cd0e8161e834db32511f6f7d7bbf7378896dd62bb27ec338b2fabaa49c8a3bc67b1634a94e7c75029757a5fc48cba4d32d65b2b93080f77b8b7e493d06c0e7644fae7a2df0f3455320aaa04370cb1053452678ce2c2e8d8cfc3cdae0152f207dc537d0646241b2c08788dcf776364c855b1086df27cffbf96fe6ce423a3d6d7f7622b5e104e053c73682ba8ceb85bff5c9c47b6095fdd92d70dcb1b8086434e5dd2fb9286b479ed3b828d7882331f1012ba2a4f709309ba589bf23c5e24c0d4d549f58af07fffa7276dba25dcfe37653fb4bc206f3f0ba0e24ee73006a5d5d1286f202e96d61fd200d2ba99243e2b64ab3102114d8b6cab3cceb4ddc0300aad1eee8467bfe262d68e5896baa21e84771dda060b54a0b34230c4612dd4ede8d07f6b291bb4cb4f1c99a855729ec4c9055e57cff4caa668cf84d8f4078905f6a213911833beb86f0ae969ffa85f588276374f65b6f8c414b901b1775228a0bc8ca205589823d1480945449d442e0337316d6ad13726233e686ff8f1f8f9e5c3f4f372f1302b40648277e1362d53ec71a0cb511a619ceb6e4496546be044fd9243cf7eece5202a4bdb45e7d24d163db72a18ac481aa1432cb53d6eecf25110b2e2fed1509e48ba837e78ff798bbe1b92371b22644c7e5301232eed7c166745a93748142543ed1596d1d8d034cf95b0892f9d5c74de7c4474f62f7a2334d0c401ac75ef73bb55660c3e2c030a01e124247b660283b8e13e0e9609bdea34d2b641a84c0943f0c8d36b2b3e3f040aeb9feb813ebb96c2f568556b845dd8feb643f293960b9cc990843d02d42d29d0fb4867aaed2fb7e402ebd3de6703f67bc4929bd41b9c872ef4a2092ab774813c59471f5e3a07ed064eef10557c564b9143ccc4d5a3650b073b55580bafbd14364cc59b06efeb4110229b933989ffdf297d18f6fdf60e303caec4b10d83b0eba71dea6408d282b9eac617e4f357a5ba2cb89fb7b4db3efeb695189c98fdf40d7515dd01ceac75607c828c8be9aef1e5803d8892621c9d7e5b3878a114e332828a7ac7fabe446b3baf9e221085558b670f54fc0c6f7fd4b714de0d49e9fe1153cc94cfd842640d54696100fc2e161a48bf4423af44cd8bb1cad0ff1b7f163a8725ad1e22c1d203b293154fd74bb746907a57240247cd6975635775a03ff354267c0bdb60a357f45d160036274601b94827d3288de149170ac9b9975e8f5c0839b8f72f1b4fbb895ed86ade7686bc1878ae0156d97a073d78e23e8edfd81afec6c3b942d92fc669bcc39d6e4b73b00e26f729d76d7bd182c8983082ab83f6ddd884993b25aa403c7fbee00f2f75a4415ce993d2d14a6d8e01d1d59a48f6b54e74e3df428428f0acb0b07ae9a9f46259216e86708e51a30a2b7777ff409b22f8a4c8d28180119f5f5583b4234158b0ff7e6d4cd92bf73d9e4f715cd91bd904846f1bbb1da0ce15fd791ed6e67f0957db79cf2b3430a301f174a7cc4f5f172299dec4e2416cc51a2f21692859ec701f941d7a6ca926bfb9aca201118996bf45e0f7ac8f136d5f769d574cf1a50ff3cfd26f57566294b22b76e16772b047383500c4b90abb2a04f0ee22af7bf170fb313f794e338402e420f83ac136ecfbeabaa24dd49a622c1d52ca8b7a0c6698f10b814248493af8bd5fdab4f7a664393d9c6e99e68930f91062db9895ed2c0e3b2640d22be2aaffa5b2c358f10a418999a20bb0d51d4c1b47e9c653e8666a5a434a2532e144fc9e04df5b2d98aaaa736696229a8b9fdf1a28ae36c45cbe48056f3ed76950b7595e42af4b3bd2cdc8800c3e5a5fee56107c1d7bd1f2d73fef9629ccff7f6285e9c6c7ea3b8a88bcc337f3625c08e88c08cb8d163fe5422f8795d8ba457dfdf4d35efb58d223a3c0c22183ccd09d6087ee8ee04829a586d7378be3d1506a0b4e40ae47c0b90d091fedc425435c243d91eb4e7dd9373b897f28ffb4d9c94e73d9573f11ec9850a4216daa3f8eaba769f02792ce9110ae356f8279b29a57311dde4198c2a216f55a106a5b3b76632dcbecc9e23a385d0671ee6c8145dca31cf1a42541c3abdb0215320b5e7fc32dbf4bcffac62995c54b24450ea0d5665516d7752cc37bcf9082bcd1793a753db064d1dfe1c70371f18638bd915dca011428b7977da551d5dd7a3733dc7a83ab95244566a76c319488bf949c1d418d7588597953426faf8769f46ea05ba313d783078faa733e19c633fc202ad9d3848a5ab105f1a0aafcabddf749621e3f8c87231698f46ec424cf9a47c4b1ee9b1807323843b9c1dd9f0ae08cb0c04ed556841d58468bbf86ba7664a768778421b1b6b7f71cf3cd90026c1bba8b0113eed99618d682b9900c44843a25f4c5c1eeb85d92f576e6eb4b8c993589c26e94117c84bc9635c406df28c2c3c750e3d08993c56b3a3bdb4497a558d7013d4ffac6aa18b2a245f54b86d0f5a8976519d77aacb6e8cf511a00fbb572a92be4ec6c96c818a2029c948789a2e8909d19afff4a6af8b4bba2eb460024b0520ea08c13073f4d33bc20e9e171086224e055ec6f803452750614963e2c5bd87bb2577817a3777f0edabb3b82c4692a0c68021a50a4748dd4b99162120ac0b2cb20f2f99ff2d876db6354d4920d2d09ef3d067fc93e917178db0099e71fbc08eb5f5a55d37bcbf94160d2fa38d1bbc775684b6303d7f3c60a744881e8f5b8a0827775d4dcc6b6d2e8d81ff69c9a7d2c47f0b71025f60254318d53623a131a4339712dc0e25b02c779d32210e7efdaff0ddd34cd582426e3962c088608014bb9b854695f0cc318a19c5ac38f41593a0a6e37a9e1c4e8c73ae05c4f347848b4caa62811fb83855e27f873eabdd15f05131307fd9590ca4d22b82210b3b26fbc3eacf60cda6f293e2336297fe0c089a4e3a4551a31e5522063c688334cdffecadc71c54444f7371f5bfd816a41355f7d42c827e7fdea09a8c5b195a147277d486d9e9da08343386999f6859328596af9f827874c40c8764d10225140ecb1759db9da8608de7cb483a3c93ce3dc543180cc6a7c3144a622780bc0c5f982a66e3188ce89649cca31d7411dae40a74d3c7b87390e7e4fad938f7f34f8b5532dee6ca221ad9c065439cc3d9ae493cf6c1450f13b461baa0453fc3425f25aa56f7fb6cf7cfb99644353ca5ee9e5c59ddb4069d2192bf19dd5ea25f23cbcd1c194a877d6877941febe08396bb2b9bc59bf482cf27bc6e66f45de7481215d03efc3f21780e9317d1beede822d9c69624b43b50319071de36a7eb94fa87bddd77724e3fe954b2b3604fb5f0b6c50fc9ebb8c0e550e683bd1d4a8022030f24534a0e00594dd546e52020c133def767a57f0c5db8a9a442596f6ea424ee22f9c04b31fe0421fad02bb5b49818080b5ec773314a50a8544e51c186d004184daea2ef808fa6e25fdef5757db313de5b559e5cca1f23c970f81498259c461de9b389ab7c4dd82b5ed3d1040eaabdae71fc98903954d8a974e04077bd51716ba188d30387a11e49825f5cc5c9d78c14e9b444b1f183b5b4fa8733d4c097fc8defcf1d8c2531cfe964c1f75f51d1f58e2d0d3136a51461885c6d8d33e1e86df13ed6c7a9f778836760ac1f2519228096b677dc92a69f527024f3ab0973cb4c3219307fe150dddf60209e52bb8231c3bb0074b55a888d0f18eeca2be9f8a90dcd098c94c6d3ea1a500ee920874f881557a59439f2cd460def04517e4a031a293e8a1bb4cef315eaa3964d171cc3ae2c191057090fe782c57f201a10ae059724e3059e3e7e20f9b6f7511a94e0711c4e6bdb2d70e659abdc25ac84818a828897671654b0390ffe15b7b9d22876ea4b12cc6088202ab639988f14415f740c96e747370fb893f2ab7d615b14404491c30fb73b1785516fa4a127f1b0f8df062a9aefe20f96238b7a54809f518aee0a0cabb8d52c1edef8758c7ccf53fc3001cc38eda1d4f74c3cf33192010a56b7a5905d4dc9666b47d34490e9f7bab82b71e437bce1005a9279aeab222abf324606f6caf28226e910a27a751c2545db05f91b1dda4a121e8ae3f5179d76d0bc2db0984b239a1e16bdc88f9f7fb295d363e9c961b2277ad189ee7f1d707fff42b314fd746d7b9c72c3c80c86813a2b1fd9c68789f113bb02340b950357908b649aa6aecd4c91229bb72379b0bd26663ecc31ce2d0389433f0dcdef8f9f6315a0290824bc2d8550e00c6d4fa4aff1e7beafae15916612b3d67ba7d718d4622e74029be7d79cc2a7fe3807f6d8c6471ffe188df67d952a7d67021bf4157318265eabf4709626d38834ce7627d3ac708f9b8b63d9381d4b206f35bccf2c17ff9dde8984577e48228222344a2b1baf18a7057cc246576aff1d6d8aecb0c31f7315622fcdf5066d5a16450df6a9275aaa06da612bb6621ab0e4d0763e4151162cfd87f353d1a522c4c52bb00e0a7d3b9f2f78ccf2b1de890b17469c14197c8887e6bea8a88600f50d1f34def2c783de82716f44d9b1334258151e4120719be31e4184842e8a70509d750ecf3778d19fde8d2c3d234ce6e3327ef619c61245b25a9e682a684799c1e066f8156e96fd0c1dc34e2a71dd8fc824a53c9a9753f072b76de80fe855d3c59085af55ea9a5cbfcac4339147fb948da9387027f6bf22a0df3062a9212dc4d8082192e54e0b77176ff08b06082f7b803aa92f6666cc52c91c76868a9547d375c1fb21680b52e29f67e8930d54d1cb6c4367c8ba8a04175809a0c238c73c862b5842f942951905d46d1d09fb909b0a9e7e04dab8c2eed6da116f84184964537535c978f98db68742c9fe5e755dd39f9324f0e3d593e517dbee136acd7e57d1cfd4df3f1167c3bd67190ceeef1f2410d6e2bc72958faf60b9da3ce4acd89f77a7dff4aa1e95c93eadd4d959ed5704f4f631e7e57d18863810705c605b0aa3bba991ca48759a2f71a377e42dd487eec26d8ce3daf0b102045c4ae28c4c66fd2421a490a8bb077f0ce49cbdb9593449efa96e30b1850bbb6c19c48fc6f5901437cc73082953402056cd9da6aadffebf0346606f17de6b0ac5b577848edaf8816ce6a79178d2f6cbe5db056f60dd29b673a0edff5c316188a7dbce81628102bd4a2c9ccce5be7dca30996e5889d547b8d75561522d3281bd98e95406d07c612045faecfb1e7a57b3dd8522f2745cfb4e94d08517d9564e020f6a827567218662e6ddf2dc719b0701333aedddbed896d032bea3a10f11290e71cbe46d7514d4fda34248c18da52e4ad807097ac7dcbcf6475c679e2d07952b76a9e45fb8caef4911c4795ad10d1ff94286104a3dddd02939562b5fb18e24f164712cbc70c837eda8d0eef8da576e84f9449cdc7f5072d18f1869764b395af8f1be08045b714143eef4342c07f89c8662bf09a21ad91797cf3fcc62487da99a74fd10e7c76a8df44aaac384f8852c662541d12b7eec20d46018beb437ef935e849ad1a743288077426127741a6180bca799add939ee412fe85faaeca7f39acd9723c4f36d1fdb356cb3ca79ec325bf26012da4bda73daf2de612b6c071e42602324552c93d4d0b7302f4716fc6bf08ff549f0f3bef160d5a8c9bac2d3e40caecf292ce355cc0385231007dbb972f11dbdab7c51760b6530ddf5d3719cd96c11e18e9698318a0627bc229728a1ebd0045fb3f6f59e167aace471f008d062d33200e13cbba5733b0771b37f8e443b0fec21ffdb407596f3a262cabaf90d14f477b3ad89de203c34bcda6f2b9d2ee5232dcaebb3d2bb2172a9cf6c7eb2b164225b606ff870403965b05c9225a5b07e9c51a103fb1ccd3a7a3b90d3c5c65bd4ff659d95230263ff407a8ee8e868876bede04ad51b9f3a467cc03d9d1ab46aebee2ed1a9741539f27773d7cffe3602319a623edbbfda70d9ece04c35080d6d2d710f9339761900b76d44cdb3d19ebf64145fe394424f0f696d044317f821e0fe2a9058b1a39e76b28465d7210d131d880e21ef7b3d7d64795fb4a8c285a254e26d4998ae8715fa786f4f9ab40b33baf1ca50991d1bd62e8e4769e3d11b0f378ecba3e98c8b000a7d807a7ed946610655eb7496d667f9bc1cb6ac8aa032b91737c827b1d839ed35466a6f0a1d593b8e08e4066f53ac48abb91ff503dc57306291e55d981e1e4df9477fa5b2dcbe13c0af467e68f143535bc805cbf5d21315a801a5bdf2caa2a2d50542b70fa3ef9a3c9d85553a5bd79a6addeaa9d71dd0d9662b7bb1587a617c3714660b770f682f5078132349efe39e577f41070e3c2aec1b63e9e03f89d54abdd93c1b9f7ba253aab382512e29d1df8000ab7c21a98bde364f72b32e85689ed7e8377fdf8548a7b9d455674d962cce93268c71a7e27e105532a8b29c09a5d8f3a60aa0bd98a58c0c5f0eee2eb17efc0f45567017736c32d6d1fe570e631789bfb70816c0425370f0b8115e480822d832d1bbffe6d8f0a66991e6290c4e38318a8fd25a7dfedd172573ff203006d2f3cc700f899c8f85fb5bf6e2a10c078260f294dbe44d4a9cbf09173aec6d39e9df2a94d3a5af03a6a24c858647844b7088766a873cc4a23d091a16570b661dd1eaebb49acca4e1dd2ba9a243951b769d28846586cc6a921865e6f5d615912f45a77e53e77704868407f1e1ad02181562b1bb4a4d2ba586c955ee3a3a93a4fa9fa550f72c2d447e55b7c3c8152730a46bc4695d3cd30c1cca69ae67e6fde7ec6a650212eb67fb45accb8dda3e6ccb9012d13d22e84b14b0861185e38dbcf0911057103ba7bf8f5903a3be7c6b5b6f84e258a53fd20c45eea6de2351717945653c0bf9e5e38c7744f4e0e4433e6b82ff74cb20088c8f262387300516448b5cf537e42d8621675975eb038da32a25bc4c24b93c116a5c2bfbb1a789c6699badadbe8039a0d3c89c88707c1930a11252078ca357ff0dfbcde3b0b54fc67302ce1b1a609cda9d28b6e90fbb255055aa0abe170a1205f9d682580ed9c5bad35934b9e5f5d577c0204f04236120a69a654cdc4e6de8ea9074ffd516956a081d175806abb0522cff27bb8655de9997f1cc8efead4f4af1646f8cf77278cb32b2b5ce8dd64 MD = 9dce12e49fae09e0b1a60f44199449fa31b9bb277857a84efb874b0c23118bf8453f8435f47b161c9747e719a642f805bf14c06b6202535e7abacd53e25ab84f Len = 68344 Msg = b812e3064c1dac2b9d26def1775b3c204af669e1766f4d88c5efbab139094f8e09a59d7fe63c89e3824bf12f5301933d953b2ae68eb3d9d21574cd8f55921fe1cf17f7599e40f729ffead73710474c70d8d52f5f8891dbfe0068d7cc95eeb51f125239bcfc92bea51bebd632359431631dabc075ed7019b38fb11e8f8285d9f1da3dabcf8998a6fede3637484b4f08be6ba5244f43b75d9ac938eb01a2bf55ff30c095bbccbb77dd50b342a0d9e29a28cbaba51715d06d5bb6e585498005f0f01bc33ea74e63f8e97a4b3e6367b4af4a43a589f2e822119d5ea13691a1bd716da42eefbc95f9f2cb63e475b87e2d0fccde7b190a46151308ca5244fe8f51a11dd2e9f0222be32d2a13672dc8a5b58155a1169d87b6113a4501e1f8bad12748a9addd8900988b71af93bdafba64b4ce8d965c5d91c17e4dfc0b379aedefa92eb83df0027e62578602eacc43b74392be1ec436a04eedc415d4f13a72be713d1af38b0ba2c613b133ca207e30e7cbb719ad338cb0e9c54b5a76bad4c756e04dd5019e17b2fd320041af3ebac071838ca7e5ec47d388ce7ce38a6eece3ddc440288c7efa7a4e48ac795b4b67397ef377306bf64d525492bd7ab7166a0c7aa37ed839349e42dfdc1da0734f6fe435a4e17bea598875749877e5a5b8358b55076fb0b2c7e952d876ba81a253b909bf1d3351081edf83106813edfd5f37a897777b779f3fc5f1629fede38e5d2df043e6d37a6d4c39c6528bf75a671057aa687c0af4a7a51969a5dd1e8ddf78b3e0ea882bbec2eb808460888df48ad57ddbef9d84f07300cd00c8bbb3483ea93323dc8aa1e5af049b0662e73c830fb5918155625133ab58c8fff3be15dc53fa95ff40749fb6db9d729481316bce9db97ce5c153d985f6b5f4ae5070ac11c572c1bd3ecf8cfaefc1ed75e4ed849edde7244f5cf984aefc2038540458e0af3c19a0a40022d0799275f4f3b5a3eebb774972064edbbb7566a07c3a3afe1a7d62f818feabf5d3fb6dc36f5419db11ed12e74e54be81e4a4dc3ea8a918ebc044dc1612116ad1fc4828b246e13a1e55fc56c7a17fd47469010501a5e7c6a63ccc557c7727633cb5276a4a61e240f322afedf351d0ba3bb0558af1593c6db7f4dd73302d86bec06662db94a89f53e3e0cf7c73488f955e23671216adf235a7523fde3c1e76a4e575bf2497045f9975f724ae4d6c04906628014679895045fdbcb93fa730413d324b07ed5c5b6c3d31cf76288ba777d0da29e9ce21d69dc6419c153e7a4d2eb02f5001dde9970c659fd08d9535e02f80428de851167a22dffc591982bc5c842664ec779d489e883a4863319b51ff75c627bcc678615f27b9b55b8eb475458cc65a882fd5815a28e3b3ee29e2e9eb91ca0f1e4bea096bf37bf40a3b7baef08eb9988af32c9ab1338868db3e13048ecbb5851b3f4f1688d04e41ceea806e45d126a65c894a9d8df353f09038d6abcf6aaf0e1b6951919d045a250f616bbd2c9f360d64b9d891d5ae6ad277dfd2e596b8df348692968192d8c6273569e3a38d3e10540c4d7e7f71adf596f6fab0bacbfb6e7ec482c6ee4f94bbd0a8ca902950f7de03bb0be36e48381dc577531732577c84743d018ae0bb8060a6d04c1b565d12c5a3d8bdb066449609e661b0b0562083479f59d78a60c0e4de3316b72c339cd7efbbcd298c704c11e3811cda232d0f58e28681cb6d7545075cffe0d26ac6f58e84d30118209249efd01e109917bf0c427bb21ba7db283332039097667e19517eab73dc5114d62179fa46a5b43515008a3ba991317e8070adfb70a43b0f3496f08d24c69e0f44bdf7898043f52436d17949f54932fb85e5c06b276d19c61dae2c526d27c5b9e305b1a55552228c2a6955ce1dad71fd3f7ab37b3b5cc84bde7f7a21d7678fbbbbe1ee744c3a0417faae66f1aa23b82ab718cd5536d80f457ff32222e9eec4bdd43af821ed63636bad8af6db2315cd2af4a5571ea048b85d06f16b7f2b252c6637f615d2c03507304be44bb310ea79a6fe0a9901ff16893a7d609f5d25728e5febff8eb04e19b70fdda3aea2fa0a8446de30db24dda94b85eb2a04e7603eb44ff83babe21e753daf6ab167d068ddb6b19bfe65afc169c5e55936e24263f264df6794b390b8b25fbafaf5be64e2cbd7903d5b7ecb34bec103ce6c8399b6f467b73ff1f0e4a539e6d59657fb86f03cae8acd3170a0bd10058652b42e12e2ae857e8839a8046c7199aa44bf65601b98044851678155e4c75b17edf62ad56e8685dd4a56241895c142e10e154517ea47a171d4e5fa12314b895ea81ac00be2e6317b8e2fac49a993a722fc41e3d6e6b14dae5b9323012d0557028a0838dcc7354f015bac87be2f4e9214152c87c3953ed0a7f05943475f5b8fac9ca9da6fa3dba816bab5ffa1af59c95f61bc79068157f1039a1fa30f4fb6f703e5e3eded01400463b2325a17b11e14ace8da00c83262796b62cd8c7f867f59b06d9fbb7d66cc2b8f4b0be14abe043da3b36f66312fc931864e4b44bf8b1c7b5a3cc68a485ce7e4438d29dc625d730aebc961f16800f2defd698113f8e6f725aa5b3ea3766af9f8278172938617d3452d329aea962d474b77b857435220762147d1f14e2e196a30e22ecf4ddf738db410f70099e23e2e3f9d45b61bf4c00336dba6c5d398efa2521d9d285495f907203d1f7d4575bc1181171784e2074e052b0be2a479dd7609267fd466eecf31aa505bb2f837762f57da8c36abe1b253e4c9818e758925360776b1dd6f64b5a4de0e13b958b80e1d6812a4ab11601e5607d8e5b2204b97b605085ac02dfe71d90c200d3a870e6510acf1087da0a672dfd820de548c075c7e69a52383870328589a4ff0406c81a28f8b3f60b43efdd776be68157ea3059b169d15b43064bd05aaf26364d0ef5bee236dc35359d5ab75a4217a32374c8c7d070720b4ceae722d567a2413f4f8e27052ba468a724cf973f0691cdc886fe62ad7118ecc664c6bcbe49c5aa2b36f6051a7da90ad0a8b2ffae3ff17bb77f559c9112226a3ff26f005ddbfccbc163c1bb8a7356963267a9531034932780fc42e833aa1b1e2a1244803c84a430723485ccedc339954d0017341dbb037bb55c5ad7fdcf8f830542ebdee2da7872be4796abacd3de7290f081051f09dec2b53e01de67e8ec036212c95ee943d60d161b88fa502b91c8aec77b58acc761b7110fec8dfa9cbd49b0f06192a867496a1a1ee11b70411001e6d36aa14f6a48a359405f493e417fb0827a491cb8ab4f042ac0139175aab5b8e9d2d3716f690021ee8dfea29b7dafc2570ee45f82965375d8adb4fee8cf1f5818145a4b855a14ad41372f2caaa7ca099f2cd7cdaeaef339944629b63234996a0236438249a3e2c001da8539e4665af0db527809955bbac9fe080649fa61d05938a733c7f4dd16e4a0f6757cc12fef128c2e6975cf22f6a16691cf4ca9dd40b01be5bf8f4f6c1d959f099447d97ad2d9320f00a4b4ab434a7e41d910b90d67093c802b4a81e7635d6c82563d85bdb2df5d72f2190e4b3d4fa5b6d848a088bfcf0af52b8c64c584a689ff3fc06e8f1b7f7f0892350489210b6d5f315708d5b76c07b324b7409cfdfb87eeb572ec655944172e85ab6ffbbb1835b978be5a5aea8ad3489b7dadc43be6d6cf5bb797b718c7a65330ce790947f0bf4413010daec585de34142224d1cad3072f9720f91ac664ad152820e838741f3a8d94a1ab37d4f7890413571e4c275a997dfc217906dec5bbf2c045161fac1e67f47222ab8c955a74171d8f22a9dde7fe38ff4b9fe1ee45236abd9d8b157c58a827300697239329200b972caa615af5b5ef14f1f652617da3fb64bccfb051687b8462bff6833ade0d4014d24e193b2e411ee1d6e4ced4d99e135a055c86c7c862aa6ed1322208f39c631af26617dadc3036ca4d13cdb4d372411219a9ef4be2fde7c8ccd2969a047dc31e1f8b03d699f3c542e6ebc58e15d103016c40805a629deb151560474a8af20e92bc35639ae21c58f016d54cccfb3ae7bc7fa8b07fa1d322b84d63bab6f1c9a42d4afd9db43f1a50465f78c9fe0e005da7b65b16283b2e0d46d745775bc34512226e3c38af2b6e49aa434ed39dc8d1d367c2d017e0991f2935459df39599f4d7367889bad81188b3b054bfe028b61ff75107903c454616f4f80ad5b610c06961be0c5eaaeb9c1a1cecf644763b505b2818071409a2bcb60f23a9754549e113504d9c337f462562e3a4ba951c221203e40143f3f695777cc63ca3f517ad767311499a90ae744823b69c140a388985bac9c1308889aa10cbb8a78ceda3b7eb192356aa0ebef26ebce427851c61ee25e037cc7f7a493ce33364f8c6c77ff5d96604e92d06374d239f2adba0540eac7d04bc776311abea993439a4d40b12e3abfa4465a60f9de0e15ac92cd839b560f598d6769e17282f9d5ed5304730f30ded366070a793695a32706d9faf45ec981a2d043e82d354685a03962f92c1a6d117bac78ea42a1015916076b898012abe6531c433a3dea74169d31af7494584e9a5f808142e4c28bf78ab72ec24e3e630614794fa93a19737473dc23bdd353394326e90a59862199472d1f0bed876a5ba98bf04f7b4c4bab67cb42a41b109397d279f0fb785147950fa446ea51521ffa9763882bf99a0684b74d6c1bd8749ed110ff9b3ce76dbbe5189a35b437d8e3a897424acb6b4dd5662ba061713a26fe4dc561f4b6ee0105f32ab5f24fe74141cd73d13c18198c3db98d6d298c8a4e3b75b946034fd535ae250d9d87a5a9b4bed1f1b768f84a80c8e5a35bcd560f16dbb0b357cff0e3323de588fbfb9dc559e41dda9cd6544851fd52361354b613a468657d3c608261203a9a6477571e82593a17f52a8d15592664680d3cc693dc206afedd9cbeeb97272dab69b8a2122adc48280c079521c6278690f27f2cd7b3b367e29c1ff215cd6d9f825f67e460030997b8e5dbf662d77eea30ab848d69e085e979826e03e64b1d18860e2b26f05609ae304a4fb8bfd35019b201f2f131abbd772b5631f948585d1e1f3ead6faa6a0415f6010ae41f04c8997cbc7260175c839a60e20fdc223e553bb5b695c77689215574d2b5826cb00bf4f8a4abe3033a01d880ecb1b55b432ff6b03f8a363cf988f51187f8988d2044b18c804681dd8e5cbcf33dbf8bddb010d779a134c5e403627d34e67a306a9c9959a21aea438da0bfcb219de0678fcd226776a43c7b56efd77647b9e451eb6b3273a138402ffbb8508f73d3bc5059e18d2d100f4a617a050e67b1c6dd04f8d73887f1a3ef50101e378f4fa9fc4e233679b2afac057d388d30d8dad60e507926d31efa23a0abb2199d531ee54869d5120d7cbc4116d979ce64512ab01f3d56a12abf2380fb4acaf3aa64495047aa58be71159d97247d2311d35b091eb7d3779066f2d681a73441f2854936b2a2189282ce05bc76d86f209ea47ddfe67e1bc43bae3f7bef4d71fd5f578a4fd301bc6ca54cd280a6dab956bd004014d11e1c26e92b2f7892940ae88247b0fb7a0a9cce71120650eed163afb60f2b10a73cde83e4054936322506e9a27e42a17168c2a12c49289617667312d0f8c63b30836ac57263151d97a76de70823c8ab7ec136cb1f18c1b9ea40f36654e499fe3398c7d2dc6d1c9688c347ccfd5fca806abefe3692a858212c08ea958afa2dbf7a26fd946a4de507cf219d7fc75ad188fc0624c8cc207536a8656186ba6309e7cbd315f16328f9d9326876e8ae3b642bfe42b06b17a9a15f25005f212c46b5dfef4716d31129de757a41dbeffc2b0cd13619a806b96b62076a80ec4e28ccba0eae2b0821ba751e416f53d37cf75150e26e341681fb8d4393408e10f5f51d9fdbcf27f4c3a73741a7d8476677e9d6b8c66c3a01c42538c96c6fd2d4fedc60ecb01ce2e1a02095cd0e7ec49cc818e1cce5f9d472b67f937efabff33f5125be2af45b05d7a26cb74cde2a737e57cd9b15a8dcaa704151c7e9a5f89a5ad7185ee00e5537deb0d5c6457ea2fb130c4f2b1a75df63034ce2fb92d6e16e2c76fc699668d221ffb2a1ea4158ae0664d0e8ba63b5c8a733c07b5802f34318bd171b06d4699a6b4191194ac7d318397789de7079d1602009836406c066e63f15a3bb5e237974bcad33850f5f57a73e56217a74e32f6f748c7ee52c5495928c3d0025980a0029bc49812d60914c22bd097e04ef2939bd4bc59946f247ea0fa63c18a1dd126682141f635866e61b525d968ac408d456114ebabdce8120cb24371ad17655c114446c37c25049e52affc7072b01e86bed342475d0c60167a29be4df15ee27a2703a6b97845b3017e2f0a3644b05b67668ef76febb769aa5d63a5794cb4f7c3ae32bba4993c24302abef98b3d1169b7e2e08ec5b67267260cfca3841dbe27b13d6de0155d5cdac30eec24efea57dbf0aa7472d96bb1eb423f5122eec2cef4db4af1ce7c134c3902911326e4caf8249a23b76e2b79ea58673b0dce29fa8be19a5d8ad149797ee1a737e07a0a6d76c62ce525bb2c4fa0510da68eefc613696086fb75931dfe5946f989b098b130585311754c046c7b6847bdf8511233bbec14299b6e8e69f08feba20d200d89b2113df04a96b45c7ba6bef0b6f0dff332985eeab3b21dae1e77421918ab32e46135f931eb92458cdee0293e48eaa39545d2b342db0cdb6ac6a3dcc752aeb361dc3b176ebedb527e03a9090f44bb079a343fa3da87cb4210979a3e4531c7098271951b0f5abe55908865f0ec30ce6662ac33c31a4079ec4fefcec91b4c70afb6cfe8668c45c7b974dbab534d73a15a9f0c63738a7b9534696db61fa1f938107f55899c6de694088b8bedb2aba3e05eafd3235783bfa9a51d6fe4a481ce89c65c911d2f3cd38fcd5507a1919f47e7ed05af17c1ce7323d8ac84eefa2332e24bdf00f7917193376251ed6b6290b6448030ee9544a34c9029b73b19731edcde2b6733cd65948c1782128bbfc8189572a2c2104072aa827b22cdf108c1dd12d9bf9597e31e2e449c871780f314af6beeef39c28dce6cdb415e41554148d68b71a2eaabfd1da75352fbc16bc9eabd8035aff863f1aa32bd9f26c1c6378a938d126fc6fe6ff6881ec75aa08a88bcdb98d37f9e7300a8c48fc126bfc27009bcbe4860bafdb03b492d662e458bd3fd720c44c88c7e3f4c6ae873e8abe87f388a9590304728625e72f5bbe120ee104f2961063552f40207ce5e03c71696a9b9b5896658fc0cfad29e1e350dc30fe2046a2d94207262fd5d47371d4c705ba3ef962057453a29ee2a12ed6e1e8c8fbdcfacc87b247b5985cf6e2a0d0359b5e25cd4f0df7f91fdb0d78a19c39e1ddc080379c827bbde363fd0bbad7f762313e983da515b828406e76d5bf9d206d783554249b336510b878003b817d10f7d242de71ee877d890c3f65e112425e34a042a0ea500038e93cbfadadc1f9e49b83524192b1ca0fc48b3622c421f1badf5dcfabb04352bbef78214c8a01b53bf74e5607c877463680c53cf4a57413fe16b7c4be9ffd92b7cb738424f9ca18dcb23a36793ac763b965c33725ac9411f080b70921df0526f52435d27e23a38a91754fdadf112989621c8c11fb03085159c664861c97e3783aa3c7f1a230147320e8962a81742520f74d28b0bfcf583d0090c724f7ef20ee51f030cbd847a53c52b2160fa68c449041a0a0feb83b0d3caf85e6c9f91043f201b278466890df4bef7cd86f98810d4108bbfbe1306caeb52c4dcb5e6b22d4eb1191a84c99344909bfede2349d7a099c144941436d8dc31240917ecc954c5c414a37c7c4b55b6cde89ae3e44fe9fbe072cf07a0bb8c4d4bab3f905f9bfb7625b7449dd95022cce331766f4890319b6eb1a58af2159396a154d2c6acf318b6ea35772f3a9c9d0f96e2fbe0ae9f31079b1a42ae86d98160c8bd6d3b53532ef0880ba580fe7516f75f99a5e8a4e18ab8dbf930e2bd6bd8043841595ec120c0bb95a66a33c37e42fc83a20ed7b9fb8137c7faeab82470fa19668d31b19500508089a24fc7f81c83b7c9b8814e6c41c70ce57bfaaf4a5d7a18d9fd80c43d6660e7ea6ba0be2ad46b919829c7ad2a48ce909b18cb289d95ea8b091ec11738c7744a1e7f0776ca4a6d2255922c847294fa6b7f4df6c4acbe9dd88a7d7d2b05a7fd3fcc590e8254c30ad2a87e3a54e3aafd05f887e803e63c3689c4760f60228c8e314a96008168e2c73af74a7baedbff28f8ad531956e8a337274da512671de989b73f92a7c4653e14b3d8836ae2ea1610abf43c253e026802399c9700906643823a01fb4efbd81985e5b2b572a19c6446a863af7649e20f3a2927b8648c8a2f0a42381c707840199d391c5d4d6b517e3d667229a6db061d418e7575a8ac081074685892a6ca2bc2cd367be73590a7c8577eb6371191cd06bac21c7b678f4e7c7304d9da7c71f999986667efd5c20de74759965450dec54ff87c73160b96ebd768b032704c0047f2713156d39860023f6f7fa90ddf428d7d9d061ff21f636ec5d7e2f8e0afe58581fa3fcf4f180b1355425944d0374d64042b07898c1d7525bc4325a3a812a230bc95da479ebf13bfad628f2027d350077804f93640803ccf1f2ce0b9331eb6e806d6a9466f082a75cc328991914e0ad63dbd43acbbe23ac98317bcb01e1ea409f53f15421c8dbfc42654c13f8901de6ee9d67f535aadef837c76121ec5bcfa150c31b6d143ba3429302bde609b993b2ff0c324d0a95ddbab5fda795bc6541997b041066a511828139e3a39db257eb197f725ac9b247c8f9fc1b76afd9c8e831085ff7c73e1122c21b5025bd5d31cd2354150af2968846bef369f5f8ab4c6d70df1cf8194605280c21906bd07110dfd9673e684e1c20ff10822f4df79bb8785fe8833de325b33f6833ed9e5e56bccc42a0349c67add69cf791b4a5340fd6b0040cdbebad42e30ddd39ade6ed73fd3a66e741cfc5b273c57b08412638706cbe69316e2d00075f3a731b196a07329bd24e25ab29ee91c021a5cf1ef78a2743499640822962dbee6f32c1795333fa5d3b0140bbd16cb482597ccf9342b39a23fa912260075e265754231415c8fa340c1d8722b9f0c781841408eee82c3933d37964bd50f0795163904dfa34f2e2467022e9b1edad85628dfb521564dfa6591d6d17fb990c3dc2daccb95c20f9759951f02ed79e3130be64b6612d50838173c77fb0c3858231e284af6d231f043b95772f5e7b16a34ffcd2ec3e1cf43f53eb9a5639fc5a7bdd1928e273357a3bbba2aa8882859b2c6b869f45efcc983ca3285e9bb990611ecad0900cd37c79c77d29b1a2a1dc76f40bc3936b7e2384a2f992dbf53966e2947f6d82d693df63d009905527c36aef22b71b7503f20bff98dd91d80dc0662504845ac7e7bd45827de8415ebcf0164ddff8f60fb8546b5346d88d1f8a5678719762fd27e958981cf7a1a2940b31c8da5254bc272fab2ac6d571ee761503841074a0c069816dbf7a66bc1dbebc8d68dca455d58613ff32a16d311ca656d07248c5c60a575903a2e4f1c119a6770ddf9cfc83aaf40a596a2c359f8077f4c42a62af5d42b7192229a1c039fe12e3b813628365a139bcc0baae564380b098e895a55cecd25269d23cfbfcac33cba896ed766083231cd33c0a71f8a5851be942995bf4fb21f0ef1cc338cda022996faf551fbc659966f4d542bb414ef87e90dd1fca9e1297595607a6a15a9f3243e00c34a6bf9469dfc9944bd55cc53fa234be103c83ba9c54449ccd7ecc30cb93a2b470539097fd4ffa800b076f92c44f7eef52f7cb7a98aa62e220174adc554f5eaff36e58f6bb7e2fa16b98a33eed4c1577cf449ddbf32357e188b3fd293840bb06a33f3e3a0d340f0053d21f502463a35e6d6a21641587cba1eb9c0da1dd2e62c06a0e6bea5a3842a4acfb0c50d05acdac16b3819d679e682b3318a1ccaae1fae52f22078e095371965c5c91c658fa3d6ab165e20e4f30d3864670e13108202c7edac439ae844d44dc4d3dd73b260b9ba026c96f403604b7ba0eecf65860b4a091523c29d332ee628065e60537a1558e545d274dba85e3bad071d308c91866fd2981d200847bfd74898e9e4440319fbf903dc7a704a29584cf596f3e0d9afceb4b4ecee64ac7442100afaebce03eb3d65bb0f0a3a7f7e2bebfad06c1ab4c3e1401a17702ac7e8912ecb05e949e30577abe9eeb692aea9210a855e1b92b98f61d5262167d320895ee5578f6f502705453bfed012215e56c219338484d16e5eab14779f37e64ce305e44f1be069564720a698677f6f14f399a874082a5f29ae376e6cf562ecb36210abf02fef0de757847c151980c4490c1228d54d9ea4a21a914394a87b5eea93299d193fdda660b30b1d136ab8d9910cc62ac5c9344a3e1043448d3cd3a559029b47f8d04edb38f60f1a01ef7a075362202ec41f9da8742bc7e195372e58951cf02d3d65b504f67d1af36efc56e626c8aa955e953d57dac9899b7b0bcdf1156ec2cd4574a2cc2fd4b929c935d1fe71acefff03de95c0e87622e27d4f450750548d98af819a992b89642d9f007da8da6b4aec4250298c03be0e472a561603ec8aab2fea20fee49ff7968f5f00bc7da79055bd98ae8b11e30db64a10d4d35f306dc5e373b75246e3cbdacf97ab00f58fb88b03852e1ceadcf1a55bcf3fefa1c26a4863dac93728ad62ab5ec7540da8f940755e8673617f77e6760c93ebdd54292cbd219deb1012435882cd6cb014f06ad48f2f1af2fb583a6882dd2d8d2eeecb119e9d2b817f9c4c19fb8bf633c9745ac152e5c1413d0d9b04663dea8856ea2eb557470210d81f3e23702b02538d9d4fb34b1307d2c8f820269aaf6961e7deca8491afc03dac1370017b1b0f93f3e3c006d2475d1c01b0506b9ac218ae4425350bb847d45c7e21b83086ec8c797ee04258a2f34fa189cea23fe0e676c20e65e4b745afbcf1c0c24d3d2e1ff778910b4d1517974df7c39bac0ff7bd0241b9096023c437f892166dc583db15df15dcdd46b8cab3d68331afc478599659b1a6981dbdae70f5b1d19ca7a1187ea1d5b4ced5d016c977d8768381f58102db76899a93f18efb62d5a4c76a2150aafe4cbb6860e79658b06be4bf6b0408930614c479697bc0379e71e28693612e3b32cf43228e6bb3e20eb21eabf6205ac77820d9cce498fca6271b2d52aa0d0b9fedf1fe95a4d919e5f14f86e1a9d6e200900f4bfdbbf59ed78b35e7a4146173599e39402a4abc12d4e6a8bfe90c9448eefc549d8455fe213c39569403792afff8b229ba68e681494f8d321c3a84e4f9d2fb754119293f1e54c001d4e93ea5fbedc827cfda1ec527b623804e5ea9457f6d3c05c904cc2500b1adac0cdddb8f01a95ed7e2e64a0438996827a8bde042440e2c7ab7dfa53c52c350d9be49e632bbdbd4aea6260eaae679b97ccdd0d047d2465b3870125b019f0a67ff6bc5c53d54c5c8108c01b335dbd79614204fefd2c4a636e394454401401741a197ca2f0b9727b7920711fe4163238c723283958f759e4df086d0f6b7d04a7c44b4df5a29ed5201c7a9cf463a26ee1b0b970477ba7faf1ee3ea4df991ea44867d557dfd14b1d56515e6a201ac91a7c064a05afd004d4908322134a32bd875eeaffc1e7e589f3220013032d6f52de0fb01f0ff9bdd590cc86fbdfda9e2355f13511b4964620ff8e11e28ea3cc0761a49680b5aeace4d5aadf1233174618b70a305357725cd8e8a16d13330898ae4c42a0b41f5504f74c3477af3588906354afc30dd30590795663faee1ce63b1046f2b60576762dd79c7134190db5e5ced6ebd6864fd748caf3dda1ba6ec41df5f8bbc0b9e2998f4c6e69ff9ae426ae1fe2c35107f46eed9464164bc1542ba62509a5a6198a47921d6a25c178e264511f23411cd8e954e89f5416de49f4a23e6722b8506d97079e1437ac60fc2ef638963e6c1f4157119fb369e6449b76b14d84ebfda6fd30621bf77e06c66ef164c94cde4c438a662b7c984b8d63ff03e03b450b7b91107edf718fe63cd91652376e08 MD = e95fda82d0384a00d1aaf90744ec582cdbbe31f5c6b2ea26b963ff633c7224340fc4423203a8972fe7d90c2a2342cdb8fbe73e0ab036a29b81d08d859978281f Len = 69136 Msg = 3a2a624bcfb908a61b03e422b256dd9e4d9e0475273319f5a6f551133e9b565c9348902fdd5fa32a919939e23e5501d7b42ff8a76cd3e78124142cddca38be6a9b966c488c646578e9cafd913c3aaeb470045dc13625dfcba860bcca2c9133909c3d7effa46d57786bbdba9675b0ed1dc846be2d4dd10cbc7a0488432e4dbdb6dc654ebaec257f135e9bf75bb15dc5fa031da052797e733ae12619ae961464c4a43465e22d31e72f0c8b3d47b7e93e336ab08d9882d41e2e27eff5742d9031a33cd54ae02f3c97b5bbb613c251fd60b045280c672f7d14819286a6febb672b39ec6e851abaec958eb44301344541345adcaca627491e5d196b13b4b308415b6ffc289ffa96e9eba03f5b8f055c5cc1177665e140986202e0f9c0a5fadbc7c72eb32a1fe78adca1d5a326469e5ef70fd05c7b481be4ee0abd86b3033dfea0795c5b9d8d49606dbd142acbad6513b9276ed715601ef56d7d97581455e3377579e23aa87287de4349441a734dc3434b10d72d5bb3b293856358b80c24544feecda99874540bcd074c4fbc45ac21b554d2f5a676c84085dec5e7eec3f7f70eb27f98bf28be3cf460cf1c586a54e5327d76ae8c8e272e9421aa2c426056363b6a9796f6ed35821df7d9933609cd79826e03ec25ca59e588f61b0ffc0bc978a0bd1b8d84eb43450e73729c9d4b9d436dce8196bb53e5ce29041f7863eed92603541564b2496fed907ea21fd7584eadbb45f994945153503ef4be4fc02e0da62dd68c03c83041e26bbd72042a57681d337d72cef8eb2cd2916d007c5bf6ee61e6ec89520ec7428d67dae933df7071fd9e1bf42b3149f6bee818eee77c6c03bff53e1338cb37f9544c7d10953dcdf3b4c4ca879686943c7b0c9d8f796bb8d429247332a049a7efa0e14ded108e9375aa6d3034f43ef48371c5a3ec186f03e9053934ee6fce40aadaeff38b8d18ed804761f5022ea2905508dad20badd275cbbcfd28508ea329b4683e16eff525019bf367c2fa2cfa9139a815d4f621da3501b738f85fe5108b95b4965f232efbf74e16493f22d68e1eb8b93c4eb55ad06c135db24b245c5c8ed324bf762e22e2f82118cd138414a56059a318eb4e42fc418a1532caa5dcd159f822800218b7242c9d61bce628cf887fa4ce7150cbc0a5ddec49821dec4bb5158c15a3ace9d708ba4959dd6214ed80a221a30f2833bb1467c46068eb019351e91565ee1baa69d5caad69fa2d5258d3f15988b9198f1d920897c2addcea9aedfe1d792af76355d48652f7d9efeaf6c995d3e639cbe6cd65e8efd61999b14ad17c2bbb1fea1a834d14bf6d4351e2b1acb6172655e840b3d52e530673ca5e89448ac892949ad9db879c7c3100fa4470c27baeaed615a6b72c034cba8517f7418f507a6652afa744cc4712add894181b550d1fe883fc1ec1b08e615815268659fbf7cca022d28da9623c084793c46499ab94f23a2645b3b9abf81a49eca212b9cea743a6caab91ef92a4e669f83432d40c37b00e85986a876368fff5d231a449508769e112e1beffa4a7357ad18c89b3c21ee0cb6a9b4d13210799c48e7b43f1cbc0c5b9c41d19c1e06c7ce2e473721e14720ad99bf963452cfc6f1fea29f7998579df97a606ac1d8e1c4308fa92f3fd495bb6a0e058b406ce70096cace3c829c7db40e182457efcf5de1356da911738aa006d880361493c4d8bf0149d50bf89d90e6f011e8197445edb72334e17e3b87f8ab6f9cabb29d1f274ab808519e3a10339f45d426300df113beb071ccc616310201a5bff0e5cab0554c2172ce63d598d85585fb892c0b35625033b0d5a9822a4eb20166804ebb4ce52be40595ed39abe19226d47b7dfaa75c14435e96690de84135092ce43ddd294972665d629af4ae01edaf1b67a66abb538355e789b527df9bf3237f8733aefa14b82ed69f0d95339bb0952ce825c9d60b25e1e819ee5e949174f6eb03d0bf23b945b40db5b579b121936f85778c96abc5648dece1a5108bc442e9dbc4957c3ab9d37c6f311330cb25fe94b1903b5f9124d7a0425b59fc49c6e572ee53e264a398ca1e77bbb758d63b6aab3dbcc2932a9bf7cfa4f17d6032fbc5387f3c4806f2c8a1e0b390023056b460298677b2cfdcbd3d72614e9feafbf57a912ae856e1acebe389af789475e1336786283b7c742beb112f23bd320af9267e135de26f733655176fc7bfde87fa3af9579f82801e9cb82b5c58e7c42ebf013845a4a5224a23a6a60998d050f5063d8df458d77e2da3a6e4906d38d6f4b238319e8bbaffc4f95327fd9f749c3b99adae02f0c4c72fe539c551fd3adacb772e02847f9e58722bdd15a2580700ca292dc209d3b4eba3b5e35617756850317245239decc9dcd04fc6e7ae3ef23f2f3910726f8e426c17aa260f57624bd7b538200d517fc7fd7db9831657d0d097e94e0827aa9cd7c8fa468469a8404fc1c53d41383595032ac91da43a559a2cbb76dc776a416bff72d9ff80ed709bfeaef0062b2cc0d915f540c0accc2e17610a6678d0b2ca9813fa2559ae1356d1d30fb407306379987add83670f3427b508151687c689bc9ddfdf6ac96e73b18e67649fc50374c66fac53ff554e1af91f9c5c259dab679dd99d9328e33477173e263df1d426c93dcb24e9133fdbe908a3a850123f01c4c4f7e7a5de2ba2a5fe4d9a0c7898fcd956376f1d6d7b4b16eced96914ac06c39e8654897f9073b78ed492d5092a7f83d964105617c9c1e2d0c59e1805de64d3f6eae3ada17fa61785acd6a9abe65cb6e74546245cf16c7a3ed7533bdca05173dde3f28fc9999b71ccd26dc4b7a76c8d4870e103ab37fda1406cbe799fd917cbdad94bd602c59aeeecb01fcf3454f931834ba99d0e83bb7e5feca97b5873fc047534b42b51ebeab66cacb4722bd549ca204065978cbdef3a22bfdae90e554946365cf636c0f4d4f0d430f354a312a47fa8b6df9c2dcde1fc124d196aca6745b8a6bad99e56c6a0c5ada3a51ea4f25478a215dd52fa9bd9edb5fe30a693913a834cb4240c1b4a965c7d6d92773760a0de96c42861fa0f1f35963be54671bb6eceb0b3a1271868fddecff682086241cfd90c2d88723612fafb3a6a02f26ccd2ac25b20169854091f7228a53d792f7e2a908db7c42db48ab4672bf54d518dafb687d4614c06d713424112e48a71a6fff92ca0caa6397e6193a3f0428f0cdb4a5a44a3e00b1aaa70af72141b3398ceac84d4cecef43f9c7de0d411bb8fca5e845e2251031a7cd406ae2eb7b0fe97af6d12b19e2b77e614c8e22516c617341f460948653443d35dbf869d810cb416512beceb984af7d7f028e3bc88cdedf22579a5de67da4cc74e8181e6fc971dbcbdcc5ba944913cb9388729c1ef37daab7903780ee05cfe02ae36e532b0b90032fa3aa5132b690d35f2ccfd5dd16ca60721cecbfe5724212985c5fba824db2620105b1252d43b33f328dfa7b7b8d419b027c0e5d654997de7dc160b71e063582c0819ec8ec76d779ae1a86ff92bd7fb4b92c310bf5f23d9e1ba115db46cbb5c01e95b79ee8d699fd2260e9d48b3dd13836bbe92e1012affc2279e389a5149fa45bb08039bad957345fefc78cfd74e2afdb998b463c116b5302ba5e64b1677fca1860ad0bdaf5bbd99715749b31f920864843bbe6d2850c4d3cf0eadee43ac28bc5348287b1c2243768708581f1311755ed58ef829bd3ef4551ac1d6ab604f483f29aa55fd7b51ce8549f7ed393c333993b379a9bd08490c5b15a6a8abf6ca22d111189e6c5452266dbe0c502921611bad26e41b5191d9d690c6a66d168c847f1b127a4af0308c13d7ee30c8184a01e55136b7940ee157189937a76b14abe526c434b8a2b095675d6be2499f2e407d5d29ecda5d1b7f299b217092eccbda55e1757fbbeed50e4bcbd0a1401b928a3b4cdd4f36bea1f3b927ce77503666a13c76d6fc69768620a027af33fe856db0a5791567b1fec8c66e844856c8910b8802ae8eb2ab81ec55ce37afa16a25e63b21ae783d3467b77faf793815e147e3180f5146aa6a582e343dc479f26b4226b219b1aed8a83f97a6e6cf46ba859f15d8cc27a5ea8c4476455695b42eeb25549df44b6041f3cf8fc37a4e194f9be0c9519ff7547cfa8be9117f74095ed11799851a44367eff5fc85fd3be5adb0a532909f18bfa679d75b11f21272089055e1df0f364d799b2376a0159e7b067bc405a8a2ba940b45c4cf6f7a577a0b76e420769e773ec99f69e9c327491c4fa98ef875cb31ace6a1e56df22712c32f0f60d7f755e381c87b2de86798c833e9c86a7d605f3a64b91cddd9527ef0e7d3d8405af9ec07c106ace3d515e0986c5556eb16f0f511460325027408e86e42aa50174bd6b75076f4a310425695362012e38557b02372eb4548f7c06e09d78e03153a0d164e5a1e230c57a2923d2df9b2ecddb22640cbaf0ff722612a49e9048e863d214127812112271e98613eec43b5e138b8bbf3881bb3be16c8a62f0f509d21951adfc9721a32b1d9763c210db88c4f3addf9a234bbe11c49597a3fb6fccf75d67c5aba8984150b1cde9b69eea2b6a5588457e35e0a08803ea60ed27c63960185a84a5153d929b16d3407902bacb582265e6f2d6070aa986b30ecbdcc1f7143073117444d93f1332f18f93a2131195408cea7e6e8aa47b3538c8c28229af1b8ffa959f9f33efc0ee6ffe8ae8bda529994578aa652f1506f9c0b75c81c6087e1b3737af8c154bab3394b7e83b7f2e1c14d8b8ff23bf0652b89402204160ab44be71202b7545fadbe7aadf3402225576988cd30410011e685cfdd3962bbf3f755ff2779bc18ca558f3f7a1f7a76fc1400fabf14294bf064fcb414f47a5aa6d1ae6006588d8b2f42b40c423b8912b1a82607b393f18bf650fefa8a0ba18ebdd393ae41279227f8e5bb5588dff28210a427345d48502cae4b1ae7cee77ed4836dd45e6a5f607bb1cf039fd0855d418378a3050ea9cbca82b3bf20360078a8a210bee4d4787ef2d45f3b6f9bc40fdd749617fe6a20aac21e1b8a2871ff1597945cd1d631fb5429eb26b1395d04a0b27e9d0484d24593cfdae2da64e52bdc0dc4b2aba6e560768d60b6038196cfb66d0bfdd73ce9910d3033ca4e6a022f4297cda2baeb71306c99df7db0dcdbada769a7293e8b129b8d8fc302449c7b71dfb229bd6df867f38cdbb1ee279f8df6fa44dabf78f3efbd8b5b135b6b90a38c09e9435353623c227ddf7298067e4064256b0111350bd38f8d1e7f1611eb0ce667a9b51509bd5035b5f1ac0babcd755dcf58c4dee147507a194690c2d5e02a096f7fe972df7e56a5bbdec8a9a611af4c4eaa90690c1af915966fe2f226248d7d87d87aed6309b20af5d3530273ef50c829ccfe50241b3fdabaf6d024912ca9ab474fc3f53303f4ddfa9bd59693bafc59f72c6914b7ac9741cd77f2ca956cf12b34426f1aadd191873074cae69419246a2d655b37356391e3646fc564a17a1665c55cd6de52171aaf4e1a9d72e36e4b8132f46f383bc4a228065ac27353b86bf370fb95b0ce38e2bea9e9d7bc004ee427be45ff8829345a9829a564871acc745cddbb161250bb9c2dba6f0422891f80d605f696b78c572dac54ec4600650ab1fa51f7e2a3a803a9751616ad66dc74a414d072bf36d3919ded0eabc18fd117c764844e85c522c59d3d337d2dc978c2b05c7446f396ad782dc2bd407185dd680713cb3b7a076f65e9eea90f2ffafcae581587efbe57687f5fd5f766d072e8601390bd3b39dadc6901f1cd490e5bc68bede871d989e9a31b969f337b58d790b45f53c0ba4fcff84387ff46b7536c64eff44dc890e0cddbd17476f7ea953454c95ce58c5516474189ee5f7bd699bd664efdae02b25d8471357bf5cb50f019a3138ece668837e156b0a7aaf3234bbf292d8c91a69a5aae01cc1fb4143b03f80a278766e5c02f2e963c466a3339d4025c0003813ac5529b1be9c20a69054b300879b9579089667f8e913d05b266dcf74d6b050515dfefec1e232591304c20821c8ea708ed607854be641e060756c13e9bc30395ee268d11871c9cc1107c4e4ec4ead30352d1cf5e94094c0398662b18b5ac81ac2a55b49bf51aaa1270120f067ff2cfcf6759e5fdae155956ec317546298c01b030c9f0ebd6c1d01de5a9fd39cc4aefd5a17566a27afcb8a889353a2775f5f66ab81fbc91aa86914bd7a093593867d5ae87909bfd79440c40e5ddd43d195ef20426b3922dfefd8014cc926c0532bdf3c29048206f277fa6e888b7ee07824b6744e321fc01328b0f113b0be1ae49c1dcba32088e6813f42ae7e84fe2175f2fd88593d764cbe3b3a0b9b9598eb4ec27e2ee036e2078bd660ac79b025adcfe90b84eaf6056de80fbe786be17ddc99844c8e68ac591218239c920177ba2d8ef02a918ac496cc9a8e845f0bfd3594cec9cd12c1ecb5af310e3e859c418748bbeea0d7bf0fef10dc9fd3e9044f88bcf57b4be3755cbe85dc7f8dafd47652a75dcdb67d1440d9e2b42af53ddd413efc14810c280c663b3d235ed238307ee4f17c74b4ab0ebd1cea2c1830851e3a1efb35c3590a0c71f67e0e93564838c105cf20cbe28b37ef80cf4b4fcde650a2f1625f2979b1ffe4b5f1a4075e0575a87ce952ba8742163ecd3a19b8138afae07fd89b9bb6446c29413eeda0359a6e9913e61929edfb3313cad29f3b4c99a45e9006f00156ecdca7620cf147222dabfd906f7e005adc17d44040e4c1be3ad683ec946643a2d0d6c6df03b9e56ce7b53dbc2b8827170d49ebf82bf030b39619b75a290549e219e2ee82cc4c605cef13bf5fc33f866cb751beb73ccc7271d5f462a46dd6fb5eee8887110fb2a23a6e4ded41deab06a002b8b7481b7f6d401ef0ec900ae0425d7851f95573f4914e8bec2e2925d58dfd15053c726f110b6a9993bee7a52b0429dec4ad16a11917df6f77e9e13fc404c919c0b7fce08b323670683e70e9c02b08496a091c41291b364176882fd680544d35728faf18f4ccebc8f4d5f57ba69d43e1c9762efa2d849c2a7272dc8f1263d192a22c53bc54c0d2ccc1eb3c06e54421cd6b5d16742b3c5752f20fb014811b9d57d8f6b077b4f633a156e90f308606ec36d8249a582e2aafe07ec7720dd563f8ad9c558dee1b5656723b3534a190cdea439635834e3b36eefc9e02ec2117222cbc77b1b3cc91c88265f93973020b80651d2ff698fd5c485ad0db28e4f94e427fabf072ebb71e3400a2175c96fb0007a3eb2bd1a30e98483d81bca1233d82aa3aa39000fb57cb8219521d056333764aedd6102d6a28f81edd3acad57194bb42a4cbddc3ab569f9a129d939ea45375308a066871b7f482b383218b2d95a602f2074c6124c559a36436aa028e1f0205a3c4a2ba07501a40ed765e890f591c5ea2a94da4890f0bddc9cca2f23d9de92f8be1d38f56fd413ab5001a4ce4839ed83ad4f72d5b531157af1bace913e5b0face2ac06ec6881177f4677d5a15dcd377a2ce728403571619006cf17178c1fe6f55e792dfbfb734ff90f4ae3d082c6443c3dfe531e7e4c029a2079911d4f77b940860706aa9544fda73efd67d273bf844835178bc71c1b7917f34cb528f50d073cfdc8398ec250d1183a01ca0d9d03883cb6a55ae08b8a4597d3bafba1194a51493a5f2f0f0f313aaaa4ea93085b5cc078474a18f138f2f8786636ed3c28ba17d3a01e6fb1e850cb0ce43a4b595b05bd894b587e5fc0fff2581f630250bfc6db8ae39873fdca59e28d9c536b5708a8dffe5762d3a2a00bd3a553a1c3652b1b1cdd594fc469319711cb21d87ba7e0b0c835dfebb15052a10cfec785b91007014c2995c6e98acaa2e934193be4b27fa7d6ce6975afff554a1eb2df714bb7e023ea1e1d704bb8d207d966e6e04f1d3208bc36787327f624818960001703d332fd872944fe739a043052c21f88032ea46dc8fc7176a1db4cc1cd84ddc97a086be8a3b9c0a3e9a4cdb6f5d42775b99d43218d8f08f2a6153a955bafcd1b06ce179fb06e0513264f8af6231b934bcabf9ade8a6c9379cd4a8a76c43f628e427ab26d4da486beb210e8887b16e77ccf2c27ef4023a56e5fd198d097c21295a5b4b8ebcc0bca29058f52e86e44a88b2f5956fe3f32b3630640f25d36b661c3b8f2b795cbe243c4a92156906d333ae973cdb465d82841da392f335731aae48ae4cb2af5cdf68824056d601af841232a350fdcc0cb62d54660e2b869091dff6dc1948f7632871bc9b2ca0bd2b01d05cfdb861c995970f23a26021e0d3d7e26eec7e551a19a32532829cdb661f525374cefc7105a32d10d17f113b0ae4f3a0f8070341e127576d2b1e2fefc4367d85c23da59447dc8119a824a8e3ce6af000dc55317511354c32f1966c449f168c4d8e733a3158e89a13eebaad80f20ed3e961fd8f5775ea8b5aca13dc42bf6786921f9843b2017080e4ec68a9793f77a645d028a650d4ef1bceffbd0552ecd2743ebed3487e081c3c76ea5723387d4d71fb71fdfcc9f5eb0477d7bb71daedfe5d38b34cd2fd3593d5af30aea324743a3af38ca51b28a1874f3c9c36a8448b954968462c6897527e53790596b1a5ebe40b1569478bd6a06b0304945530f68e3c41b6bf9b93b42584bfbbb337d623acf3eb49500cd23cba3e28b90941935abe9d4b0a65c0dabc784e205d80b899067d10e377881c7ac1b7a9c742412159d6e260724c81c4c51711837e46b54283b727e3f9875a9e0bcc5e53e687851e08d4c42dbb645bcedc2db8cce16099fc1b9c721337610eba0bc778e590701c602abb2aaa303a3b07a86737d15292760fe91e2549a5edec9a0419cd06cae5500e46f3dd82d8b76997b02b5539d8c492a275a50a2c4a143b637d2a255f9ece6751e5e4a55bbbc12ca57ce2d9ad7cde37de489ae7652ebc4540ff6248971313aa508ef649dee241ce5995f58cd445c9abebe963859b59ce50571129fe57319c6134c99193b2542095dc82ca36573b6b36f0e06aac77d433a5d03be70e470151d4241e1d497f1944ca56cbcb9fdd66ad2215b61623a0a6d18cd40504410e8a1b4a49160234ef3a97b4eef95f8e0fcf77b584f2ceb4bfd7924c8bf8e85f55d5e00dca38a81ca8be009dcd93edcc957db239621cfc257c705d2f1c9bfb30c3e88a63d00d77c952ad66cb1b21df22167844f4dabc073f7e77197baf76a67b01cdff95831cd8029610b387ff2c9c553ac9172f115b57ca6ef7b0796e124f0ab68c29ea0aed31901ceece19a13b8c30aa7712313280548ef3f509717ff660a38b2beeac8e08eb3c8b4f9fc92ad6177a0e8a1c4463b46653b67b0cab0aaa3f0f28b4382136f66fcc8b3b0edfc285a5fa0d0b1faecc7ef5e05f90a16e38b75616342eee932b3e2408c6bb03a290d19e79500102b8976669fe953db00430a40b7f58a2f848946871bae1d6665bbd416abf7f74adaae9f42a75008921b31bf9c8143b173e899afcc0a887951f53705e7194416c07ccedb1a00d497cdcc4213ff49b8695a79d6583789b5efe16cfd2ae1cc03ef2fa65c824338d181eca7f69fdf6dde0251dce1c85005b0e1c341a0bbbd10a1f0d6ebfa5d64cbf1478d12b1cbb38a2f2cd8862e888c2b040f45f7b420df93c8cc64920aa4d5169e691da11610221b16397cea2f01625629c908039a02afd1c2c2474d1ff13ac543671ce7a615819d4dc8bd8d65db69138c9f7809d4c9c4373a82fd71acdb0c348ab2193ac444888d105b08e4656f16efc703145ef6eeb3508a7ef5a423caa000deda813f03157d671850ed839044d25743847b977309d3aa5d26de693738bca6aa50e348d500f6c7c05ad9ff98e541c69ca40c37cb83cb910d1b061539bda88287b5ce0cdcaf7b0ba2c96c9cc1d8ebca2cd244a482e501c124bc0b5cbdb20a40f1699fef6c7970bf3a3d040fbd9826de9eafb3821bb5fca73e9a6c8435ce485e71fcd76516e78e6ee1163eacde9b89804c9ce745087f32bfb5269840345ae93783d003026e821a7741f58b18c76b8a3bc11a4e61cb993a7722e11cf52bf07368a193b13bd5d1ab84d75b67c7ea70bf8d96a8676cf79c8a69f27a7937af275d6e45a85095df4ec7f41ba8532eda538fd237e7b0cb0f118904be331b7c10582db4fa9e7fa4fd51e661896cdbd1f97c71c62f28b9006460ecd3e0aba237021b6ad93ae68ccdc2938d399b397045da640bc5d71beea1aa32fc5404547bfce6d98b4781010684a18c3308db6eaefeefa2c44dda11d02342e05e1193ce2732512b059c678e7b6e1c946e4bc4acf661cba131eaa2aafc09b0f178790969227bb378602448df69eeb654957ee154d512d0f7bb18cb57d0d996fed206ffb60c3da05a319bbf84409ae1354f1ebbf6c986a20ee654bea8dcf747610157c15522fc8a48e04f360d9dd73fcf01a7af134241b16f3a2ae70e9f0754b07cc80897353cd3bcf2db46ebe048247a43a6553aedb881813d07ef09956e4175aaf4202c81733f2effac6cafa64231df9b9728ce1a6f84fd4578311a3eb090192258c265b6440f275d5f01b95e79ea676ff6a45d66eb5e2c1a0857c11952b323695249d33203e63e925fb0998743a09a3741425931905fa5f114cd8eb3e94d1ce69d3105835736dd451b03e0af2416f08813ad5229031bf38139fce37cd8a07e2086127d3892836bcc3d45ff34bf9ff2e8ca2fc8bbc8058d30f4806ff2a56fcfbda9689ab06a4e92ce232175c66abe29cff1543d4843ceeb86b0d274a3d40d7a0473adfe89331aca916910b4c2b9e3fda405b5207cfaba87091b7da21ee8fc15ab714d0931715a7bdc7b8e6cb821c3f71b93cd02b8717af82e70ec68b258de1b092ed05b27c9904ef5d704ee1536b0ae8d080654993c62a76d7d99490ca80602a408d2550a905e8c74081eb9786d4c7c7efeeba68db0142d5c7e2eb38c5b1655029bcd97286a17dced9b367f4039f9f977d507790470f1f2521ef748cfe6819abb642c922fbb4eb8b8ece6700b214b9dee26c44c9bf3ae8f14cc9d6935deda3c24de69c67f0885a87c89996c47c7b3e27850ac71c2bc8c6beb038ba55cb872c1d5871fb4a4d63f148f0dd9947471b55f7d0f4ab907302e016b503c8db2e7fdc453dac8dd1fa8ed8586c621b92fd3d27d82af1962e7f305f80c3f4a72c701ddac1665cfb06df51383fa6f0c2ab8429db51fbc831fd379a6a8542d1005077a94f19394cecf1e5f33983044f369cc6279aebac42230584872aab9a637a502d6b62d620430999f2be02aef046206da97f8c2ca327144e4c41c67d3372be3378ab3c7f8208fa06eff8bc48d19f28241778d89e493faee1790e678076c6730142b0049cc6646640c5ea8ed70f20f5cbf75ba7c9065196c5f137353ec92642c372c3e3b6561ff5505adca1e51292306930702034432777029e03573e955bd380f02c01549901503d98161cf941bc8007acff6c676687f7a166bcf608432ecd40a43385fef7d21f0f66df289c06688eac5250b2ead93abea933a839253964d90b7620983cd85909ceab81ed54c85c02600aab1b4602087522ec11491ce1c89eea4e3a6197a45fb783514292acf061832bbc57cf024bb8c414793d4d75a221c5e414ca0996c3acd1363f6b4029e43fb916509df5a61b145288c2756eb9e336f502b018b7c29e08feed5d431e550dbe4d28afc5b5bad9e2c885ae00d46f0ed0d74b0a6c94a19b3be6b2931455b7d3a6e76abf1738c7efebcd142728a61f8ab712c70a0ec8bd230c328cc9240cd79fbe2ee269daa655c4f70a3c15330d51bfb34f7e99457a9e9f448a84e7bd6c3ed7cfcb9a965827eac0ce27055e6a308e158c36799d5bd2ca75ab95a0d5259d73e5a1659a2cd7e1104b37cb77eb15385df4096ebfff96f9cb0f09fcea7ba4c6fe2ffca5e815a0ff4ecdfb9e9ba47c4c47c4f4a058a83f1729d326666ac2840f681fa8338e37fba72caee24a7871e695d3ed13734d7f9d536a2bca7c27900ba1381b6cb6947c2f023356b474163b9d3a89d72f90a56bfad6187ebce629cf83a4f68d12d700ca8637ea2e39c67ee8e764f1ea0f9e68569cc8ba33c54b7865323f2bdc603ddc0b466eda9c39e8b7620d3b948f7d469e27cc50d9b4ad541d3c619b5e701f903026b8d189097b82c98f56e6f92c3f3050c6d296fc683ca81f3a57e017b1167a0203248581dec83bbd590c8ea82b1e03861af6c3abb739f086495e35 MD = a4245a5f76f6228113344929db4ea36401f1b48ecde3714ea7e9f90132f08658457e3b90d935c5e400da23671ab42ca836f0b070609d4dd94480b24531026eff Len = 69928 Msg = dde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa638721719793475ef1608ccb35356b5a4de3be888efb25853d3eab435255a7cc7bc3e1da6417f6a13666fef05ef86b788f42346b0a14344a1d14cdf8e96bd01269bea183b060965272c6a1bfc63b2f8f2ad44fa4c8a717d0f83843eb053420233462a99402d6ef19ae68be61f7647d4527835658501a97c0d69258452d185fa8e4954036e3e1c89cf1349cfd79dd1e428d3690b22bd77cc2bf0a532eea7f54488241af90dae9eb86431285bcd20cda2f64d546d7e0448e7dbc887bcdc3d1c8ac154d3fcc6f561e7daceabfc68c5b78b4b547c1f2f7cb949ad4f41a4b4076837ca5a1350f2a902a2935a493422e31c27887764629f9d358c0103676cfe9d74d5f3b25dc8494ffd734e528495841f57e24e24920a46dc3a0987636d782475aeefdddc17b50340cec43c55e29324c11755fcea8958cdb0535ca11dd878ce1682dff965d599e921d3301db2e7bf5d7ec6fd2547bef09cb00dffde611cd143f6ad30d6be1bf94379c7213318186cc6bee34257baa7442c61c65d9ffbbf042eac6a8ce6635f55aaaef7224cf3d93dd8f7f8bff4c1e6d6053c1910863c4393f69e674eb8e4143197380fbdabb4cea50cb073d08cdbd218afb57292f1a12f0334430ff0bebeef1f91bb5d5ddff94d34ea7ee13e90870dae94546f6f92d8f5d46040e11d78622462129f8c7d6a3ff96ffac9cd24a0520dea5b9f7c00ba321c79e30e771f766c68bba25b09a6dad747a8a617a45d2cbb377e5dfd04f1084b278665022e81293c309eb9844164927dac8174eee332a6213ead1403a6aaed829b6c4ed293ed016ff05dd091e0313181bc9d0fc6163fad2268293639edb8da86ecae08e633bdbf664cab700a52972891ec2dbf23c9ee923d68650d0626856fb69fce3bb38a6d83bd99fa20541500f81cbfe60b8e5ac9f5e093d3310f0dab1da0293f5fc104972ee45cbc6a15a3f91080ac488d7c655c58ba9f061aaaef8454c21d93dda53ea4f1692974a5b58bfa126c35b7ad6456103b09de80526068cbb59ae14e4dc695217bba74b57bca498e7e4de0c5f3dcc9700d7cd6a450d5f5cba09918d118bbb4973e56c2f144ba4920a49431f5f95c2c0650721c149e62032eb65b28ced6daf970b9dc98aaa90c174b35edbdca1658fa4d94981343a39b3d4f674f958a00cae0386eaa6a640136308892a8c8a4e359a0b05a4d50a408f7f0a823f4f3b51f021568cd5ebc9ff5df31435b53f738d8e4dbd9020058c826eec9e37cc9a7b299f6e58c765803c0ff5d7615e07dddd87f60f8123c5f90229616256bf25c4614fa3ffd1dca24d47976379b7ad294c1164f74921669c9ab45ced49fcbf52b335eb843a8976943b31bf3040deca2276574b19616300accee9449c0956e259513f27c889483b443044b1e3939d5cfa41f664e3c0109afd7eea09f50a2dcd4484c629f953d5d3b915c69204dcbd0bb99738d8ddcef0db989300d280b5482b1b3614199efff9e7fbd3008d1b820781685f63cf8ff3ca6c84f371c7c67071a2e44e6f2040f77c1f13503ac7b1ed40630f81c070829867f4c98885124ea46edaa9b4206666a226220876bc6b4d84335cb4e497e43d23901c703886d8a0ba087d71506f129868be99e22ccd9f78b1a7126172305348fe0b8c80edba4445180730450aa34c5fb10e2baa59b68bb9dc632d1d12d2e42c8fa0eb018e6b7bc428339d2cca063e41e5dc8167e7c059986b3056f1acc7bf704019e2fc03dfa8a551546c2e78de0dc86cf14221bd302e9dc7d635e329550d9c783d1877345ef171fa314553fc74e47caf1517e0c3513551581d71fe6fc5f6399ed3367d09327eaf8d93cea43e10e9e4140fa8ade16a933b86cdb247675fa1ce1ca4e3136aa278e77142b22826fa448804a99c8fffc273e4baada2c8f96a37e35978c8433ff507a20e0697e79d791ef0e8a99c8f05a2fbd25a86e7880e30df00bd168c1470745266cca726ea89d69fa526d84fb4db52538fd020298f8cf7c2aeb048d88fe56782be13ec0638d45aee2e28fe5e066a1aa4a3824311e65d0807749ad454ba8616be2f4b9edfd9644a341354e3708d98421694dab7469467abd7dbe383a79f3cc82f43dc855bd623f198dd144e2e524e11d0ec3e4371a194275a6af31d7a46edc6fd812e692036f7964313cf093f5c75d0fb3218b13a16cac6b7a9336a74b582594f71a912d601ca805c3decda4db3f3c8beefcfc748faf3ce172009323ef6e4c74d9cb648264083f80ce3d58afd60b23e42aacb4e4455f688a158de3c7f11f9582189bbd2b8fa0a467b8ef1e1f96a987daeeb740dd52fbb3c7ed81b51e00cab56f0c02279333747b2d0c5a8a6e9d98fcc2b3b32cea4912a32d528263909f1e107e5ca51053fff2284341162a374b67e72e1206d5759822bb1cfd169bca1c883b5252eb23e855b8303cef9879e43084cb8f7248d719b0ba602945a4aa1519778a6db74abebad525278c7057f60fed7e3e696cffae41233836e4b4b33b2c068aa222d25a6d65fed772b46bdb3b14c2b2a44e5a81c786702aa3b1d2d8bb59642007343c80ac54233da6474aa8958d50d09190d375cf5428003b13186ba737d2e62e046e53f81fe2c636b78536a1f428468af350420224ab6771ab0e128b41b32b8b05e05add23ce0fb877b40bfcc3b992f4c8698d1c828abecbcc1c33d401859ea2cb2afbc7fa4588802a5faee2867534639287ad8af84674be18db661de1da8e19c6b6bd452dd9bf3221d0861fb6fba96be42329b9f04f37dcf3b41fc58d2298348b0c15d1190b125300cf27e0dfad60522fc498460535669cef4ed7674dee3b977aa3abf8564a305739941af25b1b07caf7f46fab91798f628e04037fbeade6c72815d627602787a35ed7c5b0d3c4fe4abf3b16474f9c20e2326c4a7b49d2382825cb2aeac11386ebc2f2be98b42bb235f80132c57a0db9809ef012e69a0b9e5ed63c20cee3aebc85288d7c3686bfd23134cf2b92bb5eb7b20627e35e09aa87bfbc014e205259a703d2007506b611cca0f82d973b7dffba1b1a8c322e234f92ef6983199ba794d4dc51e43f85ec920029a484dc2c5c711f103e8585f3716b3e424169f9ad3de0a4934ab1323074e12b2fdc6d80e1b143853604bc652a7e7de87cf5fe84c18fedb4bd0ee00393096f9c2812601bf826f75af0ef99465fa4f83fe3d9e9316537ec73ce31091a29f49dd196b8d503dc280d2ed56194afff7f8a831b6f929624a09d602b3384fc71d10c6a106254ef1a3ee56f680d370876887580884983197c6451186898fc00e7193bd4199168241ed6209b0d4518f6713a7986beea4331c8fda7fb0ac3d6ee06579c9e16b8875966783f4049ab82e06c0fe72423b45b85b6d7129696669e1a6bf6af369c5a2ad59dbfa1eda1933d6cc3934ed75b4a247bb28b21597fd3b9fc6481042c2ef8cb4f00f6e901b9ae70e2145f211eca1e468a487444d23badc32aac810bed2316f12c5cb8850ad65ff5e6dabe0e7904a32a37e54d0d9f6e57422b807156f82d3734d3ed9f0687ac2a14e1834a57647f6b581b255fdbff7c62af55accc55ebb1cbfefc5004ddf69f9f6678aa8e9c7faee9589a65374090da42735f7e0c89263567c80c10747be615125302ccf56e0927bf944c315dcbf22c99369f60cc71363c7d1869ab7870c4c135632647092cbf5e309387165dee71d7b951ac1166aeaa4b7e78bb7d8b5d11188b3f39b5545900d6eefef1909228be50355cfbfc6581e0d70e5168232791698f561fd3a441835c066d0f121ca4fb264a9fc1058e63ab78539f4b0628c79e2c9a58bd8a706b2c4f811d7c4f3700d6581b4b266f43cb7bef6593cdfbfaf603d8cdf570a4c63bd449cb929f2f5c306ab246e9e57fb92783a4719e42e0264d42fc9eaed1d9022debe94a4f103918bdf8c351de96dd5ae243360c1152291717dc1680f7699da0dbf39c81a557d2e8f43109d0aba30eb5864b12999f645d59e05fa51961a0494ea08bd20657dea3398d840427d3a27a35ae0bd8ae8b01e36b511e36cc700e82582615384cc92d10a6e46230dbd91da667b3f5e6bf86a351d7c4c82a2e951ccf59d7001dc96bcbb1ad936c1e614e6d19d822a9db40f4d13f0bd5be1d94634396c03e0d1100c222fcba15023b6c86195ae3848804d76813f183ee908fa24d2b6f27b57cb0876edb5858d3b5063222cad036542121e752d41fec89cfdeecc53cbefce7df6ac1c44d5b066a050d76a6ca102d1bf580f5379a209221cca9b86de00cbc4fc5ae5455018b4f4262cf8e84cfa1543685c095a8ee9a0161277eb9a9bdeee2579ff993a3905faff76ebb0e4f23fa384e525f2d0949e2d6a260ac54fb3ecc0b99feeb1442625e84f3795e6a586f8145dddbbb4feb24a17e7ff8d10ee4eb2aa48132e16a93ffee7ab1233827431adcf93f827352c1174c6554607b6bf93b9129980c7aeb1ae1a60ddafcc6b991ae73ef1df705fa2d9a4a27ca2819e0aab8861758cc263a69801b9abb5688b5c6b2dc83e3a9e18a731621323bc02b017bea800a4df261cce28395cdecd0fc9044908d541b0ba4a84413781143b92d42df39f55ee22fbc173834caf3e9eca0ddbdeffcdc3eacadc8232aa5415c839f29672f7ca1bfd4939dbd4c21c92d1a03f27529a198c90d9b6e72c44f4ef0b00f2986437c6f217196e4e412109a40d9a4831cd611f6449ecc0fb568bc96aabeebc7cf1e8b13c19724716f2f3e03afbbf0e4176dd4813bd0de208d9093c4d510c398a4091f2c1aa5dac7a10bf081d42177a9f7595fc6095430454dd46b362a4614f097abaf34973e185c1c30ee9158baa7492f311a41579970e2889c9976f4df5e743c6ec1b9c1c06ba343267ebe97e81e56318daa6f8100fe8cc051a513df3d0ea7e4dadd2814cd4341b86527663c2a3b35b0b776cd203b67a887ac147943ffb3e03368880c2ab54d9bee657f2490018c8c0f5705c6af991ada41046e33bd97dcd1aaa028d25e28d92647bffc764dfe90adafd4ee08a9baa6767ee328cfc685e7d0ad1a56273998748566dd15d7c081d63f34c985ff89108911b3d0da99d94a6381dd2f86573774be1dde3561d5922bcba5109d6417d82b31406245da4e7075ee599d683ffef25e0473f05146dc2d6cff63d5d91ede117b4d670ccace4a2668e6cc704cf98ad4b4e60c4fc95b680cc5c01ff704fcdecf712c1a35c81d1965c3cb5ef85639977909e16b6f061615cab6ec2df699b4866cad5bce6fd65d38a8f72a75980c768139cd74f5b08fed41b1c0a212570fac6163a06ae80d7df5248a7372c4c1e846f491801f5fd6df67988c63a0618aff6afc5edab81ba1177b6964d942b12872115e3ac25efe247d1b76a520559014b166c3b8bcf1cdcd4b5673d298f8df1e226c1a7ff4a2552bd15f588677402286fe26340bd77672e4722ce05e2333832571cdd5fba787f97f74c9dabae8dead541e3fd9c2bad4af7934551b52085151c108ad0d184b7e5f81efd169bce5af750e9a0a2167c78ad81dfa659178d8f0cf932f802c606103fbc5ab1c82070e312e090a2bb7858e1781254ce4ff1cf58060fe8eedb05e88a752cd2ef1b023c2f24cf5e6fae8869ee93f31a44990c8ee8e9a858f5c358d12e6f90af3f7708d94613637a91e50f54a9e66c5890a13073489f0aaa94228569031630182944fcf030c9e50d90c6d4c41a5ac4363bcd24257f0e7d07546055591150533636eaa428f52c9c3ef2bba15f48d545ddcc87b24d95204b97bce5904960064231edd1c82a9e26d236412b3ccd3b403575cb36a09393bbba815419fee0f9214630d761329e339ecd1c047e6eb7fb84dd25c141b79e80c914eea46566c7e387a55b7a03a92aba7bd719c41bffc5918785163512bf1764319f05352f92a62622a7db601df4793da73655086cb79e04337570af1080a547dba4ef8ee04824cbd896d81119dc31c30932f758d85eeb5c6ff45ab7a3c2f132af6ad337e151e9d893b879145d29fb558915283cc7bb53a1224bfcd6334ca32c953bdab999759e583a57e7f053a37efa0f250f3da1977fdc36c37f9328e7623e755d2b9b6f7beb50b5b94a30611163ba83acd5e2cfba161592a20b77eb5bd66f3719f065cd2d77caec26c959f13d519dcdf0a1b4b7ecc1521e30c709e270a8c7c3b74ea01a51ebcdc7e88cf56aedf1acd63a9c3ac2f5289dc2b7dcd176ed804e017f6fd3bdb0ee622e46bc8b34eaebee84d1edfc589cf2fd667d72570f9c050ddab97b8620122990098781a4b7fce66cc0ffbe82e2aac87bf2cbaf241643e00b34ac9941aa3f435f40f402c75aea8a2c730a3455c6e8511d4ee9bebff1abb950f9a1f28dc3fee5d7bbd5687c887e8038833b79fc6e1b36ed631fc5b00a9c36e50fe0aef1d318b7016272da4ca67e7098dadab5ff400e1ef317b5ed80c8de02d160b1f4f6425660e41e1281bd1db301525e2f0fe7a688b23653f25db69238c31cd25cec22797e8988d5fe855955e5dc70f981b03a07509abe00203edad27322cf4f28c000de58d9f6707f0da8b6dca9f9921ac083cb2f7d930485b774ef57c6f1be5f9515daaef935d8db4131a95f0ff61040664759ed03be4969f10d51ac588a064796ebd646904df35a4a7c9438b66e5d3cca101b52d546b516132c603a7fa31128e80938e94747ab465011e02d47696056156578259b3332d3465a84c9e442c64cb6f7695fc62ae7e57a79f6076af001d56fcfd830fc8da7e7b21e25202e720dfa263ed270b4fe8f81f13b3c8dc6092803ffd5a339a15dfb9b7e00ab080638ce796065dae4bacc8a60dddf1c8904bfbd26eeff420932ab1837d3887e49149ef1128df4e8827f9bc2ca65edfdc1cb17a88763d51b68567de503d83f06abffab5f0dd5736613ac731e09b1ee47ffc41bd16e87e0971eb5dd4a46b6acabf67067feb25f6bbb5fe85c8664ea6a610997d2212282a71ef2f8d22f4a9458d6f10edbb74854644f2edc5fe22238e7b5a7eb447eed7bb219adc7647c559bc9ed65820e7319dbe48a482f831a8cc2efaaa3687ad1159a8aee17c99c19b0f2895a1a7308186b1d75d4758ad117eab109a8c4b77b03e309b607f8a781efa3c32083d88ad28f87429e957c954fbf842cbe17d1804ffa9fedbeca18091ce4753314d2676f73c1b571e83526f707fba15c9460936affa091712ba13f9573e1706cefad8ec9f3953dd2d91c3b5901b48a6915e9d21e92dc01ba84f334f691cfda96387e16405bf2668efbb2836244d0887ac91b5544109536f35128c0d27b94fcd878acc87db2c279cdd660c5bbd839e1b7375ee68382b579421ba8abd23b1a1e5b369f6a2800ecbeb6f08ccb0bc5d5dd49e71b4b83ef2312cf68dabd9dd7478847fabfc4e94e587d72d3a05bfb138ec65861b84ded5fc749c3c328bddc5a0581c34d74a066a3eefe2807023e33cb4ae20b2e9fb469da896546b1f97536c93b52f7b526c44a07968801121c3c5af5f37b8bd536489e6951b07fbcb6ab542ed1440cbc3df93b823865257e541c189770d700dee7d135130770976bc528dd90ae9d2aea2107e11dbcdbbbd314a817bba93e91d21916d5e193eeb6468fb47af8bca578c63ab6e6df0a33ec97c3a6fc6886fa663733e027d9dd7202d67c16d36de2a61fd8f1ceefd10ab5df54c8df72a7ef52a8989ff7d306ce44a6a2f5188ff708e647a8ac16a7f9a5a8bd918d1b1f7fcc8d7f7ac423806d4cabc8336080569e16ae16bfd457b361c156add77921abf805f412670a2cd61840f1910f2617d26bf546b7a4d259be114705d8adf4bbbf1a82cf8ae6d9d97f0e935c28c0b0a5a9658bf650df0ce46e0f20fe659b66af03ee2c660e8099f320572b35b5ce65f28395c1060af9ecc06b6532897d2937c61e7be900c7bbb24264fcf2c362bfacc5090180bd0c79d9b45e1b67ed48e0d0c8b9c9a2e6dd228d8ef004cf50551defe8e2b3ae657fe73b8aef37a674ed47977d7be14061773a909f6f77a922b66f9521b7b334448acc7908c5c3d66495e7f5ad0dcaa9b7bd8d243d875d6a82ae3e06393007fba256aefdf789c6e1066746531f168cc730d8a2b22fe0bff9b86511a9f8f4b9eac90a182e1ee249aea28cee179c3f308016f001a03e23a43e0c0270e825acd1e800cf8f7447795325802b67abec30bdbeaf2c335732f81521c6ade32a8aff55df8ecd9d3738f5ec2ee76d3775d7903b6845b5bf40d306198a2d90f3d8ed964fb6bc2bc9dfba001cb1217ae8df2507b3661eb32dc2e8f6b8618ad027581718c655d2129bd4953fec967479024f9d3f2ca0824d06443b6ffa8e25980813d02ec3a418a99c7f915c63c529920b2f08ddaefdbbabd030921ae8f9460e1d71df804d8ad519534676ff8a2787ef8de62e8c416810f616edb69f898b355aeedb0eb56cf2538949920bcf67a2d8b50fdcd7f2eec6c8565de36fa5e62a39a503b7237628c1d82204cc1975051f620f1a79cbb7bc002cf22f7a84d405bf9c17e56ee76a8ae0ad0b0e5a689869876f233525d184b4fe84f3131abfd6f033a4d71b69223a99371a6defa6c0e19dc04519e848b301dca81880922be650af6c9a0e2d0f9c8d5eae66702d16e9f8a8b42c1abb4a37d53ee62fc23315c2ed4854c6e3a4c71c0cdf2edb3b5214aa8492496e4e379326a8e2a112e17e401b52c5d26f7f06fb6c5f269dbff7e607cd2e636952dce38b4724cebf0a04fb15b92a2dcdde09de12522d3be55bcb6f57189d24fb1fec479b64ef0c2a5d5333fa631b892f5caab174971e24ecf7e0776b5479dde71ea8ec2943b1a4c853f7ad58e3cde0df2f8a098803dbeb9cdb5e85ad496c94159736599fad139c833618f198ffea3ac59fd06db85d0c98db4e6c2284be1c536dd1be16636abcfe424cdd88208017a0c9f6a5666c6f5931939932d4587c3121d61669acdf4256d2eddf6ff95a2dfe18d37a307b0aff68c0ab05d926924c54073bac5ea279fd861e6b35f6ccacd047adcb759a34fbd6e44c0bd8899d98f42d0b81dcc6809b62f6eca696998a802f9a64992d0a19a7bc73de9b5a69c3d33c633891eec9cfac3b4e43854c80ba3d149d4725eba9b37678bd7d43d5a21fabee9f93532a8e16144e352cf09ed4e44b45fb5d57f69e89d1d46b31eb8f5b3989d08826afd83edd3a6454adcfd3bd90128a5aae189812231e9625027bd1bd9ad3acc7f88e3f00ad884453d10a346247faad63434e172d0ac68792f9dbe3f0c9f3480311d6a8fd0c65b8d99d8a09ec906b74bd23e3bc16c5326f5b1df30d1b4e4f6ce57a715b5d8539868e1b359a82f4cda91056bdcff6dcc9162877ab9767b251e2143a45a0479d6d771c52f42e4dfa881206e5c698f4d8f243a00decc8fb7c5f7139593cbfe3de6753284ab00e752a047845d7e45e394017c06be99cea0034e3e0fce03dff5acf90e25d0c4f83210ca9a27534016bed9c9f533213a5439d6344f804d62faad4f850eb609fbbd37929e05a3f0504053675f2c59d91ed1cfb90ea81fa43fc0678e21038dc0bda46a6080f664b51d5753f5178dd536d5ebc41433d43852f8b5c6f14368f77599626d031a08f40205c032ebb9965fdafdf6d9804a5054ea3c4f3e1162cb9d990d5b91e2df99dc67a81f62c38bd23425d5775285c8a91fda68f15f571587eabb88149b983845887682c9860524ce1cb81b01d18d254ad3941d408d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cda857fba9c047bde9aeb41350769fc716c6109495d9652c459be980ea0ea83b0cec828fa88e7f35250c62af89a681d1ed62d37f2ff74bb8e6ea64d49bf7fe0936b26834b66ebed6255e755dcbfa34a6a3a4e5bf0b8c0df1bfd158fe08e979a7314230713b29aca9d2ec14a67f3b614e1ed46edc936052e0b997ed869babc11ce7e403cf9f87f2b512fd68110b31afd2483a955c2d3ac38bba864af5bb077f703ee009d54a503803ceda9926d8a4c739071e83c943e307fcabe498d3cfc35bac207d690ba54c2599efccce6d4e5c508b45c760aa3c24c73b75fafea641a8fcd774044cf9164362815b192f6fd520f3d0e97e538880c3ab4efe10a5f8787e0bf922bdd92806fc97c3fc09e5b3d6ba5811db8b84ea77885a3f306eb550dc0d2f1b11f0391fde406b65b8e618c1b7f0265603361c58893d7d16f25b5537d51c11432be5936604d7867179f6ef22e28b05a549c7435a1ea8bbd92b21ad34cb75587c57e41086e28991ee2683935dbd539f08958520799e93bd92c506e6cf26deadcb7d34d806de1e34e5a7d32cfab20f9986cfb9dc3c71c42b48a75328904e20b83a861e126e625d165de42ee18228899e27dfab9e2cff03ac04b94f9a00ac0320d058eae747d50fe05ec4deda7c878754f4ada38fcfb01ae8cde34465a6a64e8e95dce07e179ffc39f1322a407036d263f421e9d7b0edcf88ab0d78b00aa5cba992fa47006928ecca1c13593be69f32743024c49d541cec34a61f34a4b512401ace9b6994c2d7a73be950b4f267296e2fae9c7e0945a73793c701c0692e53768851a58c63ac16f43360d1838e7a3c503b78735d450af4794e159c6426fdd2359c2402f994ae4d9d5a887e0e36a8409e41968faa762b6d790c98d66804abf544fe4e98f85051e26859693f9c13789d21e80edaacc7307801765998132abf266d55d751d0bf1b3e1ed80bfd764d72bca1d9ea3aad5ea27fd7345fcbafc0c1cc7649c813cb0896c9877e779ee50b1e03e6bb3299f36309e9c4edb35582f03a4e288428c82f544aeb6af4b40c2f7505dbb737ecdec7ffeb1e90495b20d5e0b1164babff5745cabe0d90e2ca2d9cb4aeadddf522f17159d28603f26112efb8ae8ba76956a855937a95c2eec2eb76f0a1df219cdbba399b4589e58dcc151aa1b915036334a3a7d606edc6c3a32d035067db49d4202067eacd8ffdc5a5109cc35b1c2944a13082bceb7b640775da8dfd87071d47f80e4271f100143ff3eabe451b08dfb2a537306db0a9666340dc5a1f89cd679b6b6913553944f2a6be8dc84f8242ee5549a0f710ddde927e0d1ab2ddf694ed78811a22c12dc35fa00fe0020b17301ed7945320cdfa81b201e37cdf5f55c378874309b7db56e523d5edcbb39f623b36dd8f38f2cd90fc8c93cbea28ce2ec4d06fb81e1acb3b1305ef60362533ebcb00124038b73826b6e9ddcc4cd4520afebdd9e84292ba64b3cf9370099ef03b49421bb139b53645179086ee8a2c126fd9076ddc5b69d05a2f476b262c67fdd91bc5a3ea2436ed74874b37398d7837e8bd75d29b52e534a4ed361f8988c8834dab5150f1e280883b6ee098b63b00e8fa12d1b12d104f0fca576357a10308aa2060aecad05adb2d223418506c7d0b4e2f40e1b19b7cef8855d398ba77867199d9a1a3ba8f739105b241bb08643ce2900eaf6e7bec7d0cc8cccb9bf012fa497900d8f9c83417e93772fe9167a45eced81fc83fb628fdeff6b7a635a27b45d9711d6c789bc92d2aebebd1611636cc154bebf11e0b58e3e13b9fcc2e78b85169aab9c5e8dc559c9d4ba323f5bc216fff13f993d122831728bf0aa54e19d304414c5b4b1132e14e8a7c245d13026e2ed658d11721a2b1800ca983995d2ed348a87e8c66bb46742a39a9f6e5849024f0e041fce3d634ea08d7218f10225ec104e868d37eadc01618f1f89f25100d4b9f67f70161b87f3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f2544fe3e24b2b944b0747e103a4ae2759cb62c2afc535cc3f3686de0eebdd8a5d5ad596aeb7df5b3f6ec3c629f0bcc2b1b4f16490be5656fa1451c02050a3e85f7013455b580cb961ff97d6d19cef16f3167c55a82838a03d7cb109014ade4e7d26718674a6242d574c2c799703b5a2a2426bfc727d4d568dd22d3f4e44dd2b4af088c0871cc63583d70a54e6bf90e423db38ef6c3814d84fb71ed943d930fd2d60c18a0f4663507c22a9cf4d3b115a1c437b9511d31fa40 MD = 2529d5d0f4625ae701397a41b5184bbd45b840c3fee6652a467ff1a49c622604991157b16393136cd123a515e4a0412dd2bf2b3227dffb652e11a6304523c31d Len = 70720 Msg = de4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f944a23a10a0e6a65d3cc52aad01998b3897745dd3cefb85663d78f69f292abee8a8e0469705c6d565677e5722ae725da79e69640b3f595a1a837c5e022aa6c850e3d6691bb40b147f9b595c4e763ba001202b45f5dd7043d4f838e350aae6c7183ead2a04735e6993227ec298209c5c3066e188f76fe9477ce2d10cf27192c328018d11bb0b67de8a4216116a763c9a1bb8b4b67bbf6b6efa8a72614e4751c468749da7a644cd7a4a4449cf2b3ec462aa5dcc56e8939fc13638416bcdf4cbd3c0de06732ee53845bc703e864241dbbac59f50f0a6b42d47183466b1d73fa9f71889effebbb85248c80d1ebd19472aac54c4690d1deabc0989c50abcd5f1933958bb81ceb683c08a576510fd1718593f3f153e34b5fcf40d6f3455122dd2309f68bde46d850f2d134fbe3dcda47b0f7b6edaf8edd6b47f5db4ca6e3d49aa293430d73f6392243fec9a61cdb52839f469ca5bbec0e8d802013ecc7ec58f4125fd9850ba3644899e1c1e96e73d0b1ab11039dfb936533128fff785ac30695fcd0489727f700208f3abc5a4b3eeb6e6ee79a4b010d67f879661c53c21083ecbc950e983b3983667e6a275d55a4f8f6552aaf414ec28d4a2f72f923804d4764ec0e9a2cc8137476f1e08186f04e9ff5f86ad0f5475b5bb49f16f45c27e1d79b05bd89a950fd49de844e595bbd8426f9b328adfb8d2049a462c2bc622b76aaeb94124bb2685f7a09aff42d401ffe445e2fd474b872c9eda5f516afda0d6437f301ad5ebc60c29b84df826bd89a157ebfc8fee3a0baa09e45d0835d284043053df90f414beccf04dc8d799389ae421c7b19186968a75cf1f07f8932d1568ba938c49871d57ecd7c7d443a32d7df3cc43c9ab18464db477f227ca8cf69c2b68a500ed99eed694638e39e44d847bf4e0c50b84ab329c908ac7832628156174c3f203252f6f86ee1e0abf639e25da10e3b740c54742bf318f05e5b27072ac6c52e25d995388ae1f8fa32d689ff8e26e5f803015f45efdbe0e1313196bf5c53a9dded5f00c2195523ec24d9a56e6dd37db88a31dbb6e9f60905bd5012187f3082c4c34d2632284adb4cde5a2cdd51192e0376185a35aed3e9c44f5139b0e80fb889542e95e73c358782ebe270caec7a8f5f531f4b50a2f81ba3639f6e073b23d3822c7da08fc9a7c124ba0d2195a47a0a22add12f866ad5072996b52f89fd2f6c45a8b5066a651410b8e534bfec0d9a36f3e2b887457afd44dd651d1ec79274db5a455f182572fceea5e9e39c3c7c5d9e599e4fe31c37c34d253b419c3e8fb6b916aef6563f87d4c37224a456e5952698ba3d01b38945d998a795bd285d69478e3131f55117284e27b441f16095dca7ce9c5b68890b09a2bfbb010a53b2a3b9b3007ae6995ab89b93c2be5559bba733988655fed41017b11af619939eccc38fc02ad6448f68dd7f8053f64a92d5a96c9efed94f0546d47742ef2bf38a0a3d3c4e06f089b3cffb5c85be864bbc6247a53a6c31b3cd0de487bfecd4a475f99541b53b464096fe86a51c88eac326e0069003651bc77bd3bc44fa958021032950228e2e53e3b98323fbad39905b72dd6a9f826fd414a236c0417b7fdaf3b2080271415685fd8bfc47c2c057137f20c8e8362fe31705c0b5850fcae2318703240090674a68f89ea8669cee47e0a8a12113f66475413567ce9f026183106566fbef027880795f623604dc9fa2946284845252e88cef0df7f062bbc7c914195dfe2269fd8f43bc6713a7244cfd8b273b4137ddf4906d0a01b974ae763aa91d68a95f295ecd347a2ddfc1e68e9f4171460638ea413667a40588595ce54e4bec179bd9b314d0d82316d8e9a5dd2e63db2541ea1a36c55b8683eb6549ad7a78ffdb3436a9d820bb41c2bd82e4a1215ecf6972afe04df3b50c0d613cf72745bcd334010a7fe1334a50a1fc321572fe8ec873071edf0f1810bef27844e7fb468400a290b9a7f89ef1ca45035bdaeb3c9040f2adab68f2c8db19e39f218e81e37b02b751b8a456ba6e392c6174874261ffe338a4ca00817c80a74154376d63b2ee53d2c2ac17b41c0c07b89520bd40e51a09d5ab1f4843a9add1ac261b07191b6a6e9571f854794a57c07a2cc4ef4f5c9b3f5a2f0fb2a1e6cf43748320ee0aa38bdd7fce11fd1eabcdfdf186f59fc62eefee268f1fa234aa41574b0a0d74c0e1af0ae265ad742ce6fb0abf3227315de284b0db69c3c9646ac0979019255dc43c60816da71f4c2c525b9123bcce567f0df601e93d908ac9bea98ed43efceb9d3a2cdb9220ec0785947c0bdf957f819207b06bc0890a58cd0c889797fa18b0a4618063c0519818d113b8e5435aaf153f664058f1ba95c606daca6c4bc8fd4f8228e7d4a8c7b8029756aeb7ef5ad1b3ffb032540d60c754dfb00b57702a1f1abf16ef889bd1a05720e3c9ee34348bd02b6be2e7741a1387d012b7f3959bf294a3a1f40a1a2df5793631a712c26631ec7affee7db6351ec180795ccb3cad1c5fe86091d3b43b2c0b2fd6a2a01a7e687b46f2c19154402db4595a6648c5cbf0dee5c9456ffa67c86f862959209ccb940f17dae8ccdec9d4b2d34c60e6d187149434428b594d523f28c1c0471ed9fc591a761ee08aa640b85f86b5d94fe04d0c124c62d00a3d8914c96b31e8f5528f0c2fea4525554b332d1cdc3d3bce62bc2bdba6b0b00d3b5acdc40ad4ab3e76e231a1dcd443a74e1fc76d4c3904fce9230842cba2a7dcd765ee9b094f2a74e7947e22d642b81b2f750be37f3fc145d43035fa33cf33f38238ebd0eef7d313051426355f26ff0b5fc15ef1bdb80d53c4521964777cc0dbdc2249e8347531a36fffee2befe775026f83552aa04825812a074713ff51eb0045d07d53723dc29078a61aa8f10ad68acf3972f0cf56c66885ce337b43e52f1b4fb21aa510b7f284cfa5502f1b07802f0f623ce6936a4c746825532cdd8ce9675a55964f987a7ddac57c1310c6740e49908c176e8509443f31ab4a8b34dfc67f162974d5920b912d0aa8c8007bc6ed750325971b1caa2a2372ae7e28d25432ecd3ac3ab965d1e8d5ffba0370b3868a3bd7bd305ed2c38abbcbcd62884e60ab1b435c6c7dbc73e170250e49e3f61971087eb177bc4ffbd2727d769c2c01abbb94c5c86e94ee4817761b340fcccc263e6578a0e1b5dc999df238488f76848bd0e3db6ec59173f5077232b9c9bd9e035ecd4619e2ce115339856ca1b10a5f97878304be05e5f5d11ddf0c0e0c18f4573eba777b0f87768f51d68b10a559eb454bfcd244b414ec82e72727bf5b7167887ac77d42dc5484c463502413d0e7c01b9aabb48134b0b070dfe4e63c1c59501d7f4ed81fbdc7c488ea7cc839c8366680f03a3bf22c1bfa218492f812d323469cd8eb18504853ae5363c6d7e10fc8572be902c925eee9121b51abbdb21481d36cf416ae82e07aaa9a4bc8e3a7fc000a62e1affc8b119aa0d4e3a9a7c864d75f347d4c0b363acf51e41efd6c0d318008dc768c369028931ee4a727569428a67259c105ded8aba43cc759cee17f24cadadf244217e38874f4a1188f4ab3f47185636bde69e8b7abb3aa98d7d47c6a42e911574c10e3d5b2cab0b44be4b63ccb30d7da306ce4e3486f043882c593567acbe9ac14a21f84def98a0707c5198605ed3d9896386ba30cb76ad56a35429df4ebee7f365bf51a5c19a38d2d5c3c54c412fb238a5cdb9b5b3554dbf894089523d1766d2b9f130aac9383b3472abd2d986a9707975ac330c66148d8a86263d09a0547d25efbe7da530fa115cfa10a64c52c97b127b2a0e7e0b3bd481440d2c4ca0fa96b6ae2f20de1d68221216fb2bf0d0183bcb5e4f3351cb52896a68fd40636593184b9f4b029db90bd6206e73480c251d196ec6238acdcde2160e9dfe609516a76bad691a092a2b6a964da980e5e77c607bc15daffb3c3a72e2358919742bdcbcf7a4b5a41ecc9c0dc860702aebcafb6aca8ec8fa6fe4398b55a6d455656dde5c23f82bf22acd347dd6226a7a40fdcac26f9bb20ccc0ff3b4d72b27bb19a3450e5970720b13731a41265b4077cdc812f0d0b0c1eefc038f75d08a2a517915385b01d533f7c30777e122d2992a7a73fb7d57979da7e5083656a88c84216d0be0c981ef15bf20d072e630511e993045acf06b17ef3f716810e0c7f9dd33decc64e24286c16a141834d7ba9e77ced5874ed173f75fbf8769449a9699df8db2a1ed2eac62de008625e53c27824bd1528208a9d900942e0e55fb0d7b343039d3d2a334284a158a5d41ab9edfc542a8907b03ff04fa3794f0725cbfdf91783f27a7ad7c1c080e0e83b2b1834a2f055d76bd665b5cadeffa1409903a2b7960a59867348ef1627097dfc01d76d0883cf8eb8f5a4549e065676261be06c5b48f750d5c5ff31021e42a59b518fcd9978f7fd9380746335d41e3c2c40fa9170aafb76dcc5732df0d11d1d9d7c99fcd25a4fc270194e582ea2a761c78abad87436571a20043d3c8eda093477059e614fa2676bd322aab9e50c82958c6b99a7f265bad93404c5e328a38798bc6ef5916debbf68313f01ff056c4035ef661f6667c397228d49a5c85ad82898e21b4813b990b8361eb0fc9dec6c60c1650cd4ba40da6c949035455281c25cd36cbd0e5ecf2bf253f04ae31d167754d691c2220a1a14bb8de16a3cf85a0ca4d6c0b6a0e8fb37fe405a4f6e032007acd3da18bfec400d04acf55ae54030019101928aa828ea2f2c99b140f5d675a7c957c282e6c77f1dc8404089e6b0a06b91e236bb9cb4f88c1dbe99c2030da3d24ab0cf933f2223e177066779a9d0278537f741cbf713c2c9423d78351e2f1701a19d75cc3182bad2b15dbeacb70531f8e3cf283e3fabb5811a74e13ccfa16bd05e7c3990667fb07bd7b4ca8586e66c3135b87e74ef036d2e3713492b600b0ea8e1bbaf72366fa1378aba2fa6a1fa12c89e71a9228da1463b08973493a7c27c05cbfa3bf429e909b01acc328290a6d2199e592ca9841bdd321f5f1807df7e20718da653a8d9526650386997abcb7336beb5fd9d8c6ac99eaddbf987faaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b MD = c8b144ba9b9a8ae0ff3cf8a6444cf9291cb72feb3d8402237d2598a57d0d8389b198f67b5203576fa8f878ef2728644f706421fbc3db966b967cad4990a49480 Len = 71512 Msg = 8a46ea29d6c39408e4d4eba3705a1a0c9415b712317245b790a4fde549f6ce5c6460a2efbf58e3f0afea3de9ea0ba68ca52b9cedf909aeef8bcb3efc6c4e85fa3ebbd87a995b2932adacd0ad28b48c415a95c44296621375dc3104c7b6711a3f607e14322b736eb623402b58f0fcd212fa7cb777d1247b31cbfdd6adef08941511d2de7f3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f5f1a253b8576eba269c06a4c30591144cc3e7808cd8bde337a3ed559213e3c33ab9c6efc7318b91a59e7120112b30655c2e4f44ecc1e7a61e80a2d1d775a8d53140738796cdd5d504f3a74c507132c15e837a53528d8e071f1477453b5ff82c6c2e5ea7b16cebf8c7442f960b7806ace67c1f4858ac1f8abbc7c11c4823503d6dcbdeeca19f2c816ef860999cb02a8c6660a470599e2ab5672316e388705f8c98a18ab2e1e525e35e98e0d39eba1ce470e98077efe42dfbc3aeff2776c7649e8f67d896fcdf46a338ae36b09be66c59786f59db960e97d233d3c0548d891de7b4574f054cde2d556f90c8dceed5873fef7a96f7b68e06ed4a3a30f74735d9fcaa28548a7c72485e75f91d9531f7fc1c6893ae78fbe2e981793a978c4e6e2751c3339f92e62c0642de3fbb95ffde4973563326cbc09dbe53435d8a9fdd92846bb20176bb247c05972aed194b92f8ede95ae1965c9f1f03c72b2b708eaf338fced92a807fa1d2b4bfce79bd22a5c857c2c91753c7f2074841a32cefe52dd197dfbb17233d08d0a2415b7e2da7a2cd25b4335d058a63b6fa774dca6f4fc3fd3b32da4ff58fa3f64cb03462c1671497c6121c2b12106edea8cc8d9c650b1bf6f84ca94d7df41da41280ebb04edd6588b78105fa1ff66dbeb1b5e51b67b3908f4da1ca8802e6d07aa23803fefc7730408875634275a8fb07d3c7d6bffde5cc06a9c690984af466da5a49ff9770c0ef2fa763c6acb9a4a12a5d76f4f28e0e290d9b2fade6bc993b53d93b512232570cd692d0a2915275daa6dd47a26b9e8921f4a031750bbe31e8677d808b17b78613b5e9308988e6a901fdc1be7183b603516c4790787fe67ad895d5be0ff086ea9e4df927ee0bdc9ad19fa95fe4c35af931c50fb14aabbbc0965f605872451700f72f711b3282aad7a42d02806eb2f3d74daf57284e17b4afac34abc4447dfe45c8aabf9f0995e7fc13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a548bbc23d0d0844b6de1caadab02e21b1baa445f51e28e6c6cbfe0c9fa2953889d85ced8e9bd66f71f8f1cb9cfc94175a1977fb46cc3771047daac82ea770ef9138caf09a3bafbb0bb41d25f2cbae30dc2d6b8d46b0e45f54368142c6d3138c2732aed34734bbafecdb49c0c567a4f39fbe2902db11583a20bd2b814d6fa697b28cb09c7fd021d37c351ca5fb169fe90c945862ef39bb89cfdb518dadc353999a0f775529550aaf24893fdb7e21c7988976a1b6696e34d5c9589b6fcc1740194683ac052d0c9dcc4aa1596a34d0438a7f2eac0531f9eba575fcb02e94b3959f20b0f6b5733d03b15843135b076a3c47578220572f2209813d8e39d2ebde7bb38f5dfe6ce23063e6b43815b5de39d955773ba6b44b30b6f188d8dd64bbe21adefb546c32642ce6f4c8470680a083433e4921e5256d6d197ebfa045ebeb0599a7cc5be70fe07bb462fa3a8fc53791a18a33fb86b17d1f5baf48af186f639020976b3b170c3f63f4b8b4d8578b8aab1cbf9f933061638fa30d8ccdfff90bcbd9343ebca530672dcf7f5de807da8118dc67f4af8c3c07051a1ff3c1a28fcbfdea09aea5398441206c3e5c3346ba042208099a18414a51c8e86de655a83c8b6f7b9b24c07a0eb586f47d1b81bd34fb0fc82ef996f8932a22347fcb4fba05336ab57406d311d8aca58ec40199134f4e28465d79f05920785926de0b787ff4ab34bf1bbda7a5ea0cc7639c7645f114e6b5a71e82f00bf825b6e8110f98a010db15c218b204df4abf329a8ce24bff89a9fe16f97c5cb72317819fa03e77c461ab57e6f44cb16702ab2e5c1dae74e4b8804ab977cffd04aa38027614ffdc94f004415236f278e41aba05d1d5408849a953e3b81fe39b9b946e8193f3bc91b7c4cc1a2f660e1fff98d3fd203f014fd5630b0f3c7a20fe23e9a3451ec8dc5cd6e5ed2ba40c076f5f86dd6072e0599131ee8e176d0eefed45b1be974018c706995c4dbcdab14530acebc274ee42b1150452c6437266b631a9f5a7bf206de457a730d614f9dc302a90d06982bdec6fa4f7979ada7407de92f6bd4605e84e9d16a9696e7d28163024b13cbad10666fd06b2c6f1269a7bd0d8d50f83b0bd44590d4610ff3d8fe6ade8b7379dabf239c103dce7b56d0d49f3cbedf5460ac9d68102272c709d57d40f3c4bcafa56a9ec25621d00cdf8f4f9ae33e7767759348c7bbef4c5a9e5a868bee915fbb91b52078fed1f1b210f78136bd76a9afee626eeb00954e4925da92b22b7bcd4c2421512696a873f99f9c12091801f6ac3f9c68588aaef8f134d83a4a36de95dfd131b961aa200751d00f6a888f6adedaeda3cd86c6b6ed114fc5d5caad5439d53d68c1b0a5d30c4956a3f31b701be2ca8d0b16fc21279af7db360d99db5739caad29027a163bf34e980c5458869f72d97244dd3f368b73336bab4a5e6d62062ec504d44477b56cd018ab06b62f502fa651f378b6835d16427598048eb00f3f8ff98eef9646f9d98c5d0282cad6f879bf806981f88416e4a39d8ec4816fa9365cdf299ce60053b9c1e99540ed29d2d163a249718ba5337ee527e222fce8eaab13ca6774ca306d9e1f22f5c9b37479d7511c05dfd6835d4575b9447847a82dde536fbaffa95391e702bd8695b45377fc067211156f9adec8d3d6286d0849fd607a23a69619f68b350afdda3d564347afd2390dcacd5842799de30059a53ad3d2267accf0727593f8968863191fd0536362d55e68564822f822846ec6a4f74b93b6f96067697d56b243c1a3b1776735c726db8566c0d6ea95002eb64c8e0bbf35ca143393655a4df2815e3ebf0394694bacb0154e63b11400c5369953d6e4c938ce5fa8ecdcb8e429dda2767a3ac4685152f770a7d53349abd0506a65061ed40d423022dc55f5b3c8c732fd7b8393ad88b81639eb8be9d5f6bff0bbf8a2167a23a43a43fa67bd277fcc74364b747ec3424a90d381fe415381e29c00a72168262c92e28ecf686bd98f5c0aa36293d2242e98fbd013b2d63cddf6b6cac90a9052886cad65b3fe8e24a7f45ae749685a5aae11bbb20930251c5b5ad58d06c40ba9b7b00f5b508080933a33f954684863d1314364ebeb0c9a5c8a9d7cd9c8f456764afb9cf21da50fcfb6894a8d57da8b1258bc6c00318ec2880c2d11138801ed52b2adbaac83c27824bd72d2f490853cb894db4571655d1a29208836ccdc735cc97f54fcfd2b6f562cbf6f272caaeef51e762e95c20efe2dba983d62883edf0145017fe8666d0236522cfcbb87ef5e40ce6d34c16486c859a6b3cb08c8179b974ff98cf17ac131753f86aa14b90689bc42fa7c4cfb75624a9803afbdff0f3f7b54c81a9c9cd063af4f7cd5a71268c7a416ae63bcd943426ce91859d6af7e3119fded976e5f132f40fc502e07369ebea4a3e99985a088ff3d246268075bfd271fa5ea81db33f1dae6e0a111999800c54a953c7c3bc3beef37c46248a4770487e8e73f6867be051ced76f00ef2a93771e245278a33b54d98e963a87a52a31cba023c6cc9985fc56be139bd94970ccb5b284e3b422217cd82ce6c958b8642ae53f80fe313e18bab2e4ea38a40eb1514d7690ad8427b4da7435369c9eaa3e841dc36ec42e5d7e42efaa23eb6728364ac7d41259ef9b3e9734114c5a61650067fb95b5c0cadefdbd9477885e2c7e47e0ac33d08efe6405daa128f0aca9d0f2fa081b1d990da9de532ab2df39faf82b3a82fa94f5b86b52cc41e2ec3a7fd35c66cbbe6ef8ffa6692b38c5f123da7e2c82d493243625986c949fa807abea5685d2cde66f84a9bee56e461786c5d2f890dd276548f84dd49d5c40e008a8f341b66794fce9e612d79c43dd1066c7ed4ea07505d8cae339052b49aef4b8d8a17c374daa66a4c542dad4d3841858d03069a472f55471a0f0145f85704adfe4fcf050ab978e68ca42b0d645c3972588a52fe4fc804104d77aea81380e4c45730c8349a9e1dafd9d193feac222f595995389a7392c074c2fe06dd9891060b12eda1e697112b42ae5cf7157722a9a70a8425f3754840e11512987aea1fff0ecbc6daaf928b183b84a6d2d677c62ef7e607b9ada730dbf1ae55d1f4aa86363bfc7cd0d41f947af7076fa5a6009525a87660520d9bf51803192851df3c5c221eff40331890a5ba0170e7ee28b4083445265e8db7c5fd7ba1c00a768f220a69247ed16fc198375bd78bd02ac304a7c16a8032db20a7b27d6a4d8ceea8fe2961e8e5a0e58388d1e705a298ca0974ec53651e8db8ccd3dca3a91c2ff8a11331b2d8be2f42c3050dc2184fa27a60775e70e15bdfa530bcb4750ab654430c23abc27072ecf6047f33a36bfd9d8a6cae76904bc2a93ee0d4d267fba6aa4c4e8200174cae6a7dbc69ebd18d36ea98826cbd3820dd6ac451becf02e8578282fcc0c727c9cb18487f57bef2f8860a1346449aeefd16a50407ccf2cc7d538d657b62798a745376f4b1baf57e3a657c893cb8b81b3d08d84c77a2062b17252b825ed99fa5e8c216f0f81657d9df4fd278ba5b6d436d2e852c25b041a54246dd681bb8920073b178dbb70c3eac33bf7c50538f530df9f23c11968a5dd18b3313654661f930c18c0d0382ef125bf43f0abeace6e1b18fee5d9b4e92b3265e648e2843785dad3ecc5406c0318b6f7d48edf20ad491f49b9d6a37b26bea2a38657e2fb76e07dc67ecde540396026d5b6796b911dafc4d8969f26576684b43a5b093c9f6b5b054b9881c89c17f0fcbfb05a562368c8912e5ee86b2ef3a8f0922d03fa5a5e1bf9cc0089f069e4f1c01f8cd9a9c0d5bb0eb3d85878ea1350de13c4f02413964be1b07f8c658de98afb5c109d6b4fabb1c3cfce9857710fa50726e876c0b25c11465fdd3330f26ee434de054fa4b833d139eb065010ad2fcef231603dd81ef895ae41e225587eba26f30d32965de3b544f76d4a27a984baf3279ef5ee7341b200a4be560ae51b1779c051611b9db8783185bf60c52ce0fa3e2fd36f319a02d17aad3e008ce0b0cb05241258866c1fc6c16c4710d3a0a835d5913a96ad54499f2a5329a95150251ff1a6b8e07ed200e51b336f24f90ec4b4e0d539310ba9fe62391de719013d625b66cfabc1abd8431e69629e62de7d1bbf88843a0af2a10a63cf93e01845af4ec78b2553c3b685d0b9d0823b942bf5979df425a4e70b4553ea123e7c6ec5afd3ab893219ae47e28ffe7a1ab080877f1f984e40df91fe9cc23f2da524e22844d84e877e634905f568358fb264ef9b219cf6bb5d53d072ae3fa946513e3e167746f9ae8f9a5d99c844a536d2bfa80fe5f4006505686b1084b37186c83448394f03f426ef27b2aa630997980329758ad310fe74bf862c7f2504e014946cc936d4f88716267010e1cca153ddcc0a1cb4f2d838101415d967991c3c193c5088b80e0dfaa6badf3fe60df2212cb6ca66364a34f55f8b7d3b72e9e1cdbc49464f65062b940035db06602ee649ad48d11bb8e30d7f8cac261a461c3ddd2642b8e4e5c3389e491fcb2ff83564128a0a8803e1c6491cbdff783e8b3a17b27eaf0d10e14d1d60acfe1980552c53c6e88455e55afad2151b0ddc6eea4c5695ed19ad9b01adc3224f5c2cc2201a9dabf23fa18bca878eb2cd5db8740a59e4ce9b07004decea112c5ac06cbc00082909cdc2d5bbda76673afb7775169569a8a5af016eee4b0ceec5f6b341389efddf2aa495573e32ce44f7cfe47c1d30858a62518f5f45c51c44374bbc13fca101a7559d4191dc79970c2f6f2b345085b3724cab3a3b1b0320fac880634ad2b21c69d1e04de95c58d9a92b03d404793cfd48ace2896a38ac23f8c1bd304e8079570de79641c988769d0233b468565efd6bf4ca21055464692a266a2cac88ce9db97bdfe7a698267ceaff8ea96e91c96f045fee8e346167e23f6c0af25e5e86c74b9c01fa02beff11c988860c6e1c803ad06f6051a0fa08be69b2ea3ace396e9e145694f8e0a3dbde41856102f0614b07d70d6793d18510a6b1e0532a858250cb1c92e208c5af828a5ade68b57dc7f47e22224d7c4e6c48411dde8bea0a9ff2f56b3931533b4abbbe1c7ce34d9cb64146b89458339f157538b894daa3e5fa1cc50a31ca01c9dc4f2290451af1d696fc08a14dd1e14cea623287ea8a7d9ff998e20064f539f8cd075dbd2254cab2d0eb6be63300addd51d6d894c9e29fbf062df655b8fa234e85a918acfbdb00b8cad7188e302cc0dbb498d2e6172932cd88a2a6111720e8556cfdfa63b9f5ba70ed87b6a12b9e41ce7a71c785bea85d52e7c09c3d68b0b095eacdacec42eb2063a1c5ee280b9f593c0b295f7aa4a749d58a4f80e193f2a29568dfd54f80055c184f576829ba7530afcf8843ccb36d1ddedb17f9037f2ee7dd4cfc1e925a8a93175d06cbaf1f68edae2e561b83d14402f541dfb0ad16aca6f500ec2fbfb7c4f0e9359abfbf22c2b9c2905a8ea8e87220a324714de63fb30866ea77afdd81f998153ddbee63abc9bb715d5d4541df409e6fec9377b7e28d35b6746547f59f72b623df91fda2a2c71c46fd27e8599ef6a5e2020ed626e8805470057d9e0ef977709c82839785ef0203c6d8801ef50ddc5c82cca9133e37d58e1904885d30774fee078d7a62127bc3997b56308f1f143aecdab32ed604b8d40a3bdb4f2b63014459ec6a3e06532c5105ece0fee4de9b577c6f2063c68253c4f15df197b1b07f9cd9d380972c50ebf670a1dcb3c53b8a7c35cb79128cbff1ef6a08ae2b961ed9a09545374d7c10a1f80223b417d93cc9f13f752701d0c3789b9ec37ad283b6f798b6c9f7279d9b34a0e2f9cef2c9ec40fec1f593f93997d211b416bd53207fc1cc63e828ee38f98e3639ab940c3c50d8ebe3d424c16f42e599d589df7714812083c529326af43395022ec26c2ddb7277ffcf9941231bcc9b7a29a5480608c4fa0704147e637a4f334beac5c01c4e590683aacc54e5e53edafed7f161c8a351399e473172a171584f5b953cf7a23c0d6ebf9ff5c4d0749f8c6b08f690848e2fc391b60977eb8253d07856af79874e9795fbd39df9ac71f7980ae33a3e04706682287b23f60b554aa0eb55a7ae932bfe657f714b5b41834ee6239147d40ef2ff5caabb0755c79144a6fcbbacfe8d7b4ac5929f88525653ad5efe39a5b86bbc013b61a13efee8de4acaf2b044d13fe8839c7e85db46b5881be8e204da54e375740693524f5736e663f4175bf98f6f18b2d4894dcc9f24cba16c191a700f3dc560a589f9c2ca784e970cb1e552a0e6b3df54fc1ce3c56cc446d2e9a2ef504356ceff8bbc20bd78c1eefa0975d76c6c6210041f1da920551a12029bc4dd81bbcdc5fee0c3f09afce571a66734115cc9cd4fcc3975a518a6760de476aac4096ed54e89d237bac8cd6227f9124a87d6c49ba394944f6016297f4061c4792b5024147088a74007afb3e119d954dec1432674154476d16080a4deb25fcb5c9bbea43233e4a8055db7750a4d2f7318480cb702abc428232fc0e03a6bc7d5799bbbb8d89f831daf4748dd84cde4b821a3973fea6ffcf26e553ca53c748228f8b3af26aebd4e4e654acab1f8a1de6b215a4e86d769d51bda585eba8cd4770c026b02b75b942d8250f0a5ba0dcf07d43ff698536fa035ed8ec28de9d1938dcbbf4c1c33882c090398c041c06c61463ba4fedc705a1c06aeb31a30f8b3baaeac56dd6562dc8ec8176442078bbc5e82e778fa84a341e52ea770e9b1b0dc50c1f6efa6460c00c15407dcff5de2a6cfa521e273f7b5cc049720eeb677d9f15dadf2b43025f89bcd931b2a7eac8ed2bb96310af09d6ea28027605409ea3b9dea5ce8cb026bef56bb6f9a73475d58e72a3d5f19f9de956c61c8b1cb6a729d86fdb51f5ca581b9d992cfcee2e3d6058e2582f3371622f4d1af61597b6277c954a1a0e1909fcd1ecb5a9afd9cd981606eb24d348bd0d1517a73d9a18b786185b0db05748e7ab9e6d41cba70ccb1c53030dc866b3eae53750eb51ad12435989a42b5cc217fbdacd89ddf166f98f4093c7ba815e077391028367b0b316d2084d0b136de308bf10ebdceab96412829b74df820e2db5ff771319acf94098fc18eeea56621e9d99d465d0f882230a5d8362b4e4bd6a41e72dc5ae1b89da0b1a01cbec84e7e949249be80067fa282378aee9e2631d782db32ba69b43f0e3ffc469806bff5dd78dd7eddee5e97fe8005c5476e28dbcebfbfbd7427ba6acf2e983a688f356427dee3c20b6ebdd91e723814a962fb50a4a1f19d705c9c43c9b5ac04f621d0a1420ecca0b0cacc4beba0f7fc7c4448983f71995a18d001d2e21c602da88438b61850bf9d34c832f74b516b0728dab6bc8976e17ad34a921e03aadd3ce87f16aa90ece443003197e527cfbcbc15edeec369faef870894f72f15a84bb91ddb1286912964197acca51c686011a3ab4497b5c643eb092174d70dfe5ed22cae60d351055167a70b6302a4f44d924553a95a9b8a9afe8685b3dac1a814981e05d60213d3aa14761bbc5685b5de692973e2df7c9c4750889c19a952f912c817890546d5e37d940d13a14ac7925abbd875b8cd60e4920896ce6decc8db9f889da2b5489e1d110ff459d88573720bb3d8bff3cd4f4ac34e3983794a2b3505003ab8adb07669b0acb45729b0913f3776b3bb5b8652b6214cf723036c84ee8a5a7533b62565afa093d4745e7327e0272ff0cfb7a17010f5275b16d4fadaf077bbd67c984f74d72aeddc173d753f3d23041865d1c5b240870aeac4b49b3622144de6f91bd7aac996e255aa905fe03e721db2e46f9b1e2e1f1b2e966af79f6ca8382c130665106d2c99c6941dd813cb5ea346b45acabfc30582aef2c0b71db67da4313223a0acab343bb73dad89dfcc2dbe5d3d5afb9ae58068f2417c83b8e8d9b87bbf3831886cf5efb00d071a4c2928957ee637d6b97ddaf583ec670279eb059c94200ebfac96b8de3a6cf53262ca97513119b80223745950e85949dd67a5497904bf6df31e13c52fdcc23d792a97c219fe3ea628e0b046a2a9f2eabc8bffec7751031d75e8c9640b1f77a899ab79f0166ebbc9eff91be9124f1e1145ebe138bd0553e5ec12a2dd9a8af3fe37ed566b7008f9e900759c89c96144882391347374a7198e01a2857703a59e07fef918794e5460ce025c1a6fee67ce15fc85dee6c3c0bce15ba2597b6ff8e18a93d6a563d8db593f9eb67fe4aae9238179cdc9d9d3d7a4a3a3190831050c2251a18ce77138244a067c8cb22e2570ab934173db93cb74399f801079e1ee68ca22ce24c4ea93b89ce943e59b958683ce15fd7ffe5ed420e29c9b8e94d3519442c6c2a52618141db8b19cca2263f6abf4cd54f7198016610a619b9b414f5719f1052617f441e0dd04262e422fde9c6f8585efe51442b8c216b7293f689c287e3ea6a28316ae2280ea0fa255aa50a157e9037550d7ece3c86f66ed83f103eb4b9373ddf073a7008cd1359f0b7bff2ceb88108f4149c6befd7d368e6ec4ccc90957328066f573a28b2161ce6d8a3466b4cb73e5bf541872e8a8efb509ca3fe93ff1ac32ed835c31044159d682bf36763918f61ed2df2926115958095be9a37475cba99c8e05a8d5809be56153034f8502d85fe282d3420301f63a336c0a4291334cf1665064a0b58696cf14e63cc5bb987477dbd816ab313fe95dda4416626902dc4b373c868cfa9e9ade994554e13f825206afdb91acd7539889a7ecf34c2369e380b75854b4cb500fd9987831eb3a48dcd406942c8d1dc66d86416b8b48e8f1c9598faeb65f51255e89b885bd2bd37379a88909d0952c1fce1b52c9c49de020f79b674695d7b4a4edb6a276dee8338a904bdf44630d2ce625127f0e88953281d311e626d7621b562527fe537e6c81158b86b14dce3d45a4d9317243be760799c682b5586649aec16ea6732284fde69dd11fa72afa6d9ddf5241d3704e8986f239b57ce428d4976f31f9a9edd8e48aa9cade68e5cee55f22f809499b1f16d8139273e2d0074afbe8d4e949bb626994c1de8d9d8631ecb1f233537dce1b6524843b848f26eaf505b2c13efb950ad32d6d75f2ed130dccbbd96be5171029bd93ce9ab02ceeb81bda575ec06682b86c7c36f7d7019649cba65e0888be6a31684d7819bf612e5b05a55f1537338a547aaaa3cc028016cd329a0a72041ae21cac790a1e78d5f0bafb8c504d6a09b5c646de3d5c3b139c8149be631121d483d0d23f0c13a4313bbd44b7b46d22910cf618418a104c622f4d573bf34ea794523621c8075f0b1c184c2a4f12df277396cc38fb144efc14d719a639428f5d015936e33c836a753f8d4ff37cf30a41565b31ed33637f12d29ccd7cdfd63d0cc49fb95ec3069caa41a5aee865de5638e2640b8011fd0c57438751225539c17c852ca5dc831a5d71cc655151335b2bd3c0b84439be6c5b93109f8de0c4f38175eb09e4a3a746159485d721760df2f1db985fc2606238d68de0ed69fd548ae7bf9e3d5cfb55132cd91602049e1c2c101911626f3d24e7e40f5c77cec32c885a2147d0f72eb5070a0927eee3138890f052d4c831182d03ecdf2c47a278757541658ecb9b83f1ac17ec5fa4a71b78a7fa518999f238a51458c6f765cf6556d706511a3532412e8abc49672b36ff14f794ddd7de99e6b3a08f8c65d73bd2f83810ae9416a3b197275fe9e68b7a07860a27bd669e0e6a7f31f9f91fa7d006821fc743a376d61b510d6a9585cd5a7af3681cbadfe1390c324efed5cddd744b1d1593daf05eb3c787c44313ecf8bda28697d99ceaaf0214f48006e7177f11e7f1a1dc3922d522fc5fd2542bc2148dc56421c82b2e1151c9ec4d79f8a3978e23254b0a29e2e40b0301c103a7b02ab12cb88e502e540e0e744340bfd01c2cd347e29b8572d89256249619ba4e5d40111fa864d86f03af215d20de40372847c89b4f1ab6dcabe7eba74660e0e7726195e55c2dcab4e4fb72ccacb165f56fef5567954f032f04ebb2d43820dc3b969225c8fd708dc69ffae9090f4094d19a2c62f2dbc2d5328aa794f395e0181272dda90eb3b6896ddbb46f5b701336955106d7854afc95aee622774b8429fb33ad490900a58626704032ea0cf7b3b4073b869c680a84a96cbf6445252e82ed68f0de2de6fc68cc99777b4462cea774f001b399e342e27b31be76e4c9bb735677e3a5fd08dfe4e3ae289763a61a77e0174b96b73e1a9f71c88b5f3e7f52849f292da562ad7783d378fb8f311f06ac5f46c035dcc0bb42f5f8cd27398f1b3e2e4677e7421feccc04bf966a9417b7cd5843089af1b24d536e882cd7bf403f286c96687187a46548df4ba43076d4586235d7cccddf5cf75b44415276b7dce6cbc1e0a94d17850a7dcae3cbe9be9f0ff35dcab4d48c06e2e1deebe40c08a937ad96eee183dc0a04f52e51b39e54c0040938e467b9e2f8366da64e8da29cf05b585186b919bc7a7b38745b0557207f612b2eed8e84c8791a870331f33e5af87a545c71d919a11f96cc02ca691a09244be2a7acd03b25d3b6b85d5dbeeb2a0bba271d77e88a723f7e3b426586f1faf6ecb50bead6e8e34c33871d9b97aef46f465bfe5f8f7517235b0d9af605e3d83e6c2cc26f4792e92db97da9b12691a06d447865f375e1771354c874438df88c45f3cf3403cc421fbe6f206a67129b174ddd04bcf943d67c5691f63716c739fe50a827ca6e0dff6d467efbc88703d43f5738896a3aa05d0d363b1e4b355bad16aab3bbea77b1d1bb0f0e932cd7a34501d37e8ed77e357c12f97ac91868f05dbd9a3d13fde861c0f15f4672fc2197f54608d69c6b8da93d74e8757e06792e4fd9676eb86c87c4d5f77f4e1fa22b8aecf43f693a8e2ea5a8194b55c57d2ebf8d535a6d319e1d8317b5b74f2284be2233f4c05ef0a82bd1c4ea6a4126e551481f14bb6306fa71458f144e71040ca107d12fd3de46214ad499cf8c622aa6a8740b03d277c0ea4db343fa8edb4ca09ee2ce8cc011c56154572fb1fbe05828fce85b07e6d2e6d477743d50bdb682aa7b5b33f2ce1ef4d010018f76fde239d3144f170a409b0022b83185ff24292e910119074b462e5bd7487bc008db905310ba4f45f329fb973bd89221ee0b5dd9bdf8c5527e706883dcc26cca4ddd133145b490efaae71a32879f3e1b04b9790a9628061d7394f5f349477db62f4a9358dccbbb1c16c21f596ed5de7b2b78a64a8458856f12fafc33849f568b956c37523bc778d521043294584119474a8e0c20ef52ea5043eaa6ccf7929e51668928a5cc706e21b2f37d6cadac98894844d2143fdcdcc8eeab1b4508e8fd108cea8edcf58e4608b2d92568d5de03480fe221aedcbf03e0fb868226 MD = bcf7e3ac677b340318080a6212387096153ed60c24b1ac5c1744575e7f94fd0363d2e0ca6fa4d7445924963aafb47cec33632399c3533bbc144bbaffeeabe46f Len = 72304 Msg = c84f05b80fe8318cc378c25a1c625cc08f5ea853abcd5893414a651ec7829b23fe45581ad3dd91b2839e150b03be16269f67e59ae10bfd88b4f843d0c92c8c853a6a609f6e8dfef03c1d9f5a5320ff3ed9321a3752d83309c4121bd4182fb08ec4e5a4afa7a1802e341ce8add32f20f184e8cf94c6dd03feb7c076917c341024e3dfacb347c11f54b5c4766d4c948025eab08d1805c2744fd62cdb6fbde3b230e18001111794e44b053cd30387f627c351b3da2bd62e8fe4697bd2d6a2e3a09b04ef2a33dcc3d6f96cad87d549fe1eb40219413502c95ba5b8d8e32ef5dde24b9555af7f61f5fd47343f184d5d546cde4509479e523ce07b0a6997df7c787e2adbd9195f6dd3621da31910d28a9f192b62ab76cf8b2f264ca9567551005d7e1f20a4ef3ac7050c640364f7cb97872e82a028552e78493602dbc806ed4833e911aaddb978383203029a4753a24db6b2ca48a86c24e0331783e9e7d0191ea3c8eac3ad0080880250e1b1ebaebe74d1adeda252441a8a95d1b91bda5d3e48552291b13c4abc7f1ffae78f788f87d48328d2f64f64763f156d8ab8ca35c58ff0ffeebcb12293e42e09fe7e157f65347129618cc754a1c75ef2e00adede14bb1d68e92e350d6d81da860dc4ea05c05d46bb82abe19d04ea1668a2573fe2959483636a4def95b21cc878fcaa20a90018a8e31d9dc5c60670e6d7b8e814c9afe1cbfb59630841cb7ea3e7b378dff38d2b40ab1aa89c570e20754809058619c96c9c359eb6a7991e6f11dc19764e6cd05eb51a61158ed986c36cc27ff5bd5c4dfb9f1b218ef52614b7ba5d18ec969b2f7baf38db2cc2d3d521724e0102e019a2577bb4cb351a6f161d48759721de081348d80e6e3461cd630230f3787217d93048d90882f23dfd8a6a60297f5e4f3ce58fd5a30377924f982e4db9ca8e8c235f9661202f0c8656d966ac83b6eb11be0b165100833b7ee2dc6c72a8e09e647f9708ba03bbcc1e046cd9d48a25104b16efa6f22bd4c94c0d978647c9a2eaca7540678db90c7a2d8faa8b8046b41526cdf706602ee069255931427323f8b9e48ec27b814b0c5eda7dfa4457c04c41c96a8d0044118d62314d12699fbecb55da51850c3fc0a1bf4e58c6cb01ffd3dd5c75185a46dac5fe9771a2c372a30104d547f2e26e20b5e7b1a775e9270b3331097700dd0d936f83804d4a1795d9840ffdf66fc4b7742f1c2af36f6671ed5285f6f7ac514243733a136a702faf683abe79e8657cc2c3f7a7e1c31b0a86ac1a214b7d867e8cf3b96b794f7ed169590d5872a53dd03615f5d0ff9fe39c0f50714c3191f52b94aa285ed984dac66bb3e4270fb35d89bc7211deac0f2ee6b3e24150d0bc61220270aa5a5c92eed55c7ea671799c2f6ffbe3331b0f9c65ae1b6971734f8532297d4d26a92a0020c8e5c33d7fd7e819499c6f43cd51cdeebdeeede9fed675d109ad4a85916a56da66ad899099521d85e1461f293d992b32dbd57791398f12a48a3b6ead5b451d83765dd8870612c5dafda2facdb3103d99cf780d516ba0e71473cfc2874ee2dc82c19cb80a103e67806657081776de8b8c637eba11dd31798a8e104cfbb46a1b410f133201fdfe8cdfe40e51f0d02a9d715d9083b9d86b526ca1a716f2d304622727694d54167cbb5f3e6fde3e071cfcb186557231a275f923753b2852f5d93a9cd34712eca3dd7c683e21b6eb64de2fb5a6768e618378f618d275880560102a08d95587afec4c5762aacde1dd2f95bee4859adf31c59cd2b27ffd40f15cd2bbd4023ab68638efd5b54b1a68feb06c32a5ea6a6e8aaf081458467a580033477366169fa759d1ee7dc9e9b152342f8911629f8d425288e54474ed95d6192b96dd27dd2b6111fd72d8064c39a769f314e6826aac6373995aea6d3df5c4238ee87e7f1f87ec9405a36cd53b5b6f844536366d146fdad32a908fabfe422908a264e0d7a35a50cc31a8c49c7fbfb36d6d168b8a657dae5c82afba96f8260eafb0338a95324d95a0c8aa65c4e00c7b0cb3de6c43247fe7f4ebdef496f2477a00ff7c04239408c4f714d0d9b626ebcd495eb362ff1b1c8e85ab45c413b64d75e3d968d7e79132e5bb5b43a7d91903b30cb8bff42710fdaaf60b0db2750ae10840841f8a4bf073fed3e62a579481fd343d072aaa21ccca432f535e4624b7ab39ff49c8a5b57b751927fdae7151258058c4941c0c56172a6218cb5f098885521208708bb08ff8dd3d9fe7f77e77ce352889a7bca32eb8c50d99bb3982093b7f9b434191344030567323ee2c066e44c3ab748832f61279444f9a6a133a10a3d9db990402b930eb86c29b58758f9d4fd4ea6e7ea78d68204f2d032116b7038309daf00006c5c7f11532ef6efba36eb70deb5dd243f199768db1bc286a834ca4b6a0327ec3e26d09accb0778e6c9484318b82bcd2da90e43a7e2adc7362651ce893645c664978afdf396cbbe5e8a93bd9d59beb48e3d2e4f44c8bf46a2267cc829a313200f6c8693919a24878a6cb8eb43d400d28d3660610d6cd8ecd80d345c40ef82d4edeac9942fdff81d92f91d95b333d76e531b0e43aad5e102fd62e05073237c292598bbc7746e31c69fb92b85957e2dcf07749fbbc20bc3d03caeea6d6c45e868dfffc5f6094eb5cbd9334a8290bbe93ed2ca7b92fd17649ebb78b97bd360adda45a54de795876e7467efe3534cf4f303dca30a900500aeb4a248b5424f79b5c47c14bd63c122420871755cc1723033664c8ab37c7fce88591aa64689899ae771afd47b3235261bd1214e1f94aa7891af4a04e11f168ad9d74b1bd41a29ca2b28046bf11c989be0159d0192949bd3f525009bf942703b8b745c2ec7bbd6126930a36385e9928a791d0d161f88ee49471194d664ab35e9857975688735387889d2b544a160cdfacd319a152d3a4ae26fbb2e3d8a230e9caf2ec0507c50f80774566294ac4beef3c6986c87237058a7556bf759d371a35df1da626e0fd3bec41004d1dd0e70a07d4b9caaf46bf3c09fe16916b1a85f9b3333c6864aa68831b946232ba62e9789a145837ce26c8b29d2fcfcb4ce6fb39e275d3b526dab35faedfffd9778768a51669a960bdb8eff3b498c6ef93692365640577fee5e84a3c16821d83eda4d10a1d5331d7f6639199f0b7a050c7377b0688609da83a59b9a2d3395fd48541bf021f4f860000cd59ffd20af0a160d88e97f015c9639cb56e2e65544b4dc6e49f378cdd1a6b453ca5afc9112c43e8a2ba841ba36fa37571f4295d6154522b13de14e68a739c6c6811245658a7dad74cab756b8814da6d15d83e2bfeff743a460824dcb605f5cea608f80a4017b8a52ccdc670323d8adc1776d7417bc1367d01a9d1b00e6619f49d09854575e08fead99e01ca406e375b0d7c8f4e663e1b5bbd4fc600f1f87b66a3af76985896a310c998a1ca210b52626e45c0934cca956eff465c5fef518c9d50472683669e94af734a410052b98e7a906f15c0adfb372f4e4a1f1d74f5e021398d2f972e8cf72f6d2f49fd63ed2e0c3a54e946f844630500a788ea2149f87ab5cdec342ed62d092db44721c30ac3afb293c5a6ca3acb88dd0b141652e248025ba606fad61ec8d52b75a30dfeb6e1dd9fb835608242b33329d16b42a8435160a191ea4bc2ab3d0bfcefe82275660b0e681eb2f4bef0cc9c8d86d8ff8fe1970e0e0e20b763100c25f88fa10fd59ca1ca9243c8e3dec97a1d6eb7f79d8841ab83279724ce35e1a8abd4e158168dcf388ab4c3d1ae70413e4e43d141bd0fe7e13854b960e0b9a4b525e86167e71c7241d7262b77c501dcab97b36f41deb548eab63be18f9f7cbd93fcc9ac6ae1f02a50388cc725b80200249223ee6262e6f92a8533abfb6aeda0d7b8ef0edba7a76be6175f4366080f604bb61bdb3dea335d232de2752ed38b02f2e2cf253498a09b75fbf40cb3357851838c01b23ef518f956f8aed9a459e33877f2e06bf0458a4d727f01af87b0db785e8c8c0fefe4065258ae2f45f67e74d5c971d96fa92eb3067de8fe986e0ab7395f200150cb679a0c8a96ba568fb1be5f89e8109cd9d4b93afaf25153e0c38a08e7ff08015bc0326c7f5af667fa843e3a1bbe0c7fdca81b7f7c03906e5a4bc28b9b6216ae0bbe6e16a9535a06a16652ea016c43855c3948287395323465340f25ec01a3c36592bb8f8b185bcf2ee8cb03dd8b4c49c308cdea643fcd628bfcae6c5c4635cdf3ed992bb732820dfd8bd50bf2939d399b872b29e06ba87529065ec35eb8534a313f859f901a536f97b02f67030dacd15044de6b5a9189c8d6f16ecf85d072a4a8091f4fb8384650880628a96161f1ad8bc256134549b7ea104e7ce544171a89b2caa4b09224e14d38ee6f57a029022aa87020d6331cd9556f6df7a92bf4c155fc04e466a058aad234e941d641db64d530dedd18965354974ed06d9f9011fd95ee382cd6856c097c06876eb9b8f18049af7ed95ef1b5b03c29365d1d32c725c603e50c8493a783a72839447697f3ead49ed0b41de79c829098d034b666bce052d79bf1f56db3bfe0147f41a1415b1b226964ebe9ca703251186e930fce4b93e8c3bd7bad761904b345ea04ae57bf879fa9bbef271ce945da2241d66dbbfbd6f472ca18114f40089d46da0c124d69b6c8ca363c6a716043b840fa9d74b2562fe24f5245d54ba1220a91ffa65195123f1a657462285a6da257ef09469963e2f54ec3e6934e1de4e787b19b8200c1117720e5f6eef52a79e855a6fe7060331acd966ae76f001863cf91206e2d94441ff568d62e3135740d9c2de33a995d92761f55cee5577fddb650c368c7e780a076405eb09ae78dc9a1244d3e5e2fe6147d71194a60eb31d045017ae5396e4a68bcce7f0fbd60428dcd173002c9b29e3ba9593d87da78aa82985844304310760f6c26464e063a1852f9eb72fb1dbfea6a723e5ee1b2ae6e8748db9bd4758c87f70cbe40e625e3639bb0278261caa65f4370a6d9e299eae230bef20e4c3120f4d2071cfb727ceab8da7841eae1410461391d195b24f0ccaa216331f7f2167c4102f3b8d27d7bbe8c91cad118f4116894cdf00c4f0347b21adbee22058085fd011c5b186261b2dd4354103b9914cc316e74620612281f39d8b2a838a3521031998085c227c9b2d59193f107f7cdd20d52cf0b8d60edd7d2586849ec5df145a88ed23c3caf0fec25ebc3d5cc9179b33ae6305508a7df11fa2e4f1bb391e886c05573c6fe44cecf5cc67646d002b2f068ad3ac70e53665e3faee9b634eb92642791f7ce6da560fcd8962dccd8d8040a14fc50ea14f03e0d116ecaa1d6c7a95e3ca8e0ab212d70c527ef5cc04d6de770ae781536a30aa0af0de264672fb277d57e2ea0f5af6968e8c93685c98450d7c4b384fa254f0f48c483ae395e9638988a7a77bb267ec5d3b84b102b61341d4f66c2c7723e6f7a90ee1136dc20a0c685cda038b1c605ef2bb41be0cfffd31fd8e73aa4000a8ae9137c44f0af35d5e8ca1f8dd6074cdb31eb7cba3ce62dc7f4eeb6a99f45e227b73b0f8d803516bc2bc000a1c43e33753a9d72b4990053a9290b658e3d968ddc719208594a003bb9ec22017aa7c9125a65bc268979a109ed28a96466f374360fb4930746d2831d55b64ab276e53a51f14fc218a7433ac91a706343b25581a337dcc88cc4ae50542626b4643501047ad05539b9acaa5019a79ca373fed8313dfb76acf95121da5891a9e9b7138faa158e129d99e80363641b0a0485aafff56eb0feaaed7af193932eac752bb0e5ad8a7104682a17e2f730eb44e0f9553150cdfef16cc9b0821eac63cac1329ba781723fa723fa8acd8e28aee9c33f7c10d5d44beb4d2e8057cdfcc771785c2259c84520775b8bdf278a83cc4545d89e22f70a0e48d67c78e7442cc02ce508e350e47bea01694e73858f0ac9f3c34529cc26e7ec969343f8b4f384e47991d95d31589ef2b1e7c2f66c1e063e81e615ad8107e63d510e058e456ebdbad4294e0e8fb726c1256179b64f9a0e805c08ba97f5fc9d97049141a82d183fa9c8f5c765a0629bdbb830e361a4859c360ea5b4877f8776702dd788e4b0827347c4a1e5f137fd76a9070080570f8337d5f66783eaa23af96f395b3bb28420010b63981a4f9aea3fbf7e4ae124f50559d6cfb8c93fe2899ecab376eaa01c93616b0252e4cf6dab6f95aa6a8649d97e8abee703c4f5d4e5ef3928b5061bfe3f0ced3d5cc5ff14c37ec207f9d03441613304d8e327baede2633105b02ea48d956c1871304e6d14d4f5ab13735f82a15ffb3f01d161fd92018338e6d2b4d86f3927635a57ee7802326cd7596194a39dbd3bc41e58f41c55c5d7b728a74906078c9754354e16de516e3ccd464f10157b2b8d3a7ad46eb5cda1c93267a85bdbdb226471be8d57de870afe0366864266ee0d6818a3fe32485e17e04100505db87e7ce73232904217177b18f036b1bbf65ae544d52610df528bbab549af39df3a560ec81c5df136068751264a335bed724645bc068dc6c642eaeca0e2b0bf40cff65a6fa68d1ad43b5b0f9e47e8ef473934a12603277a97c7d0304b72a16b32e7d3d246573c878d041718f99fc3e659d9aa8a2b819fc6c42fe0280d901dd816107328f4a508c1c11f2fffb0a860cba5c21c5324d86315cc099f267fb172507ae858a0f3166e5420eb1a466bf82c19bb910eaeba9dfe022fd371de0a6d4b9ec1cdf8ecba31d9b92ce67a6f8415a25afba4f5ff5538dcf6601bec91461a060d9b4fd86ec27dd75b359fa4ed81774009f6ac66c77d3f9c7cfd5183f2ab4e3e1767dc7ba99460e3c4eb754e42fc93a1a12ce5e5999b28a8f05802bc74b2705056a7f2671fb8718b80af15bb024e0123bb1f0fd6d8577a7f1b10ae1a89f436e945ec200f53a7264b1900df9f9e0e3662a24d78cf160aabab37b7c202c4d8f8756f94f3f8c7d8f58ef871615098b5a9db0128bf42d55d32a9e0addd2997e94b612e42dc97fec675d39981196264ccd1f9524151b69897b5f7a0735de3859d86492c6648816b181dc596b0866994bc554a1017cebed2729c10f198c2c5107e5fa9c48fd6298f1653b15a7026caab1caa49b51c84b005566b824e9eba42caf43def912ff414fd79ce436f40890a0a662774dbe0122ec3bb9ac831e592e107a787a71cb720c8188ad3d84fc21bac55117357dee305af703aa05f261dfb247900e35cb1b5eab772f20b0c66455d25fdb7046f4895dda6ad2c12b3a5a841817188d76d1accc0579f27ea3c6d7acc0b76bf5127a388e8a8dd3878623b05048c93a7ba74923c304cef94e804afb2f6c152a2f02d7a3cd52a72b837e740c4b2aa420622ffc2b4c8fc06d18ae1b78e5bfc040a57cd271211a02053e7cf7157ea7f2efc976b26a6e8e9576659501f7d79f02d4dfe9344a93cae4873ee67274f0a5f9d239e4328831ea963bbb9dc3200bf5210e66b2c5d8294a96d90d26aed0a90d03ef39e1462e9d890be5a52e2b9a8baa6617c13d4dc0ed82602433a273d2b2c8566e51d5b404bb543c9ba8b0ff0e5fa4191778f494ade75b899036c4882212bd3a78092845b1923370864e8b08238dcd8235143e61451ebb5b44a0f3b767d1d3f935ea42c1de2a0ff1ce1e270e821f0ce99a1c827e309a8c1c69f896c649f8f4dacc7b8bf0328cce059aa0edd9d21c48956e182ab11763b41526c7177e728e072465446c9a56bf5af5125d4330bc8d6bcfd8919dc3a2821d8ea494dda7879bf3202ace4b86f1cb990960dc92dce8795cdf000e437c78feadce0ae750093328a21641a0917dacb97588a9a543a6fde8030d0f1784a342df4e1f8148d86b1c3bfb4dd243a7472f90d5bc1841bc53a4e348a12d34c802a72de7c73140dd97eadfe60f063df3ac2158a0ebd23767ae847013e281ee775f50f15f0f4156c75346194ba20418df742a1ac05e020fab7e469a4c1934ccf983e433a03fda13fe68d8f3124ff55bd266f3dd1c5dce52ef8a9166db8e6d57b6360cf9919f23feea9e4774245e018f344b24a99c2f5e879d9b0edea8895515173f704d1a77459ff4bc3ba467174f3b6ceb6586281edb361c7964099c5214908268b736230e677e828c5e8cc4c208e7e40e5c7da8706de8d4ec3cef9d30d15060778abd94adb224fed4553323a6531c037cb495046e3b232dbc3e99946db5db1a3590e8559c4e18ce5dcba26d0c596031fc13d724606e728fb0110e6a4fe7bb166a72c14f2362e25cef66df883c423ed6582249f18e2d5a62925e56051f8f78beded750688a160b0e52cef45e7e353b5a5688f5513fa1650e28cc7a4f24d7987958689c8918931a4e4dace8d61a5ae126bfede32dbdf21afb3b04812fa8e5a5aea2cdad9b16019783a9a8c4d757dab7a05afb1a6e4e47019192ad738cf1e127c782ad8b84cc880a142e698f4b7fdd4531f158a2fa3bc8a339f770595048f4a42bc1b03f2e824efc6ba4985119d88a14414aac83bbcc9f875930f53a62f546a642277fd07f807ef5efd3dc1329ab0aab392fa0c59848f1365b06e31eaa40feb4747bc246610d3e7b0883dedc633f85927f66db7178f9e936a541e30d10714457298720a9bb73b6181e7b46b4afde22527db7068f4525ac11a1a99c107ccf4215c911420274f810539984bba3f5ce09729aecc925e615654eb505b72ed6a31d79bce2d05876e571b4e266e5b21d58637a3dcbcb3d43113a764b1fdb70063500086ac271b4a88203c45fe96de80fc458f3d01eb5de44605310cabdb1dcf4cd114c3c78cd1df216ee0a79d4fb4eb35a0f64baab2e11d14cd9a49aa8e07d89b378cc98ce8d9b3ceb5a0f98f136eaf162b155633bdfddd21bf4bb23a81158ab2e5e10e78a59366e476e592506c7c6b223654e3395704a2f16cbdccc85ec774388eba19275d8f77173527286dc55eadce654d892838860d085878fff0618e13a074606ff57b3e52bb72fe2253b895c59f3a57ae8cbcf289db04f5c24f43e9e76f498c798f89209855a2d2f69eb0b260f9281bd9d36efa97fde4ccca11705b7e197086dc41f1b6967a673e3b9b38250e80b1028198c8deb5c59a666df3716336237bf7fea96f90fbae12a857f5c97e0cba57943c49554f71e6784b2461c181ae01de4857423d2036454799e22aff1e09fa9e5960718e9d4ab510e393f8db4744592a007c98f4f4b4f4789b50a7139574e5f7baa48dff78aed5f6e823054924a78dc1b8e51a117f1610181529f6d164ebf0f6406f0b02422cad8c916823759a361437ca17423d3fd84cc8afe486a31ccda01c732685418a32c064a7b9effb288e811ecc99adb2a759feecc3f702f31d9877dcdb717937c15fa2f163bea744400f58c928d2b93c5639ab06ea07c85bf7daeca9e1c6434f8811c9c58ded05db81370fe97758f114bce5d5a99a6d53483c1373161e9b90133ee799536eab783b5c941ad22092e1e65bfcf3474dbe30424ac0afa3fa77dc0d664fb61d8e907afe42b50e25cd27181bb3dda8628c60ebd4b47106d5fdd173a88eb894a676227a7ec4085e46c57be04f4506597dcefbf269f992fd1ea13f137f28c0b960bde81337711c9fd7b207e6db80059b0b9df5c08c9aa507007d1727fbc4e6a8eebe47c1d2aa40273b1b61a85b1569c19e71d4f2b70825c90dfa002d98d3a8c7a30fc802caf031a8f35a0f8148559171a8d31fe573d2a397a9907090e0d565aa201aef527ae36f799306682e2dc12b2fbd3a4d354d7a9d1765e8fefe7e5acbc4d878344d7ce4383d9c9911fb65f875603e2fd34e9e8070acb56be1d29bd449bc5ea02d304b834a49629a83659b5c2e97be2c48be0154ccec3a81ff99f3c24dd5051b40b751411441a7733319487cb54abfb823fff088104a47d37ec100b566c37e41f54f489e04aabdcbb772d7da880db53bdb80f69ae94b7fc905f43d2e22ec2cdcd1747bfab9e9280c770ec3e63545315005ed7dfd965444eb1b80138ce0d383146ba375f7928178adf849b7304b75a67d09921130c61939a226112e524f0e33b10a78c1153d081238b1b00c391933a71b7d1b3ad4e6feb096cc03e82ecbe0910b5440e7c407e1a72549de5d714cf395c3c6e5654a87796c3163f4db72c61f3dbbdfb8549481a28a0c17210569453a050e8d8d2b02062daefa844062beec0e9c2ae33b81f738cf4d45b0249e91a07b7744177ef6ac11600b5aa39328739c332ed125370a7cabcc637a8b65a38add3c5f1d1b4752a907c4f3ea58599721652188570c575895492e6f132f40aea559f14ef20f52b97977c11b2219003958b55e1b251f08f6c19f79b29812520a81a53ea95b4a3da5addff8c39a4c23897a3b4d69b3c3c86f822d12e071bb2651905d7900b17274a1b6aeb0af9b883ff2263573f69b91121d6760ae7b48a01a1e61d134e7ad1e74381472ad11de43b22dbd527644350d729ae1d880e58567c9bb66bef6b0a684d8d347ba229cbb152676c000a8c528af667272035eb1a058a1d32f55431e266c0efdd0e3d5c2ba530977dece901beeed6a0ea86f7c6232192ed02c528e62b53a7332409e1b1674a3d7ab5a2ad09ae05e09f9f57b8e69b32fed4cde355d30cb56c1fb073786fa428e2d7bd293ced4a557a2bed9c5f94a9be359a3b55c140ae16767c2a54e9df0dc585773c8980f5bc680d0b7c5cd418754f9f07f525567438fd2d1139b41c49c7ab9023dbcb606829c60208f59fffba286ca4e3a35bfab9d3f3f9a8869cf9f5fd6269a142f6c390bcf5bfea006dc8c2ea9eacf5edfd9755a77f4207b813682ad5707ab9181293b39a7fae7944cf1777e26b1f0679151491db2970f778225131775f29350628b71aeeec367c6accd422395e65def2aa59b59879eb406ed09c520cb7e0dcb33e170ddec2bebd196de70b16fce645fec54e0905f81caa412531d5bcfe0675c85f9bd3928bb002fab9387aa2cf0b03456ddbd54b2d69fd9a29f802aebe02c9ec902bb633ce7314b5b8afb7055e3adf70aae86091a03b0020e5da210b7e3ea0c8dbaffce9146fbbf17235096631dca327845df300dafb7c7c60bd79fac721c103470feedbe40cbe56f0b0baedd15a15110422d6c0620f3a55a28b53a42013f646dc33d432c6b2e78d390a10c4c51afed7311f51f8c0e1ff54b42af731117c0539a303f61542c9fc3e5529541095862521143dacd07dd796219d84adc822c5b783a3689bade1b9c6114df7cdfcca055496b3622e71205bc663657fbd91dc54d4cde5480d222aea0dac285ac5adebfe51de1877200331d456c215056eb5c69224be6f8d929ba6c599baee3c824e80dbe5a24b65caad39aa0fe8b4fd0a5c69e76eff4b1d7340dbb031e1a7844d051103d88a52127498bf44b97a4a4ed7ad4bbc7c3781e2f83a53149fc95c1a6efa27def23d376866ec4b0c1c23e0e21ed1f677140f17c268b1965aa91b15e62d5749d4fb64024ee7d06569ff897ca026f0f282ff2f17a70dcc2ae8187fd8cfd241004dbaa6b9ab416c96c32b5429703930c543053e88782db49928b39cafc0a4e2d3b1f8ac6669bae96583692dec3a9dbcf924ede5731d11916b80441ba19eec624a687d1d106f9b6f5b0f7fbccfe69bba168b81cbdf7d018a265a91a3b652f3e9edda11a2c0a52c25fed035a8d95d7b53a2e28799d48244c7541d64ddf7c4fe9e45707ce37df3b434d92e5599128585ae2790c8f65b1324717c3183716bdc58a9d99085874f417dc47192a539834701f42cfd0c8b7a18e7b027feb6061b83483331a3f6373e77cdfc5062ef2d338c364c3a911bff3b7ad6abdcecc7440d9f1564d612959a537ded04fd08f9202a3a6ddfd8b4bcfba61f398b23637cd54b1908634f442b59953b250500ea8cb8713aeed48eceb927c2f0587784cb9f5eddda695924a07f1b0d9abc27e2726f9d0f750154e447d82a97d57a98888cf68ac9c9806dde905b89c180fc912a066c780cd2ee876387e2ad2db7e916b60e4afe19cd94c8047a854abbd62b6c601049f17138fc9492f69e578d7ceb1897b96265d5d0ee911ec8c607038592df0cf7cfaf459174a4f9fdd6d1be0ec9c6b1f6086503b9d7f1b5e1e6689f747913b723c65b90c49ede210250c2c853cb498f2b02a6ad709510502dad14998a272fe8fcf69c5bb9c26b916fd5d3b43538c9b6c219d1dadc70157714e3b4f9b1e65c28ea261bad582872d1aa2dac899b5a6db021158e93e7b228b2fe4fefc5d0fcc2fe5520808e89181c6a1d20f44f6c775e03b2be84df78a1738a53ba6e07ceb288f2a5aa720634d991e32e76530e92d8c43adbdc5cc678871b867becd9c69550d78c428d991e41b4f8c447f673cff4c5c6da0636be50cdaa4b2fdfadd70b0c1ed65594919edd98f17996cf6af9997a858c6d9a9550866053290be5c510dd1b64aed4047d294c21d83ee02e9890750c623f7bffc1bd6f19c9dda4f6fb2d44aa698691f81be171c5b06c2acb48de6a92a2078a9c82ab13e05690827b18d648a1768715d9316f566ac32efd10448b80f48e0b24dba0c37b9e406a2bdae5b2f2e8d3d8e710887a03f957aadf645340bf1a6e74d023e2acae39d092297d276a4968c8a39003e8ab7e5bb5085b2f3ca530ed8a6917dd110eb49b4e3104caa9a555079d0d961c18aad1762571f6dac861da5329137f6ff59396aa026e422b320c1fae994083c2e21e0434ee0d3acbbf1dc635959a924256e15b5033726d078947ae460564de5c0cb01d7c5a03ae6be980fa7c1425d8befca00b742b640cc577fd0bb529a030545f07 MD = aa13b83b4db9a58a7684bad6b864abdad23bdd71b4e5bcab1a8750aa8e6b1ca70730a7b9ff684fa6b73a70ca75c55aee6afe1b6f573c8fb6ecf3962a30e0af0b Len = 73096 Msg = 32670fb2a42da76362bfcca8bb8358c17a6595a05d7b51a9c8e935b6bb03525e02b2fd77ab19ddd9bd7842652750b846f7c8dd77cc4f6f858e83a9975c51d0abc65e09223da66d7fc7645f6cf8311dfe1d6f9639bae87cd737b39945d65866efe833dabd411e80dde94accc4146eaf6f542469ef0e8f9f242b42adc90f5d3db0cff9194f9ec73d7c89f33175654f952305adfda0b08c00f6d1f88c2af1ab7c79e3786de13eeacde311283488d11bf8a296d3fc548727c8d4939cdf7063894ccf8c787f7a08ce579ae7af8004421cff72715e0b137da81f47d8f84da34c3ed53c32c0f622e4bd042a7550bbf19f98d31dfc16d4e679562cd609d27fcc96133e473d197be1bafdfc1a21d58e57d0d89b2ba1c3ffd4647b18098cf31cf32850b079154bb6c072d766f25504a03fbc248022c72c34e6245d0a68ca23cd1eea3d5258221e4ec6f5936a3b78a79ab04dc4aa8cd51a1a23a2442b7c2b293a57c4214d6ecd5aecfc2979327cf28423b36aff40f035555993c67aa3cc18cf0aa59e46c8437cc63768f7d1e33d2a64e44ffb1e6bd74ea59a3e794699e0f7dbe61160f2ec5d982bd81447e2a8078a0e848ce96952c888d2852da1ef3541311675a1f26ee1468a51760802f5a760794cac721a281e4b4ba3c16727bea1762f48605f3c02ce86b900ba4b0e5208d35fe4040a77a3f6e8ffe1f7f4f4fb020758394e5327f5dba38c004be45541f4e5a59f335be82203280c54ceddefee837d13b0e884999132276d18d3debe0a9320b145e26d56ec6c92dbc4ef29ffde495fca77d6fa7b1cf89ac312f73e30f40c0bec9eb849a74a5aafd2f901e00e157f35e454bfbdb6df5882f5b4610e9548882ebe715ef6c584f5055abaad0b03d94b88c9104bd6302278696dc7b956d44f2e1290887b7c96e2641edcd19bb0c573d5dee073234cd32d80d69212a61cd54e273ec8a9b8e404abd082be0472da3e2b46c29344ef2786479952cc5fd16a80909a3ad09dbd35f62960b76a1cda8e5548c6b9494d566f30b9eb648374e247bd5cb08f0e2c317753a23d4746e17dd6f2147c4d6b54012dbbcc9d941f1a80bc74f990c4ec1dbdb3055f8ebabc1a00b9fdd591055f2298690ec5d76a081953cf8db06461d03a08f0f3a87c9632910e405fd42d698e7fc22911efc36fa739048af0c951ef2449bb3605c52f65120c4d71fe59760260322777ac91862a62423bf5858c81f54f137d8d23fdceaec3546556c3ab97573e05705ac7f24b23a2fb9f1735401cfbb960f7fe359982faad31fff79614b6f18ebe45db4a5b38e3d02dd9f8e62f4989caf8d09023e172d0386ac35a60dafc56b9264d001d1475f152a091a0819f3128eaa2b14cd51dc7b8ccc9588907469010280531d329652bd5921c6e18efd9fc5f812842383495a83ad114678c75a09aa74223995c54968218f66918671625d1b7f7502a5f26913edfaf149769903044a16e472ba287eea141e84e3895e0cad8b7b4e312c69458b02ece91912a423db488163b92adabb6b1d8cf9576ab34123be720a8a177673327b09753fcd7721112e3a1c57485a637d966130479b0f9431fcfa4698079856acbeb7021817608f2873b77ae7a3362b642721b64eaac19a6aef8a6ec56d4d845c369c2c4c811eb293b1700bd4bbec57e1384517c70a77b8310e990facc90470b38b2f60578af05fe55ffa3bc902eb9d675241c16b4aa07226d2ac85b8ab6b906514c72aa39593db8fd7bcb71f08b250590dbe4f85dbca5caec44b8d7374e187c37c1a07bb5167ba15d14dda614def0548b3012eb14e63dc5b5bec6367b5e4bb61199e74291eea7ff9a514221a32f040b8fac0cb7812fb759f1205c3f00f03afc085aaec578e9aa1bdfbb62ab46844872c3d53b244b9ffbcfc8f3e1bb6b0bcd96448e5fcd10106a3d52d8a50ba5e7a4d0503607fa1b3ef26f61bdbd7367b8eccbecbc6122016ad0ad1b33740b675f006f5d54d90098158280e509572c9afe7fe4296d1c8cf4ffc4b26351357134f4449513b917ff6b2b944c7b5c19b1ace56e292228f8d391d82f9552bc5206b6af598b9aec2bc03b8811194c406ac94675a1e200755dbe7ffcf79f0ffb31929297259919757b08b135df30803cb23b10b70057eadcb31767730615c3963cdd73b59106b8dd71a27539e8d93ed95ad0b1b274d009e662a4f04642429515d9aeff0f851ca1aa73552e9c125bae9dc850d26ee394841ad22ec37c956dae0172cedeb0ea21f967ebe884674700f91265831af437ec84016b7c871de6dd35e26e06b99da65eeb99402421a16e0e47c09930324b562031219658e5321cdb533e351c38dfa31b9ccadad1aa526fcebf2ecd21c17b2a78b205b98885c221af309f2fd8027fc7a0378121b7ca8232888ae4671c708d993b30323ed50ed5dca1f38cc404c085fc34e2477d9d273a9e84cf6ad1eae7888db3d2328b07297335f9c58e5c6619f72920c5a3564c69819d09b7497153cd74ed26c18b0ae67da514fecd2c5fc8b6df36ad0a1d148d396017606a08b11eca5aa1dd24c82139b37261f934ee35f03e440a20d63d1f263fdef2d20f2ff81588419020246e3aca72e30432215c46a65a2f8fc4548cdfdf220317a5cf46adfeac31a437e907bc5f63ffe6f1bdfffab4b2a7ace0a991bd828ad76e21d1d63aa2e132c4699a1b0fc12dceed7e2f5ebae1edb449bb00d41fd52163df903e6606c9cd4dd8ff60309bb879580220a001ecf4b45e4f9e7fde6ea28cae53383d7f793a1889c94162d0c70cefa60e213871fab6aeaea4d14e3613af76c0b063f7a8fbbf6bef7d77c982fd8436bff7c71e354aef84ab319c966474c485a2e0579369f41e6e85dde9bccfa5e9f7aba75b7bd54666dd5ede477ff1fbab615bc95c3a4acc20c855d1df643d2503d973042476da54e562cd941930640f2bb3f355bc14d4eb8d216742a0e856e69a851ef86c38cbde32bb02395bd245170b23736bbd488eba2d23c1167571a25076a2b46a79e9304b168f05b6568c1d7d1458e2f2a9ff019fc8746d37a627a8cc5ed93e4195af92035986dcf44f8773a80efb48d4c660b30325bc738b7b31f0c01cd2c26706b5776ec34991da91eacf00c1b3aef85d942e4f0da4d9fc3bb8029576344bc314216af41c802c4f63deb9edf4291b46b5c2fae948d3a97130e367b435a8de3d091cf0fd2bd3b33d0c8bbad7710597a618139d3b9ef3ebd1a0dba68321d585bd2bcd93f1b9e8308bd5185926feee2a00ccafa1abd7a9a506d4c7476c0164472bc45dda388e6aaa2106ae1f42648cdd3c1abd8ea3ba9fe1f714d0d2d69efc2d6f1af34d3a72ff2ae7e77493946a88b7424a65ea8a107da68ca81ed029c1463d7275b8755f2d4fb7c5bf933d82da8ac0faa4d13fc8a1eafdadd7d8c9cc30e9811a1fd4d910860359a3d832a5757b39014d702614c5358fec42ea274329b48e01505f6e02b347c31869787a54d6143e8121f58ff2e894147e332932c8a714ddc4fd7cae76b23636fdffe893d10b6e4049607c32609b8520b868dc22dfae1a7dd207bfbdbf731c050f4d70a4a47e51e85ff04d37e646d25ba4ca4b1e11a68c17335870c36560c0d8573b57d5569584decdbbb0c70c4f416f493fbe4fe4f73352f0d6d7e7eedfec55dbb2e7506ebad1c99ba7ed0a5b1f9b01afb07cdce20ad7d70f6b3b52e45a6627a598663a7454fe52cf9e4b275a1ea7bcdf06ceee9345404d9bfee62cce38f7f4bdd71dbef0cbd4207387134692b42f45e027fcad7e11355d99761e9c35e16765295554016b861bdc8e498e91894af947bafd4e402bd77faf13bd2ccaa0bd7e21f3fc532e6def9b2d29ce012ec946cf68766f0bd022fde6ea10ba58df973404d123b2616b7c6d1bbc4bfdb745da1277501b647d84eced32b79955e903a2aec01cbf61c7e022686530fcbef7ff4214b9a8b1c6ea85100d2bbdb576295d4a937babd1f0ceb7e6483f3244f908838bb65f18417c9bfa16c799a56c055e16164bfd256047bb155076726a2c9633fa3c5f2f47d16ed80c87824316c6ead1558f3e0e33754ed924e958c67fbb7ec08cde76f3de6c84e9e3e9a5f2b9cc0dca433bd4767d17ed6f0c3857021afa97f760f865718417a615a6c79a6e3685579008a476fcaa4e0cc4f5c6dcf0e2efca1f9f129372e2dcbca57ea6c87f34faae6dcb528a6a6222932106194d5680a4008270b568bda0c2aee1921097ed5b31fca7b4cc7a864f9c6ace67bb13fd9b211f66fc674c1c65d164110b8c6f7f54342787ed9aac1917c37913413497addc6c10146bb3a755d912c67d10a3b8fec70b18559b448aea62a0a938bc0a402dea8fbcd4e41ee131a58cbd6dcadbda335bbcb859e9527ac3d939e084ffc775476f920aee8f32627871482f2860bf3de3b951eedbfd4de66a2398074033f2a0c1107be1a9957693f2e44c06f7fbd44ad989d1a122ffbd35a8e9c507b57f14286477542b4e1e72da66a7a22822c3a467dc7245bb771828cf45d3c6c6280cb475f84c25cf2551afa09e62527ff1dfb6fdb31cb423226f181c0988a52ee4015aef4536f4b57657b44e60bc62f1ab789275273026c16b2e1484bcb16a2630878ffe12decbc58958094a755ddc689ab5c1350056a47d997aa56f25f51b9553c6d90a29ecb1e7a57b37fea5eec7cb04bfcaa70635343ff67e51450dfdc26596e5c37b5007af0314e8c5d0b7172c0232bd35320076e1efc85fa36e3c71667d410dd2b950d7cb011cc83b2a757f12f46cd88b3db8c0b075584820527af810c59c65902cf1050fc906432273a5cf818bfa385232f4bcabb9ee5f52598f3ac725ee16843cfa3983431a80011310ae82ae230415787d12d9a4d2ccc0ec42e0938581473652351a2e589fa860727ec51b45306559771b69421c4bb8f2715c927ccd9b212fd4685118eedfe2c7f8b7bc56396982a8979569ef0aa24b7152a6f78be585ccf62c5c8649ee2057bf0d823a3b7016848940b5bbe75720acc4f5e5b8c7b5876f13c0d960ca41ab2ecf19a8e7d1d37f9285da410732e90a0473c4e47c3926e8320ffaa787a2cdc8908084f26c204aecd523cd02f4d9aaab7a07256aece71ef23e71418da4d97cbea559b6257130bea474eb81c02be3814a3707823eb0db86ebbbc1fc545f7835d794e2170c9d0a15f098655f435458552e62fb42296f1d471cd18895c45f85df5986a3106e99b53918691acd52164110a0246bcdf3d1b347cda64c73a54d0b648da22507120c3910640e9134b719a599e8a5e08b6480a770466598febfd00fabbb11ef65c19f9f841bb052fd38068cd84e0ce2e4432101a9ce34f19eda919b9c2bfa899343faee7c8776e68e9e85feb51a82f7405a5fc7d9ae3be1bbbd37b61f24867cf760c42edfee89d451b03d0418932ea9076fdf03ea2fa4efbd316b691cf0dd4ffbe0a667979910a4ac38d7a5e902397fa14b4cbcc39794a40cfed5bb7bd5268a068a47a28bd034df09fcfaea10afca0176b64cfb4c2e358610ec1cb4241c8ab67f2750e7a3db1d0ccfc64fd975e20ab8ee7887c76d3eaf1f32c2e95c000c305ad07f683cc701f2b3665c7e7d01e3202b7258a7280e0d2af7d84ae3bcf5ef40fe605a38abdf8bdc5c36862edb9af935e3681f512617e4cd946c4ab3dbec0be42a9780673bd3c10290a70e07fd296e71663a952fca700bc080548b00c1ceaa4267ddb99ef48beb8dd621bbb3ea9788fb3e4e82e91b02ca2c43fad573778112823c9acc85dff051a4b70c54d7aaca90fcf20eae2721b3693963c4f0b404ef8bcd323682c303e83b70bad0a21e46accd9b0be1e190e56c2f0e6a1ca36a70fe5f4bd019a301695cf01867d56d2dc5248901102ee2cc6e1666d4e069b73dc498d4239eacf7e61735b9c546837caf2f190a55895f7a84c59754b24b12f5d707a4347e2455451b1759de9fe043994a8c759ac0ffdb7160f0d941d1358122dd410ac583eb7d574771b2a7cdbc7b8aa6e51f7f6af90a8f07f9c27758251d09fa7ab2d05b7a8df3132b275b786295186c41ff017aff549b22e73c3d70a44e71d4bb849c2d59ebe2274f9f44c75bf70b44a9fd6a1999215f58c32eda41397c21130b6873221101eb2ae404a8e32e0b2bd52401006e50d9a152947f97f26c0fe26073469b622936d8c5f33dd0f3633740c8baf30da2abe42ab76219bcacc56f7c63fa065d1429f1709f8332042083e511c473bbd7dc33aac23036e39196cd05b7c3a8900160999c7a619ccb8c92157c67725841a7456e94306517c55dd90b375b2885cccf6f029ebfb246f0af70a1640a7a706ec405e6083efd0da76a9c076e2f3c9aa20f69ec5f073b8a89b6e2af04c283c4287843236fb2a12071fe084a13fca4eefb0876dd4719a36f7ee912c8c657355a580927ab3255f8590b62455b8c8a0b89bd03bc5fbebf93feb790257311903a3ce7c0da08b7efabbf5ede7ac243a11774d24866f92cbfb33e1cf346394e363772bbe584c26848615a50b9cf089e0970b6201f9a34f9e2aa37965a9ba1e311d702bec04c5fac27c333ca3d6db40789bf5791d080968df021f10b0c4c3339e9bff6d6985b69ea567851b5b07c4ee5ebac600ca242a950b1bf7565528277b8869a55edb7d9688c9b29bdf75b235fa0f5ded878df05f5abed2dca8a7465f6c8b00e28ea63ede2f9bf7e7d7a868b6ea070fec7bfcdf401046b12f864ba1c37d22ec376b5e5bf61998a1e9b2479dc034c23b336c8b43455c4f41708d96bd0c23cc963473685786cd4c3b21edf7b3da60ed8a62b7bdef0795450e401d3d1a820704993a4558a408c1234e10f92d5d6e04d557fb1c0924ef61a4720eb3932cdd8d476fd93fa3e3e47bba3547525d0d0387263e5cd7f17765280a073cef3d76672d217491f0de79b2837d9b3587fb25337e3ca8089a0b69118ed2587b3e8089c77d1f61f4d76ce7eb4ee9ea5c18ac386630952f9ec0bb7c7cdc99c01a1020d976e39d925271d3b107549b9d2b62d4d92474cc3f8fea9623ffb7bce8ca1282d7edf718906b4ea7579f2aef4e34250969f6815e424c860fe22296d83ceba42b17952e3ce68fcc6c6e0b38615806adbe7d450ca7e265119d597e006836ff439e1b250f66ff40897746d413ae55038b7885986d559a5a2bd2dc7a7ae951857f3054e60123651df47c84a23302cfcb3cac157929c3d4ac1324fda06cd8371ec5965780b9fe92789bc0a9ce1d2b22be3fddaf6fd89f2bdb86283f785cb1321ba534956d80551200fe0828e04873e86d1391a5d4d023fa58f331146ad110ed1c9caf8104fad36e27899784513b69ab58464cbb50d71eeab4c8f40f005053b2822a4bbcff8fd6015ccd133ec96c98c5f04673325c23dc576f95d591d161064cfcccbdabb5c5e9662146ffca91527dd2c5a2b9ad6f6ce8daf9d85a4f4669b4f6dcf259dfb0239a271575b1ba4193855c68d974aef308c0dfd41ee699e7f0cc5ab349c4bb872f44ae99d7dd8072964bbd2a5928a99f9df0f09ec82f043e9cc8e3102172e1935f95772eebd7af7ce13d9fbab06a1fcd82f597aa62880092a4472a6417d8c47d2ae90b653034b9e8fad75e6a6dad83f55e4b5f977c8631bccdb39b2fab8ae69d17dbf5ad3379124f49a583e9ef6778bf866e92e684bdf9f57f8aafe34afdca8bbcdaa09774195b185424aa99c42c6074a1dbdc080973dbe51058f32f74a5e2c17051a6946099f6bcb0e12cfa6a60cdcd272fb58c895c59f4469aef64b717b1c6d8fd7224877f77d4d647a5ac70a933118cb699d462dbe6bb78ccff0390c7ca046d2a9dd8574e40d93ad48ef0456a12fa591d1380448724933d6bccbc803a9e22836584206e6af442652453867727ffd002df9d00acc27623faf3c2d013e4a079e23abf8d2b7a1498db939ddf74675c5b105a90e5ea326dd637f16bfeaa6a73a2d016ca8f1cd0045504cec86bcbacaac4183ab9a0ab3b7e327ae13288e2108a15f3861f96c12145ff87225dabfb7c8dc370ec61b16e6219c14a4fb10f298b464bb3053944a6c27c00c92ae810723b57d1b0dc1398822ae2fb1c9962120f4f4acc952092093c57f8f14164d249ce8dab676ea659d6a51a4c58686ab011f1b10a112044d464f0465f59965cb6b87ec7fb0cf0c7aefc35a4c851c410458f7f7506a1dafe5ae8711211a22e7effdcf19ec93aedbc8d69c25ee98fa6367cfb16ffb3072bc9aff43d4fb25370483837c5568869bbf16fbfc9ad225a9559d0d536a5b1a9a9134e189353b3e60244da4978a3cb11f202d06eba13f55af7e6ebbe8d2b6511c987bfe631c288f26af1709279fb13dc166d69e72227f509645a181758e55fc803837fbd8710b3d100da759347c0d520af9d76b9705d83de5140006048680444fd82f83f01c2c73a7a6c53dc70998178142f81764329344255251f39ca27f5110e22c3cb405d35771e33b5de62e9cb5aea70347e191f78fdd665def46ca994a4bbdf6ce2b144811f82ad0609cd35f541991bea5150b4e4395baeca309e6175789d155e25e32d2cac4e44befeee02a1a4b69f3d90886de8bd6b5c6b7edde41a2508611205345bbaa5b7a75b1e63d4532cb95688bc2ebf18d26bfb2d2fa9a5f502b44f12f143649d84752164f8bd2f8c2217fe6624c23cd711040799c3902b98c9f73beb8a9eec57d10d6f670e5878bf3d68d3406ad15ba6019a0e3bfb1ff977c367b4062185477c03c6ddcbdfd4545ec71291c20eda80282cb48b8e06a77404877c43fd66b4fa6ca557e91dddaf270d67aba645815c6ecfead9ec0aa6d54fd19eab683bbaac99bc2e373de79847852d879a8d5552b56bffc470bc3c2c17c161718bad3badba99fd16cb3893904bd331bf75a37c03a3fc4a622f888d36ed9d3698836f97b08d7f81f7aa65ac461ab5dc67c3a5240476b4322c5cbd8837d517b38c294bba5383aeed394b41bc3a32917028eafed7e5cc18398b8ee7b7af5ce58ab4f3ae2e074bccb16434592ddd31ea8f7b721d2218029ce3184c73961de37b0ebb69236d6c344d50f0dc188bbf87459cc7ef8c7d2bc8b6a14b0c0dae04174cc1f7f027e2c2dbb56e77d90c6051a1272aa6b9d953917cfa06bc43f259e256cf47033f4848dba0794c5181a116241e03bb8077604fd99deb85b49aee3449209700659cf0e9f7311d8d268c8347a76c6fb1fd9ecdbc74a9efa0ec674dc799032870879fbe50a5fc16935f400f5f6c0acfc066a68e43e33f8aeacc3f9d8e628cf829e1ce0d17786009117442b1e7e287a84964050e50b5bd41b5cc8a59f3361c9a9f2c9e6998ef1b496a0e1b275b9b518dcf6e50da7d5ca1b8a475ee0f80744064429087507f6a7c6c1f752fbc3506f6e4c50e108f24589b343950c12ad0ad76f9b6e61f5e158b01f5a451f70cfea5e651bc9baa88d039f868e6d5ba384e524ecf6e75dcef05b15a5a9b1d17863308be3938bfa5442b6147bb3f7d2fb464033669cbc8368fca8dd42f564ef7a45cafdd1fabe2876d706f179f95df982bbc20ac3d6165b2bcde610dd888601e03e5fbc189989cd75159d3d6aaac458a1aa14b3edec1d6e802abeb75ea83e8f111697d19eb81570b9c42000350c5678bedcde36ca26f843cddcd8d9ac9eb42275951c434d9f8a99aaac3a42c2683be0431ac79944cbd0637bacdb7eb1b211417483931a0c950fd1b094910cf9059b18962a77e64225cc54f35f70ae542b7d7576a7a75fc2e3cc9e3346cd65c22d9da921d49725ab7a15a09cc03e727d531f45e3cafe1959d2ea8b9b8897560526691a4ae2cf5c6913d2cedd96eed11470203923b44050b8a8911d502397e6aa3928f37b1ac69563382c6720a827d402cba7d99e2d160cc7ade8debadf741d99ae02bd1b4625d781314bf2ccbf92822dacddaebdfd28566e2b18554183d603bacd1efe922c932bab4556f749a3d6e37e5aea3fe6eb1d359568480a4ed967a1f5dda5414795b997c9bd75fffe1c9cffdd1ff51482c19db224ada18647a7ccfe3328be0ba4483e26c3e1d29155f28cdf334126b6fa4552d403424b5096b6b0225af492e6100fccdd81f99235b5ec4d8a6609a6acb440e1a31b6f6df0a1ceb916548a4959f3b008c6ec4de07386d4880860bf9d7e1a79f527527c30efd2b68fe107320aedb6f49ce8ea25e2d43170e46207ab33b593ba346991b0bbd49038db8b5d34fd28bfa3304b64c8c0df1c890a9f45158ed886c94670c1553727421a451d3dd74b9577856bf8437fa31db0e6a1c70144d96f5d6fd444c8b1cb715225749e8e641cb94661f6f66d92b314555152e323813a037f7486ee900ca038272111163a23971e9501784dcc49174e7490c5f99214d91b54a00375ffb0dd0729d6c38e285ce54bca2b9a0647ebf853736ca1143845df3f44bbf4e1ffe4ab63c00c330c40572dc84fa80428c5c27da9bcad8f39fc5c74f7b78c003b77ef32d6548a099b6a5b981e8a405dbb3014cfdab51b3672c6a0bfcc15dcd08a4e1a99e74d19ec408eb24ed4e5ba4ec86f2a156ec87d3fc67e5ae945c6730bd66ead091f1381840594a27672c6e07e556a4c78eb5c9d513e0dd219eb32195a27bef0a9040e8a7af1647439809778966d09c220dbd84115e059507844c2966586262aa220a7fb760ce770be87bf4b3d1534d334c5a63232b64b1c2edadcb1d3fa8ea51bfb449e1f5f03dd2e0fa6211c57d3c8dc322d3851c8cb7d6235ea334d8cdea73d1b4f391ef1a105b09eb4c2da3acee942a9d51a1a1cc2bd3ddb52e57a43fe792f0a2e951acbaa2e6dbe51f520c60d7e8bb206a234bc1622e6567e8c0327d7631a504b7abcf304a18cf6e583960478cfe2d5289648b0b1f5852ed4f38f404fac26730cb0ac7399a636ced835e3fbf8246d9ba3bffdfe797d44e9bee1c7974f9e7afddbfe91534f8493cf92d1b0b473c4548be0e5fcb058044911a21d5233c07f3f761f2d14991085ca807c1fa435d2f8c02e45d0edce35d0bc2dea70da1c88989c643f05dc4fc3ef046afce96888fe08d90a3b47765ef72ac6c6fda2045b9131ba51a54e927c500b68137bf5a3b5de3cc6a92b14426a885a8f63437b7af7c192c1c4b8d0dd299e211f05620cfec259dbb0937bfdf7f9cfa83e8c24c3e4f80202d846e053665d977950c817f621b9592fbe4e95cb3e14b45cfbca0841e9673bcb275e859ed420225a24e2047bb3a1c57e1964df46bec21fbdf0a357be324b5433d7940f7ad07a270ec3dd8f635d838411e85dc335200bf81442a1790267ac34831070e7af02748fdb54412275c666803054bfa7610bf727a91c4cd7d52f92c502f97b73051115400aff94247a9652a0238514f593288f95c4a42bd7ff3206eefabb3c1c44a66623e2ee60fd3b7750cc31a2e314911fda28ad02c6e247190f97b17d3b4a33686d20ad462c147d0f66eca3d3b56c2397e0c9ab5fa561768cb6a8706801669b003420b13281d30b069fe9c14211651338aa6108e351ba5432020a7fa415d64415c30938d8e6a1ac0500a9d3147f6728ab3fd60ab55157a9b4fba32658ff04f65020c58860e3e627b49315217487da2998a812fafe2d9e3db9a95cadad48567959553ae9f3000b45ba5f15f388b226dfa6ebfb20e56ef9d8ea151e5bca773694d76a52a5b9c676cec06c92907887b3127e127bc3939bcf41ef46cf7ad7140b117265f303d9bc908a6dc372416d8fea89c824792c2f3c87416f445850fea83db6d350074a7b6bc1406a6b9f4e8f50310e2b2adca4e2d98ba01318a22665ba344ca23275c3c95972ba5e6cffff0554f1674f2b8e71d4fb422682c9944334d2579a861425b6e81009bef2cf7c9bf823935ddd2f76db2c29149a645f15f19478106a28fdff6a0318f015ce9bfd6c8f437db87d3f7c2c13ec69c663e30f76ad35c78230f5eb2940f78d8799d869b8f33e1940d66188aab0cba970255c691ba690e2ab4505d139c7374adbfb8eaac84b9ccebd919f829f2c4e3c6152d20b28a712caad0f3399e3c15f8edb9ec6a7e4c0e303f655015251aefd8b61934ddde5da41e75038892b6f56f8c04d278848547a9d22b4cb8ee1095f61fc3890d6c69965a8a15c650f6f25ad894afa41da755fa05192bf9b4e150e6601f8adf074b18e70cc619840cc4e4def9a93aa92c6164e5a88bbdf6c49d7aaec65e8895b30830a24378dcd71c8ae2e43b40324c2531369d2c905dce6881023191632947b112556a8708fc3a00b7911d25e02327a8954f82d9cd87db212a6c2149b4096f51f7fba25ffcd42749e953ec420f89a6271c24396899c8b78ef83cf067c78577462797dc36db1129588ecfd40824d25211243923319b9cfdf288d921642449e9ee3fce9a940a1faacd164966e0d699b6075c02c2cd3970e90c4ae526d740b351ba9ee44000307c46182e7507748b5c4c6a0225aaa409e1333cbcd59329a34e294bc39d7ef3b4a365ba15c7583bb9768fc9d4f64d5e637a56f46d1ed8e3d296eb125c3ea9f72d2194339aa4bb9ef784ea9743192d44fc88bec3ca457a9e451a119eb76c5382f0734c04fbb1b426bc13f762baf2bd003bb8e53b52ddfaa171442751638afe1fb51517bed762c46b7d8030accb079f08876764cb954ccba5eda1b6caff3f2c25d18361b1ac3c8ec5c27620f5e1ec25d68630b7e51016800420bf2a7bc8ed404ddc4ac49df8a355ce114242aeae04f3e2be81492841cf9a54a0f90cd48f19ecf03bd7bad43b3bcbfce09100577de68bc576f5b2f5b8dc8d0ff4fbd875804974a586b6bee4e27a53dac6def480d0055ff765fa6fedc3c1daae731407df6af099e633744b508cc38fd02a8899bb42e5d2e0f20bea71112405b8c1ee35629da3af2ac87cda97a8bbd285822a6a47550c971ab1a6bd102f5780a767f6cbbfa6d736fbcc4cf73ab4d7be537420e0e574ee1f2d1b5 MD = 6730a70ed95c48d1fa1c04dd32c192337ab47f4df3c6a1e9d101c0983cceded1a10ab25fe0437de24a6f9e3848f892c2327fc7fa6a0fb1854d81bf05d9733573 Len = 73888 Msg = 645d27970ccce096d082fccfc1183955bad2611af0dd7c58c9d54430f28bd992ac04b65c66c5e4c6914d6dfdb0e4140eae93430675744557bc2cb57e20b537e377616601611b0dc61ff0993da9cfce6afa8dba76af2ce70cd05dd502ee43a73c6e7a1dcd2458c260247367d7d463cf3146c9acb1c590ca3cae728b0482be93633859c409d8036d5a45dcbe125a27802b394d0300e02557b2fe72becb04ae62217e0644fea4a5757d2c35883763a3471f7c23a5ab2875f435676658a09d997c3ee88783f1b1c542918186ac8e16608dd7b7537cfac4070a8c915540cb740949821de66b2d26eb3c5eebd5125f9ce5bb1991e36e34dd63028025475e94b38531b5c62be3f92ca0cbab132ca2f21dba37aeb2dd65a39a1242d9cb459a427f969c9e8a5cd29ceb6a5742a192448ec0686b5ec348488d249b345f2a55dc1f03c2f2061283225f8ad448e93c10e07dad76bdf06c2dff3ba2863fd9eb820c7164949bb506a7ba8a326306698cac5e050d6c972e549371f53d5cca11b5d11281cd91ff730dd182650aa1f98a3a70a66f08d360de248288031da33fcd314cd69764438608cf0862373b158913ee64a003c53280c983032bac69e605d607fa41fb5131993bf554424aec471fce4f8f35086d115fb71a1c42394aaa84f4dee339f4bde39ed527bd0ae446c0218106f94bc827f8657091d7b6f2e77924ee5e10a7cbd0e2ff9f0c4ca24e7107f9f5bbaacb891c70fabb8f3c6d1f69da4d8e308874c9b1b5225e4d08f2d094a40df215ab9e9473008661bc525008f756679afc53863389e471dd91fae3b1d720c740bc03aa315531712bc12147f5ba74dadb697ac7547ff852e381285b3b63028ea659bad9a7ea8a23de46b13b2dd9bc0e1920041e73bc782f37c59c43b460d2c9ed94d9124059930445f20b12f97db66c1cc9f972d767ec6fa2045e8465f619e2dd14663c42cbd47d276e36b6a1ceeb5aab0b62adc9a9dc7aece67404964b5d403e826c41f667d6f44b613a0d6df3e241908e46b691aad1b8dd15e8ad8f8a294bd885f008a45620d27a742001a415238a91fbad75779153913c36c26697d9026b73c6fc7994bf3a807c4fef79905b379b77fa9fd2c387e86dd3f40816f7607208d6ec977c0dcbad641999af5c77eea5de093225b5bcb31ab468f4c4a7f849008acaa0caf959a200e819fb6894a2f5f5b9114c4606ab3e70cec4e1fd00e0b93559178a9cd8be6bbb73431c23085999b09655ef0badd84f7223af61bc09f7da97dd85511501854f676c60a5e8a0e4025ddc9fc47a928b0fa91bf11c08aa87d4b07fdb9e3d5df5758b3d383dbd448a5784f3b5739e9e0ca59c1f51bce9cbd6cf08a5e3181dd25805af4d938dacdc94c1ad435fa37cb7a23ad49598e667542df225b96368bc49f4295b04393cbc504a67613467fc1ec697f6d7e78e448b2dd4659121243522ab130718caf2f3f588f472272e94288bb431002f7bfb7e5c3f1351d447ee2858defbc76d07855a606dda098899adcccb67b98163bba73ce27032de749189e965ccf492e323bb1804e544550bdd7b93e7c976a0fc0e5a2526a97833fb69bc1f515b489001865cd6ead9797d3862c622e6c1b28681dbdbe12fd32f79f136507225753de84f99303b1832c2aa97905524d036b35a7a8cf31906d49dd7dc5f0e8ce8011dc355c2fef098d66704b1d0f23fad12c34570886a75b1960a76464ebb12a2e72e489c6a909c72afb0b20d88631b863c286fea37089c3affc07db66a22af5b0fb9a0abfaace8aca4e4dd33227161629c2aff70019437a8f90615b51b0a091c6105f20ad81b7c509c4dacac04e4b94a1a131e8a4ed8ed046b2366cac93ac8ecc55c67426ea4ff65813148ff9884ca459e29f3c1869a67553c60977ddc7b95d4230427da23111af43ad9d8b444193d5b10b6a79c11a34ca35605d156bc9518db6346595a5e297404af8d8554726ab994580061a457bb45f7a05a3bded250f8096d6a254a89b3b69dc89577668940e7f95e504a5fc1a9fa5802a6fe9c8474dd6629b8b4330b7887c76d38d572f1636f910bed8a57b53712ce643341183bc871fb7f782e9d4c40908b86bfc700119bf865452148149c2b3661ae472ddb601559cf58f1bb0eb4d278f0fb72779953b02a7bf532ac1cdf4e0d1ac82bea6c592340ea9a6c8110abf8e8ffb4990ac41e69afdd0469dff9e46840009b279f5390bacc552f31ab2a997888bf997cab0adb8f2c93580e09331541761b0d8274196ba2a517fd885fe5e61bff38936380f2f0ea4ca3db695150d9a058740786924554a27438eeb9c5c7faa9f6728895b104c642b41773c1e0da974f8d127279215fb284e1c1e90b075a3dea1476625b67c8c55f0ff60a60de59b914befe34a448f0ed0e93b9d5c84a2618a6024b07fdcac755090349878c7253a6b8933e374f307f6d0933289c36b9b2f1a467f961c30188df073817d28ec452c603b3dc61c20194993c6817259d798631adec8956f43593c9225868d3aefddd81bcc7df9c44e2b7db71db8c5847b52a41893902d0da8d717d2208457233457d3fad7650cf1efb719a6e34921d7b93278700f56cb6bb32a961cff2b49767c3b8689c6936e29975493ffc1a2e5c803b036dd9c8cff0e04bc3dff0bec02a90a01964524899bcfb78c830e3356afd9fd6495ade5c34659101485e4f146e13f703259b97ba82478c2b74d6eb2e4de8208c7eb6d556a2ff167cbf46b29ac83ae41566763267f76a96b7d899dcaddf064b842ce8876122a5b6e3b0fee2fbd5879efe635bedf8030d5f4479e27d59293d67e7da5abc23bb3fba5ea3f0a7dd9de36fe5a4b38e15ab1830f9e11797db3276bedc11733c4475b66a172183c8e929349df2b2e7de65f97451fe97a2f2da039a968c589bce6d58f00e33b11f0fc68064714f145da591f4070a7c23e956ffa28f381f373a3c466dd6eedddc2c421caa593321527fab40a4baa39b0e568bf2193fecbc36b84c76bb50523b29122a95b0fd2b93f5b4b71b12766382de4f585a7090fa8bde7ec7a64a478175203a8fd79936a1ca846393ca4521945a1e3e87e0ad6ca9b5b6f2747d23a1c4b4490a398a6deedcf187f605f445a47c4a538ade2bdaba4262477d1da44d4863202debef57350c252e86d4d6411be8637b079b26e4fe620db9178888c2d022a6e053467be6f878c4a90a65ce5bced49314c1d926b2224b52e3b0797e80b519d41d4381a3debe1a018c9a11b4e7664f533e0aaca83e4d5f59089ab9c786031437fe860630e78fda23fcbf405290ec43ea21697c722f8785694e5bb12b7bc2fa15aca33be9ab74a07423005a6efb6797a1e466b14e2ed8a5cce07dc87207fbb5b74e228a98cf74543a29e5c7d1d3df33c0b089b302e349a8c8e4886563d3b52c650d8c5a03fe98debe36f6ef43be5dff8fac5bea56f5e174a68302f2c887f84767116812f3dee7264870bc3b8b64e7e3550163bf140da9f2aee475d667cbccee04813e1c301769142002be11736f88c75cd6299802d2a70a2730687908453a09858597df825226918d1284dac1844593ea5436deeaede5a55b8e644375a049803247f9c3b1372783d8c997ff3e4d282f48a211fa92056ba99027f09c7582023b53ecef30846d73d44a4e7ee6b2723883beea4252c2c33f000f2294eccf946b23309ffe8ec59d126a29cac1f9e59b7d779351525044cf6b9020a8d89b4c7d8f1e1186b0453a6e0d2fbd64e99f9e6f00f41101c85bdfd0f7430ae14511b4e573153dc98cbdac896b0950457d3fa796c8e07e222cda5a6ee9ff17f462b6cf7621f1fd911a5fe29534e228940543c6b9dd2523db07377e524bae8d0ab7f364d6a0989906e391a63b70a18e7a0a12c48048a94855e0d913242437b54acd2e3dadf8f4594f6ebcbe23282eca1f13146892105635b83f28e18b7d82d7dd2bd020a432ec84954349f3f4647124aaa8b17c983d12312bac8caf305d773bea5a42d662546764ffeb9e0d562a52e4435151c639d8c785d6b06d46bbccfe289ae0eb2790694f3fb6ed25d4f384b95114975c101ee85c7ae2d2336fd3d3ffe8154732dad6768b5ee1d1451070798eb442013a20ee75b956779b46f0207862c1821681b9db850309a92065887811b955f81853be5288c661bc920f914cc50ffc09d63f8a489d9f883661ef05b155227c5c6210b4f2276be5da3ff41cfcc2eee0d40ed316c4c74722af1c4a4fc34cb1719669d7c9755d9028f92a5e57da76e8b70846a725f80ae3203cdade2e57ff4f7bcfb511c4842f1d733fdcb60c8ee9e3c7d007227f8c6e5bca0721136a1574e2e42fcc276ec6a7fa0ed7dc6201c023c85a52d7aceb27fb9768357c51caa4b553f2dd387f8fe4cc0f41e7b2ccff172d80b6b641ad3271ba7f42f1700017adca8bee028183ef85a6445498e75acd3b0ef22325ca8d1c14b2fca061878819d7b97120c52d9a55523e828e11027635d5ce05ebc7fcb571b5ebf4c9ad485198cb8ceccf4fc62b8af29baf397b8b87fd8d76a355c35e8bf9ff6e5106fe3bc35c304be644c7d4a0570ec5b59bfd0af5ee0a0cb3a84178787c9742f99f7ce9472caffc46c856dd60824ec57afcc00827d0f59b1c2d6bd3e5c1286fd6dc4ed943d2f0a9f4a1246bd3d359a2e8a6eb0d876bf528c82c67f6389158fece049d9321149a59d71758056114d864e6e0a79f7c86b3bd9eec5d69dbb4cff6cb6190a047bb5515d9741b34720b72145bf11c486eebd66186b776b534f2365fb43950871f8fcbe4e1fe947e6e81d0b93122718fc560071d68d3d961ad13354271d504d00f57a1ced8ffec6ebd3f9a5b4fbbcffceaaeeef82c89b0f5acde73a6e97dd50481dd82dba4bd4a89c70a77029d045d18439d32fabb2120fa9b1c99930679ebaadce714142e81d759f5ad0fb70344446a39f47c2bfbe353f7e1954e11af106d4a883eff805e92ba65adee0b8169c5ab7b357d7394d5177174e6113b29cc8b836dedaaec271d3a1c3558971369b7cdbbd19dfec03c3104a1f9125808e24632579a73f2831251bf25525f6ece76d5a59bf6da400a2bf8f30c0fcd315c45034d0e5982e06b48e36afc43283ce5b0ab957572550bfa6a102cda3d7f66df58ec24d332823a4dd1bc83ca901dc8ff1f22e46ecb7526380063f7320c90bd3a25e9ffccaedbc9d0b6c252b6c2a5dcc5cc20dcb08ba15b6bf5d89c3c0368ff15b4e3252154f5559dfedf1ee960273edfbe8ec3633943703b52566222aa6ff4170bc0dffbac38a65bb1fa318bf20db7f4fd55e2ae5ec22e521ec79309890e63e9346a75823f0d83b3d8fbd1c300be0fac925b81ba81865d556112751b29ab153337c72fdd94dab54d7ac947b913a20eb1848ae8af2af7c5ef231f518011b0d39c1ac15435340805d09f4edb96b2217ca8dbc95eb4e27d2dc66dd66e60c98363cce73f2eb1a50038e54f71d48266a3203ca0ff2cf12f805f82461f16e2da8e8d6ca628037a71291933931a7ca4b690c313da169b8f9c6821ccb7e28f2ecb371b245d661cb71fea6f63723119252a502dd591f5f1b6ae9d3c4cc707226d24e8d39b16e0c19138ad011cf59ff42c4a4b262bcd84768def8778a97e7617c76e087f7ad87e3a3043d99807234a55e29fea76bd97ab743de68e9c8be417b6632fffe568ac28cebbc8d6fccb041b836fb093e432f65231ed1b1b729c02d2466af234ce0e98c6c65a500bf511a0fac8fa05af3a32f361f6c61794c081df9011033c110113a7406a3762e24b8100d06aab27a73e6795c00bf061634fe583375d5797fd4821de7e027786c2c5c22b83b2ab9de1b976e458b89281eee76ef7b1738e8a6069dd4769d64544132d7d29fde822efc7720ae80f45d5009f4fc442e49bcf9ea32df1e9e72ec7253e495903245438a6c033c9aacef9e065dd51906cba1d42592c5c05cce15125b0a9e2ffc0e23e134933c25b317e1edc380fb37a7e1a40104664bec0f94088886ebdbf16681eedde608ae8698505faf0029f3e297feb4d61eab31acb77ea1b18e5e2aa4704c0aabf742c6d9baf4dd54549f4ba4677178c5ccf823acd4ec952fc9f81693a9aafbdde0c811998b63cf9029876ef786f85452a7c37e46f87c4745d2400c59635d56e64b0f1b409a2bcad50748da5686d1dc0f2793ce15929c2cb62fac98604da190579e8e405957cb4385767a1a3be7cc744dd4ff7f9323cad9d34ab42742b9363c9443dc2d5e54b0be33ef81ab221a16b1b1385d2f3a3c96c33fabfd556b4679b03ee36f3eca017abf62eb0609a39e6f18bbba3339953d6e7d5ddbce9f6465faafb9e5cdf126fe87bb94e15db23af5241ddfe3184b1eb6e06cb052ce51a8a8176f97d35ef0ffac76373c7b1f4142bed445903b82c041296b15c9996338b27d7e845b34b89aae8bb4b6ec00c113754c0e046f3c0935a7158d0d1c1833a11c669e826672617ace2cd1bf062ac9c52d3d2feeef5cf217bafbb4b72a77a62730f3d5fe6c24cffde8f04bb42d41bfb2e4f2c8797326f3e2e75c70a877003137ba95d33cbeb47ab05986814ac3fe1989371d4618ad127523c6b85f55847a6b5ef3dd14e1e0a9f81eca4010c75cb84d949e1d4760ffb7fc56e38fcf52d52ecb098729f962649daeb5a5cd88ce79f8e28174634ac6dd800ff8a8535f04db95c6d3ef1d1f52dce824f1667f47d48e487ecc649faedee8f316958f936cf01a57f52a9626f5279c11e17e96f5dc5e1c1f58c1e913020d8499b69a23d097b913edbc8a06b7f94534b37aa9b191c4efa5f6272e7c7dd2d742dc4682ef8b6db45abfa38edb70ba503945470f40f38fedbe65505e9920afb0a6436cfc5d343d66415640856ec1a6cd1c3fdd1bcf9b9bfcb7d57adec9bbe74e21579042f76ba5638a39fa2a4b3b5d10500bb35ba7ea878144cefd2b789017f4369137134882242077e356c9fb3e3bce6751404b7470c11fc7ca5dc1305db0477888e7c9cb284811acdaed00e95ac15bd4792a67bfced71cc350134c8b755ecc499728f2e9be7fdb9b99034ba0018c4d2a1bd84ce445382cb9e8c409e46761d73c44511b3eb539d2c6a65026c9d30b26da91c0478c7472b43e0cd695d5b4780cb33916af44cd149ba07b4a1ea14fbc5d687378f402ed0547a224c17cc9dcefd160bdd01b66467e9acb80679fc0c81e65464968eef21f7e5b98d92b3b4b5157d9a77b240c4db20664aa7e2f26c2dcbfe3168c2674d47c3c7484926a3dd4a24e6a19d978ee55a01a6dcf9d0740120e0f3b3ba428422493ce06f7d90510f05012271a51453e0891492aad95867828dc9af23839e4b36ce6a1976525923128eb61752b8b1f87e0f6012fc6d0333b81b8c18c9ea5f26517f565ba4ef0883ad8c4baf8efef7e38795ed0f19dd58406b733318ec180c7c3a04078c437c25d8aaa7c6d06c9e6d7dc3c2c46f4a52e0f7623dc596d5342db4ba0485959923398acf88316433c09c2ef93fec1cd7f421be67204b79cd674a389928d95fef0acb01e5d793522c8e0a5ff3b36dfc08eaa5fe40c4ccab1ad9ec6f9f170ad18c5963a4b33bf5829f2d417677c750f9245df420b6d2501304b19ac1937920d2ba3989dd035d5edcd3c8c9dd4e239cfa7574948a91f2e099d518dd963ff8244cbfd2c6149be5d648128528fa406e59e641580fa699cb8225d3353c56693a1d26e44ba1af447a66aea28ce83714508fa7d130eddb9606409f48313f69dae7134871cca317c6c414f6cc0690fb947347246d25b4904f4a22ef7a336e385aa80e9aae7f52b4e96dea08d81ba9ad867c89455d5fee2f8d402ffeb2645229b1251703e28a39ee751af0cc0ef2bab7b3165bf2e805221f18906fb237eb72a5a605356e5715dd2e31752d2bb6b44b80e3e7c713573fd9c8b8e1eaf453f1561502f071c05349c8dae626a90b1788e570dd97d490f2379a9235dba9ad4c9e87df8d90d2e21f4d815c5cd56c567a970fef6bcf8a510112ede55627b3c36b198c6d0f8a60bc034a901a5b297ff2270951655337f23fccfb5a29e46d1020f88bed255089233646687e7eabcae9c96605333a5e7613409b186ac6a854c9aa3b1b33711733243932ced1ee1361b2c17fb33ed65435f63db591a4246785e54b7bf2e5b82e306aab0da514d45d96e3c4b93cf9a2fd1ba11f638f91abeca86cea02378b615b29fd762014cc974f1082b95ec8ec0421d11ecced3ab7c4fe64676e1613aed667c6e680b344839fb2789a87b47ea06587fe752e9bb9a0d56461ddc100aed57e1aae2cb30e5dc0544d75301804879c2ef84bac2cb435d448e748d6ca082f88c13b8ad7f578860c1eeab04e53950b68c53c5fcdad82d5d9834fc15a7175bf4f079401f0303be7ee654fd0fb20b1318d941be4df9b4bc239f06473729e9185b3b8ebbc7d4b9da9ee91457e40679e2192015d7febdd58237cf5ed072539a2aa3b3c0962892ee7f4940a94622410a504ff76c9daf85bf12128fcb4247c2af15570fcb69c19c160ef69380423af040e025d5a289d0efd5ee4c76c7f737d59c6afd85eb91237ec52c3f4845d6ae92921423315427035abe693e0ad179c32af69e0fdcbdc6bea970397bd5466dedb6826ed090fdff9764dd256fc274446a312210f67ace5503baabc944d11e8288caa642a68afc7e3d8cb6a57a242cd19d76b37649c679d68300dc5e22b24acef04d52422d65fc1d4640df6bb5a667cbfd6a3f3082666cc5cd4a866a8dff377dc4cd2aefcdd87977421fbbeadadfb17dda8a09d238d0f3ad32c63e70ff2e814976b8a4ae1058d0f6d177e0a532169671e564c7ddc57ccae7642278f3eeb6a49c769e440f9d5daf2644e7c21d540183427e68edb5c0e04f2ed1ddaa85d52e0e0144fc7d76bd5d60704cfde4c5c927046a3634dfecb391eccdfc5667896b0b49f28241d58608de918f2a18dd3109eda6438d2732f50618405f443b1480f8c4d4fa8f0cd0bff867cebd9cc70fe18ecbc588e3de7b6130d9d65d59ea55ff06e13b83fbbbf387147f54a5f596e149c047fe84eab91db3dc5d1b32ade290762de6ea1938edb27dd58befb2c4f715fc66f8cdd202559e6f61288b99a0c24868d65c6d34c7009206c423dc6e9b66025bcb44afeabb2271e657a2a3dce2e8025988a8317136a316a468cdc753e9622afa65b2015985ae3ccb3871f086e4f242cabd60d3390833b4e92be02ced2f8a145adec78e88e25753807c1d0e22174f8e3f0d0cdef6ac30f147961169b4ee3c42ff9f0b941361cc5aa8aafa3928fa7e4918c0029154932950422fc82a2596073b4b1ef4ae63846bc6a64d901e261efd080aaee8a6bd7d9b665b517adac9c76961dfd6f959f3bac40bfbcc753983f55a4f6702359bbb9bf58815c3aff80bf2d16b206fa0136e7543af3ba02ff7dd0df483c0626fccb9aec649e3deee0e8698dd9bbf417f671e648934c88116f59bd97a49a957fdd632069c30580bab8aa429fc880ef4fdc1add9031134b7c09f4ad85a15745b7624df33d5bfe4e27ef8ff36acb491e281cf77732fe8f2ecc371549b025bd3d55f550bc7016d0cfbced5f24f6cb5da92c1cd15a38e10a5688608639201912a6e1fd33230bdbc52a011be27c4cae05b9e3456f2ea9c1caee38eb0d24dd669fa7e3e2bfcf159123887edfdfa4735e8976d4ff9b9c8e88181c644273b3f0f2ac69e40bbc6996223310bca2204473c1310787b31b4bee1d3c0895cc7f8d60a781146ce2f29897753deb42cd6b0355c1449484c7b8e5d1687edc52f1fb5a356c65cf01ce28051e72894098c6898920450c4754a53a0f405126bd2419adc47728a2c22d37285836015e3847f7427fdc34cf467eb3697341c07bd592ac5f712fc57e167785b838e40a06fbd6c65d8d9278d6b98a5b0db9df9dc64c2412d709652a42f36721a14d3275c7b0cd9da45a49f869c90004ed891fd04f4a62b4de351f3f35808671aa40272aea7fb5e3dd8f099cd09d6915d2890b415ef6d5f83b9d67eca1e65bde9db9cb12b6911400d1d3da4c525f4df88464aad93b780447b8e84419cc4c6fd1415f2713750e755c48cfc5f038343214cbc0047e2ef9770a1bbebfaeffdb48b05ddb42166d1e5d5f0a2bd170cb46a2d16f4622197ea1b7a72dc9de9382bb70e4bad42504e8e75671de8e07b450bd2497379d0b9374974b88b6aeabb19d136fd620f3d6c32c94e7fa8da06da512c141ceec6dc7d25804bb137e182eee980bcbed56e05f3d814b9962e00a0e2958787fde56605fc0720f90b24cad6e33bacd0e902642c7583134f2119c74ef29690d69303d1cda4409e151cce91573694d7ebf2956c217fe83797c6f8c851a8e8ea6842a6949404566a186c81ef945769749671faf075616be3fbfe577e6963e0f6c5a35a2909aadd278b810b101ed44e1548ddaf9ba8c882bb142d9243f6b23348672baaf99ef63938e6e0b6ad472b972c7b9c2fc82c23c12f48db45c37a224451c541f590b474ff10a3021131bdcbf94cb743f7f08ff19bb3328dfe7764128895889ce688eaa59361486ba727d333d8d8844b94cf34b096d949cc08da553194960982da4cc2169a8d6f93e51a3801aa625b49829ecaef4713f6fc1166cdddecd5c09a6d46ab367917510157634cb4027ca4944df9b31c0105d2c494972e95f5d75659fc213693b371c54a8a9d91a9658a18d2536a7db568f1658bfef607e8441d23282346d49cde3f14b5db43a770480cf07a3f5b9b59e39917d8dd0dda535c09dfbb6f3205e05dc1c7f9d5efee972e97f3f27e678c58055f7221ab492655a23fb45a3c7d5adcc6cc678d16ece79c8d9d7be17cf8d15e52a6fd0ce6326c6dbb3169ab177344008d917bc5fad512dee99ff0bdd799fadb301220e11a442d0a0b5168148cde41ea36c36d5b1e3300fcd7120aedfac5793d42238644b418e8c91742383d08f8e4f836d4c4b2dd712274ba86230872f5dd12ed5d85ae400b10197376327b186d9dc922480a43d53a07b5188ec183ccc586fab622a7944aa5437984501f5537a6eccb6d8fb6a481d8216c857e7ee6549f07332105748d4071e377de723751f33f427d9d3e424b6fe5ffd965e7a3b6c6fcee7aa298750fadeb8082f65f2307b7814f5e25b645beebedf3aa5e5ce85b8069ad2fdf3e1171ff8c9b2950795add012763fb9b9a3965a25abd3db340a57b1d6fb3d12b78e27ac1efa3e9615347487cac10d4635c85d61fb6bd322925736bfa69a2fd1bcb6080716f3b31cd6f90e06669d657116fc386b07c63f6149ddac4a401fb0224c7f409aa85b190e930a02b7aeb45122a666b0e0126521809fc340ba6a31c8edad1459cc9edb7953948fd8016cabd8412b2f4c29e4f08066dd327b77ed78801a289bdb04bf1adad521b1194b662d02b6ee7e95ac450e65fd4a51e3e9919edf91053d4cacd2c1447b82974cff65e0d869377c12d2fd67d72c304902791d48ee3b8c21362ba077bf2dfe6bf984316c61424e504b03d3a4dedbd541608d5b20b4fe057020e9f1e554d3de52a842927aa62a7a24c8a8916d82f28262838f11ce39c3b751934e8cb20a566b76e2a150b2ad07041d1227fd69cc5a7fd4f5e508fa8573ebed16c23b87ea9ceaff2e0932bb80c33465b0eae041c3f914be3ef9084ba1f4e96b31adc40cfa8ea61515e2023e274452242a57019d70b88948e431d9699430f9f46c77f0e84414e6de1e9486e2a874a68109d82a23d97f259c71f742fd660d63b0508887c4d017f185d18787500d3978a5d3d4217e083732df6db20caf1f756ec664485147a47d1030b623cc2f5e7d0fb813b3af5405c6f63c5ec9ff26c84f635f3020161aca308b0856d11f28a127b4e14edc9c4ed616bad9cea6e30b69838aa23d769de44a16aa3438f746e3e01faf480eb9b013850ec5de44b0800508f82bb812b3af4e2a19b5dce4ff0a07224d4816dab1b34c1a956174494f9ebdaf988ec8384014007420f32ae34f333c7099c7733b2c6ca09b95d4c364eb04da654afbfb358394a13012ad44bc51892cd1eb7386b892a4b812f567f21dec7b0533f6b97993e6f6d964d92b52f76bd47d4d2b9578d94c233b869d6229fcbbcbe61f841169d9d004521a5cb57d1d07dbd7ec41757026c0b1d200740d928abebc2434dd4bf390a984b1598393ecb58c67e3b7155b97285716258764af524e5e156877e7af413fd83fa12a360cc947624048b58f8f15667919db23559294d003a059f28b84786ec7fdc8935d69395bf12eafee985811688f849cdc2dfc7e991623a0acb214c3a6dd86ce9fe0f3667aa0f9c06b1600b3b7ff1d12bbd5363830fd67e4ad42a5486d82a15c53a7ef782bd9682233f3cd25da33ade3c73588eb1d2234cefe25802f4e1e181ab99ba897f704447e4e15088c5991fbb7093539bfe9eb5206a641eda1ce19b1afd8a265e96587557bc566f813bd83d13787be93db1bc28833ad8033c677dc35c4b8a56d99fdcb63c29fcce7df8d70f50a4bb6dc683b0e9ffd1cc89cc5d0cd6b00628d09cd473836fae4311b1b51c030d95d075d8dd237600efa036ec661551d0cdd4081aecc3795cc9d7cdded92da4a4cc3975e7367a5900b4f18f2f3b3dd118f31a81d63132e4ae0d195757dd6280b0a8750274182bffa9f23ef70724dcb103267ac2514a4861bdd88642bf4a8113bbcb118ff20abef65707f70306bb788e29d8633e0eb08a8d16ccad0477a8dfda10947d930386b9d98266a8379077a7d4f779627970dc6fa3434a0c310360f54069a537a00b0492f5c6aed10956d1d111f68a06f92a566e60bde1125cf51b57f3216dce3b8b1ce0e79e40fffcac728ab191aaaf319d971d3201126dccdf307e4ed26ebfc9f6280a2b73bd838613a24b50732bf9b74d16e293976e6d14f428eecff7287adffecea53de1750a3a1f09896af5be44feab6e54f1fb459eca069d1ff2fa1b8de1e76918ab5228029d4110cb6d93b23f7c4b05eaf9a748716078e5986465c86774629ffad05016fb040c4087d4f7a837b4be662b0715e7935cbdaace70d4afa60bd2dbb26965f25212f321553d8c10dc3c4 MD = c49a67a96dccfe9597d5c1070077f46024b331f4b64d8713709f9ab3248ec7b95319da1ac43e0d67e2f3ac558943a5fd9ed2a67decbe6c873efe01f59db57cb8 Len = 74680 Msg = 223674f89f44f89f54660b3e32ddb843409eef7086a885d329947cf9d76e855f65c3c329b7fbd216e1e908b48ba1fad09a8a42310db48086246b9f9cc80c5ad42717fed59f86717edd5d731e468324e895d0c6a1c667c59c3446f4e8fe1b1ac8ae59ad631d8cddbd91ead5e6292a3d727b9903287b6a5bff9f4d04464044cd2244b2593dfab51fbd45b6b473fd3f4d55920c802ff2644a95adaa561c572f7cca2f4a89cafdab3e6441ec9b2d89695d7b2352c51cf4fe9b48a88273d30c832fa7b748c572f013429cccb20f7c975173cb75925a5949e055fed600e1d425e8eca326d5959d9998344c2f309ac8ed9e9a2dd2f5c84cb9b180a181492a866a08bda5c21882b3c2e01b5cb390c37954f9d78980a3965f0c192518ef88d550a588a996d53a131c3193ffb39df712f7940a34c7c8c34cf909c24a4b68e36b9c9c13b85ca562d141af5ae83b388f10ab7578b8d0f27d72817a51fa22368273d1184ff3e07bb9428803dddfdbcb8044fbbfec6b8a46fb916125713a85a08e7556e1e4610a9e67f05af7c3eb7b9df23750390d56de0c623000d2c8145ced2ffa95bf7b0bc35893632051b41503f70c6f13ad8480b48bddd8c64bfe8f8f668c89f57abcf7f1ef652140da5a645c21f676aae1f8f2f50c91101b57bcb30653ceaaded94e2f7dac06b4245a5ae06c63d9d47f9d12b287d7a96067bdaa89aafc1ce5b8a6dabb50d79ea432995f911c05dd0ff8ab7aca54344b5012466f1861a89fc3eca707a151b85477d45e0f80554e29b17fd2d741436ba06984bab36914a07fcbe0a57eeb679651b7717212b4fd88e6427bd9d1203bc3cf3226e12082ac2de386fd67e6a17cbbbdeb709e1135fdf93b485489116e268500345e825c6d0f95f37aabb7e8c9776dbf9c3ba8b40c3ee9514d71aa3f33ebfa5df595670f322720d931535b2c6d3ff57f513958a240a7a24fd83c04037872670bff3456e2d7da18ba335b1c5994be9b2692d27884d91f6b5e721c5e0344a31735daa1187c6612c3c1062dc21747dba6dce86ece01e0908ba6a17981ea9f6651010c467587e6b66b13342f15108d7e60c8d97524c25ce14b4ef0bc365e91a35c971f8a34a860ae56db45cbdde96e8f0f13ef4f406e55faf37fe44b4307234281209bd41f89dbe2cc3fbf68e14df2f7fce4b265eaaed3c3cb60078f708f5c2b08c4068efcd25f3a17672c6deae2229c6f64a91dec2adf241a1ae0f0879b454639aaea1f942bf59e7e7c1344c0500567afbb5ce00d8980052ad4f7d74ed6e47c5bfbceefaf3aa3f648a6fd542b40a340061053171474bf4e41b7d5aa8fe543b3b8de3b6615aa732abe0c7105f35a0510ba8b1728ca92a2e7a8eb01d210736ad4967cb8ec8d216d2228d7f7bfdf4532bd14562f7df78c34b8a79703b89a265fc83efdcde9e04798c6ce2e17eab8aa32315c96237c63097aa985e364c3f4a62c75f88802c5d6c6fcfff73a5aee46300e52da767c8fd5b27ea38cf8ab5ae89cd9c50c45e0e83743a1b3ec2347345180cd0ad61cc11d162f478c02fe60e73cb06c9fc15deebacb6990cbf6106722a141774097b07a8eef27dd4e301c0cd1b989efea60f8b4a45addd0305b294021fd1c15dc665b2f49254249cf5e7b368027d06990313dbb0cab4a69c863985c9a2fb9aec58b4469b8832992f9d443665c4e2ce3787c558a5b8756647d588243f3fdbf4ae54e95af42d084c0b2d99b24cdf546648a8968aafab6a9c83680127b9630d7f123f6738a4fd3fadce4b6abf93be6c5f4ae9f9da14f00ec9ddb256d8ee990a8ac67cd0881475534ec76b49c6c0ee7529bcc081cf9c42dc7eb538dbe0456e4db8299197c1c931edafb50199606aec19562cc0a0e39c004e1bb88002b6343f6177ca223f7e399f6930e5a2dc04d833c355096ee9beaab4ee31461c8dc351a8c05a16833a05fc2a5072f7c3a43cbf61fdb6e13fcea93ecd374ffc62cfa01426f4cf9d4919f1776f2df659e8647086d342ec3297b24bced5b3d839f73ad502367958cce841d931ea7c3b9a85af38b5141d757c1b570ee15aee6a8d4e61ca9253b88633f55425c208a5a3182fe6fdc0b0f7d32c4f0f7afcc9316764ecd7094b0b5cc850d4d35f9e6644dd814bae4830166c95d1875e08a7ad475f6f370d0992c9b0afa22b21ff2d6fc43b347d67a089d0d63dfa78c54048737ac2fac16654101b6e9cb64cc27d05a1ce5cc019958f446cef2c0577c7ba75c8563296208571397ce12ffbde5761ad98adb2a2b4da7cf636f1e08128f7cfa5f8541edfb8fcd9857ab2c9e14433358bb0fccd5ae388e1f5eb991c0bf0b8085f901ef8261f1ef56a714e0b1502f8713677361d670a2366e9e74f0f04639aed192bf15f07a76e6d7f0d2d63e5bf19ad1477e41345bd5c6438b68e69e8f612f6593895a403068daa39baeb5501cd1931dc2f814f7561867278d5c19d481cb2ac962256679690df2400e6d26ec7b179a7c40a8842848b241a10c1a319906bec886695be2a30faf5738b3dad01c600ad978295737cd1bec7b397068d7f6058431230ff576c709943113f1bc5ce7b3f37598e6cdd5f1b60e3e77210fb3f167638c28bbb9c9ec3f04a7572fda71565c1a9964ddd207990160b1e488d76c9512a4011ed771841a9949e18ed7fdb86f44c76b65772e75cfe429fd070b87aae7ef8eba8ccae34e59ffaa083f50edd83c514213221ca8c69a47b3496813e917f1e66bdcfafcd8d0b2596e44f302727ac56cd2ba24350aa2031244be9009c359bae08192f0d517b22c8fdebc31555446117ec188f1281ab3102d25840653de184ac31a02f7bd6a9bd089429981b15ae3286d55a4135fa19ecb809ec2525b02fdaa797c54961c9733a530e2026b7e4efa1223d7371240660e3cf4f6a0fd87f6afe1e8efb1565a6723b36a05207824f632d7868e68743533a96a6f77478e4184d7f7fabd41bedfa2130220f41b2f0b1a348080c460c3a5ce175dda67df8df0721df5952c2b561310aa9b3bf81a199b84a815f8bf4686f800011d1e0f8f83fb8928e2a38698a65f789185a15745bc3dfb349cd5c9434695910fb321b780f7cc91a1c60b11af3729a470c83c59c5a25746831f01287f8ae649e826cda7da71ca522fa9b5169990da5aee6df248c253532e3ba5632421da52f0357e0926c4795d947b9489dc7d39db63b37aad6a6356977b0537e30752be414d9dc3bc7d6698ed1e2d8e6fad84bb938768fa5409d1328df588dc691739bf1b29c9fed0f5e955e2b9eca04fcfd59d698db5f2cf6b34729b636d9cdd9eff64494c60372cd47539a52d60d1118b9a67c73f416c06d8b39b2b8f5b7f27e2cb36317e0b74b86231cb9c4232299d29f8a21463b56fe19a7637a43ffb8e302cc6bc3c8772bf5ce9469330bf0ab0dbf119d5b7c2b80448f8a6cd6e3cf5d0dec3177ed22e3c1f00afdc19c96e8f6fb42b25881a24f33223396be6f14ef04e1af1e8045c3c129d8cfd19e6d0156a6d0e1e4343a4510d015aa6ec09943c940ecdfc5ed7407a9b3fe81b2881ab7d43b2d3139c8fbd10af79d58752bec2d08a1add2da37ee8ad800ffd512f72c46ec047e95258f3cd2a81a37c24c48ee0d07a7a34ccdf81baa06815b1e7574282b08c333a239ef83c682a8638c46bff57050b34b8213969201afc58ed24c7784c0a4d7eacce96247390532aefb06f9b8f37e6525373dabc81e2e4e09a52a89c8c45ac31299a6a02d86aa3988a31f7eaf02eb3dbec0cea0545c1c7b59eb72136a929505398d13f17d4c0c3d7f28d2b73e3b119d86a3290c9d37f4de0e39b5bcf0b7ee2ece0b940edd0585aef0d0c34bece8ac050b72ef49295e41f684f487dee1a0c0905eb9a920b32fb11e9c5f83a531a7f514bba483fe7f2b7e555cc05b01c3e9b6ea4a0be60f9637190cc019764bb305974d25bc7995152c246af41191ce0dff2b8d4e76cd040cc827ea0a933db7d76dfd0eb82f529571dcbeb7f95cde8c265da909aa8eb0a67d4f6846ea412c72156db0ea117181881bc9b7ccdb2693d4a381b9e00cb8437f6e294493ddc7c4f2f3713d5f902798d5795faa09f7f354201c07d890d397f7f756025761538bb9b308151cefd2b60b16211b0ffffe478206e65c8fac9d824096db571b2fea016d4ac9b5ba1b47b14ac29988442f4c97cfe1a90c3983d91bafe664940a601fcd42229eff9f526d8dfa534933f11861687058ba7370c704d8b85e6845af925343eac31e4f5725c2b07c40c68a913beb3e25c4b14ecfd6af2ddc777ce875473319c9b4be216c15d5dd53338818af1a389d52de23daa143469f9eca08f8e5ff1d936160051238a315491174044aa533e7ea79dd68c39f9d59b271bea2f38c1a9155346d69ae574e1fa839bad1bd1df957ba2d6b1676053556faf7cdb164d23a3ce3c53572324287436f3e4066dc640b3690c00fa38e8cabdccd838fdac952ce6ea3a640b55a74ef2ef281dd3a2521c9d2e2e423a669a07149ceb77d85ad7857a5393a17998388d640f6b6c9d223d1c5db450c5f8593cb262c63060f286ddd567ef8f3329559d8dd17d04f9ea544fe7f9e1bab1bc799673b032ef1cd59a6dc5b5a87842a3f29ff741213bed45a24f267c9fb32d0f2e72f005c870d209fc50fd6d6494f570d90673bce3577033730780ebd5846177e096d46970faab14164e24970d2d7517709aa84baba2a93e303d9e506b76767ef7cbc5e412d7cf804e2ee2398a89ea2021233ff56162c1ed3fba27b248cf94acdbd96b7f964d65d50ebae15dc3f07b145368dfc3ede0e0c80946c41a56d7e288f4887041e4a59699bdb8c60aa0ac50796d3231bb37642c58f6a81d8f7cd8899aaba07933e4278956c2f13c49090492dad949dde82836d0246faad919a218b16a66e8315b7f1a6793872de921e63f69bcfe758a4fa69df2b5da12a0c0b0e080818e293dc39bc857d97333759a1fa6fca9447ee0fa9ae3bb91a0a91c8d8f7821668c2b4873217782afeecd89bc9c817428132b89f0ed4e52422a37f3872528baa1c6b6f871fa700f9d60c1cd904618f8c2d3452a398527df50df84cdb75b3874bba692f5c70cfb272b31d8e81d03b2b1fdec946ede4cb58c41265753231aef763b9386e87d415ff2e2cada836bbc98c764c7e0fae629427f9f697a2cd54897e9a9f55c799980e69749918f45835a13617ccaf179590314e0f10fb301d5ce76f48e33da4f25b0d63fe9efbfd76cc369a7cf5e8f913fc474d8c080cb7a2995d4c070b7c91328bb7811484d31e02ee1e2c2e4ec81eaa153aa8f93238a3edb84fb74dae8f06cab881436f011ae09d29ac8da43da902d8698fe2cf262b7f6f3823239512e1903b5fff2d569a5fefa5fd8611675918402f77bb8d765a41c497779c0375ff10a7f4e085917396fe95add82f79f017a2510fbe41fba75527fe07150ee958b998c8a7e8b9324ead937d15580d09d6ffc3a009abb7cfaa9d2a962e8ef047c5d8e67c94e70e6230449af09ceba3437487e8d79dce817c28a8d6278e53e4a135e3963e6c59f9b3c0d291aa750176d95126ae424ca5338389feb71ca6f24078315004889ec01f9998fe04056e382c2e0582708a96be527847055a0ff8e8c85f30b4cdd59c97c4a5f11d6e9bc90e07a409f1dc1afc8842bcf8531b5c04a5b0a8cc686ebff67f9d4b91c73dd815e1adedc71b4d6dee7198e4167e879b4ac7adf75d0143a22cb61e1cd371fe34e561836dd555411e0d28d96019de3b484bbd14cd7b160926bff9ab7c3ea42c5cb7ec2ca6ad465385a91c68c38af892ed7804898daefd0bb820a8e9ec4bd44499fe000e1ac754f14f72aaeb80d2641ae5601c80da514ce7c0ef423e0f8398d387284bbc4cbc07a6d5ca72c61a98875fea94837f161a8c19fb8c543c486e58559ee70d9bcee3d4f0b340f27d033608ce4775d7f8d353111ea2786d59196499576b9ae440f3d7534b5256b894ed433ee29684686294a392526033fc19052ee23557b46e205e1ef9235d7c23921b48b0295250d360dc847671bf6f6ef09e05b99bfdd3e9de80233d251f41c1f91faef32ef56ba7580d6e43e90a6b5474368185d7c86a05cfec7ca5ad2218223e8cfe8e601a3532dcb9c96124ebb83b08813aed95420740791593b947f08fa2d6c5afd8491b2e2453743e84c1ede69151e08a4730f50c085e7e00ee622518f2567c4b675682e6ea50af35f52c6b76d5b4e70829574c08ec04883ccba81a446f31f349b214ebd00358cd3858d0eed9a6b6073d1a64d18e59ffe6afc7766a7297fddd335f00a079fdd070ce165c029f52d9c38180e60ffce0a50be268597053fb1e8c80b4b66b55385c1c5fb43a21288894ae8df34761e4fe985a7d24cdc6490728a3ca598286f241503275c8d7e515a68b1aaaf82561d7324e64c8934ff6d25a809578c4019dc1b75155a8bad1a8d73b01aa70e5fcaa33fa4bbd6d2a5c6c7053dae4047ac01a53f8d3f8510093e6fdc4bcd0787339858bd4f4c6c3607fb1a3817c1205e43a8729945c9d1740bb49e9c1f12f19f6789e6f40ee0373cc26410c7208a1e5a6cd5ea2f86fa653e1943c3bb16318de06165f2eccac05f6c3eca4fb93e5063c29152b50b361c6af69db28642177104d18af427ae69350b4ee3f47f165b5d171e19e57c353f750725feca8e38091c7efa4afd2a41d585636b1aac49e75ef760f76c57e7b3874e6552a45384a5d67822e40a4aa6adf4f8904a49b855332f6769d3f26f9d8ff8eeab05f7150f9165ce191630a141fbb0d8ba73dae14a02b6f5583d13f747d1799f02c65fd7d8059e658b1826cba332ef6b086f33efd05cdbe856ba37b58c7ff1a7921e4463870869879f735290755a9bfba3c5beaa914a868a8ad4c67315a34a4f82940e7fc3a3ae7a7dae1eb75f7c9bceb3fde1da32d39f211d1228f789446bdffbb125f434dd55874e51f10a089ed72c5fa006465e000ef636fcc509916b3c9f24fbf18983be46f63ae5324f19cb375fcf3594b7bbd8bb51fe1b0573d51fa5d626fcdb08584e6a0f68f14b4f3908a3ae2c44f3f5f1638e799df651fcfc688ece283c49375a96a71a01fda3d2115f03609e558ac8a9a970b83a160f6baf4edfcd5342a4e0329de65e2c91a2a049d73fbe4cf1c3f88bb34754fd01a98995da801cce9655c9886b10241236b08088783f105f9f054c3e88fd960f41851e57135903c2c0c2bb03090bb4da73353b764bec9efee8b98d6b3078c6985e0df29c0253c95748557d4b7ec156add19999bc572caf52534583b9b4a22cbfdea7cc0dad54b8b4b775d909d21852b3d7446202a5e88c836812f6d11b6110ad4bbd75511e451602958995e50efaef130d9f5eef3b097eb8af88ae5a6d9fb98a2cb6b6115d0f2c6868fb7a86394e76f6fb10552c2375cb19b10f72fdb243707d0afa55f57098420fba3250955bfc2f832a000e616516bbcff5100c62f3357dae6cf11aa461caa01f1296dfb97deb62e321d8523507d2980203f14230385d2846da03cfc7388c8dbff98fee9ba505573d68fee9501393a8d9641cdd0f87a3b96ddc983a05fbc55317f68547e2de3156ba88dc9b5b9040357d9ff7a5a9eaef774afb182507b45f385091e0b0372d57a68208d830fe87c185163cec61a36829ab06beeb56756a4185925208f2429c6090bc705c6fe0fffee0cbc462dba809399dc8ae7995f626538104c266d5aa32325c9149cf21aa00de90c4bec1d95ed60795b9512aac32ef7d76cf68602018f7b6522819990e03934cdc2ab270246dd67bdb01326761d2cda7aa1acc5f9d33f4d4b9aa6b22fe94be2d0b2528d9847e127eb6c7d6967e7ec8b9660e77cc12a43075db3ec4d1b9058b6a66dca963c03990f67033c721c9dde99bf2d3f00d4812b37ffe0dae1006fd02eb3578bc76a2455acd4f6f8c6e0b9837369690bf8c072686dc6b3eb047af242a98c020ea7af04b78e99ca0ade70b56ba709a6e6daf1688b0726afa53dc7a230b594efdbad773f2f0349ef1b2f293c07b32459481e03fdf392b42691d3830a2ad172837b4f6f3e3cc949f8824f9697e8165e12a838648d32aed3db298c3994819b897f5603d38c514f3e58d8b635637d5efb45afc08fa0e8aa2a1fe4ce57cbe5626e15f47150941ce38b9296d9822937dba074a73d01d356131b774c007a2ac6c474e9ef0e72fff044b63835400953c83ac2122704579f3b882c73d7c8fd4b8640528dae31973a6bd142bc5c70377d7eeaf4c0b7bcfd5ed967d198008e7d88d4547b53aa9159bde027a59144f098f0fc7aace2d1dd6fbce030af466ed7576d117f43fe7c9416f51da68349b737aa6891584f0afddc2b13c0711a217b2a3782de2f60c09cb07b9a54dc3057fbbbe84f0e027fab944fcc0dfab7a69badfd8a448af3464c738ce3f82637414ebaf3df1ea317a3475d9eaf061f62d9277fc7bc4cb8596914997fdca912563a905d85fb51f0f65e50924f50867f112647792f69e5d6d04dab870fe22799a780cf5bd8d973982d0579dad85d29ca21229e228b0fba76e66863c4c380fe3ca9c84e4e62d61dd92a3d05afd0314a5131327e04711a25090a4defcb1135977beb55bfadca9d9b548c699679bd5972d4cfea89776815d01dba72a212af7c7dc7dacd75e2667c869ab22faed0f6523da53bcf2323d68f2625855b2d23c4c23bb0f6a41394cd1f5a1c39d3a14e21a805432344dd7242e2a1a0e97bd38717a33bb7dd6e1b2d74d2a049920a3039b5b7544f14d03afb43bcdd20656947a50e9c085ced7fef24e452d3a34947be3c292cb5296f15be174f8a331467880c2610291c00a57e1203920c7ec9ddf0bdbdf264a252b079c95edcb73e0d8e6c7352d2b70153a3dd3652146c0c2daeb9b147b7fba66b7760ff5a51d0786c389b1fd3bcd232c65711ae98c1fe063f59e73b61d05e3bc4328fc26265725cc10488842135173ac93dafed30513ef78f5e2dae84e208dd0d604ab53f8df965ac60a922b3e1d283ecc62c94b118ab4a8e39e1ad295387f4a78f263a2a11f22d7edb919e1439b0a8919f0c17b3aecf89cc6ba799d7ab582d131da6d3bab7d90ec8e3c638caa32e036816d308907a183fba61d407185ff5e0d0aa411479e63aa40b07bb852fc4974ec0dbf5c9d00111d6e8cb1b6753f7edba70a3997ee0038367c5b5e625ec04a8c54c4cf8ee0aea48e9d7e5d25d22f9ac0473a7f47575b64fd4797cda8d67e9cf115ae850d7998c39d2f8709d3afdebcd794a05f69ab364fc74a6db0d1e3bfa76bd8d3c9239147d414cdac9d0935d24ae63746c144111a615c2ce4ef26ac09d3c2453c8416504141b91ef7020f8c95aeb6d7348e21b28e0283960572ef5ae788bd03f09c2fdd107055cb6f1e2ddbaf4e0f1d71ac48b61a9a0630d7217414de2e25bbf7fbb6613bcbaf7b1cdaab4aa694b9b1050501444691aba162e5fc03782dc2145a87f3034bb891d7071fd00304e77b3af88094849b4f3b92aea4d04e3ced5cb7202a2decc7a1c18637d3e62b50ae1e615204489fa03c7daac448391fb2d7bb4b51cbae4337ed0831b4df33ed13536bcd1c7b67bddec03b92abb77d9b6351a679f652bc3124042e80872c006fd43d27265ecc3705db443bf16bdbe4ecd6c4e7e915a6a0de154efb1ab7a194d91bd41d161edf01a0212e46700d9ab83a93994442b9b1a271923337a84c25395471801443669c0cb638e824b797de3fac2336862de75a0913231ba9d14fa235085ca9d3553deba26ea6d89d6d148ec36b0d057551a9891feb516e1a3ec7ffd11c66b723f5acb409f0f568793a89928a9ed96cd85706262a22a3945297bc2455b81712cccbb9df8a65acff7fc800d2dc6e10d578e6071a73dfa2f5198337f90906f622967e6f546df5540478bc8035030339a71ea7b24b424bd4f937aa3e65342b8b5049b7d3fbfac774e12dc112a54684dc4a904111a2df8ec30973b5dc5320525e02ac1defbc790494fd637dbd0aec1a8226975d2c0791cff78b964c16a813a1f8a18859ca8031d33dc0e598894a3eecb2a3faa30963a136f7e96816f64d5640e096a5126c2d6b5df5927abb7e4e8423f42983bab29c57ec4b89b1bc832a31589e48cbf1dead6fc947dbe98ea5fe06e6d020f84b2f9cfb197bd539e5c527eb11bb1ec29d27e68540b803fbb805420b5ecff022fd8649d5e40f33c83ac52dce92be8251bf4fc2f5ead27278e2a603ddb27801c979c18d2d76900d25638a2220042fdb42ff5f2806ee1c9128b39127c20b53bbb567e84f4af786ca19071cf02a8e97905b045eff01751ec6d2d4cd980391e987ad6d0177758e77d26cce847d34597c0b657754312ea6617a40ec623ce76bc1cb7a3616ecf663ed8de662c9b3868d69b327ff49a5d5aa6c1638a459fdb8c264f0e4682e98159f6f634e68f3786751e3f06b4546433ea8c70083a4b9c2bcbd585fb3ac52621a6a86bc6e8b0bb621cd742af7f152f3b1c9fba2e9938a723d85277fafa989324cebb8000c711854fa2aa3c994aa769d75358f633119d5f7814158b7a008dbf0f44b9097f1c2223a3b90f8350a18b929d3130baa25dfa138d11a74714d7050845ab193e9e52732502b26fcd721e4237f138bf8e18b8df61d743802147f8af1d7c6464b5eb0474e7e14153615a1b6bc887dc7dd6f2ccbdc8eb4c28a08fefec5cf80323f5f19cc81ac3c842f5851358d2a58ec42bcd03f5c73d7e195b49273d455cf9cf752e95bd0c2ec9c6d09fa0a9d4eee25af303e947db426bcaa8203912752fdacfca1e89f45a86c857a8e64ddf4dd8598ad334070483ae97c51d91801c5ac508cd5b2de3de7460466de5157559bbd666dc32d9c7cc3eb684812219a6bb64d11610aef93e0be84fc671fb89b1a99d8d9cd7a861b5ff8b0ea4976c35276031b875624bfcf2ed34b9bb2c72df7d5f61425e059a685c1ef72b9a6042505cbb300fc90aa8959cf2d812b6c5e17352ebb5b94cde8f5a24caf171b8845b07e12cee3b63a24b7fa6cd410f2c06ade1bccef946cbdafdc3aa640885917bfcc84f25dabfe7a1ab07aadd1de39d475e972589aa7f6d737c11477aaaeba7afce2de1367421c7815dca1392bd547d006a20179c47b7a44070df968f57088da8458551ef48f585e9da336b9eadc66dda67092d876fa402ba729b1202ab5095edd98b1bb0d7afa51386d03d417dadc23dbbbeb1cb80b8fb5a07b04485167872f9108ba91b8eb497b70a2ce33b9b9f2c930ecd5ee9096b109796dba88706d487428123749ffca8e04ccaa607dd860f0f72a6918f60884ec51ba669a8791af9556281df28aeaff1214d4ed815b7cb71ed7539b7cdb27bb89b2ecce6deebb15b5fd1b90b1fd80731ad111d4f875aea6c38e32eac946f524cf56960cfb64f787f29088d53d4ac90cf1660ac58f72751529474fbfc6de7ba70865408a0c924ced9238f8535e18cdb3def947290cfbdaec962833803c4cc02d7a0672af6820c22fde1cf272db0f955128b3516938b7e41353596597f437cc9c6f62b5e3d6b561351e65fe9a7ed828cc18bbafebdb4f9b72a8036d6ab348a8de2da1908e20f932e79a3aa4330d1b8e0ef63ae919bd6a07f2dc4ed46344275bd9fcea8c180c963c2e99c46da5517fd0fd0a57885aa5b13179396121e86e7bed7726652fea633187f0652ae05912adf5839b3b13155dcb20f00565dc63f8ec679ef23c046aec751c17449586b5184d0587f20d12b4ab62dc4089818e3bab24d038a7949001710702897f2de5222a0609f058f60e9e581b6e4f0ddebed84fc8302c8e985d17b89241305d198709128007a8131e8e3b2ca0dd07d9a3f4a2ac839062ef6df2158bbce2f22882f4d096640a966bac1af3ee99314f34f9b80189faf7c2123ed761b02decb9268fb2e17f5a17a2aac83a2e68ad730e6808935dafd86d343e319565ef8e676ca1694ba2940938b4169c77546085aa2ebbf70c1ee7c3faa0bc6eb38812875cf3df37477d9f1a74b4f94d58cd9fc9de9676efacacf763a7eed51eb931dfbfd23629222cd96634d48a99066601ed20172ee017f96fa7627b06ce692fca20dfd11cc652841db3005e1f3fed275911325ede43987dd0c1657fd0f2769eba9b8e618f00eed6b34c261c59322a253bd5a8ba8ee599c0350b17b935886e8e6919758b771d1fab02f94d1621bce6e810ff2a3426104349074f1d331bd778853f613c56ba660c8a72841d53602349f641585fd38e0abea0af5322f56c28bd0da43d8acb4123defb6bb340dbfcb07ad934a8f09faf1b314d93e0cc050ec365ad007307f0f49cbc8655505bb6dfaba21953b784a06f8dc4d81dbdc36debf097eebbcc5ccfbb18cfb4982119edef5ce83c054cc4dfb7a6a1cab4b4b035e9f77b563d1031707fe13e0c9cef1f86160a75ccb131586370b0edabbf8b3b63f21f3a6fee072dd9263d3217ca81188c3aff7051c12ce73480f1d301a80b0b01edb2fcc13778f9149a75d35b88a1aa04458102519c06195bd1b27956d6fcc916c1f6e8d27e2d3d29c1d048623f157df81ed95356aa8798df493a0731b1261cab5834272d2ceca01e8598bab458a63a6fad4f8ae7537609c8d2d3a61ba150adc799b3e057aa7ecafdcd1350d7391c8972da2ad08dff9c171f53c37e9b0e4424726cbd3cd95fab64ce808b33554c3f11088db44cce16c268ebb353b63960c828b4b998633cb23a169788468ab6f8d77b39ae33273500aea434dccb767dffa56196688d7c080df58762cc8d7e80a4ab6e0d25f0884725297402b573e8f054a3781f62e4b0c3d7a2603634a7373dba84938dda33988eeefa805e26923119c58915588de526f7770a481ca8dedc74a12a92c0b6447e91c1eb6f4f17727c80bb21df47d2d8072b57f5e81a107896aec16512af9f6a63d807c2e9de7059efae9f317ff61a047ae8de2be83b54be8c7282fdbb607eee6fec294898121990b22ad7829c6d4bb2a8b57473ef845df8e7484cb937dd3c18c9548d4521f3fb5fee7ccddcdfb34e2ab81a8196a5ff116eceb887622b2ebf309a989d812f89fc0dcb2de706f0cf0cb4d39f6d5db3b359676a4b9bc04259f17e0941c0c368dd05e470c48fca76cc6c9821cda18dc1a81e2de288f09b2268b94a3fd65dd474f6ff2a06c92cee1aaf551dc92b83f176e746065ff8eebb7362fedb64dfde7dfcdcd028b4c5253b8382b18cf4427c507b77 MD = abdeca34f0dfd5d9097f0ea9e44263d17d93c6e02372c2e8896e8bd8c32957ea39055a956e4f803ea2a341166a87edb91cf0adb758fd39eae9438d0b2cb2cd39 Len = 75472 Msg = 03405c03ce1a5d8fb4030f73596050e5abba9945141cd6a6f4bd74894edfbbebc2f75e83bb0e5045e967da2af262eb3364a0afacef6862aed14a67e79102949df09fd1f11de4e16128ee7f91b917ad4b021b49c4f279e121ab1cc839373b699d767edcd65b62b7ed58de273117473f346b718f178617f9076c7cc008a853e2f13ddca8b8df517bf06380f99075b948f689eaaa2c14095269fbb277db4b12a6a32c035c221078d473301c1e383936719a42d0c28b0218954e4006143a8a3f5ebb2a3a219956a16b7da7fabdb1cd8662278069febdb90c6abf23c0bfadcca4b13f21c81fa71992e716b061ff819771c2a52aff8749a2ad78c38c27a2bd7a074839f8f67dd3c114f246339b0c3201bf391d28d885b724c268626384e2f1fa31cab0970c64a5b6ef311618ee0b4c71377196623c1f90a615e1a4901faad2b5eae0ade652fba661eb4e8d47a3245551a20f18bf757d5a926c8c92fb4020e713f93237cc0f6b5d28d0f1b4a90181d708c8beab2acac8a04f9011338d2f6cb87d286756348ddb537465c19124524759fe712458888228e7454917902c33b7cd593d28120312740eae73672fa1dca1649b65e926c2e6c4b9dc5e46afc19629af10011c7422e75d183cc28a9309e9b57f476bb61ec03ec59d7c99489a359ee9e50b3cec837954bff9881ad3c742bfab326a4d33466ad2521c8dc0c2596e9420f7b1b63f48f0a0c237f843ead236a6ac056cd107a8a8e994bd779c5ff256c0f56e6936bec970158d5cf60476bccbe8e081b5c0da4c63ccb308a2f5c46fd46991d09d861110dff949f0e927208debcc6e2dade1563881c4d68577939cd7cfd81ba8b46cdf2527951d7939728f4e7d997e91bdfe2176ec1725bd5c3d8d333156bc7b16b1d00e2e3132814dae6b0769983a364bdde30e8a0dc937babd3f8ae1299cd32a1d8dd5de15b08f8fa35ebe9711c8a3c147450645f0ea7bfad95ce4c799e2375a77be821d88be2c66180e7def4b50608504ee680406af12825a894acbf0b7300e890b1bd5d384de3ad6234b5890fbf601dc883caf994183bc0770c2d5744245ac191aaaed3f2b3074a64631bd26f0ec9b97b8882defc8560eaab957cd6facfe9df096364d12dba77a4e1f35035658cabdfc285668506b14e2090c0e9b271ce349d625c8dd94bbcdb596556213685b19ced580ad470652449fee0ff127e5bb7d18926f67850ff4298d4891bdd5a4206036e86796b258a66ead1f6d0759f0b05373ee1d1b2dc9ad436b2a7a503152d0275cfe8617918d8f1a7464cc581a9224edc0b0d7ecbd0b0fa4b506b92210b992f7aade853bccee34d15c87d5ed50113fd468a144e31d1d42d3d5a2f53b58228f5687520b074cc3be1acd4e2fcde5b6288fd4890d0735476d5831c6d7a4f3d5efcf5b20c085f754547e2f838200bfc908a66b30da61edd1b9bc333c0664c71ad9e78f114ebcb6e81f84eaec788fc89206a2945d52f72e024d8641cb2b83be39752889ed5ab472c847b46652b781e6584b0ab9da1dd3de24523ec53aee0abf79ec19b27c8f76113df3960b7ce7de0365ff66416de4fde77def6d2652f600b1246642728592097d8d4bb34234b1af06ff483f94df4f7b2f564d9accdbec6d7e800a2c32d20e759c0078927140bdfbd76f511b1af70557a0f6934d1f9d77590dd6015e5829a9c358e0a2bb0269b2ca5efd40853b7faf9921a7ea0e875f40cd466d73604e530bfa9773f0b75b77382483f03e025f3df44799af7a666cebefd0118f87bb7a18dd2243038b0de632f9122e92721ceefb7d6bf2576adc36072b6b568265f6463fc74443d69b4509629a9b4729055a507ff10c13e7e3f94d7c9ca5fd8f3699199270667f3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df67b77dbc3f23a06359e6632dfb3de74dde0e440390c0161217503973d7a1d04bb6148c1b7d592b3681853e7984643036d6108471bfc25e4f22e945cb5a7927ab68869db250117118c0225e37f3171687d53b8acc689a658e6614d9ca28b19fe7c63439eb80f37bef5ce549d111fda22824b6de7d51f033b82cfa7ed808f040e71847e72dd4a650a59ef789ada6bfdb010baa08ea436bd1b3bcc2bb5dc3de1394a6e630e115d3f820ce80a6357a04cafbd13f907d05b346695e9519c121241fd4b73a9b6d0b217c4a34a726cf547575fcc09cff9d61719ac05a9b1f6cea6a6d90946bb03a7e39e309189593e5fdb9e6ed1eeaddb11d4dd6a2f7fb55c7e65703b186a0f7b036c23547c17274de3e7925b73450b02302ee01f67ede4338dd94eb1dd301f937fa657aeb78655222dd5d38404af7025ad8fd23a4376b722896c92dbec3b73d3894cabbdd8596b419a20c2972a8075abe672145936acb6900da9dcf7aa0ea4b19ca980005302e222b572f003495a741b776036dad5f25b02671b8db3bb0c1ac4465774f4bc15524c0c26dc36d5bff3eadcf4aa6d95ea2d00423c358e83d65e71f2d11b2977f324340ad6f7c074038d908389ff5ffae6a5000b8664f698dfe8414e90b30d1b3ee0613dedd32e98d7a9a307aaa640898a4b884f748c7a6e8b30c8a6310d1e1a5b0f6a11d5eeefb89ec0a8e5d12fada647991f7a912c88698ac06e961c69eaf9da19952349ab7257eb7b088a880bf5e5a1061c1966b5bf4e412fa98acd59e23e3e97a8fe93a954fb2021487259bbc7cc192b34a86fc86d5130d70010ce6da26beaf1ebe06e690616ef6bff49a0cf81de3260cf9416d53126ec4f18b48a1589e781b0f495145b143fabb3835d07a7b2706f5f6388e65ca933d60049e2aad22755757d4969300ffde9e7807b48f8e4e847326f86f378cf240c80832a278b34091a488f50f93be8218a256b5d79ef0781a72e29b04028bd30156e502fffb5ab8dca6d9fa1a1b2843da4d7cc908c74701d34a516560b80a75bf301ffc1e7b4b943ca7706c21f1e6490de912cbaed03bf295459ae0eb21b0e1609fdda865c02ddc9bed75d38bde9f9d97bc4244308276524aa9e6940d04261ecee9478f3d91a996e0c111b5c0aafb45620f32bbf8a59d29d9bf5c082f2a1434ef5686380fb767ccf36b6b9c281da44b54290ab86d015b802acf25c4b75c202cad30c22b41fb0e85bc33ad0f2bff3fb65754f3c3f75d555e252168500f60f50defbd22f13d2346ca2261fc973117778f52d61565fe8336cbb2fc4e359dfe39df9c47cf1169f7b9a2103c83bba22ef1dd2cf89725ea39a4cfb9aafffacb0095aa9e14f1132f410d156b0d6703e60c58a8cf02a18c244847732271a227002cb077dc6caf80f6c7ea2b1c1cd3f7657952f9223c5d211278c9bed59a5f44a34c334d3e9931df2552f9ed0bb1ed20873d87d70dedf16c1d90cfb9ba6c5fda1e26c535ace2a0b826aae1622014dd05b51fa14a785f85f5ad5a046aba31ca70d8830f360e8e249460974b92448ccc2e55e9455a4bd842452b9c0ddbbb2fc88f392ab8584ce6e4f93be1df865d63e224d1611d106ea14fe3fd1f9514a6b07fbea9e569a34f3209721f4f444554df466e8f50d173ca02d5578dab421b64fa1a85907aca20fdbaba8474ab23d712492194f97d098b4542fc2a4208bcfadc55bf6c56b282d63fc520b9a2bb23457ee99a1f75b26c61c8abebe383fdacb9f50b97fc63553acefe9c62981148ed967f06da966db5a2fc3c83cb0aba53ba5e9963c9bc202b990e2088aaa92a1928d2ffe90881484f54658713c3274ed28df3afa47d35f3fb48a08ecf1d7553f87d02e5db4d696e482aa293a3fcc3a742ce7f1e17dded458fee8b31b9e583f5ab942d1922d1d44768cbbd467b9e652d6b240bd0040e6e7fad34d8f0902a5b79fb145b8206bb4d3b77e0bd8ae2d0964815389eacb33b40071ec28eb29a138645b0a6940ad13359b23c10ab4622badd6007b2409a6b8ae947aa3fb56121c98bc392f1e198c963821480048e628185c2dd0a39f9827523f3a5185456e46b74f25a689e491538714fc90b636ec54859cd27e675d24c192fe68b32a87823c03a4471fc54d56764854839a5d65459be5d87a6630fd2e19fd64860bee423066a46087214bc8c7796c8f6cc160546052dba77c248af02274f3fa38c85af5f75b0bec6c4797d762d1561e0eb25974fb1db9726e45ffc680771937e774fb23558d9cb07cff3409b712b798ffc9c357445111d1a726e9f0e694cf96289e494ac972e9451fb4aad042c1e3889694186bfaa1774ddd63e3ffc36299ad62a0bfecd1af7422fb0456bb84437c55898dd3337c635c3f77697853954509e62c28e989fc97cfc2656ad23bfa3be4983f337e3e482b332eebc4119cdad092c8eb933092a8d04ebc0554a7c222ffbeb93e0193fcfc7d8eb4c0f03a2c0289c6ce377c3fa764cd8368415e41fe8d235d40fc949eeff7bee1398d6a6c91aac5087e86405128cf04107faff43b31973b62b7f1590997c873bd55b7bf335e4236fa526e8c3fa735f8583ab792ee1befac4196c2cb6e84fd408571c65af8e26743fed236cc3593383ecd41eec6f51dd4ea8c65d7683827f499cc163fca57ee68709886956ced8d542c022dbc1ccaa8159aa59da5bbf1014cd413cb9a89cab2e44149e8010ac1f5f8647946b5e0e95af0211fb6b433139174a3df0a4d15bbd0593aa56ee0025d5dc36cb53552dfdb9713127d39996a2a68fa7d904aedfab5d745c11d83d9001a2513a9286219460bfcece320aebbcdaff84cc5da05f3a54338187924df4270730c87ae45658fd004ecfc27bc7ea1da1ebffa111ee3e4a1ee637fc75dd9c2c002448dd0beb81cfa60f7af34a331c21bf12060d3c13d378d11f9ba302afbc09b529da4d4e6c247218a9d94ae7760b31fb1da4fb283aa62a3485b76481ecdc25ebe585b2f402ca4e1fc5f4af99b73fb31eb4de501b8940c910c1922839bb85e86d0051f246d4facb820bd10ba91e3f11f07ebef55e2828be2d7a34d573453dba022346f68c0b3c510b227a445fd493b139244bd23940e6705359a65577b18f0371f66da60ece184880b3f7440301c3fdc14d8dcff3f903464a05ef8e8d28002b8320cdea13461718aa654ef1ddcc575b50a28dd5d67a06aad927176afdd21a9a004a6eabe59ac02951e18935355ed835adcb52ca28ec7703ca6727d00ed664b9b01b59cfcaf39be33dcfb0f752dfcef2a16fe4983276dfb8e36c26a7095d66ee5a3c95400b7931af35d5c91f7d76bffaf4364c253c41c433eddf1cd9368ea9a2c8542ae4ef5309f3029ede94fe4b35b56eca915b8e75b1dbaf67114ddd92b43ec00c21a5c0aaac186cd0f6401d87b78bd6d0bb206f392b18f3ad0eeb46900f280b0c816ac4a5a0873b141a0a2252cee4f6f3d35e29b5bc527f591a9bb9b143ca71fb521a456d6fa7371151da54d3002894d9e0fc0212ebf11c123e457d1dd78bb9819d9f8929a0df2870a398fc33d8bf792aeae24378405d928081d1dbfb53d2ad4769e0d902bc99d5d8182c6299db116d8ffaf8330e44ffa94ceb271b73400913f5bec57c204a3c07f2b97fce2e938638af16261cfd7e3d291e843085af2597b433a436bcaad23086668d77881a8787a1344954446c7780d99d55d260d48ae458a7241bdfc9dddc1adb9cfdd7843f7a71c3986af484b531827265f6f60df758c6fc455c2ea4f2aa8bf9effa059444c970070d50746dc2b6ec45bc858d80f55bc8d810e2f1649901a0698d5458741dda66a5afee0c4e2679dfbd63656e550b5524e48b9370305a4922d37ef5194952171b48862c044f67e023826180e1b5c2aea3c7c058f231beebdadecbc38f3e6ce757969bf3a39a0f557f3dbebc2dc8a1ce0d29b71ac18e4c4d8d337ba80478f2b1e137f5293354a63fbd9683039cb5301d2ab477bf23708dd8067a968bbe226cdf82d49cb8faa8b206a334b73c74a5f704c20e083061ff07f40c5a2553066262d80215998641bcbd11fac0624ffebf7fe99cdf7256c262440a667b2fea24605d0429a1f37d4fb84eca89e18c23822c4f3581d0bd1890c2cc80dd86bc376046e5cbbe21b2846ec5ee981a403ea24813ef513988f25d114625c03923d522023980958b3cdf82e40b23e3738480b3979de8a38cb0190f8f17d93042f980935163b8ca569b8161fab178145d56583eb9f1c19542f03815505c703abfb1c77296ec14d2e8e5a008f8df7291a05ed02cf439028e22ef59579d3e70457af2b2a71afc1c1509c3445f26bf9bc30443ef63919a34f6f55683bdbde563b83965481b22b959fc80dd764ecb767a1251aebdccd73ede3483ccbf2ffa78d0fdc5b291b4f94e52ed17da3dbd312f97e74e46434f104d88b294fa14959a20407be680955be6e18f519463a2949e107ba8c4b488d582eebad7f0888ad7e6043a9a63775df9309b9991c01facbb5b41adbf7c9f9444774afd0b5e1d29dd264d46c20640f07420a3f71363b7631ab0ebb5923bb070863589d8b6a861fa8fa222ec5b958356b6fe22314145d2cf9ae4361c8bcc8f238104d2d44094fe04d6a1acb5cdd9e798a5123fd0822d19f92141496910f6e3b51f2e4d7712eb994f986d1228819a15bd2ba3235b3de533e8980d4d248b80542f46fa244c9274dde4bf4c7dcedda0b5cd2ffaf55adc33caa4e89169d663338c98e0af7cd829f96fca3187152d4ab26ed19860de56c6e08336f715c60600d730f8d49680a53f40fa09d86501cf319ae8cf501b06d663b408a5afe18b3cca34eb580af7553a3d1324aa9a306a3cf81eccd23e7394621b7601f9f73ce100291162bf6a1a261f893895b4612e77fa0907c2df4ab2b08256f0153bb670f0db85374035dc4619dd8d77f62f14a95193ca1c71005c1e84bf7ce8ed72d6c3df54466f2bc248c456fbb09aef249be71f8fa527823c5c0135a0f52731a63e7ed7f4d47fcb6f96dd06015967279ade310a7401ee9c9c32a1eeae297588dfd6e8ff41972fca43aed65177f2a84799c4ce3acc453b6826c747d56f81999a26864b80c5f849cd4778fa5ee6e223f6293708d61edbd48ee4013a126d635d108236ed81085d937f81dd9056d691a1dd531f2507f32a81b5dec9c4ce30388792fcce182b912fd785fbc3df60cd67e9a41e626ef4d29a0c851b082b313e69e0c79b3612a6e8d7db8abd1430a555ccc5f293e92bc643933ba8a3a4b862215c30586757231995bb6834cdb6cb4df528fb6fb89ca4a4ce7dd8c37e87b38a617b3fec681795ac2045452b3593f87f36e354c4976320b7fcc0a981b59764d0842dd42ca75fae8912dc3c18fd91ff639e6598993827e92654c477874ebe125d14d9b9c02b18b8d5f3e713a32b9a2722b7168f95a1ce451a5ff2098054e2075899e9b44ffc28f9bb49d09373c995bae4095f0061dc427dbba3b02912cced89ea99c48e812379ba619efe8431de69fed01aa6b5a5f169d830aa679de5c0c6e13b9ed20f00a7f142ef79d9ae8473003c0f75547408e62da0a2fc802ea2375557722f7bfe71907adb8e63c9d8158f41bbc89fd20632c5751b381f61a4f13a8232b8d527247fe7fbcb66e336cc8c3a14c524218733cc9628931b9d74c779d035bc34163e4ad0b35b5b9e818850907c61a04b84dac27e5f304e72fe205fe301563b0f7d28360cfc84d35ec5272dc95e10956450357def2a749566c8cc33d6d5cdf8708f4db1dcca5d7bd0387c2be0e70aec980bff2ac8fedcaf1f85e20cfb55823b80d61682e826ce9a1961ed117d2035ed0e3f9f92b0e450e6c4bcc9b2fa885e4c66d9e973d717bf7a64c8e3a9470f7ae0ef737f7d50e2b8807ef6e9ed7a7747724b202f4a51a61861d7f6c7b9e7bec20c623006b35003fcc674baaa85232826f6573451d000dac1989a72ff0a0435f3ba90fd9cfb574c0500cf9074419fa5e420b19cb5cd89bba367d6c4f564477bf632a062a91e0dc7b976b600afea93f6673882e0c5099751a415b3750f8e5897b4bcbbe795e51b7b016f5293c348aa219986f189e84bd0a5adec580cb752de9414a00915c9152970c635cad018238a306152271e855cdcbea732ee1154768277fd25b173ab79deafee0e47401643db2aa6e34c27060564a478309c0d4dc3eb4a5994dc8aa4d8e33f6243f169267046185282872cd20c10600a2e8b870c01c1150f35b1e01df9df280b1befd5ae7172014c7700b6513987f94374e207f8f8aede075059ff7ca57b73d0e06a0c180f09ed7c0ae04ceb5672770d49ca15796f58af292dfb6f2aa45f2798d88994ca12b0e5ca834f77082978e34ff76b3af730678f5d14c0b690be324c4d4d75f72e4211ef1e2974be107c4244f1c4ecfdda0184878b4cd05e15bb9debd68555bdaa66d416604578a96b1577a2daf976e78bab579d9b1e52ef2062470a1bc9526ca848a15f781f82c081bcc005f4dd307f70f687db75d26eef1b7cd9b40460948e8fae1ed44effbb8cbb3bc57626ba434df2a9bd4901b04ee86dd1faee799442aac761f67ccb2d4b947f592dfc58d6d6d9798ea0ee28ff17617e2953c262ab8549b829cf5fd5f0596036dda1a0727b12ac6e6bd9d2d009f4e3b64c8b37a7ee84f2cacd528655920d794990c8695def1f4d37090ffde2140bf57d024b5530a5682d651726f8345990661e3a4b5fff7a24443e30eb784769841f3b123b25e5185882f1cdf3bd588e0aaf1fa3d18a4166491aeaa7144ae55088e9584502aeaf8e7d7ad6b863deab78a2ddb39203f30bf9b856a238337ba6103fdc3c6349f97451fe9c7ca01c621461817741d089a1467d9680d0a9f01471f3d07f4f34b70c1ea704714b4dc6517a8fcf0533260a9cd8380e20dbc3f21b2d3f635afa7ff5f193d9b780ac860ab4c74bb310f0592eedab7345bf2b4ee29bc43d22f6a30eaab0bd2e3e5105149092e2dd551fe0349e9ba67566e4281267991d3533dab4a77f4f82f0c26cbfc0fff3b38ddeba6b7e02aeb08897183ad72a1f206fbe8e93131cd8cc656a5a4350ffdf22a37669f9fe012fb3f200e2c964d334b532ec9baa1a285282d75fa2f88c3a5f176644b5f27d442596fccbca3d8209e1c4c8e4885f834cc68c8cc8cc453e557a7a1f7125bec3739841ee1d58fef9742d3577cfdd1c182f3bd2cdce60942cfb3933172442c59835909b1021157491bd20f088d523489f7ab93be199e74c1fd2a22a93869270c432168ea9fc8807118cc2de431de14ae1d449b11250e9d4df82c048debf9f250e13310203d93a2043881ce5efd09f8ca6e6f11ca61cec9634b498733ff6f14d4080eadd64deb125ed5a35eed515e675b557bb62e6247af9e6103494fd540e512020480815337780d8aa15e23e153c6dd8d0af6c1a911a65bc3d9b9461008097779c536b5e011497cc1fc5a770f82cdcd5f9d4228a8a554280e4d559b322cf890c9b13ee86700ed491614c27b4e53b2a7579326c7d38b1f9f8acebcd3be4818ea9c6917ad7a7ef9eee19b2485104f3c080f9d1333dc2b8f0ed3ee4d7406c200d14c5d4f597cf3e5cacef00f4917edb04be20ba5d1051f2902641c85e0ce23470163fe4490f0f8478938a3d12ba7b7b5ff797f4d43f0de6416d5e9f4ce56f431e77ddca5c879048596b93718a15225c3af205877e111d1c6c883d7288143bd77fff468d1847791267fcb1a444ea9c05fb78137c45d0aa1c77408548fae06d77fb7622356396f36b0a0e8ddf278111fe0c5169da10c2db6fcc5dde2a8a932dacfaa31bcb27be26d9aa68ce291d21a8d0d345aea9c631d99cd1a7f21f2074a5fce44fd7554b0539e6afd31d8b0e138902ba1c8af15163cb2bf0e6662fa4cafaf22142fedeb7b4551a8117220ce0a0dd1c279da7bb98a1daa490e1e562fede57131944396b5312a1fc88fc84b47c0ecca78491aa0e83322e90186115c116f8e2e9351d3006076946142d4aec8bcaa57d2a38c03ef3fa60ee77f22e9e53d45fc3fbdb948ab6bbff6bead6c8019ab2af192dabf20971e57143df85102921215d23d17473ef84571e3907ed3f6ce81d72c73845efb3902cae545239cf5e31e3382af469800976c30cd8f2d877d47df137b0d46e7ee558b85f4a577632e48d0439ffeb20847d97e7116f330138e2621846fb888e6947d26fcc4c77a402643d6aa8cb3e0346f6ecab772653ce4a3e9e78e7d1dd0d7680053a3c83382b078547ffcdb57679901a7ff88426d9a9748f39fb625a5a536e39fa02f916257409f0b5a9efe61ae9289157b482974df97f7d3c88febd87c81819b7ad492ec3e5d04c8f525885b2bdd7047cc9b7a1382534b2ae060523ecd53ec9462475f39ce72342dbe14ebbc65c651bf71d6c6a209758d3975fbdb312e0a6f0af50c48c37e3cc7aa33e1ab0df2e9a7dcf9ae81d90b6b68b007a6f9680531937f81880221c3f919bee51048b849b3ed30c2775e00dea157ff03f62f3be945f462b63efdcd4653b4ec50253753e0b18c4b7ab59db219b3c5a6f96e0f3550d40c44f1b5be3e6bb923a2f39519594e6f1f9d610dd385331f4c285672fbecc2484596d270a5edaab5d0834de44140e949119743d491c2b14055f3b9a987bab43f2ae8c6f4576399b665fdcd97519347dc0cd961ae5b132ad37db981763537bd1546bb4db535389f573e830122ccd8f0a46bd468ff81fef6252dba4c6d86dc2367038ed537e1c55204d4a3771b157a6a1ea908b84cc8eeb9c1d0a68903ff20bd90ebb40bf0cfa2284bc2ef9df4be001ac75ef6ee1a725acc4610deb5bdf09db24f89fb40746147a89873c7f4243902991b081f58ed20cbc40e68f361101dbbc7ef58a52137493e497781bd084e18ea5ba60ef2a73956ca37a74364f98ed8f354fcc2521cbde9ee9165574f48b6d03fd8d50e01579376de7d8d3aa40daeb4ecf0046172918cb5e0f6ee7eef4412f16ba7447fdbd86023612c4ca9411bd434010f72b0872e085fae107f632d78c6ff063d60cee2a833cf0aca5239cc82b3c8c829d43a2050d529be44a4ae7a55674b8801a685a64592ec23be3a4696f0b1f5bad5a558ae9857b69a29daab6678687979aaa23e974ee20d549e616a40d4434d418972b6b2632478ba269df472404f0b538ed0544612c5a505d1540f4abc0c3204bba8bebc5fa002a6c17b241e4b8f739e24bd61333fa235c00daec0250661466ce2d3eb2cdc7ec6d890de84daf8ae44c202c5dfdf23fc521b89ce076041e6fcf2a560c694680557d80b54c128e62fe157bf863aba7e586c610c4e5f7cfd01b83e69fbcb8380d8181d976a53988288ebd7a17b0c55ad3af748db8c32dba6461a98a6f1846ac56b9a21db7ba69a6c4dc6ba6f20cf211f18752b9e142c1ccc389699e2de6bca9424408d3e2544bef1e304885ef3fdad62758891ba72a5b0ed3dbecab43efc138bb6cda835e3b866b1ed27ca1771026b05d68403b7342a2867d9e5a3918fbfe60a97741b59337c322ad092e82f3487ea87b01a0a2ab533f3eaa1cdbce14d21b29f2ae64f2e910aa1db11f86aec9af89c46969d1d7b925d93e409b95f49f3bbf9b7f596cc1c88de263135aadaf630df00e0fe8fa620380198c2964b33221ff92bf38c080ab987814fcbc03cb0d272a5a8e56c843ccf32ca7324bbf5b1002e63e9c052ac937c197e7f19361074e7fce704b244fd59ceff02a3890f3b617aab8683acfe16eedabb304497fbe8afcd2c0da4d63c7d85a61964ba4de4aebce823dbaa27c2b9855be93120c6a607c9e87c93f9cf976738fb0e4b1801f0a22bef03ddcdbf6516ff86301ba423b9004bd08b14841d0a5cfc244a304d43a7c856d5d7f76ed239a1a5d00c3a4f4da964ae0bc409c43ce9b147b859aeea617e8396532cc2fe1ed50c20cffa2772a2eba778f0b3de4aadda26942db9315009e96692ed5ecafbe3bb98e8ec666dcea2144b3535d72c77ee400f6a0ae5421e9b7cd3b4eb0a79f8cf41fa76abfd77a3e9a7b25b21aa5eec8cafee41c66a7bb6a4ad7d74f29c5a75402c8342850bcfa2d82a9f636aa9f009079e45b3f6b528b893ffa66b9aa0d6e1d4cfd5e51e3df03bfbf144d677628a6dcd8fa828f251d38507e7f10129a489defba054d6cdf063efd3a0453cce40888b6cf878296fdd26bc7efaefce4613edbd2342a2801acfa52eedbc330ed5d064d2546d583dc5937cbf57bce53b667b7d1cfa2b21898b283e89b8b980b524aeb9d32252aace8a21601e208293c11137b27edece644ba5868a80a30ca0c84117f22e354cf25424135b4967f05e07ccf518435fb0ed5ee08733945b3a25d0a1c8a8142bc0c17729c5c8d1ac9ab677f030390adb572f2bd2a6a4454fd68236cd1d465574328aa001d553375cc63f8a21557f45f0359c4ae2416703df56489339a247429d26d05752be750af7274bb6e6e165853ce0d72495f3f660a82ddb4e6de4456c0522151592dd989d1a228d96a76086390fcd4251643adcec38e1dcf0d04fab424a98db5328df488e144c57a1f95f4be1e76f7059e39274f6e006a0030760f365ec1f95a8ab200f5ea3f94c51334a3110525bd3968a7779115c00d6fd89b4b837480ad67e804c577f17ddde3d0b9de034df070eafcf6633dbfb54e468cdb754471d0f005d5eb0ab700e5e8fcde8e6b3cffbe563fe38fb4fb75c974aad59e57205a980c5cd8cf995d1e5ffc37c31912652379b961a4d831723ee3c9c53a4cb7c039c047937918381054d362bc09c49d26bf08df77c73ba44b22eb93bf434d5ecb152fead3402eb078a92963b437f6d226dd5311aad51fd32d29ca1bc0780a14eaf7cf3c43b67ac83e25494547d6167b0e8442962255ec88c15c66a9ef62e9a0c5e687870c62624a0ad01c509c6d8e5e85bdbdb806cf0989afc2a884748853cc03ea3f1155cc4ffc83b388cedc84c544348facbd7ecbe09e9e6378f67872b15e4d0bdf24477daaa852d576052ea423f4c202f7eeb4d2d8913648bf4523a9691f4a5250060afcd9141f3ecf3ebb531038d81e8693cd6b5929207863ba9cb4e5d7a3c678ffc5d1460991f779c1aa1cf4d61eec41f4f41fcb2d04fb4e9d0c1b8b4eff704059a085574e50075ed6248437973b7311584f75976689da66369a67c54b0756905ac49f76ad057665c551154143d8bbdc0906f5239c581c95cc6f1ffa986382514c59a70aec584d75d558567ba29ccd8c4d4227d89619c9c2a9b2cb91fbbafc697586267bd4f093785062cf4b7b30b0076d2b941e1e73ead5138cf4f43db4cac21e74a3302d7650557c96091a983b6c37b0e8c35efa0e86b55325218a26faf6438e4ba693bf918cf4a21d8b51bf660a0260a23cfef393a54cb1a4dabb7d3488d30f32b70b51ea503d091edd56b9599152c3808868d1aa4f8174 MD = 956d5ca8fb9c84cdc882eb0bf3f5ff0a61238f982286673bb9185a45858ea13827dee168b4abf313a0b82aa5e98d2a01510dfc9e2228c657425f2941ff0c6d63 Len = 76264 Msg = 204047aeeeffcd141d9ac8fe0c003df086e2e352a20d2a66e7f77d7db497c46bdf7a2e389d142d18a254c29d897bfa2c752db9aef9c8b68735f6c7cc427e5fb0d16054400e20e651cb62feb6dab7b3b6bab712bd77501f51cb5d1748897af8383b1743300acc01a5dfec04afc85d6f769da779e6e34a6dabf055f559503499ea68ca836e59c085fe281c5df21b153754662573940661a97cee06ea67615449ae9f9f9a64c3a37a43ec1890e59b8612385c5b8a2ca93bdaae0b977dda8281116c27be1278101de95c740825f20f59080ac86f4517928008289030371a7c63f70c4950731407d8d9300815a480413521b2f2892cbd8ad93bd2c5fb9f8f17a306774d7d439f727952a9ef6796f6f7c3661822d2c88658ee7c94f11d3da21ae943937b6c0c8117ab5cae732583befaabde24a071a0dbc666d2565dc199b94fdcb8491a465521be140028da77f13f129491bfb38f3d229ae94600520d3c3e7c256c827432a7e9315c45fd6d866ae1062688cfa55425c59d21df7a1629ad976a6c6724cf598940372c3416747a750ca00aca3dbce7e22a97b3a5acf13e742ee158b21874e3838e972cd35b377b9b28a6e85ff24171fcbb504aa07f2d741a69a9915447abf71d3c1a032cb4fdaf629de16750d57b19f9de8f8cd9d911f226b289c05598bcbde0b08859470a104155d41930a4cdb40863fd1e2157a4e4e120704a8dbef2ee5e5353a9d82a43b657f93316eb63c43265c17fc3b222c6ef68900ab49f963f8a02ff8d4426df49381ad8239f3f96a13f599ccc47e743297ab0ffea8f9fe566d8d06ac723eb6e02deb1790d7ed4444c210c7b4c7167c1b3cce1f577a334b34f20f11e670cd0dd58ef446457795375ac20a5e6670bdba44e2f22f819b80709e2aa8da3d7c87c3632b5fd226b596431ab864d6585dbeaf5e1e99b923895bfee07bdcb7f7d1f99817776023aafe5ae8130992b810eab3dbb5343754a3c03056ba6a3d33cc3d8ccc4117b7b348de7da6c24a368c16a417bfe8e85d8a88eca8187a7a2ce6110bdbf09e70c91996c258ffb6dea2bae01654dc679f7eb3594b2da4af203e477cb941a57e1706befb3697635f4b79dce3be15b1cfce1d778b783b9bc6f0e3c055e2684b7e7f133c1cc793722a151e5ac817c4c07ff8ac3fa5f04c5e6070aff93303ba62fe1d50e941e1d79ca5d022dcd39fdc9906a3bd841f5fea7cfa04154aaa99b28cab76526f2111fe4360e109abbcd2d79be253c3ed7df39067f23f964d1310db18d52e9a3620d46216d9dc456fda3d4059919d51c44877d8bff797b5690305ae98298a9ad6d7a59d877f366891b25ba14292c4e9a0e5392de56880f536f0e4a7ab072ec6a99c021b05df63e5a9db9a64f7747eee2bfad3fa68c3afc83f733a5091fc8fc0571476652269093f20cc9615d8a53fe19defc4d8baa768c0daf083341d8831fa47a78ef66daa8af79f0bcb4e86a36c66af4a88537b723051a1ff3bcc7e2899e703eb986938226d816cffa649520da8efb8819ac4fbb2bb0d1d05d074645c4c1904473f18124f157f133eb3c0eb3259ef422b68d7ebf75d55b49afdd640a1bcf2c140ff9d9cbf37433a3f703fb2b013d7e4be9ef6ac9e9bcdf124f06c93875126e37f366437c137604a88680039155b5c1891a99bbe46fac86b4a74a1ed7bcd07c348900664139a78bc9007ccfec094ce467af541a15efef78b61d710bf0d7527e93388feb214d4df18ecdbf0744044b0f6a11e82f6651cbdca01b423789aee09ddd67da792538b15d7f551152a130fa6c1ca81da1de7d89dafb08864bad29c1009980aab953e01bf825003a580c74a02004dcbb18855c709c4e4c05ee61303fd14feac753b52ed2ea073701c28cb88656aa16893e64d4ca47214f87c9afaba035870df9ee530a205aad6030382ae4f53497bc50b882cedd06fd78d4849e822d56ca510832335d4b70a0e58d61ede133e25238d831e833f3ff6831b3c6369d2e5c9f1ebbc95f0d9c56672ce1e6dd95888963f0e94f9ce9525aece2ee3780e4eb6f8fdcdb58df045b318a9ff36e02e93e51534e4bbaa8da424011f14b808340abb521f3308ab928d02c92a48da265c59c61a9b8c51b13ec0dd95ec793494897b859ddcb8204f763436c06a5752a0d12e9e2ed98211ae609fa4c5bcc8d39d5d358814bcc9971a19cfb1c6e0974ad02b66efba855255e281850c2906803f934dad456f45f3d77bdbb4162533852d44d9b73d561579a90e10158628604bb316d9674ff5fea35be55a75d663b9ad746f5a73f97a00647571aac5a55c4067f8886ed7fa414d74aef704a9751b197cbab02c41c6aedcaf65cda019dc2d2d815a689c93f6f9c8c44b2178b364b3a97f5ad7dd95076d10b6d4729e86bd239e045347d11fa867e73ebae5152847b60021ef26dce24e2d33175bf0f490aac8088d9da6badf91142f2068c2687c70aaa400e22da8be0d77ca4d66c950cc37a2f37973f5a84843971735ff39e134820a0b98de6ccf7cc7c52cc58f7c219de61cf54490c5280e225925dbc8cc2dc4fe3cbd563e64cfc30fadf12c3089f58a38be749b5e85c885dff2d18e6ff99cb247eb2fd57c961815378abdcde4632b15a20ff7da47c7e853becca0ca5f32bc80e17de973337146f7e1f3c93725a850d4a479f58dd70c25dc516f2a1c01181bc56d7d50dbdda6cacf9171ca047eba052bc2950422a6b30f943a52c3f0100a28d45e521c5be5771210c87d36925a2896af8ee99a35115cf41fdc1014e2e689625216a4929fd592bb6ff97e758d4274a3b46bd03e31b17a71d3a90f83610f3666a328dd69f4486a3541971e2d41b21ebafeebe156a5019c076443d995f6f471946c2774f915986e0e1a33a4c44c43972ad371b57a1b8c2233261ee6c31130cb7a0174f3c660502ea46e51dab129516e91c6bf951ee1abbd73bdaccfa15c3eb495f7a3e268610a2ca6c274089a5576157e6d0838cba40abe477f7feca71498bd66d336c9459420d873ab1cb6d65d1c1c5f2aede8f6ef03b53d0ffac64ae6b9666b18a000e4763ec2997cae7e0bacddf3a284f35e270f3132b2d3c005135f2b10213c7221cb83ae6b96dbcbc690c1162be70faae0e2a11da7475f420186da586b07b31fc471490a43da3cd7190c367f359b2f6719a0211393692703441bd4ebd7ad111b316c32dcdc021462edd47953a14d68ca70e62bdd77a6bf865558fb3fe68fdaf72122dd90a47cf6f1dd90163def6c40478f3b1db5d47e8d3dadb4a9ef081e8535fc1ba5c03dc958f630b579b880865a60bcf573472a6f14bbd5b55d53bcd7845a2add37d5f865bef2bfbb203df519fb9892dbc90bf9e6ea6335d1a20885496cc645ede05c74e09d89b327b658cd95b87199248b7eb37472d666a00497f1f2b32cd5b45bde23a8790db37188736a88256e48863709f7965287e096f16c7351dbd042c6e6a5955bd5f1492f33186c7fa6f12967584836daedfa2c3cf51099e56b63259c3d7d3a4938f6ecc722d233dad1aca45e6bc3e1a0b99fb1f89c0ec63bc657e6aaacbf931f267106cff42b712819f341b1ede798964a0b1a5032c198b391111e88d0d7303c02e23fa0137e74e604579a285b2dbc0a23aebdda65c371eb403125bd366e822e72dceffe0d55dfa3155c16283020dc9abb0d150da1aef251484aa49e49e00974dac3a0203e4c11edc1733e28194b6ac694a8d85082ce9a643da013c287d6469dcf28e8bd42cbac048d3f8aae5317f6fc34f4404965bccac284d3ebb07cbbca07a49f322ba74f1ea5fd1374219a1101ca0092156ee6f403cab278a4fe94faf4511f791501d860ea30858193383ac10baeabe49027630ef60b4ae0c7e36d2e65e88458f9c6528b8f42bb2c6038d1a285288b7e79098667e1f2b2cedd3561c09f6c77b168ffb2397e3b125653d9eb2ffeb623c2189bbd89882f8e754d3b1f5bf12b6e14daf453e547b80fa1f661d3d3e8d60941f74464fe38f04286a08af25b0bc3dbf5d87ac4397c181791b0874848c406a090ad9a3930750353656f9b97385fb445c6d9c99f807bf9ce982aa0a4c920d68e10a40396cadcd745b412e35a8e6d8b301a67872274d7cba947bd54760f7fb4265463270a27d0daadd53308d8c7a5972f630a2a0961100c1c02f1093876413e0dde736b0fc1e18bd05b38627e7ea89698332a28c0efa549bb6c5e35688815c2a9114d5614339f6971b8ab86d81dd6d81f0d4019d56b07f2ebe66d6f82cf5de09c8f696eb3f75b01e67ff4fc522fc0fa08440463a38dc89641f3a72e13b69a163ccb501b7b87b4c3c303bd29991ef76af889bf9cd7a267b2323683e7a7d84ae22e3789e2b76f2d5d8c066c950975daa974410a2bde5355c551019c329b9ef0c2c5667f6b0408350d95da7bc52fcefb43e00c4ca7241b234e12f748757b951c36b6dac90afe0d6c72950263407884c9b8e04e2f85456440bafc8a2146d4353dcc56f6cf48e1c9241afe10cb9d7021c676e9790b5cbeb94eaa723caf2d1209d5e24a6d2abb7bd5fc7535781d12a340920c503f6883fca49d8b18715a7ed18d6516f58033c908be760fdfcac0668e4b9cf7d8e3ef918b90cdeb53eabbd28f2a6bd8ece2a2f834dcf149516b6dff9dbd47c7d818d90be8185039b8eb3bce978b7ab68506d0df6cdc2eb03eec6e445e1032dad240ed699ea5b4f4bc0552a9a70ae22e725f45d53d166ee2fcc059eb5beeeecf5bee65211bb37caad1bbb91a2a3362bf297e8a70122632402f79b94af393cc03d99408d8fbec07daae90a7869d9f5cd71ec71746888629662b9af4e9c1b95b26dfb420d79b99f6f28706d6857d993104d6db64af0ca0b4a38586955e52ca3c86d2d145c39757ba810fa0ae8d46db9fc6c62e0b401b2054a6d1df230f0340b0c2577df0235bafd314bcd0980485b0f9ab71316370306f99ee750726727fb78867e20cb85d74fcd11c03193b81b6c3cf116c7815d5e8f8e4c90391083f148903d5e72ff6f86fe92505670d019b568e90972c849ad7a156d5e4f20f50bb5e5fb39afb3a447a98df4f7f7d1e72a7e17bdebb15c95afc0603ddb0b4c4987dd986282572ce196aac59d0d8a9b0073df41619ebdcc8dec9637a7ccae063380d02a6d214025dfe3f06e329af617457d3ead7c2a7c605beb656353381f96db7df663c31d50e5c5b6e3505ea7258ddccf0424b798d85f243496ade82746446a06b70a0d7e71b6bc97eb32c73afe44edf29a6ebaefb81313508fda0fa20b5808a37be9f24c8adeec0f70de155e6986a16c66532c3703c24dc6bab56faf5619dcddaac61b9082a67ca5da1af1184e991fc7d29bb579a3b5fd1e7e05b1590fd00f3bac6a2f52435695e291af037295c6908a450dfebc7f3449e142917ca51ec5c846e99dd798b4365e4dfd65f27327551c3e2772af087f8659967022799d6b403084ca26bb6cbd8e006e87036623ea8eea6adf9270658bf556c56f804f48df896f7fb5cf82d546a5a2cd9553098bc7b92396d735e7dc8bc768f7a773a7ae60e7acbf135ed5dc37c46df3911b80b2a61dee4b7623bf746745b6b280c329d8d7a410ca4d9c5b8778338967e12476a17003740f24239e3607b7698162377ccd2d06c22ac951bde0f23a1db1ef36915e0bb3dd6d49ff2d285465a8e9b59949954856ea67f145a2ef8b21515a211979f3617550ea4d7d135434969c74e1af373912dbb2072c3fb3bb2c2f4ee9e194d7675991f5109966f8c290946da94e42efc072df4094e109984cbead3ce6967053c3da4ef5669381867951a54210641918324fa8bc967a69f8aa27e343d9a775940ecef67874a49863815d1243328cfe5b98937f4f935e287bde5119894b7e6b43501ccfa5c3347137e29e239a962cb760f925ac2115f50ecaef229739c4821a0792ac22a5daacd6aba4fb1f6cc5ae0dce5ded7759a3a7e28de584a479ca1b4a89db6636a041728d66d05b50e44578c84eccd3281fc6dc6e6bc85e8a71e7b1c271333255bd81f05e116ea8fc27a0f4b0874fbf069d04fc780da1978f4ba2ac4b66a2f8c524218d135484c96c605d888c22ed995af8e86fc91b7719fc2c8375ad1031a0cffea9b072d61ca6e8b5059e26c6af496c5bf79d293c53cb193e1372b018e712bb73a2c345403d27b74e1f9d441c9bb784ecbbef5f183c952da9d90c1b26cd36d1aa932d5239f034235433edafcbbcccead3bbcb35583a5f82955eabb8e1e9f459cc0456626a3cb572efcaf62f7c176ee5397f9a71a455115e2928b84df245359a007da63c7b2992ed466b1f8cd7b686bf4690c5dca396940a8dc199a300e9dfdd6f8785aa13bfb3dc829ed28d83a0fdbe2175b23efe04ceceeab1b882b4dbdc6a40a95b72da070087caeb77fb29ddb92bf3b6cb5f5da8a8f1687e7cb2b62512899c6c905d7a08623547db749e7076a44ee3dc770666880abd2eb24cfaadcf6b82ab578c3398cabf3021f5323e0172a56e1a6e1dfdc4aedd7865d4922342dfce9c94f2b7bcdf5601be7fc119a383d9a3d4bff4270a1d22076b346db5f61c5f222080c57abff4b30e2889c892949fb388c9fbf6fcf61aea72dec4041d38e456515696593b0682e9d0b6699103dbfd093b93f6fd0488621004183c2132b441cd4286ff3563572f012daf44a5d53e44e2a47ad790a78a9e9ca763c54d5b31dccbddf8e2e15b7ba3020f5d458a71861d47abc8c7384dc275944205870e03765c580af468e68a3a87f45d0691ca3d7b2f3f38c3ed7c5efa9002bd47a9ef8f4c6a7cb1c1b9cb575b83e0fff353eda3e423d233b572e442f896ed00715475687bae40baa8fc182ca83ecddc6cb1790a8aa00884e47df86185305ef2cbaf2af6cbcfab0df15a5670e761c3deb8d3f8da364fea139937412468065c7d9de395a10476c693e4fa0c8ae193caec21e2f17aaed77fc81bc746f16bbfef882e173ed2ed4a9832c805c2e45e7debeeed06ed54bae2d08cb4568f3154031ffcc774aeef4ff429d3e7a200e526c72dcd656673cf2415e345aa0ca54dec7cf5bfb0226c62f21b815f87fa4ff50018996fd12b0b53b31ac2dd46100fabfbd078ba314800919e68a9bcf134367cb51835bd797c3d482e99753ad08b55b549a7b1d5920ef3e61b82a8d46d793ee20e700b9fa48292175e39024690a400d29daaa6f91a9dccc73013868d42f1ed90d0c823fe9c6591260ba373e7cd849769c080610c121d139ea7c04bd1bac3ceecc6c783c0a74cc3defc7fd007d152a2e47bd2eaf7c2b651d2463300871b18665fb71635cf0e5faea7fb741f8de237aaaa944847a3728e0ccbd614ad97ae173f526a5d411119c8dceace2a6a61495b3623d38982f76ad0cff11e0a58e8bbe9e02ba843ad700facd50d3e4ab86b4ee5ceb7023ea3daf1a21face8be0b648ab5d154397083d33a361f7a137c129338fefacee70eb036512c8664fad8cdf262a49b33e58dcb21e08b449715677fc151cd43d04ca2b3f2d0978b811dffa77a8ddec53274428b444ad6ccce0cb407dddf7b3025f7a1b3f6b70bb76b19db9fe5518ad7b7ad36cd23c03d3d86bf0ab2cf2b2f4a35b0b4b92a4eaf908ab615c019f7d0592c591298a689e82126f712897f7d1217694183cc76dcaca047bc550fffc6d9d4f8407df5b5ef00ff187c7493d51d4c212771b5f4c2ab2a6f08f242967f08cdd0832a20ea3838ad60c316d7d8ba5204f0d807f339f60150833621855c8203d4d335dfa28217ad16cb8f8de3611465620ae5cce4a4fa2746663a11c669ee0114677626adc23a9664c8e4a84135cd9e8ff9b488313cb66535a07a8aacc6ad48b813aec9e6b48a3bbedf2a30995ccb45b345af02810a120245b76054df7aa520e660458ef75fede34d99c9ee92dff8a2f5743d047d14f7489d355336088dc0d3c6d4a33e88cb4cd8397d29a7d5c53afd7e10c554cd644b7d66a2bafacf08e4a882f930a140019060a914b3260a167b9d76a1b1bb1802f8eac784ff66dbf2fbe63f57557ec8089fc4c5e4cd32d8dba2cb04ad680106f4e4d7e9658943d553ecd62874789ec7e8634cb777e092e71b97cf50be52ee4044f98bf3ccc05864339fc062da03cae6aac33fa455550fe0de42f1835bd74a6efa1d500e420c6f319bfcec18115cc8cd55a6e7b70492716b2c8b79c50d5fdc381c3a6c624ed54ee392eba1709fed6023f1f68a150e01802f0e5aae3d5a526d44b43728167883be23215428920e1c5c91879a71e9fb0903d58b97d914cd18c53dc9fccc53487e87994f1fc9a7e65383be1d7ae4595111c404ac2a4271eb19acc96471a040472f71ec2434ccd7adf99c53be7e2a8d9a83896578fb317d3ebeea908c7eec06fcfc44c5a87b7949ed7570f76f8e8dae5dc61ba0f7f2ee604d6d463b490bf7ccef4ec7cbe4dd18262d31c7533a9253e42342425c31f8c041a08f8a72a3000abba98ec3a7df40f095f694680e2672c556735fc5412ff3f148c08d7cdca3456dfbb1220100a18e4abfcf061dd13b162b2dd5856ef8f8cdc79f34cde52250c268b38f74467f33ad6ecc40efac448266cd90d11c0329946c8b6b84b98cecb360430bccea5dcc9c87a4e3d1b8de0e024bf2a8f08c4d7c0cba84d739b83be1d205452cefee0d8ee402342c0bc77bd8c4abe49db93d1497679dfc08da31b8a9b79ab73e80e71d6d140865d075854b49ce70e996b5982025adff3929ef8ecced6a08e168083d5613338081f7985a150a2a804abb6a0338cce6c7846000363f55f1350bd30e5780254951cec8faafa3c2e0c54f3562e726341bdd25d59691d988560b7da71a9f634e5f65956c25eabb1af6253f2c25adb006542964b23807622fa1717e0bb47cc6347ba31d0ba17526ba768a64c739bb9fea9792891c6f00a1f1d84e58276556727fa8f3b0cbf4b6ac4967db042f287bba87ee03db3dc2e45f77058c5124b49630d8eb3d94d7a8171470d200688c7a53cb866061a33db91b64682f12b22a2aa2c6e74e69125545fe28d6bee0d805b5ad988ef5952a44dc0d786d5fc8c3604de3fc53d860726e51d5ae2433659bc263f0eb48b687b579b423632e9c96cbefa8c19cc49108fc4956036f013a76fbec0b848a5caa1f8f04c8c3ec52ee6414ffc0a56ce4824af80fdbf03316d9fb3eab36d13d71da46ff0ea056dd825d1ae4b71ff53658b20fade76904c20a1addad266b3fce2f4ce24cbfc545fc65f2a0843f4c1bc0cb293d64fa87a7e38605029086323603400adcbf3ebef712a4b4de3cc0cf7dd3e3f0bd656fbd416032a1532ff2131ea6491c1da0b413d3e6e6acbd5362318536480e78f86f933affb5f6b8d193975f7df5888c37484d4342d4e023134cf999b3a38b55652292fa89b80c1ac091456151e95810cb23f3adec155af9c2a7af23109c703bf3af41e9c5e2ec5f4213a68ce9d09493a56c8d7bad522228a99adb8a16dac414eb3f28707ddc9d71a04140490f5042fc0e4ca4144d333e97104e06368d068fc795f9d0f5774d273622449efe89116c334cebbfe0945fb82d3eeab78f3dc7da3c3906c0e27cde93980f44451520bc191fa77066474a7f98d47d9777fdedc6ac5b1f8d809d5437e87eb168bff49cf952aa690321b1363ae473137dcde867ab0d0c8fb79990c7ff2ecf4ed99205c56f1ebbd8ce79862139a6f149c341b8711d0537d0ac92219dde6d752fbf49ae63c7853b3ef6f52ed324e53867925bd5d4c49dc42b93f3ba9d7eae579c4169593da98f10e1a61e1214a2aa2fb511a4a75849dc9be89445c29184f85ddc877c6d1cbb45230a047a98ac5bfcbe7b69a397c454cba44fd90fa13f9b546f39ba0a52c8a8ae5c0038932962f8e3cd00c1e00be28c70c8a787d9be6f69c975f902996f0916d2a30d6bf12eff2167448d42e46c789ad5ed3ac92c83eb965f576586b32ea7aebae177c51a0d4c7d910b6a1336234f2502fc4ec58e577acb1efdc56fdff669176dfc876d98300eb5680bdf5e5f962fd6fdde2ca38aa2e3b00f5061e4a63018f9f3de858cf3fd1070f42a3448e52fdf55d0791c8ca5cdefec3936800e8e427cfe556db949b1de19573e51b0fb5255294983b765a8693e6628a5986c1521955dcc9a936acd5c3af0124d699c9f2d6fd35b1c7f511e5d5e100b595f6b20e791830bca37e23f7b785e482a58405bffe7a632a5b826170995b43e5f71c657679eb664ee4167c897022ba1db08e4584f246a77254c2dbaf64c1c68bfb8c5e32925bd7e0d984290373f1fc76a5fd0bea58ee7d1a522ae30abe90e327f1bafecb58c61032f26bbbee397015fde474bb4898de4e92c22f1a0b0d65343a981ce99943d6a985cd2197b24729b1440a79f6284892b66c2343d338e79b34544d468134d9ea0e79d84a6ee8038b38b976612f11dea82f16f40dc10cc3cf5dd59fbc6826819ca98f924a8408151126feb6eed89dd18b2323c2e1461f286e3b5efde300d6d15b253799b6898af26806645a678514b7c83d030e62e4b89be43750e65eddce5fa1ebf24cf2e1f911dc518acf6fa72ef7cbc74545171f8184edec5be784718582fd78402a942fcaf9fa82f2846bd14518127c5ae552790279d7c4b08ff84e94c1ea54b1b11eb589115f250c17e075dfaf48a6c49db963a3e13e5b2f3e2ed764b2e4fbc78f0725bc0e56b2580872178713bae102acc081fe618e0a08809cae8dcc79f7e202c1f2cc379db566c47538b3ec05b5a5b0ec367a61436bece5c636688515b3a1baf3af422370a8b8da7e4bfeae958f1e38b1039076fafb3cdc4ff19d5344c97725f0bda6689c06bec8f1e3bfc206f7fca2936bd909113278d27e8294dd93a3e2c26da0716d6c49e90e84728fccc66a918d27f1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b MD = 46cf632194dc6c65bea19ef791b91ebd5a6d21f55a42893c09c77dd449af60cd2a8c70fcd2905cea2081c1043fd0d0b973cd86ccc936b735effa0ed01ef8c4d9 Len = 77056 Msg = fcbacddf3448c7464297ae53166793e2ed962de0d0947c5e5e17abe3cc103b072add5e3de8c0a1f19890ced3f5ae1172253b590c3b8801a400ceb056f3207ee88e9d58a1cbeaa55ee7e029e266812a6e5731d291d923d542de11542c2f300049b16382b2e6ae1bb6b6ee872970c828fe0ce06019b34b3f5e81465e0e89280a531995a51940f54a208e24b04f1b6b514ccab0cb49cfe986216fd797a307f0e42d509d897ee1a57bc5f6e96bfd6f53ee7d1c09dacb37e6f3b2322ac794b470d601dee1f687d2a8f6cc76a582db756646bc87535747f328ce3952a9b688959128f449cbb4df1ae4035e96c1bb90348da32f95f6086409995fe055ba2b28b43921301bc18a2cc143eaa3dfa3dfc5b4b14bfecd5ab5cb8320edcdc5c7ef1c18510adddb2d4217d0acf2c2d8b4b621feb88752b7e7282468a4c2282937cb0bc9c22b221276a2474e0664e40a5c074d198c9f53dc062816c10f241a0a72849dd072cc2847047365433b8830fb049cf00d13db28c31d7c4995485ccbefe0e57b344b3517023f7c18b832a6cf35123bb3e33783faf596ed66ec37b16260e9b54dfd34ae16cc8f8709b3d306e840f0ad3ea2dedef0f8d74315cfc46d07e5f5bbba33147e4d2b5c5adf3f06f0a4a204b93852f23533564a46fd44d7d6e4076cc06bdfd5eee5a90ebf4361b3ab2be5b8294afc5ad0ea9655bdc75658361e4db68c08095e4606ce0d7bdd23c280a49073c41ba7fef73e4162721a0a2fd3e0403be738b797ced721c159548c1bb7372c9c51545bc6f257ded82b9f6a44f650666399a3f368cd812a932051a4a7980e409d999c209a085cf51fb1fe7d7fe6964a9769f2c4b98d2b71e9977b744c6a4e54dd649cff6283750f9fccde4bc9eddb713d21cd337254fe7f2c887b03f37722f1c479fbff06a9ccb3bf43e7dd08514765bf87db467b6b22dbc5b9f85a8505b09ebaa262296ec38669eae0c23a265b01ad8364c507bc1abe0d1af29b7fe85d20e327a579838318ceb98569176a095332d1f37f327e1ea8fb9e95fd0c7c06c79b48734be7182bf2ca2cf9a78d769b81015975a2cbb2875f00159da1f259c58a4956065c55ed4f97a249ae62cd65c22c97ce739338abe085f6fa99a5f51c0ff0519449a06a0cd8507f980c627f3f689e1bb8541b2071126304d6f3d2becfcb3fdb8aa2dfcf7cac6589a27c6e4a0d741db69d80022c0d0441532f12f0f579e1c011c17ae02b45b51ee7ee6450d6d6cef290075f1003869d670a905ec7422338bb19c03a6c2770d9c3c2052dcecca25e65d07d590d4de4c71c527e3f1e4bd4ba781b0f484b6b03029b416d40b1d4790cbd9f88d6c0b42f69a953831dbebb944e3e40370e459e0917ef8db003c09564c04424af3ef2de706a5634266070386bdc57afbff22168870007cd55e0c5b86a6240887af96b73afb46b1ef070fa6a624d09912f5ea97387a52b2ae53e86e494dafaf2716ff31cf22e303867b624fb80879d0e10b9a36410eea3cce785cdc2e910ba8b1d08528143c0edab1598b890ce735b4de96bd8e62bc3b6dae31c60fa71ecc87a052d4f49a952e99e827f7cd452f98a7742dc109fdf0cae7c626d073334576be8b144b41c2dcc6d3a34d43a6c160273b3a374133734b1d1dcebdf8c153b37ecfdaab747a4d516c1a6b5fdb80322745f2a959ba857329a681f06dab64a8d7693e077ecd186ab192d0b8d64bf3f7c3994049fb999a7e2afba703bc64c7732faa8baa04d196db7bbf991426f16c82e375b684a36acce4bd911f5130c174733ad73b2ae40e9ff00e56c5f5e8887474058fb7e1d7aaa7575feb3d61512df5f97753cf1282f07e48e80cf9e6916d864b882be6fa0ed5a436907e93cca416b6a663c4a9f96813cc569726a75e981d2c6a09fea635bf786e12eddfb4fb801850ea8e9e6e3809e504a9aa5850d68303d16ff96c881d701f4f6cc66313669bbf3f3666458e56fee0b1a28ff688e6d8de1fbde4fa0f29b716d2b4c8cd31a65d57ec2a895e8ceebd935de1b6a5b1f81ff851e44b2bade2fb1b928b536282232b9ee237464dec67ac7953d7bcda5e82beef32639a75d6c1c27a0940f4c79775acd0bbdd4b981f4a620f4e0510f8f12f3c2f1bcc616d2c4e93dea1763b50e40657b9d39cf7c1a81f64c1a6ea41a61c561e44888f1e7620f1e5a5e5ab85b2fa6d92a6b3e6d95f194f2b3cf907dd56328febac031c402527544e5c605162524d140413e75b7ec4e5623bddbeee328dc6451ad2060474fed1de248e8c085fb34e8212ade86b46979ef10d3052fdefb16a0e22632bc81b77a3080ea8c310ec5a913054c13186df5b986425b16fc763657053a8bbcee7a2040d5a6337c03b86bc97c730fa5d3e87658433fbfd7fcb4c2e8bbe045879d3a748835dd8b7fdc8cd6dd48f3db5b612fd69c4f91650dd89f8511e95cbd5b72ca999a77ac5a5c6590ec2ca20d18fe674afbced2bfb78337406819b8375aff153179bec59c08dc45ce9600b04a2e56903fcf35f3521b00c29d534a4ff8833d2d77fa3c4434fdc7244ebd9f9a31862b8118381bdbd1fb4b21c02fead727a2db62a5065b1efca2e5ac174752894b8645e5dd20c6b2c4be2dfbb1e242774d1ea25ec184657b7c5dfd83301e61a51e976c62946e7f9fb4cc6ef876569a58f15f5ac6d65ba0823d97d951a4281415342267a0470a8eca288dd6c119713aa19bcdcb45e975555cc6b93fbf784fb302158dff48fddb3b5ca8692cfea21d697bd3d0bc8104b9cb309f29f874b67985934741fc02bfcbce7dbcc83a561741700e22d0f7222e0f4c275151cc196690d3f154a7267594c18e54ed12c67282c597810f3542d1705f1e69639882568e7be543c426444a84a6c50ac2af99faea9026fc23676636d1918a1d5d65e4d2382203b21d2520299760b9c6c4077b95588c65a9e4ce2bf8598ed86cc822b8366b6d7566e90e80b8d6d8b2b1798234ebd3a09caedcd258bf103c507d2a36c72930448286af482da248f6faf36b898ba563b4123393dcb735ff843a790e09d9548e8f743af83bef8df5a3d8b32282496b10b1106190520e002d4edd87f903b65f8d3691ac4b4f8d22e6c5931925d736e4e37dde5f5b9e26c8a28382d0758c25f13521220130ecd1082245744ffcee1ab9e301c4567c26c7366709717b090cefb28f396e642f7a81e7b10cc37a2f31bd9219250a6e7b54b8f183caf2b13eebdc4ca264bffbd16166699c01c8c54606e7158bd2f7cee18fc3a2fead4d9a9a91b464768b5bee9d094834ea0bca56cad75fed43eed49f363eaef1e199c95da7663fa514978b661cdbeff0a3141355430beec04962e90800cb42853378af23edd345b4836e978bd43d2246d003e9eb370a5c37a3177e32c99d4707fc314713f33e8d3ccbfac7844f98abdd78c09540303c71f95bf4db45181c851e44acd9564110e0e3f521637a1555505fa3325e7bb509f4af79e0486876b0c47314d1ad135fb2065108cdb294acdada7159438ec44fd9af0003c50cc36ac1cbae73880b73d68ac72f0ce5fdfb9e9110bda3da6c4584146895038a707f7cb763766ab93a9e2c02eb250a518cd673e0bceb88df3f23df22e8158017bcc434fa5473004c83bbec8139da08f9a74eb131a4a3113b5089e56bf729835438b91bf2664e3d292ef29b6e7af711c5968be2eb918c45d4e79d20585c7913292b87b80860af2938836dc33376232a9da0b48d764c4e2c934b87174fe1ac387edf5593a20c3dcd62c951eb37f5075d690ff13b3a9a92ce60c67052b94c6afa3b9a4c352a30a1308d4ac99ce2bf4bb111296c739f460034249e805aff665d6248a594250695835aa24cfa5d9c9b962f7d374abd0d163f65c51cdeb687f72b778d4854eba00389548a180fb6cd5390dd9580b6a1ecd4f8692d88b3eebbc77c42f2cab5105e425e252bf62e2fddade2c5424ed6a8a446d249422a268b029df9c96075de1baa19a8d56f2d8051357234ef6ae7d2599d35760cee496014c3434916bd8ff794eb51106d3d072ca33b6a2d61f694d33d3f688bba182f8811687f1531f3612a0488b23df47cca5aae585c7625cf9d01daf3a9ba5ca822c70a581a0520e8339df2eb04d87216bf34f8f411b743db4a83bb1fbeabf8856b4588fbdcc0ed864d78e67b0f88f0f22edf0b785297c104e382652d70059999522912b98cefa0b3f6e468a09bf674f85f866f4ae5bea931af256283877044cb1e9c31faf4393f59770901c26fc90910994faad492d5034af795388bcb96030319c56c26da47d45f180e384954aab4222662467d2384d53603f972ab041cdd2989cd4ba507c066ad211b969e12417f164ce8cbac5e7229df1b7a954df9addb26b7db56df434dfe2bda5aa227713571d45409bfcb0d48062c87402bd873ef03e0eb18163d5596a3c18bf1e44d392f924586ecac41f6ad75058e72bcb43a8a5f406dab122507425d577b08e47831d6eb4f29ba1976e24a7c527a38ce481627f72e84bdd2001ffa34d5f3c82b1122d383db879a8fd298c726fb91bbebfecf6ed1937976df37666531233b58407ed4cd63d2e6b595bde2cb78e91c239a3d2c06f75594fdc030a42c5b299be1ab290f6d911a8f33b39f86fe7c026298646ef698715e1d7bfd55a1f6bbd05b8bf5789b5b179dca3b71e04d09392fad41cff7f5cb45945c171f0d246c57fec27da5d53f3efd41def558e8ff94b75943466541f1487de199faadbff736399c19e043a7c4be49f0158aef1f6446ff666dd0aeb4b2b6212c1b4b2fd5e0fb6993a8db5756f3840591b522beee43c81840730731b8ffbe375d2b332eb6a863edc9b7976a4a9238380c07e44ebb66c10acd9d1276b6a208c95b11da31ca1718cf288e3c03ea6982eb4953f926ef93dadef733190514613bde101567c079f4bf179775f1aba04208252fe189cff393bb9ba47c46673c05ff7f637f03632b0903cbfdb3dee9d4e375eea8f8bbcf2e2e0b49bec1bf239456feb33c96d5a3481c89f544912c45ec156f4e9ce1b7b0072b73f12c4aacc1861bdd8283a3060738f6fc9c5357034751a09e4ef1e5a6f9e8549a99d65f36c9791e47f420eebd18635f02c9124d8a786b4cacf5904ab033386f294ca44885c4d525e212fcbf235c321e438369baea5fa2e13e4c6158fce55e45c70f7e4cc03a01f956e3fd5e605d0bfd69d240e84a855f26ff594c59b397c49e1dec4cb50fb167624c6f0c129ba357c219be7f1dd37008e494263a93fcd2d142d2eaf6c99bb36e276cbf1225fcb47f36fd500ea2adaa07e3a8bb114f001cedf88f1164d18cc77e125ddaf5ddac1ae921bd8fd5bfffbbc2ebe11ebbd5e6008089fc6a7f140a76ffe9c8c89f83d35dff4b0184bdbbf129a3c4e7591e6dd703f2bec0fc2ddc3c4659755492f65e9803287b7035ace0ad7e10356374245ffbafac5d84d0576f4ac1f57eaa3fe4b82496cb7bb2ac8b7458417308fd75b4f2798b142eefece6165d6f39cc71d750d79f9e521170f143c01dfb33035c66b5707a1f93fbaa5ac0199dd78e265263210430a12406520aba0c2233b8ef294e111f25f4928a5c22cfc031815d55f5ea4187ff29a921ff01daa08f716a930b36af48a39177a4ae4af95341f50c22017497a835bd492c20de8ac38d3eb1b9ab2577321b7eab1148dc2819f7bc05521f0a0baffae66ced5ca7b1be4420f527b0235127b6449799d1df435b795daeb0f6b285e3752a7a2e5c6639d9dba19ea6c339256d9c6aa204f25c3261ef6071032f76ed8ecf14dbb5c722095c7a4914fe8c6ddb4df4783319525add73824eb512715e2bf62f29f74a46e4098f4b9fbff7b2c95b0fe6f7b4a19ae12cd959ade1a665712863bef337b781b321ba732b0859de558dfb9c6e8c6571fa07da9e085f87b2b7ca1fa4f901c31f9739241d7555ebb7185a593b65232a80ab56c076e4967d0138fa7108c3be35c99839166f060f76e61aa870ee64e1bb6efe01d10bcbee50fafda1a012dad7d626bf09d891659fc212636189dbf42edfe4fbf0568544cfc7440da5f5ecc5b26edf1392b2ac1a6b97e4fc6bec2a9c725d8aa90b960cd8a1ac8870f0b8bb0cb9c59b9cbaece8aeddbd04ecb0e104e515fe07103bdbc60dccc56d2f6831aa3853a203636acd6ca85cfb193b16b091567f8a0438666bde6eb8db9c51f7a7ded0e7cebe6f8b9e61904f1bcbf187a0f87718c9282a758f7a80ceb5bcde8464825cdf1275c903a8eeef20e3c417eafa62d049821ced518fc3cd741d76dff6aebc64a234d077bc303c4b361ca9b52607f6ea787f8789e0b3e0dc13d9725b37ceb47198fc76839c81732ff98e25d1250cdd4c0f8612070c43f93514b2575a2e0c940a293410f48de2ba20d100de75ce543e7e7460656ebc863861dd70cee4c3af81b8bda245d3769a39a8263b7ca80926420911d527c6d8c5c3e7d8db7e02de01a502bc10be273ef2194e6008a873bec910744cac00174748c24f6cba10bb674828708e4423f8cf32829ae72d0adcd586d2478faf9a6af3575e2200d72b1846cd328a9b061b4f10a29b15247249ee37a5ad0b41a49ac6c33abee6fef8781f64d8e9d94c204e33e9898d467da10daeca6ecb47c954ab349f380c26cde69edaa7b078e4075865ac42317fb65b80002677285483918773bb6f9b6d67d5694651f89f0533357808c203e09aeb27d9c85d271d704700049a631ba90b337e48188b40ebb94f3f46de7e15df066f47720d5bc093451c7e95c9348cab0e11304dbb9065ddbbbf8b8b90e75e76eaca251378292bd3fe897300a837a8e89e8a533ed86851bd340b830ec505c7ec6e822786b0ce5125c117470ede7358aae1254fe4161cead34bbc8e9926e1388bbc21b7925e5219d0b64c638714f08537026a8c071eb21a66295913f25b829a99f92f3cfe2abe6a1e07b32d33f1b715d927e1736f9735c7c0f56a7ce20bf1d35f50321e93bb192e55d9d10eda1ecff2d579136ae32aaadb27d8783031de34cd25e7b4c419ba6b4cbe57306f43424002761f87da2d7f1b3de4fa0a97a77e556e33e63c9858cebcaca1a657b63706132f0341c52c133d8fd53f82a8190c905ba0d076530117a0153646f1ce4d7e124f5fc30956c65e0d0f8b7f98da1e27bf4f4a45bf7f6720d87dd2f45e1e9ae00dfc7cff9dc112d696a247ee66290ec1b03854dbe84b32391dfd68f515ce07259f236d00258e76428150f1d2111c51a20e1ea5d7193ccb2b179ce08f3f66fa1471cb1a0bca465c6b75217174c43c4f927f0a27847cdc98bd6f62220b046edd762bfc6b6bb3702b1a1b1eaf1ca50f7159ab02c12936b202b9cd5716b18b6f171375be48660a944b151b4e9412dc1f1dbe3c115b0d724672e5d884a5c8fdf110b3f51a9946f43a24241cba069d92f4bc8bd73cde7956214e0b39f0b59a817a301e561746519beb1e11c668ee06ef14b786268d30b50acafff198a32f6d4094df1b3ebe37d0272ea1a3c26235961a097478d10b3a09b7c9ee609ba6fc8a62c685745616550ac08c15a1b8b0c1923c5b5d2880bee4bd85a7821fed0002390e988aef452786498c8ce2d44f587c457c90d960daaf17189beb22f834b92bc16c935655b3f9b3d3b6b6700430644df603324fe687e5b963221d38b119da5e6ca53e516d4a95c5f2649227f803db1becf8c929833068b3e741c62b13436a8380e122e401af02a2ebbfa9707a6fc6d07084dbceff7d41eee9216d63e65b71814647c575d78d483409ee82b1501c2c53cacff2a622157751b4e99a48f208f8420600b16eb98a70619319a55343b3158c42009519b4a112c38fc2d542fef305ad08336e356d4e8013d06a9bbf1bdc8a6320404d8f7cc81b2ec1d4a7b9d4c3a3aa93098234bb8283310907eb5ca03e91c0abb6a07043339979934697153a21d721f0aa77d16dce7ea387181d919a82358b2c8b1824d189948c4d412ebef9b5abfa683dd57649d97b518fc6bac8d04f7bacebe63d13ee73154f37ecf21cd926261d41eb228a194c81236c3849680b4e6d0b30f096a6629922aa98706d97a11d5073c3dbe875a3ce9901649852d91327129143d0ab43f4a2c685baf427981b4132e23836ae9eb008cad3c10b5d82b08172246baf04546e3706c8e3a1a7850d3bd353e623fd6f07a21c81c9bbf3cdaa0496adf2b52a3f96ffec5b5c9f75c840b23caf16cb5c4f724397f3c5d09b21c85985151e09a46e35a37f266d1519c77c4f73dc115553a6b7934411fc72dee6d328474238d4fa4712cac7115d2b1bec88ba82c41cea6add9f3c2ac4b8c743859418e51e873db534f71dcd05760b049e2e9a704d82b22a5af2e351f23ffa5264d0d26690556d5c9baa4398e8feda5c443497466189d41a867833c284db3193ec52fed27fe88c77e6f4e530a43ec3a948635a0be77b79c3c9f8d18463d1948f85e14332d58ac18e7c9dab9e1f7eec7511838bc7c79ec8ab8c3c689f756c4dcd9844498d7980342ac56d3ce943067d47075cd283e93bea5c350a9e1ca4f381d58b44b9eb53150ed2292c4119f61d9fa892b5d5463599065e2e2b1b02d7ad5b30c8a93b544b90770f10a16137220c791f1a583f1893024537dd678859f6e30065b53b76d149389668e295454aae1c3534070bb601ebbccf71ac858d2ae8de9bfcbcc113693557946507d0955a8292f86fc197e20a2510cb93024fd17c97e3527e4405b925f733988ee81af87086b9ed59b0c46d3a29466126468bfd57ea3d4d72b4cd110b7714cb6ceb3b1692a2d839793d59fc9adfa6bbb1e202b8c3c932b56076e2c3269e44558679fa98cbbe360757ce203a302f78febc3d7cabc91c0cb2d0f10c767b520a5d64fb202620c21c7d7ccddfcc06020355d0bfc17e70cb116b4b8d12d2147cad0b8fd775679b96d2c36fa05f5d243e90e674d098d8c1bf8a0958b2be81f80576888e77c1044322a002b8b1689390cd67d930d8ca61c2debeb380c8d6282fd3adfce941cca4204fce62e066c2165495d0578c3f20c27d11f7924a372372c2d09a8f299f5ef03b03a30a6e29348f78801388116d5fa3fa417bce3e686d04b8e28467d5f83e909b276823ea6187a60275779346cb52ab4054948ee4c17c8919f3b5af75b3352b48a466d4dd758302fc5b45a0b3bfc083573487fac5ab17a7edea738d923a0b694b60e246cecff04c6d1cc6d9e1b270d347c79f3c688f08063daf0729b3f488f4ab4527a045d6962b5e9f3f64570d2b4218f7237955d3154f102ab9ac60497371703a7c0bcaf23d48d6ccfb699d36b978d3aa5adc15e1072a6f43d03e21a1968ba32628afe68bac4add8b41113c97e21e80ca8d8a2f1fa53e61e296067f64b7e84bf374b32009acda7bc45883bb966edc253e05ae2bf7b934eeef512d01fa9f307088a84001d505a0b95f89e8a29d2459ccee076e92d009b31e524ada30cc160c1acd0c7d10557f439e441c687a13cd3e7cc2def2eb115f64faf3c9369240e42452aae793d5f2e16c335c592aca6031323ea2d163be2481ef89ba1569b1bfd01f1f0783a9d814f5c27f8d87571aeb18de197627e9947037fbd490789a15b2a3a58acc26e8a22481ee8ac0f016f31e4ae9152629abf35d4b30e15b38f2447f25609ae11978ba884e975cdeda90db608efc3a9a1fd266538338ba059e98c8901ef5572ea480a8aa2466fecd8eed5c1aaebf91bb518572baa9b86774f2b4294b560fc99c0e28f5f1cb0377775454feb270d9216f06eda1fa835bee927c70ed1a9554f911a19a28c40a15cfc273ed48919df3f29f87327a7bdac6594583f29e64a26cee76a3fbc98daa440e9835e1c21ffdb40d341d7b85a675a4b0775162c3904600b0b45d7660b3743a3de0e058f4c457c579140ef04be11e9bf90f2ce9e50849b848b11730769e2d9c6482bd7967e974cd3e29a2bb53959b533ef55daf8b33733bbd57195492b5a0158965146da2f41d7565592301252bb57686112cdb3d798b32178daa083d62944bb6732d5c2d4f1865f58ed7ed4a0934a9da4be09584425b445f3a1374fe0dd0e6f2934f6d91602d44f6af08a44999e096418bc307e6f6a91a9c489dc25d1c1d8f46adc4c8559126bb71a4fc51aa4281e5c3b91b56edfd3e5bd69e8d17e2f843eeb8aad2960149ca716c55fb1af66bde3e68bd31ad21c0e2b015242e9e16090aaa5370c2ff1eefe00ff2aa4f27b47ec047397f4d3209a55cc162c2c77c80b73a6b1ce8dc2a33ed313c088b3fa16ce2efab3de7b70d2d157635c4609fdca96b9adb1dfa6740c8aa85a1b8e012b0a7ff33107cdeb6671579f6b544e6ffe4178bf3a05d8fad68658ea3e50991117beb3d541fff4a93684a37a5e8e93c2fbc54810d62e48df4cb930155b10486842bc304197fcd15973753b94b77bb4b778de8b3b0cabbde8590d96b61adafa7b3e7b4bc4bd8ee2507fdb865b009c2f91f7f598ba47fe968a8e0c034908014dde5d848cdb2d46b642ee102a59b47072f6eb9316fb02a7615a4e3cfc4aad33b0e6326069f16194bb8530cb8e0d6d891d6ad64f7c99e736bcbc3c08e84774d2a2376f8769a3f4f960bbda5627d276668d425a734003401cf744ba085dabf97eb0564762127f51f5544b5d588e6579695131bab6f7c3b7daaf785aa3d2f4958869a75ca8eacff318f4b83c4b3822e121f79da9730a57a8e043cb9073decde3901ccf3194593262c4c086f996ab973820ef0a99400e3bbdde62b2fde0d7746e26682248ecf4232b89463c17d36f3f08d6b5fcfca659ec41257ac2e58363a49fabda4524eb323eb7e7044c0979e986bdc3dad9560e93e5ed460a7ff9d3f9bae2a0c19c384799c1826e793b5102a10ad178cc4437f142b51cb0804ebd4b0043f195dcbbf56aa1783580238e80f62c47ee5608b214e6dcd65a057ab382612dcc26fb7a190eccdfbf2bbc81ba1bdcf1aa5eec2ea76f67c8d62fb55842ebaeb8b00d623837d6f6ab02ef741242841f87becdbb9c98c9ec9d10f830b7817b9c679c1f4a759cd070a9effb5753cc4c4655019544e10a96fdd0235e1806d394a280ecd714e0bc9db342d2c9d6d49bf6e9ffff50088a716913f899cbdbc4cde969bb2ebf61d82b91470c57f5630345f662df248886f771b2b77cc0cbdc8fe4cc4a6cde52b1ea4e5d946cebe89c6e6edd5978fda930b66ff650e354d8cab6acbfdd2c781b7585a94533fb0b2dd3846b0e2664072ca655d0c688b2b26d06d77a569a5088843d38d0faae2d323fb8d3bf2b6216cdad58445885c76156132170f202fa9f8c17698239f05b79fd98acdaff978507ad85b7004bc69585dc459b019867866fff6f9ae068a8c477d9b3300890f517cd435043284f0b5b76a18ee407c1d6b6386ed731d1c186919d3329e2fb17a692ce1b87ad1ab6c6b1ea42498d0222e3128f36f8dee4f93c1b60a6772620e82e7e8092b62556377b11273b20066f200f13db044ef288541bfa48b00579f8a71f438b45467c7935aaf1d3f88cd0dd4ddd42b233440d3a86c886dbdc5f7f00c8db7a54afd2f2e235e8fc6706fa8cab00b0279b60728f89f5a47980780f75c7d2059b633ec6292fac876956e2f39a76ed3a2afd084519d525322aed3f702ebc37001f4d8eaa9fb02e38e13a29027abf77ddc55d87560cda9a1413688f3bea6c7c6d8e59fbeac7222f6ffc7725a1bde3151daf438a0008d8c8bcdb88d3cd39471690613f13212fe4248f13a4754bc490597c11357cdd7e7e358eebd4c9aeabeaaa3b206370c83a84a228bf28a48b3f35b96bc3b9dc68de29651cbcc2cd5ab2a58ba0444d715a97723ccf579a1fca7e51c97f0f37252cb868dbe8d6d95b4bde264f725573b152973b38e5857f63841252ee288c33e3839dcb1e75b28ef01c9eeb7a23dc7c9d4aea4e3b0dc12efc629bd7bbfaa3369417eebe8135e86a38276543803731aeb19de139c79a834f66d06b4ea767fcc5b3542bc1b8bbe0e17006d1ece61f0da08ad61c7c433e54572f48013624e2e157ddc2f553398a249b44255546306dc8e8759e0c84424bacbcb2440e1cd90df9735fdebc0168032bde212d7fcde385ebfd2e3031f0594505068c5ee261285bcd8ec621e05ae8b98f40a369b2026409ef4501371d3eecdce5bb39f32eb1972ea620bd1712ae103f976927748c72566c5b569b3d3ece6165d751379b237caa294bdf8138b39992e80c9e49d86fac2f1fb8b8589d073d7b62524f01c19120d5ce06f1df01639bd5652776670ffc0e52b67fc0c5f116fa8f64df3b3510d84cae7f602e12fb73335c19a0882b85821765a329266fb3de8411efe67c2de3696e98cfffeab9a182ee9b77e029f3c3c255ec783d5fc25fde68a765f0a868b3e4f529323e9e5f7e132c18226ef24c551d583ba834c34a7f9726b4599636722cab8ed44894df60fba48a569bb567b1b3f38ce7a5a7f7748d893ccd5d3face6985d7a3e65ab146aa49767db365c00b06af5627512ff62ecf4352956c3658212a14b65ac3bd9e3d9039c631a94bb43c4e493877852a3abf05e1b5ae53ea04c92b225dfb21db9b43883040a99396ba76bab4e5a45f75d294b25bc7ffd216862f3555d26f49dc30c05bd6ebcdb96d5a2113996598273546139e588d7030e267ba0f551f9c83e7e51cd1d5cf8662f91da5219fc13925951fa6908111eab7772ed183cb4c6c172443bfb2d2f4bad7628a6bac6f0071a1bbe4b4517e5a53adfd63de575f5fc64cbcd111c678635261cf2ad97cb02a27e2cf1da5aaf670955b9b8f4854b862916bd7177bd56c233746688358580b484331fa52e060915c96097a3977427f5cb7bc9c9e63a6593c4fce571f510a2861acd6630ccf3ef82540ffc2e9d3e95b561f8734ed3202e5b78443c1862a58ae7d4c1934d2d90bd3d379849a27c410f557b114c78d51b1b89bbdebd13e4d0b46a40a41922d668ec96f2be12a7cb281f46755aa7c04267b7bf0e210acd120eb97dfce98a7a4de9083ff3d5f9b6f0502018ef3937bdc1b28d6bedaf87dc70dbf4a3580649bbfaad9a98e97441589255cc4d57315ed9c977f700e8feb6aa67a5106af09ee96063031e22121d8bf507a57e443bd79facd0249f2e7e8339bf8d16774544f7ebf02d960d6c2c365c24e6dba0ae1ba07c9f6c34e0352cd17394479ca3b2c3b5c3e3a0d2d2e786531460b644fddb65006839f44564c5626de6c13da42043fb5cf3c363562924cef85720ec8dc06ca68c04f51ec2975fbdbd15bec5c967796a620e17fb7c5a94449a96edf022a2c25eb7b5692238e2549d5382f5767903b38f498549cfd1f1c6b5be563067801f8d0bf80bfed514f0449fa5b0fdc63f6f92d897dbe156d3792c60e81790b942812d2ce17b3e7de32bb0233812404b891587e4b17467371d7b45f48c4d777bd692133fe875a0a3300f27c69f39656ce29013224b0153d70c52a3df2f8a6d25a8acdfb391adbddb68050c082fa8c5b0e869b51fb8e52fbd2ca9b68f5630da2d554c03366165fe8d07c7ed568dc2e99de6fcfe4b7fa2636feaeb0e9374d3571958f9fe36dc40db4e9ba24c301e1a59aa7ad45f1423cb9745e3910c7a20045c602031511366c0ec86a04e993375319e6d209a483839c32405933630a1dc366 MD = b5a4f6d83ff891451101726f1ad4d1caf87a5d9adb3ab3b90196fdbd440e75cfb8c2e70040f56a60f70da600fc144708597cec73d1ebf7b01f0fbc001a01c31b Len = 77848 Msg = 8532190ee23ddd58861065fe170e971ed3ccc88cc7738a5f4166c5b089250a9ecc72239559b2efd110956d1d16f916e1ce0c705b05b1e02d6d26bf184de3b10776c5324f796b723517e163b1f97b1071a2043021a118fbea0bcf3c38289ca8c16d746ec3aa320f8c853a7040275c2ed735fc31650270849e03aa6399831796d497c6fe7955cd6edf41e9bc540864171a713c9aaf908122513dff5dc2c41d2449de050bf9e005363533356e74045b73423c0b9488b3137e0ca016523b5576fa272977bcccb5a20f974368ae298308ec5880b34776d3ed3fd61636698d9ceabf765f663a793a6ca30c59c9a6f9ed342862247ada0358d80eb887a8ca3f03411b3e6a18ac88d92b979c5d9f7b6faaa7cf6b10a976b7aa9c93b9d9b59ed9f042b88831d63b81f9a6964f3733581022298a782c874219310175e1f5a30de4cdb63b5b9ce70fed01a6462ecfcd6366be820193605e67b156cf5d38c3ba3ee701654fc093954f545bf34f400db4c4f8e479dbc394740c077fcdf2c72b445a6af4179abefe26243c6e555a8eda32a44efdd8c011b0135aa416c4dd95168788f50e94c45dc5e3b52fa2940f1e1c8d2bf172655a839c81790f817cc5aa6accf111b7a376a5d1142bb45f7715fabd0e8068a9e94e24400690d02abd530f115bbc45570e589f0801ad540dc7152aa3fdcc3b0c2b47f984ecc770774f2fcbf17c121a569b115253f16495144cb6b4b8a236f302f5eb0c51794776d2f900e6f4771b171c134ac79b2e7702ddcea1a2e244e717f20de2648df7386aa2846e690193fec4113daa04c6fe0f20ce157dfc0b2d062f463cd50922acc2d54eb9235bff1ae4a99ee3da13bdaa547950e8f3c81aa3bcc3654a6c04f6e10b3d405dc4c4d852f44f29cb81fc69796d94cc11ab10f7ef315cb7ff4e5cf3dd3e2ddf3bfcad7384573d1cbe48c5b1b583f9a8564cdb8a598c81a423241900ea812a931a701db8f734fbdd84d7787ca4bd314e807f32bb28f6bb947d9544044efcbec4c1cb1c8ff5b412d6e5d51cb49044c32457eb1c72a69691efd64ae3e952d970daf9b3b2e0c4ff096da9eaba40bf3f3794a239a19719958b1df6ea01963e3dc83d8ad0e893ad3c680c97bf59087ad716042b10c912ca1a3186a51ea3f35a524f563cccc590f894b81a79fc01f40834e6deb8199dcb014e0c93ab8ed3e8ed408c8bd74c51bfed2e7fff1549baecb37d328912fb24aa0658a3aacfe1985d412f084522fb9509d4334822334c8dd8c1db7f6d015f669820617e35dac0fb3a9c4649ede67e9854f4ca98ed9db081a07b7557f24ced6c7b9891269a95d2026747add9e9eb80638a961cf9c71a1b9f2c29744180bd4c3d3db60f2243c5c0b7cc8a8d40a3f9a7fc910250f2187136ee6413ffc67f1a25e1c4c204fa9635312252ac0e0481d89b6d53808f0c496ba87631803f6c572c1f61fa049737fdacce4adff757afed4f05beb65801cdc0d0193f79ba5bbe70bbe3c4c5c4f160dff13f375cb191c94e288df5a4d1cdbfe668335226077c41338f18120f4939fda3cd2bf1b223e3d80c29da1c04341c6a23fa9bb61eb0ca7f066f6754bfdc9897b3083a81c79576668f1b953abdc91555e050fc734bfc6cff52247891bdc536b5766a15ee854f71fa3ec56558b9d8e1088330fc9293358b498077f2d1f14c3adf54bb6440d398fd1d83f1f37ddfa9a70b7663431ae0a14ee6f62d7e1c43b9cd9db5c2ce7f98ba4255c565e7b1178490e71fb17a13198ade5d1e11c37b9b5316780148fcb4befb672d6deae8fc49b0c423e8e14985263662365fea6af5e1633ef7a01596e72ca4952ae1489e675d766a4738bd5779efee03fa207f1a93fd316ca3fbf1431ecafcf3d68a47b2f93c1eaadb760b4df65bf9e930cb997c5cd705c90278a4ab63804daab8d0afccbbccf0ad680c94d20554a13b60c700375857277d9e80f577bd36dde1581c4793b3f6339b7661208fadc22c22127c7cf48f66deafff7cad4f35d4f6c13fd4d8b0eba3319c8bdd772cf68be3c5cf52d55b0aea7487abd294dad142de72f4622aca6bb930d631e86050e8980e4d1eb1d213d0cc2f2e2cec72c19b68dd1bff2c058a39227974efeaa4a38cd1f5e188013dc5e9f558cc0a300fab9b2f3de4e99c31985fc4549c4d4b0bcfe91edfaa94aadc185e4c3688cb083341d87d44f63918759be5890877d4735d79076816cfca1478b536b8138bf9dba52b5a3c3c79770a9b3cd157df2c0bcb624bef95e079b2a7d843792335fd1b102e1029526b942cd969222d181fe37bb9e2eda88f86d0d5ccc66b2f74e505ba1196994ea91a70dfeda8f501b311c6aaa6a4073a3c4ffbbae908d561936bcb5d45a56dd027903518ae1f5f5310fdfa22fb7140ae868523e968672817670f788c142235b7b6170a5f8498062d172baa6b1e11400b546e6febafab0d57da1934d0e6d7980b3df5173dd7d99296b0e2fc0b794cb0598d540847289c2b2bd3d026af238a3fd5a37385390facac97c36c188c72ea38a11b7d158539012b9a3b7e77b33304d11dd2d97cdc94d7fc36380f277673b27feae532bf2e4ca4b4acf8694e647f0df7e9b16f23acce22297df714514fe36d2e3cd3ba2ec9c84b6f6af3d9d4496d6d5943287ca3332657dc74e8c3bda12ae3ec9fcd5f89de15bf03db141831ea66eb9e321f4a24f9023cbc22f46394f3b0dc621cbb67f9f59bc81908446d8ccfd3506ebf7e1fcd85cb9b728f013efdcedc2038ba851ba597c12d59f7691f0d811a6473f02d44c65fea3aa5c3f89a21b91876158214c3b64bf1b86ab26c77de87a5ef52cf1501380fc5e1fec7c2c0283ccca8a17a4ea7539a932ff54136bd2469dab9b6641c9d4b1dc65a24a245f839df5e7c85ac1c0ea50b0d5ba1aaae390ab0238945b62b622612546cc15c6b897c2b37bb69206742d326c80417f7bb32b5e3e729a7cd2b96f276d6de7afe1bbd1aa7bf2df4dd158906732cf2ff3047f2508a8d5f85b10282d6cfb679f98e3dda3bdc5e99cfeb0f2c667ba2ec005b39bf012d7ff4876b9a6efba75b05e617b82906507dc8a2523e721ac590bcc28279e2f05524b05401d9a288852d4ae89e76f2a48d8283141a89a54bd95f28eeaceea34789e45a957ea965a6f2940fa82d5e7d3d1bd790cd4cd70b204078f92ce282492b5227bcf1e7f1017d75f81ececb5811f880e2b776f012eec28141f6232b1c1ec637559c114699bc3496c13d01814cf7fd460dc2b70c2194582424e97c8fa46840c0d6c39ca288dff4dd5735e956227875f4bf7737aaec460bb28898de160370c17513f93b04a8b1e4d323cd2f52c2da88135fa09fd15b4b03b2d5cdf2c91f7e70df72059673e07c2dff8bcf7b7d15655d2a5703968a56ed67ac724e60afe1d975855cb154f71886f6e9f80174e001631dc10e69c5dcc5725f28c9e3cfd031cbf9ef3ac31e983819681ad32dc3826f1aef61ec99d3cf902315af4156e735f89a24a672049b5f297bab198219106b48d3fc90595d696b9f48aec8426e51e51c8f1d316e3c7453d1f4e66e6f8e02a472d66bd9bd7b2fb9da2955fc34f2b5e887f20d189433507d19ce41a200534134d76b65c180bcccc02a0d30d280abba471f0b1be44eb0d8e3e94fe53c9f3276235eda12d20ae8e988753e67d28c610909ce21701c037db48f2ac1fac4b3f1497aee6a9993c4c72d1aa5022384c1db4a367b7e33481a608b89c26aa7c3a45961407165238c1420417da0a28c7187e324d70e688df1fd2205d79b9315c0d932677dce11d74663bdccb95065c920473f3ff36e28a69e138bcb839c836c43bc440239edb7de481a6477d79b95031967b844928506a5d7c4628595ac84d3d4b456db7db69e5f1a9fdeeade6b7861e55116dbbc3a49b2247871db13b5dc72fc29329950111083455cf3ccd6a7580c0b6b21ab7a753bf70e977e73079ed47242839ee5bbe6537250b76ac6c8377b2b131fa15dd31e22991c8952f8784fb4fb2f2b6367c51db053c31a0d7fbb032ae786d45d98d01e47c3d7b7b5106fafc4344a8749c6769e6f4e27eca2a0b7f2ac68ebf11e05785bf29bc5876e63f3a84c461b0017abd651d88d0395f2d0c4ee4bd5cae0ac4cd3be6b497062479a0c2193592aff97bdee1e3335df7dc5b8ebdf4d56ac08cf14e92ff9f660b1065dc203e29300ea8fa5c5eec771430ce3ff33abfb1517d14f05c397e5ca1bda74531e34811f242ac80a63a7dd67b8aa134ea53b9d3796a3f3c868dc78ec2b475925279db8231e280a95d133bd3fc5bf1e4d47777be7aee68405e0e8f785185e7d7be626cfc8774b1cee1678af22f3b3cda32347dc4be902cb6334a1adbc6889a7fb61b80d35b6fac8bc3a60fb38c9eee6f941940a8bce608d8b6bf1e1baa52fa150a239bb93639fd4a746d2e8a8cfd831f6a7444bd0e56695258dbfdaa656b73120b193210906a1095941b5bf9b8dd978435f41e842b77daad8a3f2e1a9048b201494ac87c028682f7733f3c9388c5a818771712908cb0d934cb3743eeb361235d3556e35df505c0eac25734ba853c1156be3be554ba97f192ac82c399374b43a06fcbf728f07e56d9d1d1d90126a78fc97bf0fb632da39041ae7021aca47d9f5548f8988f8d46b16f526d9df9f5ae5feb20d4b92e6e5a51cc31ade28b735e9306618b3bd413f56cf5a458f7f76aa72e364d35c328e522a28ce68a8ac83c84cb1e39e255a93d00e61758427b9c1e28672571b29de53aa2ff2e2da48ee55886b41742ac7a61510fb94edea89d5a58b887430ec9add5d741e40a876a73656fcaca7c1c381ebf086852f6a7f9e1b4c2ce2b29a4f9779d3385edbc846abccadac78ad71713b6f4bbb15fc964c4cd2de4dfbf13b4a08f8dd7f578be9523df7842038192c3cdd7c4f3511c116587c4482763bfcbbe8d5a3a5cf7117b3a0460100e152b49c2d4f58237ee34795ac17b761300a9ac32ee7c250b31449d03bac304b763046674b794bf11ef156b94e0374a302d092fb26249d09b0a8e7e52859cd8d673897359f439fde9ba5b62a482ac36f75f5ad0ad7757bf65095ba9d70331fed3dd46eaf2f969a147f662e91a272ebed10e1b39949c2a63f1a438a9d1c2470947f6b947c055886bb519b879662c536475bfd6c4f85f4640d961b1f90341306aab564d2452973a9fa9aae89e0920aeaa2deaf9fd592f1fe884d83401cbee72b566729eeb2a1cd4cfae106fc1839295029226016d278a3bcd7c6e4b7e9c48a24c01e21b06a7750b6e3ae0ba8e56009b001ae7997ef40f1e52389a74aa04de33c1161b4e216b3e331dc8a2555f00e9452550a60ebd4f1c2c3931f32c2e962daba71b94a4a5d5b6d030dfbbccae14bb17d4bbf7fda2893009c500fefe66b0a57e507ad4bb2e879d8759f8b38d05f1f487b0b543d2b932f92b981e14480cf4d4207fcc51fe05f140bcfbac2012f12934292be5101a8bfcb60624f1e9b56bc33836677892f9c6835ee5985277fafa3ae850b8c3f3517517252dee24d5b32dbc5034aa182e1b0aee3695b29421b17ba79fa2e9ca44041f429507761f6ecdad40aa8fda2379ee2d726641cce9b3b31fefa8942170b8aee4efa4273f4a2b6164e0a5bc6a130cffc8c06c7e59abb49c3183b1b9124f97be507ec101bc5d721b0f2ce05ecc6f6dac4748c7afeb829ab96af449661ecf87bf0c807a2b7f920956e675d8cb83b10290338bf65af4e6dcb726c1be4fb978ff2d53954e08fbb027a1a55c0da72250622807fa8714085100f1ff7caeba74c47485d01dab3ea3107387a66fdd562af612f05f24d84f88499e164f75995ac33a6e550c8a2011283b63757401e67cffea8b75839b887207490a80a15cec8547536317638b2b44dda97df788b2a77033d632242fbf163007c7dcbdaf8336ee53a7f9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6ea8a908777aadd0e51f3611cbaa1625b0db255640fb92e94208765cca12afebb0e5eb5940e803ec33458bbadf4aa723aa101f9fc45ab6ba16bfb85c750cd34e1ce427fa59a9a07286a084b43b4f482dc22aa87bcb6ff777614fb3731d4e5cc09aec867428852e69c5764a894981a349e073e774bd03fa2a0dfe8e282aa1f34a1246304d174452dad81004c06fa86082ec31051103de6ada0115720304cd40f26c3b4c108dadb6cca6b6dbe2178b27ddcead2ada03c8ed9025db868d149aeac290110342f289024719aff776a8f39e646f2f7c5826892b53619af34dc0d09ac266107c6dada0de5418457f048aa8701eb5fe2612d4e8ce2b9d98e0cc7136f7f9d782e01828baf0f98cbe9b152472431389644e9176af7b20c11f76909095aa6fc9ad56ccca9fe3405b637530e019c04cd4a71d5b72a4dc3bb575dc2383b55a2c25db0710fb165d316e7c32dd25648ed07c10bafa3290998361e23b0db45eb039d4521a6c23e906d3ad51fda45c1c55a76be74df61c3a5a01aeb0bbd48958539dbd5ab868aade882e0029fc0eeb09bfda877400d59a6cc6bb822583026c6aed60c73d098df9be884a504e57a23bf37270bafef92113ec85bbc78bbc1ec45e238bdc4134627650b130830637e8b4a21671eacf6061ef83400963288db1f9fa9f24e3b062708a5ea8e7839ac469bede54e6012d5e1e95f99fab40451f4273070936c3d0ba3d9dae1877365225acc26ed4d6e6611bdf6f1649ab44299a59994c08c666ea6553180aa7e98675833a261b3d4981b3be2ce4a2e710591e257fd59345deb3458a3a6138fd445a4d059954ad3747ba6a6f8d5c6420e3666ae83a8ea26885922b5278e200c3909920d453b2ec6cd979d0588b3f259d2b52560c152d4218c4ebe2e597022ca1d52d3717f0aa9f8106a62b9eadf6ad05f0072ab995183bfda2a6b36a1f28823e1cfddaf7f6a39021d729c46c7ce7c4013b6c2e1644b855c027ace60996becc436cf1509cef0585f252eae3e87f7b32391369aa4ca97558095be3c3ec862bd057cef1e32d6237479c81d2d03a3e1abe5480e6e5824cb80b7f4734923876d7572349e5d9d2d8a39ec86cc7d28b412d32fb8acb28e1b6e737cbf2879a18ef2a284fe5b57bb5d8b0511e1ab23203111a54d53a00bb916e6ca49564c524b2788c0d82aa4a11fbeac62a45937c39c9354bed8b976ee6b9fcad1a84a6d4782e9965cc64a18ae3cf964defe6df0b2c063526c4c4a9fbf182e9146140bf9edeb5da1d2e9ed15e385765ad69a8074956e19a15a32979902313bc074072b70a9e6fc41cfbd843ae5abbde4f6034121dfe83ea7f50610e16c595fdf081c297ffff83decafbb9fd638f248a999c31086e6b13b0cc941571731f2f3536ead766674a19b090f5ea096320baeff4e448f126e6ba716337eda891790aeb41445a2c29c85bc3d4b3136f9855a497c90121d62cb7a0b7ae0190bd561b4da77956f2f12dbe6f9efffbdb35e9750b0a7ebc63be6826ec0914baa7b7ac4c21f146ea48be5b777dca7a96ea653dca16ce7ddbb6b2c27bc7f0fd29d99f7a56ae5210c6039a9b3aaecdac4ce9067e9aee6d2c26c4b922fd58f3d117cf7ca87f1b513fb3cc8ed54e2931fce48021932eba6ff56732db70f5c89af94c31561d1091773b794ba1f1fc177dd42856bd64cea35a3f64ab2094ab3e6ddb90a636c350374a6ce027dbd78ca03a9bde14e2d9c1d1b871e6d5917667e3f5e0abd623818936543bb009446f46ebefb8cf6198da516b10f5b55835ff71deb970646a253f01b51d0eb098e5a271212495c3e6e84fc499eb3299dd1515105841f4840a44e502dd2b4ea97dc55657696299824bd9206385d0905a0c37a18e7916d2d45d895cd2d50864645fec743eec2f2cd337743576544777bf8ca58c3168bf74190cfb8ab9c63cb6a6e763e56fd216b67f52c0764531d84f920667bc424ec4401ebea25801d84dae3abd318f32429c9f4f45c5cc17420c809921831b0852aea0aa1c87aef032c5b3e7885e5ccf644b5008b88b1d36af6a729d860390cd9d04fb84ceb175d0fd2c2c74f0f3338d61aa2f75521b53e8a17b8e65dcee02d7564eb9757b2893e7600883aa9ff7fbb56141a55dbc7c547640c53abbcc4d5b70a6154145cbf5f27e84e31f513a729e8f8b991b879eb60a28b3d2df65fe2782deb5dffdbc681f78dc914468316c6d03630839f7bc9ed25b45232ae62c19845f69aa3754a1f7ae0f4baeb4c611daee127900a9a2c467d73117b753b5d8c66dda5baea2aebe23ab9e1103baa1ba2f00b3189a7285679fcd73e498d7b631ace8dbfae8aa73d9911d0d77b9de61f511a8ce8afe1b076defbc09f5ed3e50fe74004a9081d60cbbec0c44c5f8a86e8829f04b15552c8f9dfeadda92df0eea09c5ba0f63a0aedf2cda812a43e7a1313b1edf1202c72e87c075a7d00296d1ee18482012bb6ebb55f40382a939af5010d8987d0c997ba8569efbb3d28f390ec3f4a4393ce21384d7da111aa8ee773d742541d31f219a2264ff39d8c97ff04ed165820d731fb692cba7a94e10ab68f1c6ecbee834e44b2419abd61e9b1be51880338aa5a0b97f6b9a237528c7b8aaf36cf3bac53428b737dd697b8d31ab3df438256308acf99799ad161dafb65d64cbd003db70053605e21803d02e7377236a6104b63e7d2726a46b4849ebc5e2bf0258e3c9f391565eae323f7c0849c6bd0363982a50fd8b53123b81a0e5dd8ee21f6e5d2d56becfea2293e628239ce23346a6a96845126c476d8788caa4e4aaf5aa7937af9f76ebd0c6a3c07b885211aebc93ff1725a6142a3cb6267030c47e222ce13af6d8a0f03922cb941e3e559c56eb9061e0f9a0c9230830233a9263528f2c0d2eab0824274cbf712cb84d8bcb525d06996bc8e8d45a585c47cfd1ab6e643267db7538ead83224ff4ef2bedee5cb9a5e6d5f9a667df8b4a459d8f58219cac65608fd6fd94b12d9dbc374983534e828fea66577020b25a46f23fc07d29de971427febb5dbc715676f52e5e377fed291500c2468a4c808b1266be40e8240e8ba9306e612d796635521c5eea88e8cb05dba66457434faca622ffa37127a4bef2ab266968fb6fe232b5be336ee6126ab12a67e6fa49aea9240f3989e1ca20628470567a4335e487e72847366bdd813eb3a7b1a4bffbee089d2da0cc132e2b8b99cf5d0b807b8bb9bb1033e251ddb9d975ca103808d8823d7a04d20475f22aacaaeeb6b7911aca1a370420c1c17520ad7018001b756e1fda332b29ad9a84a2584074dfe905b2340bd37a8a4f2b225a3d5b080db9863afb4151172431e17426f0e2e8452a4ed03e2128f9dd050f73db0b6f1095bcabbdc9157c4f6e3bfb3f2d091abf92f5ecd36cdc9ff8956deec8079a54c8347f6664edc8ed3a542638442923507135c6605a2490b10d5ff439bd745c84a5668c36defdde5c7e627b3931bfc21c939a3639d31a00048e793280c2a5e4772ea86dad7a5dc8226235c56e763557e79d5cafe9bca18cf3228da3446620a4b4da769e2ac5a208d7bc3a7f58804e6739f4e9ade0954fba153009c10516592fc61f6d884f4f5f22f4b2ed1387fe4f729c40cdbabeeb98f9d35d8a063351d3e81393d9c68b85e9a8f20cba2c6d3edcfc86f77550f53e01dec5f16afd6fa7155035ae57d35007d60d78104e1488c05b87729f7cfb03fb1ecb559249111a94821a94e574394d23a8b2cf7405865b316f85e79f41336ba144621ac680ebb4a8ce89c9cfab62c387d65b809e8cdc64f07d8a6e7d6e74acdf17158df4ced7ce324f303cc359ea6392e34a33f62091368c0a077fb0514947e30b6817a36f8fe7ef88a076672c2a9dd3541152117d4f3072998f83ee962bbd7b95dc40590f5e622f0f4d0f318ebde2d7ad435386ff50e322a085237ea9868e074ae4a09c1addfd8f47b85fb8fe1ec30e5352b0bd3360df4ab37ac6f718042a04af13b0e31e88fa7ec654e043e6c7def5fab2022a95d9852946e2f6ce4e0f21f216dbf9a486e9e97c0fb54988f543670ce7f3c065a335656cdf503b8ad811f65e36bfc376e06b5b05885bf3ee960c1bd1cfaa63e4f80f0073e144fdb322b727b76331d6c0b7a7cfb9c4bb77fb45ac6de2f618752ef0c0d6dd0133b5bdda59268c40d48c187909a7f759463e15908ecd9f1ff06cba19e56916939f1c215b92934b341a6bf4a11b844c9aaebee3e32dcb8481b4c30cf00737af2cf9697412ddce82d165eedbcc47d5382d3782ecca23e831efc8009e0f80b30541d5563cbca558a19d598d4467392b3865832286b1fb9405aebcbdf3c4fc6bc756b54ad1a583c255ec77efa4ee49e6cbf8140648470f5f9e43055384bcd4e253f01bbfd969f38bee63135e93ee04a871395ca6a7d5e9bb5a413459f743948739926b3dba766f25f985ee8297c2f3e0b6cdefac3c0b1537d82dcc399225c5faf6a2464d0b577120f5c95bd4072992100b1a2f6f6b331c45866d2f9b0baff39e09c41f56328983fd71a1ddcb886e69b6fca2ae68bc0a5974e383e0d6ba5e87e0e16c68e1d689221bdba3f6e1922dd565f9ebef30a4ed77367e06827524be0d741c0fb5985dd2d61cc25439be9ad48f7d817a545fcc48d01ac469870ee14aeec8282277b23f030a70941718ab28fed29e21c2903e98c90e92452160fc6691c64d844931f7f07659a7ef71064fb2f949286969055570da8d2d7ed292d63b0f0e74cee886b228c92e332306a504df707dacb6b2364d0af9c64cefd1bf24b53f31fe5684c8793e5802a2dd2c5772f4e0daaba842a58dbda3648106b328508b8edb1ab9a279c5a7cf71678c66a01299c6daa59c9ed5901f63c26a520b70f2249a648a66d63d200b7bf4f1af5a115c34af081b222b38dc86b77a59603f1b71f6ce58adfc747500c009f7e1b46b2db86be5ed7cd78c61fbba2af6eeafb2aa6898b741f5d921a3f06be604b84a0e47cf9617f56b0b16c355f01ac29a9f2a803e70d19b028b425c67658ca5d5ced8020a59b1aa465b7eef83ef1357ddccfb5f7c25a9de54917b00ee538a55dab14ceee10d5f969f470948fdfdb14128a7a97aaa1dac765c7a1023fdbc5b9f279fd160fc475e24e63c6a522ca250f91bbda96430cf561d9aa3c6580de67cec5cf90a0ab49e59efabca06bdb8839efa277d9fceb8b1331e8fbcf1ff97886ab7db4b5b3e9258bf51707e52ce0a07d7becc75e0fc9a79c013bc14179d3308a19c3315499f1e2d1ae4a4a7f31599a5b7d18b2521906e7f89779047cbb368edce03f4d5598ec071e933d8f55c26fff3abbcd419b60c9d48fbb4bcc672d491be2c89810a0f9021dd96a98dd4f26495581ffb47b222d3bf4c9375922ea17355e059977821d045aab6cfc023d55a711279a0f7568cfc783d20fd24a0dedc021e0ad1a83acb5001d393e1124b54f8becfaecb3b7108b78cbf3c753c79658713627431465954e377250b771a650251b0458dfb5227c3c8638e15b8377c413729cbd2d4fc445d1ef82773fe32f13c09f81c8dbdc5fb3cb3af423312a039f070b7a2ad59349c5277174363e306708065f8bd348ef16bd21dc2741b310122f1a84f8f4a1a89c1c360571151c20f836e0a248ff8eb7eea324b4f8c347fc4d7d352440a5fb556452e8f2a19d417b87a536b2e3d715fc906cbe09903257b75b90413477c44a63497024822b551609bf5ef1d582e04685a420d62517164a0ae67024fcc8daf69bf57dd1fb38c501924568f7544ea4871cd1c8544eb4f588ba9326c8c4596e67c20d81d9a6ef766bddc4cb32776eaa4187bf6a1fcd8f5979920cb913d4520804a33c8523cb79efbdb3e29089850a7add8f171121ead1c98559f931ef73dc313705288f97b2fdb85ddc47bee3c84c9dc1fc81c241eca2ce14d6019743eb1f6f68af79aa1da2a45ab5209c5d2a865a9a5796a487671d29ef8ed2cdf2f782424dfd6ad8db9de5965c2b47897645085cf9062529677bc38fb45b15054af2816d505ffeed2cffc1fa462918b50f1c967b433570b76b6627fba5e36750a71e30ca02f6335fa42b7ff8a1165cc9339777deff4e40f7990e91964b8e90561262d67eea2ad1d64b0a66baf45adb6ce79ef5afb5b85d91fb5c48882dc557c092a6bcb490649ffc2a82c065c75d5d4735195613eddb8f2c993896f8d3ee863630d22b927d0a6676487cd324a386aa0224f0e334301f9e70798bc10ec673e35ff3cf69403886eeefaee1e91d0e3f8944bc0be43a05ec5107a53b12f48dba37e4e383bee7493eff0d6297487892f0c4b50652a14df5aa71962532d1cfb02d496c08d774af399c61786e88385eb7ff21fe09ae619387c1c6c8ff5646cab832e3a06bb3d2bf8f06dbd9d99a03f704d569c7ce056e37439918423d91b90a2c33cb2813001f40d3e637d8acb7f06a01da63b75b410e5fb19a2fafe7ca71ba9497caab08a4a4598ea33b1ceec646e03676d977ba488a345a2dd3b503e9b70079c6a8d25389a93347a5b04ea7af4e802c1291aff3042addc5b8cbfc9bd5d30461282d44fb9575f586545d15e05a50736a1455060c5b35827aa5e02db6780defd72521a908b252c8d3180c1aa0af93e078e6eb240f37f54d025adaf05db9ace960254bab83c786d4b7598305ef9661f0dfee1bb2037fb064e44181ec9780fa19869074f073bc5a40b97f8b7dd5f700ca2696af58f11bafefa8c09cca6cb53da8d0ce6420e079163562f2ec2a5bbab998d5456dbde0f23a17d741f531e441bebec647e3e4d2e502da381a6eb588c7d47f75621f8ad8ee9803f82b52ca080ac581f163b9e452ea6658c560d9c6650699a98d578b66e2f613dd93e67c3ddff99a1cd88badc7676f89d6912af404f85f503ea58b7afa04f3f1ca30da3b3171f684b5042589351a5db47d22e188184bbb40654566b3ee48cb7bf4586f564fc7eacc75fb9b13d8729a2f7502ee5da96600b247f65000e9b667f983920d973ee8bbbb8347531455770f42e5b9b73b604f18ee0c3fb1279355afb39f671cc4a6dc5397086fb7535731a435f5cda6eae510e93cdba9f1f1952d8bf06e5e04a631ac98a82bfc2d9a84a9424fcfc82231dfb15de4dcbb78269746e4fa1bff2d05855f743815751faf84e6cfd9983292daf7385b2d39fdaf8e40a9a017ccd2ffa94afdce8ded62f45b00f0341b7b9160abd4afca6117f7fcf0395da990aa60e359298f8df0dc4c1466a0d05a5d9e6ff36d1f1d94c6a132c816296ae5addc303fdfc91c9ba90abae7980b8d28e72953b3e77f8ba0a4fc357cc6b9d93eb58aca7c01d4acdf009e34d5b9ea2f850045c608e39d00d64553887ec991b19bf2deb70388ef48413dc0424690e4bf5bf21a4f5a2720841ef0ccb438e758fae3aafe7e3b3bc4f6a9a79a6da2e6a2439103cf76117db11f60ec8f4010e7b7bc002612a78be4fbc0ff87513c5183cbc60f7c8cc395abf8da8482c5b470935500d9ae43bb5d493cae2b251038bb2f084dbda57bbf4f799cbc72fa9699bfb1dbcd5689b84118342ec716c9fde748b201e283c5c1f1a5b146ce139c2975650af02c5f019bc1236b7913a6bb40d361d35d8c492589e100199d174dafa7d3ca663d24dc5c11c3e8b6c69ac44202846c5bc554f70ef918c97b4a9f097d3738568d69bdb5e344d0cedfbd6559a86b81d313e04075c6391d669df46e304c022e71461dffd3de5c6f3dac057b4b33a252fcc0575bab9572784147448da865303c835a01f31c9580299de747e4842cd07f512dd1aa81c5ccb2c043e1035b10e8ebf492bca0794fd9 MD = e855da51d23beb4647c4ff3607c3ac88e94a705866fef02842b76be3cea65b43b545d673dbef9972f35d2658ecd60bd82373a5502376d1a407f83a369bfa6947 Len = 78640 Msg = 3299530a2446fb395b9380a85417e9d1f13acd7f1f4a1485b6cb01afa10e71f93e055dff0755a6b573ad1258175691a4110cc648a60dc2972a6f138020b6fdc0a3a607560556ba37b586a5446632a4796d6862676b561de42da7a901d010b83c292558f76472bd29eac7415489d3a9b7cff4aac4b64eacd4871bcd1af84129d5972a59ca6cd039f2da17ee70c76028c5fd5ba547cf1cf7d0ff7286b3df74d8f4b75c10b86799b5fa4d1fb5806902aa0dbf435bd9fdea863e5e54ddb4cecf4eff4f6487a79bf4baa90b879d6cb7e0b6f6df55d5608adde2876c6bd8050d7a126028e9c680510acf67dbf6af1cf923d4e823381ac5bc1f9214f15c828ee49eac7d0a94d32cd1027c9c8714f27877f28c4b559432f1dcd81e4cb5d2e0389b63a5c0bd0db892630549b0d58a6e69797667883b1326cb312f0f967f73fce979f0849008fb7d994f3bbf0b8e002bd546d6ec059e5bfd3a054deb5c19e7dd8ac76ed154b407282bdccb65157a1d32a6273ba42b4514bf289e5a3d0549d78b04ce04157689d8c32f54dec337608a8ac264cd1562fae7757c457d8af9d8eb0f3dd3dbd65d4f17558cfd9b62d709ef3b1345b3c913837b261e42de5c9f8eca701f211a9f71ce6be72c202bc95f3ef24e7f111648a4a97adaf5dda63a61321db691ffeaf51ace7d80f604b58035c53ecaf0121d187f348999eb5efdada68e8be97ab47362c016f428d2f36210c36679b74d8ef1c30aec526ce70c0a3cd768bd12c489dc6dcb6f79e7a8335a006feb4c1d7eceb9d1af997d5ad231f66f5a895a3956c64e9fa3a1b4c6600dc4d8a31a5e056a1a9ec8d502b26c9213e8ce98b90b6418b3f07eb0744ccce3c9c821c6bd5876fbbac832e3f098a910fa09e2f9bf789df297eb945bb0ea0217af9062409ae17918f55e96432bd71934308132e66548ebccbc66690a1c356ee5074123787aa215a914897d5c7b18c4e7fc7746c57124578e688a832681d61a351806edd8244252975f706e96a803b30fa513a7ffacb3e720e47f6c18a7740ef02b0546c7626a38c81e3cf159793fed95747fdcfdde9ea56a786cac4756b851fc8866b9adfac2d02599148e0db7757a62b1e06d26cf8c99556b79c91a5649ea437752cbf3b5f121961821ce1a2a4c635da461e3e14626cac707d04dfb6ed1e4ac40f106ff5ba03304e28a38e99a6daf6d9427c5980d1440a99296c05168f5441e2a6af13ab4760f55407855e0cf7f667ccb5d9bb2eafd03e455f6a8830a5f14837ee6140c871cbc737a13ab68902b91718f29ee97a6891c5e98168ffb1db75cc2858cf8de9e394244d882c4eaa719363329b344ae09619201a31efc2068a422c384852416bf76aab2a1ee28ccdaf060ace1242861da2d6db4bd37785ab5cf706ec6f8201eb37bfba41f7e5d78f25814c3fea41f17e394b55e2f898a11cae04dab920e755c42ef3d01985bed54b7fb5c60ca5ab339ea3f73e9423bbaad707ec2622feeaa3a337b79b355ac60caf07e3f6b8b6f6b2db8d6af3c3b7590966f51d57be6c2471e50c6b6a19e9a3c40678cc6cd8a0bcf5c15006f3f656195358f0290deffafd5725f79fcb3bb4d0b20e2cbf76c0f54682ec865bdda072450f09839fb73c2dfdb9d293b53d1f3ec54d12ae3dc316175bd0c9baea0f568e94930519d1d23767ae10776b5c4e38fa0a0bb077d7d04ca94575c54832178d1d6095e83d7fed465a76f180e8e56d1d79076464041e0ce90dabc87bc8b464b8a1317e0f68fa66fd58f0e38b86f128313e55eda9fd60f75fc6e76f69b6f1957dbc9fb20726c1edd0f5a45cf3e00fee28bc6e0dfeae512e356780d10b9d7a2820c203e84bf166d045b2f9d4566e825d4875c85bdea15effee622073cdd69e8b5643f6776a4369bce00369d02f9d08c424eced4dc670fb0b0f392eee4d1d0f3d92c4ffe5deb74b1224899cd6ebe5f3d15294556a5297a5de0c7f0496f5bb2cbd4ad778ca15a77b6e7797db5f27f3e3f3360e9917ef7fffc76a865a14544b879902ce098a9bae8b207dc0cdef402149a863be10fd09a469759df197dce538904f3f4b1aadfd26ead69b96ecfde108a56f501565804dbf63573b433657152ce74e74c134aaa6cb2b0f558cb101671487c67fc6ff28080b7dfab6edbe199072ed1537b2e01724e5bc293004a2a06edf514c6725567ae51339ce9573b7aab3c52241eca2956a04112ec2bfb13a4144c3924f9ac2f3ff5180f7415b578b710b7e17532812dd29a0d7f35a58f4f06aa55beb6e8f22600bc9bf66f18d1bd21304184ca76e861fbc97a49a5e90526d92fd129d17b8c62346da38e96d8f3303e73a1e32dd246ee5c95501944e0a5bfa30b89257e9ac10a626ff87ff03e63f99942a1a5a52ee5fb7a6756961b70b643efa54258c42dda47132a627285326841b70307723a720bb1dfa55569318282d94267c76aab1c1f40ce06a90f5e9d4b3022209cf4f587013812b916398eff4faa26b8df043b4fd81e1b6b94fd826555ed61ff28d0dd530fb79b095eaf3bcd66de220051ce7dae4d0882c1ede5f974cba1fc0a73b1fbbf7c5603fff8733fd60f9cbfa8e66f7822c6278c707a6eccb0f8737ba7443d55b3923fd001ab2ca200910c8316669034918aa2c0e004410203238c6740641cf61897978d793e826d353657f8b399d8bae5e2a2a7795205a3549313483c9cf7e3d4d489bfce7a1fa75c44a5a6e746f01104164fc7a42e63b88a9131a403b27625d1913af06827a8585d041d141b377f41d86ed0abc75e03488f650e05fd6e40c5f516d5a7af0dc88820bee8cab5322e5347314ed84cab8c5b4a57d1f2929afecb2aaa806d0bf325408cba2d501f00a54e3ba9f0d899dda7f9a3afa3f42afc573d579663c9e4a267878b3f152fbf698b3a9b1cdf3118bcfb2b82b4ab922d5ef4256423a843a2e337660596c8eeff3488204fd3426e2f0f31f8cfaf125403867c8a38967463ad7c3de4e0086d15462b46073e16421448a0f06972e8ffc2143c9875bd3af2b26d35200905db2d2cfb146af7522d07adca35e18554a79b65c84af0edda5647b74bd888dd5c572fbc88b89ff8725fb8c11d97ab545b340dc488772bfa77319efaad2b1f69cdc69c4c54df8b1386f57ed6a98ef7de70d67e67ba8af2a47d141d04fcf88ab4416e9b65c750d64f77378076d5e26d2c7cd716d7c84cecf4d247ec5ca10574c69e99558e49d529b52b6de7280b5ab445657dfc9b1885c2f15f12348a021a83a8ce8df14f42342c4b8bdfda75b3bf75311511593b14fc1ba40cbd1d1789015f61b79298301a36861b7fd582e333d957f972da5440227ba013c28fce8a9d81b1f943f272ba39a3df2df09606fcf47003a466221631acc8f94867d1706ba561217959f3a6740843e187c46b8f485e4c203ad82fc79619accd4be4cc2a430b6a56e8e0df5de7edde3233e59c454eda3457c4af4b8df8d1efc42222c525993664f94ec2fcbe99513b7a3939714f96cef25048d5bc93dd3c5987d7080788f58e17b1b4e693f2149d23629faa31d6a8a34cb2d131caffd0c2b2be727dd97cdf7b4a272134eb20e0375e916f1f26010dc20b2664abbffa56cbc111f96b8229e065c7039d944e718389b4b1b17f96f94c91f7530b2be1abf9bf4f2676b94bb67fb454ec30ee020d87f9ed676bb4cae5ed7ad7e2cd997a3b400624a8f04f7c4c45d0ba8ae32a501b74f1d05da7a50aee78e4747ab3ddd0d1b308083d70155d12b922c086bd3080c3d0d8263b6c3a9e3c763797c4c3e02b96db2dc38dfdf3353163103088c6e8da2f2516b7a8c35bcdf66fda06670788d5b23fde1c419fd14ed0cb03d137073ba684fa134b4db2f0e045e9378a0c87be154c6881dd015e97ee187a646a3c870f2bedd836aad244e11f506eb5ea5b4a6b328cdc80cc74432d5e31f799c43e4f4eb29046e99bde7e16d24085bcf0fb5875759b2541b243557be642ca0ca7e665de8395cc94e8196a78413cb7b46295b9c626a1cb2e56169d69cd737c23dadcd3a9e625f29d572d0fedb46d8a0509d076448dc554ad829321e05dee944827c7a1952368416db1bf755e72fa8818ad5595d9f1304a28fc65ebc6dcd89ae25450d58c8185406cbd7aa5b4c40c395316cb216c9c0a34068d320305935c16592a1e797549a478024503a6d5f2cb241f0bdb1fe4d47a9baffda36f83ca9f911471da9437c4ef6f980f0580ab445ed1e5552d992be2a8068b145f392ac9cc937df12b2fbc378caf94e5263c1d01eec80bbc6896280ebdfd029a0f69e0d709a2fb71ba51ebeda3c0608d0ee11273a292fb08351fc39fe1087c565a058f3d7e48f6bb2e02ac2d5d2862cf667774e0a3b61b013b3be4df3bb06111e9171e44550cd695304ae73ee1710475d6072a9118bcd56f23f27314f47c199363a67531b37604c8683284695822ad4505971cce2a2d9019944c588733f50ca471bb7c4fc20fe61c7dc16cf6eac4c4099c3232df018fb3c837527b8021a1a20cbb5d1be5aa5ee5581800852dbedeb38742dd540bc46da844b40bc546e60a4492e8943a3a93ec6a46e0f5b855fdf8e188a0a26a9b9c4cd655b2801c23a9b85800a068c197a43fdbac7eaaeeb8ce9bb6d35e885cd7b0b6a5c3d9b76a5d9232481c8de2984405e1a15399270d9c5a4d9a322397120729327d55d2ba953dcb007aaf5509a789df5a2503da72fe4ac999f56b97d874732e49c6d44591860b79aa5880a0e6d7ae5a30ce83e895aa0a42042f4763526b63e881e809d942260fc7b84859177f0efa9ded039d6d98f824ed18b08e2f0edd1e7e654bb937d75c91dbb3b40061de35b6d1182e170e81cfdff35ce108a212b4ed197a58af07570fd8dd23033e270b352b1d3ab6ba755a19847c58287c6568d618e14a75b2f0cb292df68e9ddb110cf49eaada034e4a2bbd5baf95eeb420182de7fd5c0b899a3a91d84d7eea9fc6eb5c5a9f807d9b34faa3acb59a9c767a289fa1963883fdaeac2f210c7a5252efb054a625b58c68dcd1b3bfb6ef988b1ba21690d36743d6d42aeb4f580b3dbb3361c3c964ff987feab7d5dbd91d4cbbac8d79fadd70b5dcb3baadac5cb713a33b08930c83e909a605b5f14a46ab1ecdd5f2b028dbdb40d6f4675d7e3d093cd2afacabb7abf847a6d5d1ef522621788b3dd8a262f6314b8e3e36e30e268620103656f31203b6ba470315b73ca108c1bb8d4739f056f840ca3a3127a43db82725780d5364b4aaca5037893150dee761266c485c1922bb8653905f1288aa26bad81ed9b3f7e55ce08b183446d50646c09483e1f32683ff85f1e7c88a0196583ff2d0c2fb11bf5562be4f1edc1540ad46cd7a1ce75fa04ea56be775785829d7203c35d113fb6a1cbab2844fdc56b5a55b98f8011e0ca22f4e8b396dc5d68a2ac37bf60de3fd0d394e2f5ed02fe18cb567bea5978175b02be81785b857c0e2d9927aba7f545ed03588fd85a8bbfeee66d2082ae6f8e2f3c9dbd8725f1861586df3002a2d4c68dc97cfe3a2df6af4033f043b2ff66c9a92918f96a969ef00156d50d4ee21b46159e78aaa5d7e230df2c865225bd0c3e6b60b6d19d2dec3e4406110bfad6375926fae231a5d8bcd8fe4895e84577be70e87c0db2894c77e5602d19b890ff97543447201fb4b1152c3000b5528caffbe5a2c37428d972b079e834659fabeed9ebc03be8c15ce1599f16fd5b3d75d653211cef80b0e84124604ea48b2d95f47d744d2172c308fa18a61586fe159b8b42a7d948c9c74038423d0605d0ef09d0d0724d907491335bc0d5ae462457682f48de4a77a5f86bb8a86490c0fd5051d4918a542154b87696f0a263b3549f6642d458f2e4aba0e552b57b817e56fe18a02f10d32ca9a54d3c1690b847054a0056839c6528517d278707e65a867444c8a417aa4d3ac9e421aba1252e89ccd3d0ead51d13bb2dd9ccd5fe398e81ebc0ec50d9bb44d45c018e762ee428e401e95260275f710597432fc036f99fe9140eee56e3c83c81d66a0e1c2e3259ee4ae70f6718d81fa02445cac6108af134936b58f6c455a6bbafaa0b1e1da414210e596250181b72036b5e4858397244fcc082b6d109e815ea6e2e1fec7bce0a04d2bcf5cba39e1ab7c2f913170053ed9a41c1827613040ca69882b717d6f48e022e8e243a59e47c25d1a2a55303846da58dc446567e1dfd7895246b20addc12b18849881c996318e60de789ccc1a837971af77ce2b9aa5ac90aaf96876ec95a9b667b9bf2f0ae6360de343ab4b923fdf76fc780ab444dc7206f70d3bca860a8184fa0da4dde3afe3ec91522db587c033ef2d10c20bc5ca5071a04bd50d926adc0aa35bd9dd07d4bd86516fc812e3509e65a9079e3607b76f5b0f78db47f8fbe1d1cb6d0537609deb628960246b8d35485fd825453ff0edf64bab5ff880a006b960db09d1f1d5519608a3eeeac76db758652231602d6ab30ecadcc7d2c172d28b3f39f8e5154d3ae50105e1c22f6b20f7ffeff596095c50df5f0a77111156a980f74f01e8aab29e01d4190153aa6fb64cb6a73790daad0d90929d385e7934d1c00f84ee83b9ebc611094516464061c38011b2c0f5a847324aebfdd26100f493720f3f865d49e0fa3e29f3e742f9298dba9978586e7c110734f3930dc1ae7e37be7fea901f627982b0bb8a3df0deaf5d23d462c6a35df3d37731c5b1268bba05cde8ecd5700c9ea58e4772e0f8f6dc7ae34cd6d43b53d5e03a2dfc853aa09045c7d2ad1df95037ac00551298014a962e21893d48df669f74a670a152a2f4e93ed4c3952f61352cdf306ed42db3e0c6bf051100eb369f39d8e3811ae0098fab391a450cd551c4658643191f66b8c25576b86e8585e9058c5418e8d1f7157ac07ec4df7ad57104cae964df5c0cb5f8299b622836de9fa07e2f6d2e2c5f6ebc0e55f81a47f868fd4450b947f1e755882c762ac57abd0179f8b30bda95dfbd5d7f06de7cdb06dfb7b9026ad947bf3d7c444e39cfb8ecb697e3261a747341aa66fad8a08f9ec77d3b1348a01dc65c18db5b6db7ce5a31670325d1c1852e4bdcde661563dbf903eb90386a839cd6868cae5819cb48c755bcc3a8fc29942ec6fccdad0352e75281d0be12b03adde00441fc239b9dc767205ce152ef7a29da79b13cb6ea923b120ad5ce8761ee684a9fe1cda43b56d2a259f0640df1dbcc9c2ea43169144e5fa266a2c781c7c6c67e1f112ac3401ef2e0ca1f55c04b7406dbab7db7aec8acdc685ddeb1e728eb7ee24c7b1968f41cad893992bb53466e5e00b9e3d36d4dd438ceb63194a1cd8418e0edc7a57b9d798e056ff19ead28f15d71207e8f8eeceffe3b3b457996feba1ddfcc9dd3e4845c1abc34e307b839248997a8f7f2f9ed25b317b2bf67b003b51447afa3ad8bf1eedb174f10fc5bc3306dda19f60497989de1c9e44a67d6239c857f5f843a582b57587c8a21887e0c3d8ea33a22ce4e34800fbb998c80f0a797f8f1a4e682347cbe1954abbeb0095d727658d42457070bf5c654992dbae7d7d0f60445728e052a4ba7087b8e7ee5fef7ac63afa3a8ab63258dfcabd61da1fb6c06200ccf65b57e2889fec23af9f837f5b82a9348c7208538ec1b992fb2075b96b1adbfa50f2ac07a47a04869292b5094231748bbbe50b9556b1929df80013f747e13279e954e386c6a55d4c4176790fb739095a3952147a4935f248f8f78ee2ef5bb0c60fe072e23798430f3ca92415333ff44a9527d764eeb5351e6e852b1ed9e0b3693523fe9cafc97229d4a95a9c3e8cb1b74ff4b8f7bfc5e7a8d9279d0d9026c6ce09addb2877bf5736aa05910741c5ce3ada373da524ce9652b95d39319a84778efddc9d1827f06eb04d3c5c08d561a63fb47dc9ffc655adb69fa4a41d61802206723eb8ee58f325110ebc000371f6d6507f27026a1cf1aa4efc8c52437db072df0742b30d534e16f39f134179afebdaf78ac16b66710928864072b826578bc6634d971017cf57b0b24ec084edd7b720bf77db69979b2294f70c066a487778b95d859a547025a68ee7ce424ed291ef43f2c6e3915fd3d46c0bcfa5dd2c661db8087fdaf4b8feb10e0e7e2703ca570ab13be8685731c3753a5f0bdf8544abd13f0e7cc77554931dca80decd4827af8005156ce83fbfd2ab7c4b4111f713a139dada0cee5ad5bb33210980d3809cf3e59bf9b4c1bf4c99ddae5aeffba72beece07f5b0be29aebf97bde2d4a8417cdcb1f27360a36a8a71924d2898eb19f00ce442ec08c5465228c20db76ada0f59b26bb4fce10ba5dc025fd52ebc7ec40254431817658255727f387cf1b3d74eb63d793ff0c64915c3b49cd2c7db0549d58d30f4226773bb623b61a82c402e8404a6711019810a1ed410dfc29e654cffebf05463777f280ca3d5e40bb1805e53e7a5d9c1c191cd457fafaf211ceb846aa82613e2912d0dadd9e726044bf4d512b1b419b17378e10e48d9717acdfe6a2eaca6f60df9e1933356d7ae4e362e21650549c78bb9b703fda236cd4c1bfe5c906bfb81223c4d5721bd3ff3361a9cd1af54ef59ad0edc94882e3028f1a16bda54688c3bdbb2c0d7fd7f888b5853b15476231d4691ed4a21324f6e0b17d8d771df14e18ca707dc942b1039dd219c1c283de24c14d6cf9028808838fa3b3cb19185138409f0a5f0fa3f11cc6f2e3e2ddb8b24f45ae8304f18f75b395cc8479ae80ac6fc2a6517ce98ade6d8c7dad476dcd27dbe7f42c9c7810b5ae7c93b73f3b3c4b1a26460d795edfc11b76db3d977aaa83f030872d699df30e9bcb6216c4ca347662f5e60501768ae2510d745b7b0d370eb5a7d04e156a20c9a20ba067b16250756fb6f002ba3a738935d7b1d19b2c5c1253d4355945e77f2dedc3b473ad0c788f68f1cbcc4cb182feef5ef8669ee201d5f23f1f14a31bf984a17b080261cf940d752fdf2b60e4a088a82ab2e12d340ea0b871f749d70e7414e9bc03dc75b38c37c0f694e79ed9b37188c1480bef2c6bbbd0f123be89c8d927eb0c0dc890c048556ed152c7ad9aa4ffb6ad20ac8dd1006e60470d3c60521103cff68e8f5affb0afaa458194362f5c7b5b76a48cae2bb50191fc1b8a04b303f0beffeef97d77ad8d9adc8916e09ec22d9ea23b72fb4373bb8a97b7721ef39638e0b196ce9e302536661dd21554f1bd5ca8bb4c271b2020e674a048ba561bb4225c93ecd6683302f33790c45939303751a0494174b7caa6c8769f362b533144f55a2d59d980872a0c35bec8a938611755afd2811f774aeba9b91de88dbe402dfa0408469e913487c9872e44cff98e45aefde074f002a7d9d364a2c8a83e4d597980ab19ee4143ff715668a29123bea8a4b1fa82b101e9578da0b43d437c62afb9f69e3c9138bb7c4ec9f548b85efa2a81f4a913281b194c1e95ddaf281f8617048f6a154f1fa4e5a6095ca00c5449b28bed738f1ef93ea2cf6aa4861dd0c279a072960ef09e0722c23d251054aab3290cc5e35e5c436040e848912beb371dbdd6c9aa8d3b5ceb1aea8ed9025a0b40754aa37ee8a7a0870eb1562d045afb9fcceeb92ffcf90258b76624ffdde41df97f8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112 MD = d0eb914e0164d7b272e0b8bd16c18bb311fa528db3e31c84025f259641921649c222ba1be6a205439cc07bf44b8faa02c73caf3af31776cddef89e8e05c11a5f Len = 79432 Msg = 78c5626c5f3fa6cfecba132e1896998c6e8927ea7742c20e754cd4835336c6e1ddf1d04f2d79104565b7da97a4a750af32b63219fe6ef7464b541c89a611bc661bd1610ca8e91a20f2bccdbc37dfcfb8847bb22828f35e2568c763d174b98e959a2ebbadbad6e9e7fa8f94a7ba873f2fcba1501ddb1b2035346d5361a77465f6c2cf86394a8aa822e5f9d66016e7c79c6ef1b302012c65fe180e9243258b6912fc7e6bb93f4b7d5a1ac23bed31479088d73083de816f54077a71c87fd846c170ae0111348362901503b26d58f5efc17b6d296aba432c16d8c35f9e1ba6ec9699422122b2fd170ade079111a9492683fb98a30e9d2fabd2f95ca0bb2179c70f131ea6433c95b1133a8e26d2e61436fe92c065178f2d33b1f3abfcc998381d5568ac581ed8337ad2b3003a5519406559c74d382e99250ddb4c1a3b6d89cb378f1f52ff5b91bfb870d0c6954549b4fcbd22a7e4fbc1ff82778f102451fb195de6c17a62a26c21b4151946ff487f5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad08051151171f291ad0ffab6b94cd3248ea498b172bb10ba87fe5267407c93e225cebb9503966568f7406c1af33ac653e5cf4814b4d167e6fce0a800f43f03bdb27ae089ab5db372ae8dca7c2a64c957b38a2b20ffe0d78e061a3bd3c08bb89df4f9725b9f54774f214c9862c57756b08679945eba660a10220f80883bff3d036beee38355f71b5f0e1178673acef8eecd0216367add5a3ddf350876dce60bae95afb6b945d23a12a350cce210f81a82f5a84340c7c352379c3f562819ecaedff0d05e4605623e0aafaf287bde7f55edaef08df617947ccdf762dc24797f91180bd56cb20b23a1b78160fd8d09c115af376f78def0dd54316f641cf4821b5cf755434495dd830fa9a73aceae1969e4485d697653ca0a533262979b00ba5c5cfe5b9e8869e32cd241af710e5783c63c395f93190d29b814218f91c8e1989f2b8d8d4baa96b27d942ff8c85f01ef82a802dc60c3539642f18f34d7490f8370432568df1da4c1f1bfb521951335931b9235425727df765775ebf0cc7df3215c3e768ccd743ca825cf81a85bdd7b450d95313fea990960523bc84205ea24f8df67c1579b2096cb964e05fba1104b4bb52b87139fa959eabf9d94b708102d506679c667ccb57bb2afb5c2a9f95e1e3dbecfb76bfadb495c1c35e1be477274ee8dced61bd6a533e3ee914821c9197c8186fc42a760a1705ae47f2fd648a38419a1e171025d7257d5df5af6f194c4debdba2ba964759e375da4e3ef8d8005d3786f5c37b9a59f600f0e9d6f97e0f2cd58a4e86c11ae1436ead9fea142822c0b7132899a90539ee505d8b302933225c0d8f3bd0b3d8eb5d778f049d593d388649a98140a24fc034f40ea4660621cd041b50313f7567bf5918e843ffd0fd8ada75b0c6616e5e33f17469fb1f982e584d8837f87b0eb1a560d92025b980515fe2c490c0a3161cdd4c59d85a04e8430a5edbaa572d869de59a439f7273722101c6bdb237afa170056e29c287bcfd492c609c1318fde612c62eddcdf2d4ac56b6afe97cf32c1741f27e6f8f4bf0e026067a54d9019235fa91442f136c8538d6c7c5ce57bbc38079eda5b0a66e4897c4e0d58a64db957b3c8f06c2d7aa2e1e8b7c2ff6ac581ce5ff3e0b7671b86b2c090298c61c6dadc0c0059a1d827276645c1c16e9e193de4dbb2dd74857f102a6dfb3ec906981830d6e3e28c97d8d051430f1a12d6032b1c1950232afc0e0b40e2d3df971b3ddbe692e81d94c2fc38435f141f94c8ffd3f4875044332144e2a6bdbe6e6f0624a07dde815d430ffdb9bd0865545ced8be2dea437c3359bc030cc5d0f7dc96de900670844342fc579ff1ecd775ae39a23b26afe7b229ac1ec70125f6b702e98f77622aea534b399ed52f91cce85c17543dd0a049ee4eb4a362b19234708173dec7c413028d166e3b46fcc74df876ef588cd3c45278c9f8b39bc514726880bc3147d334b538cc2398ba019742eb244a15f0d824e897c300b73be5b398e9284af1c03894e99e94e11cf9e608930a90aff33187c6f4956455150bb8788f39a0a787fb9a3b8705972e2fca5223289ddfa65a1687b45fb8d37e37d0e76a3da0115b59bda23278b6fd9539f6edefe9ec3cb7b26981f60f493903835519918b68a3ecd1d1f880a2f9ed9ba2466074bf3ecd6b63f01c92ee8fbd6d6361f7f661d77de456fe432def168fcad37f53ba90ddba49d5740192e3d488433ebb29a0a837c8cb4f0b2b4246540ca9326c6dca460f2cda71bcd7fdd55ec10d7c2c569746ceab2726c15ac68efc8cc028d457abc71d4ba49d9247dcae779154847c26e425e54f8242e875c1b15636981e7eb965fd4f3e31c2bcf9365565209ec073438e2bc3dc630b48273c96aa33b87a333901ceec2e0949039413b270957697d8529d42b27953e9a8153d2540aba8a5bb8286243e42b2982fc17cade219617175fe1a51f84ed944d1eacf465fc5f108de3afce68ba3b6190827772e01d3e9b610ec0c40de847d848c4cf7e151a91a0a640a6bfc1c789d33556f0f1d17ec95cf72c77bf7ac43c7119fe4bfde5c80ab121499dc4d39eaed4de04049626a8bed226335705daab24054d2592e25c9722d8ab79056c3292130d16f432fe542d97a18abdef15c20fa6fb3ef534c9fe0a627d91596e2453644ed26cb1fc88fe9fec31a116c09db5542dc97bc7c2232e8452167f65487bca67badb4bc7d1c46a621518e5e84bdc392b310690379b7c72b76a39c22714d0ec2f0f7e30a0534f3c06aaadd5ad017fa1f75928f8af51447ef6236e060963c24d2c8531b7c5e177f80025870cdf81e6944afea731a963f987d30619b7a6b5de61e2e49c4db31cdd02e11e3ae7fa4daf8498aa17b7a0442a41d09ad353697b73ced486246ef255fd012bed1fe387b5490752d3e1174e825511615a1165dc3520f893e250980e3d4657332accabf25931711c0499cceeaee89b27bc5a6b796374538391b76561234799b95fb79dd4b9f77656d4b8451b1a7333764a14e0bb96dc84361caf3385b88f3d00e47735a958196b95acb30c5e65737eef7be7423d3fc7ef2ddbce9f066d7bb5bc5171ffeaa405e55af510af230077d1f5da382c58ded518cd679c144da29b984e3f3e79033e4b5809565799f38beec12bdd8deba8f47285b7387e1fd6086d592906332dad77685843490e596a6846e0e40e6f2c98012eaa5dd70b3e39ff7f7cff3f069a23ffdb5a7b359b69d2161ea5d0e5424bc095781b33bbc9dbd408307813521f2b112812d323a49557d515e49454eaade5ad11dd4cdb6f10955ea33edf17d7f36cff90bd56df3e628fedf82710f2971876a816ccb3a76995e71460e9167f4919dc39ca1959f04bb98e773d64b02c63086b5c04c4e44a23b04dafb1cdb2ac2df9057a24e5511954d0e02b460bf684e6f450337c6453162606358b265b4840ef17551b417fd0ccf26f0154b2ab687e8b62b1b8de1984ae08fe3b213f202bb0050b57a790675d6d9cda7e9df3c16a9bd8ea0c76ba630d74150ecb2c5caaf18c283b99a9a22a5b7dcca9c46199cc914f47e0ccd791bf320b02be61e71f5a1e37912e879be7375f900a636f3a154b510b60fd8f65e4aca6c53a939bfbe7cc2645086a9de8e02cee36ce8dcba1e6cc4e72bc76a0ac33b9d0552514d5d5566f8e36d656693b1d696bc4918f86139eadddf7a312bd14ff55531d6ac8ac0ddbb2da7f83a865ed0f7b7cdbebef1b199d8e742ccd28313ab80d839074059afff8348f91a8a7108936e175ef4632f72e63dcc564834db977ee410650c9820f363c73121fadf8e59a142a0b6138e1a6cca22736417de99267129e4fc0e394854b08fd067c2c04718a37b381f42c81a66eb8ec4b3605827882c583b4834ad3a9a8fe10d1297b6030f4022c9dfa998972af189a78d4c2beb855679ff8fa77b5d8da7c7d06ca3482b04213e3a3f7186f97e851c043803de4fe49792171a8e2b18f5a14801bb0efe25c0eed77387c21aa82b4f4dc3fdacf9b96f99ad6b311245d599246c884800605a0b4ef65cffc3dd0cf9f626cc246f0493ec01d1e31b5b52fb42d93c4d5ba0f732ace9a1ddef9d568daf23af07f5758844247a07672290daf2b867bf383c164a166d68e3de9e770e94177def5db8e60d34dfaa56df8cd96321c378fe32328be16c1473c147557a8b87f7adeeb4b4ea19cbe539c633a25f77f22bb1ff218627459d6ab145005cce57d0185ab4f632a73671fdd05f4bac4a9dccb7bcccef8111fd1237cb76f1fb9afad5422d4a097a48eb8ef1172a0ff2c25e1731416d826872913243685c037a06fa003ccdb7d7d4f3c08a87b52e68bbee403c5fe7e8c486718a645531001c203ce1b8d0e4034688d13ecd8853733c51f6cda10957479b22376f1237ce692536613664c4173740dd09ecbfbb980275fa038daff93992f183ebc8a3afe69f0704a0826ee11059ac1cc353c9ea2de2f9ff3d07cef634cfadf2b61e7f8621aba8d21f4c3def7774718e29f951dbb91bb2a8cbc367c7f008b7b7c0f70e842994f2e8061c39b6f38d79786068c157e5b6863cd549e0351644f71a30deb770a362cc8d7e7acafd2daeab2593287f2659ba5f058522a3084e8c55632e58e5133a1e1d0bafef588ecddeefdce8bff510bc2f244901d516083fe7b9d9e4effd3694cfcfa8c0024b2f7a262de487b789ddb61ebd5171eaa3fc925d0bc5782a689f597dc9add93c0ba9dc8c4d869998a554f18e1165fee9b1aeeef6336f12918e173230f362242400c49c1b380a46e8b03f12870accd05ba7e4fcbb191fdbadd765c7f1350ec642934762d8d4b8b5311264c4118fd00ec8ef6764b3a51dfa05ac53bfc777faea1e2afcd5cd0ad70ffa328bad3589b7e0b6f0ffcde6c0b0982273a7c2bba16fb6412fa99e01c3b17bcc7a7e75fadeca6faf1273df5d5022dd8a962a7ad49bb352320817657ce58c222e5104c5697751e33abd8d431f3eb9f0c77ba48c1a4d0ee7791f0ed14759b12ca81fe445883c9464e05913a13473befa618cdda395a0ca9d9fda568a690868c0c24de79c6115da18274ecea0a5d67822de2f9c654e7a2e9b2ba3b639ead9f9060541d572fceb6d2a9a0586e9794e3191c8ceab7a4cc5810aa5e1f786d3b3ab27f86476715fa493c0bee40324b8c52f6ea6d0d08b97670c1195fbe1182b80c74b241e913f942a95031d540cf86b22bce2019dd440384a17d9845b3c98fa2795990fd8f084a363bb1a3ebe6b0d994d1e15609d7e403654e98afa68d0ad48905d3a43f859e992394c2da988e60c4a2d9d2e4b389834996fcc4b7d8a65001ea3675648e895156b939266e71c469d86ac83564ad6e8c36a8206449729c2388348fa14a40e6cb23658d3eb7fe0526756b116b4e6df3896b074e09ecfadb0fe8067609ce1d4a565f97258e4f93ed413c125a071a6bb4e54732fa281ad7ff7fa1ce8df1786a10ad8bec8697ade9d9248d0ee67b413d2f2a6bb9a9414ba055fd35fb3c0ad1cdc61b38c424dd4b46456af8af5b4a6b38cee34919dfe807da8b03251b04b852aef739d6cc84e1c06fde6f0f722ce6e115209a5fc2027ec7fd0b1befbc8c7c83841083f6442b27759cf0ab21f5eff36b28a0aa2050b588146e62b2064e17e9dcf3ae8417f98c20f37428c9d0b8f8d23209ebad2b346d9675c50e6ff94e4b62d7642da4ac2b3c60c27be335ac29ec15fe2f4e1de0ebaf2c54978aa0494bab89fb5c1a70237790696b2abc6914c74e31280f6476d1e4debc393c43fd76b49cc1c141f1713e5d3c9d35e710ee9b2f73b63820ab328ece80b8bc49e6c1f217b39cc1cc4f222d4a959eeb678d30bfb11107b719aeeb67f749b42636dfa84bf3749d6541900da0de4fc0d3f29dc9f2fa9ac82d50dc1c1dfd7e313f999b2b04c644263448409e0976afb5983eaf34c57a7559f34cbf1ee15fb2b240d8a5948d0ec6d9a756ed4df7a259ef90924deba79f254fa183c49e728c6bb9d27a7baf754b612a46e402a7dbffc2c1559406692a074f1bc08c890542022daa7d05a9c63deaa79a8b760d3626dd6efd7fca4537cd114730d8dd78ddc06f6d26a8e0bc63479b0e9cfd93897378c9d2d6579ba6d1f16ba24142ed10928e12ae90dec2001132ab0ac415b2e3ea425382fe758e97c24764e4afa731ecce0b9a568b86f0215a8fb920825c5ac8f503e8f3d8622984732fab92ee6e4269eab96519795a119ca9af33e46a3a01953e4e28a9e695e3197f2a8e118010a5147318115bdc909cde8911a9dade573dd520716119cba941b340c8aaf4f736c088e1b81d9237f2f87363779958710c6605462e40c7d9e4cbee627a80b1d6392b13d119f8512dd9cad7d31170f1a4f2209219d53638a3f0f8275eb08dec8f905b61abae202d00bd7a9852afdf4b0c80d42805f6bfe0bc564cfa802b40e995f4c7deebf5236a53268e116c8312a8fa311733b5035c54858d40d4811b485d8baef7080c7f70adb7ad8bff8b3bd9bff09b6021819b8a1881ee6a41dc30e29cd3577f59a7bda66b90aaea9f294a82d4a228358e062fd78154222fcefbdcce4c0f56b7602830233860b7209ce13fbcab71500dd5ad20a3435ea107d86aaf69df825535a818677578ba4ad4652d7bd598d0bb5f95012e9bb313f3990aa30923cbeebb809df2d42bc10fee6c84789f6c2152b2b1588caa2f75168249b22f7aaa85a6f20ebe41f6a485c40a5f774d0afed979ee997cca13bcedc8d5908b7a845cb14da16685804f7e5b993723ba355efc25a8b77e9e23fbe2a1cd8613d31eb6c8c33541fe80286f27a6d1fd6fc9ac0be29a81b5e71924d32f2576fc3a4586726d30104c5d3ab4b62efc10b58a222b8240ac7752599a673a00ed67a07a3f3c57b88c4138f911bfb4f2cfd80819503e52a4d00c354c8e4580f65e122b6a4ccac7394c5a9058a1a3fc11869a5d73d05f0d7da9b2a746516a587e1bf8e570ea9c517dd4cecb02670bfc19d4da3e403f0813499e0d40cda02011169bae8724953b86e4ca10717cee42256a2f0a1304d8b3f477217e9a48e7115b3e618558fbd922c80c90b20c3e8401089109bc841849fd31a4e8790c4e92a89773e22ff37d22dca563dd3603ade4a3361cd9640a111f4e4b51379f2f553f704655a200ef1f0ee39f78e42ee0616cb30e6c22930d85a521b1eab3537be349e2e84225aaa467f9b216ba69ef3aefa8ab220d79cc06cc981205ffc0386a8f4e8b0dc7e17f9bde7fd2cbb6b2f96bbf0515f18f5361ae7c5489a80f02b073afb9d327557a126de90dc00eec73f00b462e6dfd5024063d1b57132876ef4e4fcb2855b58933e5731e200450ca1145821b712db5fe702c6b003c28f7e5da842767f67d48c1c37b53f4630a41ee0f7c78b579dfbbf8dc4690e16045a6ca78d4c31cb0d4419d8d4678f2236c42b6e307579aa4fe6fcdbce747256fe3a5a33eb27b4ff3d5408b15c95a9dfd84f3b3207897318f0451eb86710652b7ad84fe90cfe8781c0ac608e196916e6dfea5714c42b010947bf2e0ed9656efd3edb53b137f733bb5ef3295651095d9e123f85fcae85ace51dfd32c46a9a153414ec6e73b33a3f13ded26bf34d9d066e3bf6cfd20ebcfb143aa635c263d7e238c2b3a917c9f033f30af02f4c554e9ac020b73d7e2cfb77fe66633cf00c465e7210d70b85c14198c2a8f67c49b043a0fb8b29d6e95068a60b69dc5136ac0c1048c8019da6e354f4e8818b5bd2a8a6a08642f4a2f9c22b12a40ab87b7c8c548023b0d866607652d2cd5d58d3cf839c22cb0dc1a997c96d432f12a0c3aaf544376c92056e9cc462b7d90404ec288a4faf31b638f4acaf56c0164a3b2fa82d04bc89342fbd4313ad2d743d38aec605e7ce2003008a1eba0d11bf7732ca5e7cbd97e45eff5c3bac5bbb06d19c228f3c8b0800bec273d733bbbe94642c99b42c9751e3da1c526ed793eaf789d74f6c7664e43aad25b8bd62874ffbd8d2a69384b971f06f30a7c2dc7d40af2b923e45fd9aea3499d260ba8e9a4d5e9accf8e1cb4c7f72e4e06321024247967f74f5031754a257497073b5001b402473c197884a7704d102d68f72920a87144f267e8c0dba950b87a8fa950133aeb52b598c6e4963877491ba339dd4fc8792614fe1ca27f64ab91922fb44d70a21798a3dde7d0f3790c5593355891041cf767e9824a4ac2d49c7c88581a9cac720d85815959be61ca72b21eaff208e00e72a6ea95101e68a1b9f5c7991ac2493343a5c88bab2143a550eb387384995625814f9296fcb1b3247a79da835352b95e3075f3f53a9e2b821d6d5b109ec6f8fa89ee7c187e99450554953b7742c29f6b8a729e26b6898bf94ec501078f262ae622fff18a043990aceec4551577964dd3882821807d77e7634b6eb4d9041b7e80b2e0ad7c2c1718839f73c1ce4052573ed00328931dedc068c9d701056c2b6642d05d1a5f54b66f31ed400c025b6b3df5e8a00def065f996210aa500d45da64b4f1b192b42c9be7305ea59e62275584a1386b5bf4d541e4f7d6354c611fbd1c4fad8ad10b023c22f77a10f36e22b5adc955e19d34e9393592711430a15827df8b5a454fd4841ba50fb61e9576dbe02bc6b78f4c3fe0aa0dba77d3b73e9dcf30e08e7d59a110beefd1a92b0f2cb1898131d3e0e3662a28dfd860e03a994ef7b2f7b09f98e136aa55f5b9c2cae051f640834162fd58441a1e94b2b65551ea55c83977288825644299e46e8253421bdadc4376a1e486bd025c47e3e271f90e4e031e38b4a1de383c0e163dc632b2ad9bd6faea1a4361f3861b9a7ae12aef1964d62e8ba0608c10db3503be1ad3c255ada3021238948a95f9ded4fe3eeab49a2ec3d2c6886eaf8cc4a155560cd0f1c2a4d2f19589525102f218bfd4583bda0f005eb39fe906c91a6cc5539bf894b16305e951ea88f755c8f34b93a3c988dff68e09397e2ed369385833b7068aa981c54548ab67b41e29566209f8d30f7c26df2c45ecc7e65ef0650b5ec81c1f8a0357e79356b397112c49e2b677e896605f376fb746239bf3ff2efab93f4343a08699613bfc44ae8adf11e9e3695afaefe98dccbfce17ac5d06049ad5652273a7bc0846b4f49166e5c22cec1375b0a9754640c7d1ecfab3d475748025d2204be9f4330c90e8306cbc76196db8f5702e8b05fee5804b633f04fe0d3f4d1ec328f1cf9837424f980c695b55e366912006bb9926ba6d31d7aa68e02d2c9da3919759beb63b6b833ed286e270e18eb126ae6180469adb68de826acc52eca9f8f2137c41fb9d5f2bab6b9fcbd8eca3de1aa2274bdd1b7d38de53a5231cd3f4979b29f3e9f6e1afb154141e481c694880726e776c68c0a52a5d9a8284f9870ff7c3473b27368cdfbccf888d17b9fbdf40a48fcc62681ee5c5d2c39d52677a4ea220f7cc7a191361968425569b2ff8fa874772b0be597ad193e46b502be532532f2ab822633d09d7e708672542ed050cdcc1a3aed0cb88eb0cf8fe456201239fe74714d76300c49526c2ea53bf7f8498a9b9bf216a2cbd84998708e7a539e297631c7a460a12f83bce5a1b7c61661c20868611b2bafb7d40e224f7a155fdd3dc4b016508c8d2093e46247709c92f1026ebbd47dd73c66ca25f49571d04db9bc0d79c71aa1fcc7c1f36b889766739253e51c5cdfc04fbf01b697ab3b532419f07c1540c748f70c551188ccf6cbc12bfb9514610b8ef3aac3ea91f7a045ece41f360beb222884d79665427b537485a343a52a4bc7ea2d0f56e86ce3684eae049266e32ff2eaae10cd1820fd7708c7e4733ee782dc7c07d603d9afd65a17716091322673fe357a9f4251abba2a308dd5d387d26e12eb88e812e5e3383f483de063c25b210fb2f26c3d39691b3394e15eaba9737830dfb82bcb338f70df891a6c523f0aa0ed081d6006f8e4865cdbca6742cb52060002a08876ec3be8028011eca4d1bc5860e00361e4b5a4646bae51d8e116f88248f947e75a37700770d82948a29ff7b130e2ad5821992f1e29b47c99d0b2ec52d16fb631c03db435f0376b6894d2461324b5222e03cb0f1a5e96559357c6b6e0630af34cf02692da4c46dd35c2912ee606026ac9d373ccc2d2fbe4acbe7adf92c672082232198f5e4aac8995730539929c708e13d8bbec7d4c8c30cd4cf7eed2c150fc9ace3e352ab3117771f156ee7fafa895f35cc9f9b296f141df4a656b071d4cd89b0bbe0ba44e1faeb282abd51506518750a5c57bcb76d11fc800ecde98a20da30f33c19935e57c363e6f2c77bd6b146d14fcd8f82fb5d4d372b6b2d0ef183c65dd8c6e68453ed017ff00035bdda4994e26a92afa461ba364c3b4e2c973478027ed5feeff3d23c459dc7c550adf7a87326ef4e208786fe6daa541a24f8cf782f027f369e6835aff05bc2d4d0a29b58721d42528ab2d7b443dffa71aeca2efeac8739206a681ab2a23895910e5251d402440832669cd056696b82c74271df85fb7b982edc69ee0edb92a49c92239795b429a5701cdc0d6f4ecba19d58866da89c6e10c47ce41bfefd187459e4acf937f84cae9e45c6eb69548ecb66798e35d11fcd3783c47d412d9728894b7e44e3155f0b881f5a0406cf1b1364a52defd489f62770ef3b8be9f52a515803d781e1c84914d675c209cc2b12f801fbee31c65dafeb51695a9672f0371164f588fa71cb56c6fe24264eb7e7dcab27bd22da97a6bda76d749a2378994de734a2fb050f9908b073ccff59669fc8bb5a7b6460a50f9fea09a382c9677acf414b9eb63837abcf5febb2a5a034bd7796feb93b6a9af2d701da789ceecbff3bce1e4b330a868e2b23aa87c1b9cecb69dc98e9103ed5faf3ad3466511a12a133dc312b0a0258ba9cba54becc1c8133ffdabdad7b73d272664acbff47c1d80b17fa08d0a3a63abba4726eba3d3ee8a1da3fe158e5903d03bf48f595d97c889788b629be886ca90bc2ea4d1c8d97817f697a888dd72a62395f4635dc9ea0b0c0d68ef85720dc30158880946845bcd8373df937bed898ee5dd6b12135ffe4cd31b1e3193d256b4c8365e3c90ffe255953b85a535e52623e1ba6283c3485af4a448b60e0c2dea06abfdb725f760f57817f791c800eed2ccded5e09eb5ab866c483c37703aae4f2273569cacc5d01d9ecf4e09e3223013f4a3d5ed4b31b10b1b87a0a93e637a0f6ee8e814b94076e12f87e9f7dee4d27400f96391727e827068281c1560d0bcb254d15c2734b27bc993056f62a18efd7a59a827d5fbe5453dbdf55782bdc99abe3bf759dd0561065d321289531368d8af6778c8c0ceae23fb81b4faf83f953cbd8b23883f149640267575dfd11eba8c9a9231ef5bd42143311b2eac7fcd7ecb36ab1b9054499850abc2f818e4a9cb40c3439a43adf385ce67f52b16204fca6fb205a71b258db15f748261dc949de41db3e07c6dbe1424eb257673e0e2aec24fb80091ceb8c627950a1e79d5eae04d4bf1d39f14962044c3f406cdb1ced0ae94d004a05317de4319f4fc08a9ed5b4ef10582cbe13efd2e7d5b0d0231ea9ed66582799b524abb4d14ba86d600a6f62f377857c87bbd952a42e3f3db09400081eb57c84b7257478dade523aa831b9a3746d1b85d8c1bce7f3a12211de1d8dff94ed657785c48684a0dfc3a4dd9562daf46980f54b96092778c73fd9360b82184b5888fe9b82508ce5b873588ab5f98df5f56c373ac95c858618bf0042feab06b48f3d8682df40e5fc00f7b21a13cc40fb7913c830dc2586be0e46337f67672f631a19bbb63bf6246641b74e062f7988779d4e24b83ed29f83205bcf55c62516c951a3eab038deccb6e33888f9798fb8ecba41d95b72025477e76650609b834179fe42b00b567943507df1ff4e725d76ed58b55275162339fedc0c432a680023d7489c882205442ce56a8a1d9fba8136dc010f2caf8bc3b4aa76a4341dbc0a5273f917ff9ed5cdedc841576047a2897d4b4bc5c465434268ed3fc48fa4f82041d2682b72cc38750a8b8af063d0dae4bebd815fb630ed5dab499fe3d26abcd076651e6d7e44bde807a1bfcba4e5c4117f955a538e9cea4400322f9898d96aa964ce94449e92d68569ad586f8fe0ee9e34853f4799f3bab40c5967594f7b91f991516257403102dbb4f0dd52914ccae971ef988274efef1c3401df8c62cbb37f80aff10c0fa9c3695e2eb6fb6593d991bc46febabbebf7eafbedd0c87f346f79b73cd8d95957a8ace9b98de05950ab15782dea56bb7255bee8501383f16ff696b98a7245b9d52314cc23caa808fdaff339f6e3cd101d88f66ddaf05565b90944ec0b65e7adbcb34f99ffe598e1156899865463a4463812201100ff9348ba1802d3522c25a148e9abb7a077596e126596c1a8f272ba7c81da5654b9e416ed936f13d12d96413436b7c9a7f8602c8f17799077089f09354873c23887ce6cbe1bd8021ae29fe9f91b023488d12398e5fe9057412eafaf0ce68ad93f119896b601dc429203c917f207098cc59a3a3fb19b99aa89cd1b185ddc8e0fdabff9417ff5fa49c8d9a867c99b3c36e0cc0a8d7c7ef3eed37c77d1c2ab0bda9e1b66d95668a07c420c9435ea4818c76cef2b0e91191db890b53c67b5c272cdeb9c47ead3ca6d7e7fe5332ede8e3db2bc6bf23fa9da958c53ffdf46b1c3615e55bb32d292abcfb4e52c0baf00ee098d61db269d2163e9de9fc4d6fb412e46006f00be4d0d7d25b4142964231bd81abbffa50ea392259923d69cca01ee539f589a0520a69ecf3df07f65f34769ecdfc2e86230ff769011f09af01ed713e3dbcb6921206bd10246fea97a2f78859cc736be9b23ed3943e2c94f574bf74c4f99ed5efd24294ec6ff3304de8f32f9586f9bd4a85e0974b18a12764ae7ff02074812dde1b25b527db53223fb89032fa04746ed1255e093598660a243693aef9b64f07887417ea6a707708969a365b314dcec4a8191ef2fbc563855c946573f8c8eeab156580f95d37472a79164d70e269ed08f4e98a1945a881e034515b0ac5b14861ac76c9aba737accf11b53d3ab561bb81e01e0948ba47a662d5f4df3a07794371753058c8f1798c4186fe6e81503c1e79913f024502acbb54670558ca6629c922991a9618e203d1c6ff7a490d5e02003632d4dfd9c6dfa9fe110d2e838cc8c1be40bdeb6223df61a7a4af34a585bb4801e96507ccaee656a8fc93c82d1e5e128b919fc0705b15262c9e2798136d70de22de7be2e661cbac9a501f9090c7f4a6d2b54a7b0833ab069c156ade1dbf29aae13b9dd8ef8896921b3439ed732d9064dad44686f353abeb4130fe6c8c23ec9386255451aeca4def75d06a479ff83d34ed141947f9621cbc61186dac2740c38458c627b5ecd0faadee4d3907ddd100fe51a04d28e109076145f53f04b8bfb562a0469e6c7141a4b3cfd32f93f360e3aa4f9e6a8f75ef73c135eefade0547ca16a7cd41de05c654e96089d254a94ced212f37f6e67bbd68c6782b28a1d8810b88b282997470071137e898adb2c93d264939927b94bc1aef5758d550b5f7157fa00c8d2d9479abe385b128451619dd970bb5d8800100af0e5c1b14fb822aaa2f47fc1785a7ea5bd2bb016024e663d14750ea308e950f23cfbe0a0fb0703be82163c9482a1689bee7c12168d18c6dc43efe21c32cb8b01f3a636deff7e7f0795fddbc47a3481f7d297f5969d46e005c85fea2b8e2d2ad4b56348cdb584f1302f19e1d3d78a4733fa1def08bb6f6e3412339b538384bcc4e2b19aefc5c106a2edd8d345132944fad55c430f5fe8ae01c2096a26bb78bd6d1c1fb1d7a8a92bea22d9148ac587e796e4f1a5fd03494bd9585fcb078e6fa927b21c01f7c6b3dd609e994a27572ccba2b97c9c643e07b4353595528884d01caf55252fd2a857a7c09177d8bd509e5da8c33b8ad778ba73affa48852c2750644e65c97ffad63af764ac13449f4a431 MD = 5c59f5748218446099dac3a2beebb570848a6ba3190f7c5ab97af95dbf50ba080a53d382aa213e9e6d8a27c249ff61cb424900a0043696d7477ce2bbfdd2605b Len = 80224 Msg = 6e6a88abbb52a709b47365ad6aa8016fa9a03a9bd8345aea21f773b1d20fe9590344300f7a57d7bccb95c638c3abc4bb07bc3c94f9b1401ddbd1ceee379152517ead6df6ef77f5e8ba6f3dc06615961970fb1543351e973c117603dbc9cccf4f26ccc6c8e35b0874ca2b52ad198c7f712a854f125323682e0c119ae24f69673b45cac3ed1eab184840ee8d67a5b888ab7e8171681d67badd11c81c6a930f23fd21ceecce680e2e4c67e37756d243b8afb41704ac599395306bc310da5b67097d0201cad1892c5068862f97e367d2186514718f48d04e010f602bfe9c701924a4328be45f48ae8984e4fd75742e10aeb5e6b49aa34a4107623a286e179acc7958f893c2e16e3cde88ca739a73eda28488710bae258f14ae113fe1e9b3a02812829b41edbdc37d595c80b98d466d33a2c4fe9c5236666eff05b87ff6d84cd7f60b64beec5d0f1a01e84ef8d65776690e53d58f0e3e98f70024ec291eee647e2dd99b3247271abade157c58fe0cd0ecd21b3e0d6aa5ee58bb572508e85db1c8c0d688c58785ac06f9c951008ccf4265f606813eefd32d393887a944dc8efb5ab6e8729d33de8ca659ed16190807957c80fbe549243120417e9ac20482e70adf17f9a3e5d3998341066a14cafb1b91d87ae1b35691258e19957ab57063d1a5fdebf061c3f020597f0926903cec75fe22eba2348fbf183e69850dcdb206b5965c3bb5f55f11dad60a690bd596637ca401dc25ad1a3573f9d8563d51eff3f9a3a50e30a7e2be2fc1872e002a01e8984b1e5452691f7b9c870e11f08852b30795806d49be747f87e4a161ecd6a50431ba205b11afc71afdb0b4be10bb00cd4533945fe8843cdd4a05fe09b922a93eafbab0f94ac63999fc3c7263843324c91d478aecf53f635fe0ed462e4e56361f7b137637e5f79e8003f2ef0a3435e430f697091c5838108eb26422d893ba732efb8d191cca8a1e58799bd4ba080c688937edbaf8f9b76cf026323a10709589f398ef42b1e2c7e0a8c6ffc87ce8ffd95c4a0f4587c0039f0fa51e35ddcd319ff6ba0398fd13f50df851e67457bc555f3296c551d29666d07398f1bb4892d4dec0ca8fc408465eccd184187f536c57219183d986df612628a265737658a7c76ed82e5c6dda644846b9c65c9278e04d480479118eb80b8cce26766c0b15f45276c650323c7c53fca33a807c55cf017ffb10e0370e657ae0ea8731a4258762bc1e1397d9d9f5fdc20adc183e6f5fb534633f2011b1ec986aa64b00e36ab7d74f90466a18eb4d48e1a326f76b8930e5b5a818a1681c574b7128fc4af082ac3c51f1e733b81a8c1ea397a085cb4a4b7a4bf123cc03faae7d3f98217694166e7a0b6c7e598210bb664e0ed22a255bb75a3c66e907acf1f7151a1f43ee97ce0677c52694443b72e2082b2f454f42637c6fd031f1bb29a93cfb4be5e919c1517b1dc74ab05baeeb07eb8223805aeb0ba39f5177c35143cc84171a119b5fd948d55358fe5b08a22134f99b120bb5e6fb33d40563e82fc2ffd851cecbe228a95a1d00c16a1cb3debc7019bd236fc6fbda34f5361ae7bf6eec3f91b13d44dcf7305a0e4bb87bc22b65c433327e33f7f451afea2ac748680f3bc1bf098c4be38c7194643b0d009e51c43630404cdfaf9807aa9b299094916c9466c31fe37fa630c6d3eadc9434af1880d1f630b5fc55aea530f07d9d52a44e9d37853b68678baad7208875729e5d48419a6e4ae01153ffd246d16d170a087d013beda5438bfbc44b82264dd2c711a8b19b80d5f6a6105337f62640264525c1667ae4a49d735f44cb02acadda35310176db151b1e43f4717b47d73ff18963e275fd50819ea81df3fea702ddb272271b38621362817167234742ccb2a1612aa7d5cb1b856db19f998d791125830659bea03964f346b7d12f43edede15d52e2d92eec2bf533164bfe1f80bfcd757731b25567ee16969e9a5e165223134ee6f3402a696a1c17608be95dc5f51caf4f15be00f49b1299ad2a78697954919ca4c5a46f49be414216c624ee4f9c5b5a156fac49e95131766cea45e36869a46e14c0cda59411abdbc063757c269ad39d52a642d74dfab95663408d2d294b92ecbf4d8375534aa30be6cca5ac53d9c9a18d224953287df3601b9517eec4e0a3402cd28d878d5171fa11687c28dd3f888d4e4b886482c227bd1b52accf3f12218fe3b9b4824a0e5dcfc89fc198ccb6578a1e89c9b364b19d94ebdd1478a4c852046d68c00e9269afb394d93ea329257dc08344d2e8d5329c0e14a01790fbea80c4514979d46e4aaecdfc7eb9f2fb73435607e46caade2d6d531d017cc04a5ff1fa17c2a67ce599a34688f6fb2d4a8af17532d15fa1868a598a8e6a0daf9b11edcc483d11ae003ed645c0aaccfb1e51cf448b737376d531a6dcf0429005f5e7be626b218011c6218ff32d00f30480b024ec9a3370d1d30a9c70c9f1ce6c61c9abe508d6bc4d3f2a167756613af1778f3a94e7771d5989fe856fa4df8f8ae59ffb7da8c48d0b7342b2fac336676a0cd65765fba843b7fef3a70006749b078c51f751d253baf36b4fada4fde54316466dc4875d2faa933ad24c4c7918b98c5bc8e78a0eeb0dac2e3a4d9c8bd8969e2d3dc92195721a934684ba7a8433b3c15cea134fe4f44cdfc4ecdb0bf57528a9c92cad5b2cdb5b6229f039b3b02d4f4d96a0c2c9ddd64033364c9e18c426c0e02323ba5ea9d134a6ebfd131f836e56d911d33d2080f9b1518b41e0ec7f5228eb420b365294bb6f0895958ee5875e8f0cd669cd7b55c567e0cbb5e7aeae6026712eca6a5f7603d22f2e9ff42e4465c48fec4cb802e5a32989fe8ffd87daba831af04a9eabd51026c4be028b2141ecbb095b6246dfb7f9c0f42db7689f8ac706908f711a613c4a326e4ea89ce706593d232c95c1375430f5c86014701d46ef7978132925a73019c0d6e4786ea71b16128566cb6f3542b18ead9d905f2a969aa27d855908a53be596a38b5a4b8a098902d611ee9afe0be3534dee127bed03304b45ece90c85e4167d7e483679b8571cd5be36e588bd362d0e4d5a830e8f14193a7850c0766cb3143d0f25f441588d3652e7db9881984cf98558e9c95e3752be38bfb9c8918431489efd297deb92333e43f60befcfb7d4ae8114a4cdb40e43850cc230e8a4f5e51868f15cb7bf90d29e6e96cbd2b94356b3ca299277573c71d78028bc08f6e758ed6292c78b0577f1bd9b6d252986645b722840bcb091e8641d5a996610d0811030568971e104721903942320dc7f416a526301285ea83aa2bd63bf35e97aeb97470a7d63a205a6d1d82061c4d3ec030bbb4213e06ae55bb521633f31793c4e759c4617a3b4503ea1a406cf1af715d1c6158f1fecbd907325af22c462a95ed23095d4ff3b012d6011cf0f14292e41d424c910cc523ef1a978d167f4d162279e529c7bdc3270e435aac103d8fa61b934ac3d8ec31cd44f2638eefb77858ae1db6318025691e8bce4f3e3aac59379c618e7dad0ab5269f412ec6da7f6860ad2b0e97132165f53fe95759bcb81fe5caea85b08a02dfae426941db83119ddcb42466e0ed3c4a498f372b65230b443f4b90e9230c4f11e2c2ed45236618791b47bc47959ad08699fe0a040719f076827316f14b8059ec52b54fb134f01e9aaacc45393b98788b550104a9b5ee12177df5cf6670a2bdcf8c8df31e96bd7e6319d641b42962aef9093ca964d83beac770384c8158cfe55beeb199d5af2ad272d6ea44311595fe3025055ace047fd4d717bef10a6a846ae1f7c4868f04c4953a607ccf48568ec0c146ffab5dc1168ae6c2fe5f4a0c5ca922364b5b933e27313a4502455282c9914cdd801d9c74bc5777007b09c8d4a53a7d389a8b9aa1af50f3031f38f810d30a03673b23f2b5cdd5086eb9731f4a1a99536d46890dd5d96ee519283c91874775b552954108fac78dfb4c3e1db5e319405542d3f6554141d59105b1a2c76c738ea34e031737ca35ecf0477d7c15262dc9f367d736098a553f7737401e0226f39f8db818f9179a956c67eefc10c589c480ae3aa4dab307a007185c5800ca4d5432b50f5b7920e26296c2913e7e3f847a1ef639e156ba4f9ec6e4b36ded885601d2b9d22f19dc3829f6b0dcc906fbbcbaff5bf3f13cb7d8cde97cfb0656d4c7791a1caf285da21258068320005d828913ac5fe778ff1429a9f9418195bf381846535dd4cba72af77940ea1988f45c8ff0a06282dd0057b8bf80c2e5b0991adee628ee017d98df5e1a302617d74de217ee66146491f30b0c6aea71a5cb770571d5055da3d2a527cc974ef7a95fccdbd77987e5fb2c4996ab58c0ee306adb80779f731d4a5f5eacb98d07bf5ca71372450e6047b52076a30bf59e9913f3290456a1ecbd537827d6bb77f4ed9031947dc73999ca2102fc88b4cdcdf2df18f209a588fcae5db1832e28c49112e283e226f4679edddd486dd02c4de99bd030d918dab10d70c790131ba81f66cfc2026f365334da0338652d11d9027bf4c5df20ba7cb6a9a53f983a37afd4d064cd519e044a0df5cad0fdccc64167ff8dfe786b56e2065bac143e7b0ab681788252e611196f7f5ca52556cf560bfaeec808913b86c13c8e05f40757fd4291c99901345afe29f58912a414a7498f37b44362bdf3c290a5db334d674397daa24e2946c0ce2b100d05a3dbbbd72941bb0a80ab533682c6eeadc48ee2e052f52f70b3921ffd18a8224cd94ac0e17dd9d13bf020f5764fda83802a371e90c70895cbb871b66a5f58d1e9136fa868afae36d3229219359241e0fce4e45ee75cbb71d9a874089857a89844f2b8f6bf4735385a884d42f6f293a36e850548569c54400514079af9aa2de1fae7c51057cd15725ca1d0e72cd956377f7b184f510e899ce88baaf210cf4f4b757302a9e4b9b561340fbb8a69cf00098a379bf8891bb1c4ee6fec82802f93414f14f017c8859b818b126bb1103c07b6296b1ec8415c6364a1413ae0aa43704fd25e2bde85c94e4fcc6a7fdfb2b8f3b9d7561f332c3924f88ba01470f1b38cd3b9bef482aefd24487268568ae3be4a811eb8fbcdac4a6d0d27fd17d818f84f897fa81898a689e3f8179c8e3715c482a859e452ec43f8a1fee0b8a36a627a1ebd6eb9d6850ef7d3db16979558bb64229c3368a33375dc7a6a407345cc80c1910c3154dcdc3aef9a6e09c9ea845705a0d915c67b27d46e4ccbe1bd8d62d6674ce252198a02cca99e3d6ba42c3e7b3183eb8b8e294dc2169f802ee7d8c1d5c388cc3b687c9d36ee55a5b6c6a8eb9a6052500f106bf9d16df943a292b66e216efb4667d203100c06674375a20f10272a82830afd81c074fcd072c73ea4cc3bd20add61d6dbefbe8a399312b6bd40c3e89b0129c629364f1bbb9a175c326077954dfdb3f76590b0f25321387541f1d3331266c5eab0dfa27311260d7bddcf77112b23d8b42eb7a5d72a5a318e1ba7e7927f0079dbb701317b87a3340e156dbcee28ec3a8d95a8ef9145caa831c8d7737f378ab029ba6f5e9d759e058367dfbb74cdb373f4390900c93bdef730d814f951e241f345295e8c6171730c8c4379e55d9015ff78873c7bd75323c8ebb7c50bc2f5e2ddce82736d6ff1ceb38936d0dd010680379b1ed7d354422577c2e67c0d4ae8d9ba26642254017d0d94fac08914f7a78ed6dc6e5f89b87f509e66e2be8042418322dd3d0ff2de79cc1b616ee70fa9d9ae479cd428218c7121a7484ae10751869ba2637b80ac4f8e66d15d909f2fa0334af48d0ee61d48be352cd77da804f12e7fb349ae28f2ed117a313fe3f617734b01780d6d0ddf65bcf799a4f967fb99afabd000536d592fa982c588b7a0398b774e4cae8d040a7bf3e568214c956db390ac7327f9c2619fcd0d08d8ba1228613eadecd0dd6d00e4098b22ecf5d4ede767fe27111fcc8ea5e26565a039c0469d378cc324dcad754654655458839adeadac2d665c23e042fa8048866fd53f1687c8878a0b0949ba0b7ae07704545bb26ec396bb79a4a220d63d12c5a80ae33ab9881a8c03f1d651bbd3990571069c2bb344d680fa1086aae16f40bdd9595115baecb253a014b7cecff4fb7a1f08d08d13a669714e061243a49d7ed9843f0d2a047ceb7b5ff072a3d055945f7ee99d68e87edbe6f5e3b97d884e19a3292a7bfa1eaf125d93f3ab53358bd03001075741da248a6c823800cb1507ad9548aa220871f9f394fcbca66f87fe5b665600a2aa413e117c53816cbed340a73a634c93d796f3db9bfaba185b4023729cde63e404c631fd911a4e71cb3b9f931cf97055da060346ed0e5a55a8e6a1d23e1a9fafd3c1969b3526fd9472b65b0d978bb3cc9247cec202b83c02caf3dfe6b49b127ab9dbd296e31a2d6937fc3953348a957ca2c4bcd97788cd9453f0642caac06ab9096d7c6d25544c54ad4581109e8683fa6e054409a5e09d7eb654a5008b2b170f450f0a8a7675d8db255ae8d21ff00daa5691fabf38501a467499392ed04b95c21f28f37b50ef61813274c6f44367a1211ef347768967c270114686f404a26595ea53ddbc4f3154db775ba203a35ddce30991c0dc239834800ee524fcb2b004ef29181fc9bbdc514e5658109cba331f64c905ed3c8151cefaefed89a5450502226dde30203150b55e41f2891bf297f71abfc823344d35204516d82b9a4611ebf42b2eb55c4a3f1f8fdcc371fdd6ece2995041094fc1a2a6f3262d8128305700c8e37225da60e7ee67894361dee1b260554d0915eba93ae189906630eb9e450f151950f8271ffba059d9eaef2bad78fed2f898df844e6e5e8cd81aa150da7c556d5f33b2dec1dae3eb3132706094b12c96d578acc62bad7c518fa359048f6d723607a2cc4e011617a041a27c1a31eb68157611241deb78d98c0998de532788f403b516cb11582db9fd6dc388b50f984fe35d0acbf7f860e4a0e88397e93d6f496aea2835a531925967281e1ccd78482264fcbe1ae0ccf62c14aecc1c133b80f0b0092f729627e46482030abec0166bae2ec7b37774e3992e7bcf0ae18dac4e6887b4b52840958469c28111c539648341b550838800d6da5a3acb987ea4fa584f665f51bd5114f2e79d14dbe695ed1f7b7d3996c321013a3dc6172d49f5b01ee3b07b7db83430c05c9640c199720aa0ba0ac565af521d2957c24411e9fc6812e41a9ba19f66537d3732975b343a67a78bc28688a320652826a3d4eeb5158cc4aee93265d963f78a15f68b116d7b6ea46f591f7844f883c728ef4c2c61fd88b4d2c0c2230cb9b75767569e7cab919a27e312d2ad1b66f386dd090c5347010653ce25dd618fd3fd95a9d734055539749285a462af8cd83ed7c185b7ebfadc60321f8cf6b9f94f44a55bfd0e4410bf7874a57221f81fe8c04a64e9b16ee3cc30c0355a8094df8827070c3c6fa164b0306ee100930f5b05124f45a99b54986cf29ebe330d7a991b1f5b2919eab5a7a816b1b6d4585da4a9bf66c249d8159f3b102e089b1fe3bc8497e2411a01e97ff3a61da561d47bb3632221995efa5a5ec333eea2f71a68b0311b6cc2c137c5444f68e32b3d89e1ddbde4f0093d647b6d71b8511bdb9f522abd242b4c841ec1ab07c9a2b6cbfb18aa167252b079c90121d32815e1cd116872954cde4ce709770ab962ecd691aa989f0944ea1da87a7432740d8d832012f42e35ffd6227e9a4de9d0af2219331ada3302e6f6af2e0b4d15c0d3288e89169dc43bb7a38b9f43ceceea18d2ed04be65ec9fd338f39eee1422360387427c8ebdcb02fed6e6ed887230723a8fc09b17c4524c93f1796fb5420e60391a6d5f0deca9285fe0a2ddfac0a4e58ea9427ac96dda75a3e0af04d35f20cbce626db4f692f50835416dd4fd42a2c08fcfd10825cb0bb78d670312dad41fd54dffa222db59154f29899687126090afa853fae7bf745c9eaaf5240e3e4942093232c91d4e97b0599719cb58dcb314ef72e63e7e18f24377972b705b70173df405bc40f8b2e72cb428826acebea2a62c79f70a5fa4bd66eedc7a868f12c66a1252ec88699ac000eb3843f35d2ac7aac327f6ecf1054e2d70e552c51d88ff6cf084542dd478aac36b50fef388c39ab960076664d69d2d0d9a3c54ba8b54faacfb24739fcddf1feab10ce3f9d5fb84586f82e5f074dec29db76be0d55d0970b0aebddb6cba3087fd68c6b364c9451cee6e34c61e406ca73474de97b40718da0e87aafc031e0f8b61df18edd2e722ed01d897b74cfdb953984f1ee9c52e059f1d229645f19dee82ce906de3a294374d293b261a1ad137500fa2a7479716424862ebea59b68e30167a3940458264d4e5db026a6ef67f7915211bf2318864716e86502197d07386af1b163a73c0edae2f8dcacf367e5cf12b6317aa5837acf569ee0bd690cde254c527d3b70f0c730582b7f0ef00f0fe31fb5c2219fc233450d3006b73c51d5f1cf106de4077b3b97d97e011244f1cd7ae1d62c7dbcdb9bf162273eb73b52d5e61ab5eb2513e550598d7aca81971508dd80a1d756a1d8991a7e09f2870e19c44a56c95ec83d36f0bd9ba642229381a655239e2c74f9c01409886189ed5cae8c66aad22e932c77020a2b8ad2bfde3f9128f256919e6a9cf607a9b46bb2cd1713823f5ac24f88b06e8967afe01e2057af9e16506f9e9c73265a098cff9e0a5e43e63de884c4fbe71c82759cd60802cfea01b7142f3a394d8c4acf70af78bb8b02d9cb05dbb92b26f43c7dd91a452bb12997fc2b373be633102124e9e30a88a43aa411372ff7c074dd01a8ef169d450554aa0e1cf1684d2b9a252f7e011a17b3d2903809e94763dac2171d6530d8f5d15280156fc38b164012a019b7727113bfb2e368006f6fbc5e88c705c3d2bde51f0d6138ad176ae97760d8091c9ed722d1c2e5c8a62a37720b185988926316bdf66c979f5d54cf6cda6c162836ed13ecf0eae0818282692ee65a15cd594ba9245f57697307e2804a701ea19d8cc8ef1a24121aba1ce0cb97f93643fda0f13fc360b61edc33294529415fc391a69531547522dc9cfdaa27564b952a3ff0bf9f420471ff016a91e8b25615c22c0dbda241ec026e4fac4a4312e45d13bccf1c93485071540b33822f8cb62ae79548a90a8a909a18fab126e774cd78469cc870e17d4e9c65211764e45f69847af5dfc031d76ad222c695a8dd230dcc0b066024528b05db796c9d9fcdd5780dc3735b69decf8093d3dadf36ecc8ac43aa22219eae177d17d9144d9bb394eaab0938430edb1adcc3755f173adb0bb3c46a199247bdccbf36ce40afc05d44c748966c1f16ee61864c4e7cc61b7393293695133b87464fd2229e184c77958e18cbb03578e9e04c8414a75a73417c0916837137a5c7134bbec191c5ab26211ae41ca0bed4ef7882e005c720a614be14829247ae576dea668cfdf16f5437ca8f3323ae2dbe9080aca206f8f7e7fc005d764b5ea0d9e3944843bc043dd01058950dc821abbb34be71d0fe8007bf610c8cf9960034b48fd99aebe81458a61b93d67bf3435f5543fc7a74d7a877b5aba848145b73926fdb80048d6867e85ebe43f7848c5a721325006e9578b87052429d39ce8200e3922e532d2f24451481632fa3317baf0b7d4292f63cc9f8191c8eb2082ff3ef4fa6ef18bedc04f8049671208089a88a531c027cba70b2af9b9df8b15d3f9788fd3288985e99f0c7e12550de3694fb327277ce8561391b271d5de660df07541316be609bb670d0f9d3b667316e5a5df18f170c74949feca6c8e3c189378e13d7c1d2dfe96e688cd701d220e1d0e4b40dd2822612faab0d75c3b7f2f20ddcbd1d27f76d492d890ca99400e2b50339eacf644282273c6466dc3761df6408fa382d6fb472849bdc39b7b3c91676b061e57f6ddf8a7b01d3e0224c69f2a6d0ef6e4fc29256626168f94887b422ec7e658f6514dfa4d5f2fe6191295892820ec345cb481881ab273635a538496fdf164ccec982cc3afeb6efd26ff7b626be6a7fa7e828ce5c27944cd617ed1065171f1e8cf2df2db3bff6ae1c05dd0918238b2a7bef8b3c4d9e51b4c2e4ce926c5b42e3b029528b77de5a41259b04dbcf791acca92898ebbdd70676e3540456ed7527a422b6036dee2389b2d77994b3b388be6e18db7862159b5a981fb1b7e44e2b7569cae11b5b80582c0919e6b41a2c172016b2505229bbb2f52460410ec5f946d43890f2c2dd9543ea4cd22c8c97a2f0e7cf5ecf4fc919e480218d4e3280548eee1b5c301f7c95ae6c85ec9145b27dd9bc9e049f97c995f9a3988e1e4b9dc9ca681916e45bbfe85f5abb4e5e07f3259b478d8d0951b199b805904bf980a5bfc4ed3aa6569d2ff61e5bf7e0daf9e303fe2fa3df55a60a8cea4f11ab29f91f9e422387f4ce0e5227b517408a4f44097dc91de8e3cbbd5ad657282499f5df93cd0db207e894d6b3e4ea379e34030fedfcc6b86581b2bf2cdfc739cffaa45a89b6ed43c36bef1cd793876319c63f8318e9bba921a254d3050e022a1cb77f918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcdcfa213b8cead1d530b0a0bba88c48d6b147d88436f0560a9b02b7709e4d3f184f849bbe5d9d5cbd7d990a95655752e6494bb8bfdf3638e4c3f0d211f630f149943c81c26e7321bb4dcb7a121d746b3ef9ca5cc3f1e0922fde8e42a58bbfe5e7579c73e6441ec9553dc28fd01585da576f2e352f23a1fa42371589b9a36c7598062ed2a85302ac11aa18ac5e01ee28c605f1c26fc8dcf9d25a3137bcf1a938d22c5e3e773fa142872f286ffa572feee15abf84e47603f946d46bad2deb08981c46b517d14e7d351c498c4b5389cd855fd9e21d4b9fa97116222f8a9af40d2bdcc1dddf552418fc4765cebee81e49a4880003cbf3ca5009c6cfe72072a1295c9a4a13256144e6f0af204a3b3679269500698f418b7a7a2bef3a4d3f4376dfb2eb2bff6a841589caa9e58960bd5ed70f4f72feee61149a4fe5fdac178be9b2c736041d2f3c3a53e2ce4226afeb03ed4bcbb8dd53134d32ee51969e49ca7e24f2015ed6d40817d7c192b28c794e1cdc030ba7a4f02078d6afa8719e667da8b8cbd388d7096632a7ef8da3356d650e25ad95cbe046072be7ec512b16ce23fdd0cd333e782fe51f36d515b0bbecbe5c5ca3e0a209e535db092ce22fb2113bf22f7e96dc44c7f331f71ad1578a87b89bd39e72a6ac2e3b0a9cf9e20bdaa0440a075884eeb7521f1f7b1927042bcef2214cf5d26621a1953f25cbc72c0b2bdaba1ac373e26a6ec74c3568bd430a12e9910b32764d14efc2fd362b082ccdf44e96bc77ea53b87e9a2cb871da90c0040d7fa0ecd4e7e06942a930903b7a9d9a3e146ece5ebf3bf1f64566dd2579c802ec31a07d84a33e9ea2d7c783c781e49e27a7c44f57816f797a3ad2f3146a9caff44b7c7cfc2b69f0521d4d8e32ff4d7079e54f635b56cd6574519f7c2dffa85bb441a753a1dd0d1eeece4508043f32a1c34152a2e08bc056933e0ea0e88595a6baa8c3aa2c34927ab78f4099c1ce3eb2823080a66dad02bd4564a329caa8cf1165e533e8d1ce94846ab4c2bbe228cc1345575bb67946ef1a195a1f7f4ae5cf1c447b7a8869078ddc66f33dd6fbdb65547b1a468b99c5fffd7d72b609ffa91037d4f02a01287bd8d34abf3473655284f691fdc37e25c6bfc7e06329624f8f3ce4a5d7a50bb6981019747d2929b52ab56a28766506c3a59919f09fcc10b0f49fb325a69de089e8ce0f72a19e6261c0712fbd18adcdfa0f36541c8d107dda65d313e2c1572818ea6d35d3e0f6a601b042c7be69003c1f5ff216c2bfb932127f51975bcc735afa19782cf6afe47d0b7694c2bacc0ec9ca1466c281ac18b5ff9da5adff2c64e1940269458962ca4ff590019110c62c0f70c90ef7e7d6a182084d49d84b65ce648d11db2fdaae2aa73678f3c37eebda65b9ea551753c3f61ea30ab8a6df1cf25c2be4283c88f6881b64bdf5ca53b1ac74fbf4c3b163f888f486526c8a1896832116d5eb0c02b0650506bb82262d9c14b5bd74f55686e8dc9bf8b0e0028686f36bc4838e0ed67043fc731e23676b2fa59074e744673b29538d90a2bd90b742c584cb59abc582ca978a504243fe9ad0d19dc8c84b73ff1e9031d4a45fc5197e6c1481e4aeb08603f20714b47e6c3b141b461f9464fd515d25413b4241002b8e79838ea111605ec0c62b47014d20da8e0521ffd84b73c04965044ae8fbe27bf7506a581b7e558b95964f5da50abcf79301a9c0104967ca87d2137a150aec693d933164b04ff08ae6d4ebcf1c61b0f0c7a35626b8f959ee7d1ef74f62d87ea1e5b4613b0c00d1db29249921d3dc8d74905cbf9a5ed5ca8abd8e18413eff2984742682418b2b6a0af0e7dfdc67c5a2e181b03e715e692a5dbdc20ee625e96daf6d8c0d2eba3a3988c2a1187544c7a1d610205b62542df9a5f23d33a49411cb7136377a4915b7c0d312e2db82f75d0aa0c03faed3cc8ed911ff523f132612b38872cb42372a2e8088662fb17bfbf03e001660a15c1416191029c389a84876c63387ba0d5f6408f8f720da02c6df2bcc428735cb51e76e6a3f25f39bda77986420f98634486fc1aade079477f9fd5a26069721955ba2c22ced7854fe3030022ddf4ca24f8889f3167b5ec1699be315ebbadaa687efd2ebd1a9757a19300e3e83ad05a0b7866f17bc7daaf350133ce97ddda6472b64f43608f1b1d585506ec7f638990414c86baa1d4370acd3f6574f6cfdae85e881832b3364b1f9bb17de1906009b4eefc52c24a96b44406dcbbeb2298937e5579c0c45d160fa49330cd8bc237360e391030d11f163aa7075f9ffac440ef6e7f13afc1073750f667595eb2bef2fae64b118aaec85baf79f950786b84d0d5ff03dd4ef158a2f45b40b4981e2c993c834c87c722ec6dfd030338ad04094f2c7a0a5f031bf95ee51c46cae496b232e42e63f84ff533550a8d4e9da88efcc5de27bb22370991730980a022a8e3fbc7d92fb8ee8aef471ac05f020ad0d0043ad24e3fad5381c9ea4ad177454dcdad5f05ce74f0e0d7cdc405c046048d94cab7f037bd88bd4c49ca8f55f2b93c1c71034f53bf87b977705cc3fa421547a0f643202a5e3cdf32b81bbf563a08dc98eeba9f05c0397d95d6e9e1531fc466bd2fe74a6e4a5020fabee6c41a76b99409cd8cdd2da09194faa7734714059952b31daa564ca84ce76e043285eacf55ce36b581f1138614666e8c03dd841b1d744a69942c0ca0b99e543207ea0d6d63f1e84fa2c4ff9b4c5bb92c9f8bed8ad7324abbadb5f65c1eac75f06ddbcd776b65e743f63c3907c0dca2315239957950f57abafed75101037999e46d407016f691fb38854208f1f84ff24021cfc5110e26a30f8e7b67baf06d87b90e013f718bdfecd658bfb6817d1e71041635c57a9b2b8d62658a7ead6ef00915590782b1b2b681c6769989e1d6afe7223853dddb7f6e005a8ceadf02046ae5a1543881fdf37e83b0e7baca368b6c1c458f11555c4055c49f0a85d2e23b43e404097d837ed7a0bb3bb408c0ab25bcd81324587427684aa0dae7419e759ae3cee680bfd25be582ee10e46db5652b06e234fe0e84617fb45eb32c088de2a9b26bf1c0e4b4bda68de7d77fd0ef8f25b40351251dcb350bfbc4d1e0c1e552f01983cbd1d572cca0296d378e18b74f9b2d0312a26b92c996869bdd0b54efecf87edd1cbb7b53af5dbf47d8182f55cd16d9aa1e7ce22045a7bfaa7eb5a8f3d9484a428d86bda18f65b53e6325fc11331e20bf1ebb69bfd2c70dbb5de7a7394068e67ac53b82a2933e751a80be6733a6396a0cb968e7b5987cd89421a938084ae1b84d6de2b4a0e47265a3d6e9580250f11f57988a464bbe5189fe730143aa1e3a2a832d813ae1a989efa00eb0b7c759cda76962296dc96ccb86c1fbf9b165e6fba3e3ac22fcae0b097adbcf1b6ccbe9556a0ac04d4477cc7438a560986882c7ad8b3693cce24e327c6d1ac23160532612d1015affb39c03d307724be65148ebd749448988d40b456932268ffa79aa3b8b4218d746a2823c705cef63ec54017a0147d5375dba2b6d5930c7dd7ea0174e482615e02bf96f9dd49de551b15af39bb3ecb145537cf7d1d3cfc454c6bee188d2e6c11cb5a0ac4e8634 MD = a3cfce930b5e8de54554e9c31cb3e4b754b24e6cfeb6b89ada2ca51b907a057d3814d11980367109c1f55b35d7b187e3be90cbb90867bb59b78cf6c04eb2587f Len = 81016 Msg = 5d146aa439e41599b3a48574dd33f12144f8f8541773e1c28c182791805e350d5e136e9c41f270f45d779a8b9bf2cc4f83db6d985f65b35b9d551ea076154636cd04d7a55a11da640788364c9a2b764d9585cc605a7b56bc9324a14dd1db6c627392aea6ca69da517b7f619f24077882429f1d9352de544f362cb780dbd72df91963fa86da21f8237f03236c7fae5b5551d1661b8db5357b4e166821da321463851fc32fd261bc42dcbc859bf447a7308cc2b1df54297fa7a289bc181713a608806f1188fa53af175a538e15cbfbe27ab91b05c7ee62bc3dfb2ebc4ddaa36d51d1fbed79991c5808c07047c04cf1969aa1836bbba58773a421ad6fa96b09f0a4426a5eeaf9e73f7ed8bab685bf524afa0ca3e9a3bfc12d44dcadde12116eb76a99646dc360daede268dae54d6b458701c2238a6785377185f4d60f7115fa4b0c9f9321ec171de99a3977dcfe99f3d4178aaa53f03f12c7cf30d20cafbfd433f01c9c824e66d9bb10133aa2819183b9a42de04e243579b78a5946ddb25725f780d82a98cf9436ecaabdcb3ebf9b1ebe10746e82ecae95ca1e37dd8864251420239ae36c58eb5b03d201d1bb9fffec6cc424fcf731f48d87f3923d17ac71ca35402b6f05d2b17188efa5f51e0804144a260831b6d94d8a7771320e9171826fbe4154776b232f9f046872de71e4f3bfe19fe7b6c6cd02b42001dff9ff9da12a438ddba3a735ad0efea73034bc1a1414b79888322ff65a320c0960a5681716234d8c889ac0ee73e5fe13a7a10592af3c5677b44efa3b9f2dc3f37ebcd4c7298363a62505be38c84d8c149ecb56340c5e46a533b22e8317cccb2501e34c9522720e43788baafaf66e3112df5ab6e873a30d8bcd05d3b80c38ae09b1c4d6694817d5cb4bd58b1c436f747530f72e962b3335904af0f2c1c498f40555077d2be49b40a6648a6985f879dea65a4ac4267d35461b711a918688152383b75446c33e25d73c8b534c1f5cb3f60b25fa8280b1d1c6960b2cbbef9fd7c5ea9d513b199ede23f68ad83dd1b946440d58b0708c0f313f68e0cd75e4530561a2d0a963164ceeab3a28c0438355595014bd139533de7a38f9b8a6c94deac880131802c6a08f7cf7712cb4671d7a15a3891accf95b68d73ab15b5ebe12ad47a9a53c056da0b1b090045f5bb0886ea2c4d23882a4edf36eccf8919e5c1be4ab64c006595ffff8b3fd59895e26aa79273b59dfde9fd2c8677636210eac50d71b39cc3ca6a4a3adadc6da7264d16ce5cc9185d687f1f02febc0d3d455b59acdc0b131a796457617c574eee116bab6f8bb4dbde726a2316f223337721c80df10c153570fcf495f80248efc9f1ce871fc19f76bd863bb7cd23356cac30a1309e647a8a63cf9b8452ef29c6e751d6383371117f672e542b89e46b1f58ec878fe987a3787f5bd9b126a5627ab28c134d6f2c836c67d5542cf1c85cd1e9dfdb7a86d81886003c3f9ad7c78b61b83b162517469db43c15ac0a8941631afb652d6edaf85239a2fb2dafeac81d1264d95f5db071a8fd5069dc62b4e21650ea26fdfb7a4ad919e3f3246ed429900344d14f65ef103d9e413c65b4091cff2a529fbd9ed962259d3fbed466285e7ccad4cd76cc17b4e41d8b17c88cfa7475fda129fcd77cb0b03a02d88e145be94bcf912865feced204f19a86754c0d6b234172702c23d8c91176f9bae207e36c7598067c8d7c68fa48c0fc030c7fb6738fac32ecdc02620dc1ea70e0509f532a929ab1345dd39a8ff7f22c07fe969a2003845f0a7d01cd113a0af4e35a793fd62b6e0dda6782d825cb1bb72fbc3f0ce3376073539f807e55f23f123e7ff3ede1988888f93b18863e1a8409c4d5c7934f83d70c42a42cda5e731d455c31bdf1cf7250cefb38f3394b6ee1b071dbced1d7813e86723b65759d451c0ab70025f002317d2c6af1a165d040bb27b12ec32cfdb83d7e4cc5b8d494d0c1def97bca4d2c5e644db2e5a1905f3856fc0d4f332934812a504cc3957bc7be854e7df5298da0718c9f8d95825d6aae6b99d0cd9d3b0e74abb8fcc589efc856fcb5cf1cb225f0f37c8e3581b201652b5f7db62a7ff70e1b27f4d73c1484f9429eb15742f29ab05cbab6552abf40e127b93427d649d195ed25a066a7b3ffed09d1cdc11869704125ad9467011870613bff49a061895f48533b581588e69506053c77770d953b35e6eba4e5954c3467c0982aba4cbcf497f5cf687e603b08f6dd352af382f45ff108eb645b57c8e1576e2a53d0086326074d587e0bce1fb011ea6274c11915532504335f22e92d2bd29d0c517c150a8808b27ce54813031f09c53ac16a5066b9348139f1e6a9c7684bc5d4a02903219f2ecd935abddf83ca20e624bd599966f691d895c9111a562b358119cc615336bffc07322ac7a4203609d5b6b50984949fdfa2ad413ccb27e912473232bf75b87ed2f7eff20fd156e7171c773504828e1970580706c43cdb268490b48f9dfb25504608133cf117a651fb12ecd9d513a1f7e661296631dfde67eee6171f77441bd8e7c0426815c78d0b08616e0ff5c88ecfc4668afc2024b021d3cfe08ee5f0fa8d1aa8f40fe8617976d1709143e11182e57cd0b244f9cbdee8b5b6973a64724fc1613abe90d385fa39e8d8ed12117f4cfd822825bd3905e9210722a1ce7d589a3a5dedf89781a59da8b0f2e7f711724b5c76e55be158933d6f6a9ca6979b14583c634b48805d30c257bc66f86f6b8aeca6cd80db4df2d46a38329d0c423826086c13db14e7d0c816db8d9dc4f78a39cf40e8931a4f7249edf011ac494aef0e393dd205e43a76cbe988871fa40bf7ff61df7a849f826174374b6a42f40e3a5d591640643d04d9ccd8f34b653c292f5c22c6d5edd1734ae3e48ebed973287463e6a9c16e95b3543b63b03cf6e3ebbad0a09b9d37669e9909645e72087d1657e2705ce79d74e280a7f833fe5d31a004ed59c232e9b560d665352f463848544f2974a4156950fee99324e2e1f0bc02a812ccdf298d54667d77e5658de18b6eb4d96213fd6ac084f97d6861aa69d9601ed16847038aba1c08c1d3b5cbbcacc23352c720e21a39f13ac741249a111064c3b9ba9e337a5cfe02c3be8481f222fb4526225f75e023e018113da0439f076d512c32494bc4b388f60dd456434a948664e3f2242b6524ce3bebbc69296c050621b97ddcbf0264595d00d3af722e67d01cecb51375019317f0b74be3ddf0cfbbcfd1ebcd0fabd5cb923d2af4b1162374c7d0f9b1e55e2549d0e47aa4b3d59dfab6160aaea0398e7c402358ca628a3df100012e63eec321f07723b7205d73164f6ef668d6233404c7f143cb9518f33db1502dd1ce03e93f984dd59feb3d61bf2674e374f80b13cf5af02f11e946f9a95232976234c728c4adbf8a8369d61a0f1c427dbd68ca614481f735ca4b6f05e73021de7e5cab1a67bd56a30030aa146c9d6215b0cce3951af96108431013909df79873848a22367f23adbf94b44bd98e265e5bed78e937a91db8171aebb732340520f6f361bef5918d2f50cf891de1ba5391a0c2113db1755b76d2b042dc532fe535c96967e3e0455645d70f03a2c597819694ed1a63ab165f27cbb199f58c0814517b44f1337ef12babe2d1d86ced9c4ce7a8bcf8fd8cf28545728d759535430efe7d24b2203a2b59abe4c65bfed23f221f4cb0316dcf906a5a67a25a2df77751b75f771f3c9a5a8cd05d4b22bb0c068d7801655836fb767ac10b9eac424afb78f692ba9ceb281511b3ccdeb14403790bbc575ad1db892b3323eee100549875f146a76dbfae6bd1a4b0b3ff8c0c410d1946ceff32de01152ffd8217eae7784d37220e1efc08ce16a271933c17865d492291c8d0ffb0ebdaddb85581c06d5307c713473ce68cc75a8750fb02d834b0a3d437e56e9cf6b1c2a8eed9dd2578c12c2d94e355e3acf023efe94bf262b9d3a39aa395269f11fb832dfb9f788e7c3b20e71152d887dbd10938a516794b684ecee26f68978a851192e97916f2600a399c6023265357bbe250fe1eeb05d6d27a9c47f5d04fc3e29c5847e1c0b94e8544e54544ce54b7af8cb1aca12a26a98aff8237c15cadef9d0469e5c03d5bae7fd591e2f0cb3b4c396891c0e6546a37f436273e7c7e307226e24e2f9edd58147c6438e5b1ad9569ebee77d7591a3f0690c6e1c861a585e002ae5ba1d8312cf4ed8930a9f1d5f1b52996ea5c73bc13aa031a48622b730cadd2d138d8f6d948e465bd1fcc5be4be9294ea5fdcc0da9676adb8c1982457335ff9f35c2185263a4757686cb93a4a7aa690515eb4caf62611032af3e706d2986afa7d4c380db88fb245239dfd2777b455be844d80ec9f40ed95d945bb2d75ba5356d77f78faf0a799a1772a049e1cda2471cbc2ddb0268580f85c3da112a1179d91aa6c60c77f10821ecb976c288a7a975cc05507b02c526f8d1c521550f51ece3d6ea98c1da458ffff997c9031410422c1ea5abb672135fde6a219a462d25e59ac8c9d574810ff57d679301d62e1155b63a26a454fa5bed07775fabab2d944d4819cde5ee135724e35e3686017eb0ca594910a51c41a4b7bc2108be4eb6a60a33f07e31f7392303790506c04cabf7895e73e915d7f0f6a54490a33af5716405a376631f579b7d7a86858d18815eee7a0ddf3b5c4dae599fe9ebb8876905d526e2d30418d5e06c71540653f4663e9c86adb68de24624d68df15bcf0d721b0256372ee9853ab0f9d029afdfbdc5f40993881f680e8afa7457a5077133d75bf17be9af9bcc4eb52a7f4ea8b9dc64273d8ae443534ae0d73ce64d182563626cac7e4180a157d99409670b1a69b70b8041540a4ad6fe1263342031b57405d9f73b4887c6838ca3f89e6ea72d77b884a61cd7425b7990e64766ee9807e57f05a3a4c003accad57387f07d6c086c469643d6fdd39ec569252bda39cc35003aae19f1cdfc57fd9913e9077da0d4d0c808fc78ad073c41f197b697e713684d9e9c012a59bcf2a43f49c7eb548cb829a8a37b08cf245d76900391a5e1b6c855149602554b89a34731dec9a5ec78dd014d2f68914a7328eaaf32640c10fc7c9f0266c47c8bac926fd69a963b2bac6adf1f746a18083cc627b4edd6d45b2fadb3d1d2f0a6006de9a39644d7b8fb6f884c86392aa7f0c75fb509fa8f06a995821aeaa32edc9413cd6cd9a63321430b5fcfea485045ea5b1a1a142138aae478245bb3a025252ee8685107865380ebc616f0b36783fbde411fe03f2c79c6f31ebafe96937e89b632e2da88addedcdae9d637495f6bd0b4c2978ef1e1f964bed06d8cfa42e010153a638fc5e37d3efabbc62d15f7b1cc5424aaad910a618b2dd5658c4777f4c3314812f924efd8ad32860f597df9fdf7a7af7fc4896d58442877c986e4f862a9f3a3179f0e9b96316a90d843ea2bf65a93ad3f5b40d3879697fcc1023b8dd1ca43959b09ecad60d28a234a74c55745fc016411fb1e03958962ad7789b300e92f0a64c6c024eedd997b858d73744392e5da1d1e2a8bc72b2571d210a2b41853df2e59bf4b2026b68d23fec8c861b8841e04208d73efe5f173acb3b7d6a69cb7e299bcaf32461d92b76bd823fcf27dc3ae69b5875bb2268e7afc9792acf255bc4131d5bdfe009a1a1d3b59c796915cf89df024346c3c52ab4247c8c9acfe0b0b03e0eb1236b567f6c97ccbdc1ea51bcbf480b4bb2df631efd4778c855e33854c308d48d562cc4acdc31474891d9683e3ba03af4526468a0337722cee4bf98d26d120322f0baf0c4711ed9df71acb5ce9f7605bf9e095278e7322ef2bfab9e941ed80f248b8c5750dbdee8d4e9dae6e84b37f0100e24cce39916d1f65f3d962468c97d047f1764cc7cffe8eb52ea6805df748e881b4d148ac983d02c3bfc3c0ddb64c13543e2a5b1d4d07e654561b5c1bcaa35aa5df8e5d8e9079e26ee5ddcbad74870599284968b541f0de549c75c86735789d94eae9d4888209058ded914b5fcd30ec3b363b3c3ab2a1bedd891d8de93faffa755d4c774175d5b4496046079aca301165f1699f52a901ce16a4797348f030b970c11e0c6271c436cac563c807726dbc3ddf3958a52dfa562875f2412d50e322af9dc75c927ec0d537a452564ecdd035eb8a1431dc46739d3b84f1c13f68b07d5779af2f7aa5b1d7b8867a7916e341c3987a63f09ffc55ec755adcb9273f801193dd3e4dc1ed7d8577f143f907bda9af6c358c5e9558868b017e1cf28cdd39278952dc7d105f0d279970159dca62ee428e45f9436761efc205781a34174bc507615ff1880f0149054988582e07dafac127321067bd2078d9aad13d4670900af9448de53765dd1966adc37475652eb3775e823b913d9b0a171710ecf23eb4f2455a632050bbfb6694eda8d2378d6503ab5cbfe18b92dc8bc575bd91fe29c06432ca690a9bb86116d532bfd83f2787d1a44870691b62ebe52beb609333dbbb4709bd270be205191372a491ef54da9d04ab4b1e3d0a56cefe91a2825a59f9ad85135a268ceb492b43b36aa57f3d4ead86088d50c41f158fc03fc1aa4e382e9f0595caedf37f2d9d90dfad83f1c32cc23e03358e66244836117c7161d7971f97afda3404aa665979e14094b4abae1ce114e46c618bdf96c9db92da2e5d4077a06b29c1f4176874c71d1c48bf17c6c514f0f2594f9b1aa85205c7239948f9dcbf21c99844a44d268d2ebcf02c9cd2d062ba7625e2fe9b25d87764752a008bf7feb903e37cb8dc19d5fb68b584a19ce4d45ab8f7a21d2bb66419b0f76aedbe6f641b1fc725badef2a66c67bf4e90eaaa70b900f8165e9103fdd3f5d2e07759ecf930656ec6141c5c0969033512d085ca40bd964fc62a97b3ab8d792d15072618c6de1c00e72d5bfd04da823f59c935eb4c4fc1263aea036e762f86318f03eb98d20e8ea4106d667da2a72d07a9e3c1b59a58cba2fb049ede67a16205d8d5711726a90183ca3c0485e8b94cb28d86f3d235befaed90e230a985cb55d378e3803bc895bec59c02fcbde0f6276b8a1a91e7226b972f81ea8177d995a9c0f597e0acc2bc0d910f2717cc914705582a07649f6a45e98f578658f169e8a4f6d95858131c04350faa131d5b039430a1f4b5349f16363a36991d7ebe3faa909dab8db118dc578069f52fd6113fc6ee6f708dc9922e25d04ccf16bc8763c5b3dcf4a0b3620c9c34c478e109974cc388ea27f5ea1eb8f9f5f881dbd8f4db1f56dc3bf8269ab3bb9a4bbc92809432754639a05661ebbe9cee6238d39aacb1a2c0c508fdd267da9bfa2348ab01b1fac36f856319f4a247f506b37b66cc58ed353bbee4177f7288269c77a4925596ab944df5f9a46ceb5cec8413d3fc349f95bf0def55aef463c543c76d59b144ea4dd226b2e961906d0469afa9c7fd9c2ab32a7f81e52afae199dac52dee6f9555e96443e3bbb62ad14754d19edfd1caa14e5dd99c1cf359940dd4dce0eb3312818532ecb1f80d00be2d953019a3e186aa6f4063678171d925281755aed96781132c24684427cddcddbf1514439c939af01dbb650b9c0d413cf38c78be3e72abb6e32201c3d05e84d604bac7445150cc1960b626b0f52d5b80741b8c39a5bc5810b414fd567c28c050046d90434a81e6ce4019ef7c153bed9ab5addb4693ad4fc9a6e2a527b1935af4c817b668108caeb6c6cc089a839dc031be28ab0e92ad5a8ac174415bfa071869579e82dd2adbed7af9b7b930c7bd9cee957645b929243ffb0eb2191ddcecc457baec3cc720d46ac1e2c34a676a014979447df16ee17ac7c394857493e1aa2468f7e72c517be1ef3487d60266f3d38e79d327f6554017ba8a5cd39ce590a90142187999a0c269427bf2d92a56ea9a3497485a9e97d063e0fa6c86d73c7151228d2489cddf7dd42c3d2bb50a5ed7bd047aad002f5c19c701b9ce846ec00d0b51f224fe0e34358975223850eaa743a6c3ca0900f2cba2a9e46f8ab7a998eb3d54181fc2a5c770f2e5d423941258b6bc3c3165422f0df37252c5a605cfed9451f4a91dbcdac1b97644f8f468c99ab6673655c8ae2e49948b13622c582ae68eadf94a27d4f44a957d5939b1b35995cd0f78de3a2c36a80e5aeff0239700ac63bb2ba543f23d898e6fed3c645f0870821ccb75c4a49052e749ae1494aa9a669ae152627cfefba72bb5c8ac14531f545df6f7c26cfe856eaabf17788678403dbc893529d7e077ccf4b5b22fca77e568e706c46c3c225b25dc24f3c401eb3959501a9da05e81f91e72d8736d8db3a4d5a7b2fa1c3cf85a9e07df0aa00eeacfe1defc527218c7c8c82c86d21065efa2c2266360797369cc02b25a24b2b35e48fdef961c450d9b2ef0ab2899bd5a132958ea82bf2ce95bf77866fc09a5fa2dedd70a52c3c246e671bf75248e1e75077fbe7d75dfdca6b72529aa2d801feb400694b7970e90ca8eda5c14e47adbbdb3ec1d67a68832b3669c3c065553c88d7fdb5f7ecec657a17db1ef10ce249c3b00ba9d2e7b82d5174fa4da02dc484ae8d2b35ee85db3c1d4993ea2ef4c5608f5d42f655c5e946fda59872b272b284a0422d8b97cad9d746accc89b3bc5d6c7f519959e78b688a5056e8b56fca8ba73ea559099c2264c186bfc99027ba16d8243b5326f0beb24219e75fa840abcc86aa155242643308856e013f7003847e3e1e5924f019c65318bb0551adcd7cf18da3108dc87863418d6d0f82bbdf921008be596337cb38b768a40f83487ed4a7469a358ffe51498c53f43937d6046968c294aab2807d9c7bdc758458facd493a2bffe2cd76773c6573941cc3411a70e4e621db874ca9480cceaff24757412146a854a6baa362d24966ed38b9afaa5f10fdf65a460ee6f1f6c9a3e7d2c07313496638fffc179ca1c498300b8f540c7a897472a59349bef0a657f1c38fd8cb95aec00d6cf6459d0153a23d13b8e0e9699ae4375be38f89eaa7f42a13e302b30f0360526c3dafec9772ff44cfcad8a992d1c7b4dbbb42e0367828bd5750d0e205d3a1988c36d8f3ca9f19e7be49adc58cca896ba38ef64a6aa3501c1c6dc5a1009c1e503b76334b21548ca66d99c2d5bdf1c3dc41d32c310d9614d6c19e43a895c92119f870517b222fb2014c4fca52bcc3e177452c573c85ece17de576ed412be7744641c9b5dc438d4478d8e036b4ffdd7cdd1c0f09b569f44062066c250339736265b5c6d3170bf99e8d91df6a84fd8ae06e34dfb6443068bc2393028d7744f98608b30c2b93f1f13aa015b2083b4c78d6bb3e22df516f96af4319ce8915e4e659afd80e41db8c10a360c2fc82504313aa34868cf7757e2ab44119149a578fc657bb7351986640b4633028035b5ca7e7e57abc529118f281459e0f9943b4ac25facc335aa1cc9668e4aeb38b05c8b15212fe2e383ec45336edca6bb127d5d061dd5296adf06713bab23d03e8142d160ebd2f7a8252f016b80746bbf08913831659defbbff6de4f06665b87af08e23c6a4e9f1fe56034b3814ca38edc19f64ac00ac1f0f5478a8ef85b8acd445690aaf131bd9cc6090ac02f085142d84d067deb6abc0502450479ed0c6b334c7fa0d830111b6fa89fdab31dd4e0867984bcb2e4e42db65b81c49671134d582bf6ab4ab3673906f1a73d12da3cd1b834639170692187736580534b10ead1aa675e0878d7ae870155a19a45e0aa95569d6c2d4cd48d69cab4b3392e390d78b8831850f9295185dd39318ae2dda8bbe01900d89ea392352acdbcdea675f5a2f113b80d3224eac5f910b977700da1a5f34bb43bec72da8a2214efbc5a443df0f27dafa5ba66e4c7e370cbf8540d3ff3fe8a18bfccbec0d93f2ede7aa02040e31b3581b3084be9fc3aedcb762568ee16606880ec95e3df92e0700b621e9698e9f9efb0ad926034e35dcc3a896a8d069dd77b9f4b0e8e9147a48cf93b2c13c0861ce0cf0def20800dcaa0bbaa7a0643fab217c6436d1b9077f9ea1a4e6f243237d2dd2f4c852945ec100fa141fa5110ad8ee1986e582727a45efc01144e44788fda2973f1ead6e10ebc7dadf861e9e726dc5d7834461df14d525720355000fdee814a1f8686b5fbd62e5f1426275d421718dff83dbd7c77e362600a29fac65ce476d3a482ff32f0d2f4488663d117bbcec30d9ad334df16070dcb215ac510f002194a857f9afa6aa59cae6739e5a5beee795ad2ad32926608c2dcf850458d61b7e71334c51068b39e86155900eb83b5c68a4c32243d42e299103a1192d2782c867ec2550bc60a865e5f01be51493e4b17a4562bc0cb7d16187456efab128dbaee2edc48ac425c3d3575f819b38531f932260d420b539d7b176db7f4f18c2a876fa5c5a23f0bea52e4696cfda0260b2ab6add5f77c6c107c067ac1c41e85cb3c7b4212d42c891161cbb7c4dc9fb2365a059a44ce9c8b92a3761a28cf8ab60c24a1a248510d507de45bcfb4391aa02021af79ee39d428808bd6da4199be8359ea6334eacb59e89c45354faf85997664fc34db16bbcbc9669fb929b095228430f840785e958ac7d91eb8862b54a4bb8164062c62e6dbe4b1598d86da547f2f2dd8c9fb28321854c0db76219c28c4d5e1d3c3fc672d9d10fd33d4703359fceaacf6502bec339b35f005fe908674625c22d5dea9780277c4a6d92e845018544d3aeb8388ff1c8be1d328b2517eca15c4a0d4b6d23a0804864a93ec21b501fddd5422c4a0f55f52ced6be21f2f98c4796087afd050190cbcc550eadd6e6c952018536a3f2436e98739720cde36b4d7046b6131190835f260d52a3d42249b109605a9191fb8decc566810b26a16880486d3647852323a5bbcfdfee0f82726b8c5020be2f3b293c522e20d7cccb55c7186ff582d82b6716e59a3967a075d55b43778436dc2fa9efc720e31110bfd78468c5905f7b27c2254be31b8b478b06f2d74d017619478479ace56431a2fd423ac2048327fe96b9534730d2d365207be4a027050677114d5c7be210d3e4124a7cbcb34a96d2f6d113701a1bca79d4988346bc2b62662b692aacbd8552648d44aca148530688c69e085ef532fb062601612372c10476e46c46c7ce1e4794ccc55d184a4901809484845c58d4df8a833b00dec1828719eacb4345aa582e056f4100aa1f79126adf092a00cb6dd2877aa9d4d14edc44df9d0aa2bec8cf6036c34c29bf6e7fa3a814a05bd4b35a8e7d7ad27f93613ad82879aed79baff0a899974b4ac08dd95fb8b3eebc50a7476ded1249439dbf2abb950f3c7454c64841be29c2f66613f2812d5b58adfd1da0eb46cf72d378af2859a5dc17eb72b242d60519479f088767c2667952c3429cf3a12b10f3a18cb7b05ccb5ee5bf9dea8cd01ed44da7305eb59e047c817eb99bbc0a0a652030726f5f1f86060a630ed572ca5be949c17610586e87f34932daa07690555a9cf2a24c812c56701a787e19811f5cd6d0603232bcde517c3ea22e219fdeac6fce8a94c5c30dcd1b7a62440d5469821b55f60d3c7f480155c62f1cc5a44f6003494ad271913e4a66cea2f95759137c256f055f940c46083e645c3ed3206d20b371c5e3b688286ee07bcd165e0bb7ab936010b1efe052d684bd9bfcf0a0a25efefc8e313af466ab27064313a7d8c080d3fd9aac9697f91cd72670ef9481998b443df6534572737fa8f2a799bb6cb8ac657c25983e9f932b94336d7f356fbd3631aab0b28c9ed96cc4c55ce11f242a7ed680240d3e63db834a69043469a787d045e72fe766c602e328f2f5a239ab7088959e28841c811cc4783bb7a797e573e9df67d65a6a748a83340fe455914f355a212aa5955f73e16f8c200a3146862c038ca146940e46cabd7470bb73bc9be35417ba2da98db8c3d514ba7e69fc25fa8dcc27e32cd8a95e0278c9ed75221df506c7c123491dcc2ea5a06f86ca3f317a192c605e7d5018bee2af7ffcd2585204f2efd418ec963aac41adc3b5da863525161beefb0deb0167fe97175c23c5b47da8ce67811c6d60a7499b3b7e1347ad860519285b67201fe386ae049de200c1d98901fffe5129faba1df75b51ed1a070776a2a0f21185b0ac3b72ec44858016a3241901e31352455f4f5087d3f063de43eb56ed519592604c8d8412b296ca1f64fa7221d1db5cfcf14e256576a5bb9fa5c39471ec5bbcbb2eed303c9a8e5538898cbbb43d31c07e3abae458bc8597c7b7afe9b344dc8b0dcdeb25ae5ee4a81eab5b444d978f133575e62bf608087ee2e3f0d545dda083e4c407d30c6222392e24d6aa62737bdbdf4d704ab1fba6e78dd546d58e29402ddc9bb3a6cb56df9ee3908f6c77536070c82be9ff011a094804e6026910ba23ef61af7f3f6faf752fdb7905f910b9d5788c9ba38787b5783704a0c41e51f2c44ef089dafb6dde7b926238aadeb309535999074d92aa80ac3ae9900c53e685c9d325b557794a665b3d446a1e9bc2e462aa7a19489eedfdfdaa403e3ba832c58d025dbc652789c9bca6ce97b1aee4bd7bd1ac2c151ac67fe52b8505d299cb44865324f99484a08af8557d2c04868d070775abca3374c8990b354471819704855e4c0817561f232c96cfdca197b12053bdfcf57e346b78dbd83dfb2b992e92fa7d6363703a658621208c6982ebcd4315d7de25a2983d3bbac4cc157eb9ceeb365c3fe3aeb1e64e0b1e01b06a612969d01d9f98f1cf8895a869561fe5440681ab7317f52d4d1fff3cf7d62da298640924d7c7ebc65acc2b472e729719c853dadc6aa214666c80fe5946505dd611fba5669edd7aaaca7640f99c980776c7456b4bab54ce04a0a7dfc27226ad7f3e5ec317eb46e2198f258b423c3ced76c139b77bbdb68e6289f3281b13cfb908ae0bf6db45aa9e9d19487eb375d7c5a436cf43defa2dd21a79015bb59391ecfcc1919513266f2c90095d8fcfd20f0c899874a508195145970e40df448a33d5e6197e4242160b08acdfe322e9e9393e9186a83f6973973562ba30472a501bf03f262062fa8d04af4dfd67fca423fcd84661f89785a1863df7fd6e17f99dc0c87278369baf03f2acfdf25a61810aa07632bae421ef1b94dbe14848c614cbb8cb1a701f30c2135b7e374f38f60315ea74c101d982f84a497b993b5ec60e526a74b1be48e6f623859f8474922eacde31708bc7672f53d62ab99a471ebc68da5c51b2a352129dbd278d5ff2e47fd0bbfbd5fd9c1b7b6427aef25eec170d96bc14eeb7dfb9383b58a7c4345abe6e3137c03180c0451bbbb74cd271aac64e3a801aa81bb3ecec518e8ce0ac1c7e7e20ea150fdff49274cd1d9ac65cf3bad2a6bee41a58d06b9372b75d4f21a8a324324b70bd45a9721b0ab2ff3a9b67534f7dd0e7b219b5c3c2117b8f7c3f9fcaf4e7c459e66c4f7273173010cb97762e19125ecc1bc8c473fca033a9f440526474a3fd3707be66f21154ed45e5db90a9d426d0d793d09d0aa7b1881353ee70fe08194eae9db680af7a56632515f24764e50dafb0d6db9fe657c7e171f7946bf6339a411714df1cd9229e3a24d8661addd04963de31445d959155c84c7bdcb3fb9bb96d0709a29c2d8e9edadba9918b733a6c95b65fa54696c8eda4e93d21e96c84f93af4e8abaf0b22caad90061f09d367e9addf9e68fb7872e22ffed7fe6cc7a3cc33773e5495f083c45b187a69266d0d3324c09a19dca933e591e3c8dcbeab6cc4def48738118c35fe4bab82fa61ae8efb930fcf428aa7606aa34e8c577f763455a5f33fc0722c9deb07ef9c6d3c26618560f3aa4d5601ace3bc859ec8ffb6bf011109d4786850401d084b331c164319731732b7c4ef365de3462f6cdbeffb5159b89ef1da44a5b0f6c544f39190b33b473e337433b6b417dbe8b292faa0929fc1f528f460978b552ae7733a683bc53b644e8c6c043d195f501c95ad9fb24afecc6f4e78a5e17fc10bc74c940a68179e7cb0940bc0f2c498c24a7ef945a552f2fb8f65db14b301792bed378cf2b618d8d31ce0dff4784448b4faa51286fa6910b1ce05b8277c9ee20dd1da71ab96578f19dbf955192e1703aac5ce85de11ebdc91a3b48c68bed690140d9c0eaf993205b3865407a984cb4e060441cfb58c59cb0dc8e8c452ea1707f118f2a0793f56e122a47774102ccf8c696ea56c97ea4140a87618fc709efebe075c74d392e934a609aeda070786a243574d7fc90f8c20e1d463db814c4dec26d960a914872739d8bb0e025cda12d217322927818712873333fa871f30676dd6e9cdf5efb099f4ddc96a76c21261dd5c8c9a330298fdc29929a2c222e77c0242bafcf1c1b981f449b71cadf33ae42297e91938e8bfae81a828051 MD = d1089feae2a08019d9b7b121bc3fdb2e64d90647735608bf4e34be89f453d1fefa35e9144cd3a4f389d3b911b330af775ced000746dd0b526a1ffef1648e88bd Len = 81808 Msg = e5a4fde05da8f5310909de90db06ce4f2ea08da7a6f49aaa5ec76f7a426306b9b9a29c408848b514f3956095241bbcf9d1cebbf91a5a26cab0b9e24f3c04718dff89bb5fb51f0f6bc0b665548232e6320b7aae3ff4cbd0d28a539a9230fb1be3fe84e3a5aed50a1eb9937434bdf352e022ccecdffdf19fab34bd21a9e4ef0da4ffb89b7a3a13ae152655159d9c050aec5fedff43fd719b3bf620fffe20894db64a506b46208104394f23d0f7e911163f0a056fd1bcf6cc6b18a4baf7ae71e5032772db7129c613707b262eab6abe7cc06b3bc2f301263b24e170dcfe554edc72de4774631d8ae4a3f386b61fe8b54656c9b8821095a9ef4c9baded7adcc83beab6f6bd85c4777dbb006af1bc2a9d7ceb6ea4368f4128f0cc8c8273d30c880955f8a73f3de533e89ee8fa65eafa1f2466a02667dacb4b478dfc18f870ad364e9aed8480f44a662d36f3609c121ee348aea8669c58fbb9fb76359603bb877a13a1dab20a13b9b952696bc11e9a5f90efadce8d5d719b1b146e7e251d1b61fa5f520a5c6500fbd36121964871ec85ce224a59c3338d71189b5f1eedccf804613a95c4a81725d85e6145be1a1f6e5847e86d932fa414475997305e159bbb3955ac524fbeaae917ff5bbd2962b08aa0a049fec2fa3a6ee38510c986c60fcac67ebe71f4c7a6b3826056711f46aaa724844de62f4b7d040d450e12de27b28e738677dafbeb91eddf295a49eaee972cad99fd0b224bf43c8f419af3ad610b6f0a12e075ac51f5fef702702dd183fe8303876056e222277f3020bb543d9ba2d651cdff2b4e22594e92919e051b2d6813eef77eafb9f79e36b78b7a1dd4fe0029125cdee22b8546457881eeb911135c44369160ffedf2e2c7ed29dd36bbb2acd1136a858389a3434b70786831fb5e627ea2fc0d2cc73d7a9c9aa3ef873ade2e371d9dfaf7b1a4d8c8431e135521350229fbe18d208ffdee1b86a0b5f898aa0fc2f79d4724ebaf8d24b91df70ecac1c5ad09e7e9c18d5dc7ae78c939721f3fd6d96b1374f47fecebc79a1a1c423f2a327394b728f909838cbc39c682db15c50be63fa7874eb4847919aec08bdac997d2e164f852af4a97c5ad923e981dc36337503c008a19d39fbf83bdb44bbfae302b60405370cb99c2fae848d9841e7142e17f2ac7843f2464466b8ea164d7361fc759f27089343e2bb4d726404dc8678a91dbd1a37ea7effc953aea2ddf0cab892e3240f6a5d481fc7ae1f31bfb01ec62cfccf83d7f397c8f35599900c3455399e655f38ecc92a95ad56e761197b349f224ba693c8fdd1244ac2e63c3186a78747928d3df0756006f4ce678cb27c5c763170dea49b67bfb438423101ee66260456f15a7925d08cc6367b2c1f1b61facdd312d440cfdfb7db5449f67b8361753324e82394ed791565eae38192a49a94087f8823f2c6b45e1c2750a313a0f709b63a0d94fbc7cd7e687aae1481eea4bcd8af675a25209426f919ecb364b7a557f01ec81b28354c3c406e2151576a0ed990eb36c3725ded86e4b474c3e947eae4634bbe22a4c673d3704de3d4ada7477ed3ab6d0c44ef2f02817f9f411bd2363392394647ebfbe2e88a927bfadf16cd11136870a12744d73e31e3a2b766d715da0f7ff6f7883607c001c4405076493e34d2bae80e940f847e8879559374c7182c3d7846bde415511e586bd751fdaee96e941b39c105afa567f7b8fe61a032abbe9ecacc079a0a6d37f0e1b79bffc87d02c9f1fc551695b86ef22b23be83aa4f15b5efed611495aac18dde578ad72657a606e7a62721523c182a385be6898e80a625403166ee37983f61aa3dab2e3907dcbd54add3c085bee7e2790d864c6fdf044f641e657170c3f62eede0696f811bfb5fd199d77e70bf52cd55cf1a26ceb89496d42af958d19caa4811c662158ef2a680d6e0aeb5d39bed4d67072ec31bbbfbbe18edaf1ecab0b04fae8611bab32a52b2ed28c5f10ef30be5154c108bd7478e079abcd30ddc7eaca81c75f4b9be3174588cc8b9da83435316f9148beb91e9e025e23f21d07774f3d4043c87ace086aff42e46f6bce11b47758ae6ed8cdc21867b87eb07f13c222a65ce30570ecac85a185a2a0922a8c96d633339a1ca067ce57ae426e1da8b14b4d002f7cf59ed45073788f87da63b0c19728a93654db15a81c68f996c06f4ab37a52b096d18c8ab3bc44328a0a21821e016197a94625d48efd0f2a8f300f9740757aedbbcb5dd596c6101312ec0e0c955e03855bbb27ad6841cb5ec13531a0db85a16f54adb9bee1d705bb8846d0550ff439fbb47a89a71e31c31c94977d6c6df4efbcc73d4a4b7c384bb152e10f65720d29821c4df2cb981520ec701d9a03dc088b5e7e44b5864f31097dda857445a8effba1fbfa0a20bf350956bd91316d120a9edddf89a577430967a886f9a6fc97e2d8e1b94a7aae79d8a7e3e3b9e9b2f5414fbf54d6c0253e0a8eb9c0074e922930e8c9be05ea7daf47221a4a5d6bdb6ff7c78e44f1ae98297aa638ef751410441f52e172f301964acba1845a475ff067722dd117a318d8eda2d6ae7a0c9f7dd2f93fb13edb680030aa4ca77c3e6bf7c4fcaa1134b4a6ee70ca47a2cb9498e1ba04d6c28887c7c34b2c4c0d16093afa70db66d505ecffe19c3a219c49d5a644e489409bb9bdc5e8819bc93e92717200525788a5f113ccb958398b245c9772af38cfa4c43a460a75bc3deac1563ebc1252ba390960f0b47e8b10adc36ca1a4299e202bc672ea3f75e35cd81dcc38bf37584aa08aba4c60391f08b000e1bce3bbfec2fc28c8700cedde3ebbdd5a2624774c51e6af68ef77f2fb67bc6424b0d76c40fe4172a6a218e7952bba866ad292da16153201d0a1a2af0775f8769b4529444c1c1f2d73460c6af06dfda26302b2699fdfad075b2a897a2b7c8dbeaf42814b0a64c0e096258f7fd74badb8ad7f2c2bcdf67e497151d35a4fc2a3c4c871868a631e4c1379074a2d320cf251b011a72989a4cf4f7bdf29585b9060114f98e1083d91ea4e83b4e47ce9f9f3f4d37fcb69bc2fc5a2df9d327a372eef2caa803acd8206c31a1cf30674e45ad929819341f54ce08ac9075097cacce4769d43f137e218c5fffeac8d581e0b77cb791f13b1d523ff464c59c3ff5000fa1eed81b3834ee916c5839b4b81814797f26a16c8c20f27d420b43fbd1313bcb70ea3cb8dc419db413d2f52f32aa57e037686ce7a1dad42a6418720057b1be9656f478b48a34cd88d918d374dfa9399047e55aff16ab65bbfd1506464de706d4a686128acc7eec744e622b3239a5281e0325e22f450335965f79472a2e41b32ae227a0a81d9078fac67782f3bb1ea1cdfbb298d4d772b26e1dbddb48736231edbc419998f80a01a0d3916115ee864544b413e59c288a6a97ba6b291da7c901b1877c73d9e65bf4fb18784c254e7c7106aeb26ef1c2badca7a809c71655d6a10ac630b5e752f6f16df774babe5551b3886e268b522074671289022bcee82bae4e0af6d64dd87b557de31f233d9db69b3e54e8c159ec57c86cbffccdb3e938881fc8475b79e159bfaf7de01c1f720b86bcf561a76560c54f1acf422341d37dace4809acbf808028e872a600bf08cd10478e229b401485d89a1398ad305316bab30b6799e44b71640797b07894d489792f69db97da9ed80f6a4713f437a7d92f188fc5c58fc68f5840ad25f1a823fdfc0ba7a994aebcac0147928c7fb2e22841e51a4cb626ba830b7cfe2cf163bdd0a0c391b31c2338a9b71a3a2bd707ccaaf902f523f613eff485a1d0ee022d6aab6e406f22b6a1d97838cc881a83a02d085e5868740dbc2d8bcf986c93ab6ef1366c68891deb9066c18c43c47e0be3cdea79cdba64818b3cf0f04a1a42758e1b18a42426cd4159a82bbc693682f83a74f6504a351ddce6e3caf09e2223e6f5b0fa1e5d8f5a4262675fcf25264bd10ce9d7eeb81fc7a537ebc1d87bcb5f880b7883e1f90deb76146a05cd5edb041ec1f53358fdc18965e51d7eafcb5e1ee3393a5cf5e2e6a864d77bc4bffe9ed368c160b39803638ca3583fa97d7523877de5c02c62fe62ba94146044acecb7e03573f2feb4b04df8e7f819ea4b6162c3e079d09c3037cb498e31e22e9c106e54104172bdb7eec6f4ba2d75e7207763f9945b33546873677cdb98c92a97520a577e92aa97a6a417a8a25f194b049f6d521ff5b1fb129c807c02afdddfa69ad51009cf60358bba893d29f6cebcffc1caf60bad113934995c718be0e6f6d0d015a8385e5d3e6d1762dbd75a5ce21ac5c00ce0ed1db8d8524382ff92ab161edc134793a8695b55a5eaa933f38b675c9398bd241c9b1d05af7fd7e42cf5e896a61713a3154b344a4b6bd0c52a23f0ce139a3061a15413c4985799c5188c1443176937ef0ecd7054f12b781565eb28762e0d8e1ee610401cf512f027bd38412a1550d900f9b5b77b7f73c7ac0dacb45eca3bfee452964c15aef9039483c117558916225c3fccb3c8de8be8118b2e3f8ed06aa93a4db0e0b7ab54fb93d2ee40cb5c01398d49da0a42f4bb01cc45396f0c29e3b6a83f24a40bd56bffad12886194745a461b7ea764f2aa4b3b66a595ece2bbee4eb690bb3f1812853868ab5725b9bb68738c45fa6adee982bd6612095f1870d299eda93d5ae64bebce4f062331411875e66a089dc31097aab054f45f70b42fd9bed4f0729c7e69e6e8e789b4303472c7c73c2e5618909d093bb9b25dc6c0df49e6f4ce22aee752bcaeba9dd2c89ab3a73f8b1fee1164e4e7871bb6cc0a436a6b38d3ac143729f0b5494fab44a17cc25d76de422d5596538ebb056773e346b787ddfbf011e04d291be12e19d364e1873193bd01da8d2ed14500fc2d1cfad0aee5fcf404e1515ae7349de05047b9d2ea6bbeb0c3bf603248537e8a708df6e937ccbe444e4c3158114aa6ecb9684756d3522140f1a277ac9f015c36988f81993a864b75381a28508fa324dabbfdb7752a2fe1f4f14c79a3be97c3880dea40e99f59ca0f2812e04949873e33bdd0b037d74a29552c850f208d5dda093866dde04e8e639888fdfe4b26401c7d29a7dba5c2eb1fea0a14e12af39aca407fcb0087306c409abfa32d5e1115e743664be0c6d45aeb3bf4c396c9db98bab64be050e42b3d869c35cc138bef4dc70adc8466a3f3deb6d05058d7052a9dd3f1056e760228476027524058d9a931e35cf319154208c1a832879c4be7c9f23c7b133d19e610d4f4c27ec6a551270964c013d497adfc49e8e802579b76a0df1edcdf15e29ac92a6af52128a2f9511d71bfa47b91ecb5bf9f7a28516ebb97aba19acfbe79253d91eb48a32cf6db0fb433e00ed7ae051d6bf47160516dbc97a0ec3f4dff858f52539f446c9b49ff4a17d2abb9b093021b9410531421408386042853c0a2afe0f2b7ad70e43c456be88f75a80eceebea96831aabab878e184e207c5c906d9e2104043d5474d99029d362446073f85cc678813bfe8d4cff81d53c11e42429fa5a708379798238d241f1d8685a51f88e9da8d49bd621383cc805a00f72e69e6d911e7c87667822b4b92c3b091e11942b770ec461bad112edf5c4939d8f3d939dd0f6368fa3bc5fdd9b6bd14e351995d85d929bb63305a4ba0efc5ee3c191d1321edffbbab9b8b7f7ef96e46026d3c23f551c9fc1c823b4491d944a0a934b21d584c4112f2fd2f2a7bb94ba6779a5e5086a941aab01940b4529749d3a8ad1492e088ac1178d74d797094f9b8ab7f9c4dba1e2529b66c071543b849f9a308c11e4b51a539a5c05306fe0aed1f16736295e04ee90ba800fad1e5aac9a530ce443a0905c0fdf23edc3d64999a3c511c4da3c9aa01b2fd6ea894c8ed4d48ca642a509a3383d0f6a9359754af8582e3d0b9f1b6be13d23f0b7cb86dfe4966e870c01c8f5972451ba61b9f4eeb33953747342a480973cbe57df3c7356c4282136ac1d848e5f0dce99beadfa3ab38e5d3d64897ee0ac612792cba4bcfa5cd2cc3b88c1e6777a40ae9212fb2f38de9f7321463e519306f48729e2cb09d494dc981f0ab795b7ce05182ac66c3def1db3bea78127c7a28f3d05a58b7801ea558dac6998c63a5645a434eb40c8c967591366577d0d86142d83ca8d30754c46852f31a19cb57d5dc6642b5ce9d77ea9780892b9a2b736f1ca10fe69388893f00e084e507d4d05d3388f2505296001bc64d86a5659ef80424d2ac7c20b7a7eeed6612cfda3567bc0856b496f692dfda803cb17b5087b0c0e9e1a501e1112b44ac781f2307698862c9441c0210f0418763f2bc15e1924815da528bf08b21ade0cc8b2c9715edacf204d58b2a385aefa2dfe3e8fdaf2b287374a9b3d055658a33ac03ad949c3e6fea398fa467e31f34cd52a4eaab0fdedc8a575bdf19f6596acde9962493f0d82babe5d6da4397d9ab677aaa13a68a09de9ae0ed4045d479aa0ff3a7242dca477ab7884faf55cd06ddf19667f668b4589955bfd299dc7642c28a68bb2eba6f08c7ad9f5e96170913270c6463256a0537a72b32a04e5662416ecda74696d275a8bcfe999820ffc2ab210833201332f323828be7dac04c1f01f93a3dde1efe7483a51b1560d288802b5685a123325c0498b6084df6b21612e0ec609ae609a6d2363a93815d1d39c81032052ce1153dc023bc20e368764cc48ac2c15cf2f954154cc7f86bf1739c10f63df734ee3e60ac40ff5636c49f68ca4c16ece289609eb413e7aa43a27817e149e4dc67bf105d3f8d0a28b67f9ff29ac15333da2dc1ef3548042997049d45cf87c13523b82d9be0446708f11dfa629c66f2468234bfbe2f45c806d47c55ae223c5d92077df8a5351390876504314165c98e8599429c9408898dc29a9e23a98fe41463618513f1a477111480e6c7177d5592818debfaf937afdfdd47de99d06efb8039e041e209c4eb5340d32a3e4d599788cabe755d66531538c76ab22aab55ff1b860258e5660cfcf19cea43095b710bdbb1c9933663d156230181ad58a2cb7b50c8261eb09ee308567934c5bada5a2f25e73dba086a48ef192c0b44a64f35dcca70ea27b60cfdba0c662126c5427b7dd1cb694e65e2104ca597960c96193bbfe320bcf88848a36e8e045deaab1c6b7489eefae4b173cdfb32e480699a99337135582d0589da7ab245a43985eed090af98c251018d97d8775b9378f03637b3bd2b77a8d33d2afa11edf6428d02f7918b88d61a294cb6d65d8a14de14fb8d42e0401fbed634b29809c15b17648a09c494f49aa4c091693dfa38f92e5c5cf247871da0edb2f319daf67a4316a0e68fd06846908f6bde1775ea02a0f83acd1f681e1ebb93cdeac93984735eded69ae21b521958388f955a24b951bcba44ee5cfb01cdc06f9b9e394a20370ebe5a39a92c0ec7424ea059a9b0c4b09ce2ef134396fe954fdfa08ff273565fc353c0256d78daeaff20529d7ea0b8a9d210bdee5bb2612fba5271327d5b93382d3d8cf0778862eedf5bfad3518ae197fcb215d21de3b5d7a06682184259636a9cba351d8fd1136d73601d8dbac5fc256d45ab5102817937928a67b3e9f35361a2783d2efef988c15bcb4f4f12e854bca459c30d923227c9f14c76a7ccbfcfb7cef629874d682f94e90be47a127877d8525d114a557c4df95d1b5346632544c782927ec903837452ab8091a111ecf202c7ce0aa9b4b668503675621255ba6f2b6dfba166a9f1f38533e7bb4699bc4fc6a53b13ae4876e378fdf947be1ce58b6dd18035e2c92a29a6e29fe5fd226ced8e4b12c0ca79346bbe4405688c114d45e95dde90cfb9a2832268279617448557e459e39670df854d9a8928392eeb480b288355767023e19c92050d3037688c1b43322c0953e3d025b84dd05df9036c67c5c2832b86606dd27079bf68d006f7b435646a9dc61eab7071f2ac3b7ce230d82b9be6347527adc14816cc9473c84e9f35811dc859e87daa72280a564d002bc8d4800d25cec237e5836ca3478504f748bde8c41d71e9dd50134e8932dbf5b3d65b0f5673f5c882cbad0bd1f6a645884d593bdc11c09b30fdefe697559c3b7f7d29aa50b37cb314c04f44d7263a12882971cae429a8752f005270b3331039c529cae19a48e61a748fc4c8315ac2e46d49a2467ad9bbe01e04058d6b6fda895b68a93581b8a4571866b8066f18d343ae4a651eeeb65d948475539d3e405d9278b66f26a5974a017701838feec4ddb8d19834b4de340feaf8d0d7109a690bfdc39f67258459499226ccd1b54ef364ac6daf8bb8c7c7656bf1a30a981e5e7813b2803bc29c6315919e450d16fe38eaa6d91ce49b1a04e08ff57868841875349ccc15477e5c69407843f6a0358ae9e220aa5cd9cc6360f3cf8aad6b753751a3c186ab34c952c06ccece5e359153aaedb267ebd5dd225021c307ceaddbe988484a68ce6e340e0cdd0d73e837ab06d06fd48846633de576fcd313688a38bd7db49fe90b6e3eec9313ad0b2120f3031edaff91f90c7f1b39e7a833e79b1c11965b2a9dcebf5a7d17c325ca957bf9e6dad19c0b702c11321d649acfe85ae68486ce82eda4dc074dff4e2058b1b3301098c6425b485c84c89606236dc7343894b361315f1a3ed5cdce37052c0261261ecd3b8b07ee184a5d384eea9420d172b0a0b59e788b72368ae8f04cbb04005c700c93cea7dde9e25e88a158b9719d3566d35e52b094f0b9f3e41c7f9c331b4392cb8195a1943bed5aebafe6643601e125cfbdd69db344c097440e06362c0c6c258e67689bbda8bbb0e5cd2c1aeaaa168bfa46a2a662e8fae38d67892f3b7e4676c9c7cfdc969aee1f0b7b82540bf035f7e79b3f412057c977349b70ce0dcb53251225340adb9ce4f3d14d9196166ed0081c2e1524780bacb0be2c45b8ff8e22aedc022dacd92940cdbbb5d2579690752b0c71bc96d68f252eae9c8066ad2125729be115193bca820b4f46bd1f08ef85df4cf8ae3ec85cb35f6a6ea96d734eec2ee634a2f66feb193af072ba62e9e6929332355272c9fee7b1960539240e41d7222f9f2fbad21586db33bc62b9b6001bf570ca61d967e022c3a612a820cab486faec6343ed2ee44b7aada64e99f9e692646d0a24e90e9b05141ef98efa35117c27b13367f3c2a1d797b2a2c66a31e4866eab7734183aaa0f01553c5606d9e31727027204653a08db90e74472c0da94788290b417ed8877914a0d5d85dd25a3f87744c1b1c7f173a814bffddc347070e92ed12338ef549e4c2c9bcfa6e3a4ce80a71c84f872856ccd81a1515b1b700448f1d1672f844b888047852521c0d3dd5024ee4e311b626ecc763fc1780c75c9184a15d25442b9b0ee195dd09eeb3f5ae77f3e8ff42914f42540efd0cb7dee29f7b612f75fb14bb1d6209a6466d943c1a72481ccda12199758a03601cdf635b137b44d68aa466e15e8dbaf5321f18dac1f934c772b6cfcc2e6e2a6d6e7fc090988d34998bc789d3786c9112f58ea8964c17a233190901af140a6b6c2b1f5c46d4b819bfa1ede55a14077644b642aa3963d177a6e823200bd065afa47a489f486f04d991f39de23dda6452d49dc2888bad319c69078b95a80987dc5e8480f15d12795d57aa5fe846718d0b0ad396a854d33ef9c49fc9c74e6879dce27052ba4c65208d59edbb5f3b828a8b2e8046745c7c0076fed8661dc594429578674362de0f0051dee53aafe5b461b888cb5a526b5180fc61d9e901d436eaf16891dd51dbb9219230b963400cb01c7c60dd5bac48fac57133cbdada45f67ad7f915a7f00b0a8c369592be7a781ec3befdded1e9bc1ed7bfbdd5c20fde7bf92e741c29a535ab48275698d4c6f0a45c66a8f542718f65bfcc4720270a686e6fe021cdecd923435d4bbaf22c8a3dedf15ba94a38ac8979848219d49432aa76e4d4485177f59b7bd48c0bc94f2f279f898748063a0271ff2ec77a188eef6e3c61f231cf525f66fbb4d18f44c31e76632dd1cd51d1db11a2c685b4149fa97a68ed22247006814c6a0501908c12bef2e0e4217f52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724215fb090a7ab738d185e8808be6d9f3eeda7d624db3e2e06b283406ee4f12c47bf6dd34241cc46792d967d535e094da75c6194242d57b7f06ee84e8fa2571d07c97547413520beb3990afe3c63bcfb4f4bda57542ca8d94b13cd1bb3965782aa680073552aafc4828342718c728b917fe398887d81387d61ccba0fa16bf84379c395c146c882413013c7400b3680f77f4c258d67d40f8c78bf389223c74349bc03bc98dbb8a01b037320d18154a21597ad09d0dacc36ecd914ce0cff533e7abb4ffd60dda2113c44c8d58eb677f9d30f2ecab79e11b487ccf405e5feb6f3bfbdd0e182152dde8a3a3d6fde72458e1a2ef9f2ac7a4c914398876485e8986a010cadef6448020eef2ff775287c6668d03e3309163825d60a87f4735485a3aa26ee0fb06f41c9a95269216fd69d838fdf8507955d9e438ac3df64babb9d7dbb17ac1eaa0bc729b89a31e1e54f9d440c2d4c9b20e8754fb556e9fec220f7cea5bd8d0167a1a1ca42b1cf5f60fb4450e6a4da17312184f05faaedeb12ec5c3f70ffdbe16f9798554f7e8bc568425950252b79a4516f95cf91a933523288947725c4dce548577472e8e9ad38838ca6ebd2a96f6a063a6e93533a025cab5a671fccf6da367c47fdc813da7ce23b41f1caf4080590dbebd8e5ab45a43004cc9ddf6b7c1bfb93d1fa00da3941eb17c90394932f833e55e89b6da3b35ff8c545fd5e0c3ee85d135c35c145ee457b9f8ca4f2b706319efe9a7fd2426a7cd9772d5045b6248884864f74b45be2cdb85cf39b8c697556d55d694cbd905342fda1eb5e3b721645977314808124fb24cdd564b209b0643c0efabec9d59656fb8ccbe9efe947fc65bf631221cfa82291e09248af1295bb296f5effbfc35b5cedad7d8ecbf73dbe3123ddb11e46f0405b1a1c085b4e1f6266201096f72ee74b62894042b90c5c44f1ec6959418f033bcba2fa0a7e6656413b4a98e936bf430da0489b6d83d0ad76ed418f725052e9fd29a1b4b8e0014241ef157f62471e7688ef111777efed373d6c4bd8641436ab6cbd3ed37948c8ec48cca84c67f1f288a6990c3ac9c608027fb831cb9855e45072cea2deb480625b3f182c8762fbe3824de5638fc9cfcc1726171cf174db04e0f6a5f45dd34e79970f1cc8b9ba2e9b6b671a3b9be0d4de7d18d234d0616d3d64df8b5dd93d7bb2a99e20a569d752bf4bdb81bfe8769be93c3f30a0f2c8d537e217c605d95acfb798d66cea1f212ffa2b916214fdf4ee935d817b89df0fd99b65859e13e59211306c9e47c063008cf11271056562c09384e7c8f9161da04211f2115daf854d0bc42eddfb4fbedc324f0863b1d8a0445265e2fbf47036e1d74093a3490342f3831ce57dcebeb71deaba154faf953ee7f5de5702b2beb23c62d14f23ac34a3ec42e099650936d72b7ada421d48c5c41042964dc57c291718a96b2f79cc6d31a010b7527df3dea46eaa5996b5c190ba290336cc2b99d9efdc76b7398ef2d47278b44919add6dfa84f44dc1aff651da999fe65dc1e53f5c1f28f5d77486591f0daf83ff5ddf8606b340e0ed4e47b9519c8fccc8686f0a616c1bc04f1906fcd332fa241eff5a38a7486d294ce4a4a1f901ec413d149b91375b1c754ae4f56b0c1e07bf60edd1d854bae5619101b1be4980320e1c650f665662a76f7b66b636124534b075a7eae7878126343a03d360cb8dfd6de6b83efc37194939211cede09e4f2da1bdbbea08b831cc0ba889ae3be791aafb3cacaeb561f57e4d0c85e0fcf8724efdb9a8639e8f5333727d0186a22611c7308eb0e3445f7db3256e1053ddc975054ef9ebfc3b456be8e327ea11261fa4dea84d43510b9828944cf67a9b2579ce0cffeef4f841a2c278e829c1c25a3cc16dbd08f29c8da46c7e4e15f34b4691c3b29b09620c54001d5ffc03170e90f5ddd109424d0a3cfcdfed834d38d8c3aa1c92aaf9a18cd4e5c30a9934687a7ce380b4f779914ebc19f97e971ca9c82f1b2f299a00321e66dc6a053a4e248a607e2096121f8dce6d742f8df404d49ddb7d81e3f2eda2256c5c68dc79b0d9b30e3e43e0e3b490fde3a408b8248637ce7b399b5e5ff2602667de45fcb1fcf688b8ac7111d6d9297191121b79a32141de60e801f51bbefab5ebda87e28d83197002313ec585edd5be0856be3eea5681423ef12c44c0b3d0486af9b53a66f3a11d7d74e3685b731437abea879474a6849e67fd90d9d9719f5257844440c8cf3bc58cd02566d1f973731e35fe06dc91ba577e55c600e068a6685432bba24d66281cb2eb6b6d83f151f4b1d198028c98a0e1d4a23266500993fec36d91eb4f691497721f3bd8ebfb6e311935dc140f2bb6d21d6b7c86b2f4d68a379d5d6859388faa5cf40d356467f6ccb6eb30b7ceeb8abcbb09face838aecaf235a74c5f564e7d9d5f2560f97c7aa0c1d5a3c6a56289ae6301633ca4c6c44b2092d8e609e7eabba7fa2acc400aae683af1b65a83f9346031f08cdf667f98d477b7ef0e4ded679b0bc8d880f09823ad80e9732fde59c3a87da6a1fcf70b314e3dcd742bf111ca0410f0b6e2d4cde255d9e663ad7e2a3d6d8e4b2afd2013979fbbfbf0a4befa1de0ff9b4d5bb352f2498e100c3d2b15ab99ad06af49a73fd3b1396aeae37c50681620f0235454ce5b72e68ef845acc1141322ffb9485436ec6aff41ea4ff3bdb18ebb18c23380ea26b72b89af2fcad880c3355fcf62f1a1eab454a97850eae70230183ab261ff4e5affa328b7614dfff8912e4e7aff4427d67682ca1d4e2b7662e47f7f794799a1ff3498949a45fde0826554f341871771b798cfcb60b17c13da92370fa14c168c1e3d50f4e041a1232927f077ac623026950184d5cae2a66670228911b2d73db6bd0214710fbf0370f2bf4a0143f857ef789be80fe24771162e7cbdad3252d7c8e76b2b33b126e96de715aaba8fb25674694d45a23049a4cc1c881b0dab24ac69a160df614dde1cc50f1258ca17f6f45c6fffe1b53c50092f412fea56a4b58442f5c976246c4f641e729c9b58632df850939906718fc566e8a55774b3a66d27faea8e39a395e18821199cbd8cfcc02bf7dc04fafeb00e849e50e9ff4a38b45d3a8897700750fc52750bfb048f691555fa5226058327952bfa4bced443e2f2edaad8cc6377250888c2509fb98932963e00fde871287dc122a39dec3bc72c8fa0f1e116591c9d6df3b2f17223a1e0aaadb2e632841739f933424e2d7bfe9ff33eb8ac5b9c1d3f935bebf55b8c00fab86bb814ed8875e3a7247f6778de0fc2868fa63f8572a394e2881564413ace082a41b98fffc36d0332be01eeb4aa221db15a64a47a24d623c341d9470e76329367f45d60527e242202c971eecb286139da6999e324f9dd749c4fdfa5a9885422d74f4d8ecd00c5c77f0d766ca4a0f29d6b82ee02693be10fd67bce86fab85d3de21931215793767b1152b972275afdd1ca6e0b0b3330097dda8b4ef2e94e756cf019b022da7d5fc5205fe2073c9dab5e61f5970569227e450f4709f25e91c338691873983d07aa2d14fd9834cbb323cb96de3bf9f35767efdc79a48d41ca7028b5de228b68797c3b55f48300bce28ea0d3f39eeeb918ed03abe7cacc7a42a3c53c336403421b00784b0c4c73f77314667ffa69eca2ac380ae35a21b5f13e859567dfe109b5345b6b5e0c9b9565aedca401bc43fc985d6f8ceb9a51538f093e229ca942a4a90eb89df7be176fecda0fe2c301d5248371bb0f2d6f03ab3aeaf5f4445b2fdd04ef3d947ce869087540d4a92c90c66e4931431d10a1dfc7db28d391c8bb4fbbaf2012da57533968e929547fa433bfe2d3e5303dfcf78cae5b0cff838e924b4692e960f7eec72e982edbb7ef93b0688709d5a9f8593bb368a0dea15200a7ca8695914f71ab0cf09f2e9f247e61d06865d348d7d49033fbfe94e6e38485c47584a16206d2f5e92885cfbcc3b6775b68841a88e15b07a80d771e6beba384aff4479ca2aea133277e53fb7cbd1e3b190fedc4dbf015276190db25b7e1376731eed7709a6e67cf8e991099253a3e16d206a7bb8a2c8958282d329310eec695120c3d03926fab30e622c49100619f714df4bae5dcbc3f03c38c854fbf3ada761af5803fd2d8f5bef7c077cb555bc8b253822f2c1bc9bf8efb54db410becfa721151a80aa1d2cee1891c322e6c504143ac580d778d7a9263982d3d513e2caff1becabe4e4985bc0163ddfca48c67938a201d5cad7cf83fe862c1b2679f247f5bea06c8f2101849864eacde15fec845f1777924b82e6a4e8721b5426b75f9f5185dadd1de3fb4fdd81231df670b9cdfde78166e7fecf947a79cb4f54509d6 MD = d440079d982249c51971bc2035b6dd4594766485424563d0e4d6822b26d385c9b415702dd7aaa6a1b4c180938c4d30b0ba63d09c57cb2312d49ddcb8b32602af Len = 82600 Msg = 4ccdc1f4dd8a783bfc8e8aec74c836189d7ebbd2d3ef6dee28370809567244caf824aa66f9d9a56a4c08dcb5dd3dbfc3c8776032cacf857ef45bfb10a7522d77bc71f5f5039db13defc99a7b8f1a5195c049bbb0a24a0ff7482b2d97b43e320e027a49a6e31fc43c4d996b4671a71315eebc735744a634df8b6d47a9657e7b1831084f8381a704f0ce40f71f6b2c2ecbb898312c982b1bc025eaf04ba259311db0e3ae93c57c9ce0db85e70d65f0ca3f87a49c398623ed217e6ad18753197ca3e9d30fde98e8b295da31e319473c0dfac4a95d85f7d4d18bfeb592646004833443a01a6de0316f95350c924af9582283d56f1b18d187f0850d92daebb1636f572611764787a0fa6a52de9da8648c2f6224be7ffbfe85719713ca51222e7d6795faf0cc74737d7c9b9b6fab3b6e205d20175e313564137d497825a013c09c94742803c3fd8e101cb17687650c005bd3441816d8ceed7c3c24a46b6fc64d061e7e161304e9bea003334ded73220386ba568eb01ccf8006d5afff646541be042c3b2de73640ed7758a9876a7c855de939dee1f2a73f04fb7172f2d82b8efcdee632d549020b02db449c8cc6283ef8cc796578a51e2663a137f6e38e69b5eedc75eb77ff1051e515ef93c4c92154ba77a172bd912c8c844150c23b4fc6bc7b4601ee79d2071a7e6d8016973a0ccf8d31da8e177d777a4f22e35f63e3eaad8d63b1c4458a906eb52a1fad6de394b858444c40ee32a7f7ac8e1953c1127e8f0b7caef441ef52567296f6e1ae8a5f1603f61e10ab79650c83cb1a28bfa42a6bdcd92006d7c8f6d99df72a39c2f815f175907986b41859c0bc220d65c4609548eac22e826edf23001e96e63e11f55f519859842b72d72a1b3fdb1a93370f682e1c7f00f16dfa82d2ddbb50760449e53f539b68864d808025f43e6b3982794a265a57bfdb3ee2ba57c2ae906b01bb4ec28e9c4c20aed905e7c49325df0c66e4368c9493c6485f7497b6b6cfa5711442e331a6597ffbac5f689521730e3d9ede699a7ca33cf339589b9f1c35abbd1c6ba925ffb62d9ebf36b051317b4c7de8dfc46d5818c4a7370d6a6729e9044b9b6e1c50ef8db2fdda33c8de0b6524340e8f51eb6f19e7cc223c0cf422143b8559f6449bc0039482c7fdb726f75a1bcad69717fd0bcf2bcac28c8a3052ddd5d21da92aeeb8425d934d3d850f3d82bba7099f1e8c72621b0adfa6eb01006d5c99b12fd5322172949a339b3b8324048b346f4e6f7eedf93cf24131375173eb5844db314d4d41bac2fe42bee069f50813d7cf4d11bdc4bc18ebafd67607f4804f3a64579b2961436e27424f7ca8f9b8dcf9f2430c2f3fd4365ef33db10bcb54cbe31448c6adc835207dfbf5182a753a6d03a1d969bea6691eb1d30df045408e53a7b2add6c0c0b761683459bad6b4b64e5ba2b72f5140a2594e18ef399d9b5770ee082dd44c8ff1b750b7236d94fd55086bbd8466cf56a86e9b8a8a96fb23d6a820dc71c7387e0cad9d4afa364c973e229abce9162230a3e502f0870e47213486a5f720b76cd530c8b7b6861fe6cb9b244f658d483116ba47e9138da969dd988fe521e3accfdc849206c2702f4be19197f4821904e450151ababc4570499f2b4d492162af4bdb3192f338606e61214a02f0d934502325dde9dcb1566acfaf144737c144c7c7195e50e4defde511d2eeedab338736d6df3a39b7bb6aa0e4547c0518c732fd2cdf3455427ef09b443ea4e08d57b9bde5c45394b3a126186ed88b1055fcd3586075db2876dee098e0ab9564fe0f73ed381d5181382d34dc568168ef5428d0e04c237a51e6c776e5ce62e90066215dcfb8315b89ae253cf485983c2a7f13d09dd8313a59fc005a89f7abc73d2d561e6a4b4a9a327d52e566e2642e4a3d847c98ede642c71f53338c42cd57a2bb765fc7daae36070d7cd83c542f67d6f5457cd8718bbb23b686aaf79612c3b77849c7ec4ea6568dc76abd7ec53f0f56111c77654e68ccf62b6266d1ddc03004cd96ffe38d7a224e11e63b321cde4d52f8d215486ac59ec6e5af1022fe20c8122027aeb48172c3d154b6fa6241524953122fff88afea581e4c354ff3e17ab368dac27d6510d6619ef9a3a3151be32ce0c7fadd2d031e2383c8bbcc4b6e16198e6430140024ed233e6675de5494db1e827ffd564050ab277fc10b2e328d3b210d24391a8ca400323805f45226938046c0a2fe13c77dd78b999feb1eb02633f36c84a438127857b6143de8a893011ccd2298c6bccd72eb785aca2444ce2144b833eb3b1599883ad65b751887a3c4f5da30c91df857172e1548ab7e479366b798ebc1c45a29bcf1ba94174d985fc55396739eca6f6f54ea8beda8c0d008ddd4ba1b6d08aecafcc38b478a4f83ceec8029727d97ca1c116501d12ab486336fe2474b59cfba8530fa71fc36e6eff822c3bab5cf4ab16736e9a07a9a20121e022b6603ece1256140dc933c83da84e64d6371c5fdaccb56abbc8f725ecd1bd17ff540cc8e05986714b21a8ed9f2eb9f56a977296d85c1f45826f741e0834a52cf89fd2da705bb9e94c32d7ba0f7cc2b26ddf469899d3a462571006d860947abd82fc4af9fa7350ea959f58a40b2ce93a4470f0eb8bbdf56fbe3d180ba29b9e4842ebdd8dfb4afbf39ba9a4321e89adeb72ef19f61a9582bc0c69302e3a94803bad01133cdf3d0ba2d2f432eab64d81449dcc2a4ee2d4ccd5e606d7968529d12625be845d22e41066e0018d447ed2f3e4197a9a6c6106445bbfa886fb3ec601863186998572ba9abe37542bc5b4a476386a8ce2c5119479ac1db0c6b2b3f391ea74fbdb3c2b3b1b273d6e96e5144c98b02575abef7129dd4564d20f63812ce2b15480b1e7c8e0122086a34738fa35dbe9ceb75e420c110fc6496ec97422fca47954a7c62ee844003897a4c527f2faa053cae462734f04618d2ff99d6b15cd37a0f9e38067f5d165ddd4e599387af5967cae6f60e9b65e73388d04f3bee6291cd6b8d669296e02d39ee2e82bf11ed11ed2fdcac22bde99c526e51354f5f09ae47915d2f8e9dd72a9ea362ef5d84af7b9e51d891e903430d7f6cca74996d18cff16a56ba83fb08b895e431c9f548be3f821921cdedd33de1c16a8233a180599ed1dcc230f9183b7d2599e5380fc5e204a16f0187b6969dc02150c29bf00192c3f2d0e7b8765c3a2156aac4633463e272043cbee8cab52c54a506d2d40d568ce6592f0f7b842fcc4d30001773eb8a8832b266a117b396b2425774fa0580e90fae10df80a0aaf9b8a9bc81258fbda29aecb3d7f23cf9a3f7353f838257d221e3c31eca82507122c7dc011638e03113e1471075f9812243c2d36419b1f18a65cfce8bd65fb35f12c18f07a8968ecf4525ecd02afe0cb8dddcc4ce1fd0fb301f9c775fed5df0fe316e69d71d88c01fa02e83fbdd480543db0eb1857e279f4db61265a3f6c630d6e89513785f569eaa8dc3b39a76209549a41e42921cfe036892f9415fd9e09a6d9d0034f2544851f772ae24b3dccee454a0d41efce39d4f091b19b2997ef4574db975754ee6a6018eb8b57f51f99a19eb37faeecbba4bacb8b93a615bcd498efea5bd7e93fcb7d5f8c8a16c79b4cb5c97d1565907885242fed423f5acae296806c8a0f6c97dc4f6bc08399235f5abd7ded6b208b937f83862d49d179509da0def89e585f953158c62e2479a8ca480af4baed4a2e9ae86b66d21706f1cc6a5a4415256d42a65f2be73bd912b87aa930f63c184d09dd543e6a52364a44ccdd255828ab98b649ba3b47601e1ee2ced2c1db0788c3adf9479ee9442405f2a06a94a3c98d752afdd6f97f315fd8b85569301b939b387b6d36ef6c2e7ce47c05972a8f6e678cf1413a08f7263ada99acd0fe4066dc0602b7a6c27b678d40515af749a39db63ad9a257cc37c52bbf0713be9ee207d7c6c4471b9a8f85f1b4031eef8468cdf62924afb4c5c984aed0a14866a468ecfaf540ba09da210026ba11d0046d4775a3b272a7e57814fb30d9c8b98d715d8cd20bf88f0623d87cb8cd0e0cba66d82b4b7134594e75b28f6e151dc577b8287de9956c2474ea0e32145748239603936569efea0264212ab7932ce11ad9db62269e0c1c18fabf4af6b5f350c31bb5f1aa6b892451db1cd60a5c7be328184d831d8bfa78daebf607013a3bd859a0007b70dcd743b5f7cb4d0e26ac745ba79113c92fbb02f8ed30db080d6b1f55e785b93f4a44f8ad6ebf08299e1915442c489ccff5f85ae152e23f61ac3bc6464688038c106c93b6846a9fe30f5c56600ad676887b2ce122d1ac9cb493184db941ba12edebb8a54ffd406cd116e0b84dc7cd49992bb3263bddd27b675e7b161d6d8e4fbb18b3be082de3076a2140ab5be78f7e688435aaaacc0663f06aeecff12e67129a43e84e4d9ac4f814daf6b018eeaf9d7d112eeefe40baeee644eddbc308e71401d9b0c6aec868a777906d570341a01f4d5f095384c06264cf78f2ba018180cc6866b7c79a3b409df8de2f10b995038c6fda5f78fccf9f7e028397eb3b3cc694546767b1ae67df541f30b67d9a3d4c5d4aff8bdfb4c2b48325d1380fee7f1b144c584b2549d2b76251249dee23bedd1a654b38f85b4e542cbffe6d7889dd10b4c6b5dc92fb004b3145264ff2f4ae584c5559c1433ec6f0d32777a2b59beb2a0e4a0c867b30751d5961b2371c7b60205b8187cf50fdd11d0ef2c97257a30dd9894cc8f34e98a590331d54fdcb3698d7d07071ada216d13b48b85056cf2dd9a1ae45778dad82266666fe8b0eaf949cd133b8940697085bce08dec8ba9c9ab314e5da94cfe88b5be26d7bd0e41a3400cf0db05b44d040e557c7dc8f3840884e95d862ad24b022caa6af1ba3189b835903b6fe53f2ce5ee26b2e48003a4b64f0b6fe743d4664d70725a4648e16b410fa31d8090a9af1c0f77a8497e84b2dbf4dfab095a18fa71685e1f5dd0e58e45b88bbe956eba7daf57908634293d55805aad3a73d968ad77fbb6e1beb8069ccc17904536e73a3fa9b0b8752de9f836ab6bbd44ad268a276613c1c7f2690c3adf14fcdbeb63f09c0f01399dbd267bfd670e56f040ab46114697c8fa804cbf12849715a73d4aa53deb3259256b488f51b92bc266b3ce6613206e13a2f0c8e6ccc58825d2b30421c9442a6135c0b7fcdaabab47cf8ef9b0d4fb82eae5cb444b10aacf7283d6f92ce923d399f743dc8a4144742e535a93eefddfba95ee982ab4843a5545e32c928e458f1448917c1d012e8c6fbf199e04e635d4fe5be3dfe1ead37d00e51a3f350e8490d5b72bf3e328488c84414ae2b36125e33686ed29d1b5a37bb99c4f974b764e2efe2fee3197c8384b9cfe0daf0a2675134a5c33fc62dc9d3d69b0aaba3d8c4d7278f601bd9fa9a5d19d3c8b8b70ffcc6d2326dee3fc2968caf66a54327119266329548d1f659338277144eb014db2d2f7a72b15630762ac2a4a12758751e4840afa93bae04f4e9954fe5e56960a0830bbbfb50106eb5013664bf0343f44b70d6dd3faaf87c7a16f602ed1f4d40dc98ec1540ac95310bb4385e34bbae4b15869969dd0959c34566354e7e7ec42bfbd930f4c7397d2df6be48ff96d2ffd0290418d3e5e93a7fe331c3713e6676888abe8af9138900cbe279f8d749cba139e273d58a0ecd2318c01431199178ccfd15d35a909a1de8816b81c863e2183adede50401a9c17ac148877feb61c284fe009921039ef6a9ce50e702823e44b35357923f904327b2e0998f79cc532f767d7f2854c7377e1867d27af9895c4c728e44f5950b5564a215e7dfd8bc57a58bd5b4d277fdbb8254da0639aba48083e7e41cd7af7cc7c173e89b4145c3556eeb8d095e32ab144a85af53eebdda922f3bdf470034ea81864de11b7a68ea35d0bd2de4962cdb291ed16f205fda347a9995072d38cd5e6afb5789d055e838df142a3eaf400e94e24663a1d755a8b820091ee3374722df6c68ba6722996eb63b815947d1257fdf270961cddf98cf706dc6fefbcbf4da756e149d047a0da16a326172d0b20d28c3e0b1f47ca0f0f864471a5cd753089e28594829e63e7b2a5eaafa9f61bac0b048f58443348225cb9b984b6000354c1501134c8697d8a9b09a8c9606835105c1764ecb7780edfeef1d46a234fddb85e8078568db9fae5fdc24c17bcfbddfa50056d4cdb7e549450df23a67fd56ab7ebe4397e450842a67560630f12398cc6917ef6dd42cedfec0cc235de2e6940ffe40bb32070fd0b288c548c0422a9b8016ae490226fd1f7438d5b6965b143e6ecc16793c1a3d0ab089d1f05bb40b4e64776c6d7c0c53031374cfb6cc19b2dc2fb1e7859f6505bb8b332308e891ef39de53fa62c1ce5622443e6328e965e6f6bc755be541308d6aab4e63974e1ffde55771ff30bbb42d036d5c3916d487d8157ce01ba30cc3fd9f78a239a677a75ed9389a24e05006012ff897f88775c7b2c0d7b9cfc7e6657ee35af64b3c4a70399de79611796a0bf92c4bb74884b46c998035ca1f57b96038bcb9134461afc4b7bace2d6d03f00c3e84d084d31479c0b7dcfed9b15d6cfa52b5fdc2ca1d8ee900b75327e187ca51f7beedc63e3fac09345c9aaf30e0e77cf4538ec98579cf283b1ce04b140be0224d630c44340d35903888721442e9122e4820d4f01f7c5bc99072dc62af9a1ac768fa94c75b87fc9deae9ecd08f7fd55773a338013d2f1814283faf34593960876f0bed175bb4ea78720671aac0aa1840a06420c28a98ef512b0ec089bbf29aac8b1f7efcdd9de568f9676a6b7d72c332f5ecf5fdabc1c8c7c16479297cccb07ce3bdb13e8948d6b6a7953ddb6de0be739ac220784bb28cbf10cb41dc45d08a40a06deda406bfa6aba31754c239fbf14bb86e07fc1072218143ca8069be04103fe9b79bf7fd0a3b8d167515e889cc440477791450a208715580ea9f998e722bc3e72421ff152f7fa42738ea150359a0e5fe6aae3eaa7f6383efb104345e22c112c13be884f738593affe73a1052aceb3576c93c8cd0dcde52baa91802d51abb75a084584e4a2cb095c50a6ca21ccd0f3d061f2803bb29cc0c065a43ca9c640234ac88d924b7146efea22aea930ac2f245d7f2d96b146e14f7fe4bee565a087d970cced4d0e6f77abdbece1babc3957e9411cdb78c82b19e5bc7047f6cb80c13e6e9dfaf187eddbc1a407e67b1f04e9974db352a2daefc52828c0d60d55e7aae686a41d4c528cf1c5d50c2366f38f32d2b5db49a183f5618b373eff759f3593566b87ea99f8bd382cd1823f0ab448e2102c0d16f13dec8d835a431aebf20b28f28fa1e986d50f4d6b3bd28fd2ebb265d412c1511e733587a51485becd18c8ca6f659a708f91e3700576a5ac6c046c4c930c806e95ce510e64f87f51855dfef6118fda361099ea6e801453fb1288d6f4d17bd2e5d399df8047788889c14c3e4a8d50d990a66774877f976612730372fd13d3215d6480217bd10749bdfd6de716377b2126dd8522593862648919eed0c3deb5041bd4fbd75f76472b74962d8a17a441395f126d74625f27d7a553b560f79693f3c7817751a9bb9ab6342825a79d68559aafe1aadb21683a281ddcf1b3f6dff268e7168d30f9258472732fc0c035d81abd9fc7a7d714c82bee58f22e3a502f52dbd0e097f5bc2896d8b81999546f88232ab530fee8cb137f82cd5fb57471e927e53b9c420061594451897219e4a90ce15a76ca1a90a2ce979e016241e2faa1f3ed8d95f5e1972c0f855dd5cce180bae7d56adf855f3a4e16888b963e1658fe498d2d5a3e39bc056aecbb912ceb7536a923e7fdb9b500368eead288148efb329b2cb17585494e99e8e00940a452f4e4a7be94b13232830c433d6ca46fad70036b44a06465c0cd4e0c17ed70ddc89e69661df77699483133d5e8b0779a0255d52c7d80a34a10c69646fcde8e33bcc02956ba66da29769941d985547e4e1dfb1c713fc8beccb9b9071be73315409008990c2c89389d3e39baa08baf24d660fe6dbbf3ef13483c23151d9fa1828ee2d65cf8dcd53e5f1f8102ed744707dd7bce3d7f326a5d57188344ae6ea0726945c7d9af53b147d98b1dbef2c7b2a3cdbef9003d93d0d973cf581a50ec96517a095b939229c3d1a7114e43630e686511aafd5a6960a92418c1101aa78219ac3bdde01f33b773884232c144a0a0ded863d049a0955159c9d0be59aa04d790ef291413d1269556c8357fe5175e378c8a1ecf6c7753ce794715f7835d1b45a296cc4c555dcd3bd41dfb59484fde3b07d6bce8e44307307e08630d2bb83d64b53f8ff72319aa2371f5fe4f5962b313c76ac8cd3f98223fdeaa427fc12ffdad4f460ea51ba93fd4b6ecd8d296d47f6a4192ccdcecfb574521992ebfd248de97d746a2c69d6110d8296ef5739f3995971d0b23a85ac108d8dd41a25ddd7742bcf3bdf6dc36e5af963ff8deb2c0e68832a02087b027ada973685027da515fec751b18657656bb7ea771271f00aa8fe9c5716f4374d1f5cb9d693139a5cc571e68c3e299059b370084435620fdba8a1cb80763f166c85de1cf46615250acf16af064b8ec0a730cd7a54d127f0a8f69a382e89b1c26992a7e71866d0c5b71a354b493e7e9055c816692f4f893a787a310ce8b711e04b300143cafb0c236c9016e1dd81c1a76d6592fc5b155096541cad6f3768291b1b463258938d90e73118009a487a1faff6ee8a5c628d44ab43c45888a204bf18e0bb834dfa8425b80c9a3d9e1493604df94b46b0cc1e2c224d5a7880b1f39c82a2793c4b8848933e07ff1314c8334b2b7d640e211f2fd2a27ac6567eec9e88ff6a67a579c341a222292dcb24edc1aaf18a212ad7e52afcd4d3f03aabdc6b4a373f6d060035d7190c7a0dacf80aa74347286ae1f9a576735f5fc06b2f08c3acd42973a6076673c2a3038700b5a74cded360277db0e87bffed271f3331f80f747b3061ceb7dd7b6390cb840d864d1845403940442335a1672331f3d8d935b56bd65d1fc6382259c57bdaea1d9182733f34bc9d7f7b145075ab8726a350461f598db796d6b1bd73b00a39a376fed1c59357f02675df0df0ef2d319edcbeb3b3064846ac464a3733ece8ef9560f6bf760a53ddc47078a9e99e503545cb4b05db39ae134a5d2d160040bb04aa25a1d6ee6ccd8b5db66d6fa34abd9d01b81dc3febc672559647fe541752c81c80c269d96817003da90e7e887bb1c71bcea5f7583551c85bfa36b296053e26dd95cad9cd410e14c24460e9afbb814b75daa37a4d4cd75396662166cc4a286d0c45e605c11e3cb6e2120090f680b4d79cc40cdd758eb194b34e9ab35d52abfb3715a6564b6c0d472bb6601cf377a70bef1f44a967779b1c2137f500dfbb3361dc897e43c2970a45fd95f1d60cece258fb40dd669993de4a7ea6e2d7b9e049216b15f066dd4bbe43d6354864c97ce13f3fdd598d926015b01a0fc6c0726e67ca614f8f27e1e683c14408d631bf844e3f2b492b96d868bbdd81f723239fb219cd6d9abd1f76e4153ed5a52dd535bf63c94c18d60ae22a3b3354e18aa9a857d99ade8c0cb612e0cd2cf98eb1c7e27aec7e20c0eb6226013e51f1535f9b12dc21c33297f0743c59260c3e29f4723c4322ce37d5de353a9a2fa9e5c124a0659b7cc718530ae259b9ba6d020b887cb9a4a129ffdc10ec966179bba0bf8c3227225526ee21ae78f18ef4cfe3a7c03fd11c0211f7284600afd3b6f7c0b2d8c8ce1d455332a86db0aa455f9551934e441915b026ac6ec00a0d8d61feb42f9cecc0d8c7ec643bcb21da79655dea327511f82e25d88df4216135db0520f99a6b16b5d15753117049351897a09a0c19f73204c1ed982a7cdcce9f690b1f1f87b5cf03b36e17c8ca6a62db2c9bda35ce271cb57d71f5f04d748ac0a3fe39848bff8e30eb96aad8ce915398a4b18f05a3974a90bd4d727e0a6b2e30086910c6fbbaccd3d64b9cefe1705fd7ac8c38ea5eca440d1dfa8e322833317422b635657b7a135320076e6c976a002e80766852343281b0fbe3a9ab2b6f3cf37f6007de6fafea3545449fed74f0ecf3dd1a8debe8629bf2e3a36547887199347b1118906ceec9f0b2ad81d0fe977ece2ee31a05cfcceb6971b44195b3ecdebda223d839e7993b2bf48ce4b598e02e23d26aad3e7ee4087b1290bf24622396058132d7296441a63d877d1909d84d738b841bb8046a4a6bae32c34e61e7c82792a4a895ed677aa3bbe7f89f5c3141f76ba060bae616629d797eb66fecc94d3bfb68ff850455a6ac1da28a081b4860225aa3e4365207cf167342f4a4138b252b965ac224ecd35837d923abb3d5622a7ccf2b10aad6b2d25f222c088b74a1e27ef9f67b063554f1cf74f7c852f923037f3f927098f2ac3eefec866c768eb1f7be9cd8a4a94c6f15eb87ab7a36151f7d9222768e8124584731590e9af5d01ff763055db97eb0663714779b3c0db79c0b6e2e43b4e3fa4b9ddbee110e99d75043f4ba123406ffeed7c2cb63882a3f3d3f5ba986ae31c30a9538223a41d303077ffc21729ec2896d7a7f0970e91c3a878c033abbb50b4cf9efee7bf6ef21f19a0dd1e21b7441fb7681c1a86fc96437ff73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72dbfdac058e1c358dbbb4db12df74ddf5d71f8cefb91ed3536d776c642b70aa8fda81726d178ffa9dce260e34e62994e13488ad5b30c9bd076e1ff36cb8c3a0eea77e027b901a009ec19822b710b6d670b99ecaa3d4e31f0690f5b7039f3f4133e55be2bd727af6255883af05c99d0128c8da7b76100ba7c588a11da5493429e3f69389af48f339b5d59109bd8b5cb37e04c4263e9ca3b5c8b79a9dee3152b9837dcd6ddd8e4349c4db18c92ad0764be4dfd45159b53be784a05abe3b020b8e76cd5205a4bccbb4d6dbb373ea336a58f1cc9383741444ab8dd56a051815def74277d9f7a15efce96049c980782eb969295d7a430a144e8048b93108f1f74da27affbdaa5fdf7785f5c7f385611cd3eb0ff50116884fc9f449ee58107520c81e84e785944cd89be90bb8a9d911985a5cfa45b0547b11377605c737d20e1cdeaa04a1ca5bd4b50aa116ae5512262bad3d8ca210a35f23278400e668b4296611f35ec0e457a40f143cab1b9dc6fb415d1b4bac9a79a0d01abccfbe534d5376d28917c77c1e1731791a3d72ec4e2d73ea649bc7c65decb2717ed6d19fe418d9c0b9a427ea25cae689d85266b93e192dc5a811762ca69f44dc489aa2973ef6093d23a854c6f52b78c6e56e499d0d6af97f64315a260a3501abb89fb3e1b4578fd85588f08b02b572c0c005adf0428f4198076fc65aff5a63703d6a8807dac9c802adca6dbee4e56f08069d066b63f2a07030415d23ec5c04ba456f916218d96c4cbad13edaf257c7fd17b8d556e83190c84d4a812957c64ffa7f336298f4e2c726fb51e657e179182071cdbd5b55c88ce0dcefd4c3c835bfb1394a6e0505927321fdb0e6ce08c5ca02b36000e113240f5a5da5ba9bc406de6f0219264eb144eabe2072d295feca68244b045270d6d0a2a55e00c519b1d6169478142dce8e96b86c021c1c582a037cf5a72f2492e75ac1524c8566b6481012b1f9efe71d03f446ac1121367d10ed73076644f9bfeb2ee5d1a7a821f9cd413d5805f0e4b297da300eec06b38d59f4e4d9e6ea446048d9aaa3fdfd797cd7d600e72acb9917e0d4ef04e14116015bb63cddd783871c86c76a69cdd9ff87ee6b07ffe6d496c54560de1e9f64c061acbe059386a5445d3b84cf7385d206d3876cbcf2b8a040335c0aa7cc84f65526a358b98b92c40eaacdae2451b48a41b829578a702ec337fa8b3eb68f205a46d8f632c3367a64487db3800394e84712de4ab81af89791d0736979a4d6f02517f11bb8dd14ac1a844e93c707ad8fbcfc9e620ac8eca1a0cc465d47dd5482cb4af76a7751b6b63b34a5d4df9b1c1930818115dc2edcdb846ddc0d25da6846d1526488eabb8d175aec1bfd2628612366341ecc88a739839147bccfa01682bacbb0c0ed8f85184e0e1d1983574a0d2cb276c00cacec93587bec613b233c446d1ef8851ec248e8d8a94a06eddf7a8093a9dc3d3cc5496ac888ce51c63b961dcc3f9c29834f716f35d0f59cc32b345bf6b0d6bef34e5830326c6016f765ce9f56c21e36b173992be409922379c6f20fd45be8fdc6b49384447b3419551e40199b3af1352fdb1a9f71a7c233983f5e1cab2fa5520da485c77d59cce155e1953d180ea79d64e2804a5d5fe86594f0b2f2f9a07e545e8aa97a2b7c9cf7704c387a4bb1b3e7e73664bd058687020687ab233e32e68d3fc3693cfd5826d44aaa9451b4d8a89d3d23325808b020b14370913de76b7065080b5f505170fd003ba94343d1c7f835cd4573abe56137fbf2282fa383beae646dbf0684d65b71f3c9b4cfc12114254a1e1993391a1e5f4a992ab0e4a1a0f313c75ac92aea7c48377b59946a2141a232a62c2b80254be9158f04ef81bfc6d0ebbb6b41b30c57c233d7043baf60e511880bd9a701857e77e56a23160b3c74da64a06cfacdba72828153411ff15e52d5d2a5ce904db92a8e42b121dec1b65f72171cdc4edb8360fb98869ccbe0783f717b0a5771b53ee48eb5da6d9475abcb3a6b8735c85ce587bff1d773c9ed5cef6719b020c5e895111ba76c82f1778b6c95da8605f1d25f6b2215cc6294886b0749171da6f7584a5497afedfe5057e3a806fc8fc955cc6f9fd48cdbe5b632210b79fbd9569074cd039527b53c4b8732f2204a0b0c5ebb847a49cf9c89998b2d508c4049ac2bceabc296b778b94d95f7ff543b9e2b97103caef44674aad8f3ce9af27d053423e654f60ec79f11d0f4b1142559afc3797b06826699fae5defcb33f4f2a827b032c57328fe0aec26033ecd5062cb640805c60b90322a5a7260649b1f4a157ed643130fc7c9b1e4795c409b6991d584f4624d9a76c88fb8b48c110977599ec17a17560a8674f641dcc35963d30a3fc2c2564efd2052562eea18d9654547cb566556964ead28616c18e0920dd7f691883c8bcf1cd6f90826deafc597d13c24a65fa9dbc2840c7bcbf55af281bd7d543d28a6dbdfe0e52c0756f7db88635f321930b82e4e5349cbc73ada81a8cdc60f484f52772e853d4a391b98251e43d87c189f2a96da6106d9c9b10748684ffa4a137935adf10f2aea24f53bab42b9d08a0975a71c4ef76c2e37208a4eaa8a408e056df78410c4d39530ab8874dd0c6fe5557ad9c7925da3517a500a9c57c7c16186f5410573ed61d2c5072688d585dc146576659f8fdbd2cafb093038554ea44efed7bb3602d1fb2a4bcfbeef146c409fa031f6ac2bb921222112a42c8e6712dad5dc0c21a6baca242accf7b18009c20f6d7232f74f3eb9e053350d80e85a338f74ccdcce45eef548cac67ad703a38beb3603c187e4b3c28cfb38133a4d6e2ef4416fd543c8b6a51e9385ee698483c2bb62aa4c64d06063af80e45f64a4ec2c91a58d9d8a185a022feed0fc6deaf2900859307b97fd8dc5d04a019905d51c54ef09eddcab1b22330241704ced1f361d58825df52751821077c1576926c746cf95d3583bacbb56611ff52e85f00a97903647f8631cb6866b2c4dad75ce64b2c40b6d966197df3db30f73d04f7f935f11270fcb6c7f13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb4092 MD = 97dd0fa2b0afe26af1ee630a4b1b0f7c075753a79e1f7303c0577d869d23f117c4a8611e845cc4065f6a85b9a2e0a684883236d6fa65cd772363f1a26ee85bdc Len = 83392 Msg = 40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488e243bfa0715495445381d85f9c1ddff8009d9b4f964c7b29dc408e68fc8ce8de4db746631d6df525ae75ef407ee3488fcb8fc8c157c5daaf693ea4ec144f789ebb616b8dd5a1437aeef997b2ee3e31e39eabb72d688e8b7c5f41ef167f5c6d7035297646225849ea1cf416dd7596639c80d9b0bc520d5639c630b50cc41a8efbc2f7aeb58afacd1e3e50b5e89a53a7637a01fa969cac058ea6f23ff66bf0a5e86ab35c0397ef98be5ff4bcfbe6ddc3e0930bdee2ced25e220871d5fdfc4878de3545c857d1a0727184c87340e09d7fbad3dfa4c971e62b9ef394bf490089d1862c953adabf7322dfb7b421dc10f9a599426594720c5232a970434401ff1a7688568cfab4e9d172b1ffa010fafe5afb27e986f505277d3cec8666ad4d7f652f8bbc104f0cd723288f657486c033294b09cf2811ac4acf100f3de642560ad1c637640a830a12cf0d20ef18cc5636cc5beafc342e8dfeb078b99da94b4427c601365863dcd8213fe90da7742ae58fadf370799395d0ca883a92af98103f5facaa2da001a39b8cd984fd9571e795c732dd434d2b8e9e37bf1f437a9bd96e38ec87c742ce1f7edc07a599c0f54d8d65c5e00c80e6601fccbdef74069bedf93cec61aa48b19aa69830168930e9a2f6f1cdc3731bab557a11eb72cc5c7e9509f315ff7eb9915a3e48bb9d74ed362ff7f3b24f1f2561b3d88eaf6ff4832e19c6e4cf2bec9e58a86c7412030300c23cb9f4db4cb9a6f2c360cc72b0948391c1579783ab9bfeedcc58a59c0fdd707711647cb282e8a745cd3b529dfb536591d4e494974835e1380e2c62c18baa453cf51f119eb8552e421990a89619d930159c976475ca5f5021b60d34e93d1487f832123d07b8a846d1ee8857c7d2cfec045f968e83f9c351900b25a27cefc13f950e6687554888f4da964be696eddda24866099a2b9d09ef6d569c34e2675975fad24377f1319d42455700dd6d34aa59c8f91910d47dd92fa0df9a72846e852f0fc5d096413a9037fa7acfc5b36ddf196c60ed79e562d91b11ee46e5c8cbed77bc31366bae2d09dbe246e124d06123ea1ce2af5dc814b4baa9cbc81417483854e95c9c7fa1d1af37e3055e852cd81fd5c0c88442e45b10144ebe4987daab0ecf7e8f2b5880ed2b52e6fd6e6d2f9a7be1405b96b2a1ff9632e90ef1c777bd19ee63120b80b44a2435d4783766416ede1784e00d3467c7ed1b6304e75b5846febb812d637fa6b043e693bce4f7ca1df07d75a211519e7cbdd7a2e854cbe30e683ebe285bdbbde6306f0d119ba932705a1ef9e8c88faee6b06f90025fa082dcfd7e034a1d1e60b692d728c18402e12cc4fff9f95d7900cd6cea149931619c79658339ddcecff9e61227ce13c98c3f1cd52a5e1ef694faf9995015f6f19698ae495546279977ef3f5766e64e8fcfb50736a60e9fbc6a0532e0aa7d62c8c8e04151fd1471a49daa890a9c58bb0152a9b48f7bf3c4d6828a3fe9ff3323de7edbfa2482890217c9928cd2d20ca2449d84ec87b2f4d56c64efe95b571f815a40f1a36bec8f241b840f0f580fe94b8338af77c651f819a8999ef8deba29c664968a02cd430d1dd85489dc435bd9fde4ac901df563e9d9b0a8fd341c31393826090ee1f390ea3675c468b93cbec4018f7f91a6bcedae5dac197664bac33721c520e50684db10b71a59146feb4190a0ad3c19d9c2f92fedc5756f5263790bc76c647839292a66e8f19df5c6f7eb261f66688f7fb08e54d1224252c4bd599d73415b2d448a87d4101f17738509c56ec9e18d5d602db50550ed0b8683706ed56c6c8f6dee4ef94279cf4ff776c8d550e54732ea44e2752ab34b55735725bd9cfc1688a1fe1e89986927cee75fdd25b5babfe09ef376d6ab4366aa81078450d86967cc2f3da13dbe294f1bad09efbd8391721ee13492e070456691185d342e73fc86e58173801f9d0170beaf3ca7a3a4b288741bd1de9c61047393a01fde5f53fd9c5bfd6762371b38b24057bfade1fe65286ab490011167c7b337811629ec62b4d0b40de3f08b21183c280c5ca87f7bf27a89143aa44768d55105230abedc86684b7a18add22698e737fe35d9408302a0a758a4976e474d777385efc34437a9633434868eaf0d66eeca4b3cff1ef77ab9d760ca6e0818fff542404b086405b2ebb46bbe4e2f4a75751e958896eae2cd833127ef8819c26597e5bda0a2c64f8949f3a62ab5fbe3abc45a6781664b4de247de377cae4a4e66a58484575a111d16c5186d318bbbe3f222a7468f36ea3fa14c0618d7a643c3ec66491ed6f6ed7541a64c483b97164f31d92dbc1ad06fc0f2dccf506a38ab29de235a12873e0461f236b6c0b0a2b531502f13508afa81d8bd3d64699c2e2b892324dfe8d1fcfbe811bb7f5cf9744090366d828b477dc890eab8ebebd44f6aeaa5b101291bf67d12867ecea57cd55e75cddaa1f3b921eeef61958d5c7c6211544b12e75ccff530e839c7cc22a28db7e7fcc0991249ad98fe0b1c7146fb30c7cffd8ebb0954c1bc7112dea05bd363f4eeab6591705deb70c4ce95c030b9813564a36ea2b81222cab6fa0a74d87821bd92c212b2935fa11e499347a1a31e1c021a26fbc6f271e002bdd7946d22f78db9dc2a0f2405b5984a95437b3d2692cbd7fa6c7a4f3ed9c20b9093c4b5c0ba7091d3c9a40e4ec9989bb1c479bb417d545c0a5e366525b2928e3714e2743a2791ed80881998f40169b9a40089447c47803854e4762e2e641632b84436d119a8ba73e94fb5ec81c7d24d76ddf30060581714e0e781d5e15717a01d0908f5e3a4b1ce1807c22f7d829cff2f45fe167418e197b44da080c6f35c7f6e4d9f0823833fa41596868c6e998f76d81ff3af40f0a66ada001b5866a1af78b1f744315eac2c9ee6e64a29de76735b79531af24d462d345ae63a8448c7d633f0ef3f981e89406395de552e5480105518c8bb0822833f9e3ae9452cf4cf9a57321dd866ea81439c2a65f1c4591f2e0dbf681e184810a45084f0837af31fc38c806957c34bfcfcf0ab65641374bb942a751a8b4b455324f140e23d94cc21197ce1bb03d6c862340822c5f7422dbc0b5543c649c9a3b6862974a9bba2073b64cd5dfb25c8e91cb38b966df2790c8b5b362f54a1b9e9a094a22a2c45cd2dd76b27fc1105c03690412210449de29a8e4c7444addb43a07914016953233cc55cf733c7e5ebe73827a67597343fa25e2ea5b887b73f914fa8cff13a069c195732d098c55f1f657649a92b332522e4e0d330a9025b14c87e978d18a32df9896bc1befffe68e861785f14ececfd8ccea9e6b3f0bc82a413b6ad161eafb083b68a7089107be69003c7cfad62cba5c68840cdf734bd1235987d5231ac63777fc83ba9f87243c35d75ea033d33d705183b2df2c41e0ef5107f5eeea86ac96b38e707d4d4ce5ee598dc69618b071905c90ff9bbe256b6117df1dee941ffe872f5397557e5cbd5368863cd536187978e232b2b921883bd50c31687acc514c875fde90d9bf312af9c772f9d40855a5b866cb84bde2f4d2c982c15e09dfb50725d991d5708c64af401ab6b6190c0296dd7eddde207f05e0ad3fe167125ad5ced1011fedc07251cad4c6d3da2aada9cd367eec37775205b5fe88243c3ada1df4178adb323feda30e16505cde6f89b5a9720b791928f8aef33bf00c25d9ba082777cb564b456ab2d9834bb44b8e1cb0cc1e88f70bbbff5c08f40c0bbc75872ed9603703b187861bcdaa0d7ca9dcd315957a9c0887b6d28767a5309578a4ddfc7a6f7275dd6cac484b093a0861f2496ea634a900059ffecbafde025bd2de1afb8b03f22f576b69b2e21f55fa1c54fc266ecb34801dede09341fcf5a17387ba96abac3a92981a3b06136ac5d4317b47d76fbcc2fb29072478be808f18a34859782cf6b04217ef9c9c6f6a1df929ebc8fc2977d8f3cfa236e6760733140a8663fabf41f7a06f51faf0469bc30b9e1cfbff1c8aeaec6a15a457290f964611c86698b33c754006e7f2ac497e697de6956d6ac9647d6790f7d95517f80d014184ddfca934bdb36728001ae89055b2abcb79d9a0a304d7dcbf626af35f1bf82252368111d9354d1888afe694602c5c4645cd9642b515bf95d2bc032bb3577d3ca70cb08d7870af83905e79ed6c61dd4e9ab55b102924a154e862b821832412e909cd156cb1044d40c5985f44238ab84d10ed82a95dc60fb246d2e4854d264bbfe0f42a30114498d89efa014913fb6faa6ec2977ee15e7d06a4a932c78fc2aa49c31e6997f7c624a382d00a5cbc5885eefad113f152725bfa58420d58b98d90ef26b84de4f31d733a27c6c50f9b167d935b8582a10f863ed5f839eec958dba238923e61a791af0724e45adbd21eb9c93ff77c6e2e972e8851fafd4189fc5150be8c2d2f6031ef52cc4ee8b934e5a6eb3d551220ca87cfead6e708c02af2732ee97b11119f7272d8c8de1ce7b85e827613fae365353fdeb8dd32e8c52d09b58f31f576b2d5c1ce1b730843e1cd07c0ec7c6f6c85cf4dff84fd6519daf0709d042071ba7d73be459d83541a31f36fe6a0af192a1d292096d18ff4187c15e59e304d7678fc19b69dd15257fc42bc057845549e8895b36639213d7661231dc73d66118a2e9938492b59687a56ae9746da4ce5561489fe7d5ae65e52906a78940f48051337ef4ff472884e31d5d005c29119d9d65a548ad470b39b1f02aca6ea6848a0a84168d12707f07c24e6519807315eba95d69fb90a1efb5c4244743928ecda6cbfc7906c8f60346aaa04adce634f6e002af5c6299cba301a52e25b9fee118fd1d036e0626bff96a267bd3f09852fda32fc54625cfad6f46dc748cd5b885adb78701be3536b4ac9abb47cafe9eb7725db806efec3b309aacf260443fca64d4fb925e313dffbd63fff36cf5adfe499d3526d91f5ee33a6e5a6e59149e3b65d5f1c4838fc389c365c155521ca6c2f2c554ffa89d23d1b43179d8c6c69b146ff7c2a8d6a072ddacfb0769620991f29934e1ceda32e40d872c30b91120dd5c6c8496c3c02cef02626df9b80283159426300518d7a6499d99a7a898a1eb0d1b43c2949faafae500cb03c1c99b51dab28002e86706c1f98bd4ea08fddeeed25adcfae5c3fad3fae0d1058424963c895391f2b142d14a9ddf1f3c797030f3d5201f73b0b71a7fd6a95bba6d52590cca80404789329f0bdc9f61e7237affc0bd75f4771e0470c62263506ba1da4e894440754b97bed9ca5fd584312da2b31f3361434c5731667086169a604b44dc7aa09b1844046ee550cd886f63c071b4d5dfedf43b82c66244a9cb20e191196aa98599127bf7ca2c65cfc10ac4036e6bad6820ef8cc84bce0b348aca369be062dc9c434938995b16d00d873d9e1f213e6e77031c875049118dce5980a692212bdc8da0a6c311a80c5b2ee2f0373b1296dfb39c63744348939220422a7a9e652d71ffb81163883974ccdbda0bd980cadccac5f5ad9ac8cebce2d24cb0fbe632d0629a9473612697b7ecbb7876ca16d076f55416e0420865f4448b7ffa6e93137c79073bb20512493e8377c31a5224acce280905e6b42a94a382f3e4f11ecc8d997ceeb5b89775d77059b6c4ddbbd2e74a2d8ccca53857e43162b3827b52ba2a8f34f60b6b5f76cab4352181a84b4a0854cb84730716b7db06ad736281518571c669c844b5a53ea974e15f04644cb19753c99900f39571038a2ada8aec6454eaa7e30c687db0f4fc17231955f704321caff0747d50feaee426a39104a2d34f1e98696980abc9c14c05c4f77a4bbcf220cf08bdf10899950440de40d88de6a09402c587932638cd1fa58ca07d46bb1c2b1dd91b6502ae4fed42a58e0c94e56cd44ebd0fa9d8453f006142bd65d24bd6c3002a37e02685032792be23aa9e17de67e21aa9caa8384074a0b0f53bd6b24872e0c4b96a5c66da389af1a8b995c51bd428a3fcff7e58f705cb9cf10639399cbf2670480b8c98fcaac008c54260374ea38622b14f42ee8d3a48cf59cee528f73238f48ccc9e6490056ec9214ce7b59d5d665d6fc3dc42299b8011d49cc1c783547f182fb47a12becf0bfe65df128730892f1edf62359cf4b1db290a77b55d68ac63a6d6cc09eab092ff6d3803c9f430af492ba93433441603c2e1a467a934cec34d642b1b31338bd5b1df43c1f445c5581c4c7441bf81b61a9bff4a748592dc1fa31cd6a9db377a218b1b2e207bc3160b104be892c29dfc7ccf4ca3a731c0ba4ace947f7ef03ca3fdf4eba02946b34c508defae2e22de11b3c7905807960691cc3795cda3568b2ef1541541e33d608eaffbff6e1dc98d1d47ea93109c9aab892b45e6681ff76c44851462ba56491105b1c244cf689df147be9f1c746f26f9c9f15f51f9fab9260d429a9ab38a500dd9dd4a867a168854b8a250f52c8723367aa5ef9c283c8603b0af4f85d3883b9d31bbfb8c172f71fc987a64e4dfed77abc3d05c909cee454955559beac357f30935d43e204dbc3f320ecf43b235a70ca0cdf90ef5fe18de4126bae7932bff5f990faf7908c4c3dc3e42285527d8bfc85dbfa86d93f5c0383348689946b1896695e4d5160d254f2f685d0d010a6d3c9529c266e1312af03d67e6e71bcc00fcf244dfcc7bf7186520f88706b2259f275a4efeb9d29944afd42426bdd3edbe60eaef251e128e440f9735e79ccd3e1387ff129a2ca891ec06e5b430742b7094bd35dee152419a52547c69a656bb1e74646bbebf44cbe2cafb595d2d94891f291cbd5939f172e2e93db7daebbde48d68c78899948ba3548599166845a357c0268469a855820c2fb2d031d0df57b05297b73ded428899aec6e5051d9f2bfc1c32fe21125e8d77495517d095aaaf8837ab3c7200f0c313ba34e90ec364b3e0fbf691cde07c9b1af8791a7d70734ad202495e0f1cc7c57a3e78ac1aa3bbc46b251945565bd6335f04c6e021a862b2f77c1b26fd87ef15370339360f06cde505614422a2c895ddad34e671a286a16e606dc99b22898f3bb0d12090d732c29e16781f319a72e0216d517ed5ea525506749dfbc5676ccfc04f6fd5c15870c1770633517926a0e08805233914df54a9029ad358adb476d82b7ba7ffd17c07f2f93d5883022f99bd99de72bc376bd3c3eb3cd9885af2f1d2049b3f46c929417eab24af5cd59ba69edd6006b2467519cb49c17534d40723e5d4190054b049648d15210285f9540fabdaf3a7c147e46ceaa291700424dd5537215cb2ce8ec3b946c09d17a576401c0e1a001c9144a215478014919f515bcef376cc1d5f6b7f88d23301b765554915ec25ed2ecb44965b0c6ab2a2ae6368d83f58d108ad50651959f6b3aa6d9d5641708124a51750a8885ee9d369d863eeb94351d33d60445db302921db864564ee9bfb80b491c6fc0e36784dfb0c658d4ba29e83a8221504f9ff58ea5a9f3891b5504520ce183a9c6b34fc33e3d1f4a022316a66ea0987b23265b72b544c13da4cd65d58e37f306a2413e2e58d88c425f3c3411d75f6ccdc1 MD = cc785d5ed3094ac12e2069c46e3b81fe9830ac5f7d752880ac683a7c80433c8d9b2c9bf59c8e717af3b730aecf76dba6de4d4e6d4cf9fb60f550c6eb77baf5e2 Len = 84184 Msg = 2d01188eaeb6996f1e6aa60468b7894337e18139f6fe5c4ffb5a48cdff19e79cd21ea1504c2c3e66874bb4c94b6e3d9bca52ad338ea90362af783efb49be72922d561a83d71eb037a1597ba23652a91048439d2286748a13c8a741408db447e8a8712b3036d4166ad35ca4960eacf2291a7af90ec6a71aebaeaff9a5b3448f26aa367b5e51969987871bd6aebcc4436fa6bf6800358ada71ca581031a4b672d59a6eb31510ac6117245fbaf128e2c26955dc92febd65f32d826a2bed4652177ce2e17a5d5b5d95a212f0f8673a4e979f8f972013457f8ca73facf5df8260a7a3e957793f1af35eaeb8963718db4feb99bdbaba44b621ce686ae71311412749d2179858c235b4e3c580191f0df12fe6e0450b079bf693e1f769e3308b69f02692d46bbeef94e94d6ed140594d6534affb9153b01fee1decdca668f253e303656a889a53cc20d9c33213d48de020a76f7207595cd8860717a0873e017398a830e39bebc064bfce6e97af9e62cf09d04dce11e7b4cfa7988cca762c06f36f27ac837627adbc5a0e75270b63812107f6729516c3600b371970e2dafca9d94fc703d57f16c1dedae2016a90ee92de046205527eb607941fd2ee701b74912f22d15d5e1f7fa5d125923ae7a6063c0ee75d2f8ab0885173480b2bfda15d67fdcf8de1a8be2b019d25664726b67227ba982d18c71601e8af990c5210d37ed2493e43b83ac5e37c4bc0a651af26fbfceafe1ae79017e97150f91c89321ba17b1d573b099c9a6dbee1e0997f0b606963a4036ec56e1b07975f5285f8eae08c098002bcfd57a791706a6c88fac1ca8403f28e6fd9e88a24ffe38b8dc9c08b08257b2710bcf253193aeb4cbbe959ce1385db88674c86cd0854e48c7d213c82dd7714ae7d6df505cbc36e687a755bd3e09068d79c45d04a7b3c6b3d9d2be72ed3a6557f4c39e82771b4faa80dc65041b1cd9f6457ed4f6a455f7e86340c48f7b25b4682c5475420d1b498f4bb03c07f4fe48a17df6b8a952d67284f8cefe846413deea02fc0c158b46c4f34ce5531f7827c31d87ee80934fdf96e80ebfa4d8149f555bfd4cbb537e18327508ce32d10113d9a907a8c55ad7bc05a019a550112922a83c8fa91ba2522a228303ed63b32c6d1cf251c7ef56a7061f3bae1298c5fe48581a4ea39578a3d715bbc2b55e4c567ddd881ace771d1a3874193079e74d207ae5639ecec15cefb97c7dd9d89ae31bd0cbb8a72ee524cded84d7556db43d1c24c0a7147d27a5924bd7479da9923df9003822ab5bc1f42e7fc1e46140980c6df07a63345121093808a6b792baecb35a86d3548bf78601b879cbcf08a4fb418248930662cd55fe5d6a7b3c6d8f02d9cccf0daccd64b9e3e8660305900d6662f5a77b3f44542eeb5f0bb54462986d17dc6347b9d435d5f15acef816bbdc51e73497c34c4d882456c946f57e366993f3e5ce21fa54ed52e07c1f2b70c0b45654cb83ebdbe2dbcec738b6bc384d650004957a2cfcb3edc907c8c10db26307ec122706555ca8b196c309d56a011c2d49b047e1b92f75d990fdcd6f2f4a07597bd5d3a9a05d03cc14b0d91d9f771724c98d99bf67011f1353290673f0a6222b9de65dc85d4b886db1471319bcf8e2ee1802f74da710243d781fe07a026547f0baea21ecdca6ab28f4cc44345304f3ebbd96dd3709eb09ba8858f7ebd4e5ed4b6b47dca1aefcf07077d6d907e229ce9012efd7e60fe0441d0c5ab933d8d6868e1785ca6164ccdcf682ed6e0efae5d79dc04463d5199e67c76cabb10c9e85a84b583a87c67e84d50dde866fb3fdb7a3473e5b0daec783f95c21a25bb08691c705a5cca12b5cb38d48b3285a817b2dc63ef58a31bd8a2f5d4dd3f535ca3179674f78b2830a9fe74a19d949bb11f39694d77e687cabd1ff281efc1abbd41fab1d8b4992ca0ea88ebff399610dcfe7a0a3c3415c4ad45f81ce41f2697a58b1b53e3ba0d3d292171833888c14df25d7da8764d70c28d16345d4596f87edb288165de316fc292f6c22693b19cb8bae3482944eb7cea31d8db9ceb7cbec828c134d011414825a41082bb57dcb0bafe39e577ee36c3a26334f6c11ff801dc54fe3d7ac4101ecd2718b92acd3383bc84065c78bc55cc53e9d18cb3293248242786a34d3fc97c22e3b56f5b3ddb9f2415f3b316f6711f668c59a55c51531b0769026e30c992e78c9f90ad35eeff8c5b79a8f437e3b14541147149a3df8302ede119a70aac93e97325517aa22ac5d0ca78cc27c5cc3ec54e49c381701ae9863e587455c52ef6093f3b9fdf8a3755f5d8da0752a7f93f27f4f3f754ab4bae2e6396bb804898e0d058aa22e3d35ed883ec66037fc5b2ddf49ad9b5cb3dbaf983c26395307b327bc42739838e66e7760070e565b5073f40b3aac4a4ed0caff30cc487aa6e4643ef6f12b26ae82b1a56f6cb20d8fd55e78fec8b7c6cc20172c451d1c9a3419115645982db7efa0a3fa1ec65dc025e97f4f327a5c9b652044a93da52f228b244ee0108e07e68cbec9d7e6ba6e48be0b5ac93ed60732aa6fe818830adcae0c84717ee069261d063b77d16faf6ff1c8b975898c524416fc5d55dcdda4c19748b82d854db024d5ccb55279121bdf45d68263f293859fc2eb77327876095a78b03de785b0d9609b70aace31668638cf57e48ab6fcd676c0e85be26e14bf23cce3941412a26b85f8728a6f9cd58508f8dd5e6e2910cb659b836a0a40121ca9fe5349579eaaecf15752e2ab0df78ecc5cc76e92db87dae8bd3d200e70f6d859977fcc069c22b43f428231f527450a0f55b6837d40ca9b8c90862c53834b48af22c9aac59db277bc4490f6f25b369d2e9e1b3ba1fb4173addffecd9df97804372ae153f905c29e14d7ffb0172c54aec6707605856d94f9e8d5f7b2324625817e0a27563586ebadc5673eebd80d27b54387576fbc0a2da4aa2d0148b4fbac56e06b3c3fff73961d4a9ccf08b9901857424d2fd8aa6383fa8e4fcc1f9a7c94eb1aa8706fab6e4a6310c330953037aefb2f2c6feed50c2061e1a88895575b77b4695c6463edd98115c485042fd076641786cfb7f0c0669b8160e1f758701acd4968f198bb2b47c2bbb25caa271eded042d58168bcf1055dcf786678b7893cfe2096028de3e83b97bb76a4a3198fd36bf387fc2271eb5adfa294b08d50e73482c08cf9a46ca917689b9e177f8587f6afa03a9a55de13f9a9a1425ab5b32e9403af9a517cc3e27dcde2750fafe9abab03ef59d673400f4434520dbf824cd3cdf9545aa4977828d13016a807a4c47f731117625b1b5631dd182b5379638c5b54cc455a6d54f7f0b427aeb39a0e8457e14feee072be6f2016bda3bff2e9f049cb04f9061665c1be991d2114214dc7e97828ac50c7cd196ea3ad41afc6761703932bf5da2a2a73f6e299043657d30d88aa33f64fc4c7e351e65f8baf6ea87f3d3fb9b26333137d4e3323ceb6883ea3d9e9ea4319f45f3b8e615ce83b55e1974b3326b52dabc14c090d35f7014cf14941c9c4195bd0d3a088a72dfde006c1dda2200b84960eb47edbd35803a3109b5c54cc49ff91d4c5b0b52a3b231a0bc9d0f668d08728d65d741b28027b187d9d6b7763f45c388ab5cab86d1cfe55ef5a0fac700e63728d3cca6b6dbdc3ddde57e54e234bb5dc6d147cf6d23bf6300bf2f838f81d7fffbdc2f03136e2846fdd8b583d8cc8a2d9f68235f50c209124ec45192043a6533cc29073f0f629234ad58832c9f2f399ddb15f94277d5355912a90e0f7050173964615c44f3dfa36fb60df137808450134182d0622a85cca212196ee219ee757a8b2d36f9070ce15fe0a1068dc3f358f99a57b0a6b1fa555417ba7af4483a085e08359e469212d66cf2b9cb14b0a6d8b6ae3ba2f6535b58d6e934392b445c574ea5209b13de190affb60046b58ec258b245d7ac3a5ad05d925030b470577debb0289736483148047ef21b8159a772605527d3d95a0c83edef1456f1acc7c54aed5a4176ced4c74c536fb584e641dc79071bd62e3fb2998f55fc4dfac5dd5bfe6e03c7638b0fbf6ae4f5745546a5282a30eb88b5cf933dcc2cd2bed7a5e1688f9aebd005682958e69b4c00fe5f1b7ffc385d9375f3f9952bdd5c508e321b1383d8d905654d6cb949df3b02871bea0976873a9c76942ac934ce63ac2956d2856492970d8a231e0b1b178b22f6605ced2085494ec1986f026f68ae79aff750e5b92feb927cd08875e2ad04075518b754829b544e5de910686513076029ffdb5c0b179e39443ef22028086e5aab2a4465252f2147526d55229d3834099e55bc12e1b178ace953a333749091c2017e4b4990ab7adfa90e86599f3dfe1b16e13b2ec367409373f9e5d74fad35e85efc14274b7525be69b2ea34f48c2d3f9a8b9fd939a0c095eb17fe3440c72173ca8ce628dff7ea8d9a43cadc238b891c303b323accc5be5b58953771cf461e0c4e160b74d39793f444a86e78b4a4d95be3d93a7a033c038dc25ad8b78492f45bf082c932afbfe69a70c91e31303ee7a3b84d00c0676e57d23150292de8136b07bab8698afcd6ad28268e222f1ec0799db97fcc357fc381d2ae5e72fc82324ab9b4a032a54044ae456cdfc199069458f0ed58e600d3a44b36406cfa4bda555b18e5236eab0670b29a4ca4459770214c455cbe954beb777ba6f0630a4379e664cd552763c4d3c480cfcdc5f453e5cf1d440f9a223b50a5dac9c529ea0ce64b2e7f0c955b1631a7e28bf72a17f2ec0692940dd5d5fa89973048c7a7e2cda9ee81d713569ccca7819e76d3bcf59f0e2e74de5e55f6b01eb445cafec53aae4b35257d71506e0cbebb7d396861d880d2af8bc90b04cd849763e0f8736c39d8538ae1182e6d1bfefcbb477cbf0206bdc0f29ffe1bc9a29f7d0ecb7a2d82287349547e505394eacceceac4e6de88c87f605d7824968bbc29581cccf734f04fa6b6fac5cfe6ad229b13b0bb20cfd966ee3b59dde485346449aef5ac18919ff69a21e67b3af29f0c96fb76f6d29adf2831d84f98e6efabe227090132844b766577127f6b3c7c54f0e22ba23ba345805671bfa56fd1dcd87eecf0a728e36a5ce364112d5c7b8eb316aa2b9e533bdaa637d579c52b4e54a380c0ec5254dff73bba89a758159f2fa4c51484d00643603814868d15940460f42fca8467801ef8fa300f5b685f51680f4648bda21b63e01e35ab83ff719c07b3d433404f724878818e1eb6c5023940dce26f5e7b5c426140e26de4e98cbd52c8b722a872f3067cb81cdd3fd8c6febff4deb1efc28f89eb8663f4373dab10471b20c04538ca000e8721757e077348ed3d8535f9e17ddf86d8ff670462973cf19557359e0ac1dd35d6e70efbbbd0c1d3a01e24043feeed3b1e00eed4c018ea551ca3a83b4e9e45fa8db4ce3f5da60f7805f0a59644aa5b1140acb32dbff5c27d994e41a56e2ae26394d1e0d153bddae45544e1395878d011264cdb9ac7f86b70f59e2a63d02d597bd3866a3907ddcb2076620074e321f442b82791a040e78e3616dc88fdde6f5547321a9500dfce8933529229cf4d6e70acdf87fbc9928bd2d8e64f86fcfeb77cd19ad788ad4557bd25d01c84d3fe24ec5781b2419c25ace05d4c4149e79ace7620f1036cc8a0420fffd7473a075f0e0f4c87f18ca162125fcd2ff8fc46197dec3c21e768d9585526c8515d73f4d6f38292da8c0461af84f83079bdc5a2e38a862e10cba569d559ab8825a45620cc9aed3160cbd06375cb538f11d8cc8160bdebfda8f64aff7e1545473b650c15aaccf63203f6192f1daf17f1df913a6ef8e0c4b1cfb28024bd539d0e7be7bc5bd651489caa54064e0df8ed5fcb3037ee13b9b8536f456f5ff9d95be4cd748f78baf189773d2ec047af6e7ce0bdfcea8b191270e96ff83e389b7026d21952adf6bc7462cba3cc6ea26ad96d7c9d3e7ccc72b1937eb713163709e0a6df47ca3d5d46a17aa1c67639e8a500673b533f1539865eca172fde1ee5acf184133f246833bf417a008d7449a0caac1326c744db5bbde3bdbebfa17fc9ec6b6876e9a855028f1c09f1e00dc55240a51844e298f9b98007137a4fa3606c3215f9112d9e2d511dfad07ba78bd5876fb3209e8a8295dc35917554c72dea54e4b8e0ebf44d17a9d3a376a6ca34a3c5bf9ed03aa849d84a464a8a520f87440b6c1cc50c24fe3c9118dea47a32515497982dd2222536e98d19fafb7f0ff9981930094e7da7f9c39154750200c5291382622ace5ee791f02d18696fe0b0cb0b049a4726456386d531f02e373f6c060610855b6bf4d8a217b0a95e8f7fd844c756109df36c42ed9afa52d2ec3f102e55c8698852eedfb084a036a2036370adf496fcd55efb2b753973e329c80997ea2932767b2b53e3055f8426fe7294614eb94dc5b50ef90567db250bfa74a4eb82aad715fb9d2ccee7d1e5e137841b916f3f02d306ac6eba0ba796330f9718f23eff3eaccf5080879f024acf18e2ffea58ae3d8e8fdf6331a9c650c12eda6e966651f0a5c0ed57f674193b5868344853512d875e1a50de52895fdb1f20e5adbd41c77366961cba03b03e40e4ee21feb3a1e466ab6da6ea05f39bbdb3ac5fdd51188a51591984af96999be2db73522af491fc64dd528a8c322ea280e79cf1073933c111e410ce41977955a8a5bf6fd4fd699d095c8ea4cec1839bab22b742325dda953c7145a175ee96971baa9a1f02b671eedc90ec9bb79a3aaec7cbc4fb66a5552e59677ea655833987c152cc0abe07f01865e233184fa69b055b4c8cc3abf9ebb3f02e8485e83ea94d25061cd90fd830422cb82ac29fcbedc5ef0cd7430a41e64c8a2e1fe536083012cc2c5434fe117795ba7b9b42aef27a190c736c228a658c23aece166e48c714fe402e3ac2919a0e3996944c3f8504882739e91509344d265de47933c925659e380872972cd25b3d55486905622ae76017fed698a00ee2fb25b4943c9ed5c816e9ac623219c93d4b1259649053a7854a12e3a2be8e230a55a1a788fa9461dac438b464d5327d26829750ecb4b904c48d4071b54f7c78ae7af944bd3554d081ef4ea9e2461ff6ff280db568383c478e73c82f78131117b7b356139bb5862aa7e15213434e873cb1869b1142e5857aca42d2a551d2f6070b48e09d8b41d17833e06d78efb5135823e46aeae1833ca46043885ca953d2509481be69f3a3ddc10d35c7624e436a513c8aa1cbadda09ce37be10dbe95f4efb38a619003ca1530d1d288758c8c0342fe6bf69390eb192ff39fb92aa77be120ee1fe18e8cf04db644b00d6e3c5f31bfa08cceabe6cd1823f4d413752bd38c59476d2e4ab12931ccf7f07db8aada5c5bb89f94be12f037f965bda265a21940f92df6aa4d06f18bf55a183bfd5e89eda7a538eb52bbf0d310d4c0c884a0d9c9a12040e81e04d596bff99bda94cdea6033d4dd34f2285b742ab062085abe8160b1bcd06a3621420c9d44ffdc278f785e80e5f104250e7cb5779725e44041acb0db6229931de2b3381dcab8b31e09c0230f4718cb53d4e0f1b7d780deedd0b8346eaeb1153ddfc5a3a1f96ae1f0c33e783f86b90d16f234d33c10176aabe23065ebf10b433e6ee5f9ca6f6afb48526fa8b203564bd70cc4b4a4df3e2a130ca1bfe3d79cbf68169095178b5d617d2db04ed76b850a2c8b3d206273897fbba688cce6d0e9dc736d51ffe9db96b717bbccc5402da9ca8fd3ea90f59b6dedfe5651f7556b874cc8e9b6a4e1eecb6e9092f1c66cb848ff699d79a0eeb57fe7538299d9c005d962d1021b2e60234ffa8039ebacbd99f72b524e56babe30141e63b1ccdea74e64c1345d0be71517b8dd6f1706f2c34118d0c24d0e58d4b9eed5a76a67908b93cdea6b310589513a8a99a5b0d0331e5c4282423ffd05d2a154bf87230679dd745940de44a46fa51a39b1ccadd3e81f39e8b25a8dcf4c2894ea3e9b6206052d7ebb67160e451491354ab85c648e8c56689fe363cce18656f313d55cae02ccfc0158bf9ad48412a5fa321fdd5b6c8a4466cc87f663d06ede4a6606337d693bb9aab5cce55dcde443f7844ab818fa7c79c2e3229ae918403f195553b846c5dbe6e947117e00af040babb5db8513b4dd56fb9845c9c335b4f9ce665063909518143ba12fdd4393ec5d854b44bcd228277c8f4063fb9895378ef81d5ecdf1439ac210487a8bbd0917ca22b918d7eac0e55aec7fffb8cfc3327f24ef014fdf7dbe7105a173f1c39b10d1f283ca6eb42b816291ab9b79df5c503ac36fda71b19ffd819a40cea80db661f5834fcbd9d4a496341d57a9c75dacfb5251f43ccc1e26f2a43caacd36e1e785a53351bfa1a2e8ae3ffe18bd29b141ae465f30bac78baf28397b5401f6e6aae681a15df86ec54403f6a243480970c6e3975989d6ec7094f8c1b4b0ff90827d1eeb5ba91899a26361e8b87bccff229925c5cf8413c37374fecd9756387c5bda9972a0e782aad0a332968f26de633d250f422f93f3b4facba4bd91c82f12c95fe0883f7de92ac6afe080b4e8deee2716ea9d085de9597d158532226b560c61598ecc85f09e91fad60627c81650e886db5256c836872970cf0aabb7d44fc19a63fe9ff2d42568f3b21dfc1753d6fac2eed0d01da23f9d8c64cf8af0777ecafb1baa73249d101837c0928e4105d38d61cde0c94745853e16832e603ae9659109cd2cf689afe1383d8dfe5ed3c0c928e9f4fc82f384ea73a586b1bc158e86ac2d04f09aa0a11b417b76dbde2e093a55d1f0ae9d90e4f1e6c00bf40f1efb6484fb6f9fcff80510bc8817959cde43a98ca04d5189bdea1e0fec7f5fd995a481a3fb597516fe508411d9ecc61b52f49935eb679fd7c908d147814d7f9c381e6091834f3b0021f7c7d9f762e7ca3ab08c09f9dbe3f840d5be363512bdd764cd83d649dd3bfc117f5e8d47167529e3fbf4517216b86bb3b537445e5ba50bba365ddaa570029b3b5bdaa46f83e8caed3b54a4eab4a7c2a03bdf0a9384cfb996ed71173ca4294e0e21bea7d717cd2db5033f8cba121c7d84de07e14b2a98618957403465e60a9518456d00046e9cb2e9c8176166db90fcd02054710bb9898400085d8ab7b240f0d84b78657dd4d20aea0e7edb775dafd1208747224bbe2d91a9851bb2a89546e1ccb86310aa070796444ad8536234b38ae497528d91a4ff3ad4322d24cf0b97087400bfca1f51a7c56711a651cded669a9ac5091b540a78b01ea3e4598181bbb55ca8d0da54612d48e0d77b6f10d41380c184cd44295b24c1f76ee3d976a42f78e53568c9efa212714010c9f3b1a554cde77b21a088238db0ecd7ae2cf4cf5cd3bc2aca212790f1eee362149846cda4e27b0ca8a8e6d00e3d6d92a5bca27fee463ffd8778b2ba4602693fedc536b98e5efabdc4d5cbfd30a808046d1106423e60ef121329078a796c4ffeb7f317f57ba3f50308afae179f813ac156b27692d784482d1fbaac8e267ce642f5aa510de751e870e6af139ba569744e05299a0e3440e992ffc5f831b7c4ea913963786f6bd9538bd15c7315ecc1530efadee6f0ff2731e825a3a111b7c4bb6df5b6f49673aab4b86b207302c0193588aa5ac40772a7cfa1340c0daaa10ce73dbd0d6c1f99568a8b169369ded9e1ca4f9625d7ae49330132ad47b478fe0dec84e1ef3577376d4378664dee2694ab5fc830b88851fd597520e3ef2be9493839d826c4e719f84f8e14cc8866668ae684872c8b6c9ed99b99f09a7ada87fd1c5dabde370794368db8c4dc0b791b2723c700cc36eae19879fe36137356e1944ad6748abe0d528ca8521cf71f8cb0e3d3a5c9a21389c694650045f1511762a92422c6beb26ef1650ff891b06d17c46b768f4630d9cfba77fd4ec4b6ac92a7a638d116dcccb2dd5a550aa79a5ca0c2089d021b1ad233399d934816d5de6f1d06094ff987556f92c6f806e30776ce4655b7ac9ca2954ac08fd77ad0c17ef32f63061dc320e4fbae45798bc8aa33e6addd46cd5f7aab8cebb92a55772bf6c57b27cfc9284c13fd7c5049f7bcd51c9074f9db02e8058d5027c41c767e57ee5c7cdec6b07d6b4adba971f9d9542ab9323845e4ebaad5a36ae11b2e3c4ae7ce3ea0f27b825700f21ca224f9bf131d6262745be4c63c6d9603c438c045815e0ed283fd6ebd299fb236f2e3d9f77e2fd0a795865b41012fcdd12da772f0a61d38ce927a00af89aa03c118290b40f9c46c58385fc8ea9daec339a9e1d6ec2dc7c47958d2e1f7ebb25f318e7f1dfa1a9d9e1ac962be01566d0ed3a5723c868cc04a6943a27314c44b2d1ed25082a154fdfe65b5199b43efed1905ccc3446e57a92314ef634494a7d715df6047c9c53d7805afa80ef110bea17a667c6f6ee1f2e4f712c88fd6e60ae881f9c4cf63d4489e3c7f0e9d4006471c9b7c30d11caff3062ed94ba29a8761e1f9f47c41d16ceac31b4a555f18731dd0f49d7692ee26dc7f42def5261ff74165f6660359a2eda8a91aa818beeb15a7412e60da2f53c523c2dbaa6194c7c42de6ffb4d67148e51692c30ec557283c87ffa15cc7f0de294d7341b1fd79326c8be78e67822343c19922ace4e7925076145ef5f7dc91fdc1de032d8c454dd06effea2b0472ea2421c4db20c0fc0b0440e10184a8648d230d39f4e7afc57d3229de514e0245205a840e1ec7397f2bb42b8269d6050c4cfe8a05cb1882eaa1d84bbbcf7fe765705746f98018a4ed7ed0a45d0a7294305bd0c6b5e828ac413623432cb7292a5064bb090b819d99d36efa39f565e2cc7d245a21ceeea09255b4a38e85aae2519257f638b8a5be9ead96815ac00e9f145f50fb49a54118cb94a7f9ac7b1d33e397c49964856f0419e860169561670002334c249cfd81e9be8a7a662b61808666fd54f50ae64006a220662a683df1de2cb58066aa2c23abe1a3c6a969cd6752423f63c99a7fbb2eadd2132d41da4161ea329851efb598c7eb7cf704063344300bba8b6791b642e4b369e1afc0bad833c156ee46dc2e63d6227296367f27a9a82a0b365f9f0e89d149747c12435428dc488f1ce5fdfb174f3d212e91431f0a1333adff3200fcd27ce67e2d05783ab5c3f6478e9fd3b025ab72151aa4e08dd819af1f405f7605bf3000d38ee9add2f173510ccdd4ebc2117387ab0501d5f8b61402eb94684cbdc2a32f311c4f72b18e62cf6b5535a4b55d2fe46f580891e406aab57f75bd13996f3ed8035f97555acf2ae7dfaf32ad1e8b38feee9e49b2d45c465d676efe690d277b71c6b361c433463420d6564c53420e375d854245a74e296f611fea8c9bad8dd1b2f7c23f5def761710ebc4f335e468a386efee8cfdc5e08e472572e849df04e9e213167070c3f13c1e8c85b7d35a1cf5e17aed7004b0344b95f482a1f2362f2ca5b50ab5bb652a1bc045131aaa37bdb713a2e99f7aa176ffc429b44a03375f02643a196f7c57934eac81f78c28f1ad6f94144d7bce2e3b43682162311b473713a42eed1e51ffcf4d29df9d9cee0c7e77c93b93955d9af39ee8782707990a29c8fc1fd032dae2308fceca8fcd580ca3684985466cc79c326acb9a6d2e1ae4b9aac2697d5d5583698f01bf588df566bec98b8df0729a966a4f9804cf250f6b59219da84efe7077cce3794a526f54af231415b20c37250e1db5b443a77ce502aad5f468cf86aa23ed058bd837d1d44a62c05e9e143b1587cf25c6d390a64a4f01305d177996711c4c6db005636612cd1066fcae82eeda87f118463115318da50eb93e20c79e53c56d949c4e5f8c9eab9e60466fd2d2f2832625a8e8af9f4da925d92e31441ec0b3c302870f96c5c67a6f54e26eae87ec0dd0a66576ca5008cfe93893b58988566bdf5036e5a392289e25bd4707606e258c73430247efe43d9dcb200529d27b635234d5f25d0082339b43f1ead683063d83906415e89adc5a773e57f90ae958960b462c6fd2381686063c9b546890d0a287ba8206e55598ee00c528f5d528b06cfb95cbf5e1a4bf8e4382320a1a146de31d54355baaaaba76aef21b72150b1346a7963d3b07f0fdbaf7b72e7287882e7d98fff69ac504b172f647b804471ae1b1a3e9d885b18741aa774e19342d56a2e09f003e3ab0ee0e615b388712e7d2bc3c54e3569c7ae23bcb66a95ab5681a5baaa41784b1eae121c06236f12473ccf3554f251fb5d08c3c9c3a7b9b7ce45dc94a2cb852a6ff68bc2e9fd59ebf8754378b0721ac883f0fd4ab571733f11e7b7c2dbd3530605aff0e0a58a6d85a7f22e94bf16b757a22c79467611ebcc872fdd4e3ba40a6a48a1ec7c240fd467be7939926b2650302385dec5edcf4be598e7f73fac85d1dba09325a04dd7b519a3d30c799be90fdc6cc3d5cf02f2b813acd5ac9e15bdd0e3754e435308293924c0c84e5137a81ae2e7ae056d9dc45cdd2bc3a5725d9530092f9bef9e3d4c870f7b1fa72226ab99cafb0d17a6a68b5fcb7d778ac36e5519d53640d187d489c9623ea2c1f5523ab51d0faab2830590e9650ab9029a2f45b2d0f3059019b62824a6701741d1a29d95618d4b7f0aa31b20343b53b5fe88ac2481ccb4d459c971c2627847d2bffe1b6321dcb9254566732fbf760b4cf761d496712a134751f6abcb1ec0fa1ac64efe44e264bc4d3c37e23c8e24ab6f8da203312676ec8f0826206762aff7c1ee7a8c622e8d1b9ff6ffae702aaef9c5c934821d2a160554863f16bcb7ad08703f6b0ee58cbfa0c27ba420f21a7abef7b2fd99810574263fd42ad6f5a422f3cfc207cbf58562115fd31080ebe6f2c1ac50e68f853df619f7f9d0a838b27681857e370db8a0de371d07291682177dcc8dacd7ae535c06a525fd18d3ad67127a3b7be41a59659bdaa51dd929e03482a542cdb93c10ea0b9171e9e9a17e4e5ca698c2f43cfe5c02c29e2006032cc56b1572bc7282e76d6da682c42d58d0ecbdcd455a51b8d00e79b6b1159aea8f539fe4c57fecc8fe6f93ac0196cb41cecb9eb6e94be1d9f602698086067c27316586dae5200d567d77e76b9567aba49d72652a2d9e8ee698c03be6c4fa9402398388bf77a6bf738d0ed0aae740b5c968697cf1b95a3e26e0d155b114facac2cf350d5a261ae96856bab6339f28d1f7553949d33487dbe2f4bc21a91d0d06b11d047d749783737eff0601cc6428e7788c693698462e4c63fc090595883b3015487740d575e944fab0771a3ede47df923681a907985679ee21416b3efc8c30377b17be456655462793976750b68da18e7b090ce9d2074ace8aebba6d2209ee5fdc6a608c12cd604ccded51cc940215b4828ac6069c49a749618f5ae8a2b953d593fa8c71235c7ab0890141781faf244b748c3f269c2578a9cbb5b37723a545e0c94fabbe3e077d9ced5c9d1e009bb49d7895df117da2a534f2e62de44dd3adc9a6ef26390dd84f582185ce84dfceaef0b72f0e8ee5c91633fea930f6c94d74d9516463ab38d6d92c4e043d736251fb8d59e134677da1b4ed178724743f1b8055f336ccdb670903609c6251b2342b81bc8533b962ec3265ac630771275643bb88b3ebc893417ab63b3226710bfb642ac463ae0548da8412b60db17fd7b7cf0cb9ba0dbe996e30d80639d807446005ddef1cd980e0f1a0a4553b0db64b0ac65a2f2f2418b69733520ad8017a260a158283d83d93f4d68d01ce16a47f4df6318f333bb63db2648c0d8c38283279a29c00c9be60a44a3453136cc5fd40a32317920d064d95557c42f0d780d59705cfa34109f7cc1dacb1fbc07670a062163a804b05b7708867885de232d99011913a302c8baa0964e0f58bf23341164e6ee375a26377a87eaf2fe6cde46be208e78a4ea996009de3aea90e90ec5ee66b73c5fc7f6e6d7bdff61ae498365d52e4cd6802a073211200e0758982eaef9820ed8920ca6fc2731304f05f2b70d8690d0c7c56f96b34f0253c0006b0721db5d7a3d6e66bae9d1882a15a606eda03adeb6c6d519cc462bdb98cf38c02cf0fc4f75e55584a7327f1959500ed49bb07a8e6b4e4fb72c6d2032496f5246047ef4de8e6ae7d50068786b2a78911a45d0be267ae885d61bbad49cd23afd5b224e2d81103885d63aee65f43a19ed1670638e2d420027e52e91a181efac9a7e0ac12eedc7d8b016cb56c05ae49e6377affb63097d3f9672e9942f77ee5eaa2d228a716b01b6070546140ff5d680a4ac590ac54168f161edb144c6e55aabacf70dfc9d9f5a6afb201fb8bd5b6c5b112300042d6bb1b01ad439f61050c12e335a31b9ebe14e71fd05dca7410232a8498a499a23fed41611b4c85a94509e50adc5122514d73a359d14f1824370a5d2ae307a1f11713c7de71e00c4bb5b5ebdacd633e080e7ba505bdbe2bc3d2d5274cfb43615ae4977621b6e67e70de78ebf80fc2b4eb8a94b4ca9d944d7869eb5092e93e210330e016d2f246213f46bbaf0faa54cf244827975078b8c36b85b4a0a3b4e2291482566f992ee83ee177e4fdc5a703d6d8d09a17405612d8c5ad98df286415c0b66361481c71b41c7df95d9ec20db61032ab57fc423f8ad3ae6affd4c802c12f105a696b06c392053c528c5aafe455c65760c40efd3c08fb4d4351482c95cdbf4cefd69efd2c6a3f460cdbf83435c74172774b141a54749acbc0f603fc2521b58faa10aaa9b52413c2aeb142f807f6c6a97953d84090b6f64f6957cddfbba55c04147f57b465a8c9d8c175fea462c9a024ed432018f6b65702c7da6e7d5d41fbd0b48c6cc345dea9b2cc91f5df4e28150c5b85b54a915d070c61e8ad7f16ddd91e129db3815baefb75576cef52d4fb6f894b805f7d66914d94bfea538deb613f14b71cf293b101064ceb6eb4a5fb2af4c2469ce5597f3b70c26a46284ee6b575da2a6ff2a4 MD = 9e99388d377aac36afac4a8566b9d168c6f0faad772b3495379d680a83d5b482a617c89d9744f12694fd47d1c9dfffe91ad04bc3940faceb2eec299ac386c4d7 Len = 84976 Msg = 12b89aa3e9a7ac15e01d78631b3ceae0720e36f7737307c0aa5ed9d12041a35721c6ba6542c0f28ba36106ab72ad3a08b02e3ea038ea56bcfd92b8c593fc3559f1d31c9e758e5cd6289ee83444ec60eef382ed945a886da0d673d04e8579c1ae094889f788f7311ef73de7a799e1a4bcc2710b7ce1379395bd69e815ffa08f7df18bc91785e5bb8a99a4cbac79744d97a6635fffd6de11c33bdccac10859e7ef3206a4a8733f4043953d5ceaed8da5a926c0b2c640652f51d7343cfba98c102c5320e24f5bed0971736f620afc14f21acaf1cc7827b335671ad9076be921535bdc404ab644d65e3abca1a4b3aff17d121a5c75be93b26b2f8b34f3b8d000f8a455d0a68536e486c9f73deb8e0d0c8eb89f6a75408d4919ceb2abc78b661247304737bc643afecb44acaaff431e4d6c34e08393a51c60866f17a74d8bb43d87273add54f9560c73d46450a879ea9d61af6510989649e0fb3843914b61c16a02b1b42a38ef94f7c7a0a597aed87ae2b351b7774dba1bafc051bdcf8ab49582fef43f862fecfca50fd1fae7d80ad506ab415d2277ba9ab61de30dcbd22d396bc41b6259009895ff938ee8a8efb403ef91a8df77e13dcedd5a16bcebea74b40f9c4ca60b749d67ed9a00f942bc810d87adadc6e052ecc00dbe1151999c300e54cdaf910453a07a586e4eb41d0416fab4467999c4916f772c92fd543cae095024a16eadac654cd72655a1a1a1921ed260a633e08b676dfb231e014d3be9a981665eae826c71468541982149372d3f9d721304249c9c8e55dbaa46c50015b5a9024d9a96aa41398c8f7ff533459c2164d2d614eb61f87b8c3b7ef444f2fad8d0dfb65774cf9bcbf5fa5146e735a86d2f68378ac04143dca82ae23250795fb8ffe7e110a14448a4c769583bee6d19cb041c7d8e28a44458b2921d2873fd0efd3e0115eba670106d0ac3dafdcf57b7e2edd6f24aadf2c498b15a78ff34e6cd5093159c100cbabacec6f220b31259495bf17edce3d6948b44ad6a3bdf1b9d6559080cbca85b8c106e04dd728640dd99dd18fc84842bf06103aeaaaeefb1889ebfa4ccbedb194dd8f6cc6c179ee04a6d116b383253356f0e7dbd0218587d103f2a6f3eead0d064db0d248759227a088e9ff11a2e787b79595be15ac341089d1244724a87b0073be15c16167e3b977fc42eb38bbf1c86770b45239af5d3d898ddb2b4d9dfa24739b28ba901cf10be17d666b7712e67dccfece289aaf7367767691f3dd138cf17c61541e53094ca77388ef107b6c48007ebc4db1e7211916d747e31161cdb5fff4ad326d38c15904a4ab274ab40c6908f315bd7e7da8a0c4026e39046a01079872db4e37afb998bc0b50b9aa9f97fbefa0b797feecbacd17ae462e5d5471e4538d88020e3666ae260e161080bc73633d2e0e57b3a2bbd05a218c1d8ccf74fec99b1ff8414b6cebeb2367c69d99432169e186872d3e406d34129c910329ae9963321f9b817d10e473f1d23631947bc90e71bca0dc2dccf61de7f42360f17356a8c913564f4a172a48efc209ed5c81cc93450d3f30efd60d70182f4f16c567b912e677c2fb10d41fe283c39c314ff9ae80d214accbf2d005e339aa7ea503f0333a10d96c158fcc57c9346377adfd47e16faf5f942de56f81efa2f22c9c3ba14766be94bc3f05844475981e16a3d2f0f7a8435a6fb715f913ee1a92e35cdaff785166563dd820807860154013c36f8963d32471a9f833010e66d7093d67706f5862ae7a5b615f4566214295d98d2175b868d941dd719b1c04028ec1955c8a754a22dd9daf7b10479031967bf241a74a67e1c84774b3dcae8719985875ac97a5c00a9a2ca475e20b7909875ed8b15f7bf4c6780efa2f663cfa448a4a78c806857c925aa3d4f253059321abdaf73cb89ed1af6ee4e844d64beffbeaf3f94f7578b242a59fbb70d1ca71026a6cf8545107a0d52375c9b48b5fdaa821018193630413a3f17cb261fcce953449813688a75ac4f02c4e18cf23ed4ce1c2dfac443dcc132ec4c774462286722fcfb45c4a2a1cc088efca50250e88b931570ad3d28425335b960c5bade1969a6d7382b43967b215f7f466fa36c996920f440f82bed493f6b2fbb7e309b8536065cb58e8b6deaf57d5b0c09174d3ab79e4104a43798dbccfbd5c56a4da256176b14db35442fd88e8aadb53907fbb4be348526790833df440e33e750bafa7254fd8512ea17e52c35adfaa9c81b7fedc30b460d3f47c53cedcbd287f91fabc335e339c373ab96ce320ecc4f7efae0cf114a0f21be9b57dc105b390f2e22be2f0146b85499aa4aa5cdd6aa11224d2641ef1a65cabeadf0a6f4e5f0e5b56e3aa0024d882f24b9099b4e2d1d567ebb592aa4a3d27006249882e392807356a927fd7e2133badc82dc97fc3aac8758ed8274790cdd7b5fa95758238a701fdb7c8d2ebee9415f89adca822126df0a798aa906b67e0f5391e43610fdf448530a8e751a0ace3885f2e2dc4203183e48a93bd4c8a320ee60647c3c93b9f89176ad88e6abaaf8a293e0c819c0ea3952a9afa80da2871b040ba01a72c79fc0d2f08a11e9c8e58e06f31b0789e420b1a29655785b7cac96d9ba0c65de95f77193286ad2855904b9ed0c6b483497eca7b6756154c73e58baf3d671068ae508365d881472c2474fa0de46983323bf954317af9ce357d0d4afdcc897a47ea01b35b677529aa8780e6c6109696f5d4564af4cadcece151a689c1cf746e8c1ac7896295deaf240d58944febda7a5ea12a110ddd6bfbc09055ba939ca46795af367823ba3a521914608513eca1a7cd30d9491539136563a77f700bdab5e01545c302176af4bd0a3b4d2baa8998a9d1f1d84573548fd44b05982c630015825b4ce1a9a61eaa4a67f0530a8c590bfafd62cbb8d0b62da2d739445261833fa8f84336e1684bc774c2c236a431b18805b01217f595e4796b98c0e8846ffab0de7cc7275bc688e8e69b2f4c8b2349a9749a6e319e3b45ef99102b1934e6cd058d4927374b594c6afa61a62911e987cca20d05cd1549811ca5ddd64ad67e80aa5ffe01eb62890cea3ab6b540faecd28e2888473eed48fc7d3c4250e1fb9fac1ba10bd5b823ee50c321fadb1888b5d04a72bcc10ba8a23e9da6fe399326b2a5d60ae32121f1e1aea23abe96345dcd07ae0aeaf1b7b9fdbdda8061fec2ba500465f81452bd6f2b7ce40f626518ecaacf057bc367d7a3b3f0c0530dfef559105e57f32008eefdf45224fa96c63ab7d7bd0d2fb671cff84d8deb8952d8af754c0a088696b23b20f4b4d196bc381e31cc4811a134ce151a52dbc8bde10a55819b9e041cd8dd366aa51b766e534937fd0106bf7adedb4bac4c70c44b39128c106790e73076e8455d7dfc8febec681c7c0e6f63071507e800a2c37acbbb6fb7a438790e6bf161fc5bf7ee8a89f82330315ce8a8f067f25ec9ee6a68b9f8907cbf96bd0629c8e8dff8ab57f2e306e927bf6508fda15829346a87dc0a9071232fc50ae34af46ddb44b5f0df556189584778cf56dda455faed65277eccd995865546fd72694660b7ef0660db2e900fcf23efe448c573f2060e3c25e94c10063891c7f6e0ddba421d238c93d1eae8fadc51975c65519aacd90b720b91f4be23b849da7fc514aa7269769ad25a26f6eafe35019012ee72f6c26989511f534e8e9401c100859aa1822b7cc3c4ea4f2440a362b117f808a760709cf49ed7e43b974a3e4e11a8fc29e1d19a99e3f8e00bac6a5f186c8b4cb26a523a463d52142fee4973c43ba5a5ce220a548fb80c66178ec17ec9f623070e74f5b5e0b5149f75e41036b5e71223e8b3243f07a9ab6dd2584766285d75e41630c99476bea5b2c8294ceba59c65031425cdbeb4314c43c6994a99c5fafa5083fe4c5a5a827c0a711e5e2715d424afdafa5557f7f765a45ee2698e256706c8b26dfc8c1ed91e031b43a26d8916b796a791599f55649dfc159412b7c92a41d93be0688e360ae2391139d82361ecc454049b49095ef13bb7955ee4ab13ad21fe8af60ee532909f291d515ded52bea1746c68b20a6735f55328834ddca7783da52a2f5e2587127b3f7a2aa22fbe14f554599a1327209b217b79a1bcc0f703eb6993fce4d3b6092d08c246537f16882690669feaf3fda9668cf34abffc84e8b1b842df215451dd1af18004d03ffe70bb94edfab7d560e92b041feed5e3d38f271dd156924bbd16cba63e16b6f6c8673afe8a3af86ffcc2f58d69fe8d2b657fc206a9e3c60e8a3eb57346dc563826f40b19b5c12b0813cf3c656c0a4417ad23090f47172b313bcd7f0544c66c887c7fd292eb2dde52687686389082a95d2d21729423513048343b8ec8c275384c4b92f7e6a4f170c34d51697362081b4067f37541e93283a816114b3a2a69581816a601817d8c80df44d84cb27afb1885e001b774e33b83f553e75ad5e7035a50605175ffdf8f8d0ae183a65225ec3f7217e48fc9bbccbfa470162428a2e3bda9ab0ddbbe355b03caa5dc0cff0d5beeb99204849cdd769539fd364daec87ad07869339949297f73b2f459f6f59bbaa4b0c0fa1c8ac2b9b32a4db02dd4e24951413d8b352d367d6b586f85eaf24b890ffc372dedfff61687f9f42c4b376acfae886a4d35d6c6d5490f89d85f61b7677ee067284f89020d922d82f32c42cc8e56d2a22221d255079b5cb5d9cab049a67021d371d7a2511f50497cbd5783a205d8a467727fbc8b84d0c475f2c38a8cf68224fe831cd87dbc40b243d3438675b6a2721ce6a5d1b4fd97db6ccbc04cfbb8336e5ae46597e274e20c6aed76a7a22142d044d74ace8ba24f15ecbd5774006bf2727b0e685d29d9c2cc74647783c1c6482371ccc51f5a4364e8985fef9c55925db5d1798bb4ae4b5156d2c0bc875f2610f0264fab20ab3187e7d21bff2245cbb3bcf0ae563afa5a1c50189abc4ec4b14bcad4d8739f18fd16782c8a0ca26b68b2fc5b253e3c9876922ca84b0d26bd083727ffefa4d71e169f3e2a22ae9930f9da086366ca4603314161246a15cb829b817c1a0db555151e909e3d6e4b83311f7745bbfb80e3c50aa881ff706c99cfdbb94bc5ab3bb5a865890cf8d579dce62a3958c75be8a2487345f3bbd6881dff492d2b55509e65429be72ecee09012baaa9e9617f067ee280b885acc34dec49b747b8f7b8653e07e124968322844d13920f5a210618533ce241e1ba2f4072a2eee22dc9ac4f2b3a5791e4db5050e74ec1dfcf16317d72fb56d45baf2ac67bb141691b72595015b7330d443ea1f339a4e1212f8629bc41e7837bdbd1db696f3f56e6693be6ef64441ca09ef23df7a9dd97db64ba155d2ac7123d496a6bb0b614d860ff6c7cb580aaba53da404be4a1c08d1755fa1ee89464aa238dc00123b8f86de0c54d4229d2b0b62de070f34088166bdcea8e6ce6e787f433901bc64bddb3bd6da32561d3c020b83698ca5f95c6a7d8330bbd26df8af6977738c5e2af8e0c710f813e003bb3c16777eb96b46ac33b7d22a0d07559e77a3cf76e057cd831cd31ce47de48ea145a6cf7bf1b1d48e69a02b4910f80de65da8bba1b22bc4c30bca4b3dd4e616749b46ebffea2c0b6998b0eeec6c270f56ce02bc82565cb95f1a273c52bd6723abc9716d58e73c53c44d849da28316c276452c5297616d13bde46460d19bda3ecd3ca0c4359d655624d475d7f9da49dfab5f900e6f47df5c45d72c391904d1e04f817f711451398b11da1efe50e622af8c89d850589e160bad8ec955b76cc080a924480453c71b5b01cadaa1564b43ca90306fb911c8c3aa4b67d6273b5838c86091a4ee92539d4e8b235331685e2fb94cffb0b8f94c4aa0b5fedd3df33bacf01c4610a04e7b41fdf48ff35f05b348e4195455d09dbd2d8763b048fa9dab9fc032de15b9f6c27bc1f44d556accdf11e38bbac9806d8feed6db28a3fd990c73912ab61eac19bddd330107d3e51c263d202abf8658f738f11782c468a753f2daeb8a6ab5e725c1d8d9812bf96e724d0d326cbf16bab94cf6b2011011987ce34857c868560ba972e11e1b4650677da81482c855f5362230424ecc98393162521e3e6b4b898a2345988925d353507ccbe5a9d4009c4bc08776365bc94a12b2c3ff27f960cad311ce61a3474f9cca2e2cf31ff63b867c22b70511152fcebcdcbd5dace95484870351dee4e6377724d04fbf4dd5834e47b7536167af4821804ea2ac35c1a36106568452d689178d0121a8bccbc8645e2f0cc13d92808f0d0d87187d4af8b9cae1a9ea8fe0b66c38ef80cc7e02655b309271a4dc2a2f80cbd52483435515143c997bd8c8abd4a225307c2f759a22d45022a452dfb702a9f857957790fcad5f30ae2ae3af909a55bc74824635eb976c4750136fba91a0870d056879e8aa07e7318055afa7274df3793c21b5318f198f909b2d6fff728f84947efbeeacd5db38d9d08a8141d88607e5f7e8d0eaed5fba967470c810b2364f0914ee5a60188de073ef17fcf23cc91f8d28264dd49ea089f37c7bfc80d93b32e577be51b4daa66aaa5cac974acc8d86c95d8860811ba25a2203bd91d26fe4dcb417ca48eda4ab33e7a9b6d4bdf059ea45088ddd72dccbb79caaa41c87dee9a8ff65b0c4acff02d8b646a539ce50a4c66aa984f91c6a833edde1cdf113cea02421f20049655253c580c4163afe65f487b4b12c68003d7f3c6049a9b3f887bedab63d173b9946f486f1a2785cb098dfcabdcfd29ea0de065cce32a5d9c8c27c3936b7843fcb359b9963525a13a761bcebd056260180b4bf0c624d70d6e6d79ecc2df1c5ba7db68f79605419f425691287b6d48525226a1fb7e6ea693fe56f6d00066c6a30233266a373385672cd17871abbdb7e9e08668f0ba6aa1d7946d28d715a87d0354e41a7a4067f9e1400e5711169cb80c09522b3643c0cfc278da966ac84e4963e715cc907b48a4f6c536b67084b351a316b36f35e117383af1c6c8efe20032ab01efc512ae7f8e8c05701df6bdaa8c974fd0be555b17e528485947d02c6541c3eb9a8c6aa2b4bf8c46e5150b882871cefcd29ffe7b69dd75c6ba9a736b267d93ed3da9fe1f8e40dfd1bc2517aed5073165e09b9807b52807b01249426aeaef044e00a538edb5186bee1ed682f85a56a8d223398bc8a2cfc85188dda3f05a9dfc580c077fd3d24f1ae433afb42b5f661c8ac2013f86d9d99ff045dd00c41e91645189573a9a8deed3fd223815128b4073d6e67b1d09024e73d470d1c0afddd325829f1ed30a8dfb7d7f14f90e7487eb97feb7308b18c4372e4632414b793f69253374e2b1eb7b8102b3307b0518fa6f6e4a5ca7f27dc79bb78eb3b609eaee5d4eac332e3c05fe8549e19f4563c78dd5e201fe68bbfeb482f6f41ab862c98fb787340287dc20bf113a5188df9149e824da6dc4fc4c6433f4d3c090cdbee0cd7db7140977f903652cbd4a14d2f566b2643dd4d7ea0f76ebfa36393c7f85f54db9c8957285fb7799dfba166ba5f9e6949df57f5eba6afe859b07a847551fd1ba72a1fd623a4a44033119fbb4e0049035d8e9b682f5c7c2a8e02e55d8d7f43cbab12a94031c4e324a2ac242180c7d2d3e1d01c16b228d8cfdcf9388188e6cfef57d4ba47db5700817d29e32beb0ce85567225e740c924222c731f892e01f0de15deec73f88d169011329315ce545e6026e13d712a72f44cdcd1b89f43b9e6a5bfdcf54a9b2aaa90e1518a3172809586557131a750a665d4b5f347147f3cb81b9d804e718e1692d12e376cd0d0bddbbf8c2ae9d1dbecdf8161e0b52e0914cc0857d1e030fad9381ba1ed1f38109298d273154e37f2cdca1a85a0e8360ac88c3495d791cf07f90236e27a8db15b883488b1394621bed08e68cc3cca73a9e15f67fe9b4a95dc005ae998e69c85d92617a9ef9fbad6667d9333dbbb422f0fe6ac683a24f4cca276a7fd6b3a36fab1f4aafdd44d939f135c41425d2537b0635fdd00f27b75ba80e1503b057d425a0c7a534b094db7c4edf6015ff8829340ced559f7cea6b7a79fcbbf680bb7a8eb11417b5d35a7108d1bd2395054db3d2578cf881575afa0dd26bb5b4f28f050f6e9d08bf901618541c67853de1a371da788d5d221909d1aa33e3a8cb7023122c2bbafe9e81585fd2a1571b5d1f29f1b10276f9fe5c6790c400fcfba6741810699b067fff1181a628e3144c9f1831a1fa67c265727c04a5dfdc0024d288ee9e4c1f07f34deb3299bb64179f50676b011b3b08162b02518f7227a5badc29170a483a27fef768db990ea6e99a3d77269d97dea0928489eecc1f7646343fdf11e2e27eeef9a804fd22972e02b3a2d204e5f4d534412b6d3cda3c3a7a175a156fb6af5fd589cc5a07c4e95beb722d028668c6a13bc86c46bc385d06a9dac756a104035f7425d0d29c0e79c30c5c28831ba461e51f9ed380fd64f64d6e05142d264992e0433451f91a5dccf60de841de35076af3581b0db660fe9c813f1cad039ff5b294ab5bcc5813415767389cf56e8320566e8de357519753c44485881e745ea706ef44f2ac5a1747ad9944f0cfce568d98b9298e6cecf102e1f9d9edc4f9e2cbe45288af7e8986df440e9b7a1d785f8dc665a352aad31e9a8a33b4a45cfedcd2ff60eec8bf60f2769f29a49f7af6decf43e693f68dce60793164ae42331dad6aac8d0ff4eb7adabc338d08d764c484b0b5de73e0a219773d5c1f1f5de3b0c4e1605934ba9f31b00e85ab30c8676bc1e0809fbb87745ec3358ec5904deb62c3d5df382570271002ec2a06a4d90f4716cd38bcd3717108c5102dfaa998a69e1ac66dac2abc2fa053e37511ed8fa8f113d542b8642524920d4bde10b3c4c1ed4a119047ecf5256d23731b7f6362e0f419a73304e6290ba4fc5703ba4768b9bad275eb8dc4c184d0e2197181bee923cab8918e44c1d3929c22b03369eceb0a913431d3d04a87ea6610451bdb48890ddf7152b8da9feb55f210e5d1821cd2110aeff3edc1f6eeb2b75e946eeea8d8fbccd4394748c8a6c241377682954f947982762a9dd5523c7a2efd760f3e584f79fd31d3be11e4bc73f406c0bb360dd8a0926744788cd5179d47ad78613ccf52f4fb4aa081b87c82c7a51f82efc6dfe532a523efe24b07f6b89bcf0a097c768a19416f2e46cee89049bee20b94da2e608c454c7b7fb253604895d2a97c70066b435a2feb51a7b17b86bbeee95ee271c139fd3185b5355fdac9b068d51eb9c76d0fcffd5656e58f9aeb26a69a8272528da837837d075685ccb895f22b74bc6215dafd57fdab0aab750389999db40c493c738eb2e00a985dbc9190ff0b12fa4eec317ce05fe289cda05c4f48717802be34085d305d137d4030f14bfff28de5e656bfc906eb71e53e93420233a423183a3af34d9c22d667e5b0341165802a11d0ebb26c3c2efd9fa6c4712cdba4599f3587b0ba46ffb7fab6c0e6abd0229c009721c5c100a8da2b7eba5639a100900a48c0cd3dd1323ca82bc99555b0583834918f7681f4d79c1b2efb6db344375b0bdc6ca532bb78c8f2cd50acb996afa310688b21097939b7e15ffe241405b70f0678f1d5537622016d13fca941f387514674bb71d20e4db2005a4915f6961e407ca6e6d9fa81cc6a6978042789477db7295e86c56644921f1ac652bfb545cb83e0deb22fb27ed6689a922d93fa0301694b7e73b8508c9553732ca18deac54d4dd598ea42f5cdee9052dadf6b0ec6a0dc2f6d18b70b76d5f3bbf5bc0d01752202cd5e05b03eef635634ca70395202da8447a2dc3e0173c274579a18c983d5c8472aa68b041863e33eb2d9a67b4e481cf616a834d9dd03e959d8b23e200c87de8f9ffae09afcbbccbe4f90d8ad5de6f6a62ee5c906f8b7b928a1b692bce5dba3407fd3bcf17667ae698d789d4c2b9fe618f303ef41ef0fc045552fcd0cba61d50e5cb966b3ffe806a4df095ad421b379c3055b4e171a6c8d547576337bf4bad24db934743ef3cd4414c6bb97d1cad20048d8843bf3256e7eba65326ca72f47298307ad7c1f1c88051dd717dac1916c47feeef75f627a76230ba6dcef0ab4875952eaacd4c0c498c84472a6aa201fe28f69ab2d1ee1942408acdcee21034efbd011b4bb14b0767fec0d4bd07c79c0f5652dafadf10cfce89e3259dea94d39252c640840c28abcbe0efca53dc84b1ef5579f6ef28c213f445220b036fe351d93dcae57e654ac01d39f87213723f0a462d5536b8336dab5c7d2fc728f865756b85f7526144190e0412c3142650616dbde7cde17e887a60ad39f2a1330d8209f13233ce5431fd5c297238f8b3ff53a3fb89c84168b04ffa8f7f53e14c36a2d3124d68a27fb55e7334613f65e3057c74a91e309c9f325641ac593ace9dfc2d9d77dd7d170b57a41ccce8c0a5deec43a76fabec3b4a96f6fda9ce8fb14be68b2dc7ea5a7320a0371d990da3fecb3b1206f43ae466926596f531e63ad2817d244bab7de7fee517803e45dad0b9d27b5057e1d200659f26a0f2eaaa2379654761c1cb9c0c028344e54975572f1d1d336463dd7c287f98617bbc7c2132ee1fcea856ce52b1c522afcf04d38ba974d1ebb8f2913f44fda59f8f1b90545078d89a62d15da4be90e8e1a739077e2404192cb3cca5233c27f06644d7ce496361b831f8fb1f9c1bab0061d3aeb93889171b7cbdb8c030f8459e4102b7dd0a54efe61dd09cbd41b05e90b7bd2c90c2c1f3ff663e7f8a6f609fdab53184669f0c6b8be6547cde9b65f1c16ccb7a3423b3e0ee6f9ee9ade75d7dca4c3906100e721dce12eb622bb323abba0767624e634628102146becea0d526968d820584616d4cd82bfc174b90d0d6a410f8aa868b64128c039cc698a3b2e36700744969a0e741d0b9f164e73a56b8a60fe61b83a1f4e58a9d09c9b0f7dafc652e789968d1c745df42310fa7ba9b99e98d987deeb0ddea3478f68ec1a437b9b79ef4bf29fef59e2d5024e0321789c3941278986ebd0969b01bc9de71b3af6186d85281532e5894e16a32a13159077dd024ed33acd25fa9260eec81682b2c3ef965f8a88e6ada712419c3184b89fc0ec54d5f184ff6c7f4bfdac53f4f14959639cc50fc84b9627b1de33f0e29ae52bf9a14360d00322990a206bee0ce77d2b26d95c044da23d9fcf5530e4c73d0f0d87801dbdb678d6dc6f91a3d2b8c5bcadabe49b24a3bb0253ad3ee9897d0f7bea1869db44a2b0f7cdee99face932c86756546f8dd44d692f7ee03e46bae82ca461ed6f2a21f5c03c209c1c72e267c6906d568fb9abb855df0f43ca7e7b64768a62d400a62a6ca996d43a19f7ded45e2d68ec329e97257c1e37251aa9a4ecde58ea64d68e2b39d17241ea1ea3a52197278f40dfa45f3ce7d23caeb730fb276bf642c47b4bed0340b9b0d5b4defef57a642a771e33cda49de46705287949be254cb21e77463873ff5169236210b3f80dcd81bc77b3a706a63d0053f5ee55581443819750e6d3311524b4fbb1a18ad35a4adc35738cb6090bc34fbfa7f6e99e41c1f959909288e48a19d98528f94c2e69c4820a9926c256d3609b72c5f8cb38b3af608cbeb41d3467171feb4f80c1b04021bc6471e9939406fb2e94d75ec4cd72f6ff5763b35bcbb308d052ae9fb002e94bd26b843ef06cad7c4e4c658f9c05877c1ee306f70a4e76d332e4cebce2cc6c280c46598ba286cfca44c2f8f31b8af92b05582fe8f268b8608ec9364120b5cfa2b11e7939728974cf581f17f20901d0eafbdd67eedabf82972b296e9430651ca00b1a6ab1251ea472d18b4bf42d1515a0499a34718cfbdb60532bff1fda855b096063b65a86ec689bf92d1b61506ccf3738b821d9cec5cca34cf77048e8bd92c7f920e49b5c9cc732162e0fa13aae06960e5fb38e69c55c485fb6497920b4cbc11e7a7dde6ed5ca2071b5af1cb384c2a513b674f825a29337d49013194c130ddf1799088a8540784b52eb843b83960c4c91e6eb7fc9047958f3ac5490328161092ba40d076984d99c00f81564718beb73ce16a08c1f951793033397459ba7cd27a3c315bce24af5fbc503ea00470b6802136f1c85edfa74d14e4c61a24e2c5c21c720a713b83ad551e7348c78cbc08ae1a819e6d4fcde98f81a203c0e15ba13dfdfe04b73b2fb8084afb48232c64f59f9d53b86df14e78cf2b0d7aff1b6f6fc4a332e89449a36fe7e65ab5498ff63dd30e2fe8510fcbd57a5589843b4fa8a1e480b30eaef3692582551418b1140a21f6f16896ace7e0901fb5a8b7ebda91e81c2ae0ef5da4fb89563bb9cae044fb4269fbb05bd80607393dbfdd9eb758b592ea165f1336eac4fbd1feae745dbf542faa6179907906ba2142c8aaa0f4467e42ccb78012a131700d9412748d9fdfaf4a46e726ece65673f8cd8492574930766832a2f6564325673efb0bae7f1d226712bdd16ab9d671cf104c68273a1c831883ca5d1466931324f0a56ebed15c2416297dd4a79f9fe526182de7dbb1e4daef25e23a8cbbf7a733d2f1a0282cd35126ef15555006c92d037110881267488464bf18efa1df073e1e468e446cda293623e402c80677d8b5f1ab62cd8dc2ae3c03cfecd1063848643edbc9c00f71b44f9798c4c13d7b551c7b27b32c804c8c4e66c8bc832c6011a63ff342b7827c1b09fc8dd9c56779a4cd0a867029ac7d6957e84a367a86ef19607c3d677f6861a401cd33c049070b6e541a48285964cddbd512b4b92b982db64f8e0ac69c23cb05a3741b06c0be99182e44dd5a103bc65a4270a8d31ae2a48ebfeffbee923700b68b9bb42bc0d0bb18d7f4c673f2b3ef4b2c8c8702ccf90bf93e0c812e0634bb1d06be8f9dcdffda06cdb48414854fb144ffb0efc6b64d9c8c468e2b234c8f42cfc1271ddb5c9e8e689c0ea69a2c71a4ce389843ad6b530ebe65cf6a6cf9b93045279fdf62d12f4094af6dae937ccc424d63bd131560abbb16185abf4972352bf3c67354d2d0448931944bfc9edaa212590d79eead1aaa2a19eabaaa676aa57e720a3c0e99ee50d0c5d73420faeab58d67a25926b30de0e4403969bc45376ca0368f648d266fe6afa7d4b0ac5611592c0faef56be5cee2720f90d245415d0d49c7b2872116f9788e7e394c0f2ee31f66979fb91eb3c2214bfe9daf060a6009d39c101e8ad9ff88f5af6160b9f3c47ad5b6012ecf8b7c1fea939c3a5efed4e4c62a24952aee068a6dc1e9994d3359fde1e15fc0fefb7150c645391ec0ad20209a086c7571d1931f5f4c3e40296c080b2380281a1d72364677a9d0c6cb83d63fe79d544a0013299a52a4dc0fef0c53451338d694bb9e2f7367381fbce0116ba5077f788d56212e9de0625f530ea2d01e297207bb49cde16a2d56527b9ed454f2a22555b9d48a368c711b14b3f8bde308dea22808488fe09d32ab359d685b36ab2015585a0bccc6089d25a8ad4dcc1087cb6fb4165862a17f0f9d257cdd04653109c60cd87c575174bd1887996e3bed3d4821283fd9c4a8921cb2ae945d6e7516d7bdffcfa6c86d63697a4e12eaabed7c0d7d111f4d547a7902723d9e6a07faef12738daa0b8e8e572ab148a4339a75e663c9fb2f33607b9629525ee5935f4b0c327d52f22b1818c2695423c7e9663aeee39e42da2c97307c29d98ef469e30a00c031cc3275f3a137bde94bf87cbd80f8156094ba89573d9d6c8e4a554e119c6f344775e58cbfcc1980d74da05e0f0cb471c74d4aea2f076c69d71d82c089969a1714dc75dfcade0a5aa4957a0db912967128e905bf9d027bba5a84f761a97d23d1205c7ddfa36b6cc3e7bfc01c6a57009c1bf4658a1fd34dd66efd4d920fa4af0af092681ce808c33507292d0a813e957af70c04ca25de5536aaf2dfd21ac17e2d1c0acf07f72a9026895e0b48ac3dc766607c4e005da81463951238b2594813aff9220d215f357620e4eb056739d90916eee1bbcd15b52dd593b7e2b359ad221c2e74cd199eddc7bcb05c85e6b894fce4d8b8d870ec79e4154d7068457a650bea127f693124781742620f1737b6f5f558d48e1e9c408ae99b28c833f95a0453a24bae7c088e98e75a808f33da937094fb58ce18cfc05ca0ef9c1bc03f770f7bcd309e70103bb4ba8d7259666ffc995e44ebe5315bea63ac8b3e07a7984ffaf6d377abefe8ca4ff333edfa293850d4b3bdf48002f10d345ee675085494433b474d776335e2a8ff43e629fde6e42ec737df091b080fc7434a89e79a51a3ff550fa3b660fc9e66170f2cdcb139f3e4c54d10a012ab089714f20dfc3a2947e2ec927ecb01ae9c703bc7606cd09ce81173760b4003868bfb2de7bb296436008c4682271be1c63d55d20f3950b88a21433645276f6a050a72029e49f5a5126e5a1751452f6dde21857e39103ef58c3fe8a23ced84b2b0f48a178812f77958d1eab382418c2240c99da4f77d6df40da4702bcfc6367a14eab1e127ae955d43ebaccf87b4a89bb895fccaace99450a8ff88576059eb3cab4d68040f8565cd9e1c1ebff4070b2680272173dbdd1887c8917fa9b1111956eead3ad4a23fcf56b1d3cef939c13a7f41fdba1506d08105f71af48714745765497aa8f78226586519a32c2fdb7bacf2787a1542b06c5457aeec55941d0c1bf4564610d111e19795401ab4b85b8ed92c8e3cc1615af918f97a9631452d40dd609f8020e5f3e9e343cfaaf7272c83458a1da65d15890f3567c499061ee7ab22568fd947ca8ab7e21d12c471f0e0e18897815726c3ad27302f27755285bea37122a18203e358c41a6da407a3a9fb3208d163bfecf049d99fbc1dbb951e24d240716f3ad3c4e0a6d2d21dd51ab6eded5cd43f50ee2fd18eea9b11cc4c5cbcb026bf536435e3b4d8c1d6cacd25ac3b8bdafc6ebac8d6f6cf9758ae37e6a5e8b58a68f89ea8c437c25de84550730e669629c69c4dfb8a0c042c513d7f029e3b6ae20ac92abaeafbfc1d8317ff8131e184cfdf229b04bd93d520215a121eba1738d4014fc8dacc740e7733ad2acecb4ed01382ac1252e620bb09559e81996 MD = 0d61f8f4238bb647fd02199f8555a38d2eb4ac07cf948d499eabd9e77c89ca753963e95e036c6673b6c88e010f34c32c57d6f103de1b32291705486b29f93975 Len = 85768 Msg = 8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112967778b7a8751c3245ba3e3f0116b7632444af38acd5be05956a52925726513bb163ff42a5a4216ac4cb63c1ab8df7bdce227f8a74412da3034b28a07ec7324e4c0e89053b470a36c4969c449191cc953cf4b5e85a9523e9b89af802e4e9ce75efe0dda872471fbfcf82b370b90b8013f7201af964b9e9ff3bbd886391756bd62341c5d2528aa82d6cf76eef2de45961861076669c95c70e141ea0698e5452996f99072be4f9eda8245d9766f502a0a4712a91d60a12043ecc230abce26ccbe75c506c5c2f7c36577d1df480174f9c0741d832f2b516eab6ea368d0595a71de871cebc0d3bfcca62019d4ee39db297af7d812362a58abf9ff6bef0ecb0ec92c3367cbfe5115ff2f238466c378e12d7c7ad8c2acde257cc207823fc183a2270a133c03c8db88ff62fa9801825f359a575596310dc75635962f9cc79323b3300a9f103fdad38721e40dcb41854d36e49e10a6d9c366598ae8d01232fe1bc068a04f7aec8ec9af2b14d5948356e36390b3547129883badd12c8168fe5cec38356d9cd2766f2e5f6f980a9a6371825a2339699baca6d7c19cf3bc27865a15b92ab51fcd89f6821653cff5334e6fca691082e87cdfc9ab4362b0f8c467501891bd3940b273af65729c3f2df5c0ac2c4eed32599b3f4b26a1b6f6cfc62de96570614c9827e01438e29d682d5856a1284a1dca357d57b5ea4b0e2799b326709cc3bb718ea44baf8ce4dbdd6be16cf92f0926bcf4a9958466cddce5ff01fda02f0a303aac9e12ebc1f7dbf18227901ed0faac8d1f9685511c98a79458492fe28cc2442a7aabd25388aa1256d8715c8c9e9cf3bd2ecab3867c49f2c54ddf19a2467a7ba371240671416a138ff7752eccf87ea0bfaacc8caf263042fb485a5779dca15b5808bd2bbf7cc653df6799834a6f0e48170c029d357b0a2ca8c04175d3cfb5479ad9cdbea89b2d67f7a164f69f62ca3e55db0341b41b35f4504e0ae13a9044e4ee4cec3bd73d3da45b1d4df536944117fe8055369567324e746a3d1638bece97e4da7f2f95d345ad6c63eb1baa53f15963a46ed863ef8dafa77d4ea138bbc0f5012b1d069eedf3f7bdfd92b66522596737afb693ba24a67c4c2fc60ec507ba70b5874c6d4cfdb6f7c252fb61f19ff7e5fd1ad314e2a72b58e4da29bb6833199f84a773a01a830d421bfc7bbaca2d4b4a067e3ac877d77aa9f404e0339cbe7cd5f0d4295b920e755b2d529a0d694ac207e632542b044613041c489003cd1a42a88cc5d40c4df06d97691decf65978faa43edfb5b8f26382eba01d9fa893c709abaad51a1ea8e984ab6196dae2155863a352fee5feecc058b531ec959e6b553053ed8a422f3d5a28fba955ea7d17398b89e4e85b693ddd0315443de851ce456515d76e12aa65b2e90ca2e3a203f9cce0cc47549c946029f07059aa2e6f37080675caf8d20ccc943352e0b878331762e1ef0cac0fed1e37cf5ad489ce43202da2f86aa326e2dc6ea662d56d03770a9c3d6697574befb276ee3967854e8a3416a912290577b91fb2a0b10349aa4c4de921d799fed728b777eb9065053580cd63a76778885afc00f0b0c20cf6f32f4bda5d96670b1804a7ab25f46f8209e366852c4cebb437281ab9551a24fd649caed03f4790f4a5200d914be9e994320e9a0b8656f51192c9e77d1c2e1dc58510c17b454faa5404e743bacbc555b4548ec26763fa2718f45dd1ac648249c7cb283e2c1e3315919de70498042b565ad7d09a1943caf432e25073d7cc9b2bacad4f7f7318765545f69baab9b3904e0032606b91843ddf07d35e487fc2ed45cca2030fd0c2ae0bd99571b0802878bf3d0adac170c3b76a005db3ba14d60d2ab05fcf59d5ab3e8bd500f5b08bf1692c79a79c363770ec07a4c80d5327746f4ce02d10f7f240ac67c0bfb4254d8cc6183ecf2134462a304a7dc8d7be383c782ed4908474a7217c2215282989458933f504b806363d4e2894f3d68f35c78cdc332630763a64ac223d5ad0c246f44527656418b7d68d5b39998f57b05445e3f00c3d7382b3db6f333bfa501af8ea6f14cbc557b27fa6dfe7aad8e2d7b443e0481c82d0269b4bd923808c1ca019985570aab10b82ac1a5ab75b490e51c031f068e6aeecce3b667877bd78acde237ea6ef74af8aa4e6784a2d2d6810daf2a092c6fd0a10062e9bdba445587731a10dc1d5dc297ba5a9113ccd93aeb0cfd60045e6b24ce05aef5c613dba9402470cd634c823a754e18e9590fd209554ace4e1984cb8bfd438f838b7b87fd3d49ae1687e3afdb18d04e175e54046a482fe99b4f87d82fb722cd3b12d8917607489a9251cb2ccd0aa6c5c32a84b8864b2318f0af4dd738830a2fc46514413e258bfdeac8ea4137d33a4594c6853684e68e21f53fbf13ceea637fc78c15df7d1f789ec6f5293641f9f296323941c68da1d8cd5109c5d317739583eb8dc5b35a7e7947ccde70521506387f468b9eb0c90569e4ad15485e3ea60804d9720a05fec8f5bea78da8dfd88273c978c4863b5f99a92eb0692efd690b24c93843ce1c918854ccfd0ab723b5f30a3c6fede0b078e50173030f61f8c12b529cb106f8413a43fd39775b8767d2e367a0d40e94573b72d77a4d0fc7976d8df843ecc570bc21835acdbc8afff257d9f1bd4e2d8978d1c7940c376f4a2295b9808790871ed56fcfd250759f060e6d5e105b8654a95b616da1f16939d1e0633850304555ead44cb0cd8949a086013cf92c41238adb4814ea64f18a75431afd91d206b536bc00dfadb341e1976614eb32ad38ced8078612c847d342298a188b4c6cd186327ca2514eed40e48b8e8fa291fc082f44155e828eb1613b5f8d2236f2885860511202c91be14efb85e5ba8b9f7f79edd9ee188cc50a611a1e3480250a8d64ec9c6668709df833ce8c55dccbe39f52b19c78fc5af4b99c8a6f6779821ce3bdd11a601c6e5b9ab604a8c63f8de5c45d22979c5111a328da31580e5672b0f22bb8d3e965eadd30a145e11e29f72e5760e9d14361dc5bbee3b7e411601f4f217649d0e78d0cac20ba3b4046e33145be24ad525372e1a2e37ec51858dcb180da652b1844dafe4fd4ca8ccc26b564b263711723b6cd4803ff7503fecc1550cc85c107b3e695e54eb298e08ea6e6b8feac0fcf4b52ba3a037a8e189d535222ba885284aab705ec3224eee08cafc054b003c57cd21180df2cbd92adfdd6da52d24ce04b049d743882919233d027896150cf5cc6c1d9695e052e4869273ef6069c393303c98228f4c6614d8262f88a0667789d571f94bbdf16367af52271ee67a1b81255024d6a4687fbe77548080b6c7c664dd4f429bf8ce83eeef8f6590a9c682f47e9b6e682564bc928b38c4154ba170037e84880bd8b02ac6d1bacdd92cd79079866ed35b84d9d32d8e53689ac19c0b022392481fd04ece9bf064be4cd245da9ce75af215453029ebeb24cca5db100ded56f8f14c6202f5eac60db5804c69b7bb1bd05949d8f0475a3c3d8ebada95ef01933922162065272fcd165207fdebbe708e7f676dc2a2a204fbfe1d4e52a634fb62d349017e0dd8c7603ef24869246549d9a8bad5a4cfc058a4f706d4c5b956374047d492ed35916e49b844c610ac32a367fcb225c1b038d1c1b8c9e2c657f941b607534ee094d770c442980576fbad09c3dbebd2dc2c620ccca3d4fcb6fa64b72eb253aa1aa4117b6a4e8a8b1e9b3b0977d6c671467ce2763058b6873a294ee424a94418dddbd5eac63c8acb89f3731eee7de065833a108aa737fd16a26d0e75328ca32fccb4ab4b52ad274b1bacdbb6b221b83424dc92d66bd2072f822e29c6d2bd0f6349c6f8198a10ce8e761feb6d4d72bc71addcefc628a773367be537758fbad737e77b52d1e6f80f1a1bd518af2ad17b9280d36df65838afdfd24a9dedb4169932184a3200f3c367526f64ea08d4de640b3038b3d365063b604796f3bc0a50d3d67edc1c233b2345dbf337d5e6d5ea04605e7547e9e980a48c2e82af5cdcea05996d7977c51778492b49c672d59894eb264e21a096503859980966474cb652acef76caeb433332efb4d5b93761a76f66c191c6448533bde9385aea4208111b486d2d48dd39f8f387fd295899f78cca35b6bbcbaa22fe51d1d1b567361b97b44686f37bc425e32ac088a75d2123b345a69a4eaa47fc3ac481e88b6589f394be55c15bcc46838c6917dbe20f5352b55257d0bd0ab47d535698015f8db42ca289c4a0d8b2cacf4f0f0c5b6c17a7210d80b7fe79356632e2b872a0a4184b234ba731aa0cd7c785c5ad0caba7eea30b1641558815e2e399634ab04afbcdc573faa71b413aa3d3336ac3973127fccd6d7a249ee2157ba32d5f8dcf64b8e6a9ab3a09e01b149f6444b8d34a805eda8ce4a39b12a0ea682b6b22122e828e2b6e1574303e7c1d32f1563a6c751dcf0077fd2d255f492740e2ef65485c28cde4995f43ca74f8a6f700d469ffd57e0af6f5137153b35f3e9e700693b0e6cc0aaaa1f5232932255464294bb1fdba056536bac40a96dd37a2c9496d37ec4ce0c6f61e539cecd466a802c128bce6b15890380f8b737f3b86f669d57fcc5b0d1b755f75171b85fa51144b7ef7e56b49ec0e8389d6266d3ca1abe8baaacb7d85b0b83f3cac197502692ba69945c5cbe24422a1a0309df17f3c25de4f9aafc46554e22ddb7f314a9b0340bcd67ed8b928d58f0ae93764ac71ab16a33abbf3d02a8c9593e82cdd6712d415f68d1f98837c34a627db3704ee9272d0efd28b322123ac4519d921886b084ffddc43b47feb5ac60aa0eccbe9387017f71ccd74e5280f58731824f9bcb6f9db7ae680ba0931532e2ede94729c2a892efba2722577654c059227521204eb560b0f9dcabccef5e3c1756978a798355c1c412977098359482844cff706db68ab534e7a98193bb98b1480a9fff767d957648a0a32ad7384a254ed6a7a44cacf68489a056f7bd9fcb7bbd34890de7597099c18dd3b6dd267d9000e9f62582d802b5f84b6b7311420081befade1b96beee137800af7d72a836abe1ac735cdae1b530c911705f584d3fab93842593495518cab522c0e75d667c5e3b48a6af1b7018dd4419ee225a678ee183fbe6dcc9c6f5a7c01a8d5d6807579154e417870c2c31a4b18c6d24df39f70bd787aa5edeb88d92e0119e455934cf2c76a94f4d77be0a6e579173cdaf6b8111d84ff7814fd3e9745e2f7c08f994ed17e7bfd56722cdab217f518a8591a434dbcb7c58ade6c01033829bae0f10d0b83bef4d313fd5021aa771f339b44f8c1952fb35524a69270ab9947ebcc1668f397ed87bec3b5a0561e675a009c2afcc375cafa36fc0a1afe0ecdcff2f85c27a76c9e8738dc5787d88c8d38080177a0c97e22eee3677560199b6a2478ec5ee387905695a9c44f6129534d2ba281b77f33fcdc13d2fd850c53dfe2d7d61e8b0724a18a15ba1209d6d9211bb778937702a3903b0b8e34956a2d5acc6ca3156d1d0efecd99b25c035368649d6de29d12b598d6e4389d933324068a7b556847619f972675845b08e86147ac36b189253722741f5c2d599ffaa48fed94248e5b24f96da73687fc8f157b07567c24c4c230b3c5f7f74c7ac1387629f29b5c9d9713d4e30f74f71f75171b27f1d23a3ddabbe41eef6a28499d99035547f5500ea1ca9ca7bda5645c4179dc1a0cdd545cf5155def7419437e8b78f6a24c36b169f195cb2c306c520b7a9a185e15f2159aa7f96ba8148920622174aa818dd3f3280d11ead1162e42c597045a849bb4f07f49c4b7e94f3e419ce608b9837b6197d16acb6636cd6fa9131d453cfe1caa77937103ad1382ad19974fa18e28934411fe813ee7ddc4a5177c83e91a4b07270d4fa422c5c76d5a2ae9d4db92d1640fe3f7f6c8ca369a62f05a414c9cfbe9cf443c69ce8c755dca07fd0c13821e7c39a056120597c1cd2dd634fbfc1f8133179ec228538b9de27103595be5c6703a35b9a18981db1fcb7a3ba51a842c6b81748f79665e2da189e3df774aceca772ca8a262c3ba0e9113bc832303613e1b438a98daaa5afd30b2a6eeef6f3b1883d1e6ed02370a9cd644796f276d0fef20f7ae3d6e7ab674cbfb1ea42a2fb73b36b8951c187a10205fcc45323aae0c9a1d1c740f9d4e0d2ec3d1cfa1a002cf9d004f27921df357138e29848ec55cd3d950306061efaacb75c8c54e69e99ef0d8611402f17b494bf0e1cadbd76feff2277ad1f7e6fdf78e044b440f6f8f4aa757d985dbbcb8d26b431b4e9fae82dde40eed5f9f0110daa134abec7724d9ac7fa5ea4306566f2521746b136466b6bd25ea3857ea42f0cac1919b1d3a1c811ac64d13aa175106b83b2f81c7beb273e43463dc495e1ef62e4ba57954bcc8ee3c37b7d649832f0811e4becfca02f433199be659b26f17999bcbdad72163bca9772070b29fde62fbb8cabcd598c5be8c93c8fc3101a1af6399aecc2511e36a2b623cf2292b8d7f4a2359a413c29b63d909481fe2e57a58ec8e80d3f394a053ec73d9c6ba5b24d68bc81dff0ac5e8a6b0d0a5bbffac6da68d00de9cb3382efc75228368e6cd192b394d94484b1131d99c804e7ad7e4f00add871480f46ae3d65e04b6532effeedfcafa38fa25330b9f04aebeb71c1db6084697cf2b27ab7383ff810f1ff3522a56b974889f49b9ea4981a2830b2cb5043160a96ae5dd783257e22dea19f4623032ad331fa22904326b8c0217e19a598ef8b432745b866fb4f49e61e3eb72aeb4f5eebc5aad43a088978c5409c4e5699ad0a9c97806a2e07fdc9cd3690f2e960d132676b60b1a2d51301b0ec54f8e63dc4bb9e4e251c379076265e8f5ff58c6cd0ccd08de661cf930e7b098c6cbf5e6a7ec7d0b5fc758a7c03872291736b1bf69654ae92028dc928c00e598aad4dc50a2156ba32cf1e2eb5ec149fa494fa9ce569f387e27ddd997e72e0264ddf472304f68fe52e64be2b2179f75f31894a192392d0e5e51ef8467c6b1cfb3dca588040459bd81284fe8aaaf255ea9e1b04999758154f03af87d809f5e85dc23526e5a656a21b44f78652379e59c65512d0252905e74ea4f631580f566cd644ea59591e70cb372e85fd8bafc6287dbc3655c4c1e0706930bd9fcd75d7d2ed2baf9ae590dc3eb336f60c3efcb2ed973d4e3c7e4730d8280fca783f23c03f2bdf4d9190e4e32417c6115a7205aace9a3f242c5ba33e4713a9e565b70059dd16c88ce56202cba5ec459f902fb2f6f3102a7ece64be52e4b366d80e3bf6e9d4384f333e63d2dce8b91b68557debdd85806525caa07eb3d78faf6a1ad6ecba4c19da0c469c3d601606af34526598a8ac735ae1c718ccab492fea62328dcb126c3fd3dda214299d565c6bcb2eeea1a08f7070796dd29180621c8189fd6a793a5c34a06ffdd380dcd141b6f59221ee0a57ff0fb766d8b37b49dddaa72474df7a4580ab8afde22865ae40f879260468312ba89f6157321ce427fa5f844eb3e5194fa95af54a480b8016de9a2091a2f55c34f48840ebe6b20323fc76e724307461a139177a8d0d0f7531a502b27c007ed29a6a331cc8fe5f1f666a89994df2729864b849df6e3a1e8b261c99f78e28ecdc849306bd9681098217ccff637201c907bfac57ed94d61f0c1ecbc7b6702125c21af56aeafe789a725fab400b3b665ff6db9fab6ca8e9f93e403bf5b9c9f313cc861ac86da7eaf938668db4594f281eaddf18ac24517c966ab5f389c642a79d42ed8a860c3bdf0e1c53fdc317574fec73f4a0c2dd3895ddd7a47beda68343aa6b7acb0e905f60c1654e80d50bfae4b39242be555e053fb6cf365c872133d224905267c6c0bd73fa5d81a052fee1ee5a50f0facd705f7f0998931dc1fefa59f2f9a0e61866fd23a14a12e4a2b9b475c9f627dc93dbee5fbe7be246020782e2fcee8ace6b48c7759e7529d42d011a82e8cb0eed0d675be6bec04c60b10270742ab738a92630c173d926eff95ba1bb1b9f19ceb4a4db4e1cefaff8f238b86f18649bd3feb3e496243ba58bda955f404bd6268eb9c0016e0a3a900e84fef125d592e38356792cec90aa39260041055117753c7785ca9f64b787aab89e6b743ab39cd86f38e0d26cc00f2be8f1c959958964a1b19f287ed72cbf461cc9e70b57ba6abfc02c509cbdbb53c3f8379324b5a88b9d638f4466706fc8ac628cda7c24f3e4e39dba315487895c497f5a092d587cd27ab5de851fd78a8c24b370ac904865f38b2f6bebc074331405a4e0913e270e227ed0135270b384f2f637fcc50f6c187dfe9ec6e6a92ac0623f9053951dca6561f3dcb61522ad66e16915b88ec137156b8511548bd651382d3e6a3a7c93e889791f005035fd6c3743c6762c6d6e5263a668b09b401192a45f4b5b1eae682983504b65681ac999ffff5581e1cbdd640a15efa4256e20950bdfae8b869364375ad0be33862c4edbc7fd5e5f5e11d716139f62157a7ecc017595af21fa934fb716e0c29132d354db962529372ba52410852e082a20d6dd7eea6996460216f054c0679da7f577a240745ffe32d1f18cf968a92a0ca1e01bb67343aa21278410b45f4f989e568001b369932478d75bd779c5f710e385034e4e170b34dbf045777ffb7ffb9ede5639dc7ea9e430c54dcc3aa30202d652a63df1dfa97c9be6c1ed5e9ddf0ece13611262ba898682242e34e10ab1480d9233b145d105ca8a8f603af84b5719577f0954ee261b52977a66d71902ec29b1cc1172f2f80866d0768b25f70fcf6361aab7c627c8488f97525d7d88949beeea89a848a15998979420a87800f12f35131bd131b6aaf687aa317aeed6c7a7e0df5060fbfafe9ea7fe1721f9bef85fd7955ac15d42d40e80f6a127f1aca4f644b9a9a152a4ee03dc37e25c71d62c479110efed12744c79c3a629cc50b23171659f1cd3164831ad7f6709c3a7f395d0abac63bf18f41c1d98e052cfd18f78008aba325e0f8dd086d7b514bc65bb3ce06c903c9d36694ce446cca2993deb818cfa3272aa051cd2752e4a8cb171d628601de505f1367be2b51794a3925b7052fbfe2e651fc09c3f61ca4ef90994ed613906d24322ded3e877515ddd22f5c4f537ded6912607b61f34f4e8e12c96a8f0516f808098f71965143d52d7b2d18f7226e2538025a4127bd5f440ce823faedc92a01643bb48f56273239819a8b97acfb252cdba865d575a2c127f477357a82de3e0bd15f39b0de67c4b5a2b6e722c16c2756bc5affb2dc52196cdd567a53dec2b799d7da8b60cf917fcbe966ac74e4f3d94562b0a463ec39cc751fec6f2162054b1dd03426298a32c80ece1067f88800df7b674fd052f5c85ef344df806dad145d1a62f296759eda31d0d94a96181b319e6b226f202ab98c4549d4765a93207e6201f8ac58df9de641c4937ba37e2ef49a972cb50035880413eb57675a3c6cb1fe8719b7f9c1d7f58c5c753a3c7523d85871fea7fd1de1be5f7a46191bb3d24d86fc3eabd5b6fd6655fb06fcbda7aa4b5cae10ce734e67296c691901fbb401bf9ff3e00e89397ee74342b149a37022cc1b8dfb8f0f3188b3df2a48c896976b76ade0964690c3dcc6e8a61c978a891dd919a427602d81b70c3c407dc358d880013544e9ea68e087a39aa7a16cdf3cfc00eb731ce85a998290e84df088df11dfeddab323709e1a0ffbfdc9d8301e166dc1e59d549e12f36bc087a5799f75cdebaae29dfb6f9ccae63e667f2997c3afb39aac6566e7e329e3398ed9416dd95723b70187da3de19daae9895a2dfa7c639e09b47dbc6c47a7795a527c107a665838909be33871f8ecbe9bcacd5dee84cc5d8d7248cd81cce6aeb196e04f4ba94b6ad63642ae926f42a1c3af5b21ca8964a2948a5922cecf71f3cdb0b856681eab5ae64518a515a129e4dfab86223506a6edcd512154a9dbe3d90d3466de5632f2894f6cf7a4723b2d086e33d0d7b4691d9f865b23cbb98e96df0e966e4f7c82ab66800242254e99a67cedfcbd9aaf4d33485e2ce30064440566205b5112618a408316999abff14930c2ed6abf13ac0f7278c33ae19b3088da1f10f791df9bb65c6f71b763dd10c6567acae267bb314c75913409a1e4a4e96f5a2effb30f8193597c2fd03ff513ad81f535082a09b57097325f1da67547d24fb7f8d8370ac9adc239bf7881a0704b4dd28a407877cf1861cc72eb51d59fcff5a8fd158089ca7211389f14cb67bd3c0483592ff59dd4a06fd03df7568df35efbbdaa4c41e51a6cd0f95d398f93610c5098103b03d47ca51bee0ec606f708fbcc669ec0ddb5101a8bec685b40ebf218bc714dd635c41d92e06673dbf5b93722d2243937c66261e7ac924f0e81b9e70da2bf70a61dd53df667d9ebad953d1460c78707f59e857670bd7b7fa7c495c637add3170efe90544c1cc8f4cf880b0741f6ff99aec886d422391888cb7bf80643284caf958a8e070079b42d9620aba622fb0e5ca7c6fef19899f9e8fe2a692daccc8cb8ce2416bcb0091bd4a6018777903e23cf953c4655306a801e945251a2d0e533b10d7dd2ebe74570a883ad26e2165ae070eb7b058586254ba842865a1c4c1ca226f7da3b2af2a95317a386127c31bbc4df1f15b4f90654dd046d38dae09add888901dbc7e07ebf23807a2ed2ac5eeb3168a49ecd263d6384b198dc6ca639923765bfe4f1b2f7f162919bf9d0091a63c6ac1068b69397fc034e4a0387c3a4e53f3b86a850f8daeaa0b97d89a308d0bfe527e72629d7a268b928f520a4cf79511088fa786e48b4056e768350c4223e4a2d5a9d396f58e94416d01ec65c2003405bcc8fe792190fcc1c4761e1abebafbcffc2a72 MD = 5ed9a434feb7ce1332733e6378c7ec0d4b079cdc80eaf5a9a7204d871ae6bdc685c95a9aaefb7246f4e882428b9b545e9a93aedd4aaabe1dd14461fb1694b896 Len = 86560 Msg = ce01369d08d37dcda2c899c9fc0d11ccf94a0051b2816a1d6c3ad07fc8dd02d73a5f3555bc205503c4149d06732264210fc93a7ab30933a1458183cea9d54b6a3452b3d164d53957cee84989572f0db5a70386acdb5cdcc67af4f227aba93e41a523d89a66b8d0cfa88cc5da11fdb390aa3e0d6d92410c94f4db461236238263731bcb372c92c3763a483a810754ffbbfec3f64840826b14997ea617b209c0d88880b5301c2ab9516d64d006a3fb993d8dda6ac24de5a24d52243bbf87249fa9ca9abd0ea04a5b6a2727aef24cbc281e3dca91652233594708162d911d3cc8dd23b30c581fb851c851dbfdcd695d5466f8dd92b82533370ba19da316dd19e27c7a11c996013d4273d4c6e41d64a7c71ea5599643bfafe5a007ffc5d42d82968fb6fd1d51ada1d77496308c6ca462264e2c87c48f586d0b0e2084bc5576408c1cc1bf300f8dacb7d281631c4191561cfc75af45235937505ed676b021211c6b2e829f295b08268a957ca6bd25934a4f326719408728d35c970f1bc8be94dbdccae1e530ba86d6fac66e40979f120867f7ec0cde442f09d8c1b5bd2db6394886fac6d86fb66f85ad6b417ad13776560d54ebd247e1d5a36ce5afa20791772a12c519c10bd62cfb4b8fdc9c947527fde94f4db1a2e68167bf0ae5127dd5b5482734c2e82fa223007d3727ee07e28ec5a2f3f8f217dc9d1f7a383f57b70c5d6b6e4daa9501a3bd5ceb6d0ab753051175e045d5dcd04a90914477a5b8debdd65b8e1ab710a96062d63c386d419f6619d74d4fccb9f2b8c286c6d0ff7c1a7188e030a3d2a050627b3818a138d2148e0fb18f18c6cfa8ae9bc5a84a35ec92afdbc2fcefe48f1e2f6e4829ae53b3da0459cc4ea8a96818b5831891ee2f506fff37c89906d3233a51a5cf1469a62c185061f033085fca6a54e24529c3d6f0d8e904bcb0f089a5cd50869484da1a84f6fb8de4e53fce3dc714201519d11013f6f6aa64e8b5ec5cfeb27b611f0895059d8c47720d55e00b577ca5500920c602f1ad9188ea5ee692f601ebfc8dfb00f5358bf66053537b7a4114d9bea0b9e106f09721f25ef35e8ddcc43e2e77bb449de58101775e4089d4ae64252687a347651b3ac369ea7a3b97d984dbbf85514745d6f5d27fd724f15fc5f5ef5266e6e2679b20ddb439fd67f615c82c775ec4f335306fd04065079b64af4ea008e48b985698d1d99cf183c9f2b718981eab1c2fb41a776382b1f26f2a93f7a111a998537839d41de9bb1549d5e8fc877b1361e20bbc96f30c63ec55fb9a7959355e18fa17a7b013633ebacfe5cffd61573f9cf6833f53e8a722fe351deb5b2f3bab1075790af021d1237a436c95a28f7ad6d55262cb37ab1b962ff7d9b0258ded378aace68919b1fd115d8db0617477ac8112def087c9a230688783770e60da11ab8d87a84cb52aadb16c96fa5cfa82b5e85d82779c9136ad400ec13f2f937d70ae22ee067c4bf4aaabae4491adbc185cb2bd263d3217cf5cc5cd9a793b46e0d2e950c947416477bca62c80bf7e42a26a883bb28b6fe4d603a0cbf46c59016aff031f00b4c2871aaa4aec33caf41586a811dd0ea97e7fb16b7910b961b24d83bea5977b95283c483e40f843fb39bc2edbf6ad23df8570ca5cf6a5cfa06eb193d877c122329a0c663e30589a9a75bf00cedeb3d775ad40889ec2912071b4b6021620a4ded2417ddd73c1121eefcfa7664872f613b21d7652f883dc921cace2393e494895be451915a59c30b94170fac7105a7ec0e0fe9a9233e28f0fe880c09e1899b6303fcd68769c69b952da80438bef3d53c4457734af1786b17e1f55d59a6eb9f5989b01f1691fcfb6d000260719adc37e0929b1cd116c184ac60756ab9606500db31a0a3c54f8762e1dfc8ad0db12950675d6d3ec20fa3f63d1e8a8c9f8a907076b0610d1a0ed07292016d52538e55bf3f293061a4489a402860c76b7291f86eaa7a53a39b6c72ab0c1952f8f98f0bc4d67a772dee5e0ee32cdbae6fe923074be4f41b1fbfc4d86c9e8c3bf9563f9611dbb5b3ec06bc8c6f88e3920259aa47a8c4a209d9fdc49c47f7de6aebf02c9f26bd8f793483e09d45eb1d24db4a8423f5b828a25adbd818bd768472395db28163da5c398ffc66bbf6b1fcd953326d36c33dec971ae07bf84db912e47a057de759d0a06766c6bb63027be721f2b7b1fa81c4624aa2a21c95792e1e24267deb2b892ef0a541896b1ce9b770814240fee9c1fa2e2f8a77567ab043ead3b72d96d87243c155b89ad2542ce33d99ba44a08ef43da4c82af6a63283a91d55a4aaed7895cd970b2491ada33c8d82bdd3594354a91d7aa71c96884773bc3a3c976c7b86741af6383e043984a924f47025e553c550f7f44ec7ed791400fba5fad7e8ad8c9dca435f3d492272f33817531a8f5e6b7c7bb611c5420532abf605131eb61ff5533a1302caf6d4e89b355fd9299dcfb19c1744a29d5a992de529cc17a44b3f4b6518f9a56f83ed6001bb2264ebb7243220490483a89db1504d055f6b311e880923b54bc98386c883d7282398d9620857b98f9a177f71ea64342753902db686b92fbdade1bf65f2ae8c0ac7e76b04c8bcb85959d09a7db0b43afe3d28f289a7d5d97074807ba7f84a90e183d3293601bbbd34e861821780dad1f87098383e87d9c1ac541830d34602663aebee8c7c2fef38b0aa2cbee5f74299a49250671b935f689fb12b775e6840ac75648c1d2dcfc1ab5b33b4b95f6085e2911703f7c766b14ee9104cc7cfdb9fb42f825e53e14dcd8573097c09ea791f5d3c730572b85e89d506e5deaaae1c7a1dd7c9b7b93d468d77b69fe5192d9d695a153ae76064f743ab87c653886fa76a69fcaf3ac578366bc2846ba26f7f3a0e7999d32c2963cd6932da266df98b18eaf91ca759f14889f3267af1268585fb793c68e046662b5d84fb7c8a607686cd667b965687d514ddbdf3f8c4d3f3a84e3402d0c6b88f32040165ed66ed67f9417732181166d9739e16bb8c5b4d227caec96d800b151cfe6d7922bb506776492197ed107c5986db47b7fda428f4aa699993fce531ce880706569254bb6109fcca42ecfe0be255b266fc3aeec26ce4059b3e017ebf5758e25b2435581c6cab9ac802b25f2493de9f786de3ba9c0877b720224bcb283227f6c85c9c1407dcc3999741edb27ad08a09088798962a69de24d4eb0c48f1015ddafa8a2736e253fa7fb4aaff76634ad07573d3ba1002137fa505f2f3769e2762f55e17773f4044a8c39c88583962455a7b56dcd8a69777d4de4fd471d2a426efec6f9f0c7bb62166ebdb74986a1c6270613dfd64c87f0986272efa07fb97825d169b8b479aa89cad8eedea2096e624caed75cfff040d6b0c160fee364feccc230a8e56c91a8c08f4f34073913e540eb276bacf07d7e6fecf317f2b8d5e1866da3ea4abf159f4e8d5df7f8b5aceea72df7359750fb2805757f0093c6d94aed50b398ad560f767ceb899f7ac0dc71e13aa89fe5c77326de73ed82a8b678214a90e718d7d8861592d25b9455ffac563439c20f5dffec60420dc604fb2fba4ee558c8d390ee8364d8695c3f511c2385e952cbefc89d6ebd7b6b90f052daa8b906cedd319f400d4a95d9130636bf4ae747af4da6ee4c0128d0b6d6ad765f494bf51aae9bce752cb213490952cb8f27629875cf9c97b2ae8688161da32f65a6eaf965c377e336e88198e2c48cd935c5df22cfda398b777cc0ecb2ef3a4494c57f5cd7a52ea72a4aa06dcbce1a285829472fe3f5e5914474be44b3d3da7f96b0f36497db29e2fa59f7da2daf6680a15d8005d9a80873c19c68d84052eba6106f2c5aceedcf5c4d1e6e2630edd6a9b86874ecda7b0af795fea6ef82f3d582ad081486a36487dccc9fee9bfb12d46a4452092e0ef753e668a261d2a13e00db1285922f3fc6bb2c1fe65d7fb7a6c78dee2329129ca34b07e48e7fcac4bbd579eaed8d9ec99ed212edfba51b8b2f17d85de4bbdfac075b24afccea1d13f3ba23db49ef1c6a713457dee4acb7a0372b14399da7de68ace90371648813b76d18a38da09fef4ac948c39bab5c9b1e456d092c54d557f6195f6dd35c43f6d8b158bfaafa855f902d781dcc589b0e2ce2447edc132d917ed6232a7cbe020c9d48e040d76089b665262c2f19f15359f294183cf1e196d6296c9f021692ad9f2fb91aedbed8933af03bcabf28806bc599e6520c14c7fb6c1e6239bd46de2bf5b68c6c90076d8b355af4bb96a40ccb98495d58b4edcb419c86405b22b6ac6656594a40ef5a2459edcad9677c339e5b1a298393fc23f851ae898f6cfb0e03450c407afdd45d07e5ab697336387d3d039562df6bae5f5313ea4ed6d40ef5ecb05e94a40b05bb1d17b65e4991942bf1ab4f1bf9499048e66f98fe9dfa24146d8f937d50d24a1a6ed858d2e3de56e5c23b917d5a936c87b84effc06d48041391caf42207ba6d23030ed7edca864752b99ba3b089b308c3d19668bdcc2578995d4ac9ac502b347de3a37cd685f22f1bddb3cddb0e0f2ca53a311b1d45f9464edbf55a42b48d69d0167d8fb69c89d6e8376b57277211a2d4fa0560075d2d37dc12b4ee0dba48d2c6a58658b498b20360cdac88bb3c1f31f919fc7fa39e2713e80a70ce35eac4380597a41ef900d7802ba95caac0f4a3a0bca0fdbf1a8f50a21dcc0f43e1cc696235f4c12bad5c5f13f2d365035d2304b8c496ef6a94b810ab205f7b9339e9a01affc5c4c5f635b2855d51addcbb50aa41ba03bcc638a2d0f89ccb9a0666c8cf260b119535ff11389d132d1e7c0103fd0345ef4b1c2fd4f64f371956e690f1604f00e01cc3ee7b5925bd6f9f2d58c465c50e6384b3a1d6ec7999509579deedb95d863a41b6ecf87de3021d1735e81c4a51bd664fd5b531183e6b784109794344184728ec5820120ca18b4170ddd892146df90194c8936ce465559a41dc897b6748e8b105efb3506e25ffe2916d51af2be26a3b3bd5640fb7b8febc7d3a351e8cb414de74c4cc3a0b370709622d7af9f777b91c2c4450a3f8fd0fe9dd6da5b31a2571b6211f94594ba14bbdcb647cfae1f68eac505d7eaf11fd2f2649bc02c27963a741f4473334972a7206b45c7e3a4f2590f48d6817bb6980077da96e74d310365f87d686d054559925ec055ba940aace68fbccac424f684e3ff5e5cc226f49664191ad22933fefb70b78a6aa24945bb7bec9f67228f4762e7e96e51e351d8bbaf4666364a57fcb4ccdb17f9118bec8a93967f102f031fbe96c6992acd4663ffb210ede942e9c532012a07957ad465b6b81dca7a4c38f5f47b275d2bd28d1cbf16f9208fa551cedfa834b7a460ab57bc73f30fea0c9950a10f8c38e9a59e6986487f9c7de438903a3c7bc6ba458938f831b6ce03d29cb650ce559af8c8e2d0e1c104b0587206afce487fb35babe660168bc9734c40cb9d60322411bd9ef2f95e0b390a93e134840836b0ebed065b8383ecbb9e27d99e8c6bc5783bcc9a573967a18d19b4b44aa37481afff02e75109ccdefdbd1b0f9df9e002b2578a6d88177b0e616c3f6dc1849fd3dd6b21b15f795dcd103eba55326c497463139b6afe2a24bc5650987031ade687b99ebe16df48b35183c17a4d046a24951aee643531d7d135fc85545e0395e537d5285c6a68fe69e6d8b3df498c69edef4a56793ecba72cf59468f799cfc3184eb086713e8500ee078fa46ded22e221dd61da4eea142e8495ee79f6b5eecbfc36cc4790f5ac06cc3e09018aaa70795cfa01e849e9a3c474714b46d634f8f70daa88da3042566660e4e559ca03ed75fbcf9b1f2ea0030f69223b4e1a99770ad8f486bcd3870ca658b6952ba07c029e8ac8adcd319fba65ff234f0e4845d14dcacf466dff46475d200da8e5b2954829767fba91074b227e92eef6e5c3ec90567f75387c18029ee13364811654c236cd6b4f32091434e3afc10fb38331d05cab4390ed55c24e6bd92f55ce4c2b9546e0d5d1a483ecef668005e01564f6a36eb2d39cc589628c46bb504be0e58b81011a2281929ff5cd3385de1a8ce9a6c87f038c1361958d3ea7fe62d159711907fdbfede98cbbd360d327c6199aafa6d1e623f97f41f8b6f80818c360988d38bc85689473e375ea5cbdec3a67bf259b323c9a984ad731542b0fa0ee844e888ef140aab2ab474ccef35c59b77f7ac9e87bfabde50091be095a071d60b6bbf17058a7ecd50a28aed5c746e6d9db5e2b131199246c3b221d2af786e4b6729166815533a5582ae82ab36b0619fe15c9b7af95b0549a54d8cd5da6179d5c323f4636796c6ad868363edc310279b0994e0e027aa8d4fbd8565d05c831bdce90461f0427cab3b24c7359a4dbd47c7dd07b8ce0231b1c0d4ffb3aa7e05dbc89f7265f7f02d70692623009c1adf498d275b2b29d315f904b2667e4d880f4202ae150960b7d09d9e523ecdda729db654ad3841dae281ed831f60cfa0c2cbd7f0de975413e08dba4172c1a33c9f1f1583384703c9779b16a5e395ad8b735f22fbf69d4ff8b28d50bc4c538baae88eee84902f78deda8bfbd3c5af20f6e5f3ab8bc0d200f877f8e676a99d8c0c9412cabe7d99a802527a24738f5330c95eb0fb0902db71f975f605d75046ae4aecd22f99c72d9c1b29901aef072be6ec27bd99db8563aae4f6ad34470bf7f94d38f7a87d35925b12a5f464adf6df494888430d6b1110b1a24048fb2ea05876fbc0a8bad29171edd00fcf8a17231761c3c86ae0206e8a901a9bede2f4d8102c3dcb0eef00a1715b3caf481593587a374631599961637a4f3351c572017bc824fca250ce6f2e3bac3dcc888c8b5bb0d2ba0939c098b988f4d7a9f732be5127641e8e98df88ff76e8bdafb67766f5623b059931dd2c385b89edeaabab9121d6f68cd50babb1decb18a3a1fb5f8cee387811296a7985a89c155c5d0b63e3b57ce12fbfd3b95391e243d7e87fca650ed993c4010c1b0bd1f2a10e4a3ce41dd3c22eee961891d7e1627140cc6943591dee9308683e4c267b0634eaf969b6a54450e4b0a001bca396f4aac897e14fd0e21e81c4a828933e6d80d6d8b1b85fe5d0cd0b5f27b7c121783ff7568f117832261264e007f378bb70078fc0bb5169433ee2ace2716228b84eec5fd3fe1f45e7b1714443cec783054c43688a5f5d5c295836ce21c6287acfe2a2eb252a333e574be42ad744cb3d84c9dd681fe504befee472790470343ed0fa0aa2355c76eceabc131c83b3282da0ae7d9865956d192aab3db573b6acfc225fcb8cebdb0fd609cba5252f6105dcc2c5cafe45b7c1f41575408b56dfb93d2dd98eb12ff127851a42434ac3978bd050d46da4a79227d8270a2202953482875930fb1aeae4e67f87e79495289de293b4a40d92746fc84cc8318c2318fd30650e2bb9ce02fd734eb683410d44bb31ad54fd53cf9296ccd860b426f5c782ea5cb49371d56184f77911ddf1ba0039a0a49aa7e763eb4f5a04575997808b0ad9f6b330ca38edc19989febf4da5455e5902ed69705666e29a5915e988cc4ade24ba73ca6dfe90fb8205e7effcd5f974814eb40c97b0ea96b55e022ba0e2ee47f5305d29012f317cd9753336a75205c143115959037a61b5d39c86e988c95d8b71e1d7142fd4b88ac7624a5cf625528ec5d243155cbcb2851b990ae9e78981f2c2544a559ff30c6e745394299055c7222f19da0b4c7cc54fb6dff4f4662b40c610111fb2f897177007d079651eea4bc7aa6f860279c4825accf6aed2adb5844d82a1bcf4e3c5c0d7a96161d747edc8c35e5aafc18b9bd1f084649e4b633234d1418b8be30787efed818fb448b465255f7264bd112b0a9a5706b32e2730a738987457f2460de48cf8b8e1da800d5a4ae30e1518ba0117c5d87b6ac52dbe1e78ea448e5be69ce5804175e03b47f9d51f975cf42884b4cd3abb0b12ca26b29edb11d9b72d8c5d90b110e1123f6520dc8bc281895637ed31e148dd32a7dbb7304b545a5ad0fef7ef08ad24014fa12b7a79aea85c089a534da2c71a52c31173dbb0faf000ac05130a6d5f6535d1c4c2b4cea1f7f6a7768f28667fe9fb86938ea7f04cc230296859e7c96fcc352f968c9473e496de9c9348ca13b973b35828b19cf492f972aff1709002258289cfdf322150bfae9c4eb9273c93bddf05a19784c3a414bc4ea666010d02c9afb91b675b634d7967b924b0d385ccd35676c9a9ae23e819344d7690b364afa37a4d79f6b063535ce8bc883ff5ada84300903826d8c4a9eb88f687372f9ff3fb0cce5353d92848ae5a2de13035bd0e5404da57d6a9afcdd0e1d141231dc6b5188dc410477dba16b8e49596493abce54f8bdc8c80caeb3e1167670d1b23dfdd4324b5189a4422a3c2af7a1153adb2177cbc1f40eee280e2f5413f51e8ecf452c4f92bd314d867d914e367b91535a78b23c02adce69a77a3c698e276521e0cfee335ada97cde919ef5a7e1f6597ba4298cbe85c6319ad768ca93d6e5216230c8e800c4029c01a9dcaf237230e527b0d9ffdfb9689789a8184b5ba5051d5f67981a81f6463ae7b67a8880a1cf82e0d483c34b4d29df0ff39d8f17d63d0ebeb956c2e1cedd1f38c060c9e6f63bf84e170f2129c970d3d5bfdedff0f2f7bb262eea2847d12f139dd076b97cfadd0f1a816561a1b6a7398314c3820e809aed40cf3d94dc89a4debdeca4a26b341b8fec1a6ecbdd9b35dac1fa34c298088e6cb4a3354ec87da547421fd2cada2d5e3f6beb10a60200827e357a19e5b7133a0029b2bb9d32359817d16ee87af26b0fe840fb343c3b6df6ec8a9b5a34922808714705b8cb423ae71615e3cefadb7894521352c3d3ae6bf9ee6666e0f752cf5f86b7a3121e2213f80cb3856c92bcdc57458bf9a3b48381f34a72e191761e90a7082194b3dff74835c1565caa8abd1dbe8950f7be27e3384cc9551656f81ff449c02ce18155ec6205fda471712908c533e50b54fa73f6176c33b70d18c77c82ab73819166ca26e8cf8745cba7b9c25c1d23641941e2e3a6bb5042cdbd295ec336ecc8ac4984d062fd28e27236801668e409024d7abad36da2e89c5e2e67ed3d52f2a83b11cc1058f6a8236f04c72a73ef608ef88d44edf587c26dc854c8507a684cc945a8ea0e5322cfafc9fbd52604a8efaf2261c85ac5d3a75e131696b002dec3d4d2f526f4dbe9642f8802f433a476800ed4e08e4165ef5f16485b17345b1e1f71ebe0c8e776b3314ab5006a79d9c1d95216f1ddcb5e41b23e6f0d95050f8e284796511711aee8fca957df801f2ef2c324ee7cff1f3733687e8e13564aa698a5ffdd305c9a0af08ef376867e4d286f062c666a3a67782c487daf55a32ca6a36040c865e0aa1233afd11addac2d51a16a1185a1d7c8aa941be4d9bbc3d399161fb35ed9e8674f1a26eb4ccc51e430f0b77c530a1d6c54d2a95a152d0066065bab00a772bffc480bbde8133bb79d4dc5b414d98d567bfe50ba886a93a00e76d9ccceab19ac8f856f3a717812247e31862a821e13c81c30751616e0d5ecf270f849c573b7f6498faf662d8239e1af639de26d2a82bd7873a984ab7fdb2c3b7c20ec8e0632e651ed3109c5399836596b70a17e06c47bb74e54ceef508da81022b97bd16c74c4d0275febe0a5186aa4d269325db9bf4a004adeba8c5ad4a79aeb2bbf35ae63d8edc6a0d327cf9fc7b71fee5cb14b5d747bedb01127a59673005edf8063d3e969d1515b8b41be1693bbda69e622c5844052c2309a6b3abd526b043b8603e3edc0a350fad9d87a6617d78c41995a2e1ef5aa4ec71ffd202f8d0363a898bce756268c4ce486910c759b34bcde3dfe8e12dcae1bdd66885fd66bef058f8036e50ee1b4cc815a167b2d67f9f2a89ab9ee483d83b0db39b2009836587256041ae8fc394258391c0fcf75c24fb607773055a8605495275e230a5f34653067ed10f508785e787496231134f65e91639d0ecb1a8c47532b9d848512af3fc92802bf161ae432b59a8efb4854494d0a24d5f958860a84714ec07d7a99ed0dc5030dd0521ac7e39613cd3f7cbc0445aab2e59905d4233477f78db5f0dc37f8aa5fd4eab2f0679ca4471b96b5546e6df7759598d9ec1c7fed90ced5efc2d42802a321b63c850d83659f3fa8fc04d1ee7bd6af9bddb6408c5c8049847f350ec45439badcfabf00c06381031e58b473efbe3bf94d171bd6844c2fc76ba91d2bf529886703f4878a7c26562da0d24c9e99470d3d539101258e43050f32746074e208f8f2d331c6f1df348786d571b498149eb54158535276d3cb6aeb80e9e731b479f121f6b9627e10177ad6663dd5a9874b99ce0263f4117b6bc621fd0e9aaa9204dbbe11944579385799e5fa3e951b1ad623abf9cbd13eadac817a52ed6126a5321e8fcfcb552a7e7a4b7a3a7ddd34f7c8baa2e693cf45911403be278e25ef148a225dd5647cd80b0af75fce01963e43a9c57971c1d86d502db4b523f7cc4b089550efce6aa0cd068f075a5dd2a67f29ffaef9415fd300127ffd26ef324083a9d90e0f60e2ab4f988fe2348ff9f740cf54dceaff74a744fe9044db334767de1ee0c58333d684a7e994f0b50e7d6fc85d2fb71452093e823debf29a963c2ba69032de14f04d131d202599a47f66f861fc19a73ee3257f01f615702cc01b73212655bf8a3f5040f866cb45ca8dbd7951d49914325ad0520b529725595aec269909d3d2adc7e6f382e20c5cf0de89d9e10c3766b65e129fe679fa78e80cb52e5460347e4531171401bd7346dc1ad20259cc7b059397f44edb92c6d3a37d80729b54fe2a1924eb8bbe1e856b57eaa0db013eee5a91ae7d4832c6819d505654dab50dbb40f2496b40012ecc3428f6fc4c208717cb774bb673333cb53db83e3a4eecb2f22798489e1c1214cf0719e5ed3d00d27ec10f15a5b8261de91da3de38b6866c2c47d3c88d0538f9164df05f7c96e745aca51fb554005290a6a4d9de59facc62f0086b713ee4bc052a6f760eb03f1e0828dd70d2cb3100be733a21e5a20306bdc6d227edbba2e65f92d373979121ed447ad3ca15113478ced847449b1db77ca4360dd0e10c25fe30d6e3afa527229b212bedf4262df202e95d330ba9d1ff7540c9212ef837574c9f7f06f1de7b2b72c6c295b8ac2a52e6378b673bb7c6c43bb8067609d8461f18d514a302ea9425b85cc732dc500d3b6bdfe9499f6c05ec1435767429294064a9fa1d24ab727af6b60ac32b29b9e097da0a0042fe71956049df9f8456942e10483522f0b21e3688b4f93dea678fab4d7bdf56bb1f6d7e0921dd0b0c57c0170a3daeac6fdf95cfc1fa50bdd65e7c74459687751acb09c9cee6584276f557033ad08e4209fc804d8bcf38cb57d52645677329e5c8caed7d96de77ca28f8fefb8849fd6d26cf86b9cd7dd9f0d59635259b5aee2c2ee4c0a24b53632d8c285f05dcef22b42e22501a6f4a5ab3b867521dc992fed4b3e12b41d48b43f3084c222c1e0b269f89bb8578587fe49d69112533d9648065be88d56019cf40a2062eef7536e530b69f62cedb72639e354e5c5571b3189c65b9a2670a026682c4ed946cea0cc56982d9e1d34ca440b103d00f8bdf3ff67c5e0bf78844779a30e02547449289f3f98a9dff3bd2d65c448f57f46e84664545d71c4fe11860b1737f160f1d7593b607565483af76f00180624cd1a7680e4f22595472198da5f4722828b3a09c1358bb6f6736d63fdb758d03156fdd93205a396b1b28d9ab2eab5663c3fd740ef21f3e5c3ce059357d0092fa1c96b90e85afb295d938c97be31e46b84fb341d31654b8a53d49df60bfecb7d0c80de2e02396b65ff66b9004ad946bb0349eb1f4693e50d3d13811c9897f260c809e0111e4566d52da89d74f7257ecd2da866a78d2272f6d5f769777c4030436ae0fbeaaaf39fef5ed5a45621cadf2a7a933146738557dfb51cc187256be7cd6b929c0b16b8591d098a5834791dfa5b60a6c58ca851161060eff3cc329f9b37509b4b0310283506c41343806bb342c8763fadea8a0a30315fedaac7124fbd49a0678352f5b7b615052cd0da580f6b0a21da64d0971538cb0892410842e0e05ce183df8b55eb5ec043139aa2eca6b5890a1364df5e069245f17a40f0531786e98a7caa1caf3781a114840b6a880dd4dd856728875d52cf2ab102352fb148239801be8d777020e12fefda9da1c8a92b602a324a39038e51f1bdc69816ebf748b0edc5f42c373bdfd53ba3ebd91d0d3bc96f212494ff1ddd238e33e436619968fcb52f78bb62ece0399e6c5080f39e7871daa0520b8e85934888e6a40ec0c2f6a3ee5775a581c894b57e807629faf183e1f32c5d0d606a46d9543b42107808947f0fea956b22335fe152acc74471aac0a22f41a02ae3105a4e76be68ec05bea4c67035328cb2c1b435c13dbe51160ec12b057cc5e4a52c302046fc62e1e869ba12d5e3e78ab208443b20bfe5e056a207f50c3a28bb15227ae76b51daa29e9e46fca7532ed5be5b626a27afb872a2090788ba06632eb1779d0c5a7b2a9e96c0cdec4b2f72fe265fa13b1c89b07886a8326e757defa018b019277ac4fd467f85d15a57c54e748869732695ea687273143b0ee4ed38cfa95061a162bbad3aa731d3df43a12bd9632d7ac51a2e4ae105b163f28ee0c8fde1cd2902a8ebc4dbac7957d3a56f958d35000a9f1fd1d254ad245fb1c9f53acb50aab1d393c1deba0da0dfefe37d16107c85b50d2d81893dd7c170b52ca6e8b8846dae9cd9da5546396cde7c845627f3a8230ca7b999ea1d243d69852d526d35eb8a61b6d191c300be11c6121e8745b7565c73f74aa77f7300ec8c9a52a432c404859dba2184929a1a544948f88ce9cbf5b67d646716b3cffc437c7d22f8d4035de3a53f202f5e52bc98ba79c8d39eb214c59b778584218474f69b9614eccb4456290a8e83fe80cb4353ac3d05f7df0a21ee60b92c5c3351196a7c8daeec73378bca4050937ea4741d1980fb26662524aba54fa1d22b7386481381cc6764763d7d4be90df53c33edc85efb4ca0bb0ba2108ebaba0d6e6cc49f866dcad5014ec69922571f1f93a988c3985d9a0b42ecf30f0f547a3491897c7e3773115e3f67737df23d1c79219fd5ad5a4a7bdcba53a7e5bb8f5aee31541e62ab4428897b5ac47a1fed8ea8726174c419246a8b6dda2132f7dde4a0ca473aeb665388dd41832a3c2ffade13e2a8b6d6597dde9df9eb0f8568c29fe2c8fd5286dd23aad02e8b253286e793421ec04c229fd9409acb00c34b62dff53ab9c0e5b3842716e89edd35dbd93636c97362855760a948f87da5dcf39a888d0f194c75000ff045bd2ef3ecb67b5941007ce9f2d32080503d7e54bd2c644ebfd663ea70dab4f1cf943b69aa5101e33a8db7d1252473d0fee039a8044444b51627364579c227be1d2450990f19f1469bc7a0b29cd9bf2d8d675bea12d9d03e1887ecc7e054eca7a6d41b2c8b9fce05ed54c408ba5186e8b46941c5996b8b5c4f6f13fc54e168610529d77e9040fca397ab9e4e1e2a5fb4ec3c87b4d867da821343285d48161f5ca0ac3219cdbc019233429bed28d29df49d779a22805d42621cbab6652a51961d11c19788845f717438a049707ac8e63a6090f5a901ba575ec42c2aae7c325104c100943564a9c0ac204b237274abbcf8ae1f26b2dd1d8dea921e1183ce26d4b646ff94cadf2973bc72a9b66db6c986b1fe88b9da92e55a981f16f7af90ad95941bf53593646d0f27b8528eccb1c0d7e8da540b8a93a041e9b38d496c64351840a8b7e33984d2f77059cbf909e610252fca17a83d8fece85208177344996bd12e858e2a27c0f9d118ef7ca1bfd445f2d9362a2c7db8199253751c21e2d0a054c02b0e76d8a9500093e1faf568fcb0c587a721e4c5dcc4f4709321c1b18a8117a811af55e69e642a73c9bd806fd00f11bda5958da04e5d633bdabedf2b377c9e48c1f743bc20a4933b1f3abf6eeebf7bddb9db63978d618317c459e6ca57f16d14c45cccd3c0afff5c4b092ed0b930488a4c8a23062a7fb896e86955196c8de8be81765dc80ed4a359e59f4b2fc0001c25e6283896a5e6982baf83b69305b0b58891aa83035bb143a6676380e683ad7b430f1c10a370549658923f87b183f838157d8fb90047d444d4590c8c9f74a6ca643ffc47c72a3827a028e3551f97c304d79d8c7c5953ac2b6632e0bab5237aae0be13f3a6c241fe094ec158b1791bf80618a275988ffa76bde7d8697c210978a9cab6b852d0e6a45a9444cb644023c5f25bbf6bce9bc548aafa164a030bc8bd4b8f6e7a46449a5cb5fda0f432f79c7e5b6bb6133260a420c4c3711609b97d630c34c6a24bc5650e61b15c3de2468e0b876f0fd48b879ee6546b703556d3305135e2439629fb50a2a7d7000d3ed40254bf905315a0b7bc82a2199c10b200e76f0dc06fbfa88f6201cf9714cb0c4aff404af609403a9905dcf6f67b0de5e8aca5def7d1859029a411211a21e1154f8eb972c8b9bc21d481dc982a9795b63486dbeeaef151a8701cbbe488afb6218cb6a77d2febf11d11386bcfdc7811ee8c7ef9870e5889b90dd4e8620944b2f8a97ff0b4522847f6f8336fe534a4e755979ae7ef3f8d978ba7d47ee1c36a3d614df17d5f5af726733079d1205ba581b3fee48d6e6818e1e6e72267aae1a8bf25201536c66ee1f65e62127ac9790345d06864d44eb182d19275c889058986a00cccf20330b76d1f7d35075127b5449d747e21a2d54352cd56f8cece39e48d48def690cde75c230999525f3d8438f2f066e823e14d46103ffc193a1c901944206348f87a31868b1c79602228262a94a56f4d7277fce1458e4a7f165d5050348e636a31f4575d2ec1e70858f956b2b3265756174e2b3d782209d26a78c2b3e3fba5044321a008935ea9f20a985cf8d6dae6aa194c2182316300bc3c552e67dbd0f2bd37eb56b0425d88c540ec80258529e3f2805b28d7f8b9f9e396dcdc97a473123d1439bf7cc4244c2a00df0a61497b18d554628664568cbaef7ff51369c44ecd2de2f22595a01dbdc8545841d3a8384bfc9e488452d2440d8900881d05c5c7eb35aa00ce225eaea24843406fa42cc8450e66f76ac9f549b8591f7d40942f4833fc734a034c8741c551d57ddafb5d94ceb4b25680f045038306e6bcc53e88386e2b45b80b3ba23dec8c13f8ca01c202ae968c4d0df04cdb38395d2df42a5aff646928323016370ae0a0049989dee37bac5bfbc45bf192379d998bb914812c05dd5f25a0b806ce106936b1495eb948 MD = d34e6a8ecef67262a956051b3418db500aec04c537088a86059baa48cbcd6f6504a7354880dbc1910f9ffb0cba8b77ff75ca9da6856a7ef522ff21d39658170b Len = 87352 Msg = 1ebc2320c183fd3ab71a10bb418bc9ae56c6ea17f4a0811eb51b1b70a2e835e34b2af359187d15e6da372635a5eef627e23a4bbea0bbd43a2b5e5e81e0dd4ac43f853f60423c1c02edc2310f2737ae43c8de5b98f3208a69a6d44bd78fbdde6c22546efee8c8fcd61a4499126e70d848313a836c96d68df44e0348395891d8211b20e8fbb22a9baa8744c50623a05c7f44d7290430e5c3234a75be71e360202c5270141f4769e3c65c4a1fb3edd022302a3cb7266a56163dc3b21645d7329ed5f0cc5c31508dba71c2de0ee0750711a30af1939bec306d8ce040b67edd0f3a631dbc27fb749f0af5e189fa57634d131f0d7f272a5d7baf56caa908e49c00dc2000c9de435ca6ba98e0d24bde5eaa0fee5b6dd99d6640c6e4a875723ebd0c6c52c27ae7d2afaab2a3e7426a3e0e27ee561b4313bbae86997ea32a5e56e73cd2428a58ab7016b4da5e205fbd3f1ccb96a0768a3c4bde55106be35233f2c397f63881ea92e439ca1a10b1b4ada8309ff01393c9bb169db513f58f7459dbf825c07bcfb805f8bff75a02c2c6a343f1a9e4f99b88fae494af8a62cf1938d92fee19559b4a6a725140827d7c1f05d608f35b98b54f607c6a4a5dfbcdc838b310fbe70c0d292a1b96af7ac706463c2a1c853b3a0aa755a8c88f7508ae09c133425314e94fdcaebb374b2a2889c3b107d6656e25c117412e5684b8d19d643b1f6efe863486eb5d1adb1c7aea2d1fcb34de9ddaa103288dd7bb330f9dc0620e403b052735dddf9eff2b2b535419e1f17bdb3569f8f8609f6ba0a462b63f8aa25e526fdd347a3edb34ce7f9bad76918da276330270c74ae0b2acde9a6243655f415a44927885937b7f6d203c3e6bb7067256a18c53996bb87488e99deaf479aeb0fc8c2d4a2763e6a9b0171c4f21dcc4b32386f1e7954d9078dbcd55967951f574e05096f28738837a3e6b2527c0872f2d87eb1875e477ce874e92a9adfb729d55ad98b5b8cf99bcb9c0243d106f41afa728d7e944ad71dc6989418079a1660f1b0c6a72e3240ff830dd4b4e505691acebae524c9e19c420e633e2c44094b4b28ea4d0b5bdb021a0a53ee73f309eff8ebfc26529c950f704c5f47b5c4bfbe4ed761ed1668c9b571ae18b00f8f86f13bdec0c16680e7992eed0761630e2ff7e2a9a21756d990d39cfac6b9f61f0f056a13a336ff1b5bc1d48cd5eba284cc80bd0c356c5b22c2d5027cd86ca62604a4fa270e078ac064221798557702cd37d1347b964c81d8d23238b0e858ce38fa4872958ba3882493326e9c0073f24bd461cf644f5879703183a613510eaccc627849cb86ab759c5b7b20046162ff8534cb0472cae0806d7341e120bceee054dfbd0655997fd1bc3f44f26de2d4890ddb756a138395554529e560758689f766c47f3ea03ea13ae8b1584c352f493d4a3af976c323e7667b97f6aa7e48505086b3373957d0a00fc6540d93f681217adec5bf911e064712957fee35976ce29a191e9dacd91a1cceb999ed702e930dc0102e306f60a54508073444887d8eb122a278eaff9055480656e5605749cf5ebba2b7046847ab61b5654782198d083c88c754d7b83a2cd22512d90ecfe4b0a4bbeb02a4023f731d89243c3f7f4273e54adc34cc5d230b4bd961f761206bc1604f7d9387c3c486d911c884d5003a5c6bd7759b3154e77b0561e892d01f6b8c21f4bedc2823536134ddc6b3db72c11c00bd17eabf35f3e6af7d0b6e0413407b6a3a436f2db7889cb15ba34bbb1da34d747a27c5ce86d4f8aa794edb5582a719998e9faee0e6b093cf09e2af1c872d7b178d499ed7be070b76f5275d4d03ebe13070282dea3787d0fe6709605835dc0f6a64e1e8635206a9955f2976631dab5cef7d616eb2206afebff18c01f6a03b84fd9f853519d9505d9645d9b930165206f704ffd3d147c6579447ef06806cc86641aba7f733ba8081fa179c982ca47c5a17a5481fb01446861bc8a6e07de21f4dc707ceb1797bf3d12162f685c13e76c0a1ecee84d6fc5804a6f2581257b68c85fe426e0633a446a5bca68c24865afdf5263a37b5ce86774dc663573ea630bcb977da0a47fab9d58a2c50a1d6f4706e52252bc8250f3920ec0a8a38a7d2070c52943d27f947234cf8e10fec2f941544522f101455119ae149e3d580f073a017ec03ea5bbca186f97c7b22df90ddb02c8f94a5a0b85e0234f1d2e3b49af3724bd0277ff9f4824b877f6b37e0ad39e76364f65b01e17d35a87e68233829ea1434c97f5ca72371e7638c31cd83c74111957ce48e9c42d77b984a1412a00fbffc5f128c0ec7dbe8e10a2d5f425d818bd53f21cfdef46f056a90df574070defda12755de14f0806fdf07dd5434c26e6288dd1e18ca8ec87f793ec8a22b2efa2b9929fdd5fd95a37f37d916a11356e07dc2dbac6fbfefd1ae2dde7095312ee3b24ad39514274bd78f61fa63d67c8f8a3619d767254d8c3d3a0f1c71a0f1154e3a3cb0960930777f1903e83f54ced0be13d43cd8f9f1d84d8b83553645f9667c1bf54d9b35979d1cb4842f13bc98cf1e9fa8986c2e2b78951b21355904a8a71feffb06ff19cb4132ea694b8b7e58df0e41fd66bb5278d1a6717f29345d9d3b8c1ec4793c3649f8541339aa010a8d851fa3591421075877e416d39d72c135a85330c810fd1ba226f2d76bd71ef1a555c52c324d47ad58dff093f52e7ed00071f7beac7aac2a5251819f865f2fb44ed581551f6e99c4d87e3e412a48b2fa8c3d0c30b7f2b3f2e90c92e3ffbecdd2d868f6a686f491ee85d73fc70978d9a1474de30f9135bef5c4bca94d5e5273cdd09477a8ff7bba7abf8f779e093b4d74b0392ec3be9027b373f6372428d6bc15d5fc96c4ef608dfa03eb783eb00c78e5559341f596be88ac752dcf00c598014b46e5d692dd4f870ce18fa4017468f663b5c0cf0dbffd4c5156d7c38bdb32ddcea204a99b5f953ff3d6e0adbefcdd40804f661884a0f8fd328798c6fdc023bc1085cda236dcee137f6292d7af8fe5d1cb80e7d0f2e02e25e085c54c0f2ae736d15095330ddb96abd002fac46bc3ff449608ca6ac0d40920bbe001c51861f9a851911fee78e23b53c636acf66c2f95f370257258771316a84514b2c4a20bc7bb41d5b237107758b5a28c1dd029295678fa95942c9e13d3171c927cbd449efdda027cf0af5d015b4bf561b2044b579d4f95a79449ae6ccae792f7b4317872087f14255fa9c726df814f562de52b20f6e1c1f9f75210746aa458a2fda3a65b5425073d53d8e74e31f010e7d605411befda1ffb31b87cc13ed7de22ad9656817d665c43719f25ee1f02da754ee735bed482f039e7ff3bd9b3fc83f5688c21aae0bd73c63d7f0b9ce3441cbcfcfd61706186f3146e98e634668ceaa9a2e7602e2a94ee342beb20c12b3e47fd64da7cd7035099394a080457d2f382ade14aca81c7774c2ba185ddf1535bfcd51ae0b059367a43170eef0eba65eaec80a838a95c23eeee0b42b1cbb3e827abc283b2c48d776e811c31906de2bbbd78b07c138503ec6674619411526f761bc54433c321da4297f3d736aeca5720f5c7bbb16df61f6d785facfa070aaa89c2d9e8af9450d62490ebd6a29c7c8e521e4a00fcca7515439f006c09056cfb7f976a1e6b98b9f799e40978e9ec2d0eabb1803eb2ab7a7beb35171d25bef1c8d413f663dc62f5b51f0bad5c9110244eba3a0ab387738eb9e0f5044ef486219923b2ff3796657c95207277f02c9b2ac4fa223a0dcfc51a65b139486fe9ed84e2eb1ef5280e22c72e5ab2d9b210ff8917e804aebc1012b5f5d88c63fe7a67844ca69278b3c82d5dd70a374330d2bfc79e005bc93cdcded9e0c358d7892a86b82cc2d7ea4938d7a925db8a54eb065e7efddf921a0eaaac0ebd0e49238e7ebd8909ec39ca76f4d451a12b268f5f104e178dd23231bffdecccf115b7d87ceb9e8f7a6f32a9bb7085cfcf959642fb852119e484c680bf4b238d13763f56d2f58c23e4e87d0895307e7c078744204ed95a0e8863c9878b16e2d7aaac4a2f3f21190edfd4535782a920feff9cda97c7916b6deffbb5c6a1d5ad250d2462d20ff2c778d1af7027026f0fb10e32a42a0421d79091b915cea22be50dd18b13efd3ef1a1a50f63de7a2e6bd5ab9e54b57731f214f043853fffa7e1cea9e2cc7c9097a836bd4352729c2b49c2489213a9092edcad1cdd61adb2950c753a996090e3f3985d5d1e8b66e003d3ec70272ec75f22246d1353eb500ad2876d1aa63521fe380a3f0e08d8614e9f517baac56fb680f3137b5f0beccd0f479addd16f13d8e75046045769ff0bede70b977fd49c1e748bef00876f2bcfc9dc8dede55ec25da82194d3c1a9c90dc5c3486676bc7ea944d0002314e572fc417aa7c7e0da095749953cd4d330fe0fde1c521317e5ddfdf7ac900d8dd787fc7e0731904a4ab26fd0938531156766b841d86fc4eab781c29506e5e57aac3378886c7373a918834c4702b90f0fb4c8b1f5e1e8a2789b31a127c548d464cc3e186892b59687ab4597b5cc1e994a80eea1021d05d448f7b741b4d30102d29f708325603f216b6bbff723d8fcf44d349e3171760d82e234d94c441758964c8d9162c7bd583ddec0bb15980e9d4ba036a10949d34ad6cfbb6067e07995b85afe685c57934a126712ff981c5648c4ccf0bfd0921b02f696f3133c8ee1ff92855abe1adbc95bc78ec95529b798448758c8bf2f54387e0abf43bc735837df4954095b435e47d484db4d837072bcdabdcc286bcd9811063bd31521b446637d0850730780e5f5fd73d707511454aa528eb1778953658ee1b059d00ca65f4e21f5ff008a797abb1db9095d89be664bf4218d1de268c4975993d9db43f1abde1338eb19abd524817d81f9b8f115af85079feb823eb5bc14b409dba08e3e32fc9afa9c24333dec2f66f1308153c23741d52f500e65e155ed3b3ce886b735fd910063998beb58d8ad1e31351e756c0668a4fa46291e95970b365487f5847d13838b9a6ab498cff3e3ed6a90f91fbc25e0bd28543b32798b54ed784155bfbf7cbc84c89709054942b91dc4ca781b599b9368e003ac6a3438b1a7d19d0f2ea241223314a8f0f96fcf18f5666a0530ed7067ed4ad9e48c6fa70aae8723899acf699fdfa726d33be9a1e6bc79f807251dac46938f604b60d1de4848c15b2ccaedfc1ad1a89919945ec00dbb24fde6c3935817a3d72049b003e751bea7ce6088a5037a5240872acc7635733a900009d2f77cc26549a04742acca0f5863038e9a9f84a9a8977a6eabda070280e489da1af01e2e210e68abdf758d695d1a821cc9828a8e1bd4f94df9323ea0d74920c0622748451f4d00df4f063a4617f7d474ddf61a11f5208d2f7d25e33785e74e23744401eea62ff1495a06d890cc1f80fc9ea53e1a7ca2bc7c005cfcaed3e59a6b16ee521100dcc153c81e702ec5bd0e1ed434fd91fa83119c4a7f94ed096c8d0111cd4197737bfb6460f509084af70741464e605eb5ea11f72335b0dc6fa3ad4b2c8ad966483524e3eb34ab06a2f5f2ccbd996d6af60046f553265a634db385b231cd1f67c731c63a32825e1017e0572901bd2e9b04ec37ffa1fb996aeac39a9fe63d1d82379868d0fa882b0eefe0bebfda63abda29d76c7bd65c76d98ffc76781583daa0e291930d0eed19e8731cb0f61033eb10abe96ed3baf0f7988486a0a684475ea70e45ce59355a3186ebbdb4366ad4f623d349c46d1560278f1188a092fc30b28104dba11c36777ad09fea53e7b1efd4fde920f6b3af530ba77e2affa344e6dd140c7c94bedaebfcafd6cc1471ad2b8e8435958d0b5072adc6129644402612e74a6d5030a7e95fbf09da8b7f3d26312aa2fed110dfbf6514d516f1f7d3685cd909717efc402b7accc8f14e1cb1e4a8b33e8efc0796c5d348bdd266a0c3d36bba3b5e2f81ef67e52ad2643d7436ae392e3f2b3dfa982a6552648e1ac8782fe892c77d8a451d6747e1117b820e354e8ca58f1ebc724db6c239b49238f65a447a699516b8d233f149fa6b7d4272148a481f15afa2f71d3092059425e6b3d1d9ca488d71e0b097ce937ccab4a8293d2b15a5b925170f70627fbeeb914c8645b87f3697d52b65b3c6cc6f1566d9ba16f99d3e63ca4244ae122f6da31c94f71ea7423c9b8cc17beea09cdb34dc00ad09bb85f2fbe44c1d3f094a1aa30fe38ec46fbb6181dcc97aaf26adc90e5e438b7c3b78c969bc5c228b0f79cbd3b264d49fd891ad310e6be8601ea4408d33cadbd93f1ccc959a9bdcfbec648a1b4c3c5017a96d289369d14f68512c4998a5be258790190268c531d2f567b25e6327968b95acf6db903720362f87ebeb17fa47f2eef61874c887458ce2490b509389980b7fa7d5cd0ebe83261d87892ef37b8cc87638c1289e26ff932b5a196693bb6a5a3f63b106f64820a69a1baf1a1270b6328720bb28d3eb886e366281aa4b0535003ba8338f311b1f3e0e0905b85d21ecb58974af7c4d1e08a56d29ee24a4ae2183dd3d036fa67fa976e11a320fbcd557dbe4fd442af607a6c1377606db8400556d8cecc8ae3cbee6d77b16df2718d61f2b0083233cb5ee8b49fb1371d7d541fa45af7b2a55dd1ffde844c5b309576a6b2d46cef3b9711adfc523c6d8207dba3794b0b3d36b70e91631a5ef57bc63da636a1ca55daa14d4c9be1658e3bf66b335e1f65c68f8dc655b3b045b7248226e3169ebd10916856471bb3c9139bb76731bb4e93e94050bdbf28dcad2adb67e6dfab21c1b9e05ac120044fd38831c97441295f120fd98e49203b0601cb00d5e21e9ce1548c58071269ee1c11768eab06c420d76cc4bbc4fd4b72a2c012255a9d023444023258dbce7721bf0f4912ea834d2a3e008277634e735859849ab9749c3d39c04736737759ea579f298a5f069e4ebe0979d39d07b14a6480bbbf4da25421f5fc8ff328384935e842fcb4d36dac4b44b035328d10da332fced20a52625942f14f6902f7bd10ec6c21054310ae31c566c8df19c81d0dc0028a540668331032c43f5ee0526455705bdfbfdf8736c33f8cb9b413fe9ad0739549de3ddfa31d53e752de15d8cc6b542fd598c4b7a5d52c3f19709b6108c6b04093cd1b5920d538c300631dfb63d72a60893cad1259ec1df65e712acff56518acdead19454adc53fffe8a532ab93d458680f7f337e18c873aff524c7bcf101f32b0fad2346fa737e673b07ff73ae2480a53773188db1afa7582707af5147c366a8132b0972daa472f2671ded1778a94845726d295952bda4e7e7820dc53fdf0bce5f14eee036a24327d4b0a59ed8add6d227370eeae43b92e49c5e8921c09c0b24592f7c97f7b3188eea87ce10b57652d4c0976e484d7199d7ad63ca6cb4448e326a46599f032019b0126c1176f94de5d1a456f17c77a7df49845979ae021dbb81fa1f2d0044317014b22516d78b7ab7533b3c408d48258fc288083df09270bb987284a1c2a12d4243347b843b5345efe1ed100383aa32cfc82138bf394c84b6ff383b5cee015ebac3fe3604aa39f6b504229ce1668418c7e5b7b0a79118a3d33fb60c078c4e0afd1e7a1e3d2d25d4334242a6833fbd1da1a0b2399c00de133adf53c14aa26f7a36db0efad8cbff288e26b5f791153f8a82817b9b468f861d14677620cc3a4cf68b8324947c8daf3af135e357b2f1f1a79411789e4e45f809896089f3365bcdc5249d23b2d2791d5282f9358d8edabbbbffd712095c2b1c1fc051f3002f0eda312ab1731d819a32b869f91163ced88510eb5cb1a61747daa7e2c21c10605a5b80c5487c9d32f5d4b3cfbde09f1af337ec7f26be3b28a31be8163b6cea714738fb1ce9a5fa8d94ec8ddcce0b0a1934ba98e3bf9f913647c52b85454b5809dd59ea581c58fb397e638cb7b3f86c74a2f45c40afbe70ea39c2b856672120d025a695a069fd69dfbb1ff989f4118dd346ce7fbe7c82a0ec83f8d7b22a560b702608431d59fa0c26540a1c791abd34dc26304b84b052e8e32d51d0c11552e18ee8653ef773b8acb7500b3cb0ac632b3a4c0306bbd29811783db4eaaab07d6ad574a7cc553f9f1139b709a255326d3893c02df98a6bbbe452bd086e9683406dead1b4365f4618025591ee97913442249088986c1a0223261ab437a4ac1701b4780776c43f0f8949b3e7a1618c3b4ab6d8ae2aa6921f38a2772b28d415f32905251fd3bd1a235bacfac00a486dceedb8143acdf11b4b611f1229c346f89f21299920b56b1b08f7f4d32511965d7693f0eb326893dd0c096492b6f0427ea450e87d1203146748c3e9e51d9e9183baa42806a0e3d5ffed953aa0da970fcf891d0979fea501296b2952d9b09983082288260c8b26ffaa736e69e49ea0f612d6f25634eb827a87f790f856e6eab21336a7b3a6fc18590528fcb90509f33f7014369557e184c6a97660a405c87967cd7f6a967cfaa32b3993a7f2ac24793210ca508f89e8922fb86f001c8d5d2ee95d843799358daebc6d3cd8db80f618161b80aa0c730994fbdc6bda2898aef282eccd778279bd2255caacf53d2a87b935b8beabd4bd4b73733cf15592cbc1ab78a2e3931af293e53e786a68e051df45d5100dbbae0eb715df0189d921d0a04314a64df1294616e0bf9efe978c9e07a23f4af442630e53638752bbce9c4f53a09e2193fb771d4ffb2064f1ec09b806babb8ffca8bc662945b258109dccefe0ac5e3a3e18cb20441fa8f3cacd1e49e4739007ab567ebe41a4aa3b0fac7959514d9b1ad5afeef6ff32a07311a495f6a9b708d98cb274bda166b52241646a35ae6d9fe8e02aa948881d500c4fd834695e6d692e2425650c53751c352c2d692afdf3b0cde8f0c2bee5c900e40ad1c44a0b7dfc2dfd1818535fb7279e5a703ce048c717f1746901ff201df826cdf70c40b6ce09ff9ef15639cb161d825393ac0096d11c7b0cfd30b441007ff81db2d6f4694ad8cb8f1ae766a179480c9d008132f0f90694381415844e5cdf82846ae80e2bd8b0ba59f99383e9c7ee61c21d831d5d271f6381167a1851185eed89870b350560dbf483f82238a9ea58ac4a547a6ae543ad116e6b2517511c4561b5710711fdcb9fa0957d5b2cebc9ce13bb0c2dc09035f9c5887bde2a5750dc058e90a44b1eff45e617f20708b64c97be9fac65c867e54ba855af6ff96a9c6a029e4daa8b6de514ef92beee73135bfdd67d9eea2a713bebe25f6d9f2b92e839806d0ee078f46556e38e49d81608de4683de49848db620209a2e1e3569d71c8fa6813c0fbbba6851ea91fb8d98a0bdbbec4915fb993f7a33f8482bfa5a4220b59c6440fffcc7d44f2a253cd4a3e0e0a43a466a16f713336c2537fab6a7dadcf38b9e8078e2249396ced17477dcd23049945db09e4f3a31134983f530f7a838909bb5664215d88b6efc1e0b3ced7d93f123174f5c48bd5e708bb28332f3b21dd6f33359243eeba621dc9269ec7ee9f2e60ffbaf158ba3a0cb144e0b824302710bbca0c0e80566caf698b7f64f361f366e7f923994c0f4e16b0cdff7e98ea01e781d8205541150e13455151b2cbe2645d29b6253a08eb908999aebae2f7c920a653f638f310bb1d2243e323e4cbd06095a8df566009df9fd9de6fc981cb6e21f1949cac6469a91850e7898c978dcc8694d7ad3db7d96bca8bf19991d78e49843de6440125d67f9e23a2ecf2276c3734cf58d8218df210af1475b4ba50aaeba60fab84cdb3c19f0d1ef865db30e190f9c98eb8c87eee5ecc07cd398989bba525db66c7689ac597f3a76a8cce20a87a5407fbf798f718b69fda7aa0b5ef3b367225aa9468475cfad0517bda41931b43b20f22fcf9732ba8a901007295fda3f02972e9645355f22821a1aed6bbf4a49dc2438631809f71b5661ff137c0418062aa47a5cfa0232fb0661c75fab3b1eed8d349b84db4c8956d558bcf68bb374b1e7318522ed54b50142c3663cebf77549583861baa1c8b0120f5e8ed7ded5b8e841269811a794b1dd3d263eabb45a16044418d32cf1e533f70d59bfdefed3aa52416bfb51af28ef36ff7498d58dcccbc759bc3903530bdcaed633953572131398eee8f6098d7a34b59193bce2feb55a3aa00cdb664fa271df72d25901c2ffba625186d161caf04b02fa6df2f98f7e8c0420f1007e6e12bb32ea20526d77fe6957702bd382edf4fbc442e88242c98d29cee251f27337c3824d4503ca9e1877e61f55c045947eed0ba372eeb3e6334bf93fec16f76c331e8edb8b6507bf2dd4fa63082e6fbe064344499166cf0d5620c30048265891e889a682c42d52f63e7c6dcb8f5b99290c5d6e5ba7371cdeb87551b8fe6b5d0be06d94eaf943f36bd4d707fef4310bfd18a55184bd4be382e3b0691014cb4d02a3331ebc328f3248764d90a53f970c61b282b46ad9896b215f3bd4b09430729db7410da075f857b2ad46cf677674e67d635c60b506d9fee1b27c5a3f85811205a601283dcc69a9d3002a8deda3b2df7ab29c1e0e4923e2ed66ddc266f0a67662f8d9393c3ec771d3f76192decd38408028a8b41dac4f606b03c4d6ccdc86e6db33330644d3fbf8da1a53a6e3fdee51b64be9ea893646c0840f9b5c1a510ba998e17659fe94ed830ff26991a43abc5945a6c78afaefee4a5f14c91df7581c09c2890af81288855d9a06091ac88c8aa255beab5a1ae030462599b6e10cf7a14c81b457ab27b8accda4de9c0bf8fb40720d1dfb248e10f5fbfd27ca70003883bbfce9c53ce52a481a55038b2adb90c612954a21ae018723b210456d917c23a89e5cb0bc71f6e8428dd4fc3d401a5204ca16cd83c1194ea3b3857b070e28bff93dc891a414fffa836e4a5119145c4ae3e1b82f8b247e6c5e46855100adab145edf6915e5ebab66f205de8b89704a7e49a1a2f79fa1d9e93bb33850c037ae2ac0ce67c3e7bf9f367699b931f31a8bf81f50fdad29fed2ce2141c5ffaf73d80a0550e92412578672f97302cbc1dbc8c04e37f0d990041022fa3955e6362bd2bb17ae17becf7d062062dce2e25a7ba9dcbd9ea4043c7b3cedade30f8ebb254345dc301a1c84f7c74a991a81fd26c2d55653cc40b5952bfd3822871c7ea82ad4b13e1d1ac39b8e72f7857506a48d78f536fa0bed7503dbfc0a416da33e63022d0624bf3e3d7a0aaf301037995ff764b08299a1d3cbee55e16bf2ddcd575675f54c755caf108b3325fc21a664b7cc4faf4417d7193fbe5f53631d1ec250e74bd48b1b3d95c734d17d63a10c8c3374019a835ef5e859dbc2fafbaa79a9b1804b74ccfdaa17e7dfab5f6d76af3c5c58421848554367a2ad467f3a8136aa03883f7a1603ea5dfaf38a712389d89ab8dedad19ae409bfa19db28a298a9defcd67ed917215479088d8365e8cc2ceced16f906e81f38e17de11d0c2ceaef59d97841d5fe71b07d817f577ccb009db012f742d97056a1b98e27266d033d388dfea49998c7dfd735c31b415649847455b58537af32f31f86934293d5b60e29cdb4c1d28c13ca3d3455d7cd7cd4b625503d6763c2b06316db45d9c1d0c5bc47ab9486891a62df66fba24b686afd144532231433ee69250c29ee335cd8b2e5f6aa263939de257dc8ee40cc8eab433d387dfef2447cddc773e51505b177fe19db3be2704141ec33e7aeb9f1bcb8278f938639a801e88eb8f2af52b75c1917a659f341b24be01770579f66517f1c1a89db0d5b9be8cbec87eceb1fded9468039e742dc75b62347d17d42de524241acca7355ed5485917792e72ae4d2a58ad83327bd0b412ca5edd5ed3b9a7ab2b34ebfe102675854d3d08855e14a394d5070308fc4669afbc289dc1bdc23312cfb90d8c895421dd2fd57c6dd90a8793d21f8a083fb66e9c0139c727dc6f12c3d84e3a38e71162b8c98adecd2db8828f199c201a8b494c3f613b627a76e9cb240e9d7bea7484be7ee101358ca0471bf07027cd262a268a02a3d377a1d458e69f384ed78a76d6bf9740e589947bdfdb1ea0689a146277b04c91ab0d843ee3eb9b20095701362eed6caedce3cc06a7498271068ecc7c614784f16b2c0bfbb263808c750235fcb5cf63f38e4a1c88c8ed82aaaab237bf0ed6148cbbdc1e55eed6b5453ae00f1092ede5d6a5c66c4b6a4f8715fb0c3b75a6e5632a4126a592bfcaa41301f977b9eecf5b20c65fa495b3f8fa78a2a7c1e450fcd993a81188fb4cc9b4bd72565640f1fe2b999b1eadafce6f419c4688b25635a4de8e96a6afd8be5a4d0d34fe92edc201bf09cc0a6de1e13cc64990b9f4117d64dae4b4ec02713c06d7c9f0f915088a607d38012bcd7215e8ef462741715e4fc5355da9eb6a0def53baba4d50c5d970a4cfeee18ab5ac91fa265db5280f84d34e57c11dabcdf6ffcb5fa8f40a8ca89d541cf2142e0ed57efad254df76b8cd3387a9d8ba35157293f62c5b8c2f51bc39f8cb0d4320be3603705af44f34537f94f8916a259028cad35b8a9abec8fc5e6b1846071666af1749e52805ad6ac8e3212a783e09c4f046e882e22e32db74d65b3df4a8340ac7c077e1a34fa01eff41ffa4c71d0cda532dfaf39ae08f73a36c32ee3db74613f078b6ea3399d15adfe159eee4cfd6d93bc930371c767d95706818b489fef38a11882e8a40ade825520a5591391c10c98f60b3d5ceb8a64bc31134164043e4761238064832518c8840051b142ccc62b2373bab551a70af9c84b0af9cca4fc0dfdad067ac724e65898f1bd4ff27a6739d1aa23f40676443919b8db0ce90ea30ce5398783f666c1c332891a8db9173ec9122dc971c1c5d0830f1f06035f8dbdc4964d862887772598bf3b2be2ed2fb74973633dc74a323a6836c21e7586bec6b5bf5d74c100d2ac39bd8c53f835206b4b63eed36cd637ec692f5676cbf52e38609efde5f5d915a036ac011525f785c54f62353ccb1c4361063750c17f31389d45d3835c2f969cbc10091df204caec4fb5fcbadc7a72e122b01d256117b18a6fe5eb9249e6cff45a4663577d1d15c0851fa1f434e3809dcc071f68e82dfc702ab145af31b3cba9054a392218c77e8ee00ce075c8aeabd5a76bcc7fb92a88a64848804e960f301737abf922579c4bb3fade36c42a348b255f6eb2fe7675dc89630c19d4f96183eb7bec31ccac1423dc20242343bc0d75194e70615982c86e85e58c70e6de434d824c7b6175a8c79d641a7f24990092100e1f213605707ac5485a4a3408b73ce37823ea06d1b01f0ef8244fb9189a7ad2802bf1cfa6c205673d3bb5c1af16b6ec399ca890556492fee4f8066f66dc20332c0f528ca1fa00cad0f46fa83e7f39de431147ac7528bbe3d6e033a5f8681ac84e33c40b8b8af566a03ec8665b433e10211c37a9b59f02642a7767fb31a0d2f88333e6bac7e74bd12755607a7a154c58502809269b1a0ee67c4813edc728e14a578a0b18eba18c80d2e2c8531f67eced5ccf3c919a3c29e138bcb7ec1d62be442790d1a46b5c200c4f61509ebfbd8865a37c32793777fbeadc6fd474a8d0c26c9ff2bafbdb49beb9d94b999bdf78b747c0b99b4bf75fed79f3bbea15fe15a62a1d2a277d902cb1301d2c1408f34be20a40f1c7986e5687050b3b795e8183d2032ba1b7a83e679005976d50349f89a13380cf57dce0ee41228f5902acd7bdce9e47f3ec1a4a7ce380b499cecd38c47d4a2cacbc881399b448fcbf069f65260441fe8b253228ef1458113bf021538eceb4811476385aeb48eedfb7f584ce5f0ba4bbe2039e7e30aaf219ce54df743b2e194a91155c4b55878aa4ee602b57bb5d2d0c92f79d9ee43fc55abb7d662f7c03dec59d0a62496af8b2e8ccd6c1a5ed71416d1881de2f6c2b6840adda43c9a3f87baea2c5f8f98e04ee27ddba064d47d08869ed22ce945af64157ffebf6f7556486525cf87ec04144a2ce8b9a57926cf3786f7b6afd521338f72d3c230e1d02e0655cf5e262322720575970f83439cf6287fa6dcad90d376be02ced3fe7cf3ee4cf2b384451b3a230926508442a97d1a63da71eb2e01a29f792d37d6312625bf9fa498e7eabe944edea5dcc0eb92136271fd218c3b10d8d6495bd876d2c9afc989d3452f20f3781c0a5c036c86e8a4f7d9527e66daa5bc45b4f47759e84cd93391e78305eca22db517b18c3019927901233f4f2216a895114460dd277b97eb2640481a1158b3fc408d0e41b3ae78daa7d82e5e67f401ac658108d28994922dc91c5ed2fa6b0f2de5f2dae89e4c820e117f8671de7e994967f2521d263925e745af9273682d9c08ced07d4a98fc985f68a0af512ebb56b33f1fa788a8753860c1814ac405a743d420ae5f2f4ac5a213d4c311c600b32134169070d9b44db3e16618ef8e76e0eddb0615e85f5baf88737c711497fc6fe31214ce13d9f5cb7eb25bfeea9966e08063a68c80a174c232c78931208ec9f682966060fa5010f6811bc9bba1ad7bb0e6b5289b8fbe3d078857228c9d711050e80823ce8b06b0d6a564d8d57e925d570519b5ca7d7f5d85736a7009f3097886fbb084a130c27b74d0d4afd6e80fb5ddc7d675a2b2a97d44d94a9b308a1eaa9fa5d5ac60504e19d7ebb4774647ee2b4b12368faa9607444da43dca89ca784da3ccc1c29352703307df4c57ab02f566a8d07f2b6a91605ba7ba8c259d1cde0a9b5abaefc2a0f1710d92e4788f83ed0ffce8fa736b0c7b695a057fd5f3e619898e36095b76a1987af0eec40279319dcd5042ef8d346d21176f6b5d021391f2718448f62d36bd2ff7b8da341cf274cf49abc6a6a14e1e1a0dedd670d386862e6b8578c88e8b5c7c8f6e3d7bee81b4492b155c66d83f852ef2dc2dfe71d32c981e9aaec9a5fce649eb1901e2a1ae59d41a96ec7959910c256f4558500482eaf733cad23f9b11c35cb2c10db15d01cb38be375e254dcb1ac62b2f3eaeb31c2a12511ecc7397525c7d8d6e49304903733dc0ff9ab3dc7616dacfa2c95fa62853b2219c84adc248177624299da68e3bb7abc8f7886b2d196a2902a6e0ad062ecd9f4a4ee335437a5d0e1ef9f15d533100497d251194693c7d7b6d446bdefbb6ffa1753ccf524370970c24e72d9bc16eb7e088931b77b768b798b783533bac4953804a6d314deab32b39ddfa39a90079423890498f5d40238048896c7e0c426e300370e9f26e5fca835df23afdcf37da0b193e4d568c2cf840528b05d599e4aefef490b8f8fdcb3d05400aaf62548f1a784b3aa9564da26c5f7f64584029bb90261951e32d4255951ba9ce624e822fc0f3952b6579e7ca094597bd6da806ef9c0e3a5c70788526592c61e55aaa9f3f54e3c1ba87a6a4cd565b623d4af376a75a1f21586ac00d65119f31f99f5ff4e95fb0958e19c5cad3db07a78df90bc20b53c195eed6ef233b46dedfaf3a54c95368c1da5022bda20321b2305482d632440e5d5dc6beec0fd07e5033b13270 MD = 9354325be0d8127722ab167c4ba9b8c04d6fb4b76ceff8e6f32c55300c70705a3c2bf20cd85706d3f67fef2f2815282456cb9042ca8a6a6b9cf57e9737ec2592 Len = 88144 Msg = f1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a8a92d4f1216ab457174ff11aa467aa280db36f247991b10b01857617063851e3c7c192d13224baa9fb183282ec0e3ce67c6e2931a224cd3aeb5b3035cb8886d830ab61bd5dd22608f6debd4957898da42aa8a82f39ae429b807268178732ef71efd7aa7e4a7ae0bd3028fc378fe287a942e854e5e538fa76e8518783e33c73f629cdd3dca027cf0fd07e56133921113feab7951d4fc8dc134b80f64286b0fcae0916469f08dedd48fe6833a7004c12ac4a9cd39d1f69d0b9d0881c1c1a9571e2b439698f29a9f1afe46ffbb9896d74398c1f762efc20beb19ff060d844f4b9da55bea674ac8ff38ba71a17127f8b1e2ed5c8e6988ef78e44e1402c40aed4bede122e64153899cc2572f2ed7a88aff8d350208ba37ef528b7be01e71a003d673613100a3b76cd62c56b7ee6b94ce0ea6f22aece17742275555dbaf82fe1389c2981ec02ae0d359eb2ba466a967526dc4c76fa15bb17875b65e7f3c947facb4500844bb336a6d9683688d2e2daa889b6b0728dc958102bc32e8334c12af3014b0443b3859be9bfa997fdabb44d8f1260e43eee53b6061796f95a06489f73df947ae7afe0a47df1471e40584ab7d2c8c23003a5199da251ba0e94f0c66f226f09ad97c42c1b0b772c137a610be019b4c5dbe93b85d58ce319b5587ba362aab892e47c7cd1c63a573ebed24f5e900bdc4f2f1737fe256bd49a36ce2d4840b0c21866be5e376db39b676671a8ad8e504a4972b621eb57e82d24d81f911bd1df96817c84f2c7da1e4b8e557ef75fa391069ceded82b631aaf5a1e5732c85dddc3bb76ef6c1e7d4226d9bd122c1dc9776162ee8e5e1c67c5a34f8a3f188ef2b52b9a0843e520022670b752385908b32a684e9abc5c683ff9ff3115bc22cbf84e7192606812d7b8d962c0693ceebd63bca58b47db6b955842239d4540da05fb04362303beadbbedd57d93568265b247c899876a8e043a4d18a0e29d8fb6d35770f9ca56c9ee333da5119eaecb467debb8c4e19726aebd8b0807af82db41aaba1f3cf6fe1c8cd414b2df40d65a1976ac17a8184247d3a59e6ac86299c5f2f27f5960475e28e224ffa9272871c14733156fc3a9f0540b7903eb539a46d2534133ca1439fb71869c7ad299c3e5936849b41ba80525fdceae37f449c51e82db2d63ebb92d5a78f2a102d9a791b642e51114c5b5b8578785bbb7000b51855a031d8c38dfbfffb1bee92428c1106842562f93d88d3209a3d9381db928ee2fba5378193bf8505fce33bb5b3a76de8024340bcdde8f10b0b53199b86a12f9523654e3975f838cfef109ce14a9494a726af72c3f424bc2f13e1757339d69e1b1507fd6833e01d461fc9967ecdfb8e2d389280754ae33d72fc0f306fbed9e55a19b4cd7693203b50d337b3f4058364608013f339a6ce7abd0c07d1f9dc510c3c779444cb5e609bd652827aabbad51d2a465b5279d28c7df98deee0785ae619a876ceeccf5b4743c1e5d1730cb499c172d191259c94c64e0cc5efe554014116855f8b4deb547e3df7d44c277dba7659206adef50ab524f3e0fd2f69f4990a0abd7af2ed850fad9162671d1d679614ec1b596a482afd4d765b7cd9f4c2eae8fe370f2c5607567b45e9e669dd330e1c824de65ca96633eade678c130c25bb84f9db666010d7ef906373985bf047eb36239d59dd9d2521a234eb73053b85d5860391c7b7a15fa295f2eac618dd0df409d8f3f914aed08d1e7fce7ad9084b01952441795993053932fb35b8cb2cebf33ea8370f2a63cd4006c7fae9b4fbdd055965d3c56d6e337a0e853cb69a664bae7c9c51e34644850201155608c09da4a97ccd2ff31bb8502fd298e708ad1294ef6cbb2abd91da609ab770ca1e257508b7a3653e4b8dfbc41e253c1ef52db82e7cb60da8e533acc7d2d1e03e750b0c72f57834e614e8bef610b07ac9c642e1811d019ab4a253432070f76d9a5399e8482da3421098578a50cc1b59d0c41314f59cf56b373e1925d43dd020c601f793f325cc97a51d00e6391c0de21b34c9d9f2c03b8717ffaedc4c010500abc74e95dca69a3c8bec0b5a19c62e1c92618bb8e0507bf63e2e3af0ef843d152fecc6746a77b538ac4da16e5993270f1e92823a27155cc19212e4e7248d21683bba86ba0462c693ee87eaab5f4ba0c3a50ed6e62fd787effdf5d54b55e65900b877b7ee142d75553be40d9894b64041101eae44605da488661d35a3e9558ce68c6c809901a169877aaa32be609bb090480a32dd23715a95b4d32b7848a36220a1e10a4233864b31932283a32cc498b8341a8c38ded9511cd15fdf51da9885b8dd1e7c7112a4c2596d9425d15ef79ec2bb96e1defb5e3228a4097ab606fb9ab52a6affaf06c27709f24843d060fd6db5c7c55c55e0c8a5be1519242f37964c206f0fbb8277aa114809850326989eab993ff02227f7df51e80cd60445d22f40009453d775cd22391f9a958d5d70a101760a5f5edba66bdfad718a437f408f215d807f7c0d70f397948ebe0afd4ed01655125a36fa5733f6162c7b0866e97e95401ddad1d4c8e5d2b2cb49a28c9cf1933d3e29d20b71003f2926f17c8035c344b052aeff513ebf937e3a7e7c94c1cd1f3776135b965c9a62f04536c7588d28d8b507412d0c384b8102c3a4c19c252c634aa261f9247fc90673729110735773f65724dd848e1f4f45454f04982d30d6067eab5cd33c4455d3b996497f5bfc6d489f92c82c5e5c94864fc4e72ace4a92b1db77491266120573ca97a73e97e5de7694374a4c0455e2ed290c939f07db290c6aef73dd2a52a28bae5ff372af798e283efcad0c09740022da0d511e604b64be32fb215d116af4c66dd475462b1f4405a6c93795f420b8cc6ab168cf620209703b849abaa2c3c3c910e074e09441cab5d387320f4dc0d093e2de22db9469e0c98e70271b66c5d73f9f6a3a687246e6e1cd1ce4a29dbe1121497ec56a7ee6b37232a910a8e3d8f8ce20590d074b9661319d7296746a81431ba7789aa3a9e248122f159d8ba365ed1e9d9736e4a999024c4a708fb03f712e2c04b4e9af9cc668528e9e16e92ed27fd81d0bfc2913b793dbdcfd197ca1f699fa691afab6dff8dbda562bc2ed0a8976a4a99da9fb1258da855c037a001a784e2ddd9214dffbe269518fa3eabcc1f09a29483584842de4a1f3d169fb66315f136e6904805277eada6042f0d681db71b21002bbd4ececc3aecc4317e4d36f13b16514588738db7af5ae76f9ce62de738800df17e25bd75dc9b9bbf47d715afcf0b9e6766fb9b0f983e433a61a87545ee2a2e832f6f8771abc623fea0d687c839712e74680fc7dcf4ca981df0119c499899e24f257eb53634e6edae0dee05d0e701a20b1042aca6318a6698ccc40b78e459b9c404f5df39e468691bf360083074176989d416a201faf82f295c423b4a4dd4156052476e0356d516e6d5ef078d4d3d157f480e5056ad9e625e22eeb43431b3a5c271f5da18e8b7878d39ed9c4dfeed1669c09c204ac5d7a085c55bfecd3c52bb690883bbe1368a2b7d93de3ed8e591ecc7f242aa24e04e5a6e980c838bca4bf6a26a737c02acb78346885357d4bde619183194569b696d00472f62eae67809c82d3c37a2e3d7da1f666bcf8fc7d4342be922f3ae04ddbe22ce00018d73a216a057d262b90b347c605bd2b53f08b51685a93b0328f7b9ac42519e6ae399e4ed2fc0e16736ff4ef8f6a531a6fe3dfd07c6d6de254ffa99d1df707f01a5efcd17b6e6ddc7a51683da32c12d1735ce08825000a0ec9b73daa96ab916681ceba700f6382c067c177fbab53e09788e4f6410c19517bb83fa18ad7479e8f0e0f42f433e43509624489ef4ee8a7b6d60289c2d9c32a734a203b0587d618b4e6abfa2491f76e01956406e235f24e74843e01d433037d3ca7e175e24e5de61d342a4ccad1a715ee26a8569d0879bd1abb20c73fc2e3321ff60ab6ebd6e6f0121e129fac9bf912193d98e1e56e86dcefa23141cb2f6a3264602465e6c4781edbcced5a9495f74dca03bd0f850f1f933d62f8d83f22a063530cb6ec9cc31c58bf6742e7486aa8af499f9e4943944fca4a22fdf465428eae342248b2d579d98607179aad90c0141edd3ac4f5e9a51b69600bc9fe03383bfb4ecc621f588eb790fc037c1436404483cffcb57d3de98d58c545e35ce2abb033ea308d9befabbe5ee354708400913fc7670cfb470809ac7fc1f7d378ca44f33c5076508e6078f7d80731fe65b85b0dd0ed931ebd11ac80c69e4922b983ab0e00c8c73460749c69e7afc3af1f2448b788a9b8a445227b1216a2645786d48708669a4bc079f3c01c7122320a1a0dfe44d6e3a41749011e69551770fa498681ea550d297c42a58b195fa9a598bf3a25bca1e27efe30773c8d6d439494696140bbb76a8af02152a6679a8c44df74756628d3ef6fe2624c7d87446ff9ac4e2d6d8373f995a57fc1b80e09133869a284698f53529f4a47488b5ec4e2c7ca60b2af4b71027322c5bb6a179386a9beb230d5f9095335be47330b1ad4e6257607b8af1a99cd4bef59086489222cbe640a41526edd3a5ac6cad4a8c45bc13b39ab0614f8d3a24695a5704d6c9d4ea0e5147f8af7b74e35eb38f4086343bc329ab46587ed07c88c9b0fbbcdc9eb3477c937b2229b7fd8efb4f95bd3ff731f32228a9db0021d88448901b08ea7f6266a96daa1c5631d20afaa75d1b2a1d33262579576363efd2a96e8e218350ea56ca1d667151955796e9e53141e4c4f4b3debc33db8c2aa8ff6ab3e1abb6d06e04d451045d6c67c7c0ae43a3f094b13c387f5eeeb2afb4cbc33ab161161dc988f127ecddcac75dd0c3ba8e45c5c54f52359a75f05958a2e6a2bbef52ed22acb9b047394945fce82124b12dbd5dd12fc53fb299ef5c1165882240a65dbd500a8ea684dedd5b6787277804ba610552a303bb5a433217648d0ed67baed8034063565893360077a1cb521237bcd778b4799c4cf40a7f37cc8a0913cf41683b5e37cf4ae4e7692736154fa7bc9d870490f40d4902480d19a3dd058eae0664d213f85801ec6b6de69f056e9d25e5065552a2c54417949259a4f6629bba867463fc456ef22c2a9532470c3d56e62bdbd7841652d2a66875642a76cebf571a1d6d918f92b026ad55a6b8aa3a898fca5e07afcf4459314c4cc5bede988e1669b66b5e3761a06e7c45908e6ff49985492362302e086c4aa87efacc9e6e7c7acdd5c9dced3a67661febac12bdea0b6930b273bfc31d704515927ffe16af0ef6eef2256801ab699ff09e35f0149953ae1991b8991f01f9d31c1dc1ae07d8ba0d25a1eaba25331b8ea6f3eaa1247106b65c27ad66a2448d5714776c66c27a02400a5ba63dc84011b4ab8316903e0f9934811acea2ed539f53a735dcb2d7117c121585d45d5b70d0a466a26667f1c38f8b10b198d860bda44b3cef9f1cd62d8c05dfb6e1b36f33dcd060f84672c04b5e2c93a29871acf130c05dfb300f103cc69db1757aba64179abb32eb335b29f599bb825459f9128cc93572ef1bf435ad903c4337fbecea8a9ee75501b98baf60a6aa554d39f941fed23d2441cf76b72e8d83fd84e1b5630b5dc73fc2457ec0fb196b8503d4dcabb5e029da89d701150e22e758d2c8ce5e185bed6ba363ceff437681ba0e971dc040778e2e2daf2dcfead4e8eda81d723c402dbc512b90d6cad8228f3cc41d57102d1cfc67b3d4574833380b147b5c5bae0127d698d15930a407c1e6b5dab4032bea24d73fa2d3082e75a0b065d301e4f3d9eeaeab2b29672b70c91a8da9179c63f643c11e7127dae320c39b6a35baa8de48f6b6f0af8de4b1919cbd5cb5a49d78dfde2c7cb53f29f6d3050e9a29c3019dccb48201c50323e6f8d1218b86e780ab15788be2d5a58fea0ae99c6e05c7a9e2d3cc92670205bf3c04faf992a35ce09b258751e958e7672d16e5c76e7044ec2e0c936a98ed122111447ea81a917137c98eaf30e8b5716a40a57e1213ffa752dfc59d6d0ffcc4d41745d0af8bb7c0e0a6cf448b6981dfe3b52536fed6ea8b78889d6f2c44a78a42ae6795925eacc885c355dbd3f4348f7e0b24a4f05fe74db7b9027d2adf73cf17575831d31bd6f491afb0f9ad11540c93b3022ca8f77c8abad1734beb28e82fac926639f44bccd19ebc6f12793956e3cf3d7c426b45f0bedc729e5fefb98b188cf03012784704ec0779febacae4b3818b1ac18ab9b40a56a70cb22d9b19d30632e1345fc1c605b05678de5704abf07241cb906a36da1feea5107d399fc2369538f5e186832155ab16399c7bc8d7a4429dd057754510b7e3512e4e08403b4c3209aed60b1ef15b58c12ca79d8a20355ef9b98510770058d125a6b31e3efd7a691f6c707207aead25e1d28e40cafe2a43eff7b7e05f117934ad1a2aefde7157a704cf4f3fdfc1b1bef2bbbeea0dda097deb1b5e493fdc9f8a52093401c14f4a883437d0e909c31f607e58c80db53c49896584e6dfcbca424ebef46cd869efe969384693e2083b3cd6df3a283063ad60e309c4f0086552f7fe4e5c13e84acbbad67b6c06df7d82907eafc05dd69b95e617227bf847bf1f27258ab0e7c5e66b255c9828b825bc41c0c46a8be784cf9e5f8259ea6e321b776630ee9356e5cf56bf77f90d165956f134449a1d43af721f23d11ac0c04c1d042bbcf463cfbc6816ef952879afeed009617ba8c4f0db15a0e97fdf7facfa263dfe3636a2d0de33144c50a10ee35aa9f2ded631438d8c4ccc06eb227772c0e99d34192fe0f8bfc2e74c16fd2d6f21676612e0adf9683769e902bf9e58c034b9aa83f24aaeb5c59a086574876591d77aab942789571f510f9063498d9403ca28de544e015c86a42ae02ee5fa3809e1666be9175dfd118d904abf257aa9bbf5b9a13b78fe8ae9cff8071ed7a02525d3bd0f684c965bfd31be806cd0000a574beebb902f9caa6dad73f5bbe623ad7422e10eb813bce420e1ccca02e5985674413a55f8ce664b60c141346c8dff41736364f25f194c263b126d9ff7b2cdfe815a1f38ebd1e5ee91afc23bc73b9d81b1f9cb52b3d9ceb29a57f36ad1e3fb630d1b1fbccfd685f44edd8984427b78deae7a96984cb1bee9cd06f0d327d5ab3485e8be5a4b48e0fd16bef99674ca2bc8c74a294bb05d976c41b40831402477d37a677da9b4a5617977d8b4fab4a420c0ab0d25d55529d29aa6e38c2dd13cdbd058fbd023b27891f9e0cf2e29b8a5f266b8180eddc1931af55b2a1f2141ab31bbb03a4840bb4efceeffe6d79bc72c1b1b7d1f36bd8c45bb1cdcdc13a427ec23e60e9758893574fcd913d443c986b2f56f6877400cfbae4d71ba9e1c3eea7c2cffc2879385c7972c38cafbf54b6de73bd318b4bd44b6394c8462d48b5a0fd7b7598aaf5baed832159e93e26e99e31538d70c5c00ed327322d56404037e1e8b4d93a563436cedb2237afd1c022d9ce986fb91d1bd7f06e88ad54cc0f7137d037a3ed147dd588eb3d04e64fd628ee1b0a0a167ba35628a05cf147b8fe8c2d1dca7ab6cc17bea21a3c6996a2b023658270078ec7a1b4062577a037ec55b0483736069f664b1ba4cfe50dc8b1963ac769930d29e95d180f65a1632c4f5c04128642f0afcb6111177402998464d0959a3a3cc5f0c91fabcdc9a1e22fcb5bb11273b8e0eee1a1ca827059b4d0a3a55d695c31d6ea4f2f94c7b741c4474799ded0645e7d6591526e6d2bb307b6565fbab9373bea2064d4fc859847b27dac5fb4d5c2fe701bc4be24600dd7393d6544d3143321a698ee580b90d57c53d8e0f55ba8f65e6018602b15e47e8ff36db89dd101b8adb45cd601e86fd4a85060cca3fad16647f6654ee26980e6a1dd4f38b1db092ea5bc740518bcaaff93501d58b1bad97c80da09772b47bdadd69eeacbca1ab2fdd265e662e4aecabd04fc186d66c2479fd3b30cc24dd7223bf6df475a2eb6878dfc58bcd4afe75675c5fc58f10b3ba336062a7716924337f8c9476cce26d60d47ea3dfe45bf8fd6919cf7e5cee84c76abe2e6515d40b0844d167f630dfaa2ce9166bbb29c5ecdd2785295c8ea451e46652f90a27ea04892a0a72e3401f24351d4367ae2c1d2c9d392af7f082f6ad89eccb5cf7361fa33e85a42fde59056e11e792323959b63ac60477a5dad839ea303483b4ccbee96990ee4b09480a46da3bee6f55ed4145b9e02ff7dd6c0d02ba7ff418baeb20dbba18da4b99a0c2480b2b88574d2a61300c640227e9347fd570b191f6b9e30a6b373ec0424b892f8d73694bd682813819c4da218463c4df26bf8da4aa4c44ea1c438b36bbb951908ba56dbf598072344755ab0499d78d797ae95c82bfec713e637186b4144daa93c713a1497cd18df45d316f31e4aefefd46a0b6d284050885d543a9bed882e4a7c430bc70acf034e6c00a9f2fd174a9c91e58151aa3406b3ef62c7cbd94f3a05b07af17cb6666f78a2433a354fca31e7b66920fa1aa0929e82abe6836c61a5e1c05c13bc035a0466cde3f1457d2c4bd62b3c0ff2de4d9b51ff75c04c0e8518e794329a0e59726b1fd629f7a9ed054174d8a677c16003cad24f097dad27853b1e1443adfb20774caba65d74e9091dbac6a5f180ed0689c72b58af442f1f27b58e29d9750ac0324e1324c78f8e383b5fd67b6351003aa9396404ae3d585f342f3fb93a1ac3a1681a5e37ae711fe129d8ab404613826329c8833a5091b34d73503aadafc3ae2be45894c95c42246eadcc4ddee0edf9e8d21d92e2db68c552aec186ee809854c76dafbec11729264690e4c53b7a08ef336ce098e398e918d7ab292b63f5c23cdbcac7e306284eacd199c71a415b8cebabbfb99e27cf3d3342333132f35669eed1c4490b82d7da3e77921d54d6cda076b8924eab95c88b9efc0e81a288eab4f30f23dd3e1c6bf564a041907ce4166c17c2af4ac715cafce26e04c08309faccd2ffaf2a85bc2ec6a7b470c698527f195631dc53fa8f1eb886ffdd96dd5dced913072fd9e74a66768e1be567b30850cfbb6ee2114deb0de6121660adb96eae023f916d916daf5c2ca23d691cd2eed1b5cfdf892ec711ddaf0e1d57aa1e23e26fdd042ffb1ed158116983c38dffec4af419ed984f71ead63a037b88381564b14975c83ebf0299a14d6d53bd6141ea02b32100d91e515c42b07998bbfda51965b88f45628421ef810736161d40a1d0421b7081124372506738f6dcbaa1d62a44e3b4e362f284bc3e684a35acd4258652548dd60c66d9af8ffb04af4ccdb08097f36b0a08b232e62197331632c2d7f47a8500698f2e905f00202a7938293c01a50f3d221a6c335772bc792377b5bf0302d752a163439e4a02d0f1a2475c8196b860b19361c790f57901a2c34253e49931710ae54f4e0b56df33df92410f8728160e4fc5a56c50aa7e8c385d5c444e9f507bb09f1cf7df6ddd707eb1eee9579d08409f20ae037b5dc885c35b8e3105fea71fcd3692e5237646b056681593f8dfd61e2a0d43331af6a015c9249ec2129c7e83e81279c1df59601aed1d80b472d4c8d177f22ea4335c4e64d420549e7c631dcf899b993219fe74d7cd39f5f5ce6626810e3835ffd1791a996bb77a6e4b3acb2c3839bae1db4dc90e7e253dfe137c3755784821ecf9344bdc1751d6d98708d2c27e54a3752c2ea9e88648207649fd44763c88b912b5752b575e56328839b778b8e2541d9715895a8d6f09650579d3950ce262c71a0c24002fcb2e5422692e0636eda1f0ef9c462524c1d2d654aae5723ef33d11ab072a138fe34104501d55c36625a3e424cc4d52d5020a390be41b2334f681616eac6dac9d30f80cba5f14f96e14c2c0dfaa8629cabc1857d22f5def1773957d0b05d6138139b933073653ee7642674ec740d9f2287666f84f9493200ff2e32d291a4d8f6486ed40e0abfaeca736f85485952ff41ab95be32d1aa5fc43fcd23b70f1bb696ea0fdfcecc4f1392878df9bc0b16e78c60c5fe212ca7bccdc18ca6d8a9406eac60e4f2fd48b201d229082eb219d80c654f7dabba7aafed701cf338d1c0b185795584da03f0870e2bd074b0c50604b26ed02343793c51467dba87661d15cd7fb02075e19d642c7ce2063a1c5f402b9e0b9b6d61e7e20a6c2922bf9b24e912d1d36a2e96041410f2b742febdfb58cb13bdf9a263812c59d314de025473eb2010458b1583f270d2e3fe0f093233d051a8087378d4df4bbdffc345062ea47c53af991bc127b30af0e538d3000563175def8db137424cf0a566b7002196111d4c244094c7fdf052e95aea3769a433ce4e4e800b8418649bbe8c6297eb07545e6802de7e807324e92ad9a494bc9b1045b149b21ae5e3b0ad47f54864d91ee8b045cfc5419123bb2e33d5da736f56731e15658647b310bbb60025eb0f622948a353ef8776608c3da2a2c40e6bf862e6c7f9266f1a924be0464592ccf01cd2feb810e6a795751926e6f648b2e6ee4ce5d3cb00ef1c09d1b8cea6c060af7f98655f0b49a8174557015b8cc86a6cc770fab2098988c4606ebfcf92334895f0d62718b19d0b8467d25770f4c797760a8b9fe33334ce9c5c6f6fb9a66fd75c1738be759235445542f783d7bccabc8b2dd93007e677131c4450432d41dabf6a592c95e62bb6d5126d4330f053465c24b7f6657081d518bccebdd49af30843394d2e47fafca650445d51c94b36cef8db2f7faabd93e3220642048e73387d155169ba3f1473682853898fc758f5d91506fac17a5fab05d18144c0fb4690ad983b155cf5c33e90dfd87879a5aa1ed93340b0585ec725d1a9a64d7f85a58a2e6e6ef68306a79c94d93bb09c0e9f0053c600d6c0b29492bb1cedd29cc7e08353ea6573d8ec123c08c705b8534cd848ed5fcfd487304880469dd06aa52cb82ac2aea713ab10938b510bbef65bfac656ea6326400832436cf8bef67c354e6cdf0f2dac6c861ebc18f239d0010292f9c8ff728c9fe04325b745f2b89da987af1e8de9fdd50650ec5380b3e15ee3afd2fd71006b4a9bdd500da2dbaf359e82df77b36613e38861c4c9710c5b667babf293038f5ad6978b62beb3dc42da60aa7e693414772e98cba5f947c5b6be3701c8f81b91d3da6fb7de78ed670c02bc691c617487a00cc3f9204179527bdca25bd6bb2d9a5ebc80fd139ab42e6334ee693a0ee93227048664c4508a5523384a149c4aae1b540377c5a2b2bc74f0e7930547b026a654bc4cb902a4ff2035679ac69a3531977c35c0ac1c4f4aed3da136e7d5f3a156e18aa3404bad5c563ac120ec50f94c811fc9d81ae0cef3f991e8466b5547edb635f616a53fd80659abfb58e04105537ab7363a8c80c04c1ca6233e1a563b6066da9513523fb391ccf17cbf6ceae7eaf6eb11748b8cb1c7e8d2f8aa6f593cadcb37ce25c1dbde9302a3abd0ccdf2f876813d1f2925511dbc0b0bf07f4ceda3a65e637ca9e84a76ead4b2f199a6e3a9d40d9fe513b8a7f1c46b81cd32527727ab95e387e22caaca92f507d164048a7a133a60cfce19d47eded6168a88b03b3f3581866bd093e6cb70b4bfc4378ded537a2f074721efe0ae5174548d490e41d48a49d3903bc30563cb3a6431d8e9161d50151cb4d6e3d467676cc23f3d138fccf317525feb640f79edaf7d8210c10dbede13277eb39cb79366e7e8082b682f11b8108c3ea71f0df41c3a931ea7bdd8206c52b10c81c39119970c4f51ddb52989215e0896389c06bea1032d6d6584812941fa41c807ff6be142047e8019a1831e76294ed0678202bec433d3d712bf10c3a73260190ff94cd3aff6fdffa8 MD = fc85c2a27bac262772a53f8eaa19b3df653c10474adc10497637f246b32909b8b4c97bb19fb209bbbd217ec440e2953ddece86dd54f3000b00b37ff34a61d2e5 Len = 88936 Msg = 8595ad7ef34cc6b60238f58a9a72827a4b199a47e29a8c583a2e385d55a4c332ab609006c2a46cbcff0e0991bc62ae009b8a2ce319db14da669a27f074bf0e7c4df84c46abf170ebc2d38f83610bf180394c0bd97cd7ad69abfa7d92a9d6a4251366c786d4bd390bf38f6fa6b0f3b4c4d0671d743515c0ccb15521881c72edf5a4b1eb0e658f2fe43a4b9143d2a45d9206e44cfb691db3cc21b3fb1df61a51b4a9e19e2587f0ba3d3d0edda1eea656b383ca7fb54378f031a31cf3985f573829c9ffca14616742e0a7e03b0a2d7f05eff0219eebe8adddc3de99f1407eb00a1dad1256241d7c2f931ec993c4b7b9d40df5f290e68344e4497b31dd5f7cad2f58fd222a9ae0b7e91f4ad2cd18b3db2ad739443feb3ac66c8d21ed9f3b80d610a260382ec1d5a1d84cd502d14e496e6e13651f924535badc5579d31f1cb3b413c37e5a4ae021c165e1646287aea3f90a8a208b713a9da89e6a2bee464c3dcea1820093663eef9ff6a8a2f8d780e60465041391c4149a181994de43fa1245ac23a88ee86a2465c4f56734ceaa0b3d18e749e63873195393b59a3adc24b5f3d7fffdcf633edaabb7c8e7c5ece698cebcf82040896792f1a0da46e9c0ad7e70d69f496c0bcaa8ea00d9f0fb58756fc1780052c98a86c69bc8f05e90f77bb5e43169540ce8f7d64a288e4a7e1c3dd83fd467a82a45b9ff7a925fabda8a78a27771c7e65803ababf2b651bcf740281b705995e70bc2e983b68690f56c808a8c4f1d20c6f863cf700b32890f0eca1d7f7b8ef3da1308fc9c762ce904f1e19bbd97bddbbd93104c6ebc259d0b6ac4034d88fbe748eb1fdc8fe20dd39f0fb5927b75da6293d11308ea2e16f778b435c4cec129daf83b0f6fa724b0b7906e05570f11fb1c105c73ed2f888dfe1e932647474c9f35b3aae09f2b619dfb9db7d8d2c194a871fbd938e284f3121ac5b09e740351e55e41e09b5262c45d098f9237ebd82669c91ef36bce30972eb334b2a53349f984bf6a864872957277472da6298a9eeec78c3f50139b7c9b68313442436c606b03bef644ede60d96731f419cb6975915492227983830b02849fd8d08810791d0eac5acc194960f56daf8911be6fa52c278f49e74e2751465587d07ab66ec2450c23b55a6446ae6da3339e7ccc29bd11eda686c8c1a52ef7b1d1a69d4fb0461121288b99a064ad94b064c095751621d51f9e75887e7af8b91203c7d2a47358f3f6213a046e11e2fd1dc98bf639c3880825dda2b0d52742ed0ea4c09565268f8fe3b46d251ddce31933b85d398a90340da8ca7adc86289216002b0d6ff2486e27823881664024227baae7b0ba082ada68010b8a65d1fd6ac68f0d2accec67596d5a44236275963596dbae231202f1cfa9c7173de77914416103d19536b3f1f5c3c46daf841e9170ed5e9220bc3b63a845835421dbcc1b9a98270ec927d976a7bd590b9255bba478f1ac2a3622e21ed8bdae68c2ad4b61eabe311b532acd6403dc90a47851cd5dc2563cdcefd0c781f594a0bb8ce68785c655ea8dbfca20588e8403cecdf2d41bc16d89309a603c1b734d12d30d12010591f18bec6b5042c2ac561af11fc3506d1aaa39bbd23bb069d6597d35bfba385ff213cdadd287d510d1c55ea1ca5dd2d012be96d533dde4eb934c385a1139adf35b2f0858a1cb37e1b35447577a0cdbd36dfd59231bc11a2f3e87dcc6ae3ac27e21b5c4635584eba3b5755d988b5acbe57108c91c168fe0933cbef2e1e318264f0a5aaa544a5f70e55ccb09db9ae23394c0439f26a094d8b61233e3525c6c39e4695ff2a20cb568052da7e497152d934fd03023e9366a63065399569e86a18ddcc36865e3192121b18cae766176877ba52570ffca648af0127551a51cde4292a6acf64c8dfc2d3e490e4127b15b9a4d0334789b40a7713058fbff5753dfe9d8c08a7c4f1932243e5a26f2810d20d0980881a98ef27bb784486be4f5da17e1d0c8e07cc5fb37b082537b550adb62b4dd13919633365dc87c7f29b50925f2d50b1e437a49ca995caac35fcb3db29dd19cc2e8c130b2ca1e795bd9f1f9be1d3df83f37f7530db383283868d782193e915774fbbcffce4d340b6cd0fe5008d38718aa12767a1b32ce7b110b0c8085c18e8dc85edc090f53a3c330c36c94acd23afcfd776a1799738923ebdaccb17ec323b03b66b0e4ec79e8113605bf400085e40597eb54c3ff126db3373cba8d6acffb5f2cb7ee0bec2c7b75eb3c58daaa5afce307c2d8f7c28bc69971c5388cd0247ffb3ad6c5e694f7d871decbdbdd00edffe5dbb2393b7a4c3e5729f8d928557d1c04e427db2d6d4879957f38bacfbaab67ae721e27f78cd02f6cce4c1ef851466a1c974fb018dbbae9414b07781b2e1fbead698b17c480b4345aed337c6559fce4a2e2a2c76176aba205c0bc9657e1b78f53307d7b2adc64c7a1f5436407e62d162854c5a36fb4b73e638ecc87fe6c0f34405559d483166e63c284f078587c33692d4c1cb6cc1c4a08eaf3bbdf87238357f546c4b675c53d933d0acf3bcf82cc7812573c73ef23f0bc0cae0f0f7aaec064d28332936b5f5ed081f53400e5a044ad77f4998d415237a2390c3a9a517422d568a927edec4b5ea631d2c36a233b3883eeb2b8557b2d8b65f09cc302940a374438171948611f997ebd3201fa10ea1495c6f01d5ef52c6871d3de4ccacad78a1bc16b8b157252abd4948154132703655d916b3d1c37c55b40535f1c756e7277d68504f1e7987b1242584f4e67ee3da735ee52ac1fcb8ed07bef8dc674e751ad0f0371f2313bff4942590a654aceef56d93e64cedc18ef646f18e8ef5bddfb762fbd30e074d565dd5f47312d3e51aef091f20029c3b87d83a4500eeb8caae68fa322d051450d353ae38351fad51ed3010ab9b3517922afbab6355e3fa9e6994623d4ced9044be3de99adfb72817f12049de60cba7edffc761f29557016098a260c338acc451a0854cc178c18e60ae277e6176ae92748fa5239bc8311739c4fcbd6cfa2cf89dff92a05608242553abae75dbe5c4205161fbba06f7598251740940e29953745366ccac0098ca3619701bf7f5b6f79ba9fe32efda2ab68acf3031b3ca1d0b7f995a9b3a682e9a08d985d8cc57f02d49a7ecb388bf673279dc80dcdccf8f3b629765671035d57ce5bc734bbca89b507470b5e54d5fb8b4959fed728597f6cb66770e98f710925813eac1de8f90c047622fe02f085f24252841fe5b74ca5aa2d05edd96b7a16f16db8af7f80cb965fa5b0af6fb7f6ab36b78e93c007211c3aaeb765bca188f739f85c49d00fdc89551a9297eb07b266e6fcec02dc746143acafee70f9ae283a6d959c23c602868553493b500b5c43b5c1971ee5b19ba7ac6ea50d9826fdc2411ad9fa95b7f553faf8b60d6057422528652ab9a4e5f94eb70f22a733ab2d01bbb039ea483c54ef5aa3e59b314545d13f200c2ec8cff9d113fcbd4ddc1c9840fadc49fd83b9ada334e35c675b5bd3c25aa0cff0d9f639d913b5b96409f1ec0a9edd6ea700b66c0a1a459ef4370178931b65faa250ff15c166c8bb8c45a174e918523c7927b91c9e6b3901b46cecb0ade1ce00b5b6213a146db4481907c1ef56e7c927e671483bdaa84c393a6563f88d5e67669d8223035c98f6c3bcd8d9a7ce8db0a56165da564971ddba08a91dccabd1c0b0ec4d6afe14890ec2ca213f3aca8a97598c7df5d855388be881a050a9a3fc486404607fa6b6be7ad9c3898904d56eeba8da42014ea86cd5693803c32be03e8ce48863c789bd99b96d5b6a3db279ab3c17ad2aa3359d9f2890be1bebaffb08fcd6eadfd913b3bb48e1e45bd3b011aff72aa7c05209bf301413668110c25eec26af9e3d3ad11383b7fbe0d6c18a481dab564c8b745787e01655e3abf8ef867888d334f4434e7793750fe353bdbd9754c72efde4a09b71ffbddc98250aa40c0e91e621ada8e83a5b0e926e6afea669e5e9194e746d32280f691bf664ac7c4a4ed06cf6b1d24ad65ae327e4752ae13a617fa9b0b310d7f49fa698a0e374c4db99d2bc26b945c2f613a134d81ab8faa3280954c71951e9722104d71a39ea3a3a700768242c79fd0405b74ddbb42f6f1ed9f4bee42f96e32b13e25bb4d08338e171ecf59173e5657ab1a3d741ea049b27c7e02cba5e66518a18ed9b133fc64d6b1001f8d1282e78d497d565bd24cf1b38a25a329c3e36b109808519b7e029e421cad4c675d1abc3ac38fa7dafece57bdbd9a1751c478e8e33eb375c155a2499b012d402f1d8e3b26c0551838caafe297bde7448bcf2d44593d972e6ae165cda90789e12d7d67ce18e9d992bf5f76f90b3314141f0c8be73a3abc62df4ad29334d7c819a9a32cdcd9e622fbb5e5ab06dfc7276e54a419394ee02bfa69b772010418f2cfeab765cd325e383d6383d770dc202a3973bf5fa35dd4ebdf4e50cb80e07310eb39e29a08e8f9243e1162819fcae7245fc484e68b2ec104f7d63f677992902954de4b54f7c660ede807aa31fb71c31ec78f1c355a8a4d7f2c4ba9ce52e01645f4211c1a01933b9b218c826fec985d1f591cafd57939206365f3b9867593ae6cb2497a758e163137d3e912c4da095c2ffdb2644c4e03e3b88a1894194873ffa776a08fec0618ebc7e56783b72d8a69569b9b632443b03e868200650f3547b2fd286c8307d26111563f4cfdd14de42c9d1b1dd5e4bf07d8d637f352eea2d96e77b1f67e4e58b94ae9c9e0a798a2df4c0b6581e2152ad15aaf903b8340f9efdc1cf786a74a01e83e8a6b6daa96954272a9620fb13eebd66b1a751f218ca152a3f4e364268235b596400d392e538cd7457ef80e6be76cdeb41ecee6545b02ca6c075dd7247e5deafa14978d5a56f0646e9210c8379914b1ddc383d94334841edf5e4e28c9c7df4d110cf1b156272ab294ed93833eda4b168d117d40179f8f18a3009ca03ce425a7843303ed4b4ea08960986788a73579d76c11a263f7248b7e61f53185a65d95bffa8eb6896153bcb07a9a761f9b2f06ba23cadb890c4ce019c046f31f2ebb995f1c27f0ccbfbfe5f189fba68f42525b885a4411fb7e9ef6b169faccb8fd85984d92059a008e1a821235c3e122c325de08b8882a0274a3360e0319a3963a43fa5203309d6bf5eafddc28fb0e1e4730f804e69d10e416e106f737ac5f020e7e263618b1df551db9bd1707ab15ccf5fc11428c8ba9e98de2cf35adb9ea44a1bc86c1788f4a082d0e2a8b7dd9de74f610928c515bdf5b012efa910c4b2ba41a8881bbcbd2c5cb4e72acff308f505e71f4e1a8dd149880994bedd0fd670a6aa1677febbb8337e5a86cab3dc8d455d18f31685ed9bebea27ec312bd27176fdd60e3e81aeea88a9f62848f0beeb1d417784e8e78ed623807d81ed01f336242467c8325100c4ca541a542c0324a2cb67653d3babcc007eef7cee28ebdc8516bed20cf9c95be747013982fa77a8350e137484956f4fbb5c8bc8899b6608fead31a7250b671ac2ad35c64d2aaaa41223ea18137c9e64574ae9d2fcaafd02f3760159a8ddb6b7d75b66630b3328c2eacb5fe23257b5b474d88e1ebfee1d55140fb25c10f744dd95e0177255ba8e6f0f52f94599bd41aa9473ed1e3bcb4379d0c8d940f5ce7dd6aeb9cd86b5172812f0592ad49223ced126bb8b5408c90bdbaa3fca8abfe9ee4d5266fd1291dfa2594e5c88f1b411b9a2ac0dfd529f6dd31510d32aabe7dff29c51763a98748a699c69cb782f881d9ea9a4e9978c7830359095215e16f5f7476e0c55eaaae59e0a76e3249d00869dea50a1dcfe742ba6afd8b7b8f97e72e6491ce38491ac6d80f1534b064bf7281929321366a6bc1247ae77f9087124d71374338780d42f64e9aacbf1df2995f515e7b88a0504a6c479cde8b97e49ccab15454c68e906a6742eb34b881daa4f662a827e7636bcc6cad36a95a9a907b8675258c1f81bcda413c6975c6e40429603bd95de588a13be9deb21192a072f7a84511b3ec5978d9abc47c37924f586fc4645ae62a15dcdd0a6176dedcb2725a59a98090d41eabb0cd638c41c4c9bec04b66928a5f1503fcf8bdecd8dfd778eac02adaec80d93fa8d0a0015c035b1e621cc8e8102c8dfededb7d7ac644176cf1064f888f97921b07dc044450f70c609e6112c6423887b5cbda268a72b27a36b552a1f041c24f27151816bbe549e46cbc3fcd93e62c0a100d1d4283a2d209bf7fcda77bcaa91a4b1cad5ecfe2a1eb2a04e080b6c5af1ff7ebcd58cd1f4ccbed969ee991f1f3fa6f62c364e811a62a83be6cb399a76acd52ac12f1d0b1c7c9a944efef9b7f49f87b3080b16f3801a85d310aeea354041c09991394f31feb09dccfe542ff3d521a57ce0fccca205a6da2a6e3ba3c93261404faf9c9a13361956c80aa6927f0b76aec84963d6391578238651f9ecc2d78be2b17eb193fb3d175439f66ec79631ff0209a3e8da153a3ee09b6e523bbeba1216737120a3668e2af477440545f5d33b3dc572e43eb2de4b9fbe15dcf72934a459ea39626ee1a3d4d6246612740a59bbb09058fe7abe8c3ecf82db12d57ed1a33b9a49ef5cf918a567b5ff1f08404fe108dea8801484ce78ee7e406c2d3c3baf2a18052fe429470d379051734924204bb524e421a2a21f9a7af4c87184fdbd18a3c7fdbc9aded97cb4681fb7dd42756c33e7be4b9b92fa0403aad59b631fe080474eb61de7962a846c91bc652b17a9c303bb897675d3e855f6f51a724e2f40767300a0bc60fbc4b4dea1aa03c91057d0a304c83ab7e154f0f367f97ebcb8575bb58260208d5c227e691c8b0c2dc8ea25a0480cf0d847da755777e51925379fb09d3856e2c353ee51ca66b1f6cfbdeb328a19ca415d73e353b1a97fea1e19740588b6f76ba96f62cf4114c14c254bd577aeee8294cdf20a0c80812c6a0dfa8edb0672e423b60b4a578bab3b84d50f3365ad3ab873904eb91042737d018b474a9194f09fb37fa3ef8af8ae733945747f9cf382fe565af66aff8604d4591c8c31d9c2b47c934ce5ccca16732ac1fd28248e105ba6c56465aa3ab9c9e4c91835df040e331d3bc43d8c9573ada4b77276cca9922954396338f1425c1700ea24d0acb0e600f4256c17998d8ec283a23c0cd28fe780894addccdab6fb80cb34b8e91560c88293d8bb006e12c63649eab036d0a19ed5a8421abdc10906aba6215aebb384444c6ede179484b5c89d6a2985a1416f06ad53d7c0683ea90bec2438615501abe7d2f7ae282077f6f45c66b712c89f78ed8bfe745578be1789b6b7f282b18a38119ad0b16340a256d7e7b24bee19553f81d61a90505bd9e4febfe3e8359da7c950286c804f71be45f1e3ef308e100d3382303ac4378dfc91d95c3a71d05604c021e02da343400644c0c5700d593921e54d0ed188718b90aeb8102e3809970bcd0576b692e51824e3c300e74b06112dd570e66145a4d1507c0970319347bd3740893079c7bb8694a3772aa771eb24ab746c4b7c8427fb96ba4bf0d72bf15511bb2bc209ca2cf7dff46ba7530a9ef00552bda295dc9166edc9fe16a16abcdb159d4b9fc912b00861670f0b5c8d87efd5e0d3702fb777afc02bae5602c800dbdd87872e3a29fb24b36befcb36733c8097bf5c58ac9d3132b87fcb338ddc43c3b3da5cf1ff7844c950836c6b7334335eb54ea6b0bf0654ac3106e333a5001c1f43364b8f7b965382c34e33709578f2e6d90f411cb98b5858b48164eadaebe06b060bc15b210c7ddd861ca35f0f9a01955d71b9f13e74c2d4cd4feeadb1e8472366cb5ce992334a36137f5a9b642fc5f6cd368fe2b08b1abce5f2ef00ac9da6d500057cbf41b33f28e606b7ca1592d697a2ae2145b216c65d98fac4983d6485fc4c4abf50b1f4d3228813494fa66bb9e478492caeb5b06c5350c82db8e6e56b05b5fb832255808cbf74559db08932c659a8a7e0922dd0632a97fb89072b98dc9dd7a866b8beeef26c351e13815060a283de3b0b74ad0f414ff90544f79de741012bc1e89860887a95450d49267e7dc4ef63830bda95b59d2fde660ffe90694eec2ce87725cce5abd72e83ad3475f2b3f8e31040487a7bbd66c2ae38a0b5873ccb457c9105569efcbe4c11ce2fd967e62cd7536732edba5871303e6d727fd9b10b100ed49bb01ce39738481a7d1b35d217aadcef1e5209c4dbc1a70ce851c94248171fa07d4bd8070e7d9720a0bde50e35f80d268f39e2a902d1689576cdee46eec51f831eac68cd90867f6f3f241e01142974cbfa17cd6b82fa1395a266b1558ba48f0af43447adb9dd7154acf019411ec9943de37e3282d8a6089bff9eaaf48b200e969275ed3dd70d0d7f7ea49f54c252fc0adfdfaa95806fd806e2e8338a89d1eeb46e03c1d4947fb45e28b3f8a2ab401ca133aeae09f6b2027500c603adf434dfe31b507e386eb0066f4fa0bdb1463b669fb38da566b8070844bdda63c556c332b0fede7aafc248643137ed67070f8f7a54a3df391250e96a248e780c772e07879c9d103fc13b935e22861c8d2a73c6b87e9925c1b33dd3986307414629e66c5f147a984603374b74d1ce9088822f7bb16c07f3e7cffb5023ae9ca8a9541c8c29971bd915fc41bb18cd55fbf1a48f18e5bb74bc13aef5e99c55d310be8c3cc167b2f5453802e77cea53d0b141180f18d5cb7400cdf6d9fa52f72f3bfe48c3b699f6ab7f24bd950b3a23b3430f334c16023a6a448f3e042cf801257cd1004dc650b082f95482e6e0b8ab6233a4bcb27aeb86ec09cfcb00dbec124a45df49479b0c9f302640093987c6698215b9eadec1f21f5dc318444c91afa90239919a2d8f2e1117888fa7198ae3dc874bb7641d85c6825402f12063e8d313e1ca70698c2d4594cdb29be31344b172e64815af1b20d95e433bd2f5d33bd7016d6af43dcfffd3b8b716ed53935f8fdb23bd6d32544daae1cfe0361b17152beff9bda59d857178fb68480c6f3625ff53c3fe168435469bdb4ea2a336bc1f524e4b14fcff292c75bb45a8719c585280ab4bacba1b4ab65c9943d5a2af1e94ea8aa61372d9477b7a96f3baa571964fb4102f2bb06e01174dba43fbad0acb104553af3bafc25d08f80ce71110756c97ea40e30da202f4d3efacc3a73ac04e3c0307cafffc30d63f6e9b943e5b1e47a5c3ac0bb4f760a296c2ef474ac466245294358dd2f0ab3f995ea18f84edd2b3f3b0b01dd4390d76ba67f04368e272ca1e895b7c4715a8159148ed3d9731493e2c420b7dcdef7ffdc93f6e4c841d6ccbda42e7fadee39de4d1adad32e7ddd84299e80cc014732eb44dc9a7c72ecdba86106179ae0ce32329b4fd8fe3f93c166de71332694a7c9026b2974b47cb8bf2a57b557eea538cae60c5d8f3d53de47a1c7e742afdd2545ab18218a752dcc09b8665af66544548b6068e90779b386f79dada6b44d23ea2d50156ce6a5cf5141bc559dfde6044bfc09779e4998a8b259c2575691eab01e095828b3902ea86ef09ded2573582f45a54900215c84788af6798fa0e26dcae7622b1a9e8ef6014c9dc3f69b60a50b690f89cd1d48236b3755281b2caebeba70be31b2d4eae72112d09638a6ccb4e1e0c12fa438165fcbe1fe39c4a1fdc5c8dfa8d2bafeace852e9117e7aefc06df8d243a54e1acd1edeaf7a1252a7d76a3b5da576f8c3dae0daf9e9e3861e43b89a661e51936c754aeeca501d8de845955d113f8536cc7eb90269df2d22da5e7d0dc4d99d3ad617ca415a08c03d094e2e7424fd673ac09f5a12627cc417cb18a49a15fcf00dffb9861f862b6529b5fb1dc9bd6784cc4846ab520b46102c9a7915898110b1d2906666d27640731a92534aa4050644b60c7a94098dc77a2bef89b9222f9c4a52302352a153cf52d8485e9d4c246110bfb343fd810f8768da715176ad4828225588fa32d34560692b8024ff0b41014eaee6a9ce00ba0d4303c9d83571f33ca1a340f2eeb1737c22dbe2ae5627846c684c4cb5efcfb5e1746c9f26dfb759612f03ff136e8306aae4af15038ce9162cc4618e6e4836298b61de9a445ac7a11e343e6d669b9125731870c22b87991fc9ccb553ddc27c3e937420623990e9f4fc181c33f25b22f95e24e6902f317fc6c9e60f440843eb1b8214fca00d67657a824365f9c0977faaf371d9281670e334b67c3808f9b4c9e9e0a838fcc9c9825a381ee166d638f15fba671131e82e0c9117f5f948b8fe5fcf339a9d1d749d89bda60f58233e24be403c6e5554ad52430475b918ac4b07f5f60551f3ac16cbc2ca557f91d800452e7600ef6f396ec4d0b557305ddbbcb9d386dd350250b83a75aaccd7552c22818b298e502587336cfbcd45c2927e13fb40a644ae91b260d4ea84937d6cc7aec21b806ffb40e602320c74c7d77d3c56b4867ec1246a791980698133db9e52abef28a42a568800e5fe4ad166d7e8be8fceeb37dcff534ee82639c93357b37522f0f8bd47cbc47ae3b8fe0da92a99acc530b8f91da715d9d7afa3831b5b72d71aadd3f24fc1beff0448704f193858ad01c234eb0d8578c1ed01efd8744ea4219b0d036bc9a03c355196e8c03c69ef694a6ca93633ff43af320565efc49811faaefbcf513dcf07c4d18aae889d262489a8165d01177e404aafa34cf196a1810b595c7ecc33b8e7558d0d09cec1d5c1b523a89975426b353b6bc4ee056fd0bcfca619590334c2a3908b0543ba32e08c94c40aa5ba3b2ceb296e4e9154d98f89749d1aa81fc755051cd55ca27677ad4ecf9225c9f78a2b2abdc12b7e055b46b21b4547b34775d9d3a273f86f2718a6ce0d95df4d55b8ceb99f6b41fd417e5bfd9aa688c1a4c5b6d6c96bc3f1f89d31d6f7d62178fb4c7f6276747a5530c8373399c8c61b5e3f55d63ac7a3720f8fb82c355cd49411cea5ebeae5bcd0f9c3421cbfb4e70a9c6b1c9b9c8f82389476a2996e30dee7c1c7a71da5c5f1b4c5f7e47fb571d5d486d274ec98c9478cb0d857e54a5829ba31beefc04c1c004abbeb8625230776c145fbc692d67fdab68a3f3fd873de9b54893be49c8af3d1da04278ed7af7fb41b016e7856fdb823fe4c32c23a8ec91efff2c6ee7804514cacc733665b04e07628e1b4f4feb57d09ac1b3a48d24622990194e8751e653e59072d987479c832a3320e54a052a8d5770722de396940f0f3a39628e15453c2e0355edd22fba47d257fb0d6e61c7cc8525886a6fdc7273b162d200f9be376e6c97c818ad7a73fcae357eec32d22d95e83e7721afcb4a10ce9e75c24099378b1fc25be27fa474220c504f0a2dc2d68a0f2fc0cc39ef8566a541870ef942bfe2c61773e3df5a15488b3cddffb5d05d09587df7c284c5af05d3f0a84f8a475b35de1bc29532f7e1e0995f9e3571772ba452bd7ebd16ca414ed9203c1c8a2373c4e623aa7f210a547ab53d1233c723cceb9c42e8147689c6c23354c4ee6f43a4407cd3bdea100e07876d69dc835d62ab3f83b2a6511a60ba006112d54da0446718e0b05f9e867f5597304a5f9c7ab06120a7914c0b790b8589e0cedfb2d39236bed03e01e4fadad91a9c630df7c599692f86534b9c28c6d3bf40fd66a66fa98db2c9c16765f3ad0c9210587a1db48a3dcc9e6d179b904f0f10f032eca0db16e6951c0ee289f7726a8e1a7f3696ce1f49785e63427245f0a23f8ce3e42aac56dbc6656af5c98ca76d7f395ba5cb88a536c354ca6ec8c058379b55a4efbc69e5d7d7245a23cd09c8afd5eb824a446ac8603e0006df0775e239a508da61de8a406537e770fedd15628c32bf77b699eb056038ee9d15a70d2b22fd0518dcf993f30e791d33e9a235e19d1613905d249fc8b1547f11c52fcc9f7df3e8d4d3960d7a2e1b34176694c1e25ce08680c08cefaede014ff9402a5abbb53a1292c84c5d425e8eca90082d6fc1363296bd633b511430dfcfc8390f2e0c632010c73d8509e81a445f3240e4962ad37cb2aab7987a8574308ce2f246bd0e0256720695c8a9d7ebec5082a352bb7b9f3f68dd505cb29ef2b3f5ee1e799e3d1d4d94c5839fa39e3de75ce5a1e0663003eb27c9bfd09fbd46ca994e000038260e66278869629db7aab5b2efcf261ce4ac108df448aca86ceaf4e58769832135704078c3c9c9de909ce811057d8c5605f23ff9e19d39432a59c3793e9d7ac007cd5d271c273e0cd59eeef5db4f9b981060da0a16201f26720da6b2b82e4fbaf9802ca0d60427aed32b4acfb5b7dc5990927f2d0673b698d0812f20a89e8a68a7232f7495e31f1b35cc8c0d4948b71102e18fd146faa830c25ebd516460a36f7d40e620e036acf869ed133cfa74b464e3e89c953c375c74c3f0e1b3900733260843d124299129bcdc1780dd3dbe6cbbb00215f77acc6bdb61e22cc5a014a222c4b680fce6654def28e6457ca7a8489bf3e89c66670c2eeb089d0f1618fb88fc3f137629bb3561f5cca3d199bca4c06c3be68060a5793e1a34ac09035f3e5008d3e511290c740e67340ad592e1467cc2d49672849ab611ef82799b4c075f8fdf2fa5f2794ec3bbc9fb75a216b9ffd6367a72e320db2532e15e90462e95c1a0e5aec08aa91686f2748f6ec783ab53551d7a0642f3db692986458a8a498f272bc2dddf5a26e8403b1d6c60c67839c3720e7fcb124c1fd45e44b3b2e81b57d298ed395ce1713881fe2b1ef62f42e9d2c57fe82bf1b81cf959b345b3d022946660db4dc3a1268bced414139952a23003c7f83fb331b6476aa4486817e2dda9552bf387ae19954679256ef6c4e0e4a0d8e1fe030b82d5439ab67a973980cb1b2152ec8366cb7c2d339a9214f34aa8b0c4bbf7ce6f458395fc18d05fa34a796e4d6e2cad98371974608c340abf005cf449ae8bfe88fa4f931133d02ddfa047274bd62a82bcdd1bc09272bb5482927fcfea42011fd32197df7caff08e6912d2baaf336c8f4f3de1964bf69e7ee8819fc8290f2daec85c0adf90d5b7fdba22aabcea0e694fc9ca0969ef8063d65b4e2b51887e3827e2fa0717e05dacf85d401d828ebfa720b71201c01f9892174568a1108b17d717bd9c1b2d0d90360acd0bc9c00fdfbcce81a6591d3eb7afae5161af799354710ab2a2c5635b25e9a183e63de9dfe71095c3e77df5df5622f7e9b994e143cc9c5d5cbe847f6b874e690c4fc864815e2912f855fece740c72a088e0f00c1ed8cf9c363fd6b5a12ccaadd0d917b496ad8cc299924a2b9f434524a9684f4e87117153b9b74acabe9ef4fc7bf29a7e826da22111fcee71a382e0f0e5c0112d1eff27f061b54f12f64633e1683cdf16d7171fbb1c266a554343fc91a888d42c490a6a1ec8aa52130acb2de920084411f7223bfcf28f3c3ad11eee837c1316c087cbae2b4907026f4e8639603df567f47527bd634f97d296ef7c3d42daff478e6dab6a928d6bce7c441ffd030c74b932d38fea8a8de0dbfde0d47f6c4fbde4ea6d223600e04914ce7df0df3e2616c66194d369df37ea96d477c01b4c44df7d7908e886e2fc2f73da7e91567e155c0de53b9aa1edc835c1bef6b7a77f44c48f9eb336d3b53b6f7a24a88a093f54a4fe422a3e2912c922bb11f0338a81da1d89d01ec5a2f418b986319e335e1e6e82261d0336760ab5620171f6cc5ad07f4afac18dfd8b2c3e7e3695c235cb87bd8403ba393c0f12174423537cda9f07aecd60c79346e2c9f73de9a5b6f9d807dc2b15ce4e875ae569799f3af4e6ad73e3154a76c14a5059ed693df5df081a2b54d7eaada5d0ffe12652e3ace1992cc1a6c316338a704a588b80a21accd8f84e822ae0fcf1715481c8608f0de53a936d845762a2714137425c34a468e2f508fe1e9497209410ff63da32fff2527357d3e632ae37f845adb3d9d5b374c3e4a2b674958bad101856f3d64ac4decbbc008156f5576891e624097ee45dd2d2107c141eae2d16f7f001be47086c47a37d1412410ffca8d0bb20cfc5f101f7b010fb73875ef9e2be50862f970c54b19c4f18f35ef31c9d372d2a83497c5e47c05e877149288094d5823ac460b72c90f8aa65a0eb3f35aa27c4b7a073f6c167a561c679de8b3fa1c02db6191ea9428a5b07b0b78054b654450a4ec3dff0b9cbb1b33f19a207a59e10bb7e9a3b4334f235ef5083b8d43d3ff1865659d7eac5e887db37cd5e1e50ee59b3fac44125726d1be9eba1ff2e28a1cf9174df065564428a4266f14d4fb026dd8fc133bac0995f6f5fd89ecdd3073e21d410bfe5b1236e5b7133420a1c41bc4ed758452295084dc2e9ade69f536769bac6b098f09e71c05df0332c1ef4842310032684f3235dbc98ffe1f5fe3fb7c8dcd1dae6b17ddded1437dd1be669060fb3abc28fb6ebf820640b0b6974e876b02a9e062592cfc64910c0979e1afa35b6bc29a2a1e86f661db6a3809d6dfe32d40683b8d23f04d968d612f92f072891dc9c154d88021e2618f351f82e73e16a88f31b7978f0dd75d0c6b7884b4564b8c5d5e7399e8e88c686cc8ec87911228c6392cdae96628a29f58516bb8f504f0926ec27ed42082fb5fb84c27829b03226d85832fe96fecb746b73c91947b2480164514fdf3ee99372fbce859dacebb0b87ba5b3b0074fe1d38725470810d5d04ff2b7d795d1bd249bec0c509f7f2dfebfb21df88963b09dc5fd0c092e8755782376625797a6fd738f60c0abf41cf1acbb102349d148eb3fda11ba97f2f79bb05a53e3385b2b1500cbee7e003202c11b291a58502e033a487e89936bdc0e2319231fdcf256dabe4cefd9b6f5efcd26fa88351f84064f285821b9490d601776033c3e923e213233c859d6ede573d8adab56f4fb5de0795fef72252de525c02f1ef434c54430ce2003985a956774b1afae23de8e56430e2b6ede51c49b738498bcf996c8dd1c0b0d7f29d93fe448e4a7936d561b05a49a3566c4b39f98ffc16d7d9ae92f412985469b9cd76ff486fe4fcba1f053d49b99e857c3ef31561122f7d176805b190fa985f95fd98800b54ae2e74041bb5b9e89cec26a690c6b6e15c2491b00fedd34f42618f1543aa14a672b46e6aea3f303e64337169593315d167744e6ff6d061001b16aefdbda5ebcef639b03bbb043823c00166709685064a1617568b0381c473eb27fa9e4e9818320363405dd62c58ff76fe0ba38fe311b433b2b1ee7e2984127a3b7bde40ab233c60da28ba83de193a4fd36aea8b76bf7784f0687eafef27448ffb3aa6d9089553d74770380a42013c13288b2ed46597fbd2768125ddfc3770f40f3edf63d4f6de2e521ec1b2819a6d8aa47455b0d922a9e4ef07c952773c006f1e8f6f243acc472ea23c3cc5c36c367bf02f4968fae6e78401ff545489bc5bc9d036406560a1f59fe0d190892ffdfdb0b4c4f043ef6d1e785473ad2c5a41e9cacf3a386d6efc5049b3e6a747eed82bef9739348be13fb789916abc2211521239c0a341868d66c0f3c4826846278229014198fc86f7e2187f60ed697dd7783edf4e7a42f6e566ad67bbadbbd003845eae5be92f7e5ae0ab2268039c87d339d5851fc622069d847f6b3f6f882baa6731bd8d32b7b931c1d73a52b43d862e203ff1db8fcbfedd489ec8f8d1b7a043b30cf87e7d7b80a50b038ec50834c30fb2e4ec2bdd2426cf3b73468fda3177f7ee5625d7d1631ade4899e76a0869869f792d3db7b915c598e464acac93dcf8eda2760d3f3757d103ff000de9bbc51705fc80ae262a862563cbdac4f602a16b4e MD = 43767f4cee6749090fe23cb07e7db664d6c7c512f8afa70304f2f14b8a7204779e7223aaa2c8ff3e82f8cd72529e43d5df545e886f647a766ae4172baa56407d Len = 89728 Msg = 7caae2640e734539d394d20a3b0f8c9c827eb6f726b4e9229ea1632e4976a275a50a3224c17cc3f7f51b7e44d082993b5207296c5b57388a645a186e6d5df65e366fb290b20befeab9f8660cfd6e7f903f7a2290c3a3ca6901cedcbf9d5f38c299a10dafca68f19988f53169aa196524b29e486c44e2c74addc5582ac1c58d273568e989efdbf28ccbd88764bfcc747d113a4407c75a57b2600734b6c1d81f17728cef270aab1a4ce86a120324cfd425c517bd6a3555a02bf25b176c85dd1619b8d4c6900421906049737750c26aaca437fd5c9b7419cd3cfb8aa952f61f9ab66f0916ccc3857d5054bb61537fe52480ceb3c9a46eee046ee35d9373fae5d174fff389e4311f08a57309761344876643f103ab8c091e6d4712997dd47a76e6ded15ac5df35365ae60d265e98fa9a97740ab3ab5c2ff03251f0090e7f5f1bff794b0672c5b6139a9b89dbc2ea8764e29c808c701bc7ab7814e674ef7b8f1c45cfd6bf399f9efff14d51ee4a12d52e6d42bb56a3d1b9986a175aa1c8d0f4c1df67db4cc274d4408783cc279d17ca3f60ee23d9eb87edff2de2b55940877552f5c9c076b44c401e83c56250640150e1e42920dcf1444a28ecfd6064ffa6f916b17eef05b72fcae30d9b7b2f46d84e5a21791a295c10ba5acdf1c18aae386a56390dcec175265ad54f8e7f8eeca5abf33e697986d5f325def8444293f542af5ab5fec7719338d83e6e25d633fd7051f4637ea5bc04f671fd96814a467bceb06a4eda40dfbc6e2c6495e9e9e6223f27a5ba420693902087fccf2d406ce9e355ce2b27a3d196ce3e90ea601e71031c154d683c04d2227a4f26cad28ecde68a86cd76705710c963f6099514de9b470e033698f40843610ab1c2b0f79b311bca2bb0543ac464fe323d19bf8d922b971ed9a670f378acf6da9617a825cf602fab2cc0ef0f5294dd45f9069051a0ea9a527fe618c0bed688f2e46edbe39221cb3571426f76696a0da314192fea72a0f9b4de3eb9e34089c058850f71b94c3e9771e281fcf871ac3754749ac5e06e145b4cdcf57be5688c46165f42912f657d3a6668c4bc1cd223026103d179b9fe1069206255854d9da9c1345c4f63ce45a75d1ce952da6af49717d1a70574ff895acb3b59a400a346a6d9b8637d101d5584a79c4e747c6a40d01dac4a80dd3977bb28a2a72b1370cd4c37ac5b16c0a5fbdbc1ed8072cba51c95bdfad388ddf02ffb285f3632e73a996383172e609aeca07552176694eea2f1af9fc42a669cab1be27478ec01a38c12b36402c3a4c77cad1b0323e7220de928e76a12376241f2a238b4f8b3df70eba003837402296fdd88937c18ed6352032703c6eae2c3f54d2cc48fe4721676e1ab1d8875d339b8959ba564fe5fa0e37758cb5d5613d3df45214fae4611ecdcf59bc71a0d1e1acd2e4d1b64de2421e8cd2209d45db2d82861eaa1b92577aacbb0d8cae145cb15d43005bc23bf262e8a8eec83d607a71bf72aed82578a8e976a98caee8724c272f6212d4f4aa94c0ff0412002095ddae4752793ba307c3dfde237dafab1b3ec795a8b2c9d80a47e0b446e254e1566337bc9e04410ed036c225a156eb809f92f7229f56a6e6eb9a46bab9d632fa32b9b271ddd694e3627034ffbb8f0ee37fe74a48ae84f89bbefa7784f57426d5bb2f83196a7683ab2f1ebccedaac665e3caa458a6eb43b8104f6d7758232acfe40534e15ec5ab9d0a680ae157735ae5b466a5d6a486aec115dfdfb3ee8a831fe72c357f9dbf983ee69549d66199123652d96166ad41f86d71a9e5733713b5230b2de5537a1e99e7ec7e90f235a6581f662bbe50e9a58984cdb568fe5e4628a4f9122aa51e68155ec72dc87ff82293699864a6db7f39c9ced0094e9d89ab446958e3eebcb128746c1daad7c3d5932adc8f8d00509885211323af8198e1cb723cd1a618e15ae31dd997fba707f2838740f4aeb4f75b12f71a6dafe7378d2d18e30c65905c41237a6ddc2a1f927779115d6ecda918f167b4ac570f6ac2b559a027b0273e758f6ff2f0953f26ae8dfe30fba6f4c9fb810dc19189d9f18083d870d065f50a746c50ed296940a6a15c994ce1432afbe8348a8491aa1563ba1d31f2a6d5d6dca0ff4dd3e1013786b40bd2cdd8ee7827263268677362c9aab8abec8c71a6d29c4271ee0de0042bae2fc2311ca84fe435fea22ed1015bffadc25692a8f880f132a2e9bb01ee1b25055aab3f9f190d790eb8ac652a013abe542045aaad040c3c8608903d18d3ee2c757ceb83bff2d13c989c7a94d93caa0f8719a2bc035df1ba80bc8efbba562448e6dfad85e4fd4237bcf13143487a51f82ef6925012cbd87309050a7d504165813ec917ce770009716301fcfbde83d78431003fef41166970072d2c4c405a5be0668351e5dec4cdf273120142031ee5b8787cd120fa054bb8647a1eeff46aac6c46558452831137c3d66d68a31f15239eecb5706ca5612753063505eed238002ec686d89eccafefeb725a5aa39a2e383d73f2425aa8f2a44ad7a50cd2448e002ccf60745023659c723120ffccdd32cd9df67a72726c806ba4bd145822b1325370472981f0effce661f9097ea54ee889c75e96263c59d32369a2c8146681eda202182a2607983d77bfb45bffb6561a15c2918e8741d8b275a26d0a66271b8795e828ab8c1c86edf494495fac885e8e189679aabc084fe70956062276ebe9c8d32c61f4dab720d708e8a05daba2cc0d3b4cfd32ed192738868d55586d3d527805d6a94c3960d0c259c4a19d248c095f26eb046d44fdc96e954f41f473a2be5ed2eceafdd1a0fe758f2f346640cf7e4c807b78a4e63b9b51dda5b43dafa49543e3780b4dc9fe10b95332410226f2929cf105401ffe5b07a80796967c4aca40efdf81f4854a036f564dd4b0b7007dac16238f4426b2e6743dba2bcdfa6c9c252a6f108dec7b358314241d69cef3f93684bb246c012a634ad69f6b42fc3ba3adbc3b2cbecc851fb4bb8015548e29ed97ac64c9a0f78f5af03c5d5eddcde266406ceadd6f6b8f466b120bc55a41cae13756c488c8510953d0379d0c87b4876e4703252b8813c2340ee26a34612dfd5d7e4c8368cc58bfd7518e077e26f85341284a931ff10a467007f3486a529cebead4554a729451da6ddb0b42bba3e26d694d06ddc092984282bc0d4b7016d4bc0fa138c1ac0887819ed674f7cbe7bafd6e1c02aa175307def397f81b4d931e97554dbe8f201141ddf1aa92cdb7d9c82dd6ff05a32a1d9d4449fe7b6109b3c1a44340af5cd695c616eec02d6d866053232b5dd67003d6a4990f5b60c5ad5d070d61e2d3d2d47d5f531d7e0d7e4066a507f49e3eb8aa686208ca156dee407936f7379cf19724b254bc074df9a9eed20402ba29052325b920b604946b85caee978c4ed4d353ce1bed7b3396ba96968cb93c0468f35b7eb325ce4440213154a672f42df33fafd89f72b529bf18ec437b0bdc5ac2cf05bd3dbb761381599be4880f575c62fe524c282a957232db54fa89440a449f63cce83e28d6f8bfd96b857cb5dc6488d8e6319d5e409555cb75c59dabf04b67755509a0b5187b626a483c6aadabcccc941090e556e11a92b0f8ab9f87b3f683ce4b274aaa6124d2d4da133a40ed1c98fc7a70ea5a9e8a505184b578217ece5936544b244fdc7c77dfca11d4b3cadd53d6ccd993b29f6cf677c2e90ec1775a5275187c16ebae0aba53c03e2151699664ebadd4c8a50d48eeea59514aaec622d65241c208c8025601f763a30761f3cf3503c667717c10a79f72f2f5143294ae4e967425e22cfee9b5945c476f2a8f102de6bf9d7780cf0f71d735db5593098720095bae8c60ca4a3ff2523342f566e2b45b3f7bc0f6730bcce0c90df31a4c34b6739e64eeac8f0105d9ee6d660aa0cc322bee0b3529232018575793d80f863d779ce550f15775977111d8ffc5b164570f1e7654be6008d8bd028673eabade2bca4cd7787baba393ea61b7f04632da09b4fc7c5e44e24aba23a9ffb713627d84194a1ce675ee427dd7933449d0d42b6d878dab32adf8104eb3166a673a518ad3cb5f5da2c86979dea26df6114de17f08f199a8d7e3ea821dd3106e8947cd2e9d485342b25a64713db2b8a650a49ffd645be71e55cc00caaeec5eb327211f916cf7ee7220152751226f3beb0fbd57ce082b40b3b552820d8967c9e248b28fdac742f796f4e0f9421541c06e558050197ccb6c0ffe5cb77637aa19a3f5e164323790385534a2246c9f900dd62ad5d40749a133db38d1e82a3f1f169d3596e8c0434a7758ea45eef647c4eccc96a429c0f6175dbf6b9b5d54292d877910b961ad73d67d461db0a009964522f8a2d5986b0b93b162a0a15e1a7e3b36de8e3318204f9d12c8d6cb81cc137c7a0155506931107ff86ddfcb33a4c5b3e975b8ea55426007fd861c7edb6846cfbb90b8fde4398e42fa872e01231b86fc69e695c7603a2d7d0827f7b1f404b7a7ac4cd1c451ac0d447f59972b77a74a7e7ed82db280313e65f9546f4c16c9ef6d17deaa8ef7b113ed4f8b2131786f97a1eff38994fe4f1c2899b48d3787df7587c2ed4b411f712aa531c4d4fb6b9cf8cd86e0b05322bb4e2fb0f0585b8f6dd15f7522bac71113d9d4efacb9729b55f26a0947aad9349e5ce106afd99e789b8c5bfa25010615c0a9e24fecd77c4fc30fe041cf800c7c1fcfa5629a16e988932de5189d28e873a020371a2c3702ce0ed697f62139d642672ee58e581925097a3c649632355472dac83b1713dfed615dcff8f0e5dd1ecd9d01085092ea38417b41403d8d32315b972957104ad92350d88369f6c275cc66ead17671f08f0c79bbc5e0d556266976fec9f1cb792d8ee3a97953d26008c755762496b9191287f86550ae26341ae30b3832731247e11562f5391f4a689ef9e26885d2efb67a93089f6811f7d01587626cec43ab5cff9f14e74c3327823f4955e97991dd6ed017ef91977111d21f3dc3c37dcb5e618e1642a439f93055f49ff5208a3c49ea1bfaf66564373de140ed75656f71f5fe9761345788d72f8ac4e30b363f39fcd26326654057c941a5817fc1794a9f36da21683226c237eac8b8fddf5220f1becdb182844cf990e5c8e9dbef2794bceb9e341384396e802bb8d7d6b99db6cc56830cf69ab1d1f4f3ef81ea4799d730daf1d84a71b9141ab8022954e13f88338e9d7c6af197685e31c4509210f49a62cc7c16f542ce3d6d594db6609e5f1f8c2cc309c6cf25443469ef5ebc946366bc88e7f5fc409f70e1d84187e33a250140f99cbcf27d83efdf6118b351190cc2a5d8d97e47b05535defc87a3c3fbbab8b8bdd19cd743daf1c8e2e65837e817368582fab8bedd1714cc8cc712ea2a46cc5b4009b15b6852d056b301545849ad4ac54ff3ab4a0e0e961351a8dd3e0ef0c39049ed0467361216f09e12af9a83f687cb076c5fd18a62421b13d30ba9f1e127c1a2259ce4f3434a0069c171e7e0197400720cdd3c9a3aa04c99f0a41219417f55115882b8e80cf5edddb5a326a63e9acc577c2c7486be390fada6b160cf3754b45f2ebccd5d969e1fc2974d3f1e8f7f9880645460961894ca159d387d5beb2d46545154099a08cdfee00e75199031adcab36a5ee7126d3ae79a7e445005869272b7665156e68b0bf2fec3259e444facccb93951f341e8b1cc04f1dac115300ba35218bc9b8b47de63e65d64b5810f02045a77356b6cae83e31b9d04b8d210213eeb0c9cc0cf63d1b95e853b46919939dc5dcd1236dbea3792a72bc91d864f5bac4bedf9acfb08695c2fe3b03aba16d9ba8ce2f13ed6c256436f4232d8771442553a61dc49565d30b4211ece7745ae6808ad5fd96aa55e675d3c8b45d2ed885ca17f104c7e2a8bad2afbdf9ae67a88702d89ebd3a28fe7f248d6ae0cf132d334f9e4a45133bdb9682487cd1e6fa0cd7891e82fe6cedd85806b05528f1e8d1c4fc32fc2f3505910ea0b8b9161fb00a4099c92d21ad7d85f9830911fd542458b376829143bbe44b8ba48d0d26b70e336aab64e7d77a3c59ec2fe41bfe643a34a73519a423063c6d860411e3945b88fabe347e5d8061bef69863eded7ca0bef7e8be54af4da28299865603c6ef6b94d2a3cb7208ace279de96d56301289807152078b00d142f5b321500cf418865d64db3e6ec53cd7b01646feafff152c8c70ec70ad86816fb3ae9ba9ac0cdffe8a1ee770d59c952a9ca3a7c2b1138bbb1636744eb2a2ad6948602ef9aa4d6d652ac1765a526f3eced58c343fc4341a3c05091327021dfd399e1200c66d7f67c32496af854e04decb411917ff51296ab94332f08505be18e69c0b3c9b5d6a782060e5bb7832241e2aca92758abebb2439b7f835ef234fa778299508fde2d54685c6f6c2bb6497a6f2573e796675b2f0c549a507eec49651f82ff68c76648a79f93e10ebd74e251d2bcf66481ddcd67564e1809009505dbf6d9577f28d4b4fba85b07c5e5356962cde1c520d375dee5c1e67d0f8c82f6a98df43605fcbffedb130048344b7e6b17a12254aee3a5fc44cfbc3de67b3c985855720f9fdb6e82c0502226bc58c653fb0cfd29613b04a1eee04def2045386782edb1689f4d86fd35e03f27c08593b08751d0b7da52085c5ea409e53f72fcf0a3a760c5a6cb9faac663c5d0036a6cfd47205b848cc137a81e7b8ec4b69cf0a02522debb28cdff37dc2b4493d76fc8b6b4e8ec140af1090198d72b12082bca1291d0a99da7cd4c00f1d73a07cf1e1d695b2c10eaa779f2f578678d31b697dfa474414ff1a6520cb2a1d824805cee0181946a488d14b48bf0177d23c84479a7f246e5305b96f497a956ae82b20367ebac0b14215fc5494a8e00b86d2a3439c968744d09401c1d9371aadad2f15514522529ca09e72ba0a53bce89e7fbf860aa9396d9292388458697f8eda3e2b46bcb997aec80c7ca433265db6212922376c1f0392a1e9a7df4c778db4763fac3e6be75690c145623a958a8a1e18ba127f4b60ab5b067f96fb3fcb0cc88919de60db1559e993336ca6bae80dc78a19d8862dd4f96fc83e4dffb8ccc4711cb60ad593a9666247bde20d2aa6ac5b7f2ebc739de3b777ef0c131440e27d5835fd77c41b0d46a3e3ca0b9a6b2e307f00e1056e20f5ab1a84d332625e75fe25dfd66f56fca7c1537244307207e660dd131afda140729e018e7af0109aed107f1f2938b3bde19e1af91299c08638061dc3c1ea3284c259d415e996477cb37b0effde1b02e622a7a2821c8eaa6e8be8e715be1549744da13a22086b2e8d2d077b86de606c00d1a290144a57584946d0e113f9c60f997b41dbbbbfb9ee54c47b6ebc0f4f189258588fb8843bf39ed384b6c45b45ab7ab5ff60ebf6c6ae59e0a18eaa5a302e241e914575b283a3f699cc0c30cad946a061a571b795dc9725ea3f8457a74ad83e8b145a53bc788fd800728c602fcb0891e9f9b5298441d13f481ef7ccdfe63c6907ab775a8a5fe0cc703cdd5b736318d7b3c4d548ab3d832f6406900fe84c822cfa1c44930483bd5a51f4a7297ce99ffa29cd781cf21ad57ea5bff72aacc4d310cc306805132b4f0b0b6094d334a5c480b1de47ae421ef0b37210d3241296579ce5af8cb89d9ebe6606494a6082dfb0f3b5bdea058193fc5635c2cd0601093558ae6157b58b2531f4ab7671d84dde8ada9c33082999bf20f0559d8cd7636696cc8d0e7203c608d03b60b1b2447feb7bbece08492370eb85083a69b99f1ff5a181eb7d84aa358fc4c58ec0b5abff4eab26b30457faf05e53264ceefb671dfe7ffe317736b3bf02351a9e6c2115b54f419ab3efd7b60062b1d2f3f4fb3645c957cbc5c430254ea84ac0f67d9e8a893666a236907460873dc795974260147f9e5271112c1908c9ca2c4100bbd613634a41c7a4b0d4ff6f38bef6a0a1d309b3c498777b77996517b0032523ee6eb72bd4fb9065179f9b9f9bbe7e76d9fc1ec98450656d6c5a4322a2f6f2c6dd117fc91cbb86e18d7e3dffaeeeb381b2825aa926a2c44ed401aad1e82d3253516571256aaa2f80da18eb77b9771f29f40ec63bf2b71a867739a20cc9d16c311212982806f016abc517afef03814ad7664768682fb7f27d1da834bb8e0a29c8e8c1f9b837b4c0c81820914fd533bbf1d1d64a1627cad19a8ef667c780fff0809b1a9ebe471eb74199de987f77b5fae1fd62742e2016414791cc4416e4d949c1f2c48e237c57827c11f6cc6731308f0db294ec9963c6c9ecf0d2d19105bfbcf3b668d1cd1f87a9e3471335f04bcc03dfb814bc3d3800f2ef71af18202adad27eafad70a677d5b4dc05dbdc000cb0dcbdd689ec04e6ec42b9dd0b21ac9a5212caa53c7295ce6a2cd111f6c880bd05a511d69b82d5b7b443b2fb90f21b9e4e053f60bcdf816a6e9929340d0159a6f2e3427ef38897f17d7d4295e495577ef63146a7d6bf549408814c36c890710fa020b897390534dd7277d271af12468273204544321bf594606ea2dfce7cb24036e3dbe8150293c3b8b9c8599a6fd2f2ed5aa6fd77fa4cb29fe793f7c8cd0380ddb5133b2d869ceb7acb8e124cb6e2158b65cf9b4d654136ed7587455d8c4b19bd1dc8562c99379cde368a676eef5d3476cb2ae65e63bc67719ee69236c07451fda36202b8434c200c81261fa8202d97d6141da54ffca58f54ed18a6fa716571c6cf4907798dc3bd2d34c901a1533986d2c612a2cb38e4f4bde7854952a706c03f2ae52d197e84bc69d7dad7028f6949926b70a3782061ded5169543e66b3f88913b9f3c3d1f7865e7f3c36772dda5273f8a9f71febb0597c401b15b5dc4f80fe38addfb8f7685ffd00feb7a9a44d56a01ac07d40612b666b1303f5b60bb199f5ea00833b78e94d44bb4bad722cce158ff581093382b5d92c42ca90996578a7e290489ac5d6c8e2a81699848b17db13a621622783b10e364277c552da8a033f46e3ec62e281a594a9ab6ed93ef602e57516ea549b8c92e24ffa8ad913d9efd4b52d72981c09fdf7cbd232181867c3ef9f5e901cf565c281a773917fcfe5acec9ff56196cce03060712399cda1bd9ca66760e9ed2bed3b88db4b6fd3592db90b89d43feb9fa4eb835c27fc7665980bbe7fb66e41a9735c5c7e1a7c605a329295e53273f2eeb89dc4cf57e08ece578f7c4ac783c6e8a8b390e2494da34d64d83044a8946944abc5a95d2bcc8366ac96845b2cc0c973fdcfbaba506a18ad54e84f1aaf17ab2beed1a5882c3700a8e7cf5b235eabd5e5d30f3e68d8583cf4834166f9ae74352f02603dd2d1b6631f99885525c5bb8898d9009060497e8cad60820c442f4093a876eff6bf94a14735425026e50a664e07602255531c6384428d18939cb9f34332ccef64b11dae097472c534e3953282dc1912f193d99db05e6973b165d712c05874ccec69b53346779b3603a3eea6e3615420f9b509839d5b7621da31ff15a783ff37022c03b77a993c5117a87f49dc41b1fad23904cba7c433b17283aa72454fdc8c4a7a71c11263c674e553df91c9f7a2ff1f8283cc7c1332911ecd61bf36068d5b29f797d6aa61da3ff15887f558fdb7ac4643ef1c66d2f35f33819d63065292123505de7eaf1de800c008f10af5ce6090cadfbf12148de66a5542e5f412be7b4fd037ce1f9ce26075d5f7b3392cd42e3b31c86c63e1ae9c410883b3e907a4b972a01fdf3ff069d3eda79737166ac98109ff908f787abf7571a1c69fc831afdd1908f09a56461ec2f6c98a05094bf8f99ba8ca80d62c3b128ac57df2084d2a46a19f8c88090a7bbe2f9022a5a82cfd085ea1c8f8f3929bf3eaf82c632fa6ce86bac82610beba0b15d6a00381799a302dc19f3e40573a6c8a109e545ba4dae73db3077fdcede1477aaa8daf20e4105cea72e57d0f87802745aa4c88541e461eac28f1dc352cfcab5d19ad881c7e3bbdced11917befb0056d706673ad4e294df828b0bddc1e278b12d827420dcae58ed3b6aae90c72837658eb392de66a833943167b9e6fbb4f1f36c9395fbda0b1465c0ae1a6ab09591fe0d40440581c5aee7393d80aa5afad4ecaabb778bad0adab1ef29e12823d9ac6ab32aff22aec173531a8af47a684abe0768788d52ce24384c275c973b695ae34610d218c856220d4255ce89e99c1b09ce16496be3a5eda9bef9c4a12729afd31ab6d44559007de93f6b76b57a6ef234bb44ac87b0ccdd9b64e6e0937dcd2f085315bff977462b93c4cc120baf7956eb596420653cbb7aa9e86f3ee2a1cc7edf79ade3a9858fc1a95d183f00fb13bf8a2305238909fa2b41b4033e2325b015d508effdda2655b67682b04c19dff6a29da2a854678af185ff52437cb98c107a958b7c5d1fbc2090a7b024c7dad07a869242be0195424a013f3d90693a5756037d7ba38fceb998e6996ff640a87f180204adb6d976b25c338de08a8209ea0977195426047bc0f70ee83c9535273e677b612e333a907db07367e58265cce6931be59f5469ab44e39ff0909213bb90e179345eb3a386e6ef7769b72872d7cf9b885ed7bf1de1d7e7006ef67d7afa090e720ab9a8b2ae905185efdfdd37def77b430177d69f93dc69e6afe8a7c9571946fc30b992d69c0c8f4576ba21233700cab26a0a3b7d55d4f4a93fe1b18d4754438e52e8f28db3be012caaf094d3747e027cf5094e259c441fce9b7c1b456f1c6c9efdd25856aa275fa1d8fd98c71bc1aaf93eef9f26cbcc33dd4f02556023042aa47de034bfd3cae35bad4bbd5c917e3ccda4479f0f88bfd93bc73ef09c079e16457f9d0827b52b44a07465632279f62040c18bde3e47a18890906c6d27813ca7e86f83532ce2cafc16eac53aa739dc0e291336cd318d13ca4237252bb124727803ba1d964dd12c62355cf5945955924ebd15d2fc87bd8906e727e3ccb775d1df3e0be6520904c21f62678110c751bb7a9355daecbf7d73d6e5ff42c0a8d9dd65edc15806ccf21e9c5486d2206fb2ba0a323fd90e373156a2c509ac9813d4e7a49976fd35282db46152377363c10d0086104037e19d8db4031ae3abc3770ba303c799305d991c05f701f5df2b49a54176c41381f740c71e704e29aac340c2721c0ea4bbf09e4195d5da4e9007882fdf44b40641cfcf81f862d52834281fade755c525da9eb642d67651ae10890b114c8866b4f1cb9842d463568bc26252327539919926a86f746a60ee90eb1020ee0baa629c0c8b499e24ea38b0fff286e49e3fea7b2abe386aa42e37938a4d880abf332e181c8f41d87c7ff22427693c28e4f1364851308faa262693326891af1bb9bb2fd58c381fa64d8d2971e326d093cbc60b9d24bff39762e2a7da207ce485ad9aee40e616416c1aaa2516bdcbe2a9c546e0c63fad02d6ecfadc072c6fe6dced5affe6b4ba45be664fab8f11b8f0df63fc4c6fec981bcd26d7a655f6fb1475fb83cb3362949af1a2f5f347798e79a92a5ea506c601cd0e92f1ad231aaf0c057aade6b39a25cfca7335b2dc7faceb9b7ad69107566a850fc3e1471b01ec2bffcd21c8e3a5fe329d397750ba7ea4c52af7fc870e0842e2453c2f0a9a4742f2d98597e840208e91ee7843636e0106a4dc0448fd77761b53436e237e1d4533ff071668cb5594473c32a2124173a132f92332447ad00a64568edc670830964fbf1cf22cf8a06bb8b00e697c9147c9ca4095046775944fae6a8bf9723f60b4f6a18fcb5ce69d31638bd610dad967052cf9b5ed3a7450b06a1dcf67dd8a2a2bb944e3f4611bb86fd83e2e5ac5606dcdeba2ea7f25fd81d717decd89f18ef96508279dffd21e9e8177257b89b4eca89e76dab71cc287a41e483c0ae266a45aeb73b8225038559c10d100422031d4c3f16eefb058989934107ba40bf39570cb398c7525980c575d98662d16d0c49f2c5134704ab500b8be3812a55550166ac6e9a2fd0c39b6aa4f72b72a7dfdd5c26e58580b0aa4934cbf0fbdbe5b6a61f8da4667ae3aa7dfb4de5a4476cc29fde4f65149fe64c9d8fb92f1cd6d92b4f0a1720a4b075584e00da6998e90a5c7955d40e69ae8ed774a1be6a8d221afc24b0b3a9fbda6d133502b24cb06167f6944b1fa82cb48f94f5f44367f5c78f714e98c70613ffb2245a883d5593b66dd7184797fb05bad3cb490faeeffdce1fd2f54abd0095272ed3e61ae34ee9f002492cd2a4ce9ac741c4977a68ca4d3eb466404ffb5f295ac86701400cfd5c181092f873aeeb96e3c1c608bedac08c1f3576582eebeb76a1682ad283202c92347efba5b21d189f163b1ac4626b996279894a656ff36b2503f662826a87a1334f34cc5b175a1e5d699709f2ee821c79559a2a8e9b7da9dd895b58387ea925e86e1a4d412bcbc57ae3bdd9bbea891376ba4f5efb39f06b473a7d541d45ef7f599b18c68075d9d49b8d96d246dfe74404b1902dd5d1b47a0b1e459d5949bf792ddd167e3f7dec156a6d083ebc550477c94145e144eb319ed03d9b7d131282d90c3dfcbea7cc6d4e8f8efc6344d248766d7256c06f10cf9e3ea0683a7426a168a0c1b2cee0e9c248b2f55b8b07e01b08994cac137fc7f644fe4e921da30f82ee8e7320f6115c55cb7aac0bfc2c06e5f4f5d82d219b990e56b84f036ec8558f33815b2f7e63ae8d9f8fbaf6fedccd0e03281dc234ec0d7f9d13aca1750d7e2ffe1f80c5adfd66d18b9a2702db3fbbfefddb2354929aabb1e1b86c567a9814c91810eacbcc070c8b5843fb19d97c5a1daab5f3c984ccfb0cea4f9709c4919fc74afda12a23ab2922ce313f2242bc32d4d15f940b52aa86f97f7f36a29c21a5905a8eaec8fa0f44feb50dfb055c26c9893c800e00445dd3de6af04f084a70b08c106a188f995be587d57e35aa70e3a9a5b1c16a92a20d6a24714bed2516a54723363ae76647b89425f62df7f9c51a5a91f9caafa8b3e1d4345d3815e047e8f3bd92a523344e4eda40dfc148daa5f462b4dc42e529c0029874f55ed12127633ac2ee54d5e3f4443e4059e3313556994b7521d115ff11983e4e036628d0fc3ba79a10ee055a82c2498d2c3bb8f221309d3e92204611eeca4f294df723d60f9bbfadc01cb9813ff2818f2070e8f94ee1de76f5d780479fc0526d9dbac819a8a90c64c886fb4075fa70aefc2bc63225d69884139ecb896ba3cf81b95721820f8d1525efd3d27f6a029e538a135c85ee3452d2b41b30bf9c9b4ecf697536f98b706259fcac4726683392e490d1b1dbf02695c79ff9b6d178cf58be77bc0d67657a7c69b8b8601db5b4d4cbd70ccd1a74d2e8cb9ede66a7486874b6a9d6b0b2e6d2eabbeba0274c99aeec6e276db92cc260d3467773462a538d2b1fc96827c453a134b95c0ba49c5e496337489c7cf722f9dea0f35f6140e36704629d1d7883f70ee3cad5a2def34aacbf8d01401e65dcc59242da4abcd23e1e87e5ee9aadd919427e551c0ddd3ba7008bd71b01a85d37eb7692f4de61c9add93c11838acead00648dc4fbf3a95abb6c4c7f5f8921c67c9313f909c0570b78c0ac4e2693e1e6f59d987e37fc4b3acf198cec927d918af4e7efe0e09ba682e7fc5e059d5df06e401528eb9bd1cac12a2fd2867f880090e40c94ad4215571442b5da9cb191022c29f3c473ee1a2ed916d5a7b5ed5077c0972d8acaf7d670abd012a97d2ad72008f860f57ef77e7f69d93392e1a37dfd025470579dc787fc2eda3c520ed0d651eaf48342747fa6c658bc721b726ab89b3e62fd85907ad00085a85b5db96b379dba668533bd4e3a0b9007bacad00aa9585c0afd9c09d7588698829653e5c2a10c60968d50c12ce154f8023228634bf73c4494982272a7c8954fb015bbf99ebda7c5ccc422e9e143ab78f503bc94f54a4fdf48f5a132b2c7369279011d5fc73375cf5051309b340917f827540ec9cf4c9a136d3da0b1c0fe70492782017e05aa7e67695d0240efdba160e14ea76ba2a324c94d97a85799154b5c00bff0be20cbcb7661102141d8604f986b190ee336f7f5ea2e2c408c04b3cfb34de17287df3d63e27e911404b8412b890ddccb9853f1165c5924f0b8cb800536550f0d410ba84f95090963f356263d190fc067f1c1388e0916a64043b426f4ce62724b546cb69575499f97757cb58c31b8ec6958477565d7addab995884aa461ba32b329ca0d3f6c887c37f1f09920ba51885934af50a4b065e9e2160e971ed8a676cd26ed5554610cc7cbd17b78019a22bec0ecbf70527b87fb432f10b2691c6e6622b49d37dd3b1fa9dc7ce5fb38bb73b425ea407e77205b37654654468d145a2b393ca15ae1e4074af15af6c9cb038c921095f9211c8629c6cfc5a4f993a7b2ed9a24c26868430cd192d3768bc55cb4810955b402479739d00912c67382bfbdd3ced5c8067b407867474f2ce82bad35a9999237c9033ad27c9c97825d6243c4065cb87bde20c391339936e18907de553147b44b1d55573ef20fbaa25f3c1a0faecc34a29861b4a15e0ff05d1560d65d419c23b8a647d7c35beae5ec20172ee6f1a7b007dc46fbee0f32e568353f7f95031f48460de0a0aadfb67f2a49fb6691fa74967050d681c16f887eca91abc0449d5889bdfa289b3ba5faf02281f0aa57efbb4da69f192c61a69b214ad0ac81b337cf4fe41428b0bdd63e9f9d71ffe282f9053d716f17e518dbf337b29a4aaa2bfa0d038404e7c87a990bf662c12ff6583fd8ce9869d9952c361629c8998e24f20d990b65716dc9b817e75c3b1889cf22eabf68e5346622e6e08e5d55727fd55099fbd14f04c39dc0775d39ee1e135327213f731e78c6768e01e33d20d026a68fc6bcbb0a65f02adae2f2f6447cd76bb10de2570cdf02776cc09b30f359897ff6bb63335d3bfc5a4d8030f905dadd0006d52f7c770f210fc746409d94b5b249cca178a0122ff01363789eabf9df2bf86fa3ae4b27b02b25e9bb59eecc8da9ea5a9f836aefe8d33f62f3c474e734cb3d349ce82ae36b29a018466f8a6389744ce8de0df8bd0fadc593182bbd9981c5b59dea648274e8226a9d0f09d921501d55bd869db4434b878d3e105aecd56d1f4af2b5aabca3ce1e6ac03faf43ce8bacef23bebc054b45687fab02d96b64a0e3e37a24433e36c52588c8feea3031e1270160aef1539ba45883211731a00ec319677e60b672f57740acff73400813fb9873bd7fc407fd115f81ea77e9f59a7ec7c046918bbfaa8976beabc73b333c80062d8259bd87363486614c4989d0d278f7d51add4b8c1ba6d0a61521631974197a16f763653c11b4d40b90b69a9b7c5ab08e426f7d431174544c85aa3f23836efb1864c6438e553a5267fde5a3bd61cbfbd3056da94b549b0c99428a57b73026911a10a9e0e6c96d065eddfe2c9e4974df8cad00580cacc4007396e8333f44ea44054435c2aa37f6fad6762bbda6fcfc64a1804f10eee19737c4c7ec5c2188611dbf48927344657c36b81292df3d410d92fac7835c59babbb9721ec059c7c134233164e77b1a1ba8c0edf75b19cbe14c7280c9c3c1b501d98e66e389b297ba0a5f43e05c60962322a25c6daff4b8a5630b19d038c96a7c98bf895e72f0fb3a8cd7de031bac1e4491e4ecbeb6f76c52fa65ae2209fbe0f4a152c2d7a09a5a086295e81649e61c459d8c873097aa50b3b88928085fdf7f309b52f8953e381bed33a14b611197f7efefa4140d7b95ca8f467e6dca62feb0fa2fc415e17252a8b1a701ed2c9946170a2f337a9b894143ad4b4c67b039dfd91805b200036471681c67bfb8bf097be45e0542a323ea3524d670fcfc020d0b6453c423a1433e1cc3f51be392618abfc6b217d876ecc5f9d3d25d9516070508b7731420e0e825dc21066b73655c4498 MD = 9f0c0f9cc172a2780b8f378a51155eb7ecebd238579767af5cb643b5903e5ab7dce0202de501f061d467e4a8485e1ff211f9277bade2d389c9577d5495930f24 Len = 90520 Msg = afa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086beae7308721e29f5a7f83cfd052adab7012c78c85f404667bbde8448bd408f19b9c11f85f000bcfc550df50904b1768427de61340cb6888314c2ab0a75aeddd01e9a7b99018cb7df806ca63d9e7da5daf57f607f7ed26da941400a370166f34667ab35a6090a90fbc4a4df0f54d7df17f48004ff285c6c66bbe71052f31155f92f63cc318912eeed9c46fdf2aa7888b79fa0ad379b9d1b380f186bc2dd367c44d064bdcff42e082171b3818c11a849567121f7bd4b1ce09995646b1af22eecc5f52e78d5fcc4a333ef7b08301d0f8760f3b442f4a96452f7f94b9cc004931df8f8118be7e56f16a1502e00934f16c96391b83d72490be8ffa54e7f6676eb966a63ce657a6095f8d65e1cf90a0a4685daf5ae35babc6c290d13ed9152bba0cc76d2a5a401d0d1b06f63f85018f12753338a16da32461d89acef996129554b46ca9f47b612b89ad3b90c20b4547631a809b982797da888915b72e26d6ed6439bb254152a21aa59e96fb12684211bee0aca1e61b2014645c69558492487b14211ea8bae5ec308b747dfed8a4e2344b4e1f12335124191dd9ff70a4e14f868af6fcf9073e25b760ba5a63bcc80cfa34ec41b629cf8c32da883dd0351bd558ee3fbde1cf6537f54ff594f065dba8a99e427b546e9f41a7c3f28c3ce049c1376985c828ba6008337daf936e7ce59d8ab3d933b6aac92ac0029e557d4d71fb6c234f8796723982b8156fbfa4a8efd5e59b38d2a286532ec5bc14fe5b239e6a3e432561f29cf88cce3dbe805c92ff37027ee7c1e1a94737fd1cddf19e0bd5f8f7f18fbe06e3a30dbb1d233e5ce220ab28836f673bbdac2cb14780940eac208cde57160698ec44efc8df26616d3f5719a0d2572b77678bf42968855173af860e3a9a41a27162e2193da84f515751ae69b39427775f51eb79ada5758f94bb106754e599f859eb867362a32776e2c12c83a6f168b2b923d4a28526d7b53a79c47d745ea571182f37e57ef53539d637d950c410a1434e844f57f814332d2d90ac39e12ded7575d8fd57dbc90100fa5abeb6541a5a94e61d62804f97125e35a9d083e57bf96d398be0b1bf45143417d3e29e9d361b0c49961806d3d6fab01a6c3644c67052bf2cf2e9db7391f53ef5494ef1e88d6d133e9676cfc9fa768ba380e862cd337fd516b51fbd3fd62c845c6508957d47d7118ec586c47c2a0b579a8eeec742ed0816bf7c8b406a3c427014cf1a74a48be26e01cd4fcd338f437cc53d4e596dc576e9efee334a3eeabe69e42e8b75a58114935f53d9d33551a562ec36120295e44fb86db321c4010928d6962b647fc752f8e670022dbccb97b972d92142a904711eea02745d97fcc00921f06dac7c542613d0fc7f52723d89081253a5e436009568e776d9eda97738e8b1bb9d6b539224efbaca7550dbd35119ab216a0290d278b7169189dbe4ba984deebe62aaecca75130aa38a30e1d51474a60c19a3a1c24192e11a2d2f2f0c09c040c365702f4340072a4f66f96b8afda269dc5ad050171982afdb6cef71b7b3ca0f904dc50447ae548096b2b3603b312a5e59d490851b270ee99aef259401bdf2c3efc3b1531ce78176401666aa30db94ec4a30eb281494bef5205dd87f3350c1c4a56f3d040b12167214391b30b121697a7915e9224b871a3c355f111a9493be7b7df870ff5c589bdedbc4dada062b3072ac2c93590829ab26a09dd74d6eaf714e3e07532c57e099215d5ea9907622713bac1df0b693a1f81c2bbe320007cb62a6af43ec7344d398a362b0923a4a2eb53d418f0821331889849c6b2a1ba9101aec9a5545bd6a581eccb2629cc0cb7682e0322ae48331b6e7c7bc4bc8869aa62086c5e466f01298b504141bcf0a3e23638c49978bc2d5a2994e5307132a22b4fcdef89955f684bae4b352833401ee5cdda94c7e05c867052780294614ed8b62375afd1c1cb508e734413243d28b224a7a9f04865b7b2f061ac405b1d1b81bda58649b14c317e6472b167d03b2912115c1d6395894c575cef984b1ef54741c41e763992950036501539afa6adafc34e43ab7b39cb88d80844c27f3a9a507d4c26cbfc004cd60ce3e3436732154b2a3df6ea839f9d0bb99519c159487ca5b8c8270dfd84d411869255450aed0289db630e4129517e336085d6fb55c30cd568bac7b2da9abb5127edf3d52751e5ca4b5fc245e8d9ff9e815cf5071124db5e21b661310fac73036559377a28eb3faaee76eb7f2ea391ab808d0c4b080858be682d8c2f09449ba6c366a88aac13809a595ab2438738c4f8e288755db6c815649092c0f3640d85b9c688cfad0d855927007def396f2419f52be1d8a589fe91ef5f8878248c41c1cae3420557e99b19cf7852dad762dff13ec12b9eb90e164ecd19713a48fe8bf048ae24e1f1bcef52f2257c0d93fee6fb2456c8401ebf99ac7c52df8fc7376661c19ba40e20f3dc853d9c4c0ff59fb39844314a653d2b134b7b9045e135d34bb6b41031b25c1afd311041555a82c1c0491cf51466aabcfdac495626c6fb3ec66f9eb070a719bebbe708b93a65b201b78e2d26d8cccdf1c33f741904a9ade640fce000c334d04bb30795683dca09dbf3e7e32aea103d760e857a6d6211c47655df3665bbe4164e5d1334d301eff0bcffe6dd95dad97fa63a0ecaa7b197b55b6f86f073cd4d524324aa659e19501d2145fb8adc1d70eafec04bf36c959416f21894ac9f69d92aa6a43da60dd692d5a560a66982448f260c5bcd733060af5ff6cb88c96d340ff5f5563d84b6dc10b0b5ca77f81cc28ca74b46f3d877b53206c602c3e5519e5a5abba53a703d9c5244ef0dd0c4f029e1f5382c5f71c705d491ec58e68ee11b60af763bb4f6f699fff89d85413ec0ed27865f7680fd82d4ff87d6385104803d8b8a91641d97665742526ddb59f3f38ed5d11dafd8ca5f952b6f101ba404d3776372b9c904c02146f1c8bc7a8b530c81756c2f52f776a1e8e09e269d4ffe4f4b60de3bd4eb0fabfb56e225ed45fa70577ecdd0ea3d70fe22a7cb8617c56f584c0c43b40240d45ae71a2516ae2a48c3936a6cbee04b47b8e4f94dbb25a4b692dbde499efb96ccd29c94182b2798dc7aa7b0df45df817986924dbb32415e92638d5f36790b6d47978e5d21cff422041a06fa7c02227074dbdd2d8a97e563515ed2f7b0cecc24e31e2eedd8719e567e0653aff98073b8c82d08013238ac4391e93f403f0cb86e1ddb00ceb2ac8096a8d40039ae2d2d9ae1fec57158a0e08fc2a734b147bf5a995662b66836fd456303178f202074cab760d577f6547d3c9861fd65d351531d472b298252dbd0476c1b25631be703d59eb32591f8bc0a1b0e0e70252ee2648af81aa4270717d210e25fa22e556846d8b15773c5f105f3f6511684051c71603e1c9367070d815f3c964ef243952aaa3e8fdc446687b8b778f218cd782494d2813523f694de9ee424c877ba3533b4ca918aa02c16254ab0fd61939110efb347fec25ab762e2d70d6429685e95b99d145c42417f3752429d0e40059341d6531d2154964df3b2a03775197f43c7af2a1409474ed25c7716c825eded389d610ade735c650ec9e6a10ec2194b2e5d7d024612fa16b9e83c6dcedefbb8f5862831187f5a559e57c75fdfe5b94a62b9cbac2723eb378a8cfa8e1d83da075e9e946c37afded661100d13475a7a0b858ee39e33968b3fe89d3a1e30df0946d8392e22d88f4a65eb94f081b19acbfd0b3f7d4ef8056a8e48ab9384a52b1a05f6f85deb57983d92b2594a21cb113f9d683df134e0daf9a12f3a6f67e7028cb33f6ebc2c514518db49df5259e078356b211ce7e68a81c926f0cc461e72ffc1dd15eec17c42207cae1699a1b09e1a5df4da5eb9ea51b4596e51c3b03ee56d59e21efaf641a6b4c989ad0ac0bc408219b8d865efa6e2dd1b15b6d3364f9af5d570cf35d312eb7c900c71b537e39449e935bfe501a29a569e8ba45d30a7200394f78b01d076ace25095093b6fbcf5cc4cda053e987404cb445e8ed437fbf12148e4f6f186c357809bc1d7dfe0aee1a3d5342ce50c819ea5bcfceadac4b4aad941d777875ebf77c1d1f17245233fe44ae2d2bb7ae651e47058e54cc36f479986103da135d0919a3083d24cfdbff67a3c26141562ae7b52a5b8b63940804b69d24485e88f85001b5731b2dc5c1f592ff1ff96ef2edd5485c04cde14b4b03688285f5ed1e6d47187a05c31b4f2b9ee5206dfc98d51eb73ea6a95cb83a2677f6102b116e1fe576c6b9673cd4b54180c9cd5573a945e616ffcef241cea9c2eaca0fbfa4c8d18766743c408e423f2d25a7d07e65888b6d78f39c86830de046e34b47e8b7e57d7c9e88c939c24c351415e5ef92da1defda6882da0e2a5b26dbebe1804f50ac6aeba66c29faded9de21d6edf336db50b8556b144e313fa2c5a989f4819c7a05e2fd0786242aedd38379f225a3146e0930080b11c198c9c903d745ec13763ad82bda48408171f4216c47f1f7c9d49e309d19cfe1fcebd0b8298ea732fe859a0d8ea9f1010a79fdabe1b159ca2b1e70ad48b03fecc4d15d577ef5382c0a72a18d53938b3085e70f592adfb4059398ee6879f6e49ae4f2768e4c357f43fee5573ec2bf9d37bb6633138efa8912c7ed1f4a7812455422f72645d97504dfa485c5092355af7d749c70c1562a61588fc30b398c2deb80488872646fde5069c2fbf2d6bd7f496a7731ce4bcb96c33fb5c3bb1efe6f5c881c4c64d35498ea4721eee78ed963f4668ece55993267372fff9436e216ff22d267ec037ad0ca5ae38907aa17bf2937d97f1b0e93d6c4459037de846b1c06c5c8f00f57412d9c29a4c2ee455bb7fa9b2b13bf0022fed676ca234baea358abcbd0815e6911b137def1934abf4109fea7c41263332cf1c551458c81bb711217be54e08140d0a6c30134c5c421b0fc5ce30d44aeb09af8b85f6a3928b3bc917125bbd61fe46852671bd420037292d93dd76c71497e555bd7269ff4e99f6e1ee2896d2be05ebffe4cb3396cb0bacee8c80c4a60dba544624b304d836c866e019271d2a76eb5bff19a51cb7172024c71260910da0d2e4e553c05ddaf5870a482a86552126ef14f75787df2f7f251f4bc7e5624a787205d7bd12bb5405565f8e94ded55338b1b56d00ec016c5d7afae11f97cf08ff083581d332c3ffe0d6e527da89243d36b3abe4b85a19fa4ca2462b7bf02da5af06026838a90e2b125929a87e2db84bab6566e2e05a9f55c73b9f8f7f7704ccf31beb1f5fddd052048dab84f225180b015784ec1b55e80b579755819c94fadb758a5e0bbb49d12141c4c941d917a9f7d2fa6464cbe4aa87785616a655e2565da101d9b1cd857705549f3173957e14ae8aeea3e1648f5d6693e831722de7ddc00ff2fca61919487ab78d427ea9b0be7bb374c1e687ae670544de5459a71dc79f1cde256d306dbbfde51f9ad7a8582e0bc75d3ce8a7ca5e000598fdd133dcca674233f25b760b480b57b69922f3ecd9bb40d8736c477ba8c350b87c8d66dd4cb53a94c2058c6a732f99f2cbc52ee74826aaa703f5e93aedebb0bd7ec2b277d4e5406132ffd613d3d72644b152abcfffba8f297cf9ff7073c5900873359934d9840e29c3bed59fd09e873cd8401d1f770348d03cfd0cc5010d9929d84aadbce11dee7ed2a71d570fe2373baf01d55e448d724bc2839390ec1016a23c664248821f8bb10e6d1fd1c85ea0d1a43c76f4ceb595fcbc02267cbb79a3020e3d099023154060d5555fa8b0407e9f6644747b9c182e53781d37d0e5a6b8c9dc2365fc4a7bc71ea6145f445e540ae553be506b2321a5f085293a460123e24a14bdea156edf5a3b1f1e812d08e5e0440b0e9d4c0a6e874471aac044847d9a334660f854169ca456aec877db6692995beab9ad86985b5cdfbc364c44e6105af5efb13330c8502ff1b3c6a5d7fdc6806d714423b383749112c34040dfac88af028f230d43fa86478cec8d9d9b151e50293d32724b2246ce9e255d306d5e430109933af906239ba598a781c19d62f662ffbd091bc61b4e6fd260e1bd8661ebfb4baa7d88efea2ca4958347a4675deb43516f4ca2bcc507ef4ff4722aa35dcfe869134f2f79a4a5df13fe43d8817c697bded2519987b5efe7776e832a5cb87b62e29c347f2bf993af94770ab06434fd66f864cc52bf7482c2d92d991f0af88af54873d1da8f4f72b0878c00de981e13bf2eb52170ec774d0bf5b0287b56945b19fb588bd41c1ccf6c6dbbdaa5859e48cef241d5766734cb4d4d94c5e19822884b7ba8e6fe4ae8064dd774dcc7c54c0920d3797cd5e84369f15159d5c468198ef459e357ab9447b3df25459b97df9dd15f52ea7c01b819c582916dfcb64eefdbcf1696728e90a2649b07bcaba82d1a3dd4e10347ac8f2e5a8bae4f8f19a52beb162240bbf9c89e74fbcf38617b3637bb1c1e628418b5f79576d88d2171134459741d70988f9472719c1c477183937cb5af6b76a5e8c51c02dec095384f11cf935358849cb29ce4f6d65f784053cd5fca1948be219f45022f2df6f658261924255e741b2d054a6c51450939425e3c6774c446b78b9ebe2076dedc3ef57891f88bdfe092edea055f3d62ba091c15791a323ad5d14889891d767bf0cd84c924a333623e9a53e38653f7a9e276221c0bee7f0786c9ecc24e4faa8fd520aa9a49cab88fee7fd39425e13ca502eef8d45d5ad794c9dfeceb763d8f84e9d6cb6e69c597b360e1f15e7c6d68ceac0204d0e5f5c87d2fa1cd67797d91f5af6e6bb81d2a3d77463f31a4e27f08913e2dda844e45be2b18ae02b8f0766e4ca6460ff9dc6f2635ff06192a008c989749e0ee80fea145292553317253ce51046f0c2cb6001afe8a0bc52c304f2c954b5fb9b5396fbee9f1d64fbe062bcc06b75a1f467f50a402edecfacf6a36c58b17d026c32029e5190f9be22cf6d115dbd007fdf1b82690ffdc2325974a4fede6974b969cc7a5ca5efcf6b8e2c6fc226ce8e92692f30a7821df4ec3f823030c344432a7b6b27bb53824674293f8f588166c8e37bea264b03551b05486b6f8b6f0a925d88553145c11207e0d94ff65ad84c5679fe958dddf96fdf865b7588964a83085879d3bf825866b9b788a6cb509249df5cd8788ce5cc31ea765feaa4d9bd774e25372df9f9804805021d8a37c317250b95f3db4cece364e1dd3e10eadd2ead0ccca9ab0832a27e93c88044623acfa8842b3506f479a8d06fc3df30832906eee953b69514b524d10a11991c733d2299ef268840ad15823c3a312a919646ae028dc44832440b700913e55059925478c2f78fd3d39f47d971ea2e077d4cba8cb1a12646cbc1bbecee554d8d45e90839e9426dfe05f197163828c35e3acd0f0ac3cd8297a8b34d0247795038269de0cdd778c8f01fcc8d9f579cf7171140cc8fffb8df2511414919de26f73945d9659c5442a8936857b2dd96edd21a4acd7a822e0b45d74e93389879054978eac31d0f284816ce2abb8d38bfc35c4f2d9ea04d186dbd95a6d2a2e9e1bd4edd5d83928c1a311989ab1fa71998c89e9f02d8c65785874d4763260d73def70e51e5424c7cf3a5baac35ac86e6eba29ff010a675083d0100d5cbb6039e385b92bacb28d2487b4e00200e89b4097ef9672ca02e33c80782db2827ab0bd2b690e102585cab567ad1f3cb7ee0b9e81976ff39fa988bffadb2e826be2cae77213f030fd1076210b8d99b96cfd61bed86c06e01660d0215f53a2eb8da6272f5410f01cb81507cddfc0c01694795647e8c80bc6a2cb52272a8c2b5c7c175e2b5dea9e21caf60832410122c2d30451b05f25ef25e93b7727f8ef18639bc8c831dc0b4aeeca25eff4fba9424c8d00dc9e9810117c4e43b7aa26e70a8f813cfdf96aed96d22a37376c5c33af2247016f59201123383686bc34411e623ea0e677d8972c028a6fac772eef3ab9d28578827683a384f85646dd4ce40fc00f9f57ce55cd210e760ef817a3211902dbbcf8ae8d3f31c71b1236935a6c15a460c0f35a0799772b038caca17f9e790abc71e44be3bf666a4efec886f365ca7fd0aa5bb3546898d8d16d2c9cfab3b541e338ddf340809bded2706f109e5db8c2dddff362c2d6f0a85e250a72db0d6838ee76483cfa2f5c95641bace8b1a04b0df6c65cd0e941290a0848c8bb67080c603caeb5719718133e62650447e3fa1bc1b9f1fa861e53bc8e7e4ce9ef45400c586c66a8499de77a3a5bc107d69bb7857e75e74f0b087b05961ea5e076ec220271ec22831d74f9dc09cec41a1d4f6522a4d91aecd80e23aed177f83efac23a695d4a76e875c2dbd33d29f2dd74758f6dc542013665b5ea0290f89877e37e05bb6af5b84aeafe19da34fbb1a484b492e1604f3ece4c863acb753f1b0db965f0733b7c7b2cd58d106b91c29511c6731c08066f3806e5059243feba0472f510a72b3f4d3400de067bf1d40d21a7a247875c18106192d79a8d168dd7d93a1f14863df6f687595ce0a9276c39dbc8a098615825e15fd49ceb87bdb336fde5afd80a45f2f6c9a8eaa21456dae7181769ec3686a030975e9d4f2e940f5606e82fd1cfbda3cc9f71ffd16a1a90838af636b9835227ac8c93515bce53e29378d40798331f89f65d4714d506ed3d9d98f7bf96b4651cb3c4156187f357dd9dc81bcfa1d0e625f2a79ab253774922a3c69e6cfa561a0fc4b257465a4a2a60c36921f075259c084fe2df60a337a8f024985cc75af4fb717dfbcb68591f461cb2f0a91298adcb917cb3a7a86ac4a7169e82a5474efd83d23df4f45ffb0f3551dae2f39e72d5df61e78e65e200aaae16701a2a653cfc3db293326495b68672b0a9c4b40c9a3a51fa4ed7acb61b56387057c33eb9ab6da3830c389e92220178a9adfa4cd57547cdbae123de8cf163d0a4a41264bd20ce3fd4077c04ddb42cc1bd66082091aa9a9d246cf79def493ff133f38c3ed8238a7d16137129e0e354e86c5072f1c9908f6ad730c74d458957349ea4a51fa32a4ee5d9cebc904436165726fbdf22d5cda29143eb178f381855f55555d1a996ab78048f87b2ba6032ed987dd681264ec880baeada6cb62f9c98cde885a64f3b3d9243b7ecf81add504716e16f1d8ead0786424cbd3b54a48cbc28d892a78309472a4de35cf1240424bf6cf22418ce79014fc1d9d2080d3f4f1c80a62b39e7796eac6d825642888d16b31510a3f7682b5c39a422d76722487a568fc1bdf1df03faa53d2567409ad0acce79dd5 MD = 099417d1f998a3717c085abec333e1e3d577184352aabc843e23ec8cbd4b7cdfc5dc7e42ade402189f2b310e3ffd7e6fd2d722d1a7a7cfd3ed9ab6293160c972 Len = 91312 Msg = 770620f0d9010dd17f72d665324dabeebc82d1709fddf2b7072ab89bfe9e9a83df72f5280dd15e9ce4f4378af08c80bf5d60f0e9af37449fb4f8d8a2b6107463f41468c554a7db23529f60953c63ca6fa197420b07fc96c9dc91d453afff1826a033a24e154d2b70afb9790e7d9b32076f71ee5d0df48f3b683ed53751322dd4ca19ca4bba89f78be58bac7e1afc5f8eae341c682ae6d8ff414703d405735c765a0c0944aa24e77ada5d1f6c7d4efa0c4829f6b2c69b191d4df485b531884d12375587c24de6a2477877fa600d59aa8a2498a1c54adcf99b768d845f3f3aa7b34b3c6b4c0b96d1faa52066e232e5180e2ac948291c6f2083a359275c9551125e7d08de6b4cfe1b994ba18b7b54b9eba342031164a61c37ddbca197329d95381db50307a678e4292e514290b2db9ecc4e549024004fade6afa8adfb6cbdcebef7db730f85f711a2c09f4b9d10305c631948b6aa857ee8d40351c57c8f5fc34ff5d8a11d90314d2f581d04dc1cb9bb570b06becb799d97aae09e314225ea3d911d92d55a508f5f78fdb3b5735edf83512c77f0ae6613800f4f773874b6c6042c79f257ed4c771124b749a58a5e0a7bf88581937cd3486cac56c4243ac85ae0c911e06eff0c5229dc8ec71d4aa5a36cf51d0df15c49a42229006d3bbde5109910eb4563b8198970478b1565daba101eeffd0450774f8f6c2d525bc625944ff6a811077e3ffa82ae0eb51bc56325bb598f2b4cf9f56d71106056740c9a5e80c03a8b1007bd37a7abd815c2850d6f0ae57db1cf34fd2bb2d76b13a15743c909bf6d5f464659595f2e4eb1f0ecff1f678960977348b712ba89f691cbed485f53bbea9793833ce7110118938e4362bd390ee0e3227f4ca9f1eea8d9d817d2a8c67c583bde058d6927eaddc385d25dd1e83da69fc31fe478c0cd2af2b21d092bcac960510f15756808b24547bbe119e4dcdc5ad23e71a6088df023e43f471470c86caae30dfb1c6b1c21fa291ab8be7d7cb3a4857bbdbbe0c11d3cb869dd1bff262bddf8c2ffa9facbfea171899f7325328c2abf614b4b89c51d1d75162648614ecfa1991569459d7d13e525efdd6063662d9788da627d8900b86d23306bc11da620a0cdee8017dd9a266b4f36bbaebf7e5f91e8ce4b796ad9b5d5cb9ef4aebb98e57f9c358d48418a00def6458185c1e3eac0e8234f68b3badefc73480938c38be8e90ed2d8ff52b569e42304770cf2fd96ce8fc2b472ed0af98b2616f287bee7ef842caea96596842825dd5be46cd9342b60e693c2be9f30cf29e9f0f6c23413c3f8fdaf48a2975d074b2c3212ccfff17021f37ec3755196287fc6be5f11ab792cee89befcdddda9ccfb18714755ea9a2eb6c06cfdbe8ca3cc34c468739dad80f10ed9c40f3eeed140dfaa00cc2f24992dca5543b9c2d6bf82f1ebd67b8ec190dcfff4a7c7ee543b2b9fe9c7e98135543503b8ed3fa8ba52135e44f1be0c7011b36ae2516d15975155e3deafe573a3350e09f350d799bdc44822d69f863e406b3ff6aca848da3d7a85528f9e0a2ff8a27f850e56c9bd697ee7e6aac9194cbb07484c5996a266d01d8594067d9edabb05521f0fe65c3b45e6b851c658c05f694b9613f102c1e1d8a41b524b35ea9f75c54d7e00e7da3cd965850c3432c39fd1a0f0f47dd3ee72db76103464ac36a4ad4a394be84389e7ae6414befc416a337b6f1f9704f3714163fb2be15bccca11ebfcdd2dd0e1b2654b492e10246bfd43ef1eeca38e499277f79b3602387ced0fb84303cdbfa99cdd387d9baab69ac3f9b6171cc124bd993c20bef73e01a3e8c69a8771d2bd839178fe692333b9b5057b57c07a98cc37cdb764cc383ec02b035d1b30f0e5d357d75e24748e5436a40bf15a83cdd1909f78114e2dbfa97cfb86fcc3a648ae070db7b63205a3b4344f1d8448c7dc1378dde071634954283efbb9cd195141d4638d79a8b1862bfcbb9e835ba7f370078bda4d002d89c1630d13e4f5a59aa300efbf655e285eefd3d47984a002715154d17c09e63353cd01f12b4e9fefe735d9b28cc3fd1ff5b4e285c86a78dea847a352ac5b4afd103fabf22b40f180a1c008b4dadab01eb345d0d8737b0dc5001a9c17538a541429e00819fb0213df310c34fd93f39dae006946d56200873ee191e62757df2eff0478c16d84dc2e94fde106969d56ec5644e7ec837d400ed2b3762a8aa2a2fd460bcf7df6ac166a286f072686e24bc69fe78869eaad85c807de8f0f491a1bec72a5ace5bd5cf7ee22ee453bd5481a531051146612d815e068caa53e6ba991200a39d8a0c97dc8e30ae165ed8bb90aba31ea538a04e7397c7ae07f5ef8364ec496311c5723f5d27069b22de6b11c64248a1b0c7ec7c339c5c786e718f9a898fe9ef43eb2d1ae5abec5c866cb4f5871b8a44a09e963525de2d625a31475e9b8f6abea0658dd8eabf5a98bd8476b57769f06e11074e17eedfb2f267cf974e0f6d6447b3ef24e7f0c3c9a634a000f00be003846eac7482e303a5bef3a70fe7599c3f20fac272d68c4bb22b8859e423b9004c3e35f89a04a6fc5e1eaa5201c90ebe73c0e1aa081301c9bc8f252ca0df033d22e1e3662f1b9f2c4497e84b2d519326aaae04e0552c15c041479772c7607f094016139fc446501601c12a1cd32f8b774c4ed10fda902cc1d8fb6bc6b88690f6fc5132efca035e4c0e010c21a3916c22b139e2a308ddbb30fc00feb2f48fcd88d019bde0d0e11e20e20dfb040f4599aba1e59624706345b0130edca22c0a992163d6311d595e1456f61e733e86baa89476d8782ea1cf50a1c65b923eaf759873201d28efc3d8d530d2d9012baa5f2d5fb899150c0d8070988e9d9bc2ff5f2fd07d6501f2b0efe55100b42175daa17c7fdf9dd95724150a06c44b75d9ac35d3dc043458a0a111a92a08465087a8203a77645d518a75fb916f0fcb9d0d268838f83d11998404dca54e31f61aeb8369cbd8df6e0a3083b2ab53e9b49dc80ec4b3a7806351176caf7e104649ed1c0cccc506b9365fc3ddc8cc37ba9ce484c589c88c96dffbd5391878329db8539394f79aa37a4ceeced4bc589d2acb0ddddb360bf9b8be06480a9647f7b0d7cadccc48d111ab2823bc08ebf4f692e5663dc057e2819ea41cda41a74202181ecf72135efce3c44e9b160af605d68b62aa2f056de0b681188c168eda1ad43bf3edddfa98729c4e26b1672b592faf8cd9361c2af68b0b3881f087429d16d0b50d828af293d69da147031a1a93c6f41f9f96afa17045e20d86c6a6fd6eea99fbb24a038bcf9d8a86360cb929246056ac5c4833f979a5fd788d9af01fddfaa2788880c236aa3bc5356a3acf07897019bb65d75393612f90120cc9ed3a58cb5cc406e35173b235e0676a19c616419aefe562a0791fc5475c628af008dd6dd15b56a3de4bd386106e749c3638d5cb353b82c9403eff1481b4d29e99dd798ba100c8e5ddfbd6846fc1e596fc81e6b4d37f4c0042ffa1ed732bfabe23d57f40bf0f63436eebed4b887d42e0e95b996d0a3d89be0555b8ae704433402a8b8f1b8fb9de530db6882a0f0314e099008e722df8c44913bba3d61d7024eb1a5a098a97a2928b36d647ce7805c43c682b3652c33394380aabd402ef4248057feb8f0c7b4c286276b5aca737c7e95af326218d6e7072114690f9a34a3d0525c79a701f8f38e86f49ef1722e2fbeca2b6abc0909421d65b44256535d2b2e4d28df15d3257db8b082ced27effe0456ca1f0693fab8da497cafb3b7490d667f823f7ac6f379c668c39c2a5f5cdd63a037b8d12c2a511c340bd5d6504b5eaa3dcb68b11dc1495c1a3824411e0825ac61520095f9be013a3e7f5307d0bb3b0097f4761ef22a6b3f07cc31abe4605b4112cf82cf7d143de6b14da3c2a927470c26b4043ec4ad33d1b9f650d552f3e2c42cf6bbe836cb5b9444fd448159fdf72f52807f7b05a857a6c95d1e57ea4150a8287e186aa7520eb56214b1ee53ddcfdcb3c0645e45da3b309e56e6ae0ab7295f8dac24d15f36bbdc811a7844371535a6c31a3f7305815311a17a364244f3d16cd5276db6bee7e77c3a85043d7452cd2ff8f48d33b55c339c8b4da9af1955ed5287765f8556f41616e6cae2348c04fabaddc5ca3ae5b95163a437ad5f087bd1a32d0f86c7b7c9cc2f2e729eb3feaa52d9da2472d3073730e9a4cebddc92c432d12e595fe842077e476a12a6563cc14a2f868703a6aa4456b0d57947a238cd655f13ea6781960ba0d232117575d6d8550e5b7419104f6f373bdeddf74a6b05fdcf76491a0e1464d8621ef5a8ad4d6e1808d1621fca571656fd2953392fb9fc7084bdec03f85d91897979359c6710d0e7b170d7841f51e83a674d8f89dca61f4221634991cac210387ad957ed2dc1cf686ac24af299e043662c93d975ebaffd0717fef8601ff27f7a08d7e3078bc0a7fec74e42c7c452b64e9fc4c769a7480423faf96edb425f2da285cd6d67eb9e093f396d45802959cf685338dfe1ca0ec31d2ceb138fec78a96684523daad7ca519e53b7d9b82335ed57b968997abe54c877403c8cea78df811a86eefa3cdad61f9088a655ec6ca79e7164fc7aa0eeba72b6a766417771e433530ffc199a6f41d1ba5ac16079400f6169d83cf9d0e5b0505ff500c7b362373e847212224fff7e06703c81800b57ddc49575d2ada73dd6efd7ab94962ab43911436fb99aca261b2c56c07f1aff1ea33688d025fc70518ebfb22d8a2349f27a4a046b7ae9955d89b1d26912b7e0fef045a889df6ce8bb583e741d69f59da77b474bc7ae953e104a4577a8d4dd4d93356098d547856cf5b3fa91ddac83a24daca78e36fd3420e8fd45bb023e018155f315ce74f6cc697b32529fe0da63d45f8ec9402bbf3cfa31e3411107d6bb48c1a9d3bdcb75a88ac6540502e97c0cb047a25b06089d1606a5cca61e2c0760f060da38eb6b4ca03d6189504f49f9e4d2a087ab446fff65f29eea0346d178a914be04a3dbb6d459fdc742e2e974dc9297f49f588fc45e932a97fbe70faa82ea2223a9b31340b52c4882312b760cac8c9cbe69d14ca843243b2b52affd19beaaa54c39c5068b57adaa0ca4985973e2393d6867a41f8e45af80c38eec73a194611aa245783a1944449ed14dc8284d163f168d295f5cd8ce8bb7eb112b27d4acb3fe905d4b325d0387a37a6d2946ea90f4a4872f51992a564f3d1c89ca7e155009ddc0d1ac63e90ded3462b33a59ff1af053f0da29690565707cd24968daf626d914ae531a631fcbfbde149079c5dcfcc8c154ba5520cc848613a6e074e309b9b84fa352139493e62a1d2a85761f16bed4692d605375122bf68e04df8d1a92611dfb5a4f269cd7b4fe5dff12adca3ee9a9b7d53ca2ca68d4484876a70fe652b570843daad1c04de0ff3d1cc89f5ba805bf3a06dfd185231601df66c77bdabd3f6696c805a3c378c29316fe07b948048b9b6c1caa5e59e359a9bf6fc15f6c2457568f83effb0afb0250983d608a13b6f3b4ca912ca7ad2c27b674fc25391f3aa5c6faebba660b1708ce2d3553804341c6a1e20ee74bf36ff8ae7c9653876862a34e557a0563488f4e523290614a5b378cc92ee06ac9c11154f842b8ecd8ec3ec8432bb9418147b65b8364b91a36cffabeb11da0179f9ad2b52a63fe419bff119d4bda240f3e8d1eb8e82019dee4262dc4f04ad87e4be506a1cb6cb1024f25ad8adf0d44bef98d3aded6f15d2fb0d22347ed12f42f4d343fa341a98b9f61044529532185e140cc9d460654ddad4b788da02e228d7b120ce02223c6e8898fff8af16ec38216b2dfb876ccc735a8126dcf6639d60f1238e38aa6f83152511a9be16b884fa3bfbe1b0ef9b0c4dfd084466b2276c9f365303cb1ca256543769f4ddaf02632755cc113134748da46873f76d34d8b6ac4e4868cd7d431ff466a8ca9fa37cf18716e7a6c77d7fb83f46ca293ba4fde250e20aa687f8da45be5cd7124a1aae96e1275386b8f245f3e83d13c1162b1f5a539aa2a341b2f03077befeb4273b21bbfe2f189b4cbd4da765f558a747f1c5857d1d174943d60c47ea3723977e2f5cc6a7d73fcbcd031f3d7f18a0c3161d77cb9514717fd48ab7f4de6d50a5971ee721a2c7cf0081ef441bfe4bf4fdcad7be946526b92c3df6789f1a088cc5b92f4b32b7a6d021b2a643abaa385b3dad492048b3fcf63ac744d7ae67b1e0df2e8a0f63b01d4b16a653a4544b87dd6b0598274f483d3090b7995c8a8d1052dc3c58bb1b54d346c7a51cf07da8e0826f1bef5b12ec926f165820909b54cceda22cc1d8c16a71cc1cf929ae908ae95331377443f766a3bcb4f1fefa49848db61a46ecedbfbb9ee2fde9a366f4b94d5799a14f676780171e52c95e23fde4fdb72cd102827c0f039252bcb2a111fdb29690a0a94fcb00979ed82966911d3dc2f7c1172a1f602d47e303bb7de54f1ec119fc7daa8489afca432e593ece1357847ebf5e8d4dd3df13def82e2dbd16e321e7c781798d0b5559153da10f6245faec5510ef52933deb0f89195de9aece157a08d7f13ff2b7baeb1ceb4901d31deea1839a12a27a061ae2ee4f8fda42df7c76851618233cf7a5296121983bab01fa4c10470ea58996343515800d2800b1e0bb656a3d4ef232e0baebc8d7e6715be89505fd2d82485601af049520fa70ac09f1b0bda7e79ccf3148c2c64f29ae927e2369a6b5623fac49f9c5770e781b39bfc16ff69f17c2386178ef05452de90e859f4429ef6cf701d3ba600c1fcc88bec9d3a9fd6d06edd438f4796b0419aa37c4b09e6e23c9f7be689bdb3e9d1b3fa5f0ce66ba59dba40b7d6468e2d3167a7505ff805d99a0c749d04440f4ce90c954fc5aae15abbf7045fa6fc551f94cdf300e34f1de981af00cd35c9716fc50ad35b5208af6aad9d8ea75be979fbfe263d0a8f6fad9695ff96d388ce68b6d8673aee2c801459f526462b7f9e6b66d018ebd9beda23655966ad6c97b373d6958a4294dfa1cead2519c1688c7ba7d4bd0e75fafc2f1dda2e8ccae4cd191133aeec70dbc5de2cd8bff096cafd01cdca078f61fac1defb6987ca55d8a38fdf5277164c2f8995bd6128332cdf6bd13bbb620436359a5a5aa817b804b4b5681cb770904b0c9578feeae069fa22336a802d3f157947f031a9fa30ce2e057d3287d73dd2e3ff63f87fba9b0d951ffe2e2994013b91be6df567e485855847558f7f463166ad749f84ae649a86744526ac96945adf15e56df6230b686609f6f8df8168fdb40e0882be098d717d1e1e475655829e788c797ae459c35bf8c990b1932cc3e5539c27c7f52f89a24a0927cacbf4f36ea05bd70f207a90f2b5fda12a5adffb9acdce5ed9da7eddcf85bbee4b7de37b2def0a7ab54b1418af163ca4bd872954907b1b1a32ce761e3ba8acce23dcaf6e6ebd2ef0e7b4a4bf03a20d1805b8878348e418f65d51a3bf993b6263fe68c761a3731fc6210daae872d1d5877d5f78ec26b13e5fc40496364ab6633c25c2b9d96ed98366eba6a5498f3e2c5f9efc8c13dc3b01c31147cc06c29225b3544af55a1338c05fc2200246ab3f782ce5102f7ebc19e9dcaf9b93c5b3672065e492185843197d1d2efa7064796e5f5bea2ad1a168a67cf8f990abe77f9df9c0711881588114002b9ca64e275c43388918ad211044992194a99762f0a9bf085f644ececf2f80f00795b41a03d6469a20eb377c4fd24a8e5c1a405755a432e2af48b55f40d108d34da494529e79e0faaffc2a71b4b43309abd60c079b01a1ff1c88ecc1420814104a43d7863bb9cae0a2a6267fe35cfb29f0675ae2353484d433cf458347273b4d99edee3370183cd295739c15502f0b75e648cd85c8df440891665023c4c0d6c1c92d58d8d007ef56f50efbc08fbcdc63e9f4d440aa4467e291f8bd115f677f33346c97f4e01b2ad44dc2d60ff688f67a77e5ffc16e167918d1f0bcda5b8dad1888263bf604c4a7d10c29bb623915d2201cb6b08698c7f011bde90fed5da5e8c81104b57ad296ced3bcbe0c55abd6080b54c186eeaedb5543d23c06d8ea32aae88b7284e1ce041862dbfa4968d35c00829ca0f38804b32145ab74321b65d67bf043ea2ad94b8f0cf4f66912fa542a443c60cf76e15f01ec8d963c222364e3c455d6e627bfffaa15107874d9a882a34b7f4dc79169022a0f924ede579f7bed2cafa0f10c044ef7e92beec80df20359aee1c003d3ad82ae02ea21d532de0f750d545e954854bdcac1cdd5bd30453adfb70a441eae1d75007efbbbdb546d840dfefa5c3d4d1fc0c5677ca9ded130bd882c3f667281474db3dc5d793b2cdc9e0a79e82663bac3fc6a229ef7a78132f005471783aa1da9715a9365e69f3c99a20cf6d459b2f1efc51b8bcb3b9190da76b9c029482fa3b284474ccb8051f42334880e1542858301bf6c1b87d247a085b6180fcb106de3f10b1c50f4e2fdf407ca0e18418d560e984fde5a3b781430c332c28e9368ff3ef35a4c58686b1dbcc5d6f1bddf96cec521fae4b07c8991c221713bd508de5e15280649cb9c952baedbeff557460b3a771d5501c6b1834ab50ef5d67ba1dd05170d93b713080d925ac8796b8d2b37436508c2d7f580f1a9ba0a3534dae4e18eb52296f6c74110fc30fa07d6c7e5b7544f72d8b9d551512921a1b3d98b4888456ff5649b70ce6bc3d21f1fc9800c17f776ca1b39eea92e538c53f636f5433dd3b7f4a11778065a83ae7625a64e14c5977b9ceeda99fee5b37a9f80cfb17b7eb41dbeb0fd759f89a636bdce1f9a863cdede69e81e6fd913c34ce2c8164847d76111a238bfd1e065b60b445d77fdd70a181f9f8b67e8be350da3dc40bd124eb465244d9cc1157f7b4d8ca87851d09da9edafcc3d599d14d5fcefda9f06a7d6a22ad62f51b3c8c326a73b68833fcb3098ca1f6e9265e583530bb16c178591963d4ca7b5ec0a5462148da7f3229446365337df051f1f6a7048c4791f6edc3803c225097fe03760c2b15b52d6bae1ca1565a17f1e37e8947233b1a752f95d3385fd5e8bebc2bd467b898abc91d0bacf644cb160187143ebef805ddca54baaecb32b539f98082e9de309a65592f891de9974c232825fd3d96edb238984ca27fc11f89ec4f324eddf9fce38be8896e9703b7a6e66fa57faf566909d2e801956ca08c1ba8c9bbd8d840823bc47b130241ca0ca106ddefe3bc87d4d354c15add9df2e331166e0168013c2b6ab81cb58f44c8ff042c7bec718bb095d8652c3fc13b3e8b94dd46ed4680745f3710d2575bc885f699ff508270455916e0ae3098886e0dec0ca65967b97e70876c74a6e1aff4885a2628649a2a110bbeb3d7d54d7b5de66e6019b0580a23b909cf8b9e3bd3f05994744ebf1de5184cf518872347e23151795add52a68296d64f29fec54d0fe5800a4b1a6af1ea81a723d966236c0511d675c09b473b67004fbf41742000abfb852672346c008175a1b0bc1ddca52b26feca5bfa98fd0188adc3e196b93aee59f14fb343cd30f11cc4058a5456db9d9850e0f3a34cd69a5777c2cf0c97e422284cecd4ef956b849d97880ab29af4a48e5520503d6bad78943524d47dc2e78d8f1c679ee2cd988021a2a206e0afda863093f03971fe69e4687050b892432977b7eb27d9c17d9f2ecf6ebb44869d738ba794b977e70bf426fbaeb043f221942ac740944d37ab68d6d0823c8e4b6da9fd1be0e4d3469d3586747aab3d45640fede8a416c1ea61dac04b668baad7266222b3fdd71237b9144cfb59a96d35158107429e15ff82a6df3369a31260d3d088449875fcff616979bfbad5129c683ad4c1fcb6f9cda8835e7952c0387ae77402a9f2d0ba616db44c28d6754f9286deef633f742af404fe40d82d4564beba19b899e89478ff02a375cf7ac1c6173806ba353261113c3d226b9922bb00f6f5c7925ea24ba0a2c93cddfccc42e0f326bc1d7efe04146cfbf4c8035ba973e83f86783f497c991269896af7f47f05edf7070088cae59c4ee87e3f60fd97255d415f528305b0cb178b9205071b019ecf53f04b99bf8d12a8aac7b9f6330d7e1ca3590873fd6e9e79d75e9776694e115fe47de6fa0583dc43e9d71c0f2394e6ef0c7d82575a3e7afff4f5068a05f0c8664fb8b9f3c34f64e74eb752f1f5b3c59c24d2a97743a8c7738b5f3c8c186f29ab3fa9adcb217a105b806e41e4d2f383ec9460631ae135ed9b43a41fc3c9519ef85a57a8cc488b4a692804d332e2db88a7042f99895c6c543fc5cd997941208e1348ca933c600a79d7ee82ee214cf33c951b48340ddbd66429b9e291f4a76361c5b20a57649080046e79ef7cfb39c3087d82b21aec86f98620c5e9ee7e24a37ed64020da8c017455f672536406d0d45229e175356e865f20eb94ec9a5de0674f0e991306fcdb6ed33780b68e8b3aad835fdf9a6bdd03909c53ccf27cd902373b3566ebc2fb45f6e6f94c21e2d19ed604e82427a67f2413602016047c3cb39baa124eb0f5d26795f6037e9b482225d83c8c5927cd9e126fd61a192982cc1a1c046efa6b89ca6ad26b1ebd2da8c4f63a9212269fc880f52f64087e6976d36041b211112465297636ae12b1deea003b84704432997f6df4d874b4eccc4097ac931ac33ce17137b24825a703b6f61e193f3de8261cdaaf37f46de40c5bc9612799a54c23ac953e479039a45bbdb466baf260c7a931c18de70ab761861df778f8dbbb736d8cb9845d9652d360fc0d20462543a964df1c4e2ca3baf3011bb32649e1c501c38ac5521ae3d9fabb7ae793e4604d56fe2ed33b2d46dd61255be6b13f3429bfccaca1f0a9fe34e2143f2c08bd2ce6952026ce9c137b8b759be77662045b517231fc36a6306fcd531154c2c7f910762f72d0f5b905cb29f50bc74d81c0dea3e599826abcd8bf0b155dc09318bf9565ed9b3331d92cbc20aa1c0151569a4689dfad452679c87555ef9e8b854337411c9544576845b0d8d85c779f6c28bb196a27154d5327291915aa7dbe828f8b9f01ef14458346b8a7b9d3c4a885414be2ae8678a2d70c2233b20ea1607146e0347dc5b4046b226cb02cd6aa2583e77126bcc47e4d9c70dc4c94e3b37939ae618af9ddcb9c0621f57b972fd11d5063556ffea9d055889d7eeb23f15a12c40f3328db0002163e8d7b9063a4e298d3fd2044dbfc16c285da3199c7003f31f9b381968cf60179faac2578f9fe859ff4fcfa2ebb87f79c7a6e1ddde8d709e1c0e1715d75876fcd22c81cbabf0461389baa0ab406101cec4ea2693fee3f612701e02b04fd7bf51b9d2788de1f801f6eb04d795e25602dbaebbe3e474100ef0da4f9d8138b993a6a5511906c803866461b2e6eb47e3fd10c380ac37e49e25a9a9274a01289aae7c231d05ced4af6dfcac495123f7a75b0ec1dcd216b6ead4bd6b199aa8a5e76a32b19ab15e9e480320194c98d8681c9736182517f97192869caeaaf1f0372c517aef5e9e3e6b89e06f371140611fc04c2734fdc0688b01c5d7d260026032d5fea52add3ed6e2d1a03a944bca56951ee442b6cb7ddc89d51cef74bd2e814f70cc5202ab15c08abbbd22af60a9415ea4fa290c22a2edf468f6541426e8dbd3893501e52cb573d9a481b7e6d46f89d2def84ab377c1e53159eca62f41c3c8758bd32560e680793638a85ae93b8fc8a84969082b4f7d7ae7045a46248241df8bf5214d047d194946c49b9c14fa8c563560b712022e18177c14d9b4a25cd599ad51a9d93e34f25c81e4c5fbf885d7eb00b17cd8a678343376f7f5821756018f503dc76a7cc28e2b6e15d1eb128204dfa0b824dca6d254675e2a183ef1f25818faf624614e8a4f4e61e429e9e16395ac7bd1498e61a0fb2b9827bc4bd0b64bdf24372b6e2210d83e03bc4888e3af0cea28b9457e95888ae8cb7d7c1922165f3a625d56e1a5da9b62da2ab84897c8cd110dccc31d80ed96274e97b2576496f4c31bf5315c486c2b654b9bf3998c4578a9b1982cfbd244bf7fb803096716bccf01d77b353e6839eabddeac850c2fa9722caa87fd89f812495a9e4bebc8c6fc206f2b7bfd28a3c85bc519c8d70100695c125f28bf5870fac63057ded41ce3d9ab736e63d37b799c1113636d74288d0998d355f6dce7cb52d8a97b485ca40bd9c2a736bf62d768299d317226e6e3541ebb18158ef0a865bed32e7ef4d02e8d80f8830b0b25acedf542a79c71a9b1c3fd2539243d751ade935817e970e8ed0743df8f61c3866c7983b3de68da37147b3989cee89ee4dfa484da2e3159019007a6ca34c1752fa69959635e5dcd09abd8683b31f93fca4745e7dbb9ecf9b497ed3e5b0ba09c6bebdbfad39ff1c6abb869edcc0adc8c9fe24140df5382ff7c65465f048c85a5d59cafcc772bab5397fabe5eaed1e8f1c0410534477389c6b398a1ad493ff73df7498352d08a110058b3342f760fc52bf5d42016c6a267ec14a26d9dbb8e6ba14b6305328223993968a269c4941ce7878b2c207cbf58b3cbfa032894be00698c4c8993cfee80ca7b4228cdd29b91d6910ab964ea941ed402ee4b5146d32e576b651dbdaf783a1b526fb6eecdff0708c4fefc8bd5075d7f1d5bdb86189d70dbab3faff135d1b8023b5bed3b1b30d4f4bfc27603b07baceb77ed44258e7f606ce836b0cd176d7325a2913c414ed38420de1fa64b215385cfaefd05be1ceb85618ee4b0afb8ce03ec34aa148fdd49bd23bc411de09c3160822f15b0be488458702bc420279e55e2cc5df116754b15b863b6e13d528597d5a974c1a5b495bc421f2b4fafb33c97885c7b20a2901cca3e776a7a952f71f94dbc2c8b752f8905daa529f18fd108256cf33893597ec6d997c54367b5c5d5c8412092ddaf9da6e3aac89454710fb572195702d3ab8fedc65cd3ee530fb455a7488d5422a56d53f80aeff6e2d3dd98f015ce666c0951d6030629a7a7137945f8dc38fd05074d2495a391ce2728b93731daefdfb6f34324322c4d1bee51933b4f64d9d9ff358bad6eed44868bf03114b9e121db6f19f26cb627a4c7935a80aa1d8ae6977bc0c732c6407ebcabcab3b5fab11ae5debdedf41190c727308ed016d5b6c59205397e793e55a6dce108df9f66d3218b908f747ed6e03aa7307ee0162a611d7615f01fc559956363d63b134590cfdc392edf445168ae55e43dab5f0c6e2254a0489529cb9a782aede5f1dd2d1affa18b045dcc005943df5a9284ab8e2362e1acf7893ae0637663e7baadbbda47eb27ddab6b8a203b590d76e99b33ffecbb6ae8bd4cc1a85738b4cdaecf3db1aa2ac5bdae88fd25615686b5ad6fa6f62c94470004703c87e817842c4ce6b167d43701b7685693846db4c1b3487272e555761c7f57742a03889b58601f74d551388872377324fbc1d30c54fc6544066209d931b330c9089fdb4cb825911a180269a78dda4994746213b5a6dd6e34ffe0cc465d583aff66e1329419c94c16d7efca1cbafc7625cbe9c2593de2ddf5bde5ff45c5bab087a34c3119f3e79b1bb39ddc40903a635930cd415f80a93ee6dee6154021673be27c455946ecfd2899298132bb9400bb8f61812341259cfb88c165c0dde6ea57a020611d935b765f0fb83e5ff63cebc968cca9da96834abe6c03e964678cc07e315e23f097c5dfb8ffce29a688f1581755d0bbf9d8201ed20114e5828599663a26741264bcc2b5b0ea09d7b8dc67d24fe72c1be38e9295e0d882eeadb08367f5e00090fc8ab884f14ec9dd0978f6e6bd8d2d6e3a12415c6562cc694860d1223c0e92442a8a4dc9d49eac8e1ad735020ab85307601bb2ceda306fe9e52f194196f297807123c900e57a107f5f8f98b092194b9bf7f37d59a9b1cbf4f663b222814c8efa62efd0a6ae3194355a0a987efe0065705441f7a97e678eff1eb73261757cf7066256eb379985b624acc0bac9990e3f49278fb82aa2d2278ca082207afdf45e2911f17f3021b6e4e1aa4a863d1da3477ac4154559c18204023e6cf2db855322f6d438133cf175aed0d5107125d6600c89ccab05b344e7c3143ac0200fa609e3e43ba33d9a63228296dfbb02306db4fcfaa399afc3c783e32748343e83ca992f75aacb54f5014dfe880c92cfc94e129741db797a07a3d6c2afc931b4d48d81542fc4090fb9566871490e40207cf22979f3f6b31afb846100324031197e49430076f9e4b473cd02994e374baaa7f43a038567eef91bc3a31a434fcae2ed985ea2efcef6e9a0ff9cb50c1a0dd4f6bef4d27ab1759ae4ec2d8f574a5787aee544b9feb5b825bd48a78307490f25d5ccca554865ff86e38860cde2b27f9e4eda95b4384090ef4542a351c436d813c1a82b0a72e7e533a412dd547a3a9b9d29c2b23000f229acc57820cfc755f12536dba7609ed9bf37830603b1822543fadc583aabfd3cdae4ba53a04b8538d2e0c1d1c006009de5e92cec64739f14f13de2e59f8691933d3d905f9253825205ccef14f5596cb701eeee308009258c3bdcba05416e4297b90de40677865333f2502b2fc7d917b79bbf637cd6f0c9ed8c5dee21c0b1a4bce6ec21e2d0425c413100e28ca813b6120bb1091be9a8d0db5b47ebe5adff1c754f4ed67f3d26121c4a55b1b62687ac58ea8a6ba828bfeeb831212fab69b53e434aac8e360e80293796c51536b3a38eeeb091f7bc24a48816965045fd74627eb9718b95a1d50ee605aee58978eff5c255e67e39a26dd51179037bbb566e85524a4c72993d2120fd090b2d9b173c0ceb20f495adf554e03f5200f9fc40a8ac4d7843e815726344b2d43403a67c18576dd2737ec14f8a54562407618536c325e4c5e05276ec1c08cbd9a21e58220543ceeceb901ffb6e8fea818f38e2c33eb0acb5ba585a04cbdb9cabedc40ca3a37082c2b58016a3821180dd10e691508bab09ba3a501b56f34ba9ad7f9b506b435c2e0679b541b26577ada934f11d793a939055d8d0574d12c77750c01ab0039565252a90b62da27930c56853fef3a7bbf8b51b2e6f8a61badd7a5857b8a7e6fa3a0ca1a2e9371e3dcb6cbd065690569048fc7c9364213f4c0c5716befb949fe239490e28f50a6033a607f9b49e80204812daecb084b83056b2620e6e5a2298fdf17eb28b3ff432fb5f2bb0f74d5f7f53d4e50dfe17abef6b8e3fb1de6ace5cadd0f2514240a0e0e5654c7546d96ade340d8f32e4b398b6eafe44a39793f4756276684d069d7d049246feb91bc95ec7793b5e0dfcdf0b4155711556127c315dcc50251810ad0508727296fefea387b593dcb5f1bf005ff94b85263be77a01803bdcdd3528f5b5871686b9a957ee924304604b70a3ae13593da90bd78f13f187419ad546981e2aeafee1eb6ab000fada4b74632d335ec1eb9c6b1acb61d06ddd6e18c1aee68cc1be8c228095bf911df5f977b169f698e81af839f76a0845e2ed21b516e0aca8167c4ea73dccbf0598206ee8aac955d30271d1940635fadb0d410d1e498e431695aed70e576236d4e5e44c55b3cde9938d9a9917ebd1b206298370a2de0a624ecbc085b68218cf8583abe23d60ea1a5105dfef240cafb66de40efcf138e752c7254c0b4e3232e1adfe01f10e369070a1e7bc2446dd428068a94e22781e97cd063ebba823dc5305a4b160d946a97384fccfd9e8fef21ca88d05eb61a5c3ae0982749a1cd604fba4105a530b853de5bfc81a939dcadf90875176413b08dc9cc0c26361b9e3309f6567355328386879899a4493c328fa60a54c66fa2f2fcde66b5c87ad0fc9e3a0a21feedb8feebd918af9fa34e9a7d6ff9ad47470ae791c1d61a76dc6aef892c1e2a0e376d2f6b1e03c5d980181b5f9bfd0901b4f49735b945c396268e7fdc255bfa0cf9f620ec9c8164baa741bd1d733dee5c7e080bce10db39921ee6b57f6ee8185efcfed9579db813aae27288a03fe2e7c06ced4a450cbf03d08d1a985b4fee0c6e082b609567d35a11f75385ce47137995484c5c83f61aa9ba3ad230560f955fa3e525bf8d42f8c157af8bbb90d2f92e43d8cc4a6f1613b4b6efb58659f80498645a95fe267850d1e4d2c333cf29bb8d32e5161bf0b3d3ab2e726ba14d50643f1b3023234a5002112128a2f37195831ecb36d1d7f0168116898c9d8a1860dcdc2f2f7638e011360a7478 MD = d3891d0e889883471e15525f8d4ddc25b68339c0c17e3a725c8f858e7784267ce0767b12ccefe62728983c53c6c847d0c38adc3f52249b6ac082c01722d86125 Len = 92104 Msg = ddd32f165dc63f633c17c2bfbe0dacd72ed6495dc5d53afdce3dbb9308df279b4c40bde86fefa49a6a152d4ab84e598700b79b86f449de157965cad108af4399542033422d578a8ca43083557098280d90a0186a32d0885dd4bd8844a9dd87613e9b1a8b5da7f92332904a4aac94235126b74a7147123fbd266e7c54b211fbdb52d8f92bc886fa465b5c0d9035ea513c0a24b804fab80b1db99f2e6aedf2a6f0d700588a369d93dd68bd518fd341bab48310ea89146af465d37927ec20299086173abf106f94ced1a1daa0af4d4167a2daa3696a5ecf037dbd24ee44145ec18658afb7253a12b3084edc81586d935fef5804bc0d9d903f4dbfc70bd8913842d9e386c73160bf496bb7ea7df2f9dfaa81425c6bdc9c54b1be208a07125f5f1a6500e8789caa4498e2242d1be5bacc5142e3d2ff3d22c45fb62a966959457c5114f6fd51cedd49a856dccce39978035b19828fff9af688531e2313b9140c37f0cd0fecda2fc47582ad28f05d77fb2cd0ed66baf35ae14795df542980ad7c37fd7791de9b2826712dd150c112e50aeeb9a8d87c63e5aba92bdf05fe448b5d2583fcc5fa1d1fcae4b1a89c66894c6ff11d3120fdd8a31c581f087ebd901677a88743f369e77d7977171c53084a15f0de04708664dafcfbf97941068ce9b692691334635281abfbd26614bfcedea6565d764d52daef5812373f71e693d9d3750f2eb75cde740f189ca67726e1cc6968157cb0cb86a11f27b77b8267fce7d5e943e1b428354713987edf2fd1689cc4f0af1d813a9177b90324345bcfec9c24b6ad33130d7e821e421f1a23088cd721b4d262a8e722f98e6e2473e4668d7e28a4f42cbc54e2ae97df285f3b137504e77e27510d1a62b006305f3f057607174a7ac1d498448852e83740b45f394aab7e1456f5991b78238a107fa0a64582eff002bb348d2798f67812102377c334544e3e065332318ddb80d7299eaf1c258c84028b5384433c22af383fb36bf95a88bfc6df75c1a6c95e524d0742084318786c43d83966e29a5ff571766c2323e5ce39738b622fc05336663ac1939a02843b128d4bef194ada34b2845d578889fcaf240caf2262c854ea2666ff994ba1915bdca88c7c87c3252a4e3a9b7b8073c8b2e85af6be4405f303f999685d04676662345b42e89697a3c8315bd9e1f428705fed25053dbcc15908469aa4e6ae9e2cd8816f153c300c7b96c4afbe8fcdf11d3e9b3487a7b142ad8177325c3d2f8c0a432aadaf7f3c6cd61c6dfdf38ff116f7d85b5122040dd218f7f32938687179292d99dab5b9a2fddbe3950f1fe94adf25b493427e5db7b7c2f12247df715aafb01d35c1d2f24a08b372a5abeba3bf93d05aadd044b99739d2f76c53fa5fd475c89c6629ac331cd48551039affc7377c1f530fc31c2195a271913917303bc612993194d9eb8300ab7a0919a3025c9ce03b2623e3ad9c9938c648f1592a0c17cf4a64279a38ebded3ba214e909d6bd5084b5b4ff8a0328b45faa3fce28fdab1f404bd87343b729e956c21092877fbca3c787bfdc99ceb530f342bc27a08ae7bc9eec51d6f9b202839b891b432391463c4ea0d941f4ad0d9df9d66ace83d8f5d9531034f1300fd6407c7fab6778abe88e7c8997cc252e806fc5dde20f6d5853fa2f4ff86e714123a47c1e477bf130221ee3aa71c7a5b3cc0b09b1b876a7998093660422bb47c669340ced55fd17be716216ac0de0f0dd2f0417fa34a0dd0d1a39a9d53a442e301553b1457d6776b764fc87d6b294812b47ff83200cfa78337f616d2ba5b59efec6a80bef144778bb6b42b9e3166ee0fea531ddcba800039d2e8f12700b6c1482eb857f22c119a82af2e92f399fbc9af7a56f8a457c4df9bab6275c5ac1f4197cf2908d88ea5a8f969a344a42b51a1976e6ed0b361020e50c94de8d446fda384d8a4da9aa1686997edfd8ada6fd03e72cd85ef3160a45301358f937b57b8adb65010175dedc3a5054222acbdeee068e6a0829b45da117756f512bee366b828d63f57054cf91c23ea70fcf2742feae69bee4d1d1759b142f613bcb134fb64db8bae60ec8c4ddcacef8071a328ba54813bbfcebdd064ec7b8a9677b3959e26907ea3131648716c08bc796b09001888016b1cedc298842aecb9872a0d2ed8650d572958caa6ee32fff863d16a25d0ec2ed50b9276963fd35b2cedbd0828308a1bbd45174fce4a98584b468b0fbe6aeacf2197a51ff3204f918bd017eaab2ffb82580138eee91005dd5f2b8040f46fe9aef7c50e06d6ac06567d3922fbde5b210ad164a3ef1fc5e154d9199a45ef665191fd9fb573686d6171aa2ec585ea3f647bd076419a97f393866419c065d6d78941de2c82add1eac6acbbbae8cef7602d9cfc40f8367a21853ba632dae9d14afb8640745efe38ab9ecd58e2731f2c48e236fec9b10defd81e3b476cd1190a480e27cc802facc539529d28b04fc0b17eed117d1a55651f9fc64df0cf8b3da6582aee2957df00a21b48e4d42b62f9af8ab4f52239ca8732fee53b4964f19dd003b7a1ff015442f4d9ea6a035b95124ef5a1aa9530fabb4f7de3cbf932eb81aed01d09f88778bae6fc9ff65e49d152b5451af77d07cb499ea529c6a94162306847c5eebaf031b09d0bce528dfcfc030d0589a683c4277848fd1df3009a3cf327f01518ed44696b448ee144377cff6b7dba557d4e71f591750e281ca74463121354764e3a8c0734010d3f9504d2c3d22eeee64587151ddc4c5eb3074547bdd553fa515a49cff353fc11500d9e052f824728a4c5d5b986a1f677247d83ac3483106a0c02c11515105f217c73aa1d2ac2f1f1f7c7e1641a289be1e446097aaf66712d110f4a6655b24fc62b91d3239ed954d04711521ec0b861225c2a7eb915c49fcac6488ecb9b83f687c52dbe1e7210974dfc6dd1ef609b73c4f3f18a7250e6c1c99577324bcfc97cecb21016168eafe3f07ea106e0e317f74f1062d6ac471400b3e562e1efd9cd097d5a028114dafe5f42357598f82f7516491d470a6fe296840f1dd241bea1d7c3c326caa71e3e4434ca8ab330402dfdf73c8166cec309b37465a78ffac00f2fd5457c32323fa2cb8910e32175bec5f6c3afa487c8b1a4b4f83eea61b5fd0c1c658bc500c77ceed9879da989107ce0aaa12bee74a3409be13a204e101a7e7ee79c1e6afd10df0ab755f845b1a882645fba37c7f40579d6825f963b63d04a4fd9a185d1f1b56fdead1da91d61e6d63b5e355b97ce97623edf92251924806965389d4864a45e34520204399b6372824bef3b1fc6cb0006b940f9575019d1e4aa4cb7f08addb2374f00342f267ef38e7e59f40cbcb3e86a30ecbcb3480b6cc2045f1804aa66597fbbedd51325791100bae687a9e14ef9988c2c04c16ac1f80b5db7e70c2e05fc1480120e6e021d75e2e9dc1d7e9e63d997b348f90a1c051ec79c9d4d917d8343ff84b708c72432c73bf284dd1459bc306f8f88c215c79d86ffa959721affa7d547b124eba6f380ae14bd26f0f27b1fa7290733886ad452d7bb6c337d2f1c3b5bf4eda0de93d7ced374320a7da16d55e5cb02937292a9ecb901cd7396583c057c0f2274091738e5de633977ada7962693606aeea914b033d6dbb460e71ec7cfe19f37e995b97e8e76eabab7a88e5d5959ed268d547850efd35009439508255f31ac1445aa02118f430f9d1095dd2cb8de7c1eb89c47f0e75b68b464cb9fbe7d153fa1d06f795ab0efdccacb9c1d6a09cb143ab7a908fae4142c9d0baf69fbf3355ec6d40da6bfbb1f59292fe7d57e15c7be62d1a243d5aea6a3ac8069f0428838146b97ac11a9767d8da3869b8dd2a47b817e4faf81e90dbad6ca0a22bcfc03c7667862724381abb1801e16e3cecd7e8f657679fa489ec9f8cbddf30253922d895ed57d8ac3ad20633a8329e51ed76aaa723297a8235ca9078cce81303f6ace27036a301a19979e3ac4bb05c908583174b19af1e4978b76902186fdd508eeae485d1fc34bcea5ecde25adf2b811b89b972997cfd42e93f83a90ecaf183485949575dd7d446941d4f865403adac36070b8e20f78a06fdcf7aee3e7de224d9649b5528aa82e72d21c308d5e2456a5b67882e5ec3571e2ce3b932261d31adb8b9651fc108a3071c08d2da3eef7543f237b9a39144e6f10d28b925341d72964cb41117c556b73ef72ef98b2d7fcfe1a1040abe6710bc1804eb153806f307772be129cd943951e74520a18bf037b7abde3905bf5e9b390baac737db0d2262b8cccd39b1bc14f5a86c7a556d459bbf0b00633526d66900347529ab8ec54036e3b5d4ab54bb6e04faf398af9f8c106897cdff13956cfe843aeaaeeae3bdc0d6705d94093700c912476107faa3423a26ca8d892b8b90c0477771a3604a5538e3f75a87edd92aaaa0263b54d118f67d8c3bc57dd769d042cc82b0c3c65329fcc1d1032c93ab9787310ff8ebcd51176f0b341c69b1c0aa1a85e51e7c677eba9102a60e0ec52ee5e3377d104939fc2363266be8c945108cabf6071139de2d759a18dec18adce3844345e62809c16ab90e604bb1190bea067baf614f8894ffe98c96f3c43d656a012bcee38689de3d36c53b4c0bd570bd961e14ac1fe5166694ccef8d9ca2d912db0144edd255fad42b3c29f56f8b0dfbc9e7c81008dbfce1f5ef94f4a137b28e70684a8d920aa1d014b7bed042a65e24f07d3c6590d993028b7929d178887c2d6fd5321b2c045db171ec6c553bb3cbd9c842e3f55e6a8338d3de109c9901b08037bcbe3f26cfa8e8c13eb4fca13fe18abfed4147b80b48055da2dbce792fda275693216208e8fde691131b5f19a739a825b0e6e534385be8875c0def9f8f63734b0d1e1c58dcd75b502e21c50b962ec2b8524756698e2962ff6e0968729ce6f4936f06d68d17cf878cd44ae70d694b6ae625e503be594b05144d60c1a8d4df4bbe5d7e291c26412ba5aa093d85bd29f11dc03285b9364b3f649ea69398c3b6b92a4cd67c9c84c6984913df310aee24f5eda5d244c0b174826ec63d56d8e5f7fd75a1b24964bfea5dd5a65f5a1398c6f9d43b26d98b47816ea158b773dfb82d691f10a4283b3406fce9d5ec112629aa7d4014b2ac6f54ec649aca878313b6c18c850e0e91568db6f5e427180eb93d29e0dfb70845f3860ff4c9a03ffd1b6e5ee845fe540d6d2974c9531e65ab533fefd4f1969a3eae4776afac5e435a6d5b500ce0663704d593bae7b520576f6aae46ba3437daeef615bae5b16924237fea3f5ad2da0a00266913f198d15fd395f4d910f61f5cdf716d4747775574d0c9a79752abce5f97e5f5fa476cb601603bc00169e5b192a896daa6457cb797eae12fd2a4c9b7aa348ae6e889af22ceade28c7a4551931ea2dcda42502fe41fea4ccf8b91bb3a7c5e8b986918eecc2a1510b68e03e8485386b9e8c6080f8f7f5763231cd9feab488e7ea6e67599f6a62e5ceac7460825d3acc4928bcda9fe38badab720ce129e813cca8f0b303f56c5520d75b08c3fc0018d73441e217dd4de6d09e811ee8598d8f1f5ad21d95d50fa38d8f3d4370dbb7fb15c89e793f997c31677527acbc60e923696add4c16269c74b15e19ce6e05ca0b0c6d092a5bbbb992fb972c5e662844f8303fd9e98ed25bef16adb950c564816f468c489d712a4c31136c58dbed97e835ff418e9b06c0943d43e2e3727edf23504b8b24798cd07d37375c73cc59971c035bd8c40b84d88f85c06760dca05dfad5a1d46567b19494ccefcf44d8b30f278ace6c42e1130293f016a2f83533c84c27d2cdd30eea5ed817c42d94a802e652f1df65d1c4b826eaa6ccfd72264007626d66e035173e1692413dde2be34e06e561172b395c7d2cdace6ade9856cd0284d0e3745529b6a50a71e34ad1329f562801fc26425269fcac9178af306ee5a1fa78d3f0f9ed58f188d03cda4e3dfebe62fa18bfb34e847fa8167fd703158dcc0b8cbdbeea0a2ee35486d2f469ab7226dd73f35c56f7d79b158607bed9f4cf6b00342a45f0294063b5ba2d02eb250476df951367f1f669393d0896cc7ab2b266219aa1edd2f2945af595d36a9d52bb96b18702464df2434266c5b669adf83ea5b6e3aa1e5a0c34ae5a3e4e9644db9f6f9b72486332946b9cd9e4eefd3b6e7c10073acd404e2028492ddd26ecab67b8e7e47e6b246884eb31de8ec6f0edbb73905cc593bb77d57611b59ce1d6999f0fe7d6d2f5f3b669cbe7bcebc7aa89882c0bfcac83f89dd428f03ca109bad52aab58b7976e37e5ec11a8bd227894d77cad6a3018265d88c546cd0814250228b29420d0f45c57bdb4c75b275c6214a140009640310253ff4ed68f621ebe155adcd329691249bd066af4e843c00b93ad7b2d76741ea143cc1ae22092e75b5b33526f59ca19bcd088b5a1365977fd7ac4d63af113088b93b5cf7167e096843c7bbc709a3a303ef80b3ed52fb1a8c02faef931f1671646ad83168c4c9453c220f9c1dfd3037f569d56ac98ba927cda1c338b195db6715cf7fe963ab7f5489b6f760ac3ec6b2f8c2732a8f2bf461bd5a71b35fb1c494055dbedf883904c9a9991ba3f24ccbb6868ff67daec2713ac393a2d9ede1868acb7bf19e36fbfe17444ef8d070a5d3a51738bbde98dd842578c3c326eca385bdd0c0d4b00072dfcfc23efb70a7e8632133434fc7edebb1a465815f34fc86469fadb2c49f752c0e55abefafff1872fe9d53362eb40e5b8e59e242c35e7de84db2bad84db6f5861e3b79d792e642e40a8c0f97e53d8acb8e98a79ebc3de1781f99a097dcb1022f9403b49d20c0a7aa2b7fc0deefced3ba17030deb964dd78410b6c777fe083b76e420d496f618c733b5eb0f71cae28985dc0b8dbfedf8c0bad59cc7ff2e17020aa325625b6f59121f4e505406e3131cdd2214bf823fd92d7ad2be0aa3e977e6393583d661190c28db693226f4e4cafe2eadd11be8e8698e42ac8d07fcbca568a13fbeb93e7f9c7be67b22f0c23c94add8b3b31b4a842453b0a79c5870241a09c116487349ff947bcf08856a0556eabc89f82d363d9f842e33786e74849c603a274dc3ad1a358eb903a5ebdb24c047aaa0dfb21518a7236e497375d4c091f27a326a92cf35ade5a412c7b8cca6f525e8cbdee40082176ca4714d3501bab15b5a70e1384212c523cd7ad29ec702822007597a25b1008cda61395a4e73b957055b714646be4817e3b5ba7ae052ddf3a086d836198efa53f715001f04b3631f8aed920e208c3c128fdd40153fe88fa631d7d69711f2f6293d3064200a394e67569171ad7844654192a4aa360ff0ae265e7ab311b1957a693763e3f1c18db1bae2d79ea8906f5a3196bc5751d3239ff081001c3a7aef0d805ff00e08cd2953a6ca3067941b75914f0684e5ed1bda0b9143d87075d058162b219520d97f849aa7773c6ad46bef91065c8ec49c6c8c479501844e6854792ab626a3eae86b280d39744c16fe2445d004133a81b427c2fa585494046669bac1bdc9acbaba12ac11d94be00a85b710e4a4c5389bd8e0068a77b788311492a561aea5201ec308594f0358a8a3efa6c93584ecd9717f27df7e5fa4c162d761c1810523ae95a7bee81b44350671b075e74900f4cda11b51b65c9ca6d008435987a65ddf98adbca8b11d187b7a025ca6e3a5c56765b94210138b9b28449fccec605815338ed586484cbafc6683c468ac56c23edf321867c58fb1f7c39fa7f88cf40cd7c9e18ba920238b6cb0b4365918a924c9a6c34d10f473362ee3319f4addbb3af20d415e79c2dde4f5d47be6925e6354126899d5b22f76aead11bb1428311e7900681ecc9ca2c47e043c4b43c8f01dc6959f1630efd90271fec98c753539a63d9f74ea3476328fbd3462b2dc517020f2cfa4d8ed0e739f3690953650e649eaff0bbe24448b148808e2e2431ec041256f2d344278b2a1a5530eef3925b0044543f1ae7d6b6fab5607bc356c999a0583a23aa7f34260c5cd5dc642157226db4d92cdc02627887962300cc6afcb431fd422748a5c089d627fbd53385bb4bf417c621c8ddef76a0144f871307d3250028f767755fd09ccfa2508323c6c6bfdd95a485a72085988d576e775ed654d45502df49f8556e4741f65b4ffc8d80647055fac041732cc695860738767f89aa78b384369b2ea172724aa49f8581f223f580503a5e7cede801c9a33223a97a8db0626e9724937205abc7b4dc874b23e5b33d2f5ac6e6cfe6194ac9cd2cfc2e66463723d25c2be7e83495126fcb921b90f3b51d8a4057dba8252e01715b22ad1e825b2d510b9f0b0355db46be16ffe30dfd0fa432967718166da0d48676c0ff9bacf6147af996e33e56c2d933333a824519744cb88ef08e1939c6c87446812dc70c2f5eb7edb979827e715235e8ea001f8f0c9c85f1674597d0c867a3930a3d89ea2f956fb1b0d4b51710392bffb76682a6fe1c01868746797bcf397b25063ac88d1e40090b22fcc167c9177f3e4bbb58a773549417f598a88203c565c31b296e3e23e8efc4b7fa8cb7c273986e4b0788da92cda76a5c430b2d8b93c737f1146245661488a418d5004e23d5de576252fa87840ea049625089c38f2b0a4731028cea104c3c72ed95047615c5b9c036a596f6709fe97aafc60c8e391697bc83fcd475491973f8dd437f75c0cc91726f07446f7f09e8c5ecad7bd4afdbd55d8e09222d380195fc91e55b944b71ce36b681ec39d9d307f4c10dbdde19022bf4fb315e5b068e0a47b1867f1bde3dd8d2b31a769da585adcdd5efbcf4a0130347717c7047da483ba1e42bd352a3b7180e0ddacae30ca8411ad15a5f5e6c97c42099f34039ddb68ed1d2de3f80bf67f4b46cc9d05335c32da15c578e63a416d5451b9db77937606ca124a6abef5dd5d58a7af07134485ed82b1fed314c7016a07e9e83bb4e0fce3ed7828cffe5a38a245adc5693d06f01aa7fc2243161f9218c95caab35028d896a3c939623abb90d47ea3d031f6dd0350b67ec0474ea67be0150491f0edbdb185a9800ceff89c8e6a8024300fe54938163a94596e32fe2766779c0e72c221e0374b3703c7cc6f89ead6c965416cde16e1a0e76e1667891cf27d6da09791e81d322548ce780ac70bcc0efdf07511fe283985e27ede60c9c53a7303d8fdc19290fcb45fcd7f48159c84852c6229694bd484661ffc349342c8a504e91803c59413fd64c6714c18eda4aad5ef2accc729b458adea76a793869fb8afa7fe58327efebad3276a7cd1b1ccb56db0caddd02a303cd9fc7ea5c607a2ebefaaec598cb5b9cb7bed097027047d3ad91bb2eb08cfe09786a064cdcf387ab5217c828638dafd95cba1dec47d482e81947a8352d58d3dff1080c97e03bbafbb0197217ccb5102b04ec07ae8391f59402c77bcd3cad4b0ea24182d34f7e39a53ec85698bb8aa819171e34e6a0edc95ed0d7dbfbc5d58e1df1dc100913052c3166ec1cb618559f2bfd164c9c853126ceec4070c9b016c39448a35d401318bc278f4c6c76cb5e1de91f9df8d61aa4336dbcc9e33ee5b912fc0e5c128037ff101020b1ece2bced49dce37ae09e479019c2a93cdc624d05a4dbabd0d6d16701527483e34701d44a4b8bb277abfbf43bff561c60023ece44a1bc87c7523c8b67a7d91faa23dbf9bd4c7ef55a01f609ee0eaf7bfcfed951bc31240a092ec88b7a39c95cce2979148d743e12ec8c956ef16e572fd9773cbfb77a9d9c5d117e4f7f30cba21600e20e03ea5273f5f1e20c8c46d6a1bf166dfe7ba7aea58ca364c0c1b468594b501ecd67d7427e3ddbe5c907beb238758376f850dee08d5f8d85c487eb26e935c3363b0162979d8bf0a58ea900755bc5655e938047b9bc9b77e644180090bb9cff313f18b4d837a8d82a44bc31a67475652eb9520cc39a0b089129bd192b3548ac17c0f5f48db35d3c7cd1867cceea4e2aed510d52869076e98d59be5f81c00173f1a8e14b3f7b70c4a41f50077425185da343fa448904a3c2e2be63f919c58efcc6de22e175f6a917a91461fa208d9ba559776107545f5b3a993ff40f7baab8ee9e4a00ddb78cd2de939a037e5b8a9eab16d48ac66f0a66f9b8c3b8cb30d947f181d4c5678da5b1c06a987cbbab84eb16e244bca7636b8ca84a34f853bfb803af7864b7a980a9106637f515d89be3488fc5af40d2b6ec95ef5479fccfb0b1b3cd8ae220c81700b577029b16fdb00f7ebec8fb5f70f3f44875e07a0c688c2a21f6c03646efdb13689cd171c7547470554af2115ea99fea6ee3f51f7045d98d13d0204872445248f37dae5f6f026e6e94dc4cd988a44438cfe09c506f9022415203b500ebef06081dc1a04d58322672051bdc3b248a69453315dcf5526eecaea6388447fb197fbcad11b023c80a25e26eb0ac20798297796229bdf66209c13cd6179703e8ea43ca6c14e4c908b2f2289842c46ed0b5553c23c5473be4892853ac47f51efb89dc9c22734628605315aa4b7a2a0f714b2bf6409183ac2316aa5bee71a67e7c1fd29896d5de26171517d24e00e8e9a46ba10f7f34783266d6cebc653cb30db3d3ab2892e3b2ac771f7f076b7b06e6b13d40efa9572eb3f4f41cded95123b1e7cef1b3dc45cda3c69ad5b068938aeddfea8fff86a1ae1816961c2a1257fe5462372ba13da234f14dada2370ef17ee5789a17a5ddbbff4a14e55706d7f74cdd6a37e2597da2f18054816c03253de9b8c2745e4a774c2930360854dbf1d9163448f69d4564ee0a36233dbe7c751ed44d06a1ee571dfd35b1c4279b1229a46441449be4ccba2e8afd010a1d0ac53d468c8b494f3295762ab7056cb51145003ceca54f3f56460976bc38101315df42475d9b920745a75e102942fd29420d97a81db539374bd128d85b0e76270589d4dfa87ca7a0f71d5ef0eec3027f0c4b0eafbcba8253142333b7c1cc65e2428c9b175577aea2afbe1dd1f0d0a440d6c51059b1fd511c1704d11cd8b904ca34b041f64cd4d093d75144bb16b10af30a4443afe4c6cf19bd3caa0e871f7c6944bc6b8576db34fdd69f7ab648ad5e200f904fb83d5d23d26e926795b644f447d87ac3cbb9d40367147068cb6e0dc54f4d71dd7da50977cf93d0b0b94d7195ea5ab0f1d0fe06645af98bb501711a69092caf95040213f09992bc2c8335ee87dc30279d9c2eba805dedba0a61371972d514111e573ec3b8b7d51f84fa5403f1a5c4a76e382f387ef858c30ff1a955083c6d61217e3f61f7b1c2c0602793f8fbcb7cf80cabebc887b3a26f6bbbaf1551c59f65457fef35d410c3696610da14cfd8c2e120fd48b2c3173386c7c732a078f812e633643487785a3fe041bf12a19254fd2b5236303d59ab73d0ca1b183fa35d2eab9235f89e0b1a9eee973c21e56fc5949e495f8ab272f7cb151dc14b3afb7d5c7e0bf822c3b4d5475b118df1298cb5f102ae803e593584a11c67c1b1d9a7df022546b79a3e9b15a4ef56bc69b411ab7b1f289f337acbd95eae51213464cf0b8a69ea794857e9611c720fd170d027309abd60c6535d5b7f6b9383ebbb229d8a5a129f471456c64217abe3d2f0c3f6cbb6a3fdfc854a0efc2e93a4272d5c37e3dce80f28e682593ffd637bc9d0d6a504379aa84ab1880cda11755cdb745ac59e76b3e024a624cbe037627ebdf8515c63866a09b6bf607ca07b03551177647044923aba433c8443ad2b7095b74f7c457109dbc74b981a86d7d40334d01ec25f5c9746468e90eaea2f425568bebf9e85b529b48b0e22fe5406833ea42151bbbc6eed9f2b0c8a9ee8ede4d89eda300147b74ebffc0946530bb5f27c4b0af898ac02fc0d12c513e7646f7ac3df1388ebb100e1c2c343ed63d66d8885d196fba259a12b58a3c2110f863e6adcd572b0a5eb17488687c4fd74dbb4ad20dfca421eebd2e447850a6e5c78e11eec26fe90771e84edd3f19560cf4215c9171db0b6578a1e8fa361a510175fe0fcba7ac010a872d03671a9bdfcbc34154430324f3d945c0c9234de9ce18766c46e107abe19820e828d275644bb82d93e8734c7afc01c8c2456c2a5f6c7f6b214dbb4cd02914b1b2259bea033836b5817f8ea83d9283840ee43155dbbacaa6e58ab6f1c94624cc03902ff31913ebdd928001c0fd45b30a1f3c2f4aff477ecc01945090f7a72cd264ef0afae66d3c186fa089012a8434cd6ba392943a81004d0dd134a4dbeab1674e98a99c2ba2abf8514760f355ec7d407cb117ac0df5f3ac72f7cfa7f68f36ed3923a8413962bfffefeb36120fdce0f5eafb3b0cfa14bd6cd94e8e04c7e341f6bd268374901bec81a41284e7a8d424600ed859317f7be1f0996bfc55d0a556f63307a7b0d04cb6400643c9eeb170ac1180df1ea41e8a05ea4bc6a7159133ea7e435d91807a63a19daef56181da10ec8cc985e7ff47dd7dcc68e4face9a2d70e1567edd6deeff330cd6be086b53636a344153418d9bd4cde9595d73eb5be08ee1f511e7d3ae7def0035f41ae5edb6a99a90cda7e97b0e7af3c586aee646fb98d2978d5d4c597e4a3a453e158be9a92f32305ba79d75e9196e16071859fbdd2355c6678a42406eb8fd7cf284e7d7a96fad9893bd041d030daad3352cc0db13b2ce0a271b5023cdcfec55c7e5744845ef3f41fc54d7c0dadc4c75b77885752dcbadcb426cf0542a03696814b3abbbed2299b50c0b6311df19c5760468424a99d29782501bad51f1d8071c7f7c08932dbe3f7a394d40709e3aa87c829871dbc67bfde7b683d1bdb3d237eb5eab156e85f6830a0aa6fa7d86a357d1d8758ea9520c63341c5227f7fe769e7d38cd5cce647016dcf684fb892708761e6c8c0323cb284a2fc7f2fa8120398d1a946f391367cf6d6b9373be340dce65cac53879db703425036fe2d3f9c78f966c07ed54de0e58f95e580fcd0e8969b96f69275d510fd476876aae3eb2630d4ce9f9d41a9ea6914cfdba95a269585ed364cec517f4f87dd1045eb1b55b6127131ce0c004c5ef2ccaf241c1d8e4c93266436c9e5467a884a702a299b25570617b6d632dae04367005a473f0daf17a78d4a3d91f7cf9bead7b2adcc2c020ef40f853e76960aa2aff8fbcc7cf232fda9690de8ad50c5b994ccfb563c9694e5c4a2c78e42fe7482b4fcb83c3a93be078203d8c083b8cedd6e7176aee1a184e35e15a44ffdd8c6eb5d54b91ee0b9fc3b18a3d14c7cf7920e600d483c24157a10abb343080eeda7e6924727fad82c93a35490201400d4bb5452ea9c886bb91d7591c3cd41df05c0793b1e2a5989b42c471e14eea07818eeb72c4e981b1f561619f98c6982d7e8b9af4122e9c15b196f2d5f7563794a8bd540d682647ca9b40c05cc5740545e5d398d8a988dbdb622035ffdfca626e0f518f638ce29336f9ba83ff06c7a3edc2de81dffcb3dd2029991e5e2f1e02fa11e5fe23b790fc9dbd392d14f133ec9b92070668802228aa744c0c5f49c381df4ce510ac5cd3dc5542371c2d094b47b5efe76700e84646c0deb39091d44d77643cc9678bf10dcaf4155ee1b5a3605df318fa544779a2a009d58a4b94433e4c5f5e1d734128b13100c2fb0e3d743597a9b9ba2e9ad8c9ccfbd52a8db51af888f72d5bc44a4860b6f1c7a60222e01d7d605e9186796a2e460d6a0ed792b01eb5e2170ecb25f49eb54d9fda5e147b9a87ad542adc71c24273b510b1c9abc7134b96c7910862a1bdc47ab8228270ab2f3ee756e0910265990e9945bdd47eb468c29babacfc6ec4606d1facf90fc5f36e1bb4b35d54a9b8a44f10958d787a0ca1a3574f9d27c8f1090792eae86682e8b9a68c15fb97d65ff6edb17c9b362c343076500ffc0affac2a3c8afe4b2745ffa457d3db35cb26b003430257818e03dfa7a41c794426815a36645e63cbb27dacb0b8229fa67f195d5be779d2baf0af4379c52317f00aec8fd0278397d4a8a87461300ecfc8140cbc53538e6ab20e7d142941fa78aa189fb169ee9116e06a34eb3867fee8153a9f519c1fc68c0127fbc628b308f7bce0196386321d7d9987c18598b8597518533fb1a89498b312ddb9ee0a90e521b2e1f81a979a7f184a71dcb814b9c4f33bee6c50db6aab7c81a025d04154059326aeaa5b10703c937dc8c5173ed4b7ef1a6cb3c3d6fa4544b81fce316f84e0b88296be89a35bec5bcdfd390779a1b8c51e6e946f1ddc1ca8309d2165e79c1cfe414a833aa2d5f4fda57fa72d57a92e11c2649cc70288881385b8be024c1200f10d2ab6f2b146ece58ec07ded4b43ae5190df1b7037781e2321f2f28aff7f332d20c7c82631573aaff4704bbbd719b011244ebedf2f2355338fcc7d64844c3a0f36a21569b55f74a9710f8f3d8d83b9bcd733f5885c32b3d149a5ad137d016c03b93a4d11aff8218e8eeec6d6d12a41d1441f3df040feb098ca2f003c4c277fc71300cdd2a399a7bb98ae711c4465eedad561169b601fe1d69bc915337436bbb5fe86261112bc9dbd38cf1c7259def75605ba0e0e4beebe3728f46a9d77a7c66cb64ad4418ff96a1ff9b1277d73fe11bf7f8a92bd6713ac171c416eded9031637e4cf57087da8933035f53092353bc4938d43332d44074212c020a07c1ac121b404743cca6e62bfaa782bb6551010666ed9846dd2653206a6df229e09bf7a8f6d8fd9e40bc4b035eb5a95374a97349dadcebea1413d3c604fa3c7b5ec3997a5d10170eb413319ac8f37e221c72ce0c0cce7628bfe4e8ef579b87086a80b911b6ae3d9b10f1bf769e2ba93046f63dd8668ae107c6e2b922cb1a7bd9ed1c7ff36a7b164e3c9f1d214923d285db7be6344fdad39011526fe7c83ec1f5cddd14aae23f4b2e2165742332a4a02ac14af1a82f84f4ca887f31c6b6ce0164f40ca0be85c28343a58aec02c075bb26e2ab87bc6f51edbd14b02848fd93e22f48f04ab5bacb6796b158ac485a60cc8124e5d0f9750966719b2c7cf405550d5db3d33b19eb249f2e2e15dd7c6a2b7b437142f3e6aa7406ef063c545236db2af61cfb9b717f93d214020aa627579f6f75b008180c7659763e3e28d8ebf9efe0036ab19146dee1a84e177f30d08984511fc98069f142825e662a383246b457d78a873d451f70d6cbe653bca2ff68a2c847a3f20b1f74b56470b1b487ecd1dcb8965ae7e0849c39e0e3a008253d5cc07df728a6291e76bb3363bde30263b6462b2ccbf78afdcdd4924ee5ade110cda817363fe3e974ae5c7147350ec835cd5dd756c2b46a13686d862e0af1fd0323203f0dd0f373ab865fc724007d04e97ce9651b2768a94dd6cd678bf61da29bc6f19d82c41cf04b648edc030878dc082db17c84e2596e347fbcdb6e9378f7621ee3d8a001a788dab2af59eb34477819477ec597dccfe24ecb018adec84c25df94bd996c70dc62e2d78be5e56c3101a43218e85efb142d2623661ee37ddf539a8e4987f0f902a7ea3bea29f8987f9f3255478ce1286f7641edb13c859a7baa1c754d4b3385627e7b4694cc2ca17a794a1ad359274c27e52992ab8ecd086652ecb2928c3dfa45101c605077896d67b874e883f9384d85a4657b1cbcc2ade87292abe0f31742f18555f1e7d218e59183382820111c15d1d87d0fcc6e6c724b3297cafe28c843af04ae612284e0f13f031f40724cdb8a53acf9b5824bd43fd5bb8276b6d258e7c6b5b018c736e97ab860b099414f7e96524662d708fb01fdd035db16ce99d01480c1e27f9e8f3c6645c1749b55c50d2018ce40dc2427fb9282c82b140f2737b42350ccfc7138e09f2e4ef1ae76548e0feb6d192c9f77cbe8349af8d7412195aef889f7f806d8dd0bbb31b13b6ba40b4d144a772f409278e62dd6cdc72c32f2ea4795eadc26183c94348f3ca8fd5e8bc1da8fe14dd1210a73b7a22f4c97005750589c2d0e99a00421e093185ff42a17538761e0ee18cb8a791826a8ce4c33cbc872c549f827173d990862cfc618afb6eb62eafb7adf39ffdf998cbfb51174573ade38c5009826f0e6f427e94730967071b252ba59ec12718d82f9fd69af6b028ee51e2990b37424efec08ec4906864dcdc0c1a5f307ffe96a1b97e852eebfd4accd9ffe0f41aae19c382d6234602856e8d45e45b0faa86d60ab8e0ad99518d57cdee2cbe50a6f2fd51fbfd26f072492a8355121f98cb408567c06eb646e200ee762101879d66c1782eae6c564c3210af62dc3c13484ccbf35d426115d3f7c86d39f506e356d48a08be2c9c27a5bc7c4bb02dcaecbab979ce3fc16062ad1d7452adecb538097acd3d84c91511999c0caddfdc36f24c9bea6493c MD = 661b576d9751845a0dbcb2bfca1d1cc2b556e22a0d671e35dbc349eb51baee0ded828f5288a01d700509fca206e4a39815dd85af1b7d706da78abb8e99701129 Len = 92896 Msg = cc5a4209a6a60dcf12621e17150b4576b918732e0ee8d9ba6ff94ea6065af1a4936310dd68a34985b81aefb212a8b06e29c6740ad67487b66072fb4ffab348788d0f36ecb838fd1316efaad3bf78c4a8114b30f7b00c529fcbbd75d2a1336d2344c67adf9d4d70a1b14a15212261cb4df90f6f9ba298809d384184d604c0a7cc40f1a65e20caeb581391fa45464c0b84697af89eb7005ad73066ef032943409b07f680104897b65fc32e1fe63022cd76eaf495a9f42c28763a9480021aa57eb9233fd19e1d9d19df49874cadeac9594a03e50c64630532a1df33fd7bdfccaa4e1c3260afa7c25c002e064b417b2bf7293db526760b71bf81a6ab2f157ea20b817839f7ecefefc6e9f911e34ceb2fef3b1fccab88f459193e1765de79010eeb7bc1bb5cfdfc0da0c33212db7342bc88a73192634127a686ffbac7d24f6ff790647e205889d60232b56170fc6089bc0c96fb70164aab3e4fec183ad23ed147436338cfb33886b8c4e80f930ebbc816c12f06cc8b4a880bbc2eb827a8ee2ee54ca0763235b413159e84c3e3d92b05b2f09bd90f8beac7f414ed22f41a088eb9f344c0b0a6a2850308b006c824594a78e001fca2ded26fe0a150df0bf134faab80779eb1cdade56949945faab9ed9e50db8af8eb4ca988b9a98076d2f41978a33a60999d737b3a2eaa5956f15e8e0a22275e54549d171b6675a56fb3ed6013896b2838dd60b48c3c73277305dce494d60da4984498c62ecf4de65314a2b0d04559f604d75c01e37aec253f4efa984754d5854d23065bccdc786ba95fddb2b9bf4cf384f42f0a48d05c7c413582522884c728fa58af81fa75405df9fb640ed5e08e47409ca076c2260d5301203ab9414e2bb6274d5bdec282ebe4cc50ff6b2c8e6619c03879ed5a6445d30878ec76999b48565c69d21a2bebc227a8c67871c7b21b918d2e801917734d24dda65e31385167312214dbde3d980d4f18c596c9ad35f6d92ee87e9f01396d6d09105991275ad06e00b640d201711483a1b5201be6fd3f162bcc3a2a209fecd71220a43e6d9ccb367fb7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b123089b4b73013a165ab710e91fec2babe0ce4e221f7096067d775d5ac4165ffc2b3c1b7ad60b7d279d8db96e0ea27a67b53d3ca89bd0f65e0c05fd9c9daf25f26e002942adfc4dcf5b2d4197539949e388f19b1c8e0b08e05c92df5550fd0fbd73bd8b4bffbbf3351e01700bf5b7e047e1523325000814b5f487cc2ee3e66485c2dc0a3ed430b7836d700e73fce686bc48c8cb6cfaaf62045c4a8cce60546e71e4c36ec33443e0ded1e2e276710d846a46bb2d9883e83af61d45e7dfce2e73aa60dc7f8128dcb870d1bfb5bd5b14227862931f52a49be3b3bedfa506365cbc58be8e0521b7e38561f5704fefc2e2a80e25b86a4264b0a662c77f8ded9fc591a18740c74aea4090d9c55b78b5ae615e561693d60fcb0fcb2bc08f693c115339b0425c8ea5c8db21ffcae9f8b728788c75bd8a2a62e1a19a373276ff9b95edfeab774922da599c7ffb8b82969c370f7996a20630e2af4c5aaea59c17b0317b26bbaf6f4b90a56cf4f6908f1b0de40f6edf4e70ae383cf955b89f697b26efe6fa077036d16fb531c618627650b1365eb378482e6d0b9091d17baa45f2a3d714c2b845067b2190d53e8888a1fa3135e5908a18aa3504b4fa17224d9843cff0eec6f5b347124b3e3ea46f8a76e434e98c4d3d474acdcbaf1e6fd311ca3754425c4de744615f98c85640f4f15fd5635b3c31b85c78ff0789e320b67c4396d7d547a1b57fbc27ad3503594044c3946692db8524df9b91604b3374f5186b2803b2950888ecc035358d2f397a0b0aeae4965291a8581a4c80fcf5b1b56dabb47de030cb8814d650d6d8c126cbcf9b9f85708a9d6d505ff80ca4112021016904f067fe32dc7e643f381fa1695b16e07bf2276af19b4fd15daf4b6e095e5f0ede0250e984adb2d4cb046ab74a516b4046d3c3d9d559dbd8420ffaf6b4970c030b5ba2d80b22398cbce2bfeb10d55323c7cf4dc190cf7edc71d4b99068f291af53a465b20d649af6da792825051158f1c78fcc096b26bf45b0a78e246f9777797d85a161d39a5d78ec72ac4d6f2a01130ebb4899ae86267cc830839b0faf46cb53a55fcca5ed0b7cbc74534b974bd6ef64fac959a1163ce781169fdb9162840c9bada7dbca852b6910282607c59a60ee91f458318bff88efa201eacd3dd7bba31e447f768c8945a7b1362c69413f26785c52fc09b66893fcf59b6d595a3772faa413f1853122e29e67456e5a5263b1f68ebcbec9687ae37740892f6832a93278f5c204f0027789b6f9fdf2c0412e87ceefd9a459ea5d02c64c7638e00b568285d8f8c09f47b1c2573108c28557c7326a4752b9a184387853e10891ab2e66ea89165d2e7b48f715e9d50be68fd9573a305ece02897d33cb85c6e741afe300f2ec779a556a4c720bd4aeb164c81205258afcf689fa1f7885c3c5bc50d6714c2317c3573e559d492b80849f461649fa7ddfe87255dab02c2d77a42fc70622730470c23bef2581a5fd551f809463c55dc997ebe96e13797a4c082ce7ad293c9d1e603cef72c041ae0abc46fa5496cf57921acd04dd8bc28869de258d0a2608f1f750f81bcf10258bd91bc3b59097af105fcf566aa92cd37e0c6157c8e7e5ce9819a6bf660cfc7465f3db5c5a4f4eadafb8204dc3dadcf385bef98a414b4ed6ba0ccc5978336b7863de65da919aa3115d25747cb979856bc5050e85a03e49677d56288efa4b4777ae24200401787e22412f34a9f28c0e84656c08118cc8beca0c812426945d77ba6d4c73a453f1c729845dc69d161e5f838d784ff6adf295488d1526e8ed70e389c9dfc8802f0d666e4d389320ce3460b367b34bfcacc3b6272998989dae8c732cea6486623bd54339c54703fac2d8f95b18a464ea314409af0794e10d7eb90feaf7631410225046d213127ff2991112c2cbd3038ae37b772a5090690006009f0c1965dc528a86588061216dd1fbe89331a6c98ea26b72e6de2b15983eee680bda77f145f21c805f8dd4fd365f926364f0d10d6ffb70313f14c1aad68eddfa3b9c3a8fb7b67f45443f962d4364038d6d4775270c5d9bbe6b1439d78bba7bbd179a89c79a685bddf0dfcf39fba8f96b977ebaa0cf9094235126bc241f8871b9881c8d2257ce5a514ab4a6aac5f21a07c8dcc7ff1f5b0268d892721afac167f674696d2754b122a8390844060b0c0e68e9aac5cc63878e93ea9f8240842d047dc5ca525ffad85beaa721d1d834bc7e96e331db9005dcdfae6e97151e2693f15561876450b10dae207b4874a5a8cb129a9cb632d16c229ec04bc0523d46bcd68632e8ca84e216c2519dc555f7ce01717bfe84f11a002172d26b6362244e7159191e34ad83f3bc4185f4e09d5510254441f0e241f029a104ebb5c76c5ba47825150fb534d34ec7d0c46ae17448d50132f459174add4f69fb131136996bb299e082ecb188fe59ff1917e60f0157865be49d236c3368da42005267f611dbde9e33689d71d08c7e2cc48551b46d0a89fc01443529251a32f4bbb19f50fb33924dc5d0093d3503241579179116dfe947ac32ef77964779bf47d337a28c7ffc35703fc11a5ddfedb283dfd48f7d807d28321fa8d1fac20fea03f1ed56f2c7bd2fcd4844b718f5d1923e9ec43333784d95586f762b9fbd6419efbcd9a4caf8fee72d8960c8b7a0382b0e5fef667feee1f4e4cb626dcb61feb5d4dd05745b3d48c757a91d368207a9e5bbca5e0ea80ac2ae9fda727fc7d667277afb79afeebc2136155183e7c153ac280c861814f7f6772c5145b049db4327d6a9bf3c3bcb9d149c2d299bc4bcabc95cca3c2561b4d788d5c2b324b44ed0c42929d055023a09a66268d86cb5bb3889e9bd938edc27d87e10b9cdd5a66aa7c88ac1d8cfeb832861ee8e07fea305217338ad345a6c971ee047003bcb0875edbb603b7cafdded21cca9675d5a74e38f10af62c691fb4ed436e15da40ec3b8cd23125d66ffc2c11d6ffbba8387129daae6b7a3f23c709220094699b0a7bd7b6d8a0af03ec7814843d34d51208d637b997fb93a6061b2ac2adfdd7c089de006f577afbbab0d02c7bc7f05f2dd7551c485631bedb70babe41b4310cd54f813a08e73698856db2d89affb8d666246c3c2951847859f3f42811bba46563bc03d926005a01de738ead545d04b755608a0bbf228a3cac2075fcd51cee8dd66fe482592b5bc43052d21f2a585a9e662c4d2f8c31b9983c56aea0ee6065c2b7dba1b9e4c0b25c258c0ba29f9a20d832d8140c131778f7a5371cc8d02ea0b0827fa9e48b890446289fb9dc266b0e1126047d25e64c6ef751222eb92cb035d3b0cc8b96afbcb7feb40e6b20516368c5ca21e7016838f203daa8730646cd8bb8ed52b544b40443f242488e23931bc76299c0f0232b75b8a9ac4a8834d0bf28bc72a2c5734ad84edd6dee913a8deca0741f52170fa27b19553088bcd93d1d736afb2d1aa6d6a12efc916112e9846e9a76b565da2b6fc19a9321d3af47fe511250e1624363ea076afc573091c5291a0be7167c981ae5d1b2efdacbde2596f28bfacfe2de1ef773993929dd8c31ee678b419cf70f32a73408c7d5c1a7d6999a26b5010f394c716e205f73d860d436df8f12c3757e171650f2b7ad65baff6890993c4f77e380fa6f96cbefb1ce10b50a8dd71468834cc5c1174bcc1885f4a67e49ece59d6b3104e0730ad7ea126bcb410e1b2a50ad28380cccd0ac6a775ab5cbcf437df04ef0f3793b88d6f1dc69fc3b963b5fbe5a5def8ca9f2d8dc2d8629018fdc6300fd25788256e257598a8fca52acd43f1219424ed9353eebde072b72a802045f5ff462f6a45b93f391bb41b82eb85242fc7869f86ad4f13fe0a2af1527cc87ad5dc32de057c01a162add2438185f5205cdf6595eca2fd64fa47e85a32955a2f79af7dad8051af149957eabeca7f83ff206f184f46fac4ab569f9438ef523f2a888011e4044d29608620e4d28661998825818715bd3b0baebd1a17d4b43cdf34ab55d5cbb8f6d84dd010a8c8ddb49e84101c9a2f79ef3c36d5c15776a7d9a2148a38b1a9c5d724a3202f1fe8f6fefabc8c4939e4a19dbe0b469b3d66f0b4f194cc308dc8527576291d862f79faca14f53f0f4c7d5ecef9f5b9b0b1ebb852327a1945516e885a34a8701cc1c5109d56fad176bb42d70955bcd6099c4e273dcf8f1b80e6e48f0dc8e9c0f9be1261012792eb866e7b35d63a2744ade4d864fc2e9b77e832728e1698b1b6260ca9157def8435484d709fbd1000aca473ce9817b966d8861e5fadfe0ecbfaaa95d2539a179956c341693e473f0db5f72f7bea16d6b7e46092f5164b90fe338d3fd443de0599f7ff30ad39fb2f1708ad02268382ef574381777aee88881109d8f4f90ed3224cbf050485b96248e54cced3168ae36b0f9eeeb337603a5dcd26929b87dc01d67957dca339e602f3412a63899428bfb2a59db0307491eb77fa2fc31cc7d4ef8aea668cf711e76696f14a730ee885a02ce1e7d0d479ac223e60cf735f011f25a465951ee654e5139bbe5306495ac80d418d2556898dd7681ac6acab4b7de42b8eb38c995a4c07936870ee2422321a8f596ffe4836f93a4473f56e72ca824c8aae9cf2053a3f766c67cfc2d681b7a2addc511bb0c306ff3eb1b6bed1c4597fc96ee76f6b6e765929fea278234e3289ef32f9239517f94bde3ccf44cf1f4ba470355eadd2dd39d94f97b3b71471ebf6ddc32fbf001c1d49ad7c08a774c49ee4076ac7514271d01e6899c828b0d32a1200f7bd97f8b9b91e32da2b8fc89b9a661777eb06c311824ffc6caa72ff5a3704df376a5285d614f5f5bcfea6d48c895327c392725ea598959178213e09ef59f502e9fd99af5c77f47f8b4b919f80b1d2c0b6833d1a165a17b124f534d77bda0df2773f137f312a4357b0d8fb315d5c0c69b88810004a10fee3daedfb70e400733647f869fc3e750b05916d8a930dd028aa316793162a0271b002d23cdc14145056c3ef422f6ba0741298d4e6cc76554f0b89e96d669e78999e026c9e24f15dcbdb51ee471ea1f2a5052cd4b8e48235a91528d646f88fb99d374383ca4f65250d4c5bbb20d3c6b4c766b434a8e418b65d4f77f6c8d2e30ea6032ddf676557b23e31481f7456c32f01be9abd5dd31f229442dc1199fe84bfdc8929471e6fae4e841380e2ebad81a87c94453780b981bf7574c0ee6184581466519d859773543f0a786bcc2ee2e76a5f701d6ab89f25d6296f8c56c96a49546de3f25f797c30cdf6eb71a5e5fddcbcd3da8a1dae8cf3aed7bba61178ba3ec918c8919e6d8f2a4271f1fa34b8044ae5005bf41a0a88d391a8de78e7187c1eb99087e00a1ab62ae4a2146e424d01182e0d7ac327739badc5c46268a04eb6d36dfca8496a29f818fdb2db35974ffb2edf23c05f0d91ce699352cfe003c472442d85b33387415edcd3c8ceb7fb64fb744069b431930d28ef437aab47d922b759415331062a0bee5fae0d765c363408d29808de9f838fb1271d668005ea0f8efaf08daa29192eb287d8a95a8d0f682a303127c612a4be72fa693bd582fe34fd0f835ca4061d53b23d98c303b050a8697651eff5f3bd43724e6e243325dd390f8042e7a904fd22f56a3583f72fbf9bce8c4188f2a897c5ba0d754721584ec5c9357557408b834283f4f812c07025ea605a4919459bfaed501dc6cc27831b80351764d3f203755c64c52998e6dd493d28c8b0ca7732ad633e68a9dccd0c0a145a0c578445d49c17a1c3103cefdcf53a2cbfc0c50fd77ace8cd4669f9c5ce42640fd9591c367c01c40d8f42765d7ef8c7625bf2f95f127d7404b443c1bdb7061f0d36723f422a9124ceb1f81cf3500d90ee4f63391e87d2564b48cdbd3f1786a717415625f6e1ea2cae3d771b65ef0cafae2adf68c234461fff687a64a07c2eccbcae7758cb4e874c4aa651fa1ba870644092ca30e0c44321afb7ac30a83188d07bc2485035acf2f412711b418b18d36f43fba609d0a4441bcaab05a9bcf40f52c3116b94dca9b7c4a422258a3abc901106ea055c3850e35edeb7094835102cd4213033af16a1402e6e3e232cb100410a27d27ac07e568b7b5a601984c7328bd5249342f77a4026a1df2976b1748060ab154948af1931b6f1dc3ac8f7d9c786c62bbf1c168df2c5bf7578a2a10bb979846db32190af5ef042c2bb9a19f33bc837d5182184a825b7e7dfa03983cd17f6268fa4881d974ab1febc470f539a2baa9a8f32e5ba8f7577bb6c449dd25f3850f1f991deae7791967607718b4d3503b87ed893eb307a5e8f9ab9ba6205387734773a0fa7bba6aff85952dfb05f6a506c553fbfa47f1f4d6a0626960894df70fb46df7275cdcb0262092cc5f112809e50ae231aa40ed4ce819e514c0429ba922fc1486ecb6d5b456e15d3d8d00f4e49efea31396c58415e70c3c850e70c50773c7713691b12bdd566f0069cdf9df9efa4a9d8a06ff3cb79c206da5923e5377ccbe8aed5d746892f07483376724739fc196d97c4115a09accfe825b94d2ce63f38869949928133dea95ec8ea2aa3750bb895dd390303527424e828e5b54be32b1ce16148ef4b5450d7c4558c7b3b317afcc33753b7885c4c5b7762830eda94cce3897538101d51221d1967c1e66705d6707634c8a1417da1ce165105bc41919126df63bbd76fb0cee3be5e2efecf58ba9e1f33ec42d73d21075572e2403950145163bb3897cb09b3b633c72826dca073e02ed3533ea2212691b556ad2cfa66c2eda6ca22c3b7a27d2f1a2141e10783bee1358181d74ab04ef7a65acaf53d2c2966293f2efdae418798c20b00dfd868d80bc3dcfcbf2960f693b92dc01b4a46b4556b78a1a8273d6f9dcbc2e955d7c67bea4a341858d6c9aa105e1e2111da1cf035de152f55ab1c91a8a8076ff58e3306e749258936db30f5d815ca627b45356981f1832c78b2559a33e74709315425059d313fb3cb9f6d566570a118ba14169cb456412da3c57ef5e9f9f0598bd212f476a2c12c99aba54842ef309840df36e6577cdda7496d0f11156091b5877083500e1e786823789f47eae20775b20f2cf2f5c5c72dec117c9850bba9b196c80ca4bdf4c3dafb9ea1d1e8098445901c5f2ee9d18c260e4b4dd8265bb6e24c31056f10c6220984766372a4c6356c3d9f4416de10ab341273097d00c137ac1a54141bb113117850a84aa6bb98a97e4cf082273d1382bcbb3125e36a9caa9373a9af36e96c10bbd29ccdea97014ee030c88ffc715ac1344b0e2997de4e9e2d0a9a3d4d5421be289cdc63cac19094267b7fc3f32546e54f54629b26d64760cd21be44db7be4686311efb2a3b5b727d59f9ec4a7c3684d4269b6d10ced27c1186b7e6c4dbb14addfd43f21120de568621fae1886d65f87d1fda391b68d500d834a630a20ac430d13465335a214bbd4507e16361cc86d2362729123b03160c49240f4a500c9fff4920ab476b074aafa253d7f83d634418e687b082d8663ca74c9d1bbd34a9e9bf2c073eb5ae998235854c032a84f844d4778899105a5af0dac9e9f210b8a94b786432450589a19c56d63b8e809e54310dd070094529a7daaca84ebbcb43d36c33d8e9e9c066e53f1b7d689f82f33fb1ccd9872aa7ad15a125d1159f773cf0f5f87074526dac2f148a621b5fb9eb816c187a1724c04f6bee4d2d85c59b0dc88dcd141aa794c345c3ae6e9cf5acefe10cf99b661f187573682da2e855bf1d23ddbcac2411bd13eff38c87328ae46528367724bd423589f3b8cc1984796bd4c98ccc20dab77104f74c2e962746e7b71e949bfd64b5a1f1b485327ba357289a8243055884c237fe24789b84c1503f4b8bce6c0fa3a1e4177e7868ae8b177dd715aa703d6a5998693d1cdb3749d1738b378cf240c22e84611939759c84e2f3f34b6814b5d4a51bad0be3f79906f00cdeea75367908830b394c6f612bd8e01156ec26faa909cd48325672f69142d691ab6b313fa3bfc90106e0c23545cd385f69c08b280252faa760e574e00643aa8a5c836916a42d27ec2f9edcf8d1ad1365928e40a8a6f754c1a0828fbde253958058fac5c1669ac6561e4b62b2b7be98ac3a20ec827f40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488 MD = 115f8631397ca4c7e373734bb7173658c109e88a9c236d29399005aa3a6cae0ea5552690c8ff8e0c27a19a6a435f801798c05b0b4b1a6583abcb4348773c43f4 Len = 93688 Msg = 4538be7ef6502e3fba34393bb2c84119779aac77c4c539e66f1594369e6b28f5376334329835218689d913566e6fbe52c2dd7b41c0ba9a01636bfac9918bd8b29391e576c9ac9b779cf2d003b3ba8cd66a4618e080a657490fd859b3c2342ebf4208f8d2f17f4419dbc79bcaea7253ad591dabdc6a5018c75ca6d97a972ed1232b1096ce7874c6742e9f9a34795fbde075aa5ebbe8828481301ba1a87a406be635f3e7f3c754c6907ec4f5c8c9497076a8345707610243817581dac4d234a1114af712c844e6ef76b17cd50e42f81477d805be473d99fecf111eab5707d01daa516640d658f4e62db110628f4c3452ecef63bc04e30f5d71ee3b3de881dd87bc318698a36b4456bd64c8c3d250c4d2dcd49779c5bd2c0771f21fb8ffa722864cd4a043b9e6a0e52fb4eb2160b4713b4f6fe91c1232b8a5d607144325e369c36421fb68a02fce3b8a88c3a3bfe203354da8a0cd73aa7adea9146006e09c78e60b00e130deb09601d6c796727940426adf6706b6718d3b5bf1004c2abb3b18964a5998c3fdd0c2df1b5badb51638f57f0c9461fc9344c3c3b6b520d73b26117b2814694885f6187c622b50951c31e61fdd17faca6235dabf011a2434eac62b3ead1a9ce7fc8c6281b21fc63a1593dbf058d8194665c948f7d917a06a4f832e87e15179caecf96695141f59cb88c59d9a87c006982468d4124694dba0f2c6e1fdcda24816dca5ed618f134f70fe31f4c672b508e9277b48b950791eff5cf50d4978f550f655f8be8d2be3f153fe3ea71c20a06861f7686a9300aeb1af147a7a13ea33da90de5aa3c0f078879910548043996a6f271b9903495d1cdcd7a2bbf0022c422e0cff3362a2e7b8596dbcdb45e4e5f962641b74da826fa9e7a08f2237be450c949340ebc4dc178caef58b3bbfa60d378c3f8063b9e73f3e1931621516f03d78544d2aea911689dcd05904ddb632180b34e1d0cd661fd4c4bbb3a3fe57401d6db561449891f7439105c2b027f22f0e5ca171961aaad33721154ddb44c055ecd500f7165e8b284f91965815823a46f7141c1857b14dab6e3f6f28914f1ad8b2977e3929a24951b5c6cb42bd57571fdc1aedfe9dfc174e8304116b4d872c70779b744d04cd91197b17eba9300c1261c4565c4aef62d0657d5a423f9754c0c644c92d5b30482c28ab6b40b4f40b31b4b8b0b125d64b3f9765284cccf81e9c812009f08c337ae2274cac108c93ba7cc2bf1033b6d91f2d8d42567539f74d894a1443040797ca7abe67c1a4589583bd30e15e2b26804762ef1ccb06af1d494fc9275fb2f5e3a2be940392444180cdbaa92682e19c5329a664fc714655f07ab6a56145427ea06974522807376fdeff3cd397649d41db2ec194e92f7f54fa498687caddfcc95586659fde08c70936830b563beda73c9fbe7a28ebedf7d3c31c86166b1027ff8a6359242e7d3a3711c0efdb1b0346b627429ac80a93f8fbd15c7ffb4bc40d47c86718891f4ed923f61eb00a3d8fc4d7fc20ea1b4f0ac8f3ae723add72e2f4ca95fa6975ba63ecf26d05158aab7a67c6a5c22fcac138afe4e2c47c65e95325b07c84159006a4bbcffedde8046daa78acaa8e347c6806f7f6f3bc103bb7fde820026de5830bfa8de0320eef1f89093eb094eec0da4d5ce6506bc1bd06e4ca8542b11e9ef6d14bac4d9000f384097e03fbea499a8c7723c61bd23a4a6e79a1433f10fd0b9061815e3fa11cbbdaf4f00db434078b39ee41dd7eae91801d7d696b3fa773f3fac282ecdeebc811ca5349a604fb8f5b89bba074a2892d27b8f80c4569ffe91ddcfc389e51f86dbbfc2d701413c54bd226e526d2afea7607eaf37119e69fc552dc1889bbc1507482178a4d9f081da2b7b574bd41cc5ad4e75874802fde0f705aa51d5f8d5579432ec473c8910c88fcd4e1714c072160af90ad8621ce78d853fddd13a15a36fd4487aaeec9304690c1ef4fe3bb6dd7846fcb8f2e3c40dc81d5032d02376b8b64de54720638c6dfbc5ad1aad2f2bb164e7c5ea776b9cb33925d333cf308087d34785fc3c0fd99fe942d429847d83905473f119c6580b8a5945556b3edfe7834f77c6e462600f1cca1a30ac148572fcdf61eae16037a4f590e243439f90005d734514aa23f2a18716a25f0cfe056e495e382fbbf598dd778883295771ef7f58e745fbb80136155147819bd6714bea18697d4c23c6ea29a298ae7411464c991833e0e8988ab8eefdd51e83933ee75aec8997ac9384ba2de959dabffb9d35f21db1ac67b610e9a2ff57ffb2cdb7564538271ded959f673ece348e6990e74a1edc190ef5ab4446b5d848ab95e07b173d8dda866b94779ff0c3c1400d5ba4e773c5b29f1ee2856ebc1b1f889975eab8b8400c57c33abdc2c85c888617c6669ca58d16c34ff664b00a2a553d59e886a92a01350870d2d25e4a1ae2c7156b9ce80874ce22155152b944a8822043c2ef6727440d2ef10745e0ea61788992a5c848312f4111eb7deff8eff81ee7e39f8581148add21b04298e92dd2a253fc2f693b941f08394ef69ced60ab83eaa5d8d97596482d875b1f3be588e108acde430040c5b69c0ecc35da054b3569af26f96bb300fe86c64de7bf54701f03fa959b2de63aa864e8cfc637df041838abd39bacd809307175055693b497df3cd3de82329a57470b7de62226e92fe66977481a2d430360660a1dc6498454c41bbef5b2ceebc024e8348bc437a223028487d10f5d828410dd0c03c141524b40191297974348f9c493834d46daa8820f02641ae5ce250fc46ed133d22b9ccfe5cd85209a4030689896009704905ac16e7b828227ff890aed74203a6368d26717917d1d46363091335822f597e93765935869b360525d0a0e854f941f7971a5781d610a25a5d808075270e57b55ccf33011800b0976ef81ba2ad5bd40ee191f69b9d763a30f8531973d60e3196699dea73f7c059dcddf0652cd4922822737198f0f56b668e3d6b26541797b1c8c1cac7b5aa44f97d79a0c6af510705dc53a483a76557ec1c32aeef4372119df46c3c12ecb9f358214af08853ad2132e48b10ffe976a39581e105bb6670e4bec173dd1343ad343d7159c9f23f6f4779e1239f56deaeb529665258d4e59878dcd8dd9312e00c717214ad114b9c1fe3a07c2138cead98f670728c9080e97335bfe0b24856eb6111bdb34eb2dc91455c705c8fc2b17fb9ce324e9793089a87842e82fae3288d317ce7f64592ed476a1ab1297427457b9ba636a17b4bb41f5fcbf266be4cd0ed0619b884999bc5e615852b8dd94ed3cac5e44514409fcba18073d333066b96356752f70652b3ae95cf05a52ec51fa293bff2274fef76974774e59992d828c18add8e6e2379c4ee7c1f02e9b44082fcff1236a4f990ba5e3ac2880c2a3e6b9b16ef36e38415b5cec48de4bdc8535f2736451a83ba295269a1f2c3f4a43f1c6a0125b01fd12e6e9695a113ea12049e6c5fe0048e3cc42600a58c0018a7e32377730765eab1cdd78e16e4f738395d2713a26b5e8b24681e6a6e19a641dc33680a931ebd0bccf8d8fe70ddf86ee666e264286f8f431d1e22f123211d37ea36d36b89f1214ccbba592dca157f56c026b8a71974ff7ecded1adbec2accc27bf54de17e08f773561842644d12f2b670a58f239d001604dcddee71f2be1daa3476bcb59aeca849141c7beb215ebb579deb5121da9d3c9cf3f686fb5d6477b6bfc30a3004249d96aecdec0a6d814001f001e4e9fbd2d910ba41cac155a542b0c4e41d97e5383d22cb337e095901eb7b10ee32c326275526d8c5a30a0107e75eeadfdf3564b1efb41457172f0f68238fa7ba21f7842518a7f68af7208914cc88dabe3651aa161d163140a0c5b43d4f035a6e9bcc3c538a5abb99b04916545af83c890c32deef2e0ec9f602137309d9a0d310878b763a1409d0f9b4ced04ef975b746482129c58a65848223617253282ebaabcc7d5c601c7adcb2edf7de8a12c6f3ffd266b31e99e30cebedf7d9a3a475b64454e7134f0c7688cd410b68900bb499bb9249a385c24f0639471cd181b53c70e50614c68f4ac57c519a5498e94e0751837012217f70721d75181a8276c34d9095ca4b9ba6402f5f46df18941c4187c25e540857960815f7a64a371309366ebd5d88d3ba1e547cd9b5f8a084b14efb955426746b51f3fe3cd4c4bcacc376689f4328f54c7ff07394a5cc349130dc2d716dce9e853899f695076ef1772beb03df5293f9794f7bde351e451be32252e3ffb234ceced462c4aa48301d99c9fe06258faf2768185d8367284a9fa10f1ae6e72a404c6dacb732229ef2893d25153b180465c64261fd2ad0ccc406f37d9bfed0dddb5f8b49fe06a5129c7e89c89a6861b89e202eb3c59d1811999902f63df262d4eb515031a109ddab1642a539f356a8b3407b55951ca3e800b2a0f601688c46165968e3ee06036f71481dba008acd94fe3420df8f6a03e89ff763f727849224ab0eed6d0897bc066c1b59f0a6c595cda06357f3291886bff850292beef9cda39cf1271505bafb48a5753d6eb20e75fca1b468b9ec8cf41513a63cbde130056cf0e960046fd98add2340105daccc36c90a0e9a5a5f2f1594f6dfe2d3858f0227afe0de61cd5b2f6eee621be41c66a0dbe25b36fe0b69b0e2abe56496647f8b7be2bdeb55a8a8b3a30fc5a62c8b467bdb318284cc76a38fa73a9e0a2d05696a109068cd088728dd238d4ff85d81d38f70ff6bcced2a43788ca9f41bc0f0b3658fc1c8cca1f243779770ea5b9e8475a44355fe5689afb3343802cee179aec745a07dc73249716147a6c17d15171e9481fb3a2369c78b598b554d13a27ec60bd1eacd4c45278dea17f987ef6ff1d698ef41b7c24fcf489f448890ada7f7c0e9d316b8404f64cd46ad37ca2ab15434eab6bdd3c34eca6dec297bd583380d25c811cb47899627baddd10992152367c1f09e16960eafe083a700d6237d9ce77b0f55b281106399da174d17e8980d5304136ff5088bba38113a924083831daf4d2865736ebdfde1b85de808d39bb63f86bbf0013223b6fb9f0ca762fb7d018a207a09b51679ae29d91569855c066754cd51eae31bbced50b68507e4965391a27e6d0b20822abc96c7a999358ac168ba633b2542cb3fa560dd0d796d59ee151fee69325db9b97052097f40c165b50198d0e369c74b9527529c0cc6a54e34d529f9d64514c30f1285270126d0f5c87a169aaf7e1aa2a4bb4f7beab6367c0e18e6251c0deca912ea56a995120b43e31a5e4b092be2d856a87f030f11c5eb642881fda3528e72ac3fee18a5cd1956ef2a956a5839c7f6923809bbe49ffda41f4b2006d4dba226c45b75fc9820a436d2f2e680047173033fb1162bcf2883ae25caecca1572cfce428412dbd6d051ec76ba771475988b07475ccddc3973021160ed0cd0cfddbd700d03ed3fc7a8ca7fc1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5df1e13d157685f7308b5882c083b6daa358fcf8c0e5eca28d555387d5dce88bb8a57860f30b4056610b9b74c2f9ddc7bc737efa1f947b276d69f9ed9aa92bc310a0778bf66dd46bb26d77d8acf7aef3554a0c1969c3c6b571545d598b317d0e6dcc26e8a80409dd2a9935d607e4f20779c5ed7c25dc96f59ffcc7f431dca614d810cc9c9038a754d1781c985a2871aa2dcc6b4ddb46b38f014a7ee613136d7e5854b2d23672757ab0f076432d2bf3857b47ccb11369e52a9f26cc56b93c9cf4f68021b023183cf4ceea8902095440406a1e59d256adf46e7f79f76cacc1f91db97d5f5ede94c46d344f9ffb740d1f8202395ad82b7aa705ab29485273084da2a931b405ef4cd58be805fe56f8be5af34c8017eb1b38c7942b20072d967b5f2ace856acddfaa37f6f4f6ee3c1dcdb73c4fdcd731ad4f1cc605447c289e80f95e3161c8dd3514b1575f08b9d56aa3ff051433e4d569276e40437fef681281e1e6d9ae155e79f40d563225a64867a8f9f5a16f84fdd72885adedb8a7187ae5e069ce529a7734b1119a7434fcbe9c446fb5007600d280bb29b309d7ed5e5f14be9019379f51edb386cc2d1d045e92e027ed3932a07beb4621faa1c3096247764302c1436b132c62339366c80651d0e2eb445289ab20a033362bbc66434dbd733767ce6048e67926e298261d49bedeb4816255656beb28e830ee63a7e2474673616949757cf25d675983750417ce45bcb1f049ad26020acfd7ea9d6e30776cde8aae396a505e5f8d61fb5b65b6a88c6445963749258dce4ef2c872a37306b61c7adea6270c530800c2a8e1286f763b1303fb2620b0b5fdcf4b2fea2ff41cac95f9a29893f8f8de2844330e358a5ddb30b5c81e1c0ea11eb9a8c80ef8fbdfd7b1cfa218985c766b6eaf44eb744f87f32521a42824897bb974d23be5e7d07abed9c3852d1d7ff43738ca827ecd061c0b5910384a2167685668912f77e4ba13ea739ff3e00baa9bc8ef5e96d129f643ab34492c8ef9f1927efdac4dcdd802d3e1e9299638482593a8fc3327ec6e68255c1e9627fc956f21b89bed3ceea9f1e12da12a133dbd38035fc511ded586a4eaa57fbdd19bdd293d8daa1aa4e241cd6655056915f7522b1373b4c0639657f2b90fbf87d373b9660c8492fc2fb286de89e27bb0426ff045ed6e30075d37cb9aba2146bcd58c1270b925bb5b8365626e735b6dc542ac7dcfb6d8a0b075bec9e317637d247eefce8d6af88dff4803bcc34b484271beb6e21199376e8152353817f55dca8677a3d706488671af27957b263a32627c5e960853bc1501439da3027c7f9896ac67b013237a56cd35c72289df68a035aec953d6dd47f9c1bdfd110e5ada9b4a5cf71f6c2b28f00a57d2b2cd36fc1a23cfa8f533f6636c16b91b8644fb31ee4c5fcff7c9687cdd91deed4e2f731e2894a6a28509e838f568fd9e0a8ca6aa1a067d964011209ca4c991c2fc97ddf853f0fc60093ff9ed1c1f532fa5cea26da6de7df5022e9cb0cd193af9c6edbdaf229f99898cbd72aa69a3817660f238a31a3e2993460724e1e1eb9f3ab4195b6e1e0945c6136b9b99655d4f1a42e0b074ff8d47191384ff5667a68a2ccd04ff5bcd96c8bfa831bbdf97b387c454815207db33a02e728d7739e7b1c1771994f19eb9afe91b52f71ba7870eef1b9dbb65853998fc7b6a0ad2afe9760cc4a0b278606aba71831aa50417bed751c8257733159e2423a703e359e2f65c35bb6b47dec96721299e0623bc57c3747372f49e02e0943fdc5b450154fa95cb020381396900384ad61521598b901e4f1dc213161b0ea251f03f394a0b1e4f2b3d45ea72622e659f438f702fbbea58ce195f89c9c6c651c228fae6a7c577abe5ac28afd8117a768637b5fd8e938cf85b2ef35e9d4b3027fa4a355500cc2d315f1855d755bd0df469792fcf5c5a9f865d23239a7cf175ae611e978c3e6667690248736ad0af0e67afd2a4ee83594a8b3cc199464d01bd6e5f6ec99547dc4ddc36062b713030a655c00abc63e9d8b68e5fd0fd6af8c32fee5d00727805760911641825f25f86fd4804e92035781e0a173018f60c647ff4b6c19d3b3b5f7bc090f24708f844f93ac7e337786c16756fae16602d367b7d334ef50dcce83c359de24a5b7c88c7d3865bc5bb6b11ad230ddc79724aef2404153f5f18cc8686eac58ed21c2bacd05a088a123ea22a24710b28c114f440475ec20f6986e41e24e3631cf452ba6b47d8e9df3288c5c263a7921b570fd32fcdd161497a1ebbb7fe689d1517c4d4ce149350df8d617bde520dc93ba12a90c79ca61b72f9a9fa59fcc09b00a23b1fdb20d466148b916c88d9ebd913082fd30d9d25171450f0480c06358665ff7f439c51e2520595df41c7e088e928f5e4430bb8957eb6e6b84ed9040d86cc9558e91990073d3a1114a2a44f2d2204ce1389c8d64077e123ccb3c7de91c2becc8eb959c6894f3c69f836250e22ac2efc824d4cdd6c2b1c6ff320df7c0963c20ce85a64d9b1af920353a65505afae2ee8fa36a0b762c1ef32f43d28c6bd9061bd2f7542b3c786c449ed99391d1c508df942eccb4a6a62e2d498b1aaa5f47222472bb1fc3a13fb5ba18eb8db3cb0bcd2962418d580cb367ebda7256dfff8318d13a4b79858dc37de75fdab424bb41785296662c73fcf644a56e9407abe0ff42a87622e21f46c62d52c03197633708c2e19d171a871bc15cf0525abd8c882e3820c2cbf9cf509a3c82e68ab80da2c4056ce2dee80fddb709333250d8f0799281c0bcc121345fc2240e3f408672a305e84b0428057cb749e2049af0fa8619be880ea08ce8dcb8d08c5b36ed8330ac30c4127d7d036c3cfc6fead8c592ac0d24e3713a99b136f037ddd06a0c5ec612f72149bb68524cd3311b3c984921d0b847fc8ec7723ac19a8a8124450759b19baba8574a5482ad1eaa7c9045e62892afaa6bbdf390b60b1c2b2ebd547904819ad091c1a6dc14fb73aafc8c5e47377047ce99952b9fe371f9ac2f0214dbff949508a62f5d6979b676c513676dc6aee835170e9afbda23a4b7801aa912aaab891ea62de6da77316c9c7b79d7e0ff2f78ec364335d0e9f701ea397a08ba5f88cd9c5bc19ebaafcc9c69506844545b1990d18ed00c4749ee27e65ab5a7887517e0927be99d5a5dbbb441c697433454fdce99932d64cb6479654046561c1985f94095990e89561b7f42ca606f4b0d975c8088e5c405d9e419689c9ee3ccca0c7d8c1a35b8e91a6397d6779058c24c7cb66533f92c35ff235ea03fc6e73036734521a4c4711333b095ddcdd8fc4f7d8f8bdb2f3fde9ba7bca98ace50c8fcdb44c09fa9e7bfbe2eace9c721ccc2591d4a5d50ef4c539d601a9aa6bccf1179151b7054bdf20d305793043137de3365a8379b74d88113b1c4c792727f84593b9041e4ef3585d2206b1d959a647fc7fbbad1d6a59f80978f223e318cab22f8cac9629eddc515b6f4c5a6ee612c341891a1938f6188cd777c14f8f843b42d789d2cf7fe9ec1141423f3c9af34139d8dbe0907364748ba0c0f299247362f066129376c94a0de23823471e03861af0e9fe76da76bb543f8fdcebc64bee270404af5755ae18260a689bccca51aa85329d7842bfe8039feec95216a1abfb72c5d8e98632d75c1ed2f83136062d646a451bd3ae0771453fe179aadaf1eda52b7c0b4788d6eb1edf82116eed9b3fbeb1728c962179ba881b60c56d9e7db8f13a71c452c50993645062dad959512ebf4301184a03de6bd41bb2d522cc0eb5e987ec2c90a692773859ba7cfae3efa26f063ae676bbfe2c312721d251cb6c8b94fb356b8b913b3ea1e2d11e59f13f45d7e3651fa2b3a1a3a827f3e483035fe3fa7c93a8cbefca91a8d3f0e97fed07bcfec2c9ea57528f7b400371323edcaf6524f3500cd629081753145f05f33d10b2ed8caf701b008f5a02a3e3e50dbe23b81949b2be36a5bd79ac8e66993d4b22cdaa275fd979256be9f4f0912475118585e16402e673cdb15ebb274dcde67d05b53f7d214cf629e9cf20d0c218003d9b73852e87ae1308ab6f87c85bca753d8013b3753df11c75d2b48e2cc0e935aa2e2b0c8e8b3ca0bd7554185ad9b872f25c8f0ff6faf1726fed4245edd1be9cc005547e6b54b8a256d5b476c30fbf650361d05aeaa2748080041f4df93ebfbee8ea97e4af2b4b9f3a9437aaed4505d7da577f9c387ba1cf10ddf3ae3a4f162288a39c4541581d21d17a86bbbec3b550de0643dec8cea1e688426770974be8510af90aa9092355af834e49b120d0f5567736c52782e29c4d4ef9229cf77c60d1d4b48a18efd41bd2b8da2794fab6ed730daead7f4e01b98dcccacd3a4428a32c509cc39bdbb29910d8e4c96d33bbc72e0837a2ee1471202d697f10506598dce9e4785e39b506f4f44b35d743b528a80fd1994c7dbc7bfab58cde92e842143191fa1202fb651857037995f81f6745ba9fce9c54332e676fae9fb1fc09c3e3caabf93058e7d330e8c7cbcbd4083159256568076219527da69f09bef5bcd04fd0bf499b0708e896cfc7a7a11406fbae11ea07a41d351005c81032ce2608519e6b56521bb8638a91358b76dd6021ad8aa5b414392e915146fc8982a837f52e19c2f77b781302a26b429ca1485f623036094df58f3c35fb896b936116cf8b4f08fe2a2e79bfec196a1d818eaabad06afa663d146ef027f8163cb537de96d39cb34677d3e76529d5d7efc2a7cb1974441de40ad89ef2712e3598786cc936d4fe61c367d08aacc2c0fadfe853722254a6e9aa3ea8e6e91b872ea763689f54965b5c9d818e2a3dbec11a167af969807a79a4e160ee0f7e2bea4890fe93289b229deafb4d758fbf25bf80bb000376d9eea397b0f911e258ab3ecc7cd1562bb07faa540554ee80dbffa475f702d862d6b60e0a4090792420a26d02926517723eb56ce2e51d5fc73955573ff209e0f41edca044b8ad8ea07d195e32fb413fc3ebcdc9dbc031312a802ec026d39c83f65a68438f41d9b71d1817f9a4deed37e75fceab89c116cd725993c774c344292e3160de31039a5f6298a426a064f266a643c0f9320d5699676b8b546fe9883a664cce5973257beb38a6c8cd6db5d733c73fac9b1fcf79ffd05f1e4f616ef01e6452b99c9dd001c467ea8cd654f8240814fa9978982d056676dc54a09079043df1ec2a8ef72bb652b70bf7299d56624c531d8f7ae44f8436228b362f45334d00d4c22819c95f21fdf0b212af90f618664d4f96884d5e7dd69a13cbe4c7c352cdd77bbb245a93ca2ed986e44e7401cec0ca39b78a198279b0a61e1ca860529b0dc0bfeb98f3f03a4b3b3075ef939e0cc19283f96991e2ff2b10512f615608b1295838c15bdc9ef8bede57cd7b33f65bd16cd4650bfda797af9f560ef9f20c1b87678c44565dc48ced8aa4f5d89d30425821d40159a5f8c9a41ad5c1567c876191b5637d71be8a7f4207bef4f019754abe7a2cd73bd0fe1e734a754e623ca00cae09667295461958231c4fd2a9eeedf96c3c84ef9ac8e11d82f7dfbf037980a3452c3c2da83e999ffa93fc97ed66bfdac832834f5cd3c84f3ae8bb1c237d4eaec0e78eb693ee32dd2e326f4ca3c714723b23d2016b3adb3a03e7b06ba98e33b6860004133f9e0a9827c250f9b35a134b2ed6190dad45446846ba66b67df55742ff3f454e93964c5b4d0a46a40467e5ec0714ff790c3b2861692a860487fae1da936efa6f761d1eab08d4fa578036b1dd30a52c4f6f66b2abd6ffb85eafe4fa06aa53ca7cd27da812c0e614190e0ea0a70f514997bd0c07d0f301a3cbddfdc94facb85e7f8efc1317dd093bf39639dad10ee0fe57e07652582af8f053f98b773c01635d7f92e38743c70517eb01fd86e39319f299bfecb9c9e2ab46feebd72b56111c7085c67a2b1ce6a2510c35a3cc6508c5ce6442b564ad82e34ed59b290e2345ad3f981208282ca3a8915b1b72d5e0d4ac39c1511b7c8b7468b0dff1c9482d03dd71c05ed7a6fb64de7ee29bb4c9dc5f96dcb6d46429ec1f021324d6fe00fcb473af05922dcc0f920dc1a89eafd0df114b5e4eb3d99257eb791fad30115e16c138a0709653c2f296fd02b50aad10735292698ed6c2e05440947d81e94a8b0590f4ed085291b12cd676e812c9f4b41f8a35a28026673a6b861cd5a8e7f1af518b6e3dd6ae2ec143bc401bc6c1cce26c21fab32b890fc92525dace2b144ef180197039e0937419c1af2244d9dc7fc2e07faa4497e804b5098593111156a97a1ca1c08930e7a9e22e16e60b5400547e050c0dfccd2c8c25a00f124662974972ad8d27d4ce941643105b52173e17923b6331ea84d43bf04170291e1427be7700b9446dc2c0800365f1e52f119f08822480540a83b4ff7833033c7e2367b37b4cca2e5afc1095b76f581c44a07fbb6c5ee6df36a2765f6b20e1b1fb1c2a5e9d7f67b3b62ac6b97c8ace685b6de71898141d3834892142133390ee5da778a725c1193b48f4e8d698deda313a1fde074d6cabc9ccdfbd92b6919a5d6c6b5a765a39662ed90080d3549204dfaa5f6d70d48e1af8c84d53369d658765ef11d7b38510d9f431f99598f8cfd4da73d59b3b75a3f22fef7ae91610d5dd6db040f846ee6df7f51885300dccbcd38b5d28705078d3b9d5080f8a1a560926df75a1c417dd794a9a564c581a188288583001f4972545f951dcb33b2ab92ae92207dc430e9a5c5949b2f715a723487baab30730f9c422390d330f062e7f60af9e2e987d146c3dac6bf62e6f9c363735eaafe32b5c9c910270d4caf20ef1d2ffbbb17d7b0f9d44cc69e8986fe199773d7eed3cedaaf6bbdbe2898d07b257a961e15a3444e9739b40a951de1c5e942f1bd032bb7fc91ac84ccb18004e02f90c5d78ef65e08837679095f8a87ffc6f8758464908e8a350dfdd944acacee71e247ce839b858d630d34594a79d9ea171a87b4af9ca301ee02817a3e79490471019459900d3b3b9a804e60d24658336e3ba0c4309a9602411cc8161b7059a0c151241f40c61f91be525fb6a38a936a40de49499424f7f9c2df3a43681c6f61c7637f65f240832e3305c0c12ab11bdd1374f9ab36c61956d7ac4068b0f7eac617bb1ee43127067f9d1d1a26d454422a7a923a6fb4f8aab81416831c627d6c2c16ba8b1099c42a04510ae44e3ceeb6d0daa8740d8b270c7bfc907ad51927642269043c5178b26e3ae35187bdc0dada4ea84a3f1b25ebbf40f5cc700921805337730abb4d7a6c33a1f8739cec0cb33d1287da040f21c14375940d3b4f3802c9e9c940806afb7c2ac7d4f39c5f7d024fbaedea6b6feb2239a85be5151da94928a7c0481410984ca41b1d640e8e9e4292b64efdcd93fe88f247c1e6a5db11ae0ff01c73eef4cd78402a36175c0ffcfea6832f76b341d8800dd24a84562dfdbbd0612276897e07698f63b3b00d49f580eba00407b4c015820ce66a40be7cc9fd2a5976a27c22d29ad2662ab0aac32493e29b61033ab512294fe2b59e375e02ec6e679d9a2f79bba6b98fef8bbd1216821be3cb0bbd877ac07755910f693834f42d19ebc02be92ef7c56f86b3acad37e60807a683c5bd9bf1f3cd9116bc91dccee6def5b6e9f7a928568394cb01faf52a278597fdebde122845a94a46b9f166b71c254fd0f23bb6931d4a8e344591fae90acbf3fc885f59fdfd771111e9ed6f574d8b6ec0dd1bd3d25a42c771fff8958d12695ee233b7ffcd8bc579fab4dc5319eb8fb6e8f32e8d50ce0af51689957190eeec4d51667e602161030973b344ce998690dccbdcca5fb8c8e18ba48b0f0b9ef0a333cca92927942dbe341f5dcd1e309f3d24ec02a5a754db84ff8e7cbbc001b84c96a6643eb29032658e502ccbee89a5f343bc0d1710cf8653b536c7223b63b6470a9130359d902f877cb898c79c0f3b41adde44b5088359ec615ff2d8da2f6b00f3ff9594453e759283bb3a56c33bbfa6b7a551e61b1ab6ad784ca85628df5728d753fcd145d5951537ca89efd099a39115b3bd50a4f03d157eaf2010a3fe0b1d4930ee731c000e9e0d78fff96093a7af3c8bdf5b529e5db2c8da22aee805e76cbe18d3003448528b79490519efd40c4f9080308c908f7913fb60086741817c85aa7e52ff3b09017c0fbd51b7dab57200b653696aeb4e4fa78ac349f05ceb4af692c3d6c67cec8bce45383e59adb259511257e25cbf5521ebfb967fd0a6bdd33e0b9be70c864d62109e6c5385f57522bf391023f8a93ea06fd23c126e9b8395da7968fc27f3b614e18fac19a33e687ea99f1eb6b525553b9183369a40c7a7134a70bdaebf21b1249fad89f967e4f6cdbec8d60328c04353ffa3188ffd97c2cc0c660c4718bcb911c95c888b1a95ba805d2ac8a1a9e683aa1896545bdba85130aeddc77deb11585cfd311a4751ad2e471349891adf14908e6af16c968165cce1905c81bb9cbbf97689bfd1a693a7cc725fb979c73ed6f4716538e3b8754ca04f6f46cd78b43926ef1d4d213157120fa2b0df2d3f3faa2a03a5d13c4a3de975da7a410d4db8056b37168d9b6022888248b54f15fb581a9ba59b4ee8c431b8b8336fbfc3a31ead30df13e5a2cb7c57aee4bb7db6841e84d3f7b4267baef736d1baae3773015e9d025783e9d9cbcb2bfff751dfa15209956d4a8eec577304e07d00c43cbde10e517a20e50e92f9a551f011070948fd9fa8c23e9a052ea8c141f4763023e6da9466e2dbb5c880cd81861992597f2fef475b6d44540543c8d2d7e2bb70a190569749e6e884ac05dfe624f71bb7a5c89f9719e8fc5b71494bb02ec221142a4cdd7d86f0c7c02da47959aaf31da01195871560afb70ebda1b9df931d4789226ee7bd8a8b0a06d1df4242a4a818a147394e48bc3c04ec5eef8bb7b14ebf4e2e990dddd1301fa71d38c3379e807d49bb065d87a9187672d97549df15e0c8d1a33d9865076a895f742364aef516ebf7e19f2d78a3bf8c40c1e57ccc1d7e14c234df4fd979a4c76e8b41bf2f44c5c54a5f66468238bba6c48cb28cf55471238e37f07ca1c4796a72a6f63b2f0a27a9af88fe214ad477667cbe6f02e1376475943103b7645442d2fa7bc35134b1b6f99602b95619038d3be7bb7d672652c27b82b4ab7887c5bbb1645e2b99c6d7fe359c314a5d935267a7842860322b2305a5c8473a4882852e564ee2b19d5bf9680e30b90390402d9129d079a9fc6614b894e34d429feb0f2552289dd7a46a728eb3e1ee8796960184436b23cd1e6dc455c9425b56f737e03b358fe4107788efccf72e6648e90b8acb8492ab4c10b8ae67a383d5e9d6ff94da60c359fe5f2dddbd288494ba001705e15e1594a98bcd3f58c416616dc788997d748153f3f3cfa8d9c8731e7d645f2f4030326467e821f3c39b88726541896abee1388683bdf4fdad677857e59e3a4362cb979ef9ae4d6812aa488d62cd6884f927676630162428a28602d595163f0ee350a3a8e156a608d060d506e8d3ac84c6b77c579ba4d3d64394b10c0e54e3de2c9ff516b169c262876fcc9369ecdbc6a22215eef8e29a731b23f18fa3d2af2db8e9ea7cec6038e192277da768816cd705f792910a47ce8b93a452c51828279a12cf122ff4d26012ab1896b75729e6328c9890e2325d168c47a64340bdcdb39fc4c00ab45d28de821cc37657c85ebe7580958f66f38ad8e1a1aa4197172bf9ab496d12bea7dc1a9c71a8baed3e887bfc9c7eec73d069ac482c10dc1cb6db50490b16f88347749aee4448c2fc2c4fa5543aa546bd5b71f72c617a81561f446df5a46dfac6ce8ad5d40f142d09141ca108e5a91c87f72c5feacc67cfd7a30f893d8fc2a7dd9f87620a2cab67a878681577180adc8835f12d1fd73916260495688d37c59e5c5cd2b5ed476ef13edbca694b5c4b15228a7905380c8f02a5966e527126d74cb7692547e9c9ef5840b0ac22e22cda44db872c7ecff6da03faeaf2fd65f788116356d7aeac3ead1b629995c8d80448ea379e73e05400aa987a74dbbfe80458ab04a86240911018a908f91fc1997d0773bb42f7d040d4614ec8b6811083e7b9680fd06da434d8c28f985192b3a2f1a68fdb0710c532cc9e855a427ba5a61c2ae6e961524004132b4db52596f580fc968d1b7d67458653c2da938b33d5eb1c4d9625cda8ba8b39c351d3f7a53db0086809f0f863c7d8247ecd29034227bf6261f44987e96a36c72b3a794a45c2bcaf9b74f01a8ec2949912cb7f4d1f218f79388fc9328ce5a345b376199fe14b035c915c9d5650cc384c3f540abb2349f7db11d739201b933d2ffc73395b102d2099fa2f5d3e425b5f9844f55ff0070775028e58fe031e19710076e05d2e4aefa0d2267bc434ebe66717d43de36e32e0838a1e839c4dfceefb41b31bf96c0a18e0afb6b046cca603eb356d8c39982f7bafdc42f5a853406a187e21a492a6d62f8c8d1b6b7978192a589b617ec700652f56638c1d86c5713175105308bd612799e0f4d51bb0c9adc03b94506420396c8213ca6a79dc1707db7da2b7b6de1d86feaa71743fa133ec6c00cacb0ab995be0a647b5e78fcca9caebe9fd04d895e6cb4257d6945af495d9444a931a107c7d22ec4f0e8b98d428841a4823d2b238651510e8324dc5f6c69cf83ba14e5af223165c1c589a9f231532abbd44ede5137cd6bb23d5752262fa9842a67f536f4475455c753c1d8bff995d0811085e576e5494abcd6414598058538b55d53139ba9c365524621b46b1dc8c980c192cf29114da48b18a33519809573c0e4af09f9bc071b0ef719cb7800547c3751c5f9cc3e52dfa96edd8f4f2342cbb9a86998831087fd39f12a9c6b63c17f116bc003f4def172943350e29d6025872c13234dec29de728fcec485b9aab828ab59f16c277591f3d810bdad88b9b65c74af6c78897a73115cda8845e737712f61b6da90d894cce9e181746e95a26db24ff795c6ef84de604dced62b78acb4f9e10cfc208cbefaab4d000 MD = c8a7f49e8f5e69ab5c99cccdcdea01c60765714043896cd560afe968ef583ab4cfa6e16b8600e930633ea7c6304c288b4f960937e36490d96459b1be8149b3f1 Len = 94480 Msg = 21bcd76de4058121fa75603ad1cffbb2c901551398fb6fe8edc10f7253bfc09d585e1a32efd4434e1440b613aef6439db9175738a4667ed0f85626a93b68a65014b37fd1b0c4e12a63a9710093494991d2f740ea4a466c595e1ee6268e0fcd7e9be68eb0ec7e629c31d91867466f14745ac698905043426d6540d652145f3e10371dcf386eaace8bc4f833b29011ac309aafe5947f0607f357e57f9594fd00ef2d80cbd1fdef2ee1662d4a4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224ae3171c63a782170532762fdf7983b2d7821b9a6743a873808ddbf6541330021d36cc1d60eeee4ab0db38e0631ec374fceebfdf8233f3eba90216521030f044ab4b624ec1215d995fce019363522cde2122729d3769939ae00e9bd0783f03728b7d7420e2e3425b58975a896eb82276dae9ee43f558ea19cc2fe6f22aa20c1424596c4474a92f3931a3ce62c3b546a780918d745a8689e0c3d2822775ee6c920c7bc529c4e7869b819fb78020edfc18c8b5daaec576d5787d92e7e108889774ba3119317222eafabec7b09204a6c52309c34043d4be6f594feda2df41152f44a435d30bfaefceef4fd843f8cd94345eca4668d3e6a1a9fbc14f2d42bdf8968a50d68d09cdb2a4e1cb2dec250a1acc3480bbceef99d537e86833f1ebedc76fbe56bfa1cb78ffff6aa75503b748ceff4cd39fbcf76cdd7ba7ab489b0b4ee60d391c4dabc17b3c40f26ada352fe8153ff0297eed7bce0f07a200d983515ff911b317fd157c430c2c019c19faef867210c6f8b5cafd3c0e3e601f73353e9f64ff94e06a795c7ec3e320a1b0cf86928a2459d7e0cffc353fb28a4db24b239bbe3956fc0242027d1838c8122b2d75aab1bd013d9c76e94837f65911f31fb0c3695181c150f9decc6d8f7063e59f4d2d8d7d5590255a44f36b6c8512d23d66b4facaadd6d32b71fb2849b22d7c8f6d9971d7df8637e4afc56e9766b6bc1ea5dee72723b305314c77fd09f5c55c88677d034ef77620a08a1ca619a6743d5e0eafb2d99bdc63b5cec14042c3d21214cb56b65545e69c085487a635ace1c255f1a5e2646ec98b238965968694ca19bef9a50f8d436df696af84e3ade275d7b10f6ffa5a24e0c8050ce36437f113efd182f683596862ccd5eba2e2d4ffa709d9b85c6f1d56d8b6c4b9b93df951460116e7b9963c3d6b7b40a950283d5d0bc53a7d09c5406d17e3fd1065882d4de709d9a86cccc82afeae61591b285972fa967dcdd67145e004bc18c166d7564f6d46a4358eab6fc972c2a28b6267bbea29f9fe4b6117a04845cba21d3ba006ce4f64012fad96a5918e64aeb0d47ad71ae06c5646380ce20e517f23b45286a14313de7af738330c0ba7e0c059dfb62d9dd469f07ea9e58dca9e63180759dfd86641026c1cbce4f59045d391f6e2be31eb6c7f67255515f5e5a303e986a02ffe705d9c6f00aa4114d7eeb99e089c07967c1f29150ac832dce7f5ce22c2c40b9629cff90e639ecbcc4b090f3f1f5a06adc872d3a47f51b0855a1d4e5e4c43d731cb2ea4948608e99e523b510f9bab5fea78fe1b7ff3a01391b47ff0f6739e37540ce01bcc18571f0d95ec0b9a1e1e57fed6177d122821d0847f945275e931906f479aeb0f7b27f09c8e91bb491711a33d986555055d657bc01400ef770dbc66f603a59ec92ee9f2bd94d2cc970723b649085e5fc423d979f73a2c2454618d4f9ae9968393b42b9a034115dc2e7ed30583de68e9d91bfc5f7c2a9c9da87522ae9031e445f9ab4b6ae02bd15669de8e1570632b7faea64c90d19dd8c7edc91b08a8a525526564f7c9e6bdabb7c3b6e36ab13f0cadcf3358b299ec571f8edde4e2368bc03561718f4b896efb9cd6884179b8da82e0b5739f39379e9e1126140ecfbc8e5b7b687190643ac847621cd346c6e9ce34b4fbc78ea92d3d14592e1c0725bd053d70f4c599b89d4215a3f11851d6d67278970cbfb566fd40603411465c88ba890cd290ee099d0374fcdf1dd8012e017ff50352bc92173a30f85e7a337d7d37924ffcc76b7ea61fc9537fdd92b330fd3f0086784ea31e36974314c353e857b6b95d7c02be574844c7c002cac906941c48419ce8067700a4dbe71377383bbcaa56dbbccd67221804f8b9046ffb79abf1242eb32c547c42f7874ac72040d6209503315ba1f67d79f2c4a501379a6afd2e4b2e65bfb921799111e49c392e4608193704c50adcb80270c41a65bc36791c0625d7311cb5150914144b2f3c2119f7797abc85729a6036116f9fbe5840226d1b6caf81bdd8b575f306f4eca3e9b0536836cf1963a00489573f9b87a657d584f0581df42d848144b0526850fae8a7c05803c2fd789e2370b4ac943e20ee20e807a0b8e4e64906f9de9f2bf8cb9e7eb2bb6a1eae0be53b80ac4f206e5263930ae3aef6f072a6c509c035a640708b939f14c258a7a805cb3db09fb674a5688a51f70b5e834d2e39f917ce6dc494308509f6b50776d770410c7406cd0db45d9571b42e6639f04fe44c47b1e901a11dc177d3aa919814c53b71492cea85e9b332decd809470e67c4277d298be6411a3e76d2e2b8d97ea751900a26a7579c029f0fd95ba6fc4aa33d3004adb44788073555e88a051d2b2f0784f32582455d2023e529f346ea1b617148a030211cb580ca9c055b194e518d7c7915b6e4da699dca9725c77079484969559bda5bcb912c0433727d7bd5b869b858ba02577e8722990e1500ac119b022c403bd2e9bee4b4eb037717b3182869c40a2830629981579a3041c5821ada35c2f2c941535b76bf87f25b514a816938a776a7698e931de3d4e6f03f7bfcce8934528c4e220c0ef6e1e96854c777427c698381d561d4246f4f196b961e1f3fa78947ce22dd38760100d1e448b2617dde131bfc9b65c45da214affbf1f3ebf536c9bbd5e40c467487ec90185594a9e005ac2562e422cb92252a92e67883c9b7dffc95ebbd38a0d130ae104ca1f3b6349a3c88f9d71f52899f99a87455551f4e4a2bbd56d5e8ad54a64d37c8575af04044cc2e0a9de4bf0bb96adbefadf256831e5e1a5e53a4d5c78ed1efd39d4ebfceac62fedc5df97ce01ba4119dabe0d71c039b964d60f480f093431fb69b598ba47909e0b940e7efd06c4f34c874a909e1a3ec1869236116995baaafba7b02bc8b54c6bce76e3582a354742bb633d4539ca35889fcc572ff888e0e862462d1ba4be5a37aaf0e6b9c207d19deaf0eea1f13aee7cf4c6db0a486d5778e3f7a4feeacd3a703594811a4118c4935fd2d72d40f6aa2d3a244a16b5ad8eeae52eb03be76c7da3d2d46b0043c2c0918e7b9f4d9587f907d4572cfbdce3e7acea4dd769370684511732dcf236903636fb4daf998b696bab67f1ec203a8af24d67e772ed6645fef677228f76962b95e22adb70878f1572664967000a3b1d5f3af28e1b5ed1853e128735caf3eeef702191a79a9e1d069de70d3911307b155ef3fea44934254ed213abef47f0ad465583d4347643b1d75eac37ea9839570da206f0cc84e3be2d5b9879b16ef35ddaa67746f4ac2ef9e225044dfdfd6b7b50a8f28d594704289b2b0f652eb8827d16e38a7e7aa4a631c191ada3d5c96d4498d43508fd181be102c0f6e2a9ad149785bd1bff48e85005e01506fe2484a53f50c44d080a6071740ecddd96c4b530199173ca2dc1ef92e2e83f8ea14ca7b9e7f2f9b91f03c8cb4e19a221e612894b8fe4a813ae784305652471c321c0ab01caf9d4f7a29ba97ffbbdee7254e561ed76d9da66d5fe5b2de93f4c331423171354fff68727249b15f955e33d67e0079c4afb7b5258a6c0530b932f6cecd67475125fcef631211603c38c50e19384c2be98c42b549b23eb3b28cabbcf107d3b8d8fb3deb3452392fff6db980d6c362beadcbe3afc11d8644ced4041d82369e4e32976964cd7aeaa30efae292f5686bba773644aa75136a3eeb58e8216aa3ef91c8c1296216d24b46d2a7ea4b5e6f8fa5b1930dae4dde122b70e1fdd18f96ef08004325eef7a1859fb33e76b4f920f509c2abe6c431c5a792c737eb34da56c63b43e4040f5831bf361a8531d3afc2c66d124675f2090f51fc57225b52332d9bb2fa6b6fce21c822946d46c0b2669f295a092c6542bd0537f0886af534836196f68ba10d313aafd6401547ce5907fd47570f245cbc35ef82f6c2d660e1b03be18e604e87438b2e02c27b5101ce7b2548ec8cf70267591559966d2f4561a403a102df3a8409fc8ccea3062b011ba85f53a1e86d014b12bee559f13d4bbd450101db722cad8d7613636a1d9f774878f390ff8b4efe7046334ec6b7c81bfc7d7d27a080edaad6df09e99f2a730b5bd228288ddd62a4dfdebdbb6625985c2633be3bd9714622ec21b787cb9470645e9d4743d34771989fc3a254bfa474b7444f0d660eacfcbdd822656675c35e2b58c398085a2f4285b8db2a435b9d26d45db8b2cfc89bda24a1cc5bae251f0507522b63a0a9fe9e1133109fadc276745a7958f5a08ea5a7ff4f05e08663102ca153bdf033491d4de4174947bd7a9927f2a0161dfee9322af5ebb73d16b8fe9da0636186e8c0f217a76c6e6c980d6c0743dbda741360aa2caf7bc9bb87ab511ead8aff6fe798e7c4023a6654690359dbf6318c40077b7675d50a23a001c5717870d17ff15958631b9c8a1b4756e2c66db2ab15ca02c2fccd0e9dad34ab8cc673903fc9556689cee51e63748f87341d8320505b5a2bbea5fc023e4fc1ae8ab9d6b6ddc6e335b28fea2fce59732580c5e6e7284738aaf6d9c95af4f18d3247b06b89b25ce2ef5b10f278d2b23a584f265eb03bc1aba8f201febec87be15e4a14f8b2c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3aacee77ebfdd104004ad047a57f3b22f3d73e0dbd420c3b30985cd2f0a63c6c6ff9c1ef8f54f82921a45ad2e308c81f93c6156b97e54920ea6a679f745f64799821c7c3c0e5678975aa2474d076abeb79e66c7e481bff9de21706c2f72f2cba49c18aa51f4381ad52a8b7be0c3d692f2ca4adc65c3a921ade1ab4bdf79a07970b556503f8d3d91d6f3c9f1ed4e1825302ad53c432e5c31024e1fc10d42487a8436a0150fc3af05221e25507f8f789efc25cf8f86a91f5266d09374c3b432f56885bca1c87cd49d3f1164419b6e3e25db23ff7f371b39ac60cfd10c08b9a513a50c729d72a2f682b736516b4bd3b1e4578c2eb25c6ef36678b39f32e538ebfcc2328cb1161c5bdc12f4b37796a61a00f7c924d0008995a936e4c68e601a4ad7475ed084bbd24bd2d6b2510c85cfc1a44340a9822854679c23cb0ec784450bccbdfa08bf69ac108c8ddaf4d31e37eef6c45a8570deb7b068c6ce3e8556a27505ab6dfa092892f133bed364736bc4e91e017f7f41299aba34a7562072e019d2a7991f6f0b016c35eff2056995745ff9458318619d12e5cb294fcc7a34299368dd0f782e6dfb2225e7b0d8cbe140f16893d08bf12e9f802c6f4596157339f681cd96e001d61f9c094480b451fed7607c2f7242f899da53252d111eb9d8192c639fb5bfaeee74c3292dea01c59541967e42f1a33d89cb47fd8b3cca2d0ad01b567cf57dfe5e027dcccb7727ed4d8679b5f3d3188aa47942feb24d043bb266ada48cdd82b9ced1b33b46ae8e91cfaff36b6ba208a592ec2d6ecacc33a978e4c893f6f536a7e5ea4ebfc5189e7bc3c4ebe6d1e5db57fc2cf196fa42be400351566de3c5028f4c54349e703bc072cfcb48704e25f8688a4274be6b360fc8fcb53e787ad64c3bab174f2070a15a3d9ecef44f0ae9c9a0e335a02e45308d090a1868fde4af7d71a93c858fedd2d6a5d6d4d6cb2cb9b5c7b00d5c2dafb8a0cbd683bc4348d8fefaeec9c0310e559a7220e6d62edd1d24a498d28f04d157b0d508fd2294cfda369e23c9e750fcb1106c230bdcbe449e7e00448d23fcd49425f0478f8236a03c8c24f041e232df719e5a884bd0c58ac32ca35b46ff5be0f868e43b40c472e5866a56fc3b991fde1aae06f6ae9a89d615945586030b691c0adf798d18d090c34137faf0bef4612136a736163d2353511b1fde6dce2f70b152f376e51f8ed864f45ad973d3db3fd14cf1b390ff516a225d3505b7ae53b6c7580ca5ea5ee792f0273dbb2e81360016e5f4450bfd0d1873633f930dac5f8484a593cc45dcc1058e624768c8d0eded178817b32f3d40a369b6a35116ce3b2213c0eeb49ea1067a672ee0a7eac8e84efdbdc5c7a5c9d0542eddcb047b1ed0d89a3187259bb69c39a31270413c720f6bef0d634715a9a773ea601d77e3a404ee4281c5e7e7226d8a69975fff65d54b8b16fe5afc26e3ab48c4c80371f767c0ab32370fc128ed5fb5e14316a70ef982f79a1a12ae8181c61ae59be4b95f6fed5993dbcf7c07205c0135a1fb01dee79df8a2e9f325ce8adf3375642818c2c4713e8cf56ce02bc24bb88a3677d77ea685d456f26628b407ddd99ba83656c86f36a2460e4eb53ddb13200b8cf3ef953e20d3dfbdd181dbffaa557ff1783b1a7722cfe8adddc3e4749e81dd2ad512ccb8583f65d29df6ec7a2def4ac6558e60e41f0c9b5b81d2c993d3252b988608cb1b145e0fba33508f814eee24b0351941be14a0879fa2a993439a531b5f6f99396f3c7a06fcf9566b1af59c343680a2660ee8d4d301a811eb89db52d506f78dbfbdb7d9722059d229500a3fa3e09ff277dc85f0a809fbd2796f7e6b821585ab040c6fc37aaeba8a702875209836f8d11b2ed23c2d4003b4e4fc6ce64a1483bcb1644b82462f8448e9ac1e873cc1f407fa0eb7ff8b2d287fd5388b0b548c58886dcd335dff2b1ed23ce3eebbb708fb5bbd831c83e959d3faf32cc421c9056cd7e1500f9bcd28f2f010d5cb06309376960c95e90e704a6aeee7df0072d0052771b4f4c785d7b0676c0d8b9eaecfebcb808e4d06e9478a5723585925449216f11e8fc24463464ae50ddc0c50fcbe9764e1ecb25c5c98a10061efa31ce037bf32a51ac06c7d417fd49a2560c738221fa781cecdd1ae8815cf7054c4ce8ee68952cffcf8281af1d59ddc8f90edaa260cfe28daa44e2941702a172ec42296c7fab964de7261837ed6a69bc3a3a99aefe5d09dbb42bc13eb397b1f25acff3f039ccf2c6735fd010f0a589e69a1e24fa83285a917ac01b5adf92951e2834fd2c2f7fdee4049e6daccf81baf28938212777c851497ec0757b0379c730d51f9972b91a97410b60256de285894a880702b844937a6e208b4411c7b3c4d4e1fe5d667f43d8480843bbf6d227516927094e2f8240526a10bf2ba184e71a94bf4fbd79da81fe738bc775ba06fdcfd8e6bd67efb92565e7bfaa80bcc36a34dafd823e1f633b965df66a074a096f311437a1e49b41d931419dfbe7d61bd3a0220d3453e9a1f71c51d889d50951f241a5aa454894c4c221122c11b56ff6b9e9046ee4934b0f4b1d19c2c5637a693d6df7af26087eba76c1d3fa9a9decdc737bfcb30170c6138e04f0159b373fb7870294c6a2a8bb7b7d9ff189e4f5ff4596e5754a2970ed4756508f7189c4bbd595cc078179bdddb03d28154a8f51f9ca9a91f8c4ab2813232aac42470f90614bb016ca5fe99c47d14bd699bcf8367eb4051e018324eafa2f8164a3069b2ed2728c7f57b290d8ac6700380971ce27f0ca5cf62a36254de4d4e1164c40baf481f271622a49fe075dda10d8eee96f8af2560896dd3e0ad575abc03d8885fd95f234156bcc568f8ceea2f425b4846ae3f5ffae9c950b63f62f2ca546f236c16795cfcef8b898d3fdc17a009ae4e32ed76e1fa563dc3ecf4463d016df13e3a4fdff2e34a5795159ce98a7ecc51a7649b9ed4e83893d488b34d62e8b42680d26dda0c7bcde89408f63b6b50f20afce4a1fd5f4df6912a9463bd8a0892d6923b56b0d24ee1062c6e371be39fe3a2f5b8e8dbabaffa006e17eedfdce770c81b7df4a96de3ef78055046d11af206e139ea5782df99aba7471a3bfb810fb4c5c4a12d0f05c25d07c8b50ba537d1c58e7182d539249071505ea43259a008c89535aeeb28c174947b1da66edf62c4877344864c47a21eb4c15abdbb406258120015ac153eca80fd9cab2a57c6c554b5565b00a3f580cadcc3e56dbefaef89fcce0ca49397486eff311b49aea38508b5005df7c28be71c511ea4bd23cd6e23ecc6c49d4d7b62c70104140b5bbecd69f039f3749151fe9d7c9a41b4d20207ac4cb1e29f2a3440116ddb3f79465fc3fecec8c57ef78eeed4c3ff645bb4e0e4ae835711b215090bd7aa7f449a58ce8f4fb8777a1ddf8cde4a8f14b4b8afb12ab0f980f7dff341eb9e20b8ca7777525ae4140cbb592e91f78549a2dad6acbb043b16f43c2dad2507f0374d79168c354c464b502f3bcde6600f57717dba944898d6427a89a52bfd88545708fb8180bd8cfcc60b7fcaa4d342702349466e4d9e0e09e5dc864d55119553e8aff5c03933438eec05520f9b9fc52e13f2ddf9c1058f5c67e0da2f13a85774520b12d9a1df9885240551109b9410d39133e963d6c74358304f2d534e0bf63ffde4f7d69f08b467d8d524d78af84ce704d613b4762b5184a8f029bfec83993c52024fbe1af7bebf6f3b726c5214a0f0d4a102f58878e168388d747dd75668f4b72cc09afcf5df125100e3d5d9303578685d5e2ef4f71d8d46ecb695f5cc8cee952cf2712c483feae5ec201c099433062ad2d165a2f02b7a3cd6980d302f2db255c88f4b923805ce95c6d149c887c12381c701a47aaa33b78013c1ef6fc572c95dc93c31160f5a47c9589e6200520755d50596f2636f5ecd7c6bdb439ad884ba17f6a329a01365dce7682d71983e2e278f5539584885d34396a68b0f98ae8b0de9196c3e188e4f1558bf297d78915e1e157d92dc0e35bba1388b7b5d538fae4b3df83f7566c63f7a8425388f8893bec4d04548899ec73e70c9e45334b2c515fb7a5dc2d872045e94d36102aeb08e77a028770464e0838337b177ba9d9d97e9a5080ea06e248fd3eaae3d30e2d8c8b03a86d96d77bcb1b37e570d599efc4c52d14fd37f3f65b1c7047b7f6a33e88a921b50352cc91b98f5ce256dd842b72d7708b77608541bb0626ba3f057aac81c45caf051e862e38172ad8261de8eb78281d1a8bde2b430d5cba68f58a04e60c6f0cfccf54a4bfeb452a6d6af138ce29397b58a72b5678a682b3da67fed2898d0bcb34eebf98b5279bc3e8a20214321a7e23bc55b2b7613b1a9b94f2ce53e5981d0fddcfa9e2ac918d8ff047cadbb5d078aebc141eae8b1f76ea1f429309a89235535e0e9e1314ad8cf70ad8b62fd7cfcb64de6eb9ac54e84a27dfc3c774412fc72e4c18169a7bc03c919ed14e51068cc8eea9d23e416d19e6bd6cf2e6242da555091e78adf9409dfed832de1e1fc07bf3b494caf70e2228ef432d5c6989ecb7516c4baccea0018b56435d3b8fcca431fe5f25d58e531299c631c76cec260cca6ed05a20e33f4d1cc56b74962de810232b36e36e6eb0bce0fe1191a0c878ec42efddd071a62771c6eea92f5a730292e42ce4441212c79f93195b3294a90329d566dd351b61e92e1e1484d414e9acbae955efce4d14d829248a8710b4e84533e666670e8ab0f4c086e99709421c36d6a738a1f89bdf92f819d41db28e00cfa8fa60f3a34c0dead795d058455e6541a4a267a3497aed687ae78897ae8cad02e785d91bb9ebf33bd1df6b310ee66f4d736f557c3766c8c920120a8d5b4d377f7e1d5137b8c6eb585da81cc9cc6694cae162749548dbfc45863dfc575f2c2aa5db254be0167970d0c994577b045b704a6d2057770466f26e2bafb08e00c601069d323b9d59800e35a438bddd5d317c3c752d70a9e08435937f0bd9aa0687552222c8a2d7f8572de78be9b2592d852311a7fe529673c04065feb6da33d70c91791a6d0428798b4a66df4bd7870bc30f7a63f76fd52487ad46395534a3d8a2308bc273f1f763890e441cb39fef6e779bd747bd3aee7956d6c4ad4b7b82a204cccad981dedd4cccc40fd2d56deacc2f52a8a1c4563ae8ba5751c92e0158b990d0c6ce2b3d327be3161a8015d411ab36ce7f20812443092e998e1b61788e95d2c70ffeb49faf97587f04a2f964ec923a59cb429827af413037da228a439cbd4719f709d278ad1599694ec9e492e407b69f0d665df2d8274b9cb67d0cf51b966a642c7df94aa38d225f69438be080721808b62a66f84631fd42a3696e0f83b7b91000a98da82b548febd4de43d05a77fb2165fd37ca81e7a1c4419621e55da7bfc8243b23f3bd023e7921c8a0d4da7fbc739d6d44cc13bef58be171cd2911dcead7079140cfd11cba91d0b1377078fff869bce9127f643e5524338ac44d38ddc6c71b5a688ef01a90c052165c35ce8f2b8e54ff1576fbdc4d07985fabc44b00d032dfe50fd3a2723d7f366693973383c25be62df235531f39b0805ee820c11ca384d5cfab1050ba2d48ee30720750a4595cf0d40d2d027dc7b99c171dd523579d579d78ced79368fc97f9f28c289e374d0c05afdad0728e637d4bf69173ea684a05878eef9be2f507f6da2b265d84d339d3851fefc23bb79996009c076faeb51629346091dfb7e4fbe01f58f5289cfeac6dff92b074b69fd67e6a75c43ab8c4ae2d149c3a159acf24de39fa5d1c5f2ff115e5a6c15a8b9da6a0d9f27c57c11d5eabb8a05ccff40a3f6baa8de29b43cdb475d7caa6f6233796a7efb074693035c40f910b8e815c2c97f2e1920a47d37e6308368cb5ea05f402fe0c3e60c18ea46ad32e4c23bc5bbcbb1e9f95588496b88937925b9288ac69880dcfdab60344cfbf90e0c0d0e35b213549050641e3f5f2a39e7bb5a1549efea261ab33e8a0eb3e3ec37927fa88d2f0830ce2735ae889b32eb7333986f05629cea41ec87d2d0a6664e527d0253f6ba120c4885b0804ba70a6fc8945a7ce5a81892f9b16d809faeece60ad67d5598dc99b2a972bddbb10c188d8ce687861248c4e6ec09dbdba652dd7d04a4d7f79a1c05e897f64409e251c60f683109d3b4ca0ab0c0fcb62c0a1aa1dbebeffa812403bf77ba1a2d5005fe7bbb037ec7abf2b751b61d92e7bbf68ea0c865c0cd3b60182d27bce560f9429b9e5b06d4a958f49600c1acd456d09037420c1a1e386c74e3b8bf4260c54bc2b199b5183c9721e3ef819914c9ebb3009cf06eb411235e88ecc809f7914590adc7d392e2bd794de74b3b06fe798fab6f4510b8d8a17657c5bcc6cb8082c60e2b66b4b90b5f3725273096d012ed280205bb0cb030d719a052da18ce883b310f6215a4f43c2abaf1cc29fabef72c9ffee9854a1f64baf58158ce28dab5c26fd97d5c0b091d27e8f9fdbbcf9a563edde8442b34cc1c52f041ff215db7af2167b4a2c351c1555daa84e3707d2ad62cc9083d363081ffa8f32a6e5a1e2c1f6000eafad3dee48dd5e9dba5cf6c3720fd4aa5fd2da804b5c3e782ce01d502ad8524c2ac131b3a6c958b476d600588dbb94a08ab98031ee7acb292469ee901009aba83e00c6e8a9ba7790e60acaee7b069b07a7000a9973d693ea2ffbac2f1c1a6a976c044409ec1129c78a83ad01a4714644174eb02375e0471fa21dcc89a97b2dbe37145fa3c87dfdbcf6d92d4ea47c24da5dee476c6f38435e1d38d63c42bc537121e97022d95151d59d63d201f597b55f0d6706d0ba3f271a13d54fb3625e7a54aedc0c23992bc4c600cc21e812448636886194fcf17550d8088b9f8b92c200dd4064aa02727dd4f2a37a935d751306057146684daf6b5f0c7dc44c215e87957f892bd06c1fb7f0eff7d7bcceb873c3203a8df74f4e91b04bd607ec11202f96cfeb99f5bcdb7aa712909bf4d836f73c2b56b0d87e5988d30ac3dee5d7722a9322ea27a0714026660ef01fd1f68b0ddf8b484772674aa165cda9a1dff0eef8f92d076d5725e85bcc3988ebeaa62f382bc4a1ca6b76bc8bb7090a0910d9d12b5742b5c390473e7b3826dd7885639e06bf7bd5b20a4909986551677d4f1ed3223c1887d2d251ad15485b605e68bb41e9f8f56686f53acc67ef1b4466e11c6f8e05f2f01393d1deba6b4bb3f5db19c56266e5d6c1a2e86f6ab2db235e5d7f00cf438680fe5b442dcb1f8c3ae7730b92f097a1a8eaa9be8d216f2576ec3aa321567337bcfbaf2524d7d371779bb70d3524f9dd4f7a6049801c626ed168ff155bc4137af6a3f5f14e5135b00cab1dab26600bed5ce96d05f2cc3b2ba58d21622a88b2e4e08fd63524d7a4ac4c6e2d41d1425c5633c036705fb167f075a13805e814dff9ed07a67d22cbaeeab97d5c7de04c499c76974315215c6741b44da97d4f18d92e8eb40d15d2bdc2dff65121cbbdde824497c71960e23db78403fb0c34b9e55cf7381d70bbbf2e6f1065722397d48964d309e82fe00cc5e75bc731b6c8a30ac9e89b9c57bb428e3210a968c88ececd8fcc6f630d1f1b95652d807a5fa5a509be770bb948b1075d8a55149d86fcf72b51951ad0277a992cbf7dc23d6d583a6289271b0cba29683cf6523998f58ef81368d1aea8158f0fec64c10f13565cdd95e87d4c0f3270ff7cf48caae38aa15c2613e69d633dc8ea54d38bb964a13009242aee1129384447ce1388daf5bcd07dc40158699a26c4a306ba6273d9d45e378deefe0cf3320fab80c1db3c581298e78dbfab85a566eed47257b9a0cb7643f343933181e5c63fc5358dd85173126713e38d64841d64c3f9185a05d2b1fd9dc6d5b60d22894b511f6cd614bcef32c7ad5618f7e77aa6c08b792fdb8c35d0b82cc4d605614667e004974914d114fa36fe65e0fa2245a381060547af2fcfa61f9f81619ec0b572692f35455d209cef31918353cfc6f6e161f35d40055fd7d45089abe75dc35f1158f9d759624ddf7844014f000d4816f70fcde197527ef6e1e795a4e5b6db9bbb4bfeee03a89b652beac8297427182e5ad70022bc3b1f9565312dfcdb2e8c03d69e98f9c2b4abc680a240830ea1c995635434913d03b44bb4e9cd243649571009dd727b14fae16c0ce7151c5df1dee4c703d5dd8860df82876dedab858bcf58bb94f5f2890ffede3735b035d0bbcaa4ec625e382cb6e3c2233a2a03576a57366231adf08d583685762aac7015541f5e59fc5861a89a83833edaeccc1a698141a45004e590584b0a6022644b8a5f3f69763e3eca7a70115e20ccb0565d0dc002e86c854240a48ec57ba97238ae31bd6ef7a48bd310dc2fbb7f8c1f328dcba5e2a4d3c9a70cb1845f3f4c40b7ff701bc724cbca2c1a332113b1a583f12b27a56970422c845303be3011776a5a0caedd1aa4107425d519b80f5d858912b3b6412fc124386ab21fbed098b7599f442273d1ec2f04710ff436f6e9b88907c5dbfb7e1df677aab869e8c94b7898e8348f62756354056df9573072cccb1e50c01d570ced3554f4c476de729057a2c56c5a4b7db04bf1ad4fb7370b9d19b38e310ec634c56d7ab974db02750dc0f1c749f771734953538f6198bd19d140e300a704db8e2d0b337927eaf7391a41106e5c0b86ce9526a5b4dd703525efbd275880b409819a9b29a47c3b1f475c64991b20eaee183a22629e21e221d86f0aeb065c70c2b78499c7cbe0500d183a87c66e273a39b89ec304abcd432579d5a6c89aa8efb9887183987fe2ae23344b3752d7dd6ddc5839a5167e3e3792b29a1d2a75e475308ce7f51610f1ba0423e4ffb8d8c1ea585f9135128603140bfb42ca9b389da5da2d6e4abb2f9c18125fbe5d52e1635430374bff8343aa8ce3bc565b854332e618f26b01023c403cf0503dbccb92302ff697c060d34792f6dc8e5b3c933652da7f6464c485b79c8d009dc9ba8d6bc6d21dc97505acf26ad638e9a7ea2f727be7600bf1e1b0320face5a108b312ce75ef0864f05a5ae480cf9b46f2f0c497fc918d4189051c3bf800f1f27152e64aebdb58f2b8db778e7337762e92ccfd17737d39cd909b1426042dc81a7a069251972b91fb35058d60b0a25c292deb33616eef07d8bf104290a287ca81a93a8182f66415c70b74f70bd794af9f1ad802164d7b6a1b5af121fc61a39bb0758b4e5f87f9871e92866ed046830328e02fd396ada6f30dfada3cd9b0059e3f75655337ca60584a60c63f6e9bf1d93f243f3272fe0615191527fdb91c2254771f552aac4c4cfbe30cc0f3273665a44a4da2b92bbcfd62d54066df0b048e510fd9d75f3d7bf3f460ece324aaa452f6e2c2d6a23179114ecaf3137b4017ae16523b684b6bd819d45c87c94e59645e33913a67b824a0c63b52b3ba3d18b41606f6ca8489a7ff031e2e73dfcac404cc0cce0ab25565c2a0db04e8d7aec5683ac555fdc894824f64246f2783446af430c501ba62f4756d15907a38d83b06b2a0b4085b80f68b47a19987197025deb1310ec4dfe62ff3feb8edfafa488c2d11cc65864a5a1a13863ff01ed012f96fda214c9fd1b86231f5ff563fc3a4fcd904324c4860c099bb69b3aa9ed1e839becda600eb365635eff15d6b811b8a277b1856fad73530dff390912b7f956c514c0a23be4f744c055e6f57909768447683bcced3ab1e47675c695d1539911bfa882e1ef73522066b3dce7257cb408064936ffe894ca250ba46727bda756b737003981c2e24b611e1ee9d3233952aba9c2ab06a6e24680963523a720d8b7b0f6c4ed69fd5a6b6fae3e16a1bc69d8d4f67aa1c9704dab5cddcf03fd40114564c49ba681e70238b2debd6a393534ceedb71a202f8dfd8320aa1b0d126678863c682d6db1ca033c937840ee83d9c1bd5db249302247195536c3c14bccd935049eac2349e1ec84ff784272a868ef392d8cb0b0da8ae4caaa05f068c514e37147f3562543f997ae08ca06f8a2cebec3a4e278f7254dad3709f5fbb882d3ca54d5a42fda62e111a9dff28a7de49f8f88acc7d4c51a54ea89fa6eaa5b8aefd7053817ffebae82a29c0c5697a774c1aab0cca38ac2bf87e3e705d8c7f6e55252adf8b68eff2fc294af1760f41e5c1e57628dde63971ecedf7ab39b18349ce283739be8a3bfee8a2d0c89776b8ba49cdec675e027ec3f1228698b1f66bab589b180ab1408d3f2c3b7d8ea02c296522586050e119e68283904dd16cd78333b2d26fbb0a483e24353783ec06bc2e670a09947e0da8fb4e32dbcfeda0b184533b8280d30ffdd94ea24b9649519332405f45db371a1c47878d497f361420c98a71100deb58dde93ee1cc172f074ddf71a0b1b724ccf035bed18dfe533db1dd59e20f695c6b64d845725da915ae48708b6cc1aabf6cd15054ce0dafbd63c13a421cd515bece2f3122e264ae95ad1fbffe11fa487f802c21f9d13d25ed4cfb6ac37005b57ad7999e37a065aa178a3ff83a3ecff2edbd5d151e69b0d35b5fbce96e8a15ab294e3059f43af52e13cc25c3c051b74c727b00c42315fd4a9ff2722093c989793268800ef91087ad32f97dad30e954b7b62fa399b85476ee23cbd7bae3ccd5a23edd1517b6df9199cd88840f0c740cc71161a2103eb3b2507f324a12def29eb897024c2eade6a7967bffe583a36053fd2ca7a8c2369233f41adc45c2d5e9291ee37ea19e4ed43e05a6d62e85a65cdebc5078142a30ae705b7f10574568ff1957acb8c1f13a16c979d691ab9f75c7e197354970a2ad370bf92474fb0528c2f3f54b3709c1c02cee6593b9093ba220111033924ad60cea4b5f9370ad9c65d32d7a5770058aa184f14b66c2a3d4bbe3f1b9e3e90f4ee026c2e154a9eb75d08e4a594a0a31a63ecd86bdb835281513b1f7f6cec44a47c77b1740d077312bd972cf14ab5c0abef855231f1086f25759e888494caa688b13659cd0af7f1b28e11f102ef3ec1d4f7eba3af1f84e8f25ef164733f611f6736464d8234a0815f797f1d21aac30d5b2327b52d8e7e27b0b43c9a9494371808b2af76dab28c89e025e89796a3cd0c081a406ef3657e93272185122fbcd6f734ce7abb1fad4373fe3c5447a903e326a5853eb848cd0c941e4bd6b48cdec625b332ae03974c4ba58163cc15a2f28ec3f80b2a7a76eeb1925fda3668f3238d0b4d8553388cb82e89314456e9c897554bcb550b9cc3eff4f5b077ae16abb3b510ca70724144187485d587fdab641bc026e40ae90578f95e26daca44a6fdb5c69bf19a11060895a30337d4c643bea557bc0bd3cc9fdc33768ba57a0200315146168bac3b6f1f57456a1dd1bb991e5ea3760a58bd5139c6c48dd830f00c8fb1bfe8604df564d385e1225029e396cc6e2bbaa840c303d5d9d0943d9315b35efab879382649cd6a480093988246200ffc77f1ac34e79dfa9523099a4c79dbe857ba31dbde3e922dc72925bc85ed2031301084dfdb3008ee224452b802246d73ee4c78111edc9b642be44086d9df7f78337dd909dea62af9a7bbd95f5e1f5248e7f6b6a18e2cd0579b MD = 7268dc371d074f606ba817ad4a8868e55f391724640f2f2bc85308b2b27aa312cedb9427424dd909abe8ba28b6ec7e693894f867712b86754bdbffdd5eb4654e Len = 95272 Msg = 71dd3fd4d9b0e6c8835a2c63ac37d7e4e1a987fc67f83b39d95d18c5135966504f4bdc4b8e421d573a1082fd09a01a9f2489efae89e28b1ead59bb17667f93ee0966b253cf6ec8cc7e5c556245acb399e72956a61cba53dd347f1f69fd1c993fe7554b5566dced0e98662bf92804a9bc72b1434be727995eb3f8cb219ed9812d30412fb719339707d0578f2c795004ef0c4a3f05b4d2678975eb47a9125e529f2e51e4e3b11bcb9e6d5706620237cc19fe1cd13c4963c446c1811c672152147c27aef43ff63e93bbb98d1a0489620a24914e81586f81b97ddee1d1c5925ed0ae647fe735af41f646fa225278d779c6f70a08d7c1eed44c161535ee292f298d1c2ded432ba6cffd28793e3627b423067ab4745ce08e0587f9aea2fcfdbe5c53aeca20928ba18eae477e074f79e708d495d6b7971b17bc720ef15282a8089e2a4c823f5bbc6926138c50a824d73ad13730b7fc10db50a0143e256d0892d5981bde9e732726c64034df39473ea773263833a0695089025a756f941a1623edf12d4c66e37d317f8417297f0d23525baedd86d926de8bf5929d8a848235c31752697e22b8e5455e99c6506b215d41ba123012aa5c424bf1ef95783ecdecda1d63d55d1a19e7ca2928493e45ab74db58fa39bd5b33052fbe19641f0a22c4d0c5cb7ccf962f0c28a9d8a6d955d5ee87fc0cff7033d2aea123b912692fa9440dd83363bddd21dbc7a652e70be2c555af70f38a147b62c508ea77a83df78cf4f91d4294103818dd10e83d14bb36a330ba7a55e28f7c0ad3ccd9fa2d82a8f05cfd5ea116aeef3c9869364233d197980810e3db10cb7bf35f54b9eba9228bff057f61f7f1814ab4963b59094e344ecc6419722c1baec344f10a51f12404e8e176e9efed2d7090a95fef1a396ccea366cc3cf1f10b229b2611556bb5a71007be37a1d02bd3620b4279eb3f7a9686dd8ec8e426d1e80e4ac1489dcdde392e2fbdd111cc58eb4101a86e999076d344466ee176db75bb59193c1d4b4015e346aa06cb9fab1c7bf4bb02c660d7d22bf0242b9e5bd6848ced50c019c58c02ac40bec2adb534218d63817907a7da39a673c0f088fbe0a761b13774c274794c9c04b41900ba300c28769b35bbd862514db362e325bec086448d1581a3c0cf9cbb7bd4324a1668885515505d695a37c22799522c000d40c83c69340e41125599128b65361630a13b1b28e91a9a9521353c0dd7f49e4e2615512dda4426d0d4eca81db14ce972a6cd8297ae93d5f1e85295f83a6389eb3b178cc2504bd964153c851afe9d4d433ee7924ae7f1a2d653c03940c4a0484a4773f40ede4ae234dd32b2689551c90b30315429dc5b89ac2c2830cfbad463d512d492facb69caaaf77636f1be8fe6334552cf1dd5fa13db3931838b672662f263e06c6e61d2172c2aaf199bc07f2a2145f30b0c19f5c7cb4384395e12bfce0b033f8d53e6aa54243d856450e54a1f3ef8bb11e0f1752ee411c85a2f02c62f87bb9afa8fa31c06f9f9a21ef773184df22553e87fa5a2ce8f6da6efe580640bce5199bc0ce04db71326ab4f78b3103ba6966298d37da332321dc6ff6ad4c1ec488de3dcb0e568eeda8c4bffbbed5b71c011912ac2c0a1df37eacf92a54604595d39216265f99334b6f22837a7692077aa5f88a536b8c35f049c6ab07e1e56db751bfa541265f6100f21eafe266e88d6ca48ee1116ab323803fb3e62dda3def9f8fd17bc9f72bb0a4de23a5d2045bb158a936b774ae215f59acef4afaa1ec53b4ea51fa1f36507aad8fbc05b7b37e0bc510aa9deb9a5951b33df33a0cdd73229dfdbbb0cf889057918342300208a205386734d4e4d3cda3435f4a43c2f164e4c136993049525dafe76570b54f786a263939702cfedee0bc808d6ee8bb623402b53164e91b280b1c1582a2260e8758f73df3e6e6a8104515d144dba954b45314e05a995bb38e3b04b27770d2bdc9d0e0cd22f3926f2c6d37dc021b063d7c6493e93eb0f8b0d96ff234c0477bdb94848b5d4340c0c267cbaaf761977fc40ecaf8263a465081ae1c7d12d99061f69bc64f64d138f22066e2d7c9efeb86870008ca2df9b3e3b470c30de34006258d2418b57a59569727ae4556a9e981ab04d4907276d9a432a7d5e61d1c8003470de21e561448242046b255903dfaf46dbc111499877671cdfa22083325060247074a2999b93a2c4debf7a62cfc90be3f1b39e7a7d64cb70629f9bbd8a36e9d95f7b0ed08ef8bd950a602b9855c5739afb0a3ac05f9c8ee7b95d143860e163fc45ddabb1c0dc9a5d903480221d39b113ffb02b46c487782aeec3d61b3cb996342b81c265bba802c57625c029af8e8bf5088cb932378d51e109b8288fa626492a184f9a1307c2bd74c61a35d4942dcae91b862ead3d16e0b4102651bc27904686142f7de42a94931488fa254c537c36964286d0de608aee490df49ac9465f53ef2709b100ae844c4ac2afd9b874e596a58474e9ee2751434b070a4bdf8cfb390d5ac57f8e1bfcafc07e2099417fcfb3bdea38bf041ad3a7600750ac2580cdbf89b44b2fb6f763851ec335ad0ffda256877abb9a49c278e23014ae04c4aa3baf0b3d8309a2cc21960b9ad65c4976c545aa3ee3c4e5a6a9bb64360c9de392aed03afe565577219eaa3009ebef1870a249cf3e9984ff4fccfca47552bdabc18fe9bffeaa5a607f4189351b5caea375a0299e81c621bf434b6b97da68ad44be44c341466961836d74fac1d511e1130c27afbe0f50e44e0c8cd1e66c36b5d511372669dc79b208739fc77c41f3d08fbe9fa1d8f02115d432f9f53934a41c8643ced9dfcac495181928b61066e8c3401170c8932d1ffc783bf8a136389b2c81db73a64a183052dbe87890224cd9014d8f03ec98cc34e063b1f39b8882012beb618d5353cca7307867f71c5dfcafd3dfc0bed58ed8470bbd1b51acd51ac062ef5d84a9a1f01078171f0d24667d50811e2b0a4a1e563fc3ad027a9cc606be19b258bf70dd8b5273e296236ee8d7a65331585014f05006515bedd6330250e5985fdaa870aea65766ff569fc48913989041cff6fbabcd83fdf064cd3932001b261c69a670bd48069c96e7ebecf1380d82751966c7f8d69e0e94efc775fd1c4a0c118f213ab179475cd0cf6daec94eef6ff6bd06407e723fce6e172cb00cae599368d38194334102edd4988fd4b95e25a0eb43402ee6a94e83a76364b206bd300046bd2f47eba91f98cbc9b824686e975d7d347b58d783b376665cd7439452b79ed5d6911b80b887a5ddeb4f687f892deed4161e87fa0956efd488ed2b5e74d6b43da510d79b77205c3185be66a5b4cf9a17749383f742203519710f310b2b7589a6b31545e3ecd304f01f6ce783f965aa6fd341147537f7925c9fa31f437f7c663786062b012189e74142c1b2c15fd76603bd90021ceec54cc59913bbb079d39318a84c529c1e284b4d74259106ee0d16fcb9e814957170ac7ee7c5cef820625872a150825de999793c40004afaafef028150b11388c8e1faac11231fc37d12fd6df77982eb8cc5b9352bbaa646a96672bb0853c89cf9017e7a9f9378ba96c9c930342e1cf00f935360bfbb6d92e558add16c36f87a0eb7800e1a7f9f84757005e4dfd9161178ea8ee6836c678569affcec01c36eca0eea47900a4e5dca22f0fab081e139f8d1b4b3efff335bc83f51a7345160f13302841c29f5687a34a32fedbda1ae4d4d22d80aa2bc7913036f28f6d0e376485df16c47006535be6902172932c7a81ab7713edb2841a755ddff1a30e93f6e3cf1e38a103fe11df112478ff5387c3767dfc8ce6ea91623eafef9119fa6eeae9597e1c6be0bf288dad6787e98f746c3fe6d2e700a4cc4579a0f64f4893077a01bf6f1089b8f1ede425e9fce5b96b0b4a508ac0cf939d2a92cb849ab37ae62ab95b71e38edf0f087f152c366863e3f722558488a8199c8836aa0af1df1493836cd816d3efd59edebaf59ed2e61167d6546060cd2eb942f4c1a709e34ff297fab89fde80213f09f72441b240e3347f1f5cfba00cc7f518e6c05cf1fd7a875c27192d3966d77dd8d85774170ee46f8238b8a1b2b6184f96d4bf36638ee355686f0b0aa7f6570493f8a1173d9b6e0529c8d3dd2957744b35451acddf362eef35590aa2aacd3475c3eebdb58684e4a7de365b18746f705a8cce6f7db58191b75b6b94afc24a0453d110e9a99249ecca08079aee147ca10ff5c729d086efc040332d356c8efb2af15405d19dd168fade3fc33fc889fd6ade18d5d670d3df3f1c65046973516f3d00b543e1fcd4407376fdefa622556052376e60f1a92cde729e5987ad5eca04aef48d41b7311b8efb06cae35a960753ebce5eff0813e27bef58992d8d895959e53f3485bde507a306102f54e99e00268be57306963ba52629ddac7c667d7fed945353866283290b0925739acfa4e086d72f332e087ad56b969ffbead4c5ae2e20d362da4196104598b9605b794518c3420e27cbeb6c03cada021fff64dc749a1f31daf7d7882de1293e5ded72f9298a5104b966cb89b0b258c67130733c63bfe3f1344590f4024c2f36c4e7492b833a88957095055e5cb0873fa814ac5fec1e1383f76a0a440e053f455dcf6866c6625d52e5cd4554784409e01d125cd18e23227caccba002d19acdcc511c5d35638043af7175f7f683fb455a58c0211bba7d954dbce0febadd8b5f3e67349411db12d01dbc3589cf1044ce00e39485b9016be079b05072d68245683e08ceb976ad9897101e7297489d9f08663605f713f3aca8831f80b8d080577d2dbe4119fe4b9fed4910b39cfd9c88890cd89af1b6f18e31ec63081d432830029fe01251f34587570b5b7f07588d8fc46733da023c8baf2138233d3ca90a7d9d0716d8de001bed78f9374b62e3f1134f07e039a50f427e0ad8c8b6737ca78eb0f5db0b3aaf4f40a7753c9f3c1a67c19d615640569986793350dbfa7e388fe1c2eea50fd45b501f8701e3f0ff76420914061e749375f83f5f22c58fa96714255743fd7d578ebed87c41c5d7298220685758914ce82ee82ed2e12ddc7172d4b7f2b85cda20c3ec1a1b974ab856c8734debeb673fc11f06c622fe6d6782f65228099e3b8cbca58842d994fb1ae3a3cb48263108d3cae0b493e3fd1cc74a6c1cd42068222ba77de3e13aad4f856cce88e5bacbee9f41fe72268a4fb462344e856abbc8992d6de7bf73b352c07e6e834c850e0e90f8e2d2dfec8a68bccedd083c4a502219187c6d5b88d817e66c457c86c4849b88870a085e6468faae63a143920171f72a635f69488f1d8f39e5ae04b812d2d54db044096e1caa57f1d72d6b371e85ca359483761704f80b3360f4d6610e6d5e490b0d509f73c3233f8fddf98bf0201dd322851e4778fc2e5b64a65c0205b899130de268530847ced0043f791134c5647ba3e0cc4a599e6b1a675ef02b974918342f5fcb3958accd6bbade54674aea20a78f030a9025534408ff7b4d3e31934e14e5d1f3b2d376916b3a1735eea102f4df4a7843d97abf4baf9387cdca732bbd3dc7d57c401719dd4708867827d5a4339b7ccd1256b846d476aa00ec40ca76e8375bf6cf61721ae3878cb8a59367427f648c5df0c86c6e80d6c9734341b609516a08a257b7930e56b55d0a48c1c4723ab2ffc7698f15bad378685b4d4db4578b7e6474bf82f848a958f017dc237b97e80f5d75e71b32904eb41d2574b543f5f8cce5ca6183f07e5ddacc5dca490b3829e21c05e40d41a355123e6e5428e3491bde032fe80b39f3d6c36838bd92e1e752d3b1e40ad5d158793b6292660920e5773a4311bdb9236dc6ab5a5500a1ae0a054cc59ca5f550144d68204e24e67b3f9d6a3c1c5cfe5b308feaf92f4df5ae34b3c5bd9c5ffc4c8b2450edde0b3150dbf0d644bc304b3fe0a50aeb23ffff80dbe0d7005f834b3511905e21de938a502f0416f35de2404ff2a89396df813fb4840ee93472da72884c341862dc5851e7cd6994de9ded4e19eafd1d92be9c26c7b1a074d062a002e49f71f83733c418862b73e85cd8bbe50c3e34f1454d8b5528e958125abb8e6ca88fcc75f591514eb9cdc579f4bac8a5c560c2c75508e94b568f784a49c9f0106291b62a5461aa850118d0d24ca0be00a3f738f8187d3069ef388375042a7fae9149c18daa211a2beab12889bb26e66646660a1c2626eb3131692c3b40598797b32c71088d4c3ad3e51b2ef8c6a9ec771b31a8abf4729441fb95b50554e3925c569e3733646f86fd7ebb66a7f5c63a9390feb71009fca61c7c42c05bd8353a7cea23a686d5f789091626623fdef84b5c560197e0ed31ab115204d0a730eaea69fc61218b4870ab9749c0a3f8d8bcb921c90eddb7049e1dd10b30688ff5512cb3ebbb4ab932678928982eae9b898fee84685afadae6be78cc0669fa7eac247beb56b684892a488c2d7fc4e47057ee6614c29a71f51a0f3672e225f8ebabb14260cbc76173a6a03f266f37d81fca64ba335621d56e04fcf1661cd9066faaa43ac4998254112deb0c93f4dc0c02576f556091a587de3e24140615078562ff69af776e6beeea36959f069f45f2c0957ab23d138a1bae2c0128d37945f87e307e2b09a8e89457374c40eeccea2ec2fb237b294a4403566510aa7ea808f209d45e27ebe77ce6f0c65baccd1c5d0291fed5faa5a467d18f6fdf03382fb4f4ae618640ae98bd594f6a503d21fc0330a6272ecb32b069f881b2c8edc08efe62d45e82efb23b1e5dab79d67c7dea611b87fa7a57710ccf0af5c46aa4783439df0421d0afa74d1486cd9b4ae531761b35afef6549b1080b6b541b30d1ffbdfbcbc651fbeafe5d44470e4519f1fd1d8611968c6bfca340a3ac252db7f0a79ab8bb8375612c17da0220f5ede04d314f3631d447eafaa8352c4fc1827c7b0038f510d3f2bd0d9451e2a70d1c2a317e89a008d1a88ece305409c8e1afdafbba47358e20504be9e4336a3bcc465449156b58191734b3e1ec2bd099ee0c6fdd0613fe660124aa6b981d1d71ac02fb1ec652c2e53d52f6d03c3af5455f3eb7a9944db44aeed664ed107d50cb34c88b1ce1ee74ff8cb9c40390f00c6dadad2eebe542fbaf61ebe7e8fdb2c8baef0d80be087cf2cabdafa8169ae96a5561de521e799238f5d2ebc009b07bc9c34348788c9abca0d928cb1f63aa95b39f0458bdabb1ca00d0da4c79b9c936f866da1fdf0318fc139d5682968550735ccd1d92be3e2e48c7a2e0846163a852b9380bea20bc23d9df99df6cb9e61d00ea420612f0205f9d11fe7e3a33a1ee7da099613dfa022bc449512bffd62070ccd0a0666fe00cc64554461bc45cff0c06331d6291a79f914a0555b4a287aefc45a46ab6f00a4de2c0231c41b949d5719ae536987bc5cf04e9880a11fb5afc0009da036049db8e459be2d3788f86bfcf9a3b776b62e12ae7013600bc70ac922c67e60cfad3d0285f47381e28cd90287682aa4263cd763dc85fb3bc2c99190bf20e5cda0f3484c6a040876eeae9f2b9f6f2b64a1a31e162292375aedadb1cc3c15ba30ce5d265c3a9165528377b2acec148e3d0e726df527a1af05b5fcd14444ade5d184743ffa9ea4725dc86e7b4d18613b7895322bc694b94b84423d5bc17df14ef8e8befcf03e4317e1e61b60d8c85e1a5c606abf5210e3f31ebbf8b60b8fe8dded22c5c305c1793c240506ca13a612143394a2936144268f1c48b64aea239b7bf75b11fd00d04bc96f4bb822c85a850f435c630ebbd88a07c613fd7f26e1100e60bb2813aa12c3a60ae3b8cebd8cbff4d6de339827731743644158bd8670517f6e69946bcb30e8bb3df38e38bbe3c9ac32429d996ebdd62b3efd4c6cd37966b76a8edd6f2bd1c2f050a4c3c68907aa1e9fb126795860cea89c6d63f4d5a3559d9c518986919e5a2e8a1ddee2f1a16a31675358a1ad0107a0c5b924bd549728184bdb2217c63eb75b358767f3b95912cfd14fba77354b8afd020a172f18fce712c053308c935ae1619709e661aad6a8df24cdd464b8e35ea59b88c5b3e87b987244e2394cbe9ae126f8cce4938cc13748a9f72fd1fd748b82d85ab5af8ebc45201db0c7bf0fa5be94a2f7e9f327c1c4f4a8f35224cda41a7a00a96f8dd066f50393e4614d50248092dcb37be8427f59ca68e9c5c7f01b12775d9c7cb37721b105f0a7905e47be3007ed2824daa7a2fdb2330211202e827b60355c638b4b97800d7a20da5abd1cd5dd1e7d6b311cd3b9944f65bd994f815e1dd110ac7b136d6a047b78caa97be677fbb7dbd8566aba9458053c51981abfc29579e1e0ed994e77d039d6e5b346c31e490069f4af59fe96e79dac568758e5afb275f78648a3e0b05afd63b5e1e95bd3af405046a5b048c7275fdf53cdd19a2d5b0c7926f4facb1c8a0e46c1992a579d15c1b757a1393f300193fdd0d24d874578878f495966b8c349b6a89144d35f8563c9c7ad09ba8cd85d802d55fe9454fef22e6376dfae4fae7d3bb1ae4baa1a9281a1a7d246fcd6c7246f986bb96da861af491a35ee9c37e40fe6889f147831cc5791814ec1c7c6063ca866996ba22b749820df0eeef6196de8ff56ec09044b3bcee07aa7e1e2049c8f73be687cf9864195fbd88a47859c52eece421e911811e8ccd8bc670d1737910418c85f543b61d08f212d306111699a0b9a75bc137a2bda3abf6f15af2c07ee82deae065b3063276cdb0788a462274d26ad174ef9f3401901deba3a2eea1ebaf30f95e5fa9f355016718e1b793f7f74274d4f5caa4bf8ae077dc65df21921fd3ef1a78597517f53732be97046711916f5c3456f8e4afda036e4bb066381bbbf4bcd0c6d9c0fe8366d50411074c19c3b7a57220e0db8f4f7755ac0bee9e9920902eaec256f9f1803eb2abd816cf4b1eb9d500ec28f5c88bcab28fd0bec1b4ee24b926e367ac9b8c2d4ff864d95d5ff2f46f830127cff5ff6c2979b78d4dd98530e0bba27235770791218c3fb562b2f0e5d95b1863c6921ada1edc28a09f81863339ef980d40fe7328cbd9d1419bde891cb70b8a6376277e9307299cbf334751aa29353caf4bbc6f42a363c1f4554d3bf76d16efbd6b209b3577049c2fa5857804332ef8beb21b4c8d4cac7a442b897a047fffb0c7f207e12fe2df9f7872e689efec2f64e200a5ab472c2662c77b1dd3c264486619b767e0f0df2d2f3007c4d7bbc8d8f98fd3d5fc3ec66433e4e074d9cfce63783937ab3b16c07fc3dcf0bb11f63d9e3f3e9846dfa2afe83622e818ec7af2e37f9cdf5c20004b49e5d5aa33a93ddef1ae64ca5296315d251207fe949c52964ae4bb3ae5604bb41e1dc0b0b90de10175bfa8f693d05932ad301aa05259f50d0c402ac6f15c67af5ec41490d5c08e699ceb5189851e88d4d318c159ecb5c0eba9fa51ffea74d2a1ae8147b6f461a46bc9ca250fa0c15ec84944a297be2044a696abc7624b5a1b1f6fcde0bfaf51b17c9ed469f561793961724c14e6613a0ec264bd018a9e7cbf9d15125607612134308e82b6e76196a754e087bed250636db396a686d55e4d2e8f50e74e2ab440bb1c1b6d82320bba3707069006c8162d101eaf00cddf055be68a95c50f9613409493c7ed5281da5456ec76ed63542d07645810544d041e198603463430d5f8a18f3c069abe3357e5859994087ae30f72f8f45d099ae113167b7df4ad4866eed3d97979fe1be2fefe5182f069b41128003c77f7a92df28ec3357f23a8ccc5605821d0747ff1fd59ff293d1e99855b212fbd6772ab8cb4ebb0427b55af147df7bee6d598a8d70ed378ab2c7110851d6561da2750991db4b46e30f6fd38d60d0f78970d58f1418405eb25d58a5729f47f37314c13fa775e634d7f76acce87df3205c0cc27f1c7f96bd747ccdcd5fa6cd920514a2f38203e82ee9c7ec6e88080e9f6e2a6a812b0db7fbd7f76eb356ce2fdbd98b624ea8eb1adb20673ee0f767ea1bc8b313becb2a6ac1e3b6837cdf7f3775f95f4777a39741e484c0a84bbd044f3d708d065d833e78b7a1a154538221ab096d7a9a96fb6d28f01db871d7604505ad70a28b87dbb1aa8418a1295ec81c543e3bc2a2d536d796a8f438e3ab6a94d312d0d8e9645cebc6d1519c49c538d9fabd6d21a95ade3b52b3102944f06358821596196a1b8d559445527bfdb15bbe652e0b7ef54d7a0325bb7971ddcdd1f8da5dcc4c54d5f755de8925278d4ab7345c371bc0cfd79396d76538faf66b3edea3937959f0b920546a44d28741b7d6a4a983a7d17f20b05c305b54aad7f23171a55ea62786f092bb011f5f826021407412b8b6984d4f59bdf845d56bc7893319a8675aa05ea1d5f06bc2d60234af7b0e607f51fd818c1721f6cac4241058cb3e73559dabbff56f5d70d43eee038a11d85b7f7fe8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce7b6ae703a9b5c56ca076ccb4f04e2d19700a906f2ec7aa68ac5a121249ef50a1fdef376f492876416e2869ccdee93578f0b41363d73feca9d51927e3ac47bfed563098edf5b613900da6e097f15213937b7c7aec00762e288388696a29929739edf2b08395a8c4e2e5b8d81d12d0f0f27a2b6d1391b5996e1f7081b1a916030e2c00273c1246b3be5e28f9672aadf41e538993df734455020f9916c0121d29f37a21a61d52d805ace0bdec7c1f2f469e705e95588c6b896cbdcbd19d4eed31703f1cd5303ea6e534d33e5965db9f0ffa37721a86c5725e358fce5a5243ce440de4ba5b7cbef879df9f74e728444576bb128dcb7207a0fbe4ef6958e7db0a8a53cfc3e109bb15e934ac273fcf4468a46868765023383f880144667362fce82ac969ff0ee01b465ebc631e0961c251c089a0f650a141952f15f68b54cd90af4cf81a358b08c8d300fd2a23ece7a549f3a624d574f50beb16a76da1a32f7ea81a664b2fff89a804f6816afc9068d79665485bdb63267d88653f106f0791ae1bb99d62b3136ca52069d08c729eec3f803df6adcfc53c7eb6456549bf29fa084f5425c98a6fb8a6718070f64dbe7cc551a439827b4440f8bbdea28057b172748e1184e67cba75923d64eb1255971e514fc19842a58639d2e0577d1b004602da1e184423509cab53cd3cc94752d2dccbc4bd9b5516332ff46dd87f838290b0224892ece7d0bf63d0693190fc0b16be1bf6bfca2496f42a46aa8b2e20a539863454a70599c2c8a5f1596bca9b490ccb2a2ef0ae15ed7133afde96155a31e68cf88a7e16a3ef62779ee411fe8bd45c0bdeb377ce91e251511a5321b99aed41c9573240a76c1f33e3bf534bb53474ad8620cf7db2013e3c8d6c4f55a446a2f245379314415c19e3f03cee4376fef1a745d9c82ae3cbc9dcee8e1b595dc818a10882f6236bdba71ba6fdfd1ec95112f34fefe7a5e8594bd67c68ff566c8617f51b1ea395ad518f830eebc8073695a039ac4c741749118cd53fe242745aea679685f5e2918f269ac22fec97244632642065d6b7a78f5d537f40e52edaad5acf2d4eedfb3f9ac2908112e9b19d809023518177f77e41a46a7c865709b1f04019627ff035c8558e3967bdcb5f9b6d17a87408167ec3e74d977519221c20a8030bdc1ee5da5448f05d1d3a78e9469330ba30039a929f0ac2a312022caf505f0b6e4436b3300afc51c34a91da97c57c41202d79ed7c3a316a56fa485f0a699cc00941cc448013f81a3497c8d8b041b0b4a31472f684bbe4ad77d6f3a17492e88aa67cea7f1197c4b178abe9597ee1b5ef0b8df69df14babf3d04d0cdc37f3cad10b9c974c2dbde9805730fb4747ce155c203f0eca0d110fa4270899f799b5cafd014adc931aadeeed99cb0789542f5861a9d3c1651e36972845aea5dae3007076502ec03c21905b6205261407ed2d046870f018566de1cce8f2e8356d5cfb45a4c0ef4b308a8eb94664e92aa95af0a3d83b3f1985423b344af55e53984ecfd0f0193685559dce8f017ebc5157e29fbc19d368cedbe56c59b718b70643ffa399c022aa7794a27965fb1b4592f9ce62d89300123f3e9d9bc398219c5756b8a0297da4f428d6e0b6c49b032ff47766637eae89e57397b3f0f853d9b44cb9c1ee079068bba001a0ae324bfd2080b9f2c736d2388b72cf6f94825208a8f05462b4bb5f33a8e8fe2a883973d3c03da7bab98967d3a944cc19afe9fb761f480fe31bce54d06307b6c66d61794bb9332a065ffdd523eaf278f968b3b8eac25ed38b4ac7d605930510bc8531c62eb06a281de11c84f0f382ba57e86af02e393986a4692e4c9ce0ebf353f731c24350eb8a48686edc026fff797a57950a082be11274a28c205bf4c049d4ece9d5543ebd39cf1c7a4620046e9fabdcbd7041405f5d441b68b90b748cf9878be2682725e81cfa24c828145ad913329f6989a121ba515bfc4a7f740b57ebb4fda3e186ab751a10a8e0eba41a47bd57c921bdef76fad5036ebada5d5f2a07a369b4aa37786b1d5bd24bf899ecc18562826e74f5e628d0829941328f180c359cf89e290235d20c21c890b6ba774e539af1d616791a4a2c21a466efd3df065de6d2e8c8b18ab2ceabb2378cd164f60f483fe30b44ba6bd028b7b279ef5c1f67ca1e1aee0a1e144d41b9c8e4a45ac1a1b4931dbc1e6d90a4dffcac39ab365f3b9005bd02d79aff702b05cc25fd02b8f126160b8fcedbc3908d98dc95d115cec180ae586edea57c1fb0bdcbb6a204e2e8e6f035ed1ead0b7c7cb6caf627a375e2e1417399e8e8924219094b015b07486c3b48233fd48b7150f27cffc577855b84fde896ebbc0b49c2ae12d66df2b3f0666f465eebb91cfbf438120268876688901ac94acc24b5a985b700f3622db2e4bfc8146d5b9509b35096a15b491fec05ef810c16a4e68ebb747cfb2b48d6a92c5d8fd7d8f530f9a14d535193ce09bfd9877ada83dbcb3f8677452a0488b343ce2a0bba28235195ccd1b94931610c880c424c5b18d99b70127759b508888d26d40d86e2e44cc2853cc50eb2bd69efefa70741b65d071ec8685a01c5bfb12bfa45ed467a94d74970f9129bb3bf4e7b9bb1bd9f14dacb1bf08f0a8582b06b57682ab494a8c02eafff0c9ea875c0777835324eaf9c188e5c908f6d2d13631fd7178a49b894f1b8bbd97c537d20484eae6433a1b9779eb9a74f716d40a0603374b16d94fa68aedd37a6511861dbdd3ae4d1ba9e05ccf4b2c5d53cf108533011f6dbdc7da2498005e91093d49ece09a3e424d22ddac4a3e37ecbf8e0cb525a1f253fddecf761ee989bbd4b717a2253f174048036828732b299d9ae24d2c566c7c9857bc942d880fe135581d63eff438d5d19cea1433c2989e0a665a465d5dc70a955bbfccbd6bea01a813beb318c62dd660cc356660b11cf19db2548cca945818e55a76dda8231e477e983989df2374a5985673e321d70ec0d1ff6f84e6b296440304605b7046033f43460c5c8584b3dfd2bc33ff19ad148841be19c34400e80878ca0aaaa85d3f6570adb5afbe7241c19a7de42e9aab94b4677ed1cc7527e3d2b12be45fa2d13936915fa3f7ec74c5076a0c1306473b25d1ada23604cc90003f369a7bff023a774f2fac75d991f4b42dcbf72efa82043e6c9ec89510ecd1d3aa83963fed49017ffba644a9a9417a75912acfb69fdd7f54e1c562ad554845b4a122cfbecee9bec9e88f98adfb6d9eafce20e6384adc04efdd8c00bd56519459cf9e87670856dadb825618f15498a9b95128eb32aff05d85bc8d1363a8ab260962515dc71e22de2b45a4561229355438b6bd3f2423acb1bd1b332b2ea0b7836a15e5c36d94e0414fced4d09f0dd606946b58628b4a73d9ec5608b87cf30924e266b658b8f0f1acaf7a6208e656ed3952eb84e5e688e80e9a09883bed04128308b15d7e37b6d968c0d4f67f86b90d750ab3bd49b4537bf84cb23c25dd48564653a245a4685b2a0e2a6aec94fe98994202508bfe735e920f8acc9f16fc5456c74996098bd952462552a8def9cc6a2319004e5b84a20edcbcbad52b8f98ac968e51290364f930d016c01b280e7ec23d625b09b67cdec8ce9883585be050b5981410b7edf0567b3a8b094e525364254ad6991f27377820ba2b4ab2bac9a303dde0eeef039e5f95f7da749f08693b07cdbe30fb18551cab51dd9790c29c1e1bca9d722afecfa3158a8db899a4a051ee58b1b93a24461acd1837e06f0de81061f07210f83a149f8e852d4bdaa1a9574d5e39a838b59b111a6fb2cba9f72e287af22761d3300dc3455a3184be99d499a950be749356b49df7dae6afde08eec4cb1225db489b0bacfe8c2319d1f7c2b796d2c8a4b68232f009ec4c0377ddaa83d702f5f3c4b5aebafe9d8a719135e43f7a46e0cf3eb296d5a5164b6d03cfd1d43336f031d42a578bea00c00298fec97fd84f8f4a888240bd7deb6d530e6a05344410dd1bf363a68e25487c63459ce327453f3cad105bc0f5e8ce3a4c0436a5329e32f518befc0c3054f7080a23aab19425a8617d82b9a83d6a513ace61a0424db61fe0ce734e0910ed7f0b7dafa2b5651e1da6124c2666e296f6d730b3415ce4103a1893cce42dbe5352ff24661f7ef873016331d92c7d93e331a83985a465a42114050f3868da972b154b94d37b7efce8e63122b6266cbfd384264f3523fcfc8d205ea722269019d9288945743125b0d45e988b6fceb4c4ec80b9c86e4a735ba8f16de236a80ed4e22f20ccc4eb13d2c9bcf1c2626fd641929a0b5b8da2795ff909bb46d2877746da7bba815203c9c12d93e57e3a9441c46a42737f0fb66f6811dbdf5b722f99ee26a0af198815a81a9465dbf554d6a7bbd81c9a8980e0d60277ea3286b21ac7495b3086ebe39b3f3d82c55dee5d9148a6708ad9217dcc3dbd9fa77d5f0ed38fd6ecadca7ef0ff0fa87d14d3cf917ec502a81fc7cd52d31707fda5e84ae4e464256f6b02494cdb99e9e7e6e5ffbcd9ad5ef33ddef3ac8fe26026782be0d0c7e493380a96e1339b5e8067be0d151c4c6219f677972ae77d30648e60b0a75ee871cefb0f10cd61c8ddfa510ca1a65c4173d2065f78d990058163aa221f14ebe0ac370ceb086433de98c648554c09d9535305c7580c8632c3460c0e2eafa0042ae44a0220d65c4666ff52b21a84d63fec90239df3cac74c310ecc3ed91adf3431ca965f4312fc05dca24e32eeb491ec87bbba1ea52c0348d93c0290c3c928f88fbfaa98b446f9feba02172f2483a35bbf2647bdfeb8c0c5266e6dc8714323ddbf43d53306daac8d89af2c2b6e5aa129fd705af062e9962d93066c2a640146302af7c4b2bd46aa5ec5fa1bac1ea201c3cd1a424a7446e9feb9a46c5b1e8c06bc6d3be79c4a2369def9836415d8025bb5a894bc40a54942c504c90ccef36bfbbef080cc543ff9718a8ecb741d0cf4057c0a601767787916fd0ed4cbea95098bd45f86d17ef12147ee0042ea163fef95837d1cf223505efd232258085275ed3d79049e957110435385f87a2495e35d82787b2bbb08df535bc409e3608b189f97397a3886df1fc82aced1e1c20099e662a78f0d009c77fec95c0fd752f8ff891f823af5341d72384435271a310ab5e2acad13413132bcd9bc47bed46e208d523cefc1451bb0ba1c26555273f018ea0ac6f5c258eb70004cab33914af096545375dea7b8ac4d49dc47bc0e8f8d9f88a7582df6c48de904f02c9c21abb8cef72560cb58c07427c3f13eb595ed78132440c6923b0496e21d4c96edda86f53eb84074524eecf1f49b1361fe92fe3e184f7f98ef09a9a51fcbbaa0a5466d547a4a3d370004aea418418b57d370325e135cbc5570ed2426d692d2a05edfbf44e61f541f311476192749f196f0d83a36a8fe7f72e44ff49acaf52d3c87110d45169a5d9371f8e3bf8636be95c31566762d874177a5bc9b8f418512cb9a74c7e3905d923a4f2c6805d97a7adac6c2579b35999aea31cda962fea52bd415958f9ec7dbaa8a3519839a85979eec68698df435a7f43114cd7eb446e7f0fc94ddb4d54196fef9a06ac6dc1f10932144756a3fc234d5e2bb66bbf1becfea9b74c7e8358212080f2d7a92490a78004fd7708cdc4fb2c875b213c1b9cacf713741ee9a2dfdcf7e4148d3866fcc306e9e9dd5563852c44470954f206aff593d6698bc3b2d39319a266f0003cef8cc26b4042e66f26fcbc259b1836893c11f979fd5bb4bc1b8eb14252c7aaad514bdd116b6e62f88fb4bdaa7a35b0ab2b465384975566c69f15e54d3fdcddc208497f63d0297207a89b6e5c0e73077464ddc680a1437edb4770dd4a95f54282fdcbceead83bbea359fbf8c6bf9ae3eccf1d7cf482eba700fbe6c2c1bbdb80f5181cf52deb6bedd48a1a826df671ee1c55509d68a215873fa3c0bc3a1b56402342831ab57282a8a2234235db19c1cd0bdcbc5064698bc69f2747f23e1c2d2a1561476608d34996160cb9399792522bc14dabbe713f140d296fc08d54262ae5d25eb100b0788560372dc7b529c7ecae4791630f168c7704e36376b405a1131a6222091035c701ad0e6eb6d11a2257fea48e2d6adcb87d52d7ecb090d8f5b170ce9497c01d2a8426a1b8ccb7f0095ac4e02e50f74a2bee9f0df0b549558bcc901d9ba236f208d573faf1538c36e6bfa8045816e0e84d92958b58ce0604c92c215721749a3bc9bd3b2103917b71204c5117f4c54a3e8730da5b0d43ef6e1898cc850d531581d404261cd4cfa92b1fca6821e9a65fd53f921685f65c2e1ae1d939ad4788cf4b9372def54e5441eb4b00942b21014734de7ef20ffa61e8908ab7 MD = 61dce069399909fa7f4ae87e5e9e814c1521d6555eae792393a7422e43135321cdef56adf36216eedabe1c6f0cd039fab855d837923391c2dcc9d31f1a2ff6ec Len = 96064 Msg = c38f4de032c8500e46f9bd0ac75742db703f1ae1f628316746d789770ed2dcf2801683e0530c96040aba55b37836c6e78461a0902ad1682ac20fda9485038a204daccbe79c15d05fe084112ff5f4f041ecc59d190bb33766140534d7cb060230b2b9ee9d17c9464650bfba234677081230d5d927a1b4e543c51f5ee8e7c48c4b37a5b5abcb113fe2e3d3183a71a95681d9f81b60f5bdbce85cc7226ee424709965d9e5b9c0d6055a2028f31a807122b76e952c6c0eb7027e61644612c70df541c3bb496efffeded79026136b7ab6b3dc7716d5f4f488002c5d5d937b9a69646cdab4a8738f721381b93640d6686252177ce2dca0b01afe1bd71cd151651f0541302dc96f781beb7f25be4102515c479006610917495344725708c83e2e1720e94f8c750bc3e0b0fa5c28df993d8cda709cfb2602c71d195a65893fe8ff39fd8bbf3a74ef77a8a819e4dae24035da53dfc718f908335fc7fb8a0700f7df6de45006a08ec29c5d1d05473e12a13f2ef9040e204cd29401947c4dead114d79b1c60ae258b2d3be655e50dba366466701508f97be507f2eac906379b7be7edabeee23f3032d75a2b99e2bcb81831af88ef1210918c505504adc0cf80c6172b85a2fe3f2b4c6904143024de9f7eae245ecf4bdccb0b55c6368ad39d02794d991180de387da18a3e8964d2fad73186ccdbfddbe48f29bd4c68a66629895e303e38cfa7b18ef9e312727b1599c8f95fafe5c0e9b046ad31f0824ba2fc7e3b6922e0d98433c61c1b87b7be1442da9de2d665629dc9596058b96dbfaf9d47d99f4df2e49b458dd2dba54075f87d75e7b648442920b62e0adbaf0f4ab4944e007bc85739146f4be2cb75f5e8e8d2019d830d685e9aff2f7361da5136d96afa77a49af5201839681592febf5e0dcae688f32ebb48322dc36293431bc948a6b208c3cbb6e0cf2c4c33d94984218eec8c70acb2243111c751a019f1564d26d0e079806481c360cf5f04475c2e7794c15b1d56a18a5f5f5543f69aece8089e70eb93826b3d0ff3aa0a4f8541a3a947d0bc569a04d71b43600029be3dbb43d50f3b1e72ebd40db246b3de3a00cdfecea115e420e2f2ade56ff0042eebb645f63438e2f7e92d05c32ac4770f9f92c052bccf908f43c35d6e0a7b4e92fec05827684aa7ba6f303f4edea3e3ac28dc35faaa53208f2f327306b909ce917fc3c29032d9346384c5027cebbaeab8a292a7eff2085ccaaf2736d405024dd475a6cc5b1a4d529931d49874d86f53dc169c5c581c550ee5ca8aef0175ce9303e851beada80ec9047d45475f2d2ce8bf8be29d5eb0a4fc8b8943e7b492d568c5e0abe0b16584614d7000586573586f0a094bb129375cef62f23a6316e28094c2669e798cd817e11c12ee13ad315ab16499c1e2e039e4af121058ae4fef35dea38112d3698a3013186cf5bf60ef9c7676412c76ac3ca60444e8830f86415d10103aed346e0135bdea85fea5a5368585e70b72b6b4ca09b6a084a4cde45e61f0b09818e5c3c790a83a65f20ea58c7da860ff7cea216a758ccdeba43190d0a7472ca37b2e9164a79caf15b740887ceca58924325a1aa5525074256983b21f99dc2b63fe56005ee461f19c3784758b3a4509827c4dc80109c83c3bdd0b74d19e7956e18aa7373faebea90258219443d0508921430d520800bdce34e710fc701de4552405675f8e6c7c7f5004610e2b148eb00a6de0e142a0f6d1186edc728480e6cf3459df9fd488631a8d228a0bcb6fc72744e40f9d36513deeef5cb5ff932e476d1a6c572098693b23c19ae5b2ac4ac295d78ee1ad6c7c58cdc298e4cb278fcfd6dd2817096277cc41f454ba2c550b48a3cc55a03a6c871015980ab0fdc70b46b285736683bb1ade1d2f3751a14e1c21f92a20926bbfdc2d6e7a9a63bdfc0a73ab1b378eb629ba385e792df13820e3153ef9d60169ece177826f3044354cf41f67a55bd5c936bfa3addb1ee31952caec1a4161335b7b00b6f67fb49a8a4231128e2ec784e56a91e7b25cf0706d6c376d370ba8716af4a0b175b20eaee7632914c9bb63e2314c98cc14048cde5cf794613a5e9302bee02831a51126c8723945edc0561739d6643d1a7cdbda750d7a4890ce430a307ec702fe2ea3e42f534beb641a06cbcffb3ae69891eac27fa97dbbc299c1f541d32f95e0b971312db32184437fd467eec957fd0ffc382d42578855bf43e03c7ee4a2499fee81f308ba44795099c6d3dc6842e84764cd010740247e4e75a8c82fdaa7860274dd14098f3b30540de7f7e1ff83110872b228168bd89e39d7227f9cdcc7b4d2f48d7a785b8e1316863cbb47b6a3de1aceee88b7612d1d4610554a0c13883bd715970f9d45c68960aacf0854b629b9441f890b32eaaa633ec94a12c9a67584d98005b9bf766af9f821a7c452279d094f0d8c98ce4dd7d8e8a907bd19be13f5a0dcdf62281502cda794ccd9873188350442fe16d5b33ce50e5996344583ecf7f3d22bf11e4b166c35ab472d3cfa70a72863e76f8d4362f07680ff60941c87f39c0af34eea402f3e6a0d1faab8ade0c6861b508a3f26d063e9c7482850b26c4f612b3e61d41bd4ab0e635c3745705dfae50f404f32830ea42fd67b73bf6c24750bde151223058e1be85407bb296b71ab0ceabfa6b083a51d10549f2b2b7336cb62ca7f492125e4f6c1892620adc8a341c452d577ff4e1c3454e9bd37daee2abb2d9884ee14a45ea461a9c44d19ac7b24d5ef8baa680bfb53c23edc7f150689ab36ef2ce945a9848d905de62ab54182bd076be82733e3cbe124fb04eb23e3d90543788022fc5ddf1a164d969fc8af3f72226bf4d6a8fd124640c83d634eaca5301dda878181e7f6b1ba20db949c1e3baced9ab8a00f825be9de4b90cfdc8a72948cbe49ef1b7051bc457fbef177b5fcd4319d3b6baf992b34c82f041716a4ca9957cccf52132079a18011459ea29c0c50b61f8621d16b0c8ec51aa223442334a748ab2094b11ef5ca307f7a8365fcf38a44c69fa8bd1f855f9cb571dbae2e39262504449b3d934d9d2070658907fd37e8a33a90eabbde1f1016a779289bee5f7eb77e4451ffa60a84178d0d96d2c662d49a2461cd13d06007fb98c2f0558a3117c6c2279c3f80b3e6dc7e7a930c80fcb5f32c183b0c1cd2ad1332551d222b345a1a77f5664448d02a38eab469fe528bf374f9bf1befebfd6a251a39954bf9f2ad7a46b7965727eabaf379c4fef06599f6e6345d54046468a7fbfb7642171bf279afd77414c04588fdd5d4b13c2ae0ad251084fbd093b09bca5b7b150ad0babc2782d134c8c7c9325ba6a3830af3ec50eabc92a076e4f61e3d0e421dd7bcfdd91db8ddff9ab4dc703c2d8d424f95b108acb006542e3f5f7a66dcf99690250dd0c51ca2de72cea5cb08333bf7f5565660d4b5871fe0eb1336af8c48881d5111298675c9d8385e4dca278055aae37f04ddc893bd0a743139da7fe8d6fc6689326dc78af9f6d4acfbf602dc82610157e209f112511cd359f9ee3db64cf952149823f224db3f2e00d8d5ff0f6a263728196bb7faeb5ee3ab7cfb53bf5188cb3c6ad36e0b16bb2ea20cf187e0b6006d38d08b831232d68d6eea8928cb8eb0b947d105a3075372bdd9bed203180ef88bd130f2bb23cf8ebaec6b1e24a2ab79027ef442f9e03a6dc1ef16fed97f191479396127c9f5698e506b2544af0b4feb8f29fc11d85d72b3232a3dff73dd805e1fb88ab21350a9dc3934438231cf220f489010fba848a44cccd35b5d37faeade6698d31c03fc37825b8feb6012b6ceec15fa5987d1677741a331979e8f9e009b341f65ecffc0ba88a0c34667ba88f88adfb1fe3dbb8394998f8e1a4ce2906a9d739768aa7166dbf4ee1a7b1e920d4af28cfb28a5ce63a25c7a300cee9799cfec094603dfc0b441d02fdab20e000d6c2b0621ff4873d14a924b60940d1881d891e0755f12547394244a4c15bd6d4f063d336aaaad10933444ea66da30cc102c93de6ba4cb956a7ef627b8c9b5429cbf31fd20525c0f72077a3e8a07df1b0d74faed72f992eb63a550ae66f97ee5bc3f0e4b891eded6366c3a311443a36d4257cef4d086f0be24b139c79dcb9ec0772fdc04ef37bacfa70a8eaa4bb5022a757e18dace746c76774bba5aa7679f399537a41298c478608c8a7d92798686ba6f90e089b4eb8f7b221bd94fcaf609baddfe6d5ccdeea1f3af930fcfe4ddb786f8362ce8ca12df35edc8a08e4fa062aa182d3fcad5ddbcefd6ce4d4ad4e31cf4d81806df5712e60da2fb17ff7e8c34710e6b2244fab851bccae23eeb93c03d6dd6dd7556a5132c69075b458b9ee3067787611fb282a8e8c25378eb9b689ba25abb2d8235fa3c38b2e6913218f9cc61234bb73dfcb6d40a6838385a409a9cd4214fb233649fb592510544e68fd570ccdf2114850bde653e1843c995c372ed5a2c5a1192ccdca7c2ac2c1d6ad97bf7cf13d320fdc542820d3a3ad4a40d38b3bce1a4f5a753f83a502d25c3c5dc3388f2252784af132954fe34e6008d05341983aaf40479e23d95c53bb7e0ff82444bbe7ee6e8a3dedd02996f0ff65a92ad4436ee14e61062f1e1a93da91921b2f869ba86d8f3e00ca4b566537d5e139eed5f5d14ca4474b95d45829dc4183154950a6fa5c44e6e86c795ee49f7dfbe103a908086dfc6aed1c9eadac2d0853a4f6455634473a155358dc9b8b7472165d0ddff28ab1b13c4907df738149507418dad7320c9ae939d00407a4c0633cd0fc51ed6dceb45d4c1e0c09525fbda4750f5b88c2e9e3bcc4fce26cf339f848bc5d9443a25ae27b0aaa8dcec28df69ed6e6fccc71329e2f5738989f1f4e801028ef399558a5c875089d01723c92808a0a4e3324c59d46db60f18af07174b74db72fb634f935d2e5b653fba63903e8008f93933448706a2b62d63e13a252fa3bd79daeb50c81ae47a47df0cd3068a98ce755915d726264b9ed45266b2a5fc5851ac76797fb2f970553697579cb2721a9a202c202cbd9e2e150dcd88961f19593f12b85404d8639c933a4fe1e51c5fcc1303989e6cd4d514c4dfbc8d0e1bf06e2eb388c608c2c12edd5beff4d7cdba78e22586d5bef433c4525207be4422e861c698cf15b3f979efdaa260d69a4ce9e4af8edf0e4ba32008686e96635dbb69f9b0c8738a2c04f5a7331688cf552156d9214789913a6c04a6ae3c51c4846fdbfd944b5e6d9c6b9b1e8fc0502930d5671ee0576ea6b4d44767cbc32128dfc5a736192a76062ab7d51b97a6a02a54ef867d95c67595e1655113680becd99645336ce86ca59cff6f0a68f3d2611ce9f71abce89d85a5e8a68b722c1d9c1dd277e866a919d279421ba1cb4a4c794516768ba480e38820f21f5b4bc000173dbbe42eee033ae5e31c44040d441ad2ee04f340fd06a0654c26592a68cbbc478078136eca9ed6c523b5719af68a46535edbf6a38f21dc0472addb618ff65a1230328c0ec323f55c81342acb4dc4d8e3dfc2071b217aa04dd9ae2d6689e9e1629310d878a13a9f9144c1f7ffdc9ad66cb7e1af107db8f328cb52d8a31e4b591ef33b7e122c8add4cb686619e69b24ad52f6175ea6984de7d8ec1637e15c5cb2e96da06462cbcb6751da8ef10bdb73b068f6ae212ae8668346b22566138fe3e7ac516f97b687733f5c2522abea04fb2e61f237dee14659935aa9d3ab34d9fbae9c717de18a9645bb2edaa980ed922b65f27b5cee762ca7968935c96dc1d4f4765e6043d87b72b3695e6d8c36932d94f58ee485d66625c11b56e84f24470b7eed668059f2f5a73cc86f4053338711c85babd02b3d1dac468058240d6530e7eb62296448a785ae4266e60596ee15f92616bdc0e579193a9863e18b6cb71be4da832b8e689ca7e274b3373fbfecec4e4ea549392d10f55b4744a780e580649cccaee1616218d8fe443bf72146b6568ba295d2ab7aab2e78d390fea71067a78a2263ef7fadc2956c217f8a8cb3b1012ba246fe8a469e113dbdd77b6075c351178c40ba5ba4107986acec85c49f8368c8fe570168296069f46696923f7e29fdcf5aa3b667fd88d20847016d5b5293e9cdf744afc78b9885478e4cc7a6a2020a3c2e2b883712a24b5b706c95c3857920b53d7e3e2af5bcffa16568a04879f212c86746844b7be341eab96cb39fa0999a0921825104e034359cbc88a0677e60840ea6635f07a1c2624092b03b422c7bb25453ff6cd7e3a4c383c40b4cb617d3fa796c206d1e1cd608f79ca5915d91a6060135240636787526114c9f09a6eed2c293190c22d15584c27a27db5a34688f01ba55bea183072bd9af96826bac5bd398e63d6534d3d4551b32d4bffa7929bd31ca261dc350283f5ac94273e749075cd9dd69ea079821dd6fdc13d1f69e4db722cb36dfe010443625f8c0d2010f49e4f1f2fef91f80c6745cb0759fe3165cf3312808638c65f396c7a8922b5d61bbf29dd19d20e1402ab05e6a7a982473cff7f98b0b472ca3aee7cc7356fe30d2d60c29c3a4dff138c727e16483594f293f3bf84ebff9457bee8f80c35fb93ff510982273a6b4c3ed442182292031d7c8f34599fdb7086b312b14a1234cfaef2b043d145c231deddffa63bd42f1e032b5a49b7b1260e302660d1d8a1d8f11a2f729517bd7aa99b3838234ff2c48b30481cba3f8274e27afacdce0c81c96bc1febe88bc5809da6c96a543bc45fc538a1afc105bd96ef24d7583324d79b04589a6bca328de18cc39416e8dea957c7ffbeb23d2727fbb488fe1aa84025235855c71966ec4174e88eb7fbc8942aaef176a01b988eb3d04ec2a84694d95d4ff3521a57171f6ca54156899b7c02a4bfb21bea6e5ba30d9f1e404a7e9146dc7b75cc08b783527c1d17b9ad786b90b4248a7e11fcff1a81b293a07915261f2f30403206bd041c0c26ec3688052fc4e557fb0bab7a0b4bbcd55f61a8ccbbd8c208f312b8da41d2796d3f4b9de4212594d484531b5808cd1b51c1e24de7caea31500eec8381a52c605a71677377f8296f14a6d2e609600529d27bc0fd08ebe9f9bfe42dfb65a6704d6923289d430d46b0b2e3099020b98a64b1ed7c2aa2975e87a3136594d8de448d33e4ed7fd7e9142619b965ae106dc3687a77825b4745ae67a42d11c46db52fcc2507549f9914082bd3aa85a45b055681b6da6203698f50262d91c11e96b37876c73acc712906993e5b36d7f78318aa5cd16699b77bdcea2fc9d1d207d661e51994dfd398ea395dda1adedb2c1b00356674bc97ec0096e300e37de324cf38cc210866f87b6f44ac8bbd131dc675549e1afb3cfb159a75c12614e672d9c3b0b429bc70a99d2a813bcf9c640e3b34ae3b06ef7821c8abd20b2bd8bbefbb666223900b8d7572aea7521253423b1edb459296bbeeba89b744376ea96ed82e29b5a0f0800ddaa05e0fa5f05c5e02c5dbe34b670b1103bd3f34cc8af16fcac6702392c7b472578adb229de621f813e4a8dfbbe4378fbbe7b63c30fd5b4f15f8fc449f82137b5ab68898a0603ea0dcefe4c36a9adbab41adbeb30b22517d685a00912dcc27697297f8da640b2cf8dc3bf216ede761f41353bb41c1b64e7b205e3f81b3e25acd3dc3ae504f235750807d63429c76651acf9e3e50fb15dce8ec7a0baec8713826faae0ba2d86558686818baef2cb45f5fd4d1aa78fdcd77271b31f760d20549f757dbb33a762daa7101925b74e52dab63a182a222604997b63b1a755076fb0adec3c1179fcf08c82acb7ee76c7c4ee396d44597d5b916c926da9817f60deef51ddcf2bb3b39633bf65432c14e48a49299db8f0e1b6eb185f9583f61ba3d4d8354f1d510a55be960640a528b92d0ab32cd35c3675c07b6589e5274c5255b934014a10caa669cf7efd47c62a8b2badf4ea1618756200a71bb9657dcb4b00f4cb5dd78fe0ae7731b34f818c79b565dbd30d6ed4f3cfffd801961c6ebd2f2bef65effc83d94a084bfda2f6e05f5d64fd1a3ae378fae54377e0c912e068255f11ca62c3d2fea4a387249fafab22acae798f1b7eecd0cb56ea80f94fbc165623c2c15c346597e1d04cefedb3d30bc9cdb9fb584618bdaac09ba9cfdceb0de9ff6a14855624ec2c170327340a4262dc4923259944e50baa07f023f2c05495077b71898731f744ab0112941ebdde6f0fa821d7857e3900f2b553b50c03def8d82040e907cdc7e98615e2fe51d3917988741ad7c4fefee6ab512b29c2ae737c83753dfbb0337a21e6dbdb2d755441ca6f3476eeffcc1a03fc64e045bec7fa6b3103d189276afa35f3dc65e93349d8a8ed719ce4deee77a00e75dad2a8595a0b09506459177a2d6dd49fe9f933b93d5c2ab2f681086efb04090c809727697da534e65f35266cfd10b2adcd261cac582e4d7feb8d2653907914b23c5ee4014a80d94d28e3fc475168b48c7b38962a11657e60e3cfdfa61d4557ed75ed8728a9e6210b292b421310bb03c659f74b3c504be7de4610dc6e89b1fb48940db7e7821d34aac9d7a0d82452c6e3d12ae0e9fd26ad807d18c4b3be052848ff861c45bd6e39b26fadbd9f747526694a9b003a003ffbcfeeaf407ea38905771f205f4a432158a98577426fe86b4be22c10513541def752029df8d62085bb5c5ca328fefa7ebb1972fbd651687e5cd5de527be4a94bc99121a993c31d40717f1fd61e6acbcd87899e02224cdcf481cbca29274f1ecd9a14b49dba4d82035069ce82ea959e55e7827153ce682c16e44b575cfd7d89ad9264213f147d371680a1d36f34875c5f018b53b881ad412caaddedb5a476d334d808d2584a5a25c128af9465a349eb33fd2cacf7e324017efe09f4fac542e2a795882daf03ec324c711c7b2cdfe2351904ede4d99dd455530658d4f407eaa051f06d9c0ee83c47fe826fee8b915a21593e57632657c625f5ea51f66b1375f479123d863ba0514d208430574c61ba963ad2f191a6b8005aaad37dc02790ebc566228353ffd4342afa9ee81d35f6097e05e843d720698cdabbe9629bef2754fd6149c46a222cebc8d4f91ea80ff94fc003aad69b5e12728f70538af08c80b983b2af8a356c4f800df6bc5a60a1119444793e3146265ab860103a7d25c742213fa17b5c1ba5e6fae3a71024adb5e7e1f2b2ccdd4141e96834e5c5c1a46615951976d6c38494986231311d05f711223db2f57d60f3776889f5351de0d331a31cf978e746d8020ebfdfda0a84a67e6bb16c897844c38f7f248a4969621cf291bec7f0d76d80b7f019d4eb002a22c46a4408b7e6101b53d540db69d2cde66f8a836b26cdc0e27be579faab267dd3abc6fe6ec7ef4d628913e5d0dc80ab98713474cd62f2c8671695e63864a50722fb28e78601ba82fffae01b51ec9a839cc03798d6ec6d0c774fa968765ca450757b370839ac70375c6ee5eb46df48de59243cf86c0b67147befc9079cdd4cde35f49c686d1238f5e0adca5c97feb4433765eb9a78090869d9bf9ccc932dc43bcb2ffe0f0b793b42f37e36772c91033a9e4aeb88e32c7792fb84cbbe419435ef9df10606fc2aa1a9fdaad143ede0604bf69de5ca93bddd174709fde58f5cc78015055c54266d91af66fa44c8c332f1ffa7248066720361812715db4a65cba1789a32a701738a33de9733370e94d1dedd19a8656667482c57026f0df4ac2bec5f933f8f16cac8b0bdf620511e4a03506eb5f03bd159d2652140e03aeb4ac2cfbb6af5be9a127030d4ec883bffcb116f38e1c6abb032eb356848300a3829d97316861cd99535cadaace2329db9014362c506f05d0ad9d9c4b2842727e22fb700f74f7c8b101a1ed7cc3ee71d55d2e0529d8d37f8e736e4398a5b8c36f146a69de72ddc7911a9b44fbc696f66da28326646dc6325503156bd753529e26e55ec726d88054ea3cad36905cc921e50ea7fc74a5d3c8b4bb27577fd7ac4d06044d2a811c8c0b0cb65c54d2ece18eebf00109c317789d3e3a18b90a99326abcffba0675b55d3489362d024bfd6c87d30512d0e819114a41de6de2f01e61719c4619ed6d49806bd02a93d16414e6b74aac71d45c415a3a70369b67d8edc5fc24560141e03f723b72023544a3b9dc97a36492a68816aff839c135da2d7dec5505ddf496670dbf0e0f6b65ce9352baa38dbc09a9f41f8f0e1f0ca1ac56552126811c786d7a4ad37dd8b4b9f1ab760d655a112b6148b273e690877340ebea10eb46bfe139926d3be59e8cb63064aa4147a9028c6ece75fb0c2eb03f4a66c3481dc726d38d37eb74efa131cf1d4755f2e4fb1ea1252dd080f95a154a2b5f77233882efc3dae35bfae68162891adc1f9ea7b0b40e16cf68a238933548662e5c2ec5fa8946951d255a84cf9d58ab9b5da11a7a6137d62b94db447a8e9e7d6c08e7309e71b05e4dde0024ec20d261fd96a6b7a8b492c5dafba8a7608fd0f390f3d912ff37b5991dfc885157bb7ab08b512bf9dc1cc37855e376cbf5c7744b25b370e79d59aad7e5f74f94a2bbb629bd238d7b75082e601502d24caab3fcf692be3b28e946249d3e54e2694db019301b7467971415580fa0d05783efd3df88707ab441738b974b9f9bdd39c92708661eca26e739b2c4f971b2531c45a59063477f68ebbca8978582429ca0a58f282e4fab67d6466ee990104f71703cb7b4397042d562351b99bd7edfad185356ed1b268e870edab85a75f50e1f1a4578bf5d935b665f6d531265edd99b1b532cdb9f2bea20eb571d8c1da854d894e0771652193fa83dd5fd961177a6c324356f583cd854b1e65c0cf2e9a2da2a5aae215db98a5617780f59993284fdc1bd7aacf766a444a69a4a05238c6cf480e5ff05f9e66f3540b86a25905b9e15236183443dcf28309b71b1a492586f4a78c163938f8b2053905986b0100f3ba3449affe3afb8ccaefcf71359c3e042327e677c6862fa464792e5d5a79cafd61eb1d43109a1d61a2647b4ffa34cb65e430e6299e338c66977d4e7e76a9ab005ee07a7d704d889892d0815d6ff714d4bf2a52d5c925571d26ac2da2c779ed243a7a27052839845a239caa429ece60773d7df3225046d8f49a6d927256d2d7907c20ee8240485bcfdb2ebea78fa1f976e59191b93a7c5711792a47952a9ab06dac3c959dbe61531e45ef8533495925fa40cef4418fb11b9c4e4a12b44bbbc1e25235e5fdac6bb670e647c78fd4dc2d2bd49de36357cc6dbe9e35bc77c21b5218f773a64a1150caec489f4b62381459302c6427c79bb5959ef3520d8596a4aa37225ea02ef6f7d8bbf25dda557de8f032cd8c88146354db66d40bcc87cf3c13665c5e9a4f624827046ceb3c10ac3f3c58417ecef3b591863bcac7c32476cdd3cd2cdb5e555d2b01f03faf393acd0383cb0fa1c10b9b54e0475cefb805923e33951a3db2e9f088aca7f213987be61b0eb2bf5c29051c852fb212e974d22b777be6aeec5fb3214771500d7d237d016f2536d919cd88400cbca4741ebf324a60f3e771502d5afa5098131857a0e525e70f7fe63f763d10d1cf440bf660cdf5e1e3c1ead1e387838b69199c08d85e5b6b16b46e36eccb93bcb0ba5eda214c37e2929ba2d84be1c3e12c8a21f8938eaae380fdf765f7dcd2b6a62ff530c857154b499e1fcb2b11c238288e2d8f991d1a3796830b365f15d3a5facb59611e95990450f2eb144cbe887aa64b4a35b1b4b34fa06e3110eb20a073f5b511d6ebafcaf5efbe8e1976911e8deeecff52a5fb7e13e6e6f25b65a54106dc16a5f6f74cb0076e2a8e4470318b5b4897d44e3b99826caf12d480934bbc48fa159e2809155420146075fc0448d7cafc7552913c37c740451a61e53dbb1b1f96db83d6ebb2bd292a85caa8f87b0bc451ad00836f7c5679ee2721f32d9d6675f78fdc6763caf30bf8c416b215742d309067678d9e1136fdf3619b122a98a331665a32433a05ffacc643e08123db48f502cd0d158f9d6fb69cef57abfb54dc3b2b640bd2380de8f6dc2ab07dea5761fdec047c850bc90a8a30f9dd24697a187b8ed4f27b2487b6d081a20e0e3191822f99373c43da3d0e63f9a9b6e73cb260d9d7d26ca9c71e7221ffd3839cc231b273508cd3b9c4a083283d25695a3ca3bb3d4d8803c1ea7823d39ce4968f63defab1582bcb4d919a72c145957ee730f6318f391c3e2c533dd1cda1fdd04fdd4060d1fa3dac6908d5e21559227df5e252cab7e3b6a552cb1684f75648b844f800efbc7eeafc74f3f6db0ec0f4efeb18608f9d937fc19b19ab453902ead6d77bc6ac582c5945d618a86593c4325c339bc88729919e197007a31b7bee0eb26e3039a18e4bb30ef63f91898dab044a343331ba44243c36375ba60fa563dad573dd02d547251fe03e32594ee2be934356a74331d496819e5ade5e289fa776c64c4bc9506900c64215b8a9bd7b4507ce01c1a7f3c22d94db3f58706e51020b0d6342351bdd25d0bce39829dc408888749d470508f7329e75509187e9a4bec1331e8aee3d8cdc64d6119b80b519ce3cbb920204795aecc6f2f35049a27e22bfbfe7ea9dbe5d6daa1905895650ef614e2e49ba4d4dd2a535dc925f5ea0c9752e39252beaa7371fcb0c282a55b3a887e4522837888c49a312ba94846feb6b0035293f157cff043bef38e24523e82e8927b198405c3fa63086156188248c4e0bfd189f70fcceab093d239ca468f767af3ed2029f716dd192b9746132248a58ddae8eac04111c14d1de57bc0dcde63d40513dcc1a701eb111d25ffc4c18ed73c06f11ce9964f227dbfa5cac49f9bf97868a7b607a015a30f7fa5e9a9ca7be86fa682b6df69c57cc6eb8b8d220968a5cc70f132486cb2a358a58faa3ec7a0478d4c263f1e46254ebd440f59859494d764c088d82087795a91415ba7f0238c73396a541c32b5ef06c53bb9a65bebc12cc5d9e72e1c6aca472db582796a68a0f9e88384e4993373337345130a01597e04641f848a88a135e79284ac750a218e5a1f2a411ece4962534bf293eb32781c0cc42409a411a54cba642122516bd8950241b101314e522cf4c3b6c4c05bc23b846a69bed133e16f3e273dac64ebe86590f4ca5da2a5f843865f241e3fe9c25d39cb633cb86c001df1301c734626eb6074acd8bf0941a6368682ad18a068e2e16b7ba30bb0267be96223503f6b895c262bee6e9ddbcde68683e2c43c9855be68b7dfaba46effaf520f857b694bafb517251dfe72708733b3fcd40c028e3cbf739d7bdf7f2b5424d867baf0796ce670c40ecffaf58e2a083f5ffad703088a60628ad4d124abc076fcf95841f855ea29ad3788f66f7b12ee893bbbd7a68ddb4be61e8f031d36d1003032d2026e9d175a533dbd7378ddde61420e8b6075848bdc4eb6eef7d172e27b02b2bc943488fa5d269ff1f48a1ce8daca470e13e893288c3ce29921d9d68121e4d76c89e2c00fdcb7ccaafc1bbebee5b283a86488204de6113002039ed849af674f865601c8c44387426cecb649ed0c7b22eed4ccb248746c1dae3fb90e887e0a598e7b1a19b41c05afac68e224ffa984d345d73edfc4b1be0a121890dfea183ea3e98b84295bd0c352edd3180643577fe3420e56ff2f288793c230bec2db0884ad2be9e87e280c40da95cdc0346490ccf167cc9d9704334929331aab6dc7b96ce3da28af8ea528fea558bb9355dfefec7c2ba47b4dd07c8368e928df275cb567c658ca51e15fb15d519b1ed9d111cf5ee21218987a106eb6a1590de285f68705e33c31780cc42ffd5dd17a3c3cb6a9b4d19fbb4da240846381071c2e0021a8b7c8f9107a675f1f5f389060130f1b195eb938ef336cdd581a7677e63a3c6a94fdc623c9d197ace9e3606c42f6bedb98ed178246c21063443bf02ffe9f813dc6688920d036041a2a3a63a9956fc254a2c05ae03472537ef3489c93c7c68517c7588094c5e033434ab4b0ecf9e6c032c17911f73adcac6ccfd0ca57c427ae85127e2ad41d98bb94e5f2e6aad2e42ed26f87cb1bec6971c9446517c0966b6402321a06834997f3ab66756377a2f064d0277cf4e2bb914a10eb65e38290ea4c1ba0eca216cc9671e356acb5b7fc8418a863b91dd01afc9bd04f63dbf2563cdd4de9466c0328fcccd931196c004227a0c7bedca4689cf3fd93caef6fb458cb8df565b7e2cce1334af9803be4c5064393ba83483710b42fd5b80858fd2d0b1ed4ceb0c194f887e2a2c0ce84be9adb7067fd7b9c346ce2f8bad9623122e10fcf581654f4010a7f833acb66a467e61436a40ce2492ad1cbf7235463186f64b9357e88ccbfa5775a8d9975f2fb6f3b52fece6561cf88e3b19395d5a57f412ca9e9be727294f0c38b7a355cfdfa330f1a415d93749fed17467688c983c6369d5464ae800104718394d194ece23151c5dc96b813954ab5e0fce8829ca89dbe5b3b2eb52dd29eb61c090c4ea24a315a141c7784724e5081d5478209eb6e5656dae0c068d871c42d015ab2b929806aaa6e4c5c491bfa31bf68b8db85225f907ea0c792301c690544d7fc4d7acf4f4dd148fecd5c8d337eed2fb34d8adde6dcb421623cb16612e2ac147044ea2fe17b5d18a64355528488997ed960917abe8b95e14328534229dcb12b6921ada7f143ac61d546c9e867ff22fa9dbd2f85212d8264ecedac3cf853f2a1297c2be3e9674db90e4000db5843380772abcb89c9430820b1d512b31908fefa33acfb405436cf92a3e7b097cfe54749fab4ebf5116c95b954a72d41064c24bb3a4c8269ac32906348765f9a5965bf268881076393fac97327bc52634a9e02588fc357bc6bfb3ebf6ea4447f6f352e11ce68a431bb8e0202bd9d38a6408f2646b6b9f1b51df1391b88da25a38be402b01f0458fc1286ddcc88b23666a28fff2a4198d6e03ca50dfc298069a329e2eb75fcbc8c3f1385cb550b93d230cb30fb67b2d87dca42972bc5b34f96fae3c236d80a29b457490b4920d8daa2a134e2b9838cf15cdfba38212cd890241723f2735ab9b477f12d77d5a452df1e246a359802229c0a9d1e186c85ebea978485042f727de53d792b6bff741c19ab26f5aa35682600fd8ee8a89c657fb767cf6177d9b3d9447b7bed4835049722e04541b1102a09f8bc21a4790f4006af2b6443bdf0935e5ac865cdad04da467343fbf8daa6dc40cbacf1dc0a53aa030a48cfc65712a57f808ac356fafd69cca34ca7658767d36cf2668be9ccf8080781467e43c3ae4eaf6e691113c27d377c0b60f41257d1b3d1157f3c68417aee968cbb0c66942203806cb9db8e8402c7e734375ea9cc83023fad4dafe1f83ac212850cd689391c787514138f11c02caf90b626437645ea22eb125832b161e6270e12b28926330bf20ffcfca8580769330af9c44f226475ba75fd2581810edb820bbe5270e8026f24b37febb3dbba3706a88787ee1898c41d62b63bf8cb6fa9778dd0534a3947b4650215473df769249f1be7e78cd36343e023e61224eb04ce5bf7013b6184437a576e65b5a335849070b78369b7dd4473974bf54e827a5eb8c3e9b9815363a63f606ae9bd8030ad29001de294fbb0cce1975d7c279df3de0723d871bb8c51e072148a09b56153335ce1b1adefd4d86cfc84bae353d3e213281035b24098d97290d84e5e33a327c78a8a051dd0bfce9552d3e6b349c0cf9e99fda403b6f554ed3a402a4fbee228da505daaeafe390dd6530983748fe106c0eb6085ee952e7eb0ccd09066cd8ad0dc3cf0f56dbebd10c09b99f39f7cb1323a7add6dcb51a0915dd70e333bc629ba5dbed8874e98d871b48b09d9acc6bddc6bf6c8ce3283084744c76d65276f3b3fcf4478d2e623079b52bfdd8814c4636fc5bdb729ac8fa1fb164c52b8c1ff2bebb16c565accd3b7080b889991701c4e66d85e2d02a20e1a4742a462a0841c98589494f5a17b2183424f93a2783724eb4c24469edbab54ed964a8e11aef63dfcd0f96cdb297992e8d4af6f9ccee274a69a3a158127311a7882ae57f45680e9c61f40427b6530be5439ab6afce80a922cdb7a297877dbb55776ee906f19cc96808e19c45ae748fa51dbb414276607f3ca8a7520e94ff3bc16fd7bd6067b21cab897e650fe221aed6e4569f9c0cb73102c21ab6a681211a52370d6873efd38fcdad72676e9983efe06012d9a3d8ac48dae3b9d845950ddf6f99b9f229d027ab363c66aa481dc2da2c5998f54121684b2ed22cbfd419e812825b83646854d5f74ffe013787b405f720978ffe5d3113c265581a733c55dd3bf24612c51ac106fc7ebaec1511a774cf25e1a0f9de4ed435e73d2cfd639111e327220f1d2660e1402c3ace4cd03e39e9a40173f0aec1d32d1c4909643315af9189b7217474798f4dc24450e5aac079cd03bdafeab4d239326c4359b09328ddce80ccf1d3ec5437aba6a11ae789775f04acdefcf0d8c82eca3ff5c6e96a14c321742b2641763802e04219d35a54a91015052c040902edd97ffd25f618a21f8b12cd9a69c7fa6f1876fd732346f39fb788786e6c3d1a8763d80e9c914522925a29f3e2626c603fa0f53e79b4b44da17ae66b6edf9408dff35dda224076d2b55bef4ecbb83890f1c2e36ff12bab4cf681b648f20317b43db297ca7fabb59acfb3eb461c143372cca8caf7a43334d7e8f58076c380cd07e8c80d447a7909622a8da6449f1d66ef1a77313e5a7256d6bdfecd5da9ffbfe72a5c47b1dc527b120c0fa6ae1a7cd8ed215aa1acda901932bec323656b28f33d4996ce7a6de01192be6175ee56d891552b77a1a9ee3685d1336d0df6d3a273f28e9f2905f5c8d5ca88ac9b6a1bda9a107ef6b99d5c0ca39c64231078a71647ec419fe0bc3cb5cfa3b1189e8c302afa05620071f0edb97a7b980eb653b02b7515aabd7c06094d060383cc08bb5f6fb91b21bd520a69e61257195686efb68a07541122844a263882d444f1605e6e51e03c0254e353983a74162d2208b581da0490bdf680f2591f4bfc3dae2fdf267a764f4cedac34425ea7a21d9a MD = aa3a8e590bd53d04fc0b064006660148bde3ac9c9e44b82db2616538cfd8e175d0855aa9fa4bd60ace4a01d04c8c2baea401e61eaafd966a27d11e037bc56f57 Len = 96856 Msg = 7021f18b8f398a5999fcdcd128aeea78fa2308e697d59b7a3433214cd83b7163bd4a4329f933f21b5d8f81c59e55ddeeb2ab61107dfb9f0bad485e19e3c3df05139965982d10f355fdd25866508869d558ab8eff5197804665e25007cdebaccc3ab65ec273f7156d3f6c689a85701895b2ce959d5bd3c49524a700fce0dd5f1ff948368d1210dfccec06b94a8635719689b980d0e2d5f55fb13f75e162be806819f7f5e35484d9dacc47545f9cfefc41a417578230c59a0bd553b79f9cb9970e636da4ab7f7b8bffa6d840bf0df342fccd8e209a8bcc3c03588bcf1cd6f32d799c4f4bcddc1c7ea443608554213eca30cac6e5003c1262ae028ec4425897c9108f48f030b390392f6c882c0422041c466469ad9c8bbe94749a059ef869cbf43d03fe9dbe4cff440ae7f83cb95670c1a4631c8156bff85bbdea97662552b73568bf19595eee90289b7c57bd5a07a740b48f89681622ea3df1b8ed23b35c8514f78c422df8e36b6c4cf54eb8cf7bd421ddb0586ac4fab9c478cdaedd89cc5a195332211f7571b9988419843300fa1ded868d318f48909078bbf1839c8fed61cde4795d3abbe1a235aaafa239d5ceaa2b19efbae08a2c95e020eb1469ad06bfb712299e83b37b4dca28804fcf363ea463fd9e9e647216f0841085084bcb5e9f6046098e044586e3df655434ff0b91331e9a628323e995caecf485084bd13e274ee6e2d3c45a4c8bfcc9f2f8d03c107ee258031226d5f24ba132b4bb70a7ee7f0b5c7c15cbd8136eaabc24444bb103ae3a9f48f27420769a2a34dacac236b6d01f0e9ffd22a924b370a6b0c07652b2eaabd7facb15b066e00f60bfdc4964de4210661332d0b3c783d7ef5f135b08645bbf68e147126f0d44d9202a9a0e1aadfc68ca9f5ddde0430666fff9e602b96229fdbac50c7243b2ef0fdbe5ab18416c27aea40d265216e263a53f46e0714ef57bed356ec23d169c0839f8b6b96fbf64ea6b5b2334363feac31c150eaab2b063791842a4127ccf14b8dfe166691c7eda6e2657aa309142a44d54ea18ebcdc5f44d05472ea4365662278afdbd65266419da670069c16b07582ad4272d4cc877f21c3caed51f7393ce7cc1b48255955b6857b7be2a90cd764e8124321575adada31146dd612b3b6ea0e00d6e7fe0724a0e0d9cf9b345be77cd7bcd75980d844f5151aa3e9a7197cf1f7af5937aafc4185423a019cd8747f21e4056567dbd53444207f03747998e9e9473018b3c6a93af82c24b8640fe6fcf8af7473f8e2c2476be59a132324b29c347f2b9bf8db8e7f6e01124a8d4533ef657c929979102fecc0f6f4496212e6f268020a6953441c9d5b539b3e8512ebc4fcddd82c64fe9ea2e7c7261cbddea68af87244f76fbae40344b6180ac7e36f2c3365cdd349087ee844c8a81392e281c47a3273ccba8a755fbe8b2145d2414e738d86dbf491c8415b6c8de2b48db9094d41e51f6fa04d30f12d554f6640b70a397fd39b26dba8964ad3897e760aec9d73f3ec9046dd7db76625a6eae27fbf02fc9ebe73d08343ee54fe4dc3de96d7ced714cb8ee8ae96692d1be28c510bc3f92b5eaa0e982504a9f8513d6b64be150df518f453dbb011d6c484babc2861503d442448c3c43d7569a380eadd9eed2eeb4c651997867e9a80bb0471f2df0d0e5fe5a3fd2c0b39009df4e1e882e3a08fd74bad8db27f567ae77effbac8fb8b38c17e4259bfd3a450c75b1898f3e984a2627146e34d3cf44d7b9efaf786e4587a127c73c0e7a41bc06644797ec906e6111d6bc59cc035c47cdd896abae55ff13cb37edcd54bf2ebea0b5fa92c4ad2516658999e1ca3f043a35dcce3674c94e21b34d3d1f94546b13826fb0c0421b262fca469550570f2fe3bace7e99f2549a7700749f7cf7c25e83539a536b8b64d874ea1797ec9afc450c02b58e1d527d4bde5bb1fb2aa59071d6bb3fcad9ca0fa2af6a0388ffbc8dae7bb599e507b9ccc91e6c0e3972c5460bd36464fd5225a5eea6f5124ecfe44bd3f97c826da251ca7dffda92429c7f6c9344f314d420c4ad2322314dd2a53bbc1a4dff790d3542fecd494e45fcf0fd8b73ef1354378ad0afa8ebc6bbfcc8e96aec41e585ad07b4f122c36f3050b6642a129c6a2e0ed77134e7c95d65b58215ddb29bd6af3561ce29e537e65a2635dfd2d815a0a94150cec347849e51e319e79bd2247cfe8e8bb8307c6b5acc67b6930a2d215ecdb83d10e430e330896fd6882eb6a47c7a9ecd9b8e5127748cf981ab5a79874ca35ce65e1f0ab0bc154201201ec4e3812b4e6f9fc9ca35dca4c6de4d4a241011321392e1fd3eb1e9fb43e2d6f166a8311a87b8eb6b515c391bb515a26396845583c68ac10532af604559c0d33103bc344e2ff2a8fc4d6333faad6dd12c38abc29c5e1725c04f71c8fb6ee53f6502e833cf2f63fd0226137348982f022e704cfe87c17f35b4fdc1ca2369974116cdf2d6a6705313074334a10d5da45fefa731b14cd90a1b6ba5650ec7311f01cbcba2c4dad90c11920e8e6552e4110df9462084f18c02fc6dad263beeb0c5a80c64c2a67351d5202ceee8651e15c137d4b3e21e80c4ad03407fccf9a1cdd05e620018237ac2f5685b4b0b4c79d8fb0306583f29006855556e811ff2e7708a4a53076ee4f613b510aa8ec0c06b150699199cfe4a7a60401d7f1de7cbc881399569e18a90ef2c5d419e1dcd69fdb42b2295e6e92bf594b681f9baeb2f4ce926662cf734d06df53522c161faf1369db2c600a0c67479ec01a966bff4c47c8e99e623af364c795684dc9ac211fd1fb8e3ace4315ecd0f5068be4d96ca325f59d93dd67257ab1a379496b1a9d838beee05fdc80179dcbda832e837a63522fd323092cda95e965980ab798f7c19471d2562e03578df4c8ddca84eab57fd3c5f02e40d91ba14b43c1912adbba49ad54446407eb2fe57c387d412193111e9278caf3ed8a90f41aeceea1159bd8a2488393ae8ffc7fbaae9b278b870513cc28c8c2386189d0ead2b14dbefa51e957e0806e7a28afcd7a06816b1e17c94405012684404f8f6211fd418d5f6ba652c72feb337b647dafa01e5bb65d66581865b6227fc009e3baf6051e1be6cc01ab9c61246116b5fe8cc950baa7de052a174ab23d132c132f420394977809adec6a343ebc95c0afaaeb6247feae2456b7a7307fe6fce90dda9db6f64e301c83df052b1324302db3fb51e75ec837a4dda96ec399b08b7b5c6e34acd4b2c2b3e05202ed88ebdea2657846d51f87e2f42c47d4507a1a4d7781729d41aa65ae4435dde9f7fa83efc336aa40c804be2e86a54b5e83ab94b1520f504e11d1c7616206db30d7027ce20499f9b61ca8eb78d0fafc83b9a8a0659f78afbd99f5686a81e5e26e071b4753eb21ef3d6f769050577003ea8eebddc8b43fe962568fc95828358c0804bf73c3eb41033d2ce83d53aea6d9d9500f9d6944d795d2b40b5a88c97820755c6972a08989de4bd18852e13b21e6f6c96e7fb5a5d22d954ef29c9aea40585c8a93d4885a6ec8dfe9d161978163c3b94792e53c6bb2191083c01ffd0f009c23fbe909d9b2526b6ff25df9d515def8a757177e6c0ae9f0db0f1e553dac4b54523cb3931335f72e8277888c286d05ee377456abd317fc4d6b2d47ccbb4683196dd99df0c369af9a9de5db89000b7b2ce02bfaedfff77b77378ae6f724624a63dd3f02b378a1fe2848c9e1710a55a12d37ea5ec5414dca16c6846654d79403cc26f97c5b9193656fe99014e495e00a77b53c0cb2556f6a94aec66076633031aae1858549ac9267da16e4f054314f2994de9d8f459af0ff8946bd4fdc45db7698935f980e284397ef4714fe307ad790fd2a9b50ef8066db5d24d59ee6fe0a250d93043f39a31b5827f0bcb919c13db3190f91ec20b4259098df9bd8370a20cf82870fe52cab8e3b0cba489b70a2c60281142dcb8984d1b1c4bd9c863ce8d3f88fd5df24878010b315fa553fc5ae2521cddedb897aa0efb159754423691888229e15fe67baef3752cc374ef08931bf7347a607708466d411cf6d2f2a6c27a1c035bdea493737868ca807b2584bdc199997205e4b27652345bf2bba159674d563df342f239d0772e331d21bf18e1bb7e734d43c63e41a51df7127817f78be8780031f39915cbd90d8e22cd836b06f1eee99181e453b04e441bde6f1c293333ca739e5a61ce6f844e0318e93b26344b3323c829079ac936f1eddf097897691693bfc1dd110cc16138bc86dcadf073b1944a79a2f7ba96436c959caef2e834791d0b22e57379cb5815def40ea272cc0b58862d547c5c1f5efc3c9ec754c49d44ae804adb4dbb94522b94eae7e1544641c8fe6ba75e286b70eb0a6bba64d5aa5f8f46c025687a2435c404f1cf343dea3b2cdbbb0364c5825f7f268df1ebc065b208840c2d8c5f84eb2656902e61d5bfe2cc44a5d058dc6c1501b98cd2b030d6266062b7598011bb5a99b3506c31c5cd1cef62b27600143178b8eaeec77dcb04a1e10948130e39d16c6743b8f16cb51cd2de5d695d2416da72eee23d371839f70cd1a147c2fc7fcf07d62d5025da4cb5ede25c53ed8e8a6feae9c8008a4a23b75079513dcd138abc15309aa07142339f534187f68f0516f6c7f3c5c027db314d532142b19e1b03a07dbbb1313b6e12e2ee4307dca9506579f352010478930ac0ff119c2b9cdc918327c09b8aec249087a432048da5381dff554ea354e43a57183b9086332f1edd6efb867f33ed2d55945f54a590e985e791d531d438d397bf5deee72852bfa88f68e15786b5a5510a1406f3136cdfff6a365b41bb39ad73eb98025fab0fb4434e7ac179d7977b57570c815576aced6d4ff6cfc881dedb9682d15e3e37f377b7c2ab83359c61d909e386b8c2f5d57d993dd9190c4db0c3c82d0eeaccf3856ecc94030fd3fa9c262d57899384b871f649dde822564836ced194598e53084d02496c8a4d9b1bcfc98c5a1efae2e807c046d72ad0ed99f864785eb932199ed39bf8f14926d527822cee954cd523ad204358d2a80c1b6a7eee863437be67dba0a29fcc4780c8453db61baf1b0c902e43e6467668bf26e051d2c4bdd91a85ea3b7d07a58c45bd9e89cfda5193877194f814da6c74cf5725f87af7a2a92fbbf12c96f822215bfc5aeddff423bd2e0e06c832da5cd426f661fb4cea8aafe35119fc543aee0daccda0f24e32cca0eaaead39a90fed8eaa4bbbe3b2641ef21f8e89321e94af581e78981e855af544a19ab1d5e141c8ac459d5c36132c067accbc6a565ecf0e0b9b446cfcea3445b23c1b392442389535de366c7fd70be94fd021e3f07bb3b22d0a7b4111e68a65f1a4776dad35bbfb325c5c124365c96f7a15051d89dd0844c6526342e7e222fc09bff676f82094a2aaa958760c272e410281b23fa8ec966bdf5d44940544c5b30377e27c8d6c8933a5ac72c161840107effe6f72d61025d07e126862f3753b32e6b381a6f58263562c4df11bcbe40c68497383de9ab17c1aae5916d23ade4c20ba5b1d1db7c8e9b245741fabd1af150d19c737aa7c3764f2741a950c61e6c0268856fc095ba8e5f0fb09429afb4ee59e67e4d3ff040aa500da3d2e39f0f45eeb578e669169891db753f4a30fd12744c239b19f04bb9207ebe7ab29816f72ef182feaa5dd6ad35bb0571d8a33dca3fa219916e2e22837525ca34ace0b67c73b5418520016e6ed65830e6d3e2ea32ace648efbe6c0d4624dfa17036400605b0a481baebe64634103d780ca0927ae2589332048f1c74579c16e4abf3587e096249b3fe628ee6b36ff54b61d314686faf33558e54c1e05e6765f446487c971e051f68de386dd853420a3b74fffb5b213d4133dbb3fef9c0f34760edba3ee9aa158010b8b20583aa32d6c8b46bb99bad6f475d8b0115f905ec35baf0dd11de4410263c3c73d8810ecef563becad1d27ad1b012fad0c986b39eab52fe1597ed52817c5bd80269591752e0ace281d6680ff10624d9b76c2b40a722c973e823af7be5fce009c24a645a7b1304ce1529f4d349c3e37609804f4382469ee0e9579d26ca12794057de3b3ea426fbe0195ee17b4873ef7e6ba87b22bc6143c38da62ec98a77781a1797563a7a76f2b6f2e7b64e6990993132473764b20d58aa4991ecfac3767cf5a6284dd44a9d99b13656fbf34994816d11defc900fc52df3a1ad4030e1a9f87167e37aa2b105516d581f2ad0551a28507ee2331b2203643e2a4ad0e2818c6b1bf17b751c2a48aa59dcc2bb8c287c0ea9de03838c95527be8481d17a60f884533c732c5a732d214f538c4367d104494c7a395666ad63cd5908f767cf2084837775dabd4ea572c11ddf0a62429b90e6b48841a442c612d21b564f9893cf826824529692b3bf3c1315298eaed288f23f29ae424b547d2adb0d56d18b50d4bbde63bbeed4142b53bf421a60529e01f4fbb3d482732438729335f1c4698d99f78b3b9829abf6507f6ca998c7742f6c5cc25ae24a423b60b39f9d0d7259d385fd17b4d1903ee39688c2548c0d3d0b32f33e27c1e2e3205eb5aa4d932184a900972bd64e6bb66265356b4adf78d4bcbc81152157927c5b98405a4b6c1a1197728b6faaf8023afc254f0c93775161ca71ceef518da23675781c57a17ea5292543a28a37b59cf3373e9e50383edf0ebbb8a175bd4c5938f565104a57b309f4dcdca425856e82099e19eadc401b6c0119fbc44e6f7a01ab63c7e6db73f2909943a359e79d0cfda3b61cfb5bb3f53e626ba1fd236f00e0b6480564b1ff228041e3018979867553e909b0997399b69e5a3a12159cc3c73e822a895375022d2213425ffb824893cc041e3e8bccfb45d4110db5d46075b6653694ba7ace85fabe38ea2378abec4cb21c7d2c9a0fe08a28ae6cf401188db49cfb0b00a3658f719cd763b7c89c798a4b58afe38ee4516de259df36666b11ab2af919c394e1287a03193381b3fcf734e1e13bcc2ff255d6493cefe4c9020b825857456b16ec58fd3d26e4eb01736f32badfa94e44e2f4ada67c2364f38482216e3e1760f12b28e29025fe5b79abe86c1e7982d0975b36da4144041fac9a7f70b4d5180bed489f11453e073be4496ac957d74cbcee06244562ba197dbbec09567145cfd2d2ebc673a39b89f20af8fd34ac229279128bc5d75106eae7ea2128beefb5c51e67bba3eef4610be8b35eaa926482d96fcb9122765551ffc3ffe2e48d744e80587561416b7ebb1685a72378ccc81eab06e0c0410bb8c3e17ac3d646ac49378ae6c484a5d38bcf3131adf070ca201f8fa61bc22c7fc0831775fea65503b6996b321ccdd90c61c5e4548f6d9874b4ac0eb7423cebb8b6ba291b78f91a7a029ca9a245e4e40048c6b7561341fab2cbeeafa11ed984a0e28fa0d3f8789bfa7767cea00670ce958afa339f02149e6dae0dfacc773e011e8b2b020748cbe2695b236293291a9fb56e88df9723908a8ba63077a115166919fab5da1e2e99f7b1f7f7ebe3748960473b9843a7405bc8f6f97faf86bf07c57b7856ad80738ae0b8930cf3f7b06519333a54e8351f1d6094ef2329e43fb91c2b4b360594df47a768778a0139a558d061b3e255ab897f584fd2446d245bd67611bb7c69c4397854a7ea989e101a088fb9ed6a126f4628ba0ee80904acdc03dc15125162784bc5ed5f355e50e4d81d5d223215a8eb1ec28eb97b9b75e689ea541f96dc7716dbd47c77a105a21ea8404387c80a9e85d9f2da37d12248382c33e91791463007b25008d774b51924501947cdf8727ca73e62a87232c5060c8b86a0e549b615b398df9a67f6953f5f984f74dd0a75cbb817baff51e8ac36c9708983710755af825429390f71ce9b374a8bcf9f463a12202aa1e8bc3a0060d7a1e799a3124a85ddb0d7edb72b87b5152c7462fbf4ead94640c0699b6fe90c9ee646ea64b4be1f2a7291be476de9165f08b334da5baca99420bf8dd6d08ec386094f7f9a33d906d263feb5a77f1c457fa4ef4d22c4a9087194455956a5180cf7d0a95f2fd8c2c13e4bc7d9bfa947cadbc8d1b6bd7709814562fad70136ae705905fc9209eba2d8d5f294337733932edd3e007691bcf3997953880ec0ca7976146ef22112b4a0d4fe1f0cc9b86427f8ebcd259588db8fda732f94067caaa1a690d43113307ae53c239cd7a568862cb06f3ce81c891b06cb9cbec9c81b1f4d8835fe61704d879998ab2f9ecf71dfc9dfd054f0127bc680f45cc7cc5b876fa5a56cb62b415021e271fea1094db9b8270c76dde67f482224de1c1448c7a6e2d2849bc2378d2191eb4d84b9bf292a586dbfc99f716bd7781b10426be31562c2fcad2ceb2c5ca81fdab7a541696bab09c48031613adf100f8d123895454ca1554aa985f9b2b6cd12d834c9ffae19231154d816ede9e2db31a16d645a17744de5e5ff10b473a478b40c4e58bd373d7cb9444ee009257d20247fa8308101964db8f53733e4142d914b9f8cba41abde9d49bd6bf77e96b7c731504b03d4aab88916a1da5850405a0020b8765753b3056e09e6b5c313e598b8a03cdf4419bbe5e949116fe6c19d32ad7b809597bdf7b9d740e8b6ad92ba28dcb96aeb5d19db2255986e7e45ffd3bd80a31f70e3461e02c038eaf61bc1bc7019c403f7b59cb379b54ae08fdcd28b0362e2bc90a1b5d1e8113715fc766a947758082e8bb46aebf1f1a88e2b15026d0d397e7f7b3bd3b774b28690502753ea4582ce1430c24a2a92f1faa1d9575620e2efc091bb176879ad8b6d847a944565e37d5edc6d470518659e8840220b974d8a6af01ad89f3cbe9c853319022707ad583300afcbab635e71de99948d978d9b0e9456415839162f478622767147636bac8afcb5d1562ca4bf9a76c5a26400b375533a2fc54fbf73b87780c44f5b1f47e86c991507b1289155bb68fae9dab83cc791e30ca6480033f741962a22cd04e813c020f8f5221fce3d27b55beb617cdf0c359aff848c9f170acaacd17404daf7356ed9852412d8037fc8a5112f6216444d27a730e68364c6fbfc0ae1cc68691b575d0ce51bea1cd7218482443d434c12924f52c8549519e9d2bef781b36178fd7f77013f6210b3f22d45921b9e6ee7f1e195e3ef562a842795f7bdd9b057d144b8a300bc82ee65fdaaf21fbfd949af8b44e1a1cc75aa6f294e91a2124bb23a9907c9508402eafaa0a1736f58763e6b85c21bd588387da0970473ef540cda7ca476d23abe6a6e398219b0ca0dfeb4e58a632bc74a280bdf18c085ebc67c385f0c0ca4069343e1eb4c1a907a06f813e34030f9bf3bcbbcf65489afe0912232aa7ad128fc2a13abd8a5adfec66cecc22e4f306d0583acf9abf467d914dc86312795ce4663ac6534c836d8dff567622b8e606c70e0495028c8a062ebd0d0319e9c060ae78540bee383a7a51c501ee3b5ca1beae89ab541b313ff83cd5c95aadfd2748df1a80fa822d09f1c9d1fbaf6c8ac27b4bf79f1060055bad1680052795e9188604e1540aa5979c6444aaa6224ccfa2dd2dbc6222779557854a204302781a0ea8ae414fc4dee44c5250b383ff4297dd44a26c8732c84dde21564af563bb2c941139dec6b174afa44c7c91279ee48fdc52686c90a9e8bb3a01b974bec3d58d235045fe7b492d563ea336a81379a8f42a76ee50f0f05f5a0596f211e1cb6da847064144b0046f7466070d8cba181671323282ae3abe72a6cb517ec710c2da2a7973ba36176ba196c4e86f938e02a3939e15e3d8d05ce92df5e1dde8be42a17035592f4713f76a19e5a7eb7121c1d6b7d88170655474195c1f988e1b6cd35a15f4f70efc38202f9a22f5ff99f7ce367a5c05c6c8396c99bd93161dc38efd7a88530dd7c9e68e787407331a6292903937933345a5e1ded0cf0abafb65a7197943b9ee1834c19acb542cffca8f64b0559c387a7b52f013550ce127a59647bfece4a4185ec13bcd9ea6eeac9e64e0972204964bd663e6d29cf3b0ccbac9e3793bc7ac3d09f3c79f68d8e6d9f487b8bd14fd4737f55d38752f1ff41a9974fcbdec792c9cb840e798c0868ff87b6c4faaa502c5bf46a3677371fe15b1c02c15f67575cfe7c84d3e422c2c5498818707e868a19c5248eae6660bfabff2cd53a1cb7d59e07ed85d1e241236cf2aa56c83eeb65635918a7857c563b23d7e2f8032955a7218f26705299709327a3f55914636449d1bed79e01e0a0f9128b455464afc937ad3c2d2e9c34377abc0472079c14769e2d9d695c6bbbc6633fc35dcfa4d69cec0ab60ca6f7d91e40f4bc2849a77aabcc3d9dd7c80b3451df742633520dc5552dffa6cbbfadb1ae4d977420087ebc8a3bca6728c92874c8d7775ccec6e5a57c6455b4706305e36e0a6dd3602a6a049b549ba264490ba2b3b2110e3711759d99f8d48705794697e7dd3d82f298b177677d7af7942ffde79bd80ae4741d05d6355144c891e8b9f79f2fd128dd3b9b3f751f2d0ebf63446b06b12a858fd0dd78d7d76d1e1d9aa6282069ef6e2afa72844da37d8eedcc28557fa5399a8f1444aa08f21732b0765555f2f160fce0bc7c6d786f32202654f3cd8b1cfeca7dd084944f0a09ac52640da49b31ec79076b03237ded146b73e2ebfdb47e42be60ece35f34870c330b4c173da58f5a8ea8ee4dcee484ea18db5f5a0b8133cd1d404faa333fd1e86fe416bb49987574e2ca2da294369b7ece67b1861f7aa3679026e32037f9506509e4ab41f0fa4a001e75104ca0fa9c96361ec1b8622836d8bf188f8f94e96c4aa914f1f1595576c7e9b17f9218b8eefbf7087737fb1255e751213b3d71988e61f67ad113ad306191ec8762bb25f9f975ba2dbb4d13c1665eef46cf73f78c1c70992033ee13147326cefea110ee4325cc27967640d2bbd303409134794e4f8040390e00cbb488144d381f24d99c21dac7e54a8e595f8a029fed0950979d6920997f4b1ef2b814acd0d2f1d35e5618802f9d51ede0e3b55df99db60c150c60664313df77ab4640a375437c97e645b27fccf6b4791d85c54adbf9a1513ac5beb9059cd2f23e8695610534c856ba90763f66997a1c576e41330ba8d10550ed0a80a8c32c76f2a19a4e474cdefa2361ec29c52dabbdd8c5b17f52534e119dafcd25f52ff6ed11bfd8d20534c56967dd9da3b05b5044e6b39e9678a2215e6a318e0fb188383ee107d5560593858dce2e1016f1cb6f98ca608fe0453c51d3fe9bd5a6a778f851aba21b401012274ca27ccdeb4e2413a3ccf30cc581cae657a3162b529ea5400eb6b832faee59b19029ee5d88900f414c33959dadf3f3e9d49fca167b5db7175d4c70a0ea670f2e40adad47577f33037b496dcb00646061313bde2089ad578626b3f2ef7a43dca34474e013bee239601854a41d269cb95656bf7ad1e4562d93513467a611496a1a84c6b04a2782c8610c9d611c8763a5d12b73c8b0f420e049c617f74e16425e9ae7ed4573f928890c3d6ccd4e8b81ccd8979eed4522d319ad6da4c96ef3f7632c5730c6169c9a236b9409103d9bbdd776858a1418d4367fc92e23068e0f2d1fd7bcd65cbc78a13f86f9bb51711de06eb0da7d63b27312bba4f2dbd537d2af3aa3fc282eecf504856355cbb8717bb238907fc0029a682f74469f155fefa4445d98006e652e7b8d9c0c8e816ec51bfbde1d5c9b1a581a5553b81f19cb41edb330bfb0f0280a72022d898e259bf56783075f5955d375f04cff01582f42b215c55a1ff4f5a009422cdfe03bff6689c5125c5f5f38547854db2129349feccc844284c0b5c7f4b253d35b1b7f57f80a9f6f8524548ac6e9adcc61399ab0f016a3f255abd9ac4d8d0dbf4942417479005c6329b62294505162e5663871ab7718d89c76e74aedd323d9b74f5b699f10f164b6f01eaf9e1b36ddefd92ea3d8a85b8c0a8e7ceed1adfb1d841870de20e5671f308463e5f04f2385b16123177fac6628024673afa2049e42ee4a888a3f21e9f5988a8daad1139dc2f5a720b5e8aac1124d46d374a6ff92b1bd8eac5444ec004eb8ada5e88b8f2efc81532c655bcbf5b4b335a42427c761d1b98be324766d32925693b28664ec5d9b1e0c500f1f378975fbbbefa96b839209aaea35e21ecd0a293be4bc6ca552b207947a939b7d1505bcef81bbeabb5caec35752aa7684330d7b2f49cc8295e8b6a9ab46fdf1bd8df2f3552f10cf5e7a3c66896c4bc9f0c8c5f0fa69e8b07ed7f0e72b1896fa27c9d781f66df6409e04c45a08e01fc1aab4b9f163ee1bdea646e92adb97679c02ee3cce9ae17625c123cf069c552e47f91e71e4337d6af4565e27db846c77c09827a9420836976610fee4d40d738144272e763332c1dfdad6473460ee3fce4f2f9aa7450a1262ecd3be8b2b22e31f9e7a0e4f44285f81786e289823e1b7752f106fbd3f661edd9d528a4c73a44d103f3be38481dd0258b66629d98a257c734a83cf7498e5011262d48bb0155c585d0db1d89e5119506d7d057481ff8137d086cfe253b84f630924a3e83e770fad0df22612241ba3f1c7b3952e18e9bf9095cd3ecfe2076ceec9c905ca7f0288f428d5e0bc9e49448e6e425c8224b0a52ec90616bfa9ee04485a3a4359f91e8ed4b79d28fc9442c4cf6b10a3962fbbfcba7419a0d931d3de19c460a4bc3634e8f5c13446fa8f6eeb5bc507b192c0748bdb9eed2446011fc30a0f22721cbeaa5f004e8182e0173580db840ed09f60421c3a506cea2da13b7bc24467f3a017eabb9d676c24d3b2ff4df6b10c46e5958d757e927d39b79a8dceea6b197171cb5ac47312dd73fdea34185553eb5c8beabe5f506a085b0b737f842a8a1f32b66264412b59bcb886463caa9f72925ab9e43ba258e2f69653b4786429ab617f98626ffc6c44f13c964e7fcb7d16e988990d6d063d012d33b4e6e03790d5c79f3f55e2bbdfda6544538b66429748d82d50ecbc53a8cf967958901ec5061139dcd2c227472c23fe1be88457d9940f479309099150405519b2673a9cd634669f7c7a32a568fa27a5087bc1bb561d741e00eaed52c6ae9a9f24086cc132c2dce1c85e2cc4e5f1ef435235cbfb82d97e45bd1b1f697e99a60e1964aff5a0577be708a738ec88ba82be423d297d257135a412c5273c3daa8250d7a38aa0ea9b4c99847cde8517fde80020bc63ab078ca12446108e35ce89354ba6ec862ad63856e08306a7f75b612aef34d902ecefd3cbaba323dbbaf8ddc7e9d06729fc2dd3a1a24f6c1aab1c8f4f75c5bd8da7a7edba226f279635824e41109c3efe7cb61736c92ed7c007222f5f791c8f8c46f5847672f343480d3586aaaa51968a133ba91c3b696f1f7434e863e282788830a23d088177a078aad92a0a9e389a572982345be2475bc15b1c62619a3da008cd76c277394365ae7436e56ad4996fec27555efca412c42e22a0466488952e948538bbcb819ebb72d3135cd134bc40d1737acf066b10d1ec33893c7194d44ab4c0b2cf0d40d2ca4d2f393a47a6e8338f77b930811e8bab85f49eeb92a6401ef1e6aaa7446025b9c6f07125d4126670ad9adc2976a5c97981cfa9fccea623cfd25fe9eb78c8e0b1667e81c581607f20b343a961ece81364662b70162e7cc388e0933742b1604ad9b34131c45578786b29dcea81ebceb094be6fbde2b811696fa1eb5b54f810ad5a37a24bc759429c7898cc65307b41ea3010055608764b5cac9fcd1fca54c04f5b7a07957993a73270887be317a5290761e554032f7013e66862a2494cce587a0503d9d97f0d8d817a7f512bde706c504ec4c48effad524dcb70d3a2816dc074805a81dd84cfded2bf07b6072ce5f30d2035bdbd2235eedafc53c6f21239e185f307656a2edf806d67a7123da90aa686fec0a75a3d10d1d52493e501a63aa1f78692ef4725475d9a99e8cd96fee96d0211eeea2bfb47e1866ab69796e679e9106384863e120f5ba17d504fdad38a31cb8046eef901e00834f746437b7afda21aaf6591159d3d64c93c6900d1cff3d82774511c8bfae62c29f2cb537609ceb25b95bb7a956ddb5f5cfebb49429b2e4c5f1595daab8c5e37ab84cb2e503bf5031c3b10a8862bf033a0eacc90f7df4373ba8a9c911f5f521003d5d03cd1ba797ba4c9eb83b07e85cade29273eb642383782fceeaab01cc99f790c61e5c02b62043d68d573da0fa10b5de251bc486c177ffd92118b266bcccc54520791e639b9852d4055e0ce864cde673ed3717506e83275758f9e49f3627fdece48a80c8a85e5bd78f332528a8e2b426536c404b8b13a30ccf04ae15d93a05da9af92f8c6ce0e353837d12fc370da377e021fbf297c7e77c0baf6b55067171a0ac1b773969ce7ddaaaa262ddaf9d48eb2bde96c0250e69179770c8e75e7cc5d1a088044a2f858fcf3d397137732ff8f28f189d4ea365ac81eaef334741aa86e000b533591e949dc3e3a8dab41214482092569bf8a34c262d8e8136ff4099194e552990c0b78a2c3b16871bbe1d08cae7ce2f0f58a5506a8ceacd4079dba7018f166bb92baac4bfa74e4a90cfe47bd5caaaf863d919e0fe229829ec319372e424bce1f8f438d2dc9b0369f66418dc0d4ba1493604719c35810f2d96c0d88b15a1c122fcb51232e778de7b99052a97e5ed5997f2755cd0b51ac85edca24b3e3a88bbb520d8a77374e327e6154d8a6de4223c7b35763c2d01724c242a504c2ab74c150ef1e96903194c883fe787c89c7c7cb2595bb1801f8f0a13240c555bcf005e65970c71e760292767ff7c5e55c2336f63c8e1a1d916c254b5b50f2c0aa9ca4215e3cceca32949065f9b603bb27d9d7cb92073b197a15fd49c7d8f3ec9396999ae8bbfb41cbcdd6bc79a2faa8f0d1f273b166e7b5c5dac2c4fe4291837fc62c7a7e55182c4997aba487237152c1f3cf152114e69979a2bae386f4942a7714a5e9a972eb32b5d95945aca13261a127b6da687a006c9e572fcfe958c48b81684b0ef07a3efc167b26c66f84037e9955eeea10fffdd73de067afafd4e84ea8aa6712dbd5d73174645b505935ad51af65c06ca10aa4815c25abac5ed2ca1bf1c2411cf2eb7e7ad77e3f0af11af881ed3f7488a105be13060e42ee80b9309866982155be25fd7f48b01c1dbf9cabb75bcb52689a5713344083769c9cf1e3700e154fe5c6e91be7cee238b04b23909a00f2a13113686b8d146c8ddf3be2ab49f11f12f392a09f5b72fcddec1e186dd3e49aab0e95a08ec589b1d0dee4f44fcc189fb4a7abb352823be751f9bfe10b090facb625a7674485a73a87c21f8f99a08a7e7b2a9888fc053189dcfeb6e832e58a110b9ed125547577effab2741b4f6d4fa2b0a4e189658b5ccbc8238c94a90e5caff2a29b42873c00b970d76c003add70f59a3c0f1d54bdc5955b92c84c3a2d8d70b2598e26a5834b7e33588ea62296f45e831ba9ab924373d0df70f27aabea263b95ea313976f15e28895e6375cf40e3c4b169379de8c46e629ae89285c5ec2df7e17d0ce4c12f439dbb1172d6088446116d4d425a1be8bf35d51f31d550dcad8edf3ca88d50e402c71098432f960a242cffef514af6586d30d74056d21461abe7d74d8c9ee9b9a18cd21c5ee9427985fdaf78ecd540bc803aea718ae4d92431ea11d8407d55562ad647c44c6dd279716cc5109b63c0bb013d54da547366cd467fd4064d945c62a48cb9b994220eb4f16188dee75c3ffef7205ea53ce78403f38e6afe3a49c58618966e22be6fc0cf0cc4410b5728852d6acb50f7caa8fb6e3fff19e98f065a698ddcaf2852beae75cb7d39be742f5aef622572fb871e93b732ba2aefd532e1b40b45c3f3d976a14c3474b520c4da86ece8180bd6fab11386d4a8e5379334230e9bbbf4aadbfe61fc52920059d18fd0cd038c65b3acca45822eaf91ea5176e82043268876dec0b62e2abd619023b7023abc67c6b823cfef5447b8772f985ff7910d6cc87e6c23688ac6de1fee40bbe2da1a92770de92adaa427ace02fee571a0a0176fceb0c8f3eb72dde839ab201395625f5c0db8641ce19d7711212dec61733262c6ce4476c025e67a3d5bc01f3ce55e578e84a807e935b5ef156ffed14b7b384765f92a3237a267d175d7eb3f86b80630439816148f013c412f31ea5aac233233d1f1caa1a6fb8762162065277d67fa67ff9a9b006aee912be33988dee005a0c67f2abe4baa8bb5aa82e7c66dad8f9b6d371e9f62295844fdc5c952d4939d146de2167d86befd831960709758839979ce6e96aba036d8d8354b73c0e24343fd988f3770e960ab704d236d509e9c1005fa2a9538411feabb60e8cb6b7e5ba4dce4fb2040ea1c2ffda440207a96538dc07edf8cdddb41087f1f1232bb0f693a32c1aa43561f6df58bcd4b5c7de6465d59db120004b546ac83be7c3c282bd87e8fbd013338efb296cb16a963f2e4e119127d567135859d5179dd8b5a3b4a45ec4435b45251d1a68e0c1eeec94248b04b8b041162f8c2b191c1eaa42f7ce11dfe10da2833496ba635ff44800f1458306f33ddd747b6e32fe7ec646b0e6596ed3e4608d14888242e38f53601a7c1b9fdfead891cb2086d74ce69d944797dc22027845044248691cb018e51e815d2d455644884561455c80cafbac7c5133df953443c3ef539dd1af92a3b36b7fbd03de35a956e1801379974166fae714e1ea2f31ede23690ae446351d8c32d5ac426d342c3484d6eb2648279ce8fbbd9ca8658c01faac241a449a0b45e1f4e5b991d8a463769717349a5ab3adc74e2e8153a78ab812479aea669ce84decfb4ca65706d08b0be35d900c5784c38b04289eb8ff7b8ba57441edd2a5589ffd949ef4fa8e352d45182e6004b5376894bc504740c3db0734c0cdb70179e8b6a47f311804c53ea4b293ee471bfa381774e52a0d739b25a5309b72b88b50f52c6219c7a1fe42799be4e53197baacf36acc0d0a73d9ebf8003982e574d8e11a5bc6d2b7055f8c627d5c9a7ce4492415acda9295fcdc4cae82a015aa6e6290d4ef435883c4a11985c37a1244af70260b885124411b0323d5b714a22627c0e691315809b2625b605008ddeb1d7ba7f9417790209040d707ea1807d6dd136c68fbdc8574c750f7075da7e8935bbb593453e548160820d07f782fea1 MD = 64fd89d0b09927194001a751b742427940c96104d7bc37489852000bebfed61055d2ac26076d5abb8c34fcee0d0fb3e0cb99ee1c7dc35d3bd35350c9fd1b5b52 Len = 97648 Msg = 00c317f6b591269b94cc28ba064e5f1ef661bc877bd3a359b74dee92ffe034fe3be14bae90f70ba63d7255d6c3de544c49d803a73e21f0cf40f13fe33d8ef173d81c67f00eb7216019bfcc5694737c22e1c23645c85db12860115d0d3354a5459d1e71a375faf032ef5c9423c1355e0985c55b495fb06fcbdf5551f6295bd7dc538c74b10ee7ff8289f0b523924b826aff897c9a4c42b0228564228866ca0fa0c211750121a7d6b9ad2438404fde70ab15b7a022d73aff941ae7d8a934cad6f9b1537e7bf661fd4024a024613f15b13690f7d0c847c1e18965857c43d983b24fe9fa9607d43efd7db60b816eab19cc7137f01374e6fee0692fe7153d9e1c2e0a33afc68d05665cda2a0e584edb1149c6d44b710efa1a839d40b4ab7fcbbecf92551a15f5cf00a5be4a50b0eb1726b19c2daff27fcc3c528b609547f1a8901f4f17e28b277b345d91dc7a912ca7808a5a0cc59fada48dd69c5732ef7b7dbba5aa43af300c502c0ebaa93303f9d2465f6a37357f81ca359638ec32ae059166e9099f2b0d8a980d3fa379240f3ae2a1b53376a69ae3855b1bc8e93e89772dba74d5f5fc298a990279b314f4bcd71db8161d93c1f9bc1e27ebb214fd8ab999dfcd770bca8cf59d304352414c13b9ccb40990542da3f2ddc290603518b8b31dfc7c55a93e3fb1eac225e8cad41ac636bc17f48392a06f0a54923816361b4e01390ad999ff49a8c8dea7dd7533dbe7a5f9c6b1e69af919ed0477a47e00bc708cbffe6aa2b6b2c081ad529a0b125e055f92a12f46ebb5dacefbc90b341da20207b6e06f8b0b83e35c56ad855318a906adb02dd76a2ddc99f4610fd50136d5edba4639521da5c3f8a001410717eec6d4d77bf40f1c09773ea85dd269adf35e17ed958f7a202d7ae796d894891d3bbd55251a7d4022268db03217993100fb446ae8ce6d4f5c4ab098860030712ea89473dfb650d3452e26d9dab8ec94c2f78fcdf217583998a56ef2b7a49d2812dd55144c76f62e4dc64aa0e86853faba8e48275598daa09ee6bbdf73ea611791810822b583f6bb029802eda34e57cbb1697662577b7aec34b4a04700fa06a5733cb3846204d8e12c4c55a854937f706f30216541e5c18523b72410a7fd14397fb860229b222507928a4cba435e544fbc8a51185b0035d432984f23b01b113d7e9a16e4a8056497fdf9ee09b8d85dd1601f0f63ecf4603f2bff2968637b8718398ddeb2d0d41df83541437efb29225e2298622e3ee9ca2fd493bbc70846fd327537bf745db8d892020b530153782b5fcb9d53619706f90df7fd0c29e6a3fcf3fd40c11295d81ecd2cff277b0aed013a23d5e9e44073773f5ae5247446bb0bc39851ec74c15d76117ac4c6d266b22b59f2e92c9f8159cc2fc6f10c9270b6b20a0d124983286e69c6b50338f0b0ec31220080247ba1e07e4302cccb69acbb7930252adf2514347e54a56386bb2fc69cff1543da5eea2f17e5d81c69e342f2e99da842b643cbd63d23128db71d2d66f257f8da5532a26f1f7c0e8aefe7798489b95e01d7c6967d2e9bc428d3fdf0f4be9272ec9ddd12c71c706dbd645c9b99e1ed0e104994bd51da2582dde342c19985174b21bb4982609828bd5ed02cee587a9f821614978879c8271654edd6e87cd1504b23b65c39611a0ec6143c3ebbeadb3980bc41b53f1e800b4634fca0adc729a43997960081f32b894f88af7a49778c21d1aad7d829678b37db251588589f167bdf28641ca03e5201226131c8e22616c13d87dee78f7d70159dd14276302e1f3e037c2797df6917de0548ca10cc1f007f8bfb5fcab987b70b53dd8a527e9ccc536e3be75b869d0289c1e5833a508bd2c585b06069efaee983c7f4f6048a11a523e80eac4fdd019c681edf632eb69215faf14becac791a8de4bfbc8c759cb43316399d7f5b2cbe6ce4e3df72d5465b50859877087b9ef22b9604dd568bfcadfd95288f6767bafbfa66da8cb915480f0bd042dabebea85f4b015e005c2ff2258b067e8c6d5bd0e1cf54c98f3fd703d5cf42b61c155ddd88768d94cda54ac54466d2033e981fb6987217798f0d04c0d62243bee61640869633a270eb39c2be3115627f4af09cb4476b18b2352982c7398f3b20e0c74feab00ba8b80320812515201dba5b7db8121643be3b299d3b60279b92a5b1327353ff850735bc626d4217106a7b17485c172e8170de127115d3c8d0b115015f9207aa2927afbf08705c606cb38c2658710cb7ad986198abfa6743b5fe387a54954fda7f70eeb31a71bc17bc5fb331b5dd39d8509d8d6455d165c1d2e2d6c21b6573b7104bb9419e57ab6589d6b9e0688ae6baf1e72a1e76821569b0c6b681bce8bb68631ed9119e0c6f72597f66da785e5b8518de006e17f4bf64d610a1603d086f16005217ca21775065b7c481c8ed43df604dead6fa3f11abd9cc2a5f06a8acd6e87050391430809866280cd451d020bc731973766df6c021f11b7ab81d04bc39073a7f0799d20f8d9f36c0251e28dc38e703e1a66d44e968d44a6a744a5a1fe09ae6464bfe0f0c793568463dd6fd619ce4949c2fa23274c9a9e1605a37b1bf13cafd0fcbeeef5fa2534607e42257963091520cd9b6c74a8c9869c6338c11831abf0641500f7bf1511f596be1aa3f633b17c7996b4e0c51f9cb6903c7f083533ca08943a209baa8cdc128dbfe15bcb0079e7bacaf1507725767697fde0c0d17c3950e7f8985b56d60623cbd010cd765da4df5ab6bb0c296f097f1a24088bab7f5c81e5ccd2b7229502a1b7ab336976bfd4cbd0068ca45a30a818ad4b40b8f1c1b5e404235a2fbc2e6404f7bdc3c04a8b8c45b116e099683ee4dbb7d043d962c7c82fd998b9358226acd602744c5260552dd57484515bf1ce4240d05f6c8d6d0625adcca95a58f2f24f8d4e5b27a066a15be3a0cb497c858332e07d4535157f1130e653b1c81aad35bea351ff002abc047908cc48437b71d25923152e2832275d8c72055e7ceb0f459ca0a3cc4071ded317ad3da7d9c9655007913e86d033e46f9ad9680c035aa7c64c1dca4f72e65db1ba599b5676f6ce70d0a36fcba7cb34abee74e256d5e9f52c5f732be51218a704c3865bd0a5742bb946e21f893948a6b6f9ed0aab7f0975ec49394f4998894960e5cc05a2efd1fb9ddcc5c42bef3ca8f53f9a57966949b88a8be8aad990a8c34a73931f49a080bc92f4d704403427ba0b32154f842f1b1b8bb9f9d521750793260f640f317210fd3d419e4642c29a585d73d659112b0e4d6435f5449dc02637781bc75bf6df031bf1257400cff4f5126077661aba07839ca892538fbb0c752ed52b259c0641c7b75322f0da3465d876b8bf4cfadb2f2ba7cd51ad0d05a474f7b1b01735fc34ef5dd7bcad191c7fa4d3caade370111c56ed56f65a431a42b610923d04b02542da6e03750173d4bcfad81ae5c210e859a5dbb9e303c84541b9180b3486a13dd629664ace964119984ae22dd98163cd6199017aba0213233bee6c6139157f82794cd5224bb42747bc0580780b79df3cbe90ed2dedfdaa409bd68c48bd29a1bfa6c5493e5f138ceb72bb419dee43f9b2db3dfd27f15ef419ebf1f626333bce21e92320d37b1cf88166ec93e4145839cc41e0c01d669e870b96d1489e2dd44b75aad6faa64238d086031a05fef02f15f58d39c462b044e9b246f4e1f51f8ba0177651451b371fdb75d1b3f653144114ab1799788c50ea929a56cd50df8aba7273e6427ea6bc0a4fdd4d5b0364f336cc696b906b1edae7f82050db23c1f1f9293744fb35cd53b0c438f07fbbc91f6893cd13bf0a8eb0c5a0e0bf9ec930e7c03ace4d1bd913907bcef545826dd3fb6f01228a65d550751c13481d88bf90ce982da55904f70df4f3c6bec703b83a09a2ab264a355a089a53d5f2d549858638e98858e3470e10e39151d1ff84195fdcbbe824dd9e171b82f55f4d91319975994cc15586629cc0fedce6fb49841fb9e7034ecaaf108b0dd18915c4bbd199e3723a7f27bce81192b94efc875f7429dcbb215564592d345408779ff4cfb9d554562b085bf1380b1a756008f28be4c63ccb9e82ae465481829a59645a375afa4ca7a6f34ecdd2e7ace5a8a2e96946735e8ac35cf50117212e09a6f971ad2567310936c68c9d6945de7c9150c87229cfb69b385ad513f5619ac8d8c5b77ba9baa5dd3308a1fa4b94239ca2791c310f29d95f85e2cae97fe16d7a676fb83d78431fa654200b6efa5120d864a2511057203b5a04bb431c071f2a70fb4dd06ce1cf02f6f2a34566061b3ab2505303aa9231510d6d1ada063b79365edce6bc84a68cf431a718cc79ef40f5bcee01a07a50dbcf0c07a7fc427d9e3586b4d0b90f172b7808d9e72d052660d65a9644b3da138de9b86cd9265b5dec9caaeb827276b418e2cf1394d3b24c09410df182ca744ad645a51524f4bb4ce2c01e197265661dd3e906dca85cebb098ea69885230c3773377549921c3dcdb1f6462a7370e37b4fadf42ada8252c049e26dfb31993322923d3495146204a8900ee1b1d26d96609ec59f4ff0ab8eda8878ae31a6f7e5ab1360df5e608a68ec725c1a9f3f8539b9d26cdb05956a4cb2cf38b0616ca3ea7dfd87bdcbfffa314260c8391c3f20922df48cee74502652f0250abdb409070a3e589a1705781c2751613a854f5ca66b650a0c21c3a948693b93d61b5207890d972c803533535712c27d9a47611d7f8a081fd4bc1b2836593b20841362ee93ba2f82235f7e1912b93cbcd0c87a0a13b7bf38cc07a35659ea99d4fced0d448cdaaf616add0e51b7e56827c44dc0accabc325fdc4a84ba19e4fdb726f17a93dc35bed23df60a83ad5eedc55f215e8a0d60089beccce5dddf0e0ed2ea67d262ea9305dc84f49a385cec759f878b7a2d426aeaf5e4d6ef451131752c31963c3a20bc2b87271de8f62c57a5bb25d23d1bd3a37f73acb0c97c1915dacde1c7e1a2e577d9db0fba194885662723223fcede26d370202ca29d0a5d82e3bee442e822a18eb7e1221258b3cfe3a3df641a55fea5c264014df4907547403b06204f7a42bdc76ca0496fcbc17294c0f5d5abfc01b6370420f5edcc473d1688ad7f36bf8b9feba1206d179af9d641276f5c39e971c3fbf8840dd67907a9ce73bce83ede84b0c2fd6a7453eee363b48054e00e44d533d7e7357ef7be3ef22ea33a42b000b658132985486bef0882b472ad4b7036b66e90793c2e98c47380ffc12f77d44ca700a8cc79cfa7c4ef9908a58184a8e79bdcf157a00701b32ebb0874a46ef2ebe10e478f4ff34f96211279c2d873fd7e0ce5c12969f07ab2f80b13659f0f5204ececb91a0e9aaa8c2453cf71bb00b92391f1c7969fd04ae957d8e63b2b423cc04e00c514beae01cf82c6d25930132200b368cc474b91ba81d58a4b9f4deff74791b4352668169c86c2d149234294823af9b298e4751a12a2fa8907390ffeccc03c6fd0f713bac3da6ddefe76f66b1ffcec37f31423539a734d3de5b078570353d8985d30c782bef30a54b7fb5680426c125fa57f5f24991d560facad90e3e42aec99a5788c56d4f8219b3d5a69bb32b2f69375ce307559c79d6523d76088b66a00d970786b1e4f113b1b583a370539f71d392da99f2e209aaba814d7ef2fc33e9dc085d76bc27568df3bcf43c9449d6311bb93b7b23737be0741455446c151cc4ab6ae3e952a8f2295666c1e2662a71d597f70a17378e65a39967ef76b24a93c8f23b155ef3fe46ae501f57356459f4e7def8b0eeada7497ca118968684213b7f46f57c384e7be66587533e962d7cd1d0571aea71e432b9c41192d4e4501d66502026831590b633e752aee2951fe78b37a6f9f14179c519226153151084b3c6d4045ac4678941c1bc488eedb2ba4ea37645027fcddce2fa0026f5e1abb078bf7369eebabe8683125cef8faa6f9b069d2497c0e0879c00def5b8e7c51651d0c2d6d76ec07b171ea831ae0dc32c20a3eacb35b1cdff25933a6bcda539e0f7407356c367803dc958f5e31a95a288e9ab1ec295519295083e8eeaabbaaa7c0f6c437bb4457476fbe67dd99bc3d30654809bb34d2cc909b2575efaf994a17808a8a5ce30a517a75d3bb29dc7f4cf150fc90405b3afebadc2622d052dcfc945718a3cb6bee2d44f3bcd369815c5114569e8ca426f5774f1b7037ba1cec86c64e8955addb5ab54ff361f7c611ba12408016460e1d6bfff85eeafcd49332b0576cc3e92abcb5af407caa6f681301591ed54c06a7c9045e5daf7cb947411444ecbaafa7699567e4c2977f82760f98ec565d281496b1295b25150eb53aaefb08303e35d693eed81c7b4bc87a188ee9938f2093b7045d40c0f8998839d66050c6c8023ebfcf4f701f13a06d9d78175b18712773381956b3538041d28d42e179445f0eb0ab464197b4339e5634bb325642a679b2dffc23e8dd6217d5f9a7b9e04b9b6875e0204bb5a5834e6b860c6742d8d31e36f4d64c4925492377c52d6eeba2241a73a784f632b8aab795dd913f88a3a31fe9bfce5a3cf5db6ca138fb8a0413a32c94479ac976b651e1ba7f72418e6bbb83b1880dd42b13c0fa3c9b3a959264c0a4be0a8b4ce9661fd5c3b5d8f6bdf7c6527896bb427d48a1d52e361115fd5e228cdb367f07f392bd9a99c7ebe47d116a942532ff2c9a5c26066151a994acc972ebd2149d83fd00d23822fdd295377f4f52a0a4011bea17f694bb342a99096d57ca8bec0e476d7907b8489fb691510a1e94d134ea97d541ba872627bbad7b117a30ee06fadbadc50421f2f4be5e357a7f60a02ae226c3a119e7897184576a7f8225e3a988c823ac707b08451386499719c0f5cd10521c00bcbdcb5bae1f3e7d18b2521ee09539f6f3cf71dadc91f72995bbb8669da248264a10d62d618d60d4e4dd23ae2bca566a362417fb4205a6f79a59d13db09eafdb6ce9912fc42a364c8db03e9e91f0e1d2e182e1f06d6cbdcad1a3289a72cfb9e7ca4fe4a8007d29acbc338b39398e44f49cf1b700844da66ae2a0a5c50bbccf110b4ab7e23c0ea2be186df3c64c2ce6980d7a8175af31c89f74593105a2ee5722d8e2f223a16607484a665c8cf1522f88df242795189f8b312fd4b2a45febbbe3d8207eb4570cc113f926b0d45189878bb8f892a9e41f57e7bd1b12e86b3d6119b40b41dd858839e7ceb6d5e69358566841fca8f83e39948ac336371aee6bb38f13ac24e55463d68b711db50ae14804e8213a52cc4c76aae2ec2b0b810ffe170c9e090f16eb24ffc98963368860e0f9d300ba796b365d02b7dd047467f77df757fd2cebb673531e67be9142a73aa89ef18883031e257702d141c95c12ce70ba39d71d9e0e13799a2ebaadc0b1972859095f9cda2d414a13f8be80aacbbb60c87ad4e21266f41ddbe622c297ec9ee993e52d10e4e0b1609ef3fc3346dae6d489e29d852d063dc74957a1d5b1a17872b54b9be40b7f9e41098ba4e9178778546538da0ed93517ff4c48ddf0f5174c4b2504502235512f73bd885eab071a9968c4463283fd3caa4e4c837e1a4b9843fd4dd8f5d24c9f8d8023b2d180fdda70990ed24eee81631d3bb1ce2d5c9b6a850f948e32fa37b1dff0a2d0a670e211266eaba5d6564cf2984fe3f292bdcdd6390961f0aea4decf4e49a1ac85839c05e270038771c4483145104ab75445ca2488741ec412d7294102158a0c14c214fecd257e40c73f5c684a084ee41bfc789c99d632d3059c004e22dbc4b9fe3432460f17859781cf70decfbf584391ebc08695ba05e530fa4b40d624b77be9e1df24cfce7e55477c6ddcfdbcce9a5c198a29a3a5ffc23bf9f25d4877cb197ed201df35d1d342c04f39aafb871ab2248ebfceec218831cda1ddee9d5c685d640e81c06ba8ea26954fbd90f2a8a253925345bd97b508fb8efbf53a005bf60d439d480f96db2dc96e85e1d60aa7d0444d6f063ecdeae7e8280e208b97fdddf2c5883d14e1f202f3f1f78ec36a0d0b4ffeeae999b6468dc040e247278ac985d490d647167276d36bc9afaaa03b62ba3a4dcdd5157953624b818053570248577b4c8f505f71ef07fa9cb51eb5a42c47cee11fb4fb3f99cf5190ef2a632700b9aea2bc3f3507e30668130fd34acef519d363e86d932f9f3a991837b693207b14373964fce15cdc387dd5c7b0a7e14498117a30e82572ed0cecbf61dd2f1641d1dcbb8f6eaa976105008be59c1404a22c50cf000df92f0bae122d74897e30d85666cd457fdae0fbd5bbdc6f81d85f963d570a5fc4578f8286d30b78a1c997ca0d9c198f16b861301074716f463c1ba833efd256f586bad8fef701760d58729f5c4847741b8b3f8b1ef4f1ecd388606076e0cfec88cfd7987d45b674b573eaddad30fffd779ca591670305ef100455476ef2aa29657a0e476a86d37d8162270e671de8311033b9cc5468557fe5f723e484ec0b1574cf896f2f82ff96596c50b9f2d8aa18cf97a3c34bed88a43aabf1bf1e9899b99e156d973301e3c925db8d67b626eeba9c128cfeb5584666f766e861a6bcfd1cc996e548decb271dcdf5089f1bd25c2060ea9c06fb7239ce047130518221df46de98160998a7729b3903e6e989a29b510168fa62830307e34914f0171c8fe540c6642b62c95f6c49514c52cd6860545569d4cf9ab7d358aeae96513cdaceba1167424adbd9b9be31fe1a72d420d22e357e764237fea9d5351c417a4726a504c1ab799cfd317e105b26b36e8519c1d2f82a957cc0bf4f2582795b93c067dd6c597953484f377609cdb2606f69bbf4e7a6547ba4bd648bf19daf2dc630043e99e0b816765a546852918b699d066f351648e46ee3b65426e18ca4ff391e6790345e520b50a4f01d93af97161fe79b4a07e4c1b76134f7e89c5942191412f79be4dc2e7afbb7745e732dc0af1e91a9fc6185d59e45beb598cb0c6fc280941c27526034aba21b46f19a15ed7bc18eff13cc30076ab8ddf60015ab1543a52d3efb25f54ce56b56d09eb16f06c331640757f2ef3f65e11822e623401be4aa64c5e006a05e727ef2792f6041f2cf959e279078c965d5e9f7a1139cd269edb7c21a9e9d6b52980477a86a4e959be716c1c98509c76203f702db4f296ae7a6f6cea3fd915d10a0256bc7192472e853dc5754ff4bef1c3734c23961720f7d578d10c9c58b7e81d208583d0289e1c15a0ee830c6e64b7cb9c7be21131ec91347a410f4bd32d78b75d6c572ee26e80e46d4fac4a283e36ad0d97efc2bd6a091bf64578dae2f6f17d3b63bcea4a392b75d57177a5bcabdcfc5928b3372419ddf07f46cfa60294f0e32d141b9eea7e4a5e8bfc6b9b862e391e0196c2cb008c7e5677dd7a59bc97d56db4f5f9b92dae8be2e3490ea82f45d9a6997a951add2278c272721f427b703d916571ddc59e5a5eb79ddfb73812731d0a833cb093048c3ba8e19d151cb9ae97d2a1104e40b7023150fe291bd7da4691de51659bb0312a558e57c6f23501a352c61a69b1b70226b22396cda303e120d686767dbd1ecd7d54f747783d27fe0f1cd013e6aea4fa484fc3fa35d348b1a2399774fdab2b43f5985833396c61e9424485300fab7729d768969aea2322e64b5975df6ddc623f43be45ad82f66f5ded7859f15d2eb9fb64ab3ffb53190ed97ca4c61836c75009b8353418dd71cce64116b2da57bef9f97076048e293b8915b6b9fcb1f0f2715df37b97f7a15506fd1dae444d77b2a3ae7b57a8d5b4f10e25a9f78e2f14f44286561005dc87168a1cb3ad82dd35c03374f5de81648ed02a7396ebfef22b33402d8080f239f73cd2cfa3a2d31c2a5e4607605922bd2f5f5aaa3e05c3ad9c45f6bde35ce1926a4e7d808e1cc96ccdf347b05b8601421f051b13efe380b3f082e2a1fef2586868b1e6d9a389da418915a51a37b3a185c667d85b2cf39aa7c090709453efcb4e6b1dbb25b4588a5cf43c0aaf9580881abdde3eea85b485eb74f53cef52a3be96f9c8470f01276df187ecd4eae56b29537dfeab3c8ab4e7118607b42d9bcca6e49d6836f04a74d9b1cc8e9046b7d209d28f3fa9eb9c63129c8c6e52d99fb918b9be73e773d0af72102ac7c95d8d63be0a6a27b7524b4dbcfef09fb57ddf079878d551f5043455ab9f3afeeca9c68e9a8d872d501b07e32aab4af24874ca168ac49aa8cc1bf6060ab175ba869603c133be6ed710a062b20044042c7878e184740f46def945961f03e9537103acb58a2e2f99bb558cdc38c23bb4a4e1d4c5dff8cb927af8fb852f1bc96cb8f0786c67ce539030ab2ae4f5d504c4d20122e7676d8be5f347b853a4d6b41a08e96388e8b8ccdadd9e151d67dd31bd5a52ddb6d966c2b9de61f6722eb94bf3d73b08ab6b51fdd2188ae5d60d3f451694538fc4a468f296a2d450711b37e372aa71d2448e4e593e881de7bf647fb169268f938136d8ae04c71b30c0f8d73d2f093a5ad4bff2715892a3c529ec12f91d6763a38d2f5a577cd1a321f2561b9b8169e10cec8ee2d8b8ced8f8b6229daebc0d7c1a38ec5281675908ae859179910242f252ec6993f1e7a319ecd4a67424bd5f3562250c55be7cb3b830eb5975b02a3b0ad764de8a5f5d95d32c15d64afda9f33c35d1fdd860f5784e53a41c947b81a88714d66c3a63a34db130ea3066bc0a5fdcffb03f5f0b9a1d177130496a557111f365c17128c121012095d2436bd246fba41a504f5e20b328b024206e4bc0a10ddc74a6abd9da7f76adc56e9ddec2e86d3e2022bc5a42d911b4e6e4f9dd5f7a02aebc067ac2221704b53a0f9e1410871ae7abb7f4e7e4846e72340e8a73846486e696615c762a8041d38e45c2c04d7b8b5d1770876b884da594960d8ec2d2091110ae37cf7a762394851c91ba47dc6e44faedfcf269908d4d887752752fcad027b96e0a422377a9a3467f83d33f3fa7ce3da9adb476afdbccba727ddc3ec142314d50496315b16ac4a4118cac0b09e08db1e5135bf748a1b9c6f200326467e7c458ef8590d5b5ff9f0a9d2cb32fad8109e40ace378fcd877b2a805a162531296748b63f59c7f7c088f65ce47731ad01d940852ef584d0f5b751a81bd6158f9f80b92ee73c80f9561903eb3466a58b0b62540ec6049ae564c4d8c3a610aa05a2a706c41da7852d48d59fc2ad0fffb9d64b9ae213f3266d5d4a2c7d89445725eb50de1033294915f135467daee1a4dc1aeb81c9a93fabeb57adc94045ffa152c2048b8dc8303145e7be8466ca7a394441c8a50ff648bfe1ec663b966c811d2eef38bbb76d6af23fa4e7c63870482194e369712f7bbcc6e3741a0fea5da73f1c9b73db076327f065a127a84d40ba0240585482c2a9fa5552972f92d699a06bae7f3c56087a05b04a8524972fac6e3fc949003644118fefd1be2d70c5c12b374702f8d934f272b67099351f5a23d34eb21df3184e42ebfac3617a365244963698cf3fc1076cfd775a75ffad474777c37d5fb3b52baead1aba29bc3fe6947fcdf61c87aa1a5a04877aa3dacd9177ca129d76b87976c531a4286f6a19fd415671f1a356f0c84a364b43ab6cfca34548d0950b77f1aa17183b80aaea3120cba8d71ddc3431abadf14767d51cb707208261f67688aa5024df457584d331eba3e551cd2f85f93f05c41039e9608937a9e56b245050ffe37ee5665955bb88a86aaa66a235f293fcd23d1a5c30deffbf321030c111678eee75d8f2bec5e9a1f17056aa1f57d0ae6fa3baea1153fe66f86961773f4242c3dbaa089f183e040a51657880a73dc6b4f1eacbe42bbb356b9db07793016b693b35ac12aff826814e42aa8e8edc203b243e27febcfddf1a89f997b118b9e5415186cc75c9c127f7da3fc0172920d7a498aeebb1b8fa58242ea69fbc7cbb4861a339bbb06115babe3ac34690e407aca96ece96838cb39ed8e62f28e833a82d50acd8ca410a78477aec579e9a441317a03317b8f29ccc1baf2cedd3c2d1e2dc84daeea8a61a3b56847b773881cdb5b12f6204d37d6d76672d8f7d10dadc0e0e84b9e5b76e35018081449cb4e5e57201ad982076827374f9ca7a6770aeb68c1bb6d65876e7df5d2de7e45294352fda71b131f512a0432a6c0c7a1773ad05ef8cb19ca187d17d90e72ee713470e114199d0cbfd18655129066a0b078a642e9aea0b897b3a89a45f24dca9795dcf1e69d262c2a3283021d37179a9d22542a520bc0b39202f9ec81a6f67b7df48f6bb95c40db271a2af39cc35a1d2f1e4e71e236b57084ad77f6d553f56aecf79238d67e728180328211d65cb8912d149cfdde580759345c2aa08921d3feab49ec3e852a4486fb2193421528b85e60ab44b891983cd56cb61bd3e437179e8490a5670d883f52618f656f9f52e2ec908c5089421fde4bf26351752fbe49b43d75c69ab8c1ea4d79260181be00bea3845fc757381475258f0cd46fb3ddf2a79f9f56bfccfdcee00d8b6e5eb75bd5ec06cbb20cbca087ca0b59adaab5bd99df72b75dbd92637171e369b4f0d58aae2ddc78188f16eb9ea22ef1e30d8085c6c47e64e47e521c5d6ac566dc1d5fb5d1cfcf0f01c88e1c4115c07d7e7f5b5e01be8a4ff1e9544f1a31792aeccf9c06c73ba738769f6c5cf98b88a487ea8d70d335601f8fe6df252e30c75eefedd5a317d82c9a7dfcf7d24c6c4f0f05355fe2c391c67dc35d3cc623cd79aaea5f53b4490d26de21c778a7c420dd65004819dd5a3a85119736b459817255b5e70d5b62e6445cab67e83702e90ffa4f810b03881e98658212598d07ce862528eddf38d475e497aa59477c0c42a26e758e66640c99132d793caf0ff79471afaa05bd30347e559f83fecd8fec573f007e324186905314a79d1e1e84525a9abce4368f8da789fe3cdd5e60b7cbb0507a137284af3dd3019997bf8f323fa96b137e883d95571f49366082e93ed1d63ba2db5817283ba144cc0e28eb62e7084b7e1f03af916cc79d54b571516a25506a417febe239b1454308ab5f185d71ffa2c36fb0cdc80e0a625f84337e84f0a6431ea633cd29c7476814166e00680616d9ab18968084636f012074d15ad359613003f939c142a7301abaf65c89ceced656febfbdae0b967ee05c2e52cca1890897b61f04a4ca7688c0c0f3329dd5f0c682840f2e40a7cdbf68de5abebb34a823e200c19c600a5fd5c4efb6f723c7956fc504adf01f9d30bb016d9f1e11d6dd3a78a9870adb4a88a18d0fe7b303eae4578848440b3138e9f914d0a579b5cc50d6c1791855ffd2197383e82e6f2587060831167a8860bf1d0107d015d78f612a7e25381d85b2e93bd40e41313271e5220a2a37f76e9379f75c4435974087dc93bb0cad3da3ded8154b96e49b04cf4e61e3d97364c5b2af9c9131c7d2bd8584b214dea121b66ae8d160839712ed2708eb1da8916996a4aa3728384d6f5571a3b01103dc71c63e5e949b3d233ef6615ce73ffe5bade853afeeaac0911511337fb43ae426d4dc428589852c50c92665927dd24297d9c3a609e99e30596df7b360e718e747f2fe5ea4d5a5b9e558861bf2d75dde0e942f85fe518cf26e1f12da907132750674377a02a3834aac961c6bc41a6839888735d8d84efc6d98d2678e567910f72c028c7ee819a8496b28f23e4f717cbbcd5adc87dd0777099e2e00b8f9273bd3814307529e5f9b1cebb9107adc0220cca4b42d7b56a5842e4adde441c2a43a73cde0afde6c9ee42df4ef7c09b3f5dcd4d63d2e9a8a4fac4462841b0ff918953dd8808c0b9afe0ce24e7240d11c73383b2c9ee9cdc32e76b3afceae0ce6abd59b6acca7bf6fa69aa5c0eb64bc5fa4bd696b7f66fd476a6ae4f960a41ed08381f44a6c07e334bf16dd1302eeb1c3aff2c75e87ac10602a103d08e5052f01cb21af4107b460327009f10f5ee89791bc5fbbcc5fc3f05396f127a303d926bfa93e361745b71caee2fa4b7ca8595812f58dae7cafb3836bd8940b946229eb53455ff094d01701f33c715222874adb8b800309371e84b3ef15814fa1abfc6605c80c457f4ddcf648a7f66ec9a4c20847854932c5543f662678415d93865b7f1c5acd9da2670fe2f44b120738a6c9c78d2de893eefaec8659265b9b319a4d1ee2222b60c3c4b7af404f4c8538366700a49f67927ab891fad14a57734590da2b9d49adf6ab0cdc4474dc2d5191fca59bd5044e99303538aad30abe4c950f0a8e96f6dcc822e88689d8193cd10b9f8a806884260fd91ae87eaa8e178debc0e62f15523e3cf000be66b32f016e6dc81f98a546765c3d0eaa5e9dffeaa00d4b75f661855dbbdcfb8bc34f450490811e6bc9d373c6e724ba8532f385c0ecc357c0ccc4b6c1aeaf81f688f284cea00d4a76fc3c329f1a56c581e2f5471fd9d78ccd97840ef07b313c069de514e604daf3481a26ac875c9ad8a656eb6e92cf0f94a641eab4748c2ad1c3ea701cd426b0c2ea09da090816ba9bfd771d219e36351453b03ed0d54762eb3558dac4216d575f63b3a070aaae7cb58d2bd289cd760fb7dacec88c9916a13065cd6d3654409671bbfebf09f48da9cf5e5b53cea6f766224581cf0e4a60ae485a326f97f50936a0fad481fd6e1b099079f0e917b12201009cb39d7e6f8c52dc1c7029128c2f0096291c2c74a0c063a1e5d0da8c775daaf7e54b780591045594b46de3cca21ab9f850be099513e580a9aae56e577f1127af2a31a9cb372f7f172913e5f0be312c7175a160894ef02951d115ef9d51a741d2724d78f7e975970e834976a469de20a7a2af7978d94b2441614aa3897685c005c6872cb1303e6720cbf6df102a895c42decf9b893d5c3920626bd44075156cf22dc70f2392f2b5f60804695e8998a9eb32e910e4018d3297dd60c8edd6be0d41aff5677299f94a37425a59b30e74cf4aa4e61eb2ad45d64dd811c7b622e76a9a54f97dc9cdbcee8c81e0fa3a428596063fac0e1bcaebeceb5e661bc3e0fa4ca325bb994eb5a1689dce7e9318ac33c6c708242846dfe93d1874470b3d985e7b0729230329d9118211301c6b78d5e726370936b35c74a6917d249cde4cd37bbf6c681a0283c1750291b0a2cb8043077ffc49cbf984118aafc1754ddd1717b9e07beb86df84f633b1c455f8fb5880fd99bed0c940e73ffd618d704250c7ef80a5dbb951e353ffb5575327074329142f3c26a71ad1ac85676d891b637f83e038d734da6153196461bce52eb5eb1b850730dbd5a4f4fc6c309c5c8099b17474493e3057a07afdaea1a72373eb3a555deb3c866251f0ff7bc0b6afa7ca2fc2321ba27537f49f2864dce2b4fd92790023452acf57070fdc3a80832996df4294a216cbab824709c10e793342d490f143607cc05dbbb097bc31d6cb7357c130124da3817b418001f134e2637201cfe7479bf8c7d99633d1c6e92b5534f2564166ba288b8d7b87cfe05f7e3aee8b35a6335c2106eaf0780523e9e8ea156d88bfb5710fb2883844bbb516b57f5e7aac75302c5f4739d2677bfab97352bed23ef02afbbebe14809f0d99e2effc69d71b9b66911a506e43e87a74e23655d629601eeadf9f77da5c800cb34a9477b8a96961fc15baea304ce34bb9eb97ba0678d58f20a518a482d3cf012cd60cb9f3f8800f1b40a7dd27f44037f05c004bf5c9878bf2d6930fb4ee74342b0ec08ac1cc47edea9949f1fc43e78442bed8ce4b235d5c88f9777e17b457edd97b16b1ca2ea64292a809ee5741c07ad697870cb28f3f490b962cba532d60745da477f8b72585583af54d9bdff7b463d57275cdd0131599a3361a8b11617810e0114c2530bacc750b097ec13d6ca98566d40ad94dbac7957760a9b8f959850b8a4bfb01dcf463e22d6b052819a8882ab247aef7d2893e85b09c410bb21c70ab82d9ee5464db33e7c7a3489819b43a98e052c9f1078a60b175724a4ae5b22239f1438be66f7722cb013ab1d9e897a617197ec38d93c41660ef6b2c3e392482fcfe123c7ea6d119d804b7a7b22c59b3f1855104941f3f49db460e4faf5779773ed2cd68e6b1f00154f8a291ed8e034b6c4b55f4cd5204df6ba1e31b65e6b9eb4594fc76e437dcc0880584d950b59c55d29412fb02d51ac2562873f9278fecc55b6d28d041e09e40bc51e3e6a44a2cb869870f82f94f89d8e405454fbefa1bedc685d8ddc4563d6738074a20b0f4bc5e7a4dd4ef7b695a0b5f5de286f3ce4e4ace039405373ec11f434d3eef3e5c522e4c0de9ac50cb94410d5bd0078cb38bc6bd10e4b06043334f264b49bb1429f91029f0d71f401c3f64382499395153dc48d9d35146090b9adf2a2bf2ecfb04b6ec571e25b21304645b26e3c4830c5348b96c75622ff83efeb69412c1eabb9593aa1fbe5bcc902d090e1fbeda4f835ed7ffbc1da0d4f68567beaf2a3f1e1c839733c9f801d4813c39656ddd62047f1a920312f4919bca88dedec29bf3eee677ca6d9df6a034acdcf9485769e409c82f80adb522bfed3eee6afe148d66c3e0183541e3ddbf53d9b3539f248ae9c82646aae6efceb233185f1406ee271e06d40fdf97e2d8e799d2694e521d67f8a8610716940620f0d32185e3df9891a51d8803d158e30c9f6e5ea7f2498a2999114019cea0434103372105df6f5af48372c49d116a2ea46f3a4415486db3f7546b8d25daf3ee5973c5e08a109f7c783e6b5285a9b70bc6df654d5a57a4dffab21f0ed240744f8fc6e725ba7f5845446072f962a026c29b7857411e28d7575a3a938cc90a0aad0c8604b93d3380ff8171ee80dcff9e9a4ac179e80bc1ef643e7530ceb1409f52f83a8365bc3400f056f747b09ccd09dcfb433109c72cd24ccee95e9e33e81a847a6bceefdf8bc160ec7ce4514a124ed1d884e86efa716a57342086c2f70c628cbaa04c1f4d3faa996a872f2b8ed755be060e07dd4d969dcf95a20e03a4b361b2e16165bfaf58a2e2f9a18f050e2306eeb069f41f67a555fa1cf56029e2e6fe3d17378195acdf9382c1506ca875fe49a8fc1b19fcf2a57922eea3e2fc5bac217783a8086beddb64c2e91f2fdd6970063312aedd3b939ff18d3634fe44b40db2a64e3e62071954fdea9a933e6a928225d81baaa7a6f49aa5831a2e1bc898119a139f81f831d9524642fb3602179a3b8edf3f95e103bd9e7d4ec21ba051adc1bf069ff830b3d5de2711358fe3ae26a42990a5f9f21b96b461355782f7a79b240ac6762b7354b4ff88a16f264af5e1c3df32765d42b625e2397f01ec87920b42639d4ba22adb1fbe5138d2849db670a2960fd94a399c1532ed75e7 MD = b8f33fc394687880f8d658c24c4ef826cc1fa0387545762efdb7a546eef9128307f5ae8ee7b8ba5817b0e492aeca16149953b4557beb72117647968e8f12874e Len = 98440 Msg = f34105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d9fc4d7467331182b0ad81c756a3ab1ca734559b065cbf39ea3339859b76fc47e952eb65a24521902faa4e3a067c67e0cb66a269cafc2923c6137d6c11e5e887ac62821084959a770673b896fba93cb0ef7d462757193e204de3b56a05e026f4bb91be2f8e82d0b9dd805d6896a88dff8beebd8e5b1262c1fa4a5e19f8041c319f670bfd10cb88db0d56a92977f8c04f394174f927963b7b53bdf3f668a05ca0b068d813cbae174d2e6d2844002898027ffc08e24d032cded294f389c8735ce4a70dcf0e0fc900a2a94a5752dfa669cbb894e5e44bf7bb4eff85f94e97cb915fdbcc3d366d9ad95e1664b2d066f0ba0d7ba29879a4c26b5e42f761af77379e74d73acf3755a215e1ee52c74726a60d4a519b9d1cd821b18f457fb936b735c8e621cfe19b685d2ad0a97b01219f14c7f4a2e67048666422546f758c8f0854c51633f210bd064a9cacd0640cea40fbaebf18199e76c0283240397f47e2cb0317779657d926cff8efc8eba4271bbc98f5ec09bb843285dc75c52c03780c7fcf149cb157a75325c6a8c753a20c30529b421df032de0617ff4165cf889956a71750f82d7807ec98523c2ab0e408c2b36117c77415f86c071f49a48ca5284bd18a511c533f773da82a3e658be0c94d4f88eb6b0deb5fdec3aad303fbbfa1667f86996bdb2471d0c59d040a3d2eaa3a9781419b161990c8ee209206955e9131119aae891dbd84408149418b5d3448052bd89eba352727d4e72efb1ed1f884362844e4d6a3612b076bbd6b5b64981f476cfd775ad3aa716d3f1462cf4a13d6d03403f0e704c5e28fc547e60cdba09c7bdb7e4fff89fa2a0c667f8d9a564715b9b556372caa4227545e9736122b044c1d17c9ad1ac0ccae2cedcec0029ef8dd3d3cca4c3a1c7c75ff7819f00deb29aa95726df32f00687a694590ae9a7caf79e53ace9471c3bb6aebb25e98529497349fabe9d6cec1741b2c0e53adc487e1984c2fd1948648a562a38dc39372afb3767604bbbc5c9c660cff989642034925a4cc8c81e0ca03b0e9b17ae775f0a534ecc31d52186af9b4cc5e74c70fe928e21c00e14dfdcf9d748c8ffa38b45f0d620401665b7f6c51f6e5c333646be8afbd8a63ce944ff97e56b7a99c45e31050e158bb601655f34d92c5c854fcfa84660e6c7fa4f35bfa1eddf798d18d66b71829674bbb413072352ef8c84a0f103eb45b3ebee4f9a6240780b8d82a7dc3a5bba09c4ca83a937bb1020b5d9309519a432a7d9c3f05b319b0d597e207a59e8eb3fd8438e780f37249d259f2c07a43097b02a5b1f3b6174db343013109833bb4b9869b9ac9a2d4f85816812242e0491ec46a437ab3692732775f815fa0954fca04d26eecff1ebc706424fd669ac9f84cc7d7d360eebd775a8591a4d85d6a2f215e776aa9d8632e6d16a44b2a4895b505fdc1d20f06219c48567fc805a0607e7cfedc0b4be60e8f60b81ae707dce223fccebecbdfba23ea6e728077921a16a21f9e76ed5db87f73ddf0df5d69b82db973c3253d5d5b32f64f622a3ff81b0b2e9b95de7d59c044504739880ada7ad6ea1d63ab82f269dd545d9df39d9223ac98737d8937ca8debc92efa9b9bc4857c2a5c38a849497681793b9e72fd0ad4796439de0da91a81d43317cc907cd2789c1eb2aaa20cccf1ddc94bdc0efaccae0016510fb24de43cac127427ed2a6eb4b52ba3423f29f77c40e920ef4df35200bf234bab3d92922ec20bd685383103da35d5c087c64d5376394d3d30b693258d251f9c38f613bec8b473b16cd80d3c59bcb17d03ddd35b60456a0358bf46d193d06fd531724dc4aaf1ee9767632b72a3a8234b1efc5889dae3c405cfee7ac0c53fa8590d48bd3e4618d0eadd5018415886bfad5198396936a2efd6febacb8d91c13dca54dfcea61a87cf4e67256012d8e6eb364438127413f141d97dbaa5927a03a49b80ae0e76a8dd3e147d697f71b5374a585f526034f35d6e9fb5549569ee85813f294a093a6177a1ef8882e2f86df631a61b8daf164545ca9c4e1f179e7fb53837a72a2b6be4e59f32210816e173b2558201305bb28a58ea519070a88aae115e1792c5018593a59a7edf7fa7f766ea0a7e98f0f27452f55242350fc4c8ea38475164b118020e4608480c4ff294a80be51e4b261fe60fa97700943308d3c488a867a564cb8ba5357d004fffa333b7a659d3b076107240f3ecff4690c135cd80e5dccd56b86d18f27d4a0315266f3637fd21313780c3675308a0c48f9a5955cf7433551d5b30aa1b6d87de16f8a1743f33997600ed3413457e8786a600d8fda2f7edd51f2070f90ee24c297b9675223a91aec758c26eb5599336157a711f35d9d56eb5d2a498864b6ff98db98c4490a89bd3dda58cbdcdfe0b1ee95387a69ea291587fde5431c26f5b32736746aa7007b69b018dc8abdda13ac48ae790f988bbb01dbba8bbb74dd9586962fb522120d67676db67f2d364f1a6a962ad49a29473b640c1b847a38917dc10e4fc3b2323a35009d3ca87aee45dd34018fb0e1c327918445a938480f4a95abb61c06e2b18ecd796832c13b8ec44351b16774ae0f31a6aaacea10eca111c58eb720e77c3412171df5213136bdd4360bcd398ac7b56f601d6968723097edf5b038e3cc4666ccfc336d916034247e9ea87e8e59f45ce9a827a5abc7da99e70d5b62ec1e0aecc66202f708b6fc6bc96171ebed49ffaca6670e883978b34e06f5d55dc3468e710833d3bc109b5839be68ae3ddec2ae4fae831b399ceb835f52966650f0aa9b9b9855eee430770e36639ba79be92ccbea09e696e15c8a1273d3d65863fbb4f81280b29b96f1b2e70bc2e2a32e97ef1c28c076c7a7ffbc2733929ef1c06dcb6f7fc83022fad9b4ab60e326ec1d6f736aaed91df5b40fe88c4796d77b8cce56c68a76b9ca3972e522dccc4dc891fa217c275fc16a2f14780756e7673cf2a4bfc6da9434dd7b44ae1328874180b2be5f1c39574c6c4194d361088e387d18796d37182988a1e7d57548ec1ce85ba74596108ccba544121961620792308526d4c8e1eb3e9f5fa6b0a387cf912ca399172f21c9c2b43ac92a8ad1f8fb399e453e388bfcda605edf5aa19979f0f49eafba9017984561958f50b67786d23a0e9d3e25fff305b3e8bb5cd6469341279612b823baa05b949f8b114d1d571e1a1e555cf70377c78043623fa955c58aafd1e9994fd28a0c359ee6f8b78913e7c316952016603029afb8fb8b8490b6d573985de37b26fd602cdbc78a5c8463351c3e8713ebdec732298fafc6cebd0f295b329620117fa260619e5751a5d5ef110ddd50bcdc44e4ebd410a57aeea5778f4fe9bbd778a52113bd2fbdd4f8465e827e3d1ba3525c2e5a9983062e4e10970d3703f5911860218226d5229bbe9d589157a40e51b6ec4e89612ff96b55c617aefbc96bd559784ab385d9ae2f60a38745805b514d6ebdeb80125da7b86b8e9e778483462ba3b446b0c3838817442090a6e2aa0d1fe497ae469555379df831d472b879ad1b5eddba81c61bd9dbd4dc1ebc63d86a507e413fe2d35fd2a2647862a680f2c92ef2bb512c78e9c804779ed790ec2f8f67a685455fb3c3a0501828f01bc538c1ebc716b1bbc0357e19942f632966f5a5ecc32969c21cc8c82e7a0c25da6d91bedb45b68235854623a295586b8fb773d3683cf65215f8b773c5f3ebaaea6146e884d5636da3b165de27e1df97cbc9f142627bb4a8602ed8c89bec8c26538a9e6670dde4190c2bdad731e08c8ee482b71962e72b15a9a673f03acbb8421ecfe36127c7023078dbed3747fa29f9e2cc0c81f0e8223ffa48d0122af937a652175b002ff98557f0a9e626f2977c7fce8e3aa295e663ce5afc3757f1dfd1f9f74c506c12dd35387a7d0ccbb91f4fc9afb087a3d849b46bd2aaefe719e44ee4165508cc58d9d97b213fa84f24fa687e8d193cad427adebe683a41e92a6f750eb51acc4987573bc8ead702d9bb908f4770b3a0e75adfa96e26947585aaea0f20df83e30b29be21c5df2d6292074a8ecc6165fd7aa8e1dc2414a0d3e523bce4c199789739c576541d072a10a28f8e2cb46717998db4e841873947a22e1c4dbc9aede12efce4e79c766ab45330dbc530a88bb1be49075d9e409d6f2c8b1e055f52e2a6f17b0d79c07911b475647458634fd41cb2d628a6bcf64801b722b04c959280af28dfc8948acd0313bc67e1ad8d524a3ebd5b9f2d635243e68c1b5a8a2502d0e41b4f9da0c01a48b77161aa2e7658f5002900f5595afb9504f39fa427d849d92e11f415052b0ae98adb795842e50ade4a3cefb1916b9a464533d6178b7610a47354f5b72b9343ed7344d87250a3100c05404d5b3f5cd75f9096e73a1ec7fe379d2a7b0c7ac06d5c59f2a680c2791187177b457bcaf659e6cc62fa954992bc9c92dcae9b5b79313f262e0a0bff2cb5586a36fc9a9a01c9e6e3e039b172a1f1db3cb1b5ec3487379dc1402c9a6f87a586e5b89d3f1745ce64bc58ca1503ba46fa81f3b9876eb3267e127035b57a5189196f4b4ef3a98a116a3f12d54962a663034be8e1f572c3a6ea01064de48851081af235373db8973aff545583d6f92deffd81da56bda77f61ea76499bb00150cb9055bf82a5ac35f02ce36bfb432e1693f10b0f3f6774b1fc85598248a04d167a83803154b3ed2cdbf8d49a66186b2bf6e6d1d0c57b431f22c492fa7b3dd46bbcfb5ad3d8f0e344a46b0f2becde1732c1e4ba6410827b9279ad09f65d0dff173901cdec33e3f644f38d7d66b41c99f49bf4b015470483d2a94ba7c1169a34e19a9cc1c690158ff66f670492e75a5b392d1c9b299387c5a75ba352a2cd6cdc9387d51ca7150c1420c1008df8ac21c4c81e6661e91b95a8d937bff3e0ab0960f3a7b3c7d8ea52ef8b916001e12cf73c6b17daeb9d08b5942fe4a673c4d7fb26caa33eaaa1386f86ff869046938f672be8c07f218d8170f1730b60b89679ca98df227ead4927e9434448974657fcf6f908c05deb00af4c286b53f6ac9ebbfc1dfccd7cb91ade4a8d21807de7749b2e0f93c07c3240b9d39fe0656f3623c31b1ce74c3fb45a8619cb5fd64b13349596d35167e5dc93c88dbf99e8d33d6fb9afff6946cf885246df67c6f108b1dd12b6ae0a5e9fd3420401f060852aabc8c63e2d4a64351b4a4723c81e7abca9b8391709854cb2fd9494b79bfbe47d677712520e524d78578ab06d562f186fe30d33404a8bda2744d3a1372633acd359c3c4720a49a9a02259aa4679c1742a462428b9dbe4b0058f45520afbd0853569f6042789f622b666015d34999b35f4bc443f0b22587554c534d0b7809a19aa7f57fcf7f3225ec00ac8f0c11e8604d62db6a0bd89afd11cd0e642c61f590d3a832dd16db09505c9f6f78c75704a89d77fc3745776b06e6697a4d1bf3fd40ced5dc1ae0e2817c0d612d558d7f7af6bff9bb1e3625324f13902b5a52b47d4bcccf55bb964c47037f146ac7d6f1c7d535669c8146587d3059ef963e592a121c5de33421af6ea6711217ac222c5457be8e5d15230e87a85509c64f4ba7ab483d02c00c0fa4c03c6f66f96617062dc72d3b3bc955e7394027a3b2bb14b6de8c285bc421b81ef785390e182cf8fcd472abbc810dac78f3d112c8337e2c1f2a5a58b98e39cd666afd784822654a68ef06b492db76992c3dd7c0e7d6ecf439253f58bc8c98b223912197d576a3add2e3dfd25e9978ae898dc09c730b9bffad35a7a2c52de308cf108e3216a37c75d3498a7f6049a85f195a28100a501fc0d4023fc174008d23d15f8fb18c273454e2868326487a7a1d44297ab60e22ccca55e1443f39a31bb5c2d4c2a0b6708fad89314671979a528ba27245190f12378eab796166966403112c16b38a262dc2f21fb060bbae27e60cacdaf3937dacf4703d2123f21ae1d7d875abded84bad92b54eba5e9f2cb19922dbba22cfea317831937ee84c279b0e7e27faa115a77e63897e859c8663b5e050a7963f28d56e272536f94aef5d0e1b64cb99a6bcba2ea9c127c8a6fc13a35038a905c538bfa1a5eda016a8561ba9834ec8ff5c48041cfa0ef2ea0a7a9d086d2d587f317a098a68dd575dad0af3fbda7eb8923e4205f7c8c53860338c60639bb12e6920575376e486d544a5986673858702f8c935401d9a8680d1ceac2e336066a36a0e7b2df5ad6ca2424e68f3bf18fa40a9999c431ce3b564a5185426f65fb04fd8583ff9852811370cf4071c2d094aea1b0bd17f6438f45c60bd0f1b3afe209c6a8a1026b3e8f71bdb32fd504beaeb77c3bc8f65920ea5c07b39474b6fa02a016730b665f06490b95387a630aa126e724a08308604d95c397af99768130a4f2774d88d17d92f70a7fc6ebc2db6344652049b3f615b2d8a3fe69a79d1a371026709edfeccccae19504c5489b7fea505af89c23678038fa24c24786918bf98e658acfd95e54974ed5aa9d5a95ff2092ed35039a04a8c5456d6db3fdfbdc5c66d74b463ecf1ddf88f1fcb6e95962eb52475ee5df759542ffa78714d683134adfa33d6cd6e9308cd5127f79bd8eb035d78ffba9bb614f9871f996d2d7d03aaa42f2e8a9685194847e60bd4c9dddf2e56aee95b9f670dfade38c2455c98b5863d7ebd366beb251b1ca023d9852ee2fe3538cb37c584b4c6b9d87b804735b765fe6b786099eb270f9032187c6a5686f17da90dd5aa99a9eb9e613db499fe99b85b77d89fcd1f9f8466fe4243c5bf4ba6947239bbbb004dd7e0858138b13ddcfbd926665a51f30f17f58749b643f3919c1e16c7607363212a4497deb3398de1aefbe9aa16e4fff638c04f874a518e09307f194f5a603cc4512f2abe8a7f69485038440c5be2b0d5755bc993866ad903123bfc2a101df797cb04a099450f5a817e22c8059fc7903d4c1c77f6e11c7f2fafd931f007e92e1c1669bc076965dc2d972fe83e6920288e3ba6fd19e0d2eadf67db5d39c86e3ad1b1c2bf716e2f589d19c4171f4e78e458b28fab850c2aa6a2d8c6c05fd829b8593ba44d7fd9a86a609493f720963e5e2d4f1b15b0d9803d1a81002dda9d882102f282c88b228d8c0895f3eacaf6ece06c6fedce35cf700896ef2bd842af260f7f94e2b31bdf2b38057c8874a6d7012596a37c377c6476b3b871be6220836fde1f9158bfaa762df8e7d6a6272cbd17985c784ad40d2f00a8efc72c4dec90e21773663920cf7de2391032f164d52f9cb2fe5cee465085aa62bd4dea1e1f7e19361b8228a8f35d04932effded028951d001cdfbae0ff0ed06b91749c35319161c468738b9aaea9f17184bbe2db9f93f50a386f554661312f4e1cd9a735bb81784cfac8f68869db356eb1f591f9c282c12bd18a21d91f82f364bffb9f9215b4b93a32e0dde4bd674cd5571b60bd0a081dff68cec53b927ae959eb58d9dce8a1a106b159c65201d4a46fc4bbd3980e9a47ff6e9ba3c0529f5d983f500a78aceecc5ce6923432dfb9d8788b456f0d289ffba6637f3229e856ecaa1c9f95e7cad2978753389c19bf7d55aa2b5697aee0af858ee7f814babc37f2fa138610ccdb139f2077bb827929a5a85f254de1dfdf4f92035c84b00556c92d22a4a1ef7a46285fb2d4797bd396a94d01f9b9d2227cd69dbe41a3988c4070e79e50819672a47735b8fa10ecab9f1ec05d2928ed1931fb051a27d332d1f1c5bed79793aa687e86cd9d49005983ab7c8eab2409a716a71364a18fa21358f33e1f68fa66afbe2cdd93ea41d646de343914968ada74cd34c628eee98ebe93bd5075bcf958fad637f2052a94e1392dc1db0e89be19ea8f7379ee4cb607a914c8937e6e05092053485abdd882dfb4f4ecd8b8ff4e568cefeba52165758b475e9d8d95d6bdf5c4b7a67e0a7ecc202eb61db8c081ac0eb060f5de4ea3b8a82dc3b4953891748d4c760ae29777b1411b03cd01a1ab77a119752a9bd291ffecd1069640e328d95e1c00be1ed17dd2b11e408349c8c701cc1cbf025459baabb7b579cb1722075ce6d80a688934dbb0fe8d0ec8d7c27eface3e8115ae40785c975fafcb9e81a76f95f4d572b85e2bdc980bc116521b3dc355e37dcce03365830a440b003d6ea38209f7046532a9e8a5fbff09e43f3f8debc1c007a0b08f1caf8ef73e117a556644a14319d87ea48cbdc8fb3bcb05abd9e4b048b13995dfe832a3dd9b67ebe27a280a8d781502daa2745d74f9333beccc4e9fe1fcefe68252cce78bc58bf872499c942ac1c355b8a47a47f0a4a5487ebf79ff205d3c493306dea8762ee626a17f22dcaf696bedcb1d2006e2d0a9b1de3df74c8864b7245e5ed885214a1f0cec654b429fe177319e771628efffa91e97b257068e85e91e50e55afc11999f01bfb6867450cc6dd78f3ccd1c6ca43bd517d719bbb7333a8dd714c68bcbbfdeab87cd64d0767cb83629f8a55fed40ca7beaf6afea771f33f94d77bba2b40f5660f11456e57594fed40b154f61e677ed899dbb9a01528c5df720789adf6f1abed87845dd31e287aa478f2d1bd0fc9c1d748c70689eee1d20edfcb1f4905164406889cc783421d732f742aaab1b742fc2c353cf8c218e4415743e9e59740f7eb3a7a202b86ad8063169a2186dbff1c5760c60137527d793b3f062a829e90dbc610c6d930e5459971e2549e0e41cf9dfbfa65e06c4104e8e85090569f66db0cfd10d28f7fa7f4afc61a096beaed100f1082799f3f9894786f114a35e3f80bd0b9c20709c0d4a10c8946204ec1e7a8b8bd816a07575e1773f90a9a8ef75b067022afcd119a7534f6e3ef03103b3581e12b7e9fe05d9b741fadc4e92b8297b6335f5e8d6db59194b6fc9c197901e182d1820182f2f85793c5b4c6a0d22db501639957ade6ba30ab94fbd5ca50bbf392d2e9927a04d19b5cac3598254ca0bcd146f7239744515a60d708227e5f11719b2a88baefe08f6eb71e59c3e26182b40d26a249b14f21189bc94d0c9d6ca96584228800494cdbd98c6148ce3dd87ca69d49c15165cfd37144b0ef1a8f402ed6350211edf1115de3c3be2941a07b359969f87dc41a8b0e6e44d519d5bda346cd95124a084df7bc94447d24a572105695587afe29374c7b168180f1c38d5c99518e9a5cd9c6c5a1f4f7e663811b6086a254196b0826dac271e4f99f6e6835d06a07e16fe8c545b30cc4410b5d03336ec9451becea4efd8a8755874c5eb7f49320e930a9beb03d9be394d547c19251b51111c9ab55177d7b61bd732019e062897c1acf35e2f07600814deb3d3630810483a16bcdd4e9213e06020642294d475b85830639dceeb88befd9cb1543458c0325dd497dec2cb27b7e0e85db16646bb1440c1dde3511cae4341ebdf871393b5901adaae12748f9d9d2c73b12668f9531bf9e5b4b74c076b25806090e477454af1ffad8210ca6bb0109176f10a3358f86001f09a92165829d6478f67e4d5e9fac85aa196623acc39b2be568fc54bd1f560f796f1fc467b74f5f5bcd710b5fe6f93da7b6d8f5c3d84e41186fff02910e4af292d5d6e62edd6d5199d70e0ae0ef3d4fd7f79e0953c1c2519acc4134182309b35483f50e22bca24319597ed1478321c12423e1e7c547a06652c7e972ba283c5aa5c0a5c5ab1b933bc39ee8e8fe6a4d9d7584c8187f32908528a82045dfe38aed6fd60e9231c4eb447fed75d86b6c68ebb1607c23eb4a39b804b60d33ef1e9c76990b57fd1c7d5063358d4c28f8511ab1c200249070564406ce3ad9c6529f19fc0ba8a98ed40f6ba2cdc797600ce00df98face9e8752058786e7cab86712faa88adf42bcec142e3082fe37b090ee2e6ca00abf3b2646e1e14cdc4acfab295f721673906444bdd609d442922aa6820502dfd476976a4093ee4d15a03aa7e9ba7cf21bd6179dbaa8c6af2e0b4cb815ff1286ec673bd9db95ff06385da1e3e07629ac3ca65f3d76f0c76225258f4c16a71c63b713b0db745293e6c8f56df58a2d28b35a6393ca9f58bcabdc537ae9008790c4d90e6f15a7746d9d2bea17436349da95f9907dcb704af6ca98279805600b1048a6b9feeee155bc67f5be3653e856bfd29edf4596b642066d0d145f37b1bc0b5db498c8edbe8130e59ad433bda5ce58d7ce82a3d2cdc87c018f9c38e67214f272874d55889b813ba4afeea7d7182b2633ed4d10f61358c806b441dd983da05635a32a3d4614d06d2399400b36ac07b8759f710587437d6b0b0f8785c350d8b7057cc1e8bc96e925c0db9ac652fdce8ffb39a109fccaa0e57cf5effa0e6848856098a6d042ae55f62b0b2161c279ea0d53604f96cd156db7eafbed72cff05a51e57b3b9c7ed7816eb09ca675fbad04c11c97ff248eb03e62c3a602b88e6598acf2891295d78f05f000048c7b7503893b9535123b98278d769578b213d0548de71666ae64d3514e1a87d735dab51a01ed7bec3b549fe7e553dee89e1d2c399490df887171f8aae45eb689552c325ce9572f11dd080c7dd08b1e8a094cf871675a9c630e55ce18432d1a9f4cd87358a9e93d4a79be5455d99cc2b1962bdbb850750b8ac788ba160516329d8f780e79ee4414fa93f00e1c5b097a03c7222c6afaa07b645f73432084aa8ce8bf835a4d00d844a6ae45901dff4182f50ed89105c04d8a8418ae0fc44c4a88154f72ed5eac264ad33b0790f710e59c19ffa770153bdca76e95b1567de686c2b7a1cf4e0b2aaea604ccee77144a5623c6fc276015e7ee508858f5edb9cddfbb246910e2ff16e1d4bfd642b912062398a096d0d7843ef32465d5140c048cb5e00007b04286eb506578e9bced5cdede891b522c5cecbb7b819b8c7457ea8dc9bfbf0055f35f328ab6a469a57a712ed773bba09246bbe7e8067e019f47d85b6bc8d5d54a6bd466f166d6e8a4e6eb80bec6e624bb4b7e4ee901a1b70d525a601c89d9193612830314f494e923b9188ee5114f310fd1b05adf218b2f471dfd566c812d2e819dd79165ce42edba77a473ead14b67f86fde863ae4bedcc4f11d88cc3d6697b5446e9c84728568c1a90c0a50956f3c1d7c656b9ca991321f825781dc1d09e759dca48ec18fc0dce1a3bbac96cc2f2fd78df175650ec6e1af2817dbecbe8b8fe79d15d2dd5479dc931e3fc52de40fa5cf2aef3e4472b44e0c78faf19e706013d72c3f13088f34ca4e6f04fe968b85406cb9db208b83ede9afeb5d6d62012bf5b0f09cca038e76388c1ca7b36101249228e131b6caa0c8471205db99d7bf43b80d809b623ee0b299c4bda48e0e0361fd9c078f7b8257f7d8db4ee21140295bdd2562c7761b147e8090b867e90e00c1e52eb330e94327e131542d0d6e6bcdb8c7c10dad6048983e6f68a37e4ed177d90b696ae28a6d7f28c31536aa0b9b1aff2a48f7c9db17ea76d8c4e5643a08d6fbb2c4a500d991ec1310b6e264736eafa357359789212999bc3f2e14963504acbe9dd8e8184130fd44ac81b6b92046ea29e10f8387ecfe1473051cb7a0ca6577a60f0eaa957bcb1131f93e2a24acb459175a3f42228905f94fed1924f0649bb63688ee6304c3e0c66f7924c31373578ad0256d3a05afc19687399c03218e37e6d4bdf0b7f2c3e28b61cede08121e80ee08c4f1f19dabb19add9d2dc8a0c19a9824f0ae0fcbe670ee9d4cd26fad08c0f105db65ff57176674976a36fbfa8954289be38ee10cc5ec5e9685aa7040cca8427bbb41c9be7d5092693350039b5ff5469de90bb231cce559c20bbea089c4a740cef71dd75047f092a77b0175ffafee40cf83bd19e785dc7ec4319786c49b3e7a741142aea901d6e3f6c3b3d9b413bfc595360b8e7a6b322c01b9bd79adbade5e0f8c58b625256414cb8fef854505ea3383928f6686e796effee6a91f81ae2779f5eae894513d38938a422d3f3f00ee291f0bb15889a57b39305ad2ef0cdf7a4ccb9f4abfc9b3b4eed78cf53dee9f3c04cc1409daef0f4fa63a88d34e9be97754f52c27aedb23799527c2c027e03b64552f4df14443af94a571e322d4bb368f010713e7d81206f714ff862673b06ff7989d1c204b13e0dac57b1c3a07d75121ff85e903c20ac8adecc33980a7eb97565daa00ef45dc5d9274ba76816e9cc3e0aed60e13f332031e8b176f774ade5c1102da8ee6db09605c31b494b16f67f94b8d8c0590f20420b98e609a72c32528b826b3288f6127b3888b0df91280c58bb31a2c71f3351dbc1f55434cfba73c87ac47a860417eb3a1a7ff0b165d4931d5c7d31ba5c332cb2fa07e13f98a7da0f36dd44ec8b58a39c54afc406eda3f3971ea56fe437981b915fd77671297acdee68d5b0ac4542a2698e211428511c958eaab0438cd9e8853e976cfc13abbbb62fb8b5a50d595c50696fdbc95dbac8dfcaa7a694f969aed2824bcf596d45f3fc98cd840d58ef2e1663a0e7c9ee502d3a12be8f4c74106f6925230677c720a907f2504acfd631415a21c94dfe233ad50f2f97745245f6b5b4efc61b3c6963653f04e80fd3cc451c856991134f43a148c4ead95c8eb442071aa8dd15929a37af0c983edc018553480004a043a398ac0cc3092c50e8091dee03170ffd60a4c410d674f9b84148844b32ba9fe4e46884ab72543a57488baef1d70505da8ecd310f0561c2ac7b5cffaf825236fff9fc50ad3b95a87996831e98ff3a67b4035ea735012741bf970aedfb5a960c9bca9c3998859221beba39946be17edc94a99e4d08328e1df97d9a76b8214ccac03f8f67f6b7144b2f9cf539f3e6990c8167d74c12015eff621554c16d3e3d1776401f014e3be3ced325ff34b77652a083254fcbdbd45e8e03487ff7a21b319cc6b5922f2978c753b33b9eae3ffa7240a2cb50f3e9145773e3fc653fe01ff001b786311b0ed68882d5c71ccf14d8c293e74220ebc62a12550a1a4cc2adb241ed529b44ea85bded0243b2bfbebd7a0742597007dcfa7c54dd818b7da8943ced089edc13c71695c07c05e2d0a4c2460cf4003e4fee0b74e8b34f3540181a25bdfba332e5d84ac6c797214196a8aca69852e5943e488379957e7c02dd3ac9d6766e69830445a8b8cbfca1b65bf3020172040f5b1e13eaf222e611d99b3728b5e308f9b9b637b9d493528c2865ac4cbf63b186793576c649589515a1c337bf2bcb725aba44d60380e942eb81fefc1347330153d8cc9aa1e5ff3090449d6117a1f5549470f64910259374c5a86c0bdd03aa9e7d5e2aa7022edf628ba971deb77d2a54b0c113b9682c5a8f2285f700355a8f2d0cf599c4728cbfd00cb887d62728321db597e54d91fb063c0b00e904a0b4ac5909845f19786768251e592670f00bd555abd9b22e15fc5f228601883ea879c7c77bf3c5cf9c27a307c67498d4998ddba59a6fc3837c962cea9e701ed7d412a9226a2a130e6634361f0ef1232baa150bb48b4060754c30373b5835f1f6ace51a10df1091fd5ff7e914fdb8109dac0d2e2b8536d02c0f3446bebe3849c4b95be239e08f87c50ed6868e9bb2a75126dc0cb191385dcf4c09221ad762706982ddc847788e3c8dfb3ad337f1c52f70a0ea6defb62f4d868c1793f8ab99ad0c90d195dfacf6f97eaf8c9ab406daf221a29f198cfc01e97b56c6610043c647d569a011ab86ad06c0b132a1b0e3da368db563d7316b9779d3327e53d9a6d287ed97b304530d9cab7a8996b1d18eab44db609e71860cd945b9a8a7322cdca3b57ca271367f49ab30d5c01e91bf113764342cb8ad32e6af945341a9c6a0ee2319a910416fd643c3dcf8dd340b237464ddc0a01954de0102b0c984ecd7dee338fa9d6b8d760002caf80b683fe5a5bd1cf9a644292e3166b8df44fad92d8dc3cca2803abc14a68eaacc38eaa7e8ecf646fe0fa05102d41cbb6aec29d68f5697c6577906361170f049a0a5ead3dca126ca35223df79a6e2bf199e89b4cc7e1660e62b0566235052f91bc7af02d896b5690e608a285bca89c44b361d8a49bd5388c0b4eb2aa470e536867e0841cb6f38d7f59e85761312a769b027e6644d4db1528997ba275113265b8ebff2f082de1d381d5ebe5f5c09bc1ddcc68cf963a9a06ca565eaf2c591a6c688efe7859b4dc307da439d3a733a486f45a469b0094bb125a88206035e86d70609905e878148cad5c0cf9a9e151ecccc7f44150ecace542c078e83ef986d47a88543e05cb159a51045654f00ae11c9b3ee18178c148c19de46edfd0e0faf790c806cf5abb7eae255ec9712f89acdbfb416b2d9ae731f62baeb12d9e530e7dbd08f8e06cb1196f2f52af79eec87ad2f5b8d86d3fc62f2df4078bf930b8880f0630739ac513ac8679c94e93b52e12a8908b716beec6090e01d5426b0f7831547528bd24ec4a009a0ba9f0e80d233e06d5a37e4c2f4f894059021fadc2fcd1f511d81ea769bfdd54ebdcdb9f7d0fc494cae6473b8ac9756c04746ae4d1ab3099e228e04bc5d90a5c234857e18e5b6df9793d135e889c96390b156b3bc5ec15e9f1014a3787ff5159bbd7aed6c66d01deea902cddb030b45075cb6ad824294a8c4549a394379b78f4b97026a5b0ae48ea24c8d8e18bed97584a80aee379c9952be6ea34895d1448d427fa0977d1860ac62fcb60929f3c06fa921b80854934bf6eddca453f82d289a10c5f9d73b35e0e1913830c177783cade568428e51ed190fc31d31dde2d3d030571862bc2dd9c1d8cd8d72399982babab9ea3ee2d7f0acf7eeaeb068de7bd7da65d57fa8bd7aaffc787aeef3f8c9d710a70601982f546469b11fc467437bac12cd8ba54f72aee7c7128f2b632da40e4a2d6a3f30e07eebbfcaded26bca59c9540eb977f2e5dd25b32c18ac1990a7bcc1cd754c2f93d68f749c6a6ee8db9cbc28a9cd6c457f8bc66b45c5e589da4b8f01f7b5bcf6b1f1dc229650fe60efcaf10b1f55f6b9a8316639c0056c266315e1954cba0628b3675e34490105668f5b0465efe1abc2087471b95b65a491b39d50f62ce0bc38109d92443529185c22d372e38bef0ff118cb75645855233e442849af38d85397620af4bceb07abc452aaa8ee83dc77b9518cedc547526c9ead6d582ac0ef40d920460218cb4b3431976732f15838979d2b5f4746b8ebe53557c2f8e375b4288fc3c556e266524626599f8d968991c41f3ea91e832d902194dbdfa883c7c55efdd50f5fa43cbb6615119a35388866a1b1e3f0dfe505ddb62f91f9f366277178d5cc9a78c8cef4f870780db671f52594f7c3dd07f6e222f78812c846052566ea9a22ed5eea9d8d81dac5507dbd206d324346b42323331e8a10e6c12d0b421448ad607e6e6418e3a6b6b2191784ba8bfe36e52cce14891ec26c866b14d2fde807921dd423dfc1a5bb96a6be006324304d55478d452544a254fd6a2ca9e6b970abeab3651bb8483254fd1bb5c4d2edc8c3f0b67c44e0065796360a8c38c1153caa19b9d7a277ed17f74c9996d14e87d3e6cbea7029df4e9d2ac900106dfc91ba86a1997284a950d50727a8e7b25082d02a393bef807d7de17708c34f95f3af68c604faec0ed6f3e828f0b21ee4635f5c02bb2360c54514d30f87cc906d30dec5ecc6369abd6b46cfc14a4db2e4017db604d4497a84b0c3d048c89489405e90506f67d5051ce0d9fa6496f43a3db57eacb51716733b6adb67d73db3a0abb774a6c26c6ec1a9c22e0687591e1b6de9d27e77f6030155bdfc082f79927d2be5fc278a465c46f0a9a362ae1353dcd13909c9d1e3a79b5024864fc5eeb9553d6487513b78361b6de1daad4d681e05240d950d67826cb7d7590a9d1f1fa0ef5cada6c23a9484959e155434e9a9d51ab2e204b78d34dadd47b6098eaf8ee192064beae91c0db06bedbe7098075b21842a50c966c78d7a722db60372fbbef3f3c6a9c43464565204f947e0453b1e8be7d6d45389bafeb41d05e379088812306b1a51b34297f0d1d72d3c03dad9566cac64d7439ecc0b10444cc8dabde94b5f9e8dde48821b8fc87916255bb786855c4840e41a246f25277e7ed0c8e173acb9d47da9f47183659e51307e6869a73dc341e78537a938ef62321885a431dbc8e7c3763f37af5434dc0608b1ba7fdfe24a3fe5353c9badcc48e5b671fd2d662251d21428828a025009fe0b59b25875055998b67e897a324e542fb5004412c73b8086b3d07590024990afb4f0f0822b3969c2d7cbbed36ae81c76b0cb09a063971c67f1d1815ff8a4189191f1e59b56d0f364c5973d25bc1bfa31163cde54bfa76dec3a96265849d1fa5a2ef711f27c7e9ee50c7b94ffaa7c760571c0028e5ffefd8a1ab8e5078a75ce5fe85af6262094c4ca28e356bfba6c285a401f36dbb90053d80e943dfc1ee1fd295a9812a4d7b5fd9a8768e2e4607d89b5fd84ebbb5f4df93c72d2a1948bb91f2cf258f80d0654b1ccb476da0c3123029f26ab81bbb75a765e03deb06f555d9d015c0806bd30e379e73c879ca5b0ef3b7c47fda93b559823832e12daeb10621f1cd41fdf43ebf4ce509c25bb3f44548ce3ddf5c2e8be99a9625e3981a62148edf6171ad22f9c0b27bf3fdba6377fd58f5c551e5f1266d1706210ad551f1c84a21371839fded5990e89b413fe3cd7f4ab4c49e1de66c2d21118e1d8c5b476a7d3fb9fe488d00d20eb26756923adc134793a28eae144670de3dd4e564414a424ec14dea83db1b725663c1035a708e00771bc7e93d839c8079155b2a060ae497e6305da591ee27828d8210113f8eca9001d39c77753c57a3181e8cb31abefcb36d1450f81cce0a4ade98bc49eb9b77090e438700fb465d22e4e2cd4a47667adc0af38ea8c984ae126f2c2d70039f7fb4c5f4f14b7aa9984504e887b53508455be5577f804217f92268c6ca5132a3c9d94f6d4321986eef53a0b823bd8daf477827c78b472f8fd5c1f2effdb31ead3dc0d336e34afd9c4996e2db072af760677af8cc1ac437f52939352d2e5d6fc8c3b07ad83b8e523b9054f0d89dc41a258dab7fed94c00350ddd0580bc318cef943f36cdab1b53f54abd6f2374c539f05a151e5b261033ba8d8cf830e25ace34aa5cfd0c4af866bed826411817b9e2d098cb551a3e9558605047ee0c0bce155c2d18dce1f9cca7f11fd45743d946e6d37341fec49947e8c70482494a8f07fcc69b0749072e04922c504c345f3fe8b079982d6de2bcb45f6f08c0aca4e2a4df24828ce3b45e3cbfd137f24a92b21bda2375e244ed1f4746c8eb879a83bd0146c6622e1fa210c18b80256b1ca6e65cce617b14f64c479d19551b5b756f64c9ce5cc87f7f38cc5f7fa9a71b2d043327f7d4361a04a8bc0251a41690cfd0704ad03803d564e1076326be4b86fe333f09f0cc3585f25ae3337a266bdc2c5 MD = 095cd23a91a9b7991155c63852ea124e6bf16af401ff3845011a428cfafdcfc2dabb8b6cabeb9ed9b7027126fd7d2cbf603268eacfab776c8ae48586fae3c093 Len = 99232 Msg = c4ff5c87f2dcce57509b470b16e2e41b6b8d23e0d950f554fe9e151a84ca97be536dc43d040725c899e9dec56c523e1766d8939f71094302305318aded21dc17d34726465da073950ef578b46321b7f0067351b544541b51c12af3fa6a7c5513ac5629abe3efdf471689bee1e1997930b228042a3979a5c819ec4e09e4222a3946627673803b9265186b5853cf00ac5ed4bd540737bf0befa061d0e0415c84110933b4a61bceb4777e64ed12169f7703d3fbeb532870724ebf5022896b728b245e908c4d9cee6c05af3c25279cbe03a617aa6e16f3d2046edc82ec0c48ac66f9ab42a66feae4e29813bbaa994ba578cf08928858802ee9d661c0d56fc2513e195912a914eff83fb712a921700a9bfd070e7adf22b7cb490eb4d085bcc0ab3a0ad1c53e449271abeb14cd35b5c0e9bad4912c1b7b80f34b9f3f7aa5fb290083567a260c08bb994dbb81f08c6f57d8d8c1f96ee56cc3ec17106888dd32e7994084bbfcbc6752b64eafc1dacea6b6ae7f53ae09e5fc68ffd6e999c0d46be1be9a1dfe0ef56a4011d54f3c53a462c5b3d61418c5c2335774b0b339ec33adffb7b9a8aa2560186bf20b245b23b6ac6c31068b9f6924197893ccf4b0d2a10129cbc4ad2709a479bca018b58411ab8b936e3640acbfb5b7b3a35337653bc76d4743e3b5dc826a951b65238a20e72b0822b38fbca58d1a14f1ee6c01c2ee4cfc4167404733585a757187542c986be02a01483986f49cfe3818ba40dc2eb5dab3ff7f00eb93521b20a44fd42252666ff919755b26ffb4072c1250f74f1156169c6ad34e29643a569e9e05cbf4b89f837d50821e25309cddf7c5f8b8e3d49aaabe68ab508a0fd6b2f845f1612b31e0c2bf8fb6a90aee1e29a11bfaab1edd493e21e24e2e95faefd835835bbc4e24efd4c6bf5b255da0009333fb9df98b952b79cec10511d38e4c6f5d3f8a07e5fb95629ac6b7b9a7b00bc2b44c2acaaf640704cceb1821ca33b7207961c768791d9a14448e128e6e85075f2cf8e94514b3a786234acf850452f6938fd05a0791f2c691cbfdb6cb3d87bc11a4e6229341e8d1a8dcc571660951d26faa768b0db5e2e18237fdea99991ef28122fe1ddbbe6d4e12fe4348eb5f9a135dcf3aa2a26d55b28e9175f5200cb27057b128214614a8e66b91ae9a3d909381040804e6ed42b3025ee04c20871dabff3a564c78fcca03605c9eedb08324a6e30d5cbca017bb6499992c6cb3f7557167d21b52682468e4868c2be8d2e6a13a031fd44b184761d03fe87dbcf6973a6c70c807223ae776b51ea44387488e91b6a7e3769796a6ba60bcf3dc2430905605e1c422a5366c7dddf14bebb259a27b8498004c89625c507ad761508cab0931a2846d75c1a3dc05c4c72a2d514e4ae80b9e1f5e09c390ab8859dbe2dcad2b51ad1f6c075fcb5e94d268e8104c6fb05fb380e8b200036b51f00b0899fc7f1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176aadb518125cb94b7c3725f5c0755ed4da4683339e4df690d4a41c5b077be8af14ac241be4bca46964a77874043e089be852dac7d1362afce4b78769ac5b20b507e2ee42336bb647316eaa388966872869e8a9a9deb2a6581b5b2601a8f765e7c8e47c019ad44f43570f43c9bc892b18f37a8870334e0920ed11609999bb18b5cc2345f097a1000c6a0bdd9e1a1084dbf98affa16b62b3f5ce7cdfb80b20c98d7611e495963c58f0dee6c02c2e9724e0008c67c3e39b473553ffebe359c2f8fd7b52c0473310caaf2a22940a66777bd39d11594e3842236e020d2d82221c1774304871abdac8c585d031e19f5e4c0a15239c5ca6d601e90e5d471d3ad096b5902975613a19beea1365a70171728f5023289fea64595508a4da10237401bd43cfeb6c27585c7d98d65ef4ac275fbbde8c308e7b1d1eb5f2bfed0ad8a4220a4281ea9f3cad3f9f625d30ad2a17525c05cec00a9727a2af47ce1a89c561be185264ab71099f2f7ed7066f3303c806da76595b76b71a819b683de73f42232231d3c6a29416b4a89657607f18d1bff9c1a0ca6765637c4814e4ade77e077f1b114756747b0c7437906409f4e11c7587ac0580885924b342a63d9c7fe86dcbf5213d627598235458e79d51450e3c7f5cf4251a12c463562dc9e36834e0ed904cdc26993a7e23db88f663e50402ca33c6347ff5ab39b7eb45fa76bf8afa1f629ebc8359379f66804457481396613e497fe786b1c61b8ad947a2580106b67bc9474ce421016e63d91784ca8b909c1116d677d9ccd80c54a69f7c07bb1c987b2ae307b99f0c7db45c8ef96bab7725db22567fd9a5656ecde9b9c2166c5102961dfe678411dd4fd060f74f9c01aea104f29c6a16ea02c53f09232f0483389774f90606c427d85730acfcd1dc1ccb70271e04c101f92492208b580d42ae37c9606276400a5fa2166d971c3abc5b4215a9fb2c0f2b513f782ae6e507613bd30b10e0ebbdc717bf2fdf95b1e4bd5ba72416207ecf1390d7c9b6b25687e0ba9efeeedab2da7aee73e61f4f7a6a4f7c6f0de414796b3b2672194c64091931b8fff752d68810964284eb952ac235f35c0e55ac4da87e028092e954828935d4957a96f55ac81ac9c256a2e99e15c23979097dc73298721a3dbebc8774536869fe93504eedef3355ec6dae853001a99241f4f8dd79a5e1e2cc49f53deff42b3252deb5b7f68a04fb0f3e50e07702569e45354947796d37ecaaf945e02bf7e8ee20c139d90b150a09c94d4c83e99453adf15f01adb86afe9868110126debb3bfde6cf4f1aa21cad02991ef407fe342b41e4e69478cd0ba0967235c96a6eda9ee2137d7805420d8885fd27e9b52b6e380a8e4084211debc83757dc013352b28c2b4530472161640704740c9043f7af14685c11534f2167d02b87783b1a30ff8e39eaac3ee786bcb2fe8c118a1cf9735adbecbd844b8e2c42c39faef9776ffe0fae7225c1c0387416e4b3eb29a8975745e5aec989beaa95ba9ffec4aee3965aaaf98a516253ed36ad476a0e018f67c7901610b9f6010d208221237dddd71a81ca9b71a3b31b1b50e0a73cdea439c150b3ddc0f33bcb3c7943f7bc1f08da830ff914f681167e596f4b74aaf184205a6f1bad2e29dd75aefc7a74174cb2665651a0e6579e1f061dfe584012db13eb999f4214b6b25d88db268036c36b5cf31af37c90334f2f4adf6a918a22eff5e3e54dc1a4f9212e8d47841fa05f1f8b093761c6930818e9a5245081d349c48cb1e41714ce73fae2eb8a91835128cdaf213229297f548fb0ad732ca38c05ed5ace1c67a601a5a3fd3c0adb65b9eefa4bd391b61fb5971826dc427b6134d5cee2a0d4dc1fdf1cb0efe75ede315ae029d388ec9513c64e56beba28b9556e37edb6d2c3d0ccc727a63d85dcf660b4cad0f8c99952a031e8afeabf8c62fa98aace39cc5fe2475a750868902bc09e47fd840e0e2e5b3f7904983d64e404cb24bce4fdf61f8d19f9833be38ec1d9249506b795df222b5c1c10b41932d60b41c2dcc67608793daf24c0c540da158cae1c54e022b50b5f908b9b6810b1b902e8d398e7344bf370918cbc49031abd77955e96923718404447581338b65a23884ad76fcbbb6924c24b61d41bacc9200674cc1a42458177961b0206ba7ca4abe7c26ecff87dc863af4774b6d1a05dc3d5b6f57e84c07907b16609e451d629a8bdf9da37d1ede256941005b2ff80513f51f66b21be5a677712d2d04a834541a0774bda45fc9e5f741d3fc586e9bf4be8f79d8da27355f55c56cc1597e35c9529a052bf68ed019832b711147144cf96675326dd8f28558b1de9cc1a5ae68e8cbad5892a1f17ba1518de5e73208533c920e12ceb3661cb9132485d8f02015da0ca63798ae6f11a5e9d0f5272032f8e6cac2e0a3736a44ab03ffeeac43bc84c69def68e524f2dc4fd45d6a791a7a831f97f9669321e543560ad7a0e5a56afdd507eeb3220b6122c5999b0b8427c83b0e7f1b6a47c3c162e1af14642c1f12c72fd10de2f76ba32c2fc0f1a2f14f0469dc0c90b56764e5e9747b1e0029b89c2bfb83b3bb0b4da242b6d1c9f5679a1655b0c6c10f9a09392039f55e3c8378f07162a6470807b845ac82558ace8f11e647b334143f88bca54e55a53ae2e267f6e18bc1338f92b574b1bad49bf311bb5d870ddef20fda8411bdf3131bb8f08e97c29e5cde19554b179a86d4662c94a1615ce54cc445386a65b339c86a8852f4b95ec5ffb06df88217af0fdf5243c0c9db106307f0aa497489794f4b8d18b3a145fb2633115522625a387d7cc7fe3f3db4e9b196e006b6ac65575e24ee30b99e24e2e97f69977bf4c97df8342d27b605d230f481fa21261ae2948edcf39a0cf23c5b376c20fcac3f4cc6a78ded84d0271f2c5751a8c242c5e67a06fa061d55a577ad38819e4c5d4bcc5ab2116dde33ad8227ff8d51b3b2b55a4fef068e803cc0bc2213464c4f35212f82424816fc879ee26717bd5cba1df2275c7088f38c684af200f14390ccddc85f867fb950a875032935c56933a02c8533e9b2099c09824b0390f901d38dfd4842ae90ec84a8a4e33ed9311a3d2c8675683edd11f3bf31ccd61a54077e583caac2419d6918c5be46099b8557e228d3caada218265f751ed353e629ddf7f642f5c689d0b976c7683572c3e6a98a5abd8ce95f8bd248f5f16b623ba10ca82fb83135cc4f6304764cb661987e979d8ceac406bb5f9c16055199eb63e41bf7ca4667f95342ef2c9a12d4be6375a98384027aebffbc0c326ee667d6a419924e91939ef966d2e555fa6294716cf367a50baeb48072c9ab02f759dc0b4768fa144a48de1d4d26cee65fe20062fb1f5a69e8967cad5eaf00ef6a52007393fad9b1be0c2f4d4f683249913d1f7a58210938e561d95a099594628e78dcf4d2f7ba8db5889a71b5bd97e55819f99fcb22fc7bc8b7d46fbca4edc12a7477774a872210f7642671c84f87227c1f97ba9b4abc985a4273d4bf04957507eddae545d09ba24b47dc35cd468968c4f600b411c0d0f963a7c0725adc14e7ed8c0b2409fdacab7ad9c2a60fca261ff9463c7375adc004ab91c32fd554f07ea3f9141ede34de934dc3e3aad501e4afe3b954e10f381523f9a683f47796b3a1f3dbfcb90e9db7c289ad442a66164e814af54fe5268a56bd168e08aa8ac7e4baa3dbccdfe062c1a0f93eef0f0b2fe9fbf6a2356603ca0b39cbf25a3754120c307ca08b779ba88496641feb3f0c753f86af690f4eef21bd01de7a82851e9db26b46d34169889a870a91f840a4b10fd78b3cf2e48430b7f37c17cd877a2f905ed3c91bf79def5d52654970f7254225397066e4bcf00eb3351240947100d11499d0cc21b4fa181c6d10542f16a906e1ee9ff5e79f7ad33d0b2b1f7648fe4a51e9ca198c806a4afd61717adea81a46697d7eb1a5960ac57ffe2f7e1c155be36ed929760563d5ce28b4f28325b25f4ae56e7761c3a8882e9e9586232de001e493ee55ac346621edc6f1fa36ab3e605a7e4af0cfecdedc54c55999d652afd795eab2b683c09037ecff9df05c195305be5b9753c1c63eee801ad0ce61338cc53d98acb4c252eaff16fa423ebd16fa36bda6e00700f9d3a6f9c5848e8b777eb326c864b833917a61b2e0674b214b3adba084aa74542ea2ed09effd421bc78e8996a063289c264a4607d8957f505f1bdcb01f7f02840db5a9f6c0c150dacac22fd648306ec6b862945e0b534211fba521329fe6195a3d13c4095f5a229029248e2ee953f079f0c835ffa129fc2ec7e192712c68219c67c4248af5501e048bbc8ce5ab55187c76860f32c19f156d6ad618b4ec8c821332d1b3c1a929ae0099901245b5bd4d99f1a40c3f933ef5978d8c99420adaa487474157f5a46f394afbab09943013f6960928136d408d0574d70cfe64acdaf0c04d1cfa700da927ab5812571b43e07d3c671c0b06f015abcbf15d3062fb15cc85ed6a83780d60dfeb58cfe62217aa4953b387de50ca5c5065828716841e12a19fcf34da56cc1bcbd2a4e89cf1d3fcc2a394727394f7ec5d0b339397123d59d8d79a82e75271625228e46863cfa05b50f3b3e4b2199f4d3883ac889d538273d7f3f65a92b325bddcb4bf542206a6515b0db8e58329e8054b95946e0f9013e708bb8dc6c3c30fb5d13fdeb6c1dc0c654bb74a7dce0afd9efd0b944ed411183dd2f904cd62c858d19a91e995279afb2088ba11b57b0504a0b5ac532fd61ebafe9c730677570b279a9d7287fa3e879a087adeb79472622691dd3f7a19fcff20b1d0f239cd8ad4a59743aa60eceded12a78aeae1239c698afbdc8db0142efb74ded53e45d6e36bf950f4001d731c128a851ea83969df6259651a5e9e29545bdb0d131fd39b4b174d4d193e6697b33f2b28a0de676e2494ba58ff79eb5f57687fc7f25d8b22a821c617182ae2619bbc1d1a7655133a5448d65bf3a840bf1d678893dabf1475e4d18e355b8d3ad8bad187e30ad5e4d655c6d4f65eb1454f8fa31efa330f179ce56fcd2f482e1605f9c69109c22682491156ddb1a85da1199563678365133b9d9543aa8e49d71cee40e26516080f969b6e4019153974fd2518ee8eb6d8942982da954ed8c54ef79d786f28924359c8d456cbafa979be0079fe8db91bf45988539eace198245c4d1a87b30503daccbffdb040c8f5d103531f3188113b222c0116c8d18a53cdc9c76b57f722f33730241e64e78b82a70a9d1f9727bd9dc8d33cd5404c71932a5d0c9acf82a7e9c14d9e3d590821d7649c877f1ab2e5c95017e097ee65bfdfa2e0c5afd69ebd6ee0ebd66479ebb17d7181b949a170b34820c09565ba649cc09d1999b056918c09fcd1739aabd864fa3481da8513aa4da1a29605468c902fbd83d131a736a43b427dc81ee8d71662d8176392395aa8db5c3c61d6424c32a15ebdd0349b5e1ff2a1cc987f54e5eed29e81f18b6f5db2860258e8b061e292192bb1de4b95b54adbaf4f093de9bea8dcd5daf16a2e0410751a5df43cac36f8c0adc8c31e9c256c1bf36fe201ac488caa04892cda7f3709d22cb34d212a30acbe6b6a4654b896cfddf594ed72a76ce161b3f86a8168dee6c2c0c2bb08e3b9f53aed003195f1eeb9473e27f039e113f12c6b8e7307f4e1f06f5ff10699e0b71d5cbcf04a8b50167381558eb4fd62230231b2b30e1528286c0190aaf57b28146a4e5fa45adcdcf645b4c233016733865d9813cf05530e9ca5a0dc555157c3b625355e8228309e7676080e7c9f1f5b224a8a134a1e68ad23e272ca58e2d4ba87953c42f47e309c7f50a4c0d355cce2e1102f3c8d22fd0da66aa2e21c709b146d048892612283e0f719b1609fec16d1a9f9ae15fed8b9370e8656ac09c353d952b844d631ddd272c81a5677482da72f644b2f26060a4532417eb7b188a2a5121dfa9697cb77c558d89bbc8c36dd2404f94fdcf80e7e4806299aec78ffd739c6b612a65b99b8039c11e40a27d0c73858504ddb127cfd6bbcad221d89d728b6fd05489dad02683546593c69d080b28934518d54fcb94f565bb45d746d795ec5bff1e4a3126e4e025c9aed0110ae65bf9fe456703f2e3cb0eb289416ab4b410d15642ddf14453313e8bb3df96ec0a983a2f1f25662428c2175f00f2ecbb7983706466c7a3af0df0ff1a4757a731f467d4460a730ed5c0653fff416e256242dea9b7dea9c0cd51a9f803ddcaba53304548d19be2369e674eb941cf15ad3fac6cfdbf2ec6b135dac6b9c6ebcb58f64abb085047e595d479c943950e7bfcaa02c8dce8dbd12d6f05c1a4d1f5bbfb61b023b350a31fa51e746f4f8784139c38027cd7c37a4b7def7f3559b3803f2a4bed29aa4111d2dcd2e3cb3d87c48ef47017e37eed6e883b1d83ac38fa1fa76e0b7e378da028c1b5a84457ae244410add8bfb722b53d29dd9fdf60d30428872f26cfd7be0c6c4ec7f5128f11cb877b10e8664273b97aa2ddeccf2da8703f70e6347e84bbd430ec7c5fdaebf90c1310d615a82fd2789b85d46aff5d39acd8d74b9ae6b917963b1d4b3f09f8c4645b6465e701d9df61043539b0dc6a0738694c97f0b50f51d0df73dd192c302442d4f838d2efdaeb0169537644e2ee81a1852383ac55d1eb0292627a74ce1c7946244ec77fde9d95e82f4322ad9f553956910e674445bb53a9e87bcbe84c3833ecbddaba346aac6063ca96c7418e38bee6315feb4f01161c45662249da32fdf484f62e5996f081cb32bfb0cca72bf352dedaba6833149cb5438ff87cc12ee82bcd81ac5e2e2cb846a39343ab44f53fc58ee1806686fc99bf52ca50cd438c816a14d4e700505bba5354d9b20bb1765857950a548eb125a78ac1a9ddb3c7c8440009546118a42a0281b4f77e36633be7b97fa9a919482c40a83ea301d8c48ecaae09a4acefa0041b4252811ae3e092684bbd43f0cec27cffa8184a3fa4d03c6fc4943a2cfdca667f259beb1a7ca026548ecc6dbde7a6a43f0aed141990614dbdd4478953db89eda89c1fa9ef69286427132b8b832c6b1e79313b751233fe5f3f6d7216c40174f622265c422c41efe86a495921c2e5965848cb71f1abf80ddd6ef0d2770ff7f21c7654b058339f7d0f98b1e3c50fabaefe282a3f2e59652644b6feb70e6a37b7cd0f97da30a7ca46663ced49e9cbf71b5c91edd16fad03ce21b1e7be5195390c847870388ffb6ad278c15c0a147a5072101086f75a194c7bf0ea6c46e5038486df2b6e39aaa0e9b7a3c07e82b9bd3039a51e760f6220a7964ecaccef4d27a2ad3992f27c352adf4c93a4c5625de72ed878364b980c45bdd377ddba25de840be63069ad7ea41ba437b4f8d127859a94e525d2681fdd1af78a189d84793dab28d83009ef9f7bd5e0df84372220a54a1ad62a8d6c0548f2dd40bd74ec57cf0fa1e9c4ee397d10fc1dca7dea290c51781921f2b1b7f6d47fe78db30e32502723df917b912b8627f0a37f2e7c66490e97285f1b09ec5304049ec7b5c3f6e0ca7a6a75a09d365915462a7402885a452149c0f40fd069a85c437b951230ba881d85aafcf06cda546d8f0b3fa67885af5de26b774dcfc065419f066c74defdb4b4d8499dd77a9806951dde3866d768d60903906f512281285889b7b43a19210514e4aeeeb260efee30850bf4d02f8467b71fc832c6a31c5005961802fe89d4f7b23d43563d9a5289a4572d0b7edb68c2ecb98b67fabc028add469fef2eab79eb1134bf6ac59160577506a9d2df8576761e43427579c7c417441dc7df46f8907db67d7ba2e6e089d627061ae15e984dffc06f95f1d070e1a3ee7e1839d3fbb91e1689f0751df23f944ee7f8cd889e4fde7770fe537b21dbbf10fa19a5521f444ab5bcc687d7610200312ebbedfa020c80b7f9d410f65522a7701434984dfdc29228b85621af9771a8924cecc91f6df494e68cbfc0bea5571b605f019923f1c472c3ff37f9031fff0bc6c4f3f5552ca869978c39d9508cd989863d090e70a5ca7b2be3e4647e651a98632979e957e8889d5f9aaac148662a504620a38eb07434f9d518d3fa8e0154dcebdcd71b840c25ae831abb1f02dbda2e14bc79907007a49d34008f319e6f2e57c561a41266120ffbc69eb3590c5869619662e39a1bba99d3ed3d9e903c290787745a69446a9498237e895c05e16648a93fb68a223027751c55225a9cf3a980ea9d298f582dfe6ea43f8cfd8c1e7008537529c5cf39b8c6f4f0417bce317b2aff94519e941cd9e40c7dfc1072101028fedb3f3ed7b4e91fec632d4a9a92085644fe550faec391a8baae695d4e72d11b09d6595df21e52e07112487f8871fba3493fb66afe9ec02d3d65570c77931d5f12fb1a9ba4f260a9118225632e7daf828adcf8290a1aefd2132747c6940d5f8598bdf57046cdbcea4c37469de301be84786a9cd267c46b37ca68ae141a4e31ff19a37c947e0ca2148fa61e984caa8329904d16ff8e37ecdec1ae1c7d80e21f4c04200240a12bcac86a532fead1d497d26108e8f8f3c1cf37976bf55b4e4591fce6c8493d66c781765ac30cfe091c871f7932a5571f0e9cc2ca26db35f8f51482301093c3255c809eef7a085a58eecb71373ebea2868ad010c87330a6178d216c8e7d847a635722a286ecd47847c7cf7829a1a763c0b3039210b58824006a331c40839ddba753f231bfafe3e06c341d84deefe203340391d7417264286a08e421f4a7326f77bf79ccf817a92b2cb03037b59e111977192550c94e373bab059f1e197d049e4b0623c4dec8a6a10fc892014c20971ef050188f268d83c659dcde513d6966e0a7c47ac9c2476eea9bf9dd62110bf67c4644f5e2c7d4dc60ecfb2c7bdef0ebfef487094c4108648047a05cda82d4b1b9df64481c4b98a383daed03ee5c980611d7aa39ace97029daa978aaeb400f5b60222a796c106d6bb7ba2eef3954e347f1c7ca969c1a33118217cf4214a7105607b5342482c4b7b774e13d68dd465713f72b44aa7a51b5cdef3930bcd7468c24091eedb3c0c70bf9341694eb5abf681c9a98c4dfd82e6cb1aa742975b39cd767fcb5c3b1d695ceb38d90c1f1320eaaa46496a7c1261eec6f2c6f35f72a2886744b2052a914cf9468da064114e3e2735ded8b89d8f491a958ed70d2cbbb582ddb8cc516f40bc2e1abb1ddaeb0f0a966ab8e0dd791b43527f1762f8c6de7ca12203a4a9d4d4c1e3ade9d8d477fd8e1f90fde841d85f567ecdb5f01bf582ffce7d4cbf731ff2630049405abb7bc1d1abf0d4794c82028a87c88f08e0814f45f235bba7181944ab6e34e82af8c002db20d3661a663eade753b5ce32ae31ef56f3937ae3018a72a013b608d0f10e69b5687fdb53f7d50876cbdf99f6eece073abbdfaefb953a244ad819c8d5102c9e66693d5aac6710ba3ed78d19dd062042f9306182773bf001b2a5a351c0bce448f60d540bae1eb56c476006766e5fef459c3c601ce05d76b1df639ecb195cfc0f6e3a0e17e0858cc59a4c93d7326103bb2bc626a4be6292ddd9f8505e695a3d9dd5dab1a6ca025f6e3e857c64af74244aacb5f94397b20d2da94e0230361d6f9733d486dff5fef40e3bf109476f01199a29f32220f5b5ae48564cfb6c0b0d5aa89010d5ebe8e2144e9a7a82a5fa6eab54a967e8655fd33fd7e8d985386d92c576f576e6f22b1487d662072ea9d625a22035f995375e74868168dfe6bce6147aa969ee001b47fe154d9b7f56788d8cc6a5d49170c079004defdd456722fdfb3feaf5606c8ec306865c4ecc423da70dde8c8e17c02838df5ac84ff3508f3bafdde1a0b473742796a1aa82d53a1eaa0fb47c6b73ce97237975b5c7d0e92d26981c3572d25bf5fc152fe03f82864320fa0e1e748ee234c336685e4bc67924481fc38e73a26c38c9ebf8a58dbb6dd59035b51ab04e43279f7ffa6ae6bc4a9c29aa9c96ac0df066167fc4a2756838fc832a7117289c3b993fbaf2829d9ba2bc4fa36df224f92da66c3b5b7efe7130df804009bde26110b22c51194d7a49caac4470ff4de3506c21518685e231be9aa70fdf47b6e8830b99edaa377484af0a95907b1a4df2f8f5fe50c809761438c17bb86ff1a742ec74770a2f149ec3b5a99fb92a859a58db1066ee6ab0e1b2c5ec840458d03bf68293730c4677744044f1f149e70add1ddf0581b5d242cc104e62ea7a03ac180e2fafb67a59299d024228b4c8196fbe4aee1b762c6987de38bc6cd4a3d64de691d91267dccff3c21199970fbc277de4e6ef9c6edb9746c031f5526a053a7a4e886a02afbb109b8b762f862baf7bfcf8f9c9ce904bc5491903e35cd62a98fdf7fac9c8b69d84e99f38ee3d2f287cb4a18c66fa0503595692b76dd23d9a569c8befdeaca30d93a7a75fbc0344b0926d88a5ad67f48bbd36d3537afbcadbde20af7091f59e90a59b4af4832292ce25ee554f865f866c57b183e2f420a27796500d83caedd1b0228e31fe2ae0400a9d00af8fd928e32d918e4a69c289f0f6e8f64d3371da62f472490485998677ec636b3e6f8e0b3256d297d2f2cc7edade3bd817856e0579e4fd916a92b85b5efdddf7abf68e509c708192c084fa4788b9f6c01183a9b63f092b310b2b6fa91ec4746b9e2cbf3f48020848bf28342b230e8374e6340b35dbea65ef905ba6b6dec99091be1a0a205e94ce8175e56273d36649bc3ca07ac976101195a12745ccc7959a2fb4c7573a08ae3b048ac36c68bf48b062bcd0dfbb380199e9e599343101aff80e273c8fd66cd9b79ba7ca3a4f103c202c0dcb2353484763b405b85b2db39f14f6c07f983cb29caa0c7403b473edca01e4d7992cd9cf6ad9bda88ca20a05ee55af279a5cb403807c209875c31b7f7bbb50c443e495f4f061ce771ef20e202322000394c286870c959fbc284d8eeed6b6397ad032cfe06365ad1a7531832cc6e5b2fd76b1f965c85e5187253b1561645b66a148fdceba4a4c23389949af5060058dbc471356c63c3dfea27376f800ab10a1e2b42fdbab2e7ef8799320dbb578ea59e90fcfe5d1f19b6db41ae57ff4353eb0e51baf3edb9663f4876aa04e8396fcde2bd7cdeeaf6ee16766236ff2658a4e5c5185653f710a63df0726b052e142a3e42ba6f5b9873b75b46095fe987a30a66dcefa39269612e680a4d0372df705473290842f8e82e1c11c497879ba5cb1b0ab0683133a713754a0046f1f28ee665091037963b4c8e72b67c9d5c7a03395d3de9e27dbc42b001507cf0b4f8beeee26c92c8e797480d51d5c8ab3d292266276cd41ef790cebf6917daeadaf9e1e2331a2b2ca5916d234fec4311a81d85da2034195e1d55ada9f30ca485b27a9a78fd9e43e36ebe2e78a36676912bcb901dce1024208d8f620865bb5471f9ff3b1ba875677d8181fe7622d0dd8a46b7e3a9978d8f1696827e43078085001ffc5632ba1c106bac617fa414a7e26d777702f60308b4a0e6e374e27f1890e082f67e56a91ed92e4de1046b1f781fcb4c6d409b971e2f4fed36c87f22c01263c172160ffbda2c45c4953f6399ce0024141f5ef2ca3a698417d0fb719933743a5a03bfc738fa8442ced2830629f61df88d01a0a422e9fdde0566705248cf50b4cb0fce04c6dc6b95cb4d61cb269cd3b915c8a82827a956ce245be9a9c8101263830ad3515c1c6cbf285a7e4b362ebc062cb8e7e75ef50ec4f315a9e09d9243d7109962253f26e23f847e1adedf2851405076e26a1f697062f048438f1fc26f80021ffd09068876975e4cda2e78261df82f672a390f534628ba58490de52cffeec623066538bd8457243b3e8297849cadf82e21dca56eda76afca2cf5743e7f83db3700d25c32b5df64cdbaa3b3e027c269205bbd57f8b7dd5f1261de537358dfcfb09ed8d78465c09e78c0ea63a579e5f0d24a63bdad68ed36c57a10e9682663024412d1312f2e8b3fc103cf1d60fd890dd870684cd957f6c557f845dc8962ae11561f63ff9f7a9fd73ad5da479f1d1c3e9760236c292fba894e4ed5735398217b6b06f9a951d49ee34ac99478ac732ff1939c2db2093a89011ce0586453316dbef78c1ab4f2c6d8f285517637357a24d55176ffa4f612e2bb587f471614b8d34a8ff13fa8debbfe635ef007f9b6acab4855a311cb7c436826656e1a0ef4b902bc98f8e10b823e7fe44c47b246ac7523c91482fc8c083689b0d82f49c59f9c6c73a6e5974399c8ddc3e1ab1d94838e1ed612a9286d2686b80935457ec051dd810e3e49eae761e588a093aca269d831fd0de4781de5539e839de142f185d816d0ead3b8247d971f00f8f6ced93d171b6eceee92559b1bf86ccd80aa7a9c7ec2eca7eb92fc6c95cfe73b6f742a94cca4b497a56a67e4ec2ee43687de426ad25c24b40a8cdb3aea92abe6825f2ef775689f06bd72bd6940ac7a575b7111776f5d399d94e8397ef1e1bf98c3c25eeb8dc15e8a7b4dce8ec5ebafbe9fe54048a2406bd33f47af9f6847a2c0a85022c78269a391835e23cbc876f4cab9bd576517a05be34e1da612aa2ee5dca48b23320fabeeca5a2655a6d4e8da0a3d6bdf533bf78a4c65fca57f3422096b3cd5d8b1621290835428ccb6879bd00b9f6340798ba0678d0b47264b92ab7deaf5b29bac4638495b25e801614d0a672d5456136e83458413929fb0fe4235c3ea63b414a9087779c033e69c3d81df101df096d098bf51607eb068de1dcf5b7bc7eb6cbc3e457a923102a6e5a1e2645b2bf8b8008e9c5e7d2cd934f610a686f632012f0ab2799c335c16ab7644db44b8f5d13c0bc6a6c73abc7186a17d4442d387497d78cc1166cd7fe456d69cc8faa9fa1e858ac77b16399c1dc068ba3509845628fa9ed1a964d13af05b8ef057f0bea74546e61765d5fa5a3284946e0555991d3408d579ae10ef0bcf0bf805f4c1679bc9d2b61d1380ed655445ecff11b1724adf3ac51a9be56770d4faba342bd7253630cb636ee0a1934c0786bae406a7b07daf12d63aff6cdae8a69a3e1169cc8804fe93867379b27c7ca0c996c330a2d41407f391514511c9f1c88d0c044afbf096a7cd87d12b3e1985c470f9034c2d4dac9e8f8f04097eb52a9f25aca32bf00f59a0cbfffe919efae5f72f6a2aa5c18db5c72917b9b90e1cd1af068874993324cc9e314752396f811b9d5752afd9ea34be0672d3e8e04a71a58ca227ef1f5fe17de47006828f2a4ca54b8b5b194511a323f0df3c27fbae5414ac8b13793ab0c5dc181ab5f60f59de01663ddbed93d289860ad0c8ed77b4248d7323d3a957e03265ad93ce23366885be91d16da332973862b8e9f2bff0f6639e94fed1061368c7a9196db79090f1044b430888c0adea30388fad51f5d3efa1b6768ea405d9b4e624e02b2ad4ab6dba25fe25a5cc72561185f37d6f45bd0a6f738c55c52f374f2e57963e6055e24917dd17cb5d2d0c455cc988ec931608c11d446ae6ace8a8b1f0cfa02a20aad21dbddf445c0778e8326271b47d65fd33be4ba786b3c3d89a67edeb9270c42a07561cbaf87a4d2692c7c31d0aa27051ea5c6b2b643fb275a8eb6639e1a4c379de7ca4eea88886cca8501f3a0ffe1aba89260c2e880cf12640b70a392228b710d40be6f8d9295cb17585b74718d2fdad9ca5af5f668df880fe554a77b88f1775948e73581ebf279ba6b32bc2d9d371819145b50c9445410c3e309764395a5d0e7c7eaa8acdbc9fe19862fd4ba7721f0d03a0bdd475b5533e8ce3818d08ed007218572d0f7ac3fe09e73f9c3026316e7660213a359f70b77e66e88960cbe99a16e4925b64aa47ea9aff93991eba93e8743351baae85e9e67268ba2f7dd6c292835ddab618e0daee0b6df97475f90c057d09bcafbdad935880eed2d432ddfa724e007add9a92df60e1aeebaec4561c4df73fbc99d19b0f864075bd282e3603c1bd690d327854d7fba43ee4b88846574a8951ebf988b2b10827a9f39bde73710977f40c45209b4716c99a7f12406e1f6399fcd55f51a92a56acd7f09fc21ac4a1f43de29621cacf3ad84e055c6b220721af7ce33bbad2cdea56ac4eb457907133c8a34a960a87b2d036c631f79706911d407e900f22b42e4bab73686a2d78f9274bc08ed53946a48f9b9f6f6422803faee36e865a27e1cdf311e9c831a238df05241239c43c8c16c14d362822bc23757f0eb9109d48d02f69305bf89b54549545b814d5f382bc8c0de226e6c3b274d4d6390ae9590403c5166d668417c250be719e54dde3ba7c76dde0fe45c7a3d8d06ce8c05b0dc7f111935f85d5276ab1bd013d3edc05323059a9c008af9f1ed3eaab9475f03c232cb7685d36766acc0c038d1b4f3ae8988cb70a15e2aeca720aa60ac2983354941b08fe0cf4d22244a4447dcf1284fe4bc611774928adca4bc1751309a3bef7994098dcd54d930e832ed24bbf0544c6ca80fb69d027372f1aacea5cc024dd95b141d97d5cad138006104f8f61b3f4c29341d76a518ac5695d3178309c9829af6a736d67e99fee172bed0ea16d9b0f82449d27e133bff2f981e39136e57a2db53369a72532928d448309b23a29171f864cd77f76fd232a603727e7f8314754378aa9292d9e316b98aa1abcb22ad48f3f1aa540842470e62ddb92cecd069c27b6fe9665e9a2d92373ef84a091e94fe91d4c6b1da12015b0c2eda8c84debc532a40dd5eff1d7062f66e1dbe051fae5b7b140bd6946a68e14bffbde66f3476eef9f16cc29dea154f9f21f74fe8ac632659b95f0a5fcfe467c8574a82d55a005c908c80d95f8a8221da607047da4e1b29d2ccac9763cbddb72a3e69a7ddd9c065961800ec6e8421a04e326fec028c3e2a8f53d9c3c7e5bb971abc029faf3820d0b49ed443f2605994a49fdd8889ee34f23859ced7b4a6e6d040dafdb074ff87679125e42612a791c483afa06196fc654974e3731a5194c72a439f422354b75df0d6b518ddf6e033f9946ba1bf523f3af6ebfbb0d6c739c46ccc14b94076e709342a5658afc793a6fb7fdac8ece53e19c346a86d513d1d4660823f4b4e0317f5fb36118ce6ad485292eb04fe2f76816b762df392d5dcc6b6cc0e2ade9722cf880da1ed9cc8cf889f8680f229cf2d9199d847e207a8cbbe7a7917dd5b61fc982a3114f3709e56daf59ee7ab321533f509b13d80b412338dfc2f465eabf5b9f94331372af0af69c7bca3c8370249b03525c9b6d2815d3cb9a2b543b7b49b807b3bd3b19a054531d65c5eca9f80b3cbda54e75be257cf0dccd6d5b5f0609a79a47be02b4b95a6d68f3d9496ea939aad6bfdd5d4b71cb2cf4eff55440f963ccdff691f4c46891b7f7ac710d42025487e708a59c859ba4ca9c584fe991e3ec7a4116e5abd92caec542063992b4a1d036572623ce0d117e6c4bbcf985c243f842564f35725373f617e0877f6436f62148af8ed45c3261dc748b747eb352a83bb797f5edf2d3ecfc225ba6df0c597dec3168a933e1960b2395c4254beca37f1b4c7ea18ba7dae645670bfab4f59ca785731b0bced8c88c08228e35edbc65371b6382e8ab0bc8fe566889e9bdba611181a02f3d01cc2a42eebd522cd08cf86eb0af4d21b8992e9393a95dfa35b5573a652b2da379163bfe4bc8b870a0e8dd947f9225e320ca9c54a1abe0b2d990df90b4868ee591518deca3d719b7bb5aa536dc9eb5a3903a62aff4e2ba9a05b77aa2d444db59f6f890bc8b6b0e589c4cbfd46c2764f97343421401d0541646a3b8ef58d89b96f695d4dc66e6fed9c059addb82eecc5b467f9b1f5d1745be18e00ad4b6d438232c93cadacaed73c1d3ebffeac537442f8669de206b09f807f8e6e10182aa4965158d03162be10597238e2650b7b3750cbf8c9bc5c03af37a6342ebe420dd37f32debee3d0e641cc05bbaa1cbbec5c7695e42548dd11cb09be46e8bfb35ef8c53f23b1cbdf6e931e3d8fbf2aa6ee0c3dbef3588d72241c7d2f8d431c51653deedfee4ff0759d2dd6817bca97 MD = 24735a57531628f9491400828455cb7c7756b74dc997b40728961c275d3245128fec89dfc189ba7cde92e849311e662604eec6d8e5e85346b43b1b35e859ec33 Len = 100024 Msg = f040505326c87eba5d23b28cdb0c0f71778ec0f75cbcdee20ba394c49f7d81cd55285de34bd6e0f58805df8d3db2b9a54ac9f1bc04e11c293626feae6696f05059718466d9ea6cf1b523982b0a589f63c15b60075940e903e65998495a657fb104040d04566eeb53eb65258ec9688a52e32a5501e2420d182424a9bd0550f8985ec940e44cc926c633b3cddd0249421ab81f18d2274f4f11f76f7b32efc021ac70a8652f4263e2f094f5da413d638f644822f0a1b0d07896682254cf9e1ec496418ac30cc1a4ea79161392e1031e39d89c1c2796062b504e7e257dbc9cd0a7fed955a3a450f4050ac1f53ee6dbe2071dbbf303dbb0ca9fe241603e227140938a41f34d1f77bbfa4b9e8425774e17c2dcad91cd9536132df9b9bcde29a3d44fe5804a09a4be6192e3b4a691bde32532bc7bdcccef2170c23cef1fa7f8bcf6a5b59e441f5bae4e957b0b44c8df22741f662cbe4a0ff7482553ea73dfb8440d5ba3a4c8d66dceeacbbaac471306936c5181c81e8d1d43031fe5b29ecf90c1813a5699bd7802a69efb499e95ba5abf768fb658e3de428a08789a508abfa9bdb90a77850d4b41bfd0efcfe91805022df8a3ade2f785a556c1f81ccb1df62abf1f93ad719f9853a0ea6df596b63c27655c530d7141ca702e9566102b41be3c501a9ca1645ba660d1523e63ac59a6f0f008687e0aa9f5c89bec8c2179dd5d07f712effa6629bf8fdb722ac033e88c865566aaaab7174dd7242f30f5bcd81cb23c6f52617ff1290845b0f8b4344b36101cdce0367f731bc551c41b34fc1c4366a79a8e7eb89b2df4977672e9b56aecb7ced4d4cd6ba5a7baaa14158741901a4ac1f96bf8180f137b5a2b5e04c12df6a3f2b54c15819639ddb887e696941ce98711f5b078a73623c4153685b05d7c9bfb10e711b6cb2c195602865508fca8f7441ff727a56ef6a5f85001af93933f25e8b0d2eb5951508f4e10772b85821c8daa746596287438e03e94f3a3556a5eda915bdea1a61aebe2ed6bc330b72d60f3e197a8c6a8c2e51dbf67742b9febc1031f9873fd442ee35b5a9ad32c43055d711010297fce5ee3a4a254ec0d191c50e7b9f0f9c5dc952242be250ee7d412f94f5f684f8842521cbd10e0c3126a07f4d088ead8c215578edf4095db28105d1dd4f72681ababa676b0319562023ab49304b30e78bc987d11790971a4b99fedb24900d229aeb160dbc42cfa2fa5332916cc63e4417b0c0f92594041d0602aca9ef6a1f5ae5afd8a32422a9793c3fb706670c0f59cc61a13f8c80e8ec7e659fdcb2303167877372b637252f5f7233a916938f1c8ef666a932d0c9bdef013d38d1f184ebdefcd074c559ccd9bc18e9992096c1fe5a324a396186d0ebcb5ae4182841ca9727b2313f4f208c2115bccbf7d2d5371d521c66d25a1358fad7d814ae5e1793cbe8443062b21fe5ae02ba55659bd36101fd0147247b0aa483bb15297bd1d75302872f386f9cac5bd8f9be1032fa05d234b17d857042d165eedb7eacf122259ad39adfc3b67d5a612a611477006c010d3e260d8c76400bffc4bf8119becd76dda779d26cf7c2be981aef7a045e60497486b12dd687012ee48dedc8ea35424f8e06caa38e741b2d6342eb4b429d85439a96e94afe22f49ea6a2dcc2b8e51f144e7a03dfc2ebc53b450aeb04bc5e298401e735016deaa8efd8bc12eae05ec2697169abc3849f7f7cd00b6532dc10fb8f2d103adda04e7ca6dd3206be0af2cac3a95e291b5e3fa84676acf0521c4649d98e7a513c2fbf0e38369d4ec89351969758d00223ba2cbe4cbb6802ef176eb2d798be2ea986ccdc387766518713ebb468f267cd9922e74fd410d52366381ab51dfe3419b22fe8450c12159565f731b2bd287df1d8130fdb91097cc85408aacf210174a8c295a1f7478933a101d7b400184d9b155d1506cfe827b76834f3cf7f6555085267427a515f6f38fad710032aeee4378eb4a35cbb6dde2d8995a3c9347f6b67bd1cd0e1f1d816ae19524a7fa1c58eebe46b48821c86af37b2d273588cb3b70b3f6fab794736220b72ffe1a9f3109010aced7f0771c71d7e6a980cddf6c6ca7b5fbc4c90cffe13c99e5c60129d74ba5e5eb7b16d49a3ab5a1732bac9f10d0820a4af3ed90a945e70f1e4603a1f56402d60567a1402a0cb635f5f07bd0a1b02a39494fca2659d848a24344c90e739d3f6584643ac4b43102299599e27a0654c6ca629f09d9f7e088d9ba89fb78383e851ad03a896620efc005bdec88a627047f46fcad51ae6ba6ce3decdd40e72e8ffb7e51b13530568f1852d4b3165cec087d347e3f4baf9d724355410740643cd8ca187090e72a3e58339642b433a23da7e71c521e9ee3768c0ea922d1a4f64a60197093a1465bc194395c6eb88882022be586df12f352dc3b59c1f50114a64170110f24aafbcbc5895229c286bd0323daa1fb8de3f205b8c849262360377b0750da7c8974ad823381a487a5e8792d88fd4002c4584203f37b085f15b6b67d85489b3f2cc70589f4c25afd7fa464091adbed24ec3a8c54739cbef432cb38b4a3a07ce1736babe7ee949a14b983279ebfbecee86d5177012273926de16666294a9fa6e9c82746a40b418c52b94d6af560ec0bd6b065ac11e748ad538c51e8e3608e41df92c47ec932105a42e8cad414e6aecd761b3ed28ca962372e9a5265eaceb5744c380bfd5c4b482969aec10e05374c3c5117a3927b520a5784733286477d5c68b724c168683d32245174fcc0d03d0e7fee0d5e94e5c98835df7fb8f20154cb45a8bdb16af2f2167081a041917bde3cbfd563357fd2f624fac625ae51203a4932a76ba2a904513c38819c592910041d238f83f1fc4ac126cec2d0da4dad1920573d965bcda542eba2dace0c319696fad4a3d35ab25612d5d85ae5068caed896ddf1a6a57fdead6cd613a02151167c1bf999bd374afdd17a4116cdf8b62e5ff4ec4c034867b67a08fdb4796230979ec8bbfaa7526b48e65d307ef07974329682abd5160c2c3592043f45c0957721e449424dfb71be3d39c6ce1bb6506ec46587431445b97663dbabc34fdf83cdbc36e5b51a205deae7b3fd437488474bebb44ddc91f916ef493e44b25a3df4db717ce63cea7ede984b3a49b611cc24b3b06b1a9cd59bec3deea31633ec42b049479e9201437dbb7073b7f44f7becb050197237ae679103085af36a6f8f567ebe47843229b085be1966134438394eb3c731b1ec38cf4523f99614888ecae127e278160ddfb6fead3c2c348296d35cf5c3fd108063961d14b7a9f0b8b7254b745ee23d6d49df505180ce04f594d27c3dea87783d5643839deb9b6e421229fc2ada8ddf988fb2e3728e536ae757bd1854e4d6cf693a5ede883d75756dc85d5d14fd82e5d7dab720d80dc34d9e0a1c97035af2ff4d366f969b543eef83014ad4f970c8387252776d4aa6269763d3786110f4e4ee3173ff139fd9fec3cae476caa0db67beb11e79339101852f7eda57de4359b3865c1895bc5b73bdd98b9a6ba8d2e46861dc6745db75c5e7fd37484476663267ad184ebafb99cb84190d4ab1d45736d2083a5464cbbe9b55e9d645c4913f26094dab3df5371f895a6b9a1dceb8f777ad9b140e5d6d342ad6dba2f8619798de9f4d5e0cced9b65448b7783b4cba7a500101b2bcb8289f1b72bbe48aa2f03701349579e4cd4726d455e5f0cbb344a768d7245c87fe63c6153171e5230f04e438cd0d44ec7bea37b289dd4af689bd476836eb5a97b68872c11ce5eae9313b692b749d074d5f2ab196ec87cee3588d22f7273ef31368fe6bc63a003e078ffe8d81302d092e02705b2787cbc4bba71b00beb10571239d2d79ce94a828a3b2b317e30aa593b8ea22fe0e619273a5ffd1a964dc281af1db7d647e30c6efe620c4d0f808eded12a1aa62f382c224cae716e492b09037a2ad56f3801843dcf76397806935ed5f66af6e4f7cf3451f51e7527bf036230f619820f07c540537fe0396efdd968e31d99ad88d54bb01ac6387ee342575caec5426432119eaf648258627e4fd35b6aa95ec4ee321e2e013285050d8da756e14a3de274e00e4fd569276b42871194e13c22c3a1b8c71c99bc7c9e12fb63ff5d077483441d94901ab6d5aa484e04a3fb487e303fb3c6fa38d697b090062da4968f8edd3c14b22ec8ddfbb5fbdf2d16fd50d98114cdae4583135ec3115854e50244d546a95fe76a54510204d9e50b5c8be7cd3ccd50dd9cfcf54a6bf34c8a4f44c9f0663869b4d141a2711d6eea2fe31b7fb1d9c607e54f0afed311d26d3e31b271589245ccab021564c1662748fb49107b2fce9b3d460a3192913b1b24d13affed86717df32a5b43fa9b859f9c0e0d2f7cafa1b98b802d05430d6e5a2df3d97190f27a2d67c37b51f637e2345dd8adbcf6b9f9ad4d2445fa9290120bd3068bbc0e3522f0b4f6b0c3ca5f128208db894d7bc72ce32c92d38603c1dc9cae99c033b7c6f2544544ba1df9597d0527874e556e6fb207946c544c193b14a92b1e157d10106ec4a33de5c4f5bfb84a247c5b69610c2f670f015691353450add31409fcc9aa0ece5932c26d620a2aadaa2b4efdd6350b9e1702490a0a762717210c0c37271c48cdc1c3ee5ba0c16acc030477874072cd2926dfba2aeb58fe71bf76aab0cabfa37f9771b834446def01d9a8839a323dea74b90a08586a554d49e8e4440e173ca52024ccbe6bcf782e0b8877f1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd8edb4ba67e6abd2c9956857619ff4d1599a429597b3420c58760e9c1d4f5f28fec69a7802bb3f0686860fb4fd8e43d692e2eb349077f6e51867b4e6d3b810e014a38801fc96a1afe6916b2a759c086f2670c7fb1698bb72bdbd538ccc9d8071af06f61eb203744d5e49e31e7653c31968c6716fa6701033bce952e4646a2e5c42537cf4cf7c075d721200075c400443fe466fe8dca895a69a6e4b9437989b0e632b854aa17b0b5eb67c5a8bb3eb3cad4b832c1d059cac59dade9602b2b3371675f19776d49ad0cf900b4b01f9afdc83d50f2e62dde6d4bbf29cdab6624483031f483c1fd535f83ea3216a00ba2884862f4cff60b1f19f5b763b7225c2c71f32b391db8c3fd7021a4461301e61cf9512becf178d2e677ca6da3d04e750b56c43d7610e6251185ef1084d25a18d1fbec807f7ff4e9f92fd2c9313fb61a889eaa4ff283d38c5549f316337c330989342049f7a1f3ba20e815b4542de2b16df1ae49f69f05619361379f9c3814210c4cf56e9a81fcac254a9c1455c25ba480f9d613ca8b060a9178c391082f86c821ec73d7b1449727cfff6ed37c25a8598a5b2c96b6705ef118349dd6bd89106692bca36c83154c93e5ac93d7117f513a52c2b8b80276937cef3dcf54046d3b6325638c165a1aa45930fc140a5cf7dfada2d48162f5c42f15e03c61f524038e27a38a36bb7c7b26df7894f852a5b6d91c40398f7dd883ba23b1d9599f6774911ad3d8aa4432615b8e841f479933e4c7eef59aeaeff3daba0e2bbbc13c13e8cca47ff6ef9ac4f4c9ce1e4309c64fa8318b899f9ba28ef2b93d168ba0b37186c82e6d8b0da37a5bfa080ca847c1412aa05bc4efa97cf1f33e1a3af0ffecc9770c1e66400d499cbf76a217f7097251939cc66e331c676404d20c5e93e5cf63e320de32bdf6737147c30607d855c1c70bab344e12fc4a2e4dfc7b4c1b5a4486f18dd499a9d009421c6b9aa4f23596eab9570d2d35520c98f744cfca3167337bc9da6a63aca4f25765f6c8b6eeb0d903c627b9d3432597ea2a3271a17d12848b948f07576f7918f84beaf70473ce725a59a3a008e57ed26c0d4fc799a6651ffb7a35123f9a57626df6d18e572a9849379b542a94c364a565c9223a795568ec16a253f5e1d546b8fd8d32f777bb1546e2b4c1c03e84dff81f8533330b3122d42335711705c64f02f23896992ccd4e52a2cb73c8cfd1f7b3e06a0b1815e39bbd695a17e075187928922184dc3e084953c108f0ac1051b5bff1a031526012db91313aceb8f871cd13266d8428741610338594c2d2c6ad20029a4e2d4ab467eb36c3fc1d07557a51a9f5471ee5979cabd8379770a4bc8c4165229d8867d88ad29667ca8d3555da0fd349d5db7b6f45202c1e388388b9971ed0d3b4c9109622989765c9a5aac0390f7a683f4253c4b6791584a082e88476c12cf3bc78afb4d746230423edcf5e4158849baedcd35e9abe7daff7f52be6d0325fcbdc1eabfb53e2218e00ed0af698f1db2a4a2f640597f54be86465b9a74d7753a33d426c333b777849872ec452e6e5655d3ac56f80552867770f59fa8f969aeec3066c5a243a0a127ee1376638d4390c7ca7265a987d5eb8a42159566553a31a726024dd95f6a5d6743590567109f7b6ceb8d88e15b7a028b7c2ed35f32b98bef973f35d50174fac75acc2fec52e274d9c966574bfaaf59ef7199effffc783c2a06660421b46117cc76e54c5fbebcfb82e6855735dff6503ae4ff31c52cf6b0daf61f4f4bf2bf22eb3a2ce12dde7f9dfcc572ef2b95ef83d228b75f4b4ea59896e8e35db046dfaab8171b94f31cbacaabe8b7a5b996db7359bf6aaefedc0541d2513ad5fb1b431d979029be3c03ef1014b2bc015c6d7a9d363b81c76c4fa64b11b18e4e990aaa0a1e37eff3652e9cfccbd5f89880842d600c1f853ef0240912e99c661df67f54eeb060c6ab0af744ef35a515c1c265747a2fcded6c46f39e47ae744acabff3d43a02bd566b99e86765e6b26c139eabd03a25d942d5bd38e647e4dbb4db3202b88a69a007ab9e8c750f6370940471a1c12e92c3fe01ef6e71a221353cc61916624e79bb62f1855e1e3a1082062ae7f1e7d5eb10a7773a0ea0c4f8033b21c1c971f4a761f0b3ead7937482493aed6e1694be8331b7bc4984244ebdd84874b876682b672629893b83a55d4d48bad2808a58471fc9a7478a795cadf726dd1589b7a5415d8a85e803ec9442b6030e50abb7b31e052b0e8f7958ca41487171aaa207c9d4ef018e46b06d10c3710a9e0e5c492591d7e8561a92acedc7164aae9a9de13654902dbb2bdd9f8b6de2c1f2622e994040fc74066f62d047add514dc7bd9de8b5ee561850df7fe6490afbb93d27f3263aa07709804668d5844295283b4e24a3942534f84737c044cda2c6a0af5ea9f204b7d50a3501a1ea04877964cdc43ceb0bd6e3a31d2f64ba4b8ed5fb042dd5a0693c2868108fa1ea019445290587ad6821e9ac405d2e32efc9b670f3c2fe3dd87218b94e9658307e8451419e6cff3fc3de46d7f78c9bf38c5202dfb07338aa412631d0e251c5154e94a6b4ec8995b9a44ad5acf234e06f38eb5a69599e43e5838d70b44cc83c1a01397be83ae4afe5b26e7f7256dc646e9c9ea65816cc87b347afbdafb58326053f7bb823b106b78996512a734e0d8fb86072cef211846cdf35950107450bec9fb26345ae7976136ef8fbbff5ff4ec9142b70ba806f4e5a2ff446220523e7f4b000f80ad1b9bc2d5c7e75274194277a4ca59e52495bb2b96d2dca0af1789fa800d143efd39a616b1bd3c6489f33200a2677067f97fb39f15f872a9f136bbc6f56ce4addfe43ec37729df60c5605c2e26b49b027b0776a6aceab6dcbb225c5b07c9e17ba98dce5f82a850e5ab0319468e3c2a233ddf8ce8c81409b7518cd42d538eab270ea8fd5150b321519f3df1f05558be68c66a6ebc042efbd858b8cbb45535a21e53c8243f8dd4d13336839e9218a4c841893a84c6cd760d9e2548ab96895956e03d6ddb708687d118f57647c254bac82c1ac2776fa093afa76bbeec3a6c544a1b0ffc9b9ad746b1515088b60775e53ea6ef84af3d0a025252807e16267ad0ec0d6006ed24fc8be2aadc2d41b818beac407c03a495864cb64e0828a1d13139cd55c21f389562d1f553fcf6737aa9c1916734c1e03f81dd1be8672127c12c095e72aaa80672b6b36a0b3756d3c595787ea9ce41fa61a92e23c0320a007cc7ca2ff28e33ff3344aaa12f1fd0eb0f886dd4769d065bc258ca4e43dd45d47aa0e6b243e1456b5da9224b3e2af711deeefc236c25717cd81d3bfc01dd670c31240975e5484ed35850a4b8c6cd2bf0aa35bdfbd8fc35d5f952fdcd88b6d02036dd8cfb5527c2dfc9e7bc8a478b01f007f91dce7b85a60fccb68a33270e23b90249fba3220443d918bad4204ef8fba86ea5b60b92665482b8a45bbd8b27d42f19d5d01dca624467cb66862b2b7b8b8244c7f133dbf2b3d753b8fcdd23b8640ae42da4bbccd6470468574d0b8ba7340620dc69e7a6cf66660440e8026f1455c507add41d87b4be2766298331ede077ac995f8a978160ceb760e8a7ddebe02bf5eac308b3a9922c594b49d33ea0dbe8fe04cdddb40a3b6f53f01cb6b02890490604299d0ea10314028e34c79262edea72f9b3cddd9fd3cac428598f3983a94f8dfa3e1b8eec6c07cbb576badd929b0e93fe8df564b0ae6370703bbbdaab8fa1f6237d0ed50a517a1d477c2770ce67c7e979c8cef9fb4fcbe16e1fa703fed7e2c71662d1418947ed6fcad1b7dc64c8a8ec0200c50dce1c56bf8891eb460c068489498c2d84c7a3c43ba613c6a0f45214040db27200a7b8a643461ef331419ff9a543555def6419a1196f9eee4efb98abca134a408326993d152d3349263e08c4b38a5afd11dd0e06818def9936f8e0e2b6a954daf5a9328dbda46b77c55fd5782c9509857ca0f566fc978252196adf3b52465e8be8de191aa55223e97f359a8688d9fd71804e6434f302f3a336dfe8181560b3edcd03b15654bce928b44dac7250ef836bed33df12fd66cff74fa6902b888f117b22d89fe3442b47b015069fbe0d4c47bee3ffca63841953d8947d7bc81437e3be7abb39240c43bc0a120ef8ec1656c6f52510bab92fb14bc1d5c2ef8050d1a712452a11ab158cb2b12bb52c6f14b56da92105248648c4f44d63f58fe6b712d82112b3cddaf87cc82fd297cec980eec845685bac4d67ab09d5cfa3b16dcf41f37553d6a2561d7a68e09735347dd34953445b62969124f9d8e5895c1888020595699911438efd2c217dfa0c121e947b8b407ad887d3d9280e17216d19b7e7c41a7842d235f820086e526b8adc0e4cfbfca4572c04982ccc05c51875299ff9040f4bf1b7de242e85bbf87c4fe6df552113fa70bb7150784c5c89eef2ec82ae5bf03f1630c095612aa6eaacb9e70445a16dad4825729f442f7ec00574c712802249dc30bb61ce606d9bb36d57411fa6e366575df87cc728fbe9220c694db206fd88add1d65621c4d526bd4eb68983f17d9a631282e47a9f18280a544ee503bb54492e6a000241e6e7b492b13624c3adb6767b16736e2c0f2ab7f38da4216a15bcf7d879d6faa14f1be1ce4574a771445486e9ca386e5df1aa157818e787679e9e012671b9a3c275f82aba6bf085ff4dae4839be5069830f0ccd0276a78b8ebe8e11a2f2269227e3e2ebf1a52854c0324a47056349e43d8fc95b2d3762a2421df395e86bbc4a343192c20e718a78869aaeefc7498362d02c662c42cb97702405650a315ec93099b75e396b619575a4df42bee9e19b69fd4d79ccfdb3b459973d58eb483bfbe9ab0dcbbe92f5e7e09d78bc40f7bc006e176b6ac9b87047e32e0e55b58793c2d9faad51ce0f9ee02de31f61f27b4940f3b11ebf8f0d91d0815af0d1f569f6ac85fb1e96e45bdd1cd2180bda6fef09db7f5cdffea96798dcd8a09d642779c517824eb9e19de2210c51aef69c05bd8e4e756d179e9540e5cb3d916c72c8319f92334837f8574d1b2d410a381d407137088a746e15cf44092a449fd684542bd6bb2d89f111bce71bfe14dc78d4ccb4a4a803153c0ad3cb9388723e741f67b31ae0e5868de41b6ab40d31781158f6d2578b939219c43f51e5643b0fbdba5f81cca1dfc056d60f2273c94b7f9a205b54b04190ad80086e71af2c23562bdbc7f27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb9f71ded95316ebfd436fa1d9faaff9cf5df22a8983c52098c6e92a5b1a54f3239e79b39471c9a64fc77abece3c87958e68f8a574b363bb6a6ab3a94913283bfbfe9f6de11d14db721565792595588491e7e0b9d3c59cc4316da1fbfdf8794cbbe76b7486fffd72af57b83ca8af2bb0200333cd7060792336f73b883f70500dab8066314bbe8f544eb2fc6e1d2f070083e3774b112d00c1c12e0ab9d923b46612f2170afa02cf679750b8764dc0f55c01b1379a7fd33b84193d95f491baad3f3a6407685975c794d15974be0008fcace492f82282fb3255884a64a231dd438069ffbcb432bd7ec446f5b8adfdaf24d872b0444be14dec1d547e002c7f337f12e8ebc0544b82fcdd3c4a0dab0e5e75c9f433a27d667071c2c600f0f8446568dbff4f9bb26c6d4ac8fc83fa20f9bdf865b1439b20d70dc92e26f9bc70471a06c4f553d3345f256f6ecec608748773b495f306b69cfdcbfd47bc90edfb52fb62b51421f244eb5373b6f93bbd108029b14200a77b59a05313f7cfee0a002bb08397a2de8049d79f5f87c70ca45aac86f852224c72c0884c1624a93a9be99be07250e8b503abecb03acb7e5e42bbd33390af9e1e24377c5f0bb8909d291d6a3335ca2ecc05d1f22f0c69675c219cbcd7813fbf4418274634fc9acd3f3b046053d6ebbc4b0d25b1c3dd49ca2bc863301bd4eccce6d6f9ac72f0b2a847590645e55c9dd95ba40ef015b653eff6bf7af7a7909c0c2ee71377c2f0e868dd0b8be094d0c7ce2450f479cd9e6f1de38f47d922bd39c842d2df6fcb0324572bdafbfa053951e4cd9c3f12929e859e1abf349e3464aa494a1fc35b36314ebb564dbe5be39f22607e0d58840cbd7db8c4d7a70d868cd7d46f572904aa824edd89ed3ccbd40b248d612da596e4033fb4095f0aefc03da8b4d8017833d0ff0c05ea40de1280833eb29b838f12c278b3da10e0c40c8a7f052fafa518ae50af717ba1d00af79112581657977fbe4d25c27102e23d2c8a5bd68f19cb713dd19b6386d7252944acbd5b02bbf2db642e1152c306ebdd176bd8031a40fcebaafbc9cb6fb4c5a4bf7b8e2dbeef1b0cca0d444c1645850c94d3ff74194cbfeebc7743927f5f3ae131a68cb7921c9a7bb990c799b3e737326d6bd712d3659de23aed119efb010c4a61d5bfe1c66af88ff862a11fe21389b768da68c392b11d2fed0439d92ec1c14619af3094a100bcaf5129dac8eaf104034ec8ba709c5bc73d9d65c52a5fc8e33c1fdce6b66c076e458a8e7b7b15aa2f7ee6dfd6023b89237411b8bc78d53dfa963c05e93070a697b86c388b20a9669391fac4c35fb464ba3d13a427add9498cbb38d242ebf206be70bfd0129eef4cb6a250228971521313fe69d10db0b3142313dbeaf8ce3d4e6bd54bfd19df2f85221bb29f311e5cbeb620dce87669abc54606edf613c098a7264fd768a6cab1385f62e6e3c150198f2c0c34916bc009857efc359d9cab4a3978462db8c447bc8ef3e1b49744eed2acfc293973f29d147b515d7c889a769c2be8221396783e99af68fee663bfe0d03daedeb33716e815d049918a5e1509d6a6ff4b52aacc9791c2462342ee3c0e586bcb956984dc8954abee0027c8164c40d14329b29bc73aeaf013b792e1c260b55ddab524034e681935c7131b6ea32721d53e24fa127110ec6059229ce35abe2d3d63a6ac5c736eac955c302df7c782c3d978a5f4b6d3ffe13b9fcb299d0b100a30eecfc936538154f435c1270c87456c0678126630f4f00fa86e1c00b7dd3e9260049a4339f78a5b7adb2ccf54ed586584c6d51927ddccbfd04d7cebd8d8300ef52c6ee10e6672074ed5dbee7800a3f67aea54d54494793adac453b0a805cec517efb36c5da81fa199ab344b1fc80e66106cf9612f23e1c5ef5b0a18d16b0101ecd4d2adcdc67b7082e6a1b0f24e82ff70d52b878f91eaab379b07ebf812af089f63316907c76dbe320d88e39899e507bfad510d0ce77e32d90bb3f1c803c1245624396bb3b3dcd1d1a853adbab121c7287ad5bc4f2c84a4fe3476f1e645209a39a0527a7893b2f3863f69d6009f1c87d1c61e5c0068e447cd9cb9b5fde0b2b5725ee55dfe6ed669795b3226116ac08fe21894b5c7a486646fcde203b3dd61bc26e658ddee4c307ed3831665961af32684f99f8e4ae752420b4f5ba4b04314f680c115c2f035a879bc407d5a36b89f95def0a7b13439302bcaa88a609d1ab3aca57682d4ab3226a15b19cfce9a4bab251a8514e42ba20865d462d9fe226b2527c08d09dac84a9240d99674896adbff1b5d404ef0d72bc2395004af48e63d54acf78f119eee86d49c5d3fd5534d7183c2d2aabd9de2db46ef6617730492982786720301e6c6ecd4fd109d58f4eb131f619e4acab2f1bb7ccf40228ffbcd8486fb5a71437bf8877bad1a376633edccbb3feca8dbf9afd14c2103ad6af5400a5955d7613e252b5caff3a29568d9fba13fa5e24d5a38c1279f2cda416cba933188da105c5aab07755916d040c4aebc9c93dba8c0ad38d2c55b39eb65fd116d02fcd32ee9ffd736d9625fcdbfe47ad9c49f2967893ec188b16a905ea185c376839b875891956f5d90b016c19a2e05f9214cd74731739b8bf5b2795c7d6c9957be4e40b7db843c27a32d83d45a0c17c5bc802c6f3fb68d84991d3c0d821a58b8bbfe44734f35063919bfed2c86e577e59c2471083b6e601ba392209837f8cb408191ddb3750e953efa509ef4a620ee00c921ef39ae02dcf71df86e25246cb99818f1509fd678b0dc4ec7dc52432744be4c5deb2b1fdcc9c10e396fded2dfe9688804e861f9dc21bb1e0cf06ee46141c92cc2b0051663ef207f3c68e9c8ba2457d9b4ec1e66a0ae84710722711136acc6713785f01bff16bd77e9a46e8e63320d14e7a301a62e20df50a0b983520e4f6024a3b114b718053ffe286a96ad44db334187562f40ec3e73c2bfffcb3051f03d4cf07d987116854f1ce10188acc3e771667b4ed3bc44d2e9cf4c3a7232675805f10531a5d2625e95dafcb26d134a1d6e8dabd013a39da2e87f2fb39fe1b94f611bca1562616258b83f61c56d6b4046d3bdff27177c5e7819db50b27bc3ad9df9d32770f8a67f3a6154f982af3b0d2a47ff5f9a08cff11a24ea977e2e62ac097420048c8e2921ce3720aa305c0b1891735ab3700e25bd50b0b5ed61df461f5c7a0b49af4d73b1dae3ab5d199b64cb43fed6e3f250042ae4654238a1b7f56c5eb59bde225d0b95270cfdfb8395cc8d07917bd768f7f7a09ced9b6287ddf9fdd7cad8ab2de579377d5b1f6ab772cdc7a7d452781a2a838742edc8515b79da388f64ca99170d46fea4781894fd59efdfe96e62ac4f1232479c10cfef65b51e874e297a8e2afff951630af05f9c72b93e9608b35c50d78b4873fbba22ecb74f51dbc1ef73ace01a9a83b9afb5dee6b34c76494e7166a016f38e5991d43aa7f4fdffd53131e6db3140cd2f5e7d09dd657150da3ad1d7955caeb7d05aec95ae96f5820d49ae2015c7ab0611059f667e5816ed627f66ebe0e4e2b4081f5246f4bca02c103ed4a2b96342f90aaa023df213a1168a2616eca636f84eabe7ee95a0ee66c487188ab3ed8e6f6dc05790d6611e7c91fa36cb2012db564d5ebba8c9dab5af1419e0b79cd9cf9a29db133078f2020d2659b76cd1495a6679cba2682ccc97e3e26f9d45a6a7ae29f604e7ca6dcd46be9f50b2e145763b8f9a9aa416049b1e6af730571b167cb3859ce3d947fb1b72f6c3862d12c4bf07387773c99a9a72d2ad1b05162137836716e31ff48d6b040f1c59a433e7984c45cbd9fc1adc36773a121596e33f50e1514493603d8505afa49a2a51c94808467daf88e09ec420d2de02af8ac55da8c1fa787350be171045b9d7fe36f91d5bd5384c4cc55d3b9fac46e6af8ac5638849e8184c957e2cd6edd63b9cfaca4eda20fc0aed546027fc2dfb24de3dea3938a1a58ee6d785aa9dd0842ece4645c3cd5054513234ae72807c8426044c3cc800f2b94009bfdc7bae154a185ac270647c8cc589e40d4f0270c26952e95ec3f62864aa987df48a8551e5b1610915551a2efdd91acb894cc117263312541c88acf71e02fc091f97b2cd684071a3e8fccb2ccb176caf4eac95bcd169cd0f2d92d3b64948d677e80ce86cc57fb1f0e26b60bf1d07e758047768a6ea93eae03be951ae0c058d8df6f0117425f687b8acacc22d1b32f48e54b6211e9a39d390eb96102490c08914f24b142eaf2e5cc2edc7d7beef1ff918e670a86c09e4efe7e7a0f663fc0132d38325d9e28cae99d74ec289bcbe5660bf61ade5d85e1ba6acd70fedb27951f094528748d8e3fea4bf77a7bf6db3608f4b6d75c0aac26760a962ecdc582f362b1d07784957dda7e7420f7e611bf3c4f084b3d121295c4f85a4313eaa9e453a4b374901c4a8a230c827bf4d560ca90ae931dbc8f09e555b7d66ec0d41cce4e5b8aac029a1145921b1382e1e8888fbbbe41c8d631551d413b1b73a61882a33beda3e15f8c8e12b03093b04f8ded9115e480b70a9788a0200875ec34367ff5b4d1abbf07621573f5c38f9ebe44046147b7dc72ca2019106a9682530bac695831adee8f8ac95c0beb7a63a89e896162c9beb186a5699ad0996bdd229cf8d32d4ae8f8ed6a10a62cf99bbc6860fc8928045fac5d2ce26283350ec2e5589a41f76909675325d69879b8cdf648b5ebf02390112980b119148ab5e5f015df0f4a490485965b2e99b7549177ade40df61ae7e579b57be27c3569a487c13e80c63084a5f4226014c877402c3f4fa4c9997dd78d0fdcb9219a3992797ad2b9fe6da95cd5cb87fc58e14ceee16b58158944ad84ff3a0bc30ee185b7bd259132a85429141c7223aa7b82cc9349a253a0bd960e82a48ecf23fae0ce2bd81e79130f18145ce29ea1d4ed1b6affdd7acef0e6fc35331584a3468616678162dc16e593381f99a0877f163e199c67054b366085e59618eaa204b53100e63ae5d4e714f5228f5d0ef317d8df1bf57b699a068a2af0c5c66c7d700a7c3ebebac99f664b75660809663808b75070fa9f62eddbd8469c28ae435d8190c80e75a3969210d3c4810e314eecce1c22e7106599cd02d559465352d7e8a5e2c51e9f67c563736842f206774177d481d6bcdb4076ae380bd39dca36c295499ac3dda099ee7a0a537137751db66fb882ec80bfc27207d7d665e0f1cc7bfa090374ca0d9c6a5c523fefcffec7364af699c4c1426e14605eef50ee6ea66c7d50c738724af1d160c7781f39f7f6498ffb310ffce7a5f65e599154e495472c95ad508f54ed2cbc4de6b67ff3f51d68b542d31ea2240c60484466c2820a1134e99b39f9f078cf737a4c55829c7abf0c317a1a814f8bf41ac4abfa2a3531a70ddf96ee08b3523c9f5c44efe7820d5dacaaed51c863940f5e49fcb60c7ca07b2fee2cd72c3c1e06a88a8cefef43017bd2883913646cb0b0d34eb314e9d6eb00039bc9afe4f940b0278b60d03a5e0b9c163fc9f9e5e9868af2496ba132c255c8317f09b2b3595ecb84b58d2b39419020d0583c6fbd5879f043d082e577dd854631fe499a27fabcab58bf5e6b6c8c13cca967fcdf5b47ff73306aa55c49670e1c7da015b0a35c0ef21bff412b549c1ad1f9c587d35026ab96408e2f60081d349d7ceafab0c5dbba12370bf1c5820029d35a1759e63c72f2ec1c919dbb346ebd4bd85574f50018329e325bdcc46546b56332c40f8270cb69b6fd3b8ca86eb9ecc9e875f107d2802cf8a6656ec28ede31f42c6205227d8e74b99ae258c207ad677a55a31b63bdb1fda40bcf242a5f4543f8af57d750e33aa8565e0cae92bfa7a1ff78833093421c2942cadf9986670a5ff3244c02a8225e790fbf30ea84c74720abf99cfd10d02d34377c3d3b41269bea763384f372bb786b5846f58932defa68023136cd571863b304886e95e52e7877f445b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3c87da160cef3e8cefe34f47bbfd98a6d0ebea308cf096232606748b47499abe31f3064812d94c9deb84bdb42fa78c08f5fa27323deb7bafc8a51581f6437843a74279b8818d312f59b29ae8309d7f7ec420fea894e87ee72f0c509e77e9954eeefebac3e36b6ab5ccf55d60497fe18cae08c7001c581e6dcbb4bc3d369c60148ba03016b30487c5b7b57bc8e4af30c7261a16d54ebac8a82126beeaccec67590faf700d7ad8e6d39c7b8c7e8cac0b92cecd6494a6a10c3ab1eaef23a54a2960eda50134956926740dcff5edcc06d0940a9b46cabe7b577a0079b3845a4614e0a8095a18ad35b50b6e2b4eb30d400e3f5c1c23e3f0da48faaf4bb2695650b84cb144e1263cbf112e40060d5adad832e945c8828ce81e4f40f0d9425f140a9209abf03cd99e65d93125f8a841bf4fdd465a18f901fee7d8c177cb09e23dd4209bfa83d3cf7cda6bd8827ba60425077bcb0b95edffbfa78410c6697f7f1e3de2982f983c64428d4768d7f78d1e96af8cebdcc7e7e2a4ddcfa34f6cf9a24fb85672ad75ed3479ef0a86a8f4d3fdae988f2d30175d37490b19fd951e2ed84cc40ab016c55cbc9d8003a6880c012db762f103c80cd48a16bff1741a2585ad8ff16dd4de0f017927e0f14cd7a5ab2b5b9f6103e720d447885cf4cb40fb747ea3b10e6575bb71d6a37221ee1a4a1873059e4da22ffbe2fc28728257cc0891e802935ac6704334619ab4340ee271ffa13ff0257304e67704718138ae0de554663708d18c503ebfa668379623a2b5c712852576daf889071cfe197632791a4275bb92012b88167a21b67cd6c0ed7df5535fbeb05e9d4c299228abc989a00fd292facf78389a630a4fefe4546b253300f03a1c608245b835007ba8a128154e8b4a9f019518199cd6ad8f1ecd86ec8d7055aedf15ca9445efe48190ab724b4ed308f2e8e66e683c65a70e7c70b8a5e5ca1018773ebc0b8d80bab504370ca499505aa0d5fa8008ba4de9089e0c54d3c484ac216549bb0df7be0f9073d26bc3b679bc236930119daee5dfe7f3eef018b236763429c56c3e0cee3f9e501bf43b1ec5b9f50325877972c3f8370e972ec727362adb554033fe4597d75939625a5d3aaab0804459463ebe7ebe705ea34561ac2a26814848a6d12a51633b9043e2aca2bf4c6fad29f25fea5cbf2e5481f89aa978f5c0a32d395933917fdfe54f41cbef79fa2d9e46005f7f1466cb80b1acc4b7b91503d68c5ff8e9de6990a8d2dc1d69412614a80bf4bfe50c41c283c0c6625f5100e552d4af22c5aedcf86b7d3633b8cb7cef4b0a43e3d4cadcbdbe1dfa05f8d745cfb8a49b895f793691adbcd481567f5b0807bf727d96c6a4179057ac222cb2503d785ab97f0fc3f2d6d0003b88bab33ce95eaa04efd386146abadc51495388ccb902956d865f25be5282e5dfdc5e2dbf1dc0388fbcf39fba219e3a8dde15b0f7bce7b33c21e604e57f26dc35eec9354e1fcd0957677f6a01c6aae0b672dbc17dd3b852a9f40ce804c74c61d22284706669e59b0061ef8b97e4617d6f8a2e40db77d4e24b5f6c4598b56405392a08559486aa5c2f5ecc5ac8e MD = c51b6cbae292fa009679f7a0fde52d8eee0f40b6a2f333989a493097ead9ef6e9d95bd20dd54caec38002f428b828526ed5a92863b15524a134f6ed85219236b Len = 100816 Msg = 095fae3bd3408b6360cb9972cef30a9e0943535c427c3b269d80327c2a6ee529170f0fc72471928556d1c628f0be11509f7cb8fdf5a7f45118184998bc0d13854e8362be72e7079cb0eeef2b6ac2b079125e620d9a3bb0b52b2c2e851986ee1c17854e29a7eb132ed5eabc84254410a0cab1fa94188196d83c828c4b2b249d75d8db7b0faac5dec52d8dd43a088f584d2f3d279b59c1cf44b5e409f3d82e4818fa4e927863bd8fe8209fe055faeab108a9c9922844438281fc184d830aeb198ee6a63b6dba1b4f2016e787dee59c435aa01fe246c14ed8157be60106a8a4365e03ab1df4972645f3772e72dcb0ee35ca7c05c0fab82bf98a9818cd819aa2c710b825e118e2279aebab3c48574328b0e1a544d44e11230c68bd7458fec82af52d6fdb2ede836675901ad9b2588692db2583a4c549b47c3a3551c44b841a87e73c8f96ad50622bff692dcd58e56173df207eec3cf38a7eaa7bbcce4d1c78ffc7c5801e067568be5ffe4adfe109bc15e35affe6e055797385c1655b07cdcadcba50a93be0557b66bed7dbd9f6c97fbe105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081b0390d36fc5ae158fc65db5870eece0fda3f72a6d55559b3a82c24a41b3df6618a44292d374640cde4d31deda28975bfe4d980e5d70ef591f68a35ebd953c6b34dcf0427aacc132761c31897d55ea9056c37828be5e379f7ec2fb42aeba919be246306ecfdf342ac9abe341db17753289ae2de60a6decd2db2a2072afc47d5cb35879743d7c4b6a5b84bd949e0db5c719761fe2cc306d97b716b98b3b233e422a8c31ff5e0455559e2f36fe10792aa288b3c48b7e36386295113cd8db5772c0ba69f06cbc1800812413d5eaed1a527959efc26c9affeba7e7921107fae1b97ce57a4b48a227db816fdb10f78e31bb9fff628ff29cfde5ec3121dc85245250cb2e25992fdaa434baf3dd7e807e8fc4ab0be483aa0ea0b5b4143905cce219f72006f4606eb02daab22293852228650c1ee1ce541f6a88e973d350136bbeb90b30128f4791bd24abebaeb5bb6936520060238867bf3b36efc020ff8bde14a01b6fa33ea5456c19b6ebea8c87a202e7301343bb3505eb0b371d7fafd5908e7f96336b8b0fd6477d6a1758b08089289529acb4df428014a66dd031e9972f76980a2fce0cfde0d9d034128b9a2c6b01dc4b91195d26ba2278e2acfa2537077799e5b93d2ce5d19db2835205d1e1e4493d1464c3cd4810aef333f83afb4bc50bf5c7644b735e44fd84f65a29d057714928129c56983d3014b5d04676c43bc4ae2c1db57b78dda783d7fb9f9a1de38eac3dd4ac44565c74fe31561c20288d92c8bd67314f95da75cb1c1196c9231cb8cceec9190f804c6bb5e623ede980b7bc061a224c2a62db2c3dd1c6d42988797c25ab7e773a9e8390e644d830157550bcc0d2dd7abe586657568989dc4da6604560f4432b3819786109fdd187467edef19367f7515dfee2739fb3d913a81597a0e979d5c99a79b1789b41ae57fef5b916f85a1e449bcef61d93e1432ecb4e561b497ca4b6d437c52414e0cd36917285896a29a0e8fa311791bd82466219c94210ebad1e9777fc0a10013bcc87c09dbab553472d92ebcdbd8c87275162261ed22e5a5bc1cfe81f16b8dab31adfeeafcf475e3312f7030d5e6a8b3102b382a78cd000393ce4c719617b1bf736b38e5139abf59e0f79b27870b8244fc8ba91fbe88297a5ce6a778380f34f78be8721fa905f83b8719f8c87ab01fcc4120bd6a46bc26b2214c58be5ebadefa800ef4c3459ceb342c7ccf3c353b48f4e8d0be3098d2c055e9e8a76a908076715ac405f770c95fead90a68ab4016c364f885f29c3d30bf08bda2dba457c9c60322f1eee3b1f41b0595aa0a3c24a758c37926a3d3bc40eb75a4623e9639fd9459df7ff8b19083e82e6944ff176858d1ba749b17009d690c44a6101665c084a91a9955688695df8e0d5bc18d659490f5f0efcc96496912e91dcb94ac3c74c7cdef585b898d4970d5497607fd4e31b68b0ef5a16ad6a7a54ba61cd64841dc2cc7802579a2eb339e858abfff97f9c6345cbb8b02dad0df89fa8aa0be329c801c61740797facbdcd2657a4091a28fdb7130a0bbd72d5f9a26be6f5f35b176e8006174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e90272c738aab87e8d80107242f1aa6c800b0077d9fdab62ba4deb06c92462640b6367e0252fc9b9afbe95ef5405f6cb28c2c321e4e16276356b751fc828c0b6c9b4805307a6e8cf26f1e0cffe32fd3fb3b7f17d400873bf43d334ebb29f0d52c0606cae64928e456fb49192c5fb2620bd552be85fe55794621f8ae8fce9b0be7c117d40d08532a3069128e62fe0fa14b224c2d1a91a769c1caae7962b8b4350492252b8b0016e7e77f20728b066f1821ea166e7cffa594ce00feb81b3064dbed42d5d84a769aa2e3061ccd8ec0f950f6f4578991907981d38a9072a27ed3860999d1e230b506e38cc5ada75374d6d03309b884438e48b83a310bafdfea28bdc05ec151270483334a867c09c26a2d203ef1e169793f3dc269bd1777babc8c097a5b4c2e16aa3918850f31fac3e927c9817479401bed7d26caf65dd31b3b26f19f561b80e4f04f1ca52973833e3aec526259290f10de336cc3a385caeab01ffd9718d64f7b1eeec7129ceaab1ba6a3434b6a98e0425a851dbe8e37650f639eb5cb6924a3c27c3da034303f7a42737525a36d6eba98ab9bc0227d1aab729ccca2a110ad85a151652f74ad1af89be9897ed22b55a6fa189edd5739d6a4fba3d04b82d71afc00e78dfc38da222e0f5208d9406cf3aa50e8b6fdc58a145893bfd338d7841311c784de90e980002384f419bb55f8f0d182640aa7d4377cd0203afdf206e03fcbde718072f0675cdfe319e5ae7996f52079d4c363ec0ab5138b5a750079b347322ef69a2ab357dc6b150793391410aaa11b8008b975c96829bd6864ea96c5d24e9d5a54419c182bce01064ce58e2cb65b51af0232d73d3c1b9dabf139c7dd892814e7d73e1271ef108e6038384fb3c25604aad9557a2edaf0126d457473c514c77ce34ba97c2cd13aa65b7ebcbf6c759b1abab4aac664e9b006f4872301431a33bb97d80b440f7853304147f9462178317d25bbba24a61263608ae0cfdb204375bb4ba4ead1e38d631358ba764d9872201333180cfabdfd12087578ff682339946247dad18b6fb77339e900bb3a9a0c71c62ef029b17251c5e5fd763b1016a1989ad2a045da7d9f89893b405077efee2b7c5c6e97b28bb682e16c030b3bbf268a4a351ed026d3ecb0eb98a3be6a5fbf561f07b7e064d0d653e30846f851e86e715ab97ef9d73a47ed4746518c7db227fb9675f68b2e0b563fd41b6889ba572155b1a3e548557a584a858e714217afd020c9ee51217a02e14e9aeb9047dfd5e83e393e7d46095bc6ce8eb82b689f205fd0a0bcf029af7e1d891ec1e7b826296b35d9d16e7a59a53a81480ca9877fcb7f100326fc2b3447b2f748e49566f81d514179a3e06dae1f5b6c9cd210261e78d6eada739db0732549a1019ec1d9be77426b01fdfaa57193d29672518bcee4f10c650decfa3fd3e08a8d2f359397de00e8ba5a27e4ac08c74608b3d23f0639fdca8984d93c60bc3f1cc5bbf2342ac280e8366a69c70add8360c8459d57568563b85f28828a9b960ca8518e1dcc1ad0bfede71a0bcb455691c8e012faf94630ec7deedf2e0d79ca0dd5378ffe82ed72849dd6535417e7ddb8255701314e5fa260c13f9226ed81be0b4c81a5dc7f2d0f98a00afb8ed478d9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714ca87a44515a61dde3d0bfbe8a3c90492fbc0b28e5dd19ec0a5e0cf48f368e9194d7d76738b52417af02641b95bc34f181ea0d7bde23bca6f64f134a50b2df513c261a1caca761224515a8dab6362cdc49fba943b704cd554165ed66fcabf8f96d1aa92955390047ce91f2c597b16052ad7546471b883542122803103c29c1d14e3ded56dd72e9ce72fcaca2e035b89dd5e24b50b0b8dab5921fbb12b835222008164e6de95b04ff58e03d3a39cb1c04eac922261e9ba5f5e9d27e3317d60330c22d353424fa3a21a9c40d55487974ce14b332910e397e4c3ec9b53a02154c47a50b08753359717e8c3184bbb849a8447a27e359289b4e00b98dc6f020f8e5aed93730f6c180925c2aae0a332f43a0ae45ad9d4513c8fb5a84a51b1d1a8ab6ad8539168074758604abc30786556e44549ccdc81e78c86fa2c4991a8997d0a78bd19a21daf44233be36f8e37cd4d27d7da810ccacfea49020a4f22dfb40d4a192e6e1b8ceeaef83d2f3d606dd5177317291fd12b74e63481c4a37bb3cbd9d8a08ec964522fe825d870be4d8717766497c7e1d00070f0d7edddef02c15b5334c360a422f9fd705a826a6aac200eba6aee197f6ff63eaab1aac89a5e74bd09fcd64696cde0d1e7f4ef7ebb12a51583f46e906127895874403d172df56a9b7e8f7da319cba347af936420380792d643afbdef0f9d1638de02394c325e0f61216b0df895a2bdb947a484f16a0185cb79eb40680317496a587613ca100edf98832e2bc992f99cc130a6c654b976da6fa7359abdb44c7f67642a51336f7e57bc24274ba8aa26ccda0b18acecaefe2d3d5c1d1132cba344aa918d75faa92314468514e1f843c0ca7e3788ad0bc2fdeaaef9106869919215ce512e0692559371c21645833ae83e122836654b449e0c9f4f1eadf4e4aebf8f2d337a679ced560cb95857a40310154052984d1c298890a7982d544b268b720d51a8f12d7cd8d14186dbb9c8c353ecb1a7cd9e741d2b20b014b591df91b0601cd63220cca4b09bccd510fa660e1c1af27256d7f7b1ee43354f47e526c8a5f03a156f97d9b70d2beb0e88780045d1269f5cb4882b6a5a5ea39244ccc53de4a8e1b9a1b4b93636f848adb2e12c0d2b95f4c1773d63b8e80987a83cc71f63e4f0a01d89060f84d687422d10945dc683efbf3b1f5655202faa5ddba052a9cd3f7df1cb761a2125546f8427322ff9f462aa4b440d61542299d7a2b71ffe08ec5c97534e095fb2ba49077b0698029539505c1556c1ed0552af07d2b4fc379153b4e3511fa34528961ce59355a2bac3e7c55bc9fdfd67dd12e7b17a7fd58df775d0c857aae478e75b5890599ef2c6ea824a4fc5a3e0604ff5cc7b06523c6f8fc548dce38a4d49937c847e5a4cf8a59dbb479e94e34b44d27dd5bb12f6816aeee4859791483e65a17c193601ea24d541e555deb4267ea3f91d8bf80cb744fe79360f6ecd3f482b95dc8f2dece127e46b82fd76a007fafc484767c8701f0798d35c5ee91409eb29e5007eec77dc52319f2696fce4e250cc34adf192d9b849d871a9fc9cf222a7df139a30e84f36347b4142cad7ff5010725293a1ed95fd7c2bd8a150d0d403fec9a60c7da7bf895efff669f1ae6bdbaabd06aaf14f51792f017cf4f44b5638605820d99db15540325e22feb3d696df8fdad546882e8895c2f7d3076f52e53a6d28f884198bace54f045b9379e71cf6507a4318af01a7ede88d7f4b2a9e0d8485baa18e89ad3303059104aacc667a9a7d09e4740e6f3bdc0020d642ae733ba14a7bc07b667c64041662b2b723cb1c4666081e0b0eddb10a9a607c807378fc0b1beab9bd289fdc72c217ea4b088b9e84bc03742028c3a3d417bae6870215cb4c8a8611d6588de8c9c92f2fc8e33e5dcfdf7a6b55f4c780d3189e88b8e2e025c006dc4d496ead35937c06d7d35c49f6a250db883efb4fd4821d89e7a89e5e9800216be0a8e3943f4a5b3d86dcdc34e586b0b53f2d94c31b6b871b97e88cf79ea76ab360574fc96268f731c157db9596f76f8614c469c7d1e9f5b1fddb3721b610232130f71bc33b79d091fbd6e2d2a77efdcc9d75d2d474a7e9ebadf335835ac51b53f6ead00846f767ccbadc8a728387dbf73dc4786f800fc4370ce30093194093ba16a4f50f016c3d4072cb2afbb7ac9aa47a22b2ff909c1502bf0d10c75e1d3cd214d8034df732b19ba8354ce4b047ba42d7332b1b12d76d0d28f3fe86b5b5672a75d6735b94f5754cefbd78b409f3ab60d9583938733c3c84df1a22879c93b321be42ddae772ee8d2ada636f0313aee7cf51485de5e54f42845e215109f529156528f9accfa499cab6681f01fa28803f5befa6983209c3455f20e4ed82a5c9246e72f432daad00155aef34c98ea558c699b7c7cbd568c6dac67e14834ca2c3661c0945f47054ca75feb5ca4f2754dd8572f1d37e38ca0108a1bfd99ccfb4bee45837167afa62a0f38a03071c2efbb883cce4f139c2f71bd7d82c5abf72a262a40b428c4ddea02995e62116b7096391c891d94a85dbb6bd4f530dc074a03658b01b73d1f486d30e65fb571da822540e5da71806e9ebd08f79faaa3244be36481072120df758c6f66bafed4578e096da49f8e94cee5a0e385cb64ad9b5356bd9caf66767dfbe408aaeeb2ab5aeaaf09b946a94441a913661006d36dd516d9db4e891b908321f087236985896d2ea2bfa47e76018f8f610b16e08b765a0ce9481712a52187be3e7550b9cbd0f6c070f9e695697ed0df266d1ad70139929c117e76ea878be3f71a5db36e1a14905696430029e7feee3eefe68c58b92a274acf08ee6f5742208330aadbe4d4e6b2478f2571ba960400150a11fbf437ea809f8e51fe1f88e6d5d90dd73abca0b9e529c81bcba5e840eef81179ea27f1dd2710ebf4268990dc7c7f0e8d4053f1f0a163dd806eaa5327e36ea288c7627b9493354459e81c03b57cdbbf179d593d3d6f8c3c0deb066b1b85df29c9244229835d73441dc37555e46f75ac10a23b06f2b809601ec16894ae5ec003a57135a02bde51579a38f40bfbbcd33202ef57d3b30371e63d723f7452d6b7ecb84ebb64109e65fb79c9369a6dfd8afd68d55e27e0ea4c3ae48df96eab763d317c0d41e9c426279c16f4ab95ada9f36aad04ac782ec50eea9e6534f80ac5c67e6b4d77a5a90dfcd5fc3bc1625d3aa31659fdc148df3c1051d5a860b5133dca20007fbb2c41ae7c25b40f2694df28206cfa114b1e84a8172d24b80b0a3756dec2d6249af220901c07c8ff39b1b61ae1fb07ff987db1b189b90624a27bf9a96ad346dc757bc84b62f8958c792d745b6e2d0e1947cad8b0cea1f47eb59edc9e04ddecf7f93d9b48c784b427738c9c923b9f76deb79a8c4e7c546a16b2d752ad134f331794cc2c10d018af60a7439127c0becce096712ee3096ce18d38a9ee6f3ca3b3abc68c0d2c1330d1c882d6e4b494078aaf32c343070c480552a5ab125ce787d9350d1190f2f769e5bfa4db19a13c063aab3b256b32eb722007884f60ee8a483e33d6d15a1df33035b67bb4a2760f275754fdfc09ff2d77cc1c6f0b5cacbb813d38b26feb059d005c5d75f811bbb4075b4d29db91b458c583e1b863680ff1af60b43e21a6326b76c4152219d9ea9112d0e41d38a4fad3e7c227f2ec0590a34f4326d8bb3e3cd4e0076e1e9e8d7b4ce632ca6697c64b455b113fad09d7d766cd4f00f080f58d6ff890d8b9fa8ef63dde0b50846d582e239bfb995541313cb2c60ef334176e9ca31cead592b260e3ea76c527054ddd0be526ebe57a26b448fdb5ed4e01e32be2f4b98ff5175aa5ace94ceabe57ade77d00986c749a2ed374ce0974a1f878a0090b7afab7e667cfe9a0dd0676fa01e9fa0c4ce7f713de01589a5d3f7f764c5d772dcdb58e5e4e3202b78382e16aee66eb7ec0f8bd9598e05cf91d983709d2c6a5f22e4ae90d829e9073ecfaae38d7e0f9cea119689df3d30a50c7397921a07e2def19157862b9480b8c85d81dd232ea8d7249c4687b836bd937e67db66c49e6678b1abf8cfc36d0dc67daa5b0d593e62f1047843ddcac1d5214f7ef6f381381fb3cafa3c748afbbab7c47de17918f56471f16c3693ff25a0d8e88091413a1e351aa546c87c6788ad1507a0ba2b469dd7df5342c7af3eac453faf355359d899cf32a85747ef415a0e67add98f2bcc7ce2c491c09d3b6e9ceddf0d65e54241ef15853cf55fd502ba06361ef1087f93daaea615af613e793ebf3e6bd7ee045f68309acae7b83791f0bd09c1b0cc318201621046d6bac146dae4e62f5417a8184e48f9b8f6fb1cd6445a6800dd8449803827878cff51cbbdb8835fc3a4083556e7842b6fead08db9fe05db4242d7cd77c625954ff0cd64c61fc52f8d8f68b3007d0db7588bde912265e8ebf0a56ec74ef483c1f772d8944959d2e0f7dddf2bfe560b25daa0ce30f9c2281f70cff03eed0a6a93ec4d17642eacd1fa675517a438baa5fe5cf34772265df0002b88063b3c500194974934db5d61ea0347c0b52695f303c8484af260917e6615899758c5220d714b5e2ed702bfbf4785fee664b900484e0e056e7701236db2e6f3c68de48a8be141aac3a7df3a100d07f48fca665e00ae55fb277d5ec271fdfbcfdb4ea059107afce4d14d7db79a671291838f3498644a27923cac7d57d46fdd869f420278e56306722070e11fa77b2d3d895c2c96bc4b0b3277ae68cbdc2f1381da1211cf52c5e7be78b915587d71e0606bd9544050d88a439e282704d26625275465d6469ec8252ea1d0204c6472b362efadb67e671a2b2d7ac5c0ecfe3b9cdfd4e457c613934a2c625c0ae1a6a62fabde805a394a397658d32a3d6aa7d7fe1324379e35f74fde1f8506db018a34dba3fffc4657425cf32d7102a5651661d62a0a05b37d9323676fd0759c9357443fb31cc784c295ab2b121bf301c79402a98c4ff69c842f386f830c51557f5600e441fb891c608b4fa5709ba5587767e201a0bbb3633413b67dc501440cadcf8e51b765eb141b6e70e9b0b7c2b25dd72865d015e4107386c41a9c76f4cb0509160e7b229476da8435803838ef18612efd5e842731a92bd18acc703409996e4ec1a4f7fa2e4a8517c7f172e5d6906bb2887322b74038433d311eaa042c7fd3e4b69a91b55e96036d4ec4c4881f2563adf22c138ebcc4a310e195b0ac058319141e78b31ace643ecef18298e772dc31656211bf744b563392c1bbebf43bb0292621c7c4f326bb1d84d8b255cc75bfbd2301ab8e3095f5db0dfa17c3a6770beb62e60e2c060da488d62cdc63fdd3d5ef2ef681e98c43a983c7b331a188609e471096d5521c2c25670b15882a423226b0d06a1b364efd7a13091592eb649f70267758a5a0fc2b49a26cba3f12653bbbe64f8502de3f6a71731b48c10b00db896ee055047d70b11522414488832c959b7bf46ebd4a2733958b4573466724bdf20993b57d513e6693cdd2daece561e8ce55074ed4e1ce00ef43cfbfaa699aecb2ddd89f95852ff4ca8c66a5f2a0cade5d5ed04cd00afb788584005374772911d1d4f73bd67f0b00c24846cd221c301d4f7c9691382f7843613422582cfb98d458d537b2c7a89a3584e7bb7904c15a4dac99a34594b70b0a8b3d7bf55b5cb0dc4ec7e22cf068a33817530bd121f812177d9c3d8e6d0a7d7509855453880239d2bb943ed0da28f0b483727efe00271e23c96dad974990952be5f6f4993b55fb5da72394c70c4e474fd12e5e2829b8471898f43b86b3b11dd52777a5f0fcbdbd261b5c2b390e4471b1086df1762511559ef2192e8430d5db1ad5efad8054a249d51e274d4d69703683301981117b9c105fe0c4d0b84a6499a3f9485570ca6c6511b96c402ba43c5d6d52195421b3bf400069dd674b88c61d179a69e5e9e783da82f3134dfc470fb0167455b2cd56e4ac2c964c3c6472632f1fc13aa512314f6fd1d404bce8db50f527a1b5e53deb721d896ef9972c91a3996375a3dc143239eea66428d516e769f547de21349afad15bbff9ccbfcb6cef228abe8cd41672a71da8ac65e0aff3c1781f3581e60c0b682e773faefe688cad913da4ddd3417802c680b3a424da87c04657adbd44baa7a15e5949859a2b7747af23307e22bcccb3afd681ceeac02cce26964ebd96cd55e3b20c1e3bdc3db72344e5695709b0f620a1511fc97a886953e184216a246c9e97f339c6b60cc6d4ab182a5851cf457eb36399947f1c5bc7b73fca2daa35c00923e9874ae072ed5445f29b0352bea2edd3bf57e8d61861cd6208107b6612f11ef05c9fb19f56dbc15b9bdf74431cf0cbe77b3324b8b5c103bd04fd118704266566142803ddffb8a254dc9fb30d32569e5960d44f0c3ca4f12efb3af9f3518767edd8cb4881b6ab80987b83c69648fdf09036e371baf531201eb46f3b94413dabee72308973c3dce28f4032b7c8a60d48f4c50793a9289117f6f843dd501e70b9cfa8fece9b6e7450a1f5558e8a93ad2fedd4e9bbc31deb5e1c8f5ee9112e471afa43dd1de1ff9b5236609351c359052ce32d30f4ef1c687efa416966bebbeb55d50b77802dbd7871b64b950a5d3e3ec73e968543156c30fef6d60c5d3f0b84f2cac771fe67f13434897c03c03f8b808866d890b21e566a667a15eed57c66397a4041769f77e3f62417bb847c5187f2f8c4bbf848f0223f3fedc7b8d65c1632749f3f2c6c45dbe7c7c8d2c0457b7cbd9ebe06660d7418d60fb7b41169ca6298684e8a3b6cb9212fa805876023a5b00802bd83810a927f586140a4a294ab9193deb7ea4ca8bcfcf54c34a40c1eb76cfcad2af8f24633a1ecbaef5f1361e8ec4a5f4126072634b6613dbfef6b3f99f8c1266b2e60c93dc4bba42eac0bd869bbe672540813f00b959d020c31268d349c7ef5eaed749c9a31eca66555320016468ea05856190e27e2ce238531e4106ea05ca30dfcd6c63030a849fa2031e1d7d46b70b5d9c08672e41f2890b94ed1304b82b73e252d4fe908171356d6b08395aea56ad459b162d2e5b69a978f0cd763e718b9e42e2140ab03608ee13f56ef361d63161b9e93aa312bbb01017cc52bedba483266e05ca06067ac420322cc2ca467cdfdf36f0f6476ff57e3364821d3b80d38a92e038377ef7d22b62548ba42c5d40ca6c595cd9a89a9b1ca9ebbcad9aa2710a6a35f41ce408deb72ad7ac63a83ae4899f7d974535271f33da19d6544ad52f9b12dbb3bac3bdf2efe057e9b1bc53ba85ff301ac98b89f42c5a7b59d1da8d41b5334e11c19c8ba14e3931cdfed72c5557f1fd51f70a67ac9e918cc176b82f69d1320978a1dcf68c5a8c11e3bb874927781e51f73e3014bad315caa7e362500a77a5aa62dc1382f68d5f64a5685b2ea35eeaca550f9b25a1925db177887783a630f48d6af0ceb5825f2996ad95b1417b74ddb305fbba1ef334efddbad6563ebf75a53eeb507d02a258814446b4382602626dc884730b65223332bbdc7d8ce5d8be3e3b8eab8d0ef901ecea1b544e40caa021675b160daca125ccb876be8a1d6483361faf329d1ed8e3d2f485e6622646a67f1bf4554f3a1285247ff439ec49f55d1337d7b62bc6e456c9f030fb125b08fe0d52daa13ea1d8c9c05eef7012000db45c30928697ab8e0338698702ed33840f22a8989a5a88767c26f1b2f199b4002187866a248f213851a4cd028e41543a627589989131427e04deb5092ef1ea9f1d1b95b92070bc95daa5973e0dcd41ae806c7265364154420c4e353c88a9281d1f8f0b1a0acaf218f6a16493f1cf6063017e0f78ea095274eafbeed7af3dd11c91584307341c56243e3e919eeae644da3e309d6e3d07b199397e4e65030e9a102b1dda0b4cd34d5a39b3bad949907376bf1ab89fafbaf601702bd06f14b9c79a45363c90a59e6c2d41c75cbdae6c60eb0c92fd97a291844017bb115064be0e0d6847e731eecc27101eefd3c689c881899f4fb8e0c62a00f798728da36399c20c0cb9665988eb02950973dc8e5c3379f4ff9797057af2e07a9b08a1e2a1cb87f8bb013681f479833e9a19b36fa64bae9fa6010460417ab76b77d3fa989fc1b465fbb5d445b2062d7f59481504e86f93ec0b227dabaa3fda2cb76af43fce2afbc6375dcc1f520f75d9cf656dc8a31dce8cc7628f2225a0dd40e2442b42bd45b2bc065f8a695503d0d055182a3556d4b2e44347a57e344c353a70e61c3bddd07d99d141abde2b61d2f592c6d6d58432e57517585d1a6690769bfbd723a5b029b0f2308a8cc855c7f0abf107f023aba6dac1abfb12813d2c25c7eb7dfdfac4d00157acb0c9c254a4ce760842029a4dbf075c89d6623d186da750b860e7b59c51c33c9e5acf56b876a0e6410b8ac3ead9ffa82940c8b898d39fc8fb169d50972d8b138dcf29fff1bc3c7f23caf51af386382712e0b28e2f0c53931c156b7655d1dd6f13a4561880e3e5a32916de1a0842256bcf2cbc285b668731a3d3fe7148dd1ec19860c04af68c20e4d965a23b89ac6bf8d68b52119e709f471ad8b2ebf0add39db49b1511b32392d6bd4dee1a081350309192f0c478c90025f9aa2540edd2a065d0a9b0d74748afdb3d162e1ff41596a5a8ca24db7abe4e60c8bec21a80d9f9ac751320364349dc74e174cec7ee3183ea84977aa104fefe89f08d15d36a2233f42a7defa917c5ad2642e06cac56d5cc51ad914ecfb7d984f4199b9cf5fa5a03bf69207b9a353a9681c9cf6437bea0c49d9c3e3db1f3fc76519c70c40cc1dfdd70a9c150943c272cf9eeb861f485f10100c8f4a3e259c6470501932782512225ba64d70b219cf9d5013a21d25d6d65062dcc6b3deb49d58b90d18933f118df70ff42c807ccc851233a34a221eca56b38971ef858475488988794a975d3894633a19c1ae2f05e9b9c0756affd3cfe823ccf29228f60fa7e025bc39a79943325126409460926b057a3fb28a1b098b938872883804fd2bc245d7fd6d29bcda6ca6198f2eff6ea7e03ef78133de8ba65fc8c45a688160719fa1e7646d878ea44c4b5c2e16f48b6082eb310bebb020c954cc0a91aa07e98848da9d1ac127d74ad9283746d4a6b13ff46b35773df98f9c7b7c8c5486fe5e19c5da4147f1735f731b25f1fff17ca8eb3da44beeae21a1c6dbc091cc85ce88cb1c871b1285d1eec81b2bd480f4e0370d6580bb98c8901ef07c8163202edf2f4757cb73a406ab4bf1e02026f26539284d75e6cc9c12afcec167a5487909991b357e8d9025fc683f9572ee307ccdee415274bdc72314e478e2a31689ff9f65133b97b5bbbced70925cda7b3a47b2694bc56aeff4545798e6fa38ba6dd977a9e004ac2a3c91632b0cf01fb18c7b9f110d4d5f639b586234deb22f7b3e301ace4a36c4d65bcde50174f649766d3f194e51935c010456bd1e29b28f40422b0e3d197ae8a06098fc5a941961b427bbaa88dd3f68b17777f1c08fa160f0c3f3dd5d15771f7092192e9e32ff6e520018d9277af88c5b3be38581d727ab7507af0e9506d6712e3a79063517507838417e2e93f066cfe799c101c8cbed77b657882a4fb33ee6c2a0df09870bb5884e311432350732393dd939eeff319bcc9bfaa6b8f2e55887150c74c1fcd6d5a47c1a036c738704d2464375d38dd2d9b20c3a3040e664cc5b0dc660b5fd3f5ad7aa427265b63783a3e81e9a38da764d32f15d4f4b92f8416a9315ca6df00fe926c0f28aa367e058b30cb4d3a54ee4a25332ac2a6060695fbd9043da723f0e2d9ba67273b0ec4a2b0a9b4b46a351e67e1eb86fea07b77ecf5bea96ba4b5004cb3d440a5414af3da3b17b2c1bb94b428a9969eeb6c8ff00394c8b578f808db96e1482025555168168af969f7b70a4c16dce2e70b72ca1b8449959cd849a5df5bc2949a1a0fd8bdd230cd2eb8e4fc42bcfc5f03f14ba036b99493e42be20277f5d837f315a94751b7cd1195a7bde13485a8595a1f6fb8ee4e06421fc689a5520fa2a0ef8aea03c011a0552326ba5fae0b41606df8575aaeac0f3e944a8904ea03b27dc3fc2ab4758a6b065bc852ddfba85802c40e8b2c044e1fd8062a68b7ac7c781d34dbe3c00e7c7da3940f2fd2b9f76cbee0e483a36bbec8acd9e8c13415c4740da6ccbdcce78268cb806d99d47572e00338fcc93761789a3b8407fae0b29626dd8e2111119d16acec955639699aa5627e50d9d47e6205f4e298fa9e640f4c10fb7f8b7664abb3ca65477b76f8b609646ebcee2def09d179508d4324248860b2e5ef6e560c7fe441e42b2ffb0844095672d1bc4defb5858803d58424a8ba7e9d2b524c589f962293d794f60e2ec13fc91933b6bd16e17cb16b160ff87721e0304a4c97c6848af940be295048c2aa172cd0578fe3eb3a3185f4a37948063b500cb132f35851dac2c9165ce1336a8b2a0226b18a6ae31c4e663f12427bdc7328930ea9c1669de229ad6eb40b468cd0e2e98ad648aa85041dd2b8f6ee1c7075e453a1159479bf5da85e25a3510ab017cc337b3a4d3b478e4a6be0a5ee9258901ddf170aef1a3c89996be9cf34f86acc607086520a85a1173e9244c3c685fb7e3f85df0e23c0ac12a757197c2988236b2a412ac1f322383b74d663b5085fef8cb3f87773f4f574654c90335ec132508093f5d6eeb989637787b8bc1e16989b3835976ee0b5312c1de3a7d5cb8eafa889283f295ca033c937e1b9bc5383b8852d1f0323e8f6fc4999172e6f66d42861f1715d807059b9b0090d49f2e9e24843c7ea9c44d13ccf436351646ea544653355ea017aee3873de7784e9de6594c04d9522e3305df912a0092d1a620b51be83331cab870aef0aaaefc32a0d4b1da90911427874d3ae7ee5f6f480d80d8eccd7f563bc237acfd68bfe528ade0f0f6b0cc8e3bc90c6ef6c9bb952683f204df8b83959c3dea27d70180fad7cef25ccaedf28613002cc1e5427ccd11105e821ca9a6b895327165a5fd5b05e80af23f7bce6bc55734947cdde20addb1bdac9bccaf4f85cda8b4af90e2b7cc026ac8df34dc9f13ae6d2ce6052fcd8db091c4941725e8c6eda79a4cc03afb19cef45d851b9df737c0b4dc4986b32ea7b3958eb82494d8419c370d865c8c91b2f4b29778589bd9fb36108ceb87f693f165cff34e1c8487bf8361f5a38d61e05f1bac5f02145eae25b88a2416317f65356b49d99d267b5d074a2c38ec7a4050eaebe99e69776cdf7eed298c10acd60d39700b2aee6b03c2e398a1bfa94cb149190e713af6a84fd2ce7ef5ad211f83f1c61a1bcc8913a31e1915c672222a3c33b6294c1df1d08ff1dd12f66d93b20e7ba31183a9b645e4d9726aa5399e3d6a7687e7832da216b2a3725235b5ac8f00129afe4ba7bd294c5bb63f46fd67acc27a55ed1c5450a3424f57e6b96eb6dbe11d718979b0e5e8650cad3bafa4c3a0cda8e7e62278459ec75f52758a7ef7c13706f15917ab78aab7551e07ea18fb41116607789a83c730c73a2ca7b1cfb8678c34e2172c7fbc96c89cd34bff3f56b6181d7b4b8e5c1f81cc48ad26354740f5670f0c6ac116fad5234a92aef4031e286a360c0805eb95b85df19c971ed0d99451ff36fbdd57798e4dc824d8d34b99be8d178257081870fe039dc2a57551c96cd16c2a72882a83eacf7d5172a4fe11a10b2aa5df9ecbfa7a44b4e8f641b159a46fbeae76ca775e1132d0e0246d06ccf86cd63d49cfec7955ab9ed4328adad164b35d8bafac26532afe2b9b95384a13ec3682113ca36336b6bdc34f0258b379d626b289c63520aa5eb9f5486e0cb22da5f398ea61231879c6048c200eb424981f4f236f636e4babd4ed95b056f226644a2a7f906056f48aac075f11fda515786ab619072d5d909eb521759bf6f08efe04649fcbe045ddb0914ea5e877346e5fdde4fd17cd0cd8ca28defcd1f611d244fa28606389f6bc349d62c76e26681796a0603568ea83097856ab9219fd5adb7e55fe2a1f05737a5ef7ca2b6baf49f965dcb22bc22dc90cf066109f3cb3d58ff43c6e65c8f9c4fd76c80e3ba7bddffa13b96345ec3ee5ca7a81958b03c189d7edd801792610ef2fc437b75ee9f63303ea5efaedb0c4e22a5ecfc3bf33cf7e9cb3503ece01f0fef7906d4cfbfa024cfd30f4ff8ad468c513e37721a19784bdc48ccdaecc2141f83c2192557ca38a32ce2ea2fb8321d1986f52a2389af6894d38c177d7dc4eace6e8c0cd5a48aa36ee602c9175425fa76325f3778e13178536e1997543644fd8cfe2b546e4c7d7ad879972e8f52e56942c1d0e1fad72c32181a65ef07aceed6fbb1248267a61f498056347d003afcd3efd3febc11d20c205356e560f0280f016b360c195a57ec79e71a5f571282d8e4ddd73d2866486dcd85a23cbfb65e42077bdb467baec861a68d247c2f2eb105f6ad5a10a960c0bd943f9ac03db2b60443ae4f683bed7e1b39d3030f77cd5c1093debb1dc189d1680ed18f147d8da5e26072d0e5dc8eef75ae6934adb366da6546d298b90349d119a7fc2dade1afc458c84a2e43d01ba31d9eb047cb8493b2807a397176e149663efa0fc4f12c8187d3f5c4a616b91c2f5f7538aaed4dcc7afec863c3ebddd0f7447f9d038290bb76e07352d6b2e9f8eac7bc72ec879189aa4c9bf20e6c7ba91ac6a31457d6c0a6080abb854ebd053a7bf2eeef7b3ed253b6d67f54bf8d2d1a37320f1630623ee9b1bf58cc6ca97d69494d871ed55782a32748ed1c65d274acd3130e133bb96def0a7ab598beecc50dd9541f71897644f082005fa98fb0e4e974e63a8bc850c03e88c96c9ac41b6e80b2930298161f7be44d89619c9bcce058a3281ef074acf840a327e8230aa9fc7a5b76eaf2f9c7b9c6e0607d66287b1962d45525d1af4258adf012b2c1f10cd1533a9c4302a2e36140e1121d86943fd2908f09d9bff69573dee626470825d89f93e66f7547b01714bad61acc8e9dafbe8a4992c50be93acc4bfbbf2f660781b9b4d56d2c429fc736cd25e704de733f3f988aac5255d586e48da759e65c149cb24e8e11c283c06869d067035106d362d843c8931c2e6a2e3f0c8f92e65adb8e1bc976f9c27bd09f006d0ffc2b982cbf0b249a038ce605855e510ae6aa02dada48ae3681b6ab3ecfad1b873e0ef2fda86aa3655a1f2d4620a4e3afb1cbb48105db7533461992697ec234634575a7b4b35958b1236d549a84b54ce4a0a6107c9556a703b365b1ef10e2703aaefa36e06469bd13ebd MD = 2ab21ec8d42db385b3ee428eaf71aa18a9c7e2a66a462125ed710500e71049bc448d6dad35b66edaec37ff39997a052e98dd6ae78c141fcd4a23f4469a57fab0 Len = 101608 Msg = cd36720371f56dace87c59a7fa7eec63aa03de4517bcf09ea4932dda578770fa7fb726449abc5538753cdec795bcffc0d6b61b8b52ecbe1984fbdc1bae33597277a6cee7d97f8b1d3a96d8c3d941810e6c6c916708ec5d614010c4ed9179b6d1fe2cf356f7e615417fb0d1058eb27a37b44cc6420063d55c20f96fb9c9018efe5a711cf8bc98fd8e8cb250f47cbaf222f67f448503fa2ff46cdf65e51f72e9e1d39cd135ef3e4beba8c5def86afff2b77a2d9396d95972106be92cdb5875cf62b3d69b755a7f053f1d110279222981de877c39df4a27a69766404e013fb1496940460020c304357431bd44df6ae1a87f6797c0c61e0cd373a50b53c19bcf5edec4158a9ef375e2712df12c930bcf6e8260a4b0b51cb2028b7073c182337617a9856ac158b279151e59d743fbcd9adbcfbbcc8f130dbe3bc70fa022abd04f7ab2cc6e2cb4c7b8d563fc94108077eaf74fc036e748b9db840fc9b9fda63a0192e2e048531bfcdb2a285f531b8ad369cbe8b60b3fbce8afe74be8e7dbda3935641f0b21bef6178a1c55cb3aed82a7bd5e83e77220d762e26b63b25143af9593fa529321f6abe16cb4d286710dcebc8eb80999941101ee1d183f7020bd8d15c25b64c16f82a4222af987d82103d8da85e26015989aa25608f7c8697bd1dc836b8f3bdd34ea47a26bf45d0b725807c849e372a3a74322604a0fe4e78b0804a5359fc12f97b7fe28d8ab3a668b93c25083c3258ae995e9d58b697c3077e96d43c992dcfec170307e19280830953c7338db8b631485175f7c750b798d68fd8027ce707694da9d446ad573adb2b7dc8149f8421387a452ec1faeffc14686caa318ed41763709c6a4b5b49213341afa544b83f01d2c6dccf984de4d3ea3f8da3fddce0ec4307674b727608f20fde51e5406239d684b090fec74aefbd6ece7b5bd3f18de48c74a2ee5877e71be5741d0e9428152de2c9fa32fb7c51373687ae1830674baea43ad7d969fb941d48856997bc645176616580e2815cd9cfc60dae8fbfa89a992eec6e83235b60649d94b00725b16f2e8535cda41566b9f591c2e528ce200b3280ebef7211220c80792498e36c99ced4d29d28ee141492372e49fa59d8880e094ecbc32ccfe9d90f5fb77c92fd8800f7be1e2b36fa00f302f00556b98b2b239bed0e92299c0d565fb5cfe3bc54f6a605bc2b6d0553965ce78b7772be4293dc58e016d4ef122724f01fc056c61f801e9d516736dfad4f10635532e6ee9b5cb8dedc96f3e3dea1956ef24b5e36999eeb1d2234413c63b5edf4e1aa1bb0f1d0197c16e177be3e17483ad1c362847fbd9c038334f4821355262ab55f99abe2b89edf4398e8c4dcf2bdd242cafc361e6681ff18cbc9773897596344b5d935ea50b976c72fcf9e17ce66c3a9c483d212246d5e376b48524007183d246f62f57542e9b1361894b09af4c39d8b32b1cee7619eaf83b5f9c9c62eb316b8cebf511009b03cf4e5b092c32054be7ba7deb2fab8a671622e46344778ea9e866656ef571fad78a809dbbb1cbbaab4df9692f4e89405327726b628206fff2321c8c20696ef21d2b4075ea0243135ff4b81472b2d8e4b612741e22bfd9e9142ff68795d6c12bdf9ad60b1d8661b771c23fa93bc3601d99bf70232a64b6f218c93c7f55a5304e24bf8a88dca5ef4fe8a1d54e13e9e9940316ada202d766c205e7359be63c8403f582a314afc7b382cd78c42b818c3af0fcff75c43382b102e3712a04d20584f159cb6bd61f5477f9272e526a0d141cda8c620eb044cc5e5aba4e63e1a166fac1588228f7b3b4015bfeadc8303fe957fabc27c18fbd1c37719368285bd9c9ac1afa8f239ef45019515bdc6ea8a073b3f79336d68927dc02f075a6c19a049564a548daa4f4688e898345a38bf7b71bf87a197795c50973887e69f075c5a932e80a494bf32199d71898c4ea68480c47ed2a57d3466ceb4991c4762e8e05510800f005cb574c0f948d39e0994ec128605bb0543030a555c6e56aa4485281837f76ff85401a9e502bb10da299838a92cf0ab319789c99d0524b17fb270a62c7ff11e0d094823ee6064cbd11d04fccd2fbc2dcac91d270e3558c7384b1fdcfa5f0983beeadd854598b26f03527fcaf714b4bd317651a511737702746cf75f1a6bad4b7e875630a2f24064f1786d15af6296c3f62dabc64f360bfdb496ab8ef51c58dfdc5d26d86f238b581bed615f6e9fcefc893daffd3ff38413696680ff22f798ab58dae3cf0292efc2f32fd11aad32b9a17b44c2dc3c328bee134b3c222c63f958649f019715d70a1017ce50d9f3b2036d4cc178c5ec896fd842b3119a6a17d741800804c3115656c9ea37450fca9428aa7e42565cc95ebc7c684cc5ca7459cf014ba461d57d97527afaf9424eaa5f96036035dff35b290e44f466ad24c3c05d1227f29d40b310898dba92ccf91b8ad7e2c31a7a4c0a8eb1cc879f5c4be0d1fdfe95814b877a68689cb98249a1869c6ad2f76eb9a95fe6637d926547a244051e2124cec12c0bf58c0278464cda841acb5e7db112add3c68fc29546f3ca75d05a144649a2a1105e4059676d3b068c7c85efe67029cc0eb5834610b2e526feda2e528a7064890ff9322c0745b8b818380701923a4386592a0a728537903a3789076661d18b46535cddd4e89e3a51afd3db2e315e046f5b9a71d273538996c84361ca5ceb9b5b92ffb00e8ba54475cbe68ed01479f0d97e8d55e06b8535af19bfe9f8dc3cf95b4768351351194b96f4d67e91ec1c7d674a892316ce5b28f5b444fc6c703439a7d91cf99de958c437a32a46ee08941e9b380466001c23e7fd108915afb96fe0d3d08459f8a4e242da5f68544efa9f68e7ef959b16e5add747c6d2d24d085e7361b644f2de24545be1a207432f429cd0dfa9934ed5bb278b483fd89e9efd7e55c402b54098e81d53ffe38d802970fadad51eb3ddc6fd4f8880f400e740094e2c8d3e8bcfc350abdf87cc6197a7f6580b7ab74dd4553c7433848bd248caac4c5c3fd20eece7fe9e631b9539f6355332d732fbe7cf1af93430c55fc34f895707693e65d544716253732e066d184c07f9c29065083a92a41de4c5f85a4816aa0dc80b526552f9fc69742178819a76953b52157b258336cd7fe3f8de1deefd15ae1d49304594dc5d5f0ab8640de92f7b660a24b6d65571e608a2e0897480a71a86cd5a77ec86a2d5929b35716890e13b185f60a0811dfe8e16a61f72f4c99f39166cd1a1c0b4e825a2aa3af9280e3654a0c63bb0bc3917164862083315166fe1eb502136688c16ae1dbc3b93d2cd9948bdd3287fee53762f0c6b3d426bf373b5542bdbbe5a88b8df4245a9a9ef5b8497ce0ab956ade97628e12611196fdd55240f5453920d373959eedb27d3e44472b24fe150ed7167a1a45527463077508eae7b6e4b69f724327e41e1188a37f4fe38b1dba19cbf5a7311d6e32f1038e97ab506ee05aebebc1eed09fc0e357109818b926e0dfd0e3e8501e4ee4e411b04c3f8503824c8ba8b68f695807b7e25dea73b702d0876d48031f51dad163ba43ed4b8e5f12b5070fe9b5b7312d2ccad00d9c8c97d23a2b8cc145bdfb439784af437a7168d8bce88a2406c3137c6999cfc83a40cf2d209017ea6b6a9780a7f95d167138081b8ab5802d2a94e43a97d6c4e5f5dc912b60265146386197d1bca1b32edbeb262546f659cdca328eb0dd0a162a7766c4122375a39c55a9e47efe031a525e90aa3c19347ccc8ea6f72664bc2d6065e9522b900473b6694a64cf94a7fb4ca2317ba92bf553f21df709e35374714f6a6a22bed05b2a5a1d4d010ca715bce250d583b4a3c44507202daa31d3bb4abe2cf31c130a02315119b9a27c5ed6c7dd1085a9a4aa26bad23e51c4560c172076538b28716782ee6304962f68e27182048948d5c367a51a1c206a3e9b25135b40883b2e220f61cb5787ed8f185a6e57216426ef5703c8cead6d800048473463e2730a166c292a2ff749c5acd4ef56adfa4827e0a9a5173c4dce9cf2a59904a024bb00c898dd628209f3266de4c9afeb59de548e01761bcdc4ebc4fcfa440a7bd008252ded55932b562c18ba8f0f047b04ceb4e2a79e5be9d96b03068e6fce5aac04822bb5b64494a69da47b1feadac4c3bf4fc4e24460f956f75ef8aa43d9a682551eab362bfe24c1edd198da81bb2e605a2e1dfb90b0630136dfba96e8b2c818a30196bad948436ec5a8fa09fd2e21a14658d33aabd591a2d18d349a85e126369734d287ebaa5977cd2f87f385bc05502bd5d0e7bd57e9036f704ffe42ef2aa6d8be49e587accea2ac7028e242eb4233b3aefa4aedbcd5ebb991f10948633b2f0fa7e11ed6d70bb80b73c61c5b46401384ea3bab648ebc2156f70304bfc5c098e4f88479ffb27680913e47eaf95268b746917a514a54066eefaa6e37cf9e23aafeb8193d2ac678c4e7db9594449920e9a2ac9f85c6971a9a2cb318ea9e74cb2d06ef88b381997a4ab452966263a2d16f3f42918f00de626db419eb6557d220e9a3a5b92329b5e2dba1a9349c7ff5e412c75b3ab721b145af30e4ceef203d8aa57ee393d44da2193f56ea5589bf1bbf9adfff814551982b27471da8d2213f712b3fb0001013e6883e7a1de3724c9bcccf31374e80b71c7c9ea2cb6354845f3d418d15e81da30b96a0b548c59f4dfd7279650a89b17cc4a1dce9f6e6be6e2656b0101931442699aa2cb175e358ebca185f23811b20c71900a9c3a61958091a253f71c4c4cdc4162eab13ab25e54e89284a12a3ea15c1a202cdd8e4e4697dc510b8581e8900a40c89e686f3738d9dc20902da78dfd892e70f0fd1b72f3bf2af80e16c306825ef0223a2b054b59a01fd234f2408e2b0617090385628e2148f5ede8456014a83cc8164aa39d6d352a1c3def9985cdce756c6eb100e3ee53d7c5c9067be9915636410b4c5ca81b5fea69ba2c7dd7bb3c39b708a5fa20120fee23100534a01b30ddf377bba0b5e44e5370ed7829c6d518d55f6d3edb9797c9ee963940fa5400ac9647e2152a37466517da3e5f27c3b9c8cafe13082fcafdf67b87cb665755e04df1b6e0e553bcb04889fe234df26ec7e0acfb708e513aa339f7804cd1b636488962d8eaa8b7a6c07d3c6532c114188de4ddd03c3dfa5725e8f508141fa16597d38c2665ebb095e557a1a7f364f7618a39e024ac8385a104a7f697d79ca3745cd0b017f90af8fa9d8c5c2edb8636da2b745651681b8dc8bddb6ea7fdf536d315f581360aa2db55676fce7251c13cd31018a30ee5526d0eb017efc10da5c61241b66209112fe236c1966b0b0c8283eca69b5885bac4ce1399d1dc7b7d2afba26e97f4f9b32ea80f3a84c4615266a6a77d70d97e4eff0b57c98dc72fc2f12213fb1e9c80570b874f40bf6d0dc9ca0f63f33db851184dbf4bcdc0326675a4e3e785bedb4573632a9752aac778e94948d2b65677a6ad4d5470150da0a81b92bb8d8cfd33b1aeb1ec481edb663b2750cd54156f99d7847a65654dca947d1b5703867f6e384d5f645701d3c5bbbd0a7d1768becd916c24615c8bc68b704dfb7e7652eb665b810c16f5353ffe5a87092ab1911104f0ed037eb4542dc4d6a342556e834f8a0fe54b363152a1e9a511b9e6166daaba2ad2b83f077ed20b3a15768866882a5dd7f2734eb5fab81c3df5833bd04eea31b1a5a93ec03c51d31d0d0e93f8e1ea3646214accdd9dc10a779b0b9859c55e2027ee5cea794d2b90f1f280f480212dc7dd0a083d22ac7b49048aa9882d5174e9f00559be8d01ddd94b7e6416b6b663670f15522c2fa7453c473ce387c583dd139c93164795fad7209c092e96e71209b84ecbaef65f3e9d68c23a4013bcccf521900019020ea8a5eb661b56e1abd4af202ea575383bb30263080b55c86dad3b888ce4e87a619bd8be3c3d63837f7eb233212b5b7e3fa5129f8b188af262a53edcc5b9eb0d3934ddfd80e7daf8dc70c155c8d5b814e5952c92cdfa563e46356d82dce7c756e014244dc69323be3d3b4b2c882d11b8c7f3ded133195e1862de561f54f6d3d410aa5a139fc7e4403c6ebe1be1aa0eb6516197df6d0df90d43207706a08fb7112577ddd35f0e832b346b98a857d4f5ba1c3ef601de30bd79817c4edd61ead77aa8fd2e2196df96dbcfb279566d266d10730c680d093a220988724c07fbc0bb8d15bac972d9a375de68f3ceba9416eb76005a6c457082bd29d2830d2ae089e9c4e6314e4b8a02c6af8a7017296f4ee7474e99814f9692e546fa2ef09aa2aed8ceb4e11b104a760fdbcee7c1374106e700b85a25800de3310d69e6a4ebd4b81ee6ec5ace657d65a7cf809b7b78dc07613ed81cf78b291c36d9ac4a78a2d93e02ba06fec6cfa55a25175a3ba44272a8fc5e184245d58a765d382bbb0a3432994ac49f5d929354dc0e2fb628ba48b7640eeb136abed394ba2aa582c8d83473625d831fe7b064fe63c9952ee34bd01cd12f623416b119fa3015be2be441081e119161f33dbeb92479fdd41f0bd79d0578c45004a6cb2d0d70a4ce91adf343853fad0dd3b00c14499711591102cbe423b36430ffcb7b6151045e634e765d5b6b34f6d31c0f26eae0338ab0af58b769da298591afc5307b6763b918dcedfdd412aa155e467badc18ae7e067448e1882ab33bede7f5488bfb3073b6ba77543322e077efbeda5ff1c9c1ca8e97b037dc3197a669408d9f2c2c6775bb8489ccbfa1fc59a586c1e9970b65a5ab3bd6945afa756133eb6c5fd09042ca0ab3ad506905a7cfde06c361b524c296c5276100eacc76f5b5b03b906170eaf9090f8ae619980862030489ce335dff254424fa8474f1c2e95559a23ac614868a225fc999b7a048997a49bb38f8fe45da90fa4926e0af80c57dac4866e7c43f06bc6d116e2b668efdac9d00a7ee4fbb3e1171f5f0164fd8129473d61cacc83df43eff0b6f5d32031501c70024fc988ad83050a7eafe18f3560274f362fd67a7dc12de5ea3364cce69e29164b60a20d9305361061b8154f91c2e784842c2eba5469fd2b3129cfb1981b5c1d4660130d1cfe46abb8b854912e982467dc3e39a61bb4da3b2c5788809e6e320f73bc7109a3c49346d42f341644765a839ed48bd00c2841802c3b33bc81fd576763d45085bffec87c549b4821abd3f6424c9da9bade4acfa4c14335c7eb4f28bf87463603ca1332b6ba7ae545ad47943e75e7f7e8ea82d1137c1e233522da12626e90a5f66a988e70664cb014c12790d2ab520accb9670256cd1a7086d134c11a8a3204e019f52843e89f2d01a02a88a94d4a66e8d36dbfe924c6922f7ee5a1225aa8e75340cf8cbbd1c0b08e9296e81cec5f70cfc11d763523b12ca174433f246073d1c2877e4812828fdf2e41134bc8090fdce3faecd1e54a58948f59f3f78b2c1148b05687d712ab2b2d630416001513b9efc7f9523f53f92b6e4ba86e56e11e0fa09f2672b6269c411fcf8415c19e9d0c4dde34f43b1bc0a81e68e82909a0d6dd9e017fd561b8d6502ab629a8eccf15656ba9463931a7216d295981aa5c64c6e98569db166653f9e6d2c96d360e111d63cdbb9597df70abd913a01d68db876ee1fb4ac0cc30827763ac8bd743922f0575e887bba67122b08a61df03eb03934f256426b95d6ccecf552c4ff05805537e1a409020dbb317efdf9868edb76102e84254703d4057936239b6b830f9f438d7cf6a575dae01daaa773bd033448070bab740d9c51b9d6af09fe04721afdb49b313ca6fcaa3e9e580bfa0976d18ce473702bda5c955bacfdae63d6f3ac027009075e52c1033d7b303377b40f3bac7010d932f76e2751c3c81ab32a2f4f163e7e0744f2e970457ed926d304f8f90e7387f171acf88f05e3b956d4484e8aa1e7a238d6cd9f76be6dfcecf44256931cb583bdd0402356ddd47769b07877e50b341ea2fd2d099f1011408ec4b554923cfdaa4738fd1603435dab5b2e02d2e9bcea9a4d9f584f72a3324e132aa7177dd814a4968f29fa1e9e48fd35352d881d1dd4bd42a5979a77e098cd830d5ecadc57c31ab2bf0df62f565b14feaf43c10a94b93088f83212372d0a66e65723933821d0b4a4aef133bfd35f99be838aa4368a609b277e71de39f351c145ef3e9a179e031973461cd8557c1b337d994b5a2b6892a428219c27059b3585a7bdf708043626f2276dd80e7abb598b44d9cd0a719417f692c8fa14248b7e5b15a996058451ffe6c90d6bfdb5f7df491a2b5add8e78b7376d5bd4ce1d2df4ea969b62b82157589e5f0d1ecc8e997614087738fb0c7a3a10c1c1727c78e85fdb327ba44a62b0f7c1f45539a48d07e69415a5b08b7304672897e41c47be2386d5f131a5e3cfc4a4f88dcd04ac3baaf772499d0ab6497d0728f6ab1a5776483281dca5aaa9f1fb29eb345dc70d1fea7156ac478ea3184de2b7e7feb3d328be2b86fac0fec74fbe4d41f0edc9eec2301be7478b847b67dbc07e71c531e35ded398e5468e8637273d7a3ca655378aae2bece21523365bf9169249ce8dab19b3d243ef086afa6e08490b8c8adadd2616a22b34282e48aa7d6a4527050f7626d16b340d8039cb723574029f5ad1f266f2e0f3cb305df11a7123bb0f6e3cf2158e0b03c14c5f7bec356af9d564ef1995a984d147bc16c2347aef4e5358aac14e603e1d9aab608e546e7a4bdf5766a55ac0ea3e1a2a0d3e81010989a352ed4639ee70ec0a4bd16523674e831d90ed382ecfadb4c31895b8789a1ef76ffb5903708f4019909c16b2d1a6444a00aff7447a3c3bbfc2f634d293bc9c0229a0928b8ad93810be2ac4d9f7b1f7db2912f95cd58d10c9aa418f1f5acf1d5450e10e40d142a55be366505d0e00d5e1075887e3c938c95cd998f8f14667ff48864b40c5fc623465b0dd4dae7d196ae62bef177bbdd5c203e14b06fadf1dde693a3dbe7d549e41c8a70e1160cd622344f7451c772bca973942063d9e9d371720dd36fbe9827d79ff26574ff697819b980a092b78abadb5878c29014f096a5629ffd57d9cfe762963cf775df233ee3059d4a9b8f2b5f5a9492041f69e9c1e07df0287b80a312efcb0f2bccfc65b1e8e04d7854977c328ef289edf820fcdd898aa95cc3fb3c2fe504140b619f555790123834a516a6bbe0390685048153710a5271a11791c1c6ac0af39e1c0f1bbb446207857656d082b630b0d529d31305ca9df1005f8c5a60aca553ece696e0626a9a6274af9d231079a130e4506067223132d080833231844c9cdcfea57accd66c80f0073834c7ec92522dbb626e754fa7dbb72a6bcc6bbaf7b937db4304069eb0dd5a48f963e39e670b506045466514945e4e0400a1338a12c20c8ba67cb742a078473fdb71a0af629641dde33060f960843c1928fbaf7d06800217b82a064aa21b60f3c4a825a6eabaa73a22738e8773152a6ecc20071a3bbbc2865f551c3f208c4d6c9d4e9b0b663e2a7dec59164536d9bf0dd55964e9193bf4e0854720a98194b5b24fac296740eb73b0282820bb0f98a4fd29eeee7309c73f2e11463b0e2dfb41cec10af840df892adabe29d67267198046b227cc3f71294b77eb9b95f88c8998c7dab02f21abe0f70495a45ef1a725fcf1564c27d6ba27c1c3fb8e55ee060662a584e5f78f0cb7803597e1e0c03584c004ffa426be4d8a491a2966a47903394970a6f278146ad77075ab2785687bfe738a9478f28190198a855d6da920ebebf331271fd9372d096dccb9c07470df5abd88fd10b2a6ed9e2d0b7fe98d6b26e408f0f1b44381bd131f43aaf2d660cb62480822b48fb6cbdfd9b5772377e21cec31b3ebf9dd7883bd30e16406d3c1a6dcb911ebacb13892a6378a2d63900e35cb1684fd36d0a6e5d145afd044921ad891bbac403f3fb4a9b9ef9289f1ff76da485e6a0fb243934c1509b3d6f33cf3c949f4e009b761b37ae0a8d57414eda2712db16e09b65fc5215321f75f5cf8d4e1cc0cb52e5a41bc6ce50a5cd415821b6440b996d38a4bc6ca51388351c8ef4688e1ac3397710457e78fbf2e933ce568194a1bec5676301eb1d8f45d967d49d026527c632c43d50c53a56c5397d13f11fa12827878c236533caffd8f14c42dfb23e5234cd61ada6419f0bcd4ca1cb79f6d62944122b584efd5a0fc21b5e4c34ee7634af67b3c3be69f3854b812657699dc00f94f3d98437ae37199195f273451da93986a04f2211b4e44df0759f3a487aeb55aaaafb39a7aceeb7b81fcd3a88c643fb6af5a84b4898ede03c9860f68f14b495f5b624eb279fdd64b6073314688ee2d4bcd633a1bbac8cc68078101ea601b84af693cb1b3fedafab0bfac8937ccde2600cd095c7f3662d7b7c93211535c862ef3dc2724c492cc1e53a58f23a3e09ef27db633310783c6c798158187cb6bf40ed2bc0aee0dbc3b0cdb1a0446b14d94596990c902dc2b5a64b2f556aa7917cdedf512cc58b7048f8af127f33b899a2a236c64b21725b68876ae7099c386e7799303e557aaeaf231613dd2444b544fc7172f39d8b80baab7c4338e321a196360c8a53e922ccd0f87596625dfbb3af5d2ff5a17222db6914e17ea5809f75b14ea548324652589e2fa391528acd66213b5a1950678bd4df2b7377bd506a2748180fe449fb8df45f3f3cbf1e294e3f531d7c5860fc2b2f85659ec8d0e12628b33888f91b773a02acbd8d5a35b7d291ad7a035d839e852e1449cfec8091381c8b06cd011757fb160f11220d29b51f1fa8e78b8318dd3e62d44e834d6d0f345548292866de0c25a0eed0a7427abf683bcddc7153a1169b507dea5575c6b98f75730647c4c0125e25d4827984a9256278a4df5159acf9309959b3b2f05e0ecdef843487957de90937489d056e258572589656a80f9cf3a28ff0213847639d5446042a8443681ecb37c386f749706e3c4e3ad8f1e0118445b6e9c931e5a7e3d6fb7b5eba690f21f8b9cde6bbb13a2e14ec0adcab658b19bea0aef24c557b50ba8242579670d371363fd022cf3fb37380947ee8412a6a5251dfa852f4015e82737cf19ba4f565aae83c62c1ae4facad23ea1f726f894f9cc3c67e61a583d1e7864e11916251363da3220e49d55b6659634f5501631c9b7768e78984ed57760e87782adf5b3eb587eb933b31d10d70f6c356c82be85eee70d5c5625347f6ab55eb7d95ebfbf87438260262002db06d13c872e1485bbab8f78ee2815331dbf25c36e0fb3dc128f2bcd6f21b4b47febb2ee73628ed29da7b99f8c17eeb2791eb8fde24b35b474aa19492e4ef59bc42dba6b4131790ff18b6c6a7e4b3a1b592d77f55bb66aafad8014dde5d36d1f7174f19939c25ba380feb1c10beb80d5869769932378dc3684ba2471dbd8a4a9506a6061a33ebff612a98f8c7d1f4948c80296c081b813afc20051ee5986219f27b50eabc6cc2a706f340eb31a111cdce6170762bc9e96842ff9a43aa7046c6bbffd0360eb9526795e46361e2be681f9aa7dc3621d54ed1b934e243e0d7b0d73e0eb48665ac03a79a88710b6f7c90007dadcd2a9ecffa0deb6a7dae2d3138c215126e4a75b76efd815a1a361c8e0226e3fde3d1e71ca373360aacc0f40f372dcdc57df0a36dfcbfe6d39f708e4536e96a1290ba8f3db3b84580204ab9d44470b472642763222585378fa1594944b6de8c8654431bc5a343867558a9f322d91185b3a14d598681e40fe8904eb20f0a5ca7b3bf1a01270a8b7554c64d447d7da6ae03c5d0eb0d8a42bc691ccf7d069a0a5845219dd3e452169ea8e9c31246aa9699ed32509c29b727d99b8769eecdfe6e2a954c4cf870026b6edc43a9d110d877d5da875ae16d8109f3fa609cabb79fde7b3e6fa6037c940062895440255e8fb0ee46354e5f4b807f780048d6286606f1e69b2c47795caf5c161aac44739248d84fcabcb96a363ddef247a0b4e95bbc4ed956029fce828d04f61aac15405e9c5476d28e1a96c001deef2af897630b382befd9832d8790e5618f03e4411015e2cbfff839e0697b74c5bb34c12c29f7033f86a01e6f190a21185d50e546674ac495579640a956cb2f4a02ff8ab1a29195e03a5434d30740c88fcdac1f93ba8faa46fa5722e3f32169c242e5c5e6618d68c4773076f7d6f7543e6c5ff3b78e371c677495611ea330ecd4f7820328eb2d1442c9ff555c1c705cbac5f7223056e3936d32eb8bb7fb5bf0e89d4eb307a402f0e1aefb406e2c5e3a7b470c0b8ca91797ced1c3e35e70154e73a0c655e12091b72792ded8acab1385f68c09103af935a212bdb9386085ff3e0cae637c63f57bbf9b11f47ea5fd32b7c2f168e0a9dbe03acf7325db6cc16c582a22b0970e770372a2a8e6b2d8b72e585703c5ed77a589ca5b8ea45ce1a70f15428a38262f39db88e4c41005b35d88d0295f8aa7230aa4f95d5cbf2d5d9b39fdfc5154ba64c2666ab8002af7d454b4c7b05131ae1a5fc4203b89d0dd3f328f9a9e14a0c44d853680c2c972099a2144a792855552ec3969d77c8283dd14f17243ce50b6c42816ce736bac9faba367bae836685046170bf89796d342bd5d5c84b20371e13aa2eb80ab39060e5e5e8c7a122276dce8096c02e920f887eea6d8294db414baa84c780fa0918248b24a0424addd3d35c951ce1b34916eddf15ff8f27f76a5cd9d6330cdec3b8dd917e4632d23cd28055a7ea6a4027eb2bf66073352dfc191747aa5ca4df66da52a2fcc3e060c78c3c62bfe8a3ffb3f40a6ad2b1bdce70b8469d072990257ce54c64a4fd941d076ace2be4fed416759a52e473a26f31ddaeaf82f68217d78d41937f80dd963083d200571e1444adf545ca0b4c2c927fca631b9f7d4f831d1f55ef9c984b2dc2c32d988f75123cedbc5e3b88643870dfc03f519ca7781a20bc8b2863f230a2fb50e45f7af2e004fd514b6d02c4af4f7a46aa1b2079e62508eb4a057b98723d02b15d1dc19c66e4063c76282272777878e40c3fd3fd7febfd35fb4f8d92fb46006e029a0b7c8d243006453490787a330022cd865e3a2cb6262004ce40e6b1051c103a9d01983b0ba2362258f3de9ec73a8955b86938d6ccab36ce4a3d9e7ec27f1e6cf04bfa59e28554745df3aacd7e4fa00c9d9b006376b5ffc18b2bc249c45020025990aad0f100e8a30c39e6ee9e67ef5bfc9d99bdfc6c024558b358fa54b89f63a178ae86803c7b172b6d99e970a9ffa89f160bcaa6f7c7c37b7d6a78badf22f790ad1065d76194378237cca63c3e575c4caf5f74bc7ed6a1ba30ffad3eec3126edd4d8543e96bc6ddb3d860c4a4e80e0cc109ca1852bb849de7420802808545882980c3afc037a21fc2acf05e100009be7e0ca3b4a24f421aff3d4d9bf5a14f5159eb6015ad156b9aea4af794a7c61f464c8f22953911293f45223a04c0bf8656f91dd90a028d89eb9532f4eceeb2a550d6f1a53e89b9a06773c15bd1742891058178acf162f8938e5e1566db375e425a87e4da1516a15e2fe57b31968284d5f97d8c4a6030ff0effaf32dbe414116cbfe9c90fbd5250b8e524b049a87e5ceb8f67e93fdb1ef962cbf34ba29c27848b1d772ed49bef402743bc11029bba094843baeffbc66f80155fd4907977c41033efba76b73520084fb8061e0af4e81252c2f1211cb6b52bbd47cdd1ceeb8c5cdda31e41261da71188bebd27b1286b10b169a52d01208244c0f0496ff18be2b31ed42d1ebfc9d6f478c42bde93cac58ceac4416457a84963a705d1cbafbd69cb4dff715fd2ae52197664ec93313079df455f40576e929d20f5d4e1855814840e019165951d4f8af9282d79f6081e1a9077874c76d483dfd5240a132d6915b3e3c016744ede31f42c046a5e6786d80a48f7f8a05328009428c801c11471259bf5000b47fdb3da202a81b7f4784be2db512d1ff67cb77d5c74485885eafee88eaa57fc3b123ccc916d26a2e6a8b5e30041ad69a944217e9b402b7acc0170c31e8c2e45d83cb76dca6c6997bf69534d1ba2ef625359f478c324f7e52e086549be02f984a9ddd2522dc0d122b94ab2858ffd79966f1e8ee0769b142406504ae10fb750452a660c0e4de2e3b09ebd3220cfa9b27277127f6a280b26b3ff89a02d6611b8f3d475d2f6ad4b17edca4170a37d405082e5c6346a59fda6117414e383639a9a0d227db5afce71f426b667fc81fb49aa4435ba5c658f0b08c90e72a3878aba8a1daefe229e23efeee7fda12450cc3e4643016f45e0398bc55729336eae4e19ff91e467b846303d9ece0a7d86748296aaebc3458f6edc2862284ec7937c200161063d5ac53c95b35a35676d9171a0db4ebae5ed9765f94975c8f9bfb055933954e74437f7e5a709c7ba9ef1e3ec9974b84cf3b80c6a136766c5b47c43ef2a0a51b1839fced5f6a95dca0b9aec29ef1b6dfe77454cffbd1abb8b099ddc8d56fcddf165f2a881f71a92e057d918de1407d66beb05d77b58dbfaa56394d8d4ac99602375c1138e4ab5ed99ee2d085daaf29801b98a4a7169139a914ce1c7399d687ec43d9b9e3f4433f4534917294d0634194c7d330486706a11cb400526409bd2805027d2b72985fd1db8e317fa10d874d0c8b0a0a40f113806dfc79f847e3a701b63bf16ece18289e01766b0093d741d54f2de53879f9e15c03b5de160370bb9b65b8dc8addbcc52d20b2e7fc5477b962c5750bc4d9ca98c046a7dab282f5227d7c3fe78889cc5e06a10b4c7bcb35197bd62d25b54aab5f319e9913d6abbd032f6199ba6fb98f1db2ea494385e05886a9ea1bda14b3e35e3973543189660f873a7e8efc47554e28b8653473237b2a2a736909d3e8fbbbbe5f2da1ddd49b32d52539e555184451a7a07993855c84f12d61bbbdb8390c7ba72b3446bfbd326f1778fc686feb70e0c3f38d302039e3f6b7fb48ff3010cd6b4026f10b7e4f140e72bc2eddefc7c043a3370bd1edc08181eeca7999e37426d2b2d7cabac28f27571078360d80b51cc171f75a3f93fb44d9fd55b4517a6dfffa24c728193587549119347ec0c8bc6ca452b8e242bbf215480a2462f19d034029bf7c74f27d3e8406b5786dbd6fe4983270040ba10dacdd143ec0ec3ff33fd2a8ab80140b42bc9dfc0acd6bce1e3589b4f3623d2630318286c0b0b80425289bbf0f5b722c2d0a88bc43bae0b97db82571035be097cd89eee6b97c3007dac684b51393f41fe52f2e8e86c83447337455b3c6765cbd8bbd077c50adbb12bb2275d4e1b204ab133376b9fb7dd040e97102c0673b196013d3b78faecac0eb704357629e4009975f1f4787cc641a6c46b812e20c3280480cd6e469fa5ba95ba03210a875c36bac70fa8b3e1e027b93f3506f5edee4f73c1fcb78505de9dd2af3f58aee8cc591b2efcc29271ce15c7c9741ff7f04d8e706f4bc5a8dfffbc4201396ab7c0bcde571839d098aeb8823f0db94ac8ca696b96c32b072680719c605a51c5d991b64ceb0d57613afb67f3ab767505ccceea7d33782b0a8289dcb4ba05490878ee410b4398d5e2fdda34f0799e27df98802929f2f8bc3e417eb9abbbac5f911a48d5cffd2525e455eda7ff45ef4246a090adf831bf6f10e7b160d7e1ba35fe2203ecd1844cc7d3d78849767cd464c97942f17e9c46a420e9d49adfc8b94cbe44d21ed6556a4c3ff74c91fcaaf80fd687498c138f390bfccc5aa009ed24043fe725b434fd28238739ad0a084cc4a3fc5ef6f65d86e106f313b6190cab751d218d617573f7e0de58231c2a2fdec4a1b964fd98b31fd915b234697e5e9046c7d1bc27bb29b24eed11283c6ab9dd72b98c3da00bcab6abb898b2f7485647f3b4eed7eafdbcc8acd040cd60545cc5493bf34d90c7fae7c3703523f1ffaa1f1664c7752dc5a3b7950875973a7f7f22d2b97d293255da2faadd15ebbc1cc0a21957fa1862ab84fb82261dfa2d34977289a28835271ddefadc4f999ee818106d96ff05461c07c6f11e99a88aab1c4c30e887a305c1b87fd5d2585ea1f88a3fcdf9ca6762cc72e054a4e3b3bd56aef3ea69f96c2fb49e334d1787c3895fdba56fcc5a9f0306657782cf84be069265351ba84831f74247afdd364e76d99094c7bf89202abb2c67e307f90d25eaf0c766210e2493112d3d3be2991cd7073d4e3d39baab88efd0e2b950bbdd99fef45e2db725ff1de1c7e76e09ca836296b8506c6adb6d3805867e60f9728668a71f81f22a6a38110d94fecccf4512b80c9453ebcf55d5c6b0af93806ed7884077c4eb3a1745704ae926cbce9f933b25dd43b111d3c485a365ceba8e2d35638fe596f28bea6237fa090fd6e9e73f7d6a8d59009514a1ed5c99666bf0b126a8c57518206e302aefcce182b8b5529449c49146baec0e788d60c009103e9725b87faaab0d37752a18220751d9a75e4c30e28d9f587d3db2e63e7e195fee4bad231d0ac2019e25ca31a7eedfd23666c1c332e6c551cf0edb7874283993865b47693bfa1fb5f8be95dcbd0caf0ae8f89f6134114b4f581e7cc47052cc638d226f0b4b0cf682edcc0779dfe5220c45a03f9b74a1b3a9bec8f14ad1825448695d9e79d8c7f900d3cab9898f0ceb5ec2ea1ce2632c70e959bae38c063b63aaa1495045439fa9a84137068c58e85d7af732c1d68df61596bf40bdf88ce26d02cb921efe3a185af1bcad8912bc1c1ac94926d8d863b3042a66170b20e42bf3095eb474f51aa6bf75bc7abb8d26fc85f23f129c7872d7ef2cd48a35859a5c77f6d11cdcca73ef299cb73b188c381e416e4f92b73739c919168136d7a71e187e83a957c0fec4464bef436b1a605e05af960123a385372b346ff2996c05fdc479186de1cc028a4078d5c7975bda07275321ea51dbe2e9629391bf2e6d12a804fa2d85475876446242f8da2c3739d217ce6a6189dae0cf03e9343d62556dab3e644b95f4e0aa71202cb0f1b647003d4b64081d582b0f568397c003d1af6785f559eb06771f4f9f0eb8a684a205dda736c653642946bf2e6611bd98f8e5a0b6be5da45d4a4eb62c825942299bee22be5e7804dc99a880a5200995634492a9bbfdb1d000eb097eb82f910c46f08a6fd146cb74fd15eae46945c1dff95130d314382926a7d5da29b06af26d733c45258e74632c3c1a686ac94bdd05d18b4abd3df215e0a8a72b17b3c8f00e24fbb8d4446bb1a31033bb8473b6ddaf726f3ad8c7bffac689bb96f910ce1c36d2ab500ca19159721fee5eb1c6fb362552899bb61ff65a20d1af881e75fec9a012c7a53f1489ad01c1a6bc73519d69000846e7c5c539b68806df892851bf9ab25bdd12dc2bc93eea9bf97f699221f8d7fa43a99845fe92749fe8148712a501e61458336435b471851552f1d5070d6815aeec5b9e10c9707f1335b4bb572391c3d2c59177e0e00779b44fce763ed43941accd7857c40ec2fff764d4459ddfccd42da18787bbe04330ff5c6f9d97fadec46a537a55ce431c8fb2e20db6352e058f7b88b0041519d7335ce55feba105eb466e0aec089e1aff96ec29cb7ddb82ee5e42c7958d8b1105f9638709c0e879c1203e7047e0c1dabebdf9c8981cef92f9e929fa92848c4a821b99ce17bdeccb02ea4210189ec8270c5d623afe03ffc28a9887ae4179974acde26606e4431c7e231d1f66c8631f745b0dbbfd67d37a9642e4e23f2cdd4a763c166eee09f1060794312ce0f20e46371d477d8c5ffbee82a566d049bf3014716ef00acfe33827fbf8bf011b0fd0cb03d5831d6450fdca1c1486c83a731263b0e937c0492a98f0cfa32f22718c5b1c5f16592221e559abc722dd30add2e4d6b90d3635d62a83fef735fa1790f21db8ad52221221878ff21852d2b0006937dbfe7d73c1e38d99b10723b836d5db993e730b8663ffa2114b9426ffbcdea07bf1f5ac88fb1dae4aa573eee226cc934e0c44c4ee9e18ef7e06af01ccbd851331a7330cee57d107075ad219f06df1c3acb096f0d33719aa36b1dd95b248b03be96a3b210c4eaa4 MD = 061e0be7fa3c164f342ce81295dbafdcc5fbc47486f2c8240d8f9e30399973c959b57f7cc6ea4b93a5f2d0354717eea8641191539c47f736dcaf46487f7390c0 Len = 102400 Msg = a1ed9fbb03c366c30f7513bc64f45ad979ad888031c6bba8afa553866bb3a468855fede15a658e26565075b8093dda437ce32cc6c5d04bf5d9f5f7dca26589c4515ae05af6799f0e4d5796badb3b7d843a26e805b21077ab09754d5b9b10c45bade75f70fe8701439f915c090575ab635d7ea4831f0fa891e62c3e4d7f3bbff53f0c53699a181b8df206b0efad74cdaa8af3488a355347701922b0f8756fe15ab2d3a28ef4b357b4efbf7bb2fcbe491f6b8ebc601b66ba10495f8ca6a6339251ac44352731e01c7f3dc3a39b19dd898ba856e84dfad06b391fecbb9d390f3aa4d566f47c7c27d3b7841a12f22c59f3b5e954b59bfa17c0b342d02425578b4119d741c7d4fb11e2246ecdaeff5fb8f167d58e099042c523455c13ae882830107957dd9779d625b28ea1e36109d884ea67140ece76fb61fbb912be430cd3850d8b00434ab136ebabbdc564115abf44467e4fdcea934c74b0d50ed7cafb8113a119777acac543ec35798359a8383d816c742efe47305e85aa62f8692a9b596034e9678afdfd24afb98983c90dec7ac2c611587ecb94591c502777794d3584f62fc5767ccda002bd9db66cbc28be9d8fbb1d7663600964c20cee34111a10295df8734c5721f8049c4bc8e63ae1f5ce70b35f2fb6edd5a7fd457dd7387976711bf9bb9223e04b53d629879b4c20db37ee16a02c7e59414b58649d07f752ad84ba9967f0e8f4e216f3a1ba30f9cdb6fd904da814c38e957858cf166c558dfe89c23f3d0daf440576791a2b504ad0cf4bdfbe3f908e73195587efb0af5a13b1a8b95507927fb8fb9bf2fca0a145116e4762d22d48e6f0150b6c2c33780eca0e0b29428b2661380eace5aee2cbf479db19a1f139e3d3edd0c18fef666e7a9b5dd7996e92725cac84d1db9ab9775fee5dea24842d0a5d5293a0799e123aa56ee5379241e31e78fca6345b27ec4d8d593de274f1cf648d07a6d0b1a3ff84972cef519b2348d1bd11bcfaedbd45f486a3c42818a2e89a6af55178bf64f5f359bbc34d3c7c873334d10e4e19c48a1552b237e598fd3f53fc02dcc12c4bbc2ff205a954fdb469ede425e35668a48457fa70e1407d6c9e384c178ed27fbe1be16af1e98e6733b6a7d6f5853a61c6fb6385c409624d56cbf0611db0d44027dcb1ca66ca2201613608102a3a238d90b7e0fb95f67293238f2444fa8aeef8edc546194e953853a7b0b99caa4b39726b7f7764cdf199d43ab27cfb9864492e789f495f9093fae66bee62825f00a39ac01cd0c95342ff9a05fc9f90dd860c6a303161a414098e4116b6aac830a08a8df55792310f31cb6ceb35360ab33760347d4537f1c2421ced11d13978047515d174f665a5e90626d35424e87201c16d15c7a1724d8285cd70c307b899c5c56df0a3c1f32cc9083756a8925ecfaf6a5a94760ebbc13c19c854931fcf345ad9b972ec82e1ce9780277d50474029a47b503af254ba54d8473620ebe32550abf922ddb6ffda933bb61dd0b20b3589ca3b768da33b160e3e573f5d321963f5a06cd0bb680184849df242d837a6e5f608f4f517f28b78f756910a92cf8a302b217cea936c5087a8a67cbd1c47dff97846ecf460450b8718093cc0472cfe35fb166f98ee29b48c083c9bb7244b7f19176c6d9cee0584ec783da28805b03d1a6c678e045307f53baa48995879a94fecdc63bd144b9bbf4e1fdb098b52c30e8687fc21534a6eda3b98b3bcc7a2cb141bce112485ff6d815616ccbaf1b9cd3a2153bd70b05bc62d35da634d2d2717994df55fec1790e595ac64f6fde1bf368a94d893c2410f77b4d0764293b191f7a52b5a355bf1886ac2f711431a83ee67c3871e64612eede938b57637d87c67d2ff5d047cbb3c6f63cfdf269a5800cdc6b0a12e1a93a07e85808be12962b53110708afb1a521fcb3a850eaae20080e4bc188b0f9ba1bf48b156fbc0027b857818c05a48f969c32656ac29a5055a2abcb2c2edc9d1d3b2d5d680ad1aa96914c254b777f2ff4750071f0cdb20eaae27dc0e776d65a270a2ad5dc748f70674899a2b1c86011636edf7fd6cc92179449fcc39ffb6eaf8c2b656acf3756001e60d8505b9327e257cc27d58959eb39a63b9159c226e60ba0f175a2dccdb5b8205c70d4a5420701462f821985000db35559d3e9ea83ecfd0a0ec41471923f3711be0b963b6fbdfcb30b76b256398a3326074cfa658cd4021bd5e9161a4f42db66e7f11b6a769d4312e26e468960d1279cd66511efbc4ba97ad95d4e533f7133946cd9eacef125530a46e13c7b30730f3e49a4b6d59ca4619bab8913a8fd3ace3edf2e7ae55a06dafd9b680ab80300686ec3945fb3a88eb902aef51c88031009aaa157522a2b821971627b47dc72d9b1b2f6ac73066a5b1e246649bf7ceb91847c45ece719e047bcea3e936a34ea9f89bf3565a74a4caa0f8563cf72f4012fbd384f67c04112c823dc8238e87de4a23ec8124852fbe9fc1baa2a2edd89fe5b12432050742c3d83ecccdfe458f3eb826f821fdd1c97acb1b1071bc065ab3d9432416b2f5927cafb864f9a1e225389c09a51a09c5aaa1f7b6e30db2c91d4497b8b97726d05e0359f7eb9534edb0929ed2ddb66fe93afbca9b19bcadbf8a1ac618cd9f891f0d217f034be9e1ef9815658b873b58c5e24fedd19cc7d56e07fc0f6c47d4026b079ec9e56a3dce6f44899a3b8bf2ebe20867076052765160fdb41abb0f5fb93bb342dea432d923f51eb6e4ebd12351c71609c15125104a1dd5088e0d0d88d7177bd46748890409098d63eca24016b1fc72fec3abfcdfe72bf5c1146a29968487c61e0bda5908a834f95a5a68c212340a860db476be295114c7a753db4bd3e714fde67361892b27fdca61d5453e610278b8003dbb5537af60b181f4675b85294586f546e501b6aeed694105429d4942ce729e0581a8512a951d199e1741f571a3ca132d6fa9f1678a3cc29366c5131d951baeb5d09fbeea3d7235faf2e56be8b53107d0056923785facab27ba9f06ba541af9f4b022c816df189eaf002f2eb603249bd6b2299509f122c66844136c4293d9476b2a19b5d604771c6649088802150995e87bd19043ca04d9ff0e0a8bdcdabf5fc1456cce5433f776c7d656bff47449bead6a495a4d71bbad93206aadb1b2340b9f0a045bb5f4007679ae031cb6a74ddece86793b506eb00acd801d18e8a2a011ad7fc7a424cffae225d9f5e76d367cbdf2d7497d744a4ab755380914aa336c3a92ae9ef0c74d4d837260166844aa3d22c266a267e08cf07ed25018eb1febfe4ef79f7189c6f56121094a4ce76189fad7e53a6a40bdbc0c25edce31e36e55bf15835929b54a509e84919f81abec5e1aa2045b8b51326205754dbc3b46c0f61757dfe4acbd7be46d73b3679cfd0eae054cc7d2ebe2680743369a21205a3c586fdbb248e4e9803c34b717ab8525ee03229dd5a6743a87322e307e06c7680b022d6aa58db88082dd5c186473246bb6e4db5cd7df0ca3b66c2e2a9f7218b7547cbbcc60bc0fcca8514e5e43c561168bda975374869d631d3cabeea56dfb91404f7fc98addd3131b1f71515bab2470976cbf4855a20ec3e52a0d423900583cf702e328cbf6eb9e02cf2cb9552c55bf0222b904223b470b36bebcef03311701a01d4db3cd113fb586e9e95dd850dc4cf484ee4f825a3083378120bdaa0a2028632827303535b79fcff60f068d20a15f941bc6f01d05b17311faa173d7935bf969acd868ae6b3ba6047e067c1ba38c400a6eaab19c47b222ebb2a8db31d3b1bcda31c823debab3104d0735872ce286367f050058a7251bd9ee2f9bbb61d208b8de3d5f296d2a0726d31b06ef65e3758a1b6931aee5a9d4e042fbe4dc0e984a369b5a054104c31f30be41e07b70b043850521a67bffdac57f0e9ee906e12e5d7e3c0f22354b8ee37636022bf5f551d66c66b5c6879cc0d7fe7a9e1400819b2bd8e7e41ecbe9923c3f62e450239bcc188a65aef8996564f0a4b085cc9498e79a8cc56261cc87d710d56a71b5cd0b2bef262b93a67b02cdf9bad5da7888cb1b94e1fd1053ffcc66497e7731c3bded764587dfec37f31a03db88142682a5c43d0020b7775d2e6146cd83b1abe2bae8b301f6aa4213ca550f7c5693f051b32b58c5921d1de51fed7f862c3f677b8ba4ec0bbbb41ba2c85df8c66c7ac04d7aa771cd7c548c559b191a5ac049edf4f9ca284b1e24024bb4d7c6a011f21edec1e192ff29874c136a8d1e3389f9c6b7cc0270a967227c79576e82f18f23936c5281c243e0dce38954f093f8cd75792accf3cb0dddd813917ac833a32c34a65ff32e0a81e87bdb1d21ea8291d5e58eb7c046415fc96c4efce38de19d314de01f6d9070a18a8dbc399825f2e5e9728dc572a2da877306b5225b6694c7e698c8148850ff8c0e3a0c448346ebde5044ffbba8b09f6d23cfd16ba9fb5509923ae6a70b16bc28bca955a6a8f8756354826c032b1897f921ee294097f32b4b7e5ec23ec089b15edb031ec6cfe1995d3b545a04c381ca14b48c4607ebf61f75f32ae5436d52e517b56ff00ec2a95eb24ee35326379341a426d1ae2a6eae386f37c6d61cdb196039901652e548f9cd4bd557ded151f70392bde4eb0fe8c07e21925b1d33d2852badb520ccb32879ec1018d8846dd75518c7c2ee852021d7f9744e1143ee1a3e4d5c6cb4e6e12bd0c5e95e8ccb629254892a7c1602c3e099b24eb20fcfb77aedce2dfdfa29d519a660bff19e3e194a9d5da23585ec62efaeb099057e49f5bb3ab707af1b1cf8baa5c378173462f8c7d89c193362ca6414bffb3b9085390fa5cc0fd4cb3f48b2d573f8fe1977c168d0ac4f76c0d6253118749c1e9b4d286f004cde7b998d336c34b807373f8ee2d22fc17da122098431c2749a286dfe9e7c94612ce4612e678c9d1df60dd0a14d9caac02e81a1226fccdc68fd4350bf219e29b402f76b4a6c7cd949cf6716da8b300a516a00874a6e6a2cf7ce568ab83b3d86ec679cfe08c8a2b0e69a2c575f23f4161b3a051aa80a737cca1448641273c174b264bb64900568e9995d46dc589d5298c7a579a465ca4f9288d70326f55193bbae003ce30baa354e0c229cedee82b156fcb4426ba8376636da1f6e18885e1923874307c4a14070a5e7f016d14858781a636e49b89ad7203268f57182f421bc74e635044f794e83b7d1d09cd290aa11aaa4db76d26235e64dd960f4ab6023e47572df1ccbbc5cd54c73c81636ebfde3ce6603b2032ad61e4ed669dfdcf5eafaefd448358291f3ce2c75e36c4683db565051efe391174432fe06171a5ddb0064aab37838ba219ad61e7e26874a80cbd2f70ea6f2c55306882512728e7639ed8c6eb8780ebc93d955eb369b4d8a0a56bf8a4530c8e706a48a8ba182216f3737d8038b4f9dd01038b35b4749a74d470285d29d964b3f57a69ef75c50bc8fff68b230d305cf3dc040583656387ddd625a8c97bfdf65146f952e32eae3481fb60781be38a38b4dca78ad440e71b88081e33da05313fdb076f9a105f543ab67879dad766430b8465768184d14fb3e7fcd27feb7003bfb5993585f352279cfaf98b19e1dfcb440718e99021813def9226dad38a26e5d4658ee3cd08d1b8c9a3f11cbbb7eab380a169892d46eb123d0b089fd542a4684c8f5b02c5cd48884f65e1b746e6017c2fe7d9cdbf41796d1aa734ba0b81730b5687701b16bd1106aca56de321f8ae85d04edc3fdccdb6bf071b1d91dce31d3fa0e280852654d5c45fe6d819034c5c70e04b0357fc282d8890cb35bfcfd40d85aa24eee97b210141d79ec2c1316d95cdfe60c19e940d384a263c1fac6ac0be6de0d32da08bae2dffa251b09452d8e4ed7924a97c4ad9718465e22dd02455ba68c351cf52ee58b65e5e9413dade1ac45fef1b1d99771963b7ae5202e382ff8c06e035367909cd24fe5ada7f3d39bfaeb5de98b04eaf4989648e00112f0d2aadb8c5f2157b64581450359965140c141e5fb631e43469d65d1b7370eb3b396399fec32cced294a5eee46d6547f7bbd49dee148b4bc31d6c493cfd28f3908e36cb698629d53701132f3b60a29a60cf5da7c157e939735077f849999cccc78210cc598d9dcae1304c4fb5bde5fee7cd3bc67a1ef03fdda965c4d1c750c928ab8e177f27dd1299b89deaf3e3a3d7e52bdb6488c814e16a7ec2496614c99b6c610b371b038c4e98f0a46b766070a7f161d92c7df1ebb0924719e066e08b95eb4914a5edaf1fc1977eec5badb2b0f18515a168ba1ad91ffd98d94464d8fb5b3dda46ee47690c2dfdc9d2361a69094728adc0b3dda16191f4fa9ccfe06cbd5dcc8afe6ab8efc5e63447f2853ce1ce0b4490b388493419b920d2b10d59fa26001fd1c7b5c291f18ce3afc9c385bb93d07164f6709d3165e7f9b7d267322fea04c0551f59f50e03748437c46ba564ef1937a105e74a27dac0f8205d68196c6dbe367b81c1b0a2705f8e967ef7fc6c3457ffcb6e66c085ecb69492deaa704e25aeeabb7b7795fdcc807b3255f2fb30081f425a9c7990ea104b7785c288c733965965ab8906057e8c99d291e5e7325eced197b51c9a4bb2e9f1e98f95ad9ebb54302fb226d79fb3150e0d4bab4f32571d1178817b43518ede4c8306e4635753d3e5c165d176c52a0a5fb3b622856ba767415d4614ff32bc61bddc822b54917ba9cc933d156e0641d0f14e77c8444ede41f3ce5986387fea28b84e87d6ebddb12a673dbe6f17e3a91d7545e728e67c5a11ab44525b89899677de619e73b38c92ea4829504b2eddbe246e22aaa0f644a96ada47c6e16cf02ff392be2c8e262e8f6de1eea935fd54ffaa2e7d28ecee684ab203410dd45d44350077acc882ce440529b6d61fbc1e09fbf338adf8495937cc9ba8e8bd90c4e64442ffb5e8fe166d92b259a82a4a0b4d21b43f4d8f62a1339d6c4d775c935e66bc2f8d82046c98fbc67c2cbd5f6c4f9f0f5184c454b560fc3bb863a5417864362b1ac369a13ab08f0f0bb29e35af4580234fbbbafebe12f236148ddb22ac80e50fb9140555f51787dac58db3336fa780fc234699d3e931a60af52e8166ac2ee3e87ef1bd89381886c85e0094df39c031f860b7d97ac3479828ceb84093f3e8c333d10f2ab1504e0c4629dddbafaa39e3b68c81f259d8bf392e25dd91211028f37053beb574fa2278d2ad57d01b2d6f36950b279d07961319698ee0eb948d8a052c7b72e63a72206cfc7d111aa82ffaab32612b01fa87eda9996e74b864c86678d6bcde457874e249320d9c23ed4e46b21d230ef9b92aa97a0c490ba0286d48befd9c535bc56ec2ae01d34b7440f4fddba3d545cca9fad10b50a3080b45c8cb581fae748187cc5bfbfa62c1a449a06a8864dc61f36384eecdf5010c82437748c4ab47a46f661a18c37a30710c6dfd1758debcd6167c356d4277e79b8db8056b952f0c856db6d483850fc0ec353457aecd800b34ae4aa8e6f937cb178609df8e3a19717a15108816c129a895b7234c7b46e72be013553bb662e3200313bf822b3408fb04fdf9a15d08663c0ffac148276572b37afe228a860fd88b00bf5f79ed036c2db870e8bcd0bb340fad8884e71d99c11667b738f1c060a67082d150433e48b16e07164436fc6a219810e8e485d86440e928e71f2de005cb54fc02386a894477506366b2ac3a859d79bc8466b0d245709040f64b8b7f5fb5cceeba8e5c68a73c696feaba8935ae260912e391f4b5cdee90527d2496f8df042cdd72b88556e17f1d8f0ab26a583459eab6aeecdddd6df98dbfe450dce71425193ab34d91de739dd1435f30ac2cc887830a1eddb8c3965fdcebb446c9c49f96f6a904b3fe59ee37492f40bbeb2ddb5d56afebfb3202d7500288758cea0bc1e8698aef922773b1c9d99567ca83d5dd39f9fa6ebbb615c19892f89079ba373b77d662cc5ea9965ed407383cc322bf5ebbd18c4f95d176b58802deadc3b6d16cf3c1c33380014c45c4666a286c3434c04171d7e720009053bcd68d15c16c64c6bab02ead8caaf017495bbdc2fc24e0b2695f5fcdd0b00d0c8592967119476bd95b2607a30b134c43a16ba58519915d9591fea67c2e8c474090ab7d3821e441254397d0ac51e69b4b8b1aa3f73af5d5fa69d42e7a9fe1d9a06c95c3e371af9f3b128a2c32177187af54fd5b81e6cf14414f746a31bb5d3eac67f5ed0b9f25d07b26717cdcb2507bef9d681ecd9389831ac153ec49f75ad0b511206b08f0c38f762de244f4b91ff27cd30f7022c7b19ce75df7271bea674a6af6c9c0741d2526ac67611712a22c75d78437f239f9d3dc2773e29d3ffb0f062e97368fc58aa7309e815255def3f290902f96077bb06ccb6ba18ad12eafce9e80511b1b85bfe627ccfa4a9382252ebd37438e425071f8e514757445507f027df0e2dc163d235e86a830ce52d4bc2d662d5ea51560c4e4a3c25e137c4dff571f009aede2445b7cd7c0d332161f3f7b25f2df6f03150fcca1e5ca0ce89f97491c3007e51233decd9597403a5ffa1594771844409df5d92d4a0f57a50c9ddd34dfffa846289423cd3a9c063b82dde505c41e3bce487bb76316af75907af147c6e4c00a8587eda0f8516f93aa4133144bb765146c852f012a9236a24396025d5bc5419d27d298fcdb5462872afdb229d2ab9d7caff6886cd037356c32f079848febc4dea17b3e8de2ce155f222aa39c372b27c30cff0050e0904c41d31caf63bfe2fa4d86f436daab29086a245abff1e5b0848608112f33f817bbb1c86d1c61882532784cd02a79a0ffbc56a5f03fb16ac6443425cf8dac7348344a77845904653d0ddd778181d140ac91932baddb6142f6d76bfaac7410eeac266a64d4edd2d394fcfb7baac57816ca28be29c5fb67eaacce8bdb1aab17c6ae029024e133335fb78030dd9e6de4afd3021624eb185bee628a125bbc7b1797e8695a1c3bd1dc663f283c21eef39d58518e59a18fcab3aab2aaae00e46c96dec5cb36cf4732048376657bcd1eff08ccc05df734168ae5cc07a0ad5f25081c07d098a4b285ec623407b85e53a0d8cd6999d16d3131c188befbfc9ebb10d62daf9362227a9a696bf46da1724a172941ab68892a4d441702efea1f00c92a4f323288a84e6bd721885112a14604d4690c2e96f5bcccdfe3fafb6ca861fdc3dbc04d2aeb772adead5db6814858387b00935fbfa7a35467c0c75dfdf930bd80246e3be49c3b1c138542a1440717497d886dbb4d0f6c586e25fe8418b20bace191829b504b18d40811ddbde55e01bc5e78f1cdb9ad766d759c070a374331305aabb3f7f8788ed74f0b9548bfcdb605905ac603aff25ff7f09b875cf42d7fec7deb58be47950b8a3aaafffe6dc682b9a59660f97a8e977c719ce5f8b9e11635adc9077ac8212d816da8743b69e9264d10c4491bb3c2bb8f7b28b96a030eb2a07cdd36a9e4bd53415a6ca87c2e95ef34645cf4e6e64f1a957fb7682d69f6c3c16d907cc837ca1b4e736ff35d366d6c0412d8daf77c845322f1d178cf4939c7fcf27b30423bd7e40d6b3aeb4b1bc01b40aec081aa00f2e3bc63ff61ac4b684dc7ae05f7c46b475c02845606c2494e7b5e8a9c8f8afe2b5ac658a9c960cad2b3b5e2b949bb40c8d1c26139bc5f49691ac258d53b26de8e06d5426906695239a85c431d8c9346bcf3c1846ea27e869068207bf33aea2cab967db3a5af427bed7a0f41ab66e907a41094605d2facab64e1dd767f056162f488042ee83a68a26ec76360db3f28ee0ed69f779dda660247267dcaf101190c094a1d06b92e68504e0eed23259bef745db4575ca9293735c794760bd1d46da25a5b3ced90f1be100bcef0fb22f3892531286061f7929ca056ba4a9b99f5fba05839c846082ac66c1876337b5bdc929b09a12f3a01bd12fc8516800cc1cc3f90837463a267403dcf0493190628cd982047bd38477fff1684d327aad1e1eda5fd7c89738566d870b340b4163e223d167f8bdb000c9aef33e3b16c2f8d62c0cb31a3e79c516f3a0bb36d47bf75d0a179e336990b1c1ae3d793b0528291ccfc1bf78a1d32b8e90b6b39eacc796faca15ef5e875ddd848939e1f40894871a8d61499afa8cb0e8cb31bc139b0d86e1ea3224211dfecd3dc64d3d0f26ee5bf5f1541a28508e9d492c7a9e3daa35103bf2d50323355bc912eee35733681eedd88002fac9acc03adb3cf721c5e0277c306b68560dd65c182b8862f509d40c85e9c4d4b025150acec682110c5346cb12e7dc52e38609e904b11c32e03875a16b50443006e59354a3328730298ee2091a89cdfb7337d5ead3cc33bbe06950c3e636887fc2b12e86ff46d1bd3e1fbecadb3dc6cbcdc84247cea35464bd446f5b40c3192aad30ef892b2aea1e14ade2f49e2c502abbe058e83d5f07973e70d952bf1e7e978f0bdd436f075abd73e15471ab7df280032720b56827d4bc2c96968eac703f3030ea019d1205a70123631e274a5935356e47a197962444394f5daff94fe0e55c5773617f5e4b5b51ebda4800c3e8a0b1c4e5e374117ede776f6e2b7aef97f782ce5107d29902fd1794efd8e35d51bb5ccdacef361f5c2ade547012f8d5bcfd0c5b2afb7c0c5116bae749d8b761bd0e9f5041ccc309e6b1d7c50c6c5d4a787f61c7a74367ff612da2a9914f66175322e0174f82051746fac88cea429094f306e9d96fe979b959ca37a56e46d7c73c7e88e87c1ae290a18e1a6fb19b79fb54190c5b2bf59c846276e0a289c4f2b99faa008c709b44be22f336370a8000c9c4413213826db7a6a4b7086789d19f35a52fafcbd40d12e7eeb382ac9cf80d446a05c3cb1d5bb268461814bd1775c6827694fc6c5079345430566895100b88b66fed2749a3c67512711e6d6cdbb94fe9396151398be6914d0e624fbb0dc15965fa81c656bdb7e7ec4c537b3c7ca422b2171f15f82e5c1319b0619fe73c23689a344a09b91335f23e003ea6f5a33f28253755af72e0e3a1023fdabfdf44389d9c44cf563c4c487d4fb467575ef7914789c28b896f4a84234ee356196bcf09e1b5539816a510f871689157f44021a26828df490ab714468246c35c1455829c1a2b892eb2bd094eb4d1bf95e763c87a7448b7189a11e532a4320874186407fb32470d18904cdd512fd265a9968f95225132717fa146654e725ad9268d5f062e0f5108de1a1a340acab3ab1c6b8c2fa1e92e3607871f3da4d4055ffbdc0f263b9b91a109b7eeb77f6ebbba75cc2140ff22832e36b561153cb37dc27a6b3c102cbc4e0120ce910dba0133ba3c23186d44e67b809791d7941cf508292ca3ad6c095cd24fabc9ccdfc36c63d3fad73760791c5c55af8448634e84efbc97ec2ce1d86263b4330f65d5a098932b355047c1a6ac6fd408f77b2ada467aa545af7f17a3b64a583f0824965b6c0bed78f60f37d17dfc2629503990c625f009be526fb77140cf62571cd3cbfccf123f4831596b04794b729af94a3d1c089b13883fc4694be839fb03b3381b89abf2492f69eb054687a3e1e45876dae4d6c1e82ddc46d43896d24acc351d2f0ce7f134b4068eaca08f4e9b8ed7850f2479abb33593bda14032e078390a48ae8c6b582860700a08187a92c720dc3e83e6d8a19a26cbf0776ba4acacd39a8141121f6f4cb90f27c2b92eb88d22d16adf31dbeac58aeba8ffc2d47e0f204e9290a5eb7dc9494cad82889407161d1dd1ca0e6ad05de85dade14caa9ec9aa8c42424db7ccc7988d63ef8f94c98a99283bed836d998ac988c7c4110f5301f9bd5800126ba26d2c3b12b2d51744111c5a70ef9bcc8e73b4d4be501ae9e6df934a9d71fdef48e38fbf82736203c2d1301b377a5b6ff74131a9592e6e229f8c0299d93e152b0652497f7bd93f4289f55cd35a33cd3f1c1bc86f610615a0c630ce14d30e630723e2e0e5c58c73bae1a329ea9fc4f822442a028e9f7f184da3f27d22558aed6ce9bade582735065514031dc8cfd5e401b996666ed8427e0f7efb992a255abd409e03cb3f6b7c01f9693fc2d5b20d9ac5c1867d78d7f74fd09e73aa960c25db6d8be42d0457086b90277ca07a0f152154a522cd12634594774c8136cdd2934dd9f8868e0eb4824c0197e53d1daf948198ad94e0a543d454ecd04dc7373f4d1d6e2c1075c54991ac34019f23285b33c37820013e9a404d97177200e43c1bfb531271ab6b91e0de9411add5da01d99aeedb48946d57225865e07ac216442d45f5af0d7ff7da3f100b80e2ade812f1700aab6b72f746b19cc72f2fbae3b73ed10d2c49b3a1082fd01a69e94fd7c16d5e20cfd2c664ceb4c2c4ecda11d6fd164aa2716d70f18378c6c8b40ae42f78140b362fc5b63a56f57165ffc3ee747e7d56bd66c1dd70b4e2991d498d94769ead2057b38b6a03483a52b150327a47a33b9d65f38d23a50135f22110ba86369a014488436e0b460b4c0db0c76fddd6d217c8a200186918d33878ddf2d9e3f6d6d820d3c7b4c18c07f3496a4dc13ea974db7f7c75abd85293b4d458d531d23fb9f95b3f27a6b35ca4f6aee8c872c549f24d69fc3a8e98daa772ad9aa30b7c98ab2e9ed44b8c0a3e4a1fe53122c89c3db2362f293709d0387937acac42af0989143d919b1baeedba6134964d410ce80d1e5d790c5564a8f56fce79959c65a09a5defdb9b8053855951fe69450f85d4429d8ceeab7ae64998f3febb5d97756954ec0c25dd60c5faa282450420727d8563968936108fd8dba96c8e1a0d1d268d3e2a5c1667a54a731e5dd112e6543a26f8731dfa437d8285b1424740ac15c234e17fa65743352b18534869399f9c05dd899b10e24a2a2c7037dcf1d242668f85c354b48f79fab012cbacd721543226d29f762a952f801ec4c3a4547bd8fad6a96e0f4c670fda20890ef2e1730dfee52fc16c33bcfa669fa8dd0137e174b8dec86a1a37870fbfc5a4a28050d7d0e78a1978e5f2feb1c3f9440e5b63ac2188f1083ddb3d968090e58c11c0ebf4a7d85cba4b4930045e8172c1dd1ba185e452559471bc253d6b35c969e3187c7399b6a43ac200b57508875347d3a7b714c7fe53928e23b923d795b9629ef2c9fbae6aabc1657249fab8bde4fd76686d00d175332b1a7abff1cc9afc9fccb59c35efdcb676bd08b43b750b6c0c51c68df10a9d3d869f28004e532bdc49f4c9bbc963f410815128bddf4759359ce92add917b5fb9cca49544e372309f889f96ee5e139b000ba93b2e8f368f85d4c8fa27852ba4ee24b229535733928e835484ff9c05b7cd3c4eaacdf24b95a5dc75a03178225225b7504cf4539e37f1639bfbb42d4331c03bc7dc63b18d53dddd7882c4106952a6ac0666f17fba08104ffc63d7b6d5f221319c38b77305b274ff5a0aa7f5078db92c5cdf10828fed327000242ee2c1e13845562893e1b998b469a29ea4d004eaa65fdb1f1a0525cfa1ee2ea6825611e54ca07c12bda2b3eee344d8a881496950b46c0a8ed6af8594a3f00f519abdcde8a6699660fe5ffb9d4ab7848f07073da92c7c71950e29b626819e298e40bdfbd18fc92d791ec0978c31eb2fbbfeb388dc56b6999a881ac06b832107c33afea5884de8c8c5e56c91a2df0760942ef453d17a4309070d2bac4df0a12e5a5129d2f428edefac1b0cf1c99e34a0825e73a570e04a4942650481b3124528b94de68bff6a002a968747bde8b49a76ed58d886a1d0f4e2b5584c47842f367b4af6dcd790594b02ebf2c6ffe66a606a3de2cafe4c91695bc6aeab06aa909cb27314b4be903ff3fe132431bead08af04dac5f116596cd03cdf2ecbc70c7d9e529e6e1648e56223a777e52f0324d6aecd2cc9f6d5b0a9510e67a25191923d64e532cda87e780b01837dfd68d5331c864c9cb5814439901658c6d0e86d241a17f397f915673181b51c8e33853cc2215e0990533969dd6844a263803662aa5adf0234ba030bf80e68fa13502e40b92e5f8d7169c74e827b0675a87ce3780c46e39c73d81b73b6f842a3721d0aea008bb05fa8c0d2fb110f8257fc8b98b732264c48bb1a04a651886aa1155fc24180807b089b200376736de0d3c774fd280542418f754966acb306097c62e1fd4d1f55e50eb45002c98edd496e7200b9d26be1ebf7072deb8ec2ba46bac36a6417c65118fb5a1a76fc4ca6e5b263f775be4d4d720ada8e395368eb4ae59fc19fa65ebd3c56f44408159412db260321d8f294ccfd505634f8038ce33c845daf5503cde178a8ec975f1e4d675452ba458b7826a7b450e3e7d1a716e8452067fc2e34fd05f578a9db241e61ee77bff12d3558ed26c092ea6e6b46ed438d402470d443d471db4e93d8fe1eb7ef6df40e9f7f98d090499ed19270e8fb3c3b6cfcd2ec373c6c51b21255962537b25d797b641042b62f76fd021b8595271a782d57ec21191c407f2d8e1c933bc97e70d79e44925d89497036e3d1545659276b099d8418f05b338e466ff39e68559dcd95e106aaf230275fd1de7b853279a93d8a36637cc4e38ea6861da35fb5c3559e3bab74020893116a565ae3c03270e915388b51f39e9b99ee7401f47d29fbef0852635442a79a4eb94ebfcfac5d242f1c9a021625856b9b8f9881ada1cde6b23561736f12d72d2875417408f1bb7ec379380479bc813bdeb17a069872a76ae84df0428d18a134e5c6b5e356385466ec559afa435d9af3a87aa3f97b99c270d777873876ff0c97ced33473802931c5f3d8494a3cb2d97c42159ac01fbd23e1c9dcafbdf16d213e2bc5458c506b59812029cc5e2c6345bcf4a8e7c54c87d4a304a4ef39c70be71144c371968ca7d484bb71ab9cdb18e69c055c136ec99edca0d1f6d014c08066f960f63ef9fd84abb40cd76f6e1178c504bf58a52560ac43be77fad9b6a474a6dcc986361e6babe5fb5b849f3b952be9dd68c52551d75611e740da92883b91b0a4c59ae16b9ec38a40efa0c36a30da5b0d49ca1b59f7464f0272bb83f04d7c8b379d5ac6495d75a36b11526365aa2d217eaa9010a7882405f756c83557a1e03f7f99ef6d217169366309c20893cbcb4516d33e8ca2529739ae34262f260063d56200815e59a3464e121f19395c5a5dcebf0bfd15b21c48f50e5400f9c332ad54ca1c37225bb9b4f05f9b7f7f28218ac5609bf5353fb0df4001fd7c1c98ff67c49e333a408d7b5d2632c41b615fe6fb31e1cb4d73b1d403236f78c21f0b2f392dc68eb24059b3e6f773e316676972571a29e32e5771515ca43e0efb8a8689ca982975c6ab2627fa6c0a409719af8d4789222bbf6ae5ef93ce57044fe670d6c30cb12f9e075ba03f8be023c70097fe7384b3eb2933767550a6a2a5e5b931decb92450663df62e65d5edbd4cea38a8f8216c46a933b8cad3a360738e68e31698b31cd403db8a2c1fdede49ad38af1061d443ef12608905dfa856f0479ead73fabf13226531c83f9c73ee4bffe3e322ceb1807c80924e84e389bc052c7578d27d2da5a00ce926d55625cc1897846b7c9959908376517fe489b81e46af85cbbeba8f52e16d5a3c89f774c6541692ae6a5c2cf298662673913cb3ec1943382c751d74996af91d5fc9dad17b62ef97329871bc353fc279e007671da4118a04f1a2204de7b152ab37118adc69e9a4ea8e739477c6ce2dd43bd3a355e4b3d684d1c25d9bdc38ec7c290d71e6104cb93518781ef025d80abdfd727bed1c64db3043524feed5863908cbfa4a9eecf0aeef77328bb5e0f1ebaf9b605b53b9c8ea8fbcee51b7620dcae986745f677e99f872112f6529769043219c29cc1a4b44970ba4d32d7610540496ef183ac0339d28757ccb25db5527a3ac863b48b15f6c532c91cd1dab5eed98897c326739ba7eb1621092683c1b4c7fa8c0114ba954a4c17b1a18acd7ac2ed949a47f6f5461b315b0831186dc276349bf00485f72d982447f9462758b96bc595ffe4bbd70c7ded7f93ac51c3c080094579d4cfeae4c896e929726e2279d0a9b24f013cc4f5b568a94be3992cc4ba8e1fb1d9ba3ac2c2ea26c98c29d4c2d9e013110842620aace702b63cb750d40c0a521f7b0e90cf6e682562fe1e159c6eb4e1cd6095595248b5b25e2075d8fb5ec7054b23929314b5580f7b2f168e10776b440b71fd52d57219e0cbf8996c3e980b61be370fec987d010b9d87d8e725dc4e6354a342f59c135ab5832aecb3a7a21f8eff214d4263b0ac424f6e2ec7e485a5672f5e2be9ae11c158102036563d644bb39647143e7e34a1db194cded6535bb877250a81d7145696f1fa403ffc08c6d6f90c132c88f0f328ff8389b1bd7d44cebcbd0f0c66d4c821aac7f4ce4e11b10a87e8eb5cc7c1d389d6168d6f246729315e7fd5943ff851a9a901a3adf45f0b2d86b2396da3fabe0b8759c1e0b21bf32784f3c5e10987d878162fb4a295fabe881df36428c6a29bf73bd58bcb10a088f956a245ba6d8a44d41ada9176d9ebb0637531d452d5c15295191054fae6fed2effd13bee913087f06dd89a1f16a39cb06b5f7f1b67b60ca2d4a948533db3db850a1ce9934a209705586c44cdaedecf5b806ca231b5e85ed07f5e9843f97662166695c3c64c396ff0b3d14fafb0d0d18c29034d248263ba26b4395bbe6c381f7777e4411411db5146f2cff131a70a31b6c7abc66067c87d1a05c2290ef079421cc080e7e92597197c8780fff00beb6e6feedeb471d087362ef67186d240aa987ad2e43ed211ecf705f4ccc2775a04f61c01047dd5571063ea08cfdb94b75c71161186ac5b415d9887ccebdf140bd7474fa0c5a91765f484bfbf55bdc2deff7a732ef0b6e14e596c566266ac62bbf3007f308acc9477c427247c7b93e9221403166dbae5009370e10677d5b0ffc4b8802f42dc3ee916dfb9cce2da04742b2aa974603dcd35ab34a52c5fb19327c0c864d45a229691cdd7bafd64d975f044b3dc11a901c5fd1005171c9c72b9973a731d02e9066a0b072cb95a84f26eea19402972aa9f75c34c72b57bb0a19aaa9c79174f71f00fd15d4f2348c5cd55ce2340002bd77f4324cafe1eae3eb6ccfe512af1fe77681e712acf876c99c2d118cd43fe81d229b49e1617a148893ab6ff13092ba47be71c671a2e641a936b5756a1bc83390d17409bb84febbf4295ef193ca422e5f1e5601f85dc37f7252f5f043b2a2c95fac08dba1c176c96dd60dbf9488c86177bfba02708697176d1a76ebde40d594d2dcde255cc0e9253cc24140bb112b3dd7c92430a0c46bf1e2b4bfcc046e6a7a30897e50b5285fb7a91481dcd20e73a9c7631df352c046f5194859fd7de46865c3da71c571a2e067fbf556fb9f26a98c8eb52cb34c22300b59ffcae41149d73cd1f83eeb5bd5751d7c8c4705ec02d4d075e8d9d85791311bec009ceb8846c0e7a30b6d293a6a25c17202dc627f49fc5cc424acca3bb5520d18745679a9822a4d813a87e9d508f93b267e9d7b20a42918c3902ef2c0379ac9268381f53da61d58b2ad1392f558f773e02913b699bb64ecb955e6b6aebf12375e54a4c90c59a1ef808d998c62012952e82ac57cb135b4c0f09a5c7fccf4c0400710475cde44bffa3102a13ee4ac97be85aa3b362fbb227cae8819b6e37faeca6adef3167b0e7e620e33b412430148a000d1fe4adcf4b5083c47a4c1bb07e4bed0e72e5fab60e70d5f49596f46a744e1a1c695228089754ce2fe850a1c3568057f53839f35e200e46c6b19bdb7479367b0b28824e3216a31e7d645f7ceb14485c049773ee23bd3cf7cc27b655c883e1c75bc60bacc659d9d95f66bf298228028daf194a47a1468b7d97607cdfd134be7380da44b04fc157932867f62443122d51774613ac514c582c9ae455e648fc5af40ccdc3e5490daae07b00aaf98853474bdfa66668ae4f41a9592be8058a5b15ed62291fd82c6f5235c9a93405dc7bdec15aa2c91932bfd65854bf99ca0fd19db423749ef56486dbf796ca27f5a9ec62767ad3a24a692e64de0017e18053e040ecc328f7c9abe4a6ca54fbfd359b3560cfb2b18858cc1b9b9f0dbd65e4f117bdfbc3ce80c14cf9511296b73a420ad7583184b4f1e0d5f7e90fb0288d4461d8536597cde078d2455954de7455b79352b7407356656f0 MD = 26263445024bbdbd0518b331a7ab88e7bdc8d8344a3480d1c19ad0e7c7cb22447cf88e53d2536fd215e25c5158dbc52ef56585f7ab5b771387811a9f9afbdb7f ring-0.16.9/third_party/NIST/SHAVS/SHA512Monte.rsp000064400000000000000000000355571352416253600173500ustar0000000000000000# CAVS 11.1 # "SHA-512 Monte" information for "sha_values" # SHA-512 tests are configured for BYTE oriented implementations # Generated on Wed May 11 17:26:11 2011 [L = 64] Seed = 5c337de5caf35d18ed90b5cddfce001ca1b8ee8602f367e7c24ccca6f893802fb1aca7a3dae32dcd60800a59959bc540d63237876b799229ae71a2526fbc52cd COUNT = 0 MD = ada69add0071b794463c8806a177326735fa624b68ab7bcab2388b9276c036e4eaaff87333e83c81c0bca0359d4aeebcbcfd314c0630e0c2af68c1fb19cc470e COUNT = 1 MD = ef219b37c24ae507a2b2b26d1add51b31fb5327eb8c3b19b882fe38049433dbeccd63b3d5b99ba2398920bcefb8aca98cd28a1ee5d2aaf139ce58a15d71b06b4 COUNT = 2 MD = c3d5087a62db0e5c6f5755c417f69037308cbce0e54519ea5be8171496cc6d18023ba15768153cfd74c7e7dc103227e9eed4b0f82233362b2a7b1a2cbcda9daf COUNT = 3 MD = bb3a58f71148116e377505461d65d6c89906481fedfbcfe481b7aa8ceb977d252b3fe21bfff6e7fbf7575ceecf5936bd635e1cf52698c36ef6908ddbd5b6ae05 COUNT = 4 MD = b68f0cd2d63566b3934a50666dec6d62ca1db98e49d7733084c1f86d91a8a08c756fa7ece815e20930dd7cb66351bad8c087c2f94e8757cb98e7f4b86b21a8a8 COUNT = 5 MD = 937d7856a82a84c163c79417d0540c47daaf9ffe662c843737dbbcbe5f865bf6f47a9d2bd10129a4f498073094653c324a2519a1c71ac1279b1623ff7d24647a COUNT = 6 MD = f8fbc058c2b9f84131c9decfa543a35ade41581f670398efd61b3abfced9c1cfcb5324f2370487f9c59a65bc668ea596c8d22ce8a33014dfad28357fa7d05f04 COUNT = 7 MD = 4ab0c9484ff5c30fa64ae6e81510c5fea566eafb88f175f8bc19109f40fe80014c8b77fff10b8750778429bf3c5497e4cb92d9b30014f4cb975dff2a45244c28 COUNT = 8 MD = 685179397554d276513d630234a03419808c698abf2600d7490aabb8e455c6ab6ea412c7729dc140a79dff66533c6946cbe90f9da9ed16e2e629db1651bea870 COUNT = 9 MD = 335e6e941ab7dadfecdb74ea6cb4e8584b6e3408841a33a6cf7fd6a63294b1930a60983240311672acac3840a90e64cc366ce75081b2252627e9c31197ebad03 COUNT = 10 MD = e3217f6af6e279e9445dc3738cbf9ba0e9edba0455844a73648139777afdea2c4d8032e214f541bf92675fb23f24df8e4fe98e0003aadfb6d8f9cc2cd799bbf7 COUNT = 11 MD = ee2fdfb3ae630613b7d890977cf2515deac272a37f27e4a01961ecf103d4ff5b45cc8aef53b635dd75aa51aabf71c0642555ccd3281e0388f8ca09d83258cf30 COUNT = 12 MD = 6a30d97cc98af6a25b673dce7aeab8d762bf2e55ea0c6dc899179281f84dd02a2896f77e9c106b472f55f7adbef7b1157be567ee1236ebdac2a3c5d8cb133eb5 COUNT = 13 MD = ac1176abdc5f71170183d92ae55856221b0d95590af11d9d72ba605ec026bbec52d6974bc43a1efb125ff2b161fbdc616fda00f04193a0bc26aacdfa052a5741 COUNT = 14 MD = 59fa909480620ecc08d34531a6da1b55158b74fc93ddf68e1d242615b6f3843a7952e63e798c6445cde1b07e0be09d0d711cb7b42a0e7760a593b08acfceb63d COUNT = 15 MD = 9eb253319efa61b864f27bd334d7dd78b38d3265fb544e0c8edee950a547e1d8db921a285774ab94d66beae933298d20f2a5aa87c62fe1e383cc3b18e7af18ac COUNT = 16 MD = 81735324005671f7bdad9e685ee8257f5e0622b9fcb5d38dbdfb2df27258c3e1d46d76e24c0c92c744e1b50a2b4b0d31525b3af83cc80a75722d921bdeef59c4 COUNT = 17 MD = 17498cdff4323bb8021e44eca6559e05d8ff9a0ef2ee9d4ba0ac6e73f83972a0dfbb6d47728fa70311d7c82e154966e1b7678263b0f65133e9116969193d429b COUNT = 18 MD = 228c4574d7c45eb9ba9240722133fce74abe00c7328ab30b4bde373dc79afdd6e0569d36268cd5eaa2f27205fc00512577bcbb6699e1d66ed85eafaba7548afb COUNT = 19 MD = 3d40ccd9cc445bbecca9227c67fe455d89e0b7c1c858d32f30e2b544ca9a5a606535aea2e59fec6ec4d1ba898cc4338c6eadef9c0884bcf56aca2f481a2d7d3e COUNT = 20 MD = e1e577aeac92e3a2b7f8a262bf2ac9c037d2274ca6618fbe4cc21db7c699e9946b6671ae45ea433a1e392a5bc9eec96fd641ba8f4a047f022a04a337227004df COUNT = 21 MD = 5e4424c0bcb2f0f7a2428821a9d5840a82401f4440ae6bed25c53cd9e71cf9d39904d6a375bd721f4332ab0202529c91feb9c094c3e6d34ca4f66649ee6fa212 COUNT = 22 MD = 56b199d63ca37189d5ca0d40006ac7bcb9f39cbdc00ef7b8a5697caa7d81d05b645a146995b1151d01958f1589337e14afc6e7dd10a815170e527a398e6ce8c3 COUNT = 23 MD = d2d498ff93fb03013a64f295b5bc68e57d2fb5600da578aa011d43ff432eae3e0c800f9e2a53155e56fdbf5e068fe2b4beb3e42b2585531b8b16c4d8ca3356c6 COUNT = 24 MD = 3d3875489903710f17cf4247b5842ace6f017b1a3b99e9ee5fbc04fc7898e78b12693879878028ca40c63cd0f6925fb7d0ca0412e4f06619e3ace223690f03b8 COUNT = 25 MD = a013e21cd1234483c95c2ea2757be949bc79401ba39b09c316a1612d594642be65ca106e12695ac3808c57c6f2980e895fd1fe188946562afc238414e1e43649 COUNT = 26 MD = c5f6367d7195489e16242f912fbe0d8002e947de3a7e9c53f77b1e5e90e05bd7ca395e787e34cb5f500c02da59c9d83de35601de7ae80dae74a0d6b4a292d43b COUNT = 27 MD = 7c28c44c6aaba83c122f24d68273e28a5afd65b4071d02b7ea3300478d5118971e1356ae57cbc70d2a177ea464a1c2c50d4297b933e789c63b1481797ae8f08c COUNT = 28 MD = af7cb42b1c70a85ac1ae1c2991b25b657c19f4fcf83af7f7dc0ae1028c1452a6a17dc98929634fe6ed3855b70b96bc2caa93d82037b94ebeddc77e4c1a7cc563 COUNT = 29 MD = bd56ad4c0cbd162706053da929d667253aadcf417affb483fff4f2699bf406d128cfdf5196dfbb05bb89ccbf04c5147bd2ebb3156b0bc1768ca6faa171c91c01 COUNT = 30 MD = 004d7b0fff9bcddf4b3913ae190a76728705a3d23874d92a8b7ff246c8fcad46623cb04723c8aded0cba4968d1a8cc1375b99005786c1bcb7ae4bf13325c3ae0 COUNT = 31 MD = 8299a5bf5ed64f525c4eebbeca969fc1b91a81adb58c584bdd2d7676386a31fa546643a3cf505007584f02fb712d708cab645bf078a1b9339f5a76aee985d017 COUNT = 32 MD = ce7100f3455db1a9776a9f40d562ea998afca1f9fee7e0d81c8db34cf68ad23a8bfa6fc04774703e1e56d5196b66966158fcf2a8335a58c6ba7ba1af756ba1dc COUNT = 33 MD = 90aaabcb655ee921b8350229efe6064a60051cf0cac858fa3d43afd5b97cc82301bd1b8cc1f874022e5af948185638783a13ca1bbd5049ace7fbf4f6d90c201f COUNT = 34 MD = 3cf0a25b33ded3e0806dfe603b9987f1d6f2b3fdcb1ec7f8566828c00e17e8f59e38b3bca302396c7525ca194e6cc8501369059e2e34ae21e3141215876847c4 COUNT = 35 MD = bdc5266aee339a1ff13fcf5229773cd3d14b47101e83076927c160bb71bf7445590525a2012d52af008e118e16df1b6bfcaf8f22b4e45f9e749f3c20625a2bc8 COUNT = 36 MD = ef8d2ba885381ab97756d59dbbbf53a1ea35d152b2d8f82c3518430aa34e708359194ea43950d032e151f576d343a5c3cfe6b71d4ed0ead9d3a107402589bad0 COUNT = 37 MD = 194ea5324c4179998dd7057755f255fdea04dadf533f7851e3e9718b610948e32fd28323077d9421142ac808978adfa325b668c8599a2e01c757a5a14ed2dd37 COUNT = 38 MD = 106984d2f0087e621dae760552bc6279072267883c204079481af6034354f1a2b77c17e6c039a1063e479342aa3ccd90330dd3fb5a7d5e976619497e2d3326cd COUNT = 39 MD = a1347216f1a6db47b90c4ded3c5c75440f54c22c87d538314d1340f86f88acba01378acb933ddad0adc6b75d55bfb7e8efc9c4a531b2a410610b7515b6dac66a COUNT = 40 MD = b76e4db147e0eaa4f04880654088b9d0fce518c8c377d92c846345604dc6b2b18d377fdb8e30f06d9bcfe6d7dacc07d6adff73d98d49f8f132b80f3084390830 COUNT = 41 MD = acd4e527763dfd4513f0def0b1edf8ea12dc78d336b7b796f3dcc32e1068725443a2f55ab4f666b27d6bf2ab39669c98293f0a9108051fd3144d31a1ed171ddd COUNT = 42 MD = 10128c15494bc87a87374f676ef9fe2df20b36ffcca41a80bd40b216637b3de710efd070e277827820a7bba3cceb7b21f8fe7f9775d6c4df4d3da5349434ec49 COUNT = 43 MD = 2632dd5c188c6ed3a4610405fdda704add752f5424d9de65a51400fe478e26cd0412e5f91ca4b744c34f4954f40a3a4254431d21954623208b527b7b4daa687e COUNT = 44 MD = 45707f5b6fc5ccd1f78d77f177d10fb8b462c74cc821518cd5cfa4b5d6b40b418044900693c37abbb82367d340fec67f800d74072935da1706b4d90ae26099c7 COUNT = 45 MD = 56c37f31220b5b3040373d91b2c5e42fe9e601a12f7f8dc4534459bf28e484b8713db243c5782c031e674003a3c14c42fd152e7188789065e82795e10f87d54b COUNT = 46 MD = 5da94c899d48bd8299fee3d81662f8d6c5f8f8bc54d18cb0368b13cebaee7ad71e74ea80f34974ad166f04f9a0602809166fe4085a475a8ca86cade12b6754c4 COUNT = 47 MD = 0664363f97ba910760b0922e31ca880ca97469506cb007e3108c36c3ce3ce1801fb4197609479339e8820632b6a38bffffee05a9adc11cc544b9aa6f5b95cc6f COUNT = 48 MD = 732c41a1edaa727c04f627ff158aaff67c18efd667216132b99ab84d108996a10bb008b5d803b22ed1aa78bb0d10f8a762fd34777d7dccce8e84827ba88d4193 COUNT = 49 MD = fc9c21d67e393a2b05a23a17d8db630cbaebaa3def211181749f1bcad181560627fb60ee20fae2e5980cbf50fce0a19dce807e7fb75c4da0ef008bc75d413a65 COUNT = 50 MD = 0453b765afc1edffa595efe345177f5805ed3abc1297ceab757ae7161723a6144cb543299f418049276d16b7896662631634fab9549127c10f27505b7dee8665 COUNT = 51 MD = 3853f3bf024e0668e8d1ea53733a97537f97d9307c5f3a19864ab4eeb1654710693bb961a344dec8a758f5e64b26fcb6dd423419c4a114fa749211a9de06c281 COUNT = 52 MD = 240137f0dd57beb3f7fc283bb3ead423c67883fd46f4e27471d7be57ad469a49bad03a3658418bd55614678f3a463bceff85291314b90ef43ccbcb028f0a7a07 COUNT = 53 MD = f9050a5271edbe4cfdb9520ec05bbdc3cbcb9bce36fd212338d3e7028a39b9ab30793e561d75a2e424193264c7f0775e65599ef0c94e0ad24dbfe18252364267 COUNT = 54 MD = 47caa7a5862fad837aaa409a4a9df2575e645528c35159115911b7c4e2f08ae49d68de97249b31b83ce2c163f649cad4559dc6e6a7191f2922d79a5fd6af167b COUNT = 55 MD = 13f5825c41fa49edf6104e3e35c9c224eba93e37374f730004c39c54e7391e4a847fd61865235a3fe32224c96fbe86f7e14c3d5df496e83ec989a71b4f293a44 COUNT = 56 MD = e5b55e05efe1ca6b9a96a57e3a1523d610d70f837e93b31fa98c2736d3e114d238d46ec6b6e3d19e774b253f6b0c7a2ebe69b7e60fc0874444806b2a2278df45 COUNT = 57 MD = f14a586ac30f0af255f597a9aef9abba5e99c04d17b01f24427c4ee2c196b52acb1ceefc9b15cb822b3ecffdc2f7c49e11d3fc0769acee33361537d379c62e0c COUNT = 58 MD = 7e2d3398807195c48e6ec52d20710bbf8b21ea8de4d1abc197897ccc58aeff40259edc67270cdae0edcc686c0d0dccc5760c1495ab1cf48482dc2000ae2d42ad COUNT = 59 MD = 2f3d5c5f990bf615d5e8b396ccbd0337da39fad09b059f955a431db76a9dc720dffc4e02c0be397c7e0463799cd75fd6ab7c52bec66c8df5ef0d47e14a4c5927 COUNT = 60 MD = 483a1764d308cc494a2b543d29ba616483aefdf91c7769fd084eedaac1add1891df95d317a47430b2bf73e4081f86597020e28afe2d34a22b77ea62b6112d09a COUNT = 61 MD = bfa88691ec951511651c6f14af100eeb26d87729e18ac3ef49a80d73ffeaeea53e97c4a7277a7ee9f2fba070b1c9720d6cdba407dd82267019e3f0f5662b2f2b COUNT = 62 MD = 4c17c8e2e7132dbf82afebc40efc77926d16f4d2c082d846dac28733aa767e2840ebf04f2563df75933466a36e11968d342e4157827605d04d9627ce9b5216c8 COUNT = 63 MD = 70bbfc29a2a765220af84e7bb10d759a3152ad4b5643ef6b89966950ec7ef9503d57bc0a28c4ee789a60bf9dcac59139e15241d73b990410cf92eff213da9eca COUNT = 64 MD = 8d1d56f37fc19b84984a6fa33aa9c2dbdbf79a29c04ad0b4cf20333e6bec943447be2416242f8cd2f9732e79bb925cc5a61a80c5fc9c079961243fd1c1f5900e COUNT = 65 MD = 492fd0171f4dcd5d20ea6c0d34b5576c8894664ae5955e6737f5e3b711c2804d99ccca065b7ec18c82da98b18a3029b765c51ebc7c433b36492e0ed6b8511bb6 COUNT = 66 MD = 7f49e8e54db7e5b4323cae2db71f3e8b8eba172dcad3602e9b7b058007a5589358732d5afffa56072a46e89b1ea27ef8d556deb86b569c635d394f15d99d8a15 COUNT = 67 MD = 56884a6a9210d5f371e25823efb2511a9c410c26a441e07c1bdffe8605084267d49c315baf6a692d7d97844b2714b4930877a5d7f52cf6fa151700fcb6980546 COUNT = 68 MD = 6aaef8284eef221ecb17ea3c9596f075b5155fe7b925d737ed3c6543c761c28c7cd9d9d4b5e2a37b2f183a2a367bbd34b633497bc7a1737d61c8c1f3ef295062 COUNT = 69 MD = 38ef178f5688e59d47c375252db7b39f40c0c84169878ee7ba5086e4b25fea81076b9c37847e9e6bf24ae0b343689c265ec5ca7469e619acd61b0276721efb1b COUNT = 70 MD = e3fe1aabad120777cf24eaae289b486632ca46ceb89afae73dbae5fa87c767879369355a9cc5c21ca604ed91d0f2f58c466573f3e6d88e52c62c0d3cb188e141 COUNT = 71 MD = 82f5bd920457bb2763a0da031a7fed47b236951b1ea420c20fd2b6de1dbfbb9c4600ea7092788493e2d4be6ee24b6dba04e57af3e8f2f14d9837295420ac7631 COUNT = 72 MD = 6d0b26208ba9b1615067bb3ff97b292fe67e4c02d240d649c32370e0a4cd22d03bdf864be4d24a3f5f51aeccfd1afd5191e590edeb5f7bec323b0506c3104b89 COUNT = 73 MD = d081083158054d08371ec84f4d3aa5aa761734ac6091a30330a861fda056f835c750bf4f7981af1693ff28545366bd05cec47bccd77a7d237befb0135c534138 COUNT = 74 MD = 6ba8b52780b8a07a2a2015dd8f0c5e7437b8e024c4ee428f7ba91dfea118cb72a939872550983317132b841b7cbc29a22b8f1cfea0c55203cafc69b55ed6244a COUNT = 75 MD = 312692b0a51f002b7f06d05b39d15a5637dbddd2f4f1a73e6c88a4c841cdba5cd8e69c0939ab39bb1a9c54fa35402143c97edb9704a0e9e1a98701710f6a5dad COUNT = 76 MD = aaee960de201a8dcccff95b834fccf0dafc03fe6cffc0429162bf4aff01165ab07a0c9435e9cb412121b7ba010657ccc3152118602b665072136317d92fd4262 COUNT = 77 MD = 21fdff552e08c86c07f080cefacaaaf31846eb893bfe2e4f88c3c3cd8cbf592a84500942695a5e5ae971ab343ce2695dd1baeb1f94dd4b53d678e14265e421ae COUNT = 78 MD = ca8f1a5b2172f6adb474da53b35e3f73ffd88263d3eecde72e48b16e1a0658015b555ee319005a1d82802e91431ee777610f9b1028d819921e1044ad426b0270 COUNT = 79 MD = ce5ab25eff9c1ddc569a1eaaa66b689109ee269db7066e0b02d39b3564fd14ca6249987b7791e203d3d7c2ebf18558d2f23f94c03dd1d03aa63849e4d2889a76 COUNT = 80 MD = a6f8b0561000dd4ae8b828c5f676e8c1a6474c4a042a645f1815bd52e9ff53c97dc36d5d8997f8ce332185feead76267f5b2e63f597fb3345ca0046e58fc0f24 COUNT = 81 MD = fec86794bad4106c5ad1c1a2d9a1b7aae480396ec231eb5cac21c4077d17a0b652da0037363399a5a1dababa4a40e4c54b9124167580dee9108c4dbb24c57512 COUNT = 82 MD = 594f5dd3f4c87bdc0d81309386e9163a9718e34c7b0dcb4613f8487aa786f9d211cfb61bb247fa9f5ecef042e710f192850f5571807294bfd8a54397850e5773 COUNT = 83 MD = d81ad866f25ef6a0a6431d267114da564513e5ebdcf48db7e95db8cf32a89f0ab107874d796035db97420ffcf1db5f04dc1a52ddbbb960fc63b7f3f835cc8be6 COUNT = 84 MD = 431d537e098e9949f6a68108d55d20952e3bfcdeb7273bac3917e37790a84fa5db04c33a79c113a06cf333e831d7702a00853a93fd0aa5146d934f4f71242a6a COUNT = 85 MD = 4ed95636c6885ae4e63d042e82f4da830c702dbf3b9746d64770a64dd666b33208315f3a947c4dff790771ef283788a9c74da83e22b97f750286a820ee46698c COUNT = 86 MD = a9bcb60b4d7724cdddddbc232b4ac70b94d0d7e9f0724b1222d918930cbb9bdbb04b3ad43e3c8caf3bf8b004ee4aec6bd527ff8eb6189b44827f7ba7057f6a90 COUNT = 87 MD = d6d5e44d5bb07fc4144ab6ab309f048968f73f7992beb326047e9e2cd7af6240bc8abf46703c32fdb58fb2a8672594a660ef855be74f24cec09d4fb00219de82 COUNT = 88 MD = dfda9ac0c7147530da97715ccf47814182255f2f2cf40287db97a4c63b43fcd39e6d41e560921492badb253a7dea0aba863c7c33b912bb59d1ff4de03a4f03bb COUNT = 89 MD = 0395faaaf2e907f27779d6f1cc9c9db68ec390a38fbb0702c6475b46f7a399498d46fd8014f834b131e1e83abba0359b1f16d8fc0a393580615def2ad0caba73 COUNT = 90 MD = 41cb98f09029abe85d24a0f131f116c7f69f54f7e91c250642606512bf3da4ca89ba70a4714a5f66d9ae81ff09317dadaff12a02057074c970f0f02a52bfafd2 COUNT = 91 MD = 8e8f161d48e306c5533ed614b8ef3a1979df6db7e13d0780a73c4a3980ddf0a95f93941d412c93683e39915a660c3fbec0dbb1bb6beea2e2099cd968011535c0 COUNT = 92 MD = 789593f0b8fb83ef9b3ec50ab8f6e1e47344f763d4f7ceab5600989e7b6fd5fef6ee5e487975f64474af6cd71ae4d9ecce8f009edea0227c7ebe73080b8f961b COUNT = 93 MD = f37e1449e0b313d9537a6177f7a31158d353e5b79c781facf02526ec94e0c6cfda37105bac67098b194ea82efb307c2929a9ab8aca0e76c53e829e3f901cd245 COUNT = 94 MD = 2e74e745caaf2d449ab3b031dd214b48616853a512cf2e95c40cb8e7594fe5e4879ac8a26d02eb35b3b96a5c9e7dcae3e15fd050a0bcc1fb3b9cb9c4df0fad3e COUNT = 95 MD = 6eac7069c26082e52574ca6a58abb9b1b9faf452e8cca9f1c7023679ce192ca554892f30e38104d39088a24df35612444a0fc90084af7535fd9344fa51dded84 COUNT = 96 MD = ada6caf30c4f6e3644d952366e01519af6771b406e2c447552f0c597b8dd10e9e9b4e699c9a835de03f422be8980538d9786172dfd2fe511db272a1543d5aa35 COUNT = 97 MD = 4d4b0086b2cb05d713f2805caa7e6605c8f7dbbb2e0f92aa159aebdcd63060305f47b748f1bca6e0b6e11cf8f9697fcccb6584b878c4b54a699290728a40aa1b COUNT = 98 MD = 97420b8a0ad102aeb92139da2c052d2748dd7d2dbb93a9ea79dc15b520d0ca7cab8cb7a00f5b5aebcb49d7e7f52a27180935ce617aeecdecba04064c668edd37 COUNT = 99 MD = 4aa7dad74eb51d09a6ae7735c4b795b078f51c314f14f42a0d63071e13bdc5fd9f51612e77b36d44567502a3b5eb66c609ec017e51d8df93e58d1a44f3c1e375 ring-0.16.9/third_party/NIST/SHAVS/SHA512ShortMsg.rsp000064400000000000000000001077001352416253600200220ustar0000000000000000# CAVS 11.0 # "SHA-512 ShortMsg" information # SHA-512 tests are configured for BYTE oriented implementations # Generated on Tue Mar 15 08:23:49 2011 [L = 64] Len = 0 Msg = 00 MD = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e Len = 8 Msg = 21 MD = 3831a6a6155e509dee59a7f451eb35324d8f8f2df6e3708894740f98fdee23889f4de5adb0c5010dfb555cda77c8ab5dc902094c52de3278f35a75ebc25f093a Len = 16 Msg = 9083 MD = 55586ebba48768aeb323655ab6f4298fc9f670964fc2e5f2731e34dfa4b0c09e6e1e12e3d7286b3145c61c2047fb1a2a1297f36da64160b31fa4c8c2cddd2fb4 Len = 24 Msg = 0a55db MD = 7952585e5330cb247d72bae696fc8a6b0f7d0804577e347d99bc1b11e52f384985a428449382306a89261ae143c2f3fb613804ab20b42dc097e5bf4a96ef919b Len = 32 Msg = 23be86d5 MD = 76d42c8eadea35a69990c63a762f330614a4699977f058adb988f406fb0be8f2ea3dce3a2bbd1d827b70b9b299ae6f9e5058ee97b50bd4922d6d37ddc761f8eb Len = 40 Msg = eb0ca946c1 MD = d39ecedfe6e705a821aee4f58bfc489c3d9433eb4ac1b03a97e321a2586b40dd0522f40fa5aef36afff591a78c916bfc6d1ca515c4983dd8695b1ec7951d723e Len = 48 Msg = 38667f39277b MD = 85708b8ff05d974d6af0801c152b95f5fa5c06af9a35230c5bea2752f031f9bd84bd844717b3add308a70dc777f90813c20b47b16385664eefc88449f04f2131 Len = 56 Msg = b39f71aaa8a108 MD = 258b8efa05b4a06b1e63c7a3f925c5ef11fa03e3d47d631bf4d474983783d8c0b09449009e842fc9fa15de586c67cf8955a17d790b20f41dadf67ee8cdcdfce6 Len = 64 Msg = 6f8d58b7cab1888c MD = a3941def2803c8dfc08f20c06ba7e9a332ae0c67e47ae57365c243ef40059b11be22c91da6a80c2cff0742a8f4bcd941bdee0b861ec872b215433ce8dcf3c031 Len = 72 Msg = 162b0cf9b3750f9438 MD = ade217305dc34392aa4b8e57f64f5a3afdd27f1fa969a9a2608353f82b95cfb4ae84598d01575a578a1068a59b34b5045ff6d5299c5cb7ee17180701b2d1d695 Len = 80 Msg = bad7c618f45be207975e MD = 5886828959d1f82254068be0bd14b6a88f59f534061fb20376a0541052dd3635edf3c6f0ca3d08775e13525df9333a2113c0b2af76515887529910b6c793c8a5 Len = 88 Msg = 6213e10a4420e0d9b77037 MD = 9982dc2a04dff165567f276fd463efef2b369fa2fbca8cee31ce0de8a79a2eb0b53e437f7d9d1f41c71d725cabb949b513075bad1740c9eefbf6a5c6633400c7 Len = 96 Msg = 6332c3c2a0a625a61df71858 MD = 9d60375d9858d9f2416fb86fa0a2189ee4213e8710314fd1ebed0fd158b043e6e7c9a76d62c6ba1e1d411a730902309ec676dd491433c6ef66c8f116233d6ce7 Len = 104 Msg = f47be3a2b019d1beededf5b80c MD = b94292625caa28c7be24a0997eb7328062a76d9b529c0f1d568f850df6d569b5e84df07e9e246be232033ffac3adf2d18f92ab9dacfc0ecf08aff7145f0b833b Len = 112 Msg = b1715f782ff02c6b88937f054116 MD = ee1a56ee78182ec41d2c3ab33d4c41871d437c5c1ca060ee9e219cb83689b4e5a4174dfdab5d1d1096a31a7c8d3abda75c1b5e6da97e1814901c505b0bc07f25 Len = 120 Msg = 9bcd5262868cd9c8a96c9e82987f03 MD = 2e07662a001b9755ae922c8e8a95756db5341dc0f2e62ae1cf827038f33ce055f63ad5c00b65391428434ddc01e5535e7fecbf53db66d93099b8e0b7e44e4b25 Len = 128 Msg = cd67bd4054aaa3baa0db178ce232fd5a MD = 0d8521f8f2f3900332d1a1a55c60ba81d04d28dfe8c504b6328ae787925fe0188f2ba91c3a9f0c1653c4bf0ada356455ea36fd31f8e73e3951cad4ebba8c6e04 Len = 136 Msg = 6ba004fd176791efb381b862e298c67b08 MD = 112e19144a9c51a223a002b977459920e38afd4ca610bd1c532349e9fa7c0d503215c01ad70e1b2ac5133cf2d10c9e8c1a4c9405f291da2dc45f706761c5e8fe Len = 144 Msg = c6a170936568651020edfe15df8012acda8d MD = c36c100cdb6c8c45b072f18256d63a66c9843acb4d07de62e0600711d4fbe64c8cf314ec3457c90308147cb7ac7e4d073ba10f0ced78ea724a474b32dae71231 Len = 152 Msg = 61be0c9f5cf62745c7da47c104597194db245c MD = b379249a3ca5f14c29456710114ba6f6136b34c3fc9f6fb91b59d491af782d6b237eb71aaffdd38079461cf690a46d9a4ddd602d19808ab6235d1d8aa01e8200 Len = 160 Msg = e07056d4f7277bc548099577720a581eec94141d MD = 59f1856303ff165e2ab5683dddeb6e8ad81f15bb578579b999eb5746680f22cfec6dba741e591ca4d9e53904837701b374be74bbc0847a92179ac2b67496d807 Len = 168 Msg = 67ebda0a3573a9a58751d4169e10c7e8663febb3a8 MD = 13963f81cfabfca71de4739fd24a10ce3897bba1d716907fc0a28490c192a7fc3ccb8db1f91af7a2d250d6617f0dfd1519d221d618a02e3e3fa9041cf35ed1ea Len = 176 Msg = 63e09db99eb4cd6238677859a567df313c8520d845b4 MD = 9083e5348b08eb9810b2d15781d8265845410de54fe61750d4b93853690649adc6e72490bc2b7c365e2390573d9414becc0939719e0cb78eca6b2c80c2fda920 Len = 184 Msg = f3e06b4bd79e380a65cb679a98ccd732563cc5ebe892e2 MD = 6b315f106b07c59eedc5ab1df813b3c0b903060e7217cc010e9070278512a885008dac8b2472a521e77835a7f4deadc1d591aa23b624b69948a99bb60121c54e Len = 192 Msg = 16b17074d3e3d97557f9ed77d920b4b1bff4e845b345a922 MD = 6884134582a760046433abcbd53db8ff1a89995862f305b887020f6da6c7b903a314721e972bf438483f452a8b09596298a576c903c91df4a414c7bd20fd1d07 Len = 200 Msg = 3edf93251349d22806bed25345fd5c190aac96d6cdb2d758b8 MD = 299e0daf6605e5b0c30e1ec8bb98e7a3bd7b33b388bdb457452dab509594406c8e7b841e6f4e75c8d6fbd614d5eb9e56c359bfafb4285754787ab72b46dd33f0 Len = 208 Msg = b2d5a14f01e6b778888c562a059ec819ad89992d16a09f7a54b4 MD = ab2e7d745d8ad393439af2a3fbc9cdc25510d4a04e78b526e12b1c0be3b22966872ebe652e2f46ed5c5acecd2f233a9175dd295ebeb3a0706fc66fa1b137042b Len = 216 Msg = 844b66f12ba0c5f9e92731f571539d1eef332e1549a49dbfa4c6de MD = c3f9c5781925774783ae9d839772d7513dfcea8c5af8da262c196f9fe80135b2b0c8c6ca0a1604e0a3460247620de20b299f2db7871982d27c2176ae5fa7ad65 Len = 224 Msg = 6b6cc692d39860b1f30203653e25d09c01e6a8043c1a9cb8b249a41e MD = 2e5263d9a4f21b210e0e161ed39df44102864325788647261a6e70ea4b1ee0abb57b57499bc82158d82336dd53f1ef4464c6a08126e138b2cc0892f765f6af85 Len = 232 Msg = ab1fc9ee845eeb205ec13725daf1fb1f5d50629b14ea9a2235a9350a88 MD = 72d188a9df5f3b00057bca22c92c0f8228422d974302d22d4b322e7a6c8fc3b2b50ec74c6842781f29f7075c3d4bd065878648846c39bb3e4e2692c0f053f7ed Len = 240 Msg = 594ed82acfc03c0e359cc560b8e4b85f6ee77ee59a70023c2b3d5b3285b2 MD = 5ef322cb4014ecbb713a13659612a222225984d31c187debc4459ba7901f03dac775400acfe3510b306b79894fb0e8437b412150c9193ee5a2164306ebb78301 Len = 248 Msg = f2c66efbf2a76c5b041860ea576103cd8c6b25e50eca9ff6a2fa88083fe9ac MD = 7978f93ef7ed02c4a24abecba124d14dd214e1492ff1e168304c0eab89637da0f7a569c43dc4562bdb9404a018b6314fe0eebaccfb25ba76506aa7e9dcd956a7 Len = 256 Msg = 8ccb08d2a1a282aa8cc99902ecaf0f67a9f21cffe28005cb27fcf129e963f99d MD = 4551def2f9127386eea8d4dae1ea8d8e49b2add0509f27ccbce7d9e950ac7db01d5bca579c271b9f2d806730d88f58252fd0c2587851c3ac8a0e72b4e1dc0da6 Len = 264 Msg = 9f8c49320af9370cd3db20e9b50d3eaa59a6232d7a86fb7d472f124508d7968b05 MD = 81b002f15c4d48be8517f7ed89df302fb1435c9435efefed58f3eb8ea11910623f1eb9028a66e02121a7f08a7c604226f2324f483e91548dbbd2c441ab704ce5 Len = 272 Msg = 4ab9aa069475e54b25e5688a52dd4acd134169c858105f01a0a1b134c72d4af51f8e MD = 48ba5a63aba7e7bd8e420475331125a947928c67fdb00f65c4080d9a0b99c0672424e76a1ba6bd76dfe492c730f6f9adccaee7bb11571aadb31f6bb628cfa933 Len = 280 Msg = f0c1d3407de92ef7421e42df5c9ab31d2ec0a750a9522869cbe4cabd66908d5823ec04 MD = 9e75c5bca2c2af1d7739787f46e1d981c4f98e493d0724b5252c2fbae3c526719f1d27e6ccd0d705240281e8fbf3db75b9b3205c1413436d3b5d140004b8cca1 Len = 288 Msg = ae8c9f8fb41b519b6d943833fe1c32d1c4292fb1ddf1dbe2eb227d9e14d31ed74ebaef12 MD = 042f9fd0a4ed3d9fec3655ae11011c6f2bc7e457e8812b6d8be2cd45fc6c432a94558c88f22c01439618865e8e49e509c448b342ca914b120344aaf7bcbdca18 Len = 296 Msg = da39fb86237f00303844e61fc6cfe779e42af53349839590bcd2f0e4cbbc279ec0b7e885d1 MD = ecb43de8c233a731b38e30c5696f8876761b7ea72efe283fd07bedf20029f47c6d2a4427823e100fb087abaf22d7eff42a951c97c3dd05f48a20163fa4367cba Len = 304 Msg = 3e7271d2070ef095394620c4b016576c150f34bea60784613a0f660d7fa5ae56872b88c58398 MD = 8154d0da634ab2266061acc123acb407650ffe9164a22de3fe29bf05393b2aece92cf4db00ea5b4341c31ddb7de151683c8a71b5a44d5c3175790feac67d18ee Len = 312 Msg = 311fb67f6a0784bb01a2d5a3f3092c407a9d3322319dff9a79f894291c5fac37319fb408402e18 MD = 1870fe913abb0a4b4f53b6581ae18322cd05328514556607f3f4d7b6a2ac8e9185d94d947d8b9c88e0efa66d89b59f7439c75fdadd1816f7412306ab2b59d664 Len = 320 Msg = 7651ab491b8fa86f969d42977d09df5f8bee3e5899180b52c968b0db057a6f02a886ad617a84915a MD = f35e50e2e02b8781345f8ceb2198f068ba103476f715cfb487a452882c9f0de0c720b2a088a39d06a8a6b64ce4d6470dfeadc4f65ae06672c057e29f14c4daf9 Len = 328 Msg = dbe5db685ed7cb848c094524c1723519d49dc66ef9fe6d57e6862a6435750bfa0a70f104f5d396e61a MD = 2fa6e5b2c443a68050f093e7fb713bd6b18f6274c061ed61d79bf0688a61dba1940bcc30998276860943ab038902896d0fbf59b88b07c80de927037097150c40 Len = 336 Msg = 9fa83e96b2a6df23fb372895015678e0b2c9cd18a8542c3eaa2c435a76ae4dc9bd5136d970daff933acf MD = 3a2c0ec88a3e5347cf0ea9c078838300ef7356f9a6c342063277c106b880a00ed2be205c13064097bd372fde38007bc306561eb4e74bba2bb20bd354aa690ca6 Len = 344 Msg = 8a5a45e398bac1d9b896b5a2b4e3566b91d80ad20c977ea7450ff2efb521d82f65019ee762e0c85c6cc841 MD = 3c704620f4066d79c1ff67752980f39ef3d9c1023fa5a213a5265376b14a15166ffe069b51df7710d8907fef9406bf375d502ce086ac82aff17229aaa7a5a334 Len = 352 Msg = 49cfffdaf4d031e33b1d28a447450545f6c4293b38d5afbcb9883976c014f080576ec691ac1bff70b742efab MD = 8bcc4f1ea2b7862ef1591bfa73916665de8faf65439ddf5cc1be43cebfd5f60f205e835a2b186b675b041258c5cff42669316ce25b46a2f4d4218e102f0f5d6f Len = 360 Msg = 2ff845d85efbc4fa5637e9448d950496f19d8d57da99b7bd3df7474822f0a790586736416714e364c6e1fae04e MD = 236f6f4ed6e858c02d51787e60c578f731f694f8e52b5df4ecd5b04dff14c78e56bad1028d6f626c29d85aeee151a2a2846d3eed5cfafa9854a69fea8af6d04a Len = 368 Msg = cfca05fd893c0f005f5ff796f4da19ba27a1e729956b8b715e67ce4b2d2a382a72ec7814f2f507b1825209a20fcc MD = d80969284a4565add4dad6ab9b3bdf53446142f84aaf92d4b23dd22ee7241e6c81489ac8b246edcb6df9bd7b23d91a0c517f546feba4ed5790a2be6e165c1709 Len = 376 Msg = cfc425759a9c36bb9f4b32eed7767af6566f68ded0adeae25c7a70ca78ec09774d16c8bc357f6d6f7bd441bf62d942 MD = b587a785cdf455cc9c544e756c1e306300aa3c59f8725012e68ab4d54020b6d227a164d9f83c905e86f8cebeef708a69f976d6e7b18b9bf78e9b98cc4a5cd1b6 Len = 384 Msg = 097c9db919515242c99d973acb1dc4ed482768f974eb83b465f9f6c82503372006e4490835e2ec8f92301130bfb790b2 MD = ff5a376f938e73014caef7fe3962944a7230d020b7087869ebe7ec70302721cd06fcdc981c893a425d05e2f99fe198e4db50a088aee2bf1263212110efed422c Len = 392 Msg = 77e73d387e7bc80419ebf5482b61d5255caf819fb59251ff6a384e75f601ea026d83ef950ed0b67518fb99dee0d8aaef1f MD = c4c89cd882ec945cc888fb9a0127d35e585ecc14a75e4b5b3d8330538d22da28cf6af1ebec96dc247f109cd2aaab9756e6946a3d80db8363a4da3e6ddbb510a1 Len = 400 Msg = 317e5d9ac73ed0633fa18ebebbca7909ec3a5ef790478f9c38cacec44f196d895835b425774483043341381e7af2d383e51a MD = b10bb04491b9c0c334709b407cda1d503efb6b63ee944f2d366b6855e6e63e5b80115be4be7ff63edecdfb5923792e68123976d79212b3884dec2179d1fcf382 Len = 408 Msg = 209461f20666a346fedf4a530f41a6fa280c43665767be923bc1d80bbcb8c9f8f93ad75782ea2689c8c5d211d2053b993145a0 MD = 67b7a328d9444056a52ca2f695c5d3f3baafb625a14fb32eee8ff26a40ccb296bec1771a826b55f7ddb6170d4caf7795b612448e66a0f19356fe505927149b47 Len = 416 Msg = 5d61aa45c446f3bf93604b0511313b4e2f306d6b046fbd94797b926746836f2e1dbdc56124060c6ca9c911b1122192d112420827 MD = d3931bde2bde8271ed18ca0b9148b12f6f16161e637e376fc961f65bc33bcacf2f6addf26a3eaa81b196653cc37e8a739ec5b3df870d8c38c8f28691c22a39bb Len = 424 Msg = 9288c795bb0b86c0419d9c5637dcc37b39bfa18d441e3fbfca75bc0306e5432e8e7b3a5627b5bc7fdc424a77520abdff566e7f2bb8 MD = e363d0e95d8cd18c384016ebeed6d99c4fa2768e2bd58fca019c5108b9cde1cb46f3f884028a55ce282ec310a10037faa1b16b4a6a669957f0b00f350bbd63d0 Len = 432 Msg = 780427dc164b2f69b8c7d569266f461e2d30c88c4cd6057fb030a6cf636f24e3c0d0db742a7b6193fdaa15eec50dfb4fae6ec7653c91 MD = 2964b009fb1bf996de12e030b9d6e0608ae8b9dbf2acfb9beb76fc5361cc104ee85c2a46fb7b4cee90848312da302de49afe61c546477e2b25d223d5e3d33560 Len = 440 Msg = ec2a92e47f692b53c1355475c71ceff0b0952a8b3541b2938270247d44e7c5cc04e17236b353da028674eab4047d89ec5dad868cfd91ce MD = c83aca6147bfcbbc72c377efa8d53654ba0830c5a6a89e1d2a19b713e68fb534640deb833ca512247166dd273b5897e57d526f88eef58f6ff97baee0b4ee5644 Len = 448 Msg = c99e31ad4e23ac68e15e605d0b02437f8147c44f5445a55b68a10905276cce8676481c33e8cd3efe322bb13fe0107bb546ccbec7b8b38d10 MD = 52992d45a88221d972958e9f2854adaa9a21d2bf7051e1f1019ae78004da50c5b55c144a02afffe539d753949a2b056534f5b4c21f248a05baa52a6c38c7f5dd Len = 456 Msg = 9aa3e8ad92777dfeb121a646ce2e918d1e12b30754bc09470d6da4af6cc9642b012f041ff046569d4fd8d0dccfe448e59feefc908d9ad5af6f MD = 994d1cda4de40aff4713237cf9f78f7033af83369ac9c64e504091ea2f1caff6c5152d6a0c5608f82886c0093b3d7fbadd49dfd1f9e0f85accf23bc7dad48904 Len = 464 Msg = 5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad0805 MD = 9763c43331ad0eb279d704c5f6e97e02da8724115026827f889e9fcda21f60fd230894ab35abb719890f3afa51afd31bc6852183b9c51059910af460abd2474d Len = 472 Msg = ca14e2ea2f37c78f78ef280f58707ec549a31a94361073e37701bfe503e4c01ee1f2e123e00e81a188f08fa050825709128a9b66bb8ae6ea47e41d MD = 4600e022a02258739f67fdd367cc1e662631fb087918768352062b9b3c8de8dbca0e9ec751b91f284694fbddb8d325c0637bccb21dd2efa92e48dbab2e5e9c26 Len = 480 Msg = 647629c779b24c1e76f41744aba17159487532a0156a7d8264db50d645e9595ff81e0c96a850f2aa56c844c613a4b892727a9bfc3d3e20386766f805 MD = 5bc842fc2d3b7eb31d2d3044df3ec32af114feaa7cfc27ebc8630f46ab6f0c543f59b812e776e5303861d17da3f1f16097641f3b808d4d5cb3e483946409746c Len = 488 Msg = 1c5dc0d1dd2e4c717635ff3e9b67caf957aec0f8f63c1b1e221e800a4c14848f4ea06e644e5d3e1de592ef5a8007fa3f07171b24bd07578d68963e5cb1 MD = cbf1ea86fa5b3dbf67be82fac41e84cccd0d296c757169b37837d273ccc015eecd102b9ce1cff68fdc7f05d22f2b774734f62ded54c8ee0bf57a5a82010d74f5 Len = 496 Msg = 8a555e75477d065b3af7e615475f37c0a667f73a4c7af5e4a69f28a68d9f4434776a8f90eab7f1d137eb4b22643c0a0d6a16fcfaa1bd62f2783546a9695f MD = c088e4a3d7da2f6f99a8f3f717361108872b8ffef921b383c24b8061d4e7c27fc56f4f20dc8f952a14043c5650b5a9e777c49c41cfeb3f2de97ee2e16b2c3924 Len = 504 Msg = ebb3e2ad7803508ba46e81e220b1cff33ea8381504110e9f8092ef085afef84db0d436931d085d0e1b06bd218cf571c79338da31a83b4cb1ec6c06d6b98768 MD = f33428d8fc67aa2cc1adcb2822f37f29cbd72abff68190483e415824f0bcecd447cb4f05a9c47031b9c50e0411c552f31cd04c30cea2bc64bcf825a5f8a66028 Len = 512 Msg = c1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5d MD = 046e46623912b3932b8d662ab42583423843206301b58bf20ab6d76fd47f1cbbcf421df536ecd7e56db5354e7e0f98822d2129c197f6f0f222b8ec5231f3967d Len = 520 Msg = d3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf MD = bae7c5d590bf25a493d8f48b8b4638ccb10541c67996e47287b984322009d27d1348f3ef2999f5ee0d38e112cd5a807a57830cdc318a1181e6c4653cdb8cf122 Len = 528 Msg = 8e8ef8aa336b3b98894c3126c71878910618838c00ac8590173c91749972ff3d42a61137029ad74501684f75e1b8d1d74336aa908c44082ae9eb162e901867f54905 MD = 41672931558a93762522b1d55389ecf1b8c0feb8b88f4587fbd417ca809055b0cb630d8bea133ab7f6cf1f21c6b35e2e25c0d19583258808e6c23e1a75336103 Len = 536 Msg = 52761e1dac0eaea898e0b07cd24f4b2e6bb7bc200ea4b0528842f17b87154559a2ea94459a0e480ae0bdf9f757dd4a335aed0e510138b024a04ed1d591b4323234dbd5 MD = b826fe80494e19c51b42f2582b2d080ba6b90512f35f2db67dd7fd5ee532eaa16498afba08b4996cbcfdf8d1a2df6b1da939e8265115a48aefa42f38205db436 Len = 544 Msg = 3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f1946 MD = 17dd6d87bc6773051e52047fd444996afa8124b0483fe121877f98553448772bd0e7751fc655e9cc2d29830211015d310f191474ca6adc0477a187c03b8fe252 Len = 552 Msg = 2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e955692 MD = 6af44563fc468d51182f6c3be58d45932af1d985c6f283976c91a9ff421f383fe21dc7322f397ccead583e26b3e3fda067976a7f34665df25a2ced7b4b09cdec Len = 560 Msg = 32a9c17033658c54f22c7135ddfc879de94d79593ef2dc7d3041bfa872738389864eeda27801794ccc4ff1fcb5ef3fc48833801d6fe959e3627f8ea1536ad00fa9c7d7d9f043 MD = 6a47699dd3ada2f11bc4ea42072b06cc20857bf164497df1285400c250f5848b6f71957dbdc845f5daeab913036661f69387893fc2d61c25fa59b9d85b19f401 Len = 568 Msg = 3d65f69a590a5baaabcd274fe3ef9e88920ffc7adf05c16d7b0f4d18d72bac1e94c3b3d83b8f4c552eb80e9fde3911403f8b000579816f02e1716fd627946031d0af0793e7f3e1 MD = ffb2d9450943c24b5933c24812459b75d3d9f380344c9bc06fa3e17ee448eca2f98ff79f7e2235ccd9f9a8176f68a2254bbc9b834d6ac8d2bfdbc1597c432c9f Len = 576 Msg = 76ff8b20a18cf104f6cdb65e2ba8f66ecf844af7e85e8ef2da19e8848a16052ec405a644dafb5ca08ec48f97327ac52c0e56218402c72a9a6dc1cf344d58a716a78d7d7529680bae MD = f8858144c6d709dd0689a526a548a43f17494950ba2ac20544799e8ea27201d78bce5b921e29a7b4029278e68341ef2a0ca4ba3894566b3c8f8950e3e545a689 Len = 584 Msg = ca88dddfc876a12f45f19562bc9ca250f43267ab251a7f345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e MD = 4f3d9eeef349ca51a7e419af1686f42795abde58a85335ce68d496e81e4436a80a61dc143a4300008c23a3e71f4ba98743195a3694a8d02fee11bd314569abc0 Len = 592 Msg = 0a78b16b4026f7ec063db4e7b77c42a298e524e268093c5038853e217dcd65f66428650165fca06a1b4c9cf1537fb5d463630ff3bd71cf32c3538b1fdda3fed5c9f601203319b7e1869a MD = 6095c3df5b9db7ce524d76123f77421ce888b86a477ae8c6db1d0be8d326d22c852915ab03c0c81a5b7ac71e2c14e74bda17a78d2b10585fa214f6546eb710a0 Len = 600 Msg = 20f10ef9a0e6128675340171cd248df30b586557620b615ca39a00db534315a9012dbdbfd6a994986eb829dbe6cdaf3a37d4f59ac27298742c8f777b6b12677f21eb289129579868705f27 MD = b4ead3f860eabbd36c770d66c7356f8107acd1485c7c94178c2eaabd50266d7645d009972586ef83ed43ed92882137df5117b88f35231b894ec1741ae7501145 Len = 608 Msg = 995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693 MD = a00a601edeaca83041dc452d438a8de549594e25d843c2cf60a0e009fb92d87abe28a72690ab657c8d35b43cd02d22ec0755de229d1f922fa6ca18a6d6c2aaae Len = 616 Msg = 0feb23c7e4a19bcbd70bd300d76ec9045d696f8c9687f49ec4154400e231d2f0862495150cf250b6f12f172a7d130f8fa5d175bf2f25e280172ccdfb327951701165302728a619aa2f242631c9 MD = eeb6dee30c119fb1e1eb5c15ff2b32d8b9c7464a4e4cc6815cd251a6bae29b49961dd5c2fa9c44a9b142ca062c7072cbf3db04299b767789040196bf0c06aa76 Len = 624 Msg = ac59a110623f1a64666f160ed32926676cb5be25dd9d962f441951b0efcb5d6a67ac1a4eae473e49c6257860728853ff415c5e8ec76a8a462ecfd343eeac22dad820722c597332fbfd94ebbd32c6 MD = f65ea942ae0a47e73b02b1442e5b26083db79307f64dd34a039c476faf18d5c514bb77a2c412a6074a7afc326ea66c74e5705fe2abbabf274333325a15b61fd9 Len = 632 Msg = 9e3e1077e1333a1fb1aa633ccf2f746588ad426489ea08dff5511438b5f4c0b110d1a4d47b540a12b21ea2aa070578ccfa5c22fe0b743ec0cc621c6b3a03b75f4d3eea5dce89e03269afcd9603d0db MD = 4b5c5df80c344c12388c723856cd06965b2190af652480476747dc2195ea3716f87c1762359583a5f31522f83f7833bec30f1f47d14540417dd463f5d258cd4a Len = 640 Msg = e881e3284c79d8f5237e699e4fbca84090c664bb53229f58cb0842b0436710c9b329d98191b8f030e9c1df89b03858c1569c6ff49a7c07c4a23a8a434b0fde13be4f94cb44ee629d5b44d336090d3de6 MD = 147d8071c7871ef9256cff32aa63ea031404fa5ee4ec09c56afdd5da919b0cc84a9d35d142c417715203316011cc620cd6855bb117063a5e52867facc680d5f4 Len = 648 Msg = e58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5f MD = f97ba056fa41f43b8e1987072a09e828c71c5ff6ad4e37f9ab6b89e2a078933dd23052fa72c6615b613904259e9ff9b55ef7b923b89bc8752f6babddd256e117 Len = 656 Msg = 3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f MD = c8a466199acbcbc93f2ce042968508c046901631e3118a2d0bf39a9b42b4197a379b3a86cdeca9df2de1a3eb71b79ae9bf2d6575eadf1878029c4093133f54d3 Len = 664 Msg = 9af608d031ccf309d7273c607a8e5e36840d449b55db5b13f03aeb9af49fa7e7cf1383ee2ed9c5a8b7515f16fb1c7c84a681590bf90f56597b844db5ebee223d78109b72350772f7c72ea996603e1e84f2ba5f MD = f0ded9495b4f64cac585be8a737cfa14247a4a81cdf7f01ebcb134ace71f5a83df2cd72e7773fea1e82beae17e13857372792c8231e2ab9fbeb633e399d5f0ae Len = 672 Msg = d0df1bdf1df6203241722fb9c9c1cf7405017497ae154538ccf9224ad752e6ce1d4ae948639aca70cfe86b2b06543cb9914ebd3085aa3e2963f6e9b93d0b03a31ae26fcb9ca974eee016c091a6fcac37b21cc1d7 MD = c2da3ea3c8a3fd88a5bc5dea2bc076f861abedefae5a5fbd941ddfd1c41cc3312eb2dc826c2c0f65414fe72ebee447d2f9b1a6a56302660d1f86632ee80a175f Len = 680 Msg = 8cbc9480553acef7bcdba9716ea8d66b4131780917de2b0b048045fcb32b5cac054808e1fce6e94ad851ecb47fe6cb802225d3551e08ea122093d0078dada564212eacf1d6394e0007cc62a1d595ab14ca08a284bc MD = 63b39b88ceb848188b37316e04560e75a5340ab8d417932d231c997e892b41daa69d9fe3e9a14dd19ccfbbfa01488c208e7b946cfaf16ca2b1bf7c8d8da4e6b2 Len = 688 Msg = 38f184448f3cf82a54cafc556aff336f23f9149e612134b3fc00c8a56455653d88640b12f69062b8432c4335ad8f7ab4ff66cb7eb54f332561a36f024d92c3e26276f4fd48619628cff88e4b8e85cf14ca4767ed990d MD = 9a49265fc641c59f1a91872cdae490d3da73c0c60fd59648e1d17dba1a647a5b95629392bb4ff5163d1a3cb45427c1437a3b2e1d9f030c0a8bcc5ed22da9e2ed Len = 696 Msg = 70900618b1e9e9db62296fb6c6590c9f10b0a632765c489c887f1ab7c07791765a62e38465e1be281b1d396c6e080b7ee3e6fa56a30b9799d0e629be153ee76f81bc6a3295aa61489bfa87d53a8ad24248a6ede0dfcfe9 MD = 1c8c3357ff1f8d6ac4defb3af462a73e09159e3a20c6506edd8cd3052df941c81f68c5fbb893912619e28640977fe8eaae8e9d5d4e7d5f132552cefab4540bac Len = 704 Msg = 4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b65782e6ff536e89d8d40928b41ed7371365c8080a9647f7532ce6c6d4ac21cfb0c8020783851ec9a7dbc3948f8fca7adf8b2a78c04d898d31ff6 MD = 5c2f996c779b91b3c4639311f54fabbdde7e2212b53dbae4828c8399588fc00d3b2ae60918aaaf6bb48bc757e52b2bcea84f5d15bf4ec25d5519fb54f6f26e1b Len = 712 Msg = 696825f6d6ea8173ec47d0959a401c4ddf69f8f08ddd678a4d2ff976e3a4372bb39f4159845cb63585e1d4108d32e12fa7c5c9d7ce3508a7f53aca2b4bd951adbcd8984ebb7536563f5884c90bc5023b3316f7e4dc6958f743 MD = 3ce940ca96b00011375daa95c65f66907d69b3eb3b8d779e6fc971afcc05e990bc4c541f434590f6b18b68c080d0f24475a3e764e9cb85343301314ee2fb661e Len = 720 Msg = 79ecdfd47a29a74220a52819ce4589747f2b30b364d0852cce52f91e4f0f48e61c72fa76b60d3002cae89dfc5519d3430b95c098fa4678516b5e355109ea9b3745aa41d6f8206ee64ae720f8d44653b001057f2eba7f63cd42f9 MD = ba3d0fe04470f4cf8f08c46d82ae3afd1caea8c13bebbe026b5c1777aa59860af2e3da7751844e0be24072af48bc8a6fd77678aaee04e08f63395f5c8a465763 Len = 728 Msg = 9263fe75e8f6c7d5d642e2ca6a6eea4f44e9a0f249513ed79c9409ffca5526ca4491aebb1382057cc7c36722b0b6c3b15123cde312214f25353abfe30bca170568a8e1ba5408917403a01834080ab607c56a10d0265082498fe0b6 MD = 7736d7a7fc1eb05857ce7d88abfffa87f58c670bfdfc0a8031f60f379e4b6ad94ac8f13ffe28c697809b5cfac7f13be01e7496a85237c4025539051fb2e32fb6 Len = 736 Msg = 78c17bfe0e02eb526d1a44a1ac127be082181452b625394bd6dc093a2cb432e6ee59c2f8b5503aba30dae41e1a1c6702697c99b2c94e94af48b00caf53b2e0e4e1bbee81ee282c7b2b35f58cf421a07e828d57a6622626af25835399 MD = b56b6e343166328523e0d1693e5174da643ae83cf69c85a7b3c3bee247b77b84702069d9e6b4cab03bf17fe612009bf4239683ca78ca7e876aca7d07603ba714 Len = 744 Msg = 298bb304a920f960447d8fd38b061bf8fe4ac1f871d8a0feb4549feb72ca694a5a41b6867d94cd5af77d468ad2f315d127b6c41a862800f3985e573e037740298e2c5c6186a9fb83609be2d49f8b4c31f96a2e49b56dbf09571b38587f MD = 34e3878627904ffbbbd85266cc973c34f931e3cab5d4c31f841c553dd69f84838206067df4f9f3b9102001be19267151e673f5c2d4c2f8438a6999a0a325487d Len = 752 Msg = a3cf714bf112647e727e8cfd46499acd35a640dd393ddd263cd85cf6225f59890a0686dad1c54eb8d809b81c08a98dba131bbdd6fce8ff59d95db824d8831ea480529da739227a6e0f62b603b38c35cdc2581f614a31879b8be54aeefaa0 MD = 6f230ae4903ddbef0ba384c2e3506eab318bfd1a46ea76099f65a3fd529c91bc2865b9fd943e346de64626b8529f9db1377bf2c5e0129c66b50c6a5cfb364b3a Len = 760 Msg = 0a427ae55ef3a7e6044a08cf6128cbaaabfd776c4e9374708f2ece246fd73603d2f54ac3e01d16cfac2bdaf713920d66e8f0a3d54ee68cff64267d5528cdf2f295f474d10f81173e0143488ac53fc503c444ed23dec63a080ce90c2443dba8 MD = f6bbe5d0cf13ddf41c1436748a5d1ccae2948547b452c2171c7c8e8b66c6ae4de3c0e8b2962bcb60d3de3608479f80e455c9024d9716c38f6f1206861ab1eaac Len = 768 Msg = 2cbbb87511f4948efec3a61b511ededb1dda8b6ecfc0210c11e43a77ee32dc2e374afae4268e3d30427804868232a966b56006d3214037076bf6a265b72135af0fb2ef7909fea2dea412f7717446b276ff153753662b4d4148c02347e3259169 MD = 76897b87a8a1cf835c434f6d391c9e5227351af9d3e20a3389c796b98b424281a59068d9c8d567ec2bebc435b0126b059e2d86394a9854d6611e1c922f385496 Len = 776 Msg = 2b23324c9992f60a7fc010159a03cb9a2b290df4fa6a82359b9af602f0a403a5ef33ed5da5b2caf87b77e6a4b93b650348ce2a7dbc08f8da9203d710b587ba5947c65e899f4a759f8e2b049ae7850a8e3e2962f6ef93ea4c631de5d78e729ec5bc MD = 3beea0b373ed09cf1c919c51d86d642c9125e0ee81698dc4cbadf02e9e6925efb562fd9b87301a6377ca192be79c4118deabc450b54639000c2e312945451fb5 Len = 784 Msg = 4022f930c7033b00d986c65ff6bbbdf9ebd0e58c52844ff658df3893c3202dc533f873d4a7f5a5f944419fb5528c9b6788479a1e891306acae7995fc06db70a59baa95bef7da79f5e793f2db7f2a55825e4fdb4a34884af881ded1089fd5334502a2 MD = 0358775bbb733ccc49e78f544aeee512370d480d0e13c7e8d5c444c423e592146b45fdb91a1b694d35e36b60e4bc8397fca8bb9790e619339778b9cd1abe3fe9 Len = 792 Msg = 1cb77ba43ce77e236b9fc925f589b1c070780a84f99e8f50c1ff846ac92599cfe91612c8178325bee642a34f4dffdba2aa2ebcf7064339829b26f27993e1106c139c70d578cc05f0e1a777cceddb10a2c67fd9675e4a009df8037d6eeb38f5fba233df MD = 6502f46551a3fab3a96428fb97801d7a4aa2f17fef6603238df84e17c74309ed3d9489c8b16a9384ee634a3f86d0b3ba9a4dbc9c51ec8bd4bf8d61de6d3d87d7 Len = 800 Msg = 52167de2d6c502d99fa10c27b2ab6203bdebc2cafbbfdef15872a43dd610c2362f796ad9bcb5528d95870058fa454453f1e6065b315d410a3f2650e5d71e69d78d9767dfb4accc057fd2069266b0f180cb319e30ded7535bbe52d24be151de4bb598fc5c MD = 25cb3ed3983a91b4cf37a65193916c5e3e211b63e943e2f7b50a85d349a463b941aad33eff16561bdfdc92fda06a4e1d94b162de48f06d3c626940b31020925f Len = 808 Msg = cede6697d422ddaa78e2d55ae080b8b9e9356c69bc558201a2d4b0b3190a812c27b34bbcee3a62b781378b1bf636b372bcbae1fa2f816a046a0a649a5c555c641fea4ccd841cc761f38f777972f8c91b0324e71c333ce787f04741439bf087ef5e895011c0 MD = 0be42a25d77ac6ad995c6be48e783380bad25a61732f87cefb0cce1a769cd69081f494a1a12d657664ef2b4d9c41f2ee83f6e9a84327d8756af9f985595e7d3b Len = 816 Msg = 56d18d3e2e496440d0a5c9e1bcb464faf5bc70a8b562124f5fc9e9deb5fee6544b945e833b8b5d131b773ecb2cdd780cd4e1bb9e4f1e3cb0a1d64d19cf4b30e44e6c2d0cbcb4e284ce50db7a8a8062ddb63f981d9026c532bf8eeddf8af5a43848a32262178c MD = 982dc61c91a93770582eee8025aa55da8e9edb966bf5cf70d4a6534c0d53a2789a8c4fb65b7fed478cda02ed1e0d198d85c5c735b2417c5fab5d34e969fc8e7e Len = 824 Msg = 25a7320dfaec5af65da4d0f8688e29e8e95532ecc16679ea8aff0f407d898db6922855b0e8901aa9681aa3dca617cb440764cdc7293fbeaf7f585b593c2b0531738e0ade7c8626b9995f4a84d9fc9b593d6bbee01abc53c5be14bf6956fd2fd81000dafc7c7686 MD = 749c928c3d5510925bfe98659025b0ed7c01acd4d59a9bf1c54863a088091771dc9d407bdbf83b0f44b0902e10349ba79c84d0981d5e8c4f5c733a117fed0790 Len = 832 Msg = 3d7177b28ffd916e7e0634895833ba0bd9e0653df2cc4202c811536a005aec853a505e75db55d3c7107579041099e382a1feac80dde65d72368e909ab85f56d88e68d7c3c80c38f85bf8c2b36959409cc34ba8e3ad94fe8ee1927612d672d92141a329c4dd8a88a9 MD = 14a331508cd7d94fcce56a66bf65f20870a281c8442f8dbd4c2371454a2b66f8d0994a0b67692e771efc6a5e0b887acae7d6f4ec7338e1aa89f2abc7034c4e4c Len = 840 Msg = c033e4a512297caecdbead892b11a9f7007af9a74bcab89e0bd4ffdd542ca03ea12e17a06c42bd43fc5f3f757fce4f6f5831997abac3f95676e1ebdb11ca43e11aa31e5ebabe18ce8d1bbfd8b02f482e1ce581b532e307e6960eb97441506c2ed299e1282523f41527 MD = 95ac9b7d22aa458921874c4b4331e7d64761853217c3f83c601abcbccd7e2eaa6ca6ce9a22ebcfe5046d52f8a09097f043ab8bc59243fd770090bb432c3155e9 Len = 848 Msg = 69fff0f1a3dbfb36e32f025819fa99ea9a0edaef73145bf7fcd05d8bb0a646cb3b5d5256d524856acfd2e44d6b72e4ebf1ff23c0ff6c56f821e782d5a15f7052a1445b06668eeb4af700679ee7ae26496fbd4640c06aa149964dfd6011df835ac13b73c8ff21151e8440 MD = 45d4daa652558d1c12beb0f5662c712f325b4c802fc6eb9ee039c949d002bb786f1a732712be941f9c5c79b3e5c43064d63a38578e5a54ee526acb735b9ad45f Len = 856 Msg = b2c439c97ab7c63736b3796324d68eeb7a471ed142bd9622684167d61234fff82f93f907537a909bc2e75a4bcbc133cf57197662c1af746ae8b81e5b83de05d9b589851de25d3c99c004c1dfb12d93bf50d450af49c428716f5b90ef088e3b6a6b2c46d3ce67b379599018 MD = c48ec83be5fa669e6ec8db90aca9676cfe2ec0d5e8e7a2431687bb953c0a300be3db4075cca3bac4dfa4d971baf0fa1aff46639db4b238856ff36d1dfcd520f1 Len = 864 Msg = c016f522f26b7470e922b9a287e6d45f6c28813b68c1457e36d9ba266708272f9cbc5411f8db9d8bd5a9449fb6eb0cde7d4d03e5df019f2814a90ceed377c59d7d92623899bcb0268033073559d4d8de488686cbe3d67796e6df6ad4276d0b52cc62c49ebb58d7c95287aa6c MD = 7402f1a99b47e102b3b73140c6771b07ee6c33b3715e9c4027c441bee40511b735d95e508baea78da26fded9b7038e9a53defa58448aba40dc1e62d7ec592107 Len = 872 Msg = a766b2a7ef916721f4677b67dbc65ef9b4d1bda1ad4e53fc854b0236440822152a111939e5ab2ba207719472b63fd4f4a54f4bde44a205d334a2d72cfe05abf804f41841b86d36920be6b0b529331ac163a985556c84511ec986439f83e1d7311f57d848cfa02df9ea0cf6b99a MD = ddd60f93a3babc78299cf763e7919d45ac6f479700e1adb05ab137acdf89c1521ecb9dfeacd091e58ca57a1db964a9c3cd1fa39192cc1e9f734caa1c5fa62975 Len = 880 Msg = 10f2be77a4055771a67007cd8630e3230e38288499cb160380290174d66da57455b6baaa9785c84c8a663de41ed3bd544055b9170cec43cb3eb120eceaba1fe36e3eaa3fa4f99b425cd2519f09bc0282bada52d14ce625b1ded3b24d86b1dad342d2b7be322b775b04fc6b86afb4 MD = a872fa33d463b3343cec57c20c66979c33e1ad067bfc703454696aab5dd0003bc194318f4a8ebbc74503feb7211a472dadee991efe3e38f21a1310f8a76eac80 Len = 888 Msg = 324533e685f1852e358eea8ea8b81c288b3f3beb1f2bc2b8d3fdbac318382e3d7120de30c9c237aa0a34831deb1e5e060a7969cd3a9742ec1e64b354f7eb290cba1c681c66cc7ea994fdf5614f604d1a2718aab581c1c94931b1387e4b7dc73635bf3a7301174075fa70a9227d85d3 MD = 3b26c5170729d0814153becb95f1b65cd42f9a6d0649d914e4f69d938b5e9dc041cd0f5c8da0b484d7c7bc7b1bdefb08fe8b1bfedc81109345bc9e9a399feedf Len = 896 Msg = 518985977ee21d2bf622a20567124fcbf11c72df805365835ab3c041f4a9cd8a0ad63c9dee1018aa21a9fa3720f47dc48006f1aa3dba544950f87e627f369bc2793ede21223274492cceb77be7eea50e5a509059929a16d33a9f54796cde5770c74bd3ecc25318503f1a41976407aff2 MD = c00926a374cde55b8fbd77f50da1363da19744d3f464e07ce31794c5a61b6f9c85689fa1cfe136553527fd876be91673c2cac2dd157b2defea360851b6d92cf4 Len = 904 Msg = 9159767275ba6f79cbb3d58c0108339d8c6a41138991ab7aa58b14793b545b04bda61dd255127b12cc501d5aaad476e09fa14aec21626e8d57b7d08c36cdb79eea314bdd77e65779a0b54eab08c48ceb976adf631f4246a33f7ef896887ea8b5dfa2087a225c8c180f8970696101fc283b MD = 3cd3380a90868de17dee4bd4d7f90d7512696f0a92b2d089240d61a9d20cd3af094c78bf466c2d404dd2f662ec5f4a299be2adeadf627b98e50e1c072b769d62 Len = 912 Msg = fe2d8ae200e6657fdc7494af5a12b2ae940348f1f983f0ba98febbe99c80d115126d57dbf37296765ebb5990256696588b3851d54c8fbe7ade98a6faf7c20b5e4f730f54a7f912ca0ac31bbb53d17949ef69aa0de40c7bab12a871a9b90f68813ca87af4256422a268f4a1d8ec3aa1a947fd MD = 8025a8608df0f6a01c34cdec012d4cb25852e1b100b68172fc4e86ac8b7126b64859cb9e767a7e59060989cedbd925afc475ca7369bd43f85ae590e224e036dd Len = 920 Msg = dc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7ced0bd1cfd7e3c3cca47374d189247da6811a40b0ab097067ed4ad40ade2e4791e39204e398b3204971445822a1be0dd93af8 MD = 615115d2e8b62e345adaa4bdb95395a3b4fe27d71c4a111b86c1841463c5f03d6b20d164a39948ab08ae060720d05c10f6022e5c8caf2fa3bca2e04d9c539ded Len = 928 Msg = 5af8c0f26db4e99b47ec2e4a01a786e77899e46d464ac337f175027b61aef3149848af849d76ac39b9b0910fe6594817859e55974fa167518ed72d088dae6b414d744d477974fb719c626da792f981233de24b7579d8acca510a266d73c0ee8ee1424343eaf6ffcc59c86c1becce5894072c6c11 MD = 09da284d5b6556508be54c8ab6c97bbd472995c6bbd585917ecdb54ea9167208daaa070a7b2b7d8e93ce1315f0d1ef8d69667429c44dc5ee1499de57b229a398 Len = 936 Msg = 49cd0ba0df5bb3f43f68464e3e83e9cbd5d5ee077ffa5591e30f939cb30c93f7d454fb3fbf8bb05327a89c08dc4baf1eef50237317a405775357f1e0d1f31d9f0f0d98124019d47bf18363b1ecfbfe155c10cbc83300e01bc9ce0347c596b35f411e6d8229ad2855e42022b0373ade98663c6d6e9c MD = 30cbf0679a97c871574d2fc05d7aa760c6bc8a864b7d246c39b9e812f9b7ff7b4ef5197dd5b69493306688b8564de1ad47d75505c913ba6a78788f8caf5788bd Len = 944 Msg = a8a37dfc083ad2f47fff468738bf8b728eb7f1907e427fa15cb4424bc685e55ed7b2825c9c60b839ccc2fe5fb33e36f570cb8661609e630bda05ee641d938428867d90e00744a4aad494c93c5f6d1327878078590cdce1e647c9820818f467641fcd508e2f2ebfd0ff3d4f272393478f3b9e6f806b43 MD = 8e1c91729be8eb40226f6c58a029380ef7edb9dc166a5c3cdbcefe90bd30d85cb7c4b248e66abf0a3a4c842281299bef6db88858d9e5ab5244f70b7969e1c072 Len = 952 Msg = 36af17595494ef793c42f48410246df07d05936a918afe74cd005e537c586b2843701f5df8952242b74586f83339b48f4ba3a66bdeb457ecdf61784eac6765cd9b8c570dd628dbba6ae5836b9ac3dbcd795f9efdb8742a35bca232abf36eb3b6698b2933965802277ba953a6edcacaf330c1e4e8c7d45f MD = 158bfc348a30b4fabbe355a7d44bdc2122a4c850444c03f289003ce01bfc1ebf3ecc0febb6a8ff523d25db7681b05bdce048d11943ab476c1967cf6556c4a120 Len = 960 Msg = 42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438 MD = 061afb119a3c60876e04c10f12ad0f4b977593dc5a2d21096a57e7d3f7d4d44fdef934b2c17d7530674e4f4a1c176dbdcc54811a22e1b8712e4192fc2d4bf8e8 Len = 968 Msg = f91bb2e1a9c4cd96bf250426b3a6afd9b87ac51e93254d2dae3b16ec686ba80fb0bd7a84d218660e9007593075bc4f4c66567f0c7a5fd2010c999a8a0efa81f89ff5bfefe0fb910f0442e6d4a7c55bbb618c69a79a2ddd82a0938927f6fe3a80f04beaeb7c7636e3435d12dcf1c6bb6ed0a4edb69c9657fa93 MD = 6e692c8c694ee0a3565f37a299e0006b85ab4a821b20e76798220229f656efc6a20211a4e7e4ed77facde0d70e4d5d95bc8ed1d7a56d8df1446d562f044b344c Len = 976 Msg = d1eb961ca6a8f67c49b61e4d3ceaa2a1de6f0ea927b132bf987abdaa725b0e1e274e46830e99a2f75af608964df0dff9a99024fc6839bac5acd10202f921ac71a27fcda681aa3109ebf5f21ee3a849098ea3a551e844fae4b48b5c5bb97ccc802bc5520d68a14cb7e5fc056b67d889d876efb82d0e9a9a2499f1 MD = 39b2c76ec207120de4b320c7fe069e602c9c38f257596da7369395e87eb64b3acff988c1839ac269d5012c093f9edd4b7cabf13bdea7d42e969ab108269c6ab0 Len = 984 Msg = adf2263200f376886ba7b6f5e4411d5f07f7d9d101590c73ace114bafbcb0fdc99269e87cd2cead2a1cfe5744394d333aba408a07e21f30233b65b907472e9e3c7d6e7aa6d2c47a08a1be7bb877913a6b5604c723384478911c339e3b5fe527c7e288705a89c95d970b443347897e79f6c522bafe62b11ef8f3135 MD = 3c23d2d8cf4db6ac6a42e27208180f37668bef5ee0a3f879483c8e604e7f42583f202037b8d242c04a87345b8be6dc8b121d6484b9edad0d73c894c1288f5cae Len = 992 Msg = 18e75b47d898ac629c48e80dbfb75dae1e1700b771165eccdb18d628bfc4063dd6c3839a7ec4cd1255c4821b078cd174647b320bb685541d517c579f6b8e3cdd2e109a610c7a921653b204ad018d0340d9938735b60262662016767e1d8824a64954086229c0e3b5bd9ad88c54c1dc5aa4e768ff1a9470ee6f6e998f MD = 01c756b7c20b5f95fd2b079ab6a50f28b946fb16266b07c6060945dc4fe9e0d279c5b1505b9ec7d8f8f3c9ebf0c5ee9365aec08cf278d65b64daeccc19d3cbf4 Len = 1000 Msg = c2963342cfaa88ccd102a258e6d629f6b0d367dd55116502ca4451ea523623bc4175819a0648df3168e8ea8f10ed27354807d76e02ee1fdf1c9c655ee2b9fd08d557058dabdf8dcf964bfcacc996ae173971e26ea038d407c824260d06c2848a04a488c4c456dbcde2939e561ab908c4097b508638d6cda556465c9cc5 MD = a4d2f59393a5fea612c3c745f4bb9f41aaf3a3ce1679aa8afc1a62baa4ed452819418c8ae1a1e658757976692390fc43d4decf7d855cd8b498b6dc60cae05a90 Len = 1008 Msg = 85360c3d4257d9878e2f5c16d3cd7d0747df3d231e1a8f63fddc69b3b1101af72153de4c8154b090c9815f2466e0e4f02f3af3a89a7fd04e306664f93e5490d4ce7fc169d553c520ae15dd02c7c613c39b4acd00e0c9a3c501566e52cecea11f7303dd1da61abf3f2532fd396047b1887255f4b256c0afcf58f3ae48c947 MD = e8352ddcac59e377ea0f9c32bbb43dfd1b6c829fad1954240c41b7c45b0b09db11064b64e2442a96f6530aac2c4abf3beb1eae77f2bce4efe88fee1a70cf5423 Len = 1016 Msg = c13e6ca3abb893aa5f82c4a8ef754460628af6b75af02168f45b72f8f09e45ed127c203bc7bb80ff0c7bd96f8cc6d8110868eb2cfc01037d8058992a6cf2effcbfe498c842e53a2e68a793867968ba18efc4a78b21cdf6a11e5de821dcabab14921ddb33625d48a13baffad6fe8272dbdf4433bd0f7b813c981269c388f001 MD = 6e56f77f6883d0bd4face8b8d557f144661989f66d51b1fe4b8fc7124d66d9d20218616fea1bcf86c08d63bf8f2f21845a3e519083b937e70aa7c358310b5a7c Len = 1024 Msg = fd2203e467574e834ab07c9097ae164532f24be1eb5d88f1af7748ceff0d2c67a21f4e4097f9d3bb4e9fbf97186e0db6db0100230a52b453d421f8ab9c9a6043aa3295ea20d2f06a2f37470d8a99075f1b8a8336f6228cf08b5942fc1fb4299c7d2480e8e82bce175540bdfad7752bc95b577f229515394f3ae5cec870a4b2f8 MD = a21b1077d52b27ac545af63b32746c6e3c51cb0cb9f281eb9f3580a6d4996d5c9917d2a6e484627a9d5a06fa1b25327a9d710e027387fc3e07d7c4d14c6086cc ring-0.16.9/third_party/fiat/LICENSE000064400000000000000000000022111352416253600152200ustar0000000000000000The MIT License (MIT) Copyright (c) 2015-2016 the fiat-crypto authors (see https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ring-0.16.9/third_party/fiat/curve25519.c000064400000000000000000001445341353036607100161250ustar0000000000000000// The MIT License (MIT) // // Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // Some of this code is taken from the ref10 version of Ed25519 in SUPERCOP // 20141124 (http://bench.cr.yp.to/supercop.html). That code is released as // public domain but parts have been replaced with code generated by Fiat // (https://github.com/mit-plv/fiat-crypto), which is MIT licensed. // // The field functions are shared by Ed25519 and X25519 where possible. #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(push, 3) #endif #if defined(_MSC_VER) && !defined(__clang__) #pragma warning(pop) #endif #include #include "internal.h" #include "../../crypto/internal.h" #if defined(_MSC_VER) && !defined(__clang__) // '=': conversion from 'int64_t' to 'int32_t', possible loss of data #pragma warning(disable: 4242) // '=': conversion from 'int32_t' to 'uint8_t', possible loss of data #pragma warning(disable: 4244) #endif #if defined(__GNUC__) #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #endif // Various pre-computed constants. #include "./curve25519_tables.h" #if defined(BORINGSSL_CURVE25519_64BIT) #if defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpedantic" #endif #include "./curve25519_64.h" #else #include "./curve25519_32.h" #endif // BORINGSSL_CURVE25519_64BIT // Low-level intrinsic operations static uint64_t load_3(const uint8_t *in) { uint64_t result; result = (uint64_t)in[0]; result |= ((uint64_t)in[1]) << 8; result |= ((uint64_t)in[2]) << 16; return result; } static uint64_t load_4(const uint8_t *in) { uint64_t result; result = (uint64_t)in[0]; result |= ((uint64_t)in[1]) << 8; result |= ((uint64_t)in[2]) << 16; result |= ((uint64_t)in[3]) << 24; return result; } // Field operations. #if defined(BORINGSSL_CURVE25519_64BIT) // assert_fe asserts that |f| satisfies bounds: // // [[0x0 ~> 0x8cccccccccccc], // [0x0 ~> 0x8cccccccccccc], // [0x0 ~> 0x8cccccccccccc], // [0x0 ~> 0x8cccccccccccc], // [0x0 ~> 0x8cccccccccccc]] // // See comments in curve25519_64.h for which functions use these bounds for // inputs or outputs. #define assert_fe(f) \ do { \ for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \ ASSERT(f[_assert_fe_i] <= UINT64_C(0x8cccccccccccc)); \ } \ } while (0) // assert_fe_loose asserts that |f| satisfies bounds: // // [[0x0 ~> 0x1a666666666664], // [0x0 ~> 0x1a666666666664], // [0x0 ~> 0x1a666666666664], // [0x0 ~> 0x1a666666666664], // [0x0 ~> 0x1a666666666664]] // // See comments in curve25519_64.h for which functions use these bounds for // inputs or outputs. #define assert_fe_loose(f) \ do { \ for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \ ASSERT(f[_assert_fe_i] <= UINT64_C(0x1a666666666664)); \ } \ } while (0) #else // assert_fe asserts that |f| satisfies bounds: // // [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], // [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], // [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], // [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], // [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] // // See comments in curve25519_32.h for which functions use these bounds for // inputs or outputs. #define assert_fe(f) \ do { \ for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ ASSERT(f[_assert_fe_i] <= \ ((_assert_fe_i & 1) ? 0x2333333u : 0x4666666u)); \ } \ } while (0) // assert_fe_loose asserts that |f| satisfies bounds: // // [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], // [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], // [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], // [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], // [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] // // See comments in curve25519_32.h for which functions use these bounds for // inputs or outputs. #define assert_fe_loose(f) \ do { \ for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ ASSERT(f[_assert_fe_i] <= \ ((_assert_fe_i & 1) ? 0x6999999u : 0xd333332u)); \ } \ } while (0) #endif // BORINGSSL_CURVE25519_64BIT OPENSSL_STATIC_ASSERT(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS, "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe"); static void fe_frombytes_strict(fe *h, const uint8_t s[32]) { // |fiat_25519_from_bytes| requires the top-most bit be clear. ASSERT((s[31] & 0x80) == 0); fiat_25519_from_bytes(h->v, s); assert_fe(h->v); } static void fe_frombytes(fe *h, const uint8_t s[32]) { uint8_t s_copy[32]; bytes_copy(s_copy, s, 32); s_copy[31] &= 0x7f; fe_frombytes_strict(h, s_copy); } static void fe_tobytes(uint8_t s[32], const fe *f) { assert_fe(f->v); fiat_25519_to_bytes(s, f->v); } // h = 0 static void fe_0(fe *h) { fe_limbs_zero(h->v); } static void fe_loose_0(fe_loose *h) { fe_limbs_zero(h->v); } // h = 1 static void fe_1(fe *h) { fe_0(h); h->v[0] = 1; } static void fe_loose_1(fe_loose *h) { fe_loose_0(h); h->v[0] = 1; } // h = f + g // Can overlap h with f or g. static void fe_add(fe_loose *h, const fe *f, const fe *g) { assert_fe(f->v); assert_fe(g->v); fiat_25519_add(h->v, f->v, g->v); assert_fe_loose(h->v); } // h = f - g // Can overlap h with f or g. static void fe_sub(fe_loose *h, const fe *f, const fe *g) { assert_fe(f->v); assert_fe(g->v); fiat_25519_sub(h->v, f->v, g->v); assert_fe_loose(h->v); } static void fe_carry(fe *h, const fe_loose* f) { assert_fe_loose(f->v); fiat_25519_carry(h->v, f->v); assert_fe(h->v); } static void fe_mul_impl(fe_limb_t out[FE_NUM_LIMBS], const fe_limb_t in1[FE_NUM_LIMBS], const fe_limb_t in2[FE_NUM_LIMBS]) { assert_fe_loose(in1); assert_fe_loose(in2); fiat_25519_carry_mul(out, in1, in2); assert_fe(out); } static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g) { fe_mul_impl(h->v, f->v, g->v); } // static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) was // removed. This comment is here to make diffs vs. BoringSSL easier to read. static void fe_mul_ttt(fe *h, const fe *f, const fe *g) { fe_mul_impl(h->v, f->v, g->v); } static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g) { fe_mul_impl(h->v, f->v, g->v); } static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g) { fe_mul_impl(h->v, f->v, g->v); } static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g) { fe_mul_impl(h->v, f->v, g->v); } static void fe_sq_tl(fe *h, const fe_loose *f) { assert_fe_loose(f->v); fiat_25519_carry_square(h->v, f->v); assert_fe(h->v); } static void fe_sq_tt(fe *h, const fe *f) { assert_fe_loose(f->v); fiat_25519_carry_square(h->v, f->v); assert_fe(h->v); } // Replace (f,g) with (g,f) if b == 1; // replace (f,g) with (f,g) if b == 0. // // Preconditions: b in {0,1}. static void fe_cswap(fe *f, fe *g, fe_limb_t b) { b = 0-b; for (unsigned i = 0; i < FE_NUM_LIMBS; i++) { fe_limb_t x = f->v[i] ^ g->v[i]; x &= b; f->v[i] ^= x; g->v[i] ^= x; } } static void fe_mul121666(fe *h, const fe_loose *f) { assert_fe_loose(f->v); fiat_25519_carry_scmul_121666(h->v, f->v); assert_fe(h->v); } // h = -f static void fe_neg(fe_loose *h, const fe *f) { assert_fe(f->v); fiat_25519_opp(h->v, f->v); assert_fe_loose(h->v); } // Replace (f,g) with (g,g) if b == 1; // replace (f,g) with (f,g) if b == 0. // // Preconditions: b in {0,1}. static void fe_cmov(fe_loose *f, const fe_loose *g, fe_limb_t b) { // Silence an unused function warning. |fiat_25519_selectznz| isn't quite the // calling convention the rest of this code wants, so implement it by hand. // // TODO(davidben): Switch to fiat's calling convention, or ask fiat to emit a // different one. (void)fiat_25519_selectznz; b = 0-b; for (unsigned i = 0; i < FE_NUM_LIMBS; i++) { fe_limb_t x = f->v[i] ^ g->v[i]; x &= b; f->v[i] ^= x; } } // h = f static void fe_copy(fe *h, const fe *f) { fe_limbs_copy(h->v, f->v); } static void fe_copy_lt(fe_loose *h, const fe *f) { fe_limbs_copy(h->v, f->v); } #if !defined(OPENSSL_SMALL) static void fe_copy_ll(fe_loose *h, const fe_loose *f) { fe_limbs_copy(h->v, f->v); } #endif // !defined(OPENSSL_SMALL) static void fe_loose_invert(fe *out, const fe_loose *z) { fe t0; fe t1; fe t2; fe t3; int i; fe_sq_tl(&t0, z); fe_sq_tt(&t1, &t0); for (i = 1; i < 2; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_tlt(&t1, z, &t1); fe_mul_ttt(&t0, &t0, &t1); fe_sq_tt(&t2, &t0); fe_mul_ttt(&t1, &t1, &t2); fe_sq_tt(&t2, &t1); for (i = 1; i < 5; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t1, &t2, &t1); fe_sq_tt(&t2, &t1); for (i = 1; i < 10; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t2, &t2, &t1); fe_sq_tt(&t3, &t2); for (i = 1; i < 20; ++i) { fe_sq_tt(&t3, &t3); } fe_mul_ttt(&t2, &t3, &t2); fe_sq_tt(&t2, &t2); for (i = 1; i < 10; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t1, &t2, &t1); fe_sq_tt(&t2, &t1); for (i = 1; i < 50; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t2, &t2, &t1); fe_sq_tt(&t3, &t2); for (i = 1; i < 100; ++i) { fe_sq_tt(&t3, &t3); } fe_mul_ttt(&t2, &t3, &t2); fe_sq_tt(&t2, &t2); for (i = 1; i < 50; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t1, &t2, &t1); fe_sq_tt(&t1, &t1); for (i = 1; i < 5; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(out, &t1, &t0); } static void fe_invert(fe *out, const fe *z) { fe_loose l; fe_copy_lt(&l, z); fe_loose_invert(out, &l); } // return 0 if f == 0 // return 1 if f != 0 static int fe_isnonzero(const fe_loose *f) { fe tight; fe_carry(&tight, f); uint8_t s[32]; fe_tobytes(s, &tight); static const uint8_t zero[32] = {0}; return GFp_memcmp(s, zero, sizeof(zero)) != 0; } // return 1 if f is in {1,3,5,...,q-2} // return 0 if f is in {0,2,4,...,q-1} static int fe_isnegative(const fe *f) { uint8_t s[32]; fe_tobytes(s, f); return s[0] & 1; } static void fe_sq2_tt(fe *h, const fe *f) { // h = f^2 fe_sq_tt(h, f); // h = h + h fe_loose tmp; fe_add(&tmp, h, h); fe_carry(h, &tmp); } static void fe_pow22523(fe *out, const fe *z) { fe t0; fe t1; fe t2; int i; fe_sq_tt(&t0, z); fe_sq_tt(&t1, &t0); for (i = 1; i < 2; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t1, z, &t1); fe_mul_ttt(&t0, &t0, &t1); fe_sq_tt(&t0, &t0); fe_mul_ttt(&t0, &t1, &t0); fe_sq_tt(&t1, &t0); for (i = 1; i < 5; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t0, &t1, &t0); fe_sq_tt(&t1, &t0); for (i = 1; i < 10; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t1, &t1, &t0); fe_sq_tt(&t2, &t1); for (i = 1; i < 20; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t1, &t2, &t1); fe_sq_tt(&t1, &t1); for (i = 1; i < 10; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t0, &t1, &t0); fe_sq_tt(&t1, &t0); for (i = 1; i < 50; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t1, &t1, &t0); fe_sq_tt(&t2, &t1); for (i = 1; i < 100; ++i) { fe_sq_tt(&t2, &t2); } fe_mul_ttt(&t1, &t2, &t1); fe_sq_tt(&t1, &t1); for (i = 1; i < 50; ++i) { fe_sq_tt(&t1, &t1); } fe_mul_ttt(&t0, &t1, &t0); fe_sq_tt(&t0, &t0); for (i = 1; i < 2; ++i) { fe_sq_tt(&t0, &t0); } fe_mul_ttt(out, &t0, z); } // Group operations. int GFp_x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t s[32]) { fe u; fe_loose v; fe v3; fe vxx; fe_loose check; fe_frombytes(&h->Y, s); fe_1(&h->Z); fe_sq_tt(&v3, &h->Y); fe_mul_ttt(&vxx, &v3, &d); fe_sub(&v, &v3, &h->Z); // u = y^2-1 fe_carry(&u, &v); fe_add(&v, &vxx, &h->Z); // v = dy^2+1 fe_sq_tl(&v3, &v); fe_mul_ttl(&v3, &v3, &v); // v3 = v^3 fe_sq_tt(&h->X, &v3); fe_mul_ttl(&h->X, &h->X, &v); fe_mul_ttt(&h->X, &h->X, &u); // x = uv^7 fe_pow22523(&h->X, &h->X); // x = (uv^7)^((q-5)/8) fe_mul_ttt(&h->X, &h->X, &v3); fe_mul_ttt(&h->X, &h->X, &u); // x = uv^3(uv^7)^((q-5)/8) fe_sq_tt(&vxx, &h->X); fe_mul_ttl(&vxx, &vxx, &v); fe_sub(&check, &vxx, &u); if (fe_isnonzero(&check)) { fe_add(&check, &vxx, &u); if (fe_isnonzero(&check)) { return 0; } fe_mul_ttt(&h->X, &h->X, &sqrtm1); } if (fe_isnegative(&h->X) != (s[31] >> 7)) { fe_loose t; fe_neg(&t, &h->X); fe_carry(&h->X, &t); } fe_mul_ttt(&h->T, &h->X, &h->Y); return 1; } static void ge_p2_0(ge_p2 *h) { fe_0(&h->X); fe_1(&h->Y); fe_1(&h->Z); } static void ge_p3_0(ge_p3 *h) { fe_0(&h->X); fe_1(&h->Y); fe_1(&h->Z); fe_0(&h->T); } static void ge_precomp_0(ge_precomp *h) { fe_loose_1(&h->yplusx); fe_loose_1(&h->yminusx); fe_loose_0(&h->xy2d); } // r = p static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { fe_copy(&r->X, &p->X); fe_copy(&r->Y, &p->Y); fe_copy(&r->Z, &p->Z); } // r = p static void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { fe_add(&r->YplusX, &p->Y, &p->X); fe_sub(&r->YminusX, &p->Y, &p->X); fe_copy_lt(&r->Z, &p->Z); fe_mul_ltt(&r->T2d, &p->T, &d2); } // r = p static void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { fe_mul_tll(&r->X, &p->X, &p->T); fe_mul_tll(&r->Y, &p->Y, &p->Z); fe_mul_tll(&r->Z, &p->Z, &p->T); } // r = p static void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { fe_mul_tll(&r->X, &p->X, &p->T); fe_mul_tll(&r->Y, &p->Y, &p->Z); fe_mul_tll(&r->Z, &p->Z, &p->T); fe_mul_tll(&r->T, &p->X, &p->Y); } // r = 2 * p static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { fe trX, trZ, trT; fe t0; fe_sq_tt(&trX, &p->X); fe_sq_tt(&trZ, &p->Y); fe_sq2_tt(&trT, &p->Z); fe_add(&r->Y, &p->X, &p->Y); fe_sq_tl(&t0, &r->Y); fe_add(&r->Y, &trZ, &trX); fe_sub(&r->Z, &trZ, &trX); fe_carry(&trZ, &r->Y); fe_sub(&r->X, &t0, &trZ); fe_carry(&trZ, &r->Z); fe_sub(&r->T, &trT, &trZ); } // r = 2 * p static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { ge_p2 q; ge_p3_to_p2(&q, p); ge_p2_dbl(r, &q); } // r = p + q static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { fe trY, trZ, trT; fe_add(&r->X, &p->Y, &p->X); fe_sub(&r->Y, &p->Y, &p->X); fe_mul_tll(&trZ, &r->X, &q->yplusx); fe_mul_tll(&trY, &r->Y, &q->yminusx); fe_mul_tlt(&trT, &q->xy2d, &p->T); fe_add(&r->T, &p->Z, &p->Z); fe_sub(&r->X, &trZ, &trY); fe_add(&r->Y, &trZ, &trY); fe_carry(&trZ, &r->T); fe_add(&r->Z, &trZ, &trT); fe_sub(&r->T, &trZ, &trT); } // r = p - q static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { fe trY, trZ, trT; fe_add(&r->X, &p->Y, &p->X); fe_sub(&r->Y, &p->Y, &p->X); fe_mul_tll(&trZ, &r->X, &q->yminusx); fe_mul_tll(&trY, &r->Y, &q->yplusx); fe_mul_tlt(&trT, &q->xy2d, &p->T); fe_add(&r->T, &p->Z, &p->Z); fe_sub(&r->X, &trZ, &trY); fe_add(&r->Y, &trZ, &trY); fe_carry(&trZ, &r->T); fe_sub(&r->Z, &trZ, &trT); fe_add(&r->T, &trZ, &trT); } // r = p + q static void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { fe trX, trY, trZ, trT; fe_add(&r->X, &p->Y, &p->X); fe_sub(&r->Y, &p->Y, &p->X); fe_mul_tll(&trZ, &r->X, &q->YplusX); fe_mul_tll(&trY, &r->Y, &q->YminusX); fe_mul_tlt(&trT, &q->T2d, &p->T); fe_mul_ttl(&trX, &p->Z, &q->Z); fe_add(&r->T, &trX, &trX); fe_sub(&r->X, &trZ, &trY); fe_add(&r->Y, &trZ, &trY); fe_carry(&trZ, &r->T); fe_add(&r->Z, &trZ, &trT); fe_sub(&r->T, &trZ, &trT); } // r = p - q static void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { fe trX, trY, trZ, trT; fe_add(&r->X, &p->Y, &p->X); fe_sub(&r->Y, &p->Y, &p->X); fe_mul_tll(&trZ, &r->X, &q->YminusX); fe_mul_tll(&trY, &r->Y, &q->YplusX); fe_mul_tlt(&trT, &q->T2d, &p->T); fe_mul_ttl(&trX, &p->Z, &q->Z); fe_add(&r->T, &trX, &trX); fe_sub(&r->X, &trZ, &trY); fe_add(&r->Y, &trZ, &trY); fe_carry(&trZ, &r->T); fe_sub(&r->Z, &trZ, &trT); fe_add(&r->T, &trZ, &trT); } static uint8_t equal(signed char b, signed char c) { uint8_t ub = b; uint8_t uc = c; uint8_t x = ub ^ uc; // 0: yes; 1..255: no uint32_t y = x; // 0: yes; 1..255: no y -= 1; // 4294967295: yes; 0..254: no y >>= 31; // 1: yes; 0: no return y; } static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b) { fe_cmov(&t->yplusx, &u->yplusx, b); fe_cmov(&t->yminusx, &u->yminusx, b); fe_cmov(&t->xy2d, &u->xy2d, b); } #if defined(OPENSSL_SMALL) static void x25519_ge_scalarmult_small_precomp( ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 * 2 * 32]) { // precomp_table is first expanded into matching |ge_precomp| // elements. ge_precomp multiples[15]; unsigned i; for (i = 0; i < 15; i++) { // The precomputed table is assumed to already clear the top bit, so // |fe_frombytes_strict| may be used directly. const uint8_t *bytes = &precomp_table[i*(2 * 32)]; fe x, y; fe_frombytes_strict(&x, bytes); fe_frombytes_strict(&y, bytes + 32); ge_precomp *out = &multiples[i]; fe_add(&out->yplusx, &y, &x); fe_sub(&out->yminusx, &y, &x); fe_mul_ltt(&out->xy2d, &x, &y); fe_mul_llt(&out->xy2d, &out->xy2d, &d2); } // See the comment above |k25519SmallPrecomp| about the structure of the // precomputed elements. This loop does 64 additions and 64 doublings to // calculate the result. ge_p3_0(h); for (i = 63; i < 64; i--) { unsigned j; signed char index = 0; for (j = 0; j < 4; j++) { const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7)); index |= (bit << j); } ge_precomp e; ge_precomp_0(&e); for (j = 1; j < 16; j++) { cmov(&e, &multiples[j-1], equal(index, j)); } ge_cached cached; ge_p1p1 r; x25519_ge_p3_to_cached(&cached, h); x25519_ge_add(&r, h, &cached); x25519_ge_p1p1_to_p3(h, &r); ge_madd(&r, h, &e); x25519_ge_p1p1_to_p3(h, &r); } } void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) { x25519_ge_scalarmult_small_precomp(h, a, k25519SmallPrecomp); } #else static uint8_t negative(signed char b) { uint32_t x = b; x >>= 31; // 1: yes; 0: no return x; } static void table_select(ge_precomp *t, int pos, signed char b) { ge_precomp minust; uint8_t bnegative = negative(b); uint8_t babs = b - ((uint8_t)((-bnegative) & b) << 1); ge_precomp_0(t); cmov(t, &k25519Precomp[pos][0], equal(babs, 1)); cmov(t, &k25519Precomp[pos][1], equal(babs, 2)); cmov(t, &k25519Precomp[pos][2], equal(babs, 3)); cmov(t, &k25519Precomp[pos][3], equal(babs, 4)); cmov(t, &k25519Precomp[pos][4], equal(babs, 5)); cmov(t, &k25519Precomp[pos][5], equal(babs, 6)); cmov(t, &k25519Precomp[pos][6], equal(babs, 7)); cmov(t, &k25519Precomp[pos][7], equal(babs, 8)); fe_copy_ll(&minust.yplusx, &t->yminusx); fe_copy_ll(&minust.yminusx, &t->yplusx); // NOTE: the input table is canonical, but types don't encode it fe tmp; fe_carry(&tmp, &t->xy2d); fe_neg(&minust.xy2d, &tmp); cmov(t, &minust, bnegative); } // h = a * B // where a = a[0]+256*a[1]+...+256^31 a[31] // B is the Ed25519 base point (x,4/5) with x positive. // // Preconditions: // a[31] <= 127 void GFp_x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t *a) { signed char e[64]; signed char carry; ge_p1p1 r; ge_p2 s; ge_precomp t; int i; for (i = 0; i < 32; ++i) { e[2 * i + 0] = (a[i] >> 0) & 15; e[2 * i + 1] = (a[i] >> 4) & 15; } // each e[i] is between 0 and 15 // e[63] is between 0 and 7 carry = 0; for (i = 0; i < 63; ++i) { e[i] += carry; carry = e[i] + 8; carry >>= 4; e[i] -= carry << 4; } e[63] += carry; // each e[i] is between -8 and 8 ge_p3_0(h); for (i = 1; i < 64; i += 2) { table_select(&t, i / 2, e[i]); ge_madd(&r, h, &t); x25519_ge_p1p1_to_p3(h, &r); } ge_p3_dbl(&r, h); x25519_ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); x25519_ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); x25519_ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); x25519_ge_p1p1_to_p3(h, &r); for (i = 0; i < 64; i += 2) { table_select(&t, i / 2, e[i]); ge_madd(&r, h, &t); x25519_ge_p1p1_to_p3(h, &r); } } #endif static void slide(signed char *r, const uint8_t *a) { int i; int b; int k; for (i = 0; i < 256; ++i) { r[i] = 1 & (a[i >> 3] >> (i & 7)); } for (i = 0; i < 256; ++i) { if (r[i]) { for (b = 1; b <= 6 && i + b < 256; ++b) { if (r[i + b]) { if (r[i] + (r[i + b] << b) <= 15) { r[i] += r[i + b] << b; r[i + b] = 0; } else if (r[i] - (r[i + b] << b) >= -15) { r[i] -= r[i + b] << b; for (k = i + b; k < 256; ++k) { if (!r[k]) { r[k] = 1; break; } r[k] = 0; } } else { break; } } } } } } // r = a * A + b * B // where a = a[0]+256*a[1]+...+256^31 a[31]. // and b = b[0]+256*b[1]+...+256^31 b[31]. // B is the Ed25519 base point (x,4/5) with x positive. static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, const ge_p3 *A, const uint8_t *b) { signed char aslide[256]; signed char bslide[256]; ge_cached Ai[8]; // A,3A,5A,7A,9A,11A,13A,15A ge_p1p1 t; ge_p3 u; ge_p3 A2; int i; slide(aslide, a); slide(bslide, b); x25519_ge_p3_to_cached(&Ai[0], A); ge_p3_dbl(&t, A); x25519_ge_p1p1_to_p3(&A2, &t); x25519_ge_add(&t, &A2, &Ai[0]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[1], &u); x25519_ge_add(&t, &A2, &Ai[1]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[2], &u); x25519_ge_add(&t, &A2, &Ai[2]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[3], &u); x25519_ge_add(&t, &A2, &Ai[3]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[4], &u); x25519_ge_add(&t, &A2, &Ai[4]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[5], &u); x25519_ge_add(&t, &A2, &Ai[5]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[6], &u); x25519_ge_add(&t, &A2, &Ai[6]); x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_p3_to_cached(&Ai[7], &u); ge_p2_0(r); for (i = 255; i >= 0; --i) { if (aslide[i] || bslide[i]) { break; } } for (; i >= 0; --i) { ge_p2_dbl(&t, r); if (aslide[i] > 0) { x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]); } else if (aslide[i] < 0) { x25519_ge_p1p1_to_p3(&u, &t); x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); } if (bslide[i] > 0) { x25519_ge_p1p1_to_p3(&u, &t); ge_madd(&t, &u, &Bi[bslide[i] / 2]); } else if (bslide[i] < 0) { x25519_ge_p1p1_to_p3(&u, &t); ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); } x25519_ge_p1p1_to_p2(r, &t); } } // int64_lshift21 returns |a << 21| but is defined when shifting bits into the // sign bit. This works around a language flaw in C. static inline int64_t int64_lshift21(int64_t a) { return (int64_t)((uint64_t)a << 21); } // The set of scalars is \Z/l // where l = 2^252 + 27742317777372353535851937790883648493. // Input: // s[0]+256*s[1]+...+256^63*s[63] = s // // Output: // s[0]+256*s[1]+...+256^31*s[31] = s mod l // where l = 2^252 + 27742317777372353535851937790883648493. // Overwrites s in place. void GFp_x25519_sc_reduce(uint8_t s[64]) { int64_t s0 = 2097151 & load_3(s); int64_t s1 = 2097151 & (load_4(s + 2) >> 5); int64_t s2 = 2097151 & (load_3(s + 5) >> 2); int64_t s3 = 2097151 & (load_4(s + 7) >> 7); int64_t s4 = 2097151 & (load_4(s + 10) >> 4); int64_t s5 = 2097151 & (load_3(s + 13) >> 1); int64_t s6 = 2097151 & (load_4(s + 15) >> 6); int64_t s7 = 2097151 & (load_3(s + 18) >> 3); int64_t s8 = 2097151 & load_3(s + 21); int64_t s9 = 2097151 & (load_4(s + 23) >> 5); int64_t s10 = 2097151 & (load_3(s + 26) >> 2); int64_t s11 = 2097151 & (load_4(s + 28) >> 7); int64_t s12 = 2097151 & (load_4(s + 31) >> 4); int64_t s13 = 2097151 & (load_3(s + 34) >> 1); int64_t s14 = 2097151 & (load_4(s + 36) >> 6); int64_t s15 = 2097151 & (load_3(s + 39) >> 3); int64_t s16 = 2097151 & load_3(s + 42); int64_t s17 = 2097151 & (load_4(s + 44) >> 5); int64_t s18 = 2097151 & (load_3(s + 47) >> 2); int64_t s19 = 2097151 & (load_4(s + 49) >> 7); int64_t s20 = 2097151 & (load_4(s + 52) >> 4); int64_t s21 = 2097151 & (load_3(s + 55) >> 1); int64_t s22 = 2097151 & (load_4(s + 57) >> 6); int64_t s23 = (load_4(s + 60) >> 3); int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; int64_t carry10; int64_t carry11; int64_t carry12; int64_t carry13; int64_t carry14; int64_t carry15; int64_t carry16; s11 += s23 * 666643; s12 += s23 * 470296; s13 += s23 * 654183; s14 -= s23 * 997805; s15 += s23 * 136657; s16 -= s23 * 683901; s23 = 0; s10 += s22 * 666643; s11 += s22 * 470296; s12 += s22 * 654183; s13 -= s22 * 997805; s14 += s22 * 136657; s15 -= s22 * 683901; s22 = 0; s9 += s21 * 666643; s10 += s21 * 470296; s11 += s21 * 654183; s12 -= s21 * 997805; s13 += s21 * 136657; s14 -= s21 * 683901; s21 = 0; s8 += s20 * 666643; s9 += s20 * 470296; s10 += s20 * 654183; s11 -= s20 * 997805; s12 += s20 * 136657; s13 -= s20 * 683901; s20 = 0; s7 += s19 * 666643; s8 += s19 * 470296; s9 += s19 * 654183; s10 -= s19 * 997805; s11 += s19 * 136657; s12 -= s19 * 683901; s19 = 0; s6 += s18 * 666643; s7 += s18 * 470296; s8 += s18 * 654183; s9 -= s18 * 997805; s10 += s18 * 136657; s11 -= s18 * 683901; s18 = 0; carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= int64_lshift21(carry12); carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= int64_lshift21(carry14); carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= int64_lshift21(carry16); carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= int64_lshift21(carry13); carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= int64_lshift21(carry15); s5 += s17 * 666643; s6 += s17 * 470296; s7 += s17 * 654183; s8 -= s17 * 997805; s9 += s17 * 136657; s10 -= s17 * 683901; s17 = 0; s4 += s16 * 666643; s5 += s16 * 470296; s6 += s16 * 654183; s7 -= s16 * 997805; s8 += s16 * 136657; s9 -= s16 * 683901; s16 = 0; s3 += s15 * 666643; s4 += s15 * 470296; s5 += s15 * 654183; s6 -= s15 * 997805; s7 += s15 * 136657; s8 -= s15 * 683901; s15 = 0; s2 += s14 * 666643; s3 += s14 * 470296; s4 += s14 * 654183; s5 -= s14 * 997805; s6 += s14 * 136657; s7 -= s14 * 683901; s14 = 0; s1 += s13 * 666643; s2 += s13 * 470296; s3 += s13 * 654183; s4 -= s13 * 997805; s5 += s13 * 136657; s6 -= s13 * 683901; s13 = 0; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry1 = s1 >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry2 = s2 >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry3 = s3 >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry4 = s4 >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry5 = s5 >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry6 = s6 >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry7 = s7 >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry8 = s8 >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry9 = s9 >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry10 = s10 >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry11 = s11 >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry1 = s1 >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry2 = s2 >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry3 = s3 >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry4 = s4 >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry5 = s5 >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry6 = s6 >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry7 = s7 >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry8 = s8 >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry9 = s9 >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry10 = s10 >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); s[0] = s0 >> 0; s[1] = s0 >> 8; s[2] = (s0 >> 16) | (s1 << 5); s[3] = s1 >> 3; s[4] = s1 >> 11; s[5] = (s1 >> 19) | (s2 << 2); s[6] = s2 >> 6; s[7] = (s2 >> 14) | (s3 << 7); s[8] = s3 >> 1; s[9] = s3 >> 9; s[10] = (s3 >> 17) | (s4 << 4); s[11] = s4 >> 4; s[12] = s4 >> 12; s[13] = (s4 >> 20) | (s5 << 1); s[14] = s5 >> 7; s[15] = (s5 >> 15) | (s6 << 6); s[16] = s6 >> 2; s[17] = s6 >> 10; s[18] = (s6 >> 18) | (s7 << 3); s[19] = s7 >> 5; s[20] = s7 >> 13; s[21] = s8 >> 0; s[22] = s8 >> 8; s[23] = (s8 >> 16) | (s9 << 5); s[24] = s9 >> 3; s[25] = s9 >> 11; s[26] = (s9 >> 19) | (s10 << 2); s[27] = s10 >> 6; s[28] = (s10 >> 14) | (s11 << 7); s[29] = s11 >> 1; s[30] = s11 >> 9; s[31] = s11 >> 17; } // Input: // a[0]+256*a[1]+...+256^31*a[31] = a // b[0]+256*b[1]+...+256^31*b[31] = b // c[0]+256*c[1]+...+256^31*c[31] = c // // Output: // s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l // where l = 2^252 + 27742317777372353535851937790883648493. static void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c) { int64_t a0 = 2097151 & load_3(a); int64_t a1 = 2097151 & (load_4(a + 2) >> 5); int64_t a2 = 2097151 & (load_3(a + 5) >> 2); int64_t a3 = 2097151 & (load_4(a + 7) >> 7); int64_t a4 = 2097151 & (load_4(a + 10) >> 4); int64_t a5 = 2097151 & (load_3(a + 13) >> 1); int64_t a6 = 2097151 & (load_4(a + 15) >> 6); int64_t a7 = 2097151 & (load_3(a + 18) >> 3); int64_t a8 = 2097151 & load_3(a + 21); int64_t a9 = 2097151 & (load_4(a + 23) >> 5); int64_t a10 = 2097151 & (load_3(a + 26) >> 2); int64_t a11 = (load_4(a + 28) >> 7); int64_t b0 = 2097151 & load_3(b); int64_t b1 = 2097151 & (load_4(b + 2) >> 5); int64_t b2 = 2097151 & (load_3(b + 5) >> 2); int64_t b3 = 2097151 & (load_4(b + 7) >> 7); int64_t b4 = 2097151 & (load_4(b + 10) >> 4); int64_t b5 = 2097151 & (load_3(b + 13) >> 1); int64_t b6 = 2097151 & (load_4(b + 15) >> 6); int64_t b7 = 2097151 & (load_3(b + 18) >> 3); int64_t b8 = 2097151 & load_3(b + 21); int64_t b9 = 2097151 & (load_4(b + 23) >> 5); int64_t b10 = 2097151 & (load_3(b + 26) >> 2); int64_t b11 = (load_4(b + 28) >> 7); int64_t c0 = 2097151 & load_3(c); int64_t c1 = 2097151 & (load_4(c + 2) >> 5); int64_t c2 = 2097151 & (load_3(c + 5) >> 2); int64_t c3 = 2097151 & (load_4(c + 7) >> 7); int64_t c4 = 2097151 & (load_4(c + 10) >> 4); int64_t c5 = 2097151 & (load_3(c + 13) >> 1); int64_t c6 = 2097151 & (load_4(c + 15) >> 6); int64_t c7 = 2097151 & (load_3(c + 18) >> 3); int64_t c8 = 2097151 & load_3(c + 21); int64_t c9 = 2097151 & (load_4(c + 23) >> 5); int64_t c10 = 2097151 & (load_3(c + 26) >> 2); int64_t c11 = (load_4(c + 28) >> 7); int64_t s0; int64_t s1; int64_t s2; int64_t s3; int64_t s4; int64_t s5; int64_t s6; int64_t s7; int64_t s8; int64_t s9; int64_t s10; int64_t s11; int64_t s12; int64_t s13; int64_t s14; int64_t s15; int64_t s16; int64_t s17; int64_t s18; int64_t s19; int64_t s20; int64_t s21; int64_t s22; int64_t s23; int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; int64_t carry10; int64_t carry11; int64_t carry12; int64_t carry13; int64_t carry14; int64_t carry15; int64_t carry16; int64_t carry17; int64_t carry18; int64_t carry19; int64_t carry20; int64_t carry21; int64_t carry22; s0 = c0 + a0 * b0; s1 = c1 + a0 * b1 + a1 * b0; s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; s20 = a9 * b11 + a10 * b10 + a11 * b9; s21 = a10 * b11 + a11 * b10; s22 = a11 * b11; s23 = 0; carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= int64_lshift21(carry12); carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= int64_lshift21(carry14); carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= int64_lshift21(carry16); carry18 = (s18 + (1 << 20)) >> 21; s19 += carry18; s18 -= int64_lshift21(carry18); carry20 = (s20 + (1 << 20)) >> 21; s21 += carry20; s20 -= int64_lshift21(carry20); carry22 = (s22 + (1 << 20)) >> 21; s23 += carry22; s22 -= int64_lshift21(carry22); carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= int64_lshift21(carry13); carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= int64_lshift21(carry15); carry17 = (s17 + (1 << 20)) >> 21; s18 += carry17; s17 -= int64_lshift21(carry17); carry19 = (s19 + (1 << 20)) >> 21; s20 += carry19; s19 -= int64_lshift21(carry19); carry21 = (s21 + (1 << 20)) >> 21; s22 += carry21; s21 -= int64_lshift21(carry21); s11 += s23 * 666643; s12 += s23 * 470296; s13 += s23 * 654183; s14 -= s23 * 997805; s15 += s23 * 136657; s16 -= s23 * 683901; s23 = 0; s10 += s22 * 666643; s11 += s22 * 470296; s12 += s22 * 654183; s13 -= s22 * 997805; s14 += s22 * 136657; s15 -= s22 * 683901; s22 = 0; s9 += s21 * 666643; s10 += s21 * 470296; s11 += s21 * 654183; s12 -= s21 * 997805; s13 += s21 * 136657; s14 -= s21 * 683901; s21 = 0; s8 += s20 * 666643; s9 += s20 * 470296; s10 += s20 * 654183; s11 -= s20 * 997805; s12 += s20 * 136657; s13 -= s20 * 683901; s20 = 0; s7 += s19 * 666643; s8 += s19 * 470296; s9 += s19 * 654183; s10 -= s19 * 997805; s11 += s19 * 136657; s12 -= s19 * 683901; s19 = 0; s6 += s18 * 666643; s7 += s18 * 470296; s8 += s18 * 654183; s9 -= s18 * 997805; s10 += s18 * 136657; s11 -= s18 * 683901; s18 = 0; carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry12 = (s12 + (1 << 20)) >> 21; s13 += carry12; s12 -= int64_lshift21(carry12); carry14 = (s14 + (1 << 20)) >> 21; s15 += carry14; s14 -= int64_lshift21(carry14); carry16 = (s16 + (1 << 20)) >> 21; s17 += carry16; s16 -= int64_lshift21(carry16); carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); carry13 = (s13 + (1 << 20)) >> 21; s14 += carry13; s13 -= int64_lshift21(carry13); carry15 = (s15 + (1 << 20)) >> 21; s16 += carry15; s15 -= int64_lshift21(carry15); s5 += s17 * 666643; s6 += s17 * 470296; s7 += s17 * 654183; s8 -= s17 * 997805; s9 += s17 * 136657; s10 -= s17 * 683901; s17 = 0; s4 += s16 * 666643; s5 += s16 * 470296; s6 += s16 * 654183; s7 -= s16 * 997805; s8 += s16 * 136657; s9 -= s16 * 683901; s16 = 0; s3 += s15 * 666643; s4 += s15 * 470296; s5 += s15 * 654183; s6 -= s15 * 997805; s7 += s15 * 136657; s8 -= s15 * 683901; s15 = 0; s2 += s14 * 666643; s3 += s14 * 470296; s4 += s14 * 654183; s5 -= s14 * 997805; s6 += s14 * 136657; s7 -= s14 * 683901; s14 = 0; s1 += s13 * 666643; s2 += s13 * 470296; s3 += s13 * 654183; s4 -= s13 * 997805; s5 += s13 * 136657; s6 -= s13 * 683901; s13 = 0; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = (s0 + (1 << 20)) >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry2 = (s2 + (1 << 20)) >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry4 = (s4 + (1 << 20)) >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry6 = (s6 + (1 << 20)) >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry8 = (s8 + (1 << 20)) >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry10 = (s10 + (1 << 20)) >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry1 = (s1 + (1 << 20)) >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry3 = (s3 + (1 << 20)) >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry5 = (s5 + (1 << 20)) >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry7 = (s7 + (1 << 20)) >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry9 = (s9 + (1 << 20)) >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry11 = (s11 + (1 << 20)) >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry1 = s1 >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry2 = s2 >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry3 = s3 >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry4 = s4 >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry5 = s5 >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry6 = s6 >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry7 = s7 >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry8 = s8 >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry9 = s9 >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry10 = s10 >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); carry11 = s11 >> 21; s12 += carry11; s11 -= int64_lshift21(carry11); s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= int64_lshift21(carry0); carry1 = s1 >> 21; s2 += carry1; s1 -= int64_lshift21(carry1); carry2 = s2 >> 21; s3 += carry2; s2 -= int64_lshift21(carry2); carry3 = s3 >> 21; s4 += carry3; s3 -= int64_lshift21(carry3); carry4 = s4 >> 21; s5 += carry4; s4 -= int64_lshift21(carry4); carry5 = s5 >> 21; s6 += carry5; s5 -= int64_lshift21(carry5); carry6 = s6 >> 21; s7 += carry6; s6 -= int64_lshift21(carry6); carry7 = s7 >> 21; s8 += carry7; s7 -= int64_lshift21(carry7); carry8 = s8 >> 21; s9 += carry8; s8 -= int64_lshift21(carry8); carry9 = s9 >> 21; s10 += carry9; s9 -= int64_lshift21(carry9); carry10 = s10 >> 21; s11 += carry10; s10 -= int64_lshift21(carry10); s[0] = s0 >> 0; s[1] = s0 >> 8; s[2] = (s0 >> 16) | (s1 << 5); s[3] = s1 >> 3; s[4] = s1 >> 11; s[5] = (s1 >> 19) | (s2 << 2); s[6] = s2 >> 6; s[7] = (s2 >> 14) | (s3 << 7); s[8] = s3 >> 1; s[9] = s3 >> 9; s[10] = (s3 >> 17) | (s4 << 4); s[11] = s4 >> 4; s[12] = s4 >> 12; s[13] = (s4 >> 20) | (s5 << 1); s[14] = s5 >> 7; s[15] = (s5 >> 15) | (s6 << 6); s[16] = s6 >> 2; s[17] = s6 >> 10; s[18] = (s6 >> 18) | (s7 << 3); s[19] = s7 >> 5; s[20] = s7 >> 13; s[21] = s8 >> 0; s[22] = s8 >> 8; s[23] = (s8 >> 16) | (s9 << 5); s[24] = s9 >> 3; s[25] = s9 >> 11; s[26] = (s9 >> 19) | (s10 << 2); s[27] = s10 >> 6; s[28] = (s10 >> 14) | (s11 << 7); s[29] = s11 >> 1; s[30] = s11 >> 9; s[31] = s11 >> 17; } void GFp_x25519_scalar_mult_generic_masked(uint8_t out[32], const uint8_t scalar_masked[32], const uint8_t point[32]) { fe x1, x2, z2, x3, z3, tmp0, tmp1; fe_loose x2l, z2l, x3l, tmp0l, tmp1l; uint8_t e[32]; bytes_copy(e, scalar_masked, 32); // The following implementation was transcribed to Coq and proven to // correspond to unary scalar multiplication in affine coordinates given that // x1 != 0 is the x coordinate of some point on the curve. It was also checked // in Coq that doing a ladderstep with x1 = x3 = 0 gives z2' = z3' = 0, and z2 // = z3 = 0 gives z2' = z3' = 0. The statement was quantified over the // underlying field, so it applies to Curve25519 itself and the quadratic // twist of Curve25519. It was not proven in Coq that prime-field arithmetic // correctly simulates extension-field arithmetic on prime-field values. // The decoding of the byte array representation of e was not considered. // Specification of Montgomery curves in affine coordinates: // // Proof that these form a group that is isomorphic to a Weierstrass curve: // // Coq transcription and correctness proof of the loop (where scalarbits=255): // // // preconditions: 0 <= e < 2^255 (not necessarily e < order), fe_invert(0) = 0 fe_frombytes(&x1, point); fe_1(&x2); fe_0(&z2); fe_copy(&x3, &x1); fe_1(&z3); unsigned swap = 0; int pos; for (pos = 254; pos >= 0; --pos) { // loop invariant as of right before the test, for the case where x1 != 0: // pos >= -1; if z2 = 0 then x2 is nonzero; if z3 = 0 then x3 is nonzero // let r := e >> (pos+1) in the following equalities of projective points: // to_xz (r*P) === if swap then (x3, z3) else (x2, z2) // to_xz ((r+1)*P) === if swap then (x2, z2) else (x3, z3) // x1 is the nonzero x coordinate of the nonzero point (r*P-(r+1)*P) unsigned b = 1 & (e[pos / 8] >> (pos & 7)); swap ^= b; fe_cswap(&x2, &x3, swap); fe_cswap(&z2, &z3, swap); swap = b; // Coq transcription of ladderstep formula (called from transcribed loop): // // // x1 != 0 // x1 = 0 fe_sub(&tmp0l, &x3, &z3); fe_sub(&tmp1l, &x2, &z2); fe_add(&x2l, &x2, &z2); fe_add(&z2l, &x3, &z3); fe_mul_tll(&z3, &tmp0l, &x2l); fe_mul_tll(&z2, &z2l, &tmp1l); fe_sq_tl(&tmp0, &tmp1l); fe_sq_tl(&tmp1, &x2l); fe_add(&x3l, &z3, &z2); fe_sub(&z2l, &z3, &z2); fe_mul_ttt(&x2, &tmp1, &tmp0); fe_sub(&tmp1l, &tmp1, &tmp0); fe_sq_tl(&z2, &z2l); fe_mul121666(&z3, &tmp1l); fe_sq_tl(&x3, &x3l); fe_add(&tmp0l, &tmp0, &z3); fe_mul_ttt(&z3, &x1, &z2); fe_mul_tll(&z2, &tmp1l, &tmp0l); } // here pos=-1, so r=e, so to_xz (e*P) === if swap then (x3, z3) else (x2, z2) fe_cswap(&x2, &x3, swap); fe_cswap(&z2, &z3, swap); fe_invert(&z2, &z2); fe_mul_ttt(&x2, &x2, &z2); fe_tobytes(out, &x2); } void GFp_x25519_public_from_private_generic_masked(uint8_t out_public_value[32], const uint8_t private_key_masked[32]) { uint8_t e[32]; bytes_copy(e, private_key_masked, 32); ge_p3 A; GFp_x25519_ge_scalarmult_base(&A, e); // We only need the u-coordinate of the curve25519 point. The map is // u=(y+1)/(1-y). Since y=Y/Z, this gives u=(Z+Y)/(Z-Y). fe_loose zplusy, zminusy; fe zminusy_inv; fe_add(&zplusy, &A.Z, &A.Y); fe_sub(&zminusy, &A.Z, &A.Y); fe_loose_invert(&zminusy_inv, &zminusy); fe_mul_tlt(&zminusy_inv, &zplusy, &zminusy_inv); fe_tobytes(out_public_value, &zminusy_inv); } void GFp_x25519_fe_invert(fe *out, const fe *z) { fe_invert(out, z); } uint8_t GFp_x25519_fe_isnegative(const fe *f) { return (uint8_t)fe_isnegative(f); } void GFp_x25519_fe_mul_ttt(fe *h, const fe *f, const fe *g) { fe_mul_ttt(h, f, g); } void GFp_x25519_fe_neg(fe *f) { fe_loose t; fe_neg(&t, f); fe_carry(f, &t); } void GFp_x25519_fe_tobytes(uint8_t s[32], const fe *h) { fe_tobytes(s, h); } void GFp_x25519_ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, const ge_p3 *A, const uint8_t *b) { ge_double_scalarmult_vartime(r, a, A, b); } void GFp_x25519_sc_mask(uint8_t a[32]) { a[0] &= 248; a[31] &= 127; a[31] |= 64; } void GFp_x25519_sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c) { sc_muladd(s, a, b, c); } ring-0.16.9/third_party/fiat/curve25519_32.h000064400000000000000000001175011352416253600164330ustar0000000000000000/* Autogenerated */ /* curve description: 25519 */ /* requested operations: carry_mul, carry_square, carry_scmul121666, carry, add, sub, opp, selectznz, to_bytes, from_bytes */ /* n = 10 (from "10") */ /* s = 0x8000000000000000000000000000000000000000000000000000000000000000 (from "2^255") */ /* c = [(1, 19)] (from "1,19") */ /* machine_wordsize = 32 (from "32") */ #include typedef unsigned char fiat_25519_uint1; typedef signed char fiat_25519_int1; /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x3ffffff] * arg3: [0x0 ~> 0x3ffffff] * Output Bounds: * out1: [0x0 ~> 0x3ffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_addcarryx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { uint32_t x1 = ((arg1 + arg2) + arg3); uint32_t x2 = (x1 & UINT32_C(0x3ffffff)); fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 26); *out1 = x2; *out2 = x3; } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x3ffffff] * arg3: [0x0 ~> 0x3ffffff] * Output Bounds: * out1: [0x0 ~> 0x3ffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_subborrowx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 26); uint32_t x3 = (x1 & UINT32_C(0x3ffffff)); *out1 = x3; *out2 = (fiat_25519_uint1)(0x0 - x2); } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x1ffffff] * arg3: [0x0 ~> 0x1ffffff] * Output Bounds: * out1: [0x0 ~> 0x1ffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_addcarryx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { uint32_t x1 = ((arg1 + arg2) + arg3); uint32_t x2 = (x1 & UINT32_C(0x1ffffff)); fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 25); *out1 = x2; *out2 = x3; } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x1ffffff] * arg3: [0x0 ~> 0x1ffffff] * Output Bounds: * out1: [0x0 ~> 0x1ffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_subborrowx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 25); uint32_t x3 = (x1 & UINT32_C(0x1ffffff)); *out1 = x3; *out2 = (fiat_25519_uint1)(0x0 - x2); } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0xffffffff] * arg3: [0x0 ~> 0xffffffff] * Output Bounds: * out1: [0x0 ~> 0xffffffff] */ static void fiat_25519_cmovznz_u32(uint32_t* out1, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { fiat_25519_uint1 x1 = (!(!arg1)); uint32_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT32_C(0xffffffff)); // Note this line has been patched from the synthesized code to add value // barriers. // // Clang recognizes this pattern as a select. While it usually transforms it // to a cmov, it sometimes further transforms it into a branch, which we do // not want. uint32_t x3 = ((value_barrier_u32(x2) & arg3) | (value_barrier_u32(~x2) & arg2)); *out1 = x3; } /* * Input Bounds: * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] * arg2: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] * Output Bounds: * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] */ static void fiat_25519_carry_mul(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { uint64_t x1 = ((uint64_t)(arg1[9]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x2 = ((uint64_t)(arg1[9]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x3 = ((uint64_t)(arg1[9]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x4 = ((uint64_t)(arg1[9]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x5 = ((uint64_t)(arg1[9]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x6 = ((uint64_t)(arg1[9]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); uint64_t x7 = ((uint64_t)(arg1[9]) * ((arg2[3]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x8 = ((uint64_t)(arg1[9]) * ((arg2[2]) * (uint32_t)UINT8_C(0x13))); uint64_t x9 = ((uint64_t)(arg1[9]) * ((arg2[1]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x10 = ((uint64_t)(arg1[8]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); uint64_t x11 = ((uint64_t)(arg1[8]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x12 = ((uint64_t)(arg1[8]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); uint64_t x13 = ((uint64_t)(arg1[8]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x14 = ((uint64_t)(arg1[8]) * ((arg2[5]) * (uint32_t)UINT8_C(0x13))); uint64_t x15 = ((uint64_t)(arg1[8]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); uint64_t x16 = ((uint64_t)(arg1[8]) * ((arg2[3]) * (uint32_t)UINT8_C(0x13))); uint64_t x17 = ((uint64_t)(arg1[8]) * ((arg2[2]) * (uint32_t)UINT8_C(0x13))); uint64_t x18 = ((uint64_t)(arg1[7]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x19 = ((uint64_t)(arg1[7]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x20 = ((uint64_t)(arg1[7]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x21 = ((uint64_t)(arg1[7]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x22 = ((uint64_t)(arg1[7]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x23 = ((uint64_t)(arg1[7]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); uint64_t x24 = ((uint64_t)(arg1[7]) * ((arg2[3]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x25 = ((uint64_t)(arg1[6]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); uint64_t x26 = ((uint64_t)(arg1[6]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x27 = ((uint64_t)(arg1[6]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); uint64_t x28 = ((uint64_t)(arg1[6]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x29 = ((uint64_t)(arg1[6]) * ((arg2[5]) * (uint32_t)UINT8_C(0x13))); uint64_t x30 = ((uint64_t)(arg1[6]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); uint64_t x31 = ((uint64_t)(arg1[5]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x32 = ((uint64_t)(arg1[5]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x33 = ((uint64_t)(arg1[5]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x34 = ((uint64_t)(arg1[5]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x35 = ((uint64_t)(arg1[5]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x36 = ((uint64_t)(arg1[4]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); uint64_t x37 = ((uint64_t)(arg1[4]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x38 = ((uint64_t)(arg1[4]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); uint64_t x39 = ((uint64_t)(arg1[4]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); uint64_t x40 = ((uint64_t)(arg1[3]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x41 = ((uint64_t)(arg1[3]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x42 = ((uint64_t)(arg1[3]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x43 = ((uint64_t)(arg1[2]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); uint64_t x44 = ((uint64_t)(arg1[2]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); uint64_t x45 = ((uint64_t)(arg1[1]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); uint64_t x46 = ((uint64_t)(arg1[9]) * (arg2[0])); uint64_t x47 = ((uint64_t)(arg1[8]) * (arg2[1])); uint64_t x48 = ((uint64_t)(arg1[8]) * (arg2[0])); uint64_t x49 = ((uint64_t)(arg1[7]) * (arg2[2])); uint64_t x50 = ((uint64_t)(arg1[7]) * ((arg2[1]) * (uint32_t)0x2)); uint64_t x51 = ((uint64_t)(arg1[7]) * (arg2[0])); uint64_t x52 = ((uint64_t)(arg1[6]) * (arg2[3])); uint64_t x53 = ((uint64_t)(arg1[6]) * (arg2[2])); uint64_t x54 = ((uint64_t)(arg1[6]) * (arg2[1])); uint64_t x55 = ((uint64_t)(arg1[6]) * (arg2[0])); uint64_t x56 = ((uint64_t)(arg1[5]) * (arg2[4])); uint64_t x57 = ((uint64_t)(arg1[5]) * ((arg2[3]) * (uint32_t)0x2)); uint64_t x58 = ((uint64_t)(arg1[5]) * (arg2[2])); uint64_t x59 = ((uint64_t)(arg1[5]) * ((arg2[1]) * (uint32_t)0x2)); uint64_t x60 = ((uint64_t)(arg1[5]) * (arg2[0])); uint64_t x61 = ((uint64_t)(arg1[4]) * (arg2[5])); uint64_t x62 = ((uint64_t)(arg1[4]) * (arg2[4])); uint64_t x63 = ((uint64_t)(arg1[4]) * (arg2[3])); uint64_t x64 = ((uint64_t)(arg1[4]) * (arg2[2])); uint64_t x65 = ((uint64_t)(arg1[4]) * (arg2[1])); uint64_t x66 = ((uint64_t)(arg1[4]) * (arg2[0])); uint64_t x67 = ((uint64_t)(arg1[3]) * (arg2[6])); uint64_t x68 = ((uint64_t)(arg1[3]) * ((arg2[5]) * (uint32_t)0x2)); uint64_t x69 = ((uint64_t)(arg1[3]) * (arg2[4])); uint64_t x70 = ((uint64_t)(arg1[3]) * ((arg2[3]) * (uint32_t)0x2)); uint64_t x71 = ((uint64_t)(arg1[3]) * (arg2[2])); uint64_t x72 = ((uint64_t)(arg1[3]) * ((arg2[1]) * (uint32_t)0x2)); uint64_t x73 = ((uint64_t)(arg1[3]) * (arg2[0])); uint64_t x74 = ((uint64_t)(arg1[2]) * (arg2[7])); uint64_t x75 = ((uint64_t)(arg1[2]) * (arg2[6])); uint64_t x76 = ((uint64_t)(arg1[2]) * (arg2[5])); uint64_t x77 = ((uint64_t)(arg1[2]) * (arg2[4])); uint64_t x78 = ((uint64_t)(arg1[2]) * (arg2[3])); uint64_t x79 = ((uint64_t)(arg1[2]) * (arg2[2])); uint64_t x80 = ((uint64_t)(arg1[2]) * (arg2[1])); uint64_t x81 = ((uint64_t)(arg1[2]) * (arg2[0])); uint64_t x82 = ((uint64_t)(arg1[1]) * (arg2[8])); uint64_t x83 = ((uint64_t)(arg1[1]) * ((arg2[7]) * (uint32_t)0x2)); uint64_t x84 = ((uint64_t)(arg1[1]) * (arg2[6])); uint64_t x85 = ((uint64_t)(arg1[1]) * ((arg2[5]) * (uint32_t)0x2)); uint64_t x86 = ((uint64_t)(arg1[1]) * (arg2[4])); uint64_t x87 = ((uint64_t)(arg1[1]) * ((arg2[3]) * (uint32_t)0x2)); uint64_t x88 = ((uint64_t)(arg1[1]) * (arg2[2])); uint64_t x89 = ((uint64_t)(arg1[1]) * ((arg2[1]) * (uint32_t)0x2)); uint64_t x90 = ((uint64_t)(arg1[1]) * (arg2[0])); uint64_t x91 = ((uint64_t)(arg1[0]) * (arg2[9])); uint64_t x92 = ((uint64_t)(arg1[0]) * (arg2[8])); uint64_t x93 = ((uint64_t)(arg1[0]) * (arg2[7])); uint64_t x94 = ((uint64_t)(arg1[0]) * (arg2[6])); uint64_t x95 = ((uint64_t)(arg1[0]) * (arg2[5])); uint64_t x96 = ((uint64_t)(arg1[0]) * (arg2[4])); uint64_t x97 = ((uint64_t)(arg1[0]) * (arg2[3])); uint64_t x98 = ((uint64_t)(arg1[0]) * (arg2[2])); uint64_t x99 = ((uint64_t)(arg1[0]) * (arg2[1])); uint64_t x100 = ((uint64_t)(arg1[0]) * (arg2[0])); uint64_t x101 = (x100 + (x45 + (x44 + (x42 + (x39 + (x35 + (x30 + (x24 + (x17 + x9))))))))); uint64_t x102 = (x101 >> 26); uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); uint64_t x104 = (x91 + (x82 + (x74 + (x67 + (x61 + (x56 + (x52 + (x49 + (x47 + x46))))))))); uint64_t x105 = (x92 + (x83 + (x75 + (x68 + (x62 + (x57 + (x53 + (x50 + (x48 + x1))))))))); uint64_t x106 = (x93 + (x84 + (x76 + (x69 + (x63 + (x58 + (x54 + (x51 + (x10 + x2))))))))); uint64_t x107 = (x94 + (x85 + (x77 + (x70 + (x64 + (x59 + (x55 + (x18 + (x11 + x3))))))))); uint64_t x108 = (x95 + (x86 + (x78 + (x71 + (x65 + (x60 + (x25 + (x19 + (x12 + x4))))))))); uint64_t x109 = (x96 + (x87 + (x79 + (x72 + (x66 + (x31 + (x26 + (x20 + (x13 + x5))))))))); uint64_t x110 = (x97 + (x88 + (x80 + (x73 + (x36 + (x32 + (x27 + (x21 + (x14 + x6))))))))); uint64_t x111 = (x98 + (x89 + (x81 + (x40 + (x37 + (x33 + (x28 + (x22 + (x15 + x7))))))))); uint64_t x112 = (x99 + (x90 + (x43 + (x41 + (x38 + (x34 + (x29 + (x23 + (x16 + x8))))))))); uint64_t x113 = (x102 + x112); uint64_t x114 = (x113 >> 25); uint32_t x115 = (uint32_t)(x113 & UINT32_C(0x1ffffff)); uint64_t x116 = (x114 + x111); uint64_t x117 = (x116 >> 26); uint32_t x118 = (uint32_t)(x116 & UINT32_C(0x3ffffff)); uint64_t x119 = (x117 + x110); uint64_t x120 = (x119 >> 25); uint32_t x121 = (uint32_t)(x119 & UINT32_C(0x1ffffff)); uint64_t x122 = (x120 + x109); uint64_t x123 = (x122 >> 26); uint32_t x124 = (uint32_t)(x122 & UINT32_C(0x3ffffff)); uint64_t x125 = (x123 + x108); uint64_t x126 = (x125 >> 25); uint32_t x127 = (uint32_t)(x125 & UINT32_C(0x1ffffff)); uint64_t x128 = (x126 + x107); uint64_t x129 = (x128 >> 26); uint32_t x130 = (uint32_t)(x128 & UINT32_C(0x3ffffff)); uint64_t x131 = (x129 + x106); uint64_t x132 = (x131 >> 25); uint32_t x133 = (uint32_t)(x131 & UINT32_C(0x1ffffff)); uint64_t x134 = (x132 + x105); uint64_t x135 = (x134 >> 26); uint32_t x136 = (uint32_t)(x134 & UINT32_C(0x3ffffff)); uint64_t x137 = (x135 + x104); uint64_t x138 = (x137 >> 25); uint32_t x139 = (uint32_t)(x137 & UINT32_C(0x1ffffff)); uint64_t x140 = (x138 * (uint64_t)UINT8_C(0x13)); uint64_t x141 = (x103 + x140); uint32_t x142 = (uint32_t)(x141 >> 26); uint32_t x143 = (uint32_t)(x141 & UINT32_C(0x3ffffff)); uint32_t x144 = (x142 + x115); uint32_t x145 = (x144 >> 25); uint32_t x146 = (x144 & UINT32_C(0x1ffffff)); uint32_t x147 = (x145 + x118); out1[0] = x143; out1[1] = x146; out1[2] = x147; out1[3] = x121; out1[4] = x124; out1[5] = x127; out1[6] = x130; out1[7] = x133; out1[8] = x136; out1[9] = x139; } /* * Input Bounds: * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] * Output Bounds: * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] */ static void fiat_25519_carry_square(uint32_t out1[10], const uint32_t arg1[10]) { uint32_t x1 = ((arg1[9]) * (uint32_t)UINT8_C(0x13)); uint32_t x2 = (x1 * (uint32_t)0x2); uint32_t x3 = ((arg1[9]) * (uint32_t)0x2); uint32_t x4 = ((arg1[8]) * (uint32_t)UINT8_C(0x13)); uint64_t x5 = (x4 * (uint64_t)0x2); uint32_t x6 = ((arg1[8]) * (uint32_t)0x2); uint32_t x7 = ((arg1[7]) * (uint32_t)UINT8_C(0x13)); uint32_t x8 = (x7 * (uint32_t)0x2); uint32_t x9 = ((arg1[7]) * (uint32_t)0x2); uint32_t x10 = ((arg1[6]) * (uint32_t)UINT8_C(0x13)); uint64_t x11 = (x10 * (uint64_t)0x2); uint32_t x12 = ((arg1[6]) * (uint32_t)0x2); uint32_t x13 = ((arg1[5]) * (uint32_t)UINT8_C(0x13)); uint32_t x14 = ((arg1[5]) * (uint32_t)0x2); uint32_t x15 = ((arg1[4]) * (uint32_t)0x2); uint32_t x16 = ((arg1[3]) * (uint32_t)0x2); uint32_t x17 = ((arg1[2]) * (uint32_t)0x2); uint32_t x18 = ((arg1[1]) * (uint32_t)0x2); uint64_t x19 = ((uint64_t)(arg1[9]) * (x1 * (uint32_t)0x2)); uint64_t x20 = ((uint64_t)(arg1[8]) * x2); uint64_t x21 = ((uint64_t)(arg1[8]) * x4); uint64_t x22 = ((arg1[7]) * (x2 * (uint64_t)0x2)); uint64_t x23 = ((arg1[7]) * x5); uint64_t x24 = ((uint64_t)(arg1[7]) * (x7 * (uint32_t)0x2)); uint64_t x25 = ((uint64_t)(arg1[6]) * x2); uint64_t x26 = ((arg1[6]) * x5); uint64_t x27 = ((uint64_t)(arg1[6]) * x8); uint64_t x28 = ((uint64_t)(arg1[6]) * x10); uint64_t x29 = ((arg1[5]) * (x2 * (uint64_t)0x2)); uint64_t x30 = ((arg1[5]) * x5); uint64_t x31 = ((arg1[5]) * (x8 * (uint64_t)0x2)); uint64_t x32 = ((arg1[5]) * x11); uint64_t x33 = ((uint64_t)(arg1[5]) * (x13 * (uint32_t)0x2)); uint64_t x34 = ((uint64_t)(arg1[4]) * x2); uint64_t x35 = ((arg1[4]) * x5); uint64_t x36 = ((uint64_t)(arg1[4]) * x8); uint64_t x37 = ((arg1[4]) * x11); uint64_t x38 = ((uint64_t)(arg1[4]) * x14); uint64_t x39 = ((uint64_t)(arg1[4]) * (arg1[4])); uint64_t x40 = ((arg1[3]) * (x2 * (uint64_t)0x2)); uint64_t x41 = ((arg1[3]) * x5); uint64_t x42 = ((arg1[3]) * (x8 * (uint64_t)0x2)); uint64_t x43 = ((uint64_t)(arg1[3]) * x12); uint64_t x44 = ((uint64_t)(arg1[3]) * (x14 * (uint32_t)0x2)); uint64_t x45 = ((uint64_t)(arg1[3]) * x15); uint64_t x46 = ((uint64_t)(arg1[3]) * ((arg1[3]) * (uint32_t)0x2)); uint64_t x47 = ((uint64_t)(arg1[2]) * x2); uint64_t x48 = ((arg1[2]) * x5); uint64_t x49 = ((uint64_t)(arg1[2]) * x9); uint64_t x50 = ((uint64_t)(arg1[2]) * x12); uint64_t x51 = ((uint64_t)(arg1[2]) * x14); uint64_t x52 = ((uint64_t)(arg1[2]) * x15); uint64_t x53 = ((uint64_t)(arg1[2]) * x16); uint64_t x54 = ((uint64_t)(arg1[2]) * (arg1[2])); uint64_t x55 = ((arg1[1]) * (x2 * (uint64_t)0x2)); uint64_t x56 = ((uint64_t)(arg1[1]) * x6); uint64_t x57 = ((uint64_t)(arg1[1]) * (x9 * (uint32_t)0x2)); uint64_t x58 = ((uint64_t)(arg1[1]) * x12); uint64_t x59 = ((uint64_t)(arg1[1]) * (x14 * (uint32_t)0x2)); uint64_t x60 = ((uint64_t)(arg1[1]) * x15); uint64_t x61 = ((uint64_t)(arg1[1]) * (x16 * (uint32_t)0x2)); uint64_t x62 = ((uint64_t)(arg1[1]) * x17); uint64_t x63 = ((uint64_t)(arg1[1]) * ((arg1[1]) * (uint32_t)0x2)); uint64_t x64 = ((uint64_t)(arg1[0]) * x3); uint64_t x65 = ((uint64_t)(arg1[0]) * x6); uint64_t x66 = ((uint64_t)(arg1[0]) * x9); uint64_t x67 = ((uint64_t)(arg1[0]) * x12); uint64_t x68 = ((uint64_t)(arg1[0]) * x14); uint64_t x69 = ((uint64_t)(arg1[0]) * x15); uint64_t x70 = ((uint64_t)(arg1[0]) * x16); uint64_t x71 = ((uint64_t)(arg1[0]) * x17); uint64_t x72 = ((uint64_t)(arg1[0]) * x18); uint64_t x73 = ((uint64_t)(arg1[0]) * (arg1[0])); uint64_t x74 = (x73 + (x55 + (x48 + (x42 + (x37 + x33))))); uint64_t x75 = (x74 >> 26); uint32_t x76 = (uint32_t)(x74 & UINT32_C(0x3ffffff)); uint64_t x77 = (x64 + (x56 + (x49 + (x43 + x38)))); uint64_t x78 = (x65 + (x57 + (x50 + (x44 + (x39 + x19))))); uint64_t x79 = (x66 + (x58 + (x51 + (x45 + x20)))); uint64_t x80 = (x67 + (x59 + (x52 + (x46 + (x22 + x21))))); uint64_t x81 = (x68 + (x60 + (x53 + (x25 + x23)))); uint64_t x82 = (x69 + (x61 + (x54 + (x29 + (x26 + x24))))); uint64_t x83 = (x70 + (x62 + (x34 + (x30 + x27)))); uint64_t x84 = (x71 + (x63 + (x40 + (x35 + (x31 + x28))))); uint64_t x85 = (x72 + (x47 + (x41 + (x36 + x32)))); uint64_t x86 = (x75 + x85); uint64_t x87 = (x86 >> 25); uint32_t x88 = (uint32_t)(x86 & UINT32_C(0x1ffffff)); uint64_t x89 = (x87 + x84); uint64_t x90 = (x89 >> 26); uint32_t x91 = (uint32_t)(x89 & UINT32_C(0x3ffffff)); uint64_t x92 = (x90 + x83); uint64_t x93 = (x92 >> 25); uint32_t x94 = (uint32_t)(x92 & UINT32_C(0x1ffffff)); uint64_t x95 = (x93 + x82); uint64_t x96 = (x95 >> 26); uint32_t x97 = (uint32_t)(x95 & UINT32_C(0x3ffffff)); uint64_t x98 = (x96 + x81); uint64_t x99 = (x98 >> 25); uint32_t x100 = (uint32_t)(x98 & UINT32_C(0x1ffffff)); uint64_t x101 = (x99 + x80); uint64_t x102 = (x101 >> 26); uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); uint64_t x104 = (x102 + x79); uint64_t x105 = (x104 >> 25); uint32_t x106 = (uint32_t)(x104 & UINT32_C(0x1ffffff)); uint64_t x107 = (x105 + x78); uint64_t x108 = (x107 >> 26); uint32_t x109 = (uint32_t)(x107 & UINT32_C(0x3ffffff)); uint64_t x110 = (x108 + x77); uint64_t x111 = (x110 >> 25); uint32_t x112 = (uint32_t)(x110 & UINT32_C(0x1ffffff)); uint64_t x113 = (x111 * (uint64_t)UINT8_C(0x13)); uint64_t x114 = (x76 + x113); uint32_t x115 = (uint32_t)(x114 >> 26); uint32_t x116 = (uint32_t)(x114 & UINT32_C(0x3ffffff)); uint32_t x117 = (x115 + x88); uint32_t x118 = (x117 >> 25); uint32_t x119 = (x117 & UINT32_C(0x1ffffff)); uint32_t x120 = (x118 + x91); out1[0] = x116; out1[1] = x119; out1[2] = x120; out1[3] = x94; out1[4] = x97; out1[5] = x100; out1[6] = x103; out1[7] = x106; out1[8] = x109; out1[9] = x112; } /* * Input Bounds: * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] * Output Bounds: * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] */ static void fiat_25519_carry_scmul_121666(uint32_t out1[10], const uint32_t arg1[10]) { uint64_t x1 = ((uint64_t)UINT32_C(0x1db42) * (arg1[9])); uint64_t x2 = ((uint64_t)UINT32_C(0x1db42) * (arg1[8])); uint64_t x3 = ((uint64_t)UINT32_C(0x1db42) * (arg1[7])); uint64_t x4 = ((uint64_t)UINT32_C(0x1db42) * (arg1[6])); uint64_t x5 = ((uint64_t)UINT32_C(0x1db42) * (arg1[5])); uint64_t x6 = ((uint64_t)UINT32_C(0x1db42) * (arg1[4])); uint64_t x7 = ((uint64_t)UINT32_C(0x1db42) * (arg1[3])); uint64_t x8 = ((uint64_t)UINT32_C(0x1db42) * (arg1[2])); uint64_t x9 = ((uint64_t)UINT32_C(0x1db42) * (arg1[1])); uint64_t x10 = ((uint64_t)UINT32_C(0x1db42) * (arg1[0])); uint32_t x11 = (uint32_t)(x10 >> 26); uint32_t x12 = (uint32_t)(x10 & UINT32_C(0x3ffffff)); uint64_t x13 = (x11 + x9); uint32_t x14 = (uint32_t)(x13 >> 25); uint32_t x15 = (uint32_t)(x13 & UINT32_C(0x1ffffff)); uint64_t x16 = (x14 + x8); uint32_t x17 = (uint32_t)(x16 >> 26); uint32_t x18 = (uint32_t)(x16 & UINT32_C(0x3ffffff)); uint64_t x19 = (x17 + x7); uint32_t x20 = (uint32_t)(x19 >> 25); uint32_t x21 = (uint32_t)(x19 & UINT32_C(0x1ffffff)); uint64_t x22 = (x20 + x6); uint32_t x23 = (uint32_t)(x22 >> 26); uint32_t x24 = (uint32_t)(x22 & UINT32_C(0x3ffffff)); uint64_t x25 = (x23 + x5); uint32_t x26 = (uint32_t)(x25 >> 25); uint32_t x27 = (uint32_t)(x25 & UINT32_C(0x1ffffff)); uint64_t x28 = (x26 + x4); uint32_t x29 = (uint32_t)(x28 >> 26); uint32_t x30 = (uint32_t)(x28 & UINT32_C(0x3ffffff)); uint64_t x31 = (x29 + x3); uint32_t x32 = (uint32_t)(x31 >> 25); uint32_t x33 = (uint32_t)(x31 & UINT32_C(0x1ffffff)); uint64_t x34 = (x32 + x2); uint32_t x35 = (uint32_t)(x34 >> 26); uint32_t x36 = (uint32_t)(x34 & UINT32_C(0x3ffffff)); uint64_t x37 = (x35 + x1); uint32_t x38 = (uint32_t)(x37 >> 25); uint32_t x39 = (uint32_t)(x37 & UINT32_C(0x1ffffff)); uint32_t x40 = (x38 * (uint32_t)UINT8_C(0x13)); uint32_t x41 = (x12 + x40); uint32_t x42 = (x41 >> 26); uint32_t x43 = (x41 & UINT32_C(0x3ffffff)); uint32_t x44 = (x42 + x15); uint32_t x45 = (x44 >> 25); uint32_t x46 = (x44 & UINT32_C(0x1ffffff)); uint32_t x47 = (x45 + x18); out1[0] = x43; out1[1] = x46; out1[2] = x47; out1[3] = x21; out1[4] = x24; out1[5] = x27; out1[6] = x30; out1[7] = x33; out1[8] = x36; out1[9] = x39; } /* * Input Bounds: * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] * Output Bounds: * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] */ static void fiat_25519_carry(uint32_t out1[10], const uint32_t arg1[10]) { uint32_t x1 = (arg1[0]); uint32_t x2 = ((x1 >> 26) + (arg1[1])); uint32_t x3 = ((x2 >> 25) + (arg1[2])); uint32_t x4 = ((x3 >> 26) + (arg1[3])); uint32_t x5 = ((x4 >> 25) + (arg1[4])); uint32_t x6 = ((x5 >> 26) + (arg1[5])); uint32_t x7 = ((x6 >> 25) + (arg1[6])); uint32_t x8 = ((x7 >> 26) + (arg1[7])); uint32_t x9 = ((x8 >> 25) + (arg1[8])); uint32_t x10 = ((x9 >> 26) + (arg1[9])); uint32_t x11 = ((x1 & UINT32_C(0x3ffffff)) + ((x10 >> 25) * (uint32_t)UINT8_C(0x13))); uint32_t x12 = ((x11 >> 26) + (x2 & UINT32_C(0x1ffffff))); uint32_t x13 = (x11 & UINT32_C(0x3ffffff)); uint32_t x14 = (x12 & UINT32_C(0x1ffffff)); uint32_t x15 = ((x12 >> 25) + (x3 & UINT32_C(0x3ffffff))); uint32_t x16 = (x4 & UINT32_C(0x1ffffff)); uint32_t x17 = (x5 & UINT32_C(0x3ffffff)); uint32_t x18 = (x6 & UINT32_C(0x1ffffff)); uint32_t x19 = (x7 & UINT32_C(0x3ffffff)); uint32_t x20 = (x8 & UINT32_C(0x1ffffff)); uint32_t x21 = (x9 & UINT32_C(0x3ffffff)); uint32_t x22 = (x10 & UINT32_C(0x1ffffff)); out1[0] = x13; out1[1] = x14; out1[2] = x15; out1[3] = x16; out1[4] = x17; out1[5] = x18; out1[6] = x19; out1[7] = x20; out1[8] = x21; out1[9] = x22; } /* * Input Bounds: * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * Output Bounds: * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] */ static void fiat_25519_add(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { uint32_t x1 = ((arg1[0]) + (arg2[0])); uint32_t x2 = ((arg1[1]) + (arg2[1])); uint32_t x3 = ((arg1[2]) + (arg2[2])); uint32_t x4 = ((arg1[3]) + (arg2[3])); uint32_t x5 = ((arg1[4]) + (arg2[4])); uint32_t x6 = ((arg1[5]) + (arg2[5])); uint32_t x7 = ((arg1[6]) + (arg2[6])); uint32_t x8 = ((arg1[7]) + (arg2[7])); uint32_t x9 = ((arg1[8]) + (arg2[8])); uint32_t x10 = ((arg1[9]) + (arg2[9])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; out1[5] = x6; out1[6] = x7; out1[7] = x8; out1[8] = x9; out1[9] = x10; } /* * Input Bounds: * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * Output Bounds: * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] */ static void fiat_25519_sub(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { uint32_t x1 = ((UINT32_C(0x7ffffda) + (arg1[0])) - (arg2[0])); uint32_t x2 = ((UINT32_C(0x3fffffe) + (arg1[1])) - (arg2[1])); uint32_t x3 = ((UINT32_C(0x7fffffe) + (arg1[2])) - (arg2[2])); uint32_t x4 = ((UINT32_C(0x3fffffe) + (arg1[3])) - (arg2[3])); uint32_t x5 = ((UINT32_C(0x7fffffe) + (arg1[4])) - (arg2[4])); uint32_t x6 = ((UINT32_C(0x3fffffe) + (arg1[5])) - (arg2[5])); uint32_t x7 = ((UINT32_C(0x7fffffe) + (arg1[6])) - (arg2[6])); uint32_t x8 = ((UINT32_C(0x3fffffe) + (arg1[7])) - (arg2[7])); uint32_t x9 = ((UINT32_C(0x7fffffe) + (arg1[8])) - (arg2[8])); uint32_t x10 = ((UINT32_C(0x3fffffe) + (arg1[9])) - (arg2[9])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; out1[5] = x6; out1[6] = x7; out1[7] = x8; out1[8] = x9; out1[9] = x10; } /* * Input Bounds: * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * Output Bounds: * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] */ static void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10]) { uint32_t x1 = (UINT32_C(0x7ffffda) - (arg1[0])); uint32_t x2 = (UINT32_C(0x3fffffe) - (arg1[1])); uint32_t x3 = (UINT32_C(0x7fffffe) - (arg1[2])); uint32_t x4 = (UINT32_C(0x3fffffe) - (arg1[3])); uint32_t x5 = (UINT32_C(0x7fffffe) - (arg1[4])); uint32_t x6 = (UINT32_C(0x3fffffe) - (arg1[5])); uint32_t x7 = (UINT32_C(0x7fffffe) - (arg1[6])); uint32_t x8 = (UINT32_C(0x3fffffe) - (arg1[7])); uint32_t x9 = (UINT32_C(0x7fffffe) - (arg1[8])); uint32_t x10 = (UINT32_C(0x3fffffe) - (arg1[9])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; out1[5] = x6; out1[6] = x7; out1[7] = x8; out1[8] = x9; out1[9] = x10; } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] * arg3: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] * Output Bounds: * out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] */ static void fiat_25519_selectznz(uint32_t out1[10], fiat_25519_uint1 arg1, const uint32_t arg2[10], const uint32_t arg3[10]) { uint32_t x1; fiat_25519_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0])); uint32_t x2; fiat_25519_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1])); uint32_t x3; fiat_25519_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2])); uint32_t x4; fiat_25519_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3])); uint32_t x5; fiat_25519_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4])); uint32_t x6; fiat_25519_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5])); uint32_t x7; fiat_25519_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6])); uint32_t x8; fiat_25519_cmovznz_u32(&x8, arg1, (arg2[7]), (arg3[7])); uint32_t x9; fiat_25519_cmovznz_u32(&x9, arg1, (arg2[8]), (arg3[8])); uint32_t x10; fiat_25519_cmovznz_u32(&x10, arg1, (arg2[9]), (arg3[9])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; out1[5] = x6; out1[6] = x7; out1[7] = x8; out1[8] = x9; out1[9] = x10; } /* * Input Bounds: * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] * Output Bounds: * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] */ static void fiat_25519_to_bytes(uint8_t out1[32], const uint32_t arg1[10]) { uint32_t x1; fiat_25519_uint1 x2; fiat_25519_subborrowx_u26(&x1, &x2, 0x0, (arg1[0]), UINT32_C(0x3ffffed)); uint32_t x3; fiat_25519_uint1 x4; fiat_25519_subborrowx_u25(&x3, &x4, x2, (arg1[1]), UINT32_C(0x1ffffff)); uint32_t x5; fiat_25519_uint1 x6; fiat_25519_subborrowx_u26(&x5, &x6, x4, (arg1[2]), UINT32_C(0x3ffffff)); uint32_t x7; fiat_25519_uint1 x8; fiat_25519_subborrowx_u25(&x7, &x8, x6, (arg1[3]), UINT32_C(0x1ffffff)); uint32_t x9; fiat_25519_uint1 x10; fiat_25519_subborrowx_u26(&x9, &x10, x8, (arg1[4]), UINT32_C(0x3ffffff)); uint32_t x11; fiat_25519_uint1 x12; fiat_25519_subborrowx_u25(&x11, &x12, x10, (arg1[5]), UINT32_C(0x1ffffff)); uint32_t x13; fiat_25519_uint1 x14; fiat_25519_subborrowx_u26(&x13, &x14, x12, (arg1[6]), UINT32_C(0x3ffffff)); uint32_t x15; fiat_25519_uint1 x16; fiat_25519_subborrowx_u25(&x15, &x16, x14, (arg1[7]), UINT32_C(0x1ffffff)); uint32_t x17; fiat_25519_uint1 x18; fiat_25519_subborrowx_u26(&x17, &x18, x16, (arg1[8]), UINT32_C(0x3ffffff)); uint32_t x19; fiat_25519_uint1 x20; fiat_25519_subborrowx_u25(&x19, &x20, x18, (arg1[9]), UINT32_C(0x1ffffff)); uint32_t x21; fiat_25519_cmovznz_u32(&x21, x20, 0x0, UINT32_C(0xffffffff)); uint32_t x22; fiat_25519_uint1 x23; fiat_25519_addcarryx_u26(&x22, &x23, 0x0, (x21 & UINT32_C(0x3ffffed)), x1); uint32_t x24; fiat_25519_uint1 x25; fiat_25519_addcarryx_u25(&x24, &x25, x23, (x21 & UINT32_C(0x1ffffff)), x3); uint32_t x26; fiat_25519_uint1 x27; fiat_25519_addcarryx_u26(&x26, &x27, x25, (x21 & UINT32_C(0x3ffffff)), x5); uint32_t x28; fiat_25519_uint1 x29; fiat_25519_addcarryx_u25(&x28, &x29, x27, (x21 & UINT32_C(0x1ffffff)), x7); uint32_t x30; fiat_25519_uint1 x31; fiat_25519_addcarryx_u26(&x30, &x31, x29, (x21 & UINT32_C(0x3ffffff)), x9); uint32_t x32; fiat_25519_uint1 x33; fiat_25519_addcarryx_u25(&x32, &x33, x31, (x21 & UINT32_C(0x1ffffff)), x11); uint32_t x34; fiat_25519_uint1 x35; fiat_25519_addcarryx_u26(&x34, &x35, x33, (x21 & UINT32_C(0x3ffffff)), x13); uint32_t x36; fiat_25519_uint1 x37; fiat_25519_addcarryx_u25(&x36, &x37, x35, (x21 & UINT32_C(0x1ffffff)), x15); uint32_t x38; fiat_25519_uint1 x39; fiat_25519_addcarryx_u26(&x38, &x39, x37, (x21 & UINT32_C(0x3ffffff)), x17); uint32_t x40; fiat_25519_uint1 x41; fiat_25519_addcarryx_u25(&x40, &x41, x39, (x21 & UINT32_C(0x1ffffff)), x19); uint32_t x42 = (x40 << 6); uint32_t x43 = (x38 << 4); uint32_t x44 = (x36 << 3); uint32_t x45 = (x34 * (uint32_t)0x2); uint32_t x46 = (x30 << 6); uint32_t x47 = (x28 << 5); uint32_t x48 = (x26 << 3); uint32_t x49 = (x24 << 2); uint32_t x50 = (x22 >> 8); uint8_t x51 = (uint8_t)(x22 & UINT8_C(0xff)); uint32_t x52 = (x50 >> 8); uint8_t x53 = (uint8_t)(x50 & UINT8_C(0xff)); uint8_t x54 = (uint8_t)(x52 >> 8); uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff)); uint32_t x56 = (x54 + x49); uint32_t x57 = (x56 >> 8); uint8_t x58 = (uint8_t)(x56 & UINT8_C(0xff)); uint32_t x59 = (x57 >> 8); uint8_t x60 = (uint8_t)(x57 & UINT8_C(0xff)); uint8_t x61 = (uint8_t)(x59 >> 8); uint8_t x62 = (uint8_t)(x59 & UINT8_C(0xff)); uint32_t x63 = (x61 + x48); uint32_t x64 = (x63 >> 8); uint8_t x65 = (uint8_t)(x63 & UINT8_C(0xff)); uint32_t x66 = (x64 >> 8); uint8_t x67 = (uint8_t)(x64 & UINT8_C(0xff)); uint8_t x68 = (uint8_t)(x66 >> 8); uint8_t x69 = (uint8_t)(x66 & UINT8_C(0xff)); uint32_t x70 = (x68 + x47); uint32_t x71 = (x70 >> 8); uint8_t x72 = (uint8_t)(x70 & UINT8_C(0xff)); uint32_t x73 = (x71 >> 8); uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff)); uint8_t x75 = (uint8_t)(x73 >> 8); uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff)); uint32_t x77 = (x75 + x46); uint32_t x78 = (x77 >> 8); uint8_t x79 = (uint8_t)(x77 & UINT8_C(0xff)); uint32_t x80 = (x78 >> 8); uint8_t x81 = (uint8_t)(x78 & UINT8_C(0xff)); uint8_t x82 = (uint8_t)(x80 >> 8); uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff)); uint8_t x84 = (uint8_t)(x82 & UINT8_C(0xff)); uint32_t x85 = (x32 >> 8); uint8_t x86 = (uint8_t)(x32 & UINT8_C(0xff)); uint32_t x87 = (x85 >> 8); uint8_t x88 = (uint8_t)(x85 & UINT8_C(0xff)); fiat_25519_uint1 x89 = (fiat_25519_uint1)(x87 >> 8); uint8_t x90 = (uint8_t)(x87 & UINT8_C(0xff)); uint32_t x91 = (x89 + x45); uint32_t x92 = (x91 >> 8); uint8_t x93 = (uint8_t)(x91 & UINT8_C(0xff)); uint32_t x94 = (x92 >> 8); uint8_t x95 = (uint8_t)(x92 & UINT8_C(0xff)); uint8_t x96 = (uint8_t)(x94 >> 8); uint8_t x97 = (uint8_t)(x94 & UINT8_C(0xff)); uint32_t x98 = (x96 + x44); uint32_t x99 = (x98 >> 8); uint8_t x100 = (uint8_t)(x98 & UINT8_C(0xff)); uint32_t x101 = (x99 >> 8); uint8_t x102 = (uint8_t)(x99 & UINT8_C(0xff)); uint8_t x103 = (uint8_t)(x101 >> 8); uint8_t x104 = (uint8_t)(x101 & UINT8_C(0xff)); uint32_t x105 = (x103 + x43); uint32_t x106 = (x105 >> 8); uint8_t x107 = (uint8_t)(x105 & UINT8_C(0xff)); uint32_t x108 = (x106 >> 8); uint8_t x109 = (uint8_t)(x106 & UINT8_C(0xff)); uint8_t x110 = (uint8_t)(x108 >> 8); uint8_t x111 = (uint8_t)(x108 & UINT8_C(0xff)); uint32_t x112 = (x110 + x42); uint32_t x113 = (x112 >> 8); uint8_t x114 = (uint8_t)(x112 & UINT8_C(0xff)); uint32_t x115 = (x113 >> 8); uint8_t x116 = (uint8_t)(x113 & UINT8_C(0xff)); uint8_t x117 = (uint8_t)(x115 >> 8); uint8_t x118 = (uint8_t)(x115 & UINT8_C(0xff)); out1[0] = x51; out1[1] = x53; out1[2] = x55; out1[3] = x58; out1[4] = x60; out1[5] = x62; out1[6] = x65; out1[7] = x67; out1[8] = x69; out1[9] = x72; out1[10] = x74; out1[11] = x76; out1[12] = x79; out1[13] = x81; out1[14] = x83; out1[15] = x84; out1[16] = x86; out1[17] = x88; out1[18] = x90; out1[19] = x93; out1[20] = x95; out1[21] = x97; out1[22] = x100; out1[23] = x102; out1[24] = x104; out1[25] = x107; out1[26] = x109; out1[27] = x111; out1[28] = x114; out1[29] = x116; out1[30] = x118; out1[31] = x117; } /* * Input Bounds: * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] * Output Bounds: * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] */ static void fiat_25519_from_bytes(uint32_t out1[10], const uint8_t arg1[32]) { uint32_t x1 = ((uint32_t)(arg1[31]) << 18); uint32_t x2 = ((uint32_t)(arg1[30]) << 10); uint32_t x3 = ((uint32_t)(arg1[29]) << 2); uint32_t x4 = ((uint32_t)(arg1[28]) << 20); uint32_t x5 = ((uint32_t)(arg1[27]) << 12); uint32_t x6 = ((uint32_t)(arg1[26]) << 4); uint32_t x7 = ((uint32_t)(arg1[25]) << 21); uint32_t x8 = ((uint32_t)(arg1[24]) << 13); uint32_t x9 = ((uint32_t)(arg1[23]) << 5); uint32_t x10 = ((uint32_t)(arg1[22]) << 23); uint32_t x11 = ((uint32_t)(arg1[21]) << 15); uint32_t x12 = ((uint32_t)(arg1[20]) << 7); uint32_t x13 = ((uint32_t)(arg1[19]) << 24); uint32_t x14 = ((uint32_t)(arg1[18]) << 16); uint32_t x15 = ((uint32_t)(arg1[17]) << 8); uint8_t x16 = (arg1[16]); uint32_t x17 = ((uint32_t)(arg1[15]) << 18); uint32_t x18 = ((uint32_t)(arg1[14]) << 10); uint32_t x19 = ((uint32_t)(arg1[13]) << 2); uint32_t x20 = ((uint32_t)(arg1[12]) << 19); uint32_t x21 = ((uint32_t)(arg1[11]) << 11); uint32_t x22 = ((uint32_t)(arg1[10]) << 3); uint32_t x23 = ((uint32_t)(arg1[9]) << 21); uint32_t x24 = ((uint32_t)(arg1[8]) << 13); uint32_t x25 = ((uint32_t)(arg1[7]) << 5); uint32_t x26 = ((uint32_t)(arg1[6]) << 22); uint32_t x27 = ((uint32_t)(arg1[5]) << 14); uint32_t x28 = ((uint32_t)(arg1[4]) << 6); uint32_t x29 = ((uint32_t)(arg1[3]) << 24); uint32_t x30 = ((uint32_t)(arg1[2]) << 16); uint32_t x31 = ((uint32_t)(arg1[1]) << 8); uint8_t x32 = (arg1[0]); uint32_t x33 = (x32 + (x31 + (x30 + x29))); uint8_t x34 = (uint8_t)(x33 >> 26); uint32_t x35 = (x33 & UINT32_C(0x3ffffff)); uint32_t x36 = (x3 + (x2 + x1)); uint32_t x37 = (x6 + (x5 + x4)); uint32_t x38 = (x9 + (x8 + x7)); uint32_t x39 = (x12 + (x11 + x10)); uint32_t x40 = (x16 + (x15 + (x14 + x13))); uint32_t x41 = (x19 + (x18 + x17)); uint32_t x42 = (x22 + (x21 + x20)); uint32_t x43 = (x25 + (x24 + x23)); uint32_t x44 = (x28 + (x27 + x26)); uint32_t x45 = (x34 + x44); uint8_t x46 = (uint8_t)(x45 >> 25); uint32_t x47 = (x45 & UINT32_C(0x1ffffff)); uint32_t x48 = (x46 + x43); uint8_t x49 = (uint8_t)(x48 >> 26); uint32_t x50 = (x48 & UINT32_C(0x3ffffff)); uint32_t x51 = (x49 + x42); uint8_t x52 = (uint8_t)(x51 >> 25); uint32_t x53 = (x51 & UINT32_C(0x1ffffff)); uint32_t x54 = (x52 + x41); uint32_t x55 = (x54 & UINT32_C(0x3ffffff)); uint8_t x56 = (uint8_t)(x40 >> 25); uint32_t x57 = (x40 & UINT32_C(0x1ffffff)); uint32_t x58 = (x56 + x39); uint8_t x59 = (uint8_t)(x58 >> 26); uint32_t x60 = (x58 & UINT32_C(0x3ffffff)); uint32_t x61 = (x59 + x38); uint8_t x62 = (uint8_t)(x61 >> 25); uint32_t x63 = (x61 & UINT32_C(0x1ffffff)); uint32_t x64 = (x62 + x37); uint8_t x65 = (uint8_t)(x64 >> 26); uint32_t x66 = (x64 & UINT32_C(0x3ffffff)); uint32_t x67 = (x65 + x36); out1[0] = x35; out1[1] = x47; out1[2] = x50; out1[3] = x53; out1[4] = x55; out1[5] = x57; out1[6] = x60; out1[7] = x63; out1[8] = x66; out1[9] = x67; } ring-0.16.9/third_party/fiat/curve25519_64.h000064400000000000000000000600531352416253600164370ustar0000000000000000/* Autogenerated */ /* curve description: 25519 */ /* requested operations: carry_mul, carry_square, carry_scmul121666, carry, add, sub, opp, selectznz, to_bytes, from_bytes */ /* n = 5 (from "5") */ /* s = 0x8000000000000000000000000000000000000000000000000000000000000000 (from "2^255") */ /* c = [(1, 19)] (from "1,19") */ /* machine_wordsize = 64 (from "64") */ #include typedef unsigned char fiat_25519_uint1; typedef signed char fiat_25519_int1; typedef signed __int128 fiat_25519_int128; typedef unsigned __int128 fiat_25519_uint128; /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x7ffffffffffff] * arg3: [0x0 ~> 0x7ffffffffffff] * Output Bounds: * out1: [0x0 ~> 0x7ffffffffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_addcarryx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { uint64_t x1 = ((arg1 + arg2) + arg3); uint64_t x2 = (x1 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 51); *out1 = x2; *out2 = x3; } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0x7ffffffffffff] * arg3: [0x0 ~> 0x7ffffffffffff] * Output Bounds: * out1: [0x0 ~> 0x7ffffffffffff] * out2: [0x0 ~> 0x1] */ static void fiat_25519_subborrowx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { int64_t x1 = ((int64_t)(arg2 - (int64_t)arg1) - (int64_t)arg3); fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 51); uint64_t x3 = (x1 & UINT64_C(0x7ffffffffffff)); *out1 = x3; *out2 = (fiat_25519_uint1)(0x0 - x2); } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [0x0 ~> 0xffffffffffffffff] * arg3: [0x0 ~> 0xffffffffffffffff] * Output Bounds: * out1: [0x0 ~> 0xffffffffffffffff] */ static void fiat_25519_cmovznz_u64(uint64_t* out1, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { fiat_25519_uint1 x1 = (!(!arg1)); uint64_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); // Note this line has been patched from the synthesized code to add value // barriers. // // Clang recognizes this pattern as a select. While it usually transforms it // to a cmov, it sometimes further transforms it into a branch, which we do // not want. uint64_t x3 = ((value_barrier_u64(x2) & arg3) | (value_barrier_u64(~x2) & arg2)); *out1 = x3; } /* * Input Bounds: * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] * arg2: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] * Output Bounds: * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] */ static void fiat_25519_carry_mul(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { fiat_25519_uint128 x1 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[4]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x2 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[3]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x3 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[2]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x4 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[1]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x5 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[4]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x6 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[3]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x7 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[2]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x8 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[4]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[3]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[1]) * ((arg2[4]) * (uint64_t)UINT8_C(0x13))); fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[4]) * (arg2[0])); fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[3]) * (arg2[1])); fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[3]) * (arg2[0])); fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg2[2])); fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[2]) * (arg2[1])); fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[2]) * (arg2[0])); fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * (arg2[3])); fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg2[2])); fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[1]) * (arg2[1])); fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[1]) * (arg2[0])); fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * (arg2[4])); fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * (arg2[3])); fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg2[2])); fiat_25519_uint128 x24 = ((fiat_25519_uint128)(arg1[0]) * (arg2[1])); fiat_25519_uint128 x25 = ((fiat_25519_uint128)(arg1[0]) * (arg2[0])); fiat_25519_uint128 x26 = (x25 + (x10 + (x9 + (x7 + x4)))); uint64_t x27 = (uint64_t)(x26 >> 51); uint64_t x28 = (uint64_t)(x26 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x29 = (x21 + (x17 + (x14 + (x12 + x11)))); fiat_25519_uint128 x30 = (x22 + (x18 + (x15 + (x13 + x1)))); fiat_25519_uint128 x31 = (x23 + (x19 + (x16 + (x5 + x2)))); fiat_25519_uint128 x32 = (x24 + (x20 + (x8 + (x6 + x3)))); fiat_25519_uint128 x33 = (x27 + x32); uint64_t x34 = (uint64_t)(x33 >> 51); uint64_t x35 = (uint64_t)(x33 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x36 = (x34 + x31); uint64_t x37 = (uint64_t)(x36 >> 51); uint64_t x38 = (uint64_t)(x36 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x39 = (x37 + x30); uint64_t x40 = (uint64_t)(x39 >> 51); uint64_t x41 = (uint64_t)(x39 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x42 = (x40 + x29); uint64_t x43 = (uint64_t)(x42 >> 51); uint64_t x44 = (uint64_t)(x42 & UINT64_C(0x7ffffffffffff)); uint64_t x45 = (x43 * (uint64_t)UINT8_C(0x13)); uint64_t x46 = (x28 + x45); uint64_t x47 = (x46 >> 51); uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff)); uint64_t x49 = (x47 + x35); uint64_t x50 = (x49 >> 51); uint64_t x51 = (x49 & UINT64_C(0x7ffffffffffff)); uint64_t x52 = (x50 + x38); out1[0] = x48; out1[1] = x51; out1[2] = x52; out1[3] = x41; out1[4] = x44; } /* * Input Bounds: * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] * Output Bounds: * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] */ static void fiat_25519_carry_square(uint64_t out1[5], const uint64_t arg1[5]) { uint64_t x1 = ((arg1[4]) * (uint64_t)UINT8_C(0x13)); uint64_t x2 = (x1 * (uint64_t)0x2); uint64_t x3 = ((arg1[4]) * (uint64_t)0x2); uint64_t x4 = ((arg1[3]) * (uint64_t)UINT8_C(0x13)); uint64_t x5 = (x4 * (uint64_t)0x2); uint64_t x6 = ((arg1[3]) * (uint64_t)0x2); uint64_t x7 = ((arg1[2]) * (uint64_t)0x2); uint64_t x8 = ((arg1[1]) * (uint64_t)0x2); fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[4]) * x1); fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[3]) * x2); fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[3]) * x4); fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[2]) * x2); fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[2]) * x5); fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg1[2])); fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[1]) * x2); fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[1]) * x6); fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * x7); fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg1[1])); fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[0]) * x3); fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[0]) * x6); fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * x7); fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * x8); fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg1[0])); fiat_25519_uint128 x24 = (x23 + (x15 + x13)); uint64_t x25 = (uint64_t)(x24 >> 51); uint64_t x26 = (uint64_t)(x24 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x27 = (x19 + (x16 + x14)); fiat_25519_uint128 x28 = (x20 + (x17 + x9)); fiat_25519_uint128 x29 = (x21 + (x18 + x10)); fiat_25519_uint128 x30 = (x22 + (x12 + x11)); fiat_25519_uint128 x31 = (x25 + x30); uint64_t x32 = (uint64_t)(x31 >> 51); uint64_t x33 = (uint64_t)(x31 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x34 = (x32 + x29); uint64_t x35 = (uint64_t)(x34 >> 51); uint64_t x36 = (uint64_t)(x34 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x37 = (x35 + x28); uint64_t x38 = (uint64_t)(x37 >> 51); uint64_t x39 = (uint64_t)(x37 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x40 = (x38 + x27); uint64_t x41 = (uint64_t)(x40 >> 51); uint64_t x42 = (uint64_t)(x40 & UINT64_C(0x7ffffffffffff)); uint64_t x43 = (x41 * (uint64_t)UINT8_C(0x13)); uint64_t x44 = (x26 + x43); uint64_t x45 = (x44 >> 51); uint64_t x46 = (x44 & UINT64_C(0x7ffffffffffff)); uint64_t x47 = (x45 + x33); uint64_t x48 = (x47 >> 51); uint64_t x49 = (x47 & UINT64_C(0x7ffffffffffff)); uint64_t x50 = (x48 + x36); out1[0] = x46; out1[1] = x49; out1[2] = x50; out1[3] = x39; out1[4] = x42; } /* * Input Bounds: * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] * Output Bounds: * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] */ static void fiat_25519_carry_scmul_121666(uint64_t out1[5], const uint64_t arg1[5]) { fiat_25519_uint128 x1 = (UINT32_C(0x1db42) * (fiat_25519_uint128)(arg1[4])); fiat_25519_uint128 x2 = (UINT32_C(0x1db42) * (fiat_25519_uint128)(arg1[3])); fiat_25519_uint128 x3 = (UINT32_C(0x1db42) * (fiat_25519_uint128)(arg1[2])); fiat_25519_uint128 x4 = (UINT32_C(0x1db42) * (fiat_25519_uint128)(arg1[1])); fiat_25519_uint128 x5 = (UINT32_C(0x1db42) * (fiat_25519_uint128)(arg1[0])); uint64_t x6 = (uint64_t)(x5 >> 51); uint64_t x7 = (uint64_t)(x5 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x8 = (x6 + x4); uint64_t x9 = (uint64_t)(x8 >> 51); uint64_t x10 = (uint64_t)(x8 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x11 = (x9 + x3); uint64_t x12 = (uint64_t)(x11 >> 51); uint64_t x13 = (uint64_t)(x11 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x14 = (x12 + x2); uint64_t x15 = (uint64_t)(x14 >> 51); uint64_t x16 = (uint64_t)(x14 & UINT64_C(0x7ffffffffffff)); fiat_25519_uint128 x17 = (x15 + x1); uint64_t x18 = (uint64_t)(x17 >> 51); uint64_t x19 = (uint64_t)(x17 & UINT64_C(0x7ffffffffffff)); uint64_t x20 = (x18 * (uint64_t)UINT8_C(0x13)); uint64_t x21 = (x7 + x20); uint64_t x22 = (x21 >> 51); uint64_t x23 = (x21 & UINT64_C(0x7ffffffffffff)); uint64_t x24 = (x22 + x10); uint64_t x25 = (x24 >> 51); uint64_t x26 = (x24 & UINT64_C(0x7ffffffffffff)); uint64_t x27 = (x25 + x13); out1[0] = x23; out1[1] = x26; out1[2] = x27; out1[3] = x16; out1[4] = x19; } /* * Input Bounds: * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] * Output Bounds: * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] */ static void fiat_25519_carry(uint64_t out1[5], const uint64_t arg1[5]) { uint64_t x1 = (arg1[0]); uint64_t x2 = ((x1 >> 51) + (arg1[1])); uint64_t x3 = ((x2 >> 51) + (arg1[2])); uint64_t x4 = ((x3 >> 51) + (arg1[3])); uint64_t x5 = ((x4 >> 51) + (arg1[4])); uint64_t x6 = ((x1 & UINT64_C(0x7ffffffffffff)) + ((x5 >> 51) * (uint64_t)UINT8_C(0x13))); uint64_t x7 = ((x6 >> 51) + (x2 & UINT64_C(0x7ffffffffffff))); uint64_t x8 = (x6 & UINT64_C(0x7ffffffffffff)); uint64_t x9 = (x7 & UINT64_C(0x7ffffffffffff)); uint64_t x10 = ((x7 >> 51) + (x3 & UINT64_C(0x7ffffffffffff))); uint64_t x11 = (x4 & UINT64_C(0x7ffffffffffff)); uint64_t x12 = (x5 & UINT64_C(0x7ffffffffffff)); out1[0] = x8; out1[1] = x9; out1[2] = x10; out1[3] = x11; out1[4] = x12; } /* * Input Bounds: * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * Output Bounds: * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] */ static void fiat_25519_add(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { uint64_t x1 = ((arg1[0]) + (arg2[0])); uint64_t x2 = ((arg1[1]) + (arg2[1])); uint64_t x3 = ((arg1[2]) + (arg2[2])); uint64_t x4 = ((arg1[3]) + (arg2[3])); uint64_t x5 = ((arg1[4]) + (arg2[4])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; } /* * Input Bounds: * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * Output Bounds: * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] */ static void fiat_25519_sub(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { uint64_t x1 = ((UINT64_C(0xfffffffffffda) + (arg1[0])) - (arg2[0])); uint64_t x2 = ((UINT64_C(0xffffffffffffe) + (arg1[1])) - (arg2[1])); uint64_t x3 = ((UINT64_C(0xffffffffffffe) + (arg1[2])) - (arg2[2])); uint64_t x4 = ((UINT64_C(0xffffffffffffe) + (arg1[3])) - (arg2[3])); uint64_t x5 = ((UINT64_C(0xffffffffffffe) + (arg1[4])) - (arg2[4])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; } /* * Input Bounds: * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * Output Bounds: * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] */ static void fiat_25519_opp(uint64_t out1[5], const uint64_t arg1[5]) { uint64_t x1 = (UINT64_C(0xfffffffffffda) - (arg1[0])); uint64_t x2 = (UINT64_C(0xffffffffffffe) - (arg1[1])); uint64_t x3 = (UINT64_C(0xffffffffffffe) - (arg1[2])); uint64_t x4 = (UINT64_C(0xffffffffffffe) - (arg1[3])); uint64_t x5 = (UINT64_C(0xffffffffffffe) - (arg1[4])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; } /* * Input Bounds: * arg1: [0x0 ~> 0x1] * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] * Output Bounds: * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ static void fiat_25519_selectznz(uint64_t out1[5], fiat_25519_uint1 arg1, const uint64_t arg2[5], const uint64_t arg3[5]) { uint64_t x1; fiat_25519_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); uint64_t x2; fiat_25519_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); uint64_t x3; fiat_25519_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); uint64_t x4; fiat_25519_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); uint64_t x5; fiat_25519_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); out1[0] = x1; out1[1] = x2; out1[2] = x3; out1[3] = x4; out1[4] = x5; } /* * Input Bounds: * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] * Output Bounds: * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] */ static void fiat_25519_to_bytes(uint8_t out1[32], const uint64_t arg1[5]) { uint64_t x1; fiat_25519_uint1 x2; fiat_25519_subborrowx_u51(&x1, &x2, 0x0, (arg1[0]), UINT64_C(0x7ffffffffffed)); uint64_t x3; fiat_25519_uint1 x4; fiat_25519_subborrowx_u51(&x3, &x4, x2, (arg1[1]), UINT64_C(0x7ffffffffffff)); uint64_t x5; fiat_25519_uint1 x6; fiat_25519_subborrowx_u51(&x5, &x6, x4, (arg1[2]), UINT64_C(0x7ffffffffffff)); uint64_t x7; fiat_25519_uint1 x8; fiat_25519_subborrowx_u51(&x7, &x8, x6, (arg1[3]), UINT64_C(0x7ffffffffffff)); uint64_t x9; fiat_25519_uint1 x10; fiat_25519_subborrowx_u51(&x9, &x10, x8, (arg1[4]), UINT64_C(0x7ffffffffffff)); uint64_t x11; fiat_25519_cmovznz_u64(&x11, x10, 0x0, UINT64_C(0xffffffffffffffff)); uint64_t x12; fiat_25519_uint1 x13; fiat_25519_addcarryx_u51(&x12, &x13, 0x0, (x11 & UINT64_C(0x7ffffffffffed)), x1); uint64_t x14; fiat_25519_uint1 x15; fiat_25519_addcarryx_u51(&x14, &x15, x13, (x11 & UINT64_C(0x7ffffffffffff)), x3); uint64_t x16; fiat_25519_uint1 x17; fiat_25519_addcarryx_u51(&x16, &x17, x15, (x11 & UINT64_C(0x7ffffffffffff)), x5); uint64_t x18; fiat_25519_uint1 x19; fiat_25519_addcarryx_u51(&x18, &x19, x17, (x11 & UINT64_C(0x7ffffffffffff)), x7); uint64_t x20; fiat_25519_uint1 x21; fiat_25519_addcarryx_u51(&x20, &x21, x19, (x11 & UINT64_C(0x7ffffffffffff)), x9); uint64_t x22 = (x20 << 4); uint64_t x23 = (x18 * (uint64_t)0x2); uint64_t x24 = (x16 << 6); uint64_t x25 = (x14 << 3); uint64_t x26 = (x12 >> 8); uint8_t x27 = (uint8_t)(x12 & UINT8_C(0xff)); uint64_t x28 = (x26 >> 8); uint8_t x29 = (uint8_t)(x26 & UINT8_C(0xff)); uint64_t x30 = (x28 >> 8); uint8_t x31 = (uint8_t)(x28 & UINT8_C(0xff)); uint64_t x32 = (x30 >> 8); uint8_t x33 = (uint8_t)(x30 & UINT8_C(0xff)); uint64_t x34 = (x32 >> 8); uint8_t x35 = (uint8_t)(x32 & UINT8_C(0xff)); uint8_t x36 = (uint8_t)(x34 >> 8); uint8_t x37 = (uint8_t)(x34 & UINT8_C(0xff)); uint64_t x38 = (x36 + x25); uint64_t x39 = (x38 >> 8); uint8_t x40 = (uint8_t)(x38 & UINT8_C(0xff)); uint64_t x41 = (x39 >> 8); uint8_t x42 = (uint8_t)(x39 & UINT8_C(0xff)); uint64_t x43 = (x41 >> 8); uint8_t x44 = (uint8_t)(x41 & UINT8_C(0xff)); uint64_t x45 = (x43 >> 8); uint8_t x46 = (uint8_t)(x43 & UINT8_C(0xff)); uint64_t x47 = (x45 >> 8); uint8_t x48 = (uint8_t)(x45 & UINT8_C(0xff)); uint8_t x49 = (uint8_t)(x47 >> 8); uint8_t x50 = (uint8_t)(x47 & UINT8_C(0xff)); uint64_t x51 = (x49 + x24); uint64_t x52 = (x51 >> 8); uint8_t x53 = (uint8_t)(x51 & UINT8_C(0xff)); uint64_t x54 = (x52 >> 8); uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff)); uint64_t x56 = (x54 >> 8); uint8_t x57 = (uint8_t)(x54 & UINT8_C(0xff)); uint64_t x58 = (x56 >> 8); uint8_t x59 = (uint8_t)(x56 & UINT8_C(0xff)); uint64_t x60 = (x58 >> 8); uint8_t x61 = (uint8_t)(x58 & UINT8_C(0xff)); uint64_t x62 = (x60 >> 8); uint8_t x63 = (uint8_t)(x60 & UINT8_C(0xff)); fiat_25519_uint1 x64 = (fiat_25519_uint1)(x62 >> 8); uint8_t x65 = (uint8_t)(x62 & UINT8_C(0xff)); uint64_t x66 = (x64 + x23); uint64_t x67 = (x66 >> 8); uint8_t x68 = (uint8_t)(x66 & UINT8_C(0xff)); uint64_t x69 = (x67 >> 8); uint8_t x70 = (uint8_t)(x67 & UINT8_C(0xff)); uint64_t x71 = (x69 >> 8); uint8_t x72 = (uint8_t)(x69 & UINT8_C(0xff)); uint64_t x73 = (x71 >> 8); uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff)); uint64_t x75 = (x73 >> 8); uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff)); uint8_t x77 = (uint8_t)(x75 >> 8); uint8_t x78 = (uint8_t)(x75 & UINT8_C(0xff)); uint64_t x79 = (x77 + x22); uint64_t x80 = (x79 >> 8); uint8_t x81 = (uint8_t)(x79 & UINT8_C(0xff)); uint64_t x82 = (x80 >> 8); uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff)); uint64_t x84 = (x82 >> 8); uint8_t x85 = (uint8_t)(x82 & UINT8_C(0xff)); uint64_t x86 = (x84 >> 8); uint8_t x87 = (uint8_t)(x84 & UINT8_C(0xff)); uint64_t x88 = (x86 >> 8); uint8_t x89 = (uint8_t)(x86 & UINT8_C(0xff)); uint8_t x90 = (uint8_t)(x88 >> 8); uint8_t x91 = (uint8_t)(x88 & UINT8_C(0xff)); out1[0] = x27; out1[1] = x29; out1[2] = x31; out1[3] = x33; out1[4] = x35; out1[5] = x37; out1[6] = x40; out1[7] = x42; out1[8] = x44; out1[9] = x46; out1[10] = x48; out1[11] = x50; out1[12] = x53; out1[13] = x55; out1[14] = x57; out1[15] = x59; out1[16] = x61; out1[17] = x63; out1[18] = x65; out1[19] = x68; out1[20] = x70; out1[21] = x72; out1[22] = x74; out1[23] = x76; out1[24] = x78; out1[25] = x81; out1[26] = x83; out1[27] = x85; out1[28] = x87; out1[29] = x89; out1[30] = x91; out1[31] = x90; } /* * Input Bounds: * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] * Output Bounds: * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] */ static void fiat_25519_from_bytes(uint64_t out1[5], const uint8_t arg1[32]) { uint64_t x1 = ((uint64_t)(arg1[31]) << 44); uint64_t x2 = ((uint64_t)(arg1[30]) << 36); uint64_t x3 = ((uint64_t)(arg1[29]) << 28); uint64_t x4 = ((uint64_t)(arg1[28]) << 20); uint64_t x5 = ((uint64_t)(arg1[27]) << 12); uint64_t x6 = ((uint64_t)(arg1[26]) << 4); uint64_t x7 = ((uint64_t)(arg1[25]) << 47); uint64_t x8 = ((uint64_t)(arg1[24]) << 39); uint64_t x9 = ((uint64_t)(arg1[23]) << 31); uint64_t x10 = ((uint64_t)(arg1[22]) << 23); uint64_t x11 = ((uint64_t)(arg1[21]) << 15); uint64_t x12 = ((uint64_t)(arg1[20]) << 7); uint64_t x13 = ((uint64_t)(arg1[19]) << 50); uint64_t x14 = ((uint64_t)(arg1[18]) << 42); uint64_t x15 = ((uint64_t)(arg1[17]) << 34); uint64_t x16 = ((uint64_t)(arg1[16]) << 26); uint64_t x17 = ((uint64_t)(arg1[15]) << 18); uint64_t x18 = ((uint64_t)(arg1[14]) << 10); uint64_t x19 = ((uint64_t)(arg1[13]) << 2); uint64_t x20 = ((uint64_t)(arg1[12]) << 45); uint64_t x21 = ((uint64_t)(arg1[11]) << 37); uint64_t x22 = ((uint64_t)(arg1[10]) << 29); uint64_t x23 = ((uint64_t)(arg1[9]) << 21); uint64_t x24 = ((uint64_t)(arg1[8]) << 13); uint64_t x25 = ((uint64_t)(arg1[7]) << 5); uint64_t x26 = ((uint64_t)(arg1[6]) << 48); uint64_t x27 = ((uint64_t)(arg1[5]) << 40); uint64_t x28 = ((uint64_t)(arg1[4]) << 32); uint64_t x29 = ((uint64_t)(arg1[3]) << 24); uint64_t x30 = ((uint64_t)(arg1[2]) << 16); uint64_t x31 = ((uint64_t)(arg1[1]) << 8); uint8_t x32 = (arg1[0]); uint64_t x33 = (x32 + (x31 + (x30 + (x29 + (x28 + (x27 + x26)))))); uint8_t x34 = (uint8_t)(x33 >> 51); uint64_t x35 = (x33 & UINT64_C(0x7ffffffffffff)); uint64_t x36 = (x6 + (x5 + (x4 + (x3 + (x2 + x1))))); uint64_t x37 = (x12 + (x11 + (x10 + (x9 + (x8 + x7))))); uint64_t x38 = (x19 + (x18 + (x17 + (x16 + (x15 + (x14 + x13)))))); uint64_t x39 = (x25 + (x24 + (x23 + (x22 + (x21 + x20))))); uint64_t x40 = (x34 + x39); uint8_t x41 = (uint8_t)(x40 >> 51); uint64_t x42 = (x40 & UINT64_C(0x7ffffffffffff)); uint64_t x43 = (x41 + x38); uint8_t x44 = (uint8_t)(x43 >> 51); uint64_t x45 = (x43 & UINT64_C(0x7ffffffffffff)); uint64_t x46 = (x44 + x37); uint8_t x47 = (uint8_t)(x46 >> 51); uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff)); uint64_t x49 = (x47 + x36); out1[0] = x35; out1[1] = x42; out1[2] = x45; out1[3] = x48; out1[4] = x49; } ring-0.16.9/third_party/fiat/curve25519_tables.h000064400000000000000000010340101352416253600174530ustar0000000000000000// The MIT License (MIT) // // Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // This file is generated from // ./make_curve25519_tables.py > curve25519_tables.h static const fe d = {{ #if defined(BORINGSSL_CURVE25519_64BIT) 929955233495203, 466365720129213, 1662059464998953, 2033849074728123, 1442794654840575 #else 56195235, 13857412, 51736253, 6949390, 114729, 24766616, 60832955, 30306712, 48412415, 21499315 #endif }}; static const fe sqrtm1 = {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1718705420411056, 234908883556509, 2233514472574048, 2117202627021982, 765476049583133 #else 34513072, 25610706, 9377949, 3500415, 12389472, 33281959, 41962654, 31548777, 326685, 11406482 #endif }}; static const fe d2 = {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1859910466990425, 932731440258426, 1072319116312658, 1815898335770999, 633789495995903 #else 45281625, 27714825, 36363642, 13898781, 229458, 15978800, 54557047, 27058993, 29715967, 9444199 #endif }}; #if defined(OPENSSL_SMALL) // This block of code replaces the standard base-point table with a much smaller // one. The standard table is 30,720 bytes while this one is just 960. // // This table contains 15 pairs of group elements, (x, y), where each field // element is serialised with |fe_tobytes|. If |i| is the index of the group // element then consider i+1 as a four-bit number: (i₀, i₁, i₂, i₃) (where i₀ // is the most significant bit). The value of the group element is then: // (i₀×2^192 + i₁×2^128 + i₂×2^64 + i₃)G, where G is the generator. static const uint8_t k25519SmallPrecomp[15 * 2 * 32] = { 0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21, 0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e, 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4, 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62, 0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba, 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd, 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03, 0xa2, 0xfb, 0xcc, 0x61, 0x67, 0x06, 0x70, 0x1a, 0xc4, 0x78, 0x3a, 0xff, 0x32, 0x62, 0xdd, 0x2c, 0xab, 0x50, 0x19, 0x3b, 0xf2, 0x9b, 0x7d, 0xb8, 0xfd, 0x4f, 0x29, 0x9c, 0xa7, 0x91, 0xba, 0x0e, 0x46, 0x5e, 0x51, 0xfe, 0x1d, 0xbf, 0xe5, 0xe5, 0x9b, 0x95, 0x0d, 0x67, 0xf8, 0xd1, 0xb5, 0x5a, 0xa1, 0x93, 0x2c, 0xc3, 0xde, 0x0e, 0x97, 0x85, 0x2d, 0x7f, 0xea, 0xab, 0x3e, 0x47, 0x30, 0x18, 0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2, 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95, 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c, 0x6b, 0xa6, 0xf5, 0x4b, 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90, 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52, 0xe6, 0x99, 0x2c, 0x5f, 0x9a, 0x96, 0x0c, 0x68, 0x29, 0xfd, 0xe2, 0xfb, 0xe6, 0xbc, 0xec, 0x31, 0x08, 0xec, 0xe6, 0xb0, 0x53, 0x60, 0xc3, 0x8c, 0xbe, 0xc1, 0xb3, 0x8a, 0x8f, 0xe4, 0x88, 0x2b, 0x55, 0xe5, 0x64, 0x6e, 0x9b, 0xd0, 0xaf, 0x7b, 0x64, 0x2a, 0x35, 0x25, 0x10, 0x52, 0xc5, 0x9e, 0x58, 0x11, 0x39, 0x36, 0x45, 0x51, 0xb8, 0x39, 0x93, 0xfc, 0x9d, 0x6a, 0xbe, 0x58, 0xcb, 0xa4, 0x0f, 0x51, 0x3c, 0x38, 0x05, 0xca, 0xab, 0x43, 0x63, 0x0e, 0xf3, 0x8b, 0x41, 0xa6, 0xf8, 0x9b, 0x53, 0x70, 0x80, 0x53, 0x86, 0x5e, 0x8f, 0xe3, 0xc3, 0x0d, 0x18, 0xc8, 0x4b, 0x34, 0x1f, 0xd8, 0x1d, 0xbc, 0xf2, 0x6d, 0x34, 0x3a, 0xbe, 0xdf, 0xd9, 0xf6, 0xf3, 0x89, 0xa1, 0xe1, 0x94, 0x9f, 0x5d, 0x4c, 0x5d, 0xe9, 0xa1, 0x49, 0x92, 0xef, 0x0e, 0x53, 0x81, 0x89, 0x58, 0x87, 0xa6, 0x37, 0xf1, 0xdd, 0x62, 0x60, 0x63, 0x5a, 0x9d, 0x1b, 0x8c, 0xc6, 0x7d, 0x52, 0xea, 0x70, 0x09, 0x6a, 0xe1, 0x32, 0xf3, 0x73, 0x21, 0x1f, 0x07, 0x7b, 0x7c, 0x9b, 0x49, 0xd8, 0xc0, 0xf3, 0x25, 0x72, 0x6f, 0x9d, 0xed, 0x31, 0x67, 0x36, 0x36, 0x54, 0x40, 0x92, 0x71, 0xe6, 0x11, 0x28, 0x11, 0xad, 0x93, 0x32, 0x85, 0x7b, 0x3e, 0xb7, 0x3b, 0x49, 0x13, 0x1c, 0x07, 0xb0, 0x2e, 0x93, 0xaa, 0xfd, 0xfd, 0x28, 0x47, 0x3d, 0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb, 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c, 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b, 0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63, 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a, 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61, 0x38, 0x68, 0xb0, 0x07, 0xa3, 0xfc, 0xcc, 0x85, 0x10, 0x7f, 0x4c, 0x65, 0x65, 0xb3, 0xfa, 0xfa, 0xa5, 0x53, 0x6f, 0xdb, 0x74, 0x4c, 0x56, 0x46, 0x03, 0xe2, 0xd5, 0x7a, 0x29, 0x1c, 0xc6, 0x02, 0xbc, 0x59, 0xf2, 0x04, 0x75, 0x63, 0xc0, 0x84, 0x2f, 0x60, 0x1c, 0x67, 0x76, 0xfd, 0x63, 0x86, 0xf3, 0xfa, 0xbf, 0xdc, 0xd2, 0x2d, 0x90, 0x91, 0xbd, 0x33, 0xa9, 0xe5, 0x66, 0x0c, 0xda, 0x42, 0x27, 0xca, 0xf4, 0x66, 0xc2, 0xec, 0x92, 0x14, 0x57, 0x06, 0x63, 0xd0, 0x4d, 0x15, 0x06, 0xeb, 0x69, 0x58, 0x4f, 0x77, 0xc5, 0x8b, 0xc7, 0xf0, 0x8e, 0xed, 0x64, 0xa0, 0xb3, 0x3c, 0x66, 0x71, 0xc6, 0x2d, 0xda, 0x0a, 0x0d, 0xfe, 0x70, 0x27, 0x64, 0xf8, 0x27, 0xfa, 0xf6, 0x5f, 0x30, 0xa5, 0x0d, 0x6c, 0xda, 0xf2, 0x62, 0x5e, 0x78, 0x47, 0xd3, 0x66, 0x00, 0x1c, 0xfd, 0x56, 0x1f, 0x5d, 0x3f, 0x6f, 0xf4, 0x4c, 0xd8, 0xfd, 0x0e, 0x27, 0xc9, 0x5c, 0x2b, 0xbc, 0xc0, 0xa4, 0xe7, 0x23, 0x29, 0x02, 0x9f, 0x31, 0xd6, 0xe9, 0xd7, 0x96, 0xf4, 0xe0, 0x5e, 0x0b, 0x0e, 0x13, 0xee, 0x3c, 0x09, 0xed, 0xf2, 0x3d, 0x76, 0x91, 0xc3, 0xa4, 0x97, 0xae, 0xd4, 0x87, 0xd0, 0x5d, 0xf6, 0x18, 0x47, 0x1f, 0x1d, 0x67, 0xf2, 0xcf, 0x63, 0xa0, 0x91, 0x27, 0xf8, 0x93, 0x45, 0x75, 0x23, 0x3f, 0xd1, 0xf1, 0xad, 0x23, 0xdd, 0x64, 0x93, 0x96, 0x41, 0x70, 0x7f, 0xf7, 0xf5, 0xa9, 0x89, 0xa2, 0x34, 0xb0, 0x8d, 0x1b, 0xae, 0x19, 0x15, 0x49, 0x58, 0x23, 0x6d, 0x87, 0x15, 0x4f, 0x81, 0x76, 0xfb, 0x23, 0xb5, 0xea, 0xcf, 0xac, 0x54, 0x8d, 0x4e, 0x42, 0x2f, 0xeb, 0x0f, 0x63, 0xdb, 0x68, 0x37, 0xa8, 0xcf, 0x8b, 0xab, 0xf5, 0xa4, 0x6e, 0x96, 0x2a, 0xb2, 0xd6, 0xbe, 0x9e, 0xbd, 0x0d, 0xb4, 0x42, 0xa9, 0xcf, 0x01, 0x83, 0x8a, 0x17, 0x47, 0x76, 0xc4, 0xc6, 0x83, 0x04, 0x95, 0x0b, 0xfc, 0x11, 0xc9, 0x62, 0xb8, 0x0c, 0x76, 0x84, 0xd9, 0xb9, 0x37, 0xfa, 0xfc, 0x7c, 0xc2, 0x6d, 0x58, 0x3e, 0xb3, 0x04, 0xbb, 0x8c, 0x8f, 0x48, 0xbc, 0x91, 0x27, 0xcc, 0xf9, 0xb7, 0x22, 0x19, 0x83, 0x2e, 0x09, 0xb5, 0x72, 0xd9, 0x54, 0x1c, 0x4d, 0xa1, 0xea, 0x0b, 0xf1, 0xc6, 0x08, 0x72, 0x46, 0x87, 0x7a, 0x6e, 0x80, 0x56, 0x0a, 0x8a, 0xc0, 0xdd, 0x11, 0x6b, 0xd6, 0xdd, 0x47, 0xdf, 0x10, 0xd9, 0xd8, 0xea, 0x7c, 0xb0, 0x8f, 0x03, 0x00, 0x2e, 0xc1, 0x8f, 0x44, 0xa8, 0xd3, 0x30, 0x06, 0x89, 0xa2, 0xf9, 0x34, 0xad, 0xdc, 0x03, 0x85, 0xed, 0x51, 0xa7, 0x82, 0x9c, 0xe7, 0x5d, 0x52, 0x93, 0x0c, 0x32, 0x9a, 0x5b, 0xe1, 0xaa, 0xca, 0xb8, 0x02, 0x6d, 0x3a, 0xd4, 0xb1, 0x3a, 0xf0, 0x5f, 0xbe, 0xb5, 0x0d, 0x10, 0x6b, 0x38, 0x32, 0xac, 0x76, 0x80, 0xbd, 0xca, 0x94, 0x71, 0x7a, 0xf2, 0xc9, 0x35, 0x2a, 0xde, 0x9f, 0x42, 0x49, 0x18, 0x01, 0xab, 0xbc, 0xef, 0x7c, 0x64, 0x3f, 0x58, 0x3d, 0x92, 0x59, 0xdb, 0x13, 0xdb, 0x58, 0x6e, 0x0a, 0xe0, 0xb7, 0x91, 0x4a, 0x08, 0x20, 0xd6, 0x2e, 0x3c, 0x45, 0xc9, 0x8b, 0x17, 0x79, 0xe7, 0xc7, 0x90, 0x99, 0x3a, 0x18, 0x25, }; #else // k25519Precomp[i][j] = (j+1)*256^i*B static const ge_precomp k25519Precomp[32][8] = { { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563 #else 25967493, 19198397, 29566455, 3660896, 54414519, 4014786, 27544626, 21800161, 61029707, 2047604 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585 #else 54563134, 934261, 64385954, 3049989, 66381436, 9406985, 12720692, 5043384, 19500929, 18085054 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142 #else 58370664, 4489569, 9688441, 18769238, 10184608, 21191052, 29287918, 11864899, 42594502, 29115885 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1380971894829527, 790832306631236, 2067202295274102, 1995808275510000, 1566530869037010 #else 54292951, 20578084, 45527620, 11784319, 41753206, 30803714, 55390960, 29739860, 66750418, 23343128 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 463307831301544, 432984605774163, 1610641361907204, 750899048855000, 1894842303421586 #else 45405608, 6903824, 27185491, 6451973, 37531140, 24000426, 51492312, 11189267, 40279186, 28235350 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 748439484463711, 1033211726465151, 1396005112841647, 1611506220286469, 1972177495910992 #else 26966623, 11152617, 32442495, 15396054, 14353839, 20802097, 63980037, 24013313, 51636816, 29387734 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911 #else 15636272, 23865875, 24204772, 25642034, 616976, 16869170, 27787599, 18782243, 28944399, 32004408 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597 #else 16568933, 4717097, 55552716, 32452109, 15682895, 21747389, 16354576, 21778470, 7689661, 11199574 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707 #else 30464137, 27578307, 55329429, 17883566, 23220364, 15915852, 7512774, 10017326, 49359771, 23634074 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 934282339813791, 1846903124198670, 1172395437954843, 1007037127761661, 1830588347719256 #else 50071967, 13921891, 10945806, 27521001, 27105051, 17470053, 38182653, 15006022, 3284568, 27277892 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1694390458783935, 1735906047636159, 705069562067493, 648033061693059, 696214010414170 #else 23599295, 25248385, 55915199, 25867015, 13236773, 10506355, 7464579, 9656445, 13059162, 10374397 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1121406372216585, 192876649532226, 190294192191717, 1994165897297032, 2245000007398739 #else 7798537, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, 29715387, 66467155, 33453106 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016 #else 10861363, 11473154, 27284546, 1981175, 37044515, 12577860, 32867885, 14515107, 51670560, 10819379 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893 #else 4708026, 6336745, 20377586, 9066809, 55836755, 6594695, 41455196, 12483687, 54440373, 5581305 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339 #else 19563141, 16186464, 37722007, 4097518, 10237984, 29206317, 28542349, 13850243, 43430843, 17738489 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1388594989461809, 316767091099457, 394298842192982, 1230079486801005, 1440737038838979 #else 51736881, 20691677, 32573249, 4720197, 40672342, 5875510, 47920237, 18329612, 57289923, 21468654 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 7380825640100, 146210432690483, 304903576448906, 1198869323871120, 997689833219095 #else 58559652, 109982, 15149363, 2178705, 22900618, 4543417, 3044240, 17864545, 1762327, 14866737 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1181317918772081, 114573476638901, 262805072233344, 265712217171332, 294181933805782 #else 48909169, 17603008, 56635573, 1707277, 49922944, 3916100, 38872452, 3959420, 27914454, 4383652 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985 #else 5153727, 9909285, 1723747, 30776558, 30523604, 5516873, 19480852, 5230134, 43156425, 18378665 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113 #else 36839857, 30090922, 7665485, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601 #else 28881826, 14381568, 9657904, 3680757, 46927229, 7843315, 35708204, 1370707, 29794553, 32145132 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2068619540119183, 1966274918058806, 957728544705549, 729906502578991, 159834893065166 #else 14499471, 30824833, 33917750, 29299779, 28494861, 14271267, 30290735, 10876454, 33954766, 2381725 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2073601412052185, 31021124762708, 264500969797082, 248034690651703, 1030252227928288 #else 59913433, 30899068, 52378708, 462250, 39384538, 3941371, 60872247, 3696004, 34808032, 15351954 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 551790716293402, 1989538725166328, 801169423371717, 2052451893578887, 678432056995012 #else 27431194, 8222322, 16448760, 29646437, 48401861, 11938354, 34147463, 30583916, 29551812, 10109425 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1368953770187805, 790347636712921, 437508475667162, 2142576377050580, 1932081720066286 #else 53451805, 20399000, 35825113, 11777097, 21447386, 6519384, 64730580, 31926875, 10092782, 28790261 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 953638594433374, 1092333936795051, 1419774766716690, 805677984380077, 859228993502513 #else 27939166, 14210322, 4677035, 16277044, 44144402, 21156292, 34600109, 12005537, 49298737, 12803509 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1200766035879111, 20142053207432, 1465634435977050, 1645256912097844, 295121984874596 #else 17228999, 17892808, 65875336, 300139, 65883994, 21839654, 30364212, 24516238, 18016356, 4397660 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1735718747031557, 1248237894295956, 1204753118328107, 976066523550493, 65943769534592 #else 56150021, 25864224, 4776340, 18600194, 27850027, 17952220, 40489757, 14544524, 49631360, 982638 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1060098822528990, 1586825862073490, 212301317240126, 1975302711403555, 666724059764335 #else 29253598, 15796703, 64244882, 23645547, 10057022, 3163536, 7332899, 29434304, 46061167, 9934962 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1091990273418756, 1572899409348578, 80968014455247, 306009358661350, 1520450739132526 #else 5793284, 16271923, 42977250, 23438027, 29188559, 1206517, 52360934, 4559894, 36984942, 22656481 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1480517209436112, 1511153322193952, 1244343858991172, 304788150493241, 369136856496443 #else 39464912, 22061425, 16282656, 22517939, 28414020, 18542168, 24191033, 4541697, 53770555, 5500567 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2151330273626164, 762045184746182, 1688074332551515, 823046109005759, 907602769079491 #else 12650548, 32057319, 9052870, 11355358, 49428827, 25154267, 49678271, 12264342, 10874051, 13524335 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2047386910586836, 168470092900250, 1552838872594810, 340951180073789, 360819374702533 #else 25556948, 30508442, 714650, 2510400, 23394682, 23139102, 33119037, 5080568, 44580805, 5376627 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1982622644432056, 2014393600336956, 128909208804214, 1617792623929191, 105294281913815 #else 41020600, 29543379, 50095164, 30016803, 60382070, 1920896, 44787559, 24106988, 4535767, 1569007 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 980234343912898, 1712256739246056, 588935272190264, 204298813091998, 841798321043288 #else 64853442, 14606629, 45416424, 25514613, 28430648, 8775819, 36614302, 3044289, 31848280, 12543772 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 197561292938973, 454817274782871, 1963754960082318, 2113372252160468, 971377527342673 #else 45080285, 2943892, 35251351, 6777305, 13784462, 29262229, 39731668, 31491700, 7718481, 14474653 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 164699448829328, 3127451757672, 1199504971548753, 1766155447043652, 1899238924683527 #else 2385296, 2454213, 44477544, 46602, 62670929, 17874016, 656964, 26317767, 24316167, 28300865 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 732262946680281, 1674412764227063, 2182456405662809, 1350894754474250, 558458873295247 #else 13741529, 10911568, 33875447, 24950694, 46931033, 32521134, 33040650, 20129900, 46379407, 8321685 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2103305098582922, 1960809151316468, 715134605001343, 1454892949167181, 40827143824949 #else 21060490, 31341688, 15712756, 29218333, 1639039, 10656336, 23845965, 21679594, 57124405, 608371 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1239289043050212, 1744654158124578, 758702410031698, 1796762995074688, 1603056663766 #else 53436132, 18466845, 56219170, 25997372, 61071954, 11305546, 1123968, 26773855, 27229398, 23887 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2232056027107988, 987343914584615, 2115594492994461, 1819598072792159, 1119305654014850 #else 43864724, 33260226, 55364135, 14712570, 37643165, 31524814, 12797023, 27114124, 65475458, 16678953 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 320153677847348, 939613871605645, 641883205761567, 1930009789398224, 329165806634126 #else 37608244, 4770661, 51054477, 14001337, 7830047, 9564805, 65600720, 28759386, 49939598, 4904952 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 980930490474130, 1242488692177893, 1251446316964684, 1086618677993530, 1961430968465772 #else 24059538, 14617003, 19037157, 18514524, 19766092, 18648003, 5169210, 16191880, 2128236, 29227599 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 276821765317453, 1536835591188030, 1305212741412361, 61473904210175, 2051377036983058 #else 50127693, 4124965, 58568254, 22900634, 30336521, 19449185, 37302527, 916032, 60226322, 30567899 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 833449923882501, 1750270368490475, 1123347002068295, 185477424765687, 278090826653186 #else 44477957, 12419371, 59974635, 26081060, 50629959, 16739174, 285431, 2763829, 15736322, 4143876 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 794524995833413, 1849907304548286, 53348672473145, 1272368559505217, 1147304168324779 #else 2379333, 11839345, 62998462, 27565766, 11274297, 794957, 212801, 18959769, 23527083, 17096164 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1504846112759364, 1203096289004681, 562139421471418, 274333017451844, 1284344053775441 #else 33431108, 22423954, 49269897, 17927531, 8909498, 8376530, 34483524, 4087880, 51919953, 19138217 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 483048732424432, 2116063063343382, 30120189902313, 292451576741007, 1156379271702225 #else 1767664, 7197987, 53903638, 31531796, 54017513, 448825, 5799055, 4357868, 62334673, 17231393 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 928372153029038, 2147692869914564, 1455665844462196, 1986737809425946, 185207050258089 #else 6721966, 13833823, 43585476, 32003117, 26354292, 21691111, 23365146, 29604700, 7390889, 2759800 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 137732961814206, 706670923917341, 1387038086865771, 1965643813686352, 1384777115696347 #else 4409022, 2052381, 23373853, 10530217, 7676779, 20668478, 21302352, 29290375, 1244379, 20634787 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 481144981981577, 2053319313589856, 2065402289827512, 617954271490316, 1106602634668125 #else 62687625, 7169618, 4982368, 30596842, 30256824, 30776892, 14086412, 9208236, 15886429, 16489664 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 696298019648792, 893299659040895, 1148636718636009, 26734077349617, 2203955659340681 #else 1996056, 10375649, 14346367, 13311202, 60234729, 17116020, 53415665, 398368, 36502409, 32841498 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 657390353372855, 998499966885562, 991893336905797, 810470207106761, 343139804608786 #else 41801399, 9795879, 64331450, 14878808, 33577029, 14780362, 13348553, 12076947, 36272402, 5113181 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 791736669492960, 934767652997115, 824656780392914, 1759463253018643, 361530362383518 #else 49338080, 11797795, 31950843, 13929123, 41220562, 12288343, 36767763, 26218045, 13847710, 5387222 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2022541353055597, 2094700262587466, 1551008075025686, 242785517418164, 695985404963562 #else 48526701, 30138214, 17824842, 31213466, 22744342, 23111821, 8763060, 3617786, 47508202, 10370990 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1287487199965223, 2215311941380308, 1552928390931986, 1664859529680196, 1125004975265243 #else 20246567, 19185054, 22358228, 33010720, 18507282, 23140436, 14554436, 24808340, 32232923, 16763880 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 677434665154918, 989582503122485, 1817429540898386, 1052904935475344, 1143826298169798 #else 9648486, 10094563, 26416693, 14745928, 36734546, 27081810, 11094160, 15689506, 3140038, 17044340 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 367266328308408, 318431188922404, 695629353755355, 634085657580832, 24581612564426 #else 50948792, 5472694, 31895588, 4744994, 8823515, 10365685, 39884064, 9448612, 38334410, 366294 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 773360688841258, 1815381330538070, 363773437667376, 539629987070205, 783280434248437 #else 19153450, 11523972, 56012374, 27051289, 42461232, 5420646, 28344573, 8041113, 719605, 11671788 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 180820816194166, 168937968377394, 748416242794470, 1227281252254508, 1567587861004268 #else 8678006, 2694440, 60300850, 2517371, 4964326, 11152271, 51675948, 18287915, 27000812, 23358879 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 478775558583645, 2062896624554807, 699391259285399, 358099408427873, 1277310261461761 #else 51950941, 7134311, 8639287, 30739555, 59873175, 10421741, 564065, 5336097, 6750977, 19033406 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1984740906540026, 1079164179400229, 1056021349262661, 1659958556483663, 1088529069025527 #else 11836410, 29574944, 26297893, 16080799, 23455045, 15735944, 1695823, 24735310, 8169719, 16220347 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 580736401511151, 1842931091388998, 1177201471228238, 2075460256527244, 1301133425678027 #else 48993007, 8653646, 17578566, 27461813, 59083086, 17541668, 55964556, 30926767, 61118155, 19388398 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1515728832059182, 1575261009617579, 1510246567196186, 191078022609704, 116661716289141 #else 43800366, 22586119, 15213227, 23473218, 36255258, 22504427, 27884328, 2847284, 2655861, 1738395 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1295295738269652, 1714742313707026, 545583042462581, 2034411676262552, 1513248090013606 #else 39571412, 19301410, 41772562, 25551651, 57738101, 8129820, 21651608, 30315096, 48021414, 22549153 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 230710545179830, 30821514358353, 760704303452229, 390668103790604, 573437871383156 #else 1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1169380107545646, 263167233745614, 2022901299054448, 819900753251120, 2023898464874585 #else 32173102, 17425121, 24896206, 3921497, 22579056, 30143578, 19270448, 12217473, 17789017, 30158437 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2102254323485823, 1570832666216754, 34696906544624, 1993213739807337, 70638552271463 #else 36555903, 31326030, 51530034, 23407230, 13243888, 517024, 15479401, 29701199, 30460519, 1052596 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 894132856735058, 548675863558441, 845349339503395, 1942269668326667, 1615682209874691 #else 55493970, 13323617, 32618793, 8175907, 51878691, 12596686, 27491595, 28942073, 3179267, 24075541 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1287670217537834, 1222355136884920, 1846481788678694, 1150426571265110, 1613523400722047 #else 31947050, 19187781, 62468280, 18214510, 51982886, 27514722, 52352086, 17142691, 19072639, 24043372 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 793388516527298, 1315457083650035, 1972286999342417, 1901825953052455, 338269477222410 #else 11685058, 11822410, 3158003, 19601838, 33402193, 29389366, 5977895, 28339415, 473098, 5040608 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 550201530671806, 778605267108140, 2063911101902983, 115500557286349, 2041641272971022 #else 46817982, 8198641, 39698732, 11602122, 1290375, 30754672, 28326861, 1721092, 47550222, 30422825 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 717255318455100, 519313764361315, 2080406977303708, 541981206705521, 774328150311600 #else 7881532, 10687937, 7578723, 7738378, 48157852, 31000479, 21820785, 8076149, 39240368, 11538388 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 261715221532238, 1795354330069993, 1496878026850283, 499739720521052, 389031152673770 #else 47173198, 3899860, 18283497, 26752864, 51380203, 22305220, 8754524, 7446702, 61432810, 5797015 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1997217696294013, 1717306351628065, 1684313917746180, 1644426076011410, 1857378133465451 #else 55813245, 29760862, 51326753, 25589858, 12708868, 25098233, 2014098, 24503858, 64739691, 27677090 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1475434724792648, 76931896285979, 1116729029771667, 2002544139318042, 725547833803938 #else 44636488, 21985690, 39426843, 1146374, 18956691, 16640559, 1192730, 29840233, 15123618, 10811505 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2022306639183567, 726296063571875, 315345054448644, 1058733329149221, 1448201136060677 #else 14352079, 30134717, 48166819, 10822654, 32750596, 4699007, 67038501, 15776355, 38222085, 21579878 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1710065158525665, 1895094923036397, 123988286168546, 1145519900776355, 1607510767693874 #else 38867681, 25481956, 62129901, 28239114, 29416930, 1847569, 46454691, 17069576, 4714546, 23953777 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 561605375422540, 1071733543815037, 131496498800990, 1946868434569999, 828138133964203 #else 15200332, 8368572, 19679101, 15970074, 35236190, 1959450, 24611599, 29010600, 55362987, 12340219 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1548495173745801, 442310529226540, 998072547000384, 553054358385281, 644824326376171 #else 12876937, 23074376, 33134380, 6590940, 60801088, 14872439, 9613953, 8241152, 15370987, 9608631 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1445526537029440, 2225519789662536, 914628859347385, 1064754194555068, 1660295614401091 #else 62965568, 21540023, 8446280, 33162829, 4407737, 13629032, 59383996, 15866073, 38898243, 24740332 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1199690223111956, 24028135822341, 66638289244341, 57626156285975, 565093967979607 #else 26660628, 17876777, 8393733, 358047, 59707573, 992987, 43204631, 858696, 20571223, 8420556 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 876926774220824, 554618976488214, 1012056309841565, 839961821554611, 1414499340307677 #else 14620696, 13067227, 51661590, 8264466, 14106269, 15080814, 33531827, 12516406, 45534429, 21077682 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 703047626104145, 1266841406201770, 165556500219173, 486991595001879, 1011325891650656 #else 236881, 10476226, 57258, 18877408, 6472997, 2466984, 17258519, 7256740, 8791136, 15069930 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1622861044480487, 1156394801573634, 1869132565415504, 327103985777730, 2095342781472284 #else 1276391, 24182514, 22949634, 17231625, 43615824, 27852245, 14711874, 4874229, 36445724, 31223040 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 334886927423922, 489511099221528, 129160865966726, 1720809113143481, 619700195649254 #else 5855666, 4990204, 53397016, 7294283, 59304582, 1924646, 65685689, 25642053, 34039526, 9234252 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1646545795166119, 1758370782583567, 714746174550637, 1472693650165135, 898994790308209 #else 20590503, 24535444, 31529743, 26201766, 64402029, 10650547, 31559055, 21944845, 18979185, 13396066 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 333403773039279, 295772542452938, 1693106465353610, 912330357530760, 471235657950362 #else 24474287, 4968103, 22267082, 4407354, 24063882, 25229252, 48291976, 13594781, 33514650, 7021958 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1811196219982022, 1068969825533602, 289602974833439, 1988956043611592, 863562343398367 #else 55541958, 26988926, 45743778, 15928891, 40950559, 4315420, 41160136, 29637754, 45628383, 12868081 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 906282429780072, 2108672665779781, 432396390473936, 150625823801893, 1708930497638539 #else 38473832, 13504660, 19988037, 31421671, 21078224, 6443208, 45662757, 2244499, 54653067, 25465048 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 925664675702328, 21416848568684, 1831436641861340, 601157008940113, 371818055044496 #else 36513336, 13793478, 61256044, 319135, 41385692, 27290532, 33086545, 8957937, 51875216, 5540520 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1479786007267725, 1738881859066675, 68646196476567, 2146507056100328, 1247662817535471 #else 55478669, 22050529, 58989363, 25911358, 2620055, 1022908, 43398120, 31985447, 50980335, 18591624 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 52035296774456, 939969390708103, 312023458773250, 59873523517659, 1231345905848899 #else 23152952, 775386, 27395463, 14006635, 57407746, 4649511, 1689819, 892185, 55595587, 18348483 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 643355106415761, 290186807495774, 2013561737429023, 319648069511546, 393736678496162 #else 9770129, 9586738, 26496094, 4324120, 1556511, 30004408, 27453818, 4763127, 47929250, 5867133 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 129358342392716, 1932811617704777, 1176749390799681, 398040349861790, 1170779668090425 #else 34343820, 1927589, 31726409, 28801137, 23962433, 17534932, 27846558, 5931263, 37359161, 17445976 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2051980782668029, 121859921510665, 2048329875753063, 1235229850149665, 519062146124755 #else 27461885, 30576896, 22380809, 1815854, 44075111, 30522493, 7283489, 18406359, 47582163, 7734628 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1608170971973096, 415809060360428, 1350468408164766, 2038620059057678, 1026904485989112 #else 59098600, 23963614, 55988460, 6196037, 29344158, 20123547, 7585294, 30377806, 18549496, 15302069 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1837656083115103, 1510134048812070, 906263674192061, 1821064197805734, 565375124676301 #else 34450527, 27383209, 59436070, 22502750, 6258877, 13504381, 10458790, 27135971, 58236621, 8424745 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 578027192365650, 2034800251375322, 2128954087207123, 478816193810521, 2196171989962750 #else 24687186, 8613276, 36441818, 30320886, 1863891, 31723888, 19206233, 7134917, 55824382, 32725512 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1633188840273139, 852787172373708, 1548762607215796, 1266275218902681, 1107218203325133 #else 11334899, 24336410, 8025292, 12707519, 17523892, 23078361, 10243737, 18868971, 62042829, 16498836 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 462189358480054, 1784816734159228, 1611334301651368, 1303938263943540, 707589560319424 #else 8911542, 6887158, 57524604, 26595841, 11145640, 24010752, 17303924, 19430194, 6536640, 10543906 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1038829280972848, 38176604650029, 753193246598573, 1136076426528122, 595709990562434 #else 38162480, 15479762, 49642029, 568875, 65611181, 11223453, 64439674, 16928857, 39873154, 8876770 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1408451820859834, 2194984964010833, 2198361797561729, 1061962440055713, 1645147963442934 #else 41365946, 20987567, 51458897, 32707824, 34082177, 32758143, 33627041, 15824473, 66504438, 24514614 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 4701053362120, 1647641066302348, 1047553002242085, 1923635013395977, 206970314902065 #else 10330056, 70051, 7957388, 24551765, 9764901, 15609756, 27698697, 28664395, 1657393, 3084098 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1750479161778571, 1362553355169293, 1891721260220598, 966109370862782, 1024913988299801 #else 10477963, 26084172, 12119565, 20303627, 29016246, 28188843, 31280318, 14396151, 36875289, 15272408 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 212699049131723, 1117950018299775, 1873945661751056, 1403802921984058, 130896082652698 #else 54820555, 3169462, 28813183, 16658753, 25116432, 27923966, 41934906, 20918293, 42094106, 1950503 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 636808533673210, 1262201711667560, 390951380330599, 1663420692697294, 561951321757406 #else 40928506, 9489186, 11053416, 18808271, 36055143, 5825629, 58724558, 24786899, 15341278, 8373727 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 520731594438141, 1446301499955692, 273753264629267, 1565101517999256, 1019411827004672 #else 28685821, 7759505, 52730348, 21551571, 35137043, 4079241, 298136, 23321830, 64230656, 15190419 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 926527492029409, 1191853477411379, 734233225181171, 184038887541270, 1790426146325343 #else 34175969, 13806335, 52771379, 17760000, 43104243, 10940927, 8669718, 2742393, 41075551, 26679428 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1464651961852572, 1483737295721717, 1519450561335517, 1161429831763785, 405914998179977 #else 65528476, 21825014, 41129205, 22109408, 49696989, 22641577, 9291593, 17306653, 54954121, 6048604 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 996126634382301, 796204125879525, 127517800546509, 344155944689303, 615279846169038 #else 36803549, 14843443, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 738724080975276, 2188666632415296, 1961313708559162, 1506545807547587, 1151301638969740 #else 40828332, 11007846, 19408960, 32613674, 48515898, 29225851, 62020803, 22449281, 20470156, 17155731 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 622917337413835, 1218989177089035, 1284857712846592, 970502061709359, 351025208117090 #else 43972811, 9282191, 14855179, 18164354, 59746048, 19145871, 44324911, 14461607, 14042978, 5230683 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2067814584765580, 1677855129927492, 2086109782475197, 235286517313238, 1416314046739645 #else 29969548, 30812838, 50396996, 25001989, 9175485, 31085458, 21556950, 3506042, 61174973, 21104723 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 586844262630358, 307444381952195, 458399356043426, 602068024507062, 1028548203415243 #else 63964118, 8744660, 19704003, 4581278, 46678178, 6830682, 45824694, 8971512, 38569675, 15326562 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 678489922928203, 2016657584724032, 90977383049628, 1026831907234582, 615271492942522 #else 47644235, 10110287, 49846336, 30050539, 43608476, 1355668, 51585814, 15300987, 46594746, 9168259 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 301225714012278, 1094837270268560, 1202288391010439, 644352775178361, 1647055902137983 #else 61755510, 4488612, 43305616, 16314346, 7780487, 17915493, 38160505, 9601604, 33087103, 24543045 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1210746697896478, 1416608304244708, 686487477217856, 1245131191434135, 1051238336855737 #else 47665694, 18041531, 46311396, 21109108, 37284416, 10229460, 39664535, 18553900, 61111993, 15664671 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1135604073198207, 1683322080485474, 769147804376683, 2086688130589414, 900445683120379 #else 23294591, 16921819, 44458082, 25083453, 27844203, 11461195, 13099750, 31094076, 18151675, 13417686 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1971518477615628, 401909519527336, 448627091057375, 1409486868273821, 1214789035034363 #else 42385932, 29377914, 35958184, 5988918, 40250079, 6685064, 1661597, 21002991, 15271675, 18101767 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1364039144731711, 1897497433586190, 2203097701135459, 145461396811251, 1349844460790699 #else 11433023, 20325767, 8239630, 28274915, 65123427, 32828713, 48410099, 2167543, 60187563, 20114249 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1045230323257973, 818206601145807, 630513189076103, 1672046528998132, 807204017562437 #else 35672693, 15575145, 30436815, 12192228, 44645511, 9395378, 57191156, 24915434, 12215109, 12028277 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 439961968385997, 386362664488986, 1382706320807688, 309894000125359, 2207801346498567 #else 14098381, 6555944, 23007258, 5757252, 51681032, 20603929, 30123439, 4617780, 50208775, 32898803 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1229004686397588, 920643968530863, 123975893911178, 681423993215777, 1400559197080973 #else 63082644, 18313596, 11893167, 13718664, 52299402, 1847384, 51288865, 10154008, 23973261, 20869958 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2003766096898049, 170074059235165, 1141124258967971, 1485419893480973, 1573762821028725 #else 40577025, 29858441, 65199965, 2534300, 35238307, 17004076, 18341389, 22134481, 32013173, 23450893 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 729905708611432, 1270323270673202, 123353058984288, 426460209632942, 2195574535456672 #else 41629544, 10876442, 55337778, 18929291, 54739296, 1838103, 21911214, 6354752, 4425632, 32716610 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1271140255321235, 2044363183174497, 52125387634689, 1445120246694705, 942541986339084 #else 56675475, 18941465, 22229857, 30463385, 53917697, 776728, 49693489, 21533969, 4725004, 14044970 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1761608437466135, 583360847526804, 1586706389685493, 2157056599579261, 1170692369685772 #else 19268631, 26250011, 1555348, 8692754, 45634805, 23643767, 6347389, 32142648, 47586572, 17444675 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 871476219910823, 1878769545097794, 2241832391238412, 548957640601001, 690047440233174 #else 42244775, 12986007, 56209986, 27995847, 55796492, 33405905, 19541417, 8180106, 9282262, 10282508 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 297194732135507, 1366347803776820, 1301185512245601, 561849853336294, 1533554921345731 #else 40903763, 4428546, 58447668, 20360168, 4098401, 19389175, 15522534, 8372215, 5542595, 22851749 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 999628998628371, 1132836708493400, 2084741674517453, 469343353015612, 678782988708035 #else 56546323, 14895632, 26814552, 16880582, 49628109, 31065071, 64326972, 6993760, 49014979, 10114654 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2189427607417022, 699801937082607, 412764402319267, 1478091893643349, 2244675696854460 #else 47001790, 32625013, 31422703, 10427861, 59998115, 6150668, 38017109, 22025285, 25953724, 33448274 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1712292055966563, 204413590624874, 1405738637332841, 408981300829763, 861082219276721 #else 62874467, 25515139, 57989738, 3045999, 2101609, 20947138, 19390019, 6094296, 63793585, 12831124 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 508561155940631, 966928475686665, 2236717801150132, 424543858577297, 2089272956986143 #else 51110167, 7578151, 5310217, 14408357, 33560244, 33329692, 31575953, 6326196, 7381791, 31132593 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 221245220129925, 1156020201681217, 491145634799213, 542422431960839, 828100817819207 #else 46206085, 3296810, 24736065, 17226043, 18374253, 7318640, 6295303, 8082724, 51746375, 12339663 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 153756971240384, 1299874139923977, 393099165260502, 1058234455773022, 996989038681183 #else 27724736, 2291157, 6088201, 19369634, 1792726, 5857634, 13848414, 15768922, 25091167, 14856294 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 559086812798481, 573177704212711, 1629737083816402, 1399819713462595, 1646954378266038 #else 48242193, 8331042, 24373479, 8541013, 66406866, 24284974, 12927299, 20858939, 44926390, 24541532 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1887963056288059, 228507035730124, 1468368348640282, 930557653420194, 613513962454686 #else 55685435, 28132841, 11632844, 3405020, 30536730, 21880393, 39848098, 13866389, 30146206, 9142070 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1224529808187553, 1577022856702685, 2206946542980843, 625883007765001, 279930793512158 #else 3924129, 18246916, 53291741, 23499471, 12291819, 32886066, 39406089, 9326383, 58871006, 4171293 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1076287717051609, 1114455570543035, 187297059715481, 250446884292121, 1885187512550540 #else 51186905, 16037936, 6713787, 16606682, 45496729, 2790943, 26396185, 3731949, 345228, 28091483 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 902497362940219, 76749815795675, 1657927525633846, 1420238379745202, 1340321636548352 #else 45781307, 13448258, 25284571, 1143661, 20614966, 24705045, 2031538, 21163201, 50855680, 19972348 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1129576631190784, 1281994010027327, 996844254743018, 257876363489249, 1150850742055018 #else 31016192, 16832003, 26371391, 19103199, 62081514, 14854136, 17477601, 3842657, 28012650, 17149012 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 628740660038789, 1943038498527841, 467786347793886, 1093341428303375, 235413859513003 #else 62033029, 9368965, 58546785, 28953529, 51858910, 6970559, 57918991, 16292056, 58241707, 3507939 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 237425418909360, 469614029179605, 1512389769174935, 1241726368345357, 441602891065214 #else 29439664, 3537914, 23333589, 6997794, 49553303, 22536363, 51899661, 18503164, 57943934, 6580395 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1736417953058555, 726531315520508, 1833335034432527, 1629442561574747, 624418919286085 #else 54923003, 25874643, 16438268, 10826160, 58412047, 27318820, 17860443, 24280586, 65013061, 9304566 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1960754663920689, 497040957888962, 1909832851283095, 1271432136996826, 2219780368020940 #else 20714545, 29217521, 29088194, 7406487, 11426967, 28458727, 14792666, 18945815, 5289420, 33077305 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1537037379417136, 1358865369268262, 2130838645654099, 828733687040705, 1999987652890901 #else 50443312, 22903641, 60948518, 20248671, 9192019, 31751970, 17271489, 12349094, 26939669, 29802138 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 629042105241814, 1098854999137608, 887281544569320, 1423102019874777, 7911258951561 #else 54218966, 9373457, 31595848, 16374215, 21471720, 13221525, 39825369, 21205872, 63410057, 117886 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1811562332665373, 1501882019007673, 2213763501088999, 359573079719636, 36370565049116 #else 22263325, 26994382, 3984569, 22379786, 51994855, 32987646, 28311252, 5358056, 43789084, 541963 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 218907117361280, 1209298913016966, 1944312619096112, 1130690631451061, 1342327389191701 #else 16259200, 3261970, 2309254, 18019958, 50223152, 28972515, 24134069, 16848603, 53771797, 20002236 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1369976867854704, 1396479602419169, 1765656654398856, 2203659200586299, 998327836117241 #else 9378160, 20414246, 44262881, 20809167, 28198280, 26310334, 64709179, 32837080, 690425, 14876244 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2230701885562825, 1348173180338974, 2172856128624598, 1426538746123771, 444193481326151 #else 24977353, 33240048, 58884894, 20089345, 28432342, 32378079, 54040059, 21257083, 44727879, 6618998 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 784210426627951, 918204562375674, 1284546780452985, 1324534636134684, 1872449409642708 #else 65570671, 11685645, 12944378, 13682314, 42719353, 19141238, 8044828, 19737104, 32239828, 27901670 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 319638829540294, 596282656808406, 2037902696412608, 1557219121643918, 341938082688094 #else 48505798, 4762989, 66182614, 8885303, 38696384, 30367116, 9781646, 23204373, 32779358, 5095274 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1901860206695915, 2004489122065736, 1625847061568236, 973529743399879, 2075287685312905 #else 34100715, 28339925, 34843976, 29869215, 9460460, 24227009, 42507207, 14506723, 21639561, 30924196 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1371853944110545, 1042332820512553, 1949855697918254, 1791195775521505, 37487364849293 #else 50707921, 20442216, 25239337, 15531969, 3987758, 29055114, 65819361, 26690896, 17874573, 558605 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 687200189577855, 1082536651125675, 644224940871546, 340923196057951, 343581346747396 #else 53508735, 10240080, 9171883, 16131053, 46239610, 9599699, 33499487, 5080151, 2085892, 5119761 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2082717129583892, 27829425539422, 145655066671970, 1690527209845512, 1865260509673478 #else 44903700, 31034903, 50727262, 414690, 42089314, 2170429, 30634760, 25190818, 35108870, 27794547 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1059729620568824, 2163709103470266, 1440302280256872, 1769143160546397, 869830310425069 #else 60263160, 15791201, 8550074, 32241778, 29928808, 21462176, 27534429, 26362287, 44757485, 12961481 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1609516219779025, 777277757338817, 2101121130363987, 550762194946473, 1905542338659364 #else 42616785, 23983660, 10368193, 11582341, 43711571, 31309144, 16533929, 8206996, 36914212, 28394793 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2024821921041576, 426948675450149, 595133284085473, 471860860885970, 600321679413000 #else 55987368, 30172197, 2307365, 6362031, 66973409, 8868176, 50273234, 7031274, 7589640, 8945490 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 598474602406721, 1468128276358244, 1191923149557635, 1501376424093216, 1281662691293476 #else 34956097, 8917966, 6661220, 21876816, 65916803, 17761038, 7251488, 22372252, 24099108, 19098262 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1721138489890707, 1264336102277790, 433064545421287, 1359988423149466, 1561871293409447 #else 5019539, 25646962, 4244126, 18840076, 40175591, 6453164, 47990682, 20265406, 60876967, 23273695 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 719520245587143, 393380711632345, 132350400863381, 1543271270810729, 1819543295798660 #else 10853575, 10721687, 26480089, 5861829, 44113045, 1972174, 65242217, 22996533, 63745412, 27113307 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 396397949784152, 1811354474471839, 1362679985304303, 2117033964846756, 498041172552279 #else 50106456, 5906789, 221599, 26991285, 7828207, 20305514, 24362660, 31546264, 53242455, 7421391 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1812471844975748, 1856491995543149, 126579494584102, 1036244859282620, 1975108050082550 #else 8139908, 27007935, 32257645, 27663886, 30375718, 1886181, 45933756, 15441251, 28826358, 29431403 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 650623932407995, 1137551288410575, 2125223403615539, 1725658013221271, 2134892965117796 #else 6267067, 9695052, 7709135, 16950835, 34239795, 31668296, 14795159, 25714308, 13746020, 31812384 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 522584000310195, 1241762481390450, 1743702789495384, 2227404127826575, 1686746002148897 #else 28584883, 7787108, 60375922, 18503702, 22846040, 25983196, 63926927, 33190907, 4771361, 25134474 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 427904865186312, 1703211129693455, 1585368107547509, 1436984488744336, 761188534613978 #else 24949256, 6376279, 39642383, 25379823, 48462709, 23623825, 33543568, 21412737, 3569626, 11342593 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 318101947455002, 248138407995851, 1481904195303927, 309278454311197, 1258516760217879 #else 26514970, 4740088, 27912651, 3697550, 19331575, 22082093, 6809885, 4608608, 7325975, 18753361 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1275068538599310, 513726919533379, 349926553492294, 688428871968420, 1702400196000666 #else 55490446, 19000001, 42787651, 7655127, 65739590, 5214311, 39708324, 10258389, 49462170, 25367739 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1061864036265233, 961611260325381, 321859632700838, 1045600629959517, 1985130202504038 #else 11431185, 15823007, 26570245, 14329124, 18029990, 4796082, 35662685, 15580663, 9280358, 29580745 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1558816436882417, 1962896332636523, 1337709822062152, 1501413830776938, 294436165831932 #else 66948081, 23228174, 44253547, 29249434, 46247496, 19933429, 34297962, 22372809, 51563772, 4387440 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 818359826554971, 1862173000996177, 626821592884859, 573655738872376, 1749691246745455 #else 46309467, 12194511, 3937617, 27748540, 39954043, 9340369, 42594872, 8548136, 20617071, 26072431 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1988022651432119, 1082111498586040, 1834020786104821, 1454826876423687, 692929915223122 #else 66170039, 29623845, 58394552, 16124717, 24603125, 27329039, 53333511, 21678609, 24345682, 10325460 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2146513703733331, 584788900394667, 464965657279958, 2183973639356127, 238371159456790 #else 47253587, 31985546, 44906155, 8714033, 14007766, 6928528, 16318175, 32543743, 4766742, 3552007 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1129007025494441, 2197883144413266, 265142755578169, 971864464758890, 1983715884903702 #else 45357481, 16823515, 1351762, 32751011, 63099193, 3950934, 3217514, 14481909, 10988822, 29559670 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1291366624493075, 381456718189114, 1711482489312444, 1815233647702022, 892279782992467 #else 15564307, 19242862, 3101242, 5684148, 30446780, 25503076, 12677126, 27049089, 58813011, 13296004 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 444548969917454, 1452286453853356, 2113731441506810, 645188273895859, 810317625309512 #else 57666574, 6624295, 36809900, 21640754, 62437882, 31497052, 31521203, 9614054, 37108040, 12074673 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2242724082797924, 1373354730327868, 1006520110883049, 2147330369940688, 1151816104883620 #else 4771172, 33419193, 14290748, 20464580, 27992297, 14998318, 65694928, 31997715, 29832612, 17163397 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1745720200383796, 1911723143175317, 2056329390702074, 355227174309849, 879232794371100 #else 7064884, 26013258, 47946901, 28486894, 48217594, 30641695, 25825241, 5293297, 39986204, 13101589 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 163723479936298, 115424889803150, 1156016391581227, 1894942220753364, 1970549419986329 #else 64810282, 2439669, 59642254, 1719964, 39841323, 17225986, 32512468, 28236839, 36752793, 29363474 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 681981452362484, 267208874112496, 1374683991933094, 638600984916117, 646178654558546 #else 37102324, 10162315, 33928688, 3981722, 50626726, 20484387, 14413973, 9515896, 19568978, 9628812 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 13378654854251, 106237307029567, 1944412051589651, 1841976767925457, 230702819835573 #else 33053803, 199357, 15894591, 1583059, 27380243, 28973997, 49269969, 27447592, 60817077, 3437739 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 260683893467075, 854060306077237, 913639551980112, 4704576840123, 280254810808712 #else 48129987, 3884492, 19469877, 12726490, 15913552, 13614290, 44147131, 70103, 7463304, 4176122 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 715374893080287, 1173334812210491, 1806524662079626, 1894596008000979, 398905715033393 #else 39984863, 10659916, 11482427, 17484051, 12771466, 26919315, 34389459, 28231680, 24216881, 5944158 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 500026409727661, 1596431288195371, 1420380351989370, 985211561521489, 392444930785633 #else 8894125, 7450974, 64444715, 23788679, 39028346, 21165316, 19345745, 14680796, 11632993, 5847885 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2096421546958141, 1922523000950363, 789831022876840, 427295144688779, 320923973161730 #else 26942781, 31239115, 9129563, 28647825, 26024104, 11769399, 55590027, 6367193, 57381634, 4782139 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1927770723575450, 1485792977512719, 1850996108474547, 551696031508956, 2126047405475647 #else 19916442, 28726022, 44198159, 22140040, 25606323, 27581991, 33253852, 8220911, 6358847, 31680575 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2112099158080148, 742570803909715, 6484558077432, 1951119898618916, 93090382703416 #else 801428, 31472730, 16569427, 11065167, 29875704, 96627, 7908388, 29073952, 53570360, 1387154 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 383905201636970, 859946997631870, 855623867637644, 1017125780577795, 794250831877809 #else 19646058, 5720633, 55692158, 12814208, 11607948, 12749789, 14147075, 15156355, 45242033, 11835259 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 77571826285752, 999304298101753, 487841111777762, 1038031143212339, 339066367948762 #else 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, 40548314, 5052482 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 674994775520533, 266035846330789, 826951213393478, 1405007746162285, 1781791018620876 #else 64091413, 10058205, 1980837, 3964243, 22160966, 12322533, 60677741, 20936246, 12228556, 26550755 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1001412661522686, 348196197067298, 1666614366723946, 888424995032760, 580747687801357 #else 32944382, 14922211, 44263970, 5188527, 21913450, 24834489, 4001464, 13238564, 60994061, 8653814 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1939560076207777, 1409892634407635, 552574736069277, 383854338280405, 190706709864139 #else 22865569, 28901697, 27603667, 21009037, 14348957, 8234005, 24808405, 5719875, 28483275, 2841751 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2177087163428741, 1439255351721944, 1208070840382793, 2230616362004769, 1396886392021913 #else 50687877, 32441126, 66781144, 21446575, 21886281, 18001658, 65220897, 33238773, 19932057, 20815229 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 676962063230039, 1880275537148808, 2046721011602706, 888463247083003, 1318301552024067 #else 55452759, 10087520, 58243976, 28018288, 47830290, 30498519, 3999227, 13239134, 62331395, 19644223 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1466980508178206, 617045217998949, 652303580573628, 757303753529064, 207583137376902 #else 1382174, 21859713, 17266789, 9194690, 53784508, 9720080, 20403944, 11284705, 53095046, 3093229 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1511056752906902, 105403126891277, 493434892772846, 1091943425335976, 1802717338077427 #else 16650902, 22516500, 66044685, 1570628, 58779118, 7352752, 66806440, 16271224, 43059443, 26862581 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1853982405405128, 1878664056251147, 1528011020803992, 1019626468153565, 1128438412189035 #else 45197768, 27626490, 62497547, 27994275, 35364760, 22769138, 24123613, 15193618, 45456747, 16815042 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1963939888391106, 293456433791664, 697897559513649, 985882796904380, 796244541237972 #else 57172930, 29264984, 41829040, 4372841, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 416770998629779, 389655552427054, 1314476859406756, 1749382513022778, 1161905598739491 #else 55801235, 6210371, 13206574, 5806320, 38091172, 19587231, 54777658, 26067830, 41530403, 17313742 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1428358296490651, 1027115282420478, 304840698058337, 441410174026628, 1819358356278573 #else 14668443, 21284197, 26039038, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, 27110552 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 204943430200135, 1554861433819175, 216426658514651, 264149070665950, 2047097371738319 #else 5974855, 3053895, 57675815, 23169240, 35243739, 3225008, 59136222, 3936127, 61456591, 30504127 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1934415182909034, 1393285083565062, 516409331772960, 1157690734993892, 121039666594268 #else 30625386, 28825032, 41552902, 20761565, 46624288, 7695098, 17097188, 17250936, 39109084, 1803631 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 662035583584445, 286736105093098, 1131773000510616, 818494214211439, 472943792054479 #else 63555773, 9865098, 61880298, 4272700, 61435032, 16864731, 14911343, 12196514, 45703375, 7047411 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 665784778135882, 1893179629898606, 808313193813106, 276797254706413, 1563426179676396 #else 20093258, 9920966, 55970670, 28210574, 13161586, 12044805, 34252013, 4124600, 34765036, 23296865 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 945205108984232, 526277562959295, 1324180513733566, 1666970227868664, 153547609289173 #else 46320040, 14084653, 53577151, 7842146, 19119038, 19731827, 4752376, 24839792, 45429205, 2288037 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2031433403516252, 203996615228162, 170487168837083, 981513604791390, 843573964916831 #else 40289628, 30270716, 29965058, 3039786, 52635099, 2540456, 29457502, 14625692, 42289247, 12570231 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1476570093962618, 838514669399805, 1857930577281364, 2017007352225784, 317085545220047 #else 66045306, 22002608, 16920317, 12494842, 1278292, 27685323, 45948920, 30055751, 55134159, 4724942 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1461557121912842, 1600674043318359, 2157134900399597, 1670641601940616, 127765583803283 #else 17960970, 21778898, 62967895, 23851901, 58232301, 32143814, 54201480, 24894499, 37532563, 1903855 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1293543509393474, 2143624609202546, 1058361566797508, 214097127393994, 946888515472729 #else 23134274, 19275300, 56426866, 31942495, 20684484, 15770816, 54119114, 3190295, 26955097, 14109738 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 357067959932916, 1290876214345711, 521245575443703, 1494975468601005, 800942377643885 #else 15308788, 5320727, 36995055, 19235554, 22902007, 7767164, 29425325, 22276870, 31960941, 11934971 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 566116659100033, 820247422481740, 994464017954148, 327157611686365, 92591318111744 #else 39713153, 8435795, 4109644, 12222639, 42480996, 14818668, 20638173, 4875028, 10491392, 1379718 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 617256647603209, 1652107761099439, 1857213046645471, 1085597175214970, 817432759830522 #else 53949449, 9197840, 3875503, 24618324, 65725151, 27674630, 33518458, 16176658, 21432314, 12180697 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 771808161440705, 1323510426395069, 680497615846440, 851580615547985, 1320806384849017 #else 55321537, 11500837, 13787581, 19721842, 44678184, 10140204, 1465425, 12689540, 56807545, 19681548 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1219260086131915, 647169006596815, 79601124759706, 2161724213426748, 404861897060198 #else 5414091, 18168391, 46101199, 9643569, 12834970, 1186149, 64485948, 32212200, 26128230, 6032912 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1327968293887866, 1335500852943256, 1401587164534264, 558137311952440, 1551360549268902 #else 40771450, 19788269, 32496024, 19900513, 17847800, 20885276, 3604024, 8316894, 41233830, 23117073 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 417621685193956, 1429953819744454, 396157358457099, 1940470778873255, 214000046234152 #else 3296484, 6223048, 24680646, 21307972, 44056843, 5903204, 58246567, 28915267, 12376616, 3188849 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1268047918491973, 2172375426948536, 1533916099229249, 1761293575457130, 1590622667026765 #else 29190469, 18895386, 27549112, 32370916, 3520065, 22857131, 32049514, 26245319, 50999629, 23702124 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1627072914981959, 2211603081280073, 1912369601616504, 1191770436221309, 2187309757525860 #else 52364359, 24245275, 735817, 32955454, 46701176, 28496527, 25246077, 17758763, 18640740, 32593455 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1149147819689533, 378692712667677, 828475842424202, 2218619146419342, 70688125792186 #else 60180029, 17123636, 10361373, 5642961, 4910474, 12345252, 35470478, 33060001, 10530746, 1053335 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1299739417079761, 1438616663452759, 1536729078504412, 2053896748919838, 1008421032591246 #else 37842897, 19367626, 53570647, 21437058, 47651804, 22899047, 35646494, 30605446, 24018830, 15026644 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2040723824657366, 399555637875075, 632543375452995, 872649937008051, 1235394727030233 #else 44516310, 30409154, 64819587, 5953842, 53668675, 9425630, 25310643, 13003497, 64794073, 18408815 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2211311599327900, 2139787259888175, 938706616835350, 12609661139114, 2081897930719789 #else 39688860, 32951110, 59064879, 31885314, 41016598, 13987818, 39811242, 187898, 43942445, 31022696 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1324994503390450, 336982330582631, 1183998925654177, 1091654665913274, 48727673971319 #else 45364466, 19743956, 1844839, 5021428, 56674465, 17642958, 9716666, 16266922, 62038647, 726098 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1845522914617879, 1222198248335542, 150841072760134, 1927029069940982, 1189913404498011 #else 29370903, 27500434, 7334070, 18212173, 9385286, 2247707, 53446902, 28714970, 30007387, 17731091 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1079559557592645, 2215338383666441, 1903569501302605, 49033973033940, 305703433934152 #else 66172485, 16086690, 23751945, 33011114, 65941325, 28365395, 9137108, 730663, 9835848, 4555336 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 94653405416909, 1386121349852999, 1062130477891762, 36553947479274, 833669648948846 #else 43732429, 1410445, 44855111, 20654817, 30867634, 15826977, 17693930, 544696, 55123566, 12422645 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1432015813136298, 440364795295369, 1395647062821501, 1976874522764578, 934452372723352 #else 31117226, 21338698, 53606025, 6561946, 57231997, 20796761, 61990178, 29457725, 29120152, 13924425 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1296625309219774, 2068273464883862, 1858621048097805, 1492281814208508, 2235868981918946 #else 49707966, 19321222, 19675798, 30819676, 56101901, 27695611, 57724924, 22236731, 7240930, 33317044 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1490330266465570, 1858795661361448, 1436241134969763, 294573218899647, 1208140011028933 #else 35747106, 22207651, 52101416, 27698213, 44655523, 21401660, 1222335, 4389483, 3293637, 18002689 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1282462923712748, 741885683986255, 2027754642827561, 518989529541027, 1826610009555945 #else 50424044, 19110186, 11038543, 11054958, 53307689, 30215898, 42789283, 7733546, 12796905, 27218610 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1525827120027511, 723686461809551, 1597702369236987, 244802101764964, 1502833890372311 #else 58349431, 22736595, 41689999, 10783768, 36493307, 23807620, 38855524, 3647835, 3222231, 22393970 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 113622036244513, 1233740067745854, 674109952278496, 2114345180342965, 166764512856263 #else 18606113, 1693100, 41660478, 18384159, 4112352, 10045021, 23603893, 31506198, 59558087, 2484984 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2041668749310338, 2184405322203901, 1633400637611036, 2110682505536899, 2048144390084644 #else 9255298, 30423235, 54952701, 32550175, 13098012, 24339566, 16377219, 31451620, 47306788, 30519729 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 503058759232932, 760293024620937, 2027152777219493, 666858468148475, 1539184379870952 #else 44379556, 7496159, 61366665, 11329248, 19991973, 30206930, 35390715, 9936965, 37011176, 22935634 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1916168475367211, 915626432541343, 883217071712575, 363427871374304, 1976029821251593 #else 21878571, 28553135, 4338335, 13643897, 64071999, 13160959, 19708896, 5415497, 59748361, 29445138 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 678039535434506, 570587290189340, 1605302676614120, 2147762562875701, 1706063797091704 #else 27736842, 10103576, 12500508, 8502413, 63695848, 23920873, 10436917, 32004156, 43449720, 25422331 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1439489648586438, 2194580753290951, 832380563557396, 561521973970522, 584497280718389 #else 19492550, 21450067, 37426887, 32701801, 63900692, 12403436, 30066266, 8367329, 13243957, 8709688 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 187989455492609, 681223515948275, 1933493571072456, 1872921007304880, 488162364135671 #else 12015105, 2801261, 28198131, 10151021, 24818120, 28811299, 55914672, 27908697, 5150967, 7274186 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1413466089534451, 410844090765630, 1397263346404072, 408227143123410, 1594561803147811 #else 2831347, 21062286, 1478974, 6122054, 23825128, 20820846, 31097298, 6083058, 31021603, 23760822 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2102170800973153, 719462588665004, 1479649438510153, 1097529543970028, 1302363283777685 #else 64578913, 31324785, 445612, 10720828, 53259337, 22048494, 43601132, 16354464, 15067285, 19406725 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 942065717847195, 1069313679352961, 2007341951411051, 70973416446291, 1419433790163706 #else 7840923, 14037873, 33744001, 15934015, 66380651, 29911725, 21403987, 1057586, 47729402, 21151211 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1146565545556377, 1661971299445212, 406681704748893, 564452436406089, 1109109865829139 #else 915865, 17085158, 15608284, 24765302, 42751837, 6060029, 49737545, 8410996, 59888403, 16527024 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2214421081775077, 1165671861210569, 1890453018796184, 3556249878661, 442116172656317 #else 32922597, 32997445, 20336073, 17369864, 10903704, 28169945, 16957573, 52992, 23834301, 6588044 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 753830546620811, 1666955059895019, 1530775289309243, 1119987029104146, 2164156153857580 #else 32752011, 11232950, 3381995, 24839566, 22652987, 22810329, 17159698, 16689107, 46794284, 32248439 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 615171919212796, 1523849404854568, 854560460547503, 2067097370290715, 1765325848586042 #else 62419196, 9166775, 41398568, 22707125, 11576751, 12733943, 7924251, 30802151, 1976122, 26305405 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1094538949313667, 1796592198908825, 870221004284388, 2025558921863561, 1699010892802384 #else 21251203, 16309901, 64125849, 26771309, 30810596, 12967303, 156041, 30183180, 12331344, 25317235 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1951351290725195, 1916457206844795, 198025184438026, 1909076887557595, 1938542290318919 #else 8651595, 29077400, 51023227, 28557437, 13002506, 2950805, 29054427, 28447462, 10008135, 28886531 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1014323197538413, 869150639940606, 1756009942696599, 1334952557375672, 1544945379082874 #else 31486061, 15114593, 52847614, 12951353, 14369431, 26166587, 16347320, 19892343, 8684154, 23021480 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 764055910920305, 1603590757375439, 146805246592357, 1843313433854297, 954279890114939 #else 19443825, 11385320, 24468943, 23895364, 43189605, 2187568, 40845657, 27467510, 31316347, 14219878 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 80113526615750, 764536758732259, 1055139345100233, 469252651759390, 617897512431515 #else 38514374, 1193784, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 74497112547268, 740094153192149, 1745254631717581, 727713886503130, 1283034364416928 #else 32382916, 1110093, 18477781, 11028262, 39697101, 26006320, 62128346, 10843781, 59151264, 19118701 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 525892105991110, 1723776830270342, 1476444848991936, 573789489857760, 133864092632978 #else 2814918, 7836403, 27519878, 25686276, 46214848, 22000742, 45614304, 8550129, 28346258, 1994730 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 542611720192581, 1986812262899321, 1162535242465837, 481498966143464, 544600533583622 #else 47530565, 8085544, 53108345, 29605809, 2785837, 17323125, 47591912, 7174893, 22628102, 8115180 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 64123227344372, 1239927720647794, 1360722983445904, 222610813654661, 62429487187991 #else 36703732, 955510, 55975026, 18476362, 34661776, 20276352, 41457285, 3317159, 57165847, 930271 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1793193323953132, 91096687857833, 70945970938921, 2158587638946380, 1537042406482111 #else 51805164, 26720662, 28856489, 1357446, 23421993, 1057177, 24091212, 32165462, 44343487, 22903716 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1895854577604609, 1394895708949416, 1728548428495944, 1140864900240149, 563645333603061 #else 44357633, 28250434, 54201256, 20785565, 51297352, 25757378, 52269845, 17000211, 65241845, 8398969 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 141358280486863, 91435889572504, 1087208572552643, 1829599652522921, 1193307020643647 #else 35139535, 2106402, 62372504, 1362500, 12813763, 16200670, 22981545, 27263159, 18009407, 17781660 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1611230858525381, 950720175540785, 499589887488610, 2001656988495019, 88977313255908 #else 49887941, 24009210, 39324209, 14166834, 29815394, 7444469, 29551787, 29827013, 19288548, 1325865 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1189080501479658, 2184348804772597, 1040818725742319, 2018318290311834, 1712060030915354 #else 15100138, 17718680, 43184885, 32549333, 40658671, 15509407, 12376730, 30075286, 33166106, 25511682 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 873966876953756, 1090638350350440, 1708559325189137, 672344594801910, 1320437969700239 #else 20909212, 13023121, 57899112, 16251777, 61330449, 25459517, 12412150, 10018715, 2213263, 19676059 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1508590048271766, 1131769479776094, 101550868699323, 428297785557897, 561791648661744 #else 32529814, 22479743, 30361438, 16864679, 57972923, 1513225, 22922121, 6382134, 61341936, 8371347 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 756417570499462, 237882279232602, 2136263418594016, 1701968045454886, 703713185137472 #else 9923462, 11271500, 12616794, 3544722, 37110496, 31832805, 12891686, 25361300, 40665920, 10486143 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1781187809325462, 1697624151492346, 1381393690939988, 175194132284669, 1483054666415238 #else 44511638, 26541766, 8587002, 25296571, 4084308, 20584370, 361725, 2610596, 43187334, 22099236 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2175517777364616, 708781536456029, 955668231122942, 1967557500069555, 2021208005604118 #else 5408392, 32417741, 62139741, 10561667, 24145918, 14240566, 31319731, 29318891, 19985174, 30118346 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1115135966606887, 224217372950782, 915967306279222, 593866251291540, 561747094208006 #else 53114407, 16616820, 14549246, 3341099, 32155958, 13648976, 49531796, 8849296, 65030, 8370684 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1443163092879439, 391875531646162, 2180847134654632, 464538543018753, 1594098196837178 #else 58787919, 21504805, 31204562, 5839400, 46481576, 32497154, 47665921, 6922163, 12743482, 23753914 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 850858855888869, 319436476624586, 327807784938441, 740785849558761, 17128415486016 #else 64747493, 12678784, 28815050, 4759974, 43215817, 4884716, 23783145, 11038569, 18800704, 255233 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2132756334090067, 536247820155645, 48907151276867, 608473197600695, 1261689545022784 #else 61839187, 31780545, 13957885, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, 18800639 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1525176236978354, 974205476721062, 293436255662638, 148269621098039, 137961998433963 #else 64172210, 22726896, 56676774, 14516792, 63468078, 4372540, 35173943, 2209389, 65584811, 2055793 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1121075518299410, 2071745529082111, 1265567917414828, 1648196578317805, 496232102750820 #else 580882, 16705327, 5468415, 30871414, 36182444, 18858431, 59905517, 24560042, 37087844, 7394434 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 122321229299801, 1022922077493685, 2001275453369484, 2017441881607947, 993205880778002 #else 23838809, 1822728, 51370421, 15242726, 8318092, 29821328, 45436683, 30062226, 62287122, 14799920 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 654925550560074, 1168810995576858, 575655959430926, 905758704861388, 496774564663534 #else 13345610, 9759151, 3371034, 17416641, 16353038, 8577942, 31129804, 13496856, 58052846, 7402517 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1954109525779738, 2117022646152485, 338102630417180, 1194140505732026, 107881734943492 #else 2286874, 29118501, 47066405, 31546095, 53412636, 5038121, 11006906, 17794080, 8205060, 1607563 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1714785840001267, 2036500018681589, 1876380234251966, 2056717182974196, 1645855254384642 #else 14414067, 25552300, 3331829, 30346215, 22249150, 27960244, 18364660, 30647474, 30019586, 24525154 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 106431476499341, 62482972120563, 1513446655109411, 807258751769522, 538491469114 #else 39420813, 1585952, 56333811, 931068, 37988643, 22552112, 52698034, 12029092, 9944378, 8024 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2002850762893643, 1243624520538135, 1486040410574605, 2184752338181213, 378495998083531 #else 4368715, 29844802, 29874199, 18531449, 46878477, 22143727, 50994269, 32555346, 58966475, 5640029 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 922510868424903, 1089502620807680, 402544072617374, 1131446598479839, 1290278588136533 #else 10299591, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, 16859868, 15219797, 19226649 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1867998812076769, 715425053580701, 39968586461416, 2173068014586163, 653822651801304 #else 27425505, 27835351, 3055005, 10660664, 23458024, 595578, 51710259, 32381236, 48766680, 9742716 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 162892278589453, 182585796682149, 75093073137630, 497037941226502, 133871727117371 #else 6744077, 2427284, 26042789, 2720740, 66260958, 1118973, 32324614, 7406442, 12420155, 1994844 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1914596576579670, 1608999621851578, 1987629837704609, 1519655314857977, 1819193753409464 #else 14012502, 28529712, 48724410, 23975962, 40623521, 29617992, 54075385, 22644628, 24319928, 27108099 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1949315551096831, 1069003344994464, 1939165033499916, 1548227205730856, 1933767655861407 #else 16412671, 29047065, 10772640, 15929391, 50040076, 28895810, 10555944, 23070383, 37006495, 28815383 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1730519386931635, 1393284965610134, 1597143735726030, 416032382447158, 1429665248828629 #else 22397363, 25786748, 57815702, 20761563, 17166286, 23799296, 39775798, 6199365, 21880021, 21303672 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 360275475604565, 547835731063078, 215360904187529, 596646739879007, 332709650425085 #else 62825557, 5368522, 35991846, 8163388, 36785801, 3209127, 16557151, 8890729, 8840445, 4957760 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 47602113726801, 1522314509708010, 437706261372925, 814035330438027, 335930650933545 #else 51661137, 709326, 60189418, 22684253, 37330941, 6522331, 45388683, 12130071, 52312361, 5005756 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1291597595523886, 1058020588994081, 402837842324045, 1363323695882781, 2105763393033193 #else 64994094, 19246303, 23019041, 15765735, 41839181, 6002751, 10183197, 20315106, 50713577, 31378319 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 109521982566564, 1715257748585139, 1112231216891516, 2046641005101484, 134249157157013 #else 48083108, 1632004, 13466291, 25559332, 43468412, 16573536, 35094956, 30497327, 22208661, 2000468 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2156991030936798, 2227544497153325, 1869050094431622, 754875860479115, 1754242344267058 #else 3065054, 32141671, 41510189, 33192999, 49425798, 27851016, 58944651, 11248526, 63417650, 26140247 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1846089562873800, 98894784984326, 1412430299204844, 171351226625762, 1100604760929008 #else 10379208, 27508878, 8877318, 1473647, 37817580, 21046851, 16690914, 2553332, 63976176, 16400288 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 84172382130492, 499710970700046, 425749630620778, 1762872794206857, 612842602127960 #else 15716668, 1254266, 48636174, 7446273, 58659946, 6344163, 45011593, 26268851, 26894936, 9132066 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 868309334532756, 1703010512741873, 1952690008738057, 4325269926064, 2071083554962116 #else 24158868, 12938817, 11085297, 25376834, 39045385, 29097348, 36532400, 64451, 60291780, 30861549 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 523094549451158, 401938899487815, 1407690589076010, 2022387426254453, 158660516411257 #else 13488534, 7794716, 22236231, 5989356, 25426474, 20976224, 2350709, 30135921, 62420857, 2364225 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 612867287630009, 448212612103814, 571629077419196, 1466796750919376, 1728478129663858 #else 16335033, 9132434, 25640582, 6678888, 1725628, 8517937, 55301840, 21856974, 15445874, 25756331 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1723848973783452, 2208822520534681, 1718748322776940, 1974268454121942, 1194212502258141 #else 29004188, 25687351, 28661401, 32914020, 54314860, 25611345, 31863254, 29418892, 66830813, 17795152 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1254114807944608, 977770684047110, 2010756238954993, 1783628927194099, 1525962994408256 #else 60986784, 18687766, 38493958, 14569918, 56250865, 29962602, 10343411, 26578142, 37280576, 22738620 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 232464058235826, 1948628555342434, 1835348780427694, 1031609499437291, 64472106918373 #else 27081650, 3463984, 14099042, 29036828, 1616302, 27348828, 29542635, 15372179, 17293797, 960709 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 767338676040683, 754089548318405, 1523192045639075, 435746025122062, 512692508440385 #else 20263915, 11434237, 61343429, 11236809, 13505955, 22697330, 50997518, 6493121, 47724353, 7639713 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1255955808701983, 1700487367990941, 1166401238800299, 1175121994891534, 1190934801395380 #else 64278047, 18715199, 25403037, 25339236, 58791851, 17380732, 18006286, 17510682, 29994676, 17746311 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 349144008168292, 1337012557669162, 1475912332999108, 1321618454900458, 47611291904320 #else 9769828, 5202651, 42951466, 19923039, 39057860, 21992807, 42495722, 19693649, 35924288, 709463 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 877519947135419, 2172838026132651, 272304391224129, 1655143327559984, 886229406429814 #else 12286395, 13076066, 45333675, 32377809, 42105665, 4057651, 35090736, 24663557, 16102006, 13205847 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 375806028254706, 214463229793940, 572906353144089, 572168269875638, 697556386112979 #else 13733362, 5599946, 10557076, 3195751, 61550873, 8536969, 41568694, 8525971, 10151379, 10394400 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1168827102357844, 823864273033637, 2071538752104697, 788062026895924, 599578340743362 #else 4024660, 17416881, 22436261, 12276534, 58009849, 30868332, 19698228, 11743039, 33806530, 8934413 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1948116082078088, 2054898304487796, 2204939184983900, 210526805152138, 786593586607626 #else 51229064, 29029191, 58528116, 30620370, 14634844, 32856154, 57659786, 3137093, 55571978, 11721157 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1915320147894736, 156481169009469, 655050471180417, 592917090415421, 2165897438660879 #else 17555920, 28540494, 8268605, 2331751, 44370049, 9761012, 9319229, 8835153, 57903375, 32274386 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1726336468579724, 1119932070398949, 1929199510967666, 33918788322959, 1836837863503150 #else 66647436, 25724417, 20614117, 16688288, 59594098, 28747312, 22300303, 505429, 6108462, 27371017 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 829996854845988, 217061778005138, 1686565909803640, 1346948817219846, 1723823550730181 #else 62038564, 12367916, 36445330, 3234472, 32617080, 25131790, 29880582, 20071101, 40210373, 25686972 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 384301494966394, 687038900403062, 2211195391021739, 254684538421383, 1245698430589680 #else 35133562, 5726538, 26934134, 10237677, 63935147, 32949378, 24199303, 3795095, 7592688, 18562353 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1247567493562688, 1978182094455847, 183871474792955, 806570235643435, 288461518067916 #else 21594432, 18590204, 17466407, 29477210, 32537083, 2739898, 6407723, 12018833, 38852812, 4298411 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1449077384734201, 38285445457996, 2136537659177832, 2146493000841573, 725161151123125 #else 46458361, 21592935, 39872588, 570497, 3767144, 31836892, 13891941, 31985238, 13717173, 10805743 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1201928866368855, 800415690605445, 1703146756828343, 997278587541744, 1858284414104014 #else 52432215, 17910135, 15287173, 11927123, 24177847, 25378864, 66312432, 14860608, 40169934, 27690595 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 356468809648877, 782373916933152, 1718002439402870, 1392222252219254, 663171266061951 #else 12962541, 5311799, 57048096, 11658279, 18855286, 25600231, 13286262, 20745728, 62727807, 9882021 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 759628738230460, 1012693474275852, 353780233086498, 246080061387552, 2030378857679162 #else 18512060, 11319350, 46985740, 15090308, 18818594, 5271736, 44380960, 3666878, 43141434, 30255002 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2040672435071076, 888593182036908, 1298443657189359, 1804780278521327, 354070726137060 #else 60319844, 30408388, 16192428, 13241070, 15898607, 19348318, 57023983, 26893321, 64705764, 5276064 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1894938527423184, 1463213041477277, 474410505497651, 247294963033299, 877975941029128 #else 30169808, 28236784, 26306205, 21803573, 27814963, 7069267, 7152851, 3684982, 1449224, 13082861 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 207937160991127, 12966911039119, 820997788283092, 1010440472205286, 1701372890140810 #else 10342807, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, 46092426, 25352431 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 218882774543183, 533427444716285, 1233243976733245, 435054256891319, 1509568989549904 #else 33958735, 3261607, 22745853, 7948688, 19370557, 18376767, 40936887, 6482813, 56808784, 22494330 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1888838535711826, 1052177758340622, 1213553803324135, 169182009127332, 463374268115872 #else 32869458, 28145887, 25609742, 15678670, 56421095, 18083360, 26112420, 2521008, 44444576, 6904814 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 299137589460312, 1594371588983567, 868058494039073, 257771590636681, 1805012993142921 #else 29506904, 4457497, 3377935, 23757988, 36598817, 12935079, 1561737, 3841096, 38105225, 26896789 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1806842755664364, 2098896946025095, 1356630998422878, 1458279806348064, 347755825962072 #else 10340844, 26924055, 48452231, 31276001, 12621150, 20215377, 30878496, 21730062, 41524312, 5181965 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1402334161391744, 1560083671046299, 1008585416617747, 1147797150908892, 1420416683642459 #else 25940096, 20896407, 17324187, 23247058, 58437395, 15029093, 24396252, 17103510, 64786011, 21165857 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 665506704253369, 273770475169863, 799236974202630, 848328990077558, 1811448782807931 #else 45343161, 9916822, 65808455, 4079497, 66080518, 11909558, 1782390, 12641087, 20603771, 26992690 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1468412523962641, 771866649897997, 1931766110147832, 799561180078482, 524837559150077 #else 48226577, 21881051, 24849421, 11501709, 13161720, 28785558, 1925522, 11914390, 4662781, 7820689 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2223212657821850, 630416247363666, 2144451165500328, 816911130947791, 1024351058410032 #else 12241050, 33128450, 8132690, 9393934, 32846760, 31954812, 29749455, 12172924, 16136752, 15264020 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1266603897524861, 156378408858100, 1275649024228779, 447738405888420, 253186462063095 #else 56758909, 18873868, 58896884, 2330219, 49446315, 19008651, 10658212, 6671822, 19012087, 3772772 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2022215964509735, 136144366993649, 1800716593296582, 1193970603800203, 871675847064218 #else 3753511, 30133366, 10617073, 2028709, 14841030, 26832768, 28718731, 17791548, 20527770, 12988982 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1862751661970328, 851596246739884, 1519315554814041, 1542798466547449, 1417975335901520 #else 52286360, 27757162, 63400876, 12689772, 66209881, 22639565, 42925817, 22989488, 3299664, 21129479 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1228168094547481, 334133883362894, 587567568420081, 433612590281181, 603390400373205 #else 50331161, 18301130, 57466446, 4978982, 3308785, 8755439, 6943197, 6461331, 41525717, 8991217 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 121893973206505, 1843345804916664, 1703118377384911, 497810164760654, 101150811654673 #else 49882601, 1816361, 65435576, 27467992, 31783887, 25378441, 34160718, 7417949, 36866577, 1507264 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 458346255946468, 290909935619344, 1452768413850679, 550922875254215, 1537286854336538 #else 29692644, 6829891, 56610064, 4334895, 20945975, 21647936, 38221255, 8209390, 14606362, 22907359 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 584322311184395, 380661238802118, 114839394528060, 655082270500073, 2111856026034852 #else 63627275, 8707080, 32188102, 5672294, 22096700, 1711240, 34088169, 9761486, 4170404, 31469107 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 996965581008991, 2148998626477022, 1012273164934654, 1073876063914522, 1688031788934939 #else 55521375, 14855944, 62981086, 32022574, 40459774, 15084045, 22186522, 16002000, 52832027, 25153633 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 923487018849600, 2085106799623355, 528082801620136, 1606206360876188, 735907091712524 #else 62297408, 13761028, 35404987, 31070512, 63796392, 7869046, 59995292, 23934339, 13240844, 10965870 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1697697887804317, 1335343703828273, 831288615207040, 949416685250051, 288760277392022 #else 59366301, 25297669, 52340529, 19898171, 43876480, 12387165, 4498947, 14147411, 29514390, 4302863 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1419122478109648, 1325574567803701, 602393874111094, 2107893372601700, 1314159682671307 #else 53695440, 21146572, 20757301, 19752600, 14785142, 8976368, 62047588, 31410058, 17846987, 19582505 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2201150872731804, 2180241023425241, 97663456423163, 1633405770247824, 848945042443986 #else 64864412, 32799703, 62511833, 32488122, 60861691, 1455298, 45461136, 24339642, 61886162, 12650266 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1173339555550611, 818605084277583, 47521504364289, 924108720564965, 735423405754506 #else 57202067, 17484121, 21134159, 12198166, 40044289, 708125, 387813, 13770293, 47974538, 10958662 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 830104860549448, 1886653193241086, 1600929509383773, 1475051275443631, 286679780900937 #else 22470984, 12369526, 23446014, 28113323, 45588061, 23855708, 55336367, 21979976, 42025033, 4271861 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1577111294832995, 1030899169768747, 144900916293530, 1964672592979567, 568390100955250 #else 41939299, 23500789, 47199531, 15361594, 61124506, 2159191, 75375, 29275903, 34582642, 8469672 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 278388655910247, 487143369099838, 927762205508727, 181017540174210, 1616886700741287 #else 15854951, 4148314, 58214974, 7259001, 11666551, 13824734, 36577666, 2697371, 24154791, 24093489 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1191033906638969, 940823957346562, 1606870843663445, 861684761499847, 658674867251089 #else 15446137, 17747788, 29759746, 14019369, 30811221, 23944241, 35526855, 12840103, 24913809, 9815020 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1875032594195546, 1427106132796197, 724736390962158, 901860512044740, 635268497268760 #else 62399578, 27940162, 35267365, 21265538, 52665326, 10799413, 58005188, 13438768, 18735128, 9466238 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 622869792298357, 1903919278950367, 1922588621661629, 1520574711600434, 1087100760174640 #else 11933045, 9281483, 5081055, 28370608, 64480701, 28648802, 59381042, 22658328, 44380208, 16199063 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 25465949416618, 1693639527318811, 1526153382657203, 125943137857169, 145276964043999 #else 14576810, 379472, 40322331, 25237195, 37682355, 22741457, 67006097, 1876698, 30801119, 2164795 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 214739857969358, 920212862967915, 1939901550972269, 1211862791775221, 85097515720120 #else 15995086, 3199873, 13672555, 13712240, 47730029, 28906785, 54027253, 18058162, 53616056, 1268051 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2006245852772938, 734762734836159, 254642929763427, 1406213292755966, 239303749517686 #else 56818250, 29895392, 63822271, 10948817, 23037027, 3794475, 63638526, 20954210, 50053494, 3565903 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1619678837192149, 1919424032779215, 1357391272956794, 1525634040073113, 1310226789796241 #else 29210069, 24135095, 61189071, 28601646, 10834810, 20226706, 50596761, 22733718, 39946641, 19523900 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1040763709762123, 1704449869235352, 605263070456329, 1998838089036355, 1312142911487502 #else 53946955, 15508587, 16663704, 25398282, 38758921, 9019122, 37925443, 29785008, 2244110, 19552453 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1996723311435669, 1844342766567060, 985455700466044, 1165924681400960, 311508689870129 #else 61955989, 29753495, 57802388, 27482848, 16243068, 14684434, 41435776, 17373631, 13491505, 4641841 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 43173156290518, 2202883069785309, 1137787467085917, 1733636061944606, 1394992037553852 #else 10813398, 643330, 47920349, 32825515, 30292061, 16954354, 27548446, 25833190, 14476988, 20787001 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 670078326344559, 555655025059356, 471959386282438, 2141455487356409, 849015953823125 #else 10292079, 9984945, 6481436, 8279905, 59857350, 7032742, 27282937, 31910173, 39196053, 12651323 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2197214573372804, 794254097241315, 1030190060513737, 267632515541902, 2040478049202624 #else 35923332, 32741048, 22271203, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, 30405492 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1812516004670529, 1609256702920783, 1706897079364493, 258549904773295, 996051247540686 #else 10202177, 27008593, 35735631, 23979793, 34958221, 25434748, 54202543, 3852693, 13216206, 14842320 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1540374301420584, 1764656898914615, 1810104162020396, 923808779163088, 664390074196579 #else 51293224, 22953365, 60569911, 26295436, 60124204, 26972653, 35608016, 13765823, 39674467, 9900183 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1323460699404750, 1262690757880991, 871777133477900, 1060078894988977, 1712236889662886 #else 14465486, 19721101, 34974879, 18815558, 39665676, 12990491, 33046193, 15796406, 60056998, 25514317 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1696163952057966, 1391710137550823, 608793846867416, 1034391509472039, 1780770894075012 #else 30924398, 25274812, 6359015, 20738097, 16508376, 9071735, 41620263, 15413634, 9524356, 26535554 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1367603834210841, 2131988646583224, 890353773628144, 1908908219165595, 270836895252891 #else 12274201, 20378885, 32627640, 31769106, 6736624, 13267305, 5237659, 28444949, 15663515, 4035784 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 597536315471731, 40375058742586, 1942256403956049, 1185484645495932, 312666282024145 #else 64157555, 8903984, 17349946, 601635, 50676049, 28941875, 53376124, 17665097, 44850385, 4659090 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1919411405316294, 1234508526402192, 1066863051997083, 1008444703737597, 1348810787701552 #else 50192582, 28601458, 36715152, 18395610, 20774811, 15897498, 5736189, 15026997, 64930608, 20098846 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2102881477513865, 1570274565945361, 1573617900503708, 18662635732583, 2232324307922098 #else 58249865, 31335375, 28571665, 23398914, 66634396, 23448733, 63307367, 278094, 23440562, 33264224 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1853931367696942, 8107973870707, 350214504129299, 775206934582587, 1752317649166792 #else 10226222, 27625730, 15139955, 120818, 52241171, 5218602, 32937275, 11551483, 50536904, 26111567 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1417148368003523, 721357181628282, 505725498207811, 373232277872983, 261634707184480 #else 17932739, 21117156, 43069306, 10749059, 11316803, 7535897, 22503767, 5561594, 63462240, 3898660 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2186733281493267, 2250694917008620, 1014829812957440, 479998161452389, 83566193876474 #else 7749907, 32584865, 50769132, 33537967, 42090752, 15122142, 65535333, 7152529, 21831162, 1245233 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1268116367301224, 560157088142809, 802626839600444, 2210189936605713, 1129993785579988 #else 26958440, 18896406, 4314585, 8346991, 61431100, 11960071, 34519569, 32934396, 36706772, 16838219 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 615183387352312, 917611676109240, 878893615973325, 978940963313282, 938686890583575 #else 54942968, 9166946, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, 44770839, 13987524 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 522024729211672, 1045059315315808, 1892245413707790, 1907891107684253, 2059998109500714 #else 42758936, 7778774, 21116000, 15572597, 62275598, 28196653, 62807965, 28429792, 59639082, 30696363 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1799679152208884, 912132775900387, 25967768040979, 432130448590461, 274568990261996 #else 9681908, 26817309, 35157219, 13591837, 60225043, 386949, 31622781, 6439245, 52527852, 4091396 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 98698809797682, 2144627600856209, 1907959298569602, 811491302610148, 1262481774981493 #else 58682418, 1470726, 38999185, 31957441, 3978626, 28430809, 47486180, 12092162, 29077877, 18812444 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1791451399743152, 1713538728337276, 118349997257490, 1882306388849954, 158235232210248 #else 5269168, 26694706, 53878652, 25533716, 25932562, 1763552, 61502754, 28048550, 47091016, 2357888 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1217809823321928, 2173947284933160, 1986927836272325, 1388114931125539, 12686131160169 #else 32264008, 18146780, 61721128, 32394338, 65017541, 29607531, 23104803, 20684524, 5727337, 189038 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1650875518872272, 1136263858253897, 1732115601395988, 734312880662190, 1252904681142109 #else 14609104, 24599962, 61108297, 16931650, 52531476, 25810533, 40363694, 10942114, 41219933, 18669734 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 372986456113865, 525430915458171, 2116279931702135, 501422713587815, 1907002872974925 #else 20513481, 5557931, 51504251, 7829530, 26413943, 31535028, 45729895, 7471780, 13913677, 28416557 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 803147181835288, 868941437997146, 316299302989663, 943495589630550, 571224287904572 #else 41534488, 11967825, 29233242, 12948236, 60354399, 4713226, 58167894, 14059179, 12878652, 8511905 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 227742695588364, 1776969298667369, 628602552821802, 457210915378118, 2041906378111140 #else 41452044, 3393630, 64153449, 26478905, 64858154, 9366907, 36885446, 6812973, 5568676, 30426776 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 815000523470260, 913085688728307, 1052060118271173, 1345536665214223, 541623413135555 #else 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, 49700111, 20050058, 52713667, 8070817 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1580216071604333, 1877997504342444, 857147161260913, 703522726778478, 2182763974211603 #else 27117677, 23547054, 35826092, 27984343, 1127281, 12772488, 37262958, 10483305, 55556115, 32525717 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1870080310923419, 71988220958492, 1783225432016732, 615915287105016, 1035570475990230 #else 10637467, 27866368, 5674780, 1072708, 40765276, 26572129, 65424888, 9177852, 39615702, 15431202 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 730987750830150, 857613889540280, 1083813157271766, 1002817255970169, 1719228484436074 #else 20525126, 10892566, 54366392, 12779442, 37615830, 16150074, 38868345, 14943141, 52052074, 25618500 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 377616581647602, 1581980403078513, 804044118130621, 2034382823044191, 643844048472185 #else 37084402, 5626925, 66557297, 23573344, 753597, 11981191, 25244767, 30314666, 63752313, 9594023 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 176957326463017, 1573744060478586, 528642225008045, 1816109618372371, 1515140189765006 #else 43356201, 2636869, 61944954, 23450613, 585133, 7877383, 11345683, 27062142, 13352334, 22577348 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1888911448245718, 1387110895611080, 1924503794066429, 1731539523700949, 2230378382645454 #else 65177046, 28146973, 3304648, 20669563, 17015805, 28677341, 37325013, 25801949, 53893326, 33235227 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 443392177002051, 233793396845137, 2199506622312416, 1011858706515937, 974676837063129 #else 20239939, 6607058, 6203985, 3483793, 48721888, 32775202, 46385121, 15077869, 44358105, 14523816 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1846351103143623, 1949984838808427, 671247021915253, 1946756846184401, 1929296930380217 #else 27406023, 27512775, 27423595, 29057038, 4996213, 10002360, 38266833, 29008937, 36936121, 28748764 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 849646212452002, 1410198775302919, 73767886183695, 1641663456615812, 762256272452411 #else 11374242, 12660715, 17861383, 21013599, 10935567, 1099227, 53222788, 24462691, 39381819, 11358503 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 692017667358279, 723305578826727, 1638042139863265, 748219305990306, 334589200523901 #else 54378055, 10311866, 1510375, 10778093, 64989409, 24408729, 32676002, 11149336, 40985213, 4985767 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 22893968530686, 2235758574399251, 1661465835630252, 925707319443452, 1203475116966621 #else 48012542, 341146, 60911379, 33315398, 15756972, 24757770, 66125820, 13794113, 47694557, 17933176 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 801299035785166, 1733292596726131, 1664508947088596, 467749120991922, 1647498584535623 #else 6490062, 11940286, 25495923, 25828072, 8668372, 24803116, 3367602, 6970005, 65417799, 24549641 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 903105258014366, 427141894933047, 561187017169777, 1884330244401954, 1914145708422219 #else 1656478, 13457317, 15370807, 6364910, 13605745, 8362338, 47934242, 28078708, 50312267, 28522993 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1344191060517578, 1960935031767890, 1518838929955259, 1781502350597190, 1564784025565682 #else 44835530, 20030007, 67044178, 29220208, 48503227, 22632463, 46537798, 26546453, 67009010, 23317098 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 673723351748086, 1979969272514923, 1175287312495508, 1187589090978666, 1881897672213940 #else 17747446, 10039260, 19368299, 29503841, 46478228, 17513145, 31992682, 17696456, 37848500, 28042460 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1917185587363432, 1098342571752737, 5935801044414, 2000527662351839, 1538640296181569 #else 31932008, 28568291, 47496481, 16366579, 22023614, 88450, 11371999, 29810185, 4882241, 22927527 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2495540013192, 678856913479236, 224998292422872, 219635787698590, 1972465269000940 #else 29796488, 37186, 19818052, 10115756, 55279832, 3352735, 18551198, 3272828, 61917932, 29392022 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 271413961212179, 1353052061471651, 344711291283483, 2014925838520662, 2006221033113941 #else 12501267, 4044383, 58495907, 20162046, 34678811, 5136598, 47878486, 30024734, 330069, 29895023 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 194583029968109, 514316781467765, 829677956235672, 1676415686873082, 810104584395840 #else 6384877, 2899513, 17807477, 7663917, 64749976, 12363164, 25366522, 24980540, 66837568, 12071498 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1980510813313589, 1948645276483975, 152063780665900, 129968026417582, 256984195613935 #else 58743349, 29511910, 25133447, 29037077, 60897836, 2265926, 34339246, 1936674, 61949167, 3829362 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1860190562533102, 1936576191345085, 461100292705964, 1811043097042830, 957486749306835 #else 28425966, 27718999, 66531773, 28857233, 52891308, 6870929, 7921550, 26986645, 26333139, 14267664 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 796664815624365, 1543160838872951, 1500897791837765, 1667315977988401, 599303877030711 #else 56041645, 11871230, 27385719, 22994888, 62522949, 22365119, 10004785, 24844944, 45347639, 8930323 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1151480509533204, 2136010406720455, 738796060240027, 319298003765044, 1150614464349587 #else 45911060, 17158396, 25654215, 31829035, 12282011, 11008919, 1541940, 4757911, 40617363, 17145491 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1731069268103150, 735642447616087, 1364750481334268, 417232839982871, 927108269127661 #else 13537262, 25794942, 46504023, 10961926, 61186044, 20336366, 53952279, 6217253, 51165165, 13814989 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1017222050227968, 1987716148359, 2234319589635701, 621282683093392, 2132553131763026 #else 49686272, 15157789, 18705543, 29619, 24409717, 33293956, 27361680, 9257833, 65152338, 31777517 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1567828528453324, 1017807205202360, 565295260895298, 829541698429100, 307243822276582 #else 42063564, 23362465, 15366584, 15166509, 54003778, 8423555, 37937324, 12361134, 48422886, 4578289 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 249079270936248, 1501514259790706, 947909724204848, 944551802437487, 552658763982480 #else 24579768, 3711570, 1342322, 22374306, 40103728, 14124955, 44564335, 14074918, 21964432, 8235257 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2089966982947227, 1854140343916181, 2151980759220007, 2139781292261749, 158070445864917 #else 60580251, 31142934, 9442965, 27628844, 12025639, 32067012, 64127349, 31885225, 13006805, 2355433 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1338766321464554, 1906702607371284, 1519569445519894, 115384726262267, 1393058953390992 #else 50803946, 19949172, 60476436, 28412082, 16974358, 22643349, 27202043, 1719366, 1141648, 20758196 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1364621558265400, 1512388234908357, 1926731583198686, 2041482526432505, 920401122333774 #else 54244920, 20334445, 58790597, 22536340, 60298718, 28710537, 13475065, 30420460, 32674894, 13715045 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1884844597333588, 601480070269079, 620203503079537, 1079527400117915, 1202076693132015 #else 11423316, 28086373, 32344215, 8962751, 24989809, 9241752, 53843611, 16086211, 38367983, 17912338 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 840922919763324, 727955812569642, 1303406629750194, 522898432152867, 294161410441865 #else 65699196, 12530727, 60740138, 10847386, 19531186, 19422272, 55399715, 7791793, 39862921, 4383346 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 353760790835310, 1598361541848743, 1122905698202299, 1922533590158905, 419107700666580 #else 38137966, 5271446, 65842855, 23817442, 54653627, 16732598, 62246457, 28647982, 27193556, 6245191 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 359856369838236, 180914355488683, 861726472646627, 218807937262986, 575626773232501 #else 51914908, 5362277, 65324971, 2695833, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 755467689082474, 909202735047934, 730078068932500, 936309075711518, 2007798262842972 #else 54476394, 11257345, 34415870, 13548176, 66387860, 10879010, 31168030, 13952092, 37537372, 29918525 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1609384177904073, 362745185608627, 1335318541768201, 800965770436248, 547877979267412 #else 3877321, 23981693, 32416691, 5405324, 56104457, 19897796, 3759768, 11935320, 5611860, 8164018 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 984339177776787, 815727786505884, 1645154585713747, 1659074964378553, 1686601651984156 #else 50833043, 14667796, 15906460, 12155291, 44997715, 24514713, 32003001, 24722143, 5773084, 25132323 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1697863093781930, 599794399429786, 1104556219769607, 830560774794755, 12812858601017 #else 43320746, 25300131, 1950874, 8937633, 18686727, 16459170, 66203139, 12376319, 31632953, 190926 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1168737550514982, 897832437380552, 463140296333799, 302564600022547, 2008360505135501 #else 42515238, 17415546, 58684872, 13378745, 14162407, 6901328, 58820115, 4508563, 41767309, 29926903 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1856930662813910, 678090852002597, 1920179140755167, 1259527833759868, 55540971895511 #else 8884438, 27670423, 6023973, 10104341, 60227295, 28612898, 18722940, 18768427, 65436375, 827624 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1158643631044921, 476554103621892, 178447851439725, 1305025542653569, 103433927680625 #else 34388281, 17265135, 34605316, 7101209, 13354605, 2659080, 65308289, 19446395, 42230385, 1541285 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2176793111709008, 1576725716350391, 2009350167273523, 2012390194631546, 2125297410909580 #else 2901328, 32436745, 3880375, 23495044, 49487923, 29941650, 45306746, 29986950, 20456844, 31669399 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 825403285195098, 2144208587560784, 1925552004644643, 1915177840006985, 1015952128947864 #else 27019610, 12299467, 53450576, 31951197, 54247203, 28692960, 47568713, 28538373, 29439640, 15138866 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1807108316634472, 1534392066433717, 347342975407218, 1153820745616376, 7375003497471 #else 21536104, 26928012, 34661045, 22864223, 44700786, 5175813, 61688824, 17193268, 7779327, 109896 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 983061001799725, 431211889901241, 2201903782961093, 817393911064341, 2214616493042167 #else 30279725, 14648750, 59063993, 6425557, 13639621, 32810923, 28698389, 12180118, 23177719, 33000357 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 228567918409756, 865093958780220, 358083886450556, 159617889659320, 1360637926292598 #else 26572828, 3405927, 35407164, 12890904, 47843196, 5335865, 60615096, 2378491, 4439158, 20275085 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 234147501399755, 2229469128637390, 2175289352258889, 1397401514549353, 1885288963089922 #else 44392139, 3489069, 57883598, 33221678, 18875721, 32414337, 14819433, 20822905, 49391106, 28092994 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1111762412951562, 252849572507389, 1048714233823341, 146111095601446, 1237505378776770 #else 62052362, 16566550, 15953661, 3767752, 56672365, 15627059, 66287910, 2177224, 8550082, 18440267 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1113790697840279, 1051167139966244, 1045930658550944, 2011366241542643, 1686166824620755 #else 48635543, 16596774, 66727204, 15663610, 22860960, 15585581, 39264755, 29971692, 43848403, 25125843 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1054097349305049, 1872495070333352, 182121071220717, 1064378906787311, 100273572924182 #else 34628313, 15707274, 58902952, 27902350, 29464557, 2713815, 44383727, 15860481, 45206294, 1494192 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1306410853171605, 1627717417672447, 50983221088417, 1109249951172250, 870201789081392 #else 47546773, 19467038, 41524991, 24254879, 13127841, 759709, 21923482, 16529112, 8742704, 12967017 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 104233794644221, 1548919791188248, 2224541913267306, 2054909377116478, 1043803389015153 #else 38643965, 1553204, 32536856, 23080703, 42417258, 33148257, 58194238, 30620535, 37205105, 15553882 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 216762189468802, 707284285441622, 190678557969733, 973969342604308, 1403009538434867 #else 21877890, 3230008, 9881174, 10539357, 62311749, 2841331, 11543572, 14513274, 19375923, 20906471 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1279024291038477, 344776835218310, 273722096017199, 1834200436811442, 634517197663804 #else 8832269, 19058947, 13253510, 5137575, 5037871, 4078777, 24880818, 27331716, 2862652, 9455043 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 343805853118335, 1302216857414201, 566872543223541, 2051138939539004, 321428858384280 #else 29306751, 5123106, 20245049, 19404543, 9592565, 8447059, 65031740, 30564351, 15511448, 4789663 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 470067171324852, 1618629234173951, 2000092177515639, 7307679772789, 1117521120249968 #else 46429108, 7004546, 8824831, 24119455, 63063159, 29803695, 61354101, 108892, 23513200, 16652362 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 278151578291475, 1810282338562947, 1771599529530998, 1383659409671631, 685373414471841 #else 33852691, 4144781, 62632835, 26975308, 10770038, 26398890, 60458447, 20618131, 48789665, 10212859 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 577009397403102, 1791440261786291, 2177643735971638, 174546149911960, 1412505077782326 #else 2756062, 8598110, 7383731, 26694540, 22312758, 32449420, 21179800, 2600940, 57120566, 21047965 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 893719721537457, 1201282458018197, 1522349501711173, 58011597740583, 1130406465887139 #else 42463153, 13317461, 36659605, 17900503, 21365573, 22684775, 11344423, 864440, 64609187, 16844368 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 412607348255453, 1280455764199780, 2233277987330768, 14180080401665, 331584698417165 #else 40676061, 6148328, 49924452, 19080277, 18782928, 33278435, 44547329, 211299, 2719757, 4940997 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 262483770854550, 990511055108216, 526885552771698, 571664396646158, 354086190278723 #else 65784982, 3911312, 60160120, 14759764, 37081714, 7851206, 21690126, 8518463, 26699843, 5276295 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1820352417585487, 24495617171480, 1547899057533253, 10041836186225, 480457105094042 #else 53958991, 27125364, 9396248, 365013, 24703301, 23065493, 1321585, 149635, 51656090, 7159368 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2023310314989233, 637905337525881, 2106474638900687, 557820711084072, 1687858215057826 #else 9987761, 30149673, 17507961, 9505530, 9731535, 31388918, 22356008, 8312176, 22477218, 25151047 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1144168702609745, 604444390410187, 1544541121756138, 1925315550126027, 626401428894002 #else 18155857, 17049442, 19744715, 9006923, 15154154, 23015456, 24256459, 28689437, 44560690, 9334108 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1922168257351784, 2018674099908659, 1776454117494445, 956539191509034, 36031129147635 #else 2986088, 28642539, 10776627, 30080588, 10620589, 26471229, 45695018, 14253544, 44521715, 536905 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 544644538748041, 1039872944430374, 876750409130610, 710657711326551, 1216952687484972 #else 4377737, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, 18134008 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 58242421545916, 2035812695641843, 2118491866122923, 1191684463816273, 46921517454099 #else 47766460, 867879, 9277171, 30335973, 52677291, 31567988, 19295825, 17757482, 6378259, 699185 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 272268252444639, 1374166457774292, 2230115177009552, 1053149803909880, 1354288411641016 #else 7895007, 4057113, 60027092, 20476675, 49222032, 33231305, 66392824, 15693154, 62063800, 20180469 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1857910905368338, 1754729879288912, 885945464109877, 1516096106802166, 1602902393369811 #else 59371282, 27685029, 52542544, 26147512, 11385653, 13201616, 31730678, 22591592, 63190227, 23885106 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1193437069800958, 901107149704790, 999672920611411, 477584824802207, 364239578697845 #else 10188286, 17783598, 59772502, 13427542, 22223443, 14896287, 30743455, 7116568, 45322357, 5427592 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 886299989548838, 1538292895758047, 1590564179491896, 1944527126709657, 837344427345298 #else 696102, 13206899, 27047647, 22922350, 15285304, 23701253, 10798489, 28975712, 19236242, 12477404 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 754558365378305, 1712186480903618, 1703656826337531, 750310918489786, 518996040250900 #else 55879425, 11243795, 50054594, 25513566, 66320635, 25386464, 63211194, 11180503, 43939348, 7733643 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1309847803895382, 1462151862813074, 211370866671570, 1544595152703681, 1027691798954090 #else 17800790, 19518253, 40108434, 21787760, 23887826, 3149671, 23466177, 23016261, 10322026, 15313801 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 803217563745370, 1884799722343599, 1357706345069218, 2244955901722095, 730869460037413 #else 26246234, 11968874, 32263343, 28085704, 6830754, 20231401, 51314159, 33452449, 42659621, 10890803 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 689299471295966, 1831210565161071, 1375187341585438, 1106284977546171, 1893781834054269 #else 35743198, 10271362, 54448239, 27287163, 16690206, 20491888, 52126651, 16484930, 25180797, 28219548 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 696351368613042, 1494385251239250, 738037133616932, 636385507851544, 927483222611406 #else 66522290, 10376443, 34522450, 22268075, 19801892, 10997610, 2276632, 9482883, 316878, 13820577 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1949114198209333, 1104419699537997, 783495707664463, 1747473107602770, 2002634765788641 #else 57226037, 29044064, 64993357, 16457135, 56008783, 11674995, 30756178, 26039378, 30696929, 29841583 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1607325776830197, 530883941415333, 1451089452727895, 1581691157083423, 496100432831154 #else 32988917, 23951020, 12499365, 7910787, 56491607, 21622917, 59766047, 23569034, 34759346, 7392472 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1068900648804224, 2006891997072550, 1134049269345549, 1638760646180091, 2055396084625778 #else 58253184, 15927860, 9866406, 29905021, 64711949, 16898650, 36699387, 24419436, 25112946, 30627788 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2222475519314561, 1870703901472013, 1884051508440561, 1344072275216753, 1318025677799069 #else 64604801, 33117465, 25621773, 27875660, 15085041, 28074555, 42223985, 20028237, 5537437, 19640113 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 155711679280656, 681100400509288, 389811735211209, 2135723811340709, 408733211204125 #else 55883280, 2320284, 57524584, 10149186, 33664201, 5808647, 52232613, 31824764, 31234589, 6090599 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 7813206966729, 194444201427550, 2071405409526507, 1065605076176312, 1645486789731291 #else 57475529, 116425, 26083934, 2897444, 60744427, 30866345, 609720, 15878753, 60138459, 24519663 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 16625790644959, 1647648827778410, 1579910185572704, 436452271048548, 121070048451050 #else 39351007, 247743, 51914090, 24551880, 23288160, 23542496, 43239268, 6503645, 20650474, 1804084 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1037263028552531, 568385780377829, 297953104144430, 1558584511931211, 2238221839292471 #else 39519059, 15456423, 8972517, 8469608, 15640622, 4439847, 3121995, 23224719, 27842615, 33352104 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 190565267697443, 672855706028058, 338796554369226, 337687268493904, 853246848691734 #else 51801891, 2839643, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, 55733782, 12714368 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1763863028400139, 766498079432444, 1321118624818005, 69494294452268, 858786744165651 #else 20807691, 26283607, 29286140, 11421711, 39232341, 19686201, 45881388, 1035545, 47375635, 12796919 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1292056768563024, 1456632109855638, 1100631247050184, 1386133165675321, 1232898350193752 #else 12076880, 19253146, 58323862, 21705509, 42096072, 16400683, 49517369, 20654993, 3480664, 18371617 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 366253102478259, 525676242508811, 1449610995265438, 1183300845322183, 185960306491545 #else 34747315, 5457596, 28548107, 7833186, 7303070, 21600887, 42745799, 17632556, 33734809, 2771024 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 28315355815982, 460422265558930, 1799675876678724, 1969256312504498, 1051823843138725 #else 45719598, 421931, 26597266, 6860826, 22486084, 26817260, 49971378, 29344205, 42556581, 15673396 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 156914999361983, 1606148405719949, 1665208410108430, 317643278692271, 1383783705665320 #else 46924223, 2338215, 19788685, 23933476, 63107598, 24813538, 46837679, 4733253, 3727144, 20619984 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 54684536365732, 2210010038536222, 1194984798155308, 535239027773705, 1516355079301361 #else 6120100, 814863, 55314462, 32931715, 6812204, 17806661, 2019593, 7975683, 31123697, 22595451 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1484387703771650, 198537510937949, 2186282186359116, 617687444857508, 647477376402122 #else 30069250, 22119100, 30434653, 2958439, 18399564, 32578143, 12296868, 9204260, 50676426, 9648164 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2147715541830533, 500032538445817, 646380016884826, 352227855331122, 1488268620408052 #else 32705413, 32003455, 30705657, 7451065, 55303258, 9631812, 3305266, 5248604, 41100532, 22176930 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 159386186465542, 1877626593362941, 618737197060512, 1026674284330807, 1158121760792685 #else 17219846, 2375039, 35537917, 27978816, 47649184, 9219902, 294711, 15298639, 2662509, 17257359 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1744544377739822, 1964054180355661, 1685781755873170, 2169740670377448, 1286112621104591 #else 65935918, 25995736, 62742093, 29266687, 45762450, 25120105, 32087528, 32331655, 32247247, 19164571 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 81977249784993, 1667943117713086, 1668983819634866, 1605016835177615, 1353960708075544 #else 14312609, 1221556, 17395390, 24854289, 62163122, 24869796, 38911119, 23916614, 51081240, 20175586 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1602253788689063, 439542044889886, 2220348297664483, 657877410752869, 157451572512238 #else 65680039, 23875441, 57873182, 6549686, 59725795, 33085767, 23046501, 9803137, 17597934, 2346211 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1029287186166717, 65860128430192, 525298368814832, 1491902500801986, 1461064796385400 #else 18510781, 15337574, 26171504, 981392, 44867312, 7827555, 43617730, 22231079, 3059832, 21771562 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 408216988729246, 2121095722306989, 913562102267595, 1879708920318308, 241061448436731 #else 10141598, 6082907, 17829293, 31606789, 9830091, 13613136, 41552228, 28009845, 33606651, 3592095 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1185483484383269, 1356339572588553, 584932367316448, 102132779946470, 1792922621116791 #else 33114149, 17665080, 40583177, 20211034, 33076704, 8716171, 1151462, 1521897, 66126199, 26716628 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1966196870701923, 2230044620318636, 1425982460745905, 261167817826569, 46517743394330 #else 34169699, 29298616, 23947180, 33230254, 34035889, 21248794, 50471177, 3891703, 26353178, 693168 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 107077591595359, 884959942172345, 27306869797400, 2224911448949390, 964352058245223 #else 30374239, 1595580, 50224825, 13186930, 4600344, 406904, 9585294, 33153764, 31375463, 14369965 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1730194207717538, 431790042319772, 1831515233279467, 1372080552768581, 1074513929381760 #else 52738210, 25781902, 1510300, 6434173, 48324075, 27291703, 32732229, 20445593, 17901440, 16011505 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1450880638731607, 1019861580989005, 1229729455116861, 1174945729836143, 826083146840706 #else 18171223, 21619806, 54608461, 15197121, 56070717, 18324396, 47936623, 17508055, 8764034, 12309598 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1899935429242705, 1602068751520477, 940583196550370, 82431069053859, 1540863155745696 #else 5975889, 28311244, 47649501, 23872684, 55567586, 14015781, 43443107, 1228318, 17544096, 22960650 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2136688454840028, 2099509000964294, 1690800495246475, 1217643678575476, 828720645084218 #else 5811932, 31839139, 3442886, 31285122, 48741515, 25194890, 49064820, 18144304, 61543482, 12348899 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 765548025667841, 462473984016099, 998061409979798, 546353034089527, 2212508972466858 #else 35709185, 11407554, 25755363, 6891399, 63851926, 14872273, 42259511, 8141294, 56476330, 32968952 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 46575283771160, 892570971573071, 1281983193144090, 1491520128287375, 75847005908304 #else 54433560, 694025, 62032719, 13300343, 14015258, 19103038, 57410191, 22225381, 30944592, 1130208 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1801436127943107, 1734436817907890, 1268728090345068, 167003097070711, 2233597765834956 #else 8247747, 26843490, 40546482, 25845122, 52706924, 18905521, 4652151, 2488540, 23550156, 33283200 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1997562060465113, 1048700225534011, 7615603985628, 1855310849546841, 2242557647635213 #else 17294297, 29765994, 7026747, 15626851, 22990044, 113481, 2267737, 27646286, 66700045, 33416712 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1161017320376250, 492624580169043, 2169815802355237, 976496781732542, 1770879511019629 #else 16091066, 17300506, 18599251, 7340678, 2137637, 32332775, 63744702, 14550935, 3260525, 26388161 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1357044908364776, 729130645262438, 1762469072918979, 1365633616878458, 181282906404941 #else 62198760, 20221544, 18550886, 10864893, 50649539, 26262835, 44079994, 20349526, 54360141, 2701325 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1080413443139865, 1155205815510486, 1848782073549786, 622566975152580, 124965574467971 #else 58534169, 16099414, 4629974, 17213908, 46322650, 27548999, 57090500, 9276970, 11329923, 1862132 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1184526762066993, 247622751762817, 692129017206356, 820018689412496, 2188697339828085 #else 14763057, 17650824, 36190593, 3689866, 3511892, 10313526, 45157776, 12219230, 58070901, 32614131 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2020536369003019, 202261491735136, 1053169669150884, 2056531979272544, 778165514694311 #else 8894987, 30108338, 6150752, 3013931, 301220, 15693451, 35127648, 30644714, 51670695, 11595569 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 237404399610207, 1308324858405118, 1229680749538400, 720131409105291, 1958958863624906 #else 15214943, 3537601, 40870142, 19495559, 4418656, 18323671, 13947275, 10730794, 53619402, 29190761 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 515583508038846, 17656978857189, 1717918437373989, 1568052070792483, 46975803123923 #else 64570558, 7682792, 32759013, 263109, 37124133, 25598979, 44776739, 23365796, 977107, 699994 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 281527309158085, 36970532401524, 866906920877543, 2222282602952734, 1289598729589882 #else 54642373, 4195083, 57897332, 550903, 51543527, 12917919, 19118110, 33114591, 36574330, 19216518 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1278207464902042, 494742455008756, 1262082121427081, 1577236621659884, 1888786707293291 #else 31788442, 19046775, 4799988, 7372237, 8808585, 18806489, 9408236, 23502657, 12493931, 28145115 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 353042527954210, 1830056151907359, 1111731275799225, 174960955838824, 404312815582675 #else 41428258, 5260743, 47873055, 27269961, 63412921, 16566086, 27218280, 2607121, 29375955, 6024730 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2064251142068628, 1666421603389706, 1419271365315441, 468767774902855, 191535130366583 #else 842132, 30759739, 62345482, 24831616, 26332017, 21148791, 11831879, 6985184, 57168503, 2854095 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1716987058588002, 1859366439773457, 1767194234188234, 64476199777924, 1117233614485261 #else 62261602, 25585100, 2516241, 27706719, 9695690, 26333246, 16512644, 960770, 12121869, 16648078 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 984292135520292, 135138246951259, 2220652137473167, 1722843421165029, 190482558012909 #else 51890212, 14667095, 53772635, 2013716, 30598287, 33090295, 35603941, 25672367, 20237805, 2838411 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 298845952651262, 1166086588952562, 1179896526238434, 1347812759398693, 1412945390096208 #else 47820798, 4453151, 15298546, 17376044, 22115042, 17581828, 12544293, 20083975, 1068880, 21054527 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1143239552672925, 906436640714209, 2177000572812152, 2075299936108548, 325186347798433 #else 57549981, 17035596, 33238497, 13506958, 30505848, 32439836, 58621956, 30924378, 12521377, 4845654 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 721024854374772, 684487861263316, 1373438744094159, 2193186935276995, 1387043709851261 #else 38910324, 10744107, 64150484, 10199663, 7759311, 20465832, 3409347, 32681032, 60626557, 20668561 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 418098668140962, 715065997721283, 1471916138376055, 2168570337288357, 937812682637044 #else 43547042, 6230155, 46726851, 10655313, 43068279, 21933259, 10477733, 32314216, 63995636, 13974497 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1043584187226485, 2143395746619356, 2209558562919611, 482427979307092, 847556718384018 #else 12966261, 15550616, 35069916, 31939085, 21025979, 32924988, 5642324, 7188737, 18895762, 12629579 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1248731221520759, 1465200936117687, 540803492710140, 52978634680892, 261434490176109 #else 14741879, 18607545, 22177207, 21833195, 1279740, 8058600, 11758140, 789443, 32195181, 3895677 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1057329623869501, 620334067429122, 461700859268034, 2012481616501857, 297268569108938 #else 10758205, 15755439, 62598914, 9243697, 62229442, 6879878, 64904289, 29988312, 58126794, 4429646 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1055352180870759, 1553151421852298, 1510903185371259, 1470458349428097, 1226259419062731 #else 64654951, 15725972, 46672522, 23143759, 61304955, 22514211, 59972993, 21911536, 18047435, 18272689 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1492988790301668, 790326625573331, 1190107028409745, 1389394752159193, 1620408196604194 #else 41935844, 22247266, 29759955, 11776784, 44846481, 17733976, 10993113, 20703595, 49488162, 24145963 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 47000654413729, 1004754424173864, 1868044813557703, 173236934059409, 588771199737015 #else 21987233, 700364, 42603816, 14972007, 59334599, 27836036, 32155025, 2581431, 37149879, 8773374 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 30498470091663, 1082245510489825, 576771653181956, 806509986132686, 1317634017056939 #else 41540495, 454462, 53896929, 16126714, 25240068, 8594567, 20656846, 12017935, 59234475, 19634276 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 420308055751555, 1493354863316002, 165206721528088, 1884845694919786, 2065456951573059 #else 6028163, 6263078, 36097058, 22252721, 66289944, 2461771, 35267690, 28086389, 65387075, 30777706 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1115636332012334, 1854340990964155, 83792697369514, 1972177451994021, 457455116057587 #else 54829870, 16624276, 987579, 27631834, 32908202, 1248608, 7719845, 29387734, 28408819, 6816612 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1698968457310898, 1435137169051090, 1083661677032510, 938363267483709, 340103887207182 #else 56750770, 25316602, 19549650, 21385210, 22082622, 16147817, 20613181, 13982702, 56769294, 5067942 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1995325341336574, 911500251774648, 164010755403692, 855378419194762, 1573601397528842 #else 36602878, 29732664, 12074680, 13582412, 47230892, 2443950, 47389578, 12746131, 5331210, 23448488 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 241719380661528, 310028521317150, 1215881323380194, 1408214976493624, 2141142156467363 #else 30528792, 3601899, 65151774, 4619784, 39747042, 18118043, 24180792, 20984038, 27679907, 31905504 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1315157046163473, 727368447885818, 1363466668108618, 1668921439990361, 1398483384337907 #else 9402385, 19597367, 32834042, 10838634, 40528714, 20317236, 26653273, 24868867, 22611443, 20839026 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 75029678299646, 1015388206460473, 1849729037055212, 1939814616452984, 444404230394954 #else 22190590, 1118029, 22736441, 15130463, 36648172, 27563110, 19189624, 28905490, 4854858, 6622139 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2053597130993710, 2024431685856332, 2233550957004860, 2012407275509545, 872546993104440 #else 58798126, 30600981, 58846284, 30166382, 56707132, 33282502, 13424425, 29987205, 26404408, 13001963 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1217269667678610, 599909351968693, 1390077048548598, 1471879360694802, 739586172317596 #else 35867026, 18138731, 64114613, 8939345, 11562230, 20713762, 41044498, 21932711, 51703708, 11020692 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1718318639380794, 1560510726633958, 904462881159922, 1418028351780052, 94404349451937 #else 1866042, 25604943, 59210214, 23253421, 12483314, 13477547, 3175636, 21130269, 28761761, 1406734 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2132502667405250, 214379346175414, 1502748313768060, 1960071701057800, 1353971822643138 #else 66660290, 31776765, 13018550, 3194501, 57528444, 22392694, 24760584, 29207344, 25577410, 20175752 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 319394212043702, 2127459436033571, 717646691535162, 663366796076914, 318459064945314 #else 42818486, 4759344, 66418211, 31701615, 2066746, 10693769, 37513074, 9884935, 57739938, 4745409 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 405989424923593, 1960452633787083, 667349034401665, 1492674260767112, 1451061489880787 #else 57967561, 6049713, 47577803, 29213020, 35848065, 9944275, 51646856, 22242579, 10931923, 21622501 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 947085906234007, 323284730494107, 1485778563977200, 728576821512394, 901584347702286 #else 50547351, 14112679, 59096219, 4817317, 59068400, 22139825, 44255434, 10856640, 46638094, 13434653 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1575783124125742, 2126210792434375, 1569430791264065, 1402582372904727, 1891780248341114 #else 22759470, 23480998, 50342599, 31683009, 13637441, 23386341, 1765143, 20900106, 28445306, 28189722 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 838432205560695, 1997703511451664, 1018791879907867, 1662001808174331, 78328132957753 #else 29875063, 12493613, 2795536, 29768102, 1710619, 15181182, 56913147, 24765756, 9074233, 1167180 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 739152638255629, 2074935399403557, 505483666745895, 1611883356514088, 628654635394878 #else 40903181, 11014232, 57266213, 30918946, 40200743, 7532293, 48391976, 24018933, 3843902, 9367684 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1822054032121349, 643057948186973, 7306757352712, 577249257962099, 284735863382083 #else 56139269, 27150720, 9591133, 9582310, 11349256, 108879, 16235123, 8601684, 66969667, 4242894 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1366558556363930, 1448606567552086, 1478881020944768, 165803179355898, 1115718458123498 #else 22092954, 20363309, 65066070, 21585919, 32186752, 22037044, 60534522, 2470659, 39691498, 16625500 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 204146226972102, 1630511199034723, 2215235214174763, 174665910283542, 956127674017216 #else 56051142, 3042015, 13770083, 24296510, 584235, 33009577, 59338006, 2602724, 39757248, 14247412 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1562934578796716, 1070893489712745, 11324610642270, 958989751581897, 2172552325473805 #else 6314156, 23289540, 34336361, 15957556, 56951134, 168749, 58490057, 14290060, 27108877, 32373552 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1770564423056027, 735523631664565, 1326060113795289, 1509650369341127, 65892421582684 #else 58522267, 26383465, 13241781, 10960156, 34117849, 19759835, 33547975, 22495543, 39960412, 981873 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 623682558650637, 1337866509471512, 990313350206649, 1314236615762469, 1164772974270275 #else 22833421, 9293594, 34459416, 19935764, 57971897, 14756818, 44180005, 19583651, 56629059, 17356469 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 223256821462517, 723690150104139, 1000261663630601, 933280913953265, 254872671543046 #else 59340277, 3326785, 38997067, 10783823, 19178761, 14905060, 22680049, 13906969, 51175174, 3797898 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1969087237026041, 624795725447124, 1335555107635969, 2069986355593023, 1712100149341902 #else 21721337, 29341686, 54902740, 9310181, 63226625, 19901321, 23740223, 30845200, 20491982, 25512280 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1236103475266979, 1837885883267218, 1026072585230455, 1025865513954973, 1801964901432134 #else 9209251, 18419377, 53852306, 27386633, 66377847, 15289672, 25947805, 15286587, 30997318, 26851369 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1115241013365517, 1712251818829143, 2148864332502771, 2096001471438138, 2235017246626125 #else 7392013, 16618386, 23946583, 25514540, 53843699, 32020573, 52911418, 31232855, 17649997, 33304352 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1299268198601632, 2047148477845621, 2165648650132450, 1612539282026145, 514197911628890 #else 57807776, 19360604, 30609525, 30504889, 41933794, 32270679, 51867297, 24028707, 64875610, 7662145 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 118352772338543, 1067608711804704, 1434796676193498, 1683240170548391, 230866769907437 #else 49550191, 1763593, 33994528, 15908609, 37067994, 21380136, 7335079, 25082233, 63934189, 3440182 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1850689576796636, 1601590730430274, 1139674615958142, 1954384401440257, 76039205311 #else 47219164, 27577423, 42997570, 23865561, 10799742, 16982475, 40449, 29122597, 4862399, 1133 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1723387471374172, 997301467038410, 533927635123657, 20928644693965, 1756575222802513 #else 34252636, 25680474, 61686474, 14860949, 50789833, 7956141, 7258061, 311861, 36513873, 26175010 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2146711623855116, 503278928021499, 625853062251406, 1109121378393107, 1033853809911861 #else 63335436, 31988495, 28985339, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 571005965509422, 2005213373292546, 1016697270349626, 56607856974274, 914438579435146 #else 62726958, 8508651, 47210498, 29880007, 61124410, 15149969, 53795266, 843522, 45233802, 13626196 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1346698876211176, 2076651707527589, 1084761571110205, 265334478828406, 1068954492309671 #else 2281448, 20067377, 56193445, 30944521, 1879357, 16164207, 56324982, 3953791, 13340839, 15928663 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1769967932677654, 1695893319756416, 1151863389675920, 1781042784397689, 400287774418285 #else 31727126, 26374577, 48671360, 25270779, 2875792, 17164102, 41838969, 26539605, 43656557, 5964752 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1851867764003121, 403841933237558, 820549523771987, 761292590207581, 1743735048551143 #else 4100401, 27594980, 49929526, 6017713, 48403027, 12227140, 40424029, 11344143, 2538215, 25983677 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 410915148140008, 2107072311871739, 1004367461876503, 99684895396761, 1180818713503224 #else 57675240, 6123112, 11159803, 31397824, 30016279, 14966241, 46633881, 1485420, 66479608, 17595569 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 285945406881439, 648174397347453, 1098403762631981, 1366547441102991, 1505876883139217 #else 40304287, 4260918, 11851389, 9658551, 35091757, 16367491, 46903439, 20363143, 11659921, 22439314 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 672095903120153, 1675918957959872, 636236529315028, 1569297300327696, 2164144194785875 #else 26180377, 10015009, 36264640, 24973138, 5418196, 9480663, 2231568, 23384352, 33100371, 32248261 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1902708175321798, 1035343530915438, 1178560808893263, 301095684058146, 1280977479761118 #else 15121094, 28352561, 56718958, 15427820, 39598927, 17561924, 21670946, 4486675, 61177054, 19088051 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1615357281742403, 404257611616381, 2160201349780978, 1160947379188955, 1578038619549541 #else 16166467, 24070699, 56004733, 6023907, 35182066, 32189508, 2340059, 17299464, 56373093, 23514607 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2013087639791217, 822734930507457, 1785668418619014, 1668650702946164, 389450875221715 #else 28042865, 29997343, 54982337, 12259705, 63391366, 26608532, 6766452, 24864833, 18036435, 5803270 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 453918449698368, 106406819929001, 2072540975937135, 308588860670238, 1304394580755385 #else 66291264, 6763911, 11803561, 1585585, 10958447, 30883267, 23855390, 4598332, 60949433, 19436993 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1295082798350326, 2091844511495996, 1851348972587817, 3375039684596, 789440738712837 #else 36077558, 19298237, 17332028, 31170912, 31312681, 27587249, 696308, 50292, 47013125, 11763583 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2083069137186154, 848523102004566, 993982213589257, 1405313299916317, 1532824818698468 #else 66514282, 31040148, 34874710, 12643979, 12650761, 14811489, 665117, 20940800, 47335652, 22840869 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1495961298852430, 1397203457344779, 1774950217066942, 139302743555696, 66603584342787 #else 30464590, 22291560, 62981387, 20819953, 19835326, 26448819, 42712688, 2075772, 50088707, 992470 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1782411379088302, 1096724939964781, 27593390721418, 542241850291353, 1540337798439873 #else 18357166, 26559999, 7766381, 16342475, 37783946, 411173, 14578841, 8080033, 55534529, 22952821 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 693543956581437, 171507720360750, 1557908942697227, 1074697073443438, 1104093109037196 #else 19598397, 10334610, 12555054, 2555664, 18821899, 23214652, 21873262, 16014234, 26224780, 16452269 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 345288228393419, 1099643569747172, 134881908403743, 1740551994106740, 248212179299770 #else 36884939, 5145195, 5944548, 16385966, 3976735, 2009897, 55731060, 25936245, 46575034, 3698649 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 231429562203065, 1526290236421172, 2021375064026423, 1520954495658041, 806337791525116 #else 14187449, 3448569, 56472628, 22743496, 44444983, 30120835, 7268409, 22663988, 27394300, 12015369 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1079623667189886, 872403650198613, 766894200588288, 2163700860774109, 2023464507911816 #else 19695742, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, 32241655, 53849736, 30151970 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 854645372543796, 1936406001954827, 151460662541253, 825325739271555, 1554306377287556 #else 30860084, 12735208, 65220619, 28854697, 50133957, 2256939, 58942851, 12298311, 58558340, 23160969 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1497138821904622, 1044820250515590, 1742593886423484, 1237204112746837, 849047450816987 #else 61389038, 22309106, 65198214, 15569034, 26642876, 25966672, 61319509, 18435777, 62132699, 12651792 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 667962773375330, 1897271816877105, 1399712621683474, 1143302161683099, 2081798441209593 #else 64260450, 9953420, 11531313, 28271553, 26895122, 20857343, 53990043, 17036529, 9768697, 31021214 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 127147851567005, 1936114012888110, 1704424366552046, 856674880716312, 716603621335359 #else 42389405, 1894650, 66821166, 28850346, 15348718, 25397902, 32767512, 12765450, 4940095, 10678226 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1072409664800960, 2146937497077528, 1508780108920651, 935767602384853, 1112800433544068 #else 18860224, 15980149, 48121624, 31991861, 40875851, 22482575, 59264981, 13944023, 42736516, 16582018 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 333549023751292, 280219272863308, 2104176666454852, 1036466864875785, 536135186520207 #else 51604604, 4970267, 37215820, 4175592, 46115652, 31354675, 55404809, 15444559, 56105103, 7989036 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 373666279883137, 146457241530109, 304116267127857, 416088749147715, 1258577131183391 #else 31490433, 5568061, 64696061, 2182382, 34772017, 4531685, 35030595, 6200205, 47422751, 18754260 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1186115062588401, 2251609796968486, 1098944457878953, 1153112761201374, 1791625503417267 #else 49800177, 17674491, 35586086, 33551600, 34221481, 16375548, 8680158, 17182719, 28550067, 26697300 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1870078460219737, 2129630962183380, 852283639691142, 292865602592851, 401904317342226 #else 38981977, 27866340, 16837844, 31733974, 60258182, 12700015, 37068883, 4364037, 1155602, 5988841 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1361070124828035, 815664541425524, 1026798897364671, 1951790935390647, 555874891834790 #else 21890435, 20281525, 54484852, 12154348, 59276991, 15300495, 23148983, 29083951, 24618406, 8283181 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1546301003424277, 459094500062839, 1097668518375311, 1780297770129643, 720763293687608 #else 33972757, 23041680, 9975415, 6841041, 35549071, 16356535, 3070187, 26528504, 1466168, 10740210 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1212405311403990, 1536693382542438, 61028431067459, 1863929423417129, 1223219538638038 #else 65599446, 18066246, 53605478, 22898515, 32799043, 909394, 53169961, 27774712, 34944214, 18227391 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1294303766540260, 1183557465955093, 882271357233093, 63854569425375, 2213283684565087 #else 3960804, 19286629, 39082773, 17636380, 47704005, 13146867, 15567327, 951507, 63848543, 32980496 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 339050984211414, 601386726509773, 413735232134068, 966191255137228, 1839475899458159 #else 24740822, 5052253, 37014733, 8961360, 25877428, 6165135, 42740684, 14397371, 59728495, 27410326 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 235605972169408, 2174055643032978, 1538335001838863, 1281866796917192, 1815940222628465 #else 38220480, 3510802, 39005586, 32395953, 55870735, 22922977, 51667400, 19101303, 65483377, 27059617 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1632352921721536, 1833328609514701, 2092779091951987, 1923956201873226, 2210068022482919 #else 793280, 24323954, 8836301, 27318725, 39747955, 31184838, 33152842, 28669181, 57202663, 32932579 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 35271216625062, 1712350667021807, 983664255668860, 98571260373038, 1232645608559836 #else 5666214, 525582, 20782575, 25516013, 42570364, 14657739, 16099374, 1468826, 60937436, 18367850 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1998172393429622, 1798947921427073, 784387737563581, 1589352214827263, 1589861734168180 #else 62249590, 29775088, 64191105, 26806412, 7778749, 11688288, 36704511, 23683193, 65549940, 23690785 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1733739258725305, 31715717059538, 201969945218860, 992093044556990, 1194308773174556 #else 10896313, 25834728, 824274, 472601, 47648556, 3009586, 25248958, 14783338, 36527388, 17796587 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 846415389605137, 746163495539180, 829658752826080, 592067705956946, 957242537821393 #else 10566929, 12612572, 35164652, 11118702, 54475488, 12362878, 21752402, 8822496, 24003793, 14264025 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1758148849754419, 619249044817679, 168089007997045, 1371497636330523, 1867101418880350 #else 27713843, 26198459, 56100623, 9227529, 27050101, 2504721, 23886875, 20436907, 13958494, 27821979 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 326633984209635, 261759506071016, 1700682323676193, 1577907266349064, 1217647663383016 #else 43627235, 4867225, 39861736, 3900520, 29838369, 25342141, 35219464, 23512650, 7340520, 18144364 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1714182387328607, 1477856482074168, 574895689942184, 2159118410227270, 1555532449716575 #else 4646495, 25543308, 44342840, 22021777, 23184552, 8566613, 31366726, 32173371, 52042079, 23179239 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 853828206885131, 998498946036955, 1835887550391235, 207627336608048, 258363815956050 #else 49838347, 12723031, 50115803, 14878793, 21619651, 27356856, 27584816, 3093888, 58265170, 3849920 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 141141474651677, 1236728744905256, 643101419899887, 1646615130509173, 1208239602291765 #else 58043933, 2103171, 25561640, 18428694, 61869039, 9582957, 32477045, 24536477, 5002293, 18004173 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1501663228068911, 1354879465566912, 1444432675498247, 897812463852601, 855062598754348 #else 55051311, 22376525, 21115584, 20189277, 8808711, 21523724, 16489529, 13378448, 41263148, 12741425 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 714380763546606, 1032824444965790, 1774073483745338, 1063840874947367, 1738680636537158 #else 61162478, 10645102, 36197278, 15390283, 63821882, 26435754, 24306471, 15852464, 28834118, 25908360 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1640635546696252, 633168953192112, 2212651044092396, 30590958583852, 368515260889378 #else 49773116, 24447374, 42577584, 9434952, 58636780, 32971069, 54018092, 455840, 20461858, 5491305 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1171650314802029, 1567085444565577, 1453660792008405, 757914533009261, 1619511342778196 #else 13669229, 17458950, 54626889, 23351392, 52539093, 21661233, 42112877, 11293806, 38520660, 24132599 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 420958967093237, 971103481109486, 2169549185607107, 1301191633558497, 1661514101014240 #else 28497909, 6272777, 34085870, 14470569, 8906179, 32328802, 18504673, 19389266, 29867744, 24758489 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 907123651818302, 1332556122804146, 1824055253424487, 1367614217442959, 1982558335973172 #else 50901822, 13517195, 39309234, 19856633, 24009063, 27180541, 60741263, 20379039, 22853428, 29542421 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1121533090144639, 1021251337022187, 110469995947421, 1511059774758394, 2110035908131662 #else 24191359, 16712145, 53177067, 15217830, 14542237, 1646131, 18603514, 22516545, 12876622, 31441985 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 303213233384524, 2061932261128138, 352862124777736, 40828818670255, 249879468482660 #else 17902668, 4518229, 66697162, 30725184, 26878216, 5258055, 54248111, 608396, 16031844, 3723494 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 856559257852200, 508517664949010, 1378193767894916, 1723459126947129, 1962275756614521 #else 38476072, 12763727, 46662418, 7577503, 33001348, 20536687, 17558841, 25681542, 23896953, 29240187 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1445691340537320, 40614383122127, 402104303144865, 485134269878232, 1659439323587426 #else 47103464, 21542479, 31520463, 605201, 2543521, 5991821, 64163800, 7229063, 57189218, 24727572 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 20057458979482, 1183363722525800, 2140003847237215, 2053873950687614, 2112017736174909 #else 28816026, 298879, 38943848, 17633493, 19000927, 31888542, 54428030, 30605106, 49057085, 31471516 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2228654250927986, 1483591363415267, 1368661293910956, 1076511285177291, 526650682059608 #else 16000882, 33209536, 3493091, 22107234, 37604268, 20394642, 12577739, 16041268, 47393624, 7847706 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 709481497028540, 531682216165724, 316963769431931, 1814315888453765, 258560242424104 #else 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, 34252933, 27035413, 57088296, 3852847 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1053447823660455, 1955135194248683, 1010900954918985, 1182614026976701, 1240051576966610 #else 55678375, 15697595, 45987307, 29133784, 5386313, 15063598, 16514493, 17622322, 29330898, 18478208 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1957943897155497, 1788667368028035, 137692910029106, 1039519607062, 826404763313028 #else 41609129, 29175637, 51885955, 26653220, 16615730, 2051784, 3303702, 15490, 39560068, 12314390 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1848942433095597, 1582009882530495, 1849292741020143, 1068498323302788, 2001402229799484 #else 15683501, 27551389, 18109119, 23573784, 15337967, 27556609, 50391428, 15921865, 16103996, 29823217 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1528282417624269, 2142492439828191, 2179662545816034, 362568973150328, 1591374675250271 #else 43939021, 22773182, 13588191, 31925625, 63310306, 32479502, 47835256, 5402698, 37293151, 23713330 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 160026679434388, 232341189218716, 2149181472355545, 598041771119831, 183859001910173 #else 23190676, 2384583, 34394524, 3462153, 37205209, 32025299, 55842007, 8911516, 41903005, 2739712 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2013278155187349, 662660471354454, 793981225706267, 411706605985744, 804490933124791 #else 21374101, 30000182, 33584214, 9874410, 15377179, 11831242, 33578960, 6134906, 4931255, 11987849 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2051892037280204, 488391251096321, 2230187337030708, 930221970662692, 679002758255210 #else 67101132, 30575573, 50885377, 7277596, 105524, 33232381, 35628324, 13861387, 37032554, 10117929 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1530723630438670, 875873929577927, 341560134269988, 449903119530753, 1055551308214179 #else 37607694, 22809559, 40945095, 13051538, 41483300, 5089642, 60783361, 6704078, 12890019, 15728940 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1461835919309432, 1955256480136428, 180866187813063, 1551979252664528, 557743861963950 #else 45136504, 21783052, 66157804, 29135591, 14704839, 2695116, 903376, 23126293, 12885166, 8311031 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 359179641731115, 1324915145732949, 902828372691474, 294254275669987, 1887036027752957 #else 49592363, 5352193, 10384213, 19742774, 7506450, 13453191, 26423267, 4384730, 1888765, 28119028 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2043271609454323, 2038225437857464, 1317528426475850, 1398989128982787, 2027639881006861 #else 41291507, 30447119, 53614264, 30371925, 30896458, 19632703, 34857219, 20846562, 47644429, 30214188 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2072902725256516, 312132452743412, 309930885642209, 996244312618453, 1590501300352303 #else 43500868, 30888657, 66582772, 4651135, 5765089, 4618330, 6092245, 14845197, 17151279, 23700316 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1397254305160710, 695734355138021, 2233992044438756, 1776180593969996, 1085588199351115 #else 42278406, 20820711, 51942885, 10367249, 37577956, 33289075, 22825804, 26467153, 50242379, 16176524 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 440567051331029, 254894786356681, 493869224930222, 1556322069683366, 1567456540319218 #else 43525589, 6564960, 20063689, 3798228, 62368686, 7359224, 2006182, 23191006, 38362610, 23356922 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1950722461391320, 1907845598854797, 1822757481635527, 2121567704750244, 73811931471221 #else 56482264, 29068029, 53788301, 28429114, 3432135, 27161203, 23632036, 31613822, 32808309, 1099883 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 387139307395758, 2058036430315676, 1220915649965325, 1794832055328951, 1230009312169328 #else 15030958, 5768825, 39657628, 30667132, 60681485, 18193060, 51830967, 26745081, 2051440, 18328567 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1765973779329517, 659344059446977, 19821901606666, 1301928341311214, 1116266004075885 #else 63746541, 26315059, 7517889, 9824992, 23555850, 295369, 5148398, 19400244, 44422509, 16633659 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1127572801181483, 1224743760571696, 1276219889847274, 1529738721702581, 1589819666871853 #else 4577067, 16802144, 13249840, 18250104, 19958762, 19017158, 18559669, 22794883, 8402477, 23690159 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2181229378964934, 2190885205260020, 1511536077659137, 1246504208580490, 668883326494241 #else 38702534, 32502850, 40318708, 32646733, 49896449, 22523642, 9453450, 18574360, 17983009, 9967138 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 437866655573314, 669026411194768, 81896997980338, 523874406393178, 245052060935236 #else 41346370, 6524721, 26585488, 9969270, 24709298, 1220360, 65430874, 7806336, 17507396, 3651560 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1975438052228868, 1071801519999806, 594652299224319, 1877697652668809, 1489635366987285 #else 56688388, 29436320, 14584638, 15971087, 51340543, 8861009, 26556809, 27979875, 48555541, 22197296 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 958592545673770, 233048016518599, 851568750216589, 567703851596087, 1740300006094761 #else 2839082, 14284142, 4029895, 3472686, 14402957, 12689363, 40466743, 8459446, 61503401, 25932490 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2014540178270324, 192672779514432, 213877182641530, 2194819933853411, 1716422829364835 #else 62269556, 30018987, 9744960, 2871048, 25113978, 3187018, 41998051, 32705365, 17258083, 25576693 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1540769606609725, 2148289943846077, 1597804156127445, 1230603716683868, 815423458809453 #else 18164541, 22959256, 49953981, 32012014, 19237077, 23809137, 23357532, 18337424, 26908269, 12150756 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1738560251245018, 1779576754536888, 1783765347671392, 1880170990446751, 1088225159617541 #else 36843994, 25906566, 5112248, 26517760, 65609056, 26580174, 43167, 28016731, 34806789, 16215818 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 659303913929492, 1956447718227573, 1830568515922666, 841069049744408, 1669607124206368 #else 60209940, 9824393, 54804085, 29153342, 35711722, 27277596, 32574488, 12532905, 59605792, 24879084 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1143465490433355, 1532194726196059, 1093276745494697, 481041706116088, 2121405433561163 #else 39765323, 17038963, 39957339, 22831480, 946345, 16291093, 254968, 7168080, 21676107, 31611404 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1686424298744462, 1451806974487153, 266296068846582, 1834686947542675, 1720762336132256 #else 21260942, 25129680, 50276977, 21633609, 43430902, 3968120, 63456915, 27338965, 63552672, 25641356 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 889217026388959, 1043290623284660, 856125087551909, 1669272323124636, 1603340330827879 #else 16544735, 13250366, 50304436, 15546241, 62525861, 12757257, 64646556, 24874095, 48201831, 23891632 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1206396181488998, 333158148435054, 1402633492821422, 1120091191722026, 1945474114550509 #else 64693606, 17976703, 18312302, 4964443, 51836334, 20900867, 26820650, 16690659, 25459437, 28989823 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 766720088232571, 1512222781191002, 1189719893490790, 2091302129467914, 2141418006894941 #else 41964155, 11425019, 28423002, 22533875, 60963942, 17728207, 9142794, 31162830, 60676445, 31909614 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 419663647306612, 1998875112167987, 1426599870253707, 1154928355379510, 486538532138187 #else 44004212, 6253475, 16964147, 29785560, 41994891, 21257994, 39651638, 17209773, 6335691, 7249989 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 938160078005954, 1421776319053174, 1941643234741774, 180002183320818, 1414380336750546 #else 36775618, 13979674, 7503222, 21186118, 55152142, 28932738, 36836594, 2682241, 25993170, 21075909 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 398001940109652, 1577721237663248, 1012748649830402, 1540516006905144, 1011684812884559 #else 4364628, 5930691, 32304656, 23509878, 59054082, 15091130, 22857016, 22955477, 31820367, 15075278 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1653276489969630, 6081825167624, 1921777941170836, 1604139841794531, 861211053640641 #else 31879134, 24635739, 17258760, 90626, 59067028, 28636722, 24162787, 23903546, 49138625, 12833044 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 996661541407379, 1455877387952927, 744312806857277, 139213896196746, 1000282908547789 #else 19073683, 14851414, 42705695, 21694263, 7625277, 11091125, 47489674, 2074448, 57694925, 14905376 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1450817495603008, 1476865707053229, 1030490562252053, 620966950353376, 1744760161539058 #else 24483648, 21618865, 64589997, 22007013, 65555733, 15355505, 41826784, 9253128, 27628530, 25998952 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 559728410002599, 37056661641185, 2038622963352006, 1637244893271723, 1026565352238948 #else 17597607, 8340603, 19355617, 552187, 26198470, 30377849, 4593323, 24396850, 52997988, 15297015 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 962165956135846, 1116599660248791, 182090178006815, 1455605467021751, 196053588803284 #else 510886, 14337390, 35323607, 16638631, 6328095, 2713355, 46891447, 21690211, 8683220, 2921426 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 796863823080135, 1897365583584155, 420466939481601, 2165972651724672, 932177357788289 #else 18606791, 11874196, 27155355, 28272950, 43077121, 6265445, 41930624, 32275507, 4674689, 13890525 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 877047233620632, 1375632631944375, 643773611882121, 660022738847877, 19353932331831 #else 13609624, 13069022, 39736503, 20498523, 24360585, 9592974, 14977157, 9835105, 4389687, 288396 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2216943882299338, 394841323190322, 2222656898319671, 558186553950529, 1077236877025190 #else 9922506, 33035038, 13613106, 5883594, 48350519, 33120168, 54804801, 8317627, 23388070, 16052080 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 801118384953213, 1914330175515892, 574541023311511, 1471123787903705, 1526158900256288 #else 12719997, 11937594, 35138804, 28525742, 26900119, 8561328, 46953177, 21921452, 52354592, 22741539 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 949617889087234, 2207116611267331, 912920039141287, 501158539198789, 62362560771472 #else 15961858, 14150409, 26716931, 32888600, 44314535, 13603568, 11829573, 7467844, 38286736, 929274 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1474518386765335, 1760793622169197, 1157399790472736, 1622864308058898, 165428294422792 #else 11038231, 21972036, 39798381, 26237869, 56610336, 17246600, 43629330, 24182562, 45715720, 2465073 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1961673048027128, 102619413083113, 1051982726768458, 1603657989805485, 1941613251499678 #else 20017144, 29231206, 27915241, 1529148, 12396362, 15675764, 13817261, 23896366, 2463390, 28932292 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1401939116319266, 335306339903072, 72046196085786, 862423201496006, 850518754531384 #else 50749986, 20890520, 55043680, 4996453, 65852442, 1073571, 9583558, 12851107, 4003896, 12673717 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1234706593321979, 1083343891215917, 898273974314935, 1640859118399498, 157578398571149 #else 65377275, 18398561, 63845933, 16143081, 19294135, 13385325, 14741514, 24450706, 7903885, 2348101 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1143483057726416, 1992614991758919, 674268662140796, 1773370048077526, 674318359920189 #else 24536016, 17039225, 12715591, 29692277, 1511292, 10047386, 63266518, 26425272, 38731325, 10048126 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1835401379538542, 173900035308392, 818247630716732, 1762100412152786, 1021506399448291 #else 54486638, 27349611, 30718824, 2591312, 56491836, 12192839, 18873298, 26257342, 34811107, 15221631 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1506632088156630, 2127481795522179, 513812919490255, 140643715928370, 442476620300318 #else 40630742, 22450567, 11546243, 31701949, 9180879, 7656409, 45764914, 2095754, 29769758, 6593415 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2056683376856736, 219094741662735, 2193541883188309, 1841182310235800, 556477468664293 #else 35114656, 30646970, 4176911, 3264766, 12538965, 32686321, 26312344, 27435754, 30958053, 8292160 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1315019427910827, 1049075855992603, 2066573052986543, 266904467185534, 2040482348591520 #else 31429803, 19595316, 29173531, 15632448, 12174511, 30794338, 32808830, 3977186, 26143136, 30405556 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 94096246544434, 922482381166992, 24517828745563, 2139430508542503, 2097139044231004 #else 22648882, 1402143, 44308880, 13746058, 7936347, 365344, 58440231, 31879998, 63350620, 31249806 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 537697207950515, 1399352016347350, 1563663552106345, 2148749520888918, 549922092988516 #else 51616947, 8012312, 64594134, 20851969, 43143017, 23300402, 65496150, 32018862, 50444388, 8194477 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1747985413252434, 680511052635695, 1809559829982725, 594274250930054, 201673170745982 #else 27338066, 26047012, 59694639, 10140404, 48082437, 26964542, 27277190, 8855376, 28572286, 3005164 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 323583936109569, 1973572998577657, 1192219029966558, 79354804385273, 1374043025560347 #else 26287105, 4821776, 25476601, 29408529, 63344350, 17765447, 49100281, 1182478, 41014043, 20474836 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 213277331329947, 416202017849623, 1950535221091783, 1313441578103244, 2171386783823658 #else 59937691, 3178079, 23970071, 6201893, 49913287, 29065239, 45232588, 19571804, 32208682, 32356184 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 189088804229831, 993969372859110, 895870121536987, 1547301535298256, 1477373024911350 #else 50451143, 2817642, 56822502, 14811297, 6024667, 13349505, 39793360, 23056589, 39436278, 22014573 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1620578418245010, 541035331188469, 2235785724453865, 2154865809088198, 1974627268751826 #else 15941010, 24148500, 45741813, 8062054, 31876073, 33315803, 51830470, 32110002, 15397330, 29424239 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1346805451740245, 1350981335690626, 942744349501813, 2155094562545502, 1012483751693409 #else 8934485, 20068965, 43822466, 20131190, 34662773, 14047985, 31170398, 32113411, 39603297, 15087183 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2107080134091762, 1132567062788208, 1824935377687210, 769194804343737, 1857941799971888 #else 48751602, 31397940, 24524912, 16876564, 15520426, 27193656, 51606457, 11461895, 16788528, 27685490 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1074666112436467, 249279386739593, 1174337926625354, 1559013532006480, 1472287775519121 #else 65161459, 16013772, 21750665, 3714552, 49707082, 17498998, 63338576, 23231111, 31322513, 21938797 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1872620123779532, 1892932666768992, 1921559078394978, 1270573311796160, 1438913646755037 #else 21426636, 27904214, 53460576, 28206894, 38296674, 28633461, 48833472, 18933017, 13040861, 21441484 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 837390187648199, 1012253300223599, 989780015893987, 1351393287739814, 328627746545550 #else 11293895, 12478086, 39972463, 15083749, 37801443, 14748871, 14555558, 20137329, 1613710, 4896935 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1028328827183114, 1711043289969857, 1350832470374933, 1923164689604327, 1495656368846911 #else 41213962, 15323293, 58619073, 25496531, 25967125, 20128972, 2825959, 28657387, 43137087, 22287016 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1900828492104143, 430212361082163, 687437570852799, 832514536673512, 1685641495940794 #else 51184079, 28324551, 49665331, 6410663, 3622847, 10243618, 20615400, 12405433, 43355834, 25118015 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 842632847936398, 605670026766216, 290836444839585, 163210774892356, 2213815011799645 #else 60017550, 12556207, 46917512, 9025186, 50036385, 4333800, 4378436, 2432030, 23097949, 32988414 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1176336383453996, 1725477294339771, 12700622672454, 678015708818208, 162724078519879 #else 4565804, 17528778, 20084411, 25711615, 1724998, 189254, 24767264, 10103221, 48596551, 2424777 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1448049969043497, 1789411762943521, 385587766217753, 90201620913498, 832999441066823 #else 366633, 21577626, 8173089, 26664313, 30788633, 5745705, 59940186, 1344108, 63466311, 12412658 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 516086333293313, 2240508292484616, 1351669528166508, 1223255565316488, 750235824427138 #else 43107073, 7690285, 14929416, 33386175, 34898028, 20141445, 24162696, 18227928, 63967362, 11179384 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1263624896582495, 1102602401673328, 526302183714372, 2152015839128799, 1483839308490010 #else 18289503, 18829478, 8056944, 16430056, 45379140, 7842513, 61107423, 32067534, 48424218, 22110928 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 442991718646863, 1599275157036458, 1925389027579192, 899514691371390, 350263251085160 #else 476239, 6601091, 60956074, 23831056, 17503544, 28690532, 27672958, 13403813, 11052904, 5219329 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1689713572022143, 593854559254373, 978095044791970, 1985127338729499, 1676069120347625 #else 20678527, 25178694, 34436965, 8849122, 62099106, 14574751, 31186971, 29580702, 9014761, 24975376 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1557207018622683, 340631692799603, 1477725909476187, 614735951619419, 2033237123746766 #else 53464795, 23204192, 51146355, 5075807, 65594203, 22019831, 34006363, 9160279, 8473550, 30297594 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 968764929340557, 1225534776710944, 662967304013036, 1155521416178595, 791142883466590 #else 24900749, 14435722, 17209120, 18261891, 44516588, 9878982, 59419555, 17218610, 42540382, 11788947 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1487081286167458, 993039441814934, 1792378982844640, 698652444999874, 2153908693179754 #else 63990690, 22159237, 53306774, 14797440, 9652448, 26708528, 47071426, 10410732, 42540394, 32095740 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1123181311102823, 685575944875442, 507605465509927, 1412590462117473, 568017325228626 #else 51449703, 16736705, 44641714, 10215877, 58011687, 7563910, 11871841, 21049238, 48595538, 8464117 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 560258797465417, 2193971151466401, 1824086900849026, 579056363542056, 1690063960036441 #else 43708233, 8348506, 52522913, 32692717, 63158658, 27181012, 14325288, 8628612, 33313881, 25183915 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1918407319222416, 353767553059963, 1930426334528099, 1564816146005724, 1861342381708096 #else 46921872, 28586496, 22367355, 5271547, 66011747, 28765593, 42303196, 23317577, 58168128, 27736162 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2131325168777276, 1176636658428908, 1756922641512981, 1390243617176012, 1966325177038383 #else 60160060, 31759219, 34483180, 17533252, 32635413, 26180187, 15989196, 20716244, 28358191, 29300528 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2063958120364491, 2140267332393533, 699896251574968, 273268351312140, 375580724713232 #else 43547083, 30755372, 34757181, 31892468, 57961144, 10429266, 50471180, 4072015, 61757200, 5596588 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2024297515263178, 416959329722687, 1079014235017302, 171612225573183, 1031677520051053 #else 38872266, 30164383, 12312895, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2033900009388450, 1744902869870788, 2190580087917640, 1949474984254121, 231049754293748 #else 59865506, 30307471, 62515396, 26001078, 66980936, 32642186, 66017961, 29049440, 42448372, 3442909 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 343868674606581, 550155864008088, 1450580864229630, 481603765195050, 896972360018042 #else 36898293, 5124042, 14181784, 8197961, 18964734, 21615339, 22597930, 7176455, 48523386, 13365929 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2151139328380127, 314745882084928, 59756825775204, 1676664391494651, 2048348075599360 #else 59231455, 32054473, 8324672, 4690079, 6261860, 890446, 24538107, 24984246, 57419264, 30522764 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1528930066340597, 1605003907059576, 1055061081337675, 1458319101947665, 1234195845213142 #else 25008885, 22782833, 62803832, 23916421, 16265035, 15721635, 683793, 21730648, 15723478, 18390951 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 830430507734812, 1780282976102377, 1425386760709037, 362399353095425, 2168861579799910 #else 57448220, 12374378, 40101865, 26528283, 59384749, 21239917, 11879681, 5400171, 519526, 32318556 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1155762232730333, 980662895504006, 2053766700883521, 490966214077606, 510405877041357 #else 22258397, 17222199, 59239046, 14613015, 44588609, 30603508, 46754982, 7315966, 16648397, 7605640 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1683750316716132, 652278688286128, 1221798761193539, 1897360681476669, 319658166027343 #else 59027556, 25089834, 58885552, 9719709, 19259459, 18206220, 23994941, 28272877, 57640015, 4763277 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 618808732869972, 72755186759744, 2060379135624181, 1730731526741822, 48862757828238 #else 45409620, 9220968, 51378240, 1084136, 41632757, 30702041, 31088446, 25789909, 55752334, 728111 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1463171970593505, 1143040711767452, 614590986558883, 1409210575145591, 1882816996436803 #else 26047201, 21802961, 60208540, 17032633, 24092067, 9158119, 62835319, 20998873, 37743427, 28056159 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2230133264691131, 563950955091024, 2042915975426398, 827314356293472, 672028980152815 #else 17510331, 33231575, 5854288, 8403524, 17133918, 30441820, 38997856, 12327944, 10750447, 10014012 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 264204366029760, 1654686424479449, 2185050199932931, 2207056159091748, 506015669043634 #else 56796096, 3936951, 9156313, 24656749, 16498691, 32559785, 39627812, 32887699, 3424690, 7540221 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1784446333136569, 1973746527984364, 334856327359575, 1156769775884610, 1023950124675478 #else 30322361, 26590322, 11361004, 29411115, 7433303, 4989748, 60037442, 17237212, 57864598, 15258045 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2065270940578383, 31477096270353, 306421879113491, 181958643936686, 1907105536686083 #else 13054543, 30774935, 19155473, 469045, 54626067, 4566041, 5631406, 2711395, 1062915, 28418087 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1496516440779464, 1748485652986458, 872778352227340, 818358834654919, 97932669284220 #else 47868616, 22299832, 37599834, 26054466, 61273100, 13005410, 61042375, 12194496, 32960380, 1459310 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 471636015770351, 672455402793577, 1804995246884103, 1842309243470804, 1501862504981682 #else 19852015, 7027924, 23669353, 10020366, 8586503, 26896525, 394196, 27452547, 18638002, 22379495 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1013216974933691, 538921919682598, 1915776722521558, 1742822441583877, 1886550687916656 #else 31395515, 15098109, 26581030, 8030562, 50580950, 28547297, 9012485, 25970078, 60465776, 28111795 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2094270000643336, 303971879192276, 40801275554748, 649448917027930, 1818544418535447 #else 57916680, 31207054, 65111764, 4529533, 25766844, 607986, 67095642, 9677542, 34813975, 27098423 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2241737709499165, 549397817447461, 838180519319392, 1725686958520781, 1705639080897747 #else 64664349, 33404494, 29348901, 8186665, 1873760, 12489863, 36174285, 25714739, 59256019, 25416002 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1216074541925116, 50120933933509, 1565829004133810, 721728156134580, 349206064666188 #else 51872508, 18120922, 7766469, 746860, 26346930, 23332670, 39775412, 10754587, 57677388, 5203575 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 948617110470858, 346222547451945, 1126511960599975, 1759386906004538, 493053284802266 #else 31834314, 14135496, 66338857, 5159117, 20917671, 16786336, 59640890, 26216907, 31809242, 7347066 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1454933046815146, 874696014266362, 1467170975468588, 1432316382418897, 2111710746366763 #else 57502122, 21680191, 20414458, 13033986, 13716524, 21862551, 19797969, 21343177, 15192875, 31466942 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2105387117364450, 1996463405126433, 1303008614294500, 851908115948209, 1353742049788635 #else 54445282, 31372712, 1168161, 29749623, 26747876, 19416341, 10609329, 12694420, 33473243, 20172328 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 750300956351719, 1487736556065813, 15158817002104, 1511998221598392, 971739901354129 #else 33184999, 11180355, 15832085, 22169002, 65475192, 225883, 15089336, 22530529, 60973201, 14480052 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1874648163531693, 2124487685930551, 1810030029384882, 918400043048335, 586348627300650 #else 31308717, 27934434, 31030839, 31657333, 15674546, 26971549, 5496207, 13685227, 27595050, 8737275 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1235084464747900, 1166111146432082, 1745394857881591, 1405516473883040, 4463504151617 #else 46790012, 18404192, 10933842, 17376410, 8335351, 26008410, 36100512, 20943827, 26498113, 66511 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1663810156463827, 327797390285791, 1341846161759410, 1964121122800605, 1747470312055380 #else 22644435, 24792703, 50437087, 4884561, 64003250, 19995065, 30540765, 29267685, 53781076, 26039336 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 660005247548233, 2071860029952887, 1358748199950107, 911703252219107, 1014379923023831 #else 39091017, 9834844, 18617207, 30873120, 63706907, 20246925, 8205539, 13585437, 49981399, 15115438 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2206641276178231, 1690587809721504, 1600173622825126, 2156096097634421, 1106822408548216 #else 23711543, 32881517, 31206560, 25191721, 6164646, 23844445, 33572981, 32128335, 8236920, 16492939 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1344788193552206, 1949552134239140, 1735915881729557, 675891104100469, 1834220014427292 #else 43198286, 20038905, 40809380, 29050590, 25005589, 25867162, 19574901, 10071562, 6708380, 27332008 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1920949492387964, 158885288387530, 70308263664033, 626038464897817, 1468081726101009 #else 2101372, 28624378, 19702730, 2367575, 51681697, 1047674, 5301017, 9328700, 29955601, 21876122 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 622221042073383, 1210146474039168, 1742246422343683, 1403839361379025, 417189490895736 #else 3096359, 9271816, 45488000, 18032587, 52260867, 25961494, 41216721, 20918836, 57191288, 6216607 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 22727256592983, 168471543384997, 1324340989803650, 1839310709638189, 504999476432775 #else 34493015, 338662, 41913253, 2510421, 37895298, 19734218, 24822829, 27407865, 40341383, 7525078 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1313240518756327, 1721896294296942, 52263574587266, 2065069734239232, 804910473424630 #else 44042215, 19568808, 16133486, 25658254, 63719298, 778787, 66198528, 30771936, 47722230, 11994100 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1337466662091884, 1287645354669772, 2018019646776184, 652181229374245, 898011753211715 #else 21691500, 19929806, 66467532, 19187410, 3285880, 30070836, 42044197, 9718257, 59631427, 13381417 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1969792547910734, 779969968247557, 2011350094423418, 1823964252907487, 1058949448296945 #else 18445390, 29352196, 14979845, 11622458, 65381754, 29971451, 23111647, 27179185, 28535281, 15779576 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 207343737062002, 1118176942430253, 758894594548164, 806764629546266, 1157700123092949 #else 30098034, 3089662, 57874477, 16662134, 45801924, 11308410, 53040410, 12021729, 9955285, 17251076 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1273565321399022, 1638509681964574, 759235866488935, 666015124346707, 897983460943405 #else 9734894, 18977602, 59635230, 24415696, 2060391, 11313496, 48682835, 9924398, 20194861, 13380996 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1717263794012298, 1059601762860786, 1837819172257618, 1054130665797229, 680893204263559 #else 40730762, 25589224, 44941042, 15789296, 49053522, 27385639, 65123949, 15707770, 26342023, 10146099 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2237039662793603, 2249022333361206, 2058613546633703, 149454094845279, 2215176649164582 #else 41091971, 33334488, 21339190, 33513044, 19745255, 30675732, 37471583, 2227039, 21612326, 33008704 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 79472182719605, 1851130257050174, 1825744808933107, 821667333481068, 781795293511946 #else 54031477, 1184227, 23562814, 27583990, 46757619, 27205717, 25764460, 12243797, 46252298, 11649657 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 755822026485370, 152464789723500, 1178207602290608, 410307889503239, 156581253571278 #else 57077370, 11262625, 27384172, 2271902, 26947504, 17556661, 39943, 6114064, 33514190, 2333242 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1418185496130297, 484520167728613, 1646737281442950, 1401487684670265, 1349185550126961 #else 45675257, 21132610, 8119781, 7219913, 45278342, 24538297, 60429113, 20883793, 24350577, 20104431 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1495380034400429, 325049476417173, 46346894893933, 1553408840354856, 828980101835683 #else 62992557, 22282898, 43222677, 4843614, 37020525, 690622, 35572776, 23147595, 8317859, 12352766 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1280337889310282, 2070832742866672, 1640940617225222, 2098284908289951, 450929509534434 #else 18200138, 19078521, 34021104, 30857812, 43406342, 24451920, 43556767, 31266881, 20712162, 6719373 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 407703353998781, 126572141483652, 286039827513621, 1999255076709338, 2030511179441770 #else 26656189, 6075253, 59250308, 1886071, 38764821, 4262325, 11117530, 29791222, 26224234, 30256974 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1254958221100483, 1153235960999843, 942907704968834, 637105404087392, 1149293270147267 #else 49939907, 18700334, 63713187, 17184554, 47154818, 14050419, 21728352, 9493610, 18620611, 17125804 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 894249020470196, 400291701616810, 406878712230981, 1599128793487393, 1145868722604026 #else 53785524, 13325348, 11432106, 5964811, 18609221, 6062965, 61839393, 23828875, 36407290, 17074774 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1497955250203334, 110116344653260, 1128535642171976, 1900106496009660, 129792717460909 #else 43248326, 22321272, 26961356, 1640861, 34695752, 16816491, 12248508, 28313793, 13735341, 1934062 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 452487513298665, 1352120549024569, 1173495883910956, 1999111705922009, 367328130454226 #else 25089769, 6742589, 17081145, 20148166, 21909292, 17486451, 51972569, 29789085, 45830866, 5473615 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1717539401269642, 1475188995688487, 891921989653942, 836824441505699, 1885988485608364 #else 31883658, 25593331, 1083431, 21982029, 22828470, 13290673, 59983779, 12469655, 29111212, 28103418 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1241784121422547, 187337051947583, 1118481812236193, 428747751936362, 30358898927325 #else 24244947, 18504025, 40845887, 2791539, 52111265, 16666677, 24367466, 6388839, 56813277, 452382 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2022432361201842, 1088816090685051, 1977843398539868, 1854834215890724, 564238862029357 #else 41468082, 30136590, 5217915, 16224624, 19987036, 29472163, 42872612, 27639183, 15766061, 8407814 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 938868489100585, 1100285072929025, 1017806255688848, 1957262154788833, 152787950560442 #else 46701865, 13990230, 15495425, 16395525, 5377168, 15166495, 58191841, 29165478, 59040954, 2276717 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 867319417678923, 620471962942542, 226032203305716, 342001443957629, 1761675818237336 #else 30157899, 12924066, 49396814, 9245752, 19895028, 3368142, 43281277, 5096218, 22740376, 26251015 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1295072362439987, 931227904689414, 1355731432641687, 922235735834035, 892227229410209 #else 2041139, 19298082, 7783686, 13876377, 41161879, 20201972, 24051123, 13742383, 51471265, 13295221 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1680989767906154, 535362787031440, 2136691276706570, 1942228485381244, 1267350086882274 #else 33338218, 25048699, 12532112, 7977527, 9106186, 31839181, 49388668, 28941459, 62657506, 18884987 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 366018233770527, 432660629755596, 126409707644535, 1973842949591662, 645627343442376 #else 47063583, 5454096, 52762316, 6447145, 28862071, 1883651, 64639598, 29412551, 7770568, 9620597 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 535509430575217, 546885533737322, 1524675609547799, 2138095752851703, 1260738089896827 #else 23208049, 7979712, 33071466, 8149229, 1758231, 22719437, 30945527, 31860109, 33606523, 18786461 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1159906385590467, 2198530004321610, 714559485023225, 81880727882151, 1484020820037082 #else 1439939, 17283952, 66028874, 32760649, 4625401, 10647766, 62065063, 1220117, 30494170, 22113633 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1377485731340769, 2046328105512000, 1802058637158797, 62146136768173, 1356993908853901 #else 62071265, 20526136, 64138304, 30492664, 15640973, 26852766, 40369837, 926049, 65424525, 20220784 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2013612215646735, 1830770575920375, 536135310219832, 609272325580394, 270684344495013 #else 13908495, 30005160, 30919927, 27280607, 45587000, 7989038, 9021034, 9078865, 3353509, 4033511 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1237542585982777, 2228682050256790, 1385281931622824, 593183794882890, 493654978552689 #else 37445433, 18440821, 32259990, 33209950, 24295848, 20642309, 23161162, 8839127, 27485041, 7356032 #endif }}, }, }, { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 47341488007760, 1891414891220257, 983894663308928, 176161768286818, 1126261115179708 #else 9661008, 705443, 11980065, 28184278, 65480320, 14661172, 60762722, 2625014, 28431036, 16782598 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1694030170963455, 502038567066200, 1691160065225467, 949628319562187, 275110186693066 #else 43269631, 25243016, 41163352, 7480957, 49427195, 25200248, 44562891, 14150564, 15970762, 4099461 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1124515748676336, 1661673816593408, 1499640319059718, 1584929449166988, 558148594103306 #else 29262576, 16756590, 26350592, 24760869, 8529670, 22346382, 13617292, 23617289, 11465738, 8317062 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1784525599998356, 1619698033617383, 2097300287550715, 258265458103756, 1905684794832758 #else 41615764, 26591503, 32500199, 24135381, 44070139, 31252209, 14898636, 3848455, 20969334, 28396916 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1288941072872766, 931787902039402, 190731008859042, 2006859954667190, 1005931482221702 #else 46724414, 19206718, 48772458, 13884721, 34069410, 2842113, 45498038, 29904543, 11177094, 14989547 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1465551264822703, 152905080555927, 680334307368453, 173227184634745, 666407097159852 #else 42612143, 21838415, 16959895, 2278463, 12066309, 10137771, 13515641, 2581286, 38621356, 9930239 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2111017076203943, 1378760485794347, 1248583954016456, 1352289194864422, 1895180776543896 #else 49357223, 31456605, 16544299, 20545132, 51194056, 18605350, 18345766, 20150679, 16291480, 28240394 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 171348223915638, 662766099800389, 462338943760497, 466917763340314, 656911292869115 #else 33879670, 2553287, 32678213, 9875984, 8534129, 6889387, 57432090, 6957616, 4368891, 9788741 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 488623681976577, 866497561541722, 1708105560937768, 1673781214218839, 1506146329818807 #else 16660737, 7281060, 56278106, 12911819, 20108584, 25452756, 45386327, 24941283, 16250551, 22443329 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 160425464456957, 950394373239689, 430497123340934, 711676555398832, 320964687779005 #else 47343357, 2390525, 50557833, 14161979, 1905286, 6414907, 4689584, 10604807, 36918461, 4782746 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 988979367990485, 1359729327576302, 1301834257246029, 294141160829308, 29348272277475 #else 65754325, 14736940, 59741422, 20261545, 7710541, 19398842, 57127292, 4383044, 22546403, 437323 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1434382743317910, 100082049942065, 221102347892623, 186982837860588, 1305765053501834 #else 31665558, 21373968, 50922033, 1491338, 48740239, 3294681, 27343084, 2786261, 36475274, 19457415 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2205916462268190, 499863829790820, 961960554686616, 158062762756985, 1841471168298305 #else 52641566, 32870716, 33734756, 7448551, 19294360, 14334329, 47418233, 2355318, 47824193, 27440058 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1191737341426592, 1847042034978363, 1382213545049056, 1039952395710448, 788812858896859 #else 15121312, 17758270, 6377019, 27523071, 56310752, 20596586, 18952176, 15496498, 37728731, 11754227 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1346965964571152, 1291881610839830, 2142916164336056, 786821641205979, 1571709146321039 #else 64471568, 20071356, 8488726, 19250536, 12728760, 31931939, 7141595, 11724556, 22761615, 23420291 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 787164375951248, 202869205373189, 1356590421032140, 1431233331032510, 786341368775957 #else 16918416, 11729663, 49025285, 3022986, 36093132, 20214772, 38367678, 21327038, 32851221, 11717399 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 492448143532951, 304105152670757, 1761767168301056, 233782684697790, 1981295323106089 #else 11166615, 7338049, 60386341, 4531519, 37640192, 26252376, 31474878, 3483633, 65915689, 29523600 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 665807507761866, 1343384868355425, 895831046139653, 439338948736892, 1986828765695105 #else 66923210, 9921304, 31456609, 20017994, 55095045, 13348922, 33142652, 6546660, 47123585, 29606055 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 756096210874553, 1721699973539149, 258765301727885, 1390588532210645, 1212530909934781 #else 34648249, 11266711, 55911757, 25655328, 31703693, 3855903, 58571733, 20721383, 36336829, 18068118 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 852891097972275, 1816988871354562, 1543772755726524, 1174710635522444, 202129090724628 #else 49102387, 12709067, 3991746, 27075244, 45617340, 23004006, 35973516, 17504552, 10928916, 3011958 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1205281565824323, 22430498399418, 992947814485516, 1392458699738672, 688441466734558 #else 60151107, 17960094, 31696058, 334240, 29576716, 14796075, 36277808, 20749251, 18008030, 10258577 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1050627428414972, 1955849529137135, 2171162376368357, 91745868298214, 447733118757826 #else 44660220, 15655568, 7018479, 29144429, 36794597, 32352840, 65255398, 1367119, 25127874, 6671743 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1287181461435438, 622722465530711, 880952150571872, 741035693459198, 311565274989772 #else 29701166, 19180498, 56230743, 9279287, 67091296, 13127209, 21382910, 11042292, 25838796, 4642684 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1003649078149734, 545233927396469, 1849786171789880, 1318943684880434, 280345687170552 #else 46678630, 14955536, 42982517, 8124618, 61739576, 27563961, 30468146, 19653792, 18423288, 4177476 #endif }}, }, }, }; #endif // OPENSSL_SMALL // Bi[i] = (2*i+1)*B static const ge_precomp Bi[8] = { { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563 #else 25967493, 19198397, 29566455, 3660896, 54414519, 4014786, 27544626, 21800161, 61029707, 2047604 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585 #else 54563134, 934261, 64385954, 3049989, 66381436, 9406985, 12720692, 5043384, 19500929, 18085054 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142 #else 58370664, 4489569, 9688441, 18769238, 10184608, 21191052, 29287918, 11864899, 42594502, 29115885 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911 #else 15636272, 23865875, 24204772, 25642034, 616976, 16869170, 27787599, 18782243, 28944399, 32004408 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597 #else 16568933, 4717097, 55552716, 32452109, 15682895, 21747389, 16354576, 21778470, 7689661, 11199574 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707 #else 30464137, 27578307, 55329429, 17883566, 23220364, 15915852, 7512774, 10017326, 49359771, 23634074 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016 #else 10861363, 11473154, 27284546, 1981175, 37044515, 12577860, 32867885, 14515107, 51670560, 10819379 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893 #else 4708026, 6336745, 20377586, 9066809, 55836755, 6594695, 41455196, 12483687, 54440373, 5581305 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339 #else 19563141, 16186464, 37722007, 4097518, 10237984, 29206317, 28542349, 13850243, 43430843, 17738489 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985 #else 5153727, 9909285, 1723747, 30776558, 30523604, 5516873, 19480852, 5230134, 43156425, 18378665 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113 #else 36839857, 30090922, 7665485, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601 #else 28881826, 14381568, 9657904, 3680757, 46927229, 7843315, 35708204, 1370707, 29794553, 32145132 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1802695059465007, 1664899123557221, 593559490740857, 2160434469266659, 927570450755031 #else 44589871, 26862249, 14201701, 24808930, 43598457, 8844725, 18474211, 32192982, 54046167, 13821876 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1725674970513508, 1933645953859181, 1542344539275782, 1767788773573747, 1297447965928905 #else 60653668, 25714560, 3374701, 28813570, 40010246, 22982724, 31655027, 26342105, 18853321, 19333481 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1381809363726107, 1430341051343062, 2061843536018959, 1551778050872521, 2036394857967624 #else 4566811, 20590564, 38133974, 21313742, 59506191, 30723862, 58594505, 23123294, 2207752, 30344648 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1970894096313054, 528066325833207, 1619374932191227, 2207306624415883, 1169170329061080 #else 41954014, 29368610, 29681143, 7868801, 60254203, 24130566, 54671499, 32891431, 35997400, 17421995 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 2070390218572616, 1458919061857835, 624171843017421, 1055332792707765, 433987520732508 #else 25576264, 30851218, 7349803, 21739588, 16472781, 9300885, 3844789, 15725684, 171356, 6466918 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 893653801273833, 1168026499324677, 1242553501121234, 1306366254304474, 1086752658510815 #else 23103977, 13316479, 9739013, 17404951, 817874, 18515490, 8965338, 19466374, 36393951, 16193876 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 213454002618221, 939771523987438, 1159882208056014, 317388369627517, 621213314200687 #else 33587053, 3180712, 64714734, 14003686, 50205390, 17283591, 17238397, 4729455, 49034351, 9256799 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1971678598905747, 338026507889165, 762398079972271, 655096486107477, 42299032696322 #else 41926547, 29380300, 32336397, 5036987, 45872047, 11360616, 22616405, 9761698, 47281666, 630304 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 177130678690680, 1754759263300204, 1864311296286618, 1180675631479880, 1292726903152791 #else 53388152, 2639452, 42871404, 26147950, 9494426, 27780403, 60554312, 17593437, 64659607, 19263131 #endif }}, }, { {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1913163449625248, 460779200291993, 2193883288642314, 1008900146920800, 1721983679009502 #else 63957664, 28508356, 9282713, 6866145, 35201802, 32691408, 48168288, 15033783, 25105118, 25659556 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 1070401523076875, 1272492007800961, 1910153608563310, 2075579521696771, 1191169788841221 #else 42782475, 15950225, 35307649, 18961608, 55446126, 28463506, 1573891, 30928545, 2198789, 17749813 #endif }}, {{ #if defined(BORINGSSL_CURVE25519_64BIT) 692896803108118, 500174642072499, 2068223309439677, 1162190621851337, 1426986007309901 #else 64009494, 10324966, 64867251, 7453182, 61661885, 30818928, 53296841, 17317989, 34647629, 21263748 #endif }}, }, }; ring-0.16.9/third_party/fiat/internal.h000064400000000000000000000076071352416253600162160ustar0000000000000000// The MIT License (MIT) // // Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #ifndef OPENSSL_HEADER_CURVE25519_INTERNAL_H #define OPENSSL_HEADER_CURVE25519_INTERNAL_H #include #include "../../crypto/internal.h" #if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_APPLE) #define BORINGSSL_X25519_NEON // x25519_NEON is defined in asm/x25519-arm.S. void GFp_x25519_NEON(uint8_t out[32], const uint8_t scalar[32], const uint8_t point[32]); #endif #if defined(BORINGSSL_HAS_UINT128) #define BORINGSSL_CURVE25519_64BIT #endif #if defined(BORINGSSL_CURVE25519_64BIT) // An element t, // entries t[0]...t[4], represents the integer t[0]+2^51 t[1]+2^102 t[2]+2^153 // t[3]+2^204 t[4]. // fe limbs are bounded by 1.125*2^51. // fe_loose limbs are bounded by 3.375*2^51. typedef uint64_t fe_limb_t; #define FE_NUM_LIMBS 5 #else // An element t, // entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 // t[3]+2^102 t[4]+...+2^230 t[9]. // fe limbs are bounded by 1.125*2^26,1.125*2^25,1.125*2^26,1.125*2^25,etc. // fe_loose limbs are bounded by 3.375*2^26,3.375*2^25,3.375*2^26,3.375*2^25,etc. typedef uint32_t fe_limb_t; #define FE_NUM_LIMBS 10 #endif // fe means field element. Here the field is \Z/(2^255-19). // Multiplication and carrying produce fe from fe_loose. // Keep in sync with `Elem` and `ELEM_LIMBS` in curve25519/ops.rs. typedef struct fe { fe_limb_t v[FE_NUM_LIMBS]; } fe; // Addition and subtraction produce fe_loose from (fe, fe). // Keep in sync with `Elem` and `ELEM_LIMBS` in curve25519/ops.rs. typedef struct fe_loose { fe_limb_t v[FE_NUM_LIMBS]; } fe_loose; static inline void fe_limbs_copy(fe_limb_t r[], const fe_limb_t a[]) { for (size_t i = 0; i < FE_NUM_LIMBS; ++i) { r[i] = a[i]; } } static inline void fe_limbs_zero(fe_limb_t r[]) { for (size_t i = 0; i < FE_NUM_LIMBS; ++i) { r[i] = 0; } } // ge means group element. // // Here the group is the set of pairs (x,y) of field elements (see fe.h) // satisfying -x^2 + y^2 = 1 + d x^2y^2 // where d = -121665/121666. // // Representations: // ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z // ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT // ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T // ge_precomp (Duif): (y+x,y-x,2dxy) // Keep in sync with `Point` in curve25519/ops.rs. typedef struct { fe X; fe Y; fe Z; } ge_p2; // Keep in sync with `ExtPoint` in curve25519/ops.rs. typedef struct { fe X; fe Y; fe Z; fe T; } ge_p3; typedef struct { fe_loose X; fe_loose Y; fe_loose Z; fe_loose T; } ge_p1p1; typedef struct { fe_loose yplusx; fe_loose yminusx; fe_loose xy2d; } ge_precomp; typedef struct { fe_loose YplusX; fe_loose YminusX; fe_loose Z; fe_loose T2d; } ge_cached; #endif // OPENSSL_HEADER_CURVE25519_INTERNAL_H ring-0.16.9/third_party/fiat/make_curve25519_tables.py000064400000000000000000000156711352416253600206640ustar0000000000000000#!/usr/bin/env python # coding=utf-8 # The MIT License (MIT) # # Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import StringIO import subprocess # Base field Z_p p = 2**255 - 19 def modp_inv(x): return pow(x, p-2, p) # Square root of -1 modp_sqrt_m1 = pow(2, (p-1) // 4, p) # Compute corresponding x-coordinate, with low bit corresponding to # sign, or return None on failure def recover_x(y, sign): if y >= p: return None x2 = (y*y-1) * modp_inv(d*y*y+1) if x2 == 0: if sign: return None else: return 0 # Compute square root of x2 x = pow(x2, (p+3) // 8, p) if (x*x - x2) % p != 0: x = x * modp_sqrt_m1 % p if (x*x - x2) % p != 0: return None if (x & 1) != sign: x = p - x return x # Curve constant d = -121665 * modp_inv(121666) % p # Base point g_y = 4 * modp_inv(5) % p g_x = recover_x(g_y, 0) # Points are represented as affine tuples (x, y). def point_add(P, Q): x1, y1 = P x2, y2 = Q x3 = ((x1*y2 + y1*x2) * modp_inv(1 + d*x1*x2*y1*y2)) % p y3 = ((y1*y2 + x1*x2) * modp_inv(1 - d*x1*x2*y1*y2)) % p return (x3, y3) # Computes Q = s * P def point_mul(s, P): Q = (0, 1) # Neutral element while s > 0: if s & 1: Q = point_add(Q, P) P = point_add(P, P) s >>= 1 return Q def to_bytes(x): ret = bytearray(32) for i in range(len(ret)): ret[i] = x % 256 x >>= 8 assert x == 0 return ret def to_ge_precomp(P): # typedef struct { # fe_loose yplusx; # fe_loose yminusx; # fe_loose xy2d; # } ge_precomp; x, y = P return ((y + x) % p, (y - x) % p, (x * y * 2 * d) % p) def to_base_25_5(x): limbs = (26, 25, 26, 25, 26, 25, 26, 25, 26, 25) ret = [] for l in limbs: ret.append(x & ((1<>= l assert x == 0 return ret def to_base_51(x): ret = [] for _ in range(5): ret.append(x & ((1<<51) - 1)) x >>= 51 assert x == 0 return ret def to_literal(x): ret = "{{\n#if defined(BORINGSSL_CURVE25519_64BIT)\n" ret += ", ".join(map(str, to_base_51(x))) ret += "\n#else\n" ret += ", ".join(map(str, to_base_25_5(x))) ret += "\n#endif\n}}" return ret def main(): d2 = (2 * d) % p small_precomp = bytearray() for i in range(1, 16): s = (i&1) | ((i&2) << (64-1)) | ((i&4) << (128-2)) | ((i&8) << (192-3)) P = point_mul(s, (g_x, g_y)) small_precomp += to_bytes(P[0]) small_precomp += to_bytes(P[1]) large_precomp = [] for i in range(32): large_precomp.append([]) for j in range(8): P = point_mul((j + 1) << (i * 8), (g_x, g_y)) large_precomp[-1].append(to_ge_precomp(P)) bi_precomp = [] for i in range(8): P = point_mul(2*i + 1, (g_x, g_y)) bi_precomp.append(to_ge_precomp(P)) buf = StringIO.StringIO() buf.write("""// The MIT License (MIT) // // Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // This file is generated from // ./make_curve25519_tables.py > curve25519_tables.h static const fe d = """) buf.write(to_literal(d)) buf.write("""; static const fe sqrtm1 = """) buf.write(to_literal(modp_sqrt_m1)) buf.write("""; static const fe d2 = """) buf.write(to_literal(d2)) buf.write("""; #if defined(OPENSSL_SMALL) // This block of code replaces the standard base-point table with a much smaller // one. The standard table is 30,720 bytes while this one is just 960. // // This table contains 15 pairs of group elements, (x, y), where each field // element is serialised with |fe_tobytes|. If |i| is the index of the group // element then consider i+1 as a four-bit number: (i₀, i₁, i₂, i₃) (where i₀ // is the most significant bit). The value of the group element is then: // (i₀×2^192 + i₁×2^128 + i₂×2^64 + i₃)G, where G is the generator. static const uint8_t k25519SmallPrecomp[15 * 2 * 32] = {""") for i, b in enumerate(small_precomp): buf.write("0x%02x, " % b) buf.write(""" }; #else // k25519Precomp[i][j] = (j+1)*256^i*B static const ge_precomp k25519Precomp[32][8] = { """) for child in large_precomp: buf.write("{\n") for val in child: buf.write("{\n") for term in val: buf.write(to_literal(term) + ",\n") buf.write("},\n") buf.write("},\n") buf.write("""}; #endif // OPENSSL_SMALL // Bi[i] = (2*i+1)*B static const ge_precomp Bi[8] = { """) for val in bi_precomp: buf.write("{\n") for term in val: buf.write(to_literal(term) + ",\n") buf.write("},\n") buf.write("""}; """) proc = subprocess.Popen(["clang-format"], stdin=subprocess.PIPE) proc.communicate(buf.getvalue()) if __name__ == "__main__": main()